ZGlmZiAtLWdpdCBhL0FuZHJvaWQubWsgYi9BbmRyb2lkLm1rCmluZGV4IDg0Mzc2Y2UuLjkwMWYyMTIgMTAwNjQ0Ci0tLSBhL0FuZHJvaWQubWsKKysrIGIvQW5kcm9pZC5tawpAQCAtMTAwLDkgKzEwMCwxMSBAQAogCWNvcmUvamF2YS9hbmRyb2lkL2JsdWV0b290aC9JQmx1ZXRvb3RoQ2FsbGJhY2suYWlkbCBcCiAJY29yZS9qYXZhL2FuZHJvaWQvYmx1ZXRvb3RoL0lCbHVldG9vdGhIZWFkc2V0LmFpZGwgXAogCWNvcmUvamF2YS9hbmRyb2lkL2JsdWV0b290aC9JQmx1ZXRvb3RoUGJhcC5haWRsIFwKKwljb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L0lDbGlwYm9hcmQuYWlkbCBcCiAJY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9JQ29udGVudFNlcnZpY2UuYWlkbCBcCiAJY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9JSW50ZW50UmVjZWl2ZXIuYWlkbCBcCiAJY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9JSW50ZW50U2VuZGVyLmFpZGwgXAorCWNvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvSU9uUHJpbWFyeUNsaXBDaGFuZ2VkTGlzdGVuZXIuYWlkbCBcCiAJY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9JU3luY0FkYXB0ZXIuYWlkbCBcCiAJY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9JU3luY0NvbnRleHQuYWlkbCBcCiAJY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9JU3luY1N0YXR1c09ic2VydmVyLmFpZGwgXApAQCAtMTI5LDcgKzEzMSw2IEBACiAgICAgY29yZS9qYXZhL2FuZHJvaWQvc2VydmljZS93YWxscGFwZXIvSVdhbGxwYXBlckNvbm5lY3Rpb24uYWlkbCBcCiAgICAgY29yZS9qYXZhL2FuZHJvaWQvc2VydmljZS93YWxscGFwZXIvSVdhbGxwYXBlckVuZ2luZS5haWRsIFwKICAgICBjb3JlL2phdmEvYW5kcm9pZC9zZXJ2aWNlL3dhbGxwYXBlci9JV2FsbHBhcGVyU2VydmljZS5haWRsIFwKLQljb3JlL2phdmEvYW5kcm9pZC90ZXh0L0lDbGlwYm9hcmQuYWlkbCBcCiAJY29yZS9qYXZhL2FuZHJvaWQvdmlldy9hY2Nlc3NpYmlsaXR5L0lBY2Nlc3NpYmlsaXR5TWFuYWdlci5haWRsIFwKIAljb3JlL2phdmEvYW5kcm9pZC92aWV3L2FjY2Vzc2liaWxpdHkvSUFjY2Vzc2liaWxpdHlNYW5hZ2VyQ2xpZW50LmFpZGwgXAogCWNvcmUvamF2YS9hbmRyb2lkL3ZpZXcvSUFwcGxpY2F0aW9uVG9rZW4uYWlkbCBcCkBAIC0xNTksNiArMTYwLDkgQEAKIAljb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdmlldy9JSW5wdXRNZXRob2RDbGllbnQuYWlkbCBcCiAJY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3ZpZXcvSUlucHV0TWV0aG9kTWFuYWdlci5haWRsIFwKIAljb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdmlldy9JSW5wdXRNZXRob2RTZXNzaW9uLmFpZGwgXAorCWNvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC93aWRnZXQvSVJlbW90ZVZpZXdzRmFjdG9yeS5haWRsIFwKKwlsb2NhdGlvbi9qYXZhL2FuZHJvaWQvbG9jYXRpb24vSUNvdW50cnlEZXRlY3Rvci5haWRsIFwKKwlsb2NhdGlvbi9qYXZhL2FuZHJvaWQvbG9jYXRpb24vSUNvdW50cnlMaXN0ZW5lci5haWRsIFwKIAlsb2NhdGlvbi9qYXZhL2FuZHJvaWQvbG9jYXRpb24vSUdlb2NvZGVQcm92aWRlci5haWRsIFwKIAlsb2NhdGlvbi9qYXZhL2FuZHJvaWQvbG9jYXRpb24vSUdwc1N0YXR1c0xpc3RlbmVyLmFpZGwgXAogCWxvY2F0aW9uL2phdmEvYW5kcm9pZC9sb2NhdGlvbi9JR3BzU3RhdHVzUHJvdmlkZXIuYWlkbCBcCkBAIC0zNDgsNyArMzUyLDcgQEAKIAkJCWZyYW1ld29yayBcCiAKIGZyYW1ld29ya19kb2NzX0xPQ0FMX01PRFVMRV9DTEFTUyA6PSBKQVZBX0xJQlJBUklFUwotZnJhbWV3b3JrX2RvY3NfTE9DQUxfRFJPSURET0NfSFRNTF9ESVIgOj0gJChMT0NBTF9QQVRIKS9kb2NzL2h0bWwgJChPVVRfRE9DUykvZ2VuCitmcmFtZXdvcmtfZG9jc19MT0NBTF9EUk9JRERPQ19IVE1MX0RJUiA6PSBkb2NzL2h0bWwKICMgVGhlIHNpbmNlIGZsYWcgKC1zaW5jZSBOLnhtbCBBUElfTEVWRUwpIGlzIHVzZWQgdG8gYWRkIEFQSSBMZXZlbCBpbmZvcm1hdGlvbgogIyB0byB0aGUgcmVmZXJlbmNlIGRvY3VtZW50YXRpb24uIE11c3QgYmUgaW4gb3JkZXIgb2Ygb2xkZXN0IHRvIG5ld2VzdC4KIGZyYW1ld29ya19kb2NzX0xPQ0FMX0RST0lERE9DX09QVElPTlMgOj0gXApAQCAtMzYwLDcgKzM2NCw5IEBACiAgICAgLXNpbmNlIC4vZnJhbWV3b3Jrcy9iYXNlL2FwaS82LnhtbCA2IFwKICAgICAtc2luY2UgLi9mcmFtZXdvcmtzL2Jhc2UvYXBpLzcueG1sIDcgXAogICAgIC1zaW5jZSAuL2ZyYW1ld29ya3MvYmFzZS9hcGkvOC54bWwgOCBcCi0JCS1lcnJvciAxIC1lcnJvciAyIC13YXJuaW5nIDMgLWVycm9yIDQgLWVycm9yIDYgLWVycm9yIDggLWVycm9yIDE0IFwKKyAgICAtc2luY2UgLi9mcmFtZXdvcmtzL2Jhc2UvYXBpL2N1cnJlbnQueG1sIEhDIFwKKwkJLWVycm9yIDEwMSAtZXJyb3IgMTAyIC13YXJuaW5nIDEwMyAtZXJyb3IgMTA0IC1lcnJvciAxMDYgLWVycm9yIDEwOCAtd2FybmluZyAxMTMgXAorCQktZXJyb3IgMTE0IFwKIAkJLW92ZXJ2aWV3ICQoTE9DQUxfUEFUSCkvY29yZS9qYXZhL292ZXJ2aWV3Lmh0bWwKIAogZnJhbWV3b3JrX2RvY3NfTE9DQUxfQURESVRJT05BTF9KQVZBX0RJUjo9JChjYWxsIGludGVybWVkaWF0ZXMtZGlyLWZvcixKQVZBX0xJQlJBUklFUyxmcmFtZXdvcmspCkBAIC00MTYsNyArNDIyLDkgQEAKIAkJLXNhbXBsZWNvZGUgJChzYW1wbGVfZGlyKS9XaWt0aW9uYXJ5U2ltcGxlIFwKIAkJICAgICAgICAgICAgcmVzb3VyY2VzL3NhbXBsZXMvV2lrdGlvbmFyeVNpbXBsZSAiV2lrdGlvbmFyeSAoU2ltcGxpZmllZCkiIFwKIAkJLXNhbXBsZWNvZGUgJChzYW1wbGVfZGlyKS9Wb2ljZVJlY29nbml0aW9uU2VydmljZSBcCi0JCSAgICAgICAgICAgIHJlc291cmNlcy9zYW1wbGVzL1ZvaWNlUmVjb2duaXRpb25TZXJ2aWNlICJWb2ljZSBSZWNvZ25pdGlvbiBTZXJ2aWNlIgorCQkgICAgICAgICAgICByZXNvdXJjZXMvc2FtcGxlcy9Wb2ljZVJlY29nbml0aW9uU2VydmljZSAiVm9pY2UgUmVjb2duaXRpb24gU2VydmljZSIgXAorCQktc2FtcGxlY29kZSAkKHNhbXBsZV9kaXIpL1htbEFkYXB0ZXJzIFwKKwkJICAgICAgICAgICAgcmVzb3VyY2VzL3NhbXBsZXMvWG1sQWRhcHRlcnMgIlhNTCBBZGFwdGVycyIKIAogIyMgU0RLIHZlcnNpb24gaWRlbnRpZmllcnMgdXNlZCBpbiB0aGUgcHVibGlzaGVkIGRvY3MKICAgIyBtYWpvclsubWlub3JdIHZlcnNpb24gZm9yIGN1cnJlbnQgU0RLLiAoZnVsbCByZWxlYXNlcyBvbmx5KQpAQCAtNDYzLDExICs0NzEsMTMgQEAKIAkJLW5vZG9jcwogCiBMT0NBTF9EUk9JRERPQ19DVVNUT01fVEVNUExBVEVfRElSOj1idWlsZC90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2RrCi1MT0NBTF9EUk9JRERPQ19DVVNUT01fQVNTRVRfRElSOj1hc3NldHMtc2RrCisKK0xPQ0FMX1VOSU5TVEFMTEFCTEVfTU9EVUxFIDo9IHRydWUKIAogaW5jbHVkZSAkKEJVSUxEX0RST0lERE9DKQogCi0kKGZ1bGxfdGFyZ2V0KTogJChmcmFtZXdvcmtfYnVpbHQpCisjICQoZ2VuKSwgaS5lLiBmcmFtZXdvcmsuYWlkbCwgaXMgYWxzbyBuZWVkZWQgd2hpbGUgYnVpbGRpbmcgYWdhaW5zdCB0aGUgY3VycmVudCBzdHViLgorJChmdWxsX3RhcmdldCk6ICQoZnJhbWV3b3JrX2J1aWx0KSAkKGdlbikKICQoSU5URVJOQUxfUExBVEZPUk1fQVBJX0ZJTEUpOiAkKGZ1bGxfdGFyZ2V0KQogJChjYWxsIGRpc3QtZm9yLWdvYWxzLHNkaywkKElOVEVSTkFMX1BMQVRGT1JNX0FQSV9GSUxFKSkKIApAQCAtNDg5LDcgKzQ5OSw4IEBACiAJCS1wYXJzZWNvbW1lbnRzCiAKIExPQ0FMX0RST0lERE9DX0NVU1RPTV9URU1QTEFURV9ESVI6PWJ1aWxkL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zZGsKLUxPQ0FMX0RST0lERE9DX0NVU1RPTV9BU1NFVF9ESVI6PWFzc2V0cy1zZGsKKworTE9DQUxfVU5JTlNUQUxMQUJMRV9NT0RVTEUgOj0gdHJ1ZQogCiBpbmNsdWRlICQoQlVJTERfRFJPSURET0MpCiAKQEAgLTUxOSwxNCArNTMwLDEzIEBACiAJCS1wcm9vZnJlYWQgJChPVVRfRE9DUykvJChMT0NBTF9NT0RVTEUpLXByb29mcmVhZC50eHQgXAogCQktdG9kbyAkKE9VVF9ET0NTKS8kKExPQ0FMX01PRFVMRSktZG9jcy10b2RvLmh0bWwgXAogCQktc2RrdmFsdWVzICQoT1VUX0RPQ1MpIFwKLQkJLWhkZiBhbmRyb2lkLndoaWNoZG9jIG9mZmxpbmUgCisJCS1oZGYgYW5kcm9pZC53aGljaGRvYyBvZmZsaW5lCiAKIGlmZXEgKCQoZnJhbWV3b3JrX2RvY3NfU0RLX1BSRVZJRVcpLHRydWUpCiAgIExPQ0FMX0RST0lERE9DX09QVElPTlMgKz0gLWhkZiBzZGsuY3VycmVudCBwcmV2aWV3IAogZW5kaWYKIAogTE9DQUxfRFJPSURET0NfQ1VTVE9NX1RFTVBMQVRFX0RJUjo9YnVpbGQvdG9vbHMvZHJvaWRkb2MvdGVtcGxhdGVzLXNkawotTE9DQUxfRFJPSURET0NfQ1VTVE9NX0FTU0VUX0RJUjo9YXNzZXRzLXNkawogCiBpbmNsdWRlICQoQlVJTERfRFJPSURET0MpCiAKQEAgLTUzOSw3ICs1NDksNiBAQAogJChmdWxsX3RhcmdldCk6ICQoc3RhdGljX2RvY19pbmRleF9yZWRpcmVjdCkKICQoZnVsbF90YXJnZXQpOiAkKGZyYW1ld29ya19idWlsdCkKIAotCiAjID09PT0gZG9jcyBmb3IgdGhlIHdlYiAob24gdGhlIGdvb2dsZSBhcHAgZW5naW5lIHNlcnZlcikgPT09PT09PT09PT09PT09PT09PT09PT0KIGluY2x1ZGUgJChDTEVBUl9WQVJTKQogCkBAIC01NjIsMTIgKzU3MSwxMSBAQAogCQktaGRmIHRlbXBsYXRlLnNob3dMYW5ndWFnZU1lbnUgdHJ1ZQogCiBMT0NBTF9EUk9JRERPQ19DVVNUT01fVEVNUExBVEVfRElSOj1idWlsZC90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2RrCi1MT0NBTF9EUk9JRERPQ19DVVNUT01fQVNTRVRfRElSOj1hc3NldHMtc2RrCiAKIGluY2x1ZGUgJChCVUlMRF9EUk9JRERPQykKIAogIyBleHBsaWNpdGx5IHNwZWNpZnkgdGhhdCBvbmxpbmUtc2RrIGRlcGVuZHMgb24gZnJhbWV3b3JrLXJlcyBhbmQgYW55IGdlbmVyYXRlZCBkb2NzCi0kKGZ1bGxfdGFyZ2V0KTogZnJhbWV3b3JrLXJlcy1wYWNrYWdlLXRhcmdldCAkKEFMTF9HRU5FUkFURURfRE9DUykKKyQoZnVsbF90YXJnZXQpOiBmcmFtZXdvcmstcmVzLXBhY2thZ2UtdGFyZ2V0CiAKICMgPT09PSBkb2NzIHRoYXQgaGF2ZSBhbGwgb2YgdGhlIHN0dWZmIHRoYXQncyBAaGlkZGVuID09PT09PT09PT09PT09PT09PT09PT09CiBpbmNsdWRlICQoQ0xFQVJfVkFSUykKQEAgLTU4MywxMSArNTkxLDEwIEBACiBMT0NBTF9NT0RVTEUgOj0gaGlkZGVuCiBMT0NBTF9EUk9JRERPQ19PUFRJT05TOj1cCiAJCSQoZnJhbWV3b3JrX2RvY3NfTE9DQUxfRFJPSURET0NfT1BUSU9OUykgXAotICAgICAgICAtdGl0bGUgIkFuZHJvaWQgU0RLIC0gSW5jbHVkaW5nIGhpZGRlbiBBUElzLiIKLSMgICAgICAgIC1oaWRkZW4KKwkJLXRpdGxlICJBbmRyb2lkIFNESyAtIEluY2x1ZGluZyBoaWRkZW4gQVBJcy4iCisjCQktaGlkZGVuCiAKIExPQ0FMX0RST0lERE9DX0NVU1RPTV9URU1QTEFURV9ESVI6PWJ1aWxkL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zZGsKLUxPQ0FMX0RST0lERE9DX0NVU1RPTV9BU1NFVF9ESVI6PWFzc2V0cy1zZGsKIAogaW5jbHVkZSAkKEJVSUxEX0RST0lERE9DKQogCkBAIC01OTcsMTAgKzYwNCwxNCBAQAogZXh0X2RpcnMgOj0gXAogCS4uLy4uL2V4dGVybmFsL25pc3Qtc2lwL2phdmEgXAogCS4uLy4uL2V4dGVybmFsL2FwYWNoZS1odHRwL3NyYyBcCi0JLi4vLi4vZXh0ZXJuYWwvdGFnc291cC9zcmMKKwkuLi8uLi9leHRlcm5hbC90YWdzb3VwL3NyYyBcCisJLi4vLi4vZXh0ZXJuYWwvbGlicGhvbmVudW1iZXIvamF2YS9zcmMKIAogZXh0X3NyY19maWxlcyA6PSAkKGNhbGwgYWxsLWphdmEtZmlsZXMtdW5kZXIsJChleHRfZGlycykpCiAKK2V4dF9yZXNfZGlycyA6PSBcCisJLi4vLi4vZXh0ZXJuYWwvbGlicGhvbmVudW1iZXIvamF2YS9zcmMKKwogIyA9PT09ICB0aGUgbGlicmFyeSAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIGluY2x1ZGUgJChDTEVBUl9WQVJTKQogCkBAIC02MDgsNyArNjE5LDcgQEAKIAogTE9DQUxfTk9fU1RBTkRBUkRfTElCUkFSSUVTIDo9IHRydWUKIExPQ0FMX0pBVkFfTElCUkFSSUVTIDo9IGNvcmUKLQorTE9DQUxfSkFWQV9SRVNPVVJDRV9ESVJTIDo9ICQoZXh0X3Jlc19kaXJzKQogTE9DQUxfTU9EVUxFIDo9IGV4dAogCiBMT0NBTF9OT19FTU1BX0lOU1RSVU1FTlQgOj0gdHJ1ZQpkaWZmIC0tZ2l0IGEvQ2xlYW5TcGVjLm1rIGIvQ2xlYW5TcGVjLm1rCmluZGV4IDU2MThlYWEuLmU1ZjFmOTAgMTAwNjQ0Ci0tLSBhL0NsZWFuU3BlYy5taworKysgYi9DbGVhblNwZWMubWsKQEAgLTY3LDcgKzY3LDIwIEBACiAkKGNhbGwgYWRkLWNsZWFuLXN0ZXAsIHJtIC1yZiAkKFBST0RVQ1RfT1VUKS9vYmovU0hBUkVEX0xJQlJBUklFUy9saWJyZXZlcmJfaW50ZXJtZWRpYXRlcykKICQoY2FsbCBhZGQtY2xlYW4tc3RlcCwgcm0gLXJmICQoUFJPRFVDVF9PVVQpL29iai9TSEFSRURfTElCUkFSSUVTL2xpYnJldmVyYnRlc3RfaW50ZXJtZWRpYXRlcykKICQoY2FsbCBhZGQtY2xlYW4tc3RlcCwgcm0gLXJmICQoUFJPRFVDVF9PVVQpL3N5c3RlbS9saWIvc291bmRmeC8pCiskKGNhbGwgYWRkLWNsZWFuLXN0ZXAsIGZpbmQgLiAtdHlwZSBmIC1uYW1lICIqLnJzIiAtcHJpbnQwIHwgeGFyZ3MgLTAgdG91Y2gpCiskKGNhbGwgYWRkLWNsZWFuLXN0ZXAsIHJtIC1yZiAkKFBST0RVQ1RfT1VUKS9vYmovU0hBUkVEX0xJQlJBUklFUy9saWJhbmRyb2lkX3J1bnRpbWVfaW50ZXJtZWRpYXRlcykKKyQoY2FsbCBhZGQtY2xlYW4tc3RlcCwgcm0gLXJmICQoUFJPRFVDVF9PVVQpL29iai9saWIvbGliYW5kcm9pZF9ydW50aW1lLnNvKQorJChjYWxsIGFkZC1jbGVhbi1zdGVwLCBybSAtcmYgJChQUk9EVUNUX09VVCkvc3ltYm9scy9zeXN0ZW0vbGliL2xpYmFuZHJvaWRfcnVudGltZS5zbykKKyQoY2FsbCBhZGQtY2xlYW4tc3RlcCwgcm0gLXJmICQoUFJPRFVDVF9PVVQpL3N5c3RlbS9saWIvbGliYW5kcm9pZF9ydW50aW1lLnNvKQorJChjYWxsIGFkZC1jbGVhbi1zdGVwLCBybSAtcmYgJChQUk9EVUNUX09VVCkvb2JqL1NIQVJFRF9MSUJSQVJJRVMvbGliaHd1aV9pbnRlcm1lZGlhdGVzKQorJChjYWxsIGFkZC1jbGVhbi1zdGVwLCBybSAtcmYgJChQUk9EVUNUX09VVCkvb2JqL2xpYi9saWJod3VpLnNvKQorJChjYWxsIGFkZC1jbGVhbi1zdGVwLCBybSAtcmYgJChQUk9EVUNUX09VVCkvc3ltYm9scy9zeXN0ZW0vbGliL2xpYmh3dWkuc28pCiskKGNhbGwgYWRkLWNsZWFuLXN0ZXAsIHJtIC1yZiAkKFBST0RVQ1RfT1VUKS9zeXN0ZW0vbGliL2xpYmh3dWkuc28pCiAkKGNhbGwgYWRkLWNsZWFuLXN0ZXAsIHJtIC1yZiAkKE9VVF9ESVIpL3RhcmdldC9jb21tb24vb2JqL0pBVkFfTElCUkFSSUVTL2ZyYW1ld29ya19pbnRlcm1lZGlhdGVzL3NyYy9jb3JlL2phdmEvYW5kcm9pZC9vcy9zdG9yYWdlLyopCiskKGNhbGwgYWRkLWNsZWFuLXN0ZXAsIHJtIC1yZiAkKE9VVF9ESVIpL3RhcmdldC9jb21tb24vb2JqL0pBVkFfTElCUkFSSUVTL2ZyYW1ld29ya19pbnRlcm1lZGlhdGVzL3NyYy9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L0lDbGlwYm9hcmQuUCkKKyQoY2FsbCBhZGQtY2xlYW4tc3RlcCwgcm0gLXJmICQoT1VUX0RJUikvdGFyZ2V0L2NvbW1vbi9vYmovSkFWQV9MSUJSQVJJRVMvZnJhbWV3b3JrX2ludGVybWVkaWF0ZXMvc3JjL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9JVGVsZXBob255UmVnaXN0cnkuUCkKKyQoY2FsbCBhZGQtY2xlYW4tc3RlcCwgcm0gLXJmICQoT1VUX0RJUikvdGFyZ2V0L2NvbW1vbi9vYmovSkFWQV9MSUJSQVJJRVMvYW5kcm9pZF9zdHVic19jdXJyZW50X2ludGVybWVkaWF0ZXMpCiskKGNhbGwgYWRkLWNsZWFuLXN0ZXAsIHJtIC1yZiBvdXQvdGFyZ2V0L2NvbW1vbi9kb2NzL2FwaS1zdHVicyopCiAKICMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAjIE5FV0VSIENMRUFOIFNURVBTIE1VU1QgQkUgQVQgVEhFIEVORCBPRiBUSEUgTElTVApkaWZmIC0tZ2l0IGEvYXBpLzkueG1sIGIvYXBpLzkueG1sCmluZGV4IDlmZjEyODcuLjNlNzY1M2MgMTAwNjQ0Ci0tLSBhL2FwaS85LnhtbAorKysgYi9hcGkvOS54bWwKQEAgLTE1ODQ1LDE3ICsxNTg0NSw2IEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9tZXRob2Q+Ci08bWV0aG9kIG5hbWU9ImdldEluc3RhbmNlQ291bnQiCi0gcmV0dXJuPSJsb25nIgotIGFic3RyYWN0PSJmYWxzZSIKLSBuYXRpdmU9ImZhbHNlIgotIHN5bmNocm9uaXplZD0iZmFsc2UiCi0gc3RhdGljPSJ0cnVlIgotIGZpbmFsPSJmYWxzZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKLSB2aXNpYmlsaXR5PSJwdWJsaWMiCi0+Ci08L21ldGhvZD4KIDxtZXRob2QgbmFtZT0iZ2V0SW50ZW50IgogIHJldHVybj0iYW5kcm9pZC5jb250ZW50LkludGVudCIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC01ODU3MSwxNiArNTg1NjAsNiBAQAogPHBhcmFtZXRlciBuYW1lPSJiaXRtYXAiIHR5cGU9ImFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwIj4KIDwvcGFyYW1ldGVyPgogPC9jb25zdHJ1Y3Rvcj4KLTxjb25zdHJ1Y3RvciBuYW1lPSJDYW52YXMiCi0gdHlwZT0iYW5kcm9pZC5ncmFwaGljcy5DYW52YXMiCi0gc3RhdGljPSJmYWxzZSIKLSBmaW5hbD0iZmFsc2UiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCi0gdmlzaWJpbGl0eT0icHVibGljIgotPgotPHBhcmFtZXRlciBuYW1lPSJnbCIgdHlwZT0iamF2YXgubWljcm9lZGl0aW9uLmtocm9ub3Mub3BlbmdsZXMuR0wiPgotPC9wYXJhbWV0ZXI+Ci08L2NvbnN0cnVjdG9yPgogPG1ldGhvZCBuYW1lPSJjbGlwUGF0aCIKICByZXR1cm49ImJvb2xlYW4iCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtNTk0OTcsMTcgKzU5NDc2LDYgQEAKIDxwYXJhbWV0ZXIgbmFtZT0icGFpbnQiIHR5cGU9ImFuZHJvaWQuZ3JhcGhpY3MuUGFpbnQiPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KLTxtZXRob2QgbmFtZT0iZnJlZUdsQ2FjaGVzIgotIHJldHVybj0idm9pZCIKLSBhYnN0cmFjdD0iZmFsc2UiCi0gbmF0aXZlPSJmYWxzZSIKLSBzeW5jaHJvbml6ZWQ9ImZhbHNlIgotIHN0YXRpYz0idHJ1ZSIKLSBmaW5hbD0iZmFsc2UiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCi0gdmlzaWJpbGl0eT0icHVibGljIgotPgotPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9ImdldENsaXBCb3VuZHMiCiAgcmV0dXJuPSJib29sZWFuIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTU5NTU0LDE3ICs1OTUyMiw2IEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9tZXRob2Q+Ci08bWV0aG9kIG5hbWU9ImdldEdMIgotIHJldHVybj0iamF2YXgubWljcm9lZGl0aW9uLmtocm9ub3Mub3BlbmdsZXMuR0wiCi0gYWJzdHJhY3Q9ImZhbHNlIgotIG5hdGl2ZT0iZmFsc2UiCi0gc3luY2hyb25pemVkPSJmYWxzZSIKLSBzdGF0aWM9ImZhbHNlIgotIGZpbmFsPSJmYWxzZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKLSB2aXNpYmlsaXR5PSJwdWJsaWMiCi0+Ci08L21ldGhvZD4KIDxtZXRob2QgbmFtZT0iZ2V0SGVpZ2h0IgogIHJldHVybj0iaW50IgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTU5OTI4LDIxICs1OTg4NSw2IEBACiA8cGFyYW1ldGVyIG5hbWU9Im1hdHJpeCIgdHlwZT0iYW5kcm9pZC5ncmFwaGljcy5NYXRyaXgiPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KLTxtZXRob2QgbmFtZT0ic2V0Vmlld3BvcnQiCi0gcmV0dXJuPSJ2b2lkIgotIGFic3RyYWN0PSJmYWxzZSIKLSBuYXRpdmU9ImZhbHNlIgotIHN5bmNocm9uaXplZD0iZmFsc2UiCi0gc3RhdGljPSJmYWxzZSIKLSBmaW5hbD0iZmFsc2UiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCi0gdmlzaWJpbGl0eT0icHVibGljIgotPgotPHBhcmFtZXRlciBuYW1lPSJ3aWR0aCIgdHlwZT0iaW50Ij4KLTwvcGFyYW1ldGVyPgotPHBhcmFtZXRlciBuYW1lPSJoZWlnaHQiIHR5cGU9ImludCI+Ci08L3BhcmFtZXRlcj4KLTwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJza2V3IgogIHJldHVybj0idm9pZCIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC03NDE0OCw3ICs3NDA5MCw3IEBACiAgdHlwZT0iZmxvYXQiCiAgdHJhbnNpZW50PSJmYWxzZSIKICB2b2xhdGlsZT0iZmFsc2UiCi0gdmFsdWU9IjAuMDAxMGYiCisgdmFsdWU9IjAuMDAxZiIKICBzdGF0aWM9InRydWUiCiAgZmluYWw9InRydWUiCiAgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCkBAIC0xNDc3NjAsMTcgKzE0NzcwMiw2IEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9jb25zdHJ1Y3Rvcj4KLTxtZXRob2QgbmFtZT0iYWJvcnRVcGRhdGVzIgotIHJldHVybj0idm9pZCIKLSBhYnN0cmFjdD0iZmFsc2UiCi0gbmF0aXZlPSJmYWxzZSIKLSBzeW5jaHJvbml6ZWQ9ImZhbHNlIgotIHN0YXRpYz0iZmFsc2UiCi0gZmluYWw9ImZhbHNlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgotIHZpc2liaWxpdHk9InB1YmxpYyIKLT4KLTwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJjbG9zZSIKICByZXR1cm49InZvaWQiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMTQ3NzgyLDMwICsxNDc3MTMsNiBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvbWV0aG9kPgotPG1ldGhvZCBuYW1lPSJjb21taXRVcGRhdGVzIgotIHJldHVybj0iYm9vbGVhbiIKLSBhYnN0cmFjdD0iZmFsc2UiCi0gbmF0aXZlPSJmYWxzZSIKLSBzeW5jaHJvbml6ZWQ9ImZhbHNlIgotIHN0YXRpYz0iZmFsc2UiCi0gZmluYWw9ImZhbHNlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgotIHZpc2liaWxpdHk9InB1YmxpYyIKLT4KLTwvbWV0aG9kPgotPG1ldGhvZCBuYW1lPSJjb21taXRVcGRhdGVzIgotIHJldHVybj0iYm9vbGVhbiIKLSBhYnN0cmFjdD0iZmFsc2UiCi0gbmF0aXZlPSJmYWxzZSIKLSBzeW5jaHJvbml6ZWQ9ImZhbHNlIgotIHN0YXRpYz0iZmFsc2UiCi0gZmluYWw9ImZhbHNlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgotIHZpc2liaWxpdHk9InB1YmxpYyIKLT4KLTxwYXJhbWV0ZXIgbmFtZT0idmFsdWVzIiB0eXBlPSJqYXZhLnV0aWwuTWFwJmx0Oz8gZXh0ZW5kcyBqYXZhLmxhbmcuTG9uZywgPyBleHRlbmRzIGphdmEudXRpbC5NYXAmbHQ7amF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLk9iamVjdCZndDsmZ3Q7Ij4KLTwvcGFyYW1ldGVyPgotPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9ImNvcHlTdHJpbmdUb0J1ZmZlciIKICByZXR1cm49InZvaWQiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMTQ3ODMyLDE3ICsxNDc3MzksNiBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvbWV0aG9kPgotPG1ldGhvZCBuYW1lPSJkZWxldGVSb3ciCi0gcmV0dXJuPSJib29sZWFuIgotIGFic3RyYWN0PSJmYWxzZSIKLSBuYXRpdmU9ImZhbHNlIgotIHN5bmNocm9uaXplZD0iZmFsc2UiCi0gc3RhdGljPSJmYWxzZSIKLSBmaW5hbD0iZmFsc2UiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCi0gdmlzaWJpbGl0eT0icHVibGljIgotPgotPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9ImdldEJsb2IiCiAgcmV0dXJuPSJieXRlW10iCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMTQ4MDM5LDE3ICsxNDc5MzUsNiBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvbWV0aG9kPgotPG1ldGhvZCBuYW1lPSJoYXNVcGRhdGVzIgotIHJldHVybj0iYm9vbGVhbiIKLSBhYnN0cmFjdD0iZmFsc2UiCi0gbmF0aXZlPSJmYWxzZSIKLSBzeW5jaHJvbml6ZWQ9ImZhbHNlIgotIHN0YXRpYz0iZmFsc2UiCi0gZmluYWw9ImZhbHNlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgotIHZpc2liaWxpdHk9InB1YmxpYyIKLT4KLTwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJpc0FmdGVyTGFzdCIKICByZXR1cm49ImJvb2xlYW4iCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMTQ4MjUzLDE3ICsxNDgxMzgsNiBAQAogPHBhcmFtZXRlciBuYW1lPSJ1cmkiIHR5cGU9ImFuZHJvaWQubmV0LlVyaSI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgotPG1ldGhvZCBuYW1lPSJzdXBwb3J0c1VwZGF0ZXMiCi0gcmV0dXJuPSJib29sZWFuIgotIGFic3RyYWN0PSJmYWxzZSIKLSBuYXRpdmU9ImZhbHNlIgotIHN5bmNocm9uaXplZD0iZmFsc2UiCi0gc3RhdGljPSJmYWxzZSIKLSBmaW5hbD0iZmFsc2UiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCi0gdmlzaWJpbGl0eT0icHVibGljIgotPgotPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9InVucmVnaXN0ZXJDb250ZW50T2JzZXJ2ZXIiCiAgcmV0dXJuPSJ2b2lkIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTE0ODI5MCwxMjQgKzE0ODE2NCw2IEBACiA8cGFyYW1ldGVyIG5hbWU9Im9ic2VydmVyIiB0eXBlPSJhbmRyb2lkLmRhdGFiYXNlLkRhdGFTZXRPYnNlcnZlciI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgotPG1ldGhvZCBuYW1lPSJ1cGRhdGVCbG9iIgotIHJldHVybj0iYm9vbGVhbiIKLSBhYnN0cmFjdD0iZmFsc2UiCi0gbmF0aXZlPSJmYWxzZSIKLSBzeW5jaHJvbml6ZWQ9ImZhbHNlIgotIHN0YXRpYz0iZmFsc2UiCi0gZmluYWw9ImZhbHNlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgotIHZpc2liaWxpdHk9InB1YmxpYyIKLT4KLTxwYXJhbWV0ZXIgbmFtZT0iY29sdW1uSW5kZXgiIHR5cGU9ImludCI+Ci08L3BhcmFtZXRlcj4KLTxwYXJhbWV0ZXIgbmFtZT0idmFsdWUiIHR5cGU9ImJ5dGVbXSI+Ci08L3BhcmFtZXRlcj4KLTwvbWV0aG9kPgotPG1ldGhvZCBuYW1lPSJ1cGRhdGVEb3VibGUiCi0gcmV0dXJuPSJib29sZWFuIgotIGFic3RyYWN0PSJmYWxzZSIKLSBuYXRpdmU9ImZhbHNlIgotIHN5bmNocm9uaXplZD0iZmFsc2UiCi0gc3RhdGljPSJmYWxzZSIKLSBmaW5hbD0iZmFsc2UiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCi0gdmlzaWJpbGl0eT0icHVibGljIgotPgotPHBhcmFtZXRlciBuYW1lPSJjb2x1bW5JbmRleCIgdHlwZT0iaW50Ij4KLTwvcGFyYW1ldGVyPgotPHBhcmFtZXRlciBuYW1lPSJ2YWx1ZSIgdHlwZT0iZG91YmxlIj4KLTwvcGFyYW1ldGVyPgotPC9tZXRob2Q+Ci08bWV0aG9kIG5hbWU9InVwZGF0ZUZsb2F0IgotIHJldHVybj0iYm9vbGVhbiIKLSBhYnN0cmFjdD0iZmFsc2UiCi0gbmF0aXZlPSJmYWxzZSIKLSBzeW5jaHJvbml6ZWQ9ImZhbHNlIgotIHN0YXRpYz0iZmFsc2UiCi0gZmluYWw9ImZhbHNlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgotIHZpc2liaWxpdHk9InB1YmxpYyIKLT4KLTxwYXJhbWV0ZXIgbmFtZT0iY29sdW1uSW5kZXgiIHR5cGU9ImludCI+Ci08L3BhcmFtZXRlcj4KLTxwYXJhbWV0ZXIgbmFtZT0idmFsdWUiIHR5cGU9ImZsb2F0Ij4KLTwvcGFyYW1ldGVyPgotPC9tZXRob2Q+Ci08bWV0aG9kIG5hbWU9InVwZGF0ZUludCIKLSByZXR1cm49ImJvb2xlYW4iCi0gYWJzdHJhY3Q9ImZhbHNlIgotIG5hdGl2ZT0iZmFsc2UiCi0gc3luY2hyb25pemVkPSJmYWxzZSIKLSBzdGF0aWM9ImZhbHNlIgotIGZpbmFsPSJmYWxzZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKLSB2aXNpYmlsaXR5PSJwdWJsaWMiCi0+Ci08cGFyYW1ldGVyIG5hbWU9ImNvbHVtbkluZGV4IiB0eXBlPSJpbnQiPgotPC9wYXJhbWV0ZXI+Ci08cGFyYW1ldGVyIG5hbWU9InZhbHVlIiB0eXBlPSJpbnQiPgotPC9wYXJhbWV0ZXI+Ci08L21ldGhvZD4KLTxtZXRob2QgbmFtZT0idXBkYXRlTG9uZyIKLSByZXR1cm49ImJvb2xlYW4iCi0gYWJzdHJhY3Q9ImZhbHNlIgotIG5hdGl2ZT0iZmFsc2UiCi0gc3luY2hyb25pemVkPSJmYWxzZSIKLSBzdGF0aWM9ImZhbHNlIgotIGZpbmFsPSJmYWxzZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKLSB2aXNpYmlsaXR5PSJwdWJsaWMiCi0+Ci08cGFyYW1ldGVyIG5hbWU9ImNvbHVtbkluZGV4IiB0eXBlPSJpbnQiPgotPC9wYXJhbWV0ZXI+Ci08cGFyYW1ldGVyIG5hbWU9InZhbHVlIiB0eXBlPSJsb25nIj4KLTwvcGFyYW1ldGVyPgotPC9tZXRob2Q+Ci08bWV0aG9kIG5hbWU9InVwZGF0ZVNob3J0IgotIHJldHVybj0iYm9vbGVhbiIKLSBhYnN0cmFjdD0iZmFsc2UiCi0gbmF0aXZlPSJmYWxzZSIKLSBzeW5jaHJvbml6ZWQ9ImZhbHNlIgotIHN0YXRpYz0iZmFsc2UiCi0gZmluYWw9ImZhbHNlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgotIHZpc2liaWxpdHk9InB1YmxpYyIKLT4KLTxwYXJhbWV0ZXIgbmFtZT0iY29sdW1uSW5kZXgiIHR5cGU9ImludCI+Ci08L3BhcmFtZXRlcj4KLTxwYXJhbWV0ZXIgbmFtZT0idmFsdWUiIHR5cGU9InNob3J0Ij4KLTwvcGFyYW1ldGVyPgotPC9tZXRob2Q+Ci08bWV0aG9kIG5hbWU9InVwZGF0ZVN0cmluZyIKLSByZXR1cm49ImJvb2xlYW4iCi0gYWJzdHJhY3Q9ImZhbHNlIgotIG5hdGl2ZT0iZmFsc2UiCi0gc3luY2hyb25pemVkPSJmYWxzZSIKLSBzdGF0aWM9ImZhbHNlIgotIGZpbmFsPSJmYWxzZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKLSB2aXNpYmlsaXR5PSJwdWJsaWMiCi0+Ci08cGFyYW1ldGVyIG5hbWU9ImNvbHVtbkluZGV4IiB0eXBlPSJpbnQiPgotPC9wYXJhbWV0ZXI+Ci08cGFyYW1ldGVyIG5hbWU9InZhbHVlIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KLTwvcGFyYW1ldGVyPgotPC9tZXRob2Q+Ci08bWV0aG9kIG5hbWU9InVwZGF0ZVRvTnVsbCIKLSByZXR1cm49ImJvb2xlYW4iCi0gYWJzdHJhY3Q9ImZhbHNlIgotIG5hdGl2ZT0iZmFsc2UiCi0gc3luY2hyb25pemVkPSJmYWxzZSIKLSBzdGF0aWM9ImZhbHNlIgotIGZpbmFsPSJmYWxzZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKLSB2aXNpYmlsaXR5PSJwdWJsaWMiCi0+Ci08cGFyYW1ldGVyIG5hbWU9ImNvbHVtbkluZGV4IiB0eXBlPSJpbnQiPgotPC9wYXJhbWV0ZXI+Ci08L21ldGhvZD4KIDwvY2xhc3M+CiA8Y2xhc3MgbmFtZT0iTW9ja0RpYWxvZ0ludGVyZmFjZSIKICBleHRlbmRzPSJqYXZhLmxhbmcuT2JqZWN0IgpAQCAtMTY0Njc0LDcgKzE2NDQzMCw3IEBACiAgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKICB0cmFuc2llbnQ9ImZhbHNlIgogIHZvbGF0aWxlPSJmYWxzZSIKLSB2YWx1ZT0iJnF1b3Q7KChhZXJvfGFycGF8YXNpYXxhW2NkZWZnaWxtbm9xcnN0dXd4el0pfChiaXp8YlthYmRlZmdoaWptbm9yc3R2d3l6XSl8KGNhdHxjb218Y29vcHxjW2FjZGZnaGlrbG1ub3J1dnh5el0pfGRbZWprbW96XXwoZWR1fGVbY2VncnN0dV0pfGZbaWprbW9yXXwoZ292fGdbYWJkZWZnaGlsbW5wcXJzdHV3eV0pfGhba21ucnR1XXwoaW5mb3xpbnR8aVtkZWxtbm9xcnN0XSl8KGpvYnN8altlbW9wXSl8a1tlZ2hpbW5wcnd5el18bFthYmNpa3JzdHV2eV18KG1pbHxtb2JpfG11c2V1bXxtW2FjZGVnaGtsbW5vcHFyc3R1dnd4eXpdKXwobmFtZXxuZXR8blthY2VmZ2lsb3BydXpdKXwob3JnfG9tKXwocHJvfHBbYWVmZ2hrbG1ucnN0d3ldKXxxYXxyW2Vvc3V3XXxzW2FiY2RlZ2hpamtsbW5vcnR1dnl6XXwodGVsfHRyYXZlbHx0W2NkZmdoamtsbW5vcHJ0dnd6XSl8dVthZ2tzeXpdfHZbYWNlZ2ludV18d1tmc118KHhuXFwtXFwtMHp3bTU2ZHx4blxcLVxcLTExYjViczNhOWFqNmd8eG5cXC1cXC04MGFraGJ5a25qNGZ8eG5cXC1cXC05dDRiMTF5aTVhfHhuXFwtXFwtZGViYTBhZHx4blxcLVxcLWc2dzI1MWR8eG5cXC1cXC1oZ2JrNmFqN2Y1M2JiYXx4blxcLVxcLWhsY2o2YXlhOWVzYzdhfHhuXFwtXFwtanhhbHBkbHB8eG5cXC1cXC1rZ2JlY2h0dnx4blxcLVxcLXpja3phaCl8eVtldHVdfHpbYW13XSkmcXVvdDsiCisgdmFsdWU9IiZxdW90OygoYWVyb3xhcnBhfGFzaWF8YVtjZGVmZ2lsbW5vcXJzdHV3eHpdKXwoYml6fGJbYWJkZWZnaGlqbW5vcnN0dnd5el0pfChjYXR8Y29tfGNvb3B8Y1thY2RmZ2hpa2xtbm9ydXZ4eXpdKXxkW2Vqa21vel18KGVkdXxlW2NlZ3JzdHVdKXxmW2lqa21vcl18KGdvdnxnW2FiZGVmZ2hpbG1ucHFyc3R1d3ldKXxoW2ttbnJ0dV18KGluZm98aW50fGlbZGVsbW5vcXJzdF0pfChqb2JzfGpbZW1vcF0pfGtbZWdoaW1ucHJ3eXpdfGxbYWJjaWtyc3R1dnldfChtaWx8bW9iaXxtdXNldW18bVthY2RlZ2hrbG1ub3BxcnN0dXZ3eHl6XSl8KG5hbWV8bmV0fG5bYWNlZmdpbG9wcnV6XSl8KG9yZ3xvbSl8KHByb3xwW2FlZmdoa2xtbnJzdHd5XSl8cWF8cltlb3N1d118c1thYmNkZWdoaWprbG1ub3J0dXZ5el18KHRlbHx0cmF2ZWx8dFtjZGZnaGprbG1ub3BydHZ3el0pfHVbYWdrc3l6XXx2W2FjZWdpbnVdfHdbZnNdfCh4blxcLVxcLTB6d201NmR8eG5cXC1cXC0xMWI1YnMzYTlhajZnfHhuXFwtXFwtODBha2hieWtuajRmfHhuXFwtXFwtOXQ0YjExeWk1YXx4blxcLVxcLWRlYmEwYWR8eG5cXC1cXC1nNncyNTFkfHhuXFwtXFwtaGdiazZhajdmNTNiYmF8eG5cXC1cXC1obGNqNmF5YTllc2M3YXx4blxcLVxcLWp4YWxwZGxwfHhuXFwtXFwta2diZWNodHZ8eG5cXC1cXC1tZ2JhYW03YThofHhuXFwtXFwtbWdiZXJwNGE1ZDRhcnx4blxcLVxcLXdnYmgxY3x4blxcLVxcLXpja3phaCl8eVtldF18elthbXddKSZxdW90OyIKICBzdGF0aWM9InRydWUiCiAgZmluYWw9InRydWUiCiAgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCkBAIC0xNjQ2ODUsNyArMTY0NDQxLDcgQEAKICB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgogIHRyYW5zaWVudD0iZmFsc2UiCiAgdm9sYXRpbGU9ImZhbHNlIgotIHZhbHVlPSImcXVvdDsoPzooPzphZXJvfGFycGF8YXNpYXxhW2NkZWZnaWxtbm9xcnN0dXd4el0pfCg/OmJpenxiW2FiZGVmZ2hpam1ub3JzdHZ3eXpdKXwoPzpjYXR8Y29tfGNvb3B8Y1thY2RmZ2hpa2xtbm9ydXZ4eXpdKXxkW2Vqa21vel18KD86ZWR1fGVbY2VncnN0dV0pfGZbaWprbW9yXXwoPzpnb3Z8Z1thYmRlZmdoaWxtbnBxcnN0dXd5XSl8aFtrbW5ydHVdfCg/OmluZm98aW50fGlbZGVsbW5vcXJzdF0pfCg/OmpvYnN8altlbW9wXSl8a1tlZ2hpbW5wcnd5el18bFthYmNpa3JzdHV2eV18KD86bWlsfG1vYml8bXVzZXVtfG1bYWNkZWdoa2xtbm9wcXJzdHV2d3h5el0pfCg/Om5hbWV8bmV0fG5bYWNlZmdpbG9wcnV6XSl8KD86b3JnfG9tKXwoPzpwcm98cFthZWZnaGtsbW5yc3R3eV0pfHFhfHJbZW9zdXddfHNbYWJjZGVnaGlqa2xtbm9ydHV2eXpdfCg/OnRlbHx0cmF2ZWx8dFtjZGZnaGprbG1ub3BydHZ3el0pfHVbYWdrc3l6XXx2W2FjZWdpbnVdfHdbZnNdfCg/OnhuXFwtXFwtMHp3bTU2ZHx4blxcLVxcLTExYjViczNhOWFqNmd8eG5cXC1cXC04MGFraGJ5a25qNGZ8eG5cXC1cXC05dDRiMTF5aTVhfHhuXFwtXFwtZGViYTBhZHx4blxcLVxcLWc2dzI1MWR8eG5cXC1cXC1oZ2JrNmFqN2Y1M2JiYXx4blxcLVxcLWhsY2o2YXlhOWVzYzdhfHhuXFwtXFwtanhhbHBkbHB8eG5cXC1cXC1rZ2JlY2h0dnx4blxcLVxcLXpja3phaCl8eVtldHVdfHpbYW13XSkpJnF1b3Q7IgorIHZhbHVlPSImcXVvdDsoPzooPzphZXJvfGFycGF8YXNpYXxhW2NkZWZnaWxtbm9xcnN0dXd4el0pfCg/OmJpenxiW2FiZGVmZ2hpam1ub3JzdHZ3eXpdKXwoPzpjYXR8Y29tfGNvb3B8Y1thY2RmZ2hpa2xtbm9ydXZ4eXpdKXxkW2Vqa21vel18KD86ZWR1fGVbY2VncnN0dV0pfGZbaWprbW9yXXwoPzpnb3Z8Z1thYmRlZmdoaWxtbnBxcnN0dXd5XSl8aFtrbW5ydHVdfCg/OmluZm98aW50fGlbZGVsbW5vcXJzdF0pfCg/OmpvYnN8altlbW9wXSl8a1tlZ2hpbW5wcnd5el18bFthYmNpa3JzdHV2eV18KD86bWlsfG1vYml8bXVzZXVtfG1bYWNkZWdoa2xtbm9wcXJzdHV2d3h5el0pfCg/Om5hbWV8bmV0fG5bYWNlZmdpbG9wcnV6XSl8KD86b3JnfG9tKXwoPzpwcm98cFthZWZnaGtsbW5yc3R3eV0pfHFhfHJbZW9zdXddfHNbYWJjZGVnaGlqa2xtbm9ydHV2eXpdfCg/OnRlbHx0cmF2ZWx8dFtjZGZnaGprbG1ub3BydHZ3el0pfHVbYWdrc3l6XXx2W2FjZWdpbnVdfHdbZnNdfCg/OnhuXFwtXFwtMHp3bTU2ZHx4blxcLVxcLTExYjViczNhOWFqNmd8eG5cXC1cXC04MGFraGJ5a25qNGZ8eG5cXC1cXC05dDRiMTF5aTVhfHhuXFwtXFwtZGViYTBhZHx4blxcLVxcLWc2dzI1MWR8eG5cXC1cXC1oZ2JrNmFqN2Y1M2JiYXx4blxcLVxcLWhsY2o2YXlhOWVzYzdhfHhuXFwtXFwtanhhbHBkbHB8eG5cXC1cXC1rZ2JlY2h0dnx4blxcLVxcLW1nYmFhbTdhOGh8eG5cXC1cXC1tZ2JlcnA0YTVkNGFyfHhuXFwtXFwtd2diaDFjfHhuXFwtXFwtemNremFoKXx5W2V0XXx6W2Ftd10pKSZxdW90OyIKICBzdGF0aWM9InRydWUiCiAgZmluYWw9InRydWUiCiAgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCkBAIC0xOTU1OTYsNiArMTk1MzUyLDM5IEBACiA8cGFyYW1ldGVyIG5hbWU9ImRlZlN0eWxlIiB0eXBlPSJpbnQiPgogPC9wYXJhbWV0ZXI+CiA8L2NvbnN0cnVjdG9yPgorPGZpZWxkIG5hbWU9IkNIT0lDRV9NT0RFX01VTFRJUExFIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMiIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJDSE9JQ0VfTU9ERV9OT05FIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMCIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJDSE9JQ0VfTU9ERV9TSU5HTEUiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIxIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgogPG1ldGhvZCBuYW1lPSJhZnRlclRleHRDaGFuZ2VkIgogIHJldHVybj0idm9pZCIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0yMDQwNTIsMzkgKzIwMzg0MSw2IEBACiA8cGFyYW1ldGVyIG5hbWU9InkiIHR5cGU9ImludCI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgotPGZpZWxkIG5hbWU9IkNIT0lDRV9NT0RFX01VTFRJUExFIgotIHR5cGU9ImludCIKLSB0cmFuc2llbnQ9ImZhbHNlIgotIHZvbGF0aWxlPSJmYWxzZSIKLSB2YWx1ZT0iMiIKLSBzdGF0aWM9InRydWUiCi0gZmluYWw9InRydWUiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCi0gdmlzaWJpbGl0eT0icHVibGljIgotPgotPC9maWVsZD4KLTxmaWVsZCBuYW1lPSJDSE9JQ0VfTU9ERV9OT05FIgotIHR5cGU9ImludCIKLSB0cmFuc2llbnQ9ImZhbHNlIgotIHZvbGF0aWxlPSJmYWxzZSIKLSB2YWx1ZT0iMCIKLSBzdGF0aWM9InRydWUiCi0gZmluYWw9InRydWUiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCi0gdmlzaWJpbGl0eT0icHVibGljIgotPgotPC9maWVsZD4KLTxmaWVsZCBuYW1lPSJDSE9JQ0VfTU9ERV9TSU5HTEUiCi0gdHlwZT0iaW50IgotIHRyYW5zaWVudD0iZmFsc2UiCi0gdm9sYXRpbGU9ImZhbHNlIgotIHZhbHVlPSIxIgotIHN0YXRpYz0idHJ1ZSIKLSBmaW5hbD0idHJ1ZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKLSB2aXNpYmlsaXR5PSJwdWJsaWMiCi0+Ci08L2ZpZWxkPgogPC9jbGFzcz4KIDxjbGFzcyBuYW1lPSJMaXN0Vmlldy5GaXhlZFZpZXdJbmZvIgogIGV4dGVuZHM9ImphdmEubGFuZy5PYmplY3QiCmRpZmYgLS1naXQgYS9hcGkvY3VycmVudC54bWwgYi9hcGkvY3VycmVudC54bWwKaW5kZXggOGVlOGM1NS4uODU3ZmM1NSAxMDA2NDQKLS0tIGEvYXBpL2N1cnJlbnQueG1sCisrKyBiL2FwaS9jdXJyZW50LnhtbApAQCAtMTQ2MCw2ICsxNDYwLDI4IEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJhbmltYXRvcl9mYWRlX2luIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMTc0MzI2MDkiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iYW5pbWF0b3JfZmFkZV9vdXQiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIxNzQzMjYxMCIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KIDxmaWVsZCBuYW1lPSJhbnRpY2lwYXRlX2ludGVycG9sYXRvciIKICB0eXBlPSJpbnQiCiAgdHJhbnNpZW50PSJmYWxzZSIKQEAgLTIwNjYsNiArMjA4OCwxNzEgQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L2ZpZWxkPgorPGZpZWxkIG5hbWU9ImFjdGlvbkJhclNpemUiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIxNjg0MzU2MyIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJhY3Rpb25CYXJTdHlsZSIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjE2ODQzNTM1IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9ImFjdGlvbkJhclRhYkJhclN0eWxlIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMTY4NDM1NzIiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iYWN0aW9uQmFyVGFiU3R5bGUiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIxNjg0MzU3MSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJhY3Rpb25CYXJUYWJUZXh0U3R5bGUiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIxNjg0MzU3MyIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJhY3Rpb25CdXR0b25QYWRkaW5nIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMTY4NDM1NDciCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iYWN0aW9uQnV0dG9uU3R5bGUiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIxNjg0MzU0NSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJhY3Rpb25Ecm9wRG93blN0eWxlIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMTY4NDM1NDQiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iYWN0aW9uTGF5b3V0IgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMTY4NDM1ODAiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iYWN0aW9uTW9kZUJhY2tncm91bmQiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIxNjg0MzU0OSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJhY3Rpb25Nb2RlQ2xvc2VCdXR0b25TdHlsZSIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjE2ODQzNTc2IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9ImFjdGlvbk1vZGVDbG9zZURyYXdhYmxlIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMTY4NDM1NTAiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iYWN0aW9uT3ZlcmZsb3dCdXR0b25TdHlsZSIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjE2ODQzNTc0IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9ImFjdGlvblZpZXdDbGFzcyIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjE2ODQzNTgxIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9ImFjdGl2YXRlZEJhY2tncm91bmRJbmRpY2F0b3IiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIxNjg0MzU4MiIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KIDxmaWVsZCBuYW1lPSJhY3Rpdml0eUNsb3NlRW50ZXJBbmltYXRpb24iCiAgdHlwZT0iaW50IgogIHRyYW5zaWVudD0iZmFsc2UiCkBAIC0yMTEwLDYgKzIyOTcsMTcgQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L2ZpZWxkPgorPGZpZWxkIG5hbWU9ImFkYXB0ZXIiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIxNjg0MzUyMSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KIDxmaWVsZCBuYW1lPSJhZGRTdGF0ZXNGcm9tQ2hpbGRyZW4iCiAgdHlwZT0iaW50IgogIHRyYW5zaWVudD0iZmFsc2UiCkBAIC0yMTQzLDYgKzIzNDEsMTcgQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L2ZpZWxkPgorPGZpZWxkIG5hbWU9ImFsbENvbnRhY3RzTmFtZSIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjE2ODQzNTMzIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgogPGZpZWxkIG5hbWU9ImFsbG93QmFja3VwIgogIHR5cGU9ImludCIKICB0cmFuc2llbnQ9ImZhbHNlIgpAQCAtMjIzMSw2ICsyNDQwLDI4IEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJhbmltYXRlRmlyc3RWaWV3IgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMTY4NDM1NDIiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iYW5pbWF0ZUxheW91dENoYW5nZXMiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIxNjg0MzU3MCIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KIDxmaWVsZCBuYW1lPSJhbmltYXRlT25DbGljayIKICB0eXBlPSJpbnQiCiAgdHJhbnNpZW50PSJmYWxzZSIKQEAgLTIzMTksNiArMjU1MCwxNyBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iYXMiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIxNjg0MzUyNyIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KIDxmaWVsZCBuYW1lPSJhdXRob3IiCiAgdHlwZT0iaW50IgogIHRyYW5zaWVudD0iZmFsc2UiCkBAIC0yOTc5LDYgKzMyMjEsMTcgQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L2ZpZWxkPgorPGZpZWxkIG5hbWU9ImNvbHVtbiIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjE2ODQzNTMwIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgogPGZpZWxkIG5hbWU9ImNvbHVtbkRlbGF5IgogIHR5cGU9ImludCIKICB0cmFuc2llbnQ9ImZhbHNlIgpAQCAtMzEyMiw2ICszMzc1LDE3IEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJjdXN0b21OYXZpZ2F0aW9uTGF5b3V0IgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMTY4NDM1MzkiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+CiA8ZmllbGQgbmFtZT0iY3ljbGVzIgogIHR5cGU9ImludCIKICB0cmFuc2llbnQ9ImZhbHNlIgpAQCAtMzM4Niw2ICszNjUwLDE3IEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJkaXNwbGF5T3B0aW9ucyIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjE2ODQzNTM3IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgogPGZpZWxkIG5hbWU9ImRpdGhlciIKICB0eXBlPSJpbnQiCiAgdHJhbnNpZW50PSJmYWxzZSIKQEAgLTM1ODQsNiArMzg1OSwxNyBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iZHJvcERvd25TcGlubmVyU3R5bGUiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIxNjg0MzU0MyIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KIDxmaWVsZCBuYW1lPSJkcm9wRG93blZlcnRpY2FsT2Zmc2V0IgogIHR5cGU9ImludCIKICB0cmFuc2llbnQ9ImZhbHNlIgpAQCAtNDE0NSw2ICs0NDMxLDYxIEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJmcmFnbWVudCIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjE2ODQzNTU3IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9ImZyYWdtZW50Q2xvc2VFbnRlckFuaW1hdGlvbiIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjE2ODQzNTYxIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9ImZyYWdtZW50Q2xvc2VFeGl0QW5pbWF0aW9uIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMTY4NDM1NjIiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iZnJhZ21lbnRPcGVuRW50ZXJBbmltYXRpb24iCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIxNjg0MzU1OSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJmcmFnbWVudE9wZW5FeGl0QW5pbWF0aW9uIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMTY4NDM1NjAiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+CiA8ZmllbGQgbmFtZT0iZnJlZXplc1RleHQiCiAgdHlwZT0iaW50IgogIHRyYW5zaWVudD0iZmFsc2UiCkBAIC00MTU2LDYgKzQ0OTcsMTcgQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L2ZpZWxkPgorPGZpZWxkIG5hbWU9ImZyb20iCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIxNjg0MzUyNSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KIDxmaWVsZCBuYW1lPSJmcm9tQWxwaGEiCiAgdHlwZT0iaW50IgogIHRyYW5zaWVudD0iZmFsc2UiCkBAIC00MTc4LDYgKzQ1MzAsMTcgQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L2ZpZWxkPgorPGZpZWxkIG5hbWU9ImZyb21WYWx1ZSIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjE2ODQzNTI4IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgogPGZpZWxkIG5hbWU9ImZyb21YRGVsdGEiCiAgdHlwZT0iaW50IgogIHRyYW5zaWVudD0iZmFsc2UiCkBAIC00NDY0LDYgKzQ4MjcsMTcgQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L2ZpZWxkPgorPGZpZWxkIG5hbWU9ImhhcmR3YXJlQWNjZWxlcmF0ZWQiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIxNjg0MzU0MCIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KIDxmaWVsZCBuYW1lPSJoYXNDb2RlIgogIHR5cGU9ImludCIKICB0cmFuc2llbnQ9ImZhbHNlIgpAQCAtNDU4NSw2ICs0OTU5LDE3IEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJpY29uaWZpZWRCeURlZmF1bHQiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIxNjg0MzU3OSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KIDxmaWVsZCBuYW1lPSJpZCIKICB0eXBlPSJpbnQiCiAgdHJhbnNpZW50PSJmYWxzZSIKQEAgLTQ2OTUsNiArNTA4MCwzOSBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iaW1lU3VidHlwZUV4dHJhVmFsdWUiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIxNjg0MzU2NiIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJpbWVTdWJ0eXBlTG9jYWxlIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMTY4NDM1NjQiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iaW1lU3VidHlwZU1vZGUiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIxNjg0MzU2NSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KIDxmaWVsZCBuYW1lPSJpbW1lcnNpdmUiCiAgdHlwZT0iaW50IgogIHRyYW5zaWVudD0iZmFsc2UiCkBAIC01MDQ3LDYgKzU0NjUsMTcgQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L2ZpZWxkPgorPGZpZWxkIG5hbWU9Iml0ZW1QYWRkaW5nIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMTY4NDM1NzUiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+CiA8ZmllbGQgbmFtZT0iaXRlbVRleHRBcHBlYXJhbmNlIgogIHR5cGU9ImludCIKICB0cmFuc2llbnQ9ImZhbHNlIgpAQCAtNjM2Nyw2ICs2Nzk2LDE3IEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJsaXN0Q2hvaWNlQmFja2dyb3VuZEluZGljYXRvciIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjE2ODQzNTY4IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgogPGZpZWxkIG5hbWU9Imxpc3RDaG9pY2VJbmRpY2F0b3JNdWx0aXBsZSIKICB0eXBlPSJpbnQiCiAgdHJhbnNpZW50PSJmYWxzZSIKQEAgLTY0MDAsNiArNjg0MCwxNyBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvZmllbGQ+Cis8ZmllbGQgbmFtZT0ibGlzdFBvcHVwV2luZG93U3R5bGUiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIxNjg0MzU4NCIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KIDxmaWVsZCBuYW1lPSJsaXN0UHJlZmVycmVkSXRlbUhlaWdodCIKICB0eXBlPSJpbnQiCiAgdHJhbnNpZW50PSJmYWxzZSIKQEAgLTY2MzEsNiArNzA4MiwxNyBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvZmllbGQ+Cis8ZmllbGQgbmFtZT0ibWVhc3VyZVdpdGhMYXJnZXN0Q2hpbGQiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIxNjg0MzU0MSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KIDxmaWVsZCBuYW1lPSJtZW51Q2F0ZWdvcnkiCiAgdHlwZT0iaW50IgogIHRyYW5zaWVudD0iZmFsc2UiCkBAIC02NzYzLDYgKzcyMjUsMTcgQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L2ZpZWxkPgorPGZpZWxkIG5hbWU9Im5hdmlnYXRpb25Nb2RlIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMTY4NDM1MzYiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+CiA8ZmllbGQgbmFtZT0ibmVnYXRpdmVCdXR0b25UZXh0IgogIHR5cGU9ImludCIKICB0cmFuc2llbnQ9ImZhbHNlIgpAQCAtNjkyOCw2ICs3NDAxLDE3IEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJvcmRlcmluZyIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjE2ODQzNTU2IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgogPGZpZWxkIG5hbWU9Im9yZGVyaW5nRnJvbVhtbCIKICB0eXBlPSJpbnQiCiAgdHJhbnNpZW50PSJmYWxzZSIKQEAgLTY5NjEsMzkgKzc0NDUsNiBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvZmllbGQ+Ci08ZmllbGQgbmFtZT0ib3ZlcnNjcm9sbEZvb3RlciIKLSB0eXBlPSJpbnQiCi0gdHJhbnNpZW50PSJmYWxzZSIKLSB2b2xhdGlsZT0iZmFsc2UiCi0gdmFsdWU9IjE2ODQzNDU5IgotIHN0YXRpYz0idHJ1ZSIKLSBmaW5hbD0idHJ1ZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKLSB2aXNpYmlsaXR5PSJwdWJsaWMiCi0+Ci08L2ZpZWxkPgotPGZpZWxkIG5hbWU9Im92ZXJzY3JvbGxIZWFkZXIiCi0gdHlwZT0iaW50IgotIHRyYW5zaWVudD0iZmFsc2UiCi0gdm9sYXRpbGU9ImZhbHNlIgotIHZhbHVlPSIxNjg0MzQ1OCIKLSBzdGF0aWM9InRydWUiCi0gZmluYWw9InRydWUiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCi0gdmlzaWJpbGl0eT0icHVibGljIgotPgotPC9maWVsZD4KLTxmaWVsZCBuYW1lPSJvdmVyc2Nyb2xsTW9kZSIKLSB0eXBlPSJpbnQiCi0gdHJhbnNpZW50PSJmYWxzZSIKLSB2b2xhdGlsZT0iZmFsc2UiCi0gdmFsdWU9IjE2ODQzNDU3IgotIHN0YXRpYz0idHJ1ZSIKLSBmaW5hbD0idHJ1ZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKLSB2aXNpYmlsaXR5PSJwdWJsaWMiCi0+Ci08L2ZpZWxkPgogPGZpZWxkIG5hbWU9InBhZGRpbmciCiAgdHlwZT0iaW50IgogIHRyYW5zaWVudD0iZmFsc2UiCkBAIC03MjY5LDYgKzc3MjAsMTcgQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L2ZpZWxkPgorPGZpZWxkIG5hbWU9InBvcHVwTWVudVN0eWxlIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMTY4NDM1ODUiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+CiA8ZmllbGQgbmFtZT0icG9wdXBXaW5kb3dTdHlsZSIKICB0eXBlPSJpbnQiCiAgdHJhbnNpZW50PSJmYWxzZSIKQEAgLTczNTcsNiArNzgxOSwxNyBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvZmllbGQ+Cis8ZmllbGQgbmFtZT0icHJldmlld0ltYWdlIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMTY4NDM1NDgiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+CiA8ZmllbGQgbmFtZT0icHJpb3JpdHkiCiAgdHlwZT0iaW50IgogIHRyYW5zaWVudD0iZmFsc2UiCkBAIC03NTExLDYgKzc5ODQsMTcgQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L2ZpZWxkPgorPGZpZWxkIG5hbWU9InByb3BlcnR5TmFtZSIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjE2ODQzNTU1IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgogPGZpZWxkIG5hbWU9InByb3RlY3Rpb25MZXZlbCIKICB0eXBlPSJpbnQiCiAgdHJhbnNpZW50PSJmYWxzZSIKQEAgLTgyODEsNiArODc2NSwxNyBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvZmllbGQ+Cis8ZmllbGQgbmFtZT0ic2VsZWN0aW9uIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMTY4NDM1MjIiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+CiA8ZmllbGQgbmFtZT0ic2V0dGluZ3NBY3Rpdml0eSIKICB0eXBlPSJpbnQiCiAgdHJhbnNpZW50PSJmYWxzZSIKQEAgLTgzOTEsNiArODg4NiwxNyBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvZmllbGQ+Cis8ZmllbGQgbmFtZT0ic2hvd0FzQWN0aW9uIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMTY4NDM1NDYiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+CiA8ZmllbGQgbmFtZT0ic2hvd0RlZmF1bHQiCiAgdHlwZT0iaW50IgogIHRyYW5zaWVudD0iZmFsc2UiCkBAIC04NDY4LDYgKzg5NzQsMTcgQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L2ZpZWxkPgorPGZpZWxkIG5hbWU9InNvcnRPcmRlciIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjE2ODQzNTIzIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgogPGZpZWxkIG5hbWU9InNvdW5kRWZmZWN0c0VuYWJsZWQiCiAgdHlwZT0iaW50IgogIHRyYW5zaWVudD0iZmFsc2UiCkBAIC04NTEyLDYgKzkwMjksMTcgQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L2ZpZWxkPgorPGZpZWxkIG5hbWU9InNwaW5uZXJNb2RlIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMTY4NDM1NjkiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+CiA8ZmllbGQgbmFtZT0ic3Bpbm5lclN0eWxlIgogIHR5cGU9ImludCIKICB0cmFuc2llbnQ9ImZhbHNlIgpAQCAtODUyMyw2ICs5MDUxLDE3IEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJzcGxpdE1vdGlvbkV2ZW50cyIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjE2ODQzNTY3IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgogPGZpZWxkIG5hbWU9InNyYyIKICB0eXBlPSJpbnQiCiAgdHJhbnNpZW50PSJmYWxzZSIKQEAgLTg2MTEsNiArOTE1MCwxNyBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvZmllbGQ+Cis8ZmllbGQgbmFtZT0ic3RhdGVfYWN0aXZhdGVkIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMTY4NDM1ODMiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+CiA8ZmllbGQgbmFtZT0ic3RhdGVfYWN0aXZlIgogIHR5cGU9ImludCIKICB0cmFuc2llbnQ9ImZhbHNlIgpAQCAtODgyMCw2ICs5MzcwLDI4IEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJzdWJ0aXRsZSIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjE2ODQzNTM4IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9InN1YnRpdGxlVGV4dFN0eWxlIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMTY4NDM1NzgiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+CiA8ZmllbGQgbmFtZT0ic3VnZ2VzdEFjdGlvbk1zZyIKICB0eXBlPSJpbnQiCiAgdHJhbnNpZW50PSJmYWxzZSIKQEAgLTkxOTQsNiArOTc2NiwxNyBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvZmllbGQ+Cis8ZmllbGQgbmFtZT0idGV4dEFwcGVhcmFuY2VMYXJnZVBvcHVwTWVudSIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjE2ODQzNTg2IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgogPGZpZWxkIG5hbWU9InRleHRBcHBlYXJhbmNlTWVkaXVtIgogIHR5cGU9ImludCIKICB0cmFuc2llbnQ9ImZhbHNlIgpAQCAtOTI2MCw2ICs5ODQzLDE3IEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJ0ZXh0QXBwZWFyYW5jZVNtYWxsUG9wdXBNZW51IgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMTY4NDM1ODciCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+CiA8ZmllbGQgbmFtZT0idGV4dENoZWNrTWFyayIKICB0eXBlPSJpbnQiCiAgdHJhbnNpZW50PSJmYWxzZSIKQEAgLTk2NTYsNiArMTAyNTAsMjggQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L2ZpZWxkPgorPGZpZWxkIG5hbWU9InRpdGxlVGV4dFN0eWxlIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMTY4NDM1NzciCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0idG8iCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIxNjg0MzUyNiIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KIDxmaWVsZCBuYW1lPSJ0b0FscGhhIgogIHR5cGU9ImludCIKICB0cmFuc2llbnQ9ImZhbHNlIgpAQCAtOTY3OCw2ICsxMDI5NCwxNyBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvZmllbGQ+Cis8ZmllbGQgbmFtZT0idG9WYWx1ZSIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjE2ODQzNTI5IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgogPGZpZWxkIG5hbWU9InRvWERlbHRhIgogIHR5cGU9ImludCIKICB0cmFuc2llbnQ9ImZhbHNlIgpAQCAtOTg1NCw2ICsxMDQ4MSwxNyBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvZmllbGQ+Cis8ZmllbGQgbmFtZT0idXJpIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMTY4NDM1MjQiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+CiA8ZmllbGQgbmFtZT0idXNlTGV2ZWwiCiAgdHlwZT0iaW50IgogIHRyYW5zaWVudD0iZmFsc2UiCkBAIC05ODg3LDYgKzEwNTI1LDM5IEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJ2YWx1ZUZyb20iCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIxNjg0MzU1MiIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJ2YWx1ZVRvIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMTY4NDM1NTMiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0idmFsdWVUeXBlIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMTY4NDM1NTQiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+CiA8ZmllbGQgbmFtZT0idmFyaWFibGVQYWRkaW5nIgogIHR5cGU9ImludCIKICB0cmFuc2llbnQ9ImZhbHNlIgpAQCAtMTAxOTUsNiArMTA4NjYsMzkgQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IndpbmRvd0FjdGlvbkJhciIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjE2ODQzNTM0IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IndpbmRvd0FjdGlvbkJhck92ZXJsYXkiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIxNjg0MzU1OCIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJ3aW5kb3dBY3Rpb25Nb2RlT3ZlcmxheSIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjE2ODQzNTUxIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgogPGZpZWxkIG5hbWU9IndpbmRvd0FuaW1hdGlvblN0eWxlIgogIHR5cGU9ImludCIKICB0cmFuc2llbnQ9ImZhbHNlIgpAQCAtMTA0MDQsNiArMTExMDgsMjggQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IndpdGhDbGFzcyIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjE2ODQzNTMyIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IndpdGhFeHByZXNzaW9uIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMTY4NDM1MzEiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+CiA8ZmllbGQgbmFtZT0id3JpdGVQZXJtaXNzaW9uIgogIHR5cGU9ImludCIKICB0cmFuc2llbnQ9ImZhbHNlIgpAQCAtMTQwNTMsNiArMTQ3NzksMTcgQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L2ZpZWxkPgorPGZpZWxkIG5hbWU9ImhvbWUiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIxNjkwODM1MyIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KIDxmaWVsZCBuYW1lPSJpY29uIgogIHR5cGU9ImludCIKICB0cmFuc2llbnQ9ImZhbHNlIgpAQCAtMTQ0MzgsNiArMTUxNzUsMTcgQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L2ZpZWxkPgorPGZpZWxkIG5hbWU9InNlbGVjdFRleHRNb2RlIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMTY5MDgzNTQiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+CiA8ZmllbGQgbmFtZT0ic2VsZWN0ZWRJY29uIgogIHR5cGU9ImludCIKICB0cmFuc2llbnQ9ImZhbHNlIgpAQCAtMTQ5NzgsNiArMTU3MjYsMTcgQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L2ZpZWxkPgorPGZpZWxkIG5hbWU9Imxpc3RfY29udGVudCIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjE3MzY3MDczIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgogPGZpZWxkIG5hbWU9InByZWZlcmVuY2VfY2F0ZWdvcnkiCiAgdHlwZT0iaW50IgogIHRyYW5zaWVudD0iZmFsc2UiCkBAIC0xNTEyMSw2ICsxNTg4MCwxNyBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvZmllbGQ+Cis8ZmllbGQgbmFtZT0ic2ltcGxlX3NlbGVjdGFibGVfbGlzdF9pdGVtIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMTczNjcwNzQiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+CiA8ZmllbGQgbmFtZT0ic2ltcGxlX3NwaW5uZXJfZHJvcGRvd25faXRlbSIKICB0eXBlPSJpbnQiCiAgdHJhbnNpZW50PSJmYWxzZSIKQEAgLTE1MTY2LDYgKzE1OTM2LDIzIEBACiA+CiA8L2ZpZWxkPgogPC9jbGFzcz4KKzxjbGFzcyBuYW1lPSJSLm1lbnUiCisgZXh0ZW5kcz0iamF2YS5sYW5nLk9iamVjdCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxjb25zdHJ1Y3RvciBuYW1lPSJSLm1lbnUiCisgdHlwZT0iYW5kcm9pZC5SLm1lbnUiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9jb25zdHJ1Y3Rvcj4KKzwvY2xhc3M+CiA8Y2xhc3MgbmFtZT0iUi5wbHVyYWxzIgogIGV4dGVuZHM9ImphdmEubGFuZy5PYmplY3QiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMTU1NDYsNiArMTYzMzMsMTcgQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L2ZpZWxkPgorPGZpZWxkIG5hbWU9InNlbGVjdFRleHRNb2RlIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMTcwMzkzOTMiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+CiA8ZmllbGQgbmFtZT0idW5rbm93bk5hbWUiCiAgdHlwZT0iaW50IgogIHRyYW5zaWVudD0iZmFsc2UiCkBAIC0xNTk3MCw2ICsxNjc2OCwyOCBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iVGV4dEFwcGVhcmFuY2VfV2lkZ2V0X1BvcHVwTWVudV9MYXJnZSIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjE2OTczOTg0IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IlRleHRBcHBlYXJhbmNlX1dpZGdldF9Qb3B1cE1lbnVfU21hbGwiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIxNjk3Mzk4NSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KIDxmaWVsZCBuYW1lPSJUZXh0QXBwZWFyYW5jZV9XaWRnZXRfVGFiV2lkZ2V0IgogIHR5cGU9ImludCIKICB0cmFuc2llbnQ9ImZhbHNlIgpAQCAtMTYwODAsNiArMTY5MDAsNTAgQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IlRoZW1lX0RpYWxvZ19Ob0ZyYW1lIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMTY5NzM5NzIiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iVGhlbWVfSG9sbyIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjE2OTczOTc0IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IlRoZW1lX0hvbG9fTm9BY3Rpb25CYXIiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIxNjk3Mzk3NiIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJUaGVtZV9Ib2xvX05vQWN0aW9uQmFyX0Z1bGxzY3JlZW4iCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIxNjk3Mzk3NyIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KIDxmaWVsZCBuYW1lPSJUaGVtZV9JbnB1dE1ldGhvZCIKICB0eXBlPSJpbnQiCiAgdHJhbnNpZW50PSJmYWxzZSIKQEAgLTE2MTAyLDYgKzE2OTY2LDM5IEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJUaGVtZV9MaWdodF9Ib2xvIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMTY5NzM5NzUiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iVGhlbWVfTGlnaHRfSG9sb19Ob0FjdGlvbkJhciIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjE2OTczOTc4IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IlRoZW1lX0xpZ2h0X0hvbG9fTm9BY3Rpb25CYXJfRnVsbHNjcmVlbiIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjE2OTczOTc5IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgogPGZpZWxkIG5hbWU9IlRoZW1lX0xpZ2h0X05vVGl0bGVCYXIiCiAgdHlwZT0iaW50IgogIHRyYW5zaWVudD0iZmFsc2UiCkBAIC0xNjE3OSw2ICsxNzA3NiwxNyBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iVGhlbWVfTm9UaXRsZUJhcl9PdmVybGF5QWN0aW9uTW9kZXMiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIxNjk3Mzk3MyIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KIDxmaWVsZCBuYW1lPSJUaGVtZV9QYW5lbCIKICB0eXBlPSJpbnQiCiAgdHJhbnNpZW50PSJmYWxzZSIKQEAgLTE2MjY3LDYgKzE3MTc1LDE3IEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJUaGVtZV9XaXRoQWN0aW9uQmFyIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMTY5NzM5NjkiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+CiA8ZmllbGQgbmFtZT0iV2lkZ2V0IgogIHR5cGU9ImludCIKICB0cmFuc2llbnQ9ImZhbHNlIgpAQCAtMTYyODksNiArMTcyMDgsMzkgQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IldpZGdldF9BY3Rpb25CdXR0b24iCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIxNjk3Mzk3MSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJXaWRnZXRfQWN0aW9uQnV0dG9uX0Nsb3NlTW9kZSIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjE2OTczOTgzIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IldpZGdldF9BY3Rpb25CdXR0b25fT3ZlcmZsb3ciCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIxNjk3Mzk4MiIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KIDxmaWVsZCBuYW1lPSJXaWRnZXRfQXV0b0NvbXBsZXRlVGV4dFZpZXciCiAgdHlwZT0iaW50IgogIHRyYW5zaWVudD0iZmFsc2UiCkBAIC0xNjQ4Nyw2ICsxNzQzOSwxNyBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iV2lkZ2V0X0xpc3RQb3B1cFdpbmRvdyIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjE2OTczOTgwIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgogPGZpZWxkIG5hbWU9IldpZGdldF9MaXN0VmlldyIKICB0eXBlPSJpbnQiCiAgdHJhbnNpZW50PSJmYWxzZSIKQEAgLTE2NTMxLDYgKzE3NDk0LDE3IEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJXaWRnZXRfUG9wdXBNZW51IgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMTY5NzM5ODEiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+CiA8ZmllbGQgbmFtZT0iV2lkZ2V0X1BvcHVwV2luZG93IgogIHR5cGU9ImludCIKICB0cmFuc2llbnQ9ImZhbHNlIgpAQCAtMTY2NjMsNiArMTc2MzcsMTcgQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IldpZGdldF9TcGlubmVyX0Ryb3BEb3duIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMTY5NzM5NzAiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+CiA8ZmllbGQgbmFtZT0iV2lkZ2V0X1RhYldpZGdldCIKICB0eXBlPSJpbnQiCiAgdHJhbnNpZW50PSJmYWxzZSIKQEAgLTE5MDQzLDggKzIwMDI4LDI1NTEgQEAKIDwvY29uc3RydWN0b3I+CiA8L2NsYXNzPgogPC9wYWNrYWdlPgorPHBhY2thZ2UgbmFtZT0iYW5kcm9pZC5hbmltYXRpb24iCis+Cis8Y2xhc3MgbmFtZT0iQW5pbWF0b3IiCisgZXh0ZW5kcz0iamF2YS5sYW5nLk9iamVjdCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8aW1wbGVtZW50cyBuYW1lPSJqYXZhLmxhbmcuQ2xvbmVhYmxlIj4KKzwvaW1wbGVtZW50cz4KKzxjb25zdHJ1Y3RvciBuYW1lPSJBbmltYXRvciIKKyB0eXBlPSJhbmRyb2lkLmFuaW1hdGlvbi5BbmltYXRvciIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2NvbnN0cnVjdG9yPgorPG1ldGhvZCBuYW1lPSJhZGRMaXN0ZW5lciIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9Imxpc3RlbmVyIiB0eXBlPSJhbmRyb2lkLmFuaW1hdGlvbi5BbmltYXRvci5BbmltYXRvckxpc3RlbmVyIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImNhbmNlbCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iY2xvbmUiCisgcmV0dXJuPSJhbmRyb2lkLmFuaW1hdGlvbi5BbmltYXRvciIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJlbmQiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldER1cmF0aW9uIgorIHJldHVybj0ibG9uZyIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldExpc3RlbmVycyIKKyByZXR1cm49ImphdmEudXRpbC5BcnJheUxpc3QmbHQ7YW5kcm9pZC5hbmltYXRpb24uQW5pbWF0b3IuQW5pbWF0b3JMaXN0ZW5lciZndDsiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0U3RhcnREZWxheSIKKyByZXR1cm49ImxvbmciCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJpc1J1bm5pbmciCisgcmV0dXJuPSJib29sZWFuIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0icmVtb3ZlQWxsTGlzdGVuZXJzIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJyZW1vdmVMaXN0ZW5lciIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9Imxpc3RlbmVyIiB0eXBlPSJhbmRyb2lkLmFuaW1hdGlvbi5BbmltYXRvci5BbmltYXRvckxpc3RlbmVyIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldER1cmF0aW9uIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJkdXJhdGlvbiIgdHlwZT0ibG9uZyI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRJbnRlcnBvbGF0b3IiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InZhbHVlIiB0eXBlPSJhbmRyb2lkLnZpZXcuYW5pbWF0aW9uLkludGVycG9sYXRvciI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRTdGFydERlbGF5IgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJzdGFydERlbGF5IiB0eXBlPSJsb25nIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldFRhcmdldCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InRhcmdldCIgdHlwZT0iamF2YS5sYW5nLk9iamVjdCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXR1cEVuZFZhbHVlcyIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0dXBTdGFydFZhbHVlcyIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic3RhcnQiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8L2NsYXNzPgorPGludGVyZmFjZSBuYW1lPSJBbmltYXRvci5BbmltYXRvckxpc3RlbmVyIgorIGFic3RyYWN0PSJ0cnVlIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPG1ldGhvZCBuYW1lPSJvbkFuaW1hdGlvbkNhbmNlbCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iYW5pbWF0aW9uIiB0eXBlPSJhbmRyb2lkLmFuaW1hdGlvbi5BbmltYXRvciI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJvbkFuaW1hdGlvbkVuZCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iYW5pbWF0aW9uIiB0eXBlPSJhbmRyb2lkLmFuaW1hdGlvbi5BbmltYXRvciI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJvbkFuaW1hdGlvblJlcGVhdCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iYW5pbWF0aW9uIiB0eXBlPSJhbmRyb2lkLmFuaW1hdGlvbi5BbmltYXRvciI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJvbkFuaW1hdGlvblN0YXJ0IgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJhbmltYXRpb24iIHR5cGU9ImFuZHJvaWQuYW5pbWF0aW9uLkFuaW1hdG9yIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8L2ludGVyZmFjZT4KKzxjbGFzcyBuYW1lPSJBbmltYXRvckluZmxhdGVyIgorIGV4dGVuZHM9ImphdmEubGFuZy5PYmplY3QiCisgYWJzdHJhY3Q9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxjb25zdHJ1Y3RvciBuYW1lPSJBbmltYXRvckluZmxhdGVyIgorIHR5cGU9ImFuZHJvaWQuYW5pbWF0aW9uLkFuaW1hdG9ySW5mbGF0ZXIiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9jb25zdHJ1Y3Rvcj4KKzxtZXRob2QgbmFtZT0ibG9hZEFuaW1hdG9yIgorIHJldHVybj0iYW5kcm9pZC5hbmltYXRpb24uQW5pbWF0b3IiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iY29udGV4dCIgdHlwZT0iYW5kcm9pZC5jb250ZW50LkNvbnRleHQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImlkIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8ZXhjZXB0aW9uIG5hbWU9IlJlc291cmNlcy5Ob3RGb3VuZEV4Y2VwdGlvbiIgdHlwZT0iYW5kcm9pZC5jb250ZW50LnJlcy5SZXNvdXJjZXMuTm90Rm91bmRFeGNlcHRpb24iPgorPC9leGNlcHRpb24+Cis8L21ldGhvZD4KKzwvY2xhc3M+Cis8Y2xhc3MgbmFtZT0iQW5pbWF0b3JMaXN0ZW5lckFkYXB0ZXIiCisgZXh0ZW5kcz0iamF2YS5sYW5nLk9iamVjdCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8aW1wbGVtZW50cyBuYW1lPSJhbmRyb2lkLmFuaW1hdGlvbi5BbmltYXRvci5BbmltYXRvckxpc3RlbmVyIj4KKzwvaW1wbGVtZW50cz4KKzxjb25zdHJ1Y3RvciBuYW1lPSJBbmltYXRvckxpc3RlbmVyQWRhcHRlciIKKyB0eXBlPSJhbmRyb2lkLmFuaW1hdGlvbi5BbmltYXRvckxpc3RlbmVyQWRhcHRlciIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2NvbnN0cnVjdG9yPgorPG1ldGhvZCBuYW1lPSJvbkFuaW1hdGlvbkNhbmNlbCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImFuaW1hdGlvbiIgdHlwZT0iYW5kcm9pZC5hbmltYXRpb24uQW5pbWF0b3IiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ib25BbmltYXRpb25FbmQiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJhbmltYXRpb24iIHR5cGU9ImFuZHJvaWQuYW5pbWF0aW9uLkFuaW1hdG9yIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9Im9uQW5pbWF0aW9uUmVwZWF0IgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iYW5pbWF0aW9uIiB0eXBlPSJhbmRyb2lkLmFuaW1hdGlvbi5BbmltYXRvciI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJvbkFuaW1hdGlvblN0YXJ0IgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iYW5pbWF0aW9uIiB0eXBlPSJhbmRyb2lkLmFuaW1hdGlvbi5BbmltYXRvciI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPC9jbGFzcz4KKzxjbGFzcyBuYW1lPSJBbmltYXRvclNldCIKKyBleHRlbmRzPSJhbmRyb2lkLmFuaW1hdGlvbi5BbmltYXRvciIKKyBhYnN0cmFjdD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8Y29uc3RydWN0b3IgbmFtZT0iQW5pbWF0b3JTZXQiCisgdHlwZT0iYW5kcm9pZC5hbmltYXRpb24uQW5pbWF0b3JTZXQiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9jb25zdHJ1Y3Rvcj4KKzxtZXRob2QgbmFtZT0iZ2V0Q2hpbGRBbmltYXRpb25zIgorIHJldHVybj0iamF2YS51dGlsLkFycmF5TGlzdCZsdDthbmRyb2lkLmFuaW1hdGlvbi5BbmltYXRvciZndDsiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0RHVyYXRpb24iCisgcmV0dXJuPSJsb25nIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldFN0YXJ0RGVsYXkiCisgcmV0dXJuPSJsb25nIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImlzUnVubmluZyIKKyByZXR1cm49ImJvb2xlYW4iCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0icGxheSIKKyByZXR1cm49ImFuZHJvaWQuYW5pbWF0aW9uLkFuaW1hdG9yU2V0LkJ1aWxkZXIiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImFuaW0iIHR5cGU9ImFuZHJvaWQuYW5pbWF0aW9uLkFuaW1hdG9yIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InBsYXlTZXF1ZW50aWFsbHkiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJpdGVtcyIgdHlwZT0iYW5kcm9pZC5hbmltYXRpb24uQW5pbWF0b3IuLi4iPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0icGxheVRvZ2V0aGVyIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iaXRlbXMiIHR5cGU9ImFuZHJvaWQuYW5pbWF0aW9uLkFuaW1hdG9yLi4uIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldER1cmF0aW9uIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iZHVyYXRpb24iIHR5cGU9ImxvbmciPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0SW50ZXJwb2xhdG9yIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iaW50ZXJwb2xhdG9yIiB0eXBlPSJhbmRyb2lkLnZpZXcuYW5pbWF0aW9uLkludGVycG9sYXRvciI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRTdGFydERlbGF5IgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0ic3RhcnREZWxheSIgdHlwZT0ibG9uZyI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPC9jbGFzcz4KKzxjbGFzcyBuYW1lPSJBbmltYXRvclNldC5CdWlsZGVyIgorIGV4dGVuZHM9ImphdmEubGFuZy5PYmplY3QiCisgYWJzdHJhY3Q9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxtZXRob2QgbmFtZT0iYWZ0ZXIiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJhbmltIiB0eXBlPSJhbmRyb2lkLmFuaW1hdGlvbi5BbmltYXRvciI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJhZnRlciIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImRlbGF5IiB0eXBlPSJsb25nIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImJlZm9yZSIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImFuaW0iIHR5cGU9ImFuZHJvaWQuYW5pbWF0aW9uLkFuaW1hdG9yIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9IndpdGgiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJhbmltIiB0eXBlPSJhbmRyb2lkLmFuaW1hdGlvbi5BbmltYXRvciI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPC9jbGFzcz4KKzxjbGFzcyBuYW1lPSJEb3VibGVFdmFsdWF0b3IiCisgZXh0ZW5kcz0iamF2YS5sYW5nLk9iamVjdCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPGltcGxlbWVudHMgbmFtZT0iYW5kcm9pZC5hbmltYXRpb24uVHlwZUV2YWx1YXRvciI+Cis8L2ltcGxlbWVudHM+Cis8Y29uc3RydWN0b3IgbmFtZT0iRG91YmxlRXZhbHVhdG9yIgorIHR5cGU9ImFuZHJvaWQuYW5pbWF0aW9uLkRvdWJsZUV2YWx1YXRvciIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2NvbnN0cnVjdG9yPgorPG1ldGhvZCBuYW1lPSJldmFsdWF0ZSIKKyByZXR1cm49ImphdmEubGFuZy5PYmplY3QiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImZyYWN0aW9uIiB0eXBlPSJmbG9hdCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ic3RhcnRWYWx1ZSIgdHlwZT0iamF2YS5sYW5nLk9iamVjdCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iZW5kVmFsdWUiIHR5cGU9ImphdmEubGFuZy5PYmplY3QiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzwvY2xhc3M+Cis8Y2xhc3MgbmFtZT0iRmxvYXRFdmFsdWF0b3IiCisgZXh0ZW5kcz0iamF2YS5sYW5nLk9iamVjdCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPGltcGxlbWVudHMgbmFtZT0iYW5kcm9pZC5hbmltYXRpb24uVHlwZUV2YWx1YXRvciI+Cis8L2ltcGxlbWVudHM+Cis8Y29uc3RydWN0b3IgbmFtZT0iRmxvYXRFdmFsdWF0b3IiCisgdHlwZT0iYW5kcm9pZC5hbmltYXRpb24uRmxvYXRFdmFsdWF0b3IiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9jb25zdHJ1Y3Rvcj4KKzxtZXRob2QgbmFtZT0iZXZhbHVhdGUiCisgcmV0dXJuPSJqYXZhLmxhbmcuT2JqZWN0IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJmcmFjdGlvbiIgdHlwZT0iZmxvYXQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InN0YXJ0VmFsdWUiIHR5cGU9ImphdmEubGFuZy5PYmplY3QiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImVuZFZhbHVlIiB0eXBlPSJqYXZhLmxhbmcuT2JqZWN0Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8L2NsYXNzPgorPGNsYXNzIG5hbWU9IkludEV2YWx1YXRvciIKKyBleHRlbmRzPSJqYXZhLmxhbmcuT2JqZWN0IgorIGFic3RyYWN0PSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8aW1wbGVtZW50cyBuYW1lPSJhbmRyb2lkLmFuaW1hdGlvbi5UeXBlRXZhbHVhdG9yIj4KKzwvaW1wbGVtZW50cz4KKzxjb25zdHJ1Y3RvciBuYW1lPSJJbnRFdmFsdWF0b3IiCisgdHlwZT0iYW5kcm9pZC5hbmltYXRpb24uSW50RXZhbHVhdG9yIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvY29uc3RydWN0b3I+Cis8bWV0aG9kIG5hbWU9ImV2YWx1YXRlIgorIHJldHVybj0iamF2YS5sYW5nLk9iamVjdCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iZnJhY3Rpb24iIHR5cGU9ImZsb2F0Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJzdGFydFZhbHVlIiB0eXBlPSJqYXZhLmxhbmcuT2JqZWN0Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJlbmRWYWx1ZSIgdHlwZT0iamF2YS5sYW5nLk9iamVjdCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPC9jbGFzcz4KKzxjbGFzcyBuYW1lPSJLZXlmcmFtZSIKKyBleHRlbmRzPSJqYXZhLmxhbmcuT2JqZWN0IgorIGFic3RyYWN0PSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8aW1wbGVtZW50cyBuYW1lPSJqYXZhLmxhbmcuQ2xvbmVhYmxlIj4KKzwvaW1wbGVtZW50cz4KKzxjb25zdHJ1Y3RvciBuYW1lPSJLZXlmcmFtZSIKKyB0eXBlPSJhbmRyb2lkLmFuaW1hdGlvbi5LZXlmcmFtZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImZyYWN0aW9uIiB0eXBlPSJmbG9hdCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0idmFsdWUiIHR5cGU9ImphdmEubGFuZy5PYmplY3QiPgorPC9wYXJhbWV0ZXI+Cis8L2NvbnN0cnVjdG9yPgorPGNvbnN0cnVjdG9yIG5hbWU9IktleWZyYW1lIgorIHR5cGU9ImFuZHJvaWQuYW5pbWF0aW9uLktleWZyYW1lIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iZnJhY3Rpb24iIHR5cGU9ImZsb2F0Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJ2YWx1ZSIgdHlwZT0iamF2YS5sYW5nLkZsb2F0Ij4KKzwvcGFyYW1ldGVyPgorPC9jb25zdHJ1Y3Rvcj4KKzxjb25zdHJ1Y3RvciBuYW1lPSJLZXlmcmFtZSIKKyB0eXBlPSJhbmRyb2lkLmFuaW1hdGlvbi5LZXlmcmFtZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImZyYWN0aW9uIiB0eXBlPSJmbG9hdCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0idmFsdWUiIHR5cGU9ImphdmEubGFuZy5JbnRlZ2VyIj4KKzwvcGFyYW1ldGVyPgorPC9jb25zdHJ1Y3Rvcj4KKzxjb25zdHJ1Y3RvciBuYW1lPSJLZXlmcmFtZSIKKyB0eXBlPSJhbmRyb2lkLmFuaW1hdGlvbi5LZXlmcmFtZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImZyYWN0aW9uIiB0eXBlPSJmbG9hdCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0idmFsdWUiIHR5cGU9ImphdmEubGFuZy5Eb3VibGUiPgorPC9wYXJhbWV0ZXI+Cis8L2NvbnN0cnVjdG9yPgorPGNvbnN0cnVjdG9yIG5hbWU9IktleWZyYW1lIgorIHR5cGU9ImFuZHJvaWQuYW5pbWF0aW9uLktleWZyYW1lIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iZnJhY3Rpb24iIHR5cGU9ImZsb2F0Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJ2YWx1ZSIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPC9jb25zdHJ1Y3Rvcj4KKzxjb25zdHJ1Y3RvciBuYW1lPSJLZXlmcmFtZSIKKyB0eXBlPSJhbmRyb2lkLmFuaW1hdGlvbi5LZXlmcmFtZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImZyYWN0aW9uIiB0eXBlPSJmbG9hdCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0idmFsdWUiIHR5cGU9ImZsb2F0Ij4KKzwvcGFyYW1ldGVyPgorPC9jb25zdHJ1Y3Rvcj4KKzxjb25zdHJ1Y3RvciBuYW1lPSJLZXlmcmFtZSIKKyB0eXBlPSJhbmRyb2lkLmFuaW1hdGlvbi5LZXlmcmFtZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImZyYWN0aW9uIiB0eXBlPSJmbG9hdCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0idmFsdWUiIHR5cGU9ImRvdWJsZSI+Cis8L3BhcmFtZXRlcj4KKzwvY29uc3RydWN0b3I+Cis8bWV0aG9kIG5hbWU9ImNsb25lIgorIHJldHVybj0iYW5kcm9pZC5hbmltYXRpb24uS2V5ZnJhbWUiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0RnJhY3Rpb24iCisgcmV0dXJuPSJmbG9hdCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRJbnRlcnBvbGF0b3IiCisgcmV0dXJuPSJhbmRyb2lkLnZpZXcuYW5pbWF0aW9uLkludGVycG9sYXRvciIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRUeXBlIgorIHJldHVybj0iamF2YS5sYW5nLkNsYXNzIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldFZhbHVlIgorIHJldHVybj0iamF2YS5sYW5nLk9iamVjdCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRGcmFjdGlvbiIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImZyYWN0aW9uIiB0eXBlPSJmbG9hdCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRJbnRlcnBvbGF0b3IiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJpbnRlcnBvbGF0b3IiIHR5cGU9ImFuZHJvaWQudmlldy5hbmltYXRpb24uSW50ZXJwb2xhdG9yIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldFZhbHVlIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0idmFsdWUiIHR5cGU9ImphdmEubGFuZy5PYmplY3QiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzwvY2xhc3M+Cis8Y2xhc3MgbmFtZT0iTGF5b3V0VHJhbnNpdGlvbiIKKyBleHRlbmRzPSJqYXZhLmxhbmcuT2JqZWN0IgorIGFic3RyYWN0PSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8Y29uc3RydWN0b3IgbmFtZT0iTGF5b3V0VHJhbnNpdGlvbiIKKyB0eXBlPSJhbmRyb2lkLmFuaW1hdGlvbi5MYXlvdXRUcmFuc2l0aW9uIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvY29uc3RydWN0b3I+Cis8bWV0aG9kIG5hbWU9ImFkZFRyYW5zaXRpb25MaXN0ZW5lciIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9Imxpc3RlbmVyIiB0eXBlPSJhbmRyb2lkLmFuaW1hdGlvbi5MYXlvdXRUcmFuc2l0aW9uLlRyYW5zaXRpb25MaXN0ZW5lciI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJjaGlsZEFkZCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InBhcmVudCIgdHlwZT0iYW5kcm9pZC52aWV3LlZpZXdHcm91cCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iY2hpbGQiIHR5cGU9ImFuZHJvaWQudmlldy5WaWV3Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImNoaWxkUmVtb3ZlIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0icGFyZW50IiB0eXBlPSJhbmRyb2lkLnZpZXcuVmlld0dyb3VwIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJjaGlsZCIgdHlwZT0iYW5kcm9pZC52aWV3LlZpZXciPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0QW5pbWF0b3IiCisgcmV0dXJuPSJhbmRyb2lkLmFuaW1hdGlvbi5BbmltYXRvciIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0idHJhbnNpdGlvblR5cGUiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXREdXJhdGlvbiIKKyByZXR1cm49ImxvbmciCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InRyYW5zaXRpb25UeXBlIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0SW50ZXJwb2xhdG9yIgorIHJldHVybj0iYW5kcm9pZC52aWV3LmFuaW1hdGlvbi5JbnRlcnBvbGF0b3IiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InRyYW5zaXRpb25UeXBlIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0U3RhZ2dlciIKKyByZXR1cm49ImxvbmciCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InRyYW5zaXRpb25UeXBlIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0U3RhcnREZWxheSIKKyByZXR1cm49ImxvbmciCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InRyYW5zaXRpb25UeXBlIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0VHJhbnNpdGlvbkxpc3RlbmVycyIKKyByZXR1cm49ImphdmEudXRpbC5MaXN0Jmx0O2FuZHJvaWQuYW5pbWF0aW9uLkxheW91dFRyYW5zaXRpb24uVHJhbnNpdGlvbkxpc3RlbmVyJmd0OyIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJyZW1vdmVUcmFuc2l0aW9uTGlzdGVuZXIiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJsaXN0ZW5lciIgdHlwZT0iYW5kcm9pZC5hbmltYXRpb24uTGF5b3V0VHJhbnNpdGlvbi5UcmFuc2l0aW9uTGlzdGVuZXIiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0QW5pbWF0b3IiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJ0cmFuc2l0aW9uVHlwZSIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJhbmltYXRvciIgdHlwZT0iYW5kcm9pZC5hbmltYXRpb24uQW5pbWF0b3IiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0RHVyYXRpb24iCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJkdXJhdGlvbiIgdHlwZT0ibG9uZyI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXREdXJhdGlvbiIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InRyYW5zaXRpb25UeXBlIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImR1cmF0aW9uIiB0eXBlPSJsb25nIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldEludGVycG9sYXRvciIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InRyYW5zaXRpb25UeXBlIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImludGVycG9sYXRvciIgdHlwZT0iYW5kcm9pZC52aWV3LmFuaW1hdGlvbi5JbnRlcnBvbGF0b3IiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0U3RhZ2dlciIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InRyYW5zaXRpb25UeXBlIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImR1cmF0aW9uIiB0eXBlPSJsb25nIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldFN0YXJ0RGVsYXkiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJ0cmFuc2l0aW9uVHlwZSIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJkZWxheSIgdHlwZT0ibG9uZyI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPGZpZWxkIG5hbWU9IkFQUEVBUklORyIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjIiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iQ0hBTkdFX0FQUEVBUklORyIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjAiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iQ0hBTkdFX0RJU0FQUEVBUklORyIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjEiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iRElTQVBQRUFSSU5HIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMyIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzwvY2xhc3M+Cis8aW50ZXJmYWNlIG5hbWU9IkxheW91dFRyYW5zaXRpb24uVHJhbnNpdGlvbkxpc3RlbmVyIgorIGFic3RyYWN0PSJ0cnVlIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPG1ldGhvZCBuYW1lPSJlbmRUcmFuc2l0aW9uIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJ0cmFuc2l0aW9uIiB0eXBlPSJhbmRyb2lkLmFuaW1hdGlvbi5MYXlvdXRUcmFuc2l0aW9uIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJjb250YWluZXIiIHR5cGU9ImFuZHJvaWQudmlldy5WaWV3R3JvdXAiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InZpZXciIHR5cGU9ImFuZHJvaWQudmlldy5WaWV3Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJ0cmFuc2l0aW9uVHlwZSIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InN0YXJ0VHJhbnNpdGlvbiIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0idHJhbnNpdGlvbiIgdHlwZT0iYW5kcm9pZC5hbmltYXRpb24uTGF5b3V0VHJhbnNpdGlvbiI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iY29udGFpbmVyIiB0eXBlPSJhbmRyb2lkLnZpZXcuVmlld0dyb3VwIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJ2aWV3IiB0eXBlPSJhbmRyb2lkLnZpZXcuVmlldyI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0idHJhbnNpdGlvblR5cGUiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPC9pbnRlcmZhY2U+Cis8Y2xhc3MgbmFtZT0iT2JqZWN0QW5pbWF0b3IiCisgZXh0ZW5kcz0iYW5kcm9pZC5hbmltYXRpb24uVmFsdWVBbmltYXRvciIKKyBhYnN0cmFjdD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8Y29uc3RydWN0b3IgbmFtZT0iT2JqZWN0QW5pbWF0b3IiCisgdHlwZT0iYW5kcm9pZC5hbmltYXRpb24uT2JqZWN0QW5pbWF0b3IiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9jb25zdHJ1Y3Rvcj4KKzxjb25zdHJ1Y3RvciBuYW1lPSJPYmplY3RBbmltYXRvciIKKyB0eXBlPSJhbmRyb2lkLmFuaW1hdGlvbi5PYmplY3RBbmltYXRvciIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImR1cmF0aW9uIiB0eXBlPSJsb25nIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJ0YXJnZXQiIHR5cGU9ImphdmEubGFuZy5PYmplY3QiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InByb3BlcnR5TmFtZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0idmFsdWVzIiB0eXBlPSJULi4uIj4KKzwvcGFyYW1ldGVyPgorPC9jb25zdHJ1Y3Rvcj4KKzxjb25zdHJ1Y3RvciBuYW1lPSJPYmplY3RBbmltYXRvciIKKyB0eXBlPSJhbmRyb2lkLmFuaW1hdGlvbi5PYmplY3RBbmltYXRvciIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImR1cmF0aW9uIiB0eXBlPSJsb25nIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJ0YXJnZXQiIHR5cGU9ImphdmEubGFuZy5PYmplY3QiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InZhbHVlcyIgdHlwZT0iYW5kcm9pZC5hbmltYXRpb24uUHJvcGVydHlWYWx1ZXNIb2xkZXIuLi4iPgorPC9wYXJhbWV0ZXI+Cis8L2NvbnN0cnVjdG9yPgorPG1ldGhvZCBuYW1lPSJnZXRQcm9wZXJ0eU5hbWUiCisgcmV0dXJuPSJqYXZhLmxhbmcuU3RyaW5nIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldFRhcmdldCIKKyByZXR1cm49ImphdmEubGFuZy5PYmplY3QiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0UHJvcGVydHlOYW1lIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0icHJvcGVydHlOYW1lIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8L2NsYXNzPgorPGNsYXNzIG5hbWU9IlByb3BlcnR5VmFsdWVzSG9sZGVyIgorIGV4dGVuZHM9ImphdmEubGFuZy5PYmplY3QiCisgYWJzdHJhY3Q9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxpbXBsZW1lbnRzIG5hbWU9ImphdmEubGFuZy5DbG9uZWFibGUiPgorPC9pbXBsZW1lbnRzPgorPGNvbnN0cnVjdG9yIG5hbWU9IlByb3BlcnR5VmFsdWVzSG9sZGVyIgorIHR5cGU9ImFuZHJvaWQuYW5pbWF0aW9uLlByb3BlcnR5VmFsdWVzSG9sZGVyIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0idmFsdWVzIiB0eXBlPSJULi4uIj4KKzwvcGFyYW1ldGVyPgorPC9jb25zdHJ1Y3Rvcj4KKzxjb25zdHJ1Y3RvciBuYW1lPSJQcm9wZXJ0eVZhbHVlc0hvbGRlciIKKyB0eXBlPSJhbmRyb2lkLmFuaW1hdGlvbi5Qcm9wZXJ0eVZhbHVlc0hvbGRlciIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InByb3BlcnR5TmFtZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0idmFsdWVzIiB0eXBlPSJULi4uIj4KKzwvcGFyYW1ldGVyPgorPC9jb25zdHJ1Y3Rvcj4KKzxtZXRob2QgbmFtZT0iY2xvbmUiCisgcmV0dXJuPSJhbmRyb2lkLmFuaW1hdGlvbi5Qcm9wZXJ0eVZhbHVlc0hvbGRlciIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRHZXR0ZXIiCisgcmV0dXJuPSJqYXZhLmxhbmcucmVmbGVjdC5NZXRob2QiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0UHJvcGVydHlOYW1lIgorIHJldHVybj0iamF2YS5sYW5nLlN0cmluZyIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRTZXR0ZXIiCisgcmV0dXJuPSJqYXZhLmxhbmcucmVmbGVjdC5NZXRob2QiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0RXZhbHVhdG9yIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iZXZhbHVhdG9yIiB0eXBlPSJhbmRyb2lkLmFuaW1hdGlvbi5UeXBlRXZhbHVhdG9yIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldEdldHRlciIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImdldHRlciIgdHlwZT0iamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldFByb3BlcnR5TmFtZSIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InByb3BlcnR5TmFtZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRTZXR0ZXIiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJzZXR0ZXIiIHR5cGU9ImphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRWYWx1ZXMiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJ2YWx1ZXMiIHR5cGU9IlQuLi4iPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzwvY2xhc3M+Cis8Y2xhc3MgbmFtZT0iUkdCRXZhbHVhdG9yIgorIGV4dGVuZHM9ImphdmEubGFuZy5PYmplY3QiCisgYWJzdHJhY3Q9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxpbXBsZW1lbnRzIG5hbWU9ImFuZHJvaWQuYW5pbWF0aW9uLlR5cGVFdmFsdWF0b3IiPgorPC9pbXBsZW1lbnRzPgorPGNvbnN0cnVjdG9yIG5hbWU9IlJHQkV2YWx1YXRvciIKKyB0eXBlPSJhbmRyb2lkLmFuaW1hdGlvbi5SR0JFdmFsdWF0b3IiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9jb25zdHJ1Y3Rvcj4KKzxtZXRob2QgbmFtZT0iZXZhbHVhdGUiCisgcmV0dXJuPSJqYXZhLmxhbmcuT2JqZWN0IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJmcmFjdGlvbiIgdHlwZT0iZmxvYXQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InN0YXJ0VmFsdWUiIHR5cGU9ImphdmEubGFuZy5PYmplY3QiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImVuZFZhbHVlIiB0eXBlPSJqYXZhLmxhbmcuT2JqZWN0Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8L2NsYXNzPgorPGludGVyZmFjZSBuYW1lPSJUeXBlRXZhbHVhdG9yIgorIGFic3RyYWN0PSJ0cnVlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxtZXRob2QgbmFtZT0iZXZhbHVhdGUiCisgcmV0dXJuPSJqYXZhLmxhbmcuT2JqZWN0IgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImZyYWN0aW9uIiB0eXBlPSJmbG9hdCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ic3RhcnRWYWx1ZSIgdHlwZT0iamF2YS5sYW5nLk9iamVjdCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iZW5kVmFsdWUiIHR5cGU9ImphdmEubGFuZy5PYmplY3QiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzwvaW50ZXJmYWNlPgorPGNsYXNzIG5hbWU9IlZhbHVlQW5pbWF0b3IiCisgZXh0ZW5kcz0iYW5kcm9pZC5hbmltYXRpb24uQW5pbWF0b3IiCisgYWJzdHJhY3Q9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxjb25zdHJ1Y3RvciBuYW1lPSJWYWx1ZUFuaW1hdG9yIgorIHR5cGU9ImFuZHJvaWQuYW5pbWF0aW9uLlZhbHVlQW5pbWF0b3IiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9jb25zdHJ1Y3Rvcj4KKzxjb25zdHJ1Y3RvciBuYW1lPSJWYWx1ZUFuaW1hdG9yIgorIHR5cGU9ImFuZHJvaWQuYW5pbWF0aW9uLlZhbHVlQW5pbWF0b3IiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJkdXJhdGlvbiIgdHlwZT0ibG9uZyI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0idmFsdWVzIiB0eXBlPSJULi4uIj4KKzwvcGFyYW1ldGVyPgorPC9jb25zdHJ1Y3Rvcj4KKzxtZXRob2QgbmFtZT0iYWRkVXBkYXRlTGlzdGVuZXIiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJsaXN0ZW5lciIgdHlwZT0iYW5kcm9pZC5hbmltYXRpb24uVmFsdWVBbmltYXRvci5BbmltYXRvclVwZGF0ZUxpc3RlbmVyIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldEFuaW1hdGVkVmFsdWUiCisgcmV0dXJuPSJqYXZhLmxhbmcuT2JqZWN0IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldEFuaW1hdGVkVmFsdWUiCisgcmV0dXJuPSJqYXZhLmxhbmcuT2JqZWN0IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJwcm9wZXJ0eU5hbWUiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0Q3VycmVudFBsYXlUaW1lIgorIHJldHVybj0ibG9uZyIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXREdXJhdGlvbiIKKyByZXR1cm49ImxvbmciCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0RnJhbWVEZWxheSIKKyByZXR1cm49ImxvbmciCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRJbnRlcnBvbGF0b3IiCisgcmV0dXJuPSJhbmRyb2lkLnZpZXcuYW5pbWF0aW9uLkludGVycG9sYXRvciIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRSZXBlYXRDb3VudCIKKyByZXR1cm49ImludCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRSZXBlYXRNb2RlIgorIHJldHVybj0iaW50IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldFN0YXJ0RGVsYXkiCisgcmV0dXJuPSJsb25nIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldFZhbHVlcyIKKyByZXR1cm49ImFuZHJvaWQuYW5pbWF0aW9uLlByb3BlcnR5VmFsdWVzSG9sZGVyW10iCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iaXNSdW5uaW5nIgorIHJldHVybj0iYm9vbGVhbiIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJyZW1vdmVVcGRhdGVMaXN0ZW5lciIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9Imxpc3RlbmVyIiB0eXBlPSJhbmRyb2lkLmFuaW1hdGlvbi5WYWx1ZUFuaW1hdG9yLkFuaW1hdG9yVXBkYXRlTGlzdGVuZXIiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0icmV2ZXJzZSIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0Q3VycmVudFBsYXlUaW1lIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0icGxheVRpbWUiIHR5cGU9ImxvbmciPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0RHVyYXRpb24iCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJkdXJhdGlvbiIgdHlwZT0ibG9uZyI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRFdmFsdWF0b3IiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJ2YWx1ZSIgdHlwZT0iYW5kcm9pZC5hbmltYXRpb24uVHlwZUV2YWx1YXRvciI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRGcmFtZURlbGF5IgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJmcmFtZURlbGF5IiB0eXBlPSJsb25nIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldEludGVycG9sYXRvciIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InZhbHVlIiB0eXBlPSJhbmRyb2lkLnZpZXcuYW5pbWF0aW9uLkludGVycG9sYXRvciI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRSZXBlYXRDb3VudCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InZhbHVlIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0UmVwZWF0TW9kZSIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InZhbHVlIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0U3RhcnREZWxheSIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InN0YXJ0RGVsYXkiIHR5cGU9ImxvbmciPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0VmFsdWVzIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0idmFsdWVzIiB0eXBlPSJhbmRyb2lkLmFuaW1hdGlvbi5Qcm9wZXJ0eVZhbHVlc0hvbGRlci4uLiI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRWYWx1ZXMiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJ2YWx1ZXMiIHR5cGU9IlQuLi4iPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxmaWVsZCBuYW1lPSJJTkZJTklURSIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9Ii0xIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IlJFU1RBUlQiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIxIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IlJFVkVSU0UiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIyIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPC9jbGFzcz4KKzxpbnRlcmZhY2UgbmFtZT0iVmFsdWVBbmltYXRvci5BbmltYXRvclVwZGF0ZUxpc3RlbmVyIgorIGFic3RyYWN0PSJ0cnVlIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPG1ldGhvZCBuYW1lPSJvbkFuaW1hdGlvblVwZGF0ZSIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iYW5pbWF0aW9uIiB0eXBlPSJhbmRyb2lkLmFuaW1hdGlvbi5WYWx1ZUFuaW1hdG9yIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8L2ludGVyZmFjZT4KKzwvcGFja2FnZT4KIDxwYWNrYWdlIG5hbWU9ImFuZHJvaWQuYXBwIgogPgorPGNsYXNzIG5hbWU9IkFjdGlvbkJhciIKKyBleHRlbmRzPSJqYXZhLmxhbmcuT2JqZWN0IgorIGFic3RyYWN0PSJ0cnVlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxjb25zdHJ1Y3RvciBuYW1lPSJBY3Rpb25CYXIiCisgdHlwZT0iYW5kcm9pZC5hcHAuQWN0aW9uQmFyIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvY29uc3RydWN0b3I+Cis8bWV0aG9kIG5hbWU9ImFkZFRhYiIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0idGFiIiB0eXBlPSJhbmRyb2lkLmFwcC5BY3Rpb25CYXIuVGFiIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImFkZFRhYiIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0idGFiIiB0eXBlPSJhbmRyb2lkLmFwcC5BY3Rpb25CYXIuVGFiIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJwb3NpdGlvbiIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldEN1c3RvbU5hdmlnYXRpb25WaWV3IgorIHJldHVybj0iYW5kcm9pZC52aWV3LlZpZXciCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXREaXNwbGF5T3B0aW9ucyIKKyByZXR1cm49ImludCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldEhlaWdodCIKKyByZXR1cm49ImludCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldE5hdmlnYXRpb25Nb2RlIgorIHJldHVybj0iaW50IgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0U2VsZWN0ZWROYXZpZ2F0aW9uSXRlbSIKKyByZXR1cm49ImludCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldFNlbGVjdGVkVGFiIgorIHJldHVybj0iYW5kcm9pZC5hcHAuQWN0aW9uQmFyLlRhYiIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldFN1YnRpdGxlIgorIHJldHVybj0iamF2YS5sYW5nLkNoYXJTZXF1ZW5jZSIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldFRpdGxlIgorIHJldHVybj0iamF2YS5sYW5nLkNoYXJTZXF1ZW5jZSIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImhpZGUiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iaXNTaG93aW5nIgorIHJldHVybj0iYm9vbGVhbiIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9Im5ld1RhYiIKKyByZXR1cm49ImFuZHJvaWQuYXBwLkFjdGlvbkJhci5UYWIiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJyZW1vdmVUYWIiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InRhYiIgdHlwZT0iYW5kcm9pZC5hcHAuQWN0aW9uQmFyLlRhYiI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJyZW1vdmVUYWJBdCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0icG9zaXRpb24iIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZWxlY3RUYWIiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InRhYiIgdHlwZT0iYW5kcm9pZC5hcHAuQWN0aW9uQmFyLlRhYiI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRCYWNrZ3JvdW5kRHJhd2FibGUiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImQiIHR5cGU9ImFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuRHJhd2FibGUiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0Q3VzdG9tTmF2aWdhdGlvbk1vZGUiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InZpZXciIHR5cGU9ImFuZHJvaWQudmlldy5WaWV3Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldERpc3BsYXlPcHRpb25zIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJvcHRpb25zIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0RGlzcGxheU9wdGlvbnMiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9Im9wdGlvbnMiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ibWFzayIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldERyb3Bkb3duTmF2aWdhdGlvbk1vZGUiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImFkYXB0ZXIiIHR5cGU9ImFuZHJvaWQud2lkZ2V0LlNwaW5uZXJBZGFwdGVyIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJjYWxsYmFjayIgdHlwZT0iYW5kcm9pZC5hcHAuQWN0aW9uQmFyLk5hdmlnYXRpb25DYWxsYmFjayI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXREcm9wZG93bk5hdmlnYXRpb25Nb2RlIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJhZGFwdGVyIiB0eXBlPSJhbmRyb2lkLndpZGdldC5TcGlubmVyQWRhcHRlciI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iY2FsbGJhY2siIHR5cGU9ImFuZHJvaWQuYXBwLkFjdGlvbkJhci5OYXZpZ2F0aW9uQ2FsbGJhY2siPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImRlZmF1bHRTZWxlY3RlZFBvc2l0aW9uIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0U2VsZWN0ZWROYXZpZ2F0aW9uSXRlbSIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0icG9zaXRpb24iIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRTdGFuZGFyZE5hdmlnYXRpb25Nb2RlIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldFN1YnRpdGxlIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJzdWJ0aXRsZSIgdHlwZT0iamF2YS5sYW5nLkNoYXJTZXF1ZW5jZSI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRTdWJ0aXRsZSIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0icmVzSWQiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRUYWJOYXZpZ2F0aW9uTW9kZSIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRUaXRsZSIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0idGl0bGUiIHR5cGU9ImphdmEubGFuZy5DaGFyU2VxdWVuY2UiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0VGl0bGUiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InJlc0lkIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2hvdyIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPGZpZWxkIG5hbWU9IkRJU1BMQVlfSElERV9IT01FIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMiIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJESVNQTEFZX1VTRV9MT0dPIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJOQVZJR0FUSU9OX01PREVfQ1VTVE9NIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMyIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJOQVZJR0FUSU9OX01PREVfRFJPUERPV05fTElTVCIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjEiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iTkFWSUdBVElPTl9NT0RFX1NUQU5EQVJEIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMCIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJOQVZJR0FUSU9OX01PREVfVEFCUyIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjIiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8L2NsYXNzPgorPGludGVyZmFjZSBuYW1lPSJBY3Rpb25CYXIuTmF2aWdhdGlvbkNhbGxiYWNrIgorIGFic3RyYWN0PSJ0cnVlIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPG1ldGhvZCBuYW1lPSJvbk5hdmlnYXRpb25JdGVtU2VsZWN0ZWQiCisgcmV0dXJuPSJib29sZWFuIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9Iml0ZW1Qb3NpdGlvbiIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJpdGVtSWQiIHR5cGU9ImxvbmciPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzwvaW50ZXJmYWNlPgorPGNsYXNzIG5hbWU9IkFjdGlvbkJhci5UYWIiCisgZXh0ZW5kcz0iamF2YS5sYW5nLk9iamVjdCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxjb25zdHJ1Y3RvciBuYW1lPSJBY3Rpb25CYXIuVGFiIgorIHR5cGU9ImFuZHJvaWQuYXBwLkFjdGlvbkJhci5UYWIiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9jb25zdHJ1Y3Rvcj4KKzxtZXRob2QgbmFtZT0iZ2V0Q3VzdG9tVmlldyIKKyByZXR1cm49ImFuZHJvaWQudmlldy5WaWV3IgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0SWNvbiIKKyByZXR1cm49ImFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuRHJhd2FibGUiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRQb3NpdGlvbiIKKyByZXR1cm49ImludCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldFRhZyIKKyByZXR1cm49ImphdmEubGFuZy5PYmplY3QiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRUZXh0IgorIHJldHVybj0iamF2YS5sYW5nLkNoYXJTZXF1ZW5jZSIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNlbGVjdCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRDdXN0b21WaWV3IgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJ2aWV3IiB0eXBlPSJhbmRyb2lkLnZpZXcuVmlldyI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRJY29uIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJpY29uIiB0eXBlPSJhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldFRhYkxpc3RlbmVyIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJsaXN0ZW5lciIgdHlwZT0iYW5kcm9pZC5hcHAuQWN0aW9uQmFyLlRhYkxpc3RlbmVyIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldFRhZyIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0ib2JqIiB0eXBlPSJqYXZhLmxhbmcuT2JqZWN0Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldFRleHQiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InRleHQiIHR5cGU9ImphdmEubGFuZy5DaGFyU2VxdWVuY2UiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxmaWVsZCBuYW1lPSJJTlZBTElEX1BPU0lUSU9OIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iLTEiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8L2NsYXNzPgorPGludGVyZmFjZSBuYW1lPSJBY3Rpb25CYXIuVGFiTGlzdGVuZXIiCisgYWJzdHJhY3Q9InRydWUiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8bWV0aG9kIG5hbWU9Im9uVGFiU2VsZWN0ZWQiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InRhYiIgdHlwZT0iYW5kcm9pZC5hcHAuQWN0aW9uQmFyLlRhYiI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iZnQiIHR5cGU9ImFuZHJvaWQuYXBwLkZyYWdtZW50VHJhbnNhY3Rpb24iPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ib25UYWJVbnNlbGVjdGVkIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJ0YWIiIHR5cGU9ImFuZHJvaWQuYXBwLkFjdGlvbkJhci5UYWIiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImZ0IiB0eXBlPSJhbmRyb2lkLmFwcC5GcmFnbWVudFRyYW5zYWN0aW9uIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8L2ludGVyZmFjZT4KIDxjbGFzcyBuYW1lPSJBY3Rpdml0eSIKICBleHRlbmRzPSJhbmRyb2lkLnZpZXcuQ29udGV4dFRoZW1lV3JhcHBlciIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0xOTE5MCw2ICsyMjcxOCwzMiBAQAogPHBhcmFtZXRlciBuYW1lPSJldiIgdHlwZT0iYW5kcm9pZC52aWV3Lk1vdGlvbkV2ZW50Ij4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImZpbmRGcmFnbWVudEJ5SWQiCisgcmV0dXJuPSJhbmRyb2lkLmFwcC5GcmFnbWVudCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9ImRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJpZCIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImZpbmRGcmFnbWVudEJ5VGFnIgorIHJldHVybj0iYW5kcm9pZC5hcHAuRnJhZ21lbnQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0idGFnIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9ImZpbmRWaWV3QnlJZCIKICByZXR1cm49ImFuZHJvaWQudmlldy5WaWV3IgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTE5MjU1LDYgKzIyODA5LDE3IEBACiA8cGFyYW1ldGVyIG5hbWU9ImNoaWxkIiB0eXBlPSJhbmRyb2lkLmFwcC5BY3Rpdml0eSI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRBY3Rpb25CYXIiCisgcmV0dXJuPSJhbmRyb2lkLmFwcC5BY3Rpb25CYXIiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0iZ2V0QXBwbGljYXRpb24iCiAgcmV0dXJuPSJhbmRyb2lkLmFwcC5BcHBsaWNhdGlvbiIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0xOTMyMSwxMiArMjI4ODYsMTIgQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L21ldGhvZD4KLTxtZXRob2QgbmFtZT0iZ2V0SW5zdGFuY2VDb3VudCIKLSByZXR1cm49ImxvbmciCis8bWV0aG9kIG5hbWU9ImdldEZyYWdtZW50TWFuYWdlciIKKyByZXR1cm49ImFuZHJvaWQuYXBwLkZyYWdtZW50TWFuYWdlciIKICBhYnN0cmFjdD0iZmFsc2UiCiAgbmF0aXZlPSJmYWxzZSIKICBzeW5jaHJvbml6ZWQ9ImZhbHNlIgotIHN0YXRpYz0idHJ1ZSIKKyBzdGF0aWM9ImZhbHNlIgogIGZpbmFsPSJmYWxzZSIKICBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKICB2aXNpYmlsaXR5PSJwdWJsaWMiCkBAIC0xOTM2NSw2ICsyMjkzMCwxNyBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRMb2FkZXJNYW5hZ2VyIgorIHJldHVybj0iYW5kcm9pZC5hcHAuTG9hZGVyTWFuYWdlciIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJnZXRMb2NhbENsYXNzTmFtZSIKICByZXR1cm49ImphdmEubGFuZy5TdHJpbmciCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMTk0OTksNiArMjMwNzUsMjggQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iaW52YWxpZGF0ZU9wdGlvbnNNZW51IgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJpc0NoYW5naW5nQ29uZmlndXJhdGlvbnMiCisgcmV0dXJuPSJib29sZWFuIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9ImlzQ2hpbGQiCiAgcmV0dXJuPSJib29sZWFuIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTE5NTM5LDcgKzIzMTM3LDcgQEAKICBzeW5jaHJvbml6ZWQ9ImZhbHNlIgogIHN0YXRpYz0iZmFsc2UiCiAgZmluYWw9InRydWUiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgZGVwcmVjYXRlZD0iZGVwcmVjYXRlZCIKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8cGFyYW1ldGVyIG5hbWU9InVyaSIgdHlwZT0iYW5kcm9pZC5uZXQuVXJpIj4KQEAgLTE5NTgzLDYgKzIzMTgxLDE5IEBACiA8cGFyYW1ldGVyIG5hbWU9ImRhdGEiIHR5cGU9ImFuZHJvaWQuY29udGVudC5JbnRlbnQiPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ib25BdHRhY2hGcmFnbWVudCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImZyYWdtZW50IiB0eXBlPSJhbmRyb2lkLmFwcC5GcmFnbWVudCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJvbkF0dGFjaGVkVG9XaW5kb3ciCiAgcmV0dXJuPSJ2b2lkIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTIwMTY5LDYgKzIzNzgwLDE5IEBACiAgdmlzaWJpbGl0eT0icHJvdGVjdGVkIgogPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9Im9uU3RhcnRBY3Rpb25Nb2RlIgorIHJldHVybj0iYW5kcm9pZC52aWV3LkFjdGlvbk1vZGUiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImNhbGxiYWNrIiB0eXBlPSJhbmRyb2lkLnZpZXcuQWN0aW9uTW9kZS5DYWxsYmFjayI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJvblN0b3AiCiAgcmV0dXJuPSJ2b2lkIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTIwMjgyLDYgKzIzOTA2LDE3IEBACiA8cGFyYW1ldGVyIG5hbWU9InZpZXciIHR5cGU9ImFuZHJvaWQudmlldy5WaWV3Ij4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9Im9wZW5GcmFnbWVudFRyYW5zYWN0aW9uIgorIHJldHVybj0iYW5kcm9pZC5hcHAuRnJhZ21lbnRUcmFuc2FjdGlvbiIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9ImRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9Im9wZW5PcHRpb25zTWVudSIKICByZXR1cm49InZvaWQiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMjAzMDgsNiArMjM5NDMsNDcgQEAKIDxwYXJhbWV0ZXIgbmFtZT0iZXhpdEFuaW0iIHR5cGU9ImludCI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJwb3BCYWNrU3RhY2siCisgcmV0dXJuPSJib29sZWFuIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0iZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0icG9wQmFja1N0YWNrIgorIHJldHVybj0iYm9vbGVhbiIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9ImRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJuYW1lIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJmbGFncyIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InBvcEJhY2tTdGFjayIKKyByZXR1cm49ImJvb2xlYW4iCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iaWQiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iZmxhZ3MiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJyZWdpc3RlckZvckNvbnRleHRNZW51IgogIHJldHVybj0idm9pZCIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0yMDY5OSw2ICsyNDM3NSwxOSBAQAogPHBhcmFtZXRlciBuYW1lPSJhcmdzIiB0eXBlPSJhbmRyb2lkLm9zLkJ1bmRsZSI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzdGFydEFjdGlvbk1vZGUiCisgcmV0dXJuPSJhbmRyb2lkLnZpZXcuQWN0aW9uTW9kZSIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iY2FsbGJhY2siIHR5cGU9ImFuZHJvaWQudmlldy5BY3Rpb25Nb2RlLkNhbGxiYWNrIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9InN0YXJ0QWN0aXZpdHlGb3JSZXN1bHQiCiAgcmV0dXJuPSJ2b2lkIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTIwNzMxLDYgKzI0NDIwLDIzIEBACiA8cGFyYW1ldGVyIG5hbWU9InJlcXVlc3RDb2RlIiB0eXBlPSJpbnQiPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic3RhcnRBY3Rpdml0eUZyb21GcmFnbWVudCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImZyYWdtZW50IiB0eXBlPSJhbmRyb2lkLmFwcC5GcmFnbWVudCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iaW50ZW50IiB0eXBlPSJhbmRyb2lkLmNvbnRlbnQuSW50ZW50Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJyZXF1ZXN0Q29kZSIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9InN0YXJ0QWN0aXZpdHlJZk5lZWRlZCIKICByZXR1cm49ImJvb2xlYW4iCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMjA4MDUsNyArMjQ1MTEsNyBAQAogIHN5bmNocm9uaXplZD0iZmFsc2UiCiAgc3RhdGljPSJmYWxzZSIKICBmaW5hbD0iZmFsc2UiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgZGVwcmVjYXRlZD0iZGVwcmVjYXRlZCIKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8cGFyYW1ldGVyIG5hbWU9ImMiIHR5cGU9ImFuZHJvaWQuZGF0YWJhc2UuQ3Vyc29yIj4KQEAgLTIwODUwLDcgKzI0NTU2LDcgQEAKICBzeW5jaHJvbml6ZWQ9ImZhbHNlIgogIHN0YXRpYz0iZmFsc2UiCiAgZmluYWw9ImZhbHNlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIGRlcHJlY2F0ZWQ9ImRlcHJlY2F0ZWQiCiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPHBhcmFtZXRlciBuYW1lPSJjIiB0eXBlPSJhbmRyb2lkLmRhdGFiYXNlLkN1cnNvciI+CkBAIC0yMDk2Myw2ICsyNDY2OSwxNyBAQAogIHZpc2liaWxpdHk9InByb3RlY3RlZCIKID4KIDwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iUE9QX0JBQ0tfU1RBQ0tfSU5DTFVTSVZFIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KIDxmaWVsZCBuYW1lPSJSRVNVTFRfQ0FOQ0VMRUQiCiAgdHlwZT0iaW50IgogIHRyYW5zaWVudD0iZmFsc2UiCkBAIC0yMzY2NSw2ICsyNzM4MiwxNyBAQAogPHBhcmFtZXRlciBuYW1lPSJpZCIgdHlwZT0iaW50Ij4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldEFjdGlvbkJhciIKKyByZXR1cm49ImFuZHJvaWQuYXBwLkFjdGlvbkJhciIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJnZXRDb250ZXh0IgogIHJldHVybj0iYW5kcm9pZC5jb250ZW50LkNvbnRleHQiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMjM3NDIsNiArMjc0NzAsMTcgQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iaW52YWxpZGF0ZU9wdGlvbnNNZW51IgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJpc1Nob3dpbmciCiAgcmV0dXJuPSJib29sZWFuIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTI0MTAzLDYgKzI3ODQyLDE5IEBACiAgdmlzaWJpbGl0eT0icHJvdGVjdGVkIgogPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9Im9uU3RhcnRBY3Rpb25Nb2RlIgorIHJldHVybj0iYW5kcm9pZC52aWV3LkFjdGlvbk1vZGUiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImNhbGxiYWNrIiB0eXBlPSJhbmRyb2lkLnZpZXcuQWN0aW9uTW9kZS5DYWxsYmFjayI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJvblN0b3AiCiAgcmV0dXJuPSJ2b2lkIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTI0NTExLDYgKzI4MjYzLDI1MSBAQAogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KIDwvY2xhc3M+Cis8Y2xhc3MgbmFtZT0iRGlhbG9nRnJhZ21lbnQiCisgZXh0ZW5kcz0iYW5kcm9pZC5hcHAuRnJhZ21lbnQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxpbXBsZW1lbnRzIG5hbWU9ImFuZHJvaWQuY29udGVudC5EaWFsb2dJbnRlcmZhY2UuT25DYW5jZWxMaXN0ZW5lciI+Cis8L2ltcGxlbWVudHM+Cis8aW1wbGVtZW50cyBuYW1lPSJhbmRyb2lkLmNvbnRlbnQuRGlhbG9nSW50ZXJmYWNlLk9uRGlzbWlzc0xpc3RlbmVyIj4KKzwvaW1wbGVtZW50cz4KKzxjb25zdHJ1Y3RvciBuYW1lPSJEaWFsb2dGcmFnbWVudCIKKyB0eXBlPSJhbmRyb2lkLmFwcC5EaWFsb2dGcmFnbWVudCIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2NvbnN0cnVjdG9yPgorPG1ldGhvZCBuYW1lPSJkaXNtaXNzIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRDYW5jZWxhYmxlIgorIHJldHVybj0iYm9vbGVhbiIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXREaWFsb2ciCisgcmV0dXJuPSJhbmRyb2lkLmFwcC5EaWFsb2ciCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0U2hvd3NEaWFsb2ciCisgcmV0dXJuPSJib29sZWFuIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldFRoZW1lIgorIHJldHVybj0iaW50IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9Im9uQ2FuY2VsIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iZGlhbG9nIiB0eXBlPSJhbmRyb2lkLmNvbnRlbnQuRGlhbG9nSW50ZXJmYWNlIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9Im9uQ3JlYXRlRGlhbG9nIgorIHJldHVybj0iYW5kcm9pZC5hcHAuRGlhbG9nIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJzYXZlZEluc3RhbmNlU3RhdGUiIHR5cGU9ImFuZHJvaWQub3MuQnVuZGxlIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9Im9uRGlzbWlzcyIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImRpYWxvZyIgdHlwZT0iYW5kcm9pZC5jb250ZW50LkRpYWxvZ0ludGVyZmFjZSI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRDYW5jZWxhYmxlIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iY2FuY2VsYWJsZSIgdHlwZT0iYm9vbGVhbiI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRTaG93c0RpYWxvZyIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InNob3dzRGlhbG9nIiB0eXBlPSJib29sZWFuIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldFN0eWxlIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0ic3R5bGUiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0idGhlbWUiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzaG93IgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9ImRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJhY3Rpdml0eSIgdHlwZT0iYW5kcm9pZC5hcHAuQWN0aXZpdHkiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InRhZyIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzaG93IgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0ibWFuYWdlciIgdHlwZT0iYW5kcm9pZC5hcHAuRnJhZ21lbnRNYW5hZ2VyIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJ0YWciIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2hvdyIKKyByZXR1cm49ImludCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0idHJhbnNhY3Rpb24iIHR5cGU9ImFuZHJvaWQuYXBwLkZyYWdtZW50VHJhbnNhY3Rpb24iPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InRhZyIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPGZpZWxkIG5hbWU9IlNUWUxFX05PUk1BTCIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjAiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iU1RZTEVfTk9fRlJBTUUiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIyIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IlNUWUxFX05PX0lOUFVUIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMyIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJTVFlMRV9OT19USVRMRSIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjEiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8L2NsYXNzPgogPGNsYXNzIG5hbWU9IkV4cGFuZGFibGVMaXN0QWN0aXZpdHkiCiAgZXh0ZW5kcz0iYW5kcm9pZC5hcHAuQWN0aXZpdHkiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMjQ2NzAsNiArMjg2NjcsMTA3OSBAQAogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KIDwvY2xhc3M+Cis8Y2xhc3MgbmFtZT0iRnJhZ21lbnQiCisgZXh0ZW5kcz0iamF2YS5sYW5nLk9iamVjdCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPGltcGxlbWVudHMgbmFtZT0iYW5kcm9pZC5jb250ZW50LkNvbXBvbmVudENhbGxiYWNrcyI+Cis8L2ltcGxlbWVudHM+Cis8aW1wbGVtZW50cyBuYW1lPSJhbmRyb2lkLnZpZXcuVmlldy5PbkNyZWF0ZUNvbnRleHRNZW51TGlzdGVuZXIiPgorPC9pbXBsZW1lbnRzPgorPGNvbnN0cnVjdG9yIG5hbWU9IkZyYWdtZW50IgorIHR5cGU9ImFuZHJvaWQuYXBwLkZyYWdtZW50IgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvY29uc3RydWN0b3I+Cis8bWV0aG9kIG5hbWU9ImVxdWFscyIKKyByZXR1cm49ImJvb2xlYW4iCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0ibyIgdHlwZT0iamF2YS5sYW5nLk9iamVjdCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRBY3Rpdml0eSIKKyByZXR1cm49ImFuZHJvaWQuYXBwLkFjdGl2aXR5IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0QXJndW1lbnRzIgorIHJldHVybj0iYW5kcm9pZC5vcy5CdW5kbGUiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRGcmFnbWVudE1hbmFnZXIiCisgcmV0dXJuPSJhbmRyb2lkLmFwcC5GcmFnbWVudE1hbmFnZXIiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRJZCIKKyByZXR1cm49ImludCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldExvYWRlck1hbmFnZXIiCisgcmV0dXJuPSJhbmRyb2lkLmFwcC5Mb2FkZXJNYW5hZ2VyIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldFJldGFpbkluc3RhbmNlIgorIHJldHVybj0iYm9vbGVhbiIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldFRhZyIKKyByZXR1cm49ImphdmEubGFuZy5TdHJpbmciCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRUYXJnZXRGcmFnbWVudCIKKyByZXR1cm49ImFuZHJvaWQuYXBwLkZyYWdtZW50IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0VGFyZ2V0UmVxdWVzdENvZGUiCisgcmV0dXJuPSJpbnQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRWaWV3IgorIHJldHVybj0iYW5kcm9pZC52aWV3LlZpZXciCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iaGFzaENvZGUiCisgcmV0dXJuPSJpbnQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJpbnN0YW50aWF0ZSIKKyByZXR1cm49ImFuZHJvaWQuYXBwLkZyYWdtZW50IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImNvbnRleHQiIHR5cGU9ImFuZHJvaWQuY29udGVudC5Db250ZXh0Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJmbmFtZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJpbnN0YW50aWF0ZSIKKyByZXR1cm49ImFuZHJvaWQuYXBwLkZyYWdtZW50IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImNvbnRleHQiIHR5cGU9ImFuZHJvaWQuY29udGVudC5Db250ZXh0Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJmbmFtZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iYXJncyIgdHlwZT0iYW5kcm9pZC5vcy5CdW5kbGUiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iaXNBZGRlZCIKKyByZXR1cm49ImJvb2xlYW4iCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJpc0hpZGRlbiIKKyByZXR1cm49ImJvb2xlYW4iCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJpc1Jlc3VtZWQiCisgcmV0dXJuPSJib29sZWFuIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iaXNWaXNpYmxlIgorIHJldHVybj0iYm9vbGVhbiIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9Im9uQWN0aXZpdHlDcmVhdGVkIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0ic2F2ZWRJbnN0YW5jZVN0YXRlIiB0eXBlPSJhbmRyb2lkLm9zLkJ1bmRsZSI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJvbkFjdGl2aXR5UmVzdWx0IgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0icmVxdWVzdENvZGUiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0icmVzdWx0Q29kZSIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJkYXRhIiB0eXBlPSJhbmRyb2lkLmNvbnRlbnQuSW50ZW50Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9Im9uQXR0YWNoIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iYWN0aXZpdHkiIHR5cGU9ImFuZHJvaWQuYXBwLkFjdGl2aXR5Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9Im9uQ29uZmlndXJhdGlvbkNoYW5nZWQiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJuZXdDb25maWciIHR5cGU9ImFuZHJvaWQuY29udGVudC5yZXMuQ29uZmlndXJhdGlvbiI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJvbkNvbnRleHRJdGVtU2VsZWN0ZWQiCisgcmV0dXJuPSJib29sZWFuIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJpdGVtIiB0eXBlPSJhbmRyb2lkLnZpZXcuTWVudUl0ZW0iPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ib25DcmVhdGUiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJzYXZlZEluc3RhbmNlU3RhdGUiIHR5cGU9ImFuZHJvaWQub3MuQnVuZGxlIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9Im9uQ3JlYXRlQW5pbWF0b3IiCisgcmV0dXJuPSJhbmRyb2lkLmFuaW1hdGlvbi5BbmltYXRvciIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0idHJhbnNpdCIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJlbnRlciIgdHlwZT0iYm9vbGVhbiI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ibmV4dEFuaW0iIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJvbkNyZWF0ZUNvbnRleHRNZW51IgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0ibWVudSIgdHlwZT0iYW5kcm9pZC52aWV3LkNvbnRleHRNZW51Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJ2IiB0eXBlPSJhbmRyb2lkLnZpZXcuVmlldyI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ibWVudUluZm8iIHR5cGU9ImFuZHJvaWQudmlldy5Db250ZXh0TWVudS5Db250ZXh0TWVudUluZm8iPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ib25DcmVhdGVPcHRpb25zTWVudSIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9Im1lbnUiIHR5cGU9ImFuZHJvaWQudmlldy5NZW51Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJpbmZsYXRlciIgdHlwZT0iYW5kcm9pZC52aWV3Lk1lbnVJbmZsYXRlciI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJvbkNyZWF0ZVZpZXciCisgcmV0dXJuPSJhbmRyb2lkLnZpZXcuVmlldyIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iaW5mbGF0ZXIiIHR5cGU9ImFuZHJvaWQudmlldy5MYXlvdXRJbmZsYXRlciI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iY29udGFpbmVyIiB0eXBlPSJhbmRyb2lkLnZpZXcuVmlld0dyb3VwIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJzYXZlZEluc3RhbmNlU3RhdGUiIHR5cGU9ImFuZHJvaWQub3MuQnVuZGxlIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9Im9uRGVzdHJveSIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ib25EZXN0cm95VmlldyIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ib25EZXRhY2giCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9Im9uSGlkZGVuQ2hhbmdlZCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImhpZGRlbiIgdHlwZT0iYm9vbGVhbiI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJvbkluZmxhdGUiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJhdHRycyIgdHlwZT0iYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ic2F2ZWRJbnN0YW5jZVN0YXRlIiB0eXBlPSJhbmRyb2lkLm9zLkJ1bmRsZSI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJvbkxvd01lbW9yeSIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ib25PcHRpb25zSXRlbVNlbGVjdGVkIgorIHJldHVybj0iYm9vbGVhbiIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iaXRlbSIgdHlwZT0iYW5kcm9pZC52aWV3Lk1lbnVJdGVtIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9Im9uT3B0aW9uc01lbnVDbG9zZWQiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJtZW51IiB0eXBlPSJhbmRyb2lkLnZpZXcuTWVudSI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJvblBhdXNlIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJvblByZXBhcmVPcHRpb25zTWVudSIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9Im1lbnUiIHR5cGU9ImFuZHJvaWQudmlldy5NZW51Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9Im9uUmVzdW1lIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJvblNhdmVJbnN0YW5jZVN0YXRlIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0ib3V0U3RhdGUiIHR5cGU9ImFuZHJvaWQub3MuQnVuZGxlIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9Im9uU3RhcnQiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9Im9uU3RvcCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0icmVnaXN0ZXJGb3JDb250ZXh0TWVudSIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InZpZXciIHR5cGU9ImFuZHJvaWQudmlldy5WaWV3Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldEFyZ3VtZW50cyIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImFyZ3MiIHR5cGU9ImFuZHJvaWQub3MuQnVuZGxlIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldEhhc09wdGlvbnNNZW51IgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iaGFzTWVudSIgdHlwZT0iYm9vbGVhbiI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRSZXRhaW5JbnN0YW5jZSIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InJldGFpbiIgdHlwZT0iYm9vbGVhbiI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRUYXJnZXRGcmFnbWVudCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImZyYWdtZW50IiB0eXBlPSJhbmRyb2lkLmFwcC5GcmFnbWVudCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0icmVxdWVzdENvZGUiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzdGFydEFjdGl2aXR5IgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iaW50ZW50IiB0eXBlPSJhbmRyb2lkLmNvbnRlbnQuSW50ZW50Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InN0YXJ0QWN0aXZpdHlGb3JSZXN1bHQiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJpbnRlbnQiIHR5cGU9ImFuZHJvaWQuY29udGVudC5JbnRlbnQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InJlcXVlc3RDb2RlIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0idW5yZWdpc3RlckZvckNvbnRleHRNZW51IgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0idmlldyIgdHlwZT0iYW5kcm9pZC52aWV3LlZpZXciPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzwvY2xhc3M+Cis8Y2xhc3MgbmFtZT0iRnJhZ21lbnQuSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiIKKyBleHRlbmRzPSJhbmRyb2lkLnV0aWwuQW5kcm9pZFJ1bnRpbWVFeGNlcHRpb24iCisgYWJzdHJhY3Q9ImZhbHNlIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPGNvbnN0cnVjdG9yIG5hbWU9IkZyYWdtZW50Lkluc3RhbnRpYXRpb25FeGNlcHRpb24iCisgdHlwZT0iYW5kcm9pZC5hcHAuRnJhZ21lbnQuSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9Im1zZyIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iY2F1c2UiIHR5cGU9ImphdmEubGFuZy5FeGNlcHRpb24iPgorPC9wYXJhbWV0ZXI+Cis8L2NvbnN0cnVjdG9yPgorPC9jbGFzcz4KKzxpbnRlcmZhY2UgbmFtZT0iRnJhZ21lbnRNYW5hZ2VyIgorIGFic3RyYWN0PSJ0cnVlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxtZXRob2QgbmFtZT0iZmluZEZyYWdtZW50QnlJZCIKKyByZXR1cm49ImFuZHJvaWQuYXBwLkZyYWdtZW50IgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImlkIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZmluZEZyYWdtZW50QnlUYWciCisgcmV0dXJuPSJhbmRyb2lkLmFwcC5GcmFnbWVudCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJ0YWciIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0RnJhZ21lbnQiCisgcmV0dXJuPSJhbmRyb2lkLmFwcC5GcmFnbWVudCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJidW5kbGUiIHR5cGU9ImFuZHJvaWQub3MuQnVuZGxlIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJrZXkiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ib3BlblRyYW5zYWN0aW9uIgorIHJldHVybj0iYW5kcm9pZC5hcHAuRnJhZ21lbnRUcmFuc2FjdGlvbiIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InBvcEJhY2tTdGFjayIKKyByZXR1cm49ImJvb2xlYW4iCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJwb3BCYWNrU3RhY2siCisgcmV0dXJuPSJib29sZWFuIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9Im5hbWUiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImZsYWdzIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0icG9wQmFja1N0YWNrIgorIHJldHVybj0iYm9vbGVhbiIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJpZCIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJmbGFncyIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InB1dEZyYWdtZW50IgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJidW5kbGUiIHR5cGU9ImFuZHJvaWQub3MuQnVuZGxlIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJrZXkiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImZyYWdtZW50IiB0eXBlPSJhbmRyb2lkLmFwcC5GcmFnbWVudCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPGZpZWxkIG5hbWU9IlBPUF9CQUNLX1NUQUNLX0lOQ0xVU0lWRSIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjEiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8L2ludGVyZmFjZT4KKzxpbnRlcmZhY2UgbmFtZT0iRnJhZ21lbnRUcmFuc2FjdGlvbiIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8bWV0aG9kIG5hbWU9ImFkZCIKKyByZXR1cm49ImFuZHJvaWQuYXBwLkZyYWdtZW50VHJhbnNhY3Rpb24iCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iZnJhZ21lbnQiIHR5cGU9ImFuZHJvaWQuYXBwLkZyYWdtZW50Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJ0YWciIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iYWRkIgorIHJldHVybj0iYW5kcm9pZC5hcHAuRnJhZ21lbnRUcmFuc2FjdGlvbiIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJjb250YWluZXJWaWV3SWQiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iZnJhZ21lbnQiIHR5cGU9ImFuZHJvaWQuYXBwLkZyYWdtZW50Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImFkZCIKKyByZXR1cm49ImFuZHJvaWQuYXBwLkZyYWdtZW50VHJhbnNhY3Rpb24iCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iY29udGFpbmVyVmlld0lkIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImZyYWdtZW50IiB0eXBlPSJhbmRyb2lkLmFwcC5GcmFnbWVudCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0idGFnIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImFkZFRvQmFja1N0YWNrIgorIHJldHVybj0iYW5kcm9pZC5hcHAuRnJhZ21lbnRUcmFuc2FjdGlvbiIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJuYW1lIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImNvbW1pdCIKKyByZXR1cm49ImludCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImhpZGUiCisgcmV0dXJuPSJhbmRyb2lkLmFwcC5GcmFnbWVudFRyYW5zYWN0aW9uIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImZyYWdtZW50IiB0eXBlPSJhbmRyb2lkLmFwcC5GcmFnbWVudCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJpc0VtcHR5IgorIHJldHVybj0iYm9vbGVhbiIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InJlbW92ZSIKKyByZXR1cm49ImFuZHJvaWQuYXBwLkZyYWdtZW50VHJhbnNhY3Rpb24iCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iZnJhZ21lbnQiIHR5cGU9ImFuZHJvaWQuYXBwLkZyYWdtZW50Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InJlcGxhY2UiCisgcmV0dXJuPSJhbmRyb2lkLmFwcC5GcmFnbWVudFRyYW5zYWN0aW9uIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImNvbnRhaW5lclZpZXdJZCIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJmcmFnbWVudCIgdHlwZT0iYW5kcm9pZC5hcHAuRnJhZ21lbnQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0icmVwbGFjZSIKKyByZXR1cm49ImFuZHJvaWQuYXBwLkZyYWdtZW50VHJhbnNhY3Rpb24iCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iY29udGFpbmVyVmlld0lkIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImZyYWdtZW50IiB0eXBlPSJhbmRyb2lkLmFwcC5GcmFnbWVudCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0idGFnIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldEN1c3RvbUFuaW1hdGlvbnMiCisgcmV0dXJuPSJhbmRyb2lkLmFwcC5GcmFnbWVudFRyYW5zYWN0aW9uIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImVudGVyIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImV4aXQiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRUcmFuc2l0aW9uIgorIHJldHVybj0iYW5kcm9pZC5hcHAuRnJhZ21lbnRUcmFuc2FjdGlvbiIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJ0cmFuc2l0IiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0VHJhbnNpdGlvblN0eWxlIgorIHJldHVybj0iYW5kcm9pZC5hcHAuRnJhZ21lbnRUcmFuc2FjdGlvbiIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJzdHlsZVJlcyIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNob3ciCisgcmV0dXJuPSJhbmRyb2lkLmFwcC5GcmFnbWVudFRyYW5zYWN0aW9uIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImZyYWdtZW50IiB0eXBlPSJhbmRyb2lkLmFwcC5GcmFnbWVudCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPGZpZWxkIG5hbWU9IlRSQU5TSVRfRU5URVJfTUFTSyIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjQwOTYiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iVFJBTlNJVF9FWElUX01BU0siCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSI4MTkyIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IlRSQU5TSVRfRlJBR01FTlRfQ0xPU0UiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSI4MTk0IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IlRSQU5TSVRfRlJBR01FTlRfT1BFTiIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjQwOTciCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iVFJBTlNJVF9OT05FIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMCIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJUUkFOU0lUX1VOU0VUIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iLTEiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8L2ludGVyZmFjZT4KIDxjbGFzcyBuYW1lPSJJbnN0cnVtZW50YXRpb24iCiAgZXh0ZW5kcz0iamF2YS5sYW5nLk9iamVjdCIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0yNjExOSw2ICszMTE4OSwzNzMgQEAKIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+CiA8L2NsYXNzPgorPGNsYXNzIG5hbWU9Ikxpc3RGcmFnbWVudCIKKyBleHRlbmRzPSJhbmRyb2lkLmFwcC5GcmFnbWVudCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPGNvbnN0cnVjdG9yIG5hbWU9Ikxpc3RGcmFnbWVudCIKKyB0eXBlPSJhbmRyb2lkLmFwcC5MaXN0RnJhZ21lbnQiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9jb25zdHJ1Y3Rvcj4KKzxtZXRob2QgbmFtZT0iZ2V0TGlzdEFkYXB0ZXIiCisgcmV0dXJuPSJhbmRyb2lkLndpZGdldC5MaXN0QWRhcHRlciIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRMaXN0VmlldyIKKyByZXR1cm49ImFuZHJvaWQud2lkZ2V0Lkxpc3RWaWV3IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldFNlbGVjdGVkSXRlbUlkIgorIHJldHVybj0ibG9uZyIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRTZWxlY3RlZEl0ZW1Qb3NpdGlvbiIKKyByZXR1cm49ImludCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJvbkxpc3RJdGVtQ2xpY2siCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJsIiB0eXBlPSJhbmRyb2lkLndpZGdldC5MaXN0VmlldyI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0idiIgdHlwZT0iYW5kcm9pZC52aWV3LlZpZXciPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InBvc2l0aW9uIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImlkIiB0eXBlPSJsb25nIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldEVtcHR5VGV4dCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InRleHQiIHR5cGU9ImphdmEubGFuZy5DaGFyU2VxdWVuY2UiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0TGlzdEFkYXB0ZXIiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJhZGFwdGVyIiB0eXBlPSJhbmRyb2lkLndpZGdldC5MaXN0QWRhcHRlciI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRMaXN0U2hvd24iCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJzaG93biIgdHlwZT0iYm9vbGVhbiI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRMaXN0U2hvd25Ob0FuaW1hdGlvbiIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InNob3duIiB0eXBlPSJib29sZWFuIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldFNlbGVjdGlvbiIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InBvc2l0aW9uIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzwvY2xhc3M+Cis8aW50ZXJmYWNlIG5hbWU9IkxvYWRlck1hbmFnZXIiCisgYWJzdHJhY3Q9InRydWUiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPG1ldGhvZCBuYW1lPSJnZXRMb2FkZXIiCisgcmV0dXJuPSJhbmRyb2lkLmNvbnRlbnQuTG9hZGVyJmx0O0QmZ3Q7IgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImlkIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iaW5pdExvYWRlciIKKyByZXR1cm49ImFuZHJvaWQuY29udGVudC5Mb2FkZXImbHQ7RCZndDsiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iaWQiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iYXJncyIgdHlwZT0iYW5kcm9pZC5vcy5CdW5kbGUiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImNhbGxiYWNrIiB0eXBlPSJhbmRyb2lkLmFwcC5Mb2FkZXJNYW5hZ2VyLkxvYWRlckNhbGxiYWNrcyZsdDtEJmd0OyI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJyZXN0YXJ0TG9hZGVyIgorIHJldHVybj0iYW5kcm9pZC5jb250ZW50LkxvYWRlciZsdDtEJmd0OyIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJpZCIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJhcmdzIiB0eXBlPSJhbmRyb2lkLm9zLkJ1bmRsZSI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iY2FsbGJhY2siIHR5cGU9ImFuZHJvaWQuYXBwLkxvYWRlck1hbmFnZXIuTG9hZGVyQ2FsbGJhY2tzJmx0O0QmZ3Q7Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InN0b3BMb2FkZXIiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImlkIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzwvaW50ZXJmYWNlPgorPGludGVyZmFjZSBuYW1lPSJMb2FkZXJNYW5hZ2VyLkxvYWRlckNhbGxiYWNrcyIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxtZXRob2QgbmFtZT0ib25DcmVhdGVMb2FkZXIiCisgcmV0dXJuPSJhbmRyb2lkLmNvbnRlbnQuTG9hZGVyJmx0O0QmZ3Q7IgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImlkIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImFyZ3MiIHR5cGU9ImFuZHJvaWQub3MuQnVuZGxlIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9Im9uTG9hZEZpbmlzaGVkIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJsb2FkZXIiIHR5cGU9ImFuZHJvaWQuY29udGVudC5Mb2FkZXImbHQ7RCZndDsiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImRhdGEiIHR5cGU9IkQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzwvaW50ZXJmYWNlPgorPGNsYXNzIG5hbWU9IkxvYWRlck1hbmFnaW5nRnJhZ21lbnQiCisgZXh0ZW5kcz0iYW5kcm9pZC5hcHAuRnJhZ21lbnQiCisgYWJzdHJhY3Q9InRydWUiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPGltcGxlbWVudHMgbmFtZT0iYW5kcm9pZC5jb250ZW50LkxvYWRlci5PbkxvYWRDb21wbGV0ZUxpc3RlbmVyIj4KKzwvaW1wbGVtZW50cz4KKzxjb25zdHJ1Y3RvciBuYW1lPSJMb2FkZXJNYW5hZ2luZ0ZyYWdtZW50IgorIHR5cGU9ImFuZHJvaWQuYXBwLkxvYWRlck1hbmFnaW5nRnJhZ21lbnQiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9jb25zdHJ1Y3Rvcj4KKzxtZXRob2QgbmFtZT0iZ2V0TG9hZGVyIgorIHJldHVybj0iYW5kcm9pZC5jb250ZW50LkxvYWRlciZsdDtEJmd0OyIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iaWQiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJvbkNyZWF0ZUxvYWRlciIKKyByZXR1cm49ImFuZHJvaWQuY29udGVudC5Mb2FkZXImbHQ7RCZndDsiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InByb3RlY3RlZCIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iaWQiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iYXJncyIgdHlwZT0iYW5kcm9pZC5vcy5CdW5kbGUiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ib25Jbml0aWFsaXplTG9hZGVycyIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InByb3RlY3RlZCIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJvbkxvYWRDb21wbGV0ZSIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0ibG9hZGVyIiB0eXBlPSJhbmRyb2lkLmNvbnRlbnQuTG9hZGVyJmx0O0QmZ3Q7Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJkYXRhIiB0eXBlPSJEIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9Im9uTG9hZEZpbmlzaGVkIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHJvdGVjdGVkIgorPgorPHBhcmFtZXRlciBuYW1lPSJsb2FkZXIiIHR5cGU9ImFuZHJvaWQuY29udGVudC5Mb2FkZXImbHQ7RCZndDsiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImRhdGEiIHR5cGU9IkQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic3RhcnRMb2FkaW5nIgorIHJldHVybj0iYW5kcm9pZC5jb250ZW50LkxvYWRlciZsdDtEJmd0OyIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iaWQiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iYXJncyIgdHlwZT0iYW5kcm9pZC5vcy5CdW5kbGUiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic3RvcExvYWRpbmciCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJpZCIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8L2NsYXNzPgogPGNsYXNzIG5hbWU9IkxvY2FsQWN0aXZpdHlNYW5hZ2VyIgogIGV4dGVuZHM9ImphdmEubGFuZy5PYmplY3QiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMjY2MDIsNiArMzIwMzksMTcgQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IkZMQUdfSElHSF9QUklPUklUWSIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjEyOCIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KIDxmaWVsZCBuYW1lPSJGTEFHX0lOU0lTVEVOVCIKICB0eXBlPSJpbnQiCiAgdHJhbnNpZW50PSJmYWxzZSIKQEAgLTI5ODMyLDYgKzM1MjgwLDE3IEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJVU0VTX1BPTElDWV9TRVRTX0dMT0JBTF9QUk9YWSIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjUiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+CiA8ZmllbGQgbmFtZT0iVVNFU19QT0xJQ1lfV0FUQ0hfTE9HSU4iCiAgdHlwZT0iaW50IgogIHRyYW5zaWVudD0iZmFsc2UiCkBAIC0zMDEyMSw2ICszNTU4MCwxNyBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRHbG9iYWxQcm94eUFkbWluIgorIHJldHVybj0iYW5kcm9pZC5jb250ZW50LkNvbXBvbmVudE5hbWUiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0iZ2V0TWF4aW11bUZhaWxlZFBhc3N3b3Jkc0ZvcldpcGUiCiAgcmV0dXJuPSJpbnQiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMzAxNDcsNiArMzU2MTcsMTkgQEAKIDxwYXJhbWV0ZXIgbmFtZT0iYWRtaW4iIHR5cGU9ImFuZHJvaWQuY29udGVudC5Db21wb25lbnROYW1lIj4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldFBhc3N3b3JkSGlzdG9yeUxlbmd0aCIKKyByZXR1cm49ImludCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iYWRtaW4iIHR5cGU9ImFuZHJvaWQuY29udGVudC5Db21wb25lbnROYW1lIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9ImdldFBhc3N3b3JkTWF4aW11bUxlbmd0aCIKICByZXR1cm49ImludCIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0zMDE3Myw2ICszNTY1Niw4NCBAQAogPHBhcmFtZXRlciBuYW1lPSJhZG1pbiIgdHlwZT0iYW5kcm9pZC5jb250ZW50LkNvbXBvbmVudE5hbWUiPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0UGFzc3dvcmRNaW5pbXVtTGV0dGVycyIKKyByZXR1cm49ImludCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iYWRtaW4iIHR5cGU9ImFuZHJvaWQuY29udGVudC5Db21wb25lbnROYW1lIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldFBhc3N3b3JkTWluaW11bUxvd2VyQ2FzZSIKKyByZXR1cm49ImludCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iYWRtaW4iIHR5cGU9ImFuZHJvaWQuY29udGVudC5Db21wb25lbnROYW1lIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldFBhc3N3b3JkTWluaW11bU5vbkxldHRlciIKKyByZXR1cm49ImludCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iYWRtaW4iIHR5cGU9ImFuZHJvaWQuY29udGVudC5Db21wb25lbnROYW1lIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldFBhc3N3b3JkTWluaW11bU51bWVyaWMiCisgcmV0dXJuPSJpbnQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImFkbWluIiB0eXBlPSJhbmRyb2lkLmNvbnRlbnQuQ29tcG9uZW50TmFtZSI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRQYXNzd29yZE1pbmltdW1TeW1ib2xzIgorIHJldHVybj0iaW50IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJhZG1pbiIgdHlwZT0iYW5kcm9pZC5jb250ZW50LkNvbXBvbmVudE5hbWUiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0UGFzc3dvcmRNaW5pbXVtVXBwZXJDYXNlIgorIHJldHVybj0iaW50IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJhZG1pbiIgdHlwZT0iYW5kcm9pZC5jb250ZW50LkNvbXBvbmVudE5hbWUiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0iZ2V0UGFzc3dvcmRRdWFsaXR5IgogIHJldHVybj0iaW50IgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTMwMjQ5LDYgKzM1ODEwLDIzIEBACiA8cGFyYW1ldGVyIG5hbWU9ImZsYWdzIiB0eXBlPSJpbnQiPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0R2xvYmFsUHJveHkiCisgcmV0dXJuPSJhbmRyb2lkLmNvbnRlbnQuQ29tcG9uZW50TmFtZSIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iYWRtaW4iIHR5cGU9ImFuZHJvaWQuY29udGVudC5Db21wb25lbnROYW1lIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJwcm94eVNwZWMiIHR5cGU9ImphdmEubmV0LlByb3h5Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJleGNsdXNpb25MaXN0IiB0eXBlPSJqYXZhLnV0aWwuTGlzdCZsdDtqYXZhLmxhbmcuU3RyaW5nJmd0OyI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJzZXRNYXhpbXVtRmFpbGVkUGFzc3dvcmRzRm9yV2lwZSIKICByZXR1cm49InZvaWQiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMzAyNzksNiArMzU4NTcsMjEgQEAKIDxwYXJhbWV0ZXIgbmFtZT0idGltZU1zIiB0eXBlPSJsb25nIj4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldFBhc3N3b3JkSGlzdG9yeUxlbmd0aCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImFkbWluIiB0eXBlPSJhbmRyb2lkLmNvbnRlbnQuQ29tcG9uZW50TmFtZSI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ibGVuZ3RoIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0ic2V0UGFzc3dvcmRNaW5pbXVtTGVuZ3RoIgogIHJldHVybj0idm9pZCIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0zMDI5NCw2ICszNTg4Nyw5NiBAQAogPHBhcmFtZXRlciBuYW1lPSJsZW5ndGgiIHR5cGU9ImludCI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRQYXNzd29yZE1pbmltdW1MZXR0ZXJzIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iYWRtaW4iIHR5cGU9ImFuZHJvaWQuY29udGVudC5Db21wb25lbnROYW1lIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJsZW5ndGgiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRQYXNzd29yZE1pbmltdW1Mb3dlckNhc2UiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJhZG1pbiIgdHlwZT0iYW5kcm9pZC5jb250ZW50LkNvbXBvbmVudE5hbWUiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9Imxlbmd0aCIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldFBhc3N3b3JkTWluaW11bU5vbkxldHRlciIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImFkbWluIiB0eXBlPSJhbmRyb2lkLmNvbnRlbnQuQ29tcG9uZW50TmFtZSI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ibGVuZ3RoIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0UGFzc3dvcmRNaW5pbXVtTnVtZXJpYyIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImFkbWluIiB0eXBlPSJhbmRyb2lkLmNvbnRlbnQuQ29tcG9uZW50TmFtZSI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ibGVuZ3RoIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0UGFzc3dvcmRNaW5pbXVtU3ltYm9scyIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImFkbWluIiB0eXBlPSJhbmRyb2lkLmNvbnRlbnQuQ29tcG9uZW50TmFtZSI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ibGVuZ3RoIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0UGFzc3dvcmRNaW5pbXVtVXBwZXJDYXNlIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iYWRtaW4iIHR5cGU9ImFuZHJvaWQuY29udGVudC5Db21wb25lbnROYW1lIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJsZW5ndGgiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJzZXRQYXNzd29yZFF1YWxpdHkiCiAgcmV0dXJuPSJ2b2lkIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTMwMzg4LDYgKzM2MDcxLDE3IEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJQQVNTV09SRF9RVUFMSVRZX0NPTVBMRVgiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIzOTMyMTYiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+CiA8ZmllbGQgbmFtZT0iUEFTU1dPUkRfUVVBTElUWV9OVU1FUklDIgogIHR5cGU9ImludCIKICB0cmFuc2llbnQ9ImZhbHNlIgpAQCAtMzEzNzEsNiArMzcwNjUsNjYgQEAKIDxwYXJhbWV0ZXIgbmFtZT0iY29udGV4dCIgdHlwZT0iYW5kcm9pZC5jb250ZW50LkNvbnRleHQiPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ibm90aWZ5QXBwV2lkZ2V0Vmlld0RhdGFDaGFuZ2VkIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iYXBwV2lkZ2V0SWRzIiB0eXBlPSJpbnRbXSI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0idmlld0lkIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ibm90aWZ5QXBwV2lkZ2V0Vmlld0RhdGFDaGFuZ2VkIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iYXBwV2lkZ2V0SWQiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0idmlld0lkIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0icGFydGlhbGx5VXBkYXRlQXBwV2lkZ2V0IgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iYXBwV2lkZ2V0SWRzIiB0eXBlPSJpbnRbXSI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0idmlld3MiIHR5cGU9ImFuZHJvaWQud2lkZ2V0LlJlbW90ZVZpZXdzIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InBhcnRpYWxseVVwZGF0ZUFwcFdpZGdldCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImFwcFdpZGdldElkIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InZpZXdzIiB0eXBlPSJhbmRyb2lkLndpZGdldC5SZW1vdGVWaWV3cyI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJ1cGRhdGVBcHBXaWRnZXQiCiAgcmV0dXJuPSJ2b2lkIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTMzOTgyLDYgKzM5NzM2LDcxIEBACiA8L3BhcmFtZXRlcj4KIDwvY29uc3RydWN0b3I+CiA8L2NsYXNzPgorPGNsYXNzIG5hbWU9IkFzeW5jVGFza0xvYWRlciIKKyBleHRlbmRzPSJhbmRyb2lkLmNvbnRlbnQuTG9hZGVyIgorIGFic3RyYWN0PSJ0cnVlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxjb25zdHJ1Y3RvciBuYW1lPSJBc3luY1Rhc2tMb2FkZXIiCisgdHlwZT0iYW5kcm9pZC5jb250ZW50LkFzeW5jVGFza0xvYWRlciIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImNvbnRleHQiIHR5cGU9ImFuZHJvaWQuY29udGVudC5Db250ZXh0Ij4KKzwvcGFyYW1ldGVyPgorPC9jb25zdHJ1Y3Rvcj4KKzxtZXRob2QgbmFtZT0iY2FuY2VsTG9hZCIKKyByZXR1cm49ImJvb2xlYW4iCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZm9yY2VMb2FkIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJsb2FkSW5CYWNrZ3JvdW5kIgorIHJldHVybj0iRCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9Im9uQ2FuY2VsbGVkIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iZGF0YSIgdHlwZT0iRCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPC9jbGFzcz4KIDxjbGFzcyBuYW1lPSJCcm9hZGNhc3RSZWNlaXZlciIKICBleHRlbmRzPSJqYXZhLmxhbmcuT2JqZWN0IgogIGFic3RyYWN0PSJ0cnVlIgpAQCAtMzQyMTIsNiArNDAwMzEsNTcxIEBACiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgogPC9jbGFzcz4KKzxjbGFzcyBuYW1lPSJDbGlwRGF0YSIKKyBleHRlbmRzPSJhbmRyb2lkLmNvbnRlbnQuQ2xpcERlc2NyaXB0aW9uIgorIGFic3RyYWN0PSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8Y29uc3RydWN0b3IgbmFtZT0iQ2xpcERhdGEiCisgdHlwZT0iYW5kcm9pZC5jb250ZW50LkNsaXBEYXRhIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0ibGFiZWwiIHR5cGU9ImphdmEubGFuZy5DaGFyU2VxdWVuY2UiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9Im1pbWVUeXBlcyIgdHlwZT0iamF2YS5sYW5nLlN0cmluZ1tdIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJpY29uIiB0eXBlPSJhbmRyb2lkLmdyYXBoaWNzLkJpdG1hcCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iaXRlbSIgdHlwZT0iYW5kcm9pZC5jb250ZW50LkNsaXBEYXRhLkl0ZW0iPgorPC9wYXJhbWV0ZXI+Cis8L2NvbnN0cnVjdG9yPgorPG1ldGhvZCBuYW1lPSJhZGRJdGVtIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iaXRlbSIgdHlwZT0iYW5kcm9pZC5jb250ZW50LkNsaXBEYXRhLkl0ZW0iPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0SWNvbiIKKyByZXR1cm49ImFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldEl0ZW0iCisgcmV0dXJuPSJhbmRyb2lkLmNvbnRlbnQuQ2xpcERhdGEuSXRlbSIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iaW5kZXgiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRJdGVtQ291bnQiCisgcmV0dXJuPSJpbnQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ibmV3SW50ZW50IgorIHJldHVybj0iYW5kcm9pZC5jb250ZW50LkNsaXBEYXRhIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImxhYmVsIiB0eXBlPSJqYXZhLmxhbmcuQ2hhclNlcXVlbmNlIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJpY29uIiB0eXBlPSJhbmRyb2lkLmdyYXBoaWNzLkJpdG1hcCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iaW50ZW50IiB0eXBlPSJhbmRyb2lkLmNvbnRlbnQuSW50ZW50Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9Im5ld1BsYWluVGV4dCIKKyByZXR1cm49ImFuZHJvaWQuY29udGVudC5DbGlwRGF0YSIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJsYWJlbCIgdHlwZT0iamF2YS5sYW5nLkNoYXJTZXF1ZW5jZSI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iaWNvbiIgdHlwZT0iYW5kcm9pZC5ncmFwaGljcy5CaXRtYXAiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InRleHQiIHR5cGU9ImphdmEubGFuZy5DaGFyU2VxdWVuY2UiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ibmV3UmF3VXJpIgorIHJldHVybj0iYW5kcm9pZC5jb250ZW50LkNsaXBEYXRhIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImxhYmVsIiB0eXBlPSJqYXZhLmxhbmcuQ2hhclNlcXVlbmNlIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJpY29uIiB0eXBlPSJhbmRyb2lkLmdyYXBoaWNzLkJpdG1hcCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0idXJpIiB0eXBlPSJhbmRyb2lkLm5ldC5VcmkiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ibmV3VXJpIgorIHJldHVybj0iYW5kcm9pZC5jb250ZW50LkNsaXBEYXRhIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InJlc29sdmVyIiB0eXBlPSJhbmRyb2lkLmNvbnRlbnQuQ29udGVudFJlc29sdmVyIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJsYWJlbCIgdHlwZT0iamF2YS5sYW5nLkNoYXJTZXF1ZW5jZSI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iaWNvbiIgdHlwZT0iYW5kcm9pZC5ncmFwaGljcy5CaXRtYXAiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InVyaSIgdHlwZT0iYW5kcm9pZC5uZXQuVXJpIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8ZmllbGQgbmFtZT0iQ1JFQVRPUiIKKyB0eXBlPSJhbmRyb2lkLm9zLlBhcmNlbGFibGUuQ3JlYXRvciIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzwvY2xhc3M+Cis8Y2xhc3MgbmFtZT0iQ2xpcERhdGEuSXRlbSIKKyBleHRlbmRzPSJqYXZhLmxhbmcuT2JqZWN0IgorIGFic3RyYWN0PSJmYWxzZSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxjb25zdHJ1Y3RvciBuYW1lPSJDbGlwRGF0YS5JdGVtIgorIHR5cGU9ImFuZHJvaWQuY29udGVudC5DbGlwRGF0YS5JdGVtIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0idGV4dCIgdHlwZT0iamF2YS5sYW5nLkNoYXJTZXF1ZW5jZSI+Cis8L3BhcmFtZXRlcj4KKzwvY29uc3RydWN0b3I+Cis8Y29uc3RydWN0b3IgbmFtZT0iQ2xpcERhdGEuSXRlbSIKKyB0eXBlPSJhbmRyb2lkLmNvbnRlbnQuQ2xpcERhdGEuSXRlbSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImludGVudCIgdHlwZT0iYW5kcm9pZC5jb250ZW50LkludGVudCI+Cis8L3BhcmFtZXRlcj4KKzwvY29uc3RydWN0b3I+Cis8Y29uc3RydWN0b3IgbmFtZT0iQ2xpcERhdGEuSXRlbSIKKyB0eXBlPSJhbmRyb2lkLmNvbnRlbnQuQ2xpcERhdGEuSXRlbSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InVyaSIgdHlwZT0iYW5kcm9pZC5uZXQuVXJpIj4KKzwvcGFyYW1ldGVyPgorPC9jb25zdHJ1Y3Rvcj4KKzxjb25zdHJ1Y3RvciBuYW1lPSJDbGlwRGF0YS5JdGVtIgorIHR5cGU9ImFuZHJvaWQuY29udGVudC5DbGlwRGF0YS5JdGVtIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0idGV4dCIgdHlwZT0iamF2YS5sYW5nLkNoYXJTZXF1ZW5jZSI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iaW50ZW50IiB0eXBlPSJhbmRyb2lkLmNvbnRlbnQuSW50ZW50Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJ1cmkiIHR5cGU9ImFuZHJvaWQubmV0LlVyaSI+Cis8L3BhcmFtZXRlcj4KKzwvY29uc3RydWN0b3I+Cis8bWV0aG9kIG5hbWU9ImNvZXJjZVRvVGV4dCIKKyByZXR1cm49ImphdmEubGFuZy5DaGFyU2VxdWVuY2UiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImNvbnRleHQiIHR5cGU9ImFuZHJvaWQuY29udGVudC5Db250ZXh0Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldEludGVudCIKKyByZXR1cm49ImFuZHJvaWQuY29udGVudC5JbnRlbnQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0VGV4dCIKKyByZXR1cm49ImphdmEubGFuZy5DaGFyU2VxdWVuY2UiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0VXJpIgorIHJldHVybj0iYW5kcm9pZC5uZXQuVXJpIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8L2NsYXNzPgorPGNsYXNzIG5hbWU9IkNsaXBEZXNjcmlwdGlvbiIKKyBleHRlbmRzPSJqYXZhLmxhbmcuT2JqZWN0IgorIGFic3RyYWN0PSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8aW1wbGVtZW50cyBuYW1lPSJhbmRyb2lkLm9zLlBhcmNlbGFibGUiPgorPC9pbXBsZW1lbnRzPgorPGNvbnN0cnVjdG9yIG5hbWU9IkNsaXBEZXNjcmlwdGlvbiIKKyB0eXBlPSJhbmRyb2lkLmNvbnRlbnQuQ2xpcERlc2NyaXB0aW9uIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0ibGFiZWwiIHR5cGU9ImphdmEubGFuZy5DaGFyU2VxdWVuY2UiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9Im1pbWVUeXBlcyIgdHlwZT0iamF2YS5sYW5nLlN0cmluZ1tdIj4KKzwvcGFyYW1ldGVyPgorPC9jb25zdHJ1Y3Rvcj4KKzxjb25zdHJ1Y3RvciBuYW1lPSJDbGlwRGVzY3JpcHRpb24iCisgdHlwZT0iYW5kcm9pZC5jb250ZW50LkNsaXBEZXNjcmlwdGlvbiIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9Im8iIHR5cGU9ImFuZHJvaWQuY29udGVudC5DbGlwRGVzY3JpcHRpb24iPgorPC9wYXJhbWV0ZXI+Cis8L2NvbnN0cnVjdG9yPgorPG1ldGhvZCBuYW1lPSJjb21wYXJlTWltZVR5cGVzIgorIHJldHVybj0iYm9vbGVhbiIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJjb25jcmV0ZVR5cGUiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImRlc2lyZWRUeXBlIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImRlc2NyaWJlQ29udGVudHMiCisgcmV0dXJuPSJpbnQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZmlsdGVyTWltZVR5cGVzIgorIHJldHVybj0iamF2YS5sYW5nLlN0cmluZ1tdIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJtaW1lVHlwZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRMYWJlbCIKKyByZXR1cm49ImphdmEubGFuZy5DaGFyU2VxdWVuY2UiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0TWltZVR5cGUiCisgcmV0dXJuPSJqYXZhLmxhbmcuU3RyaW5nIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJpbmRleCIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldE1pbWVUeXBlQ291bnQiCisgcmV0dXJuPSJpbnQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iaGFzTWltZVR5cGUiCisgcmV0dXJuPSJib29sZWFuIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJtaW1lVHlwZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJ3cml0ZVRvUGFyY2VsIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iZGVzdCIgdHlwZT0iYW5kcm9pZC5vcy5QYXJjZWwiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImZsYWdzIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxmaWVsZCBuYW1lPSJDUkVBVE9SIgorIHR5cGU9ImFuZHJvaWQub3MuUGFyY2VsYWJsZS5DcmVhdG9yIgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9Ik1JTUVUWVBFX1RFWFRfSU5URU5UIgorIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IiZxdW90O3RleHQvdm5kLmFuZHJvaWQuaW50ZW50JnF1b3Q7IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9Ik1JTUVUWVBFX1RFWFRfUExBSU4iCisgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iJnF1b3Q7dGV4dC9wbGFpbiZxdW90OyIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJNSU1FVFlQRV9URVhUX1VSSUxJU1QiCisgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iJnF1b3Q7dGV4dC91cmktbGlzdCZxdW90OyIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzwvY2xhc3M+Cis8Y2xhc3MgbmFtZT0iQ2xpcGJvYXJkTWFuYWdlciIKKyBleHRlbmRzPSJhbmRyb2lkLnRleHQuQ2xpcGJvYXJkTWFuYWdlciIKKyBhYnN0cmFjdD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPG1ldGhvZCBuYW1lPSJhZGRQcmltYXJ5Q2xpcENoYW5nZWRMaXN0ZW5lciIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9IndoYXQiIHR5cGU9ImFuZHJvaWQuY29udGVudC5DbGlwYm9hcmRNYW5hZ2VyLk9uUHJpbWFyeUNsaXBDaGFuZ2VkTGlzdGVuZXIiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0UHJpbWFyeUNsaXAiCisgcmV0dXJuPSJhbmRyb2lkLmNvbnRlbnQuQ2xpcERhdGEiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0UHJpbWFyeUNsaXBEZXNjcmlwdGlvbiIKKyByZXR1cm49ImFuZHJvaWQuY29udGVudC5DbGlwRGVzY3JpcHRpb24iCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0VGV4dCIKKyByZXR1cm49ImphdmEubGFuZy5DaGFyU2VxdWVuY2UiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJoYXNQcmltYXJ5Q2xpcCIKKyByZXR1cm49ImJvb2xlYW4iCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iaGFzVGV4dCIKKyByZXR1cm49ImJvb2xlYW4iCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJyZW1vdmVQcmltYXJ5Q2xpcENoYW5nZWRMaXN0ZW5lciIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9IndoYXQiIHR5cGU9ImFuZHJvaWQuY29udGVudC5DbGlwYm9hcmRNYW5hZ2VyLk9uUHJpbWFyeUNsaXBDaGFuZ2VkTGlzdGVuZXIiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0UHJpbWFyeUNsaXAiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJjbGlwIiB0eXBlPSJhbmRyb2lkLmNvbnRlbnQuQ2xpcERhdGEiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0VGV4dCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0idGV4dCIgdHlwZT0iamF2YS5sYW5nLkNoYXJTZXF1ZW5jZSI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPC9jbGFzcz4KKzxpbnRlcmZhY2UgbmFtZT0iQ2xpcGJvYXJkTWFuYWdlci5PblByaW1hcnlDbGlwQ2hhbmdlZExpc3RlbmVyIgorIGFic3RyYWN0PSJ0cnVlIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPG1ldGhvZCBuYW1lPSJvblByaW1hcnlDbGlwQ2hhbmdlZCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPC9pbnRlcmZhY2U+CiA8aW50ZXJmYWNlIG5hbWU9IkNvbXBvbmVudENhbGxiYWNrcyIKICBhYnN0cmFjdD0idHJ1ZSIKICBzdGF0aWM9ImZhbHNlIgpAQCAtMzQ1ODUsNiArNDA5NjksMjEgQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0U3RyZWFtVHlwZXMiCisgcmV0dXJuPSJqYXZhLmxhbmcuU3RyaW5nW10iCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InVyaSIgdHlwZT0iYW5kcm9pZC5uZXQuVXJpIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJtaW1lVHlwZUZpbHRlciIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJnZXRUeXBlIgogIHJldHVybj0iamF2YS5sYW5nLlN0cmluZyIKICBhYnN0cmFjdD0idHJ1ZSIKQEAgLTM0NzIxLDYgKzQxMTIwLDQ4IEBACiA8ZXhjZXB0aW9uIG5hbWU9IkZpbGVOb3RGb3VuZEV4Y2VwdGlvbiIgdHlwZT0iamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb24iPgogPC9leGNlcHRpb24+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ib3BlblBpcGVIZWxwZXIiCisgcmV0dXJuPSJhbmRyb2lkLm9zLlBhcmNlbEZpbGVEZXNjcmlwdG9yIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJ1cmkiIHR5cGU9ImFuZHJvaWQubmV0LlVyaSI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ibWltZVR5cGUiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9Im9wdHMiIHR5cGU9ImFuZHJvaWQub3MuQnVuZGxlIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJhcmdzIiB0eXBlPSJUIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJmdW5jIiB0eXBlPSJhbmRyb2lkLmNvbnRlbnQuQ29udGVudFByb3ZpZGVyLlBpcGVEYXRhV3JpdGVyJmx0O1QmZ3Q7Ij4KKzwvcGFyYW1ldGVyPgorPGV4Y2VwdGlvbiBuYW1lPSJGaWxlTm90Rm91bmRFeGNlcHRpb24iIHR5cGU9ImphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uIj4KKzwvZXhjZXB0aW9uPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9Im9wZW5UeXBlZEFzc2V0RmlsZSIKKyByZXR1cm49ImFuZHJvaWQuY29udGVudC5yZXMuQXNzZXRGaWxlRGVzY3JpcHRvciIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0idXJpIiB0eXBlPSJhbmRyb2lkLm5ldC5VcmkiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9Im1pbWVUeXBlRmlsdGVyIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJvcHRzIiB0eXBlPSJhbmRyb2lkLm9zLkJ1bmRsZSI+Cis8L3BhcmFtZXRlcj4KKzxleGNlcHRpb24gbmFtZT0iRmlsZU5vdEZvdW5kRXhjZXB0aW9uIiB0eXBlPSJqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbiI+Cis8L2V4Y2VwdGlvbj4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJxdWVyeSIKICByZXR1cm49ImFuZHJvaWQuZGF0YWJhc2UuQ3Vyc29yIgogIGFic3RyYWN0PSJ0cnVlIgpAQCAtMzQ3ODEsNiArNDEyMjIsMTcgQEAKIDxwYXJhbWV0ZXIgbmFtZT0icGVybWlzc2lvbiIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzaHV0ZG93biIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0idXBkYXRlIgogIHJldHVybj0iaW50IgogIGFic3RyYWN0PSJ0cnVlIgpAQCAtMzQ4MDEsNiArNDEyNTMsMzUgQEAKIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+CiA8L2NsYXNzPgorPGludGVyZmFjZSBuYW1lPSJDb250ZW50UHJvdmlkZXIuUGlwZURhdGFXcml0ZXIiCisgYWJzdHJhY3Q9InRydWUiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8bWV0aG9kIG5hbWU9IndyaXRlRGF0YVRvUGlwZSIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0ib3V0cHV0IiB0eXBlPSJhbmRyb2lkLm9zLlBhcmNlbEZpbGVEZXNjcmlwdG9yIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJ1cmkiIHR5cGU9ImFuZHJvaWQubmV0LlVyaSI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ibWltZVR5cGUiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9Im9wdHMiIHR5cGU9ImFuZHJvaWQub3MuQnVuZGxlIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJhcmdzIiB0eXBlPSJUIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8L2ludGVyZmFjZT4KIDxjbGFzcyBuYW1lPSJDb250ZW50UHJvdmlkZXJDbGllbnQiCiAgZXh0ZW5kcz0iamF2YS5sYW5nLk9iamVjdCIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0zNDg3Myw2ICs0MTM1NCwyMyBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRTdHJlYW1UeXBlcyIKKyByZXR1cm49ImphdmEubGFuZy5TdHJpbmdbXSIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0idXJsIiB0eXBlPSJhbmRyb2lkLm5ldC5VcmkiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9Im1pbWVUeXBlRmlsdGVyIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPGV4Y2VwdGlvbiBuYW1lPSJSZW1vdGVFeGNlcHRpb24iIHR5cGU9ImFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uIj4KKzwvZXhjZXB0aW9uPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9ImdldFR5cGUiCiAgcmV0dXJuPSJqYXZhLmxhbmcuU3RyaW5nIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTM0OTQzLDYgKzQxNDQxLDI3IEBACiA8ZXhjZXB0aW9uIG5hbWU9IlJlbW90ZUV4Y2VwdGlvbiIgdHlwZT0iYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb24iPgogPC9leGNlcHRpb24+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ib3BlblR5cGVkQXNzZXRGaWxlRGVzY3JpcHRvciIKKyByZXR1cm49ImFuZHJvaWQuY29udGVudC5yZXMuQXNzZXRGaWxlRGVzY3JpcHRvciIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJ1cmkiIHR5cGU9ImFuZHJvaWQubmV0LlVyaSI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ibWltZVR5cGUiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9Im9wdHMiIHR5cGU9ImFuZHJvaWQub3MuQnVuZGxlIj4KKzwvcGFyYW1ldGVyPgorPGV4Y2VwdGlvbiBuYW1lPSJGaWxlTm90Rm91bmRFeGNlcHRpb24iIHR5cGU9ImphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uIj4KKzwvZXhjZXB0aW9uPgorPGV4Y2VwdGlvbiBuYW1lPSJSZW1vdGVFeGNlcHRpb24iIHR5cGU9ImFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uIj4KKzwvZXhjZXB0aW9uPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9InF1ZXJ5IgogIHJldHVybj0iYW5kcm9pZC5kYXRhYmFzZS5DdXJzb3IiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMzU3MTMsNiArNDIyMzIsMjEgQEAKIDxwYXJhbWV0ZXIgbmFtZT0iYXV0aG9yaXR5IiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldFN0cmVhbVR5cGVzIgorIHJldHVybj0iamF2YS5sYW5nLlN0cmluZ1tdIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJ1cmwiIHR5cGU9ImFuZHJvaWQubmV0LlVyaSI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ibWltZVR5cGVGaWx0ZXIiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0iZ2V0U3luY0FkYXB0ZXJUeXBlcyIKICByZXR1cm49ImFuZHJvaWQuY29udGVudC5TeW5jQWRhcHRlclR5cGVbXSIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0zNTkxMCw2ICs0MjQ0NCwyNSBAQAogPGV4Y2VwdGlvbiBuYW1lPSJGaWxlTm90Rm91bmRFeGNlcHRpb24iIHR5cGU9ImphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uIj4KIDwvZXhjZXB0aW9uPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9Im9wZW5UeXBlZEFzc2V0RmlsZURlc2NyaXB0b3IiCisgcmV0dXJuPSJhbmRyb2lkLmNvbnRlbnQucmVzLkFzc2V0RmlsZURlc2NyaXB0b3IiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0idXJpIiB0eXBlPSJhbmRyb2lkLm5ldC5VcmkiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9Im1pbWVUeXBlIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJvcHRzIiB0eXBlPSJhbmRyb2lkLm9zLkJ1bmRsZSI+Cis8L3BhcmFtZXRlcj4KKzxleGNlcHRpb24gbmFtZT0iRmlsZU5vdEZvdW5kRXhjZXB0aW9uIiB0eXBlPSJqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbiI+Cis8L2V4Y2VwdGlvbj4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJxdWVyeSIKICByZXR1cm49ImFuZHJvaWQuZGF0YWJhc2UuQ3Vyc29yIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTM2NTc1LDYgKzQzMTI4LDE3IEBACiA8cGFyYW1ldGVyIG5hbWU9ImtleSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJrZXlTZXQiCisgcmV0dXJuPSJqYXZhLnV0aWwuU2V0Jmx0O2phdmEubGFuZy5TdHJpbmcmZ3Q7IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9InB1dCIKICByZXR1cm49InZvaWQiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMzc2MjUsNiArNDQxODksMjUgQEAKIDxwYXJhbWV0ZXIgbmFtZT0iZmFjdG9yeSIgdHlwZT0iYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGUuU1FMaXRlRGF0YWJhc2UuQ3Vyc29yRmFjdG9yeSI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJvcGVuT3JDcmVhdGVEYXRhYmFzZSIKKyByZXR1cm49ImFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlLlNRTGl0ZURhdGFiYXNlIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9Im5hbWUiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9Im1vZGUiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iZmFjdG9yeSIgdHlwZT0iYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGUuU1FMaXRlRGF0YWJhc2UuQ3Vyc29yRmFjdG9yeSI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iZXJyb3JIYW5kbGVyIiB0eXBlPSJhbmRyb2lkLmRhdGFiYXNlLkRhdGFiYXNlRXJyb3JIYW5kbGVyIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9InBlZWtXYWxscGFwZXIiCiAgcmV0dXJuPSJhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlIgogIGFic3RyYWN0PSJ0cnVlIgpAQCAtMzkwNjMsNiArNDU2NDYsMjUgQEAKIDxwYXJhbWV0ZXIgbmFtZT0iZmFjdG9yeSIgdHlwZT0iYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGUuU1FMaXRlRGF0YWJhc2UuQ3Vyc29yRmFjdG9yeSI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJvcGVuT3JDcmVhdGVEYXRhYmFzZSIKKyByZXR1cm49ImFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlLlNRTGl0ZURhdGFiYXNlIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJuYW1lIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJtb2RlIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImZhY3RvcnkiIHR5cGU9ImFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlLlNRTGl0ZURhdGFiYXNlLkN1cnNvckZhY3RvcnkiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImVycm9ySGFuZGxlciIgdHlwZT0iYW5kcm9pZC5kYXRhYmFzZS5EYXRhYmFzZUVycm9ySGFuZGxlciI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJwZWVrV2FsbHBhcGVyIgogIHJldHVybj0iYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZSIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0zOTM4OSw2ICs0NTk5MSwyMjUgQEAKIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+CiA8L2NsYXNzPgorPGNsYXNzIG5hbWU9IkN1cnNvckxvYWRlciIKKyBleHRlbmRzPSJhbmRyb2lkLmNvbnRlbnQuQXN5bmNUYXNrTG9hZGVyIgorIGFic3RyYWN0PSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8Y29uc3RydWN0b3IgbmFtZT0iQ3Vyc29yTG9hZGVyIgorIHR5cGU9ImFuZHJvaWQuY29udGVudC5DdXJzb3JMb2FkZXIiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJjb250ZXh0IiB0eXBlPSJhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0idXJpIiB0eXBlPSJhbmRyb2lkLm5ldC5VcmkiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InByb2plY3Rpb24iIHR5cGU9ImphdmEubGFuZy5TdHJpbmdbXSI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ic2VsZWN0aW9uIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJzZWxlY3Rpb25BcmdzIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nW10iPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InNvcnRPcmRlciIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzwvY29uc3RydWN0b3I+Cis8bWV0aG9kIG5hbWU9ImRlbGl2ZXJSZXN1bHQiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJjdXJzb3IiIHR5cGU9ImFuZHJvaWQuZGF0YWJhc2UuQ3Vyc29yIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImRlc3Ryb3kiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldFByb2plY3Rpb24iCisgcmV0dXJuPSJqYXZhLmxhbmcuU3RyaW5nW10iCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0U2VsZWN0aW9uIgorIHJldHVybj0iamF2YS5sYW5nLlN0cmluZyIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRTZWxlY3Rpb25BcmdzIgorIHJldHVybj0iamF2YS5sYW5nLlN0cmluZ1tdIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldFNvcnRPcmRlciIKKyByZXR1cm49ImphdmEubGFuZy5TdHJpbmciCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0VXJpIgorIHJldHVybj0iYW5kcm9pZC5uZXQuVXJpIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImxvYWRJbkJhY2tncm91bmQiCisgcmV0dXJuPSJhbmRyb2lkLmRhdGFiYXNlLkN1cnNvciIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJvbkNhbmNlbGxlZCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImN1cnNvciIgdHlwZT0iYW5kcm9pZC5kYXRhYmFzZS5DdXJzb3IiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0UHJvamVjdGlvbiIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InByb2plY3Rpb24iIHR5cGU9ImphdmEubGFuZy5TdHJpbmdbXSI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRTZWxlY3Rpb24iCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJzZWxlY3Rpb24iIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0U2VsZWN0aW9uQXJncyIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InNlbGVjdGlvbkFyZ3MiIHR5cGU9ImphdmEubGFuZy5TdHJpbmdbXSI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRTb3J0T3JkZXIiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJzb3J0T3JkZXIiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0VXJpIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0idXJpIiB0eXBlPSJhbmRyb2lkLm5ldC5VcmkiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic3RhcnRMb2FkaW5nIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzdG9wTG9hZGluZyIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzwvY2xhc3M+CiA8aW50ZXJmYWNlIG5hbWU9IkRpYWxvZ0ludGVyZmFjZSIKICBhYnN0cmFjdD0idHJ1ZSIKICBzdGF0aWM9ImZhbHNlIgpAQCAtMzk3NTAsNiArNDY1NzEsOTMgQEAKID4KIDwvbWV0aG9kPgogPC9pbnRlcmZhY2U+Cis8aW50ZXJmYWNlIG5hbWU9IklPblByaW1hcnlDbGlwQ2hhbmdlZExpc3RlbmVyIgorIGFic3RyYWN0PSJ0cnVlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxpbXBsZW1lbnRzIG5hbWU9ImFuZHJvaWQub3MuSUludGVyZmFjZSI+Cis8L2ltcGxlbWVudHM+Cis8bWV0aG9kIG5hbWU9ImRpc3BhdGNoUHJpbWFyeUNsaXBDaGFuZ2VkIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPGV4Y2VwdGlvbiBuYW1lPSJSZW1vdGVFeGNlcHRpb24iIHR5cGU9ImFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uIj4KKzwvZXhjZXB0aW9uPgorPC9tZXRob2Q+Cis8L2ludGVyZmFjZT4KKzxjbGFzcyBuYW1lPSJJT25QcmltYXJ5Q2xpcENoYW5nZWRMaXN0ZW5lci5TdHViIgorIGV4dGVuZHM9ImFuZHJvaWQub3MuQmluZGVyIgorIGFic3RyYWN0PSJ0cnVlIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPGltcGxlbWVudHMgbmFtZT0iYW5kcm9pZC5jb250ZW50LklPblByaW1hcnlDbGlwQ2hhbmdlZExpc3RlbmVyIj4KKzwvaW1wbGVtZW50cz4KKzxjb25zdHJ1Y3RvciBuYW1lPSJJT25QcmltYXJ5Q2xpcENoYW5nZWRMaXN0ZW5lci5TdHViIgorIHR5cGU9ImFuZHJvaWQuY29udGVudC5JT25QcmltYXJ5Q2xpcENoYW5nZWRMaXN0ZW5lci5TdHViIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvY29uc3RydWN0b3I+Cis8bWV0aG9kIG5hbWU9ImFzQmluZGVyIgorIHJldHVybj0iYW5kcm9pZC5vcy5JQmluZGVyIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImFzSW50ZXJmYWNlIgorIHJldHVybj0iYW5kcm9pZC5jb250ZW50LklPblByaW1hcnlDbGlwQ2hhbmdlZExpc3RlbmVyIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9Im9iaiIgdHlwZT0iYW5kcm9pZC5vcy5JQmluZGVyIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9Im9uVHJhbnNhY3QiCisgcmV0dXJuPSJib29sZWFuIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJjb2RlIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImRhdGEiIHR5cGU9ImFuZHJvaWQub3MuUGFyY2VsIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJyZXBseSIgdHlwZT0iYW5kcm9pZC5vcy5QYXJjZWwiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImZsYWdzIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8ZXhjZXB0aW9uIG5hbWU9IlJlbW90ZUV4Y2VwdGlvbiIgdHlwZT0iYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb24iPgorPC9leGNlcHRpb24+Cis8L21ldGhvZD4KKzwvY2xhc3M+CiA8Y2xhc3MgbmFtZT0iSW50ZW50IgogIGV4dGVuZHM9ImphdmEubGFuZy5PYmplY3QiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtNDE5NjgsNiArNDg4NzYsMTcgQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IkFDVElPTl9QQVNURSIKKyB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSImcXVvdDthbmRyb2lkLmludGVudC5hY3Rpb24uUEFTVEUmcXVvdDsiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+CiA8ZmllbGQgbmFtZT0iQUNUSU9OX1BJQ0siCiAgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKICB0cmFuc2llbnQ9ImZhbHNlIgpAQCAtNDIzMDksNiArNDkyMjgsMTcgQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IkNBVEVHT1JZX0FQUF9NQVJLRVQiCisgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iJnF1b3Q7YW5kcm9pZC5pbnRlbnQuY2F0ZWdvcnkuQVBQX01BUktFVCZxdW90OyIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KIDxmaWVsZCBuYW1lPSJDQVRFR09SWV9CUk9XU0FCTEUiCiAgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKICB0cmFuc2llbnQ9ImZhbHNlIgpAQCAtNDQzNjYsNiArNTEyOTYsMTgzIEBACiA8L3BhcmFtZXRlcj4KIDwvY29uc3RydWN0b3I+CiA8L2NsYXNzPgorPGNsYXNzIG5hbWU9IkxvYWRlciIKKyBleHRlbmRzPSJqYXZhLmxhbmcuT2JqZWN0IgorIGFic3RyYWN0PSJ0cnVlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxjb25zdHJ1Y3RvciBuYW1lPSJMb2FkZXIiCisgdHlwZT0iYW5kcm9pZC5jb250ZW50LkxvYWRlciIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImNvbnRleHQiIHR5cGU9ImFuZHJvaWQuY29udGVudC5Db250ZXh0Ij4KKzwvcGFyYW1ldGVyPgorPC9jb25zdHJ1Y3Rvcj4KKzxtZXRob2QgbmFtZT0iZGVsaXZlclJlc3VsdCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImRhdGEiIHR5cGU9IkQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZGVzdHJveSIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJmb3JjZUxvYWQiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0Q29udGV4dCIKKyByZXR1cm49ImFuZHJvaWQuY29udGVudC5Db250ZXh0IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldElkIgorIHJldHVybj0iaW50IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9Im9uQ29udGVudENoYW5nZWQiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InJlZ2lzdGVyTGlzdGVuZXIiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJpZCIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJsaXN0ZW5lciIgdHlwZT0iYW5kcm9pZC5jb250ZW50LkxvYWRlci5PbkxvYWRDb21wbGV0ZUxpc3RlbmVyJmx0O0QmZ3Q7Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InN0YXJ0TG9hZGluZyIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzdG9wTG9hZGluZyIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJ1bnJlZ2lzdGVyTGlzdGVuZXIiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJsaXN0ZW5lciIgdHlwZT0iYW5kcm9pZC5jb250ZW50LkxvYWRlci5PbkxvYWRDb21wbGV0ZUxpc3RlbmVyJmx0O0QmZ3Q7Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8L2NsYXNzPgorPGNsYXNzIG5hbWU9IkxvYWRlci5Gb3JjZUxvYWRDb250ZW50T2JzZXJ2ZXIiCisgZXh0ZW5kcz0iYW5kcm9pZC5kYXRhYmFzZS5Db250ZW50T2JzZXJ2ZXIiCisgYWJzdHJhY3Q9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPGNvbnN0cnVjdG9yIG5hbWU9IkxvYWRlci5Gb3JjZUxvYWRDb250ZW50T2JzZXJ2ZXIiCisgdHlwZT0iYW5kcm9pZC5jb250ZW50LkxvYWRlci5Gb3JjZUxvYWRDb250ZW50T2JzZXJ2ZXIiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9jb25zdHJ1Y3Rvcj4KKzwvY2xhc3M+Cis8aW50ZXJmYWNlIG5hbWU9IkxvYWRlci5PbkxvYWRDb21wbGV0ZUxpc3RlbmVyIgorIGFic3RyYWN0PSJ0cnVlIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPG1ldGhvZCBuYW1lPSJvbkxvYWRDb21wbGV0ZSIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0ibG9hZGVyIiB0eXBlPSJhbmRyb2lkLmNvbnRlbnQuTG9hZGVyJmx0O0QmZ3Q7Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJkYXRhIiB0eXBlPSJEIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8L2ludGVyZmFjZT4KIDxjbGFzcyBuYW1lPSJNdXRhYmxlQ29udGV4dFdyYXBwZXIiCiAgZXh0ZW5kcz0iYW5kcm9pZC5jb250ZW50LkNvbnRleHRXcmFwcGVyIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTQ0OTA1LDYgKzUyMDEyLDIxIEBACiA8cGFyYW1ldGVyIG5hbWU9ImRlZlZhbHVlIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldFN0cmluZ1NldCIKKyByZXR1cm49ImphdmEudXRpbC5TZXQmbHQ7amF2YS5sYW5nLlN0cmluZyZndDsiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0ia2V5IiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJkZWZWYWx1ZXMiIHR5cGU9ImphdmEudXRpbC5TZXQmbHQ7amF2YS5sYW5nLlN0cmluZyZndDsiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0icmVnaXN0ZXJPblNoYXJlZFByZWZlcmVuY2VDaGFuZ2VMaXN0ZW5lciIKICByZXR1cm49InZvaWQiCiAgYWJzdHJhY3Q9InRydWUiCkBAIC00NTA0Nyw2ICs1MjE2OSwyMSBAQAogPHBhcmFtZXRlciBuYW1lPSJ2YWx1ZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJwdXRTdHJpbmdTZXQiCisgcmV0dXJuPSJhbmRyb2lkLmNvbnRlbnQuU2hhcmVkUHJlZmVyZW5jZXMuRWRpdG9yIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImtleSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0idmFsdWVzIiB0eXBlPSJqYXZhLnV0aWwuU2V0Jmx0O2phdmEubGFuZy5TdHJpbmcmZ3Q7Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9InJlbW92ZSIKICByZXR1cm49ImFuZHJvaWQuY29udGVudC5TaGFyZWRQcmVmZXJlbmNlcy5FZGl0b3IiCiAgYWJzdHJhY3Q9InRydWUiCkBAIC00NTc2NCw2ICs1MjkwMSwxNDUgQEAKID4KIDwvZmllbGQ+CiA8L2NsYXNzPgorPGNsYXNzIG5hbWU9IlhtbERvY3VtZW50UHJvdmlkZXIiCisgZXh0ZW5kcz0iYW5kcm9pZC5jb250ZW50LkNvbnRlbnRQcm92aWRlciIKKyBhYnN0cmFjdD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPGNvbnN0cnVjdG9yIG5hbWU9IlhtbERvY3VtZW50UHJvdmlkZXIiCisgdHlwZT0iYW5kcm9pZC5jb250ZW50LlhtbERvY3VtZW50UHJvdmlkZXIiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9jb25zdHJ1Y3Rvcj4KKzxtZXRob2QgbmFtZT0iZGVsZXRlIgorIHJldHVybj0iaW50IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJ1cmkiIHR5cGU9ImFuZHJvaWQubmV0LlVyaSI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ic2VsZWN0aW9uIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJzZWxlY3Rpb25BcmdzIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nW10iPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0UmVzb3VyY2VYbWxQdWxsUGFyc2VyIgorIHJldHVybj0ib3JnLnhtbHB1bGwudjEuWG1sUHVsbFBhcnNlciIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InByb3RlY3RlZCIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0icmVzb3VyY2VVcmkiIHR5cGU9ImFuZHJvaWQubmV0LlVyaSI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRUeXBlIgorIHJldHVybj0iamF2YS5sYW5nLlN0cmluZyIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0idXJpIiB0eXBlPSJhbmRyb2lkLm5ldC5VcmkiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0VXJpWG1sUHVsbFBhcnNlciIKKyByZXR1cm49Im9yZy54bWxwdWxsLnYxLlhtbFB1bGxQYXJzZXIiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwcm90ZWN0ZWQiCis+Cis8cGFyYW1ldGVyIG5hbWU9InVybCIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJpbnNlcnQiCisgcmV0dXJuPSJhbmRyb2lkLm5ldC5VcmkiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InVyaSIgdHlwZT0iYW5kcm9pZC5uZXQuVXJpIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJ2YWx1ZXMiIHR5cGU9ImFuZHJvaWQuY29udGVudC5Db250ZW50VmFsdWVzIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9Im9uQ3JlYXRlIgorIHJldHVybj0iYm9vbGVhbiIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJxdWVyeSIKKyByZXR1cm49ImFuZHJvaWQuZGF0YWJhc2UuQ3Vyc29yIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJ1cmkiIHR5cGU9ImFuZHJvaWQubmV0LlVyaSI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0icHJvamVjdGlvbiIgdHlwZT0iamF2YS5sYW5nLlN0cmluZ1tdIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJzZWxlY3Rpb24iIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InNlbGVjdGlvbkFyZ3MiIHR5cGU9ImphdmEubGFuZy5TdHJpbmdbXSI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ic29ydE9yZGVyIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InVwZGF0ZSIKKyByZXR1cm49ImludCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0idXJpIiB0eXBlPSJhbmRyb2lkLm5ldC5VcmkiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InZhbHVlcyIgdHlwZT0iYW5kcm9pZC5jb250ZW50LkNvbnRlbnRWYWx1ZXMiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InNlbGVjdGlvbiIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ic2VsZWN0aW9uQXJncyIgdHlwZT0iamF2YS5sYW5nLlN0cmluZ1tdIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8L2NsYXNzPgogPC9wYWNrYWdlPgogPHBhY2thZ2UgbmFtZT0iYW5kcm9pZC5jb250ZW50LnBtIgogPgpAQCAtNDYwMjksNiArNTMzMDUsMjggQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IkZMQUdfSEFSRFdBUkVfQUNDRUxFUkFURUQiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIxMDI0IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IkZMQUdfSU1NRVJTSVZFIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iNTEyIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgogPGZpZWxkIG5hbWU9IkZMQUdfTVVMVElQUk9DRVNTIgogIHR5cGU9ImludCIKICB0cmFuc2llbnQ9ImZhbHNlIgpAQCAtNDY1MTYsNiArNTM4MTQsMTcgQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IkZMQUdfU1VQUE9SVFNfWExBUkdFX1NDUkVFTlMiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSI1MjQyODgiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+CiA8ZmllbGQgbmFtZT0iRkxBR19TWVNURU0iCiAgdHlwZT0iaW50IgogIHRyYW5zaWVudD0iZmFsc2UiCkBAIC00OTA1NCw2ICs1NjM2MywxNyBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iRkVBVFVSRV9TRU5TT1JfQkFST01FVEVSIgorIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IiZxdW90O2FuZHJvaWQuaGFyZHdhcmUuc2Vuc29yLmJhcm9tZXRlciZxdW90OyIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KIDxmaWVsZCBuYW1lPSJGRUFUVVJFX1NFTlNPUl9DT01QQVNTIgogIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCiAgdHJhbnNpZW50PSJmYWxzZSIKQEAgLTQ5MDY1LDYgKzU2Mzg1LDE3IEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJGRUFUVVJFX1NFTlNPUl9HWVJPU0NPUEUiCisgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iJnF1b3Q7YW5kcm9pZC5oYXJkd2FyZS5zZW5zb3IuZ3lyb3Njb3BlJnF1b3Q7IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgogPGZpZWxkIG5hbWU9IkZFQVRVUkVfU0VOU09SX0xJR0hUIgogIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCiAgdHJhbnNpZW50PSJmYWxzZSIKQEAgLTUxNzE4LDYgKzU5MDQ5LDE3IEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJTQ1JFRU5MQVlPVVRfU0laRV9YTEFSR0UiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSI0IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgogPGZpZWxkIG5hbWU9IlRPVUNIU0NSRUVOX0ZJTkdFUiIKICB0eXBlPSJpbnQiCiAgdHJhbnNpZW50PSJmYWxzZSIKQEAgLTUzNDc2LDYgKzYwODE4LDE3IEBACiA8cGFyYW1ldGVyIG5hbWU9ImNvbHVtbiIgdHlwZT0iaW50Ij4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldE5vdGlmaWNhdGlvblVyaSIKKyByZXR1cm49ImFuZHJvaWQubmV0LlVyaSIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJnZXRQb3NpdGlvbiIKICByZXR1cm49ImludCIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC01MzUxMyw2ICs2MDg2NiwxOSBAQAogPHBhcmFtZXRlciBuYW1lPSJjb2x1bW4iIHR5cGU9ImludCI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRUeXBlIgorIHJldHVybj0iaW50IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJjb2x1bW4iIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJnZXRVcGRhdGVkRmllbGQiCiAgcmV0dXJuPSJqYXZhLmxhbmcuT2JqZWN0IgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTUzNTIwLDcgKzYwODg2LDcgQEAKICBzeW5jaHJvbml6ZWQ9ImZhbHNlIgogIHN0YXRpYz0iZmFsc2UiCiAgZmluYWw9ImZhbHNlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIGRlcHJlY2F0ZWQ9ImRlcHJlY2F0ZWQiCiAgdmlzaWJpbGl0eT0icHJvdGVjdGVkIgogPgogPHBhcmFtZXRlciBuYW1lPSJjb2x1bW5JbmRleCIgdHlwZT0iaW50Ij4KQEAgLTUzNTg4LDcgKzYwOTU0LDcgQEAKICBzeW5jaHJvbml6ZWQ9ImZhbHNlIgogIHN0YXRpYz0iZmFsc2UiCiAgZmluYWw9ImZhbHNlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIGRlcHJlY2F0ZWQ9ImRlcHJlY2F0ZWQiCiAgdmlzaWJpbGl0eT0icHJvdGVjdGVkIgogPgogPHBhcmFtZXRlciBuYW1lPSJjb2x1bW5JbmRleCIgdHlwZT0iaW50Ij4KQEAgLTUzODc0LDcgKzYxMjQwLDcgQEAKICB2b2xhdGlsZT0iZmFsc2UiCiAgc3RhdGljPSJmYWxzZSIKICBmaW5hbD0iZmFsc2UiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgZGVwcmVjYXRlZD0iZGVwcmVjYXRlZCIKICB2aXNpYmlsaXR5PSJwcm90ZWN0ZWQiCiA+CiA8L2ZpZWxkPgpAQCAtNTQwMTAsNyArNjEzNzYsNyBAQAogIHN5bmNocm9uaXplZD0iZmFsc2UiCiAgc3RhdGljPSJmYWxzZSIKICBmaW5hbD0iZmFsc2UiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgZGVwcmVjYXRlZD0iZGVwcmVjYXRlZCIKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8cGFyYW1ldGVyIG5hbWU9ImNvbHVtbkluZGV4IiB0eXBlPSJpbnQiPgpAQCAtNTQwMjMsNyArNjEzODksNyBAQAogIHN5bmNocm9uaXplZD0iZmFsc2UiCiAgc3RhdGljPSJmYWxzZSIKICBmaW5hbD0iZmFsc2UiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgZGVwcmVjYXRlZD0iZGVwcmVjYXRlZCIKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8cGFyYW1ldGVyIG5hbWU9ImNvbHVtbkluZGV4IiB0eXBlPSJpbnQiPgpAQCAtNTQwMzYsNyArNjE0MDIsNyBAQAogIHN5bmNocm9uaXplZD0iZmFsc2UiCiAgc3RhdGljPSJmYWxzZSIKICBmaW5hbD0iZmFsc2UiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgZGVwcmVjYXRlZD0iZGVwcmVjYXRlZCIKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8cGFyYW1ldGVyIG5hbWU9ImNvbHVtbkluZGV4IiB0eXBlPSJpbnQiPgpAQCAtNTQwNjIsNyArNjE0MjgsNyBAQAogIHN5bmNocm9uaXplZD0iZmFsc2UiCiAgc3RhdGljPSJmYWxzZSIKICBmaW5hbD0iZmFsc2UiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgZGVwcmVjYXRlZD0iZGVwcmVjYXRlZCIKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8cGFyYW1ldGVyIG5hbWU9ImNvbHVtbkluZGV4IiB0eXBlPSJpbnQiPgpAQCAtNTQ1MzYsNiArNjE5MDIsMTkgQEAKIDxwYXJhbWV0ZXIgbmFtZT0iY29sdW1uSW5kZXgiIHR5cGU9ImludCI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRUeXBlIgorIHJldHVybj0iaW50IgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImNvbHVtbkluZGV4IiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0iZ2V0V2FudHNBbGxPbk1vdmVDYWxscyIKICByZXR1cm49ImJvb2xlYW4iCiAgYWJzdHJhY3Q9InRydWUiCkBAIC01NDc3Niw2ICs2MjE1NSw2MSBAQAogPHBhcmFtZXRlciBuYW1lPSJvYnNlcnZlciIgdHlwZT0iYW5kcm9pZC5kYXRhYmFzZS5EYXRhU2V0T2JzZXJ2ZXIiPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KKzxmaWVsZCBuYW1lPSJGSUVMRF9UWVBFX0JMT0IiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSI0IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IkZJRUxEX1RZUEVfRkxPQVQiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIyIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IkZJRUxEX1RZUEVfSU5URUdFUiIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjEiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iRklFTERfVFlQRV9OVUxMIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMCIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJGSUVMRF9UWVBFX1NUUklORyIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjMiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+CiA8L2ludGVyZmFjZT4KIDxjbGFzcyBuYW1lPSJDdXJzb3JJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIgogIGV4dGVuZHM9ImphdmEubGFuZy5JbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIgpAQCAtNTUxMzMsNiArNjI1NjcsMjEgQEAKIDxwYXJhbWV0ZXIgbmFtZT0iY29sIiB0eXBlPSJpbnQiPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0VHlwZSIKKyByZXR1cm49ImludCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0icm93IiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImNvbCIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9ImlzQmxvYiIKICByZXR1cm49ImJvb2xlYW4iCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtNTUxNDAsNyArNjI1ODksNyBAQAogIHN5bmNocm9uaXplZD0iZmFsc2UiCiAgc3RhdGljPSJmYWxzZSIKICBmaW5hbD0iZmFsc2UiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgZGVwcmVjYXRlZD0iZGVwcmVjYXRlZCIKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8cGFyYW1ldGVyIG5hbWU9InJvdyIgdHlwZT0iaW50Ij4KQEAgLTU1MTU1LDcgKzYyNjA0LDcgQEAKICBzeW5jaHJvbml6ZWQ9ImZhbHNlIgogIHN0YXRpYz0iZmFsc2UiCiAgZmluYWw9ImZhbHNlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIGRlcHJlY2F0ZWQ9ImRlcHJlY2F0ZWQiCiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPHBhcmFtZXRlciBuYW1lPSJyb3ciIHR5cGU9ImludCI+CkBAIC01NTE3MCw3ICs2MjYxOSw3IEBACiAgc3luY2hyb25pemVkPSJmYWxzZSIKICBzdGF0aWM9ImZhbHNlIgogIGZpbmFsPSJmYWxzZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyBkZXByZWNhdGVkPSJkZXByZWNhdGVkIgogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDxwYXJhbWV0ZXIgbmFtZT0icm93IiB0eXBlPSJpbnQiPgpAQCAtNTUxODUsNyArNjI2MzQsNyBAQAogIHN5bmNocm9uaXplZD0iZmFsc2UiCiAgc3RhdGljPSJmYWxzZSIKICBmaW5hbD0iZmFsc2UiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgZGVwcmVjYXRlZD0iZGVwcmVjYXRlZCIKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8cGFyYW1ldGVyIG5hbWU9InJvdyIgdHlwZT0iaW50Ij4KQEAgLTU1MjAwLDcgKzYyNjQ5LDcgQEAKICBzeW5jaHJvbml6ZWQ9ImZhbHNlIgogIHN0YXRpYz0iZmFsc2UiCiAgZmluYWw9ImZhbHNlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIGRlcHJlY2F0ZWQ9ImRlcHJlY2F0ZWQiCiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPHBhcmFtZXRlciBuYW1lPSJyb3ciIHR5cGU9ImludCI+CkBAIC01NTYxMSw2ICs2MzA2MCwxOSBAQAogPHBhcmFtZXRlciBuYW1lPSJjb2x1bW5JbmRleCIgdHlwZT0iaW50Ij4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldFR5cGUiCisgcmV0dXJuPSJpbnQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImNvbHVtbkluZGV4IiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0iZ2V0V2FudHNBbGxPbk1vdmVDYWxscyIKICByZXR1cm49ImJvb2xlYW4iCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtNTU2MjIsNiArNjMwODQsMTcgQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0V3JhcHBlZEN1cnNvciIKKyByZXR1cm49ImFuZHJvaWQuZGF0YWJhc2UuQ3Vyc29yIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9ImlzQWZ0ZXJMYXN0IgogIHJldHVybj0iYm9vbGVhbiIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC01NTkzMCw2ICs2MzQwMywyNyBAQAogPgogPC9tZXRob2Q+CiA8L2NsYXNzPgorPGludGVyZmFjZSBuYW1lPSJEYXRhYmFzZUVycm9ySGFuZGxlciIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8bWV0aG9kIG5hbWU9Im9uQ29ycnVwdGlvbiIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iZGJPYmoiIHR5cGU9ImFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlLlNRTGl0ZURhdGFiYXNlIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8L2ludGVyZmFjZT4KIDxjbGFzcyBuYW1lPSJEYXRhYmFzZVV0aWxzIgogIGV4dGVuZHM9ImphdmEubGFuZy5PYmplY3QiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtNTU5NjEsNiArNjM0NTUsMjEgQEAKIDxwYXJhbWV0ZXIgbmFtZT0ic3FsU3RyaW5nIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImFwcGVuZFNlbGVjdGlvbkFyZ3MiCisgcmV0dXJuPSJqYXZhLmxhbmcuU3RyaW5nW10iCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0ib3JpZ2luYWxWYWx1ZXMiIHR5cGU9ImphdmEubGFuZy5TdHJpbmdbXSI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ibmV3VmFsdWVzIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nW10iPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0iYXBwZW5kVmFsdWVUb1NxbCIKICByZXR1cm49InZvaWQiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtNTU5OTMsNiArNjM1MDIsMzggQEAKIDxwYXJhbWV0ZXIgbmFtZT0idmFsdWUiIHR5cGU9ImphdmEubGFuZy5PYmplY3QiPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iYmxvYkZpbGVEZXNjcmlwdG9yRm9yUXVlcnkiCisgcmV0dXJuPSJhbmRyb2lkLm9zLlBhcmNlbEZpbGVEZXNjcmlwdG9yIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImRiIiB0eXBlPSJhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZS5TUUxpdGVEYXRhYmFzZSI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0icXVlcnkiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InNlbGVjdGlvbkFyZ3MiIHR5cGU9ImphdmEubGFuZy5TdHJpbmdbXSI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJibG9iRmlsZURlc2NyaXB0b3JGb3JRdWVyeSIKKyByZXR1cm49ImFuZHJvaWQub3MuUGFyY2VsRmlsZURlc2NyaXB0b3IiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0icHJvZyIgdHlwZT0iYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGUuU1FMaXRlU3RhdGVtZW50Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJzZWxlY3Rpb25BcmdzIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nW10iPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0iY3JlYXRlRGJGcm9tU3FsU3RhdGVtZW50cyIKICByZXR1cm49InZvaWQiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtNTY0MzAsNiArNjM5NzEsMTkgQEAKIDxwYXJhbWV0ZXIgbmFtZT0ibmFtZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRTcWxTdGF0ZW1lbnRUeXBlIgorIHJldHVybj0iaW50IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InNxbCIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJsb25nRm9yUXVlcnkiCiAgcmV0dXJuPSJsb25nIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTU2NjE2LDYgKzY0MTcwLDgzIEBACiA8cGFyYW1ldGVyIG5hbWU9ImUiIHR5cGU9ImphdmEubGFuZy5FeGNlcHRpb24iPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KKzxmaWVsZCBuYW1lPSJTVEFURU1FTlRfQUJPUlQiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSI2IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IlNUQVRFTUVOVF9BVFRBQ0giCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIzIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IlNUQVRFTUVOVF9CRUdJTiIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjQiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iU1RBVEVNRU5UX0NPTU1JVCIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjUiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iU1RBVEVNRU5UX09USEVSIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iNyIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJTVEFURU1FTlRfU0VMRUNUIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJTVEFURU1FTlRfVVBEQVRFIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMiIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KIDwvY2xhc3M+CiA8Y2xhc3MgbmFtZT0iRGF0YWJhc2VVdGlscy5JbnNlcnRIZWxwZXIiCiAgZXh0ZW5kcz0iamF2YS5sYW5nLk9iamVjdCIKQEAgLTU2ODUwLDYgKzY0NDgxLDM4IEBACiA+CiA8L2ZpZWxkPgogPC9jbGFzcz4KKzxjbGFzcyBuYW1lPSJEZWZhdWx0RGF0YWJhc2VFcnJvckhhbmRsZXIiCisgZXh0ZW5kcz0iamF2YS5sYW5nLk9iamVjdCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8aW1wbGVtZW50cyBuYW1lPSJhbmRyb2lkLmRhdGFiYXNlLkRhdGFiYXNlRXJyb3JIYW5kbGVyIj4KKzwvaW1wbGVtZW50cz4KKzxjb25zdHJ1Y3RvciBuYW1lPSJEZWZhdWx0RGF0YWJhc2VFcnJvckhhbmRsZXIiCisgdHlwZT0iYW5kcm9pZC5kYXRhYmFzZS5EZWZhdWx0RGF0YWJhc2VFcnJvckhhbmRsZXIiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9jb25zdHJ1Y3Rvcj4KKzxtZXRob2QgbmFtZT0ib25Db3JydXB0aW9uIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iZGJPYmoiIHR5cGU9ImFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlLlNRTGl0ZURhdGFiYXNlIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8L2NsYXNzPgogPGNsYXNzIG5hbWU9Ik1hdHJpeEN1cnNvciIKICBleHRlbmRzPSJhbmRyb2lkLmRhdGFiYXNlLkFic3RyYWN0Q3Vyc29yIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTU3MzMzLDYgKzY0OTk2LDExNCBAQAogPC9wYXJhbWV0ZXI+CiA8L2NvbnN0cnVjdG9yPgogPC9jbGFzcz4KKzxjbGFzcyBuYW1lPSJTUUxpdGVBY2Nlc3NQZXJtRXhjZXB0aW9uIgorIGV4dGVuZHM9ImFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlLlNRTGl0ZUV4Y2VwdGlvbiIKKyBhYnN0cmFjdD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPGNvbnN0cnVjdG9yIG5hbWU9IlNRTGl0ZUFjY2Vzc1Blcm1FeGNlcHRpb24iCisgdHlwZT0iYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGUuU1FMaXRlQWNjZXNzUGVybUV4Y2VwdGlvbiIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2NvbnN0cnVjdG9yPgorPGNvbnN0cnVjdG9yIG5hbWU9IlNRTGl0ZUFjY2Vzc1Blcm1FeGNlcHRpb24iCisgdHlwZT0iYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGUuU1FMaXRlQWNjZXNzUGVybUV4Y2VwdGlvbiIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImVycm9yIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPC9jb25zdHJ1Y3Rvcj4KKzwvY2xhc3M+Cis8Y2xhc3MgbmFtZT0iU1FMaXRlQmluZE9yQ29sdW1uSW5kZXhPdXRPZlJhbmdlRXhjZXB0aW9uIgorIGV4dGVuZHM9ImFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlLlNRTGl0ZUV4Y2VwdGlvbiIKKyBhYnN0cmFjdD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPGNvbnN0cnVjdG9yIG5hbWU9IlNRTGl0ZUJpbmRPckNvbHVtbkluZGV4T3V0T2ZSYW5nZUV4Y2VwdGlvbiIKKyB0eXBlPSJhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZS5TUUxpdGVCaW5kT3JDb2x1bW5JbmRleE91dE9mUmFuZ2VFeGNlcHRpb24iCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9jb25zdHJ1Y3Rvcj4KKzxjb25zdHJ1Y3RvciBuYW1lPSJTUUxpdGVCaW5kT3JDb2x1bW5JbmRleE91dE9mUmFuZ2VFeGNlcHRpb24iCisgdHlwZT0iYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGUuU1FMaXRlQmluZE9yQ29sdW1uSW5kZXhPdXRPZlJhbmdlRXhjZXB0aW9uIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iZXJyb3IiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8L2NvbnN0cnVjdG9yPgorPC9jbGFzcz4KKzxjbGFzcyBuYW1lPSJTUUxpdGVCbG9iVG9vQmlnRXhjZXB0aW9uIgorIGV4dGVuZHM9ImFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlLlNRTGl0ZUV4Y2VwdGlvbiIKKyBhYnN0cmFjdD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPGNvbnN0cnVjdG9yIG5hbWU9IlNRTGl0ZUJsb2JUb29CaWdFeGNlcHRpb24iCisgdHlwZT0iYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGUuU1FMaXRlQmxvYlRvb0JpZ0V4Y2VwdGlvbiIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2NvbnN0cnVjdG9yPgorPGNvbnN0cnVjdG9yIG5hbWU9IlNRTGl0ZUJsb2JUb29CaWdFeGNlcHRpb24iCisgdHlwZT0iYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGUuU1FMaXRlQmxvYlRvb0JpZ0V4Y2VwdGlvbiIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImVycm9yIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPC9jb25zdHJ1Y3Rvcj4KKzwvY2xhc3M+Cis8Y2xhc3MgbmFtZT0iU1FMaXRlQ2FudE9wZW5EYXRhYmFzZUV4Y2VwdGlvbiIKKyBleHRlbmRzPSJhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZS5TUUxpdGVFeGNlcHRpb24iCisgYWJzdHJhY3Q9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxjb25zdHJ1Y3RvciBuYW1lPSJTUUxpdGVDYW50T3BlbkRhdGFiYXNlRXhjZXB0aW9uIgorIHR5cGU9ImFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlLlNRTGl0ZUNhbnRPcGVuRGF0YWJhc2VFeGNlcHRpb24iCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9jb25zdHJ1Y3Rvcj4KKzxjb25zdHJ1Y3RvciBuYW1lPSJTUUxpdGVDYW50T3BlbkRhdGFiYXNlRXhjZXB0aW9uIgorIHR5cGU9ImFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlLlNRTGl0ZUNhbnRPcGVuRGF0YWJhc2VFeGNlcHRpb24iCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJlcnJvciIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzwvY29uc3RydWN0b3I+Cis8L2NsYXNzPgogPGNsYXNzIG5hbWU9IlNRTGl0ZUNsb3NhYmxlIgogIGV4dGVuZHM9ImphdmEubGFuZy5PYmplY3QiCiAgYWJzdHJhY3Q9InRydWUiCkBAIC01NzQ0NCw3ICs2NTIxNSw3IEBACiAgdHlwZT0iYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGUuU1FMaXRlQ3Vyc29yIgogIHN0YXRpYz0iZmFsc2UiCiAgZmluYWw9ImZhbHNlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIGRlcHJlY2F0ZWQ9ImRlcHJlY2F0ZWQiCiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPHBhcmFtZXRlciBuYW1lPSJkYiIgdHlwZT0iYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGUuU1FMaXRlRGF0YWJhc2UiPgpAQCAtNTc0NTYsNiArNjUyMjcsMjAgQEAKIDxwYXJhbWV0ZXIgbmFtZT0icXVlcnkiIHR5cGU9ImFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlLlNRTGl0ZVF1ZXJ5Ij4KIDwvcGFyYW1ldGVyPgogPC9jb25zdHJ1Y3Rvcj4KKzxjb25zdHJ1Y3RvciBuYW1lPSJTUUxpdGVDdXJzb3IiCisgdHlwZT0iYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGUuU1FMaXRlQ3Vyc29yIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iZHJpdmVyIiB0eXBlPSJhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZS5TUUxpdGVDdXJzb3JEcml2ZXIiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImVkaXRUYWJsZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0icXVlcnkiIHR5cGU9ImFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlLlNRTGl0ZVF1ZXJ5Ij4KKzwvcGFyYW1ldGVyPgorPC9jb25zdHJ1Y3Rvcj4KIDxtZXRob2QgbmFtZT0iZ2V0Q29sdW1uTmFtZXMiCiAgcmV0dXJuPSJqYXZhLmxhbmcuU3RyaW5nW10iCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtNTc1OTMsNiArNjUzNzgsMTcgQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iYmVnaW5UcmFuc2FjdGlvbk5vbkV4Y2x1c2l2ZSIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0iYmVnaW5UcmFuc2FjdGlvbldpdGhMaXN0ZW5lciIKICByZXR1cm49InZvaWQiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtNTc2MDYsNiArNjU0MDIsMTkgQEAKIDxwYXJhbWV0ZXIgbmFtZT0idHJhbnNhY3Rpb25MaXN0ZW5lciIgdHlwZT0iYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGUuU1FMaXRlVHJhbnNhY3Rpb25MaXN0ZW5lciI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJiZWdpblRyYW5zYWN0aW9uV2l0aExpc3RlbmVyTm9uRXhjbHVzaXZlIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0idHJhbnNhY3Rpb25MaXN0ZW5lciIgdHlwZT0iYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGUuU1FMaXRlVHJhbnNhY3Rpb25MaXN0ZW5lciI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJjbG9zZSIKICByZXR1cm49InZvaWQiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtNTc2NjIsNiArNjU0NzEsMTcgQEAKIDxwYXJhbWV0ZXIgbmFtZT0id2hlcmVBcmdzIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nW10iPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZW5hYmxlV3JpdGVBaGVhZExvZ2dpbmciCisgcmV0dXJuPSJib29sZWFuIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0idHJ1ZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0iZW5kVHJhbnNhY3Rpb24iCiAgcmV0dXJuPSJ2b2lkIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTU3NzE4LDYgKzY1NTM4LDE3IEBACiA8cGFyYW1ldGVyIG5hbWU9InRhYmxlcyIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRBdHRhY2hlZERicyIKKyByZXR1cm49ImphdmEudXRpbC5BcnJheUxpc3QmbHQ7YW5kcm9pZC51dGlsLlBhaXImbHQ7amF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZyZndDsmZ3Q7IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9ImdldE1heGltdW1TaXplIgogIHJldHVybj0ibG9uZyIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC01Nzc1OCw3ICs2NTU4OSw3IEBACiAgc3luY2hyb25pemVkPSJmYWxzZSIKICBzdGF0aWM9ImZhbHNlIgogIGZpbmFsPSJmYWxzZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyBkZXByZWNhdGVkPSJkZXByZWNhdGVkIgogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvbWV0aG9kPgpAQCAtNTc4MzksNiArNjU2NzAsMTcgQEAKIDxwYXJhbWV0ZXIgbmFtZT0iY29uZmxpY3RBbGdvcml0aG0iIHR5cGU9ImludCI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJpc0RhdGFiYXNlSW50ZWdyaXR5T2siCisgcmV0dXJuPSJib29sZWFuIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9ImlzRGJMb2NrZWRCeUN1cnJlbnRUaHJlYWQiCiAgcmV0dXJuPSJib29sZWFuIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTU3ODkwLDcgKzY1NzMyLDcgQEAKICBzeW5jaHJvbml6ZWQ9ImZhbHNlIgogIHN0YXRpYz0iZmFsc2UiCiAgZmluYWw9ImZhbHNlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIGRlcHJlY2F0ZWQ9ImRlcHJlY2F0ZWQiCiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPHBhcmFtZXRlciBuYW1lPSJ0YWJsZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+CkBAIC01NzkwNSw3ICs2NTc0Nyw3IEBACiAgc3luY2hyb25pemVkPSJmYWxzZSIKICBzdGF0aWM9ImZhbHNlIgogIGZpbmFsPSJmYWxzZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyBkZXByZWNhdGVkPSJkZXByZWNhdGVkIgogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDxwYXJhbWV0ZXIgbmFtZT0idGFibGUiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgpAQCAtNTc5NTYsNiArNjU3OTgsMjUgQEAKIDxwYXJhbWV0ZXIgbmFtZT0iZmxhZ3MiIHR5cGU9ImludCI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJvcGVuRGF0YWJhc2UiCisgcmV0dXJuPSJhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZS5TUUxpdGVEYXRhYmFzZSIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJwYXRoIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJmYWN0b3J5IiB0eXBlPSJhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZS5TUUxpdGVEYXRhYmFzZS5DdXJzb3JGYWN0b3J5Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJmbGFncyIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJlcnJvckhhbmRsZXIiIHR5cGU9ImFuZHJvaWQuZGF0YWJhc2UuRGF0YWJhc2VFcnJvckhhbmRsZXIiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0ib3Blbk9yQ3JlYXRlRGF0YWJhc2UiCiAgcmV0dXJuPSJhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZS5TUUxpdGVEYXRhYmFzZSIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC01Nzk4Niw2ICs2NTg0NywyMyBAQAogPHBhcmFtZXRlciBuYW1lPSJmYWN0b3J5IiB0eXBlPSJhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZS5TUUxpdGVEYXRhYmFzZS5DdXJzb3JGYWN0b3J5Ij4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9Im9wZW5PckNyZWF0ZURhdGFiYXNlIgorIHJldHVybj0iYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGUuU1FMaXRlRGF0YWJhc2UiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0icGF0aCIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iZmFjdG9yeSIgdHlwZT0iYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGUuU1FMaXRlRGF0YWJhc2UuQ3Vyc29yRmFjdG9yeSI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iZXJyb3JIYW5kbGVyIiB0eXBlPSJhbmRyb2lkLmRhdGFiYXNlLkRhdGFiYXNlRXJyb3JIYW5kbGVyIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9InF1ZXJ5IgogIHJldHVybj0iYW5kcm9pZC5kYXRhYmFzZS5DdXJzb3IiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtNTgxNzksNiArNjYwNTcsMTkgQEAKIDxleGNlcHRpb24gbmFtZT0iU1FMRXhjZXB0aW9uIiB0eXBlPSJhbmRyb2lkLmRhdGFiYXNlLlNRTEV4Y2VwdGlvbiI+CiA8L2V4Y2VwdGlvbj4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRDb25uZWN0aW9uUG9vbFNpemUiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJzaXplIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0ic2V0TG9jYWxlIgogIHJldHVybj0idm9pZCIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC01ODIwNSw2ICs2NjA5NiwxOSBAQAogPHBhcmFtZXRlciBuYW1lPSJsb2NraW5nRW5hYmxlZCIgdHlwZT0iYm9vbGVhbiI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRNYXhTcWxDYWNoZVNpemUiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJjYWNoZVNpemUiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJzZXRNYXhpbXVtU2l6ZSIKICByZXR1cm49ImxvbmciCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtNTg0MDcsNiArNjYzMTEsMTcgQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L2ZpZWxkPgorPGZpZWxkIG5hbWU9Ik1BWF9TUUxfQ0FDSEVfU0laRSIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjEwMCIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KIDxmaWVsZCBuYW1lPSJOT19MT0NBTElaRURfQ09MTEFUT1JTIgogIHR5cGU9ImludCIKICB0cmFuc2llbnQ9ImZhbHNlIgpAQCAtNTg1MDYsNiArNjY0MjEsNjAgQEAKIDwvcGFyYW1ldGVyPgogPC9jb25zdHJ1Y3Rvcj4KIDwvY2xhc3M+Cis8Y2xhc3MgbmFtZT0iU1FMaXRlRGF0YWJhc2VMb2NrZWRFeGNlcHRpb24iCisgZXh0ZW5kcz0iYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGUuU1FMaXRlRXhjZXB0aW9uIgorIGFic3RyYWN0PSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8Y29uc3RydWN0b3IgbmFtZT0iU1FMaXRlRGF0YWJhc2VMb2NrZWRFeGNlcHRpb24iCisgdHlwZT0iYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGUuU1FMaXRlRGF0YWJhc2VMb2NrZWRFeGNlcHRpb24iCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9jb25zdHJ1Y3Rvcj4KKzxjb25zdHJ1Y3RvciBuYW1lPSJTUUxpdGVEYXRhYmFzZUxvY2tlZEV4Y2VwdGlvbiIKKyB0eXBlPSJhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZS5TUUxpdGVEYXRhYmFzZUxvY2tlZEV4Y2VwdGlvbiIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImVycm9yIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPC9jb25zdHJ1Y3Rvcj4KKzwvY2xhc3M+Cis8Y2xhc3MgbmFtZT0iU1FMaXRlRGF0YXR5cGVNaXNtYXRjaEV4Y2VwdGlvbiIKKyBleHRlbmRzPSJhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZS5TUUxpdGVFeGNlcHRpb24iCisgYWJzdHJhY3Q9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxjb25zdHJ1Y3RvciBuYW1lPSJTUUxpdGVEYXRhdHlwZU1pc21hdGNoRXhjZXB0aW9uIgorIHR5cGU9ImFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlLlNRTGl0ZURhdGF0eXBlTWlzbWF0Y2hFeGNlcHRpb24iCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9jb25zdHJ1Y3Rvcj4KKzxjb25zdHJ1Y3RvciBuYW1lPSJTUUxpdGVEYXRhdHlwZU1pc21hdGNoRXhjZXB0aW9uIgorIHR5cGU9ImFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlLlNRTGl0ZURhdGF0eXBlTWlzbWF0Y2hFeGNlcHRpb24iCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJlcnJvciIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzwvY29uc3RydWN0b3I+Cis8L2NsYXNzPgogPGNsYXNzIG5hbWU9IlNRTGl0ZURpc2tJT0V4Y2VwdGlvbiIKICBleHRlbmRzPSJhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZS5TUUxpdGVFeGNlcHRpb24iCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtNTg2NjUsNiArNjY2MzQsMjQgQEAKIDxwYXJhbWV0ZXIgbmFtZT0idmVyc2lvbiIgdHlwZT0iaW50Ij4KIDwvcGFyYW1ldGVyPgogPC9jb25zdHJ1Y3Rvcj4KKzxjb25zdHJ1Y3RvciBuYW1lPSJTUUxpdGVPcGVuSGVscGVyIgorIHR5cGU9ImFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlLlNRTGl0ZU9wZW5IZWxwZXIiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJjb250ZXh0IiB0eXBlPSJhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ibmFtZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iZmFjdG9yeSIgdHlwZT0iYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGUuU1FMaXRlRGF0YWJhc2UuQ3Vyc29yRmFjdG9yeSI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0idmVyc2lvbiIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJlcnJvckhhbmRsZXIiIHR5cGU9ImFuZHJvaWQuZGF0YWJhc2UuRGF0YWJhc2VFcnJvckhhbmRsZXIiPgorPC9wYXJhbWV0ZXI+Cis8L2NvbnN0cnVjdG9yPgogPG1ldGhvZCBuYW1lPSJjbG9zZSIKICByZXR1cm49InZvaWQiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtNTg3NDIsNiArNjY3MjksMzMgQEAKIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+CiA8L2NsYXNzPgorPGNsYXNzIG5hbWU9IlNRTGl0ZU91dE9mTWVtb3J5RXhjZXB0aW9uIgorIGV4dGVuZHM9ImFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlLlNRTGl0ZUV4Y2VwdGlvbiIKKyBhYnN0cmFjdD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPGNvbnN0cnVjdG9yIG5hbWU9IlNRTGl0ZU91dE9mTWVtb3J5RXhjZXB0aW9uIgorIHR5cGU9ImFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlLlNRTGl0ZU91dE9mTWVtb3J5RXhjZXB0aW9uIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvY29uc3RydWN0b3I+Cis8Y29uc3RydWN0b3IgbmFtZT0iU1FMaXRlT3V0T2ZNZW1vcnlFeGNlcHRpb24iCisgdHlwZT0iYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGUuU1FMaXRlT3V0T2ZNZW1vcnlFeGNlcHRpb24iCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJlcnJvciIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzwvY29uc3RydWN0b3I+Cis8L2NsYXNzPgogPGNsYXNzIG5hbWU9IlNRTGl0ZVByb2dyYW0iCiAgZXh0ZW5kcz0iYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGUuU1FMaXRlQ2xvc2FibGUiCiAgYWJzdHJhY3Q9InRydWUiCkBAIC01ODc1MCw2ICs2Njc2NCwxOSBAQAogIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KKzxtZXRob2QgbmFtZT0iYmluZEFsbEFyZ3NBc1N0cmluZ3MiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJiaW5kQXJncyIgdHlwZT0iamF2YS5sYW5nLlN0cmluZ1tdIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9ImJpbmRCbG9iIgogIHJldHVybj0idm9pZCIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC01ODg2Nyw3ICs2Njg5NCw3IEBACiAgc3luY2hyb25pemVkPSJmYWxzZSIKICBzdGF0aWM9ImZhbHNlIgogIGZpbmFsPSJ0cnVlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIGRlcHJlY2F0ZWQ9ImRlcHJlY2F0ZWQiCiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9tZXRob2Q+CkBAIC01OTI5MCw2ICs2NzMxNywzMyBAQAogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KIDwvY2xhc3M+Cis8Y2xhc3MgbmFtZT0iU1FMaXRlUmVhZE9ubHlEYXRhYmFzZUV4Y2VwdGlvbiIKKyBleHRlbmRzPSJhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZS5TUUxpdGVFeGNlcHRpb24iCisgYWJzdHJhY3Q9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxjb25zdHJ1Y3RvciBuYW1lPSJTUUxpdGVSZWFkT25seURhdGFiYXNlRXhjZXB0aW9uIgorIHR5cGU9ImFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlLlNRTGl0ZVJlYWRPbmx5RGF0YWJhc2VFeGNlcHRpb24iCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9jb25zdHJ1Y3Rvcj4KKzxjb25zdHJ1Y3RvciBuYW1lPSJTUUxpdGVSZWFkT25seURhdGFiYXNlRXhjZXB0aW9uIgorIHR5cGU9ImFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlLlNRTGl0ZVJlYWRPbmx5RGF0YWJhc2VFeGNlcHRpb24iCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJlcnJvciIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzwvY29uc3RydWN0b3I+Cis8L2NsYXNzPgogPGNsYXNzIG5hbWU9IlNRTGl0ZVN0YXRlbWVudCIKICBleHRlbmRzPSJhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZS5TUUxpdGVQcm9ncmFtIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTU5MzIwLDYgKzY3Mzc0LDI4IEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImV4ZWN1dGVVcGRhdGVEZWxldGUiCisgcmV0dXJuPSJpbnQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2ltcGxlUXVlcnlGb3JCbG9iRmlsZURlc2NyaXB0b3IiCisgcmV0dXJuPSJhbmRyb2lkLm9zLlBhcmNlbEZpbGVEZXNjcmlwdG9yIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9InNpbXBsZVF1ZXJ5Rm9yTG9uZyIKICByZXR1cm49ImxvbmciCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtNTkzNDMsNiArNjc0MTksMzMgQEAKID4KIDwvbWV0aG9kPgogPC9jbGFzcz4KKzxjbGFzcyBuYW1lPSJTUUxpdGVUYWJsZUxvY2tlZEV4Y2VwdGlvbiIKKyBleHRlbmRzPSJhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZS5TUUxpdGVFeGNlcHRpb24iCisgYWJzdHJhY3Q9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxjb25zdHJ1Y3RvciBuYW1lPSJTUUxpdGVUYWJsZUxvY2tlZEV4Y2VwdGlvbiIKKyB0eXBlPSJhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZS5TUUxpdGVUYWJsZUxvY2tlZEV4Y2VwdGlvbiIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2NvbnN0cnVjdG9yPgorPGNvbnN0cnVjdG9yIG5hbWU9IlNRTGl0ZVRhYmxlTG9ja2VkRXhjZXB0aW9uIgorIHR5cGU9ImFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlLlNRTGl0ZVRhYmxlTG9ja2VkRXhjZXB0aW9uIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iZXJyb3IiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8L2NvbnN0cnVjdG9yPgorPC9jbGFzcz4KIDxpbnRlcmZhY2UgbmFtZT0iU1FMaXRlVHJhbnNhY3Rpb25MaXN0ZW5lciIKICBhYnN0cmFjdD0idHJ1ZSIKICBzdGF0aWM9ImZhbHNlIgpAQCAtNjQxNDksMTYgKzcyMjUyLDYgQEAKIDxwYXJhbWV0ZXIgbmFtZT0iYml0bWFwIiB0eXBlPSJhbmRyb2lkLmdyYXBoaWNzLkJpdG1hcCI+CiA8L3BhcmFtZXRlcj4KIDwvY29uc3RydWN0b3I+Ci08Y29uc3RydWN0b3IgbmFtZT0iQ2FudmFzIgotIHR5cGU9ImFuZHJvaWQuZ3JhcGhpY3MuQ2FudmFzIgotIHN0YXRpYz0iZmFsc2UiCi0gZmluYWw9ImZhbHNlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgotIHZpc2liaWxpdHk9InB1YmxpYyIKLT4KLTxwYXJhbWV0ZXIgbmFtZT0iZ2wiIHR5cGU9ImphdmF4Lm1pY3JvZWRpdGlvbi5raHJvbm9zLm9wZW5nbGVzLkdMIj4KLTwvcGFyYW1ldGVyPgotPC9jb25zdHJ1Y3Rvcj4KIDxtZXRob2QgbmFtZT0iY2xpcFBhdGgiCiAgcmV0dXJuPSJib29sZWFuIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTY0OTMyLDcgKzczMDI1LDcgQEAKIDxtZXRob2QgbmFtZT0iZHJhd1RleHQiCiAgcmV0dXJuPSJ2b2lkIgogIGFic3RyYWN0PSJmYWxzZSIKLSBuYXRpdmU9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKICBzeW5jaHJvbml6ZWQ9ImZhbHNlIgogIHN0YXRpYz0iZmFsc2UiCiAgZmluYWw9ImZhbHNlIgpAQCAtNjUwNzUsMTcgKzczMTY4LDYgQEAKIDxwYXJhbWV0ZXIgbmFtZT0icGFpbnQiIHR5cGU9ImFuZHJvaWQuZ3JhcGhpY3MuUGFpbnQiPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KLTxtZXRob2QgbmFtZT0iZnJlZUdsQ2FjaGVzIgotIHJldHVybj0idm9pZCIKLSBhYnN0cmFjdD0iZmFsc2UiCi0gbmF0aXZlPSJmYWxzZSIKLSBzeW5jaHJvbml6ZWQ9ImZhbHNlIgotIHN0YXRpYz0idHJ1ZSIKLSBmaW5hbD0iZmFsc2UiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCi0gdmlzaWJpbGl0eT0icHVibGljIgotPgotPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9ImdldENsaXBCb3VuZHMiCiAgcmV0dXJuPSJib29sZWFuIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTY1MTM5LDggKzczMjIxLDggQEAKICBzeW5jaHJvbml6ZWQ9ImZhbHNlIgogIHN0YXRpYz0iZmFsc2UiCiAgZmluYWw9ImZhbHNlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgotIHZpc2liaWxpdHk9InB1YmxpYyIKKyBkZXByZWNhdGVkPSJkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InByb3RlY3RlZCIKID4KIDwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJnZXRIZWlnaHQiCkBAIC02NTIwMCw2ICs3MzI4MiwxNyBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJpc0hhcmR3YXJlQWNjZWxlcmF0ZWQiCisgcmV0dXJuPSJib29sZWFuIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9ImlzT3BhcXVlIgogIHJldHVybj0iYm9vbGVhbiIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC02NTUwNiwyMSArNzM1OTksNiBAQAogPHBhcmFtZXRlciBuYW1lPSJtYXRyaXgiIHR5cGU9ImFuZHJvaWQuZ3JhcGhpY3MuTWF0cml4Ij4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+Ci08bWV0aG9kIG5hbWU9InNldFZpZXdwb3J0IgotIHJldHVybj0idm9pZCIKLSBhYnN0cmFjdD0iZmFsc2UiCi0gbmF0aXZlPSJmYWxzZSIKLSBzeW5jaHJvbml6ZWQ9ImZhbHNlIgotIHN0YXRpYz0iZmFsc2UiCi0gZmluYWw9ImZhbHNlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgotIHZpc2liaWxpdHk9InB1YmxpYyIKLT4KLTxwYXJhbWV0ZXIgbmFtZT0id2lkdGgiIHR5cGU9ImludCI+Ci08L3BhcmFtZXRlcj4KLTxwYXJhbWV0ZXIgbmFtZT0iaGVpZ2h0IiB0eXBlPSJpbnQiPgotPC9wYXJhbWV0ZXI+Ci08L21ldGhvZD4KIDxtZXRob2QgbmFtZT0ic2tldyIKICByZXR1cm49InZvaWQiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtNjg5MTgsNyArNzY5OTYsNyBAQAogPG1ldGhvZCBuYW1lPSJzZXRTaGFkb3dMYXllciIKICByZXR1cm49InZvaWQiCiAgYWJzdHJhY3Q9ImZhbHNlIgotIG5hdGl2ZT0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgogIHN5bmNocm9uaXplZD0iZmFsc2UiCiAgc3RhdGljPSJmYWxzZSIKICBmaW5hbD0iZmFsc2UiCkBAIC03NDg4NSw2ICs4Mjk2MywxNyBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJjb21wdXRlQ29uc3RhbnRTaXplIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InByb3RlY3RlZCIKKz4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJnZXRDaGFuZ2luZ0NvbmZpZ3VyYXRpb25zIgogIHJldHVybj0iaW50IgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTc1Nzc5LDYgKzgzODY4LDM2IEBACiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgogPC9jbGFzcz4KKzxjbGFzcyBuYW1lPSJNaXBtYXBEcmF3YWJsZSIKKyBleHRlbmRzPSJhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlQ29udGFpbmVyIgorIGFic3RyYWN0PSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8Y29uc3RydWN0b3IgbmFtZT0iTWlwbWFwRHJhd2FibGUiCisgdHlwZT0iYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5NaXBtYXBEcmF3YWJsZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2NvbnN0cnVjdG9yPgorPG1ldGhvZCBuYW1lPSJhZGREcmF3YWJsZSIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImRyYXdhYmxlIiB0eXBlPSJhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8L2NsYXNzPgogPGNsYXNzIG5hbWU9Ik5pbmVQYXRjaERyYXdhYmxlIgogIGV4dGVuZHM9ImFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuRHJhd2FibGUiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtODAwNjksNyArODgxODgsNyBAQAogIHR5cGU9ImZsb2F0IgogIHRyYW5zaWVudD0iZmFsc2UiCiAgdm9sYXRpbGU9ImZhbHNlIgotIHZhbHVlPSIwLjAwMTBmIgorIHZhbHVlPSIwLjAwMWYiCiAgc3RhdGljPSJ0cnVlIgogIGZpbmFsPSJ0cnVlIgogIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgpAQCAtODE5NTEsNiArOTAwNzAsMjQgQEAKIDwvcGFyYW1ldGVyPgogPHBhcmFtZXRlciBuYW1lPSJtb2RlSWQiIHR5cGU9ImludCI+CiA8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0id2lkdGgiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iaGVpZ2h0IiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8L2NvbnN0cnVjdG9yPgorPGNvbnN0cnVjdG9yIG5hbWU9IktleWJvYXJkIgorIHR5cGU9ImFuZHJvaWQuaW5wdXRtZXRob2RzZXJ2aWNlLktleWJvYXJkIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iY29udGV4dCIgdHlwZT0iYW5kcm9pZC5jb250ZW50LkNvbnRleHQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InhtbExheW91dFJlc0lkIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9Im1vZGVJZCIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgogPC9jb25zdHJ1Y3Rvcj4KIDxjb25zdHJ1Y3RvciBuYW1lPSJLZXlib2FyZCIKICB0eXBlPSJhbmRyb2lkLmlucHV0bWV0aG9kc2VydmljZS5LZXlib2FyZCIKQEAgLTkwMzU4LDYgKzk4NDk1LDc4IEBACiA8cGFyYW1ldGVyIG5hbWU9InF1YWxpdHkiIHR5cGU9ImludCI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJoYXNQcm9maWxlIgorIHJldHVybj0iYm9vbGVhbiIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJxdWFsaXR5IiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iaGFzUHJvZmlsZSIKKyByZXR1cm49ImJvb2xlYW4iCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iY2FtZXJhSWQiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0icXVhbGl0eSIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8ZmllbGQgbmFtZT0iUVVBTElUWV8xMDgwUCIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjYiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iUVVBTElUWV80ODBQIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iNCIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJRVUFMSVRZXzcyMFAiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSI1IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IlFVQUxJVFlfQ0lGIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMyIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KIDxmaWVsZCBuYW1lPSJRVUFMSVRZX0hJR0giCiAgdHlwZT0iaW50IgogIHRyYW5zaWVudD0iZmFsc2UiCkBAIC05MDM4MCw2ICs5ODU4OSw5NCBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iUVVBTElUWV9RQ0lGIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMiIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJRVUFMSVRZX1RJTUVfTEFQU0VfMTA4MFAiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIxMDA2IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IlFVQUxJVFlfVElNRV9MQVBTRV80ODBQIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMTAwNCIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJRVUFMSVRZX1RJTUVfTEFQU0VfNzIwUCIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjEwMDUiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iUVVBTElUWV9USU1FX0xBUFNFX0NJRiIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjEwMDMiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iUVVBTElUWV9USU1FX0xBUFNFX0hJR0giCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIxMDAxIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IlFVQUxJVFlfVElNRV9MQVBTRV9MT1ciCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIxMDAwIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IlFVQUxJVFlfVElNRV9MQVBTRV9RQ0lGIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMTAwMiIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KIDxmaWVsZCBuYW1lPSJhdWRpb0JpdFJhdGUiCiAgdHlwZT0iaW50IgogIHRyYW5zaWVudD0iZmFsc2UiCkBAIC05MzY0OCw2ICsxMDE5NDUsMzIgQEAKIDxleGNlcHRpb24gbmFtZT0iSWxsZWdhbFN0YXRlRXhjZXB0aW9uIiB0eXBlPSJqYXZhLmxhbmcuSWxsZWdhbFN0YXRlRXhjZXB0aW9uIj4KIDwvZXhjZXB0aW9uPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldEF1eGlsaWFyeU91dHB1dEZpbGUiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJmZCIgdHlwZT0iamF2YS5pby5GaWxlRGVzY3JpcHRvciI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRBdXhpbGlhcnlPdXRwdXRGaWxlIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0icGF0aCIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJzZXRDYW1lcmEiCiAgcmV0dXJuPSJ2b2lkIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTkzNjYxLDYgKzEwMTk4NCwxOSBAQAogPHBhcmFtZXRlciBuYW1lPSJjIiB0eXBlPSJhbmRyb2lkLmhhcmR3YXJlLkNhbWVyYSI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRDYXB0dXJlUmF0ZSIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImZwcyIgdHlwZT0iZG91YmxlIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9InNldE1heER1cmF0aW9uIgogIHJldHVybj0idm9pZCIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC05OTMxMCw3ICsxMDc2NDYsNyBAQAogIHR5cGU9ImFuZHJvaWQubmV0LlNTTENlcnRpZmljYXRlU29ja2V0RmFjdG9yeSIKICBzdGF0aWM9ImZhbHNlIgogIGZpbmFsPSJmYWxzZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyBkZXByZWNhdGVkPSJkZXByZWNhdGVkIgogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDxwYXJhbWV0ZXIgbmFtZT0iaGFuZHNoYWtlVGltZW91dE1pbGxpcyIgdHlwZT0iaW50Ij4KQEAgLTk5Nzg1LDYgKzEwODEyMSwyMSBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRCb29sZWFuUXVlcnlQYXJhbWV0ZXIiCisgcmV0dXJuPSJib29sZWFuIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJrZXkiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImRlZmF1bHRWYWx1ZSIgdHlwZT0iYm9vbGVhbiI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJnZXRFbmNvZGVkQXV0aG9yaXR5IgogIHJldHVybj0iamF2YS5sYW5nLlN0cmluZyIKICBhYnN0cmFjdD0idHJ1ZSIKQEAgLTk5OTQxLDYgKzEwODI5MiwxNyBAQAogPHBhcmFtZXRlciBuYW1lPSJrZXkiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0UXVlcnlQYXJhbWV0ZXJOYW1lcyIKKyByZXR1cm49ImphdmEudXRpbC5TZXQmbHQ7amF2YS5sYW5nLlN0cmluZyZndDsiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0iZ2V0UXVlcnlQYXJhbWV0ZXJzIgogIHJldHVybj0iamF2YS51dGlsLkxpc3QmbHQ7amF2YS5sYW5nLlN0cmluZyZndDsiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMTAwMTg3LDYgKzEwODU0OSwxNyBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJjbGVhclF1ZXJ5IgorIHJldHVybj0iYW5kcm9pZC5uZXQuVXJpLkJ1aWxkZXIiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0iZW5jb2RlZEF1dGhvcml0eSIKICByZXR1cm49ImFuZHJvaWQubmV0LlVyaS5CdWlsZGVyIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTEwMTQxMCw3ICsxMDk3ODMsNyBAQAogIHR5cGU9ImFuZHJvaWQubmV0Lmh0dHAuU3NsQ2VydGlmaWNhdGUiCiAgc3RhdGljPSJmYWxzZSIKICBmaW5hbD0iZmFsc2UiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgZGVwcmVjYXRlZD0iZGVwcmVjYXRlZCIKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8cGFyYW1ldGVyIG5hbWU9Imlzc3VlZFRvIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KQEAgLTEwMTQ3Nyw3ICsxMDk4NTAsNyBAQAogIHN5bmNocm9uaXplZD0iZmFsc2UiCiAgc3RhdGljPSJmYWxzZSIKICBmaW5hbD0iZmFsc2UiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgZGVwcmVjYXRlZD0iZGVwcmVjYXRlZCIKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L21ldGhvZD4KQEAgLTEwMTQ5OSw3ICsxMDk4NzIsNyBAQAogIHN5bmNocm9uaXplZD0iZmFsc2UiCiAgc3RhdGljPSJmYWxzZSIKICBmaW5hbD0iZmFsc2UiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgZGVwcmVjYXRlZD0iZGVwcmVjYXRlZCIKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L21ldGhvZD4KQEAgLTEyMzMyOSw2ICsxMzE3MDIsMTcgQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IkhPTkVZQ09NQiIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjEwMDAwIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgogPC9jbGFzcz4KIDxjbGFzcyBuYW1lPSJCdW5kbGUiCiAgZXh0ZW5kcz0iamF2YS5sYW5nLk9iamVjdCIKQEAgLTEyOTM2NCw2ICsxMzc3NDgsMTkgQEAKIDxleGNlcHRpb24gbmFtZT0iSU9FeGNlcHRpb24iIHR5cGU9ImphdmEuaW8uSU9FeGNlcHRpb24iPgogPC9leGNlcHRpb24+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iY3JlYXRlUGlwZSIKKyByZXR1cm49ImFuZHJvaWQub3MuUGFyY2VsRmlsZURlc2NyaXB0b3JbXSIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPGV4Y2VwdGlvbiBuYW1lPSJJT0V4Y2VwdGlvbiIgdHlwZT0iamF2YS5pby5JT0V4Y2VwdGlvbiI+Cis8L2V4Y2VwdGlvbj4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJkZXNjcmliZUNvbnRlbnRzIgogIHJldHVybj0iaW50IgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTEyOTM3NSw2ICsxMzc3NzIsMjMgQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZnJvbURhdGEiCisgcmV0dXJuPSJhbmRyb2lkLm9zLlBhcmNlbEZpbGVEZXNjcmlwdG9yIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImRhdGEiIHR5cGU9ImJ5dGVbXSI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ibmFtZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzxleGNlcHRpb24gbmFtZT0iSU9FeGNlcHRpb24iIHR5cGU9ImphdmEuaW8uSU9FeGNlcHRpb24iPgorPC9leGNlcHRpb24+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0iZnJvbVNvY2tldCIKICByZXR1cm49ImFuZHJvaWQub3MuUGFyY2VsRmlsZURlc2NyaXB0b3IiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMTMxNDE1LDYgKzEzOTgyOSw1MyBAQAogPC9wYWNrYWdlPgogPHBhY2thZ2UgbmFtZT0iYW5kcm9pZC5vcy5zdG9yYWdlIgogPgorPGNsYXNzIG5hbWU9IlN0b3JhZ2VFdmVudExpc3RlbmVyIgorIGV4dGVuZHM9ImphdmEubGFuZy5PYmplY3QiCisgYWJzdHJhY3Q9InRydWUiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPGNvbnN0cnVjdG9yIG5hbWU9IlN0b3JhZ2VFdmVudExpc3RlbmVyIgorIHR5cGU9ImFuZHJvaWQub3Muc3RvcmFnZS5TdG9yYWdlRXZlbnRMaXN0ZW5lciIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2NvbnN0cnVjdG9yPgorPG1ldGhvZCBuYW1lPSJvblN0b3JhZ2VTdGF0ZUNoYW5nZWQiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJwYXRoIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJvbGRTdGF0ZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ibmV3U3RhdGUiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ib25Vc2JNYXNzU3RvcmFnZUNvbm5lY3Rpb25DaGFuZ2VkIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iY29ubmVjdGVkIiB0eXBlPSJib29sZWFuIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8L2NsYXNzPgogPGNsYXNzIG5hbWU9IlN0b3JhZ2VNYW5hZ2VyIgogIGV4dGVuZHM9ImphdmEubGFuZy5PYmplY3QiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMTMxNDIzLDYgKzEzOTg4NCwyOCBAQAogIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KKzxtZXRob2QgbmFtZT0iZGlzYWJsZVVzYk1hc3NTdG9yYWdlIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJlbmFibGVVc2JNYXNzU3RvcmFnZSIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0iZ2V0TW91bnRlZE9iYlBhdGgiCiAgcmV0dXJuPSJqYXZhLmxhbmcuU3RyaW5nIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTEzMTQ1MSw2ICsxMzk5MzQsMjggQEAKIDxleGNlcHRpb24gbmFtZT0iSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIiB0eXBlPSJqYXZhLmxhbmcuSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIj4KIDwvZXhjZXB0aW9uPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImlzVXNiTWFzc1N0b3JhZ2VDb25uZWN0ZWQiCisgcmV0dXJuPSJib29sZWFuIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImlzVXNiTWFzc1N0b3JhZ2VFbmFibGVkIgorIHJldHVybj0iYm9vbGVhbiIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJtb3VudE9iYiIKICByZXR1cm49ImJvb2xlYW4iCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMTMxNDY2LDYgKzEzOTk3MSwxOSBAQAogPHBhcmFtZXRlciBuYW1lPSJrZXkiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0icmVnaXN0ZXJMaXN0ZW5lciIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9Imxpc3RlbmVyIiB0eXBlPSJhbmRyb2lkLm9zLnN0b3JhZ2UuU3RvcmFnZUV2ZW50TGlzdGVuZXIiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0idW5tb3VudE9iYiIKICByZXR1cm49ImJvb2xlYW4iCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMTMxNDgzLDYgKzE0MDAwMSwxMjQgQEAKIDxleGNlcHRpb24gbmFtZT0iSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIiB0eXBlPSJqYXZhLmxhbmcuSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIj4KIDwvZXhjZXB0aW9uPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InVucmVnaXN0ZXJMaXN0ZW5lciIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9Imxpc3RlbmVyIiB0eXBlPSJhbmRyb2lkLm9zLnN0b3JhZ2UuU3RvcmFnZUV2ZW50TGlzdGVuZXIiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzwvY2xhc3M+Cis8Y2xhc3MgbmFtZT0iU3RvcmFnZVJlc3VsdENvZGUiCisgZXh0ZW5kcz0iamF2YS5sYW5nLk9iamVjdCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPGNvbnN0cnVjdG9yIG5hbWU9IlN0b3JhZ2VSZXN1bHRDb2RlIgorIHR5cGU9ImFuZHJvaWQub3Muc3RvcmFnZS5TdG9yYWdlUmVzdWx0Q29kZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2NvbnN0cnVjdG9yPgorPGZpZWxkIG5hbWU9Ik9wZXJhdGlvbkZhaWxlZEludGVybmFsRXJyb3IiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSItMSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJPcGVyYXRpb25GYWlsZWRNZWRpYUJsYW5rIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iLTMiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iT3BlcmF0aW9uRmFpbGVkTWVkaWFDb3JydXB0IgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iLTQiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iT3BlcmF0aW9uRmFpbGVkTm9NZWRpYSIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9Ii0yIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9Ik9wZXJhdGlvbkZhaWxlZFN0b3JhZ2VCdXN5IgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iLTciCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iT3BlcmF0aW9uRmFpbGVkU3RvcmFnZU1vdW50ZWQiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSItNiIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJPcGVyYXRpb25GYWlsZWRTdG9yYWdlTm90TW91bnRlZCIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9Ii01IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9Ik9wZXJhdGlvblN1Y2NlZWRlZCIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjAiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+CiA8L2NsYXNzPgogPC9wYWNrYWdlPgogPHBhY2thZ2UgbmFtZT0iYW5kcm9pZC5wcmVmZXJlbmNlIgpAQCAtMTMyMjc4LDYgKzE0MDkxNCwxNDggQEAKIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+CiA8L2NsYXNzPgorPGNsYXNzIG5hbWU9Ik11bHRpU2VsZWN0TGlzdFByZWZlcmVuY2UiCisgZXh0ZW5kcz0iYW5kcm9pZC5wcmVmZXJlbmNlLkRpYWxvZ1ByZWZlcmVuY2UiCisgYWJzdHJhY3Q9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxjb25zdHJ1Y3RvciBuYW1lPSJNdWx0aVNlbGVjdExpc3RQcmVmZXJlbmNlIgorIHR5cGU9ImFuZHJvaWQucHJlZmVyZW5jZS5NdWx0aVNlbGVjdExpc3RQcmVmZXJlbmNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iY29udGV4dCIgdHlwZT0iYW5kcm9pZC5jb250ZW50LkNvbnRleHQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImF0dHJzIiB0eXBlPSJhbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0Ij4KKzwvcGFyYW1ldGVyPgorPC9jb25zdHJ1Y3Rvcj4KKzxjb25zdHJ1Y3RvciBuYW1lPSJNdWx0aVNlbGVjdExpc3RQcmVmZXJlbmNlIgorIHR5cGU9ImFuZHJvaWQucHJlZmVyZW5jZS5NdWx0aVNlbGVjdExpc3RQcmVmZXJlbmNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iY29udGV4dCIgdHlwZT0iYW5kcm9pZC5jb250ZW50LkNvbnRleHQiPgorPC9wYXJhbWV0ZXI+Cis8L2NvbnN0cnVjdG9yPgorPG1ldGhvZCBuYW1lPSJmaW5kSW5kZXhPZlZhbHVlIgorIHJldHVybj0iaW50IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJ2YWx1ZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRFbnRyaWVzIgorIHJldHVybj0iamF2YS5sYW5nLkNoYXJTZXF1ZW5jZVtdIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldEVudHJ5VmFsdWVzIgorIHJldHVybj0iamF2YS5sYW5nLkNoYXJTZXF1ZW5jZVtdIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldFZhbHVlcyIKKyByZXR1cm49ImphdmEudXRpbC5TZXQmbHQ7amF2YS5sYW5nLlN0cmluZyZndDsiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0RW50cmllcyIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImVudHJpZXMiIHR5cGU9ImphdmEubGFuZy5DaGFyU2VxdWVuY2VbXSI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRFbnRyaWVzIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iZW50cmllc1Jlc0lkIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0RW50cnlWYWx1ZXMiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJlbnRyeVZhbHVlcyIgdHlwZT0iamF2YS5sYW5nLkNoYXJTZXF1ZW5jZVtdIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldEVudHJ5VmFsdWVzIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iZW50cnlWYWx1ZXNSZXNJZCIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldFZhbHVlcyIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InZhbHVlcyIgdHlwZT0iamF2YS51dGlsLlNldCZsdDtqYXZhLmxhbmcuU3RyaW5nJmd0OyI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPC9jbGFzcz4KIDxjbGFzcyBuYW1lPSJQcmVmZXJlbmNlIgogIGV4dGVuZHM9ImphdmEubGFuZy5PYmplY3QiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMTMyMzk2LDYgKzE0MTE3NCwyOCBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRFeHRyYXMiCisgcmV0dXJuPSJhbmRyb2lkLm9zLkJ1bmRsZSIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRGcmFnbWVudCIKKyByZXR1cm49ImphdmEubGFuZy5TdHJpbmciCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0iZ2V0SW50ZW50IgogIHJldHVybj0iYW5kcm9pZC5jb250ZW50LkludGVudCIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0xMzI4MjgsNiArMTQxNjI4LDE3IEBACiA8cGFyYW1ldGVyIG5hbWU9ImRlZmF1bHRWYWx1ZSIgdHlwZT0iamF2YS5sYW5nLk9iamVjdCI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJwZWVrRXh0cmFzIgorIHJldHVybj0iYW5kcm9pZC5vcy5CdW5kbGUiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0icGVyc2lzdEJvb2xlYW4iCiAgcmV0dXJuPSJib29sZWFuIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTEzMjk1OCw2ICsxNDE3NjksMTkgQEAKIDxwYXJhbWV0ZXIgbmFtZT0iZW5hYmxlZCIgdHlwZT0iYm9vbGVhbiI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRGcmFnbWVudCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImZyYWdtZW50IiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9InNldEludGVudCIKICByZXR1cm49InZvaWQiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMTMzMjc2LDYgKzE0MjEwMCw4IEBACiAgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCiAgdmlzaWJpbGl0eT0icHVibGljIgogPgorPGltcGxlbWVudHMgbmFtZT0iYW5kcm9pZC5wcmVmZXJlbmNlLlByZWZlcmVuY2VGcmFnbWVudC5PblByZWZlcmVuY2VTdGFydEZyYWdtZW50Q2FsbGJhY2siPgorPC9pbXBsZW1lbnRzPgogPGNvbnN0cnVjdG9yIG5hbWU9IlByZWZlcmVuY2VBY3Rpdml0eSIKICB0eXBlPSJhbmRyb2lkLnByZWZlcmVuY2UuUHJlZmVyZW5jZUFjdGl2aXR5IgogIHN0YXRpYz0iZmFsc2UiCkBAIC0xMzMyOTEsNiArMTQyMTE3LDU1NSBAQAogIHN5bmNocm9uaXplZD0iZmFsc2UiCiAgc3RhdGljPSJmYWxzZSIKICBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0iZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImludGVudCIgdHlwZT0iYW5kcm9pZC5jb250ZW50LkludGVudCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJhZGRQcmVmZXJlbmNlc0Zyb21SZXNvdXJjZSIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0icHJlZmVyZW5jZXNSZXNJZCIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImZpbmRQcmVmZXJlbmNlIgorIHJldHVybj0iYW5kcm9pZC5wcmVmZXJlbmNlLlByZWZlcmVuY2UiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0ia2V5IiB0eXBlPSJqYXZhLmxhbmcuQ2hhclNlcXVlbmNlIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldFByZWZlcmVuY2VNYW5hZ2VyIgorIHJldHVybj0iYW5kcm9pZC5wcmVmZXJlbmNlLlByZWZlcmVuY2VNYW5hZ2VyIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0iZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0UHJlZmVyZW5jZVNjcmVlbiIKKyByZXR1cm49ImFuZHJvaWQucHJlZmVyZW5jZS5QcmVmZXJlbmNlU2NyZWVuIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0iZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iaGFzSGVhZGVycyIKKyByZXR1cm49ImJvb2xlYW4iCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iaW52YWxpZGF0ZUhlYWRlcnMiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImlzTXVsdGlQYW5lIgorIHJldHVybj0iYm9vbGVhbiIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJsb2FkSGVhZGVyc0Zyb21SZXNvdXJjZSIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InJlc2lkIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InRhcmdldCIgdHlwZT0iamF2YS51dGlsLkxpc3QmbHQ7YW5kcm9pZC5wcmVmZXJlbmNlLlByZWZlcmVuY2VBY3Rpdml0eS5IZWFkZXImZ3Q7Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9Im9uQnVpbGRIZWFkZXJzIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0idGFyZ2V0IiB0eXBlPSJqYXZhLnV0aWwuTGlzdCZsdDthbmRyb2lkLnByZWZlcmVuY2UuUHJlZmVyZW5jZUFjdGl2aXR5LkhlYWRlciZndDsiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ib25HZXRJbml0aWFsSGVhZGVyIgorIHJldHVybj0iYW5kcm9pZC5wcmVmZXJlbmNlLlByZWZlcmVuY2VBY3Rpdml0eS5IZWFkZXIiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ib25HZXROZXdIZWFkZXIiCisgcmV0dXJuPSJhbmRyb2lkLnByZWZlcmVuY2UuUHJlZmVyZW5jZUFjdGl2aXR5LkhlYWRlciIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJvbkhlYWRlckNsaWNrIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iaGVhZGVyIiB0eXBlPSJhbmRyb2lkLnByZWZlcmVuY2UuUHJlZmVyZW5jZUFjdGl2aXR5LkhlYWRlciI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0icG9zaXRpb24iIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJvbklzSGlkaW5nSGVhZGVycyIKKyByZXR1cm49ImJvb2xlYW4iCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ib25Jc011bHRpUGFuZSIKKyByZXR1cm49ImJvb2xlYW4iCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ib25QcmVmZXJlbmNlU3RhcnRGcmFnbWVudCIKKyByZXR1cm49ImJvb2xlYW4iCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImNhbGxlciIgdHlwZT0iYW5kcm9pZC5wcmVmZXJlbmNlLlByZWZlcmVuY2VGcmFnbWVudCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0icHJlZiIgdHlwZT0iYW5kcm9pZC5wcmVmZXJlbmNlLlByZWZlcmVuY2UiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ib25QcmVmZXJlbmNlVHJlZUNsaWNrIgorIHJldHVybj0iYm9vbGVhbiIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9ImRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJwcmVmZXJlbmNlU2NyZWVuIiB0eXBlPSJhbmRyb2lkLnByZWZlcmVuY2UuUHJlZmVyZW5jZVNjcmVlbiI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0icHJlZmVyZW5jZSIgdHlwZT0iYW5kcm9pZC5wcmVmZXJlbmNlLlByZWZlcmVuY2UiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0TGlzdEZvb3RlciIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InZpZXciIHR5cGU9ImFuZHJvaWQudmlldy5WaWV3Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldFByZWZlcmVuY2VTY3JlZW4iCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0iZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InByZWZlcmVuY2VTY3JlZW4iIHR5cGU9ImFuZHJvaWQucHJlZmVyZW5jZS5QcmVmZXJlbmNlU2NyZWVuIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InN0YXJ0UHJlZmVyZW5jZUZyYWdtZW50IgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iZnJhZ21lbnQiIHR5cGU9ImFuZHJvaWQuYXBwLkZyYWdtZW50Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJwdXNoIiB0eXBlPSJib29sZWFuIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InN0YXJ0V2l0aEZyYWdtZW50IgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iZnJhZ21lbnROYW1lIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJhcmdzIiB0eXBlPSJhbmRyb2lkLm9zLkJ1bmRsZSI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzd2l0Y2hUb0hlYWRlciIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImZyYWdtZW50TmFtZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iYXJncyIgdHlwZT0iYW5kcm9pZC5vcy5CdW5kbGUiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic3dpdGNoVG9IZWFkZXIiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJoZWFkZXIiIHR5cGU9ImFuZHJvaWQucHJlZmVyZW5jZS5QcmVmZXJlbmNlQWN0aXZpdHkuSGVhZGVyIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8ZmllbGQgbmFtZT0iRVhUUkFfTk9fSEVBREVSUyIKKyB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSImcXVvdDs6YW5kcm9pZDpub19oZWFkZXJzJnF1b3Q7IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IkVYVFJBX1NIT1dfRlJBR01FTlQiCisgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iJnF1b3Q7OmFuZHJvaWQ6c2hvd19mcmFnbWVudCZxdW90OyIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJFWFRSQV9TSE9XX0ZSQUdNRU5UX0FSR1VNRU5UUyIKKyB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSImcXVvdDs6YW5kcm9pZDpzaG93X2ZyYWdtZW50X2FyZ3MmcXVvdDsiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iSEVBREVSX0lEX1VOREVGSU5FRCIKKyB0eXBlPSJsb25nIgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSItMUwiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8L2NsYXNzPgorPGNsYXNzIG5hbWU9IlByZWZlcmVuY2VBY3Rpdml0eS5IZWFkZXIiCisgZXh0ZW5kcz0iamF2YS5sYW5nLk9iamVjdCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxpbXBsZW1lbnRzIG5hbWU9ImFuZHJvaWQub3MuUGFyY2VsYWJsZSI+Cis8L2ltcGxlbWVudHM+Cis8Y29uc3RydWN0b3IgbmFtZT0iUHJlZmVyZW5jZUFjdGl2aXR5LkhlYWRlciIKKyB0eXBlPSJhbmRyb2lkLnByZWZlcmVuY2UuUHJlZmVyZW5jZUFjdGl2aXR5LkhlYWRlciIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2NvbnN0cnVjdG9yPgorPG1ldGhvZCBuYW1lPSJkZXNjcmliZUNvbnRlbnRzIgorIHJldHVybj0iaW50IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InJlYWRGcm9tUGFyY2VsIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iaW4iIHR5cGU9ImFuZHJvaWQub3MuUGFyY2VsIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9IndyaXRlVG9QYXJjZWwiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJkZXN0IiB0eXBlPSJhbmRyb2lkLm9zLlBhcmNlbCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iZmxhZ3MiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPGZpZWxkIG5hbWU9IkNSRUFUT1IiCisgdHlwZT0iYW5kcm9pZC5vcy5QYXJjZWxhYmxlLkNyZWF0b3IiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iZXh0cmFzIgorIHR5cGU9ImFuZHJvaWQub3MuQnVuZGxlIgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iZnJhZ21lbnQiCisgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9ImZyYWdtZW50QXJndW1lbnRzIgorIHR5cGU9ImFuZHJvaWQub3MuQnVuZGxlIgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iaWNvblJlcyIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJpZCIKKyB0eXBlPSJsb25nIgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iaW50ZW50IgorIHR5cGU9ImFuZHJvaWQuY29udGVudC5JbnRlbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJzdW1tYXJ5IgorIHR5cGU9ImphdmEubGFuZy5DaGFyU2VxdWVuY2UiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJ0aXRsZSIKKyB0eXBlPSJqYXZhLmxhbmcuQ2hhclNlcXVlbmNlIgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8L2NsYXNzPgorPGNsYXNzIG5hbWU9IlByZWZlcmVuY2VDYXRlZ29yeSIKKyBleHRlbmRzPSJhbmRyb2lkLnByZWZlcmVuY2UuUHJlZmVyZW5jZUdyb3VwIgorIGFic3RyYWN0PSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8Y29uc3RydWN0b3IgbmFtZT0iUHJlZmVyZW5jZUNhdGVnb3J5IgorIHR5cGU9ImFuZHJvaWQucHJlZmVyZW5jZS5QcmVmZXJlbmNlQ2F0ZWdvcnkiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJjb250ZXh0IiB0eXBlPSJhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iYXR0cnMiIHR5cGU9ImFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImRlZlN0eWxlIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8L2NvbnN0cnVjdG9yPgorPGNvbnN0cnVjdG9yIG5hbWU9IlByZWZlcmVuY2VDYXRlZ29yeSIKKyB0eXBlPSJhbmRyb2lkLnByZWZlcmVuY2UuUHJlZmVyZW5jZUNhdGVnb3J5IgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iY29udGV4dCIgdHlwZT0iYW5kcm9pZC5jb250ZW50LkNvbnRleHQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImF0dHJzIiB0eXBlPSJhbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0Ij4KKzwvcGFyYW1ldGVyPgorPC9jb25zdHJ1Y3Rvcj4KKzxjb25zdHJ1Y3RvciBuYW1lPSJQcmVmZXJlbmNlQ2F0ZWdvcnkiCisgdHlwZT0iYW5kcm9pZC5wcmVmZXJlbmNlLlByZWZlcmVuY2VDYXRlZ29yeSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImNvbnRleHQiIHR5cGU9ImFuZHJvaWQuY29udGVudC5Db250ZXh0Ij4KKzwvcGFyYW1ldGVyPgorPC9jb25zdHJ1Y3Rvcj4KKzwvY2xhc3M+Cis8Y2xhc3MgbmFtZT0iUHJlZmVyZW5jZUZyYWdtZW50IgorIGV4dGVuZHM9ImFuZHJvaWQuYXBwLkZyYWdtZW50IgorIGFic3RyYWN0PSJ0cnVlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxjb25zdHJ1Y3RvciBuYW1lPSJQcmVmZXJlbmNlRnJhZ21lbnQiCisgdHlwZT0iYW5kcm9pZC5wcmVmZXJlbmNlLlByZWZlcmVuY2VGcmFnbWVudCIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2NvbnN0cnVjdG9yPgorPG1ldGhvZCBuYW1lPSJhZGRQcmVmZXJlbmNlc0Zyb21JbnRlbnQiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCiAgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCiAgdmlzaWJpbGl0eT0icHVibGljIgogPgpAQCAtMTMzMzc0LDUxICsxNDI3NDksMjkgQEAKIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+CiA8L2NsYXNzPgotPGNsYXNzIG5hbWU9IlByZWZlcmVuY2VDYXRlZ29yeSIKLSBleHRlbmRzPSJhbmRyb2lkLnByZWZlcmVuY2UuUHJlZmVyZW5jZUdyb3VwIgotIGFic3RyYWN0PSJmYWxzZSIKKzxpbnRlcmZhY2UgbmFtZT0iUHJlZmVyZW5jZUZyYWdtZW50Lk9uUHJlZmVyZW5jZVN0YXJ0RnJhZ21lbnRDYWxsYmFjayIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxtZXRob2QgbmFtZT0ib25QcmVmZXJlbmNlU3RhcnRGcmFnbWVudCIKKyByZXR1cm49ImJvb2xlYW4iCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgogIHN0YXRpYz0iZmFsc2UiCiAgZmluYWw9ImZhbHNlIgogIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KLTxjb25zdHJ1Y3RvciBuYW1lPSJQcmVmZXJlbmNlQ2F0ZWdvcnkiCi0gdHlwZT0iYW5kcm9pZC5wcmVmZXJlbmNlLlByZWZlcmVuY2VDYXRlZ29yeSIKLSBzdGF0aWM9ImZhbHNlIgotIGZpbmFsPSJmYWxzZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKLSB2aXNpYmlsaXR5PSJwdWJsaWMiCi0+Ci08cGFyYW1ldGVyIG5hbWU9ImNvbnRleHQiIHR5cGU9ImFuZHJvaWQuY29udGVudC5Db250ZXh0Ij4KKzxwYXJhbWV0ZXIgbmFtZT0iY2FsbGVyIiB0eXBlPSJhbmRyb2lkLnByZWZlcmVuY2UuUHJlZmVyZW5jZUZyYWdtZW50Ij4KIDwvcGFyYW1ldGVyPgotPHBhcmFtZXRlciBuYW1lPSJhdHRycyIgdHlwZT0iYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldCI+Cis8cGFyYW1ldGVyIG5hbWU9InByZWYiIHR5cGU9ImFuZHJvaWQucHJlZmVyZW5jZS5QcmVmZXJlbmNlIj4KIDwvcGFyYW1ldGVyPgotPHBhcmFtZXRlciBuYW1lPSJkZWZTdHlsZSIgdHlwZT0iaW50Ij4KLTwvcGFyYW1ldGVyPgotPC9jb25zdHJ1Y3Rvcj4KLTxjb25zdHJ1Y3RvciBuYW1lPSJQcmVmZXJlbmNlQ2F0ZWdvcnkiCi0gdHlwZT0iYW5kcm9pZC5wcmVmZXJlbmNlLlByZWZlcmVuY2VDYXRlZ29yeSIKLSBzdGF0aWM9ImZhbHNlIgotIGZpbmFsPSJmYWxzZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKLSB2aXNpYmlsaXR5PSJwdWJsaWMiCi0+Ci08cGFyYW1ldGVyIG5hbWU9ImNvbnRleHQiIHR5cGU9ImFuZHJvaWQuY29udGVudC5Db250ZXh0Ij4KLTwvcGFyYW1ldGVyPgotPHBhcmFtZXRlciBuYW1lPSJhdHRycyIgdHlwZT0iYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldCI+Ci08L3BhcmFtZXRlcj4KLTwvY29uc3RydWN0b3I+Ci08Y29uc3RydWN0b3IgbmFtZT0iUHJlZmVyZW5jZUNhdGVnb3J5IgotIHR5cGU9ImFuZHJvaWQucHJlZmVyZW5jZS5QcmVmZXJlbmNlQ2F0ZWdvcnkiCi0gc3RhdGljPSJmYWxzZSIKLSBmaW5hbD0iZmFsc2UiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCi0gdmlzaWJpbGl0eT0icHVibGljIgotPgotPHBhcmFtZXRlciBuYW1lPSJjb250ZXh0IiB0eXBlPSJhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCI+Ci08L3BhcmFtZXRlcj4KLTwvY29uc3RydWN0b3I+Ci08L2NsYXNzPgorPC9tZXRob2Q+Cis8L2ludGVyZmFjZT4KIDxjbGFzcyBuYW1lPSJQcmVmZXJlbmNlR3JvdXAiCiAgZXh0ZW5kcz0iYW5kcm9pZC5wcmVmZXJlbmNlLlByZWZlcmVuY2UiCiAgYWJzdHJhY3Q9InRydWUiCkBAIC0xMzQzMTgsOSArMTQzNjcxLDkgQEAKICBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+Ci08cGFyYW1ldGVyIG5hbWU9ImMiIHR5cGU9ImFuZHJvaWQuY29udGVudC5Db250ZXh0Ij4KKzxwYXJhbWV0ZXIgbmFtZT0iY29udGV4dCIgdHlwZT0iYW5kcm9pZC5jb250ZW50LkNvbnRleHQiPgogPC9wYXJhbWV0ZXI+Ci08cGFyYW1ldGVyIG5hbWU9InMiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPHBhcmFtZXRlciBuYW1lPSJzdHJpbmciIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0idHJ1bmNhdGVIaXN0b3J5IgpAQCAtMTM0NzA0LDcgKzE0NDA1Nyw3IEBACiAgdmFsdWU9IiZxdW90O3VybCZxdW90OyIKICBzdGF0aWM9InRydWUiCiAgZmluYWw9InRydWUiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgZGVwcmVjYXRlZD0iZGVwcmVjYXRlZCIKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L2ZpZWxkPgpAQCAtMTM3NzYzLDYgKzE0NzExNiwyOCBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iRElSRUNUT1JZX1BBUkFNX0tFWSIKKyB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSImcXVvdDtkaXJlY3RvcnkmcXVvdDsiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iTElNSVRfUEFSQU1fS0VZIgorIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IiZxdW90O2xpbWl0JnF1b3Q7IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgogPC9jbGFzcz4KIDxjbGFzcyBuYW1lPSJDb250YWN0c0NvbnRyYWN0LkFnZ3JlZ2F0aW9uRXhjZXB0aW9ucyIKICBleHRlbmRzPSJqYXZhLmxhbmcuT2JqZWN0IgpAQCAtMTM4MDM4LDYgKzE0NzQxMywxNyBAQAogPHBhcmFtZXRlciBuYW1lPSJ0eXBlIiB0eXBlPSJpbnQiPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KKzxmaWVsZCBuYW1lPSJBRERSRVNTIgorIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IiZxdW90O2RhdGExJnF1b3Q7IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgogPGZpZWxkIG5hbWU9IkNPTlRFTlRfRklMVEVSX1VSSSIKICB0eXBlPSJhbmRyb2lkLm5ldC5VcmkiCiAgdHJhbnNpZW50PSJmYWxzZSIKQEAgLTEzOTc5Niw2ICsxNDkxODIsOTEgQEAKID4KIDwvZmllbGQ+CiA8L2NsYXNzPgorPGludGVyZmFjZSBuYW1lPSJDb250YWN0c0NvbnRyYWN0LkNvbnRhY3ROYW1lQ29sdW1ucyIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InByb3RlY3RlZCIKKz4KKzxmaWVsZCBuYW1lPSJESVNQTEFZX05BTUVfQUxURVJOQVRJVkUiCisgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iJnF1b3Q7ZGlzcGxheV9uYW1lX2FsdCZxdW90OyIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJESVNQTEFZX05BTUVfUFJJTUFSWSIKKyB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSImcXVvdDtkaXNwbGF5X25hbWUmcXVvdDsiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iRElTUExBWV9OQU1FX1NPVVJDRSIKKyB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSImcXVvdDtkaXNwbGF5X25hbWVfc291cmNlJnF1b3Q7IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IlBIT05FVElDX05BTUUiCisgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iJnF1b3Q7cGhvbmV0aWNfbmFtZSZxdW90OyIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJQSE9ORVRJQ19OQU1FX1NUWUxFIgorIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IiZxdW90O3Bob25ldGljX25hbWVfc3R5bGUmcXVvdDsiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iU09SVF9LRVlfQUxURVJOQVRJVkUiCisgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iJnF1b3Q7c29ydF9rZXlfYWx0JnF1b3Q7IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IlNPUlRfS0VZX1BSSU1BUlkiCisgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iJnF1b3Q7c29ydF9rZXkmcXVvdDsiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8L2ludGVyZmFjZT4KIDxpbnRlcmZhY2UgbmFtZT0iQ29udGFjdHNDb250cmFjdC5Db250YWN0T3B0aW9uc0NvbHVtbnMiCiAgYWJzdHJhY3Q9InRydWUiCiAgc3RhdGljPSJ0cnVlIgpAQCAtMTM5OTU0LDYgKzE0OTQyNSw4IEBACiA+CiA8aW1wbGVtZW50cyBuYW1lPSJhbmRyb2lkLnByb3ZpZGVyLkJhc2VDb2x1bW5zIj4KIDwvaW1wbGVtZW50cz4KKzxpbXBsZW1lbnRzIG5hbWU9ImFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5Db250YWN0TmFtZUNvbHVtbnMiPgorPC9pbXBsZW1lbnRzPgogPGltcGxlbWVudHMgbmFtZT0iYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0LkNvbnRhY3RPcHRpb25zQ29sdW1ucyI+CiA8L2ltcGxlbWVudHM+CiA8aW1wbGVtZW50cyBuYW1lPSJhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuQ29udGFjdFN0YXR1c0NvbHVtbnMiPgpAQCAtMTQwMTQ5LDYgKzE0OTYyMiwxMCBAQAogPgogPGltcGxlbWVudHMgbmFtZT0iYW5kcm9pZC5wcm92aWRlci5CYXNlQ29sdW1ucyI+CiA8L2ltcGxlbWVudHM+Cis8aW1wbGVtZW50cyBuYW1lPSJhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuQ29udGFjdE9wdGlvbnNDb2x1bW5zIj4KKzwvaW1wbGVtZW50cz4KKzxpbXBsZW1lbnRzIG5hbWU9ImFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5Db250YWN0U3RhdHVzQ29sdW1ucyI+Cis8L2ltcGxlbWVudHM+CiA8aW1wbGVtZW50cyBuYW1lPSJhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuQ29udGFjdHNDb2x1bW5zIj4KIDwvaW1wbGVtZW50cz4KIDxmaWVsZCBuYW1lPSJDT05URU5UX0RJUkVDVE9SWSIKQEAgLTE0MDE4Nyw2ICsxNDk2NjQsNjggQEAKID4KIDwvZmllbGQ+CiA8L2NsYXNzPgorPGNsYXNzIG5hbWU9IkNvbnRhY3RzQ29udHJhY3QuQ29udGFjdHMuRW50aXR5IgorIGV4dGVuZHM9ImphdmEubGFuZy5PYmplY3QiCisgYWJzdHJhY3Q9ImZhbHNlIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8aW1wbGVtZW50cyBuYW1lPSJhbmRyb2lkLnByb3ZpZGVyLkJhc2VDb2x1bW5zIj4KKzwvaW1wbGVtZW50cz4KKzxpbXBsZW1lbnRzIG5hbWU9ImFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5CYXNlU3luY0NvbHVtbnMiPgorPC9pbXBsZW1lbnRzPgorPGltcGxlbWVudHMgbmFtZT0iYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0LkNvbnRhY3ROYW1lQ29sdW1ucyI+Cis8L2ltcGxlbWVudHM+Cis8aW1wbGVtZW50cyBuYW1lPSJhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuQ29udGFjdE9wdGlvbnNDb2x1bW5zIj4KKzwvaW1wbGVtZW50cz4KKzxpbXBsZW1lbnRzIG5hbWU9ImFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5Db250YWN0U3RhdHVzQ29sdW1ucyI+Cis8L2ltcGxlbWVudHM+Cis8aW1wbGVtZW50cyBuYW1lPSJhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuQ29udGFjdHNDb2x1bW5zIj4KKzwvaW1wbGVtZW50cz4KKzxpbXBsZW1lbnRzIG5hbWU9ImFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5EYXRhQ29sdW1ucyI+Cis8L2ltcGxlbWVudHM+Cis8aW1wbGVtZW50cyBuYW1lPSJhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuUmF3Q29udGFjdHNDb2x1bW5zIj4KKzwvaW1wbGVtZW50cz4KKzxpbXBsZW1lbnRzIG5hbWU9ImFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5TdGF0dXNDb2x1bW5zIj4KKzwvaW1wbGVtZW50cz4KKzxpbXBsZW1lbnRzIG5hbWU9ImFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5TeW5jQ29sdW1ucyI+Cis8L2ltcGxlbWVudHM+Cis8ZmllbGQgbmFtZT0iQ09OVEVOVF9ESVJFQ1RPUlkiCisgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iJnF1b3Q7ZW50aXRpZXMmcXVvdDsiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iREFUQV9JRCIKKyB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSImcXVvdDtkYXRhX2lkJnF1b3Q7IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IlJBV19DT05UQUNUX0lEIgorIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IiZxdW90O3Jhd19jb250YWN0X2lkJnF1b3Q7IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPC9jbGFzcz4KIDxjbGFzcyBuYW1lPSJDb250YWN0c0NvbnRyYWN0LkNvbnRhY3RzLlBob3RvIgogIGV4dGVuZHM9ImphdmEubGFuZy5PYmplY3QiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMTQwMTk3LDcgKzE0OTczNiw3IEBACiA+CiA8aW1wbGVtZW50cyBuYW1lPSJhbmRyb2lkLnByb3ZpZGVyLkJhc2VDb2x1bW5zIj4KIDwvaW1wbGVtZW50cz4KLTxpbXBsZW1lbnRzIG5hbWU9ImFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5EYXRhQ29sdW1ucyI+Cis8aW1wbGVtZW50cyBuYW1lPSJhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuRGF0YUNvbHVtbnNXaXRoSm9pbnMiPgogPC9pbXBsZW1lbnRzPgogPGZpZWxkIG5hbWU9IkNPTlRFTlRfRElSRUNUT1JZIgogIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCkBAIC0xNDAyMTAsNiArMTQ5NzQ5LDE3IEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJQSE9UTyIKKyB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSImcXVvdDtkYXRhMTUmcXVvdDsiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+CiA8L2NsYXNzPgogPGludGVyZmFjZSBuYW1lPSJDb250YWN0c0NvbnRyYWN0LkNvbnRhY3RzQ29sdW1ucyIKICBhYnN0cmFjdD0idHJ1ZSIKQEAgLTE0MDUxNSw2ICsxNTAwNjUsMTcgQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IklTX1JFQURfT05MWSIKKyB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSImcXVvdDtpc19yZWFkX29ubHkmcXVvdDsiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+CiA8ZmllbGQgbmFtZT0iSVNfU1VQRVJfUFJJTUFSWSIKICB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgogIHRyYW5zaWVudD0iZmFsc2UiCkBAIC0xNDA2MDIsNiArMTUwMTYzLDggQEAKID4KIDxpbXBsZW1lbnRzIG5hbWU9ImFuZHJvaWQucHJvdmlkZXIuQmFzZUNvbHVtbnMiPgogPC9pbXBsZW1lbnRzPgorPGltcGxlbWVudHMgbmFtZT0iYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0LkNvbnRhY3ROYW1lQ29sdW1ucyI+Cis8L2ltcGxlbWVudHM+CiA8aW1wbGVtZW50cyBuYW1lPSJhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuQ29udGFjdE9wdGlvbnNDb2x1bW5zIj4KIDwvaW1wbGVtZW50cz4KIDxpbXBsZW1lbnRzIG5hbWU9ImFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5Db250YWN0U3RhdHVzQ29sdW1ucyI+CkBAIC0xNDA2MTUsNiArMTUwMTc4LDM4NiBAQAogPGltcGxlbWVudHMgbmFtZT0iYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0LlN0YXR1c0NvbHVtbnMiPgogPC9pbXBsZW1lbnRzPgogPC9pbnRlcmZhY2U+Cis8Y2xhc3MgbmFtZT0iQ29udGFjdHNDb250cmFjdC5EaXJlY3RvcnkiCisgZXh0ZW5kcz0iamF2YS5sYW5nLk9iamVjdCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxpbXBsZW1lbnRzIG5hbWU9ImFuZHJvaWQucHJvdmlkZXIuQmFzZUNvbHVtbnMiPgorPC9pbXBsZW1lbnRzPgorPG1ldGhvZCBuYW1lPSJub3RpZnlEaXJlY3RvcnlDaGFuZ2UiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InJlc29sdmVyIiB0eXBlPSJhbmRyb2lkLmNvbnRlbnQuQ29udGVudFJlc29sdmVyIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8ZmllbGQgbmFtZT0iQUNDT1VOVF9OQU1FIgorIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IiZxdW90O2FjY291bnROYW1lJnF1b3Q7IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IkFDQ09VTlRfVFlQRSIKKyB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSImcXVvdDthY2NvdW50VHlwZSZxdW90OyIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJDT05URU5UX0lURU1fVFlQRSIKKyB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSImcXVvdDt2bmQuYW5kcm9pZC5jdXJzb3IuaXRlbS9jb250YWN0X2RpcmVjdG9yeSZxdW90OyIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJDT05URU5UX1RZUEUiCisgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iJnF1b3Q7dm5kLmFuZHJvaWQuY3Vyc29yLmRpci9jb250YWN0X2RpcmVjdG9yaWVzJnF1b3Q7IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IkNPTlRFTlRfVVJJIgorIHR5cGU9ImFuZHJvaWQubmV0LlVyaSIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJERUZBVUxUIgorIHR5cGU9ImxvbmciCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjBMIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IkRJUkVDVE9SWV9BVVRIT1JJVFkiCisgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iJnF1b3Q7YXV0aG9yaXR5JnF1b3Q7IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IkRJU1BMQVlfTkFNRSIKKyB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSImcXVvdDtkaXNwbGF5TmFtZSZxdW90OyIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJFWFBPUlRfU1VQUE9SVCIKKyB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSImcXVvdDtleHBvcnRTdXBwb3J0JnF1b3Q7IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IkVYUE9SVF9TVVBQT1JUX0FOWV9BQ0NPVU5UIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMiIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJFWFBPUlRfU1VQUE9SVF9OT05FIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMCIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJFWFBPUlRfU1VQUE9SVF9TQU1FX0FDQ09VTlRfT05MWSIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjEiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iTE9DQUxfSU5WSVNJQkxFIgorIHR5cGU9ImxvbmciCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjFMIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IlBBQ0tBR0VfTkFNRSIKKyB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSImcXVvdDtwYWNrYWdlTmFtZSZxdW90OyIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJTSE9SVENVVF9TVVBQT1JUIgorIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IiZxdW90O3Nob3J0Y3V0U3VwcG9ydCZxdW90OyIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJTSE9SVENVVF9TVVBQT1JUX0RBVEFfSVRFTVNfT05MWSIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjEiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iU0hPUlRDVVRfU1VQUE9SVF9GVUxMIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMiIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJTSE9SVENVVF9TVVBQT1JUX05PTkUiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIwIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IlRZUEVfUkVTT1VSQ0VfSUQiCisgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iJnF1b3Q7dHlwZVJlc291cmNlSWQmcXVvdDsiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8L2NsYXNzPgorPGludGVyZmFjZSBuYW1lPSJDb250YWN0c0NvbnRyYWN0LkRpc3BsYXlOYW1lU291cmNlcyIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxmaWVsZCBuYW1lPSJFTUFJTCIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjEwIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9Ik5JQ0tOQU1FIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMzUiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iT1JHQU5JWkFUSU9OIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMzAiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iUEhPTkUiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIyMCIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJTVFJVQ1RVUkVEX05BTUUiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSI0MCIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJVTkRFRklORUQiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIwIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPC9pbnRlcmZhY2U+Cis8aW50ZXJmYWNlIG5hbWU9IkNvbnRhY3RzQ29udHJhY3QuRnVsbE5hbWVTdHlsZSIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxmaWVsZCBuYW1lPSJDSElORVNFIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMyIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJDSksiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIyIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IkpBUEFORVNFIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iNCIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJLT1JFQU4iCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSI1IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IlVOREVGSU5FRCIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjAiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iV0VTVEVSTiIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjEiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8L2ludGVyZmFjZT4KIDxjbGFzcyBuYW1lPSJDb250YWN0c0NvbnRyYWN0Lkdyb3VwcyIKICBleHRlbmRzPSJqYXZhLmxhbmcuT2JqZWN0IgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTE0MDY5Miw2ICsxNTA2MzUsMTcgQEAKICBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKICB2aXNpYmlsaXR5PSJwcm90ZWN0ZWQiCiA+Cis8ZmllbGQgbmFtZT0iQVVUT19BREQiCisgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iJnF1b3Q7YXV0b19hZGQmcXVvdDsiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+CiA8ZmllbGQgbmFtZT0iREVMRVRFRCIKICB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgogIHRyYW5zaWVudD0iZmFsc2UiCkBAIC0xNDA3MDMsNiArMTUwNjU3LDE3IEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJGQVZPUklURVMiCisgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iJnF1b3Q7ZmF2b3JpdGVzJnF1b3Q7IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgogPGZpZWxkIG5hbWU9IkdST1VQX1ZJU0lCTEUiCiAgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKICB0cmFuc2llbnQ9ImZhbHNlIgpAQCAtMTQxMjU3LDYgKzE1MTIyMiw1OCBAQAogPgogPC9maWVsZD4KIDwvaW50ZXJmYWNlPgorPGludGVyZmFjZSBuYW1lPSJDb250YWN0c0NvbnRyYWN0LlBob25ldGljTmFtZVN0eWxlIgorIGFic3RyYWN0PSJ0cnVlIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPGZpZWxkIG5hbWU9IkpBUEFORVNFIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iNCIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJLT1JFQU4iCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSI1IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IlBJTllJTiIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjMiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iVU5ERUZJTkVEIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMCIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzwvaW50ZXJmYWNlPgogPGNsYXNzIG5hbWU9IkNvbnRhY3RzQ29udHJhY3QuUHJlc2VuY2UiCiAgZXh0ZW5kcz0iYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0LlN0YXR1c1VwZGF0ZXMiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMTQxNDM5LDYgKzE1MTQ1Niw4IEBACiA+CiA8aW1wbGVtZW50cyBuYW1lPSJhbmRyb2lkLnByb3ZpZGVyLkJhc2VDb2x1bW5zIj4KIDwvaW1wbGVtZW50cz4KKzxpbXBsZW1lbnRzIG5hbWU9ImFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5Db250YWN0TmFtZUNvbHVtbnMiPgorPC9pbXBsZW1lbnRzPgogPGltcGxlbWVudHMgbmFtZT0iYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0LkNvbnRhY3RPcHRpb25zQ29sdW1ucyI+CiA8L2ltcGxlbWVudHM+CiA8aW1wbGVtZW50cyBuYW1lPSJhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuUmF3Q29udGFjdHNDb2x1bW5zIj4KQEAgLTE0MTUwMiw3ICsxNTE1MjEsNyBAQAogIHZhbHVlPSIxIgogIHN0YXRpYz0idHJ1ZSIKICBmaW5hbD0idHJ1ZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyBkZXByZWNhdGVkPSJkZXByZWNhdGVkIgogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvZmllbGQ+CkBAIC0xNDE2NDksNiArMTUxNjY4LDE3IEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJSQVdfQ09OVEFDVF9JU19SRUFEX09OTFkiCisgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iJnF1b3Q7cmF3X2NvbnRhY3RfaXNfcmVhZF9vbmx5JnF1b3Q7IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgogPC9pbnRlcmZhY2U+CiA8Y2xhc3MgbmFtZT0iQ29udGFjdHNDb250cmFjdC5SYXdDb250YWN0c0VudGl0eSIKICBleHRlbmRzPSJqYXZhLmxhbmcuT2JqZWN0IgpAQCAtMTQxODY1LDExICsxNTE4OTUsMTEgQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L2ZpZWxkPgotPGZpZWxkIG5hbWU9IkNBUEFCSUxJVFlfSEFTX1ZJREVPX1BMQVlCQUNLX09OTFkiCis8ZmllbGQgbmFtZT0iQ0FQQUJJTElUWV9IQVNfVklERU8iCiAgdHlwZT0iaW50IgogIHRyYW5zaWVudD0iZmFsc2UiCiAgdm9sYXRpbGU9ImZhbHNlIgotIHZhbHVlPSIxIgorIHZhbHVlPSIyIgogIHN0YXRpYz0idHJ1ZSIKICBmaW5hbD0idHJ1ZSIKICBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKQEAgLTE0MTg4MCw3ICsxNTE5MTAsNyBAQAogIHR5cGU9ImludCIKICB0cmFuc2llbnQ9ImZhbHNlIgogIHZvbGF0aWxlPSJmYWxzZSIKLSB2YWx1ZT0iMiIKKyB2YWx1ZT0iMSIKICBzdGF0aWM9InRydWUiCiAgZmluYWw9InRydWUiCiAgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCkBAIC0xNTA3OTYsNyArMTYwODI2LDcgQEAKICBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+Ci08cGFyYW1ldGVyIG5hbWU9InRleHQiIHR5cGU9ImFuZHJvaWQudGV4dC5FZGl0YWJsZSI+Cis8cGFyYW1ldGVyIG5hbWU9InMiIHR5cGU9ImFuZHJvaWQudGV4dC5FZGl0YWJsZSI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJiZWZvcmVUZXh0Q2hhbmdlZCIKQEAgLTE1NTYzOCw2ICsxNjU2NjgsMzYgQEAKID4KIDwvbWV0aG9kPgogPC9jbGFzcz4KKzxjbGFzcyBuYW1lPSJMb2FkZXJUZXN0Q2FzZSIKKyBleHRlbmRzPSJhbmRyb2lkLnRlc3QuQW5kcm9pZFRlc3RDYXNlIgorIGFic3RyYWN0PSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8Y29uc3RydWN0b3IgbmFtZT0iTG9hZGVyVGVzdENhc2UiCisgdHlwZT0iYW5kcm9pZC50ZXN0LkxvYWRlclRlc3RDYXNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvY29uc3RydWN0b3I+Cis8bWV0aG9kIG5hbWU9ImdldExvYWRlclJlc3VsdFN5bmNocm9ub3VzbHkiCisgcmV0dXJuPSJUIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJsb2FkZXIiIHR5cGU9ImFuZHJvaWQuY29udGVudC5Mb2FkZXImbHQ7VCZndDsiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzwvY2xhc3M+CiA8Y2xhc3MgbmFtZT0iTW9yZUFzc2VydHMiCiAgZXh0ZW5kcz0iamF2YS5sYW5nLk9iamVjdCIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0xNTg1NTgsNiArMTY4NjE4LDI1IEBACiA8cGFyYW1ldGVyIG5hbWU9ImZhY3RvcnkiIHR5cGU9ImFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlLlNRTGl0ZURhdGFiYXNlLkN1cnNvckZhY3RvcnkiPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ib3Blbk9yQ3JlYXRlRGF0YWJhc2UiCisgcmV0dXJuPSJhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZS5TUUxpdGVEYXRhYmFzZSIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iZmlsZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ibW9kZSIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJmYWN0b3J5IiB0eXBlPSJhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZS5TUUxpdGVEYXRhYmFzZS5DdXJzb3JGYWN0b3J5Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJlcnJvckhhbmRsZXIiIHR5cGU9ImFuZHJvaWQuZGF0YWJhc2UuRGF0YWJhc2VFcnJvckhhbmRsZXIiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0icGVla1dhbGxwYXBlciIKICByZXR1cm49ImFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuRHJhd2FibGUiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMTU4OTAyLDE3ICsxNjg5ODEsNiBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvY29uc3RydWN0b3I+Ci08bWV0aG9kIG5hbWU9ImFib3J0VXBkYXRlcyIKLSByZXR1cm49InZvaWQiCi0gYWJzdHJhY3Q9ImZhbHNlIgotIG5hdGl2ZT0iZmFsc2UiCi0gc3luY2hyb25pemVkPSJmYWxzZSIKLSBzdGF0aWM9ImZhbHNlIgotIGZpbmFsPSJmYWxzZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKLSB2aXNpYmlsaXR5PSJwdWJsaWMiCi0+Ci08L21ldGhvZD4KIDxtZXRob2QgbmFtZT0iY2xvc2UiCiAgcmV0dXJuPSJ2b2lkIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTE1ODkyNCwzMCArMTY4OTkyLDYgQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L21ldGhvZD4KLTxtZXRob2QgbmFtZT0iY29tbWl0VXBkYXRlcyIKLSByZXR1cm49ImJvb2xlYW4iCi0gYWJzdHJhY3Q9ImZhbHNlIgotIG5hdGl2ZT0iZmFsc2UiCi0gc3luY2hyb25pemVkPSJmYWxzZSIKLSBzdGF0aWM9ImZhbHNlIgotIGZpbmFsPSJmYWxzZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKLSB2aXNpYmlsaXR5PSJwdWJsaWMiCi0+Ci08L21ldGhvZD4KLTxtZXRob2QgbmFtZT0iY29tbWl0VXBkYXRlcyIKLSByZXR1cm49ImJvb2xlYW4iCi0gYWJzdHJhY3Q9ImZhbHNlIgotIG5hdGl2ZT0iZmFsc2UiCi0gc3luY2hyb25pemVkPSJmYWxzZSIKLSBzdGF0aWM9ImZhbHNlIgotIGZpbmFsPSJmYWxzZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKLSB2aXNpYmlsaXR5PSJwdWJsaWMiCi0+Ci08cGFyYW1ldGVyIG5hbWU9InZhbHVlcyIgdHlwZT0iamF2YS51dGlsLk1hcCZsdDs/IGV4dGVuZHMgamF2YS5sYW5nLkxvbmcsID8gZXh0ZW5kcyBqYXZhLnV0aWwuTWFwJmx0O2phdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5PYmplY3QmZ3Q7Jmd0OyI+Ci08L3BhcmFtZXRlcj4KLTwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJjb3B5U3RyaW5nVG9CdWZmZXIiCiAgcmV0dXJuPSJ2b2lkIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTE1ODk3NCwxNyArMTY5MDE4LDYgQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L21ldGhvZD4KLTxtZXRob2QgbmFtZT0iZGVsZXRlUm93IgotIHJldHVybj0iYm9vbGVhbiIKLSBhYnN0cmFjdD0iZmFsc2UiCi0gbmF0aXZlPSJmYWxzZSIKLSBzeW5jaHJvbml6ZWQ9ImZhbHNlIgotIHN0YXRpYz0iZmFsc2UiCi0gZmluYWw9ImZhbHNlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgotIHZpc2liaWxpdHk9InB1YmxpYyIKLT4KLTwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJnZXRCbG9iIgogIHJldHVybj0iYnl0ZVtdIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTE1OTE3MCw4ICsxNjkyMDMsOCBAQAogPHBhcmFtZXRlciBuYW1lPSJjb2x1bW5JbmRleCIgdHlwZT0iaW50Ij4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+Ci08bWV0aG9kIG5hbWU9ImdldFdhbnRzQWxsT25Nb3ZlQ2FsbHMiCi0gcmV0dXJuPSJib29sZWFuIgorPG1ldGhvZCBuYW1lPSJnZXRUeXBlIgorIHJldHVybj0iaW50IgogIGFic3RyYWN0PSJmYWxzZSIKICBuYXRpdmU9ImZhbHNlIgogIHN5bmNocm9uaXplZD0iZmFsc2UiCkBAIC0xNTkxODAsOCArMTY5MjEzLDEwIEBACiAgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCiAgdmlzaWJpbGl0eT0icHVibGljIgogPgorPHBhcmFtZXRlciBuYW1lPSJjb2x1bW5JbmRleCIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgogPC9tZXRob2Q+Ci08bWV0aG9kIG5hbWU9Imhhc1VwZGF0ZXMiCis8bWV0aG9kIG5hbWU9ImdldFdhbnRzQWxsT25Nb3ZlQ2FsbHMiCiAgcmV0dXJuPSJib29sZWFuIgogIGFic3RyYWN0PSJmYWxzZSIKICBuYXRpdmU9ImZhbHNlIgpAQCAtMTU5Mzk1LDE3ICsxNjk0MzAsNiBAQAogPHBhcmFtZXRlciBuYW1lPSJ1cmkiIHR5cGU9ImFuZHJvaWQubmV0LlVyaSI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgotPG1ldGhvZCBuYW1lPSJzdXBwb3J0c1VwZGF0ZXMiCi0gcmV0dXJuPSJib29sZWFuIgotIGFic3RyYWN0PSJmYWxzZSIKLSBuYXRpdmU9ImZhbHNlIgotIHN5bmNocm9uaXplZD0iZmFsc2UiCi0gc3RhdGljPSJmYWxzZSIKLSBmaW5hbD0iZmFsc2UiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCi0gdmlzaWJpbGl0eT0icHVibGljIgotPgotPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9InVucmVnaXN0ZXJDb250ZW50T2JzZXJ2ZXIiCiAgcmV0dXJuPSJ2b2lkIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTE1OTQzMiwxMjQgKzE2OTQ1Niw2IEBACiA8cGFyYW1ldGVyIG5hbWU9Im9ic2VydmVyIiB0eXBlPSJhbmRyb2lkLmRhdGFiYXNlLkRhdGFTZXRPYnNlcnZlciI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgotPG1ldGhvZCBuYW1lPSJ1cGRhdGVCbG9iIgotIHJldHVybj0iYm9vbGVhbiIKLSBhYnN0cmFjdD0iZmFsc2UiCi0gbmF0aXZlPSJmYWxzZSIKLSBzeW5jaHJvbml6ZWQ9ImZhbHNlIgotIHN0YXRpYz0iZmFsc2UiCi0gZmluYWw9ImZhbHNlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgotIHZpc2liaWxpdHk9InB1YmxpYyIKLT4KLTxwYXJhbWV0ZXIgbmFtZT0iY29sdW1uSW5kZXgiIHR5cGU9ImludCI+Ci08L3BhcmFtZXRlcj4KLTxwYXJhbWV0ZXIgbmFtZT0idmFsdWUiIHR5cGU9ImJ5dGVbXSI+Ci08L3BhcmFtZXRlcj4KLTwvbWV0aG9kPgotPG1ldGhvZCBuYW1lPSJ1cGRhdGVEb3VibGUiCi0gcmV0dXJuPSJib29sZWFuIgotIGFic3RyYWN0PSJmYWxzZSIKLSBuYXRpdmU9ImZhbHNlIgotIHN5bmNocm9uaXplZD0iZmFsc2UiCi0gc3RhdGljPSJmYWxzZSIKLSBmaW5hbD0iZmFsc2UiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCi0gdmlzaWJpbGl0eT0icHVibGljIgotPgotPHBhcmFtZXRlciBuYW1lPSJjb2x1bW5JbmRleCIgdHlwZT0iaW50Ij4KLTwvcGFyYW1ldGVyPgotPHBhcmFtZXRlciBuYW1lPSJ2YWx1ZSIgdHlwZT0iZG91YmxlIj4KLTwvcGFyYW1ldGVyPgotPC9tZXRob2Q+Ci08bWV0aG9kIG5hbWU9InVwZGF0ZUZsb2F0IgotIHJldHVybj0iYm9vbGVhbiIKLSBhYnN0cmFjdD0iZmFsc2UiCi0gbmF0aXZlPSJmYWxzZSIKLSBzeW5jaHJvbml6ZWQ9ImZhbHNlIgotIHN0YXRpYz0iZmFsc2UiCi0gZmluYWw9ImZhbHNlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgotIHZpc2liaWxpdHk9InB1YmxpYyIKLT4KLTxwYXJhbWV0ZXIgbmFtZT0iY29sdW1uSW5kZXgiIHR5cGU9ImludCI+Ci08L3BhcmFtZXRlcj4KLTxwYXJhbWV0ZXIgbmFtZT0idmFsdWUiIHR5cGU9ImZsb2F0Ij4KLTwvcGFyYW1ldGVyPgotPC9tZXRob2Q+Ci08bWV0aG9kIG5hbWU9InVwZGF0ZUludCIKLSByZXR1cm49ImJvb2xlYW4iCi0gYWJzdHJhY3Q9ImZhbHNlIgotIG5hdGl2ZT0iZmFsc2UiCi0gc3luY2hyb25pemVkPSJmYWxzZSIKLSBzdGF0aWM9ImZhbHNlIgotIGZpbmFsPSJmYWxzZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKLSB2aXNpYmlsaXR5PSJwdWJsaWMiCi0+Ci08cGFyYW1ldGVyIG5hbWU9ImNvbHVtbkluZGV4IiB0eXBlPSJpbnQiPgotPC9wYXJhbWV0ZXI+Ci08cGFyYW1ldGVyIG5hbWU9InZhbHVlIiB0eXBlPSJpbnQiPgotPC9wYXJhbWV0ZXI+Ci08L21ldGhvZD4KLTxtZXRob2QgbmFtZT0idXBkYXRlTG9uZyIKLSByZXR1cm49ImJvb2xlYW4iCi0gYWJzdHJhY3Q9ImZhbHNlIgotIG5hdGl2ZT0iZmFsc2UiCi0gc3luY2hyb25pemVkPSJmYWxzZSIKLSBzdGF0aWM9ImZhbHNlIgotIGZpbmFsPSJmYWxzZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKLSB2aXNpYmlsaXR5PSJwdWJsaWMiCi0+Ci08cGFyYW1ldGVyIG5hbWU9ImNvbHVtbkluZGV4IiB0eXBlPSJpbnQiPgotPC9wYXJhbWV0ZXI+Ci08cGFyYW1ldGVyIG5hbWU9InZhbHVlIiB0eXBlPSJsb25nIj4KLTwvcGFyYW1ldGVyPgotPC9tZXRob2Q+Ci08bWV0aG9kIG5hbWU9InVwZGF0ZVNob3J0IgotIHJldHVybj0iYm9vbGVhbiIKLSBhYnN0cmFjdD0iZmFsc2UiCi0gbmF0aXZlPSJmYWxzZSIKLSBzeW5jaHJvbml6ZWQ9ImZhbHNlIgotIHN0YXRpYz0iZmFsc2UiCi0gZmluYWw9ImZhbHNlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgotIHZpc2liaWxpdHk9InB1YmxpYyIKLT4KLTxwYXJhbWV0ZXIgbmFtZT0iY29sdW1uSW5kZXgiIHR5cGU9ImludCI+Ci08L3BhcmFtZXRlcj4KLTxwYXJhbWV0ZXIgbmFtZT0idmFsdWUiIHR5cGU9InNob3J0Ij4KLTwvcGFyYW1ldGVyPgotPC9tZXRob2Q+Ci08bWV0aG9kIG5hbWU9InVwZGF0ZVN0cmluZyIKLSByZXR1cm49ImJvb2xlYW4iCi0gYWJzdHJhY3Q9ImZhbHNlIgotIG5hdGl2ZT0iZmFsc2UiCi0gc3luY2hyb25pemVkPSJmYWxzZSIKLSBzdGF0aWM9ImZhbHNlIgotIGZpbmFsPSJmYWxzZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKLSB2aXNpYmlsaXR5PSJwdWJsaWMiCi0+Ci08cGFyYW1ldGVyIG5hbWU9ImNvbHVtbkluZGV4IiB0eXBlPSJpbnQiPgotPC9wYXJhbWV0ZXI+Ci08cGFyYW1ldGVyIG5hbWU9InZhbHVlIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KLTwvcGFyYW1ldGVyPgotPC9tZXRob2Q+Ci08bWV0aG9kIG5hbWU9InVwZGF0ZVRvTnVsbCIKLSByZXR1cm49ImJvb2xlYW4iCi0gYWJzdHJhY3Q9ImZhbHNlIgotIG5hdGl2ZT0iZmFsc2UiCi0gc3luY2hyb25pemVkPSJmYWxzZSIKLSBzdGF0aWM9ImZhbHNlIgotIGZpbmFsPSJmYWxzZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKLSB2aXNpYmlsaXR5PSJwdWJsaWMiCi0+Ci08cGFyYW1ldGVyIG5hbWU9ImNvbHVtbkluZGV4IiB0eXBlPSJpbnQiPgotPC9wYXJhbWV0ZXI+Ci08L21ldGhvZD4KIDwvY2xhc3M+CiA8Y2xhc3MgbmFtZT0iTW9ja0RpYWxvZ0ludGVyZmFjZSIKICBleHRlbmRzPSJqYXZhLmxhbmcuT2JqZWN0IgpAQCAtMTYxNzAyLDE1ICsxNzE2MDgsMjMgQEAKIDwvY2xhc3M+CiA8Y2xhc3MgbmFtZT0iQ2xpcGJvYXJkTWFuYWdlciIKICBleHRlbmRzPSJqYXZhLmxhbmcuT2JqZWN0IgotIGFic3RyYWN0PSJmYWxzZSIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxjb25zdHJ1Y3RvciBuYW1lPSJDbGlwYm9hcmRNYW5hZ2VyIgorIHR5cGU9ImFuZHJvaWQudGV4dC5DbGlwYm9hcmRNYW5hZ2VyIgogIHN0YXRpYz0iZmFsc2UiCiAgZmluYWw9ImZhbHNlIgogIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KKzwvY29uc3RydWN0b3I+CiA8bWV0aG9kIG5hbWU9ImdldFRleHQiCiAgcmV0dXJuPSJqYXZhLmxhbmcuQ2hhclNlcXVlbmNlIgotIGFic3RyYWN0PSJmYWxzZSIKKyBhYnN0cmFjdD0idHJ1ZSIKICBuYXRpdmU9ImZhbHNlIgogIHN5bmNocm9uaXplZD0iZmFsc2UiCiAgc3RhdGljPSJmYWxzZSIKQEAgLTE2MTcyMSw3ICsxNzE2MzUsNyBAQAogPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9Imhhc1RleHQiCiAgcmV0dXJuPSJib29sZWFuIgotIGFic3RyYWN0PSJmYWxzZSIKKyBhYnN0cmFjdD0idHJ1ZSIKICBuYXRpdmU9ImZhbHNlIgogIHN5bmNocm9uaXplZD0iZmFsc2UiCiAgc3RhdGljPSJmYWxzZSIKQEAgLTE2MTczMiw3ICsxNzE2NDYsNyBAQAogPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9InNldFRleHQiCiAgcmV0dXJuPSJ2b2lkIgotIGFic3RyYWN0PSJmYWxzZSIKKyBhYnN0cmFjdD0idHJ1ZSIKICBuYXRpdmU9ImZhbHNlIgogIHN5bmNocm9uaXplZD0iZmFsc2UiCiAgc3RhdGljPSJmYWxzZSIKQEAgLTE2NDU1Nyw2ICsxNzQ0NzEsMjkgQEAKIDxwYXJhbWV0ZXIgbmFtZT0ia2luZCIgdHlwZT0iamF2YS5sYW5nLkNsYXNzJmx0O1QmZ3Q7Ij4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldFRleHRSdW5DdXJzb3IiCisgcmV0dXJuPSJpbnQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImNvbnRleHRTdGFydCIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJjb250ZXh0RW5kIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImZsYWdzIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9Im9mZnNldCIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJjdXJzb3JPcHQiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0icCIgdHlwZT0iYW5kcm9pZC5ncmFwaGljcy5QYWludCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJpbnNlcnQiCiAgcmV0dXJuPSJhbmRyb2lkLnRleHQuU3Bhbm5hYmxlU3RyaW5nQnVpbGRlciIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0xNjU2MTcsNyArMTc1NTU0LDcgQEAKID4KIDxwYXJhbWV0ZXIgbmFtZT0idGV4dCIgdHlwZT0iamF2YS5sYW5nLkNoYXJTZXF1ZW5jZSI+CiA8L3BhcmFtZXRlcj4KLTxwYXJhbWV0ZXIgbmFtZT0icCIgdHlwZT0iYW5kcm9pZC50ZXh0LlRleHRQYWludCI+Cis8cGFyYW1ldGVyIG5hbWU9InBhaW50IiB0eXBlPSJhbmRyb2lkLnRleHQuVGV4dFBhaW50Ij4KIDwvcGFyYW1ldGVyPgogPHBhcmFtZXRlciBuYW1lPSJhdmFpbCIgdHlwZT0iZmxvYXQiPgogPC9wYXJhbWV0ZXI+CkBAIC0xNzQwMTcsNiArMTgzOTU0LDE4IEBACiAgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCiAgdmlzaWJpbGl0eT0icHVibGljIgogPgorPHBhcmFtZXRlciBuYW1lPSJuYW1lIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJjYXVzZSIgdHlwZT0iamF2YS5sYW5nLlRocm93YWJsZSI+Cis8L3BhcmFtZXRlcj4KKzwvY29uc3RydWN0b3I+Cis8Y29uc3RydWN0b3IgbmFtZT0iQW5kcm9pZEV4Y2VwdGlvbiIKKyB0eXBlPSJhbmRyb2lkLnV0aWwuQW5kcm9pZEV4Y2VwdGlvbiIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+CiA8cGFyYW1ldGVyIG5hbWU9ImNhdXNlIiB0eXBlPSJqYXZhLmxhbmcuRXhjZXB0aW9uIj4KIDwvcGFyYW1ldGVyPgogPC9jb25zdHJ1Y3Rvcj4KQEAgLTE3NDA1NCw2ICsxODQwMDMsMTggQEAKICBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+Cis8cGFyYW1ldGVyIG5hbWU9Im5hbWUiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImNhdXNlIiB0eXBlPSJqYXZhLmxhbmcuVGhyb3dhYmxlIj4KKzwvcGFyYW1ldGVyPgorPC9jb25zdHJ1Y3Rvcj4KKzxjb25zdHJ1Y3RvciBuYW1lPSJBbmRyb2lkUnVudGltZUV4Y2VwdGlvbiIKKyB0eXBlPSJhbmRyb2lkLnV0aWwuQW5kcm9pZFJ1bnRpbWVFeGNlcHRpb24iCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgogPHBhcmFtZXRlciBuYW1lPSJjYXVzZSIgdHlwZT0iamF2YS5sYW5nLkV4Y2VwdGlvbiI+CiA8L3BhcmFtZXRlcj4KIDwvY29uc3RydWN0b3I+CkBAIC0xNzUwNjIsNyArMTg1MDIzLDcgQEAKICBhYnN0cmFjdD0iZmFsc2UiCiAgc3RhdGljPSJmYWxzZSIKICBmaW5hbD0iZmFsc2UiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgZGVwcmVjYXRlZD0iZGVwcmVjYXRlZCIKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8Y29uc3RydWN0b3IgbmFtZT0iRXZlbnRMb2dUYWdzIgpAQCAtMTc1MjE3LDYgKzE4NTE3OCw0ODMgQEAKIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+CiA8L2NsYXNzPgorPGNsYXNzIG5hbWU9Ikpzb25SZWFkZXIiCisgZXh0ZW5kcz0iamF2YS5sYW5nLk9iamVjdCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8aW1wbGVtZW50cyBuYW1lPSJqYXZhLmlvLkNsb3NlYWJsZSI+Cis8L2ltcGxlbWVudHM+Cis8Y29uc3RydWN0b3IgbmFtZT0iSnNvblJlYWRlciIKKyB0eXBlPSJhbmRyb2lkLnV0aWwuSnNvblJlYWRlciIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImluIiB0eXBlPSJqYXZhLmlvLlJlYWRlciI+Cis8L3BhcmFtZXRlcj4KKzwvY29uc3RydWN0b3I+Cis8bWV0aG9kIG5hbWU9ImJlZ2luQXJyYXkiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPGV4Y2VwdGlvbiBuYW1lPSJJT0V4Y2VwdGlvbiIgdHlwZT0iamF2YS5pby5JT0V4Y2VwdGlvbiI+Cis8L2V4Y2VwdGlvbj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJiZWdpbk9iamVjdCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8ZXhjZXB0aW9uIG5hbWU9IklPRXhjZXB0aW9uIiB0eXBlPSJqYXZhLmlvLklPRXhjZXB0aW9uIj4KKzwvZXhjZXB0aW9uPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImNsb3NlIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxleGNlcHRpb24gbmFtZT0iSU9FeGNlcHRpb24iIHR5cGU9ImphdmEuaW8uSU9FeGNlcHRpb24iPgorPC9leGNlcHRpb24+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZW5kQXJyYXkiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPGV4Y2VwdGlvbiBuYW1lPSJJT0V4Y2VwdGlvbiIgdHlwZT0iamF2YS5pby5JT0V4Y2VwdGlvbiI+Cis8L2V4Y2VwdGlvbj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJlbmRPYmplY3QiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPGV4Y2VwdGlvbiBuYW1lPSJJT0V4Y2VwdGlvbiIgdHlwZT0iamF2YS5pby5JT0V4Y2VwdGlvbiI+Cis8L2V4Y2VwdGlvbj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJoYXNOZXh0IgorIHJldHVybj0iYm9vbGVhbiIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxleGNlcHRpb24gbmFtZT0iSU9FeGNlcHRpb24iIHR5cGU9ImphdmEuaW8uSU9FeGNlcHRpb24iPgorPC9leGNlcHRpb24+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ibmV4dEJvb2xlYW4iCisgcmV0dXJuPSJib29sZWFuIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPGV4Y2VwdGlvbiBuYW1lPSJJT0V4Y2VwdGlvbiIgdHlwZT0iamF2YS5pby5JT0V4Y2VwdGlvbiI+Cis8L2V4Y2VwdGlvbj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJuZXh0RG91YmxlIgorIHJldHVybj0iZG91YmxlIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPGV4Y2VwdGlvbiBuYW1lPSJJT0V4Y2VwdGlvbiIgdHlwZT0iamF2YS5pby5JT0V4Y2VwdGlvbiI+Cis8L2V4Y2VwdGlvbj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJuZXh0SW50IgorIHJldHVybj0iaW50IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPGV4Y2VwdGlvbiBuYW1lPSJJT0V4Y2VwdGlvbiIgdHlwZT0iamF2YS5pby5JT0V4Y2VwdGlvbiI+Cis8L2V4Y2VwdGlvbj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJuZXh0TG9uZyIKKyByZXR1cm49ImxvbmciCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8ZXhjZXB0aW9uIG5hbWU9IklPRXhjZXB0aW9uIiB0eXBlPSJqYXZhLmlvLklPRXhjZXB0aW9uIj4KKzwvZXhjZXB0aW9uPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9Im5leHROYW1lIgorIHJldHVybj0iamF2YS5sYW5nLlN0cmluZyIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxleGNlcHRpb24gbmFtZT0iSU9FeGNlcHRpb24iIHR5cGU9ImphdmEuaW8uSU9FeGNlcHRpb24iPgorPC9leGNlcHRpb24+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ibmV4dE51bGwiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPGV4Y2VwdGlvbiBuYW1lPSJJT0V4Y2VwdGlvbiIgdHlwZT0iamF2YS5pby5JT0V4Y2VwdGlvbiI+Cis8L2V4Y2VwdGlvbj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJuZXh0U3RyaW5nIgorIHJldHVybj0iamF2YS5sYW5nLlN0cmluZyIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxleGNlcHRpb24gbmFtZT0iSU9FeGNlcHRpb24iIHR5cGU9ImphdmEuaW8uSU9FeGNlcHRpb24iPgorPC9leGNlcHRpb24+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0icGVlayIKKyByZXR1cm49ImFuZHJvaWQudXRpbC5Kc29uVG9rZW4iCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8ZXhjZXB0aW9uIG5hbWU9IklPRXhjZXB0aW9uIiB0eXBlPSJqYXZhLmlvLklPRXhjZXB0aW9uIj4KKzwvZXhjZXB0aW9uPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldExlbmllbnQiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJsZW5pZW50IiB0eXBlPSJib29sZWFuIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNraXBWYWx1ZSIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8ZXhjZXB0aW9uIG5hbWU9IklPRXhjZXB0aW9uIiB0eXBlPSJqYXZhLmlvLklPRXhjZXB0aW9uIj4KKzwvZXhjZXB0aW9uPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InN5bnRheEVycm9yIgorIHJldHVybj0iamF2YS5pby5JT0V4Y2VwdGlvbiIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0ibWVzc2FnZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzxleGNlcHRpb24gbmFtZT0iSU9FeGNlcHRpb24iIHR5cGU9ImphdmEuaW8uSU9FeGNlcHRpb24iPgorPC9leGNlcHRpb24+Cis8L21ldGhvZD4KKzwvY2xhc3M+Cis8Y2xhc3MgbmFtZT0iSnNvblRva2VuIgorIGV4dGVuZHM9ImphdmEubGFuZy5FbnVtIgorIGFic3RyYWN0PSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxtZXRob2QgbmFtZT0idmFsdWVPZiIKKyByZXR1cm49ImFuZHJvaWQudXRpbC5Kc29uVG9rZW4iCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0ibmFtZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJ2YWx1ZXMiCisgcmV0dXJuPSJhbmRyb2lkLnV0aWwuSnNvblRva2VuW10iCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8L2NsYXNzPgorPGNsYXNzIG5hbWU9Ikpzb25Xcml0ZXIiCisgZXh0ZW5kcz0iamF2YS5sYW5nLk9iamVjdCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8aW1wbGVtZW50cyBuYW1lPSJqYXZhLmlvLkNsb3NlYWJsZSI+Cis8L2ltcGxlbWVudHM+Cis8Y29uc3RydWN0b3IgbmFtZT0iSnNvbldyaXRlciIKKyB0eXBlPSJhbmRyb2lkLnV0aWwuSnNvbldyaXRlciIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9Im91dCIgdHlwZT0iamF2YS5pby5Xcml0ZXIiPgorPC9wYXJhbWV0ZXI+Cis8L2NvbnN0cnVjdG9yPgorPG1ldGhvZCBuYW1lPSJiZWdpbkFycmF5IgorIHJldHVybj0iYW5kcm9pZC51dGlsLkpzb25Xcml0ZXIiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8ZXhjZXB0aW9uIG5hbWU9IklPRXhjZXB0aW9uIiB0eXBlPSJqYXZhLmlvLklPRXhjZXB0aW9uIj4KKzwvZXhjZXB0aW9uPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImJlZ2luT2JqZWN0IgorIHJldHVybj0iYW5kcm9pZC51dGlsLkpzb25Xcml0ZXIiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8ZXhjZXB0aW9uIG5hbWU9IklPRXhjZXB0aW9uIiB0eXBlPSJqYXZhLmlvLklPRXhjZXB0aW9uIj4KKzwvZXhjZXB0aW9uPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImNsb3NlIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxleGNlcHRpb24gbmFtZT0iSU9FeGNlcHRpb24iIHR5cGU9ImphdmEuaW8uSU9FeGNlcHRpb24iPgorPC9leGNlcHRpb24+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZW5kQXJyYXkiCisgcmV0dXJuPSJhbmRyb2lkLnV0aWwuSnNvbldyaXRlciIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxleGNlcHRpb24gbmFtZT0iSU9FeGNlcHRpb24iIHR5cGU9ImphdmEuaW8uSU9FeGNlcHRpb24iPgorPC9leGNlcHRpb24+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZW5kT2JqZWN0IgorIHJldHVybj0iYW5kcm9pZC51dGlsLkpzb25Xcml0ZXIiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8ZXhjZXB0aW9uIG5hbWU9IklPRXhjZXB0aW9uIiB0eXBlPSJqYXZhLmlvLklPRXhjZXB0aW9uIj4KKzwvZXhjZXB0aW9uPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImZsdXNoIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxleGNlcHRpb24gbmFtZT0iSU9FeGNlcHRpb24iIHR5cGU9ImphdmEuaW8uSU9FeGNlcHRpb24iPgorPC9leGNlcHRpb24+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ibmFtZSIKKyByZXR1cm49ImFuZHJvaWQudXRpbC5Kc29uV3JpdGVyIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJuYW1lIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPGV4Y2VwdGlvbiBuYW1lPSJJT0V4Y2VwdGlvbiIgdHlwZT0iamF2YS5pby5JT0V4Y2VwdGlvbiI+Cis8L2V4Y2VwdGlvbj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJudWxsVmFsdWUiCisgcmV0dXJuPSJhbmRyb2lkLnV0aWwuSnNvbldyaXRlciIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxleGNlcHRpb24gbmFtZT0iSU9FeGNlcHRpb24iIHR5cGU9ImphdmEuaW8uSU9FeGNlcHRpb24iPgorPC9leGNlcHRpb24+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0SW5kZW50IgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iaW5kZW50IiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InZhbHVlIgorIHJldHVybj0iYW5kcm9pZC51dGlsLkpzb25Xcml0ZXIiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InZhbHVlIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPGV4Y2VwdGlvbiBuYW1lPSJJT0V4Y2VwdGlvbiIgdHlwZT0iamF2YS5pby5JT0V4Y2VwdGlvbiI+Cis8L2V4Y2VwdGlvbj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJ2YWx1ZSIKKyByZXR1cm49ImFuZHJvaWQudXRpbC5Kc29uV3JpdGVyIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJ2YWx1ZSIgdHlwZT0iYm9vbGVhbiI+Cis8L3BhcmFtZXRlcj4KKzxleGNlcHRpb24gbmFtZT0iSU9FeGNlcHRpb24iIHR5cGU9ImphdmEuaW8uSU9FeGNlcHRpb24iPgorPC9leGNlcHRpb24+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0idmFsdWUiCisgcmV0dXJuPSJhbmRyb2lkLnV0aWwuSnNvbldyaXRlciIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0idmFsdWUiIHR5cGU9ImRvdWJsZSI+Cis8L3BhcmFtZXRlcj4KKzxleGNlcHRpb24gbmFtZT0iSU9FeGNlcHRpb24iIHR5cGU9ImphdmEuaW8uSU9FeGNlcHRpb24iPgorPC9leGNlcHRpb24+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0idmFsdWUiCisgcmV0dXJuPSJhbmRyb2lkLnV0aWwuSnNvbldyaXRlciIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0idmFsdWUiIHR5cGU9ImxvbmciPgorPC9wYXJhbWV0ZXI+Cis8ZXhjZXB0aW9uIG5hbWU9IklPRXhjZXB0aW9uIiB0eXBlPSJqYXZhLmlvLklPRXhjZXB0aW9uIj4KKzwvZXhjZXB0aW9uPgorPC9tZXRob2Q+Cis8L2NsYXNzPgogPGNsYXNzIG5hbWU9IkxvZyIKICBleHRlbmRzPSJqYXZhLmxhbmcuT2JqZWN0IgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTE3NTk0Miw3ICsxODYzODAsNyBAQAogIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCiAgdHJhbnNpZW50PSJmYWxzZSIKICB2b2xhdGlsZT0iZmFsc2UiCi0gdmFsdWU9IiZxdW90OygoYWVyb3xhcnBhfGFzaWF8YVtjZGVmZ2lsbW5vcXJzdHV3eHpdKXwoYml6fGJbYWJkZWZnaGlqbW5vcnN0dnd5el0pfChjYXR8Y29tfGNvb3B8Y1thY2RmZ2hpa2xtbm9ydXZ4eXpdKXxkW2Vqa21vel18KGVkdXxlW2NlZ3JzdHVdKXxmW2lqa21vcl18KGdvdnxnW2FiZGVmZ2hpbG1ucHFyc3R1d3ldKXxoW2ttbnJ0dV18KGluZm98aW50fGlbZGVsbW5vcXJzdF0pfChqb2JzfGpbZW1vcF0pfGtbZWdoaW1ucHJ3eXpdfGxbYWJjaWtyc3R1dnldfChtaWx8bW9iaXxtdXNldW18bVthY2RlZ2hrbG1ub3BxcnN0dXZ3eHl6XSl8KG5hbWV8bmV0fG5bYWNlZmdpbG9wcnV6XSl8KG9yZ3xvbSl8KHByb3xwW2FlZmdoa2xtbnJzdHd5XSl8cWF8cltlb3N1d118c1thYmNkZWdoaWprbG1ub3J0dXZ5el18KHRlbHx0cmF2ZWx8dFtjZGZnaGprbG1ub3BydHZ3el0pfHVbYWdrc3l6XXx2W2FjZWdpbnVdfHdbZnNdfCh4blxcLVxcLTB6d201NmR8eG5cXC1cXC0xMWI1YnMzYTlhajZnfHhuXFwtXFwtODBha2hieWtuajRmfHhuXFwtXFwtOXQ0YjExeWk1YXx4blxcLVxcLWRlYmEwYWR8eG5cXC1cXC1nNncyNTFkfHhuXFwtXFwtaGdiazZhajdmNTNiYmF8eG5cXC1cXC1obGNqNmF5YTllc2M3YXx4blxcLVxcLWp4YWxwZGxwfHhuXFwtXFwta2diZWNodHZ8eG5cXC1cXC16Y2t6YWgpfHlbZXR1XXx6W2Ftd10pJnF1b3Q7IgorIHZhbHVlPSImcXVvdDsoKGFlcm98YXJwYXxhc2lhfGFbY2RlZmdpbG1ub3Fyc3R1d3h6XSl8KGJpenxiW2FiZGVmZ2hpam1ub3JzdHZ3eXpdKXwoY2F0fGNvbXxjb29wfGNbYWNkZmdoaWtsbW5vcnV2eHl6XSl8ZFtlamttb3pdfChlZHV8ZVtjZWdyc3R1XSl8Zltpamttb3JdfChnb3Z8Z1thYmRlZmdoaWxtbnBxcnN0dXd5XSl8aFtrbW5ydHVdfChpbmZvfGludHxpW2RlbG1ub3Fyc3RdKXwoam9ic3xqW2Vtb3BdKXxrW2VnaGltbnByd3l6XXxsW2FiY2lrcnN0dXZ5XXwobWlsfG1vYml8bXVzZXVtfG1bYWNkZWdoa2xtbm9wcXJzdHV2d3h5el0pfChuYW1lfG5ldHxuW2FjZWZnaWxvcHJ1el0pfChvcmd8b20pfChwcm98cFthZWZnaGtsbW5yc3R3eV0pfHFhfHJbZW9zdXddfHNbYWJjZGVnaGlqa2xtbm9ydHV2eXpdfCh0ZWx8dHJhdmVsfHRbY2RmZ2hqa2xtbm9wcnR2d3pdKXx1W2Fna3N5el18dlthY2VnaW51XXx3W2ZzXXwoeG5cXC1cXC0wendtNTZkfHhuXFwtXFwtMTFiNWJzM2E5YWo2Z3x4blxcLVxcLTgwYWtoYnlrbmo0Znx4blxcLVxcLTl0NGIxMXlpNWF8eG5cXC1cXC1kZWJhMGFkfHhuXFwtXFwtZzZ3MjUxZHx4blxcLVxcLWhnYms2YWo3ZjUzYmJhfHhuXFwtXFwtaGxjajZheWE5ZXNjN2F8eG5cXC1cXC1qeGFscGRscHx4blxcLVxcLWtnYmVjaHR2fHhuXFwtXFwtbWdiYWFtN2E4aHx4blxcLVxcLW1nYmVycDRhNWQ0YXJ8eG5cXC1cXC13Z2JoMWN8eG5cXC1cXC16Y2t6YWgpfHlbZXRdfHpbYW13XSkmcXVvdDsiCiAgc3RhdGljPSJ0cnVlIgogIGZpbmFsPSJ0cnVlIgogIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgpAQCAtMTc1OTUzLDcgKzE4NjM5MSw3IEBACiAgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKICB0cmFuc2llbnQ9ImZhbHNlIgogIHZvbGF0aWxlPSJmYWxzZSIKLSB2YWx1ZT0iJnF1b3Q7KD86KD86YWVyb3xhcnBhfGFzaWF8YVtjZGVmZ2lsbW5vcXJzdHV3eHpdKXwoPzpiaXp8YlthYmRlZmdoaWptbm9yc3R2d3l6XSl8KD86Y2F0fGNvbXxjb29wfGNbYWNkZmdoaWtsbW5vcnV2eHl6XSl8ZFtlamttb3pdfCg/OmVkdXxlW2NlZ3JzdHVdKXxmW2lqa21vcl18KD86Z292fGdbYWJkZWZnaGlsbW5wcXJzdHV3eV0pfGhba21ucnR1XXwoPzppbmZvfGludHxpW2RlbG1ub3Fyc3RdKXwoPzpqb2JzfGpbZW1vcF0pfGtbZWdoaW1ucHJ3eXpdfGxbYWJjaWtyc3R1dnldfCg/Om1pbHxtb2JpfG11c2V1bXxtW2FjZGVnaGtsbW5vcHFyc3R1dnd4eXpdKXwoPzpuYW1lfG5ldHxuW2FjZWZnaWxvcHJ1el0pfCg/Om9yZ3xvbSl8KD86cHJvfHBbYWVmZ2hrbG1ucnN0d3ldKXxxYXxyW2Vvc3V3XXxzW2FiY2RlZ2hpamtsbW5vcnR1dnl6XXwoPzp0ZWx8dHJhdmVsfHRbY2RmZ2hqa2xtbm9wcnR2d3pdKXx1W2Fna3N5el18dlthY2VnaW51XXx3W2ZzXXwoPzp4blxcLVxcLTB6d201NmR8eG5cXC1cXC0xMWI1YnMzYTlhajZnfHhuXFwtXFwtODBha2hieWtuajRmfHhuXFwtXFwtOXQ0YjExeWk1YXx4blxcLVxcLWRlYmEwYWR8eG5cXC1cXC1nNncyNTFkfHhuXFwtXFwtaGdiazZhajdmNTNiYmF8eG5cXC1cXC1obGNqNmF5YTllc2M3YXx4blxcLVxcLWp4YWxwZGxwfHhuXFwtXFwta2diZWNodHZ8eG5cXC1cXC16Y2t6YWgpfHlbZXR1XXx6W2Ftd10pKSZxdW90OyIKKyB2YWx1ZT0iJnF1b3Q7KD86KD86YWVyb3xhcnBhfGFzaWF8YVtjZGVmZ2lsbW5vcXJzdHV3eHpdKXwoPzpiaXp8YlthYmRlZmdoaWptbm9yc3R2d3l6XSl8KD86Y2F0fGNvbXxjb29wfGNbYWNkZmdoaWtsbW5vcnV2eHl6XSl8ZFtlamttb3pdfCg/OmVkdXxlW2NlZ3JzdHVdKXxmW2lqa21vcl18KD86Z292fGdbYWJkZWZnaGlsbW5wcXJzdHV3eV0pfGhba21ucnR1XXwoPzppbmZvfGludHxpW2RlbG1ub3Fyc3RdKXwoPzpqb2JzfGpbZW1vcF0pfGtbZWdoaW1ucHJ3eXpdfGxbYWJjaWtyc3R1dnldfCg/Om1pbHxtb2JpfG11c2V1bXxtW2FjZGVnaGtsbW5vcHFyc3R1dnd4eXpdKXwoPzpuYW1lfG5ldHxuW2FjZWZnaWxvcHJ1el0pfCg/Om9yZ3xvbSl8KD86cHJvfHBbYWVmZ2hrbG1ucnN0d3ldKXxxYXxyW2Vvc3V3XXxzW2FiY2RlZ2hpamtsbW5vcnR1dnl6XXwoPzp0ZWx8dHJhdmVsfHRbY2RmZ2hqa2xtbm9wcnR2d3pdKXx1W2Fna3N5el18dlthY2VnaW51XXx3W2ZzXXwoPzp4blxcLVxcLTB6d201NmR8eG5cXC1cXC0xMWI1YnMzYTlhajZnfHhuXFwtXFwtODBha2hieWtuajRmfHhuXFwtXFwtOXQ0YjExeWk1YXx4blxcLVxcLWRlYmEwYWR8eG5cXC1cXC1nNncyNTFkfHhuXFwtXFwtaGdiazZhajdmNTNiYmF8eG5cXC1cXC1obGNqNmF5YTllc2M3YXx4blxcLVxcLWp4YWxwZGxwfHhuXFwtXFwta2diZWNodHZ8eG5cXC1cXC1tZ2JhYW03YThofHhuXFwtXFwtbWdiZXJwNGE1ZDRhcnx4blxcLVxcLXdnYmgxY3x4blxcLVxcLXpja3phaCl8eVtldF18elthbXddKSkmcXVvdDsiCiAgc3RhdGljPSJ0cnVlIgogIGZpbmFsPSJ0cnVlIgogIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgpAQCAtMTc2MjIwLDYgKzE4NjY1OCwxOSBAQAogPHBhcmFtZXRlciBuYW1lPSJrZXkiIHR5cGU9ImludCI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJyZW1vdmVBdCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImluZGV4IiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0ic2V0VmFsdWVBdCIKICByZXR1cm49InZvaWQiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMTc3ODI1LDYgKzE4ODI3NiwyMzEgQEAKID4KIDwvZmllbGQ+CiA8L2NsYXNzPgorPGNsYXNzIG5hbWU9IkFjdGlvbk1vZGUiCisgZXh0ZW5kcz0iamF2YS5sYW5nLk9iamVjdCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8Y29uc3RydWN0b3IgbmFtZT0iQWN0aW9uTW9kZSIKKyB0eXBlPSJhbmRyb2lkLnZpZXcuQWN0aW9uTW9kZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2NvbnN0cnVjdG9yPgorPG1ldGhvZCBuYW1lPSJmaW5pc2giCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0Q3VzdG9tVmlldyIKKyByZXR1cm49ImFuZHJvaWQudmlldy5WaWV3IgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0TWVudSIKKyByZXR1cm49ImFuZHJvaWQudmlldy5NZW51IgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0TWVudUluZmxhdGVyIgorIHJldHVybj0iYW5kcm9pZC52aWV3Lk1lbnVJbmZsYXRlciIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldFN1YnRpdGxlIgorIHJldHVybj0iamF2YS5sYW5nLkNoYXJTZXF1ZW5jZSIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldFRpdGxlIgorIHJldHVybj0iamF2YS5sYW5nLkNoYXJTZXF1ZW5jZSIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImludmFsaWRhdGUiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0Q3VzdG9tVmlldyIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0idmlldyIgdHlwZT0iYW5kcm9pZC52aWV3LlZpZXciPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0U3VidGl0bGUiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InN1YnRpdGxlIiB0eXBlPSJqYXZhLmxhbmcuQ2hhclNlcXVlbmNlIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldFN1YnRpdGxlIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJyZXNJZCIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldFRpdGxlIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJ0aXRsZSIgdHlwZT0iamF2YS5sYW5nLkNoYXJTZXF1ZW5jZSI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRUaXRsZSIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0icmVzSWQiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPC9jbGFzcz4KKzxpbnRlcmZhY2UgbmFtZT0iQWN0aW9uTW9kZS5DYWxsYmFjayIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxtZXRob2QgbmFtZT0ib25BY3Rpb25JdGVtQ2xpY2tlZCIKKyByZXR1cm49ImJvb2xlYW4iCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0ibW9kZSIgdHlwZT0iYW5kcm9pZC52aWV3LkFjdGlvbk1vZGUiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9Iml0ZW0iIHR5cGU9ImFuZHJvaWQudmlldy5NZW51SXRlbSI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJvbkNyZWF0ZUFjdGlvbk1vZGUiCisgcmV0dXJuPSJib29sZWFuIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9Im1vZGUiIHR5cGU9ImFuZHJvaWQudmlldy5BY3Rpb25Nb2RlIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJtZW51IiB0eXBlPSJhbmRyb2lkLnZpZXcuTWVudSI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJvbkRlc3Ryb3lBY3Rpb25Nb2RlIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJtb2RlIiB0eXBlPSJhbmRyb2lkLnZpZXcuQWN0aW9uTW9kZSI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJvblByZXBhcmVBY3Rpb25Nb2RlIgorIHJldHVybj0iYm9vbGVhbiIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJtb2RlIiB0eXBlPSJhbmRyb2lkLnZpZXcuQWN0aW9uTW9kZSI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ibWVudSIgdHlwZT0iYW5kcm9pZC52aWV3Lk1lbnUiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzwvaW50ZXJmYWNlPgogPGludGVyZmFjZSBuYW1lPSJDb250ZXh0TWVudSIKICBhYnN0cmFjdD0idHJ1ZSIKICBzdGF0aWM9ImZhbHNlIgpAQCAtMTgzMDE2LDYgKzE5MzY5MiwxNyBAQAogIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KKzxtZXRob2QgbmFtZT0iZ2V0QWN0aW9uVmlldyIKKyByZXR1cm49ImFuZHJvaWQudmlldy5WaWV3IgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0iZ2V0QWxwaGFiZXRpY1Nob3J0Y3V0IgogIHJldHVybj0iY2hhciIKICBhYnN0cmFjdD0idHJ1ZSIKQEAgLTE4MzE5Miw2ICsxOTM4NzksMTkgQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0QWN0aW9uVmlldyIKKyByZXR1cm49ImFuZHJvaWQudmlldy5NZW51SXRlbSIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJ2aWV3IiB0eXBlPSJhbmRyb2lkLnZpZXcuVmlldyI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJzZXRBbHBoYWJldGljU2hvcnRjdXQiCiAgcmV0dXJuPSJhbmRyb2lkLnZpZXcuTWVudUl0ZW0iCiAgYWJzdHJhY3Q9InRydWUiCkBAIC0xODMzMjQsNiArMTk0MDI0LDE5IEBACiA8cGFyYW1ldGVyIG5hbWU9ImFscGhhQ2hhciIgdHlwZT0iY2hhciI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRTaG93QXNBY3Rpb24iCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImFjdGlvbkVudW0iIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJzZXRUaXRsZSIKICByZXR1cm49ImFuZHJvaWQudmlldy5NZW51SXRlbSIKICBhYnN0cmFjdD0idHJ1ZSIKQEAgLTE4MzM3Niw2ICsxOTQwODksMzkgQEAKIDxwYXJhbWV0ZXIgbmFtZT0idmlzaWJsZSIgdHlwZT0iYm9vbGVhbiI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgorPGZpZWxkIG5hbWU9IlNIT1dfQVNfQUNUSU9OX0FMV0FZUyIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjIiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iU0hPV19BU19BQ1RJT05fSUZfUk9PTSIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjEiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iU0hPV19BU19BQ1RJT05fTkVWRVIiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIwIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgogPC9pbnRlcmZhY2U+CiA8aW50ZXJmYWNlIG5hbWU9Ik1lbnVJdGVtLk9uTWVudUl0ZW1DbGlja0xpc3RlbmVyIgogIGFic3RyYWN0PSJ0cnVlIgpAQCAtMTg0OTgwLDYgKzE5NTcyNiwyOCBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRDdXJyZW50U3BhblgiCisgcmV0dXJuPSJmbG9hdCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRDdXJyZW50U3BhblkiCisgcmV0dXJuPSJmbG9hdCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJnZXRFdmVudFRpbWUiCiAgcmV0dXJuPSJsb25nIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTE4NTAyNCw2ICsxOTU3OTIsMjggQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0UHJldmlvdXNTcGFuWCIKKyByZXR1cm49ImZsb2F0IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldFByZXZpb3VzU3BhblkiCisgcmV0dXJuPSJmbG9hdCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJnZXRTY2FsZUZhY3RvciIKICByZXR1cm49ImZsb2F0IgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTE4NjYwMyw2ICsxOTczOTMsMTkgQEAKIDxwYXJhbWV0ZXIgbmFtZT0iZm9jdXNhYmxlTW9kZSIgdHlwZT0iaW50Ij4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImFkZE9uTGF5b3V0Q2hhbmdlTGlzdGVuZXIiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJsaXN0ZW5lciIgdHlwZT0iYW5kcm9pZC52aWV3LlZpZXcuT25MYXlvdXRDaGFuZ2VMaXN0ZW5lciI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJhZGRUb3VjaGFibGVzIgogIHJldHVybj0idm9pZCIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0xODY5NTQsNiArMTk3NzU3LDE5IEBACiA8cGFyYW1ldGVyIG5hbWU9ImNvbnRhaW5lciIgdHlwZT0iYW5kcm9pZC51dGlsLlNwYXJzZUFycmF5Jmx0O2FuZHJvaWQub3MuUGFyY2VsYWJsZSZndDsiPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZGlzcGF0Y2hTZXRBY3RpdmF0ZWQiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHJvdGVjdGVkIgorPgorPHBhcmFtZXRlciBuYW1lPSJhY3RpdmF0ZWQiIHR5cGU9ImJvb2xlYW4iPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0iZGlzcGF0Y2hTZXRQcmVzc2VkIgogIHJldHVybj0idm9pZCIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0xODcxNjAsNiArMTk3OTc2LDE3IEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldEFscGhhIgorIHJldHVybj0iZmxvYXQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0iZ2V0QW5pbWF0aW9uIgogIHJldHVybj0iYW5kcm9pZC52aWV3LmFuaW1hdGlvbi5BbmltYXRpb24iCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMTg3NjA0LDYgKzE5ODQzMSwxNyBAQAogPHBhcmFtZXRlciBuYW1lPSJsb2NhdGlvbiIgdHlwZT0iaW50W10iPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0TWF0cml4IgorIHJldHVybj0iYW5kcm9pZC5ncmFwaGljcy5NYXRyaXgiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0iZ2V0TWVhc3VyZWRIZWlnaHQiCiAgcmV0dXJuPSJpbnQiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMTg3NjgxLDggKzE5ODUxOSw4IEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9tZXRob2Q+Ci08bWV0aG9kIG5hbWU9ImdldE92ZXJzY3JvbGxNb2RlIgotIHJldHVybj0iaW50IgorPG1ldGhvZCBuYW1lPSJnZXRPbkxheW91dENoYW5nZUxpc3RlbmVycyIKKyByZXR1cm49ImphdmEudXRpbC5MaXN0Jmx0O2FuZHJvaWQudmlldy5WaWV3Lk9uTGF5b3V0Q2hhbmdlTGlzdGVuZXImZ3Q7IgogIGFic3RyYWN0PSJmYWxzZSIKICBuYXRpdmU9ImZhbHNlIgogIHN5bmNocm9uaXplZD0iZmFsc2UiCkBAIC0xODc3NDcsNiArMTk4NTg1LDI4IEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldFBpdm90WCIKKyByZXR1cm49ImZsb2F0IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldFBpdm90WSIKKyByZXR1cm49ImZsb2F0IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9ImdldFJlc291cmNlcyIKICByZXR1cm49ImFuZHJvaWQuY29udGVudC5yZXMuUmVzb3VyY2VzIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTE4NzgwMiw2ICsxOTg2NjIsNjEgQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0Um90YXRpb24iCisgcmV0dXJuPSJmbG9hdCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRSb3RhdGlvblgiCisgcmV0dXJuPSJmbG9hdCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRSb3RhdGlvblkiCisgcmV0dXJuPSJmbG9hdCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRTY2FsZVgiCisgcmV0dXJuPSJmbG9hdCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRTY2FsZVkiCisgcmV0dXJuPSJmbG9hdCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJnZXRTY3JvbGxCYXJTdHlsZSIKICByZXR1cm49ImludCIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0xODc5NDcsNiArMTk4ODYyLDI4IEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldFRyYW5zbGF0aW9uWCIKKyByZXR1cm49ImZsb2F0IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldFRyYW5zbGF0aW9uWSIKKyByZXR1cm49ImZsb2F0IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9ImdldFZlcnRpY2FsRmFkaW5nRWRnZUxlbmd0aCIKICByZXR1cm49ImludCIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0xODgwNDgsNiArMTk4OTg1LDI4IEBACiA8cGFyYW1ldGVyIG5hbWU9Im91dFJlY3QiIHR5cGU9ImFuZHJvaWQuZ3JhcGhpY3MuUmVjdCI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRYIgorIHJldHVybj0iZmxvYXQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0WSIKKyByZXR1cm49ImZsb2F0IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9Imhhc0ZvY3VzIgogIHJldHVybj0iYm9vbGVhbiIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0xODgxODAsNiArMTk5MTM5LDE3IEBACiA8cGFyYW1ldGVyIG5hbWU9ImRyYXdhYmxlIiB0eXBlPSJhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlIj4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImlzQWN0aXZhdGVkIgorIHJldHVybj0iYm9vbGVhbiIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJpc0NsaWNrYWJsZSIKICByZXR1cm49ImJvb2xlYW4iCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMTg4MjY4LDYgKzE5OTIzOCwxNyBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJpc0hhcmR3YXJlQWNjZWxlcmF0ZWQiCisgcmV0dXJuPSJib29sZWFuIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9ImlzSG9yaXpvbnRhbEZhZGluZ0VkZ2VFbmFibGVkIgogIHJldHVybj0iYm9vbGVhbiIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0xODgzNzgsNiArMTk5MzU5LDE3IEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImlzU2F2ZUZyb21QYXJlbnRFbmFibGVkIgorIHJldHVybj0iYm9vbGVhbiIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJpc1Njcm9sbGJhckZhZGluZ0VuYWJsZWQiCiAgcmV0dXJuPSJib29sZWFuIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTE4ODg0NSwyNSArMTk5ODM3LDYgQEAKIDxwYXJhbWV0ZXIgbmFtZT0iaGVpZ2h0TWVhc3VyZVNwZWMiIHR5cGU9ImludCI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgotPG1ldGhvZCBuYW1lPSJvbk92ZXJzY3JvbGxlZCIKLSByZXR1cm49InZvaWQiCi0gYWJzdHJhY3Q9ImZhbHNlIgotIG5hdGl2ZT0iZmFsc2UiCi0gc3luY2hyb25pemVkPSJmYWxzZSIKLSBzdGF0aWM9ImZhbHNlIgotIGZpbmFsPSJmYWxzZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKLSB2aXNpYmlsaXR5PSJwcm90ZWN0ZWQiCi0+Ci08cGFyYW1ldGVyIG5hbWU9InNjcm9sbFgiIHR5cGU9ImludCI+Ci08L3BhcmFtZXRlcj4KLTxwYXJhbWV0ZXIgbmFtZT0ic2Nyb2xsWSIgdHlwZT0iaW50Ij4KLTwvcGFyYW1ldGVyPgotPHBhcmFtZXRlciBuYW1lPSJjbGFtcGVkWCIgdHlwZT0iYm9vbGVhbiI+Ci08L3BhcmFtZXRlcj4KLTxwYXJhbWV0ZXIgbmFtZT0iY2xhbXBlZFkiIHR5cGU9ImJvb2xlYW4iPgotPC9wYXJhbWV0ZXI+Ci08L21ldGhvZD4KIDxtZXRob2QgbmFtZT0ib25SZXN0b3JlSW5zdGFuY2VTdGF0ZSIKICByZXR1cm49InZvaWQiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMTg5MDE3LDM1ICsxOTk5OTAsNiBAQAogPHBhcmFtZXRlciBuYW1lPSJ2aXNpYmlsaXR5IiB0eXBlPSJpbnQiPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KLTxtZXRob2QgbmFtZT0ib3ZlcnNjcm9sbEJ5IgotIHJldHVybj0iYm9vbGVhbiIKLSBhYnN0cmFjdD0iZmFsc2UiCi0gbmF0aXZlPSJmYWxzZSIKLSBzeW5jaHJvbml6ZWQ9ImZhbHNlIgotIHN0YXRpYz0iZmFsc2UiCi0gZmluYWw9ImZhbHNlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgotIHZpc2liaWxpdHk9InByb3RlY3RlZCIKLT4KLTxwYXJhbWV0ZXIgbmFtZT0iZGVsdGFYIiB0eXBlPSJpbnQiPgotPC9wYXJhbWV0ZXI+Ci08cGFyYW1ldGVyIG5hbWU9ImRlbHRhWSIgdHlwZT0iaW50Ij4KLTwvcGFyYW1ldGVyPgotPHBhcmFtZXRlciBuYW1lPSJzY3JvbGxYIiB0eXBlPSJpbnQiPgotPC9wYXJhbWV0ZXI+Ci08cGFyYW1ldGVyIG5hbWU9InNjcm9sbFkiIHR5cGU9ImludCI+Ci08L3BhcmFtZXRlcj4KLTxwYXJhbWV0ZXIgbmFtZT0ic2Nyb2xsUmFuZ2VYIiB0eXBlPSJpbnQiPgotPC9wYXJhbWV0ZXI+Ci08cGFyYW1ldGVyIG5hbWU9InNjcm9sbFJhbmdlWSIgdHlwZT0iaW50Ij4KLTwvcGFyYW1ldGVyPgotPHBhcmFtZXRlciBuYW1lPSJtYXhPdmVyc2Nyb2xsWCIgdHlwZT0iaW50Ij4KLTwvcGFyYW1ldGVyPgotPHBhcmFtZXRlciBuYW1lPSJtYXhPdmVyc2Nyb2xsWSIgdHlwZT0iaW50Ij4KLTwvcGFyYW1ldGVyPgotPHBhcmFtZXRlciBuYW1lPSJpc1RvdWNoRXZlbnQiIHR5cGU9ImJvb2xlYW4iPgotPC9wYXJhbWV0ZXI+Ci08L21ldGhvZD4KIDxtZXRob2QgbmFtZT0icGVyZm9ybUNsaWNrIgogIHJldHVybj0iYm9vbGVhbiIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0xODkyMjUsNiArMjAwMTY5LDE5IEBACiA8cGFyYW1ldGVyIG5hbWU9ImFjdGlvbiIgdHlwZT0iamF2YS5sYW5nLlJ1bm5hYmxlIj4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InJlbW92ZU9uTGF5b3V0Q2hhbmdlTGlzdGVuZXIiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJsaXN0ZW5lciIgdHlwZT0iYW5kcm9pZC52aWV3LlZpZXcuT25MYXlvdXRDaGFuZ2VMaXN0ZW5lciI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJyZXF1ZXN0Rm9jdXMiCiAgcmV0dXJuPSJib29sZWFuIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTE4OTQyOCw2ICsyMDAzODUsMzIgQEAKIDxwYXJhbWV0ZXIgbmFtZT0iZXZlbnQiIHR5cGU9ImFuZHJvaWQudmlldy5hY2Nlc3NpYmlsaXR5LkFjY2Vzc2liaWxpdHlFdmVudCI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRBY3RpdmF0ZWQiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJhY3RpdmF0ZWQiIHR5cGU9ImJvb2xlYW4iPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0QWxwaGEiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJhbHBoYSIgdHlwZT0iZmxvYXQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0ic2V0QW5pbWF0aW9uIgogIHJldHVybj0idm9pZCIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0xODk0ODAsNiArMjAwNDYzLDE5IEBACiA8cGFyYW1ldGVyIG5hbWU9InJlc2lkIiB0eXBlPSJpbnQiPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0Qm90dG9tIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJib3R0b20iIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJzZXRDbGlja2FibGUiCiAgcmV0dXJuPSJ2b2lkIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTE4OTcwMSw2ICsyMDA2OTcsMTkgQEAKIDxwYXJhbWV0ZXIgbmFtZT0icGFyYW1zIiB0eXBlPSJhbmRyb2lkLnZpZXcuVmlld0dyb3VwLkxheW91dFBhcmFtcyI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRMZWZ0IgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJsZWZ0IiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0ic2V0TG9uZ0NsaWNrYWJsZSIKICByZXR1cm49InZvaWQiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMTg5ODg1LDE5ICsyMDA4OTQsNiBAQAogPHBhcmFtZXRlciBuYW1lPSJsIiB0eXBlPSJhbmRyb2lkLnZpZXcuVmlldy5PblRvdWNoTGlzdGVuZXIiPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KLTxtZXRob2QgbmFtZT0ic2V0T3ZlcnNjcm9sbE1vZGUiCi0gcmV0dXJuPSJ2b2lkIgotIGFic3RyYWN0PSJmYWxzZSIKLSBuYXRpdmU9ImZhbHNlIgotIHN5bmNocm9uaXplZD0iZmFsc2UiCi0gc3RhdGljPSJmYWxzZSIKLSBmaW5hbD0iZmFsc2UiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCi0gdmlzaWJpbGl0eT0icHVibGljIgotPgotPHBhcmFtZXRlciBuYW1lPSJvdmVyc2Nyb2xsTW9kZSIgdHlwZT0iaW50Ij4KLTwvcGFyYW1ldGVyPgotPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9InNldFBhZGRpbmciCiAgcmV0dXJuPSJ2b2lkIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTE4OTkxNyw2ICsyMDA5MTMsMzIgQEAKIDxwYXJhbWV0ZXIgbmFtZT0iYm90dG9tIiB0eXBlPSJpbnQiPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0UGl2b3RYIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0icGl2b3RYIiB0eXBlPSJmbG9hdCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRQaXZvdFkiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJwaXZvdFkiIHR5cGU9ImZsb2F0Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9InNldFByZXNzZWQiCiAgcmV0dXJuPSJ2b2lkIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTE4OTkzMCw2ICsyMDA5NTIsNTggQEAKIDxwYXJhbWV0ZXIgbmFtZT0icHJlc3NlZCIgdHlwZT0iYm9vbGVhbiI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRSaWdodCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0icmlnaHQiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRSb3RhdGlvbiIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InJvdGF0aW9uIiB0eXBlPSJmbG9hdCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRSb3RhdGlvblgiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJyb3RhdGlvblgiIHR5cGU9ImZsb2F0Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldFJvdGF0aW9uWSIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InJvdGF0aW9uWSIgdHlwZT0iZmxvYXQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0ic2V0U2F2ZUVuYWJsZWQiCiAgcmV0dXJuPSJ2b2lkIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTE4OTk0Myw2ICsyMDEwMTcsNDUgQEAKIDxwYXJhbWV0ZXIgbmFtZT0iZW5hYmxlZCIgdHlwZT0iYm9vbGVhbiI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRTYXZlRnJvbVBhcmVudEVuYWJsZWQiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJlbmFibGVkIiB0eXBlPSJib29sZWFuIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldFNjYWxlWCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InNjYWxlWCIgdHlwZT0iZmxvYXQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0U2NhbGVZIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0ic2NhbGVZIiB0eXBlPSJmbG9hdCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJzZXRTY3JvbGxCYXJTdHlsZSIKICByZXR1cm49InZvaWQiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMTkwMDM2LDYgKzIwMTE0OSwxOSBAQAogPHBhcmFtZXRlciBuYW1lPSJ0YWciIHR5cGU9ImphdmEubGFuZy5PYmplY3QiPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0VG9wIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJ0b3AiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJzZXRUb3VjaERlbGVnYXRlIgogIHJldHVybj0idm9pZCIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0xOTAwNDksNiArMjAxMTc1LDMyIEBACiA8cGFyYW1ldGVyIG5hbWU9ImRlbGVnYXRlIiB0eXBlPSJhbmRyb2lkLnZpZXcuVG91Y2hEZWxlZ2F0ZSI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRUcmFuc2xhdGlvblgiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJ0cmFuc2xhdGlvblgiIHR5cGU9ImZsb2F0Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldFRyYW5zbGF0aW9uWSIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InRyYW5zbGF0aW9uWSIgdHlwZT0iZmxvYXQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0ic2V0VmVydGljYWxGYWRpbmdFZGdlRW5hYmxlZCIKICByZXR1cm49InZvaWQiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMTkwMTE0LDYgKzIwMTI2NiwzMiBAQAogPHBhcmFtZXRlciBuYW1lPSJ3aWxsTm90RHJhdyIgdHlwZT0iYm9vbGVhbiI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRYIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0ieCIgdHlwZT0iZmxvYXQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0WSIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InkiIHR5cGU9ImZsb2F0Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9InNob3dDb250ZXh0TWVudSIKICByZXR1cm49ImJvb2xlYW4iCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMTkwMTI1LDYgKzIwMTMwMywxOSBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzdGFydEFjdGlvbk1vZGUiCisgcmV0dXJuPSJhbmRyb2lkLnZpZXcuQWN0aW9uTW9kZSIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iY2FsbGJhY2siIHR5cGU9ImFuZHJvaWQudmlldy5BY3Rpb25Nb2RlLkNhbGxiYWNrIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9InN0YXJ0QW5pbWF0aW9uIgogIHJldHVybj0idm9pZCIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0xOTA1MjAsMzkgKzIwMTcxMSw2IEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9maWVsZD4KLTxmaWVsZCBuYW1lPSJPVkVSU0NST0xMX0FMV0FZUyIKLSB0eXBlPSJpbnQiCi0gdHJhbnNpZW50PSJmYWxzZSIKLSB2b2xhdGlsZT0iZmFsc2UiCi0gdmFsdWU9IjAiCi0gc3RhdGljPSJ0cnVlIgotIGZpbmFsPSJ0cnVlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgotIHZpc2liaWxpdHk9InB1YmxpYyIKLT4KLTwvZmllbGQ+Ci08ZmllbGQgbmFtZT0iT1ZFUlNDUk9MTF9JRl9DT05URU5UX1NDUk9MTFMiCi0gdHlwZT0iaW50IgotIHRyYW5zaWVudD0iZmFsc2UiCi0gdm9sYXRpbGU9ImZhbHNlIgotIHZhbHVlPSIxIgotIHN0YXRpYz0idHJ1ZSIKLSBmaW5hbD0idHJ1ZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKLSB2aXNpYmlsaXR5PSJwdWJsaWMiCi0+Ci08L2ZpZWxkPgotPGZpZWxkIG5hbWU9Ik9WRVJTQ1JPTExfTkVWRVIiCi0gdHlwZT0iaW50IgotIHRyYW5zaWVudD0iZmFsc2UiCi0gdm9sYXRpbGU9ImZhbHNlIgotIHZhbHVlPSIyIgotIHN0YXRpYz0idHJ1ZSIKLSBmaW5hbD0idHJ1ZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKLSB2aXNpYmlsaXR5PSJwdWJsaWMiCi0+Ci08L2ZpZWxkPgogPGZpZWxkIG5hbWU9IlBSRVNTRURfRU5BQkxFRF9GT0NVU0VEX1NFTEVDVEVEX1NUQVRFX1NFVCIKICB0eXBlPSJpbnRbXSIKICB0cmFuc2llbnQ9ImZhbHNlIgpAQCAtMTkxMDY2LDYgKzIwMjIyNCw0MyBAQAogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KIDwvaW50ZXJmYWNlPgorPGludGVyZmFjZSBuYW1lPSJWaWV3Lk9uTGF5b3V0Q2hhbmdlTGlzdGVuZXIiCisgYWJzdHJhY3Q9InRydWUiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8bWV0aG9kIG5hbWU9Im9uTGF5b3V0Q2hhbmdlIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJ2IiB0eXBlPSJhbmRyb2lkLnZpZXcuVmlldyI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ibGVmdCIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJ0b3AiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0icmlnaHQiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iYm90dG9tIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9Im9sZExlZnQiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ib2xkVG9wIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9Im9sZFJpZ2h0IiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9Im9sZEJvdHRvbSIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8L2ludGVyZmFjZT4KIDxpbnRlcmZhY2UgbmFtZT0iVmlldy5PbkxvbmdDbGlja0xpc3RlbmVyIgogIGFic3RyYWN0PSJ0cnVlIgogIHN0YXRpYz0idHJ1ZSIKQEAgLTE5MTMxNSwyOCArMjAyNTEwLDYgQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L21ldGhvZD4KLTxtZXRob2QgbmFtZT0iZ2V0U2NhbGVkT3ZlcmZsaW5nRGlzdGFuY2UiCi0gcmV0dXJuPSJpbnQiCi0gYWJzdHJhY3Q9ImZhbHNlIgotIG5hdGl2ZT0iZmFsc2UiCi0gc3luY2hyb25pemVkPSJmYWxzZSIKLSBzdGF0aWM9ImZhbHNlIgotIGZpbmFsPSJmYWxzZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKLSB2aXNpYmlsaXR5PSJwdWJsaWMiCi0+Ci08L21ldGhvZD4KLTxtZXRob2QgbmFtZT0iZ2V0U2NhbGVkT3ZlcnNjcm9sbERpc3RhbmNlIgotIHJldHVybj0iaW50IgotIGFic3RyYWN0PSJmYWxzZSIKLSBuYXRpdmU9ImZhbHNlIgotIHN5bmNocm9uaXplZD0iZmFsc2UiCi0gc3RhdGljPSJmYWxzZSIKLSBmaW5hbD0iZmFsc2UiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCi0gdmlzaWJpbGl0eT0icHVibGljIgotPgotPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9ImdldFNjYWxlZFBhZ2luZ1RvdWNoU2xvcCIKICByZXR1cm49ImludCIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0xOTIwOTEsNiArMjAzMjY0LDE5IEBACiA8cGFyYW1ldGVyIG5hbWU9ImNvbnRhaW5lciIgdHlwZT0iYW5kcm9pZC51dGlsLlNwYXJzZUFycmF5Jmx0O2FuZHJvaWQub3MuUGFyY2VsYWJsZSZndDsiPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZGlzcGF0Y2hTZXRBY3RpdmF0ZWQiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJhY3RpdmF0ZWQiIHR5cGU9ImJvb2xlYW4iPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0iZGlzcGF0Y2hTZXRTZWxlY3RlZCIKICByZXR1cm49InZvaWQiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMTkyMTM0LDYgKzIwMzMyMCwxOSBAQAogPHBhcmFtZXRlciBuYW1lPSJkcmF3aW5nVGltZSIgdHlwZT0ibG9uZyI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJlbmRWaWV3VHJhbnNpdGlvbiIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InZpZXciIHR5cGU9ImFuZHJvaWQudmlldy5WaWV3Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9ImZvY3VzU2VhcmNoIgogIHJldHVybj0iYW5kcm9pZC52aWV3LlZpZXciCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMTkyMzQ0LDYgKzIwMzU0MywxNyBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRMYXlvdXRUcmFuc2l0aW9uIgorIHJldHVybj0iYW5kcm9pZC5hbmltYXRpb24uTGF5b3V0VHJhbnNpdGlvbiIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJnZXRQZXJzaXN0ZW50RHJhd2luZ0NhY2hlIgogIHJldHVybj0iaW50IgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTE5MjQ0Miw2ICsyMDM2NTIsMTcgQEAKICB2aXNpYmlsaXR5PSJwcm90ZWN0ZWQiCiA+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iaXNNb3Rpb25FdmVudFNwbGl0dGluZ0VuYWJsZWQiCisgcmV0dXJuPSJib29sZWFuIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9Im1lYXN1cmVDaGlsZCIKICByZXR1cm49InZvaWQiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMTkyOTA1LDYgKzIwNDEyNiwzMiBAQAogPHBhcmFtZXRlciBuYW1lPSJhbmltYXRpb25MaXN0ZW5lciIgdHlwZT0iYW5kcm9pZC52aWV3LmFuaW1hdGlvbi5BbmltYXRpb24uQW5pbWF0aW9uTGlzdGVuZXIiPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0TGF5b3V0VHJhbnNpdGlvbiIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InRyYW5zaXRpb24iIHR5cGU9ImFuZHJvaWQuYW5pbWF0aW9uLkxheW91dFRyYW5zaXRpb24iPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0TW90aW9uRXZlbnRTcGxpdHRpbmdFbmFibGVkIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0ic3BsaXQiIHR5cGU9ImJvb2xlYW4iPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0ic2V0T25IaWVyYXJjaHlDaGFuZ2VMaXN0ZW5lciIKICByZXR1cm49InZvaWQiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMTkyOTU3LDYgKzIwNDIwNCwyMSBAQAogPHBhcmFtZXRlciBuYW1lPSJvcmlnaW5hbFZpZXciIHR5cGU9ImFuZHJvaWQudmlldy5WaWV3Ij4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InN0YXJ0QWN0aW9uTW9kZUZvckNoaWxkIgorIHJldHVybj0iYW5kcm9pZC52aWV3LkFjdGlvbk1vZGUiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9Im9yaWdpbmFsVmlldyIgdHlwZT0iYW5kcm9pZC52aWV3LlZpZXciPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImNhbGxiYWNrIiB0eXBlPSJhbmRyb2lkLnZpZXcuQWN0aW9uTW9kZS5DYWxsYmFjayI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJzdGFydExheW91dEFuaW1hdGlvbiIKICByZXR1cm49InZvaWQiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMTkyOTY4LDYgKzIwNDIzMCwxOSBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzdGFydFZpZXdUcmFuc2l0aW9uIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0idmlldyIgdHlwZT0iYW5kcm9pZC52aWV3LlZpZXciPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0idXBkYXRlVmlld0xheW91dCIKICByZXR1cm49InZvaWQiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMTkzNjQ3LDYgKzIwNDkyMiwyMSBAQAogPHBhcmFtZXRlciBuYW1lPSJvcmlnaW5hbFZpZXciIHR5cGU9ImFuZHJvaWQudmlldy5WaWV3Ij4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InN0YXJ0QWN0aW9uTW9kZUZvckNoaWxkIgorIHJldHVybj0iYW5kcm9pZC52aWV3LkFjdGlvbk1vZGUiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0ib3JpZ2luYWxWaWV3IiB0eXBlPSJhbmRyb2lkLnZpZXcuVmlldyI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iY2FsbGJhY2siIHR5cGU9ImFuZHJvaWQudmlldy5BY3Rpb25Nb2RlLkNhbGxiYWNrIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+CiA8L2ludGVyZmFjZT4KIDxjbGFzcyBuYW1lPSJWaWV3U3R1YiIKICBleHRlbmRzPSJhbmRyb2lkLnZpZXcuVmlldyIKQEAgLTE5NDMyMyw2ICsyMDU2MTMsMTkgQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iaGFzRmVhdHVyZSIKKyByZXR1cm49ImJvb2xlYW4iCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImZlYXR1cmUiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJoYXNTb2Z0SW5wdXRNb2RlIgogIHJldHVybj0iYm9vbGVhbiIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0xOTQzMzQsNiArMjA1NjM3LDE5IEBACiAgdmlzaWJpbGl0eT0icHJvdGVjdGVkIgogPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImludmFsaWRhdGVQYW5lbE1lbnUiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImZlYXR1cmVJZCIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9ImlzQWN0aXZlIgogIHJldHVybj0iYm9vbGVhbiIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0xOTQ4OTUsNiArMjA2MjExLDI1IEBACiA8cGFyYW1ldGVyIG5hbWU9ImFwcE5hbWUiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0V2luZG93TWFuYWdlciIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9IndtIiB0eXBlPSJhbmRyb2lkLnZpZXcuV2luZG93TWFuYWdlciI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iYXBwVG9rZW4iIHR5cGU9ImFuZHJvaWQub3MuSUJpbmRlciI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iYXBwTmFtZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iaGFyZHdhcmVBY2NlbGVyYXRlZCIgdHlwZT0iYm9vbGVhbiI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJzdXBlckRpc3BhdGNoS2V5RXZlbnQiCiAgcmV0dXJuPSJib29sZWFuIgogIGFic3RyYWN0PSJ0cnVlIgpAQCAtMTk0OTk5LDYgKzIwNjMzNCwzOSBAQAogIHZpc2liaWxpdHk9InByb3RlY3RlZCIKID4KIDwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iRkVBVFVSRV9BQ1RJT05fQkFSIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iOCIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJGRUFUVVJFX0FDVElPTl9CQVJfT1ZFUkxBWSIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjkiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iRkVBVFVSRV9BQ1RJT05fTU9ERV9PVkVSTEFZIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMTAiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+CiA8ZmllbGQgbmFtZT0iRkVBVFVSRV9DT05URVhUX01FTlUiCiAgdHlwZT0iaW50IgogIHRyYW5zaWVudD0iZmFsc2UiCkBAIC0xOTUwMjEsNiArMjA2Mzg5LDE3IEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJGRUFUVVJFX0hBUkRXQVJFX0FDQ0VMRVJBVEVEIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMTEiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+CiA8ZmllbGQgbmFtZT0iRkVBVFVSRV9JTkRFVEVSTUlOQVRFX1BST0dSRVNTIgogIHR5cGU9ImludCIKICB0cmFuc2llbnQ9ImZhbHNlIgpAQCAtMTk1MzgwLDYgKzIwNjc1OSwxOSBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJvblN0YXJ0QWN0aW9uTW9kZSIKKyByZXR1cm49ImFuZHJvaWQudmlldy5BY3Rpb25Nb2RlIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImNhbGxiYWNrIiB0eXBlPSJhbmRyb2lkLnZpZXcuQWN0aW9uTW9kZS5DYWxsYmFjayI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJvbldpbmRvd0F0dHJpYnV0ZXNDaGFuZ2VkIgogIHJldHVybj0idm9pZCIKICBhYnN0cmFjdD0idHJ1ZSIKQEAgLTE5NTg2OSw2ICsyMDcyNjEsMTcgQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IkZMQUdfSEFSRFdBUkVfQUNDRUxFUkFURUQiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSItMjE0NzQ4MzY0OCIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KIDxmaWVsZCBuYW1lPSJGTEFHX0lHTk9SRV9DSEVFS19QUkVTU0VTIgogIHR5cGU9ImludCIKICB0cmFuc2llbnQ9ImZhbHNlIgpAQCAtMTk3NzU1LDYgKzIwOTE1OCwxNyBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRTY2FsZUZhY3RvciIKKyByZXR1cm49ImZsb2F0IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHJvdGVjdGVkIgorPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9ImdldFN0YXJ0T2Zmc2V0IgogIHJldHVybj0ibG9uZyIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0xOTc3OTIsNiArMjA5MjA2LDIzIEBACiA8cGFyYW1ldGVyIG5hbWU9Im91dFRyYW5zZm9ybWF0aW9uIiB0eXBlPSJhbmRyb2lkLnZpZXcuYW5pbWF0aW9uLlRyYW5zZm9ybWF0aW9uIj4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldFRyYW5zZm9ybWF0aW9uIgorIHJldHVybj0iYm9vbGVhbiIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iY3VycmVudFRpbWUiIHR5cGU9ImxvbmciPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9Im91dFRyYW5zZm9ybWF0aW9uIiB0eXBlPSJhbmRyb2lkLnZpZXcuYW5pbWF0aW9uLlRyYW5zZm9ybWF0aW9uIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJzY2FsZSIgdHlwZT0iZmxvYXQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0iZ2V0WkFkanVzdG1lbnQiCiAgcmV0dXJuPSJpbnQiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMjAyMDg4LDYgKzIxMzUxOSwxNyBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRTdWJ0eXBlcyIKKyByZXR1cm49ImphdmEudXRpbC5BcnJheUxpc3QmbHQ7YW5kcm9pZC52aWV3LmlucHV0bWV0aG9kLklucHV0TWV0aG9kSW5mby5JbnB1dE1ldGhvZFN1YnR5cGUmZ3Q7IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9ImxvYWRJY29uIgogIHJldHVybj0iYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZSIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0yMDIxNDAsNiArMjEzNTgyLDEwOCBAQAogPgogPC9maWVsZD4KIDwvY2xhc3M+Cis8Y2xhc3MgbmFtZT0iSW5wdXRNZXRob2RJbmZvLklucHV0TWV0aG9kU3VidHlwZSIKKyBleHRlbmRzPSJqYXZhLmxhbmcuT2JqZWN0IgorIGFic3RyYWN0PSJmYWxzZSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxpbXBsZW1lbnRzIG5hbWU9ImFuZHJvaWQub3MuUGFyY2VsYWJsZSI+Cis8L2ltcGxlbWVudHM+Cis8bWV0aG9kIG5hbWU9ImRlc2NyaWJlQ29udGVudHMiCisgcmV0dXJuPSJpbnQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0RXh0cmFWYWx1ZSIKKyByZXR1cm49ImphdmEubGFuZy5TdHJpbmciCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0SWNvbklkIgorIHJldHVybj0iaW50IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldExvY2FsZSIKKyByZXR1cm49ImphdmEubGFuZy5TdHJpbmciCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0TW9kZSIKKyByZXR1cm49ImphdmEubGFuZy5TdHJpbmciCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0TmFtZSIKKyByZXR1cm49ImphdmEubGFuZy5TdHJpbmciCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0id3JpdGVUb1BhcmNlbCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImRlc3QiIHR5cGU9ImFuZHJvaWQub3MuUGFyY2VsIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJwYXJjZWxhYmxlRmxhZ3MiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPGZpZWxkIG5hbWU9IkNSRUFUT1IiCisgdHlwZT0iYW5kcm9pZC5vcy5QYXJjZWxhYmxlLkNyZWF0b3IiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8L2NsYXNzPgogPGNsYXNzIG5hbWU9IklucHV0TWV0aG9kTWFuYWdlciIKICBleHRlbmRzPSJqYXZhLmxhbmcuT2JqZWN0IgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTIwNTE1NSw2ICsyMTY2OTksMTcgQEAKICBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+Cis8bWV0aG9kIG5hbWU9ImVuYWJsZVNtb290aFRyYW5zaXRpb24iCisgcmV0dXJuPSJib29sZWFuIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9ImdldEFsbG93RmlsZUFjY2VzcyIKICByZXR1cm49ImJvb2xlYW4iCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMjA1NDM3LDcgKzIxNjk5Miw3IEBACiAgc3luY2hyb25pemVkPSJ0cnVlIgogIHN0YXRpYz0iZmFsc2UiCiAgZmluYWw9ImZhbHNlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIGRlcHJlY2F0ZWQ9ImRlcHJlY2F0ZWQiCiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9tZXRob2Q+CkBAIC0yMDU1MjksMTcgKzIxNzA4NCw2IEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9tZXRob2Q+Ci08bWV0aG9kIG5hbWU9ImdldFVzZVdlYlZpZXdCYWNrZ3JvdW5kRm9yT3ZlcnNjcm9sbEJhY2tncm91bmQiCi0gcmV0dXJuPSJib29sZWFuIgotIGFic3RyYWN0PSJmYWxzZSIKLSBuYXRpdmU9ImZhbHNlIgotIHN5bmNocm9uaXplZD0iZmFsc2UiCi0gc3RhdGljPSJmYWxzZSIKLSBmaW5hbD0iZmFsc2UiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCi0gdmlzaWJpbGl0eT0icHVibGljIgotPgotPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9ImdldFVzZVdpZGVWaWV3UG9ydCIKICByZXR1cm49ImJvb2xlYW4iCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMjA1NzgxLDYgKzIxNzMyNSwxOSBAQAogPHBhcmFtZXRlciBuYW1lPSJmbGFnIiB0eXBlPSJib29sZWFuIj4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldEVuYWJsZVNtb290aFRyYW5zaXRpb24iCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJlbmFibGUiIHR5cGU9ImJvb2xlYW4iPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0ic2V0RmFudGFzeUZvbnRGYW1pbHkiCiAgcmV0dXJuPSJ2b2lkIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTIwNTk4Myw3ICsyMTc1NDAsNyBAQAogIHN5bmNocm9uaXplZD0idHJ1ZSIKICBzdGF0aWM9ImZhbHNlIgogIGZpbmFsPSJmYWxzZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyBkZXByZWNhdGVkPSJkZXByZWNhdGVkIgogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDxwYXJhbWV0ZXIgbmFtZT0iZmxhZyIgdHlwZT0iYm9vbGVhbiI+CkBAIC0yMDYxMzIsMTkgKzIxNzY4OSw2IEBACiA8cGFyYW1ldGVyIG5hbWU9InVzZSIgdHlwZT0iYm9vbGVhbiI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgotPG1ldGhvZCBuYW1lPSJzZXRVc2VXZWJWaWV3QmFja2dyb3VuZEZvck92ZXJzY3JvbGxCYWNrZ3JvdW5kIgotIHJldHVybj0idm9pZCIKLSBhYnN0cmFjdD0iZmFsc2UiCi0gbmF0aXZlPSJmYWxzZSIKLSBzeW5jaHJvbml6ZWQ9ImZhbHNlIgotIHN0YXRpYz0iZmFsc2UiCi0gZmluYWw9ImZhbHNlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgotIHZpc2liaWxpdHk9InB1YmxpYyIKLT4KLTxwYXJhbWV0ZXIgbmFtZT0idmlldyIgdHlwZT0iYm9vbGVhbiI+Ci08L3BhcmFtZXRlcj4KLTwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJzZXRVc2VXaWRlVmlld1BvcnQiCiAgcmV0dXJuPSJ2b2lkIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTIwNjcyNiw2ICsyMTgyNzAsMjIgQEAKIDxwYXJhbWV0ZXIgbmFtZT0iZGVmU3R5bGUiIHR5cGU9ImludCI+CiA8L3BhcmFtZXRlcj4KIDwvY29uc3RydWN0b3I+Cis8Y29uc3RydWN0b3IgbmFtZT0iV2ViVmlldyIKKyB0eXBlPSJhbmRyb2lkLndlYmtpdC5XZWJWaWV3IgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iY29udGV4dCIgdHlwZT0iYW5kcm9pZC5jb250ZW50LkNvbnRleHQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImF0dHJzIiB0eXBlPSJhbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJkZWZTdHlsZSIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJwcml2YXRlQnJvd3NpbmciIHR5cGU9ImJvb2xlYW4iPgorPC9wYXJhbWV0ZXI+Cis8L2NvbnN0cnVjdG9yPgogPG1ldGhvZCBuYW1lPSJhZGRKYXZhc2NyaXB0SW50ZXJmYWNlIgogIHJldHVybj0idm9pZCIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0yMDY3NzYsNiArMjE4MzM2LDI4IEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImNhblpvb21JbiIKKyByZXR1cm49ImJvb2xlYW4iCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iY2FuWm9vbU91dCIKKyByZXR1cm49ImJvb2xlYW4iCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0iY2FwdHVyZVBpY3R1cmUiCiAgcmV0dXJuPSJhbmRyb2lkLmdyYXBoaWNzLlBpY3R1cmUiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMjA3MTM1LDYgKzIxODcxNywxNyBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRWaXNpYmxlVGl0bGVIZWlnaHQiCisgcmV0dXJuPSJpbnQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0iZ2V0Wm9vbUNvbnRyb2xzIgogIHJldHVybj0iYW5kcm9pZC52aWV3LlZpZXciCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMjA3MTkyLDYgKzIxODc4NSwxNyBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJpc1ByaXZhdGVCcm93c2luZ0VuYWJsZWQiCisgcmV0dXJuPSJib29sZWFuIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9ImxvYWREYXRhIgogIHJldHVybj0idm9pZCIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0yMDc1MTEsNiArMjE5MTE1LDM2IEBACiA8cGFyYW1ldGVyIG5hbWU9Im91dFN0YXRlIiB0eXBlPSJhbmRyb2lkLm9zLkJ1bmRsZSI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzYXZlV2ViQXJjaGl2ZSIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImZpbGVuYW1lIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNhdmVXZWJBcmNoaXZlIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iYmFzZW5hbWUiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImF1dG9uYW1lIiB0eXBlPSJib29sZWFuIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJjYWxsYmFjayIgdHlwZT0iYW5kcm9pZC53ZWJraXQuVmFsdWVDYWxsYmFjayZsdDtqYXZhLmxhbmcuU3RyaW5nJmd0OyI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJzZXRDZXJ0aWZpY2F0ZSIKICByZXR1cm49InZvaWQiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMjA3NjYwLDYgKzIxOTI5NCwxOSBAQAogPHBhcmFtZXRlciBuYW1lPSJjbGllbnQiIHR5cGU9ImFuZHJvaWQud2Via2l0LldlYlZpZXdDbGllbnQiPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2hvd0ZpbmREaWFsb2ciCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJ0ZXh0IiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9InN0b3BMb2FkaW5nIgogIHJldHVybj0idm9pZCIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0yMDgxMDgsNyArMjE5NzU1LDcgQEAKICBzeW5jaHJvbml6ZWQ9ImZhbHNlIgogIHN0YXRpYz0iZmFsc2UiCiAgZmluYWw9ImZhbHNlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIGRlcHJlY2F0ZWQ9ImRlcHJlY2F0ZWQiCiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPHBhcmFtZXRlciBuYW1lPSJ2aWV3IiB0eXBlPSJhbmRyb2lkLndlYmtpdC5XZWJWaWV3Ij4KQEAgLTIwODUxNSw2ICsyMjAxNjIsMTcgQEAKIDxwYXJhbWV0ZXIgbmFtZT0iYWZ0ZXIiIHR5cGU9ImludCI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJjbGVhckNob2ljZXMiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9ImNsZWFyVGV4dEZpbHRlciIKICByZXR1cm49InZvaWQiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMjA4NTM3LDYgKzIyMDE5NSw2MSBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRDaGVja2VkSXRlbUNvdW50IgorIHJldHVybj0iaW50IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldENoZWNrZWRJdGVtSWRzIgorIHJldHVybj0ibG9uZ1tdIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldENoZWNrZWRJdGVtUG9zaXRpb24iCisgcmV0dXJuPSJpbnQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0Q2hlY2tlZEl0ZW1Qb3NpdGlvbnMiCisgcmV0dXJuPSJhbmRyb2lkLnV0aWwuU3BhcnNlQm9vbGVhbkFycmF5IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldENob2ljZU1vZGUiCisgcmV0dXJuPSJpbnQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0iZ2V0TGlzdFBhZGRpbmdCb3R0b20iCiAgcmV0dXJuPSJpbnQiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMjA4NjgwLDYgKzIyMDM5MywxOSBAQAogIHZpc2liaWxpdHk9InByb3RlY3RlZCIKID4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJpc0l0ZW1DaGVja2VkIgorIHJldHVybj0iYm9vbGVhbiIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0icG9zaXRpb24iIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJpc1Njcm9sbGluZ0NhY2hlRW5hYmxlZCIKICByZXR1cm49ImJvb2xlYW4iCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMjA4NzU5LDYgKzIyMDQ4NSwyOCBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJvblJlbW90ZUFkYXB0ZXJDb25uZWN0ZWQiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9Im9uUmVtb3RlQWRhcHRlckRpc2Nvbm5lY3RlZCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0ib25SZXN0b3JlSW5zdGFuY2VTdGF0ZSIKICByZXR1cm49InZvaWQiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMjA4ODU4LDYgKzIyMDYwNiwxOSBAQAogPHBhcmFtZXRlciBuYW1lPSJ2aWV3cyIgdHlwZT0iamF2YS51dGlsLkxpc3QmbHQ7YW5kcm9pZC52aWV3LlZpZXcmZ3Q7Ij4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldEFkYXB0ZXIiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJhZGFwdGVyIiB0eXBlPSJhbmRyb2lkLndpZGdldC5MaXN0QWRhcHRlciI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJzZXRDYWNoZUNvbG9ySGludCIKICByZXR1cm49InZvaWQiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMjA4ODcxLDYgKzIyMDYzMiwxOSBAQAogPHBhcmFtZXRlciBuYW1lPSJjb2xvciIgdHlwZT0iaW50Ij4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldENob2ljZU1vZGUiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJjaG9pY2VNb2RlIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0ic2V0RHJhd1NlbGVjdG9yT25Ub3AiCiAgcmV0dXJuPSJ2b2lkIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTIwODkxMCw2ICsyMjA2ODQsMzQgQEAKIDxwYXJhbWV0ZXIgbmFtZT0iZmlsdGVyVGV4dCIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRJdGVtQ2hlY2tlZCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InBvc2l0aW9uIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InZhbHVlIiB0eXBlPSJib29sZWFuIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldE11bHRpQ2hvaWNlTW9kZUxpc3RlbmVyIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0ibGlzdGVuZXIiIHR5cGU9ImFuZHJvaWQud2lkZ2V0LkFic0xpc3RWaWV3Lk11bHRpQ2hvaWNlTW9kZUxpc3RlbmVyIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9InNldE9uU2Nyb2xsTGlzdGVuZXIiCiAgcmV0dXJuPSJ2b2lkIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTIwODkzNiw2ICsyMjA3MzgsMTkgQEAKIDxwYXJhbWV0ZXIgbmFtZT0ibGlzdGVuZXIiIHR5cGU9ImFuZHJvaWQud2lkZ2V0LkFic0xpc3RWaWV3LlJlY3ljbGVyTGlzdGVuZXIiPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0UmVtb3RlVmlld3NBZGFwdGVyIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iaW50ZW50IiB0eXBlPSJhbmRyb2lkLmNvbnRlbnQuSW50ZW50Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9InNldFNjcm9sbEluZGljYXRvcnMiCiAgcmV0dXJuPSJ2b2lkIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTIwOTA4NSw2ICsyMjA5MDAsMjEgQEAKIDxwYXJhbWV0ZXIgbmFtZT0iYm91bmRQb3NpdGlvbiIgdHlwZT0iaW50Ij4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNtb290aFNjcm9sbFRvUG9zaXRpb25Gcm9tVG9wIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0icG9zaXRpb24iIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ib2Zmc2V0IiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0idmVyaWZ5RHJhd2FibGUiCiAgcmV0dXJuPSJib29sZWFuIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTIwOTA5OCw2ICsyMjA5MjgsNTAgQEAKIDxwYXJhbWV0ZXIgbmFtZT0iZHIiIHR5cGU9ImFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuRHJhd2FibGUiPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KKzxmaWVsZCBuYW1lPSJDSE9JQ0VfTU9ERV9NVUxUSVBMRSIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjIiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iQ0hPSUNFX01PREVfTVVMVElQTEVfTU9EQUwiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIzIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IkNIT0lDRV9NT0RFX05PTkUiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIwIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IkNIT0lDRV9NT0RFX1NJTkdMRSIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjEiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+CiA8ZmllbGQgbmFtZT0iVFJBTlNDUklQVF9NT0RFX0FMV0FZU19TQ1JPTEwiCiAgdHlwZT0iaW50IgogIHRyYW5zaWVudD0iZmFsc2UiCkBAIC0yMDkxODksNiArMjIxMDYzLDM1IEBACiA8L3BhcmFtZXRlcj4KIDwvY29uc3RydWN0b3I+CiA8L2NsYXNzPgorPGludGVyZmFjZSBuYW1lPSJBYnNMaXN0Vmlldy5NdWx0aUNob2ljZU1vZGVMaXN0ZW5lciIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxpbXBsZW1lbnRzIG5hbWU9ImFuZHJvaWQudmlldy5BY3Rpb25Nb2RlLkNhbGxiYWNrIj4KKzwvaW1wbGVtZW50cz4KKzxtZXRob2QgbmFtZT0ib25JdGVtQ2hlY2tlZFN0YXRlQ2hhbmdlZCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0ibW9kZSIgdHlwZT0iYW5kcm9pZC52aWV3LkFjdGlvbk1vZGUiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InBvc2l0aW9uIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImlkIiB0eXBlPSJsb25nIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJjaGVja2VkIiB0eXBlPSJib29sZWFuIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8L2ludGVyZmFjZT4KIDxpbnRlcmZhY2UgbmFtZT0iQWJzTGlzdFZpZXcuT25TY3JvbGxMaXN0ZW5lciIKICBhYnN0cmFjdD0idHJ1ZSIKICBzdGF0aWM9InRydWUiCkBAIC0yMTAzNjUsNiArMjIyMjY4LDU4MiBAQAogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KIDwvaW50ZXJmYWNlPgorPGNsYXNzIG5hbWU9IkFkYXB0ZXJWaWV3QW5pbWF0b3IiCisgZXh0ZW5kcz0iYW5kcm9pZC53aWRnZXQuQWRhcHRlclZpZXciCisgYWJzdHJhY3Q9InRydWUiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPGNvbnN0cnVjdG9yIG5hbWU9IkFkYXB0ZXJWaWV3QW5pbWF0b3IiCisgdHlwZT0iYW5kcm9pZC53aWRnZXQuQWRhcHRlclZpZXdBbmltYXRvciIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImNvbnRleHQiIHR5cGU9ImFuZHJvaWQuY29udGVudC5Db250ZXh0Ij4KKzwvcGFyYW1ldGVyPgorPC9jb25zdHJ1Y3Rvcj4KKzxjb25zdHJ1Y3RvciBuYW1lPSJBZGFwdGVyVmlld0FuaW1hdG9yIgorIHR5cGU9ImFuZHJvaWQud2lkZ2V0LkFkYXB0ZXJWaWV3QW5pbWF0b3IiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJjb250ZXh0IiB0eXBlPSJhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iYXR0cnMiIHR5cGU9ImFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQiPgorPC9wYXJhbWV0ZXI+Cis8L2NvbnN0cnVjdG9yPgorPG1ldGhvZCBuYW1lPSJnZXRBZGFwdGVyIgorIHJldHVybj0iYW5kcm9pZC53aWRnZXQuQWRhcHRlciIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRDdXJyZW50VmlldyIKKyByZXR1cm49ImFuZHJvaWQudmlldy5WaWV3IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldERpc3BsYXllZENoaWxkIgorIHJldHVybj0iaW50IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldEluQW5pbWF0aW9uIgorIHJldHVybj0iYW5kcm9pZC52aWV3LmFuaW1hdGlvbi5BbmltYXRpb24iCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0T3V0QW5pbWF0aW9uIgorIHJldHVybj0iYW5kcm9pZC52aWV3LmFuaW1hdGlvbi5BbmltYXRpb24iCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0U2VsZWN0ZWRWaWV3IgorIHJldHVybj0iYW5kcm9pZC52aWV3LlZpZXciCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ib25SZW1vdGVBZGFwdGVyQ29ubmVjdGVkIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJvblJlbW90ZUFkYXB0ZXJEaXNjb25uZWN0ZWQiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9Im9uUmVzdG9yZUluc3RhbmNlU3RhdGUiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJzdGF0ZSIgdHlwZT0iYW5kcm9pZC5vcy5QYXJjZWxhYmxlIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9Im9uU2F2ZUluc3RhbmNlU3RhdGUiCisgcmV0dXJuPSJhbmRyb2lkLm9zLlBhcmNlbGFibGUiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0QWRhcHRlciIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImFkYXB0ZXIiIHR5cGU9ImFuZHJvaWQud2lkZ2V0LkFkYXB0ZXIiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0QW5pbWF0ZUZpcnN0VmlldyIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImFuaW1hdGUiIHR5cGU9ImJvb2xlYW4iPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0RGlzcGxheWVkQ2hpbGQiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJ3aGljaENoaWxkIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0SW5BbmltYXRpb24iCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJpbkFuaW1hdGlvbiIgdHlwZT0iYW5kcm9pZC52aWV3LmFuaW1hdGlvbi5BbmltYXRpb24iPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0SW5BbmltYXRpb24iCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJjb250ZXh0IiB0eXBlPSJhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0icmVzb3VyY2VJRCIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldE91dEFuaW1hdGlvbiIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9Im91dEFuaW1hdGlvbiIgdHlwZT0iYW5kcm9pZC52aWV3LmFuaW1hdGlvbi5BbmltYXRpb24iPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0T3V0QW5pbWF0aW9uIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iY29udGV4dCIgdHlwZT0iYW5kcm9pZC5jb250ZW50LkNvbnRleHQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InJlc291cmNlSUQiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRSZW1vdGVWaWV3c0FkYXB0ZXIiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJpbnRlbnQiIHR5cGU9ImFuZHJvaWQuY29udGVudC5JbnRlbnQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0U2VsZWN0aW9uIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0icG9zaXRpb24iIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzaG93TmV4dCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2hvd1ByZXZpb3VzIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPC9jbGFzcz4KKzxjbGFzcyBuYW1lPSJBZGFwdGVyVmlld0ZsaXBwZXIiCisgZXh0ZW5kcz0iYW5kcm9pZC53aWRnZXQuQWRhcHRlclZpZXdBbmltYXRvciIKKyBhYnN0cmFjdD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPGNvbnN0cnVjdG9yIG5hbWU9IkFkYXB0ZXJWaWV3RmxpcHBlciIKKyB0eXBlPSJhbmRyb2lkLndpZGdldC5BZGFwdGVyVmlld0ZsaXBwZXIiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJjb250ZXh0IiB0eXBlPSJhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCI+Cis8L3BhcmFtZXRlcj4KKzwvY29uc3RydWN0b3I+Cis8Y29uc3RydWN0b3IgbmFtZT0iQWRhcHRlclZpZXdGbGlwcGVyIgorIHR5cGU9ImFuZHJvaWQud2lkZ2V0LkFkYXB0ZXJWaWV3RmxpcHBlciIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImNvbnRleHQiIHR5cGU9ImFuZHJvaWQuY29udGVudC5Db250ZXh0Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJhdHRycyIgdHlwZT0iYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldCI+Cis8L3BhcmFtZXRlcj4KKzwvY29uc3RydWN0b3I+Cis8bWV0aG9kIG5hbWU9ImlzQXV0b1N0YXJ0IgorIHJldHVybj0iYm9vbGVhbiIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJpc0ZsaXBwaW5nIgorIHJldHVybj0iYm9vbGVhbiIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRBdXRvU3RhcnQiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJhdXRvU3RhcnQiIHR5cGU9ImJvb2xlYW4iPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0RmxpcEludGVydmFsIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0ibWlsbGlzZWNvbmRzIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic3RhcnRGbGlwcGluZyIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic3RvcEZsaXBwaW5nIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPC9jbGFzcz4KKzxjbGFzcyBuYW1lPSJBZGFwdGVycyIKKyBleHRlbmRzPSJqYXZhLmxhbmcuT2JqZWN0IgorIGFic3RyYWN0PSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8Y29uc3RydWN0b3IgbmFtZT0iQWRhcHRlcnMiCisgdHlwZT0iYW5kcm9pZC53aWRnZXQuQWRhcHRlcnMiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9jb25zdHJ1Y3Rvcj4KKzxtZXRob2QgbmFtZT0ibG9hZEFkYXB0ZXIiCisgcmV0dXJuPSJhbmRyb2lkLndpZGdldC5CYXNlQWRhcHRlciIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJjb250ZXh0IiB0eXBlPSJhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iaWQiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0icGFyYW1ldGVycyIgdHlwZT0iamF2YS5sYW5nLk9iamVjdC4uLiI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJsb2FkQ3Vyc29yQWRhcHRlciIKKyByZXR1cm49ImFuZHJvaWQud2lkZ2V0LkN1cnNvckFkYXB0ZXIiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iY29udGV4dCIgdHlwZT0iYW5kcm9pZC5jb250ZW50LkNvbnRleHQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImlkIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InVyaSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0icGFyYW1ldGVycyIgdHlwZT0iamF2YS5sYW5nLk9iamVjdC4uLiI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJsb2FkQ3Vyc29yQWRhcHRlciIKKyByZXR1cm49ImFuZHJvaWQud2lkZ2V0LkN1cnNvckFkYXB0ZXIiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iY29udGV4dCIgdHlwZT0iYW5kcm9pZC5jb250ZW50LkNvbnRleHQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImlkIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImN1cnNvciIgdHlwZT0iYW5kcm9pZC5kYXRhYmFzZS5DdXJzb3IiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InBhcmFtZXRlcnMiIHR5cGU9ImphdmEubGFuZy5PYmplY3QuLi4iPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzwvY2xhc3M+Cis8Y2xhc3MgbmFtZT0iQWRhcHRlcnMuQ3Vyc29yQmluZGVyIgorIGV4dGVuZHM9ImphdmEubGFuZy5PYmplY3QiCisgYWJzdHJhY3Q9InRydWUiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8Y29uc3RydWN0b3IgbmFtZT0iQWRhcHRlcnMuQ3Vyc29yQmluZGVyIgorIHR5cGU9ImFuZHJvaWQud2lkZ2V0LkFkYXB0ZXJzLkN1cnNvckJpbmRlciIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImNvbnRleHQiIHR5cGU9ImFuZHJvaWQuY29udGVudC5Db250ZXh0Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJ0cmFuc2Zvcm1hdGlvbiIgdHlwZT0iYW5kcm9pZC53aWRnZXQuQWRhcHRlcnMuQ3Vyc29yVHJhbnNmb3JtYXRpb24iPgorPC9wYXJhbWV0ZXI+Cis8L2NvbnN0cnVjdG9yPgorPG1ldGhvZCBuYW1lPSJiaW5kIgorIHJldHVybj0iYm9vbGVhbiIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJ2aWV3IiB0eXBlPSJhbmRyb2lkLnZpZXcuVmlldyI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iY3Vyc29yIiB0eXBlPSJhbmRyb2lkLmRhdGFiYXNlLkN1cnNvciI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iY29sdW1uSW5kZXgiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPGZpZWxkIG5hbWU9Im1Db250ZXh0IgorIHR5cGU9ImFuZHJvaWQuY29udGVudC5Db250ZXh0IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHJvdGVjdGVkIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJtVHJhbnNmb3JtYXRpb24iCisgdHlwZT0iYW5kcm9pZC53aWRnZXQuQWRhcHRlcnMuQ3Vyc29yVHJhbnNmb3JtYXRpb24iCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwcm90ZWN0ZWQiCis+Cis8L2ZpZWxkPgorPC9jbGFzcz4KKzxjbGFzcyBuYW1lPSJBZGFwdGVycy5DdXJzb3JUcmFuc2Zvcm1hdGlvbiIKKyBleHRlbmRzPSJqYXZhLmxhbmcuT2JqZWN0IgorIGFic3RyYWN0PSJ0cnVlIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPGNvbnN0cnVjdG9yIG5hbWU9IkFkYXB0ZXJzLkN1cnNvclRyYW5zZm9ybWF0aW9uIgorIHR5cGU9ImFuZHJvaWQud2lkZ2V0LkFkYXB0ZXJzLkN1cnNvclRyYW5zZm9ybWF0aW9uIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iY29udGV4dCIgdHlwZT0iYW5kcm9pZC5jb250ZW50LkNvbnRleHQiPgorPC9wYXJhbWV0ZXI+Cis8L2NvbnN0cnVjdG9yPgorPG1ldGhvZCBuYW1lPSJ0cmFuc2Zvcm0iCisgcmV0dXJuPSJqYXZhLmxhbmcuU3RyaW5nIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImN1cnNvciIgdHlwZT0iYW5kcm9pZC5kYXRhYmFzZS5DdXJzb3IiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImNvbHVtbkluZGV4IiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0idHJhbnNmb3JtVG9SZXNvdXJjZSIKKyByZXR1cm49ImludCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iY3Vyc29yIiB0eXBlPSJhbmRyb2lkLmRhdGFiYXNlLkN1cnNvciI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iY29sdW1uSW5kZXgiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPGZpZWxkIG5hbWU9Im1Db250ZXh0IgorIHR5cGU9ImFuZHJvaWQuY29udGVudC5Db250ZXh0IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHJvdGVjdGVkIgorPgorPC9maWVsZD4KKzwvY2xhc3M+CiA8Y2xhc3MgbmFtZT0iQWxwaGFiZXRJbmRleGVyIgogIGV4dGVuZHM9ImFuZHJvaWQuZGF0YWJhc2UuRGF0YVNldE9ic2VydmVyIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTIxMjM1Miw2ICsyMjQ4MzEsMjAgQEAKIDxwYXJhbWV0ZXIgbmFtZT0iYXV0b1JlcXVlcnkiIHR5cGU9ImJvb2xlYW4iPgogPC9wYXJhbWV0ZXI+CiA8L2NvbnN0cnVjdG9yPgorPGNvbnN0cnVjdG9yIG5hbWU9IkN1cnNvckFkYXB0ZXIiCisgdHlwZT0iYW5kcm9pZC53aWRnZXQuQ3Vyc29yQWRhcHRlciIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImNvbnRleHQiIHR5cGU9ImFuZHJvaWQuY29udGVudC5Db250ZXh0Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJjIiB0eXBlPSJhbmRyb2lkLmRhdGFiYXNlLkN1cnNvciI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iZmxhZ3MiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzwvY29uc3RydWN0b3I+CiA8bWV0aG9kIG5hbWU9ImJpbmRWaWV3IgogIHJldHVybj0idm9pZCIKICBhYnN0cmFjdD0idHJ1ZSIKQEAgLTIxMjQ5OSw2ICsyMjQ5OTIsMjMgQEAKIDxwYXJhbWV0ZXIgbmFtZT0iYXV0b1JlcXVlcnkiIHR5cGU9ImJvb2xlYW4iPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iaW5pdCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwcm90ZWN0ZWQiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImNvbnRleHQiIHR5cGU9ImFuZHJvaWQuY29udGVudC5Db250ZXh0Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJjIiB0eXBlPSJhbmRyb2lkLmRhdGFiYXNlLkN1cnNvciI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iZmxhZ3MiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJuZXdEcm9wRG93blZpZXciCiAgcmV0dXJuPSJhbmRyb2lkLnZpZXcuVmlldyIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0yMTI1NzAsNiArMjI1MDgwLDI4IEBACiA8cGFyYW1ldGVyIG5hbWU9ImZpbHRlclF1ZXJ5UHJvdmlkZXIiIHR5cGU9ImFuZHJvaWQud2lkZ2V0LkZpbHRlclF1ZXJ5UHJvdmlkZXIiPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KKzxmaWVsZCBuYW1lPSJGTEFHX0FVVE9fUkVRVUVSWSIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjEiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iRkxBR19SRUdJU1RFUl9DT05URU5UX09CU0VSVkVSIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMiIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KIDwvY2xhc3M+CiA8Y2xhc3MgbmFtZT0iQ3Vyc29yVHJlZUFkYXB0ZXIiCiAgZXh0ZW5kcz0iYW5kcm9pZC53aWRnZXQuQmFzZUV4cGFuZGFibGVMaXN0QWRhcHRlciIKQEAgLTIxNTAwOSw3ICsyMjc1NDEsNyBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvbWV0aG9kPgotPG1ldGhvZCBuYW1lPSJnZXRTdHJldGNoTW9kZSIKKzxtZXRob2QgbmFtZT0iZ2V0TnVtQ29sdW1ucyIKICByZXR1cm49ImludCIKICBhYnN0cmFjdD0iZmFsc2UiCiAgbmF0aXZlPSJmYWxzZSIKQEAgLTIxNTAyMCw4ICsyMjc1NTIsOCBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvbWV0aG9kPgotPG1ldGhvZCBuYW1lPSJzZXRBZGFwdGVyIgotIHJldHVybj0idm9pZCIKKzxtZXRob2QgbmFtZT0iZ2V0U3RyZXRjaE1vZGUiCisgcmV0dXJuPSJpbnQiCiAgYWJzdHJhY3Q9ImZhbHNlIgogIG5hdGl2ZT0iZmFsc2UiCiAgc3luY2hyb25pemVkPSJmYWxzZSIKQEAgLTIxNTAzMCw4ICsyMjc1NjIsNiBAQAogIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KLTxwYXJhbWV0ZXIgbmFtZT0iYWRhcHRlciIgdHlwZT0iYW5kcm9pZC53aWRnZXQuTGlzdEFkYXB0ZXIiPgotPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0ic2V0Q29sdW1uV2lkdGgiCiAgcmV0dXJuPSJ2b2lkIgpAQCAtMjE1MTI0LDYgKzIyNzY1NCwxOSBAQAogPHBhcmFtZXRlciBuYW1lPSJ2ZXJ0aWNhbFNwYWNpbmciIHR5cGU9ImludCI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzbW9vdGhTY3JvbGxCeU9mZnNldCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9Im9mZnNldCIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+CiA8ZmllbGQgbmFtZT0iQVVUT19GSVQiCiAgdHlwZT0iaW50IgogIHRyYW5zaWVudD0iZmFsc2UiCkBAIC0yMTYxOTUsNiArMjI4NzM4LDIwIEBACiA8cGFyYW1ldGVyIG5hbWU9ImF0dHJzIiB0eXBlPSJhbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0Ij4KIDwvcGFyYW1ldGVyPgogPC9jb25zdHJ1Y3Rvcj4KKzxjb25zdHJ1Y3RvciBuYW1lPSJMaW5lYXJMYXlvdXQiCisgdHlwZT0iYW5kcm9pZC53aWRnZXQuTGluZWFyTGF5b3V0IgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iY29udGV4dCIgdHlwZT0iYW5kcm9pZC5jb250ZW50LkNvbnRleHQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImF0dHJzIiB0eXBlPSJhbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJkZWZTdHlsZSIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPC9jb25zdHJ1Y3Rvcj4KIDxtZXRob2QgbmFtZT0iZ2V0QmFzZWxpbmVBbGlnbmVkQ2hpbGRJbmRleCIKICByZXR1cm49ImludCIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0yMTYyMzksNiArMjI4Nzk2LDE3IEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImlzTWVhc3VyZVdpdGhMYXJnZXN0Q2hpbGRFbmFibGVkIgorIHJldHVybj0iYm9vbGVhbiIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJvbkxheW91dCIKICByZXR1cm49InZvaWQiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMjE2MzEyLDYgKzIyODg4MCwxOSBAQAogPHBhcmFtZXRlciBuYW1lPSJob3Jpem9udGFsR3Jhdml0eSIgdHlwZT0iaW50Ij4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldE1lYXN1cmVXaXRoTGFyZ2VzdENoaWxkRW5hYmxlZCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImVuYWJsZWQiIHR5cGU9ImJvb2xlYW4iPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0ic2V0T3JpZW50YXRpb24iCiAgcmV0dXJuPSJ2b2lkIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTIxNjUwOCw2ICsyMjkwODksNjkxIEBACiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgogPC9pbnRlcmZhY2U+Cis8Y2xhc3MgbmFtZT0iTGlzdFBvcHVwV2luZG93IgorIGV4dGVuZHM9ImphdmEubGFuZy5PYmplY3QiCisgYWJzdHJhY3Q9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxjb25zdHJ1Y3RvciBuYW1lPSJMaXN0UG9wdXBXaW5kb3ciCisgdHlwZT0iYW5kcm9pZC53aWRnZXQuTGlzdFBvcHVwV2luZG93IgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iY29udGV4dCIgdHlwZT0iYW5kcm9pZC5jb250ZW50LkNvbnRleHQiPgorPC9wYXJhbWV0ZXI+Cis8L2NvbnN0cnVjdG9yPgorPGNvbnN0cnVjdG9yIG5hbWU9Ikxpc3RQb3B1cFdpbmRvdyIKKyB0eXBlPSJhbmRyb2lkLndpZGdldC5MaXN0UG9wdXBXaW5kb3ciCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJjb250ZXh0IiB0eXBlPSJhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iYXR0cnMiIHR5cGU9ImFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQiPgorPC9wYXJhbWV0ZXI+Cis8L2NvbnN0cnVjdG9yPgorPGNvbnN0cnVjdG9yIG5hbWU9Ikxpc3RQb3B1cFdpbmRvdyIKKyB0eXBlPSJhbmRyb2lkLndpZGdldC5MaXN0UG9wdXBXaW5kb3ciCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJjb250ZXh0IiB0eXBlPSJhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iYXR0cnMiIHR5cGU9ImFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImRlZlN0eWxlQXR0ciIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPC9jb25zdHJ1Y3Rvcj4KKzxjb25zdHJ1Y3RvciBuYW1lPSJMaXN0UG9wdXBXaW5kb3ciCisgdHlwZT0iYW5kcm9pZC53aWRnZXQuTGlzdFBvcHVwV2luZG93IgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iY29udGV4dCIgdHlwZT0iYW5kcm9pZC5jb250ZW50LkNvbnRleHQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImF0dHJzIiB0eXBlPSJhbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJkZWZTdHlsZUF0dHIiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iZGVmU3R5bGVSZXMiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzwvY29uc3RydWN0b3I+Cis8bWV0aG9kIG5hbWU9ImNsZWFyTGlzdFNlbGVjdGlvbiIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZGlzbWlzcyIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0QW5jaG9yVmlldyIKKyByZXR1cm49ImFuZHJvaWQudmlldy5WaWV3IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldEFuaW1hdGlvblN0eWxlIgorIHJldHVybj0iaW50IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldEJhY2tncm91bmQiCisgcmV0dXJuPSJhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldEhlaWdodCIKKyByZXR1cm49ImludCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRIb3Jpem9udGFsT2Zmc2V0IgorIHJldHVybj0iaW50IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldElucHV0TWV0aG9kTW9kZSIKKyByZXR1cm49ImludCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRMaXN0VmlldyIKKyByZXR1cm49ImFuZHJvaWQud2lkZ2V0Lkxpc3RWaWV3IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldFByb21wdFBvc2l0aW9uIgorIHJldHVybj0iaW50IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldFNlbGVjdGVkSXRlbSIKKyByZXR1cm49ImphdmEubGFuZy5PYmplY3QiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0U2VsZWN0ZWRJdGVtSWQiCisgcmV0dXJuPSJsb25nIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldFNlbGVjdGVkSXRlbVBvc2l0aW9uIgorIHJldHVybj0iaW50IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldFNlbGVjdGVkVmlldyIKKyByZXR1cm49ImFuZHJvaWQudmlldy5WaWV3IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldFNvZnRJbnB1dE1vZGUiCisgcmV0dXJuPSJpbnQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0VmVydGljYWxPZmZzZXQiCisgcmV0dXJuPSJpbnQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0V2lkdGgiCisgcmV0dXJuPSJpbnQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iaXNJbnB1dE1ldGhvZE5vdE5lZWRlZCIKKyByZXR1cm49ImJvb2xlYW4iCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iaXNNb2RhbCIKKyByZXR1cm49ImJvb2xlYW4iCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iaXNTaG93aW5nIgorIHJldHVybj0iYm9vbGVhbiIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJvbktleURvd24iCisgcmV0dXJuPSJib29sZWFuIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJrZXlDb2RlIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImV2ZW50IiB0eXBlPSJhbmRyb2lkLnZpZXcuS2V5RXZlbnQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ib25LZXlQcmVJbWUiCisgcmV0dXJuPSJib29sZWFuIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJrZXlDb2RlIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImV2ZW50IiB0eXBlPSJhbmRyb2lkLnZpZXcuS2V5RXZlbnQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ib25LZXlVcCIKKyByZXR1cm49ImJvb2xlYW4iCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImtleUNvZGUiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iZXZlbnQiIHR5cGU9ImFuZHJvaWQudmlldy5LZXlFdmVudCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJwZXJmb3JtSXRlbUNsaWNrIgorIHJldHVybj0iYm9vbGVhbiIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0icG9zaXRpb24iIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJwb3N0U2hvdyIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0QWRhcHRlciIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImFkYXB0ZXIiIHR5cGU9ImFuZHJvaWQud2lkZ2V0Lkxpc3RBZGFwdGVyIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldEFuY2hvclZpZXciCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJhbmNob3IiIHR5cGU9ImFuZHJvaWQudmlldy5WaWV3Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldEFuaW1hdGlvblN0eWxlIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iYW5pbWF0aW9uU3R5bGUiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRCYWNrZ3JvdW5kRHJhd2FibGUiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJkIiB0eXBlPSJhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldENvbnRlbnRXaWR0aCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9IndpZHRoIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0SGVpZ2h0IgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iaGVpZ2h0IiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0SG9yaXpvbnRhbE9mZnNldCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9Im9mZnNldCIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldElucHV0TWV0aG9kTW9kZSIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9Im1vZGUiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRMaXN0U2VsZWN0b3IiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJzZWxlY3RvciIgdHlwZT0iYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZSI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRNb2RhbCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9Im1vZGFsIiB0eXBlPSJib29sZWFuIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldE9uRGlzbWlzc0xpc3RlbmVyIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0ibGlzdGVuZXIiIHR5cGU9ImFuZHJvaWQud2lkZ2V0LlBvcHVwV2luZG93Lk9uRGlzbWlzc0xpc3RlbmVyIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldE9uSXRlbUNsaWNrTGlzdGVuZXIiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJjbGlja0xpc3RlbmVyIiB0eXBlPSJhbmRyb2lkLndpZGdldC5BZGFwdGVyVmlldy5Pbkl0ZW1DbGlja0xpc3RlbmVyIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldE9uSXRlbVNlbGVjdGVkTGlzdGVuZXIiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJzZWxlY3RlZExpc3RlbmVyIiB0eXBlPSJhbmRyb2lkLndpZGdldC5BZGFwdGVyVmlldy5Pbkl0ZW1TZWxlY3RlZExpc3RlbmVyIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldFByb21wdFBvc2l0aW9uIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0icG9zaXRpb24iIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRQcm9tcHRWaWV3IgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0icHJvbXB0IiB0eXBlPSJhbmRyb2lkLnZpZXcuVmlldyI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRTZWxlY3Rpb24iCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJwb3NpdGlvbiIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldFNvZnRJbnB1dE1vZGUiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJtb2RlIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0VmVydGljYWxPZmZzZXQiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJvZmZzZXQiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRXaWR0aCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9IndpZHRoIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2hvdyIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxmaWVsZCBuYW1lPSJJTlBVVF9NRVRIT0RfRlJPTV9GT0NVU0FCTEUiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIwIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IklOUFVUX01FVEhPRF9ORUVERUQiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIxIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IklOUFVUX01FVEhPRF9OT1RfTkVFREVEIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMiIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJNQVRDSF9QQVJFTlQiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSItMSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJQT1NJVElPTl9QUk9NUFRfQUJPVkUiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIwIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IlBPU0lUSU9OX1BST01QVF9CRUxPVyIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjEiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iV1JBUF9DT05URU5UIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iLTIiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8L2NsYXNzPgogPGNsYXNzIG5hbWU9Ikxpc3RWaWV3IgogIGV4dGVuZHM9ImFuZHJvaWQud2lkZ2V0LkFic0xpc3RWaWV3IgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTIxNjYxMiwxNyArMjI5ODc4LDYgQEAKIDxwYXJhbWV0ZXIgbmFtZT0idiIgdHlwZT0iYW5kcm9pZC52aWV3LlZpZXciPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KLTxtZXRob2QgbmFtZT0iY2xlYXJDaG9pY2VzIgotIHJldHVybj0idm9pZCIKLSBhYnN0cmFjdD0iZmFsc2UiCi0gbmF0aXZlPSJmYWxzZSIKLSBzeW5jaHJvbml6ZWQ9ImZhbHNlIgotIHN0YXRpYz0iZmFsc2UiCi0gZmluYWw9ImZhbHNlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgotIHZpc2liaWxpdHk9InB1YmxpYyIKLT4KLTwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJmaW5kVmlld1RyYXZlcnNhbCIKICByZXR1cm49ImFuZHJvaWQudmlldy5WaWV3IgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTIxNjY2Nyw1MSArMjI5OTIyLDcgQEAKICBzeW5jaHJvbml6ZWQ9ImZhbHNlIgogIHN0YXRpYz0iZmFsc2UiCiAgZmluYWw9ImZhbHNlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgotIHZpc2liaWxpdHk9InB1YmxpYyIKLT4KLTwvbWV0aG9kPgotPG1ldGhvZCBuYW1lPSJnZXRDaGVja2VkSXRlbUlkcyIKLSByZXR1cm49ImxvbmdbXSIKLSBhYnN0cmFjdD0iZmFsc2UiCi0gbmF0aXZlPSJmYWxzZSIKLSBzeW5jaHJvbml6ZWQ9ImZhbHNlIgotIHN0YXRpYz0iZmFsc2UiCi0gZmluYWw9ImZhbHNlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgotIHZpc2liaWxpdHk9InB1YmxpYyIKLT4KLTwvbWV0aG9kPgotPG1ldGhvZCBuYW1lPSJnZXRDaGVja2VkSXRlbVBvc2l0aW9uIgotIHJldHVybj0iaW50IgotIGFic3RyYWN0PSJmYWxzZSIKLSBuYXRpdmU9ImZhbHNlIgotIHN5bmNocm9uaXplZD0iZmFsc2UiCi0gc3RhdGljPSJmYWxzZSIKLSBmaW5hbD0iZmFsc2UiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCi0gdmlzaWJpbGl0eT0icHVibGljIgotPgotPC9tZXRob2Q+Ci08bWV0aG9kIG5hbWU9ImdldENoZWNrZWRJdGVtUG9zaXRpb25zIgotIHJldHVybj0iYW5kcm9pZC51dGlsLlNwYXJzZUJvb2xlYW5BcnJheSIKLSBhYnN0cmFjdD0iZmFsc2UiCi0gbmF0aXZlPSJmYWxzZSIKLSBzeW5jaHJvbml6ZWQ9ImZhbHNlIgotIHN0YXRpYz0iZmFsc2UiCi0gZmluYWw9ImZhbHNlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgotIHZpc2liaWxpdHk9InB1YmxpYyIKLT4KLTwvbWV0aG9kPgotPG1ldGhvZCBuYW1lPSJnZXRDaG9pY2VNb2RlIgotIHJldHVybj0iaW50IgotIGFic3RyYWN0PSJmYWxzZSIKLSBuYXRpdmU9ImZhbHNlIgotIHN5bmNocm9uaXplZD0iZmFsc2UiCi0gc3RhdGljPSJmYWxzZSIKLSBmaW5hbD0iZmFsc2UiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgZGVwcmVjYXRlZD0iZGVwcmVjYXRlZCIKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L21ldGhvZD4KQEAgLTIxNjc4MSw0MSArMjI5OTkyLDYgQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L21ldGhvZD4KLTxtZXRob2QgbmFtZT0iZ2V0T3ZlcnNjcm9sbEZvb3RlciIKLSByZXR1cm49ImFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuRHJhd2FibGUiCi0gYWJzdHJhY3Q9ImZhbHNlIgotIG5hdGl2ZT0iZmFsc2UiCi0gc3luY2hyb25pemVkPSJmYWxzZSIKLSBzdGF0aWM9ImZhbHNlIgotIGZpbmFsPSJmYWxzZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKLSB2aXNpYmlsaXR5PSJwdWJsaWMiCi0+Ci08L21ldGhvZD4KLTxtZXRob2QgbmFtZT0iZ2V0T3ZlcnNjcm9sbEhlYWRlciIKLSByZXR1cm49ImFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuRHJhd2FibGUiCi0gYWJzdHJhY3Q9ImZhbHNlIgotIG5hdGl2ZT0iZmFsc2UiCi0gc3luY2hyb25pemVkPSJmYWxzZSIKLSBzdGF0aWM9ImZhbHNlIgotIGZpbmFsPSJmYWxzZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKLSB2aXNpYmlsaXR5PSJwdWJsaWMiCi0+Ci08L21ldGhvZD4KLTxtZXRob2QgbmFtZT0iaXNJdGVtQ2hlY2tlZCIKLSByZXR1cm49ImJvb2xlYW4iCi0gYWJzdHJhY3Q9ImZhbHNlIgotIG5hdGl2ZT0iZmFsc2UiCi0gc3luY2hyb25pemVkPSJmYWxzZSIKLSBzdGF0aWM9ImZhbHNlIgotIGZpbmFsPSJmYWxzZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKLSB2aXNpYmlsaXR5PSJwdWJsaWMiCi0+Ci08cGFyYW1ldGVyIG5hbWU9InBvc2l0aW9uIiB0eXBlPSJpbnQiPgotPC9wYXJhbWV0ZXI+Ci08L21ldGhvZD4KIDxtZXRob2QgbmFtZT0icmVtb3ZlRm9vdGVyVmlldyIKICByZXR1cm49ImJvb2xlYW4iCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMjE2ODQyLDMyICsyMzAwMTgsNiBAQAogPHBhcmFtZXRlciBuYW1lPSJ2IiB0eXBlPSJhbmRyb2lkLnZpZXcuVmlldyI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgotPG1ldGhvZCBuYW1lPSJzZXRBZGFwdGVyIgotIHJldHVybj0idm9pZCIKLSBhYnN0cmFjdD0iZmFsc2UiCi0gbmF0aXZlPSJmYWxzZSIKLSBzeW5jaHJvbml6ZWQ9ImZhbHNlIgotIHN0YXRpYz0iZmFsc2UiCi0gZmluYWw9ImZhbHNlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgotIHZpc2liaWxpdHk9InB1YmxpYyIKLT4KLTxwYXJhbWV0ZXIgbmFtZT0iYWRhcHRlciIgdHlwZT0iYW5kcm9pZC53aWRnZXQuTGlzdEFkYXB0ZXIiPgotPC9wYXJhbWV0ZXI+Ci08L21ldGhvZD4KLTxtZXRob2QgbmFtZT0ic2V0Q2hvaWNlTW9kZSIKLSByZXR1cm49InZvaWQiCi0gYWJzdHJhY3Q9ImZhbHNlIgotIG5hdGl2ZT0iZmFsc2UiCi0gc3luY2hyb25pemVkPSJmYWxzZSIKLSBzdGF0aWM9ImZhbHNlIgotIGZpbmFsPSJmYWxzZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKLSB2aXNpYmlsaXR5PSJwdWJsaWMiCi0+Ci08cGFyYW1ldGVyIG5hbWU9ImNob2ljZU1vZGUiIHR5cGU9ImludCI+Ci08L3BhcmFtZXRlcj4KLTwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJzZXREaXZpZGVyIgogIHJldHVybj0idm9pZCIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0yMTY5MjAsMjEgKzIzMDA3MCw2IEBACiA8cGFyYW1ldGVyIG5hbWU9ImhlYWRlckRpdmlkZXJzRW5hYmxlZCIgdHlwZT0iYm9vbGVhbiI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgotPG1ldGhvZCBuYW1lPSJzZXRJdGVtQ2hlY2tlZCIKLSByZXR1cm49InZvaWQiCi0gYWJzdHJhY3Q9ImZhbHNlIgotIG5hdGl2ZT0iZmFsc2UiCi0gc3luY2hyb25pemVkPSJmYWxzZSIKLSBzdGF0aWM9ImZhbHNlIgotIGZpbmFsPSJmYWxzZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKLSB2aXNpYmlsaXR5PSJwdWJsaWMiCi0+Ci08cGFyYW1ldGVyIG5hbWU9InBvc2l0aW9uIiB0eXBlPSJpbnQiPgotPC9wYXJhbWV0ZXI+Ci08cGFyYW1ldGVyIG5hbWU9InZhbHVlIiB0eXBlPSJib29sZWFuIj4KLTwvcGFyYW1ldGVyPgotPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9InNldEl0ZW1zQ2FuRm9jdXMiCiAgcmV0dXJuPSJ2b2lkIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTIxNjk0OCwzMiArMjMwMDgzLDYgQEAKIDxwYXJhbWV0ZXIgbmFtZT0iaXRlbXNDYW5Gb2N1cyIgdHlwZT0iYm9vbGVhbiI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgotPG1ldGhvZCBuYW1lPSJzZXRPdmVyc2Nyb2xsRm9vdGVyIgotIHJldHVybj0idm9pZCIKLSBhYnN0cmFjdD0iZmFsc2UiCi0gbmF0aXZlPSJmYWxzZSIKLSBzeW5jaHJvbml6ZWQ9ImZhbHNlIgotIHN0YXRpYz0iZmFsc2UiCi0gZmluYWw9ImZhbHNlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgotIHZpc2liaWxpdHk9InB1YmxpYyIKLT4KLTxwYXJhbWV0ZXIgbmFtZT0iZm9vdGVyIiB0eXBlPSJhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlIj4KLTwvcGFyYW1ldGVyPgotPC9tZXRob2Q+Ci08bWV0aG9kIG5hbWU9InNldE92ZXJzY3JvbGxIZWFkZXIiCi0gcmV0dXJuPSJ2b2lkIgotIGFic3RyYWN0PSJmYWxzZSIKLSBuYXRpdmU9ImZhbHNlIgotIHN5bmNocm9uaXplZD0iZmFsc2UiCi0gc3RhdGljPSJmYWxzZSIKLSBmaW5hbD0iZmFsc2UiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCi0gdmlzaWJpbGl0eT0icHVibGljIgotPgotPHBhcmFtZXRlciBuYW1lPSJoZWFkZXIiIHR5cGU9ImFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuRHJhd2FibGUiPgotPC9wYXJhbWV0ZXI+Ci08L21ldGhvZD4KIDxtZXRob2QgbmFtZT0ic2V0U2VsZWN0aW9uIgogIHJldHVybj0idm9pZCIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0yMTcwMTMsMzkgKzIzMDEyMiwxOSBAQAogPHBhcmFtZXRlciBuYW1lPSJ5IiB0eXBlPSJpbnQiPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KLTxmaWVsZCBuYW1lPSJDSE9JQ0VfTU9ERV9NVUxUSVBMRSIKLSB0eXBlPSJpbnQiCi0gdHJhbnNpZW50PSJmYWxzZSIKLSB2b2xhdGlsZT0iZmFsc2UiCi0gdmFsdWU9IjIiCi0gc3RhdGljPSJ0cnVlIgotIGZpbmFsPSJ0cnVlIgorPG1ldGhvZCBuYW1lPSJzbW9vdGhTY3JvbGxCeU9mZnNldCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKICBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+Ci08L2ZpZWxkPgotPGZpZWxkIG5hbWU9IkNIT0lDRV9NT0RFX05PTkUiCi0gdHlwZT0iaW50IgotIHRyYW5zaWVudD0iZmFsc2UiCi0gdm9sYXRpbGU9ImZhbHNlIgotIHZhbHVlPSIwIgotIHN0YXRpYz0idHJ1ZSIKLSBmaW5hbD0idHJ1ZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKLSB2aXNpYmlsaXR5PSJwdWJsaWMiCi0+Ci08L2ZpZWxkPgotPGZpZWxkIG5hbWU9IkNIT0lDRV9NT0RFX1NJTkdMRSIKLSB0eXBlPSJpbnQiCi0gdHJhbnNpZW50PSJmYWxzZSIKLSB2b2xhdGlsZT0iZmFsc2UiCi0gdmFsdWU9IjEiCi0gc3RhdGljPSJ0cnVlIgotIGZpbmFsPSJ0cnVlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgotIHZpc2liaWxpdHk9InB1YmxpYyIKLT4KLTwvZmllbGQ+Cis8cGFyYW1ldGVyIG5hbWU9Im9mZnNldCIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+CiA8L2NsYXNzPgogPGNsYXNzIG5hbWU9Ikxpc3RWaWV3LkZpeGVkVmlld0luZm8iCiAgZXh0ZW5kcz0iamF2YS5sYW5nLk9iamVjdCIKQEAgLTIxNzU0NSw3ICsyMzA2MzQsNyBAQAogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KIDwvaW50ZXJmYWNlPgotPGNsYXNzIG5hbWU9Ik92ZXJTY3JvbGxlciIKKzxjbGFzcyBuYW1lPSJQb3B1cE1lbnUiCiAgZXh0ZW5kcz0iamF2YS5sYW5nLk9iamVjdCIKICBhYnN0cmFjdD0iZmFsc2UiCiAgc3RhdGljPSJmYWxzZSIKQEAgLTIxNzU1Myw4ICsyMzA2NDIsOCBAQAogIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KLTxjb25zdHJ1Y3RvciBuYW1lPSJPdmVyU2Nyb2xsZXIiCi0gdHlwZT0iYW5kcm9pZC53aWRnZXQuT3ZlclNjcm9sbGVyIgorPGNvbnN0cnVjdG9yIG5hbWU9IlBvcHVwTWVudSIKKyB0eXBlPSJhbmRyb2lkLndpZGdldC5Qb3B1cE1lbnUiCiAgc3RhdGljPSJmYWxzZSIKICBmaW5hbD0iZmFsc2UiCiAgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCkBAIC0yMTc1NjIsMzYgKzIzMDY1MSwxMCBAQAogPgogPHBhcmFtZXRlciBuYW1lPSJjb250ZXh0IiB0eXBlPSJhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCI+CiA8L3BhcmFtZXRlcj4KLTwvY29uc3RydWN0b3I+Ci08Y29uc3RydWN0b3IgbmFtZT0iT3ZlclNjcm9sbGVyIgotIHR5cGU9ImFuZHJvaWQud2lkZ2V0Lk92ZXJTY3JvbGxlciIKLSBzdGF0aWM9ImZhbHNlIgotIGZpbmFsPSJmYWxzZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKLSB2aXNpYmlsaXR5PSJwdWJsaWMiCi0+Ci08cGFyYW1ldGVyIG5hbWU9ImNvbnRleHQiIHR5cGU9ImFuZHJvaWQuY29udGVudC5Db250ZXh0Ij4KLTwvcGFyYW1ldGVyPgotPHBhcmFtZXRlciBuYW1lPSJpbnRlcnBvbGF0b3IiIHR5cGU9ImFuZHJvaWQudmlldy5hbmltYXRpb24uSW50ZXJwb2xhdG9yIj4KKzxwYXJhbWV0ZXIgbmFtZT0iYW5jaG9yIiB0eXBlPSJhbmRyb2lkLnZpZXcuVmlldyI+CiA8L3BhcmFtZXRlcj4KIDwvY29uc3RydWN0b3I+Ci08Y29uc3RydWN0b3IgbmFtZT0iT3ZlclNjcm9sbGVyIgotIHR5cGU9ImFuZHJvaWQud2lkZ2V0Lk92ZXJTY3JvbGxlciIKLSBzdGF0aWM9ImZhbHNlIgotIGZpbmFsPSJmYWxzZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKLSB2aXNpYmlsaXR5PSJwdWJsaWMiCi0+Ci08cGFyYW1ldGVyIG5hbWU9ImNvbnRleHQiIHR5cGU9ImFuZHJvaWQuY29udGVudC5Db250ZXh0Ij4KLTwvcGFyYW1ldGVyPgotPHBhcmFtZXRlciBuYW1lPSJpbnRlcnBvbGF0b3IiIHR5cGU9ImFuZHJvaWQudmlldy5hbmltYXRpb24uSW50ZXJwb2xhdG9yIj4KLTwvcGFyYW1ldGVyPgotPHBhcmFtZXRlciBuYW1lPSJib3VuY2VDb2VmZmljaWVudFgiIHR5cGU9ImZsb2F0Ij4KLTwvcGFyYW1ldGVyPgotPHBhcmFtZXRlciBuYW1lPSJib3VuY2VDb2VmZmljaWVudFkiIHR5cGU9ImZsb2F0Ij4KLTwvcGFyYW1ldGVyPgotPC9jb25zdHJ1Y3Rvcj4KLTxtZXRob2QgbmFtZT0iYWJvcnRBbmltYXRpb24iCis8bWV0aG9kIG5hbWU9ImRpc21pc3MiCiAgcmV0dXJuPSJ2b2lkIgogIGFic3RyYWN0PSJmYWxzZSIKICBuYXRpdmU9ImZhbHNlIgpAQCAtMjE3NjAyLDggKzIzMDY2NSw4IEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9tZXRob2Q+Ci08bWV0aG9kIG5hbWU9ImNvbXB1dGVTY3JvbGxPZmZzZXQiCi0gcmV0dXJuPSJib29sZWFuIgorPG1ldGhvZCBuYW1lPSJnZXRNZW51IgorIHJldHVybj0iYW5kcm9pZC52aWV3Lk1lbnUiCiAgYWJzdHJhY3Q9ImZhbHNlIgogIG5hdGl2ZT0iZmFsc2UiCiAgc3luY2hyb25pemVkPSJmYWxzZSIKQEAgLTIxNzYxMyw3ICsyMzA2NzYsMTggQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L21ldGhvZD4KLTxtZXRob2QgbmFtZT0iZmxpbmciCis8bWV0aG9kIG5hbWU9ImdldE1lbnVJbmZsYXRlciIKKyByZXR1cm49ImFuZHJvaWQudmlldy5NZW51SW5mbGF0ZXIiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0T25NZW51SXRlbUNsaWNrTGlzdGVuZXIiCiAgcmV0dXJuPSJ2b2lkIgogIGFic3RyYWN0PSJmYWxzZSIKICBuYXRpdmU9ImZhbHNlIgpAQCAtMjE3NjIzLDI0ICsyMzA2OTcsMTAgQEAKICBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+Ci08cGFyYW1ldGVyIG5hbWU9InN0YXJ0WCIgdHlwZT0iaW50Ij4KLTwvcGFyYW1ldGVyPgotPHBhcmFtZXRlciBuYW1lPSJzdGFydFkiIHR5cGU9ImludCI+Ci08L3BhcmFtZXRlcj4KLTxwYXJhbWV0ZXIgbmFtZT0idmVsb2NpdHlYIiB0eXBlPSJpbnQiPgotPC9wYXJhbWV0ZXI+Ci08cGFyYW1ldGVyIG5hbWU9InZlbG9jaXR5WSIgdHlwZT0iaW50Ij4KLTwvcGFyYW1ldGVyPgotPHBhcmFtZXRlciBuYW1lPSJtaW5YIiB0eXBlPSJpbnQiPgotPC9wYXJhbWV0ZXI+Ci08cGFyYW1ldGVyIG5hbWU9Im1heFgiIHR5cGU9ImludCI+Ci08L3BhcmFtZXRlcj4KLTxwYXJhbWV0ZXIgbmFtZT0ibWluWSIgdHlwZT0iaW50Ij4KLTwvcGFyYW1ldGVyPgotPHBhcmFtZXRlciBuYW1lPSJtYXhZIiB0eXBlPSJpbnQiPgorPHBhcmFtZXRlciBuYW1lPSJsaXN0ZW5lciIgdHlwZT0iYW5kcm9pZC53aWRnZXQuUG9wdXBNZW51Lk9uTWVudUl0ZW1DbGlja0xpc3RlbmVyIj4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+Ci08bWV0aG9kIG5hbWU9ImZsaW5nIgorPG1ldGhvZCBuYW1lPSJzaG93IgogIHJldHVybj0idm9pZCIKICBhYnN0cmFjdD0iZmFsc2UiCiAgbmF0aXZlPSJmYWxzZSIKQEAgLTIxNzY1MCwyMjYgKzIzMDcxMCwyOSBAQAogIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KLTxwYXJhbWV0ZXIgbmFtZT0ic3RhcnRYIiB0eXBlPSJpbnQiPgotPC9wYXJhbWV0ZXI+Ci08cGFyYW1ldGVyIG5hbWU9InN0YXJ0WSIgdHlwZT0iaW50Ij4KLTwvcGFyYW1ldGVyPgotPHBhcmFtZXRlciBuYW1lPSJ2ZWxvY2l0eVgiIHR5cGU9ImludCI+Ci08L3BhcmFtZXRlcj4KLTxwYXJhbWV0ZXIgbmFtZT0idmVsb2NpdHlZIiB0eXBlPSJpbnQiPgotPC9wYXJhbWV0ZXI+Ci08cGFyYW1ldGVyIG5hbWU9Im1pblgiIHR5cGU9ImludCI+Ci08L3BhcmFtZXRlcj4KLTxwYXJhbWV0ZXIgbmFtZT0ibWF4WCIgdHlwZT0iaW50Ij4KLTwvcGFyYW1ldGVyPgotPHBhcmFtZXRlciBuYW1lPSJtaW5ZIiB0eXBlPSJpbnQiPgotPC9wYXJhbWV0ZXI+Ci08cGFyYW1ldGVyIG5hbWU9Im1heFkiIHR5cGU9ImludCI+Ci08L3BhcmFtZXRlcj4KLTxwYXJhbWV0ZXIgbmFtZT0ib3ZlclgiIHR5cGU9ImludCI+Ci08L3BhcmFtZXRlcj4KLTxwYXJhbWV0ZXIgbmFtZT0ib3ZlclkiIHR5cGU9ImludCI+Ci08L3BhcmFtZXRlcj4KLTwvbWV0aG9kPgotPG1ldGhvZCBuYW1lPSJmb3JjZUZpbmlzaGVkIgotIHJldHVybj0idm9pZCIKLSBhYnN0cmFjdD0iZmFsc2UiCi0gbmF0aXZlPSJmYWxzZSIKLSBzeW5jaHJvbml6ZWQ9ImZhbHNlIgotIHN0YXRpYz0iZmFsc2UiCi0gZmluYWw9InRydWUiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCi0gdmlzaWJpbGl0eT0icHVibGljIgotPgotPHBhcmFtZXRlciBuYW1lPSJmaW5pc2hlZCIgdHlwZT0iYm9vbGVhbiI+Ci08L3BhcmFtZXRlcj4KLTwvbWV0aG9kPgotPG1ldGhvZCBuYW1lPSJnZXRDdXJyWCIKLSByZXR1cm49ImludCIKLSBhYnN0cmFjdD0iZmFsc2UiCi0gbmF0aXZlPSJmYWxzZSIKLSBzeW5jaHJvbml6ZWQ9ImZhbHNlIgotIHN0YXRpYz0iZmFsc2UiCi0gZmluYWw9InRydWUiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCi0gdmlzaWJpbGl0eT0icHVibGljIgotPgotPC9tZXRob2Q+Ci08bWV0aG9kIG5hbWU9ImdldEN1cnJZIgotIHJldHVybj0iaW50IgotIGFic3RyYWN0PSJmYWxzZSIKLSBuYXRpdmU9ImZhbHNlIgotIHN5bmNocm9uaXplZD0iZmFsc2UiCi0gc3RhdGljPSJmYWxzZSIKLSBmaW5hbD0idHJ1ZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKLSB2aXNpYmlsaXR5PSJwdWJsaWMiCi0+Ci08L21ldGhvZD4KLTxtZXRob2QgbmFtZT0iZ2V0RmluYWxYIgotIHJldHVybj0iaW50IgotIGFic3RyYWN0PSJmYWxzZSIKLSBuYXRpdmU9ImZhbHNlIgotIHN5bmNocm9uaXplZD0iZmFsc2UiCi0gc3RhdGljPSJmYWxzZSIKLSBmaW5hbD0idHJ1ZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKLSB2aXNpYmlsaXR5PSJwdWJsaWMiCi0+Ci08L21ldGhvZD4KLTxtZXRob2QgbmFtZT0iZ2V0RmluYWxZIgotIHJldHVybj0iaW50IgotIGFic3RyYWN0PSJmYWxzZSIKLSBuYXRpdmU9ImZhbHNlIgotIHN5bmNocm9uaXplZD0iZmFsc2UiCi0gc3RhdGljPSJmYWxzZSIKLSBmaW5hbD0idHJ1ZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKLSB2aXNpYmlsaXR5PSJwdWJsaWMiCi0+Ci08L21ldGhvZD4KLTxtZXRob2QgbmFtZT0iZ2V0U3RhcnRYIgotIHJldHVybj0iaW50IgotIGFic3RyYWN0PSJmYWxzZSIKLSBuYXRpdmU9ImZhbHNlIgotIHN5bmNocm9uaXplZD0iZmFsc2UiCi0gc3RhdGljPSJmYWxzZSIKLSBmaW5hbD0idHJ1ZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKLSB2aXNpYmlsaXR5PSJwdWJsaWMiCi0+Ci08L21ldGhvZD4KLTxtZXRob2QgbmFtZT0iZ2V0U3RhcnRZIgotIHJldHVybj0iaW50IgotIGFic3RyYWN0PSJmYWxzZSIKLSBuYXRpdmU9ImZhbHNlIgotIHN5bmNocm9uaXplZD0iZmFsc2UiCi0gc3RhdGljPSJmYWxzZSIKLSBmaW5hbD0idHJ1ZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKLSB2aXNpYmlsaXR5PSJwdWJsaWMiCi0+Ci08L21ldGhvZD4KLTxtZXRob2QgbmFtZT0iaXNGaW5pc2hlZCIKLSByZXR1cm49ImJvb2xlYW4iCi0gYWJzdHJhY3Q9ImZhbHNlIgotIG5hdGl2ZT0iZmFsc2UiCi0gc3luY2hyb25pemVkPSJmYWxzZSIKLSBzdGF0aWM9ImZhbHNlIgotIGZpbmFsPSJ0cnVlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgotIHZpc2liaWxpdHk9InB1YmxpYyIKLT4KLTwvbWV0aG9kPgotPG1ldGhvZCBuYW1lPSJpc092ZXJzY3JvbGxlZCIKLSByZXR1cm49ImJvb2xlYW4iCi0gYWJzdHJhY3Q9ImZhbHNlIgotIG5hdGl2ZT0iZmFsc2UiCi0gc3luY2hyb25pemVkPSJmYWxzZSIKLSBzdGF0aWM9ImZhbHNlIgotIGZpbmFsPSJmYWxzZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKLSB2aXNpYmlsaXR5PSJwdWJsaWMiCi0+Ci08L21ldGhvZD4KLTxtZXRob2QgbmFtZT0ibm90aWZ5SG9yaXpvbnRhbEVkZ2VSZWFjaGVkIgotIHJldHVybj0idm9pZCIKLSBhYnN0cmFjdD0iZmFsc2UiCi0gbmF0aXZlPSJmYWxzZSIKLSBzeW5jaHJvbml6ZWQ9ImZhbHNlIgotIHN0YXRpYz0iZmFsc2UiCi0gZmluYWw9ImZhbHNlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgotIHZpc2liaWxpdHk9InB1YmxpYyIKLT4KLTxwYXJhbWV0ZXIgbmFtZT0ic3RhcnRYIiB0eXBlPSJpbnQiPgotPC9wYXJhbWV0ZXI+Ci08cGFyYW1ldGVyIG5hbWU9ImZpbmFsWCIgdHlwZT0iaW50Ij4KLTwvcGFyYW1ldGVyPgotPHBhcmFtZXRlciBuYW1lPSJvdmVyWCIgdHlwZT0iaW50Ij4KLTwvcGFyYW1ldGVyPgotPC9tZXRob2Q+Ci08bWV0aG9kIG5hbWU9Im5vdGlmeVZlcnRpY2FsRWRnZVJlYWNoZWQiCi0gcmV0dXJuPSJ2b2lkIgotIGFic3RyYWN0PSJmYWxzZSIKLSBuYXRpdmU9ImZhbHNlIgotIHN5bmNocm9uaXplZD0iZmFsc2UiCi0gc3RhdGljPSJmYWxzZSIKLSBmaW5hbD0iZmFsc2UiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCi0gdmlzaWJpbGl0eT0icHVibGljIgotPgotPHBhcmFtZXRlciBuYW1lPSJzdGFydFkiIHR5cGU9ImludCI+Ci08L3BhcmFtZXRlcj4KLTxwYXJhbWV0ZXIgbmFtZT0iZmluYWxZIiB0eXBlPSJpbnQiPgotPC9wYXJhbWV0ZXI+Ci08cGFyYW1ldGVyIG5hbWU9Im92ZXJZIiB0eXBlPSJpbnQiPgotPC9wYXJhbWV0ZXI+Ci08L21ldGhvZD4KLTxtZXRob2QgbmFtZT0ic3ByaW5nYmFjayIKLSByZXR1cm49ImJvb2xlYW4iCi0gYWJzdHJhY3Q9ImZhbHNlIgotIG5hdGl2ZT0iZmFsc2UiCi0gc3luY2hyb25pemVkPSJmYWxzZSIKLSBzdGF0aWM9ImZhbHNlIgotIGZpbmFsPSJmYWxzZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKLSB2aXNpYmlsaXR5PSJwdWJsaWMiCi0+Ci08cGFyYW1ldGVyIG5hbWU9InN0YXJ0WCIgdHlwZT0iaW50Ij4KLTwvcGFyYW1ldGVyPgotPHBhcmFtZXRlciBuYW1lPSJzdGFydFkiIHR5cGU9ImludCI+Ci08L3BhcmFtZXRlcj4KLTxwYXJhbWV0ZXIgbmFtZT0ibWluWCIgdHlwZT0iaW50Ij4KLTwvcGFyYW1ldGVyPgotPHBhcmFtZXRlciBuYW1lPSJtYXhYIiB0eXBlPSJpbnQiPgotPC9wYXJhbWV0ZXI+Ci08cGFyYW1ldGVyIG5hbWU9Im1pblkiIHR5cGU9ImludCI+Ci08L3BhcmFtZXRlcj4KLTxwYXJhbWV0ZXIgbmFtZT0ibWF4WSIgdHlwZT0iaW50Ij4KLTwvcGFyYW1ldGVyPgotPC9tZXRob2Q+Ci08bWV0aG9kIG5hbWU9InN0YXJ0U2Nyb2xsIgotIHJldHVybj0idm9pZCIKLSBhYnN0cmFjdD0iZmFsc2UiCi0gbmF0aXZlPSJmYWxzZSIKLSBzeW5jaHJvbml6ZWQ9ImZhbHNlIgotIHN0YXRpYz0iZmFsc2UiCi0gZmluYWw9ImZhbHNlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgotIHZpc2liaWxpdHk9InB1YmxpYyIKLT4KLTxwYXJhbWV0ZXIgbmFtZT0ic3RhcnRYIiB0eXBlPSJpbnQiPgotPC9wYXJhbWV0ZXI+Ci08cGFyYW1ldGVyIG5hbWU9InN0YXJ0WSIgdHlwZT0iaW50Ij4KLTwvcGFyYW1ldGVyPgotPHBhcmFtZXRlciBuYW1lPSJkeCIgdHlwZT0iaW50Ij4KLTwvcGFyYW1ldGVyPgotPHBhcmFtZXRlciBuYW1lPSJkeSIgdHlwZT0iaW50Ij4KLTwvcGFyYW1ldGVyPgotPC9tZXRob2Q+Ci08bWV0aG9kIG5hbWU9InN0YXJ0U2Nyb2xsIgotIHJldHVybj0idm9pZCIKLSBhYnN0cmFjdD0iZmFsc2UiCi0gbmF0aXZlPSJmYWxzZSIKLSBzeW5jaHJvbml6ZWQ9ImZhbHNlIgotIHN0YXRpYz0iZmFsc2UiCi0gZmluYWw9ImZhbHNlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgotIHZpc2liaWxpdHk9InB1YmxpYyIKLT4KLTxwYXJhbWV0ZXIgbmFtZT0ic3RhcnRYIiB0eXBlPSJpbnQiPgotPC9wYXJhbWV0ZXI+Ci08cGFyYW1ldGVyIG5hbWU9InN0YXJ0WSIgdHlwZT0iaW50Ij4KLTwvcGFyYW1ldGVyPgotPHBhcmFtZXRlciBuYW1lPSJkeCIgdHlwZT0iaW50Ij4KLTwvcGFyYW1ldGVyPgotPHBhcmFtZXRlciBuYW1lPSJkeSIgdHlwZT0iaW50Ij4KLTwvcGFyYW1ldGVyPgotPHBhcmFtZXRlciBuYW1lPSJkdXJhdGlvbiIgdHlwZT0iaW50Ij4KLTwvcGFyYW1ldGVyPgogPC9tZXRob2Q+CiA8L2NsYXNzPgorPGludGVyZmFjZSBuYW1lPSJQb3B1cE1lbnUuT25NZW51SXRlbUNsaWNrTGlzdGVuZXIiCisgYWJzdHJhY3Q9InRydWUiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8bWV0aG9kIG5hbWU9Im9uTWVudUl0ZW1DbGljayIKKyByZXR1cm49ImJvb2xlYW4iCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iaXRlbSIgdHlwZT0iYW5kcm9pZC52aWV3Lk1lbnVJdGVtIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8L2ludGVyZmFjZT4KIDxjbGFzcyBuYW1lPSJQb3B1cFdpbmRvdyIKICBleHRlbmRzPSJqYXZhLmxhbmcuT2JqZWN0IgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTIxNzkyMSw2ICsyMzA3ODQsMjIgQEAKICBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+Cis8cGFyYW1ldGVyIG5hbWU9ImNvbnRleHQiIHR5cGU9ImFuZHJvaWQuY29udGVudC5Db250ZXh0Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJhdHRycyIgdHlwZT0iYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iZGVmU3R5bGVBdHRyIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImRlZlN0eWxlUmVzIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8L2NvbnN0cnVjdG9yPgorPGNvbnN0cnVjdG9yIG5hbWU9IlBvcHVwV2luZG93IgorIHR5cGU9ImFuZHJvaWQud2lkZ2V0LlBvcHVwV2luZG93IgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KIDwvY29uc3RydWN0b3I+CiA8Y29uc3RydWN0b3IgbmFtZT0iUG9wdXBXaW5kb3ciCiAgdHlwZT0iYW5kcm9pZC53aWRnZXQuUG9wdXBXaW5kb3ciCkBAIC0yMTg5NTAsNiArMjMxODI5LDE3IEBACiA8cGFyYW1ldGVyIG5hbWU9ImV4Y2x1ZGVNaW1lcyIgdHlwZT0iamF2YS5sYW5nLlN0cmluZ1tdIj4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldEltYWdlVG9EZWZhdWx0IgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJzZXRNb2RlIgogIHJldHVybj0idm9pZCIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0yMjAwODYsNiArMjMyOTc2LDIxIEBACiA8cGFyYW1ldGVyIG5hbWU9InZhbHVlIiB0eXBlPSJkb3VibGUiPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0RW1wdHlWaWV3IgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0idmlld0lkIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImVtcHR5Vmlld0lkIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0ic2V0RmxvYXQiCiAgcmV0dXJuPSJ2b2lkIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTIyMDE2NSw2ICsyMzMwNzAsMjMgQEAKIDxwYXJhbWV0ZXIgbmFtZT0idmFsdWUiIHR5cGU9ImludCI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRJbnRlbnQiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJ2aWV3SWQiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ibWV0aG9kTmFtZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0idmFsdWUiIHR5cGU9ImFuZHJvaWQuY29udGVudC5JbnRlbnQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0ic2V0TG9uZyIKICByZXR1cm49InZvaWQiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMjIwMjE2LDYgKzIzMzEzOCw1MSBAQAogPHBhcmFtZXRlciBuYW1lPSJpbmRldGVybWluYXRlIiB0eXBlPSJib29sZWFuIj4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldFJlbGF0aXZlU2Nyb2xsUG9zaXRpb24iCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJ2aWV3SWQiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ib2Zmc2V0IiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0UmVtb3RlQWRhcHRlciIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InZpZXdJZCIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJpbnRlbnQiIHR5cGU9ImFuZHJvaWQuY29udGVudC5JbnRlbnQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0U2Nyb2xsUG9zaXRpb24iCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJ2aWV3SWQiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0icG9zaXRpb24iIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJzZXRTaG9ydCIKICByZXR1cm49InZvaWQiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMjIwMzEyLDYgKzIzMzI3OSwzMiBAQAogPHBhcmFtZXRlciBuYW1lPSJ2aXNpYmlsaXR5IiB0eXBlPSJpbnQiPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2hvd05leHQiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJ2aWV3SWQiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzaG93UHJldmlvdXMiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJ2aWV3SWQiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJ3cml0ZVRvUGFyY2VsIgogIHJldHVybj0idm9pZCIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0yMjAzNzgsNiArMjMzMzcxLDE2MCBAQAogPGltcGxlbWVudHMgbmFtZT0iamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbiI+CiA8L2ltcGxlbWVudHM+CiA8L2NsYXNzPgorPGNsYXNzIG5hbWU9IlJlbW90ZVZpZXdzU2VydmljZSIKKyBleHRlbmRzPSJhbmRyb2lkLmFwcC5TZXJ2aWNlIgorIGFic3RyYWN0PSJ0cnVlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxjb25zdHJ1Y3RvciBuYW1lPSJSZW1vdGVWaWV3c1NlcnZpY2UiCisgdHlwZT0iYW5kcm9pZC53aWRnZXQuUmVtb3RlVmlld3NTZXJ2aWNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvY29uc3RydWN0b3I+Cis8bWV0aG9kIG5hbWU9Im9uQmluZCIKKyByZXR1cm49ImFuZHJvaWQub3MuSUJpbmRlciIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iaW50ZW50IiB0eXBlPSJhbmRyb2lkLmNvbnRlbnQuSW50ZW50Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9Im9uR2V0Vmlld0ZhY3RvcnkiCisgcmV0dXJuPSJhbmRyb2lkLndpZGdldC5SZW1vdGVWaWV3c1NlcnZpY2UuUmVtb3RlVmlld3NGYWN0b3J5IgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImludGVudCIgdHlwZT0iYW5kcm9pZC5jb250ZW50LkludGVudCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPC9jbGFzcz4KKzxpbnRlcmZhY2UgbmFtZT0iUmVtb3RlVmlld3NTZXJ2aWNlLlJlbW90ZVZpZXdzRmFjdG9yeSIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxtZXRob2QgbmFtZT0iZ2V0Q291bnQiCisgcmV0dXJuPSJpbnQiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRJdGVtSWQiCisgcmV0dXJuPSJsb25nIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InBvc2l0aW9uIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0TG9hZGluZ1ZpZXciCisgcmV0dXJuPSJhbmRyb2lkLndpZGdldC5SZW1vdGVWaWV3cyIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldFZpZXdBdCIKKyByZXR1cm49ImFuZHJvaWQud2lkZ2V0LlJlbW90ZVZpZXdzIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InBvc2l0aW9uIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0Vmlld1R5cGVDb3VudCIKKyByZXR1cm49ImludCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9Imhhc1N0YWJsZUlkcyIKKyByZXR1cm49ImJvb2xlYW4iCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJvbkNyZWF0ZSIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJvbkRhdGFTZXRDaGFuZ2VkIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9Im9uRGVzdHJveSIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPC9pbnRlcmZhY2U+CiA8Y2xhc3MgbmFtZT0iUmVzb3VyY2VDdXJzb3JBZGFwdGVyIgogIGV4dGVuZHM9ImFuZHJvaWQud2lkZ2V0LkN1cnNvckFkYXB0ZXIiCiAgYWJzdHJhY3Q9InRydWUiCkBAIC0yMjA0MTYsNiArMjMzNTYzLDIyIEBACiA8cGFyYW1ldGVyIG5hbWU9ImF1dG9SZXF1ZXJ5IiB0eXBlPSJib29sZWFuIj4KIDwvcGFyYW1ldGVyPgogPC9jb25zdHJ1Y3Rvcj4KKzxjb25zdHJ1Y3RvciBuYW1lPSJSZXNvdXJjZUN1cnNvckFkYXB0ZXIiCisgdHlwZT0iYW5kcm9pZC53aWRnZXQuUmVzb3VyY2VDdXJzb3JBZGFwdGVyIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iY29udGV4dCIgdHlwZT0iYW5kcm9pZC5jb250ZW50LkNvbnRleHQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImxheW91dCIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJjIiB0eXBlPSJhbmRyb2lkLmRhdGFiYXNlLkN1cnNvciI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iZmxhZ3MiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzwvY29uc3RydWN0b3I+CiA8bWV0aG9kIG5hbWU9Im5ld1ZpZXciCiAgcmV0dXJuPSJhbmRyb2lkLnZpZXcuVmlldyIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0yMjEwNDQsNiArMjM0MjA3LDI2NSBAQAogPgogPC9tZXRob2Q+CiA8L2NsYXNzPgorPGNsYXNzIG5hbWU9IlNlYXJjaFZpZXciCisgZXh0ZW5kcz0iYW5kcm9pZC53aWRnZXQuTGluZWFyTGF5b3V0IgorIGFic3RyYWN0PSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8Y29uc3RydWN0b3IgbmFtZT0iU2VhcmNoVmlldyIKKyB0eXBlPSJhbmRyb2lkLndpZGdldC5TZWFyY2hWaWV3IgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iY29udGV4dCIgdHlwZT0iYW5kcm9pZC5jb250ZW50LkNvbnRleHQiPgorPC9wYXJhbWV0ZXI+Cis8L2NvbnN0cnVjdG9yPgorPGNvbnN0cnVjdG9yIG5hbWU9IlNlYXJjaFZpZXciCisgdHlwZT0iYW5kcm9pZC53aWRnZXQuU2VhcmNoVmlldyIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImNvbnRleHQiIHR5cGU9ImFuZHJvaWQuY29udGVudC5Db250ZXh0Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJhdHRycyIgdHlwZT0iYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldCI+Cis8L3BhcmFtZXRlcj4KKzwvY29uc3RydWN0b3I+Cis8bWV0aG9kIG5hbWU9ImdldFN1Z2dlc3Rpb25zQWRhcHRlciIKKyByZXR1cm49ImFuZHJvaWQud2lkZ2V0LkN1cnNvckFkYXB0ZXIiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iaXNJY29uZmllZEJ5RGVmYXVsdCIKKyByZXR1cm49ImJvb2xlYW4iCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iaXNJY29uaWZpZWQiCisgcmV0dXJuPSJib29sZWFuIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImlzU3VibWl0QnV0dG9uRW5hYmxlZCIKKyByZXR1cm49ImJvb2xlYW4iCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0SWNvbmlmaWVkIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iaWNvbmlmeSIgdHlwZT0iYm9vbGVhbiI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRJY29uaWZpZWRCeURlZmF1bHQiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJpY29uaWZpZWQiIHR5cGU9ImJvb2xlYW4iPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0T25DbG9zZUxpc3RlbmVyIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0ibGlzdGVuZXIiIHR5cGU9ImFuZHJvaWQud2lkZ2V0LlNlYXJjaFZpZXcuT25DbG9zZUxpc3RlbmVyIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldE9uUXVlcnlDaGFuZ2VMaXN0ZW5lciIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9Imxpc3RlbmVyIiB0eXBlPSJhbmRyb2lkLndpZGdldC5TZWFyY2hWaWV3Lk9uUXVlcnlDaGFuZ2VMaXN0ZW5lciI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRRdWVyeSIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InF1ZXJ5IiB0eXBlPSJqYXZhLmxhbmcuQ2hhclNlcXVlbmNlIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJzdWJtaXQiIHR5cGU9ImJvb2xlYW4iPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0UXVlcnlIaW50IgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iaGludCIgdHlwZT0iamF2YS5sYW5nLkNoYXJTZXF1ZW5jZSI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRTZWFyY2hhYmxlSW5mbyIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InNlYXJjaGFibGUiIHR5cGU9ImFuZHJvaWQuYXBwLlNlYXJjaGFibGVJbmZvIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldFN1Ym1pdEJ1dHRvbkVuYWJsZWQiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJlbmFibGVkIiB0eXBlPSJib29sZWFuIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldFN1Z2dlc3Rpb25zQWRhcHRlciIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImFkYXB0ZXIiIHR5cGU9ImFuZHJvaWQud2lkZ2V0LkN1cnNvckFkYXB0ZXIiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzwvY2xhc3M+Cis8aW50ZXJmYWNlIG5hbWU9IlNlYXJjaFZpZXcuRmlsdGVyYWJsZUxpc3RBZGFwdGVyIgorIGFic3RyYWN0PSJ0cnVlIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPGltcGxlbWVudHMgbmFtZT0iYW5kcm9pZC53aWRnZXQuRmlsdGVyYWJsZSI+Cis8L2ltcGxlbWVudHM+Cis8aW1wbGVtZW50cyBuYW1lPSJhbmRyb2lkLndpZGdldC5MaXN0QWRhcHRlciI+Cis8L2ltcGxlbWVudHM+Cis8L2ludGVyZmFjZT4KKzxpbnRlcmZhY2UgbmFtZT0iU2VhcmNoVmlldy5PbkNsb3NlTGlzdGVuZXIiCisgYWJzdHJhY3Q9InRydWUiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8bWV0aG9kIG5hbWU9Im9uQ2xvc2UiCisgcmV0dXJuPSJib29sZWFuIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzwvaW50ZXJmYWNlPgorPGludGVyZmFjZSBuYW1lPSJTZWFyY2hWaWV3Lk9uUXVlcnlDaGFuZ2VMaXN0ZW5lciIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxtZXRob2QgbmFtZT0ib25RdWVyeVRleHRDaGFuZ2VkIgorIHJldHVybj0iYm9vbGVhbiIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJuZXdUZXh0IiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9Im9uU3VibWl0UXVlcnkiCisgcmV0dXJuPSJib29sZWFuIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InF1ZXJ5IiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8L2ludGVyZmFjZT4KIDxpbnRlcmZhY2UgbmFtZT0iU2VjdGlvbkluZGV4ZXIiCiAgYWJzdHJhY3Q9InRydWUiCiAgc3RhdGljPSJmYWxzZSIKQEAgLTIyMjQyNyw2ICsyMzU4NDksMTggQEAKID4KIDxwYXJhbWV0ZXIgbmFtZT0iY29udGV4dCIgdHlwZT0iYW5kcm9pZC5jb250ZW50LkNvbnRleHQiPgogPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9Im1vZGUiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzwvY29uc3RydWN0b3I+Cis8Y29uc3RydWN0b3IgbmFtZT0iU3Bpbm5lciIKKyB0eXBlPSJhbmRyb2lkLndpZGdldC5TcGlubmVyIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iY29udGV4dCIgdHlwZT0iYW5kcm9pZC5jb250ZW50LkNvbnRleHQiPgorPC9wYXJhbWV0ZXI+CiA8cGFyYW1ldGVyIG5hbWU9ImF0dHJzIiB0eXBlPSJhbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0Ij4KIDwvcGFyYW1ldGVyPgogPC9jb25zdHJ1Y3Rvcj4KQEAgLTIyMjQ0NCw2ICsyMzU4NzgsMjIgQEAKIDxwYXJhbWV0ZXIgbmFtZT0iZGVmU3R5bGUiIHR5cGU9ImludCI+CiA8L3BhcmFtZXRlcj4KIDwvY29uc3RydWN0b3I+Cis8Y29uc3RydWN0b3IgbmFtZT0iU3Bpbm5lciIKKyB0eXBlPSJhbmRyb2lkLndpZGdldC5TcGlubmVyIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iY29udGV4dCIgdHlwZT0iYW5kcm9pZC5jb250ZW50LkNvbnRleHQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImF0dHJzIiB0eXBlPSJhbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJkZWZTdHlsZSIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJtb2RlIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8L2NvbnN0cnVjdG9yPgogPG1ldGhvZCBuYW1lPSJnZXRQcm9tcHQiCiAgcmV0dXJuPSJqYXZhLmxhbmcuQ2hhclNlcXVlbmNlIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTIyMjQ5Niw2ICsyMzU5NDYsMjggQEAKIDxwYXJhbWV0ZXIgbmFtZT0icHJvbXB0SWQiIHR5cGU9ImludCI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgorPGZpZWxkIG5hbWU9Ik1PREVfRElBTE9HIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMCIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJNT0RFX0RST1BET1dOIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KIDwvY2xhc3M+CiA8aW50ZXJmYWNlIG5hbWU9IlNwaW5uZXJBZGFwdGVyIgogIGFic3RyYWN0PSJ0cnVlIgpAQCAtMjIyNTI0LDYgKzIzNTk5NiwzNyBAQAogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KIDwvaW50ZXJmYWNlPgorPGNsYXNzIG5hbWU9IlN0YWNrVmlldyIKKyBleHRlbmRzPSJhbmRyb2lkLndpZGdldC5BZGFwdGVyVmlld0FuaW1hdG9yIgorIGFic3RyYWN0PSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8Y29uc3RydWN0b3IgbmFtZT0iU3RhY2tWaWV3IgorIHR5cGU9ImFuZHJvaWQud2lkZ2V0LlN0YWNrVmlldyIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImNvbnRleHQiIHR5cGU9ImFuZHJvaWQuY29udGVudC5Db250ZXh0Ij4KKzwvcGFyYW1ldGVyPgorPC9jb25zdHJ1Y3Rvcj4KKzxjb25zdHJ1Y3RvciBuYW1lPSJTdGFja1ZpZXciCisgdHlwZT0iYW5kcm9pZC53aWRnZXQuU3RhY2tWaWV3IgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iY29udGV4dCIgdHlwZT0iYW5kcm9pZC5jb250ZW50LkNvbnRleHQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImF0dHJzIiB0eXBlPSJhbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0Ij4KKzwvcGFyYW1ldGVyPgorPC9jb25zdHJ1Y3Rvcj4KKzwvY2xhc3M+CiA8Y2xhc3MgbmFtZT0iVGFiSG9zdCIKICBleHRlbmRzPSJhbmRyb2lkLndpZGdldC5GcmFtZUxheW91dCIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC00MTQ0NzYsNyArNDI3OTc5LDcgQEAKICBhYnN0cmFjdD0idHJ1ZSIKICBzdGF0aWM9ImZhbHNlIgogIGZpbmFsPSJmYWxzZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyBkZXByZWNhdGVkPSJkZXByZWNhdGVkIgogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDxtZXRob2QgbmFtZT0iZ2V0TGVuZ3RoIgpAQCAtNDE0OTY1LDcgKzQyODQ2OCw3IEBACiAgYWJzdHJhY3Q9InRydWUiCiAgc3RhdGljPSJmYWxzZSIKICBmaW5hbD0iZmFsc2UiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgZGVwcmVjYXRlZD0iZGVwcmVjYXRlZCIKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8bWV0aG9kIG5hbWU9ImNoYXJhY3RlcnMiCkBAIC00MTUxODAsNyArNDI4NjgzLDcgQEAKICBhYnN0cmFjdD0iZmFsc2UiCiAgc3RhdGljPSJmYWxzZSIKICBmaW5hbD0iZmFsc2UiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgZGVwcmVjYXRlZD0iZGVwcmVjYXRlZCIKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8aW1wbGVtZW50cyBuYW1lPSJvcmcueG1sLnNheC5EVERIYW5kbGVyIj4KQEAgLTQxNTY0Nyw3ICs0MjkxNTAsNyBAQAogIGFic3RyYWN0PSJ0cnVlIgogIHN0YXRpYz0iZmFsc2UiCiAgZmluYWw9ImZhbHNlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIGRlcHJlY2F0ZWQ9ImRlcHJlY2F0ZWQiCiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPG1ldGhvZCBuYW1lPSJwYXJzZSIKQEAgLTQxNzA3OSw3ICs0MzA1ODIsNyBAQAogIGFic3RyYWN0PSJmYWxzZSIKICBzdGF0aWM9ImZhbHNlIgogIGZpbmFsPSJmYWxzZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyBkZXByZWNhdGVkPSJkZXByZWNhdGVkIgogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDxpbXBsZW1lbnRzIG5hbWU9Im9yZy54bWwuc2F4LkF0dHJpYnV0ZUxpc3QiPgpAQCAtNDE4NTY4LDcgKzQzMjA3MSw3IEBACiAgYWJzdHJhY3Q9ImZhbHNlIgogIHN0YXRpYz0iZmFsc2UiCiAgZmluYWw9ImZhbHNlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIGRlcHJlY2F0ZWQ9ImRlcHJlY2F0ZWQiCiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPG1ldGhvZCBuYW1lPSJtYWtlUGFyc2VyIgpkaWZmIC0tZ2l0IGEvY21kcy9hbS9zcmMvY29tL2FuZHJvaWQvY29tbWFuZHMvYW0vQW0uamF2YSBiL2NtZHMvYW0vc3JjL2NvbS9hbmRyb2lkL2NvbW1hbmRzL2FtL0FtLmphdmEKaW5kZXggMzAxODgzZi4uZjkwMWJmYiAxMDA2NDQKLS0tIGEvY21kcy9hbS9zcmMvY29tL2FuZHJvaWQvY29tbWFuZHMvYW0vQW0uamF2YQorKysgYi9jbWRzL2FtL3NyYy9jb20vYW5kcm9pZC9jb21tYW5kcy9hbS9BbS5qYXZhCkBAIC0yOCw3ICsyOCw2IEBACiBpbXBvcnQgYW5kcm9pZC5uZXQuVXJpOwogaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOwogaW1wb3J0IGFuZHJvaWQub3MuUGFyY2VsRmlsZURlc2NyaXB0b3I7Ci1pbXBvcnQgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb247CiBpbXBvcnQgYW5kcm9pZC5vcy5TZXJ2aWNlTWFuYWdlcjsKIGltcG9ydCBhbmRyb2lkLnV0aWwuQW5kcm9pZEV4Y2VwdGlvbjsKIGltcG9ydCBhbmRyb2lkLnZpZXcuSVdpbmRvd01hbmFnZXI7CkBAIC05OCw2ICs5Nyw4IEBACiAgICAgICAgICAgICBzZW5kQnJvYWRjYXN0KCk7CiAgICAgICAgIH0gZWxzZSBpZiAob3AuZXF1YWxzKCJwcm9maWxlIikpIHsKICAgICAgICAgICAgIHJ1blByb2ZpbGUoKTsKKyAgICAgICAgfSBlbHNlIGlmIChvcC5lcXVhbHMoImR1bXBoZWFwIikpIHsKKyAgICAgICAgICAgIHJ1bkR1bXBIZWFwKCk7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJVbmtub3duIGNvbW1hbmQ6ICIgKyBvcCk7CiAgICAgICAgIH0KQEAgLTE0MCw2ICsxNDEsMzEgQEAKICAgICAgICAgICAgICAgICBTdHJpbmcgdmFsdWUgPSBuZXh0QXJnUmVxdWlyZWQoKTsKICAgICAgICAgICAgICAgICBpbnRlbnQucHV0RXh0cmEoa2V5LCBJbnRlZ2VyLnZhbHVlT2YodmFsdWUpKTsKICAgICAgICAgICAgICAgICBoYXNJbnRlbnRJbmZvID0gdHJ1ZTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAob3B0LmVxdWFscygiLS1laWEiKSkgeworICAgICAgICAgICAgICAgIFN0cmluZyBrZXkgPSBuZXh0QXJnUmVxdWlyZWQoKTsKKyAgICAgICAgICAgICAgICBTdHJpbmcgdmFsdWUgPSBuZXh0QXJnUmVxdWlyZWQoKTsKKyAgICAgICAgICAgICAgICBTdHJpbmdbXSBzdHJpbmdzID0gdmFsdWUuc3BsaXQoIiwiKTsKKyAgICAgICAgICAgICAgICBpbnRbXSBsaXN0ID0gbmV3IGludFtzdHJpbmdzLmxlbmd0aF07CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzdHJpbmdzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIGxpc3RbaV0gPSBJbnRlZ2VyLnZhbHVlT2Yoc3RyaW5nc1tpXSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGludGVudC5wdXRFeHRyYShrZXksIGxpc3QpOworICAgICAgICAgICAgICAgIGhhc0ludGVudEluZm8gPSB0cnVlOworICAgICAgICAgICAgfSBlbHNlIGlmIChvcHQuZXF1YWxzKCItLWVsIikpIHsKKyAgICAgICAgICAgICAgICBTdHJpbmcga2V5ID0gbmV4dEFyZ1JlcXVpcmVkKCk7CisgICAgICAgICAgICAgICAgU3RyaW5nIHZhbHVlID0gbmV4dEFyZ1JlcXVpcmVkKCk7CisgICAgICAgICAgICAgICAgaW50ZW50LnB1dEV4dHJhKGtleSwgTG9uZy52YWx1ZU9mKHZhbHVlKSk7CisgICAgICAgICAgICAgICAgaGFzSW50ZW50SW5mbyA9IHRydWU7CisgICAgICAgICAgICB9IGVsc2UgaWYgKG9wdC5lcXVhbHMoIi0tZWxhIikpIHsKKyAgICAgICAgICAgICAgICBTdHJpbmcga2V5ID0gbmV4dEFyZ1JlcXVpcmVkKCk7CisgICAgICAgICAgICAgICAgU3RyaW5nIHZhbHVlID0gbmV4dEFyZ1JlcXVpcmVkKCk7CisgICAgICAgICAgICAgICAgU3RyaW5nW10gc3RyaW5ncyA9IHZhbHVlLnNwbGl0KCIsIik7CisgICAgICAgICAgICAgICAgbG9uZ1tdIGxpc3QgPSBuZXcgbG9uZ1tzdHJpbmdzLmxlbmd0aF07CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzdHJpbmdzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIGxpc3RbaV0gPSBMb25nLnZhbHVlT2Yoc3RyaW5nc1tpXSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGludGVudC5wdXRFeHRyYShrZXksIGxpc3QpOworICAgICAgICAgICAgICAgIGhhc0ludGVudEluZm8gPSB0cnVlOwogICAgICAgICAgICAgfSBlbHNlIGlmIChvcHQuZXF1YWxzKCItLWV6IikpIHsKICAgICAgICAgICAgICAgICBTdHJpbmcga2V5ID0gbmV4dEFyZ1JlcXVpcmVkKCk7CiAgICAgICAgICAgICAgICAgU3RyaW5nIHZhbHVlID0gbmV4dEFyZ1JlcXVpcmVkKCk7CkBAIC00MjQsNiArNDUwLDI4IEBACiAgICAgICAgIH0KICAgICB9CiAKKyAgICBwcml2YXRlIHZvaWQgcnVuRHVtcEhlYXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgYm9vbGVhbiBtYW5hZ2VkID0gISItbiIuZXF1YWxzKG5leHRPcHRpb24oKSk7CisgICAgICAgIFN0cmluZyBwcm9jZXNzID0gbmV4dEFyZ1JlcXVpcmVkKCk7CisgICAgICAgIFN0cmluZyBoZWFwRmlsZSA9IG5leHRBcmdSZXF1aXJlZCgpOworICAgICAgICBQYXJjZWxGaWxlRGVzY3JpcHRvciBmZCA9IG51bGw7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGZkID0gUGFyY2VsRmlsZURlc2NyaXB0b3Iub3BlbigKKyAgICAgICAgICAgICAgICAgICAgbmV3IEZpbGUoaGVhcEZpbGUpLAorICAgICAgICAgICAgICAgICAgICBQYXJjZWxGaWxlRGVzY3JpcHRvci5NT0RFX0NSRUFURSB8CisgICAgICAgICAgICAgICAgICAgIFBhcmNlbEZpbGVEZXNjcmlwdG9yLk1PREVfVFJVTkNBVEUgfAorICAgICAgICAgICAgICAgICAgICBQYXJjZWxGaWxlRGVzY3JpcHRvci5NT0RFX1JFQURfV1JJVEUpOworICAgICAgICB9IGNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJFcnJvcjogVW5hYmxlIHRvIG9wZW4gZmlsZTogIiArIGhlYXBGaWxlKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGlmICghbUFtLmR1bXBIZWFwKHByb2Nlc3MsIG1hbmFnZWQsIGhlYXBGaWxlLCBmZCkpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBBbmRyb2lkRXhjZXB0aW9uKCJIRUFQIERVTVAgRkFJTEVEIG9uIHByb2Nlc3MgIiArIHByb2Nlc3MpOworICAgICAgICB9CisgICAgfQorCiAgICAgcHJpdmF0ZSBjbGFzcyBJbnRlbnRSZWNlaXZlciBleHRlbmRzIElJbnRlbnRSZWNlaXZlci5TdHViIHsKICAgICAgICAgcHJpdmF0ZSBib29sZWFuIG1GaW5pc2hlZCA9IGZhbHNlOwogCkBAIC01OTEsOCArNjM5LDE1IEBACiAgICAgICAgICAgICAgICAgIiAgICAgICAgLXAgPEZJTEU+OiB3cml0ZSBwcm9maWxpbmcgZGF0YSB0byA8RklMRT5cbiIgKwogICAgICAgICAgICAgICAgICIgICAgICAgIC13OiB3YWl0IGZvciBpbnN0cnVtZW50YXRpb24gdG8gZmluaXNoIGJlZm9yZSByZXR1cm5pbmdcbiIgKwogICAgICAgICAgICAgICAgICJcbiIgKworICAgICAgICAgICAgICAgICIgICAgcnVuIGEgdGVzdCBwYWNrYWdlIGFnYWluc3QgYW4gYXBwbGljYXRpb246IGFtIGluc3RydW1lbnQgW2ZsYWdzXSA8VEVTVF9QQUNLQUdFPi88UlVOTkVSX0NMQVNTPlxuIiArCisgICAgICAgICAgICAgICAgIiAgICAgICAgLWUgPHRlc3RydW5uZXJfZmxhZz4gPHRlc3RydW5uZXJfdmFsdWU+IFssPHRlc3RydW5uZXJfdmFsdWU+XVxuIiArCisgICAgICAgICAgICAgICAgIiAgICAgICAgLXcgd2FpdCBmb3IgdGhlIHRlc3QgdG8gZmluaXNoIChyZXF1aXJlZClcbiIgKworICAgICAgICAgICAgICAgICIgICAgICAgIC1yIHVzZSB3aXRoIC1lIHBlcmYgdHJ1ZSB0byBnZW5lcmF0ZSByYXcgb3V0cHV0IGZvciBwZXJmb3JtYW5jZSBtZWFzdXJlbWVudHNcbiIgKworICAgICAgICAgICAgICAgICJcbiIgKwogICAgICAgICAgICAgICAgICIgICAgc3RhcnQgcHJvZmlsaW5nOiBhbSBwcm9maWxlIDxQUk9DRVNTPiBzdGFydCA8RklMRT5cbiIgKwogICAgICAgICAgICAgICAgICIgICAgc3RvcCBwcm9maWxpbmc6IGFtIHByb2ZpbGUgPFBST0NFU1M+IHN0b3BcbiIgKworICAgICAgICAgICAgICAgICIgICAgZHVtcCBoZWFwOiBhbSBkdW1waGVhcCBbZmxhZ3NdIDxQUk9DRVNTPiA8RklMRT5cbiIgKworICAgICAgICAgICAgICAgICIgICAgICAgIC1uOiBkdW1wIG5hdGl2ZSBoZWFwIGluc3RlYWQgb2YgbWFuYWdlZCBoZWFwXG4iICsKICAgICAgICAgICAgICAgICAiXG4iICsKICAgICAgICAgICAgICAgICAiICAgIDxJTlRFTlQ+IHNwZWNpZmljYXRpb25zIGluY2x1ZGUgdGhlc2UgZmxhZ3M6XG4iICsKICAgICAgICAgICAgICAgICAiICAgICAgICBbLWEgPEFDVElPTj5dIFstZCA8REFUQV9VUkk+XSBbLXQgPE1JTUVfVFlQRT5dXG4iICsKQEAgLTYwMCw3ICs2NTUsMTAgQEAKICAgICAgICAgICAgICAgICAiICAgICAgICBbLWV8LS1lcyA8RVhUUkFfS0VZPiA8RVhUUkFfU1RSSU5HX1ZBTFVFPiAuLi5dXG4iICsKICAgICAgICAgICAgICAgICAiICAgICAgICBbLS1lc24gPEVYVFJBX0tFWT4gLi4uXVxuIiArCiAgICAgICAgICAgICAgICAgIiAgICAgICAgWy0tZXogPEVYVFJBX0tFWT4gPEVYVFJBX0JPT0xFQU5fVkFMVUU+IC4uLl1cbiIgKwotICAgICAgICAgICAgICAgICIgICAgICAgIFstZXwtLWVpIDxFWFRSQV9LRVk+IDxFWFRSQV9JTlRfVkFMVUU+IC4uLl1cbiIgKworICAgICAgICAgICAgICAgICIgICAgICAgIFstLWVpIDxFWFRSQV9LRVk+IDxFWFRSQV9JTlRfVkFMVUU+IC4uLl1cbiIgKworICAgICAgICAgICAgICAgICIgICAgICAgIFstLWVsIDxFWFRSQV9LRVk+IDxFWFRSQV9MT05HX1ZBTFVFPiAuLi5dXG4iICsKKyAgICAgICAgICAgICAgICAiICAgICAgICBbLS1laWEgPEVYVFJBX0tFWT4gPEVYVFJBX0lOVF9WQUxVRT5bLDxFWFRSQV9JTlRfVkFMVUUuLi5dXVxuIiArCisgICAgICAgICAgICAgICAgIiAgICAgICAgWy0tZWxhIDxFWFRSQV9LRVk+IDxFWFRSQV9MT05HX1ZBTFVFPlssPEVYVFJBX0xPTkdfVkFMVUUuLi5dXVxuIiArCiAgICAgICAgICAgICAgICAgIiAgICAgICAgWy1uIDxDT01QT05FTlQ+XSBbLWYgPEZMQUdTPl1cbiIgKwogICAgICAgICAgICAgICAgICIgICAgICAgIFstLWdyYW50LXJlYWQtdXJpLXBlcm1pc3Npb25dIFstLWdyYW50LXdyaXRlLXVyaS1wZXJtaXNzaW9uXVxuIiArCiAgICAgICAgICAgICAgICAgIiAgICAgICAgWy0tZGVidWctbG9nLXJlc29sdXRpb25dXG4iICsKZGlmZiAtLWdpdCBhL2NtZHMvZHVtcHN0YXRlL2R1bXBzdGF0ZS5jIGIvY21kcy9kdW1wc3RhdGUvZHVtcHN0YXRlLmMKaW5kZXggNmU5Y2FhZi4uYTA5NjY2ZSAxMDA2NDQKLS0tIGEvY21kcy9kdW1wc3RhdGUvZHVtcHN0YXRlLmMKKysrIGIvY21kcy9kdW1wc3RhdGUvZHVtcHN0YXRlLmMKQEAgLTM5LDYgKzM5LDggQEAKIHN0YXRpYyBjaGFyIGNtZGxpbmVfYnVmWzE2Mzg0XSA9ICIodW5rbm93bikiOwogc3RhdGljIGNvbnN0IGNoYXIgKmR1bXBfdHJhY2VzX3BhdGggPSBOVUxMOwogCitzdGF0aWMgY2hhciBzY3JlZW5zaG90X3BhdGhbUEFUSF9NQVhdID0gIiI7CisKIC8qIGR1bXBzIHRoZSBjdXJyZW50IHN5c3RlbSBzdGF0ZSB0byBzdGRvdXQgKi8KIHN0YXRpYyB2b2lkIGR1bXBzdGF0ZSgpIHsKICAgICB0aW1lX3Qgbm93ID0gdGltZShOVUxMKTsKQEAgLTc2LDYgKzc4LDEyIEBACiAgICAgZHVtcF9maWxlKCJTTEFCIElORk8iLCAiL3Byb2Mvc2xhYmluZm8iKTsKICAgICBkdW1wX2ZpbGUoIlpPTkVJTkZPIiwgIi9wcm9jL3pvbmVpbmZvIik7CiAKKyAgICBpZiAoc2NyZWVuc2hvdF9wYXRoWzBdKSB7CisgICAgICAgIExPR0koInRha2luZyBzY3JlZW5zaG90XG4iKTsKKyAgICAgICAgcnVuX2NvbW1hbmQoTlVMTCwgNSwgInN1IiwgInJvb3QiLCAic2NyZWVuc2hvdCIsIHNjcmVlbnNob3RfcGF0aCwgTlVMTCk7CisgICAgICAgIExPR0koIndyb3RlIHNjcmVlbnNob3Q6ICVzXG4iLCBzY3JlZW5zaG90X3BhdGgpOworICAgIH0KKwogICAgIHJ1bl9jb21tYW5kKCJTWVNURU0gTE9HIiwgMjAsICJsb2djYXQiLCAiLXYiLCAidGltZSIsICItZCIsICIqOnYiLCBOVUxMKTsKIAogICAgIC8qIHNob3cgdGhlIHRyYWNlcyB3ZSBjb2xsZWN0ZWQgaW4gbWFpbigpLCBpZiB0aGF0IHdhcyBkb25lICovCkBAIC0xMDMsNyArMTExLDEyIEBACiAgICAgZHVtcF9maWxlKCJORVRXT1JLIFJPVVRFUyIsICIvcHJvYy9uZXQvcm91dGUiKTsKICAgICBkdW1wX2ZpbGUoIkFSUCBDQUNIRSIsICIvcHJvYy9uZXQvYXJwIik7CiAKKyAgICBydW5fY29tbWFuZCgiV0lGSSBORVRXT1JLUyIsIDIwLAorICAgICAgICAgICAgInN1IiwgInJvb3QiLCAid3BhX2NsaSIsICJsaXN0X25ldHdvcmtzIiwgTlVMTCk7CisKICNpZmRlZiBGV0RVTVBfYmNtNDMyOQorICAgIHJ1bl9jb21tYW5kKCJEVU1QIFdJRkkgU1RBVFVTIiwgMjAsCisgICAgICAgICAgICAic3UiLCAicm9vdCIsICJkaGR1dGlsIiwgIi1pIiwgImV0aDAiLCAiZHVtcCIsIE5VTEwpOwogICAgIHJ1bl9jb21tYW5kKCJEVU1QIFdJRkkgRklSTVdBUkUgTE9HIiwgNjAsCiAgICAgICAgICAgICAic3UiLCAicm9vdCIsICJkaGR1dGlsIiwgIi1pIiwgImV0aDAiLCAidXBsb2FkIiwgIi9kYXRhL2xvY2FsL3RtcC93bGFuX2NyYXNoLmR1bXAiLCBOVUxMKTsKICNlbmRpZgpAQCAtMTY0LDE4ICsxNzcsMjUgQEAKIH0KIAogc3RhdGljIHZvaWQgdXNhZ2UoKSB7Ci0gICAgZnByaW50ZihzdGRlcnIsICJ1c2FnZTogZHVtcHN0YXRlIFstZF0gWy1vIGZpbGVdIFstc10gWy16XVxuIgotICAgICAgICAgICAgIiAgLWQ6IGFwcGVuZCBkYXRlIHRvIGZpbGVuYW1lIChyZXF1aXJlcyAtbylcbiIKKyAgICBmcHJpbnRmKHN0ZGVyciwgInVzYWdlOiBkdW1wc3RhdGUgWy1iIHNvdW5kZmlsZV0gWy1lIHNvdW5kZmlsZV0gWy1vIGZpbGUgWy1kXSBbLXBdIFstel1dIFstc11cbiIKICAgICAgICAgICAgICIgIC1vOiB3cml0ZSB0byBmaWxlIChpbnN0ZWFkIG9mIHN0ZG91dClcbiIKKyAgICAgICAgICAgICIgIC1kOiBhcHBlbmQgZGF0ZSB0byBmaWxlbmFtZSAocmVxdWlyZXMgLW8pXG4iCisgICAgICAgICAgICAiICAtejogZ3ppcCBvdXRwdXQgKHJlcXVpcmVzIC1vKVxuIgorICAgICAgICAgICAgIiAgLXA6IGNhcHR1cmUgc2NyZWVuc2hvdCB0byBmaWxlbmFtZS5wbmcgKHJlcXVpcmVzIC1vKVxuIgogICAgICAgICAgICAgIiAgLXM6IHdyaXRlIG91dHB1dCB0byBjb250cm9sIHNvY2tldCAoZm9yIGluaXQpXG4iCi0gICAgICAgICAgICAiICAtejogZ3ppcCBvdXRwdXQgKHJlcXVpcmVzIC1vKVxuIik7CisgICAgICAgICAgICAiICAtYjogcGxheSBzb3VuZCBmaWxlIGluc3RlYWQgb2YgdmlicmF0ZSwgYXQgYmVnaW5uaW5nIG9mIGpvYlxuIgorICAgICAgICAgICAgIiAgLWU6IHBsYXkgc291bmQgZmlsZSBpbnN0ZWFkIG9mIHZpYnJhdGUsIGF0IGVuZCBvZiBqb2JcbiIKKwkJKTsKIH0KIAogaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkgewogICAgIGludCBkb19hZGRfZGF0ZSA9IDA7CiAgICAgaW50IGRvX2NvbXByZXNzID0gMDsKICAgICBjaGFyKiB1c2Vfb3V0ZmlsZSA9IDA7CisgICAgY2hhciogYmVnaW5fc291bmQgPSAwOworICAgIGNoYXIqIGVuZF9zb3VuZCA9IDA7CiAgICAgaW50IHVzZV9zb2NrZXQgPSAwOworICAgIGludCBkb19mYiA9IDA7CiAKICAgICBMT0dJKCJiZWdpblxuIik7CiAKQEAgLTE5MSwxMyArMjExLDE2IEBACiAgICAgZHVtcF90cmFjZXNfcGF0aCA9IGR1bXBfdm1fdHJhY2VzKCk7CiAKICAgICBpbnQgYzsKLSAgICB3aGlsZSAoKGMgPSBnZXRvcHQoYXJnYywgYXJndiwgImRobzpzdnoiKSkgIT0gLTEpIHsKKyAgICB3aGlsZSAoKGMgPSBnZXRvcHQoYXJnYywgYXJndiwgImI6ZGU6aG86c3Z6cCIpKSAhPSAtMSkgewogICAgICAgICBzd2l0Y2ggKGMpIHsKKyAgICAgICAgICAgIGNhc2UgJ2InOiBiZWdpbl9zb3VuZCA9IG9wdGFyZzsgIGJyZWFrOwogICAgICAgICAgICAgY2FzZSAnZCc6IGRvX2FkZF9kYXRlID0gMTsgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlICdlJzogZW5kX3NvdW5kID0gb3B0YXJnOyAgICBicmVhazsKICAgICAgICAgICAgIGNhc2UgJ28nOiB1c2Vfb3V0ZmlsZSA9IG9wdGFyZzsgIGJyZWFrOwogICAgICAgICAgICAgY2FzZSAncyc6IHVzZV9zb2NrZXQgPSAxOyAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICBjYXNlICd2JzogYnJlYWs7ICAvLyBjb21wYXRpYmlsaXR5IG5vLW9wCiAgICAgICAgICAgICBjYXNlICd6JzogZG9fY29tcHJlc3MgPSA2OyAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgJ3AnOiBkb19mYiA9IDE7ICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgY2FzZSAnPyc6IHByaW50ZigiXG4iKTsKICAgICAgICAgICAgIGNhc2UgJ2gnOgogICAgICAgICAgICAgICAgIHVzYWdlKCk7CkBAIC0yNDQsNiArMjY3LDEwIEBACiAgICAgICAgICAgICBzdHJmdGltZShkYXRlLCBzaXplb2YoZGF0ZSksICItJVktJW0tJWQtJUgtJU0tJVMiLCBsb2NhbHRpbWUoJm5vdykpOwogICAgICAgICAgICAgc3RybGNhdChwYXRoLCBkYXRlLCBzaXplb2YocGF0aCkpOwogICAgICAgICB9CisgICAgICAgIGlmIChkb19mYikgeworICAgICAgICAgICAgc3RybGNweShzY3JlZW5zaG90X3BhdGgsIHBhdGgsIHNpemVvZihzY3JlZW5zaG90X3BhdGgpKTsKKyAgICAgICAgICAgIHN0cmxjYXQoc2NyZWVuc2hvdF9wYXRoLCAiLnBuZyIsIHNpemVvZihzY3JlZW5zaG90X3BhdGgpKTsKKyAgICAgICAgfQogICAgICAgICBzdHJsY2F0KHBhdGgsICIudHh0Iiwgc2l6ZW9mKHBhdGgpKTsKICAgICAgICAgaWYgKGRvX2NvbXByZXNzKSBzdHJsY2F0KHBhdGgsICIuZ3oiLCBzaXplb2YocGF0aCkpOwogICAgICAgICBzdHJsY3B5KHRtcF9wYXRoLCBwYXRoLCBzaXplb2YodG1wX3BhdGgpKTsKQEAgLTI1MSwxNiArMjc4LDE4IEBACiAgICAgICAgIGd6aXBfcGlkID0gcmVkaXJlY3RfdG9fZmlsZShzdGRvdXQsIHRtcF9wYXRoLCBkb19jb21wcmVzcyk7CiAgICAgfQogCi0gICAgLyogYnp6enp6eiAqLwotICAgIGlmICh2aWJyYXRvcikgeworICAgIGlmIChiZWdpbl9zb3VuZCkgeworICAgICAgICBwbGF5X3NvdW5kKGJlZ2luX3NvdW5kKTsKKyAgICB9IGVsc2UgaWYgKHZpYnJhdG9yKSB7CiAgICAgICAgIGZwdXRzKCIxNTAiLCB2aWJyYXRvcik7CiAgICAgICAgIGZmbHVzaCh2aWJyYXRvcik7CiAgICAgfQogCiAgICAgZHVtcHN0YXRlKCk7CiAKLSAgICAvKiBienp6IGJ6enogYnp6eiAqLwotICAgIGlmICh2aWJyYXRvcikgeworICAgIGlmIChlbmRfc291bmQpIHsKKyAgICAgICAgcGxheV9zb3VuZChlbmRfc291bmQpOworICAgIH0gZWxzZSBpZiAodmlicmF0b3IpIHsKICAgICAgICAgaW50IGk7CiAgICAgICAgIGZvciAoaSA9IDA7IGkgPCAzOyBpKyspIHsKICAgICAgICAgICAgIGZwdXRzKCI3NVxuIiwgdmlicmF0b3IpOwpkaWZmIC0tZ2l0IGEvY21kcy9kdW1wc3RhdGUvZHVtcHN0YXRlLmggYi9jbWRzL2R1bXBzdGF0ZS9kdW1wc3RhdGUuaAppbmRleCA2ODJlYWZkLi44M2IxZDExIDEwMDY0NAotLS0gYS9jbWRzL2R1bXBzdGF0ZS9kdW1wc3RhdGUuaAorKysgYi9jbWRzL2R1bXBzdGF0ZS9kdW1wc3RhdGUuaApAQCAtNDQsNCArNDQsNyBAQAogLyogRGlzcGxheXMgYSBibG9ja2VkIHByb2Nlc3NlcyBpbi1rZXJuZWwgd2FpdCBjaGFubmVsICovCiB2b2lkIHNob3dfd2NoYW4oaW50IHBpZCwgY29uc3QgY2hhciAqbmFtZSk7CiAKKy8qIFBsYXkgYSBzb3VuZCB2aWEgU3RhZ2VmcmlnaHQgKi8KK3ZvaWQgcGxheV9zb3VuZChjb25zdCBjaGFyKiBwYXRoKTsKKwogI2VuZGlmIC8qIF9EVU1QU1RBVEVfSF8gKi8KZGlmZiAtLWdpdCBhL2NtZHMvZHVtcHN0YXRlL3V0aWxzLmMgYi9jbWRzL2R1bXBzdGF0ZS91dGlscy5jCmluZGV4IGM3YTc4Y2MuLmY5MmFjYmJiIDEwMDY0NAotLS0gYS9jbWRzL2R1bXBzdGF0ZS91dGlscy5jCisrKyBiL2NtZHMvZHVtcHN0YXRlL3V0aWxzLmMKQEAgLTQyOSwzICs0MjksNyBAQAogICAgIHJlbmFtZShhbnJfdHJhY2VzX3BhdGgsIHRyYWNlc19wYXRoKTsKICAgICByZXR1cm4gZHVtcF90cmFjZXNfcGF0aDsKIH0KKwordm9pZCBwbGF5X3NvdW5kKGNvbnN0IGNoYXIqIHBhdGgpIHsKKyAgICBydW5fY29tbWFuZChOVUxMLCA1LCAiL3N5c3RlbS9iaW4vc3RhZ2VmcmlnaHQiLCAiLW8iLCAiLWEiLCBwYXRoLCBOVUxMKTsKK30KZGlmZiAtLWdpdCBhL2NtZHMvcG0vc3JjL2NvbS9hbmRyb2lkL2NvbW1hbmRzL3BtL1BtLmphdmEgYi9jbWRzL3BtL3NyYy9jb20vYW5kcm9pZC9jb21tYW5kcy9wbS9QbS5qYXZhCmluZGV4IDliOGIwYWMuLjA0MDQyMWEgMTAwNjQ0Ci0tLSBhL2NtZHMvcG0vc3JjL2NvbS9hbmRyb2lkL2NvbW1hbmRzL3BtL1BtLmphdmEKKysrIGIvY21kcy9wbS9zcmMvY29tL2FuZHJvaWQvY29tbWFuZHMvcG0vUG0uamF2YQpAQCAtMjMzLDcgKzIzMyw3IEBACiAgICAgICAgICAgICBmb3IgKGludCBpPTA7IGk8cmF3TGlzdC5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgIGxpc3QuYWRkKHJhd0xpc3RbaV0pOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAKKwogCiAgICAgICAgICAgICAvLyBTb3J0IGJ5IG5hbWUKICAgICAgICAgICAgIENvbGxlY3Rpb25zLnNvcnQobGlzdCwgbmV3IENvbXBhcmF0b3I8RmVhdHVyZUluZm8+KCkgewpAQCAtOTA5LDYgKzkwOSw5IEBACiAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiVGhlIGxpc3QgaW5zdHJ1bWVudGF0aW9uIGNvbW1hbmQgcHJpbnRzIGFsbCBpbnN0cnVtZW50YXRpb25zLCIpOwogICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIm9yIG9ubHkgdGhvc2UgdGhhdCB0YXJnZXQgYSBzcGVjaWZpZWQgcGFja2FnZS4gIE9wdGlvbnM6Iik7CiAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiICAtZjogc2VlIHRoZWlyIGFzc29jaWF0ZWQgZmlsZS4iKTsKKyAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCIoVXNlIHRoaXMgY29tbWFuZCB0byBsaXN0IGFsbCB0ZXN0IHBhY2thZ2VzLCBvciB1c2UgPFRBUkdFVC1QQUNLQUdFPiAiKTsKKyAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCIgdG8gbGlzdCB0aGUgdGVzdCBwYWNrYWdlcyBmb3IgYSBwYXJ0aWN1bGFyIGFwcGxpY2F0aW9uLiBUaGUgLWYgIik7CisgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiIG9wdGlvbiBsaXN0cyB0aGUgLmFwayBmaWxlIGZvciB0aGUgdGVzdCBwYWNrYWdlLikiKTsKICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCIiKTsKICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJUaGUgbGlzdCBmZWF0dXJlcyBjb21tYW5kIHByaW50cyBhbGwgZmVhdHVyZXMgb2YgdGhlIHN5c3RlbS4iKTsKICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCIiKTsKZGlmZiAtLWdpdCBhL2NtZHMvc2NyZWVuc2hvdC9BbmRyb2lkLm1rIGIvY21kcy9zY3JlZW5zaG90L0FuZHJvaWQubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTljN2FlYgotLS0gL2Rldi9udWxsCisrKyBiL2NtZHMvc2NyZWVuc2hvdC9BbmRyb2lkLm1rCkBAIC0wLDAgKzEsMTYgQEAKK2lmbmVxICgkKFRBUkdFVF9TSU1VTEFUT1IpLHRydWUpCisKK0xPQ0FMX1BBVEg6PSAkKGNhbGwgbXktZGlyKQoraW5jbHVkZSAkKENMRUFSX1ZBUlMpCisKK0xPQ0FMX1NSQ19GSUxFUyA6PSBzY3JlZW5zaG90LmMKKworTE9DQUxfTU9EVUxFIDo9IHNjcmVlbnNob3QKKworTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBsaWJjdXRpbHMgbGliegorTE9DQUxfU1RBVElDX0xJQlJBUklFUyA6PSBsaWJwbmcKK0xPQ0FMX0NfSU5DTFVERVMgKz0gZXh0ZXJuYWwvemxpYgorCitpbmNsdWRlICQoQlVJTERfRVhFQ1VUQUJMRSkKKworZW5kaWYKZGlmZiAtLWdpdCBhL2NtZHMvc2NyZWVuc2hvdC9zY3JlZW5zaG90LmMgYi9jbWRzL3NjcmVlbnNob3Qvc2NyZWVuc2hvdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA0ODYzNmMKLS0tIC9kZXYvbnVsbAorKysgYi9jbWRzL3NjcmVlbnNob3Qvc2NyZWVuc2hvdC5jCkBAIC0wLDAgKzEsMTcxIEBACisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisKKyNpbmNsdWRlIDxsaW51eC9mYi5oPgorCisjaW5jbHVkZSA8emxpYi5oPgorI2luY2x1ZGUgPGxpYnBuZy9wbmcuaD4KKworI2luY2x1ZGUgInByaXZhdGUvYW5kcm9pZF9maWxlc3lzdGVtX2NvbmZpZy5oIgorCisjZGVmaW5lIExPR19UQUcgInNjcmVlbnNob3QiCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKK3ZvaWQgdGFrZV9zY3JlZW5zaG90KEZJTEUgKmZiX2luLCBGSUxFICpmYl9vdXQpIHsKKyAgICBpbnQgZmI7CisgICAgY2hhciBpbWdidWZbMHgxMDAwMF07CisgICAgc3RydWN0IGZiX3Zhcl9zY3JlZW5pbmZvIHZpbmZvOworICAgIHBuZ19zdHJ1Y3RwIHBuZzsKKyAgICBwbmdfaW5mb3AgaW5mbzsKKyAgICB1bnNpZ25lZCBpbnQgcixjLHJvd2xlbjsKKyAgICB1bnNpZ25lZCBpbnQgYnl0ZXNwcCxvZmZzZXQ7CisKKyAgICBmYiA9IGZpbGVubyhmYl9pbik7CisgICAgaWYoZmIgPCAwKSB7CisgICAgICAgIExPR0UoImZhaWxlZCB0byBvcGVuIGZyYW1lYnVmZmVyXG4iKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBmYl9pbiA9IGZkb3BlbihmYiwgInIiKTsKKworICAgIGlmKGlvY3RsKGZiLCBGQklPR0VUX1ZTQ1JFRU5JTkZPLCAmdmluZm8pIDwgMCkgeworICAgICAgICBMT0dFKCJmYWlsZWQgdG8gZ2V0IGZyYW1lYnVmZmVyIGluZm9cbiIpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGZjbnRsKGZiLCBGX1NFVEZELCBGRF9DTE9FWEVDKTsKKworICAgIHBuZyA9IHBuZ19jcmVhdGVfd3JpdGVfc3RydWN0KFBOR19MSUJQTkdfVkVSX1NUUklORywgTlVMTCwgTlVMTCwgTlVMTCk7CisgICAgaWYgKHBuZyA9PSBOVUxMKSB7CisgICAgICAgIExPR0UoImZhaWxlZCBwbmdfY3JlYXRlX3dyaXRlX3N0cnVjdFxuIik7CisgICAgICAgIGZjbG9zZShmYl9pbik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBwbmdfaW5pdF9pbyhwbmcsIGZiX291dCk7CisgICAgaW5mbyA9IHBuZ19jcmVhdGVfaW5mb19zdHJ1Y3QocG5nKTsKKyAgICBpZiAoaW5mbyA9PSBOVUxMKSB7CisgICAgICAgIExPR0UoImZhaWxlZCBwbmdfY3JlYXRlX2luZm9fc3RydWN0XG4iKTsKKyAgICAgICAgcG5nX2Rlc3Ryb3lfd3JpdGVfc3RydWN0KCZwbmcsIE5VTEwpOworICAgICAgICBmY2xvc2UoZmJfaW4pOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGlmIChzZXRqbXAocG5nX2ptcGJ1ZihwbmcpKSkgeworICAgICAgICBMT0dFKCJmYWlsZWQgcG5nIHNldGptcFxuIik7CisgICAgICAgIHBuZ19kZXN0cm95X3dyaXRlX3N0cnVjdCgmcG5nLCBOVUxMKTsKKyAgICAgICAgZmNsb3NlKGZiX2luKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGJ5dGVzcHAgPSB2aW5mby5iaXRzX3Blcl9waXhlbCAvIDg7CisgICAgcG5nX3NldF9JSERSKHBuZywgaW5mbywKKyAgICAgICAgdmluZm8ueHJlcywgdmluZm8ueXJlcywgdmluZm8uYml0c19wZXJfcGl4ZWwgLyA0LCAKKyAgICAgICAgUE5HX0NPTE9SX1RZUEVfUkdCX0FMUEhBLCBQTkdfSU5URVJMQUNFX05PTkUsCisgICAgICAgIFBOR19DT01QUkVTU0lPTl9UWVBFX0JBU0UsIFBOR19GSUxURVJfVFlQRV9CQVNFKTsKKyAgICBwbmdfd3JpdGVfaW5mbyhwbmcsIGluZm8pOworCisgICAgcm93bGVuPXZpbmZvLnhyZXMgKiBieXRlc3BwOworICAgIGlmIChyb3dsZW4gPiBzaXplb2YoaW1nYnVmKSkgeworICAgICAgICBMT0dFKCJjcmF6eSByb3dsZW46ICVkXG4iLCByb3dsZW4pOworICAgICAgICBwbmdfZGVzdHJveV93cml0ZV9zdHJ1Y3QoJnBuZywgTlVMTCk7CisgICAgICAgIGZjbG9zZShmYl9pbik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBvZmZzZXQgPSB2aW5mby54b2Zmc2V0ICogYnl0ZXNwcCArIHZpbmZvLnhyZXMgKiB2aW5mby55b2Zmc2V0ICogYnl0ZXNwcDsKKyAgICBmc2VlayhmYl9pbiwgb2Zmc2V0LCBTRUVLX1NFVCk7CisKKyAgICBmb3Iocj0wOyByPHZpbmZvLnlyZXM7IHIrKykgeworICAgICAgICBpbnQgbGVuID0gZnJlYWQoaW1nYnVmLCAxLCByb3dsZW4sIGZiX2luKTsKKyAgICAgICAgaWYgKGxlbiA8PSAwKSBicmVhazsKKyAgICAgICAgcG5nX3dyaXRlX3JvdyhwbmcsIChwbmdfYnl0ZXApaW1nYnVmKTsKKyAgICB9CisKKyAgICBwbmdfd3JpdGVfZW5kKHBuZywgaW5mbyk7CisgICAgZmNsb3NlKGZiX2luKTsKKyAgICBwbmdfZGVzdHJveV93cml0ZV9zdHJ1Y3QoJnBuZywgTlVMTCk7Cit9CisKK3ZvaWQgZm9ya19zb3VuZChjb25zdCBjaGFyKiBwYXRoKSB7CisgICAgcGlkX3QgcGlkID0gZm9yaygpOworICAgIGlmIChwaWQgPT0gMCkgeworICAgICAgICBleGVjbCgiL3N5c3RlbS9iaW4vc3RhZ2VmcmlnaHQiLCAic3RhZ2VmcmlnaHQiLCAiLW8iLCAiLWEiLCBwYXRoLCBOVUxMKTsKKyAgICB9Cit9CisKK3ZvaWQgdXNhZ2UoKSB7CisgICAgZnByaW50ZihzdGRlcnIsCisgICAgICAgICAgICAidXNhZ2U6IHNjcmVlbnNob3QgWy1zIHNvdW5kZmlsZV0gZmlsZW5hbWUucG5nXG4iCisgICAgICAgICAgICAiICAgLXM6IHBsYXkgYSBzb3VuZCBlZmZlY3QgdG8gc2lnbmFsIHN1Y2Nlc3NcbiIKKyAgICAgICAgICAgICIgICAtaTogYXV0b2luY3JlbWVudCB0byBhdm9pZCBvdmVyd3JpdGluZyBmaWxlbmFtZS5wbmdcbiIKKyAgICApOworfQorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhcioqYXJndikgeworICAgIEZJTEUgKnBuZyA9IE5VTEw7CisgICAgRklMRSAqZmJfaW4gPSBOVUxMOworICAgIGNoYXIgb3V0ZmlsZVtQQVRIX01BWF0gPSAiIjsKKworICAgIGNoYXIgKiBzb3VuZGZpbGUgPSBOVUxMOworICAgIGludCBkb19pbmNyZW1lbnQgPSAwOworCisgICAgaW50IGM7CisgICAgd2hpbGUgKChjID0gZ2V0b3B0KGFyZ2MsIGFyZ3YsICJzOmkiKSkgIT0gLTEpIHsKKyAgICAgICAgc3dpdGNoIChjKSB7CisgICAgICAgICAgICBjYXNlICdzJzogc291bmRmaWxlID0gb3B0YXJnOyBicmVhazsKKyAgICAgICAgICAgIGNhc2UgJ2knOiBkb19pbmNyZW1lbnQgPSAxOyBicmVhazsKKyAgICAgICAgICAgIGNhc2UgJz8nOgorICAgICAgICAgICAgY2FzZSAnaCc6CisgICAgICAgICAgICAgICAgdXNhZ2UoKTsgZXhpdCgxKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBhcmdjIC09IG9wdGluZDsKKyAgICBhcmd2ICs9IG9wdGluZDsKKworICAgIGlmIChhcmdjIDwgMSkgeworICAgICAgICB1c2FnZSgpOyBleGl0KDEpOworICAgIH0KKworICAgIHN0cmxjcHkob3V0ZmlsZSwgYXJndlswXSwgUEFUSF9NQVgpOworICAgIGlmIChkb19pbmNyZW1lbnQpIHsKKyAgICAgICAgc3RydWN0IHN0YXQgc3Q7CisgICAgICAgIGNoYXIgYmFzZVtQQVRIX01BWF0gPSAiIjsKKyAgICAgICAgaW50IGkgPSAwOworICAgICAgICB3aGlsZSAoc3RhdChvdXRmaWxlLCAmc3QpID09IDApIHsKKyAgICAgICAgICAgIGlmICghYmFzZVswXSkgeworICAgICAgICAgICAgICAgIGNoYXIgKnAgPSBzdHJyY2hyKG91dGZpbGUsICcuJyk7CisgICAgICAgICAgICAgICAgaWYgKHApICpwID0gJ1wwJzsKKyAgICAgICAgICAgICAgICBzdHJjcHkoYmFzZSwgb3V0ZmlsZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzbnByaW50ZihvdXRmaWxlLCBQQVRIX01BWCwgIiVzLSVkLnBuZyIsIGJhc2UsICsraSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBmYl9pbiA9IGZvcGVuKCIvZGV2L2dyYXBoaWNzL2ZiMCIsICJyIik7CisgICAgaWYgKCFmYl9pbikgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImVycm9yOiBjb3VsZCBub3QgcmVhZCBmcmFtZWJ1ZmZlclxuIik7CisgICAgICAgIGV4aXQoMSk7CisgICAgfQorCisgICAgLyogc3dpdGNoIHRvIG5vbi1yb290IHVzZXIgYW5kIGdyb3VwICovCisgICAgZ2lkX3QgZ3JvdXBzW10gPSB7IEFJRF9MT0csIEFJRF9TRENBUkRfUlcgfTsKKyAgICBzZXRncm91cHMoc2l6ZW9mKGdyb3Vwcykvc2l6ZW9mKGdyb3Vwc1swXSksIGdyb3Vwcyk7CisgICAgc2V0dWlkKEFJRF9TSEVMTCk7CisKKyAgICBwbmcgPSBmb3BlbihvdXRmaWxlLCAidyIpOworICAgIGlmICghcG5nKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiZXJyb3I6IHdyaXRpbmcgZmlsZSAlczogJXNcbiIsCisgICAgICAgICAgICAgICAgb3V0ZmlsZSwgc3RyZXJyb3IoZXJybm8pKTsKKyAgICAgICAgZXhpdCgxKTsKKyAgICB9CisKKyAgICB0YWtlX3NjcmVlbnNob3QoZmJfaW4sIHBuZyk7CisKKyAgICBpZiAoc291bmRmaWxlKSB7CisgICAgICAgIGZvcmtfc291bmQoc291bmRmaWxlKTsKKyAgICB9CisKKyAgICBleGl0KDApOworfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvYWNjb3VudHMvQWNjb3VudE1hbmFnZXJTZXJ2aWNlLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9hY2NvdW50cy9BY2NvdW50TWFuYWdlclNlcnZpY2UuamF2YQppbmRleCAxZDllMGYxLi5lNmIxYzA4IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9hY2NvdW50cy9BY2NvdW50TWFuYWdlclNlcnZpY2UuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9hY2NvdW50cy9BY2NvdW50TWFuYWdlclNlcnZpY2UuamF2YQpAQCAtMzk5LDE5ICszOTksMTkgQEAKIAogICAgIHByaXZhdGUgYm9vbGVhbiBpbnNlcnRBY2NvdW50SW50b0RhdGFiYXNlKEFjY291bnQgYWNjb3VudCwgU3RyaW5nIHBhc3N3b3JkLCBCdW5kbGUgZXh0cmFzKSB7CiAgICAgICAgIFNRTGl0ZURhdGFiYXNlIGRiID0gbU9wZW5IZWxwZXIuZ2V0V3JpdGFibGVEYXRhYmFzZSgpOworICAgICAgICBpZiAoYWNjb3VudCA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgZmluYWwgYm9vbGVhbiBub0Jyb2FkY2FzdCA9IGFjY291bnQudHlwZS5lcXVhbHMoR09PR0xFX0FDQ09VTlRfVFlQRSkKKyAgICAgICAgICAgICAgICAmJiBleHRyYXMgIT0gbnVsbCAmJiBleHRyYXMuZ2V0Qm9vbGVhbihOT19CUk9BRENBU1RfRkxBRywgZmFsc2UpOworICAgICAgICAvLyBSZW1vdmUgdGhlICdub2Jyb2FkY2FzdCcgZmxhZyBzaW5jZSB3ZSBkb24ndCB3YW50IGl0IHRvIHBlcnNpc3QgaW4gdGhlIGRiLiBJdCBpcyBpbnN0ZWFkCisgICAgICAgIC8vIHVzZWQgYXMgYSBjb250cm9sIHNpZ25hbCB0byBpbmRpY2F0ZSB3aGV0aGVyIG9yIG5vdCB0aGlzIGluc2VydGlvbiBzaG91bGQgcmVzdWx0IGluCisgICAgICAgIC8vIGFuIGFjY291bnRzIGNoYW5nZWQgYnJvYWRjYXN0IGJlaW5nIHNlbnQuCisgICAgICAgIGlmIChleHRyYXMgIT0gbnVsbCkgeworICAgICAgICAgICAgZXh0cmFzLnJlbW92ZShOT19CUk9BRENBU1RfRkxBRyk7CisgICAgICAgIH0KICAgICAgICAgZGIuYmVnaW5UcmFuc2FjdGlvbigpOwogICAgICAgICB0cnkgewotICAgICAgICAgICAgaWYgKGFjY291bnQgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJvb2xlYW4gbm9Ccm9hZGNhc3QgPSBmYWxzZTsKLSAgICAgICAgICAgIGlmIChhY2NvdW50LnR5cGUuZXF1YWxzKEdPT0dMRV9BQ0NPVU5UX1RZUEUpKSB7Ci0gICAgICAgICAgICAgICAgLy8gTG9vayBmb3IgdGhlICdub2Jyb2FkY2FzdCcgZmxhZyBhbmQgcmVtb3ZlIGl0IHNpbmNlIHdlIGRvbid0IHdhbnQgaXQgdG8gcGVyc2lzdAotICAgICAgICAgICAgICAgIC8vIGluIHRoZSBkYi4KLSAgICAgICAgICAgICAgICBub0Jyb2FkY2FzdCA9IGV4dHJhcy5nZXRCb29sZWFuKE5PX0JST0FEQ0FTVF9GTEFHLCBmYWxzZSk7Ci0gICAgICAgICAgICAgICAgZXh0cmFzLnJlbW92ZShOT19CUk9BRENBU1RfRkxBRyk7Ci0gICAgICAgICAgICB9Ci0KICAgICAgICAgICAgIGxvbmcgbnVtTWF0Y2hlcyA9IERhdGFiYXNlVXRpbHMubG9uZ0ZvclF1ZXJ5KGRiLAogICAgICAgICAgICAgICAgICAgICAic2VsZWN0IGNvdW50KCopIGZyb20gIiArIFRBQkxFX0FDQ09VTlRTCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIFdIRVJFICIgKyBBQ0NPVU5UU19OQU1FICsgIj0/IEFORCAiICsgQUNDT1VOVFNfVFlQRSsgIj0/IiwKQEAgLTQzNiwxMyArNDM2LDEzIEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICAgICAgZGIuc2V0VHJhbnNhY3Rpb25TdWNjZXNzZnVsKCk7Ci0gICAgICAgICAgICBpZiAoIW5vQnJvYWRjYXN0KSB7Ci0gICAgICAgICAgICAgICAgc2VuZEFjY291bnRzQ2hhbmdlZEJyb2FkY2FzdCgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgIH0gZmluYWxseSB7CiAgICAgICAgICAgICBkYi5lbmRUcmFuc2FjdGlvbigpOwogICAgICAgICB9CisgICAgICAgIGlmICghbm9Ccm9hZGNhc3QpIHsKKyAgICAgICAgICAgIHNlbmRBY2NvdW50c0NoYW5nZWRCcm9hZGNhc3QoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CiAKICAgICBwcml2YXRlIGxvbmcgaW5zZXJ0RXh0cmEoU1FMaXRlRGF0YWJhc2UgZGIsIGxvbmcgYWNjb3VudElkLCBTdHJpbmcga2V5LCBTdHJpbmcgdmFsdWUpIHsKQEAgLTE2NTcsNyArMTY1Nyw3IEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGJvb2xlYW4gbmVlZHNQcm92aXNpb25pbmc7CiAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgbmVlZHNQcm92aXNpb25pbmcgPSB0ZWxlcGhvbnkuZ2V0Q2RtYU5lZWRzUHJvdmlzaW9uaW5nKCk7CisgICAgICAgICAgICAgICAgICAgIG5lZWRzUHJvdmlzaW9uaW5nID0gdGVsZXBob255Lm5lZWRzT3RhU2VydmljZVByb3Zpc2lvbmluZygpOwogICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgICAgICAgICAgIExvZy53KFRBRywgImV4Y2VwdGlvbiB3aGlsZSBjaGVja2luZyBwcm92aXNpb25pbmciLCBlKTsKICAgICAgICAgICAgICAgICAgICAgLy8gZGVmYXVsdCB0byBOT1Qgd2lwaW5nIG91dCB0aGUgcGFzc3dvcmRzCkBAIC0xNjgxLDExICsxNjgxLDExIEBACiAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgZGIuZXhlY1NRTCgiREVMRVRFIGZyb20gIiArIFRBQkxFX0FVVEhUT0tFTlMpOwogICAgICAgICAgICAgICAgICAgICBkYi5leGVjU1FMKCJVUERBVEUgIiArIFRBQkxFX0FDQ09VTlRTICsgIiBTRVQgIiArIEFDQ09VTlRTX1BBU1NXT1JEICsgIiA9ICcnIik7Ci0gICAgICAgICAgICAgICAgICAgIHNlbmRBY2NvdW50c0NoYW5nZWRCcm9hZGNhc3QoKTsKICAgICAgICAgICAgICAgICAgICAgZGIuc2V0VHJhbnNhY3Rpb25TdWNjZXNzZnVsKCk7CiAgICAgICAgICAgICAgICAgfSBmaW5hbGx5IHsKICAgICAgICAgICAgICAgICAgICAgZGIuZW5kVHJhbnNhY3Rpb24oKTsKICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgc2VuZEFjY291bnRzQ2hhbmdlZEJyb2FkY2FzdCgpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgc2V0TWV0YVZhbHVlKCJpbXNpIiwgaW1zaSk7CiAgICAgICAgIH0KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2FuaW1hdGlvbi9BbmltYXRvci5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvYW5pbWF0aW9uL0FuaW1hdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmFkYTZkNgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2FuaW1hdGlvbi9BbmltYXRvci5qYXZhCkBAIC0wLDAgKzEsMjQ4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLmFuaW1hdGlvbjsKKworaW1wb3J0IGFuZHJvaWQudmlldy5hbmltYXRpb24uSW50ZXJwb2xhdG9yOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKKworLyoqCisgKiBUaGlzIGlzIHRoZSBzdXBlcmNsYXNzIGZvciBjbGFzc2VzIHdoaWNoIHByb3ZpZGUgYmFzaWMgc3VwcG9ydCBmb3IgYW5pbWF0aW9ucyB3aGljaCBjYW4gYmUKKyAqIHN0YXJ0ZWQsIGVuZGVkLCBhbmQgaGF2ZSA8Y29kZT5BbmltYXRvckxpc3RlbmVyczwvY29kZT4gYWRkZWQgdG8gdGhlbS4KKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIEFuaW1hdG9yIGltcGxlbWVudHMgQ2xvbmVhYmxlIHsKKworCisgICAgLyoqCisgICAgICogVGhlIHNldCBvZiBsaXN0ZW5lcnMgdG8gYmUgc2VudCBldmVudHMgdGhyb3VnaCB0aGUgbGlmZSBvZiBhbiBhbmltYXRpb24uCisgICAgICovCisgICAgQXJyYXlMaXN0PEFuaW1hdG9yTGlzdGVuZXI+IG1MaXN0ZW5lcnMgPSBudWxsOworCisgICAgLyoqCisgICAgICogU3RhcnRzIHRoaXMgYW5pbWF0aW9uLiBJZiB0aGUgYW5pbWF0aW9uIGhhcyBhIG5vbnplcm8gc3RhcnREZWxheSwgdGhlIGFuaW1hdGlvbiB3aWxsIHN0YXJ0CisgICAgICogcnVubmluZyBhZnRlciB0aGF0IGRlbGF5IGVsYXBzZXMuIE5vdGUgdGhhdCB0aGUgYW5pbWF0aW9uIGRvZXMgbm90IHN0YXJ0IHN5bmNocm9ub3VzbHkgd2l0aAorICAgICAqIHRoaXMgY2FsbCwgYmVjYXVzZSBhbGwgYW5pbWF0aW9uIGV2ZW50cyBhcmUgcG9zdGVkIHRvIGEgY2VudHJhbCB0aW1pbmcgbG9vcCBzbyB0aGF0IGFuaW1hdGlvbgorICAgICAqIHRpbWVzIGFyZSBhbGwgc3luY2hyb25pemVkIG9uIGEgc2luZ2xlIHRpbWluZyBwdWxzZSBvbiB0aGUgVUkgdGhyZWFkLiBTbyB0aGUgYW5pbWF0aW9uIHdpbGwKKyAgICAgKiBzdGFydCB0aGUgbmV4dCB0aW1lIHRoYXQgZXZlbnQgaGFuZGxlciBwcm9jZXNzZXMgZXZlbnRzLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHN0YXJ0KCkgeworICAgIH0KKworICAgIC8qKgorICAgICAqIENhbmNlbHMgdGhlIGFuaW1hdGlvbi4gVW5saWtlIHtAbGluayAjZW5kKCl9LCA8Y29kZT5jYW5jZWwoKTwvY29kZT4gY2F1c2VzIHRoZSBhbmltYXRpb24gdG8KKyAgICAgKiBzdG9wIGluIGl0cyB0cmFja3MsIHNlbmRpbmcgYW4ge0BsaW5rIGFuZHJvaWQuYW5pbWF0aW9uLkFuaW1hdG9yLkFuaW1hdG9yTGlzdGVuZXIjb25BbmltYXRpb25DYW5jZWwoQW5pbWF0b3IpfSB0bworICAgICAqIGl0cyBsaXN0ZW5lcnMsIGZvbGxvd2VkIGJ5IGFuIHtAbGluayBhbmRyb2lkLmFuaW1hdGlvbi5BbmltYXRvci5BbmltYXRvckxpc3RlbmVyI29uQW5pbWF0aW9uRW5kKEFuaW1hdG9yKX0gbWVzc2FnZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBjYW5jZWwoKSB7CisgICAgfQorCisgICAgLyoqCisgICAgICogRW5kcyB0aGUgYW5pbWF0aW9uLiBUaGlzIGNhdXNlcyB0aGUgYW5pbWF0aW9uIHRvIGFzc2lnbiB0aGUgZW5kIHZhbHVlIG9mIHRoZSBwcm9wZXJ0eSBiZWluZworICAgICAqIGFuaW1hdGVkLCB0aGVuIGNhbGxpbmcgdGhlIHtAbGluayBhbmRyb2lkLmFuaW1hdGlvbi5BbmltYXRvci5BbmltYXRvckxpc3RlbmVyI29uQW5pbWF0aW9uRW5kKEFuaW1hdG9yKX0gbWV0aG9kIG9uCisgICAgICogaXRzIGxpc3RlbmVycy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBlbmQoKSB7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIGFtb3VudCBvZiB0aW1lLCBpbiBtaWxsaXNlY29uZHMsIHRvIGRlbGF5IHN0YXJ0aW5nIHRoZSBhbmltYXRpb24gYWZ0ZXIKKyAgICAgKiB7QGxpbmsgI3N0YXJ0KCl9IGlzIGNhbGxlZC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIG51bWJlciBvZiBtaWxsaXNlY29uZHMgdG8gZGVsYXkgcnVubmluZyB0aGUgYW5pbWF0aW9uCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IGxvbmcgZ2V0U3RhcnREZWxheSgpOworCisgICAgLyoqCisgICAgICogVGhlIGFtb3VudCBvZiB0aW1lLCBpbiBtaWxsaXNlY29uZHMsIHRvIGRlbGF5IHN0YXJ0aW5nIHRoZSBhbmltYXRpb24gYWZ0ZXIKKyAgICAgKiB7QGxpbmsgI3N0YXJ0KCl9IGlzIGNhbGxlZC4KKworICAgICAqIEBwYXJhbSBzdGFydERlbGF5IFRoZSBhbW91bnQgb2YgdGhlIGRlbGF5LCBpbiBtaWxsaXNlY29uZHMKKyAgICAgKi8KKyAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZXRTdGFydERlbGF5KGxvbmcgc3RhcnREZWxheSk7CisKKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIGxlbmd0aCBvZiB0aGUgYW5pbWF0aW9uLgorICAgICAqCisgICAgICogQHBhcmFtIGR1cmF0aW9uIFRoZSBsZW5ndGggb2YgdGhlIGFuaW1hdGlvbiwgaW4gbWlsbGlzZWNvbmRzLgorICAgICAqLworICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHNldER1cmF0aW9uKGxvbmcgZHVyYXRpb24pOworCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgbGVuZ3RoIG9mIHRoZSBhbmltYXRpb24uCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFRoZSBsZW5ndGggb2YgdGhlIGFuaW1hdGlvbiwgaW4gbWlsbGlzZWNvbmRzLgorICAgICAqLworICAgIHB1YmxpYyBhYnN0cmFjdCBsb25nIGdldER1cmF0aW9uKCk7CisKKyAgICAvKioKKyAgICAgKiBUaGUgdGltZSBpbnRlcnBvbGF0b3IgdXNlZCBpbiBjYWxjdWxhdGluZyB0aGUgZWxhcHNlZCBmcmFjdGlvbiBvZiB0aGlzIGFuaW1hdGlvbi4gVGhlCisgICAgICogaW50ZXJwb2xhdG9yIGRldGVybWluZXMgd2hldGhlciB0aGUgYW5pbWF0aW9uIHJ1bnMgd2l0aCBsaW5lYXIgb3Igbm9uLWxpbmVhciBtb3Rpb24sCisgICAgICogc3VjaCBhcyBhY2NlbGVyYXRpb24gYW5kIGRlY2VsZXJhdGlvbi4gVGhlIGRlZmF1bHQgdmFsdWUgaXMKKyAgICAgKiB7QGxpbmsgYW5kcm9pZC52aWV3LmFuaW1hdGlvbi5BY2NlbGVyYXRlRGVjZWxlcmF0ZUludGVycG9sYXRvcn0KKyAgICAgKgorICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgaW50ZXJwb2xhdG9yIHRvIGJlIHVzZWQgYnkgdGhpcyBhbmltYXRpb24KKyAgICAgKi8KKyAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZXRJbnRlcnBvbGF0b3IoSW50ZXJwb2xhdG9yIHZhbHVlKTsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgd2hldGhlciB0aGlzIEFuaW1hdG9yIGlzIGN1cnJlbnRseSBydW5uaW5nIChoYXZpbmcgYmVlbiBzdGFydGVkIGFuZCBub3QgeWV0IGVuZGVkKS4KKyAgICAgKiBAcmV0dXJuIFdoZXRoZXIgdGhlIEFuaW1hdG9yIGlzIHJ1bm5pbmcuCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IGJvb2xlYW4gaXNSdW5uaW5nKCk7CisKKyAgICAvKioKKyAgICAgKiBBZGRzIGEgbGlzdGVuZXIgdG8gdGhlIHNldCBvZiBsaXN0ZW5lcnMgdGhhdCBhcmUgc2VudCBldmVudHMgdGhyb3VnaCB0aGUgbGlmZSBvZiBhbgorICAgICAqIGFuaW1hdGlvbiwgc3VjaCBhcyBzdGFydCwgcmVwZWF0LCBhbmQgZW5kLgorICAgICAqCisgICAgICogQHBhcmFtIGxpc3RlbmVyIHRoZSBsaXN0ZW5lciB0byBiZSBhZGRlZCB0byB0aGUgY3VycmVudCBzZXQgb2YgbGlzdGVuZXJzIGZvciB0aGlzIGFuaW1hdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRMaXN0ZW5lcihBbmltYXRvckxpc3RlbmVyIGxpc3RlbmVyKSB7CisgICAgICAgIGlmIChtTGlzdGVuZXJzID09IG51bGwpIHsKKyAgICAgICAgICAgIG1MaXN0ZW5lcnMgPSBuZXcgQXJyYXlMaXN0PEFuaW1hdG9yTGlzdGVuZXI+KCk7CisgICAgICAgIH0KKyAgICAgICAgbUxpc3RlbmVycy5hZGQobGlzdGVuZXIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlbW92ZXMgYSBsaXN0ZW5lciBmcm9tIHRoZSBzZXQgbGlzdGVuaW5nIHRvIHRoaXMgYW5pbWF0aW9uLgorICAgICAqCisgICAgICogQHBhcmFtIGxpc3RlbmVyIHRoZSBsaXN0ZW5lciB0byBiZSByZW1vdmVkIGZyb20gdGhlIGN1cnJlbnQgc2V0IG9mIGxpc3RlbmVycyBmb3IgdGhpcworICAgICAqICAgICAgICAgICAgICAgICBhbmltYXRpb24uCisgICAgICovCisgICAgcHVibGljIHZvaWQgcmVtb3ZlTGlzdGVuZXIoQW5pbWF0b3JMaXN0ZW5lciBsaXN0ZW5lcikgeworICAgICAgICBpZiAobUxpc3RlbmVycyA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgbUxpc3RlbmVycy5yZW1vdmUobGlzdGVuZXIpOworICAgICAgICBpZiAobUxpc3RlbmVycy5zaXplKCkgPT0gMCkgeworICAgICAgICAgICAgbUxpc3RlbmVycyA9IG51bGw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSBzZXQgb2Yge0BsaW5rIGFuZHJvaWQuYW5pbWF0aW9uLkFuaW1hdG9yLkFuaW1hdG9yTGlzdGVuZXJ9IG9iamVjdHMgdGhhdCBhcmUgY3VycmVudGx5CisgICAgICogbGlzdGVuaW5nIGZvciBldmVudHMgb24gdGhpcyA8Y29kZT5BbmltYXRvcjwvY29kZT4gb2JqZWN0LgorICAgICAqCisgICAgICogQHJldHVybiBBcnJheUxpc3Q8QW5pbWF0b3JMaXN0ZW5lcj4gVGhlIHNldCBvZiBsaXN0ZW5lcnMuCisgICAgICovCisgICAgcHVibGljIEFycmF5TGlzdDxBbmltYXRvckxpc3RlbmVyPiBnZXRMaXN0ZW5lcnMoKSB7CisgICAgICAgIHJldHVybiBtTGlzdGVuZXJzOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlbW92ZXMgYWxsIGxpc3RlbmVycyBmcm9tIHRoaXMgb2JqZWN0LiBUaGlzIGlzIGVxdWl2YWxlbnQgdG8gY2FsbGluZworICAgICAqIDxjb2RlPmdldExpc3RlbmVycygpPC9jb2RlPiBmb2xsb3dlZCBieSBjYWxsaW5nIDxjb2RlPmNsZWFyKCk8L2NvZGU+IG9uIHRoZQorICAgICAqIHJldHVybmVkIGxpc3Qgb2YgbGlzdGVuZXJzLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJlbW92ZUFsbExpc3RlbmVycygpIHsKKyAgICAgICAgaWYgKG1MaXN0ZW5lcnMgIT0gbnVsbCkgeworICAgICAgICAgICAgbUxpc3RlbmVycy5jbGVhcigpOworICAgICAgICAgICAgbUxpc3RlbmVycyA9IG51bGw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgQW5pbWF0b3IgY2xvbmUoKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBmaW5hbCBBbmltYXRvciBhbmltID0gKEFuaW1hdG9yKSBzdXBlci5jbG9uZSgpOworICAgICAgICAgICAgaWYgKG1MaXN0ZW5lcnMgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIEFycmF5TGlzdDxBbmltYXRvckxpc3RlbmVyPiBvbGRMaXN0ZW5lcnMgPSBtTGlzdGVuZXJzOworICAgICAgICAgICAgICAgIGFuaW0ubUxpc3RlbmVycyA9IG5ldyBBcnJheUxpc3Q8QW5pbWF0b3JMaXN0ZW5lcj4oKTsKKyAgICAgICAgICAgICAgICBpbnQgbnVtTGlzdGVuZXJzID0gb2xkTGlzdGVuZXJzLnNpemUoKTsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bUxpc3RlbmVyczsgKytpKSB7CisgICAgICAgICAgICAgICAgICAgIGFuaW0ubUxpc3RlbmVycy5hZGQob2xkTGlzdGVuZXJzLmdldChpKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGFuaW07CisgICAgICAgIH0gY2F0Y2ggKENsb25lTm90U3VwcG9ydGVkRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbkVycm9yKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGlzIG1ldGhvZCB0ZWxscyB0aGUgb2JqZWN0IHRvIHVzZSBhcHByb3ByaWF0ZSBpbmZvcm1hdGlvbiB0byBleHRyYWN0CisgICAgICogc3RhcnRpbmcgdmFsdWVzIGZvciB0aGUgYW5pbWF0aW9uLiBGb3IgZXhhbXBsZSwgYSBBbmltYXRvclNldCBvYmplY3Qgd2lsbCBwYXNzCisgICAgICogdGhpcyBjYWxsIHRvIGl0cyBjaGlsZCBvYmplY3RzIHRvIHRlbGwgdGhlbSB0byBzZXQgdXAgdGhlIHZhbHVlcy4gQQorICAgICAqIE9iamVjdEFuaW1hdG9yIG9iamVjdCB3aWxsIHVzZSB0aGUgaW5mb3JtYXRpb24gaXQgaGFzIGFib3V0IGl0cyB0YXJnZXQgb2JqZWN0CisgICAgICogYW5kIFByb3BlcnR5VmFsdWVzSG9sZGVyIG9iamVjdHMgdG8gZ2V0IHRoZSBzdGFydCB2YWx1ZXMgZm9yIGl0cyBwcm9wZXJ0aWVzLgorICAgICAqIEFuIFZhbHVlQW5pbWF0b3Igb2JqZWN0IHdpbGwgaWdub3JlIHRoZSByZXF1ZXN0IHNpbmNlIGl0IGRvZXMgbm90IGhhdmUgZW5vdWdoCisgICAgICogaW5mb3JtYXRpb24gKHN1Y2ggYXMgYSB0YXJnZXQgb2JqZWN0KSB0byBnYXRoZXIgdGhlc2UgdmFsdWVzLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldHVwU3RhcnRWYWx1ZXMoKSB7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhpcyBtZXRob2QgdGVsbHMgdGhlIG9iamVjdCB0byB1c2UgYXBwcm9wcmlhdGUgaW5mb3JtYXRpb24gdG8gZXh0cmFjdAorICAgICAqIGVuZGluZyB2YWx1ZXMgZm9yIHRoZSBhbmltYXRpb24uIEZvciBleGFtcGxlLCBhIEFuaW1hdG9yU2V0IG9iamVjdCB3aWxsIHBhc3MKKyAgICAgKiB0aGlzIGNhbGwgdG8gaXRzIGNoaWxkIG9iamVjdHMgdG8gdGVsbCB0aGVtIHRvIHNldCB1cCB0aGUgdmFsdWVzLiBBCisgICAgICogT2JqZWN0QW5pbWF0b3Igb2JqZWN0IHdpbGwgdXNlIHRoZSBpbmZvcm1hdGlvbiBpdCBoYXMgYWJvdXQgaXRzIHRhcmdldCBvYmplY3QKKyAgICAgKiBhbmQgUHJvcGVydHlWYWx1ZXNIb2xkZXIgb2JqZWN0cyB0byBnZXQgdGhlIHN0YXJ0IHZhbHVlcyBmb3IgaXRzIHByb3BlcnRpZXMuCisgICAgICogQW4gVmFsdWVBbmltYXRvciBvYmplY3Qgd2lsbCBpZ25vcmUgdGhlIHJlcXVlc3Qgc2luY2UgaXQgZG9lcyBub3QgaGF2ZSBlbm91Z2gKKyAgICAgKiBpbmZvcm1hdGlvbiAoc3VjaCBhcyBhIHRhcmdldCBvYmplY3QpIHRvIGdhdGhlciB0aGVzZSB2YWx1ZXMuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0dXBFbmRWYWx1ZXMoKSB7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgdGFyZ2V0IG9iamVjdCB3aG9zZSBwcm9wZXJ0eSB3aWxsIGJlIGFuaW1hdGVkIGJ5IHRoaXMgYW5pbWF0aW9uLiBOb3QgYWxsIHN1YmNsYXNzZXMKKyAgICAgKiBvcGVyYXRlIG9uIHRhcmdldCBvYmplY3RzIChmb3IgZXhhbXBsZSwge0BsaW5rIFZhbHVlQW5pbWF0b3J9LCBidXQgdGhpcyBtZXRob2QKKyAgICAgKiBpcyBvbiB0aGUgc3VwZXJjbGFzcyBmb3IgdGhlIGNvbnZlbmllbmNlIG9mIGRlYWxpbmcgZ2VuZXJpY2FsbHkgd2l0aCB0aG9zZSBzdWJjbGFzc2VzCisgICAgICogdGhhdCBkbyBoYW5kbGUgdGFyZ2V0cy4KKyAgICAgKgorICAgICAqIEBwYXJhbSB0YXJnZXQgVGhlIG9iamVjdCBiZWluZyBhbmltYXRlZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFRhcmdldChPYmplY3QgdGFyZ2V0KSB7CisgICAgfQorCisgICAgLyoqCisgICAgICogPHA+QW4gYW5pbWF0aW9uIGxpc3RlbmVyIHJlY2VpdmVzIG5vdGlmaWNhdGlvbnMgZnJvbSBhbiBhbmltYXRpb24uCisgICAgICogTm90aWZpY2F0aW9ucyBpbmRpY2F0ZSBhbmltYXRpb24gcmVsYXRlZCBldmVudHMsIHN1Y2ggYXMgdGhlIGVuZCBvciB0aGUKKyAgICAgKiByZXBldGl0aW9uIG9mIHRoZSBhbmltYXRpb24uPC9wPgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgaW50ZXJmYWNlIEFuaW1hdG9yTGlzdGVuZXIgeworICAgICAgICAvKioKKyAgICAgICAgICogPHA+Tm90aWZpZXMgdGhlIHN0YXJ0IG9mIHRoZSBhbmltYXRpb24uPC9wPgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gYW5pbWF0aW9uIFRoZSBzdGFydGVkIGFuaW1hdGlvbi4KKyAgICAgICAgICovCisgICAgICAgIHZvaWQgb25BbmltYXRpb25TdGFydChBbmltYXRvciBhbmltYXRpb24pOworCisgICAgICAgIC8qKgorICAgICAgICAgKiA8cD5Ob3RpZmllcyB0aGUgZW5kIG9mIHRoZSBhbmltYXRpb24uIFRoaXMgY2FsbGJhY2sgaXMgbm90IGludm9rZWQKKyAgICAgICAgICogZm9yIGFuaW1hdGlvbnMgd2l0aCByZXBlYXQgY291bnQgc2V0IHRvIElORklOSVRFLjwvcD4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIGFuaW1hdGlvbiBUaGUgYW5pbWF0aW9uIHdoaWNoIHJlYWNoZWQgaXRzIGVuZC4KKyAgICAgICAgICovCisgICAgICAgIHZvaWQgb25BbmltYXRpb25FbmQoQW5pbWF0b3IgYW5pbWF0aW9uKTsKKworICAgICAgICAvKioKKyAgICAgICAgICogPHA+Tm90aWZpZXMgdGhlIGNhbmNlbGxhdGlvbiBvZiB0aGUgYW5pbWF0aW9uLiBUaGlzIGNhbGxiYWNrIGlzIG5vdCBpbnZva2VkCisgICAgICAgICAqIGZvciBhbmltYXRpb25zIHdpdGggcmVwZWF0IGNvdW50IHNldCB0byBJTkZJTklURS48L3A+CisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBhbmltYXRpb24gVGhlIGFuaW1hdGlvbiB3aGljaCB3YXMgY2FuY2VsZWQuCisgICAgICAgICAqLworICAgICAgICB2b2lkIG9uQW5pbWF0aW9uQ2FuY2VsKEFuaW1hdG9yIGFuaW1hdGlvbik7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIDxwPk5vdGlmaWVzIHRoZSByZXBldGl0aW9uIG9mIHRoZSBhbmltYXRpb24uPC9wPgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gYW5pbWF0aW9uIFRoZSBhbmltYXRpb24gd2hpY2ggd2FzIHJlcGVhdGVkLgorICAgICAgICAgKi8KKyAgICAgICAgdm9pZCBvbkFuaW1hdGlvblJlcGVhdChBbmltYXRvciBhbmltYXRpb24pOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2FuaW1hdGlvbi9BbmltYXRvckluZmxhdGVyLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9hbmltYXRpb24vQW5pbWF0b3JJbmZsYXRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAwMTY0NTkKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9hbmltYXRpb24vQW5pbWF0b3JJbmZsYXRlci5qYXZhCkBAIC0wLDAgKzEsMjY5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2UgYW5kcm9pZC5hbmltYXRpb247CisKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlJlc291cmNlczsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlR5cGVkQXJyYXk7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5YbWxSZXNvdXJjZVBhcnNlcjsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlJlc291cmNlcy5Ob3RGb3VuZEV4Y2VwdGlvbjsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0OworaW1wb3J0IGFuZHJvaWQudXRpbC5YbWw7CitpbXBvcnQgYW5kcm9pZC52aWV3LmFuaW1hdGlvbi5BbmltYXRpb25VdGlsczsKK2ltcG9ydCBvcmcueG1scHVsbC52MS5YbWxQdWxsUGFyc2VyOworaW1wb3J0IG9yZy54bWxwdWxsLnYxLlhtbFB1bGxQYXJzZXJFeGNlcHRpb247CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CisKKy8qKgorICogVGhpcyBjbGFzcyBpcyB1c2VkIHRvIGluc3RhbnRpYXRlIG1lbnUgWE1MIGZpbGVzIGludG8gQW5pbWF0b3Igb2JqZWN0cy4KKyAqIDxwPgorICogRm9yIHBlcmZvcm1hbmNlIHJlYXNvbnMsIG1lbnUgaW5mbGF0aW9uIHJlbGllcyBoZWF2aWx5IG9uIHByZS1wcm9jZXNzaW5nIG9mCisgKiBYTUwgZmlsZXMgdGhhdCBpcyBkb25lIGF0IGJ1aWxkIHRpbWUuIFRoZXJlZm9yZSwgaXQgaXMgbm90IGN1cnJlbnRseSBwb3NzaWJsZQorICogdG8gdXNlIE1lbnVJbmZsYXRlciB3aXRoIGFuIFhtbFB1bGxQYXJzZXIgb3ZlciBhIHBsYWluIFhNTCBmaWxlIGF0IHJ1bnRpbWU7CisgKiBpdCBvbmx5IHdvcmtzIHdpdGggYW4gWG1sUHVsbFBhcnNlciByZXR1cm5lZCBmcm9tIGEgY29tcGlsZWQgcmVzb3VyY2UgKFIuCisgKiA8ZW0+c29tZXRoaW5nPC9lbT4gZmlsZS4pCisgKi8KK3B1YmxpYyBjbGFzcyBBbmltYXRvckluZmxhdGVyIHsKKworICAgIC8qKgorICAgICAqIFRoZXNlIGZsYWdzIGFyZSB1c2VkIHdoZW4gcGFyc2luZyBBbmltYXRvclNldCBvYmplY3RzCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFRPR0VUSEVSID0gMDsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU0VRVUVOVElBTExZID0gMTsKKworICAgIC8qKgorICAgICAqIEVudW0gdmFsdWVzIHVzZWQgaW4gWE1MIGF0dHJpYnV0ZXMgdG8gaW5kaWNhdGUgdGhlIHZhbHVlIGZvciBtVmFsdWVUeXBlCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFZBTFVFX1RZUEVfRkxPQVQgICAgICAgPSAwOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBWQUxVRV9UWVBFX0lOVCAgICAgICAgID0gMTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgVkFMVUVfVFlQRV9ET1VCTEUgICAgICA9IDI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFZBTFVFX1RZUEVfQ09MT1IgICAgICAgPSAzOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBWQUxVRV9UWVBFX0NVU1RPTSAgICAgID0gNDsKKworICAgIC8qKgorICAgICAqIExvYWRzIGFuIHtAbGluayBBbmltYXRvcn0gb2JqZWN0IGZyb20gYSByZXNvdXJjZQorICAgICAqCisgICAgICogQHBhcmFtIGNvbnRleHQgQXBwbGljYXRpb24gY29udGV4dCB1c2VkIHRvIGFjY2VzcyByZXNvdXJjZXMKKyAgICAgKiBAcGFyYW0gaWQgVGhlIHJlc291cmNlIGlkIG9mIHRoZSBhbmltYXRpb24gdG8gbG9hZAorICAgICAqIEByZXR1cm4gVGhlIGFuaW1hdG9yIG9iamVjdCByZWZlcmVuY2UgYnkgdGhlIHNwZWNpZmllZCBpZAorICAgICAqIEB0aHJvd3MgYW5kcm9pZC5jb250ZW50LnJlcy5SZXNvdXJjZXMuTm90Rm91bmRFeGNlcHRpb24gd2hlbiB0aGUgYW5pbWF0aW9uIGNhbm5vdCBiZSBsb2FkZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIEFuaW1hdG9yIGxvYWRBbmltYXRvcihDb250ZXh0IGNvbnRleHQsIGludCBpZCkKKyAgICAgICAgICAgIHRocm93cyBOb3RGb3VuZEV4Y2VwdGlvbiB7CisKKyAgICAgICAgWG1sUmVzb3VyY2VQYXJzZXIgcGFyc2VyID0gbnVsbDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHBhcnNlciA9IGNvbnRleHQuZ2V0UmVzb3VyY2VzKCkuZ2V0QW5pbWF0aW9uKGlkKTsKKyAgICAgICAgICAgIHJldHVybiBjcmVhdGVBbmltYXRvckZyb21YbWwoY29udGV4dCwgcGFyc2VyKTsKKyAgICAgICAgfSBjYXRjaCAoWG1sUHVsbFBhcnNlckV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgUmVzb3VyY2VzLk5vdEZvdW5kRXhjZXB0aW9uIHJuZiA9CisgICAgICAgICAgICAgICAgICAgIG5ldyBSZXNvdXJjZXMuTm90Rm91bmRFeGNlcHRpb24oIkNhbid0IGxvYWQgYW5pbWF0aW9uIHJlc291cmNlIElEICMweCIgKworICAgICAgICAgICAgICAgICAgICBJbnRlZ2VyLnRvSGV4U3RyaW5nKGlkKSk7CisgICAgICAgICAgICBybmYuaW5pdENhdXNlKGV4KTsKKyAgICAgICAgICAgIHRocm93IHJuZjsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgIFJlc291cmNlcy5Ob3RGb3VuZEV4Y2VwdGlvbiBybmYgPQorICAgICAgICAgICAgICAgICAgICBuZXcgUmVzb3VyY2VzLk5vdEZvdW5kRXhjZXB0aW9uKCJDYW4ndCBsb2FkIGFuaW1hdGlvbiByZXNvdXJjZSBJRCAjMHgiICsKKyAgICAgICAgICAgICAgICAgICAgSW50ZWdlci50b0hleFN0cmluZyhpZCkpOworICAgICAgICAgICAgcm5mLmluaXRDYXVzZShleCk7CisgICAgICAgICAgICB0aHJvdyBybmY7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBpZiAocGFyc2VyICE9IG51bGwpIHBhcnNlci5jbG9zZSgpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgQW5pbWF0b3IgY3JlYXRlQW5pbWF0b3JGcm9tWG1sKENvbnRleHQgYywgWG1sUHVsbFBhcnNlciBwYXJzZXIpCisgICAgICAgICAgICB0aHJvd3MgWG1sUHVsbFBhcnNlckV4Y2VwdGlvbiwgSU9FeGNlcHRpb24geworCisgICAgICAgIHJldHVybiBjcmVhdGVBbmltYXRvckZyb21YbWwoYywgcGFyc2VyLCBYbWwuYXNBdHRyaWJ1dGVTZXQocGFyc2VyKSwgbnVsbCwgMCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgQW5pbWF0b3IgY3JlYXRlQW5pbWF0b3JGcm9tWG1sKENvbnRleHQgYywgWG1sUHVsbFBhcnNlciBwYXJzZXIsCisgICAgICAgICAgICBBdHRyaWJ1dGVTZXQgYXR0cnMsIEFuaW1hdG9yU2V0IHBhcmVudCwgaW50IHNlcXVlbmNlT3JkZXJpbmcpCisgICAgICAgICAgICB0aHJvd3MgWG1sUHVsbFBhcnNlckV4Y2VwdGlvbiwgSU9FeGNlcHRpb24geworCisgICAgICAgIEFuaW1hdG9yIGFuaW0gPSBudWxsOworICAgICAgICBBcnJheUxpc3Q8QW5pbWF0b3I+IGNoaWxkQW5pbXMgPSBudWxsOworCisgICAgICAgIC8vIE1ha2Ugc3VyZSB3ZSBhcmUgb24gYSBzdGFydCB0YWcuCisgICAgICAgIGludCB0eXBlOworICAgICAgICBpbnQgZGVwdGggPSBwYXJzZXIuZ2V0RGVwdGgoKTsKKworICAgICAgICB3aGlsZSAoKCh0eXBlPXBhcnNlci5uZXh0KCkpICE9IFhtbFB1bGxQYXJzZXIuRU5EX1RBRyB8fCBwYXJzZXIuZ2V0RGVwdGgoKSA+IGRlcHRoKQorICAgICAgICAgICAgICAgJiYgdHlwZSAhPSBYbWxQdWxsUGFyc2VyLkVORF9ET0NVTUVOVCkgeworCisgICAgICAgICAgICBpZiAodHlwZSAhPSBYbWxQdWxsUGFyc2VyLlNUQVJUX1RBRykgeworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBTdHJpbmcgIG5hbWUgPSBwYXJzZXIuZ2V0TmFtZSgpOworCisgICAgICAgICAgICBpZiAobmFtZS5lcXVhbHMoIm9iamVjdEFuaW1hdG9yIikpIHsKKyAgICAgICAgICAgICAgICBhbmltID0gbG9hZE9iamVjdEFuaW1hdG9yKGMsIGF0dHJzKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAobmFtZS5lcXVhbHMoImFuaW1hdG9yIikpIHsKKyAgICAgICAgICAgICAgICBhbmltID0gbG9hZEFuaW1hdG9yKGMsIGF0dHJzLCBudWxsKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAobmFtZS5lcXVhbHMoInNldCIpKSB7CisgICAgICAgICAgICAgICAgYW5pbSA9IG5ldyBBbmltYXRvclNldCgpOworICAgICAgICAgICAgICAgIFR5cGVkQXJyYXkgYSA9IGMub2J0YWluU3R5bGVkQXR0cmlidXRlcyhhdHRycywKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLkFuaW1hdG9yU2V0KTsKKyAgICAgICAgICAgICAgICBpbnQgb3JkZXJpbmcgPSBhLmdldEludChjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZS5BbmltYXRvclNldF9vcmRlcmluZywKKyAgICAgICAgICAgICAgICAgICAgICAgIFRPR0VUSEVSKTsKKyAgICAgICAgICAgICAgICBjcmVhdGVBbmltYXRvckZyb21YbWwoYywgcGFyc2VyLCBhdHRycywgKEFuaW1hdG9yU2V0KSBhbmltLCAgb3JkZXJpbmcpOworICAgICAgICAgICAgICAgIGEucmVjeWNsZSgpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiVW5rbm93biBhbmltYXRvciBuYW1lOiAiICsgcGFyc2VyLmdldE5hbWUoKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChwYXJlbnQgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGlmIChjaGlsZEFuaW1zID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgY2hpbGRBbmltcyA9IG5ldyBBcnJheUxpc3Q8QW5pbWF0b3I+KCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNoaWxkQW5pbXMuYWRkKGFuaW0pOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChwYXJlbnQgIT0gbnVsbCAmJiBjaGlsZEFuaW1zICE9IG51bGwpIHsKKyAgICAgICAgICAgIEFuaW1hdG9yW10gYW5pbXNBcnJheSA9IG5ldyBBbmltYXRvcltjaGlsZEFuaW1zLnNpemUoKV07CisgICAgICAgICAgICBpbnQgaW5kZXggPSAwOworICAgICAgICAgICAgZm9yIChBbmltYXRvciBhIDogY2hpbGRBbmltcykgeworICAgICAgICAgICAgICAgIGFuaW1zQXJyYXlbaW5kZXgrK10gPSBhOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHNlcXVlbmNlT3JkZXJpbmcgPT0gVE9HRVRIRVIpIHsKKyAgICAgICAgICAgICAgICBwYXJlbnQucGxheVRvZ2V0aGVyKGFuaW1zQXJyYXkpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBwYXJlbnQucGxheVNlcXVlbnRpYWxseShhbmltc0FycmF5KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBhbmltOworCisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgT2JqZWN0QW5pbWF0b3IgbG9hZE9iamVjdEFuaW1hdG9yKENvbnRleHQgY29udGV4dCwgQXR0cmlidXRlU2V0IGF0dHJzKQorICAgICAgICAgICAgdGhyb3dzIE5vdEZvdW5kRXhjZXB0aW9uIHsKKworICAgICAgICBPYmplY3RBbmltYXRvciBhbmltID0gbmV3IE9iamVjdEFuaW1hdG9yKCk7CisKKyAgICAgICAgbG9hZEFuaW1hdG9yKGNvbnRleHQsIGF0dHJzLCBhbmltKTsKKworICAgICAgICBUeXBlZEFycmF5IGEgPQorICAgICAgICAgICAgICAgIGNvbnRleHQub2J0YWluU3R5bGVkQXR0cmlidXRlcyhhdHRycywgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZWFibGUuUHJvcGVydHlBbmltYXRvcik7CisKKyAgICAgICAgU3RyaW5nIHByb3BlcnR5TmFtZSA9IGEuZ2V0U3RyaW5nKGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLlByb3BlcnR5QW5pbWF0b3JfcHJvcGVydHlOYW1lKTsKKworICAgICAgICBhbmltLnNldFByb3BlcnR5TmFtZShwcm9wZXJ0eU5hbWUpOworCisgICAgICAgIGEucmVjeWNsZSgpOworCisgICAgICAgIHJldHVybiBhbmltOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBuZXcgYW5pbWF0aW9uIHdob3NlIHBhcmFtZXRlcnMgY29tZSBmcm9tIHRoZSBzcGVjaWZpZWQgY29udGV4dCBhbmQKKyAgICAgKiBhdHRyaWJ1dGVzIHNldC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb250ZXh0IHRoZSBhcHBsaWNhdGlvbiBlbnZpcm9ubWVudAorICAgICAqIEBwYXJhbSBhdHRycyB0aGUgc2V0IG9mIGF0dHJpYnV0ZXMgaG9sZGluZyB0aGUgYW5pbWF0aW9uIHBhcmFtZXRlcnMKKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBWYWx1ZUFuaW1hdG9yIGxvYWRBbmltYXRvcihDb250ZXh0IGNvbnRleHQsIEF0dHJpYnV0ZVNldCBhdHRycywgVmFsdWVBbmltYXRvciBhbmltKQorICAgICAgICAgICAgdGhyb3dzIE5vdEZvdW5kRXhjZXB0aW9uIHsKKworICAgICAgICBUeXBlZEFycmF5IGEgPQorICAgICAgICAgICAgICAgIGNvbnRleHQub2J0YWluU3R5bGVkQXR0cmlidXRlcyhhdHRycywgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZWFibGUuQW5pbWF0b3IpOworCisgICAgICAgIGxvbmcgZHVyYXRpb24gPSBhLmdldEludChjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZS5BbmltYXRvcl9kdXJhdGlvbiwgMCk7CisKKyAgICAgICAgbG9uZyBzdGFydERlbGF5ID0gYS5nZXRJbnQoY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZWFibGUuQW5pbWF0b3Jfc3RhcnRPZmZzZXQsIDApOworCisgICAgICAgIGludCB2YWx1ZVR5cGUgPSBhLmdldEludChjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZS5BbmltYXRvcl92YWx1ZVR5cGUsCisgICAgICAgICAgICAgICAgVkFMVUVfVFlQRV9GTE9BVCk7CisKKyAgICAgICAgT2JqZWN0IHZhbHVlRnJvbSA9IG51bGw7CisgICAgICAgIE9iamVjdCB2YWx1ZVRvID0gbnVsbDsKKyAgICAgICAgVHlwZUV2YWx1YXRvciBldmFsdWF0b3IgPSBudWxsOworCisgICAgICAgIHN3aXRjaCAodmFsdWVUeXBlKSB7CisgICAgICAgICAgICBjYXNlIFZBTFVFX1RZUEVfRkxPQVQ6CisgICAgICAgICAgICAgICAgaWYgKGEuaGFzVmFsdWUoY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZWFibGUuQW5pbWF0b3JfdmFsdWVGcm9tKSkgeworICAgICAgICAgICAgICAgICAgICB2YWx1ZUZyb20gPSBhLmdldEZsb2F0KGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLkFuaW1hdG9yX3ZhbHVlRnJvbSwgMGYpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoYS5oYXNWYWx1ZShjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZS5BbmltYXRvcl92YWx1ZVRvKSkgeworICAgICAgICAgICAgICAgICAgICB2YWx1ZVRvID0gYS5nZXRGbG9hdChjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZS5BbmltYXRvcl92YWx1ZVRvLCAwZik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBWQUxVRV9UWVBFX0NPTE9SOgorICAgICAgICAgICAgICAgIGV2YWx1YXRvciA9IG5ldyBSR0JFdmFsdWF0b3IoKTsKKyAgICAgICAgICAgICAgICAvLyBmYWxsIHRocm91Z2ggdG8gcGljayB1cCB2YWx1ZXMKKyAgICAgICAgICAgIGNhc2UgVkFMVUVfVFlQRV9JTlQ6CisgICAgICAgICAgICAgICAgaWYgKGEuaGFzVmFsdWUoY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZWFibGUuQW5pbWF0b3JfdmFsdWVGcm9tKSkgeworICAgICAgICAgICAgICAgICAgICB2YWx1ZUZyb20gPSBhLmdldEludGVnZXIoY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZWFibGUuQW5pbWF0b3JfdmFsdWVGcm9tLCAwKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGEuaGFzVmFsdWUoY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZWFibGUuQW5pbWF0b3JfdmFsdWVUbykpIHsKKyAgICAgICAgICAgICAgICAgICAgdmFsdWVUbyA9IGEuZ2V0SW50ZWdlcihjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZS5BbmltYXRvcl92YWx1ZVRvLCAwKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFZBTFVFX1RZUEVfRE9VQkxFOgorICAgICAgICAgICAgICAgIGlmIChhLmhhc1ZhbHVlKGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLkFuaW1hdG9yX3ZhbHVlRnJvbSkpIHsKKyAgICAgICAgICAgICAgICAgICAgdmFsdWVGcm9tID0gKERvdWJsZSkoKEZsb2F0KShhLmdldEZsb2F0KGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLkFuaW1hdG9yX3ZhbHVlRnJvbSwgMGYpKSkuZG91YmxlVmFsdWUoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGEuaGFzVmFsdWUoY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZWFibGUuQW5pbWF0b3JfdmFsdWVUbykpIHsKKyAgICAgICAgICAgICAgICAgICAgdmFsdWVUbyA9IChEb3VibGUpKChGbG9hdClhLmdldEZsb2F0KGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLkFuaW1hdG9yX3ZhbHVlVG8sIDBmKSkuZG91YmxlVmFsdWUoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFZBTFVFX1RZUEVfQ1VTVE9NOgorICAgICAgICAgICAgICAgIC8vIFRPRE86IEhvdyB0byBnZXQgYW4gJ09iamVjdCcgdmFsdWU/CisgICAgICAgICAgICAgICAgaWYgKGEuaGFzVmFsdWUoY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZWFibGUuQW5pbWF0b3JfdmFsdWVGcm9tKSkgeworICAgICAgICAgICAgICAgICAgICB2YWx1ZUZyb20gPSBhLmdldEZsb2F0KGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLkFuaW1hdG9yX3ZhbHVlRnJvbSwgMGYpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoYS5oYXNWYWx1ZShjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZS5BbmltYXRvcl92YWx1ZVRvKSkgeworICAgICAgICAgICAgICAgICAgICB2YWx1ZVRvID0gYS5nZXRGbG9hdChjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZS5BbmltYXRvcl92YWx1ZVRvLCAwZik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGFuaW0gPT0gbnVsbCkgeworICAgICAgICAgICAgYW5pbSA9IG5ldyBWYWx1ZUFuaW1hdG9yKGR1cmF0aW9uLCB2YWx1ZUZyb20sIHZhbHVlVG8pOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYW5pbS5zZXREdXJhdGlvbihkdXJhdGlvbik7CisgICAgICAgICAgICBhbmltLnNldFZhbHVlcyh2YWx1ZUZyb20sIHZhbHVlVG8pOworICAgICAgICB9CisKKyAgICAgICAgYW5pbS5zZXRTdGFydERlbGF5KHN0YXJ0RGVsYXkpOworCisgICAgICAgIGlmIChhLmhhc1ZhbHVlKGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLkFuaW1hdG9yX3JlcGVhdENvdW50KSkgeworICAgICAgICAgICAgYW5pbS5zZXRSZXBlYXRDb3VudCgKKyAgICAgICAgICAgICAgICAgICAgYS5nZXRJbnQoY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZWFibGUuQW5pbWF0b3JfcmVwZWF0Q291bnQsIDApKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoYS5oYXNWYWx1ZShjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZS5BbmltYXRvcl9yZXBlYXRNb2RlKSkgeworICAgICAgICAgICAgYW5pbS5zZXRSZXBlYXRNb2RlKAorICAgICAgICAgICAgICAgICAgICBhLmdldEludChjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZS5BbmltYXRvcl9yZXBlYXRNb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlQW5pbWF0b3IuUkVTVEFSVCkpOworICAgICAgICB9CisgICAgICAgIGlmIChldmFsdWF0b3IgIT0gbnVsbCkgeworICAgICAgICAgICAgYW5pbS5zZXRFdmFsdWF0b3IoZXZhbHVhdG9yKTsKKyAgICAgICAgfQorCisgICAgICAgIGZpbmFsIGludCByZXNJRCA9CisgICAgICAgICAgICAgICAgYS5nZXRSZXNvdXJjZUlkKGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLkFuaW1hdG9yX2ludGVycG9sYXRvciwgMCk7CisgICAgICAgIGlmIChyZXNJRCA+IDApIHsKKyAgICAgICAgICAgIGFuaW0uc2V0SW50ZXJwb2xhdG9yKEFuaW1hdGlvblV0aWxzLmxvYWRJbnRlcnBvbGF0b3IoY29udGV4dCwgcmVzSUQpKTsKKyAgICAgICAgfQorICAgICAgICBhLnJlY3ljbGUoKTsKKworICAgICAgICByZXR1cm4gYW5pbTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9hbmltYXRpb24vQW5pbWF0b3JMaXN0ZW5lckFkYXB0ZXIuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2FuaW1hdGlvbi9BbmltYXRvckxpc3RlbmVyQWRhcHRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYxODIzODkKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9hbmltYXRpb24vQW5pbWF0b3JMaXN0ZW5lckFkYXB0ZXIuamF2YQpAQCAtMCwwICsxLDU0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLmFuaW1hdGlvbjsKKworLyoqCisgKiBUaGlzIGFkYXB0ZXIgY2xhc3MgcHJvdmlkZXMgZW1wdHkgaW1wbGVtZW50YXRpb25zIG9mIHRoZSBtZXRob2RzIGZyb20ge0BsaW5rIGFuZHJvaWQuYW5pbWF0aW9uLkFuaW1hdG9yLkFuaW1hdG9yTGlzdGVuZXJ9LgorICogQW55IGN1c3RvbSBsaXN0ZW5lciB0aGF0IGNhcmVzIG9ubHkgYWJvdXQgYSBzdWJzZXQgb2YgdGhlIG1ldGhvZHMgb2YgdGhpcyBsaXN0ZW5lciBjYW4KKyAqIHNpbXBseSBzdWJjbGFzcyB0aGlzIGFkYXB0ZXIgY2xhc3MgaW5zdGVhZCBvZiBpbXBsZW1lbnRpbmcgdGhlIGludGVyZmFjZSBkaXJlY3RseS4KKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIEFuaW1hdG9yTGlzdGVuZXJBZGFwdGVyIGltcGxlbWVudHMgQW5pbWF0b3IuQW5pbWF0b3JMaXN0ZW5lciB7CisKKyAgICAvKioKKyAgICAgKiB7QGluaGVyaXRkb2N9CisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb25BbmltYXRpb25DYW5jZWwoQW5pbWF0b3IgYW5pbWF0aW9uKSB7CisgICAgfQorCisgICAgLyoqCisgICAgICoge0Bpbmhlcml0ZG9jfQorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9uQW5pbWF0aW9uRW5kKEFuaW1hdG9yIGFuaW1hdGlvbikgeworICAgIH0KKworICAgIC8qKgorICAgICAqIHtAaW5oZXJpdGRvY30KKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvbkFuaW1hdGlvblJlcGVhdChBbmltYXRvciBhbmltYXRpb24pIHsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiB7QGluaGVyaXRkb2N9CisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb25BbmltYXRpb25TdGFydChBbmltYXRvciBhbmltYXRpb24pIHsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2FuaW1hdGlvbi9BbmltYXRvclNldC5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvYW5pbWF0aW9uL0FuaW1hdG9yU2V0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTgzODVlNAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2FuaW1hdGlvbi9BbmltYXRvclNldC5qYXZhCkBAIC0wLDAgKzEsOTM5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLmFuaW1hdGlvbjsKKworaW1wb3J0IGFuZHJvaWQudmlldy5hbmltYXRpb24uSW50ZXJwb2xhdG9yOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKKworLyoqCisgKiBUaGlzIGNsYXNzIHBsYXlzIGEgc2V0IG9mIHtAbGluayBBbmltYXRvcn0gb2JqZWN0cyBpbiB0aGUgc3BlY2lmaWVkIG9yZGVyLiBBbmltYXRpb25zCisgKiBjYW4gYmUgc2V0IHVwIHRvIHBsYXkgdG9nZXRoZXIsIGluIHNlcXVlbmNlLCBvciBhZnRlciBhIHNwZWNpZmllZCBkZWxheS4KKyAqCisgKiA8cD5UaGVyZSBhcmUgdHdvIGRpZmZlcmVudCBhcHByb2FjaGVzIHRvIGFkZGluZyBhbmltYXRpb25zIHRvIGEgPGNvZGU+QW5pbWF0b3JTZXQ8L2NvZGU+OgorICogZWl0aGVyIHRoZSB7QGxpbmsgQW5pbWF0b3JTZXQjcGxheVRvZ2V0aGVyKEFuaW1hdG9yW10pIHBsYXlUb2dldGhlcigpfSBvcgorICoge0BsaW5rIEFuaW1hdG9yU2V0I3BsYXlTZXF1ZW50aWFsbHkoQW5pbWF0b3JbXSkgcGxheVNlcXVlbnRpYWxseSgpfSBtZXRob2RzIGNhbiBiZSBjYWxsZWQgdG8gYWRkCisgKiBhIHNldCBvZiBhbmltYXRpb25zIGFsbCBhdCBvbmNlLCBvciB0aGUge0BsaW5rIEFuaW1hdG9yU2V0I3BsYXkoQW5pbWF0b3IpfSBjYW4gYmUKKyAqIHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCBtZXRob2RzIGluIHRoZSB7QGxpbmsgQW5pbWF0b3JTZXQuQnVpbGRlciBCdWlsZGVyfQorICogY2xhc3MgdG8gYWRkIGFuaW1hdGlvbnMKKyAqIG9uZSBieSBvbmUuPC9wPgorICoKKyAqIDxwPkl0IGlzIHBvc3NpYmxlIHRvIHNldCB1cCBhIDxjb2RlPkFuaW1hdG9yU2V0PC9jb2RlPiB3aXRoIGNpcmN1bGFyIGRlcGVuZGVuY2llcyBiZXR3ZWVuCisgKiBpdHMgYW5pbWF0aW9ucy4gRm9yIGV4YW1wbGUsIGFuIGFuaW1hdGlvbiBhMSBjb3VsZCBiZSBzZXQgdXAgdG8gc3RhcnQgYmVmb3JlIGFuaW1hdGlvbiBhMiwgYTIKKyAqIGJlZm9yZSBhMywgYW5kIGEzIGJlZm9yZSBhMS4gVGhlIHJlc3VsdHMgb2YgdGhpcyBjb25maWd1cmF0aW9uIGFyZSB1bmRlZmluZWQsIGJ1dCB3aWxsIHR5cGljYWxseQorICogcmVzdWx0IGluIG5vbmUgb2YgdGhlIGFmZmVjdGVkIGFuaW1hdGlvbnMgYmVpbmcgcGxheWVkLiBCZWNhdXNlIG9mIHRoaXMgKGFuZCBiZWNhdXNlCisgKiBjaXJjdWxhciBkZXBlbmRlbmNpZXMgZG8gbm90IG1ha2UgbG9naWNhbCBzZW5zZSBhbnl3YXkpLCBjaXJjdWxhciBkZXBlbmRlbmNpZXMKKyAqIHNob3VsZCBiZSBhdm9pZGVkLCBhbmQgdGhlIGRlcGVuZGVuY3kgZmxvdyBvZiBhbmltYXRpb25zIHNob3VsZCBvbmx5IGJlIGluIG9uZSBkaXJlY3Rpb24uCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBBbmltYXRvclNldCBleHRlbmRzIEFuaW1hdG9yIHsKKworICAgIC8qKgorICAgICAqIEludGVybmFsIHZhcmlhYmxlcworICAgICAqIE5PVEU6IFRoaXMgb2JqZWN0IGltcGxlbWVudHMgdGhlIGNsb25lKCkgbWV0aG9kLCBtYWtpbmcgYSBkZWVwIGNvcHkgb2YgYW55IHJlZmVyZW5jZWQKKyAgICAgKiBvYmplY3RzLiBBcyBvdGhlciBub24tdHJpdmlhbCBmaWVsZHMgYXJlIGFkZGVkIHRvIHRoaXMgY2xhc3MsIG1ha2Ugc3VyZSB0byBhZGQgbG9naWMKKyAgICAgKiB0byBjbG9uZSgpIHRvIG1ha2UgZGVlcCBjb3BpZXMgb2YgdGhlbS4KKyAgICAgKi8KKworICAgIC8qKgorICAgICAqIFRyYWNrcyBhbmltYXRpb25zIGN1cnJlbnRseSBiZWluZyBwbGF5ZWQsIHNvIHRoYXQgd2Uga25vdyB3aGF0IHRvCisgICAgICogY2FuY2VsIG9yIGVuZCB3aGVuIGNhbmNlbCgpIG9yIGVuZCgpIGlzIGNhbGxlZCBvbiB0aGlzIEFuaW1hdG9yU2V0CisgICAgICovCisgICAgcHJpdmF0ZSBBcnJheUxpc3Q8QW5pbWF0b3I+IG1QbGF5aW5nU2V0ID0gbmV3IEFycmF5TGlzdDxBbmltYXRvcj4oKTsKKworICAgIC8qKgorICAgICAqIENvbnRhaW5zIGFsbCBub2RlcywgbWFwcGVkIHRvIHRoZWlyIHJlc3BlY3RpdmUgQW5pbWF0b3JzLiBXaGVuIG5ldworICAgICAqIGRlcGVuZGVuY3kgaW5mb3JtYXRpb24gaXMgYWRkZWQgZm9yIGFuIEFuaW1hdG9yLCB3ZSB3YW50IHRvIGFkZCBpdAorICAgICAqIHRvIGEgc2luZ2xlIG5vZGUgcmVwcmVzZW50aW5nIHRoYXQgQW5pbWF0b3IsIG5vdCBjcmVhdGUgYSBuZXcgTm9kZQorICAgICAqIGlmIG9uZSBhbHJlYWR5IGV4aXN0cy4KKyAgICAgKi8KKyAgICBwcml2YXRlIEhhc2hNYXA8QW5pbWF0b3IsIE5vZGU+IG1Ob2RlTWFwID0gbmV3IEhhc2hNYXA8QW5pbWF0b3IsIE5vZGU+KCk7CisKKyAgICAvKioKKyAgICAgKiBTZXQgb2YgYWxsIG5vZGVzIGNyZWF0ZWQgZm9yIHRoaXMgQW5pbWF0b3JTZXQuIFRoaXMgbGlzdCBpcyB1c2VkIHVwb24KKyAgICAgKiBzdGFydGluZyB0aGUgc2V0LCBhbmQgdGhlIG5vZGVzIGFyZSBwbGFjZWQgaW4gc29ydGVkIG9yZGVyIGludG8gdGhlCisgICAgICogc29ydGVkTm9kZXMgY29sbGVjdGlvbi4KKyAgICAgKi8KKyAgICBwcml2YXRlIEFycmF5TGlzdDxOb2RlPiBtTm9kZXMgPSBuZXcgQXJyYXlMaXN0PE5vZGU+KCk7CisKKyAgICAvKioKKyAgICAgKiBUaGUgc29ydGVkIGxpc3Qgb2Ygbm9kZXMuIFRoaXMgaXMgdGhlIG9yZGVyIGluIHdoaWNoIHRoZSBhbmltYXRpb25zIHdpbGwKKyAgICAgKiBiZSBwbGF5ZWQuIFRoZSBkZXRhaWxzIGFib3V0IHdoZW4gZXhhY3RseSB0aGV5IHdpbGwgYmUgcGxheWVkIGRlcGVuZAorICAgICAqIG9uIHRoZSBkZXBlbmRlbmN5IHJlbGF0aW9uc2hpcHMgb2YgdGhlIG5vZGVzLgorICAgICAqLworICAgIHByaXZhdGUgQXJyYXlMaXN0PE5vZGU+IG1Tb3J0ZWROb2RlcyA9IG5ldyBBcnJheUxpc3Q8Tm9kZT4oKTsKKworICAgIC8qKgorICAgICAqIEZsYWcgaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBub2RlcyBzaG91bGQgYmUgc29ydGVkIHByaW9yIHRvIHBsYXlpbmcuIFRoaXMKKyAgICAgKiBmbGFnIGFsbG93cyB1cyB0byBjYWNoZSB0aGUgcHJldmlvdXMgc29ydGVkIG5vZGVzIHNvIHRoYXQgaWYgdGhlIHNlcXVlbmNlCisgICAgICogaXMgcmVwbGF5ZWQgd2l0aCBubyBjaGFuZ2VzLCBpdCBkb2VzIG5vdCBoYXZlIHRvIHJlLXNvcnQgdGhlIG5vZGVzIGFnYWluLgorICAgICAqLworICAgIHByaXZhdGUgYm9vbGVhbiBtTmVlZHNTb3J0ID0gdHJ1ZTsKKworICAgIHByaXZhdGUgQW5pbWF0b3JTZXRMaXN0ZW5lciBtU2V0TGlzdGVuZXIgPSBudWxsOworCisgICAgLyoqCisgICAgICogRmxhZyBpbmRpY2F0aW5nIHRoYXQgdGhlIEFuaW1hdG9yU2V0IGhhcyBiZWVuIGNhbmNlbGVkIChieSBjYWxsaW5nIGNhbmNlbCgpIG9yIGVuZCgpKS4KKyAgICAgKiBUaGlzIGZsYWcgaXMgdXNlZCB0byBhdm9pZCBzdGFydGluZyBvdGhlciBhbmltYXRpb25zIHdoZW4gY3VycmVudGx5LXBsYXlpbmcKKyAgICAgKiBjaGlsZCBhbmltYXRpb25zIG9mIHRoaXMgQW5pbWF0b3JTZXQgZW5kLgorICAgICAqLworICAgIGJvb2xlYW4gbUNhbmNlbGVkID0gZmFsc2U7CisKKyAgICAvLyBUaGUgYW1vdW50IG9mIHRpbWUgaW4gbXMgdG8gZGVsYXkgc3RhcnRpbmcgdGhlIGFuaW1hdGlvbiBhZnRlciBzdGFydCgpIGlzIGNhbGxlZAorICAgIHByaXZhdGUgbG9uZyBtU3RhcnREZWxheSA9IDA7CisKKworICAgIC8vIEhvdyBsb25nIHRoZSBjaGlsZCBhbmltYXRpb25zIHNob3VsZCBsYXN0IGluIG1zLiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyBuZWdhdGl2ZSwgd2hpY2gKKyAgICAvLyBzaW1wbHkgbWVhbnMgdGhhdCB0aGVyZSBpcyBubyBkdXJhdGlvbiBzZXQgb24gdGhlIEFuaW1hdG9yU2V0LiBXaGVuIGEgcmVhbCBkdXJhdGlvbiBpcworICAgIC8vIHNldCwgaXQgaXMgcGFzc2VkIGFsb25nIHRvIHRoZSBjaGlsZCBhbmltYXRpb25zLgorICAgIHByaXZhdGUgbG9uZyBtRHVyYXRpb24gPSAtMTsKKworCisgICAgLyoqCisgICAgICogU2V0cyB1cCB0aGlzIEFuaW1hdG9yU2V0IHRvIHBsYXkgYWxsIG9mIHRoZSBzdXBwbGllZCBhbmltYXRpb25zIGF0IHRoZSBzYW1lIHRpbWUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gaXRlbXMgVGhlIGFuaW1hdGlvbnMgdGhhdCB3aWxsIGJlIHN0YXJ0ZWQgc2ltdWx0YW5lb3VzbHkuCisgICAgICovCisgICAgcHVibGljIHZvaWQgcGxheVRvZ2V0aGVyKEFuaW1hdG9yLi4uIGl0ZW1zKSB7CisgICAgICAgIGlmIChpdGVtcyAhPSBudWxsKSB7CisgICAgICAgICAgICBtTmVlZHNTb3J0ID0gdHJ1ZTsKKyAgICAgICAgICAgIEJ1aWxkZXIgYnVpbGRlciA9IHBsYXkoaXRlbXNbMF0pOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDE7IGkgPCBpdGVtcy5sZW5ndGg7ICsraSkgeworICAgICAgICAgICAgICAgIGJ1aWxkZXIud2l0aChpdGVtc1tpXSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHVwIHRoaXMgQW5pbWF0b3JTZXQgdG8gcGxheSBlYWNoIG9mIHRoZSBzdXBwbGllZCBhbmltYXRpb25zIHdoZW4gdGhlCisgICAgICogcHJldmlvdXMgYW5pbWF0aW9uIGVuZHMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gaXRlbXMgVGhlIGFuaWFtdGlvbnMgdGhhdCB3aWxsIGJlIHN0YXJ0ZWQgb25lIGFmdGVyIGFub3RoZXIuCisgICAgICovCisgICAgcHVibGljIHZvaWQgcGxheVNlcXVlbnRpYWxseShBbmltYXRvci4uLiBpdGVtcykgeworICAgICAgICBpZiAoaXRlbXMgIT0gbnVsbCkgeworICAgICAgICAgICAgbU5lZWRzU29ydCA9IHRydWU7CisgICAgICAgICAgICBpZiAoaXRlbXMubGVuZ3RoID09IDEpIHsKKyAgICAgICAgICAgICAgICBwbGF5KGl0ZW1zWzBdKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpdGVtcy5sZW5ndGggLSAxOyArK2kpIHsKKyAgICAgICAgICAgICAgICAgICAgcGxheShpdGVtc1tpXSkuYmVmb3JlKGl0ZW1zW2krMV0pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIGN1cnJlbnQgbGlzdCBvZiBjaGlsZCBBbmltYXRvciBvYmplY3RzIGNvbnRyb2xsZWQgYnkgdGhpcworICAgICAqIEFuaW1hdG9yU2V0LiBUaGlzIGlzIGEgY29weSBvZiB0aGUgaW50ZXJuYWwgbGlzdDsgbW9kaWZpY2F0aW9ucyB0byB0aGUgcmV0dXJuZWQgbGlzdAorICAgICAqIHdpbGwgbm90IGFmZmVjdCB0aGUgQW5pbWF0b3JTZXQsIGFsdGhvdWdoIGNoYW5nZXMgdG8gdGhlIHVuZGVybHlpbmcgQW5pbWF0b3Igb2JqZWN0cworICAgICAqIHdpbGwgYWZmZWN0IHRob3NlIG9iamVjdHMgYmVpbmcgbWFuYWdlZCBieSB0aGUgQW5pbWF0b3JTZXQuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIEFycmF5TGlzdDxBbmltYXRvcj4gVGhlIGxpc3Qgb2YgY2hpbGQgYW5pbWF0aW9ucyBvZiB0aGlzIEFuaW1hdG9yU2V0LgorICAgICAqLworICAgIHB1YmxpYyBBcnJheUxpc3Q8QW5pbWF0b3I+IGdldENoaWxkQW5pbWF0aW9ucygpIHsKKyAgICAgICAgQXJyYXlMaXN0PEFuaW1hdG9yPiBjaGlsZExpc3QgPSBuZXcgQXJyYXlMaXN0PEFuaW1hdG9yPigpOworICAgICAgICBmb3IgKE5vZGUgbm9kZSA6IG1Ob2RlcykgeworICAgICAgICAgICAgY2hpbGRMaXN0LmFkZChub2RlLmFuaW1hdGlvbik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGNoaWxkTGlzdDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSB0YXJnZXQgb2JqZWN0IGZvciBhbGwgY3VycmVudCB7QGxpbmsgI2dldENoaWxkQW5pbWF0aW9ucygpIGNoaWxkIGFuaW1hdGlvbnN9CisgICAgICogb2YgdGhpcyBBbmltYXRvclNldCB0aGF0IHRha2UgdGFyZ2V0cyAoe0BsaW5rIE9iamVjdEFuaW1hdG9yfSBhbmQKKyAgICAgKiBBbmltYXRvclNldCkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdGFyZ2V0IFRoZSBvYmplY3QgYmVpbmcgYW5pbWF0ZWQKKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBzZXRUYXJnZXQoT2JqZWN0IHRhcmdldCkgeworICAgICAgICBmb3IgKE5vZGUgbm9kZSA6IG1Ob2RlcykgeworICAgICAgICAgICAgQW5pbWF0b3IgYW5pbWF0aW9uID0gbm9kZS5hbmltYXRpb247CisgICAgICAgICAgICBpZiAoYW5pbWF0aW9uIGluc3RhbmNlb2YgQW5pbWF0b3JTZXQpIHsKKyAgICAgICAgICAgICAgICAoKEFuaW1hdG9yU2V0KWFuaW1hdGlvbikuc2V0VGFyZ2V0KHRhcmdldCk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGFuaW1hdGlvbiBpbnN0YW5jZW9mIE9iamVjdEFuaW1hdG9yKSB7CisgICAgICAgICAgICAgICAgKChPYmplY3RBbmltYXRvcilhbmltYXRpb24pLnNldFRhcmdldCh0YXJnZXQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgSW50ZXJwb2xhdG9yIGZvciBhbGwgY3VycmVudCB7QGxpbmsgI2dldENoaWxkQW5pbWF0aW9ucygpIGNoaWxkIGFuaW1hdGlvbnN9CisgICAgICogb2YgdGhpcyBBbmltYXRvclNldC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBpbnRlcnBvbGF0b3IgdGhlIGludGVycG9sYXRvciB0byBiZSB1c2VkIGJ5IGVhY2ggY2hpbGQgYW5pbWF0aW9uIG9mIHRoaXMgQW5pbWF0b3JTZXQKKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBzZXRJbnRlcnBvbGF0b3IoSW50ZXJwb2xhdG9yIGludGVycG9sYXRvcikgeworICAgICAgICBmb3IgKE5vZGUgbm9kZSA6IG1Ob2RlcykgeworICAgICAgICAgICAgbm9kZS5hbmltYXRpb24uc2V0SW50ZXJwb2xhdG9yKGludGVycG9sYXRvcik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGlzIG1ldGhvZCBjcmVhdGVzIGEgPGNvZGU+QnVpbGRlcjwvY29kZT4gb2JqZWN0LCB3aGljaCBpcyB1c2VkIHRvCisgICAgICogc2V0IHVwIHBsYXlpbmcgY29uc3RyYWludHMuIFRoaXMgaW5pdGlhbCA8Y29kZT5wbGF5KCk8L2NvZGU+IG1ldGhvZAorICAgICAqIHRlbGxzIHRoZSA8Y29kZT5CdWlsZGVyPC9jb2RlPiB0aGUgYW5pbWF0aW9uIHRoYXQgaXMgdGhlIGRlcGVuZGVuY3kgZm9yCisgICAgICogdGhlIHN1Y2NlZWRpbmcgY29tbWFuZHMgdG8gdGhlIDxjb2RlPkJ1aWxkZXI8L2NvZGU+LiBGb3IgZXhhbXBsZSwKKyAgICAgKiBjYWxsaW5nIDxjb2RlPnBsYXkoYTEpLndpdGgoYTIpPC9jb2RlPiBzZXRzIHVwIHRoZSBBbmltYXRvclNldCB0byBwbGF5CisgICAgICogPGNvZGU+YTE8L2NvZGU+IGFuZCA8Y29kZT5hMjwvY29kZT4gYXQgdGhlIHNhbWUgdGltZSwKKyAgICAgKiA8Y29kZT5wbGF5KGExKS5iZWZvcmUoYTIpPC9jb2RlPiBzZXRzIHVwIHRoZSBBbmltYXRvclNldCB0byBwbGF5CisgICAgICogPGNvZGU+YTE8L2NvZGU+IGZpcnN0LCBmb2xsb3dlZCBieSA8Y29kZT5hMjwvY29kZT4sIGFuZAorICAgICAqIDxjb2RlPnBsYXkoYTEpLmFmdGVyKGEyKTwvY29kZT4gc2V0cyB1cCB0aGUgQW5pbWF0b3JTZXQgdG8gcGxheQorICAgICAqIDxjb2RlPmEyPC9jb2RlPiBmaXJzdCwgZm9sbG93ZWQgYnkgPGNvZGU+YTE8L2NvZGU+LgorICAgICAqCisgICAgICogPHA+Tm90ZSB0aGF0IDxjb2RlPnBsYXkoKTwvY29kZT4gaXMgdGhlIG9ubHkgd2F5IHRvIHRlbGwgdGhlCisgICAgICogPGNvZGU+QnVpbGRlcjwvY29kZT4gdGhlIGFuaW1hdGlvbiB1cG9uIHdoaWNoIHRoZSBkZXBlbmRlbmN5IGlzIGNyZWF0ZWQsCisgICAgICogc28gc3VjY2Vzc2l2ZSBjYWxscyB0byB0aGUgdmFyaW91cyBmdW5jdGlvbnMgaW4gPGNvZGU+QnVpbGRlcjwvY29kZT4KKyAgICAgKiB3aWxsIGFsbCByZWZlciB0byB0aGUgaW5pdGlhbCBwYXJhbWV0ZXIgc3VwcGxpZWQgaW4gPGNvZGU+cGxheSgpPC9jb2RlPgorICAgICAqIGFzIHRoZSBkZXBlbmRlbmN5IG9mIHRoZSBvdGhlciBhbmltYXRpb25zLiBGb3IgZXhhbXBsZSwgY2FsbGluZworICAgICAqIDxjb2RlPnBsYXkoYTEpLmJlZm9yZShhMikuYmVmb3JlKGEzKTwvY29kZT4gd2lsbCBwbGF5IGJvdGggPGNvZGU+YTI8L2NvZGU+CisgICAgICogYW5kIDxjb2RlPmEzPC9jb2RlPiB3aGVuIGExIGVuZHM7IGl0IGRvZXMgbm90IHNldCB1cCBhIGRlcGVuZGVuY3kgYmV0d2VlbgorICAgICAqIDxjb2RlPmEyPC9jb2RlPiBhbmQgPGNvZGU+YTM8L2NvZGU+LjwvcD4KKyAgICAgKgorICAgICAqIEBwYXJhbSBhbmltIFRoZSBhbmltYXRpb24gdGhhdCBpcyB0aGUgZGVwZW5kZW5jeSB1c2VkIGluIGxhdGVyIGNhbGxzIHRvIHRoZQorICAgICAqIG1ldGhvZHMgaW4gdGhlIHJldHVybmVkIDxjb2RlPkJ1aWxkZXI8L2NvZGU+IG9iamVjdC4gQSBudWxsIHBhcmFtZXRlciB3aWxsIHJlc3VsdAorICAgICAqIGluIGEgbnVsbCA8Y29kZT5CdWlsZGVyPC9jb2RlPiByZXR1cm4gdmFsdWUuCisgICAgICogQHJldHVybiBCdWlsZGVyIFRoZSBvYmplY3QgdGhhdCBjb25zdHJ1Y3RzIHRoZSBBbmltYXRvclNldCBiYXNlZCBvbiB0aGUgZGVwZW5kZW5jaWVzCisgICAgICogb3V0bGluZWQgaW4gdGhlIGNhbGxzIHRvIDxjb2RlPnBsYXk8L2NvZGU+IGFuZCB0aGUgb3RoZXIgbWV0aG9kcyBpbiB0aGUKKyAgICAgKiA8Y29kZT5CdWlsZGVyPC9jb2RlIG9iamVjdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgQnVpbGRlciBwbGF5KEFuaW1hdG9yIGFuaW0pIHsKKyAgICAgICAgaWYgKGFuaW0gIT0gbnVsbCkgeworICAgICAgICAgICAgbU5lZWRzU29ydCA9IHRydWU7CisgICAgICAgICAgICByZXR1cm4gbmV3IEJ1aWxkZXIoYW5pbSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgLyoqCisgICAgICoge0Bpbmhlcml0RG9jfQorICAgICAqCisgICAgICogPHA+Tm90ZSB0aGF0IGNhbmNlbGluZyBhIDxjb2RlPkFuaW1hdG9yU2V0PC9jb2RlPiBhbHNvIGNhbmNlbHMgYWxsIG9mIHRoZSBhbmltYXRpb25zIHRoYXQgaXQgaXMKKyAgICAgKiByZXNwb25zaWJsZSBmb3IuPC9wPgorICAgICAqLworICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGNhbmNlbCgpIHsKKyAgICAgICAgbUNhbmNlbGVkID0gdHJ1ZTsKKyAgICAgICAgaWYgKG1MaXN0ZW5lcnMgIT0gbnVsbCkgeworICAgICAgICAgICAgQXJyYXlMaXN0PEFuaW1hdG9yTGlzdGVuZXI+IHRtcExpc3RlbmVycyA9CisgICAgICAgICAgICAgICAgICAgIChBcnJheUxpc3Q8QW5pbWF0b3JMaXN0ZW5lcj4pIG1MaXN0ZW5lcnMuY2xvbmUoKTsKKyAgICAgICAgICAgIGZvciAoQW5pbWF0b3JMaXN0ZW5lciBsaXN0ZW5lciA6IHRtcExpc3RlbmVycykgeworICAgICAgICAgICAgICAgIGxpc3RlbmVyLm9uQW5pbWF0aW9uQ2FuY2VsKHRoaXMpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChtU29ydGVkTm9kZXMuc2l6ZSgpID4gMCkgeworICAgICAgICAgICAgZm9yIChOb2RlIG5vZGUgOiBtU29ydGVkTm9kZXMpIHsKKyAgICAgICAgICAgICAgICBub2RlLmFuaW1hdGlvbi5jYW5jZWwoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIHtAaW5oZXJpdERvY30KKyAgICAgKgorICAgICAqIDxwPk5vdGUgdGhhdCBlbmRpbmcgYSA8Y29kZT5BbmltYXRvclNldDwvY29kZT4gYWxzbyBlbmRzIGFsbCBvZiB0aGUgYW5pbWF0aW9ucyB0aGF0IGl0IGlzCisgICAgICogcmVzcG9uc2libGUgZm9yLjwvcD4KKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBlbmQoKSB7CisgICAgICAgIG1DYW5jZWxlZCA9IHRydWU7CisgICAgICAgIGlmIChtU29ydGVkTm9kZXMuc2l6ZSgpICE9IG1Ob2Rlcy5zaXplKCkpIHsKKyAgICAgICAgICAgIC8vIGhhc24ndCBiZWVuIHN0YXJ0ZWQgeWV0IC0gc29ydCB0aGUgbm9kZXMgbm93LCB0aGVuIGVuZCB0aGVtCisgICAgICAgICAgICBzb3J0Tm9kZXMoKTsKKyAgICAgICAgICAgIGZvciAoTm9kZSBub2RlIDogbVNvcnRlZE5vZGVzKSB7CisgICAgICAgICAgICAgICAgaWYgKG1TZXRMaXN0ZW5lciA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIG1TZXRMaXN0ZW5lciA9IG5ldyBBbmltYXRvclNldExpc3RlbmVyKHRoaXMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBub2RlLmFuaW1hdGlvbi5hZGRMaXN0ZW5lcihtU2V0TGlzdGVuZXIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChtU29ydGVkTm9kZXMuc2l6ZSgpID4gMCkgeworICAgICAgICAgICAgZm9yIChOb2RlIG5vZGUgOiBtU29ydGVkTm9kZXMpIHsKKyAgICAgICAgICAgICAgICBub2RlLmFuaW1hdGlvbi5lbmQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdHJ1ZSBpZiBhbnkgb2YgdGhlIGNoaWxkIGFuaW1hdGlvbnMgb2YgdGhpcyBBbmltYXRvclNldCBoYXZlIGJlZW4gc3RhcnRlZCBhbmQgaGF2ZSBub3QKKyAgICAgKiB5ZXQgZW5kZWQuCisgICAgICogQHJldHVybiBXaGV0aGVyIHRoaXMgQW5pbWF0b3JTZXQgaGFzIGJlZW4gc3RhcnRlZCBhbmQgaGFzIG5vdCB5ZXQgZW5kZWQuCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gaXNSdW5uaW5nKCkgeworICAgICAgICBmb3IgKE5vZGUgbm9kZSA6IG1Ob2RlcykgeworICAgICAgICAgICAgaWYgKG5vZGUuYW5pbWF0aW9uLmlzUnVubmluZygpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSBhbW91bnQgb2YgdGltZSwgaW4gbWlsbGlzZWNvbmRzLCB0byBkZWxheSBzdGFydGluZyB0aGUgYW5pbWF0aW9uIGFmdGVyCisgICAgICoge0BsaW5rICNzdGFydCgpfSBpcyBjYWxsZWQuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIHRvIGRlbGF5IHJ1bm5pbmcgdGhlIGFuaW1hdGlvbgorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBsb25nIGdldFN0YXJ0RGVsYXkoKSB7CisgICAgICAgIHJldHVybiBtU3RhcnREZWxheTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgYW1vdW50IG9mIHRpbWUsIGluIG1pbGxpc2Vjb25kcywgdG8gZGVsYXkgc3RhcnRpbmcgdGhlIGFuaW1hdGlvbiBhZnRlcgorICAgICAqIHtAbGluayAjc3RhcnQoKX0gaXMgY2FsbGVkLgorCisgICAgICogQHBhcmFtIHN0YXJ0RGVsYXkgVGhlIGFtb3VudCBvZiB0aGUgZGVsYXksIGluIG1pbGxpc2Vjb25kcworICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHNldFN0YXJ0RGVsYXkobG9uZyBzdGFydERlbGF5KSB7CisgICAgICAgIG1TdGFydERlbGF5ID0gc3RhcnREZWxheTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSBsZW5ndGggb2YgZWFjaCBvZiB0aGUgY2hpbGQgYW5pbWF0aW9ucyBvZiB0aGlzIEFuaW1hdG9yU2V0LiBUaGlzIHZhbHVlIG1heQorICAgICAqIGJlIGxlc3MgdGhhbiAwLCB3aGljaCBpbmRpY2F0ZXMgdGhhdCBubyBkdXJhdGlvbiBoYXMgYmVlbiBzZXQgb24gdGhpcyBBbmltYXRvclNldAorICAgICAqIGFuZCBlYWNoIG9mIHRoZSBjaGlsZCBhbmltYXRpb25zIHdpbGwgdXNlIHRoZWlyIG93biBkdXJhdGlvbi4KKyAgICAgKgorICAgICAqIEByZXR1cm4gVGhlIGxlbmd0aCBvZiB0aGUgYW5pbWF0aW9uLCBpbiBtaWxsaXNlY29uZHMsIG9mIGVhY2ggb2YgdGhlIGNoaWxkCisgICAgICogYW5pbWF0aW9ucyBvZiB0aGlzIEFuaW1hdG9yU2V0LgorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBsb25nIGdldER1cmF0aW9uKCkgeworICAgICAgICByZXR1cm4gbUR1cmF0aW9uOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIGxlbmd0aCBvZiBlYWNoIG9mIHRoZSBjdXJyZW50IGNoaWxkIGFuaW1hdGlvbnMgb2YgdGhpcyBBbmltYXRvclNldC4gQnkgZGVmYXVsdCwKKyAgICAgKiBlYWNoIGNoaWxkIGFuaW1hdGlvbiB3aWxsIHVzZSBpdHMgb3duIGR1cmF0aW9uLiBJZiB0aGUgZHVyYXRpb24gaXMgc2V0IG9uIHRoZSBBbmltYXRvclNldCwKKyAgICAgKiB0aGVuIGVhY2ggY2hpbGQgYW5pbWF0aW9uIGluaGVyaXRzIHRoaXMgZHVyYXRpb24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gZHVyYXRpb24gVGhlIGxlbmd0aCBvZiB0aGUgYW5pbWF0aW9uLCBpbiBtaWxsaXNlY29uZHMsIG9mIGVhY2ggb2YgdGhlIGNoaWxkCisgICAgICogYW5pbWF0aW9ucyBvZiB0aGlzIEFuaW1hdG9yU2V0LgorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHNldER1cmF0aW9uKGxvbmcgZHVyYXRpb24pIHsKKyAgICAgICAgaWYgKGR1cmF0aW9uIDwgMCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiZHVyYXRpb24gbXVzdCBiZSBhIHZhbHVlIG9mIHplcm8gb3IgZ3JlYXRlciIpOworICAgICAgICB9CisgICAgICAgIGZvciAoTm9kZSBub2RlIDogbU5vZGVzKSB7CisgICAgICAgICAgICAvLyBUT0RPOiBkb24ndCBzZXQgdGhlIGR1cmF0aW9uIG9mIHRoZSB0aW1pbmctb25seSBub2RlcyBjcmVhdGVkIGJ5IEFuaW1hdG9yU2V0IHRvCisgICAgICAgICAgICAvLyBpbnNlcnQgInBsYXktYWZ0ZXIiIGRlbGF5cworICAgICAgICAgICAgbm9kZS5hbmltYXRpb24uc2V0RHVyYXRpb24oZHVyYXRpb24pOworICAgICAgICB9CisgICAgICAgIG1EdXJhdGlvbiA9IGR1cmF0aW9uOworICAgIH0KKworICAgIC8qKgorICAgICAqIHtAaW5oZXJpdERvY30KKyAgICAgKgorICAgICAqIDxwPlN0YXJ0aW5nIHRoaXMgPGNvZGU+QW5pbWF0b3JTZXQ8L2NvZGU+IHdpbGwsIGluIHR1cm4sIHN0YXJ0IHRoZSBhbmltYXRpb25zIGZvciB3aGljaAorICAgICAqIGl0IGlzIHJlc3BvbnNpYmxlLiBUaGUgZGV0YWlscyBvZiB3aGVuIGV4YWN0bHkgdGhvc2UgYW5pbWF0aW9ucyBhcmUgc3RhcnRlZCBkZXBlbmRzIG9uCisgICAgICogdGhlIGRlcGVuZGVuY3kgcmVsYXRpb25zaGlwcyB0aGF0IGhhdmUgYmVlbiBzZXQgdXAgYmV0d2VlbiB0aGUgYW5pbWF0aW9ucy4KKyAgICAgKi8KKyAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBzdGFydCgpIHsKKyAgICAgICAgbUNhbmNlbGVkID0gZmFsc2U7CisKKyAgICAgICAgLy8gRmlyc3QsIHNvcnQgdGhlIG5vZGVzIChpZiBuZWNlc3NhcnkpLiBUaGlzIHdpbGwgZW5zdXJlIHRoYXQgc29ydGVkTm9kZXMKKyAgICAgICAgLy8gY29udGFpbnMgdGhlIGFuaW1hdGlvbiBub2RlcyBpbiB0aGUgY29ycmVjdCBvcmRlci4KKyAgICAgICAgc29ydE5vZGVzKCk7CisKKyAgICAgICAgLy8gbm9kZXNUb1N0YXJ0IGhvbGRzIHRoZSBsaXN0IG9mIG5vZGVzIHRvIGJlIHN0YXJ0ZWQgaW1tZWRpYXRlbHkuIFdlIGRvbid0IHdhbnQgdG8KKyAgICAgICAgLy8gc3RhcnQgdGhlIGFuaW1hdGlvbnMgaW4gdGhlIGxvb3AgZGlyZWN0bHkgYmVjYXVzZSB3ZSBmaXJzdCBuZWVkIHRvIHNldCB1cAorICAgICAgICAvLyBkZXBlbmRlbmNpZXMgb24gYWxsIG9mIHRoZSBub2Rlcy4gRm9yIGV4YW1wbGUsIHdlIGRvbid0IHdhbnQgdG8gc3RhcnQgYW4gYW5pbWF0aW9uCisgICAgICAgIC8vIHdoZW4gc29tZSBvdGhlciBhbmltYXRpb24gYWxzbyB3YW50cyB0byBzdGFydCB3aGVuIHRoZSBmaXJzdCBhbmltYXRpb24gYmVnaW5zLgorICAgICAgICBmaW5hbCBBcnJheUxpc3Q8Tm9kZT4gbm9kZXNUb1N0YXJ0ID0gbmV3IEFycmF5TGlzdDxOb2RlPigpOworICAgICAgICBmb3IgKE5vZGUgbm9kZSA6IG1Tb3J0ZWROb2RlcykgeworICAgICAgICAgICAgaWYgKG1TZXRMaXN0ZW5lciA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgbVNldExpc3RlbmVyID0gbmV3IEFuaW1hdG9yU2V0TGlzdGVuZXIodGhpcyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobm9kZS5kZXBlbmRlbmNpZXMgPT0gbnVsbCB8fCBub2RlLmRlcGVuZGVuY2llcy5zaXplKCkgPT0gMCkgeworICAgICAgICAgICAgICAgIG5vZGVzVG9TdGFydC5hZGQobm9kZSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGZvciAoRGVwZW5kZW5jeSBkZXBlbmRlbmN5IDogbm9kZS5kZXBlbmRlbmNpZXMpIHsKKyAgICAgICAgICAgICAgICAgICAgZGVwZW5kZW5jeS5ub2RlLmFuaW1hdGlvbi5hZGRMaXN0ZW5lcigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgRGVwZW5kZW5jeUxpc3RlbmVyKHRoaXMsIG5vZGUsIGRlcGVuZGVuY3kucnVsZSkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBub2RlLnRtcERlcGVuZGVuY2llcyA9IChBcnJheUxpc3Q8RGVwZW5kZW5jeT4pIG5vZGUuZGVwZW5kZW5jaWVzLmNsb25lKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBub2RlLmFuaW1hdGlvbi5hZGRMaXN0ZW5lcihtU2V0TGlzdGVuZXIpOworICAgICAgICB9CisgICAgICAgIC8vIE5vdyB0aGF0IGFsbCBkZXBlbmRlbmNpZXMgYXJlIHNldCB1cCwgc3RhcnQgdGhlIGFuaW1hdGlvbnMgdGhhdCBzaG91bGQgYmUgc3RhcnRlZC4KKyAgICAgICAgaWYgKG1TdGFydERlbGF5IDw9IDApIHsKKyAgICAgICAgICAgIGZvciAoTm9kZSBub2RlIDogbm9kZXNUb1N0YXJ0KSB7CisgICAgICAgICAgICAgICAgbm9kZS5hbmltYXRpb24uc3RhcnQoKTsKKyAgICAgICAgICAgICAgICBtUGxheWluZ1NldC5hZGQobm9kZS5hbmltYXRpb24pOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gVE9ETzogTmVlZCB0byBjYW5jZWwgb3V0IG9mIHRoZSBkZWxheSBhcHByb3ByaWF0ZWx5CisgICAgICAgICAgICBWYWx1ZUFuaW1hdG9yIGRlbGF5QW5pbSA9IG5ldyBWYWx1ZUFuaW1hdG9yKG1TdGFydERlbGF5LCAwZiwgMWYpOworICAgICAgICAgICAgZGVsYXlBbmltLmFkZExpc3RlbmVyKG5ldyBBbmltYXRvckxpc3RlbmVyQWRhcHRlcigpIHsKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkFuaW1hdGlvbkVuZChBbmltYXRvciBhbmltKSB7CisgICAgICAgICAgICAgICAgICAgIGZvciAoTm9kZSBub2RlIDogbm9kZXNUb1N0YXJ0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBub2RlLmFuaW1hdGlvbi5zdGFydCgpOworICAgICAgICAgICAgICAgICAgICAgICAgbVBsYXlpbmdTZXQuYWRkKG5vZGUuYW5pbWF0aW9uKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworICAgICAgICB9CisgICAgICAgIGlmIChtTGlzdGVuZXJzICE9IG51bGwpIHsKKyAgICAgICAgICAgIEFycmF5TGlzdDxBbmltYXRvckxpc3RlbmVyPiB0bXBMaXN0ZW5lcnMgPQorICAgICAgICAgICAgICAgICAgICAoQXJyYXlMaXN0PEFuaW1hdG9yTGlzdGVuZXI+KSBtTGlzdGVuZXJzLmNsb25lKCk7CisgICAgICAgICAgICBmb3IgKEFuaW1hdG9yTGlzdGVuZXIgbGlzdGVuZXIgOiB0bXBMaXN0ZW5lcnMpIHsKKyAgICAgICAgICAgICAgICBsaXN0ZW5lci5vbkFuaW1hdGlvblN0YXJ0KHRoaXMpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIEFuaW1hdG9yU2V0IGNsb25lKCkgeworICAgICAgICBmaW5hbCBBbmltYXRvclNldCBhbmltID0gKEFuaW1hdG9yU2V0KSBzdXBlci5jbG9uZSgpOworICAgICAgICAvKgorICAgICAgICAgKiBUaGUgYmFzaWMgY2xvbmUoKSBvcGVyYXRpb24gY29waWVzIGFsbCBpdGVtcy4gVGhpcyBkb2Vzbid0IHdvcmsgdmVyeSB3ZWxsIGZvcgorICAgICAgICAgKiBBbmltYXRvclNldCwgYmVjYXVzZSBpdCB3aWxsIGNvcHkgcmVmZXJlbmNlcyB0aGF0IG5lZWQgdG8gYmUgcmVjcmVhdGVkIGFuZCBzdGF0ZQorICAgICAgICAgKiB0aGF0IG1heSBub3QgYXBwbHkuIFdoYXQgd2UgbmVlZCB0byBkbyBub3cgaXMgcHV0IHRoZSBjbG9uZSBpbiBhbiB1bmluaXRpYWxpemVkCisgICAgICAgICAqIHN0YXRlLCB3aXRoIGZyZXNoLCBlbXB0eSBkYXRhIHN0cnVjdHVyZXMuIFRoZW4gd2Ugd2lsbCBidWlsZCB1cCB0aGUgbm9kZXMgbGlzdAorICAgICAgICAgKiBtYW51YWxseSwgYXMgd2UgY2xvbmUgZWFjaCBOb2RlIChhbmQgaXRzIGFuaW1hdGlvbikuIFRoZSBjbG9uZSB3aWxsIHRoZW4gYmUgc29ydGVkLAorICAgICAgICAgKiBhbmQgd2lsbCBwb3B1bGF0ZSBhbnkgYXBwcm9wcmlhdGUgbGlzdHMsIHdoZW4gaXQgaXMgc3RhcnRlZC4KKyAgICAgICAgICovCisgICAgICAgIGFuaW0ubU5lZWRzU29ydCA9IHRydWU7CisgICAgICAgIGFuaW0ubUNhbmNlbGVkID0gZmFsc2U7CisgICAgICAgIGFuaW0ubVBsYXlpbmdTZXQgPSBuZXcgQXJyYXlMaXN0PEFuaW1hdG9yPigpOworICAgICAgICBhbmltLm1Ob2RlTWFwID0gbmV3IEhhc2hNYXA8QW5pbWF0b3IsIE5vZGU+KCk7CisgICAgICAgIGFuaW0ubU5vZGVzID0gbmV3IEFycmF5TGlzdDxOb2RlPigpOworICAgICAgICBhbmltLm1Tb3J0ZWROb2RlcyA9IG5ldyBBcnJheUxpc3Q8Tm9kZT4oKTsKKworICAgICAgICAvLyBXYWxrIHRocm91Z2ggdGhlIG9sZCBub2RlcyBsaXN0LCBjbG9uaW5nIGVhY2ggbm9kZSBhbmQgYWRkaW5nIGl0IHRvIHRoZSBuZXcgbm9kZW1hcC4KKyAgICAgICAgLy8gT25lIHByb2JsZW0gaXMgdGhhdCB0aGUgb2xkIG5vZGUgZGVwZW5kZW5jaWVzIHBvaW50IHRvIG5vZGVzIGluIHRoZSBvbGQgQW5pbWF0b3JTZXQuCisgICAgICAgIC8vIFdlIG5lZWQgdG8gdHJhY2sgdGhlIG9sZC9uZXcgbm9kZXMgaW4gb3JkZXIgdG8gcmVjb25zdHJ1Y3QgdGhlIGRlcGVuZGVuY2llcyBpbiB0aGUgY2xvbmUuCisgICAgICAgIEhhc2hNYXA8Tm9kZSwgTm9kZT4gbm9kZUNsb25lTWFwID0gbmV3IEhhc2hNYXA8Tm9kZSwgTm9kZT4oKTsgLy8gPG9sZCwgbmV3PgorICAgICAgICBmb3IgKE5vZGUgbm9kZSA6IG1Ob2RlcykgeworICAgICAgICAgICAgTm9kZSBub2RlQ2xvbmUgPSBub2RlLmNsb25lKCk7CisgICAgICAgICAgICBub2RlQ2xvbmVNYXAucHV0KG5vZGUsIG5vZGVDbG9uZSk7CisgICAgICAgICAgICBhbmltLm1Ob2Rlcy5hZGQobm9kZUNsb25lKTsKKyAgICAgICAgICAgIGFuaW0ubU5vZGVNYXAucHV0KG5vZGVDbG9uZS5hbmltYXRpb24sIG5vZGVDbG9uZSk7CisgICAgICAgICAgICAvLyBDbGVhciBvdXQgdGhlIGRlcGVuZGVuY2llcyBpbiB0aGUgY2xvbmU7IHdlJ2xsIHNldCB0aGVzZSB1cCBtYW51YWxseSBsYXRlcgorICAgICAgICAgICAgbm9kZUNsb25lLmRlcGVuZGVuY2llcyA9IG51bGw7CisgICAgICAgICAgICBub2RlQ2xvbmUudG1wRGVwZW5kZW5jaWVzID0gbnVsbDsKKyAgICAgICAgICAgIG5vZGVDbG9uZS5ub2RlRGVwZW5kZW50cyA9IG51bGw7CisgICAgICAgICAgICBub2RlQ2xvbmUubm9kZURlcGVuZGVuY2llcyA9IG51bGw7CisgICAgICAgICAgICAvLyBjbGVhciBvdXQgYW55IGxpc3RlbmVycyB0aGF0IHdlcmUgc2V0IHVwIGJ5IHRoZSBBbmltYXRvclNldDsgdGhlc2Ugd2lsbAorICAgICAgICAgICAgLy8gYmUgc2V0IHVwIHdoZW4gdGhlIGNsb25lJ3Mgbm9kZXMgYXJlIHNvcnRlZAorICAgICAgICAgICAgQXJyYXlMaXN0PEFuaW1hdG9yTGlzdGVuZXI+IGNsb25lTGlzdGVuZXJzID0gbm9kZUNsb25lLmFuaW1hdGlvbi5nZXRMaXN0ZW5lcnMoKTsKKyAgICAgICAgICAgIGlmIChjbG9uZUxpc3RlbmVycyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgQXJyYXlMaXN0PEFuaW1hdG9yTGlzdGVuZXI+IGxpc3RlbmVyc1RvUmVtb3ZlID0gbnVsbDsKKyAgICAgICAgICAgICAgICBmb3IgKEFuaW1hdG9yTGlzdGVuZXIgbGlzdGVuZXIgOiBjbG9uZUxpc3RlbmVycykgeworICAgICAgICAgICAgICAgICAgICBpZiAobGlzdGVuZXIgaW5zdGFuY2VvZiBBbmltYXRvclNldExpc3RlbmVyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobGlzdGVuZXJzVG9SZW1vdmUgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpc3RlbmVyc1RvUmVtb3ZlID0gbmV3IEFycmF5TGlzdDxBbmltYXRvckxpc3RlbmVyPigpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgbGlzdGVuZXJzVG9SZW1vdmUuYWRkKGxpc3RlbmVyKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAobGlzdGVuZXJzVG9SZW1vdmUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBmb3IgKEFuaW1hdG9yTGlzdGVuZXIgbGlzdGVuZXIgOiBsaXN0ZW5lcnNUb1JlbW92ZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgY2xvbmVMaXN0ZW5lcnMucmVtb3ZlKGxpc3RlbmVyKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvLyBOb3cgdGhhdCB3ZSd2ZSBjbG9uZWQgYWxsIG9mIHRoZSBub2Rlcywgd2UncmUgcmVhZHkgdG8gd2FsayB0aHJvdWdoIHRoZWlyCisgICAgICAgIC8vIGRlcGVuZGVuY2llcywgbWFwcGluZyB0aGUgb2xkIGRlcGVuZGVuY2llcyB0byB0aGUgbmV3IG5vZGVzCisgICAgICAgIGZvciAoTm9kZSBub2RlIDogbU5vZGVzKSB7CisgICAgICAgICAgICBOb2RlIG5vZGVDbG9uZSA9IG5vZGVDbG9uZU1hcC5nZXQobm9kZSk7CisgICAgICAgICAgICBpZiAobm9kZS5kZXBlbmRlbmNpZXMgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGZvciAoRGVwZW5kZW5jeSBkZXBlbmRlbmN5IDogbm9kZS5kZXBlbmRlbmNpZXMpIHsKKyAgICAgICAgICAgICAgICAgICAgTm9kZSBjbG9uZWREZXBlbmRlbmN5Tm9kZSA9IG5vZGVDbG9uZU1hcC5nZXQoZGVwZW5kZW5jeS5ub2RlKTsKKyAgICAgICAgICAgICAgICAgICAgRGVwZW5kZW5jeSBjbG9uZURlcGVuZGVuY3kgPSBuZXcgRGVwZW5kZW5jeShjbG9uZWREZXBlbmRlbmN5Tm9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXBlbmRlbmN5LnJ1bGUpOworICAgICAgICAgICAgICAgICAgICBub2RlQ2xvbmUuYWRkRGVwZW5kZW5jeShjbG9uZURlcGVuZGVuY3kpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBhbmltOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoaXMgY2xhc3MgaXMgdGhlIG1lY2hhbmlzbSBieSB3aGljaCBhbmltYXRpb25zIGFyZSBzdGFydGVkIGJhc2VkIG9uIGV2ZW50cyBpbiBvdGhlcgorICAgICAqIGFuaW1hdGlvbnMuIElmIGFuIGFuaW1hdGlvbiBoYXMgbXVsdGlwbGUgZGVwZW5kZW5jaWVzIG9uIG90aGVyIGFuaW1hdGlvbnMsIHRoZW4KKyAgICAgKiBhbGwgZGVwZW5kZW5jaWVzIG11c3QgYmUgc2F0aXNmaWVkIGJlZm9yZSB0aGUgYW5pbWF0aW9uIGlzIHN0YXJ0ZWQuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgRGVwZW5kZW5jeUxpc3RlbmVyIGltcGxlbWVudHMgQW5pbWF0b3JMaXN0ZW5lciB7CisKKyAgICAgICAgcHJpdmF0ZSBBbmltYXRvclNldCBtQW5pbWF0b3JTZXQ7CisKKyAgICAgICAgLy8gVGhlIG5vZGUgdXBvbiB3aGljaCB0aGUgZGVwZW5kZW5jeSBpcyBiYXNlZC4KKyAgICAgICAgcHJpdmF0ZSBOb2RlIG1Ob2RlOworCisgICAgICAgIC8vIFRoZSBEZXBlbmRlbmN5IHJ1bGUgKFdJVEggb3IgQUZURVIpIHRoYXQgdGhlIGxpc3RlbmVyIHNob3VsZCB3YWl0IGZvciBvbgorICAgICAgICAvLyB0aGUgbm9kZQorICAgICAgICBwcml2YXRlIGludCBtUnVsZTsKKworICAgICAgICBwdWJsaWMgRGVwZW5kZW5jeUxpc3RlbmVyKEFuaW1hdG9yU2V0IGFuaW1hdG9yU2V0LCBOb2RlIG5vZGUsIGludCBydWxlKSB7CisgICAgICAgICAgICB0aGlzLm1BbmltYXRvclNldCA9IGFuaW1hdG9yU2V0OworICAgICAgICAgICAgdGhpcy5tTm9kZSA9IG5vZGU7CisgICAgICAgICAgICB0aGlzLm1SdWxlID0gcnVsZTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBJZ25vcmUgY2FuY2VsIGV2ZW50cyBmb3Igbm93LiBXZSBtYXkgd2FudCB0byBoYW5kbGUgdGhpcyBldmVudHVhbGx5LAorICAgICAgICAgKiB0byBwcmV2ZW50IGZvbGxvdy1vbiBhbmltYXRpb25zIGZyb20gcnVubmluZyB3aGVuIHNvbWUgZGVwZW5kZW5jeQorICAgICAgICAgKiBhbmltYXRpb24gaXMgY2FuY2VsZWQuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgdm9pZCBvbkFuaW1hdGlvbkNhbmNlbChBbmltYXRvciBhbmltYXRpb24pIHsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBBbiBlbmQgZXZlbnQgaXMgcmVjZWl2ZWQgLSBzZWUgaWYgdGhpcyBpcyBhbiBldmVudCB3ZSBhcmUgbGlzdGVuaW5nIGZvcgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgb25BbmltYXRpb25FbmQoQW5pbWF0b3IgYW5pbWF0aW9uKSB7CisgICAgICAgICAgICBpZiAobVJ1bGUgPT0gRGVwZW5kZW5jeS5BRlRFUikgeworICAgICAgICAgICAgICAgIHN0YXJ0SWZSZWFkeShhbmltYXRpb24pOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIElnbm9yZSByZXBlYXQgZXZlbnRzIGZvciBub3cKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2b2lkIG9uQW5pbWF0aW9uUmVwZWF0KEFuaW1hdG9yIGFuaW1hdGlvbikgeworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEEgc3RhcnQgZXZlbnQgaXMgcmVjZWl2ZWQgLSBzZWUgaWYgdGhpcyBpcyBhbiBldmVudCB3ZSBhcmUgbGlzdGVuaW5nIGZvcgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgb25BbmltYXRpb25TdGFydChBbmltYXRvciBhbmltYXRpb24pIHsKKyAgICAgICAgICAgIGlmIChtUnVsZSA9PSBEZXBlbmRlbmN5LldJVEgpIHsKKyAgICAgICAgICAgICAgICBzdGFydElmUmVhZHkoYW5pbWF0aW9uKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBDaGVjayB3aGV0aGVyIHRoZSBldmVudCByZWNlaXZlZCBpcyBvbmUgdGhhdCB0aGUgbm9kZSB3YXMgd2FpdGluZyBmb3IuCisgICAgICAgICAqIElmIHNvLCBtYXJrIGl0IGFzIGNvbXBsZXRlIGFuZCBzZWUgd2hldGhlciBpdCdzIHRpbWUgdG8gc3RhcnQKKyAgICAgICAgICogdGhlIGFuaW1hdGlvbi4KKyAgICAgICAgICogQHBhcmFtIGRlcGVuZGVuY3lBbmltYXRpb24gdGhlIGFuaW1hdGlvbiB0aGF0IHNlbnQgdGhlIGV2ZW50LgorICAgICAgICAgKi8KKyAgICAgICAgcHJpdmF0ZSB2b2lkIHN0YXJ0SWZSZWFkeShBbmltYXRvciBkZXBlbmRlbmN5QW5pbWF0aW9uKSB7CisgICAgICAgICAgICBpZiAobUFuaW1hdG9yU2V0Lm1DYW5jZWxlZCkgeworICAgICAgICAgICAgICAgIC8vIGlmIHRoZSBwYXJlbnQgQW5pbWF0b3JTZXQgd2FzIGNhbmNlbGVkLCB0aGVuIGRvbid0IHN0YXJ0IGFueSBkZXBlbmRlbnQgYW5pbXMKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBEZXBlbmRlbmN5IGRlcGVuZGVuY3lUb1JlbW92ZSA9IG51bGw7CisgICAgICAgICAgICBmb3IgKERlcGVuZGVuY3kgZGVwZW5kZW5jeSA6IG1Ob2RlLnRtcERlcGVuZGVuY2llcykgeworICAgICAgICAgICAgICAgIGlmIChkZXBlbmRlbmN5LnJ1bGUgPT0gbVJ1bGUgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlcGVuZGVuY3kubm9kZS5hbmltYXRpb24gPT0gZGVwZW5kZW5jeUFuaW1hdGlvbikgeworICAgICAgICAgICAgICAgICAgICAvLyBydWxlIGZpcmVkIC0gcmVtb3ZlIHRoZSBkZXBlbmRlbmN5IGFuZCBsaXN0ZW5lciBhbmQgY2hlY2sgdG8KKyAgICAgICAgICAgICAgICAgICAgLy8gc2VlIHdoZXRoZXIgaXQncyB0aW1lIHRvIHN0YXJ0IHRoZSBhbmltYXRpb24KKyAgICAgICAgICAgICAgICAgICAgZGVwZW5kZW5jeVRvUmVtb3ZlID0gZGVwZW5kZW5jeTsKKyAgICAgICAgICAgICAgICAgICAgZGVwZW5kZW5jeUFuaW1hdGlvbi5yZW1vdmVMaXN0ZW5lcih0aGlzKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgbU5vZGUudG1wRGVwZW5kZW5jaWVzLnJlbW92ZShkZXBlbmRlbmN5VG9SZW1vdmUpOworICAgICAgICAgICAgaWYgKG1Ob2RlLnRtcERlcGVuZGVuY2llcy5zaXplKCkgPT0gMCkgeworICAgICAgICAgICAgICAgIC8vIGFsbCBkZXBlbmRlbmNpZXMgc2F0aXNmaWVkOiBzdGFydCB0aGUgYW5pbWF0aW9uCisgICAgICAgICAgICAgICAgbU5vZGUuYW5pbWF0aW9uLnN0YXJ0KCk7CisgICAgICAgICAgICAgICAgbUFuaW1hdG9yU2V0Lm1QbGF5aW5nU2V0LmFkZChtTm9kZS5hbmltYXRpb24pOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICB9CisKKyAgICBwcml2YXRlIGNsYXNzIEFuaW1hdG9yU2V0TGlzdGVuZXIgaW1wbGVtZW50cyBBbmltYXRvckxpc3RlbmVyIHsKKworICAgICAgICBwcml2YXRlIEFuaW1hdG9yU2V0IG1BbmltYXRvclNldDsKKworICAgICAgICBBbmltYXRvclNldExpc3RlbmVyKEFuaW1hdG9yU2V0IGFuaW1hdG9yU2V0KSB7CisgICAgICAgICAgICBtQW5pbWF0b3JTZXQgPSBhbmltYXRvclNldDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIG9uQW5pbWF0aW9uQ2FuY2VsKEFuaW1hdG9yIGFuaW1hdGlvbikgeworICAgICAgICAgICAgaWYgKG1QbGF5aW5nU2V0LnNpemUoKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgaWYgKG1MaXN0ZW5lcnMgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBmb3IgKEFuaW1hdG9yTGlzdGVuZXIgbGlzdGVuZXIgOiBtTGlzdGVuZXJzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBsaXN0ZW5lci5vbkFuaW1hdGlvbkNhbmNlbChtQW5pbWF0b3JTZXQpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisgICAgICAgIHB1YmxpYyB2b2lkIG9uQW5pbWF0aW9uRW5kKEFuaW1hdG9yIGFuaW1hdGlvbikgeworICAgICAgICAgICAgYW5pbWF0aW9uLnJlbW92ZUxpc3RlbmVyKHRoaXMpOworICAgICAgICAgICAgbVBsYXlpbmdTZXQucmVtb3ZlKGFuaW1hdGlvbik7CisgICAgICAgICAgICBOb2RlIGFuaW1Ob2RlID0gbUFuaW1hdG9yU2V0Lm1Ob2RlTWFwLmdldChhbmltYXRpb24pOworICAgICAgICAgICAgYW5pbU5vZGUuZG9uZSA9IHRydWU7CisgICAgICAgICAgICBBcnJheUxpc3Q8Tm9kZT4gc29ydGVkTm9kZXMgPSBtQW5pbWF0b3JTZXQubVNvcnRlZE5vZGVzOworICAgICAgICAgICAgYm9vbGVhbiBhbGxEb25lID0gdHJ1ZTsKKyAgICAgICAgICAgIGZvciAoTm9kZSBub2RlIDogc29ydGVkTm9kZXMpIHsKKyAgICAgICAgICAgICAgICBpZiAoIW5vZGUuZG9uZSkgeworICAgICAgICAgICAgICAgICAgICBhbGxEb25lID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChhbGxEb25lKSB7CisgICAgICAgICAgICAgICAgLy8gSWYgdGhpcyB3YXMgdGhlIGxhc3QgY2hpbGQgYW5pbWF0aW9uIHRvIGVuZCwgdGhlbiBub3RpZnkgbGlzdGVuZXJzIHRoYXQgdGhpcworICAgICAgICAgICAgICAgIC8vIEFuaW1hdG9yU2V0IGhhcyBlbmRlZAorICAgICAgICAgICAgICAgIGlmIChtTGlzdGVuZXJzICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgQXJyYXlMaXN0PEFuaW1hdG9yTGlzdGVuZXI+IHRtcExpc3RlbmVycyA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEFycmF5TGlzdDxBbmltYXRvckxpc3RlbmVyPikgbUxpc3RlbmVycy5jbG9uZSgpOworICAgICAgICAgICAgICAgICAgICBmb3IgKEFuaW1hdG9yTGlzdGVuZXIgbGlzdGVuZXIgOiB0bXBMaXN0ZW5lcnMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxpc3RlbmVyLm9uQW5pbWF0aW9uRW5kKG1BbmltYXRvclNldCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBOb3RoaW5nIHRvIGRvCisgICAgICAgIHB1YmxpYyB2b2lkIG9uQW5pbWF0aW9uUmVwZWF0KEFuaW1hdG9yIGFuaW1hdGlvbikgeworICAgICAgICB9CisKKyAgICAgICAgLy8gTm90aGluZyB0byBkbworICAgICAgICBwdWJsaWMgdm9pZCBvbkFuaW1hdGlvblN0YXJ0KEFuaW1hdG9yIGFuaW1hdGlvbikgeworICAgICAgICB9CisKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGlzIG1ldGhvZCBzb3J0cyB0aGUgY3VycmVudCBzZXQgb2Ygbm9kZXMsIGlmIG5lZWRlZC4gVGhlIHNvcnQgaXMgYSBzaW1wbGUKKyAgICAgKiBEZXBlbmRlbmN5R3JhcGggc29ydCwgd2hpY2ggZ29lcyBsaWtlIHRoaXM6CisgICAgICogLSBBbGwgbm9kZXMgd2l0aG91dCBkZXBlbmRlbmNpZXMgYmVjb21lICdyb290cycKKyAgICAgKiAtIHdoaWxlIHJvb3RzIGxpc3QgaXMgbm90IG51bGwKKyAgICAgKiAtICAgZm9yIGVhY2ggcm9vdCByCisgICAgICogLSAgICAgYWRkIHIgdG8gc29ydGVkIGxpc3QKKyAgICAgKiAtICAgICByZW1vdmUgciBhcyBhIGRlcGVuZGVuY3kgZnJvbSBhbnkgb3RoZXIgbm9kZQorICAgICAqIC0gICBhbnkgbm9kZXMgd2l0aCBubyBkZXBlbmRlbmNpZXMgYXJlIGFkZGVkIHRvIHRoZSByb290cyBsaXN0CisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIHNvcnROb2RlcygpIHsKKyAgICAgICAgaWYgKG1OZWVkc1NvcnQpIHsKKyAgICAgICAgICAgIG1Tb3J0ZWROb2Rlcy5jbGVhcigpOworICAgICAgICAgICAgQXJyYXlMaXN0PE5vZGU+IHJvb3RzID0gbmV3IEFycmF5TGlzdDxOb2RlPigpOworICAgICAgICAgICAgZm9yIChOb2RlIG5vZGUgOiBtTm9kZXMpIHsKKyAgICAgICAgICAgICAgICBpZiAobm9kZS5kZXBlbmRlbmNpZXMgPT0gbnVsbCB8fCBub2RlLmRlcGVuZGVuY2llcy5zaXplKCkgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICByb290cy5hZGQobm9kZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgQXJyYXlMaXN0PE5vZGU+IHRtcFJvb3RzID0gbmV3IEFycmF5TGlzdDxOb2RlPigpOworICAgICAgICAgICAgd2hpbGUgKHJvb3RzLnNpemUoKSA+IDApIHsKKyAgICAgICAgICAgICAgICBmb3IgKE5vZGUgcm9vdCA6IHJvb3RzKSB7CisgICAgICAgICAgICAgICAgICAgIG1Tb3J0ZWROb2Rlcy5hZGQocm9vdCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChyb290Lm5vZGVEZXBlbmRlbnRzICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoTm9kZSBub2RlIDogcm9vdC5ub2RlRGVwZW5kZW50cykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUubm9kZURlcGVuZGVuY2llcy5yZW1vdmUocm9vdCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5vZGUubm9kZURlcGVuZGVuY2llcy5zaXplKCkgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bXBSb290cy5hZGQobm9kZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJvb3RzLmNsZWFyKCk7CisgICAgICAgICAgICAgICAgcm9vdHMuYWRkQWxsKHRtcFJvb3RzKTsKKyAgICAgICAgICAgICAgICB0bXBSb290cy5jbGVhcigpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbU5lZWRzU29ydCA9IGZhbHNlOworICAgICAgICAgICAgaWYgKG1Tb3J0ZWROb2Rlcy5zaXplKCkgIT0gbU5vZGVzLnNpemUoKSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkNpcmN1bGFyIGRlcGVuZGVuY2llcyBjYW5ub3QgZXhpc3QiCisgICAgICAgICAgICAgICAgICAgICAgICArICIgaW4gQW5pbWF0b3JTZXQiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIERvZXNuJ3QgbmVlZCBzb3J0aW5nLCBidXQgc3RpbGwgbmVlZCB0byBhZGQgaW4gdGhlIG5vZGVEZXBlbmRlbmNpZXMgbGlzdAorICAgICAgICAgICAgLy8gYmVjYXVzZSB0aGVzZSBnZXQgcmVtb3ZlZCBhcyB0aGUgZXZlbnQgbGlzdGVuZXJzIGZpcmUgYW5kIHRoZSBkZXBlbmRlbmNpZXMKKyAgICAgICAgICAgIC8vIGFyZSBzYXRpc2ZpZWQKKyAgICAgICAgICAgIGZvciAoTm9kZSBub2RlIDogbU5vZGVzKSB7CisgICAgICAgICAgICAgICAgaWYgKG5vZGUuZGVwZW5kZW5jaWVzICE9IG51bGwgJiYgbm9kZS5kZXBlbmRlbmNpZXMuc2l6ZSgpID4gMCkgeworICAgICAgICAgICAgICAgICAgICBmb3IgKERlcGVuZGVuY3kgZGVwZW5kZW5jeSA6IG5vZGUuZGVwZW5kZW5jaWVzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobm9kZS5ub2RlRGVwZW5kZW5jaWVzID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBub2RlLm5vZGVEZXBlbmRlbmNpZXMgPSBuZXcgQXJyYXlMaXN0PE5vZGU+KCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIW5vZGUubm9kZURlcGVuZGVuY2llcy5jb250YWlucyhkZXBlbmRlbmN5Lm5vZGUpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9kZS5ub2RlRGVwZW5kZW5jaWVzLmFkZChkZXBlbmRlbmN5Lm5vZGUpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG5vZGUuZG9uZSA9IGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogRGVwZW5kZW5jeSBob2xkcyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgbm9kZSB0aGF0IHNvbWUgb3RoZXIgbm9kZSBpcworICAgICAqIGRlcGVuZGVudCB1cG9uIGFuZCB0aGUgbmF0dXJlIG9mIHRoYXQgZGVwZW5kZW5jeS4KKyAgICAgKgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIERlcGVuZGVuY3kgeworICAgICAgICBzdGF0aWMgZmluYWwgaW50IFdJVEggPSAwOyAvLyBkZXBlbmRlbnQgbm9kZSBtdXN0IHN0YXJ0IHdpdGggdGhpcyBkZXBlbmRlbmN5IG5vZGUKKyAgICAgICAgc3RhdGljIGZpbmFsIGludCBBRlRFUiA9IDE7IC8vIGRlcGVuZGVudCBub2RlIG11c3Qgc3RhcnQgd2hlbiB0aGlzIGRlcGVuZGVuY3kgbm9kZSBmaW5pc2hlcworCisgICAgICAgIC8vIFRoZSBub2RlIHRoYXQgdGhlIG90aGVyIG5vZGUgd2l0aCB0aGlzIERlcGVuZGVuY3kgaXMgZGVwZW5kZW50IHVwb24KKyAgICAgICAgcHVibGljIE5vZGUgbm9kZTsKKworICAgICAgICAvLyBUaGUgbmF0dXJlIG9mIHRoZSBkZXBlbmRlbmN5IChXSVRIIG9yIEFGVEVSKQorICAgICAgICBwdWJsaWMgaW50IHJ1bGU7CisKKyAgICAgICAgcHVibGljIERlcGVuZGVuY3koTm9kZSBub2RlLCBpbnQgcnVsZSkgeworICAgICAgICAgICAgdGhpcy5ub2RlID0gbm9kZTsKKyAgICAgICAgICAgIHRoaXMucnVsZSA9IHJ1bGU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBIE5vZGUgaXMgYW4gZW1ib2RpbWVudCBvZiBib3RoIHRoZSBBbmltYXRvciB0aGF0IGl0IHdyYXBzIGFzIHdlbGwgYXMKKyAgICAgKiBhbnkgZGVwZW5kZW5jaWVzIHRoYXQgYXJlIGFzc29jaWF0ZWQgd2l0aCB0aGF0IEFuaW1hdGlvbi4gVGhpcyBpbmNsdWRlcworICAgICAqIGJvdGggZGVwZW5kZW5jaWVzIHVwb24gb3RoZXIgbm9kZXMgKGluIHRoZSBkZXBlbmRlbmNpZXMgbGlzdCkgYXMKKyAgICAgKiB3ZWxsIGFzIGRlcGVuZGVuY2llcyBvZiBvdGhlciBub2RlcyB1cG9uIHRoaXMgKGluIHRoZSBub2RlRGVwZW5kZW50cyBsaXN0KS4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBOb2RlIGltcGxlbWVudHMgQ2xvbmVhYmxlIHsKKyAgICAgICAgcHVibGljIEFuaW1hdG9yIGFuaW1hdGlvbjsKKworICAgICAgICAvKioKKyAgICAgICAgICogIFRoZXNlIGFyZSB0aGUgZGVwZW5kZW5jaWVzIHRoYXQgdGhpcyBub2RlJ3MgYW5pbWF0aW9uIGhhcyBvbiBvdGhlcgorICAgICAgICAgKiAgbm9kZXMuIEZvciBleGFtcGxlLCBpZiB0aGlzIG5vZGUncyBhbmltYXRpb24gc2hvdWxkIGJlZ2luIHdpdGggc29tZQorICAgICAgICAgKiAgb3RoZXIgYW5pbWF0aW9uIGVuZHMsIHRoZW4gdGhlcmUgd2lsbCBiZSBhbiBpdGVtIGluIHRoaXMgbm9kZSdzCisgICAgICAgICAqICBkZXBlbmRlbmNpZXMgbGlzdCBmb3IgdGhhdCBvdGhlciBhbmltYXRpb24ncyBub2RlLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIEFycmF5TGlzdDxEZXBlbmRlbmN5PiBkZXBlbmRlbmNpZXMgPSBudWxsOworCisgICAgICAgIC8qKgorICAgICAgICAgKiB0bXBEZXBlbmRlbmNpZXMgaXMgYSBydW50aW1lIGRldGFpbC4gV2UgdXNlIHRoZSBkZXBlbmRlbmNpZXMgbGlzdCBmb3Igc29ydGluZy4KKyAgICAgICAgICogQnV0IHdlIGFsc28gdXNlIHRoZSBsaXN0IHRvIGtlZXAgdHJhY2sgb2Ygd2hlbiBtdWx0aXBsZSBkZXBlbmRlbmNpZXMgYXJlIHNhdGlzZmllZCwKKyAgICAgICAgICogYnV0IHJlbW92aW5nIGVhY2ggZGVwZW5kZW5jeSBhcyBpdCBpcyBzYXRpc2ZpZWQuIFdlIGRvIG5vdCB3YW50IHRvIHJlbW92ZQorICAgICAgICAgKiB0aGUgZGVwZW5kZW5jeSBpdHNlbGYgZnJvbSB0aGUgbGlzdCwgYmVjYXVzZSB3ZSBuZWVkIHRvIHJldGFpbiB0aGF0IGluZm9ybWF0aW9uCisgICAgICAgICAqIGlmIHRoZSBBbmltYXRvclNldCBpcyBsYXVuY2hlZCBpbiB0aGUgZnV0dXJlLiBTbyB3ZSBjcmVhdGUgYSBjb3B5IG9mIHRoZSBkZXBlbmRlbmN5CisgICAgICAgICAqIGxpc3Qgd2hlbiB0aGUgQW5pbWF0b3JTZXQgc3RhcnRzIGFuZCB1c2UgdGhpcyB0bXBEZXBlbmRlbmNpZXMgbGlzdCB0byB0cmFjayB0aGUKKyAgICAgICAgICogbGlzdCBvZiBzYXRpc2ZpZWQgZGVwZW5kZW5jaWVzLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIEFycmF5TGlzdDxEZXBlbmRlbmN5PiB0bXBEZXBlbmRlbmNpZXMgPSBudWxsOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBub2RlRGVwZW5kZW5jaWVzIGlzIGp1c3QgYSBsaXN0IG9mIHRoZSBub2RlcyB0aGF0IHRoaXMgTm9kZSBpcyBkZXBlbmRlbnQgdXBvbi4KKyAgICAgICAgICogVGhpcyBpbmZvcm1hdGlvbiBpcyB1c2VkIGluIHNvcnROb2RlcygpLCB0byBkZXRlcm1pbmUgd2hlbiBhIG5vZGUgaXMgYSByb290LgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIEFycmF5TGlzdDxOb2RlPiBub2RlRGVwZW5kZW5jaWVzID0gbnVsbDsKKworICAgICAgICAvKioKKyAgICAgICAgICogbm9kZURlcGRlbmRlbnRzIGlzIHRoZSBsaXN0IG9mIG5vZGVzIHRoYXQgaGF2ZSB0aGlzIG5vZGUgYXMgYSBkZXBlbmRlbmN5LiBUaGlzCisgICAgICAgICAqIGlzIGEgdXRpbGl0eSBmaWVsZCB1c2VkIGluIHNvcnROb2RlcyB0byBmYWNpbGl0YXRlIHJlbW92aW5nIHRoaXMgbm9kZSBhcyBhCisgICAgICAgICAqIGRlcGVuZGVuY3kgd2hlbiBpdCBpcyBhIHJvb3Qgbm9kZS4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBBcnJheUxpc3Q8Tm9kZT4gbm9kZURlcGVuZGVudHMgPSBudWxsOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBGbGFnIGluZGljYXRpbmcgd2hldGhlciB0aGUgYW5pbWF0aW9uIGluIHRoaXMgbm9kZSBpcyBmaW5pc2hlZC4gVGhpcyBmbGFnCisgICAgICAgICAqIGlzIHVzZWQgYnkgQW5pbWF0b3JTZXQgdG8gY2hlY2ssIGFzIGVhY2ggYW5pbWF0aW9uIGVuZHMsIHdoZXRoZXIgYWxsIGNoaWxkIGFuaW1hdGlvbnMKKyAgICAgICAgICogYXJlIGRvbmUgYW5kIGl0J3MgdGltZSB0byBzZW5kIG91dCBhbiBlbmQgZXZlbnQgZm9yIHRoZSBlbnRpcmUgQW5pbWF0b3JTZXQuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgYm9vbGVhbiBkb25lID0gZmFsc2U7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIENvbnN0cnVjdHMgdGhlIE5vZGUgd2l0aCB0aGUgYW5pbWF0aW9uIHRoYXQgaXQgZW5jYXBzdWxhdGVzLiBBIE5vZGUgaGFzIG5vCisgICAgICAgICAqIGRlcGVuZGVuY2llcyBieSBkZWZhdWx0OyBkZXBlbmRlbmNpZXMgYXJlIGFkZGVkIHZpYSB0aGUgYWRkRGVwZW5kZW5jeSgpCisgICAgICAgICAqIG1ldGhvZC4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIGFuaW1hdGlvbiBUaGUgYW5pbWF0aW9uIHRoYXQgdGhlIE5vZGUgZW5jYXBzdWxhdGVzLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIE5vZGUoQW5pbWF0b3IgYW5pbWF0aW9uKSB7CisgICAgICAgICAgICB0aGlzLmFuaW1hdGlvbiA9IGFuaW1hdGlvbjsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBBZGQgYSBkZXBlbmRlbmN5IHRvIHRoaXMgTm9kZS4gVGhlIGRlcGVuZGVuY3kgaW5jbHVkZXMgaW5mb3JtYXRpb24gYWJvdXQgdGhlCisgICAgICAgICAqIG5vZGUgdGhhdCB0aGlzIG5vZGUgaXMgZGVwZW5kZW5jeSB1cG9uIGFuZCB0aGUgbmF0dXJlIG9mIHRoZSBkZXBlbmRlbmN5LgorICAgICAgICAgKiBAcGFyYW0gZGVwZW5kZW5jeQorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgYWRkRGVwZW5kZW5jeShEZXBlbmRlbmN5IGRlcGVuZGVuY3kpIHsKKyAgICAgICAgICAgIGlmIChkZXBlbmRlbmNpZXMgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGRlcGVuZGVuY2llcyA9IG5ldyBBcnJheUxpc3Q8RGVwZW5kZW5jeT4oKTsKKyAgICAgICAgICAgICAgICBub2RlRGVwZW5kZW5jaWVzID0gbmV3IEFycmF5TGlzdDxOb2RlPigpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZGVwZW5kZW5jaWVzLmFkZChkZXBlbmRlbmN5KTsKKyAgICAgICAgICAgIGlmICghbm9kZURlcGVuZGVuY2llcy5jb250YWlucyhkZXBlbmRlbmN5Lm5vZGUpKSB7CisgICAgICAgICAgICAgICAgbm9kZURlcGVuZGVuY2llcy5hZGQoZGVwZW5kZW5jeS5ub2RlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIE5vZGUgZGVwZW5kZW5jeU5vZGUgPSBkZXBlbmRlbmN5Lm5vZGU7CisgICAgICAgICAgICBpZiAoZGVwZW5kZW5jeU5vZGUubm9kZURlcGVuZGVudHMgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGRlcGVuZGVuY3lOb2RlLm5vZGVEZXBlbmRlbnRzID0gbmV3IEFycmF5TGlzdDxOb2RlPigpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZGVwZW5kZW5jeU5vZGUubm9kZURlcGVuZGVudHMuYWRkKHRoaXMpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBOb2RlIGNsb25lKCkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBOb2RlIG5vZGUgPSAoTm9kZSkgc3VwZXIuY2xvbmUoKTsKKyAgICAgICAgICAgICAgICBub2RlLmFuaW1hdGlvbiA9IChBbmltYXRvcikgYW5pbWF0aW9uLmNsb25lKCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5vZGU7CisgICAgICAgICAgICB9IGNhdGNoIChDbG9uZU5vdFN1cHBvcnRlZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uRXJyb3IoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSA8Y29kZT5CdWlsZGVyPC9jb2RlPiBvYmplY3QgaXMgYSB1dGlsaXR5IGNsYXNzIHRvIGZhY2lsaXRhdGUgYWRkaW5nIGFuaW1hdGlvbnMgdG8gYQorICAgICAqIDxjb2RlPkFuaW1hdG9yU2V0PC9jb2RlPiBhbG9uZyB3aXRoIHRoZSByZWxhdGlvbnNoaXBzIGJldHdlZW4gdGhlIHZhcmlvdXMgYW5pbWF0aW9ucy4gVGhlCisgICAgICogaW50ZW50aW9uIG9mIHRoZSA8Y29kZT5CdWlsZGVyPC9jb2RlPiBtZXRob2RzLCBhbG9uZyB3aXRoIHRoZSB7QGxpbmsKKyAgICAgKiBBbmltYXRvclNldCNwbGF5KEFuaW1hdG9yKSBwbGF5KCl9IG1ldGhvZCBvZiA8Y29kZT5BbmltYXRvclNldDwvY29kZT4gaXMgdG8gbWFrZSBpdCBwb3NzaWJsZSB0bworICAgICAqIGV4cHJlc3MgdGhlIGRlcGVuZGVuY3kgcmVsYXRpb25zaGlwcyBvZiBhbmltYXRpb25zIGluIGEgbmF0dXJhbCB3YXkuIERldmVsb3BlcnMgY2FuIGFsc28gdXNlCisgICAgICogdGhlIHtAbGluayBBbmltYXRvclNldCNwbGF5VG9nZXRoZXIoQW5pbWF0b3JbXSkgcGxheVRvZ2V0aGVyKCl9IGFuZCB7QGxpbmsKKyAgICAgKiBBbmltYXRvclNldCNwbGF5U2VxdWVudGlhbGx5KEFuaW1hdG9yW10pIHBsYXlTZXF1ZW50aWFsbHkoKX0gbWV0aG9kcyBpZiB0aGVzZSBzdWl0IHRoZSBuZWVkLAorICAgICAqIGJ1dCBpdCBtaWdodCBiZSBlYXNpZXIgaW4gc29tZSBzaXR1YXRpb25zIHRvIGV4cHJlc3MgdGhlIEFuaW1hdG9yU2V0IG9mIGFuaW1hdGlvbnMgaW4gcGFpcnMuCisgICAgICogPHAvPgorICAgICAqIDxwPlRoZSA8Y29kZT5CdWlsZGVyPC9jb2RlPiBvYmplY3QgY2Fubm90IGJlIGNvbnN0cnVjdGVkIGRpcmVjdGx5LCBidXQgaXMgcmF0aGVyIGNvbnN0cnVjdGVkCisgICAgICogaW50ZXJuYWxseSB2aWEgYSBjYWxsIHRvIHtAbGluayBBbmltYXRvclNldCNwbGF5KEFuaW1hdG9yKX0uPC9wPgorICAgICAqIDxwLz4KKyAgICAgKiA8cD5Gb3IgZXhhbXBsZSwgdGhpcyBzZXRzIHVwIGEgQW5pbWF0b3JTZXQgdG8gcGxheSBhbmltMSBhbmQgYW5pbTIgYXQgdGhlIHNhbWUgdGltZSwgYW5pbTMgdG8KKyAgICAgKiBwbGF5IHdoZW4gYW5pbTIgZmluaXNoZXMsIGFuZCBhbmltNCB0byBwbGF5IHdoZW4gYW5pbTMgZmluaXNoZXM6PC9wPgorICAgICAqIDxwcmU+CisgICAgICogICAgIEFuaW1hdG9yU2V0IHMgPSBuZXcgQW5pbWF0b3JTZXQoKTsKKyAgICAgKiAgICAgcy5wbGF5KGFuaW0xKS53aXRoKGFuaW0yKTsKKyAgICAgKiAgICAgcy5wbGF5KGFuaW0yKS5iZWZvcmUoYW5pbTMpOworICAgICAqICAgICBzLnBsYXkoYW5pbTQpLmFmdGVyKGFuaW0zKTsKKyAgICAgKiA8L3ByZT4KKyAgICAgKiA8cC8+CisgICAgICogPHA+Tm90ZSBpbiB0aGUgZXhhbXBsZSB0aGF0IGJvdGgge0BsaW5rIEJ1aWxkZXIjYmVmb3JlKEFuaW1hdG9yKX0gYW5kIHtAbGluaworICAgICAqIEJ1aWxkZXIjYWZ0ZXIoQW5pbWF0b3IpfSBhcmUgdXNlZC4gVGhlc2UgYXJlIGp1c3QgZGlmZmVyZW50IHdheXMgb2YgZXhwcmVzc2luZyB0aGUgc2FtZQorICAgICAqIHJlbGF0aW9uc2hpcCBhbmQgYXJlIHByb3ZpZGVkIHRvIG1ha2UgaXQgZWFzaWVyIHRvIHNheSB0aGluZ3MgaW4gYSB3YXkgdGhhdCBpcyBtb3JlIG5hdHVyYWwsCisgICAgICogZGVwZW5kaW5nIG9uIHRoZSBzaXR1YXRpb24uPC9wPgorICAgICAqIDxwLz4KKyAgICAgKiA8cD5JdCBpcyBwb3NzaWJsZSB0byBtYWtlIHNldmVyYWwgY2FsbHMgaW50byB0aGUgc2FtZSA8Y29kZT5CdWlsZGVyPC9jb2RlPiBvYmplY3QgdG8gZXhwcmVzcworICAgICAqIG11bHRpcGxlIHJlbGF0aW9uc2hpcHMuIEhvd2V2ZXIsIG5vdGUgdGhhdCBpdCBpcyBvbmx5IHRoZSBhbmltYXRpb24gcGFzc2VkIGludG8gdGhlIGluaXRpYWwKKyAgICAgKiB7QGxpbmsgQW5pbWF0b3JTZXQjcGxheShBbmltYXRvcil9IG1ldGhvZCB0aGF0IGlzIHRoZSBkZXBlbmRlbmN5IGluIGFueSBvZiB0aGUgc3VjY2Vzc2l2ZQorICAgICAqIGNhbGxzIHRvIHRoZSA8Y29kZT5CdWlsZGVyPC9jb2RlPiBvYmplY3QuIEZvciBleGFtcGxlLCB0aGUgZm9sbG93aW5nIGNvZGUgc3RhcnRzIGJvdGggYW5pbTIKKyAgICAgKiBhbmQgYW5pbTMgd2hlbiBhbmltMSBlbmRzOyB0aGVyZSBpcyBubyBkaXJlY3QgZGVwZW5kZW5jeSByZWxhdGlvbnNoaXAgYmV0d2VlbiBhbmltMiBhbmQKKyAgICAgKiBhbmltMzoKKyAgICAgKiA8cHJlPgorICAgICAqICAgQW5pbWF0b3JTZXQgcyA9IG5ldyBBbmltYXRvclNldCgpOworICAgICAqICAgcy5wbGF5KGFuaW0xKS5iZWZvcmUoYW5pbTIpLmJlZm9yZShhbmltMyk7CisgICAgICogPC9wcmU+CisgICAgICogSWYgdGhlIGRlc2lyZWQgcmVzdWx0IGlzIHRvIHBsYXkgYW5pbTEgdGhlbiBhbmltMiB0aGVuIGFuaW0zLCB0aGlzIGNvZGUgZXhwcmVzc2VzIHRoZQorICAgICAqIHJlbGF0aW9uc2hpcCBjb3JyZWN0bHk6PC9wPgorICAgICAqIDxwcmU+CisgICAgICogICBBbmltYXRvclNldCBzID0gbmV3IEFuaW1hdG9yU2V0KCk7CisgICAgICogICBzLnBsYXkoYW5pbTEpLmJlZm9yZShhbmltMik7CisgICAgICogICBzLnBsYXkoYW5pbTIpLmJlZm9yZShhbmltMyk7CisgICAgICogPC9wcmU+CisgICAgICogPHAvPgorICAgICAqIDxwPk5vdGUgdGhhdCBpdCBpcyBwb3NzaWJsZSB0byBleHByZXNzIHJlbGF0aW9uc2hpcHMgdGhhdCBjYW5ub3QgYmUgcmVzb2x2ZWQgYW5kIHdpbGwgbm90CisgICAgICogcmVzdWx0IGluIHNlbnNpYmxlIHJlc3VsdHMuIEZvciBleGFtcGxlLCA8Y29kZT5wbGF5KGFuaW0xKS5hZnRlcihhbmltMSk8L2NvZGU+IG1ha2VzIG5vCisgICAgICogc2Vuc2UuIEluIGdlbmVyYWwsIGNpcmN1bGFyIGRlcGVuZGVuY2llcyBsaWtlIHRoaXMgb25lIChvciBtb3JlIGluZGlyZWN0IG9uZXMgd2hlcmUgYSBkZXBlbmRzCisgICAgICogb24gYiwgd2hpY2ggZGVwZW5kcyBvbiBjLCB3aGljaCBkZXBlbmRzIG9uIGEpIHNob3VsZCBiZSBhdm9pZGVkLiBPbmx5IGNyZWF0ZSBBbmltYXRvclNldHMKKyAgICAgKiB0aGF0IGNhbiBib2lsIGRvd24gdG8gYSBzaW1wbGUsIG9uZS13YXkgcmVsYXRpb25zaGlwIG9mIGFuaW1hdGlvbnMgc3RhcnRpbmcgd2l0aCwgYmVmb3JlLCBhbmQKKyAgICAgKiBhZnRlciBvdGhlciwgZGlmZmVyZW50LCBhbmltYXRpb25zLjwvcD4KKyAgICAgKi8KKyAgICBwdWJsaWMgY2xhc3MgQnVpbGRlciB7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoaXMgdHJhY2tzIHRoZSBjdXJyZW50IG5vZGUgYmVpbmcgcHJvY2Vzc2VkLiBJdCBpcyBzdXBwbGllZCB0byB0aGUgcGxheSgpIG1ldGhvZAorICAgICAgICAgKiBvZiBBbmltYXRvclNldCBhbmQgcGFzc2VkIGludG8gdGhlIGNvbnN0cnVjdG9yIG9mIEJ1aWxkZXIuCisgICAgICAgICAqLworICAgICAgICBwcml2YXRlIE5vZGUgbUN1cnJlbnROb2RlOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBwYWNrYWdlLXByaXZhdGUgY29uc3RydWN0b3IuIEJ1aWxkZXJzIGFyZSBvbmx5IGNvbnN0cnVjdGVkIGJ5IEFuaW1hdG9yU2V0LCB3aGVuIHRoZQorICAgICAgICAgKiBwbGF5KCkgbWV0aG9kIGlzIGNhbGxlZC4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIGFuaW0gVGhlIGFuaW1hdGlvbiB0aGF0IGlzIHRoZSBkZXBlbmRlbmN5IGZvciB0aGUgb3RoZXIgYW5pbWF0aW9ucyBwYXNzZWQgaW50bworICAgICAgICAgKiB0aGUgb3RoZXIgbWV0aG9kcyBvZiB0aGlzIEJ1aWxkZXIgb2JqZWN0LgorICAgICAgICAgKi8KKyAgICAgICAgQnVpbGRlcihBbmltYXRvciBhbmltKSB7CisgICAgICAgICAgICBtQ3VycmVudE5vZGUgPSBtTm9kZU1hcC5nZXQoYW5pbSk7CisgICAgICAgICAgICBpZiAobUN1cnJlbnROb2RlID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBtQ3VycmVudE5vZGUgPSBuZXcgTm9kZShhbmltKTsKKyAgICAgICAgICAgICAgICBtTm9kZU1hcC5wdXQoYW5pbSwgbUN1cnJlbnROb2RlKTsKKyAgICAgICAgICAgICAgICBtTm9kZXMuYWRkKG1DdXJyZW50Tm9kZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogU2V0cyB1cCB0aGUgZ2l2ZW4gYW5pbWF0aW9uIHRvIHBsYXkgYXQgdGhlIHNhbWUgdGltZSBhcyB0aGUgYW5pbWF0aW9uIHN1cHBsaWVkIGluIHRoZQorICAgICAgICAgKiB7QGxpbmsgQW5pbWF0b3JTZXQjcGxheShBbmltYXRvcil9IGNhbGwgdGhhdCBjcmVhdGVkIHRoaXMgPGNvZGU+QnVpbGRlcjwvY29kZT4gb2JqZWN0LgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gYW5pbSBUaGUgYW5pbWF0aW9uIHRoYXQgd2lsbCBwbGF5IHdoZW4gdGhlIGFuaW1hdGlvbiBzdXBwbGllZCB0byB0aGUKKyAgICAgICAgICoge0BsaW5rIEFuaW1hdG9yU2V0I3BsYXkoQW5pbWF0b3IpfSBtZXRob2Qgc3RhcnRzLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgd2l0aChBbmltYXRvciBhbmltKSB7CisgICAgICAgICAgICBOb2RlIG5vZGUgPSBtTm9kZU1hcC5nZXQoYW5pbSk7CisgICAgICAgICAgICBpZiAobm9kZSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgbm9kZSA9IG5ldyBOb2RlKGFuaW0pOworICAgICAgICAgICAgICAgIG1Ob2RlTWFwLnB1dChhbmltLCBub2RlKTsKKyAgICAgICAgICAgICAgICBtTm9kZXMuYWRkKG5vZGUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgRGVwZW5kZW5jeSBkZXBlbmRlbmN5ID0gbmV3IERlcGVuZGVuY3kobUN1cnJlbnROb2RlLCBEZXBlbmRlbmN5LldJVEgpOworICAgICAgICAgICAgbm9kZS5hZGREZXBlbmRlbmN5KGRlcGVuZGVuY3kpOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFNldHMgdXAgdGhlIGdpdmVuIGFuaW1hdGlvbiB0byBwbGF5IHdoZW4gdGhlIGFuaW1hdGlvbiBzdXBwbGllZCBpbiB0aGUKKyAgICAgICAgICoge0BsaW5rIEFuaW1hdG9yU2V0I3BsYXkoQW5pbWF0b3IpfSBjYWxsIHRoYXQgY3JlYXRlZCB0aGlzIDxjb2RlPkJ1aWxkZXI8L2NvZGU+IG9iamVjdAorICAgICAgICAgKiBlbmRzLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gYW5pbSBUaGUgYW5pbWF0aW9uIHRoYXQgd2lsbCBwbGF5IHdoZW4gdGhlIGFuaW1hdGlvbiBzdXBwbGllZCB0byB0aGUKKyAgICAgICAgICoge0BsaW5rIEFuaW1hdG9yU2V0I3BsYXkoQW5pbWF0b3IpfSBtZXRob2QgZW5kcy4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2b2lkIGJlZm9yZShBbmltYXRvciBhbmltKSB7CisgICAgICAgICAgICBOb2RlIG5vZGUgPSBtTm9kZU1hcC5nZXQoYW5pbSk7CisgICAgICAgICAgICBpZiAobm9kZSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgbm9kZSA9IG5ldyBOb2RlKGFuaW0pOworICAgICAgICAgICAgICAgIG1Ob2RlTWFwLnB1dChhbmltLCBub2RlKTsKKyAgICAgICAgICAgICAgICBtTm9kZXMuYWRkKG5vZGUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgRGVwZW5kZW5jeSBkZXBlbmRlbmN5ID0gbmV3IERlcGVuZGVuY3kobUN1cnJlbnROb2RlLCBEZXBlbmRlbmN5LkFGVEVSKTsKKyAgICAgICAgICAgIG5vZGUuYWRkRGVwZW5kZW5jeShkZXBlbmRlbmN5KTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBTZXRzIHVwIHRoZSBnaXZlbiBhbmltYXRpb24gdG8gcGxheSB3aGVuIHRoZSBhbmltYXRpb24gc3VwcGxpZWQgaW4gdGhlCisgICAgICAgICAqIHtAbGluayBBbmltYXRvclNldCNwbGF5KEFuaW1hdG9yKX0gY2FsbCB0aGF0IGNyZWF0ZWQgdGhpcyA8Y29kZT5CdWlsZGVyPC9jb2RlPiBvYmplY3QKKyAgICAgICAgICogdG8gc3RhcnQgd2hlbiB0aGUgYW5pbWF0aW9uIHN1cHBsaWVkIGluIHRoaXMgbWV0aG9kIGNhbGwgZW5kcy4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIGFuaW0gVGhlIGFuaW1hdGlvbiB3aG9zZSBlbmQgd2lsbCBjYXVzZSB0aGUgYW5pbWF0aW9uIHN1cHBsaWVkIHRvIHRoZQorICAgICAgICAgKiB7QGxpbmsgQW5pbWF0b3JTZXQjcGxheShBbmltYXRvcil9IG1ldGhvZCB0byBwbGF5LgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgYWZ0ZXIoQW5pbWF0b3IgYW5pbSkgeworICAgICAgICAgICAgTm9kZSBub2RlID0gbU5vZGVNYXAuZ2V0KGFuaW0pOworICAgICAgICAgICAgaWYgKG5vZGUgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG5vZGUgPSBuZXcgTm9kZShhbmltKTsKKyAgICAgICAgICAgICAgICBtTm9kZU1hcC5wdXQoYW5pbSwgbm9kZSk7CisgICAgICAgICAgICAgICAgbU5vZGVzLmFkZChub2RlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIERlcGVuZGVuY3kgZGVwZW5kZW5jeSA9IG5ldyBEZXBlbmRlbmN5KG5vZGUsIERlcGVuZGVuY3kuQUZURVIpOworICAgICAgICAgICAgbUN1cnJlbnROb2RlLmFkZERlcGVuZGVuY3koZGVwZW5kZW5jeSk7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogU2V0cyB1cCB0aGUgYW5pbWF0aW9uIHN1cHBsaWVkIGluIHRoZQorICAgICAgICAgKiB7QGxpbmsgQW5pbWF0b3JTZXQjcGxheShBbmltYXRvcil9IGNhbGwgdGhhdCBjcmVhdGVkIHRoaXMgPGNvZGU+QnVpbGRlcjwvY29kZT4gb2JqZWN0CisgICAgICAgICAqIHRvIHBsYXkgd2hlbiB0aGUgZ2l2ZW4gYW1vdW50IG9mIHRpbWUgZWxhcHNlcy4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIGRlbGF5IFRoZSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIHRoYXQgc2hvdWxkIGVsYXBzZSBiZWZvcmUgdGhlCisgICAgICAgICAqIGFuaW1hdGlvbiBzdGFydHMuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgdm9pZCBhZnRlcihsb25nIGRlbGF5KSB7CisgICAgICAgICAgICAvLyBzZXR1cCBkdW1teSBWYWx1ZUFuaW1hdG9yIGp1c3QgdG8gcnVuIHRoZSBjbG9jaworICAgICAgICAgICAgYWZ0ZXIobmV3IFZhbHVlQW5pbWF0b3IoZGVsYXksIDBmLCAxZikpOworICAgICAgICB9CisKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2FuaW1hdGlvbi9Eb3VibGVFdmFsdWF0b3IuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2FuaW1hdGlvbi9Eb3VibGVFdmFsdWF0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNDZlYjM3Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvYW5pbWF0aW9uL0RvdWJsZUV2YWx1YXRvci5qYXZhCkBAIC0wLDAgKzEsNDIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQuYW5pbWF0aW9uOworCisvKioKKyAqIFRoaXMgZXZhbHVhdG9yIGNhbiBiZSB1c2VkIHRvIHBlcmZvcm0gdHlwZSBpbnRlcnBvbGF0aW9uIGJldHdlZW4gPGNvZGU+ZG91YmxlPC9jb2RlPiB2YWx1ZXMuCisgKi8KK3B1YmxpYyBjbGFzcyBEb3VibGVFdmFsdWF0b3IgaW1wbGVtZW50cyBUeXBlRXZhbHVhdG9yIHsKKyAgICAvKioKKyAgICAgKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIHJlc3VsdCBvZiBsaW5lYXJseSBpbnRlcnBvbGF0aW5nIHRoZSBzdGFydCBhbmQgZW5kIHZhbHVlcywgd2l0aAorICAgICAqIDxjb2RlPmZyYWN0aW9uPC9jb2RlPiByZXByZXNlbnRpbmcgdGhlIHByb3BvcnRpb24gYmV0d2VlbiB0aGUgc3RhcnQgYW5kIGVuZCB2YWx1ZXMuIFRoZQorICAgICAqIGNhbGN1bGF0aW9uIGlzIGEgc2ltcGxlIHBhcmFtZXRyaWMgY2FsY3VsYXRpb246IDxjb2RlPnJlc3VsdCA9IHgwICsgdCAqICh2MSAtIHYwKTwvY29kZT4sCisgICAgICogd2hlcmUgPGNvZGU+eDA8L2NvZGU+IGlzIDxjb2RlPnN0YXJ0VmFsdWU8L2NvZGU+LCA8Y29kZT54MTwvY29kZT4gaXMgPGNvZGU+ZW5kVmFsdWU8L2NvZGU+LAorICAgICAqIGFuZCA8Y29kZT50PC9jb2RlPiBpcyA8Y29kZT5mcmFjdGlvbjwvY29kZT4uCisgICAgICoKKyAgICAgKiBAcGFyYW0gZnJhY3Rpb24gICBUaGUgZnJhY3Rpb24gZnJvbSB0aGUgc3RhcnRpbmcgdG8gdGhlIGVuZGluZyB2YWx1ZXMKKyAgICAgKiBAcGFyYW0gc3RhcnRWYWx1ZSBUaGUgc3RhcnQgdmFsdWU7IHNob3VsZCBiZSBvZiB0eXBlIDxjb2RlPmRvdWJsZTwvY29kZT4gb3IKKyAgICAgKiAgICAgICAgICAgICAgICAgICA8Y29kZT5Eb3VibGU8L2NvZGU+CisgICAgICogQHBhcmFtIGVuZFZhbHVlICAgVGhlIGVuZCB2YWx1ZTsgc2hvdWxkIGJlIG9mIHR5cGUgPGNvZGU+ZG91YmxlPC9jb2RlPiBvcgorICAgICAqICAgICAgICAgICAgICAgICAgIDxjb2RlPkRvdWJsZTwvY29kZT4KKyAgICAgKiBAcmV0dXJuIEEgbGluZWFyIGludGVycG9sYXRpb24gYmV0d2VlbiB0aGUgc3RhcnQgYW5kIGVuZCB2YWx1ZXMsIGdpdmVuIHRoZQorICAgICAqICAgICAgICAgPGNvZGU+ZnJhY3Rpb248L2NvZGU+IHBhcmFtZXRlci4KKyAgICAgKi8KKyAgICBwdWJsaWMgT2JqZWN0IGV2YWx1YXRlKGZsb2F0IGZyYWN0aW9uLCBPYmplY3Qgc3RhcnRWYWx1ZSwgT2JqZWN0IGVuZFZhbHVlKSB7CisgICAgICAgIGRvdWJsZSBzdGFydERvdWJsZSA9ICgoTnVtYmVyKSBzdGFydFZhbHVlKS5kb3VibGVWYWx1ZSgpOworICAgICAgICByZXR1cm4gc3RhcnREb3VibGUgKyBmcmFjdGlvbiAqICgoKE51bWJlcikgZW5kVmFsdWUpLmRvdWJsZVZhbHVlKCkgLSBzdGFydERvdWJsZSk7CisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2FuaW1hdGlvbi9GbG9hdEV2YWx1YXRvci5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvYW5pbWF0aW9uL0Zsb2F0RXZhbHVhdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWUyMDU0ZAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2FuaW1hdGlvbi9GbG9hdEV2YWx1YXRvci5qYXZhCkBAIC0wLDAgKzEsNDIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQuYW5pbWF0aW9uOworCisvKioKKyAqIFRoaXMgZXZhbHVhdG9yIGNhbiBiZSB1c2VkIHRvIHBlcmZvcm0gdHlwZSBpbnRlcnBvbGF0aW9uIGJldHdlZW4gPGNvZGU+ZmxvYXQ8L2NvZGU+IHZhbHVlcy4KKyAqLworcHVibGljIGNsYXNzIEZsb2F0RXZhbHVhdG9yIGltcGxlbWVudHMgVHlwZUV2YWx1YXRvciB7CisKKyAgICAvKioKKyAgICAgKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIHJlc3VsdCBvZiBsaW5lYXJseSBpbnRlcnBvbGF0aW5nIHRoZSBzdGFydCBhbmQgZW5kIHZhbHVlcywgd2l0aAorICAgICAqIDxjb2RlPmZyYWN0aW9uPC9jb2RlPiByZXByZXNlbnRpbmcgdGhlIHByb3BvcnRpb24gYmV0d2VlbiB0aGUgc3RhcnQgYW5kIGVuZCB2YWx1ZXMuIFRoZQorICAgICAqIGNhbGN1bGF0aW9uIGlzIGEgc2ltcGxlIHBhcmFtZXRyaWMgY2FsY3VsYXRpb246IDxjb2RlPnJlc3VsdCA9IHgwICsgdCAqICh2MSAtIHYwKTwvY29kZT4sCisgICAgICogd2hlcmUgPGNvZGU+eDA8L2NvZGU+IGlzIDxjb2RlPnN0YXJ0VmFsdWU8L2NvZGU+LCA8Y29kZT54MTwvY29kZT4gaXMgPGNvZGU+ZW5kVmFsdWU8L2NvZGU+LAorICAgICAqIGFuZCA8Y29kZT50PC9jb2RlPiBpcyA8Y29kZT5mcmFjdGlvbjwvY29kZT4uCisgICAgICoKKyAgICAgKiBAcGFyYW0gZnJhY3Rpb24gICBUaGUgZnJhY3Rpb24gZnJvbSB0aGUgc3RhcnRpbmcgdG8gdGhlIGVuZGluZyB2YWx1ZXMKKyAgICAgKiBAcGFyYW0gc3RhcnRWYWx1ZSBUaGUgc3RhcnQgdmFsdWU7IHNob3VsZCBiZSBvZiB0eXBlIDxjb2RlPmZsb2F0PC9jb2RlPiBvcgorICAgICAqICAgICAgICAgICAgICAgICAgIDxjb2RlPkZsb2F0PC9jb2RlPgorICAgICAqIEBwYXJhbSBlbmRWYWx1ZSAgIFRoZSBlbmQgdmFsdWU7IHNob3VsZCBiZSBvZiB0eXBlIDxjb2RlPmZsb2F0PC9jb2RlPiBvciA8Y29kZT5GbG9hdDwvY29kZT4KKyAgICAgKiBAcmV0dXJuIEEgbGluZWFyIGludGVycG9sYXRpb24gYmV0d2VlbiB0aGUgc3RhcnQgYW5kIGVuZCB2YWx1ZXMsIGdpdmVuIHRoZQorICAgICAqICAgICAgICAgPGNvZGU+ZnJhY3Rpb248L2NvZGU+IHBhcmFtZXRlci4KKyAgICAgKi8KKyAgICBwdWJsaWMgT2JqZWN0IGV2YWx1YXRlKGZsb2F0IGZyYWN0aW9uLCBPYmplY3Qgc3RhcnRWYWx1ZSwgT2JqZWN0IGVuZFZhbHVlKSB7CisgICAgICAgIGZsb2F0IHN0YXJ0RmxvYXQgPSAoKE51bWJlcikgc3RhcnRWYWx1ZSkuZmxvYXRWYWx1ZSgpOworICAgICAgICByZXR1cm4gc3RhcnRGbG9hdCArIGZyYWN0aW9uICogKCgoTnVtYmVyKSBlbmRWYWx1ZSkuZmxvYXRWYWx1ZSgpIC0gc3RhcnRGbG9hdCk7CisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2FuaW1hdGlvbi9JbnRFdmFsdWF0b3IuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2FuaW1hdGlvbi9JbnRFdmFsdWF0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43Mjg4OTI3Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvYW5pbWF0aW9uL0ludEV2YWx1YXRvci5qYXZhCkBAIC0wLDAgKzEsNDIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQuYW5pbWF0aW9uOworCisvKioKKyAqIFRoaXMgZXZhbHVhdG9yIGNhbiBiZSB1c2VkIHRvIHBlcmZvcm0gdHlwZSBpbnRlcnBvbGF0aW9uIGJldHdlZW4gPGNvZGU+aW50PC9jb2RlPiB2YWx1ZXMuCisgKi8KK3B1YmxpYyBjbGFzcyBJbnRFdmFsdWF0b3IgaW1wbGVtZW50cyBUeXBlRXZhbHVhdG9yIHsKKworICAgIC8qKgorICAgICAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgcmVzdWx0IG9mIGxpbmVhcmx5IGludGVycG9sYXRpbmcgdGhlIHN0YXJ0IGFuZCBlbmQgdmFsdWVzLCB3aXRoCisgICAgICogPGNvZGU+ZnJhY3Rpb248L2NvZGU+IHJlcHJlc2VudGluZyB0aGUgcHJvcG9ydGlvbiBiZXR3ZWVuIHRoZSBzdGFydCBhbmQgZW5kIHZhbHVlcy4gVGhlCisgICAgICogY2FsY3VsYXRpb24gaXMgYSBzaW1wbGUgcGFyYW1ldHJpYyBjYWxjdWxhdGlvbjogPGNvZGU+cmVzdWx0ID0geDAgKyB0ICogKHYxIC0gdjApPC9jb2RlPiwKKyAgICAgKiB3aGVyZSA8Y29kZT54MDwvY29kZT4gaXMgPGNvZGU+c3RhcnRWYWx1ZTwvY29kZT4sIDxjb2RlPngxPC9jb2RlPiBpcyA8Y29kZT5lbmRWYWx1ZTwvY29kZT4sCisgICAgICogYW5kIDxjb2RlPnQ8L2NvZGU+IGlzIDxjb2RlPmZyYWN0aW9uPC9jb2RlPi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBmcmFjdGlvbiAgIFRoZSBmcmFjdGlvbiBmcm9tIHRoZSBzdGFydGluZyB0byB0aGUgZW5kaW5nIHZhbHVlcworICAgICAqIEBwYXJhbSBzdGFydFZhbHVlIFRoZSBzdGFydCB2YWx1ZTsgc2hvdWxkIGJlIG9mIHR5cGUgPGNvZGU+aW50PC9jb2RlPiBvcgorICAgICAqICAgICAgICAgICAgICAgICAgIDxjb2RlPkludGVnZXI8L2NvZGU+CisgICAgICogQHBhcmFtIGVuZFZhbHVlICAgVGhlIGVuZCB2YWx1ZTsgc2hvdWxkIGJlIG9mIHR5cGUgPGNvZGU+aW50PC9jb2RlPiBvciA8Y29kZT5JbnRlZ2VyPC9jb2RlPgorICAgICAqIEByZXR1cm4gQSBsaW5lYXIgaW50ZXJwb2xhdGlvbiBiZXR3ZWVuIHRoZSBzdGFydCBhbmQgZW5kIHZhbHVlcywgZ2l2ZW4gdGhlCisgICAgICogICAgICAgICA8Y29kZT5mcmFjdGlvbjwvY29kZT4gcGFyYW1ldGVyLgorICAgICAqLworICAgIHB1YmxpYyBPYmplY3QgZXZhbHVhdGUoZmxvYXQgZnJhY3Rpb24sIE9iamVjdCBzdGFydFZhbHVlLCBPYmplY3QgZW5kVmFsdWUpIHsKKyAgICAgICAgaW50IHN0YXJ0SW50ID0gKChOdW1iZXIpIHN0YXJ0VmFsdWUpLmludFZhbHVlKCk7CisgICAgICAgIHJldHVybiAoaW50KSAoc3RhcnRJbnQgKyBmcmFjdGlvbiAqICgoKE51bWJlcikgZW5kVmFsdWUpLmludFZhbHVlKCkgLSBzdGFydEludCkpOworICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9hbmltYXRpb24vS2V5ZnJhbWUuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2FuaW1hdGlvbi9LZXlmcmFtZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE5MmJhNWMKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9hbmltYXRpb24vS2V5ZnJhbWUuamF2YQpAQCAtMCwwICsxLDI1OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5hbmltYXRpb247CisKK2ltcG9ydCBhbmRyb2lkLnZpZXcuYW5pbWF0aW9uLkludGVycG9sYXRvcjsKKworLyoqCisgKiBUaGlzIGNsYXNzIGhvbGRzIGEgdGltZS92YWx1ZSBwYWlyIGZvciBhbiBhbmltYXRpb24uIFRoZSBLZXlmcmFtZSBjbGFzcyBpcyB1c2VkCisgKiBieSB7QGxpbmsgVmFsdWVBbmltYXRvcn0gdG8gZGVmaW5lIHRoZSB2YWx1ZXMgdGhhdCB0aGUgYW5pbWF0aW9uIHRhcmdldCB3aWxsIGhhdmUgb3ZlciB0aGUgY291cnNlCisgKiBvZiB0aGUgYW5pbWF0aW9uLiBBcyB0aGUgdGltZSBwcm9jZWVkcyBmcm9tIG9uZSBrZXlmcmFtZSB0byB0aGUgb3RoZXIsIHRoZSB2YWx1ZSBvZiB0aGUKKyAqIHRhcmdldCBvYmplY3Qgd2lsbCBhbmltYXRlIGJldHdlZW4gdGhlIHZhbHVlIGF0IHRoZSBwcmV2aW91cyBrZXlmcmFtZSBhbmQgdGhlIHZhbHVlIGF0IHRoZQorICogbmV4dCBrZXlmcmFtZS4gRWFjaCBrZXlmcmFtZSBhbHNvIGhvbGRzIGFuIG9wdGlvbiB7QGxpbmsgYW5kcm9pZC52aWV3LmFuaW1hdGlvbi5JbnRlcnBvbGF0b3J9CisgKiBvYmplY3QsIHdoaWNoIGRlZmluZXMgdGhlIHRpbWUgaW50ZXJwb2xhdGlvbiBvdmVyIHRoZSBpbnRlcnZhbHVlIHByZWNlZGluZyB0aGUga2V5ZnJhbWUuCisgKi8KK3B1YmxpYyBjbGFzcyBLZXlmcmFtZSBpbXBsZW1lbnRzIENsb25lYWJsZSB7CisgICAgLyoqCisgICAgICogVGhlIHRpbWUgYXQgd2hpY2ggbVZhbHVlIHdpbGwgaG9sZCB0cnVlLgorICAgICAqLworICAgIHByaXZhdGUgZmxvYXQgbUZyYWN0aW9uOworCisgICAgLyoqCisgICAgICogVGhlIHZhbHVlIG9mIHRoZSBhbmltYXRpb24gYXQgdGhlIHRpbWUgbUZyYWN0aW9uLgorICAgICAqLworICAgIHByaXZhdGUgT2JqZWN0IG1WYWx1ZTsKKworICAgIC8qKgorICAgICAqIFRoZSB0eXBlIG9mIHRoZSB2YWx1ZSBpbiB0aGlzIEtleWZyYW1lLiBUaGlzIHR5cGUgaXMgZGV0ZXJtaW5lZCBhdCBjb25zdHJ1Y3Rpb24gdGltZSwKKyAgICAgKiBiYXNlZCBvbiB0aGUgdHlwZSBvZiB0aGUgPGNvZGU+dmFsdWU8L2NvZGU+IG9iamVjdCBwYXNzZWQgaW50byB0aGUgY29uc3RydWN0b3IuCisgICAgICovCisgICAgcHJpdmF0ZSBDbGFzcyBtVmFsdWVUeXBlOworCisgICAgLyoqCisgICAgICogVGhlIG9wdGlvbmFsIHRpbWUgaW50ZXJwb2xhdG9yIGZvciB0aGUgaW50ZXJ2YWwgcHJlY2VkaW5nIHRoaXMga2V5ZnJhbWUuIEEgbnVsbCBpbnRlcnBvbGF0b3IKKyAgICAgKiAodGhlIGRlZmF1bHQpIHJlc3VsdHMgaW4gbGluZWFyIGludGVycG9sYXRpb24gb3ZlciB0aGUgaW50ZXJ2YWwuCisgICAgICovCisgICAgcHJpdmF0ZSBJbnRlcnBvbGF0b3IgbUludGVycG9sYXRvciA9IG51bGw7CisKKyAgICAvKioKKyAgICAgKiBQcml2YXRlIGNvbnN0cnVjdG9yLCBjYWxsZWQgZnJvbSB0aGUgcHVibGljIGNvbnN0cnVjdG9ycyB3aXRoIHRoZSBhZGRpdGlvbmFsCisgICAgICogPGNvZGU+dmFsdWVUeXBlPC9jb2RlPiBwYXJhbWV0ZXIuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZnJhY3Rpb24gVGhlIHRpbWUsIGV4cHJlc3NlZCBhcyBhIHZhbHVlIGJldHdlZW4gMCBhbmQgMSwgcmVwcmVzZW50aW5nIHRoZSBmcmFjdGlvbgorICAgICAqIG9mIHRpbWUgZWxhcHNlZCBvZiB0aGUgb3ZlcmFsbCBhbmltYXRpb24gZHVyYXRpb24uCisgICAgICogQHBhcmFtIHZhbHVlIFRoZSB2YWx1ZSB0aGF0IHRoZSBvYmplY3Qgd2lsbCBhbmltYXRlIHRvIGFzIHRoZSBhbmltYXRpb24gdGltZSBhcHByb2FjaGVzCisgICAgICogdGhlIHRpbWUgaW4gdGhpcyBrZXlmcmFtZSwgYW5kIHRoZSB0aGUgdmFsdWUgYW5pbWF0ZWQgZnJvbSBhcyB0aGUgdGltZSBwYXNzZXMgdGhlIHRpbWUgaW4KKyAgICAgKiB0aGlzIGtleWZyYW1lLgorICAgICAqIEBwYXJhbSB2YWx1ZVR5cGUgVGhlIHR5cGUgb2YgdGhlIDxjb2RlPnZhbHVlPC9jb2RlPiBvYmplY3QuIFRoaXMgaXMgdXNlZCBieSB0aGUKKyAgICAgKiB7QGxpbmsgI2dldFZhbHVlKCl9IGZ1bmN0aW9ubSwgd2hpY2ggaXMgcXVlcmllZCBieSB7QGxpbmsgVmFsdWVBbmltYXRvcn0gdG8gZGV0ZXJtaW5lCisgICAgICogdGhlIHR5cGUgb2Yge0BsaW5rIFR5cGVFdmFsdWF0b3J9IHRvIHVzZSB0byBpbnRlcnBvbGF0ZSBiZXR3ZWVuIHZhbHVlcy4KKyAgICAgKi8KKyAgICBwcml2YXRlIEtleWZyYW1lKGZsb2F0IGZyYWN0aW9uLCBPYmplY3QgdmFsdWUsIENsYXNzIHZhbHVlVHlwZSkgeworICAgICAgICBtRnJhY3Rpb24gPSBmcmFjdGlvbjsKKyAgICAgICAgbVZhbHVlID0gdmFsdWU7CisgICAgICAgIG1WYWx1ZVR5cGUgPSB2YWx1ZVR5cGU7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29uc3RydWN0cyBhIEtleWZyYW1lIG9iamVjdCB3aXRoIHRoZSBnaXZlbiB0aW1lIGFuZCB2YWx1ZS4gVGhlIHRpbWUgZGVmaW5lcyB0aGUKKyAgICAgKiB0aW1lLCBhcyBhIHByb3BvcnRpb24gb2YgYW4gb3ZlcmFsbCBhbmltYXRpb24ncyBkdXJhdGlvbiwgYXQgd2hpY2ggdGhlIHZhbHVlIHdpbGwgaG9sZCB0cnVlCisgICAgICogZm9yIHRoZSBhbmltYXRpb24uIFRoZSB2YWx1ZSBmb3IgdGhlIGFuaW1hdGlvbiBiZXR3ZWVuIGtleWZyYW1lcyB3aWxsIGJlIGNhbGN1bGF0ZWQgYXMKKyAgICAgKiBhbiBpbnRlcnBvbGF0aW9uIGJldHdlZW4gdGhlIHZhbHVlcyBhdCB0aG9zZSBrZXlmcmFtZXMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZnJhY3Rpb24gVGhlIHRpbWUsIGV4cHJlc3NlZCBhcyBhIHZhbHVlIGJldHdlZW4gMCBhbmQgMSwgcmVwcmVzZW50aW5nIHRoZSBmcmFjdGlvbgorICAgICAqIG9mIHRpbWUgZWxhcHNlZCBvZiB0aGUgb3ZlcmFsbCBhbmltYXRpb24gZHVyYXRpb24uCisgICAgICogQHBhcmFtIHZhbHVlIFRoZSB2YWx1ZSB0aGF0IHRoZSBvYmplY3Qgd2lsbCBhbmltYXRlIHRvIGFzIHRoZSBhbmltYXRpb24gdGltZSBhcHByb2FjaGVzCisgICAgICogdGhlIHRpbWUgaW4gdGhpcyBrZXlmcmFtZSwgYW5kIHRoZSB0aGUgdmFsdWUgYW5pbWF0ZWQgZnJvbSBhcyB0aGUgdGltZSBwYXNzZXMgdGhlIHRpbWUgaW4KKyAgICAgKiB0aGlzIGtleWZyYW1lLgorICAgICAqLworICAgIHB1YmxpYyBLZXlmcmFtZShmbG9hdCBmcmFjdGlvbiwgT2JqZWN0IHZhbHVlKSB7CisgICAgICAgIHRoaXMoZnJhY3Rpb24sIHZhbHVlLCAodmFsdWUgIT0gbnVsbCkgPyB2YWx1ZS5nZXRDbGFzcygpIDogT2JqZWN0LmNsYXNzKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RzIGEgS2V5ZnJhbWUgb2JqZWN0IHdpdGggdGhlIGdpdmVuIHRpbWUgYW5kIGZsb2F0IHZhbHVlLiBUaGUgdGltZSBkZWZpbmVzIHRoZQorICAgICAqIHRpbWUsIGFzIGEgcHJvcG9ydGlvbiBvZiBhbiBvdmVyYWxsIGFuaW1hdGlvbidzIGR1cmF0aW9uLCBhdCB3aGljaCB0aGUgdmFsdWUgd2lsbCBob2xkIHRydWUKKyAgICAgKiBmb3IgdGhlIGFuaW1hdGlvbi4gVGhlIHZhbHVlIGZvciB0aGUgYW5pbWF0aW9uIGJldHdlZW4ga2V5ZnJhbWVzIHdpbGwgYmUgY2FsY3VsYXRlZCBhcworICAgICAqIGFuIGludGVycG9sYXRpb24gYmV0d2VlbiB0aGUgdmFsdWVzIGF0IHRob3NlIGtleWZyYW1lcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBmcmFjdGlvbiBUaGUgdGltZSwgZXhwcmVzc2VkIGFzIGEgdmFsdWUgYmV0d2VlbiAwIGFuZCAxLCByZXByZXNlbnRpbmcgdGhlIGZyYWN0aW9uCisgICAgICogb2YgdGltZSBlbGFwc2VkIG9mIHRoZSBvdmVyYWxsIGFuaW1hdGlvbiBkdXJhdGlvbi4KKyAgICAgKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlIHRoYXQgdGhlIG9iamVjdCB3aWxsIGFuaW1hdGUgdG8gYXMgdGhlIGFuaW1hdGlvbiB0aW1lIGFwcHJvYWNoZXMKKyAgICAgKiB0aGUgdGltZSBpbiB0aGlzIGtleWZyYW1lLCBhbmQgdGhlIHRoZSB2YWx1ZSBhbmltYXRlZCBmcm9tIGFzIHRoZSB0aW1lIHBhc3NlcyB0aGUgdGltZSBpbgorICAgICAqIHRoaXMga2V5ZnJhbWUuCisgICAgICovCisgICAgcHVibGljIEtleWZyYW1lKGZsb2F0IGZyYWN0aW9uLCBGbG9hdCB2YWx1ZSkgeworICAgICAgICB0aGlzKGZyYWN0aW9uLCB2YWx1ZSwgRmxvYXQuY2xhc3MpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdHMgYSBLZXlmcmFtZSBvYmplY3Qgd2l0aCB0aGUgZ2l2ZW4gdGltZSBhbmQgaW50ZWdlciB2YWx1ZS4gVGhlIHRpbWUgZGVmaW5lcyB0aGUKKyAgICAgKiB0aW1lLCBhcyBhIHByb3BvcnRpb24gb2YgYW4gb3ZlcmFsbCBhbmltYXRpb24ncyBkdXJhdGlvbiwgYXQgd2hpY2ggdGhlIHZhbHVlIHdpbGwgaG9sZCB0cnVlCisgICAgICogZm9yIHRoZSBhbmltYXRpb24uIFRoZSB2YWx1ZSBmb3IgdGhlIGFuaW1hdGlvbiBiZXR3ZWVuIGtleWZyYW1lcyB3aWxsIGJlIGNhbGN1bGF0ZWQgYXMKKyAgICAgKiBhbiBpbnRlcnBvbGF0aW9uIGJldHdlZW4gdGhlIHZhbHVlcyBhdCB0aG9zZSBrZXlmcmFtZXMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZnJhY3Rpb24gVGhlIHRpbWUsIGV4cHJlc3NlZCBhcyBhIHZhbHVlIGJldHdlZW4gMCBhbmQgMSwgcmVwcmVzZW50aW5nIHRoZSBmcmFjdGlvbgorICAgICAqIG9mIHRpbWUgZWxhcHNlZCBvZiB0aGUgb3ZlcmFsbCBhbmltYXRpb24gZHVyYXRpb24uCisgICAgICogQHBhcmFtIHZhbHVlIFRoZSB2YWx1ZSB0aGF0IHRoZSBvYmplY3Qgd2lsbCBhbmltYXRlIHRvIGFzIHRoZSBhbmltYXRpb24gdGltZSBhcHByb2FjaGVzCisgICAgICogdGhlIHRpbWUgaW4gdGhpcyBrZXlmcmFtZSwgYW5kIHRoZSB0aGUgdmFsdWUgYW5pbWF0ZWQgZnJvbSBhcyB0aGUgdGltZSBwYXNzZXMgdGhlIHRpbWUgaW4KKyAgICAgKiB0aGlzIGtleWZyYW1lLgorICAgICAqLworICAgIHB1YmxpYyBLZXlmcmFtZShmbG9hdCBmcmFjdGlvbiwgSW50ZWdlciB2YWx1ZSkgeworICAgICAgICB0aGlzKGZyYWN0aW9uLCB2YWx1ZSwgSW50ZWdlci5jbGFzcyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29uc3RydWN0cyBhIEtleWZyYW1lIG9iamVjdCB3aXRoIHRoZSBnaXZlbiB0aW1lIGFuZCBkb3VibGUgdmFsdWUuIFRoZSB0aW1lIGRlZmluZXMgdGhlCisgICAgICogdGltZSwgYXMgYSBwcm9wb3J0aW9uIG9mIGFuIG92ZXJhbGwgYW5pbWF0aW9uJ3MgZHVyYXRpb24sIGF0IHdoaWNoIHRoZSB2YWx1ZSB3aWxsIGhvbGQgdHJ1ZQorICAgICAqIGZvciB0aGUgYW5pbWF0aW9uLiBUaGUgdmFsdWUgZm9yIHRoZSBhbmltYXRpb24gYmV0d2VlbiBrZXlmcmFtZXMgd2lsbCBiZSBjYWxjdWxhdGVkIGFzCisgICAgICogYW4gaW50ZXJwb2xhdGlvbiBiZXR3ZWVuIHRoZSB2YWx1ZXMgYXQgdGhvc2Uga2V5ZnJhbWVzLgorICAgICAqCisgICAgICogQHBhcmFtIGZyYWN0aW9uIFRoZSB0aW1lLCBleHByZXNzZWQgYXMgYSB2YWx1ZSBiZXR3ZWVuIDAgYW5kIDEsIHJlcHJlc2VudGluZyB0aGUgZnJhY3Rpb24KKyAgICAgKiBvZiB0aW1lIGVsYXBzZWQgb2YgdGhlIG92ZXJhbGwgYW5pbWF0aW9uIGR1cmF0aW9uLgorICAgICAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUgdGhhdCB0aGUgb2JqZWN0IHdpbGwgYW5pbWF0ZSB0byBhcyB0aGUgYW5pbWF0aW9uIHRpbWUgYXBwcm9hY2hlcworICAgICAqIHRoZSB0aW1lIGluIHRoaXMga2V5ZnJhbWUsIGFuZCB0aGUgdGhlIHZhbHVlIGFuaW1hdGVkIGZyb20gYXMgdGhlIHRpbWUgcGFzc2VzIHRoZSB0aW1lIGluCisgICAgICogdGhpcyBrZXlmcmFtZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgS2V5ZnJhbWUoZmxvYXQgZnJhY3Rpb24sIERvdWJsZSB2YWx1ZSkgeworICAgICAgICB0aGlzKGZyYWN0aW9uLCB2YWx1ZSwgRG91YmxlLmNsYXNzKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RzIGEgS2V5ZnJhbWUgb2JqZWN0IHdpdGggdGhlIGdpdmVuIHRpbWUgYW5kIGludGVnZXIgdmFsdWUuIFRoZSB0aW1lIGRlZmluZXMgdGhlCisgICAgICogdGltZSwgYXMgYSBwcm9wb3J0aW9uIG9mIGFuIG92ZXJhbGwgYW5pbWF0aW9uJ3MgZHVyYXRpb24sIGF0IHdoaWNoIHRoZSB2YWx1ZSB3aWxsIGhvbGQgdHJ1ZQorICAgICAqIGZvciB0aGUgYW5pbWF0aW9uLiBUaGUgdmFsdWUgZm9yIHRoZSBhbmltYXRpb24gYmV0d2VlbiBrZXlmcmFtZXMgd2lsbCBiZSBjYWxjdWxhdGVkIGFzCisgICAgICogYW4gaW50ZXJwb2xhdGlvbiBiZXR3ZWVuIHRoZSB2YWx1ZXMgYXQgdGhvc2Uga2V5ZnJhbWVzLgorICAgICAqCisgICAgICogQHBhcmFtIGZyYWN0aW9uIFRoZSB0aW1lLCBleHByZXNzZWQgYXMgYSB2YWx1ZSBiZXR3ZWVuIDAgYW5kIDEsIHJlcHJlc2VudGluZyB0aGUgZnJhY3Rpb24KKyAgICAgKiBvZiB0aW1lIGVsYXBzZWQgb2YgdGhlIG92ZXJhbGwgYW5pbWF0aW9uIGR1cmF0aW9uLgorICAgICAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUgdGhhdCB0aGUgb2JqZWN0IHdpbGwgYW5pbWF0ZSB0byBhcyB0aGUgYW5pbWF0aW9uIHRpbWUgYXBwcm9hY2hlcworICAgICAqIHRoZSB0aW1lIGluIHRoaXMga2V5ZnJhbWUsIGFuZCB0aGUgdGhlIHZhbHVlIGFuaW1hdGVkIGZyb20gYXMgdGhlIHRpbWUgcGFzc2VzIHRoZSB0aW1lIGluCisgICAgICogdGhpcyBrZXlmcmFtZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgS2V5ZnJhbWUoZmxvYXQgZnJhY3Rpb24sIGludCB2YWx1ZSkgeworICAgICAgICB0aGlzKGZyYWN0aW9uLCB2YWx1ZSwgaW50LmNsYXNzKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RzIGEgS2V5ZnJhbWUgb2JqZWN0IHdpdGggdGhlIGdpdmVuIHRpbWUgYW5kIGZsb2F0IHZhbHVlLiBUaGUgdGltZSBkZWZpbmVzIHRoZQorICAgICAqIHRpbWUsIGFzIGEgcHJvcG9ydGlvbiBvZiBhbiBvdmVyYWxsIGFuaW1hdGlvbidzIGR1cmF0aW9uLCBhdCB3aGljaCB0aGUgdmFsdWUgd2lsbCBob2xkIHRydWUKKyAgICAgKiBmb3IgdGhlIGFuaW1hdGlvbi4gVGhlIHZhbHVlIGZvciB0aGUgYW5pbWF0aW9uIGJldHdlZW4ga2V5ZnJhbWVzIHdpbGwgYmUgY2FsY3VsYXRlZCBhcworICAgICAqIGFuIGludGVycG9sYXRpb24gYmV0d2VlbiB0aGUgdmFsdWVzIGF0IHRob3NlIGtleWZyYW1lcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBmcmFjdGlvbiBUaGUgdGltZSwgZXhwcmVzc2VkIGFzIGEgdmFsdWUgYmV0d2VlbiAwIGFuZCAxLCByZXByZXNlbnRpbmcgdGhlIGZyYWN0aW9uCisgICAgICogb2YgdGltZSBlbGFwc2VkIG9mIHRoZSBvdmVyYWxsIGFuaW1hdGlvbiBkdXJhdGlvbi4KKyAgICAgKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlIHRoYXQgdGhlIG9iamVjdCB3aWxsIGFuaW1hdGUgdG8gYXMgdGhlIGFuaW1hdGlvbiB0aW1lIGFwcHJvYWNoZXMKKyAgICAgKiB0aGUgdGltZSBpbiB0aGlzIGtleWZyYW1lLCBhbmQgdGhlIHRoZSB2YWx1ZSBhbmltYXRlZCBmcm9tIGFzIHRoZSB0aW1lIHBhc3NlcyB0aGUgdGltZSBpbgorICAgICAqIHRoaXMga2V5ZnJhbWUuCisgICAgICovCisgICAgcHVibGljIEtleWZyYW1lKGZsb2F0IGZyYWN0aW9uLCBmbG9hdCB2YWx1ZSkgeworICAgICAgICB0aGlzKGZyYWN0aW9uLCB2YWx1ZSwgZmxvYXQuY2xhc3MpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdHMgYSBLZXlmcmFtZSBvYmplY3Qgd2l0aCB0aGUgZ2l2ZW4gdGltZSBhbmQgZG91YmxlIHZhbHVlLiBUaGUgdGltZSBkZWZpbmVzIHRoZQorICAgICAqIHRpbWUsIGFzIGEgcHJvcG9ydGlvbiBvZiBhbiBvdmVyYWxsIGFuaW1hdGlvbidzIGR1cmF0aW9uLCBhdCB3aGljaCB0aGUgdmFsdWUgd2lsbCBob2xkIHRydWUKKyAgICAgKiBmb3IgdGhlIGFuaW1hdGlvbi4gVGhlIHZhbHVlIGZvciB0aGUgYW5pbWF0aW9uIGJldHdlZW4ga2V5ZnJhbWVzIHdpbGwgYmUgY2FsY3VsYXRlZCBhcworICAgICAqIGFuIGludGVycG9sYXRpb24gYmV0d2VlbiB0aGUgdmFsdWVzIGF0IHRob3NlIGtleWZyYW1lcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBmcmFjdGlvbiBUaGUgdGltZSwgZXhwcmVzc2VkIGFzIGEgdmFsdWUgYmV0d2VlbiAwIGFuZCAxLCByZXByZXNlbnRpbmcgdGhlIGZyYWN0aW9uCisgICAgICogb2YgdGltZSBlbGFwc2VkIG9mIHRoZSBvdmVyYWxsIGFuaW1hdGlvbiBkdXJhdGlvbi4KKyAgICAgKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlIHRoYXQgdGhlIG9iamVjdCB3aWxsIGFuaW1hdGUgdG8gYXMgdGhlIGFuaW1hdGlvbiB0aW1lIGFwcHJvYWNoZXMKKyAgICAgKiB0aGUgdGltZSBpbiB0aGlzIGtleWZyYW1lLCBhbmQgdGhlIHRoZSB2YWx1ZSBhbmltYXRlZCBmcm9tIGFzIHRoZSB0aW1lIHBhc3NlcyB0aGUgdGltZSBpbgorICAgICAqIHRoaXMga2V5ZnJhbWUuCisgICAgICovCisgICAgcHVibGljIEtleWZyYW1lKGZsb2F0IGZyYWN0aW9uLCBkb3VibGUgdmFsdWUpIHsKKyAgICAgICAgdGhpcyhmcmFjdGlvbiwgdmFsdWUsIGRvdWJsZS5jbGFzcyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgdmFsdWUgZm9yIHRoaXMgS2V5ZnJhbWUuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFRoZSB2YWx1ZSBmb3IgdGhpcyBLZXlmcmFtZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgT2JqZWN0IGdldFZhbHVlKCkgeworICAgICAgICByZXR1cm4gbVZhbHVlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIHZhbHVlIGZvciB0aGlzIEtleWZyYW1lLgorICAgICAqCisgICAgICogQHBhcmFtIHZhbHVlIHZhbHVlIGZvciB0aGlzIEtleWZyYW1lLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFZhbHVlKE9iamVjdCB2YWx1ZSkgeworICAgICAgICBtVmFsdWUgPSB2YWx1ZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSB0aW1lIGZvciB0aGlzIGtleWZyYW1lLCBhcyBhIGZyYWN0aW9uIG9mIHRoZSBvdmVyYWxsIGFuaW1hdGlvbiBkdXJhdGlvbi4KKyAgICAgKgorICAgICAqIEByZXR1cm4gVGhlIHRpbWUgYXNzb2NpYXRlZCB3aXRoIHRoaXMga2V5ZnJhbWUsIGFzIGEgZnJhY3Rpb24gb2YgdGhlIG92ZXJhbGwgYW5pbWF0aW9uCisgICAgICogZHVyYXRpb24uIFRoaXMgc2hvdWxkIGJlIGEgdmFsdWUgYmV0d2VlbiAwIGFuZCAxLgorICAgICAqLworICAgIHB1YmxpYyBmbG9hdCBnZXRGcmFjdGlvbigpIHsKKyAgICAgICAgcmV0dXJuIG1GcmFjdGlvbjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSB0aW1lIGZvciB0aGlzIGtleWZyYW1lLCBhcyBhIGZyYWN0aW9uIG9mIHRoZSBvdmVyYWxsIGFuaW1hdGlvbiBkdXJhdGlvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBmcmFjdGlvbiB0aW1lIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGtleWZyYW1lLCBhcyBhIGZyYWN0aW9uIG9mIHRoZSBvdmVyYWxsIGFuaW1hdGlvbgorICAgICAqIGR1cmF0aW9uLiBUaGlzIHNob3VsZCBiZSBhIHZhbHVlIGJldHdlZW4gMCBhbmQgMS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRGcmFjdGlvbihmbG9hdCBmcmFjdGlvbikgeworICAgICAgICBtRnJhY3Rpb24gPSBmcmFjdGlvbjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSBvcHRpb25hbCBpbnRlcnBvbGF0b3IgZm9yIHRoaXMgS2V5ZnJhbWUuIEEgdmFsdWUgb2YgPGNvZGU+bnVsbDwvY29kZT4gaW5kaWNhdGVzCisgICAgICogdGhhdCB0aGVyZSBpcyBubyBpbnRlcnBvbGF0aW9uLCB3aGljaCBpcyB0aGUgc2FtZSBhcyBsaW5lYXIgaW50ZXJwb2xhdGlvbi4KKyAgICAgKgorICAgICAqIEByZXR1cm4gVGhlIG9wdGlvbmFsIGludGVycG9sYXRvciBmb3IgdGhpcyBLZXlmcmFtZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgSW50ZXJwb2xhdG9yIGdldEludGVycG9sYXRvcigpIHsKKyAgICAgICAgcmV0dXJuIG1JbnRlcnBvbGF0b3I7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgb3B0aW9uYWwgaW50ZXJwb2xhdG9yIGZvciB0aGlzIEtleWZyYW1lLiBBIHZhbHVlIG9mIDxjb2RlPm51bGw8L2NvZGU+IGluZGljYXRlcworICAgICAqIHRoYXQgdGhlcmUgaXMgbm8gaW50ZXJwb2xhdGlvbiwgd2hpY2ggaXMgdGhlIHNhbWUgYXMgbGluZWFyIGludGVycG9sYXRpb24uCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFRoZSBvcHRpb25hbCBpbnRlcnBvbGF0b3IgZm9yIHRoaXMgS2V5ZnJhbWUuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0SW50ZXJwb2xhdG9yKEludGVycG9sYXRvciBpbnRlcnBvbGF0b3IpIHsKKyAgICAgICAgbUludGVycG9sYXRvciA9IGludGVycG9sYXRvcjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSB0eXBlIG9mIGtleWZyYW1lLiBUaGlzIGluZm9ybWF0aW9uIGlzIHVzZWQgYnkgVmFsdWVBbmltYXRvciB0byBkZXRlcm1pbmUgdGhlIHR5cGUgb2YKKyAgICAgKiB7QGxpbmsgVHlwZUV2YWx1YXRvcn0gdG8gdXNlIHdoZW4gY2FsY3VsYXRpbmcgdmFsdWVzIGJldHdlZW4ga2V5ZnJhbWVzLiBUaGUgdHlwZSBpcyBiYXNlZAorICAgICAqIG9uIHRoZSB0eXBlIG9mIEtleWZyYW1lIGNyZWF0ZWQuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFRoZSB0eXBlIG9mIHRoZSB2YWx1ZSBzdG9yZWQgaW4gdGhlIEtleWZyYW1lLgorICAgICAqLworICAgIHB1YmxpYyBDbGFzcyBnZXRUeXBlKCkgeworICAgICAgICByZXR1cm4gbVZhbHVlVHlwZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgS2V5ZnJhbWUgY2xvbmUoKSB7CisgICAgICAgIEtleWZyYW1lIGtmQ2xvbmUgPSBuZXcgS2V5ZnJhbWUobUZyYWN0aW9uLCBtVmFsdWUsIG1WYWx1ZVR5cGUpOworICAgICAgICBrZkNsb25lLnNldEludGVycG9sYXRvcihtSW50ZXJwb2xhdG9yKTsKKyAgICAgICAgcmV0dXJuIGtmQ2xvbmU7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvYW5pbWF0aW9uL0tleWZyYW1lU2V0LmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9hbmltYXRpb24vS2V5ZnJhbWVTZXQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZjQ3YTE1Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvYW5pbWF0aW9uL0tleWZyYW1lU2V0LmphdmEKQEAgLTAsMCArMSw5OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5hbmltYXRpb247CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworCitpbXBvcnQgYW5kcm9pZC52aWV3LmFuaW1hdGlvbi5JbnRlcnBvbGF0b3I7CisKKy8qKgorICogVGhpcyBjbGFzcyBob2xkcyBhIGNvbGxlY3Rpb24gb2YgS2V5ZnJhbWUgb2JqZWN0cyBhbmQgaXMgY2FsbGVkIGJ5IFZhbHVlQW5pbWF0b3IgdG8gY2FsY3VsYXRlCisgKiB2YWx1ZXMgYmV0d2VlbiB0aG9zZSBrZXlmcmFtZXMgZm9yIGEgZ2l2ZW4gYW5pbWF0aW9uLiBUaGUgY2xhc3MgaW50ZXJuYWwgdG8gdGhlIGFuaW1hdGlvbgorICogcGFja2FnZSBiZWNhdXNlIGl0IGlzIGFuIGltcGxlbWVudGF0aW9uIGRldGFpbCBvZiBob3cgS2V5ZnJhbWVzIGFyZSBzdG9yZWQgYW5kIHVzZWQuCisgKi8KK2NsYXNzIEtleWZyYW1lU2V0IHsKKworICAgIHByaXZhdGUgaW50IG1OdW1LZXlmcmFtZXM7CisKKyAgICBBcnJheUxpc3Q8S2V5ZnJhbWU+IG1LZXlmcmFtZXM7CisKKyAgICBwdWJsaWMgS2V5ZnJhbWVTZXQoS2V5ZnJhbWUuLi4ga2V5ZnJhbWVzKSB7CisgICAgICAgIG1LZXlmcmFtZXMgPSBuZXcgQXJyYXlMaXN0PEtleWZyYW1lPigpOworICAgICAgICBmb3IgKEtleWZyYW1lIGtleWZyYW1lIDoga2V5ZnJhbWVzKSB7CisgICAgICAgICAgICBtS2V5ZnJhbWVzLmFkZChrZXlmcmFtZSk7CisgICAgICAgIH0KKyAgICAgICAgbU51bUtleWZyYW1lcyA9IG1LZXlmcmFtZXMuc2l6ZSgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIGFuaW1hdGVkIHZhbHVlLCBnaXZlbiB0aGUgZWxhcHNlZCBmcmFjdGlvbiBvZiB0aGUgYW5pbWF0aW9uIChpbnRlcnBvbGF0ZWQgYnkgdGhlCisgICAgICogYW5pbWF0aW9uJ3MgaW50ZXJwb2xhdG9yKSBhbmQgdGhlIGV2YWx1YXRvciB1c2VkIHRvIGNhbGN1bGF0ZSBpbi1iZXR3ZWVuIHZhbHVlcy4gVGhpcworICAgICAqIGZ1bmN0aW9uIG1hcHMgdGhlIGlucHV0IGZyYWN0aW9uIHRvIHRoZSBhcHByb3ByaWF0ZSBrZXlmcmFtZSBpbnRlcnZhbCBhbmQgYSBmcmFjdGlvbgorICAgICAqIGJldHdlZW4gdGhlbSBhbmQgcmV0dXJucyB0aGUgaW50ZXJwb2xhdGVkIHZhbHVlLiBOb3RlIHRoYXQgdGhlIGlucHV0IGZyYWN0aW9uIG1heSBmYWxsCisgICAgICogb3V0c2lkZSB0aGUgWzAtMV0gYm91bmRzLCBpZiB0aGUgYW5pbWF0aW9uJ3MgaW50ZXJwb2xhdG9yIG1hZGUgdGhhdCBoYXBwZW4gKGUuZy4sIGEKKyAgICAgKiBzcHJpbmcgaW50ZXJwb2xhdGlvbiB0aGF0IG1pZ2h0IHNlbmQgdGhlIGZyYWN0aW9uIHBhc3QgMS4wKS4gV2UgaGFuZGxlIHRoaXMgc2l0dWF0aW9uIGJ5CisgICAgICoganVzdCB1c2luZyB0aGUgdHdvIGtleWZyYW1lcyBhdCB0aGUgYXBwcm9wcmlhdGUgZW5kIHdoZW4gdGhlIHZhbHVlIGlzIG91dHNpZGUgdGhvc2UgYm91bmRzLgorICAgICAqCisgICAgICogQHBhcmFtIGZyYWN0aW9uIFRoZSBlbGFwc2VkIGZyYWN0aW9uIG9mIHRoZSBhbmltYXRpb24KKyAgICAgKiBAcGFyYW0gZXZhbHVhdG9yIFRoZSB0eXBlIGV2YWx1YXRvciB0byB1c2Ugd2hlbiBjYWxjdWxhdGluZyB0aGUgaW50ZXJwb2xhdGVkIHZhbHVlcy4KKyAgICAgKiBAcmV0dXJuIFRoZSBhbmltYXRlZCB2YWx1ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgT2JqZWN0IGdldFZhbHVlKGZsb2F0IGZyYWN0aW9uLCBUeXBlRXZhbHVhdG9yIGV2YWx1YXRvcikgeworICAgICAgICAvLyBUT0RPOiBzcGVjaWFsLWNhc2UgMi1rZXlmcmFtZSBjb21tb24gY2FzZQorCisgICAgICAgIGlmIChmcmFjdGlvbiA8PSAwZikgeworICAgICAgICAgICAgZmluYWwgS2V5ZnJhbWUgcHJldktleWZyYW1lID0gbUtleWZyYW1lcy5nZXQoMCk7CisgICAgICAgICAgICBmaW5hbCBLZXlmcmFtZSBuZXh0S2V5ZnJhbWUgPSBtS2V5ZnJhbWVzLmdldCgxKTsKKyAgICAgICAgICAgIGZpbmFsIEludGVycG9sYXRvciBpbnRlcnBvbGF0b3IgPSBuZXh0S2V5ZnJhbWUuZ2V0SW50ZXJwb2xhdG9yKCk7CisgICAgICAgICAgICBpZiAoaW50ZXJwb2xhdG9yICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBmcmFjdGlvbiA9IGludGVycG9sYXRvci5nZXRJbnRlcnBvbGF0aW9uKGZyYWN0aW9uKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZsb2F0IGludGVydmFsRnJhY3Rpb24gPSAoZnJhY3Rpb24gLSBwcmV2S2V5ZnJhbWUuZ2V0RnJhY3Rpb24oKSkgLworICAgICAgICAgICAgICAgIChuZXh0S2V5ZnJhbWUuZ2V0RnJhY3Rpb24oKSAtIHByZXZLZXlmcmFtZS5nZXRGcmFjdGlvbigpKTsKKyAgICAgICAgICAgIHJldHVybiBldmFsdWF0b3IuZXZhbHVhdGUoaW50ZXJ2YWxGcmFjdGlvbiwgcHJldktleWZyYW1lLmdldFZhbHVlKCksCisgICAgICAgICAgICAgICAgICAgIG5leHRLZXlmcmFtZS5nZXRWYWx1ZSgpKTsKKyAgICAgICAgfSBlbHNlIGlmIChmcmFjdGlvbiA+PSAxZikgeworICAgICAgICAgICAgZmluYWwgS2V5ZnJhbWUgcHJldktleWZyYW1lID0gbUtleWZyYW1lcy5nZXQobU51bUtleWZyYW1lcyAtIDIpOworICAgICAgICAgICAgZmluYWwgS2V5ZnJhbWUgbmV4dEtleWZyYW1lID0gbUtleWZyYW1lcy5nZXQobU51bUtleWZyYW1lcyAtIDEpOworICAgICAgICAgICAgZmluYWwgSW50ZXJwb2xhdG9yIGludGVycG9sYXRvciA9IG5leHRLZXlmcmFtZS5nZXRJbnRlcnBvbGF0b3IoKTsKKyAgICAgICAgICAgIGlmIChpbnRlcnBvbGF0b3IgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGZyYWN0aW9uID0gaW50ZXJwb2xhdG9yLmdldEludGVycG9sYXRpb24oZnJhY3Rpb24pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZmxvYXQgaW50ZXJ2YWxGcmFjdGlvbiA9IChmcmFjdGlvbiAtIHByZXZLZXlmcmFtZS5nZXRGcmFjdGlvbigpKSAvCisgICAgICAgICAgICAgICAgKG5leHRLZXlmcmFtZS5nZXRGcmFjdGlvbigpIC0gcHJldktleWZyYW1lLmdldEZyYWN0aW9uKCkpOworICAgICAgICAgICAgcmV0dXJuIGV2YWx1YXRvci5ldmFsdWF0ZShpbnRlcnZhbEZyYWN0aW9uLCBwcmV2S2V5ZnJhbWUuZ2V0VmFsdWUoKSwKKyAgICAgICAgICAgICAgICAgICAgbmV4dEtleWZyYW1lLmdldFZhbHVlKCkpOworICAgICAgICB9CisgICAgICAgIEtleWZyYW1lIHByZXZLZXlmcmFtZSA9IG1LZXlmcmFtZXMuZ2V0KDApOworICAgICAgICBmb3IgKGludCBpID0gMTsgaSA8IG1OdW1LZXlmcmFtZXM7ICsraSkgeworICAgICAgICAgICAgS2V5ZnJhbWUgbmV4dEtleWZyYW1lID0gbUtleWZyYW1lcy5nZXQoaSk7CisgICAgICAgICAgICBpZiAoZnJhY3Rpb24gPCBuZXh0S2V5ZnJhbWUuZ2V0RnJhY3Rpb24oKSkgeworICAgICAgICAgICAgICAgIGZpbmFsIEludGVycG9sYXRvciBpbnRlcnBvbGF0b3IgPSBuZXh0S2V5ZnJhbWUuZ2V0SW50ZXJwb2xhdG9yKCk7CisgICAgICAgICAgICAgICAgaWYgKGludGVycG9sYXRvciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGZyYWN0aW9uID0gaW50ZXJwb2xhdG9yLmdldEludGVycG9sYXRpb24oZnJhY3Rpb24pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBmbG9hdCBpbnRlcnZhbEZyYWN0aW9uID0gKGZyYWN0aW9uIC0gcHJldktleWZyYW1lLmdldEZyYWN0aW9uKCkpIC8KKyAgICAgICAgICAgICAgICAgICAgKG5leHRLZXlmcmFtZS5nZXRGcmFjdGlvbigpIC0gcHJldktleWZyYW1lLmdldEZyYWN0aW9uKCkpOworICAgICAgICAgICAgICAgIHJldHVybiBldmFsdWF0b3IuZXZhbHVhdGUoaW50ZXJ2YWxGcmFjdGlvbiwgcHJldktleWZyYW1lLmdldFZhbHVlKCksCisgICAgICAgICAgICAgICAgICAgICAgICBuZXh0S2V5ZnJhbWUuZ2V0VmFsdWUoKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwcmV2S2V5ZnJhbWUgPSBuZXh0S2V5ZnJhbWU7CisgICAgICAgIH0KKyAgICAgICAgLy8gc2hvdWxkbid0IGdldCBoZXJlCisgICAgICAgIHJldHVybiBtS2V5ZnJhbWVzLmdldChtTnVtS2V5ZnJhbWVzIC0gMSkuZ2V0VmFsdWUoKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9hbmltYXRpb24vTGF5b3V0VHJhbnNpdGlvbi5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvYW5pbWF0aW9uL0xheW91dFRyYW5zaXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OWFkNjdlCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvYW5pbWF0aW9uL0xheW91dFRyYW5zaXRpb24uamF2YQpAQCAtMCwwICsxLDc4MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5hbmltYXRpb247CisKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlld0dyb3VwOworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3VHJlZU9ic2VydmVyOworaW1wb3J0IGFuZHJvaWQudmlldy5hbmltYXRpb24uQWNjZWxlcmF0ZURlY2VsZXJhdGVJbnRlcnBvbGF0b3I7CitpbXBvcnQgYW5kcm9pZC52aWV3LmFuaW1hdGlvbi5EZWNlbGVyYXRlSW50ZXJwb2xhdG9yOworaW1wb3J0IGFuZHJvaWQudmlldy5hbmltYXRpb24uSW50ZXJwb2xhdG9yOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworLyoqCisgKiBUaGlzIGNsYXNzIGVuYWJsZXMgYXV0b21hdGljIGFuaW1hdGlvbnMgb24gbGF5b3V0IGNoYW5nZXMgaW4gVmlld0dyb3VwIG9iamVjdHMuIFRvIGVuYWJsZQorICogdHJhbnNpdGlvbnMgZm9yIGEgbGF5b3V0IGNvbnRhaW5lciwgY3JlYXRlIGEgTGF5b3V0VHJhbnNpdGlvbiBvYmplY3QgYW5kIHNldCBpdCBvbiBhbnkKKyAqIFZpZXdHcm91cCBieSBjYWxsaW5nIHtAbGluayBWaWV3R3JvdXAjc2V0TGF5b3V0VHJhbnNpdGlvbihMYXlvdXRUcmFuc2l0aW9uKX0uIFRoaXMgd2lsbCBjYXVzZQorICogZGVmYXVsdCBhbmltYXRpb25zIHRvIHJ1biB3aGVuZXZlciBpdGVtcyBhcmUgYWRkZWQgdG8gb3IgcmVtb3ZlZCBmcm9tIHRoYXQgY29udGFpbmVyLiBUbyBzcGVjaWZ5CisgKiBjdXN0b20gYW5pbWF0aW9ucywgdXNlIHRoZSB7QGxpbmsgTGF5b3V0VHJhbnNpdGlvbiNzZXRBbmltYXRvcihpbnQsIEFuaW1hdG9yKQorICogc2V0QW5pbWF0b3IoKX0gbWV0aG9kLgorICoKKyAqIDxwPk9uZSBvZiB0aGUgY29yZSBjb25jZXB0cyBvZiB0aGVzZSB0cmFuc2l0aW9uIGFuaW1hdGlvbnMgaXMgdGhhdCB0aGVyZSBhcmUgdHdvIGNvcmUKKyAqIGNoYW5nZXMgdGhhdCBjYXVzZSB0aGUgdHJhbnNpdGlvbiBhbmQgZm91ciBkaWZmZXJlbnQgYW5pbWF0aW9ucyB0aGF0IHJ1biBiZWNhdXNlIG9mCisgKiB0aG9zZSBjaGFuZ2VzLiBUaGUgY2hhbmdlcyB0aGF0IHRyaWdnZXIgdGhlIHRyYW5zaXRpb24gYXJlIGl0ZW1zIGJlaW5nIGFkZGVkIHRvIGEgY29udGFpbmVyCisgKiAocmVmZXJyZWQgdG8gYXMgYW4gImFwcGVhcmluZyIgdHJhbnNpdGlvbikgb3IgcmVtb3ZlZCBmcm9tIGEgY29udGFpbmVyIChhbHNvIGtub3duIGFzCisgKiAiZGlzYXBwZWFyaW5nIikuIFRoZSBhbmltYXRpb25zIHRoYXQgcnVuIGR1ZSB0byB0aG9zZSBldmVudHMgYXJlIG9uZSB0aGF0IGFuaW1hdGVzCisgKiBpdGVtcyBiZWluZyBhZGRlZCwgb25lIHRoYXQgYW5pbWF0ZXMgaXRlbXMgYmVpbmcgcmVtb3ZlZCwgYW5kIHR3byB0aGF0IGFuaW1hdGUgdGhlIG90aGVyCisgKiBpdGVtcyBpbiB0aGUgY29udGFpbmVyIHRoYXQgY2hhbmdlIGR1ZSB0byB0aGUgYWRkL3JlbW92ZSBvY2N1cnJlbmNlLiBVc2VycyBvZgorICogdGhlIHRyYW5zaXRpb24gbWF5IHdhbnQgZGlmZmVyZW50IGFuaW1hdGlvbnMgZm9yIHRoZSBjaGFuZ2luZyBpdGVtcyBkZXBlbmRpbmcgb24gd2hldGhlcgorICogdGhleSBhcmUgY2hhbmdpbmcgZHVlIHRvIGFuYXBwZWFyaW5nIG9yIGRpc2FwcGVhcmluZyBldmVudCwgc28gdGhlcmUgaXMgb25lIGFuaW1hdGlvbiBmb3IKKyAqIGVhY2ggb2YgdGhlc2UgdmFyaWF0aW9ucyBvZiB0aGUgY2hhbmdpbmcgZXZlbnQuIE1vc3Qgb2YgdGhlIEFQSSBvZiB0aGlzIGNsYXNzIGlzIGNvbmNlcm5lZAorICogd2l0aCBzZXR0aW5nIHVwIHRoZSBiYXNpYyBwcm9wZXJ0aWVzIG9mIHRoZSBhbmltYXRpb25zIHVzZWQgaW4gdGhlc2UgZm91ciBzaXR1YXRpb25zLAorICogb3Igd2l0aCBzZXR0aW5nIHVwIGN1c3RvbSBhbmltYXRpb25zIGZvciBhbnkgb3IgYWxsIG9mIHRoZSBmb3VyLjwvcD4KKyAqCisgKiA8cD5UaGUgYW5pbWF0aW9ucyBzcGVjaWZpZWQgZm9yIHRoZSB0cmFuc2l0aW9uLCBib3RoIHRoZSBkZWZhdWx0cyBhbmQgYW55IGN1c3RvbSBhbmltYXRpb25zCisgKiBzZXQgb24gdGhlIHRyYW5zaXRpb24gb2JqZWN0LCBhcmUgdGVtcGxhdGVzIG9ubHkuIFRoYXQgaXMsIHRoZXNlIGFuaW1hdGlvbnMgZXhpc3QgdG8gaG9sZCB0aGUKKyAqIGJhc2ljIGFuaW1hdGlvbiBwcm9wZXJ0aWVzLCBzdWNoIGFzIHRoZSBkdXJhdGlvbiwgc3RhcnQgZGVsYXksIGFuZCBwcm9wZXJ0aWVzIGJlaW5nIGFuaW1hdGVkLgorICogQnV0IHRoZSBhY3R1YWwgdGFyZ2V0IG9iamVjdCwgYXMgd2VsbCBhcyB0aGUgc3RhcnQgYW5kIGVuZCB2YWx1ZXMgZm9yIHRob3NlIHByb3BlcnRpZXMsIGFyZQorICogc2V0IGF1dG9tYXRpY2FsbHkgaW4gdGhlIHByb2Nlc3Mgb2Ygc2V0dGluZyB1cCB0aGUgdHJhbnNpdGlvbiBlYWNoIHRpbWUgaXQgcnVucy4gRWFjaCBvZiB0aGUKKyAqIGFuaW1hdGlvbnMgaXMgY2xvbmVkIGZyb20gdGhlIG9yaWdpbmFsIGNvcHkgYW5kIHRoZSBjbG9uZSBpcyB0aGVuIHBvcHVsYXRlZCB3aXRoIHRoZSBkeW5hbWljCisgKiB2YWx1ZXMgb2YgdGhlIHRhcmdldCBiZWluZyBhbmltYXRlZCAoc3VjaCBhcyBvbmUgb2YgdGhlIGl0ZW1zIGluIGEgbGF5b3V0IGNvbnRhaW5lciB0aGF0IGlzCisgKiBtb3ZpbmcgYXMgYSByZXN1bHQgb2YgdGhlIGxheW91dCBldmVudCkgYXMgd2VsbCBhcyB0aGUgdmFsdWVzIHRoYXQgYXJlIGNoYW5naW5nIChzdWNoIGFzIHRoZQorICogcG9zaXRpb24gYW5kIHNpemUgb2YgdGhhdCBvYmplY3QpLiBUaGUgYWN0dWFsIHZhbHVlcyB0aGF0IGFyZSBwdXNoZWQgdG8gZWFjaCBhbmltYXRpb24KKyAqIGRlcGVuZHMgb24gd2hhdCBwcm9wZXJ0aWVzIGFyZSBzcGVjaWZpZWQgZm9yIHRoZSBhbmltYXRpb24uIEZvciBleGFtcGxlLCB0aGUgZGVmYXVsdAorICogQ0hBTkdFX0FQUEVBUklORyBhbmltYXRpb24gYW5pbWF0ZXMgPGNvZGU+bGVmdDwvY29kZT4sIDxjb2RlPnRvcDwvY29kZT4sIDxjb2RlPnJpZ2h0PC9jb2RlPiwKKyAqIGFuZCA8Y29kZT5ib3R0b208L2NvZGU+LiBWYWx1ZXMgZm9yIHRoZXNlIHByb3BlcnRpZXMgYXJlIHVwZGF0ZWQgd2l0aCB0aGUgcHJlLSBhbmQgcG9zdC1sYXlvdXQKKyAqIHZhbHVlcyB3aGVuIHRoZSB0cmFuc2l0aW9uIGJlZ2lucy4gQ3VzdG9tIGFuaW1hdGlvbnMgd2lsbCBiZSBzaW1pbGFybHkgcG9wdWxhdGVkIHdpdGgKKyAqIHRoZSB0YXJnZXQgYW5kIHZhbHVlcyBiZWluZyBhbmltYXRlZCwgYXNzdW1pbmcgdGhleSB1c2UgT2JqZWN0QW5pbWF0b3Igb2JqZWN0cyB3aXRoCisgKiBwcm9wZXJ0eSBuYW1lcyB0aGF0IGFyZSBrbm93biBvbiB0aGUgdGFyZ2V0IG9iamVjdC48L3A+CisgKi8KK3B1YmxpYyBjbGFzcyBMYXlvdXRUcmFuc2l0aW9uIHsKKworICAgIC8qKgorICAgICAqIEEgZmxhZyBpbmRpY2F0aW5nIHRoZSBhbmltYXRpb24gdGhhdCBydW5zIG9uIHRob3NlIGl0ZW1zIHRoYXQgYXJlIGNoYW5naW5nCisgICAgICogZHVlIHRvIGEgbmV3IGl0ZW0gYXBwZWFyaW5nIGluIHRoZSBjb250YWluZXIuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ0hBTkdFX0FQUEVBUklORyA9IDA7CisKKyAgICAvKioKKyAgICAgKiBBIGZsYWcgaW5kaWNhdGluZyB0aGUgYW5pbWF0aW9uIHRoYXQgcnVucyBvbiB0aG9zZSBpdGVtcyB0aGF0IGFyZSBjaGFuZ2luZworICAgICAqIGR1ZSB0byBhIG5ldyBpdGVtIGRpc2FwcGVhcmluZyBmcm9tIHRoZSBjb250YWluZXIuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ0hBTkdFX0RJU0FQUEVBUklORyA9IDE7CisKKyAgICAvKioKKyAgICAgKiBBIGZsYWcgaW5kaWNhdGluZyB0aGUgYW5pbWF0aW9uIHRoYXQgcnVucyBvbiB0aG9zZSBpdGVtcyB0aGF0IGFyZSBjaGFuZ2luZworICAgICAqIGR1ZSB0byBhIG5ldyBpdGVtIGFwcGVhcmluZyBpbiB0aGUgY29udGFpbmVyLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFQUEVBUklORyA9IDI7CisKKyAgICAvKioKKyAgICAgKiBBIGZsYWcgaW5kaWNhdGluZyB0aGUgYW5pbWF0aW9uIHRoYXQgcnVucyBvbiB0aG9zZSBpdGVtcyB0aGF0IGFyZSBjaGFuZ2luZworICAgICAqIGR1ZSB0byBhIG5ldyBpdGVtIGFwcGVhcmluZyBpbiB0aGUgY29udGFpbmVyLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERJU0FQUEVBUklORyA9IDM7CisKKyAgICAvKioKKyAgICAgKiBUaGVzZSB2YXJpYWJsZXMgaG9sZCB0aGUgYW5pbWF0aW9ucyB0aGF0IGFyZSBjdXJyZW50bHkgdXNlZCB0byBydW4gdGhlIHRyYW5zaXRpb24gZWZmZWN0cy4KKyAgICAgKiBUaGVzZSBhbmltYXRpb25zIGFyZSBzZXQgdG8gZGVmYXVsdHMsIGJ1dCBjYW4gYmUgY2hhbmdlZCB0byBjdXN0b20gYW5pbWF0aW9ucyBieQorICAgICAqIGNhbGxzIHRvIHNldEFuaW1hdG9yKCkuCisgICAgICovCisgICAgcHJpdmF0ZSBBbmltYXRvciBtRGlzYXBwZWFyaW5nQW5pbSA9IG51bGw7CisgICAgcHJpdmF0ZSBBbmltYXRvciBtQXBwZWFyaW5nQW5pbSA9IG51bGw7CisgICAgcHJpdmF0ZSBBbmltYXRvciBtQ2hhbmdpbmdBcHBlYXJpbmdBbmltID0gbnVsbDsKKyAgICBwcml2YXRlIEFuaW1hdG9yIG1DaGFuZ2luZ0Rpc2FwcGVhcmluZ0FuaW0gPSBudWxsOworCisgICAgLyoqCisgICAgICogVGhlc2UgYXJlIHRoZSBkZWZhdWx0IGFuaW1hdGlvbnMsIGRlZmluZWQgaW4gdGhlIGNvbnN0cnVjdG9yLCB0aGF0IHdpbGwgYmUgdXNlZAorICAgICAqIHVubGVzcyB0aGUgdXNlciBzcGVjaWZpZXMgY3VzdG9tIGFuaW1hdGlvbnMuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgT2JqZWN0QW5pbWF0b3IgZGVmYXVsdENoYW5nZUluOworICAgIHByaXZhdGUgc3RhdGljIE9iamVjdEFuaW1hdG9yIGRlZmF1bHRDaGFuZ2VPdXQ7CisgICAgcHJpdmF0ZSBzdGF0aWMgT2JqZWN0QW5pbWF0b3IgZGVmYXVsdEZhZGVJbjsKKyAgICBwcml2YXRlIHN0YXRpYyBPYmplY3RBbmltYXRvciBkZWZhdWx0RmFkZU91dDsKKworICAgIC8qKgorICAgICAqIFRoZSBkZWZhdWx0IGR1cmF0aW9uIHVzZWQgYnkgYWxsIGFuaW1hdGlvbnMuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgbG9uZyBERUZBVUxUX0RVUkFUSU9OID0gMzAwOworCisgICAgLyoqCisgICAgICogVGhlIGR1cmF0aW9ucyBvZiB0aGUgZm91ciBkaWZmZXJlbnQgYW5pbWF0aW9ucworICAgICAqLworICAgIHByaXZhdGUgbG9uZyBtQ2hhbmdpbmdBcHBlYXJpbmdEdXJhdGlvbiA9IERFRkFVTFRfRFVSQVRJT047CisgICAgcHJpdmF0ZSBsb25nIG1DaGFuZ2luZ0Rpc2FwcGVhcmluZ0R1cmF0aW9uID0gREVGQVVMVF9EVVJBVElPTjsKKyAgICBwcml2YXRlIGxvbmcgbUFwcGVhcmluZ0R1cmF0aW9uID0gREVGQVVMVF9EVVJBVElPTjsKKyAgICBwcml2YXRlIGxvbmcgbURpc2FwcGVhcmluZ0R1cmF0aW9uID0gREVGQVVMVF9EVVJBVElPTjsKKworICAgIC8qKgorICAgICAqIFRoZSBzdGFydCBkZWxheXMgb2YgdGhlIGZvdXIgZGlmZmVyZW50IGFuaW1hdGlvbnMuIE5vdGUgdGhhdCB0aGUgZGVmYXVsdCBiZWhhdmlvciBvZgorICAgICAqIHRoZSBhcHBlYXJpbmcgaXRlbSBpcyB0aGUgZGVmYXVsdCBkdXJhdGlvbiwgc2luY2UgaXQgc2hvdWxkIHdhaXQgZm9yIHRoZSBpdGVtcyB0byBtb3ZlCisgICAgICogYmVmb3JlIGZhZGluZyBpdC4gU2FtZSBmb3IgdGhlIGNoYW5naW5nIGFuaW1hdGlvbiB3aGVuIGRpc2FwcGVhcmluZzsgaXQgd2FpdHMgZm9yIHRoZSBpdGVtCisgICAgICogdG8gZmFkZSBvdXQgYmVmb3JlIG1vdmluZyB0aGUgb3RoZXIgaXRlbXMuCisgICAgICovCisgICAgcHJpdmF0ZSBsb25nIG1BcHBlYXJpbmdEZWxheSA9IERFRkFVTFRfRFVSQVRJT047CisgICAgcHJpdmF0ZSBsb25nIG1EaXNhcHBlYXJpbmdEZWxheSA9IDA7CisgICAgcHJpdmF0ZSBsb25nIG1DaGFuZ2luZ0FwcGVhcmluZ0RlbGF5ID0gMDsKKyAgICBwcml2YXRlIGxvbmcgbUNoYW5naW5nRGlzYXBwZWFyaW5nRGVsYXkgPSBERUZBVUxUX0RVUkFUSU9OOworCisgICAgLyoqCisgICAgICogVGhlIGludGVyLWFuaW1hdGlvbiBkZWxheXMgdXNlZCBvbiB0aGUgdHdvIGNoYW5naW5nIGFuaW1hdGlvbnMKKyAgICAgKi8KKyAgICBwcml2YXRlIGxvbmcgbUNoYW5naW5nQXBwZWFyaW5nU3RhZ2dlciA9IDA7CisgICAgcHJpdmF0ZSBsb25nIG1DaGFuZ2luZ0Rpc2FwcGVhcmluZ1N0YWdnZXIgPSAwOworCisgICAgLyoqCisgICAgICogVGhlIGRlZmF1bHQgaW50ZXJwb2xhdG9ycyB1c2VkIGZvciB0aGUgYW5pbWF0aW9ucworICAgICAqLworICAgIHByaXZhdGUgSW50ZXJwb2xhdG9yIG1BcHBlYXJpbmdJbnRlcnBvbGF0b3IgPSBuZXcgQWNjZWxlcmF0ZURlY2VsZXJhdGVJbnRlcnBvbGF0b3IoKTsKKyAgICBwcml2YXRlIEludGVycG9sYXRvciBtRGlzYXBwZWFyaW5nSW50ZXJwb2xhdG9yID0gbmV3IEFjY2VsZXJhdGVEZWNlbGVyYXRlSW50ZXJwb2xhdG9yKCk7CisgICAgcHJpdmF0ZSBJbnRlcnBvbGF0b3IgbUNoYW5naW5nQXBwZWFyaW5nSW50ZXJwb2xhdG9yID0gbmV3IERlY2VsZXJhdGVJbnRlcnBvbGF0b3IoKTsKKyAgICBwcml2YXRlIEludGVycG9sYXRvciBtQ2hhbmdpbmdEaXNhcHBlYXJpbmdJbnRlcnBvbGF0b3IgPSBuZXcgRGVjZWxlcmF0ZUludGVycG9sYXRvcigpOworCisgICAgLyoqCisgICAgICogVGhpcyBoYXNobWFwIGlzIHVzZWQgdG8gc3RvcmUgdGhlIGFuaW1hdGlvbnMgdGhhdCBhcmUgY3VycmVudGx5IHJ1bm5pbmcgYXMgcGFydCBvZgorICAgICAqIHRoZSB0cmFuc2l0aW9uLiBUaGUgcmVhc29uIGZvciB0aGlzIGlzIHRoYXQgYSBmdXJ0aGVyIGxheW91dCBldmVudCBzaG91bGQgY2F1c2UKKyAgICAgKiBleGlzdGluZyBhbmltYXRpb25zIHRvIHN0b3Agd2hlcmUgdGhleSBhcmUgcHJpb3IgdG8gc3RhcnRpbmcgbmV3IGFuaW1hdGlvbnMuIFNvCisgICAgICogd2UgY2FjaGUgYWxsIG9mIHRoZSBjdXJyZW50IGFuaW1hdGlvbnMgaW4gdGhpcyBtYXAgZm9yIHBvc3NpYmxlIGNhbmNlbGxhdGlvbiBvbgorICAgICAqIGFub3RoZXIgbGF5b3V0IGV2ZW50LgorICAgICAqLworICAgIHByaXZhdGUgSGFzaE1hcDxWaWV3LCBBbmltYXRvcj4gY3VycmVudEFuaW1hdGlvbnMgPSBuZXcgSGFzaE1hcDxWaWV3LCBBbmltYXRvcj4oKTsKKworICAgIC8qKgorICAgICAqIFRoaXMgaGFzaG1hcCBpcyB1c2VkIHRvIHRyYWNrIHRoZSBsaXN0ZW5lcnMgdGhhdCBoYXZlIGJlZW4gYWRkZWQgdG8gdGhlIGNoaWxkcmVuIG9mCisgICAgICogYSBjb250YWluZXIuIFdoZW4gYSBsYXlvdXQgY2hhbmdlIG9jY3VycywgYW4gYW5pbWF0aW9uIGlzIGNyZWF0ZWQgZm9yIGVhY2ggVmlldywgc28gdGhhdAorICAgICAqIHRoZSBwcmUtbGF5b3V0IHZhbHVlcyBjYW4gYmUgY2FjaGVkIGluIHRoYXQgYW5pbWF0aW9uLiBUaGVuIGEgbGlzdGVuZXIgaXMgYWRkZWQgdG8gdGhlCisgICAgICogdmlldyB0byBzZWUgd2hldGhlciB0aGUgbGF5b3V0IGNoYW5nZXMgdGhlIGJvdW5kcyBvZiB0aGF0IHZpZXcuIElmIHNvLCB0aGUgYW5pbWF0aW9uCisgICAgICogaXMgc2V0IHdpdGggdGhlIGZpbmFsIHZhbHVlcyBhbmQgdGhlbiBydW4uIElmIG5vdCwgdGhlIGFuaW1hdGlvbiBpcyBub3Qgc3RhcnRlZC4gV2hlbgorICAgICAqIHRoZSBwcm9jZXNzIG9mIHNldHRpbmcgdXAgYW5kIHJ1bm5pbmcgYWxsIGFwcHJvcHJpYXRlIGFuaW1hdGlvbnMgaXMgZG9uZSwgd2UgbmVlZCB0bworICAgICAqIHJlbW92ZSB0aGVzZSBsaXN0ZW5lcnMgYW5kIGNsZWFyIG91dCB0aGUgbWFwLgorICAgICAqLworICAgIHByaXZhdGUgSGFzaE1hcDxWaWV3LCBWaWV3Lk9uTGF5b3V0Q2hhbmdlTGlzdGVuZXI+IGxheW91dENoYW5nZUxpc3RlbmVyTWFwID0KKyAgICAgICAgICAgIG5ldyBIYXNoTWFwPFZpZXcsIFZpZXcuT25MYXlvdXRDaGFuZ2VMaXN0ZW5lcj4oKTsKKworICAgIC8qKgorICAgICAqIFVzZWQgdG8gdHJhY2sgdGhlIGN1cnJlbnQgZGVsYXkgYmVpbmcgYXNzaWduZWQgdG8gc3VjY2Vzc2l2ZSBhbmltYXRpb25zIGFzIHRoZXkgYXJlCisgICAgICogc3RhcnRlZC4gVGhpcyB2YWx1ZSBpcyBpbmNyZW1lbnRlZCBmb3IgZWFjaCBuZXcgYW5pbWF0aW9uLCB0aGVuIHplcm9lZCBiZWZvcmUgdGhlIG5leHQKKyAgICAgKiB0cmFuc2l0aW9uIGJlZ2lucy4KKyAgICAgKi8KKyAgICBwcml2YXRlIGxvbmcgc3RhZ2dlckRlbGF5OworCisgICAgLyoqCisgICAgICogVGhlIHNldCBvZiBsaXN0ZW5lcnMgdGhhdCBzaG91bGQgYmUgbm90aWZpZWQgd2hlbiBBUFBFQVJJTkcvRElTQVBQRUFSSU5HIHRyYW5zaXRpb25zCisgICAgICogc3RhcnQgYW5kIGVuZC4KKyAgICAgKi8KKyAgICBwcml2YXRlIEFycmF5TGlzdDxUcmFuc2l0aW9uTGlzdGVuZXI+IG1MaXN0ZW5lcnM7CisKKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdHMgYSBMYXlvdXRUcmFuc2l0aW9uIG9iamVjdC4gQnkgZGVmYXVsdCwgdGhlIG9iamVjdCB3aWxsIGxpc3RlbiB0byBsYXlvdXQKKyAgICAgKiBldmVudHMgb24gYW55IFZpZXdHcm91cCB0aGF0IGl0IGlzIHNldCBvbiBhbmQgd2lsbCBydW4gZGVmYXVsdCBhbmltYXRpb25zIGZvciBlYWNoCisgICAgICogdHlwZSBvZiBsYXlvdXQgZXZlbnQuCisgICAgICovCisgICAgcHVibGljIExheW91dFRyYW5zaXRpb24oKSB7CisgICAgICAgIGlmIChkZWZhdWx0Q2hhbmdlSW4gPT0gbnVsbCkgeworICAgICAgICAgICAgLy8gImxlZnQiIGlzIGp1c3QgYSBwbGFjZWhvbGRlcjsgd2UnbGwgcHV0IHJlYWwgcHJvcGVydGllcy92YWx1ZXMgaW4gd2hlbiBuZWVkZWQKKyAgICAgICAgICAgIFByb3BlcnR5VmFsdWVzSG9sZGVyPEludGVnZXI+IHB2aExlZnQgPSBuZXcgUHJvcGVydHlWYWx1ZXNIb2xkZXI8SW50ZWdlcj4oImxlZnQiLCAwLCAxKTsKKyAgICAgICAgICAgIFByb3BlcnR5VmFsdWVzSG9sZGVyPEludGVnZXI+IHB2aFRvcCA9IG5ldyBQcm9wZXJ0eVZhbHVlc0hvbGRlcjxJbnRlZ2VyPigidG9wIiwgMCwgMSk7CisgICAgICAgICAgICBQcm9wZXJ0eVZhbHVlc0hvbGRlcjxJbnRlZ2VyPiBwdmhSaWdodCA9IG5ldyBQcm9wZXJ0eVZhbHVlc0hvbGRlcjxJbnRlZ2VyPigicmlnaHQiLCAwLCAxKTsKKyAgICAgICAgICAgIFByb3BlcnR5VmFsdWVzSG9sZGVyPEludGVnZXI+IHB2aEJvdHRvbSA9IG5ldyBQcm9wZXJ0eVZhbHVlc0hvbGRlcjxJbnRlZ2VyPigiYm90dG9tIiwgMCwgMSk7CisgICAgICAgICAgICBkZWZhdWx0Q2hhbmdlSW4gPSBuZXcgT2JqZWN0QW5pbWF0b3I8UHJvcGVydHlWYWx1ZXNIb2xkZXI+KERFRkFVTFRfRFVSQVRJT04sIHRoaXMsCisgICAgICAgICAgICAgICAgICAgIHB2aExlZnQsIHB2aFRvcCwgcHZoUmlnaHQsIHB2aEJvdHRvbSk7CisgICAgICAgICAgICBkZWZhdWx0Q2hhbmdlSW4uc2V0U3RhcnREZWxheShtQ2hhbmdpbmdBcHBlYXJpbmdEZWxheSk7CisgICAgICAgICAgICBkZWZhdWx0Q2hhbmdlSW4uc2V0SW50ZXJwb2xhdG9yKG1DaGFuZ2luZ0FwcGVhcmluZ0ludGVycG9sYXRvcik7CisgICAgICAgICAgICBkZWZhdWx0Q2hhbmdlT3V0ID0gZGVmYXVsdENoYW5nZUluLmNsb25lKCk7CisgICAgICAgICAgICBkZWZhdWx0Q2hhbmdlT3V0LnNldFN0YXJ0RGVsYXkobUNoYW5naW5nRGlzYXBwZWFyaW5nRGVsYXkpOworICAgICAgICAgICAgZGVmYXVsdENoYW5nZU91dC5zZXRJbnRlcnBvbGF0b3IobUNoYW5naW5nRGlzYXBwZWFyaW5nSW50ZXJwb2xhdG9yKTsKKyAgICAgICAgICAgIGRlZmF1bHRGYWRlSW4gPQorICAgICAgICAgICAgICAgICAgICBuZXcgT2JqZWN0QW5pbWF0b3I8RmxvYXQ+KERFRkFVTFRfRFVSQVRJT04sIHRoaXMsICJhbHBoYSIsIDBmLCAxZik7CisgICAgICAgICAgICBkZWZhdWx0RmFkZUluLnNldFN0YXJ0RGVsYXkobUFwcGVhcmluZ0RlbGF5KTsKKyAgICAgICAgICAgIGRlZmF1bHRGYWRlSW4uc2V0SW50ZXJwb2xhdG9yKG1BcHBlYXJpbmdJbnRlcnBvbGF0b3IpOworICAgICAgICAgICAgZGVmYXVsdEZhZGVPdXQgPQorICAgICAgICAgICAgICAgICAgICBuZXcgT2JqZWN0QW5pbWF0b3I8RmxvYXQ+KERFRkFVTFRfRFVSQVRJT04sIHRoaXMsICJhbHBoYSIsIDFmLCAwZik7CisgICAgICAgICAgICBkZWZhdWx0RmFkZU91dC5zZXRTdGFydERlbGF5KG1EaXNhcHBlYXJpbmdEZWxheSk7CisgICAgICAgICAgICBkZWZhdWx0RmFkZU91dC5zZXRJbnRlcnBvbGF0b3IobURpc2FwcGVhcmluZ0ludGVycG9sYXRvcik7CisgICAgICAgIH0KKyAgICAgICAgbUNoYW5naW5nQXBwZWFyaW5nQW5pbSA9IGRlZmF1bHRDaGFuZ2VJbjsKKyAgICAgICAgbUNoYW5naW5nRGlzYXBwZWFyaW5nQW5pbSA9IGRlZmF1bHRDaGFuZ2VPdXQ7CisgICAgICAgIG1BcHBlYXJpbmdBbmltID0gZGVmYXVsdEZhZGVJbjsKKyAgICAgICAgbURpc2FwcGVhcmluZ0FuaW0gPSBkZWZhdWx0RmFkZU91dDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBkdXJhdGlvbiB0byBiZSB1c2VkIGJ5IGFsbCBhbmltYXRpb25zIG9mIHRoaXMgdHJhbnNpdGlvbiBvYmplY3QuIElmIHlvdSB3YW50IHRvCisgICAgICogc2V0IHRoZSBkdXJhdGlvbiBvZiBqdXN0IG9uZSBvZiB0aGUgYW5pbWF0aW9ucyBpbiBwYXJ0aWN1bGFyLCB1c2UgdGhlCisgICAgICoge0BsaW5rICNzZXREdXJhdGlvbihpbnQsIGxvbmcpfSBtZXRob2QuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZHVyYXRpb24gVGhlIGxlbmd0aCBvZiB0aW1lLCBpbiBtaWxsaXNlY29uZHMsIHRoYXQgdGhlIHRyYW5zaXRpb24gYW5pbWF0aW9ucworICAgICAqIHNob3VsZCBsYXN0LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldER1cmF0aW9uKGxvbmcgZHVyYXRpb24pIHsKKyAgICAgICAgbUNoYW5naW5nQXBwZWFyaW5nRHVyYXRpb24gPSBkdXJhdGlvbjsKKyAgICAgICAgbUNoYW5naW5nRGlzYXBwZWFyaW5nRHVyYXRpb24gPSBkdXJhdGlvbjsKKyAgICAgICAgbUFwcGVhcmluZ0R1cmF0aW9uID0gZHVyYXRpb247CisgICAgICAgIG1EaXNhcHBlYXJpbmdEdXJhdGlvbiA9IGR1cmF0aW9uOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIHN0YXJ0IGRlbGF5IG9uIG9uZSBvZiB0aGUgYW5pbWF0aW9uIG9iamVjdHMgdXNlZCBieSB0aGlzIHRyYW5zaXRpb24uIFRoZQorICAgICAqIDxjb2RlPnRyYW5zaXRpb25UeXBlPC9jb2RlPiBwYXJhbWV0ZXIgZGV0ZXJtaW5lcyB0aGUgYW5pbWF0aW9uIHdob3NlIHN0YXJ0IGRlbGF5CisgICAgICogaXMgYmVpbmcgc2V0LgorICAgICAqCisgICAgICogQHBhcmFtIHRyYW5zaXRpb25UeXBlIG9uZSBvZiB7QGxpbmsgI0NIQU5HRV9BUFBFQVJJTkd9LCB7QGxpbmsgI0NIQU5HRV9ESVNBUFBFQVJJTkd9LAorICAgICAqIHtAbGluayAjQVBQRUFSSU5HfSwgb3Ige0BsaW5rICNESVNBUFBFQVJJTkd9LCB3aGljaCBkZXRlcm1pbmVzIHRoZSBhbmltYXRpb24gd2hvc2Ugc3RhcnQKKyAgICAgKiBkZWxheSBpcyBiZWluZyBzZXQuCisgICAgICogQHBhcmFtIGRlbGF5IFRoZSBsZW5ndGggb2YgdGltZSwgaW4gbWlsbGlzZWNvbmRzLCB0byBkZWxheSBiZWZvcmUgc3RhcnRpbmcgdGhlIGFuaW1hdGlvbi4KKyAgICAgKiBAc2VlIEFuaW1hdG9yI3NldFN0YXJ0RGVsYXkobG9uZykKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRTdGFydERlbGF5KGludCB0cmFuc2l0aW9uVHlwZSwgbG9uZyBkZWxheSkgeworICAgICAgICBzd2l0Y2ggKHRyYW5zaXRpb25UeXBlKSB7CisgICAgICAgICAgICBjYXNlIENIQU5HRV9BUFBFQVJJTkc6CisgICAgICAgICAgICAgICAgbUNoYW5naW5nQXBwZWFyaW5nRGVsYXkgPSBkZWxheTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQ0hBTkdFX0RJU0FQUEVBUklORzoKKyAgICAgICAgICAgICAgICBtQ2hhbmdpbmdEaXNhcHBlYXJpbmdEZWxheSA9IGRlbGF5OworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBBUFBFQVJJTkc6CisgICAgICAgICAgICAgICAgbUFwcGVhcmluZ0RlbGF5ID0gZGVsYXk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIERJU0FQUEVBUklORzoKKyAgICAgICAgICAgICAgICBtRGlzYXBwZWFyaW5nRGVsYXkgPSBkZWxheTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIHN0YXJ0IGRlbGF5IG9uIG9uZSBvZiB0aGUgYW5pbWF0aW9uIG9iamVjdHMgdXNlZCBieSB0aGlzIHRyYW5zaXRpb24uIFRoZQorICAgICAqIDxjb2RlPnRyYW5zaXRpb25UeXBlPC9jb2RlPiBwYXJhbWV0ZXIgZGV0ZXJtaW5lcyB0aGUgYW5pbWF0aW9uIHdob3NlIHN0YXJ0IGRlbGF5CisgICAgICogaXMgcmV0dXJuZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdHJhbnNpdGlvblR5cGUgb25lIG9mIHtAbGluayAjQ0hBTkdFX0FQUEVBUklOR30sIHtAbGluayAjQ0hBTkdFX0RJU0FQUEVBUklOR30sCisgICAgICoge0BsaW5rICNBUFBFQVJJTkd9LCBvciB7QGxpbmsgI0RJU0FQUEVBUklOR30sIHdoaWNoIGRldGVybWluZXMgdGhlIGFuaW1hdGlvbiB3aG9zZSBzdGFydAorICAgICAqIGRlbGF5IGlzIHJldHVybmVkLgorICAgICAqIEByZXR1cm4gbG9uZyBUaGUgc3RhcnQgZGVsYXkgb2YgdGhlIHNwZWNpZmllZCBhbmltYXRpb24uCisgICAgICogQHNlZSBBbmltYXRvciNnZXRTdGFydERlbGF5KCkKKyAgICAgKi8KKyAgICBwdWJsaWMgbG9uZyBnZXRTdGFydERlbGF5KGludCB0cmFuc2l0aW9uVHlwZSkgeworICAgICAgICBzd2l0Y2ggKHRyYW5zaXRpb25UeXBlKSB7CisgICAgICAgICAgICBjYXNlIENIQU5HRV9BUFBFQVJJTkc6CisgICAgICAgICAgICAgICAgcmV0dXJuIG1DaGFuZ2luZ0FwcGVhcmluZ0R1cmF0aW9uOworICAgICAgICAgICAgY2FzZSBDSEFOR0VfRElTQVBQRUFSSU5HOgorICAgICAgICAgICAgICAgIHJldHVybiBtQ2hhbmdpbmdEaXNhcHBlYXJpbmdEdXJhdGlvbjsKKyAgICAgICAgICAgIGNhc2UgQVBQRUFSSU5HOgorICAgICAgICAgICAgICAgIHJldHVybiBtQXBwZWFyaW5nRHVyYXRpb247CisgICAgICAgICAgICBjYXNlIERJU0FQUEVBUklORzoKKyAgICAgICAgICAgICAgICByZXR1cm4gbURpc2FwcGVhcmluZ0R1cmF0aW9uOworICAgICAgICB9CisgICAgICAgIC8vIHNob3VsZG4ndCByZWFjaCBoZXJlCisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIGR1cmF0aW9uIG9uIG9uZSBvZiB0aGUgYW5pbWF0aW9uIG9iamVjdHMgdXNlZCBieSB0aGlzIHRyYW5zaXRpb24uIFRoZQorICAgICAqIDxjb2RlPnRyYW5zaXRpb25UeXBlPC9jb2RlPiBwYXJhbWV0ZXIgZGV0ZXJtaW5lcyB0aGUgYW5pbWF0aW9uIHdob3NlIGR1cmF0aW9uCisgICAgICogaXMgYmVpbmcgc2V0LgorICAgICAqCisgICAgICogQHBhcmFtIHRyYW5zaXRpb25UeXBlIG9uZSBvZiB7QGxpbmsgI0NIQU5HRV9BUFBFQVJJTkd9LCB7QGxpbmsgI0NIQU5HRV9ESVNBUFBFQVJJTkd9LAorICAgICAqIHtAbGluayAjQVBQRUFSSU5HfSwgb3Ige0BsaW5rICNESVNBUFBFQVJJTkd9LCB3aGljaCBkZXRlcm1pbmVzIHRoZSBhbmltYXRpb24gd2hvc2UKKyAgICAgKiBkdXJhdGlvbiBpcyBiZWluZyBzZXQuCisgICAgICogQHBhcmFtIGR1cmF0aW9uIFRoZSBsZW5ndGggb2YgdGltZSwgaW4gbWlsbGlzZWNvbmRzLCB0aGF0IHRoZSBzcGVjaWZpZWQgYW5pbWF0aW9uIHNob3VsZCBydW4uCisgICAgICogQHNlZSBBbmltYXRvciNzZXREdXJhdGlvbihsb25nKQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldER1cmF0aW9uKGludCB0cmFuc2l0aW9uVHlwZSwgbG9uZyBkdXJhdGlvbikgeworICAgICAgICBzd2l0Y2ggKHRyYW5zaXRpb25UeXBlKSB7CisgICAgICAgICAgICBjYXNlIENIQU5HRV9BUFBFQVJJTkc6CisgICAgICAgICAgICAgICAgbUNoYW5naW5nQXBwZWFyaW5nRHVyYXRpb24gPSBkdXJhdGlvbjsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQ0hBTkdFX0RJU0FQUEVBUklORzoKKyAgICAgICAgICAgICAgICBtQ2hhbmdpbmdEaXNhcHBlYXJpbmdEdXJhdGlvbiA9IGR1cmF0aW9uOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBBUFBFQVJJTkc6CisgICAgICAgICAgICAgICAgbUFwcGVhcmluZ0R1cmF0aW9uID0gZHVyYXRpb247CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIERJU0FQUEVBUklORzoKKyAgICAgICAgICAgICAgICBtRGlzYXBwZWFyaW5nRHVyYXRpb24gPSBkdXJhdGlvbjsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIGR1cmF0aW9uIG9uIG9uZSBvZiB0aGUgYW5pbWF0aW9uIG9iamVjdHMgdXNlZCBieSB0aGlzIHRyYW5zaXRpb24uIFRoZQorICAgICAqIDxjb2RlPnRyYW5zaXRpb25UeXBlPC9jb2RlPiBwYXJhbWV0ZXIgZGV0ZXJtaW5lcyB0aGUgYW5pbWF0aW9uIHdob3NlIGR1cmF0aW9uCisgICAgICogaXMgcmV0dXJuZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdHJhbnNpdGlvblR5cGUgb25lIG9mIHtAbGluayAjQ0hBTkdFX0FQUEVBUklOR30sIHtAbGluayAjQ0hBTkdFX0RJU0FQUEVBUklOR30sCisgICAgICoge0BsaW5rICNBUFBFQVJJTkd9LCBvciB7QGxpbmsgI0RJU0FQUEVBUklOR30sIHdoaWNoIGRldGVybWluZXMgdGhlIGFuaW1hdGlvbiB3aG9zZQorICAgICAqIGR1cmF0aW9uIGlzIHJldHVybmVkLgorICAgICAqIEByZXR1cm4gbG9uZyBUaGUgZHVyYXRpb24gb2YgdGhlIHNwZWNpZmllZCBhbmltYXRpb24uCisgICAgICogQHNlZSBBbmltYXRvciNnZXREdXJhdGlvbigpCisgICAgICovCisgICAgcHVibGljIGxvbmcgZ2V0RHVyYXRpb24oaW50IHRyYW5zaXRpb25UeXBlKSB7CisgICAgICAgIHN3aXRjaCAodHJhbnNpdGlvblR5cGUpIHsKKyAgICAgICAgICAgIGNhc2UgQ0hBTkdFX0FQUEVBUklORzoKKyAgICAgICAgICAgICAgICByZXR1cm4gbUNoYW5naW5nQXBwZWFyaW5nRHVyYXRpb247CisgICAgICAgICAgICBjYXNlIENIQU5HRV9ESVNBUFBFQVJJTkc6CisgICAgICAgICAgICAgICAgcmV0dXJuIG1DaGFuZ2luZ0Rpc2FwcGVhcmluZ0R1cmF0aW9uOworICAgICAgICAgICAgY2FzZSBBUFBFQVJJTkc6CisgICAgICAgICAgICAgICAgcmV0dXJuIG1BcHBlYXJpbmdEdXJhdGlvbjsKKyAgICAgICAgICAgIGNhc2UgRElTQVBQRUFSSU5HOgorICAgICAgICAgICAgICAgIHJldHVybiBtRGlzYXBwZWFyaW5nRHVyYXRpb247CisgICAgICAgIH0KKyAgICAgICAgLy8gc2hvdWxkbid0IHJlYWNoIGhlcmUKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgbGVuZ3RoIG9mIHRpbWUgdG8gZGVsYXkgYmV0d2VlbiBzdGFydGluZyBlYWNoIGFuaW1hdGlvbiBkdXJpbmcgb25lIG9mIHRoZQorICAgICAqIENIQU5HRSBhbmltYXRpb25zLgorICAgICAqCisgICAgICogQHBhcmFtIHRyYW5zaXRpb25UeXBlIEEgdmFsdWUgb2Yge0BsaW5rICNDSEFOR0VfQVBQRUFSSU5HfSBvciBAbGluayAjQ0hBTkdFX0RJU0FQUEVBUklOR30uCisgICAgICogQHBhcmFtIGR1cmF0aW9uIFRoZSBsZW5ndGggb2YgdGltZSwgaW4gbWlsbGlzZWNvbmRzLCB0byBkZWxheSBiZWZvcmUgbGF1bmNoaW5nIHRoZSBuZXh0CisgICAgICogYW5pbWF0aW9uIGluIHRoZSBzZXF1ZW5jZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRTdGFnZ2VyKGludCB0cmFuc2l0aW9uVHlwZSwgbG9uZyBkdXJhdGlvbikgeworICAgICAgICBzd2l0Y2ggKHRyYW5zaXRpb25UeXBlKSB7CisgICAgICAgICAgICBjYXNlIENIQU5HRV9BUFBFQVJJTkc6CisgICAgICAgICAgICAgICAgbUNoYW5naW5nQXBwZWFyaW5nU3RhZ2dlciA9IGR1cmF0aW9uOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBDSEFOR0VfRElTQVBQRUFSSU5HOgorICAgICAgICAgICAgICAgIG1DaGFuZ2luZ0Rpc2FwcGVhcmluZ1N0YWdnZXIgPSBkdXJhdGlvbjsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIC8vIG5vb3Agb3RoZXIgY2FzZXMKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFRldHMgdGhlIGxlbmd0aCBvZiB0aW1lIHRvIGRlbGF5IGJldHdlZW4gc3RhcnRpbmcgZWFjaCBhbmltYXRpb24gZHVyaW5nIG9uZSBvZiB0aGUKKyAgICAgKiBDSEFOR0UgYW5pbWF0aW9ucy4KKyAgICAgKgorICAgICAqIEBwYXJhbSB0cmFuc2l0aW9uVHlwZSBBIHZhbHVlIG9mIHtAbGluayAjQ0hBTkdFX0FQUEVBUklOR30gb3IgQGxpbmsgI0NIQU5HRV9ESVNBUFBFQVJJTkd9LgorICAgICAqIEByZXR1cm4gbG9uZyBUaGUgbGVuZ3RoIG9mIHRpbWUsIGluIG1pbGxpc2Vjb25kcywgdG8gZGVsYXkgYmVmb3JlIGxhdW5jaGluZyB0aGUgbmV4dAorICAgICAqIGFuaW1hdGlvbiBpbiB0aGUgc2VxdWVuY2UuCisgICAgICovCisgICAgcHVibGljIGxvbmcgZ2V0U3RhZ2dlcihpbnQgdHJhbnNpdGlvblR5cGUpIHsKKyAgICAgICAgc3dpdGNoICh0cmFuc2l0aW9uVHlwZSkgeworICAgICAgICAgICAgY2FzZSBDSEFOR0VfQVBQRUFSSU5HOgorICAgICAgICAgICAgICAgIHJldHVybiBtQ2hhbmdpbmdBcHBlYXJpbmdTdGFnZ2VyOworICAgICAgICAgICAgY2FzZSBDSEFOR0VfRElTQVBQRUFSSU5HOgorICAgICAgICAgICAgICAgIHJldHVybiBtQ2hhbmdpbmdEaXNhcHBlYXJpbmdTdGFnZ2VyOworICAgICAgICB9CisgICAgICAgIC8vIHNob3VsZG4ndCByZWFjaCBoZXJlCisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIGludGVycG9sYXRvciBvbiBvbmUgb2YgdGhlIGFuaW1hdGlvbiBvYmplY3RzIHVzZWQgYnkgdGhpcyB0cmFuc2l0aW9uLiBUaGUKKyAgICAgKiA8Y29kZT50cmFuc2l0aW9uVHlwZTwvY29kZT4gcGFyYW1ldGVyIGRldGVybWluZXMgdGhlIGFuaW1hdGlvbiB3aG9zZSBpbnRlcnBvbGF0b3IKKyAgICAgKiBpcyBiZWluZyBzZXQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdHJhbnNpdGlvblR5cGUgb25lIG9mIHtAbGluayAjQ0hBTkdFX0FQUEVBUklOR30sIHtAbGluayAjQ0hBTkdFX0RJU0FQUEVBUklOR30sCisgICAgICoge0BsaW5rICNBUFBFQVJJTkd9LCBvciB7QGxpbmsgI0RJU0FQUEVBUklOR30sIHdoaWNoIGRldGVybWluZXMgdGhlIGFuaW1hdGlvbiB3aG9zZQorICAgICAqIGR1cmF0aW9uIGlzIGJlaW5nIHNldC4KKyAgICAgKiBAcGFyYW0gaW50ZXJwb2xhdG9yIFRoZSBpbnRlcnBvbGF0b3IgdGhhdCB0aGUgc3BlY2lmaWVkIGFuaW1hdGlvbiBzaG91bGQgdXNlLgorICAgICAqIEBzZWUgQW5pbWF0b3Ijc2V0SW50ZXJwb2xhdG9yKGFuZHJvaWQudmlldy5hbmltYXRpb24uSW50ZXJwb2xhdG9yKQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEludGVycG9sYXRvcihpbnQgdHJhbnNpdGlvblR5cGUsIEludGVycG9sYXRvciBpbnRlcnBvbGF0b3IpIHsKKyAgICAgICAgc3dpdGNoICh0cmFuc2l0aW9uVHlwZSkgeworICAgICAgICAgICAgY2FzZSBDSEFOR0VfQVBQRUFSSU5HOgorICAgICAgICAgICAgICAgIG1DaGFuZ2luZ0FwcGVhcmluZ0ludGVycG9sYXRvciA9IGludGVycG9sYXRvcjsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQ0hBTkdFX0RJU0FQUEVBUklORzoKKyAgICAgICAgICAgICAgICBtQ2hhbmdpbmdEaXNhcHBlYXJpbmdJbnRlcnBvbGF0b3IgPSBpbnRlcnBvbGF0b3I7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEFQUEVBUklORzoKKyAgICAgICAgICAgICAgICBtQXBwZWFyaW5nSW50ZXJwb2xhdG9yID0gaW50ZXJwb2xhdG9yOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBESVNBUFBFQVJJTkc6CisgICAgICAgICAgICAgICAgbURpc2FwcGVhcmluZ0ludGVycG9sYXRvciA9IGludGVycG9sYXRvcjsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIGludGVycG9sYXRvciBvbiBvbmUgb2YgdGhlIGFuaW1hdGlvbiBvYmplY3RzIHVzZWQgYnkgdGhpcyB0cmFuc2l0aW9uLiBUaGUKKyAgICAgKiA8Y29kZT50cmFuc2l0aW9uVHlwZTwvY29kZT4gcGFyYW1ldGVyIGRldGVybWluZXMgdGhlIGFuaW1hdGlvbiB3aG9zZSBpbnRlcnBvbGF0b3IKKyAgICAgKiBpcyByZXR1cm5lZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSB0cmFuc2l0aW9uVHlwZSBvbmUgb2Yge0BsaW5rICNDSEFOR0VfQVBQRUFSSU5HfSwge0BsaW5rICNDSEFOR0VfRElTQVBQRUFSSU5HfSwKKyAgICAgKiB7QGxpbmsgI0FQUEVBUklOR30sIG9yIHtAbGluayAjRElTQVBQRUFSSU5HfSwgd2hpY2ggZGV0ZXJtaW5lcyB0aGUgYW5pbWF0aW9uIHdob3NlCisgICAgICogZHVyYXRpb24gaXMgYmVpbmcgc2V0LgorICAgICAqIEByZXR1cm4gSW50ZXJwb2xhdG9yIFRoZSBpbnRlcnBvbGF0b3IgdGhhdCB0aGUgc3BlY2lmaWVkIGFuaW1hdGlvbiB1c2VzLgorICAgICAqIEBzZWUgQW5pbWF0b3Ijc2V0SW50ZXJwb2xhdG9yKGFuZHJvaWQudmlldy5hbmltYXRpb24uSW50ZXJwb2xhdG9yKQorICAgICAqLworICAgIHB1YmxpYyBJbnRlcnBvbGF0b3IgZ2V0SW50ZXJwb2xhdG9yKGludCB0cmFuc2l0aW9uVHlwZSkgeworICAgICAgICBzd2l0Y2ggKHRyYW5zaXRpb25UeXBlKSB7CisgICAgICAgICAgICBjYXNlIENIQU5HRV9BUFBFQVJJTkc6CisgICAgICAgICAgICAgICAgcmV0dXJuIG1DaGFuZ2luZ0FwcGVhcmluZ0ludGVycG9sYXRvcjsKKyAgICAgICAgICAgIGNhc2UgQ0hBTkdFX0RJU0FQUEVBUklORzoKKyAgICAgICAgICAgICAgICByZXR1cm4gbUNoYW5naW5nRGlzYXBwZWFyaW5nSW50ZXJwb2xhdG9yOworICAgICAgICAgICAgY2FzZSBBUFBFQVJJTkc6CisgICAgICAgICAgICAgICAgcmV0dXJuIG1BcHBlYXJpbmdJbnRlcnBvbGF0b3I7CisgICAgICAgICAgICBjYXNlIERJU0FQUEVBUklORzoKKyAgICAgICAgICAgICAgICByZXR1cm4gbURpc2FwcGVhcmluZ0ludGVycG9sYXRvcjsKKyAgICAgICAgfQorICAgICAgICAvLyBzaG91bGRuJ3QgcmVhY2ggaGVyZQorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBhbmltYXRpb24gdXNlZCBkdXJpbmcgb25lIG9mIHRoZSB0cmFuc2l0aW9uIHR5cGVzIHRoYXQgbWF5IHJ1bi4gQW55CisgICAgICogQW5pbWF0b3Igb2JqZWN0IGNhbiBiZSB1c2VkLCBidXQgdG8gYmUgbW9zdCB1c2VmdWwgaW4gdGhlIGNvbnRleHQgb2YgbGF5b3V0CisgICAgICogdHJhbnNpdGlvbnMsIHRoZSBhbmltYXRpb24gc2hvdWxkIGVpdGhlciBiZSBhIE9iamVjdEFuaW1hdG9yIG9yIGEgQW5pbWF0b3JTZXQKKyAgICAgKiBvZiBhbmltYXRpb25zIGluY2x1ZGluZyBQcm9wZXJ0eUFuaW1hdG9ycy4gQWxzbywgdGhlc2UgT2JqZWN0QW5pbWF0b3Igb2JqZWN0cworICAgICAqIHNob3VsZCBiZSBhYmxlIHRvIGdldCBhbmQgc2V0IHZhbHVlcyBvbiB0aGVpciB0YXJnZXQgb2JqZWN0cyBhdXRvbWF0aWNhbGx5LiBGb3IKKyAgICAgKiBleGFtcGxlLCBhIE9iamVjdEFuaW1hdG9yIHRoYXQgYW5pbWF0ZXMgdGhlIHByb3BlcnR5ICJsZWZ0IiBpcyBhYmxlIHRvIHNldCBhbmQgZ2V0IHRoZQorICAgICAqIDxjb2RlPmxlZnQ8L2NvZGU+IHByb3BlcnR5IGZyb20gdGhlIFZpZXcgb2JqZWN0cyBiZWluZyBhbmltYXRlZCBieSB0aGUgbGF5b3V0CisgICAgICogdHJhbnNpdGlvbi4gVGhlIHRyYW5zaXRpb24gd29ya3MgYnkgc2V0dGluZyB0YXJnZXQgb2JqZWN0cyBhbmQgcHJvcGVydGllcworICAgICAqIGR5bmFtaWNhbGx5LCBhY2NvcmRpbmcgdG8gdGhlIHByZS0gYW5kIHBvc3QtbGF5b291dCB2YWx1ZXMgb2YgdGhvc2Ugb2JqZWN0cywgc28KKyAgICAgKiBoYXZpbmcgYW5pbWF0aW9ucyB0aGF0IGNhbiBoYW5kbGUgdGhvc2UgcHJvcGVydGllcyBhcHByb3ByaWF0ZWx5IHdpbGwgd29yayBiZXN0CisgICAgICogZm9yIGN1c3RvbSBhbmltYXRpb24uIFRoZSBkeW5hbWljIHNldHRpbmcgb2YgdmFsdWVzIGlzIG9ubHkgdGhlIGNhc2UgZm9yIHRoZQorICAgICAqIENIQU5HRSBhbmltYXRpb25zOyB0aGUgQVBQRUFSSU5HIGFuZCBESVNBUFBFQVJJTkcgYW5pbWF0aW9ucyBhcmUgc2ltcGx5IHJ1biB3aXRoCisgICAgICogdGhlIHZhbHVlcyB0aGV5IGhhdmUuCisgICAgICoKKyAgICAgKiA8cD5JdCBpcyBhbHNvIHdvcnRoIG5vdGluZyB0aGF0IGFueSBhbmQgYWxsIGFuaW1hdGlvbnMgKGFuZCB0aGVpciB1bmRlcmx5aW5nCisgICAgICogUHJvcGVydHlWYWx1ZXNIb2xkZXIgb2JqZWN0cykgd2lsbCBoYXZlIHRoZWlyIHN0YXJ0IGFuZCBlbmQgdmFsdWVzIHNldCBhY2NvcmRpbmcKKyAgICAgKiB0byB0aGUgcHJlLSBhbmQgcG9zdC1sYXlvdXQgdmFsdWVzLiBTbywgZm9yIGV4YW1wbGUsIGEgY3VzdG9tIGFuaW1hdGlvbiBvbiAiYWxwaGEiCisgICAgICogYXMgdGhlIENIQU5HRV9BUFBFQVJJTkcgYW5pbWF0aW9uIHdpbGwgaW5oZXJpdCB0aGUgcmVhbCB2YWx1ZSBvZiBhbHBoYSBvbiB0aGUgdGFyZ2V0CisgICAgICogb2JqZWN0IChwcmVzdW1hYmx5IDEpIGFzIGl0cyBzdGFydGluZyBhbmQgZW5kaW5nIHZhbHVlIHdoZW4gdGhlIGFuaW1hdGlvbiBiZWdpbnMuCisgICAgICogQW5pbWF0aW9ucyB3aGljaCBuZWVkIHRvIHVzZSB2YWx1ZXMgYXQgdGhlIGJlZ2lubmluZyBhbmQgZW5kIHRoYXQgbWF5IG5vdCBtYXRjaCB0aGUKKyAgICAgKiB2YWx1ZXMgcXVlcmllZCB3aGVuIHRoZSB0cmFuc2l0aW9uIGJlZ2lucyBtYXkgbmVlZCB0byB1c2UgYSBkaWZmZXJlbnQgbWVjaGFuaXNtCisgICAgICogdGhhbiBhIHN0YW5kYXJkIE9iamVjdEFuaW1hdG9yIG9iamVjdC48L3A+CisgICAgICoKKyAgICAgKiBAcGFyYW0gdHJhbnNpdGlvblR5cGUgb25lIG9mIHtAbGluayAjQ0hBTkdFX0FQUEVBUklOR30sIHtAbGluayAjQ0hBTkdFX0RJU0FQUEVBUklOR30sCisgICAgICoge0BsaW5rICNBUFBFQVJJTkd9LCBvciB7QGxpbmsgI0RJU0FQUEVBUklOR30sIHdoaWNoIGRldGVybWluZXMgdGhlIGFuaW1hdGlvbiB3aG9zZQorICAgICAqIGR1cmF0aW9uIGlzIGJlaW5nIHNldC4KKyAgICAgKiBAcGFyYW0gYW5pbWF0b3IgVGhlIGFuaW1hdGlvbiBiZWluZyBhc3NpZ25lZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRBbmltYXRvcihpbnQgdHJhbnNpdGlvblR5cGUsIEFuaW1hdG9yIGFuaW1hdG9yKSB7CisgICAgICAgIHN3aXRjaCAodHJhbnNpdGlvblR5cGUpIHsKKyAgICAgICAgICAgIGNhc2UgQ0hBTkdFX0FQUEVBUklORzoKKyAgICAgICAgICAgICAgICBtQ2hhbmdpbmdBcHBlYXJpbmdBbmltID0gKGFuaW1hdG9yICE9IG51bGwpID8gYW5pbWF0b3IgOiBkZWZhdWx0Q2hhbmdlSW47CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIENIQU5HRV9ESVNBUFBFQVJJTkc6CisgICAgICAgICAgICAgICAgbUNoYW5naW5nRGlzYXBwZWFyaW5nQW5pbSA9IChhbmltYXRvciAhPSBudWxsKSA/IGFuaW1hdG9yIDogZGVmYXVsdENoYW5nZU91dDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQVBQRUFSSU5HOgorICAgICAgICAgICAgICAgIG1BcHBlYXJpbmdBbmltID0gKGFuaW1hdG9yICE9IG51bGwpID8gYW5pbWF0b3IgOiBkZWZhdWx0RmFkZUluOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBESVNBUFBFQVJJTkc6CisgICAgICAgICAgICAgICAgbURpc2FwcGVhcmluZ0FuaW0gPSAoYW5pbWF0b3IgIT0gbnVsbCkgPyBhbmltYXRvciA6IGRlZmF1bHRGYWRlT3V0OworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgYW5pbWF0aW9uIHVzZWQgZHVyaW5nIG9uZSBvZiB0aGUgdHJhbnNpdGlvbiB0eXBlcyB0aGF0IG1heSBydW4uCisgICAgICoKKyAgICAgKiBAcGFyYW0gdHJhbnNpdGlvblR5cGUgb25lIG9mIHtAbGluayAjQ0hBTkdFX0FQUEVBUklOR30sIHtAbGluayAjQ0hBTkdFX0RJU0FQUEVBUklOR30sCisgICAgICoge0BsaW5rICNBUFBFQVJJTkd9LCBvciB7QGxpbmsgI0RJU0FQUEVBUklOR30sIHdoaWNoIGRldGVybWluZXMgdGhlIGFuaW1hdGlvbiB3aG9zZQorICAgICAqIGR1cmF0aW9uIGlzIGJlaW5nIHNldC4KKyAgICAgKiBAcmV0dXJuIEFuaW1hdG9yIFRoZSBhbmltYXRpb24gYmVpbmcgdXNlZCBmb3IgdGhlIGdpdmVuIHRyYW5zaXRpb24gdHlwZS4KKyAgICAgKiBAc2VlICNzZXRBbmltYXRvcihpbnQsIEFuaW1hdG9yKQorICAgICAqLworICAgIHB1YmxpYyBBbmltYXRvciBnZXRBbmltYXRvcihpbnQgdHJhbnNpdGlvblR5cGUpIHsKKyAgICAgICAgc3dpdGNoICh0cmFuc2l0aW9uVHlwZSkgeworICAgICAgICAgICAgY2FzZSBDSEFOR0VfQVBQRUFSSU5HOgorICAgICAgICAgICAgICAgIHJldHVybiBtQ2hhbmdpbmdBcHBlYXJpbmdBbmltOworICAgICAgICAgICAgY2FzZSBDSEFOR0VfRElTQVBQRUFSSU5HOgorICAgICAgICAgICAgICAgIHJldHVybiBtQ2hhbmdpbmdEaXNhcHBlYXJpbmdBbmltOworICAgICAgICAgICAgY2FzZSBBUFBFQVJJTkc6CisgICAgICAgICAgICAgICAgcmV0dXJuIG1BcHBlYXJpbmdBbmltOworICAgICAgICAgICAgY2FzZSBESVNBUFBFQVJJTkc6CisgICAgICAgICAgICAgICAgcmV0dXJuIG1EaXNhcHBlYXJpbmdBbmltOworICAgICAgICB9CisgICAgICAgIC8vIHNob3VsZG4ndCByZWFjaCBoZXJlCisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoaXMgZnVuY3Rpb24gc2V0cyB1cCBydW5zIGFuaW1hdGlvbnMgb24gYWxsIG9mIHRoZSB2aWV3cyB0aGF0IGNoYW5nZSBkdXJpbmcgbGF5b3V0LgorICAgICAqIEZvciBldmVyeSBjaGlsZCBpbiB0aGUgcGFyZW50LCB3ZSBjcmVhdGUgYSBjaGFuZ2UgYW5pbWF0aW9uIG9mIHRoZSBhcHByb3ByaWF0ZQorICAgICAqIHR5cGUgKGFwcGVhcmluZyBvciBkaXNhcHBlYXJpbmcpIGFuZCBhc2sgaXQgdG8gcG9wdWxhdGUgaXRzIHN0YXJ0IHZhbHVlcyBmcm9tIGl0cworICAgICAqIHRhcmdldCB2aWV3LiBXZSBhZGQgbGF5b3V0IGxpc3RlbmVycyB0byBhbGwgY2hpbGQgdmlld3MgYW5kIGxpc3RlbiBmb3IgY2hhbmdlcy4gRm9yCisgICAgICogdGhvc2Ugdmlld3MgdGhhdCBjaGFuZ2UsIHdlIHBvcHVsYXRlIHRoZSBlbmQgdmFsdWVzIGZvciB0aG9zZSBhbmltYXRpb25zIGFuZCBzdGFydCB0aGVtLgorICAgICAqIEFuaW1hdGlvbnMgYXJlIG5vdCBydW4gb24gdW5jaGFuZ2luZyB2aWV3cy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwYXJlbnQgVGhlIGNvbnRhaW5lciB3aGljaCBpcyB1bmRlcmdvaW5nIGFuIGFwcGVhcmluZyBvciBkaXNhcHBlYXJpbmcgY2hhbmdlLgorICAgICAqIEBwYXJhbSBuZXdWaWV3IFRoZSB2aWV3IGJlaW5nIGFkZGVkIHRvIG9yIHJlbW92ZWQgZnJvbSB0aGUgcGFyZW50LgorICAgICAqIEBwYXJhbSBjaGFuZ2VSZWFzb24gQSB2YWx1ZSBvZiBBUFBFQVJJTkcgb3IgRElTQVBQRUFSSU5HLCBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlCisgICAgICogdHJhbnNpdGlvbiBpcyBvY2N1cmluZyBiZWNhdXNlIGFuIGl0ZW0gaXMgYmVpbmcgYWRkZWQgdG8gb3IgcmVtb3ZlZCBmcm9tIHRoZSBwYXJlbnQuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIHJ1bkNoYW5nZVRyYW5zaXRpb24oZmluYWwgVmlld0dyb3VwIHBhcmVudCwgVmlldyBuZXdWaWV3LCBmaW5hbCBpbnQgY2hhbmdlUmVhc29uKSB7CisgICAgICAgIC8vIHJlc2V0IHRoZSBpbnRlci1hbmltYXRpb24gZGVsYXksIGluIGNhc2Ugd2UgdXNlIGl0IGxhdGVyCisgICAgICAgIHN0YWdnZXJEZWxheSA9IDA7CisKKyAgICAgICAgZmluYWwgVmlld1RyZWVPYnNlcnZlciBvYnNlcnZlciA9IHBhcmVudC5nZXRWaWV3VHJlZU9ic2VydmVyKCk7IC8vIHVzZWQgZm9yIGxhdGVyIGNsZWFudXAKKyAgICAgICAgaWYgKCFvYnNlcnZlci5pc0FsaXZlKCkpIHsKKyAgICAgICAgICAgIC8vIElmIHRoZSBvYnNlcnZlcidzIG5vdCBpbiBhIGdvb2Qgc3RhdGUsIHNraXAgdGhlIHRyYW5zaXRpb24KKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBpbnQgbnVtQ2hpbGRyZW4gPSBwYXJlbnQuZ2V0Q2hpbGRDb3VudCgpOworCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtQ2hpbGRyZW47ICsraSkgeworICAgICAgICAgICAgZmluYWwgVmlldyBjaGlsZCA9IHBhcmVudC5nZXRDaGlsZEF0KGkpOworCisgICAgICAgICAgICAvLyBvbmx5IGFuaW1hdGUgdGhlIHZpZXdzIG5vdCBiZWluZyBhZGRlZCBvciByZW1vdmVkCisgICAgICAgICAgICBpZiAoY2hpbGQgIT0gbmV3VmlldykgeworCisgICAgICAgICAgICAgICAgLy8gSWYgdGhlcmUncyBhbiBhbmltYXRpb24gcnVubmluZyBvbiB0aGlzIHZpZXcgYWxyZWFkeSwgY2FuY2VsIGl0CisgICAgICAgICAgICAgICAgQW5pbWF0b3IgY3VycmVudEFuaW1hdGlvbiA9IGN1cnJlbnRBbmltYXRpb25zLmdldChjaGlsZCk7CisgICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRBbmltYXRpb24gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBjdXJyZW50QW5pbWF0aW9uLmNhbmNlbCgpOworICAgICAgICAgICAgICAgICAgICBjdXJyZW50QW5pbWF0aW9ucy5yZW1vdmUoY2hpbGQpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vIE1ha2UgYSBjb3B5IG9mIHRoZSBhcHByb3ByaWF0ZSBhbmltYXRpb24KKyAgICAgICAgICAgICAgICBmaW5hbCBBbmltYXRvciBhbmltID0gKGNoYW5nZVJlYXNvbiA9PSBBUFBFQVJJTkcpID8KKyAgICAgICAgICAgICAgICAgICAgICAgIG1DaGFuZ2luZ0FwcGVhcmluZ0FuaW0uY2xvbmUoKSA6CisgICAgICAgICAgICAgICAgICAgICAgICBtQ2hhbmdpbmdEaXNhcHBlYXJpbmdBbmltLmNsb25lKCk7CisKKyAgICAgICAgICAgICAgICAvLyBTZXQgdGhlIHRhcmdldCBvYmplY3QgZm9yIHRoZSBhbmltYXRpb24KKyAgICAgICAgICAgICAgICBhbmltLnNldFRhcmdldChjaGlsZCk7CisKKyAgICAgICAgICAgICAgICAvLyBBIE9iamVjdEFuaW1hdG9yIChvciBBbmltYXRvclNldCBvZiB0aGVtKSBjYW4gZXh0cmFjdCBzdGFydCB2YWx1ZXMgZnJvbQorICAgICAgICAgICAgICAgIC8vIGl0cyB0YXJnZXQgb2JqZWN0CisgICAgICAgICAgICAgICAgYW5pbS5zZXR1cFN0YXJ0VmFsdWVzKCk7CisKKyAgICAgICAgICAgICAgICAvLyBBZGQgYSBsaXN0ZW5lciB0byB0cmFjayBsYXlvdXQgY2hhbmdlcyBvbiB0aGlzIHZpZXcuIElmIHdlIGRvbid0IGdldCBhIGNhbGxiYWNrLAorICAgICAgICAgICAgICAgIC8vIHRoZW4gdGhlcmUncyBub3RoaW5nIHRvIGFuaW1hdGUuCisgICAgICAgICAgICAgICAgVmlldy5PbkxheW91dENoYW5nZUxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IFZpZXcuT25MYXlvdXRDaGFuZ2VMaXN0ZW5lcigpIHsKKyAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgb25MYXlvdXRDaGFuZ2UoVmlldyB2LCBpbnQgbGVmdCwgaW50IHRvcCwgaW50IHJpZ2h0LCBpbnQgYm90dG9tLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBvbGRMZWZ0LCBpbnQgb2xkVG9wLCBpbnQgb2xkUmlnaHQsIGludCBvbGRCb3R0b20pIHsKKworICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ2FjaGUgdGhlIGFuaW1hdGlvbiBpbiBjYXNlIHdlIG5lZWQgdG8gY2FuY2VsIGl0IGxhdGVyCisgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50QW5pbWF0aW9ucy5wdXQoY2hpbGQsIGFuaW0pOworCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBUZWxsIHRoZSBhbmltYXRpb24gdG8gZXh0cmFjdCBlbmQgdmFsdWVzIGZyb20gdGhlIGNoYW5nZWQgb2JqZWN0CisgICAgICAgICAgICAgICAgICAgICAgICBhbmltLnNldHVwRW5kVmFsdWVzKCk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGxvbmcgc3RhcnREZWxheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxvbmcgZHVyYXRpb247CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2hhbmdlUmVhc29uID09IEFQUEVBUklORykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0RGVsYXkgPSBtQ2hhbmdpbmdBcHBlYXJpbmdEZWxheSArIHN0YWdnZXJEZWxheTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFnZ2VyRGVsYXkgKz0gbUNoYW5naW5nQXBwZWFyaW5nU3RhZ2dlcjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkdXJhdGlvbiA9IG1DaGFuZ2luZ0FwcGVhcmluZ0R1cmF0aW9uOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydERlbGF5ID0gbUNoYW5naW5nRGlzYXBwZWFyaW5nRGVsYXkgKyBzdGFnZ2VyRGVsYXk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhZ2dlckRlbGF5ICs9IG1DaGFuZ2luZ0Rpc2FwcGVhcmluZ1N0YWdnZXI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHVyYXRpb24gPSBtQ2hhbmdpbmdEaXNhcHBlYXJpbmdEdXJhdGlvbjsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGFuaW0uc2V0U3RhcnREZWxheShzdGFydERlbGF5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFuaW0uc2V0RHVyYXRpb24oZHVyYXRpb24pOworCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBSZW1vdmUgdGhlIGFuaW1hdGlvbiBmcm9tIHRoZSBjYWNoZSB3aGVuIGl0IGVuZHMKKyAgICAgICAgICAgICAgICAgICAgICAgIGFuaW0uYWRkTGlzdGVuZXIobmV3IEFuaW1hdG9yTGlzdGVuZXJBZGFwdGVyKCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaXZhdGUgYm9vbGVhbiBjYW5jZWxlZCA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uQW5pbWF0aW9uQ2FuY2VsKEFuaW1hdG9yIGFuaW1hdG9yKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdlIHJlbW92ZSBjYW5jZWxlZCBhbmltYXRpb25zIGltbWVkaWF0ZWx5LCBub3QgaGVyZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYW5jZWxlZCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uQW5pbWF0aW9uRW5kKEFuaW1hdG9yIGFuaW1hdG9yKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghY2FuY2VsZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRBbmltYXRpb25zLnJlbW92ZShjaGlsZCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhbmltIGluc3RhbmNlb2YgT2JqZWN0QW5pbWF0b3IpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKE9iamVjdEFuaW1hdG9yKSBhbmltKS5zZXRDdXJyZW50UGxheVRpbWUoMCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBhbmltLnN0YXJ0KCk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoaXMgb25seSByZW1vdmVzIGxpc3RlbmVycyB3aG9zZSB2aWV3cyBjaGFuZ2VkIC0gbXVzdCBjbGVhciB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIG90aGVyIGxpc3RlbmVycyBsYXRlcgorICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQucmVtb3ZlT25MYXlvdXRDaGFuZ2VMaXN0ZW5lcih0aGlzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxheW91dENoYW5nZUxpc3RlbmVyTWFwLnJlbW92ZShjaGlsZCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9OworICAgICAgICAgICAgICAgIGNoaWxkLmFkZE9uTGF5b3V0Q2hhbmdlTGlzdGVuZXIobGlzdGVuZXIpOworICAgICAgICAgICAgICAgIC8vIGNhY2hlIHRoZSBsaXN0ZW5lciBmb3IgbGF0ZXIgcmVtb3ZhbAorICAgICAgICAgICAgICAgIGxheW91dENoYW5nZUxpc3RlbmVyTWFwLnB1dChjaGlsZCwgbGlzdGVuZXIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8vIFRoaXMgaXMgdGhlIGNsZWFudXAgc3RlcC4gV2hlbiB3ZSBnZXQgdGhpcyByZW5kZXJpbmcgZXZlbnQsIHdlIGtub3cgdGhhdCBhbGwgb2YKKyAgICAgICAgLy8gdGhlIGFwcHJvcHJpYXRlIGFuaW1hdGlvbnMgaGF2ZSBiZWVuIHNldCB1cCBhbmQgcnVuLiBOb3cgd2UgY2FuIGNsZWFyIG91dCB0aGUKKyAgICAgICAgLy8gbGF5b3V0IGxpc3RlbmVycy4KKyAgICAgICAgb2JzZXJ2ZXIuYWRkT25QcmVEcmF3TGlzdGVuZXIobmV3IFZpZXdUcmVlT2JzZXJ2ZXIuT25QcmVEcmF3TGlzdGVuZXIoKSB7CisgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBvblByZURyYXcoKSB7CisgICAgICAgICAgICAgICAgcGFyZW50LmdldFZpZXdUcmVlT2JzZXJ2ZXIoKS5yZW1vdmVPblByZURyYXdMaXN0ZW5lcih0aGlzKTsKKyAgICAgICAgICAgICAgICBpbnQgbnVtQ2hpbGRyZW4gPSBwYXJlbnQuZ2V0Q2hpbGRDb3VudCgpOworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtQ2hpbGRyZW47ICsraSkgeworICAgICAgICAgICAgICAgICAgICBmaW5hbCBWaWV3IGNoaWxkID0gcGFyZW50LmdldENoaWxkQXQoaSk7CisgICAgICAgICAgICAgICAgICAgIGNoaWxkLnJlbW92ZU9uTGF5b3V0Q2hhbmdlTGlzdGVuZXIobGF5b3V0Q2hhbmdlTGlzdGVuZXJNYXAuZ2V0KGNoaWxkKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGxheW91dENoYW5nZUxpc3RlbmVyTWFwLmNsZWFyKCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoaXMgbWV0aG9kIHJ1bnMgdGhlIGFuaW1hdGlvbiB0aGF0IG1ha2VzIGFuIGFkZGVkIGl0ZW0gYXBwZWFyLgorICAgICAqCisgICAgICogQHBhcmFtIHBhcmVudCBUaGUgVmlld0dyb3VwIHRvIHdoaWNoIHRoZSBWaWV3IGlzIGJlaW5nIGFkZGVkLgorICAgICAqIEBwYXJhbSBjaGlsZCBUaGUgVmlldyBiZWluZyBhZGRlZCB0byB0aGUgVmlld0dyb3VwLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBydW5BcHBlYXJpbmdUcmFuc2l0aW9uKGZpbmFsIFZpZXdHcm91cCBwYXJlbnQsIGZpbmFsIFZpZXcgY2hpbGQpIHsKKyAgICAgICAgQW5pbWF0b3IgYW5pbSA9IG1BcHBlYXJpbmdBbmltLmNsb25lKCk7CisgICAgICAgIGFuaW0uc2V0VGFyZ2V0KGNoaWxkKTsKKyAgICAgICAgYW5pbS5zZXRTdGFydERlbGF5KG1BcHBlYXJpbmdEZWxheSk7CisgICAgICAgIGFuaW0uc2V0RHVyYXRpb24obUFwcGVhcmluZ0R1cmF0aW9uKTsKKyAgICAgICAgaWYgKGFuaW0gaW5zdGFuY2VvZiBPYmplY3RBbmltYXRvcikgeworICAgICAgICAgICAgKChPYmplY3RBbmltYXRvcikgYW5pbSkuc2V0Q3VycmVudFBsYXlUaW1lKDApOworICAgICAgICB9CisgICAgICAgIGlmIChtTGlzdGVuZXJzICE9IG51bGwpIHsKKyAgICAgICAgICAgIGFuaW0uYWRkTGlzdGVuZXIobmV3IEFuaW1hdG9yTGlzdGVuZXJBZGFwdGVyKCkgeworICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uQW5pbWF0aW9uRW5kKCkgeworICAgICAgICAgICAgICAgICAgICBmb3IgKFRyYW5zaXRpb25MaXN0ZW5lciBsaXN0ZW5lciA6IG1MaXN0ZW5lcnMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxpc3RlbmVyLmVuZFRyYW5zaXRpb24oTGF5b3V0VHJhbnNpdGlvbi50aGlzLCBwYXJlbnQsIGNoaWxkLCBBUFBFQVJJTkcpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgICAgIH0KKyAgICAgICAgYW5pbS5zdGFydCgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoaXMgbWV0aG9kIHJ1bnMgdGhlIGFuaW1hdGlvbiB0aGF0IG1ha2VzIGEgcmVtb3ZlZCBpdGVtIGRpc2FwcGVhci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwYXJlbnQgVGhlIFZpZXdHcm91cCBmcm9tIHdoaWNoIHRoZSBWaWV3IGlzIGJlaW5nIHJlbW92ZWQuCisgICAgICogQHBhcmFtIGNoaWxkIFRoZSBWaWV3IGJlaW5nIHJlbW92ZWQgZnJvbSB0aGUgVmlld0dyb3VwLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBydW5EaXNhcHBlYXJpbmdUcmFuc2l0aW9uKGZpbmFsIFZpZXdHcm91cCBwYXJlbnQsIGZpbmFsIFZpZXcgY2hpbGQpIHsKKyAgICAgICAgQW5pbWF0b3IgYW5pbSA9IG1EaXNhcHBlYXJpbmdBbmltLmNsb25lKCk7CisgICAgICAgIGFuaW0uc2V0U3RhcnREZWxheShtRGlzYXBwZWFyaW5nRGVsYXkpOworICAgICAgICBhbmltLnNldER1cmF0aW9uKG1EaXNhcHBlYXJpbmdEdXJhdGlvbik7CisgICAgICAgIGFuaW0uc2V0VGFyZ2V0KGNoaWxkKTsKKyAgICAgICAgaWYgKG1MaXN0ZW5lcnMgIT0gbnVsbCkgeworICAgICAgICAgICAgYW5pbS5hZGRMaXN0ZW5lcihuZXcgQW5pbWF0b3JMaXN0ZW5lckFkYXB0ZXIoKSB7CisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgb25BbmltYXRpb25FbmQoKSB7CisgICAgICAgICAgICAgICAgICAgIGZvciAoVHJhbnNpdGlvbkxpc3RlbmVyIGxpc3RlbmVyIDogbUxpc3RlbmVycykgeworICAgICAgICAgICAgICAgICAgICAgICAgbGlzdGVuZXIuZW5kVHJhbnNpdGlvbihMYXlvdXRUcmFuc2l0aW9uLnRoaXMsIHBhcmVudCwgY2hpbGQsIERJU0FQUEVBUklORyk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKyAgICAgICAgfQorICAgICAgICBpZiAoYW5pbSBpbnN0YW5jZW9mIE9iamVjdEFuaW1hdG9yKSB7CisgICAgICAgICAgICAoKE9iamVjdEFuaW1hdG9yKSBhbmltKS5zZXRDdXJyZW50UGxheVRpbWUoMCk7CisgICAgICAgIH0KKyAgICAgICAgYW5pbS5zdGFydCgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBieSBWaWV3R3JvdXAgd2hlbiBhIGNoaWxkIHZpZXcgaXMgYWJvdXQgdG8gYmUgYWRkZWQgdG8gdGhlCisgICAgICogY29udGFpbmVyLiBUaGlzIGNhbGxiYWNrIHN0YXJ0cyB0aGUgcHJvY2VzcyBvZiBhIHRyYW5zaXRpb247IHdlIGdyYWIgdGhlIHN0YXJ0aW5nCisgICAgICogdmFsdWVzLCBsaXN0ZW4gZm9yIGNoYW5nZXMgdG8gYWxsIG9mIHRoZSBjaGlsZHJlbiBvZiB0aGUgY29udGFpbmVyLCBhbmQgc3RhcnQgYXBwcm9wcmlhdGUKKyAgICAgKiBhbmltYXRpb25zLgorICAgICAqCisgICAgICogQHBhcmFtIHBhcmVudCBUaGUgVmlld0dyb3VwIHRvIHdoaWNoIHRoZSBWaWV3IGlzIGJlaW5nIGFkZGVkLgorICAgICAqIEBwYXJhbSBjaGlsZCBUaGUgVmlldyBiZWluZyBhZGRlZCB0byB0aGUgVmlld0dyb3VwLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGNoaWxkQWRkKFZpZXdHcm91cCBwYXJlbnQsIFZpZXcgY2hpbGQpIHsKKyAgICAgICAgaWYgKG1MaXN0ZW5lcnMgIT0gbnVsbCkgeworICAgICAgICAgICAgZm9yIChUcmFuc2l0aW9uTGlzdGVuZXIgbGlzdGVuZXIgOiBtTGlzdGVuZXJzKSB7CisgICAgICAgICAgICAgICAgbGlzdGVuZXIuc3RhcnRUcmFuc2l0aW9uKHRoaXMsIHBhcmVudCwgY2hpbGQsIEFQUEVBUklORyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcnVuQ2hhbmdlVHJhbnNpdGlvbihwYXJlbnQsIGNoaWxkLCBBUFBFQVJJTkcpOworICAgICAgICBydW5BcHBlYXJpbmdUcmFuc2l0aW9uKHBhcmVudCwgY2hpbGQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBieSBWaWV3R3JvdXAgd2hlbiBhIGNoaWxkIHZpZXcgaXMgYWJvdXQgdG8gYmUgcmVtb3ZlZCBmcm9tIHRoZQorICAgICAqIGNvbnRhaW5lci4gVGhpcyBjYWxsYmFjayBzdGFydHMgdGhlIHByb2Nlc3Mgb2YgYSB0cmFuc2l0aW9uOyB3ZSBncmFiIHRoZSBzdGFydGluZworICAgICAqIHZhbHVlcywgbGlzdGVuIGZvciBjaGFuZ2VzIHRvIGFsbCBvZiB0aGUgY2hpbGRyZW4gb2YgdGhlIGNvbnRhaW5lciwgYW5kIHN0YXJ0IGFwcHJvcHJpYXRlCisgICAgICogYW5pbWF0aW9ucy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwYXJlbnQgVGhlIFZpZXdHcm91cCBmcm9tIHdoaWNoIHRoZSBWaWV3IGlzIGJlaW5nIHJlbW92ZWQuCisgICAgICogQHBhcmFtIGNoaWxkIFRoZSBWaWV3IGJlaW5nIHJlbW92ZWQgZnJvbSB0aGUgVmlld0dyb3VwLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGNoaWxkUmVtb3ZlKFZpZXdHcm91cCBwYXJlbnQsIFZpZXcgY2hpbGQpIHsKKyAgICAgICAgaWYgKG1MaXN0ZW5lcnMgIT0gbnVsbCkgeworICAgICAgICAgICAgZm9yIChUcmFuc2l0aW9uTGlzdGVuZXIgbGlzdGVuZXIgOiBtTGlzdGVuZXJzKSB7CisgICAgICAgICAgICAgICAgbGlzdGVuZXIuc3RhcnRUcmFuc2l0aW9uKHRoaXMsIHBhcmVudCwgY2hpbGQsIERJU0FQUEVBUklORyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcnVuQ2hhbmdlVHJhbnNpdGlvbihwYXJlbnQsIGNoaWxkLCBESVNBUFBFQVJJTkcpOworICAgICAgICBydW5EaXNhcHBlYXJpbmdUcmFuc2l0aW9uKHBhcmVudCwgY2hpbGQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZCBhIGxpc3RlbmVyIHRoYXQgd2lsbCBiZSBjYWxsZWQgd2hlbiB0aGUgYm91bmRzIG9mIHRoZSB2aWV3IGNoYW5nZSBkdWUgdG8KKyAgICAgKiBsYXlvdXQgcHJvY2Vzc2luZy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBsaXN0ZW5lciBUaGUgbGlzdGVuZXIgdGhhdCB3aWxsIGJlIGNhbGxlZCB3aGVuIGxheW91dCBib3VuZHMgY2hhbmdlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZFRyYW5zaXRpb25MaXN0ZW5lcihUcmFuc2l0aW9uTGlzdGVuZXIgbGlzdGVuZXIpIHsKKyAgICAgICAgaWYgKG1MaXN0ZW5lcnMgPT0gbnVsbCkgeworICAgICAgICAgICAgbUxpc3RlbmVycyA9IG5ldyBBcnJheUxpc3Q8VHJhbnNpdGlvbkxpc3RlbmVyPigpOworICAgICAgICB9CisgICAgICAgIG1MaXN0ZW5lcnMuYWRkKGxpc3RlbmVyKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZW1vdmUgYSBsaXN0ZW5lciBmb3IgbGF5b3V0IGNoYW5nZXMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbGlzdGVuZXIgVGhlIGxpc3RlbmVyIGZvciBsYXlvdXQgYm91bmRzIGNoYW5nZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZW1vdmVUcmFuc2l0aW9uTGlzdGVuZXIoVHJhbnNpdGlvbkxpc3RlbmVyIGxpc3RlbmVyKSB7CisgICAgICAgIGlmIChtTGlzdGVuZXJzID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBtTGlzdGVuZXJzLnJlbW92ZShsaXN0ZW5lcik7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgY3VycmVudCBsaXN0IG9mIGxpc3RlbmVycyBmb3IgbGF5b3V0IGNoYW5nZXMuCisgICAgICogQHJldHVybgorICAgICAqLworICAgIHB1YmxpYyBMaXN0PFRyYW5zaXRpb25MaXN0ZW5lcj4gZ2V0VHJhbnNpdGlvbkxpc3RlbmVycygpIHsKKyAgICAgICAgcmV0dXJuIG1MaXN0ZW5lcnM7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhpcyBpbnRlcmZhY2UgaXMgdXNlZCBmb3IgbGlzdGVuaW5nIHRvIHN0YXJ0aW5nIGFuZCBlbmRpbmcgZXZlbnRzIGZvciB0cmFuc2l0aW9ucy4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50ZXJmYWNlIFRyYW5zaXRpb25MaXN0ZW5lciB7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoaXMgZXZlbnQgaXMgc2VudCB0byBsaXN0ZW5lcnMgd2hlbiBhbiBBUFBFQVJJTkcgb3IgRElTQVBQRUFSSU5HIHRyYW5zaXRpb24KKyAgICAgICAgICogYmVnaW5zLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gdHJhbnNpdGlvbiBUaGUgTGF5b3V0VHJhbnNpdGlvbiBzZW5kaW5nIG91dCB0aGUgZXZlbnQuCisgICAgICAgICAqIEBwYXJhbSBjb250YWluZXIgVGhlIFZpZXdHcm91cCBvbiB3aGljaCB0aGUgdHJhbnNpdGlvbiBpcyBwbGF5aW5nLgorICAgICAgICAgKiBAcGFyYW0gdmlldyBUaGUgVmlldyBvYmplY3QgYmVpbmcgYWRkZWQgb3IgcmVtb3ZlZCBmcm9tIGl0cyBwYXJlbnQuCisgICAgICAgICAqIEBwYXJhbSB0cmFuc2l0aW9uVHlwZSBUaGUgdHlwZSBvZiB0cmFuc2l0aW9uIHRoYXQgaXMgYmVnaW5uaW5nLCBlaXRoZXIKKyAgICAgICAgICoge0BsaW5rIGFuZHJvaWQuYW5pbWF0aW9uLkxheW91dFRyYW5zaXRpb24jQVBQRUFSSU5HfSBvcgorICAgICAgICAgKiB7QGxpbmsgYW5kcm9pZC5hbmltYXRpb24uTGF5b3V0VHJhbnNpdGlvbiNESVNBUFBFQVJJTkd9LgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgc3RhcnRUcmFuc2l0aW9uKExheW91dFRyYW5zaXRpb24gdHJhbnNpdGlvbiwgVmlld0dyb3VwIGNvbnRhaW5lciwKKyAgICAgICAgICAgICAgICBWaWV3IHZpZXcsIGludCB0cmFuc2l0aW9uVHlwZSk7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoaXMgZXZlbnQgaXMgc2VudCB0byBsaXN0ZW5lcnMgd2hlbiBhbiBBUFBFQVJJTkcgb3IgRElTQVBQRUFSSU5HIHRyYW5zaXRpb24gZW5kcy4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIHRyYW5zaXRpb24gVGhlIExheW91dFRyYW5zaXRpb24gc2VuZGluZyBvdXQgdGhlIGV2ZW50LgorICAgICAgICAgKiBAcGFyYW0gY29udGFpbmVyIFRoZSBWaWV3R3JvdXAgb24gd2hpY2ggdGhlIHRyYW5zaXRpb24gaXMgcGxheWluZy4KKyAgICAgICAgICogQHBhcmFtIHZpZXcgVGhlIFZpZXcgb2JqZWN0IGJlaW5nIGFkZGVkIG9yIHJlbW92ZWQgZnJvbSBpdHMgcGFyZW50LgorICAgICAgICAgKiBAcGFyYW0gdHJhbnNpdGlvblR5cGUgVGhlIHR5cGUgb2YgdHJhbnNpdGlvbiB0aGF0IGlzIGVuZGluZywgZWl0aGVyCisgICAgICAgICAqIHtAbGluayBhbmRyb2lkLmFuaW1hdGlvbi5MYXlvdXRUcmFuc2l0aW9uI0FQUEVBUklOR30gb3IKKyAgICAgICAgICoge0BsaW5rIGFuZHJvaWQuYW5pbWF0aW9uLkxheW91dFRyYW5zaXRpb24jRElTQVBQRUFSSU5HfS4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2b2lkIGVuZFRyYW5zaXRpb24oTGF5b3V0VHJhbnNpdGlvbiB0cmFuc2l0aW9uLCBWaWV3R3JvdXAgY29udGFpbmVyLAorICAgICAgICAgICAgICAgIFZpZXcgdmlldywgaW50IHRyYW5zaXRpb25UeXBlKTsKKyAgICB9CisKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9hbmltYXRpb24vT2JqZWN0QW5pbWF0b3IuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2FuaW1hdGlvbi9PYmplY3RBbmltYXRvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZjYjkwYmUKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9hbmltYXRpb24vT2JqZWN0QW5pbWF0b3IuamF2YQpAQCAtMCwwICsxLDI0NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5hbmltYXRpb247CisKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworCitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOworCisvKioKKyAqIFRoaXMgc3ViY2xhc3Mgb2Yge0BsaW5rIFZhbHVlQW5pbWF0b3J9IHByb3ZpZGVzIHN1cHBvcnQgZm9yIGFuaW1hdGluZyBwcm9wZXJ0aWVzIG9uIHRhcmdldCBvYmplY3RzLgorICogVGhlIGNvbnN0cnVjdG9ycyBvZiB0aGlzIGNsYXNzIHRha2UgcGFyYW1ldGVycyB0byBkZWZpbmUgdGhlIHRhcmdldCBvYmplY3QgdGhhdCB3aWxsIGJlIGFuaW1hdGVkCisgKiBhcyB3ZWxsIGFzIHRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSB0aGF0IHdpbGwgYmUgYW5pbWF0ZWQuIEFwcHJvcHJpYXRlIHNldC9nZXQgZnVuY3Rpb25zCisgKiBhcmUgdGhlbiBkZXRlcm1pbmVkIGludGVybmFsbHkgYW5kIHRoZSBhbmltYXRpb24gd2lsbCBjYWxsIHRoZXNlIGZ1bmN0aW9ucyBhcyBuZWNlc3NhcnkgdG8KKyAqIGFuaW1hdGUgdGhlIHByb3BlcnR5LgorICovCitwdWJsaWMgZmluYWwgY2xhc3MgT2JqZWN0QW5pbWF0b3I8VD4gZXh0ZW5kcyBWYWx1ZUFuaW1hdG9yPFQ+IHsKKworICAgIC8vIFRoZSB0YXJnZXQgb2JqZWN0IG9uIHdoaWNoIHRoZSBwcm9wZXJ0eSBleGlzdHMsIHNldCBpbiB0aGUgY29uc3RydWN0b3IKKyAgICBwcml2YXRlIE9iamVjdCBtVGFyZ2V0OworCisgICAgcHJpdmF0ZSBTdHJpbmcgbVByb3BlcnR5TmFtZTsKKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5IHRoYXQgd2lsbCBiZSBhbmltYXRlZC4gVGhpcyBuYW1lIGlzIHVzZWQgdG8gZGVyaXZlCisgICAgICogYSBzZXR0ZXIgZnVuY3Rpb24gdGhhdCB3aWxsIGJlIGNhbGxlZCB0byBzZXQgYW5pbWF0ZWQgdmFsdWVzLgorICAgICAqIEZvciBleGFtcGxlLCBhIHByb3BlcnR5IG5hbWUgb2YgPGNvZGU+Zm9vPC9jb2RlPiB3aWxsIHJlc3VsdAorICAgICAqIGluIGEgY2FsbCB0byB0aGUgZnVuY3Rpb24gPGNvZGU+c2V0Rm9vKCk8L2NvZGU+IG9uIHRoZSB0YXJnZXQgb2JqZWN0LiBJZiBlaXRoZXIKKyAgICAgKiA8Y29kZT52YWx1ZUZyb208L2NvZGU+IG9yIDxjb2RlPnZhbHVlVG88L2NvZGU+IGlzIG51bGwsIHRoZW4gYSBnZXR0ZXIgZnVuY3Rpb24gd2lsbAorICAgICAqIGFsc28gYmUgZGVyaXZlZCBhbmQgY2FsbGVkLgorICAgICAqCisgICAgICogPHA+Tm90ZSB0aGF0IHRoZSBzZXR0ZXIgZnVuY3Rpb24gZGVyaXZlZCBmcm9tIHRoaXMgcHJvcGVydHkgbmFtZQorICAgICAqIG11c3QgdGFrZSB0aGUgc2FtZSBwYXJhbWV0ZXIgdHlwZSBhcyB0aGUKKyAgICAgKiA8Y29kZT52YWx1ZUZyb208L2NvZGU+IGFuZCA8Y29kZT52YWx1ZVRvPC9jb2RlPiBwcm9wZXJ0aWVzLCBvdGhlcndpc2UgdGhlIGNhbGwgdG8KKyAgICAgKiB0aGUgc2V0dGVyIGZ1bmN0aW9uIHdpbGwgZmFpbC48L3A+CisgICAgICoKKyAgICAgKiA8cD5JZiB0aGlzIE9iamVjdEFuaW1hdG9yIGhhcyBiZWVuIHNldCB1cCB0byBhbmltYXRlIHNldmVyYWwgcHJvcGVydGllcyB0b2dldGhlciwKKyAgICAgKiB1c2luZyBtb3JlIHRoYW4gb25lIFByb3BlcnR5VmFsdWVzSG9sZGVyIG9iamVjdHMsIHRoZW4gc2V0dGluZyB0aGUgcHJvcGVydHlOYW1lIHNpbXBseQorICAgICAqIHNldHMgdGhlIHByb3BlcnR5TmFtZSBpbiB0aGUgZmlyc3Qgb2YgdGhvc2UgUHJvcGVydHlWYWx1ZXNIb2xkZXIgb2JqZWN0cy48L3A+CisgICAgICoKKyAgICAgKiBAcGFyYW0gcHJvcGVydHlOYW1lIFRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSBiZWluZyBhbmltYXRlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRQcm9wZXJ0eU5hbWUoU3RyaW5nIHByb3BlcnR5TmFtZSkgeworICAgICAgICBpZiAobVZhbHVlcyAhPSBudWxsKSB7CisgICAgICAgICAgICAvLyBtVmFsdWVzIHNob3VsZCBhbHdheXMgYmUgbm9uLW51bGwKKyAgICAgICAgICAgIFByb3BlcnR5VmFsdWVzSG9sZGVyIHZhbHVlc0hvbGRlciA9IG1WYWx1ZXNbMF07CisgICAgICAgICAgICBTdHJpbmcgb2xkTmFtZSA9IHZhbHVlc0hvbGRlci5nZXRQcm9wZXJ0eU5hbWUoKTsKKyAgICAgICAgICAgIHZhbHVlc0hvbGRlci5zZXRQcm9wZXJ0eU5hbWUocHJvcGVydHlOYW1lKTsKKyAgICAgICAgICAgIG1WYWx1ZXNNYXAucmVtb3ZlKG9sZE5hbWUpOworICAgICAgICAgICAgbVZhbHVlc01hcC5wdXQocHJvcGVydHlOYW1lLCB2YWx1ZXNIb2xkZXIpOworICAgICAgICB9CisgICAgICAgIG1Qcm9wZXJ0eU5hbWUgPSBwcm9wZXJ0eU5hbWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgbmFtZSBvZiB0aGUgcHJvcGVydHkgdGhhdCB3aWxsIGJlIGFuaW1hdGVkLiBUaGlzIG5hbWUgd2lsbCBiZSB1c2VkIHRvIGRlcml2ZQorICAgICAqIGEgc2V0dGVyIGZ1bmN0aW9uIHRoYXQgd2lsbCBiZSBjYWxsZWQgdG8gc2V0IGFuaW1hdGVkIHZhbHVlcy4KKyAgICAgKiBGb3IgZXhhbXBsZSwgYSBwcm9wZXJ0eSBuYW1lIG9mIDxjb2RlPmZvbzwvY29kZT4gd2lsbCByZXN1bHQKKyAgICAgKiBpbiBhIGNhbGwgdG8gdGhlIGZ1bmN0aW9uIDxjb2RlPnNldEZvbygpPC9jb2RlPiBvbiB0aGUgdGFyZ2V0IG9iamVjdC4gSWYgZWl0aGVyCisgICAgICogPGNvZGU+dmFsdWVGcm9tPC9jb2RlPiBvciA8Y29kZT52YWx1ZVRvPC9jb2RlPiBpcyBudWxsLCB0aGVuIGEgZ2V0dGVyIGZ1bmN0aW9uIHdpbGwKKyAgICAgKiBhbHNvIGJlIGRlcml2ZWQgYW5kIGNhbGxlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldFByb3BlcnR5TmFtZSgpIHsKKyAgICAgICAgcmV0dXJuIG1Qcm9wZXJ0eU5hbWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogRGV0ZXJtaW5lIHRoZSBzZXR0ZXIgb3IgZ2V0dGVyIGZ1bmN0aW9uIHVzaW5nIHRoZSBKYXZhQmVhbnMgY29udmVudGlvbiBvZiBzZXRGb28gb3IKKyAgICAgKiBnZXRGb28gZm9yIGEgcHJvcGVydHkgbmFtZWQgJ2ZvbycuIFRoaXMgZnVuY3Rpb24gZmlndXJlcyBvdXQgd2hhdCB0aGUgbmFtZSBvZiB0aGUKKyAgICAgKiBmdW5jdGlvbiBzaG91bGQgYmUgYW5kIHVzZXMgcmVmbGVjdGlvbiB0byBmaW5kIHRoZSBNZXRob2Qgd2l0aCB0aGF0IG5hbWUgb24gdGhlCisgICAgICogdGFyZ2V0IG9iamVjdC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwcmVmaXggInNldCIgb3IgImdldCIsIGRlcGVuZGluZyBvbiB3aGV0aGVyIHdlIG5lZWQgYSBzZXR0ZXIgb3IgZ2V0dGVyLgorICAgICAqIEByZXR1cm4gTWV0aG9kIHRoZSBtZXRob2QgYXNzb2NpYXRlZCB3aXRoIG1Qcm9wZXJ0eU5hbWUuCisgICAgICovCisgICAgcHJpdmF0ZSBNZXRob2QgZ2V0UHJvcGVydHlGdW5jdGlvbihTdHJpbmcgcHJlZml4LCBDbGFzcyB2YWx1ZVR5cGUpIHsKKyAgICAgICAgLy8gVE9ETzogZmFzdGVyIGltcGxlbWVudGF0aW9uLi4uCisgICAgICAgIE1ldGhvZCByZXR1cm5WYWwgPSBudWxsOworICAgICAgICBTdHJpbmcgZmlyc3RMZXR0ZXIgPSBtUHJvcGVydHlOYW1lLnN1YnN0cmluZygwLCAxKTsKKyAgICAgICAgU3RyaW5nIHRoZVJlc3QgPSBtUHJvcGVydHlOYW1lLnN1YnN0cmluZygxKTsKKyAgICAgICAgZmlyc3RMZXR0ZXIgPSBmaXJzdExldHRlci50b1VwcGVyQ2FzZSgpOworICAgICAgICBTdHJpbmcgc2V0dGVyTmFtZSA9IHByZWZpeCArIGZpcnN0TGV0dGVyICsgdGhlUmVzdDsKKyAgICAgICAgQ2xhc3MgYXJnc1tdID0gbnVsbDsKKyAgICAgICAgaWYgKHZhbHVlVHlwZSAhPSBudWxsKSB7CisgICAgICAgICAgICBhcmdzID0gbmV3IENsYXNzWzFdOworICAgICAgICAgICAgYXJnc1swXSA9IHZhbHVlVHlwZTsKKyAgICAgICAgfQorICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuVmFsID0gbVRhcmdldC5nZXRDbGFzcygpLmdldE1ldGhvZChzZXR0ZXJOYW1lLCBhcmdzKTsKKyAgICAgICAgfSBjYXRjaCAoTm9TdWNoTWV0aG9kRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIExvZy5lKCJPYmplY3RBbmltYXRvciIsCisgICAgICAgICAgICAgICAgICAgICJDb3VsZG4ndCBmaW5kIHNldHRlci9nZXR0ZXIgZm9yIHByb3BlcnR5ICIgKyBtUHJvcGVydHlOYW1lICsgIjogIiArIGUpOworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXR1cm5WYWw7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIG5ldyBPYmplY3RBbmltYXRvciBvYmplY3QuIFRoaXMgZGVmYXVsdCBjb25zdHJ1Y3RvciBpcyBwcmltYXJpbHkgZm9yCisgICAgICogdXNlIGludGVybmFsbHk7IHRoZSBvdGhlciBjb25zdHJ1Y3RvcnMgd2hpY2ggdGFrZSBwYXJhbWV0ZXJzIGFyZSBtb3JlIGdlbmVyYWxseQorICAgICAqIHVzZWZ1bC4KKyAgICAgKi8KKyAgICBwdWJsaWMgT2JqZWN0QW5pbWF0b3IoKSB7CisgICAgfQorCisgICAgLyoqCisgICAgICogQSBjb25zdHJ1Y3RvciB0aGF0IHRha2VzIGEgc2luZ2xlIHByb3BlcnR5IG5hbWUgYW5kIHNldCBvZiB2YWx1ZXMuIFRoaXMgY29uc3RydWN0b3IgaXMKKyAgICAgKiB1c2VkIGluIHRoZSBzaW1wbGUgY2FzZSBvZiBhbmltYXRpbmcgYSBzaW5nbGUgcHJvcGVydHkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZHVyYXRpb24gVGhlIGxlbmd0aCBvZiB0aGUgYW5pbWF0aW9uLCBpbiBtaWxsaXNlY29uZHMuCisgICAgICogQHBhcmFtIHRhcmdldCBUaGUgb2JqZWN0IHdob3NlIHByb3BlcnR5IGlzIHRvIGJlIGFuaW1hdGVkLiBUaGlzIG9iamVjdCBzaG91bGQKKyAgICAgKiBoYXZlIGEgcHVibGljIG1ldGhvZCBvbiBpdCBjYWxsZWQgPGNvZGU+c2V0TmFtZSgpPC9jb2RlPiwgd2hlcmUgPGNvZGU+bmFtZTwvY29kZT4gaXMKKyAgICAgKiB0aGUgdmFsdWUgb2YgdGhlIDxjb2RlPnByb3BlcnR5TmFtZTwvY29kZT4gcGFyYW1ldGVyLgorICAgICAqIEBwYXJhbSBwcm9wZXJ0eU5hbWUgVGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5IGJlaW5nIGFuaW1hdGVkLgorICAgICAqIEBwYXJhbSB2YWx1ZXMgVGhlIHNldCBvZiB2YWx1ZXMgdG8gYW5pbWF0ZSBiZXR3ZWVuLiBJZiB0aGVyZSBpcyBvbmx5IG9uZSB2YWx1ZSwgaXQKKyAgICAgKiBpcyBhc3N1bWVkIHRvIGJlIHRoZSBmaW5hbCB2YWx1ZSBiZWluZyBhbmltYXRlZCB0bywgYW5kIHRoZSBpbml0aWFsIHZhbHVlIHdpbGwgYmUKKyAgICAgKiBkZXJpdmVkIG9uIHRoZSBmbHkuCisgICAgICovCisgICAgcHVibGljIE9iamVjdEFuaW1hdG9yKGxvbmcgZHVyYXRpb24sIE9iamVjdCB0YXJnZXQsIFN0cmluZyBwcm9wZXJ0eU5hbWUsIFQuLi52YWx1ZXMpIHsKKyAgICAgICAgc3VwZXIoZHVyYXRpb24sIChUW10pIHZhbHVlcyk7CisgICAgICAgIG1UYXJnZXQgPSB0YXJnZXQ7CisgICAgICAgIHNldFByb3BlcnR5TmFtZShwcm9wZXJ0eU5hbWUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEEgY29uc3RydWN0b3IgdGhhdCB0YWtlcyA8Y29kZT5Qcm9wZXJ0eVZhbHVlSG9sZGVyPC9jb2RlPiB2YWx1ZXMuIFRoaXMgY29uc3RydWN0b3Igc2hvdWxkCisgICAgICogYmUgdXNlZCB3aGVuIGFuaW1hdGluZyBzZXZlcmFsIHByb3BlcnRpZXMgYXQgb25jZSB3aXRoIHRoZSBzYW1lIE9iamVjdEFuaW1hdG9yLCBzaW5jZQorICAgICAqIFByb3BlcnR5VmFsdWVzSG9sZGVyIGFsbG93cyB5b3UgdG8gYXNzb2NpYXRlIGEgc2V0IG9mIGFuaW1hdGlvbiB2YWx1ZXMgd2l0aCBhIHByb3BlcnR5CisgICAgICogbmFtZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBkdXJhdGlvbiBUaGUgbGVuZ3RoIG9mIHRoZSBhbmltYXRpb24sIGluIG1pbGxpc2Vjb25kcy4KKyAgICAgKiBAcGFyYW0gdGFyZ2V0IFRoZSBvYmplY3Qgd2hvc2UgcHJvcGVydHkgaXMgdG8gYmUgYW5pbWF0ZWQuIFRoaXMgb2JqZWN0IHNob3VsZAorICAgICAqIGhhdmUgcHVibGljIG1ldGhvZHMgb24gaXQgY2FsbGVkIDxjb2RlPnNldE5hbWUoKTwvY29kZT4sIHdoZXJlIDxjb2RlPm5hbWU8L2NvZGU+IGlzCisgICAgICogdGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5IHBhc3NlZCBpbiBhcyB0aGUgPGNvZGU+cHJvcGVydHlOYW1lPC9jb2RlPiBwYXJhbWV0ZXIgZm9yCisgICAgICogZWFjaCBvZiB0aGUgUHJvcGVydHlWYWx1ZXNIb2xkZXIgb2JqZWN0cy4KKyAgICAgKiBAcGFyYW0gdmFsdWVzIFRoZSBQcm9wZXJ0eVZhbHVlc0hvbGRlciBvYmplY3RzIHdoaWNoIGhvbGQgZWFjaCB0aGUgcHJvcGVydHkgbmFtZSBhbmQgdmFsdWVzCisgICAgICogdG8gYW5pbWF0ZSB0aGF0IHByb3BlcnR5IGJldHdlZW4uCisgICAgICovCisgICAgcHVibGljIE9iamVjdEFuaW1hdG9yKGxvbmcgZHVyYXRpb24sIE9iamVjdCB0YXJnZXQsIFByb3BlcnR5VmFsdWVzSG9sZGVyLi4udmFsdWVzKSB7CisgICAgICAgIHN1cGVyKGR1cmF0aW9uKTsKKyAgICAgICAgc2V0VmFsdWVzKHZhbHVlcyk7CisgICAgICAgIG1UYXJnZXQgPSB0YXJnZXQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgaW1tZWRpYXRlbHkgYmVmb3JlIHByb2Nlc3NpbmcgdGhlIGZpcnN0IGFuaW1hdGlvbgorICAgICAqIGZyYW1lIG9mIGFuIGFuaW1hdGlvbi4gSWYgdGhlcmUgaXMgYSBub256ZXJvIDxjb2RlPnN0YXJ0RGVsYXk8L2NvZGU+LCB0aGUKKyAgICAgKiBmdW5jdGlvbiBpcyBjYWxsZWQgYWZ0ZXIgdGhhdCBkZWxheSBlbmRzLgorICAgICAqIEl0IHRha2VzIGNhcmUgb2YgdGhlIGZpbmFsIGluaXRpYWxpemF0aW9uIHN0ZXBzIGZvciB0aGUKKyAgICAgKiBhbmltYXRpb24uIFRoaXMgaW5jbHVkZXMgc2V0dGluZyBtRXZhbHVhdG9yLCBpZiB0aGUgdXNlciBoYXMgbm90IHlldAorICAgICAqIHNldCBpdCB1cCwgYW5kIHRoZSBzZXR0ZXIvZ2V0dGVyIG1ldGhvZHMsIGlmIHRoZSB1c2VyIGRpZCBub3Qgc3VwcGx5CisgICAgICogdGhlbS4KKyAgICAgKgorICAgICAqICA8cD5PdmVycmlkZXJzIG9mIHRoaXMgbWV0aG9kIHNob3VsZCBjYWxsIHRoZSBzdXBlcmNsYXNzIG1ldGhvZCB0byBjYXVzZQorICAgICAqICBpbnRlcm5hbCBtZWNoYW5pc21zIHRvIGJlIHNldCB1cCBjb3JyZWN0bHkuPC9wPgorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHZvaWQgaW5pdEFuaW1hdGlvbigpIHsKKyAgICAgICAgaWYgKCFtSW5pdGlhbGl6ZWQpIHsKKyAgICAgICAgICAgIC8vIG1WYWx1ZVR5cGUgbWF5IGNoYW5nZSBkdWUgdG8gc2V0dGVyL2dldHRlciBzZXR1cDsgZG8gdGhpcyBiZWZvcmUgY2FsbGluZyBzdXBlci5pbml0KCksCisgICAgICAgICAgICAvLyB3aGljaCB1c2VzIG1WYWx1ZVR5cGUgdG8gc2V0IHVwIHRoZSBkZWZhdWx0IHR5cGUgZXZhbHVhdG9yLgorICAgICAgICAgICAgaW50IG51bVZhbHVlcyA9IG1WYWx1ZXMubGVuZ3RoOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1WYWx1ZXM7ICsraSkgeworICAgICAgICAgICAgICAgIG1WYWx1ZXNbaV0uc2V0dXBTZXR0ZXJBbmRHZXR0ZXIobVRhcmdldCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzdXBlci5pbml0QW5pbWF0aW9uKCk7CisgICAgICAgIH0KKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFRoZSB0YXJnZXQgb2JqZWN0IHdob3NlIHByb3BlcnR5IHdpbGwgYmUgYW5pbWF0ZWQgYnkgdGhpcyBhbmltYXRpb24KKyAgICAgKgorICAgICAqIEByZXR1cm4gVGhlIG9iamVjdCBiZWluZyBhbmltYXRlZAorICAgICAqLworICAgIHB1YmxpYyBPYmplY3QgZ2V0VGFyZ2V0KCkgeworICAgICAgICByZXR1cm4gbVRhcmdldDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSB0YXJnZXQgb2JqZWN0IHdob3NlIHByb3BlcnR5IHdpbGwgYmUgYW5pbWF0ZWQgYnkgdGhpcyBhbmltYXRpb24KKyAgICAgKgorICAgICAqIEBwYXJhbSB0YXJnZXQgVGhlIG9iamVjdCBiZWluZyBhbmltYXRlZAorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHNldFRhcmdldChPYmplY3QgdGFyZ2V0KSB7CisgICAgICAgIG1UYXJnZXQgPSB0YXJnZXQ7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgc2V0dXBTdGFydFZhbHVlcygpIHsKKyAgICAgICAgaW5pdEFuaW1hdGlvbigpOworICAgICAgICBpbnQgbnVtVmFsdWVzID0gbVZhbHVlcy5sZW5ndGg7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtVmFsdWVzOyArK2kpIHsKKyAgICAgICAgICAgIG1WYWx1ZXNbaV0uc2V0dXBTdGFydFZhbHVlKG1UYXJnZXQpOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgc2V0dXBFbmRWYWx1ZXMoKSB7CisgICAgICAgIGluaXRBbmltYXRpb24oKTsKKyAgICAgICAgaW50IG51bVZhbHVlcyA9IG1WYWx1ZXMubGVuZ3RoOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bVZhbHVlczsgKytpKSB7CisgICAgICAgICAgICBtVmFsdWVzW2ldLnNldHVwRW5kVmFsdWUobVRhcmdldCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgd2l0aCB0aGUgZWxhcHNlZCBmcmFjdGlvbiBvZiB0aGUgYW5pbWF0aW9uIGR1cmluZyBldmVyeQorICAgICAqIGFuaW1hdGlvbiBmcmFtZS4gVGhpcyBmdW5jdGlvbiB0dXJucyB0aGUgZWxhcHNlZCBmcmFjdGlvbiBpbnRvIGFuIGludGVycG9sYXRlZCBmcmFjdGlvbgorICAgICAqIGFuZCB0aGVuIGludG8gYW4gYW5pbWF0ZWQgdmFsdWUgKGZyb20gdGhlIGV2YWx1YXRvci4gVGhlIGZ1bmN0aW9uIGlzIGNhbGxlZCBtb3N0bHkgZHVyaW5nCisgICAgICogYW5pbWF0aW9uIHVwZGF0ZXMsIGJ1dCBpdCBpcyBhbHNvIGNhbGxlZCB3aGVuIHRoZSA8Y29kZT5lbmQoKTwvY29kZT4KKyAgICAgKiBmdW5jdGlvbiBpcyBjYWxsZWQsIHRvIHNldCB0aGUgZmluYWwgdmFsdWUgb24gdGhlIHByb3BlcnR5LgorICAgICAqCisgICAgICogPHA+T3ZlcnJpZGVzIG9mIHRoaXMgbWV0aG9kIG11c3QgY2FsbCB0aGUgc3VwZXJjbGFzcyB0byBwZXJmb3JtIHRoZSBjYWxjdWxhdGlvbgorICAgICAqIG9mIHRoZSBhbmltYXRlZCB2YWx1ZS48L3A+CisgICAgICoKKyAgICAgKiBAcGFyYW0gZnJhY3Rpb24gVGhlIGVsYXBzZWQgZnJhY3Rpb24gb2YgdGhlIGFuaW1hdGlvbi4KKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICB2b2lkIGFuaW1hdGVWYWx1ZShmbG9hdCBmcmFjdGlvbikgeworICAgICAgICBzdXBlci5hbmltYXRlVmFsdWUoZnJhY3Rpb24pOworICAgICAgICBpbnQgbnVtVmFsdWVzID0gbVZhbHVlcy5sZW5ndGg7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtVmFsdWVzOyArK2kpIHsKKyAgICAgICAgICAgIG1WYWx1ZXNbaV0uc2V0QW5pbWF0ZWRWYWx1ZShtVGFyZ2V0KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBPYmplY3RBbmltYXRvciBjbG9uZSgpIHsKKyAgICAgICAgZmluYWwgT2JqZWN0QW5pbWF0b3IgYW5pbSA9IChPYmplY3RBbmltYXRvcikgc3VwZXIuY2xvbmUoKTsKKyAgICAgICAgcmV0dXJuIGFuaW07CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvYW5pbWF0aW9uL1Byb3BlcnR5VmFsdWVzSG9sZGVyLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9hbmltYXRpb24vUHJvcGVydHlWYWx1ZXNIb2xkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZDQ2MTIzCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvYW5pbWF0aW9uL1Byb3BlcnR5VmFsdWVzSG9sZGVyLmphdmEKQEAgLTAsMCArMSw1NzkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQuYW5pbWF0aW9uOworCitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKKworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQubG9ja3MuUmVlbnRyYW50UmVhZFdyaXRlTG9jazsKKworLyoqCisgKiBUaGlzIGNsYXNzIGhvbGRzIGluZm9ybWF0aW9uIGFib3V0IGEgcHJvcGVydHkgYW5kIHRoZSB2YWx1ZXMgdGhhdCB0aGF0IHByb3BlcnR5CisgKiBzaG91bGQgdGFrZSBvbiBkdXJpbmcgYW4gYW5pbWF0aW9uLiBQcm9wZXJ0eVZhbHVlc0hvbGRlciBvYmplY3RzIGNhbiBiZSB1c2VkIHRvIGNyZWF0ZQorICogYW5pbWF0aW9ucyB3aXRoIFZhbHVlQW5pbWF0b3Igb3IgT2JqZWN0QW5pbWF0b3IgdGhhdCBvcGVyYXRlIG9uIHNldmVyYWwgZGlmZmVyZW50IHByb3BlcnRpZXMKKyAqIGluIHBhcmFsbGVsLgorICovCitwdWJsaWMgY2xhc3MgUHJvcGVydHlWYWx1ZXNIb2xkZXI8VD4gaW1wbGVtZW50cyBDbG9uZWFibGUgeworCisgICAgLyoqCisgICAgICogVGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5IGFzc29jaWF0ZWQgd2l0aCB0aGUgdmFsdWVzLiBUaGlzIG5lZWQgbm90IGJlIGEgcmVhbCBwcm9wZXJ0eSwKKyAgICAgKiB1bmxlc3MgdGhpcyBvYmplY3QgaXMgYmVpbmcgdXNlZCB3aXRoIE9iamVjdEFuaW1hdG9yLiBCdXQgdGhpcyBpcyB0aGUgbmFtZSBieSB3aGljaAorICAgICAqIGFuaWFtdGVkIHZhbHVlcyBhcmUgbG9va2VkIHVwIHdpdGggZ2V0QW5pbWF0ZWRWYWx1ZShTdHJpbmcpIGluIFZhbHVlQW5pbWF0b3IuCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgbVByb3BlcnR5TmFtZTsKKworICAgIC8qKgorICAgICAqIFRoZSBzZXR0ZXIgZnVuY3Rpb24sIGlmIG5lZWRlZC4gT2JqZWN0QW5pbWF0b3IgaGFuZHMgb2ZmIHRoaXMgZnVuY3Rpb25hbGl0eSB0bworICAgICAqIFByb3BlcnR5VmFsdWVzSG9sZGVyLCBzaW5jZSBpdCBob2xkcyBhbGwgb2YgdGhlIHBlci1wcm9wZXJ0eSBpbmZvcm1hdGlvbi4gVGhpcworICAgICAqIHByb3BlcnR5IGNhbiBiZSBtYW51YWxseSBzZXQgdmlhIHNldFNldHRlcigpLiBPdGhlcndpc2UsIGl0IGlzIGF1dG9tYXRpY2FsbHkKKyAgICAgKiBkZXJpdmVkIHdoZW4gdGhlIGFuaW1hdGlvbiBzdGFydHMgaW4gc2V0dXBTZXR0ZXJBbmRHZXR0ZXIoKSBpZiB1c2luZyBPYmplY3RBbmltYXRvci4KKyAgICAgKi8KKyAgICBwcml2YXRlIE1ldGhvZCBtU2V0dGVyID0gbnVsbDsKKworICAgIC8qKgorICAgICAqIFRoZSBnZXR0ZXIgZnVuY3Rpb24sIGlmIG5lZWRlZC4gT2JqZWN0QW5pbWF0b3IgaGFuZHMgb2ZmIHRoaXMgZnVuY3Rpb25hbGl0eSB0bworICAgICAqIFByb3BlcnR5VmFsdWVzSG9sZGVyLCBzaW5jZSBpdCBob2xkcyBhbGwgb2YgdGhlIHBlci1wcm9wZXJ0eSBpbmZvcm1hdGlvbi4gVGhpcworICAgICAqIHByb3BlcnR5IGNhbiBiZSBtYW51YWxseSBzZXQgdmlhIHNldFNldHRlcigpLiBPdGhlcndpc2UsIGl0IGlzIGF1dG9tYXRpY2FsbHkKKyAgICAgKiBkZXJpdmVkIHdoZW4gdGhlIGFuaW1hdGlvbiBzdGFydHMgaW4gc2V0dXBTZXR0ZXJBbmRHZXR0ZXIoKSBpZiB1c2luZyBPYmplY3RBbmltYXRvci4KKyAgICAgKiBUaGUgZ2V0dGVyIGlzIG9ubHkgZGVyaXZlZCBhbmQgdXNlZCBpZiBvbmUgb2YgdGhlIHZhbHVlcyBpcyBudWxsLgorICAgICAqLworICAgIHByaXZhdGUgTWV0aG9kIG1HZXR0ZXIgPSBudWxsOworCisgICAgLyoqCisgICAgICogVGhlIHR5cGUgb2YgdmFsdWVzIHN1cHBsaWVkLiBUaGlzIGluZm9ybWF0aW9uIGlzIHVzZWQgYm90aCBpbiBkZXJpdmluZyB0aGUgc2V0dGVyL2dldHRlcgorICAgICAqIGZ1bmN0aW9ucyBhbmQgaW4gZGVyaXZpbmcgdGhlIHR5cGUgb2YgVHlwZUV2YWx1YXRvci4KKyAgICAgKi8KKyAgICBwcml2YXRlIENsYXNzIG1WYWx1ZVR5cGU7CisKKyAgICAvKioKKyAgICAgKiBUaGUgc2V0IG9mIGtleWZyYW1lcyAodGltZS92YWx1ZSBwYWlycykgdGhhdCBkZWZpbmUgdGhpcyBhbmltYXRpb24uCisgICAgICovCisgICAgcHJpdmF0ZSBLZXlmcmFtZVNldCBtS2V5ZnJhbWVTZXQgPSBudWxsOworCisKKyAgICAvLyB0eXBlIGV2YWx1YXRvcnMgZm9yIHRoZSB0aHJlZSBwcmltaXRpdmUgdHlwZXMgaGFuZGxlZCBieSB0aGlzIGltcGxlbWVudGF0aW9uCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgVHlwZUV2YWx1YXRvciBzSW50RXZhbHVhdG9yID0gbmV3IEludEV2YWx1YXRvcigpOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFR5cGVFdmFsdWF0b3Igc0Zsb2F0RXZhbHVhdG9yID0gbmV3IEZsb2F0RXZhbHVhdG9yKCk7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgVHlwZUV2YWx1YXRvciBzRG91YmxlRXZhbHVhdG9yID0gbmV3IERvdWJsZUV2YWx1YXRvcigpOworCisgICAgLy8gV2UgdHJ5IHNldmVyYWwgZGlmZmVyZW50IHR5cGVzIHdoZW4gc2VhcmNoaW5nIGZvciBhcHByb3ByaWF0ZSBzZXR0ZXIvZ2V0dGVyIGZ1bmN0aW9ucy4KKyAgICAvLyBUaGUgY2FsbGVyIG1heSBoYXZlIHN1cHBsaWVkIHZhbHVlcyBpbiBhIHR5cGUgdGhhdCBkb2VzIG5vdCBtYXRjaCB0aGUgc2V0dGVyL2dldHRlcgorICAgIC8vIGZ1bmN0aW9ucyAoc3VjaCBhcyB0aGUgaW50ZWdlcnMgMCBhbmQgMSB0byByZXByZXNlbnQgZmxvYXRpbmcgcG9pbnQgdmFsdWVzIGZvciBhbHBoYSkuCisgICAgLy8gQWxzbywgdGhlIHVzZSBvZiBnZW5lcmljcyBpbiBjb25zdHJ1Y3RvcnMgbWVhbnMgdGhhdCB3ZSBlbmQgdXAgd2l0aCB0aGUgT2JqZWN0IHZlcnNpb25zCisgICAgLy8gb2YgcHJpbWl0aXZlIHR5cGVzIChGbG9hdCB2cy4gZmxvYXQpLiBCdXQgbW9zdCBsaWtlbHksIHRoZSBzZXR0ZXIvZ2V0dGVyIGZ1bmN0aW9ucworICAgIC8vIHdpbGwgdGFrZSBwcmltaXRpdmUgdHlwZXMgaW5zdGVhZC4KKyAgICAvLyBTbyB3ZSBzdXBwbHkgYW4gb3JkZXJlZCBhcnJheSBvZiBvdGhlciB0eXBlcyB0byB0cnkgYmVmb3JlIGdpdmluZyB1cC4KKyAgICBwcml2YXRlIHN0YXRpYyBDbGFzc1tdIEZMT0FUX1ZBUklBTlRTID0ge2Zsb2F0LmNsYXNzLCBGbG9hdC5jbGFzcywgZG91YmxlLmNsYXNzLCBpbnQuY2xhc3MsCisgICAgICAgICAgICBEb3VibGUuY2xhc3MsIEludGVnZXIuY2xhc3N9OworICAgIHByaXZhdGUgc3RhdGljIENsYXNzW10gSU5URUdFUl9WQVJJQU5UUyA9IHtpbnQuY2xhc3MsIEludGVnZXIuY2xhc3MsIGZsb2F0LmNsYXNzLCBkb3VibGUuY2xhc3MsCisgICAgICAgICAgICBGbG9hdC5jbGFzcywgRG91YmxlLmNsYXNzfTsKKyAgICBwcml2YXRlIHN0YXRpYyBDbGFzc1tdIERPVUJMRV9WQVJJQU5UUyA9IHtkb3VibGUuY2xhc3MsIERvdWJsZS5jbGFzcywgZmxvYXQuY2xhc3MsIGludC5jbGFzcywKKyAgICAgICAgICAgIEZsb2F0LmNsYXNzLCBJbnRlZ2VyLmNsYXNzfTsKKworICAgIC8vIFRoZXNlIG1hcHMgaG9sZCBhbGwgcHJvcGVydHkgZW50cmllcyBmb3IgYSBwYXJ0aWN1bGFyIGNsYXNzLiBUaGlzIG1hcAorICAgIC8vIGlzIHVzZWQgdG8gc3BlZWQgdXAgcHJvcGVydHkvc2V0dGVyL2dldHRlciBsb29rdXBzIGZvciBhIGdpdmVuIGNsYXNzL3Byb3BlcnR5CisgICAgLy8gY29tYmluYXRpb24uIE5vIG5lZWQgdG8gdXNlIHJlZmxlY3Rpb24gb24gdGhlIGNvbWJpbmF0aW9uIG1vcmUgdGhhbiBvbmNlLgorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEhhc2hNYXA8Q2xhc3MsIEhhc2hNYXA8U3RyaW5nLCBNZXRob2Q+PiBzU2V0dGVyUHJvcGVydHlNYXAgPQorICAgICAgICAgICAgbmV3IEhhc2hNYXA8Q2xhc3MsIEhhc2hNYXA8U3RyaW5nLCBNZXRob2Q+PigpOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEhhc2hNYXA8Q2xhc3MsIEhhc2hNYXA8U3RyaW5nLCBNZXRob2Q+PiBzR2V0dGVyUHJvcGVydHlNYXAgPQorICAgICAgICAgICAgbmV3IEhhc2hNYXA8Q2xhc3MsIEhhc2hNYXA8U3RyaW5nLCBNZXRob2Q+PigpOworCisgICAgLy8gVGhpcyBsb2NrIGlzIHVzZWQgdG8gZW5zdXJlIHRoYXQgb25seSBvbmUgdGhyZWFkIGlzIGFjY2Vzc2luZyB0aGUgcHJvcGVydHkgbWFwcworICAgIC8vIGF0IGEgdGltZS4KKyAgICBwcml2YXRlIFJlZW50cmFudFJlYWRXcml0ZUxvY2sgcHJvcGVydHlNYXBMb2NrID0gbmV3IFJlZW50cmFudFJlYWRXcml0ZUxvY2soKTsKKworICAgIC8vIFVzZWQgdG8gcGFzcyBzaW5nbGUgdmFsdWUgdG8gdmFyYXJncyBwYXJhbWV0ZXIgaW4gc2V0dGVyIGludm9jYXRpb24KKyAgICBwcml2YXRlIE9iamVjdFtdIG1UbXBWYWx1ZUFycmF5ID0gbmV3IE9iamVjdFsxXTsKKworICAgIC8qKgorICAgICAqIFRoZSB0eXBlIGV2YWx1YXRvciB1c2VkIHRvIGNhbGN1bGF0ZSB0aGUgYW5pbWF0ZWQgdmFsdWVzLiBUaGlzIGV2YWx1YXRvciBpcyBkZXRlcm1pbmVkCisgICAgICogYXV0b21hdGljYWxseSBiYXNlZCBvbiB0aGUgdHlwZSBvZiB0aGUgc3RhcnQvZW5kIG9iamVjdHMgcGFzc2VkIGludG8gdGhlIGNvbnN0cnVjdG9yLAorICAgICAqIGJ1dCB0aGUgc3lzdGVtIG9ubHkga25vd3MgYWJvdXQgdGhlIHByaW1pdGl2ZSB0eXBlcyBpbnQsIGRvdWJsZSwgYW5kIGZsb2F0LiBBbnkgb3RoZXIKKyAgICAgKiB0eXBlIHdpbGwgbmVlZCB0byBzZXQgdGhlIGV2YWx1YXRvciB0byBhIGN1c3RvbSBldmFsdWF0b3IgZm9yIHRoYXQgdHlwZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIFR5cGVFdmFsdWF0b3IgbUV2YWx1YXRvcjsKKworICAgIC8qKgorICAgICAqIFRoZSB2YWx1ZSBtb3N0IHJlY2VudGx5IGNhbGN1bGF0ZWQgYnkgY2FsY3VsYXRlVmFsdWUoKS4gVGhpcyBpcyBzZXQgZHVyaW5nCisgICAgICogdGhhdCBmdW5jdGlvbiBhbmQgbWlnaHQgYmUgcmV0cmlldmVkIGxhdGVyIGVpdGhlciBieSBWYWx1ZUFuaW1hdG9yLmFuaW1hdGVkVmFsdWUoKSBvcgorICAgICAqIGJ5IHRoZSBwcm9wZXJ0eS1zZXR0aW5nIGxvZ2ljIGluIE9iamVjdEFuaW1hdG9yLmFuaW1hdGVkVmFsdWUoKS4KKyAgICAgKi8KKyAgICBwcml2YXRlIE9iamVjdCBtQW5pbWF0ZWRWYWx1ZTsKKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdHMgYSBQcm9wZXJ0eVZhbHVlc0hvbGRlciBvYmplY3Qgd2l0aCBqdXN0IGEgc2V0IG9mIHZhbHVlcy4gVGhpcyBjb25zdHJ1Y3RvcgorICAgICAqIGlzIHR5cGljYWxseSBub3QgdXNlZCB3aGVuIGFuaW1hdGluZyBvYmplY3RzIHdpdGggT2JqZWN0QW5pbWF0b3IsIGJlY2F1c2UgdGhhdAorICAgICAqIG9iamVjdCBuZWVkcyBkaXN0aW5jdCBhbmQgbWVhbmluZ2Z1bCBwcm9wZXJ0eSBuYW1lcy4gU2ltcGxlciBhbmltYXRpb25zIG9mIG9uZQorICAgICAqIHNldCBvZiB2YWx1ZXMgdXNpbmcgVmFsdWVBbmltYXRvciBtYXkgdXNlIHRoaXMgY29uc3RydWN0b3IsIGhvd2V2ZXIsIGJlY2F1c2Ugbm8KKyAgICAgKiBkaXN0aW5ndWlzaGluZyBuYW1lIGlzIG5lZWRlZC4KKyAgICAgKiBAcGFyYW0gdmFsdWVzIFRoZSBzZXQgb2YgdmFsdWVzIHRvIGFuaW1hdGUgYmV0d2Vlbi4gSWYgdGhlcmUgaXMgb25seSBvbmUgdmFsdWUsIGl0CisgICAgICogaXMgYXNzdW1lZCB0byBiZSB0aGUgZmluYWwgdmFsdWUgYmVpbmcgYW5pbWF0ZWQgdG8sIGFuZCB0aGUgaW5pdGlhbCB2YWx1ZSB3aWxsIGJlCisgICAgICogZGVyaXZlZCBvbiB0aGUgZmx5LgorICAgICAqLworICAgIHB1YmxpYyBQcm9wZXJ0eVZhbHVlc0hvbGRlcihULi4udmFsdWVzKSB7CisgICAgICAgIHRoaXMobnVsbCwgdmFsdWVzKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RzIGEgUHJvcGVydHlWYWx1ZXNIb2xkZXIgb2JqZWN0IHdpdGggdGhlIHNwZWNpZmllZCBwcm9wZXJ0eSBuYW1lIGFuZCBzZXQgb2YKKyAgICAgKiB2YWx1ZXMuIFRoZXNlIHZhbHVlcyBjYW4gYmUgb2YgYW55IHR5cGUsIGJ1dCB0aGUgdHlwZSBzaG91bGQgYmUgY29uc2lzdGVudCBzbyB0aGF0CisgICAgICogYW4gYXBwcm9wcmlhdGUge0BsaW5rIGFuZHJvaWQuYW5pbWF0aW9uLlR5cGVFdmFsdWF0b3J9IGNhbiBiZSBmb3VuZCB0aGF0IG1hdGNoZXMKKyAgICAgKiB0aGUgY29tbW9uIHR5cGUuCisgICAgICogPHA+SWYgdGhlcmUgaXMgb25seSBvbmUgdmFsdWUsIGl0IGlzIGFzc3VtZWQgdG8gYmUgdGhlIGVuZCB2YWx1ZSBvZiBhbiBhbmltYXRpb24sCisgICAgICogYW5kIGFuIGluaXRpYWwgdmFsdWUgd2lsbCBiZSBkZXJpdmVkLCBpZiBwb3NzaWJsZSwgYnkgY2FsbGluZyBhIGdldHRlciBmdW5jdGlvbgorICAgICAqIG9uIHRoZSBvYmplY3QuIEFsc28sIGlmIGFueSB2YWx1ZSBpcyBudWxsLCB0aGUgdmFsdWUgd2lsbCBiZSBmaWxsZWQgaW4gd2hlbiB0aGUgYW5pbWF0aW9uCisgICAgICogc3RhcnRzIGluIHRoZSBzYW1lIHdheS4gVGhpcyBtZWNoYW5pc20gb2YgYXV0b21hdGljYWxseSBnZXR0aW5nIG51bGwgdmFsdWVzIG9ubHkgd29ya3MKKyAgICAgKiBpZiB0aGUgUHJvcGVydHlWYWx1ZXNIb2xkZXIgb2JqZWN0IGlzIHVzZWQgaW4gY29uanVuY3Rpb24KKyAgICAgKiB7QGxpbmsgT2JqZWN0QW5pbWF0b3J9LCBhbmQgd2l0aCBhIGdldHRlciBmdW5jdGlvbiBlaXRoZXIKKyAgICAgKiBkZXJpdmVkIGF1dG9tYXRpY2FsbHkgZnJvbSA8Y29kZT5wcm9wZXJ0eU5hbWU8L2NvZGU+IG9yIHNldCBleHBsaWNpdGx5IHZpYQorICAgICAqIHtAbGluayAjc2V0R2V0dGVyKGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZCl9LCBzaW5jZSBvdGhlcndpc2UgUHJvcGVydHlWYWx1ZXNIb2xkZXIgaGFzCisgICAgICogbm8gd2F5IG9mIGRldGVybWluaW5nIHdoYXQgdGhlIHZhbHVlIHNob3VsZCBiZS4KKyAgICAgKiBAcGFyYW0gcHJvcGVydHlOYW1lIFRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSBhc3NvY2lhdGVkIHdpdGggdGhpcyBzZXQgb2YgdmFsdWVzLiBUaGlzCisgICAgICogY2FuIGJlIHRoZSBhY3R1YWwgcHJvcGVydHkgbmFtZSB0byBiZSB1c2VkIHdoZW4gdXNpbmcgYSBPYmplY3RBbmltYXRvciBvYmplY3QsIG9yCisgICAgICoganVzdCBhIG5hbWUgdXNlZCB0byBnZXQgYW5pbWF0ZWQgdmFsdWVzLCBzdWNoIGFzIGlmIHRoaXMgb2JqZWN0IGlzIHVzZWQgd2l0aCBhbgorICAgICAqIFZhbHVlQW5pbWF0b3Igb2JqZWN0LgorICAgICAqIEBwYXJhbSB2YWx1ZXMgVGhlIHNldCBvZiB2YWx1ZXMgdG8gYW5pbWF0ZSBiZXR3ZWVuLgorICAgICAqLworICAgIHB1YmxpYyBQcm9wZXJ0eVZhbHVlc0hvbGRlcihTdHJpbmcgcHJvcGVydHlOYW1lLCBULi4uIHZhbHVlcykgeworICAgICAgICBtUHJvcGVydHlOYW1lID0gcHJvcGVydHlOYW1lOworICAgICAgICBzZXRWYWx1ZXModmFsdWVzKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSB2YWx1ZXMgYmVpbmcgYW5pbWF0ZWQgYmV0d2Vlbi4KKyAgICAgKiBJZiB0aGVyZSBpcyBvbmx5IG9uZSB2YWx1ZSwgaXQgaXMgYXNzdW1lZCB0byBiZSB0aGUgZW5kIHZhbHVlIG9mIGFuIGFuaW1hdGlvbiwKKyAgICAgKiBhbmQgYW4gaW5pdGlhbCB2YWx1ZSB3aWxsIGJlIGRlcml2ZWQsIGlmIHBvc3NpYmxlLCBieSBjYWxsaW5nIGEgZ2V0dGVyIGZ1bmN0aW9uCisgICAgICogb24gdGhlIG9iamVjdC4gQWxzbywgaWYgYW55IHZhbHVlIGlzIG51bGwsIHRoZSB2YWx1ZSB3aWxsIGJlIGZpbGxlZCBpbiB3aGVuIHRoZSBhbmltYXRpb24KKyAgICAgKiBzdGFydHMgaW4gdGhlIHNhbWUgd2F5LiBUaGlzIG1lY2hhbmlzbSBvZiBhdXRvbWF0aWNhbGx5IGdldHRpbmcgbnVsbCB2YWx1ZXMgb25seSB3b3JrcworICAgICAqIGlmIHRoZSBQcm9wZXJ0eVZhbHVlc0hvbGRlciBvYmplY3QgaXMgdXNlZCBpbiBjb25qdW5jdGlvbgorICAgICAqIHtAbGluayBPYmplY3RBbmltYXRvcn0sIGFuZCB3aXRoIGEgZ2V0dGVyIGZ1bmN0aW9uIGVpdGhlcgorICAgICAqIGRlcml2ZWQgYXV0b21hdGljYWxseSBmcm9tIDxjb2RlPnByb3BlcnR5TmFtZTwvY29kZT4gb3Igc2V0IGV4cGxpY2l0bHkgdmlhCisgICAgICoge0BsaW5rICNzZXRHZXR0ZXIoamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kKX0sIHNpbmNlIG90aGVyd2lzZSBQcm9wZXJ0eVZhbHVlc0hvbGRlciBoYXMKKyAgICAgKiBubyB3YXkgb2YgZGV0ZXJtaW5pbmcgd2hhdCB0aGUgdmFsdWUgc2hvdWxkIGJlLgorICAgICAqIEBwYXJhbSB2YWx1ZXMgVGhlIHNldCBvZiB2YWx1ZXMgdG8gYW5pbWF0ZSBiZXR3ZWVuLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFZhbHVlcyhULi4uIHZhbHVlcykgeworICAgICAgICBpbnQgbnVtS2V5ZnJhbWVzID0gdmFsdWVzLmxlbmd0aDsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1LZXlmcmFtZXM7ICsraSkgeworICAgICAgICAgICAgaWYgKHZhbHVlc1tpXSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgQ2xhc3MgdGhpc1ZhbHVlVHlwZSA9IHZhbHVlc1tpXS5nZXRDbGFzcygpOworICAgICAgICAgICAgICAgIGlmIChtVmFsdWVUeXBlID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgbVZhbHVlVHlwZSA9IHRoaXNWYWx1ZVR5cGU7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXNWYWx1ZVR5cGUgIT0gbVZhbHVlVHlwZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1WYWx1ZVR5cGUgPT0gSW50ZWdlci5jbGFzcyAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodGhpc1ZhbHVlVHlwZSA9PSBGbG9hdC5jbGFzcyB8fCB0aGlzVmFsdWVUeXBlID09IERvdWJsZS5jbGFzcykpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtVmFsdWVUeXBlID0gdGhpc1ZhbHVlVHlwZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobVZhbHVlVHlwZSA9PSBGbG9hdC5jbGFzcyAmJiB0aGlzVmFsdWVUeXBlID09IERvdWJsZS5jbGFzcykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1WYWx1ZVR5cGUgPSB0aGlzVmFsdWVUeXBlOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIEtleWZyYW1lIGtleWZyYW1lc1tdID0gbmV3IEtleWZyYW1lW01hdGgubWF4KG51bUtleWZyYW1lcywyKV07CisgICAgICAgIGlmIChtVmFsdWVUeXBlLmVxdWFscyhLZXlmcmFtZS5jbGFzcykpIHsKKyAgICAgICAgICAgIG1WYWx1ZVR5cGUgPSAoKEtleWZyYW1lKXZhbHVlc1swXSkuZ2V0VHlwZSgpOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1LZXlmcmFtZXM7ICsraSkgeworICAgICAgICAgICAgICAgIGtleWZyYW1lc1tpXSA9IChLZXlmcmFtZSl2YWx1ZXNbaV07CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAobnVtS2V5ZnJhbWVzID09IDEpIHsKKyAgICAgICAgICAgICAgICBrZXlmcmFtZXNbMF0gPSBuZXcgS2V5ZnJhbWUoMGYsIChPYmplY3QpIG51bGwpOworICAgICAgICAgICAgICAgIGtleWZyYW1lc1sxXSA9IG5ldyBLZXlmcmFtZSgxZiwgdmFsdWVzWzBdKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAga2V5ZnJhbWVzWzBdID0gbmV3IEtleWZyYW1lKDBmLCB2YWx1ZXNbMF0pOworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAxOyBpIDwgbnVtS2V5ZnJhbWVzOyArK2kpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlc1tpXSAhPSBudWxsICYmICh2YWx1ZXNbaV0uZ2V0Q2xhc3MoKSAhPSBtVmFsdWVUeXBlKSkgeworCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAga2V5ZnJhbWVzW2ldID0gbmV3IEtleWZyYW1lKChmbG9hdCkgaSAvIChudW1LZXlmcmFtZXMgLSAxKSwgdmFsdWVzW2ldKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgbUtleWZyYW1lU2V0ID0gbmV3IEtleWZyYW1lU2V0KGtleWZyYW1lcyk7CisgICAgfQorCisKKworICAgIC8qKgorICAgICAqIERldGVybWluZSB0aGUgc2V0dGVyIG9yIGdldHRlciBmdW5jdGlvbiB1c2luZyB0aGUgSmF2YUJlYW5zIGNvbnZlbnRpb24gb2Ygc2V0Rm9vIG9yCisgICAgICogZ2V0Rm9vIGZvciBhIHByb3BlcnR5IG5hbWVkICdmb28nLiBUaGlzIGZ1bmN0aW9uIGZpZ3VyZXMgb3V0IHdoYXQgdGhlIG5hbWUgb2YgdGhlCisgICAgICogZnVuY3Rpb24gc2hvdWxkIGJlIGFuZCB1c2VzIHJlZmxlY3Rpb24gdG8gZmluZCB0aGUgTWV0aG9kIHdpdGggdGhhdCBuYW1lIG9uIHRoZQorICAgICAqIHRhcmdldCBvYmplY3QuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdGFyZ2V0Q2xhc3MgVGhlIGNsYXNzIHRvIHNlYXJjaCBmb3IgdGhlIG1ldGhvZAorICAgICAqIEBwYXJhbSBwcmVmaXggInNldCIgb3IgImdldCIsIGRlcGVuZGluZyBvbiB3aGV0aGVyIHdlIG5lZWQgYSBzZXR0ZXIgb3IgZ2V0dGVyLgorICAgICAqIEBwYXJhbSB2YWx1ZVR5cGUgVGhlIHR5cGUgb2YgdGhlIHBhcmFtZXRlciAoaW4gdGhlIGNhc2Ugb2YgYSBzZXR0ZXIpLiBUaGlzIHR5cGUKKyAgICAgKiBpcyBkZXJpdmVkIGZyb20gdGhlIHZhbHVlcyBzZXQgb24gdGhpcyBQcm9wZXJ0eVZhbHVlc0hvbGRlci4gVGhpcyB0eXBlIGlzIHVzZWQgYXMKKyAgICAgKiBhIGZpcnN0IGd1ZXNzIGF0IHRoZSBwYXJhbWV0ZXIgdHlwZSwgYnV0IHdlIGNoZWNrIGZvciBtZXRob2RzIHdpdGggc2V2ZXJhbCBkaWZmZXJlbnQKKyAgICAgKiB0eXBlcyB0byBhdm9pZCBwcm9ibGVtcyB3aXRoIHNsaWdodCBtaXMtbWF0Y2hlcyBiZXR3ZWVuIHN1cHBsaWVkIHZhbHVlcyBhbmQgYWN0dWFsCisgICAgICogdmFsdWUgdHlwZXMgdXNlZCBvbiB0aGUgc2V0dGVyLgorICAgICAqIEByZXR1cm4gTWV0aG9kIHRoZSBtZXRob2QgYXNzb2NpYXRlZCB3aXRoIG1Qcm9wZXJ0eU5hbWUuCisgICAgICovCisgICAgcHJpdmF0ZSBNZXRob2QgZ2V0UHJvcGVydHlGdW5jdGlvbihDbGFzcyB0YXJnZXRDbGFzcywgU3RyaW5nIHByZWZpeCwgQ2xhc3MgdmFsdWVUeXBlKSB7CisgICAgICAgIC8vIFRPRE86IGZhc3RlciBpbXBsZW1lbnRhdGlvbi4uLgorICAgICAgICBNZXRob2QgcmV0dXJuVmFsID0gbnVsbDsKKyAgICAgICAgU3RyaW5nIGZpcnN0TGV0dGVyID0gbVByb3BlcnR5TmFtZS5zdWJzdHJpbmcoMCwgMSk7CisgICAgICAgIFN0cmluZyB0aGVSZXN0ID0gbVByb3BlcnR5TmFtZS5zdWJzdHJpbmcoMSk7CisgICAgICAgIGZpcnN0TGV0dGVyID0gZmlyc3RMZXR0ZXIudG9VcHBlckNhc2UoKTsKKyAgICAgICAgU3RyaW5nIG1ldGhvZE5hbWUgPSBwcmVmaXggKyBmaXJzdExldHRlciArIHRoZVJlc3Q7CisgICAgICAgIENsYXNzIGFyZ3NbXSA9IG51bGw7CisgICAgICAgIGlmICh2YWx1ZVR5cGUgPT0gbnVsbCkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICByZXR1cm5WYWwgPSB0YXJnZXRDbGFzcy5nZXRNZXRob2QobWV0aG9kTmFtZSwgYXJncyk7CisgICAgICAgICAgICB9IGNhdGNoIChOb1N1Y2hNZXRob2RFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIExvZy5lKCJQcm9wZXJ0eVZhbHVlc0hvbGRlciIsCisgICAgICAgICAgICAgICAgICAgICAgICAiQ291bGRuJ3QgZmluZCBuby1hcmcgbWV0aG9kIGZvciBwcm9wZXJ0eSAiICsgbVByb3BlcnR5TmFtZSArICI6ICIgKyBlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGFyZ3MgPSBuZXcgQ2xhc3NbMV07CisgICAgICAgICAgICBDbGFzcyB0eXBlVmFyaWFudHNbXTsKKyAgICAgICAgICAgIGlmIChtVmFsdWVUeXBlLmVxdWFscyhGbG9hdC5jbGFzcykpIHsKKyAgICAgICAgICAgICAgICB0eXBlVmFyaWFudHMgPSBGTE9BVF9WQVJJQU5UUzsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAobVZhbHVlVHlwZS5lcXVhbHMoSW50ZWdlci5jbGFzcykpIHsKKyAgICAgICAgICAgICAgICB0eXBlVmFyaWFudHMgPSBJTlRFR0VSX1ZBUklBTlRTOworICAgICAgICAgICAgfSBlbHNlIGlmIChtVmFsdWVUeXBlLmVxdWFscyhEb3VibGUuY2xhc3MpKSB7CisgICAgICAgICAgICAgICAgdHlwZVZhcmlhbnRzID0gRE9VQkxFX1ZBUklBTlRTOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICB0eXBlVmFyaWFudHMgPSBuZXcgQ2xhc3NbMV07CisgICAgICAgICAgICAgICAgdHlwZVZhcmlhbnRzWzBdID0gbVZhbHVlVHlwZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZvciAoQ2xhc3MgdHlwZVZhcmlhbnQgOiB0eXBlVmFyaWFudHMpIHsKKyAgICAgICAgICAgICAgICBhcmdzWzBdID0gdHlwZVZhcmlhbnQ7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuVmFsID0gdGFyZ2V0Q2xhc3MuZ2V0TWV0aG9kKG1ldGhvZE5hbWUsIGFyZ3MpOworICAgICAgICAgICAgICAgICAgICAvLyBjaGFuZ2UgdGhlIHZhbHVlIHR5cGUgdG8gc3VpdAorICAgICAgICAgICAgICAgICAgICBtVmFsdWVUeXBlID0gdHlwZVZhcmlhbnQ7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXR1cm5WYWw7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoTm9TdWNoTWV0aG9kRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gU3dhbGxvdyB0aGUgZXJyb3IgYW5kIGtlZXAgdHJ5aW5nIG90aGVyIHZhcmlhbnRzCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gSWYgd2UgZ290IGhlcmUsIHRoZW4gbm8gYXBwcm9wcmlhdGUgZnVuY3Rpb24gd2FzIGZvdW5kCisgICAgICAgICAgICBMb2cuZSgiUHJvcGVydHlWYWx1ZXNIb2xkZXIiLAorICAgICAgICAgICAgICAgICAgICAiQ291bGRuJ3QgZmluZCBzZXR0ZXIvZ2V0dGVyIGZvciBwcm9wZXJ0eSAiICsgbVByb3BlcnR5TmFtZSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIndpdGggdmFsdWUgdHlwZSAiKyBtVmFsdWVUeXBlKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiByZXR1cm5WYWw7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBzZXR0ZXIgb3IgZ2V0dGVyIHJlcXVlc3RlZC4gVGhpcyB1dGlsaXR5IGZ1bmN0aW9uIGNoZWNrcyB3aGV0aGVyIHRoZQorICAgICAqIHJlcXVlc3RlZCBtZXRob2QgZXhpc3RzIGluIHRoZSBwcm9wZXJ0eU1hcE1hcCBjYWNoZS4gSWYgbm90LCBpdCBjYWxscyBhbm90aGVyCisgICAgICogdXRpbGl0eSBmdW5jdGlvbiB0byByZXF1ZXN0IHRoZSBNZXRob2QgZnJvbSB0aGUgdGFyZ2V0Q2xhc3MgZGlyZWN0bHkuCisgICAgICogQHBhcmFtIHRhcmdldENsYXNzIFRoZSBDbGFzcyBvbiB3aGljaCB0aGUgcmVxdWVzdGVkIG1ldGhvZCBzaG91bGQgZXhpc3QuCisgICAgICogQHBhcmFtIHByb3BlcnR5TWFwTWFwIFRoZSBjYWNoZSBvZiBzZXR0ZXJzL2dldHRlcnMgZGVyaXZlZCBzbyBmYXIuCisgICAgICogQHBhcmFtIHByZWZpeCAic2V0IiBvciAiZ2V0IiwgZm9yIHRoZSBzZXR0ZXIgb3IgZ2V0dGVyLgorICAgICAqIEBwYXJhbSB2YWx1ZVR5cGUgVGhlIHR5cGUgb2YgcGFyYW1ldGVyIHBhc3NlZCBpbnRvIHRoZSBtZXRob2QgKG51bGwgZm9yIGdldHRlcikuCisgICAgICogQHJldHVybiBNZXRob2QgdGhlIG1ldGhvZCBhc3NvY2lhdGVkIHdpdGggbVByb3BlcnR5TmFtZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIE1ldGhvZCBzZXR1cFNldHRlck9yR2V0dGVyKENsYXNzIHRhcmdldENsYXNzLAorICAgICAgICAgICAgSGFzaE1hcDxDbGFzcywgSGFzaE1hcDxTdHJpbmcsIE1ldGhvZD4+IHByb3BlcnR5TWFwTWFwLAorICAgICAgICAgICAgU3RyaW5nIHByZWZpeCwgQ2xhc3MgdmFsdWVUeXBlKSB7CisgICAgICAgIE1ldGhvZCBzZXR0ZXJPckdldHRlciA9IG51bGw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyBIYXZlIHRvIGxvY2sgcHJvcGVydHkgbWFwIHByaW9yIHRvIHJlYWRpbmcgaXQsIHRvIGd1YXJkIGFnYWluc3QKKyAgICAgICAgICAgIC8vIGFub3RoZXIgdGhyZWFkIHB1dHRpbmcgc29tZXRoaW5nIGluIHRoZXJlIGFmdGVyIHdlJ3ZlIGNoZWNrZWQgaXQKKyAgICAgICAgICAgIC8vIGJ1dCBiZWZvcmUgd2UndmUgYWRkZWQgYW4gZW50cnkgdG8gaXQKKyAgICAgICAgICAgIC8vIFRPRE86IGNhbiB3ZSBzdG9yZSB0aGUgc2V0dGVyL2dldHRlciBwZXIgQ2xhc3MgaW5zdGVhZCBvZiBwZXIgT2JqZWN0PworICAgICAgICAgICAgcHJvcGVydHlNYXBMb2NrLndyaXRlTG9jaygpLmxvY2soKTsKKyAgICAgICAgICAgIEhhc2hNYXA8U3RyaW5nLCBNZXRob2Q+IHByb3BlcnR5TWFwID0gcHJvcGVydHlNYXBNYXAuZ2V0KHRhcmdldENsYXNzKTsKKyAgICAgICAgICAgIGlmIChwcm9wZXJ0eU1hcCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgc2V0dGVyT3JHZXR0ZXIgPSBwcm9wZXJ0eU1hcC5nZXQobVByb3BlcnR5TmFtZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoc2V0dGVyT3JHZXR0ZXIgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHNldHRlck9yR2V0dGVyID0gZ2V0UHJvcGVydHlGdW5jdGlvbih0YXJnZXRDbGFzcywgcHJlZml4LCB2YWx1ZVR5cGUpOworICAgICAgICAgICAgICAgIGlmIChwcm9wZXJ0eU1hcCA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5TWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBNZXRob2Q+KCk7CisgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5TWFwTWFwLnB1dCh0YXJnZXRDbGFzcywgcHJvcGVydHlNYXApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBwcm9wZXJ0eU1hcC5wdXQobVByb3BlcnR5TmFtZSwgc2V0dGVyT3JHZXR0ZXIpOworICAgICAgICAgICAgfQorICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgcHJvcGVydHlNYXBMb2NrLndyaXRlTG9jaygpLnVubG9jaygpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBzZXR0ZXJPckdldHRlcjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBVdGlsaXR5IGZ1bmN0aW9uIHRvIGdldCB0aGUgc2V0dGVyIGZyb20gdGFyZ2V0Q2xhc3MKKyAgICAgKiBAcGFyYW0gdGFyZ2V0Q2xhc3MgVGhlIENsYXNzIG9uIHdoaWNoIHRoZSByZXF1ZXN0ZWQgbWV0aG9kIHNob3VsZCBleGlzdC4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgc2V0dXBTZXR0ZXIoQ2xhc3MgdGFyZ2V0Q2xhc3MpIHsKKyAgICAgICAgbVNldHRlciA9IHNldHVwU2V0dGVyT3JHZXR0ZXIodGFyZ2V0Q2xhc3MsIHNTZXR0ZXJQcm9wZXJ0eU1hcCwgInNldCIsIG1WYWx1ZVR5cGUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFV0aWxpdHkgZnVuY3Rpb24gdG8gZ2V0IHRoZSBnZXR0ZXIgZnJvbSB0YXJnZXRDbGFzcworICAgICAqLworICAgIHByaXZhdGUgdm9pZCBzZXR1cEdldHRlcihDbGFzcyB0YXJnZXRDbGFzcykgeworICAgICAgICBtR2V0dGVyID0gc2V0dXBTZXR0ZXJPckdldHRlcih0YXJnZXRDbGFzcywgc0dldHRlclByb3BlcnR5TWFwLCAiZ2V0IiwgbnVsbCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogSW50ZXJuYWwgZnVuY3Rpb24gKGNhbGxlZCBmcm9tIE9iamVjdEFuaW1hdG9yKSB0byBzZXQgdXAgdGhlIHNldHRlciBhbmQgZ2V0dGVyCisgICAgICogcHJpb3IgdG8gcnVubmluZyB0aGUgYW5pbWF0aW9uLiBJZiB0aGUgc2V0dGVyIGhhcyBub3QgYmVlbiBtYW51YWxseSBzZXQgZm9yIHRoaXMKKyAgICAgKiBvYmplY3QsIGl0IHdpbGwgYmUgZGVyaXZlZCBhdXRvbWF0aWNhbGx5IGdpdmVuIHRoZSBwcm9wZXJ0eSBuYW1lLCB0YXJnZXQgb2JqZWN0LCBhbmQKKyAgICAgKiB0eXBlcyBvZiB2YWx1ZXMgc3VwcGxpZWQuIElmIG5vIGdldHRlciBoYXMgYmVlbiBzZXQsIGl0IHdpbGwgYmUgc3VwcGxpZWQgaWZmIGFueSBvZiB0aGUKKyAgICAgKiBzdXBwbGllZCB2YWx1ZXMgd2FzIG51bGwuIElmIHRoZXJlIGlzIGEgbnVsbCB2YWx1ZSwgdGhlbiB0aGUgZ2V0dGVyIChzdXBwbGllZCBvciBkZXJpdmVkKQorICAgICAqIHdpbGwgYmUgY2FsbGVkIHRvIHNldCB0aG9zZSBudWxsIHZhbHVlcyB0byB0aGUgY3VycmVudCB2YWx1ZSBvZiB0aGUgcHJvcGVydHkKKyAgICAgKiBvbiB0aGUgdGFyZ2V0IG9iamVjdC4KKyAgICAgKiBAcGFyYW0gdGFyZ2V0IFRoZSBvYmplY3Qgb24gd2hpY2ggdGhlIHNldHRlciAoYW5kIHBvc3NpYmx5IGdldHRlcikgZXhpc3QuCisgICAgICovCisgICAgdm9pZCBzZXR1cFNldHRlckFuZEdldHRlcihPYmplY3QgdGFyZ2V0KSB7CisgICAgICAgIENsYXNzIHRhcmdldENsYXNzID0gdGFyZ2V0LmdldENsYXNzKCk7CisgICAgICAgIGlmIChtU2V0dGVyID09IG51bGwpIHsKKyAgICAgICAgICAgIHNldHVwU2V0dGVyKHRhcmdldENsYXNzKTsKKyAgICAgICAgfQorICAgICAgICBmb3IgKEtleWZyYW1lIGtmIDogbUtleWZyYW1lU2V0Lm1LZXlmcmFtZXMpIHsKKyAgICAgICAgICAgIGlmIChrZi5nZXRWYWx1ZSgpID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBpZiAobUdldHRlciA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIHNldHVwR2V0dGVyKHRhcmdldENsYXNzKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAga2Yuc2V0VmFsdWUoKFQpIG1HZXR0ZXIuaW52b2tlKHRhcmdldCkpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICBMb2cuZSgiUHJvcGVydHlWYWx1ZXNIb2xkZXIiLCBlLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICBMb2cuZSgiUHJvcGVydHlWYWx1ZXNIb2xkZXIiLCBlLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFV0aWxpdHkgZnVuY3Rpb24gdG8gc2V0IHRoZSB2YWx1ZSBzdG9yZWQgaW4gYSBwYXJ0aWN1bGFyIEtleWZyYW1lLiBUaGUgdmFsdWUgdXNlZCBpcworICAgICAqIHdoYXRldmVyIHRoZSB2YWx1ZSBpcyBmb3IgdGhlIHByb3BlcnR5IG5hbWUgc3BlY2lmaWVkIGluIHRoZSBrZXlmcmFtZSBvbiB0aGUgdGFyZ2V0IG9iamVjdC4KKyAgICAgKgorICAgICAqIEBwYXJhbSB0YXJnZXQgVGhlIHRhcmdldCBvYmplY3QgZnJvbSB3aGljaCB0aGUgY3VycmVudCB2YWx1ZSBzaG91bGQgYmUgZXh0cmFjdGVkLgorICAgICAqIEBwYXJhbSBrZiBUaGUga2V5ZnJhbWUgd2hpY2ggaG9sZHMgdGhlIHByb3BlcnR5IG5hbWUgYW5kIHZhbHVlLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBzZXR1cFZhbHVlKE9iamVjdCB0YXJnZXQsIEtleWZyYW1lIGtmKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpZiAobUdldHRlciA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgQ2xhc3MgdGFyZ2V0Q2xhc3MgPSB0YXJnZXQuZ2V0Q2xhc3MoKTsKKyAgICAgICAgICAgICAgICBzZXR1cEdldHRlcih0YXJnZXRDbGFzcyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBrZi5zZXRWYWx1ZSgoVCkgbUdldHRlci5pbnZva2UodGFyZ2V0KSk7CisgICAgICAgIH0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgTG9nLmUoIlByb3BlcnR5VmFsdWVzSG9sZGVyIiwgZS50b1N0cmluZygpKTsKKyAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBMb2cuZSgiUHJvcGVydHlWYWx1ZXNIb2xkZXIiLCBlLnRvU3RyaW5nKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgT2JqZWN0QW5pbWF0b3Igd2hlbiBzZXR0aW5nIHRoZSBzdGFydCB2YWx1ZXMgZm9yIGFuIGFuaW1hdGlvbi4KKyAgICAgKiBUaGUgc3RhcnQgdmFsdWVzIGFyZSBzZXQgYWNjb3JkaW5nIHRvIHRoZSBjdXJyZW50IHZhbHVlcyBpbiB0aGUgdGFyZ2V0IG9iamVjdC4gVGhlCisgICAgICogcHJvcGVydHkgd2hvc2UgdmFsdWUgaXMgZXh0cmFjdGVkIGlzIHdoYXRldmVyIGlzIHNwZWNpZmllZCBieSB0aGUgcHJvcGVydHlOYW1lIG9mIHRoaXMKKyAgICAgKiBQcm9wZXJ0eVZhbHVlc0hvbGRlciBvYmplY3QuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdGFyZ2V0IFRoZSBvYmplY3Qgd2hpY2ggaG9sZHMgdGhlIHN0YXJ0IHZhbHVlcyB0aGF0IHNob3VsZCBiZSBzZXQuCisgICAgICovCisgICAgdm9pZCBzZXR1cFN0YXJ0VmFsdWUoT2JqZWN0IHRhcmdldCkgeworICAgICAgICBzZXR1cFZhbHVlKHRhcmdldCwgbUtleWZyYW1lU2V0Lm1LZXlmcmFtZXMuZ2V0KDApKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSBPYmplY3RBbmltYXRvciB3aGVuIHNldHRpbmcgdGhlIGVuZCB2YWx1ZXMgZm9yIGFuIGFuaW1hdGlvbi4KKyAgICAgKiBUaGUgZW5kIHZhbHVlcyBhcmUgc2V0IGFjY29yZGluZyB0byB0aGUgY3VycmVudCB2YWx1ZXMgaW4gdGhlIHRhcmdldCBvYmplY3QuIFRoZQorICAgICAqIHByb3BlcnR5IHdob3NlIHZhbHVlIGlzIGV4dHJhY3RlZCBpcyB3aGF0ZXZlciBpcyBzcGVjaWZpZWQgYnkgdGhlIHByb3BlcnR5TmFtZSBvZiB0aGlzCisgICAgICogUHJvcGVydHlWYWx1ZXNIb2xkZXIgb2JqZWN0LgorICAgICAqCisgICAgICogQHBhcmFtIHRhcmdldCBUaGUgb2JqZWN0IHdoaWNoIGhvbGRzIHRoZSBzdGFydCB2YWx1ZXMgdGhhdCBzaG91bGQgYmUgc2V0LgorICAgICAqLworICAgIHZvaWQgc2V0dXBFbmRWYWx1ZShPYmplY3QgdGFyZ2V0KSB7CisgICAgICAgIHNldHVwVmFsdWUodGFyZ2V0LCBtS2V5ZnJhbWVTZXQubUtleWZyYW1lcy5nZXQobUtleWZyYW1lU2V0Lm1LZXlmcmFtZXMuc2l6ZSgpIC0gMSkpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBQcm9wZXJ0eVZhbHVlc0hvbGRlciBjbG9uZSgpIHsKKyAgICAgICAgQXJyYXlMaXN0PEtleWZyYW1lPiBrZXlmcmFtZXMgPSBtS2V5ZnJhbWVTZXQubUtleWZyYW1lczsKKyAgICAgICAgaW50IG51bUtleWZyYW1lcyA9IG1LZXlmcmFtZVNldC5tS2V5ZnJhbWVzLnNpemUoKTsKKyAgICAgICAgS2V5ZnJhbWVbXSBuZXdLZXlmcmFtZXMgPSBuZXcgS2V5ZnJhbWVbbnVtS2V5ZnJhbWVzXTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1LZXlmcmFtZXM7ICsraSkgeworICAgICAgICAgICAgbmV3S2V5ZnJhbWVzW2ldID0ga2V5ZnJhbWVzLmdldChpKS5jbG9uZSgpOworICAgICAgICB9CisgICAgICAgIFByb3BlcnR5VmFsdWVzSG9sZGVyIHB2aENsb25lID0gbmV3IFByb3BlcnR5VmFsdWVzSG9sZGVyKG1Qcm9wZXJ0eU5hbWUsCisgICAgICAgICAgICAgICAgKE9iamVjdFtdKSBuZXdLZXlmcmFtZXMpOworICAgICAgICByZXR1cm4gcHZoQ2xvbmU7CisgICAgfQorICAgIC8qKgorICAgICAqIEludGVybmFsIGZ1bmN0aW9uIHRvIHNldCB0aGUgdmFsdWUgb24gdGhlIHRhcmdldCBvYmplY3QsIHVzaW5nIHRoZSBzZXR0ZXIgc2V0IHVwCisgICAgICogZWFybGllciBvbiB0aGlzIFByb3BlcnR5VmFsdWVzSG9sZGVyIG9iamVjdC4gVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgT2JqZWN0QW5pbWF0b3IKKyAgICAgKiB0byBoYW5kbGUgdHVybmluZyB0aGUgdmFsdWUgY2FsY3VsYXRlZCBieSBWYWx1ZUFuaW1hdG9yIGludG8gYSB2YWx1ZSBzZXQgb24gdGhlIG9iamVjdAorICAgICAqIGFjY29yZGluZyB0byB0aGUgbmFtZSBvZiB0aGUgcHJvcGVydHkuCisgICAgICogQHBhcmFtIHRhcmdldCBUaGUgdGFyZ2V0IG9iamVjdCBvbiB3aGljaCB0aGUgdmFsdWUgaXMgc2V0CisgICAgICovCisgICAgdm9pZCBzZXRBbmltYXRlZFZhbHVlKE9iamVjdCB0YXJnZXQpIHsKKyAgICAgICAgaWYgKG1TZXR0ZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBtVG1wVmFsdWVBcnJheVswXSA9IG1BbmltYXRlZFZhbHVlOworICAgICAgICAgICAgICAgIG1TZXR0ZXIuaW52b2tlKHRhcmdldCwgbVRtcFZhbHVlQXJyYXkpOworICAgICAgICAgICAgfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgTG9nLmUoIlByb3BlcnR5VmFsdWVzSG9sZGVyIiwgZS50b1N0cmluZygpKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIExvZy5lKCJQcm9wZXJ0eVZhbHVlc0hvbGRlciIsIGUudG9TdHJpbmcoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJbnRlcm5hbCBmdW5jdGlvbiwgY2FsbGVkIGJ5IFZhbHVlQW5pbWF0b3IsIHRvIHNldCB1cCB0aGUgVHlwZUV2YWx1YXRvciB0aGF0IHdpbGwgYmUgdXNlZAorICAgICAqIHRvIGNhbGN1bGF0ZSBhbmltYXRlZCB2YWx1ZXMuCisgICAgICovCisgICAgdm9pZCBpbml0KCkgeworICAgICAgICBpZiAobUV2YWx1YXRvciA9PSBudWxsKSB7CisgICAgICAgICAgICBtRXZhbHVhdG9yID0gKG1WYWx1ZVR5cGUgPT0gaW50LmNsYXNzIHx8IG1WYWx1ZVR5cGUgPT0gSW50ZWdlci5jbGFzcykgPyBzSW50RXZhbHVhdG9yIDoKKyAgICAgICAgICAgICAgICAobVZhbHVlVHlwZSA9PSBkb3VibGUuY2xhc3MgfHwgbVZhbHVlVHlwZSA9PSBEb3VibGUuY2xhc3MpID8gc0RvdWJsZUV2YWx1YXRvciA6CisgICAgICAgICAgICAgICAgICAgICAgICBzRmxvYXRFdmFsdWF0b3I7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgVHlwZUV2YWx1YXRvciB3aWxsIHRoZSBhdXRvbWF0aWNhbGx5IGRldGVybWluZWQgYmFzZWQgb24gdGhlIHR5cGUgb2YgdmFsdWVzCisgICAgICogc3VwcGxpZWQgdG8gUHJvcGVydHlWYWx1ZXNIb2xkZXIuIFRoZSBldmFsdWF0b3IgY2FuIGJlIG1hbnVhbGx5IHNldCwgaG93ZXZlciwgaWYgc28KKyAgICAgKiBkZXNpcmVkLiBUaGlzIG1heSBiZSBpbXBvcnRhbnQgaW4gY2FzZXMgd2hlcmUgZWl0aGVyIHRoZSB0eXBlIG9mIHRoZSB2YWx1ZXMgc3VwcGxpZWQKKyAgICAgKiBkbyBub3QgbWF0Y2ggdGhlIHdheSB0aGF0IHRoZXkgc2hvdWxkIGJlIGludGVycG9sYXRlZCBiZXR3ZWVuLCBvciBpZiB0aGUgdmFsdWVzCisgICAgICogYXJlIG9mIGEgY3VzdG9tIHR5cGUgb3Igb25lIG5vdCBjdXJyZW50bHkgdW5kZXJzdG9vZCBieSB0aGUgYW5pbWF0aW9uIHN5c3RlbS4gQ3VycmVudGx5LAorICAgICAqIG9ubHkgdmFsdWVzIG9mIHR5cGUgZmxvYXQsIGRvdWJsZSwgYW5kIGludCAoYW5kIHRoZWlyIE9iamVjdCBlcXVpdmFsZW50cywgRmxvYXQsIERvdWJsZSwKKyAgICAgKiBhbmQgSW50ZWdlcikgYXJlICBjb3JyZWN0bHkgaW50ZXJwb2xhdGVkOyBhbGwgb3RoZXIgdHlwZXMgcmVxdWlyZSBzZXR0aW5nIGEgVHlwZUV2YWx1YXRvci4KKyAgICAgKiBAcGFyYW0gZXZhbHVhdG9yCisgICAgICovCisJcHVibGljIHZvaWQgc2V0RXZhbHVhdG9yKFR5cGVFdmFsdWF0b3IgZXZhbHVhdG9yKSB7CisgICAgICAgIG1FdmFsdWF0b3IgPSBldmFsdWF0b3I7CisgICAgfQorCisgICAgLyoqCisgICAgICogRnVuY3Rpb24gdXNlZCB0byBjYWxjdWxhdGUgdGhlIHZhbHVlIGFjY29yZGluZyB0byB0aGUgZXZhbHVhdG9yIHNldCB1cCBmb3IKKyAgICAgKiB0aGlzIFByb3BlcnR5VmFsdWVzSG9sZGVyIG9iamVjdC4gVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgVmFsdWVBbmltYXRvci5hbmltYXRlVmFsdWUoKS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBmcmFjdGlvbiBUaGUgZWxhcHNlZCwgaW50ZXJwb2xhdGVkIGZyYWN0aW9uIG9mIHRoZSBhbmltYXRpb24uCisgICAgICogQHJldHVybiBUaGUgY2FsY3VsYXRlZCB2YWx1ZSBhdCB0aGlzIHBvaW50IGluIHRoZSBhbmltYXRpb24uCisgICAgICovCisgICAgT2JqZWN0IGNhbGN1bGF0ZVZhbHVlKGZsb2F0IGZyYWN0aW9uKSB7CisgICAgICAgIG1BbmltYXRlZFZhbHVlID0gbUtleWZyYW1lU2V0LmdldFZhbHVlKGZyYWN0aW9uLCBtRXZhbHVhdG9yKTsKKyAgICAgICAgcmV0dXJuIG1BbmltYXRlZFZhbHVlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIDxjb2RlPk1ldGhvZDwvY29kZT4gdGhhdCBpcyBjYWxsZWQgd2l0aCB0aGUgYW5pbWF0ZWQgdmFsdWVzIGNhbGN1bGF0ZWQKKyAgICAgKiBkdXJpbmcgdGhlIGFuaW1hdGlvbi4gU2V0dGluZyB0aGUgc2V0dGVyIG1ldGhvZCBpcyBhbiBhbHRlcm5hdGl2ZSB0byBzdXBwbHlpbmcgYQorICAgICAqIHtAbGluayAjc2V0UHJvcGVydHlOYW1lKFN0cmluZykgcHJvcGVydHlOYW1lfSBmcm9tIHdoaWNoIHRoZSBtZXRob2QgaXMgZGVyaXZlZC4gVGhpcworICAgICAqIGFwcHJvYWNoIGlzIG1vcmUgZGlyZWN0LCBhbmQgaXMgZXNwZWNpYWxseSB1c2VmdWwgd2hlbiBhIGZ1bmN0aW9uIG11c3QgYmUgY2FsbGVkIHRoYXQgZG9lcworICAgICAqIG5vdCBjb3JyZXNwb25kIHRvIHRoZSBjb252ZW50aW9uIG9mIDxjb2RlPnNldE5hbWUoKTwvY29kZT4uIEZvciBleGFtcGxlLCBpZiBhIGZ1bmN0aW9uCisgICAgICogY2FsbGVkIDxjb2RlPm9mZnNldCgpPC9jb2RlPiBpcyB0byBiZSBjYWxsZWQgd2l0aCB0aGUgYW5pbWF0ZWQgdmFsdWVzLCB0aGVyZSBpcyBubyB3YXkKKyAgICAgKiB0byB0ZWxsIDxjb2RlPk9iamVjdEFuaW1hdG9yPC9jb2RlPiBob3cgdG8gY2FsbCB0aGF0IGZ1bmN0aW9uIHNpbXBseSB0aHJvdWdoIGEgcHJvcGVydHkKKyAgICAgKiBuYW1lLCBzbyBhIHNldHRlciBtZXRob2Qgc2hvdWxkIGJlIHN1cHBsaWVkIGluc3RlYWQuCisgICAgICoKKyAgICAgKiA8cD5Ob3RlIHRoYXQgdGhlIHNldHRlciBmdW5jdGlvbiBtdXN0IHRha2UgdGhlIHNhbWUgcGFyYW1ldGVyIHR5cGUgYXMgdGhlCisgICAgICogPGNvZGU+dmFsdWVGcm9tPC9jb2RlPiBhbmQgPGNvZGU+dmFsdWVUbzwvY29kZT4gcHJvcGVydGllcywgb3RoZXJ3aXNlIHRoZSBjYWxsIHRvCisgICAgICogdGhlIHNldHRlciBmdW5jdGlvbiB3aWxsIGZhaWwuPC9wPgorICAgICAqCisgICAgICogQHBhcmFtIHNldHRlciBUaGUgc2V0dGVyIG1ldGhvZCB0aGF0IHNob3VsZCBiZSBjYWxsZWQgd2l0aCB0aGUgYW5pbWF0ZWQgdmFsdWVzLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFNldHRlcihNZXRob2Qgc2V0dGVyKSB7CisgICAgICAgIG1TZXR0ZXIgPSBzZXR0ZXI7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgPGNvZGU+TWV0aG9kPC9jb2RlPiB0aGF0IGlzIGNhbGxlZCB3aXRoIHRoZSBhbmltYXRlZCB2YWx1ZXMgY2FsY3VsYXRlZAorICAgICAqIGR1cmluZyB0aGUgYW5pbWF0aW9uLgorICAgICAqLworICAgIHB1YmxpYyBNZXRob2QgZ2V0U2V0dGVyKCkgeworICAgICAgICByZXR1cm4gbVNldHRlcjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSA8Y29kZT5NZXRob2Q8L2NvZGU+IHRoYXQgaXMgY2FsbGVkIHRvIGdldCB1bnN1cHBsaWVkIDxjb2RlPnZhbHVlRnJvbTwvY29kZT4gb3IKKyAgICAgKiA8Y29kZT52YWx1ZVRvPC9jb2RlPiBwcm9wZXJ0aWVzLiBTZXR0aW5nIHRoZSBnZXR0ZXIgbWV0aG9kIGlzIGFuIGFsdGVybmF0aXZlIHRvIHN1cHBseWluZyBhCisgICAgICoge0BsaW5rICNzZXRQcm9wZXJ0eU5hbWUoU3RyaW5nKSBwcm9wZXJ0eU5hbWV9IGZyb20gd2hpY2ggdGhlIG1ldGhvZCBpcyBkZXJpdmVkLiBUaGlzCisgICAgICogYXBwcm9hY2ggaXMgbW9yZSBkaXJlY3QsIGFuZCBpcyBlc3BlY2lhbGx5IHVzZWZ1bCB3aGVuIGEgZnVuY3Rpb24gbXVzdCBiZSBjYWxsZWQgdGhhdCBkb2VzCisgICAgICogbm90IGNvcnJlc3BvbmQgdG8gdGhlIGNvbnZlbnRpb24gb2YgPGNvZGU+c2V0TmFtZSgpPC9jb2RlPi4gRm9yIGV4YW1wbGUsIGlmIGEgZnVuY3Rpb24KKyAgICAgKiBjYWxsZWQgPGNvZGU+b2Zmc2V0KCk8L2NvZGU+IGlzIHRvIGJlIGNhbGxlZCB0byBnZXQgYW4gaW5pdGlhbCB2YWx1ZSwgdGhlcmUgaXMgbm8gd2F5CisgICAgICogdG8gdGVsbCA8Y29kZT5PYmplY3RBbmltYXRvcjwvY29kZT4gaG93IHRvIGNhbGwgdGhhdCBmdW5jdGlvbiBzaW1wbHkgdGhyb3VnaCBhIHByb3BlcnR5CisgICAgICogbmFtZSwgc28gYSBnZXR0ZXIgbWV0aG9kIHNob3VsZCBiZSBzdXBwbGllZCBpbnN0ZWFkLgorICAgICAqCisgICAgICogPHA+Tm90ZSB0aGF0IHRoZSBnZXR0ZXIgbWV0aG9kIGlzIG9ubHkgY2FsbGVkIHdoZXRoZXIgc3VwcGxpZWQgaGVyZSBvciBkZXJpdmVkCisgICAgICogZnJvbSB0aGUgcHJvcGVydHkgbmFtZSwgaWYgb25lIG9mIDxjb2RlPnZhbHVlRnJvbTwvY29kZT4gb3IgPGNvZGU+dmFsdWVUbzwvY29kZT4gYXJlCisgICAgICogbnVsbC4gSWYgYm90aCBvZiB0aG9zZSB2YWx1ZXMgYXJlIG5vbi1udWxsLCB0aGVuIHRoZXJlIGlzIG5vIG5lZWQgdG8gZ2V0IG9uZSBvZiB0aGUKKyAgICAgKiB2YWx1ZXMgYW5kIHRoZSBnZXR0ZXIgaXMgbm90IGNhbGxlZC4KKyAgICAgKgorICAgICAqIDxwPk5vdGUgdGhhdCB0aGUgZ2V0dGVyIGZ1bmN0aW9uIG11c3QgcmV0dXJuIHRoZSBzYW1lIHBhcmFtZXRlciB0eXBlIGFzIHRoZQorICAgICAqIDxjb2RlPnZhbHVlRnJvbTwvY29kZT4gYW5kIDxjb2RlPnZhbHVlVG88L2NvZGU+IHByb3BlcnRpZXMgKHdoaWNoZXZlciBvZiB0aGVtIGFyZQorICAgICAqIG5vbi1udWxsKSwgb3RoZXJ3aXNlIHRoZSBjYWxsIHRvIHRoZSBnZXR0ZXIgZnVuY3Rpb24gd2lsbCBmYWlsLjwvcD4KKyAgICAgKgorICAgICAqIEBwYXJhbSBnZXR0ZXIgVGhlIGdldHRlciBtZXRob2QgdGhhdCBzaG91bGQgYmUgY2FsbGVkIHRvIGdldCBpbml0aWFsIGFuaW1hdGlvbiB2YWx1ZXMuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0R2V0dGVyKE1ldGhvZCBnZXR0ZXIpIHsKKyAgICAgICAgbUdldHRlciA9IGdldHRlcjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSA8Y29kZT5NZXRob2Q8L2NvZGU+IHRoYXQgaXMgY2FsbGVkIHRvIGdldCB1bnN1cHBsaWVkIDxjb2RlPnZhbHVlRnJvbTwvY29kZT4gb3IKKyAgICAgKiA8Y29kZT52YWx1ZVRvPC9jb2RlPiBwcm9wZXJ0aWVzLgorICAgICAqLworICAgIHB1YmxpYyBNZXRob2QgZ2V0R2V0dGVyKCkgeworICAgICAgICByZXR1cm4gbUdldHRlcjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSB0aGF0IHdpbGwgYmUgYW5pbWF0ZWQuIFRoaXMgbmFtZSBpcyB1c2VkIHRvIGRlcml2ZQorICAgICAqIGEgc2V0dGVyIGZ1bmN0aW9uIHRoYXQgd2lsbCBiZSBjYWxsZWQgdG8gc2V0IGFuaW1hdGVkIHZhbHVlcy4KKyAgICAgKiBGb3IgZXhhbXBsZSwgYSBwcm9wZXJ0eSBuYW1lIG9mIDxjb2RlPmZvbzwvY29kZT4gd2lsbCByZXN1bHQKKyAgICAgKiBpbiBhIGNhbGwgdG8gdGhlIGZ1bmN0aW9uIDxjb2RlPnNldEZvbygpPC9jb2RlPiBvbiB0aGUgdGFyZ2V0IG9iamVjdC4gSWYgZWl0aGVyCisgICAgICogPGNvZGU+dmFsdWVGcm9tPC9jb2RlPiBvciA8Y29kZT52YWx1ZVRvPC9jb2RlPiBpcyBudWxsLCB0aGVuIGEgZ2V0dGVyIGZ1bmN0aW9uIHdpbGwKKyAgICAgKiBhbHNvIGJlIGRlcml2ZWQgYW5kIGNhbGxlZC4KKyAgICAgKgorICAgICAqIDxwPk5vdGUgdGhhdCB0aGUgc2V0dGVyIGZ1bmN0aW9uIGRlcml2ZWQgZnJvbSB0aGlzIHByb3BlcnR5IG5hbWUKKyAgICAgKiBtdXN0IHRha2UgdGhlIHNhbWUgcGFyYW1ldGVyIHR5cGUgYXMgdGhlCisgICAgICogPGNvZGU+dmFsdWVGcm9tPC9jb2RlPiBhbmQgPGNvZGU+dmFsdWVUbzwvY29kZT4gcHJvcGVydGllcywgb3RoZXJ3aXNlIHRoZSBjYWxsIHRvCisgICAgICogdGhlIHNldHRlciBmdW5jdGlvbiB3aWxsIGZhaWwuPC9wPgorICAgICAqCisgICAgICogQHBhcmFtIHByb3BlcnR5TmFtZSBUaGUgbmFtZSBvZiB0aGUgcHJvcGVydHkgYmVpbmcgYW5pbWF0ZWQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UHJvcGVydHlOYW1lKFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKKyAgICAgICAgbVByb3BlcnR5TmFtZSA9IHByb3BlcnR5TmFtZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSB0aGF0IHdpbGwgYmUgYW5pbWF0ZWQuIFRoaXMgbmFtZSB3aWxsIGJlIHVzZWQgdG8gZGVyaXZlCisgICAgICogYSBzZXR0ZXIgZnVuY3Rpb24gdGhhdCB3aWxsIGJlIGNhbGxlZCB0byBzZXQgYW5pbWF0ZWQgdmFsdWVzLgorICAgICAqIEZvciBleGFtcGxlLCBhIHByb3BlcnR5IG5hbWUgb2YgPGNvZGU+Zm9vPC9jb2RlPiB3aWxsIHJlc3VsdAorICAgICAqIGluIGEgY2FsbCB0byB0aGUgZnVuY3Rpb24gPGNvZGU+c2V0Rm9vKCk8L2NvZGU+IG9uIHRoZSB0YXJnZXQgb2JqZWN0LiBJZiBlaXRoZXIKKyAgICAgKiA8Y29kZT52YWx1ZUZyb208L2NvZGU+IG9yIDxjb2RlPnZhbHVlVG88L2NvZGU+IGlzIG51bGwsIHRoZW4gYSBnZXR0ZXIgZnVuY3Rpb24gd2lsbAorICAgICAqIGFsc28gYmUgZGVyaXZlZCBhbmQgY2FsbGVkLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0UHJvcGVydHlOYW1lKCkgeworICAgICAgICByZXR1cm4gbVByb3BlcnR5TmFtZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJbnRlcm5hbCBmdW5jdGlvbiwgY2FsbGVkIGJ5IFZhbHVlQW5pbWF0b3IgYW5kIE9iamVjdEFuaW1hdG9yLCB0byByZXRyaWV2ZSB0aGUgdmFsdWUKKyAgICAgKiBtb3N0IHJlY2VudGx5IGNhbGN1bGF0ZWQgaW4gY2FsY3VsYXRlVmFsdWUoKS4KKyAgICAgKiBAcmV0dXJuCisgICAgICovCisgICAgT2JqZWN0IGdldEFuaW1hdGVkVmFsdWUoKSB7CisgICAgICAgIHJldHVybiBtQW5pbWF0ZWRWYWx1ZTsKKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvYW5pbWF0aW9uL1JHQkV2YWx1YXRvci5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvYW5pbWF0aW9uL1JHQkV2YWx1YXRvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJhZTBhZjAKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9hbmltYXRpb24vUkdCRXZhbHVhdG9yLmphdmEKQEAgLTAsMCArMSw1OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5hbmltYXRpb247CisKKy8qKgorICogVGhpcyBldmFsdWF0b3IgY2FuIGJlIHVzZWQgdG8gcGVyZm9ybSB0eXBlIGludGVycG9sYXRpb24gYmV0d2VlbiBpbnRlZ2VyCisgKiB2YWx1ZXMgdGhhdCByZXByZXNlbnQgQVJHQiBjb2xvcnMuCisgKi8KK3B1YmxpYyBjbGFzcyBSR0JFdmFsdWF0b3IgaW1wbGVtZW50cyBUeXBlRXZhbHVhdG9yIHsKKworICAgIC8qKgorICAgICAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgY2FsY3VsYXRlZCBpbi1iZXR3ZWVuIHZhbHVlIGZvciBhIGNvbG9yCisgICAgICogZ2l2ZW4gaW50ZWdlcnMgdGhhdCByZXByZXNlbnQgdGhlIHN0YXJ0IGFuZCBlbmQgdmFsdWVzIGluIHRoZSBmb3VyCisgICAgICogYnl0ZXMgb2YgdGhlIDMyLWJpdCBpbnQuIEVhY2ggY2hhbm5lbCBpcyBzZXBhcmF0ZWx5IGxpbmVhcmx5IGludGVycG9sYXRlZAorICAgICAqIGFuZCB0aGUgcmVzdWx0aW5nIGNhbGN1bGF0ZWQgdmFsdWVzIGFyZSByZWNvbWJpbmVkIGludG8gdGhlIHJldHVybiB2YWx1ZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBmcmFjdGlvbiBUaGUgZnJhY3Rpb24gZnJvbSB0aGUgc3RhcnRpbmcgdG8gdGhlIGVuZGluZyB2YWx1ZXMKKyAgICAgKiBAcGFyYW0gc3RhcnRWYWx1ZSBBIDMyLWJpdCBpbnQgdmFsdWUgcmVwcmVzZW50aW5nIGNvbG9ycyBpbiB0aGUKKyAgICAgKiBzZXBhcmF0ZSBieXRlcyBvZiB0aGUgcGFyYW1ldGVyCisgICAgICogQHBhcmFtIGVuZFZhbHVlIEEgMzItYml0IGludCB2YWx1ZSByZXByZXNlbnRpbmcgY29sb3JzIGluIHRoZQorICAgICAqIHNlcGFyYXRlIGJ5dGVzIG9mIHRoZSBwYXJhbWV0ZXIKKyAgICAgKiBAcmV0dXJuIEEgdmFsdWUgdGhhdCBpcyBjYWxjdWxhdGVkIHRvIGJlIHRoZSBsaW5lYXJseSBpbnRlcnBvbGF0ZWQKKyAgICAgKiByZXN1bHQsIGRlcml2ZWQgYnkgc2VwYXJhdGluZyB0aGUgc3RhcnQgYW5kIGVuZCB2YWx1ZXMgaW50byBzZXBhcmF0ZQorICAgICAqIGNvbG9yIGNoYW5uZWxzIGFuZCBpbnRlcnBvbGF0aW5nIGVhY2ggb25lIHNlcGFyYXRlbHksIHJlY29tYmluaW5nIHRoZQorICAgICAqIHJlc3VsdGluZyB2YWx1ZXMgaW4gdGhlIHNhbWUgd2F5LgorICAgICAqLworICAgIHB1YmxpYyBPYmplY3QgZXZhbHVhdGUoZmxvYXQgZnJhY3Rpb24sIE9iamVjdCBzdGFydFZhbHVlLCBPYmplY3QgZW5kVmFsdWUpIHsKKyAgICAgICAgaW50IHN0YXJ0SW50ID0gKEludGVnZXIpIHN0YXJ0VmFsdWU7CisgICAgICAgIGludCBzdGFydEEgPSAoc3RhcnRJbnQgPj4gMjQpOworICAgICAgICBpbnQgc3RhcnRSID0gKHN0YXJ0SW50ID4+IDE2KSAmIDB4ZmY7CisgICAgICAgIGludCBzdGFydEcgPSAoc3RhcnRJbnQgPj4gOCkgJiAweGZmOworICAgICAgICBpbnQgc3RhcnRCID0gc3RhcnRJbnQgJiAweGZmOworCisgICAgICAgIGludCBlbmRJbnQgPSAoSW50ZWdlcikgZW5kVmFsdWU7CisgICAgICAgIGludCBlbmRBID0gKGVuZEludCA+PiAyNCk7CisgICAgICAgIGludCBlbmRSID0gKGVuZEludCA+PiAxNikgJiAweGZmOworICAgICAgICBpbnQgZW5kRyA9IChlbmRJbnQgPj4gOCkgJiAweGZmOworICAgICAgICBpbnQgZW5kQiA9IGVuZEludCAmIDB4ZmY7CisKKyAgICAgICAgcmV0dXJuIChpbnQpKChzdGFydEEgKyAoaW50KShmcmFjdGlvbiAqIChlbmRBIC0gc3RhcnRBKSkpIDw8IDI0KSB8CisgICAgICAgICAgICAgICAgKGludCkoKHN0YXJ0UiArIChpbnQpKGZyYWN0aW9uICogKGVuZFIgLSBzdGFydFIpKSkgPDwgMTYpIHwKKyAgICAgICAgICAgICAgICAoaW50KSgoc3RhcnRHICsgKGludCkoZnJhY3Rpb24gKiAoZW5kRyAtIHN0YXJ0RykpKSA8PCA4KSB8CisgICAgICAgICAgICAgICAgKGludCkoKHN0YXJ0QiArIChpbnQpKGZyYWN0aW9uICogKGVuZEIgLSBzdGFydEIpKSkpOworICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9hbmltYXRpb24vVHlwZUV2YWx1YXRvci5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvYW5pbWF0aW9uL1R5cGVFdmFsdWF0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYTQ5MTc1Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvYW5pbWF0aW9uL1R5cGVFdmFsdWF0b3IuamF2YQpAQCAtMCwwICsxLDQ0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLmFuaW1hdGlvbjsKKworLyoqCisgKiBJbnRlcmZhY2UgZm9yIHVzZSB3aXRoIHRoZSB7QGxpbmsgVmFsdWVBbmltYXRvciNzZXRFdmFsdWF0b3IoVHlwZUV2YWx1YXRvcil9IGZ1bmN0aW9uLiBFdmFsdWF0b3JzCisgKiBhbGxvdyBkZXZlbG9wZXJzIHRvIGNyZWF0ZSBhbmltYXRpb25zIG9uIGFyYml0cmFyeSBwcm9wZXJ0eSB0eXBlcywgYnkgYWxsb3dpbmcgdGhlbSB0byBzdXBwbHkKKyAqIGN1c3RvbSBldmF1bGF0b3JzIGZvciB0eXBlcyB0aGF0IGFyZSBub3QgYXV0b21hdGljYWxseSB1bmRlcnN0b29kIGFuZCB1c2VkIGJ5IHRoZSBhbmltYXRpb24KKyAqIHN5c3RlbS4KKyAqCisgKiBAc2VlIFZhbHVlQW5pbWF0b3Ijc2V0RXZhbHVhdG9yKFR5cGVFdmFsdWF0b3IpCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgVHlwZUV2YWx1YXRvciB7CisKKyAgICAvKioKKyAgICAgKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIHJlc3VsdCBvZiBsaW5lYXJseSBpbnRlcnBvbGF0aW5nIHRoZSBzdGFydCBhbmQgZW5kIHZhbHVlcywgd2l0aAorICAgICAqIDxjb2RlPmZyYWN0aW9uPC9jb2RlPiByZXByZXNlbnRpbmcgdGhlIHByb3BvcnRpb24gYmV0d2VlbiB0aGUgc3RhcnQgYW5kIGVuZCB2YWx1ZXMuIFRoZQorICAgICAqIGNhbGN1bGF0aW9uIGlzIGEgc2ltcGxlIHBhcmFtZXRyaWMgY2FsY3VsYXRpb246IDxjb2RlPnJlc3VsdCA9IHgwICsgdCAqICh2MSAtIHYwKTwvY29kZT4sCisgICAgICogd2hlcmUgPGNvZGU+eDA8L2NvZGU+IGlzIDxjb2RlPnN0YXJ0VmFsdWU8L2NvZGU+LCA8Y29kZT54MTwvY29kZT4gaXMgPGNvZGU+ZW5kVmFsdWU8L2NvZGU+LAorICAgICAqIGFuZCA8Y29kZT50PC9jb2RlPiBpcyA8Y29kZT5mcmFjdGlvbjwvY29kZT4uCisgICAgICoKKyAgICAgKiBAcGFyYW0gZnJhY3Rpb24gICBUaGUgZnJhY3Rpb24gZnJvbSB0aGUgc3RhcnRpbmcgdG8gdGhlIGVuZGluZyB2YWx1ZXMKKyAgICAgKiBAcGFyYW0gc3RhcnRWYWx1ZSBUaGUgc3RhcnQgdmFsdWUuCisgICAgICogQHBhcmFtIGVuZFZhbHVlICAgVGhlIGVuZCB2YWx1ZS4KKyAgICAgKiBAcmV0dXJuIEEgbGluZWFyIGludGVycG9sYXRpb24gYmV0d2VlbiB0aGUgc3RhcnQgYW5kIGVuZCB2YWx1ZXMsIGdpdmVuIHRoZQorICAgICAqICAgICAgICAgPGNvZGU+ZnJhY3Rpb248L2NvZGU+IHBhcmFtZXRlci4KKyAgICAgKi8KKyAgICBwdWJsaWMgT2JqZWN0IGV2YWx1YXRlKGZsb2F0IGZyYWN0aW9uLCBPYmplY3Qgc3RhcnRWYWx1ZSwgT2JqZWN0IGVuZFZhbHVlKTsKKworfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2FuaW1hdGlvbi9WYWx1ZUFuaW1hdG9yLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9hbmltYXRpb24vVmFsdWVBbmltYXRvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjFlMmJiY2MKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9hbmltYXRpb24vVmFsdWVBbmltYXRvci5qYXZhCkBAIC0wLDAgKzEsOTgxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLmFuaW1hdGlvbjsKKworaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLkxvb3BlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLk1lc3NhZ2U7CitpbXBvcnQgYW5kcm9pZC52aWV3LmFuaW1hdGlvbi5BY2NlbGVyYXRlRGVjZWxlcmF0ZUludGVycG9sYXRvcjsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuYW5pbWF0aW9uLkFuaW1hdGlvblV0aWxzOworaW1wb3J0IGFuZHJvaWQudmlldy5hbmltYXRpb24uSW50ZXJwb2xhdG9yOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKKworLyoqCisgKiBUaGlzIGNsYXNzIHByb3ZpZGVzIGEgc2ltcGxlIHRpbWluZyBlbmdpbmUgZm9yIHJ1bm5pbmcgYW5pbWF0aW9ucworICogd2hpY2ggY2FsY3VsYXRlIGFuaW1hdGVkIHZhbHVlcyBhbmQgc2V0IHRoZW0gb24gdGFyZ2V0IG9iamVjdHMuCisgKgorICogPHA+VGhlcmUgaXMgYSBzaW5nbGUgdGltaW5nIHB1bHNlIHRoYXQgYWxsIGFuaW1hdGlvbnMgdXNlLiBJdCBydW5zIGluIGEKKyAqIGN1c3RvbSBoYW5kbGVyIHRvIGVuc3VyZSB0aGF0IHByb3BlcnR5IGNoYW5nZXMgaGFwcGVuIG9uIHRoZSBVSSB0aHJlYWQuPC9wPgorICoKKyAqIDxwPkJ5IGRlZmF1bHQsIFZhbHVlQW5pbWF0b3IgdXNlcyBub24tbGluZWFyIHRpbWUgaW50ZXJwb2xhdGlvbiwgdmlhIHRoZQorICoge0BsaW5rIEFjY2VsZXJhdGVEZWNlbGVyYXRlSW50ZXJwb2xhdG9yfSBjbGFzcywgd2hpY2ggYWNjZWxlcmF0ZXMgaW50byBhbmQgZGVjZWxlcmF0ZXMKKyAqIG91dCBvZiBhbiBhbmltYXRpb24uIFRoaXMgYmVoYXZpb3IgY2FuIGJlIGNoYW5nZWQgYnkgY2FsbGluZworICoge0BsaW5rIFZhbHVlQW5pbWF0b3Ijc2V0SW50ZXJwb2xhdG9yKEludGVycG9sYXRvcil9LjwvcD4KKyAqLworcHVibGljIGNsYXNzIFZhbHVlQW5pbWF0b3I8VD4gZXh0ZW5kcyBBbmltYXRvciB7CisKKyAgICAvKioKKyAgICAgKiBJbnRlcm5hbCBjb25zdGFudHMKKyAgICAgKi8KKworICAgIC8qCisgICAgICogVGhlIGRlZmF1bHQgYW1vdW50IG9mIHRpbWUgaW4gbXMgYmV0d2VlbiBhbmltYXRpb24gZnJhbWVzCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBERUZBVUxUX0ZSQU1FX0RFTEFZID0gMzA7CisKKyAgICAvKioKKyAgICAgKiBNZXNzYWdlcyBzZW50IHRvIHRpbWluZyBoYW5kbGVyOiBTVEFSVCBpcyBzZW50IHdoZW4gYW4gYW5pbWF0aW9uIGZpcnN0IGJlZ2lucywgRlJBTUUgaXMgc2VudAorICAgICAqIGJ5IHRoZSBoYW5kbGVyIHRvIGl0c2VsZiB0byBwcm9jZXNzIHRoZSBuZXh0IGFuaW1hdGlvbiBmcmFtZQorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBBTklNQVRJT05fU1RBUlQgPSAwOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBBTklNQVRJT05fRlJBTUUgPSAxOworCisgICAgLyoqCisgICAgICogVmFsdWVzIHVzZWQgd2l0aCBpbnRlcm5hbCB2YXJpYWJsZSBtUGxheWluZ1N0YXRlIHRvIGluZGljYXRlIHRoZSBjdXJyZW50IHN0YXRlIG9mIGFuCisgICAgICogYW5pbWF0aW9uLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTVE9QUEVEICAgID0gMDsgLy8gTm90IHlldCBwbGF5aW5nCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFJVTk5JTkcgICAgPSAxOyAvLyBQbGF5aW5nIG5vcm1hbGx5CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IENBTkNFTEVEICAgPSAyOyAvLyBjYW5jZWwoKSBjYWxsZWQgLSBuZWVkIHRvIGVuZCBpdAorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBFTkRFRCAgICAgID0gMzsgLy8gZW5kKCkgY2FsbGVkIC0gbmVlZCB0byBlbmQgaXQKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU0VFS0VEICAgICA9IDQ7IC8vIFNlZWtlZCB0byBzb21lIHRpbWUgdmFsdWUKKworICAgIC8qKgorICAgICAqIEludGVybmFsIHZhcmlhYmxlcworICAgICAqIE5PVEU6IFRoaXMgb2JqZWN0IGltcGxlbWVudHMgdGhlIGNsb25lKCkgbWV0aG9kLCBtYWtpbmcgYSBkZWVwIGNvcHkgb2YgYW55IHJlZmVyZW5jZWQKKyAgICAgKiBvYmplY3RzLiBBcyBvdGhlciBub24tdHJpdmlhbCBmaWVsZHMgYXJlIGFkZGVkIHRvIHRoaXMgY2xhc3MsIG1ha2Ugc3VyZSB0byBhZGQgbG9naWMKKyAgICAgKiB0byBjbG9uZSgpIHRvIG1ha2UgZGVlcCBjb3BpZXMgb2YgdGhlbS4KKyAgICAgKi8KKworICAgIC8vIFRoZSBmaXJzdCB0aW1lIHRoYXQgdGhlIGFuaW1hdGlvbidzIGFuaW1hdGVGcmFtZSgpIG1ldGhvZCBpcyBjYWxsZWQuIFRoaXMgdGltZSBpcyB1c2VkIHRvCisgICAgLy8gZGV0ZXJtaW5lIGVsYXBzZWQgdGltZSAoYW5kIHRoZXJlZm9yZSB0aGUgZWxhcHNlZCBmcmFjdGlvbikgaW4gc3Vic2VxdWVudCBjYWxscworICAgIC8vIHRvIGFuaW1hdGVGcmFtZSgpCisgICAgcHJpdmF0ZSBsb25nIG1TdGFydFRpbWU7CisKKyAgICAvKioKKyAgICAgKiBTZXQgd2hlbiBzZXRDdXJyZW50UGxheVRpbWUoKSBpcyBjYWxsZWQuIElmIG5lZ2F0aXZlLCBhbmltYXRpb24gaXMgbm90IGN1cnJlbnRseSBzZWVrZWQKKyAgICAgKiB0byBhIHZhbHVlLgorICAgICAqLworICAgIHByaXZhdGUgbG9uZyBtU2Vla1RpbWUgPSAtMTsKKworICAgIC8vIFRoZSBzdGF0aWMgc0FuaW1hdGlvbkhhbmRsZXIgcHJvY2Vzc2VzIHRoZSBpbnRlcm5hbCB0aW1pbmcgbG9vcCBvbiB3aGljaCBhbGwgYW5pbWF0aW9ucworICAgIC8vIGFyZSBiYXNlZAorICAgIHByaXZhdGUgc3RhdGljIEFuaW1hdGlvbkhhbmRsZXIgc0FuaW1hdGlvbkhhbmRsZXI7CisKKyAgICAvLyBUaGUgc3RhdGljIGxpc3Qgb2YgYWxsIGFjdGl2ZSBhbmltYXRpb25zCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQXJyYXlMaXN0PFZhbHVlQW5pbWF0b3I+IHNBbmltYXRpb25zID0gbmV3IEFycmF5TGlzdDxWYWx1ZUFuaW1hdG9yPigpOworCisgICAgLy8gVGhlIHNldCBvZiBhbmltYXRpb25zIHRvIGJlIHN0YXJ0ZWQgb24gdGhlIG5leHQgYW5pbWF0aW9uIGZyYW1lCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQXJyYXlMaXN0PFZhbHVlQW5pbWF0b3I+IHNQZW5kaW5nQW5pbWF0aW9ucyA9IG5ldyBBcnJheUxpc3Q8VmFsdWVBbmltYXRvcj4oKTsKKworICAgIC8vIFRoZSB0aW1lIGludGVycG9sYXRvciB0byBiZSB1c2VkIGlmIG5vbmUgaXMgc2V0IG9uIHRoZSBhbmltYXRpb24KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBJbnRlcnBvbGF0b3Igc0RlZmF1bHRJbnRlcnBvbGF0b3IgPSBuZXcgQWNjZWxlcmF0ZURlY2VsZXJhdGVJbnRlcnBvbGF0b3IoKTsKKworICAgIC8vIHR5cGUgZXZhbHVhdG9ycyBmb3IgdGhlIHRocmVlIHByaW1pdGl2ZSB0eXBlcyBoYW5kbGVkIGJ5IHRoaXMgaW1wbGVtZW50YXRpb24KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBUeXBlRXZhbHVhdG9yIHNJbnRFdmFsdWF0b3IgPSBuZXcgSW50RXZhbHVhdG9yKCk7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgVHlwZUV2YWx1YXRvciBzRmxvYXRFdmFsdWF0b3IgPSBuZXcgRmxvYXRFdmFsdWF0b3IoKTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBUeXBlRXZhbHVhdG9yIHNEb3VibGVFdmFsdWF0b3IgPSBuZXcgRG91YmxlRXZhbHVhdG9yKCk7CisKKyAgICAvKioKKyAgICAgKiBVc2VkIHRvIGluZGljYXRlIHdoZXRoZXIgdGhlIGFuaW1hdGlvbiBpcyBjdXJyZW50bHkgcGxheWluZyBpbiByZXZlcnNlLiBUaGlzIGNhdXNlcyB0aGUKKyAgICAgKiBlbGFwc2VkIGZyYWN0aW9uIHRvIGJlIGludmVydGVkIHRvIGNhbGN1bGF0ZSB0aGUgYXBwcm9wcmlhdGUgdmFsdWVzLgorICAgICAqLworICAgIHByaXZhdGUgYm9vbGVhbiBtUGxheWluZ0JhY2t3YXJkcyA9IGZhbHNlOworCisgICAgLyoqCisgICAgICogVGhpcyB2YXJpYWJsZSB0cmFja3MgdGhlIGN1cnJlbnQgaXRlcmF0aW9uIHRoYXQgaXMgcGxheWluZy4gV2hlbiBtQ3VycmVudEl0ZXJhdGlvbiBleGNlZWRzIHRoZQorICAgICAqIHJlcGVhdENvdW50IChpZiByZXBlYXRDb3VudCE9SU5GSU5JVEUpLCB0aGUgYW5pbWF0aW9uIGVuZHMKKyAgICAgKi8KKyAgICBwcml2YXRlIGludCBtQ3VycmVudEl0ZXJhdGlvbiA9IDA7CisKKyAgICAvKioKKyAgICAgKiBUcmFja3Mgd2hldGhlciBhIHN0YXJ0RGVsYXknZCBhbmltYXRpb24gaGFzIGJlZ3VuIHBsYXlpbmcgdGhyb3VnaCB0aGUgc3RhcnREZWxheS4KKyAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gbVN0YXJ0ZWREZWxheSA9IGZhbHNlOworCisgICAgLyoqCisgICAgICogVHJhY2tzIHRoZSB0aW1lIGF0IHdoaWNoIHRoZSBhbmltYXRpb24gYmVnYW4gcGxheWluZyB0aHJvdWdoIGl0cyBzdGFydERlbGF5LiBUaGlzIGlzCisgICAgICogZGlmZmVyZW50IGZyb20gdGhlIG1TdGFydFRpbWUgdmFyaWFibGUsIHdoaWNoIGlzIHVzZWQgdG8gdHJhY2sgd2hlbiB0aGUgYW5pbWF0aW9uIGJlY2FtZQorICAgICAqIGFjdGl2ZSAod2hpY2ggaXMgd2hlbiB0aGUgc3RhcnREZWxheSBleHBpcmVkIGFuZCB0aGUgYW5pbWF0aW9uIHdhcyBhZGRlZCB0byB0aGUgYWN0aXZlCisgICAgICogYW5pbWF0aW9ucyBsaXN0KS4KKyAgICAgKi8KKyAgICBwcml2YXRlIGxvbmcgbURlbGF5U3RhcnRUaW1lOworCisgICAgLyoqCisgICAgICogRmxhZyB0aGF0IHJlcHJlc2VudHMgdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIGFuaW1hdGlvbi4gVXNlZCB0byBmaWd1cmUgb3V0IHdoZW4gdG8gc3RhcnQKKyAgICAgKiBhbiBhbmltYXRpb24gKGlmIHN0YXRlID09IFNUT1BQRUQpLiBBbHNvIHVzZWQgdG8gZW5kIGFuIGFuaW1hdGlvbiB0aGF0CisgICAgICogaGFzIGJlZW4gY2FuY2VsKCknZCBvciBlbmQoKSdkIHNpbmNlIHRoZSBsYXN0IGFuaW1hdGlvbiBmcmFtZS4gUG9zc2libGUgdmFsdWVzIGFyZQorICAgICAqIFNUT1BQRUQsIFJVTk5JTkcsIEVOREVELCBDQU5DRUxFRC4KKyAgICAgKi8KKyAgICBwcml2YXRlIGludCBtUGxheWluZ1N0YXRlID0gU1RPUFBFRDsKKworICAgIC8qKgorICAgICAqIEludGVybmFsIGNvbGxlY3Rpb25zIHVzZWQgdG8gYXZvaWQgc2V0IGNvbGxpc2lvbnMgYXMgYW5pbWF0aW9ucyBzdGFydCBhbmQgZW5kIHdoaWxlIGJlaW5nCisgICAgICogcHJvY2Vzc2VkLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEFycmF5TGlzdDxWYWx1ZUFuaW1hdG9yPiBzRW5kaW5nQW5pbXMgPSBuZXcgQXJyYXlMaXN0PFZhbHVlQW5pbWF0b3I+KCk7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQXJyYXlMaXN0PFZhbHVlQW5pbWF0b3I+IHNEZWxheWVkQW5pbXMgPSBuZXcgQXJyYXlMaXN0PFZhbHVlQW5pbWF0b3I+KCk7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQXJyYXlMaXN0PFZhbHVlQW5pbWF0b3I+IHNSZWFkeUFuaW1zID0gbmV3IEFycmF5TGlzdDxWYWx1ZUFuaW1hdG9yPigpOworCisgICAgLyoqCisgICAgICogRmxhZyB0aGF0IGRlbm90ZXMgd2hldGhlciB0aGUgYW5pbWF0aW9uIGlzIHNldCB1cCBhbmQgcmVhZHkgdG8gZ28uIFVzZWQgdG8KKyAgICAgKiBzZXQgdXAgYW5pbWF0aW9uIHRoYXQgaGFzIG5vdCB5ZXQgYmVlbiBzdGFydGVkLgorICAgICAqLworICAgIGJvb2xlYW4gbUluaXRpYWxpemVkID0gZmFsc2U7CisKKyAgICAvLworICAgIC8vIEJhY2tpbmcgdmFyaWFibGVzCisgICAgLy8KKworICAgIC8vIEhvdyBsb25nIHRoZSBhbmltYXRpb24gc2hvdWxkIGxhc3QgaW4gbXMKKyAgICBwcml2YXRlIGxvbmcgbUR1cmF0aW9uOworCisgICAgLy8gVGhlIGFtb3VudCBvZiB0aW1lIGluIG1zIHRvIGRlbGF5IHN0YXJ0aW5nIHRoZSBhbmltYXRpb24gYWZ0ZXIgc3RhcnQoKSBpcyBjYWxsZWQKKyAgICBwcml2YXRlIGxvbmcgbVN0YXJ0RGVsYXkgPSAwOworCisgICAgLy8gVGhlIG51bWJlciBvZiBtaWxsaXNlY29uZHMgYmV0d2VlbiBhbmltYXRpb24gZnJhbWVzCisgICAgcHJpdmF0ZSBzdGF0aWMgbG9uZyBzRnJhbWVEZWxheSA9IERFRkFVTFRfRlJBTUVfREVMQVk7CisKKyAgICAvLyBUaGUgbnVtYmVyIG9mIHRpbWVzIHRoZSBhbmltYXRpb24gd2lsbCByZXBlYXQuIFRoZSBkZWZhdWx0IGlzIDAsIHdoaWNoIG1lYW5zIHRoZSBhbmltYXRpb24KKyAgICAvLyB3aWxsIHBsYXkgb25seSBvbmNlCisgICAgcHJpdmF0ZSBpbnQgbVJlcGVhdENvdW50ID0gMDsKKworICAgIC8qKgorICAgICAqIFRoZSB0eXBlIG9mIHJlcGV0aXRpb24gdGhhdCB3aWxsIG9jY3VyIHdoZW4gcmVwZWF0TW9kZSBpcyBub256ZXJvLiBSRVNUQVJUIG1lYW5zIHRoZQorICAgICAqIGFuaW1hdGlvbiB3aWxsIHN0YXJ0IGZyb20gdGhlIGJlZ2lubmluZyBvbiBldmVyeSBuZXcgY3ljbGUuIFJFVkVSU0UgbWVhbnMgdGhlIGFuaW1hdGlvbgorICAgICAqIHdpbGwgcmV2ZXJzZSBkaXJlY3Rpb25zIG9uIGVhY2ggaXRlcmF0aW9uLgorICAgICAqLworICAgIHByaXZhdGUgaW50IG1SZXBlYXRNb2RlID0gUkVTVEFSVDsKKworICAgIC8qKgorICAgICAqIFRoZSB0aW1lIGludGVycG9sYXRvciB0byBiZSB1c2VkLiBUaGUgZWxhcHNlZCBmcmFjdGlvbiBvZiB0aGUgYW5pbWF0aW9uIHdpbGwgYmUgcGFzc2VkCisgICAgICogdGhyb3VnaCB0aGlzIGludGVycG9sYXRvciB0byBjYWxjdWxhdGUgdGhlIGludGVycG9sYXRlZCBmcmFjdGlvbiwgd2hpY2ggaXMgdGhlbiB1c2VkIHRvCisgICAgICogY2FsY3VsYXRlIHRoZSBhbmltYXRlZCB2YWx1ZXMuCisgICAgICovCisgICAgcHJpdmF0ZSBJbnRlcnBvbGF0b3IgbUludGVycG9sYXRvciA9IHNEZWZhdWx0SW50ZXJwb2xhdG9yOworCisgICAgLyoqCisgICAgICogVGhlIHNldCBvZiBsaXN0ZW5lcnMgdG8gYmUgc2VudCBldmVudHMgdGhyb3VnaCB0aGUgbGlmZSBvZiBhbiBhbmltYXRpb24uCisgICAgICovCisgICAgcHJpdmF0ZSBBcnJheUxpc3Q8QW5pbWF0b3JVcGRhdGVMaXN0ZW5lcj4gbVVwZGF0ZUxpc3RlbmVycyA9IG51bGw7CisKKyAgICAvKioKKyAgICAgKiBUaGUgcHJvcGVydHkvdmFsdWUgc2V0cyBiZWluZyBhbmltYXRlZC4KKyAgICAgKi8KKyAgICBQcm9wZXJ0eVZhbHVlc0hvbGRlcltdIG1WYWx1ZXM7CisKKyAgICAvKioKKyAgICAgKiBBIGhhc2htYXAgb2YgdGhlIFByb3BlcnR5VmFsdWVzSG9sZGVyIG9iamVjdHMuIFRoaXMgbWFwIGlzIHVzZWQgdG8gbG9va3VwIGFuaW1hdGVkIHZhbHVlcworICAgICAqIGJ5IHByb3BlcnR5IG5hbWUgZHVyaW5nIGNhbGxzIHRvIGdldEFuaW1hdGVkVmFsdWUoU3RyaW5nKS4KKyAgICAgKi8KKyAgICBIYXNoTWFwPFN0cmluZywgUHJvcGVydHlWYWx1ZXNIb2xkZXI+IG1WYWx1ZXNNYXA7CisKKyAgICAvKioKKyAgICAgKiBQdWJsaWMgY29uc3RhbnRzCisgICAgICovCisKKyAgICAvKioKKyAgICAgKiBXaGVuIHRoZSBhbmltYXRpb24gcmVhY2hlcyB0aGUgZW5kIGFuZCA8Y29kZT5yZXBlYXRDb3VudDwvY29kZT4gaXMgSU5GSU5JVEUKKyAgICAgKiBvciBhIHBvc2l0aXZlIHZhbHVlLCB0aGUgYW5pbWF0aW9uIHJlc3RhcnRzIGZyb20gdGhlIGJlZ2lubmluZy4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSRVNUQVJUID0gMTsKKyAgICAvKioKKyAgICAgKiBXaGVuIHRoZSBhbmltYXRpb24gcmVhY2hlcyB0aGUgZW5kIGFuZCA8Y29kZT5yZXBlYXRDb3VudDwvY29kZT4gaXMgSU5GSU5JVEUKKyAgICAgKiBvciBhIHBvc2l0aXZlIHZhbHVlLCB0aGUgYW5pbWF0aW9uIHJldmVyc2VzIGRpcmVjdGlvbiBvbiBldmVyeSBpdGVyYXRpb24uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUkVWRVJTRSA9IDI7CisgICAgLyoqCisgICAgICogVGhpcyB2YWx1ZSB1c2VkIHVzZWQgd2l0aCB0aGUge0BsaW5rICNzZXRSZXBlYXRDb3VudChpbnQpfSBwcm9wZXJ0eSB0byByZXBlYXQKKyAgICAgKiB0aGUgYW5pbWF0aW9uIGluZGVmaW5pdGVseS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTkZJTklURSA9IC0xOworCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIG5ldyBWYWx1ZUFuaW1hdG9yIG9iamVjdC4gVGhpcyBkZWZhdWx0IGNvbnN0cnVjdG9yIGlzIHByaW1hcmlseSBmb3IKKyAgICAgKiB1c2UgaW50ZXJuYWxseTsgdGhlIG90aGVyIGNvbnN0cnVjdG9ycyB3aGljaCB0YWtlIHBhcmFtZXRlcnMgYXJlIG1vcmUgZ2VuZXJhbGx5CisgICAgICogdXNlZnVsLgorICAgICAqLworICAgIHB1YmxpYyBWYWx1ZUFuaW1hdG9yKCkgeworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdHMgYW4gVmFsdWVBbmltYXRvciBvYmplY3Qgd2l0aCB0aGUgc3BlY2lmaWVkIGR1cmF0aW9uIGFuZCBzZXQgb2YKKyAgICAgKiB2YWx1ZXMuIElmIHRoZSB2YWx1ZXMgYXJlIGEgc2V0IG9mIFByb3BlcnR5VmFsdWVzSG9sZGVyIG9iamVjdHMsIHRoZW4gdGhlc2Ugb2JqZWN0cworICAgICAqIGRlZmluZSB0aGUgcG90ZW50aWFsbHkgbXVsdGlwbGUgcHJvcGVydGllcyBiZWluZyBhbmltYXRlZCBhbmQgdGhlIHZhbHVlcyB0aGUgcHJvcGVydGllcyBhcmUKKyAgICAgKiBhbmltYXRlZCBiZXR3ZWVuLiBPdGhlcndpc2UsIHRoZSB2YWx1ZXMgZGVmaW5lIGEgc2luZ2xlIHNldCBvZiB2YWx1ZXMgYW5pbWF0ZWQgYmV0d2Vlbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBkdXJhdGlvbiBUaGUgbGVuZ3RoIG9mIHRoZSBhbmltYXRpb24sIGluIG1pbGxpc2Vjb25kcy4KKyAgICAgKiBAcGFyYW0gdmFsdWVzIFRoZSBzZXQgb2YgdmFsdWVzIHRvIGFuaW1hdGUgYmV0d2Vlbi4gSWYgdGhlc2UgdmFsdWVzIGFyZSBub3QKKyAgICAgKiBQcm9wZXJ0eVZhbHVlc0hvbGRlciBvYmplY3RzLCB0aGVuIHRoZXJlIHNob3VsZCBiZSBtb3JlIHRoYW4gb25lIHZhbHVlLCBzaW5jZSB0aGUgdmFsdWVzCisgICAgICogZGV0ZXJtaW5lIHRoZSBpbnRlcnZhbCB0byBhbmltYXRlIGJldHdlZW4uCisgICAgICovCisgICAgcHVibGljIFZhbHVlQW5pbWF0b3IobG9uZyBkdXJhdGlvbiwgVC4uLnZhbHVlcykgeworICAgICAgICBtRHVyYXRpb24gPSBkdXJhdGlvbjsKKyAgICAgICAgaWYgKHZhbHVlcy5sZW5ndGggPiAwKSB7CisgICAgICAgICAgICBzZXRWYWx1ZXModmFsdWVzKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIHZhbHVlcywgcGVyIHByb3BlcnR5LCBiZWluZyBhbmltYXRlZCBiZXR3ZWVuLiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBpbnRlcm5hbGx5CisgICAgICogYnkgdGhlIGNvbnN0cnVjdG9ycyBvZiBWYWx1ZUFuaW1hdG9yIHRoYXQgdGFrZSBhIGxpc3Qgb2YgdmFsdWVzLiBCdXQgYW4gVmFsdWVBbmltYXRvciBjYW4KKyAgICAgKiBiZSBjb25zdHJ1Y3RlZCB3aXRob3V0IHZhbHVlcyBhbmQgdGhpcyBtZXRob2QgY2FuIGJlIGNhbGxlZCB0byBzZXQgdGhlIHZhbHVlcyBtYW51YWxseQorICAgICAqIGluc3RlYWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdmFsdWVzIFRoZSBzZXQgb2YgdmFsdWVzLCBwZXIgcHJvcGVydHksIGJlaW5nIGFuaW1hdGVkIGJldHdlZW4uCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0VmFsdWVzKFByb3BlcnR5VmFsdWVzSG9sZGVyLi4uIHZhbHVlcykgeworICAgICAgICBpbnQgbnVtVmFsdWVzID0gdmFsdWVzLmxlbmd0aDsKKyAgICAgICAgbVZhbHVlcyA9IHZhbHVlczsKKyAgICAgICAgbVZhbHVlc01hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgUHJvcGVydHlWYWx1ZXNIb2xkZXI+KG51bVZhbHVlcyk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtVmFsdWVzOyArK2kpIHsKKyAgICAgICAgICAgIFByb3BlcnR5VmFsdWVzSG9sZGVyIHZhbHVlc0hvbGRlciA9IChQcm9wZXJ0eVZhbHVlc0hvbGRlcikgdmFsdWVzW2ldOworICAgICAgICAgICAgbVZhbHVlc01hcC5wdXQodmFsdWVzSG9sZGVyLmdldFByb3BlcnR5TmFtZSgpLCB2YWx1ZXNIb2xkZXIpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgdmFsdWVzIHRoYXQgdGhpcyBWYWx1ZUFuaW1hdG9yIGFuaW1hdGVzIGJldHdlZW4uIFRoZXNlIHZhbHVlcyBhcmUgc3RvcmVkIGluCisgICAgICogUHJvcGVydHlWYWx1ZXNIb2xkZXIgb2JqZWN0cywgZXZlbiBpZiB0aGUgVmFsdWVBbmltYXRvciB3YXMgY3JlYXRlZCB3aXRoIGEgc2ltcGxlIGxpc3QKKyAgICAgKiBvZiB2YWx1ZSBvYmplY3RzIGluc3RlYWQuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFByb3BlcnR5VmFsdWVzSG9sZGVyW10gQW4gYXJyYXkgb2YgUHJvcGVydHlWYWx1ZXNIb2xkZXIgb2JqZWN0cyB3aGljaCBob2xkIHRoZQorICAgICAqIHZhbHVlcywgcGVyIHByb3BlcnR5LCB0aGF0IGRlZmluZSB0aGUgYW5pbWF0aW9uLgorICAgICAqLworICAgIHB1YmxpYyBQcm9wZXJ0eVZhbHVlc0hvbGRlcltdIGdldFZhbHVlcygpIHsKKyAgICAgICAgcmV0dXJuIG1WYWx1ZXM7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgdmFsdWVzIHRvIGFuaW1hdGUgYmV0d2VlbiBmb3IgdGhpcyBhbmltYXRpb24uIElmIDxjb2RlPnZhbHVlczwvY29kZT4gaXMKKyAgICAgKiBhIHNldCBvZiBQcm9wZXJ0eVZhbHVlc0hvbGRlciBvYmplY3RzLCB0aGVzZSBvYmplY3RzIHdpbGwgYmVjb21lIHRoZSBzZXQgb2YgcHJvcGVydGllcworICAgICAqIGFuaW1hdGVkIGFuZCB0aGUgdmFsdWVzIHRoYXQgdGhvc2UgcHJvcGVydGllcyBhcmUgYW5pbWF0ZWQgYmV0d2Vlbi4gT3RoZXJ3aXNlLCB0aGlzIG1ldGhvZAorICAgICAqIHdpbGwgc2V0IG9ubHkgb25lIHNldCBvZiB2YWx1ZXMgZm9yIHRoZSBWYWx1ZUFuaW1hdG9yLiBBbHNvLCBpZiB0aGUgdmFsdWVzIGFyZSBub3QKKyAgICAgKiBQcm9wZXJ0eVZhbHVlc0hvbGRlciBvYmplY3RzIGFuZCBpZiB0aGVyZSBhcmUgYWxyZWFkeSBtdWx0aXBsZSBzZXRzIG9mCisgICAgICogdmFsdWVzIGRlZmluZWQgZm9yIHRoaXMgVmFsdWVBbmltYXRvciB2aWEKKyAgICAgKiBtb3JlIHRoYW4gb25lIFByb3BlcnR5VmFsdWVzSG9sZGVyIG9iamVjdHMsIHRoaXMgbWV0aG9kIHdpbGwgc2V0IHRoZSB2YWx1ZXMgZm9yCisgICAgICogdGhlIGZpcnN0IG9mIHRob3NlIG9iamVjdHMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdmFsdWVzIFRoZSBzZXQgb2YgdmFsdWVzIHRvIGFuaW1hdGUgYmV0d2Vlbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRWYWx1ZXMoVC4uLiB2YWx1ZXMpIHsKKyAgICAgICAgaWYgKG1WYWx1ZXMgPT0gbnVsbCB8fCBtVmFsdWVzLmxlbmd0aCA9PSAwKSB7CisgICAgICAgICAgICBzZXRWYWx1ZXMobmV3IFByb3BlcnR5VmFsdWVzSG9sZGVyW117CisgICAgICAgICAgICAgICAgICAgIG5ldyBQcm9wZXJ0eVZhbHVlc0hvbGRlcigiIiwgKE9iamVjdFtdKXZhbHVlcyl9KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIFByb3BlcnR5VmFsdWVzSG9sZGVyIHZhbHVlc0hvbGRlciA9IG1WYWx1ZXNbMF07CisgICAgICAgICAgICB2YWx1ZXNIb2xkZXIuc2V0VmFsdWVzKHZhbHVlcyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBpbW1lZGlhdGVseSBiZWZvcmUgcHJvY2Vzc2luZyB0aGUgZmlyc3QgYW5pbWF0aW9uCisgICAgICogZnJhbWUgb2YgYW4gYW5pbWF0aW9uLiBJZiB0aGVyZSBpcyBhIG5vbnplcm8gPGNvZGU+c3RhcnREZWxheTwvY29kZT4sIHRoZQorICAgICAqIGZ1bmN0aW9uIGlzIGNhbGxlZCBhZnRlciB0aGF0IGRlbGF5IGVuZHMuCisgICAgICogSXQgdGFrZXMgY2FyZSBvZiB0aGUgZmluYWwgaW5pdGlhbGl6YXRpb24gc3RlcHMgZm9yIHRoZQorICAgICAqIGFuaW1hdGlvbi4KKyAgICAgKgorICAgICAqICA8cD5PdmVycmlkZXMgb2YgdGhpcyBtZXRob2Qgc2hvdWxkIGNhbGwgdGhlIHN1cGVyY2xhc3MgbWV0aG9kIHRvIGVuc3VyZQorICAgICAqICB0aGF0IGludGVybmFsIG1lY2hhbmlzbXMgZm9yIHRoZSBhbmltYXRpb24gYXJlIHNldCB1cCBjb3JyZWN0bHkuPC9wPgorICAgICAqLworICAgIHZvaWQgaW5pdEFuaW1hdGlvbigpIHsKKyAgICAgICAgaWYgKCFtSW5pdGlhbGl6ZWQpIHsKKyAgICAgICAgICAgIGludCBudW1WYWx1ZXMgPSBtVmFsdWVzLmxlbmd0aDsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtVmFsdWVzOyArK2kpIHsKKyAgICAgICAgICAgICAgICBtVmFsdWVzW2ldLmluaXQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1DdXJyZW50SXRlcmF0aW9uID0gMDsKKyAgICAgICAgICAgIG1Jbml0aWFsaXplZCA9IHRydWU7CisgICAgICAgIH0KKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIGxlbmd0aCBvZiB0aGUgYW5pbWF0aW9uLgorICAgICAqCisgICAgICogQHBhcmFtIGR1cmF0aW9uIFRoZSBsZW5ndGggb2YgdGhlIGFuaW1hdGlvbiwgaW4gbWlsbGlzZWNvbmRzLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldER1cmF0aW9uKGxvbmcgZHVyYXRpb24pIHsKKyAgICAgICAgbUR1cmF0aW9uID0gZHVyYXRpb247CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgbGVuZ3RoIG9mIHRoZSBhbmltYXRpb24uCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFRoZSBsZW5ndGggb2YgdGhlIGFuaW1hdGlvbiwgaW4gbWlsbGlzZWNvbmRzLgorICAgICAqLworICAgIHB1YmxpYyBsb25nIGdldER1cmF0aW9uKCkgeworICAgICAgICByZXR1cm4gbUR1cmF0aW9uOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIHBvc2l0aW9uIG9mIHRoZSBhbmltYXRpb24gdG8gdGhlIHNwZWNpZmllZCBwb2ludCBpbiB0aW1lLiBUaGlzIHRpbWUgc2hvdWxkCisgICAgICogYmUgYmV0d2VlbiAwIGFuZCB0aGUgdG90YWwgZHVyYXRpb24gb2YgdGhlIGFuaW1hdGlvbiwgaW5jbHVkaW5nIGFueSByZXBldGl0aW9uLiBJZgorICAgICAqIHRoZSBhbmltYXRpb24gaGFzIG5vdCB5ZXQgYmVlbiBzdGFydGVkLCB0aGVuIGl0IHdpbGwgbm90IGFkdmFuY2UgZm9yd2FyZCBhZnRlciBpdCBpcworICAgICAqIHNldCB0byB0aGlzIHRpbWU7IGl0IHdpbGwgc2ltcGx5IHNldCB0aGUgdGltZSB0byB0aGlzIHZhbHVlIGFuZCBwZXJmb3JtIGFueSBhcHByb3ByaWF0ZQorICAgICAqIGFjdGlvbnMgYmFzZWQgb24gdGhhdCB0aW1lLiBJZiB0aGUgYW5pbWF0aW9uIGlzIGFscmVhZHkgcnVubmluZywgdGhlbiBzZXRDdXJyZW50UGxheVRpbWUoKQorICAgICAqIHdpbGwgc2V0IHRoZSBjdXJyZW50IHBsYXlpbmcgdGltZSB0byB0aGlzIHZhbHVlIGFuZCBjb250aW51ZSBwbGF5aW5nIGZyb20gdGhhdCBwb2ludC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwbGF5VGltZSBUaGUgdGltZSwgaW4gbWlsbGlzZWNvbmRzLCB0byB3aGljaCB0aGUgYW5pbWF0aW9uIGlzIGFkdmFuY2VkIG9yIHJld291bmQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Q3VycmVudFBsYXlUaW1lKGxvbmcgcGxheVRpbWUpIHsKKyAgICAgICAgaW5pdEFuaW1hdGlvbigpOworICAgICAgICBsb25nIGN1cnJlbnRUaW1lID0gQW5pbWF0aW9uVXRpbHMuY3VycmVudEFuaW1hdGlvblRpbWVNaWxsaXMoKTsKKyAgICAgICAgaWYgKG1QbGF5aW5nU3RhdGUgIT0gUlVOTklORykgeworICAgICAgICAgICAgbVNlZWtUaW1lID0gcGxheVRpbWU7CisgICAgICAgICAgICBtUGxheWluZ1N0YXRlID0gU0VFS0VEOworICAgICAgICB9CisgICAgICAgIG1TdGFydFRpbWUgPSBjdXJyZW50VGltZSAtIHBsYXlUaW1lOworICAgICAgICBhbmltYXRpb25GcmFtZShjdXJyZW50VGltZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgY3VycmVudCBwb3NpdGlvbiBvZiB0aGUgYW5pbWF0aW9uIGluIHRpbWUsIHdoaWNoIGlzIGVxdWFsIHRvIHRoZSBjdXJyZW50CisgICAgICogdGltZSBtaW51cyB0aGUgdGltZSB0aGF0IHRoZSBhbmltYXRpb24gc3RhcnRlZC4gQW4gYW5pbWF0aW9uIHRoYXQgaXMgbm90IHlldCBzdGFydGVkIHdpbGwKKyAgICAgKiByZXR1cm4gYSB2YWx1ZSBvZiB6ZXJvLgorICAgICAqCisgICAgICogQHJldHVybiBUaGUgY3VycmVudCBwb3NpdGlvbiBpbiB0aW1lIG9mIHRoZSBhbmltYXRpb24uCisgICAgICovCisgICAgcHVibGljIGxvbmcgZ2V0Q3VycmVudFBsYXlUaW1lKCkgeworICAgICAgICBpZiAoIW1Jbml0aWFsaXplZCB8fCBtUGxheWluZ1N0YXRlID09IFNUT1BQRUQpIHsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgICAgIHJldHVybiBBbmltYXRpb25VdGlscy5jdXJyZW50QW5pbWF0aW9uVGltZU1pbGxpcygpIC0gbVN0YXJ0VGltZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGlzIGN1c3RvbSwgc3RhdGljIGhhbmRsZXIgaGFuZGxlcyB0aGUgdGltaW5nIHB1bHNlIHRoYXQgaXMgc2hhcmVkIGJ5CisgICAgICogYWxsIGFjdGl2ZSBhbmltYXRpb25zLiBUaGlzIGFwcHJvYWNoIGVuc3VyZXMgdGhhdCB0aGUgc2V0dGluZyBvZiBhbmltYXRpb24KKyAgICAgKiB2YWx1ZXMgd2lsbCBoYXBwZW4gb24gdGhlIFVJIHRocmVhZCBhbmQgdGhhdCBhbGwgYW5pbWF0aW9ucyB3aWxsIHNoYXJlCisgICAgICogdGhlIHNhbWUgdGltZXMgZm9yIGNhbGN1bGF0aW5nIHRoZWlyIHZhbHVlcywgd2hpY2ggbWFrZXMgc3luY2hyb25pemluZworICAgICAqIGFuaW1hdGlvbnMgcG9zc2libGUuCisgICAgICoKKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBBbmltYXRpb25IYW5kbGVyIGV4dGVuZHMgSGFuZGxlciB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGVyZSBhcmUgb25seSB0d28gbWVzc2FnZXMgdGhhdCB3ZSBjYXJlIGFib3V0OiBBTklNQVRJT05fU1RBUlQgYW5kCisgICAgICAgICAqIEFOSU1BVElPTl9GUkFNRS4gVGhlIFNUQVJUIG1lc3NhZ2UgaXMgc2VudCB3aGVuIGFuIGFuaW1hdGlvbidzIHN0YXJ0KCkKKyAgICAgICAgICogbWV0aG9kIGlzIGNhbGxlZC4gSXQgY2Fubm90IHN0YXJ0IHN5bmNocm9ub3VzbHkgd2hlbiBzdGFydCgpIGlzIGNhbGxlZAorICAgICAgICAgKiBiZWNhdXNlIHRoZSBjYWxsIG1heSBiZSBvbiB0aGUgd3JvbmcgdGhyZWFkLCBhbmQgaXQgd291bGQgYWxzbyBub3QgYmUKKyAgICAgICAgICogc3luY2hyb25pemVkIHdpdGggb3RoZXIgYW5pbWF0aW9ucyBiZWNhdXNlIGl0IHdvdWxkIG5vdCBzdGFydCBvbiBhIGNvbW1vbgorICAgICAgICAgKiB0aW1pbmcgcHVsc2UuIFNvIGVhY2ggYW5pbWF0aW9uIHNlbmRzIGEgU1RBUlQgbWVzc2FnZSB0byB0aGUgaGFuZGxlciwgd2hpY2gKKyAgICAgICAgICogY2F1c2VzIHRoZSBoYW5kbGVyIHRvIHBsYWNlIHRoZSBhbmltYXRpb24gb24gdGhlIGFjdGl2ZSBhbmltYXRpb25zIHF1ZXVlIGFuZAorICAgICAgICAgKiBzdGFydCBwcm9jZXNzaW5nIGZyYW1lcyBmb3IgdGhhdCBhbmltYXRpb24uCisgICAgICAgICAqIFRoZSBGUkFNRSBtZXNzYWdlIGlzIHRoZSBvbmUgdGhhdCBpcyBzZW50IG92ZXIgYW5kIG92ZXIgd2hpbGUgdGhlcmUgYXJlIGFueQorICAgICAgICAgKiBhY3RpdmUgYW5pbWF0aW9ucyB0byBwcm9jZXNzLgorICAgICAgICAgKi8KKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIGhhbmRsZU1lc3NhZ2UoTWVzc2FnZSBtc2cpIHsKKyAgICAgICAgICAgIGJvb2xlYW4gY2FsbEFnYWluID0gdHJ1ZTsKKyAgICAgICAgICAgIHN3aXRjaCAobXNnLndoYXQpIHsKKyAgICAgICAgICAgICAgICAvLyBUT0RPOiBzaG91bGQgd2UgYXZvaWQgc2VuZGluZyBmcmFtZSBtZXNzYWdlIHdoZW4gc3RhcnRpbmcgaWYgd2UKKyAgICAgICAgICAgICAgICAvLyB3ZXJlIGFscmVhZHkgcnVubmluZz8KKyAgICAgICAgICAgICAgICBjYXNlIEFOSU1BVElPTl9TVEFSVDoKKyAgICAgICAgICAgICAgICAgICAgaWYgKHNBbmltYXRpb25zLnNpemUoKSA+IDAgfHwgc0RlbGF5ZWRBbmltcy5zaXplKCkgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYWxsQWdhaW4gPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAvLyBwZW5kaW5nQW5pbXMgaG9sZHMgYW55IGFuaW1hdGlvbnMgdGhhdCBoYXZlIHJlcXVlc3RlZCB0byBiZSBzdGFydGVkCisgICAgICAgICAgICAgICAgICAgIC8vIFdlJ3JlIGdvaW5nIHRvIGNsZWFyIHNQZW5kaW5nQW5pbWF0aW9ucywgYnV0IHN0YXJ0aW5nIGFuaW1hdGlvbiBtYXkKKyAgICAgICAgICAgICAgICAgICAgLy8gY2F1c2UgbW9yZSB0byBiZSBhZGRlZCB0byB0aGUgcGVuZGluZyBsaXN0IChmb3IgZXhhbXBsZSwgaWYgb25lIGFuaW1hdGlvbgorICAgICAgICAgICAgICAgICAgICAvLyBzdGFydGluZyB0cmlnZ2VycyBhbm90aGVyIHN0YXJ0aW5nKS4gU28gd2UgbG9vcCB1bnRpbCBzUGVuZGluZ0FuaW1hdGlvbnMKKyAgICAgICAgICAgICAgICAgICAgLy8gaXMgZW1wdHkuCisgICAgICAgICAgICAgICAgICAgIHdoaWxlIChzUGVuZGluZ0FuaW1hdGlvbnMuc2l6ZSgpID4gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlMaXN0PFZhbHVlQW5pbWF0b3I+IHBlbmRpbmdDb3B5ID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEFycmF5TGlzdDxWYWx1ZUFuaW1hdG9yPikgc1BlbmRpbmdBbmltYXRpb25zLmNsb25lKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBzUGVuZGluZ0FuaW1hdGlvbnMuY2xlYXIoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBjb3VudCA9IHBlbmRpbmdDb3B5LnNpemUoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7ICsraSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlQW5pbWF0b3IgYW5pbSA9IHBlbmRpbmdDb3B5LmdldChpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJZiB0aGUgYW5pbWF0aW9uIGhhcyBhIHN0YXJ0RGVsYXksIHBsYWNlIGl0IG9uIHRoZSBkZWxheWVkIGxpc3QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYW5pbS5tU3RhcnREZWxheSA9PSAwIHx8IGFuaW0ubVBsYXlpbmdTdGF0ZSA9PSBFTkRFRCB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5pbS5tUGxheWluZ1N0YXRlID09IENBTkNFTEVEKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuaW0uc3RhcnRBbmltYXRpb24oKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzRGVsYXllZEFuaW1zLmFkZChhbmltKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgLy8gZmFsbCB0aHJvdWdoIHRvIHByb2Nlc3MgZmlyc3QgZnJhbWUgb2YgbmV3IGFuaW1hdGlvbnMKKyAgICAgICAgICAgICAgICBjYXNlIEFOSU1BVElPTl9GUkFNRToKKyAgICAgICAgICAgICAgICAgICAgLy8gY3VycmVudFRpbWUgaG9sZHMgdGhlIGNvbW1vbiB0aW1lIGZvciBhbGwgYW5pbWF0aW9ucyBwcm9jZXNzZWQKKyAgICAgICAgICAgICAgICAgICAgLy8gZHVyaW5nIHRoaXMgZnJhbWUKKyAgICAgICAgICAgICAgICAgICAgbG9uZyBjdXJyZW50VGltZSA9IEFuaW1hdGlvblV0aWxzLmN1cnJlbnRBbmltYXRpb25UaW1lTWlsbGlzKCk7CisKKyAgICAgICAgICAgICAgICAgICAgLy8gRmlyc3QsIHByb2Nlc3MgYW5pbWF0aW9ucyBjdXJyZW50bHkgc2l0dGluZyBvbiB0aGUgZGVsYXllZCBxdWV1ZSwgYWRkaW5nCisgICAgICAgICAgICAgICAgICAgIC8vIHRoZW0gdG8gdGhlIGFjdGl2ZSBhbmltYXRpb25zIGlmIHRoZXkgYXJlIHJlYWR5CisgICAgICAgICAgICAgICAgICAgIGludCBudW1EZWxheWVkQW5pbXMgPSBzRGVsYXllZEFuaW1zLnNpemUoKTsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1EZWxheWVkQW5pbXM7ICsraSkgeworICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWVBbmltYXRvciBhbmltID0gc0RlbGF5ZWRBbmltcy5nZXQoaSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYW5pbS5kZWxheWVkQW5pbWF0aW9uRnJhbWUoY3VycmVudFRpbWUpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc1JlYWR5QW5pbXMuYWRkKGFuaW0pOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGludCBudW1SZWFkeUFuaW1zID0gc1JlYWR5QW5pbXMuc2l6ZSgpOworICAgICAgICAgICAgICAgICAgICBpZiAobnVtUmVhZHlBbmltcyA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtUmVhZHlBbmltczsgKytpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWVBbmltYXRvciBhbmltID0gc1JlYWR5QW5pbXMuZ2V0KGkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuaW0uc3RhcnRBbmltYXRpb24oKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzRGVsYXllZEFuaW1zLnJlbW92ZShhbmltKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIHNSZWFkeUFuaW1zLmNsZWFyKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAvLyBOb3cgcHJvY2VzcyBhbGwgYWN0aXZlIGFuaW1hdGlvbnMuIFRoZSByZXR1cm4gdmFsdWUgZnJvbSBhbmltYXRpb25GcmFtZSgpCisgICAgICAgICAgICAgICAgICAgIC8vIHRlbGxzIHRoZSBoYW5kbGVyIHdoZXRoZXIgaXQgc2hvdWxkIG5vdyBiZSBlbmRlZAorICAgICAgICAgICAgICAgICAgICBpbnQgbnVtQW5pbXMgPSBzQW5pbWF0aW9ucy5zaXplKCk7CisgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtQW5pbXM7ICsraSkgeworICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWVBbmltYXRvciBhbmltID0gc0FuaW1hdGlvbnMuZ2V0KGkpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFuaW0uYW5pbWF0aW9uRnJhbWUoY3VycmVudFRpbWUpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc0VuZGluZ0FuaW1zLmFkZChhbmltKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAoc0VuZGluZ0FuaW1zLnNpemUoKSA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc0VuZGluZ0FuaW1zLnNpemUoKTsgKytpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc0VuZGluZ0FuaW1zLmdldChpKS5lbmRBbmltYXRpb24oKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIHNFbmRpbmdBbmltcy5jbGVhcigpOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgLy8gSWYgdGhlcmUgYXJlIHN0aWxsIGFjdGl2ZSBvciBkZWxheWVkIGFuaW1hdGlvbnMsIGNhbGwgdGhlIGhhbmRsZXIgYWdhaW4KKyAgICAgICAgICAgICAgICAgICAgLy8gYWZ0ZXIgdGhlIGZyYW1lRGVsYXkKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNhbGxBZ2FpbiAmJiAoIXNBbmltYXRpb25zLmlzRW1wdHkoKSB8fCAhc0RlbGF5ZWRBbmltcy5pc0VtcHR5KCkpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzZW5kRW1wdHlNZXNzYWdlRGVsYXllZChBTklNQVRJT05fRlJBTUUsIHNGcmFtZURlbGF5KTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSBhbW91bnQgb2YgdGltZSwgaW4gbWlsbGlzZWNvbmRzLCB0byBkZWxheSBzdGFydGluZyB0aGUgYW5pbWF0aW9uIGFmdGVyCisgICAgICoge0BsaW5rICNzdGFydCgpfSBpcyBjYWxsZWQuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIHRvIGRlbGF5IHJ1bm5pbmcgdGhlIGFuaW1hdGlvbgorICAgICAqLworICAgIHB1YmxpYyBsb25nIGdldFN0YXJ0RGVsYXkoKSB7CisgICAgICAgIHJldHVybiBtU3RhcnREZWxheTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgYW1vdW50IG9mIHRpbWUsIGluIG1pbGxpc2Vjb25kcywgdG8gZGVsYXkgc3RhcnRpbmcgdGhlIGFuaW1hdGlvbiBhZnRlcgorICAgICAqIHtAbGluayAjc3RhcnQoKX0gaXMgY2FsbGVkLgorCisgICAgICogQHBhcmFtIHN0YXJ0RGVsYXkgVGhlIGFtb3VudCBvZiB0aGUgZGVsYXksIGluIG1pbGxpc2Vjb25kcworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFN0YXJ0RGVsYXkobG9uZyBzdGFydERlbGF5KSB7CisgICAgICAgIHRoaXMubVN0YXJ0RGVsYXkgPSBzdGFydERlbGF5OworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSBhbW91bnQgb2YgdGltZSwgaW4gbWlsbGlzZWNvbmRzLCBiZXR3ZWVuIGVhY2ggZnJhbWUgb2YgdGhlIGFuaW1hdGlvbi4gVGhpcyBpcyBhCisgICAgICogcmVxdWVzdGVkIHRpbWUgdGhhdCB0aGUgYW5pbWF0aW9uIHdpbGwgYXR0ZW1wdCB0byBob25vciwgYnV0IHRoZSBhY3R1YWwgZGVsYXkgYmV0d2VlbgorICAgICAqIGZyYW1lcyBtYXkgYmUgZGlmZmVyZW50LCBkZXBlbmRpbmcgb24gc3lzdGVtIGxvYWQgYW5kIGNhcGFiaWxpdGllcy4gVGhpcyBpcyBhIHN0YXRpYworICAgICAqIGZ1bmN0aW9uIGJlY2F1c2UgdGhlIHNhbWUgZGVsYXkgd2lsbCBiZSBhcHBsaWVkIHRvIGFsbCBhbmltYXRpb25zLCBzaW5jZSB0aGV5IGFyZSBhbGwKKyAgICAgKiBydW4gb2ZmIG9mIGEgc2luZ2xlIHRpbWluZyBsb29wLgorICAgICAqCisgICAgICogQHJldHVybiB0aGUgcmVxdWVzdGVkIHRpbWUgYmV0d2VlbiBmcmFtZXMsIGluIG1pbGxpc2Vjb25kcworICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgbG9uZyBnZXRGcmFtZURlbGF5KCkgeworICAgICAgICByZXR1cm4gc0ZyYW1lRGVsYXk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIGFtb3VudCBvZiB0aW1lLCBpbiBtaWxsaXNlY29uZHMsIGJldHdlZW4gZWFjaCBmcmFtZSBvZiB0aGUgYW5pbWF0aW9uLiBUaGlzIGlzIGEKKyAgICAgKiByZXF1ZXN0ZWQgdGltZSB0aGF0IHRoZSBhbmltYXRpb24gd2lsbCBhdHRlbXB0IHRvIGhvbm9yLCBidXQgdGhlIGFjdHVhbCBkZWxheSBiZXR3ZWVuCisgICAgICogZnJhbWVzIG1heSBiZSBkaWZmZXJlbnQsIGRlcGVuZGluZyBvbiBzeXN0ZW0gbG9hZCBhbmQgY2FwYWJpbGl0aWVzLiBUaGlzIGlzIGEgc3RhdGljCisgICAgICogZnVuY3Rpb24gYmVjYXVzZSB0aGUgc2FtZSBkZWxheSB3aWxsIGJlIGFwcGxpZWQgdG8gYWxsIGFuaW1hdGlvbnMsIHNpbmNlIHRoZXkgYXJlIGFsbAorICAgICAqIHJ1biBvZmYgb2YgYSBzaW5nbGUgdGltaW5nIGxvb3AuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZnJhbWVEZWxheSB0aGUgcmVxdWVzdGVkIHRpbWUgYmV0d2VlbiBmcmFtZXMsIGluIG1pbGxpc2Vjb25kcworICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXRGcmFtZURlbGF5KGxvbmcgZnJhbWVEZWxheSkgeworICAgICAgICBzRnJhbWVEZWxheSA9IGZyYW1lRGVsYXk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIG1vc3QgcmVjZW50IHZhbHVlIGNhbGN1bGF0ZWQgYnkgdGhpcyA8Y29kZT5WYWx1ZUFuaW1hdG9yPC9jb2RlPiB3aGVuIHRoZXJlIGlzIGp1c3Qgb25lCisgICAgICogcHJvcGVydHkgYmVpbmcgYW5pbWF0ZWQuIFRoaXMgdmFsdWUgaXMgb25seSBzZW5zaWJsZSB3aGlsZSB0aGUgYW5pbWF0aW9uIGlzIHJ1bm5pbmcuIFRoZSBtYWluCisgICAgICogcHVycG9zZSBmb3IgdGhpcyByZWFkLW9ubHkgcHJvcGVydHkgaXMgdG8gcmV0cmlldmUgdGhlIHZhbHVlIGZyb20gdGhlIDxjb2RlPlZhbHVlQW5pbWF0b3I8L2NvZGU+CisgICAgICogZHVyaW5nIGEgY2FsbCB0byB7QGxpbmsgQW5pbWF0b3JVcGRhdGVMaXN0ZW5lciNvbkFuaW1hdGlvblVwZGF0ZShWYWx1ZUFuaW1hdG9yKX0sIHdoaWNoCisgICAgICogaXMgY2FsbGVkIGR1cmluZyBlYWNoIGFuaW1hdGlvbiBmcmFtZSwgaW1tZWRpYXRlbHkgYWZ0ZXIgdGhlIHZhbHVlIGlzIGNhbGN1bGF0ZWQuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIGFuaW1hdGVkVmFsdWUgVGhlIHZhbHVlIG1vc3QgcmVjZW50bHkgY2FsY3VsYXRlZCBieSB0aGlzIDxjb2RlPlZhbHVlQW5pbWF0b3I8L2NvZGU+IGZvcgorICAgICAqIHRoZSBzaW5nbGUgcHJvcGVydHkgYmVpbmcgYW5pbWF0ZWQuIElmIHRoZXJlIGFyZSBzZXZlcmFsIHByb3BlcnRpZXMgYmVpbmcgYW5pbWF0ZWQKKyAgICAgKiAoc3BlY2lmaWVkIGJ5IHNldmVyYWwgUHJvcGVydHlWYWx1ZXNIb2xkZXIgb2JqZWN0cyBpbiB0aGUgY29uc3RydWN0b3IpLCB0aGlzIGZ1bmN0aW9uCisgICAgICogcmV0dXJucyB0aGUgYW5pbWF0ZWQgdmFsdWUgZm9yIHRoZSBmaXJzdCBvZiB0aG9zZSBvYmplY3RzLgorICAgICAqLworICAgIHB1YmxpYyBPYmplY3QgZ2V0QW5pbWF0ZWRWYWx1ZSgpIHsKKyAgICAgICAgaWYgKG1WYWx1ZXMgIT0gbnVsbCAmJiBtVmFsdWVzLmxlbmd0aCA+IDApIHsKKyAgICAgICAgICAgIHJldHVybiBtVmFsdWVzWzBdLmdldEFuaW1hdGVkVmFsdWUoKTsKKyAgICAgICAgfQorICAgICAgICAvLyBTaG91bGRuJ3QgZ2V0IGhlcmU7IHNob3VsZCBhbHdheXMgaGF2ZSB2YWx1ZXMgdW5sZXNzIFZhbHVlQW5pbWF0b3Igd2FzIHNldCB1cCB3cm9uZworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgbW9zdCByZWNlbnQgdmFsdWUgY2FsY3VsYXRlZCBieSB0aGlzIDxjb2RlPlZhbHVlQW5pbWF0b3I8L2NvZGU+IGZvciA8Y29kZT5wcm9wZXJ0eU5hbWU8L2NvZGU+LgorICAgICAqIFRoZSBtYWluIHB1cnBvc2UgZm9yIHRoaXMgcmVhZC1vbmx5IHByb3BlcnR5IGlzIHRvIHJldHJpZXZlIHRoZSB2YWx1ZSBmcm9tIHRoZQorICAgICAqIDxjb2RlPlZhbHVlQW5pbWF0b3I8L2NvZGU+IGR1cmluZyBhIGNhbGwgdG8KKyAgICAgKiB7QGxpbmsgQW5pbWF0b3JVcGRhdGVMaXN0ZW5lciNvbkFuaW1hdGlvblVwZGF0ZShWYWx1ZUFuaW1hdG9yKX0sIHdoaWNoCisgICAgICogaXMgY2FsbGVkIGR1cmluZyBlYWNoIGFuaW1hdGlvbiBmcmFtZSwgaW1tZWRpYXRlbHkgYWZ0ZXIgdGhlIHZhbHVlIGlzIGNhbGN1bGF0ZWQuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIGFuaW1hdGVkVmFsdWUgVGhlIHZhbHVlIG1vc3QgcmVjZW50bHkgY2FsY3VsYXRlZCBmb3IgdGhlIG5hbWVkIHByb3BlcnR5CisgICAgICogYnkgdGhpcyA8Y29kZT5WYWx1ZUFuaW1hdG9yPC9jb2RlPi4KKyAgICAgKi8KKyAgICBwdWJsaWMgT2JqZWN0IGdldEFuaW1hdGVkVmFsdWUoU3RyaW5nIHByb3BlcnR5TmFtZSkgeworICAgICAgICBQcm9wZXJ0eVZhbHVlc0hvbGRlciB2YWx1ZXNIb2xkZXIgPSBtVmFsdWVzTWFwLmdldChwcm9wZXJ0eU5hbWUpOworICAgICAgICBpZiAodmFsdWVzSG9sZGVyICE9IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiB2YWx1ZXNIb2xkZXIuZ2V0QW5pbWF0ZWRWYWx1ZSgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gQXQgbGVhc3QgYXZvaWQgY3Jhc2hpbmcgaWYgY2FsbGVkIHdpdGggYm9ndXMgcHJvcGVydHlOYW1lCisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgaG93IG1hbnkgdGltZXMgdGhlIGFuaW1hdGlvbiBzaG91bGQgYmUgcmVwZWF0ZWQuIElmIHRoZSByZXBlYXQKKyAgICAgKiBjb3VudCBpcyAwLCB0aGUgYW5pbWF0aW9uIGlzIG5ldmVyIHJlcGVhdGVkLiBJZiB0aGUgcmVwZWF0IGNvdW50IGlzCisgICAgICogZ3JlYXRlciB0aGFuIDAgb3Ige0BsaW5rICNJTkZJTklURX0sIHRoZSByZXBlYXQgbW9kZSB3aWxsIGJlIHRha2VuCisgICAgICogaW50byBhY2NvdW50LiBUaGUgcmVwZWF0IGNvdW50IGlzIDAgYnkgZGVmYXVsdC4KKyAgICAgKgorICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgbnVtYmVyIG9mIHRpbWVzIHRoZSBhbmltYXRpb24gc2hvdWxkIGJlIHJlcGVhdGVkCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UmVwZWF0Q291bnQoaW50IHZhbHVlKSB7CisgICAgICAgIG1SZXBlYXRDb3VudCA9IHZhbHVlOworICAgIH0KKyAgICAvKioKKyAgICAgKiBEZWZpbmVzIGhvdyBtYW55IHRpbWVzIHRoZSBhbmltYXRpb24gc2hvdWxkIHJlcGVhdC4gVGhlIGRlZmF1bHQgdmFsdWUKKyAgICAgKiBpcyAwLgorICAgICAqCisgICAgICogQHJldHVybiB0aGUgbnVtYmVyIG9mIHRpbWVzIHRoZSBhbmltYXRpb24gc2hvdWxkIHJlcGVhdCwgb3Ige0BsaW5rICNJTkZJTklURX0KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldFJlcGVhdENvdW50KCkgeworICAgICAgICByZXR1cm4gbVJlcGVhdENvdW50OworICAgIH0KKworICAgIC8qKgorICAgICAqIERlZmluZXMgd2hhdCB0aGlzIGFuaW1hdGlvbiBzaG91bGQgZG8gd2hlbiBpdCByZWFjaGVzIHRoZSBlbmQuIFRoaXMKKyAgICAgKiBzZXR0aW5nIGlzIGFwcGxpZWQgb25seSB3aGVuIHRoZSByZXBlYXQgY291bnQgaXMgZWl0aGVyIGdyZWF0ZXIgdGhhbgorICAgICAqIDAgb3Ige0BsaW5rICNJTkZJTklURX0uIERlZmF1bHRzIHRvIHtAbGluayAjUkVTVEFSVH0uCisgICAgICoKKyAgICAgKiBAcGFyYW0gdmFsdWUge0BsaW5rICNSRVNUQVJUfSBvciB7QGxpbmsgI1JFVkVSU0V9CisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UmVwZWF0TW9kZShpbnQgdmFsdWUpIHsKKyAgICAgICAgbVJlcGVhdE1vZGUgPSB2YWx1ZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBEZWZpbmVzIHdoYXQgdGhpcyBhbmltYXRpb24gc2hvdWxkIGRvIHdoZW4gaXQgcmVhY2hlcyB0aGUgZW5kLgorICAgICAqCisgICAgICogQHJldHVybiBlaXRoZXIgb25lIG9mIHtAbGluayAjUkVWRVJTRX0gb3Ige0BsaW5rICNSRVNUQVJUfQorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0UmVwZWF0TW9kZSgpIHsKKyAgICAgICAgcmV0dXJuIG1SZXBlYXRNb2RlOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZHMgYSBsaXN0ZW5lciB0byB0aGUgc2V0IG9mIGxpc3RlbmVycyB0aGF0IGFyZSBzZW50IHVwZGF0ZSBldmVudHMgdGhyb3VnaCB0aGUgbGlmZSBvZgorICAgICAqIGFuIGFuaW1hdGlvbi4gVGhpcyBtZXRob2QgaXMgY2FsbGVkIG9uIGFsbCBsaXN0ZW5lcnMgZm9yIGV2ZXJ5IGZyYW1lIG9mIHRoZSBhbmltYXRpb24sCisgICAgICogYWZ0ZXIgdGhlIHZhbHVlcyBmb3IgdGhlIGFuaW1hdGlvbiBoYXZlIGJlZW4gY2FsY3VsYXRlZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBsaXN0ZW5lciB0aGUgbGlzdGVuZXIgdG8gYmUgYWRkZWQgdG8gdGhlIGN1cnJlbnQgc2V0IG9mIGxpc3RlbmVycyBmb3IgdGhpcyBhbmltYXRpb24uCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkVXBkYXRlTGlzdGVuZXIoQW5pbWF0b3JVcGRhdGVMaXN0ZW5lciBsaXN0ZW5lcikgeworICAgICAgICBpZiAobVVwZGF0ZUxpc3RlbmVycyA9PSBudWxsKSB7CisgICAgICAgICAgICBtVXBkYXRlTGlzdGVuZXJzID0gbmV3IEFycmF5TGlzdDxBbmltYXRvclVwZGF0ZUxpc3RlbmVyPigpOworICAgICAgICB9CisgICAgICAgIG1VcGRhdGVMaXN0ZW5lcnMuYWRkKGxpc3RlbmVyKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZW1vdmVzIGEgbGlzdGVuZXIgZnJvbSB0aGUgc2V0IGxpc3RlbmluZyB0byBmcmFtZSB1cGRhdGVzIGZvciB0aGlzIGFuaW1hdGlvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBsaXN0ZW5lciB0aGUgbGlzdGVuZXIgdG8gYmUgcmVtb3ZlZCBmcm9tIHRoZSBjdXJyZW50IHNldCBvZiB1cGRhdGUgbGlzdGVuZXJzCisgICAgICogZm9yIHRoaXMgYW5pbWF0aW9uLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJlbW92ZVVwZGF0ZUxpc3RlbmVyKEFuaW1hdG9yVXBkYXRlTGlzdGVuZXIgbGlzdGVuZXIpIHsKKyAgICAgICAgaWYgKG1VcGRhdGVMaXN0ZW5lcnMgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIG1VcGRhdGVMaXN0ZW5lcnMucmVtb3ZlKGxpc3RlbmVyKTsKKyAgICAgICAgaWYgKG1VcGRhdGVMaXN0ZW5lcnMuc2l6ZSgpID09IDApIHsKKyAgICAgICAgICAgIG1VcGRhdGVMaXN0ZW5lcnMgPSBudWxsOworICAgICAgICB9CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBUaGUgdGltZSBpbnRlcnBvbGF0b3IgdXNlZCBpbiBjYWxjdWxhdGluZyB0aGUgZWxhcHNlZCBmcmFjdGlvbiBvZiB0aGlzIGFuaW1hdGlvbi4gVGhlCisgICAgICogaW50ZXJwb2xhdG9yIGRldGVybWluZXMgd2hldGhlciB0aGUgYW5pbWF0aW9uIHJ1bnMgd2l0aCBsaW5lYXIgb3Igbm9uLWxpbmVhciBtb3Rpb24sCisgICAgICogc3VjaCBhcyBhY2NlbGVyYXRpb24gYW5kIGRlY2VsZXJhdGlvbi4gVGhlIGRlZmF1bHQgdmFsdWUgaXMKKyAgICAgKiB7QGxpbmsgYW5kcm9pZC52aWV3LmFuaW1hdGlvbi5BY2NlbGVyYXRlRGVjZWxlcmF0ZUludGVycG9sYXRvcn0KKyAgICAgKgorICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgaW50ZXJwb2xhdG9yIHRvIGJlIHVzZWQgYnkgdGhpcyBhbmltYXRpb24KKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBzZXRJbnRlcnBvbGF0b3IoSW50ZXJwb2xhdG9yIHZhbHVlKSB7CisgICAgICAgIGlmICh2YWx1ZSAhPSBudWxsKSB7CisgICAgICAgICAgICBtSW50ZXJwb2xhdG9yID0gdmFsdWU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSB0aW1pbmcgaW50ZXJwb2xhdG9yIHRoYXQgdGhpcyBWYWx1ZUFuaW1hdG9yIHVzZXMuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFRoZSB0aW1pbmcgaW50ZXJwb2xhdG9yIGZvciB0aGlzIFZhbHVlQW5pbWF0b3IuCisgICAgICovCisgICAgcHVibGljIEludGVycG9sYXRvciBnZXRJbnRlcnBvbGF0b3IoKSB7CisgICAgICAgIHJldHVybiBtSW50ZXJwb2xhdG9yOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSB0eXBlIGV2YWx1YXRvciB0byBiZSB1c2VkIHdoZW4gY2FsY3VsYXRpbmcgdGhlIGFuaW1hdGVkIHZhbHVlcyBvZiB0aGlzIGFuaW1hdGlvbi4KKyAgICAgKiBUaGUgc3lzdGVtIHdpbGwgYXV0b21hdGljYWxseSBhc3NpZ24gYSBmbG9hdCwgaW50LCBvciBkb3VibGUgZXZhbHVhdG9yIGJhc2VkIG9uIHRoZSB0eXBlCisgICAgICogb2YgPGNvZGU+c3RhcnRWYWx1ZTwvY29kZT4gYW5kIDxjb2RlPmVuZFZhbHVlPC9jb2RlPiBpbiB0aGUgY29uc3RydWN0b3IuIEJ1dCBpZiB0aGVzZSB2YWx1ZXMKKyAgICAgKiBhcmUgbm90IG9uZSBvZiB0aGVzZSBwcmltaXRpdmUgdHlwZXMsIG9yIGlmIGRpZmZlcmVudCBldmFsdWF0aW9uIGlzIGRlc2lyZWQgKHN1Y2ggYXMgaXMKKyAgICAgKiBuZWNlc3Nhcnkgd2l0aCBpbnQgdmFsdWVzIHRoYXQgcmVwcmVzZW50IGNvbG9ycyksIGEgY3VzdG9tIGV2YWx1YXRvciBuZWVkcyB0byBiZSBhc3NpZ25lZC4KKyAgICAgKiBGb3IgZXhhbXBsZSwgd2hlbiBydW5uaW5nIGFuIGFuaW1hdGlvbiBvbiBjb2xvciB2YWx1ZXMsIHRoZSB7QGxpbmsgUkdCRXZhbHVhdG9yfQorICAgICAqIHNob3VsZCBiZSB1c2VkIHRvIGdldCBjb3JyZWN0IFJHQiBjb2xvciBpbnRlcnBvbGF0aW9uLgorICAgICAqCisgICAgICogPHA+SWYgdGhpcyBWYWx1ZUFuaW1hdG9yIGhhcyBvbmx5IG9uZSBzZXQgb2YgdmFsdWVzIGJlaW5nIGFuaW1hdGVkIGJldHdlZW4sIHRoaXMgZXZhbHVhdG9yCisgICAgICogd2lsbCBiZSB1c2VkIGZvciB0aGF0IHNldC4gSWYgdGhlcmUgYXJlIHNldmVyYWwgc2V0cyBvZiB2YWx1ZXMgYmVpbmcgYW5pbWF0ZWQsIHdoaWNoIGlzCisgICAgICogdGhlIGNhc2UgaWYgUHJvcGVydHlWYWx1ZXNIT2xkZXIgb2JqZWN0cyB3ZXJlIHNldCBvbiB0aGUgVmFsdWVBbmltYXRvciwgdGhlbiB0aGUgZXZhbHVhdG9yCisgICAgICogaXMgYXNzaWduZWQganVzdCB0byB0aGUgZmlyc3QgUHJvcGVydHlWYWx1ZXNIb2xkZXIgb2JqZWN0LjwvcD4KKyAgICAgKgorICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgZXZhbHVhdG9yIHRvIGJlIHVzZWQgdGhpcyBhbmltYXRpb24KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRFdmFsdWF0b3IoVHlwZUV2YWx1YXRvciB2YWx1ZSkgeworICAgICAgICBpZiAodmFsdWUgIT0gbnVsbCAmJiBtVmFsdWVzICE9IG51bGwgJiYgbVZhbHVlcy5sZW5ndGggPiAwKSB7CisgICAgICAgICAgICBtVmFsdWVzWzBdLnNldEV2YWx1YXRvcih2YWx1ZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTdGFydCB0aGUgYW5pbWF0aW9uIHBsYXlpbmcuIFRoaXMgdmVyc2lvbiBvZiBzdGFydCgpIHRha2VzIGEgYm9vbGVhbiBmbGFnIHRoYXQgaW5kaWNhdGVzCisgICAgICogd2hldGhlciB0aGUgYW5pbWF0aW9uIHNob3VsZCBwbGF5IGluIHJldmVyc2UuIFRoZSBmbGFnIGlzIHVzdWFsbHkgZmFsc2UsIGJ1dCBtYXkgYmUgc2V0CisgICAgICogdG8gdHJ1ZSBpZiBjYWxsZWQgZnJvbSB0aGUgcmV2ZXJzZSgpIG1ldGhvZC8KKyAgICAgKgorICAgICAqIEBwYXJhbSBwbGF5QmFja3dhcmRzIFdoZXRoZXIgdGhlIFZhbHVlQW5pbWF0b3Igc2hvdWxkIHN0YXJ0IHBsYXlpbmcgaW4gcmV2ZXJzZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgc3RhcnQoYm9vbGVhbiBwbGF5QmFja3dhcmRzKSB7CisgICAgICAgIG1QbGF5aW5nQmFja3dhcmRzID0gcGxheUJhY2t3YXJkczsKKyAgICAgICAgaWYgKChtU3RhcnREZWxheSA9PSAwKSAmJiAoVGhyZWFkLmN1cnJlbnRUaHJlYWQoKSA9PSBMb29wZXIuZ2V0TWFpbkxvb3BlcigpLmdldFRocmVhZCgpKSkgeworICAgICAgICAgICAgaWYgKG1MaXN0ZW5lcnMgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIEFycmF5TGlzdDxBbmltYXRvckxpc3RlbmVyPiB0bXBMaXN0ZW5lcnMgPQorICAgICAgICAgICAgICAgICAgICAgICAgKEFycmF5TGlzdDxBbmltYXRvckxpc3RlbmVyPikgbUxpc3RlbmVycy5jbG9uZSgpOworICAgICAgICAgICAgICAgIGZvciAoQW5pbWF0b3JMaXN0ZW5lciBsaXN0ZW5lciA6IHRtcExpc3RlbmVycykgeworICAgICAgICAgICAgICAgICAgICBsaXN0ZW5lci5vbkFuaW1hdGlvblN0YXJ0KHRoaXMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIFRoaXMgc2V0cyB0aGUgaW5pdGlhbCB2YWx1ZSBvZiB0aGUgYW5pbWF0aW9uLCBwcmlvciB0byBhY3R1YWxseSBzdGFydGluZyBpdCBydW5uaW5nCisgICAgICAgICAgICBzZXRDdXJyZW50UGxheVRpbWUoZ2V0Q3VycmVudFBsYXlUaW1lKCkpOworICAgICAgICB9CisgICAgICAgIG1QbGF5aW5nU3RhdGUgPSBTVE9QUEVEOworICAgICAgICBtU3RhcnRlZERlbGF5ID0gZmFsc2U7CisgICAgICAgIHNQZW5kaW5nQW5pbWF0aW9ucy5hZGQodGhpcyk7CisgICAgICAgIGlmIChzQW5pbWF0aW9uSGFuZGxlciA9PSBudWxsKSB7CisgICAgICAgICAgICBzQW5pbWF0aW9uSGFuZGxlciA9IG5ldyBBbmltYXRpb25IYW5kbGVyKCk7CisgICAgICAgIH0KKyAgICAgICAgLy8gVE9ETzogZG9lcyB0aGlzIHB1dCB0b28gbWFueSBtZXNzYWdlcyBvbiB0aGUgcXVldWUgaWYgdGhlIGhhbmRsZXIKKyAgICAgICAgLy8gaXMgYWxyZWFkeSBydW5uaW5nPworICAgICAgICBzQW5pbWF0aW9uSGFuZGxlci5zZW5kRW1wdHlNZXNzYWdlKEFOSU1BVElPTl9TVEFSVCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgc3RhcnQoKSB7CisgICAgICAgIHN0YXJ0KGZhbHNlKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBjYW5jZWwoKSB7CisgICAgICAgIGlmIChtTGlzdGVuZXJzICE9IG51bGwpIHsKKyAgICAgICAgICAgIEFycmF5TGlzdDxBbmltYXRvckxpc3RlbmVyPiB0bXBMaXN0ZW5lcnMgPQorICAgICAgICAgICAgICAgICAgICAoQXJyYXlMaXN0PEFuaW1hdG9yTGlzdGVuZXI+KSBtTGlzdGVuZXJzLmNsb25lKCk7CisgICAgICAgICAgICBmb3IgKEFuaW1hdG9yTGlzdGVuZXIgbGlzdGVuZXIgOiB0bXBMaXN0ZW5lcnMpIHsKKyAgICAgICAgICAgICAgICBsaXN0ZW5lci5vbkFuaW1hdGlvbkNhbmNlbCh0aGlzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvLyBKdXN0IHNldCB0aGUgQ0FOQ0VMRUQgZmxhZyAtIHRoaXMgY2F1c2VzIHRoZSBhbmltYXRpb24gdG8gZW5kIHRoZSBuZXh0IHRpbWUgYSBmcmFtZQorICAgICAgICAvLyBpcyBwcm9jZXNzZWQuCisgICAgICAgIG1QbGF5aW5nU3RhdGUgPSBDQU5DRUxFRDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBlbmQoKSB7CisgICAgICAgIGlmICghc0FuaW1hdGlvbnMuY29udGFpbnModGhpcykgJiYgIXNQZW5kaW5nQW5pbWF0aW9ucy5jb250YWlucyh0aGlzKSkgeworICAgICAgICAgICAgLy8gU3BlY2lhbCBjYXNlIGlmIHRoZSBhbmltYXRpb24gaGFzIG5vdCB5ZXQgc3RhcnRlZDsgZ2V0IGl0IHJlYWR5IGZvciBlbmRpbmcKKyAgICAgICAgICAgIG1TdGFydGVkRGVsYXkgPSBmYWxzZTsKKyAgICAgICAgICAgIHNQZW5kaW5nQW5pbWF0aW9ucy5hZGQodGhpcyk7CisgICAgICAgICAgICBpZiAoc0FuaW1hdGlvbkhhbmRsZXIgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHNBbmltYXRpb25IYW5kbGVyID0gbmV3IEFuaW1hdGlvbkhhbmRsZXIoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNBbmltYXRpb25IYW5kbGVyLnNlbmRFbXB0eU1lc3NhZ2UoQU5JTUFUSU9OX1NUQVJUKTsKKyAgICAgICAgfQorICAgICAgICAvLyBKdXN0IHNldCB0aGUgRU5ERUQgZmxhZyAtIHRoaXMgY2F1c2VzIHRoZSBhbmltYXRpb24gdG8gZW5kIHRoZSBuZXh0IHRpbWUgYSBmcmFtZQorICAgICAgICAvLyBpcyBwcm9jZXNzZWQuCisgICAgICAgIG1QbGF5aW5nU3RhdGUgPSBFTkRFRDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBpc1J1bm5pbmcoKSB7CisgICAgICAgIC8vIEVOREVEIG9yIENBTkNFTEVEIGluZGljYXRlIHRoYXQgaXQgaGFzIGJlZW4gZW5kZWQgb3IgY2FuY2VsZWQsIGJ1dCBub3QgcHJvY2Vzc2VkIHlldAorICAgICAgICByZXR1cm4gKG1QbGF5aW5nU3RhdGUgPT0gUlVOTklORyB8fCBtUGxheWluZ1N0YXRlID09IEVOREVEIHx8IG1QbGF5aW5nU3RhdGUgPT0gQ0FOQ0VMRUQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFBsYXlzIHRoZSBWYWx1ZUFuaW1hdG9yIGluIHJldmVyc2UuIElmIHRoZSBhbmltYXRpb24gaXMgYWxyZWFkeSBydW5uaW5nLAorICAgICAqIGl0IHdpbGwgc3RvcCBpdHNlbGYgYW5kIHBsYXkgYmFja3dhcmRzIGZyb20gdGhlIHBvaW50IHJlYWNoZWQgd2hlbiByZXZlcnNlIHdhcyBjYWxsZWQuCisgICAgICogSWYgdGhlIGFuaW1hdGlvbiBpcyBub3QgY3VycmVudGx5IHJ1bm5pbmcsIHRoZW4gaXQgd2lsbCBzdGFydCBmcm9tIHRoZSBlbmQgYW5kCisgICAgICogcGxheSBiYWNrd2FyZHMuIFRoaXMgYmVoYXZpb3IgaXMgb25seSBzZXQgZm9yIHRoZSBjdXJyZW50IGFuaW1hdGlvbjsgZnV0dXJlIHBsYXlpbmcKKyAgICAgKiBvZiB0aGUgYW5pbWF0aW9uIHdpbGwgdXNlIHRoZSBkZWZhdWx0IGJlaGF2aW9yIG9mIHBsYXlpbmcgZm9yd2FyZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZXZlcnNlKCkgeworICAgICAgICBtUGxheWluZ0JhY2t3YXJkcyA9ICFtUGxheWluZ0JhY2t3YXJkczsKKyAgICAgICAgaWYgKG1QbGF5aW5nU3RhdGUgPT0gUlVOTklORykgeworICAgICAgICAgICAgbG9uZyBjdXJyZW50VGltZSA9IEFuaW1hdGlvblV0aWxzLmN1cnJlbnRBbmltYXRpb25UaW1lTWlsbGlzKCk7CisgICAgICAgICAgICBsb25nIGN1cnJlbnRQbGF5VGltZSA9IGN1cnJlbnRUaW1lIC0gbVN0YXJ0VGltZTsKKyAgICAgICAgICAgIGxvbmcgdGltZUxlZnQgPSBtRHVyYXRpb24gLSBjdXJyZW50UGxheVRpbWU7CisgICAgICAgICAgICBtU3RhcnRUaW1lID0gY3VycmVudFRpbWUgLSB0aW1lTGVmdDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHN0YXJ0KHRydWUpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2FsbGVkIGludGVybmFsbHkgdG8gZW5kIGFuIGFuaW1hdGlvbiBieSByZW1vdmluZyBpdCBmcm9tIHRoZSBhbmltYXRpb25zIGxpc3QuIE11c3QgYmUKKyAgICAgKiBjYWxsZWQgb24gdGhlIFVJIHRocmVhZC4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgZW5kQW5pbWF0aW9uKCkgeworICAgICAgICBzQW5pbWF0aW9ucy5yZW1vdmUodGhpcyk7CisgICAgICAgIG1QbGF5aW5nU3RhdGUgPSBTVE9QUEVEOworICAgICAgICBpZiAobUxpc3RlbmVycyAhPSBudWxsKSB7CisgICAgICAgICAgICBBcnJheUxpc3Q8QW5pbWF0b3JMaXN0ZW5lcj4gdG1wTGlzdGVuZXJzID0KKyAgICAgICAgICAgICAgICAgICAgKEFycmF5TGlzdDxBbmltYXRvckxpc3RlbmVyPikgbUxpc3RlbmVycy5jbG9uZSgpOworICAgICAgICAgICAgZm9yIChBbmltYXRvckxpc3RlbmVyIGxpc3RlbmVyIDogdG1wTGlzdGVuZXJzKSB7CisgICAgICAgICAgICAgICAgbGlzdGVuZXIub25BbmltYXRpb25FbmQodGhpcyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDYWxsZWQgaW50ZXJuYWxseSB0byBzdGFydCBhbiBhbmltYXRpb24gYnkgYWRkaW5nIGl0IHRvIHRoZSBhY3RpdmUgYW5pbWF0aW9ucyBsaXN0LiBNdXN0IGJlCisgICAgICogY2FsbGVkIG9uIHRoZSBVSSB0aHJlYWQuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIHN0YXJ0QW5pbWF0aW9uKCkgeworICAgICAgICBpbml0QW5pbWF0aW9uKCk7CisgICAgICAgIHNBbmltYXRpb25zLmFkZCh0aGlzKTsKKyAgICAgICAgaWYgKG1TdGFydERlbGF5ID4gMCAmJiBtTGlzdGVuZXJzICE9IG51bGwpIHsKKyAgICAgICAgICAgIC8vIExpc3RlbmVycyB3ZXJlIGFscmVhZHkgbm90aWZpZWQgaW4gc3RhcnQoKSBpZiBzdGFydERlbGF5IGlzIDA7IHRoaXMgaXMKKyAgICAgICAgICAgIC8vIGp1c3QgZm9yIGRlbGF5ZWQgYW5pbWF0aW9ucworICAgICAgICAgICAgQXJyYXlMaXN0PEFuaW1hdG9yTGlzdGVuZXI+IHRtcExpc3RlbmVycyA9CisgICAgICAgICAgICAgICAgICAgIChBcnJheUxpc3Q8QW5pbWF0b3JMaXN0ZW5lcj4pIG1MaXN0ZW5lcnMuY2xvbmUoKTsKKyAgICAgICAgICAgIGZvciAoQW5pbWF0b3JMaXN0ZW5lciBsaXN0ZW5lciA6IHRtcExpc3RlbmVycykgeworICAgICAgICAgICAgICAgIGxpc3RlbmVyLm9uQW5pbWF0aW9uU3RhcnQodGhpcyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJbnRlcm5hbCBmdW5jdGlvbiBjYWxsZWQgdG8gcHJvY2VzcyBhbiBhbmltYXRpb24gZnJhbWUgb24gYW4gYW5pbWF0aW9uIHRoYXQgaXMgY3VycmVudGx5CisgICAgICogc2xlZXBpbmcgdGhyb3VnaCBpdHMgPGNvZGU+c3RhcnREZWxheTwvY29kZT4gcGhhc2UuIFRoZSByZXR1cm4gdmFsdWUgaW5kaWNhdGVzIHdoZXRoZXIgaXQKKyAgICAgKiBzaG91bGQgYmUgd29rZW4gdXAgYW5kIHB1dCBvbiB0aGUgYWN0aXZlIGFuaW1hdGlvbnMgcXVldWUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY3VycmVudFRpbWUgVGhlIGN1cnJlbnQgYW5pbWF0aW9uIHRpbWUsIHVzZWQgdG8gY2FsY3VsYXRlIHdoZXRoZXIgdGhlIGFuaW1hdGlvbgorICAgICAqIGhhcyBleGNlZWRlZCBpdHMgPGNvZGU+c3RhcnREZWxheTwvY29kZT4gYW5kIHNob3VsZCBiZSBzdGFydGVkLgorICAgICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgYW5pbWF0aW9uJ3MgPGNvZGU+c3RhcnREZWxheTwvY29kZT4gaGFzIGJlZW4gZXhjZWVkZWQgYW5kIHRoZSBhbmltYXRpb24KKyAgICAgKiBzaG91bGQgYmUgYWRkZWQgdG8gdGhlIHNldCBvZiBhY3RpdmUgYW5pbWF0aW9ucy4KKyAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gZGVsYXllZEFuaW1hdGlvbkZyYW1lKGxvbmcgY3VycmVudFRpbWUpIHsKKyAgICAgICAgaWYgKG1QbGF5aW5nU3RhdGUgPT0gQ0FOQ0VMRUQgfHwgbVBsYXlpbmdTdGF0ZSA9PSBFTkRFRCkgeworICAgICAgICAgICAgLy8gZW5kIHRoZSBkZWxheSwgcHJvY2VzcyBhbiBhbmltYXRpb24gZnJhbWUgdG8gYWN0dWFsbHkgY2FuY2VsIGl0CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIW1TdGFydGVkRGVsYXkpIHsKKyAgICAgICAgICAgIG1TdGFydGVkRGVsYXkgPSB0cnVlOworICAgICAgICAgICAgbURlbGF5U3RhcnRUaW1lID0gY3VycmVudFRpbWU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBsb25nIGRlbHRhVGltZSA9IGN1cnJlbnRUaW1lIC0gbURlbGF5U3RhcnRUaW1lOworICAgICAgICAgICAgaWYgKGRlbHRhVGltZSA+IG1TdGFydERlbGF5KSB7CisgICAgICAgICAgICAgICAgLy8gc3RhcnREZWxheSBlbmRlZCAtIHN0YXJ0IHRoZSBhbmltIGFuZCByZWNvcmQgdGhlCisgICAgICAgICAgICAgICAgLy8gbVN0YXJ0VGltZSBhcHByb3ByaWF0ZWx5CisgICAgICAgICAgICAgICAgbVN0YXJ0VGltZSA9IGN1cnJlbnRUaW1lIC0gKGRlbHRhVGltZSAtIG1TdGFydERlbGF5KTsKKyAgICAgICAgICAgICAgICBtUGxheWluZ1N0YXRlID0gUlVOTklORzsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhpcyBpbnRlcm5hbCBmdW5jdGlvbiBwcm9jZXNzZXMgYSBzaW5nbGUgYW5pbWF0aW9uIGZyYW1lIGZvciBhIGdpdmVuIGFuaW1hdGlvbi4gVGhlCisgICAgICogY3VycmVudFRpbWUgcGFyYW1ldGVyIGlzIHRoZSB0aW1pbmcgcHVsc2Ugc2VudCBieSB0aGUgaGFuZGxlciwgdXNlZCB0byBjYWxjdWxhdGUgdGhlCisgICAgICogZWxhcHNlZCBkdXJhdGlvbiwgYW5kIHRoZXJlZm9yZQorICAgICAqIHRoZSBlbGFwc2VkIGZyYWN0aW9uLCBvZiB0aGUgYW5pbWF0aW9uLiBUaGUgcmV0dXJuIHZhbHVlIGluZGljYXRlcyB3aGV0aGVyIHRoZSBhbmltYXRpb24KKyAgICAgKiBzaG91bGQgYmUgZW5kZWQgKHdoaWNoIGhhcHBlbnMgd2hlbiB0aGUgZWxhcHNlZCB0aW1lIG9mIHRoZSBhbmltYXRpb24gZXhjZWVkcyB0aGUKKyAgICAgKiBhbmltYXRpb24ncyBkdXJhdGlvbiwgaW5jbHVkaW5nIHRoZSByZXBlYXRDb3VudCkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY3VycmVudFRpbWUgVGhlIGN1cnJlbnQgdGltZSwgYXMgdHJhY2tlZCBieSB0aGUgc3RhdGljIHRpbWluZyBoYW5kbGVyCisgICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBhbmltYXRpb24ncyBkdXJhdGlvbiwgaW5jbHVkaW5nIGFueSByZXBldGl0aW9ucyBkdWUgdG8KKyAgICAgKiA8Y29kZT5yZXBlYXRDb3VudDwvY29kZT4gaGFzIGJlZW4gZXhjZWVkZWQgYW5kIHRoZSBhbmltYXRpb24gc2hvdWxkIGJlIGVuZGVkLgorICAgICAqLworICAgIHByaXZhdGUgYm9vbGVhbiBhbmltYXRpb25GcmFtZShsb25nIGN1cnJlbnRUaW1lKSB7CisgICAgICAgIGJvb2xlYW4gZG9uZSA9IGZhbHNlOworCisgICAgICAgIGlmIChtUGxheWluZ1N0YXRlID09IFNUT1BQRUQpIHsKKyAgICAgICAgICAgIG1QbGF5aW5nU3RhdGUgPSBSVU5OSU5HOworICAgICAgICAgICAgaWYgKG1TZWVrVGltZSA8IDApIHsKKyAgICAgICAgICAgICAgICBtU3RhcnRUaW1lID0gY3VycmVudFRpbWU7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG1TdGFydFRpbWUgPSBjdXJyZW50VGltZSAtIG1TZWVrVGltZTsKKyAgICAgICAgICAgICAgICAvLyBOb3cgdGhhdCB3ZSdyZSBwbGF5aW5nLCByZXNldCB0aGUgc2VlayB0aW1lCisgICAgICAgICAgICAgICAgbVNlZWtUaW1lID0gLTE7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgc3dpdGNoIChtUGxheWluZ1N0YXRlKSB7CisgICAgICAgIGNhc2UgUlVOTklORzoKKyAgICAgICAgY2FzZSBTRUVLRUQ6CisgICAgICAgICAgICBmbG9hdCBmcmFjdGlvbiA9IChmbG9hdCkoY3VycmVudFRpbWUgLSBtU3RhcnRUaW1lKSAvIG1EdXJhdGlvbjsKKyAgICAgICAgICAgIGlmIChmcmFjdGlvbiA+PSAxZikgeworICAgICAgICAgICAgICAgIGlmIChtQ3VycmVudEl0ZXJhdGlvbiA8IG1SZXBlYXRDb3VudCB8fCBtUmVwZWF0Q291bnQgPT0gSU5GSU5JVEUpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gVGltZSB0byByZXBlYXQKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1MaXN0ZW5lcnMgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChBbmltYXRvckxpc3RlbmVyIGxpc3RlbmVyIDogbUxpc3RlbmVycykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpc3RlbmVyLm9uQW5pbWF0aW9uUmVwZWF0KHRoaXMpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICsrbUN1cnJlbnRJdGVyYXRpb247CisgICAgICAgICAgICAgICAgICAgIGlmIChtUmVwZWF0TW9kZSA9PSBSRVZFUlNFKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtUGxheWluZ0JhY2t3YXJkcyA9IG1QbGF5aW5nQmFja3dhcmRzID8gZmFsc2UgOiB0cnVlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIC8vIFRPRE86IGRvZXNuJ3QgYWNjb3VudCBmb3IgZnJhY3Rpb24gZ29pbmcgV2F5eXl5eSBvdmVyIDEsIGxpa2UgMisKKyAgICAgICAgICAgICAgICAgICAgZnJhY3Rpb24gPSBmcmFjdGlvbiAtIDFmOworICAgICAgICAgICAgICAgICAgICBtU3RhcnRUaW1lICs9IG1EdXJhdGlvbjsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBkb25lID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgZnJhY3Rpb24gPSBNYXRoLm1pbihmcmFjdGlvbiwgMS4wZik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG1QbGF5aW5nQmFja3dhcmRzKSB7CisgICAgICAgICAgICAgICAgZnJhY3Rpb24gPSAxZiAtIGZyYWN0aW9uOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYW5pbWF0ZVZhbHVlKGZyYWN0aW9uKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEVOREVEOgorICAgICAgICAgICAgLy8gVGhlIGZpbmFsIHZhbHVlIHNldCBvbiB0aGUgdGFyZ2V0IHZhcmllcywgZGVwZW5kaW5nIG9uIHdoZXRoZXIgdGhlIGFuaW1hdGlvbgorICAgICAgICAgICAgLy8gd2FzIHN1cHBvc2VkIHRvIHJlcGVhdCBhbiBvZGQgbnVtYmVyIG9mIHRpbWVzCisgICAgICAgICAgICBpZiAobVJlcGVhdENvdW50ID4gMCAmJiAobVJlcGVhdENvdW50ICYgMHgwMSkgPT0gMSkgeworICAgICAgICAgICAgICAgIGFuaW1hdGVWYWx1ZSgwZik7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGFuaW1hdGVWYWx1ZSgxZik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBGYWxsIHRocm91Z2ggdG8gc2V0IGRvbmUgZmxhZworICAgICAgICBjYXNlIENBTkNFTEVEOgorICAgICAgICAgICAgZG9uZSA9IHRydWU7CisgICAgICAgICAgICBtUGxheWluZ1N0YXRlID0gU1RPUFBFRDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGRvbmU7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIHdpdGggdGhlIGVsYXBzZWQgZnJhY3Rpb24gb2YgdGhlIGFuaW1hdGlvbiBkdXJpbmcgZXZlcnkKKyAgICAgKiBhbmltYXRpb24gZnJhbWUuIFRoaXMgZnVuY3Rpb24gdHVybnMgdGhlIGVsYXBzZWQgZnJhY3Rpb24gaW50byBhbiBpbnRlcnBvbGF0ZWQgZnJhY3Rpb24KKyAgICAgKiBhbmQgdGhlbiBpbnRvIGFuIGFuaW1hdGVkIHZhbHVlIChmcm9tIHRoZSBldmFsdWF0b3IuIFRoZSBmdW5jdGlvbiBpcyBjYWxsZWQgbW9zdGx5IGR1cmluZworICAgICAqIGFuaW1hdGlvbiB1cGRhdGVzLCBidXQgaXQgaXMgYWxzbyBjYWxsZWQgd2hlbiB0aGUgPGNvZGU+ZW5kKCk8L2NvZGU+CisgICAgICogZnVuY3Rpb24gaXMgY2FsbGVkLCB0byBzZXQgdGhlIGZpbmFsIHZhbHVlIG9uIHRoZSBwcm9wZXJ0eS4KKyAgICAgKgorICAgICAqIDxwPk92ZXJyaWRlcyBvZiB0aGlzIG1ldGhvZCBtdXN0IGNhbGwgdGhlIHN1cGVyY2xhc3MgdG8gcGVyZm9ybSB0aGUgY2FsY3VsYXRpb24KKyAgICAgKiBvZiB0aGUgYW5pbWF0ZWQgdmFsdWUuPC9wPgorICAgICAqCisgICAgICogQHBhcmFtIGZyYWN0aW9uIFRoZSBlbGFwc2VkIGZyYWN0aW9uIG9mIHRoZSBhbmltYXRpb24uCisgICAgICovCisgICAgdm9pZCBhbmltYXRlVmFsdWUoZmxvYXQgZnJhY3Rpb24pIHsKKyAgICAgICAgZnJhY3Rpb24gPSBtSW50ZXJwb2xhdG9yLmdldEludGVycG9sYXRpb24oZnJhY3Rpb24pOworICAgICAgICBpbnQgbnVtVmFsdWVzID0gbVZhbHVlcy5sZW5ndGg7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtVmFsdWVzOyArK2kpIHsKKyAgICAgICAgICAgIG1WYWx1ZXNbaV0uY2FsY3VsYXRlVmFsdWUoZnJhY3Rpb24pOworICAgICAgICB9CisgICAgICAgIGlmIChtVXBkYXRlTGlzdGVuZXJzICE9IG51bGwpIHsKKyAgICAgICAgICAgIGludCBudW1MaXN0ZW5lcnMgPSBtVXBkYXRlTGlzdGVuZXJzLnNpemUoKTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtTGlzdGVuZXJzOyArK2kpIHsKKyAgICAgICAgICAgICAgICBtVXBkYXRlTGlzdGVuZXJzLmdldChpKS5vbkFuaW1hdGlvblVwZGF0ZSh0aGlzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBWYWx1ZUFuaW1hdG9yIGNsb25lKCkgeworICAgICAgICBmaW5hbCBWYWx1ZUFuaW1hdG9yIGFuaW0gPSAoVmFsdWVBbmltYXRvcikgc3VwZXIuY2xvbmUoKTsKKyAgICAgICAgaWYgKG1VcGRhdGVMaXN0ZW5lcnMgIT0gbnVsbCkgeworICAgICAgICAgICAgQXJyYXlMaXN0PEFuaW1hdG9yVXBkYXRlTGlzdGVuZXI+IG9sZExpc3RlbmVycyA9IG1VcGRhdGVMaXN0ZW5lcnM7CisgICAgICAgICAgICBhbmltLm1VcGRhdGVMaXN0ZW5lcnMgPSBuZXcgQXJyYXlMaXN0PEFuaW1hdG9yVXBkYXRlTGlzdGVuZXI+KCk7CisgICAgICAgICAgICBpbnQgbnVtTGlzdGVuZXJzID0gb2xkTGlzdGVuZXJzLnNpemUoKTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtTGlzdGVuZXJzOyArK2kpIHsKKyAgICAgICAgICAgICAgICBhbmltLm1VcGRhdGVMaXN0ZW5lcnMuYWRkKG9sZExpc3RlbmVycy5nZXQoaSkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGFuaW0ubVNlZWtUaW1lID0gLTE7CisgICAgICAgIGFuaW0ubVBsYXlpbmdCYWNrd2FyZHMgPSBmYWxzZTsKKyAgICAgICAgYW5pbS5tQ3VycmVudEl0ZXJhdGlvbiA9IDA7CisgICAgICAgIGFuaW0ubUluaXRpYWxpemVkID0gZmFsc2U7CisgICAgICAgIGFuaW0ubVBsYXlpbmdTdGF0ZSA9IFNUT1BQRUQ7CisgICAgICAgIGFuaW0ubVN0YXJ0ZWREZWxheSA9IGZhbHNlOworICAgICAgICBQcm9wZXJ0eVZhbHVlc0hvbGRlcltdIG9sZFZhbHVlcyA9IG1WYWx1ZXM7CisgICAgICAgIGlmIChvbGRWYWx1ZXMgIT0gbnVsbCkgeworICAgICAgICAgICAgaW50IG51bVZhbHVlcyA9IG9sZFZhbHVlcy5sZW5ndGg7CisgICAgICAgICAgICBhbmltLm1WYWx1ZXMgPSBuZXcgUHJvcGVydHlWYWx1ZXNIb2xkZXJbbnVtVmFsdWVzXTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtVmFsdWVzOyArK2kpIHsKKyAgICAgICAgICAgICAgICBhbmltLm1WYWx1ZXNbaV0gPSBvbGRWYWx1ZXNbaV0uY2xvbmUoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGFuaW0ubVZhbHVlc01hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgUHJvcGVydHlWYWx1ZXNIb2xkZXI+KG51bVZhbHVlcyk7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bVZhbHVlczsgKytpKSB7CisgICAgICAgICAgICAgICAgUHJvcGVydHlWYWx1ZXNIb2xkZXIgdmFsdWVzSG9sZGVyID0gbVZhbHVlc1tpXTsKKyAgICAgICAgICAgICAgICBhbmltLm1WYWx1ZXNNYXAucHV0KHZhbHVlc0hvbGRlci5nZXRQcm9wZXJ0eU5hbWUoKSwgdmFsdWVzSG9sZGVyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gYW5pbTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJbXBsZW1lbnRvcnMgb2YgdGhpcyBpbnRlcmZhY2UgY2FuIGFkZCB0aGVtc2VsdmVzIGFzIHVwZGF0ZSBsaXN0ZW5lcnMKKyAgICAgKiB0byBhbiA8Y29kZT5WYWx1ZUFuaW1hdG9yPC9jb2RlPiBpbnN0YW5jZSB0byByZWNlaXZlIGNhbGxiYWNrcyBvbiBldmVyeSBhbmltYXRpb24KKyAgICAgKiBmcmFtZSwgYWZ0ZXIgdGhlIGN1cnJlbnQgZnJhbWUncyB2YWx1ZXMgaGF2ZSBiZWVuIGNhbGN1bGF0ZWQgZm9yIHRoYXQKKyAgICAgKiA8Y29kZT5WYWx1ZUFuaW1hdG9yPC9jb2RlPi4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGludGVyZmFjZSBBbmltYXRvclVwZGF0ZUxpc3RlbmVyIHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIDxwPk5vdGlmaWVzIHRoZSBvY2N1cnJlbmNlIG9mIGFub3RoZXIgZnJhbWUgb2YgdGhlIGFuaW1hdGlvbi48L3A+CisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBhbmltYXRpb24gVGhlIGFuaW1hdGlvbiB3aGljaCB3YXMgcmVwZWF0ZWQuCisgICAgICAgICAqLworICAgICAgICB2b2lkIG9uQW5pbWF0aW9uVXBkYXRlKFZhbHVlQW5pbWF0b3IgYW5pbWF0aW9uKTsKKworICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9hbmltYXRpb24vcGFja2FnZS5odG1sIGIvY29yZS9qYXZhL2FuZHJvaWQvYW5pbWF0aW9uL3BhY2thZ2UuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNjY2NjliCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvYW5pbWF0aW9uL3BhY2thZ2UuaHRtbApAQCAtMCwwICsxLDYgQEAKKzxodG1sPgorPGJvZHk+CitQcm92aWRlcyBjbGFzc2VzIGZvciBhbmltYXRpbmcgdmFsdWVzIG92ZXIgdGltZSwgYW5kIHNldHRpbmcgdGhvc2UgdmFsdWVzIG9uIHRhcmdldAorb2JqZWN0cy4KKzwvYm9keT4KKzwvaHRtbD4KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9BY3Rpb25CYXIuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9BY3Rpb25CYXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOWYyZTMwCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvYXBwL0FjdGlvbkJhci5qYXZhCkBAIC0wLDAgKzEsNDc0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLmFwcDsKKworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuRHJhd2FibGU7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CitpbXBvcnQgYW5kcm9pZC52aWV3LldpbmRvdzsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5TcGlubmVyQWRhcHRlcjsKKworLyoqCisgKiBUaGlzIGlzIHRoZSBwdWJsaWMgaW50ZXJmYWNlIHRvIHRoZSBjb250ZXh0dWFsIEFjdGlvbkJhci4KKyAqIFRoZSBBY3Rpb25CYXIgYWN0cyBhcyBhIHJlcGxhY2VtZW50IGZvciB0aGUgdGl0bGUgYmFyIGluIEFjdGl2aXRpZXMuCisgKiBJdCBwcm92aWRlcyBmYWNpbGl0aWVzIGZvciBjcmVhdGluZyB0b29sYmFyIGFjdGlvbnMgYXMgd2VsbCBhcworICogbWV0aG9kcyBvZiBuYXZpZ2F0aW5nIGFyb3VuZCBhbiBhcHBsaWNhdGlvbi4gCisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBBY3Rpb25CYXIgeworICAgIC8qKgorICAgICAqIFN0YW5kYXJkIG5hdmlnYXRpb24gbW9kZS4gQ29uc2lzdHMgb2YgZWl0aGVyIGEgbG9nbyBvciBpY29uCisgICAgICogYW5kIHRpdGxlIHRleHQgd2l0aCBhbiBvcHRpb25hbCBzdWJ0aXRsZS4gQ2xpY2tpbmcgYW55IG9mIHRoZXNlIGVsZW1lbnRzCisgICAgICogd2lsbCBkaXNwYXRjaCBvbkFjdGlvbkl0ZW1TZWxlY3RlZCB0byB0aGUgcmVnaXN0ZXJlZCBDYWxsYmFjayB3aXRoCisgICAgICogYSBNZW51SXRlbSB3aXRoIGl0ZW0gSUQgYW5kcm9pZC5SLmlkLmhvbWUuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTkFWSUdBVElPTl9NT0RFX1NUQU5EQVJEID0gMDsKKyAgICAKKyAgICAvKioKKyAgICAgKiBEcm9wZG93biBsaXN0IG5hdmlnYXRpb24gbW9kZS4gSW5zdGVhZCBvZiBzdGF0aWMgdGl0bGUgdGV4dCB0aGlzIG1vZGUKKyAgICAgKiBwcmVzZW50cyBhIGRyb3Bkb3duIG1lbnUgZm9yIG5hdmlnYXRpb24gd2l0aGluIHRoZSBhY3Rpdml0eS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBOQVZJR0FUSU9OX01PREVfRFJPUERPV05fTElTVCA9IDE7CisgICAgCisgICAgLyoqCisgICAgICogVGFiIG5hdmlnYXRpb24gbW9kZS4gSW5zdGVhZCBvZiBzdGF0aWMgdGl0bGUgdGV4dCB0aGlzIG1vZGUKKyAgICAgKiBwcmVzZW50cyBhIHNlcmllcyBvZiB0YWJzIGZvciBuYXZpZ2F0aW9uIHdpdGhpbiB0aGUgYWN0aXZpdHkuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTkFWSUdBVElPTl9NT0RFX1RBQlMgPSAyOworICAgIAorICAgIC8qKgorICAgICAqIEN1c3RvbSBuYXZpZ2F0aW9uIG1vZGUuIFRoaXMgbmF2aWdhdGlvbiBtb2RlIGlzIHNldCBpbXBsaWNpdGx5IHdoZW5ldmVyCisgICAgICogYSBjdXN0b20gbmF2aWdhdGlvbiB2aWV3IGlzIHNldC4gU2VlIHtAbGluayAjc2V0Q3VzdG9tTmF2aWdhdGlvbk1vZGUoVmlldyl9LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE5BVklHQVRJT05fTU9ERV9DVVNUT00gPSAzOworCisgICAgLyoqCisgICAgICogVXNlIGxvZ28gaW5zdGVhZCBvZiBpY29uIGlmIGF2YWlsYWJsZS4gVGhpcyBmbGFnIHdpbGwgY2F1c2UgYXBwcm9wcmlhdGUKKyAgICAgKiBuYXZpZ2F0aW9uIG1vZGVzIHRvIHVzZSBhIHdpZGVyIGxvZ28gaW4gcGxhY2Ugb2YgdGhlIHN0YW5kYXJkIGljb24uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRElTUExBWV9VU0VfTE9HTyA9IDB4MTsKKyAgICAKKyAgICAvKioKKyAgICAgKiBIaWRlICdob21lJyBlbGVtZW50cyBpbiB0aGlzIGFjdGlvbiBiYXIsIGxlYXZpbmcgbW9yZSBzcGFjZSBmb3Igb3RoZXIKKyAgICAgKiBuYXZpZ2F0aW9uIGVsZW1lbnRzLiBUaGlzIGluY2x1ZGVzIGxvZ28gYW5kIGljb24uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRElTUExBWV9ISURFX0hPTUUgPSAweDI7CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGFjdGlvbiBiYXIgaW50byBjdXN0b20gbmF2aWdhdGlvbiBtb2RlLCBzdXBwbHlpbmcgYSB2aWV3CisgICAgICogZm9yIGN1c3RvbSBuYXZpZ2F0aW9uLgorICAgICAqIAorICAgICAqIEN1c3RvbSBuYXZpZ2F0aW9uIHZpZXdzIGFwcGVhciBiZXR3ZWVuIHRoZSBhcHBsaWNhdGlvbiBpY29uIGFuZAorICAgICAqIGFueSBhY3Rpb24gYnV0dG9ucyBhbmQgbWF5IHVzZSBhbnkgc3BhY2UgYXZhaWxhYmxlIHRoZXJlLiBDb21tb24KKyAgICAgKiB1c2UgY2FzZXMgZm9yIGN1c3RvbSBuYXZpZ2F0aW9uIHZpZXdzIG1pZ2h0IGluY2x1ZGUgYW4gYXV0by1zdWdnZXN0aW5nCisgICAgICogYWRkcmVzcyBiYXIgZm9yIGEgYnJvd3NlciBvciBvdGhlciBuYXZpZ2F0aW9uIG1lY2hhbmlzbXMgdGhhdCBkbyBub3QKKyAgICAgKiB0cmFuc2xhdGUgd2VsbCB0byBwcm92aWRlZCBuYXZpZ2F0aW9uIG1vZGVzLgorICAgICAqIAorICAgICAqIEBwYXJhbSB2aWV3IEN1c3RvbSBuYXZpZ2F0aW9uIHZpZXcgdG8gcGxhY2UgaW4gdGhlIEFjdGlvbkJhci4KKyAgICAgKi8KKyAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZXRDdXN0b21OYXZpZ2F0aW9uTW9kZShWaWV3IHZpZXcpOworICAgIAorICAgIC8qKgorICAgICAqIFNldCB0aGUgYWN0aW9uIGJhciBpbnRvIGRyb3Bkb3duIG5hdmlnYXRpb24gbW9kZSBhbmQgc3VwcGx5IGFuIGFkYXB0ZXIKKyAgICAgKiB0aGF0IHdpbGwgcHJvdmlkZSB2aWV3cyBmb3IgbmF2aWdhdGlvbiBjaG9pY2VzLgorICAgICAqIAorICAgICAqIEBwYXJhbSBhZGFwdGVyIEFuIGFkYXB0ZXIgdGhhdCB3aWxsIHByb3ZpZGUgdmlld3MgYm90aCB0byBkaXNwbGF5CisgICAgICogICAgICAgICAgICAgICAgdGhlIGN1cnJlbnQgbmF2aWdhdGlvbiBzZWxlY3Rpb24gYW5kIHBvcHVsYXRlIHZpZXdzCisgICAgICogICAgICAgICAgICAgICAgd2l0aGluIHRoZSBkcm9wZG93biBuYXZpZ2F0aW9uIG1lbnUuCisgICAgICogQHBhcmFtIGNhbGxiYWNrIEEgTmF2aWdhdGlvbkNhbGxiYWNrIHRoYXQgd2lsbCByZWNlaXZlIGV2ZW50cyB3aGVuIHRoZSB1c2VyCisgICAgICogICAgICAgICAgICAgICAgIHNlbGVjdHMgYSBuYXZpZ2F0aW9uIGl0ZW0uCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IHZvaWQgc2V0RHJvcGRvd25OYXZpZ2F0aW9uTW9kZShTcGlubmVyQWRhcHRlciBhZGFwdGVyLAorICAgICAgICAgICAgTmF2aWdhdGlvbkNhbGxiYWNrIGNhbGxiYWNrKTsKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgYWN0aW9uIGJhciBpbnRvIGRyb3Bkb3duIG5hdmlnYXRpb24gbW9kZSBhbmQgc3VwcGx5IGFuIGFkYXB0ZXIgdGhhdCB3aWxsCisgICAgICogcHJvdmlkZSB2aWV3cyBmb3IgbmF2aWdhdGlvbiBjaG9pY2VzLgorICAgICAqCisgICAgICogQHBhcmFtIGFkYXB0ZXIgQW4gYWRhcHRlciB0aGF0IHdpbGwgcHJvdmlkZSB2aWV3cyBib3RoIHRvIGRpc3BsYXkgdGhlIGN1cnJlbnQKKyAgICAgKiAgICAgICAgICAgICAgICBuYXZpZ2F0aW9uIHNlbGVjdGlvbiBhbmQgcG9wdWxhdGUgdmlld3Mgd2l0aGluIHRoZSBkcm9wZG93bgorICAgICAqICAgICAgICAgICAgICAgIG5hdmlnYXRpb24gbWVudS4KKyAgICAgKiBAcGFyYW0gY2FsbGJhY2sgQSBOYXZpZ2F0aW9uQ2FsbGJhY2sgdGhhdCB3aWxsIHJlY2VpdmUgZXZlbnRzIHdoZW4gdGhlIHVzZXIKKyAgICAgKiAgICAgICAgICAgICAgICAgc2VsZWN0cyBhIG5hdmlnYXRpb24gaXRlbS4KKyAgICAgKiBAcGFyYW0gZGVmYXVsdFNlbGVjdGVkUG9zaXRpb24gUG9zaXRpb24gd2l0aGluIHRoZSBwcm92aWRlZCBhZGFwdGVyIHRoYXQgc2hvdWxkIGJlCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkIGZyb20gdGhlIG91dHNldC4KKyAgICAgKi8KKyAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZXREcm9wZG93bk5hdmlnYXRpb25Nb2RlKFNwaW5uZXJBZGFwdGVyIGFkYXB0ZXIsCisgICAgICAgICAgICBOYXZpZ2F0aW9uQ2FsbGJhY2sgY2FsbGJhY2ssIGludCBkZWZhdWx0U2VsZWN0ZWRQb3NpdGlvbik7CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIHNlbGVjdGVkIG5hdmlnYXRpb24gaXRlbSBpbiBkcm9wZG93biBvciB0YWJiZWQgbmF2aWdhdGlvbiBtb2Rlcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwb3NpdGlvbiBQb3NpdGlvbiBvZiB0aGUgaXRlbSB0byBzZWxlY3QuCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IHZvaWQgc2V0U2VsZWN0ZWROYXZpZ2F0aW9uSXRlbShpbnQgcG9zaXRpb24pOworCisgICAgLyoqCisgICAgICogR2V0IHRoZSBwb3NpdGlvbiBvZiB0aGUgc2VsZWN0ZWQgbmF2aWdhdGlvbiBpdGVtIGluIGRyb3Bkb3duIG9yIHRhYmJlZCBuYXZpZ2F0aW9uIG1vZGVzLgorICAgICAqCisgICAgICogQHJldHVybiBQb3NpdGlvbiBvZiB0aGUgc2VsZWN0ZWQgaXRlbS4KKyAgICAgKi8KKyAgICBwdWJsaWMgYWJzdHJhY3QgaW50IGdldFNlbGVjdGVkTmF2aWdhdGlvbkl0ZW0oKTsKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgYWN0aW9uIGJhciBpbnRvIHN0YW5kYXJkIG5hdmlnYXRpb24gbW9kZSwgdXNpbmcgdGhlIGN1cnJlbnRseSBzZXQgdGl0bGUKKyAgICAgKiBhbmQvb3Igc3VidGl0bGUuCisgICAgICoKKyAgICAgKiBTdGFuZGFyZCBuYXZpZ2F0aW9uIG1vZGUgaXMgZGVmYXVsdC4gVGhlIHRpdGxlIGlzIGF1dG9tYXRpY2FsbHkgc2V0IHRvIHRoZSBuYW1lIG9mCisgICAgICogeW91ciBBY3Rpdml0eSBvbiBzdGFydHVwIGlmIGFuIGFjdGlvbiBiYXIgaXMgcHJlc2VudC4KKyAgICAgKi8KKyAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZXRTdGFuZGFyZE5hdmlnYXRpb25Nb2RlKCk7CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGFjdGlvbiBiYXIncyB0aXRsZS4gVGhpcyB3aWxsIG9ubHkgYmUgZGlzcGxheWVkIGluIHN0YW5kYXJkIG5hdmlnYXRpb24gbW9kZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSB0aXRsZSBUaXRsZSB0byBzZXQKKyAgICAgKgorICAgICAqIEBzZWUgI3NldFRpdGxlKGludCkKKyAgICAgKi8KKyAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZXRUaXRsZShDaGFyU2VxdWVuY2UgdGl0bGUpOworCisgICAgLyoqCisgICAgICogU2V0IHRoZSBhY3Rpb24gYmFyJ3MgdGl0bGUuIFRoaXMgd2lsbCBvbmx5IGJlIGRpc3BsYXllZCBpbiBzdGFuZGFyZCBuYXZpZ2F0aW9uIG1vZGUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVzSWQgUmVzb3VyY2UgSUQgb2YgdGl0bGUgc3RyaW5nIHRvIHNldAorICAgICAqCisgICAgICogQHNlZSAjc2V0VGl0bGUoQ2hhclNlcXVlbmNlKQorICAgICAqLworICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHNldFRpdGxlKGludCByZXNJZCk7CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGFjdGlvbiBiYXIncyBzdWJ0aXRsZS4gVGhpcyB3aWxsIG9ubHkgYmUgZGlzcGxheWVkIGluIHN0YW5kYXJkIG5hdmlnYXRpb24gbW9kZS4KKyAgICAgKiBTZXQgdG8gbnVsbCB0byBkaXNhYmxlIHRoZSBzdWJ0aXRsZSBlbnRpcmVseS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzdWJ0aXRsZSBTdWJ0aXRsZSB0byBzZXQKKyAgICAgKgorICAgICAqIEBzZWUgI3NldFN1YnRpdGxlKGludCkKKyAgICAgKi8KKyAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZXRTdWJ0aXRsZShDaGFyU2VxdWVuY2Ugc3VidGl0bGUpOworCisgICAgLyoqCisgICAgICogU2V0IHRoZSBhY3Rpb24gYmFyJ3Mgc3VidGl0bGUuIFRoaXMgd2lsbCBvbmx5IGJlIGRpc3BsYXllZCBpbiBzdGFuZGFyZCBuYXZpZ2F0aW9uIG1vZGUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVzSWQgUmVzb3VyY2UgSUQgb2Ygc3VidGl0bGUgc3RyaW5nIHRvIHNldAorICAgICAqCisgICAgICogQHNlZSAjc2V0U3VidGl0bGUoQ2hhclNlcXVlbmNlKQorICAgICAqLworICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHNldFN1YnRpdGxlKGludCByZXNJZCk7CisKKyAgICAvKioKKyAgICAgKiBTZXQgZGlzcGxheSBvcHRpb25zLiBUaGlzIGNoYW5nZXMgYWxsIGRpc3BsYXkgb3B0aW9uIGJpdHMgYXQgb25jZS4gVG8gY2hhbmdlCisgICAgICogYSBsaW1pdGVkIHN1YnNldCBvZiBkaXNwbGF5IG9wdGlvbnMsIHNlZSB7QGxpbmsgI3NldERpc3BsYXlPcHRpb25zKGludCwgaW50KX0uCisgICAgICogCisgICAgICogQHBhcmFtIG9wdGlvbnMgQSBjb21iaW5hdGlvbiBvZiB0aGUgYml0cyBkZWZpbmVkIGJ5IHRoZSBESVNQTEFZXyBjb25zdGFudHMKKyAgICAgKiAgICAgICAgICAgICAgICBkZWZpbmVkIGluIEFjdGlvbkJhci4KKyAgICAgKi8KKyAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZXREaXNwbGF5T3B0aW9ucyhpbnQgb3B0aW9ucyk7CisgICAgCisgICAgLyoqCisgICAgICogU2V0IHNlbGVjdGVkIGRpc3BsYXkgb3B0aW9ucy4gT25seSB0aGUgb3B0aW9ucyBzcGVjaWZpZWQgYnkgbWFzayB3aWxsIGJlIGNoYW5nZWQuCisgICAgICogVG8gY2hhbmdlIGFsbCBkaXNwbGF5IG9wdGlvbiBiaXRzIGF0IG9uY2UsIHNlZSB7QGxpbmsgI3NldERpc3BsYXlPcHRpb25zKGludCl9LgorICAgICAqIAorICAgICAqIDxwPkV4YW1wbGU6IHNldERpc3BsYXlPcHRpb25zKDAsIERJU1BMQVlfSElERV9IT01FKSB3aWxsIGRpc2FibGUgdGhlCisgICAgICoge0BsaW5rICNESVNQTEFZX0hJREVfSE9NRX0gb3B0aW9uLgorICAgICAqIHNldERpc3BsYXlPcHRpb25zKERJU1BMQVlfSElERV9IT01FLCBESVNQTEFZX0hJREVfSE9NRSB8IERJU1BMQVlfVVNFX0xPR08pCisgICAgICogd2lsbCBlbmFibGUge0BsaW5rICNESVNQTEFZX0hJREVfSE9NRX0gYW5kIGRpc2FibGUge0BsaW5rICNESVNQTEFZX1VTRV9MT0dPfS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gb3B0aW9ucyBBIGNvbWJpbmF0aW9uIG9mIHRoZSBiaXRzIGRlZmluZWQgYnkgdGhlIERJU1BMQVlfIGNvbnN0YW50cworICAgICAqICAgICAgICAgICAgICAgIGRlZmluZWQgaW4gQWN0aW9uQmFyLgorICAgICAqIEBwYXJhbSBtYXNrIEEgYml0IG1hc2sgZGVjbGFyaW5nIHdoaWNoIGRpc3BsYXkgb3B0aW9ucyBzaG91bGQgYmUgY2hhbmdlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZXREaXNwbGF5T3B0aW9ucyhpbnQgb3B0aW9ucywgaW50IG1hc2spOworICAgIAorICAgIC8qKgorICAgICAqIFNldCB0aGUgQWN0aW9uQmFyJ3MgYmFja2dyb3VuZC4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gZCBCYWNrZ3JvdW5kIGRyYXdhYmxlCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IHZvaWQgc2V0QmFja2dyb3VuZERyYXdhYmxlKERyYXdhYmxlIGQpOworICAgIAorICAgIC8qKgorICAgICAqIEByZXR1cm4gVGhlIGN1cnJlbnQgY3VzdG9tIG5hdmlnYXRpb24gdmlldy4KKyAgICAgKi8KKyAgICBwdWJsaWMgYWJzdHJhY3QgVmlldyBnZXRDdXN0b21OYXZpZ2F0aW9uVmlldygpOworICAgIAorICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIGN1cnJlbnQgQWN0aW9uQmFyIHRpdGxlIGluIHN0YW5kYXJkIG1vZGUuCisgICAgICogUmV0dXJucyBudWxsIGlmIHtAbGluayAjZ2V0TmF2aWdhdGlvbk1vZGUoKX0gd291bGQgbm90IHJldHVybgorICAgICAqIHtAbGluayAjTkFWSUdBVElPTl9NT0RFX1NUQU5EQVJEfS4gCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFRoZSBjdXJyZW50IEFjdGlvbkJhciB0aXRsZSBvciBudWxsLgorICAgICAqLworICAgIHB1YmxpYyBhYnN0cmFjdCBDaGFyU2VxdWVuY2UgZ2V0VGl0bGUoKTsKKyAgICAKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBjdXJyZW50IEFjdGlvbkJhciBzdWJ0aXRsZSBpbiBzdGFuZGFyZCBtb2RlLgorICAgICAqIFJldHVybnMgbnVsbCBpZiB7QGxpbmsgI2dldE5hdmlnYXRpb25Nb2RlKCl9IHdvdWxkIG5vdCByZXR1cm4KKyAgICAgKiB7QGxpbmsgI05BVklHQVRJT05fTU9ERV9TVEFOREFSRH0uIAorICAgICAqCisgICAgICogQHJldHVybiBUaGUgY3VycmVudCBBY3Rpb25CYXIgc3VidGl0bGUgb3IgbnVsbC4KKyAgICAgKi8KKyAgICBwdWJsaWMgYWJzdHJhY3QgQ2hhclNlcXVlbmNlIGdldFN1YnRpdGxlKCk7CisgICAgCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgY3VycmVudCBuYXZpZ2F0aW9uIG1vZGUuIFRoZSByZXN1bHQgd2lsbCBiZSBvbmUgb2Y6CisgICAgICogPHVsPgorICAgICAqIDxsaT57QGxpbmsgI05BVklHQVRJT05fTU9ERV9TVEFOREFSRH08L2xpPgorICAgICAqIDxsaT57QGxpbmsgI05BVklHQVRJT05fTU9ERV9EUk9QRE9XTl9MSVNUfTwvbGk+CisgICAgICogPGxpPntAbGluayAjTkFWSUdBVElPTl9NT0RFX1RBQlN9PC9saT4KKyAgICAgKiA8bGk+e0BsaW5rICNOQVZJR0FUSU9OX01PREVfQ1VTVE9NfTwvbGk+CisgICAgICogPC91bD4KKyAgICAgKgorICAgICAqIEByZXR1cm4gVGhlIGN1cnJlbnQgbmF2aWdhdGlvbiBtb2RlLgorICAgICAqIAorICAgICAqIEBzZWUgI3NldFN0YW5kYXJkTmF2aWdhdGlvbk1vZGUoKQorICAgICAqIEBzZWUgI3NldFN0YW5kYXJkTmF2aWdhdGlvbk1vZGUoQ2hhclNlcXVlbmNlKQorICAgICAqIEBzZWUgI3NldFN0YW5kYXJkTmF2aWdhdGlvbk1vZGUoQ2hhclNlcXVlbmNlLCBDaGFyU2VxdWVuY2UpCisgICAgICogQHNlZSAjc2V0RHJvcGRvd25OYXZpZ2F0aW9uTW9kZShTcGlubmVyQWRhcHRlcikKKyAgICAgKiBAc2VlICNzZXRUYWJOYXZpZ2F0aW9uTW9kZSgpCisgICAgICogQHNlZSAjc2V0Q3VzdG9tTmF2aWdhdGlvbk1vZGUoVmlldykKKyAgICAgKi8KKyAgICBwdWJsaWMgYWJzdHJhY3QgaW50IGdldE5hdmlnYXRpb25Nb2RlKCk7CisgICAgCisgICAgLyoqCisgICAgICogQHJldHVybiBUaGUgY3VycmVudCBzZXQgb2YgZGlzcGxheSBvcHRpb25zLiAKKyAgICAgKi8KKyAgICBwdWJsaWMgYWJzdHJhY3QgaW50IGdldERpc3BsYXlPcHRpb25zKCk7CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGFjdGlvbiBiYXIgaW50byB0YWJiZWQgbmF2aWdhdGlvbiBtb2RlLgorICAgICAqCisgICAgICogQHNlZSAjYWRkVGFiKFRhYikKKyAgICAgKiBAc2VlICNpbnNlcnRUYWIoVGFiLCBpbnQpCisgICAgICogQHNlZSAjcmVtb3ZlVGFiKFRhYikKKyAgICAgKiBAc2VlICNyZW1vdmVUYWJBdChpbnQpCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IHZvaWQgc2V0VGFiTmF2aWdhdGlvbk1vZGUoKTsKKworICAgIC8qKgorICAgICAqIENyZWF0ZSBhbmQgcmV0dXJuIGEgbmV3IHtAbGluayBUYWJ9LgorICAgICAqIFRoaXMgdGFiIHdpbGwgbm90IGJlIGluY2x1ZGVkIGluIHRoZSBhY3Rpb24gYmFyIHVudGlsIGl0IGlzIGFkZGVkLgorICAgICAqCisgICAgICogQHJldHVybiBBIG5ldyBUYWIKKyAgICAgKgorICAgICAqIEBzZWUgI2FkZFRhYihUYWIpCisgICAgICogQHNlZSAjaW5zZXJ0VGFiKFRhYiwgaW50KQorICAgICAqLworICAgIHB1YmxpYyBhYnN0cmFjdCBUYWIgbmV3VGFiKCk7CisKKyAgICAvKioKKyAgICAgKiBBZGQgYSB0YWIgZm9yIHVzZSBpbiB0YWJiZWQgbmF2aWdhdGlvbiBtb2RlLiBUaGUgdGFiIHdpbGwgYmUgYWRkZWQgYXQgdGhlIGVuZCBvZiB0aGUgbGlzdC4KKyAgICAgKgorICAgICAqIEBwYXJhbSB0YWIgVGFiIHRvIGFkZAorICAgICAqLworICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIGFkZFRhYihUYWIgdGFiKTsKKworICAgIC8qKgorICAgICAqIEFkZCBhIHRhYiBmb3IgdXNlIGluIHRhYmJlZCBuYXZpZ2F0aW9uIG1vZGUuIFRoZSB0YWIgd2lsbCBiZSBpbnNlcnRlZCBhdAorICAgICAqIDxjb2RlPnBvc2l0aW9uPC9jb2RlPi4KKyAgICAgKgorICAgICAqIEBwYXJhbSB0YWIgVGhlIHRhYiB0byBhZGQKKyAgICAgKiBAcGFyYW0gcG9zaXRpb24gVGhlIG5ldyBwb3NpdGlvbiBvZiB0aGUgdGFiCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IHZvaWQgYWRkVGFiKFRhYiB0YWIsIGludCBwb3NpdGlvbik7CisKKyAgICAvKioKKyAgICAgKiBSZW1vdmUgYSB0YWIgZnJvbSB0aGUgYWN0aW9uIGJhci4KKyAgICAgKgorICAgICAqIEBwYXJhbSB0YWIgVGhlIHRhYiB0byByZW1vdmUKKyAgICAgKi8KKyAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCByZW1vdmVUYWIoVGFiIHRhYik7CisKKyAgICAvKioKKyAgICAgKiBSZW1vdmUgYSB0YWIgZnJvbSB0aGUgYWN0aW9uIGJhci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwb3NpdGlvbiBQb3NpdGlvbiBvZiB0aGUgdGFiIHRvIHJlbW92ZQorICAgICAqLworICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHJlbW92ZVRhYkF0KGludCBwb3NpdGlvbik7CisKKyAgICAvKioKKyAgICAgKiBTZWxlY3QgdGhlIHNwZWNpZmllZCB0YWIuIElmIGl0IGlzIG5vdCBhIGNoaWxkIG9mIHRoaXMgYWN0aW9uIGJhciBpdCB3aWxsIGJlIGFkZGVkLgorICAgICAqCisgICAgICogQHBhcmFtIHRhYiBUYWIgdG8gc2VsZWN0CisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IHZvaWQgc2VsZWN0VGFiKFRhYiB0YWIpOworCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgY3VycmVudGx5IHNlbGVjdGVkIHRhYiBpZiBpbiB0YWJiZWQgbmF2aWdhdGlvbiBtb2RlIGFuZCB0aGVyZSBpcyBhdCBsZWFzdAorICAgICAqIG9uZSB0YWIgcHJlc2VudC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gVGhlIGN1cnJlbnRseSBzZWxlY3RlZCB0YWIgb3IgbnVsbAorICAgICAqLworICAgIHB1YmxpYyBhYnN0cmFjdCBUYWIgZ2V0U2VsZWN0ZWRUYWIoKTsKKworICAgIC8qKgorICAgICAqIFJldHJpZXZlIHRoZSBjdXJyZW50IGhlaWdodCBvZiB0aGUgQWN0aW9uQmFyLgorICAgICAqCisgICAgICogQHJldHVybiBUaGUgQWN0aW9uQmFyJ3MgaGVpZ2h0CisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IGludCBnZXRIZWlnaHQoKTsKKworICAgIC8qKgorICAgICAqIFNob3cgdGhlIEFjdGlvbkJhciBpZiBpdCBpcyBub3QgY3VycmVudGx5IHNob3dpbmcuCisgICAgICogSWYgdGhlIHdpbmRvdyBob3N0aW5nIHRoZSBBY3Rpb25CYXIgZG9lcyBub3QgaGF2ZSB0aGUgZmVhdHVyZQorICAgICAqIHtAbGluayBXaW5kb3cjRkVBVFVSRV9BQ1RJT05fQkFSX09WRVJMQVl9IGl0IHdpbGwgcmVzaXplIGFwcGxpY2F0aW9uCisgICAgICogY29udGVudCB0byBmaXQgdGhlIG5ldyBzcGFjZSBhdmFpbGFibGUuCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IHZvaWQgc2hvdygpOworCisgICAgLyoqCisgICAgICogSGlkZSB0aGUgQWN0aW9uQmFyIGlmIGl0IGlzIG5vdCBjdXJyZW50bHkgc2hvd2luZy4KKyAgICAgKiBJZiB0aGUgd2luZG93IGhvc3RpbmcgdGhlIEFjdGlvbkJhciBkb2VzIG5vdCBoYXZlIHRoZSBmZWF0dXJlCisgICAgICoge0BsaW5rIFdpbmRvdyNGRUFUVVJFX0FDVElPTl9CQVJfT1ZFUkxBWX0gaXQgd2lsbCByZXNpemUgYXBwbGljYXRpb24KKyAgICAgKiBjb250ZW50IHRvIGZpdCB0aGUgbmV3IHNwYWNlIGF2YWlsYWJsZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBoaWRlKCk7CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBBY3Rpb25CYXIgaXMgc2hvd2luZywgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBpc1Nob3dpbmcoKTsKKworICAgIC8qKgorICAgICAqIENhbGxiYWNrIGludGVyZmFjZSBmb3IgQWN0aW9uQmFyIG5hdmlnYXRpb24gZXZlbnRzLiAKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50ZXJmYWNlIE5hdmlnYXRpb25DYWxsYmFjayB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgd2hlbmV2ZXIgYSBuYXZpZ2F0aW9uIGl0ZW0gaW4geW91ciBhY3Rpb24gYmFyCisgICAgICAgICAqIGlzIHNlbGVjdGVkLgorICAgICAgICAgKiAgICAKKyAgICAgICAgICogQHBhcmFtIGl0ZW1Qb3NpdGlvbiBQb3NpdGlvbiBvZiB0aGUgaXRlbSBjbGlja2VkLgorICAgICAgICAgKiBAcGFyYW0gaXRlbUlkIElEIG9mIHRoZSBpdGVtIGNsaWNrZWQuCisgICAgICAgICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgZXZlbnQgd2FzIGhhbmRsZWQsIGZhbHNlIG90aGVyd2lzZS4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBib29sZWFuIG9uTmF2aWdhdGlvbkl0ZW1TZWxlY3RlZChpbnQgaXRlbVBvc2l0aW9uLCBsb25nIGl0ZW1JZCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQSB0YWIgaW4gdGhlIGFjdGlvbiBiYXIuCisgICAgICoKKyAgICAgKiA8cD5UYWJzIG1hbmFnZSB0aGUgaGlkaW5nIGFuZCBzaG93aW5nIG9mIHtAbGluayBGcmFnbWVudH1zLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgYWJzdHJhY3QgY2xhc3MgVGFiIHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEFuIGludmFsaWQgcG9zaXRpb24gZm9yIGEgdGFiLgorICAgICAgICAgKgorICAgICAgICAgKiBAc2VlICNnZXRQb3NpdGlvbigpCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTlZBTElEX1BPU0lUSU9OID0gLTE7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFJldHVybiB0aGUgY3VycmVudCBwb3NpdGlvbiBvZiB0aGlzIHRhYiBpbiB0aGUgYWN0aW9uIGJhci4KKyAgICAgICAgICoKKyAgICAgICAgICogQHJldHVybiBDdXJyZW50IHBvc2l0aW9uLCBvciB7QGxpbmsgI0lOVkFMSURfUE9TSVRJT059IGlmIHRoaXMgdGFiIGlzIG5vdCBjdXJyZW50bHkgaW4KKyAgICAgICAgICogICAgICAgICB0aGUgYWN0aW9uIGJhci4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBhYnN0cmFjdCBpbnQgZ2V0UG9zaXRpb24oKTsKKworICAgICAgICAvKioKKyAgICAgICAgICogUmV0dXJuIHRoZSBpY29uIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHRhYi4KKyAgICAgICAgICoKKyAgICAgICAgICogQHJldHVybiBUaGUgdGFiJ3MgaWNvbgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIGFic3RyYWN0IERyYXdhYmxlIGdldEljb24oKTsKKworICAgICAgICAvKioKKyAgICAgICAgICogUmV0dXJuIHRoZSB0ZXh0IG9mIHRoaXMgdGFiLgorICAgICAgICAgKgorICAgICAgICAgKiBAcmV0dXJuIFRoZSB0YWIncyB0ZXh0CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgYWJzdHJhY3QgQ2hhclNlcXVlbmNlIGdldFRleHQoKTsKKworICAgICAgICAvKioKKyAgICAgICAgICogU2V0IHRoZSBpY29uIGRpc3BsYXllZCBvbiB0aGlzIHRhYi4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIGljb24gVGhlIGRyYXdhYmxlIHRvIHVzZSBhcyBhbiBpY29uCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZXRJY29uKERyYXdhYmxlIGljb24pOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBTZXQgdGhlIHRleHQgZGlzcGxheWVkIG9uIHRoaXMgdGFiLiBUZXh0IG1heSBiZSB0cnVuY2F0ZWQgaWYgdGhlcmUgaXMgbm90CisgICAgICAgICAqIHJvb20gdG8gZGlzcGxheSB0aGUgZW50aXJlIHN0cmluZy4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIHRleHQgVGhlIHRleHQgdG8gZGlzcGxheQorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIGFic3RyYWN0IHZvaWQgc2V0VGV4dChDaGFyU2VxdWVuY2UgdGV4dCk7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFNldCBhIGN1c3RvbSB2aWV3IHRvIGJlIHVzZWQgZm9yIHRoaXMgdGFiLiBUaGlzIG92ZXJyaWRlcyB2YWx1ZXMgc2V0IGJ5CisgICAgICAgICAqIHtAbGluayAjc2V0VGV4dChDaGFyU2VxdWVuY2UpfSBhbmQge0BsaW5rICNzZXRJY29uKERyYXdhYmxlKX0uCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSB2aWV3IEN1c3RvbSB2aWV3IHRvIGJlIHVzZWQgYXMgYSB0YWIuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZXRDdXN0b21WaWV3KFZpZXcgdmlldyk7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFJldHJpZXZlIGEgcHJldmlvdXNseSBzZXQgY3VzdG9tIHZpZXcgZm9yIHRoaXMgdGFiLgorICAgICAgICAgKgorICAgICAgICAgKiBAcmV0dXJuIFRoZSBjdXN0b20gdmlldyBzZXQgYnkge0BsaW5rICNzZXRDdXN0b21WaWV3KFZpZXcpfS4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBhYnN0cmFjdCBWaWV3IGdldEN1c3RvbVZpZXcoKTsKKworICAgICAgICAvKioKKyAgICAgICAgICogR2l2ZSB0aGlzIFRhYiBhbiBhcmJpdHJhcnkgb2JqZWN0IHRvIGhvbGQgZm9yIGxhdGVyIHVzZS4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIG9iaiBPYmplY3QgdG8gc3RvcmUKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHNldFRhZyhPYmplY3Qgb2JqKTsKKworICAgICAgICAvKioKKyAgICAgICAgICogQHJldHVybiBUaGlzIFRhYidzIHRhZyBvYmplY3QuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgYWJzdHJhY3QgT2JqZWN0IGdldFRhZygpOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBTZXQgdGhlIHtAbGluayBUYWJMaXN0ZW5lcn0gdGhhdCB3aWxsIGhhbmRsZSBzd2l0Y2hpbmcgdG8gYW5kIGZyb20gdGhpcyB0YWIuCisgICAgICAgICAqIEFsbCB0YWJzIG11c3QgaGF2ZSBhIFRhYkxpc3RlbmVyIHNldCBiZWZvcmUgYmVpbmcgYWRkZWQgdG8gdGhlIEFjdGlvbkJhci4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIGxpc3RlbmVyIExpc3RlbmVyIHRvIGhhbmRsZSB0YWIgc2VsZWN0aW9uIGV2ZW50cworICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIGFic3RyYWN0IHZvaWQgc2V0VGFiTGlzdGVuZXIoVGFiTGlzdGVuZXIgbGlzdGVuZXIpOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBTZWxlY3QgdGhpcyB0YWIuIE9ubHkgdmFsaWQgaWYgdGhlIHRhYiBoYXMgYmVlbiBhZGRlZCB0byB0aGUgYWN0aW9uIGJhci4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHNlbGVjdCgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENhbGxiYWNrIGludGVyZmFjZSBpbnZva2VkIHdoZW4gYSB0YWIgaXMgZm9jdXNlZCwgdW5mb2N1c2VkLCBhZGRlZCwgb3IgcmVtb3ZlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50ZXJmYWNlIFRhYkxpc3RlbmVyIHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIENhbGxlZCB3aGVuIGEgdGFiIGVudGVycyB0aGUgc2VsZWN0ZWQgc3RhdGUuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSB0YWIgVGhlIHRhYiB0aGF0IHdhcyBzZWxlY3RlZAorICAgICAgICAgKiBAcGFyYW0gZnQgQSB7QGxpbmsgRnJhZ21lbnRUcmFuc2FjdGlvbn0gZm9yIHF1ZXVpbmcgZnJhZ21lbnQgb3BlcmF0aW9ucyB0byBleGVjdXRlCisgICAgICAgICAqICAgICAgICBkdXJpbmcgYSB0YWIgc3dpdGNoLiBUaGUgcHJldmlvdXMgdGFiJ3MgdW5zZWxlY3QgYW5kIHRoaXMgdGFiJ3Mgc2VsZWN0IHdpbGwgYmUKKyAgICAgICAgICogICAgICAgIGV4ZWN1dGVkIGluIGEgc2luZ2xlIHRyYW5zYWN0aW9uLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgb25UYWJTZWxlY3RlZChUYWIgdGFiLCBGcmFnbWVudFRyYW5zYWN0aW9uIGZ0KTsKKworICAgICAgICAvKioKKyAgICAgICAgICogQ2FsbGVkIHdoZW4gYSB0YWIgZXhpdHMgdGhlIHNlbGVjdGVkIHN0YXRlLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gdGFiIFRoZSB0YWIgdGhhdCB3YXMgdW5zZWxlY3RlZAorICAgICAgICAgKiBAcGFyYW0gZnQgQSB7QGxpbmsgRnJhZ21lbnRUcmFuc2FjdGlvbn0gZm9yIHF1ZXVpbmcgZnJhZ21lbnQgb3BlcmF0aW9ucyB0byBleGVjdXRlCisgICAgICAgICAqICAgICAgICBkdXJpbmcgYSB0YWIgc3dpdGNoLiBUaGlzIHRhYidzIHVuc2VsZWN0IGFuZCB0aGUgbmV3bHkgc2VsZWN0ZWQgdGFiJ3Mgc2VsZWN0CisgICAgICAgICAqICAgICAgICB3aWxsIGJlIGV4ZWN1dGVkIGluIGEgc2luZ2xlIHRyYW5zYWN0aW9uLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgb25UYWJVbnNlbGVjdGVkKFRhYiB0YWIsIEZyYWdtZW50VHJhbnNhY3Rpb24gZnQpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9BY3Rpdml0eS5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvYXBwL0FjdGl2aXR5LmphdmEKaW5kZXggNmU2ZTg2Zi4uMmU4ZDY4MiAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvYXBwL0FjdGl2aXR5LmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvYXBwL0FjdGl2aXR5LmphdmEKQEAgLTE2LDE5ICsxNiwyMiBAQAogCiBwYWNrYWdlIGFuZHJvaWQuYXBwOwogCitpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwuYXBwLkFjdGlvbkJhckltcGw7CiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwucG9saWN5LlBvbGljeU1hbmFnZXI7CiAKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29tcG9uZW50Q2FsbGJhY2tzOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db21wb25lbnROYW1lOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZW50UmVzb2x2ZXI7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ3Vyc29yTG9hZGVyOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5JSW50ZW50U2VuZGVyOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudFNlbmRlcjsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuU2hhcmVkUHJlZmVyZW5jZXM7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLkFjdGl2aXR5SW5mbzsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLkNvbmZpZ3VyYXRpb247CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5SZXNvdXJjZXM7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5UeXBlZEFycmF5OwogaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2UuQ3Vyc29yOwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwOwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQ2FudmFzOwpAQCAtMzksNiArNDIsNyBAQAogaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOwogaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlcjsKIGltcG9ydCBhbmRyb2lkLm9zLklCaW5kZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5QYXJjZWxhYmxlOwogaW1wb3J0IGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uOwogaW1wb3J0IGFuZHJvaWQudGV4dC5TZWxlY3Rpb247CiBpbXBvcnQgYW5kcm9pZC50ZXh0LlNwYW5uYWJsZVN0cmluZ0J1aWxkZXI7CkBAIC00OSw3ICs1Myw5IEBACiBpbXBvcnQgYW5kcm9pZC51dGlsLkV2ZW50TG9nOwogaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CiBpbXBvcnQgYW5kcm9pZC51dGlsLlNwYXJzZUFycmF5OworaW1wb3J0IGFuZHJvaWQudmlldy5BY3Rpb25Nb2RlOwogaW1wb3J0IGFuZHJvaWQudmlldy5Db250ZXh0TWVudTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuQ29udGV4dE1lbnUuQ29udGV4dE1lbnVJbmZvOwogaW1wb3J0IGFuZHJvaWQudmlldy5Db250ZXh0VGhlbWVXcmFwcGVyOwogaW1wb3J0IGFuZHJvaWQudmlldy5LZXlFdmVudDsKIGltcG9ydCBhbmRyb2lkLnZpZXcuTGF5b3V0SW5mbGF0ZXI7CkBAIC01OCwxNyArNjQsMTUgQEAKIGltcG9ydCBhbmRyb2lkLnZpZXcuTWVudUl0ZW07CiBpbXBvcnQgYW5kcm9pZC52aWV3Lk1vdGlvbkV2ZW50OwogaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3Lk9uQ3JlYXRlQ29udGV4dE1lbnVMaXN0ZW5lcjsKIGltcG9ydCBhbmRyb2lkLnZpZXcuVmlld0dyb3VwOworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3R3JvdXAuTGF5b3V0UGFyYW1zOwogaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3TWFuYWdlcjsKIGltcG9ydCBhbmRyb2lkLnZpZXcuV2luZG93OwogaW1wb3J0IGFuZHJvaWQudmlldy5XaW5kb3dNYW5hZ2VyOwotaW1wb3J0IGFuZHJvaWQudmlldy5Db250ZXh0TWVudS5Db250ZXh0TWVudUluZm87Ci1pbXBvcnQgYW5kcm9pZC52aWV3LlZpZXcuT25DcmVhdGVDb250ZXh0TWVudUxpc3RlbmVyOwotaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3R3JvdXAuTGF5b3V0UGFyYW1zOwogaW1wb3J0IGFuZHJvaWQudmlldy5hY2Nlc3NpYmlsaXR5LkFjY2Vzc2liaWxpdHlFdmVudDsKIGltcG9ydCBhbmRyb2lkLndpZGdldC5BZGFwdGVyVmlldzsKIGltcG9ydCBhbmRyb2lkLndpZGdldC5GcmFtZUxheW91dDsKLWltcG9ydCBhbmRyb2lkLndpZGdldC5MaW5lYXJMYXlvdXQ7CiAKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwogaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwpAQCAtMTEwLDYgKzExNCw3IEBACiAgKiAKICAqIDxwPlRvcGljcyBjb3ZlcmVkIGhlcmU6CiAgKiA8b2w+CisgKiA8bGk+PGEgaHJlZj0iI0ZyYWdtZW50cyI+RnJhZ21lbnRzPC9hPgogICogPGxpPjxhIGhyZWY9IiNBY3Rpdml0eUxpZmVjeWNsZSI+QWN0aXZpdHkgTGlmZWN5Y2xlPC9hPgogICogPGxpPjxhIGhyZWY9IiNDb25maWd1cmF0aW9uQ2hhbmdlcyI+Q29uZmlndXJhdGlvbiBDaGFuZ2VzPC9hPgogICogPGxpPjxhIGhyZWY9IiNTdGFydGluZ0FjdGl2aXRpZXMiPlN0YXJ0aW5nIEFjdGl2aXRpZXMgYW5kIEdldHRpbmcgUmVzdWx0czwvYT4KQEAgLTExOCw2ICsxMjMsMTQgQEAKICAqIDxsaT48YSBocmVmPSIjUHJvY2Vzc0xpZmVjeWNsZSI+UHJvY2VzcyBMaWZlY3ljbGU8L2E+CiAgKiA8L29sPgogICogCisgKiA8YSBuYW1lPSJGcmFnbWVudHMiPjwvYT4KKyAqIDxoMz5GcmFnbWVudHM8L2gzPgorICoKKyAqIDxwPlN0YXJ0aW5nIHdpdGgge0BsaW5rIGFuZHJvaWQub3MuQnVpbGQuVkVSU0lPTl9DT0RFUyNIT05FWUNPTUJ9LCBBY3Rpdml0eQorICogaW1wbGVtZW50YXRpb25zIGNhbiBtYWtlIHVzZSBvZiB0aGUge0BsaW5rIEZyYWdtZW50fSBjbGFzcyB0byBiZXR0ZXIKKyAqIG1vZHVsYXJpemUgdGhlaXIgY29kZSwgYnVpbGQgbW9yZSBzb3BoaXN0aWNhdGVkIHVzZXIgaW50ZXJmYWNlcyBmb3IgbGFyZ2VyCisgKiBzY3JlZW5zLCBhbmQgaGVscCBzY2FsZSB0aGVpciBhcHBsaWNhdGlvbiBiZXR3ZWVuIHNtYWxsIGFuZCBsYXJnZSBzY3JlZW5zLgorICoKICAqIDxhIG5hbWU9IkFjdGl2aXR5TGlmZWN5Y2xlIj48L2E+CiAgKiA8aDM+QWN0aXZpdHkgTGlmZWN5Y2xlPC9oMz4KICAqCkBAIC02MDQsOSArNjE3LDggQEAKICAgICAvKiogU3RhcnQgb2YgdXNlci1kZWZpbmVkIGFjdGl2aXR5IHJlc3VsdHMuICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUkVTVUxUX0ZJUlNUX1VTRVIgICA9IDE7CiAKLSAgICBwcml2YXRlIHN0YXRpYyBsb25nIHNJbnN0YW5jZUNvdW50ID0gMDsKLQogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBXSU5ET1dfSElFUkFSQ0hZX1RBRyA9ICJhbmRyb2lkOnZpZXdIaWVyYXJjaHlTdGF0ZSI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEZSQUdNRU5UU19UQUcgPSAiYW5kcm9pZDpmcmFnbWVudHMiOwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTQVZFRF9ESUFMT0dfSURTX0tFWSA9ICJhbmRyb2lkOnNhdmVkRGlhbG9nSWRzIjsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0FWRURfRElBTE9HU19UQUcgPSAiYW5kcm9pZDpzYXZlZERpYWxvZ3MiOwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTQVZFRF9ESUFMT0dfS0VZX1BSRUZJWCA9ICJhbmRyb2lkOmRpYWxvZ18iOwpAQCAtNjI4LDE4ICs2NDAsMjggQEAKICAgICBwcml2YXRlIENvbXBvbmVudE5hbWUgbUNvbXBvbmVudDsKICAgICAvKnBhY2thZ2UqLyBBY3Rpdml0eUluZm8gbUFjdGl2aXR5SW5mbzsKICAgICAvKnBhY2thZ2UqLyBBY3Rpdml0eVRocmVhZCBtTWFpblRocmVhZDsKLSAgICAvKnBhY2thZ2UqLyBPYmplY3QgbUxhc3ROb25Db25maWd1cmF0aW9uSW5zdGFuY2U7Ci0gICAgLypwYWNrYWdlKi8gSGFzaE1hcDxTdHJpbmcsT2JqZWN0PiBtTGFzdE5vbkNvbmZpZ3VyYXRpb25DaGlsZEluc3RhbmNlczsKICAgICBBY3Rpdml0eSBtUGFyZW50OwogICAgIGJvb2xlYW4gbUNhbGxlZDsKKyAgICBib29sZWFuIG1DaGVja2VkRm9yTG9hZGVyTWFuYWdlcjsKKyAgICBib29sZWFuIG1TdGFydGVkOwogICAgIHByaXZhdGUgYm9vbGVhbiBtUmVzdW1lZDsKICAgICBwcml2YXRlIGJvb2xlYW4gbVN0b3BwZWQ7CiAgICAgYm9vbGVhbiBtRmluaXNoZWQ7CiAgICAgYm9vbGVhbiBtU3RhcnRlZEFjdGl2aXR5OworICAgIC8qKiB0cnVlIGlmIHRoZSBhY3Rpdml0eSBpcyBiZWluZyBkZXN0cm95ZWQgaW4gb3JkZXIgdG8gcmVjcmVhdGUgaXQgd2l0aCBhIG5ldyBjb25maWd1cmF0aW9uICovCisgICAgLypwYWNrYWdlKi8gYm9vbGVhbiBtQ2hhbmdpbmdDb25maWd1cmF0aW9ucyA9IGZhbHNlOwogICAgIC8qcGFja2FnZSovIGludCBtQ29uZmlnQ2hhbmdlRmxhZ3M7CiAgICAgLypwYWNrYWdlKi8gQ29uZmlndXJhdGlvbiBtQ3VycmVudENvbmZpZzsKICAgICBwcml2YXRlIFNlYXJjaE1hbmFnZXIgbVNlYXJjaE1hbmFnZXI7CiAKKyAgICBzdGF0aWMgZmluYWwgY2xhc3MgTm9uQ29uZmlndXJhdGlvbkluc3RhbmNlcyB7CisgICAgICAgIE9iamVjdCBhY3Rpdml0eTsKKyAgICAgICAgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4gY2hpbGRyZW47CisgICAgICAgIEFycmF5TGlzdDxGcmFnbWVudD4gZnJhZ21lbnRzOworICAgICAgICBTcGFyc2VBcnJheTxMb2FkZXJNYW5hZ2VySW1wbD4gbG9hZGVyczsKKyAgICB9CisgICAgLyogcGFja2FnZSAqLyBOb25Db25maWd1cmF0aW9uSW5zdGFuY2VzIG1MYXN0Tm9uQ29uZmlndXJhdGlvbkluc3RhbmNlczsKKyAgICAKICAgICBwcml2YXRlIFdpbmRvdyBtV2luZG93OwogCiAgICAgcHJpdmF0ZSBXaW5kb3dNYW5hZ2VyIG1XaW5kb3dNYW5hZ2VyOwpAQCAtNjQ3LDEwICs2NjksMTYgQEAKICAgICAvKnBhY2thZ2UqLyBib29sZWFuIG1XaW5kb3dBZGRlZCA9IGZhbHNlOwogICAgIC8qcGFja2FnZSovIGJvb2xlYW4gbVZpc2libGVGcm9tU2VydmVyID0gZmFsc2U7CiAgICAgLypwYWNrYWdlKi8gYm9vbGVhbiBtVmlzaWJsZUZyb21DbGllbnQgPSB0cnVlOworICAgIC8qcGFja2FnZSovIEFjdGlvbkJhckltcGwgbUFjdGlvbkJhciA9IG51bGw7CiAKICAgICBwcml2YXRlIENoYXJTZXF1ZW5jZSBtVGl0bGU7CiAgICAgcHJpdmF0ZSBpbnQgbVRpdGxlQ29sb3IgPSAwOwogCisgICAgZmluYWwgRnJhZ21lbnRNYW5hZ2VySW1wbCBtRnJhZ21lbnRzID0gbmV3IEZyYWdtZW50TWFuYWdlckltcGwoKTsKKyAgICAKKyAgICBTcGFyc2VBcnJheTxMb2FkZXJNYW5hZ2VySW1wbD4gbUFsbExvYWRlck1hbmFnZXJzOworICAgIExvYWRlck1hbmFnZXJJbXBsIG1Mb2FkZXJNYW5hZ2VyOworICAgIAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGNsYXNzIE1hbmFnZWRDdXJzb3IgewogICAgICAgICBNYW5hZ2VkQ3Vyc29yKEN1cnNvciBjdXJzb3IpIHsKICAgICAgICAgICAgIG1DdXJzb3IgPSBjdXJzb3I7CkBAIC02NzcsMjQgKzcwNSw3IEBACiAgICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnRbXSBGT0NVU0VEX1NUQVRFX1NFVCA9IHtjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmF0dHIuc3RhdGVfZm9jdXNlZH07CiAKICAgICBwcml2YXRlIFRocmVhZCBtVWlUaHJlYWQ7Ci0gICAgcHJpdmF0ZSBmaW5hbCBIYW5kbGVyIG1IYW5kbGVyID0gbmV3IEhhbmRsZXIoKTsKLQotICAgIC8vIFVzZWQgZm9yIGRlYnVnIG9ubHkKLSAgICAvKgotICAgIHB1YmxpYyBBY3Rpdml0eSgpIHsKLSAgICAgICAgKytzSW5zdGFuY2VDb3VudDsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCBmaW5hbGl6ZSgpIHRocm93cyBUaHJvd2FibGUgewotICAgICAgICBzdXBlci5maW5hbGl6ZSgpOwotICAgICAgICAtLXNJbnN0YW5jZUNvdW50OwotICAgIH0KLSAgICAqLwotCi0gICAgcHVibGljIHN0YXRpYyBsb25nIGdldEluc3RhbmNlQ291bnQoKSB7Ci0gICAgICAgIHJldHVybiBzSW5zdGFuY2VDb3VudDsKLSAgICB9CisgICAgZmluYWwgSGFuZGxlciBtSGFuZGxlciA9IG5ldyBIYW5kbGVyKCk7CiAKICAgICAvKiogUmV0dXJuIHRoZSBpbnRlbnQgdGhhdCBzdGFydGVkIHRoaXMgYWN0aXZpdHkuICovCiAgICAgcHVibGljIEludGVudCBnZXRJbnRlbnQoKSB7CkBAIC03NDgsNiArNzU5LDMwIEBACiAgICAgfQogCiAgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBMb2FkZXJNYW5hZ2VyIGZvciB0aGlzIGZyYWdtZW50LCBjcmVhdGluZyBpdCBpZiBuZWVkZWQuCisgICAgICovCisgICAgcHVibGljIExvYWRlck1hbmFnZXIgZ2V0TG9hZGVyTWFuYWdlcigpIHsKKyAgICAgICAgaWYgKG1Mb2FkZXJNYW5hZ2VyICE9IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBtTG9hZGVyTWFuYWdlcjsKKyAgICAgICAgfQorICAgICAgICBtQ2hlY2tlZEZvckxvYWRlck1hbmFnZXIgPSB0cnVlOworICAgICAgICBtTG9hZGVyTWFuYWdlciA9IGdldExvYWRlck1hbmFnZXIoLTEsIG1TdGFydGVkLCB0cnVlKTsKKyAgICAgICAgcmV0dXJuIG1Mb2FkZXJNYW5hZ2VyOworICAgIH0KKyAgICAKKyAgICBMb2FkZXJNYW5hZ2VySW1wbCBnZXRMb2FkZXJNYW5hZ2VyKGludCBpbmRleCwgYm9vbGVhbiBzdGFydGVkLCBib29sZWFuIGNyZWF0ZSkgeworICAgICAgICBpZiAobUFsbExvYWRlck1hbmFnZXJzID09IG51bGwpIHsKKyAgICAgICAgICAgIG1BbGxMb2FkZXJNYW5hZ2VycyA9IG5ldyBTcGFyc2VBcnJheTxMb2FkZXJNYW5hZ2VySW1wbD4oKTsKKyAgICAgICAgfQorICAgICAgICBMb2FkZXJNYW5hZ2VySW1wbCBsbSA9IG1BbGxMb2FkZXJNYW5hZ2Vycy5nZXQoaW5kZXgpOworICAgICAgICBpZiAobG0gPT0gbnVsbCAmJiBjcmVhdGUpIHsKKyAgICAgICAgICAgIGxtID0gbmV3IExvYWRlck1hbmFnZXJJbXBsKHN0YXJ0ZWQpOworICAgICAgICAgICAgbUFsbExvYWRlck1hbmFnZXJzLnB1dChpbmRleCwgbG0pOworICAgICAgICB9CisgICAgICAgIHJldHVybiBsbTsKKyAgICB9CisgICAgCisgICAgLyoqCiAgICAgICogQ2FsbHMge0BsaW5rIGFuZHJvaWQudmlldy5XaW5kb3cjZ2V0Q3VycmVudEZvY3VzfSBvbiB0aGUKICAgICAgKiBXaW5kb3cgb2YgdGhpcyBBY3Rpdml0eSB0byByZXR1cm4gdGhlIGN1cnJlbnRseSBmb2N1c2VkIHZpZXcuCiAgICAgICogCkBAIC04MDEsNiArODM2LDE1IEBACiAgICAgcHJvdGVjdGVkIHZvaWQgb25DcmVhdGUoQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgewogICAgICAgICBtVmlzaWJsZUZyb21DbGllbnQgPSAhbVdpbmRvdy5nZXRXaW5kb3dTdHlsZSgpLmdldEJvb2xlYW4oCiAgICAgICAgICAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZWFibGUuV2luZG93X3dpbmRvd05vRGlzcGxheSwgZmFsc2UpOworICAgICAgICBpZiAobUxhc3ROb25Db25maWd1cmF0aW9uSW5zdGFuY2VzICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1BbGxMb2FkZXJNYW5hZ2VycyA9IG1MYXN0Tm9uQ29uZmlndXJhdGlvbkluc3RhbmNlcy5sb2FkZXJzOworICAgICAgICB9CisgICAgICAgIGlmIChzYXZlZEluc3RhbmNlU3RhdGUgIT0gbnVsbCkgeworICAgICAgICAgICAgUGFyY2VsYWJsZSBwID0gc2F2ZWRJbnN0YW5jZVN0YXRlLmdldFBhcmNlbGFibGUoRlJBR01FTlRTX1RBRyk7CisgICAgICAgICAgICBtRnJhZ21lbnRzLnJlc3RvcmVBbGxTdGF0ZShwLCBtTGFzdE5vbkNvbmZpZ3VyYXRpb25JbnN0YW5jZXMgIT0gbnVsbAorICAgICAgICAgICAgICAgICAgICA/IG1MYXN0Tm9uQ29uZmlndXJhdGlvbkluc3RhbmNlcy5mcmFnbWVudHMgOiBudWxsKTsKKyAgICAgICAgfQorICAgICAgICBtRnJhZ21lbnRzLmRpc3BhdGNoQ3JlYXRlKCk7CiAgICAgICAgIG1DYWxsZWQgPSB0cnVlOwogICAgIH0KIApAQCAtOTMzLDYgKzk3NywxMyBAQAogICAgICAqLwogICAgIHByb3RlY3RlZCB2b2lkIG9uU3RhcnQoKSB7CiAgICAgICAgIG1DYWxsZWQgPSB0cnVlOworICAgICAgICBtU3RhcnRlZCA9IHRydWU7CisgICAgICAgIGlmIChtTG9hZGVyTWFuYWdlciAhPSBudWxsKSB7CisgICAgICAgICAgICBtTG9hZGVyTWFuYWdlci5kb1N0YXJ0KCk7CisgICAgICAgIH0gZWxzZSBpZiAoIW1DaGVja2VkRm9yTG9hZGVyTWFuYWdlcikgeworICAgICAgICAgICAgbUxvYWRlck1hbmFnZXIgPSBnZXRMb2FkZXJNYW5hZ2VyKC0xLCBtU3RhcnRlZCwgZmFsc2UpOworICAgICAgICB9CisgICAgICAgIG1DaGVja2VkRm9yTG9hZGVyTWFuYWdlciA9IHRydWU7CiAgICAgfQogCiAgICAgLyoqCkBAIC0xMDg1LDYgKzExMzYsMTAgQEAKICAgICAgKi8KICAgICBwcm90ZWN0ZWQgdm9pZCBvblNhdmVJbnN0YW5jZVN0YXRlKEJ1bmRsZSBvdXRTdGF0ZSkgewogICAgICAgICBvdXRTdGF0ZS5wdXRCdW5kbGUoV0lORE9XX0hJRVJBUkNIWV9UQUcsIG1XaW5kb3cuc2F2ZUhpZXJhcmNoeVN0YXRlKCkpOworICAgICAgICBQYXJjZWxhYmxlIHAgPSBtRnJhZ21lbnRzLnNhdmVBbGxTdGF0ZSgpOworICAgICAgICBpZiAocCAhPSBudWxsKSB7CisgICAgICAgICAgICBvdXRTdGF0ZS5wdXRQYXJjZWxhYmxlKEZSQUdNRU5UU19UQUcsIHApOworICAgICAgICB9CiAgICAgfQogCiAgICAgLyoqCkBAIC0xNDA4LDcgKzE0NjMsOCBAQAogICAgICAqIHtAbGluayAjb25SZXRhaW5Ob25Db25maWd1cmF0aW9uSW5zdGFuY2UoKX0uCiAgICAgICovCiAgICAgcHVibGljIE9iamVjdCBnZXRMYXN0Tm9uQ29uZmlndXJhdGlvbkluc3RhbmNlKCkgewotICAgICAgICByZXR1cm4gbUxhc3ROb25Db25maWd1cmF0aW9uSW5zdGFuY2U7CisgICAgICAgIHJldHVybiBtTGFzdE5vbkNvbmZpZ3VyYXRpb25JbnN0YW5jZXMgIT0gbnVsbAorICAgICAgICAgICAgICAgID8gbUxhc3ROb25Db25maWd1cmF0aW9uSW5zdGFuY2VzLmFjdGl2aXR5IDogbnVsbDsKICAgICB9CiAgICAgCiAgICAgLyoqCkBAIC0xNDIwLDYgKzE0NzYsMTEgQEAKICAgICAgKiB7QGxpbmsgI2dldExhc3ROb25Db25maWd1cmF0aW9uSW5zdGFuY2UoKX0gaW4gdGhlIG5ldyBhY3Rpdml0eQogICAgICAqIGluc3RhbmNlLgogICAgICAqIAorICAgICAqIDxlbT5JZiB5b3UgYXJlIHRhcmdldGluZyB7QGxpbmsgYW5kcm9pZC5vcy5CdWlsZC5WRVJTSU9OX0NPREVTI0hPTkVZQ09NQn0KKyAgICAgKiBvciBsYXRlciwgY29uc2lkZXIgaW5zdGVhZCB1c2luZyBhIHtAbGluayBGcmFnbWVudH0gd2l0aAorICAgICAqIHtAbGluayBGcmFnbWVudCNzZXRSZXRhaW5JbnN0YW5jZShib29sZWFuKQorICAgICAqIEZyYWdtZW50LnNldFJldGFpbkluc3RhbmNlKGJvb2xlYW59LjwvZW0+CisgICAgICoKICAgICAgKiA8cD5UaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBwdXJlbHkgYXMgYW4gb3B0aW1pemF0aW9uLCBhbmQgeW91IG11c3QKICAgICAgKiBub3QgcmVseSBvbiBpdCBiZWluZyBjYWxsZWQuICBXaGVuIGl0IGlzIGNhbGxlZCwgYSBudW1iZXIgb2YgZ3VhcmFudGVlcwogICAgICAqIHdpbGwgYmUgbWFkZSB0byBoZWxwIG9wdGltaXplIGNvbmZpZ3VyYXRpb24gc3dpdGNoaW5nOgpAQCAtMTQ2NCw4ICsxNTI1LDkgQEAKICAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIG9iamVjdCBwcmV2aW91c2x5IHJldHVybmVkIGJ5CiAgICAgICoge0BsaW5rICNvblJldGFpbk5vbkNvbmZpZ3VyYXRpb25DaGlsZEluc3RhbmNlcygpfQogICAgICAqLwotICAgIEhhc2hNYXA8U3RyaW5nLE9iamVjdD4gZ2V0TGFzdE5vbkNvbmZpZ3VyYXRpb25DaGlsZEluc3RhbmNlcygpIHsKLSAgICAgICAgcmV0dXJuIG1MYXN0Tm9uQ29uZmlndXJhdGlvbkNoaWxkSW5zdGFuY2VzOworICAgIEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+IGdldExhc3ROb25Db25maWd1cmF0aW9uQ2hpbGRJbnN0YW5jZXMoKSB7CisgICAgICAgIHJldHVybiBtTGFzdE5vbkNvbmZpZ3VyYXRpb25JbnN0YW5jZXMgIT0gbnVsbAorICAgICAgICAgICAgICAgID8gbUxhc3ROb25Db25maWd1cmF0aW9uSW5zdGFuY2VzLmNoaWxkcmVuIDogbnVsbDsKICAgICB9CiAgICAgCiAgICAgLyoqCkBAIC0xNDc5LDE3ICsxNTQxLDg4IEBACiAgICAgICAgIHJldHVybiBudWxsOwogICAgIH0KICAgICAKKyAgICBOb25Db25maWd1cmF0aW9uSW5zdGFuY2VzIHJldGFpbk5vbkNvbmZpZ3VyYXRpb25JbnN0YW5jZXMoKSB7CisgICAgICAgIE9iamVjdCBhY3Rpdml0eSA9IG9uUmV0YWluTm9uQ29uZmlndXJhdGlvbkluc3RhbmNlKCk7CisgICAgICAgIEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+IGNoaWxkcmVuID0gb25SZXRhaW5Ob25Db25maWd1cmF0aW9uQ2hpbGRJbnN0YW5jZXMoKTsKKyAgICAgICAgQXJyYXlMaXN0PEZyYWdtZW50PiBmcmFnbWVudHMgPSBtRnJhZ21lbnRzLnJldGFpbk5vbkNvbmZpZygpOworICAgICAgICBib29sZWFuIHJldGFpbkxvYWRlcnMgPSBmYWxzZTsKKyAgICAgICAgaWYgKG1BbGxMb2FkZXJNYW5hZ2VycyAhPSBudWxsKSB7CisgICAgICAgICAgICAvLyBwcnVuZSBvdXQgYW55IGxvYWRlciBtYW5hZ2VycyB0aGF0IHdlcmUgYWxyZWFkeSBzdG9wcGVkIGFuZCBzbworICAgICAgICAgICAgLy8gaGF2ZSBub3RoaW5nIHVzZWZ1bCB0byByZXRhaW4uCisgICAgICAgICAgICBmb3IgKGludCBpPW1BbGxMb2FkZXJNYW5hZ2Vycy5zaXplKCktMTsgaT49MDsgaS0tKSB7CisgICAgICAgICAgICAgICAgTG9hZGVyTWFuYWdlckltcGwgbG0gPSBtQWxsTG9hZGVyTWFuYWdlcnMudmFsdWVBdChpKTsKKyAgICAgICAgICAgICAgICBpZiAobG0ubVJldGFpbmluZykgeworICAgICAgICAgICAgICAgICAgICByZXRhaW5Mb2FkZXJzID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBsbS5kb0Rlc3Ryb3koKTsKKyAgICAgICAgICAgICAgICAgICAgbUFsbExvYWRlck1hbmFnZXJzLnJlbW92ZUF0KGkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoYWN0aXZpdHkgPT0gbnVsbCAmJiBjaGlsZHJlbiA9PSBudWxsICYmIGZyYWdtZW50cyA9PSBudWxsICYmICFyZXRhaW5Mb2FkZXJzKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgTm9uQ29uZmlndXJhdGlvbkluc3RhbmNlcyBuY2kgPSBuZXcgTm9uQ29uZmlndXJhdGlvbkluc3RhbmNlcygpOworICAgICAgICBuY2kuYWN0aXZpdHkgPSBhY3Rpdml0eTsKKyAgICAgICAgbmNpLmNoaWxkcmVuID0gY2hpbGRyZW47CisgICAgICAgIG5jaS5mcmFnbWVudHMgPSBmcmFnbWVudHM7CisgICAgICAgIG5jaS5sb2FkZXJzID0gbUFsbExvYWRlck1hbmFnZXJzOworICAgICAgICByZXR1cm4gbmNpOworICAgIH0KKyAgICAKICAgICBwdWJsaWMgdm9pZCBvbkxvd01lbW9yeSgpIHsKICAgICAgICAgbUNhbGxlZCA9IHRydWU7CiAgICAgfQogICAgIAogICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgRnJhZ21lbnRNYW5hZ2VyIGZvciBpbnRlcmFjdGluZyB3aXRoIGZyYWdtZW50cyBhc3NvY2lhdGVkCisgICAgICogd2l0aCB0aGlzIGFjdGl2aXR5LgorICAgICAqLworICAgIHB1YmxpYyBGcmFnbWVudE1hbmFnZXIgZ2V0RnJhZ21lbnRNYW5hZ2VyKCkgeworICAgICAgICByZXR1cm4gbUZyYWdtZW50czsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTdGFydCBhIHNlcmllcyBvZiBlZGl0IG9wZXJhdGlvbnMgb24gdGhlIEZyYWdtZW50cyBhc3NvY2lhdGVkIHdpdGgKKyAgICAgKiB0aGlzIGFjdGl2aXR5LgorICAgICAqIEBkZXByZWNhdGVkIHVzZSB7QGxpbmsgI2dldEZyYWdtZW50TWFuYWdlcn0uCisgICAgICovCisgICAgQERlcHJlY2F0ZWQKKyAgICBwdWJsaWMgRnJhZ21lbnRUcmFuc2FjdGlvbiBvcGVuRnJhZ21lbnRUcmFuc2FjdGlvbigpIHsKKyAgICAgICAgcmV0dXJuIG1GcmFnbWVudHMub3BlblRyYW5zYWN0aW9uKCk7CisgICAgfQorICAgIAorICAgIHZvaWQgaW52YWxpZGF0ZUZyYWdtZW50SW5kZXgoaW50IGluZGV4KSB7CisgICAgICAgIC8vTG9nLnYoVEFHLCAiaW52YWxpZGF0ZUZyYWdtZW50SW5kZXg6IGluZGV4PSIgKyBpbmRleCk7CisgICAgICAgIGlmIChtQWxsTG9hZGVyTWFuYWdlcnMgIT0gbnVsbCkgeworICAgICAgICAgICAgTG9hZGVyTWFuYWdlckltcGwgbG0gPSBtQWxsTG9hZGVyTWFuYWdlcnMuZ2V0KGluZGV4KTsKKyAgICAgICAgICAgIGlmIChsbSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgbG0uZG9EZXN0cm95KCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtQWxsTG9hZGVyTWFuYWdlcnMucmVtb3ZlKGluZGV4KTsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBDYWxsZWQgd2hlbiBhIEZyYWdtZW50IGlzIGJlaW5nIGF0dGFjaGVkIHRvIHRoaXMgYWN0aXZpdHksIGltbWVkaWF0ZWx5CisgICAgICogYWZ0ZXIgdGhlIGNhbGwgdG8gaXRzIHtAbGluayBGcmFnbWVudCNvbkF0dGFjaCBGcmFnbWVudC5vbkF0dGFjaCgpfQorICAgICAqIG1ldGhvZCBhbmQgYmVmb3JlIHtAbGluayBGcmFnbWVudCNvbkNyZWF0ZSBGcmFnbWVudC5vbkNyZWF0ZSgpfS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBvbkF0dGFjaEZyYWdtZW50KEZyYWdtZW50IGZyYWdtZW50KSB7CisgICAgfQorICAgIAorICAgIC8qKgogICAgICAqIFdyYXBwZXIgYXJvdW5kCiAgICAgICoge0BsaW5rIENvbnRlbnRSZXNvbHZlciNxdWVyeShhbmRyb2lkLm5ldC5VcmkgLCBTdHJpbmdbXSwgU3RyaW5nLCBTdHJpbmdbXSwgU3RyaW5nKX0KICAgICAgKiB0aGF0IGdpdmVzIHRoZSByZXN1bHRpbmcge0BsaW5rIEN1cnNvcn0gdG8gY2FsbAogICAgICAqIHtAbGluayAjc3RhcnRNYW5hZ2luZ0N1cnNvcn0gc28gdGhhdCB0aGUgYWN0aXZpdHkgd2lsbCBtYW5hZ2UgaXRzCiAgICAgICogbGlmZWN5Y2xlIGZvciB5b3UuCiAgICAgICogCisgICAgICogPGVtPklmIHlvdSBhcmUgdGFyZ2V0aW5nIHtAbGluayBhbmRyb2lkLm9zLkJ1aWxkLlZFUlNJT05fQ09ERVMjSE9ORVlDT01CfQorICAgICAqIG9yIGxhdGVyLCBjb25zaWRlciBpbnN0ZWFkIHVzaW5nIHtAbGluayBMb2FkZXJNYW5hZ2VyfSBpbnN0ZWFkLCBhdmFpbGFibGUKKyAgICAgKiB2aWEge0BsaW5rICNnZXRMb2FkZXJNYW5hZ2VyKCl9LjwvZW0+CisgICAgICoKICAgICAgKiBAcGFyYW0gdXJpIFRoZSBVUkkgb2YgdGhlIGNvbnRlbnQgcHJvdmlkZXIgdG8gcXVlcnkuCiAgICAgICogQHBhcmFtIHByb2plY3Rpb24gTGlzdCBvZiBjb2x1bW5zIHRvIHJldHVybi4KICAgICAgKiBAcGFyYW0gc2VsZWN0aW9uIFNRTCBXSEVSRSBjbGF1c2UuCkBAIC0xNTAwLDEyICsxNjMzLDEyIEBACiAgICAgICogQHNlZSBDb250ZW50UmVzb2x2ZXIjcXVlcnkoYW5kcm9pZC5uZXQuVXJpICwgU3RyaW5nW10sIFN0cmluZywgU3RyaW5nW10sIFN0cmluZykKICAgICAgKiBAc2VlICNzdGFydE1hbmFnaW5nQ3Vyc29yCiAgICAgICogQGhpZGUKKyAgICAgKgorICAgICAqIEBkZXByZWNhdGVkIFVzZSB7QGxpbmsgQ3Vyc29yTG9hZGVyfSBpbnN0ZWFkLgogICAgICAqLwotICAgIHB1YmxpYyBmaW5hbCBDdXJzb3IgbWFuYWdlZFF1ZXJ5KFVyaSB1cmksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nW10gcHJvamVjdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgc2VsZWN0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBzb3J0T3JkZXIpCi0gICAgeworICAgIEBEZXByZWNhdGVkCisgICAgcHVibGljIGZpbmFsIEN1cnNvciBtYW5hZ2VkUXVlcnkoVXJpIHVyaSwgU3RyaW5nW10gcHJvamVjdGlvbiwgU3RyaW5nIHNlbGVjdGlvbiwKKyAgICAgICAgICAgIFN0cmluZyBzb3J0T3JkZXIpIHsKICAgICAgICAgQ3Vyc29yIGMgPSBnZXRDb250ZW50UmVzb2x2ZXIoKS5xdWVyeSh1cmksIHByb2plY3Rpb24sIHNlbGVjdGlvbiwgbnVsbCwgc29ydE9yZGVyKTsKICAgICAgICAgaWYgKGMgIT0gbnVsbCkgewogICAgICAgICAgICAgc3RhcnRNYW5hZ2luZ0N1cnNvcihjKTsKQEAgLTE1MjAsNiArMTY1MywxMCBAQAogICAgICAqIHtAbGluayAjc3RhcnRNYW5hZ2luZ0N1cnNvcn0gc28gdGhhdCB0aGUgYWN0aXZpdHkgd2lsbCBtYW5hZ2UgaXRzCiAgICAgICogbGlmZWN5Y2xlIGZvciB5b3UuCiAgICAgICogCisgICAgICogPGVtPklmIHlvdSBhcmUgdGFyZ2V0aW5nIHtAbGluayBhbmRyb2lkLm9zLkJ1aWxkLlZFUlNJT05fQ09ERVMjSE9ORVlDT01CfQorICAgICAqIG9yIGxhdGVyLCBjb25zaWRlciBpbnN0ZWFkIHVzaW5nIHtAbGluayBMb2FkZXJNYW5hZ2VyfSBpbnN0ZWFkLCBhdmFpbGFibGUKKyAgICAgKiB2aWEge0BsaW5rICNnZXRMb2FkZXJNYW5hZ2VyKCl9LjwvZW0+CisgICAgICoKICAgICAgKiBAcGFyYW0gdXJpIFRoZSBVUkkgb2YgdGhlIGNvbnRlbnQgcHJvdmlkZXIgdG8gcXVlcnkuCiAgICAgICogQHBhcmFtIHByb2plY3Rpb24gTGlzdCBvZiBjb2x1bW5zIHRvIHJldHVybi4KICAgICAgKiBAcGFyYW0gc2VsZWN0aW9uIFNRTCBXSEVSRSBjbGF1c2UuCkBAIC0xNTMwLDEzICsxNjY3LDEyIEBACiAgICAgICogCiAgICAgICogQHNlZSBDb250ZW50UmVzb2x2ZXIjcXVlcnkoYW5kcm9pZC5uZXQuVXJpICwgU3RyaW5nW10sIFN0cmluZywgU3RyaW5nW10sIFN0cmluZykKICAgICAgKiBAc2VlICNzdGFydE1hbmFnaW5nQ3Vyc29yCisgICAgICoKKyAgICAgKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rIEN1cnNvckxvYWRlcn0gaW5zdGVhZC4KICAgICAgKi8KLSAgICBwdWJsaWMgZmluYWwgQ3Vyc29yIG1hbmFnZWRRdWVyeShVcmkgdXJpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1tdIHByb2plY3Rpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHNlbGVjdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdbXSBzZWxlY3Rpb25BcmdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBzb3J0T3JkZXIpCi0gICAgeworICAgIEBEZXByZWNhdGVkCisgICAgcHVibGljIGZpbmFsIEN1cnNvciBtYW5hZ2VkUXVlcnkoVXJpIHVyaSwgU3RyaW5nW10gcHJvamVjdGlvbiwgU3RyaW5nIHNlbGVjdGlvbiwKKyAgICAgICAgICAgIFN0cmluZ1tdIHNlbGVjdGlvbkFyZ3MsIFN0cmluZyBzb3J0T3JkZXIpIHsKICAgICAgICAgQ3Vyc29yIGMgPSBnZXRDb250ZW50UmVzb2x2ZXIoKS5xdWVyeSh1cmksIHByb2plY3Rpb24sIHNlbGVjdGlvbiwgc2VsZWN0aW9uQXJncywgc29ydE9yZGVyKTsKICAgICAgICAgaWYgKGMgIT0gbnVsbCkgewogICAgICAgICAgICAgc3RhcnRNYW5hZ2luZ0N1cnNvcihjKTsKQEAgLTE1NDUsNDAgKzE2ODEsNiBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFdyYXBwZXIgYXJvdW5kIHtAbGluayBDdXJzb3IjY29tbWl0VXBkYXRlcygpfSB0aGF0IHRha2VzIGNhcmUgb2Ygbm90aW5nCi0gICAgICogdGhhdCB0aGUgQ3Vyc29yIG5lZWRzIHRvIGJlIHJlcXVlcmllZC4gIFlvdSBjYW4gY2FsbCB0aGlzIG1ldGhvZCBpbgotICAgICAqIHtAbGluayAjb25QYXVzZX0gb3Ige0BsaW5rICNvblN0b3B9IHRvIGhhdmUgdGhlIHN5c3RlbSBjYWxsCi0gICAgICoge0BsaW5rIEN1cnNvciNyZXF1ZXJ5fSBmb3IgeW91IGlmIHRoZSBhY3Rpdml0eSBpcyBsYXRlciByZXN1bWVkLiAgVGhpcwotICAgICAqIGFsbG93cyB5b3UgdG8gYXZvaWQgZGV0ZXJtaW5nIHdoZW4gdG8gZG8gdGhlIHJlcXVlcnkgeW91cnNlbGYgKHdoaWNoIGlzCi0gICAgICogcmVxdWlyZWQgZm9yIHRoZSBDdXJzb3IgdG8gc2VlIGFueSBkYXRhIGNoYW5nZXMgdGhhdCB3ZXJlIGNvbW1pdHRlZCB3aXRoCi0gICAgICogaXQpLgotICAgICAqIAotICAgICAqIEBwYXJhbSBjIFRoZSBDdXJzb3Igd2hvc2UgY2hhbmdlcyBhcmUgdG8gYmUgY29tbWl0dGVkLgotICAgICAqIAotICAgICAqIEBzZWUgI21hbmFnZWRRdWVyeShhbmRyb2lkLm5ldC5VcmkgLCBTdHJpbmdbXSwgU3RyaW5nLCBTdHJpbmdbXSwgU3RyaW5nKQotICAgICAqIEBzZWUgI3N0YXJ0TWFuYWdpbmdDdXJzb3IKLSAgICAgKiBAc2VlIEN1cnNvciNjb21taXRVcGRhdGVzKCkKLSAgICAgKiBAc2VlIEN1cnNvciNyZXF1ZXJ5Ci0gICAgICogQGhpZGUKLSAgICAgKi8KLSAgICBARGVwcmVjYXRlZAotICAgIHB1YmxpYyB2b2lkIG1hbmFnZWRDb21taXRVcGRhdGVzKEN1cnNvciBjKSB7Ci0gICAgICAgIHN5bmNocm9uaXplZCAobU1hbmFnZWRDdXJzb3JzKSB7Ci0gICAgICAgICAgICBmaW5hbCBpbnQgTiA9IG1NYW5hZ2VkQ3Vyc29ycy5zaXplKCk7Ci0gICAgICAgICAgICBmb3IgKGludCBpPTA7IGk8TjsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgTWFuYWdlZEN1cnNvciBtYyA9IG1NYW5hZ2VkQ3Vyc29ycy5nZXQoaSk7Ci0gICAgICAgICAgICAgICAgaWYgKG1jLm1DdXJzb3IgPT0gYykgewotICAgICAgICAgICAgICAgICAgICBjLmNvbW1pdFVwZGF0ZXMoKTsKLSAgICAgICAgICAgICAgICAgICAgbWMubVVwZGF0ZWQgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgIkN1cnNvciAiICsgYyArICIgaXMgbm90IGN1cnJlbnRseSBtYW5hZ2VkIik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKICAgICAgKiBUaGlzIG1ldGhvZCBhbGxvd3MgdGhlIGFjdGl2aXR5IHRvIHRha2UgY2FyZSBvZiBtYW5hZ2luZyB0aGUgZ2l2ZW4KICAgICAgKiB7QGxpbmsgQ3Vyc29yfSdzIGxpZmVjeWNsZSBmb3IgeW91IGJhc2VkIG9uIHRoZSBhY3Rpdml0eSdzIGxpZmVjeWNsZS4KICAgICAgKiBUaGF0IGlzLCB3aGVuIHRoZSBhY3Rpdml0eSBpcyBzdG9wcGVkIGl0IHdpbGwgYXV0b21hdGljYWxseSBjYWxsCkBAIC0xNTg2LDExICsxNjg4LDE4IEBACiAgICAgICogaXQgd2lsbCBjYWxsIHtAbGluayBDdXJzb3IjcmVxdWVyeX0gZm9yIHlvdS4gIFdoZW4gdGhlIGFjdGl2aXR5IGlzCiAgICAgICogZGVzdHJveWVkLCBhbGwgbWFuYWdlZCBDdXJzb3JzIHdpbGwgYmUgY2xvc2VkIGF1dG9tYXRpY2FsbHkuCiAgICAgICogCisgICAgICogPGVtPklmIHlvdSBhcmUgdGFyZ2V0aW5nIHtAbGluayBhbmRyb2lkLm9zLkJ1aWxkLlZFUlNJT05fQ09ERVMjSE9ORVlDT01CfQorICAgICAqIG9yIGxhdGVyLCBjb25zaWRlciBpbnN0ZWFkIHVzaW5nIHtAbGluayBMb2FkZXJNYW5hZ2VyfSBpbnN0ZWFkLCBhdmFpbGFibGUKKyAgICAgKiB2aWEge0BsaW5rICNnZXRMb2FkZXJNYW5hZ2VyKCl9LjwvZW0+CisgICAgICoKICAgICAgKiBAcGFyYW0gYyBUaGUgQ3Vyc29yIHRvIGJlIG1hbmFnZWQuCiAgICAgICogCiAgICAgICogQHNlZSAjbWFuYWdlZFF1ZXJ5KGFuZHJvaWQubmV0LlVyaSAsIFN0cmluZ1tdLCBTdHJpbmcsIFN0cmluZ1tdLCBTdHJpbmcpCiAgICAgICogQHNlZSAjc3RvcE1hbmFnaW5nQ3Vyc29yCisgICAgICoKKyAgICAgKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rIEN1cnNvckxvYWRlcn0gaW5zdGVhZC4KICAgICAgKi8KKyAgICBARGVwcmVjYXRlZAogICAgIHB1YmxpYyB2b2lkIHN0YXJ0TWFuYWdpbmdDdXJzb3IoQ3Vyc29yIGMpIHsKICAgICAgICAgc3luY2hyb25pemVkIChtTWFuYWdlZEN1cnNvcnMpIHsKICAgICAgICAgICAgIG1NYW5hZ2VkQ3Vyc29ycy5hZGQobmV3IE1hbmFnZWRDdXJzb3IoYykpOwpAQCAtMTYwNSw3ICsxNzE0LDEwIEBACiAgICAgICogQHBhcmFtIGMgVGhlIEN1cnNvciB0aGF0IHdhcyBiZWluZyBtYW5hZ2VkLgogICAgICAqIAogICAgICAqIEBzZWUgI3N0YXJ0TWFuYWdpbmdDdXJzb3IKKyAgICAgKgorICAgICAqIEBkZXByZWNhdGVkIFVzZSB7QGxpbmsgQ3Vyc29yTG9hZGVyfSBpbnN0ZWFkLgogICAgICAqLworICAgIEBEZXByZWNhdGVkCiAgICAgcHVibGljIHZvaWQgc3RvcE1hbmFnaW5nQ3Vyc29yKEN1cnNvciBjKSB7CiAgICAgICAgIHN5bmNocm9uaXplZCAobU1hbmFnZWRDdXJzb3JzKSB7CiAgICAgICAgICAgICBmaW5hbCBpbnQgTiA9IG1NYW5hZ2VkQ3Vyc29ycy5zaXplKCk7CkBAIC0xNjYwLDcgKzE3NzIsNTQgQEAKICAgICBwdWJsaWMgVmlldyBmaW5kVmlld0J5SWQoaW50IGlkKSB7CiAgICAgICAgIHJldHVybiBnZXRXaW5kb3coKS5maW5kVmlld0J5SWQoaWQpOwogICAgIH0KLQorICAgIAorICAgIC8qKgorICAgICAqIFJldHJpZXZlIGEgcmVmZXJlbmNlIHRvIHRoaXMgYWN0aXZpdHkncyBBY3Rpb25CYXIuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFRoZSBBY3Rpdml0eSdzIEFjdGlvbkJhciwgb3IgbnVsbCBpZiBpdCBkb2VzIG5vdCBoYXZlIG9uZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgQWN0aW9uQmFyIGdldEFjdGlvbkJhcigpIHsKKyAgICAgICAgaW5pdEFjdGlvbkJhcigpOworICAgICAgICByZXR1cm4gbUFjdGlvbkJhcjsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIG5ldyBBY3Rpb25CYXIsIGxvY2F0ZXMgdGhlIGluZmxhdGVkIEFjdGlvbkJhclZpZXcsCisgICAgICogaW5pdGlhbGl6ZXMgdGhlIEFjdGlvbkJhciB3aXRoIHRoZSB2aWV3LCBhbmQgc2V0cyBtQWN0aW9uQmFyLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBpbml0QWN0aW9uQmFyKCkgeworICAgICAgICBXaW5kb3cgd2luZG93ID0gZ2V0V2luZG93KCk7CisgICAgICAgIGlmIChpc0NoaWxkKCkgfHwgIXdpbmRvdy5oYXNGZWF0dXJlKFdpbmRvdy5GRUFUVVJFX0FDVElPTl9CQVIpIHx8IG1BY3Rpb25CYXIgIT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBtQWN0aW9uQmFyID0gbmV3IEFjdGlvbkJhckltcGwodGhpcyk7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIEZpbmRzIGEgZnJhZ21lbnQgdGhhdCB3YXMgaWRlbnRpZmllZCBieSB0aGUgZ2l2ZW4gaWQgZWl0aGVyIHdoZW4gaW5mbGF0ZWQKKyAgICAgKiBmcm9tIFhNTCBvciBhcyB0aGUgY29udGFpbmVyIElEIHdoZW4gYWRkZWQgaW4gYSB0cmFuc2FjdGlvbi4gIFRoaXMgb25seQorICAgICAqIHJldHVybnMgZnJhZ21lbnRzIHRoYXQgYXJlIGN1cnJlbnRseSBhZGRlZCB0byB0aGUgYWN0aXZpdHkncyBjb250ZW50LgorICAgICAqIEByZXR1cm4gVGhlIGZyYWdtZW50IGlmIGZvdW5kIG9yIG51bGwgb3RoZXJ3aXNlLgorICAgICAqIEBkZXByZWNhdGVkIHVzZSB7QGxpbmsgI2dldEZyYWdtZW50TWFuYWdlcn0uCisgICAgICovCisgICAgQERlcHJlY2F0ZWQKKyAgICBwdWJsaWMgRnJhZ21lbnQgZmluZEZyYWdtZW50QnlJZChpbnQgaWQpIHsKKyAgICAgICAgcmV0dXJuIG1GcmFnbWVudHMuZmluZEZyYWdtZW50QnlJZChpZCk7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIEZpbmRzIGEgZnJhZ21lbnQgdGhhdCB3YXMgaWRlbnRpZmllZCBieSB0aGUgZ2l2ZW4gdGFnIGVpdGhlciB3aGVuIGluZmxhdGVkCisgICAgICogZnJvbSBYTUwgb3IgYXMgc3VwcGxpZWQgd2hlbiBhZGRlZCBpbiBhIHRyYW5zYWN0aW9uLiAgVGhpcyBvbmx5CisgICAgICogcmV0dXJucyBmcmFnbWVudHMgdGhhdCBhcmUgY3VycmVudGx5IGFkZGVkIHRvIHRoZSBhY3Rpdml0eSdzIGNvbnRlbnQuCisgICAgICogQHJldHVybiBUaGUgZnJhZ21lbnQgaWYgZm91bmQgb3IgbnVsbCBvdGhlcndpc2UuCisgICAgICogQGRlcHJlY2F0ZWQgdXNlIHtAbGluayAjZ2V0RnJhZ21lbnRNYW5hZ2VyfS4KKyAgICAgKi8KKyAgICBARGVwcmVjYXRlZAorICAgIHB1YmxpYyBGcmFnbWVudCBmaW5kRnJhZ21lbnRCeVRhZyhTdHJpbmcgdGFnKSB7CisgICAgICAgIHJldHVybiBtRnJhZ21lbnRzLmZpbmRGcmFnbWVudEJ5VGFnKHRhZyk7CisgICAgfQorICAgIAogICAgIC8qKgogICAgICAqIFNldCB0aGUgYWN0aXZpdHkgY29udGVudCBmcm9tIGEgbGF5b3V0IHJlc291cmNlLiAgVGhlIHJlc291cmNlIHdpbGwgYmUKICAgICAgKiBpbmZsYXRlZCwgYWRkaW5nIGFsbCB0b3AtbGV2ZWwgdmlld3MgdG8gdGhlIGFjdGl2aXR5LgpAQCAtMTY2OSw2ICsxODI4LDcgQEAKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXRDb250ZW50VmlldyhpbnQgbGF5b3V0UmVzSUQpIHsKICAgICAgICAgZ2V0V2luZG93KCkuc2V0Q29udGVudFZpZXcobGF5b3V0UmVzSUQpOworICAgICAgICBpbml0QWN0aW9uQmFyKCk7CiAgICAgfQogCiAgICAgLyoqCkBAIC0xNjgwLDYgKzE4NDAsNyBAQAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldENvbnRlbnRWaWV3KFZpZXcgdmlldykgewogICAgICAgICBnZXRXaW5kb3coKS5zZXRDb250ZW50Vmlldyh2aWV3KTsKKyAgICAgICAgaW5pdEFjdGlvbkJhcigpOwogICAgIH0KIAogICAgIC8qKgpAQCAtMTY5Miw2ICsxODUzLDcgQEAKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXRDb250ZW50VmlldyhWaWV3IHZpZXcsIFZpZXdHcm91cC5MYXlvdXRQYXJhbXMgcGFyYW1zKSB7CiAgICAgICAgIGdldFdpbmRvdygpLnNldENvbnRlbnRWaWV3KHZpZXcsIHBhcmFtcyk7CisgICAgICAgIGluaXRBY3Rpb25CYXIoKTsKICAgICB9CiAKICAgICAvKioKQEAgLTE3MDMsNiArMTg2NSw3IEBACiAgICAgICovCiAgICAgcHVibGljIHZvaWQgYWRkQ29udGVudFZpZXcoVmlldyB2aWV3LCBWaWV3R3JvdXAuTGF5b3V0UGFyYW1zIHBhcmFtcykgewogICAgICAgICBnZXRXaW5kb3coKS5hZGRDb250ZW50Vmlldyh2aWV3LCBwYXJhbXMpOworICAgICAgICBpbml0QWN0aW9uQmFyKCk7CiAgICAgfQogCiAgICAgLyoqCkBAIC0xOTI2LDEyICsyMDg5LDY1IEBACiAgICAgfQogICAgIAogICAgIC8qKgorICAgICAqIEZsYWcgZm9yIHtAbGluayAjcG9wQmFja1N0YWNrKFN0cmluZywgaW50KX0KKyAgICAgKiBhbmQge0BsaW5rICNwb3BCYWNrU3RhY2soaW50LCBpbnQpfTogSWYgc2V0LCBhbmQgdGhlIG5hbWUgb3IgSUQgb2YKKyAgICAgKiBhIGJhY2sgc3RhY2sgZW50cnkgaGFzIGJlZW4gc3VwcGxpZWQsIHRoZW4gYWxsIG1hdGNoaW5nIGVudHJpZXMgd2lsbAorICAgICAqIGJlIGNvbnN1bWVkIHVudGlsIG9uZSB0aGF0IGRvZXNuJ3QgbWF0Y2ggaXMgZm91bmQgb3IgdGhlIGJvdHRvbSBvZgorICAgICAqIHRoZSBzdGFjayBpcyByZWFjaGVkLiAgT3RoZXJ3aXNlLCBhbGwgZW50cmllcyB1cCB0byBidXQgbm90IGluY2x1ZGluZyB0aGF0IGVudHJ5CisgICAgICogd2lsbCBiZSByZW1vdmVkLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBPUF9CQUNLX1NUQUNLX0lOQ0xVU0lWRSA9IDE8PDA7CisKKyAgICAvKioKKyAgICAgKiBQb3AgdGhlIHRvcCBzdGF0ZSBvZmYgdGhlIGJhY2sgc3RhY2suICBSZXR1cm5zIHRydWUgaWYgdGhlcmUgd2FzIG9uZQorICAgICAqIHRvIHBvcCwgZWxzZSBmYWxzZS4KKyAgICAgKiBAZGVwcmVjYXRlZCB1c2Uge0BsaW5rICNnZXRGcmFnbWVudE1hbmFnZXJ9LgorICAgICAqLworICAgIEBEZXByZWNhdGVkCisgICAgcHVibGljIGJvb2xlYW4gcG9wQmFja1N0YWNrKCkgeworICAgICAgICByZXR1cm4gbUZyYWdtZW50cy5wb3BCYWNrU3RhY2soKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQb3AgdGhlIGxhc3QgZnJhZ21lbnQgdHJhbnNpdGlvbiBmcm9tIHRoZSBsb2NhbCBhY3Rpdml0eSdzIGZyYWdtZW50CisgICAgICogYmFjayBzdGFjay4gIElmIHRoZXJlIGlzIG5vdGhpbmcgdG8gcG9wLCBmYWxzZSBpcyByZXR1cm5lZC4KKyAgICAgKiBAcGFyYW0gbmFtZSBJZiBub24tbnVsbCwgdGhpcyBpcyB0aGUgbmFtZSBvZiBhIHByZXZpb3VzIGJhY2sgc3RhdGUKKyAgICAgKiB0byBsb29rIGZvcjsgaWYgZm91bmQsIGFsbCBzdGF0ZXMgdXAgdG8gdGhhdCBzdGF0ZSB3aWxsIGJlIHBvcHBlZC4gIFRoZQorICAgICAqIHtAbGluayAjUE9QX0JBQ0tfU1RBQ0tfSU5DTFVTSVZFfSBmbGFnIGNhbiBiZSB1c2VkIHRvIGNvbnRyb2wgd2hldGhlcgorICAgICAqIHRoZSBuYW1lZCBzdGF0ZSBpdHNlbGYgaXMgcG9wcGVkLiBJZiBudWxsLCBvbmx5IHRoZSB0b3Agc3RhdGUgaXMgcG9wcGVkLgorICAgICAqIEBwYXJhbSBmbGFncyBFaXRoZXIgMCBvciB7QGxpbmsgI1BPUF9CQUNLX1NUQUNLX0lOQ0xVU0lWRX0uCisgICAgICogQGRlcHJlY2F0ZWQgdXNlIHtAbGluayAjZ2V0RnJhZ21lbnRNYW5hZ2VyfS4KKyAgICAgKi8KKyAgICBARGVwcmVjYXRlZAorICAgIHB1YmxpYyBib29sZWFuIHBvcEJhY2tTdGFjayhTdHJpbmcgbmFtZSwgaW50IGZsYWdzKSB7CisgICAgICAgIHJldHVybiBtRnJhZ21lbnRzLnBvcEJhY2tTdGFjayhuYW1lLCBmbGFncyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUG9wIGFsbCBiYWNrIHN0YWNrIHN0YXRlcyB1cCB0byB0aGUgb25lIHdpdGggdGhlIGdpdmVuIGlkZW50aWZpZXIuCisgICAgICogQHBhcmFtIGlkIElkZW50aWZpZXIgb2YgdGhlIHN0YXRlZCB0byBiZSBwb3BwZWQuIElmIG5vIGlkZW50aWZpZXIgZXhpc3RzLAorICAgICAqIGZhbHNlIGlzIHJldHVybmVkLgorICAgICAqIFRoZSBpZGVudGlmaWVyIGlzIHRoZSBudW1iZXIgcmV0dXJuZWQgYnkKKyAgICAgKiB7QGxpbmsgRnJhZ21lbnRUcmFuc2FjdGlvbiNjb21taXQoKSBGcmFnbWVudFRyYW5zYWN0aW9uLmNvbW1pdCgpfS4gIFRoZQorICAgICAqIHtAbGluayAjUE9QX0JBQ0tfU1RBQ0tfSU5DTFVTSVZFfSBmbGFnIGNhbiBiZSB1c2VkIHRvIGNvbnRyb2wgd2hldGhlcgorICAgICAqIHRoZSBuYW1lZCBzdGF0ZSBpdHNlbGYgaXMgcG9wcGVkLgorICAgICAqIEBwYXJhbSBmbGFncyBFaXRoZXIgMCBvciB7QGxpbmsgI1BPUF9CQUNLX1NUQUNLX0lOQ0xVU0lWRX0uCisgICAgICogQGRlcHJlY2F0ZWQgdXNlIHtAbGluayAjZ2V0RnJhZ21lbnRNYW5hZ2VyfS4KKyAgICAgKi8KKyAgICBARGVwcmVjYXRlZAorICAgIHB1YmxpYyBib29sZWFuIHBvcEJhY2tTdGFjayhpbnQgaWQsIGludCBmbGFncykgeworICAgICAgICByZXR1cm4gbUZyYWdtZW50cy5wb3BCYWNrU3RhY2soaWQsIGZsYWdzKTsKKyAgICB9CisgICAgCisgICAgLyoqCiAgICAgICogQ2FsbGVkIHdoZW4gdGhlIGFjdGl2aXR5IGhhcyBkZXRlY3RlZCB0aGUgdXNlcidzIHByZXNzIG9mIHRoZSBiYWNrCiAgICAgICoga2V5LiAgVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gc2ltcGx5IGZpbmlzaGVzIHRoZSBjdXJyZW50IGFjdGl2aXR5LAogICAgICAqIGJ1dCB5b3UgY2FuIG92ZXJyaWRlIHRoaXMgdG8gZG8gd2hhdGV2ZXIgeW91IHdhbnQuCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgb25CYWNrUHJlc3NlZCgpIHsKLSAgICAgICAgZmluaXNoKCk7CisgICAgICAgIGlmICghbUZyYWdtZW50cy5wb3BCYWNrU3RhY2soKSkgeworICAgICAgICAgICAgZmluaXNoKCk7CisgICAgICAgIH0KICAgICB9CiAgICAgCiAgICAgLyoqCkBAIC0yMTY5LDcgKzIzODUsOSBAQAogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIG9uQ3JlYXRlUGFuZWxNZW51KGludCBmZWF0dXJlSWQsIE1lbnUgbWVudSkgewogICAgICAgICBpZiAoZmVhdHVyZUlkID09IFdpbmRvdy5GRUFUVVJFX09QVElPTlNfUEFORUwpIHsKLSAgICAgICAgICAgIHJldHVybiBvbkNyZWF0ZU9wdGlvbnNNZW51KG1lbnUpOworICAgICAgICAgICAgYm9vbGVhbiBzaG93ID0gb25DcmVhdGVPcHRpb25zTWVudShtZW51KTsKKyAgICAgICAgICAgIHNob3cgfD0gbUZyYWdtZW50cy5kaXNwYXRjaENyZWF0ZU9wdGlvbnNNZW51KG1lbnUsIGdldE1lbnVJbmZsYXRlcigpKTsKKyAgICAgICAgICAgIHJldHVybiBzaG93OwogICAgICAgICB9CiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CkBAIC0yMTg2LDYgKzI0MDQsNyBAQAogICAgIHB1YmxpYyBib29sZWFuIG9uUHJlcGFyZVBhbmVsKGludCBmZWF0dXJlSWQsIFZpZXcgdmlldywgTWVudSBtZW51KSB7CiAgICAgICAgIGlmIChmZWF0dXJlSWQgPT0gV2luZG93LkZFQVRVUkVfT1BUSU9OU19QQU5FTCAmJiBtZW51ICE9IG51bGwpIHsKICAgICAgICAgICAgIGJvb2xlYW4gZ29mb3JpdCA9IG9uUHJlcGFyZU9wdGlvbnNNZW51KG1lbnUpOworICAgICAgICAgICAgZ29mb3JpdCB8PSBtRnJhZ21lbnRzLmRpc3BhdGNoUHJlcGFyZU9wdGlvbnNNZW51KG1lbnUpOwogICAgICAgICAgICAgcmV0dXJuIGdvZm9yaXQgJiYgbWVudS5oYXNWaXNpYmxlSXRlbXMoKTsKICAgICAgICAgfQogICAgICAgICByZXR1cm4gdHJ1ZTsKQEAgLTIyMTYsMTEgKzI0MzUsMTcgQEAKICAgICAgICAgICAgICAgICAvLyBkb2Vzbid0IGNhbGwgdGhyb3VnaCB0byBzdXBlcmNsYXNzJ3MgaW1wbG1lZW50YXRpb24gb2YgZWFjaAogICAgICAgICAgICAgICAgIC8vIG9mIHRoZXNlIG1ldGhvZHMgYmVsb3cKICAgICAgICAgICAgICAgICBFdmVudExvZy53cml0ZUV2ZW50KDUwMDAwLCAwLCBpdGVtLmdldFRpdGxlQ29uZGVuc2VkKCkpOwotICAgICAgICAgICAgICAgIHJldHVybiBvbk9wdGlvbnNJdGVtU2VsZWN0ZWQoaXRlbSk7CisgICAgICAgICAgICAgICAgaWYgKG9uT3B0aW9uc0l0ZW1TZWxlY3RlZChpdGVtKSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIG1GcmFnbWVudHMuZGlzcGF0Y2hPcHRpb25zSXRlbVNlbGVjdGVkKGl0ZW0pOwogICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgY2FzZSBXaW5kb3cuRkVBVFVSRV9DT05URVhUX01FTlU6CiAgICAgICAgICAgICAgICAgRXZlbnRMb2cud3JpdGVFdmVudCg1MDAwMCwgMSwgaXRlbS5nZXRUaXRsZUNvbmRlbnNlZCgpKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gb25Db250ZXh0SXRlbVNlbGVjdGVkKGl0ZW0pOworICAgICAgICAgICAgICAgIGlmIChvbkNvbnRleHRJdGVtU2VsZWN0ZWQoaXRlbSkpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBtRnJhZ21lbnRzLmRpc3BhdGNoQ29udGV4dEl0ZW1TZWxlY3RlZChpdGVtKTsKICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwpAQCAtMjIzOSw2ICsyNDY0LDcgQEAKICAgICBwdWJsaWMgdm9pZCBvblBhbmVsQ2xvc2VkKGludCBmZWF0dXJlSWQsIE1lbnUgbWVudSkgewogICAgICAgICBzd2l0Y2ggKGZlYXR1cmVJZCkgewogICAgICAgICAgICAgY2FzZSBXaW5kb3cuRkVBVFVSRV9PUFRJT05TX1BBTkVMOgorICAgICAgICAgICAgICAgIG1GcmFnbWVudHMuZGlzcGF0Y2hPcHRpb25zTWVudUNsb3NlZChtZW51KTsKICAgICAgICAgICAgICAgICBvbk9wdGlvbnNNZW51Q2xvc2VkKG1lbnUpOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIApAQCAtMjI0OSw2ICsyNDc1LDE1IEBACiAgICAgfQogCiAgICAgLyoqCisgICAgICogRGVjbGFyZSB0aGF0IHRoZSBvcHRpb25zIG1lbnUgaGFzIGNoYW5nZWQsIHNvIHNob3VsZCBiZSByZWNyZWF0ZWQuCisgICAgICogVGhlIHtAbGluayAjb25DcmVhdGVPcHRpb25zTWVudShNZW51KX0gbWV0aG9kIHdpbGwgYmUgY2FsbGVkIHRoZSBuZXh0CisgICAgICogdGltZSBpdCBuZWVkcyB0byBiZSBkaXNwbGF5ZWQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgaW52YWxpZGF0ZU9wdGlvbnNNZW51KCkgeworICAgICAgICBtV2luZG93LmludmFsaWRhdGVQYW5lbE1lbnUoV2luZG93LkZFQVRVUkVfT1BUSU9OU19QQU5FTCk7CisgICAgfQorICAgIAorICAgIC8qKgogICAgICAqIEluaXRpYWxpemUgdGhlIGNvbnRlbnRzIG9mIHRoZSBBY3Rpdml0eSdzIHN0YW5kYXJkIG9wdGlvbnMgbWVudS4gIFlvdQogICAgICAqIHNob3VsZCBwbGFjZSB5b3VyIG1lbnUgaXRlbXMgaW4gdG8gPHZhcj5tZW51PC92YXI+LgogICAgICAqIApAQCAtMjQ3MSw2ICsyNzA2LDkgQEAKICAgICAgKiBieSB0aGUgYWN0aXZpdHkuICBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBjYWxscyB0aHJvdWdoIHRvCiAgICAgICoge0BsaW5rICNvbkNyZWF0ZURpYWxvZyhpbnQpfSBmb3IgY29tcGF0aWJpbGl0eS4KICAgICAgKgorICAgICAqIDxlbT5JZiB5b3UgYXJlIHRhcmdldGluZyB7QGxpbmsgYW5kcm9pZC5vcy5CdWlsZC5WRVJTSU9OX0NPREVTI0hPTkVZQ09NQn0KKyAgICAgKiBvciBsYXRlciwgY29uc2lkZXIgaW5zdGVhZCB1c2luZyBhIHtAbGluayBEaWFsb2dGcmFnbWVudH0gaW5zdGVhZC48L2VtPgorICAgICAqCiAgICAgICogPHA+SWYgeW91IHVzZSB7QGxpbmsgI3Nob3dEaWFsb2coaW50KX0sIHRoZSBhY3Rpdml0eSB3aWxsIGNhbGwgdGhyb3VnaCB0bwogICAgICAqIHRoaXMgbWV0aG9kIHRoZSBmaXJzdCB0aW1lLCBhbmQgaGFuZyBvbnRvIGl0IHRoZXJlYWZ0ZXIuICBBbnkgZGlhbG9nCiAgICAgICogdGhhdCBpcyBjcmVhdGVkIGJ5IHRoaXMgbWV0aG9kIHdpbGwgYXV0b21hdGljYWxseSBiZSBzYXZlZCBhbmQgcmVzdG9yZWQKQEAgLTI1NDMsNiArMjc4MSw5IEBACiAgICAgICogd2lsbCBiZSBtYWRlIHdpdGggdGhlIHNhbWUgaWQgdGhlIGZpcnN0IHRpbWUgdGhpcyBpcyBjYWxsZWQgZm9yIGEgZ2l2ZW4KICAgICAgKiBpZC4gIEZyb20gdGhlcmVhZnRlciwgdGhlIGRpYWxvZyB3aWxsIGJlIGF1dG9tYXRpY2FsbHkgc2F2ZWQgYW5kIHJlc3RvcmVkLgogICAgICAqCisgICAgICogPGVtPklmIHlvdSBhcmUgdGFyZ2V0aW5nIHtAbGluayBhbmRyb2lkLm9zLkJ1aWxkLlZFUlNJT05fQ09ERVMjSE9ORVlDT01CfQorICAgICAqIG9yIGxhdGVyLCBjb25zaWRlciBpbnN0ZWFkIHVzaW5nIGEge0BsaW5rIERpYWxvZ0ZyYWdtZW50fSBpbnN0ZWFkLjwvZW0+CisgICAgICoKICAgICAgKiA8cD5FYWNoIHRpbWUgYSBkaWFsb2cgaXMgc2hvd24sIHtAbGluayAjb25QcmVwYXJlRGlhbG9nKGludCwgRGlhbG9nLCBCdW5kbGUpfSB3aWxsCiAgICAgICogYmUgbWFkZSB0byBwcm92aWRlIGFuIG9wcG9ydHVuaXR5IHRvIGRvIGFueSB0aW1lbHkgcHJlcGFyYXRpb24uCiAgICAgICoKQEAgLTMwOTAsNiArMzMzMSwzNiBAQAogICAgIH0KIAogICAgIC8qKgorICAgICAqIFRoaXMgaXMgY2FsbGVkIHdoZW4gYSBGcmFnbWVudCBpbiB0aGlzIGFjdGl2aXR5IGNhbGxzIGl0cyAKKyAgICAgKiB7QGxpbmsgRnJhZ21lbnQjc3RhcnRBY3Rpdml0eX0gb3Ige0BsaW5rIEZyYWdtZW50I3N0YXJ0QWN0aXZpdHlGb3JSZXN1bHR9CisgICAgICogbWV0aG9kLgorICAgICAqIAorICAgICAqIDxwPlRoaXMgbWV0aG9kIHRocm93cyB7QGxpbmsgYW5kcm9pZC5jb250ZW50LkFjdGl2aXR5Tm90Rm91bmRFeGNlcHRpb259CisgICAgICogaWYgdGhlcmUgd2FzIG5vIEFjdGl2aXR5IGZvdW5kIHRvIHJ1biB0aGUgZ2l2ZW4gSW50ZW50LgorICAgICAqIAorICAgICAqIEBwYXJhbSBmcmFnbWVudCBUaGUgZnJhZ21lbnQgbWFraW5nIHRoZSBjYWxsLgorICAgICAqIEBwYXJhbSBpbnRlbnQgVGhlIGludGVudCB0byBzdGFydC4KKyAgICAgKiBAcGFyYW0gcmVxdWVzdENvZGUgUmVwbHkgcmVxdWVzdCBjb2RlLiAgPCAwIGlmIHJlcGx5IGlzIG5vdCByZXF1ZXN0ZWQuIAorICAgICAqIAorICAgICAqIEB0aHJvd3MgYW5kcm9pZC5jb250ZW50LkFjdGl2aXR5Tm90Rm91bmRFeGNlcHRpb24KKyAgICAgKiAKKyAgICAgKiBAc2VlIEZyYWdtZW50I3N0YXJ0QWN0aXZpdHkgCisgICAgICogQHNlZSBGcmFnbWVudCNzdGFydEFjdGl2aXR5Rm9yUmVzdWx0IAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHN0YXJ0QWN0aXZpdHlGcm9tRnJhZ21lbnQoRnJhZ21lbnQgZnJhZ21lbnQsIEludGVudCBpbnRlbnQsIAorICAgICAgICAgICAgaW50IHJlcXVlc3RDb2RlKSB7CisgICAgICAgIEluc3RydW1lbnRhdGlvbi5BY3Rpdml0eVJlc3VsdCBhciA9CisgICAgICAgICAgICBtSW5zdHJ1bWVudGF0aW9uLmV4ZWNTdGFydEFjdGl2aXR5KAorICAgICAgICAgICAgICAgIHRoaXMsIG1NYWluVGhyZWFkLmdldEFwcGxpY2F0aW9uVGhyZWFkKCksIG1Ub2tlbiwgZnJhZ21lbnQsCisgICAgICAgICAgICAgICAgaW50ZW50LCByZXF1ZXN0Q29kZSk7CisgICAgICAgIGlmIChhciAhPSBudWxsKSB7CisgICAgICAgICAgICBtTWFpblRocmVhZC5zZW5kQWN0aXZpdHlSZXN1bHQoCisgICAgICAgICAgICAgICAgbVRva2VuLCBmcmFnbWVudC5tV2hvLCByZXF1ZXN0Q29kZSwKKyAgICAgICAgICAgICAgICBhci5nZXRSZXN1bHRDb2RlKCksIGFyLmdldFJlc3VsdERhdGEoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKICAgICAgKiBMaWtlIHtAbGluayAjc3RhcnRBY3Rpdml0eUZyb21DaGlsZChBY3Rpdml0eSwgSW50ZW50LCBpbnQpfSwgYnV0CiAgICAgICogdGFraW5nIGEgSW50ZW50U2VuZGVyOyBzZWUKICAgICAgKiB7QGxpbmsgI3N0YXJ0SW50ZW50U2VuZGVyRm9yUmVzdWx0KEludGVudFNlbmRlciwgaW50LCBJbnRlbnQsIGludCwgaW50LCBpbnQpfQpAQCAtMzI0OCw2ICszNTE5LDE5IEBACiAgICAgfQogCiAgICAgLyoqCisgICAgICogQ2hlY2sgdG8gc2VlIHdoZXRoZXIgdGhpcyBhY3Rpdml0eSBpcyBpbiB0aGUgcHJvY2VzcyBvZiBiZWluZyBkZXN0cm95ZWQgaW4gb3JkZXIgdG8gYmUKKyAgICAgKiByZWNyZWF0ZWQgd2l0aCBhIG5ldyBjb25maWd1cmF0aW9uLiBUaGlzIGlzIG9mdGVuIHVzZWQgaW4KKyAgICAgKiB7QGxpbmsgI29uU3RvcH0gdG8gZGV0ZXJtaW5lIHdoZXRoZXIgdGhlIHN0YXRlIG5lZWRzIHRvIGJlIGNsZWFuZWQgdXAgb3Igd2lsbCBiZSBwYXNzZWQKKyAgICAgKiBvbiB0byB0aGUgbmV4dCBpbnN0YW5jZSBvZiB0aGUgYWN0aXZpdHkgdmlhIHtAbGluayAjb25SZXRhaW5Ob25Db25maWd1cmF0aW9uSW5zdGFuY2UoKX0uCisgICAgICogCisgICAgICogQHJldHVybiBJZiB0aGUgYWN0aXZpdHkgaXMgYmVpbmcgdG9ybiBkb3duIGluIG9yZGVyIHRvIGJlIHJlY3JlYXRlZCB3aXRoIGEgbmV3IGNvbmZpZ3VyYXRpb24sCisgICAgICogcmV0dXJucyB0cnVlOyBlbHNlIHJldHVybnMgZmFsc2UuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNDaGFuZ2luZ0NvbmZpZ3VyYXRpb25zKCkgeworICAgICAgICByZXR1cm4gbUNoYW5naW5nQ29uZmlndXJhdGlvbnM7CisgICAgfQorCisgICAgLyoqCiAgICAgICogQ2FsbCB0aGlzIHdoZW4geW91ciBhY3Rpdml0eSBpcyBkb25lIGFuZCBzaG91bGQgYmUgY2xvc2VkLiAgVGhlCiAgICAgICogQWN0aXZpdHlSZXN1bHQgaXMgcHJvcGFnYXRlZCBiYWNrIHRvIHdob2V2ZXIgbGF1bmNoZWQgeW91IHZpYQogICAgICAqIG9uQWN0aXZpdHlSZXN1bHQoKS4KQEAgLTMzNDgsOCArMzYzMiw3IEBACiAgICAgICogQHNlZSAjY3JlYXRlUGVuZGluZ1Jlc3VsdAogICAgICAqIEBzZWUgI3NldFJlc3VsdChpbnQpCiAgICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgb25BY3Rpdml0eVJlc3VsdChpbnQgcmVxdWVzdENvZGUsIGludCByZXN1bHRDb2RlLAotICAgICAgICAgICAgSW50ZW50IGRhdGEpIHsKKyAgICBwcm90ZWN0ZWQgdm9pZCBvbkFjdGl2aXR5UmVzdWx0KGludCByZXF1ZXN0Q29kZSwgaW50IHJlc3VsdENvZGUsIEludGVudCBkYXRhKSB7CiAgICAgfQogCiAgICAgLyoqCkBAIC0zNzMzLDE0ICs0MDE2LDEyNyBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFN0dWIgaW1wbGVtZW50YXRpb24gb2Yge0BsaW5rIGFuZHJvaWQudmlldy5MYXlvdXRJbmZsYXRlci5GYWN0b3J5I29uQ3JlYXRlVmlld30gdXNlZCB3aGVuCi0gICAgICogaW5mbGF0aW5nIHdpdGggdGhlIExheW91dEluZmxhdGVyIHJldHVybmVkIGJ5IHtAbGluayAjZ2V0U3lzdGVtU2VydmljZX0uICBUaGlzCi0gICAgICogaW1wbGVtZW50YXRpb24gc2ltcGx5IHJldHVybnMgbnVsbCBmb3IgYWxsIHZpZXcgbmFtZXMuCisgICAgICogU3RhbmRhcmQgaW1wbGVtZW50YXRpb24gb2YKKyAgICAgKiB7QGxpbmsgYW5kcm9pZC52aWV3LkxheW91dEluZmxhdGVyLkZhY3Rvcnkjb25DcmVhdGVWaWV3fSB1c2VkIHdoZW4KKyAgICAgKiBpbmZsYXRpbmcgd2l0aCB0aGUgTGF5b3V0SW5mbGF0ZXIgcmV0dXJuZWQgYnkge0BsaW5rICNnZXRTeXN0ZW1TZXJ2aWNlfS4KKyAgICAgKiBUaGlzIGltcGxlbWVudGF0aW9uIGhhbmRsZXMgPGZyYWdtZW50PiB0YWdzIHRvIGVtYmVkIGZyYWdtZW50cyBpbnNpZGUKKyAgICAgKiBvZiB0aGUgYWN0aXZpdHkuCiAgICAgICoKICAgICAgKiBAc2VlIGFuZHJvaWQudmlldy5MYXlvdXRJbmZsYXRlciNjcmVhdGVWaWV3CiAgICAgICogQHNlZSBhbmRyb2lkLnZpZXcuV2luZG93I2dldExheW91dEluZmxhdGVyCiAgICAgICovCiAgICAgcHVibGljIFZpZXcgb25DcmVhdGVWaWV3KFN0cmluZyBuYW1lLCBDb250ZXh0IGNvbnRleHQsIEF0dHJpYnV0ZVNldCBhdHRycykgeworICAgICAgICBpZiAoISJmcmFnbWVudCIuZXF1YWxzKG5hbWUpKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgU3RyaW5nIGZuYW1lID0gYXR0cnMuZ2V0QXR0cmlidXRlVmFsdWUobnVsbCwgImNsYXNzIik7CisgICAgICAgIFR5cGVkQXJyYXkgYSA9IAorICAgICAgICAgICAgY29udGV4dC5vYnRhaW5TdHlsZWRBdHRyaWJ1dGVzKGF0dHJzLCBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZS5GcmFnbWVudCk7CisgICAgICAgIGlmIChmbmFtZSA9PSBudWxsKSB7CisgICAgICAgICAgICBmbmFtZSA9IGEuZ2V0U3RyaW5nKGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLkZyYWdtZW50X25hbWUpOworICAgICAgICB9CisgICAgICAgIGludCBpZCA9IGEuZ2V0UmVzb3VyY2VJZChjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZS5GcmFnbWVudF9pZCwgMCk7CisgICAgICAgIFN0cmluZyB0YWcgPSBhLmdldFN0cmluZyhjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZS5GcmFnbWVudF90YWcpOworICAgICAgICBhLnJlY3ljbGUoKTsKKyAgICAgICAgCisgICAgICAgIGlmIChpZCA9PSAwKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKGF0dHJzLmdldFBvc2l0aW9uRGVzY3JpcHRpb24oKQorICAgICAgICAgICAgICAgICAgICArICI6IE11c3Qgc3BlY2lmeSB1bmlxdWUgYW5kcm9pZDppZCBmb3IgIiArIGZuYW1lKTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgLy8gSWYgd2UgcmVzdG9yZWQgZnJvbSBhIHByZXZpb3VzIHN0YXRlLCB3ZSBtYXkgYWxyZWFkeSBoYXZlCisgICAgICAgIC8vIGluc3RhbnRpYXRlZCB0aGlzIGZyYWdtZW50IGZyb20gdGhlIHN0YXRlIGFuZCBzaG91bGQgdXNlCisgICAgICAgIC8vIHRoYXQgaW5zdGFuY2UgaW5zdGVhZCBvZiBtYWtpbmcgYSBuZXcgb25lLgorICAgICAgICBGcmFnbWVudCBmcmFnbWVudCA9IG1GcmFnbWVudHMuZmluZEZyYWdtZW50QnlJZChpZCk7CisgICAgICAgIGlmIChGcmFnbWVudE1hbmFnZXJJbXBsLkRFQlVHKSBMb2cudihUQUcsICJvbkNyZWF0ZVZpZXc6IGlkPTB4IgorICAgICAgICAgICAgICAgICsgSW50ZWdlci50b0hleFN0cmluZyhpZCkgKyAiIGZuYW1lPSIgKyBmbmFtZQorICAgICAgICAgICAgICAgICsgIiBleGlzdGluZz0iICsgZnJhZ21lbnQpOworICAgICAgICBpZiAoZnJhZ21lbnQgPT0gbnVsbCkgeworICAgICAgICAgICAgZnJhZ21lbnQgPSBGcmFnbWVudC5pbnN0YW50aWF0ZSh0aGlzLCBmbmFtZSk7CisgICAgICAgICAgICBmcmFnbWVudC5tRnJvbUxheW91dCA9IHRydWU7CisgICAgICAgICAgICBmcmFnbWVudC5tRnJhZ21lbnRJZCA9IGlkOworICAgICAgICAgICAgZnJhZ21lbnQubVRhZyA9IHRhZzsKKyAgICAgICAgICAgIGZyYWdtZW50Lm1JbW1lZGlhdGVBY3Rpdml0eSA9IHRoaXM7CisgICAgICAgICAgICBmcmFnbWVudC5tRnJhZ21lbnRNYW5hZ2VyID0gbUZyYWdtZW50czsKKyAgICAgICAgICAgIC8vIElmIHRoaXMgZnJhZ21lbnQgaXMgbmV3bHkgaW5zdGFudGlhdGVkIChlaXRoZXIgcmlnaHQgbm93LCBvcgorICAgICAgICAgICAgLy8gZnJvbSBsYXN0IHNhdmVkIHN0YXRlKSwgdGhlbiBnaXZlIGl0IHRoZSBhdHRyaWJ1dGVzIHRvCisgICAgICAgICAgICAvLyBpbml0aWFsaXplIGl0c2VsZi4KKyAgICAgICAgICAgIGlmICghZnJhZ21lbnQubVJldGFpbmluZykgeworICAgICAgICAgICAgICAgIGZyYWdtZW50Lm9uSW5mbGF0ZShhdHRycywgZnJhZ21lbnQubVNhdmVkRnJhZ21lbnRTdGF0ZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtRnJhZ21lbnRzLmFkZEZyYWdtZW50KGZyYWdtZW50LCB0cnVlKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoZnJhZ21lbnQubVZpZXcgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiRnJhZ21lbnQgIiArIGZuYW1lCisgICAgICAgICAgICAgICAgICAgICsgIiBkaWQgbm90IGNyZWF0ZSBhIHZpZXcuIik7CisgICAgICAgIH0KKyAgICAgICAgZnJhZ21lbnQubVZpZXcuc2V0SWQoaWQpOworICAgICAgICBpZiAoZnJhZ21lbnQubVZpZXcuZ2V0VGFnKCkgPT0gbnVsbCkgeworICAgICAgICAgICAgZnJhZ21lbnQubVZpZXcuc2V0VGFnKHRhZyk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZyYWdtZW50Lm1WaWV3OworICAgIH0KKworICAgIC8qKgorICAgICAqIEJpdCBpbmRpY2F0aW5nIHRoYXQgdGhpcyBhY3Rpdml0eSBpcyAiaW1tZXJzaXZlIiBhbmQgc2hvdWxkIG5vdCBiZQorICAgICAqIGludGVycnVwdGVkIGJ5IG5vdGlmaWNhdGlvbnMgaWYgcG9zc2libGUuCisgICAgICoKKyAgICAgKiBUaGlzIHZhbHVlIGlzIGluaXRpYWxseSBzZXQgYnkgdGhlIG1hbmlmZXN0IHByb3BlcnR5CisgICAgICogPGNvZGU+YW5kcm9pZDppbW1lcnNpdmU8L2NvZGU+IGJ1dCBtYXkgYmUgY2hhbmdlZCBhdCBydW50aW1lIGJ5CisgICAgICoge0BsaW5rICNzZXRJbW1lcnNpdmV9LgorICAgICAqCisgICAgICogQHNlZSBhbmRyb2lkLmNvbnRlbnQucG0uQWN0aXZpdHlJbmZvI0ZMQUdfSU1NRVJTSVZFCisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc0ltbWVyc2l2ZSgpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJldHVybiBBY3Rpdml0eU1hbmFnZXJOYXRpdmUuZ2V0RGVmYXVsdCgpLmlzSW1tZXJzaXZlKG1Ub2tlbik7CisgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGp1c3QgdGhlIGN1cnJlbnQgaW1tZXJzaXZlIG1vZGUgc2V0dGluZy4KKyAgICAgKiAKKyAgICAgKiBOb3RlIHRoYXQgY2hhbmdpbmcgdGhpcyB2YWx1ZSB3aWxsIGhhdmUgbm8gZWZmZWN0IG9uIHRoZSBhY3Rpdml0eSdzCisgICAgICoge0BsaW5rIGFuZHJvaWQuY29udGVudC5wbS5BY3Rpdml0eUluZm99IHN0cnVjdHVyZTsgdGhhdCBpcywgaWYKKyAgICAgKiA8Y29kZT5hbmRyb2lkOmltbWVyc2l2ZTwvY29kZT4gaXMgc2V0IHRvIDxjb2RlPnRydWU8L2NvZGU+CisgICAgICogaW4gdGhlIGFwcGxpY2F0aW9uJ3MgbWFuaWZlc3QgZW50cnkgZm9yIHRoaXMgYWN0aXZpdHksIHRoZSB7QGxpbmsKKyAgICAgKiBhbmRyb2lkLmNvbnRlbnQucG0uQWN0aXZpdHlJbmZvI2ZsYWdzIEFjdGl2aXR5SW5mby5mbGFnc30gbWVtYmVyIHdpbGwKKyAgICAgKiBhbHdheXMgaGF2ZSBpdHMge0BsaW5rIGFuZHJvaWQuY29udGVudC5wbS5BY3Rpdml0eUluZm8jRkxBR19JTU1FUlNJVkUKKyAgICAgKiBGTEFHX0lNTUVSU0lWRX0gYml0IHNldC4KKyAgICAgKgorICAgICAqIEBzZWUgI2lzSW1tZXJzaXZlCisgICAgICogQHNlZSBhbmRyb2lkLmNvbnRlbnQucG0uQWN0aXZpdHlJbmZvI0ZMQUdfSU1NRVJTSVZFCisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRJbW1lcnNpdmUoYm9vbGVhbiBpKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBBY3Rpdml0eU1hbmFnZXJOYXRpdmUuZ2V0RGVmYXVsdCgpLnNldEltbWVyc2l2ZShtVG9rZW4sIGkpOworICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgLy8gcGFzcworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogU3RhcnQgYSBjb250ZXh0IG1vZGUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY2FsbGJhY2sgQ2FsbGJhY2sgdGhhdCB3aWxsIG1hbmFnZSBsaWZlY3ljbGUgZXZlbnRzIGZvciB0aGlzIGNvbnRleHQgbW9kZQorICAgICAqIEByZXR1cm4gVGhlIENvbnRleHRNb2RlIHRoYXQgd2FzIHN0YXJ0ZWQsIG9yIG51bGwgaWYgaXQgd2FzIGNhbmNlbGVkCisgICAgICoKKyAgICAgKiBAc2VlIEFjdGlvbk1vZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgQWN0aW9uTW9kZSBzdGFydEFjdGlvbk1vZGUoQWN0aW9uTW9kZS5DYWxsYmFjayBjYWxsYmFjaykgeworICAgICAgICByZXR1cm4gbVdpbmRvdy5nZXREZWNvclZpZXcoKS5zdGFydEFjdGlvbk1vZGUoY2FsbGJhY2spOworICAgIH0KKworICAgIHB1YmxpYyBBY3Rpb25Nb2RlIG9uU3RhcnRBY3Rpb25Nb2RlKEFjdGlvbk1vZGUuQ2FsbGJhY2sgY2FsbGJhY2spIHsKKyAgICAgICAgaW5pdEFjdGlvbkJhcigpOworICAgICAgICBpZiAobUFjdGlvbkJhciAhPSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gbUFjdGlvbkJhci5zdGFydEFjdGlvbk1vZGUoY2FsbGJhY2spOworICAgICAgICB9CiAgICAgICAgIHJldHVybiBudWxsOwogICAgIH0KIApAQCAtMzc1MiwyOCArNDE0OCwzMCBAQAogCiAgICAgZmluYWwgdm9pZCBhdHRhY2goQ29udGV4dCBjb250ZXh0LCBBY3Rpdml0eVRocmVhZCBhVGhyZWFkLCBJbnN0cnVtZW50YXRpb24gaW5zdHIsIElCaW5kZXIgdG9rZW4sCiAgICAgICAgICAgICBBcHBsaWNhdGlvbiBhcHBsaWNhdGlvbiwgSW50ZW50IGludGVudCwgQWN0aXZpdHlJbmZvIGluZm8sIENoYXJTZXF1ZW5jZSB0aXRsZSwgCi0gICAgICAgICAgICBBY3Rpdml0eSBwYXJlbnQsIFN0cmluZyBpZCwgT2JqZWN0IGxhc3ROb25Db25maWd1cmF0aW9uSW5zdGFuY2UsCisgICAgICAgICAgICBBY3Rpdml0eSBwYXJlbnQsIFN0cmluZyBpZCwgTm9uQ29uZmlndXJhdGlvbkluc3RhbmNlcyBsYXN0Tm9uQ29uZmlndXJhdGlvbkluc3RhbmNlcywKICAgICAgICAgICAgIENvbmZpZ3VyYXRpb24gY29uZmlnKSB7CiAgICAgICAgIGF0dGFjaChjb250ZXh0LCBhVGhyZWFkLCBpbnN0ciwgdG9rZW4sIDAsIGFwcGxpY2F0aW9uLCBpbnRlbnQsIGluZm8sIHRpdGxlLCBwYXJlbnQsIGlkLAotICAgICAgICAgICAgbGFzdE5vbkNvbmZpZ3VyYXRpb25JbnN0YW5jZSwgbnVsbCwgY29uZmlnKTsKKyAgICAgICAgICAgIGxhc3ROb25Db25maWd1cmF0aW9uSW5zdGFuY2VzLCBjb25maWcpOwogICAgIH0KICAgICAKICAgICBmaW5hbCB2b2lkIGF0dGFjaChDb250ZXh0IGNvbnRleHQsIEFjdGl2aXR5VGhyZWFkIGFUaHJlYWQsCiAgICAgICAgICAgICBJbnN0cnVtZW50YXRpb24gaW5zdHIsIElCaW5kZXIgdG9rZW4sIGludCBpZGVudCwKICAgICAgICAgICAgIEFwcGxpY2F0aW9uIGFwcGxpY2F0aW9uLCBJbnRlbnQgaW50ZW50LCBBY3Rpdml0eUluZm8gaW5mbywKICAgICAgICAgICAgIENoYXJTZXF1ZW5jZSB0aXRsZSwgQWN0aXZpdHkgcGFyZW50LCBTdHJpbmcgaWQsCi0gICAgICAgICAgICBPYmplY3QgbGFzdE5vbkNvbmZpZ3VyYXRpb25JbnN0YW5jZSwKLSAgICAgICAgICAgIEhhc2hNYXA8U3RyaW5nLE9iamVjdD4gbGFzdE5vbkNvbmZpZ3VyYXRpb25DaGlsZEluc3RhbmNlcywKKyAgICAgICAgICAgIE5vbkNvbmZpZ3VyYXRpb25JbnN0YW5jZXMgbGFzdE5vbkNvbmZpZ3VyYXRpb25JbnN0YW5jZXMsCiAgICAgICAgICAgICBDb25maWd1cmF0aW9uIGNvbmZpZykgewogICAgICAgICBhdHRhY2hCYXNlQ29udGV4dChjb250ZXh0KTsKIAorICAgICAgICBtRnJhZ21lbnRzLmF0dGFjaEFjdGl2aXR5KHRoaXMpOworICAgICAgICAKICAgICAgICAgbVdpbmRvdyA9IFBvbGljeU1hbmFnZXIubWFrZU5ld1dpbmRvdyh0aGlzKTsKICAgICAgICAgbVdpbmRvdy5zZXRDYWxsYmFjayh0aGlzKTsKKyAgICAgICAgbVdpbmRvdy5nZXRMYXlvdXRJbmZsYXRlcigpLnNldEZhY3RvcnkodGhpcyk7CiAgICAgICAgIGlmIChpbmZvLnNvZnRJbnB1dE1vZGUgIT0gV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMuU09GVF9JTlBVVF9TVEFURV9VTlNQRUNJRklFRCkgewogICAgICAgICAgICAgbVdpbmRvdy5zZXRTb2Z0SW5wdXRNb2RlKGluZm8uc29mdElucHV0TW9kZSk7CiAgICAgICAgIH0KICAgICAgICAgbVVpVGhyZWFkID0gVGhyZWFkLmN1cnJlbnRUaHJlYWQoKTsKLQorICAgICAgICAKICAgICAgICAgbU1haW5UaHJlYWQgPSBhVGhyZWFkOwogICAgICAgICBtSW5zdHJ1bWVudGF0aW9uID0gaW5zdHI7CiAgICAgICAgIG1Ub2tlbiA9IHRva2VuOwpAQCAtMzc4NSwxMCArNDE4MywxMCBAQAogICAgICAgICBtVGl0bGUgPSB0aXRsZTsKICAgICAgICAgbVBhcmVudCA9IHBhcmVudDsKICAgICAgICAgbUVtYmVkZGVkSUQgPSBpZDsKLSAgICAgICAgbUxhc3ROb25Db25maWd1cmF0aW9uSW5zdGFuY2UgPSBsYXN0Tm9uQ29uZmlndXJhdGlvbkluc3RhbmNlOwotICAgICAgICBtTGFzdE5vbkNvbmZpZ3VyYXRpb25DaGlsZEluc3RhbmNlcyA9IGxhc3ROb25Db25maWd1cmF0aW9uQ2hpbGRJbnN0YW5jZXM7CisgICAgICAgIG1MYXN0Tm9uQ29uZmlndXJhdGlvbkluc3RhbmNlcyA9IGxhc3ROb25Db25maWd1cmF0aW9uSW5zdGFuY2VzOwogCi0gICAgICAgIG1XaW5kb3cuc2V0V2luZG93TWFuYWdlcihudWxsLCBtVG9rZW4sIG1Db21wb25lbnQuZmxhdHRlblRvU3RyaW5nKCkpOworICAgICAgICBtV2luZG93LnNldFdpbmRvd01hbmFnZXIobnVsbCwgbVRva2VuLCBtQ29tcG9uZW50LmZsYXR0ZW5Ub1N0cmluZygpLAorICAgICAgICAgICAgICAgIChpbmZvLmZsYWdzICYgQWN0aXZpdHlJbmZvLkZMQUdfSEFSRFdBUkVfQUNDRUxFUkFURUQpICE9IDApOwogICAgICAgICBpZiAobVBhcmVudCAhPSBudWxsKSB7CiAgICAgICAgICAgICBtV2luZG93LnNldENvbnRhaW5lcihtUGFyZW50LmdldFdpbmRvdygpKTsKICAgICAgICAgfQpAQCAtMzgwMCwyMyArNDE5OCw0MSBAQAogICAgICAgICByZXR1cm4gbVBhcmVudCAhPSBudWxsID8gbVBhcmVudC5nZXRBY3Rpdml0eVRva2VuKCkgOiBtVG9rZW47CiAgICAgfQogCisgICAgZmluYWwgdm9pZCBwZXJmb3JtQ3JlYXRlKEJ1bmRsZSBpY2ljbGUpIHsKKyAgICAgICAgb25DcmVhdGUoaWNpY2xlKTsKKyAgICAgICAgbUZyYWdtZW50cy5kaXNwYXRjaEFjdGl2aXR5Q3JlYXRlZCgpOworICAgIH0KKyAgICAKICAgICBmaW5hbCB2b2lkIHBlcmZvcm1TdGFydCgpIHsKKyAgICAgICAgbUZyYWdtZW50cy5tU3RhdGVTYXZlZCA9IGZhbHNlOwogICAgICAgICBtQ2FsbGVkID0gZmFsc2U7CisgICAgICAgIG1GcmFnbWVudHMuZXhlY1BlbmRpbmdBY3Rpb25zKCk7CiAgICAgICAgIG1JbnN0cnVtZW50YXRpb24uY2FsbEFjdGl2aXR5T25TdGFydCh0aGlzKTsKICAgICAgICAgaWYgKCFtQ2FsbGVkKSB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgU3VwZXJOb3RDYWxsZWRFeGNlcHRpb24oCiAgICAgICAgICAgICAgICAgIkFjdGl2aXR5ICIgKyBtQ29tcG9uZW50LnRvU2hvcnRTdHJpbmcoKSArCiAgICAgICAgICAgICAgICAgIiBkaWQgbm90IGNhbGwgdGhyb3VnaCB0byBzdXBlci5vblN0YXJ0KCkiKTsKICAgICAgICAgfQorICAgICAgICBtRnJhZ21lbnRzLmRpc3BhdGNoU3RhcnQoKTsKKyAgICAgICAgaWYgKG1BbGxMb2FkZXJNYW5hZ2VycyAhPSBudWxsKSB7CisgICAgICAgICAgICBmb3IgKGludCBpPW1BbGxMb2FkZXJNYW5hZ2Vycy5zaXplKCktMTsgaT49MDsgaS0tKSB7CisgICAgICAgICAgICAgICAgbUFsbExvYWRlck1hbmFnZXJzLnZhbHVlQXQoaSkuZmluaXNoUmV0YWluKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KICAgICB9CiAgICAgCiAgICAgZmluYWwgdm9pZCBwZXJmb3JtUmVzdGFydCgpIHsKKyAgICAgICAgbUZyYWdtZW50cy5tU3RhdGVTYXZlZCA9IGZhbHNlOworCiAgICAgICAgIHN5bmNocm9uaXplZCAobU1hbmFnZWRDdXJzb3JzKSB7CiAgICAgICAgICAgICBmaW5hbCBpbnQgTiA9IG1NYW5hZ2VkQ3Vyc29ycy5zaXplKCk7CiAgICAgICAgICAgICBmb3IgKGludCBpPTA7IGk8TjsgaSsrKSB7CiAgICAgICAgICAgICAgICAgTWFuYWdlZEN1cnNvciBtYyA9IG1NYW5hZ2VkQ3Vyc29ycy5nZXQoaSk7CiAgICAgICAgICAgICAgICAgaWYgKG1jLm1SZWxlYXNlZCB8fCBtYy5tVXBkYXRlZCkgewotICAgICAgICAgICAgICAgICAgICBtYy5tQ3Vyc29yLnJlcXVlcnkoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFtYy5tQ3Vyc29yLnJlcXVlcnkoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRyeWluZyB0byByZXF1ZXJ5IGFuIGFscmVhZHkgY2xvc2VkIGN1cnNvciIpOworICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIG1jLm1SZWxlYXNlZCA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgICBtYy5tVXBkYXRlZCA9IGZhbHNlOwogICAgICAgICAgICAgICAgIH0KQEAgLTM4MzksNyArNDI1NSw5IEBACiAgICAgZmluYWwgdm9pZCBwZXJmb3JtUmVzdW1lKCkgewogICAgICAgICBwZXJmb3JtUmVzdGFydCgpOwogICAgICAgICAKLSAgICAgICAgbUxhc3ROb25Db25maWd1cmF0aW9uSW5zdGFuY2UgPSBudWxsOworICAgICAgICBtRnJhZ21lbnRzLmV4ZWNQZW5kaW5nQWN0aW9ucygpOworICAgICAgICAKKyAgICAgICAgbUxhc3ROb25Db25maWd1cmF0aW9uSW5zdGFuY2VzID0gbnVsbDsKICAgICAgICAgCiAgICAgICAgIC8vIEZpcnN0IGNhbGwgb25SZXN1bWUoKSAtYmVmb3JlLSBzZXR0aW5nIG1SZXN1bWVkLCBzbyB3ZSBkb24ndAogICAgICAgICAvLyBzZW5kIG91dCBhbnkgc3RhdHVzIGJhciAvIG1lbnUgbm90aWZpY2F0aW9ucyB0aGUgY2xpZW50IG1ha2VzLgpAQCAtMzg1NCw2ICs0MjcyLDEwIEBACiAgICAgICAgIC8vIE5vdyByZWFsbHkgcmVzdW1lLCBhbmQgaW5zdGFsbCB0aGUgY3VycmVudCBzdGF0dXMgYmFyIGFuZCBtZW51LgogICAgICAgICBtUmVzdW1lZCA9IHRydWU7CiAgICAgICAgIG1DYWxsZWQgPSBmYWxzZTsKKyAgICAgICAgCisgICAgICAgIG1GcmFnbWVudHMuZGlzcGF0Y2hSZXN1bWUoKTsKKyAgICAgICAgbUZyYWdtZW50cy5leGVjUGVuZGluZ0FjdGlvbnMoKTsKKyAgICAgICAgCiAgICAgICAgIG9uUG9zdFJlc3VtZSgpOwogICAgICAgICBpZiAoIW1DYWxsZWQpIHsKICAgICAgICAgICAgIHRocm93IG5ldyBTdXBlck5vdENhbGxlZEV4Y2VwdGlvbigKQEAgLTM4NjMsNiArNDI4NSw3IEBACiAgICAgfQogCiAgICAgZmluYWwgdm9pZCBwZXJmb3JtUGF1c2UoKSB7CisgICAgICAgIG1GcmFnbWVudHMuZGlzcGF0Y2hQYXVzZSgpOwogICAgICAgICBtQ2FsbGVkID0gZmFsc2U7CiAgICAgICAgIG9uUGF1c2UoKTsKICAgICAgICAgaWYgKCFtQ2FsbGVkICYmIGdldEFwcGxpY2F0aW9uSW5mbygpLnRhcmdldFNka1ZlcnNpb24KQEAgLTM4NzksMTEgKzQzMDIsMjQgQEAKICAgICB9CiAgICAgCiAgICAgZmluYWwgdm9pZCBwZXJmb3JtU3RvcCgpIHsKKyAgICAgICAgaWYgKG1TdGFydGVkKSB7CisgICAgICAgICAgICBtU3RhcnRlZCA9IGZhbHNlOworICAgICAgICAgICAgaWYgKG1Mb2FkZXJNYW5hZ2VyICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBpZiAoIW1DaGFuZ2luZ0NvbmZpZ3VyYXRpb25zKSB7CisgICAgICAgICAgICAgICAgICAgIG1Mb2FkZXJNYW5hZ2VyLmRvU3RvcCgpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIG1Mb2FkZXJNYW5hZ2VyLmRvUmV0YWluKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIAogICAgICAgICBpZiAoIW1TdG9wcGVkKSB7CiAgICAgICAgICAgICBpZiAobVdpbmRvdyAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgbVdpbmRvdy5jbG9zZUFsbFBhbmVscygpOwogICAgICAgICAgICAgfQogCisgICAgICAgICAgICBtRnJhZ21lbnRzLmRpc3BhdGNoU3RvcCgpOworICAgICAgICAgICAgCiAgICAgICAgICAgICBtQ2FsbGVkID0gZmFsc2U7CiAgICAgICAgICAgICBtSW5zdHJ1bWVudGF0aW9uLmNhbGxBY3Rpdml0eU9uU3RvcCh0aGlzKTsKICAgICAgICAgICAgIGlmICghbUNhbGxlZCkgewpAQCAtMzkwOCw2ICs0MzQ0LDE1IEBACiAgICAgICAgIG1SZXN1bWVkID0gZmFsc2U7CiAgICAgfQogCisgICAgZmluYWwgdm9pZCBwZXJmb3JtRGVzdHJveSgpIHsKKyAgICAgICAgbVdpbmRvdy5kZXN0cm95KCk7CisgICAgICAgIG1GcmFnbWVudHMuZGlzcGF0Y2hEZXN0cm95KCk7CisgICAgICAgIG9uRGVzdHJveSgpOworICAgICAgICBpZiAobUxvYWRlck1hbmFnZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgbUxvYWRlck1hbmFnZXIuZG9EZXN0cm95KCk7CisgICAgICAgIH0KKyAgICB9CisgICAgCiAgICAgZmluYWwgYm9vbGVhbiBpc1Jlc3VtZWQoKSB7CiAgICAgICAgIHJldHVybiBtUmVzdW1lZDsKICAgICB9CkBAIC0zOTE3LDggKzQzNjIsMTQgQEAKICAgICAgICAgaWYgKENvbmZpZy5MT0dWKSBMb2cudigKICAgICAgICAgICAgIFRBRywgIkRpc3BhdGNoaW5nIHJlc3VsdDogd2hvPSIgKyB3aG8gKyAiLCByZXFDb2RlPSIgKyByZXF1ZXN0Q29kZQogICAgICAgICAgICAgKyAiLCByZXNDb2RlPSIgKyByZXN1bHRDb2RlICsgIiwgZGF0YT0iICsgZGF0YSk7CisgICAgICAgIG1GcmFnbWVudHMubVN0YXRlU2F2ZWQgPSBmYWxzZTsKICAgICAgICAgaWYgKHdobyA9PSBudWxsKSB7CiAgICAgICAgICAgICBvbkFjdGl2aXR5UmVzdWx0KHJlcXVlc3RDb2RlLCByZXN1bHRDb2RlLCBkYXRhKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEZyYWdtZW50IGZyYWcgPSBtRnJhZ21lbnRzLmZpbmRGcmFnbWVudEJ5V2hvKHdobyk7CisgICAgICAgICAgICBpZiAoZnJhZyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgZnJhZy5vbkFjdGl2aXR5UmVzdWx0KHJlcXVlc3RDb2RlLCByZXN1bHRDb2RlLCBkYXRhKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KIH0KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9BY3Rpdml0eU1hbmFnZXJOYXRpdmUuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9BY3Rpdml0eU1hbmFnZXJOYXRpdmUuamF2YQppbmRleCBhMTgwODM3Li43M2U4ZDMxIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9hcHAvQWN0aXZpdHlNYW5hZ2VyTmF0aXZlLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvYXBwL0FjdGl2aXR5TWFuYWdlck5hdGl2ZS5qYXZhCkBAIC0xMjYxLDYgKzEyNjEsMzIgQEAKICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICB9CiAKKyAgICAgICAgY2FzZSBJU19JTU1FUlNJVkVfVFJBTlNBQ1RJT046IHsKKyAgICAgICAgICAgIGRhdGEuZW5mb3JjZUludGVyZmFjZShJQWN0aXZpdHlNYW5hZ2VyLmRlc2NyaXB0b3IpOworICAgICAgICAgICAgSUJpbmRlciB0b2tlbiA9IGRhdGEucmVhZFN0cm9uZ0JpbmRlcigpOworICAgICAgICAgICAgYm9vbGVhbiBpc2l0ID0gaXNJbW1lcnNpdmUodG9rZW4pOworICAgICAgICAgICAgcmVwbHkud3JpdGVOb0V4Y2VwdGlvbigpOworICAgICAgICAgICAgcmVwbHkud3JpdGVJbnQoaXNpdCA/IDEgOiAwKTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBTRVRfSU1NRVJTSVZFX1RSQU5TQUNUSU9OOiB7CisgICAgICAgICAgICBkYXRhLmVuZm9yY2VJbnRlcmZhY2UoSUFjdGl2aXR5TWFuYWdlci5kZXNjcmlwdG9yKTsKKyAgICAgICAgICAgIElCaW5kZXIgdG9rZW4gPSBkYXRhLnJlYWRTdHJvbmdCaW5kZXIoKTsKKyAgICAgICAgICAgIGJvb2xlYW4gaW1tID0gZGF0YS5yZWFkSW50KCkgPT0gMTsKKyAgICAgICAgICAgIHNldEltbWVyc2l2ZSh0b2tlbiwgaW1tKTsKKyAgICAgICAgICAgIHJlcGx5LndyaXRlTm9FeGNlcHRpb24oKTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBjYXNlIElTX1RPUF9BQ1RJVklUWV9JTU1FUlNJVkVfVFJBTlNBQ1RJT046IHsKKyAgICAgICAgICAgIGRhdGEuZW5mb3JjZUludGVyZmFjZShJQWN0aXZpdHlNYW5hZ2VyLmRlc2NyaXB0b3IpOworICAgICAgICAgICAgYm9vbGVhbiBpc2l0ID0gaXNUb3BBY3Rpdml0eUltbWVyc2l2ZSgpOworICAgICAgICAgICAgcmVwbHkud3JpdGVOb0V4Y2VwdGlvbigpOworICAgICAgICAgICAgcmVwbHkud3JpdGVJbnQoaXNpdCA/IDEgOiAwKTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisKICAgICAgICAgY2FzZSBDUkFTSF9BUFBMSUNBVElPTl9UUkFOU0FDVElPTjogewogICAgICAgICAgICAgZGF0YS5lbmZvcmNlSW50ZXJmYWNlKElBY3Rpdml0eU1hbmFnZXIuZGVzY3JpcHRvcik7CiAgICAgICAgICAgICBpbnQgdWlkID0gZGF0YS5yZWFkSW50KCk7CkBAIC0xMjcxLDcgKzEyOTcsNyBAQAogICAgICAgICAgICAgcmVwbHkud3JpdGVOb0V4Y2VwdGlvbigpOwogICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgIH0KLQorICAgICAgICAKICAgICAgICAgY2FzZSBORVdfVVJJX1BFUk1JU1NJT05fT1dORVJfVFJBTlNBQ1RJT046IHsKICAgICAgICAgICAgIGRhdGEuZW5mb3JjZUludGVyZmFjZShJQWN0aXZpdHlNYW5hZ2VyLmRlc2NyaXB0b3IpOwogICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSBkYXRhLnJlYWRTdHJpbmcoKTsKQEAgLTEzMDYsNiArMTMzMiwxOSBAQAogICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgIH0KIAorICAgICAgICBjYXNlIERVTVBfSEVBUF9UUkFOU0FDVElPTjogeworICAgICAgICAgICAgZGF0YS5lbmZvcmNlSW50ZXJmYWNlKElBY3Rpdml0eU1hbmFnZXIuZGVzY3JpcHRvcik7CisgICAgICAgICAgICBTdHJpbmcgcHJvY2VzcyA9IGRhdGEucmVhZFN0cmluZygpOworICAgICAgICAgICAgYm9vbGVhbiBtYW5hZ2VkID0gZGF0YS5yZWFkSW50KCkgIT0gMDsKKyAgICAgICAgICAgIFN0cmluZyBwYXRoID0gZGF0YS5yZWFkU3RyaW5nKCk7CisgICAgICAgICAgICBQYXJjZWxGaWxlRGVzY3JpcHRvciBmZCA9IGRhdGEucmVhZEludCgpICE9IDAKKyAgICAgICAgICAgICAgICAgICAgPyBkYXRhLnJlYWRGaWxlRGVzY3JpcHRvcigpIDogbnVsbDsKKyAgICAgICAgICAgIGJvb2xlYW4gcmVzID0gZHVtcEhlYXAocHJvY2VzcywgbWFuYWdlZCwgcGF0aCwgZmQpOworICAgICAgICAgICAgcmVwbHkud3JpdGVOb0V4Y2VwdGlvbigpOworICAgICAgICAgICAgcmVwbHkud3JpdGVJbnQocmVzID8gMSA6IDApOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKwogICAgICAgICB9CiAgICAgICAgIAogICAgICAgICByZXR1cm4gc3VwZXIub25UcmFuc2FjdChjb2RlLCBkYXRhLCByZXBseSwgZmxhZ3MpOwpAQCAtMjgzMiw2ICsyODcxLDQ2IEBACiAgICAgICAgIHJlcGx5LnJlY3ljbGUoKTsKICAgICB9CiAgICAgCisgICAgcHVibGljIHZvaWQgc2V0SW1tZXJzaXZlKElCaW5kZXIgdG9rZW4sIGJvb2xlYW4gaW1tZXJzaXZlKQorICAgICAgICAgICAgdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbiB7CisgICAgICAgIFBhcmNlbCBkYXRhID0gUGFyY2VsLm9idGFpbigpOworICAgICAgICBQYXJjZWwgcmVwbHkgPSBQYXJjZWwub2J0YWluKCk7CisgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQWN0aXZpdHlNYW5hZ2VyLmRlc2NyaXB0b3IpOworICAgICAgICBkYXRhLndyaXRlU3Ryb25nQmluZGVyKHRva2VuKTsKKyAgICAgICAgZGF0YS53cml0ZUludChpbW1lcnNpdmUgPyAxIDogMCk7CisgICAgICAgIG1SZW1vdGUudHJhbnNhY3QoU0VUX0lNTUVSU0lWRV9UUkFOU0FDVElPTiwgZGF0YSwgcmVwbHksIDApOworICAgICAgICByZXBseS5yZWFkRXhjZXB0aW9uKCk7CisgICAgICAgIGRhdGEucmVjeWNsZSgpOworICAgICAgICByZXBseS5yZWN5Y2xlKCk7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaXNJbW1lcnNpdmUoSUJpbmRlciB0b2tlbikKKyAgICAgICAgICAgIHRocm93cyBSZW1vdGVFeGNlcHRpb24geworICAgICAgICBQYXJjZWwgZGF0YSA9IFBhcmNlbC5vYnRhaW4oKTsKKyAgICAgICAgUGFyY2VsIHJlcGx5ID0gUGFyY2VsLm9idGFpbigpOworICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUFjdGl2aXR5TWFuYWdlci5kZXNjcmlwdG9yKTsKKyAgICAgICAgZGF0YS53cml0ZVN0cm9uZ0JpbmRlcih0b2tlbik7CisgICAgICAgIG1SZW1vdGUudHJhbnNhY3QoSVNfSU1NRVJTSVZFX1RSQU5TQUNUSU9OLCBkYXRhLCByZXBseSwgMCk7CisgICAgICAgIHJlcGx5LnJlYWRFeGNlcHRpb24oKTsKKyAgICAgICAgYm9vbGVhbiByZXMgPSByZXBseS5yZWFkSW50KCkgPT0gMTsKKyAgICAgICAgZGF0YS5yZWN5Y2xlKCk7CisgICAgICAgIHJlcGx5LnJlY3ljbGUoKTsKKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBpc1RvcEFjdGl2aXR5SW1tZXJzaXZlKCkKKyAgICAgICAgICAgIHRocm93cyBSZW1vdGVFeGNlcHRpb24geworICAgICAgICBQYXJjZWwgZGF0YSA9IFBhcmNlbC5vYnRhaW4oKTsKKyAgICAgICAgUGFyY2VsIHJlcGx5ID0gUGFyY2VsLm9idGFpbigpOworICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUFjdGl2aXR5TWFuYWdlci5kZXNjcmlwdG9yKTsKKyAgICAgICAgbVJlbW90ZS50cmFuc2FjdChJU19UT1BfQUNUSVZJVFlfSU1NRVJTSVZFX1RSQU5TQUNUSU9OLCBkYXRhLCByZXBseSwgMCk7CisgICAgICAgIHJlcGx5LnJlYWRFeGNlcHRpb24oKTsKKyAgICAgICAgYm9vbGVhbiByZXMgPSByZXBseS5yZWFkSW50KCkgPT0gMTsKKyAgICAgICAgZGF0YS5yZWN5Y2xlKCk7CisgICAgICAgIHJlcGx5LnJlY3ljbGUoKTsKKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICB9CisKICAgICBwdWJsaWMgdm9pZCBjcmFzaEFwcGxpY2F0aW9uKGludCB1aWQsIGludCBpbml0aWFsUGlkLCBTdHJpbmcgcGFja2FnZU5hbWUsCiAgICAgICAgICAgICBTdHJpbmcgbWVzc2FnZSkgdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbiB7CiAgICAgICAgIFBhcmNlbCBkYXRhID0gUGFyY2VsLm9idGFpbigpOwpAQCAtMjg5NSw2ICsyOTc0LDI4IEBACiAgICAgICAgIGRhdGEucmVjeWNsZSgpOwogICAgICAgICByZXBseS5yZWN5Y2xlKCk7CiAgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gZHVtcEhlYXAoU3RyaW5nIHByb2Nlc3MsIGJvb2xlYW4gbWFuYWdlZCwKKyAgICAgICAgICAgIFN0cmluZyBwYXRoLCBQYXJjZWxGaWxlRGVzY3JpcHRvciBmZCkgdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbiB7CisgICAgICAgIFBhcmNlbCBkYXRhID0gUGFyY2VsLm9idGFpbigpOworICAgICAgICBQYXJjZWwgcmVwbHkgPSBQYXJjZWwub2J0YWluKCk7CisgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQWN0aXZpdHlNYW5hZ2VyLmRlc2NyaXB0b3IpOworICAgICAgICBkYXRhLndyaXRlU3RyaW5nKHByb2Nlc3MpOworICAgICAgICBkYXRhLndyaXRlSW50KG1hbmFnZWQgPyAxIDogMCk7CisgICAgICAgIGRhdGEud3JpdGVTdHJpbmcocGF0aCk7CisgICAgICAgIGlmIChmZCAhPSBudWxsKSB7CisgICAgICAgICAgICBkYXRhLndyaXRlSW50KDEpOworICAgICAgICAgICAgZmQud3JpdGVUb1BhcmNlbChkYXRhLCBQYXJjZWxhYmxlLlBBUkNFTEFCTEVfV1JJVEVfUkVUVVJOX1ZBTFVFKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGRhdGEud3JpdGVJbnQoMCk7CisgICAgICAgIH0KKyAgICAgICAgbVJlbW90ZS50cmFuc2FjdChEVU1QX0hFQVBfVFJBTlNBQ1RJT04sIGRhdGEsIHJlcGx5LCAwKTsKKyAgICAgICAgcmVwbHkucmVhZEV4Y2VwdGlvbigpOworICAgICAgICBib29sZWFuIHJlcyA9IHJlcGx5LnJlYWRJbnQoKSAhPSAwOworICAgICAgICByZXBseS5yZWN5Y2xlKCk7CisgICAgICAgIGRhdGEucmVjeWNsZSgpOworICAgICAgICByZXR1cm4gcmVzOworICAgIH0KICAgICAKICAgICBwcml2YXRlIElCaW5kZXIgbVJlbW90ZTsKIH0KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9BY3Rpdml0eVRocmVhZC5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvYXBwL0FjdGl2aXR5VGhyZWFkLmphdmEKaW5kZXggZDhiNTI1My4uYzBlMjk4NyAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvYXBwL0FjdGl2aXR5VGhyZWFkLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvYXBwL0FjdGl2aXR5VGhyZWFkLmphdmEKQEAgLTMwLDYgKzMwLDcgQEAKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uSVBhY2thZ2VNYW5hZ2VyOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5JbnN0cnVtZW50YXRpb25JbmZvOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5QYWNrYWdlTWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uUGFja2FnZU1hbmFnZXIuTmFtZU5vdEZvdW5kRXhjZXB0aW9uOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5Qcm92aWRlckluZm87CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLlNlcnZpY2VJbmZvOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuQXNzZXRNYW5hZ2VyOwpAQCAtNjIsNiArNjMsNyBAQAogaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CiBpbXBvcnQgYW5kcm9pZC51dGlsLlNsb2c7CiBpbXBvcnQgYW5kcm9pZC52aWV3LkRpc3BsYXk7CitpbXBvcnQgYW5kcm9pZC52aWV3LkhhcmR3YXJlUmVuZGVyZXI7CiBpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CiBpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXdEZWJ1ZzsKIGltcG9ydCBhbmRyb2lkLnZpZXcuVmlld01hbmFnZXI7CkBAIC03NCw2ICs3Niw3IEBACiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwub3MuUnVudGltZUluaXQ7CiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwub3MuU2FtcGxpbmdQcm9maWxlckludGVncmF0aW9uOwogCitpbXBvcnQgZGFsdmlrLnN5c3RlbS5WTURlYnVnOwogaW1wb3J0IG9yZy5hcGFjaGUuaGFybW9ueS54bmV0LnByb3ZpZGVyLmpzc2UuT3BlblNTTFNvY2tldEltcGw7CiAKIGltcG9ydCBqYXZhLmlvLkZpbGU7CkBAIC0xOTcsOCArMjAwLDcgQEAKICAgICAgICAgV2luZG93IHdpbmRvdzsKICAgICAgICAgQWN0aXZpdHkgcGFyZW50OwogICAgICAgICBTdHJpbmcgZW1iZWRkZWRJRDsKLSAgICAgICAgT2JqZWN0IGxhc3ROb25Db25maWd1cmF0aW9uSW5zdGFuY2U7Ci0gICAgICAgIEhhc2hNYXA8U3RyaW5nLE9iamVjdD4gbGFzdE5vbkNvbmZpZ3VyYXRpb25DaGlsZEluc3RhbmNlczsKKyAgICAgICAgQWN0aXZpdHkuTm9uQ29uZmlndXJhdGlvbkluc3RhbmNlcyBsYXN0Tm9uQ29uZmlndXJhdGlvbkluc3RhbmNlczsKICAgICAgICAgYm9vbGVhbiBwYXVzZWQ7CiAgICAgICAgIGJvb2xlYW4gc3RvcHBlZDsKICAgICAgICAgYm9vbGVhbiBoaWRlRm9yTm93OwpAQCAtMzU5LDExICszNjEsMTYgQEAKICAgICAgICAgUGFyY2VsRmlsZURlc2NyaXB0b3IgZmQ7CiAgICAgfQogCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2xhc3MgRHVtcEhlYXBEYXRhIHsKKyAgICAgICAgU3RyaW5nIHBhdGg7CisgICAgICAgIFBhcmNlbEZpbGVEZXNjcmlwdG9yIGZkOworICAgIH0KKwogICAgIHByaXZhdGUgZmluYWwgY2xhc3MgQXBwbGljYXRpb25UaHJlYWQgZXh0ZW5kcyBBcHBsaWNhdGlvblRocmVhZE5hdGl2ZSB7CiAgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBIRUFQX0NPTFVNTiA9ICIlMTdzICU4cyAlOHMgJThzICU4cyI7CiAgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBPTkVfQ09VTlRfQ09MVU1OID0gIiUxN3MgJThkIjsKICAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRXT19DT1VOVF9DT0xVTU5TID0gIiUxN3MgJThkICUxN3MgJThkIjsKLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERCX0lORk9fRk9STUFUID0gIiAgJThkICU4ZCAlMTBkICAlcyI7CisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBEQl9JTkZPX0ZPUk1BVCA9ICIgICU0ZCAlNmQgJThkICUxNHMgICVzIjsKIAogICAgICAgICAvLyBGb3JtYXR0aW5nIGZvciBjaGVja2luIHNlcnZpY2UgLSB1cGRhdGUgdmVyc2lvbiBpZiByb3cgZm9ybWF0IGNoYW5nZXMKICAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEFDVElWSVRZX1RIUkVBRF9DSEVDS0lOX1ZFUlNJT04gPSAxOwpAQCAtNjI2LDYgKzYzMywxMyBAQAogICAgICAgICAgICAgcXVldWVPclNlbmRNZXNzYWdlKEguUFJPRklMRVJfQ09OVFJPTCwgcGNkLCBzdGFydCA/IDEgOiAwKTsKICAgICAgICAgfQogCisgICAgICAgIHB1YmxpYyB2b2lkIGR1bXBIZWFwKGJvb2xlYW4gbWFuYWdlZCwgU3RyaW5nIHBhdGgsIFBhcmNlbEZpbGVEZXNjcmlwdG9yIGZkKSB7CisgICAgICAgICAgICBEdW1wSGVhcERhdGEgZGhkID0gbmV3IER1bXBIZWFwRGF0YSgpOworICAgICAgICAgICAgZGhkLnBhdGggPSBwYXRoOworICAgICAgICAgICAgZGhkLmZkID0gZmQ7CisgICAgICAgICAgICBxdWV1ZU9yU2VuZE1lc3NhZ2UoSC5EVU1QX0hFQVAsIGRoZCwgbWFuYWdlZCA/IDEgOiAwKTsKKyAgICAgICAgfQorCiAgICAgICAgIHB1YmxpYyB2b2lkIHNldFNjaGVkdWxpbmdHcm91cChpbnQgZ3JvdXApIHsKICAgICAgICAgICAgIC8vIE5vdGU6IGRvIHRoaXMgaW1tZWRpYXRlbHksIHNpbmNlIGdvaW5nIGludG8gdGhlIGZvcmVncm91bmQKICAgICAgICAgICAgIC8vIHNob3VsZCBoYXBwZW4gcmVnYXJkbGVzcyBvZiB3aGF0IHBlbmRpbmcgd29yayB3ZSBoYXZlIHRvIGRvCkBAIC02NzQsOCArNjg4LDggQEAKICAgICAgICAgICAgIGxvbmcgZGFsdmlrQWxsb2NhdGVkID0gZGFsdmlrTWF4IC0gZGFsdmlrRnJlZTsKICAgICAgICAgICAgIGxvbmcgdmlld0luc3RhbmNlQ291bnQgPSBWaWV3RGVidWcuZ2V0Vmlld0luc3RhbmNlQ291bnQoKTsKICAgICAgICAgICAgIGxvbmcgdmlld1Jvb3RJbnN0YW5jZUNvdW50ID0gVmlld0RlYnVnLmdldFZpZXdSb290SW5zdGFuY2VDb3VudCgpOwotICAgICAgICAgICAgbG9uZyBhcHBDb250ZXh0SW5zdGFuY2VDb3VudCA9IENvbnRleHRJbXBsLmdldEluc3RhbmNlQ291bnQoKTsKLSAgICAgICAgICAgIGxvbmcgYWN0aXZpdHlJbnN0YW5jZUNvdW50ID0gQWN0aXZpdHkuZ2V0SW5zdGFuY2VDb3VudCgpOworICAgICAgICAgICAgbG9uZyBhcHBDb250ZXh0SW5zdGFuY2VDb3VudCA9IFZNRGVidWcuY291bnRJbnN0YW5jZXNPZkNsYXNzKENvbnRleHRJbXBsLmNsYXNzKTsKKyAgICAgICAgICAgIGxvbmcgYWN0aXZpdHlJbnN0YW5jZUNvdW50ID0gVk1EZWJ1Zy5jb3VudEluc3RhbmNlc09mQ2xhc3MoQWN0aXZpdHkuY2xhc3MpOwogICAgICAgICAgICAgaW50IGdsb2JhbEFzc2V0Q291bnQgPSBBc3NldE1hbmFnZXIuZ2V0R2xvYmFsQXNzZXRDb3VudCgpOwogICAgICAgICAgICAgaW50IGdsb2JhbEFzc2V0TWFuYWdlckNvdW50ID0gQXNzZXRNYW5hZ2VyLmdldEdsb2JhbEFzc2V0TWFuYWdlckNvdW50KCk7CiAgICAgICAgICAgICBpbnQgYmluZGVyTG9jYWxPYmplY3RDb3VudCA9IERlYnVnLmdldEJpbmRlckxvY2FsT2JqZWN0Q291bnQoKTsKQEAgLTc2Myw3ICs3NzcsNyBAQAogICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc3RhdHMuZGJTdGF0cy5zaXplKCk7IGkrKykgewogICAgICAgICAgICAgICAgICAgICBEYlN0YXRzIGRiU3RhdHMgPSBzdGF0cy5kYlN0YXRzLmdldChpKTsKICAgICAgICAgICAgICAgICAgICAgcHJpbnRSb3cocHcsIERCX0lORk9fRk9STUFULCBkYlN0YXRzLnBhZ2VTaXplLCBkYlN0YXRzLmRiU2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYlN0YXRzLmxvb2thc2lkZSwgZGJTdGF0cy5kYk5hbWUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRiU3RhdHMubG9va2FzaWRlLCBkYlN0YXRzLmNhY2hlLCBkYlN0YXRzLmRiTmFtZSk7CiAgICAgICAgICAgICAgICAgICAgIHB3LnByaW50KCcsJyk7CiAgICAgICAgICAgICAgICAgfQogCkBAIC04MTQsMTEgKzgyOCwxMiBAQAogICAgICAgICAgICAgaW50IE4gPSBzdGF0cy5kYlN0YXRzLnNpemUoKTsKICAgICAgICAgICAgIGlmIChOID4gMCkgewogICAgICAgICAgICAgICAgIHB3LnByaW50bG4oIiBEQVRBQkFTRVMiKTsKLSAgICAgICAgICAgICAgICBwcmludFJvdyhwdywgIiAgJThzICU4cyAlMTBzICAlcyIsICJQYWdlc2l6ZSIsICJEYnNpemUiLCAiTG9va2FzaWRlIiwgIkRibmFtZSIpOworICAgICAgICAgICAgICAgIHByaW50Um93KHB3LCAiICAlNHMgJTZzICU4cyAlMTRzICAlcyIsICJwZ3N6IiwgImRic3oiLCAibGthc2lkZSIsICJjYWNoZSIsCisgICAgICAgICAgICAgICAgICAgICJEYm5hbWUiKTsKICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IE47IGkrKykgewogICAgICAgICAgICAgICAgICAgICBEYlN0YXRzIGRiU3RhdHMgPSBzdGF0cy5kYlN0YXRzLmdldChpKTsKICAgICAgICAgICAgICAgICAgICAgcHJpbnRSb3cocHcsIERCX0lORk9fRk9STUFULCBkYlN0YXRzLnBhZ2VTaXplLCBkYlN0YXRzLmRiU2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYlN0YXRzLmxvb2thc2lkZSwgZGJTdGF0cy5kYk5hbWUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRiU3RhdHMubG9va2FzaWRlLCBkYlN0YXRzLmNhY2hlLCBkYlN0YXRzLmRiTmFtZSk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogCkBAIC04NzIsNiArODg3LDcgQEAKICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRU5BQkxFX0pJVCAgICAgICAgICAgICAgPSAxMzI7CiAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERJU1BBVENIX1BBQ0tBR0VfQlJPQURDQVNUID0gMTMzOwogICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTQ0hFRFVMRV9DUkFTSCAgICAgICAgICA9IDEzNDsKKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRFVNUF9IRUFQICAgICAgICAgICAgICAgPSAxMzU7CiAgICAgICAgIFN0cmluZyBjb2RlVG9TdHJpbmcoaW50IGNvZGUpIHsKICAgICAgICAgICAgIGlmIChsb2NhbExPR1YpIHsKICAgICAgICAgICAgICAgICBzd2l0Y2ggKGNvZGUpIHsKQEAgLTkxMCw2ICs5MjYsNyBAQAogICAgICAgICAgICAgICAgICAgICBjYXNlIEVOQUJMRV9KSVQ6IHJldHVybiAiRU5BQkxFX0pJVCI7CiAgICAgICAgICAgICAgICAgICAgIGNhc2UgRElTUEFUQ0hfUEFDS0FHRV9CUk9BRENBU1Q6IHJldHVybiAiRElTUEFUQ0hfUEFDS0FHRV9CUk9BRENBU1QiOwogICAgICAgICAgICAgICAgICAgICBjYXNlIFNDSEVEVUxFX0NSQVNIOiByZXR1cm4gIlNDSEVEVUxFX0NSQVNIIjsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBEVU1QX0hFQVA6IHJldHVybiAiRFVNUF9IRUFQIjsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICByZXR1cm4gIih1bmtub3duKSI7CkBAIC0xMDM1LDEzICsxMDUyLDM1IEBACiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIGNhc2UgU0NIRURVTEVfQ1JBU0g6CiAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBSZW1vdGVTZXJ2aWNlRXhjZXB0aW9uKChTdHJpbmcpbXNnLm9iaik7CisgICAgICAgICAgICAgICAgY2FzZSBEVU1QX0hFQVA6CisgICAgICAgICAgICAgICAgICAgIGhhbmRsZUR1bXBIZWFwKG1zZy5hcmcxICE9IDAsIChEdW1wSGVhcERhdGEpbXNnLm9iaik7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAKICAgICAgICAgdm9pZCBtYXliZVNuYXBzaG90KCkgewogICAgICAgICAgICAgaWYgKG1Cb3VuZEFwcGxpY2F0aW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBTYW1wbGluZ1Byb2ZpbGVySW50ZWdyYXRpb24ud3JpdGVTbmFwc2hvdCgKLSAgICAgICAgICAgICAgICAgICAgICAgIG1Cb3VuZEFwcGxpY2F0aW9uLnByb2Nlc3NOYW1lKTsKKyAgICAgICAgICAgICAgICAvLyBjb252ZXJ0IHRoZSAqcHJpdmF0ZSogQWN0aXZpdHlUaHJlYWQuUGFja2FnZUluZm8gdG8gKnB1YmxpYyoga25vd24KKyAgICAgICAgICAgICAgICAvLyBhbmRyb2lkLmNvbnRlbnQucG0uUGFja2FnZUluZm8KKyAgICAgICAgICAgICAgICBTdHJpbmcgcGFja2FnZU5hbWUgPSBtQm91bmRBcHBsaWNhdGlvbi5pbmZvLm1QYWNrYWdlTmFtZTsKKyAgICAgICAgICAgICAgICBhbmRyb2lkLmNvbnRlbnQucG0uUGFja2FnZUluZm8gcGFja2FnZUluZm8gPSBudWxsOworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIENvbnRleHQgY29udGV4dCA9IGdldFN5c3RlbUNvbnRleHQoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYoY29udGV4dCA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBMb2cuZShUQUcsICJjYW5ub3QgZ2V0IGEgdmFsaWQgY29udGV4dCIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIFBhY2thZ2VNYW5hZ2VyIHBtID0gY29udGV4dC5nZXRQYWNrYWdlTWFuYWdlcigpOworICAgICAgICAgICAgICAgICAgICBpZihwbSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBMb2cuZShUQUcsICJjYW5ub3QgZ2V0IGEgdmFsaWQgUGFja2FnZU1hbmFnZXIiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBwYWNrYWdlSW5mbyA9IHBtLmdldFBhY2thZ2VJbmZvKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhY2thZ2VOYW1lLCBQYWNrYWdlTWFuYWdlci5HRVRfQUNUSVZJVElFUyk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoTmFtZU5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAiY2Fubm90IGdldCBwYWNrYWdlIGluZm8gZm9yICIgKyBwYWNrYWdlTmFtZSwgZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIFNhbXBsaW5nUHJvZmlsZXJJbnRlZ3JhdGlvbi53cml0ZVNuYXBzaG90KG1Cb3VuZEFwcGxpY2F0aW9uLnByb2Nlc3NOYW1lLCBwYWNrYWdlSW5mbyk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CkBAIC0xNDMyLDcgKzE0NzEsNyBAQAogCiAgICAgcHVibGljIGZpbmFsIEFjdGl2aXR5IHN0YXJ0QWN0aXZpdHlOb3coQWN0aXZpdHkgcGFyZW50LCBTdHJpbmcgaWQsCiAgICAgICAgIEludGVudCBpbnRlbnQsIEFjdGl2aXR5SW5mbyBhY3Rpdml0eUluZm8sIElCaW5kZXIgdG9rZW4sIEJ1bmRsZSBzdGF0ZSwKLSAgICAgICAgT2JqZWN0IGxhc3ROb25Db25maWd1cmF0aW9uSW5zdGFuY2UpIHsKKyAgICAgICAgQWN0aXZpdHkuTm9uQ29uZmlndXJhdGlvbkluc3RhbmNlcyBsYXN0Tm9uQ29uZmlndXJhdGlvbkluc3RhbmNlcykgewogICAgICAgICBBY3Rpdml0eUNsaWVudFJlY29yZCByID0gbmV3IEFjdGl2aXR5Q2xpZW50UmVjb3JkKCk7CiAgICAgICAgICAgICByLnRva2VuID0gdG9rZW47CiAgICAgICAgICAgICByLmlkZW50ID0gMDsKQEAgLTE0NDEsNyArMTQ4MCw3IEBACiAgICAgICAgICAgICByLnBhcmVudCA9IHBhcmVudDsKICAgICAgICAgICAgIHIuZW1iZWRkZWRJRCA9IGlkOwogICAgICAgICAgICAgci5hY3Rpdml0eUluZm8gPSBhY3Rpdml0eUluZm87Ci0gICAgICAgICAgICByLmxhc3ROb25Db25maWd1cmF0aW9uSW5zdGFuY2UgPSBsYXN0Tm9uQ29uZmlndXJhdGlvbkluc3RhbmNlOworICAgICAgICAgICAgci5sYXN0Tm9uQ29uZmlndXJhdGlvbkluc3RhbmNlcyA9IGxhc3ROb25Db25maWd1cmF0aW9uSW5zdGFuY2VzOwogICAgICAgICBpZiAobG9jYWxMT0dWKSB7CiAgICAgICAgICAgICBDb21wb25lbnROYW1lIGNvbXBuYW1lID0gaW50ZW50LmdldENvbXBvbmVudCgpOwogICAgICAgICAgICAgU3RyaW5nIG5hbWU7CkBAIC0xNTYzLDE0ICsxNjAyLDEyIEBACiAgICAgICAgICAgICAgICAgICAgICAgICArIHIuYWN0aXZpdHlJbmZvLm5hbWUgKyAiIHdpdGggY29uZmlnICIgKyBjb25maWcpOwogICAgICAgICAgICAgICAgIGFjdGl2aXR5LmF0dGFjaChhcHBDb250ZXh0LCB0aGlzLCBnZXRJbnN0cnVtZW50YXRpb24oKSwgci50b2tlbiwKICAgICAgICAgICAgICAgICAgICAgICAgIHIuaWRlbnQsIGFwcCwgci5pbnRlbnQsIHIuYWN0aXZpdHlJbmZvLCB0aXRsZSwgci5wYXJlbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICByLmVtYmVkZGVkSUQsIHIubGFzdE5vbkNvbmZpZ3VyYXRpb25JbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHIubGFzdE5vbkNvbmZpZ3VyYXRpb25DaGlsZEluc3RhbmNlcywgY29uZmlnKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHIuZW1iZWRkZWRJRCwgci5sYXN0Tm9uQ29uZmlndXJhdGlvbkluc3RhbmNlcywgY29uZmlnKTsKIAogICAgICAgICAgICAgICAgIGlmIChjdXN0b21JbnRlbnQgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgICBhY3Rpdml0eS5tSW50ZW50ID0gY3VzdG9tSW50ZW50OwogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByLmxhc3ROb25Db25maWd1cmF0aW9uSW5zdGFuY2UgPSBudWxsOwotICAgICAgICAgICAgICAgIHIubGFzdE5vbkNvbmZpZ3VyYXRpb25DaGlsZEluc3RhbmNlcyA9IG51bGw7CisgICAgICAgICAgICAgICAgci5sYXN0Tm9uQ29uZmlndXJhdGlvbkluc3RhbmNlcyA9IG51bGw7CiAgICAgICAgICAgICAgICAgYWN0aXZpdHkubVN0YXJ0ZWRBY3Rpdml0eSA9IGZhbHNlOwogICAgICAgICAgICAgICAgIGludCB0aGVtZSA9IHIuYWN0aXZpdHlJbmZvLmdldFRoZW1lUmVzb3VyY2UoKTsKICAgICAgICAgICAgICAgICBpZiAodGhlbWUgIT0gMCkgewpAQCAtMjU0Nyw2ICsyNTg0LDkgQEAKICAgICAgICAgICAgIGlmIChmaW5pc2hpbmcpIHsKICAgICAgICAgICAgICAgICByLmFjdGl2aXR5Lm1GaW5pc2hlZCA9IHRydWU7CiAgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoZ2V0Tm9uQ29uZmlnSW5zdGFuY2UpIHsKKyAgICAgICAgICAgICAgICByLmFjdGl2aXR5Lm1DaGFuZ2luZ0NvbmZpZ3VyYXRpb25zID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmICghci5wYXVzZWQpIHsKICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICByLmFjdGl2aXR5Lm1DYWxsZWQgPSBmYWxzZTsKQEAgLTI1ODcsOCArMjYyNyw4IEBACiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAoZ2V0Tm9uQ29uZmlnSW5zdGFuY2UpIHsKICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICByLmxhc3ROb25Db25maWd1cmF0aW9uSW5zdGFuY2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IHIuYWN0aXZpdHkub25SZXRhaW5Ob25Db25maWd1cmF0aW9uSW5zdGFuY2UoKTsKKyAgICAgICAgICAgICAgICAgICAgci5sYXN0Tm9uQ29uZmlndXJhdGlvbkluc3RhbmNlcworICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gci5hY3Rpdml0eS5yZXRhaW5Ob25Db25maWd1cmF0aW9uSW5zdGFuY2VzKCk7CiAgICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKICAgICAgICAgICAgICAgICAgICAgaWYgKCFtSW5zdHJ1bWVudGF0aW9uLm9uRXhjZXB0aW9uKHIuYWN0aXZpdHksIGUpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigKQEAgLTI1OTcsMjIgKzI2MzcsMTAgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiOiAiICsgZS50b1N0cmluZygpLCBlKTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICByLmxhc3ROb25Db25maWd1cmF0aW9uQ2hpbGRJbnN0YW5jZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IHIuYWN0aXZpdHkub25SZXRhaW5Ob25Db25maWd1cmF0aW9uQ2hpbGRJbnN0YW5jZXMoKTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICBpZiAoIW1JbnN0cnVtZW50YXRpb24ub25FeGNlcHRpb24oci5hY3Rpdml0eSwgZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVW5hYmxlIHRvIHJldGFpbiBjaGlsZCBhY3Rpdml0aWVzICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBzYWZlVG9Db21wb25lbnRTaG9ydFN0cmluZyhyLmludGVudCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiOiAiICsgZS50b1N0cmluZygpLCBlKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQogICAgICAgICAgICAgfQogICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICByLmFjdGl2aXR5Lm1DYWxsZWQgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICByLmFjdGl2aXR5Lm9uRGVzdHJveSgpOworICAgICAgICAgICAgICAgIG1JbnN0cnVtZW50YXRpb24uY2FsbEFjdGl2aXR5T25EZXN0cm95KHIuYWN0aXZpdHkpOwogICAgICAgICAgICAgICAgIGlmICghci5hY3Rpdml0eS5tQ2FsbGVkKSB7CiAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBTdXBlck5vdENhbGxlZEV4Y2VwdGlvbigKICAgICAgICAgICAgICAgICAgICAgICAgICJBY3Rpdml0eSAiICsgc2FmZVRvQ29tcG9uZW50U2hvcnRTdHJpbmcoci5pbnRlbnQpICsKQEAgLTMwMjQsNiArMzA1MiwyNSBAQAogICAgICAgICB9CiAgICAgfQogCisgICAgZmluYWwgdm9pZCBoYW5kbGVEdW1wSGVhcChib29sZWFuIG1hbmFnZWQsIER1bXBIZWFwRGF0YSBkaGQpIHsKKyAgICAgICAgaWYgKG1hbmFnZWQpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgRGVidWcuZHVtcEhwcm9mRGF0YShkaGQucGF0aCwgZGhkLmZkLmdldEZpbGVEZXNjcmlwdG9yKCkpOworICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIFNsb2cudyhUQUcsICJNYW5hZ2VkIGhlYXAgZHVtcCBmYWlsZWQgb24gcGF0aCAiICsgZGhkLnBhdGgKKyAgICAgICAgICAgICAgICAgICAgICAgICsgIiAtLSBjYW4gdGhlIHByb2Nlc3MgYWNjZXNzIHRoaXMgcGF0aD8iKTsKKyAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgZGhkLmZkLmNsb3NlKCk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICBTbG9nLncoVEFHLCAiRmFpbHVyZSBjbG9zaW5nIHByb2ZpbGUgZmQiLCBlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBEZWJ1Zy5kdW1wTmF0aXZlSGVhcChkaGQuZmQuZ2V0RmlsZURlc2NyaXB0b3IoKSk7CisgICAgICAgIH0KKyAgICB9CisKICAgICBmaW5hbCB2b2lkIGhhbmRsZURpc3BhdGNoUGFja2FnZUJyb2FkY2FzdChpbnQgY21kLCBTdHJpbmdbXSBwYWNrYWdlcykgewogICAgICAgICBib29sZWFuIGhhc1BrZ0luZm8gPSBmYWxzZTsKICAgICAgICAgaWYgKHBhY2thZ2VzICE9IG51bGwpIHsKQEAgLTM1ODIsNiArMzYyOSw3IEBACiAgICAgfQogCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBBY3Rpdml0eVRocmVhZCBzeXN0ZW1NYWluKCkgeworICAgICAgICBIYXJkd2FyZVJlbmRlcmVyLmRpc2FibGUoKTsKICAgICAgICAgQWN0aXZpdHlUaHJlYWQgdGhyZWFkID0gbmV3IEFjdGl2aXR5VGhyZWFkKCk7CiAgICAgICAgIHRocmVhZC5hdHRhY2godHJ1ZSk7CiAgICAgICAgIHJldHVybiB0aHJlYWQ7CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9hcHAvQXBwbGljYXRpb25FcnJvclJlcG9ydC5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvYXBwL0FwcGxpY2F0aW9uRXJyb3JSZXBvcnQuamF2YQppbmRleCAyMzgyNTk2Li4xZTAxMmViIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9hcHAvQXBwbGljYXRpb25FcnJvclJlcG9ydC5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9BcHBsaWNhdGlvbkVycm9yUmVwb3J0LmphdmEKQEAgLTE4NCw3ICsxODQsNyBAQAogICAgICAgICBjYW5kaWRhdGUgPSBTeXN0ZW1Qcm9wZXJ0aWVzLmdldChERUZBVUxUX0VSUk9SX1JFQ0VJVkVSX1BST1BFUlRZKTsKICAgICAgICAgcmV0dXJuIGdldEVycm9yUmVwb3J0UmVjZWl2ZXIocG0sIHBhY2thZ2VOYW1lLCBjYW5kaWRhdGUpOwogICAgIH0KLSAgICAKKwogICAgIC8qKgogICAgICAqIFJldHVybiBhY3Rpdml0eSBpbiByZWNlaXZlclBhY2thZ2UgdGhhdCBoYW5kbGVzIEFDVElPTl9BUFBfRVJST1IuCiAgICAgICoKQEAgLTU4MSw2ICs1ODEsOSBAQAogICAgICAgICAgICAgY2FzZSBUWVBFX0JBVFRFUlk6CiAgICAgICAgICAgICAgICAgYmF0dGVyeUluZm8uZHVtcChwdywgcHJlZml4KTsKICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgVFlQRV9SVU5OSU5HX1NFUlZJQ0U6CisgICAgICAgICAgICAgICAgcnVubmluZ1NlcnZpY2VJbmZvLmR1bXAocHcsIHByZWZpeCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KICAgICB9CiB9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9hcHAvQXBwbGljYXRpb25UaHJlYWROYXRpdmUuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9BcHBsaWNhdGlvblRocmVhZE5hdGl2ZS5qYXZhCmluZGV4IDFjMjAwNjIuLmRjMjE0NWYgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9BcHBsaWNhdGlvblRocmVhZE5hdGl2ZS5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9BcHBsaWNhdGlvblRocmVhZE5hdGl2ZS5qYXZhCkBAIC00MDMsNiArNDAzLDE3IEBACiAgICAgICAgICAgICBzY2hlZHVsZUNyYXNoKG1zZyk7CiAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgfQorCisgICAgICAgIGNhc2UgRFVNUF9IRUFQX1RSQU5TQUNUSU9OOgorICAgICAgICB7CisgICAgICAgICAgICBkYXRhLmVuZm9yY2VJbnRlcmZhY2UoSUFwcGxpY2F0aW9uVGhyZWFkLmRlc2NyaXB0b3IpOworICAgICAgICAgICAgYm9vbGVhbiBtYW5hZ2VkID0gZGF0YS5yZWFkSW50KCkgIT0gMDsKKyAgICAgICAgICAgIFN0cmluZyBwYXRoID0gZGF0YS5yZWFkU3RyaW5nKCk7CisgICAgICAgICAgICBQYXJjZWxGaWxlRGVzY3JpcHRvciBmZCA9IGRhdGEucmVhZEludCgpICE9IDAKKyAgICAgICAgICAgICAgICAgICAgPyBkYXRhLnJlYWRGaWxlRGVzY3JpcHRvcigpIDogbnVsbDsKKyAgICAgICAgICAgIGR1bXBIZWFwKG1hbmFnZWQsIHBhdGgsIGZkKTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CiAgICAgICAgIH0KIAogICAgICAgICByZXR1cm4gc3VwZXIub25UcmFuc2FjdChjb2RlLCBkYXRhLCByZXBseSwgZmxhZ3MpOwpAQCAtODI5LDUgKzg0MCwyMiBAQAogICAgICAgICBkYXRhLnJlY3ljbGUoKTsKICAgICAgICAgCiAgICAgfQorCisgICAgcHVibGljIHZvaWQgZHVtcEhlYXAoYm9vbGVhbiBtYW5hZ2VkLCBTdHJpbmcgcGF0aCwKKyAgICAgICAgICAgIFBhcmNlbEZpbGVEZXNjcmlwdG9yIGZkKSB0aHJvd3MgUmVtb3RlRXhjZXB0aW9uIHsKKyAgICAgICAgUGFyY2VsIGRhdGEgPSBQYXJjZWwub2J0YWluKCk7CisgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQXBwbGljYXRpb25UaHJlYWQuZGVzY3JpcHRvcik7CisgICAgICAgIGRhdGEud3JpdGVJbnQobWFuYWdlZCA/IDEgOiAwKTsKKyAgICAgICAgZGF0YS53cml0ZVN0cmluZyhwYXRoKTsKKyAgICAgICAgaWYgKGZkICE9IG51bGwpIHsKKyAgICAgICAgICAgIGRhdGEud3JpdGVJbnQoMSk7CisgICAgICAgICAgICBmZC53cml0ZVRvUGFyY2VsKGRhdGEsIFBhcmNlbGFibGUuUEFSQ0VMQUJMRV9XUklURV9SRVRVUk5fVkFMVUUpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZGF0YS53cml0ZUludCgwKTsKKyAgICAgICAgfQorICAgICAgICBtUmVtb3RlLnRyYW5zYWN0KERVTVBfSEVBUF9UUkFOU0FDVElPTiwgZGF0YSwgbnVsbCwKKyAgICAgICAgICAgICAgICBJQmluZGVyLkZMQUdfT05FV0FZKTsKKyAgICAgICAgZGF0YS5yZWN5Y2xlKCk7CisgICAgfQogfQogCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9hcHAvQmFja1N0YWNrRW50cnkuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9CYWNrU3RhY2tFbnRyeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI5NmI0OTUKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9hcHAvQmFja1N0YWNrRW50cnkuamF2YQpAQCAtMCwwICsxLDQ5OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5hcHA7CisKK2ltcG9ydCBhbmRyb2lkLm9zLlBhcmNlbDsKK2ltcG9ydCBhbmRyb2lkLm9zLlBhcmNlbGFibGU7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CisKK2ZpbmFsIGNsYXNzIEJhY2tTdGFja1N0YXRlIGltcGxlbWVudHMgUGFyY2VsYWJsZSB7CisgICAgZmluYWwgaW50W10gbU9wczsKKyAgICBmaW5hbCBpbnQgbVRyYW5zaXRpb247CisgICAgZmluYWwgaW50IG1UcmFuc2l0aW9uU3R5bGU7CisgICAgZmluYWwgU3RyaW5nIG1OYW1lOworICAgIGZpbmFsIGludCBtSW5kZXg7CisgICAgCisgICAgcHVibGljIEJhY2tTdGFja1N0YXRlKEZyYWdtZW50TWFuYWdlckltcGwgZm0sIEJhY2tTdGFja0VudHJ5IGJzZSkgeworICAgICAgICBpbnQgbnVtUmVtb3ZlZCA9IDA7CisgICAgICAgIEJhY2tTdGFja0VudHJ5Lk9wIG9wID0gYnNlLm1IZWFkOworICAgICAgICB3aGlsZSAob3AgIT0gbnVsbCkgeworICAgICAgICAgICAgaWYgKG9wLnJlbW92ZWQgIT0gbnVsbCkgbnVtUmVtb3ZlZCArPSBvcC5yZW1vdmVkLnNpemUoKTsKKyAgICAgICAgICAgIG9wID0gb3AubmV4dDsKKyAgICAgICAgfQorICAgICAgICBtT3BzID0gbmV3IGludFtic2UubU51bU9wKjUgKyBudW1SZW1vdmVkXTsKKyAgICAgICAgCisgICAgICAgIGlmICghYnNlLm1BZGRUb0JhY2tTdGFjaykgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiTm90IG9uIGJhY2sgc3RhY2siKTsKKyAgICAgICAgfQorCisgICAgICAgIG9wID0gYnNlLm1IZWFkOworICAgICAgICBpbnQgcG9zID0gMDsKKyAgICAgICAgd2hpbGUgKG9wICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1PcHNbcG9zKytdID0gb3AuY21kOworICAgICAgICAgICAgbU9wc1twb3MrK10gPSBvcC5mcmFnbWVudC5tSW5kZXg7CisgICAgICAgICAgICBtT3BzW3BvcysrXSA9IG9wLmVudGVyQW5pbTsKKyAgICAgICAgICAgIG1PcHNbcG9zKytdID0gb3AuZXhpdEFuaW07CisgICAgICAgICAgICBpZiAob3AucmVtb3ZlZCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgZmluYWwgaW50IE4gPSBvcC5yZW1vdmVkLnNpemUoKTsKKyAgICAgICAgICAgICAgICBtT3BzW3BvcysrXSA9IE47CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaT0wOyBpPE47IGkrKykgeworICAgICAgICAgICAgICAgICAgICBtT3BzW3BvcysrXSA9IG9wLnJlbW92ZWQuZ2V0KGkpLm1JbmRleDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG1PcHNbcG9zKytdID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG9wID0gb3AubmV4dDsKKyAgICAgICAgfQorICAgICAgICBtVHJhbnNpdGlvbiA9IGJzZS5tVHJhbnNpdGlvbjsKKyAgICAgICAgbVRyYW5zaXRpb25TdHlsZSA9IGJzZS5tVHJhbnNpdGlvblN0eWxlOworICAgICAgICBtTmFtZSA9IGJzZS5tTmFtZTsKKyAgICAgICAgbUluZGV4ID0gYnNlLm1JbmRleDsKKyAgICB9CisgICAgCisgICAgcHVibGljIEJhY2tTdGFja1N0YXRlKFBhcmNlbCBpbikgeworICAgICAgICBtT3BzID0gaW4uY3JlYXRlSW50QXJyYXkoKTsKKyAgICAgICAgbVRyYW5zaXRpb24gPSBpbi5yZWFkSW50KCk7CisgICAgICAgIG1UcmFuc2l0aW9uU3R5bGUgPSBpbi5yZWFkSW50KCk7CisgICAgICAgIG1OYW1lID0gaW4ucmVhZFN0cmluZygpOworICAgICAgICBtSW5kZXggPSBpbi5yZWFkSW50KCk7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBCYWNrU3RhY2tFbnRyeSBpbnN0YW50aWF0ZShGcmFnbWVudE1hbmFnZXJJbXBsIGZtKSB7CisgICAgICAgIEJhY2tTdGFja0VudHJ5IGJzZSA9IG5ldyBCYWNrU3RhY2tFbnRyeShmbSk7CisgICAgICAgIGludCBwb3MgPSAwOworICAgICAgICB3aGlsZSAocG9zIDwgbU9wcy5sZW5ndGgpIHsKKyAgICAgICAgICAgIEJhY2tTdGFja0VudHJ5Lk9wIG9wID0gbmV3IEJhY2tTdGFja0VudHJ5Lk9wKCk7CisgICAgICAgICAgICBvcC5jbWQgPSBtT3BzW3BvcysrXTsKKyAgICAgICAgICAgIGlmIChGcmFnbWVudE1hbmFnZXJJbXBsLkRFQlVHKSBMb2cudihGcmFnbWVudE1hbmFnZXJJbXBsLlRBRywKKyAgICAgICAgICAgICAgICAgICAgIkJTRSAiICsgYnNlICsgIiBzZXQgYmFzZSBmcmFnbWVudCAjIiArIG1PcHNbcG9zXSk7CisgICAgICAgICAgICBGcmFnbWVudCBmID0gZm0ubUFjdGl2ZS5nZXQobU9wc1twb3MrK10pOworICAgICAgICAgICAgb3AuZnJhZ21lbnQgPSBmOworICAgICAgICAgICAgb3AuZW50ZXJBbmltID0gbU9wc1twb3MrK107CisgICAgICAgICAgICBvcC5leGl0QW5pbSA9IG1PcHNbcG9zKytdOworICAgICAgICAgICAgZmluYWwgaW50IE4gPSBtT3BzW3BvcysrXTsKKyAgICAgICAgICAgIGlmIChOID4gMCkgeworICAgICAgICAgICAgICAgIG9wLnJlbW92ZWQgPSBuZXcgQXJyYXlMaXN0PEZyYWdtZW50PihOKTsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpPTA7IGk8TjsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChGcmFnbWVudE1hbmFnZXJJbXBsLkRFQlVHKSBMb2cudihGcmFnbWVudE1hbmFnZXJJbXBsLlRBRywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQlNFICIgKyBic2UgKyAiIHNldCByZW1vdmUgZnJhZ21lbnQgIyIgKyBtT3BzW3Bvc10pOworICAgICAgICAgICAgICAgICAgICBGcmFnbWVudCByID0gZm0ubUFjdGl2ZS5nZXQobU9wc1twb3MrK10pOworICAgICAgICAgICAgICAgICAgICBvcC5yZW1vdmVkLmFkZChyKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBic2UuYWRkT3Aob3ApOworICAgICAgICB9CisgICAgICAgIGJzZS5tVHJhbnNpdGlvbiA9IG1UcmFuc2l0aW9uOworICAgICAgICBic2UubVRyYW5zaXRpb25TdHlsZSA9IG1UcmFuc2l0aW9uU3R5bGU7CisgICAgICAgIGJzZS5tTmFtZSA9IG1OYW1lOworICAgICAgICBic2UubUluZGV4ID0gbUluZGV4OworICAgICAgICBic2UubUFkZFRvQmFja1N0YWNrID0gdHJ1ZTsKKyAgICAgICAgYnNlLmJ1bXBCYWNrU3RhY2tOZXN0aW5nKDEpOworICAgICAgICByZXR1cm4gYnNlOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgaW50IGRlc2NyaWJlQ29udGVudHMoKSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHdyaXRlVG9QYXJjZWwoUGFyY2VsIGRlc3QsIGludCBmbGFncykgeworICAgICAgICBkZXN0LndyaXRlSW50QXJyYXkobU9wcyk7CisgICAgICAgIGRlc3Qud3JpdGVJbnQobVRyYW5zaXRpb24pOworICAgICAgICBkZXN0LndyaXRlSW50KG1UcmFuc2l0aW9uU3R5bGUpOworICAgICAgICBkZXN0LndyaXRlU3RyaW5nKG1OYW1lKTsKKyAgICAgICAgZGVzdC53cml0ZUludChtSW5kZXgpOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFBhcmNlbGFibGUuQ3JlYXRvcjxCYWNrU3RhY2tTdGF0ZT4gQ1JFQVRPUgorICAgICAgICAgICAgPSBuZXcgUGFyY2VsYWJsZS5DcmVhdG9yPEJhY2tTdGFja1N0YXRlPigpIHsKKyAgICAgICAgcHVibGljIEJhY2tTdGFja1N0YXRlIGNyZWF0ZUZyb21QYXJjZWwoUGFyY2VsIGluKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IEJhY2tTdGFja1N0YXRlKGluKTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgcHVibGljIEJhY2tTdGFja1N0YXRlW10gbmV3QXJyYXkoaW50IHNpemUpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgQmFja1N0YWNrU3RhdGVbc2l6ZV07CisgICAgICAgIH0KKyAgICB9OworfQorCisvKioKKyAqIEBoaWRlIEVudHJ5IG9mIGFuIG9wZXJhdGlvbiBvbiB0aGUgZnJhZ21lbnQgYmFjayBzdGFjay4KKyAqLworZmluYWwgY2xhc3MgQmFja1N0YWNrRW50cnkgaW1wbGVtZW50cyBGcmFnbWVudFRyYW5zYWN0aW9uLCBSdW5uYWJsZSB7CisgICAgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiQmFja1N0YWNrRW50cnkiOworICAgIAorICAgIGZpbmFsIEZyYWdtZW50TWFuYWdlckltcGwgbU1hbmFnZXI7CisgICAgCisgICAgc3RhdGljIGZpbmFsIGludCBPUF9OVUxMID0gMDsKKyAgICBzdGF0aWMgZmluYWwgaW50IE9QX0FERCA9IDE7CisgICAgc3RhdGljIGZpbmFsIGludCBPUF9SRVBMQUNFID0gMjsKKyAgICBzdGF0aWMgZmluYWwgaW50IE9QX1JFTU9WRSA9IDM7CisgICAgc3RhdGljIGZpbmFsIGludCBPUF9ISURFID0gNDsKKyAgICBzdGF0aWMgZmluYWwgaW50IE9QX1NIT1cgPSA1OworICAgIAorICAgIHN0YXRpYyBmaW5hbCBjbGFzcyBPcCB7CisgICAgICAgIE9wIG5leHQ7CisgICAgICAgIE9wIHByZXY7CisgICAgICAgIGludCBjbWQ7CisgICAgICAgIEZyYWdtZW50IGZyYWdtZW50OworICAgICAgICBpbnQgZW50ZXJBbmltOworICAgICAgICBpbnQgZXhpdEFuaW07CisgICAgICAgIEFycmF5TGlzdDxGcmFnbWVudD4gcmVtb3ZlZDsKKyAgICB9CisgICAgCisgICAgT3AgbUhlYWQ7CisgICAgT3AgbVRhaWw7CisgICAgaW50IG1OdW1PcDsKKyAgICBpbnQgbUVudGVyQW5pbTsKKyAgICBpbnQgbUV4aXRBbmltOworICAgIGludCBtVHJhbnNpdGlvbjsKKyAgICBpbnQgbVRyYW5zaXRpb25TdHlsZTsKKyAgICBib29sZWFuIG1BZGRUb0JhY2tTdGFjazsKKyAgICBTdHJpbmcgbU5hbWU7CisgICAgYm9vbGVhbiBtQ29tbWl0dGVkOworICAgIGludCBtSW5kZXg7CisgICAgCisgICAgcHVibGljIEJhY2tTdGFja0VudHJ5KEZyYWdtZW50TWFuYWdlckltcGwgbWFuYWdlcikgeworICAgICAgICBtTWFuYWdlciA9IG1hbmFnZXI7CisgICAgfQorICAgIAorICAgIHZvaWQgYWRkT3AoT3Agb3ApIHsKKyAgICAgICAgaWYgKG1IZWFkID09IG51bGwpIHsKKyAgICAgICAgICAgIG1IZWFkID0gbVRhaWwgPSBvcDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG9wLnByZXYgPSBtVGFpbDsKKyAgICAgICAgICAgIG1UYWlsLm5leHQgPSBvcDsKKyAgICAgICAgICAgIG1UYWlsID0gb3A7CisgICAgICAgIH0KKyAgICAgICAgb3AuZW50ZXJBbmltID0gbUVudGVyQW5pbTsKKyAgICAgICAgb3AuZXhpdEFuaW0gPSBtRXhpdEFuaW07CisgICAgICAgIG1OdW1PcCsrOworICAgIH0KKyAgICAgICAgCisgICAgcHVibGljIEZyYWdtZW50VHJhbnNhY3Rpb24gYWRkKEZyYWdtZW50IGZyYWdtZW50LCBTdHJpbmcgdGFnKSB7CisgICAgICAgIGRvQWRkT3AoMCwgZnJhZ21lbnQsIHRhZywgT1BfQUREKTsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgcHVibGljIEZyYWdtZW50VHJhbnNhY3Rpb24gYWRkKGludCBjb250YWluZXJWaWV3SWQsIEZyYWdtZW50IGZyYWdtZW50KSB7CisgICAgICAgIGRvQWRkT3AoY29udGFpbmVyVmlld0lkLCBmcmFnbWVudCwgbnVsbCwgT1BfQUREKTsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgcHVibGljIEZyYWdtZW50VHJhbnNhY3Rpb24gYWRkKGludCBjb250YWluZXJWaWV3SWQsIEZyYWdtZW50IGZyYWdtZW50LCBTdHJpbmcgdGFnKSB7CisgICAgICAgIGRvQWRkT3AoY29udGFpbmVyVmlld0lkLCBmcmFnbWVudCwgdGFnLCBPUF9BREQpOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgZG9BZGRPcChpbnQgY29udGFpbmVyVmlld0lkLCBGcmFnbWVudCBmcmFnbWVudCwgU3RyaW5nIHRhZywgaW50IG9wY21kKSB7CisgICAgICAgIGlmIChmcmFnbWVudC5tSW1tZWRpYXRlQWN0aXZpdHkgIT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiRnJhZ21lbnQgYWxyZWFkeSBhZGRlZDogIiArIGZyYWdtZW50KTsKKyAgICAgICAgfQorICAgICAgICBmcmFnbWVudC5tSW1tZWRpYXRlQWN0aXZpdHkgPSBtTWFuYWdlci5tQWN0aXZpdHk7CisgICAgICAgIGZyYWdtZW50Lm1GcmFnbWVudE1hbmFnZXIgPSBtTWFuYWdlcjsKKyAgICAgICAgCisgICAgICAgIGlmICh0YWcgIT0gbnVsbCkgeworICAgICAgICAgICAgaWYgKGZyYWdtZW50Lm1UYWcgIT0gbnVsbCAmJiAhdGFnLmVxdWFscyhmcmFnbWVudC5tVGFnKSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkNhbid0IGNoYW5nZSB0YWcgb2YgZnJhZ21lbnQgIgorICAgICAgICAgICAgICAgICAgICAgICAgKyBmcmFnbWVudCArICI6IHdhcyAiICsgZnJhZ21lbnQubVRhZworICAgICAgICAgICAgICAgICAgICAgICAgKyAiIG5vdyAiICsgdGFnKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZyYWdtZW50Lm1UYWcgPSB0YWc7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIGlmIChjb250YWluZXJWaWV3SWQgIT0gMCkgeworICAgICAgICAgICAgaWYgKGZyYWdtZW50Lm1GcmFnbWVudElkICE9IDAgJiYgZnJhZ21lbnQubUZyYWdtZW50SWQgIT0gY29udGFpbmVyVmlld0lkKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiQ2FuJ3QgY2hhbmdlIGNvbnRhaW5lciBJRCBvZiBmcmFnbWVudCAiCisgICAgICAgICAgICAgICAgICAgICAgICArIGZyYWdtZW50ICsgIjogd2FzICIgKyBmcmFnbWVudC5tRnJhZ21lbnRJZAorICAgICAgICAgICAgICAgICAgICAgICAgKyAiIG5vdyAiICsgY29udGFpbmVyVmlld0lkKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZyYWdtZW50Lm1Db250YWluZXJJZCA9IGZyYWdtZW50Lm1GcmFnbWVudElkID0gY29udGFpbmVyVmlld0lkOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBPcCBvcCA9IG5ldyBPcCgpOworICAgICAgICBvcC5jbWQgPSBvcGNtZDsKKyAgICAgICAgb3AuZnJhZ21lbnQgPSBmcmFnbWVudDsKKyAgICAgICAgYWRkT3Aob3ApOworICAgIH0KKworICAgIHB1YmxpYyBGcmFnbWVudFRyYW5zYWN0aW9uIHJlcGxhY2UoaW50IGNvbnRhaW5lclZpZXdJZCwgRnJhZ21lbnQgZnJhZ21lbnQpIHsKKyAgICAgICAgcmV0dXJuIHJlcGxhY2UoY29udGFpbmVyVmlld0lkLCBmcmFnbWVudCwgbnVsbCk7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBGcmFnbWVudFRyYW5zYWN0aW9uIHJlcGxhY2UoaW50IGNvbnRhaW5lclZpZXdJZCwgRnJhZ21lbnQgZnJhZ21lbnQsIFN0cmluZyB0YWcpIHsKKyAgICAgICAgaWYgKGNvbnRhaW5lclZpZXdJZCA9PSAwKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJNdXN0IHVzZSBub24temVybyBjb250YWluZXJWaWV3SWQiKTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgZG9BZGRPcChjb250YWluZXJWaWV3SWQsIGZyYWdtZW50LCB0YWcsIE9QX1JFUExBQ0UpOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisgICAgCisgICAgcHVibGljIEZyYWdtZW50VHJhbnNhY3Rpb24gcmVtb3ZlKEZyYWdtZW50IGZyYWdtZW50KSB7CisgICAgICAgIGlmIChmcmFnbWVudC5tSW1tZWRpYXRlQWN0aXZpdHkgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiRnJhZ21lbnQgbm90IGFkZGVkOiAiICsgZnJhZ21lbnQpOworICAgICAgICB9CisgICAgICAgIGZyYWdtZW50Lm1JbW1lZGlhdGVBY3Rpdml0eSA9IG51bGw7CisgICAgICAgIAorICAgICAgICBPcCBvcCA9IG5ldyBPcCgpOworICAgICAgICBvcC5jbWQgPSBPUF9SRU1PVkU7CisgICAgICAgIG9wLmZyYWdtZW50ID0gZnJhZ21lbnQ7CisgICAgICAgIGFkZE9wKG9wKTsKKyAgICAgICAgCisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIHB1YmxpYyBGcmFnbWVudFRyYW5zYWN0aW9uIGhpZGUoRnJhZ21lbnQgZnJhZ21lbnQpIHsKKyAgICAgICAgaWYgKGZyYWdtZW50Lm1JbW1lZGlhdGVBY3Rpdml0eSA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJGcmFnbWVudCBub3QgYWRkZWQ6ICIgKyBmcmFnbWVudCk7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIE9wIG9wID0gbmV3IE9wKCk7CisgICAgICAgIG9wLmNtZCA9IE9QX0hJREU7CisgICAgICAgIG9wLmZyYWdtZW50ID0gZnJhZ21lbnQ7CisgICAgICAgIGFkZE9wKG9wKTsKKyAgICAgICAgCisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgRnJhZ21lbnRUcmFuc2FjdGlvbiBzaG93KEZyYWdtZW50IGZyYWdtZW50KSB7CisgICAgICAgIGlmIChmcmFnbWVudC5tSW1tZWRpYXRlQWN0aXZpdHkgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiRnJhZ21lbnQgbm90IGFkZGVkOiAiICsgZnJhZ21lbnQpOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBPcCBvcCA9IG5ldyBPcCgpOworICAgICAgICBvcC5jbWQgPSBPUF9TSE9XOworICAgICAgICBvcC5mcmFnbWVudCA9IGZyYWdtZW50OworICAgICAgICBhZGRPcChvcCk7CisgICAgICAgIAorICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisgICAgCisgICAgcHVibGljIEZyYWdtZW50VHJhbnNhY3Rpb24gc2V0Q3VzdG9tQW5pbWF0aW9ucyhpbnQgZW50ZXIsIGludCBleGl0KSB7CisgICAgICAgIG1FbnRlckFuaW0gPSBlbnRlcjsKKyAgICAgICAgbUV4aXRBbmltID0gZXhpdDsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBGcmFnbWVudFRyYW5zYWN0aW9uIHNldFRyYW5zaXRpb24oaW50IHRyYW5zaXRpb24pIHsKKyAgICAgICAgbVRyYW5zaXRpb24gPSB0cmFuc2l0aW9uOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisgICAgCisgICAgcHVibGljIEZyYWdtZW50VHJhbnNhY3Rpb24gc2V0VHJhbnNpdGlvblN0eWxlKGludCBzdHlsZVJlcykgeworICAgICAgICBtVHJhbnNpdGlvblN0eWxlID0gc3R5bGVSZXM7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgRnJhZ21lbnRUcmFuc2FjdGlvbiBhZGRUb0JhY2tTdGFjayhTdHJpbmcgbmFtZSkgeworICAgICAgICBtQWRkVG9CYWNrU3RhY2sgPSB0cnVlOworICAgICAgICBtTmFtZSA9IG5hbWU7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIHZvaWQgYnVtcEJhY2tTdGFja05lc3RpbmcoaW50IGFtdCkgeworICAgICAgICBpZiAoIW1BZGRUb0JhY2tTdGFjaykgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGlmIChGcmFnbWVudE1hbmFnZXJJbXBsLkRFQlVHKSBMb2cudihUQUcsICJCdW1wIG5lc3RpbmcgaW4gIiArIHRoaXMKKyAgICAgICAgICAgICAgICArICIgYnkgIiArIGFtdCk7CisgICAgICAgIE9wIG9wID0gbUhlYWQ7CisgICAgICAgIHdoaWxlIChvcCAhPSBudWxsKSB7CisgICAgICAgICAgICBvcC5mcmFnbWVudC5tQmFja1N0YWNrTmVzdGluZyArPSBhbXQ7CisgICAgICAgICAgICBpZiAoRnJhZ21lbnRNYW5hZ2VySW1wbC5ERUJVRykgTG9nLnYoVEFHLCAiQnVtcCBuZXN0aW5nIG9mICIKKyAgICAgICAgICAgICAgICAgICAgKyBvcC5mcmFnbWVudCArICIgdG8gIiArIG9wLmZyYWdtZW50Lm1CYWNrU3RhY2tOZXN0aW5nKTsKKyAgICAgICAgICAgIGlmIChvcC5yZW1vdmVkICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpPW9wLnJlbW92ZWQuc2l6ZSgpLTE7IGk+PTA7IGktLSkgeworICAgICAgICAgICAgICAgICAgICBGcmFnbWVudCByID0gb3AucmVtb3ZlZC5nZXQoaSk7CisgICAgICAgICAgICAgICAgICAgIHIubUJhY2tTdGFja05lc3RpbmcgKz0gYW10OworICAgICAgICAgICAgICAgICAgICBpZiAoRnJhZ21lbnRNYW5hZ2VySW1wbC5ERUJVRykgTG9nLnYoVEFHLCAiQnVtcCBuZXN0aW5nIG9mICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHIgKyAiIHRvICIgKyByLm1CYWNrU3RhY2tOZXN0aW5nKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBvcCA9IG9wLm5leHQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGNvbW1pdCgpIHsKKyAgICAgICAgaWYgKG1Db21taXR0ZWQpIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oImNvbW1pdCBhbHJlYWR5IGNhbGxlZCIpOworICAgICAgICBpZiAoRnJhZ21lbnRNYW5hZ2VySW1wbC5ERUJVRykgTG9nLnYoVEFHLCAiQ29tbWl0OiAiICsgdGhpcyk7CisgICAgICAgIG1Db21taXR0ZWQgPSB0cnVlOworICAgICAgICBpZiAobUFkZFRvQmFja1N0YWNrKSB7CisgICAgICAgICAgICBtSW5kZXggPSBtTWFuYWdlci5hbGxvY0JhY2tTdGFja0luZGV4KHRoaXMpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbUluZGV4ID0gLTE7CisgICAgICAgIH0KKyAgICAgICAgbU1hbmFnZXIuZW5xdWV1ZUFjdGlvbih0aGlzKTsKKyAgICAgICAgcmV0dXJuIG1JbmRleDsKKyAgICB9CisgICAgCisgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICBpZiAoRnJhZ21lbnRNYW5hZ2VySW1wbC5ERUJVRykgTG9nLnYoVEFHLCAiUnVuOiAiICsgdGhpcyk7CisgICAgICAgIAorICAgICAgICBpZiAobUFkZFRvQmFja1N0YWNrKSB7CisgICAgICAgICAgICBpZiAobUluZGV4IDwgMCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oImFkZFRvQmFja1N0YWNrKCkgY2FsbGVkIGFmdGVyIGNvbW1pdCgpIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBidW1wQmFja1N0YWNrTmVzdGluZygxKTsKKworICAgICAgICBPcCBvcCA9IG1IZWFkOworICAgICAgICB3aGlsZSAob3AgIT0gbnVsbCkgeworICAgICAgICAgICAgc3dpdGNoIChvcC5jbWQpIHsKKyAgICAgICAgICAgICAgICBjYXNlIE9QX0FERDogeworICAgICAgICAgICAgICAgICAgICBGcmFnbWVudCBmID0gb3AuZnJhZ21lbnQ7CisgICAgICAgICAgICAgICAgICAgIGYubU5leHRBbmltID0gb3AuZW50ZXJBbmltOworICAgICAgICAgICAgICAgICAgICBtTWFuYWdlci5hZGRGcmFnbWVudChmLCBmYWxzZSk7CisgICAgICAgICAgICAgICAgfSBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIE9QX1JFUExBQ0U6IHsKKyAgICAgICAgICAgICAgICAgICAgRnJhZ21lbnQgZiA9IG9wLmZyYWdtZW50OworICAgICAgICAgICAgICAgICAgICBpZiAobU1hbmFnZXIubUFkZGVkICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGk9MDsgaTxtTWFuYWdlci5tQWRkZWQuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBGcmFnbWVudCBvbGQgPSBtTWFuYWdlci5tQWRkZWQuZ2V0KGkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChGcmFnbWVudE1hbmFnZXJJbXBsLkRFQlVHKSBMb2cudihUQUcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiT1BfUkVQTEFDRTogYWRkaW5nPSIgKyBmICsgIiBvbGQ9IiArIG9sZCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9sZC5tQ29udGFpbmVySWQgPT0gZi5tQ29udGFpbmVySWQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9wLnJlbW92ZWQgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3AucmVtb3ZlZCA9IG5ldyBBcnJheUxpc3Q8RnJhZ21lbnQ+KCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3AucmVtb3ZlZC5hZGQob2xkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2xkLm1OZXh0QW5pbSA9IG9wLmV4aXRBbmltOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobUFkZFRvQmFja1N0YWNrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbGQubUJhY2tTdGFja05lc3RpbmcgKz0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChGcmFnbWVudE1hbmFnZXJJbXBsLkRFQlVHKSBMb2cudihUQUcsICJCdW1wIG5lc3Rpbmcgb2YgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIG9sZCArICIgdG8gIiArIG9sZC5tQmFja1N0YWNrTmVzdGluZyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbU1hbmFnZXIucmVtb3ZlRnJhZ21lbnQob2xkLCBtVHJhbnNpdGlvbiwgbVRyYW5zaXRpb25TdHlsZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGYubU5leHRBbmltID0gb3AuZW50ZXJBbmltOworICAgICAgICAgICAgICAgICAgICBtTWFuYWdlci5hZGRGcmFnbWVudChmLCBmYWxzZSk7CisgICAgICAgICAgICAgICAgfSBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIE9QX1JFTU9WRTogeworICAgICAgICAgICAgICAgICAgICBGcmFnbWVudCBmID0gb3AuZnJhZ21lbnQ7CisgICAgICAgICAgICAgICAgICAgIGYubU5leHRBbmltID0gb3AuZXhpdEFuaW07CisgICAgICAgICAgICAgICAgICAgIG1NYW5hZ2VyLnJlbW92ZUZyYWdtZW50KGYsIG1UcmFuc2l0aW9uLCBtVHJhbnNpdGlvblN0eWxlKTsKKyAgICAgICAgICAgICAgICB9IGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgT1BfSElERTogeworICAgICAgICAgICAgICAgICAgICBGcmFnbWVudCBmID0gb3AuZnJhZ21lbnQ7CisgICAgICAgICAgICAgICAgICAgIGYubU5leHRBbmltID0gb3AuZXhpdEFuaW07CisgICAgICAgICAgICAgICAgICAgIG1NYW5hZ2VyLmhpZGVGcmFnbWVudChmLCBtVHJhbnNpdGlvbiwgbVRyYW5zaXRpb25TdHlsZSk7CisgICAgICAgICAgICAgICAgfSBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIE9QX1NIT1c6IHsKKyAgICAgICAgICAgICAgICAgICAgRnJhZ21lbnQgZiA9IG9wLmZyYWdtZW50OworICAgICAgICAgICAgICAgICAgICBmLm1OZXh0QW5pbSA9IG9wLmVudGVyQW5pbTsKKyAgICAgICAgICAgICAgICAgICAgbU1hbmFnZXIuc2hvd0ZyYWdtZW50KGYsIG1UcmFuc2l0aW9uLCBtVHJhbnNpdGlvblN0eWxlKTsKKyAgICAgICAgICAgICAgICB9IGJyZWFrOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVW5rbm93biBjbWQ6ICIgKyBvcC5jbWQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIAorICAgICAgICAgICAgb3AgPSBvcC5uZXh0OworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBtTWFuYWdlci5tb3ZlVG9TdGF0ZShtTWFuYWdlci5tQ3VyU3RhdGUsIG1UcmFuc2l0aW9uLAorICAgICAgICAgICAgICAgIG1UcmFuc2l0aW9uU3R5bGUsIHRydWUpOworICAgICAgICAKKyAgICAgICAgaWYgKG1BZGRUb0JhY2tTdGFjaykgeworICAgICAgICAgICAgbU1hbmFnZXIuYWRkQmFja1N0YWNrU3RhdGUodGhpcyk7CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgcHVibGljIHZvaWQgcG9wRnJvbUJhY2tTdGFjayhib29sZWFuIGRvU3RhdGVNb3ZlKSB7CisgICAgICAgIGlmIChGcmFnbWVudE1hbmFnZXJJbXBsLkRFQlVHKSBMb2cudihUQUcsICJwb3BGcm9tQmFja1N0YWNrOiAiICsgdGhpcyk7CisKKyAgICAgICAgYnVtcEJhY2tTdGFja05lc3RpbmcoLTEpOworICAgICAgICAKKyAgICAgICAgT3Agb3AgPSBtVGFpbDsKKyAgICAgICAgd2hpbGUgKG9wICE9IG51bGwpIHsKKyAgICAgICAgICAgIHN3aXRjaCAob3AuY21kKSB7CisgICAgICAgICAgICAgICAgY2FzZSBPUF9BREQ6IHsKKyAgICAgICAgICAgICAgICAgICAgRnJhZ21lbnQgZiA9IG9wLmZyYWdtZW50OworICAgICAgICAgICAgICAgICAgICBmLm1JbW1lZGlhdGVBY3Rpdml0eSA9IG51bGw7CisgICAgICAgICAgICAgICAgICAgIG1NYW5hZ2VyLnJlbW92ZUZyYWdtZW50KGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRnJhZ21lbnRNYW5hZ2VySW1wbC5yZXZlcnNlVHJhbnNpdChtVHJhbnNpdGlvbiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVRyYW5zaXRpb25TdHlsZSk7CisgICAgICAgICAgICAgICAgfSBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIE9QX1JFUExBQ0U6IHsKKyAgICAgICAgICAgICAgICAgICAgRnJhZ21lbnQgZiA9IG9wLmZyYWdtZW50OworICAgICAgICAgICAgICAgICAgICBmLm1JbW1lZGlhdGVBY3Rpdml0eSA9IG51bGw7CisgICAgICAgICAgICAgICAgICAgIG1NYW5hZ2VyLnJlbW92ZUZyYWdtZW50KGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRnJhZ21lbnRNYW5hZ2VySW1wbC5yZXZlcnNlVHJhbnNpdChtVHJhbnNpdGlvbiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVRyYW5zaXRpb25TdHlsZSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChvcC5yZW1vdmVkICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGk9MDsgaTxvcC5yZW1vdmVkLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRnJhZ21lbnQgb2xkID0gb3AucmVtb3ZlZC5nZXQoaSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZi5tSW1tZWRpYXRlQWN0aXZpdHkgPSBtTWFuYWdlci5tQWN0aXZpdHk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbU1hbmFnZXIuYWRkRnJhZ21lbnQob2xkLCBmYWxzZSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgT1BfUkVNT1ZFOiB7CisgICAgICAgICAgICAgICAgICAgIEZyYWdtZW50IGYgPSBvcC5mcmFnbWVudDsKKyAgICAgICAgICAgICAgICAgICAgZi5tSW1tZWRpYXRlQWN0aXZpdHkgPSBtTWFuYWdlci5tQWN0aXZpdHk7CisgICAgICAgICAgICAgICAgICAgIG1NYW5hZ2VyLmFkZEZyYWdtZW50KGYsIGZhbHNlKTsKKyAgICAgICAgICAgICAgICB9IGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgT1BfSElERTogeworICAgICAgICAgICAgICAgICAgICBGcmFnbWVudCBmID0gb3AuZnJhZ21lbnQ7CisgICAgICAgICAgICAgICAgICAgIG1NYW5hZ2VyLnNob3dGcmFnbWVudChmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZyYWdtZW50TWFuYWdlckltcGwucmV2ZXJzZVRyYW5zaXQobVRyYW5zaXRpb24pLCBtVHJhbnNpdGlvblN0eWxlKTsKKyAgICAgICAgICAgICAgICB9IGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgT1BfU0hPVzogeworICAgICAgICAgICAgICAgICAgICBGcmFnbWVudCBmID0gb3AuZnJhZ21lbnQ7CisgICAgICAgICAgICAgICAgICAgIG1NYW5hZ2VyLmhpZGVGcmFnbWVudChmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZyYWdtZW50TWFuYWdlckltcGwucmV2ZXJzZVRyYW5zaXQobVRyYW5zaXRpb24pLCBtVHJhbnNpdGlvblN0eWxlKTsKKyAgICAgICAgICAgICAgICB9IGJyZWFrOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVW5rbm93biBjbWQ6ICIgKyBvcC5jbWQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIAorICAgICAgICAgICAgb3AgPSBvcC5wcmV2OworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBpZiAoZG9TdGF0ZU1vdmUpIHsKKyAgICAgICAgICAgIG1NYW5hZ2VyLm1vdmVUb1N0YXRlKG1NYW5hZ2VyLm1DdXJTdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgRnJhZ21lbnRNYW5hZ2VySW1wbC5yZXZlcnNlVHJhbnNpdChtVHJhbnNpdGlvbiksIG1UcmFuc2l0aW9uU3R5bGUsIHRydWUpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG1JbmRleCA+PSAwKSB7CisgICAgICAgICAgICBtTWFuYWdlci5mcmVlQmFja1N0YWNrSW5kZXgobUluZGV4KTsKKyAgICAgICAgICAgIG1JbmRleCA9IC0xOworICAgICAgICB9CisgICAgfQorICAgIAorICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKKyAgICAgICAgcmV0dXJuIG1OYW1lOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgaW50IGdldFRyYW5zaXRpb24oKSB7CisgICAgICAgIHJldHVybiBtVHJhbnNpdGlvbjsKKyAgICB9CisgICAgCisgICAgcHVibGljIGludCBnZXRUcmFuc2l0aW9uU3R5bGUoKSB7CisgICAgICAgIHJldHVybiBtVHJhbnNpdGlvblN0eWxlOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGlzRW1wdHkoKSB7CisgICAgICAgIHJldHVybiBtTnVtT3AgPT0gMDsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9hcHAvQ29udGV4dEltcGwuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9Db250ZXh0SW1wbC5qYXZhCmluZGV4IDg4OTlkNzYuLjc0OTcxMzYgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9Db250ZXh0SW1wbC5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9Db250ZXh0SW1wbC5qYXZhCkBAIC01NiwxMSArNTYsMTQgQEAKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLkFzc2V0TWFuYWdlcjsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlJlc291cmNlczsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlhtbFJlc291cmNlUGFyc2VyOworaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2UuRGF0YWJhc2VFcnJvckhhbmRsZXI7CiBpbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGUuU1FMaXRlRGF0YWJhc2U7CiBpbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGUuU1FMaXRlRGF0YWJhc2UuQ3Vyc29yRmFjdG9yeTsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkJpdG1hcDsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlOwogaW1wb3J0IGFuZHJvaWQuaGFyZHdhcmUuU2Vuc29yTWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkLmxvY2F0aW9uLkNvdW50cnlEZXRlY3RvcjsKK2ltcG9ydCBhbmRyb2lkLmxvY2F0aW9uLklDb3VudHJ5RGV0ZWN0b3I7CiBpbXBvcnQgYW5kcm9pZC5sb2NhdGlvbi5JTG9jYXRpb25NYW5hZ2VyOwogaW1wb3J0IGFuZHJvaWQubG9jYXRpb24uTG9jYXRpb25NYW5hZ2VyOwogaW1wb3J0IGFuZHJvaWQubWVkaWEuQXVkaW9NYW5hZ2VyOwpAQCAtODksNyArOTIsNyBAQAogaW1wb3J0IGFuZHJvaWQub3MuRmlsZVV0aWxzLkZpbGVTdGF0dXM7CiBpbXBvcnQgYW5kcm9pZC5vcy5zdG9yYWdlLlN0b3JhZ2VNYW5hZ2VyOwogaW1wb3J0IGFuZHJvaWQudGVsZXBob255LlRlbGVwaG9ueU1hbmFnZXI7Ci1pbXBvcnQgYW5kcm9pZC50ZXh0LkNsaXBib2FyZE1hbmFnZXI7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNsaXBib2FyZE1hbmFnZXI7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkFuZHJvaWRSdW50aW1lRXhjZXB0aW9uOwogaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CiBpbXBvcnQgYW5kcm9pZC52aWV3LkNvbnRleHRUaGVtZVdyYXBwZXI7CkBAIC0xNjksNiArMTcyLDcgQEAKICAgICBwcml2YXRlIHN0YXRpYyBUaHJvdHRsZU1hbmFnZXIgc1Rocm90dGxlTWFuYWdlcjsKICAgICBwcml2YXRlIHN0YXRpYyBXaWZpTWFuYWdlciBzV2lmaU1hbmFnZXI7CiAgICAgcHJpdmF0ZSBzdGF0aWMgTG9jYXRpb25NYW5hZ2VyIHNMb2NhdGlvbk1hbmFnZXI7CisgICAgcHJpdmF0ZSBzdGF0aWMgQ291bnRyeURldGVjdG9yIHNDb3VudHJ5RGV0ZWN0b3I7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgSGFzaE1hcDxTdHJpbmcsIFNoYXJlZFByZWZlcmVuY2VzSW1wbD4gc1NoYXJlZFByZWZzID0KICAgICAgICAgICAgIG5ldyBIYXNoTWFwPFN0cmluZywgU2hhcmVkUHJlZmVyZW5jZXNJbXBsPigpOwogCkBAIC0yMTAsMjMgKzIxNCw4IEBACiAgICAgcHJpdmF0ZSBGaWxlIG1FeHRlcm5hbEZpbGVzRGlyOwogICAgIHByaXZhdGUgRmlsZSBtRXh0ZXJuYWxDYWNoZURpcjsKIAotICAgIHByaXZhdGUgc3RhdGljIGxvbmcgc0luc3RhbmNlQ291bnQgPSAwOwotCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gRU1QVFlfRklMRV9MSVNUID0ge307CiAKLSAgICAvLyBGb3IgZGVidWcgb25seQotICAgIC8qCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgZmluYWxpemUoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLSAgICAgICAgc3VwZXIuZmluYWxpemUoKTsKLSAgICAgICAgLS1zSW5zdGFuY2VDb3VudDsKLSAgICB9Ci0gICAgKi8KLQotICAgIHB1YmxpYyBzdGF0aWMgbG9uZyBnZXRJbnN0YW5jZUNvdW50KCkgewotICAgICAgICByZXR1cm4gc0luc3RhbmNlQ291bnQ7Ci0gICAgfQotCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIEFzc2V0TWFuYWdlciBnZXRBc3NldHMoKSB7CiAgICAgICAgIHJldHVybiBtUmVzb3VyY2VzLmdldEFzc2V0cygpOwpAQCAtNTQzLDYgKzUzMiwxNSBAQAogICAgIH0KIAogICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTUUxpdGVEYXRhYmFzZSBvcGVuT3JDcmVhdGVEYXRhYmFzZShTdHJpbmcgbmFtZSwgaW50IG1vZGUsIEN1cnNvckZhY3RvcnkgZmFjdG9yeSwKKyAgICAgICAgICAgIERhdGFiYXNlRXJyb3JIYW5kbGVyIGVycm9ySGFuZGxlcikgeworICAgICAgICBGaWxlIGYgPSB2YWxpZGF0ZUZpbGVQYXRoKG5hbWUsIHRydWUpOworICAgICAgICBTUUxpdGVEYXRhYmFzZSBkYiA9IFNRTGl0ZURhdGFiYXNlLm9wZW5PckNyZWF0ZURhdGFiYXNlKGYuZ2V0UGF0aCgpLCBmYWN0b3J5LCBlcnJvckhhbmRsZXIpOworICAgICAgICBzZXRGaWxlUGVybWlzc2lvbnNGcm9tTW9kZShmLmdldFBhdGgoKSwgbW9kZSwgMCk7CisgICAgICAgIHJldHVybiBkYjsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgYm9vbGVhbiBkZWxldGVEYXRhYmFzZShTdHJpbmcgbmFtZSkgewogICAgICAgICB0cnkgewogICAgICAgICAgICAgRmlsZSBmID0gdmFsaWRhdGVGaWxlUGF0aChuYW1lLCBmYWxzZSk7CkBAIC02MjAsNyArNjE4LDggQEAKICAgICAgICAgICAgICAgICAgICAgKyAiIElzIHRoaXMgcmVhbGx5IHdoYXQgeW91IHdhbnQ/Iik7CiAgICAgICAgIH0KICAgICAgICAgbU1haW5UaHJlYWQuZ2V0SW5zdHJ1bWVudGF0aW9uKCkuZXhlY1N0YXJ0QWN0aXZpdHkoCi0gICAgICAgICAgICBnZXRPdXRlckNvbnRleHQoKSwgbU1haW5UaHJlYWQuZ2V0QXBwbGljYXRpb25UaHJlYWQoKSwgbnVsbCwgbnVsbCwgaW50ZW50LCAtMSk7CisgICAgICAgICAgICBnZXRPdXRlckNvbnRleHQoKSwgbU1haW5UaHJlYWQuZ2V0QXBwbGljYXRpb25UaHJlYWQoKSwgbnVsbCwKKyAgICAgICAgICAgIChBY3Rpdml0eSludWxsLCBpbnRlbnQsIC0xKTsKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKQEAgLTk0NCw2ICs5NDMsOCBAQAogICAgICAgICAgICAgcmV0dXJuIEFjY2Vzc2liaWxpdHlNYW5hZ2VyLmdldEluc3RhbmNlKHRoaXMpOwogICAgICAgICB9IGVsc2UgaWYgKExPQ0FUSU9OX1NFUlZJQ0UuZXF1YWxzKG5hbWUpKSB7CiAgICAgICAgICAgICByZXR1cm4gZ2V0TG9jYXRpb25NYW5hZ2VyKCk7CisgICAgICAgIH0gZWxzZSBpZiAoQ09VTlRSWV9ERVRFQ1RPUi5lcXVhbHMobmFtZSkpIHsKKyAgICAgICAgICAgIHJldHVybiBnZXRDb3VudHJ5RGV0ZWN0b3IoKTsKICAgICAgICAgfSBlbHNlIGlmIChTRUFSQ0hfU0VSVklDRS5lcXVhbHMobmFtZSkpIHsKICAgICAgICAgICAgIHJldHVybiBnZXRTZWFyY2hNYW5hZ2VyKCk7CiAgICAgICAgIH0gZWxzZSBpZiAoU0VOU09SX1NFUlZJQ0UuZXF1YWxzKG5hbWUpKSB7CkBAIC0xMTEwLDYgKzExMTEsMTcgQEAKICAgICAgICAgcmV0dXJuIHNMb2NhdGlvbk1hbmFnZXI7CiAgICAgfQogCisgICAgcHJpdmF0ZSBDb3VudHJ5RGV0ZWN0b3IgZ2V0Q291bnRyeURldGVjdG9yKCkgeworICAgICAgICBzeW5jaHJvbml6ZWQgKHNTeW5jKSB7CisgICAgICAgICAgICBpZiAoc0NvdW50cnlEZXRlY3RvciA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgSUJpbmRlciBiID0gU2VydmljZU1hbmFnZXIuZ2V0U2VydmljZShDT1VOVFJZX0RFVEVDVE9SKTsKKyAgICAgICAgICAgICAgICBJQ291bnRyeURldGVjdG9yIHNlcnZpY2UgPSBJQ291bnRyeURldGVjdG9yLlN0dWIuYXNJbnRlcmZhY2UoYik7CisgICAgICAgICAgICAgICAgc0NvdW50cnlEZXRlY3RvciA9IG5ldyBDb3VudHJ5RGV0ZWN0b3Ioc2VydmljZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHNDb3VudHJ5RGV0ZWN0b3I7CisgICAgfQorCiAgICAgcHJpdmF0ZSBTZWFyY2hNYW5hZ2VyIGdldFNlYXJjaE1hbmFnZXIoKSB7CiAgICAgICAgIHN5bmNocm9uaXplZCAobVN5bmMpIHsKICAgICAgICAgICAgIGlmIChtU2VhcmNoTWFuYWdlciA9PSBudWxsKSB7CkBAIC0xNDgzLDggKzE0OTUsNiBAQAogICAgIH0KIAogICAgIENvbnRleHRJbXBsKCkgewotICAgICAgICAvLyBGb3IgZGVidWcgb25seQotICAgICAgICAvLysrc0luc3RhbmNlQ291bnQ7CiAgICAgICAgIG1PdXRlckNvbnRleHQgPSB0aGlzOwogICAgIH0KIApAQCAtMTQ5NSw3ICsxNTA1LDYgQEAKICAgICAgKiBAcGFyYW0gY29udGV4dCBFeGlzdGluZyBhcHBsaWNhdGlvbiBjb250ZXh0LgogICAgICAqLwogICAgIHB1YmxpYyBDb250ZXh0SW1wbChDb250ZXh0SW1wbCBjb250ZXh0KSB7Ci0gICAgICAgICsrc0luc3RhbmNlQ291bnQ7CiAgICAgICAgIG1QYWNrYWdlSW5mbyA9IGNvbnRleHQubVBhY2thZ2VJbmZvOwogICAgICAgICBtUmVzb3VyY2VzID0gY29udGV4dC5tUmVzb3VyY2VzOwogICAgICAgICBtTWFpblRocmVhZCA9IGNvbnRleHQubU1haW5UaHJlYWQ7CkBAIC0yODAwLDYgKzI4MDksMTMgQEAKICAgICAgICAgICAgICAgICByZXR1cm4gdiAhPSBudWxsID8gdiA6IGRlZlZhbHVlOwogICAgICAgICAgICAgfQogICAgICAgICB9CisgICAgICAgIAorICAgICAgICBwdWJsaWMgU2V0PFN0cmluZz4gZ2V0U3RyaW5nU2V0KFN0cmluZyBrZXksIFNldDxTdHJpbmc+IGRlZlZhbHVlcykgeworICAgICAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7CisgICAgICAgICAgICAgICAgU2V0PFN0cmluZz4gdiA9IChTZXQ8U3RyaW5nPikgbU1hcC5nZXQoa2V5KTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdiAhPSBudWxsID8gdiA6IGRlZlZhbHVlczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQogCiAgICAgICAgIHB1YmxpYyBpbnQgZ2V0SW50KFN0cmluZyBrZXksIGludCBkZWZWYWx1ZSkgewogICAgICAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7CkBAIC0yODYxLDYgKzI4NzcsMTIgQEAKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQorICAgICAgICAgICAgcHVibGljIEVkaXRvciBwdXRTdHJpbmdTZXQoU3RyaW5nIGtleSwgU2V0PFN0cmluZz4gdmFsdWVzKSB7CisgICAgICAgICAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7CisgICAgICAgICAgICAgICAgICAgIG1Nb2RpZmllZC5wdXQoa2V5LCB2YWx1ZXMpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpczsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CiAgICAgICAgICAgICBwdWJsaWMgRWRpdG9yIHB1dEludChTdHJpbmcga2V5LCBpbnQgdmFsdWUpIHsKICAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKICAgICAgICAgICAgICAgICAgICAgbU1vZGlmaWVkLnB1dChrZXksIHZhbHVlKTsKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9EaWFsb2cuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9EaWFsb2cuamF2YQppbmRleCBkYThjOWU1Li5hMGJlMGNkIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9hcHAvRGlhbG9nLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvYXBwL0RpYWxvZy5qYXZhCkBAIC0xNiwxOCArMTYsMjEgQEAKIAogcGFja2FnZSBhbmRyb2lkLmFwcDsKIAoraW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLmFwcC5BY3Rpb25CYXJJbXBsOwogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnBvbGljeS5Qb2xpY3lNYW5hZ2VyOwogCi1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkRpYWxvZ0ludGVyZmFjZTsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29tcG9uZW50TmFtZTsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dFdyYXBwZXI7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkRpYWxvZ0ludGVyZmFjZTsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlOwogaW1wb3J0IGFuZHJvaWQubmV0LlVyaTsKIGltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKIGltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXI7CiBpbXBvcnQgYW5kcm9pZC5vcy5NZXNzYWdlOworaW1wb3J0IGFuZHJvaWQudmlldy5BY3Rpb25Nb2RlOwogaW1wb3J0IGFuZHJvaWQudmlldy5Db250ZXh0TWVudTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuQ29udGV4dE1lbnUuQ29udGV4dE1lbnVJbmZvOwogaW1wb3J0IGFuZHJvaWQudmlldy5Db250ZXh0VGhlbWVXcmFwcGVyOwogaW1wb3J0IGFuZHJvaWQudmlldy5HcmF2aXR5OwogaW1wb3J0IGFuZHJvaWQudmlldy5LZXlFdmVudDsKQEAgLTM2LDEzICszOSwxMiBAQAogaW1wb3J0IGFuZHJvaWQudmlldy5NZW51SXRlbTsKIGltcG9ydCBhbmRyb2lkLnZpZXcuTW90aW9uRXZlbnQ7CiBpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXcuT25DcmVhdGVDb250ZXh0TWVudUxpc3RlbmVyOwogaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3Q29uZmlndXJhdGlvbjsKIGltcG9ydCBhbmRyb2lkLnZpZXcuVmlld0dyb3VwOworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3R3JvdXAuTGF5b3V0UGFyYW1zOwogaW1wb3J0IGFuZHJvaWQudmlldy5XaW5kb3c7CiBpbXBvcnQgYW5kcm9pZC52aWV3LldpbmRvd01hbmFnZXI7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LkNvbnRleHRNZW51LkNvbnRleHRNZW51SW5mbzsKLWltcG9ydCBhbmRyb2lkLnZpZXcuVmlldy5PbkNyZWF0ZUNvbnRleHRNZW51TGlzdGVuZXI7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LlZpZXdHcm91cC5MYXlvdXRQYXJhbXM7CiBpbXBvcnQgYW5kcm9pZC52aWV3LmFjY2Vzc2liaWxpdHkuQWNjZXNzaWJpbGl0eUV2ZW50OwogCiBpbXBvcnQgamF2YS5sYW5nLnJlZi5XZWFrUmVmZXJlbmNlOwpAQCAtNzYsNiArNzgsNyBAQAogICAgIGZpbmFsIFdpbmRvd01hbmFnZXIgbVdpbmRvd01hbmFnZXI7CiAgICAgV2luZG93IG1XaW5kb3c7CiAgICAgVmlldyBtRGVjb3I7CisgICAgcHJpdmF0ZSBBY3Rpb25CYXJJbXBsIG1BY3Rpb25CYXI7CiAgICAgLyoqCiAgICAgICogVGhpcyBmaWVsZCBzaG91bGQgYmUgbWFkZSBwcml2YXRlLCBzbyBpdCBpcyBoaWRkZW4gZnJvbSB0aGUgU0RLLgogICAgICAqIHtAaGlkZX0KQEAgLTE3Nyw2ICsxODAsMTUgQEAKICAgICB9CiAKICAgICAvKioKKyAgICAgKiBSZXRyaWV2ZSB0aGUge0BsaW5rIEFjdGlvbkJhcn0gYXR0YWNoZWQgdG8gdGhpcyBkaWFsb2csIGlmIHByZXNlbnQuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFRoZSBBY3Rpb25CYXIgYXR0YWNoZWQgdG8gdGhlIGRpYWxvZyBvciBudWxsIGlmIG5vIEFjdGlvbkJhciBpcyBwcmVzZW50LgorICAgICAqLworICAgIHB1YmxpYyBBY3Rpb25CYXIgZ2V0QWN0aW9uQmFyKCkgeworICAgICAgICByZXR1cm4gbUFjdGlvbkJhcjsKKyAgICB9CisKKyAgICAvKioKICAgICAgKiBTZXRzIHRoZSBBY3Rpdml0eSB0aGF0IG93bnMgdGhpcyBkaWFsb2cuIEFuIGV4YW1wbGUgdXNlOiBUaGlzIERpYWxvZyB3aWxsCiAgICAgICogdXNlIHRoZSBzdWdnZXN0ZWQgdm9sdW1lIGNvbnRyb2wgc3RyZWFtIG9mIHRoZSBBY3Rpdml0eS4KICAgICAgKiAKQEAgLTIxNiw2ICsyMjgsOSBAQAogICAgIHB1YmxpYyB2b2lkIHNob3coKSB7CiAgICAgICAgIGlmIChtU2hvd2luZykgewogICAgICAgICAgICAgaWYgKG1EZWNvciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgaWYgKG1XaW5kb3cuaGFzRmVhdHVyZShXaW5kb3cuRkVBVFVSRV9BQ1RJT05fQkFSKSkgeworICAgICAgICAgICAgICAgICAgICBtV2luZG93LmludmFsaWRhdGVQYW5lbE1lbnUoV2luZG93LkZFQVRVUkVfQUNUSU9OX0JBUik7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIG1EZWNvci5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICByZXR1cm47CkBAIC0yMjcsNiArMjQyLDExIEBACiAKICAgICAgICAgb25TdGFydCgpOwogICAgICAgICBtRGVjb3IgPSBtV2luZG93LmdldERlY29yVmlldygpOworCisgICAgICAgIGlmIChtQWN0aW9uQmFyID09IG51bGwgJiYgbVdpbmRvdy5oYXNGZWF0dXJlKFdpbmRvdy5GRUFUVVJFX0FDVElPTl9CQVIpKSB7CisgICAgICAgICAgICBtQWN0aW9uQmFyID0gbmV3IEFjdGlvbkJhckltcGwodGhpcyk7CisgICAgICAgIH0KKwogICAgICAgICBXaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcyBsID0gbVdpbmRvdy5nZXRBdHRyaWJ1dGVzKCk7CiAgICAgICAgIGlmICgobC5zb2Z0SW5wdXRNb2RlCiAgICAgICAgICAgICAgICAgJiBXaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcy5TT0ZUX0lOUFVUX0lTX0ZPUldBUkRfTkFWSUdBVElPTikgPT0gMCkgewpAQCAtMzEwLDcgKzMzMCw3IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogU2ltaWxhciB0byB7QGxpbmsgQWN0aXZpdHkjb25DcmVhdGV9LCB5b3Ugc2hvdWxkIGluaXRpYWxpemVkIHlvdXIgZGlhbG9nCisgICAgICogU2ltaWxhciB0byB7QGxpbmsgQWN0aXZpdHkjb25DcmVhdGV9LCB5b3Ugc2hvdWxkIGluaXRpYWxpemUgeW91ciBkaWFsb2cKICAgICAgKiBpbiB0aGlzIG1ldGhvZCwgaW5jbHVkaW5nIGNhbGxpbmcge0BsaW5rICNzZXRDb250ZW50Vmlld30uCiAgICAgICogQHBhcmFtIHNhdmVkSW5zdGFuY2VTdGF0ZSBJZiB0aGlzIGRpYWxvZyBpcyBiZWluZyByZWluaXRhbGl6ZWQgYWZ0ZXIgYQogICAgICAqICAgICB0aGUgaG9zdGluZyBhY3Rpdml0eSB3YXMgcHJldmlvdXNseSBzaHV0IGRvd24sIGhvbGRzIHRoZSByZXN1bHQgZnJvbQpAQCAtNzc1LDYgKzc5NSwxMyBAQAogICAgIH0KIAogICAgIC8qKgorICAgICAqIEBzZWUgQWN0aXZpdHkjaW52YWxpZGF0ZU9wdGlvbnNNZW51KCkKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBpbnZhbGlkYXRlT3B0aW9uc01lbnUoKSB7CisgICAgICAgIG1XaW5kb3cuaW52YWxpZGF0ZVBhbmVsTWVudShXaW5kb3cuRkVBVFVSRV9PUFRJT05TX1BBTkVMKTsKKyAgICB9CisKKyAgICAvKioKICAgICAgKiBAc2VlIEFjdGl2aXR5I29uQ3JlYXRlQ29udGV4dE1lbnUoQ29udGV4dE1lbnUsIFZpZXcsIENvbnRleHRNZW51SW5mbykKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBvbkNyZWF0ZUNvbnRleHRNZW51KENvbnRleHRNZW51IG1lbnUsIFZpZXcgdiwgQ29udGV4dE1lbnVJbmZvIG1lbnVJbmZvKSB7CkBAIC04MzIsOCArODU5LDE1IEBACiAgICAgICAgIH0KICAgICB9CiAKKyAgICBwdWJsaWMgQWN0aW9uTW9kZSBvblN0YXJ0QWN0aW9uTW9kZShBY3Rpb25Nb2RlLkNhbGxiYWNrIGNhbGxiYWNrKSB7CisgICAgICAgIGlmIChtQWN0aW9uQmFyICE9IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBtQWN0aW9uQmFyLnN0YXJ0QWN0aW9uTW9kZShjYWxsYmFjayk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCiAgICAgLyoqCi0gICAgICogQHJldHVybiBUaGUgYWN0aXZpdHkgYXNzb2NpYXRlZCB3aXRoIHRoaXMgZGlhbG9nLCBvciBudWxsIGlmIHRoZXJlIGlzIG5vIGFzc29jYWl0ZWQgYWN0aXZpdHkuCisgICAgICogQHJldHVybiBUaGUgYWN0aXZpdHkgYXNzb2NpYXRlZCB3aXRoIHRoaXMgZGlhbG9nLCBvciBudWxsIGlmIHRoZXJlIGlzIG5vIGFzc29jaWF0ZWQgYWN0aXZpdHkuCiAgICAgICovCiAgICAgcHJpdmF0ZSBDb21wb25lbnROYW1lIGdldEFzc29jaWF0ZWRBY3Rpdml0eSgpIHsKICAgICAgICAgQWN0aXZpdHkgYWN0aXZpdHkgPSBtT3duZXJBY3Rpdml0eTsKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9EaWFsb2dGcmFnbWVudC5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvYXBwL0RpYWxvZ0ZyYWdtZW50LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZThkZmFjOQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9EaWFsb2dGcmFnbWVudC5qYXZhCkBAIC0wLDAgKzEsNDU4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLmFwcDsKKworaW1wb3J0IGFuZHJvaWQuY29udGVudC5EaWFsb2dJbnRlcmZhY2U7CitpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CitpbXBvcnQgYW5kcm9pZC52aWV3LkxheW91dEluZmxhdGVyOworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3R3JvdXA7CitpbXBvcnQgYW5kcm9pZC52aWV3LldpbmRvdzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuV2luZG93TWFuYWdlcjsKKworLyoqCisgKiBBIGZyYWdtZW50IHRoYXQgZGlzcGxheXMgYSBkaWFsb2cgd2luZG93LCBmbG9hdGluZyBvbiB0b3Agb2YgaXRzCisgKiBhY3Rpdml0eSdzIHdpbmRvdy4gIFRoaXMgZnJhZ21lbnQgY29udGFpbnMgYSBEaWFsb2cgb2JqZWN0LCB3aGljaCBpdAorICogZGlzcGxheXMgYXMgYXBwcm9wcmlhdGUgYmFzZWQgb24gdGhlIGZyYWdtZW50J3Mgc3RhdGUuICBDb250cm9sIG9mCisgKiB0aGUgZGlhbG9nIChkZWNpZGluZyB3aGVuIHRvIHNob3csIGhpZGUsIGRpc21pc3MgaXQpIHNob3VsZCBiZSBkb25lIHRocm91Z2gKKyAqIHRoZSBBUEkgaGVyZSwgbm90IHdpdGggZGlyZWN0IGNhbGxzIG9uIHRoZSBkaWFsb2cuCisgKgorICogPHA+SW1wbGVtZW50YXRpb25zIHNob3VsZCBvdmVycmlkZSB0aGlzIGNsYXNzIGFuZCBpbXBsZW1lbnQKKyAqIHtAbGluayAjb25DcmVhdGVWaWV3KExheW91dEluZmxhdGVyLCBWaWV3R3JvdXAsIEJ1bmRsZSl9IHRvIHN1cHBseSB0aGUKKyAqIGNvbnRlbnQgb2YgdGhlIGRpYWxvZy4gIEFsdGVybmF0aXZlbHksIHRoZXkgY2FuIG92ZXJyaWRlCisgKiB7QGxpbmsgI29uQ3JlYXRlRGlhbG9nKEJ1bmRsZSl9IHRvIGNyZWF0ZSBhbiBlbnRpcmVseSBjdXN0b20gZGlhbG9nLCBzdWNoCisgKiBhcyBhbiBBbGVydERpYWxvZywgd2l0aCBpdHMgb3duIGNvbnRlbnQuCisgKgorICogPHA+VG9waWNzIGNvdmVyZWQgaGVyZToKKyAqIDxvbD4KKyAqIDxsaT48YSBocmVmPSIjTGlmZWN5Y2xlIj5MaWZlY3ljbGU8L2E+CisgKiA8bGk+PGEgaHJlZj0iI0Jhc2ljRGlhbG9nIj5CYXNpYyBEaWFsb2c8L2E+CisgKiA8bGk+PGEgaHJlZj0iI0FsZXJ0RGlhbG9nIj5BbGVydCBEaWFsb2c8L2E+CisgKiA8bGk+PGEgaHJlZj0iI0RpYWxvZ09yRW1iZWQiPlNlbGVjdGluZyBCZXR3ZWVuIERpYWxvZyBvciBFbWJlZGRpbmc8L2E+CisgKiA8L29sPgorICoKKyAqIDxhIG5hbWU9IkxpZmVjeWNsZSI+PC9hPgorICogPGgzPkxpZmVjeWNsZTwvaDM+CisgKgorICogPHA+RGlhbG9nRnJhZ21lbnQgZG9lcyB2YXJpb3VzIHRoaW5ncyB0byBrZWVwIHRoZSBmcmFnbWVudCdzIGxpZmVjeWNsZQorICogZHJpdmluZyBpdCwgaW5zdGVhZCBvZiB0aGUgRGlhbG9nLiAgTm90ZSB0aGF0IGRpYWxvZ3MgYXJlIGdlbmVyYWxseQorICogYXV0b25vbW91cyBlbnRpdGllcyAtLSB0aGV5IGFyZSB0aGVpciBvd24gd2luZG93LCByZWNlaXZpbmcgdGhlaXIgb3duCisgKiBpbnB1dCBldmVudHMsIGFuZCBvZnRlbiBkZWNpZGluZyBvbiB0aGVpciBvd24gd2hlbiB0byBkaXNhcHBlYXIgKGJ5CisgKiByZWNlaXZpbmcgYSBiYWNrIGtleSBldmVudCBvciB0aGUgdXNlciBjbGlja2luZyBvbiBhIGJ1dHRvbikuCisgKgorICogPHA+RGlhbG9nRnJhZ21lbnQgbmVlZHMgdG8gZW5zdXJlIHRoYXQgd2hhdCBpcyBoYXBwZW5pbmcgd2l0aCB0aGUgRnJhZ21lbnQKKyAqIGFuZCBEaWFsb2cgc3RhdGVzIHJlbWFpbnMgY29uc2lzdGVudC4gIFRvIGRvIHRoaXMsIGl0IHdhdGNoZXMgZm9yIGRpc21pc3MKKyAqIGV2ZW50cyBmcm9tIHRoZSBkaWFsb2cgYW5kIHRha2VzIGFyZSBvZiByZW1vdmluZyBpdHMgb3duIHN0YXRlIHdoZW4gdGhleQorICogaGFwcGVuLiAgVGhpcyBtZWFucyB5b3Ugc2hvdWxkIHVzZSB7QGxpbmsgI3Nob3coRnJhZ21lbnRNYW5hZ2VyLCBTdHJpbmcpfQorICogb3Ige0BsaW5rICNzaG93KEZyYWdtZW50VHJhbnNhY3Rpb24sIFN0cmluZyl9IHRvIGFkZCBhbiBpbnN0YW5jZSBvZgorICogRGlhbG9nRnJhZ21lbnQgdG8geW91ciBVSSwgYXMgdGhlc2Uga2VlcCB0cmFjayBvZiBob3cgRGlhbG9nRnJhZ21lbnQgc2hvdWxkCisgKiByZW1vdmUgaXRzZWxmIHdoZW4gdGhlIGRpYWxvZyBpcyBkaXNtaXNzZWQuCisgKgorICogPGEgbmFtZT0iQmFzaWNEaWFsb2ciPjwvYT4KKyAqIDxoMz5CYXNpYyBEaWFsb2c8L2gzPgorICoKKyAqIDxwPlRoZSBzaW1wbGVzdCB1c2Ugb2YgRGlhbG9nRnJhZ21lbnQgaXMgYXMgYSBmbG9hdGluZyBjb250YWluZXIgZm9yIHRoZQorICogZnJhZ21lbnQncyB2aWV3IGhpZXJhcmNoeS4gIEEgc2ltcGxlIGltcGxlbWVudGF0aW9uIG1heSBsb29rIGxpa2UgdGhpczoKKyAqCisgKiB7QHNhbXBsZSBkZXZlbG9wbWVudC9zYW1wbGVzL0FwaURlbW9zL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL2FwaXMvYXBwL0ZyYWdtZW50RGlhbG9nLmphdmEKKyAqICAgICAgZGlhbG9nfQorICoKKyAqIDxwPkFuIGV4YW1wbGUgc2hvd0RpYWxvZygpIG1ldGhvZCBvbiB0aGUgQWN0aXZpdHkgY291bGQgYmU6CisgKgorICoge0BzYW1wbGUgZGV2ZWxvcG1lbnQvc2FtcGxlcy9BcGlEZW1vcy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9hcGlzL2FwcC9GcmFnbWVudERpYWxvZy5qYXZhCisgKiAgICAgIGFkZF9kaWFsb2d9CisgKgorICogPHA+VGhpcyByZW1vdmVzIGFueSBjdXJyZW50bHkgc2hvd24gZGlhbG9nLCBjcmVhdGVzIGEgbmV3IERpYWxvZ0ZyYWdtZW50CisgKiB3aXRoIGFuIGFyZ3VtZW50LCBhbmQgc2hvd3MgaXQgYXMgYSBuZXcgc3RhdGUgb24gdGhlIGJhY2sgc3RhY2suICBXaGVuIHRoZQorICogdHJhbnNhY3Rpb24gaXMgcG9wcGVkLCB0aGUgY3VycmVudCBEaWFsb2dGcmFnbWVudCBhbmQgaXRzIERpYWxvZyB3aWxsIGJlCisgKiBkZXN0cm95ZWQsIGFuZCB0aGUgcHJldmlvdXMgb25lIChpZiBhbnkpIHJlLXNob3duLiAgTm90ZSB0aGF0IGluIHRoaXMgY2FzZQorICogRGlhbG9nRnJhZ21lbnQgd2lsbCB0YWtlIGNhcmUgb2YgcG9wcGluZyB0aGUgdHJhbnNhY3Rpb24gb2YgdGhlIERpYWxvZworICogaXMgZGlzbWlzc2VkIHNlcGFyYXRlbHkgZnJvbSBpdC4KKyAqCisgKiA8YSBuYW1lPSJBbGVydERpYWxvZyI+PC9hPgorICogPGgzPkFsZXJ0IERpYWxvZzwvaDM+CisgKgorICogPHA+SW5zdGVhZCBvZiAob3IgaW4gYWRkaXRpb24gdG8pIGltcGxlbWVudGluZyB7QGxpbmsgI29uQ3JlYXRlVmlld30gdG8KKyAqIGdlbmVyYXRlIHRoZSB2aWV3IGhpZXJhcmNoeSBpbnNpZGUgb2YgYSBkaWFsb2csIHlvdSBtYXkgaW1wbGVtZW50CisgKiB7QGxpbmsgI29uQ3JlYXRlRGlhbG9nKEJ1bmRsZSl9IHRvIGNyZWF0ZSB5b3VyIG93biBjdXN0b20gRGlhbG9nIG9iamVjdC4KKyAqCisgKiA8cD5UaGlzIGlzIG1vc3QgdXNlZnVsIGZvciBjcmVhdGluZyBhbiB7QGxpbmsgQWxlcnREaWFsb2d9LCBhbGxvd2luZyB5b3UKKyAqIHRvIGRpc3BsYXkgc3RhbmRhcmQgYWxlcnRzIHRvIHRoZSB1c2VyIHRoYXQgYXJlIG1hbmFnZWQgYnkgYSBmcmFnbWVudC4KKyAqIEEgc2ltcGxlIGV4YW1wbGUgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBpczoKKyAqCisgKiB7QHNhbXBsZSBkZXZlbG9wbWVudC9zYW1wbGVzL0FwaURlbW9zL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL2FwaXMvYXBwL0ZyYWdtZW50QWxlcnREaWFsb2cuamF2YQorICogICAgICBkaWFsb2d9CisgKgorICogPHA+VGhlIGFjdGl2aXR5IGNyZWF0aW5nIHRoaXMgZnJhZ21lbnQgbWF5IGhhdmUgdGhlIGZvbGxvd2luZyBtZXRob2RzIHRvCisgKiBzaG93IHRoZSBkaWFsb2cgYW5kIHJlY2VpdmUgcmVzdWx0cyBmcm9tIGl0OgorICoKKyAqIHtAc2FtcGxlIGRldmVsb3BtZW50L3NhbXBsZXMvQXBpRGVtb3Mvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvYXBpcy9hcHAvRnJhZ21lbnRBbGVydERpYWxvZy5qYXZhCisgKiAgICAgIGFjdGl2aXR5fQorICoKKyAqIDxwPk5vdGUgdGhhdCBpbiB0aGlzIGNhc2UgdGhlIGZyYWdtZW50IGlzIG5vdCBwbGFjZWQgb24gdGhlIGJhY2sgc3RhY2ssIGl0CisgKiBpcyBqdXN0IGFkZGVkIGFzIGFuIGluZGVmaW5pdGVseSBydW5uaW5nIGZyYWdtZW50LiAgQmVjYXVzZSBkaWFsb2dzIG5vcm1hbGx5CisgKiBhcmUgbW9kYWwsIHRoaXMgd2lsbCBzdGlsbCBvcGVyYXRlIGFzIGEgYmFjayBzdGFjaywgc2luY2UgdGhlIGRpYWxvZyB3aWxsCisgKiBjYXB0dXJlIHVzZXIgaW5wdXQgdW50aWwgaXQgaXMgZGlzbWlzc2VkLiAgV2hlbiBpdCBpcyBkaXNtaXNzZWQsIERpYWxvZ0ZyYWdtZW50CisgKiB3aWxsIHRha2UgY2FyZSBvZiByZW1vdmluZyBpdHNlbGYgZnJvbSBpdHMgZnJhZ21lbnQgbWFuYWdlci4KKyAqCisgKiA8YSBuYW1lPSJEaWFsb2dPckVtYmVkIj48L2E+CisgKiA8aDM+U2VsZWN0aW5nIEJldHdlZW4gRGlhbG9nIG9yIEVtYmVkZGluZzwvaDM+CisgKgorICogPHA+QSBEaWFsb2dGcmFnbWVudCBjYW4gc3RpbGwgb3B0aW9uYWxseSBiZSB1c2VkIGFzIGEgbm9ybWFsIGZyYWdtZW50LCBpZgorICogZGVzaXJlZC4gIFRoaXMgaXMgdXNlZnVsIGlmIHlvdSBoYXZlIGEgZnJhZ21lbnQgdGhhdCBpbiBzb21lIGNhc2VzIHNob3VsZAorICogYmUgc2hvd24gYXMgYSBkaWFsb2cgYW5kIG90aGVycyBlbWJlZGRlZCBpbiBhIGxhcmdlciBVSS4gIFRoaXMgYmVoYXZpb3IKKyAqIHdpbGwgbm9ybWFsbHkgYmUgYXV0b21hdGljYWxseSBzZWxlY3RlZCBmb3IgeW91IGJhc2VkIG9uIGhvdyB5b3UgYXJlIHVzaW5nCisgKiB0aGUgZnJhZ21lbnQsIGJ1dCBjYW4gYmUgY3VzdG9taXplZCB3aXRoIHtAbGluayAjc2V0U2hvd3NEaWFsb2coYm9vbGVhbil9LgorICoKKyAqIDxwPkZvciBleGFtcGxlLCBoZXJlIGlzIGEgc2ltcGxlIGRpYWxvZyBmcmFnbWVudDoKKyAqCisgKiB7QHNhbXBsZSBkZXZlbG9wbWVudC9zYW1wbGVzL0FwaURlbW9zL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL2FwaXMvYXBwL0ZyYWdtZW50RGlhbG9nT3JBY3Rpdml0eS5qYXZhCisgKiAgICAgIGRpYWxvZ30KKyAqCisgKiA8cD5BbiBpbnN0YW5jZSBvZiB0aGlzIGZyYWdtZW50IGNhbiBiZSBjcmVhdGVkIGFuZCBzaG93biBhcyBhIGRpYWxvZzoKKyAqCisgKiB7QHNhbXBsZSBkZXZlbG9wbWVudC9zYW1wbGVzL0FwaURlbW9zL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL2FwaXMvYXBwL0ZyYWdtZW50RGlhbG9nT3JBY3Rpdml0eS5qYXZhCisgKiAgICAgIHNob3dfZGlhbG9nfQorICoKKyAqIDxwPkl0IGNhbiBhbHNvIGJlIGFkZGVkIGFzIGNvbnRlbnQgaW4gYSB2aWV3IGhpZXJhcmNoeToKKyAqCisgKiB7QHNhbXBsZSBkZXZlbG9wbWVudC9zYW1wbGVzL0FwaURlbW9zL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL2FwaXMvYXBwL0ZyYWdtZW50RGlhbG9nT3JBY3Rpdml0eS5qYXZhCisgKiAgICAgIGVtYmVkfQorICovCitwdWJsaWMgY2xhc3MgRGlhbG9nRnJhZ21lbnQgZXh0ZW5kcyBGcmFnbWVudAorICAgICAgICBpbXBsZW1lbnRzIERpYWxvZ0ludGVyZmFjZS5PbkNhbmNlbExpc3RlbmVyLCBEaWFsb2dJbnRlcmZhY2UuT25EaXNtaXNzTGlzdGVuZXIgeworCisgICAgLyoqCisgICAgICogU3R5bGUgZm9yIHtAbGluayAjc2V0U3R5bGUoaW50LCBpbnQpfTogYSBiYXNpYywKKyAgICAgKiBub3JtYWwgZGlhbG9nLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUWUxFX05PUk1BTCA9IDA7CisKKyAgICAvKioKKyAgICAgKiBTdHlsZSBmb3Ige0BsaW5rICNzZXRTdHlsZShpbnQsIGludCl9OiBkb24ndCBpbmNsdWRlCisgICAgICogYSB0aXRsZSBhcmVhLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUWUxFX05PX1RJVExFID0gMTsKKworICAgIC8qKgorICAgICAqIFN0eWxlIGZvciB7QGxpbmsgI3NldFN0eWxlKGludCwgaW50KX06IGRvbid0IGRyYXcKKyAgICAgKiBhbnkgZnJhbWUgYXQgYWxsOyB0aGUgdmlldyBoaWVyYXJjaHkgcmV0dXJuZWQgYnkge0BsaW5rICNvbkNyZWF0ZVZpZXd9CisgICAgICogaXMgZW50aXJlbHkgcmVzcG9uc2libGUgZm9yIGRyYXdpbmcgdGhlIGRpYWxvZy4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVFlMRV9OT19GUkFNRSA9IDI7CisKKyAgICAvKioKKyAgICAgKiBTdHlsZSBmb3Ige0BsaW5rICNzZXRTdHlsZShpbnQsIGludCl9OiBsaWtlCisgICAgICoge0BsaW5rICNTVFlMRV9OT19GUkFNRX0sIGJ1dCBhbHNvIGRpc2FibGVzIGFsbCBpbnB1dCB0byB0aGUgZGlhbG9nLgorICAgICAqIFRoZSB1c2VyIGNhbiBub3QgdG91Y2ggaXQsIGFuZCBpdHMgd2luZG93IHdpbGwgbm90IHJlY2VpdmUgaW5wdXQgZm9jdXMuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RZTEVfTk9fSU5QVVQgPSAzOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNBVkVEX0RJQUxPR19TVEFURV9UQUcgPSAiYW5kcm9pZDpzYXZlZERpYWxvZ1N0YXRlIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0FWRURfU1RZTEUgPSAiYW5kcm9pZDpzdHlsZSI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNBVkVEX1RIRU1FID0gImFuZHJvaWQ6dGhlbWUiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTQVZFRF9DQU5DRUxBQkxFID0gImFuZHJvaWQ6Y2FuY2VsYWJsZSI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNBVkVEX1NIT1dTX0RJQUxPRyA9ICJhbmRyb2lkOnNob3dzRGlhbG9nIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0FWRURfQkFDS19TVEFDS19JRCA9ICJhbmRyb2lkOmJhY2tTdGFja0lkIjsKKworICAgIGludCBtU3R5bGUgPSBTVFlMRV9OT1JNQUw7CisgICAgaW50IG1UaGVtZSA9IDA7CisgICAgYm9vbGVhbiBtQ2FuY2VsYWJsZSA9IHRydWU7CisgICAgYm9vbGVhbiBtU2hvd3NEaWFsb2cgPSB0cnVlOworICAgIGludCBtQmFja1N0YWNrSWQgPSAtMTsKKworICAgIERpYWxvZyBtRGlhbG9nOworICAgIGJvb2xlYW4gbURlc3Ryb3llZDsKKyAgICBib29sZWFuIG1SZW1vdmVkOworCisgICAgcHVibGljIERpYWxvZ0ZyYWdtZW50KCkgeworICAgIH0KKworICAgIC8qKgorICAgICAqIENhbGwgdG8gY3VzdG9taXplIHRoZSBiYXNpYyBhcHBlYXJhbmNlIGFuZCBiZWhhdmlvciBvZiB0aGUKKyAgICAgKiBmcmFnbWVudCdzIGRpYWxvZy4gIFRoaXMgY2FuIGJlIHVzZWQgZm9yIHNvbWUgY29tbW9uIGRpYWxvZyBiZWhhdmlvcnMsCisgICAgICogdGFraW5nIGNhcmUgb2Ygc2VsZWN0aW5nIGZsYWdzLCB0aGVtZSwgYW5kIG90aGVyIG9wdGlvbnMgZm9yIHlvdS4gIFRoZQorICAgICAqIHNhbWUgZWZmZWN0IGNhbiBiZSBhY2hpZXZlIGJ5IG1hbnVhbGx5IHNldHRpbmcgRGlhbG9nIGFuZCBXaW5kb3cKKyAgICAgKiBhdHRyaWJ1dGVzIHlvdXJzZWxmLiAgQ2FsbGluZyB0aGlzIGFmdGVyIHRoZSBmcmFnbWVudCdzIERpYWxvZyBpcworICAgICAqIGNyZWF0ZWQgd2lsbCBoYXZlIG5vIGVmZmVjdC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzdHlsZSBTZWxlY3RzIGEgc3RhbmRhcmQgc3R5bGU6IG1heSBiZSB7QGxpbmsgI1NUWUxFX05PUk1BTH0sCisgICAgICoge0BsaW5rICNTVFlMRV9OT19USVRMRX0sIHtAbGluayAjU1RZTEVfTk9fRlJBTUV9LCBvcgorICAgICAqIHtAbGluayAjU1RZTEVfTk9fSU5QVVR9LgorICAgICAqIEBwYXJhbSB0aGVtZSBPcHRpb25hbCBjdXN0b20gdGhlbWUuICBJZiAwLCBhbiBhcHByb3ByaWF0ZSB0aGVtZSAoYmFzZWQKKyAgICAgKiBvbiB0aGUgc3R5bGUpIHdpbGwgYmUgc2VsZWN0ZWQgZm9yIHlvdS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRTdHlsZShpbnQgc3R5bGUsIGludCB0aGVtZSkgeworICAgICAgICBtU3R5bGUgPSBzdHlsZTsKKyAgICAgICAgaWYgKG1TdHlsZSA9PSBTVFlMRV9OT19GUkFNRSB8fCBtU3R5bGUgPT0gU1RZTEVfTk9fSU5QVVQpIHsKKyAgICAgICAgICAgIG1UaGVtZSA9IGFuZHJvaWQuUi5zdHlsZS5UaGVtZV9EaWFsb2dfTm9GcmFtZTsKKyAgICAgICAgfQorICAgICAgICBpZiAodGhlbWUgIT0gMCkgeworICAgICAgICAgICAgbVRoZW1lID0gdGhlbWU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAZGVwcmVjYXRlZCBQbGVhc2UgdXNlIHtAbGluayAjc2hvdyhGcmFnbWVudE1hbmFnZXIsIFN0cmluZyl9LgorICAgICAqLworICAgIEBEZXByZWNhdGVkCisgICAgcHVibGljIHZvaWQgc2hvdyhBY3Rpdml0eSBhY3Rpdml0eSwgU3RyaW5nIHRhZykgeworICAgICAgICBGcmFnbWVudFRyYW5zYWN0aW9uIGZ0ID0gYWN0aXZpdHkub3BlbkZyYWdtZW50VHJhbnNhY3Rpb24oKTsKKyAgICAgICAgZnQuYWRkKHRoaXMsIHRhZyk7CisgICAgICAgIGZ0LmNvbW1pdCgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIERpc3BsYXkgdGhlIGRpYWxvZywgYWRkaW5nIHRoZSBmcmFnbWVudCB0byB0aGUgZ2l2ZW4gRnJhZ21lbnRNYW5hZ2VyLiAgVGhpcworICAgICAqIGlzIGEgY29udmVuaWVuY2UgZm9yIGV4cGxpY2l0bHkgY3JlYXRpbmcgYSB0cmFuc2FjdGlvbiwgYWRkaW5nIHRoZQorICAgICAqIGZyYWdtZW50IHRvIGl0IHdpdGggdGhlIGdpdmVuIHRhZywgYW5kIGNvbW1pdHRpbmcgaXQuICBUaGlzIGRvZXMKKyAgICAgKiA8ZW0+bm90PC9lbT4gYWRkIHRoZSB0cmFuc2FjdGlvbiB0byB0aGUgYmFjayBzdGFjay4gIFdoZW4gdGhlIGZyYWdtZW50CisgICAgICogaXMgZGlzbWlzc2VkLCBhIG5ldyB0cmFuc2FjdGlvbiB3aWxsIGJlIGV4ZWN1dGVkIHRvIHJlbW92ZSBpdCBmcm9tCisgICAgICogdGhlIGFjdGl2aXR5LgorICAgICAqIEBwYXJhbSBtYW5hZ2VyIFRoZSBGcmFnbWVudE1hbmFnZXIgdGhpcyBmcmFnbWVudCB3aWxsIGJlIGFkZGVkIHRvLgorICAgICAqIEBwYXJhbSB0YWcgVGhlIHRhZyBmb3IgdGhpcyBmcmFnbWVudCwgYXMgcGVyCisgICAgICoge0BsaW5rIEZyYWdtZW50VHJhbnNhY3Rpb24jYWRkKEZyYWdtZW50LCBTdHJpbmcpIEZyYWdtZW50VHJhbnNhY3Rpb24uYWRkfS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzaG93KEZyYWdtZW50TWFuYWdlciBtYW5hZ2VyLCBTdHJpbmcgdGFnKSB7CisgICAgICAgIEZyYWdtZW50VHJhbnNhY3Rpb24gZnQgPSBtYW5hZ2VyLm9wZW5UcmFuc2FjdGlvbigpOworICAgICAgICBmdC5hZGQodGhpcywgdGFnKTsKKyAgICAgICAgZnQuY29tbWl0KCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogRGlzcGxheSB0aGUgZGlhbG9nLCBhZGRpbmcgdGhlIGZyYWdtZW50IHVzaW5nIGFuIGV4aXN0aW5nIHRyYW5zYWN0aW9uCisgICAgICogYW5kIHRoZW4gY29tbWl0dGluZyB0aGUgdHJhbnNhY3Rpb24uCisgICAgICogQHBhcmFtIHRyYW5zYWN0aW9uIEFuIGV4aXN0aW5nIHRyYW5zYWN0aW9uIGluIHdoaWNoIHRvIGFkZCB0aGUgZnJhZ21lbnQuCisgICAgICogQHBhcmFtIHRhZyBUaGUgdGFnIGZvciB0aGlzIGZyYWdtZW50LCBhcyBwZXIKKyAgICAgKiB7QGxpbmsgRnJhZ21lbnRUcmFuc2FjdGlvbiNhZGQoRnJhZ21lbnQsIFN0cmluZykgRnJhZ21lbnRUcmFuc2FjdGlvbi5hZGR9LgorICAgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgaWRlbnRpZmllciBvZiB0aGUgY29tbWl0dGVkIHRyYW5zYWN0aW9uLCBhcyBwZXIKKyAgICAgKiB7QGxpbmsgRnJhZ21lbnRUcmFuc2FjdGlvbiNjb21taXQoKSBGcmFnbWVudFRyYW5zYWN0aW9uLmNvbW1pdCgpfS4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IHNob3coRnJhZ21lbnRUcmFuc2FjdGlvbiB0cmFuc2FjdGlvbiwgU3RyaW5nIHRhZykgeworICAgICAgICB0cmFuc2FjdGlvbi5hZGQodGhpcywgdGFnKTsKKyAgICAgICAgbVJlbW92ZWQgPSBmYWxzZTsKKyAgICAgICAgbUJhY2tTdGFja0lkID0gdHJhbnNhY3Rpb24uY29tbWl0KCk7CisgICAgICAgIHJldHVybiBtQmFja1N0YWNrSWQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogRGlzbWlzcyB0aGUgZnJhZ21lbnQgYW5kIGl0cyBkaWFsb2cuICBJZiB0aGUgZnJhZ21lbnQgd2FzIGFkZGVkIHRvIHRoZQorICAgICAqIGJhY2sgc3RhY2ssIGFsbCBiYWNrIHN0YWNrIHN0YXRlIHVwIHRvIGFuZCBpbmNsdWRpbmcgdGhpcyBlbnRyeSB3aWxsCisgICAgICogYmUgcG9wcGVkLiAgT3RoZXJ3aXNlLCBhIG5ldyB0cmFuc2FjdGlvbiB3aWxsIGJlIGNvbW1pdHRlZCB0byByZW1vdmUKKyAgICAgKiB0aGUgZnJhZ21lbnQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgZGlzbWlzcygpIHsKKyAgICAgICAgaWYgKG1EaWFsb2cgIT0gbnVsbCkgeworICAgICAgICAgICAgbURpYWxvZy5kaXNtaXNzKCk7CisgICAgICAgICAgICBtRGlhbG9nID0gbnVsbDsKKyAgICAgICAgfQorICAgICAgICBtUmVtb3ZlZCA9IHRydWU7CisgICAgICAgIGlmIChtQmFja1N0YWNrSWQgPj0gMCkgeworICAgICAgICAgICAgZ2V0RnJhZ21lbnRNYW5hZ2VyKCkucG9wQmFja1N0YWNrKG1CYWNrU3RhY2tJZCwKKyAgICAgICAgICAgICAgICAgICAgRnJhZ21lbnRNYW5hZ2VyLlBPUF9CQUNLX1NUQUNLX0lOQ0xVU0lWRSk7CisgICAgICAgICAgICBtQmFja1N0YWNrSWQgPSAtMTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEZyYWdtZW50VHJhbnNhY3Rpb24gZnQgPSBnZXRGcmFnbWVudE1hbmFnZXIoKS5vcGVuVHJhbnNhY3Rpb24oKTsKKyAgICAgICAgICAgIGZ0LnJlbW92ZSh0aGlzKTsKKyAgICAgICAgICAgIGZ0LmNvbW1pdCgpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIERpYWxvZyBnZXREaWFsb2coKSB7CisgICAgICAgIHJldHVybiBtRGlhbG9nOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgZ2V0VGhlbWUoKSB7CisgICAgICAgIHJldHVybiBtVGhlbWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29udHJvbCB3aGV0aGVyIHRoZSBzaG93biBEaWFsb2cgaXMgY2FuY2VsYWJsZS4gIFVzZSB0aGlzIGluc3RlYWQgb2YKKyAgICAgKiBkaXJlY3RseSBjYWxsaW5nIHtAbGluayBEaWFsb2cjc2V0Q2FuY2VsYWJsZShib29sZWFuKQorICAgICAqIERpYWxvZy5zZXRDYW5jZWxhYmxlKGJvb2xlYW4pfSwgYmVjYXVzZSBEaWFsb2dGcmFnbWVudCBuZWVkcyB0byBjaGFuZ2UKKyAgICAgKiBpdHMgYmVoYXZpb3IgYmFzZWQgb24gdGhpcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjYW5jZWxhYmxlIElmIHRydWUsIHRoZSBkaWFsb2cgaXMgY2FuY2VsYWJsZS4gIFRoZSBkZWZhdWx0CisgICAgICogaXMgdHJ1ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRDYW5jZWxhYmxlKGJvb2xlYW4gY2FuY2VsYWJsZSkgeworICAgICAgICBtQ2FuY2VsYWJsZSA9IGNhbmNlbGFibGU7CisgICAgICAgIGlmIChtRGlhbG9nICE9IG51bGwpIG1EaWFsb2cuc2V0Q2FuY2VsYWJsZShjYW5jZWxhYmxlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIGN1cnJlbnQgdmFsdWUgb2Yge0BsaW5rICNzZXRDYW5jZWxhYmxlKGJvb2xlYW4pfS4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBnZXRDYW5jZWxhYmxlKCkgeworICAgICAgICByZXR1cm4gbUNhbmNlbGFibGU7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29udHJvbHMgd2hldGhlciB0aGlzIGZyYWdtZW50IHNob3VsZCBiZSBzaG93biBpbiBhIGRpYWxvZy4gIElmIG5vdAorICAgICAqIHNldCwgbm8gRGlhbG9nIHdpbGwgYmUgY3JlYXRlZCBpbiB7QGxpbmsgI29uQWN0aXZpdHlDcmVhdGVkKEJ1bmRsZSl9LAorICAgICAqIGFuZCB0aGUgZnJhZ21lbnQncyB2aWV3IGhpZXJhcmNoeSB3aWxsIHRodXMgbm90IGJlIGFkZGVkIHRvIGl0LiAgVGhpcworICAgICAqIGFsbG93cyB5b3UgdG8gaW5zdGVhZCB1c2UgaXQgYXMgYSBub3JtYWwgZnJhZ21lbnQgKGVtYmVkZGVkIGluc2lkZSBvZgorICAgICAqIGl0cyBhY3Rpdml0eSkuCisgICAgICoKKyAgICAgKiA8cD5UaGlzIGlzIG5vcm1hbGx5IHNldCBmb3IgeW91IGJhc2VkIG9uIHdoZXRoZXIgdGhlIGZyYWdtZW50IGlzCisgICAgICogYXNzb2NpYXRlZCB3aXRoIGEgY29udGFpbmVyIHZpZXcgSUQgcGFzc2VkIHRvCisgICAgICoge0BsaW5rIEZyYWdtZW50VHJhbnNhY3Rpb24jYWRkKGludCwgRnJhZ21lbnQpIEZyYWdtZW50VHJhbnNhY3Rpb24uYWRkKGludCwgRnJhZ21lbnQpfS4KKyAgICAgKiBJZiB0aGUgZnJhZ21lbnQgd2FzIGFkZGVkIHdpdGggYSBjb250YWluZXIsIHNldFNob3dzRGlhbG9nIHdpbGwgYmUKKyAgICAgKiBpbml0aWFsaXplZCB0byBmYWxzZTsgb3RoZXJ3aXNlLCBpdCB3aWxsIGJlIHRydWUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gc2hvd3NEaWFsb2cgSWYgdHJ1ZSwgdGhlIGZyYWdtZW50IHdpbGwgYmUgZGlzcGxheWVkIGluIGEgRGlhbG9nLgorICAgICAqIElmIGZhbHNlLCBubyBEaWFsb2cgd2lsbCBiZSBjcmVhdGVkIGFuZCB0aGUgZnJhZ21lbnQncyB2aWV3IGhpZXJhcmNobHkKKyAgICAgKiBsZWZ0IHVuZGlzdHVyYmVkLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFNob3dzRGlhbG9nKGJvb2xlYW4gc2hvd3NEaWFsb2cpIHsKKyAgICAgICAgbVNob3dzRGlhbG9nID0gc2hvd3NEaWFsb2c7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBjdXJyZW50IHZhbHVlIG9mIHtAbGluayAjc2V0U2hvd3NEaWFsb2coYm9vbGVhbil9LgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGdldFNob3dzRGlhbG9nKCkgeworICAgICAgICByZXR1cm4gbVNob3dzRGlhbG9nOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9uQ3JlYXRlKEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpIHsKKyAgICAgICAgc3VwZXIub25DcmVhdGUoc2F2ZWRJbnN0YW5jZVN0YXRlKTsKKworICAgICAgICBtU2hvd3NEaWFsb2cgPSBtQ29udGFpbmVySWQgPT0gMDsKKworICAgICAgICBpZiAoc2F2ZWRJbnN0YW5jZVN0YXRlICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1TdHlsZSA9IHNhdmVkSW5zdGFuY2VTdGF0ZS5nZXRJbnQoU0FWRURfU1RZTEUsIFNUWUxFX05PUk1BTCk7CisgICAgICAgICAgICBtVGhlbWUgPSBzYXZlZEluc3RhbmNlU3RhdGUuZ2V0SW50KFNBVkVEX1RIRU1FLCAwKTsKKyAgICAgICAgICAgIG1DYW5jZWxhYmxlID0gc2F2ZWRJbnN0YW5jZVN0YXRlLmdldEJvb2xlYW4oU0FWRURfQ0FOQ0VMQUJMRSwgdHJ1ZSk7CisgICAgICAgICAgICBtU2hvd3NEaWFsb2cgPSBzYXZlZEluc3RhbmNlU3RhdGUuZ2V0Qm9vbGVhbihTQVZFRF9TSE9XU19ESUFMT0csIG1TaG93c0RpYWxvZyk7CisgICAgICAgICAgICBtQmFja1N0YWNrSWQgPSBzYXZlZEluc3RhbmNlU3RhdGUuZ2V0SW50KFNBVkVEX0JBQ0tfU1RBQ0tfSUQsIC0xKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBEaWFsb2cgb25DcmVhdGVEaWFsb2coQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgeworICAgICAgICByZXR1cm4gbmV3IERpYWxvZyhnZXRBY3Rpdml0eSgpLCBnZXRUaGVtZSgpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBvbkNhbmNlbChEaWFsb2dJbnRlcmZhY2UgZGlhbG9nKSB7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgb25EaXNtaXNzKERpYWxvZ0ludGVyZmFjZSBkaWFsb2cpIHsKKyAgICAgICAgaWYgKCFtUmVtb3ZlZCkgeworICAgICAgICAgICAgZGlzbWlzcygpOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb25BY3Rpdml0eUNyZWF0ZWQoQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgeworICAgICAgICBzdXBlci5vbkFjdGl2aXR5Q3JlYXRlZChzYXZlZEluc3RhbmNlU3RhdGUpOworCisgICAgICAgIGlmICghbVNob3dzRGlhbG9nKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBtRGlhbG9nID0gb25DcmVhdGVEaWFsb2coc2F2ZWRJbnN0YW5jZVN0YXRlKTsKKyAgICAgICAgbURlc3Ryb3llZCA9IGZhbHNlOworICAgICAgICBzd2l0Y2ggKG1TdHlsZSkgeworICAgICAgICAgICAgY2FzZSBTVFlMRV9OT19JTlBVVDoKKyAgICAgICAgICAgICAgICBtRGlhbG9nLmdldFdpbmRvdygpLmFkZEZsYWdzKAorICAgICAgICAgICAgICAgICAgICAgICAgV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMuRkxBR19OT1RfRk9DVVNBQkxFIHwKKyAgICAgICAgICAgICAgICAgICAgICAgIFdpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zLkZMQUdfTk9UX1RPVUNIQUJMRSk7CisgICAgICAgICAgICAgICAgLy8gZmFsbCB0aHJvdWdoLi4uCisgICAgICAgICAgICBjYXNlIFNUWUxFX05PX0ZSQU1FOgorICAgICAgICAgICAgY2FzZSBTVFlMRV9OT19USVRMRToKKyAgICAgICAgICAgICAgICBtRGlhbG9nLnJlcXVlc3RXaW5kb3dGZWF0dXJlKFdpbmRvdy5GRUFUVVJFX05PX1RJVExFKTsKKyAgICAgICAgfQorICAgICAgICBWaWV3IHZpZXcgPSBnZXRWaWV3KCk7CisgICAgICAgIGlmICh2aWV3ICE9IG51bGwpIHsKKyAgICAgICAgICAgIGlmICh2aWV3LmdldFBhcmVudCgpICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJEaWFsb2dGcmFnbWVudCBjYW4gbm90IGJlIGF0dGFjaGVkIHRvIGEgY29udGFpbmVyIHZpZXciKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1EaWFsb2cuc2V0Q29udGVudFZpZXcodmlldyk7CisgICAgICAgIH0KKyAgICAgICAgbURpYWxvZy5zZXRPd25lckFjdGl2aXR5KGdldEFjdGl2aXR5KCkpOworICAgICAgICBtRGlhbG9nLnNldENhbmNlbGFibGUobUNhbmNlbGFibGUpOworICAgICAgICBtRGlhbG9nLnNldE9uQ2FuY2VsTGlzdGVuZXIodGhpcyk7CisgICAgICAgIG1EaWFsb2cuc2V0T25EaXNtaXNzTGlzdGVuZXIodGhpcyk7CisgICAgICAgIGlmIChzYXZlZEluc3RhbmNlU3RhdGUgIT0gbnVsbCkgeworICAgICAgICAgICAgQnVuZGxlIGRpYWxvZ1N0YXRlID0gc2F2ZWRJbnN0YW5jZVN0YXRlLmdldEJ1bmRsZShTQVZFRF9ESUFMT0dfU1RBVEVfVEFHKTsKKyAgICAgICAgICAgIGlmIChkaWFsb2dTdGF0ZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgbURpYWxvZy5vblJlc3RvcmVJbnN0YW5jZVN0YXRlKGRpYWxvZ1N0YXRlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9uU3RhcnQoKSB7CisgICAgICAgIHN1cGVyLm9uU3RhcnQoKTsKKyAgICAgICAgaWYgKG1EaWFsb2cgIT0gbnVsbCkgeworICAgICAgICAgICAgbVJlbW92ZWQgPSBmYWxzZTsKKyAgICAgICAgICAgIG1EaWFsb2cuc2hvdygpOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb25TYXZlSW5zdGFuY2VTdGF0ZShCdW5kbGUgb3V0U3RhdGUpIHsKKyAgICAgICAgc3VwZXIub25TYXZlSW5zdGFuY2VTdGF0ZShvdXRTdGF0ZSk7CisgICAgICAgIGlmIChtRGlhbG9nICE9IG51bGwpIHsKKyAgICAgICAgICAgIEJ1bmRsZSBkaWFsb2dTdGF0ZSA9IG1EaWFsb2cub25TYXZlSW5zdGFuY2VTdGF0ZSgpOworICAgICAgICAgICAgaWYgKGRpYWxvZ1N0YXRlICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBvdXRTdGF0ZS5wdXRCdW5kbGUoU0FWRURfRElBTE9HX1NUQVRFX1RBRywgZGlhbG9nU3RhdGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChtU3R5bGUgIT0gU1RZTEVfTk9STUFMKSB7CisgICAgICAgICAgICBvdXRTdGF0ZS5wdXRJbnQoU0FWRURfU1RZTEUsIG1TdHlsZSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1UaGVtZSAhPSAwKSB7CisgICAgICAgICAgICBvdXRTdGF0ZS5wdXRJbnQoU0FWRURfVEhFTUUsIG1UaGVtZSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFtQ2FuY2VsYWJsZSkgeworICAgICAgICAgICAgb3V0U3RhdGUucHV0Qm9vbGVhbihTQVZFRF9DQU5DRUxBQkxFLCBtQ2FuY2VsYWJsZSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFtU2hvd3NEaWFsb2cpIHsKKyAgICAgICAgICAgIG91dFN0YXRlLnB1dEJvb2xlYW4oU0FWRURfU0hPV1NfRElBTE9HLCBtU2hvd3NEaWFsb2cpOworICAgICAgICB9CisgICAgICAgIGlmIChtQmFja1N0YWNrSWQgIT0gLTEpIHsKKyAgICAgICAgICAgIG91dFN0YXRlLnB1dEludChTQVZFRF9CQUNLX1NUQUNLX0lELCBtQmFja1N0YWNrSWQpOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb25TdG9wKCkgeworICAgICAgICBzdXBlci5vblN0b3AoKTsKKyAgICAgICAgaWYgKG1EaWFsb2cgIT0gbnVsbCkgeworICAgICAgICAgICAgbURpYWxvZy5oaWRlKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZW1vdmUgZGlhbG9nLgorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9uRGVzdHJveVZpZXcoKSB7CisgICAgICAgIHN1cGVyLm9uRGVzdHJveVZpZXcoKTsKKyAgICAgICAgbURlc3Ryb3llZCA9IHRydWU7CisgICAgICAgIGlmIChtRGlhbG9nICE9IG51bGwpIHsKKyAgICAgICAgICAgIC8vIFNldCByZW1vdmVkIGhlcmUgYmVjYXVzZSB0aGlzIGRpc21pc3NhbCBpcyBqdXN0IHRvIGhpZGUKKyAgICAgICAgICAgIC8vIHRoZSBkaWFsb2cgLS0gd2UgZG9uJ3Qgd2FudCB0aGlzIHRvIGNhdXNlIHRoZSBmcmFnbWVudCB0bworICAgICAgICAgICAgLy8gYWN0dWFsbHkgYmUgcmVtb3ZlZC4KKyAgICAgICAgICAgIG1SZW1vdmVkID0gdHJ1ZTsKKyAgICAgICAgICAgIG1EaWFsb2cuZGlzbWlzcygpOworICAgICAgICAgICAgbURpYWxvZyA9IG51bGw7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9hcHAvRnJhZ21lbnQuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9GcmFnbWVudC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFjYmVkNzkKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9hcHAvRnJhZ21lbnQuamF2YQpAQCAtMCwwICsxLDEwOTUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQuYXBwOworCitpbXBvcnQgYW5kcm9pZC5hbmltYXRpb24uQW5pbWF0b3I7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbXBvbmVudENhbGxiYWNrczsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuQ29uZmlndXJhdGlvbjsKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKK2ltcG9ydCBhbmRyb2lkLm9zLlBhcmNlbDsKK2ltcG9ydCBhbmRyb2lkLm9zLlBhcmNlbGFibGU7CitpbXBvcnQgYW5kcm9pZC51dGlsLkFuZHJvaWRSdW50aW1lRXhjZXB0aW9uOworaW1wb3J0IGFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQ7CitpbXBvcnQgYW5kcm9pZC51dGlsLlNwYXJzZUFycmF5OworaW1wb3J0IGFuZHJvaWQudmlldy5Db250ZXh0TWVudTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuTGF5b3V0SW5mbGF0ZXI7CitpbXBvcnQgYW5kcm9pZC52aWV3Lk1lbnU7CitpbXBvcnQgYW5kcm9pZC52aWV3Lk1lbnVJbmZsYXRlcjsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuTWVudUl0ZW07CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXdHcm91cDsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuQ29udGV4dE1lbnUuQ29udGV4dE1lbnVJbmZvOworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3Lk9uQ3JlYXRlQ29udGV4dE1lbnVMaXN0ZW5lcjsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5BZGFwdGVyVmlldzsKKworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworCitmaW5hbCBjbGFzcyBGcmFnbWVudFN0YXRlIGltcGxlbWVudHMgUGFyY2VsYWJsZSB7CisgICAgZmluYWwgU3RyaW5nIG1DbGFzc05hbWU7CisgICAgZmluYWwgaW50IG1JbmRleDsKKyAgICBmaW5hbCBib29sZWFuIG1Gcm9tTGF5b3V0OworICAgIGZpbmFsIGludCBtRnJhZ21lbnRJZDsKKyAgICBmaW5hbCBpbnQgbUNvbnRhaW5lcklkOworICAgIGZpbmFsIFN0cmluZyBtVGFnOworICAgIGZpbmFsIGJvb2xlYW4gbVJldGFpbkluc3RhbmNlOworICAgIGZpbmFsIEJ1bmRsZSBtQXJndW1lbnRzOworICAgIAorICAgIEJ1bmRsZSBtU2F2ZWRGcmFnbWVudFN0YXRlOworICAgIAorICAgIEZyYWdtZW50IG1JbnN0YW5jZTsKKyAgICAKKyAgICBwdWJsaWMgRnJhZ21lbnRTdGF0ZShGcmFnbWVudCBmcmFnKSB7CisgICAgICAgIG1DbGFzc05hbWUgPSBmcmFnLmdldENsYXNzKCkuZ2V0TmFtZSgpOworICAgICAgICBtSW5kZXggPSBmcmFnLm1JbmRleDsKKyAgICAgICAgbUZyb21MYXlvdXQgPSBmcmFnLm1Gcm9tTGF5b3V0OworICAgICAgICBtRnJhZ21lbnRJZCA9IGZyYWcubUZyYWdtZW50SWQ7CisgICAgICAgIG1Db250YWluZXJJZCA9IGZyYWcubUNvbnRhaW5lcklkOworICAgICAgICBtVGFnID0gZnJhZy5tVGFnOworICAgICAgICBtUmV0YWluSW5zdGFuY2UgPSBmcmFnLm1SZXRhaW5JbnN0YW5jZTsKKyAgICAgICAgbUFyZ3VtZW50cyA9IGZyYWcubUFyZ3VtZW50czsKKyAgICB9CisgICAgCisgICAgcHVibGljIEZyYWdtZW50U3RhdGUoUGFyY2VsIGluKSB7CisgICAgICAgIG1DbGFzc05hbWUgPSBpbi5yZWFkU3RyaW5nKCk7CisgICAgICAgIG1JbmRleCA9IGluLnJlYWRJbnQoKTsKKyAgICAgICAgbUZyb21MYXlvdXQgPSBpbi5yZWFkSW50KCkgIT0gMDsKKyAgICAgICAgbUZyYWdtZW50SWQgPSBpbi5yZWFkSW50KCk7CisgICAgICAgIG1Db250YWluZXJJZCA9IGluLnJlYWRJbnQoKTsKKyAgICAgICAgbVRhZyA9IGluLnJlYWRTdHJpbmcoKTsKKyAgICAgICAgbVJldGFpbkluc3RhbmNlID0gaW4ucmVhZEludCgpICE9IDA7CisgICAgICAgIG1Bcmd1bWVudHMgPSBpbi5yZWFkQnVuZGxlKCk7CisgICAgICAgIG1TYXZlZEZyYWdtZW50U3RhdGUgPSBpbi5yZWFkQnVuZGxlKCk7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBGcmFnbWVudCBpbnN0YW50aWF0ZShBY3Rpdml0eSBhY3Rpdml0eSkgeworICAgICAgICBpZiAobUluc3RhbmNlICE9IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBtSW5zdGFuY2U7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIG1JbnN0YW5jZSA9IEZyYWdtZW50Lmluc3RhbnRpYXRlKGFjdGl2aXR5LCBtQ2xhc3NOYW1lLCBtQXJndW1lbnRzKTsKKyAgICAgICAgCisgICAgICAgIGlmIChtU2F2ZWRGcmFnbWVudFN0YXRlICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1TYXZlZEZyYWdtZW50U3RhdGUuc2V0Q2xhc3NMb2FkZXIoYWN0aXZpdHkuZ2V0Q2xhc3NMb2FkZXIoKSk7CisgICAgICAgICAgICBtSW5zdGFuY2UubVNhdmVkRnJhZ21lbnRTdGF0ZSA9IG1TYXZlZEZyYWdtZW50U3RhdGU7CisgICAgICAgIH0KKyAgICAgICAgbUluc3RhbmNlLnNldEluZGV4KG1JbmRleCk7CisgICAgICAgIG1JbnN0YW5jZS5tRnJvbUxheW91dCA9IG1Gcm9tTGF5b3V0OworICAgICAgICBtSW5zdGFuY2UubUZyYWdtZW50SWQgPSBtRnJhZ21lbnRJZDsKKyAgICAgICAgbUluc3RhbmNlLm1Db250YWluZXJJZCA9IG1Db250YWluZXJJZDsKKyAgICAgICAgbUluc3RhbmNlLm1UYWcgPSBtVGFnOworICAgICAgICBtSW5zdGFuY2UubVJldGFpbkluc3RhbmNlID0gbVJldGFpbkluc3RhbmNlOworICAgICAgICBtSW5zdGFuY2UubUZyYWdtZW50TWFuYWdlciA9IGFjdGl2aXR5Lm1GcmFnbWVudHM7CisgICAgICAgIAorICAgICAgICByZXR1cm4gbUluc3RhbmNlOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgaW50IGRlc2NyaWJlQ29udGVudHMoKSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHdyaXRlVG9QYXJjZWwoUGFyY2VsIGRlc3QsIGludCBmbGFncykgeworICAgICAgICBkZXN0LndyaXRlU3RyaW5nKG1DbGFzc05hbWUpOworICAgICAgICBkZXN0LndyaXRlSW50KG1JbmRleCk7CisgICAgICAgIGRlc3Qud3JpdGVJbnQobUZyb21MYXlvdXQgPyAxIDogMCk7CisgICAgICAgIGRlc3Qud3JpdGVJbnQobUZyYWdtZW50SWQpOworICAgICAgICBkZXN0LndyaXRlSW50KG1Db250YWluZXJJZCk7CisgICAgICAgIGRlc3Qud3JpdGVTdHJpbmcobVRhZyk7CisgICAgICAgIGRlc3Qud3JpdGVJbnQobVJldGFpbkluc3RhbmNlID8gMSA6IDApOworICAgICAgICBkZXN0LndyaXRlQnVuZGxlKG1Bcmd1bWVudHMpOworICAgICAgICBkZXN0LndyaXRlQnVuZGxlKG1TYXZlZEZyYWdtZW50U3RhdGUpOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFBhcmNlbGFibGUuQ3JlYXRvcjxGcmFnbWVudFN0YXRlPiBDUkVBVE9SCisgICAgICAgICAgICA9IG5ldyBQYXJjZWxhYmxlLkNyZWF0b3I8RnJhZ21lbnRTdGF0ZT4oKSB7CisgICAgICAgIHB1YmxpYyBGcmFnbWVudFN0YXRlIGNyZWF0ZUZyb21QYXJjZWwoUGFyY2VsIGluKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IEZyYWdtZW50U3RhdGUoaW4pOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBwdWJsaWMgRnJhZ21lbnRTdGF0ZVtdIG5ld0FycmF5KGludCBzaXplKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IEZyYWdtZW50U3RhdGVbc2l6ZV07CisgICAgICAgIH0KKyAgICB9OworfQorCisvKioKKyAqIEEgRnJhZ21lbnQgaXMgYSBwaWVjZSBvZiBhbiBhcHBsaWNhdGlvbidzIHVzZXIgaW50ZXJmYWNlIG9yIGJlaGF2aW9yCisgKiB0aGF0IGNhbiBiZSBwbGFjZWQgaW4gYW4ge0BsaW5rIEFjdGl2aXR5fS4gIEludGVyYWN0aW9uIHdpdGggZnJhZ21lbnRzCisgKiBpcyBkb25lIHRocm91Z2gge0BsaW5rIEZyYWdtZW50TWFuYWdlcn0sIHdoaWNoIGNhbiBiZSBvYnRhaW5lZCB2aWEKKyAqIHtAbGluayBBY3Rpdml0eSNnZXRGcmFnbWVudE1hbmFnZXIoKSBBY3Rpdml0eS5nZXRGcmFnbWVudE1hbmFnZXIoKX0gYW5kCisgKiB7QGxpbmsgRnJhZ21lbnQjZ2V0RnJhZ21lbnRNYW5hZ2VyKCkgRnJhZ21lbnQuZ2V0RnJhZ21lbnRNYW5hZ2VyKCl9LgorICoKKyAqIDxwPlRoZSBGcmFnbWVudCBjbGFzcyBjYW4gYmUgdXNlZCBtYW55IHdheXMgdG8gYWNoaWV2ZSBhIHdpZGUgdmFyaWV0eSBvZgorICogcmVzdWx0cy4gIEl0IGlzIGNvcmUsIGl0IHJlcHJlc2VudHMgYSBwYXJ0aWN1bGFyIG9wZXJhdGlvbiBvciBpbnRlcmZhY2UKKyAqIHRoYXQgaXMgcnVubmluZyB3aXRoaW4gYSBsYXJnZXIge0BsaW5rIEFjdGl2aXR5fS4gIEEgRnJhZ21lbnQgaXMgY2xvc2VseQorICogdGllZCB0byB0aGUgQWN0aXZpdHkgaXQgaXMgaW4sIGFuZCBjYW4gbm90IGJlIHVzZWQgYXBhcnQgZnJvbSBvbmUuICBUaG91Z2gKKyAqIEZyYWdtZW50IGRlZmluZXMgaXRzIG93biBsaWZlY3ljbGUsIHRoYXQgbGlmZWN5Y2xlIGlzIGRlcGVuZGVudCBvbiBpdHMKKyAqIGFjdGl2aXR5OiBpZiB0aGUgYWN0aXZpdHkgaXMgc3RvcHBlZCwgbm8gZnJhZ21lbnRzIGluc2lkZSBvZiBpdCBjYW4gYmUKKyAqIHN0YXJ0ZWQ7IHdoZW4gdGhlIGFjdGl2aXR5IGlzIGRlc3Ryb3llZCwgYWxsIGZyYWdtZW50cyB3aWxsIGJlIGRlc3Ryb3llZC4KKyAqCisgKiA8cD5BbGwgc3ViY2xhc3NlcyBvZiBGcmFnbWVudCBtdXN0IGluY2x1ZGUgYSBwdWJsaWMgZW1wdHkgY29uc3RydWN0b3IuCisgKiBUaGUgZnJhbWV3b3JrIHdpbGwgb2Z0ZW4gcmUtaW5zdGFudGlhdGUgYSBmcmFnbWVudCBjbGFzcyB3aGVuIG5lZWRlZCwKKyAqIGluIHBhcnRpY3VsYXIgZHVyaW5nIHN0YXRlIHJlc3RvcmUsIGFuZCBuZWVkcyB0byBiZSBhYmxlIHRvIGZpbmQgdGhpcworICogY29uc3RydWN0b3IgdG8gaW5zdGFudGlhdGUgaXQuICBJZiB0aGUgZW1wdHkgY29uc3RydWN0b3IgaXMgbm90IGF2YWlsYWJsZSwKKyAqIGEgcnVudGltZSBleGNlcHRpb24gd2lsbCBvY2N1ciBpbiBzb21lIGNhc2VzIGR1cmluZyBzdGF0ZSByZXN0b3JlLgorICoKKyAqIDxwPlRvcGljcyBjb3ZlcmVkIGhlcmU6CisgKiA8b2w+CisgKiA8bGk+PGEgaHJlZj0iI0xpZmVjeWNsZSI+TGlmZWN5Y2xlPC9hPgorICogPGxpPjxhIGhyZWY9IiNMYXlvdXQiPkxheW91dDwvYT4KKyAqIDxsaT48YSBocmVmPSIjQmFja1N0YWNrIj5CYWNrIFN0YWNrPC9hPgorICogPC9vbD4KKyAqCisgKiA8YSBuYW1lPSJMaWZlY3ljbGUiPjwvYT4KKyAqIDxoMz5MaWZlY3ljbGU8L2gzPgorICoKKyAqIDxwPlRob3VnaCBhIEZyYWdtZW50J3MgbGlmZWN5Y2xlIGlzIHRpZWQgdG8gaXRzIG93bmluZyBhY3Rpdml0eSwgaXQgaGFzCisgKiBpdHMgb3duIHdyaW5rbGUgb24gdGhlIHN0YW5kYXJkIGFjdGl2aXR5IGxpZmVjeWNsZS4gIEl0IGluY2x1ZGVzIGJhc2ljCisgKiBhY3Rpdml0eSBsaWZlY3ljbGUgbWV0aG9kcyBzdWNoIGFzIHtAbGluayAjb25SZXN1bWV9LCBidXQgYWxzbyBpbXBvcnRhbnQKKyAqIGFyZSBtZXRob2RzIHJlbGF0ZWQgdG8gaW50ZXJhY3Rpb25zIHdpdGggdGhlIGFjdGl2aXR5IGFuZCBVSSBnZW5lcmF0aW9uLgorICoKKyAqIDxwPlRoZSBjb3JlIHNlcmllcyBvZiBsaWZlY3ljbGUgbWV0aG9kcyB0aGF0IGFyZSBjYWxsZWQgdG8gYnJpbmcgYSBmcmFnbWVudAorICogdXAgdG8gcmVzdW1lZCBzdGF0ZSAoaW50ZXJhY3Rpbmcgd2l0aCB0aGUgdXNlcikgYXJlOgorICoKKyAqIDxvbD4KKyAqIDxsaT4ge0BsaW5rICNvbkF0dGFjaH0gY2FsbGVkIG9uY2UgdGhlIGZyYWdtZW50IGlzIGFzc29jaWF0ZWQgd2l0aCBpdHMgYWN0aXZpdHkuCisgKiA8bGk+IHtAbGluayAjb25DcmVhdGV9IGNhbGxlZCB0byBkbyBpbml0aWFsIGNyZWF0aW9uIG9mIHRoZSBmcmFnbWVudC4KKyAqIDxsaT4ge0BsaW5rICNvbkNyZWF0ZVZpZXd9IGNyZWF0ZXMgYW5kIHJldHVybnMgdGhlIHZpZXcgaGllcmFyY2h5IGFzc29jaWF0ZWQKKyAqIHdpdGggdGhlIGZyYWdtZW50LgorICogPGxpPiB7QGxpbmsgI29uQWN0aXZpdHlDcmVhdGVkfSB0ZWxscyB0aGUgZnJhZ21lbnQgdGhhdCBpdHMgYWN0aXZpdHkgaGFzCisgKiBjb21wbGV0ZWQgaXRzIG93biB7QGxpbmsgQWN0aXZpdHkjb25DcmVhdGUgQWN0aXZpdHkub25DcmVhYXRlfS4KKyAqIDxsaT4ge0BsaW5rICNvblN0YXJ0fSBtYWtlcyB0aGUgZnJhZ21lbnQgdmlzaWJsZSB0byB0aGUgdXNlciAoYmFzZWQgb24gaXRzCisgKiBjb250YWluaW5nIGFjdGl2aXR5IGJlaW5nIHN0YXJ0ZWQpLgorICogPGxpPiB7QGxpbmsgI29uUmVzdW1lfSBtYWtlcyB0aGUgZnJhZ21lbnQgaW50ZXJhY3Rpbmcgd2l0aCB0aGUgdXNlciAoYmFzZWQgb24gaXRzCisgKiBjb250YWluaW5nIGFjdGl2aXR5IGJlaW5nIHJlc3VtZWQpLgorICogPC9vbD4KKyAqCisgKiA8cD5BcyBhIGZyYWdtZW50IGlzIG5vIGxvbmdlciBiZWluZyB1c2VkLCBpdCBnb2VzIHRocm91Z2ggYSByZXZlcnNlCisgKiBzZXJpZXMgb2YgY2FsbGJhY2tzOgorICoKKyAqIDxvbD4KKyAqIDxsaT4ge0BsaW5rICNvblBhdXNlfSBmcmFnbWVudCBpcyBubyBsb25nZXIgaW50ZXJhY3Rpbmcgd2l0aCB0aGUgdXNlciBlaXRoZXIKKyAqIGJlY2F1c2UgaXRzIGFjdGl2aXR5IGlzIGJlaW5nIHBhdXNlZCBvciBhIGZyYWdtZW50IG9wZXJhdGlvbiBpcyBtb2RpZnlpbmcgaXQKKyAqIGluIHRoZSBhY3Rpdml0eS4KKyAqIDxsaT4ge0BsaW5rICNvblN0b3B9IGZyYWdtZW50IGlzIG5vIGxvbmdlciB2aXNpYmxlIHRvIHRoZSB1c2VyIGVpdGhlcgorICogYmVjYXVzZSBpdHMgYWN0aXZpdHkgaXMgYmVpbmcgc3RvcHBlZCBvciBhIGZyYWdtZW50IG9wZXJhdGlvbiBpcyBtb2RpZnlpbmcgaXQKKyAqIGluIHRoZSBhY3Rpdml0eS4KKyAqIDxsaT4ge0BsaW5rICNvbkRlc3Ryb3lWaWV3fSBhbGxvd3MgdGhlIGZyYWdtZW50IHRvIGNsZWFuIHVwIHJlc291cmNlcworICogYXNzb2NpYXRlZCB3aXRoIGl0cyBWaWV3LgorICogPGxpPiB7QGxpbmsgI29uRGVzdHJveX0gY2FsbGVkIHRvIGRvIGZpbmFsIGNsZWFudXAgb2YgdGhlIGZyYWdtZW50J3Mgc3RhdGUuCisgKiA8bGk+IHtAbGluayAjb25EZXRhY2h9IGNhbGxlZCBpbW1lZGlhdGVseSBwcmlvciB0byB0aGUgZnJhZ21lbnQgbm8gbG9uZ2VyCisgKiBiZWluZyBhc3NvY2lhdGVkIHdpdGggaXRzIGFjdGl2aXR5LgorICogPC9vbD4KKyAqCisgKiA8YSBuYW1lPSJMYXlvdXQiPjwvYT4KKyAqIDxoMz5MYXlvdXQ8L2gzPgorICoKKyAqIDxwPkZyYWdtZW50cyBjYW4gYmUgdXNlZCBhcyBwYXJ0IG9mIHlvdXIgYXBwbGljYXRpb24ncyBsYXlvdXQsIGFsbG93aW5nCisgKiB5b3UgdG8gYmV0dGVyIG1vZHVsYXJpemUgeW91ciBjb2RlIGFuZCBtb3JlIGVhc2lseSBhZGp1c3QgeW91ciB1c2VyCisgKiBpbnRlcmZhY2UgdG8gdGhlIHNjcmVlbiBpdCBpcyBydW5uaW5nIG9uLiAgQXMgYW4gZXhhbXBsZSwgd2UgY2FuIGxvb2sKKyAqIGF0IGEgc2ltcGxlIHByb2dyYW0gY29uc2lzdGluZyBvZiBhIGxpc3Qgb2YgaXRlbXMsIGFuZCBkaXNwbGF5IG9mIHRoZQorICogZGV0YWlscyBvZiBlYWNoIGl0ZW0uPC9wPgorICoKKyAqIDxwPkFuIGFjdGl2aXR5J3MgbGF5b3V0IFhNTCBjYW4gaW5jbHVkZSA8Y29kZT4mbHQ7ZnJhZ21lbnQmZ3Q7PC9jb2RlPiB0YWdzCisgKiB0byBlbWJlZCBmcmFnbWVudCBpbnN0YW5jZXMgaW5zaWRlIG9mIHRoZSBsYXlvdXQuICBGb3IgZXhhbXBsZSwgaGVyZSBpcworICogYSBzaW1wbHkgbGF5b3V0IHRoYXQgZW1iZWRzIG9uZSBmcmFnbWVudDo8L3A+CisgKgorICoge0BzYW1wbGUgZGV2ZWxvcG1lbnQvc2FtcGxlcy9BcGlEZW1vcy9yZXMvbGF5b3V0L2ZyYWdtZW50X2xheW91dC54bWwgbGF5b3V0fQorICoKKyAqIDxwPlRoZSBsYXlvdXQgaXMgaW5zdGFsbGVkIGluIHRoZSBhY3Rpdml0eSBpbiB0aGUgbm9ybWFsIHdheTo8L3A+CisgKgorICoge0BzYW1wbGUgZGV2ZWxvcG1lbnQvc2FtcGxlcy9BcGlEZW1vcy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9hcGlzL2FwcC9GcmFnbWVudExheW91dC5qYXZhCisgKiAgICAgIG1haW59CisgKgorICogPHA+VGhlIHRpdGxlcyBmcmFnbWVudCwgc2hvd2luZyBhIGxpc3Qgb2YgdGl0bGVzLCBpcyB2ZXJ5IHNpbXBsZSwgcmVseWluZworICogb24ge0BsaW5rIExpc3RGcmFnbWVudH0gZm9yIG1vc3Qgb2YgaXRzIHdvcmsuICBOb3RlIHRoZSBpbXBsZW1lbnRhdGlvbiBvZgorICogY2xpY2tpbmcgYW4gaXRlbSwgd2hpY2ggY2FuIGVpdGhlciB1cGRhdGUKKyAqIHRoZSBjb250ZW50IG9mIHRoZSBkZXRhaWxzIGZyYWdtZW50IG9yIHN0YXJ0IGEgbmV3IGFjdGl2aXR5IHNob3cgdGhlCisgKiBkZXRhaWxzIGRlcGVuZGluZyBvbiB3aGV0aGVyIHRoZSBjdXJyZW50IGFjdGl2aXR5J3MgbGF5b3V0IGNhbiBzaG93IHRoZQorICogZGV0YWlscy48L3A+CisgKgorICoge0BzYW1wbGUgZGV2ZWxvcG1lbnQvc2FtcGxlcy9BcGlEZW1vcy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9hcGlzL2FwcC9GcmFnbWVudExheW91dC5qYXZhCisgKiAgICAgIHRpdGxlc30KKyAqCisgKiA8cD5UaGUgZGV0YWlscyBmcmFnbWVudCBzaG93aW5nIHRoZSBjb250ZW50cyBvZiBzZWxlY3RlZCBpdGVtIGhlcmUganVzdAorICogZGlzcGxheXMgYSBzdHJpbmcgb2YgdGV4dCBiYXNlZCBvbiBhbiBpbmRleCBvZiBhIHN0cmluZyBhcnJheSBidWlsdCBpbiB0bworICogdGhlIGFwcDo8L3A+CisgKgorICoge0BzYW1wbGUgZGV2ZWxvcG1lbnQvc2FtcGxlcy9BcGlEZW1vcy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9hcGlzL2FwcC9GcmFnbWVudExheW91dC5qYXZhCisgKiAgICAgIGRldGFpbHN9CisgKgorICogPHA+SW4gdGhpcyBjYXNlIHdoZW4gdGhlIHVzZXIgY2xpY2tzIG9uIGEgdGl0bGUsIHRoZXJlIGlzIG5vIGRldGFpbHMKKyAqIGZyYWdtZW50IGluIHRoZSBjdXJyZW50IGFjdGl2aXR5LCBzbyB0aGUgdGl0bGUgdGl0bGUgZnJhZ21lbnQncyBjbGljayBjb2RlIHdpbGwKKyAqIGxhdW5jaCBhIG5ldyBhY3Rpdml0eSB0byBkaXNwbGF5IHRoZSBkZXRhaWxzIGZyYWdtZW50OjwvcD4KKyAqCisgKiB7QHNhbXBsZSBkZXZlbG9wbWVudC9zYW1wbGVzL0FwaURlbW9zL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL2FwaXMvYXBwL0ZyYWdtZW50TGF5b3V0LmphdmEKKyAqICAgICAgZGV0YWlsc19hY3Rpdml0eX0KKyAqCisgKiA8cD5Ib3dldmVyIHRoZSBzY3JlZW4gbWF5IGJlIGxhcmdlIGVub3VnaCB0byBzaG93IGJvdGggdGhlIGxpc3Qgb2YgdGl0bGVzCisgKiBhbmQgZGV0YWlscyBhYm91dCB0aGUgY3VycmVudGx5IHNlbGVjdGVkIHRpdGxlLiAgVG8gdXNlIHN1Y2ggYSBsYXlvdXQgb24KKyAqIGEgbGFuZHNjYXBlIHNjcmVlbiwgdGhpcyBhbHRlcm5hdGl2ZSBsYXlvdXQgY2FuIGJlIHBsYWNlZCB1bmRlciBsYXlvdXQtbGFuZDo8L3A+CisgKgorICoge0BzYW1wbGUgZGV2ZWxvcG1lbnQvc2FtcGxlcy9BcGlEZW1vcy9yZXMvbGF5b3V0LWxhbmQvZnJhZ21lbnRfbGF5b3V0LnhtbCBsYXlvdXR9CisgKgorICogPHA+Tm90ZSBob3cgdGhlIHByaW9yIGNvZGUgd2lsbCBhZGp1c3QgdG8gdGhpcyBhbHRlcm5hdGl2ZSBVSSBmbG93OiB0aGUKKyAqIHRpdGxlcyBmcmFnbWVudCB3aWxsIG5vdyBzaG93IGl0cyB0ZXh0IGluc2lkZSBvZiBpdHMgYWN0aXZpdHksIGFuZCB0aGUKKyAqIGRldGFpbHMgYWN0aXZpdHkgd2lsbCBmaW5pc2ggb2YgaXQgZmluZHMgaXRzZWxmIHJ1bm5pbmcgaW4gYSBjb25maWd1cmF0aW9uCisgKiB3aGVyZSB0aGUgZGV0YWlscyBjYW4gYmUgc2hvd24gaW5saW5lLgorICoKKyAqIDxhIG5hbWU9IkJhY2tTdGFjayI+PC9hPgorICogPGgzPkJhY2sgU3RhY2s8L2gzPgorICoKKyAqIDxwPlRoZSB0cmFuc2FjdGlvbiBpbiB3aGljaCBmcmFnbWVudHMgYXJlIG1vZGlmaWVkIGNhbiBiZSBwbGFjZWQgb24gYW4KKyAqIGludGVybmFsIGJhY2stc3RhY2sgb2YgdGhlIG93bmluZyBhY3Rpdml0eS4gIFdoZW4gdGhlIHVzZXIgcHJlc3NlcyBiYWNrCisgKiBpbiB0aGUgYWN0aXZpdHksIGFueSB0cmFuc2FjdGlvbnMgb24gdGhlIGJhY2sgc3RhY2sgYXJlIHBvcHBlZCBvZmYgYmVmb3JlCisgKiB0aGUgYWN0aXZpdHkgaXRzZWxmIGlzIGZpbmlzaGVkLgorICoKKyAqIDxwPkZvciBleGFtcGxlLCBjb25zaWRlciB0aGlzIHNpbXBsZSBmcmFnbWVudCB0aGF0IGlzIGluc3RhbnRpYXRlZCB3aXRoCisgKiBhbiBpbnRlZ2VyIGFyZ3VtZW50IGFuZCBkaXNwbGF5cyB0aGF0IGluIGEgVGV4dFZpZXcgaW4gaXRzIFVJOjwvcD4KKyAqCisgKiB7QHNhbXBsZSBkZXZlbG9wbWVudC9zYW1wbGVzL0FwaURlbW9zL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL2FwaXMvYXBwL0ZyYWdtZW50U3RhY2suamF2YQorICogICAgICBmcmFnbWVudH0KKyAqCisgKiA8cD5BIGZ1bmN0aW9uIHRoYXQgY3JlYXRlcyBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgZnJhZ21lbnQsIHJlcGxhY2luZworICogd2hhdGV2ZXIgY3VycmVudCBmcmFnbWVudCBpbnN0YW5jZSBpcyBiZWluZyBzaG93biBhbmQgcHVzaGluZyB0aGF0IGNoYW5nZQorICogb24gdG8gdGhlIGJhY2sgc3RhY2sgY291bGQgYmUgd3JpdHRlbiBhczoKKyAqCisgKiB7QHNhbXBsZSBkZXZlbG9wbWVudC9zYW1wbGVzL0FwaURlbW9zL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL2FwaXMvYXBwL0ZyYWdtZW50U3RhY2suamF2YQorICogICAgICBhZGRfc3RhY2t9CisgKgorICogPHA+QWZ0ZXIgZWFjaCBjYWxsIHRvIHRoaXMgZnVuY3Rpb24sIGEgbmV3IGVudHJ5IGlzIG9uIHRoZSBzdGFjaywgYW5kCisgKiBwcmVzc2luZyBiYWNrIHdpbGwgcG9wIGl0IHRvIHJldHVybiB0aGUgdXNlciB0byB3aGF0ZXZlciBwcmV2aW91cyBzdGF0ZQorICogdGhlIGFjdGl2aXR5IFVJIHdhcyBpbi4KKyAqLworcHVibGljIGNsYXNzIEZyYWdtZW50IGltcGxlbWVudHMgQ29tcG9uZW50Q2FsbGJhY2tzLCBPbkNyZWF0ZUNvbnRleHRNZW51TGlzdGVuZXIgeworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEhhc2hNYXA8U3RyaW5nLCBDbGFzczw/Pj4gc0NsYXNzTWFwID0KKyAgICAgICAgICAgIG5ldyBIYXNoTWFwPFN0cmluZywgQ2xhc3M8Pz4+KCk7CisgICAgCisgICAgc3RhdGljIGZpbmFsIGludCBJTklUSUFMSVpJTkcgPSAwOyAgICAgLy8gTm90IHlldCBjcmVhdGVkLgorICAgIHN0YXRpYyBmaW5hbCBpbnQgQ1JFQVRFRCA9IDE7ICAgICAgICAgIC8vIENyZWF0ZWQuCisgICAgc3RhdGljIGZpbmFsIGludCBBQ1RJVklUWV9DUkVBVEVEID0gMjsgLy8gVGhlIGFjdGl2aXR5IGhhcyBmaW5pc2hlZCBpdHMgY3JlYXRpb24uCisgICAgc3RhdGljIGZpbmFsIGludCBTVEFSVEVEID0gMzsgICAgICAgICAgLy8gQ3JlYXRlZCBhbmQgc3RhcnRlZCwgbm90IHJlc3VtZWQuCisgICAgc3RhdGljIGZpbmFsIGludCBSRVNVTUVEID0gNDsgICAgICAgICAgLy8gQ3JlYXRlZCBzdGFydGVkIGFuZCByZXN1bWVkLgorICAgIAorICAgIGludCBtU3RhdGUgPSBJTklUSUFMSVpJTkc7CisgICAgCisgICAgLy8gV2hlbiBpbnN0YW50aWF0ZWQgZnJvbSBzYXZlZCBzdGF0ZSwgdGhpcyBpcyB0aGUgc2F2ZWQgc3RhdGUuCisgICAgQnVuZGxlIG1TYXZlZEZyYWdtZW50U3RhdGU7CisgICAgU3BhcnNlQXJyYXk8UGFyY2VsYWJsZT4gbVNhdmVkVmlld1N0YXRlOworICAgIAorICAgIC8vIEluZGV4IGludG8gYWN0aXZlIGZyYWdtZW50IGFycmF5LgorICAgIGludCBtSW5kZXggPSAtMTsKKyAgICAKKyAgICAvLyBJbnRlcm5hbCB1bmlxdWUgbmFtZSBmb3IgdGhpcyBmcmFnbWVudDsKKyAgICBTdHJpbmcgbVdobzsKKyAgICAKKyAgICAvLyBDb25zdHJ1Y3Rpb24gYXJndW1lbnRzOworICAgIEJ1bmRsZSBtQXJndW1lbnRzOworCisgICAgLy8gVGFyZ2V0IGZyYWdtZW50LgorICAgIEZyYWdtZW50IG1UYXJnZXQ7CisKKyAgICAvLyBUYXJnZXQgcmVxdWVzdCBjb2RlLgorICAgIGludCBtVGFyZ2V0UmVxdWVzdENvZGU7CisKKyAgICAvLyBUcnVlIGlmIHRoZSBmcmFnbWVudCBpcyBpbiB0aGUgbGlzdCBvZiBhZGRlZCBmcmFnbWVudHMuCisgICAgYm9vbGVhbiBtQWRkZWQ7CisgICAgCisgICAgLy8gVHJ1ZSBpZiB0aGUgZnJhZ21lbnQgaXMgaW4gdGhlIHJlc3VtZWQgc3RhdGUuCisgICAgYm9vbGVhbiBtUmVzdW1lZDsKKyAgICAKKyAgICAvLyBTZXQgdG8gdHJ1ZSBpZiB0aGlzIGZyYWdtZW50IHdhcyBpbnN0YW50aWF0ZWQgZnJvbSBhIGxheW91dCBmaWxlLgorICAgIGJvb2xlYW4gbUZyb21MYXlvdXQ7CisgICAgCisgICAgLy8gTnVtYmVyIG9mIGFjdGl2ZSBiYWNrIHN0YWNrIGVudHJpZXMgdGhpcyBmcmFnbWVudCBpcyBpbi4KKyAgICBpbnQgbUJhY2tTdGFja05lc3Rpbmc7CisgICAgCisgICAgLy8gVGhlIGZyYWdtZW50IG1hbmFnZXIgd2UgYXJlIGFzc29jaWF0ZWQgd2l0aC4gIFNldCBhcyBzb29uIGFzIHRoZQorICAgIC8vIGZyYWdtZW50IGlzIHVzZWQgaW4gYSB0cmFuc2FjdGlvbjsgY2xlYXJlZCBhZnRlciBpdCBoYXMgYmVlbiByZW1vdmVkCisgICAgLy8gZnJvbSBhbGwgdHJhbnNhY3Rpb25zLgorICAgIEZyYWdtZW50TWFuYWdlciBtRnJhZ21lbnRNYW5hZ2VyOworCisgICAgLy8gU2V0IGFzIHNvb24gYXMgYSBmcmFnbWVudCBpcyBhZGRlZCB0byBhIHRyYW5zYWN0aW9uIChvciByZW1vdmVkKSwKKyAgICAvLyB0byBiZSBhYmxlIHRvIGRvIHZhbGlkYXRpb24uCisgICAgQWN0aXZpdHkgbUltbWVkaWF0ZUFjdGl2aXR5OworICAgIAorICAgIC8vIEFjdGl2aXR5IHRoaXMgZnJhZ21lbnQgaXMgYXR0YWNoZWQgdG8uCisgICAgQWN0aXZpdHkgbUFjdGl2aXR5OworICAgIAorICAgIC8vIFRoZSBvcHRpb25hbCBpZGVudGlmaWVyIGZvciB0aGlzIGZyYWdtZW50IC0tIGVpdGhlciB0aGUgY29udGFpbmVyIElEIGlmIGl0CisgICAgLy8gd2FzIGR5bmFtaWNhbGx5IGFkZGVkIHRvIHRoZSB2aWV3IGhpZXJhcmNoeSwgb3IgdGhlIElEIHN1cHBsaWVkIGluCisgICAgLy8gbGF5b3V0LgorICAgIGludCBtRnJhZ21lbnRJZDsKKyAgICAKKyAgICAvLyBXaGVuIGEgZnJhZ21lbnQgaXMgYmVpbmcgZHluYW1pY2FsbHkgYWRkZWQgdG8gdGhlIHZpZXcgaGllcmFyY2h5LCB0aGlzCisgICAgLy8gaXMgdGhlIGlkZW50aWZpZXIgb2YgdGhlIHBhcmVudCBjb250YWluZXIgaXQgaXMgYmVpbmcgYWRkZWQgdG8uCisgICAgaW50IG1Db250YWluZXJJZDsKKyAgICAKKyAgICAvLyBUaGUgb3B0aW9uYWwgbmFtZWQgdGFnIGZvciB0aGlzIGZyYWdtZW50IC0tIHVzdWFsbHkgdXNlZCB0byBmaW5kCisgICAgLy8gZnJhZ21lbnRzIHRoYXQgYXJlIG5vdCBwYXJ0IG9mIHRoZSBsYXlvdXQuCisgICAgU3RyaW5nIG1UYWc7CisgICAgCisgICAgLy8gU2V0IHRvIHRydWUgd2hlbiB0aGUgYXBwIGhhcyByZXF1ZXN0ZWQgdGhhdCB0aGlzIGZyYWdtZW50IGJlIGhpZGRlbgorICAgIC8vIGZyb20gdGhlIHVzZXIuCisgICAgYm9vbGVhbiBtSGlkZGVuOworICAgIAorICAgIC8vIElmIHNldCB0aGlzIGZyYWdtZW50IHdvdWxkIGxpa2UgaXRzIGluc3RhbmNlIHJldGFpbmVkIGFjcm9zcworICAgIC8vIGNvbmZpZ3VyYXRpb24gY2hhbmdlcy4KKyAgICBib29sZWFuIG1SZXRhaW5JbnN0YW5jZTsKKyAgICAKKyAgICAvLyBJZiBzZXQgdGhpcyBmcmFnbWVudCBpcyBiZWluZyByZXRhaW5lZCBhY3Jvc3MgdGhlIGN1cnJlbnQgY29uZmlnIGNoYW5nZS4KKyAgICBib29sZWFuIG1SZXRhaW5pbmc7CisgICAgCisgICAgLy8gSWYgc2V0IHRoaXMgZnJhZ21lbnQgaGFzIG1lbnUgaXRlbXMgdG8gY29udHJpYnV0ZS4KKyAgICBib29sZWFuIG1IYXNNZW51OworICAgIAorICAgIC8vIFVzZWQgdG8gdmVyaWZ5IHRoYXQgc3ViY2xhc3NlcyBjYWxsIHRocm91Z2ggdG8gc3VwZXIgY2xhc3MuCisgICAgYm9vbGVhbiBtQ2FsbGVkOworICAgIAorICAgIC8vIElmIGFwcCBoYXMgcmVxdWVzdGVkIGEgc3BlY2lmaWMgYW5pbWF0aW9uLCB0aGlzIGlzIHRoZSBvbmUgdG8gdXNlLgorICAgIGludCBtTmV4dEFuaW07CisgICAgCisgICAgLy8gVGhlIHBhcmVudCBjb250YWluZXIgb2YgdGhlIGZyYWdtZW50IGFmdGVyIGR5bmFtaWNhbGx5IGFkZGVkIHRvIFVJLgorICAgIFZpZXdHcm91cCBtQ29udGFpbmVyOworICAgIAorICAgIC8vIFRoZSBWaWV3IGdlbmVyYXRlZCBmb3IgdGhpcyBmcmFnbWVudC4KKyAgICBWaWV3IG1WaWV3OworICAgIAorICAgIExvYWRlck1hbmFnZXJJbXBsIG1Mb2FkZXJNYW5hZ2VyOworICAgIGJvb2xlYW4gbVN0YXJ0ZWQ7CisgICAgYm9vbGVhbiBtQ2hlY2tlZEZvckxvYWRlck1hbmFnZXI7CisgICAgCisgICAgLyoqCisgICAgICogVGhyb3duIGJ5IHtAbGluayBGcmFnbWVudCNpbnN0YW50aWF0ZShDb250ZXh0LCBTdHJpbmcsIEJ1bmRsZSl9IHdoZW4KKyAgICAgKiB0aGVyZSBpcyBhbiBpbnN0YW50aWF0aW9uIGZhaWx1cmUuCisgICAgICovCisgICAgc3RhdGljIHB1YmxpYyBjbGFzcyBJbnN0YW50aWF0aW9uRXhjZXB0aW9uIGV4dGVuZHMgQW5kcm9pZFJ1bnRpbWVFeGNlcHRpb24geworICAgICAgICBwdWJsaWMgSW5zdGFudGlhdGlvbkV4Y2VwdGlvbihTdHJpbmcgbXNnLCBFeGNlcHRpb24gY2F1c2UpIHsKKyAgICAgICAgICAgIHN1cGVyKG1zZywgY2F1c2UpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogRGVmYXVsdCBjb25zdHJ1Y3Rvci4gIDxzdHJvbmc+RXZlcnk8L3N0cm9uZz4gZnJhZ21lbnQgbXVzdCBoYXZlIGFuCisgICAgICogZW1wdHkgY29uc3RydWN0b3IsIHNvIGl0IGNhbiBiZSBpbnN0YW50aWF0ZWQgd2hlbiByZXN0b3JpbmcgaXRzCisgICAgICogYWN0aXZpdHkncyBzdGF0ZS4gIEl0IGlzIHN0cm9uZ2x5IHJlY29tbWVuZGVkIHRoYXQgc3ViY2xhc3NlcyBkbyBub3QKKyAgICAgKiBoYXZlIG90aGVyIGNvbnN0cnVjdG9ycyB3aXRoIHBhcmFtZXRlcnMsIHNpbmNlIHRoZXNlIGNvbnN0cnVjdG9ycworICAgICAqIHdpbGwgbm90IGJlIGNhbGxlZCB3aGVuIHRoZSBmcmFnbWVudCBpcyByZS1pbnN0YW50aWF0ZWQ7IGluc3RlYWQsCisgICAgICogYXJndW1lbnRzIGNhbiBiZSBzdXBwbGllZCBieSB0aGUgY2FsbGVyIHdpdGgge0BsaW5rICNzZXRBcmd1bWVudHN9CisgICAgICogYW5kIGxhdGVyIHJldHJpZXZlZCBieSB0aGUgRnJhZ21lbnQgd2l0aCB7QGxpbmsgI2dldEFyZ3VtZW50c30uCisgICAgICogCisgICAgICogPHA+QXBwbGljYXRpb25zIHNob3VsZCBnZW5lcmFsbHkgbm90IGltcGxlbWVudCBhIGNvbnN0cnVjdG9yLiAgVGhlCisgICAgICogZmlyc3QgcGxhY2UgYXBwbGljYXRpb24gY29kZSBhbiBydW4gd2hlcmUgdGhlIGZyYWdtZW50IGlzIHJlYWR5IHRvCisgICAgICogYmUgdXNlZCBpcyBpbiB7QGxpbmsgI29uQXR0YWNoKEFjdGl2aXR5KX0sIHRoZSBwb2ludCB3aGVyZSB0aGUgZnJhZ21lbnQKKyAgICAgKiBpcyBhY3R1YWxseSBhc3NvY2lhdGVkIHdpdGggaXRzIGFjdGl2aXR5LiAgU29tZSBhcHBsaWNhdGlvbnMgbWF5IGFsc28KKyAgICAgKiB3YW50IHRvIGltcGxlbWVudCB7QGxpbmsgI29uSW5mbGF0ZX0gdG8gcmV0cmlldmUgYXR0cmlidXRlcyBmcm9tIGEKKyAgICAgKiBsYXlvdXQgcmVzb3VyY2UsIHRob3VnaCBzaG91bGQgdGFrZSBjYXJlIGhlcmUgYmVjYXVzZSB0aGlzIGhhcHBlbnMgZm9yCisgICAgICogdGhlIGZyYWdtZW50IGlzIGF0dGFjaGVkIHRvIGl0cyBhY3Rpdml0eS4KKyAgICAgKi8KKyAgICBwdWJsaWMgRnJhZ21lbnQoKSB7CisgICAgfQorCisgICAgLyoqCisgICAgICogTGlrZSB7QGxpbmsgI2luc3RhbnRpYXRlKENvbnRleHQsIFN0cmluZywgQnVuZGxlKX0gYnV0IHdpdGggYSBudWxsCisgICAgICogYXJndW1lbnQgQnVuZGxlLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgRnJhZ21lbnQgaW5zdGFudGlhdGUoQ29udGV4dCBjb250ZXh0LCBTdHJpbmcgZm5hbWUpIHsKKyAgICAgICAgcmV0dXJuIGluc3RhbnRpYXRlKGNvbnRleHQsIGZuYW1lLCBudWxsKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYSBuZXcgaW5zdGFuY2Ugb2YgYSBGcmFnbWVudCB3aXRoIHRoZSBnaXZlbiBjbGFzcyBuYW1lLiAgVGhpcyBpcworICAgICAqIHRoZSBzYW1lIGFzIGNhbGxpbmcgaXRzIGVtcHR5IGNvbnN0cnVjdG9yLgorICAgICAqCisgICAgICogQHBhcmFtIGNvbnRleHQgVGhlIGNhbGxpbmcgY29udGV4dCBiZWluZyB1c2VkIHRvIGluc3RhbnRpYXRlIHRoZSBmcmFnbWVudC4KKyAgICAgKiBUaGlzIGlzIGN1cnJlbnRseSBqdXN0IHVzZWQgdG8gZ2V0IGl0cyBDbGFzc0xvYWRlci4KKyAgICAgKiBAcGFyYW0gZm5hbWUgVGhlIGNsYXNzIG5hbWUgb2YgdGhlIGZyYWdtZW50IHRvIGluc3RhbnRpYXRlLgorICAgICAqIEBwYXJhbSBhcmdzIEJ1bmRsZSBvZiBhcmd1bWVudHMgdG8gc3VwcGx5IHRvIHRoZSBmcmFnbWVudCwgd2hpY2ggaXQKKyAgICAgKiBjYW4gcmV0cmlldmUgd2l0aCB7QGxpbmsgI2dldEFyZ3VtZW50cygpfS4gIE1heSBiZSBudWxsLgorICAgICAqIEByZXR1cm4gUmV0dXJucyBhIG5ldyBmcmFnbWVudCBpbnN0YW5jZS4KKyAgICAgKiBAdGhyb3dzIEluc3RhbnRpYXRpb25FeGNlcHRpb24gSWYgdGhlcmUgaXMgYSBmYWlsdXJlIGluIGluc3RhbnRpYXRpbmcKKyAgICAgKiB0aGUgZ2l2ZW4gZnJhZ21lbnQgY2xhc3MuICBUaGlzIGlzIGEgcnVudGltZSBleGNlcHRpb247IGl0IGlzIG5vdAorICAgICAqIG5vcm1hbGx5IGV4cGVjdGVkIHRvIGhhcHBlbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIEZyYWdtZW50IGluc3RhbnRpYXRlKENvbnRleHQgY29udGV4dCwgU3RyaW5nIGZuYW1lLCBCdW5kbGUgYXJncykgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgQ2xhc3M8Pz4gY2xhenogPSBzQ2xhc3NNYXAuZ2V0KGZuYW1lKTsKKyAgICAgICAgICAgIGlmIChjbGF6eiA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgLy8gQ2xhc3Mgbm90IGZvdW5kIGluIHRoZSBjYWNoZSwgc2VlIGlmIGl0J3MgcmVhbCwgYW5kIHRyeSB0byBhZGQgaXQKKyAgICAgICAgICAgICAgICBjbGF6eiA9IGNvbnRleHQuZ2V0Q2xhc3NMb2FkZXIoKS5sb2FkQ2xhc3MoZm5hbWUpOworICAgICAgICAgICAgICAgIHNDbGFzc01hcC5wdXQoZm5hbWUsIGNsYXp6KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEZyYWdtZW50IGYgPSAoRnJhZ21lbnQpY2xhenoubmV3SW5zdGFuY2UoKTsKKyAgICAgICAgICAgIGlmIChhcmdzICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBhcmdzLnNldENsYXNzTG9hZGVyKGYuZ2V0Q2xhc3MoKS5nZXRDbGFzc0xvYWRlcigpKTsKKyAgICAgICAgICAgICAgICBmLm1Bcmd1bWVudHMgPSBhcmdzOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGY7CisgICAgICAgIH0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEluc3RhbnRpYXRpb25FeGNlcHRpb24oIlVuYWJsZSB0byBpbnN0YW50aWF0ZSBmcmFnbWVudCAiICsgZm5hbWUKKyAgICAgICAgICAgICAgICAgICAgKyAiOiBtYWtlIHN1cmUgY2xhc3MgbmFtZSBleGlzdHMsIGlzIHB1YmxpYywgYW5kIGhhcyBhbiIKKyAgICAgICAgICAgICAgICAgICAgKyAiIGVtcHR5IGNvbnN0cnVjdG9yIHRoYXQgaXMgcHVibGljIiwgZSk7CisgICAgICAgIH0gY2F0Y2ggKGphdmEubGFuZy5JbnN0YW50aWF0aW9uRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbnN0YW50aWF0aW9uRXhjZXB0aW9uKCJVbmFibGUgdG8gaW5zdGFudGlhdGUgZnJhZ21lbnQgIiArIGZuYW1lCisgICAgICAgICAgICAgICAgICAgICsgIjogbWFrZSBzdXJlIGNsYXNzIG5hbWUgZXhpc3RzLCBpcyBwdWJsaWMsIGFuZCBoYXMgYW4iCisgICAgICAgICAgICAgICAgICAgICsgIiBlbXB0eSBjb25zdHJ1Y3RvciB0aGF0IGlzIHB1YmxpYyIsIGUpOworICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbnN0YW50aWF0aW9uRXhjZXB0aW9uKCJVbmFibGUgdG8gaW5zdGFudGlhdGUgZnJhZ21lbnQgIiArIGZuYW1lCisgICAgICAgICAgICAgICAgICAgICsgIjogbWFrZSBzdXJlIGNsYXNzIG5hbWUgZXhpc3RzLCBpcyBwdWJsaWMsIGFuZCBoYXMgYW4iCisgICAgICAgICAgICAgICAgICAgICsgIiBlbXB0eSBjb25zdHJ1Y3RvciB0aGF0IGlzIHB1YmxpYyIsIGUpOworICAgICAgICB9CisgICAgfQorICAgIAorICAgIHZvaWQgcmVzdG9yZVZpZXdTdGF0ZSgpIHsKKyAgICAgICAgaWYgKG1TYXZlZFZpZXdTdGF0ZSAhPSBudWxsKSB7CisgICAgICAgICAgICBtVmlldy5yZXN0b3JlSGllcmFyY2h5U3RhdGUobVNhdmVkVmlld1N0YXRlKTsKKyAgICAgICAgICAgIG1TYXZlZFZpZXdTdGF0ZSA9IG51bGw7CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgdm9pZCBzZXRJbmRleChpbnQgaW5kZXgpIHsKKyAgICAgICAgbUluZGV4ID0gaW5kZXg7CisgICAgICAgIG1XaG8gPSAiYW5kcm9pZDpmcmFnbWVudDoiICsgbUluZGV4OworICAgfQorICAgIAorICAgIHZvaWQgY2xlYXJJbmRleCgpIHsKKyAgICAgICAgbUluZGV4ID0gLTE7CisgICAgICAgIG1XaG8gPSBudWxsOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBTdWJjbGFzc2VzIGNhbiBub3Qgb3ZlcnJpZGUgZXF1YWxzKCkuCisgICAgICovCisgICAgQE92ZXJyaWRlIGZpbmFsIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgbykgeworICAgICAgICByZXR1cm4gc3VwZXIuZXF1YWxzKG8pOworICAgIH0KKworICAgIC8qKgorICAgICAqIFN1YmNsYXNzZXMgY2FuIG5vdCBvdmVycmlkZSBoYXNoQ29kZSgpLgorICAgICAqLworICAgIEBPdmVycmlkZSBmaW5hbCBwdWJsaWMgaW50IGhhc2hDb2RlKCkgeworICAgICAgICByZXR1cm4gc3VwZXIuaGFzaENvZGUoKTsKKyAgICB9CisgICAgCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKDEyOCk7CisgICAgICAgIHNiLmFwcGVuZCgiRnJhZ21lbnR7Iik7CisgICAgICAgIHNiLmFwcGVuZChJbnRlZ2VyLnRvSGV4U3RyaW5nKFN5c3RlbS5pZGVudGl0eUhhc2hDb2RlKHRoaXMpKSk7CisgICAgICAgIGlmIChtSW5kZXggPj0gMCkgeworICAgICAgICAgICAgc2IuYXBwZW5kKCIgIyIpOworICAgICAgICAgICAgc2IuYXBwZW5kKG1JbmRleCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1GcmFnbWVudElkICE9IDApIHsKKyAgICAgICAgICAgIHNiLmFwcGVuZCgiIGlkPTB4Iik7CisgICAgICAgICAgICBzYi5hcHBlbmQoSW50ZWdlci50b0hleFN0cmluZyhtRnJhZ21lbnRJZCkpOworICAgICAgICB9CisgICAgICAgIGlmIChtVGFnICE9IG51bGwpIHsKKyAgICAgICAgICAgIHNiLmFwcGVuZCgiICIpOworICAgICAgICAgICAgc2IuYXBwZW5kKG1UYWcpOworICAgICAgICB9CisgICAgICAgIHNiLmFwcGVuZCgnfScpOworICAgICAgICByZXR1cm4gc2IudG9TdHJpbmcoKTsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBpZGVudGlmaWVyIHRoaXMgZnJhZ21lbnQgaXMga25vd24gYnkuICBUaGlzIGlzIGVpdGhlcgorICAgICAqIHRoZSBhbmRyb2lkOmlkIHZhbHVlIHN1cHBsaWVkIGluIGEgbGF5b3V0IG9yIHRoZSBjb250YWluZXIgdmlldyBJRAorICAgICAqIHN1cHBsaWVkIHdoZW4gYWRkaW5nIHRoZSBmcmFnbWVudC4KKyAgICAgKi8KKyAgICBmaW5hbCBwdWJsaWMgaW50IGdldElkKCkgeworICAgICAgICByZXR1cm4gbUZyYWdtZW50SWQ7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIEdldCB0aGUgdGFnIG5hbWUgb2YgdGhlIGZyYWdtZW50LCBpZiBzcGVjaWZpZWQuCisgICAgICovCisgICAgZmluYWwgcHVibGljIFN0cmluZyBnZXRUYWcoKSB7CisgICAgICAgIHJldHVybiBtVGFnOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBTdXBwbHkgdGhlIGNvbnN0cnVjdGlvbiBhcmd1bWVudHMgZm9yIHRoaXMgZnJhZ21lbnQuICBUaGlzIGNhbiBvbmx5CisgICAgICogYmUgY2FsbGVkIGJlZm9yZSB0aGUgZnJhZ21lbnQgaGFzIGJlZW4gYXR0YWNoZWQgdG8gaXRzIGFjdGl2aXR5OyB0aGF0CisgICAgICogaXMsIHlvdSBzaG91bGQgY2FsbCBpdCBpbW1lZGlhdGVseSBhZnRlciBjb25zdHJ1Y3RpbmcgdGhlIGZyYWdtZW50LiAgVGhlCisgICAgICogYXJndW1lbnRzIHN1cHBsaWVkIGhlcmUgd2lsbCBiZSByZXRhaW5lZCBhY3Jvc3MgZnJhZ21lbnQgZGVzdHJveSBhbmQKKyAgICAgKiBjcmVhdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRBcmd1bWVudHMoQnVuZGxlIGFyZ3MpIHsKKyAgICAgICAgaWYgKG1JbmRleCA+PSAwKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJGcmFnbWVudCBhbHJlYWR5IGFjdGl2ZSIpOworICAgICAgICB9CisgICAgICAgIG1Bcmd1bWVudHMgPSBhcmdzOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgYXJndW1lbnRzIHN1cHBsaWVkIHdoZW4gdGhlIGZyYWdtZW50IHdhcyBpbnN0YW50aWF0ZWQsCisgICAgICogaWYgYW55LgorICAgICAqLworICAgIGZpbmFsIHB1YmxpYyBCdW5kbGUgZ2V0QXJndW1lbnRzKCkgeworICAgICAgICByZXR1cm4gbUFyZ3VtZW50czsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBPcHRpb25hbCB0YXJnZXQgZm9yIHRoaXMgZnJhZ21lbnQuICBUaGlzIG1heSBiZSB1c2VkLCBmb3IgZXhhbXBsZSwKKyAgICAgKiBpZiB0aGlzIGZyYWdtZW50IGlzIGJlaW5nIHN0YXJ0ZWQgYnkgYW5vdGhlciwgYW5kIHdoZW4gZG9uZSB3YW50cyB0bworICAgICAqIGdpdmUgYSByZXN1bHQgYmFjayB0byB0aGUgZmlyc3QuICBUaGUgdGFyZ2V0IHNldCBoZXJlIGlzIHJldGFpbmVkCisgICAgICogYWNyb3NzIGluc3RhbmNlcyB2aWEge0BsaW5rIEZyYWdtZW50TWFuYWdlciNwdXRGcmFnbWVudAorICAgICAqIEZyYWdtZW50TWFuYWdlci5wdXRGcmFnbWVudCgpfS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBmcmFnbWVudCBUaGUgZnJhZ21lbnQgdGhhdCBpcyB0aGUgdGFyZ2V0IG9mIHRoaXMgb25lLgorICAgICAqIEBwYXJhbSByZXF1ZXN0Q29kZSBPcHRpb25hbCByZXF1ZXN0IGNvZGUsIGZvciBjb252ZW5pZW5jZSBpZiB5b3UKKyAgICAgKiBhcmUgZ29pbmcgdG8gY2FsbCBiYWNrIHdpdGgge0BsaW5rICNvbkFjdGl2aXR5UmVzdWx0KGludCwgaW50LCBJbnRlbnQpfS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRUYXJnZXRGcmFnbWVudChGcmFnbWVudCBmcmFnbWVudCwgaW50IHJlcXVlc3RDb2RlKSB7CisgICAgICAgIG1UYXJnZXQgPSBmcmFnbWVudDsKKyAgICAgICAgbVRhcmdldFJlcXVlc3RDb2RlID0gcmVxdWVzdENvZGU7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSB0YXJnZXQgZnJhZ21lbnQgc2V0IGJ5IHtAbGluayAjc2V0VGFyZ2V0RnJhZ21lbnR9LgorICAgICAqLworICAgIGZpbmFsIHB1YmxpYyBGcmFnbWVudCBnZXRUYXJnZXRGcmFnbWVudCgpIHsKKyAgICAgICAgcmV0dXJuIG1UYXJnZXQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSB0YXJnZXQgcmVxdWVzdCBjb2RlIHNldCBieSB7QGxpbmsgI3NldFRhcmdldEZyYWdtZW50fS4KKyAgICAgKi8KKyAgICBmaW5hbCBwdWJsaWMgaW50IGdldFRhcmdldFJlcXVlc3RDb2RlKCkgeworICAgICAgICByZXR1cm4gbVRhcmdldFJlcXVlc3RDb2RlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgQWN0aXZpdHkgdGhpcyBmcmFnbWVudCBpcyBjdXJyZW50bHkgYXNzb2NpYXRlZCB3aXRoLgorICAgICAqLworICAgIGZpbmFsIHB1YmxpYyBBY3Rpdml0eSBnZXRBY3Rpdml0eSgpIHsKKyAgICAgICAgcmV0dXJuIG1BY3Rpdml0eTsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBGcmFnbWVudE1hbmFnZXIgZm9yIGludGVyYWN0aW5nIHdpdGggZnJhZ21lbnRzIGFzc29jaWF0ZWQKKyAgICAgKiB3aXRoIHRoaXMgZnJhZ21lbnQncyBhY3Rpdml0eS4gIE5vdGUgdGhhdCB0aGlzIHdpbGwgYmUgbm9uLW51bGwgc2xpZ2h0bHkKKyAgICAgKiBiZWZvcmUge0BsaW5rICNnZXRBY3Rpdml0eSgpfSwgaW4gdGhlIHRpbWUgZnJvbSB3aGVuIHRoZSBmcmFnbWVudCBpcworICAgICAqIHBsYWNlZCBpbiBhIHtAbGluayBGcmFnbWVudFRyYW5zYWN0aW9ufSB1bnRpbCBpdCBpcyBjb21taXR0ZWQgYW5kCisgICAgICogYXR0YWNoZWQgdG8gaXRzIGFjdGl2aXR5LgorICAgICAqLworICAgIGZpbmFsIHB1YmxpYyBGcmFnbWVudE1hbmFnZXIgZ2V0RnJhZ21lbnRNYW5hZ2VyKCkgeworICAgICAgICByZXR1cm4gbUZyYWdtZW50TWFuYWdlcjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdHJ1ZSBpZiB0aGUgZnJhZ21lbnQgaXMgY3VycmVudGx5IGFkZGVkIHRvIGl0cyBhY3Rpdml0eS4KKyAgICAgKi8KKyAgICBmaW5hbCBwdWJsaWMgYm9vbGVhbiBpc0FkZGVkKCkgeworICAgICAgICByZXR1cm4gbUFjdGl2aXR5ICE9IG51bGwgJiYgbUFjdGl2aXR5Lm1GcmFnbWVudHMubUFkZGVkLmNvbnRhaW5zKHRoaXMpOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdHJ1ZSBpZiB0aGUgZnJhZ21lbnQgaXMgaW4gdGhlIHJlc3VtZWQgc3RhdGUuICBUaGlzIGlzIHRydWUKKyAgICAgKiBmb3IgdGhlIGR1cmF0aW9uIG9mIHtAbGluayAjb25SZXN1bWUoKX0gYW5kIHtAbGluayAjb25QYXVzZSgpfSBhcyB3ZWxsLgorICAgICAqLworICAgIGZpbmFsIHB1YmxpYyBib29sZWFuIGlzUmVzdW1lZCgpIHsKKyAgICAgICAgcmV0dXJuIG1SZXN1bWVkOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdHJ1ZSBpZiB0aGUgZnJhZ21lbnQgaXMgY3VycmVudGx5IHZpc2libGUgdG8gdGhlIHVzZXIuICBUaGlzIG1lYW5zCisgICAgICogaXQ6ICgxKSBoYXMgYmVlbiBhZGRlZCwgKDIpIGhhcyBpdHMgdmlldyBhdHRhY2hlZCB0byB0aGUgd2luZG93LCBhbmQgCisgICAgICogKDMpIGlzIG5vdCBoaWRkZW4uCisgICAgICovCisgICAgZmluYWwgcHVibGljIGJvb2xlYW4gaXNWaXNpYmxlKCkgeworICAgICAgICByZXR1cm4gaXNBZGRlZCgpICYmICFpc0hpZGRlbigpICYmIG1WaWV3ICE9IG51bGwKKyAgICAgICAgICAgICAgICAmJiBtVmlldy5nZXRXaW5kb3dUb2tlbigpICE9IG51bGwgJiYgbVZpZXcuZ2V0VmlzaWJpbGl0eSgpID09IFZpZXcuVklTSUJMRTsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogUmV0dXJuIHRydWUgaWYgdGhlIGZyYWdtZW50IGhhcyBiZWVuIGhpZGRlbi4gIEJ5IGRlZmF1bHQgZnJhZ21lbnRzCisgICAgICogYXJlIHNob3duLiAgWW91IGNhbiBmaW5kIG91dCBhYm91dCBjaGFuZ2VzIHRvIHRoaXMgc3RhdGUgd2l0aAorICAgICAqIHtAbGluayAjb25IaWRkZW5DaGFuZ2VkfS4gIE5vdGUgdGhhdCB0aGUgaGlkZGVuIHN0YXRlIGlzIG9ydGhvZ29uYWwKKyAgICAgKiB0byBvdGhlciBzdGF0ZXMgLS0gdGhhdCBpcywgdG8gYmUgdmlzaWJsZSB0byB0aGUgdXNlciwgYSBmcmFnbWVudAorICAgICAqIG11c3QgYmUgYm90aCBzdGFydGVkIGFuZCBub3QgaGlkZGVuLgorICAgICAqLworICAgIGZpbmFsIHB1YmxpYyBib29sZWFuIGlzSGlkZGVuKCkgeworICAgICAgICByZXR1cm4gbUhpZGRlbjsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogQ2FsbGVkIHdoZW4gdGhlIGhpZGRlbiBzdGF0ZSAoYXMgcmV0dXJuZWQgYnkge0BsaW5rICNpc0hpZGRlbigpfSBvZgorICAgICAqIHRoZSBmcmFnbWVudCBoYXMgY2hhbmdlZC4gIEZyYWdtZW50cyBzdGFydCBvdXQgbm90IGhpZGRlbjsgdGhpcyB3aWxsCisgICAgICogYmUgY2FsbGVkIHdoZW5ldmVyIHRoZSBmcmFnbWVudCBjaGFuZ2VzIHN0YXRlIGZyb20gdGhhdC4KKyAgICAgKiBAcGFyYW0gaGlkZGVuIFRydWUgaWYgdGhlIGZyYWdtZW50IGlzIG5vdyBoaWRkZW4sIGZhbHNlIGlmIGl0IGlzIG5vdAorICAgICAqIHZpc2libGUuCisgICAgICovCisgICAgcHVibGljIHZvaWQgb25IaWRkZW5DaGFuZ2VkKGJvb2xlYW4gaGlkZGVuKSB7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIENvbnRyb2wgd2hldGhlciBhIGZyYWdtZW50IGluc3RhbmNlIGlzIHJldGFpbmVkIGFjcm9zcyBBY3Rpdml0eQorICAgICAqIHJlLWNyZWF0aW9uIChzdWNoIGFzIGZyb20gYSBjb25maWd1cmF0aW9uIGNoYW5nZSkuICBUaGlzIGNhbiBvbmx5CisgICAgICogYmUgdXNlZCB3aXRoIGZyYWdtZW50cyBub3QgaW4gdGhlIGJhY2sgc3RhY2suICBJZiBzZXQsIHRoZSBmcmFnbWVudAorICAgICAqIGxpZmVjeWNsZSB3aWxsIGJlIHNsaWdodGx5IGRpZmZlcmVudCB3aGVuIGFuIGFjdGl2aXR5IGlzIHJlY3JlYXRlZDoKKyAgICAgKiA8dWw+CisgICAgICogPGxpPiB7QGxpbmsgI29uRGVzdHJveSgpfSB3aWxsIG5vdCBiZSBjYWxsZWQgKGJ1dCB7QGxpbmsgI29uRGV0YWNoKCl9IHN0aWxsCisgICAgICogd2lsbCBiZSwgYmVjYXVzZSB0aGUgZnJhZ21lbnQgaXMgYmVpbmcgZGV0YWNoZWQgZnJvbSBpdHMgY3VycmVudCBhY3Rpdml0eSkuCisgICAgICogPGxpPiB7QGxpbmsgI29uQ3JlYXRlKEJ1bmRsZSl9IHdpbGwgbm90IGJlIGNhbGxlZCBzaW5jZSB0aGUgZnJhZ21lbnQKKyAgICAgKiBpcyBub3QgYmVpbmcgcmUtY3JlYXRlZC4KKyAgICAgKiA8bGk+IHtAbGluayAjb25BdHRhY2goQWN0aXZpdHkpfSBhbmQge0BsaW5rICNvbkFjdGl2aXR5Q3JlYXRlZChCdW5kbGUpfSA8Yj53aWxsPC9iPgorICAgICAqIHN0aWxsIGJlIGNhbGxlZC4KKyAgICAgKiA8L3VsPgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFJldGFpbkluc3RhbmNlKGJvb2xlYW4gcmV0YWluKSB7CisgICAgICAgIG1SZXRhaW5JbnN0YW5jZSA9IHJldGFpbjsKKyAgICB9CisgICAgCisgICAgZmluYWwgcHVibGljIGJvb2xlYW4gZ2V0UmV0YWluSW5zdGFuY2UoKSB7CisgICAgICAgIHJldHVybiBtUmV0YWluSW5zdGFuY2U7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFJlcG9ydCB0aGF0IHRoaXMgZnJhZ21lbnQgd291bGQgbGlrZSB0byBwYXJ0aWNpcGF0ZSBpbiBwb3B1bGF0aW5nCisgICAgICogdGhlIG9wdGlvbnMgbWVudSBieSByZWNlaXZpbmcgYSBjYWxsIHRvIHtAbGluayAjb25DcmVhdGVPcHRpb25zTWVudX0KKyAgICAgKiBhbmQgcmVsYXRlZCBtZXRob2RzLgorICAgICAqIAorICAgICAqIEBwYXJhbSBoYXNNZW51IElmIHRydWUsIHRoZSBmcmFnbWVudCBoYXMgbWVudSBpdGVtcyB0byBjb250cmlidXRlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEhhc09wdGlvbnNNZW51KGJvb2xlYW4gaGFzTWVudSkgeworICAgICAgICBpZiAobUhhc01lbnUgIT0gaGFzTWVudSkgeworICAgICAgICAgICAgbUhhc01lbnUgPSBoYXNNZW51OworICAgICAgICAgICAgaWYgKGlzQWRkZWQoKSAmJiAhaXNIaWRkZW4oKSkgeworICAgICAgICAgICAgICAgIG1BY3Rpdml0eS5pbnZhbGlkYXRlT3B0aW9uc01lbnUoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIExvYWRlck1hbmFnZXIgZm9yIHRoaXMgZnJhZ21lbnQsIGNyZWF0aW5nIGl0IGlmIG5lZWRlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgTG9hZGVyTWFuYWdlciBnZXRMb2FkZXJNYW5hZ2VyKCkgeworICAgICAgICBpZiAobUxvYWRlck1hbmFnZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIG1Mb2FkZXJNYW5hZ2VyOworICAgICAgICB9CisgICAgICAgIG1DaGVja2VkRm9yTG9hZGVyTWFuYWdlciA9IHRydWU7CisgICAgICAgIG1Mb2FkZXJNYW5hZ2VyID0gbUFjdGl2aXR5LmdldExvYWRlck1hbmFnZXIobUluZGV4LCBtU3RhcnRlZCwgdHJ1ZSk7CisgICAgICAgIHJldHVybiBtTG9hZGVyTWFuYWdlcjsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogQ2FsbCB7QGxpbmsgQWN0aXZpdHkjc3RhcnRBY3Rpdml0eShJbnRlbnQpfSBvbiB0aGUgZnJhZ21lbnQncworICAgICAqIGNvbnRhaW5pbmcgQWN0aXZpdHkuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc3RhcnRBY3Rpdml0eShJbnRlbnQgaW50ZW50KSB7CisgICAgICAgIG1BY3Rpdml0eS5zdGFydEFjdGl2aXR5RnJvbUZyYWdtZW50KHRoaXMsIGludGVudCwgLTEpOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBDYWxsIHtAbGluayBBY3Rpdml0eSNzdGFydEFjdGl2aXR5Rm9yUmVzdWx0KEludGVudCwgaW50KX0gb24gdGhlIGZyYWdtZW50J3MKKyAgICAgKiBjb250YWluaW5nIEFjdGl2aXR5LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHN0YXJ0QWN0aXZpdHlGb3JSZXN1bHQoSW50ZW50IGludGVudCwgaW50IHJlcXVlc3RDb2RlKSB7CisgICAgICAgIG1BY3Rpdml0eS5zdGFydEFjdGl2aXR5RnJvbUZyYWdtZW50KHRoaXMsIGludGVudCwgcmVxdWVzdENvZGUpOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBSZWNlaXZlIHRoZSByZXN1bHQgZnJvbSBhIHByZXZpb3VzIGNhbGwgdG8KKyAgICAgKiB7QGxpbmsgI3N0YXJ0QWN0aXZpdHlGb3JSZXN1bHQoSW50ZW50LCBpbnQpfS4gIFRoaXMgZm9sbG93cyB0aGUKKyAgICAgKiByZWxhdGVkIEFjdGl2aXR5IEFQSSBhcyBkZXNjcmliZWQgdGhlcmUgaW4KKyAgICAgKiB7QGxpbmsgQWN0aXZpdHkjb25BY3Rpdml0eVJlc3VsdChpbnQsIGludCwgSW50ZW50KX0uCisgICAgICogCisgICAgICogQHBhcmFtIHJlcXVlc3RDb2RlIFRoZSBpbnRlZ2VyIHJlcXVlc3QgY29kZSBvcmlnaW5hbGx5IHN1cHBsaWVkIHRvCisgICAgICogICAgICAgICAgICAgICAgICAgIHN0YXJ0QWN0aXZpdHlGb3JSZXN1bHQoKSwgYWxsb3dpbmcgeW91IHRvIGlkZW50aWZ5IHdobyB0aGlzCisgICAgICogICAgICAgICAgICAgICAgICAgIHJlc3VsdCBjYW1lIGZyb20uCisgICAgICogQHBhcmFtIHJlc3VsdENvZGUgVGhlIGludGVnZXIgcmVzdWx0IGNvZGUgcmV0dXJuZWQgYnkgdGhlIGNoaWxkIGFjdGl2aXR5CisgICAgICogICAgICAgICAgICAgICAgICAgdGhyb3VnaCBpdHMgc2V0UmVzdWx0KCkuCisgICAgICogQHBhcmFtIGRhdGEgQW4gSW50ZW50LCB3aGljaCBjYW4gcmV0dXJuIHJlc3VsdCBkYXRhIHRvIHRoZSBjYWxsZXIKKyAgICAgKiAgICAgICAgICAgICAgICh2YXJpb3VzIGRhdGEgY2FuIGJlIGF0dGFjaGVkIHRvIEludGVudCAiZXh0cmFzIikuCisgICAgICovCisgICAgcHVibGljIHZvaWQgb25BY3Rpdml0eVJlc3VsdChpbnQgcmVxdWVzdENvZGUsIGludCByZXN1bHRDb2RlLCBJbnRlbnQgZGF0YSkgeworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBDYWxsZWQgd2hlbiBhIGZyYWdtZW50IGlzIGJlaW5nIGNyZWF0ZWQgYXMgcGFydCBvZiBhIHZpZXcgbGF5b3V0CisgICAgICogaW5mbGF0aW9uLCB0eXBpY2FsbHkgZnJvbSBzZXR0aW5nIHRoZSBjb250ZW50IHZpZXcgb2YgYW4gYWN0aXZpdHkuICBUaGlzCisgICAgICogd2lsbCBiZSBjYWxsZWQgaW1tZWRpYXRlbHkgYWZ0ZXIgdGhlIGZyYWdtZW50IGlzIGNyZWF0ZWQgZnJvbSBhIDxmcmFnbWVudD4KKyAgICAgKiB0YWcgaW4gYSBsYXlvdXQgZmlsZS4gIE5vdGUgdGhpcyBpcyA8ZW0+YmVmb3JlPC9lbT4gdGhlIGZyYWdtZW50J3MKKyAgICAgKiB7QGxpbmsgI29uQXR0YWNoKEFjdGl2aXR5KX0gaGFzIGJlZW4gY2FsbGVkOyBhbGwgeW91IHNob3VsZCBkbyBoZXJlIGlzCisgICAgICogcGFyc2UgdGhlIGF0dHJpYnV0ZXMgYW5kIHNhdmUgdGhlbSBhd2F5LiAgQSBjb252ZW5pZW50IHRoaW5nIHRvIGRvIGlzCisgICAgICogc2ltcGx5IGNvcHkgdGhlbSBpbnRvIGEgQnVuZGxlIHRoYXQgaXMgZ2l2ZW4gdG8ge0BsaW5rICNzZXRBcmd1bWVudHMoQnVuZGxlKX0uCisgICAgICogCisgICAgICogPHA+VGhpcyBpcyBjYWxsZWQgZXZlcnkgdGltZSB0aGUgZnJhZ21lbnQgaXMgaW5mbGF0ZWQsIGV2ZW4gaWYgaXQgaXMKKyAgICAgKiBiZWluZyBpbmZsYXRlZCBpbnRvIGEgbmV3IGluc3RhbmNlIHdpdGggc2F2ZWQgc3RhdGUuICBCZWNhdXNlIGEgZnJhZ21lbnQncworICAgICAqIGFyZ3VtZW50cyBhcmUgcmV0YWluZWQgYWNyb3NzIGluc3RhbmNlcywgaXQgbWF5IG1ha2Ugbm8gc2Vuc2UgdG8gcmUtcGFyc2UKKyAgICAgKiB0aGUgYXR0cmlidXRlcyBpbnRvIG5ldyBhcmd1bWVudHMuICBZb3UgbWF5IHdhbnQgdG8gZmlyc3QgY2hlY2sKKyAgICAgKiB7QGxpbmsgI2dldEFyZ3VtZW50cygpfSBhbmQgb25seSBwYXJzZSB0aGUgYXR0cmlidXRlcyBpZiBpdCByZXR1cm5zIG51bGwsCisgICAgICogdGhlIGFzc3VtcHRpb24gYmVpbmcgdGhhdCBpZiBpdCBpcyBub24tbnVsbCB0aG9zZSBhcmUgdGhlIHNhbWUgYXJndW1lbnRzCisgICAgICogZnJvbSB0aGUgZmlyc3QgdGltZSB0aGUgZnJhZ21lbnQgd2FzIGluZmxhdGVkLiAgKFRoYXQgc2FpZCwgeW91IG1heSB3YW50CisgICAgICogdG8gaGF2ZSBsYXlvdXRzIGNoYW5nZSBmb3IgZGlmZmVyZW50IGNvbmZpZ3VyYXRpb25zIHN1Y2ggYXMgbGFuZHNjYXBlCisgICAgICogYW5kIHBvcnRyYWl0LCB3aGljaCBjYW4gaGF2ZSBkaWZmZXJlbnQgYXR0cmlidXRlcy4gIElmIHNvLCB5b3Ugd2lsbCBuZWVkCisgICAgICogdG8gcmUtcGFyc2UgdGhlIGF0dHJpYnV0ZXMgZWFjaCB0aW1lIHRoaXMgaXMgY2FsbGVkIHRvIGdlbmVyYXRlIG5ldworICAgICAqIGFyZ3VtZW50cy4pPC9wPgorICAgICAqIAorICAgICAqIEBwYXJhbSBhdHRycyBUaGUgYXR0cmlidXRlcyBhdCB0aGUgdGFnIHdoZXJlIHRoZSBmcmFnbWVudCBpcworICAgICAqIGJlaW5nIGNyZWF0ZWQuCisgICAgICogQHBhcmFtIHNhdmVkSW5zdGFuY2VTdGF0ZSBJZiB0aGUgZnJhZ21lbnQgaXMgYmVpbmcgcmUtY3JlYXRlZCBmcm9tCisgICAgICogYSBwcmV2aW91cyBzYXZlZCBzdGF0ZSwgdGhpcyBpcyB0aGUgc3RhdGUuCisgICAgICovCisgICAgcHVibGljIHZvaWQgb25JbmZsYXRlKEF0dHJpYnV0ZVNldCBhdHRycywgQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgeworICAgICAgICBtQ2FsbGVkID0gdHJ1ZTsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogQ2FsbGVkIHdoZW4gYSBmcmFnbWVudCBpcyBmaXJzdCBhdHRhY2hlZCB0byBpdHMgYWN0aXZpdHkuCisgICAgICoge0BsaW5rICNvbkNyZWF0ZShCdW5kbGUpfSB3aWxsIGJlIGNhbGxlZCBhZnRlciB0aGlzLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIG9uQXR0YWNoKEFjdGl2aXR5IGFjdGl2aXR5KSB7CisgICAgICAgIG1DYWxsZWQgPSB0cnVlOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBDYWxsZWQgd2hlbiBhIGZyYWdtZW50IGxvYWRzIGFuIGFuaW1hdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgQW5pbWF0b3Igb25DcmVhdGVBbmltYXRvcihpbnQgdHJhbnNpdCwgYm9vbGVhbiBlbnRlciwgaW50IG5leHRBbmltKSB7CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBDYWxsZWQgdG8gZG8gaW5pdGlhbCBjcmVhdGlvbiBvZiBhIGZyYWdtZW50LiAgVGhpcyBpcyBjYWxsZWQgYWZ0ZXIKKyAgICAgKiB7QGxpbmsgI29uQXR0YWNoKEFjdGl2aXR5KX0gYW5kIGJlZm9yZQorICAgICAqIHtAbGluayAjb25DcmVhdGVWaWV3KExheW91dEluZmxhdGVyLCBWaWV3R3JvdXAsIEJ1bmRsZSl9LgorICAgICAqIAorICAgICAqIDxwPk5vdGUgdGhhdCB0aGlzIGNhbiBiZSBjYWxsZWQgd2hpbGUgdGhlIGZyYWdtZW50J3MgYWN0aXZpdHkgaXMKKyAgICAgKiBzdGlsbCBpbiB0aGUgcHJvY2VzcyBvZiBiZWluZyBjcmVhdGVkLiAgQXMgc3VjaCwgeW91IGNhbiBub3QgcmVseQorICAgICAqIG9uIHRoaW5ncyBsaWtlIHRoZSBhY3Rpdml0eSdzIGNvbnRlbnQgdmlldyBoaWVyYXJjaHkgYmVpbmcgaW5pdGlhbGl6ZWQKKyAgICAgKiBhdCB0aGlzIHBvaW50LiAgSWYgeW91IHdhbnQgdG8gZG8gd29yayBvbmNlIHRoZSBhY3Rpdml0eSBpdHNlbGYgaXMKKyAgICAgKiBjcmVhdGVkLCBzZWUge0BsaW5rICNvbkFjdGl2aXR5Q3JlYXRlZChCdW5kbGUpfS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gc2F2ZWRJbnN0YW5jZVN0YXRlIElmIHRoZSBmcmFnbWVudCBpcyBiZWluZyByZS1jcmVhdGVkIGZyb20KKyAgICAgKiBhIHByZXZpb3VzIHNhdmVkIHN0YXRlLCB0aGlzIGlzIHRoZSBzdGF0ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBvbkNyZWF0ZShCdW5kbGUgc2F2ZWRJbnN0YW5jZVN0YXRlKSB7CisgICAgICAgIG1DYWxsZWQgPSB0cnVlOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBDYWxsZWQgdG8gaGF2ZSB0aGUgZnJhZ21lbnQgaW5zdGFudGlhdGUgaXRzIHVzZXIgaW50ZXJmYWNlIHZpZXcuCisgICAgICogVGhpcyBpcyBvcHRpb25hbCwgYW5kIG5vbi1ncmFwaGljYWwgZnJhZ21lbnRzIGNhbiByZXR1cm4gbnVsbCAod2hpY2gKKyAgICAgKiBpcyB0aGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbikuICBUaGlzIHdpbGwgYmUgY2FsbGVkIGJldHdlZW4KKyAgICAgKiB7QGxpbmsgI29uQ3JlYXRlKEJ1bmRsZSl9IGFuZCB7QGxpbmsgI29uQWN0aXZpdHlDcmVhdGVkKEJ1bmRsZSl9LgorICAgICAqIAorICAgICAqIDxwPklmIHlvdSByZXR1cm4gYSBWaWV3IGZyb20gaGVyZSwgeW91IHdpbGwgbGF0ZXIgYmUgY2FsbGVkIGluCisgICAgICoge0BsaW5rICNvbkRlc3Ryb3lWaWV3fSB3aGVuIHRoZSB2aWV3IGlzIGJlaW5nIHJlbGVhc2VkLgorICAgICAqIAorICAgICAqIEBwYXJhbSBpbmZsYXRlciBUaGUgTGF5b3V0SW5mbGF0ZXIgb2JqZWN0IHRoYXQgY2FuIGJlIHVzZWQgdG8gaW5mbGF0ZQorICAgICAqIGFueSB2aWV3cyBpbiB0aGUgZnJhZ21lbnQsCisgICAgICogQHBhcmFtIGNvbnRhaW5lciBJZiBub24tbnVsbCwgdGhpcyBpcyB0aGUgcGFyZW50IHZpZXcgdGhhdCB0aGUgZnJhZ21lbnQncworICAgICAqIFVJIHNob3VsZCBiZSBhdHRhY2hlZCB0by4gIFRoZSBmcmFnbWVudCBzaG91bGQgbm90IGFkZCB0aGUgdmlldyBpdHNlbGYsCisgICAgICogYnV0IHRoaXMgY2FuIGJlIHVzZWQgdG8gZ2VuZXJhdGUgdGhlIExheW91dFBhcmFtcyBvZiB0aGUgdmlldy4KKyAgICAgKiBAcGFyYW0gc2F2ZWRJbnN0YW5jZVN0YXRlIElmIG5vbi1udWxsLCB0aGlzIGZyYWdtZW50IGlzIGJlaW5nIHJlLWNvbnN0cnVjdGVkCisgICAgICogZnJvbSBhIHByZXZpb3VzIHNhdmVkIHN0YXRlIGFzIGdpdmVuIGhlcmUuCisgICAgICogCisgICAgICogQHJldHVybiBSZXR1cm4gdGhlIFZpZXcgZm9yIHRoZSBmcmFnbWVudCdzIFVJLCBvciBudWxsLgorICAgICAqLworICAgIHB1YmxpYyBWaWV3IG9uQ3JlYXRlVmlldyhMYXlvdXRJbmZsYXRlciBpbmZsYXRlciwgVmlld0dyb3VwIGNvbnRhaW5lciwKKyAgICAgICAgICAgIEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpIHsKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBWaWV3IGdldFZpZXcoKSB7CisgICAgICAgIHJldHVybiBtVmlldzsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogQ2FsbGVkIHdoZW4gdGhlIGZyYWdtZW50J3MgYWN0aXZpdHkgaGFzIGJlZW4gY3JlYXRlZCBhbmQgdGhpcworICAgICAqIGZyYWdtZW50J3MgdmlldyBoaWVyYXJjaHkgaW5zdGFudGlhdGVkLiAgSXQgY2FuIGJlIHVzZWQgdG8gZG8gZmluYWwKKyAgICAgKiBpbml0aWFsaXphdGlvbiBvbmNlIHRoZXNlIHBpZWNlcyBhcmUgaW4gcGxhY2UsIHN1Y2ggYXMgcmV0cmlldmluZworICAgICAqIHZpZXdzIG9yIHJlc3RvcmluZyBzdGF0ZS4gIEl0IGlzIGFsc28gdXNlZnVsIGZvciBmcmFnbWVudHMgdGhhdCB1c2UKKyAgICAgKiB7QGxpbmsgI3NldFJldGFpbkluc3RhbmNlKGJvb2xlYW4pfSB0byByZXRhaW4gdGhlaXIgaW5zdGFuY2UsCisgICAgICogYXMgdGhpcyBjYWxsYmFjayB0ZWxscyB0aGUgZnJhZ21lbnQgd2hlbiBpdCBpcyBmdWxseSBhc3NvY2lhdGVkIHdpdGgKKyAgICAgKiB0aGUgbmV3IGFjdGl2aXR5IGluc3RhbmNlLiAgVGhpcyBpcyBjYWxsZWQgYWZ0ZXIge0BsaW5rICNvbkNyZWF0ZVZpZXd9CisgICAgICogYW5kIGJlZm9yZSB7QGxpbmsgI29uU3RhcnQoKX0uCisgICAgICogCisgICAgICogQHBhcmFtIHNhdmVkSW5zdGFuY2VTdGF0ZSBJZiB0aGUgZnJhZ21lbnQgaXMgYmVpbmcgcmUtY3JlYXRlZCBmcm9tCisgICAgICogYSBwcmV2aW91cyBzYXZlZCBzdGF0ZSwgdGhpcyBpcyB0aGUgc3RhdGUuCisgICAgICovCisgICAgcHVibGljIHZvaWQgb25BY3Rpdml0eUNyZWF0ZWQoQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgeworICAgICAgICBtQ2FsbGVkID0gdHJ1ZTsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogQ2FsbGVkIHdoZW4gdGhlIEZyYWdtZW50IGlzIHZpc2libGUgdG8gdGhlIHVzZXIuICBUaGlzIGlzIGdlbmVyYWxseQorICAgICAqIHRpZWQgdG8ge0BsaW5rIEFjdGl2aXR5I29uU3RhcnQoKSBBY3Rpdml0eS5vblN0YXJ0fSBvZiB0aGUgY29udGFpbmluZworICAgICAqIEFjdGl2aXR5J3MgbGlmZWN5Y2xlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIG9uU3RhcnQoKSB7CisgICAgICAgIG1DYWxsZWQgPSB0cnVlOworICAgICAgICBtU3RhcnRlZCA9IHRydWU7CisgICAgICAgIGlmICghbUNoZWNrZWRGb3JMb2FkZXJNYW5hZ2VyKSB7CisgICAgICAgICAgICBtQ2hlY2tlZEZvckxvYWRlck1hbmFnZXIgPSB0cnVlOworICAgICAgICAgICAgbUxvYWRlck1hbmFnZXIgPSBtQWN0aXZpdHkuZ2V0TG9hZGVyTWFuYWdlcihtSW5kZXgsIG1TdGFydGVkLCBmYWxzZSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1Mb2FkZXJNYW5hZ2VyICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1Mb2FkZXJNYW5hZ2VyLmRvU3RhcnQoKTsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBDYWxsZWQgd2hlbiB0aGUgZnJhZ21lbnQgaXMgdmlzaWJsZSB0byB0aGUgdXNlciBhbmQgYWN0aXZlbHkgcnVubmluZy4KKyAgICAgKiBUaGlzIGlzIGdlbmVyYWxseQorICAgICAqIHRpZWQgdG8ge0BsaW5rIEFjdGl2aXR5I29uUmVzdW1lKCkgQWN0aXZpdHkub25SZXN1bWV9IG9mIHRoZSBjb250YWluaW5nCisgICAgICogQWN0aXZpdHkncyBsaWZlY3ljbGUuCisgICAgICovCisgICAgcHVibGljIHZvaWQgb25SZXN1bWUoKSB7CisgICAgICAgIG1DYWxsZWQgPSB0cnVlOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBDYWxsZWQgdG8gYXNrIHRoZSBmcmFnbWVudCB0byBzYXZlIGl0cyBjdXJyZW50IGR5bmFtaWMgc3RhdGUsIHNvIGl0CisgICAgICogY2FuIGxhdGVyIGJlIHJlY29uc3RydWN0ZWQgaW4gYSBuZXcgaW5zdGFuY2Ugb2YgaXRzIHByb2Nlc3MgaXMKKyAgICAgKiByZXN0YXJ0ZWQuICBJZiBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgZnJhZ21lbnQgbGF0ZXIgbmVlZHMgdG8gYmUKKyAgICAgKiBjcmVhdGVkLCB0aGUgZGF0YSB5b3UgcGxhY2UgaW4gdGhlIEJ1bmRsZSBoZXJlIHdpbGwgYmUgYXZhaWxhYmxlCisgICAgICogaW4gdGhlIEJ1bmRsZSBnaXZlbiB0byB7QGxpbmsgI29uQ3JlYXRlKEJ1bmRsZSl9LAorICAgICAqIHtAbGluayAjb25DcmVhdGVWaWV3KExheW91dEluZmxhdGVyLCBWaWV3R3JvdXAsIEJ1bmRsZSl9LCBhbmQKKyAgICAgKiB7QGxpbmsgI29uQWN0aXZpdHlDcmVhdGVkKEJ1bmRsZSl9LgorICAgICAqCisgICAgICogPHA+VGhpcyBjb3JyZXNwb25kcyB0byB7QGxpbmsgQWN0aXZpdHkjb25TYXZlSW5zdGFuY2VTdGF0ZShCdW5kbGUpCisgICAgICogQWN0aXZpdHkub25TYXZlSW5zdGFuY2VTdGF0ZShCdW5kbGUpfSBhbmQgbW9zdCBvZiB0aGUgZGlzY3Vzc2lvbiB0aGVyZQorICAgICAqIGFwcGxpZXMgaGVyZSBhcyB3ZWxsLiAgTm90ZSBob3dldmVyOiA8ZW0+dGhpcyBtZXRob2QgbWF5IGJlIGNhbGxlZAorICAgICAqIGF0IGFueSB0aW1lIGJlZm9yZSB7QGxpbmsgI29uRGVzdHJveSgpfTwvZW0+LiAgVGhlcmUgYXJlIG1hbnkgc2l0dWF0aW9ucworICAgICAqIHdoZXJlIGEgZnJhZ21lbnQgbWF5IGJlIG1vc3RseSB0b3JuIGRvd24gKHN1Y2ggYXMgd2hlbiBwbGFjZWQgb24gdGhlCisgICAgICogYmFjayBzdGFjayB3aXRoIG5vIFVJIHNob3dpbmcpLCBidXQgaXRzIHN0YXRlIHdpbGwgbm90IGJlIHNhdmVkIHVudGlsCisgICAgICogaXRzIG93bmluZyBhY3Rpdml0eSBhY3R1YWxseSBuZWVkcyB0byBzYXZlIGl0cyBzdGF0ZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBvdXRTdGF0ZSBCdW5kbGUgaW4gd2hpY2ggdG8gcGxhY2UgeW91ciBzYXZlZCBzdGF0ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBvblNhdmVJbnN0YW5jZVN0YXRlKEJ1bmRsZSBvdXRTdGF0ZSkgeworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgdm9pZCBvbkNvbmZpZ3VyYXRpb25DaGFuZ2VkKENvbmZpZ3VyYXRpb24gbmV3Q29uZmlnKSB7CisgICAgICAgIG1DYWxsZWQgPSB0cnVlOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBDYWxsZWQgd2hlbiB0aGUgRnJhZ21lbnQgaXMgbm8gbG9uZ2VyIHJlc3VtZWQuICBUaGlzIGlzIGdlbmVyYWxseQorICAgICAqIHRpZWQgdG8ge0BsaW5rIEFjdGl2aXR5I29uUGF1c2UoKSBBY3Rpdml0eS5vblBhdXNlfSBvZiB0aGUgY29udGFpbmluZworICAgICAqIEFjdGl2aXR5J3MgbGlmZWN5Y2xlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIG9uUGF1c2UoKSB7CisgICAgICAgIG1DYWxsZWQgPSB0cnVlOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBDYWxsZWQgd2hlbiB0aGUgRnJhZ21lbnQgaXMgbm8gbG9uZ2VyIHN0YXJ0ZWQuICBUaGlzIGlzIGdlbmVyYWxseQorICAgICAqIHRpZWQgdG8ge0BsaW5rIEFjdGl2aXR5I29uU3RvcCgpIEFjdGl2aXR5Lm9uU3RvcH0gb2YgdGhlIGNvbnRhaW5pbmcKKyAgICAgKiBBY3Rpdml0eSdzIGxpZmVjeWNsZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBvblN0b3AoKSB7CisgICAgICAgIG1DYWxsZWQgPSB0cnVlOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgdm9pZCBvbkxvd01lbW9yeSgpIHsKKyAgICAgICAgbUNhbGxlZCA9IHRydWU7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIENhbGxlZCB3aGVuIHRoZSB2aWV3IHByZXZpb3VzbHkgY3JlYXRlZCBieSB7QGxpbmsgI29uQ3JlYXRlVmlld30gaGFzCisgICAgICogYmVlbiBkZXRhY2hlZCBmcm9tIHRoZSBmcmFnbWVudC4gIFRoZSBuZXh0IHRpbWUgdGhlIGZyYWdtZW50IG5lZWRzCisgICAgICogdG8gYmUgZGlzcGxheWVkLCBhIG5ldyB2aWV3IHdpbGwgYmUgY3JlYXRlZC4gIFRoaXMgaXMgY2FsbGVkCisgICAgICogYWZ0ZXIge0BsaW5rICNvblN0b3AoKX0gYW5kIGJlZm9yZSB7QGxpbmsgI29uRGVzdHJveSgpfS4gIEl0IGlzIGNhbGxlZAorICAgICAqIDxlbT5yZWdhcmRsZXNzPC9lbT4gb2Ygd2hldGhlciB7QGxpbmsgI29uQ3JlYXRlVmlld30gcmV0dXJuZWQgYQorICAgICAqIG5vbi1udWxsIHZpZXcuICBJbnRlcm5hbGx5IGl0IGlzIGNhbGxlZCBhZnRlciB0aGUgdmlldydzIHN0YXRlIGhhcworICAgICAqIGJlZW4gc2F2ZWQgYnV0IGJlZm9yZSBpdCBoYXMgYmVlbiByZW1vdmVkIGZyb20gaXRzIHBhcmVudC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBvbkRlc3Ryb3lWaWV3KCkgeworICAgICAgICBtQ2FsbGVkID0gdHJ1ZTsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogQ2FsbGVkIHdoZW4gdGhlIGZyYWdtZW50IGlzIG5vIGxvbmdlciBpbiB1c2UuICBUaGlzIGlzIGNhbGxlZAorICAgICAqIGFmdGVyIHtAbGluayAjb25TdG9wKCl9IGFuZCBiZWZvcmUge0BsaW5rICNvbkRldGFjaCgpfS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBvbkRlc3Ryb3koKSB7CisgICAgICAgIG1DYWxsZWQgPSB0cnVlOworICAgICAgICAvL0xvZy52KCJmb28iLCAib25EZXN0cm95OiBtQ2hlY2tlZEZvckxvYWRlck1hbmFnZXI9IiArIG1DaGVja2VkRm9yTG9hZGVyTWFuYWdlcgorICAgICAgICAvLyAgICAgICAgKyAiIG1Mb2FkZXJNYW5hZ2VyPSIgKyBtTG9hZGVyTWFuYWdlcik7CisgICAgICAgIGlmICghbUNoZWNrZWRGb3JMb2FkZXJNYW5hZ2VyKSB7CisgICAgICAgICAgICBtQ2hlY2tlZEZvckxvYWRlck1hbmFnZXIgPSB0cnVlOworICAgICAgICAgICAgbUxvYWRlck1hbmFnZXIgPSBtQWN0aXZpdHkuZ2V0TG9hZGVyTWFuYWdlcihtSW5kZXgsIG1TdGFydGVkLCBmYWxzZSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1Mb2FkZXJNYW5hZ2VyICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1Mb2FkZXJNYW5hZ2VyLmRvRGVzdHJveSgpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2FsbGVkIHdoZW4gdGhlIGZyYWdtZW50IGlzIG5vIGxvbmdlciBhdHRhY2hlZCB0byBpdHMgYWN0aXZpdHkuICBUaGlzCisgICAgICogaXMgY2FsbGVkIGFmdGVyIHtAbGluayAjb25EZXN0cm95KCl9LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIG9uRGV0YWNoKCkgeworICAgICAgICBtQ2FsbGVkID0gdHJ1ZTsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogSW5pdGlhbGl6ZSB0aGUgY29udGVudHMgb2YgdGhlIEFjdGl2aXR5J3Mgc3RhbmRhcmQgb3B0aW9ucyBtZW51LiAgWW91CisgICAgICogc2hvdWxkIHBsYWNlIHlvdXIgbWVudSBpdGVtcyBpbiB0byA8dmFyPm1lbnU8L3Zhcj4uICBGb3IgdGhpcyBtZXRob2QKKyAgICAgKiB0byBiZSBjYWxsZWQsIHlvdSBtdXN0IGhhdmUgZmlyc3QgY2FsbGVkIHtAbGluayAjc2V0SGFzT3B0aW9uc01lbnV9LiAgU2VlCisgICAgICoge0BsaW5rIEFjdGl2aXR5I29uQ3JlYXRlT3B0aW9uc01lbnUoTWVudSkgQWN0aXZpdHkub25DcmVhdGVPcHRpb25zTWVudX0KKyAgICAgKiBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gbWVudSBUaGUgb3B0aW9ucyBtZW51IGluIHdoaWNoIHlvdSBwbGFjZSB5b3VyIGl0ZW1zLgorICAgICAqIAorICAgICAqIEBzZWUgI3NldEhhc09wdGlvbnNNZW51CisgICAgICogQHNlZSAjb25QcmVwYXJlT3B0aW9uc01lbnUKKyAgICAgKiBAc2VlICNvbk9wdGlvbnNJdGVtU2VsZWN0ZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBvbkNyZWF0ZU9wdGlvbnNNZW51KE1lbnUgbWVudSwgTWVudUluZmxhdGVyIGluZmxhdGVyKSB7CisgICAgfQorCisgICAgLyoqCisgICAgICogUHJlcGFyZSB0aGUgU2NyZWVuJ3Mgc3RhbmRhcmQgb3B0aW9ucyBtZW51IHRvIGJlIGRpc3BsYXllZC4gIFRoaXMgaXMKKyAgICAgKiBjYWxsZWQgcmlnaHQgYmVmb3JlIHRoZSBtZW51IGlzIHNob3duLCBldmVyeSB0aW1lIGl0IGlzIHNob3duLiAgWW91IGNhbgorICAgICAqIHVzZSB0aGlzIG1ldGhvZCB0byBlZmZpY2llbnRseSBlbmFibGUvZGlzYWJsZSBpdGVtcyBvciBvdGhlcndpc2UKKyAgICAgKiBkeW5hbWljYWxseSBtb2RpZnkgdGhlIGNvbnRlbnRzLiAgU2VlCisgICAgICoge0BsaW5rIEFjdGl2aXR5I29uUHJlcGFyZU9wdGlvbnNNZW51KE1lbnUpIEFjdGl2aXR5Lm9uUHJlcGFyZU9wdGlvbnNNZW51fQorICAgICAqIGZvciBtb3JlIGluZm9ybWF0aW9uLgorICAgICAqIAorICAgICAqIEBwYXJhbSBtZW51IFRoZSBvcHRpb25zIG1lbnUgYXMgbGFzdCBzaG93biBvciBmaXJzdCBpbml0aWFsaXplZCBieQorICAgICAqICAgICAgICAgICAgIG9uQ3JlYXRlT3B0aW9uc01lbnUoKS4KKyAgICAgKiAKKyAgICAgKiBAc2VlICNzZXRIYXNPcHRpb25zTWVudQorICAgICAqIEBzZWUgI29uQ3JlYXRlT3B0aW9uc01lbnUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBvblByZXBhcmVPcHRpb25zTWVudShNZW51IG1lbnUpIHsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGlzIGhvb2sgaXMgY2FsbGVkIHdoZW5ldmVyIGFuIGl0ZW0gaW4geW91ciBvcHRpb25zIG1lbnUgaXMgc2VsZWN0ZWQuCisgICAgICogVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gc2ltcGx5IHJldHVybnMgZmFsc2UgdG8gaGF2ZSB0aGUgbm9ybWFsCisgICAgICogcHJvY2Vzc2luZyBoYXBwZW4gKGNhbGxpbmcgdGhlIGl0ZW0ncyBSdW5uYWJsZSBvciBzZW5kaW5nIGEgbWVzc2FnZSB0bworICAgICAqIGl0cyBIYW5kbGVyIGFzIGFwcHJvcHJpYXRlKS4gIFlvdSBjYW4gdXNlIHRoaXMgbWV0aG9kIGZvciBhbnkgaXRlbXMKKyAgICAgKiBmb3Igd2hpY2ggeW91IHdvdWxkIGxpa2UgdG8gZG8gcHJvY2Vzc2luZyB3aXRob3V0IHRob3NlIG90aGVyCisgICAgICogZmFjaWxpdGllcy4KKyAgICAgKiAKKyAgICAgKiA8cD5EZXJpdmVkIGNsYXNzZXMgc2hvdWxkIGNhbGwgdGhyb3VnaCB0byB0aGUgYmFzZSBjbGFzcyBmb3IgaXQgdG8KKyAgICAgKiBwZXJmb3JtIHRoZSBkZWZhdWx0IG1lbnUgaGFuZGxpbmcuCisgICAgICogCisgICAgICogQHBhcmFtIGl0ZW0gVGhlIG1lbnUgaXRlbSB0aGF0IHdhcyBzZWxlY3RlZC4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIGJvb2xlYW4gUmV0dXJuIGZhbHNlIHRvIGFsbG93IG5vcm1hbCBtZW51IHByb2Nlc3NpbmcgdG8KKyAgICAgKiAgICAgICAgIHByb2NlZWQsIHRydWUgdG8gY29uc3VtZSBpdCBoZXJlLgorICAgICAqIAorICAgICAqIEBzZWUgI29uQ3JlYXRlT3B0aW9uc01lbnUKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBvbk9wdGlvbnNJdGVtU2VsZWN0ZWQoTWVudUl0ZW0gaXRlbSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhpcyBob29rIGlzIGNhbGxlZCB3aGVuZXZlciB0aGUgb3B0aW9ucyBtZW51IGlzIGJlaW5nIGNsb3NlZCAoZWl0aGVyIGJ5IHRoZSB1c2VyIGNhbmNlbGluZworICAgICAqIHRoZSBtZW51IHdpdGggdGhlIGJhY2svbWVudSBidXR0b24sIG9yIHdoZW4gYW4gaXRlbSBpcyBzZWxlY3RlZCkuCisgICAgICogIAorICAgICAqIEBwYXJhbSBtZW51IFRoZSBvcHRpb25zIG1lbnUgYXMgbGFzdCBzaG93biBvciBmaXJzdCBpbml0aWFsaXplZCBieQorICAgICAqICAgICAgICAgICAgIG9uQ3JlYXRlT3B0aW9uc01lbnUoKS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBvbk9wdGlvbnNNZW51Q2xvc2VkKE1lbnUgbWVudSkgeworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBDYWxsZWQgd2hlbiBhIGNvbnRleHQgbWVudSBmb3IgdGhlIHtAY29kZSB2aWV3fSBpcyBhYm91dCB0byBiZSBzaG93bi4KKyAgICAgKiBVbmxpa2Uge0BsaW5rICNvbkNyZWF0ZU9wdGlvbnNNZW51fSwgdGhpcyB3aWxsIGJlIGNhbGxlZCBldmVyeQorICAgICAqIHRpbWUgdGhlIGNvbnRleHQgbWVudSBpcyBhYm91dCB0byBiZSBzaG93biBhbmQgc2hvdWxkIGJlIHBvcHVsYXRlZCBmb3IKKyAgICAgKiB0aGUgdmlldyAob3IgaXRlbSBpbnNpZGUgdGhlIHZpZXcgZm9yIHtAbGluayBBZGFwdGVyVmlld30gc3ViY2xhc3NlcywKKyAgICAgKiB0aGlzIGNhbiBiZSBmb3VuZCBpbiB0aGUge0Bjb2RlIG1lbnVJbmZvfSkpLgorICAgICAqIDxwPgorICAgICAqIFVzZSB7QGxpbmsgI29uQ29udGV4dEl0ZW1TZWxlY3RlZChhbmRyb2lkLnZpZXcuTWVudUl0ZW0pfSB0byBrbm93IHdoZW4gYW4KKyAgICAgKiBpdGVtIGhhcyBiZWVuIHNlbGVjdGVkLgorICAgICAqIDxwPgorICAgICAqIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIGNhbGxzIHVwIHRvCisgICAgICoge0BsaW5rIEFjdGl2aXR5I29uQ3JlYXRlQ29udGV4dE1lbnUgQWN0aXZpdHkub25DcmVhdGVDb250ZXh0TWVudX0sIHRob3VnaAorICAgICAqIHlvdSBjYW4gbm90IGNhbGwgdGhpcyBpbXBsZW1lbnRhdGlvbiBpZiB5b3UgZG9uJ3Qgd2FudCB0aGF0IGJlaGF2aW9yLgorICAgICAqIDxwPgorICAgICAqIEl0IGlzIG5vdCBzYWZlIHRvIGhvbGQgb250byB0aGUgY29udGV4dCBtZW51IGFmdGVyIHRoaXMgbWV0aG9kIHJldHVybnMuCisgICAgICoge0Bpbmhlcml0RG9jfQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIG9uQ3JlYXRlQ29udGV4dE1lbnUoQ29udGV4dE1lbnUgbWVudSwgVmlldyB2LCBDb250ZXh0TWVudUluZm8gbWVudUluZm8pIHsKKyAgICAgICAgZ2V0QWN0aXZpdHkoKS5vbkNyZWF0ZUNvbnRleHRNZW51KG1lbnUsIHYsIG1lbnVJbmZvKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZWdpc3RlcnMgYSBjb250ZXh0IG1lbnUgdG8gYmUgc2hvd24gZm9yIHRoZSBnaXZlbiB2aWV3IChtdWx0aXBsZSB2aWV3cworICAgICAqIGNhbiBzaG93IHRoZSBjb250ZXh0IG1lbnUpLiBUaGlzIG1ldGhvZCB3aWxsIHNldCB0aGUKKyAgICAgKiB7QGxpbmsgT25DcmVhdGVDb250ZXh0TWVudUxpc3RlbmVyfSBvbiB0aGUgdmlldyB0byB0aGlzIGZyYWdtZW50LCBzbworICAgICAqIHtAbGluayAjb25DcmVhdGVDb250ZXh0TWVudShDb250ZXh0TWVudSwgVmlldywgQ29udGV4dE1lbnVJbmZvKX0gd2lsbCBiZQorICAgICAqIGNhbGxlZCB3aGVuIGl0IGlzIHRpbWUgdG8gc2hvdyB0aGUgY29udGV4dCBtZW51LgorICAgICAqIAorICAgICAqIEBzZWUgI3VucmVnaXN0ZXJGb3JDb250ZXh0TWVudShWaWV3KQorICAgICAqIEBwYXJhbSB2aWV3IFRoZSB2aWV3IHRoYXQgc2hvdWxkIHNob3cgYSBjb250ZXh0IG1lbnUuCisgICAgICovCisgICAgcHVibGljIHZvaWQgcmVnaXN0ZXJGb3JDb250ZXh0TWVudShWaWV3IHZpZXcpIHsKKyAgICAgICAgdmlldy5zZXRPbkNyZWF0ZUNvbnRleHRNZW51TGlzdGVuZXIodGhpcyk7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFByZXZlbnRzIGEgY29udGV4dCBtZW51IHRvIGJlIHNob3duIGZvciB0aGUgZ2l2ZW4gdmlldy4gVGhpcyBtZXRob2Qgd2lsbAorICAgICAqIHJlbW92ZSB0aGUge0BsaW5rIE9uQ3JlYXRlQ29udGV4dE1lbnVMaXN0ZW5lcn0gb24gdGhlIHZpZXcuCisgICAgICogCisgICAgICogQHNlZSAjcmVnaXN0ZXJGb3JDb250ZXh0TWVudShWaWV3KQorICAgICAqIEBwYXJhbSB2aWV3IFRoZSB2aWV3IHRoYXQgc2hvdWxkIHN0b3Agc2hvd2luZyBhIGNvbnRleHQgbWVudS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB1bnJlZ2lzdGVyRm9yQ29udGV4dE1lbnUoVmlldyB2aWV3KSB7CisgICAgICAgIHZpZXcuc2V0T25DcmVhdGVDb250ZXh0TWVudUxpc3RlbmVyKG51bGwpOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBUaGlzIGhvb2sgaXMgY2FsbGVkIHdoZW5ldmVyIGFuIGl0ZW0gaW4gYSBjb250ZXh0IG1lbnUgaXMgc2VsZWN0ZWQuIFRoZQorICAgICAqIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gc2ltcGx5IHJldHVybnMgZmFsc2UgdG8gaGF2ZSB0aGUgbm9ybWFsIHByb2Nlc3NpbmcKKyAgICAgKiBoYXBwZW4gKGNhbGxpbmcgdGhlIGl0ZW0ncyBSdW5uYWJsZSBvciBzZW5kaW5nIGEgbWVzc2FnZSB0byBpdHMgSGFuZGxlcgorICAgICAqIGFzIGFwcHJvcHJpYXRlKS4gWW91IGNhbiB1c2UgdGhpcyBtZXRob2QgZm9yIGFueSBpdGVtcyBmb3Igd2hpY2ggeW91CisgICAgICogd291bGQgbGlrZSB0byBkbyBwcm9jZXNzaW5nIHdpdGhvdXQgdGhvc2Ugb3RoZXIgZmFjaWxpdGllcy4KKyAgICAgKiA8cD4KKyAgICAgKiBVc2Uge0BsaW5rIE1lbnVJdGVtI2dldE1lbnVJbmZvKCl9IHRvIGdldCBleHRyYSBpbmZvcm1hdGlvbiBzZXQgYnkgdGhlCisgICAgICogVmlldyB0aGF0IGFkZGVkIHRoaXMgbWVudSBpdGVtLgorICAgICAqIDxwPgorICAgICAqIERlcml2ZWQgY2xhc3NlcyBzaG91bGQgY2FsbCB0aHJvdWdoIHRvIHRoZSBiYXNlIGNsYXNzIGZvciBpdCB0byBwZXJmb3JtCisgICAgICogdGhlIGRlZmF1bHQgbWVudSBoYW5kbGluZy4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gaXRlbSBUaGUgY29udGV4dCBtZW51IGl0ZW0gdGhhdCB3YXMgc2VsZWN0ZWQuCisgICAgICogQHJldHVybiBib29sZWFuIFJldHVybiBmYWxzZSB0byBhbGxvdyBub3JtYWwgY29udGV4dCBtZW51IHByb2Nlc3NpbmcgdG8KKyAgICAgKiAgICAgICAgIHByb2NlZWQsIHRydWUgdG8gY29uc3VtZSBpdCBoZXJlLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIG9uQ29udGV4dEl0ZW1TZWxlY3RlZChNZW51SXRlbSBpdGVtKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgCisgICAgdm9pZCBwZXJmb3JtU3RvcCgpIHsKKyAgICAgICAgb25TdG9wKCk7CisgICAgICAgIGlmIChtU3RhcnRlZCkgeworICAgICAgICAgICAgbVN0YXJ0ZWQgPSBmYWxzZTsKKyAgICAgICAgICAgIGlmICghbUNoZWNrZWRGb3JMb2FkZXJNYW5hZ2VyKSB7CisgICAgICAgICAgICAgICAgbUNoZWNrZWRGb3JMb2FkZXJNYW5hZ2VyID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBtTG9hZGVyTWFuYWdlciA9IG1BY3Rpdml0eS5nZXRMb2FkZXJNYW5hZ2VyKG1JbmRleCwgbVN0YXJ0ZWQsIGZhbHNlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChtTG9hZGVyTWFuYWdlciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgaWYgKG1BY3Rpdml0eSA9PSBudWxsIHx8ICFtQWN0aXZpdHkubUNoYW5naW5nQ29uZmlndXJhdGlvbnMpIHsKKyAgICAgICAgICAgICAgICAgICAgbUxvYWRlck1hbmFnZXIuZG9TdG9wKCk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgbUxvYWRlck1hbmFnZXIuZG9SZXRhaW4oKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9hcHAvRnJhZ21lbnRNYW5hZ2VyLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9hcHAvRnJhZ21lbnRNYW5hZ2VyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTcwNGVjOAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9GcmFnbWVudE1hbmFnZXIuamF2YQpAQCAtMCwwICsxLDEyMjYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQuYXBwOworCitpbXBvcnQgYW5kcm9pZC5hbmltYXRpb24uQW5pbWF0b3I7CitpbXBvcnQgYW5kcm9pZC5hbmltYXRpb24uQW5pbWF0b3JJbmZsYXRlcjsKK2ltcG9ydCBhbmRyb2lkLmFuaW1hdGlvbi5BbmltYXRvckxpc3RlbmVyQWRhcHRlcjsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlR5cGVkQXJyYXk7CitpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CitpbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyOworaW1wb3J0IGFuZHJvaWQub3MuUGFyY2VsOworaW1wb3J0IGFuZHJvaWQub3MuUGFyY2VsYWJsZTsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworaW1wb3J0IGFuZHJvaWQudXRpbC5TcGFyc2VBcnJheTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuTWVudTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuTWVudUluZmxhdGVyOworaW1wb3J0IGFuZHJvaWQudmlldy5NZW51SXRlbTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlld0dyb3VwOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKKworLyoqCisgKiBJbnRlcmZhY2UgZm9yIGludGVyYWN0aW5nIHdpdGgge0BsaW5rIEZyYWdtZW50fSBvYmplY3RzIGluc2lkZSBvZiBhbgorICoge0BsaW5rIEFjdGl2aXR5fQorICovCitwdWJsaWMgaW50ZXJmYWNlIEZyYWdtZW50TWFuYWdlciB7CisgICAgLyoqCisgICAgICogU3RhcnQgYSBzZXJpZXMgb2YgZWRpdCBvcGVyYXRpb25zIG9uIHRoZSBGcmFnbWVudHMgYXNzb2NpYXRlZCB3aXRoCisgICAgICogdGhpcyBGcmFnbWVudE1hbmFnZXIuCisgICAgICovCisgICAgcHVibGljIEZyYWdtZW50VHJhbnNhY3Rpb24gb3BlblRyYW5zYWN0aW9uKCk7CisKKyAgICAvKioKKyAgICAgKiBGaW5kcyBhIGZyYWdtZW50IHRoYXQgd2FzIGlkZW50aWZpZWQgYnkgdGhlIGdpdmVuIGlkIGVpdGhlciB3aGVuIGluZmxhdGVkCisgICAgICogZnJvbSBYTUwgb3IgYXMgdGhlIGNvbnRhaW5lciBJRCB3aGVuIGFkZGVkIGluIGEgdHJhbnNhY3Rpb24uICBUaGlzIGZpcnN0CisgICAgICogc2VhcmNoZXMgdGhyb3VnaCBmcmFnbWVudHMgdGhhdCBhcmUgY3VycmVudGx5IGFkZGVkIHRvIHRoZSBtYW5hZ2VyJ3MKKyAgICAgKiBhY3Rpdml0eTsgaWYgbm8gc3VjaCBmcmFnbWVudCBpcyBmb3VuZCwgdGhlbiBhbGwgZnJhZ21lbnRzIGN1cnJlbnRseQorICAgICAqIG9uIHRoZSBiYWNrIHN0YWNrIGFzc29jaWF0ZWQgd2l0aCB0aGlzIElEIGFyZSBzZWFyY2hlZC4KKyAgICAgKiBAcmV0dXJuIFRoZSBmcmFnbWVudCBpZiBmb3VuZCBvciBudWxsIG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgRnJhZ21lbnQgZmluZEZyYWdtZW50QnlJZChpbnQgaWQpOworCisgICAgLyoqCisgICAgICogRmluZHMgYSBmcmFnbWVudCB0aGF0IHdhcyBpZGVudGlmaWVkIGJ5IHRoZSBnaXZlbiB0YWcgZWl0aGVyIHdoZW4gaW5mbGF0ZWQKKyAgICAgKiBmcm9tIFhNTCBvciBhcyBzdXBwbGllZCB3aGVuIGFkZGVkIGluIGEgdHJhbnNhY3Rpb24uICBUaGlzIGZpcnN0CisgICAgICogc2VhcmNoZXMgdGhyb3VnaCBmcmFnbWVudHMgdGhhdCBhcmUgY3VycmVudGx5IGFkZGVkIHRvIHRoZSBtYW5hZ2VyJ3MKKyAgICAgKiBhY3Rpdml0eTsgaWYgbm8gc3VjaCBmcmFnbWVudCBpcyBmb3VuZCwgdGhlbiBhbGwgZnJhZ21lbnRzIGN1cnJlbnRseQorICAgICAqIG9uIHRoZSBiYWNrIHN0YWNrIGFyZSBzZWFyY2hlZC4KKyAgICAgKiBAcmV0dXJuIFRoZSBmcmFnbWVudCBpZiBmb3VuZCBvciBudWxsIG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgRnJhZ21lbnQgZmluZEZyYWdtZW50QnlUYWcoU3RyaW5nIHRhZyk7CisKKyAgICAvKioKKyAgICAgKiBGbGFnIGZvciB7QGxpbmsgI3BvcEJhY2tTdGFjayhTdHJpbmcsIGludCl9CisgICAgICogYW5kIHtAbGluayAjcG9wQmFja1N0YWNrKGludCwgaW50KX06IElmIHNldCwgYW5kIHRoZSBuYW1lIG9yIElEIG9mCisgICAgICogYSBiYWNrIHN0YWNrIGVudHJ5IGhhcyBiZWVuIHN1cHBsaWVkLCB0aGVuIGFsbCBtYXRjaGluZyBlbnRyaWVzIHdpbGwKKyAgICAgKiBiZSBjb25zdW1lZCB1bnRpbCBvbmUgdGhhdCBkb2Vzbid0IG1hdGNoIGlzIGZvdW5kIG9yIHRoZSBib3R0b20gb2YKKyAgICAgKiB0aGUgc3RhY2sgaXMgcmVhY2hlZC4gIE90aGVyd2lzZSwgYWxsIGVudHJpZXMgdXAgdG8gYnV0IG5vdCBpbmNsdWRpbmcgdGhhdCBlbnRyeQorICAgICAqIHdpbGwgYmUgcmVtb3ZlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQT1BfQkFDS19TVEFDS19JTkNMVVNJVkUgPSAxPDwwOworCisgICAgLyoqCisgICAgICogUG9wIHRoZSB0b3Agc3RhdGUgb2ZmIHRoZSBiYWNrIHN0YWNrLiAgUmV0dXJucyB0cnVlIGlmIHRoZXJlIHdhcyBvbmUKKyAgICAgKiB0byBwb3AsIGVsc2UgZmFsc2UuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gcG9wQmFja1N0YWNrKCk7CisKKyAgICAvKioKKyAgICAgKiBQb3AgdGhlIGxhc3QgZnJhZ21lbnQgdHJhbnNpdGlvbiBmcm9tIHRoZSBtYW5hZ2VyJ3MgZnJhZ21lbnQKKyAgICAgKiBiYWNrIHN0YWNrLiAgSWYgdGhlcmUgaXMgbm90aGluZyB0byBwb3AsIGZhbHNlIGlzIHJldHVybmVkLgorICAgICAqIEBwYXJhbSBuYW1lIElmIG5vbi1udWxsLCB0aGlzIGlzIHRoZSBuYW1lIG9mIGEgcHJldmlvdXMgYmFjayBzdGF0ZQorICAgICAqIHRvIGxvb2sgZm9yOyBpZiBmb3VuZCwgYWxsIHN0YXRlcyB1cCB0byB0aGF0IHN0YXRlIHdpbGwgYmUgcG9wcGVkLiAgVGhlCisgICAgICoge0BsaW5rICNQT1BfQkFDS19TVEFDS19JTkNMVVNJVkV9IGZsYWcgY2FuIGJlIHVzZWQgdG8gY29udHJvbCB3aGV0aGVyCisgICAgICogdGhlIG5hbWVkIHN0YXRlIGl0c2VsZiBpcyBwb3BwZWQuIElmIG51bGwsIG9ubHkgdGhlIHRvcCBzdGF0ZSBpcyBwb3BwZWQuCisgICAgICogQHBhcmFtIGZsYWdzIEVpdGhlciAwIG9yIHtAbGluayAjUE9QX0JBQ0tfU1RBQ0tfSU5DTFVTSVZFfS4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBwb3BCYWNrU3RhY2soU3RyaW5nIG5hbWUsIGludCBmbGFncyk7CisKKyAgICAvKioKKyAgICAgKiBQb3AgYWxsIGJhY2sgc3RhY2sgc3RhdGVzIHVwIHRvIHRoZSBvbmUgd2l0aCB0aGUgZ2l2ZW4gaWRlbnRpZmllci4KKyAgICAgKiBAcGFyYW0gaWQgSWRlbnRpZmllciBvZiB0aGUgc3RhdGVkIHRvIGJlIHBvcHBlZC4gSWYgbm8gaWRlbnRpZmllciBleGlzdHMsCisgICAgICogZmFsc2UgaXMgcmV0dXJuZWQuCisgICAgICogVGhlIGlkZW50aWZpZXIgaXMgdGhlIG51bWJlciByZXR1cm5lZCBieQorICAgICAqIHtAbGluayBGcmFnbWVudFRyYW5zYWN0aW9uI2NvbW1pdCgpIEZyYWdtZW50VHJhbnNhY3Rpb24uY29tbWl0KCl9LiAgVGhlCisgICAgICoge0BsaW5rICNQT1BfQkFDS19TVEFDS19JTkNMVVNJVkV9IGZsYWcgY2FuIGJlIHVzZWQgdG8gY29udHJvbCB3aGV0aGVyCisgICAgICogdGhlIG5hbWVkIHN0YXRlIGl0c2VsZiBpcyBwb3BwZWQuCisgICAgICogQHBhcmFtIGZsYWdzIEVpdGhlciAwIG9yIHtAbGluayAjUE9QX0JBQ0tfU1RBQ0tfSU5DTFVTSVZFfS4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBwb3BCYWNrU3RhY2soaW50IGlkLCBpbnQgZmxhZ3MpOworCisgICAgLyoqCisgICAgICogUHV0IGEgcmVmZXJlbmNlIHRvIGEgZnJhZ21lbnQgaW4gYSBCdW5kbGUuICBUaGlzIEJ1bmRsZSBjYW4gYmUKKyAgICAgKiBwZXJzaXN0ZWQgYXMgc2F2ZWQgc3RhdGUsIGFuZCB3aGVuIGxhdGVyIHJlc3RvcmluZworICAgICAqIHtAbGluayAjZ2V0RnJhZ21lbnQoQnVuZGxlLCBTdHJpbmcpfSB3aWxsIHJldHVybiB0aGUgY3VycmVudAorICAgICAqIGluc3RhbmNlIG9mIHRoZSBzYW1lIGZyYWdtZW50LgorICAgICAqCisgICAgICogQHBhcmFtIGJ1bmRsZSBUaGUgYnVuZGxlIGluIHdoaWNoIHRvIHB1dCB0aGUgZnJhZ21lbnQgcmVmZXJlbmNlLgorICAgICAqIEBwYXJhbSBrZXkgVGhlIG5hbWUgb2YgdGhlIGVudHJ5IGluIHRoZSBidW5kbGUuCisgICAgICogQHBhcmFtIGZyYWdtZW50IFRoZSBGcmFnbWVudCB3aG9zZSByZWZlcmVuY2UgaXMgdG8gYmUgc3RvcmVkLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHB1dEZyYWdtZW50KEJ1bmRsZSBidW5kbGUsIFN0cmluZyBrZXksIEZyYWdtZW50IGZyYWdtZW50KTsKKworICAgIC8qKgorICAgICAqIFJldHJpZXZlIHRoZSBjdXJyZW50IEZyYWdtZW50IGluc3RhbmNlIGZvciBhIHJlZmVyZW5jZSBwcmV2aW91c2x5CisgICAgICogcGxhY2VkIHdpdGgge0BsaW5rICNwdXRGcmFnbWVudChCdW5kbGUsIFN0cmluZywgRnJhZ21lbnQpfS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBidW5kbGUgVGhlIGJ1bmRsZSBmcm9tIHdoaWNoIHRvIHJldHJpZXZlIHRoZSBmcmFnbWVudCByZWZlcmVuY2UuCisgICAgICogQHBhcmFtIGtleSBUaGUgbmFtZSBvZiB0aGUgZW50cnkgaW4gdGhlIGJ1bmRsZS4KKyAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIGN1cnJlbnQgRnJhZ21lbnQgaW5zdGFuY2UgdGhhdCBpcyBhc3NvY2lhdGVkIHdpdGgKKyAgICAgKiB0aGUgZ2l2ZW4gcmVmZXJlbmNlLgorICAgICAqLworICAgIHB1YmxpYyBGcmFnbWVudCBnZXRGcmFnbWVudChCdW5kbGUgYnVuZGxlLCBTdHJpbmcga2V5KTsKK30KKworZmluYWwgY2xhc3MgRnJhZ21lbnRNYW5hZ2VyU3RhdGUgaW1wbGVtZW50cyBQYXJjZWxhYmxlIHsKKyAgICBGcmFnbWVudFN0YXRlW10gbUFjdGl2ZTsKKyAgICBpbnRbXSBtQWRkZWQ7CisgICAgQmFja1N0YWNrU3RhdGVbXSBtQmFja1N0YWNrOworICAgIAorICAgIHB1YmxpYyBGcmFnbWVudE1hbmFnZXJTdGF0ZSgpIHsKKyAgICB9CisgICAgCisgICAgcHVibGljIEZyYWdtZW50TWFuYWdlclN0YXRlKFBhcmNlbCBpbikgeworICAgICAgICBtQWN0aXZlID0gaW4uY3JlYXRlVHlwZWRBcnJheShGcmFnbWVudFN0YXRlLkNSRUFUT1IpOworICAgICAgICBtQWRkZWQgPSBpbi5jcmVhdGVJbnRBcnJheSgpOworICAgICAgICBtQmFja1N0YWNrID0gaW4uY3JlYXRlVHlwZWRBcnJheShCYWNrU3RhY2tTdGF0ZS5DUkVBVE9SKTsKKyAgICB9CisgICAgCisgICAgcHVibGljIGludCBkZXNjcmliZUNvbnRlbnRzKCkgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB3cml0ZVRvUGFyY2VsKFBhcmNlbCBkZXN0LCBpbnQgZmxhZ3MpIHsKKyAgICAgICAgZGVzdC53cml0ZVR5cGVkQXJyYXkobUFjdGl2ZSwgZmxhZ3MpOworICAgICAgICBkZXN0LndyaXRlSW50QXJyYXkobUFkZGVkKTsKKyAgICAgICAgZGVzdC53cml0ZVR5cGVkQXJyYXkobUJhY2tTdGFjaywgZmxhZ3MpOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFBhcmNlbGFibGUuQ3JlYXRvcjxGcmFnbWVudE1hbmFnZXJTdGF0ZT4gQ1JFQVRPUgorICAgICAgICAgICAgPSBuZXcgUGFyY2VsYWJsZS5DcmVhdG9yPEZyYWdtZW50TWFuYWdlclN0YXRlPigpIHsKKyAgICAgICAgcHVibGljIEZyYWdtZW50TWFuYWdlclN0YXRlIGNyZWF0ZUZyb21QYXJjZWwoUGFyY2VsIGluKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IEZyYWdtZW50TWFuYWdlclN0YXRlKGluKTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgcHVibGljIEZyYWdtZW50TWFuYWdlclN0YXRlW10gbmV3QXJyYXkoaW50IHNpemUpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgRnJhZ21lbnRNYW5hZ2VyU3RhdGVbc2l6ZV07CisgICAgICAgIH0KKyAgICB9OworfQorCisvKioKKyAqIENvbnRhaW5lciBmb3IgZnJhZ21lbnRzIGFzc29jaWF0ZWQgd2l0aCBhbiBhY3Rpdml0eS4KKyAqLworZmluYWwgY2xhc3MgRnJhZ21lbnRNYW5hZ2VySW1wbCBpbXBsZW1lbnRzIEZyYWdtZW50TWFuYWdlciB7CisgICAgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUcgPSB0cnVlOworICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIkZyYWdtZW50TWFuYWdlciI7CisgICAgCisgICAgc3RhdGljIGZpbmFsIFN0cmluZyBUQVJHRVRfUkVRVUVTVF9DT0RFX1NUQVRFX1RBRyA9ICJhbmRyb2lkOnRhcmdldF9yZXFfc3RhdGUiOworICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFSR0VUX1NUQVRFX1RBRyA9ICJhbmRyb2lkOnRhcmdldF9zdGF0ZSI7CisgICAgc3RhdGljIGZpbmFsIFN0cmluZyBWSUVXX1NUQVRFX1RBRyA9ICJhbmRyb2lkOnZpZXdfc3RhdGUiOworCisgICAgQXJyYXlMaXN0PFJ1bm5hYmxlPiBtUGVuZGluZ0FjdGlvbnM7CisgICAgUnVubmFibGVbXSBtVG1wQWN0aW9uczsKKyAgICBib29sZWFuIG1FeGVjdXRpbmdBY3Rpb25zOworICAgIAorICAgIEFycmF5TGlzdDxGcmFnbWVudD4gbUFjdGl2ZTsKKyAgICBBcnJheUxpc3Q8RnJhZ21lbnQ+IG1BZGRlZDsKKyAgICBBcnJheUxpc3Q8SW50ZWdlcj4gbUF2YWlsSW5kaWNlczsKKyAgICBBcnJheUxpc3Q8QmFja1N0YWNrRW50cnk+IG1CYWNrU3RhY2s7CisgICAgCisgICAgLy8gTXVzdCBiZSBhY2Nlc3NlZCB3aGlsZSBsb2NrZWQuCisgICAgQXJyYXlMaXN0PEJhY2tTdGFja0VudHJ5PiBtQmFja1N0YWNrSW5kaWNlczsKKyAgICBBcnJheUxpc3Q8SW50ZWdlcj4gbUF2YWlsQmFja1N0YWNrSW5kaWNlczsKKworICAgIGludCBtQ3VyU3RhdGUgPSBGcmFnbWVudC5JTklUSUFMSVpJTkc7CisgICAgQWN0aXZpdHkgbUFjdGl2aXR5OworICAgIAorICAgIGJvb2xlYW4gbU5lZWRNZW51SW52YWxpZGF0ZTsKKyAgICBib29sZWFuIG1TdGF0ZVNhdmVkOworICAgIAorICAgIC8vIFRlbXBvcmFyeSB2YXJzIGZvciBzdGF0ZSBzYXZlIGFuZCByZXN0b3JlLgorICAgIEJ1bmRsZSBtU3RhdGVCdW5kbGUgPSBudWxsOworICAgIFNwYXJzZUFycmF5PFBhcmNlbGFibGU+IG1TdGF0ZUFycmF5ID0gbnVsbDsKKyAgICAKKyAgICBSdW5uYWJsZSBtRXhlY0NvbW1pdCA9IG5ldyBSdW5uYWJsZSgpIHsKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgIGV4ZWNQZW5kaW5nQWN0aW9ucygpOworICAgICAgICB9CisgICAgfTsKKyAgICBwdWJsaWMgRnJhZ21lbnRUcmFuc2FjdGlvbiBvcGVuVHJhbnNhY3Rpb24oKSB7CisgICAgICAgIHJldHVybiBuZXcgQmFja1N0YWNrRW50cnkodGhpcyk7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gcG9wQmFja1N0YWNrKCkgeworICAgICAgICByZXR1cm4gcG9wQmFja1N0YWNrU3RhdGUobUFjdGl2aXR5Lm1IYW5kbGVyLCBudWxsLCAtMSwgMCk7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gcG9wQmFja1N0YWNrKFN0cmluZyBuYW1lLCBpbnQgZmxhZ3MpIHsKKyAgICAgICAgcmV0dXJuIHBvcEJhY2tTdGFja1N0YXRlKG1BY3Rpdml0eS5tSGFuZGxlciwgbmFtZSwgLTEsIGZsYWdzKTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBwb3BCYWNrU3RhY2soaW50IGlkLCBpbnQgZmxhZ3MpIHsKKyAgICAgICAgaWYgKGlkIDwgMCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiQmFkIGlkOiAiICsgaWQpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBwb3BCYWNrU3RhY2tTdGF0ZShtQWN0aXZpdHkubUhhbmRsZXIsIG51bGwsIGlkLCBmbGFncyk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgcHV0RnJhZ21lbnQoQnVuZGxlIGJ1bmRsZSwgU3RyaW5nIGtleSwgRnJhZ21lbnQgZnJhZ21lbnQpIHsKKyAgICAgICAgaWYgKGZyYWdtZW50Lm1JbmRleCA8IDApIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkZyYWdtZW50ICIgKyBmcmFnbWVudAorICAgICAgICAgICAgICAgICAgICArICIgaXMgbm90IGN1cnJlbnRseSBpbiB0aGUgRnJhZ21lbnRNYW5hZ2VyIik7CisgICAgICAgIH0KKyAgICAgICAgYnVuZGxlLnB1dEludChrZXksIGZyYWdtZW50Lm1JbmRleCk7CisgICAgfQorCisgICAgcHVibGljIEZyYWdtZW50IGdldEZyYWdtZW50KEJ1bmRsZSBidW5kbGUsIFN0cmluZyBrZXkpIHsKKyAgICAgICAgaW50IGluZGV4ID0gYnVuZGxlLmdldEludChrZXksIC0xKTsKKyAgICAgICAgaWYgKGluZGV4ID09IC0xKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgICAgICBpZiAoaW5kZXggPj0gbUFjdGl2ZS5zaXplKCkpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkZyYWdlbWVudCBubyBsb25nZXIgZXhpc3RzIGZvciBrZXkgIgorICAgICAgICAgICAgICAgICAgICArIGtleSArICI6IGluZGV4ICIgKyBpbmRleCk7CisgICAgICAgIH0KKyAgICAgICAgRnJhZ21lbnQgZiA9IG1BY3RpdmUuZ2V0KGluZGV4KTsKKyAgICAgICAgaWYgKGYgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiRnJhZ2VtZW50IG5vIGxvbmdlciBleGlzdHMgZm9yIGtleSAiCisgICAgICAgICAgICAgICAgICAgICsga2V5ICsgIjogaW5kZXggIiArIGluZGV4KTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZjsKKyAgICB9CisKKyAgICBBbmltYXRvciBsb2FkQW5pbWF0b3IoRnJhZ21lbnQgZnJhZ21lbnQsIGludCB0cmFuc2l0LCBib29sZWFuIGVudGVyLAorICAgICAgICAgICAgaW50IHRyYW5zaXRpb25TdHlsZSkgeworICAgICAgICBBbmltYXRvciBhbmltT2JqID0gZnJhZ21lbnQub25DcmVhdGVBbmltYXRvcih0cmFuc2l0LCBlbnRlciwKKyAgICAgICAgICAgICAgICBmcmFnbWVudC5tTmV4dEFuaW0pOworICAgICAgICBpZiAoYW5pbU9iaiAhPSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gYW5pbU9iajsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgaWYgKGZyYWdtZW50Lm1OZXh0QW5pbSAhPSAwKSB7CisgICAgICAgICAgICBBbmltYXRvciBhbmltID0gQW5pbWF0b3JJbmZsYXRlci5sb2FkQW5pbWF0b3IobUFjdGl2aXR5LCBmcmFnbWVudC5tTmV4dEFuaW0pOworICAgICAgICAgICAgaWYgKGFuaW0gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHJldHVybiBhbmltOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIAorICAgICAgICBpZiAodHJhbnNpdCA9PSAwKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgaW50IHN0eWxlSW5kZXggPSB0cmFuc2l0VG9TdHlsZUluZGV4KHRyYW5zaXQsIGVudGVyKTsKKyAgICAgICAgaWYgKHN0eWxlSW5kZXggPCAwKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgaWYgKHRyYW5zaXRpb25TdHlsZSA9PSAwICYmIG1BY3Rpdml0eS5nZXRXaW5kb3coKSAhPSBudWxsKSB7CisgICAgICAgICAgICB0cmFuc2l0aW9uU3R5bGUgPSBtQWN0aXZpdHkuZ2V0V2luZG93KCkuZ2V0QXR0cmlidXRlcygpLndpbmRvd0FuaW1hdGlvbnM7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHRyYW5zaXRpb25TdHlsZSA9PSAwKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgVHlwZWRBcnJheSBhdHRycyA9IG1BY3Rpdml0eS5vYnRhaW5TdHlsZWRBdHRyaWJ1dGVzKHRyYW5zaXRpb25TdHlsZSwKKyAgICAgICAgICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZS5GcmFnbWVudEFuaW1hdGlvbik7CisgICAgICAgIGludCBhbmltID0gYXR0cnMuZ2V0UmVzb3VyY2VJZChzdHlsZUluZGV4LCAwKTsKKyAgICAgICAgYXR0cnMucmVjeWNsZSgpOworICAgICAgICAKKyAgICAgICAgaWYgKGFuaW0gPT0gMCkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIHJldHVybiBBbmltYXRvckluZmxhdGVyLmxvYWRBbmltYXRvcihtQWN0aXZpdHksIGFuaW0pOworICAgIH0KKyAgICAKKyAgICB2b2lkIG1vdmVUb1N0YXRlKEZyYWdtZW50IGYsIGludCBuZXdTdGF0ZSwgaW50IHRyYW5zaXQsIGludCB0cmFuc2l0aW9uU3R5bGUpIHsKKyAgICAgICAgLy8gRnJhZ21lbnRzIHRoYXQgYXJlIG5vdCBjdXJyZW50bHkgYWRkZWQgd2lsbCBzaXQgaW4gdGhlIG9uQ3JlYXRlKCkgc3RhdGUuCisgICAgICAgIGlmICghZi5tQWRkZWQgJiYgbmV3U3RhdGUgPiBGcmFnbWVudC5DUkVBVEVEKSB7CisgICAgICAgICAgICBuZXdTdGF0ZSA9IEZyYWdtZW50LkNSRUFURUQ7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIGlmIChmLm1TdGF0ZSA8IG5ld1N0YXRlKSB7CisgICAgICAgICAgICBzd2l0Y2ggKGYubVN0YXRlKSB7CisgICAgICAgICAgICAgICAgY2FzZSBGcmFnbWVudC5JTklUSUFMSVpJTkc6CisgICAgICAgICAgICAgICAgICAgIGlmIChERUJVRykgTG9nLnYoVEFHLCAibW92ZXRvIENSRUFURUQ6ICIgKyBmKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGYubVNhdmVkRnJhZ21lbnRTdGF0ZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmLm1TYXZlZFZpZXdTdGF0ZSA9IGYubVNhdmVkRnJhZ21lbnRTdGF0ZS5nZXRTcGFyc2VQYXJjZWxhYmxlQXJyYXkoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZyYWdtZW50TWFuYWdlckltcGwuVklFV19TVEFURV9UQUcpOworICAgICAgICAgICAgICAgICAgICAgICAgZi5tVGFyZ2V0ID0gZ2V0RnJhZ21lbnQoZi5tU2F2ZWRGcmFnbWVudFN0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGcmFnbWVudE1hbmFnZXJJbXBsLlRBUkdFVF9TVEFURV9UQUcpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGYubVRhcmdldCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZi5tVGFyZ2V0UmVxdWVzdENvZGUgPSBmLm1TYXZlZEZyYWdtZW50U3RhdGUuZ2V0SW50KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRnJhZ21lbnRNYW5hZ2VySW1wbC5UQVJHRVRfUkVRVUVTVF9DT0RFX1NUQVRFX1RBRywgMCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZi5tQWN0aXZpdHkgPSBtQWN0aXZpdHk7CisgICAgICAgICAgICAgICAgICAgIGYubUNhbGxlZCA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICBmLm9uQXR0YWNoKG1BY3Rpdml0eSk7CisgICAgICAgICAgICAgICAgICAgIGlmICghZi5tQ2FsbGVkKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU3VwZXJOb3RDYWxsZWRFeGNlcHRpb24oIkZyYWdtZW50ICIgKyBmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBkaWQgbm90IGNhbGwgdGhyb3VnaCB0byBzdXBlci5vbkF0dGFjaCgpIik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgbUFjdGl2aXR5Lm9uQXR0YWNoRnJhZ21lbnQoZik7CisgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICBpZiAoIWYubVJldGFpbmluZykgeworICAgICAgICAgICAgICAgICAgICAgICAgZi5tQ2FsbGVkID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICBmLm9uQ3JlYXRlKGYubVNhdmVkRnJhZ21lbnRTdGF0ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWYubUNhbGxlZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBTdXBlck5vdENhbGxlZEV4Y2VwdGlvbigiRnJhZ21lbnQgIiArIGYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBkaWQgbm90IGNhbGwgdGhyb3VnaCB0byBzdXBlci5vbkNyZWF0ZSgpIik7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZi5tUmV0YWluaW5nID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIGlmIChmLm1Gcm9tTGF5b3V0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBGb3IgZnJhZ21lbnRzIHRoYXQgYXJlIHBhcnQgb2YgdGhlIGNvbnRlbnQgdmlldworICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGF5b3V0LCB3ZSBuZWVkIHRvIGluc3RhbnRpYXRlIHRoZSB2aWV3IGltbWVkaWF0ZWx5CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBhbmQgdGhlIGluZmxhdGVyIHdpbGwgdGFrZSBjYXJlIG9mIGFkZGluZyBpdC4KKyAgICAgICAgICAgICAgICAgICAgICAgIGYubVZpZXcgPSBmLm9uQ3JlYXRlVmlldyhtQWN0aXZpdHkuZ2V0TGF5b3V0SW5mbGF0ZXIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCwgZi5tU2F2ZWRGcmFnbWVudFN0YXRlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmLm1WaWV3ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmLm1WaWV3LnNldFNhdmVGcm9tUGFyZW50RW5hYmxlZChmYWxzZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZi5yZXN0b3JlVmlld1N0YXRlKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGYubUhpZGRlbikgZi5tVmlldy5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7IAorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY2FzZSBGcmFnbWVudC5DUkVBVEVEOgorICAgICAgICAgICAgICAgICAgICBpZiAobmV3U3RhdGUgPiBGcmFnbWVudC5DUkVBVEVEKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoREVCVUcpIExvZy52KFRBRywgIm1vdmV0byBDT05URU5UOiAiICsgZik7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWYubUZyb21MYXlvdXQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBWaWV3R3JvdXAgY29udGFpbmVyID0gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZi5tQ29udGFpbmVySWQgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250YWluZXIgPSAoVmlld0dyb3VwKW1BY3Rpdml0eS5maW5kVmlld0J5SWQoZi5tQ29udGFpbmVySWQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29udGFpbmVyID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIk5ldyB2aWV3IGZvdW5kIGZvciBpZCAweCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBJbnRlZ2VyLnRvSGV4U3RyaW5nKGYubUNvbnRhaW5lcklkKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgZm9yIGZyYWdtZW50ICIgKyBmKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmLm1Db250YWluZXIgPSBjb250YWluZXI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZi5tVmlldyA9IGYub25DcmVhdGVWaWV3KG1BY3Rpdml0eS5nZXRMYXlvdXRJbmZsYXRlcigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGFpbmVyLCBmLm1TYXZlZEZyYWdtZW50U3RhdGUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmLm1WaWV3ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZi5tVmlldy5zZXRTYXZlRnJvbVBhcmVudEVuYWJsZWQoZmFsc2UpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29udGFpbmVyICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFuaW1hdG9yIGFuaW0gPSBsb2FkQW5pbWF0b3IoZiwgdHJhbnNpdCwgdHJ1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNpdGlvblN0eWxlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhbmltICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmltLnNldFRhcmdldChmLm1WaWV3KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmltLnN0YXJ0KCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250YWluZXIuYWRkVmlldyhmLm1WaWV3KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGYucmVzdG9yZVZpZXdTdGF0ZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmLm1IaWRkZW4pIGYubVZpZXcuc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOyAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgIGYubUNhbGxlZCA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgZi5vbkFjdGl2aXR5Q3JlYXRlZChmLm1TYXZlZEZyYWdtZW50U3RhdGUpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFmLm1DYWxsZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU3VwZXJOb3RDYWxsZWRFeGNlcHRpb24oIkZyYWdtZW50ICIgKyBmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgZGlkIG5vdCBjYWxsIHRocm91Z2ggdG8gc3VwZXIub25SZWFkeSgpIik7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBmLm1TYXZlZEZyYWdtZW50U3RhdGUgPSBudWxsOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY2FzZSBGcmFnbWVudC5BQ1RJVklUWV9DUkVBVEVEOgorICAgICAgICAgICAgICAgICAgICBpZiAobmV3U3RhdGUgPiBGcmFnbWVudC5BQ1RJVklUWV9DUkVBVEVEKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoREVCVUcpIExvZy52KFRBRywgIm1vdmV0byBTVEFSVEVEOiAiICsgZik7CisgICAgICAgICAgICAgICAgICAgICAgICBmLm1DYWxsZWQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGYub25TdGFydCgpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFmLm1DYWxsZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU3VwZXJOb3RDYWxsZWRFeGNlcHRpb24oIkZyYWdtZW50ICIgKyBmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgZGlkIG5vdCBjYWxsIHRocm91Z2ggdG8gc3VwZXIub25TdGFydCgpIik7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjYXNlIEZyYWdtZW50LlNUQVJURUQ6CisgICAgICAgICAgICAgICAgICAgIGlmIChuZXdTdGF0ZSA+IEZyYWdtZW50LlNUQVJURUQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChERUJVRykgTG9nLnYoVEFHLCAibW92ZXRvIFJFU1VNRUQ6ICIgKyBmKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGYubUNhbGxlZCA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgZi5tUmVzdW1lZCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICBmLm9uUmVzdW1lKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWYubUNhbGxlZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBTdXBlck5vdENhbGxlZEV4Y2VwdGlvbigiRnJhZ21lbnQgIiArIGYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBkaWQgbm90IGNhbGwgdGhyb3VnaCB0byBzdXBlci5vblJlc3VtZSgpIik7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmIChmLm1TdGF0ZSA+IG5ld1N0YXRlKSB7CisgICAgICAgICAgICBzd2l0Y2ggKGYubVN0YXRlKSB7CisgICAgICAgICAgICAgICAgY2FzZSBGcmFnbWVudC5SRVNVTUVEOgorICAgICAgICAgICAgICAgICAgICBpZiAobmV3U3RhdGUgPCBGcmFnbWVudC5SRVNVTUVEKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoREVCVUcpIExvZy52KFRBRywgIm1vdmVmcm9tIFJFU1VNRUQ6ICIgKyBmKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGYubUNhbGxlZCA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgZi5vblBhdXNlKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWYubUNhbGxlZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBTdXBlck5vdENhbGxlZEV4Y2VwdGlvbigiRnJhZ21lbnQgIiArIGYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBkaWQgbm90IGNhbGwgdGhyb3VnaCB0byBzdXBlci5vblBhdXNlKCkiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGYubVJlc3VtZWQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNhc2UgRnJhZ21lbnQuU1RBUlRFRDoKKyAgICAgICAgICAgICAgICAgICAgaWYgKG5ld1N0YXRlIDwgRnJhZ21lbnQuU1RBUlRFRCkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKERFQlVHKSBMb2cudihUQUcsICJtb3ZlZnJvbSBTVEFSVEVEOiAiICsgZik7CisgICAgICAgICAgICAgICAgICAgICAgICBmLm1DYWxsZWQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGYucGVyZm9ybVN0b3AoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZi5tQ2FsbGVkKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFN1cGVyTm90Q2FsbGVkRXhjZXB0aW9uKCJGcmFnbWVudCAiICsgZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGRpZCBub3QgY2FsbCB0aHJvdWdoIHRvIHN1cGVyLm9uU3RvcCgpIik7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjYXNlIEZyYWdtZW50LkFDVElWSVRZX0NSRUFURUQ6CisgICAgICAgICAgICAgICAgICAgIGlmIChuZXdTdGF0ZSA8IEZyYWdtZW50LkFDVElWSVRZX0NSRUFURUQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChERUJVRykgTG9nLnYoVEFHLCAibW92ZWZyb20gQ09OVEVOVDogIiArIGYpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGYubVZpZXcgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5lZWQgdG8gc2F2ZSB0aGUgY3VycmVudCB2aWV3IHN0YXRlIGlmIG5vdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRvbmUgYWxyZWFkeS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIW1BY3Rpdml0eS5pc0ZpbmlzaGluZygpICYmIGYubVNhdmVkRnJhZ21lbnRTdGF0ZSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhdmVGcmFnbWVudFZpZXdTdGF0ZShmKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBmLm1DYWxsZWQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGYub25EZXN0cm95VmlldygpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFmLm1DYWxsZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU3VwZXJOb3RDYWxsZWRFeGNlcHRpb24oIkZyYWdtZW50ICIgKyBmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgZGlkIG5vdCBjYWxsIHRocm91Z2ggdG8gc3VwZXIub25EZXN0cm95ZWRWaWV3KCkiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmLm1WaWV3ICE9IG51bGwgJiYgZi5tQ29udGFpbmVyICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBbmltYXRvciBhbmltID0gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobUN1clN0YXRlID4gRnJhZ21lbnQuSU5JVElBTElaSU5HKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuaW0gPSBsb2FkQW5pbWF0b3IoZiwgdHJhbnNpdCwgZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNpdGlvblN0eWxlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFuaW0gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBWaWV3R3JvdXAgY29udGFpbmVyID0gZi5tQ29udGFpbmVyOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBWaWV3IHZpZXcgPSBmLm1WaWV3OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250YWluZXIuc3RhcnRWaWV3VHJhbnNpdGlvbih2aWV3KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5pbS5hZGRMaXN0ZW5lcihuZXcgQW5pbWF0b3JMaXN0ZW5lckFkYXB0ZXIoKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uQW5pbWF0aW9uRW5kKEFuaW1hdG9yIGFuaW0pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250YWluZXIuZW5kVmlld1RyYW5zaXRpb24odmlldyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmltLnNldFRhcmdldChmLm1WaWV3KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5pbS5zdGFydCgpOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGYubUNvbnRhaW5lci5yZW1vdmVWaWV3KGYubVZpZXcpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZi5tQ29udGFpbmVyID0gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGYubVZpZXcgPSBudWxsOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY2FzZSBGcmFnbWVudC5DUkVBVEVEOgorICAgICAgICAgICAgICAgICAgICBpZiAobmV3U3RhdGUgPCBGcmFnbWVudC5DUkVBVEVEKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoREVCVUcpIExvZy52KFRBRywgIm1vdmVmcm9tIENSRUFURUQ6ICIgKyBmKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZi5tUmV0YWluaW5nKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZi5tQ2FsbGVkID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZi5vbkRlc3Ryb3koKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWYubUNhbGxlZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU3VwZXJOb3RDYWxsZWRFeGNlcHRpb24oIkZyYWdtZW50ICIgKyBmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGRpZCBub3QgY2FsbCB0aHJvdWdoIHRvIHN1cGVyLm9uRGVzdHJveSgpIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICBmLm1DYWxsZWQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGYub25EZXRhY2goKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZi5tQ2FsbGVkKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFN1cGVyTm90Q2FsbGVkRXhjZXB0aW9uKCJGcmFnbWVudCAiICsgZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGRpZCBub3QgY2FsbCB0aHJvdWdoIHRvIHN1cGVyLm9uRGV0YWNoKCkiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGYubUltbWVkaWF0ZUFjdGl2aXR5ID0gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGYubUFjdGl2aXR5ID0gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIAorICAgICAgICBmLm1TdGF0ZSA9IG5ld1N0YXRlOworICAgIH0KKyAgICAKKyAgICB2b2lkIG1vdmVUb1N0YXRlKGludCBuZXdTdGF0ZSwgYm9vbGVhbiBhbHdheXMpIHsKKyAgICAgICAgbW92ZVRvU3RhdGUobmV3U3RhdGUsIDAsIDAsIGFsd2F5cyk7CisgICAgfQorICAgIAorICAgIHZvaWQgbW92ZVRvU3RhdGUoaW50IG5ld1N0YXRlLCBpbnQgdHJhbnNpdCwgaW50IHRyYW5zaXRTdHlsZSwgYm9vbGVhbiBhbHdheXMpIHsKKyAgICAgICAgaWYgKG1BY3Rpdml0eSA9PSBudWxsICYmIG5ld1N0YXRlICE9IEZyYWdtZW50LklOSVRJQUxJWklORykgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiTm8gYWN0aXZpdHkiKTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgaWYgKCFhbHdheXMgJiYgbUN1clN0YXRlID09IG5ld1N0YXRlKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIG1DdXJTdGF0ZSA9IG5ld1N0YXRlOworICAgICAgICBpZiAobUFjdGl2ZSAhPSBudWxsKSB7CisgICAgICAgICAgICBmb3IgKGludCBpPTA7IGk8bUFjdGl2ZS5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgICAgIEZyYWdtZW50IGYgPSBtQWN0aXZlLmdldChpKTsKKyAgICAgICAgICAgICAgICBpZiAoZiAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIG1vdmVUb1N0YXRlKGYsIG5ld1N0YXRlLCB0cmFuc2l0LCB0cmFuc2l0U3R5bGUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKG1OZWVkTWVudUludmFsaWRhdGUgJiYgbUFjdGl2aXR5ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBtQWN0aXZpdHkuaW52YWxpZGF0ZU9wdGlvbnNNZW51KCk7CisgICAgICAgICAgICAgICAgbU5lZWRNZW51SW52YWxpZGF0ZSA9IGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIAorICAgIHZvaWQgbWFrZUFjdGl2ZShGcmFnbWVudCBmKSB7CisgICAgICAgIGlmIChmLm1JbmRleCA+PSAwKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIGlmIChtQXZhaWxJbmRpY2VzID09IG51bGwgfHwgbUF2YWlsSW5kaWNlcy5zaXplKCkgPD0gMCkgeworICAgICAgICAgICAgaWYgKG1BY3RpdmUgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG1BY3RpdmUgPSBuZXcgQXJyYXlMaXN0PEZyYWdtZW50PigpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZi5zZXRJbmRleChtQWN0aXZlLnNpemUoKSk7CisgICAgICAgICAgICBtQWN0aXZlLmFkZChmKTsKKyAgICAgICAgICAgIAorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZi5zZXRJbmRleChtQXZhaWxJbmRpY2VzLnJlbW92ZShtQXZhaWxJbmRpY2VzLnNpemUoKS0xKSk7CisgICAgICAgICAgICBtQWN0aXZlLnNldChmLm1JbmRleCwgZik7CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgdm9pZCBtYWtlSW5hY3RpdmUoRnJhZ21lbnQgZikgeworICAgICAgICBpZiAoZi5tSW5kZXggPCAwKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIGlmIChERUJVRykgTG9nLnYoVEFHLCAiRnJlZWluZyBmcmFnbWVudCBpbmRleCAiICsgZi5tSW5kZXgpOworICAgICAgICBtQWN0aXZlLnNldChmLm1JbmRleCwgbnVsbCk7CisgICAgICAgIGlmIChtQXZhaWxJbmRpY2VzID09IG51bGwpIHsKKyAgICAgICAgICAgIG1BdmFpbEluZGljZXMgPSBuZXcgQXJyYXlMaXN0PEludGVnZXI+KCk7CisgICAgICAgIH0KKyAgICAgICAgbUF2YWlsSW5kaWNlcy5hZGQoZi5tSW5kZXgpOworICAgICAgICBtQWN0aXZpdHkuaW52YWxpZGF0ZUZyYWdtZW50SW5kZXgoZi5tSW5kZXgpOworICAgICAgICBmLmNsZWFySW5kZXgoKTsKKyAgICB9CisgICAgCisgICAgcHVibGljIHZvaWQgYWRkRnJhZ21lbnQoRnJhZ21lbnQgZnJhZ21lbnQsIGJvb2xlYW4gbW92ZVRvU3RhdGVOb3cpIHsKKyAgICAgICAgaWYgKG1BZGRlZCA9PSBudWxsKSB7CisgICAgICAgICAgICBtQWRkZWQgPSBuZXcgQXJyYXlMaXN0PEZyYWdtZW50PigpOworICAgICAgICB9CisgICAgICAgIG1BZGRlZC5hZGQoZnJhZ21lbnQpOworICAgICAgICBtYWtlQWN0aXZlKGZyYWdtZW50KTsKKyAgICAgICAgaWYgKERFQlVHKSBMb2cudihUQUcsICJhZGQ6ICIgKyBmcmFnbWVudCk7CisgICAgICAgIGZyYWdtZW50Lm1BZGRlZCA9IHRydWU7CisgICAgICAgIGlmIChmcmFnbWVudC5tSGFzTWVudSkgeworICAgICAgICAgICAgbU5lZWRNZW51SW52YWxpZGF0ZSA9IHRydWU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1vdmVUb1N0YXRlTm93KSB7CisgICAgICAgICAgICBtb3ZlVG9TdGF0ZShmcmFnbWVudCwgbUN1clN0YXRlLCAwLCAwKTsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICBwdWJsaWMgdm9pZCByZW1vdmVGcmFnbWVudChGcmFnbWVudCBmcmFnbWVudCwgaW50IHRyYW5zaXRpb24sIGludCB0cmFuc2l0aW9uU3R5bGUpIHsKKyAgICAgICAgaWYgKERFQlVHKSBMb2cudihUQUcsICJyZW1vdmU6ICIgKyBmcmFnbWVudCArICIgbmVzdGluZz0iICsgZnJhZ21lbnQubUJhY2tTdGFja05lc3RpbmcpOworICAgICAgICBtQWRkZWQucmVtb3ZlKGZyYWdtZW50KTsKKyAgICAgICAgZmluYWwgYm9vbGVhbiBpbmFjdGl2ZSA9IGZyYWdtZW50Lm1CYWNrU3RhY2tOZXN0aW5nIDw9IDA7CisgICAgICAgIGlmIChmcmFnbWVudC5tSGFzTWVudSkgeworICAgICAgICAgICAgbU5lZWRNZW51SW52YWxpZGF0ZSA9IHRydWU7CisgICAgICAgIH0KKyAgICAgICAgZnJhZ21lbnQubUFkZGVkID0gZmFsc2U7CisgICAgICAgIG1vdmVUb1N0YXRlKGZyYWdtZW50LCBpbmFjdGl2ZSA/IEZyYWdtZW50LklOSVRJQUxJWklORyA6IEZyYWdtZW50LkNSRUFURUQsCisgICAgICAgICAgICAgICAgdHJhbnNpdGlvbiwgdHJhbnNpdGlvblN0eWxlKTsKKyAgICAgICAgaWYgKGluYWN0aXZlKSB7CisgICAgICAgICAgICBtYWtlSW5hY3RpdmUoZnJhZ21lbnQpOworICAgICAgICB9CisgICAgfQorICAgIAorICAgIHB1YmxpYyB2b2lkIGhpZGVGcmFnbWVudChGcmFnbWVudCBmcmFnbWVudCwgaW50IHRyYW5zaXRpb24sIGludCB0cmFuc2l0aW9uU3R5bGUpIHsKKyAgICAgICAgaWYgKERFQlVHKSBMb2cudihUQUcsICJoaWRlOiAiICsgZnJhZ21lbnQpOworICAgICAgICBpZiAoIWZyYWdtZW50Lm1IaWRkZW4pIHsKKyAgICAgICAgICAgIGZyYWdtZW50Lm1IaWRkZW4gPSB0cnVlOworICAgICAgICAgICAgaWYgKGZyYWdtZW50Lm1WaWV3ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBBbmltYXRvciBhbmltID0gbG9hZEFuaW1hdG9yKGZyYWdtZW50LCB0cmFuc2l0aW9uLCB0cnVlLAorICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNpdGlvblN0eWxlKTsKKyAgICAgICAgICAgICAgICBpZiAoYW5pbSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGFuaW0uc2V0VGFyZ2V0KGZyYWdtZW50Lm1WaWV3KTsKKyAgICAgICAgICAgICAgICAgICAgYW5pbS5zdGFydCgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBmcmFnbWVudC5tVmlldy5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoZnJhZ21lbnQubUFkZGVkICYmIGZyYWdtZW50Lm1IYXNNZW51KSB7CisgICAgICAgICAgICAgICAgbU5lZWRNZW51SW52YWxpZGF0ZSA9IHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmcmFnbWVudC5vbkhpZGRlbkNoYW5nZWQodHJ1ZSk7CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgcHVibGljIHZvaWQgc2hvd0ZyYWdtZW50KEZyYWdtZW50IGZyYWdtZW50LCBpbnQgdHJhbnNpdGlvbiwgaW50IHRyYW5zaXRpb25TdHlsZSkgeworICAgICAgICBpZiAoREVCVUcpIExvZy52KFRBRywgInNob3c6ICIgKyBmcmFnbWVudCk7CisgICAgICAgIGlmIChmcmFnbWVudC5tSGlkZGVuKSB7CisgICAgICAgICAgICBmcmFnbWVudC5tSGlkZGVuID0gZmFsc2U7CisgICAgICAgICAgICBpZiAoZnJhZ21lbnQubVZpZXcgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIEFuaW1hdG9yIGFuaW0gPSBsb2FkQW5pbWF0b3IoZnJhZ21lbnQsIHRyYW5zaXRpb24sIHRydWUsCisgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2l0aW9uU3R5bGUpOworICAgICAgICAgICAgICAgIGlmIChhbmltICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgYW5pbS5zZXRUYXJnZXQoZnJhZ21lbnQubVZpZXcpOworICAgICAgICAgICAgICAgICAgICBhbmltLnN0YXJ0KCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGZyYWdtZW50Lm1WaWV3LnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChmcmFnbWVudC5tQWRkZWQgJiYgZnJhZ21lbnQubUhhc01lbnUpIHsKKyAgICAgICAgICAgICAgICBtTmVlZE1lbnVJbnZhbGlkYXRlID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZyYWdtZW50Lm9uSGlkZGVuQ2hhbmdlZChmYWxzZSk7CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgcHVibGljIEZyYWdtZW50IGZpbmRGcmFnbWVudEJ5SWQoaW50IGlkKSB7CisgICAgICAgIGlmIChtQWN0aXZlICE9IG51bGwpIHsKKyAgICAgICAgICAgIC8vIEZpcnN0IGxvb2sgdGhyb3VnaCBhZGRlZCBmcmFnbWVudHMuCisgICAgICAgICAgICBmb3IgKGludCBpPW1BZGRlZC5zaXplKCktMTsgaT49MDsgaS0tKSB7CisgICAgICAgICAgICAgICAgRnJhZ21lbnQgZiA9IG1BZGRlZC5nZXQoaSk7CisgICAgICAgICAgICAgICAgaWYgKGYgIT0gbnVsbCAmJiBmLm1GcmFnbWVudElkID09IGlkKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIE5vdyBmb3IgYW55IGtub3duIGZyYWdtZW50LgorICAgICAgICAgICAgZm9yIChpbnQgaT1tQWN0aXZlLnNpemUoKS0xOyBpPj0wOyBpLS0pIHsKKyAgICAgICAgICAgICAgICBGcmFnbWVudCBmID0gbUFjdGl2ZS5nZXQoaSk7CisgICAgICAgICAgICAgICAgaWYgKGYgIT0gbnVsbCAmJiBmLm1GcmFnbWVudElkID09IGlkKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisgICAgCisgICAgcHVibGljIEZyYWdtZW50IGZpbmRGcmFnbWVudEJ5VGFnKFN0cmluZyB0YWcpIHsKKyAgICAgICAgaWYgKG1BY3RpdmUgIT0gbnVsbCAmJiB0YWcgIT0gbnVsbCkgeworICAgICAgICAgICAgLy8gRmlyc3QgbG9vayB0aHJvdWdoIGFkZGVkIGZyYWdtZW50cy4KKyAgICAgICAgICAgIGZvciAoaW50IGk9bUFkZGVkLnNpemUoKS0xOyBpPj0wOyBpLS0pIHsKKyAgICAgICAgICAgICAgICBGcmFnbWVudCBmID0gbUFkZGVkLmdldChpKTsKKyAgICAgICAgICAgICAgICBpZiAoZiAhPSBudWxsICYmIHRhZy5lcXVhbHMoZi5tVGFnKSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBOb3cgZm9yIGFueSBrbm93biBmcmFnbWVudC4KKyAgICAgICAgICAgIGZvciAoaW50IGk9bUFjdGl2ZS5zaXplKCktMTsgaT49MDsgaS0tKSB7CisgICAgICAgICAgICAgICAgRnJhZ21lbnQgZiA9IG1BY3RpdmUuZ2V0KGkpOworICAgICAgICAgICAgICAgIGlmIChmICE9IG51bGwgJiYgdGFnLmVxdWFscyhmLm1UYWcpKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisgICAgCisgICAgcHVibGljIEZyYWdtZW50IGZpbmRGcmFnbWVudEJ5V2hvKFN0cmluZyB3aG8pIHsKKyAgICAgICAgaWYgKG1BY3RpdmUgIT0gbnVsbCAmJiB3aG8gIT0gbnVsbCkgeworICAgICAgICAgICAgZm9yIChpbnQgaT1tQWN0aXZlLnNpemUoKS0xOyBpPj0wOyBpLS0pIHsKKyAgICAgICAgICAgICAgICBGcmFnbWVudCBmID0gbUFjdGl2ZS5nZXQoaSk7CisgICAgICAgICAgICAgICAgaWYgKGYgIT0gbnVsbCAmJiB3aG8uZXF1YWxzKGYubVdobykpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGY7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgdm9pZCBlbnF1ZXVlQWN0aW9uKFJ1bm5hYmxlIGFjdGlvbikgeworICAgICAgICBpZiAobVN0YXRlU2F2ZWQpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICJDYW4gbm90IHBlcmZvcm0gdGhpcyBhY3Rpb24gYWZ0ZXIgb25TYXZlSW5zdGFuY2VTdGF0ZSIpOworICAgICAgICB9CisgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgeworICAgICAgICAgICAgaWYgKG1QZW5kaW5nQWN0aW9ucyA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgbVBlbmRpbmdBY3Rpb25zID0gbmV3IEFycmF5TGlzdDxSdW5uYWJsZT4oKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1QZW5kaW5nQWN0aW9ucy5hZGQoYWN0aW9uKTsKKyAgICAgICAgICAgIGlmIChtUGVuZGluZ0FjdGlvbnMuc2l6ZSgpID09IDEpIHsKKyAgICAgICAgICAgICAgICBtQWN0aXZpdHkubUhhbmRsZXIucmVtb3ZlQ2FsbGJhY2tzKG1FeGVjQ29tbWl0KTsKKyAgICAgICAgICAgICAgICBtQWN0aXZpdHkubUhhbmRsZXIucG9zdChtRXhlY0NvbW1pdCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgcHVibGljIGludCBhbGxvY0JhY2tTdGFja0luZGV4KEJhY2tTdGFja0VudHJ5IGJzZSkgeworICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKKyAgICAgICAgICAgIGlmIChtQXZhaWxCYWNrU3RhY2tJbmRpY2VzID09IG51bGwgfHwgbUF2YWlsQmFja1N0YWNrSW5kaWNlcy5zaXplKCkgPD0gMCkgeworICAgICAgICAgICAgICAgIGlmIChtQmFja1N0YWNrSW5kaWNlcyA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIG1CYWNrU3RhY2tJbmRpY2VzID0gbmV3IEFycmF5TGlzdDxCYWNrU3RhY2tFbnRyeT4oKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaW50IGluZGV4ID0gbUJhY2tTdGFja0luZGljZXMuc2l6ZSgpOworICAgICAgICAgICAgICAgIGlmIChERUJVRykgTG9nLnYoVEFHLCAiU2V0dGluZyBiYWNrIHN0YWNrIGluZGV4ICIgKyBpbmRleCArICIgdG8gIiArIGJzZSk7CisgICAgICAgICAgICAgICAgbUJhY2tTdGFja0luZGljZXMuYWRkKGJzZSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIGluZGV4OworCisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGludCBpbmRleCA9IG1BdmFpbEJhY2tTdGFja0luZGljZXMucmVtb3ZlKG1BdmFpbEJhY2tTdGFja0luZGljZXMuc2l6ZSgpLTEpOworICAgICAgICAgICAgICAgIGlmIChERUJVRykgTG9nLnYoVEFHLCAiQWRkaW5nIGJhY2sgc3RhY2sgaW5kZXggIiArIGluZGV4ICsgIiB3aXRoICIgKyBic2UpOworICAgICAgICAgICAgICAgIG1CYWNrU3RhY2tJbmRpY2VzLnNldChpbmRleCwgYnNlKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gaW5kZXg7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRCYWNrU3RhY2tJbmRleChpbnQgaW5kZXgsIEJhY2tTdGFja0VudHJ5IGJzZSkgeworICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKKyAgICAgICAgICAgIGlmIChtQmFja1N0YWNrSW5kaWNlcyA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgbUJhY2tTdGFja0luZGljZXMgPSBuZXcgQXJyYXlMaXN0PEJhY2tTdGFja0VudHJ5PigpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaW50IE4gPSBtQmFja1N0YWNrSW5kaWNlcy5zaXplKCk7CisgICAgICAgICAgICBpZiAoaW5kZXggPCBOKSB7CisgICAgICAgICAgICAgICAgaWYgKERFQlVHKSBMb2cudihUQUcsICJTZXR0aW5nIGJhY2sgc3RhY2sgaW5kZXggIiArIGluZGV4ICsgIiB0byAiICsgYnNlKTsKKyAgICAgICAgICAgICAgICBtQmFja1N0YWNrSW5kaWNlcy5zZXQoaW5kZXgsIGJzZSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHdoaWxlIChOIDwgaW5kZXgpIHsKKyAgICAgICAgICAgICAgICAgICAgbUJhY2tTdGFja0luZGljZXMuYWRkKG51bGwpOworICAgICAgICAgICAgICAgICAgICBpZiAobUF2YWlsQmFja1N0YWNrSW5kaWNlcyA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtQXZhaWxCYWNrU3RhY2tJbmRpY2VzID0gbmV3IEFycmF5TGlzdDxJbnRlZ2VyPigpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChERUJVRykgTG9nLnYoVEFHLCAiQWRkaW5nIGF2YWlsYWJsZSBiYWNrIHN0YWNrIGluZGV4ICIgKyBOKTsKKyAgICAgICAgICAgICAgICAgICAgbUF2YWlsQmFja1N0YWNrSW5kaWNlcy5hZGQoTik7CisgICAgICAgICAgICAgICAgICAgIE4rKzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKERFQlVHKSBMb2cudihUQUcsICJBZGRpbmcgYmFjayBzdGFjayBpbmRleCAiICsgaW5kZXggKyAiIHdpdGggIiArIGJzZSk7CisgICAgICAgICAgICAgICAgbUJhY2tTdGFja0luZGljZXMuYWRkKGJzZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBmcmVlQmFja1N0YWNrSW5kZXgoaW50IGluZGV4KSB7CisgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgeworICAgICAgICAgICAgbUJhY2tTdGFja0luZGljZXMuc2V0KGluZGV4LCBudWxsKTsKKyAgICAgICAgICAgIGlmIChtQXZhaWxCYWNrU3RhY2tJbmRpY2VzID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBtQXZhaWxCYWNrU3RhY2tJbmRpY2VzID0gbmV3IEFycmF5TGlzdDxJbnRlZ2VyPigpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKERFQlVHKSBMb2cudihUQUcsICJGcmVlaW5nIGJhY2sgc3RhY2sgaW5kZXggIiArIGluZGV4KTsKKyAgICAgICAgICAgIG1BdmFpbEJhY2tTdGFja0luZGljZXMuYWRkKGluZGV4KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIE9ubHkgY2FsbCBmcm9tIG1haW4gdGhyZWFkIQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGV4ZWNQZW5kaW5nQWN0aW9ucygpIHsKKyAgICAgICAgaWYgKG1FeGVjdXRpbmdBY3Rpb25zKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJSZWN1cnNpdmUgZW50cnkgdG8gZXhlY1BlbmRpbmdBY3Rpb25zIik7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgICAgICBpbnQgbnVtQWN0aW9uczsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7CisgICAgICAgICAgICAgICAgaWYgKG1QZW5kaW5nQWN0aW9ucyA9PSBudWxsIHx8IG1QZW5kaW5nQWN0aW9ucy5zaXplKCkgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIG51bUFjdGlvbnMgPSBtUGVuZGluZ0FjdGlvbnMuc2l6ZSgpOworICAgICAgICAgICAgICAgIGlmIChtVG1wQWN0aW9ucyA9PSBudWxsIHx8IG1UbXBBY3Rpb25zLmxlbmd0aCA8IG51bUFjdGlvbnMpIHsKKyAgICAgICAgICAgICAgICAgICAgbVRtcEFjdGlvbnMgPSBuZXcgUnVubmFibGVbbnVtQWN0aW9uc107CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG1QZW5kaW5nQWN0aW9ucy50b0FycmF5KG1UbXBBY3Rpb25zKTsKKyAgICAgICAgICAgICAgICBtUGVuZGluZ0FjdGlvbnMuY2xlYXIoKTsKKyAgICAgICAgICAgICAgICBtQWN0aXZpdHkubUhhbmRsZXIucmVtb3ZlQ2FsbGJhY2tzKG1FeGVjQ29tbWl0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIAorICAgICAgICAgICAgbUV4ZWN1dGluZ0FjdGlvbnMgPSB0cnVlOworICAgICAgICAgICAgZm9yIChpbnQgaT0wOyBpPG51bUFjdGlvbnM7IGkrKykgeworICAgICAgICAgICAgICAgIG1UbXBBY3Rpb25zW2ldLnJ1bigpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbUV4ZWN1dGluZ0FjdGlvbnMgPSBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICBwdWJsaWMgdm9pZCBhZGRCYWNrU3RhY2tTdGF0ZShCYWNrU3RhY2tFbnRyeSBzdGF0ZSkgeworICAgICAgICBpZiAobUJhY2tTdGFjayA9PSBudWxsKSB7CisgICAgICAgICAgICBtQmFja1N0YWNrID0gbmV3IEFycmF5TGlzdDxCYWNrU3RhY2tFbnRyeT4oKTsKKyAgICAgICAgfQorICAgICAgICBtQmFja1N0YWNrLmFkZChzdGF0ZSk7CisgICAgfQorICAgIAorICAgIGJvb2xlYW4gcG9wQmFja1N0YWNrU3RhdGUoSGFuZGxlciBoYW5kbGVyLCBTdHJpbmcgbmFtZSwgaW50IGlkLCBpbnQgZmxhZ3MpIHsKKyAgICAgICAgaWYgKG1CYWNrU3RhY2sgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGlmIChuYW1lID09IG51bGwgJiYgaWQgPCAwICYmIChmbGFncyZBY3Rpdml0eS5QT1BfQkFDS19TVEFDS19JTkNMVVNJVkUpID09IDApIHsKKyAgICAgICAgICAgIGludCBsYXN0ID0gbUJhY2tTdGFjay5zaXplKCktMTsKKyAgICAgICAgICAgIGlmIChsYXN0IDwgMCkgeworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZpbmFsIEJhY2tTdGFja0VudHJ5IGJzcyA9IG1CYWNrU3RhY2sucmVtb3ZlKGxhc3QpOworICAgICAgICAgICAgZW5xdWV1ZUFjdGlvbihuZXcgUnVubmFibGUoKSB7CisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgICAgICBpZiAoREVCVUcpIExvZy52KFRBRywgIlBvcHBpbmcgYmFjayBzdGFjayBzdGF0ZTogIiArIGJzcyk7CisgICAgICAgICAgICAgICAgICAgIGJzcy5wb3BGcm9tQmFja1N0YWNrKHRydWUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaW50IGluZGV4ID0gLTE7CisgICAgICAgICAgICBpZiAobmFtZSAhPSBudWxsIHx8IGlkID49IDApIHsKKyAgICAgICAgICAgICAgICAvLyBJZiBhIG5hbWUgb3IgSUQgaXMgc3BlY2lmaWVkLCBsb29rIGZvciB0aGF0IHBsYWNlIGluCisgICAgICAgICAgICAgICAgLy8gdGhlIHN0YWNrLgorICAgICAgICAgICAgICAgIGluZGV4ID0gbUJhY2tTdGFjay5zaXplKCktMTsKKyAgICAgICAgICAgICAgICB3aGlsZSAoaW5kZXggPj0gMCkgeworICAgICAgICAgICAgICAgICAgICBCYWNrU3RhY2tFbnRyeSBic3MgPSBtQmFja1N0YWNrLmdldChpbmRleCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IG51bGwgJiYgbmFtZS5lcXVhbHMoYnNzLmdldE5hbWUoKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChpZCA+PSAwICYmIGlkID09IGJzcy5tSW5kZXgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGluZGV4LS07CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChpbmRleCA8IDApIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoKGZsYWdzJkFjdGl2aXR5LlBPUF9CQUNLX1NUQUNLX0lOQ0xVU0lWRSkgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICBpbmRleC0tOworICAgICAgICAgICAgICAgICAgICAvLyBDb25zdW1lIGFsbCBmb2xsb3dpbmcgZW50cmllcyB0aGF0IG1hdGNoLgorICAgICAgICAgICAgICAgICAgICB3aGlsZSAoaW5kZXggPj0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgQmFja1N0YWNrRW50cnkgYnNzID0gbUJhY2tTdGFjay5nZXQoaW5kZXgpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChuYW1lICE9IG51bGwgJiYgbmFtZS5lcXVhbHMoYnNzLmdldE5hbWUoKSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IChpZCA+PSAwICYmIGlkID09IGJzcy5tSW5kZXgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXgtLTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGluZGV4ID09IG1CYWNrU3RhY2suc2l6ZSgpLTEpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmaW5hbCBBcnJheUxpc3Q8QmFja1N0YWNrRW50cnk+IHN0YXRlcworICAgICAgICAgICAgICAgICAgICA9IG5ldyBBcnJheUxpc3Q8QmFja1N0YWNrRW50cnk+KCk7CisgICAgICAgICAgICBmb3IgKGludCBpPW1CYWNrU3RhY2suc2l6ZSgpLTE7IGk+aW5kZXg7IGktLSkgeworICAgICAgICAgICAgICAgIHN0YXRlcy5hZGQobUJhY2tTdGFjay5yZW1vdmUoaSkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZW5xdWV1ZUFjdGlvbihuZXcgUnVubmFibGUoKSB7CisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgTEFTVCA9IHN0YXRlcy5zaXplKCktMTsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaT0wOyBpPD1MQVNUOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChERUJVRykgTG9nLnYoVEFHLCAiUG9wcGluZyBiYWNrIHN0YWNrIHN0YXRlOiAiICsgc3RhdGVzLmdldChpKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZXMuZ2V0KGkpLnBvcEZyb21CYWNrU3RhY2soaSA9PSBMQVNUKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworICAgICAgICB9CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICAKKyAgICBBcnJheUxpc3Q8RnJhZ21lbnQ+IHJldGFpbk5vbkNvbmZpZygpIHsKKyAgICAgICAgQXJyYXlMaXN0PEZyYWdtZW50PiBmcmFnbWVudHMgPSBudWxsOworICAgICAgICBpZiAobUFjdGl2ZSAhPSBudWxsKSB7CisgICAgICAgICAgICBmb3IgKGludCBpPTA7IGk8bUFjdGl2ZS5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgICAgIEZyYWdtZW50IGYgPSBtQWN0aXZlLmdldChpKTsKKyAgICAgICAgICAgICAgICBpZiAoZiAhPSBudWxsICYmIGYubVJldGFpbkluc3RhbmNlKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChmcmFnbWVudHMgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgZnJhZ21lbnRzID0gbmV3IEFycmF5TGlzdDxGcmFnbWVudD4oKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBmcmFnbWVudHMuYWRkKGYpOworICAgICAgICAgICAgICAgICAgICBmLm1SZXRhaW5pbmcgPSB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZnJhZ21lbnRzOworICAgIH0KKyAgICAKKyAgICB2b2lkIHNhdmVGcmFnbWVudFZpZXdTdGF0ZShGcmFnbWVudCBmKSB7CisgICAgICAgIGlmIChmLm1WaWV3ID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBpZiAobVN0YXRlQXJyYXkgPT0gbnVsbCkgeworICAgICAgICAgICAgbVN0YXRlQXJyYXkgPSBuZXcgU3BhcnNlQXJyYXk8UGFyY2VsYWJsZT4oKTsKKyAgICAgICAgfQorICAgICAgICBmLm1WaWV3LnNhdmVIaWVyYXJjaHlTdGF0ZShtU3RhdGVBcnJheSk7CisgICAgICAgIGlmIChtU3RhdGVBcnJheS5zaXplKCkgPiAwKSB7CisgICAgICAgICAgICBmLm1TYXZlZFZpZXdTdGF0ZSA9IG1TdGF0ZUFycmF5OworICAgICAgICAgICAgbVN0YXRlQXJyYXkgPSBudWxsOworICAgICAgICB9CisgICAgfQorICAgIAorICAgIFBhcmNlbGFibGUgc2F2ZUFsbFN0YXRlKCkgeworICAgICAgICBtU3RhdGVTYXZlZCA9IHRydWU7CisKKyAgICAgICAgaWYgKG1BY3RpdmUgPT0gbnVsbCB8fCBtQWN0aXZlLnNpemUoKSA8PSAwKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgLy8gRmlyc3QgY29sbGVjdCBhbGwgYWN0aXZlIGZyYWdtZW50cy4KKyAgICAgICAgaW50IE4gPSBtQWN0aXZlLnNpemUoKTsKKyAgICAgICAgRnJhZ21lbnRTdGF0ZVtdIGFjdGl2ZSA9IG5ldyBGcmFnbWVudFN0YXRlW05dOworICAgICAgICBib29sZWFuIGhhdmVGcmFnbWVudHMgPSBmYWxzZTsKKyAgICAgICAgZm9yIChpbnQgaT0wOyBpPE47IGkrKykgeworICAgICAgICAgICAgRnJhZ21lbnQgZiA9IG1BY3RpdmUuZ2V0KGkpOworICAgICAgICAgICAgaWYgKGYgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGhhdmVGcmFnbWVudHMgPSB0cnVlOworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIEZyYWdtZW50U3RhdGUgZnMgPSBuZXcgRnJhZ21lbnRTdGF0ZShmKTsKKyAgICAgICAgICAgICAgICBhY3RpdmVbaV0gPSBmczsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBpZiAobVN0YXRlQnVuZGxlID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgbVN0YXRlQnVuZGxlID0gbmV3IEJ1bmRsZSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBmLm9uU2F2ZUluc3RhbmNlU3RhdGUobVN0YXRlQnVuZGxlKTsKKyAgICAgICAgICAgICAgICBpZiAoIW1TdGF0ZUJ1bmRsZS5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgZnMubVNhdmVkRnJhZ21lbnRTdGF0ZSA9IG1TdGF0ZUJ1bmRsZTsKKyAgICAgICAgICAgICAgICAgICAgbVN0YXRlQnVuZGxlID0gbnVsbDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgaWYgKGYubVZpZXcgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBzYXZlRnJhZ21lbnRWaWV3U3RhdGUoZik7CisgICAgICAgICAgICAgICAgICAgIGlmIChmLm1TYXZlZFZpZXdTdGF0ZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZnMubVNhdmVkRnJhZ21lbnRTdGF0ZSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnMubVNhdmVkRnJhZ21lbnRTdGF0ZSA9IG5ldyBCdW5kbGUoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGZzLm1TYXZlZEZyYWdtZW50U3RhdGUucHV0U3BhcnNlUGFyY2VsYWJsZUFycmF5KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGcmFnbWVudE1hbmFnZXJJbXBsLlZJRVdfU1RBVEVfVEFHLCBmLm1TYXZlZFZpZXdTdGF0ZSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoZi5tVGFyZ2V0ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGZzLm1TYXZlZEZyYWdtZW50U3RhdGUgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgZnMubVNhdmVkRnJhZ21lbnRTdGF0ZSA9IG5ldyBCdW5kbGUoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBwdXRGcmFnbWVudChmcy5tU2F2ZWRGcmFnbWVudFN0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZyYWdtZW50TWFuYWdlckltcGwuVEFSR0VUX1NUQVRFX1RBRywgZi5tVGFyZ2V0KTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGYubVRhcmdldFJlcXVlc3RDb2RlICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZzLm1TYXZlZEZyYWdtZW50U3RhdGUucHV0SW50KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGcmFnbWVudE1hbmFnZXJJbXBsLlRBUkdFVF9SRVFVRVNUX0NPREVfU1RBVEVfVEFHLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmLm1UYXJnZXRSZXF1ZXN0Q29kZSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgaWYgKERFQlVHKSBMb2cudihUQUcsICJTYXZlZCBzdGF0ZSBvZiAiICsgZiArICI6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICsgZnMubVNhdmVkRnJhZ21lbnRTdGF0ZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIGlmICghaGF2ZUZyYWdtZW50cykgeworICAgICAgICAgICAgaWYgKERFQlVHKSBMb2cudihUQUcsICJzYXZlQWxsU3RhdGU6IG5vIGZyYWdtZW50cyEiKTsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBpbnRbXSBhZGRlZCA9IG51bGw7CisgICAgICAgIEJhY2tTdGFja1N0YXRlW10gYmFja1N0YWNrID0gbnVsbDsKKyAgICAgICAgCisgICAgICAgIC8vIEJ1aWxkIGxpc3Qgb2YgY3VycmVudGx5IGFkZGVkIGZyYWdtZW50cy4KKyAgICAgICAgTiA9IG1BZGRlZC5zaXplKCk7CisgICAgICAgIGlmIChOID4gMCkgeworICAgICAgICAgICAgYWRkZWQgPSBuZXcgaW50W05dOworICAgICAgICAgICAgZm9yIChpbnQgaT0wOyBpPE47IGkrKykgeworICAgICAgICAgICAgICAgIGFkZGVkW2ldID0gbUFkZGVkLmdldChpKS5tSW5kZXg7CisgICAgICAgICAgICAgICAgaWYgKERFQlVHKSBMb2cudihUQUcsICJzYXZlQWxsU3RhdGU6IGFkZGluZyBmcmFnbWVudCAjIiArIGkKKyAgICAgICAgICAgICAgICAgICAgICAgICsgIjogIiArIG1BZGRlZC5nZXQoaSkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIAorICAgICAgICAvLyBOb3cgc2F2ZSBiYWNrIHN0YWNrLgorICAgICAgICBpZiAobUJhY2tTdGFjayAhPSBudWxsKSB7CisgICAgICAgICAgICBOID0gbUJhY2tTdGFjay5zaXplKCk7CisgICAgICAgICAgICBpZiAoTiA+IDApIHsKKyAgICAgICAgICAgICAgICBiYWNrU3RhY2sgPSBuZXcgQmFja1N0YWNrU3RhdGVbTl07CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaT0wOyBpPE47IGkrKykgeworICAgICAgICAgICAgICAgICAgICBiYWNrU3RhY2tbaV0gPSBuZXcgQmFja1N0YWNrU3RhdGUodGhpcywgbUJhY2tTdGFjay5nZXQoaSkpOworICAgICAgICAgICAgICAgICAgICBpZiAoREVCVUcpIExvZy52KFRBRywgInNhdmVBbGxTdGF0ZTogYWRkaW5nIGJhY2sgc3RhY2sgIyIgKyBpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiOiAiICsgbUJhY2tTdGFjay5nZXQoaSkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgRnJhZ21lbnRNYW5hZ2VyU3RhdGUgZm1zID0gbmV3IEZyYWdtZW50TWFuYWdlclN0YXRlKCk7CisgICAgICAgIGZtcy5tQWN0aXZlID0gYWN0aXZlOworICAgICAgICBmbXMubUFkZGVkID0gYWRkZWQ7CisgICAgICAgIGZtcy5tQmFja1N0YWNrID0gYmFja1N0YWNrOworICAgICAgICByZXR1cm4gZm1zOworICAgIH0KKyAgICAKKyAgICB2b2lkIHJlc3RvcmVBbGxTdGF0ZShQYXJjZWxhYmxlIHN0YXRlLCBBcnJheUxpc3Q8RnJhZ21lbnQ+IG5vbkNvbmZpZykgeworICAgICAgICAvLyBJZiB0aGVyZSBpcyBubyBzYXZlZCBzdGF0ZSBhdCBhbGwsIHRoZW4gdGhlcmUgY2FuIG5vdCBiZQorICAgICAgICAvLyBhbnkgbm9uQ29uZmlnIGZyYWdtZW50cyBlaXRoZXIsIHNvIHRoYXQgaXMgdGhhdC4KKyAgICAgICAgaWYgKHN0YXRlID09IG51bGwpIHJldHVybjsKKyAgICAgICAgRnJhZ21lbnRNYW5hZ2VyU3RhdGUgZm1zID0gKEZyYWdtZW50TWFuYWdlclN0YXRlKXN0YXRlOworICAgICAgICBpZiAoZm1zLm1BY3RpdmUgPT0gbnVsbCkgcmV0dXJuOworICAgICAgICAKKyAgICAgICAgLy8gRmlyc3QgcmUtYXR0YWNoIGFueSBub24tY29uZmlnIGluc3RhbmNlcyB3ZSBhcmUgcmV0YWluaW5nIGJhY2sKKyAgICAgICAgLy8gdG8gdGhlaXIgc2F2ZWQgc3RhdGUsIHNvIHdlIGRvbid0IHRyeSB0byBpbnN0YW50aWF0ZSB0aGVtIGFnYWluLgorICAgICAgICBpZiAobm9uQ29uZmlnICE9IG51bGwpIHsKKyAgICAgICAgICAgIGZvciAoaW50IGk9MDsgaTxub25Db25maWcuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgICAgICBGcmFnbWVudCBmID0gbm9uQ29uZmlnLmdldChpKTsKKyAgICAgICAgICAgICAgICBpZiAoREVCVUcpIExvZy52KFRBRywgInJlc3RvcmVBbGxTdGF0ZTogcmUtYXR0YWNoaW5nIHJldGFpbmVkICIgKyBmKTsKKyAgICAgICAgICAgICAgICBGcmFnbWVudFN0YXRlIGZzID0gZm1zLm1BY3RpdmVbZi5tSW5kZXhdOworICAgICAgICAgICAgICAgIGZzLm1JbnN0YW5jZSA9IGY7CisgICAgICAgICAgICAgICAgZi5tU2F2ZWRWaWV3U3RhdGUgPSBudWxsOworICAgICAgICAgICAgICAgIGYubUJhY2tTdGFja05lc3RpbmcgPSAwOworICAgICAgICAgICAgICAgIGYubUFkZGVkID0gZmFsc2U7CisgICAgICAgICAgICAgICAgaWYgKGZzLm1TYXZlZEZyYWdtZW50U3RhdGUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBmLm1TYXZlZFZpZXdTdGF0ZSA9IGZzLm1TYXZlZEZyYWdtZW50U3RhdGUuZ2V0U3BhcnNlUGFyY2VsYWJsZUFycmF5KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZyYWdtZW50TWFuYWdlckltcGwuVklFV19TVEFURV9UQUcpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgLy8gQnVpbGQgdGhlIGZ1bGwgbGlzdCBvZiBhY3RpdmUgZnJhZ21lbnRzLCBpbnN0YW50aWF0aW5nIHRoZW0gZnJvbQorICAgICAgICAvLyB0aGVpciBzYXZlZCBzdGF0ZS4KKyAgICAgICAgbUFjdGl2ZSA9IG5ldyBBcnJheUxpc3Q8RnJhZ21lbnQ+KGZtcy5tQWN0aXZlLmxlbmd0aCk7CisgICAgICAgIGlmIChtQXZhaWxJbmRpY2VzICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1BdmFpbEluZGljZXMuY2xlYXIoKTsKKyAgICAgICAgfQorICAgICAgICBmb3IgKGludCBpPTA7IGk8Zm1zLm1BY3RpdmUubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIEZyYWdtZW50U3RhdGUgZnMgPSBmbXMubUFjdGl2ZVtpXTsKKyAgICAgICAgICAgIGlmIChmcyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgRnJhZ21lbnQgZiA9IGZzLmluc3RhbnRpYXRlKG1BY3Rpdml0eSk7CisgICAgICAgICAgICAgICAgaWYgKERFQlVHKSBMb2cudihUQUcsICJyZXN0b3JlQWxsU3RhdGU6IGFkZGluZyAjIiArIGkgKyAiOiAiICsgZik7CisgICAgICAgICAgICAgICAgbUFjdGl2ZS5hZGQoZik7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGlmIChERUJVRykgTG9nLnYoVEFHLCAicmVzdG9yZUFsbFN0YXRlOiBhZGRpbmcgIyIgKyBpICsgIjogKG51bGwpIik7CisgICAgICAgICAgICAgICAgbUFjdGl2ZS5hZGQobnVsbCk7CisgICAgICAgICAgICAgICAgaWYgKG1BdmFpbEluZGljZXMgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBtQXZhaWxJbmRpY2VzID0gbmV3IEFycmF5TGlzdDxJbnRlZ2VyPigpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoREVCVUcpIExvZy52KFRBRywgInJlc3RvcmVBbGxTdGF0ZTogYWRkaW5nIGF2YWlsICMiICsgaSk7CisgICAgICAgICAgICAgICAgbUF2YWlsSW5kaWNlcy5hZGQoaSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIC8vIFVwZGF0ZSB0aGUgdGFyZ2V0IG9mIGFsbCByZXRhaW5lZCBmcmFnbWVudHMuCisgICAgICAgIGlmIChub25Db25maWcgIT0gbnVsbCkgeworICAgICAgICAgICAgZm9yIChpbnQgaT0wOyBpPG5vbkNvbmZpZy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgICAgIEZyYWdtZW50IGYgPSBub25Db25maWcuZ2V0KGkpOworICAgICAgICAgICAgICAgIGlmIChmLm1UYXJnZXQgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBpZiAoZi5tVGFyZ2V0Lm1JbmRleCA8IG1BY3RpdmUuc2l6ZSgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmLm1UYXJnZXQgPSBtQWN0aXZlLmdldChmLm1UYXJnZXQubUluZGV4KTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIExvZy53KFRBRywgIlJlLWF0dGFjaGluZyByZXRhaW5lZCBmcmFnbWVudCAiICsgZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgdGFyZ2V0IG5vIGxvbmdlciBleGlzdHM6ICIgKyBmLm1UYXJnZXQpOworICAgICAgICAgICAgICAgICAgICAgICAgZi5tVGFyZ2V0ID0gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIEJ1aWxkIHRoZSBsaXN0IG9mIGN1cnJlbnRseSBhZGRlZCBmcmFnbWVudHMuCisgICAgICAgIGlmIChmbXMubUFkZGVkICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1BZGRlZCA9IG5ldyBBcnJheUxpc3Q8RnJhZ21lbnQ+KGZtcy5tQWRkZWQubGVuZ3RoKTsKKyAgICAgICAgICAgIGZvciAoaW50IGk9MDsgaTxmbXMubUFkZGVkLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgRnJhZ21lbnQgZiA9IG1BY3RpdmUuZ2V0KGZtcy5tQWRkZWRbaV0pOworICAgICAgICAgICAgICAgIGlmIChmID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTm8gaW5zdGFudGlhdGVkIGZyYWdtZW50IGZvciBpbmRleCAjIiArIGZtcy5tQWRkZWRbaV0pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBmLm1BZGRlZCA9IHRydWU7CisgICAgICAgICAgICAgICAgZi5tSW1tZWRpYXRlQWN0aXZpdHkgPSBtQWN0aXZpdHk7CisgICAgICAgICAgICAgICAgaWYgKERFQlVHKSBMb2cudihUQUcsICJyZXN0b3JlQWxsU3RhdGU6IG1ha2luZyBhZGRlZCAjIiArIGkgKyAiOiAiICsgZik7CisgICAgICAgICAgICAgICAgbUFkZGVkLmFkZChmKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1BZGRlZCA9IG51bGw7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIC8vIEJ1aWxkIHRoZSBiYWNrIHN0YWNrLgorICAgICAgICBpZiAoZm1zLm1CYWNrU3RhY2sgIT0gbnVsbCkgeworICAgICAgICAgICAgbUJhY2tTdGFjayA9IG5ldyBBcnJheUxpc3Q8QmFja1N0YWNrRW50cnk+KGZtcy5tQmFja1N0YWNrLmxlbmd0aCk7CisgICAgICAgICAgICBmb3IgKGludCBpPTA7IGk8Zm1zLm1CYWNrU3RhY2subGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICBCYWNrU3RhY2tFbnRyeSBic2UgPSBmbXMubUJhY2tTdGFja1tpXS5pbnN0YW50aWF0ZSh0aGlzKTsKKyAgICAgICAgICAgICAgICBpZiAoREVCVUcpIExvZy52KFRBRywgInJlc3RvcmVBbGxTdGF0ZTogYWRkaW5nIGJzZSAjIiArIGkKKyAgICAgICAgICAgICAgICAgICAgICAgICsgIiAoaW5kZXggIiArIGJzZS5tSW5kZXggKyAiKTogIiArIGJzZSk7CisgICAgICAgICAgICAgICAgbUJhY2tTdGFjay5hZGQoYnNlKTsKKyAgICAgICAgICAgICAgICBpZiAoYnNlLm1JbmRleCA+PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIHNldEJhY2tTdGFja0luZGV4KGJzZS5tSW5kZXgsIGJzZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbUJhY2tTdGFjayA9IG51bGw7CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgcHVibGljIHZvaWQgYXR0YWNoQWN0aXZpdHkoQWN0aXZpdHkgYWN0aXZpdHkpIHsKKyAgICAgICAgaWYgKG1BY3Rpdml0eSAhPSBudWxsKSB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7CisgICAgICAgIG1BY3Rpdml0eSA9IGFjdGl2aXR5OworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgdm9pZCBkaXNwYXRjaENyZWF0ZSgpIHsKKyAgICAgICAgbVN0YXRlU2F2ZWQgPSBmYWxzZTsKKyAgICAgICAgbW92ZVRvU3RhdGUoRnJhZ21lbnQuQ1JFQVRFRCwgZmFsc2UpOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgdm9pZCBkaXNwYXRjaEFjdGl2aXR5Q3JlYXRlZCgpIHsKKyAgICAgICAgbVN0YXRlU2F2ZWQgPSBmYWxzZTsKKyAgICAgICAgbW92ZVRvU3RhdGUoRnJhZ21lbnQuQUNUSVZJVFlfQ1JFQVRFRCwgZmFsc2UpOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgdm9pZCBkaXNwYXRjaFN0YXJ0KCkgeworICAgICAgICBtU3RhdGVTYXZlZCA9IGZhbHNlOworICAgICAgICBtb3ZlVG9TdGF0ZShGcmFnbWVudC5TVEFSVEVELCBmYWxzZSk7CisgICAgfQorICAgIAorICAgIHB1YmxpYyB2b2lkIGRpc3BhdGNoUmVzdW1lKCkgeworICAgICAgICBtU3RhdGVTYXZlZCA9IGZhbHNlOworICAgICAgICBtb3ZlVG9TdGF0ZShGcmFnbWVudC5SRVNVTUVELCBmYWxzZSk7CisgICAgfQorICAgIAorICAgIHB1YmxpYyB2b2lkIGRpc3BhdGNoUGF1c2UoKSB7CisgICAgICAgIG1vdmVUb1N0YXRlKEZyYWdtZW50LlNUQVJURUQsIGZhbHNlKTsKKyAgICB9CisgICAgCisgICAgcHVibGljIHZvaWQgZGlzcGF0Y2hTdG9wKCkgeworICAgICAgICBtb3ZlVG9TdGF0ZShGcmFnbWVudC5BQ1RJVklUWV9DUkVBVEVELCBmYWxzZSk7CisgICAgfQorICAgIAorICAgIHB1YmxpYyB2b2lkIGRpc3BhdGNoRGVzdHJveSgpIHsKKyAgICAgICAgbW92ZVRvU3RhdGUoRnJhZ21lbnQuSU5JVElBTElaSU5HLCBmYWxzZSk7CisgICAgICAgIG1BY3Rpdml0eSA9IG51bGw7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBib29sZWFuIGRpc3BhdGNoQ3JlYXRlT3B0aW9uc01lbnUoTWVudSBtZW51LCBNZW51SW5mbGF0ZXIgaW5mbGF0ZXIpIHsKKyAgICAgICAgYm9vbGVhbiBzaG93ID0gZmFsc2U7CisgICAgICAgIGlmIChtQWN0aXZlICE9IG51bGwpIHsKKyAgICAgICAgICAgIGZvciAoaW50IGk9MDsgaTxtQWRkZWQuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgICAgICBGcmFnbWVudCBmID0gbUFkZGVkLmdldChpKTsKKyAgICAgICAgICAgICAgICBpZiAoZiAhPSBudWxsICYmICFmLm1IaWRkZW4gJiYgZi5tSGFzTWVudSkgeworICAgICAgICAgICAgICAgICAgICBzaG93ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgZi5vbkNyZWF0ZU9wdGlvbnNNZW51KG1lbnUsIGluZmxhdGVyKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHNob3c7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBib29sZWFuIGRpc3BhdGNoUHJlcGFyZU9wdGlvbnNNZW51KE1lbnUgbWVudSkgeworICAgICAgICBib29sZWFuIHNob3cgPSBmYWxzZTsKKyAgICAgICAgaWYgKG1BY3RpdmUgIT0gbnVsbCkgeworICAgICAgICAgICAgZm9yIChpbnQgaT0wOyBpPG1BZGRlZC5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgICAgIEZyYWdtZW50IGYgPSBtQWRkZWQuZ2V0KGkpOworICAgICAgICAgICAgICAgIGlmIChmICE9IG51bGwgJiYgIWYubUhpZGRlbiAmJiBmLm1IYXNNZW51KSB7CisgICAgICAgICAgICAgICAgICAgIHNob3cgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICBmLm9uUHJlcGFyZU9wdGlvbnNNZW51KG1lbnUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc2hvdzsKKyAgICB9CisgICAgCisgICAgcHVibGljIGJvb2xlYW4gZGlzcGF0Y2hPcHRpb25zSXRlbVNlbGVjdGVkKE1lbnVJdGVtIGl0ZW0pIHsKKyAgICAgICAgaWYgKG1BY3RpdmUgIT0gbnVsbCkgeworICAgICAgICAgICAgZm9yIChpbnQgaT0wOyBpPG1BZGRlZC5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgICAgIEZyYWdtZW50IGYgPSBtQWRkZWQuZ2V0KGkpOworICAgICAgICAgICAgICAgIGlmIChmICE9IG51bGwgJiYgIWYubUhpZGRlbiAmJiBmLm1IYXNNZW51KSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChmLm9uT3B0aW9uc0l0ZW1TZWxlY3RlZChpdGVtKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgYm9vbGVhbiBkaXNwYXRjaENvbnRleHRJdGVtU2VsZWN0ZWQoTWVudUl0ZW0gaXRlbSkgeworICAgICAgICBpZiAobUFjdGl2ZSAhPSBudWxsKSB7CisgICAgICAgICAgICBmb3IgKGludCBpPTA7IGk8bUFkZGVkLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICAgICAgRnJhZ21lbnQgZiA9IG1BZGRlZC5nZXQoaSk7CisgICAgICAgICAgICAgICAgaWYgKGYgIT0gbnVsbCAmJiAhZi5tSGlkZGVuKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChmLm9uQ29udGV4dEl0ZW1TZWxlY3RlZChpdGVtKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgdm9pZCBkaXNwYXRjaE9wdGlvbnNNZW51Q2xvc2VkKE1lbnUgbWVudSkgeworICAgICAgICBpZiAobUFjdGl2ZSAhPSBudWxsKSB7CisgICAgICAgICAgICBmb3IgKGludCBpPTA7IGk8bUFkZGVkLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICAgICAgRnJhZ21lbnQgZiA9IG1BZGRlZC5nZXQoaSk7CisgICAgICAgICAgICAgICAgaWYgKGYgIT0gbnVsbCAmJiAhZi5tSGlkZGVuICYmIGYubUhhc01lbnUpIHsKKyAgICAgICAgICAgICAgICAgICAgZi5vbk9wdGlvbnNNZW51Q2xvc2VkKG1lbnUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICBwdWJsaWMgc3RhdGljIGludCByZXZlcnNlVHJhbnNpdChpbnQgdHJhbnNpdCkgeworICAgICAgICBpbnQgcmV2ID0gMDsKKyAgICAgICAgc3dpdGNoICh0cmFuc2l0KSB7CisgICAgICAgICAgICBjYXNlIEZyYWdtZW50VHJhbnNhY3Rpb24uVFJBTlNJVF9GUkFHTUVOVF9PUEVOOgorICAgICAgICAgICAgICAgIHJldiA9IEZyYWdtZW50VHJhbnNhY3Rpb24uVFJBTlNJVF9GUkFHTUVOVF9DTE9TRTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgRnJhZ21lbnRUcmFuc2FjdGlvbi5UUkFOU0lUX0ZSQUdNRU5UX0NMT1NFOgorICAgICAgICAgICAgICAgIHJldiA9IEZyYWdtZW50VHJhbnNhY3Rpb24uVFJBTlNJVF9GUkFHTUVOVF9PUEVOOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXY7CisgICAgICAgIAorICAgIH0KKyAgICAKKyAgICBwdWJsaWMgc3RhdGljIGludCB0cmFuc2l0VG9TdHlsZUluZGV4KGludCB0cmFuc2l0LCBib29sZWFuIGVudGVyKSB7CisgICAgICAgIGludCBhbmltQXR0ciA9IC0xOworICAgICAgICBzd2l0Y2ggKHRyYW5zaXQpIHsKKyAgICAgICAgICAgIGNhc2UgRnJhZ21lbnRUcmFuc2FjdGlvbi5UUkFOU0lUX0ZSQUdNRU5UX09QRU46CisgICAgICAgICAgICAgICAgYW5pbUF0dHIgPSBlbnRlcgorICAgICAgICAgICAgICAgICAgICA/IGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLkZyYWdtZW50QW5pbWF0aW9uX2ZyYWdtZW50T3BlbkVudGVyQW5pbWF0aW9uCisgICAgICAgICAgICAgICAgICAgIDogY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZWFibGUuRnJhZ21lbnRBbmltYXRpb25fZnJhZ21lbnRPcGVuRXhpdEFuaW1hdGlvbjsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgRnJhZ21lbnRUcmFuc2FjdGlvbi5UUkFOU0lUX0ZSQUdNRU5UX0NMT1NFOgorICAgICAgICAgICAgICAgIGFuaW1BdHRyID0gZW50ZXIKKyAgICAgICAgICAgICAgICAgICAgPyBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZS5GcmFnbWVudEFuaW1hdGlvbl9mcmFnbWVudENsb3NlRW50ZXJBbmltYXRpb24KKyAgICAgICAgICAgICAgICAgICAgOiBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZS5GcmFnbWVudEFuaW1hdGlvbl9mcmFnbWVudENsb3NlRXhpdEFuaW1hdGlvbjsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gYW5pbUF0dHI7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvYXBwL0ZyYWdtZW50VHJhbnNhY3Rpb24uamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9GcmFnbWVudFRyYW5zYWN0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWQ0NDEwNgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9GcmFnbWVudFRyYW5zYWN0aW9uLmphdmEKQEAgLTAsMCArMSwxMzEgQEAKK3BhY2thZ2UgYW5kcm9pZC5hcHA7CisKKy8qKgorICogQVBJIGZvciBwZXJmb3JtaW5nIGEgc2V0IG9mIEZyYWdtZW50IG9wZXJhdGlvbnMuCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgRnJhZ21lbnRUcmFuc2FjdGlvbiB7CisgICAgLyoqCisgICAgICogQ2FsbHMge0BsaW5rICNhZGQoaW50LCBGcmFnbWVudCwgU3RyaW5nKX0gd2l0aCBhIDAgY29udGFpbmVyVmlld0lkLgorICAgICAqLworICAgIHB1YmxpYyBGcmFnbWVudFRyYW5zYWN0aW9uIGFkZChGcmFnbWVudCBmcmFnbWVudCwgU3RyaW5nIHRhZyk7CisgICAgCisgICAgLyoqCisgICAgICogQ2FsbHMge0BsaW5rICNhZGQoaW50LCBGcmFnbWVudCwgU3RyaW5nKX0gd2l0aCBhIG51bGwgdGFnLgorICAgICAqLworICAgIHB1YmxpYyBGcmFnbWVudFRyYW5zYWN0aW9uIGFkZChpbnQgY29udGFpbmVyVmlld0lkLCBGcmFnbWVudCBmcmFnbWVudCk7CisgICAgCisgICAgLyoqCisgICAgICogQWRkIGEgZnJhZ21lbnQgdG8gdGhlIGFjdGl2aXR5IHN0YXRlLiAgVGhpcyBmcmFnbWVudCBtYXkgb3B0aW9uYWxseQorICAgICAqIGFsc28gaGF2ZSBpdHMgdmlldyAoaWYge0BsaW5rIEZyYWdtZW50I29uQ3JlYXRlVmlldyBGcmFnbWVudC5vbkNyZWF0ZVZpZXd9CisgICAgICogcmV0dXJucyBub24tbnVsbCkgaW50byBhIGNvbnRhaW5lciB2aWV3IG9mIHRoZSBhY3Rpdml0eS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gY29udGFpbmVyVmlld0lkIE9wdGlvbmFsIGlkZW50aWZpZXIgb2YgdGhlIGNvbnRhaW5lciB0aGlzIGZyYWdtZW50IGlzCisgICAgICogdG8gYmUgcGxhY2VkIGluLiAgSWYgMCwgaXQgd2lsbCBub3QgYmUgcGxhY2VkIGluIGEgY29udGFpbmVyLgorICAgICAqIEBwYXJhbSBmcmFnbWVudCBUaGUgZnJhZ21lbnQgdG8gYmUgYWRkZWQuICBUaGlzIGZyYWdtZW50IG11c3Qgbm90IGFscmVhZHkKKyAgICAgKiBiZSBhZGRlZCB0byB0aGUgYWN0aXZpdHkuCisgICAgICogQHBhcmFtIHRhZyBPcHRpb25hbCB0YWcgbmFtZSBmb3IgdGhlIGZyYWdtZW50LCB0byBsYXRlciByZXRyaWV2ZSB0aGUKKyAgICAgKiBmcmFnbWVudCB3aXRoIHtAbGluayBBY3Rpdml0eSNmaW5kRnJhZ21lbnRCeVRhZyhTdHJpbmcpCisgICAgICogQWN0aXZpdHkuZmluZEZyYWdtZW50QnlUYWcoU3RyaW5nKX0uCisgICAgICogCisgICAgICogQHJldHVybiBSZXR1cm5zIHRoZSBzYW1lIEZyYWdtZW50VHJhbnNhY3Rpb24gaW5zdGFuY2UuCisgICAgICovCisgICAgcHVibGljIEZyYWdtZW50VHJhbnNhY3Rpb24gYWRkKGludCBjb250YWluZXJWaWV3SWQsIEZyYWdtZW50IGZyYWdtZW50LCBTdHJpbmcgdGFnKTsKKyAgICAKKyAgICAvKioKKyAgICAgKiBDYWxscyB7QGxpbmsgI3JlcGxhY2UoaW50LCBGcmFnbWVudCwgU3RyaW5nKX0gd2l0aCBhIG51bGwgdGFnLgorICAgICAqLworICAgIHB1YmxpYyBGcmFnbWVudFRyYW5zYWN0aW9uIHJlcGxhY2UoaW50IGNvbnRhaW5lclZpZXdJZCwgRnJhZ21lbnQgZnJhZ21lbnQpOworICAgIAorICAgIC8qKgorICAgICAqIFJlcGxhY2UgYW4gZXhpc3RpbmcgZnJhZ21lbnQgdGhhdCB3YXMgYWRkZWQgdG8gYSBjb250YWluZXIuICBUaGlzIGlzCisgICAgICogZXNzZW50aWFsbHkgdGhlIHNhbWUgYXMgY2FsbGluZyB7QGxpbmsgI3JlbW92ZShGcmFnbWVudCl9IGZvciBhbGwKKyAgICAgKiBjdXJyZW50bHkgYWRkZWQgZnJhZ21lbnRzIHRoYXQgd2VyZSBhZGRlZCB3aXRoIHRoZSBzYW1lIGNvbnRhaW5lclZpZXdJZAorICAgICAqIGFuZCB0aGVuIHtAbGluayAjYWRkKGludCwgRnJhZ21lbnQsIFN0cmluZyl9IHdpdGggdGhlIHNhbWUgYXJndW1lbnRzCisgICAgICogZ2l2ZW4gaGVyZS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gY29udGFpbmVyVmlld0lkIElkZW50aWZpZXIgb2YgdGhlIGNvbnRhaW5lciB3aG9zZSBmcmFnbWVudChzKSBhcmUKKyAgICAgKiB0byBiZSByZXBsYWNlZC4KKyAgICAgKiBAcGFyYW0gZnJhZ21lbnQgVGhlIG5ldyBmcmFnbWVudCB0byBwbGFjZSBpbiB0aGUgY29udGFpbmVyLgorICAgICAqIEBwYXJhbSB0YWcgT3B0aW9uYWwgdGFnIG5hbWUgZm9yIHRoZSBmcmFnbWVudCwgdG8gbGF0ZXIgcmV0cmlldmUgdGhlCisgICAgICogZnJhZ21lbnQgd2l0aCB7QGxpbmsgQWN0aXZpdHkjZmluZEZyYWdtZW50QnlUYWcoU3RyaW5nKQorICAgICAqIEFjdGl2aXR5LmZpbmRGcmFnbWVudEJ5VGFnKFN0cmluZyl9LgorICAgICAqIAorICAgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgc2FtZSBGcmFnbWVudFRyYW5zYWN0aW9uIGluc3RhbmNlLgorICAgICAqLworICAgIHB1YmxpYyBGcmFnbWVudFRyYW5zYWN0aW9uIHJlcGxhY2UoaW50IGNvbnRhaW5lclZpZXdJZCwgRnJhZ21lbnQgZnJhZ21lbnQsIFN0cmluZyB0YWcpOworICAgIAorICAgIC8qKgorICAgICAqIFJlbW92ZSBhbiBleGlzdGluZyBmcmFnbWVudC4gIElmIGl0IHdhcyBhZGRlZCB0byBhIGNvbnRhaW5lciwgaXRzIHZpZXcKKyAgICAgKiBpcyBhbHNvIHJlbW92ZWQgZnJvbSB0aGF0IGNvbnRhaW5lci4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gZnJhZ21lbnQgVGhlIGZyYWdtZW50IHRvIGJlIHJlbW92ZWQuCisgICAgICogCisgICAgICogQHJldHVybiBSZXR1cm5zIHRoZSBzYW1lIEZyYWdtZW50VHJhbnNhY3Rpb24gaW5zdGFuY2UuCisgICAgICovCisgICAgcHVibGljIEZyYWdtZW50VHJhbnNhY3Rpb24gcmVtb3ZlKEZyYWdtZW50IGZyYWdtZW50KTsKKyAgICAKKyAgICAvKioKKyAgICAgKiBIaWRlcyBhbiBleGlzdGluZyBmcmFnbWVudC4gIFRoaXMgaXMgb25seSByZWxldmFudCBmb3IgZnJhZ21lbnRzIHdob3NlCisgICAgICogdmlld3MgaGF2ZSBiZWVuIGFkZGVkIHRvIGEgY29udGFpbmVyLCBhcyB0aGlzIHdpbGwgY2F1c2UgdGhlIHZpZXcgdG8KKyAgICAgKiBiZSBoaWRkZW4uCisgICAgICogCisgICAgICogQHBhcmFtIGZyYWdtZW50IFRoZSBmcmFnbWVudCB0byBiZSBoaWRkZW4uCisgICAgICogCisgICAgICogQHJldHVybiBSZXR1cm5zIHRoZSBzYW1lIEZyYWdtZW50VHJhbnNhY3Rpb24gaW5zdGFuY2UuCisgICAgICovCisgICAgcHVibGljIEZyYWdtZW50VHJhbnNhY3Rpb24gaGlkZShGcmFnbWVudCBmcmFnbWVudCk7CisgICAgCisgICAgLyoqCisgICAgICogSGlkZXMgYSBwcmV2aW91c2x5IGhpZGRlbiBmcmFnbWVudC4gIFRoaXMgaXMgb25seSByZWxldmFudCBmb3IgZnJhZ21lbnRzIHdob3NlCisgICAgICogdmlld3MgaGF2ZSBiZWVuIGFkZGVkIHRvIGEgY29udGFpbmVyLCBhcyB0aGlzIHdpbGwgY2F1c2UgdGhlIHZpZXcgdG8KKyAgICAgKiBiZSBzaG93bi4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gZnJhZ21lbnQgVGhlIGZyYWdtZW50IHRvIGJlIHNob3duLgorICAgICAqIAorICAgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgc2FtZSBGcmFnbWVudFRyYW5zYWN0aW9uIGluc3RhbmNlLgorICAgICAqLworICAgIHB1YmxpYyBGcmFnbWVudFRyYW5zYWN0aW9uIHNob3coRnJhZ21lbnQgZnJhZ21lbnQpOworCisgICAgLyoqCisgICAgICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGlzIHRyYW5zYWN0aW9uIGNvbnRhaW5zIG5vIG9wZXJhdGlvbnMsCisgICAgICogICAgICAgICA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzRW1wdHkoKTsKKyAgICAKKyAgICAvKioKKyAgICAgKiBCaXQgbWFzayB0aGF0IGlzIHNldCBmb3IgYWxsIGVudGVyIHRyYW5zaXRpb25zLgorICAgICAqLworICAgIHB1YmxpYyBmaW5hbCBpbnQgVFJBTlNJVF9FTlRFUl9NQVNLID0gMHgxMDAwOworICAgIAorICAgIC8qKgorICAgICAqIEJpdCBtYXNrIHRoYXQgaXMgc2V0IGZvciBhbGwgZXhpdCB0cmFuc2l0aW9ucy4KKyAgICAgKi8KKyAgICBwdWJsaWMgZmluYWwgaW50IFRSQU5TSVRfRVhJVF9NQVNLID0gMHgyMDAwOworICAgIAorICAgIC8qKiBOb3Qgc2V0IHVwIGZvciBhIHRyYW5zaXRpb24uICovCisgICAgcHVibGljIGZpbmFsIGludCBUUkFOU0lUX1VOU0VUID0gLTE7CisgICAgLyoqIE5vIGFuaW1hdGlvbiBmb3IgdHJhbnNpdGlvbi4gKi8KKyAgICBwdWJsaWMgZmluYWwgaW50IFRSQU5TSVRfTk9ORSA9IDA7CisgICAgLyoqIEZyYWdtZW50IGlzIGJlaW5nIGFkZGVkICovCisgICAgcHVibGljIGZpbmFsIGludCBUUkFOU0lUX0ZSQUdNRU5UX09QRU4gPSAxIHwgVFJBTlNJVF9FTlRFUl9NQVNLOworICAgIC8qKiBGcmFnbWVudCBpcyBiZWluZyByZW1vdmVkICovCisgICAgcHVibGljIGZpbmFsIGludCBUUkFOU0lUX0ZSQUdNRU5UX0NMT1NFID0gMiB8IFRSQU5TSVRfRVhJVF9NQVNLOworCisgICAgcHVibGljIEZyYWdtZW50VHJhbnNhY3Rpb24gc2V0Q3VzdG9tQW5pbWF0aW9ucyhpbnQgZW50ZXIsIGludCBleGl0KTsKKyAgICAKKyAgICBwdWJsaWMgRnJhZ21lbnRUcmFuc2FjdGlvbiBzZXRUcmFuc2l0aW9uKGludCB0cmFuc2l0KTsKKyAgICBwdWJsaWMgRnJhZ21lbnRUcmFuc2FjdGlvbiBzZXRUcmFuc2l0aW9uU3R5bGUoaW50IHN0eWxlUmVzKTsKKyAgICAKKyAgICBwdWJsaWMgRnJhZ21lbnRUcmFuc2FjdGlvbiBhZGRUb0JhY2tTdGFjayhTdHJpbmcgbmFtZSk7CisKKyAgICAvKioKKyAgICAgKiBTY2hlZHVsZXMgYSBjb21taXQgb2YgdGhpcyB0cmFuc2FjdGlvbi4gIE5vdGUgdGhhdCB0aGUgY29tbWl0IGRvZXMKKyAgICAgKiBub3QgaGFwcGVuIGltbWVkaWF0ZWx5OyBpdCB3aWxsIGJlIHNjaGVkdWxlZCBhcyB3b3JrIG9uIHRoZSBtYWluIHRocmVhZAorICAgICAqIHRvIGJlIGRvbmUgdGhlIG5leHQgdGltZSB0aGF0IHRocmVhZCBpcyByZWFkeS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgaWRlbnRpZmllciBvZiB0aGlzIHRyYW5zYWN0aW9uJ3MgYmFjayBzdGFjayBlbnRyeSwKKyAgICAgKiBpZiB7QGxpbmsgI2FkZFRvQmFja1N0YWNrKFN0cmluZyl9IGhhZCBiZWVuIGNhbGxlZC4gIE90aGVyd2lzZSwgcmV0dXJucworICAgICAqIGEgbmVnYXRpdmUgbnVtYmVyLgorICAgICAqLworICAgIHB1YmxpYyBpbnQgY29tbWl0KCk7Cit9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9hcHAvSUFjdGl2aXR5TWFuYWdlci5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvYXBwL0lBY3Rpdml0eU1hbmFnZXIuamF2YQppbmRleCBmOWJkNDYxLi45MDFmMTE3IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9hcHAvSUFjdGl2aXR5TWFuYWdlci5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9JQWN0aXZpdHlNYW5hZ2VyLmphdmEKQEAgLTMxMSw2ICszMTEsMTAgQEAKICAgICAKICAgICBwdWJsaWMgdm9pZCBmaW5pc2hIZWF2eVdlaWdodEFwcCgpIHRocm93cyBSZW1vdGVFeGNlcHRpb247CiAKKyAgICBwdWJsaWMgdm9pZCBzZXRJbW1lcnNpdmUoSUJpbmRlciB0b2tlbiwgYm9vbGVhbiBpbW1lcnNpdmUpIHRocm93cyBSZW1vdGVFeGNlcHRpb247CisgICAgcHVibGljIGJvb2xlYW4gaXNJbW1lcnNpdmUoSUJpbmRlciB0b2tlbikgdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbjsKKyAgICBwdWJsaWMgYm9vbGVhbiBpc1RvcEFjdGl2aXR5SW1tZXJzaXZlKCkgdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbjsKKyAgICAKICAgICBwdWJsaWMgdm9pZCBjcmFzaEFwcGxpY2F0aW9uKGludCB1aWQsIGludCBpbml0aWFsUGlkLCBTdHJpbmcgcGFja2FnZU5hbWUsCiAgICAgICAgICAgICBTdHJpbmcgbWVzc2FnZSkgdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbjsKICAgICAKQEAgLTMyMCw2ICszMjQsMTAgQEAKICAgICBwdWJsaWMgdm9pZCByZXZva2VVcmlQZXJtaXNzaW9uRnJvbU93bmVyKElCaW5kZXIgb3duZXIsIFVyaSB1cmksCiAgICAgICAgICAgICBpbnQgbW9kZSkgdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbjsKIAorICAgIC8vIENhdXNlIHRoZSBzcGVjaWZpZWQgcHJvY2VzcyB0byBkdW1wIHRoZSBzcGVjaWZpZWQgaGVhcC4KKyAgICBwdWJsaWMgYm9vbGVhbiBkdW1wSGVhcChTdHJpbmcgcHJvY2VzcywgYm9vbGVhbiBtYW5hZ2VkLCBTdHJpbmcgcGF0aCwKKyAgICAgICAgUGFyY2VsRmlsZURlc2NyaXB0b3IgZmQpIHRocm93cyBSZW1vdGVFeGNlcHRpb247CisKICAgICAvKgogICAgICAqIFByaXZhdGUgbm9uLUJpbmRlciBpbnRlcmZhY2VzCiAgICAgICovCkBAIC01MjksNCArNTM3LDUgQEAKICAgICBpbnQgTkVXX1VSSV9QRVJNSVNTSU9OX09XTkVSX1RSQU5TQUNUSU9OID0gSUJpbmRlci5GSVJTVF9DQUxMX1RSQU5TQUNUSU9OKzExNDsKICAgICBpbnQgR1JBTlRfVVJJX1BFUk1JU1NJT05fRlJPTV9PV05FUl9UUkFOU0FDVElPTiA9IElCaW5kZXIuRklSU1RfQ0FMTF9UUkFOU0FDVElPTisxMTU7CiAgICAgaW50IFJFVk9LRV9VUklfUEVSTUlTU0lPTl9GUk9NX09XTkVSX1RSQU5TQUNUSU9OID0gSUJpbmRlci5GSVJTVF9DQUxMX1RSQU5TQUNUSU9OKzExNjsKKyAgICBpbnQgRFVNUF9IRUFQX1RSQU5TQUNUSU9OID0gSUJpbmRlci5GSVJTVF9DQUxMX1RSQU5TQUNUSU9OKzExNzsKIH0KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9JQXBwbGljYXRpb25UaHJlYWQuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9JQXBwbGljYXRpb25UaHJlYWQuamF2YQppbmRleCBjOGVmMTdmLi4wMzliY2I5IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9hcHAvSUFwcGxpY2F0aW9uVGhyZWFkLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvYXBwL0lBcHBsaWNhdGlvblRocmVhZC5qYXZhCkBAIC05Nyw2ICs5Nyw4IEBACiAgICAgdm9pZCBzY2hlZHVsZUFjdGl2aXR5Q29uZmlndXJhdGlvbkNoYW5nZWQoSUJpbmRlciB0b2tlbikgdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbjsKICAgICB2b2lkIHByb2ZpbGVyQ29udHJvbChib29sZWFuIHN0YXJ0LCBTdHJpbmcgcGF0aCwgUGFyY2VsRmlsZURlc2NyaXB0b3IgZmQpCiAgICAgICAgICAgICB0aHJvd3MgUmVtb3RlRXhjZXB0aW9uOworICAgIHZvaWQgZHVtcEhlYXAoYm9vbGVhbiBtYW5hZ2VkLCBTdHJpbmcgcGF0aCwgUGFyY2VsRmlsZURlc2NyaXB0b3IgZmQpCisgICAgICAgICAgICB0aHJvd3MgUmVtb3RlRXhjZXB0aW9uOwogICAgIHZvaWQgc2V0U2NoZWR1bGluZ0dyb3VwKGludCBncm91cCkgdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbjsKICAgICB2b2lkIGdldE1lbW9yeUluZm8oRGVidWcuTWVtb3J5SW5mbyBvdXRJbmZvKSB0aHJvd3MgUmVtb3RlRXhjZXB0aW9uOwogICAgIHN0YXRpYyBmaW5hbCBpbnQgUEFDS0FHRV9SRU1PVkVEID0gMDsKQEAgLTE0MCw0ICsxNDIsNSBAQAogICAgIGludCBTQ0hFRFVMRV9TVUlDSURFX1RSQU5TQUNUSU9OID0gSUJpbmRlci5GSVJTVF9DQUxMX1RSQU5TQUNUSU9OKzMyOwogICAgIGludCBESVNQQVRDSF9QQUNLQUdFX0JST0FEQ0FTVF9UUkFOU0FDVElPTiA9IElCaW5kZXIuRklSU1RfQ0FMTF9UUkFOU0FDVElPTiszMzsKICAgICBpbnQgU0NIRURVTEVfQ1JBU0hfVFJBTlNBQ1RJT04gPSBJQmluZGVyLkZJUlNUX0NBTExfVFJBTlNBQ1RJT04rMzQ7CisgICAgaW50IERVTVBfSEVBUF9UUkFOU0FDVElPTiA9IElCaW5kZXIuRklSU1RfQ0FMTF9UUkFOU0FDVElPTiszNTsKIH0KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9JbnN0cnVtZW50YXRpb24uamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9JbnN0cnVtZW50YXRpb24uamF2YQppbmRleCBiOGMzYWEzLi40ZDVmMzZhIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9hcHAvSW5zdHJ1bWVudGF0aW9uLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvYXBwL0luc3RydW1lbnRhdGlvbi5qYXZhCkBAIC05OTcsOCArOTk3LDEwIEBACiAgICAgICAgICAgICBJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIHsKICAgICAgICAgQWN0aXZpdHkgYWN0aXZpdHkgPSAoQWN0aXZpdHkpY2xhenoubmV3SW5zdGFuY2UoKTsKICAgICAgICAgQWN0aXZpdHlUaHJlYWQgYVRocmVhZCA9IG51bGw7Ci0gICAgICAgIGFjdGl2aXR5LmF0dGFjaChjb250ZXh0LCBhVGhyZWFkLCB0aGlzLCB0b2tlbiwgYXBwbGljYXRpb24sIGludGVudCwgaW5mbywgdGl0bGUsCi0gICAgICAgICAgICAgICAgcGFyZW50LCBpZCwgbGFzdE5vbkNvbmZpZ3VyYXRpb25JbnN0YW5jZSwgbmV3IENvbmZpZ3VyYXRpb24oKSk7CisgICAgICAgIGFjdGl2aXR5LmF0dGFjaChjb250ZXh0LCBhVGhyZWFkLCB0aGlzLCB0b2tlbiwgYXBwbGljYXRpb24sIGludGVudCwKKyAgICAgICAgICAgICAgICBpbmZvLCB0aXRsZSwgcGFyZW50LCBpZCwKKyAgICAgICAgICAgICAgICAoQWN0aXZpdHkuTm9uQ29uZmlndXJhdGlvbkluc3RhbmNlcylsYXN0Tm9uQ29uZmlndXJhdGlvbkluc3RhbmNlLAorICAgICAgICAgICAgICAgIG5ldyBDb25maWd1cmF0aW9uKCkpOwogICAgICAgICByZXR1cm4gYWN0aXZpdHk7CiAgICAgfQogCkBAIC0xMDU4LDIxICsxMDYwLDIzIEBACiAgICAgfQogICAgIAogICAgIHB1YmxpYyB2b2lkIGNhbGxBY3Rpdml0eU9uRGVzdHJveShBY3Rpdml0eSBhY3Rpdml0eSkgewotICAgICAgaWYgKG1XYWl0aW5nQWN0aXZpdGllcyAhPSBudWxsKSB7Ci0gICAgICAgICAgc3luY2hyb25pemVkIChtU3luYykgewotICAgICAgICAgICAgICBmaW5hbCBpbnQgTiA9IG1XYWl0aW5nQWN0aXZpdGllcy5zaXplKCk7Ci0gICAgICAgICAgICAgIGZvciAoaW50IGk9MDsgaTxOOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgIGZpbmFsIEFjdGl2aXR5V2FpdGVyIGF3ID0gbVdhaXRpbmdBY3Rpdml0aWVzLmdldChpKTsKLSAgICAgICAgICAgICAgICAgIGZpbmFsIEludGVudCBpbnRlbnQgPSBhdy5pbnRlbnQ7Ci0gICAgICAgICAgICAgICAgICBpZiAoaW50ZW50LmZpbHRlckVxdWFscyhhY3Rpdml0eS5nZXRJbnRlbnQoKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICBhdy5hY3Rpdml0eSA9IGFjdGl2aXR5OwotICAgICAgICAgICAgICAgICAgICAgIG1NZXNzYWdlUXVldWUuYWRkSWRsZUhhbmRsZXIobmV3IEFjdGl2aXR5R29pbmcoYXcpKTsKLSAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgIH0KKyAgICAgIC8vIFRPRE86IHRoZSBmb2xsb3dpbmcgYmxvY2sgY2F1c2VzIGludGVybWl0dGVudCBoYW5ncyB3aGVuIHVzaW5nIHN0YXJ0QWN0aXZpdHkKKyAgICAgIC8vIHRlbXBvcmFyaWx5IGNvbW1lbnQgb3V0IHVudGlsIHJvb3QgY2F1c2UgaXMgZml4ZWQgKGJ1ZyAyNjMwNjgzKQorLy8gICAgICBpZiAobVdhaXRpbmdBY3Rpdml0aWVzICE9IG51bGwpIHsKKy8vICAgICAgICAgIHN5bmNocm9uaXplZCAobVN5bmMpIHsKKy8vICAgICAgICAgICAgICBmaW5hbCBpbnQgTiA9IG1XYWl0aW5nQWN0aXZpdGllcy5zaXplKCk7CisvLyAgICAgICAgICAgICAgZm9yIChpbnQgaT0wOyBpPE47IGkrKykgeworLy8gICAgICAgICAgICAgICAgICBmaW5hbCBBY3Rpdml0eVdhaXRlciBhdyA9IG1XYWl0aW5nQWN0aXZpdGllcy5nZXQoaSk7CisvLyAgICAgICAgICAgICAgICAgIGZpbmFsIEludGVudCBpbnRlbnQgPSBhdy5pbnRlbnQ7CisvLyAgICAgICAgICAgICAgICAgIGlmIChpbnRlbnQuZmlsdGVyRXF1YWxzKGFjdGl2aXR5LmdldEludGVudCgpKSkgeworLy8gICAgICAgICAgICAgICAgICAgICAgYXcuYWN0aXZpdHkgPSBhY3Rpdml0eTsKKy8vICAgICAgICAgICAgICAgICAgICAgIG1NZXNzYWdlUXVldWUuYWRkSWRsZUhhbmRsZXIobmV3IEFjdGl2aXR5R29pbmcoYXcpKTsKKy8vICAgICAgICAgICAgICAgICAgfQorLy8gICAgICAgICAgICAgIH0KKy8vICAgICAgICAgIH0KKy8vICAgICAgfQogICAgICAgCi0gICAgICBhY3Rpdml0eS5vbkRlc3Ryb3koKTsKKyAgICAgIGFjdGl2aXR5LnBlcmZvcm1EZXN0cm95KCk7CiAgICAgICAKICAgICAgIGlmIChtQWN0aXZpdHlNb25pdG9ycyAhPSBudWxsKSB7CiAgICAgICAgICAgc3luY2hyb25pemVkIChtU3luYykgewpAQCAtMTMzMSw3ICsxMzM1LDcgQEAKICAgICAgKiAgICAgICAgICAgICAgICAgICAgICBpcyBiZWluZyBzdGFydGVkLgogICAgICAqIEBwYXJhbSB0b2tlbiBJbnRlcm5hbCB0b2tlbiBpZGVudGlmeWluZyB0byB0aGUgc3lzdGVtIHdobyBpcyBzdGFydGluZyAKICAgICAgKiAgICAgICAgICAgICAgdGhlIGFjdGl2aXR5OyBtYXkgYmUgbnVsbC4KLSAgICAgKiBAcGFyYW0gdGFyZ2V0IFdoaWNoIGFjdGl2aXR5IGlzIHBlcmZvcm0gdGhlIHN0YXJ0IChhbmQgdGh1cyByZWNlaXZpbmcgCisgICAgICogQHBhcmFtIHRhcmdldCBXaGljaCBhY3Rpdml0eSBpcyBwZXJmb3JtaW5nIHRoZSBzdGFydCAoYW5kIHRodXMgcmVjZWl2aW5nIAogICAgICAqICAgICAgICAgICAgICAgYW55IHJlc3VsdCk7IG1heSBiZSBudWxsIGlmIHRoaXMgY2FsbCBpcyBub3QgYmVpbmcgbWFkZQogICAgICAqICAgICAgICAgICAgICAgZnJvbSBhbiBhY3Rpdml0eS4KICAgICAgKiBAcGFyYW0gaW50ZW50IFRoZSBhY3R1YWwgSW50ZW50IHRvIHN0YXJ0LgpAQCAtMTM4MSw2ICsxMzg1LDY0IEBACiAgICAgICAgIHJldHVybiBudWxsOwogICAgIH0KIAorICAgIC8qKgorICAgICAqIExpa2Uge0BsaW5rICNleGVjU3RhcnRBY3Rpdml0eShDb250ZXh0LCBJQmluZGVyLCBJQmluZGVyLCBBY3Rpdml0eSwgSW50ZW50LCBpbnQpfSwKKyAgICAgKiBidXQgZm9yIGNhbGxzIGZyb20gYSB7I2xpbmsgRnJhZ21lbnR9LgorICAgICAqIAorICAgICAqIEBwYXJhbSB3aG8gVGhlIENvbnRleHQgZnJvbSB3aGljaCB0aGUgYWN0aXZpdHkgaXMgYmVpbmcgc3RhcnRlZC4KKyAgICAgKiBAcGFyYW0gY29udGV4dFRocmVhZCBUaGUgbWFpbiB0aHJlYWQgb2YgdGhlIENvbnRleHQgZnJvbSB3aGljaCB0aGUgYWN0aXZpdHkKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICBpcyBiZWluZyBzdGFydGVkLgorICAgICAqIEBwYXJhbSB0b2tlbiBJbnRlcm5hbCB0b2tlbiBpZGVudGlmeWluZyB0byB0aGUgc3lzdGVtIHdobyBpcyBzdGFydGluZyAKKyAgICAgKiAgICAgICAgICAgICAgdGhlIGFjdGl2aXR5OyBtYXkgYmUgbnVsbC4KKyAgICAgKiBAcGFyYW0gdGFyZ2V0IFdoaWNoIGZyYWdtZW50IGlzIHBlcmZvcm1pbmcgdGhlIHN0YXJ0IChhbmQgdGh1cyByZWNlaXZpbmcgCisgICAgICogICAgICAgICAgICAgICBhbnkgcmVzdWx0KS4KKyAgICAgKiBAcGFyYW0gaW50ZW50IFRoZSBhY3R1YWwgSW50ZW50IHRvIHN0YXJ0LgorICAgICAqIEBwYXJhbSByZXF1ZXN0Q29kZSBJZGVudGlmaWVyIGZvciB0aGlzIHJlcXVlc3QncyByZXN1bHQ7IGxlc3MgdGhhbiB6ZXJvIAorICAgICAqICAgICAgICAgICAgICAgICAgICBpZiB0aGUgY2FsbGVyIGlzIG5vdCBleHBlY3RpbmcgYSByZXN1bHQuCisgICAgICogCisgICAgICogQHJldHVybiBUbyBmb3JjZSB0aGUgcmV0dXJuIG9mIGEgcGFydGljdWxhciByZXN1bHQsIHJldHVybiBhbiAKKyAgICAgKiAgICAgICAgIEFjdGl2aXR5UmVzdWx0IG9iamVjdCBjb250YWluaW5nIHRoZSBkZXNpcmVkIGRhdGE7IG90aGVyd2lzZQorICAgICAqICAgICAgICAgcmV0dXJuIG51bGwuICBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBhbHdheXMgcmV0dXJucyBudWxsLgorICAgICAqICAKKyAgICAgKiBAdGhyb3dzIGFuZHJvaWQuY29udGVudC5BY3Rpdml0eU5vdEZvdW5kRXhjZXB0aW9uCisgICAgICogCisgICAgICogQHNlZSBBY3Rpdml0eSNzdGFydEFjdGl2aXR5KEludGVudCkKKyAgICAgKiBAc2VlIEFjdGl2aXR5I3N0YXJ0QWN0aXZpdHlGb3JSZXN1bHQoSW50ZW50LCBpbnQpCisgICAgICogQHNlZSBBY3Rpdml0eSNzdGFydEFjdGl2aXR5RnJvbUNoaWxkCisgICAgICogCisgICAgICoge0BoaWRlfQorICAgICAqLworICAgIHB1YmxpYyBBY3Rpdml0eVJlc3VsdCBleGVjU3RhcnRBY3Rpdml0eSgKKyAgICAgICAgQ29udGV4dCB3aG8sIElCaW5kZXIgY29udGV4dFRocmVhZCwgSUJpbmRlciB0b2tlbiwgRnJhZ21lbnQgdGFyZ2V0LAorICAgICAgICBJbnRlbnQgaW50ZW50LCBpbnQgcmVxdWVzdENvZGUpIHsKKyAgICAgICAgSUFwcGxpY2F0aW9uVGhyZWFkIHdob1RocmVhZCA9IChJQXBwbGljYXRpb25UaHJlYWQpIGNvbnRleHRUaHJlYWQ7CisgICAgICAgIGlmIChtQWN0aXZpdHlNb25pdG9ycyAhPSBudWxsKSB7CisgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG1TeW5jKSB7CisgICAgICAgICAgICAgICAgZmluYWwgaW50IE4gPSBtQWN0aXZpdHlNb25pdG9ycy5zaXplKCk7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaT0wOyBpPE47IGkrKykgeworICAgICAgICAgICAgICAgICAgICBmaW5hbCBBY3Rpdml0eU1vbml0b3IgYW0gPSBtQWN0aXZpdHlNb25pdG9ycy5nZXQoaSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChhbS5tYXRjaCh3aG8sIG51bGwsIGludGVudCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFtLm1IaXRzKys7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYW0uaXNCbG9ja2luZygpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlcXVlc3RDb2RlID49IDAgPyBhbS5nZXRSZXN1bHQoKSA6IG51bGw7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IHJlc3VsdCA9IEFjdGl2aXR5TWFuYWdlck5hdGl2ZS5nZXREZWZhdWx0KCkKKyAgICAgICAgICAgICAgICAuc3RhcnRBY3Rpdml0eSh3aG9UaHJlYWQsIGludGVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludGVudC5yZXNvbHZlVHlwZUlmTmVlZGVkKHdoby5nZXRDb250ZW50UmVzb2x2ZXIoKSksCisgICAgICAgICAgICAgICAgICAgICAgICBudWxsLCAwLCB0b2tlbiwgdGFyZ2V0ICE9IG51bGwgPyB0YXJnZXQubVdobyA6IG51bGwsCisgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0Q29kZSwgZmFsc2UsIGZhbHNlKTsKKyAgICAgICAgICAgIGNoZWNrU3RhcnRBY3Rpdml0eVJlc3VsdChyZXN1bHQsIGludGVudCk7CisgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCiAgICAgLypwYWNrYWdlKi8gZmluYWwgdm9pZCBpbml0KEFjdGl2aXR5VGhyZWFkIHRocmVhZCwKICAgICAgICAgICAgIENvbnRleHQgaW5zdHJDb250ZXh0LCBDb250ZXh0IGFwcENvbnRleHQsIENvbXBvbmVudE5hbWUgY29tcG9uZW50LCAKICAgICAgICAgICAgIElJbnN0cnVtZW50YXRpb25XYXRjaGVyIHdhdGNoZXIpIHsKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9MaXN0QWN0aXZpdHkuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9MaXN0QWN0aXZpdHkuamF2YQppbmRleCA0YmY1NTE4Li5kNDk5NjhmIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9hcHAvTGlzdEFjdGl2aXR5LmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvYXBwL0xpc3RBY3Rpdml0eS5qYXZhCkBAIC0zMDksNyArMzA5LDcgQEAKICAgICAgICAgaWYgKG1MaXN0ICE9IG51bGwpIHsKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQotICAgICAgICBzZXRDb250ZW50Vmlldyhjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmxheW91dC5saXN0X2NvbnRlbnQpOworICAgICAgICBzZXRDb250ZW50Vmlldyhjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmxheW91dC5saXN0X2NvbnRlbnRfc2ltcGxlKTsKIAogICAgIH0KIApkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvYXBwL0xpc3RGcmFnbWVudC5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvYXBwL0xpc3RGcmFnbWVudC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZlMmY0YjYKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9hcHAvTGlzdEZyYWdtZW50LmphdmEKQEAgLTAsMCArMSw0MTggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQuYXBwOworCitpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CitpbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyOworaW1wb3J0IGFuZHJvaWQudmlldy5MYXlvdXRJbmZsYXRlcjsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlld0dyb3VwOworaW1wb3J0IGFuZHJvaWQudmlldy5hbmltYXRpb24uQW5pbWF0aW9uVXRpbHM7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuQWRhcHRlclZpZXc7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuTGlzdEFkYXB0ZXI7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuTGlzdFZpZXc7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuVGV4dFZpZXc7CisKKy8qKgorICogQSBmcmFnbWVudCB0aGF0IGRpc3BsYXlzIGEgbGlzdCBvZiBpdGVtcyBieSBiaW5kaW5nIHRvIGEgZGF0YSBzb3VyY2Ugc3VjaCBhcworICogYW4gYXJyYXkgb3IgQ3Vyc29yLCBhbmQgZXhwb3NlcyBldmVudCBoYW5kbGVycyB3aGVuIHRoZSB1c2VyIHNlbGVjdHMgYW4gaXRlbS4KKyAqIDxwPgorICogTGlzdEZyYWdtZW50IGhvc3RzIGEge0BsaW5rIGFuZHJvaWQud2lkZ2V0Lkxpc3RWaWV3IExpc3RWaWV3fSBvYmplY3QgdGhhdCBjYW4KKyAqIGJlIGJvdW5kIHRvIGRpZmZlcmVudCBkYXRhIHNvdXJjZXMsIHR5cGljYWxseSBlaXRoZXIgYW4gYXJyYXkgb3IgYSBDdXJzb3IKKyAqIGhvbGRpbmcgcXVlcnkgcmVzdWx0cy4gQmluZGluZywgc2NyZWVuIGxheW91dCwgYW5kIHJvdyBsYXlvdXQgYXJlIGRpc2N1c3NlZAorICogaW4gdGhlIGZvbGxvd2luZyBzZWN0aW9ucy4KKyAqIDxwPgorICogPHN0cm9uZz5TY3JlZW4gTGF5b3V0PC9zdHJvbmc+CisgKiA8L3A+CisgKiA8cD4KKyAqIExpc3RGcmFnbWVudCBoYXMgYSBkZWZhdWx0IGxheW91dCB0aGF0IGNvbnNpc3RzIG9mIGEgc2luZ2xlIGxpc3Qgdmlldy4KKyAqIEhvd2V2ZXIsIGlmIHlvdSBkZXNpcmUsIHlvdSBjYW4gY3VzdG9taXplIHRoZSBmcmFnbWVudCBsYXlvdXQgYnkgcmV0dXJuaW5nCisgKiB5b3VyIG93biB2aWV3IGhpZXJhcmNoeSBmcm9tIHtAbGluayAjb25DcmVhdGVWaWV3fS4KKyAqIFRvIGRvIHRoaXMsIHlvdXIgdmlldyBoaWVyYXJjaHkgPGVtPm11c3Q8L2VtPiBjb250YWluIGEgTGlzdFZpZXcgb2JqZWN0IHdpdGggdGhlCisgKiBpZCAiQGFuZHJvaWQ6aWQvbGlzdCIgKG9yIHtAbGluayBhbmRyb2lkLlIuaWQjbGlzdH0gaWYgaXQncyBpbiBjb2RlKQorICogPHA+CisgKiBPcHRpb25hbGx5LCB5b3VyIHZpZXcgaGllcmFyY2h5IGNhbiBjb250YWluIGFub3RoZXIgdmlldyBvYmplY3Qgb2YgYW55IHR5cGUgdG8KKyAqIGRpc3BsYXkgd2hlbiB0aGUgbGlzdCB2aWV3IGlzIGVtcHR5LiBUaGlzICJlbXB0eSBsaXN0IiBub3RpZmllciBtdXN0IGhhdmUgYW4KKyAqIGlkICJhbmRyb2lkOmVtcHR5Ii4gTm90ZSB0aGF0IHdoZW4gYW4gZW1wdHkgdmlldyBpcyBwcmVzZW50LCB0aGUgbGlzdCB2aWV3CisgKiB3aWxsIGJlIGhpZGRlbiB3aGVuIHRoZXJlIGlzIG5vIGRhdGEgdG8gZGlzcGxheS4KKyAqIDxwPgorICogVGhlIGZvbGxvd2luZyBjb2RlIGRlbW9uc3RyYXRlcyBhbiAodWdseSkgY3VzdG9tIGxpc3QgbGF5b3V0LiBJdCBoYXMgYSBsaXN0CisgKiB3aXRoIGEgZ3JlZW4gYmFja2dyb3VuZCwgYW5kIGFuIGFsdGVybmF0ZSByZWQgIm5vIGRhdGEiIG1lc3NhZ2UuCisgKiA8L3A+CisgKgorICogPHByZT4KKyAqICZsdDs/eG1sIHZlcnNpb249JnF1b3Q7MS4wJnF1b3Q7IGVuY29kaW5nPSZxdW90O3V0Zi04JnF1b3Q7PyZndDsKKyAqICZsdDtMaW5lYXJMYXlvdXQgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICogICAgICAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSZxdW90O3ZlcnRpY2FsJnF1b3Q7CisgKiAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSZxdW90O21hdGNoX3BhcmVudCZxdW90OworICogICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9JnF1b3Q7bWF0Y2hfcGFyZW50JnF1b3Q7CisgKiAgICAgICAgIGFuZHJvaWQ6cGFkZGluZ0xlZnQ9JnF1b3Q7OGRwJnF1b3Q7CisgKiAgICAgICAgIGFuZHJvaWQ6cGFkZGluZ1JpZ2h0PSZxdW90OzhkcCZxdW90OyZndDsKKyAqCisgKiAgICAgJmx0O0xpc3RWaWV3IGFuZHJvaWQ6aWQ9JnF1b3Q7QGlkL2FuZHJvaWQ6bGlzdCZxdW90OworICogICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0mcXVvdDttYXRjaF9wYXJlbnQmcXVvdDsKKyAqICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSZxdW90O21hdGNoX3BhcmVudCZxdW90OworICogICAgICAgICAgICAgICBhbmRyb2lkOmJhY2tncm91bmQ9JnF1b3Q7IzAwRkYwMCZxdW90OworICogICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93ZWlnaHQ9JnF1b3Q7MSZxdW90OworICogICAgICAgICAgICAgICBhbmRyb2lkOmRyYXdTZWxlY3Rvck9uVG9wPSZxdW90O2ZhbHNlJnF1b3Q7LyZndDsKKyAqCisgKiAgICAgJmx0O1RleHRWaWV3IGFuZHJvaWQ6aWQ9JnF1b3Q7QGlkL2FuZHJvaWQ6ZW1wdHkmcXVvdDsKKyAqICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9JnF1b3Q7bWF0Y2hfcGFyZW50JnF1b3Q7CisgKiAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0mcXVvdDttYXRjaF9wYXJlbnQmcXVvdDsKKyAqICAgICAgICAgICAgICAgYW5kcm9pZDpiYWNrZ3JvdW5kPSZxdW90OyNGRjAwMDAmcXVvdDsKKyAqICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSZxdW90O05vIGRhdGEmcXVvdDsvJmd0OworICogJmx0Oy9MaW5lYXJMYXlvdXQmZ3Q7CisgKiA8L3ByZT4KKyAqCisgKiA8cD4KKyAqIDxzdHJvbmc+Um93IExheW91dDwvc3Ryb25nPgorICogPC9wPgorICogPHA+CisgKiBZb3UgY2FuIHNwZWNpZnkgdGhlIGxheW91dCBvZiBpbmRpdmlkdWFsIHJvd3MgaW4gdGhlIGxpc3QuIFlvdSBkbyB0aGlzIGJ5CisgKiBzcGVjaWZ5aW5nIGEgbGF5b3V0IHJlc291cmNlIGluIHRoZSBMaXN0QWRhcHRlciBvYmplY3QgaG9zdGVkIGJ5IHRoZSBmcmFnbWVudAorICogKHRoZSBMaXN0QWRhcHRlciBiaW5kcyB0aGUgTGlzdFZpZXcgdG8gdGhlIGRhdGE7IG1vcmUgb24gdGhpcyBsYXRlcikuCisgKiA8cD4KKyAqIEEgTGlzdEFkYXB0ZXIgY29uc3RydWN0b3IgdGFrZXMgYSBwYXJhbWV0ZXIgdGhhdCBzcGVjaWZpZXMgYSBsYXlvdXQgcmVzb3VyY2UKKyAqIGZvciBlYWNoIHJvdy4gSXQgYWxzbyBoYXMgdHdvIGFkZGl0aW9uYWwgcGFyYW1ldGVycyB0aGF0IGxldCB5b3Ugc3BlY2lmeQorICogd2hpY2ggZGF0YSBmaWVsZCB0byBhc3NvY2lhdGUgd2l0aCB3aGljaCBvYmplY3QgaW4gdGhlIHJvdyBsYXlvdXQgcmVzb3VyY2UuCisgKiBUaGVzZSB0d28gcGFyYW1ldGVycyBhcmUgdHlwaWNhbGx5IHBhcmFsbGVsIGFycmF5cy4KKyAqIDwvcD4KKyAqIDxwPgorICogQW5kcm9pZCBwcm92aWRlcyBzb21lIHN0YW5kYXJkIHJvdyBsYXlvdXQgcmVzb3VyY2VzLiBUaGVzZSBhcmUgaW4gdGhlCisgKiB7QGxpbmsgYW5kcm9pZC5SLmxheW91dH0gY2xhc3MsIGFuZCBoYXZlIG5hbWVzIHN1Y2ggYXMgc2ltcGxlX2xpc3RfaXRlbV8xLAorICogc2ltcGxlX2xpc3RfaXRlbV8yLCBhbmQgdHdvX2xpbmVfbGlzdF9pdGVtLiBUaGUgZm9sbG93aW5nIGxheW91dCBYTUwgaXMgdGhlCisgKiBzb3VyY2UgZm9yIHRoZSByZXNvdXJjZSB0d29fbGluZV9saXN0X2l0ZW0sIHdoaWNoIGRpc3BsYXlzIHR3byBkYXRhCisgKiBmaWVsZHMsb25lIGFib3ZlIHRoZSBvdGhlciwgZm9yIGVhY2ggbGlzdCByb3cuCisgKiA8L3A+CisgKgorICogPHByZT4KKyAqICZsdDs/eG1sIHZlcnNpb249JnF1b3Q7MS4wJnF1b3Q7IGVuY29kaW5nPSZxdW90O3V0Zi04JnF1b3Q7PyZndDsKKyAqICZsdDtMaW5lYXJMYXlvdXQgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICogICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSZxdW90O21hdGNoX3BhcmVudCZxdW90OworICogICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0mcXVvdDt3cmFwX2NvbnRlbnQmcXVvdDsKKyAqICAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSZxdW90O3ZlcnRpY2FsJnF1b3Q7Jmd0OworICoKKyAqICAgICAmbHQ7VGV4dFZpZXcgYW5kcm9pZDppZD0mcXVvdDtAK2lkL3RleHQxJnF1b3Q7CisgKiAgICAgICAgIGFuZHJvaWQ6dGV4dFNpemU9JnF1b3Q7MTZzcCZxdW90OworICogICAgICAgICBhbmRyb2lkOnRleHRTdHlsZT0mcXVvdDtib2xkJnF1b3Q7CisgKiAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSZxdW90O21hdGNoX3BhcmVudCZxdW90OworICogICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9JnF1b3Q7d3JhcF9jb250ZW50JnF1b3Q7LyZndDsKKyAqCisgKiAgICAgJmx0O1RleHRWaWV3IGFuZHJvaWQ6aWQ9JnF1b3Q7QCtpZC90ZXh0MiZxdW90OworICogICAgICAgICBhbmRyb2lkOnRleHRTaXplPSZxdW90OzE2c3AmcXVvdDsKKyAqICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9JnF1b3Q7bWF0Y2hfcGFyZW50JnF1b3Q7CisgKiAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0mcXVvdDt3cmFwX2NvbnRlbnQmcXVvdDsvJmd0OworICogJmx0Oy9MaW5lYXJMYXlvdXQmZ3Q7CisgKiA8L3ByZT4KKyAqCisgKiA8cD4KKyAqIFlvdSBtdXN0IGlkZW50aWZ5IHRoZSBkYXRhIGJvdW5kIHRvIGVhY2ggVGV4dFZpZXcgb2JqZWN0IGluIHRoaXMgbGF5b3V0LiBUaGUKKyAqIHN5bnRheCBmb3IgdGhpcyBpcyBkaXNjdXNzZWQgaW4gdGhlIG5leHQgc2VjdGlvbi4KKyAqIDwvcD4KKyAqIDxwPgorICogPHN0cm9uZz5CaW5kaW5nIHRvIERhdGE8L3N0cm9uZz4KKyAqIDwvcD4KKyAqIDxwPgorICogWW91IGJpbmQgdGhlIExpc3RGcmFnbWVudCdzIExpc3RWaWV3IG9iamVjdCB0byBkYXRhIHVzaW5nIGEgY2xhc3MgdGhhdAorICogaW1wbGVtZW50cyB0aGUge0BsaW5rIGFuZHJvaWQud2lkZ2V0Lkxpc3RBZGFwdGVyIExpc3RBZGFwdGVyfSBpbnRlcmZhY2UuCisgKiBBbmRyb2lkIHByb3ZpZGVzIHR3byBzdGFuZGFyZCBsaXN0IGFkYXB0ZXJzOgorICoge0BsaW5rIGFuZHJvaWQud2lkZ2V0LlNpbXBsZUFkYXB0ZXIgU2ltcGxlQWRhcHRlcn0gZm9yIHN0YXRpYyBkYXRhIChNYXBzKSwKKyAqIGFuZCB7QGxpbmsgYW5kcm9pZC53aWRnZXQuU2ltcGxlQ3Vyc29yQWRhcHRlciBTaW1wbGVDdXJzb3JBZGFwdGVyfSBmb3IgQ3Vyc29yCisgKiBxdWVyeSByZXN1bHRzLgorICogPC9wPgorICogPHA+CisgKiBZb3UgPGI+bXVzdDwvYj4gdXNlCisgKiB7QGxpbmsgI3NldExpc3RBZGFwdGVyKExpc3RBZGFwdGVyKSBMaXN0RnJhZ21lbnQuc2V0TGlzdEFkYXB0ZXIoKX0gdG8KKyAqIGFzc29jaWF0ZSB0aGUgbGlzdCB3aXRoIGFuIGFkYXB0ZXIuICBEbyBub3QgZGlyZWN0bHkgY2FsbAorICoge0BsaW5rIExpc3RWaWV3I3NldEFkYXB0ZXIoTGlzdEFkYXB0ZXIpIExpc3RWaWV3LnNldEFkYXB0ZXIoKX0gb3IgZWxzZQorICogaW1wb3J0YW50IGluaXRpYWxpemF0aW9uIHdpbGwgYmUgc2tpcHBlZC4KKyAqIDwvcD4KKyAqCisgKiBAc2VlICNzZXRMaXN0QWRhcHRlcgorICogQHNlZSBhbmRyb2lkLndpZGdldC5MaXN0VmlldworICovCitwdWJsaWMgY2xhc3MgTGlzdEZyYWdtZW50IGV4dGVuZHMgRnJhZ21lbnQgeworICAgIGZpbmFsIHByaXZhdGUgSGFuZGxlciBtSGFuZGxlciA9IG5ldyBIYW5kbGVyKCk7CisKKyAgICBmaW5hbCBwcml2YXRlIFJ1bm5hYmxlIG1SZXF1ZXN0Rm9jdXMgPSBuZXcgUnVubmFibGUoKSB7CisgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgIG1MaXN0LmZvY3VzYWJsZVZpZXdBdmFpbGFibGUobUxpc3QpOworICAgICAgICB9CisgICAgfTsKKyAgICAKKyAgICBmaW5hbCBwcml2YXRlIEFkYXB0ZXJWaWV3Lk9uSXRlbUNsaWNrTGlzdGVuZXIgbU9uQ2xpY2tMaXN0ZW5lcgorICAgICAgICAgICAgPSBuZXcgQWRhcHRlclZpZXcuT25JdGVtQ2xpY2tMaXN0ZW5lcigpIHsKKyAgICAgICAgcHVibGljIHZvaWQgb25JdGVtQ2xpY2soQWRhcHRlclZpZXc8Pz4gcGFyZW50LCBWaWV3IHYsIGludCBwb3NpdGlvbiwgbG9uZyBpZCkgeworICAgICAgICAgICAgb25MaXN0SXRlbUNsaWNrKChMaXN0VmlldylwYXJlbnQsIHYsIHBvc2l0aW9uLCBpZCk7CisgICAgICAgIH0KKyAgICB9OworCisgICAgTGlzdEFkYXB0ZXIgbUFkYXB0ZXI7CisgICAgTGlzdFZpZXcgbUxpc3Q7CisgICAgVmlldyBtRW1wdHlWaWV3OworICAgIFRleHRWaWV3IG1TdGFuZGFyZEVtcHR5VmlldzsKKyAgICBWaWV3IG1Qcm9ncmVzc0NvbnRhaW5lcjsKKyAgICBWaWV3IG1MaXN0Q29udGFpbmVyOworICAgIGJvb2xlYW4gbVNldEVtcHR5VGV4dDsKKyAgICBib29sZWFuIG1MaXN0U2hvd247CisKKyAgICBwdWJsaWMgTGlzdEZyYWdtZW50KCkgeworICAgIH0KKworICAgIC8qKgorICAgICAqIFByb3ZpZGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiB0byByZXR1cm4gYSBzaW1wbGUgbGlzdCB2aWV3LiAgU3ViY2xhc3NlcworICAgICAqIGNhbiBvdmVycmlkZSB0byByZXBsYWNlIHdpdGggdGhlaXIgb3duIGxheW91dC4gIElmIGRvaW5nIHNvLCB0aGUKKyAgICAgKiByZXR1cm5lZCB2aWV3IGhpZXJhcmNoeSA8ZW0+bXVzdDwvZW0+IGhhdmUgYSBMaXN0VmlldyB3aG9zZSBpZAorICAgICAqIGlzIHtAbGluayBhbmRyb2lkLlIuaWQjbGlzdCBhbmRyb2lkLlIuaWQubGlzdH0gYW5kIGNhbiBvcHRpb25hbGx5CisgICAgICogaGF2ZSBhIHNpYmxpbmcgdmlldyBpZCB7QGxpbmsgYW5kcm9pZC5SLmlkI2VtcHR5IGFuZHJvaWQuUi5pZC5lbXB0eX0KKyAgICAgKiB0aGF0IGlzIHRvIGJlIHNob3duIHdoZW4gdGhlIGxpc3QgaXMgZW1wdHkuCisgICAgICogCisgICAgICogPHA+SWYgeW91IGFyZSBvdmVycmlkaW5nIHRoaXMgbWV0aG9kIHdpdGggeW91ciBvd24gY3VzdG9tIGNvbnRlbnQsCisgICAgICogY29uc2lkZXIgaW5jbHVkaW5nIHRoZSBzdGFuZGFyZCBsYXlvdXQge0BsaW5rIGFuZHJvaWQuUi5sYXlvdXQjbGlzdF9jb250ZW50fQorICAgICAqIGluIHlvdXIgbGF5b3V0IGZpbGUsIHNvIHRoYXQgeW91IGNvbnRpbnVlIHRvIHJldGFpbiBhbGwgb2YgdGhlIHN0YW5kYXJkCisgICAgICogYmVoYXZpb3Igb2YgTGlzdEZyYWdtZW50LiAgSW4gcGFydGljdWxhciwgdGhpcyBpcyBjdXJyZW50bHkgdGhlIG9ubHkKKyAgICAgKiB3YXkgdG8gaGF2ZSB0aGUgYnVpbHQtaW4gaW5kZXRlcm1pbmFudCBwcm9ncmVzcyBzdGF0ZSBiZSBzaG93bi4KKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgVmlldyBvbkNyZWF0ZVZpZXcoTGF5b3V0SW5mbGF0ZXIgaW5mbGF0ZXIsIFZpZXdHcm91cCBjb250YWluZXIsCisgICAgICAgICAgICBCdW5kbGUgc2F2ZWRJbnN0YW5jZVN0YXRlKSB7CisgICAgICAgIHJldHVybiBpbmZsYXRlci5pbmZsYXRlKGNvbS5hbmRyb2lkLmludGVybmFsLlIubGF5b3V0Lmxpc3RfY29udGVudCwKKyAgICAgICAgICAgICAgICBjb250YWluZXIsIGZhbHNlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBdHRhY2ggdG8gbGlzdCB2aWV3IG9uY2UgRnJhZ21lbnQgaXMgcmVhZHkgdG8gcnVuLgorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9uQWN0aXZpdHlDcmVhdGVkKEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpIHsKKyAgICAgICAgc3VwZXIub25BY3Rpdml0eUNyZWF0ZWQoc2F2ZWRJbnN0YW5jZVN0YXRlKTsKKyAgICAgICAgZW5zdXJlTGlzdCgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIERldGFjaCBmcm9tIGxpc3Qgdmlldy4KKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvbkRlc3Ryb3lWaWV3KCkgeworICAgICAgICBtSGFuZGxlci5yZW1vdmVDYWxsYmFja3MobVJlcXVlc3RGb2N1cyk7CisgICAgICAgIG1MaXN0ID0gbnVsbDsKKyAgICAgICAgc3VwZXIub25EZXN0cm95VmlldygpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoaXMgbWV0aG9kIHdpbGwgYmUgY2FsbGVkIHdoZW4gYW4gaXRlbSBpbiB0aGUgbGlzdCBpcyBzZWxlY3RlZC4KKyAgICAgKiBTdWJjbGFzc2VzIHNob3VsZCBvdmVycmlkZS4gU3ViY2xhc3NlcyBjYW4gY2FsbAorICAgICAqIGdldExpc3RWaWV3KCkuZ2V0SXRlbUF0UG9zaXRpb24ocG9zaXRpb24pIGlmIHRoZXkgbmVlZCB0byBhY2Nlc3MgdGhlCisgICAgICogZGF0YSBhc3NvY2lhdGVkIHdpdGggdGhlIHNlbGVjdGVkIGl0ZW0uCisgICAgICoKKyAgICAgKiBAcGFyYW0gbCBUaGUgTGlzdFZpZXcgd2hlcmUgdGhlIGNsaWNrIGhhcHBlbmVkCisgICAgICogQHBhcmFtIHYgVGhlIHZpZXcgdGhhdCB3YXMgY2xpY2tlZCB3aXRoaW4gdGhlIExpc3RWaWV3CisgICAgICogQHBhcmFtIHBvc2l0aW9uIFRoZSBwb3NpdGlvbiBvZiB0aGUgdmlldyBpbiB0aGUgbGlzdAorICAgICAqIEBwYXJhbSBpZCBUaGUgcm93IGlkIG9mIHRoZSBpdGVtIHRoYXQgd2FzIGNsaWNrZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBvbkxpc3RJdGVtQ2xpY2soTGlzdFZpZXcgbCwgVmlldyB2LCBpbnQgcG9zaXRpb24sIGxvbmcgaWQpIHsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQcm92aWRlIHRoZSBjdXJzb3IgZm9yIHRoZSBsaXN0IHZpZXcuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0TGlzdEFkYXB0ZXIoTGlzdEFkYXB0ZXIgYWRhcHRlcikgeworICAgICAgICBib29sZWFuIGhhZEFkYXB0ZXIgPSBtQWRhcHRlciAhPSBudWxsOworICAgICAgICBtQWRhcHRlciA9IGFkYXB0ZXI7CisgICAgICAgIGlmIChtTGlzdCAhPSBudWxsKSB7CisgICAgICAgICAgICBtTGlzdC5zZXRBZGFwdGVyKGFkYXB0ZXIpOworICAgICAgICAgICAgaWYgKCFtTGlzdFNob3duICYmICFoYWRBZGFwdGVyKSB7CisgICAgICAgICAgICAgICAgLy8gVGhlIGxpc3Qgd2FzIGhpZGRlbiwgYW5kIHByZXZpb3VzbHkgZGlkbid0IGhhdmUgYW4KKyAgICAgICAgICAgICAgICAvLyBhZGFwdGVyLiAgSXQgaXMgbm93IHRpbWUgdG8gc2hvdyBpdC4KKyAgICAgICAgICAgICAgICBzZXRMaXN0U2hvd24odHJ1ZSwgZ2V0VmlldygpLmdldFdpbmRvd1Rva2VuKCkgIT0gbnVsbCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCBsaXN0IGl0ZW0gdG8gdGhlIHNwZWNpZmllZAorICAgICAqIHBvc2l0aW9uIHdpdGggdGhlIGFkYXB0ZXIncyBkYXRhCisgICAgICoKKyAgICAgKiBAcGFyYW0gcG9zaXRpb24KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRTZWxlY3Rpb24oaW50IHBvc2l0aW9uKSB7CisgICAgICAgIGVuc3VyZUxpc3QoKTsKKyAgICAgICAgbUxpc3Quc2V0U2VsZWN0aW9uKHBvc2l0aW9uKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIHBvc2l0aW9uIG9mIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgbGlzdCBpdGVtLgorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0U2VsZWN0ZWRJdGVtUG9zaXRpb24oKSB7CisgICAgICAgIGVuc3VyZUxpc3QoKTsKKyAgICAgICAgcmV0dXJuIG1MaXN0LmdldFNlbGVjdGVkSXRlbVBvc2l0aW9uKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSBjdXJzb3Igcm93IElEIG9mIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgbGlzdCBpdGVtLgorICAgICAqLworICAgIHB1YmxpYyBsb25nIGdldFNlbGVjdGVkSXRlbUlkKCkgeworICAgICAgICBlbnN1cmVMaXN0KCk7CisgICAgICAgIHJldHVybiBtTGlzdC5nZXRTZWxlY3RlZEl0ZW1JZCgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB0aGUgYWN0aXZpdHkncyBsaXN0IHZpZXcgd2lkZ2V0LgorICAgICAqLworICAgIHB1YmxpYyBMaXN0VmlldyBnZXRMaXN0VmlldygpIHsKKyAgICAgICAgZW5zdXJlTGlzdCgpOworICAgICAgICByZXR1cm4gbUxpc3Q7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIGRlZmF1bHQgY29udGVudCBmb3IgYSBMaXN0RnJhZ21lbnQgaGFzIGEgVGV4dFZpZXcgdGhhdCBjYW4KKyAgICAgKiBiZSBzaG93biB3aGVuIHRoZSBsaXN0IGlzIGVtcHR5LiAgSWYgeW91IHdvdWxkIGxpa2UgdG8gaGF2ZSBpdAorICAgICAqIHNob3duLCBjYWxsIHRoaXMgbWV0aG9kIHRvIHN1cHBseSB0aGUgdGV4dCBpdCBzaG91bGQgdXNlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEVtcHR5VGV4dChDaGFyU2VxdWVuY2UgdGV4dCkgeworICAgICAgICBlbnN1cmVMaXN0KCk7CisgICAgICAgIGlmIChtU3RhbmRhcmRFbXB0eVZpZXcgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiQ2FuJ3QgYmUgdXNlZCB3aXRoIGEgY3VzdG9tIGNvbnRlbnQgdmlldyIpOworICAgICAgICB9CisgICAgICAgIG1TdGFuZGFyZEVtcHR5Vmlldy5zZXRUZXh0KHRleHQpOworICAgICAgICBpZiAoIW1TZXRFbXB0eVRleHQpIHsKKyAgICAgICAgICAgIG1MaXN0LnNldEVtcHR5VmlldyhtU3RhbmRhcmRFbXB0eVZpZXcpOworICAgICAgICAgICAgbVNldEVtcHR5VGV4dCA9IHRydWU7CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogQ29udHJvbCB3aGV0aGVyIHRoZSBsaXN0IGlzIGJlaW5nIGRpc3BsYXllZC4gIFlvdSBjYW4gbWFrZSBpdCBub3QKKyAgICAgKiBkaXNwbGF5ZWQgaWYgeW91IGFyZSB3YWl0aW5nIGZvciB0aGUgaW5pdGlhbCBkYXRhIHRvIHNob3cgaW4gaXQuICBEdXJpbmcKKyAgICAgKiB0aGlzIHRpbWUgYW4gaW5kZXRlcm1pbmFudCBwcm9ncmVzcyBpbmRpY2F0b3Igd2lsbCBiZSBzaG93biBpbnN0ZWFkLgorICAgICAqIAorICAgICAqIDxwPkFwcGxpY2F0aW9ucyBkbyBub3Qgbm9ybWFsbHkgbmVlZCB0byB1c2UgdGhpcyB0aGVtc2VsdmVzLiAgVGhlIGRlZmF1bHQKKyAgICAgKiBiZWhhdmlvciBvZiBMaXN0RnJhZ21lbnQgaXMgdG8gc3RhcnQgd2l0aCB0aGUgbGlzdCBub3QgYmVpbmcgc2hvd24sIG9ubHkKKyAgICAgKiBzaG93aW5nIGl0IG9uY2UgYW4gYWRhcHRlciBpcyBnaXZlbiB3aXRoIHtAbGluayAjc2V0TGlzdEFkYXB0ZXIoTGlzdEFkYXB0ZXIpfS4KKyAgICAgKiBJZiB0aGUgbGlzdCBhdCB0aGF0IHBvaW50IGhhZCBub3QgYmVlbiBzaG93biwgd2hlbiBpdCBkb2VzIGdldCBzaG93bgorICAgICAqIGl0IHdpbGwgYmUgZG8gd2l0aG91dCB0aGUgdXNlciBldmVyIHNlZWluZyB0aGUgaGlkZGVuIHN0YXRlLgorICAgICAqIAorICAgICAqIEBwYXJhbSBzaG93biBJZiB0cnVlLCB0aGUgbGlzdCB2aWV3IGlzIHNob3duOyBpZiBmYWxzZSwgdGhlIHByb2dyZXNzCisgICAgICogaW5kaWNhdG9yLiAgVGhlIGluaXRpYWwgdmFsdWUgaXMgdHJ1ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRMaXN0U2hvd24oYm9vbGVhbiBzaG93bikgeworICAgICAgICBzZXRMaXN0U2hvd24oc2hvd24sIHRydWUpOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBMaWtlIHtAbGluayAjc2V0TGlzdFNob3duKGJvb2xlYW4pfSwgYnV0IG5vIGFuaW1hdGlvbiBpcyB1c2VkIHdoZW4KKyAgICAgKiB0cmFuc2l0aW9uaW5nIGZyb20gdGhlIHByZXZpb3VzIHN0YXRlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldExpc3RTaG93bk5vQW5pbWF0aW9uKGJvb2xlYW4gc2hvd24pIHsKKyAgICAgICAgc2V0TGlzdFNob3duKHNob3duLCBmYWxzZSk7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIENvbnRyb2wgd2hldGhlciB0aGUgbGlzdCBpcyBiZWluZyBkaXNwbGF5ZWQuICBZb3UgY2FuIG1ha2UgaXQgbm90CisgICAgICogZGlzcGxheWVkIGlmIHlvdSBhcmUgd2FpdGluZyBmb3IgdGhlIGluaXRpYWwgZGF0YSB0byBzaG93IGluIGl0LiAgRHVyaW5nCisgICAgICogdGhpcyB0aW1lIGFuIGluZGV0ZXJtaW5hbnQgcHJvZ3Jlc3MgaW5kaWNhdG9yIHdpbGwgYmUgc2hvd24gaW5zdGVhZC4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gc2hvd24gSWYgdHJ1ZSwgdGhlIGxpc3QgdmlldyBpcyBzaG93bjsgaWYgZmFsc2UsIHRoZSBwcm9ncmVzcworICAgICAqIGluZGljYXRvci4gIFRoZSBpbml0aWFsIHZhbHVlIGlzIHRydWUuCisgICAgICogQHBhcmFtIGFuaW1hdGUgSWYgdHJ1ZSwgYW4gYW5pbWF0aW9uIHdpbGwgYmUgdXNlZCB0byB0cmFuc2l0aW9uIHRvIHRoZQorICAgICAqIG5ldyBzdGF0ZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgc2V0TGlzdFNob3duKGJvb2xlYW4gc2hvd24sIGJvb2xlYW4gYW5pbWF0ZSkgeworICAgICAgICBlbnN1cmVMaXN0KCk7CisgICAgICAgIGlmIChtUHJvZ3Jlc3NDb250YWluZXIgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiQ2FuJ3QgYmUgdXNlZCB3aXRoIGEgY3VzdG9tIGNvbnRlbnQgdmlldyIpOworICAgICAgICB9CisgICAgICAgIGlmIChtTGlzdFNob3duID09IHNob3duKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgbUxpc3RTaG93biA9IHNob3duOworICAgICAgICBpZiAoc2hvd24pIHsKKyAgICAgICAgICAgIGlmIChhbmltYXRlKSB7CisgICAgICAgICAgICAgICAgbVByb2dyZXNzQ29udGFpbmVyLnN0YXJ0QW5pbWF0aW9uKEFuaW1hdGlvblV0aWxzLmxvYWRBbmltYXRpb24oCisgICAgICAgICAgICAgICAgICAgICAgICBnZXRBY3Rpdml0eSgpLCBhbmRyb2lkLlIuYW5pbS5mYWRlX291dCkpOworICAgICAgICAgICAgICAgIG1MaXN0Q29udGFpbmVyLnN0YXJ0QW5pbWF0aW9uKEFuaW1hdGlvblV0aWxzLmxvYWRBbmltYXRpb24oCisgICAgICAgICAgICAgICAgICAgICAgICBnZXRBY3Rpdml0eSgpLCBhbmRyb2lkLlIuYW5pbS5mYWRlX2luKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtUHJvZ3Jlc3NDb250YWluZXIuc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOworICAgICAgICAgICAgbUxpc3RDb250YWluZXIuc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKGFuaW1hdGUpIHsKKyAgICAgICAgICAgICAgICBtUHJvZ3Jlc3NDb250YWluZXIuc3RhcnRBbmltYXRpb24oQW5pbWF0aW9uVXRpbHMubG9hZEFuaW1hdGlvbigKKyAgICAgICAgICAgICAgICAgICAgICAgIGdldEFjdGl2aXR5KCksIGFuZHJvaWQuUi5hbmltLmZhZGVfaW4pKTsKKyAgICAgICAgICAgICAgICBtTGlzdENvbnRhaW5lci5zdGFydEFuaW1hdGlvbihBbmltYXRpb25VdGlscy5sb2FkQW5pbWF0aW9uKAorICAgICAgICAgICAgICAgICAgICAgICAgZ2V0QWN0aXZpdHkoKSwgYW5kcm9pZC5SLmFuaW0uZmFkZV9vdXQpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1Qcm9ncmVzc0NvbnRhaW5lci5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7CisgICAgICAgICAgICBtTGlzdENvbnRhaW5lci5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogR2V0IHRoZSBMaXN0QWRhcHRlciBhc3NvY2lhdGVkIHdpdGggdGhpcyBhY3Rpdml0eSdzIExpc3RWaWV3LgorICAgICAqLworICAgIHB1YmxpYyBMaXN0QWRhcHRlciBnZXRMaXN0QWRhcHRlcigpIHsKKyAgICAgICAgcmV0dXJuIG1BZGFwdGVyOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBlbnN1cmVMaXN0KCkgeworICAgICAgICBpZiAobUxpc3QgIT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIFZpZXcgcm9vdCA9IGdldFZpZXcoKTsKKyAgICAgICAgaWYgKHJvb3QgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiQ29udGVudCB2aWV3IG5vdCB5ZXQgY3JlYXRlZCIpOworICAgICAgICB9CisgICAgICAgIGlmIChyb290IGluc3RhbmNlb2YgTGlzdFZpZXcpIHsKKyAgICAgICAgICAgIG1MaXN0ID0gKExpc3RWaWV3KXJvb3Q7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtU3RhbmRhcmRFbXB0eVZpZXcgPSAoVGV4dFZpZXcpcm9vdC5maW5kVmlld0J5SWQoCisgICAgICAgICAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuaWQuaW50ZXJuYWxFbXB0eSk7CisgICAgICAgICAgICBpZiAobVN0YW5kYXJkRW1wdHlWaWV3ID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBtRW1wdHlWaWV3ID0gcm9vdC5maW5kVmlld0J5SWQoYW5kcm9pZC5SLmlkLmVtcHR5KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1Qcm9ncmVzc0NvbnRhaW5lciA9IHJvb3QuZmluZFZpZXdCeUlkKGNvbS5hbmRyb2lkLmludGVybmFsLlIuaWQucHJvZ3Jlc3NDb250YWluZXIpOworICAgICAgICAgICAgbUxpc3RDb250YWluZXIgPSByb290LmZpbmRWaWV3QnlJZChjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmlkLmxpc3RDb250YWluZXIpOworICAgICAgICAgICAgVmlldyByYXdMaXN0VmlldyA9IHJvb3QuZmluZFZpZXdCeUlkKGFuZHJvaWQuUi5pZC5saXN0KTsKKyAgICAgICAgICAgIGlmICghKHJhd0xpc3RWaWV3IGluc3RhbmNlb2YgTGlzdFZpZXcpKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICAgICAiQ29udGVudCBoYXMgdmlldyB3aXRoIGlkIGF0dHJpYnV0ZSAnYW5kcm9pZC5SLmlkLmxpc3QnICIKKyAgICAgICAgICAgICAgICAgICAgICAgICsgInRoYXQgaXMgbm90IGEgTGlzdFZpZXcgY2xhc3MiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1MaXN0ID0gKExpc3RWaWV3KXJhd0xpc3RWaWV3OworICAgICAgICAgICAgaWYgKG1MaXN0ID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgICAgICJZb3VyIGNvbnRlbnQgbXVzdCBoYXZlIGEgTGlzdFZpZXcgd2hvc2UgaWQgYXR0cmlidXRlIGlzICIgKworICAgICAgICAgICAgICAgICAgICAgICAgIidhbmRyb2lkLlIuaWQubGlzdCciKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChtRW1wdHlWaWV3ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBtTGlzdC5zZXRFbXB0eVZpZXcobUVtcHR5Vmlldyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgbUxpc3RTaG93biA9IHRydWU7CisgICAgICAgIG1MaXN0LnNldE9uSXRlbUNsaWNrTGlzdGVuZXIobU9uQ2xpY2tMaXN0ZW5lcik7CisgICAgICAgIGlmIChtQWRhcHRlciAhPSBudWxsKSB7CisgICAgICAgICAgICBzZXRMaXN0QWRhcHRlcihtQWRhcHRlcik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBXZSBhcmUgc3RhcnRpbmcgd2l0aG91dCBhbiBhZGFwdGVyLCBzbyBhc3N1bWUgd2Ugd29uJ3QKKyAgICAgICAgICAgIC8vIGhhdmUgb3VyIGRhdGEgcmlnaHQgYXdheSBhbmQgc3RhcnQgd2l0aCB0aGUgcHJvZ3Jlc3MgaW5kaWNhdG9yLgorICAgICAgICAgICAgaWYgKG1Qcm9ncmVzc0NvbnRhaW5lciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgc2V0TGlzdFNob3duKGZhbHNlLCBmYWxzZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgbUhhbmRsZXIucG9zdChtUmVxdWVzdEZvY3VzKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9hcHAvTG9hZGVyTWFuYWdlci5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvYXBwL0xvYWRlck1hbmFnZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOGFiY2FhCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvYXBwL0xvYWRlck1hbmFnZXIuamF2YQpAQCAtMCwwICsxLDQwMiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5hcHA7CisKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuTG9hZGVyOworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CitpbXBvcnQgYW5kcm9pZC51dGlsLlNwYXJzZUFycmF5OworCisvKioKKyAqIEludGVyZmFjZSBhc3NvY2lhdGVkIHdpdGggYW4ge0BsaW5rIEFjdGl2aXR5fSBvciB7QGxpbmsgRnJhZ21lbnR9IGZvciBtYW5hZ2luZworICogb25lIG9yIG1vcmUge0BsaW5rIGFuZHJvaWQuY29udGVudC5Mb2FkZXJ9IGluc3RhbmNlcyBhc3NvY2lhdGVkIHdpdGggaXQuCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgTG9hZGVyTWFuYWdlciB7CisgICAgLyoqCisgICAgICogQ2FsbGJhY2sgaW50ZXJmYWNlIGZvciBhIGNsaWVudCB0byBpbnRlcmFjdCB3aXRoIHRoZSBtYW5hZ2VyLgorICAgICAqLworICAgIHB1YmxpYyBpbnRlcmZhY2UgTG9hZGVyQ2FsbGJhY2tzPEQ+IHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEluc3RhbnRpYXRlIGFuZCByZXR1cm4gYSBuZXcgTG9hZGVyIGZvciB0aGUgZ2l2ZW4gSUQuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBpZCBUaGUgSUQgd2hvc2UgbG9hZGVyIGlzIHRvIGJlIGNyZWF0ZWQuCisgICAgICAgICAqIEBwYXJhbSBhcmdzIEFueSBhcmd1bWVudHMgc3VwcGxpZWQgYnkgdGhlIGNhbGxlci4KKyAgICAgICAgICogQHJldHVybiBSZXR1cm4gYSBuZXcgTG9hZGVyIGluc3RhbmNlIHRoYXQgaXMgcmVhZHkgdG8gc3RhcnQgbG9hZGluZy4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBMb2FkZXI8RD4gb25DcmVhdGVMb2FkZXIoaW50IGlkLCBCdW5kbGUgYXJncyk7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIENhbGxlZCB3aGVuIGEgcHJldmlvdXNseSBjcmVhdGVkIGxvYWRlciBoYXMgZmluaXNoZWQgaXRzIGxvYWQuCisgICAgICAgICAqIEBwYXJhbSBsb2FkZXIgVGhlIExvYWRlciB0aGF0IGhhcyBmaW5pc2hlZC4KKyAgICAgICAgICogQHBhcmFtIGRhdGEgVGhlIGRhdGEgZ2VuZXJhdGVkIGJ5IHRoZSBMb2FkZXIuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgdm9pZCBvbkxvYWRGaW5pc2hlZChMb2FkZXI8RD4gbG9hZGVyLCBEIGRhdGEpOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBFbnN1cmVzIGEgbG9hZGVyIGlzIGluaXRpYWxpemVkIGFuZCBhY3RpdmUuICBJZiB0aGUgbG9hZGVyIGRvZXNuJ3QKKyAgICAgKiBhbHJlYWR5IGV4aXN0LCBvbmUgaXMgY3JlYXRlZCBhbmQgKGlmIHRoZSBhY3Rpdml0eS9mcmFnbWVudCBpcyBjdXJyZW50bHkKKyAgICAgKiBzdGFydGVkKSBzdGFydHMgdGhlIGxvYWRlci4gIE90aGVyd2lzZSB0aGUgbGFzdCBjcmVhdGVkCisgICAgICogbG9hZGVyIGlzIHJlLXVzZWQuCisgICAgICoKKyAgICAgKiA8cD5JbiBlaXRoZXIgY2FzZSwgdGhlIGdpdmVuIGNhbGxiYWNrIGlzIGFzc29jaWF0ZWQgd2l0aCB0aGUgbG9hZGVyLCBhbmQKKyAgICAgKiB3aWxsIGJlIGNhbGxlZCBhcyB0aGUgbG9hZGVyIHN0YXRlIGNoYW5nZXMuICBJZiBhdCB0aGUgcG9pbnQgb2YgY2FsbAorICAgICAqIHRoZSBjYWxsZXIgaXMgaW4gaXRzIHN0YXJ0ZWQgc3RhdGUsIGFuZCB0aGUgcmVxdWVzdGVkIGxvYWRlcgorICAgICAqIGFscmVhZHkgZXhpc3RzIGFuZCBoYXMgZ2VuZXJhdGVkIGl0cyBkYXRhLCB0aGVuCisgICAgICogY2FsbGJhY2suIHtAbGluayBMb2FkZXJDYWxsYmFja3Mjb25Mb2FkRmluaXNoZWR9IHdpbGwKKyAgICAgKiBiZSBjYWxsZWQgaW1tZWRpYXRlbHkgKGluc2lkZSBvZiB0aGlzIGZ1bmN0aW9uKSwgc28geW91IG11c3QgYmUgcHJlcGFyZWQKKyAgICAgKiBmb3IgdGhpcyB0byBoYXBwZW4uCisgICAgICovCisgICAgcHVibGljIDxEPiBMb2FkZXI8RD4gaW5pdExvYWRlcihpbnQgaWQsIEJ1bmRsZSBhcmdzLAorICAgICAgICAgICAgTG9hZGVyTWFuYWdlci5Mb2FkZXJDYWxsYmFja3M8RD4gY2FsbGJhY2spOworCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIG5ldyBsb2FkZXIgaW4gdGhpcyBtYW5hZ2VyLCByZWdpc3RlcnMgdGhlIGNhbGxiYWNrcyB0byBpdCwKKyAgICAgKiBhbmQgKGlmIHRoZSBhY3Rpdml0eS9mcmFnbWVudCBpcyBjdXJyZW50bHkgc3RhcnRlZCkgc3RhcnRzIGxvYWRpbmcgaXQuCisgICAgICogSWYgYSBsb2FkZXIgd2l0aCB0aGUgc2FtZSBpZCBoYXMgcHJldmlvdXNseSBiZWVuCisgICAgICogc3RhcnRlZCBpdCB3aWxsIGF1dG9tYXRpY2FsbHkgYmUgZGVzdHJveWVkIHdoZW4gdGhlIG5ldyBsb2FkZXIgY29tcGxldGVzCisgICAgICogaXRzIHdvcmsuIFRoZSBjYWxsYmFjayB3aWxsIGJlIGRlbGl2ZXJlZCBiZWZvcmUgdGhlIG9sZCBsb2FkZXIKKyAgICAgKiBpcyBkZXN0cm95ZWQuCisgICAgICovCisgICAgcHVibGljIDxEPiBMb2FkZXI8RD4gcmVzdGFydExvYWRlcihpbnQgaWQsIEJ1bmRsZSBhcmdzLAorICAgICAgICAgICAgTG9hZGVyTWFuYWdlci5Mb2FkZXJDYWxsYmFja3M8RD4gY2FsbGJhY2spOworCisgICAgLyoqCisgICAgICogU3RvcHMgYW5kIHJlbW92ZXMgdGhlIGxvYWRlciB3aXRoIHRoZSBnaXZlbiBJRC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzdG9wTG9hZGVyKGludCBpZCk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIExvYWRlciB3aXRoIHRoZSBnaXZlbiBpZCBvciBudWxsIGlmIG5vIG1hdGNoaW5nIExvYWRlcgorICAgICAqIGlzIGZvdW5kLgorICAgICAqLworICAgIHB1YmxpYyA8RD4gTG9hZGVyPEQ+IGdldExvYWRlcihpbnQgaWQpOworfQorCitjbGFzcyBMb2FkZXJNYW5hZ2VySW1wbCBpbXBsZW1lbnRzIExvYWRlck1hbmFnZXIgeworICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIkxvYWRlck1hbmFnZXJJbXBsIjsKKyAgICBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVRyA9IHRydWU7CisKKyAgICAvLyBUaGVzZSBhcmUgdGhlIGN1cnJlbnRseSBhY3RpdmUgbG9hZGVycy4gIEEgbG9hZGVyIGlzIGhlcmUKKyAgICAvLyBmcm9tIHRoZSB0aW1lIGl0cyBsb2FkIGlzIHN0YXJ0ZWQgdW50aWwgaXQgaGFzIGJlZW4gZXhwbGljaXRseQorICAgIC8vIHN0b3BwZWQgb3IgcmVzdGFydGVkIGJ5IHRoZSBhcHBsaWNhdGlvbi4KKyAgICBmaW5hbCBTcGFyc2VBcnJheTxMb2FkZXJJbmZvPiBtTG9hZGVycyA9IG5ldyBTcGFyc2VBcnJheTxMb2FkZXJJbmZvPigpOworCisgICAgLy8gVGhlc2UgYXJlIHByZXZpb3VzbHkgcnVuIGxvYWRlcnMuICBUaGlzIGxpc3QgaXMgbWFpbnRhaW5lZCBpbnRlcm5hbGx5CisgICAgLy8gdG8gYXZvaWQgZGVzdHJveWluZyBhIGxvYWRlciB3aGlsZSBhbiBhcHBsaWNhdGlvbiBpcyBzdGlsbCB1c2luZyBpdC4KKyAgICAvLyBJdCBhbGxvd3MgYW4gYXBwbGljYXRpb24gdG8gcmVzdGFydCBhIGxvYWRlciwgYnV0IGNvbnRpbnVlIHVzaW5nIGl0cworICAgIC8vIHByZXZpb3VzbHkgcnVuIGxvYWRlciB1bnRpbCB0aGUgbmV3IGxvYWRlcidzIGRhdGEgaXMgYXZhaWxhYmxlLgorICAgIGZpbmFsIFNwYXJzZUFycmF5PExvYWRlckluZm8+IG1JbmFjdGl2ZUxvYWRlcnMgPSBuZXcgU3BhcnNlQXJyYXk8TG9hZGVySW5mbz4oKTsKKworICAgIGJvb2xlYW4gbVN0YXJ0ZWQ7CisgICAgYm9vbGVhbiBtUmV0YWluaW5nOworICAgIGJvb2xlYW4gbVJldGFpbmluZ1N0YXJ0ZWQ7CisKKyAgICBmaW5hbCBjbGFzcyBMb2FkZXJJbmZvIGltcGxlbWVudHMgTG9hZGVyLk9uTG9hZENvbXBsZXRlTGlzdGVuZXI8T2JqZWN0PiB7CisgICAgICAgIGZpbmFsIGludCBtSWQ7CisgICAgICAgIGZpbmFsIEJ1bmRsZSBtQXJnczsKKyAgICAgICAgTG9hZGVyTWFuYWdlci5Mb2FkZXJDYWxsYmFja3M8T2JqZWN0PiBtQ2FsbGJhY2tzOworICAgICAgICBMb2FkZXI8T2JqZWN0PiBtTG9hZGVyOworICAgICAgICBPYmplY3QgbURhdGE7CisgICAgICAgIGJvb2xlYW4gbVN0YXJ0ZWQ7CisgICAgICAgIGJvb2xlYW4gbVJldGFpbmluZzsKKyAgICAgICAgYm9vbGVhbiBtUmV0YWluaW5nU3RhcnRlZDsKKyAgICAgICAgYm9vbGVhbiBtRGVzdHJveWVkOworICAgICAgICBib29sZWFuIG1MaXN0ZW5lclJlZ2lzdGVyZWQ7CisgICAgICAgIAorICAgICAgICBwdWJsaWMgTG9hZGVySW5mbyhpbnQgaWQsIEJ1bmRsZSBhcmdzLCBMb2FkZXJNYW5hZ2VyLkxvYWRlckNhbGxiYWNrczxPYmplY3Q+IGNhbGxiYWNrcykgeworICAgICAgICAgICAgbUlkID0gaWQ7CisgICAgICAgICAgICBtQXJncyA9IGFyZ3M7CisgICAgICAgICAgICBtQ2FsbGJhY2tzID0gY2FsbGJhY2tzOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICB2b2lkIHN0YXJ0KCkgeworICAgICAgICAgICAgaWYgKG1SZXRhaW5pbmcgJiYgbVJldGFpbmluZ1N0YXJ0ZWQpIHsKKyAgICAgICAgICAgICAgICAvLyBPdXIgb3duZXIgaXMgc3RhcnRlZCwgYnV0IHdlIHdlcmUgYmVpbmcgcmV0YWluZWQgZnJvbSBhCisgICAgICAgICAgICAgICAgLy8gcHJldmlvdXMgaW5zdGFuY2UgaW4gdGhlIHN0YXJ0ZWQgc3RhdGUuLi4gIHNvIHRoZXJlIGlzIHJlYWxseQorICAgICAgICAgICAgICAgIC8vIG5vdGhpbmcgdG8gZG8gaGVyZSwgc2luY2UgdGhlIGxvYWRlcnMgYXJlIHN0aWxsIHN0YXJ0ZWQuCisgICAgICAgICAgICAgICAgbVN0YXJ0ZWQgPSB0cnVlOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKG1TdGFydGVkKSB7CisgICAgICAgICAgICAgICAgLy8gSWYgbG9hZGVyIGFscmVhZHkgc3RhcnRlZCwgZG9uJ3QgcmVzdGFydC4KKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChERUJVRykgTG9nLnYoVEFHLCAiICBTdGFydGluZzogIiArIHRoaXMpOworICAgICAgICAgICAgaWYgKG1Mb2FkZXIgPT0gbnVsbCAmJiBtQ2FsbGJhY2tzICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgIG1Mb2FkZXIgPSBtQ2FsbGJhY2tzLm9uQ3JlYXRlTG9hZGVyKG1JZCwgbUFyZ3MpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG1Mb2FkZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGlmICghbUxpc3RlbmVyUmVnaXN0ZXJlZCkgeworICAgICAgICAgICAgICAgICAgICBtTG9hZGVyLnJlZ2lzdGVyTGlzdGVuZXIobUlkLCB0aGlzKTsKKyAgICAgICAgICAgICAgICAgICAgbUxpc3RlbmVyUmVnaXN0ZXJlZCA9IHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG1Mb2FkZXIuc3RhcnRMb2FkaW5nKCk7CisgICAgICAgICAgICAgICAgbVN0YXJ0ZWQgPSB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIAorICAgICAgICB2b2lkIHJldGFpbigpIHsKKyAgICAgICAgICAgIGlmIChERUJVRykgTG9nLnYoVEFHLCAiICBSZXRhaW5pbmc6ICIgKyB0aGlzKTsKKyAgICAgICAgICAgIG1SZXRhaW5pbmcgPSB0cnVlOworICAgICAgICAgICAgbVJldGFpbmluZ1N0YXJ0ZWQgPSBtU3RhcnRlZDsKKyAgICAgICAgICAgIG1TdGFydGVkID0gZmFsc2U7CisgICAgICAgICAgICBtQ2FsbGJhY2tzID0gbnVsbDsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgdm9pZCBmaW5pc2hSZXRhaW4oKSB7CisgICAgICAgICAgICBpZiAobVJldGFpbmluZykgeworICAgICAgICAgICAgICAgIGlmIChERUJVRykgTG9nLnYoVEFHLCAiICBGaW5pc2hlZCBSZXRhaW5pbmc6ICIgKyB0aGlzKTsKKyAgICAgICAgICAgICAgICBtUmV0YWluaW5nID0gZmFsc2U7CisgICAgICAgICAgICAgICAgaWYgKG1TdGFydGVkICE9IG1SZXRhaW5pbmdTdGFydGVkKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICghbVN0YXJ0ZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoaXMgbG9hZGVyIHdhcyByZXRhaW5lZCBpbiBhIHN0YXJ0ZWQgc3RhdGUsIGJ1dAorICAgICAgICAgICAgICAgICAgICAgICAgLy8gYXQgdGhlIGVuZCBvZiByZXRhaW5pbmcgZXZlcnl0aGluZyBvdXIgb3duZXIgaXMKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5vIGxvbmdlciBzdGFydGVkLi4uICBzbyBtYWtlIGl0IHN0b3AuCisgICAgICAgICAgICAgICAgICAgICAgICBzdG9wKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKG1TdGFydGVkICYmIG1EYXRhICE9IG51bGwgJiYgbUNhbGxiYWNrcyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIFRoaXMgbG9hZGVyIHdhcyByZXRhaW5lZCwgYW5kIG5vdyBhdCB0aGUgcG9pbnQgb2YKKyAgICAgICAgICAgICAgICAgICAgLy8gZmluaXNoaW5nIHRoZSByZXRhaW4gd2UgZmluZCB3ZSByZW1haW4gc3RhcnRlZCwgaGF2ZQorICAgICAgICAgICAgICAgICAgICAvLyBvdXIgZGF0YSwgYW5kIHRoZSBvd25lciBoYXMgYSBuZXcgY2FsbGJhY2suLi4gIHNvCisgICAgICAgICAgICAgICAgICAgIC8vIGxldCdzIGRlbGl2ZXIgdGhlIGRhdGEgbm93LgorICAgICAgICAgICAgICAgICAgICBtQ2FsbGJhY2tzLm9uTG9hZEZpbmlzaGVkKG1Mb2FkZXIsIG1EYXRhKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIHZvaWQgc3RvcCgpIHsKKyAgICAgICAgICAgIGlmIChERUJVRykgTG9nLnYoVEFHLCAiICBTdG9wcGluZzogIiArIHRoaXMpOworICAgICAgICAgICAgbVN0YXJ0ZWQgPSBmYWxzZTsKKyAgICAgICAgICAgIGlmICghbVJldGFpbmluZykgeworICAgICAgICAgICAgICAgIGlmIChtTG9hZGVyICE9IG51bGwgJiYgbUxpc3RlbmVyUmVnaXN0ZXJlZCkgeworICAgICAgICAgICAgICAgICAgICAvLyBMZXQgdGhlIGxvYWRlciBrbm93IHdlJ3JlIGRvbmUgd2l0aCBpdAorICAgICAgICAgICAgICAgICAgICBtTGlzdGVuZXJSZWdpc3RlcmVkID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIG1Mb2FkZXIudW5yZWdpc3Rlckxpc3RlbmVyKHRoaXMpOworICAgICAgICAgICAgICAgICAgICBtTG9hZGVyLnN0b3BMb2FkaW5nKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG1EYXRhID0gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgdm9pZCBkZXN0cm95KCkgeworICAgICAgICAgICAgaWYgKERFQlVHKSBMb2cudihUQUcsICIgIERlc3Ryb3lpbmc6ICIgKyB0aGlzKTsKKyAgICAgICAgICAgIG1EZXN0cm95ZWQgPSB0cnVlOworICAgICAgICAgICAgbUNhbGxiYWNrcyA9IG51bGw7CisgICAgICAgICAgICBpZiAobUxvYWRlciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgaWYgKG1MaXN0ZW5lclJlZ2lzdGVyZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgbUxpc3RlbmVyUmVnaXN0ZXJlZCA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICBtTG9hZGVyLnVucmVnaXN0ZXJMaXN0ZW5lcih0aGlzKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbUxvYWRlci5kZXN0cm95KCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIEBPdmVycmlkZSBwdWJsaWMgdm9pZCBvbkxvYWRDb21wbGV0ZShMb2FkZXI8T2JqZWN0PiBsb2FkZXIsIE9iamVjdCBkYXRhKSB7CisgICAgICAgICAgICBpZiAoREVCVUcpIExvZy52KFRBRywgIm9uTG9hZENvbXBsZXRlOiAiICsgdGhpcyArICIgbURlc3Ryb3llZD0iICsgbURlc3Ryb3llZCk7CisKKyAgICAgICAgICAgIGlmIChtRGVzdHJveWVkKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgCisgICAgICAgICAgICAvLyBOb3RpZnkgb2YgdGhlIG5ldyBkYXRhIHNvIHRoZSBhcHAgY2FuIHN3aXRjaCBvdXQgdGhlIG9sZCBkYXRhIGJlZm9yZQorICAgICAgICAgICAgLy8gd2UgdHJ5IHRvIGRlc3Ryb3kgaXQuCisgICAgICAgICAgICBtRGF0YSA9IGRhdGE7CisgICAgICAgICAgICBpZiAobUNhbGxiYWNrcyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgbUNhbGxiYWNrcy5vbkxvYWRGaW5pc2hlZChsb2FkZXIsIGRhdGEpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoREVCVUcpIExvZy52KFRBRywgIm9uTG9hZEZpbmlzaGVkIHJldHVybmVkOiAiICsgdGhpcyk7CisKKyAgICAgICAgICAgIC8vIFdlIGhhdmUgbm93IGdpdmVuIHRoZSBhcHBsaWNhdGlvbiB0aGUgbmV3IGxvYWRlciB3aXRoIGl0cworICAgICAgICAgICAgLy8gbG9hZGVkIGRhdGEsIHNvIGl0IHNob3VsZCBoYXZlIHN0b3BwZWQgdXNpbmcgdGhlIHByZXZpb3VzCisgICAgICAgICAgICAvLyBsb2FkZXIuICBJZiB0aGVyZSBpcyBhIHByZXZpb3VzIGxvYWRlciBvbiB0aGUgaW5hY3RpdmUgbGlzdCwKKyAgICAgICAgICAgIC8vIGNsZWFuIGl0IHVwLgorICAgICAgICAgICAgTG9hZGVySW5mbyBpbmZvID0gbUluYWN0aXZlTG9hZGVycy5nZXQobUlkKTsKKyAgICAgICAgICAgIGlmIChpbmZvICE9IG51bGwgJiYgaW5mbyAhPSB0aGlzKSB7CisgICAgICAgICAgICAgICAgaW5mby5kZXN0cm95KCk7CisgICAgICAgICAgICAgICAgbUluYWN0aXZlTG9hZGVycy5yZW1vdmUobUlkKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICAgICAgU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKDY0KTsKKyAgICAgICAgICAgIHNiLmFwcGVuZCgiTG9hZGVySW5mb3siKTsKKyAgICAgICAgICAgIHNiLmFwcGVuZChJbnRlZ2VyLnRvSGV4U3RyaW5nKFN5c3RlbS5pZGVudGl0eUhhc2hDb2RlKHRoaXMpKSk7CisgICAgICAgICAgICBzYi5hcHBlbmQoIiAjIik7CisgICAgICAgICAgICBzYi5hcHBlbmQobUlkKTsKKyAgICAgICAgICAgIGlmIChtQXJncyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCIgIik7CisgICAgICAgICAgICAgICAgc2IuYXBwZW5kKG1BcmdzLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2IuYXBwZW5kKCJ9Iik7CisgICAgICAgICAgICByZXR1cm4gc2IudG9TdHJpbmcoKTsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICBMb2FkZXJNYW5hZ2VySW1wbChib29sZWFuIHN0YXJ0ZWQpIHsKKyAgICAgICAgbVN0YXJ0ZWQgPSBzdGFydGVkOworICAgIH0KKyAgICAKKyAgICBwcml2YXRlIExvYWRlckluZm8gY3JlYXRlTG9hZGVyKGludCBpZCwgQnVuZGxlIGFyZ3MsCisgICAgICAgICAgICBMb2FkZXJNYW5hZ2VyLkxvYWRlckNhbGxiYWNrczxPYmplY3Q+IGNhbGxiYWNrKSB7CisgICAgICAgIExvYWRlckluZm8gaW5mbyA9IG5ldyBMb2FkZXJJbmZvKGlkLCBhcmdzLCAgKExvYWRlck1hbmFnZXIuTG9hZGVyQ2FsbGJhY2tzPE9iamVjdD4pY2FsbGJhY2spOworICAgICAgICBtTG9hZGVycy5wdXQoaWQsIGluZm8pOworICAgICAgICBMb2FkZXI8T2JqZWN0PiBsb2FkZXIgPSBjYWxsYmFjay5vbkNyZWF0ZUxvYWRlcihpZCwgYXJncyk7CisgICAgICAgIGluZm8ubUxvYWRlciA9IChMb2FkZXI8T2JqZWN0Pilsb2FkZXI7CisgICAgICAgIGlmIChtU3RhcnRlZCkgeworICAgICAgICAgICAgLy8gVGhlIGFjdGl2aXR5IHdpbGwgc3RhcnQgYWxsIGV4aXN0aW5nIGxvYWRlcnMgaW4gaXQncyBvblN0YXJ0KCksCisgICAgICAgICAgICAvLyBzbyBvbmx5IHN0YXJ0IHRoZW0gaGVyZSBpZiB3ZSdyZSBwYXN0IHRoYXQgcG9pbnQgb2YgdGhlIGFjdGl2aXRpeSdzCisgICAgICAgICAgICAvLyBsaWZlIGN5Y2xlCisgICAgICAgICAgICBpbmZvLnN0YXJ0KCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGluZm87CisgICAgfQorICAgIAorICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorICAgIHB1YmxpYyA8RD4gTG9hZGVyPEQ+IGluaXRMb2FkZXIoaW50IGlkLCBCdW5kbGUgYXJncywgTG9hZGVyTWFuYWdlci5Mb2FkZXJDYWxsYmFja3M8RD4gY2FsbGJhY2spIHsKKyAgICAgICAgTG9hZGVySW5mbyBpbmZvID0gbUxvYWRlcnMuZ2V0KGlkKTsKKyAgICAgICAgCisgICAgICAgIGlmIChERUJVRykgTG9nLnYoVEFHLCAiaW5pdExvYWRlciBpbiAiICsgdGhpcyArICI6IGN1cj0iICsgaW5mbyk7CisKKyAgICAgICAgaWYgKGluZm8gPT0gbnVsbCkgeworICAgICAgICAgICAgLy8gTG9hZGVyIGRvZXNuJ3QgYWxyZWFkeSBleGlzdDsgY3JlYXRlLgorICAgICAgICAgICAgaW5mbyA9IGNyZWF0ZUxvYWRlcihpZCwgYXJncywgIChMb2FkZXJNYW5hZ2VyLkxvYWRlckNhbGxiYWNrczxPYmplY3Q+KWNhbGxiYWNrKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGluZm8ubUNhbGxiYWNrcyA9IChMb2FkZXJNYW5hZ2VyLkxvYWRlckNhbGxiYWNrczxPYmplY3Q+KWNhbGxiYWNrOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBpZiAoaW5mby5tRGF0YSAhPSBudWxsICYmIG1TdGFydGVkKSB7CisgICAgICAgICAgICAvLyBJZiB0aGUgbG9hZGVyIGhhcyBhbHJlYWR5IGdlbmVyYXRlZCBpdHMgZGF0YSwgcmVwb3J0IGl0IG5vdy4KKyAgICAgICAgICAgIGluZm8ubUNhbGxiYWNrcy5vbkxvYWRGaW5pc2hlZChpbmZvLm1Mb2FkZXIsIGluZm8ubURhdGEpOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICByZXR1cm4gKExvYWRlcjxEPilpbmZvLm1Mb2FkZXI7CisgICAgfQorICAgIAorICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorICAgIHB1YmxpYyA8RD4gTG9hZGVyPEQ+IHJlc3RhcnRMb2FkZXIoaW50IGlkLCBCdW5kbGUgYXJncywgTG9hZGVyTWFuYWdlci5Mb2FkZXJDYWxsYmFja3M8RD4gY2FsbGJhY2spIHsKKyAgICAgICAgTG9hZGVySW5mbyBpbmZvID0gbUxvYWRlcnMuZ2V0KGlkKTsKKyAgICAgICAgaWYgKERFQlVHKSBMb2cudihUQUcsICJyZXN0YXJ0TG9hZGVyIGluICIgKyB0aGlzICsgIjogY3VyPSIgKyBpbmZvKTsKKyAgICAgICAgaWYgKGluZm8gIT0gbnVsbCkgeworICAgICAgICAgICAgTG9hZGVySW5mbyBpbmFjdGl2ZSA9IG1JbmFjdGl2ZUxvYWRlcnMuZ2V0KGlkKTsKKyAgICAgICAgICAgIGlmIChpbmFjdGl2ZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgaWYgKGluZm8ubURhdGEgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAvLyBUaGlzIGxvYWRlciBub3cgaGFzIGRhdGEuLi4gIHdlIGFyZSBwcm9iYWJseSBiZWluZworICAgICAgICAgICAgICAgICAgICAvLyBjYWxsZWQgZnJvbSB3aXRoaW4gb25Mb2FkQ29tcGxldGUsIHdoZXJlIHdlIGhhdmVuJ3QKKyAgICAgICAgICAgICAgICAgICAgLy8geWV0IGRlc3Ryb3llZCB0aGUgbGFzdCBpbmFjdGl2ZSBsb2FkZXIuICBTbyBqdXN0IGRvCisgICAgICAgICAgICAgICAgICAgIC8vIHRoYXQgbm93LgorICAgICAgICAgICAgICAgICAgICBpZiAoREVCVUcpIExvZy52KFRBRywgIiAgUmVtb3ZpbmcgbGFzdCBpbmFjdGl2ZSBsb2FkZXIgaW4gIiArIHRoaXMpOworICAgICAgICAgICAgICAgICAgICBpbmFjdGl2ZS5kZXN0cm95KCk7CisgICAgICAgICAgICAgICAgICAgIG1JbmFjdGl2ZUxvYWRlcnMucHV0KGlkLCBpbmZvKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAvLyBXZSBhbHJlYWR5IGhhdmUgYW4gaW5hY3RpdmUgbG9hZGVyIGZvciB0aGlzIElEIHRoYXQgd2UgYXJlCisgICAgICAgICAgICAgICAgICAgIC8vIHdhaXRpbmcgZm9yISAgTm93IHdlIGhhdmUgdGhyZWUgYWN0aXZlIGxvYWRlcnMuLi4gbGV0J3MganVzdAorICAgICAgICAgICAgICAgICAgICAvLyBkcm9wIHRoZSBvbmUgaW4gdGhlIG1pZGRsZSwgc2luY2Ugd2UgYXJlIHN0aWxsIHdhaXRpbmcgZm9yCisgICAgICAgICAgICAgICAgICAgIC8vIGl0cyByZXN1bHQgYnV0IHRoYXQgcmVzdWx0IGlzIGFscmVhZHkgb3V0IG9mIGRhdGUuCisgICAgICAgICAgICAgICAgICAgIGlmIChERUJVRykgTG9nLnYoVEFHLCAiICBSZW1vdmluZyBpbnRlcm1lZGlhdGUgbG9hZGVyIGluICIgKyB0aGlzKTsKKyAgICAgICAgICAgICAgICAgICAgaW5mby5kZXN0cm95KCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvLyBLZWVwIHRyYWNrIG9mIHRoZSBwcmV2aW91cyBpbnN0YW5jZSBvZiB0aGlzIGxvYWRlciBzbyB3ZSBjYW4gZGVzdHJveQorICAgICAgICAgICAgICAgIC8vIGl0IHdoZW4gdGhlIG5ldyBvbmUgY29tcGxldGVzLgorICAgICAgICAgICAgICAgIGlmIChERUJVRykgTG9nLnYoVEFHLCAiICBNYWtpbmcgaW5hY3RpdmU6ICIgKyBpbmZvKTsKKyAgICAgICAgICAgICAgICBtSW5hY3RpdmVMb2FkZXJzLnB1dChpZCwgaW5mbyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIGluZm8gPSBjcmVhdGVMb2FkZXIoaWQsIGFyZ3MsICAoTG9hZGVyTWFuYWdlci5Mb2FkZXJDYWxsYmFja3M8T2JqZWN0PiljYWxsYmFjayk7CisgICAgICAgIHJldHVybiAoTG9hZGVyPEQ+KWluZm8ubUxvYWRlcjsKKyAgICB9CisgICAgCisgICAgcHVibGljIHZvaWQgc3RvcExvYWRlcihpbnQgaWQpIHsKKyAgICAgICAgaWYgKERFQlVHKSBMb2cudihUQUcsICJzdG9wTG9hZGVyIGluICIgKyB0aGlzICsgIiBvZiAiICsgaWQpOworICAgICAgICBpbnQgaWR4ID0gbUxvYWRlcnMuaW5kZXhPZktleShpZCk7CisgICAgICAgIGlmIChpZHggPj0gMCkgeworICAgICAgICAgICAgTG9hZGVySW5mbyBpbmZvID0gbUxvYWRlcnMudmFsdWVBdChpZHgpOworICAgICAgICAgICAgbUxvYWRlcnMucmVtb3ZlQXQoaWR4KTsKKyAgICAgICAgICAgIGluZm8uZGVzdHJveSgpOworICAgICAgICB9CisgICAgfQorCisgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisgICAgcHVibGljIDxEPiBMb2FkZXI8RD4gZ2V0TG9hZGVyKGludCBpZCkgeworICAgICAgICBMb2FkZXJJbmZvIGxvYWRlckluZm8gPSBtTG9hZGVycy5nZXQoaWQpOworICAgICAgICBpZiAobG9hZGVySW5mbyAhPSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gKExvYWRlcjxEPiltTG9hZGVycy5nZXQoaWQpLm1Mb2FkZXI7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorIAorICAgIHZvaWQgZG9TdGFydCgpIHsKKyAgICAgICAgaWYgKERFQlVHKSBMb2cudihUQUcsICJTdGFydGluZzogIiArIHRoaXMpOworCisgICAgICAgIC8vIENhbGwgb3V0IHRvIHN1YiBjbGFzc2VzIHNvIHRoZXkgY2FuIHN0YXJ0IHRoZWlyIGxvYWRlcnMKKyAgICAgICAgLy8gTGV0IHRoZSBleGlzdGluZyBsb2FkZXJzIGtub3cgdGhhdCB3ZSB3YW50IHRvIGJlIG5vdGlmaWVkIHdoZW4gYSBsb2FkIGlzIGNvbXBsZXRlCisgICAgICAgIGZvciAoaW50IGkgPSBtTG9hZGVycy5zaXplKCktMTsgaSA+PSAwOyBpLS0pIHsKKyAgICAgICAgICAgIG1Mb2FkZXJzLnZhbHVlQXQoaSkuc3RhcnQoKTsKKyAgICAgICAgfQorICAgICAgICBtU3RhcnRlZCA9IHRydWU7CisgICAgfQorICAgIAorICAgIHZvaWQgZG9TdG9wKCkgeworICAgICAgICBpZiAoREVCVUcpIExvZy52KFRBRywgIlN0b3BwaW5nOiAiICsgdGhpcyk7CisKKyAgICAgICAgZm9yIChpbnQgaSA9IG1Mb2FkZXJzLnNpemUoKS0xOyBpID49IDA7IGktLSkgeworICAgICAgICAgICAgbUxvYWRlcnMudmFsdWVBdChpKS5zdG9wKCk7CisgICAgICAgIH0KKyAgICAgICAgbVN0YXJ0ZWQgPSBmYWxzZTsKKyAgICB9CisgICAgCisgICAgdm9pZCBkb1JldGFpbigpIHsKKyAgICAgICAgaWYgKERFQlVHKSBMb2cudihUQUcsICJSZXRhaW5pbmc6ICIgKyB0aGlzKTsKKworICAgICAgICBtUmV0YWluaW5nID0gdHJ1ZTsKKyAgICAgICAgbVN0YXJ0ZWQgPSBmYWxzZTsKKyAgICAgICAgZm9yIChpbnQgaSA9IG1Mb2FkZXJzLnNpemUoKS0xOyBpID49IDA7IGktLSkgeworICAgICAgICAgICAgbUxvYWRlcnMudmFsdWVBdChpKS5yZXRhaW4oKTsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICB2b2lkIGZpbmlzaFJldGFpbigpIHsKKyAgICAgICAgaWYgKERFQlVHKSBMb2cudihUQUcsICJGaW5pc2hlZCBSZXRhaW5pbmc6ICIgKyB0aGlzKTsKKworICAgICAgICBtUmV0YWluaW5nID0gZmFsc2U7CisgICAgICAgIGZvciAoaW50IGkgPSBtTG9hZGVycy5zaXplKCktMTsgaSA+PSAwOyBpLS0pIHsKKyAgICAgICAgICAgIG1Mb2FkZXJzLnZhbHVlQXQoaSkuZmluaXNoUmV0YWluKCk7CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgdm9pZCBkb0Rlc3Ryb3koKSB7CisgICAgICAgIGlmICghbVJldGFpbmluZykgeworICAgICAgICAgICAgaWYgKERFQlVHKSBMb2cudihUQUcsICJEZXN0cm95aW5nIEFjdGl2ZTogIiArIHRoaXMpOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IG1Mb2FkZXJzLnNpemUoKS0xOyBpID49IDA7IGktLSkgeworICAgICAgICAgICAgICAgIG1Mb2FkZXJzLnZhbHVlQXQoaSkuZGVzdHJveSgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIAorICAgICAgICBpZiAoREVCVUcpIExvZy52KFRBRywgIkRlc3Ryb3lpbmcgSW5hY3RpdmU6ICIgKyB0aGlzKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IG1JbmFjdGl2ZUxvYWRlcnMuc2l6ZSgpLTE7IGkgPj0gMDsgaS0tKSB7CisgICAgICAgICAgICBtSW5hY3RpdmVMb2FkZXJzLnZhbHVlQXQoaSkuZGVzdHJveSgpOworICAgICAgICB9CisgICAgICAgIG1JbmFjdGl2ZUxvYWRlcnMuY2xlYXIoKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9hcHAvTG9hZGVyTWFuYWdpbmdGcmFnbWVudC5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvYXBwL0xvYWRlck1hbmFnaW5nRnJhZ21lbnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZDQxN2EwCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvYXBwL0xvYWRlck1hbmFnaW5nRnJhZ21lbnQuamF2YQpAQCAtMCwwICsxLDIwNCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5hcHA7CisKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuTG9hZGVyOworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworCitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CisKKy8qKgorICogQSBGcmFnbWVudCB0aGF0IGhhcyB1dGlsaXR5IG1ldGhvZHMgZm9yIG1hbmFnaW5nIHtAbGluayBMb2FkZXJ9cy4KKyAqCisgKiBAcGFyYW0gPEQ+IFRoZSB0eXBlIG9mIGRhdGEgcmV0dXJuZWQgYnkgdGhlIExvYWRlci4gSWYgeW91J3JlIHVzaW5nIG11bHRpcGxlIExvYWRlcnMgd2l0aAorICogZGlmZmVyZW50IHJldHVybiB0eXBlcyB1c2UgT2JqZWN0IGFuZCBjYXNlIHRoZSByZXN1bHRzLgorICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgTG9hZGVyTWFuYWdpbmdGcmFnbWVudDxEPiBleHRlbmRzIEZyYWdtZW50CisgICAgICAgIGltcGxlbWVudHMgTG9hZGVyLk9uTG9hZENvbXBsZXRlTGlzdGVuZXI8RD4geworICAgIHByaXZhdGUgYm9vbGVhbiBtU3RhcnRlZCA9IGZhbHNlOworCisgICAgc3RhdGljIGZpbmFsIGNsYXNzIExvYWRlckluZm88RD4geworICAgICAgICBwdWJsaWMgQnVuZGxlIGFyZ3M7CisgICAgICAgIHB1YmxpYyBMb2FkZXI8RD4gbG9hZGVyOworICAgIH0KKyAgICBwcml2YXRlIEhhc2hNYXA8SW50ZWdlciwgTG9hZGVySW5mbzxEPj4gbUxvYWRlcnM7CisgICAgcHJpdmF0ZSBIYXNoTWFwPEludGVnZXIsIExvYWRlckluZm88RD4+IG1JbmFjdGl2ZUxvYWRlcnM7CisKKyAgICAvKioKKyAgICAgKiBSZWdpc3RlcnMgYSBsb2FkZXIgd2l0aCB0aGlzIGFjdGl2aXR5LCByZWdpc3RlcnMgdGhlIGNhbGxiYWNrcyBvbiBpdCwgYW5kIHN0YXJ0cyBpdCBsb2FkaW5nLgorICAgICAqIElmIGEgbG9hZGVyIHdpdGggdGhlIHNhbWUgaWQgaGFzIHByZXZpb3VzbHkgYmVlbiBzdGFydGVkIGl0IHdpbGwgYXV0b21hdGljYWxseSBiZSBkZXN0cm95ZWQKKyAgICAgKiB3aGVuIHRoZSBuZXcgbG9hZGVyIGNvbXBsZXRlcyBpdCdzIHdvcmsuIFRoZSBjYWxsYmFjayB3aWxsIGJlIGRlbGl2ZXJlZCBiZWZvcmUgdGhlIG9sZCBsb2FkZXIKKyAgICAgKiBpcyBkZXN0cm95ZWQuCisgICAgICovCisgICAgcHVibGljIExvYWRlcjxEPiBzdGFydExvYWRpbmcoaW50IGlkLCBCdW5kbGUgYXJncykgeworICAgICAgICBMb2FkZXJJbmZvPEQ+IGluZm8gPSBtTG9hZGVycy5nZXQoaWQpOworICAgICAgICBpZiAoaW5mbyAhPSBudWxsKSB7CisgICAgICAgICAgICAvLyBLZWVwIHRyYWNrIG9mIHRoZSBwcmV2aW91cyBpbnN0YW5jZSBvZiB0aGlzIGxvYWRlciBzbyB3ZSBjYW4gZGVzdHJveQorICAgICAgICAgICAgLy8gaXQgd2hlbiB0aGUgbmV3IG9uZSBjb21wbGV0ZXMuCisgICAgICAgICAgICBtSW5hY3RpdmVMb2FkZXJzLnB1dChpZCwgaW5mbyk7CisgICAgICAgIH0KKyAgICAgICAgaW5mbyA9IG5ldyBMb2FkZXJJbmZvPEQ+KCk7CisgICAgICAgIGluZm8uYXJncyA9IGFyZ3M7CisgICAgICAgIG1Mb2FkZXJzLnB1dChpZCwgaW5mbyk7CisgICAgICAgIExvYWRlcjxEPiBsb2FkZXIgPSBvbkNyZWF0ZUxvYWRlcihpZCwgYXJncyk7CisgICAgICAgIGluZm8ubG9hZGVyID0gbG9hZGVyOworICAgICAgICBpZiAobVN0YXJ0ZWQpIHsKKyAgICAgICAgICAgIC8vIFRoZSBhY3Rpdml0eSB3aWxsIHN0YXJ0IGFsbCBleGlzdGluZyBsb2FkZXJzIGluIGl0J3Mgb25TdGFydCgpLCBzbyBvbmx5IHN0YXJ0IHRoZW0KKyAgICAgICAgICAgIC8vIGhlcmUgaWYgd2UncmUgcGFzdCB0aGF0IHBvaW50IG9mIHRoZSBhY3Rpdml0aXkncyBsaWZlIGN5Y2xlCisgICAgICAgICAgICBsb2FkZXIucmVnaXN0ZXJMaXN0ZW5lcihpZCwgdGhpcyk7CisgICAgICAgICAgICBsb2FkZXIuc3RhcnRMb2FkaW5nKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGxvYWRlcjsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgTG9hZGVyPEQ+IG9uQ3JlYXRlTG9hZGVyKGludCBpZCwgQnVuZGxlIGFyZ3MpOworICAgIHByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIG9uSW5pdGlhbGl6ZUxvYWRlcnMoKTsKKyAgICBwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBvbkxvYWRGaW5pc2hlZChMb2FkZXI8RD4gbG9hZGVyLCBEIGRhdGEpOworCisgICAgcHVibGljIGZpbmFsIHZvaWQgb25Mb2FkQ29tcGxldGUoTG9hZGVyPEQ+IGxvYWRlciwgRCBkYXRhKSB7CisgICAgICAgIC8vIE5vdGlmeSBvZiB0aGUgbmV3IGRhdGEgc28gdGhlIGFwcCBjYW4gc3dpdGNoIG91dCB0aGUgb2xkIGRhdGEgYmVmb3JlCisgICAgICAgIC8vIHdlIHRyeSB0byBkZXN0cm95IGl0LgorICAgICAgICBvbkxvYWRGaW5pc2hlZChsb2FkZXIsIGRhdGEpOworCisgICAgICAgIC8vIExvb2sgZm9yIGFuIGluYWN0aXZlIGxvYWRlciBhbmQgZGVzdHJveSBpdCBpZiBmb3VuZAorICAgICAgICBpbnQgaWQgPSBsb2FkZXIuZ2V0SWQoKTsKKyAgICAgICAgTG9hZGVySW5mbzxEPiBpbmZvID0gbUluYWN0aXZlTG9hZGVycy5nZXQoaWQpOworICAgICAgICBpZiAoaW5mbyAhPSBudWxsKSB7CisgICAgICAgICAgICBMb2FkZXI8RD4gb2xkTG9hZGVyID0gaW5mby5sb2FkZXI7CisgICAgICAgICAgICBpZiAob2xkTG9hZGVyICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBvbGRMb2FkZXIuZGVzdHJveSgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbUluYWN0aXZlTG9hZGVycy5yZW1vdmUoaWQpOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb25DcmVhdGUoQnVuZGxlIHNhdmVkU3RhdGUpIHsKKyAgICAgICAgc3VwZXIub25DcmVhdGUoc2F2ZWRTdGF0ZSk7CisKKyAgICAgICAgaWYgKG1Mb2FkZXJzID09IG51bGwpIHsKKyAgICAgICAgICAgIC8vIExvb2sgZm9yIGEgcGFzc2VkIGFsb25nIGxvYWRlciBhbmQgY3JlYXRlIGEgbmV3IG9uZSBpZiBpdCdzIG5vdCB0aGVyZQorLy8gVE9ETzogdW5jb21tZW50IG9uY2UgZ2V0TGFzdE5vbkNvbmZpZ3VyYXRpb25JbnN0YW5jZSBtZXRob2QgaXMgYXZhaWxhYmxlCisvLyAgICAgICAgICAgIG1Mb2FkZXJzID0gKEhhc2hNYXA8SW50ZWdlciwgTG9hZGVySW5mbz4pIGdldExhc3ROb25Db25maWd1cmF0aW9uSW5zdGFuY2UoKTsKKyAgICAgICAgICAgIGlmIChtTG9hZGVycyA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgbUxvYWRlcnMgPSBuZXcgSGFzaE1hcDxJbnRlZ2VyLCBMb2FkZXJJbmZvPEQ+PigpOworICAgICAgICAgICAgICAgIG9uSW5pdGlhbGl6ZUxvYWRlcnMoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAobUluYWN0aXZlTG9hZGVycyA9PSBudWxsKSB7CisgICAgICAgICAgICBtSW5hY3RpdmVMb2FkZXJzID0gbmV3IEhhc2hNYXA8SW50ZWdlciwgTG9hZGVySW5mbzxEPj4oKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9uU3RhcnQoKSB7CisgICAgICAgIHN1cGVyLm9uU3RhcnQoKTsKKworICAgICAgICAvLyBDYWxsIG91dCB0byBzdWIgY2xhc3NlcyBzbyB0aGV5IGNhbiBzdGFydCB0aGVpciBsb2FkZXJzCisgICAgICAgIC8vIExldCB0aGUgZXhpc3RpbmcgbG9hZGVycyBrbm93IHRoYXQgd2Ugd2FudCB0byBiZSBub3RpZmllZCB3aGVuIGEgbG9hZCBpcyBjb21wbGV0ZQorICAgICAgICBmb3IgKEhhc2hNYXAuRW50cnk8SW50ZWdlciwgTG9hZGVySW5mbzxEPj4gZW50cnkgOiBtTG9hZGVycy5lbnRyeVNldCgpKSB7CisgICAgICAgICAgICBMb2FkZXJJbmZvPEQ+IGluZm8gPSBlbnRyeS5nZXRWYWx1ZSgpOworICAgICAgICAgICAgTG9hZGVyPEQ+IGxvYWRlciA9IGluZm8ubG9hZGVyOworICAgICAgICAgICAgaW50IGlkID0gZW50cnkuZ2V0S2V5KCk7CisgICAgICAgICAgICBpZiAobG9hZGVyID09IG51bGwpIHsKKyAgICAgICAgICAgICAgIGxvYWRlciA9IG9uQ3JlYXRlTG9hZGVyKGlkLCBpbmZvLmFyZ3MpOworICAgICAgICAgICAgICAgaW5mby5sb2FkZXIgPSBsb2FkZXI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBsb2FkZXIucmVnaXN0ZXJMaXN0ZW5lcihpZCwgdGhpcyk7CisgICAgICAgICAgICBsb2FkZXIuc3RhcnRMb2FkaW5nKCk7CisgICAgICAgIH0KKworICAgICAgICBtU3RhcnRlZCA9IHRydWU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb25TdG9wKCkgeworICAgICAgICBzdXBlci5vblN0b3AoKTsKKworICAgICAgICBmb3IgKEhhc2hNYXAuRW50cnk8SW50ZWdlciwgTG9hZGVySW5mbzxEPj4gZW50cnkgOiBtTG9hZGVycy5lbnRyeVNldCgpKSB7CisgICAgICAgICAgICBMb2FkZXJJbmZvPEQ+IGluZm8gPSBlbnRyeS5nZXRWYWx1ZSgpOworICAgICAgICAgICAgTG9hZGVyPEQ+IGxvYWRlciA9IGluZm8ubG9hZGVyOworICAgICAgICAgICAgaWYgKGxvYWRlciA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIExldCB0aGUgbG9hZGVyIGtub3cgd2UncmUgZG9uZSB3aXRoIGl0CisgICAgICAgICAgICBsb2FkZXIudW5yZWdpc3Rlckxpc3RlbmVyKHRoaXMpOworCisgICAgICAgICAgICAvLyBUaGUgbG9hZGVyIGlzbid0IGdldHRpbmcgcGFzc2VkIGFsb25nIHRvIHRoZSBuZXh0IGluc3RhbmNlIHNvIGFzayBpdCB0byBzdG9wIGxvYWRpbmcKKyAgICAgICAgICAgIGlmICghZ2V0QWN0aXZpdHkoKS5pc0NoYW5naW5nQ29uZmlndXJhdGlvbnMoKSkgeworICAgICAgICAgICAgICAgIGxvYWRlci5zdG9wTG9hZGluZygpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgbVN0YXJ0ZWQgPSBmYWxzZTsKKyAgICB9CisKKyAgICAvKiogVE8gRE86IFRoaXMgbmVlZHMgdG8gYmUgdHVybmVkIGludG8gYSByZXRhaW5lZCBmcmFnbWVudC4KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgT2JqZWN0IG9uUmV0YWluTm9uQ29uZmlndXJhdGlvbkluc3RhbmNlKCkgeworICAgICAgICAvLyBQYXNzIHRoZSBsb2FkZXIgYWxvbmcgdG8gdGhlIG5leHQgZ3V5CisgICAgICAgIE9iamVjdCByZXN1bHQgPSBtTG9hZGVyczsKKyAgICAgICAgbUxvYWRlcnMgPSBudWxsOworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKyAgICAqKi8KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9uRGVzdHJveSgpIHsKKyAgICAgICAgc3VwZXIub25EZXN0cm95KCk7CisKKyAgICAgICAgaWYgKG1Mb2FkZXJzICE9IG51bGwpIHsKKyAgICAgICAgICAgIGZvciAoSGFzaE1hcC5FbnRyeTxJbnRlZ2VyLCBMb2FkZXJJbmZvPEQ+PiBlbnRyeSA6IG1Mb2FkZXJzLmVudHJ5U2V0KCkpIHsKKyAgICAgICAgICAgICAgICBMb2FkZXJJbmZvPEQ+IGluZm8gPSBlbnRyeS5nZXRWYWx1ZSgpOworICAgICAgICAgICAgICAgIExvYWRlcjxEPiBsb2FkZXIgPSBpbmZvLmxvYWRlcjsKKyAgICAgICAgICAgICAgICBpZiAobG9hZGVyID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGxvYWRlci5kZXN0cm95KCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTdG9wcyBhbmQgcmVtb3ZlcyB0aGUgbG9hZGVyIHdpdGggdGhlIGdpdmVuIElELgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHN0b3BMb2FkaW5nKGludCBpZCkgeworICAgICAgICBpZiAobUxvYWRlcnMgIT0gbnVsbCkgeworICAgICAgICAgICAgTG9hZGVySW5mbzxEPiBpbmZvID0gbUxvYWRlcnMucmVtb3ZlKGlkKTsKKyAgICAgICAgICAgIGlmIChpbmZvICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBMb2FkZXI8RD4gbG9hZGVyID0gaW5mby5sb2FkZXI7CisgICAgICAgICAgICAgICAgaWYgKGxvYWRlciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGxvYWRlci51bnJlZ2lzdGVyTGlzdGVuZXIodGhpcyk7CisgICAgICAgICAgICAgICAgICAgIGxvYWRlci5kZXN0cm95KCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQHJldHVybiB0aGUgTG9hZGVyIHdpdGggdGhlIGdpdmVuIGlkIG9yIG51bGwgaWYgbm8gbWF0Y2hpbmcgTG9hZGVyCisgICAgICogaXMgZm91bmQuCisgICAgICovCisgICAgcHVibGljIExvYWRlcjxEPiBnZXRMb2FkZXIoaW50IGlkKSB7CisgICAgICAgIExvYWRlckluZm88RD4gbG9hZGVySW5mbyA9IG1Mb2FkZXJzLmdldChpZCk7CisgICAgICAgIGlmIChsb2FkZXJJbmZvICE9IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBtTG9hZGVycy5nZXQoaWQpLmxvYWRlcjsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9hcHAvTG9jYWxBY3Rpdml0eU1hbmFnZXIuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9Mb2NhbEFjdGl2aXR5TWFuYWdlci5qYXZhCmluZGV4IGEyNGZjYWUuLjUyNGRlNmYgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9Mb2NhbEFjdGl2aXR5TWFuYWdlci5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9Mb2NhbEFjdGl2aXR5TWFuYWdlci5qYXZhCkBAIC0yMCwxMyArMjAsMTEgQEAKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uQWN0aXZpdHlJbmZvOwogaW1wb3J0IGFuZHJvaWQub3MuQmluZGVyOwogaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOwotaW1wb3J0IGFuZHJvaWQudXRpbC5Db25maWc7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKIGltcG9ydCBhbmRyb2lkLnZpZXcuV2luZG93OwogCiBpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CiBpbXBvcnQgamF2YS51dGlsLk1hcDsKIAogLyoqCkBAIC0zOCw3ICszNiw3IEBACiAgKi8KIHB1YmxpYyBjbGFzcyBMb2NhbEFjdGl2aXR5TWFuYWdlciB7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJMb2NhbEFjdGl2aXR5TWFuYWdlciI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBsb2NhbExPR1YgPSBmYWxzZSB8fCBDb25maWcuTE9HVjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIGxvY2FsTE9HViA9IGZhbHNlOwogCiAgICAgLy8gSW50ZXJuYWwgdG9rZW4gZm9yIGFuIEFjdGl2aXR5IGJlaW5nIG1hbmFnZWQgYnkgTG9jYWxBY3Rpdml0eU1hbmFnZXIuCiAgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgTG9jYWxBY3Rpdml0eVJlY29yZCBleHRlbmRzIEJpbmRlciB7CkBAIC0xMTIsMTEgKzExMCwxNiBAQAogICAgICAgICAKICAgICAgICAgaWYgKHIuY3VyU3RhdGUgPT0gSU5JVElBTElaSU5HKSB7CiAgICAgICAgICAgICAvLyBHZXQgdGhlIGxhc3ROb25Db25maWd1cmF0aW9uSW5zdGFuY2UgZm9yIHRoZSBhY3Rpdml0eQotICAgICAgICAgICAgSGFzaE1hcDxTdHJpbmcsT2JqZWN0PiBsYXN0Tm9uQ29uZmlndXJhdGlvbkluc3RhbmNlcyA9Ci0gICAgICAgICAgICAgICAgbVBhcmVudC5nZXRMYXN0Tm9uQ29uZmlndXJhdGlvbkNoaWxkSW5zdGFuY2VzKCk7Ci0gICAgICAgICAgICBPYmplY3QgaW5zdGFuY2UgPSBudWxsOworICAgICAgICAgICAgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4gbGFzdE5vbkNvbmZpZ3VyYXRpb25JbnN0YW5jZXMgPQorICAgICAgICAgICAgICAgICAgICBtUGFyZW50LmdldExhc3ROb25Db25maWd1cmF0aW9uQ2hpbGRJbnN0YW5jZXMoKTsKKyAgICAgICAgICAgIE9iamVjdCBpbnN0YW5jZU9iaiA9IG51bGw7CiAgICAgICAgICAgICBpZiAobGFzdE5vbkNvbmZpZ3VyYXRpb25JbnN0YW5jZXMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGluc3RhbmNlID0gbGFzdE5vbkNvbmZpZ3VyYXRpb25JbnN0YW5jZXMuZ2V0KHIuaWQpOworICAgICAgICAgICAgICAgIGluc3RhbmNlT2JqID0gbGFzdE5vbkNvbmZpZ3VyYXRpb25JbnN0YW5jZXMuZ2V0KHIuaWQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQWN0aXZpdHkuTm9uQ29uZmlndXJhdGlvbkluc3RhbmNlcyBpbnN0YW5jZSA9IG51bGw7CisgICAgICAgICAgICBpZiAoaW5zdGFuY2VPYmogIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGluc3RhbmNlID0gbmV3IEFjdGl2aXR5Lk5vbkNvbmZpZ3VyYXRpb25JbnN0YW5jZXMoKTsKKyAgICAgICAgICAgICAgICBpbnN0YW5jZS5hY3Rpdml0eSA9IGluc3RhbmNlT2JqOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgCiAgICAgICAgICAgICAvLyBXZSBuZWVkIHRvIGhhdmUgYWx3YXlzIGNyZWF0ZWQgdGhlIGFjdGl2aXR5LgpAQCAtMzQ2LDcgKzM0OSw3IEBACiAgICAgfQogCiAgICAgcHJpdmF0ZSBXaW5kb3cgcGVyZm9ybURlc3Ryb3koTG9jYWxBY3Rpdml0eVJlY29yZCByLCBib29sZWFuIGZpbmlzaCkgewotICAgICAgICBXaW5kb3cgd2luID0gbnVsbDsKKyAgICAgICAgV2luZG93IHdpbjsKICAgICAgICAgd2luID0gci53aW5kb3c7CiAgICAgICAgIGlmIChyLmN1clN0YXRlID09IFJFU1VNRUQgJiYgIWZpbmlzaCkgewogICAgICAgICAgICAgcGVyZm9ybVBhdXNlKHIsIGZpbmlzaCk7CkBAIC0zODAsNyArMzgzLDggQEAKICAgICAgICAgaWYgKHIgIT0gbnVsbCkgewogICAgICAgICAgICAgd2luID0gcGVyZm9ybURlc3Ryb3kociwgZmluaXNoKTsKICAgICAgICAgICAgIGlmIChmaW5pc2gpIHsKLSAgICAgICAgICAgICAgICBtQWN0aXZpdGllcy5yZW1vdmUocik7CisgICAgICAgICAgICAgICAgbUFjdGl2aXRpZXMucmVtb3ZlKGlkKTsKKyAgICAgICAgICAgICAgICBtQWN0aXZpdHlBcnJheS5yZW1vdmUocik7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIHdpbjsKQEAgLTQ0MSwxMCArNDQ1LDggQEAKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBkaXNwYXRjaENyZWF0ZShCdW5kbGUgc3RhdGUpIHsKICAgICAgICAgaWYgKHN0YXRlICE9IG51bGwpIHsKLSAgICAgICAgICAgIGZpbmFsIEl0ZXJhdG9yPFN0cmluZz4gaSA9IHN0YXRlLmtleVNldCgpLml0ZXJhdG9yKCk7Ci0gICAgICAgICAgICB3aGlsZSAoaS5oYXNOZXh0KCkpIHsKKyAgICAgICAgICAgIGZvciAoU3RyaW5nIGlkIDogc3RhdGUua2V5U2V0KCkpIHsKICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgaWQgPSBpLm5leHQoKTsKICAgICAgICAgICAgICAgICAgICAgZmluYWwgQnVuZGxlIGFzdGF0ZSA9IHN0YXRlLmdldEJ1bmRsZShpZCk7CiAgICAgICAgICAgICAgICAgICAgIExvY2FsQWN0aXZpdHlSZWNvcmQgciA9IG1BY3Rpdml0aWVzLmdldChpZCk7CiAgICAgICAgICAgICAgICAgICAgIGlmIChyICE9IG51bGwpIHsKQEAgLTQ1Nyw5ICs0NTksNyBAQAogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKICAgICAgICAgICAgICAgICAgICAgLy8gUmVjb3ZlciBmcm9tIC1hbGwtIGFwcCBlcnJvcnMuCi0gICAgICAgICAgICAgICAgICAgIExvZy5lKFRBRywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIkV4Y2VwdGlvbiB0aHJvd24gd2hlbiByZXN0b3JpbmcgTG9jYWxBY3Rpdml0eU1hbmFnZXIgc3RhdGUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICBlKTsKKyAgICAgICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAiRXhjZXB0aW9uIHRocm93biB3aGVuIHJlc3RvcmluZyBMb2NhbEFjdGl2aXR5TWFuYWdlciBzdGF0ZSIsIGUpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvYXBwL05vdGlmaWNhdGlvbi5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvYXBwL05vdGlmaWNhdGlvbi5qYXZhCmluZGV4IDg1Njk0M2QuLmRhMDAwZTUgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9Ob3RpZmljYXRpb24uamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9hcHAvTm90aWZpY2F0aW9uLmphdmEKQEAgLTExNiw2ICsxMTYsOSBAQAogICAgICAqIElmIHRoaXMgZmFjaWxpdHkgaXMgdXNlZCBmb3Igc29tZXRoaW5nIGVsc2UsIHBsZWFzZSBnaXZlIHRoZSB1c2VyIGFuIG9wdGlvbgogICAgICAqIHRvIHR1cm4gaXQgb2ZmIGFuZCB1c2UgYSBub3JtYWwgbm90aWZpY2F0aW9uLCBhcyB0aGlzIGNhbiBiZSBleHRyZW1lbHkKICAgICAgKiBkaXNydXB0aXZlLgorICAgICAqIAorICAgICAqIDxwPlVzZSB3aXRoIHtAbGluayAjRkxBR19ISUdIX1BSSU9SSVRZfSB0byBlbnN1cmUgdGhhdCB0aGlzIG5vdGlmaWNhdGlvbgorICAgICAqIHdpbGwgcmVhY2ggdGhlIHVzZXIgZXZlbiB3aGVuIG90aGVyIG5vdGlmaWNhdGlvbnMgYXJlIHN1cHByZXNzZWQuCiAgICAgICovCiAgICAgcHVibGljIFBlbmRpbmdJbnRlbnQgZnVsbFNjcmVlbkludGVudDsKIApAQCAtMjc1LDYgKzI3OCwxNCBAQAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZMQUdfRk9SRUdST1VORF9TRVJWSUNFID0gMHgwMDAwMDA0MDsKIAorICAgIC8qKgorICAgICAqIEJpdCB0byBiZSBiaXR3aXNlLW9yZWQgaW50byB0aGUge0BsaW5rICNmbGFnc30gZmllbGQgdGhhdCBzaG91bGQgYmUgc2V0IGlmIHRoaXMgbm90aWZpY2F0aW9uCisgICAgICogcmVwcmVzZW50cyBhIGhpZ2gtcHJpb3JpdHkgZXZlbnQgdGhhdCBtYXkgYmUgc2hvd24gdG8gdGhlIHVzZXIgZXZlbiBpZiBub3RpZmljYXRpb25zIGFyZQorICAgICAqIG90aGVyd2lzZSB1bmF2YWlsYWJsZSAodGhhdCBpcywgd2hlbiB0aGUgc3RhdHVzIGJhciBpcyBoaWRkZW4pLiBUaGlzIGZsYWcgaXMgaWRlYWxseSB1c2VkCisgICAgICogaW4gY29uanVuY3Rpb24gd2l0aCB7QGxpbmsgI2Z1bGxTY3JlZW5JbnRlbnR9LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZMQUdfSElHSF9QUklPUklUWSA9IDB4MDAwMDAwODA7CisKICAgICBwdWJsaWMgaW50IGZsYWdzOwogCiAgICAgLyoqCkBAIC01NDMsNiArNTU0LDkgQEAKICAgICAgICAgc2IuYXBwZW5kKEludGVnZXIudG9IZXhTdHJpbmcodGhpcy5kZWZhdWx0cykpOwogICAgICAgICBzYi5hcHBlbmQoIixmbGFncz0weCIpOwogICAgICAgICBzYi5hcHBlbmQoSW50ZWdlci50b0hleFN0cmluZyh0aGlzLmZsYWdzKSk7CisgICAgICAgIGlmICgodGhpcy5mbGFncyAmIEZMQUdfSElHSF9QUklPUklUWSkgIT0gMCkgeworICAgICAgICAgICAgc2IuYXBwZW5kKCIhISExIW9uZSEiKTsKKyAgICAgICAgfQogICAgICAgICBzYi5hcHBlbmQoIikiKTsKICAgICAgICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7CiAgICAgfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvYXBwL2FkbWluL0RldmljZUFkbWluSW5mby5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvYXBwL2FkbWluL0RldmljZUFkbWluSW5mby5qYXZhCmluZGV4IDBiY2Q2NWMuLjIyMzdjODIgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9hZG1pbi9EZXZpY2VBZG1pbkluZm8uamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9hcHAvYWRtaW4vRGV2aWNlQWRtaW5JbmZvLmphdmEKQEAgLTEwMyw2ICsxMDMsMTUgQEAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBVU0VTX1BPTElDWV9XSVBFX0RBVEEgPSA0OwogCisgICAgLyoqCisgICAgICogQSB0eXBlIG9mIHBvbGljeSB0aGF0IHRoaXMgZGV2aWNlIGFkbWluIGNhbiB1c2U6IGFibGUgdG8gc3BlY2lmeSB0aGUKKyAgICAgKiBkZXZpY2UgR2xvYmFsIFByb3h5LCB2aWEge0BsaW5rIERldmljZVBvbGljeU1hbmFnZXIjc2V0R2xvYmFsUHJveHl9LgorICAgICAqCisgICAgICogPHA+VG8gY29udHJvbCB0aGlzIHBvbGljeSwgdGhlIGRldmljZSBhZG1pbiBtdXN0IGhhdmUgYSAic2V0LWdsb2JhbC1wcm94eSIKKyAgICAgKiB0YWcgaW4gdGhlICJ1c2VzLXBvbGljaWVzIiBzZWN0aW9uIG9mIGl0cyBtZXRhLWRhdGEuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVVNFU19QT0xJQ1lfU0VUU19HTE9CQUxfUFJPWFkgPSA1OworCiAgICAgLyoqIEBoaWRlICovCiAgICAgcHVibGljIHN0YXRpYyBjbGFzcyBQb2xpY3lJbmZvIHsKICAgICAgICAgcHVibGljIGZpbmFsIGludCBpZGVudDsKQEAgLTEzOCw2ICsxNDcsOSBAQAogICAgICAgICBzUG9saWNpZXNEaXNwbGF5T3JkZXIuYWRkKG5ldyBQb2xpY3lJbmZvKFVTRVNfUE9MSUNZX0ZPUkNFX0xPQ0ssICJmb3JjZS1sb2NrIiwKICAgICAgICAgICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0cmluZy5wb2xpY3lsYWJfZm9yY2VMb2NrLAogICAgICAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3RyaW5nLnBvbGljeWRlc2NfZm9yY2VMb2NrKSk7CisgICAgICAgIHNQb2xpY2llc0Rpc3BsYXlPcmRlci5hZGQobmV3IFBvbGljeUluZm8oVVNFU19QT0xJQ1lfU0VUU19HTE9CQUxfUFJPWFksICJzZXQtZ2xvYmFsLXByb3h5IiwKKyAgICAgICAgICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0cmluZy5wb2xpY3lsYWJfc2V0R2xvYmFsUHJveHksCisgICAgICAgICAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHJpbmcucG9saWN5ZGVzY19zZXRHbG9iYWxQcm94eSkpOwogICAgICAgICAKICAgICAgICAgZm9yIChpbnQgaT0wOyBpPHNQb2xpY2llc0Rpc3BsYXlPcmRlci5zaXplKCk7IGkrKykgewogICAgICAgICAgICAgUG9saWN5SW5mbyBwaSA9IHNQb2xpY2llc0Rpc3BsYXlPcmRlci5nZXQoaSk7CkBAIC0zMjgsNyArMzQwLDcgQEAKICAgICAgKiB0aGUgZ2l2ZW4gcG9saWN5IGNvbnRyb2wuICBUaGUgcG9zc2libGUgcG9saWN5IGlkZW50aWZpZXIgaW5wdXRzIGFyZToKICAgICAgKiB7QGxpbmsgI1VTRVNfUE9MSUNZX0xJTUlUX1BBU1NXT1JEfSwge0BsaW5rICNVU0VTX1BPTElDWV9XQVRDSF9MT0dJTn0sCiAgICAgICoge0BsaW5rICNVU0VTX1BPTElDWV9SRVNFVF9QQVNTV09SRH0sIHtAbGluayAjVVNFU19QT0xJQ1lfRk9SQ0VfTE9DS30sCi0gICAgICoge0BsaW5rICNVU0VTX1BPTElDWV9XSVBFX0RBVEF9LgorICAgICAqIHtAbGluayAjVVNFU19QT0xJQ1lfV0lQRV9EQVRBfSwge0BsaW5rICNVU0VTX1BPTElDWV9TRVRTX0dMT0JBTF9QUk9YWX0uCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gdXNlc1BvbGljeShpbnQgcG9saWN5SWRlbnQpIHsKICAgICAgICAgcmV0dXJuIChtVXNlc1BvbGljaWVzICYgKDE8PHBvbGljeUlkZW50KSkgIT0gMDsKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9hZG1pbi9EZXZpY2VQb2xpY3lNYW5hZ2VyLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9hcHAvYWRtaW4vRGV2aWNlUG9saWN5TWFuYWdlci5qYXZhCmluZGV4IDI5NmQ3MGE0Li4yYjdlNDI3IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9hcHAvYWRtaW4vRGV2aWNlUG9saWN5TWFuYWdlci5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9hZG1pbi9EZXZpY2VQb2xpY3lNYW5hZ2VyLmphdmEKQEAgLTMyLDYgKzMyLDggQEAKIGltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwogCiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5ldC5JbmV0U29ja2V0QWRkcmVzczsKK2ltcG9ydCBqYXZhLm5ldC5Qcm94eTsKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKIAogLyoqCkBAIC00Niw3ICs0OCw3IEBACiAKICAgICBwcml2YXRlIGZpbmFsIENvbnRleHQgbUNvbnRleHQ7CiAgICAgcHJpdmF0ZSBmaW5hbCBJRGV2aWNlUG9saWN5TWFuYWdlciBtU2VydmljZTsKLSAgICAKKwogICAgIHByaXZhdGUgZmluYWwgSGFuZGxlciBtSGFuZGxlcjsKIAogICAgIHByaXZhdGUgRGV2aWNlUG9saWN5TWFuYWdlcihDb250ZXh0IGNvbnRleHQsIEhhbmRsZXIgaGFuZGxlcikgewpAQCAtNjEsMTQgKzYzLDE0IEBACiAgICAgICAgIERldmljZVBvbGljeU1hbmFnZXIgbWUgPSBuZXcgRGV2aWNlUG9saWN5TWFuYWdlcihjb250ZXh0LCBoYW5kbGVyKTsKICAgICAgICAgcmV0dXJuIG1lLm1TZXJ2aWNlICE9IG51bGwgPyBtZSA6IG51bGw7CiAgICAgfQotICAgIAorCiAgICAgLyoqCiAgICAgICogQWN0aXZpdHkgYWN0aW9uOiBhc2sgdGhlIHVzZXIgdG8gYWRkIGEgbmV3IGRldmljZSBhZG1pbmlzdHJhdG9yIHRvIHRoZSBzeXN0ZW0uCiAgICAgICogVGhlIGRlc2lyZWQgcG9saWN5IGlzIHRoZSBDb21wb25lbnROYW1lIG9mIHRoZSBwb2xpY3kgaW4gdGhlCiAgICAgICoge0BsaW5rICNFWFRSQV9ERVZJQ0VfQURNSU59IGV4dHJhIGZpZWxkLiAgVGhpcyB3aWxsIGludm9rZSBhIFVJIHRvCiAgICAgICogYnJpbmcgdGhlIHVzZXIgdGhyb3VnaCBhZGRpbmcgdGhlIGRldmljZSBhZG1pbmlzdHJhdG9yIHRvIHRoZSBzeXN0ZW0gKG9yCiAgICAgICogYWxsb3dpbmcgdGhlbSB0byByZWplY3QgaXQpLgotICAgICAqIAorICAgICAqCiAgICAgICogPHA+WW91IGNhbiBvcHRpb25hbGx5IGluY2x1ZGUgdGhlIHtAbGluayAjRVhUUkFfQUREX0VYUExBTkFUSU9OfQogICAgICAqIGZpZWxkIHRvIHByb3ZpZGUgdGhlIHVzZXIgd2l0aCBhZGRpdGlvbmFsIGV4cGxhbmF0aW9uIChpbiBhZGRpdGlvbgogICAgICAqIHRvIHlvdXIgY29tcG9uZW50J3MgZGVzY3JpcHRpb24pIGFib3V0IHdoYXQgaXMgYmVpbmcgYWRkZWQuCkBAIC03Niw3ICs3OCw3IEBACiAgICAgQFNka0NvbnN0YW50KFNka0NvbnN0YW50VHlwZS5BQ1RJVklUWV9JTlRFTlRfQUNUSU9OKQogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFDVElPTl9BRERfREVWSUNFX0FETUlOCiAgICAgICAgICAgICA9ICJhbmRyb2lkLmFwcC5hY3Rpb24uQUREX0RFVklDRV9BRE1JTiI7Ci0gICAgCisKICAgICAvKioKICAgICAgKiBBY3Rpdml0eSBhY3Rpb246IHNlbmQgd2hlbiBhbnkgcG9saWN5IGFkbWluIGNoYW5nZXMgYSBwb2xpY3kuCiAgICAgICogVGhpcyBpcyBnZW5lcmFsbHkgdXNlZCB0byBmaW5kIG91dCB3aGVuIGEgbmV3IHBvbGljeSBpcyBpbiBlZmZlY3QuCkBAIC05Miw3ICs5NCw3IEBACiAgICAgICogQHNlZSAjQUNUSU9OX0FERF9ERVZJQ0VfQURNSU4KICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRSQV9ERVZJQ0VfQURNSU4gPSAiYW5kcm9pZC5hcHAuZXh0cmEuREVWSUNFX0FETUlOIjsKLSAgICAKKwogICAgIC8qKgogICAgICAqIEFuIG9wdGlvbmFsIENoYXJTZXF1ZW5jZSBwcm92aWRpbmcgYWRkaXRpb25hbCBleHBsYW5hdGlvbiBmb3Igd2h5IHRoZQogICAgICAqIGFkbWluIGlzIGJlaW5nIGFkZGVkLgpAQCAtMTAwLDIyICsxMDIsMjEgQEAKICAgICAgKiBAc2VlICNBQ1RJT05fQUREX0RFVklDRV9BRE1JTgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVFJBX0FERF9FWFBMQU5BVElPTiA9ICJhbmRyb2lkLmFwcC5leHRyYS5BRERfRVhQTEFOQVRJT04iOwotICAgIAorCiAgICAgLyoqCi0gICAgICogQWN0aXZpdHkgYWN0aW9uOiBoYXZlIHRoZSB1c2VyIGVudGVyIGEgbmV3IHBhc3N3b3JkLiAgVGhpcyBhY3Rpdml0eQotICAgICAqIHNob3VsZCBiZSBsYXVuY2hlZCBhZnRlciB1c2luZyB7QGxpbmsgI3NldFBhc3N3b3JkUXVhbGl0eShDb21wb25lbnROYW1lLCBpbnQpfQotICAgICAqIG9yIHtAbGluayAjc2V0UGFzc3dvcmRNaW5pbXVtTGVuZ3RoKENvbXBvbmVudE5hbWUsIGludCl9IHRvIGhhdmUgdGhlCi0gICAgICogdXNlciBlbnRlciBhIG5ldyBwYXNzd29yZCB0aGF0IG1lZXRzIHRoZSBjdXJyZW50IHJlcXVpcmVtZW50cy4gIFlvdSBjYW4KLSAgICAgKiB1c2Uge0BsaW5rICNpc0FjdGl2ZVBhc3N3b3JkU3VmZmljaWVudCgpfSB0byBkZXRlcm1pbmUgd2hldGhlciB5b3UgbmVlZAotICAgICAqIHRvIGhhdmUgdGhlIHVzZXIgc2VsZWN0IGEgbmV3IHBhc3N3b3JkIGluIG9yZGVyIHRvIG1lZXQgdGhlIGN1cnJlbnQKLSAgICAgKiBjb25zdHJhaW50cy4gIFVwb24gYmVpbmcgcmVzdW1lZCBmcm9tIHRoaXMgYWN0aXZpdHksCi0gICAgICogeW91IGNhbiBjaGVjayB0aGUgbmV3IHBhc3N3b3JkIGNoYXJhY3RlcmlzdGljcyB0byBzZWUgaWYgdGhleSBhcmUKLSAgICAgKiBzdWZmaWNpZW50LgorICAgICAqIEFjdGl2aXR5IGFjdGlvbjogaGF2ZSB0aGUgdXNlciBlbnRlciBhIG5ldyBwYXNzd29yZC4gVGhpcyBhY3Rpdml0eSBzaG91bGQKKyAgICAgKiBiZSBsYXVuY2hlZCBhZnRlciB1c2luZyB7QGxpbmsgI3NldFBhc3N3b3JkUXVhbGl0eShDb21wb25lbnROYW1lLCBpbnQpfSwKKyAgICAgKiBvciB7QGxpbmsgI3NldFBhc3N3b3JkTWluaW11bUxlbmd0aChDb21wb25lbnROYW1lLCBpbnQpfSB0byBoYXZlIHRoZSB1c2VyCisgICAgICogZW50ZXIgYSBuZXcgcGFzc3dvcmQgdGhhdCBtZWV0cyB0aGUgY3VycmVudCByZXF1aXJlbWVudHMuIFlvdSBjYW4gdXNlCisgICAgICoge0BsaW5rICNpc0FjdGl2ZVBhc3N3b3JkU3VmZmljaWVudCgpfSB0byBkZXRlcm1pbmUgd2hldGhlciB5b3UgbmVlZCB0bworICAgICAqIGhhdmUgdGhlIHVzZXIgc2VsZWN0IGEgbmV3IHBhc3N3b3JkIGluIG9yZGVyIHRvIG1lZXQgdGhlIGN1cnJlbnQKKyAgICAgKiBjb25zdHJhaW50cy4gVXBvbiBiZWluZyByZXN1bWVkIGZyb20gdGhpcyBhY3Rpdml0eSwgeW91IGNhbiBjaGVjayB0aGUgbmV3CisgICAgICogcGFzc3dvcmQgY2hhcmFjdGVyaXN0aWNzIHRvIHNlZSBpZiB0aGV5IGFyZSBzdWZmaWNpZW50LgogICAgICAqLwogICAgIEBTZGtDb25zdGFudChTZGtDb25zdGFudFR5cGUuQUNUSVZJVFlfSU5URU5UX0FDVElPTikKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBQ1RJT05fU0VUX05FV19QQVNTV09SRAogICAgICAgICAgICAgPSAiYW5kcm9pZC5hcHAuYWN0aW9uLlNFVF9ORVdfUEFTU1dPUkQiOwotICAgIAorCiAgICAgLyoqCiAgICAgICogUmV0dXJuIHRydWUgaWYgdGhlIGdpdmVuIGFkbWluaXN0cmF0b3IgY29tcG9uZW50IGlzIGN1cnJlbnRseQogICAgICAqIGFjdGl2ZSAoZW5hYmxlZCkgaW4gdGhlIHN5c3RlbS4KQEAgLTEzMCw3ICsxMzEsNyBAQAogICAgICAgICB9CiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9Ci0gICAgCisKICAgICAvKioKICAgICAgKiBSZXR1cm4gYSBsaXN0IG9mIGFsbCBjdXJyZW50bHkgYWN0aXZlIGRldmljZSBhZG1pbmlzdHJhdG9yJ3MgY29tcG9uZW50CiAgICAgICogbmFtZXMuICBOb3RlIHRoYXQgaWYgdGhlcmUgYXJlIG5vIGFkbWluaXN0cmF0b3JzIHRoYW4gbnVsbCBtYXkgYmUKQEAgLTE0Niw3ICsxNDcsNyBAQAogICAgICAgICB9CiAgICAgICAgIHJldHVybiBudWxsOwogICAgIH0KLSAgICAKKwogICAgIC8qKgogICAgICAqIEBoaWRlCiAgICAgICovCkBAIC0xNjAsNyArMTYxLDcgQEAKICAgICAgICAgfQogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQotICAgIAorCiAgICAgLyoqCiAgICAgICogUmVtb3ZlIGEgY3VycmVudCBhZG1pbmlzdHJhdGlvbiBjb21wb25lbnQuICBUaGlzIGNhbiBvbmx5IGJlIGNhbGxlZAogICAgICAqIGJ5IHRoZSBhcHBsaWNhdGlvbiB0aGF0IG93bnMgdGhlIGFkbWluaXN0cmF0aW9uIGNvbXBvbmVudDsgaWYgeW91CkBAIC0xNzYsMjggKzE3NywyOCBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQotICAgIAorCiAgICAgLyoqCiAgICAgICogQ29uc3RhbnQgZm9yIHtAbGluayAjc2V0UGFzc3dvcmRRdWFsaXR5fTogdGhlIHBvbGljeSBoYXMgbm8gcmVxdWlyZW1lbnRzCiAgICAgICogZm9yIHRoZSBwYXNzd29yZC4gIE5vdGUgdGhhdCBxdWFsaXR5IGNvbnN0YW50cyBhcmUgb3JkZXJlZCBzbyB0aGF0IGhpZ2hlcgogICAgICAqIHZhbHVlcyBhcmUgbW9yZSByZXN0cmljdGl2ZS4KICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQQVNTV09SRF9RVUFMSVRZX1VOU1BFQ0lGSUVEID0gMDsKLSAgICAKKwogICAgIC8qKgogICAgICAqIENvbnN0YW50IGZvciB7QGxpbmsgI3NldFBhc3N3b3JkUXVhbGl0eX06IHRoZSBwb2xpY3kgcmVxdWlyZXMgc29tZSBraW5kCiAgICAgICogb2YgcGFzc3dvcmQsIGJ1dCBkb2Vzbid0IGNhcmUgd2hhdCBpdCBpcy4gIE5vdGUgdGhhdCBxdWFsaXR5IGNvbnN0YW50cwogICAgICAqIGFyZSBvcmRlcmVkIHNvIHRoYXQgaGlnaGVyIHZhbHVlcyBhcmUgbW9yZSByZXN0cmljdGl2ZS4KICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQQVNTV09SRF9RVUFMSVRZX1NPTUVUSElORyA9IDB4MTAwMDA7Ci0gICAgCisKICAgICAvKioKICAgICAgKiBDb25zdGFudCBmb3Ige0BsaW5rICNzZXRQYXNzd29yZFF1YWxpdHl9OiB0aGUgdXNlciBtdXN0IGhhdmUgZW50ZXJlZCBhCiAgICAgICogcGFzc3dvcmQgY29udGFpbmluZyBhdCBsZWFzdCBudW1lcmljIGNoYXJhY3RlcnMuICBOb3RlIHRoYXQgcXVhbGl0eQogICAgICAqIGNvbnN0YW50cyBhcmUgb3JkZXJlZCBzbyB0aGF0IGhpZ2hlciB2YWx1ZXMgYXJlIG1vcmUgcmVzdHJpY3RpdmUuCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUEFTU1dPUkRfUVVBTElUWV9OVU1FUklDID0gMHgyMDAwMDsKLSAgICAKKwogICAgIC8qKgogICAgICAqIENvbnN0YW50IGZvciB7QGxpbmsgI3NldFBhc3N3b3JkUXVhbGl0eX06IHRoZSB1c2VyIG11c3QgaGF2ZSBlbnRlcmVkIGEKICAgICAgKiBwYXNzd29yZCBjb250YWluaW5nIGF0IGxlYXN0IGFscGhhYmV0aWMgKG9yIG90aGVyIHN5bWJvbCkgY2hhcmFjdGVycy4KQEAgLTIwNSw3ICsyMDYsNyBAQAogICAgICAqIHJlc3RyaWN0aXZlLgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBBU1NXT1JEX1FVQUxJVFlfQUxQSEFCRVRJQyA9IDB4NDAwMDA7Ci0gICAgCisKICAgICAvKioKICAgICAgKiBDb25zdGFudCBmb3Ige0BsaW5rICNzZXRQYXNzd29yZFF1YWxpdHl9OiB0aGUgdXNlciBtdXN0IGhhdmUgZW50ZXJlZCBhCiAgICAgICogcGFzc3dvcmQgY29udGFpbmluZyBhdCBsZWFzdCA8ZW0+Ym90aD48L2VtPiBudW1lcmljIDxlbT5hbmQ8L2VtPgpAQCAtMjEzLDcgKzIxNCwxOSBAQAogICAgICAqIG9yZGVyZWQgc28gdGhhdCBoaWdoZXIgdmFsdWVzIGFyZSBtb3JlIHJlc3RyaWN0aXZlLgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBBU1NXT1JEX1FVQUxJVFlfQUxQSEFOVU1FUklDID0gMHg1MDAwMDsKLSAgICAKKworICAgIC8qKgorICAgICAqIENvbnN0YW50IGZvciB7QGxpbmsgI3NldFBhc3N3b3JkUXVhbGl0eX06IHRoZSB1c2VyIG11c3QgaGF2ZSBlbnRlcmVkIGEKKyAgICAgKiBwYXNzd29yZCBjb250YWluaW5nIGF0IGxlYXN0IGEgbGV0dGVyLCBhIG51bWVyaWNhbCBkaWdpdCBhbmQgYSBzcGVjaWFsCisgICAgICogc3ltYm9sLCBieSBkZWZhdWx0LiBXaXRoIHRoaXMgcGFzc3dvcmQgcXVhbGl0eSwgcGFzc3dvcmRzIGNhbiBiZQorICAgICAqIHJlc3RyaWN0ZWQgdG8gY29udGFpbiB2YXJpb3VzIHNldHMgb2YgY2hhcmFjdGVycywgbGlrZSBhdCBsZWFzdCBhbgorICAgICAqIHVwcGVyY2FzZSBsZXR0ZXIsIGV0Yy4gVGhlc2UgYXJlIHNwZWNpZmllZCB1c2luZyB2YXJpb3VzIG1ldGhvZHMsCisgICAgICogbGlrZSB7QGxpbmsgI3NldFBhc3N3b3JkTWluaW11bUxvd2VyQ2FzZShDb21wb25lbnROYW1lLCBpbnQpfS4gTm90ZQorICAgICAqIHRoYXQgcXVhbGl0eSBjb25zdGFudHMgYXJlIG9yZGVyZWQgc28gdGhhdCBoaWdoZXIgdmFsdWVzIGFyZSBtb3JlCisgICAgICogcmVzdHJpY3RpdmUuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUEFTU1dPUkRfUVVBTElUWV9DT01QTEVYID0gMHg2MDAwMDsKKwogICAgIC8qKgogICAgICAqIENhbGxlZCBieSBhbiBhcHBsaWNhdGlvbiB0aGF0IGlzIGFkbWluaXN0ZXJpbmcgdGhlIGRldmljZSB0byBzZXQgdGhlCiAgICAgICogcGFzc3dvcmQgcmVzdHJpY3Rpb25zIGl0IGlzIGltcG9zaW5nLiAgQWZ0ZXIgc2V0dGluZyB0aGlzLCB0aGUgdXNlcgpAQCAtMjIyLDIxICsyMzUsMjEgQEAKICAgICAgKiB3aWxsIHJlbWFpbiB1bnRpbCB0aGUgdXNlciBoYXMgc2V0IGEgbmV3IG9uZSwgc28gdGhlIGNoYW5nZSBkb2VzIG5vdAogICAgICAqIHRha2UgcGxhY2UgaW1tZWRpYXRlbHkuICBUbyBwcm9tcHQgdGhlIHVzZXIgZm9yIGEgbmV3IHBhc3N3b3JkLCB1c2UKICAgICAgKiB7QGxpbmsgI0FDVElPTl9TRVRfTkVXX1BBU1NXT1JEfSBhZnRlciBzZXR0aW5nIHRoaXMgdmFsdWUuCi0gICAgICogCisgICAgICoKICAgICAgKiA8cD5RdWFsaXR5IGNvbnN0YW50cyBhcmUgb3JkZXJlZCBzbyB0aGF0IGhpZ2hlciB2YWx1ZXMgYXJlIG1vcmUgcmVzdHJpY3RpdmU7CiAgICAgICogdGh1cyB0aGUgaGlnaGVzdCByZXF1ZXN0ZWQgcXVhbGl0eSBjb25zdGFudCAoYmV0d2VlbiB0aGUgcG9saWN5IHNldCBoZXJlLAogICAgICAqIHRoZSB1c2VyJ3MgcHJlZmVyZW5jZSwgYW5kIGFueSBvdGhlciBjb25zaWRlcmF0aW9ucykgaXMgdGhlIG9uZSB0aGF0CiAgICAgICogaXMgaW4gZWZmZWN0LgotICAgICAqIAorICAgICAqCiAgICAgICogPHA+VGhlIGNhbGxpbmcgZGV2aWNlIGFkbWluIG11c3QgaGF2ZSByZXF1ZXN0ZWQKICAgICAgKiB7QGxpbmsgRGV2aWNlQWRtaW5JbmZvI1VTRVNfUE9MSUNZX0xJTUlUX1BBU1NXT1JEfSB0byBiZSBhYmxlIHRvIGNhbGwKICAgICAgKiB0aGlzIG1ldGhvZDsgaWYgaXQgaGFzIG5vdCwgYSBzZWN1cml0eSBleGNlcHRpb24gd2lsbCBiZSB0aHJvd24uCi0gICAgICogCisgICAgICoKICAgICAgKiBAcGFyYW0gYWRtaW4gV2hpY2gge0BsaW5rIERldmljZUFkbWluUmVjZWl2ZXJ9IHRoaXMgcmVxdWVzdCBpcyBhc3NvY2lhdGVkIHdpdGguCiAgICAgICogQHBhcmFtIHF1YWxpdHkgVGhlIG5ldyBkZXNpcmVkIHF1YWxpdHkuICBPbmUgb2YKICAgICAgKiB7QGxpbmsgI1BBU1NXT1JEX1FVQUxJVFlfVU5TUEVDSUZJRUR9LCB7QGxpbmsgI1BBU1NXT1JEX1FVQUxJVFlfU09NRVRISU5HfSwKICAgICAgKiB7QGxpbmsgI1BBU1NXT1JEX1FVQUxJVFlfTlVNRVJJQ30sIHtAbGluayAjUEFTU1dPUkRfUVVBTElUWV9BTFBIQUJFVElDfSwKLSAgICAgKiBvciB7QGxpbmsgI1BBU1NXT1JEX1FVQUxJVFlfQUxQSEFOVU1FUklDfS4KKyAgICAgKiB7QGxpbmsgI1BBU1NXT1JEX1FVQUxJVFlfQUxQSEFOVU1FUklDfSBvciB7QGxpbmsgI1BBU1NXT1JEX1FVQUxJVFlfQ09NUExFWH0uCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0UGFzc3dvcmRRdWFsaXR5KENvbXBvbmVudE5hbWUgYWRtaW4sIGludCBxdWFsaXR5KSB7CiAgICAgICAgIGlmIChtU2VydmljZSAhPSBudWxsKSB7CkBAIC0yNDcsNyArMjYwLDcgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KLSAgICAKKwogICAgIC8qKgogICAgICAqIFJldHJpZXZlIHRoZSBjdXJyZW50IG1pbmltdW0gcGFzc3dvcmQgcXVhbGl0eSBmb3IgYWxsIGFkbWlucwogICAgICAqIG9yIGEgcGFydGljdWxhciBvbmUuCkBAIC0yNjQsNyArMjc3LDcgQEAKICAgICAgICAgfQogICAgICAgICByZXR1cm4gUEFTU1dPUkRfUVVBTElUWV9VTlNQRUNJRklFRDsKICAgICB9Ci0gICAgCisKICAgICAvKioKICAgICAgKiBDYWxsZWQgYnkgYW4gYXBwbGljYXRpb24gdGhhdCBpcyBhZG1pbmlzdGVyaW5nIHRoZSBkZXZpY2UgdG8gc2V0IHRoZQogICAgICAqIG1pbmltdW0gYWxsb3dlZCBwYXNzd29yZCBsZW5ndGguICBBZnRlciBzZXR0aW5nIHRoaXMsIHRoZSB1c2VyCkBAIC0yNzQsMTQgKzI4NywxNCBAQAogICAgICAqIHRha2UgcGxhY2UgaW1tZWRpYXRlbHkuICBUbyBwcm9tcHQgdGhlIHVzZXIgZm9yIGEgbmV3IHBhc3N3b3JkLCB1c2UKICAgICAgKiB7QGxpbmsgI0FDVElPTl9TRVRfTkVXX1BBU1NXT1JEfSBhZnRlciBzZXR0aW5nIHRoaXMgdmFsdWUuICBUaGlzCiAgICAgICogY29uc3RyYWludCBpcyBvbmx5IGltcG9zZWQgaWYgdGhlIGFkbWluaXN0cmF0b3IgaGFzIGFsc28gcmVxdWVzdGVkIGVpdGhlcgotICAgICAqIHtAbGluayAjUEFTU1dPUkRfUVVBTElUWV9OVU1FUklDfSwge0BsaW5rICNQQVNTV09SRF9RVUFMSVRZX0FMUEhBQkVUSUN9LAotICAgICAqIG9yIHtAbGluayAjUEFTU1dPUkRfUVVBTElUWV9BTFBIQU5VTUVSSUN9CisgICAgICoge0BsaW5rICNQQVNTV09SRF9RVUFMSVRZX05VTUVSSUN9LCB7QGxpbmsgI1BBU1NXT1JEX1FVQUxJVFlfQUxQSEFCRVRJQ30KKyAgICAgKiB7QGxpbmsgI1BBU1NXT1JEX1FVQUxJVFlfQUxQSEFOVU1FUklDfSwgb3Ige0BsaW5rICNQQVNTV09SRF9RVUFMSVRZX0NPTVBMRVh9CiAgICAgICogd2l0aCB7QGxpbmsgI3NldFBhc3N3b3JkUXVhbGl0eX0uCi0gICAgICogCisgICAgICoKICAgICAgKiA8cD5UaGUgY2FsbGluZyBkZXZpY2UgYWRtaW4gbXVzdCBoYXZlIHJlcXVlc3RlZAogICAgICAqIHtAbGluayBEZXZpY2VBZG1pbkluZm8jVVNFU19QT0xJQ1lfTElNSVRfUEFTU1dPUkR9IHRvIGJlIGFibGUgdG8gY2FsbAogICAgICAqIHRoaXMgbWV0aG9kOyBpZiBpdCBoYXMgbm90LCBhIHNlY3VyaXR5IGV4Y2VwdGlvbiB3aWxsIGJlIHRocm93bi4KLSAgICAgKiAKKyAgICAgKgogICAgICAqIEBwYXJhbSBhZG1pbiBXaGljaCB7QGxpbmsgRGV2aWNlQWRtaW5SZWNlaXZlcn0gdGhpcyByZXF1ZXN0IGlzIGFzc29jaWF0ZWQgd2l0aC4KICAgICAgKiBAcGFyYW0gbGVuZ3RoIFRoZSBuZXcgZGVzaXJlZCBtaW5pbXVtIHBhc3N3b3JkIGxlbmd0aC4gIEEgdmFsdWUgb2YgMAogICAgICAqIG1lYW5zIHRoZXJlIGlzIG5vIHJlc3RyaWN0aW9uLgpAQCAtMjk1LDcgKzMwOCw3IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9Ci0gICAgCisKICAgICAvKioKICAgICAgKiBSZXRyaWV2ZSB0aGUgY3VycmVudCBtaW5pbXVtIHBhc3N3b3JkIGxlbmd0aCBmb3IgYWxsIGFkbWlucwogICAgICAqIG9yIGEgcGFydGljdWxhciBvbmUuCkBAIC0zMTIsNyArMzI1LDM3OSBAQAogICAgICAgICB9CiAgICAgICAgIHJldHVybiAwOwogICAgIH0KLSAgICAKKworICAgIC8qKgorICAgICAqIENhbGxlZCBieSBhbiBhcHBsaWNhdGlvbiB0aGF0IGlzIGFkbWluaXN0ZXJpbmcgdGhlIGRldmljZSB0byBzZXQgdGhlCisgICAgICogbWluaW11bSBudW1iZXIgb2YgdXBwZXIgY2FzZSBsZXR0ZXJzIHJlcXVpcmVkIGluIHRoZSBwYXNzd29yZC4gQWZ0ZXIKKyAgICAgKiBzZXR0aW5nIHRoaXMsIHRoZSB1c2VyIHdpbGwgbm90IGJlIGFibGUgdG8gZW50ZXIgYSBuZXcgcGFzc3dvcmQgdGhhdCBpcworICAgICAqIG5vdCBhdCBsZWFzdCBhcyByZXN0cmljdGl2ZSBhcyB3aGF0IGhhcyBiZWVuIHNldC4gTm90ZSB0aGF0IHRoZSBjdXJyZW50CisgICAgICogcGFzc3dvcmQgd2lsbCByZW1haW4gdW50aWwgdGhlIHVzZXIgaGFzIHNldCBhIG5ldyBvbmUsIHNvIHRoZSBjaGFuZ2UgZG9lcworICAgICAqIG5vdCB0YWtlIHBsYWNlIGltbWVkaWF0ZWx5LiBUbyBwcm9tcHQgdGhlIHVzZXIgZm9yIGEgbmV3IHBhc3N3b3JkLCB1c2UKKyAgICAgKiB7QGxpbmsgI0FDVElPTl9TRVRfTkVXX1BBU1NXT1JEfSBhZnRlciBzZXR0aW5nIHRoaXMgdmFsdWUuIFRoaXMKKyAgICAgKiBjb25zdHJhaW50IGlzIG9ubHkgaW1wb3NlZCBpZiB0aGUgYWRtaW5pc3RyYXRvciBoYXMgYWxzbyByZXF1ZXN0ZWQKKyAgICAgKiB7QGxpbmsgI1BBU1NXT1JEX1FVQUxJVFlfQ09NUExFWH0gd2l0aCB7QGxpbmsgI3NldFBhc3N3b3JkUXVhbGl0eX0uIFRoZQorICAgICAqIGRlZmF1bHQgdmFsdWUgaXMgMC4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGUgY2FsbGluZyBkZXZpY2UgYWRtaW4gbXVzdCBoYXZlIHJlcXVlc3RlZAorICAgICAqIHtAbGluayBEZXZpY2VBZG1pbkluZm8jVVNFU19QT0xJQ1lfTElNSVRfUEFTU1dPUkR9IHRvIGJlIGFibGUgdG8gY2FsbAorICAgICAqIHRoaXMgbWV0aG9kOyBpZiBpdCBoYXMgbm90LCBhIHNlY3VyaXR5IGV4Y2VwdGlvbiB3aWxsIGJlIHRocm93bi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBhZG1pbiBXaGljaCB7QGxpbmsgRGV2aWNlQWRtaW5SZWNlaXZlcn0gdGhpcyByZXF1ZXN0IGlzIGFzc29jaWF0ZWQKKyAgICAgKiAgICAgICAgICAgIHdpdGguCisgICAgICogQHBhcmFtIGxlbmd0aCBUaGUgbmV3IGRlc2lyZWQgbWluaW11bSBudW1iZXIgb2YgdXBwZXIgY2FzZSBsZXR0ZXJzCisgICAgICogICAgICAgICAgICByZXF1aXJlZCBpbiB0aGUgcGFzc3dvcmQuIEEgdmFsdWUgb2YgMCBtZWFucyB0aGVyZSBpcyBubworICAgICAqICAgICAgICAgICAgcmVzdHJpY3Rpb24uCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UGFzc3dvcmRNaW5pbXVtVXBwZXJDYXNlKENvbXBvbmVudE5hbWUgYWRtaW4sIGludCBsZW5ndGgpIHsKKyAgICAgICAgaWYgKG1TZXJ2aWNlICE9IG51bGwpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgbVNlcnZpY2Uuc2V0UGFzc3dvcmRNaW5pbXVtVXBwZXJDYXNlKGFkbWluLCBsZW5ndGgpOworICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJGYWlsZWQgdGFsa2luZyB3aXRoIGRldmljZSBwb2xpY3kgc2VydmljZSIsIGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0cmlldmUgdGhlIGN1cnJlbnQgbnVtYmVyIG9mIHVwcGVyIGNhc2UgbGV0dGVycyByZXF1aXJlZCBpbiB0aGUKKyAgICAgKiBwYXNzd29yZCBmb3IgYWxsIGFkbWlucyBvciBhIHBhcnRpY3VsYXIgb25lLiBUaGlzIGlzIHRoZSBzYW1lIHZhbHVlIGFzCisgICAgICogc2V0IGJ5IHsjbGluayB7QGxpbmsgI3NldFBhc3N3b3JkTWluaW11bVVwcGVyQ2FzZShDb21wb25lbnROYW1lLCBpbnQpfQorICAgICAqIGFuZCBvbmx5IGFwcGxpZXMgd2hlbiB0aGUgcGFzc3dvcmQgcXVhbGl0eSBpcworICAgICAqIHtAbGluayAjUEFTU1dPUkRfUVVBTElUWV9DT01QTEVYfS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBhZG1pbiBUaGUgbmFtZSBvZiB0aGUgYWRtaW4gY29tcG9uZW50IHRvIGNoZWNrLCBvciBudWxsIHRvCisgICAgICogICAgICAgICAgICBhZ2dyZWdhdGUgYWxsIGFkbWlucy4KKyAgICAgKiBAcmV0dXJuIFRoZSBtaW5pbXVtIG51bWJlciBvZiB1cHBlciBjYXNlIGxldHRlcnMgcmVxdWlyZWQgaW4gdGhlCisgICAgICogICAgICAgICBwYXNzd29yZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldFBhc3N3b3JkTWluaW11bVVwcGVyQ2FzZShDb21wb25lbnROYW1lIGFkbWluKSB7CisgICAgICAgIGlmIChtU2VydmljZSAhPSBudWxsKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHJldHVybiBtU2VydmljZS5nZXRQYXNzd29yZE1pbmltdW1VcHBlckNhc2UoYWRtaW4pOworICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJGYWlsZWQgdGFsa2luZyB3aXRoIGRldmljZSBwb2xpY3kgc2VydmljZSIsIGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIC8qKgorICAgICAqIENhbGxlZCBieSBhbiBhcHBsaWNhdGlvbiB0aGF0IGlzIGFkbWluaXN0ZXJpbmcgdGhlIGRldmljZSB0byBzZXQgdGhlCisgICAgICogbWluaW11bSBudW1iZXIgb2YgbG93ZXIgY2FzZSBsZXR0ZXJzIHJlcXVpcmVkIGluIHRoZSBwYXNzd29yZC4gQWZ0ZXIKKyAgICAgKiBzZXR0aW5nIHRoaXMsIHRoZSB1c2VyIHdpbGwgbm90IGJlIGFibGUgdG8gZW50ZXIgYSBuZXcgcGFzc3dvcmQgdGhhdCBpcworICAgICAqIG5vdCBhdCBsZWFzdCBhcyByZXN0cmljdGl2ZSBhcyB3aGF0IGhhcyBiZWVuIHNldC4gTm90ZSB0aGF0IHRoZSBjdXJyZW50CisgICAgICogcGFzc3dvcmQgd2lsbCByZW1haW4gdW50aWwgdGhlIHVzZXIgaGFzIHNldCBhIG5ldyBvbmUsIHNvIHRoZSBjaGFuZ2UgZG9lcworICAgICAqIG5vdCB0YWtlIHBsYWNlIGltbWVkaWF0ZWx5LiBUbyBwcm9tcHQgdGhlIHVzZXIgZm9yIGEgbmV3IHBhc3N3b3JkLCB1c2UKKyAgICAgKiB7QGxpbmsgI0FDVElPTl9TRVRfTkVXX1BBU1NXT1JEfSBhZnRlciBzZXR0aW5nIHRoaXMgdmFsdWUuIFRoaXMKKyAgICAgKiBjb25zdHJhaW50IGlzIG9ubHkgaW1wb3NlZCBpZiB0aGUgYWRtaW5pc3RyYXRvciBoYXMgYWxzbyByZXF1ZXN0ZWQKKyAgICAgKiB7QGxpbmsgI1BBU1NXT1JEX1FVQUxJVFlfQ09NUExFWH0gd2l0aCB7QGxpbmsgI3NldFBhc3N3b3JkUXVhbGl0eX0uIFRoZQorICAgICAqIGRlZmF1bHQgdmFsdWUgaXMgMC4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGUgY2FsbGluZyBkZXZpY2UgYWRtaW4gbXVzdCBoYXZlIHJlcXVlc3RlZAorICAgICAqIHtAbGluayBEZXZpY2VBZG1pbkluZm8jVVNFU19QT0xJQ1lfTElNSVRfUEFTU1dPUkR9IHRvIGJlIGFibGUgdG8gY2FsbAorICAgICAqIHRoaXMgbWV0aG9kOyBpZiBpdCBoYXMgbm90LCBhIHNlY3VyaXR5IGV4Y2VwdGlvbiB3aWxsIGJlIHRocm93bi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBhZG1pbiBXaGljaCB7QGxpbmsgRGV2aWNlQWRtaW5SZWNlaXZlcn0gdGhpcyByZXF1ZXN0IGlzIGFzc29jaWF0ZWQKKyAgICAgKiAgICAgICAgICAgIHdpdGguCisgICAgICogQHBhcmFtIGxlbmd0aCBUaGUgbmV3IGRlc2lyZWQgbWluaW11bSBudW1iZXIgb2YgbG93ZXIgY2FzZSBsZXR0ZXJzCisgICAgICogICAgICAgICAgICByZXF1aXJlZCBpbiB0aGUgcGFzc3dvcmQuIEEgdmFsdWUgb2YgMCBtZWFucyB0aGVyZSBpcyBubworICAgICAqICAgICAgICAgICAgcmVzdHJpY3Rpb24uCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UGFzc3dvcmRNaW5pbXVtTG93ZXJDYXNlKENvbXBvbmVudE5hbWUgYWRtaW4sIGludCBsZW5ndGgpIHsKKyAgICAgICAgaWYgKG1TZXJ2aWNlICE9IG51bGwpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgbVNlcnZpY2Uuc2V0UGFzc3dvcmRNaW5pbXVtTG93ZXJDYXNlKGFkbWluLCBsZW5ndGgpOworICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJGYWlsZWQgdGFsa2luZyB3aXRoIGRldmljZSBwb2xpY3kgc2VydmljZSIsIGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0cmlldmUgdGhlIGN1cnJlbnQgbnVtYmVyIG9mIGxvd2VyIGNhc2UgbGV0dGVycyByZXF1aXJlZCBpbiB0aGUKKyAgICAgKiBwYXNzd29yZCBmb3IgYWxsIGFkbWlucyBvciBhIHBhcnRpY3VsYXIgb25lLiBUaGlzIGlzIHRoZSBzYW1lIHZhbHVlIGFzCisgICAgICogc2V0IGJ5IHsjbGluayB7QGxpbmsgI3NldFBhc3N3b3JkTWluaW11bUxvd2VyQ2FzZShDb21wb25lbnROYW1lLCBpbnQpfQorICAgICAqIGFuZCBvbmx5IGFwcGxpZXMgd2hlbiB0aGUgcGFzc3dvcmQgcXVhbGl0eSBpcworICAgICAqIHtAbGluayAjUEFTU1dPUkRfUVVBTElUWV9DT01QTEVYfS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBhZG1pbiBUaGUgbmFtZSBvZiB0aGUgYWRtaW4gY29tcG9uZW50IHRvIGNoZWNrLCBvciBudWxsIHRvCisgICAgICogICAgICAgICAgICBhZ2dyZWdhdGUgYWxsIGFkbWlucy4KKyAgICAgKiBAcmV0dXJuIFRoZSBtaW5pbXVtIG51bWJlciBvZiBsb3dlciBjYXNlIGxldHRlcnMgcmVxdWlyZWQgaW4gdGhlCisgICAgICogICAgICAgICBwYXNzd29yZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldFBhc3N3b3JkTWluaW11bUxvd2VyQ2FzZShDb21wb25lbnROYW1lIGFkbWluKSB7CisgICAgICAgIGlmIChtU2VydmljZSAhPSBudWxsKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHJldHVybiBtU2VydmljZS5nZXRQYXNzd29yZE1pbmltdW1Mb3dlckNhc2UoYWRtaW4pOworICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJGYWlsZWQgdGFsa2luZyB3aXRoIGRldmljZSBwb2xpY3kgc2VydmljZSIsIGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIC8qKgorICAgICAqIENhbGxlZCBieSBhbiBhcHBsaWNhdGlvbiB0aGF0IGlzIGFkbWluaXN0ZXJpbmcgdGhlIGRldmljZSB0byBzZXQgdGhlCisgICAgICogbWluaW11bSBudW1iZXIgb2YgbGV0dGVycyByZXF1aXJlZCBpbiB0aGUgcGFzc3dvcmQuIEFmdGVyIHNldHRpbmcgdGhpcywKKyAgICAgKiB0aGUgdXNlciB3aWxsIG5vdCBiZSBhYmxlIHRvIGVudGVyIGEgbmV3IHBhc3N3b3JkIHRoYXQgaXMgbm90IGF0IGxlYXN0IGFzCisgICAgICogcmVzdHJpY3RpdmUgYXMgd2hhdCBoYXMgYmVlbiBzZXQuIE5vdGUgdGhhdCB0aGUgY3VycmVudCBwYXNzd29yZCB3aWxsCisgICAgICogcmVtYWluIHVudGlsIHRoZSB1c2VyIGhhcyBzZXQgYSBuZXcgb25lLCBzbyB0aGUgY2hhbmdlIGRvZXMgbm90IHRha2UKKyAgICAgKiBwbGFjZSBpbW1lZGlhdGVseS4gVG8gcHJvbXB0IHRoZSB1c2VyIGZvciBhIG5ldyBwYXNzd29yZCwgdXNlCisgICAgICoge0BsaW5rICNBQ1RJT05fU0VUX05FV19QQVNTV09SRH0gYWZ0ZXIgc2V0dGluZyB0aGlzIHZhbHVlLiBUaGlzCisgICAgICogY29uc3RyYWludCBpcyBvbmx5IGltcG9zZWQgaWYgdGhlIGFkbWluaXN0cmF0b3IgaGFzIGFsc28gcmVxdWVzdGVkCisgICAgICoge0BsaW5rICNQQVNTV09SRF9RVUFMSVRZX0NPTVBMRVh9IHdpdGgge0BsaW5rICNzZXRQYXNzd29yZFF1YWxpdHl9LiBUaGUKKyAgICAgKiBkZWZhdWx0IHZhbHVlIGlzIDEuCisgICAgICogPHA+CisgICAgICogVGhlIGNhbGxpbmcgZGV2aWNlIGFkbWluIG11c3QgaGF2ZSByZXF1ZXN0ZWQKKyAgICAgKiB7QGxpbmsgRGV2aWNlQWRtaW5JbmZvI1VTRVNfUE9MSUNZX0xJTUlUX1BBU1NXT1JEfSB0byBiZSBhYmxlIHRvIGNhbGwKKyAgICAgKiB0aGlzIG1ldGhvZDsgaWYgaXQgaGFzIG5vdCwgYSBzZWN1cml0eSBleGNlcHRpb24gd2lsbCBiZSB0aHJvd24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gYWRtaW4gV2hpY2gge0BsaW5rIERldmljZUFkbWluUmVjZWl2ZXJ9IHRoaXMgcmVxdWVzdCBpcyBhc3NvY2lhdGVkCisgICAgICogICAgICAgICAgICB3aXRoLgorICAgICAqIEBwYXJhbSBsZW5ndGggVGhlIG5ldyBkZXNpcmVkIG1pbmltdW0gbnVtYmVyIG9mIGxldHRlcnMgcmVxdWlyZWQgaW4gdGhlCisgICAgICogICAgICAgICAgICBwYXNzd29yZC4gQSB2YWx1ZSBvZiAwIG1lYW5zIHRoZXJlIGlzIG5vIHJlc3RyaWN0aW9uLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFBhc3N3b3JkTWluaW11bUxldHRlcnMoQ29tcG9uZW50TmFtZSBhZG1pbiwgaW50IGxlbmd0aCkgeworICAgICAgICBpZiAobVNlcnZpY2UgIT0gbnVsbCkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBtU2VydmljZS5zZXRQYXNzd29yZE1pbmltdW1MZXR0ZXJzKGFkbWluLCBsZW5ndGgpOworICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJGYWlsZWQgdGFsa2luZyB3aXRoIGRldmljZSBwb2xpY3kgc2VydmljZSIsIGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0cmlldmUgdGhlIGN1cnJlbnQgbnVtYmVyIG9mIGxldHRlcnMgcmVxdWlyZWQgaW4gdGhlIHBhc3N3b3JkIGZvciBhbGwKKyAgICAgKiBhZG1pbnMgb3IgYSBwYXJ0aWN1bGFyIG9uZS4gVGhpcyBpcyB0aGUgc2FtZSB2YWx1ZSBhcworICAgICAqIHNldCBieSB7I2xpbmsge0BsaW5rICNzZXRQYXNzd29yZE1pbmltdW1MZXR0ZXJzKENvbXBvbmVudE5hbWUsIGludCl9CisgICAgICogYW5kIG9ubHkgYXBwbGllcyB3aGVuIHRoZSBwYXNzd29yZCBxdWFsaXR5IGlzCisgICAgICoge0BsaW5rICNQQVNTV09SRF9RVUFMSVRZX0NPTVBMRVh9LgorICAgICAqCisgICAgICogQHBhcmFtIGFkbWluIFRoZSBuYW1lIG9mIHRoZSBhZG1pbiBjb21wb25lbnQgdG8gY2hlY2ssIG9yIG51bGwgdG8KKyAgICAgKiAgICAgICAgICAgIGFnZ3JlZ2F0ZSBhbGwgYWRtaW5zLgorICAgICAqIEByZXR1cm4gVGhlIG1pbmltdW0gbnVtYmVyIG9mIGxldHRlcnMgcmVxdWlyZWQgaW4gdGhlIHBhc3N3b3JkLgorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0UGFzc3dvcmRNaW5pbXVtTGV0dGVycyhDb21wb25lbnROYW1lIGFkbWluKSB7CisgICAgICAgIGlmIChtU2VydmljZSAhPSBudWxsKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHJldHVybiBtU2VydmljZS5nZXRQYXNzd29yZE1pbmltdW1MZXR0ZXJzKGFkbWluKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiRmFpbGVkIHRhbGtpbmcgd2l0aCBkZXZpY2UgcG9saWN5IHNlcnZpY2UiLCBlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDYWxsZWQgYnkgYW4gYXBwbGljYXRpb24gdGhhdCBpcyBhZG1pbmlzdGVyaW5nIHRoZSBkZXZpY2UgdG8gc2V0IHRoZQorICAgICAqIG1pbmltdW0gbnVtYmVyIG9mIG51bWVyaWNhbCBkaWdpdHMgcmVxdWlyZWQgaW4gdGhlIHBhc3N3b3JkLiBBZnRlcgorICAgICAqIHNldHRpbmcgdGhpcywgdGhlIHVzZXIgd2lsbCBub3QgYmUgYWJsZSB0byBlbnRlciBhIG5ldyBwYXNzd29yZCB0aGF0IGlzCisgICAgICogbm90IGF0IGxlYXN0IGFzIHJlc3RyaWN0aXZlIGFzIHdoYXQgaGFzIGJlZW4gc2V0LiBOb3RlIHRoYXQgdGhlIGN1cnJlbnQKKyAgICAgKiBwYXNzd29yZCB3aWxsIHJlbWFpbiB1bnRpbCB0aGUgdXNlciBoYXMgc2V0IGEgbmV3IG9uZSwgc28gdGhlIGNoYW5nZSBkb2VzCisgICAgICogbm90IHRha2UgcGxhY2UgaW1tZWRpYXRlbHkuIFRvIHByb21wdCB0aGUgdXNlciBmb3IgYSBuZXcgcGFzc3dvcmQsIHVzZQorICAgICAqIHtAbGluayAjQUNUSU9OX1NFVF9ORVdfUEFTU1dPUkR9IGFmdGVyIHNldHRpbmcgdGhpcyB2YWx1ZS4gVGhpcworICAgICAqIGNvbnN0cmFpbnQgaXMgb25seSBpbXBvc2VkIGlmIHRoZSBhZG1pbmlzdHJhdG9yIGhhcyBhbHNvIHJlcXVlc3RlZAorICAgICAqIHtAbGluayAjUEFTU1dPUkRfUVVBTElUWV9DT01QTEVYfSB3aXRoIHtAbGluayAjc2V0UGFzc3dvcmRRdWFsaXR5fS4gVGhlCisgICAgICogZGVmYXVsdCB2YWx1ZSBpcyAxLgorICAgICAqIDxwPgorICAgICAqIFRoZSBjYWxsaW5nIGRldmljZSBhZG1pbiBtdXN0IGhhdmUgcmVxdWVzdGVkCisgICAgICoge0BsaW5rIERldmljZUFkbWluSW5mbyNVU0VTX1BPTElDWV9MSU1JVF9QQVNTV09SRH0gdG8gYmUgYWJsZSB0byBjYWxsCisgICAgICogdGhpcyBtZXRob2Q7IGlmIGl0IGhhcyBub3QsIGEgc2VjdXJpdHkgZXhjZXB0aW9uIHdpbGwgYmUgdGhyb3duLgorICAgICAqCisgICAgICogQHBhcmFtIGFkbWluIFdoaWNoIHtAbGluayBEZXZpY2VBZG1pblJlY2VpdmVyfSB0aGlzIHJlcXVlc3QgaXMgYXNzb2NpYXRlZAorICAgICAqICAgICAgICAgICAgd2l0aC4KKyAgICAgKiBAcGFyYW0gbGVuZ3RoIFRoZSBuZXcgZGVzaXJlZCBtaW5pbXVtIG51bWJlciBvZiBudW1lcmljYWwgZGlnaXRzIHJlcXVpcmVkCisgICAgICogICAgICAgICAgICBpbiB0aGUgcGFzc3dvcmQuIEEgdmFsdWUgb2YgMCBtZWFucyB0aGVyZSBpcyBubyByZXN0cmljdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRQYXNzd29yZE1pbmltdW1OdW1lcmljKENvbXBvbmVudE5hbWUgYWRtaW4sIGludCBsZW5ndGgpIHsKKyAgICAgICAgaWYgKG1TZXJ2aWNlICE9IG51bGwpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgbVNlcnZpY2Uuc2V0UGFzc3dvcmRNaW5pbXVtTnVtZXJpYyhhZG1pbiwgbGVuZ3RoKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiRmFpbGVkIHRhbGtpbmcgd2l0aCBkZXZpY2UgcG9saWN5IHNlcnZpY2UiLCBlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHJpZXZlIHRoZSBjdXJyZW50IG51bWJlciBvZiBudW1lcmljYWwgZGlnaXRzIHJlcXVpcmVkIGluIHRoZSBwYXNzd29yZAorICAgICAqIGZvciBhbGwgYWRtaW5zIG9yIGEgcGFydGljdWxhciBvbmUuIFRoaXMgaXMgdGhlIHNhbWUgdmFsdWUgYXMKKyAgICAgKiBzZXQgYnkgeyNsaW5rIHtAbGluayAjc2V0UGFzc3dvcmRNaW5pbXVtTnVtZXJpYyhDb21wb25lbnROYW1lLCBpbnQpfQorICAgICAqIGFuZCBvbmx5IGFwcGxpZXMgd2hlbiB0aGUgcGFzc3dvcmQgcXVhbGl0eSBpcworICAgICAqIHtAbGluayAjUEFTU1dPUkRfUVVBTElUWV9DT01QTEVYfS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBhZG1pbiBUaGUgbmFtZSBvZiB0aGUgYWRtaW4gY29tcG9uZW50IHRvIGNoZWNrLCBvciBudWxsIHRvCisgICAgICogICAgICAgICAgICBhZ2dyZWdhdGUgYWxsIGFkbWlucy4KKyAgICAgKiBAcmV0dXJuIFRoZSBtaW5pbXVtIG51bWJlciBvZiBudW1lcmljYWwgZGlnaXRzIHJlcXVpcmVkIGluIHRoZSBwYXNzd29yZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldFBhc3N3b3JkTWluaW11bU51bWVyaWMoQ29tcG9uZW50TmFtZSBhZG1pbikgeworICAgICAgICBpZiAobVNlcnZpY2UgIT0gbnVsbCkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbVNlcnZpY2UuZ2V0UGFzc3dvcmRNaW5pbXVtTnVtZXJpYyhhZG1pbik7CisgICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIExvZy53KFRBRywgIkZhaWxlZCB0YWxraW5nIHdpdGggZGV2aWNlIHBvbGljeSBzZXJ2aWNlIiwgZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2FsbGVkIGJ5IGFuIGFwcGxpY2F0aW9uIHRoYXQgaXMgYWRtaW5pc3RlcmluZyB0aGUgZGV2aWNlIHRvIHNldCB0aGUKKyAgICAgKiBtaW5pbXVtIG51bWJlciBvZiBzeW1ib2xzIHJlcXVpcmVkIGluIHRoZSBwYXNzd29yZC4gQWZ0ZXIgc2V0dGluZyB0aGlzLAorICAgICAqIHRoZSB1c2VyIHdpbGwgbm90IGJlIGFibGUgdG8gZW50ZXIgYSBuZXcgcGFzc3dvcmQgdGhhdCBpcyBub3QgYXQgbGVhc3QgYXMKKyAgICAgKiByZXN0cmljdGl2ZSBhcyB3aGF0IGhhcyBiZWVuIHNldC4gTm90ZSB0aGF0IHRoZSBjdXJyZW50IHBhc3N3b3JkIHdpbGwKKyAgICAgKiByZW1haW4gdW50aWwgdGhlIHVzZXIgaGFzIHNldCBhIG5ldyBvbmUsIHNvIHRoZSBjaGFuZ2UgZG9lcyBub3QgdGFrZQorICAgICAqIHBsYWNlIGltbWVkaWF0ZWx5LiBUbyBwcm9tcHQgdGhlIHVzZXIgZm9yIGEgbmV3IHBhc3N3b3JkLCB1c2UKKyAgICAgKiB7QGxpbmsgI0FDVElPTl9TRVRfTkVXX1BBU1NXT1JEfSBhZnRlciBzZXR0aW5nIHRoaXMgdmFsdWUuIFRoaXMKKyAgICAgKiBjb25zdHJhaW50IGlzIG9ubHkgaW1wb3NlZCBpZiB0aGUgYWRtaW5pc3RyYXRvciBoYXMgYWxzbyByZXF1ZXN0ZWQKKyAgICAgKiB7QGxpbmsgI1BBU1NXT1JEX1FVQUxJVFlfQ09NUExFWH0gd2l0aCB7QGxpbmsgI3NldFBhc3N3b3JkUXVhbGl0eX0uIFRoZQorICAgICAqIGRlZmF1bHQgdmFsdWUgaXMgMS4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGUgY2FsbGluZyBkZXZpY2UgYWRtaW4gbXVzdCBoYXZlIHJlcXVlc3RlZAorICAgICAqIHtAbGluayBEZXZpY2VBZG1pbkluZm8jVVNFU19QT0xJQ1lfTElNSVRfUEFTU1dPUkR9IHRvIGJlIGFibGUgdG8gY2FsbAorICAgICAqIHRoaXMgbWV0aG9kOyBpZiBpdCBoYXMgbm90LCBhIHNlY3VyaXR5IGV4Y2VwdGlvbiB3aWxsIGJlIHRocm93bi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBhZG1pbiBXaGljaCB7QGxpbmsgRGV2aWNlQWRtaW5SZWNlaXZlcn0gdGhpcyByZXF1ZXN0IGlzIGFzc29jaWF0ZWQKKyAgICAgKiAgICAgICAgICAgIHdpdGguCisgICAgICogQHBhcmFtIGxlbmd0aCBUaGUgbmV3IGRlc2lyZWQgbWluaW11bSBudW1iZXIgb2Ygc3ltYm9scyByZXF1aXJlZCBpbiB0aGUKKyAgICAgKiAgICAgICAgICAgIHBhc3N3b3JkLiBBIHZhbHVlIG9mIDAgbWVhbnMgdGhlcmUgaXMgbm8gcmVzdHJpY3Rpb24uCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UGFzc3dvcmRNaW5pbXVtU3ltYm9scyhDb21wb25lbnROYW1lIGFkbWluLCBpbnQgbGVuZ3RoKSB7CisgICAgICAgIGlmIChtU2VydmljZSAhPSBudWxsKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIG1TZXJ2aWNlLnNldFBhc3N3b3JkTWluaW11bVN5bWJvbHMoYWRtaW4sIGxlbmd0aCk7CisgICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIExvZy53KFRBRywgIkZhaWxlZCB0YWxraW5nIHdpdGggZGV2aWNlIHBvbGljeSBzZXJ2aWNlIiwgZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXRyaWV2ZSB0aGUgY3VycmVudCBudW1iZXIgb2Ygc3ltYm9scyByZXF1aXJlZCBpbiB0aGUgcGFzc3dvcmQgZm9yIGFsbAorICAgICAqIGFkbWlucyBvciBhIHBhcnRpY3VsYXIgb25lLiBUaGlzIGlzIHRoZSBzYW1lIHZhbHVlIGFzCisgICAgICogc2V0IGJ5IHsjbGluayB7QGxpbmsgI3NldFBhc3N3b3JkTWluaW11bVN5bWJvbHMoQ29tcG9uZW50TmFtZSwgaW50KX0KKyAgICAgKiBhbmQgb25seSBhcHBsaWVzIHdoZW4gdGhlIHBhc3N3b3JkIHF1YWxpdHkgaXMKKyAgICAgKiB7QGxpbmsgI1BBU1NXT1JEX1FVQUxJVFlfQ09NUExFWH0uCisgICAgICoKKyAgICAgKiBAcGFyYW0gYWRtaW4gVGhlIG5hbWUgb2YgdGhlIGFkbWluIGNvbXBvbmVudCB0byBjaGVjaywgb3IgbnVsbCB0bworICAgICAqICAgICAgICAgICAgYWdncmVnYXRlIGFsbCBhZG1pbnMuCisgICAgICogQHJldHVybiBUaGUgbWluaW11bSBudW1iZXIgb2Ygc3ltYm9scyByZXF1aXJlZCBpbiB0aGUgcGFzc3dvcmQuCisgICAgICovCisgICAgcHVibGljIGludCBnZXRQYXNzd29yZE1pbmltdW1TeW1ib2xzKENvbXBvbmVudE5hbWUgYWRtaW4pIHsKKyAgICAgICAgaWYgKG1TZXJ2aWNlICE9IG51bGwpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG1TZXJ2aWNlLmdldFBhc3N3b3JkTWluaW11bVN5bWJvbHMoYWRtaW4pOworICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJGYWlsZWQgdGFsa2luZyB3aXRoIGRldmljZSBwb2xpY3kgc2VydmljZSIsIGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIC8qKgorICAgICAqIENhbGxlZCBieSBhbiBhcHBsaWNhdGlvbiB0aGF0IGlzIGFkbWluaXN0ZXJpbmcgdGhlIGRldmljZSB0byBzZXQgdGhlCisgICAgICogbWluaW11bSBudW1iZXIgb2Ygbm9uLWxldHRlciBjaGFyYWN0ZXJzIChudW1lcmljYWwgZGlnaXRzIG9yIHN5bWJvbHMpCisgICAgICogcmVxdWlyZWQgaW4gdGhlIHBhc3N3b3JkLiBBZnRlciBzZXR0aW5nIHRoaXMsIHRoZSB1c2VyIHdpbGwgbm90IGJlIGFibGUKKyAgICAgKiB0byBlbnRlciBhIG5ldyBwYXNzd29yZCB0aGF0IGlzIG5vdCBhdCBsZWFzdCBhcyByZXN0cmljdGl2ZSBhcyB3aGF0IGhhcworICAgICAqIGJlZW4gc2V0LiBOb3RlIHRoYXQgdGhlIGN1cnJlbnQgcGFzc3dvcmQgd2lsbCByZW1haW4gdW50aWwgdGhlIHVzZXIgaGFzCisgICAgICogc2V0IGEgbmV3IG9uZSwgc28gdGhlIGNoYW5nZSBkb2VzIG5vdCB0YWtlIHBsYWNlIGltbWVkaWF0ZWx5LiBUbyBwcm9tcHQKKyAgICAgKiB0aGUgdXNlciBmb3IgYSBuZXcgcGFzc3dvcmQsIHVzZSB7QGxpbmsgI0FDVElPTl9TRVRfTkVXX1BBU1NXT1JEfSBhZnRlcgorICAgICAqIHNldHRpbmcgdGhpcyB2YWx1ZS4gVGhpcyBjb25zdHJhaW50IGlzIG9ubHkgaW1wb3NlZCBpZiB0aGUgYWRtaW5pc3RyYXRvcgorICAgICAqIGhhcyBhbHNvIHJlcXVlc3RlZCB7QGxpbmsgI1BBU1NXT1JEX1FVQUxJVFlfQ09NUExFWH0gd2l0aAorICAgICAqIHtAbGluayAjc2V0UGFzc3dvcmRRdWFsaXR5fS4gVGhlIGRlZmF1bHQgdmFsdWUgaXMgMC4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGUgY2FsbGluZyBkZXZpY2UgYWRtaW4gbXVzdCBoYXZlIHJlcXVlc3RlZAorICAgICAqIHtAbGluayBEZXZpY2VBZG1pbkluZm8jVVNFU19QT0xJQ1lfTElNSVRfUEFTU1dPUkR9IHRvIGJlIGFibGUgdG8gY2FsbAorICAgICAqIHRoaXMgbWV0aG9kOyBpZiBpdCBoYXMgbm90LCBhIHNlY3VyaXR5IGV4Y2VwdGlvbiB3aWxsIGJlIHRocm93bi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBhZG1pbiBXaGljaCB7QGxpbmsgRGV2aWNlQWRtaW5SZWNlaXZlcn0gdGhpcyByZXF1ZXN0IGlzIGFzc29jaWF0ZWQKKyAgICAgKiAgICAgICAgICAgIHdpdGguCisgICAgICogQHBhcmFtIGxlbmd0aCBUaGUgbmV3IGRlc2lyZWQgbWluaW11bSBudW1iZXIgb2YgbGV0dGVycyByZXF1aXJlZCBpbiB0aGUKKyAgICAgKiAgICAgICAgICAgIHBhc3N3b3JkLiBBIHZhbHVlIG9mIDAgbWVhbnMgdGhlcmUgaXMgbm8gcmVzdHJpY3Rpb24uCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UGFzc3dvcmRNaW5pbXVtTm9uTGV0dGVyKENvbXBvbmVudE5hbWUgYWRtaW4sIGludCBsZW5ndGgpIHsKKyAgICAgICAgaWYgKG1TZXJ2aWNlICE9IG51bGwpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgbVNlcnZpY2Uuc2V0UGFzc3dvcmRNaW5pbXVtTm9uTGV0dGVyKGFkbWluLCBsZW5ndGgpOworICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJGYWlsZWQgdGFsa2luZyB3aXRoIGRldmljZSBwb2xpY3kgc2VydmljZSIsIGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0cmlldmUgdGhlIGN1cnJlbnQgbnVtYmVyIG9mIG5vbi1sZXR0ZXIgY2hhcmFjdGVycyByZXF1aXJlZCBpbiB0aGUKKyAgICAgKiBwYXNzd29yZCBmb3IgYWxsIGFkbWlucyBvciBhIHBhcnRpY3VsYXIgb25lLiBUaGlzIGlzIHRoZSBzYW1lIHZhbHVlIGFzCisgICAgICogc2V0IGJ5IHsjbGluayB7QGxpbmsgI3NldFBhc3N3b3JkTWluaW11bU5vbkxldHRlcihDb21wb25lbnROYW1lLCBpbnQpfQorICAgICAqIGFuZCBvbmx5IGFwcGxpZXMgd2hlbiB0aGUgcGFzc3dvcmQgcXVhbGl0eSBpcworICAgICAqIHtAbGluayAjUEFTU1dPUkRfUVVBTElUWV9DT01QTEVYfS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBhZG1pbiBUaGUgbmFtZSBvZiB0aGUgYWRtaW4gY29tcG9uZW50IHRvIGNoZWNrLCBvciBudWxsIHRvCisgICAgICogICAgICAgICAgICBhZ2dyZWdhdGUgYWxsIGFkbWlucy4KKyAgICAgKiBAcmV0dXJuIFRoZSBtaW5pbXVtIG51bWJlciBvZiBsZXR0ZXJzIHJlcXVpcmVkIGluIHRoZSBwYXNzd29yZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldFBhc3N3b3JkTWluaW11bU5vbkxldHRlcihDb21wb25lbnROYW1lIGFkbWluKSB7CisgICAgICAgIGlmIChtU2VydmljZSAhPSBudWxsKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHJldHVybiBtU2VydmljZS5nZXRQYXNzd29yZE1pbmltdW1Ob25MZXR0ZXIoYWRtaW4pOworICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJGYWlsZWQgdGFsa2luZyB3aXRoIGRldmljZSBwb2xpY3kgc2VydmljZSIsIGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAvKioKKyAgICogQ2FsbGVkIGJ5IGFuIGFwcGxpY2F0aW9uIHRoYXQgaXMgYWRtaW5pc3RlcmluZyB0aGUgZGV2aWNlIHRvIHNldCB0aGUgbGVuZ3RoCisgICAqIG9mIHRoZSBwYXNzd29yZCBoaXN0b3J5LiBBZnRlciBzZXR0aW5nIHRoaXMsIHRoZSB1c2VyIHdpbGwgbm90IGJlIGFibGUgdG8KKyAgICogZW50ZXIgYSBuZXcgcGFzc3dvcmQgdGhhdCBpcyB0aGUgc2FtZSBhcyBhbnkgcGFzc3dvcmQgaW4gdGhlIGhpc3RvcnkuIE5vdGUKKyAgICogdGhhdCB0aGUgY3VycmVudCBwYXNzd29yZCB3aWxsIHJlbWFpbiB1bnRpbCB0aGUgdXNlciBoYXMgc2V0IGEgbmV3IG9uZSwgc28KKyAgICogdGhlIGNoYW5nZSBkb2VzIG5vdCB0YWtlIHBsYWNlIGltbWVkaWF0ZWx5LiBUbyBwcm9tcHQgdGhlIHVzZXIgZm9yIGEgbmV3CisgICAqIHBhc3N3b3JkLCB1c2Uge0BsaW5rICNBQ1RJT05fU0VUX05FV19QQVNTV09SRH0gYWZ0ZXIgc2V0dGluZyB0aGlzIHZhbHVlLgorICAgKiBUaGlzIGNvbnN0cmFpbnQgaXMgb25seSBpbXBvc2VkIGlmIHRoZSBhZG1pbmlzdHJhdG9yIGhhcyBhbHNvIHJlcXVlc3RlZAorICAgKiBlaXRoZXIge0BsaW5rICNQQVNTV09SRF9RVUFMSVRZX05VTUVSSUN9LAorICAgKiB7QGxpbmsgI1BBU1NXT1JEX1FVQUxJVFlfQUxQSEFCRVRJQ30sIG9yCisgICAqIHtAbGluayAjUEFTU1dPUkRfUVVBTElUWV9BTFBIQU5VTUVSSUN9IHdpdGgge0BsaW5rICNzZXRQYXNzd29yZFF1YWxpdHl9LgorICAgKgorICAgKiA8cD4KKyAgICogVGhlIGNhbGxpbmcgZGV2aWNlIGFkbWluIG11c3QgaGF2ZSByZXF1ZXN0ZWQKKyAgICoge0BsaW5rIERldmljZUFkbWluSW5mbyNVU0VTX1BPTElDWV9MSU1JVF9QQVNTV09SRH0gdG8gYmUgYWJsZSB0byBjYWxsIHRoaXMKKyAgICogbWV0aG9kOyBpZiBpdCBoYXMgbm90LCBhIHNlY3VyaXR5IGV4Y2VwdGlvbiB3aWxsIGJlIHRocm93bi4KKyAgICoKKyAgICogQHBhcmFtIGFkbWluIFdoaWNoIHtAbGluayBEZXZpY2VBZG1pblJlY2VpdmVyfSB0aGlzIHJlcXVlc3QgaXMgYXNzb2NpYXRlZAorICAgKiAgICAgICAgd2l0aC4KKyAgICogQHBhcmFtIGxlbmd0aCBUaGUgbmV3IGRlc2lyZWQgbGVuZ3RoIG9mIHBhc3N3b3JkIGhpc3RvcnkuIEEgdmFsdWUgb2YgMAorICAgKiAgICAgICAgbWVhbnMgdGhlcmUgaXMgbm8gcmVzdHJpY3Rpb24uCisgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFBhc3N3b3JkSGlzdG9yeUxlbmd0aChDb21wb25lbnROYW1lIGFkbWluLCBpbnQgbGVuZ3RoKSB7CisgICAgICAgIGlmIChtU2VydmljZSAhPSBudWxsKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIG1TZXJ2aWNlLnNldFBhc3N3b3JkSGlzdG9yeUxlbmd0aChhZG1pbiwgbGVuZ3RoKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiRmFpbGVkIHRhbGtpbmcgd2l0aCBkZXZpY2UgcG9saWN5IHNlcnZpY2UiLCBlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHJpZXZlIHRoZSBjdXJyZW50IHBhc3N3b3JkIGhpc3RvcnkgbGVuZ3RoIGZvciBhbGwgYWRtaW5zCisgICAgICogb3IgYSBwYXJ0aWN1bGFyIG9uZS4KKyAgICAgKiBAcGFyYW0gYWRtaW4gVGhlIG5hbWUgb2YgdGhlIGFkbWluIGNvbXBvbmVudCB0byBjaGVjaywgb3IgbnVsbCB0byBhZ2dyZWdhdGUKKyAgICAgKiBhbGwgYWRtaW5zLgorICAgICAqIEByZXR1cm4gVGhlIGxlbmd0aCBvZiB0aGUgcGFzc3dvcmQgaGlzdG9yeQorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0UGFzc3dvcmRIaXN0b3J5TGVuZ3RoKENvbXBvbmVudE5hbWUgYWRtaW4pIHsKKyAgICAgICAgaWYgKG1TZXJ2aWNlICE9IG51bGwpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG1TZXJ2aWNlLmdldFBhc3N3b3JkSGlzdG9yeUxlbmd0aChhZG1pbik7CisgICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIExvZy53KFRBRywgIkZhaWxlZCB0YWxraW5nIHdpdGggZGV2aWNlIHBvbGljeSBzZXJ2aWNlIiwgZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCiAgICAgLyoqCiAgICAgICogUmV0dXJuIHRoZSBtYXhpbXVtIHBhc3N3b3JkIGxlbmd0aCB0aGF0IHRoZSBkZXZpY2Ugc3VwcG9ydHMgZm9yIGEKICAgICAgKiBwYXJ0aWN1bGFyIHBhc3N3b3JkIHF1YWxpdHkuCkBAIC0zMjMsMTYgKzcwOCwxNiBAQAogICAgICAgICAvLyBLaW5kLW9mIGFyYml0cmFyeS4KICAgICAgICAgcmV0dXJuIDE2OwogICAgIH0KLSAgICAKKwogICAgIC8qKgogICAgICAqIERldGVybWluZSB3aGV0aGVyIHRoZSBjdXJyZW50IHBhc3N3b3JkIHRoZSB1c2VyIGhhcyBzZXQgaXMgc3VmZmljaWVudAogICAgICAqIHRvIG1lZXQgdGhlIHBvbGljeSByZXF1aXJlbWVudHMgKHF1YWxpdHksIG1pbmltdW0gbGVuZ3RoKSB0aGF0IGhhdmUgYmVlbgogICAgICAqIHJlcXVlc3RlZC4KLSAgICAgKiAKKyAgICAgKgogICAgICAqIDxwPlRoZSBjYWxsaW5nIGRldmljZSBhZG1pbiBtdXN0IGhhdmUgcmVxdWVzdGVkCiAgICAgICoge0BsaW5rIERldmljZUFkbWluSW5mbyNVU0VTX1BPTElDWV9MSU1JVF9QQVNTV09SRH0gdG8gYmUgYWJsZSB0byBjYWxsCiAgICAgICogdGhpcyBtZXRob2Q7IGlmIGl0IGhhcyBub3QsIGEgc2VjdXJpdHkgZXhjZXB0aW9uIHdpbGwgYmUgdGhyb3duLgotICAgICAqIAorICAgICAqCiAgICAgICogQHJldHVybiBSZXR1cm5zIHRydWUgaWYgdGhlIHBhc3N3b3JkIG1lZXRzIHRoZSBjdXJyZW50IHJlcXVpcmVtZW50cywKICAgICAgKiBlbHNlIGZhbHNlLgogICAgICAqLwpAQCAtMzQ2LDExICs3MzEsMTEgQEAKICAgICAgICAgfQogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQotICAgIAorCiAgICAgLyoqCiAgICAgICogUmV0cmlldmUgdGhlIG51bWJlciBvZiB0aW1lcyB0aGUgdXNlciBoYXMgZmFpbGVkIGF0IGVudGVyaW5nIGEKICAgICAgKiBwYXNzd29yZCBzaW5jZSB0aGF0IGxhc3Qgc3VjY2Vzc2Z1bCBwYXNzd29yZCBlbnRyeS4KLSAgICAgKiAKKyAgICAgKgogICAgICAqIDxwPlRoZSBjYWxsaW5nIGRldmljZSBhZG1pbiBtdXN0IGhhdmUgcmVxdWVzdGVkCiAgICAgICoge0BsaW5rIERldmljZUFkbWluSW5mbyNVU0VTX1BPTElDWV9XQVRDSF9MT0dJTn0gdG8gYmUgYWJsZSB0byBjYWxsCiAgICAgICogdGhpcyBtZXRob2Q7IGlmIGl0IGhhcyBub3QsIGEgc2VjdXJpdHkgZXhjZXB0aW9uIHdpbGwgYmUgdGhyb3duLgpAQCAtMzczLDE0ICs3NTgsMTQgQEAKICAgICAgKiB3YXRjaGluZyBmb3IgZmFpbGVkIHBhc3N3b3JkcyBhbmQgd2lwaW5nIHRoZSBkZXZpY2UsIGFuZCByZXF1aXJlcwogICAgICAqIHRoYXQgeW91IHJlcXVlc3QgYm90aCB7QGxpbmsgRGV2aWNlQWRtaW5JbmZvI1VTRVNfUE9MSUNZX1dBVENIX0xPR0lOfSBhbmQKICAgICAgKiB7QGxpbmsgRGV2aWNlQWRtaW5JbmZvI1VTRVNfUE9MSUNZX1dJUEVfREFUQX19LgotICAgICAqIAorICAgICAqCiAgICAgICogPHA+VG8gaW1wbGVtZW50IGFueSBvdGhlciBwb2xpY3kgKGUuZy4gd2lwaW5nIGRhdGEgZm9yIGEgcGFydGljdWxhcgogICAgICAqIGFwcGxpY2F0aW9uIG9ubHksIGVyYXNpbmcgb3IgcmV2b2tpbmcgY3JlZGVudGlhbHMsIG9yIHJlcG9ydGluZyB0aGUKICAgICAgKiBmYWlsdXJlIHRvIGEgc2VydmVyKSwgeW91IHNob3VsZCBpbXBsZW1lbnQKICAgICAgKiB7QGxpbmsgRGV2aWNlQWRtaW5SZWNlaXZlciNvblBhc3N3b3JkRmFpbGVkKENvbnRleHQsIGFuZHJvaWQuY29udGVudC5JbnRlbnQpfQogICAgICAqIGluc3RlYWQuICBEbyBub3QgdXNlIHRoaXMgQVBJLCBiZWNhdXNlIGlmIHRoZSBtYXhpbXVtIGNvdW50IGlzIHJlYWNoZWQsCiAgICAgICogdGhlIGRldmljZSB3aWxsIGJlIHdpcGVkIGltbWVkaWF0ZWx5LCBhbmQgeW91ciBjYWxsYmFjayB3aWxsIG5vdCBiZSBpbnZva2VkLgotICAgICAqIAorICAgICAqCiAgICAgICogQHBhcmFtIGFkbWluIFdoaWNoIHtAbGluayBEZXZpY2VBZG1pblJlY2VpdmVyfSB0aGlzIHJlcXVlc3QgaXMgYXNzb2NpYXRlZCB3aXRoLgogICAgICAqIEBwYXJhbSBudW0gVGhlIG51bWJlciBvZiBmYWlsZWQgcGFzc3dvcmQgYXR0ZW1wdHMgYXQgd2hpY2ggcG9pbnQgdGhlCiAgICAgICogZGV2aWNlIHdpbGwgd2lwZSBpdHMgZGF0YS4KQEAgLTM5NCw3ICs3NzksNyBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQotICAgIAorCiAgICAgLyoqCiAgICAgICogUmV0cmlldmUgdGhlIGN1cnJlbnQgbWF4aW11bSBudW1iZXIgb2YgbG9naW4gYXR0ZW1wdHMgdGhhdCBhcmUgYWxsb3dlZAogICAgICAqIGJlZm9yZSB0aGUgZGV2aWNlIHdpcGVzIGl0c2VsZiwgZm9yIGFsbCBhZG1pbnMKQEAgLTQxMiwxMyArNzk3LDEzIEBACiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIDA7CiAgICAgfQotICAgIAorCiAgICAgLyoqCiAgICAgICogRmxhZyBmb3Ige0BsaW5rICNyZXNldFBhc3N3b3JkfTogZG9uJ3QgYWxsb3cgb3RoZXIgYWRtaW5zIHRvIGNoYW5nZQogICAgICAqIHRoZSBwYXNzd29yZCBhZ2FpbiB1bnRpbCB0aGUgdXNlciBoYXMgZW50ZXJlZCBpdC4KICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSRVNFVF9QQVNTV09SRF9SRVFVSVJFX0VOVFJZID0gMHgwMDAxOwotICAgIAorCiAgICAgLyoqCiAgICAgICogRm9yY2UgYSBuZXcgZGV2aWNlIHVubG9jayBwYXNzd29yZCAodGhlIHBhc3N3b3JkIG5lZWRlZCB0byBhY2Nlc3MgdGhlCiAgICAgICogZW50aXJlIGRldmljZSwgbm90IGZvciBpbmRpdmlkdWFsIGFjY291bnRzKSBvbiB0aGUgdXNlci4gIFRoaXMgdGFrZXMKQEAgLTQzMSwxMSArODE2LDExIEBACiAgICAgICogdGhhdCB0aGUgcGFzc3dvcmQgbWF5IGJlIGEgc3Ryb25nZXIgcXVhbGl0eSAoY29udGFpbmluZyBhbHBoYW51bWVyaWMKICAgICAgKiBjaGFyYWN0ZXJzIHdoZW4gdGhlIHJlcXVlc3RlZCBxdWFsaXR5IGlzIG9ubHkgbnVtZXJpYyksIGluIHdoaWNoIGNhc2UKICAgICAgKiB0aGUgY3VycmVudGx5IGFjdGl2ZSBxdWFsaXR5IHdpbGwgYmUgaW5jcmVhc2VkIHRvIG1hdGNoLgotICAgICAqIAorICAgICAqCiAgICAgICogPHA+VGhlIGNhbGxpbmcgZGV2aWNlIGFkbWluIG11c3QgaGF2ZSByZXF1ZXN0ZWQKICAgICAgKiB7QGxpbmsgRGV2aWNlQWRtaW5JbmZvI1VTRVNfUE9MSUNZX1JFU0VUX1BBU1NXT1JEfSB0byBiZSBhYmxlIHRvIGNhbGwKICAgICAgKiB0aGlzIG1ldGhvZDsgaWYgaXQgaGFzIG5vdCwgYSBzZWN1cml0eSBleGNlcHRpb24gd2lsbCBiZSB0aHJvd24uCi0gICAgICogCisgICAgICoKICAgICAgKiBAcGFyYW0gcGFzc3dvcmQgVGhlIG5ldyBwYXNzd29yZCBmb3IgdGhlIHVzZXIuCiAgICAgICogQHBhcmFtIGZsYWdzIE1heSBiZSAwIG9yIHtAbGluayAjUkVTRVRfUEFTU1dPUkRfUkVRVUlSRV9FTlRSWX0uCiAgICAgICogQHJldHVybiBSZXR1cm5zIHRydWUgaWYgdGhlIHBhc3N3b3JkIHdhcyBhcHBsaWVkLCBvciBmYWxzZSBpZiBpdCBpcwpAQCAtNDUxLDE2ICs4MzYsMTYgQEAKICAgICAgICAgfQogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQotICAgIAorCiAgICAgLyoqCiAgICAgICogQ2FsbGVkIGJ5IGFuIGFwcGxpY2F0aW9uIHRoYXQgaXMgYWRtaW5pc3RlcmluZyB0aGUgZGV2aWNlIHRvIHNldCB0aGUKICAgICAgKiBtYXhpbXVtIHRpbWUgZm9yIHVzZXIgYWN0aXZpdHkgdW50aWwgdGhlIGRldmljZSB3aWxsIGxvY2suICBUaGlzIGxpbWl0cwogICAgICAqIHRoZSBsZW5ndGggdGhhdCB0aGUgdXNlciBjYW4gc2V0LiAgSXQgdGFrZXMgZWZmZWN0IGltbWVkaWF0ZWx5LgotICAgICAqIAorICAgICAqCiAgICAgICogPHA+VGhlIGNhbGxpbmcgZGV2aWNlIGFkbWluIG11c3QgaGF2ZSByZXF1ZXN0ZWQKICAgICAgKiB7QGxpbmsgRGV2aWNlQWRtaW5JbmZvI1VTRVNfUE9MSUNZX0ZPUkNFX0xPQ0t9IHRvIGJlIGFibGUgdG8gY2FsbAogICAgICAqIHRoaXMgbWV0aG9kOyBpZiBpdCBoYXMgbm90LCBhIHNlY3VyaXR5IGV4Y2VwdGlvbiB3aWxsIGJlIHRocm93bi4KLSAgICAgKiAKKyAgICAgKgogICAgICAqIEBwYXJhbSBhZG1pbiBXaGljaCB7QGxpbmsgRGV2aWNlQWRtaW5SZWNlaXZlcn0gdGhpcyByZXF1ZXN0IGlzIGFzc29jaWF0ZWQgd2l0aC4KICAgICAgKiBAcGFyYW0gdGltZU1zIFRoZSBuZXcgZGVzaXJlZCBtYXhpbXVtIHRpbWUgdG8gbG9jayBpbiBtaWxsaXNlY29uZHMuCiAgICAgICogQSB2YWx1ZSBvZiAwIG1lYW5zIHRoZXJlIGlzIG5vIHJlc3RyaWN0aW9uLgpAQCAtNDc0LDcgKzg1OSw3IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9Ci0gICAgCisKICAgICAvKioKICAgICAgKiBSZXRyaWV2ZSB0aGUgY3VycmVudCBtYXhpbXVtIHRpbWUgdG8gdW5sb2NrIGZvciBhbGwgYWRtaW5zCiAgICAgICogb3IgYSBwYXJ0aWN1bGFyIG9uZS4KQEAgLTQ5MSwxMSArODc2LDExIEBACiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIDA7CiAgICAgfQotICAgIAorCiAgICAgLyoqCiAgICAgICogTWFrZSB0aGUgZGV2aWNlIGxvY2sgaW1tZWRpYXRlbHksIGFzIGlmIHRoZSBsb2NrIHNjcmVlbiB0aW1lb3V0IGhhcwogICAgICAqIGV4cGlyZWQgYXQgdGhlIHBvaW50IG9mIHRoaXMgY2FsbC4KLSAgICAgKiAKKyAgICAgKgogICAgICAqIDxwPlRoZSBjYWxsaW5nIGRldmljZSBhZG1pbiBtdXN0IGhhdmUgcmVxdWVzdGVkCiAgICAgICoge0BsaW5rIERldmljZUFkbWluSW5mbyNVU0VTX1BPTElDWV9GT1JDRV9MT0NLfSB0byBiZSBhYmxlIHRvIGNhbGwKICAgICAgKiB0aGlzIG1ldGhvZDsgaWYgaXQgaGFzIG5vdCwgYSBzZWN1cml0eSBleGNlcHRpb24gd2lsbCBiZSB0aHJvd24uCkBAIC01MDksMTYgKzg5NCwxNiBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQotICAgIAorCiAgICAgLyoqCiAgICAgICogQXNrIHRoZSB1c2VyIGRhdGUgYmUgd2lwZWQuICBUaGlzIHdpbGwgY2F1c2UgdGhlIGRldmljZSB0byByZWJvb3QsCiAgICAgICogZXJhc2luZyBhbGwgdXNlciBkYXRhIHdoaWxlIG5leHQgYm9vdGluZyB1cC4gIEV4dGVybmFsIHN0b3JhZ2Ugc3VjaAogICAgICAqIGFzIFNEIGNhcmRzIHdpbGwgbm90IGJlIGVyYXNlZC4KLSAgICAgKiAKKyAgICAgKgogICAgICAqIDxwPlRoZSBjYWxsaW5nIGRldmljZSBhZG1pbiBtdXN0IGhhdmUgcmVxdWVzdGVkCiAgICAgICoge0BsaW5rIERldmljZUFkbWluSW5mbyNVU0VTX1BPTElDWV9XSVBFX0RBVEF9IHRvIGJlIGFibGUgdG8gY2FsbAogICAgICAqIHRoaXMgbWV0aG9kOyBpZiBpdCBoYXMgbm90LCBhIHNlY3VyaXR5IGV4Y2VwdGlvbiB3aWxsIGJlIHRocm93bi4KLSAgICAgKiAKKyAgICAgKgogICAgICAqIEBwYXJhbSBmbGFncyBCaXQgbWFzayBvZiBhZGRpdGlvbmFsIG9wdGlvbnM6IGN1cnJlbnRseSBtdXN0IGJlIDAuCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgd2lwZURhdGEoaW50IGZsYWdzKSB7CkBAIC01MzAsNyArOTE1LDkyIEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9Ci0gICAgCisKKyAgICAvKioKKyAgICAgKiBDYWxsZWQgYnkgYW4gYXBwbGljYXRpb24gdGhhdCBpcyBhZG1pbmlzdGVyaW5nIHRoZSBkZXZpY2UgdG8gc2V0IHRoZQorICAgICAqIGdsb2JhbCBwcm94eSBhbmQgZXhjbHVzaW9uIGxpc3QuCisgICAgICogPHA+CisgICAgICogVGhlIGNhbGxpbmcgZGV2aWNlIGFkbWluIG11c3QgaGF2ZSByZXF1ZXN0ZWQKKyAgICAgKiB7QGxpbmsgRGV2aWNlQWRtaW5JbmZvI1VTRVNfUE9MSUNZX1NFVFNfR0xPQkFMX1BST1hZfSB0byBiZSBhYmxlIHRvIGNhbGwKKyAgICAgKiB0aGlzIG1ldGhvZDsgaWYgaXQgaGFzIG5vdCwgYSBzZWN1cml0eSBleGNlcHRpb24gd2lsbCBiZSB0aHJvd24uCisgICAgICogT25seSB0aGUgZmlyc3QgZGV2aWNlIGFkbWluIGNhbiBzZXQgdGhlIHByb3h5LiBJZiBhIHNlY29uZCBhZG1pbiBhdHRlbXB0cworICAgICAqIHRvIHNldCB0aGUgcHJveHksIHRoZSB7QGxpbmsgQ29tcG9uZW50TmFtZX0gb2YgdGhlIGFkbWluIG9yaWdpbmFsbHkgc2V0dGluZyB0aGUKKyAgICAgKiBwcm94eSB3aWxsIGJlIHJldHVybmVkLiBJZiBzdWNjZXNzZnVsIGluIHNldHRpbmcgdGhlIHByb3h5LCBudWxsIHdpbGwKKyAgICAgKiBiZSByZXR1cm5lZC4KKyAgICAgKiBUaGUgbWV0aG9kIGNhbiBiZSBjYWxsZWQgcmVwZWF0ZWRseSBieSB0aGUgZGV2aWNlIGFkbWluIGFscmFkeSBzZXR0aW5nIHRoZQorICAgICAqIHByb3h5IHRvIHVwZGF0ZSB0aGUgcHJveHkgYW5kIGV4Y2x1c2lvbiBsaXN0LgorICAgICAqCisgICAgICogQHBhcmFtIGFkbWluIFdoaWNoIHtAbGluayBEZXZpY2VBZG1pblJlY2VpdmVyfSB0aGlzIHJlcXVlc3QgaXMgYXNzb2NpYXRlZAorICAgICAqICAgICAgICAgICAgd2l0aC4KKyAgICAgKiBAcGFyYW0gcHJveHlTcGVjIHRoZSBnbG9iYWwgcHJveHkgZGVzaXJlZC4gTXVzdCBiZSBhbiBIVFRQIFByb3h5LgorICAgICAqICAgICAgICAgICAgUGFzcyBQcm94eS5OT19QUk9YWSB0byByZXNldCB0aGUgcHJveHkuCisgICAgICogQHBhcmFtIGV4Y2x1c2lvbkxpc3QgYSBsaXN0IG9mIGRvbWFpbnMgdG8gYmUgZXhjbHVkZWQgZnJvbSB0aGUgZ2xvYmFsIHByb3h5LgorICAgICAqIEByZXR1cm4gcmV0dXJucyBudWxsIGlmIHRoZSBwcm94eSB3YXMgc3VjY2Vzc2Z1bGx5IHNldCwgb3IgYSB7QGxpbmsgQ29tcG9uZW50TmFtZX0KKyAgICAgKiAgICAgICAgICAgIG9mIHRoZSBkZXZpY2UgYWRtaW4gdGhhdCBzZXRzIHRoZXcgcHJveHkgb3RoZXJ3aXNlLgorICAgICAqLworICAgIHB1YmxpYyBDb21wb25lbnROYW1lIHNldEdsb2JhbFByb3h5KENvbXBvbmVudE5hbWUgYWRtaW4sIFByb3h5IHByb3h5U3BlYywKKyAgICAgICAgICAgIExpc3Q8U3RyaW5nPiBleGNsdXNpb25MaXN0ICkgeworICAgICAgICBpZiAocHJveHlTcGVjID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOworICAgICAgICB9CisgICAgICAgIGlmIChtU2VydmljZSAhPSBudWxsKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIFN0cmluZyBob3N0U3BlYzsKKyAgICAgICAgICAgICAgICBTdHJpbmcgZXhjbFNwZWM7CisgICAgICAgICAgICAgICAgaWYgKHByb3h5U3BlYy5lcXVhbHMoUHJveHkuTk9fUFJPWFkpKSB7CisgICAgICAgICAgICAgICAgICAgIGhvc3RTcGVjID0gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgZXhjbFNwZWMgPSBudWxsOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGlmICghcHJveHlTcGVjLnR5cGUoKS5lcXVhbHMoUHJveHkuVHlwZS5IVFRQKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIEluZXRTb2NrZXRBZGRyZXNzIHNhID0gKEluZXRTb2NrZXRBZGRyZXNzKXByb3h5U3BlYy5hZGRyZXNzKCk7CisgICAgICAgICAgICAgICAgICAgIFN0cmluZyBob3N0TmFtZSA9IHNhLmdldEhvc3ROYW1lKCk7CisgICAgICAgICAgICAgICAgICAgIGludCBwb3J0ID0gc2EuZ2V0UG9ydCgpOworICAgICAgICAgICAgICAgICAgICBTdHJpbmdCdWlsZGVyIGhvc3RCdWlsZGVyID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKyAgICAgICAgICAgICAgICAgICAgaG9zdFNwZWMgPSBob3N0QnVpbGRlci5hcHBlbmQoaG9zdE5hbWUpCisgICAgICAgICAgICAgICAgICAgICAgICAuYXBwZW5kKCI6IikuYXBwZW5kKEludGVnZXIudG9TdHJpbmcocG9ydCkpLnRvU3RyaW5nKCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChleGNsdXNpb25MaXN0ID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGV4Y2xTcGVjID0gIiI7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdCdWlsZGVyIGxpc3RCdWlsZGVyID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gZmlyc3REb21haW4gPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChTdHJpbmcgZXhjbERvbWFpbiA6IGV4Y2x1c2lvbkxpc3QpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWZpcnN0RG9tYWluKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpc3RCdWlsZGVyID0gbGlzdEJ1aWxkZXIuYXBwZW5kKCIsIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3REb21haW4gPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlzdEJ1aWxkZXIgPSBsaXN0QnVpbGRlci5hcHBlbmQoZXhjbERvbWFpbi50cmltKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZXhjbFNwZWMgPSBsaXN0QnVpbGRlci50b1N0cmluZygpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQubmV0LlByb3h5LnZhbGlkYXRlKGhvc3ROYW1lLCBJbnRlZ2VyLnRvU3RyaW5nKHBvcnQpLCBleGNsU3BlYyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBtU2VydmljZS5zZXRHbG9iYWxQcm94eShhZG1pbiwgaG9zdFNwZWMsIGV4Y2xTcGVjKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiRmFpbGVkIHRhbGtpbmcgd2l0aCBkZXZpY2UgcG9saWN5IHNlcnZpY2UiLCBlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBjb21wb25lbnQgbmFtZSBzZXR0aW5nIHRoZSBnbG9iYWwgcHJveHkuCisgICAgICogQHJldHVybiBDb21wb25lbnROYW1lIG9iamVjdCBvZiB0aGUgZGV2aWNlIGFkbWluIHRoYXQgc2V0IHRoZSBnbG9iYWwgcHJveHksIG9yCisgICAgICogICAgICAgICAgICBudWxsIGlmIG5vIGFkbWluIGhhcyBzZXQgdGhlIHByb3h5LgorICAgICAqLworICAgIHB1YmxpYyBDb21wb25lbnROYW1lIGdldEdsb2JhbFByb3h5QWRtaW4oKSB7CisgICAgICAgIGlmIChtU2VydmljZSAhPSBudWxsKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHJldHVybiBtU2VydmljZS5nZXRHbG9iYWxQcm94eUFkbWluKCk7CisgICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIExvZy53KFRBRywgIkZhaWxlZCB0YWxraW5nIHdpdGggZGV2aWNlIHBvbGljeSBzZXJ2aWNlIiwgZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCiAgICAgLyoqCiAgICAgICogQGhpZGUKICAgICAgKi8KQEAgLTU0Myw3ICsxMDEzLDcgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KLSAgICAKKwogICAgIC8qKgogICAgICAqIEBoaWRlCiAgICAgICovCkBAIC01NTYsMTAgKzEwMjYsMTAgQEAKICAgICAgICAgICAgIExvZy53KFRBRywgIlVuYWJsZSB0byByZXRyaWV2ZSBkZXZpY2UgcG9saWN5ICIgKyBjbiwgZSk7CiAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgfQotICAgICAgICAKKwogICAgICAgICBSZXNvbHZlSW5mbyByaSA9IG5ldyBSZXNvbHZlSW5mbygpOwogICAgICAgICByaS5hY3Rpdml0eUluZm8gPSBhaTsKLSAgICAgICAgCisKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIHJldHVybiBuZXcgRGV2aWNlQWRtaW5JbmZvKG1Db250ZXh0LCByaSk7CiAgICAgICAgIH0gY2F0Y2ggKFhtbFB1bGxQYXJzZXJFeGNlcHRpb24gZSkgewpAQCAtNTcwLDcgKzEwNDAsNyBAQAogICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgIH0KICAgICB9Ci0gICAgCisKICAgICAvKioKICAgICAgKiBAaGlkZQogICAgICAqLwpAQCAtNTg3LDE2ICsxMDU3LDE4IEBACiAgICAgLyoqCiAgICAgICogQGhpZGUKICAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRBY3RpdmVQYXNzd29yZFN0YXRlKGludCBxdWFsaXR5LCBpbnQgbGVuZ3RoKSB7CisgICAgcHVibGljIHZvaWQgc2V0QWN0aXZlUGFzc3dvcmRTdGF0ZShpbnQgcXVhbGl0eSwgaW50IGxlbmd0aCwgaW50IGxldHRlcnMsIGludCB1cHBlcmNhc2UsCisgICAgICAgICAgICBpbnQgbG93ZXJjYXNlLCBpbnQgbnVtYmVycywgaW50IHN5bWJvbHMsIGludCBub25sZXR0ZXIpIHsKICAgICAgICAgaWYgKG1TZXJ2aWNlICE9IG51bGwpIHsKICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgbVNlcnZpY2Uuc2V0QWN0aXZlUGFzc3dvcmRTdGF0ZShxdWFsaXR5LCBsZW5ndGgpOworICAgICAgICAgICAgICAgIG1TZXJ2aWNlLnNldEFjdGl2ZVBhc3N3b3JkU3RhdGUocXVhbGl0eSwgbGVuZ3RoLCBsZXR0ZXJzLCB1cHBlcmNhc2UsIGxvd2VyY2FzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG51bWJlcnMsIHN5bWJvbHMsIG5vbmxldHRlcik7CiAgICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgewogICAgICAgICAgICAgICAgIExvZy53KFRBRywgIkZhaWxlZCB0YWxraW5nIHdpdGggZGV2aWNlIHBvbGljeSBzZXJ2aWNlIiwgZSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9Ci0gICAgCisKICAgICAvKioKICAgICAgKiBAaGlkZQogICAgICAqLwpAQCAtNjA5LDcgKzEwODEsNyBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQotICAgIAorCiAgICAgLyoqCiAgICAgICogQGhpZGUKICAgICAgKi8KQEAgLTYyMiw0ICsxMDk0LDUgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KKwogfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvYXBwL2FkbWluL0lEZXZpY2VQb2xpY3lNYW5hZ2VyLmFpZGwgYi9jb3JlL2phdmEvYW5kcm9pZC9hcHAvYWRtaW4vSURldmljZVBvbGljeU1hbmFnZXIuYWlkbAppbmRleCA2ZmM0ZGM1Li4zZmNkNmZjIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9hcHAvYWRtaW4vSURldmljZVBvbGljeU1hbmFnZXIuYWlkbAorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9hcHAvYWRtaW4vSURldmljZVBvbGljeU1hbmFnZXIuYWlkbApAQCAtMjcsMTAgKzI3LDMxIEBACiBpbnRlcmZhY2UgSURldmljZVBvbGljeU1hbmFnZXIgewogICAgIHZvaWQgc2V0UGFzc3dvcmRRdWFsaXR5KGluIENvbXBvbmVudE5hbWUgd2hvLCBpbnQgcXVhbGl0eSk7CiAgICAgaW50IGdldFBhc3N3b3JkUXVhbGl0eShpbiBDb21wb25lbnROYW1lIHdobyk7Ci0gICAgCisKICAgICB2b2lkIHNldFBhc3N3b3JkTWluaW11bUxlbmd0aChpbiBDb21wb25lbnROYW1lIHdobywgaW50IGxlbmd0aCk7CiAgICAgaW50IGdldFBhc3N3b3JkTWluaW11bUxlbmd0aChpbiBDb21wb25lbnROYW1lIHdobyk7CisKKyAgICB2b2lkIHNldFBhc3N3b3JkTWluaW11bVVwcGVyQ2FzZShpbiBDb21wb25lbnROYW1lIHdobywgaW50IGxlbmd0aCk7CisgICAgaW50IGdldFBhc3N3b3JkTWluaW11bVVwcGVyQ2FzZShpbiBDb21wb25lbnROYW1lIHdobyk7CisKKyAgICB2b2lkIHNldFBhc3N3b3JkTWluaW11bUxvd2VyQ2FzZShpbiBDb21wb25lbnROYW1lIHdobywgaW50IGxlbmd0aCk7CisgICAgaW50IGdldFBhc3N3b3JkTWluaW11bUxvd2VyQ2FzZShpbiBDb21wb25lbnROYW1lIHdobyk7CisKKyAgICB2b2lkIHNldFBhc3N3b3JkTWluaW11bUxldHRlcnMoaW4gQ29tcG9uZW50TmFtZSB3aG8sIGludCBsZW5ndGgpOworICAgIGludCBnZXRQYXNzd29yZE1pbmltdW1MZXR0ZXJzKGluIENvbXBvbmVudE5hbWUgd2hvKTsKKworICAgIHZvaWQgc2V0UGFzc3dvcmRNaW5pbXVtTnVtZXJpYyhpbiBDb21wb25lbnROYW1lIHdobywgaW50IGxlbmd0aCk7CisgICAgaW50IGdldFBhc3N3b3JkTWluaW11bU51bWVyaWMoaW4gQ29tcG9uZW50TmFtZSB3aG8pOworCisgICAgdm9pZCBzZXRQYXNzd29yZE1pbmltdW1TeW1ib2xzKGluIENvbXBvbmVudE5hbWUgd2hvLCBpbnQgbGVuZ3RoKTsKKyAgICBpbnQgZ2V0UGFzc3dvcmRNaW5pbXVtU3ltYm9scyhpbiBDb21wb25lbnROYW1lIHdobyk7CisKKyAgICB2b2lkIHNldFBhc3N3b3JkTWluaW11bU5vbkxldHRlcihpbiBDb21wb25lbnROYW1lIHdobywgaW50IGxlbmd0aCk7CisgICAgaW50IGdldFBhc3N3b3JkTWluaW11bU5vbkxldHRlcihpbiBDb21wb25lbnROYW1lIHdobyk7CiAgICAgCisgICAgdm9pZCBzZXRQYXNzd29yZEhpc3RvcnlMZW5ndGgoaW4gQ29tcG9uZW50TmFtZSB3aG8sIGludCBsZW5ndGgpOworICAgIGludCBnZXRQYXNzd29yZEhpc3RvcnlMZW5ndGgoaW4gQ29tcG9uZW50TmFtZSB3aG8pOworCiAgICAgYm9vbGVhbiBpc0FjdGl2ZVBhc3N3b3JkU3VmZmljaWVudCgpOwogICAgIGludCBnZXRDdXJyZW50RmFpbGVkUGFzc3dvcmRBdHRlbXB0cygpOwogICAgIApAQCAtNDUsNiArNjYsOSBAQAogICAgIHZvaWQgbG9ja05vdygpOwogICAgIAogICAgIHZvaWQgd2lwZURhdGEoaW50IGZsYWdzKTsKKworICAgIENvbXBvbmVudE5hbWUgc2V0R2xvYmFsUHJveHkoaW4gQ29tcG9uZW50TmFtZSBhZG1pbiwgU3RyaW5nIHByb3h5U3BlYywgU3RyaW5nIGV4Y2x1c2lvbkxpc3QpOworICAgIENvbXBvbmVudE5hbWUgZ2V0R2xvYmFsUHJveHlBZG1pbigpOwogICAgIAogICAgIHZvaWQgc2V0QWN0aXZlQWRtaW4oaW4gQ29tcG9uZW50TmFtZSBwb2xpY3lSZWNlaXZlcik7CiAgICAgYm9vbGVhbiBpc0FkbWluQWN0aXZlKGluIENvbXBvbmVudE5hbWUgcG9saWN5UmVjZWl2ZXIpOwpAQCAtNTMsNyArNzcsOCBAQAogICAgIHZvaWQgZ2V0UmVtb3ZlV2FybmluZyhpbiBDb21wb25lbnROYW1lIHBvbGljeVJlY2VpdmVyLCBpbiBSZW1vdGVDYWxsYmFjayByZXN1bHQpOwogICAgIHZvaWQgcmVtb3ZlQWN0aXZlQWRtaW4oaW4gQ29tcG9uZW50TmFtZSBwb2xpY3lSZWNlaXZlcik7CiAgICAgCi0gICAgdm9pZCBzZXRBY3RpdmVQYXNzd29yZFN0YXRlKGludCBxdWFsaXR5LCBpbnQgbGVuZ3RoKTsKKyAgICB2b2lkIHNldEFjdGl2ZVBhc3N3b3JkU3RhdGUoaW50IHF1YWxpdHksIGludCBsZW5ndGgsIGludCBsZXR0ZXJzLCBpbnQgdXBwZXJjYXNlLCBpbnQgbG93ZXJjYXNlLAorICAgICAgICBpbnQgbnVtYmVycywgaW50IHN5bWJvbHMsIGludCBub25sZXR0ZXIpOwogICAgIHZvaWQgcmVwb3J0RmFpbGVkUGFzc3dvcmRBdHRlbXB0KCk7CiAgICAgdm9pZCByZXBvcnRTdWNjZXNzZnVsUGFzc3dvcmRBdHRlbXB0KCk7CiB9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9hcHB3aWRnZXQvQXBwV2lkZ2V0SG9zdC5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvYXBwd2lkZ2V0L0FwcFdpZGdldEhvc3QuamF2YQppbmRleCBiMmZjMTNmLi43NzMwOTQyIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9hcHB3aWRnZXQvQXBwV2lkZ2V0SG9zdC5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2FwcHdpZGdldC9BcHBXaWRnZXRIb3N0LmphdmEKQEAgLTM5LDYgKzM5LDcgQEAKIAogICAgIHN0YXRpYyBmaW5hbCBpbnQgSEFORExFX1VQREFURSA9IDE7CiAgICAgc3RhdGljIGZpbmFsIGludCBIQU5ETEVfUFJPVklERVJfQ0hBTkdFRCA9IDI7CisgICAgc3RhdGljIGZpbmFsIGludCBIQU5ETEVfVklFV19EQVRBX0NIQU5HRUQgPSAzOwogCiAgICAgZmluYWwgc3RhdGljIE9iamVjdCBzU2VydmljZUxvY2sgPSBuZXcgT2JqZWN0KCk7CiAgICAgc3RhdGljIElBcHBXaWRnZXRTZXJ2aWNlIHNTZXJ2aWNlOwpAQCAtNjAsNiArNjEsMTMgQEAKICAgICAgICAgICAgIG1zZy5vYmogPSBpbmZvOwogICAgICAgICAgICAgbXNnLnNlbmRUb1RhcmdldCgpOwogICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgdmlld0RhdGFDaGFuZ2VkKGludCBhcHBXaWRnZXRJZCwgaW50IHZpZXdJZCkgeworICAgICAgICAgICAgTWVzc2FnZSBtc2cgPSBtSGFuZGxlci5vYnRhaW5NZXNzYWdlKEhBTkRMRV9WSUVXX0RBVEFfQ0hBTkdFRCk7CisgICAgICAgICAgICBtc2cuYXJnMSA9IGFwcFdpZGdldElkOworICAgICAgICAgICAgbXNnLmFyZzIgPSB2aWV3SWQ7CisgICAgICAgICAgICBtc2cuc2VuZFRvVGFyZ2V0KCk7CisgICAgICAgIH0KICAgICB9CiAKICAgICBjbGFzcyBVcGRhdGVIYW5kbGVyIGV4dGVuZHMgSGFuZGxlciB7CkBAIC03Nyw2ICs4NSwxMCBAQAogICAgICAgICAgICAgICAgICAgICBvblByb3ZpZGVyQ2hhbmdlZChtc2cuYXJnMSwgKEFwcFdpZGdldFByb3ZpZGVySW5mbyltc2cub2JqKTsKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNhc2UgSEFORExFX1ZJRVdfREFUQV9DSEFOR0VEOiB7CisgICAgICAgICAgICAgICAgICAgIHZpZXdEYXRhQ2hhbmdlZChtc2cuYXJnMSwgbXNnLmFyZzIpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CkBAIC0yNTAsNiArMjYyLDE2IEBACiAgICAgICAgICAgICB2LnVwZGF0ZUFwcFdpZGdldCh2aWV3cyk7CiAgICAgICAgIH0KICAgICB9CisKKyAgICB2b2lkIHZpZXdEYXRhQ2hhbmdlZChpbnQgYXBwV2lkZ2V0SWQsIGludCB2aWV3SWQpIHsKKyAgICAgICAgQXBwV2lkZ2V0SG9zdFZpZXcgdjsKKyAgICAgICAgc3luY2hyb25pemVkIChtVmlld3MpIHsKKyAgICAgICAgICAgIHYgPSBtVmlld3MuZ2V0KGFwcFdpZGdldElkKTsKKyAgICAgICAgfQorICAgICAgICBpZiAodiAhPSBudWxsKSB7CisgICAgICAgICAgICB2LnZpZXdEYXRhQ2hhbmdlZCh2aWV3SWQpOworICAgICAgICB9CisgICAgfQogfQogCiAKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2FwcHdpZGdldC9BcHBXaWRnZXRIb3N0Vmlldy5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvYXBwd2lkZ2V0L0FwcFdpZGdldEhvc3RWaWV3LmphdmEKaW5kZXggYjMzYjA5Ny4uNGY4ZWU5MyAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvYXBwd2lkZ2V0L0FwcFdpZGdldEhvc3RWaWV3LmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvYXBwd2lkZ2V0L0FwcFdpZGdldEhvc3RWaWV3LmphdmEKQEAgLTIzLDE1ICsyMywxOCBAQAogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQ2FudmFzOwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQ29sb3I7CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5QYWludDsKLWltcG9ydCBhbmRyb2lkLm9zLlN5c3RlbUNsb2NrOwotaW1wb3J0IGFuZHJvaWQub3MuUGFyY2VsYWJsZTsKIGltcG9ydCBhbmRyb2lkLm9zLlBhcmNlbDsKK2ltcG9ydCBhbmRyb2lkLm9zLlBhcmNlbGFibGU7CitpbXBvcnQgYW5kcm9pZC5vcy5TeXN0ZW1DbG9jazsKIGltcG9ydCBhbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0OwogaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CiBpbXBvcnQgYW5kcm9pZC51dGlsLlNwYXJzZUFycmF5OwogaW1wb3J0IGFuZHJvaWQudmlldy5HcmF2aXR5OwogaW1wb3J0IGFuZHJvaWQudmlldy5MYXlvdXRJbmZsYXRlcjsKIGltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5BZGFwdGVyOworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkFkYXB0ZXJWaWV3OworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkJhc2VBZGFwdGVyOwogaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkZyYW1lTGF5b3V0OwogaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlJlbW90ZVZpZXdzOwogaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlRleHRWaWV3OwpAQCAtMjU4LDYgKzI2MSwyMiBAQAogICAgIH0KIAogICAgIC8qKgorICAgICAqIFByb2Nlc3MgZGF0YS1jaGFuZ2VkIG5vdGlmaWNhdGlvbnMgZm9yIHRoZSBzcGVjaWZpZWQgdmlldyBpbiB0aGUgc3BlY2lmaWVkCisgICAgICogc2V0IG9mIHtAbGluayBSZW1vdGVWaWV3c30gdmlld3MuCisgICAgICovCisgICAgdm9pZCB2aWV3RGF0YUNoYW5nZWQoaW50IHZpZXdJZCkgeworICAgICAgICBWaWV3IHYgPSBmaW5kVmlld0J5SWQodmlld0lkKTsKKyAgICAgICAgaWYgKCh2ICE9IG51bGwpICYmICh2IGluc3RhbmNlb2YgQWRhcHRlclZpZXc8Pz4pKSB7CisgICAgICAgICAgICBBZGFwdGVyVmlldzw/PiBhZGFwdGVyVmlldyA9IChBZGFwdGVyVmlldzw/PikgdjsKKyAgICAgICAgICAgIEFkYXB0ZXIgYWRhcHRlciA9IGFkYXB0ZXJWaWV3LmdldEFkYXB0ZXIoKTsKKyAgICAgICAgICAgIGlmIChhZGFwdGVyIGluc3RhbmNlb2YgQmFzZUFkYXB0ZXIpIHsKKyAgICAgICAgICAgICAgICBCYXNlQWRhcHRlciBiYXNlQWRhcHRlciA9IChCYXNlQWRhcHRlcikgYWRhcHRlcjsKKyAgICAgICAgICAgICAgICBiYXNlQWRhcHRlci5ub3RpZnlEYXRhU2V0Q2hhbmdlZCgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCiAgICAgICogQnVpbGQgYSB7QGxpbmsgQ29udGV4dH0gY2xvbmVkIGludG8gYW5vdGhlciBwYWNrYWdlIG5hbWUsIHVzdWFsbHkgZm9yIHRoZQogICAgICAqIHB1cnBvc2VzIG9mIHJlYWRpbmcgcmVtb3RlIHJlc291cmNlcy4KICAgICAgKi8KQEAgLTI3NSw2ICsyOTQsNyBAQAogICAgICAgICB9CiAgICAgfQogCisgICAgQE92ZXJyaWRlCiAgICAgcHJvdGVjdGVkIGJvb2xlYW4gZHJhd0NoaWxkKENhbnZhcyBjYW52YXMsIFZpZXcgY2hpbGQsIGxvbmcgZHJhd2luZ1RpbWUpIHsKICAgICAgICAgaWYgKENST1NTRkFERSkgewogICAgICAgICAgICAgaW50IGFscGhhOwpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvYXBwd2lkZ2V0L0FwcFdpZGdldE1hbmFnZXIuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2FwcHdpZGdldC9BcHBXaWRnZXRNYW5hZ2VyLmphdmEKaW5kZXggZDJhYjg1ZS4uMmE1ODNjMSAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvYXBwd2lkZ2V0L0FwcFdpZGdldE1hbmFnZXIuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9hcHB3aWRnZXQvQXBwV2lkZ2V0TWFuYWdlci5qYXZhCkBAIC0yMzMsNiArMjMzLDEwIEBACiAgICAgLyoqCiAgICAgICogU2V0IHRoZSBSZW1vdGVWaWV3cyB0byB1c2UgZm9yIHRoZSBzcGVjaWZpZWQgYXBwV2lkZ2V0SWRzLgogICAgICAqCisgICAgICogTm90ZSB0aGF0IHRoZSBSZW1vdGVWaWV3cyBwYXJhbWV0ZXIgd2lsbCBiZSBjYWNoZWQgYnkgdGhlIEFwcFdpZGdldFNlcnZpY2UsIGFuZCBoZW5jZSBzaG91bGQKKyAgICAgKiBjb250YWluIGEgY29tcGxldGUgcmVwcmVzZW50YXRpb24gb2YgdGhlIHdpZGdldC4gRm9yIHBlcmZvcm1pbmcgcGFydGlhbCB3aWRnZXQgdXBkYXRlcywgc2VlCisgICAgICoge0BsaW5rICNwYXJ0aWFsbHlVcGRhdGVBcHBXaWRnZXQoaW50W10sIFJlbW90ZVZpZXdzKX0uCisgICAgICoKICAgICAgKiA8cD4KICAgICAgKiBJdCBpcyBva2F5IHRvIGNhbGwgdGhpcyBtZXRob2QgYm90aCBpbnNpZGUgYW4ge0BsaW5rICNBQ1RJT05fQVBQV0lER0VUX1VQREFURX0gYnJvYWRjYXN0LAogICAgICAqIGFuZCBvdXRzaWRlIG9mIHRoZSBoYW5kbGVyLgpAQCAtMjUzLDYgKzI1NywxMCBAQAogICAgIC8qKgogICAgICAqIFNldCB0aGUgUmVtb3RlVmlld3MgdG8gdXNlIGZvciB0aGUgc3BlY2lmaWVkIGFwcFdpZGdldElkLgogICAgICAqCisgICAgICogTm90ZSB0aGF0IHRoZSBSZW1vdGVWaWV3cyBwYXJhbWV0ZXIgd2lsbCBiZSBjYWNoZWQgYnkgdGhlIEFwcFdpZGdldFNlcnZpY2UsIGFuZCBoZW5jZSBzaG91bGQKKyAgICAgKiBjb250YWluIGEgY29tcGxldGUgcmVwcmVzZW50YXRpb24gb2YgdGhlIHdpZGdldC4gRm9yIHBlcmZvcm1pbmcgcGFydGlhbCB3aWRnZXQgdXBkYXRlcywgc2VlCisgICAgICoge0BsaW5rICNwYXJ0aWFsbHlVcGRhdGVBcHBXaWRnZXQoaW50LCBSZW1vdGVWaWV3cyl9LgorICAgICAqCiAgICAgICogPHA+CiAgICAgICogSXQgaXMgb2theSB0byBjYWxsIHRoaXMgbWV0aG9kIGJvdGggaW5zaWRlIGFuIHtAbGluayAjQUNUSU9OX0FQUFdJREdFVF9VUERBVEV9IGJyb2FkY2FzdCwKICAgICAgKiBhbmQgb3V0c2lkZSBvZiB0aGUgaGFuZGxlci4KQEAgLTI2Niw2ICsyNzQsNTkgQEAKICAgICB9CiAKICAgICAvKioKKyAgICAgKiBQZXJmb3JtIGFuIGluY3JlbWVudGFsIHVwZGF0ZSBvciBjb21tYW5kIG9uIHRoZSB3aWRnZXQocykgc3BlY2lmaWVkIGJ5IGFwcFdpZGdldElkcy4KKyAgICAgKgorICAgICAqIFRoaXMgdXBkYXRlICBkaWZmZXJzIGZyb20ge0BsaW5rICN1cGRhdGVBcHBXaWRnZXQoaW50W10sIFJlbW90ZVZpZXdzKX0gaW4gdGhhdCB0aGUKKyAgICAgKiBSZW1vdGVWaWV3cyBvYmplY3Qgd2hpY2ggaXMgcGFzc2VkIGlzIHVuZGVyc3Rvb2QgdG8gYmUgYW4gaW5jb21wbGV0ZSByZXByZXNlbnRhdGlvbiBvZiB0aGUgCisgICAgICogd2lkZ2V0LCBhbmQgaGVuY2UgaXMgbm90IGNhY2hlZCBieSB0aGUgQXBwV2lkZ2V0U2VydmljZS4gTm90ZSB0aGF0IGJlY2F1c2UgdGhlc2UgdXBkYXRlcyBhcmUgCisgICAgICogbm90IGNhY2hlZCwgYW55IHN0YXRlIHRoYXQgdGhleSBtb2RpZnkgdGhhdCBpcyBub3QgcmVzdG9yZWQgYnkgcmVzdG9yZUluc3RhbmNlU3RhdGUgd2lsbCBub3QKKyAgICAgKiBwZXJzaXN0IGluIHRoZSBjYXNlIHRoYXQgdGhlIHdpZGdldHMgYXJlIHJlc3RvcmVkIHVzaW5nIHRoZSBjYWNoZWQgdmVyc2lvbiBpbgorICAgICAqIEFwcFdpZGdldFNlcnZpY2UuCisgICAgICoKKyAgICAgKiBVc2Ugd2l0aCB7QGxpbmsgUmVtb3RlVmlld3Mjc2hvd05leHQoaW50KX0sIHtAbGluayBSZW1vdGVWaWV3cyNzaG93UHJldmlvdXMoaW50KX0sCisgICAgICoge0BsaW5rIFJlbW90ZVZpZXdzI3NldFNjcm9sbFBvc2l0aW9uKGludCwgaW50KX0gYW5kIHNpbWlsYXIgY29tbWFuZHMuCisgICAgICoKKyAgICAgKiA8cD4KKyAgICAgKiBJdCBpcyBva2F5IHRvIGNhbGwgdGhpcyBtZXRob2QgYm90aCBpbnNpZGUgYW4ge0BsaW5rICNBQ1RJT05fQVBQV0lER0VUX1VQREFURX0gYnJvYWRjYXN0LAorICAgICAqIGFuZCBvdXRzaWRlIG9mIHRoZSBoYW5kbGVyLgorICAgICAqIFRoaXMgbWV0aG9kIHdpbGwgb25seSB3b3JrIHdoZW4gY2FsbGVkIGZyb20gdGhlIHVpZCB0aGF0IG93bnMgdGhlIEFwcFdpZGdldCBwcm92aWRlci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBhcHBXaWRnZXRJZHMgICAgIFRoZSBBcHBXaWRnZXQgaW5zdGFuY2VzIGZvciB3aGljaCB0byBzZXQgdGhlIFJlbW90ZVZpZXdzLgorICAgICAqIEBwYXJhbSB2aWV3cyAgICAgICAgICAgIFRoZSBSZW1vdGVWaWV3cyBvYmplY3QgY29udGFpbmluZyB0aGUgaW5jcmVtZW50YWwgdXBkYXRlIC8gY29tbWFuZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBwYXJ0aWFsbHlVcGRhdGVBcHBXaWRnZXQoaW50W10gYXBwV2lkZ2V0SWRzLCBSZW1vdGVWaWV3cyB2aWV3cykgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgc1NlcnZpY2UucGFydGlhbGx5VXBkYXRlQXBwV2lkZ2V0SWRzKGFwcFdpZGdldElkcywgdmlld3MpOworICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oInN5c3RlbSBzZXJ2ZXIgZGVhZD8iLCBlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFBlcmZvcm0gYW4gaW5jcmVtZW50YWwgdXBkYXRlIG9yIGNvbW1hbmQgb24gdGhlIHdpZGdldCBzcGVjaWZpZWQgYnkgYXBwV2lkZ2V0SWQuCisgICAgICoKKyAgICAgKiBUaGlzIHVwZGF0ZSAgZGlmZmVycyBmcm9tIHtAbGluayAjdXBkYXRlQXBwV2lkZ2V0KGludCwgUmVtb3RlVmlld3MpfSBpbiB0aGF0IHRoZSBSZW1vdGVWaWV3cworICAgICAqIG9iamVjdCB3aGljaCBpcyBwYXNzZWQgaXMgdW5kZXJzdG9vZCB0byBiZSBhbiBpbmNvbXBsZXRlIHJlcHJlc2VudGF0aW9uIG9mIHRoZSB3aWRnZXQsIGFuZAorICAgICAqIGhlbmNlIGlzIG5vdCBjYWNoZWQgYnkgdGhlIEFwcFdpZGdldFNlcnZpY2UuIE5vdGUgdGhhdCBiZWNhdXNlIHRoZXNlIHVwZGF0ZXMgYXJlIG5vdCBjYWNoZWQsCisgICAgICogYW55IHN0YXRlIHRoYXQgdGhleSBtb2RpZnkgdGhhdCBpcyBub3QgcmVzdG9yZWQgYnkgcmVzdG9yZUluc3RhbmNlU3RhdGUgd2lsbCBub3QgcGVyc2lzdCBpbgorICAgICAqIHRoZSBjYXNlIHRoYXQgdGhlIHdpZGdldHMgYXJlIHJlc3RvcmVkIHVzaW5nIHRoZSBjYWNoZWQgdmVyc2lvbiBpbiBBcHBXaWRnZXRTZXJ2aWNlLgorICAgICAqCisgICAgICogVXNlIHdpdGgge0BsaW5rIFJlbW90ZVZpZXdzI3Nob3dOZXh0KGludCl9LCB7QGxpbmsgUmVtb3RlVmlld3Mjc2hvd1ByZXZpb3VzKGludCl9LAorICAgICAqIHtAbGluayBSZW1vdGVWaWV3cyNzZXRTY3JvbGxQb3NpdGlvbihpbnQsIGludCl9IGFuZCBzaW1pbGFyIGNvbW1hbmRzLgorICAgICAqCisgICAgICogPHA+CisgICAgICogSXQgaXMgb2theSB0byBjYWxsIHRoaXMgbWV0aG9kIGJvdGggaW5zaWRlIGFuIHtAbGluayAjQUNUSU9OX0FQUFdJREdFVF9VUERBVEV9IGJyb2FkY2FzdCwKKyAgICAgKiBhbmQgb3V0c2lkZSBvZiB0aGUgaGFuZGxlci4KKyAgICAgKiBUaGlzIG1ldGhvZCB3aWxsIG9ubHkgd29yayB3aGVuIGNhbGxlZCBmcm9tIHRoZSB1aWQgdGhhdCBvd25zIHRoZSBBcHBXaWRnZXQgcHJvdmlkZXIuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYXBwV2lkZ2V0SWQgICAgICBUaGUgQXBwV2lkZ2V0IGluc3RhbmNlIGZvciB3aGljaCB0byBzZXQgdGhlIFJlbW90ZVZpZXdzLgorICAgICAqIEBwYXJhbSB2aWV3cyAgICAgICAgICAgIFRoZSBSZW1vdGVWaWV3cyBvYmplY3QgY29udGFpbmluZyB0aGUgaW5jcmVtZW50YWwgdXBkYXRlIC8gY29tbWFuZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBwYXJ0aWFsbHlVcGRhdGVBcHBXaWRnZXQoaW50IGFwcFdpZGdldElkLCBSZW1vdGVWaWV3cyB2aWV3cykgeworICAgICAgICBwYXJ0aWFsbHlVcGRhdGVBcHBXaWRnZXQobmV3IGludFtdIHsgYXBwV2lkZ2V0SWQgfSwgdmlld3MpOworICAgIH0KKworICAgIC8qKgogICAgICAqIFNldCB0aGUgUmVtb3RlVmlld3MgdG8gdXNlIGZvciBhbGwgQXBwV2lkZ2V0IGluc3RhbmNlcyBmb3IgdGhlIHN1cHBsaWVkIEFwcFdpZGdldCBwcm92aWRlci4KICAgICAgKgogICAgICAqIDxwPgpAQCAtMjg4LDExICszNDksNDYgQEAKICAgICB9CiAKICAgICAvKioKKyAgICAgKiBOb3RpZmllcyB0aGUgc3BlY2lmaWVkIGNvbGxlY3Rpb24gdmlldyBpbiBhbGwgdGhlIHNwZWNpZmllZCBBcHBXaWRnZXQgaW5zdGFuY2VzCisgICAgICogdG8gaW52YWxpZGF0ZSB0aGVpciBjdXJyZW50bHkgZGF0YS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBhcHBXaWRnZXRJZHMgIFRoZSBBcHBXaWRnZXQgaW5zdGFuY2VzIGZvciB3aGljaCB0byBub3RpZnkgb2YgdmlldyBkYXRhIGNoYW5nZXMuCisgICAgICogQHBhcmFtIHZpZXdJZCAgICAgICAgVGhlIGNvbGxlY3Rpb24gdmlldyBpZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBub3RpZnlBcHBXaWRnZXRWaWV3RGF0YUNoYW5nZWQoaW50W10gYXBwV2lkZ2V0SWRzLCBpbnQgdmlld0lkKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBzU2VydmljZS5ub3RpZnlBcHBXaWRnZXRWaWV3RGF0YUNoYW5nZWQoYXBwV2lkZ2V0SWRzLCB2aWV3SWQpOworICAgICAgICB9CisgICAgICAgIGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oInN5c3RlbSBzZXJ2ZXIgZGVhZD8iLCBlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIE5vdGlmaWVzIHRoZSBzcGVjaWZpZWQgY29sbGVjdGlvbiB2aWV3IGluIGFsbCB0aGUgc3BlY2lmaWVkIEFwcFdpZGdldCBpbnN0YW5jZQorICAgICAqIHRvIGludmFsaWRhdGUgaXQncyBjdXJyZW50bHkgZGF0YS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBhcHBXaWRnZXRJZCAgVGhlIEFwcFdpZGdldCBpbnN0YW5jZSBmb3Igd2hpY2ggdG8gbm90aWZ5IG9mIHZpZXcgZGF0YSBjaGFuZ2VzLgorICAgICAqIEBwYXJhbSB2aWV3SWQgICAgICAgIFRoZSBjb2xsZWN0aW9uIHZpZXcgaWQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgbm90aWZ5QXBwV2lkZ2V0Vmlld0RhdGFDaGFuZ2VkKGludCBhcHBXaWRnZXRJZCwgaW50IHZpZXdJZCkgeworICAgICAgICBub3RpZnlBcHBXaWRnZXRWaWV3RGF0YUNoYW5nZWQobmV3IGludFtdIHsgYXBwV2lkZ2V0SWQgfSwgdmlld0lkKTsKKyAgICB9CisKKyAgICAvKioKICAgICAgKiBSZXR1cm4gYSBsaXN0IG9mIHRoZSBBcHBXaWRnZXQgcHJvdmlkZXJzIHRoYXQgYXJlIGN1cnJlbnRseSBpbnN0YWxsZWQuCiAgICAgICovCiAgICAgcHVibGljIExpc3Q8QXBwV2lkZ2V0UHJvdmlkZXJJbmZvPiBnZXRJbnN0YWxsZWRQcm92aWRlcnMoKSB7CiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZXR1cm4gc1NlcnZpY2UuZ2V0SW5zdGFsbGVkUHJvdmlkZXJzKCk7CisgICAgICAgICAgICBMaXN0PEFwcFdpZGdldFByb3ZpZGVySW5mbz4gcHJvdmlkZXJzID0gc1NlcnZpY2UuZ2V0SW5zdGFsbGVkUHJvdmlkZXJzKCk7CisgICAgICAgICAgICBmb3IgKEFwcFdpZGdldFByb3ZpZGVySW5mbyBpbmZvIDogcHJvdmlkZXJzKSB7CisgICAgICAgICAgICAgICAgLy8gQ29udmVydGluZyBjb21wbGV4IHRvIGRwLgorICAgICAgICAgICAgICAgIGluZm8ubWluV2lkdGggPQorICAgICAgICAgICAgICAgICAgICAgICAgVHlwZWRWYWx1ZS5jb21wbGV4VG9EaW1lbnNpb25QaXhlbFNpemUoaW5mby5taW5XaWR0aCwgbURpc3BsYXlNZXRyaWNzKTsKKyAgICAgICAgICAgICAgICBpbmZvLm1pbkhlaWdodCA9CisgICAgICAgICAgICAgICAgICAgICAgICBUeXBlZFZhbHVlLmNvbXBsZXhUb0RpbWVuc2lvblBpeGVsU2l6ZShpbmZvLm1pbkhlaWdodCwgbURpc3BsYXlNZXRyaWNzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBwcm92aWRlcnM7CiAgICAgICAgIH0KICAgICAgICAgY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigic3lzdGVtIHNlcnZlciBkZWFkPyIsIGUpOwpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvYXBwd2lkZ2V0L0FwcFdpZGdldFByb3ZpZGVySW5mby5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvYXBwd2lkZ2V0L0FwcFdpZGdldFByb3ZpZGVySW5mby5qYXZhCmluZGV4IGNlZTI4NjUuLjM5NmU5MmQgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL2FwcHdpZGdldC9BcHBXaWRnZXRQcm92aWRlckluZm8uamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9hcHB3aWRnZXQvQXBwV2lkZ2V0UHJvdmlkZXJJbmZvLmphdmEKQEAgLTExMCw2ICsxMTAsMTcgQEAKICAgICAgKiBAaGlkZSBQZW5kaW5nIEFQSSBhcHByb3ZhbAogICAgICAqLwogICAgIHB1YmxpYyBTdHJpbmcgb2xkTmFtZTsKKyAgICAKKyAgICAvKioKKyAgICAgKiBBIHByZXZpZXcgb2Ygd2hhdCB0aGUgQXBwV2lkZ2V0IHdpbGwgbG9vayBsaWtlIGFmdGVyIGl0J3MgY29uZmlndXJlZC4KKyAgICAgKiBJZiBub3Qgc3VwcGxpZWQsIHRoZSBBcHBXaWRnZXQncyBpY29uIHdpbGwgYmUgdXNlZC4KKyAgICAgKgorICAgICAqIDxwPlRoaXMgZmllbGQgY29ycmVzcG9uZHMgdG8gdGhlIDxjb2RlPmFuZHJvaWQ6cHJldmlld0ltYWdlPC9jb2RlPiBhdHRyaWJ1dGUgaW4KKyAgICAgKiB0aGUgPGNvZGU+Jmx0O3JlY2VpdmVyJmd0OzwvY29kZT4gZWxlbWVudCBpbiB0aGUgQW5kcm9pZE1hbmlmZXN0LnhtbCBmaWxlLgorICAgICAqIAorICAgICAqIEBoaWRlIFBlbmRpbmcgQVBJIGFwcHJvdmFsCisgICAgICovCisJcHVibGljIGludCBwcmV2aWV3SW1hZ2U7CiAKICAgICBwdWJsaWMgQXBwV2lkZ2V0UHJvdmlkZXJJbmZvKCkgewogICAgIH0KQEAgLTEzMCw2ICsxNDEsNyBAQAogICAgICAgICB9CiAgICAgICAgIHRoaXMubGFiZWwgPSBpbi5yZWFkU3RyaW5nKCk7CiAgICAgICAgIHRoaXMuaWNvbiA9IGluLnJlYWRJbnQoKTsKKyAgICAgICAgdGhpcy5wcmV2aWV3SW1hZ2UgPSBpbi5yZWFkSW50KCk7CiAgICAgfQogCiAKQEAgLTE1Miw2ICsxNjQsNyBAQAogICAgICAgICB9CiAgICAgICAgIG91dC53cml0ZVN0cmluZyh0aGlzLmxhYmVsKTsKICAgICAgICAgb3V0LndyaXRlSW50KHRoaXMuaWNvbik7CisgICAgICAgIG91dC53cml0ZUludCh0aGlzLnByZXZpZXdJbWFnZSk7CiAgICAgfQogCiAgICAgcHVibGljIGludCBkZXNjcmliZUNvbnRlbnRzKCkgewpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvYmx1ZXRvb3RoL0JsdWV0b290aENsYXNzLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9ibHVldG9vdGgvQmx1ZXRvb3RoQ2xhc3MuamF2YQppbmRleCBjN2ZlYTllLi5jODM4MWM5IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9ibHVldG9vdGgvQmx1ZXRvb3RoQ2xhc3MuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9ibHVldG9vdGgvQmx1ZXRvb3RoQ2xhc3MuamF2YQpAQCAtMjU5LDYgKzI1OSwxMiBAQAogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST0ZJTEVfQTJEUCA9IDE7CiAgICAgLyoqIEBoaWRlICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPRklMRV9PUFAgPSAyOworICAgIC8qKiBAaGlkZSAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST0ZJTEVfSElEID0gMzsKKyAgICAvKiogQGhpZGUgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9GSUxFX1BBTlUgPSA0OworICAgIC8qKiBAaGlkZSAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST0ZJTEVfTkFQID0gNTsKIAogICAgIC8qKgogICAgICAqIENoZWNrIGNsYXNzIGJpdHMgZm9yIHBvc3NpYmxlIGJsdWV0b290aCBwcm9maWxlIHN1cHBvcnQuCkBAIC0zMjQsNiArMzMwLDE0IEBACiAgICAgICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKHByb2ZpbGUgPT0gUFJPRklMRV9ISUQpIHsKKyAgICAgICAgICAgIHJldHVybiAoZ2V0RGV2aWNlQ2xhc3MoKSAmIERldmljZS5NYWpvci5QRVJJUEhFUkFMKSA9PSBEZXZpY2UuTWFqb3IuUEVSSVBIRVJBTDsKKyAgICAgICAgfSBlbHNlIGlmIChwcm9maWxlID09IFBST0ZJTEVfUEFOVSB8fCBwcm9maWxlID09IFBST0ZJTEVfTkFQKXsKKyAgICAgICAgICAgIC8vIE5vIGdvb2Qgd2F5IHRvIGRpc3Rpbmd1aXNoIGJldHdlZW4gdGhlIHR3bywgYmFzZWQgb24gY2xhc3MgYml0cy4KKyAgICAgICAgICAgIGlmIChoYXNTZXJ2aWNlKFNlcnZpY2UuTkVUV09SS0lORykpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiAoZ2V0RGV2aWNlQ2xhc3MoKSAmIERldmljZS5NYWpvci5ORVRXT1JLSU5HKSA9PSBEZXZpY2UuTWFqb3IuTkVUV09SS0lORzsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvYmx1ZXRvb3RoL0JsdWV0b290aERldmljZVBpY2tlci5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvYmx1ZXRvb3RoL0JsdWV0b290aERldmljZVBpY2tlci5qYXZhCmluZGV4IDA1ZWVkMGUuLjc0MTU3MjEgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL2JsdWV0b290aC9CbHVldG9vdGhEZXZpY2VQaWNrZXIuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9ibHVldG9vdGgvQmx1ZXRvb3RoRGV2aWNlUGlja2VyLmphdmEKQEAgLTYzLDQgKzYzLDkgQEAKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGSUxURVJfVFlQRV9BVURJTyA9IDE7CiAgICAgLyoqIEFzayBkZXZpY2UgcGlja2VyIHRvIHNob3cgQlQgZGV2aWNlcyB0aGF0IHN1cHBvcnQgT2JqZWN0IFRyYW5zZmVyICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRklMVEVSX1RZUEVfVFJBTlNGRVIgPSAyOworICAgIC8qKiBBc2sgZGV2aWNlIHBpY2tlciB0byBzaG93IEJUIGRldmljZXMgdGhhdCBzdXBwb3J0CisgICAgICogUGVyc29uYWwgQXJlYSBOZXR3b3JraW5nIFVzZXIgKFBBTlUpIHByb2ZpbGUqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZJTFRFUl9UWVBFX1BBTlUgPSAzOworICAgIC8qKiBBc2sgZGV2aWNlIHBpY2tlciB0byBzaG93IEJUIGRldmljZXMgdGhhdCBzdXBwb3J0IE5ldHdvcmsgQWNjZXNzIFBvaW50IChOQVApIHByb2ZpbGUgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGSUxURVJfVFlQRV9OQVAgPSA0OwogfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvYmx1ZXRvb3RoL0JsdWV0b290aERldmljZVByb2ZpbGVTdGF0ZS5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvYmx1ZXRvb3RoL0JsdWV0b290aERldmljZVByb2ZpbGVTdGF0ZS5qYXZhCmluZGV4IDhlNjU1ZTIuLjFmZDcxNTEgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL2JsdWV0b290aC9CbHVldG9vdGhEZXZpY2VQcm9maWxlU3RhdGUuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9ibHVldG9vdGgvQmx1ZXRvb3RoRGV2aWNlUHJvZmlsZVN0YXRlLmphdmEKQEAgLTU4LDE5ICs1OCwyNCBAQAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiQmx1ZXRvb3RoRGV2aWNlUHJvZmlsZVN0YXRlIjsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIERCRyA9IHRydWU7IC8vU1RPUFNISVAgLSBDaGFuZ2UgdG8gZmFsc2UKIAorICAgIC8vIFRPRE8oKTogUmVzdHJ1Y3R1cmUgdGhlIHN0YXRlIG1hY2hpbmUgdG8gbWFrZSBpdCBzY2FsYWJsZSB3aXRoIHJlZ2FyZCB0byBwcm9maWxlcy4KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDT05ORUNUX0hGUF9PVVRHT0lORyA9IDE7CiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ09OTkVDVF9IRlBfSU5DT01JTkcgPSAyOwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENPTk5FQ1RfQTJEUF9PVVRHT0lORyA9IDM7CiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ09OTkVDVF9BMkRQX0lOQ09NSU5HID0gNDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDT05ORUNUX0hJRF9PVVRHT0lORyA9IDU7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ09OTkVDVF9ISURfSU5DT01JTkcgPSA2OwogCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRElTQ09OTkVDVF9IRlBfT1VUR09JTkcgPSA1OwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBESVNDT05ORUNUX0hGUF9JTkNPTUlORyA9IDY7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRElTQ09OTkVDVF9BMkRQX09VVEdPSU5HID0gNzsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBESVNDT05ORUNUX0EyRFBfSU5DT01JTkcgPSA4OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERJU0NPTk5FQ1RfSEZQX09VVEdPSU5HID0gNTA7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IERJU0NPTk5FQ1RfSEZQX0lOQ09NSU5HID0gNTE7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRElTQ09OTkVDVF9BMkRQX09VVEdPSU5HID0gNTI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRElTQ09OTkVDVF9BMkRQX0lOQ09NSU5HID0gNTM7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRElTQ09OTkVDVF9ISURfT1VUR09JTkcgPSA1NDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBESVNDT05ORUNUX0hJRF9JTkNPTUlORyA9IDU1OwogCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVU5QQUlSID0gOTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBVVRPX0NPTk5FQ1RfUFJPRklMRVMgPSAxMDsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUUkFOU0lUSU9OX1RPX1NUQUJMRSA9IDExOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFVOUEFJUiA9IDEwMDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBVVRPX0NPTk5FQ1RfUFJPRklMRVMgPSAxMDE7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVFJBTlNJVElPTl9UT19TVEFCTEUgPSAxMDI7CiAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQVVUT19DT05ORUNUX0RFTEFZID0gNjAwMDsgLy8gNiBzZWNzCiAKQEAgLTc5LDYgKzg0LDggQEAKICAgICBwcml2YXRlIEluY29taW5nSGFuZHNmcmVlIG1JbmNvbWluZ0hhbmRzZnJlZSA9IG5ldyBJbmNvbWluZ0hhbmRzZnJlZSgpOwogICAgIHByaXZhdGUgSW5jb21pbmdBMmRwIG1JbmNvbWluZ0EyZHAgPSBuZXcgSW5jb21pbmdBMmRwKCk7CiAgICAgcHJpdmF0ZSBPdXRnb2luZ0EyZHAgbU91dGdvaW5nQTJkcCA9IG5ldyBPdXRnb2luZ0EyZHAoKTsKKyAgICBwcml2YXRlIE91dGdvaW5nSGlkIG1PdXRnb2luZ0hpZCA9IG5ldyBPdXRnb2luZ0hpZCgpOworICAgIHByaXZhdGUgSW5jb21pbmdIaWQgbUluY29taW5nSGlkID0gbmV3IEluY29taW5nSGlkKCk7CiAKICAgICBwcml2YXRlIENvbnRleHQgbUNvbnRleHQ7CiAgICAgcHJpdmF0ZSBCbHVldG9vdGhTZXJ2aWNlIG1TZXJ2aWNlOwpAQCAtODksNiArOTYsNyBAQAogICAgIHByaXZhdGUgQmx1ZXRvb3RoRGV2aWNlIG1EZXZpY2U7CiAgICAgcHJpdmF0ZSBpbnQgbUhlYWRzZXRTdGF0ZTsKICAgICBwcml2YXRlIGludCBtQTJkcFN0YXRlOworICAgIHByaXZhdGUgaW50IG1IaWRTdGF0ZTsKIAogICAgIHByaXZhdGUgQnJvYWRjYXN0UmVjZWl2ZXIgbUJyb2FkY2FzdFJlY2VpdmVyID0gbmV3IEJyb2FkY2FzdFJlY2VpdmVyKCkgewogICAgICAgICBAT3ZlcnJpZGUKQEAgLTEyNSw2ICsxMzMsMTkgQEAKICAgICAgICAgICAgICAgICAgICAgbmV3U3RhdGUgPT0gQmx1ZXRvb3RoQTJkcC5TVEFURV9ESVNDT05ORUNURUQpIHsKICAgICAgICAgICAgICAgICAgICAgc2VuZE1lc3NhZ2UoVFJBTlNJVElPTl9UT19TVEFCTEUpOwogICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSBpZiAoYWN0aW9uLmVxdWFscyhCbHVldG9vdGhJbnB1dERldmljZS5BQ1RJT05fSU5QVVRfREVWSUNFX1NUQVRFX0NIQU5HRUQpKSB7CisgICAgICAgICAgICAgICAgaW50IG5ld1N0YXRlID0gaW50ZW50LmdldEludEV4dHJhKEJsdWV0b290aElucHV0RGV2aWNlLkVYVFJBX0lOUFVUX0RFVklDRV9TVEFURSwgMCk7CisgICAgICAgICAgICAgICAgaW50IG9sZFN0YXRlID0KKyAgICAgICAgICAgICAgICAgICAgaW50ZW50LmdldEludEV4dHJhKEJsdWV0b290aElucHV0RGV2aWNlLkVYVFJBX1BSRVZJT1VTX0lOUFVUX0RFVklDRV9TVEFURSwgMCk7CisgICAgICAgICAgICAgICAgbUhpZFN0YXRlID0gbmV3U3RhdGU7CisgICAgICAgICAgICAgICAgaWYgKG9sZFN0YXRlID09IEJsdWV0b290aElucHV0RGV2aWNlLlNUQVRFX0NPTk5FQ1RFRCAmJgorICAgICAgICAgICAgICAgICAgICBuZXdTdGF0ZSA9PSBCbHVldG9vdGhJbnB1dERldmljZS5TVEFURV9ESVNDT05ORUNURUQpIHsKKyAgICAgICAgICAgICAgICAgICAgc2VuZE1lc3NhZ2UoRElTQ09OTkVDVF9ISURfSU5DT01JTkcpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAobmV3U3RhdGUgPT0gQmx1ZXRvb3RoSW5wdXREZXZpY2UuU1RBVEVfQ09OTkVDVEVEIHx8CisgICAgICAgICAgICAgICAgICAgIG5ld1N0YXRlID09IEJsdWV0b290aElucHV0RGV2aWNlLlNUQVRFX0RJU0NPTk5FQ1RFRCkgeworICAgICAgICAgICAgICAgICAgICBzZW5kTWVzc2FnZShUUkFOU0lUSU9OX1RPX1NUQUJMRSk7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfSBlbHNlIGlmIChhY3Rpb24uZXF1YWxzKEJsdWV0b290aERldmljZS5BQ1RJT05fQUNMX0NPTk5FQ1RFRCkpIHsKICAgICAgICAgICAgICAgICBpZiAoIWdldEN1cnJlbnRTdGF0ZSgpLmVxdWFscyhtQm9uZGVkRGV2aWNlKSkgewogICAgICAgICAgICAgICAgICAgICBMb2cuZShUQUcsICJTdGF0ZSBpczogIiArIGdldEN1cnJlbnRTdGF0ZSgpKTsKQEAgLTE2NSw2ICsxODYsOCBAQAogICAgICAgICBhZGRTdGF0ZShtSW5jb21pbmdIYW5kc2ZyZWUpOwogICAgICAgICBhZGRTdGF0ZShtSW5jb21pbmdBMmRwKTsKICAgICAgICAgYWRkU3RhdGUobU91dGdvaW5nQTJkcCk7CisgICAgICAgIGFkZFN0YXRlKG1PdXRnb2luZ0hpZCk7CisgICAgICAgIGFkZFN0YXRlKG1JbmNvbWluZ0hpZCk7CiAgICAgICAgIHNldEluaXRpYWxTdGF0ZShtQm9uZGVkRGV2aWNlKTsKIAogICAgICAgICBJbnRlbnRGaWx0ZXIgZmlsdGVyID0gbmV3IEludGVudEZpbHRlcigpOwpAQCAtMTcyLDYgKzE5NSw3IEBACiAgICAgICAgIGZpbHRlci5hZGRBY3Rpb24oQmx1ZXRvb3RoQTJkcC5BQ1RJT05fU0lOS19TVEFURV9DSEFOR0VEKTsKICAgICAgICAgZmlsdGVyLmFkZEFjdGlvbihCbHVldG9vdGhIZWFkc2V0LkFDVElPTl9TVEFURV9DSEFOR0VEKTsKICAgICAgICAgZmlsdGVyLmFkZEFjdGlvbihCbHVldG9vdGhEZXZpY2UuQUNUSU9OX0FDTF9DT05ORUNURUQpOworICAgICAgICBmaWx0ZXIuYWRkQWN0aW9uKEJsdWV0b290aElucHV0RGV2aWNlLkFDVElPTl9JTlBVVF9ERVZJQ0VfU1RBVEVfQ0hBTkdFRCk7CiAKICAgICAgICAgbUNvbnRleHQucmVnaXN0ZXJSZWNlaXZlcihtQnJvYWRjYXN0UmVjZWl2ZXIsIGZpbHRlcik7CiAKQEAgLTIyNCw2ICsyNDgsMTQgQEAKICAgICAgICAgICAgICAgICBjYXNlIERJU0NPTk5FQ1RfQTJEUF9JTkNPTUlORzoKICAgICAgICAgICAgICAgICAgICAgdHJhbnNpdGlvblRvKG1JbmNvbWluZ0EyZHApOwogICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIENPTk5FQ1RfSElEX09VVEdPSU5HOgorICAgICAgICAgICAgICAgIGNhc2UgRElTQ09OTkVDVF9ISURfT1VUR09JTkc6CisgICAgICAgICAgICAgICAgICAgIHRyYW5zaXRpb25UbyhtT3V0Z29pbmdIaWQpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIENPTk5FQ1RfSElEX0lOQ09NSU5HOgorICAgICAgICAgICAgICAgIGNhc2UgRElTQ09OTkVDVF9ISURfSU5DT01JTkc6CisgICAgICAgICAgICAgICAgICAgIHRyYW5zaXRpb25UbyhtSW5jb21pbmdIaWQpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICBjYXNlIFVOUEFJUjoKICAgICAgICAgICAgICAgICAgICAgaWYgKG1IZWFkc2V0U3RhdGUgIT0gQmx1ZXRvb3RoSGVhZHNldC5TVEFURV9ESVNDT05ORUNURUQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIHNlbmRNZXNzYWdlKERJU0NPTk5FQ1RfSEZQX09VVEdPSU5HKTsKQEAgLTIzMyw2ICsyNjUsMTAgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIHNlbmRNZXNzYWdlKERJU0NPTk5FQ1RfQTJEUF9PVVRHT0lORyk7CiAgICAgICAgICAgICAgICAgICAgICAgICBkZWZlck1lc3NhZ2UobWVzc2FnZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChtSGlkU3RhdGUgIT0gQmx1ZXRvb3RoSW5wdXREZXZpY2UuU1RBVEVfRElTQ09OTkVDVEVEKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzZW5kTWVzc2FnZShESVNDT05ORUNUX0hJRF9PVVRHT0lORyk7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZlck1lc3NhZ2UobWVzc2FnZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBwcm9jZXNzQ29tbWFuZChVTlBBSVIpOwogICAgICAgICAgICAgICAgICAgICBicmVhazsKQEAgLTI1NCw2ICsyOTAsMTAgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1BMmRwU2VydmljZS5nZXRDb25uZWN0ZWRTaW5rcygpLmxlbmd0aCA9PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUEyZHBTZXJ2aWNlLmNvbm5lY3RTaW5rKG1EZXZpY2UpOwogICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1TZXJ2aWNlLmdldElucHV0RGV2aWNlUHJpb3JpdHkobURldmljZSkgPT0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJsdWV0b290aElucHV0RGV2aWNlLlBSSU9SSVRZX0FVVE9fQ09OTkVDVCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1TZXJ2aWNlLmNvbm5lY3RJbnB1dERldmljZShtRGV2aWNlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICBjYXNlIFRSQU5TSVRJT05fVE9fU1RBQkxFOgpAQCAtMzQyLDYgKzM4MiwyMyBAQAogICAgICAgICAgICAgICAgICAgICAgICBkZWZlck1lc3NhZ2UoZGVmZXJNc2cpOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQ09OTkVDVF9ISURfT1VUR09JTkc6CisgICAgICAgICAgICAgICAgY2FzZSBESVNDT05ORUNUX0hJRF9PVVRHT0lORzoKKyAgICAgICAgICAgICAgICAgICAgZGVmZXJNZXNzYWdlKG1lc3NhZ2UpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIENPTk5FQ1RfSElEX0lOQ09NSU5HOgorICAgICAgICAgICAgICAgICAgICB0cmFuc2l0aW9uVG8obUluY29taW5nSGlkKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1TdGF0dXMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmVyTXNnLndoYXQgPSBtQ29tbWFuZDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmVyTWVzc2FnZShkZWZlck1zZyk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBESVNDT05ORUNUX0hJRF9JTkNPTUlORzoKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1TdGF0dXMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmVyTXNnLndoYXQgPSBtQ29tbWFuZDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmVyTWVzc2FnZShkZWZlck1zZyk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7IC8vIGlnbm9yZQogICAgICAgICAgICAgICAgIGNhc2UgVU5QQUlSOgogICAgICAgICAgICAgICAgIGNhc2UgQVVUT19DT05ORUNUX1BST0ZJTEVTOgogICAgICAgICAgICAgICAgICAgICBkZWZlck1lc3NhZ2UobWVzc2FnZSk7CkBAIC00MDksNiArNDY2LDEzIEBACiAgICAgICAgICAgICAgICAgICAgIC8vIElmIHRoaXMgY2F1c2VzIGluY29taW5nIEhGUCB0byBmYWlsLCBpdCBpcyBtb3JlIG9mIGEgaGVhZHNldCBwcm9ibGVtCiAgICAgICAgICAgICAgICAgICAgIC8vIHNpbmNlIGJvdGggY29ubmVjdGlvbnMgYXJlIGluY29taW5nIG9uZXMuCiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQ09OTkVDVF9ISURfT1VUR09JTkc6CisgICAgICAgICAgICAgICAgY2FzZSBESVNDT05ORUNUX0hJRF9PVVRHT0lORzoKKyAgICAgICAgICAgICAgICAgICAgZGVmZXJNZXNzYWdlKG1lc3NhZ2UpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIENPTk5FQ1RfSElEX0lOQ09NSU5HOgorICAgICAgICAgICAgICAgIGNhc2UgRElTQ09OTkVDVF9ISURfSU5DT01JTkc6CisgICAgICAgICAgICAgICAgICAgICBicmVhazsgLy8gaWdub3JlCiAgICAgICAgICAgICAgICAgY2FzZSBVTlBBSVI6CiAgICAgICAgICAgICAgICAgY2FzZSBBVVRPX0NPTk5FQ1RfUFJPRklMRVM6CiAgICAgICAgICAgICAgICAgICAgIGRlZmVyTWVzc2FnZShtZXNzYWdlKTsKQEAgLTQ5Niw2ICs1NjAsMjMgQEAKICAgICAgICAgICAgICAgICBjYXNlIERJU0NPTk5FQ1RfQTJEUF9JTkNPTUlORzoKICAgICAgICAgICAgICAgICAgICAgLy8gSWdub3JlLCB3aWxsIGJlIGhhbmRsZWQgYnkgQmx1ZXoKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBDT05ORUNUX0hJRF9PVVRHT0lORzoKKyAgICAgICAgICAgICAgICBjYXNlIERJU0NPTk5FQ1RfSElEX09VVEdPSU5HOgorICAgICAgICAgICAgICAgICAgICBkZWZlck1lc3NhZ2UobWVzc2FnZSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQ09OTkVDVF9ISURfSU5DT01JTkc6CisgICAgICAgICAgICAgICAgICAgIHRyYW5zaXRpb25UbyhtSW5jb21pbmdIaWQpOworICAgICAgICAgICAgICAgICAgICBpZiAobVN0YXR1cykgeworICAgICAgICAgICAgICAgICAgICAgICAgZGVmZXJNc2cud2hhdCA9IG1Db21tYW5kOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmZXJNZXNzYWdlKGRlZmVyTXNnKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIERJU0NPTk5FQ1RfSElEX0lOQ09NSU5HOgorICAgICAgICAgICAgICAgICAgICBpZiAobVN0YXR1cykgeworICAgICAgICAgICAgICAgICAgICAgICAgZGVmZXJNc2cud2hhdCA9IG1Db21tYW5kOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmZXJNZXNzYWdlKGRlZmVyTXNnKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsgLy8gaWdub3JlCiAgICAgICAgICAgICAgICAgY2FzZSBVTlBBSVI6CiAgICAgICAgICAgICAgICAgY2FzZSBBVVRPX0NPTk5FQ1RfUFJPRklMRVM6CiAgICAgICAgICAgICAgICAgICAgIGRlZmVyTWVzc2FnZShtZXNzYWdlKTsKQEAgLTU2MSw2ICs2NDIsMTMgQEAKICAgICAgICAgICAgICAgICBjYXNlIERJU0NPTk5FQ1RfQTJEUF9JTkNPTUlORzoKICAgICAgICAgICAgICAgICAgICAgLy8gSWdub3JlLCB3aWxsIGJlIGhhbmRsZWQgYnkgQmx1ZXoKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBDT05ORUNUX0hJRF9PVVRHT0lORzoKKyAgICAgICAgICAgICAgICBjYXNlIERJU0NPTk5FQ1RfSElEX09VVEdPSU5HOgorICAgICAgICAgICAgICAgICAgICBkZWZlck1lc3NhZ2UobWVzc2FnZSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQ09OTkVDVF9ISURfSU5DT01JTkc6CisgICAgICAgICAgICAgICAgY2FzZSBESVNDT05ORUNUX0hJRF9JTkNPTUlORzoKKyAgICAgICAgICAgICAgICAgICAgIGJyZWFrOyAvLyBpZ25vcmUKICAgICAgICAgICAgICAgICBjYXNlIFVOUEFJUjoKICAgICAgICAgICAgICAgICBjYXNlIEFVVE9fQ09OTkVDVF9QUk9GSUxFUzoKICAgICAgICAgICAgICAgICAgICAgZGVmZXJNZXNzYWdlKG1lc3NhZ2UpOwpAQCAtNTc2LDYgKzY2NCwxNDMgQEAKICAgICB9CiAKIAorICAgIHByaXZhdGUgY2xhc3MgT3V0Z29pbmdIaWQgZXh0ZW5kcyBIaWVyYXJjaGljYWxTdGF0ZSB7CisgICAgICAgIHByaXZhdGUgYm9vbGVhbiBtU3RhdHVzID0gZmFsc2U7CisgICAgICAgIHByaXZhdGUgaW50IG1Db21tYW5kOworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwcm90ZWN0ZWQgdm9pZCBlbnRlcigpIHsKKyAgICAgICAgICAgIGxvZygiRW50ZXJpbmcgT3V0Z29pbmdIaWQgc3RhdGUgd2l0aDogIiArIGdldEN1cnJlbnRNZXNzYWdlKCkud2hhdCk7CisgICAgICAgICAgICBtQ29tbWFuZCA9IGdldEN1cnJlbnRNZXNzYWdlKCkud2hhdDsKKyAgICAgICAgICAgIGlmIChtQ29tbWFuZCAhPSBDT05ORUNUX0hJRF9PVVRHT0lORyAmJgorICAgICAgICAgICAgICAgIG1Db21tYW5kICE9IERJU0NPTk5FQ1RfSElEX09VVEdPSU5HKSB7CisgICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAiRXJyb3I6IE91dGdvaW5nSGlkIHN0YXRlIHdpdGggY29tbWFuZDoiICsgbUNvbW1hbmQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbVN0YXR1cyA9IHByb2Nlc3NDb21tYW5kKG1Db21tYW5kKTsKKyAgICAgICAgICAgIGlmICghbVN0YXR1cykgc2VuZE1lc3NhZ2UoVFJBTlNJVElPTl9UT19TVEFCTEUpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHByb3RlY3RlZCBib29sZWFuIHByb2Nlc3NNZXNzYWdlKE1lc3NhZ2UgbWVzc2FnZSkgeworICAgICAgICAgICAgbG9nKCJPdXRnb2luZ0hpZCBTdGF0ZS0+UHJvY2Vzc2luZyBNZXNzYWdlOiAiICsgbWVzc2FnZS53aGF0KTsKKyAgICAgICAgICAgIE1lc3NhZ2UgZGVmZXJNc2cgPSBuZXcgTWVzc2FnZSgpOworICAgICAgICAgICAgc3dpdGNoKG1lc3NhZ2Uud2hhdCkgeworICAgICAgICAgICAgICAgIC8vIGRlZmVyIGFsbCBvdXRnb2luZyBtZXNzYWdlcworICAgICAgICAgICAgICAgIGNhc2UgQ09OTkVDVF9IRlBfT1VUR09JTkc6CisgICAgICAgICAgICAgICAgY2FzZSBDT05ORUNUX0EyRFBfT1VUR09JTkc6CisgICAgICAgICAgICAgICAgY2FzZSBDT05ORUNUX0hJRF9PVVRHT0lORzoKKyAgICAgICAgICAgICAgICBjYXNlIERJU0NPTk5FQ1RfSEZQX09VVEdPSU5HOgorICAgICAgICAgICAgICAgIGNhc2UgRElTQ09OTkVDVF9BMkRQX09VVEdPSU5HOgorICAgICAgICAgICAgICAgIGNhc2UgRElTQ09OTkVDVF9ISURfT1VUR09JTkc6CisgICAgICAgICAgICAgICAgICAgIGRlZmVyTWVzc2FnZShtZXNzYWdlKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlIENPTk5FQ1RfSEZQX0lOQ09NSU5HOgorICAgICAgICAgICAgICAgICAgICB0cmFuc2l0aW9uVG8obUluY29taW5nSGFuZHNmcmVlKTsKKyAgICAgICAgICAgICAgICBjYXNlIENPTk5FQ1RfQTJEUF9JTkNPTUlORzoKKyAgICAgICAgICAgICAgICAgICAgdHJhbnNpdGlvblRvKG1JbmNvbWluZ0EyZHApOworCisgICAgICAgICAgICAgICAgICAgIC8vIERvbid0IGNhbmNlbCBISUQgb3V0Z29pbmcgYXMgdGhlcmUgaXMgbm8gZ3VhcmFudGVlIGl0CisgICAgICAgICAgICAgICAgICAgIC8vIHdpbGwgZ2V0IGNhbmNlbGVkLgorICAgICAgICAgICAgICAgICAgICAvLyBJdCBtaWdodCBhbHJlYWR5IGJlIGNvbm5lY3RlZCBidXQgd2UgbWlnaHQgbm90IGhhdmUgZ290IHRoZQorICAgICAgICAgICAgICAgICAgICAvLyBJTlBVVF9ERVZJQ0VfU1RBVEVfQ0hBTkdFLiBIZW5jZSwgbm8gcG9pbnQgZGlzY29ubmVjdGluZyBoZXJlLgorICAgICAgICAgICAgICAgICAgICAvLyBUaGUgd29yc3QgY2FzZSwgdGhlIGNvbm5lY3Rpb24gd2lsbCBmYWlsLCByZXRyeS4KKyAgICAgICAgICAgICAgICAgICAgaWYgKG1TdGF0dXMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmVyTXNnLndoYXQgPSBtQ29tbWFuZDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmVyTWVzc2FnZShkZWZlck1zZyk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBDT05ORUNUX0hJRF9JTkNPTUlORzoKKyAgICAgICAgICAgICAgICAgIC8vIEJsdWV6IHdpbGwgdGFrZSBjYXJlIG9mIHRoZSBjb25mbGljdHMKKyAgICAgICAgICAgICAgICAgICAgdHJhbnNpdGlvblRvKG1JbmNvbWluZ0hpZCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSBESVNDT05ORUNUX0hGUF9JTkNPTUlORzoKKyAgICAgICAgICAgICAgICBjYXNlIERJU0NPTk5FQ1RfQTJEUF9JTkNPTUlORzoKKyAgICAgICAgICAgICAgICAgICAgLy8gQXQgdGhpcyBwb2ludCwgd2UgYXJlIGFscmVhZHkgZGlzY29ubmVjdGVkCisgICAgICAgICAgICAgICAgICAgIC8vIHdpdGggSEZQLiBTb21ldGltZXMgSElEIGNvbm5lY3Rpb24gY2FuCisgICAgICAgICAgICAgICAgICAgIC8vIGZhaWwgZHVlIHRvIHRoZSBkaXNjb25uZWN0aW9uIG9mIEhGUC4gU28gYWRkIGEgcmV0cnkKKyAgICAgICAgICAgICAgICAgICAgLy8gZm9yIHRoZSBISUQuCisgICAgICAgICAgICAgICAgICAgIGlmIChtU3RhdHVzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZlck1zZy53aGF0ID0gbUNvbW1hbmQ7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZlck1lc3NhZ2UoZGVmZXJNc2cpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgRElTQ09OTkVDVF9ISURfSU5DT01JTkc6CisgICAgICAgICAgICAgICAgICAgIC8vIElnbm9yZSwgd2lsbCBiZSBoYW5kbGVkIGJ5IEJsdWV6CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSBVTlBBSVI6CisgICAgICAgICAgICAgICAgY2FzZSBBVVRPX0NPTk5FQ1RfUFJPRklMRVM6CisgICAgICAgICAgICAgICAgICAgIGRlZmVyTWVzc2FnZShtZXNzYWdlKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBUUkFOU0lUSU9OX1RPX1NUQUJMRToKKyAgICAgICAgICAgICAgICAgICAgdHJhbnNpdGlvblRvKG1Cb25kZWREZXZpY2UpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gTk9UX0hBTkRMRUQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gSEFORExFRDsKKyAgICAgICAgfQorICAgIH0KKworICBwcml2YXRlIGNsYXNzIEluY29taW5nSGlkIGV4dGVuZHMgSGllcmFyY2hpY2FsU3RhdGUgeworICAgICAgcHJpdmF0ZSBib29sZWFuIG1TdGF0dXMgPSBmYWxzZTsKKyAgICAgIHByaXZhdGUgaW50IG1Db21tYW5kOworCisgICAgICBAT3ZlcnJpZGUKKyAgICAgIHByb3RlY3RlZCB2b2lkIGVudGVyKCkgeworICAgICAgICAgIGxvZygiRW50ZXJpbmcgSW5jb21pbmdIaWQgc3RhdGUgd2l0aDogIiArIGdldEN1cnJlbnRNZXNzYWdlKCkud2hhdCk7CisgICAgICAgICAgbUNvbW1hbmQgPSBnZXRDdXJyZW50TWVzc2FnZSgpLndoYXQ7CisgICAgICAgICAgaWYgKG1Db21tYW5kICE9IENPTk5FQ1RfSElEX0lOQ09NSU5HICYmCisgICAgICAgICAgICAgIG1Db21tYW5kICE9IERJU0NPTk5FQ1RfSElEX0lOQ09NSU5HKSB7CisgICAgICAgICAgICAgIExvZy5lKFRBRywgIkVycm9yOiBJbmNvbWluZ0hpZCBzdGF0ZSB3aXRoIGNvbW1hbmQ6IiArIG1Db21tYW5kKTsKKyAgICAgICAgICB9CisgICAgICAgICAgbVN0YXR1cyA9IHByb2Nlc3NDb21tYW5kKG1Db21tYW5kKTsKKyAgICAgICAgICBpZiAoIW1TdGF0dXMpIHNlbmRNZXNzYWdlKFRSQU5TSVRJT05fVE9fU1RBQkxFKTsKKyAgICAgIH0KKworICAgICAgQE92ZXJyaWRlCisgICAgICBwcm90ZWN0ZWQgYm9vbGVhbiBwcm9jZXNzTWVzc2FnZShNZXNzYWdlIG1lc3NhZ2UpIHsKKyAgICAgICAgICBsb2coIkluY29taW5nSGlkIFN0YXRlLT5Qcm9jZXNzaW5nIE1lc3NhZ2U6ICIgKyBtZXNzYWdlLndoYXQpOworICAgICAgICAgIE1lc3NhZ2UgZGVmZXJNc2cgPSBuZXcgTWVzc2FnZSgpOworICAgICAgICAgIHN3aXRjaChtZXNzYWdlLndoYXQpIHsKKyAgICAgICAgICAgICAgY2FzZSBDT05ORUNUX0hGUF9PVVRHT0lORzoKKyAgICAgICAgICAgICAgY2FzZSBDT05ORUNUX0hGUF9JTkNPTUlORzoKKyAgICAgICAgICAgICAgY2FzZSBESVNDT05ORUNUX0hGUF9PVVRHT0lORzoKKyAgICAgICAgICAgICAgY2FzZSBDT05ORUNUX0EyRFBfSU5DT01JTkc6CisgICAgICAgICAgICAgIGNhc2UgQ09OTkVDVF9BMkRQX09VVEdPSU5HOgorICAgICAgICAgICAgICBjYXNlIERJU0NPTk5FQ1RfQTJEUF9PVVRHT0lORzoKKyAgICAgICAgICAgICAgY2FzZSBDT05ORUNUX0hJRF9PVVRHT0lORzoKKyAgICAgICAgICAgICAgY2FzZSBDT05ORUNUX0hJRF9JTkNPTUlORzoKKyAgICAgICAgICAgICAgY2FzZSBESVNDT05ORUNUX0hJRF9PVVRHT0lORzoKKyAgICAgICAgICAgICAgICAgIGRlZmVyTWVzc2FnZShtZXNzYWdlKTsKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICBjYXNlIERJU0NPTk5FQ1RfSEZQX0lOQ09NSU5HOgorICAgICAgICAgICAgICAgICAgLy8gU2hvdWxkbid0IGhhcHBlbiBidXQgaWYgZG9lcywgd2UgY2FuIGhhbmRsZSBpdC4KKyAgICAgICAgICAgICAgICAgIC8vIERlcGVuZHMgaWYgdGhlIGhlYWRzZXQgY2FuIGhhbmRsZSBpdC4KKyAgICAgICAgICAgICAgICAgIC8vIEluY29taW5nIEhJRCB3aWxsIGJlIGhhbmRsZWQgYnkgQmx1ZXosIERpc2Nvbm5lY3QgSEZQCisgICAgICAgICAgICAgICAgICAvLyB0aGUgc29ja2V0IHdvdWxkIGhhdmUgYWxyZWFkeSBiZWVuIGNsb3NlZC4KKyAgICAgICAgICAgICAgICAgIC8vIGlnbm9yZQorICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIGNhc2UgRElTQ09OTkVDVF9ISURfSU5DT01JTkc6CisgICAgICAgICAgICAgIGNhc2UgRElTQ09OTkVDVF9BMkRQX0lOQ09NSU5HOgorICAgICAgICAgICAgICAgICAgLy8gSWdub3JlLCB3aWxsIGJlIGhhbmRsZWQgYnkgQmx1ZXoKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICBjYXNlIFVOUEFJUjoKKyAgICAgICAgICAgICAgY2FzZSBBVVRPX0NPTk5FQ1RfUFJPRklMRVM6CisgICAgICAgICAgICAgICAgICBkZWZlck1lc3NhZ2UobWVzc2FnZSk7CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgY2FzZSBUUkFOU0lUSU9OX1RPX1NUQUJMRToKKyAgICAgICAgICAgICAgICAgIHRyYW5zaXRpb25UbyhtQm9uZGVkRGV2aWNlKTsKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgcmV0dXJuIE5PVF9IQU5ETEVEOworICAgICAgICAgIH0KKyAgICAgICAgICByZXR1cm4gSEFORExFRDsKKyAgICAgIH0KKyAgfQorCiAKICAgICBzeW5jaHJvbml6ZWQgdm9pZCBjYW5jZWxDb21tYW5kKGludCBjb21tYW5kKSB7CiAgICAgICAgIGlmIChjb21tYW5kID09IENPTk5FQ1RfSEZQX09VVEdPSU5HICkgewpAQCAtNjE5LDYgKzg0NCwxMCBAQAogICAgICAgICAgICAgY2FzZSBDT05ORUNUX0EyRFBfSU5DT01JTkc6CiAgICAgICAgICAgICAgICAgLy8gaWdub3JlLCBCbHVleiB0YWtlcyBjYXJlCiAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICBjYXNlIENPTk5FQ1RfSElEX09VVEdPSU5HOgorICAgICAgICAgICAgICAgIHJldHVybiBtU2VydmljZS5jb25uZWN0SW5wdXREZXZpY2VJbnRlcm5hbChtRGV2aWNlKTsKKyAgICAgICAgICAgIGNhc2UgQ09OTkVDVF9ISURfSU5DT01JTkc6CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgICBjYXNlIERJU0NPTk5FQ1RfSEZQX09VVEdPSU5HOgogICAgICAgICAgICAgICAgIGlmICghbUhlYWRzZXRTZXJ2aWNlQ29ubmVjdGVkKSB7CiAgICAgICAgICAgICAgICAgICAgIGRlZmVySGVhZHNldE1lc3NhZ2UoY29tbWFuZCk7CkBAIC02NDUsNiArODc0LDE1IEBACiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBtQTJkcFNlcnZpY2UuZGlzY29ubmVjdFNpbmtJbnRlcm5hbChtRGV2aWNlKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIERJU0NPTk5FQ1RfSElEX0lOQ09NSU5HOgorICAgICAgICAgICAgICAgIC8vIGlnbm9yZQorICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgY2FzZSBESVNDT05ORUNUX0hJRF9PVVRHT0lORzoKKyAgICAgICAgICAgICAgICBpZiAobVNlcnZpY2UuZ2V0SW5wdXREZXZpY2VQcmlvcml0eShtRGV2aWNlKSA9PQorICAgICAgICAgICAgICAgICAgICBCbHVldG9vdGhJbnB1dERldmljZS5QUklPUklUWV9BVVRPX0NPTk5FQ1QpIHsKKyAgICAgICAgICAgICAgICAgICAgbVNlcnZpY2Uuc2V0SW5wdXREZXZpY2VQcmlvcml0eShtRGV2aWNlLCBCbHVldG9vdGhJbnB1dERldmljZS5QUklPUklUWV9PTik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBtU2VydmljZS5kaXNjb25uZWN0SW5wdXREZXZpY2VJbnRlcm5hbChtRGV2aWNlKTsKICAgICAgICAgICAgIGNhc2UgVU5QQUlSOgogICAgICAgICAgICAgICAgIHJldHVybiBtU2VydmljZS5yZW1vdmVCb25kSW50ZXJuYWwobURldmljZS5nZXRBZGRyZXNzKCkpOwogICAgICAgICAgICAgZGVmYXVsdDoKQEAgLTY1Myw2ICs4OTEsNyBAQAogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogCisKICAgICAvKnBhY2thZ2UqLyBCbHVldG9vdGhEZXZpY2UgZ2V0RGV2aWNlKCkgewogICAgICAgICByZXR1cm4gbURldmljZTsKICAgICB9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9ibHVldG9vdGgvQmx1ZXRvb3RoSGVhZHNldC5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvYmx1ZXRvb3RoL0JsdWV0b290aEhlYWRzZXQuamF2YQppbmRleCA1M2Q2YTM3Li5iZTIxZDQ2IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9ibHVldG9vdGgvQmx1ZXRvb3RoSGVhZHNldC5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2JsdWV0b290aC9CbHVldG9vdGhIZWFkc2V0LmphdmEKQEAgLTkwLDYgKzkwLDcgQEAKICAgICAgKiB7QGxpbmsgI0VYVFJBX1ZFTkRPUl9TUEVDSUZJQ19IRUFEU0VUX0VWRU5UX0NNRH0sIGFuZAogICAgICAqIHtAbGluayAjRVhUUkFfVkVORE9SX1NQRUNJRklDX0hFQURTRVRfRVZFTlRfQVJHU30uCiAgICAgICogPHA+UmVxdWlyZXMge0BsaW5rIGFuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbiNCTFVFVE9PVEh9IHRvIHJlY2VpdmUuCisgICAgICogQGhpZGUKICAgICAgKi8KICAgICBAU2RrQ29uc3RhbnQoU2RrQ29uc3RhbnRUeXBlLkJST0FEQ0FTVF9JTlRFTlRfQUNUSU9OKQogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFDVElPTl9WRU5ET1JfU1BFQ0lGSUNfSEVBRFNFVF9FVkVOVCA9CkBAIC05OCw2ICs5OSw3IEBACiAgICAgLyoqCiAgICAgICogQSBTdHJpbmcgZXh0cmEgZmllbGQgaW4ge0BsaW5rICNBQ1RJT05fVkVORE9SX1NQRUNJRklDX0hFQURTRVRfRVZFTlR9CiAgICAgICogaW50ZW50cyB0aGF0IGNvbnRhaW5zIHRoZSBuYW1lIG9mIHRoZSB2ZW5kb3Itc3BlY2lmaWMgY29tbWFuZC4KKyAgICAgKiBAaGlkZQogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVFJBX1ZFTkRPUl9TUEVDSUZJQ19IRUFEU0VUX0VWRU5UX0NNRCA9CiAgICAgICAgICAgICAiYW5kcm9pZC5ibHVldG9vdGguaGVhZHNldC5leHRyYS5WRU5ET1JfU1BFQ0lGSUNfSEVBRFNFVF9FVkVOVF9DTUQiOwpAQCAtMTA4LDYgKzExMCw3IEBACiAgICAgICogY29tbWFuZC4KICAgICAgKiBAc2VlIDxhIGhyZWY9Imh0dHBzOi8vd3d3LmJsdWV0b290aC5vcmcvVGVjaG5pY2FsL0Fzc2lnbmVkTnVtYmVycy9pZGVudGlmaWVycy5odG0iPgogICAgICAqIEJsdWV0b290aCBTSUcgQXNzaWduZWQgTnVtYmVycyAtIENvbXBhbnkgSWRlbnRpZmllcnM8L2E+CisgICAgICogQGhpZGUKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRSQV9WRU5ET1JfU1BFQ0lGSUNfSEVBRFNFVF9FVkVOVF9DT01QQU5ZX0lEID0KICAgICAgICAgICAgICJhbmRyb2lkLmJsdWV0b290aC5oZWFkc2V0LmV4dHJhLlZFTkRPUl9TUEVDSUZJQ19IRUFEU0VUX0VWRU5UX0NPTVBBTllfSUQiOwpAQCAtMTE2LDYgKzExOSw3IEBACiAgICAgICogQSBQYXJjZWxhYmxlIFN0cmluZyBhcnJheSBleHRyYSBmaWVsZCBpbgogICAgICAqIHtAbGluayAjQUNUSU9OX1ZFTkRPUl9TUEVDSUZJQ19IRUFEU0VUX0VWRU5UfSBpbnRlbnRzIHRoYXQgY29udGFpbnMKICAgICAgKiB0aGUgYXJndW1lbnRzIHRvIHRoZSB2ZW5kb3Itc3BlY2lmaWMgY29tbWFuZC4KKyAgICAgKiBAaGlkZQogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVFJBX1ZFTkRPUl9TUEVDSUZJQ19IRUFEU0VUX0VWRU5UX0FSR1MgPQogICAgICAgICAgICAgImFuZHJvaWQuYmx1ZXRvb3RoLmhlYWRzZXQuZXh0cmEuVkVORE9SX1NQRUNJRklDX0hFQURTRVRfRVZFTlRfQVJHUyI7CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9ibHVldG9vdGgvQmx1ZXRvb3RoSW5wdXREZXZpY2UuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2JsdWV0b290aC9CbHVldG9vdGhJbnB1dERldmljZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE3OTM4MzgKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9ibHVldG9vdGgvQmx1ZXRvb3RoSW5wdXREZXZpY2UuamF2YQpAQCAtMCwwICsxLDI0MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5ibHVldG9vdGg7CisKK2ltcG9ydCBhbmRyb2lkLmFubm90YXRpb24uU2RrQ29uc3RhbnQ7CitpbXBvcnQgYW5kcm9pZC5hbm5vdGF0aW9uLlNka0NvbnN0YW50LlNka0NvbnN0YW50VHlwZTsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLm9zLklCaW5kZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb247CitpbXBvcnQgYW5kcm9pZC5vcy5TZXJ2aWNlTWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CitpbXBvcnQgamF2YS51dGlsLlNldDsKKworLyoqCisgKiBQdWJsaWMgQVBJIGZvciBjb250cm9sbGluZyB0aGUgQmx1ZXRvb3RoIEhJRCAoSW5wdXQgRGV2aWNlKSBQcm9maWxlCisgKgorICogQmx1ZXRvb3RoSW5wdXREZXZpY2UgaXMgYSBwcm94eSBvYmplY3QgdXNlZCB0byBtYWtlIGNhbGxzIHRvIEJsdWV0b290aCBTZXJ2aWNlCisgKiB3aGljaCBoYW5kbGVzIHRoZSBISUQgcHJvZmlsZS4KKyAqCisgKiBDcmVhdGluZyBhIEJsdWV0b290aElucHV0RGV2aWNlIG9iamVjdCB3aWxsIGluaXRpYXRlIGEgYmluZGluZyB3aXRoIHRoZQorICogQmx1ZXRvb3RoIHNlcnZpY2UuIFVzZXJzIG9mIHRoaXMgb2JqZWN0IHNob3VsZCBjYWxsIGNsb3NlKCkgd2hlbiB0aGV5CisgKiBhcmUgZmluaXNoZWQsIHNvIHRoYXQgdGhpcyBwcm94eSBvYmplY3QgY2FuIHVuYmluZCBmcm9tIHRoZSBzZXJ2aWNlLgorICoKKyAqIEN1cnJlbnRseSB0aGUgQmx1ZXRvb3RoIHNlcnZpY2UgcnVucyBpbiB0aGUgc3lzdGVtIHNlcnZlciBhbmQgdGhpcworICogcHJveHkgb2JqZWN0IHdpbGwgYmUgaW1tZWRpYXRlbHkgYm91bmQgdG8gdGhlIHNlcnZpY2Ugb24gY29uc3RydWN0aW9uLgorICoKKyAqICBAaGlkZQorICovCitwdWJsaWMgZmluYWwgY2xhc3MgQmx1ZXRvb3RoSW5wdXREZXZpY2UgeworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiQmx1ZXRvb3RoSW5wdXREZXZpY2UiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gREJHID0gZmFsc2U7CisKKyAgICAvKiogaW50IGV4dHJhIGZvciBBQ1RJT05fSU5QVVRfREVWSUNFX1NUQVRFX0NIQU5HRUQgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRSQV9JTlBVVF9ERVZJQ0VfU1RBVEUgPQorICAgICAgICAiYW5kcm9pZC5ibHVldG9vdGguaW5wdXRkZXZpY2UuZXh0cmEuSU5QVVRfREVWSUNFX1NUQVRFIjsKKyAgICAvKiogaW50IGV4dHJhIGZvciBBQ1RJT05fSU5QVVRfREVWSUNFX1NUQVRFX0NIQU5HRUQgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRSQV9QUkVWSU9VU19JTlBVVF9ERVZJQ0VfU1RBVEUgPQorICAgICAgICAiYW5kcm9pZC5ibHVldG9vdGguaW5wdXRkZXZpY2UuZXh0cmEuUFJFVklPVVNfSU5QVVRfREVWSUNFX1NUQVRFIjsKKworICAgIC8qKiBJbmRpY2F0ZXMgdGhlIHN0YXRlIG9mIGFuIGlucHV0IGRldmljZSBoYXMgY2hhbmdlZC4KKyAgICAgKiBUaGlzIGludGVudCB3aWxsIGFsd2F5cyBjb250YWluIEVYVFJBX0lOUFVUX0RFVklDRV9TVEFURSwKKyAgICAgKiBFWFRSQV9QUkVWSU9VU19JTlBVVF9ERVZJQ0VfU1RBVEUgYW5kIEJsdWV0b290aERldmljZS5FWFRSQV9ERVZJQ0UKKyAgICAgKiBleHRyYXMuCisgICAgICovCisgICAgQFNka0NvbnN0YW50KFNka0NvbnN0YW50VHlwZS5CUk9BRENBU1RfSU5URU5UX0FDVElPTikKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBQ1RJT05fSU5QVVRfREVWSUNFX1NUQVRFX0NIQU5HRUQgPQorICAgICAgICAiYW5kcm9pZC5ibHVldG9vdGguaW5wdXRkZXZpY2UuYWN0aW9uLklOUFVUX0RFVklDRV9TVEFURV9DSEFOR0VEIjsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUQVRFX0RJU0NPTk5FQ1RFRCA9IDA7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RBVEVfQ09OTkVDVElORyAgID0gMTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVEFURV9DT05ORUNURUQgICAgPSAyOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUQVRFX0RJU0NPTk5FQ1RJTkcgPSAzOworCisgICAgLyoqCisgICAgICogQXV0byBjb25uZWN0aW9uLCBpbmNvbWluZyBhbmQgb3V0Z29pbmcgY29ubmVjdGlvbiBhcmUgYWxsb3dlZCBhdCB0aGlzCisgICAgICogcHJpb3JpdHkgbGV2ZWwuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJJT1JJVFlfQVVUT19DT05ORUNUID0gMTAwMDsKKyAgICAvKioKKyAgICAgKiBJbmNvbWluZyBhbmQgb3V0Z29pbmcgY29ubmVjdGlvbiBhcmUgYWxsb3dlZCBhdCB0aGlzIHByaW9yaXR5IGxldmVsCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJJT1JJVFlfT04gPSAxMDA7CisgICAgLyoqCisgICAgICogQ29ubmVjdGlvbnMgdG8gdGhlIGRldmljZSBhcmUgbm90IGFsbG93ZWQgYXQgdGhpcyBwcmlvcml0eSBsZXZlbC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUklPUklUWV9PRkYgPSAwOworICAgIC8qKgorICAgICAqIERlZmF1bHQgcHJpb3JpdHkgbGV2ZWwgd2hlbiB0aGUgZGV2aWNlIGlzIHVucGFpcmVkLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBSSU9SSVRZX1VOREVGSU5FRCA9IC0xOworCisgICAgcHJpdmF0ZSBmaW5hbCBJQmx1ZXRvb3RoIG1TZXJ2aWNlOworICAgIHByaXZhdGUgZmluYWwgQ29udGV4dCBtQ29udGV4dDsKKworICAgIC8qKgorICAgICAqIENyZWF0ZSBhIEJsdWV0b290aElucHV0RGV2aWNlIHByb3h5IG9iamVjdCBmb3IgaW50ZXJhY3Rpbmcgd2l0aCB0aGUgbG9jYWwKKyAgICAgKiBCbHVldG9vdGggU2VydmljZSB3aGljaCBoYW5kbGUgdGhlIEhJRCBwcm9maWxlLgorICAgICAqIEBwYXJhbSBjIENvbnRleHQKKyAgICAgKi8KKyAgICBwdWJsaWMgQmx1ZXRvb3RoSW5wdXREZXZpY2UoQ29udGV4dCBjKSB7CisgICAgICAgIG1Db250ZXh0ID0gYzsKKworICAgICAgICBJQmluZGVyIGIgPSBTZXJ2aWNlTWFuYWdlci5nZXRTZXJ2aWNlKEJsdWV0b290aEFkYXB0ZXIuQkxVRVRPT1RIX1NFUlZJQ0UpOworICAgICAgICBpZiAoYiAhPSBudWxsKSB7CisgICAgICAgICAgICBtU2VydmljZSA9IElCbHVldG9vdGguU3R1Yi5hc0ludGVyZmFjZShiKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIExvZy53KFRBRywgIkJsdWV0b290aCBTZXJ2aWNlIG5vdCBhdmFpbGFibGUhIik7CisKKyAgICAgICAgICAgIC8vIEluc3RlYWQgb2YgdGhyb3dpbmcgYW4gZXhjZXB0aW9uIHdoaWNoIHByZXZlbnRzIHBlb3BsZSBmcm9tIGdvaW5nCisgICAgICAgICAgICAvLyBpbnRvIFdpcmVsZXNzIHNldHRpbmdzIGluIHRoZSBlbXVsYXRvci4gTGV0IGl0IGNyYXNoIGxhdGVyIHdoZW4gaXQgaXMgYWN0dWFsbHkgdXNlZC4KKyAgICAgICAgICAgIG1TZXJ2aWNlID0gbnVsbDsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKiBJbml0aWF0ZSBhIGNvbm5lY3Rpb24gdG8gYW4gSW5wdXQgZGV2aWNlLgorICAgICAqCisgICAgICogIFRoaXMgZnVuY3Rpb24gcmV0dXJucyBmYWxzZSBvbiBlcnJvciBhbmQgdHJ1ZSBpZiB0aGUgY29ubmVjdGlvbgorICAgICAqICBhdHRlbXB0IGlzIGJlaW5nIG1hZGUuCisgICAgICoKKyAgICAgKiAgTGlzdGVuIGZvciBJTlBVVF9ERVZJQ0VfU1RBVEVfQ0hBTkdFRF9BQ1RJT04gdG8gZmluZCBvdXQgd2hlbiB0aGUKKyAgICAgKiAgY29ubmVjdGlvbiBpcyBjb21wbGV0ZWQuCisgICAgICogIEBwYXJhbSBkZXZpY2UgUmVtb3RlIEJUIGRldmljZS4KKyAgICAgKiAgQHJldHVybiBmYWxzZSBvbiBpbW1lZGlhdGUgZXJyb3IsIHRydWUgb3RoZXJ3aXNlCisgICAgICogIEBoaWRlCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gY29ubmVjdElucHV0RGV2aWNlKEJsdWV0b290aERldmljZSBkZXZpY2UpIHsKKyAgICAgICAgaWYgKERCRykgbG9nKCJjb25uZWN0SW5wdXREZXZpY2UoIiArIGRldmljZSArICIpIik7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXR1cm4gbVNlcnZpY2UuY29ubmVjdElucHV0RGV2aWNlKGRldmljZSk7CisgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBMb2cuZShUQUcsICIiLCBlKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKiBJbml0aWF0ZSBkaXNjb25uZWN0IGZyb20gYW4gSW5wdXQgRGV2aWNlLgorICAgICAqICBUaGlzIGZ1bmN0aW9uIHJldHVybiBmYWxzZSBvbiBlcnJvciBhbmQgdHJ1ZSBpZiB0aGUgZGlzY29ubmVjdGlvbgorICAgICAqICBhdHRlbXB0IGlzIGJlaW5nIG1hZGUuCisgICAgICoKKyAgICAgKiAgTGlzdGVuIGZvciBJTlBVVF9ERVZJQ0VfU1RBVEVfQ0hBTkdFRF9BQ1RJT04gdG8gZmluZCBvdXQgd2hlbgorICAgICAqICBkaXNjb25uZWN0IGlzIGNvbXBsZXRlZC4KKyAgICAgKgorICAgICAqICBAcGFyYW0gZGV2aWNlIFJlbW90ZSBCVCBkZXZpY2UuCisgICAgICogIEByZXR1cm4gZmFsc2Ugb24gaW1tZWRpYXRlIGVycm9yLCB0cnVlIG90aGVyd2lzZQorICAgICAqICBAaGlkZQorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGRpc2Nvbm5lY3RJbnB1dERldmljZShCbHVldG9vdGhEZXZpY2UgZGV2aWNlKSB7CisgICAgICAgIGlmIChEQkcpIGxvZygiZGlzY29ubmVjdElucHV0RGV2aWNlKCIgKyBkZXZpY2UgKyAiKSIpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuIG1TZXJ2aWNlLmRpc2Nvbm5lY3RJbnB1dERldmljZShkZXZpY2UpOworICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgTG9nLmUoVEFHLCAiIiwgZSk7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiogQ2hlY2sgaWYgYSBzcGVjaWZpZWQgSW5wdXREZXZpY2UgaXMgY29ubmVjdGVkLgorICAgICAqCisgICAgICogIEBwYXJhbSBkZXZpY2UgUmVtb3RlIEJUIGRldmljZS4KKyAgICAgKiAgQHJldHVybiBUcnVlIGlmIGNvbm5lY3RlZCAsIGZhbHNlIG90aGVyd2lzZSBhbmQgb24gZXJyb3IuCisgICAgICogIEBoaWRlCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNJbnB1dERldmljZUNvbm5lY3RlZChCbHVldG9vdGhEZXZpY2UgZGV2aWNlKSB7CisgICAgICAgIGlmIChEQkcpIGxvZygiaXNJbnB1dERldmljZUNvbm5lY3RlZCgiICsgZGV2aWNlICsgIikiKTsKKyAgICAgICAgaW50IHN0YXRlID0gZ2V0SW5wdXREZXZpY2VTdGF0ZShkZXZpY2UpOworICAgICAgICBpZiAoc3RhdGUgPT0gU1RBVEVfQ09OTkVDVEVEKSByZXR1cm4gdHJ1ZTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8qKiBDaGVjayBpZiBhbnkgSW5wdXQgRGV2aWNlIGlzIGNvbm5lY3RlZC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gYSB1bm1vZGlmaWFibGUgc2V0IG9mIGNvbm5lY3RlZCBJbnB1dCBEZXZpY2VzLCBvciBudWxsIG9uIGVycm9yLgorICAgICAqIEBoaWRlCisgICAgICovCisgICAgcHVibGljIFNldDxCbHVldG9vdGhEZXZpY2U+IGdldENvbm5lY3RlZElucHV0RGV2aWNlcygpIHsKKyAgICAgICAgaWYgKERCRykgbG9nKCJnZXRDb25uZWN0ZWRJbnB1dERldmljZXMoKSIpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZVNldCgKKyAgICAgICAgICAgICAgICAgICAgbmV3IEhhc2hTZXQ8Qmx1ZXRvb3RoRGV2aWNlPigKKyAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5cy5hc0xpc3QobVNlcnZpY2UuZ2V0Q29ubmVjdGVkSW5wdXREZXZpY2VzKCkpKSk7CisgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBMb2cuZShUQUcsICIiLCBlKTsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqIEdldCB0aGUgc3RhdGUgb2YgYW4gSW5wdXQgRGV2aWNlLgorICAgICAqCisgICAgICogIEBwYXJhbSBkZXZpY2UgUmVtb3RlIEJUIGRldmljZS4KKyAgICAgKiAgQHJldHVybiBUaGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgSW5wdXQgRGV2aWNlCisgICAgICogIEBoaWRlCisgICAgICovCisgICAgcHVibGljIGludCBnZXRJbnB1dERldmljZVN0YXRlKEJsdWV0b290aERldmljZSBkZXZpY2UpIHsKKyAgICAgICAgaWYgKERCRykgbG9nKCJnZXRJbnB1dERldmljZVN0YXRlKCIgKyBkZXZpY2UgKyAiKSIpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuIG1TZXJ2aWNlLmdldElucHV0RGV2aWNlU3RhdGUoZGV2aWNlKTsKKyAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIExvZy5lKFRBRywgIiIsIGUpOworICAgICAgICAgICAgcmV0dXJuIFNUQVRFX0RJU0NPTk5FQ1RFRDsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCBwcmlvcml0eSBvZiBhbiBpbnB1dCBkZXZpY2UuCisgICAgICoKKyAgICAgKiBQcmlvcml0eSBpcyBhIG5vbi1uZWdhdGl2ZSBpbnRlZ2VyLiBQcmlvcml0eSBjYW4gdGFrZSB0aGUgZm9sbG93aW5nCisgICAgICogdmFsdWVzOgorICAgICAqIHtAbGluayBQUklPUklUWV9PTn0sIHtAbGluayBQUklPUklUWV9PRkZ9LCB7QGxpbmsgUFJJT1JJVFlfQVVUT19DT05ORUNUfQorICAgICAqCisgICAgICogQHBhcmFtIGRldmljZSBQYWlyZWQgZGV2aWNlLgorICAgICAqIEBwYXJhbSBwcmlvcml0eSBJbnRlZ2VyIHByaW9yaXR5CisgICAgICogQHJldHVybiB0cnVlIGlmIHByaW9yaXR5IGlzIHNldCwgZmFsc2Ugb24gZXJyb3IKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBzZXRJbnB1dERldmljZVByaW9yaXR5KEJsdWV0b290aERldmljZSBkZXZpY2UsIGludCBwcmlvcml0eSkgeworICAgICAgICBpZiAoREJHKSBsb2coInNldElucHV0RGV2aWNlUHJpb3JpdHkoIiArIGRldmljZSArICIsICIgKyBwcmlvcml0eSArICIpIik7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXR1cm4gbVNlcnZpY2Uuc2V0SW5wdXREZXZpY2VQcmlvcml0eShkZXZpY2UsIHByaW9yaXR5KTsKKyAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIExvZy5lKFRBRywgIiIsIGUpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSBwcmlvcml0eSBhc3NvY2lhdGVkIHdpdGggYW4gSW5wdXQgRGV2aWNlLgorICAgICAqCisgICAgICogQHBhcmFtIGRldmljZSBJbnB1dCBEZXZpY2UKKyAgICAgKiBAcmV0dXJuIG5vbi1uZWdhdGl2ZSBwcmlvcml0eSwgb3IgbmVnYXRpdmUgZXJyb3IgY29kZSBvbiBlcnJvci4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldElucHV0RGV2aWNlUHJpb3JpdHkoQmx1ZXRvb3RoRGV2aWNlIGRldmljZSkgeworICAgICAgICBpZiAoREJHKSBsb2coImdldElucHV0RGV2aWNlUHJpb3JpdHkoIiArIGRldmljZSArICIpIik7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXR1cm4gbVNlcnZpY2UuZ2V0SW5wdXREZXZpY2VQcmlvcml0eShkZXZpY2UpOworICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgTG9nLmUoVEFHLCAiIiwgZSk7CisgICAgICAgICAgICByZXR1cm4gUFJJT1JJVFlfT0ZGOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBsb2coU3RyaW5nIG1zZykgeworICAgICAgICBMb2cuZChUQUcsIG1zZyk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvYmx1ZXRvb3RoL0JsdWV0b290aFBhbi5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvYmx1ZXRvb3RoL0JsdWV0b290aFBhbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlkMGIzZjIKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9ibHVldG9vdGgvQmx1ZXRvb3RoUGFuLmphdmEKQEAgLTAsMCArMSwxOTIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQuYmx1ZXRvb3RoOworCitpbXBvcnQgYW5kcm9pZC5hbm5vdGF0aW9uLlNka0NvbnN0YW50OworaW1wb3J0IGFuZHJvaWQuYW5ub3RhdGlvbi5TZGtDb25zdGFudC5TZGtDb25zdGFudFR5cGU7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5vcy5TZXJ2aWNlTWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbjsKK2ltcG9ydCBhbmRyb2lkLm9zLklCaW5kZXI7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OworaW1wb3J0IGphdmEudXRpbC5TZXQ7CisKKy8qKgorICogQGhpZGUKKyAqLworcHVibGljIGZpbmFsIGNsYXNzIEJsdWV0b290aFBhbiB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJCbHVldG9vdGhQYW4iOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gREJHID0gZmFsc2U7CisKKyAgICAvKiogaW50IGV4dHJhIGZvciBBQ1RJT05fUEFOX1NUQVRFX0NIQU5HRUQgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRSQV9QQU5fU1RBVEUgPQorICAgICAgICAiYW5kcm9pZC5ibHVldG9vdGgucGFuLmV4dHJhLlNUQVRFIjsKKyAgICAvKiogaW50IGV4dHJhIGZvciBBQ1RJT05fUEFOX1NUQVRFX0NIQU5HRUQgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRSQV9QUkVWSU9VU19QQU5fU1RBVEUgPQorICAgICAgICAiYW5kcm9pZC5ibHVldG9vdGgucGFuLmV4dHJhLlBSRVZJT1VTX1NUQVRFIjsKKworICAgIC8qKiBJbmRpY2F0ZXMgdGhlIHN0YXRlIG9mIGFuIFBBTiBkZXZpY2UgaGFzIGNoYW5nZWQuCisgICAgICogVGhpcyBpbnRlbnQgd2lsbCBhbHdheXMgY29udGFpbiBFWFRSQV9ERVZJQ0VfU1RBVEUsCisgICAgICogRVhUUkFfUFJFVklPVVNfREVWSUNFX1NUQVRFIGFuZCBCbHVldG9vdGhEZXZpY2UuRVhUUkFfREVWSUNFCisgICAgICogZXh0cmFzLgorICAgICAqLworICAgIEBTZGtDb25zdGFudChTZGtDb25zdGFudFR5cGUuQlJPQURDQVNUX0lOVEVOVF9BQ1RJT04pCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUNUSU9OX1BBTl9TVEFURV9DSEFOR0VEID0KKyAgICAgICAgImFuZHJvaWQuYmx1ZXRvb3RoLnBhbi5hY3Rpb24uU1RBVEVfQ0hBTkdFRCI7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOQVBfUk9MRSA9ICJuYXAiOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5BUF9CUklER0UgPSAicGFuMSI7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNQVhfQ09OTkVDVElPTlMgPSA3OworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RBVEVfRElTQ09OTkVDVEVEID0gMDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVEFURV9DT05ORUNUSU5HICAgPSAxOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUQVRFX0NPTk5FQ1RFRCAgICA9IDI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RBVEVfRElTQ09OTkVDVElORyA9IDM7CisKKyAgICBwcml2YXRlIGZpbmFsIElCbHVldG9vdGggbVNlcnZpY2U7CisgICAgcHJpdmF0ZSBmaW5hbCBDb250ZXh0IG1Db250ZXh0OworCisgICAgLyoqCisgICAgICogQ3JlYXRlIGEgQmx1ZXRvb3RoUGFuIHByb3h5IG9iamVjdCBmb3IgaW50ZXJhY3Rpbmcgd2l0aCB0aGUgbG9jYWwKKyAgICAgKiBCbHVldG9vdGggUGFuIHNlcnZpY2UuCisgICAgICogQHBhcmFtIGMgQ29udGV4dAorICAgICAqLworICAgIHB1YmxpYyBCbHVldG9vdGhQYW4oQ29udGV4dCBjKSB7CisgICAgICAgIG1Db250ZXh0ID0gYzsKKworICAgICAgICBJQmluZGVyIGIgPSBTZXJ2aWNlTWFuYWdlci5nZXRTZXJ2aWNlKEJsdWV0b290aEFkYXB0ZXIuQkxVRVRPT1RIX1NFUlZJQ0UpOworICAgICAgICBpZiAoYiAhPSBudWxsKSB7CisgICAgICAgICAgICBtU2VydmljZSA9IElCbHVldG9vdGguU3R1Yi5hc0ludGVyZmFjZShiKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIExvZy53KFRBRywgIkJsdWV0b290aCBTZXJ2aWNlIG5vdCBhdmFpbGFibGUhIik7CisKKyAgICAgICAgICAgIC8vIEluc3RlYWQgb2YgdGhyb3dpbmcgYW4gZXhjZXB0aW9uIHdoaWNoIHByZXZlbnRzIHBlb3BsZSBmcm9tIGdvaW5nCisgICAgICAgICAgICAvLyBpbnRvIFdpcmVsZXNzIHNldHRpbmdzIGluIHRoZSBlbXVsYXRvci4gTGV0IGl0IGNyYXNoIGxhdGVyCisgICAgICAgICAgICAvLyB3aGVuIGl0IGlzIGFjdHVhbGx5IHVzZWQuCisgICAgICAgICAgICBtU2VydmljZSA9IG51bGw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJbml0aWF0ZSBhIFBBTiBjb25uZWN0aW9uLgorICAgICAqCisgICAgICogVGhpcyBmdW5jdGlvbiByZXR1cm5zIGZhbHNlIG9uIGVycm9yIGFuZCB0cnVlIGlmIHRoZSBjb25uZWN0aW9uCisgICAgICogYXR0ZW1wdCBpcyBiZWluZyBtYWRlLgorICAgICAqCisgICAgICogTGlzdGVuIGZvciB7QGxpbmsgI0FDVElPTl9QQU5fU1RBVEVfQ0hBTkdFRH0gdG8gZmluZCBvdXQgd2hlbiB0aGUKKyAgICAgKiBjb25uZWN0aW9uIGlzIGNvbXBsZXRlZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBkZXZpY2UgUmVtb3RlIEJUIGRldmljZS4KKyAgICAgKiBAcmV0dXJuIGZhbHNlIG9uIGltbWVkaWF0ZSBlcnJvciwgdHJ1ZSBvdGhlcndpc2UKKyAgICAgKiBAaGlkZQorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGNvbm5lY3QoQmx1ZXRvb3RoRGV2aWNlIGRldmljZSkgeworICAgICAgICBpZiAoREJHKSBsb2coImNvbm5lY3QoIiArIGRldmljZSArICIpIik7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXR1cm4gbVNlcnZpY2UuY29ubmVjdFBhbkRldmljZShkZXZpY2UpOworICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgTG9nLmUoVEFHLCAiIiwgZSk7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJbml0aWF0ZSBkaXNjb25uZWN0IGZyb20gUEFOLgorICAgICAqCisgICAgICogVGhpcyBmdW5jdGlvbiByZXR1cm4gZmFsc2Ugb24gZXJyb3IgYW5kIHRydWUgaWYgdGhlIGRpc2Nvbm5lY3Rpb24KKyAgICAgKiBhdHRlbXB0IGlzIGJlaW5nIG1hZGUuCisgICAgICoKKyAgICAgKiBMaXN0ZW4gZm9yIHtAbGluayAjQUNUSU9OX1BBTl9TVEFURV9DSEFOR0VEfSB0byBmaW5kIG91dCB3aGVuCisgICAgICogZGlzY29ubmVjdCBpcyBjb21wbGV0ZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZGV2aWNlIFJlbW90ZSBCVCBkZXZpY2UuCisgICAgICogQHJldHVybiBmYWxzZSBvbiBpbW1lZGlhdGUgZXJyb3IsIHRydWUgb3RoZXJ3aXNlCisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBkaXNjb25uZWN0KEJsdWV0b290aERldmljZSBkZXZpY2UpIHsKKyAgICAgICAgaWYgKERCRykgbG9nKCJkaXNjb25uZWN0KCIgKyBkZXZpY2UgKyAiKSIpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuIG1TZXJ2aWNlLmRpc2Nvbm5lY3RQYW5EZXZpY2UoZGV2aWNlKTsKKyAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIExvZy5lKFRBRywgIiIsIGUpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqIEdldCB0aGUgc3RhdGUgb2YgYSBQQU4gRGV2aWNlLgorICAgICoKKyAgICAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyBhbiBpbnQgcmVwcmVzZW50aW5nIHRoZSBzdGF0ZSBvZiB0aGUgUEFOIGNvbm5lY3Rpb24KKyAgICAqCisgICAgKiAgQHBhcmFtIGRldmljZSBSZW1vdGUgQlQgZGV2aWNlLgorICAgICogIEByZXR1cm4gVGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIFBBTiBEZXZpY2UKKyAgICAqICBAaGlkZQorICAgICovCisgICBwdWJsaWMgaW50IGdldFBhbkRldmljZVN0YXRlKEJsdWV0b290aERldmljZSBkZXZpY2UpIHsKKyAgICAgICBpZiAoREJHKSBsb2coImdldFBhbkRldmljZVN0YXRlKCIgKyBkZXZpY2UgKyAiKSIpOworICAgICAgIHRyeSB7CisgICAgICAgICAgIHJldHVybiBtU2VydmljZS5nZXRQYW5EZXZpY2VTdGF0ZShkZXZpY2UpOworICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgIExvZy5lKFRBRywgIiIsIGUpOworICAgICAgICAgICByZXR1cm4gU1RBVEVfRElTQ09OTkVDVEVEOworICAgICAgIH0KKyAgIH0KKworICAgLyoqIFJldHVybnMgYSBzZXQgb2YgYWxsIHRoZSBjb25uZWN0ZWQgUEFOIERldmljZXMKKyAgICoKKyAgICogRG9lcyBub3QgaW5jbHVkZSBkZXZpY2VzIHRoYXQgYXJlIGN1cnJlbnRseSBjb25uZWN0aW5nIG9yIGRpc2Nvbm5lY3RpbmcKKyAgICoKKyAgICogQHJldHVybiBhIHVubW9kaWZpYWJsZSBzZXQgb2YgY29ubmVjdGVkIFBBTiBEZXZpY2VzLCBvciBudWxsIG9uIGVycm9yLgorICAgKiBAaGlkZQorICAgKi8KKyAgIHB1YmxpYyBTZXQ8Qmx1ZXRvb3RoRGV2aWNlPiBnZXRDb25uZWN0ZWREZXZpY2VzKCkgeworICAgICAgaWYgKERCRykgbG9nKCJnZXRDb25uZWN0ZWREZXZpY2VzIik7CisgICAgICB0cnkgeworICAgICAgICAgIHJldHVybiBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVTZXQoCisgICAgICAgICAgICAgICAgICBuZXcgSGFzaFNldDxCbHVldG9vdGhEZXZpY2U+KAorICAgICAgICAgICAgICAgICAgICAgIEFycmF5cy5hc0xpc3QobVNlcnZpY2UuZ2V0Q29ubmVjdGVkUGFuRGV2aWNlcygpKSkpOworICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICBMb2cuZShUQUcsICIiLCBlKTsKKyAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgIH0KKyAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIHZvaWQgbG9nKFN0cmluZyBtc2cpIHsKKyAgICAgICAgTG9nLmQoVEFHLCBtc2cpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldEJsdWV0b290aFRldGhlcmluZyhib29sZWFuIHZhbHVlKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBtU2VydmljZS5zZXRCbHVldG9vdGhUZXRoZXJpbmcodmFsdWUpOworICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgTG9nLmUoVEFHLCAiIiwgZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBpc1RldGhlcmluZ09uKCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuIG1TZXJ2aWNlLmlzVGV0aGVyaW5nT24oKTsKKyAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIExvZy5lKFRBRywgIiIsIGUpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvYmx1ZXRvb3RoL0JsdWV0b290aFByb2ZpbGVTdGF0ZS5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvYmx1ZXRvb3RoL0JsdWV0b290aFByb2ZpbGVTdGF0ZS5qYXZhCmluZGV4IDk0NmRjYWEuLmFkNzBkMGQgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL2JsdWV0b290aC9CbHVldG9vdGhQcm9maWxlU3RhdGUuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9ibHVldG9vdGgvQmx1ZXRvb3RoUHJvZmlsZVN0YXRlLmphdmEKQEAgLTQzLDggKzQzLDkgQEAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIERCRyA9IHRydWU7IC8vIFNUT1BTSElQIC0gY2hhbmdlIHRvIGZhbHNlLgogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiQmx1ZXRvb3RoUHJvZmlsZVN0YXRlIjsKIAotICAgIHB1YmxpYyBzdGF0aWMgaW50IEhGUCA9IDA7Ci0gICAgcHVibGljIHN0YXRpYyBpbnQgQTJEUCA9IDE7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSEZQID0gMDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBMkRQID0gMTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBISUQgPSAyOwogCiAgICAgcHJpdmF0ZSBzdGF0aWMgaW50IFRSQU5TSVRJT05fVE9fU1RBQkxFID0gMTAwOwogCkBAIC03MCw2ICs3MSwxMiBAQAogICAgICAgICAgICAgICAgICAgICBuZXdTdGF0ZSA9PSBCbHVldG9vdGhBMmRwLlNUQVRFX0RJU0NPTk5FQ1RFRCkpIHsKICAgICAgICAgICAgICAgICAgICAgc2VuZE1lc3NhZ2UoVFJBTlNJVElPTl9UT19TVEFCTEUpOwogICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSBpZiAoYWN0aW9uLmVxdWFscyhCbHVldG9vdGhJbnB1dERldmljZS5BQ1RJT05fSU5QVVRfREVWSUNFX1NUQVRFX0NIQU5HRUQpKSB7CisgICAgICAgICAgICAgICAgaW50IG5ld1N0YXRlID0gaW50ZW50LmdldEludEV4dHJhKEJsdWV0b290aElucHV0RGV2aWNlLkVYVFJBX0lOUFVUX0RFVklDRV9TVEFURSwgMCk7CisgICAgICAgICAgICAgICAgaWYgKG1Qcm9maWxlID09IEhJRCAmJiAobmV3U3RhdGUgPT0gQmx1ZXRvb3RoSW5wdXREZXZpY2UuU1RBVEVfQ09OTkVDVEVEIHx8CisgICAgICAgICAgICAgICAgICAgIG5ld1N0YXRlID09IEJsdWV0b290aElucHV0RGV2aWNlLlNUQVRFX0RJU0NPTk5FQ1RFRCkpIHsKKyAgICAgICAgICAgICAgICAgICAgc2VuZE1lc3NhZ2UoVFJBTlNJVElPTl9UT19TVEFCTEUpOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH07CkBAIC04NCw2ICs5MSw3IEBACiAgICAgICAgIEludGVudEZpbHRlciBmaWx0ZXIgPSBuZXcgSW50ZW50RmlsdGVyKCk7CiAgICAgICAgIGZpbHRlci5hZGRBY3Rpb24oQmx1ZXRvb3RoQTJkcC5BQ1RJT05fU0lOS19TVEFURV9DSEFOR0VEKTsKICAgICAgICAgZmlsdGVyLmFkZEFjdGlvbihCbHVldG9vdGhIZWFkc2V0LkFDVElPTl9TVEFURV9DSEFOR0VEKTsKKyAgICAgICAgZmlsdGVyLmFkZEFjdGlvbihCbHVldG9vdGhJbnB1dERldmljZS5BQ1RJT05fSU5QVVRfREVWSUNFX1NUQVRFX0NIQU5HRUQpOwogICAgICAgICBjb250ZXh0LnJlZ2lzdGVyUmVjZWl2ZXIobUJyb2FkY2FzdFJlY2VpdmVyLCBmaWx0ZXIpOwogICAgIH0KIApkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvYmx1ZXRvb3RoL0JsdWV0b290aFV1aWQuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2JsdWV0b290aC9CbHVldG9vdGhVdWlkLmphdmEKaW5kZXggNDE2NGEzZC4uM2ZiZmM3MCAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvYmx1ZXRvb3RoL0JsdWV0b290aFV1aWQuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9ibHVldG9vdGgvQmx1ZXRvb3RoVXVpZC5qYXZhCkBAIC00OSwxMCArNDksMTggQEAKICAgICAgICAgICAgIFBhcmNlbFV1aWQuZnJvbVN0cmluZygiMDAwMDExMEMtMDAwMC0xMDAwLTgwMDAtMDA4MDVGOUIzNEZCIik7CiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBQYXJjZWxVdWlkIE9iZXhPYmplY3RQdXNoID0KICAgICAgICAgICAgIFBhcmNlbFV1aWQuZnJvbVN0cmluZygiMDAwMDExMDUtMDAwMC0xMDAwLTgwMDAtMDA4MDVmOWIzNGZiIik7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBQYXJjZWxVdWlkIEhpZCA9CisgICAgICAgICAgICBQYXJjZWxVdWlkLmZyb21TdHJpbmcoIjAwMDAxMTI0LTAwMDAtMTAwMC04MDAwLTAwODA1ZjliMzRmYiIpOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgUGFyY2VsVXVpZCBQQU5VID0KKyAgICAgICAgICAgIFBhcmNlbFV1aWQuZnJvbVN0cmluZygiMDAwMDExMTUtMDAwMC0xMDAwLTgwMDAtMDA4MDVGOUIzNEZCIik7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBQYXJjZWxVdWlkIE5BUCA9CisgICAgICAgICAgICBQYXJjZWxVdWlkLmZyb21TdHJpbmcoIjAwMDAxMTE2LTAwMDAtMTAwMC04MDAwLTAwODA1RjlCMzRGQiIpOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgUGFyY2VsVXVpZCBCTkVQID0KKyAgICAgICAgICAgIFBhcmNlbFV1aWQuZnJvbVN0cmluZygiMDAwMDAwMGYtMDAwMC0xMDAwLTgwMDAtMDA4MDVGOUIzNEZCIik7CiAKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFBhcmNlbFV1aWRbXSBSRVNFUlZFRF9VVUlEUyA9IHsKICAgICAgICAgQXVkaW9TaW5rLCBBdWRpb1NvdXJjZSwgQWR2QXVkaW9EaXN0LCBIU1AsIEhhbmRzZnJlZSwgQXZyY3BDb250cm9sbGVyLCBBdnJjcFRhcmdldCwKLSAgICAgICAgT2JleE9iamVjdFB1c2h9OworICAgICAgICBPYmV4T2JqZWN0UHVzaCwgUEFOVSwgTkFQfTsKIAogICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0F1ZGlvU291cmNlKFBhcmNlbFV1aWQgdXVpZCkgewogICAgICAgICByZXR1cm4gdXVpZC5lcXVhbHMoQXVkaW9Tb3VyY2UpOwpAQCAtODIsNiArOTAsMjEgQEAKICAgICAgICAgcmV0dXJuIHV1aWQuZXF1YWxzKEF2cmNwVGFyZ2V0KTsKICAgICB9CiAKKyAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNJbnB1dERldmljZShQYXJjZWxVdWlkIHV1aWQpIHsKKyAgICAgICAgcmV0dXJuIHV1aWQuZXF1YWxzKEhpZCk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzUGFudShQYXJjZWxVdWlkIHV1aWQpIHsKKyAgICAgICAgcmV0dXJuIHV1aWQuZXF1YWxzKFBBTlUpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc05hcChQYXJjZWxVdWlkIHV1aWQpIHsKKyAgICAgICAgcmV0dXJuIHV1aWQuZXF1YWxzKE5BUCk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzQm5lcChQYXJjZWxVdWlkIHV1aWQpIHsKKyAgICAgICAgcmV0dXJuIHV1aWQuZXF1YWxzKEJORVApOworICAgIH0KICAgICAvKioKICAgICAgKiBSZXR1cm5zIHRydWUgaWYgUGFyY2VsVXVpZCBpcyBwcmVzZW50IGluIHV1aWRBcnJheQogICAgICAqCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9ibHVldG9vdGgvSUJsdWV0b290aC5haWRsIGIvY29yZS9qYXZhL2FuZHJvaWQvYmx1ZXRvb3RoL0lCbHVldG9vdGguYWlkbAppbmRleCA2ZGQ4ZGQ2Li5jYzIzMTQ2IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9ibHVldG9vdGgvSUJsdWV0b290aC5haWRsCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2JsdWV0b290aC9JQmx1ZXRvb3RoLmFpZGwKQEAgLTE3LDYgKzE3LDcgQEAKIHBhY2thZ2UgYW5kcm9pZC5ibHVldG9vdGg7CiAKIGltcG9ydCBhbmRyb2lkLmJsdWV0b290aC5JQmx1ZXRvb3RoQ2FsbGJhY2s7CitpbXBvcnQgYW5kcm9pZC5ibHVldG9vdGguQmx1ZXRvb3RoRGV2aWNlOwogaW1wb3J0IGFuZHJvaWQub3MuUGFyY2VsVXVpZDsKIAogLyoqCkBAIC03Niw0ICs3NywxOSBAQAogICAgIGJvb2xlYW4gY29ubmVjdEhlYWRzZXQoU3RyaW5nIGFkZHJlc3MpOwogICAgIGJvb2xlYW4gZGlzY29ubmVjdEhlYWRzZXQoU3RyaW5nIGFkZHJlc3MpOwogICAgIGJvb2xlYW4gbm90aWZ5SW5jb21pbmdDb25uZWN0aW9uKFN0cmluZyBhZGRyZXNzKTsKKworICAgIC8vIEhJRCBwcm9maWxlIEFQSXMKKyAgICBib29sZWFuIGNvbm5lY3RJbnB1dERldmljZShpbiBCbHVldG9vdGhEZXZpY2UgZGV2aWNlKTsKKyAgICBib29sZWFuIGRpc2Nvbm5lY3RJbnB1dERldmljZShpbiBCbHVldG9vdGhEZXZpY2UgZGV2aWNlKTsKKyAgICBCbHVldG9vdGhEZXZpY2VbXSBnZXRDb25uZWN0ZWRJbnB1dERldmljZXMoKTsgIC8vIGNoYW5nZSB0byBTZXQ8PiBvbmNlIEFJREwgc3VwcG9ydHMKKyAgICBpbnQgZ2V0SW5wdXREZXZpY2VTdGF0ZShpbiBCbHVldG9vdGhEZXZpY2UgZGV2aWNlKTsKKyAgICBib29sZWFuIHNldElucHV0RGV2aWNlUHJpb3JpdHkoaW4gQmx1ZXRvb3RoRGV2aWNlIGRldmljZSwgaW50IHByaW9yaXR5KTsKKyAgICBpbnQgZ2V0SW5wdXREZXZpY2VQcmlvcml0eShpbiBCbHVldG9vdGhEZXZpY2UgZGV2aWNlKTsKKworICAgIGJvb2xlYW4gaXNUZXRoZXJpbmdPbigpOworICAgIHZvaWQgc2V0Qmx1ZXRvb3RoVGV0aGVyaW5nKGJvb2xlYW4gdmFsdWUpOworICAgIGludCBnZXRQYW5EZXZpY2VTdGF0ZShpbiBCbHVldG9vdGhEZXZpY2UgZGV2aWNlKTsKKyAgICBCbHVldG9vdGhEZXZpY2VbXSBnZXRDb25uZWN0ZWRQYW5EZXZpY2VzKCk7CisgICAgYm9vbGVhbiBjb25uZWN0UGFuRGV2aWNlKGluIEJsdWV0b290aERldmljZSBkZXZpY2UpOworICAgIGJvb2xlYW4gZGlzY29ubmVjdFBhbkRldmljZShpbiBCbHVldG9vdGhEZXZpY2UgZGV2aWNlKTsKIH0KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2JsdWV0b290aC9TY29Tb2NrZXQuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2JsdWV0b290aC9TY29Tb2NrZXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjY1YTk5YS4uMDAwMDAwMAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9ibHVldG9vdGgvU2NvU29ja2V0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgYW5kcm9pZC5ibHVldG9vdGg7Ci0KLWltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXI7Ci1pbXBvcnQgYW5kcm9pZC5vcy5NZXNzYWdlOwotaW1wb3J0IGFuZHJvaWQub3MuUG93ZXJNYW5hZ2VyOwotaW1wb3J0IGFuZHJvaWQub3MuUG93ZXJNYW5hZ2VyLldha2VMb2NrOwotaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7Ci0KLS8qKgotICogVGhlIEFuZHJvaWQgQmx1ZXRvb3RoIEFQSSBpcyBub3QgZmluYWxpemVkLCBhbmQgKndpbGwqIGNoYW5nZS4gVXNlIGF0IHlvdXIKLSAqIG93biByaXNrLgotICoKLSAqIFNpbXBsZSBTQ08gU29ja2V0LgotICogQ3VycmVudGx5IGluIEFuZHJvaWQsIHRoZXJlIGlzIG5vIHN1cHBvcnQgZm9yIHNlbmRpbmcgZGF0YSBvdmVyIGEgU0NPCi0gKiBzb2NrZXQgLSB0aGlzIGlzIG1hbmFnZWQgYnkgdGhlIGhhcmR3YXJlIGxpbmsgdG8gdGhlIEJsdWV0b290aCBDaGlwLiBUaGlzCi0gKiBjbGFzcyBpcyBpbnN0ZWFkIGludGVuZGVkIGZvciBtYW5hZ2VtZW50IG9mIHRoZSBTQ08gc29ja2V0IGxpZmV0aW1lLCAKLSAqIGFuZCBpcyB0YWlsb3JlZCBmb3IgdXNlIHdpdGggdGhlIGhlYWRzZXQgLyBoYW5kc2ZyZWUgcHJvZmlsZXMuCi0gKiBAaGlkZQotICovCi1wdWJsaWMgY2xhc3MgU2NvU29ja2V0IHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIlNjb1NvY2tldCI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBEQkcgPSB0cnVlOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gVkRCRyA9IGZhbHNlOyAgLy8gZXZlbiBtb3JlIGxvZ2dpbmcKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUQVRFX1JFQURZID0gMTsgICAgLy8gUmVhZHkgZm9yIHVzZS4gTm8gdGhyZWFkcyBvciBzb2NrZXRzCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RBVEVfQUNDRVBUID0gMjsgICAvLyBhY2NlcHQoKSB0aHJlYWQgcnVubmluZwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUQVRFX0NPTk5FQ1RJTkcgPSAzOyAgLy8gY29ubmVjdCgpIHRocmVhZCBydW5uaW5nCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RBVEVfQ09OTkVDVEVEID0gNDsgICAvLyBjb25uZWN0ZWQsIHdhaXRpbmcgZm9yIGNsb3NlKCkKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVEFURV9DTE9TRUQgPSA1OyAgIC8vIHdhcyBjb25uZWN0ZWQsIG5vdyBjbG9zZWQuCi0KLSAgICBwcml2YXRlIGludCBtU3RhdGU7Ci0gICAgcHJpdmF0ZSBpbnQgbU5hdGl2ZURhdGE7Ci0gICAgcHJpdmF0ZSBIYW5kbGVyIG1IYW5kbGVyOwotICAgIHByaXZhdGUgaW50IG1BY2NlcHRlZENvZGU7Ci0gICAgcHJpdmF0ZSBpbnQgbUNvbm5lY3RlZENvZGU7Ci0gICAgcHJpdmF0ZSBpbnQgbUNsb3NlZENvZGU7Ci0KLSAgICBwcml2YXRlIFdha2VMb2NrIG1XYWtlTG9jazsgIC8vIGhlbGQgd2hpbGUgaW4gU1RBVEVfQ09OTkVDVElORwotCi0gICAgc3RhdGljIHsKLSAgICAgICAgY2xhc3NJbml0TmF0aXZlKCk7Ci0gICAgfQotICAgIHByaXZhdGUgbmF0aXZlIHN0YXRpYyB2b2lkIGNsYXNzSW5pdE5hdGl2ZSgpOwotCi0gICAgcHVibGljIFNjb1NvY2tldChQb3dlck1hbmFnZXIgcG0sIEhhbmRsZXIgaGFuZGxlciwgaW50IGFjY2VwdGVkQ29kZSwgaW50IGNvbm5lY3RlZENvZGUsCi0gICAgICAgICAgICAgICAgICAgICBpbnQgY2xvc2VkQ29kZSkgewotICAgICAgICBpbml0TmF0aXZlKCk7Ci0gICAgICAgIG1TdGF0ZSA9IFNUQVRFX1JFQURZOwotICAgICAgICBtSGFuZGxlciA9IGhhbmRsZXI7Ci0gICAgICAgIG1BY2NlcHRlZENvZGUgPSBhY2NlcHRlZENvZGU7Ci0gICAgICAgIG1Db25uZWN0ZWRDb2RlID0gY29ubmVjdGVkQ29kZTsKLSAgICAgICAgbUNsb3NlZENvZGUgPSBjbG9zZWRDb2RlOwotICAgICAgICBtV2FrZUxvY2sgPSBwbS5uZXdXYWtlTG9jayhQb3dlck1hbmFnZXIuUEFSVElBTF9XQUtFX0xPQ0ssICJTY29Tb2NrZXQiKTsKLSAgICAgICAgbVdha2VMb2NrLnNldFJlZmVyZW5jZUNvdW50ZWQoZmFsc2UpOwotICAgICAgICBpZiAoVkRCRykgbG9nKHRoaXMgKyAiIFNDTyBPQkpFQ1QgQ1RPUiIpOwotICAgIH0KLSAgICBwcml2YXRlIG5hdGl2ZSB2b2lkIGluaXROYXRpdmUoKTsKLQotICAgIHByb3RlY3RlZCB2b2lkIGZpbmFsaXplKCkgdGhyb3dzIFRocm93YWJsZSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBpZiAoVkRCRykgbG9nKHRoaXMgKyAiIFNDTyBPQkpFQ1QgRFRPUiIpOwotICAgICAgICAgICAgZGVzdHJveU5hdGl2ZSgpOwotICAgICAgICAgICAgcmVsZWFzZVdha2VMb2NrTm93KCk7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBzdXBlci5maW5hbGl6ZSgpOwotICAgICAgICB9Ci0gICAgfQotICAgIHByaXZhdGUgbmF0aXZlIHZvaWQgZGVzdHJveU5hdGl2ZSgpOwotCi0gICAgLyoqIENvbm5lY3QgdGhpcyBTQ08gc29ja2V0IHRvIHRoZSBnaXZlbiBCVCBhZGRyZXNzLgotICAgICAqICBEb2VzIG5vdCBibG9jay4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4gY29ubmVjdChTdHJpbmcgYWRkcmVzcywgU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgaWYgKERCRykgbG9nKCJjb25uZWN0KCkgIiArIHRoaXMpOwotICAgICAgICBpZiAobVN0YXRlICE9IFNUQVRFX1JFQURZKSB7Ci0gICAgICAgICAgICBpZiAoREJHKSBsb2coImNvbm5lY3QoKTogQmFkIHN0YXRlIik7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgYWNxdWlyZVdha2VMb2NrKCk7Ci0gICAgICAgIGlmIChjb25uZWN0TmF0aXZlKGFkZHJlc3MsIG5hbWUpKSB7Ci0gICAgICAgICAgICBtU3RhdGUgPSBTVEFURV9DT05ORUNUSU5HOwotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtU3RhdGUgPSBTVEFURV9DTE9TRUQ7Ci0gICAgICAgICAgICByZWxlYXNlV2FrZUxvY2tOb3coKTsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgIH0KLSAgICBwcml2YXRlIG5hdGl2ZSBib29sZWFuIGNvbm5lY3ROYXRpdmUoU3RyaW5nIGFkZHJlc3MsIFN0cmluZyBuYW1lKTsKLQotICAgIC8qKiBBY2NlcHQgaW5jb21pbmcgU0NPIGNvbm5lY3Rpb25zLgotICAgICAqICBEb2VzIG5vdCBibG9jay4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4gYWNjZXB0KCkgewotICAgICAgICBpZiAoVkRCRykgbG9nKCJhY2NlcHQoKSAiICsgdGhpcyk7Ci0gICAgICAgIGlmIChtU3RhdGUgIT0gU1RBVEVfUkVBRFkpIHsKLSAgICAgICAgICAgIGlmIChEQkcpIGxvZygiQmFkIHN0YXRlIik7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGFjY2VwdE5hdGl2ZSgpKSB7Ci0gICAgICAgICAgICBtU3RhdGUgPSBTVEFURV9BQ0NFUFQ7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1TdGF0ZSA9IFNUQVRFX0NMT1NFRDsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgIH0KLSAgICBwcml2YXRlIG5hdGl2ZSBib29sZWFuIGFjY2VwdE5hdGl2ZSgpOwotCi0gICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIGNsb3NlKCkgewotICAgICAgICBpZiAoREJHKSBsb2codGhpcyArICIgU0NPIE9CSkVDVCBjbG9zZSgpIG1TdGF0ZSA9ICIgKyBtU3RhdGUpOwotICAgICAgICBhY3F1aXJlV2FrZUxvY2soKTsKLSAgICAgICAgbVN0YXRlID0gU1RBVEVfQ0xPU0VEOwotICAgICAgICBjbG9zZU5hdGl2ZSgpOwotICAgICAgICByZWxlYXNlV2FrZUxvY2soKTsKLSAgICB9Ci0gICAgcHJpdmF0ZSBuYXRpdmUgdm9pZCBjbG9zZU5hdGl2ZSgpOwotCi0gICAgcHVibGljIHN5bmNocm9uaXplZCBpbnQgZ2V0U3RhdGUoKSB7Ci0gICAgICAgIHJldHVybiBtU3RhdGU7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzeW5jaHJvbml6ZWQgdm9pZCBvbkNvbm5lY3RlZChpbnQgcmVzdWx0KSB7Ci0gICAgICAgIGlmIChWREJHKSBsb2codGhpcyArICIgb25Db25uZWN0ZWQoKSBtU3RhdGUgPSAiICsgbVN0YXRlICsgIiAiICsgdGhpcyk7Ci0gICAgICAgIGlmIChtU3RhdGUgIT0gU1RBVEVfQ09OTkVDVElORykgewotICAgICAgICAgICAgaWYgKERCRykgbG9nKCJTdHJhbmdlIHN0YXRlLCBjbG9zaW5nICIgKyBtU3RhdGUgKyAiICIgKyB0aGlzKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBpZiAocmVzdWx0ID49IDApIHsKLSAgICAgICAgICAgIG1TdGF0ZSA9IFNUQVRFX0NPTk5FQ1RFRDsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1TdGF0ZSA9IFNUQVRFX0NMT1NFRDsKLSAgICAgICAgfQotICAgICAgICBtSGFuZGxlci5vYnRhaW5NZXNzYWdlKG1Db25uZWN0ZWRDb2RlLCBtU3RhdGUsIC0xLCB0aGlzKS5zZW5kVG9UYXJnZXQoKTsKLSAgICAgICAgcmVsZWFzZVdha2VMb2NrTm93KCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzeW5jaHJvbml6ZWQgdm9pZCBvbkFjY2VwdGVkKGludCByZXN1bHQpIHsKLSAgICAgICAgaWYgKFZEQkcpIGxvZygib25BY2NlcHRlZCgpICIgKyB0aGlzKTsKLSAgICAgICAgaWYgKG1TdGF0ZSAhPSBTVEFURV9BQ0NFUFQpIHsKLSAgICAgICAgICAgIGlmIChEQkcpIGxvZygiU3RyYW5nZSBzdGF0ZSAiICsgdGhpcyk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHJlc3VsdCA+PSAwKSB7Ci0gICAgICAgICAgICBtU3RhdGUgPSBTVEFURV9DT05ORUNURUQ7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtU3RhdGUgPSBTVEFURV9DTE9TRUQ7Ci0gICAgICAgIH0KLSAgICAgICAgbUhhbmRsZXIub2J0YWluTWVzc2FnZShtQWNjZXB0ZWRDb2RlLCBtU3RhdGUsIC0xLCB0aGlzKS5zZW5kVG9UYXJnZXQoKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN5bmNocm9uaXplZCB2b2lkIG9uQ2xvc2VkKCkgewotICAgICAgICBpZiAoREJHKSBsb2coIm9uQ2xvc2VkKCkgIiArIHRoaXMpOwotICAgICAgICBpZiAobVN0YXRlICE9IFNUQVRFX0NMT1NFRCkgewotICAgICAgICAgICAgbVN0YXRlID0gU1RBVEVfQ0xPU0VEOwotICAgICAgICAgICAgbUhhbmRsZXIub2J0YWluTWVzc2FnZShtQ2xvc2VkQ29kZSwgbVN0YXRlLCAtMSwgdGhpcykuc2VuZFRvVGFyZ2V0KCk7Ci0gICAgICAgICAgICByZWxlYXNlV2FrZUxvY2soKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBhY3F1aXJlV2FrZUxvY2soKSB7Ci0gICAgICAgIGlmICghbVdha2VMb2NrLmlzSGVsZCgpKSB7Ci0gICAgICAgICAgICBtV2FrZUxvY2suYWNxdWlyZSgpOwotICAgICAgICAgICAgaWYgKFZEQkcpIGxvZygibVdha2VMb2NrLmFjcXVpcmUoKSAiICsgdGhpcyk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgcmVsZWFzZVdha2VMb2NrKCkgewotICAgICAgICBpZiAobVdha2VMb2NrLmlzSGVsZCgpKSB7Ci0gICAgICAgICAgICAvLyBLZWVwIGFwcHMgcHJvY2Vzc29yIGF3YWtlIGZvciBhIGZ1cnRoZXIgMiBzZWNvbmRzLgotICAgICAgICAgICAgLy8gVGhpcyBpcyBhIGhhY2sgdG8gcmVzb2x2ZSBpc3N1ZSBodHRwOi8vYi8xNjE2MjYzIC0gaW4gd2hpY2gKLSAgICAgICAgICAgIC8vIHdlIGFyZSBsZWZ0IGluIGEgODAgbUEgcG93ZXIgc3RhdGUgd2hlbiByZW1vdGVseSB0ZXJtaW5hdGluZyBhCi0gICAgICAgICAgICAvLyBjYWxsIHdoaWxlIGNvbm5lY3RlZCB0byBCVCBoZWFkc2V0ICJIVEMgQkggUzEwMCAiIHdpdGggQTJEUCBhbmQKLSAgICAgICAgICAgIC8vIEhGUCBwcm9maWxlcy4KLSAgICAgICAgICAgIGlmIChWREJHKSBsb2coIm1XYWtlTG9jay5yZWxlYXNlKCkgaW4gMiBzZWMiICsgdGhpcyk7Ci0gICAgICAgICAgICBtV2FrZUxvY2suYWNxdWlyZSgyMDAwKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCByZWxlYXNlV2FrZUxvY2tOb3coKSB7Ci0gICAgICAgIGlmIChtV2FrZUxvY2suaXNIZWxkKCkpIHsKLSAgICAgICAgICAgIGlmIChWREJHKSBsb2coIm1XYWtlTG9jay5yZWxlYXNlKCkgbm93IiArIHRoaXMpOwotICAgICAgICAgICAgbVdha2VMb2NrLnJlbGVhc2UoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBsb2coU3RyaW5nIG1zZykgewotICAgICAgICBMb2cuZChUQUcsIG1zZyk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9Bc3luY1Rhc2tMb2FkZXIuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvQXN5bmNUYXNrTG9hZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjE5YzA3MgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvQXN5bmNUYXNrTG9hZGVyLmphdmEKQEAgLTAsMCArMSwxMDcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQuY29udGVudDsKKworaW1wb3J0IGFuZHJvaWQub3MuQXN5bmNUYXNrOworCisvKioKKyAqIEFic3RyYWN0IExvYWRlciB0aGF0IHByb3ZpZGVzIGFuIHtAbGluayBBc3luY1Rhc2t9IHRvIGRvIHRoZSB3b3JrLgorICoKKyAqIEBwYXJhbSA8RD4gdGhlIGRhdGEgdHlwZSB0byBiZSBsb2FkZWQuCisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBBc3luY1Rhc2tMb2FkZXI8RD4gZXh0ZW5kcyBMb2FkZXI8RD4geworICAgIGZpbmFsIGNsYXNzIExvYWRUYXNrIGV4dGVuZHMgQXN5bmNUYXNrPFZvaWQsIFZvaWQsIEQ+IHsKKworICAgICAgICBwcml2YXRlIEQgcmVzdWx0OworCisgICAgICAgIC8qIFJ1bnMgb24gYSB3b3JrZXIgdGhyZWFkICovCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwcm90ZWN0ZWQgRCBkb0luQmFja2dyb3VuZChWb2lkLi4uIHBhcmFtcykgeworICAgICAgICAgICAgcmVzdWx0ID0gQXN5bmNUYXNrTG9hZGVyLnRoaXMubG9hZEluQmFja2dyb3VuZCgpOworICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgfQorCisgICAgICAgIC8qIFJ1bnMgb24gdGhlIFVJIHRocmVhZCAqLworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHJvdGVjdGVkIHZvaWQgb25Qb3N0RXhlY3V0ZShEIGRhdGEpIHsKKyAgICAgICAgICAgIEFzeW5jVGFza0xvYWRlci50aGlzLmRpc3BhdGNoT25Mb2FkQ29tcGxldGUoZGF0YSk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHJvdGVjdGVkIHZvaWQgb25DYW5jZWxsZWQoKSB7CisgICAgICAgICAgICBBc3luY1Rhc2tMb2FkZXIudGhpcy5vbkNhbmNlbGxlZChyZXN1bHQpOworICAgICAgICB9CisgICAgfQorCisgICAgTG9hZFRhc2sgbVRhc2s7CisKKyAgICBwdWJsaWMgQXN5bmNUYXNrTG9hZGVyKENvbnRleHQgY29udGV4dCkgeworICAgICAgICBzdXBlcihjb250ZXh0KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBGb3JjZSBhbiBhc3luY2hyb25vdXMgbG9hZC4gVW5saWtlIHtAbGluayAjc3RhcnRMb2FkaW5nKCl9IHRoaXMgd2lsbCBpZ25vcmUgYSBwcmV2aW91c2x5CisgICAgICogbG9hZGVkIGRhdGEgc2V0IGFuZCBsb2FkIGEgbmV3IG9uZS4KKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBmb3JjZUxvYWQoKSB7CisgICAgICAgIGNhbmNlbExvYWQoKTsKKyAgICAgICAgbVRhc2sgPSBuZXcgTG9hZFRhc2soKTsKKyAgICAgICAgbVRhc2suZXhlY3V0ZSgoVm9pZFtdKSBudWxsKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBdHRlbXB0IHRvIGNhbmNlbCB0aGUgY3VycmVudCBsb2FkIHRhc2suIFNlZSB7QGxpbmsgQXN5bmNUYXNrI2NhbmNlbChib29sZWFuKX0KKyAgICAgKiBmb3IgbW9yZSBpbmZvLgorICAgICAqCisgICAgICogQHJldHVybiA8dHQ+ZmFsc2U8L3R0PiBpZiB0aGUgdGFzayBjb3VsZCBub3QgYmUgY2FuY2VsZWQsCisgICAgICogICAgICAgICB0eXBpY2FsbHkgYmVjYXVzZSBpdCBoYXMgYWxyZWFkeSBjb21wbGV0ZWQgbm9ybWFsbHksIG9yCisgICAgICogICAgICAgICBiZWNhdXNlIHtAbGluayAjc3RhcnRMb2FkaW5nKCl9IGhhc24ndCBiZWVuIGNhbGxlZCwgYW5kCisgICAgICogICAgICAgICA8dHQ+dHJ1ZTwvdHQ+IG90aGVyd2lzZQorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGNhbmNlbExvYWQoKSB7CisgICAgICAgIGlmIChtVGFzayAhPSBudWxsKSB7CisgICAgICAgICAgICBib29sZWFuIGNhbmNlbGxlZCA9IG1UYXNrLmNhbmNlbChmYWxzZSk7CisgICAgICAgICAgICBtVGFzayA9IG51bGw7CisgICAgICAgICAgICByZXR1cm4gY2FuY2VsbGVkOworICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDYWxsZWQgaWYgdGhlIHRhc2sgd2FzIGNhbmNlbGVkIGJlZm9yZSBpdCB3YXMgY29tcGxldGVkLiAgR2l2ZXMgdGhlIGNsYXNzIGEgY2hhbmNlCisgICAgICogdG8gcHJvcGVybHkgZGlzcG9zZSBvZiB0aGUgcmVzdWx0LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIG9uQ2FuY2VsbGVkKEQgZGF0YSkgeworICAgIH0KKworICAgIHZvaWQgZGlzcGF0Y2hPbkxvYWRDb21wbGV0ZShEIGRhdGEpIHsKKyAgICAgICAgbVRhc2sgPSBudWxsOworICAgICAgICBkZWxpdmVyUmVzdWx0KGRhdGEpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENhbGxlZCBvbiBhIHdvcmtlciB0aHJlYWQgdG8gcGVyZm9ybSB0aGUgYWN0dWFsIGxvYWQuIEltcGxlbWVudGF0aW9ucyBzaG91bGQgbm90IGRlbGl2ZXIgdGhlCisgICAgICogcmVzdWx0cyBkaXJlY3RseSwgYnV0IHNob3VsZCByZXR1cm4gdGhlbSBmcm9tIHRoaXMgbWV0aG9kLCB3aGljaCB3aWxsIGV2ZW50dWFsbHkgZW5kIHVwCisgICAgICogY2FsbGluZyBkZWxpdmVyUmVzdWx0IG9uIHRoZSBVSSB0aHJlYWQuIElmIGltcGxlbWVudGF0aW9ucyBuZWVkIHRvIHByb2Nlc3MKKyAgICAgKiB0aGUgcmVzdWx0cyBvbiB0aGUgVUkgdGhyZWFkIHRoZXkgbWF5IG92ZXJyaWRlIGRlbGl2ZXJSZXN1bHQgYW5kIGRvIHNvCisgICAgICogdGhlcmUuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgdGhlIGxvYWQKKyAgICAgKi8KKyAgICBwdWJsaWMgYWJzdHJhY3QgRCBsb2FkSW5CYWNrZ3JvdW5kKCk7Cit9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L0NsaXBEYXRhLmFpZGwgYi9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L0NsaXBEYXRhLmFpZGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWZjMTJjZQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvQ2xpcERhdGEuYWlkbApAQCAtMCwwICsxLDE5IEBACisvKioKKyAqIENvcHlyaWdodCAoYykgMjAxMCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5jb250ZW50OworCitwYXJjZWxhYmxlIENsaXBEYXRhOwpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9DbGlwRGF0YS5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9DbGlwRGF0YS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmExOWIxMzIKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L0NsaXBEYXRhLmphdmEKQEAgLTAsMCArMSw0OTQgQEAKKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDEwLCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLmNvbnRlbnQ7CisKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLkFzc2V0RmlsZURlc2NyaXB0b3I7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5CaXRtYXA7CitpbXBvcnQgYW5kcm9pZC5uZXQuVXJpOworaW1wb3J0IGFuZHJvaWQub3MuUGFyY2VsOworaW1wb3J0IGFuZHJvaWQub3MuUGFyY2VsYWJsZTsKK2ltcG9ydCBhbmRyb2lkLnRleHQuVGV4dFV0aWxzOworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW1SZWFkZXI7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKKworLyoqCisgKiBSZXByZXNlbnRhdGlvbiBvZiBhIGNsaXBwZWQgZGF0YSBvbiB0aGUgY2xpcGJvYXJkLgorICoKKyAqIDxwPkNsaXBwZWREYXRhIGlzIGEgY29tcGxleCB0eXBlIGNvbnRhaW5pbmcgb25lIG9yIEl0ZW0gaW5zdGFuY2VzLAorICogZWFjaCBvZiB3aGljaCBjYW4gaG9sZCBvbmUgb3IgbW9yZSByZXByZXNlbnRhdGlvbnMgb2YgYW4gaXRlbSBvZiBkYXRhLgorICogRm9yIGRpc3BsYXkgdG8gdGhlIHVzZXIsIGl0IGFsc28gaGFzIGEgbGFiZWwgYW5kIGljb25pYyByZXByZXNlbnRhdGlvbi48L3A+CisgKgorICogPHA+QSBDbGlwRGF0YSBpcyBhIHN1Yi1jbGFzcyBvZiB7QGxpbmsgQ2xpcERlc2NyaXB0aW9ufSwgd2hpY2ggZGVzY3JpYmVzCisgKiBpbXBvcnRhbnQgbWV0YS1kYXRhIGFib3V0IHRoZSBjbGlwLiAgSW4gcGFydGljdWxhciwgaXRzIHtAbGluayAjZ2V0TWltZVR5cGUoaW50KX0KKyAqIG11c3QgcmV0dXJuIGNvcnJlY3QgTUlNRSB0eXBlKHMpIGRlc2NyaWJpbmcgdGhlIGRhdGEgaW4gdGhlIGNsaXAuICBGb3IgaGVscAorICogaW4gY29ycmVjdGx5IGNvbnN0cnVjdGluZyBhIGNsaXAgd2l0aCB0aGUgY29ycmVjdCBNSU1FIHR5cGUsIHVzZQorICoge0BsaW5rICNuZXdQbGFpblRleHQoQ2hhclNlcXVlbmNlLCBCaXRtYXAsIENoYXJTZXF1ZW5jZSl9LAorICoge0BsaW5rICNuZXdVcmkoQ29udGVudFJlc29sdmVyLCBDaGFyU2VxdWVuY2UsIEJpdG1hcCwgVXJpKX0sIGFuZAorICoge0BsaW5rICNuZXdJbnRlbnQoQ2hhclNlcXVlbmNlLCBCaXRtYXAsIEludGVudCl9LgorICoKKyAqIDxwPkVhY2ggSXRlbSBpbnN0YW5jZSBjYW4gYmUgb25lIG9mIHRocmVlIG1haW4gY2xhc3NlcyBvZiBkYXRhOiBhIHNpbXBsZQorICogQ2hhclNlcXVlbmNlIG9mIHRleHQsIGEgc2luZ2xlIEludGVudCBvYmplY3QsIG9yIGEgVXJpLiAgU2VlIHtAbGluayBJdGVtfQorICogZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiA8YSBuYW1lPSJJbXBsZW1lbnRpbmdQYXN0ZSI+PC9hPgorICogPGgzPkltcGxlbWVudGluZyBQYXN0ZSBvciBEcm9wPC9oMz4KKyAqCisgKiA8cD5UbyBpbXBsZW1lbnQgYSBwYXN0ZSBvciBkcm9wIG9mIGEgQ2xpcHBlZERhdGEgb2JqZWN0IGludG8gYW4gYXBwbGljYXRpb24sCisgKiB0aGUgYXBwbGljYXRpb24gbXVzdCBjb3JyZWN0bHkgaW50ZXJwcmV0IHRoZSBkYXRhIGZvciBpdHMgdXNlLiAgSWYgdGhlIHtAbGluayBJdGVtfQorICogaXQgY29udGFpbnMgaXMgc2ltcGxlIHRleHQgb3IgYW4gSW50ZW50LCB0aGVyZSBpcyBsaXR0bGUgdG8gYmUgZG9uZTogdGV4dAorICogY2FuIG9ubHkgYmUgaW50ZXJwcmV0ZWQgYXMgdGV4dCwgYW5kIGFuIEludGVudCB3aWxsIHR5cGljYWxseSBiZSB1c2VkIGZvcgorICogY3JlYXRpbmcgc2hvcnRjdXRzIChzdWNoIGFzIHBsYWNpbmcgaWNvbnMgb24gdGhlIGhvbWUgc2NyZWVuKSBvciBvdGhlcgorICogYWN0aW9ucy4KKyAqCisgKiA8cD5JZiBhbGwgeW91IHdhbnQgaXMgdGhlIHRleHR1YWwgcmVwcmVzZW50YXRpb24gb2YgdGhlIGNsaXBwZWQgZGF0YSwgeW91CisgKiBjYW4gdXNlIHRoZSBjb252ZW5pZW5jZSBtZXRob2Qge0BsaW5rIEl0ZW0jY29lcmNlVG9UZXh0IEl0ZW0uY29lcmNlVG9UZXh0fS4KKyAqIEluIHRoaXMgY2FzZSB0aGVyZSBpcyBnZW5lcmFsbHkgbm8gbmVlZCB0byB3b3JyeSBhYm91dCB0aGUgTUlNRSB0eXBlcworICogcmVwb3J0ZWQgYnkge0BsaW5rICNnZXRNaW1lVHlwZShpbnQpfSwgc2luY2UgYW55IGNsaXAgaXRlbSBhbiBhbHdheXMgYmUKKyAqIGNvbnZlcnRlZCB0byBhIHN0cmluZy4KKyAqCisgKiA8cD5Nb3JlIGNvbXBsaWNhdGVkIGV4Y2hhbmdlcyB3aWxsIGJlIGRvbmUgdGhyb3VnaCBVUklzLCBpbiBwYXJ0aWN1bGFyCisgKiAiY29udGVudDoiIFVSSXMuICBBIGNvbnRlbnQgVVJJIGFsbG93cyB0aGUgcmVjaXBpZW50IG9mIGEgQ2xpcHBlZERhdGEgaXRlbQorICogdG8gaW50ZXJhY3QgY2xvc2VseSB3aXRoIHRoZSBDb250ZW50UHJvdmlkZXIgaG9sZGluZyB0aGUgZGF0YSBpbiBvcmRlciB0bworICogbmVnb3RpYXRlIHRoZSB0cmFuc2ZlciBvZiB0aGF0IGRhdGEuICBUaGUgY2xpcCBtdXN0IGFsc28gYmUgZmlsbGVkIGluIHdpdGgKKyAqIHRoZSBhdmFpbGFibGUgTUlNRSB0eXBlczsge0BsaW5rICNuZXdVcmkoQ29udGVudFJlc29sdmVyLCBDaGFyU2VxdWVuY2UsIEJpdG1hcCwgVXJpKX0KKyAqIHdpbGwgdGFrZSBjYXJlIG9mIGNvcnJlY3RseSBkb2luZyB0aGlzLgorICoKKyAqIDxwPkZvciBleGFtcGxlLCBoZXJlIGlzIHRoZSBwYXN0ZSBmdW5jdGlvbiBvZiBhIHNpbXBsZSBOb3RlUGFkIGFwcGxpY2F0aW9uLgorICogV2hlbiByZXRyaWV2aW5nIHRoZSBkYXRhIGZyb20gdGhlIGNsaXBib2FyZCwgaXQgY2FuIGRvIGVpdGhlciB0d28gdGhpbmdzOgorICogaWYgdGhlIGNsaXBib2FyZCBjb250YWlucyBhIFVSSSByZWZlcmVuY2UgdG8gYW4gZXhpc3Rpbmcgbm90ZSwgaXQgY29waWVzCisgKiB0aGUgZW50aXJlIHN0cnVjdHVyZSBvZiB0aGUgbm90ZSBpbnRvIGEgbmV3IG5vdGU7IG90aGVyd2lzZSwgaXQgc2ltcGx5CisgKiBjb2VyY2VzIHRoZSBjbGlwIGludG8gdGV4dCBhbmQgdXNlcyB0aGF0IGFzIHRoZSBuZXcgbm90ZSdzIGNvbnRlbnRzLgorICoKKyAqIHtAc2FtcGxlIGRldmVsb3BtZW50L3NhbXBsZXMvTm90ZVBhZC9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9ub3RlcGFkL05vdGVFZGl0b3IuamF2YQorICogICAgICBwYXN0ZX0KKyAqCisgKiA8cD5JbiBtYW55IGNhc2VzIGFuIGFwcGxpY2F0aW9uIGNhbiBwYXN0ZSB2YXJpb3VzIHR5cGVzIG9mIHN0cmVhbXMgb2YgZGF0YS4gIEZvcgorICogZXhhbXBsZSwgYW4gZS1tYWlsIGFwcGxpY2F0aW9uIG1heSB3YW50IHRvIGFsbG93IHRoZSB1c2VyIHRvIHBhc3RlIGFuIGltYWdlCisgKiBvciBvdGhlciBiaW5hcnkgZGF0YSBhcyBhbiBhdHRhY2htZW50LiAgVGhpcyBpcyBhY2NvbXBsaXNoZWQgdGhyb3VnaCB0aGUKKyAqIENvbnRlbnRSZXNvbHZlciB7QGxpbmsgQ29udGVudFJlc29sdmVyI2dldFN0cmVhbVR5cGVzKFVyaSwgU3RyaW5nKX0gYW5kCisgKiB7QGxpbmsgQ29udGVudFJlc29sdmVyI29wZW5UeXBlZEFzc2V0RmlsZURlc2NyaXB0b3IoVXJpLCBTdHJpbmcsIGFuZHJvaWQub3MuQnVuZGxlKX0KKyAqIG1ldGhvZHMuICBUaGVzZSBhbGxvdyBhIGNsaWVudCB0byBkaXNjb3ZlciB0aGUgdHlwZShzKSBvZiBkYXRhIHRoYXQgYSBwYXJ0aWN1bGFyCisgKiBjb250ZW50IFVSSSBjYW4gbWFrZSBhdmFpbGFibGUgYXMgYSBzdHJlYW0gYW5kIHJldHJpZXZlIHRoZSBzdHJlYW0gb2YgZGF0YS4KKyAqCisgKiA8cD5Gb3IgZXhhbXBsZSwgdGhlIGltcGxlbWVudGF0aW9uIG9mIHtAbGluayBJdGVtI2NvZXJjZVRvVGV4dCBJdGVtLmNvZXJjZVRvVGV4dH0KKyAqIGl0c2VsZiB1c2VzIHRoaXMgdG8gdHJ5IHRvIHJldHJpZXZlIGEgVVJJIGNsaXAgYXMgYSBzdHJlYW0gb2YgdGV4dDoKKyAqCisgKiB7QHNhbXBsZSBmcmFtZXdvcmtzL2Jhc2UvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9DbGlwRGF0YS5qYXZhIGNvZXJjZVRvVGV4dH0KKyAqCisgKiA8YSBuYW1lPSJJbXBsZW1lbnRpbmdDb3B5Ij48L2E+CisgKiA8aDM+SW1wbGVtZW50aW5nIENvcHkgb3IgRHJhZzwvaDM+CisgKgorICogPHA+VG8gYmUgdGhlIHNvdXJjZSBvZiBhIGNsaXAsIHRoZSBhcHBsaWNhdGlvbiBtdXN0IGNvbnN0cnVjdCBhIENsaXBwZWREYXRhCisgKiBvYmplY3QgdGhhdCBhbnkgcmVjaXBpZW50IGNhbiBpbnRlcnByZXQgYmVzdCBmb3IgdGhlaXIgY29udGV4dC4gIElmIHRoZSBjbGlwCisgKiBpcyB0byBjb250YWluIGEgc2ltcGxlIHRleHQsIEludGVudCwgb3IgVVJJLCB0aGlzIGlzIGVhc3k6IGFuIHtAbGluayBJdGVtfQorICogY29udGFpbmluZyB0aGUgYXBwcm9wcmlhdGUgZGF0YSB0eXBlIGNhbiBiZSBjb25zdHJ1Y3RlZCBhbmQgdXNlZC4KKyAqCisgKiA8cD5Nb3JlIGNvbXBsaWNhdGVkIGRhdGEgdHlwZXMgcmVxdWlyZSB0aGUgaW1wbGVtZW50YXRpb24gb2Ygc3VwcG9ydCBpbgorICogYSBDb250ZW50UHJvdmlkZXIgZm9yIGRlc2NyaWJpbmcgYW5kIGdlbmVyYXRpbmcgdGhlIGRhdGEgZm9yIHRoZSByZWNpcGllbnQuCisgKiBBIGNvbW1vbiBzY2VuYXJpbyBpcyBvbmUgd2hlcmUgYW4gYXBwbGljYXRpb24gcGxhY2VzIG9uIHRoZSBjbGlwYm9hcmQgdGhlCisgKiBjb250ZW50OiBVUkkgb2YgYW4gb2JqZWN0IHRoYXQgdGhlIHVzZXIgaGFzIGNvcGllZCwgd2l0aCB0aGUgZGF0YSBhdCB0aGF0CisgKiBVUkkgY29uc2lzdGluZyBvZiBhIGNvbXBsaWNhdGVkIHN0cnVjdHVyZSB0aGF0IG9ubHkgb3RoZXIgYXBwbGljYXRpb25zIHdpdGgKKyAqIGRpcmVjdCBrbm93bGVkZ2Ugb2YgdGhlIHN0cnVjdHVyZSBjYW4gdXNlLgorICoKKyAqIDxwPkZvciBhcHBsaWNhdGlvbnMgdGhhdCBkbyBub3QgaGF2ZSBpbnRyaW5zaWMga25vd2xlZGdlIG9mIHRoZSBkYXRhIHN0cnVjdHVyZSwKKyAqIHRoZSBjb250ZW50IHByb3ZpZGVyIGhvbGRpbmcgaXQgY2FuIG1ha2UgdGhlIGRhdGEgYXZhaWxhYmxlIGFzIGFuIGFyYml0cmFyeQorICogbnVtYmVyIG9mIHR5cGVzIG9mIGRhdGEgc3RyZWFtcy4gIFRoaXMgaXMgZG9uZSBieSBpbXBsZW1lbnRpbmcgdGhlCisgKiBDb250ZW50UHJvdmlkZXIge0BsaW5rIENvbnRlbnRQcm92aWRlciNnZXRTdHJlYW1UeXBlcyhVcmksIFN0cmluZyl9IGFuZAorICoge0BsaW5rIENvbnRlbnRQcm92aWRlciNvcGVuVHlwZWRBc3NldEZpbGUoVXJpLCBTdHJpbmcsIGFuZHJvaWQub3MuQnVuZGxlKX0KKyAqIG1ldGhvZHMuCisgKgorICogPHA+R29pbmcgYmFjayB0byBvdXIgc2ltcGxlIE5vdGVQYWQgYXBwbGljYXRpb24sIHRoaXMgaXMgdGhlIGltcGxlbWVudGF0aW9uCisgKiBpdCBtYXkgaGF2ZSB0byBjb252ZXJ0IGEgc2luZ2xlIG5vdGUgVVJJIChjb25zaXN0aW5nIG9mIGEgdGl0bGUgYW5kIHRoZSBub3RlCisgKiB0ZXh0KSBpbnRvIGEgc3RyZWFtIG9mIHBsYWluIHRleHQgZGF0YS4KKyAqCisgKiB7QHNhbXBsZSBkZXZlbG9wbWVudC9zYW1wbGVzL05vdGVQYWQvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvbm90ZXBhZC9Ob3RlUGFkUHJvdmlkZXIuamF2YQorICogICAgICBzdHJlYW19CisgKgorICogPHA+VGhlIGNvcHkgb3BlcmF0aW9uIGluIG91ciBOb3RlUGFkIGFwcGxpY2F0aW9uIGlzIG5vdyBqdXN0IGEgc2ltcGxlIG1hdHRlcgorICogb2YgbWFraW5nIGEgY2xpcCBjb250YWluaW5nIHRoZSBVUkkgb2YgdGhlIG5vdGUgYmVpbmcgY29waWVkOgorICoKKyAqIHtAc2FtcGxlIGRldmVsb3BtZW50L3NhbXBsZXMvTm90ZVBhZC9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9ub3RlcGFkL05vdGVzTGlzdC5qYXZhCisgKiAgICAgIGNvcHl9CisgKgorICogPHA+Tm90ZSBpZiBhIHBhc3RlIG9wZXJhdGlvbiBuZWVkcyB0aGlzIGNsaXAgYXMgdGV4dCAoZm9yIGV4YW1wbGUgdG8gcGFzdGUKKyAqIGludG8gYW4gZWRpdG9yKSwgdGhlbiB7QGxpbmsgSXRlbSNjb2VyY2VUb1RleHQoQ29udGV4dCl9IHdpbGwgYXNrIHRoZSBjb250ZW50CisgKiBwcm92aWRlciBmb3IgdGhlIGNsaXAgVVJJIGFzIHRleHQgYW5kIHN1Y2Nlc3NmdWxseSBwYXN0ZSB0aGUgZW50aXJlIG5vdGUuCisgKi8KK3B1YmxpYyBjbGFzcyBDbGlwRGF0YSBleHRlbmRzIENsaXBEZXNjcmlwdGlvbiB7CisgICAgc3RhdGljIGZpbmFsIFN0cmluZ1tdIE1JTUVUWVBFU19URVhUX1BMQUlOID0gbmV3IFN0cmluZ1tdIHsgTUlNRVRZUEVfVEVYVF9QTEFJTiB9OworICAgIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBNSU1FVFlQRVNfVEVYVF9VUklMSVNUID0gbmV3IFN0cmluZ1tdIHsgTUlNRVRZUEVfVEVYVF9VUklMSVNUIH07CisgICAgc3RhdGljIGZpbmFsIFN0cmluZ1tdIE1JTUVUWVBFU19URVhUX0lOVEVOVCA9IG5ldyBTdHJpbmdbXSB7IE1JTUVUWVBFX1RFWFRfSU5URU5UIH07CisKKyAgICBmaW5hbCBCaXRtYXAgbUljb247CisKKyAgICBmaW5hbCBBcnJheUxpc3Q8SXRlbT4gbUl0ZW1zID0gbmV3IEFycmF5TGlzdDxJdGVtPigpOworCisgICAgLyoqCisgICAgICogRGVzY3JpcHRpb24gb2YgYSBzaW5nbGUgaXRlbSBpbiBhIENsaXBwZWREYXRhLgorICAgICAqCisgICAgICogPHA+VGhlIHR5cGVzIHRoYW4gYW4gaW5kaXZpZHVhbCBpdGVtIGNhbiBjdXJyZW50bHkgY29udGFpbiBhcmU6PC9wPgorICAgICAqCisgICAgICogPHVsPgorICAgICAqIDxsaT4gVGV4dDogYSBiYXNpYyBzdHJpbmcgb2YgdGV4dC4gIFRoaXMgaXMgYWN0dWFsbHkgYSBDaGFyU2VxdWVuY2UsCisgICAgICogc28gaXQgY2FuIGJlIGZvcm1hdHRlZCB0ZXh0IHN1cHBvcnRlZCBieSBjb3JyZXNwb25kaW5nIEFuZHJvaWQgYnVpbHQtaW4KKyAgICAgKiBzdHlsZSBzcGFucy4gIChDdXN0b20gYXBwbGljYXRpb24gc3BhbnMgYXJlIG5vdCBzdXBwb3J0ZWQgYW5kIHdpbGwgYmUKKyAgICAgKiBzdHJpcHBlZCB3aGVuIHRyYW5zcG9ydGluZyB0aHJvdWdoIHRoZSBjbGlwYm9hcmQuKQorICAgICAqIDxsaT4gSW50ZW50OiBhbiBhcmJpdHJhcnkgSW50ZW50IG9iamVjdC4gIEEgdHlwaWNhbCB1c2UgaXMgdGhlIHNob3J0Y3V0CisgICAgICogdG8gY3JlYXRlIHdoZW4gcGFzdGluZyBhIGNsaXBwZWQgaXRlbSBvbiB0byB0aGUgaG9tZSBzY3JlZW4uCisgICAgICogPGxpPiBVcmk6IGEgVVJJIHJlZmVyZW5jZS4gIFRoaXMgbWF5IGJlIGFueSBVUkkgKHN1Y2ggYXMgYW4gaHR0cDogVVJJCisgICAgICogcmVwcmVzZW50aW5nIGEgYm9va21hcmspLCBob3dldmVyIGl0IGlzIG9mdGVuIGEgY29udGVudDogVVJJLiAgVXNpbmcKKyAgICAgKiBjb250ZW50IHByb3ZpZGVyIHJlZmVyZW5jZXMgYXMgY2xpcHMgbGlrZSB0aGlzIGFsbG93cyBhbiBhcHBsaWNhdGlvbiB0bworICAgICAqIHNoYXJlIGNvbXBsZXggb3IgbGFyZ2UgY2xpcHMgdGhyb3VnaCB0aGUgc3RhbmRhcmQgY29udGVudCBwcm92aWRlcgorICAgICAqIGZhY2lsaXRpZXMuCisgICAgICogPC91bD4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEl0ZW0geworICAgICAgICBmaW5hbCBDaGFyU2VxdWVuY2UgbVRleHQ7CisgICAgICAgIGZpbmFsIEludGVudCBtSW50ZW50OworICAgICAgICBmaW5hbCBVcmkgbVVyaTsKKworICAgICAgICAvKioKKyAgICAgICAgICogQ3JlYXRlIGFuIEl0ZW0gY29uc2lzdGluZyBvZiBhIHNpbmdsZSBibG9jayBvZiAocG9zc2libHkgc3R5bGVkKSB0ZXh0LgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIEl0ZW0oQ2hhclNlcXVlbmNlIHRleHQpIHsKKyAgICAgICAgICAgIG1UZXh0ID0gdGV4dDsKKyAgICAgICAgICAgIG1JbnRlbnQgPSBudWxsOworICAgICAgICAgICAgbVVyaSA9IG51bGw7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogQ3JlYXRlIGFuIEl0ZW0gY29uc2lzdGluZyBvZiBhbiBhcmJpdHJhcnkgSW50ZW50LgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIEl0ZW0oSW50ZW50IGludGVudCkgeworICAgICAgICAgICAgbVRleHQgPSBudWxsOworICAgICAgICAgICAgbUludGVudCA9IGludGVudDsKKyAgICAgICAgICAgIG1VcmkgPSBudWxsOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIENyZWF0ZSBhbiBJdGVtIGNvbnNpc3Rpbmcgb2YgYW4gYXJiaXRyYXJ5IFVSSS4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBJdGVtKFVyaSB1cmkpIHsKKyAgICAgICAgICAgIG1UZXh0ID0gbnVsbDsKKyAgICAgICAgICAgIG1JbnRlbnQgPSBudWxsOworICAgICAgICAgICAgbVVyaSA9IHVyaTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBDcmVhdGUgYSBjb21wbGV4IEl0ZW0sIGNvbnRhaW5pbmcgbXVsdGlwbGUgcmVwcmVzZW50YXRpb25zIG9mCisgICAgICAgICAqIHRleHQsIGludGVudCwgYW5kL29yIFVSSS4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBJdGVtKENoYXJTZXF1ZW5jZSB0ZXh0LCBJbnRlbnQgaW50ZW50LCBVcmkgdXJpKSB7CisgICAgICAgICAgICBtVGV4dCA9IHRleHQ7CisgICAgICAgICAgICBtSW50ZW50ID0gaW50ZW50OworICAgICAgICAgICAgbVVyaSA9IHVyaTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBSZXRyaWV2ZSB0aGUgcmF3IHRleHQgY29udGFpbmVkIGluIHRoaXMgSXRlbS4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBDaGFyU2VxdWVuY2UgZ2V0VGV4dCgpIHsKKyAgICAgICAgICAgIHJldHVybiBtVGV4dDsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBSZXRyaWV2ZSB0aGUgcmF3IEludGVudCBjb250YWluZWQgaW4gdGhpcyBJdGVtLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIEludGVudCBnZXRJbnRlbnQoKSB7CisgICAgICAgICAgICByZXR1cm4gbUludGVudDsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBSZXRyaWV2ZSB0aGUgcmF3IFVSSSBjb250YWluZWQgaW4gdGhpcyBJdGVtLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIFVyaSBnZXRVcmkoKSB7CisgICAgICAgICAgICByZXR1cm4gbVVyaTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBUdXJuIHRoaXMgaXRlbSBpbnRvIHRleHQsIHJlZ2FyZGxlc3Mgb2YgdGhlIHR5cGUgb2YgZGF0YSBpdAorICAgICAgICAgKiBhY3R1YWxseSBjb250YWlucy4KKyAgICAgICAgICoKKyAgICAgICAgICogPHA+VGhlIGFsZ29yaXRobSBmb3IgZGVjaWRpbmcgd2hhdCB0ZXh0IHRvIHJldHVybiBpczoKKyAgICAgICAgICogPHVsPgorICAgICAgICAgKiA8bGk+IElmIHtAbGluayAjZ2V0VGV4dH0gaXMgbm9uLW51bGwsIHJldHVybiB0aGF0LgorICAgICAgICAgKiA8bGk+IElmIHtAbGluayAjZ2V0VXJpfSBpcyBub24tbnVsbCwgdHJ5IHRvIHJldHJpZXZlIGl0cyBkYXRhCisgICAgICAgICAqIGFzIGEgdGV4dCBzdHJlYW0gZnJvbSBpdHMgY29udGVudCBwcm92aWRlci4gIElmIHRoaXMgc3VjY2VlZHMsIGNvcHkKKyAgICAgICAgICogdGhlIHRleHQgaW50byBhIFN0cmluZyBhbmQgcmV0dXJuIGl0LiAgSWYgaXQgaXMgbm90IGEgY29udGVudDogVVJJIG9yCisgICAgICAgICAqIHRoZSBjb250ZW50IHByb3ZpZGVyIGRvZXMgbm90IHN1cHBseSBhIHRleHQgcmVwcmVzZW50YXRpb24sIHJldHVybgorICAgICAgICAgKiB0aGUgcmF3IFVSSSBhcyBhIHN0cmluZy4KKyAgICAgICAgICogPGxpPiBJZiB7QGxpbmsgI2dldEludGVudH0gaXMgbm9uLW51bGwsIGNvbnZlcnQgdGhhdCB0byBhbiBpbnRlbnQ6CisgICAgICAgICAqIFVSSSBhbmQgcmV0dXJuaXQuCisgICAgICAgICAqIDxsaT4gT3RoZXJ3aXNlLCByZXR1cm4gYW4gZW1wdHkgc3RyaW5nLgorICAgICAgICAgKiA8L3VsPgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gY29udGV4dCBUaGUgY2FsbGVyJ3MgQ29udGV4dCwgZnJvbSB3aGljaCBpdHMgQ29udGVudFJlc29sdmVyCisgICAgICAgICAqIGFuZCBvdGhlciB0aGluZ3MgY2FuIGJlIHJldHJpZXZlZC4KKyAgICAgICAgICogQHJldHVybiBSZXR1cm5zIHRoZSBpdGVtJ3MgdGV4dHVhbCByZXByZXNlbnRhdGlvbi4KKyAgICAgICAgICovCisvL0JFR0lOX0lOQ0xVREUoY29lcmNlVG9UZXh0KQorICAgICAgICBwdWJsaWMgQ2hhclNlcXVlbmNlIGNvZXJjZVRvVGV4dChDb250ZXh0IGNvbnRleHQpIHsKKyAgICAgICAgICAgIC8vIElmIHRoaXMgSXRlbSBoYXMgYW4gZXhwbGljaXQgdGV4dHVhbCB2YWx1ZSwgc2ltcGx5IHJldHVybiB0aGF0LgorICAgICAgICAgICAgaWYgKG1UZXh0ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbVRleHQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIElmIHRoaXMgSXRlbSBoYXMgYSBVUkkgdmFsdWUsIHRyeSB1c2luZyB0aGF0LgorICAgICAgICAgICAgaWYgKG1VcmkgIT0gbnVsbCkgeworCisgICAgICAgICAgICAgICAgLy8gRmlyc3Qgc2VlIGlmIHRoZSBVUkkgY2FuIGJlIG9wZW5lZCBhcyBhIHBsYWluIHRleHQgc3RyZWFtCisgICAgICAgICAgICAgICAgLy8gKG9mIGFueSBzdWItdHlwZSkuICBJZiBzbywgdGhpcyBpcyB0aGUgYmVzdCB0ZXh0dWFsCisgICAgICAgICAgICAgICAgLy8gcmVwcmVzZW50YXRpb24gZm9yIGl0LgorICAgICAgICAgICAgICAgIEZpbGVJbnB1dFN0cmVhbSBzdHJlYW0gPSBudWxsOworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIC8vIEFzayBmb3IgYSBzdHJlYW0gb2YgdGhlIGRlc2lyZWQgdHlwZS4KKyAgICAgICAgICAgICAgICAgICAgQXNzZXRGaWxlRGVzY3JpcHRvciBkZXNjciA9IGNvbnRleHQuZ2V0Q29udGVudFJlc29sdmVyKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAub3BlblR5cGVkQXNzZXRGaWxlRGVzY3JpcHRvcihtVXJpLCAidGV4dC8qIiwgbnVsbCk7CisgICAgICAgICAgICAgICAgICAgIHN0cmVhbSA9IGRlc2NyLmNyZWF0ZUlucHV0U3RyZWFtKCk7CisgICAgICAgICAgICAgICAgICAgIElucHV0U3RyZWFtUmVhZGVyIHJlYWRlciA9IG5ldyBJbnB1dFN0cmVhbVJlYWRlcihzdHJlYW0sICJVVEYtOCIpOworCisgICAgICAgICAgICAgICAgICAgIC8vIEdvdCBpdC4uLiAgY29weSB0aGUgc3RyZWFtIGludG8gYSBsb2NhbCBzdHJpbmcgYW5kIHJldHVybiBpdC4KKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nQnVpbGRlciBidWlsZGVyID0gbmV3IFN0cmluZ0J1aWxkZXIoMTI4KTsKKyAgICAgICAgICAgICAgICAgICAgY2hhcltdIGJ1ZmZlciA9IG5ldyBjaGFyWzgxOTJdOworICAgICAgICAgICAgICAgICAgICBpbnQgbGVuOworICAgICAgICAgICAgICAgICAgICB3aGlsZSAoKGxlbj1yZWFkZXIucmVhZChidWZmZXIpKSA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKGJ1ZmZlciwgMCwgbGVuKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gYnVpbGRlci50b1N0cmluZygpOworCisgICAgICAgICAgICAgICAgfSBjYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gVW5hYmxlIHRvIG9wZW4gY29udGVudCBVUkkgYXMgdGV4dC4uLiAgbm90IHJlYWxseSBhbgorICAgICAgICAgICAgICAgICAgICAvLyBlcnJvciwganVzdCBzb21ldGhpbmcgdG8gaWdub3JlLgorCisgICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICAvLyBTb21ldGhpbmcgYmFkIGhhcyBoYXBwZW5lZC4KKyAgICAgICAgICAgICAgICAgICAgTG9nLncoIkNsaXBwZWREYXRhIiwgIkZhaWx1cmUgbG9hZGluZyB0ZXh0IiwgZSk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBlLnRvU3RyaW5nKCk7CisKKyAgICAgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgICAgICBpZiAoc3RyZWFtICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtLmNsb3NlKCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvLyBJZiB3ZSBjb3VsZG4ndCBvcGVuIHRoZSBVUkkgYXMgYSBzdHJlYW0sIHRoZW4gdGhlIFVSSSBpdHNlbGYKKyAgICAgICAgICAgICAgICAvLyBwcm9iYWJseSBzZXJ2ZXMgZmFpcmx5IHdlbGwgYXMgYSB0ZXh0dWFsIHJlcHJlc2VudGF0aW9uLgorICAgICAgICAgICAgICAgIHJldHVybiBtVXJpLnRvU3RyaW5nKCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIEZpbmFsbHksIGlmIGFsbCB3ZSBoYXZlIGlzIGFuIEludGVudCwgdGhlbiB3ZSBjYW4ganVzdCB0dXJuIHRoYXQKKyAgICAgICAgICAgIC8vIGludG8gdGV4dC4gIE5vdCB0aGUgbW9zdCB1c2VyLWZyaWVuZGx5IHRoaW5nLCBidXQgaXQncyBzb21ldGhpbmcuCisgICAgICAgICAgICBpZiAobUludGVudCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG1JbnRlbnQudG9VcmkoSW50ZW50LlVSSV9JTlRFTlRfU0NIRU1FKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gU2hvdWxkbid0IGdldCBoZXJlLCBidXQganVzdCBpbiBjYXNlLi4uCisgICAgICAgICAgICByZXR1cm4gIiI7CisgICAgICAgIH0KKy8vRU5EX0lOQ0xVREUoY29lcmNlVG9UZXh0KQorICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZSBhIG5ldyBjbGlwLgorICAgICAqCisgICAgICogQHBhcmFtIGxhYmVsIExhYmVsIHRvIHNob3cgdG8gdGhlIHVzZXIgZGVzY3JpYmluZyB0aGlzIGNsaXAuCisgICAgICogQHBhcmFtIG1pbWVUeXBlcyBBbiBhcnJheSBvZiBNSU1FIHR5cGVzIHRoaXMgZGF0YSBpcyBhdmFpbGFibGUgYXMuCisgICAgICogQHBhcmFtIGljb24gQml0bWFwIHByb3ZpZGluZyB0aGUgdXNlciB3aXRoIGFuIGljb25pbmcgcmVwcmVzZW50YXRpb24gb2YKKyAgICAgKiB0aGUgY2xpcC4KKyAgICAgKiBAcGFyYW0gaXRlbSBUaGUgY29udGVudHMgb2YgdGhlIGZpcnN0IGl0ZW0gaW4gdGhlIGNsaXAuCisgICAgICovCisgICAgcHVibGljIENsaXBEYXRhKENoYXJTZXF1ZW5jZSBsYWJlbCwgU3RyaW5nW10gbWltZVR5cGVzLCBCaXRtYXAgaWNvbiwgSXRlbSBpdGVtKSB7CisgICAgICAgIHN1cGVyKGxhYmVsLCBtaW1lVHlwZXMpOworICAgICAgICBpZiAoaXRlbSA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oIml0ZW0gaXMgbnVsbCIpOworICAgICAgICB9CisgICAgICAgIG1JY29uID0gaWNvbjsKKyAgICAgICAgbUl0ZW1zLmFkZChpdGVtKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYSBuZXcgQ2xpcERhdGEgaG9sZGluZyBkYXRhIG9mIHRoZSB0eXBlIHtAbGluayAjTUlNRVRZUEVfVEVYVF9QTEFJTn0uCisgICAgICoKKyAgICAgKiBAcGFyYW0gbGFiZWwgVXNlci12aXNpYmxlIGxhYmVsIGZvciB0aGUgY2xpcCBkYXRhLgorICAgICAqIEBwYXJhbSBpY29uIEljb25pYyByZXByZXNlbnRhdGlvbiBvZiB0aGUgY2xpcCBkYXRhLgorICAgICAqIEBwYXJhbSB0ZXh0IFRoZSBhY3R1YWwgdGV4dCBpbiB0aGUgY2xpcC4KKyAgICAgKiBAcmV0dXJuIFJldHVybnMgYSBuZXcgQ2xpcERhdGEgY29udGFpbmluZyB0aGUgc3BlY2lmaWVkIGRhdGEuCisgICAgICovCisgICAgc3RhdGljIHB1YmxpYyBDbGlwRGF0YSBuZXdQbGFpblRleHQoQ2hhclNlcXVlbmNlIGxhYmVsLCBCaXRtYXAgaWNvbiwgQ2hhclNlcXVlbmNlIHRleHQpIHsKKyAgICAgICAgSXRlbSBpdGVtID0gbmV3IEl0ZW0odGV4dCk7CisgICAgICAgIHJldHVybiBuZXcgQ2xpcERhdGEobGFiZWwsIE1JTUVUWVBFU19URVhUX1BMQUlOLCBpY29uLCBpdGVtKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYSBuZXcgQ2xpcERhdGEgaG9sZGluZyBhbiBJbnRlbnQgd2l0aCBNSU1FIHR5cGUge0BsaW5rICNNSU1FVFlQRV9URVhUX0lOVEVOVH0uCisgICAgICoKKyAgICAgKiBAcGFyYW0gbGFiZWwgVXNlci12aXNpYmxlIGxhYmVsIGZvciB0aGUgY2xpcCBkYXRhLgorICAgICAqIEBwYXJhbSBpY29uIEljb25pYyByZXByZXNlbnRhdGlvbiBvZiB0aGUgY2xpcCBkYXRhLgorICAgICAqIEBwYXJhbSBpbnRlbnQgVGhlIGFjdHVhbCBJbnRlbnQgaW4gdGhlIGNsaXAuCisgICAgICogQHJldHVybiBSZXR1cm5zIGEgbmV3IENsaXBEYXRhIGNvbnRhaW5pbmcgdGhlIHNwZWNpZmllZCBkYXRhLgorICAgICAqLworICAgIHN0YXRpYyBwdWJsaWMgQ2xpcERhdGEgbmV3SW50ZW50KENoYXJTZXF1ZW5jZSBsYWJlbCwgQml0bWFwIGljb24sIEludGVudCBpbnRlbnQpIHsKKyAgICAgICAgSXRlbSBpdGVtID0gbmV3IEl0ZW0oaW50ZW50KTsKKyAgICAgICAgcmV0dXJuIG5ldyBDbGlwRGF0YShsYWJlbCwgTUlNRVRZUEVTX1RFWFRfSU5URU5ULCBpY29uLCBpdGVtKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYSBuZXcgQ2xpcERhdGEgaG9sZGluZyBhIFVSSS4gIElmIHRoZSBVUkkgaXMgYSBjb250ZW50OiBVUkksCisgICAgICogdGhpcyB3aWxsIHF1ZXJ5IHRoZSBjb250ZW50IHByb3ZpZGVyIGZvciB0aGUgTUlNRSB0eXBlIG9mIGl0cyBkYXRhIGFuZAorICAgICAqIHVzZSB0aGF0IGFzIHRoZSBNSU1FIHR5cGUuICBPdGhlcndpc2UsIGl0IHdpbGwgdXNlIHRoZSBNSU1FIHR5cGUKKyAgICAgKiB7QGxpbmsgI01JTUVUWVBFX1RFWFRfVVJJTElTVH0uCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVzb2x2ZXIgQ29udGVudFJlc29sdmVyIHVzZWQgdG8gZ2V0IGluZm9ybWF0aW9uIGFib3V0IHRoZSBVUkkuCisgICAgICogQHBhcmFtIGxhYmVsIFVzZXItdmlzaWJsZSBsYWJlbCBmb3IgdGhlIGNsaXAgZGF0YS4KKyAgICAgKiBAcGFyYW0gaWNvbiBJY29uaWMgcmVwcmVzZW50YXRpb24gb2YgdGhlIGNsaXAgZGF0YS4KKyAgICAgKiBAcGFyYW0gdXJpIFRoZSBVUkkgaW4gdGhlIGNsaXAuCisgICAgICogQHJldHVybiBSZXR1cm5zIGEgbmV3IENsaXBEYXRhIGNvbnRhaW5pbmcgdGhlIHNwZWNpZmllZCBkYXRhLgorICAgICAqLworICAgIHN0YXRpYyBwdWJsaWMgQ2xpcERhdGEgbmV3VXJpKENvbnRlbnRSZXNvbHZlciByZXNvbHZlciwgQ2hhclNlcXVlbmNlIGxhYmVsLAorICAgICAgICAgICAgQml0bWFwIGljb24sIFVyaSB1cmkpIHsKKyAgICAgICAgSXRlbSBpdGVtID0gbmV3IEl0ZW0odXJpKTsKKyAgICAgICAgU3RyaW5nW10gbWltZVR5cGVzID0gbnVsbDsKKyAgICAgICAgaWYgKCJjb250ZW50Ii5lcXVhbHModXJpLmdldFNjaGVtZSgpKSkgeworICAgICAgICAgICAgU3RyaW5nIHJlYWxUeXBlID0gcmVzb2x2ZXIuZ2V0VHlwZSh1cmkpOworICAgICAgICAgICAgbWltZVR5cGVzID0gcmVzb2x2ZXIuZ2V0U3RyZWFtVHlwZXModXJpLCAiKi8qIik7CisgICAgICAgICAgICBpZiAobWltZVR5cGVzID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBpZiAocmVhbFR5cGUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBtaW1lVHlwZXMgPSBuZXcgU3RyaW5nW10geyByZWFsVHlwZSwgTUlNRVRZUEVfVEVYVF9VUklMSVNUIH07CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBTdHJpbmdbXSB0bXAgPSBuZXcgU3RyaW5nW21pbWVUeXBlcy5sZW5ndGggKyAocmVhbFR5cGUgIT0gbnVsbCA/IDIgOiAxKV07CisgICAgICAgICAgICAgICAgaW50IGkgPSAwOworICAgICAgICAgICAgICAgIGlmIChyZWFsVHlwZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIHRtcFswXSA9IHJlYWxUeXBlOworICAgICAgICAgICAgICAgICAgICBpKys7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkobWltZVR5cGVzLCAwLCB0bXAsIGksIG1pbWVUeXBlcy5sZW5ndGgpOworICAgICAgICAgICAgICAgIHRtcFtpICsgbWltZVR5cGVzLmxlbmd0aF0gPSBNSU1FVFlQRV9URVhUX1VSSUxJU1Q7CisgICAgICAgICAgICAgICAgbWltZVR5cGVzID0gdG1wOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChtaW1lVHlwZXMgPT0gbnVsbCkgeworICAgICAgICAgICAgbWltZVR5cGVzID0gTUlNRVRZUEVTX1RFWFRfVVJJTElTVDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbmV3IENsaXBEYXRhKGxhYmVsLCBtaW1lVHlwZXMsIGljb24sIGl0ZW0pOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZSBhIG5ldyBDbGlwRGF0YSBob2xkaW5nIGFuIFVSSSB3aXRoIE1JTUUgdHlwZSB7QGxpbmsgI01JTUVUWVBFX1RFWFRfVVJJTElTVH0uCisgICAgICogVW5saWtlIHtAbGluayAjbmV3VXJpKENvbnRlbnRSZXNvbHZlciwgQ2hhclNlcXVlbmNlLCBCaXRtYXAsIFVyaSl9LCBub3RoaW5nCisgICAgICogaXMgaW5mZXJyZWQgYWJvdXQgdGhlIFVSSSAtLSBpZiBpdCBpcyBhIGNvbnRlbnQ6IFVSSSBob2xkaW5nIGEgYml0bWFwLAorICAgICAqIHRoZSByZXBvcnRlZCB0eXBlIHdpbGwgc3RpbGwgYmUgdXJpLWxpc3QuICBVc2UgdGhpcyB3aXRoIGNhcmUhCisgICAgICoKKyAgICAgKiBAcGFyYW0gbGFiZWwgVXNlci12aXNpYmxlIGxhYmVsIGZvciB0aGUgY2xpcCBkYXRhLgorICAgICAqIEBwYXJhbSBpY29uIEljb25pYyByZXByZXNlbnRhdGlvbiBvZiB0aGUgY2xpcCBkYXRhLgorICAgICAqIEBwYXJhbSB1cmkgVGhlIFVSSSBpbiB0aGUgY2xpcC4KKyAgICAgKiBAcmV0dXJuIFJldHVybnMgYSBuZXcgQ2xpcERhdGEgY29udGFpbmluZyB0aGUgc3BlY2lmaWVkIGRhdGEuCisgICAgICovCisgICAgc3RhdGljIHB1YmxpYyBDbGlwRGF0YSBuZXdSYXdVcmkoQ2hhclNlcXVlbmNlIGxhYmVsLCBCaXRtYXAgaWNvbiwgVXJpIHVyaSkgeworICAgICAgICBJdGVtIGl0ZW0gPSBuZXcgSXRlbSh1cmkpOworICAgICAgICByZXR1cm4gbmV3IENsaXBEYXRhKGxhYmVsLCBNSU1FVFlQRVNfVEVYVF9VUklMSVNULCBpY29uLCBpdGVtKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBhZGRJdGVtKEl0ZW0gaXRlbSkgeworICAgICAgICBpZiAoaXRlbSA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oIml0ZW0gaXMgbnVsbCIpOworICAgICAgICB9CisgICAgICAgIG1JdGVtcy5hZGQoaXRlbSk7CisgICAgfQorCisgICAgcHVibGljIEJpdG1hcCBnZXRJY29uKCkgeworICAgICAgICByZXR1cm4gbUljb247CisgICAgfQorCisgICAgcHVibGljIGludCBnZXRJdGVtQ291bnQoKSB7CisgICAgICAgIHJldHVybiBtSXRlbXMuc2l6ZSgpOworICAgIH0KKworICAgIHB1YmxpYyBJdGVtIGdldEl0ZW0oaW50IGluZGV4KSB7CisgICAgICAgIHJldHVybiBtSXRlbXMuZ2V0KGluZGV4KTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgaW50IGRlc2NyaWJlQ29udGVudHMoKSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHdyaXRlVG9QYXJjZWwoUGFyY2VsIGRlc3QsIGludCBmbGFncykgeworICAgICAgICBzdXBlci53cml0ZVRvUGFyY2VsKGRlc3QsIGZsYWdzKTsKKyAgICAgICAgaWYgKG1JY29uICE9IG51bGwpIHsKKyAgICAgICAgICAgIGRlc3Qud3JpdGVJbnQoMSk7CisgICAgICAgICAgICBtSWNvbi53cml0ZVRvUGFyY2VsKGRlc3QsIGZsYWdzKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGRlc3Qud3JpdGVJbnQoMCk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWwgaW50IE4gPSBtSXRlbXMuc2l6ZSgpOworICAgICAgICBkZXN0LndyaXRlSW50KE4pOworICAgICAgICBmb3IgKGludCBpPTA7IGk8TjsgaSsrKSB7CisgICAgICAgICAgICBJdGVtIGl0ZW0gPSBtSXRlbXMuZ2V0KGkpOworICAgICAgICAgICAgVGV4dFV0aWxzLndyaXRlVG9QYXJjZWwoaXRlbS5tVGV4dCwgZGVzdCwgZmxhZ3MpOworICAgICAgICAgICAgaWYgKGl0ZW0ubUludGVudCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgZGVzdC53cml0ZUludCgxKTsKKyAgICAgICAgICAgICAgICBpdGVtLm1JbnRlbnQud3JpdGVUb1BhcmNlbChkZXN0LCBmbGFncyk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGRlc3Qud3JpdGVJbnQoMCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoaXRlbS5tVXJpICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBkZXN0LndyaXRlSW50KDEpOworICAgICAgICAgICAgICAgIGl0ZW0ubVVyaS53cml0ZVRvUGFyY2VsKGRlc3QsIGZsYWdzKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgZGVzdC53cml0ZUludCgwKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIENsaXBEYXRhKFBhcmNlbCBpbikgeworICAgICAgICBzdXBlcihpbik7CisgICAgICAgIGlmIChpbi5yZWFkSW50KCkgIT0gMCkgeworICAgICAgICAgICAgbUljb24gPSBCaXRtYXAuQ1JFQVRPUi5jcmVhdGVGcm9tUGFyY2VsKGluKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1JY29uID0gbnVsbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbCBpbnQgTiA9IGluLnJlYWRJbnQoKTsKKyAgICAgICAgZm9yIChpbnQgaT0wOyBpPE47IGkrKykgeworICAgICAgICAgICAgQ2hhclNlcXVlbmNlIHRleHQgPSBUZXh0VXRpbHMuQ0hBUl9TRVFVRU5DRV9DUkVBVE9SLmNyZWF0ZUZyb21QYXJjZWwoaW4pOworICAgICAgICAgICAgSW50ZW50IGludGVudCA9IGluLnJlYWRJbnQoKSAhPSAwID8gSW50ZW50LkNSRUFUT1IuY3JlYXRlRnJvbVBhcmNlbChpbikgOiBudWxsOworICAgICAgICAgICAgVXJpIHVyaSA9IGluLnJlYWRJbnQoKSAhPSAwID8gVXJpLkNSRUFUT1IuY3JlYXRlRnJvbVBhcmNlbChpbikgOiBudWxsOworICAgICAgICAgICAgbUl0ZW1zLmFkZChuZXcgSXRlbSh0ZXh0LCBpbnRlbnQsIHVyaSkpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBQYXJjZWxhYmxlLkNyZWF0b3I8Q2xpcERhdGE+IENSRUFUT1IgPQorICAgICAgICBuZXcgUGFyY2VsYWJsZS5DcmVhdG9yPENsaXBEYXRhPigpIHsKKworICAgICAgICAgICAgcHVibGljIENsaXBEYXRhIGNyZWF0ZUZyb21QYXJjZWwoUGFyY2VsIHNvdXJjZSkgeworICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQ2xpcERhdGEoc291cmNlKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIENsaXBEYXRhW10gbmV3QXJyYXkoaW50IHNpemUpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IENsaXBEYXRhW3NpemVdOworICAgICAgICAgICAgfQorICAgICAgICB9OworfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9DbGlwRGVzY3JpcHRpb24uYWlkbCBiL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvQ2xpcERlc2NyaXB0aW9uLmFpZGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzkxZmQ1YQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvQ2xpcERlc2NyaXB0aW9uLmFpZGwKQEAgLTAsMCArMSwxOSBAQAorLyoqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQuY29udGVudDsKKworcGFyY2VsYWJsZSBDbGlwRGVzY3JpcHRpb247CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L0NsaXBEZXNjcmlwdGlvbi5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9DbGlwRGVzY3JpcHRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZDlkODA3Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9DbGlwRGVzY3JpcHRpb24uamF2YQpAQCAtMCwwICsxLDIwNiBAQAorLyoqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQuY29udGVudDsKKworaW1wb3J0IGFuZHJvaWQub3MuUGFyY2VsOworaW1wb3J0IGFuZHJvaWQub3MuUGFyY2VsYWJsZTsKK2ltcG9ydCBhbmRyb2lkLnRleHQuVGV4dFV0aWxzOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKKworLyoqCisgKiBNZXRhLWRhdGEgZGVzY3JpYmluZyB0aGUgY29udGVudHMgb2YgYSB7QGxpbmsgQ2xpcERhdGF9LiAgUHJvdmlkZXMgZW5vdWdoCisgKiBpbmZvcm1hdGlvbiB0byBrbm93IGlmIHlvdSBjYW4gaGFuZGxlIHRoZSBDbGlwRGF0YSwgYnV0IG5vdCB0aGUgZGF0YQorICogaXRzZWxmLgorICovCitwdWJsaWMgY2xhc3MgQ2xpcERlc2NyaXB0aW9uIGltcGxlbWVudHMgUGFyY2VsYWJsZSB7CisgICAgLyoqCisgICAgICogVGhlIE1JTUUgdHlwZSBmb3IgYSBjbGlwIGhvbGRpbmcgcGxhaW4gdGV4dC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNSU1FVFlQRV9URVhUX1BMQUlOID0gInRleHQvcGxhaW4iOworCisgICAgLyoqCisgICAgICogVGhlIE1JTUUgdHlwZSBmb3IgYSBjbGlwIGhvbGRpbmcgb25lIG9yIG1vcmUgVVJJcy4gIFRoaXMgc2hvdWxkIGJlCisgICAgICogdXNlZCBmb3IgVVJJcyB0aGF0IGFyZSBtZWFuaW5nZnVsIHRvIGEgdXNlciAoc3VjaCBhcyBhbiBodHRwOiBVUkkpLgorICAgICAqIEl0IHNob3VsZCA8ZW0+bm90PC9lbT4gYmUgdXNlZCBmb3IgYSBjb250ZW50OiBVUkkgdGhhdCByZWZlcmVuY2VzIHNvbWUKKyAgICAgKiBvdGhlciBwaWVjZSBvZiBkYXRhOyBpbiB0aGF0IGNhc2UgdGhlIE1JTUUgdHlwZSBzaG91bGQgYmUgdGhlIHR5cGUKKyAgICAgKiBvZiB0aGUgcmVmZXJlbmNlZCBkYXRhLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1JTUVUWVBFX1RFWFRfVVJJTElTVCA9ICJ0ZXh0L3VyaS1saXN0IjsKKworICAgIC8qKgorICAgICAqIFRoZSBNSU1FIHR5cGUgZm9yIGEgY2xpcCBob2xkaW5nIGFuIEludGVudC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNSU1FVFlQRV9URVhUX0lOVEVOVCA9ICJ0ZXh0L3ZuZC5hbmRyb2lkLmludGVudCI7CisKKyAgICBmaW5hbCBDaGFyU2VxdWVuY2UgbUxhYmVsOworICAgIGZpbmFsIFN0cmluZ1tdIG1NaW1lVHlwZXM7CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYSBuZXcgY2xpcC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBsYWJlbCBMYWJlbCB0byBzaG93IHRvIHRoZSB1c2VyIGRlc2NyaWJpbmcgdGhpcyBjbGlwLgorICAgICAqIEBwYXJhbSBtaW1lVHlwZXMgQW4gYXJyYXkgb2YgTUlNRSB0eXBlcyB0aGlzIGRhdGEgaXMgYXZhaWxhYmxlIGFzLgorICAgICAqLworICAgIHB1YmxpYyBDbGlwRGVzY3JpcHRpb24oQ2hhclNlcXVlbmNlIGxhYmVsLCBTdHJpbmdbXSBtaW1lVHlwZXMpIHsKKyAgICAgICAgaWYgKG1pbWVUeXBlcyA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oIm1pbWVUeXBlcyBpcyBudWxsIik7CisgICAgICAgIH0KKyAgICAgICAgbUxhYmVsID0gbGFiZWw7CisgICAgICAgIG1NaW1lVHlwZXMgPSBtaW1lVHlwZXM7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlIGEgY29weSBvZiBhIENsaXBEZXNjcmlwdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgQ2xpcERlc2NyaXB0aW9uKENsaXBEZXNjcmlwdGlvbiBvKSB7CisgICAgICAgIG1MYWJlbCA9IG8ubUxhYmVsOworICAgICAgICBtTWltZVR5cGVzID0gby5tTWltZVR5cGVzOworICAgIH0KKworICAgIC8qKgorICAgICAqIEhlbHBlciB0byBjb21wYXJlIHR3byBNSU1FIHR5cGVzLCB3aGVyZSBvbmUgbWF5IGJlIGEgcGF0dGVybi4KKyAgICAgKiBAcGFyYW0gY29uY3JldGVUeXBlIEEgZnVsbHktc3BlY2lmaWVkIE1JTUUgdHlwZS4KKyAgICAgKiBAcGFyYW0gZGVzaXJlZFR5cGUgQSBkZXNpcmVkIE1JTUUgdHlwZSB0aGF0IG1heSBiZSBhIHBhdHRlcm4gc3VjaCBhcyAqXC8qLgorICAgICAqIEByZXR1cm4gUmV0dXJucyB0cnVlIGlmIHRoZSB0d28gTUlNRSB0eXBlcyBtYXRjaC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gY29tcGFyZU1pbWVUeXBlcyhTdHJpbmcgY29uY3JldGVUeXBlLCBTdHJpbmcgZGVzaXJlZFR5cGUpIHsKKyAgICAgICAgZmluYWwgaW50IHR5cGVMZW5ndGggPSBkZXNpcmVkVHlwZS5sZW5ndGgoKTsKKyAgICAgICAgaWYgKHR5cGVMZW5ndGggPT0gMyAmJiBkZXNpcmVkVHlwZS5lcXVhbHMoIiovKiIpKSB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIGZpbmFsIGludCBzbGFzaHBvcyA9IGRlc2lyZWRUeXBlLmluZGV4T2YoJy8nKTsKKyAgICAgICAgaWYgKHNsYXNocG9zID4gMCkgeworICAgICAgICAgICAgaWYgKHR5cGVMZW5ndGggPT0gc2xhc2hwb3MrMiAmJiBkZXNpcmVkVHlwZS5jaGFyQXQoc2xhc2hwb3MrMSkgPT0gJyonKSB7CisgICAgICAgICAgICAgICAgaWYgKGRlc2lyZWRUeXBlLnJlZ2lvbk1hdGNoZXMoMCwgY29uY3JldGVUeXBlLCAwLCBzbGFzaHBvcysxKSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgaWYgKGRlc2lyZWRUeXBlLmVxdWFscyhjb25jcmV0ZVR5cGUpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBsYWJlbCBmb3IgdGhpcyBjbGlwLgorICAgICAqLworICAgIHB1YmxpYyBDaGFyU2VxdWVuY2UgZ2V0TGFiZWwoKSB7CisgICAgICAgIHJldHVybiBtTGFiZWw7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2hlY2sgd2hldGhlciB0aGUgY2xpcCBkZXNjcmlwdGlvbiBjb250YWlucyB0aGUgZ2l2ZW4gTUlNRSB0eXBlLgorICAgICAqCisgICAgICogQHBhcmFtIG1pbWVUeXBlIFRoZSBkZXNpcmVkIE1JTUUgdHlwZS4gIE1heSBiZSBhIHBhdHRlcm4uCisgICAgICogQHJldHVybiBSZXR1cm5zIHRydWUgaWYgb25lIG9mIHRoZSBNSU1FIHR5cGVzIGluIHRoZSBjbGlwIGRlc2NyaXB0aW9uCisgICAgICogbWF0Y2hlcyB0aGUgZGVzaXJlZCBNSU1FIHR5cGUsIGVsc2UgZmFsc2UuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaGFzTWltZVR5cGUoU3RyaW5nIG1pbWVUeXBlKSB7CisgICAgICAgIGZvciAoaW50IGk9MDsgaTxtTWltZVR5cGVzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBpZiAoY29tcGFyZU1pbWVUeXBlcyhtTWltZVR5cGVzW2ldLCBtaW1lVHlwZSkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLyoqCisgICAgICogRmlsdGVyIHRoZSBjbGlwIGRlc2NyaXB0aW9uIE1JTUUgdHlwZXMgYnkgdGhlIGdpdmVuIE1JTUUgdHlwZS4gIFJldHVybnMKKyAgICAgKiBhbGwgTUlNRSB0eXBlcyBpbiB0aGUgY2xpcCB0aGF0IG1hdGNoIHRoZSBnaXZlbiBNSU1FIHR5cGUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbWltZVR5cGUgVGhlIGRlc2lyZWQgTUlNRSB0eXBlLiAgTWF5IGJlIGEgcGF0dGVybi4KKyAgICAgKiBAcmV0dXJuIFJldHVybnMgYW4gYXJyYXkgb2YgYWxsIG1hdGNoaW5nIE1JTUUgdHlwZXMuICBJZiB0aGVyZSBhcmUgbm8KKyAgICAgKiBtYXRjaGluZyBNSU1FIHR5cGVzLCBudWxsIGlzIHJldHVybmVkLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmdbXSBmaWx0ZXJNaW1lVHlwZXMoU3RyaW5nIG1pbWVUeXBlKSB7CisgICAgICAgIEFycmF5TGlzdDxTdHJpbmc+IGFycmF5ID0gbnVsbDsKKyAgICAgICAgZm9yIChpbnQgaT0wOyBpPG1NaW1lVHlwZXMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIGlmIChjb21wYXJlTWltZVR5cGVzKG1NaW1lVHlwZXNbaV0sIG1pbWVUeXBlKSkgeworICAgICAgICAgICAgICAgIGlmIChhcnJheSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGFycmF5ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGFycmF5LmFkZChtTWltZVR5cGVzW2ldKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoYXJyYXkgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICAgICAgU3RyaW5nW10gcmF3QXJyYXkgPSBuZXcgU3RyaW5nW2FycmF5LnNpemUoKV07CisgICAgICAgIGFycmF5LnRvQXJyYXkocmF3QXJyYXkpOworICAgICAgICByZXR1cm4gcmF3QXJyYXk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBudW1iZXIgb2YgTUlNRSB0eXBlcyB0aGUgY2xpcCBpcyBhdmFpbGFibGUgaW4uCisgICAgICovCisgICAgcHVibGljIGludCBnZXRNaW1lVHlwZUNvdW50KCkgeworICAgICAgICByZXR1cm4gbU1pbWVUeXBlcy5sZW5ndGg7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIG9uZSBvZiB0aGUgcG9zc2libGUgY2xpcCBNSU1FIHR5cGVzLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0TWltZVR5cGUoaW50IGluZGV4KSB7CisgICAgICAgIHJldHVybiBtTWltZVR5cGVzW2luZGV4XTsKKyAgICB9CisKKyAgICAvKiogQGhpZGUgKi8KKyAgICBwdWJsaWMgdm9pZCB2YWxpZGF0ZSgpIHsKKyAgICAgICAgaWYgKG1NaW1lVHlwZXMgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCJudWxsIG1pbWUgdHlwZXMiKTsKKyAgICAgICAgfQorICAgICAgICBpZiAobU1pbWVUeXBlcy5sZW5ndGggPD0gMCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigibXVzdCBoYXZlIGF0IGxlYXN0IDEgbWltZSB0eXBlIik7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChpbnQgaT0wOyBpPG1NaW1lVHlwZXMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIGlmIChtTWltZVR5cGVzW2ldID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oIm1pbWUgdHlwZSBhdCAiICsgaSArICIgaXMgbnVsbCIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGludCBkZXNjcmliZUNvbnRlbnRzKCkgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB3cml0ZVRvUGFyY2VsKFBhcmNlbCBkZXN0LCBpbnQgZmxhZ3MpIHsKKyAgICAgICAgVGV4dFV0aWxzLndyaXRlVG9QYXJjZWwobUxhYmVsLCBkZXN0LCBmbGFncyk7CisgICAgICAgIGRlc3Qud3JpdGVTdHJpbmdBcnJheShtTWltZVR5cGVzKTsKKyAgICB9CisKKyAgICBDbGlwRGVzY3JpcHRpb24oUGFyY2VsIGluKSB7CisgICAgICAgIG1MYWJlbCA9IFRleHRVdGlscy5DSEFSX1NFUVVFTkNFX0NSRUFUT1IuY3JlYXRlRnJvbVBhcmNlbChpbik7CisgICAgICAgIG1NaW1lVHlwZXMgPSBpbi5jcmVhdGVTdHJpbmdBcnJheSgpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgUGFyY2VsYWJsZS5DcmVhdG9yPENsaXBEZXNjcmlwdGlvbj4gQ1JFQVRPUiA9CisgICAgICAgIG5ldyBQYXJjZWxhYmxlLkNyZWF0b3I8Q2xpcERlc2NyaXB0aW9uPigpIHsKKworICAgICAgICAgICAgcHVibGljIENsaXBEZXNjcmlwdGlvbiBjcmVhdGVGcm9tUGFyY2VsKFBhcmNlbCBzb3VyY2UpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IENsaXBEZXNjcmlwdGlvbihzb3VyY2UpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgQ2xpcERlc2NyaXB0aW9uW10gbmV3QXJyYXkoaW50IHNpemUpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IENsaXBEZXNjcmlwdGlvbltzaXplXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKK30KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvQ2xpcGJvYXJkTWFuYWdlci5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9DbGlwYm9hcmRNYW5hZ2VyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGVhMDY0OAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvQ2xpcGJvYXJkTWFuYWdlci5qYXZhCkBAIC0wLDAgKzEsMjEzIEBACisvKioKKyAqIENvcHlyaWdodCAoYykgMjAxMCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5jb250ZW50OworCitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5vcy5NZXNzYWdlOworaW1wb3J0IGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uOworaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLklCaW5kZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5TZXJ2aWNlTWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKKworLyoqCisgKiBJbnRlcmZhY2UgdG8gdGhlIGNsaXBib2FyZCBzZXJ2aWNlLCBmb3IgcGxhY2luZyBhbmQgcmV0cmlldmluZyB0ZXh0IGluCisgKiB0aGUgZ2xvYmFsIGNsaXBib2FyZC4KKyAqCisgKiA8cD4KKyAqIFlvdSBkbyBub3QgaW5zdGFudGlhdGUgdGhpcyBjbGFzcyBkaXJlY3RseTsgaW5zdGVhZCwgcmV0cmlldmUgaXQgdGhyb3VnaAorICoge0BsaW5rIGFuZHJvaWQuY29udGVudC5Db250ZXh0I2dldFN5c3RlbVNlcnZpY2V9LgorICoKKyAqIDxwPgorICogVGhlIENsaXBib2FyZE1hbmFnZXIgQVBJIGl0c2VsZiBpcyB2ZXJ5IHNpbXBsZTogaXQgY29uc2lzdHMgb2YgbWV0aG9kcworICogdG8gYXRvbWljYWxseSBnZXQgYW5kIHNldCB0aGUgY3VycmVudCBwcmltYXJ5IGNsaXBib2FyZCBkYXRhLiAgVGhhdCBkYXRhCisgKiBpcyBleHByZXNzZWQgYXMgYSB7QGxpbmsgQ2xpcERhdGF9IG9iamVjdCwgd2hpY2ggZGVmaW5lcyB0aGUgcHJvdG9jb2wKKyAqIGZvciBkYXRhIGV4Y2hhbmdlIGJldHdlZW4gYXBwbGljYXRpb25zLgorICoKKyAqIEBzZWUgYW5kcm9pZC5jb250ZW50LkNvbnRleHQjZ2V0U3lzdGVtU2VydmljZQorICovCitwdWJsaWMgY2xhc3MgQ2xpcGJvYXJkTWFuYWdlciBleHRlbmRzIGFuZHJvaWQudGV4dC5DbGlwYm9hcmRNYW5hZ2VyIHsKKyAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBPYmplY3Qgc1N0YXRpY0xvY2sgPSBuZXcgT2JqZWN0KCk7CisgICAgcHJpdmF0ZSBzdGF0aWMgSUNsaXBib2FyZCBzU2VydmljZTsKKworICAgIHByaXZhdGUgZmluYWwgQ29udGV4dCBtQ29udGV4dDsKKworICAgIHByaXZhdGUgZmluYWwgQXJyYXlMaXN0PE9uUHJpbWFyeUNsaXBDaGFuZ2VkTGlzdGVuZXI+IG1QcmltYXJ5Q2xpcENoYW5nZWRMaXN0ZW5lcnMKKyAgICAgICAgICAgICA9IG5ldyBBcnJheUxpc3Q8T25QcmltYXJ5Q2xpcENoYW5nZWRMaXN0ZW5lcj4oKTsKKworICAgIHByaXZhdGUgZmluYWwgSU9uUHJpbWFyeUNsaXBDaGFuZ2VkTGlzdGVuZXIuU3R1YiBtUHJpbWFyeUNsaXBDaGFuZ2VkU2VydmljZUxpc3RlbmVyCisgICAgICAgICAgICA9IG5ldyBJT25QcmltYXJ5Q2xpcENoYW5nZWRMaXN0ZW5lci5TdHViKCkgeworICAgICAgICBwdWJsaWMgdm9pZCBkaXNwYXRjaFByaW1hcnlDbGlwQ2hhbmdlZCgpIHsKKyAgICAgICAgICAgIG1IYW5kbGVyLnNlbmRFbXB0eU1lc3NhZ2UoTVNHX1JFUE9SVF9QUklNQVJZX0NMSVBfQ0hBTkdFRCk7CisgICAgICAgIH0KKyAgICB9OworCisgICAgc3RhdGljIGZpbmFsIGludCBNU0dfUkVQT1JUX1BSSU1BUllfQ0xJUF9DSEFOR0VEID0gMTsKKworICAgIHByaXZhdGUgZmluYWwgSGFuZGxlciBtSGFuZGxlciA9IG5ldyBIYW5kbGVyKCkgeworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgaGFuZGxlTWVzc2FnZShNZXNzYWdlIG1zZykgeworICAgICAgICAgICAgc3dpdGNoIChtc2cud2hhdCkgeworICAgICAgICAgICAgICAgIGNhc2UgTVNHX1JFUE9SVF9QUklNQVJZX0NMSVBfQ0hBTkdFRDoKKyAgICAgICAgICAgICAgICAgICAgcmVwb3J0UHJpbWFyeUNsaXBDaGFuZ2VkKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9OworCisgICAgcHVibGljIGludGVyZmFjZSBPblByaW1hcnlDbGlwQ2hhbmdlZExpc3RlbmVyIHsKKyAgICAgICAgdm9pZCBvblByaW1hcnlDbGlwQ2hhbmdlZCgpOworICAgIH0KKworICAgIHN0YXRpYyBwcml2YXRlIElDbGlwYm9hcmQgZ2V0U2VydmljZSgpIHsKKyAgICAgICAgc3luY2hyb25pemVkIChzU3RhdGljTG9jaykgeworICAgICAgICAgICAgaWYgKHNTZXJ2aWNlICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gc1NlcnZpY2U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBJQmluZGVyIGIgPSBTZXJ2aWNlTWFuYWdlci5nZXRTZXJ2aWNlKCJjbGlwYm9hcmQiKTsKKyAgICAgICAgICAgIHNTZXJ2aWNlID0gSUNsaXBib2FyZC5TdHViLmFzSW50ZXJmYWNlKGIpOworICAgICAgICAgICAgcmV0dXJuIHNTZXJ2aWNlOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqIHtAaGlkZX0gKi8KKyAgICBwdWJsaWMgQ2xpcGJvYXJkTWFuYWdlcihDb250ZXh0IGNvbnRleHQsIEhhbmRsZXIgaGFuZGxlcikgeworICAgICAgICBtQ29udGV4dCA9IGNvbnRleHQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgY3VycmVudCBwcmltYXJ5IGNsaXAgb24gdGhlIGNsaXBib2FyZC4gIFRoaXMgaXMgdGhlIGNsaXAgdGhhdAorICAgICAqIGlzIGludm9sdmVkIGluIG5vcm1hbCBjdXQgYW5kIHBhc3RlIG9wZXJhdGlvbnMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY2xpcCBUaGUgY2xpcHBlZCBkYXRhIGl0ZW0gdG8gc2V0LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFByaW1hcnlDbGlwKENsaXBEYXRhIGNsaXApIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGdldFNlcnZpY2UoKS5zZXRQcmltYXJ5Q2xpcChjbGlwKTsKKyAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIGN1cnJlbnQgcHJpbWFyeSBjbGlwIG9uIHRoZSBjbGlwYm9hcmQuCisgICAgICovCisgICAgcHVibGljIENsaXBEYXRhIGdldFByaW1hcnlDbGlwKCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuIGdldFNlcnZpY2UoKS5nZXRQcmltYXJ5Q2xpcCgpOworICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGEgZGVzY3JpcHRpb24gb2YgdGhlIGN1cnJlbnQgcHJpbWFyeSBjbGlwIG9uIHRoZSBjbGlwYm9hcmQKKyAgICAgKiBidXQgbm90IGEgY29weSBvZiBpdHMgZGF0YS4KKyAgICAgKi8KKyAgICBwdWJsaWMgQ2xpcERlc2NyaXB0aW9uIGdldFByaW1hcnlDbGlwRGVzY3JpcHRpb24oKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXR1cm4gZ2V0U2VydmljZSgpLmdldFByaW1hcnlDbGlwRGVzY3JpcHRpb24oKTsKKyAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0cnVlIGlmIHRoZXJlIGlzIGN1cnJlbnRseSBhIHByaW1hcnkgY2xpcCBvbiB0aGUgY2xpcGJvYXJkLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGhhc1ByaW1hcnlDbGlwKCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuIGdldFNlcnZpY2UoKS5oYXNQcmltYXJ5Q2xpcCgpOworICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgYWRkUHJpbWFyeUNsaXBDaGFuZ2VkTGlzdGVuZXIoT25QcmltYXJ5Q2xpcENoYW5nZWRMaXN0ZW5lciB3aGF0KSB7CisgICAgICAgIHN5bmNocm9uaXplZCAobVByaW1hcnlDbGlwQ2hhbmdlZExpc3RlbmVycykgeworICAgICAgICAgICAgaWYgKG1QcmltYXJ5Q2xpcENoYW5nZWRMaXN0ZW5lcnMuc2l6ZSgpID09IDApIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBnZXRTZXJ2aWNlKCkuYWRkUHJpbWFyeUNsaXBDaGFuZ2VkTGlzdGVuZXIoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVByaW1hcnlDbGlwQ2hhbmdlZFNlcnZpY2VMaXN0ZW5lcik7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtUHJpbWFyeUNsaXBDaGFuZ2VkTGlzdGVuZXJzLmFkZCh3aGF0KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHJlbW92ZVByaW1hcnlDbGlwQ2hhbmdlZExpc3RlbmVyKE9uUHJpbWFyeUNsaXBDaGFuZ2VkTGlzdGVuZXIgd2hhdCkgeworICAgICAgICBzeW5jaHJvbml6ZWQgKG1QcmltYXJ5Q2xpcENoYW5nZWRMaXN0ZW5lcnMpIHsKKyAgICAgICAgICAgIG1QcmltYXJ5Q2xpcENoYW5nZWRMaXN0ZW5lcnMucmVtb3ZlKHdoYXQpOworICAgICAgICAgICAgaWYgKG1QcmltYXJ5Q2xpcENoYW5nZWRMaXN0ZW5lcnMuc2l6ZSgpID09IDApIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBnZXRTZXJ2aWNlKCkucmVtb3ZlUHJpbWFyeUNsaXBDaGFuZ2VkTGlzdGVuZXIoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVByaW1hcnlDbGlwQ2hhbmdlZFNlcnZpY2VMaXN0ZW5lcik7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rICNnZXRQcmltYXJ5Q2xpcCgpfSBpbnN0ZWFkLiAgVGhpcyByZXRyaWV2ZXMKKyAgICAgKiB0aGUgcHJpbWFyeSBjbGlwIGFuZCB0cmllcyB0byBjb2VyY2UgaXQgdG8gYSBzdHJpbmcuCisgICAgICovCisgICAgcHVibGljIENoYXJTZXF1ZW5jZSBnZXRUZXh0KCkgeworICAgICAgICBDbGlwRGF0YSBjbGlwID0gZ2V0UHJpbWFyeUNsaXAoKTsKKyAgICAgICAgaWYgKGNsaXAgIT0gbnVsbCAmJiBjbGlwLmdldEl0ZW1Db3VudCgpID4gMCkgeworICAgICAgICAgICAgcmV0dXJuIGNsaXAuZ2V0SXRlbSgwKS5jb2VyY2VUb1RleHQobUNvbnRleHQpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIC8qKgorICAgICAqIEBkZXByZWNhdGVkIFVzZSB7QGxpbmsgI3NldFByaW1hcnlDbGlwKENsaXBEYXRhKX0gaW5zdGVhZC4gIFRoaXMKKyAgICAgKiBjcmVhdGVzIGEgQ2xpcHBlZEl0ZW0gaG9sZGluZyB0aGUgZ2l2ZW4gdGV4dCBhbmQgc2V0cyBpdCBhcyB0aGUKKyAgICAgKiBwcmltYXJ5IGNsaXAuICBJdCBoYXMgbm8gbGFiZWwgb3IgaWNvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRUZXh0KENoYXJTZXF1ZW5jZSB0ZXh0KSB7CisgICAgICAgIHNldFByaW1hcnlDbGlwKENsaXBEYXRhLm5ld1BsYWluVGV4dChudWxsLCBudWxsLCB0ZXh0KSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQGRlcHJlY2F0ZWQgVXNlIHtAbGluayAjaGFzUHJpbWFyeUNsaXAoKX0gaW5zdGVhZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBoYXNUZXh0KCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuIGdldFNlcnZpY2UoKS5oYXNQcmltYXJ5Q2xpcCgpOworICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorCisgICAgdm9pZCByZXBvcnRQcmltYXJ5Q2xpcENoYW5nZWQoKSB7CisgICAgICAgIE9iamVjdFtdIGxpc3RlbmVyczsKKworICAgICAgICBzeW5jaHJvbml6ZWQgKG1QcmltYXJ5Q2xpcENoYW5nZWRMaXN0ZW5lcnMpIHsKKyAgICAgICAgICAgIGZpbmFsIGludCBOID0gbVByaW1hcnlDbGlwQ2hhbmdlZExpc3RlbmVycy5zaXplKCk7CisgICAgICAgICAgICBpZiAoTiA8PSAwKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbGlzdGVuZXJzID0gbVByaW1hcnlDbGlwQ2hhbmdlZExpc3RlbmVycy50b0FycmF5KCk7CisgICAgICAgIH0KKworICAgICAgICBmb3IgKGludCBpPTA7IGk8bGlzdGVuZXJzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAoKE9uUHJpbWFyeUNsaXBDaGFuZ2VkTGlzdGVuZXIpbGlzdGVuZXJzW2ldKS5vblByaW1hcnlDbGlwQ2hhbmdlZCgpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9Db250ZW50UHJvdmlkZXIuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvQ29udGVudFByb3ZpZGVyLmphdmEKaW5kZXggZGM0ZTljNC4uZDNjMWI0ZSAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9Db250ZW50UHJvdmlkZXIuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L0NvbnRlbnRQcm92aWRlci5qYXZhCkBAIC0yOCwxMyArMjgsMTYgQEAKIGltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLklDb250ZW50T2JzZXJ2ZXI7CiBpbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5TUUxFeGNlcHRpb247CiBpbXBvcnQgYW5kcm9pZC5uZXQuVXJpOworaW1wb3J0IGFuZHJvaWQub3MuQXN5bmNUYXNrOwogaW1wb3J0IGFuZHJvaWQub3MuQmluZGVyOwogaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOwogaW1wb3J0IGFuZHJvaWQub3MuUGFyY2VsRmlsZURlc2NyaXB0b3I7CiBpbXBvcnQgYW5kcm9pZC5vcy5Qcm9jZXNzOworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CiAKIGltcG9ydCBqYXZhLmlvLkZpbGU7CiBpbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwogCiAvKioKQEAgLTc2LDYgKzc5LDggQEAKICAqIGNyb3NzLXByb2Nlc3MgY2FsbHMuPC9wPgogICovCiBwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQ29udGVudFByb3ZpZGVyIGltcGxlbWVudHMgQ29tcG9uZW50Q2FsbGJhY2tzIHsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIkNvbnRlbnRQcm92aWRlciI7CisKICAgICAvKgogICAgICAqIE5vdGU6IGlmIHlvdSBhZGQgbWV0aG9kcyB0byBDb250ZW50UHJvdmlkZXIsIHlvdSBtdXN0IGFkZCBzaW1pbGFyIG1ldGhvZHMgdG8KICAgICAgKiAgICAgICBNb2NrQ29udGVudFByb3ZpZGVyLgpAQCAtMjQ5LDYgKzI1NCwxOCBAQAogICAgICAgICAgICAgcmV0dXJuIENvbnRlbnRQcm92aWRlci50aGlzLmNhbGwobWV0aG9kLCByZXF1ZXN0LCBhcmdzKTsKICAgICAgICAgfQogCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgU3RyaW5nW10gZ2V0U3RyZWFtVHlwZXMoVXJpIHVyaSwgU3RyaW5nIG1pbWVUeXBlRmlsdGVyKSB7CisgICAgICAgICAgICByZXR1cm4gQ29udGVudFByb3ZpZGVyLnRoaXMuZ2V0U3RyZWFtVHlwZXModXJpLCBtaW1lVHlwZUZpbHRlcik7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIEFzc2V0RmlsZURlc2NyaXB0b3Igb3BlblR5cGVkQXNzZXRGaWxlKFVyaSB1cmksIFN0cmluZyBtaW1lVHlwZSwgQnVuZGxlIG9wdHMpCisgICAgICAgICAgICAgICAgdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiB7CisgICAgICAgICAgICBlbmZvcmNlUmVhZFBlcm1pc3Npb24odXJpKTsKKyAgICAgICAgICAgIHJldHVybiBDb250ZW50UHJvdmlkZXIudGhpcy5vcGVuVHlwZWRBc3NldEZpbGUodXJpLCBtaW1lVHlwZSwgb3B0cyk7CisgICAgICAgIH0KKwogICAgICAgICBwcml2YXRlIHZvaWQgZW5mb3JjZVJlYWRQZXJtaXNzaW9uKFVyaSB1cmkpIHsKICAgICAgICAgICAgIGZpbmFsIGludCB1aWQgPSBCaW5kZXIuZ2V0Q2FsbGluZ1VpZCgpOwogICAgICAgICAgICAgaWYgKHVpZCA9PSBtTXlVaWQpIHsKQEAgLTc1MCw2ICs3NjcsMTQ0IEBACiAgICAgfQogCiAgICAgLyoqCisgICAgICogQ2FsbGVkIGJ5IGEgY2xpZW50IHRvIGRldGVybWluZSB0aGUgdHlwZXMgb2YgZGF0YSBzdHJlYW1zIHRoYXQgdGhpcworICAgICAqIGNvbnRlbnQgcHJvdmlkZXIgc3VwcG9ydHMgZm9yIHRoZSBnaXZlbiBVUkkuICBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbgorICAgICAqIHJldHVybnMgbnVsbCwgbWVhbmluZyBubyB0eXBlcy4gIElmIHlvdXIgY29udGVudCBwcm92aWRlciBzdG9yZXMgZGF0YQorICAgICAqIG9mIGEgcGFydGljdWxhciB0eXBlLCByZXR1cm4gdGhhdCBNSU1FIHR5cGUgaWYgaXQgbWF0Y2hlcyB0aGUgZ2l2ZW4KKyAgICAgKiBtaW1lVHlwZUZpbHRlci4gIElmIGl0IGNhbiBwZXJmb3JtIHR5cGUgY29udmVyc2lvbnMsIHJldHVybiBhbiBhcnJheQorICAgICAqIG9mIGFsbCBzdXBwb3J0ZWQgTUlNRSB0eXBlcyB0aGF0IG1hdGNoIG1pbWVUeXBlRmlsdGVyLgorICAgICAqCisgICAgICogQHBhcmFtIHVyaSBUaGUgZGF0YSBpbiB0aGUgY29udGVudCBwcm92aWRlciBiZWluZyBxdWVyaWVkLgorICAgICAqIEBwYXJhbSBtaW1lVHlwZUZpbHRlciBUaGUgdHlwZSBvZiBkYXRhIHRoZSBjbGllbnQgZGVzaXJlcy4gIE1heSBiZQorICAgICAqIGEgcGF0dGVybiwgc3VjaCBhcyAqXC8qIHRvIHJldHJpZXZlIGFsbCBwb3NzaWJsZSBkYXRhIHR5cGVzLgorICAgICAqIEByZXR1cm4gUmV0dXJucyBudWxsIGlmIHRoZXJlIGFyZSBubyBwb3NzaWJsZSBkYXRhIHN0cmVhbXMgZm9yIHRoZQorICAgICAqIGdpdmVuIG1pbWVUeXBlRmlsdGVyLiAgT3RoZXJ3aXNlIHJldHVybnMgYW4gYXJyYXkgb2YgYWxsIGF2YWlsYWJsZQorICAgICAqIGNvbmNyZXRlIE1JTUUgdHlwZXMuCisgICAgICoKKyAgICAgKiBAc2VlICNnZXRUeXBlKFVyaSkKKyAgICAgKiBAc2VlICNvcGVuVHlwZWRBc3NldEZpbGUoVXJpLCBTdHJpbmcsIEJ1bmRsZSkKKyAgICAgKiBAc2VlIENsaXBEZXNjcmlwdGlvbiNjb21wYXJlTWltZVR5cGVzKFN0cmluZywgU3RyaW5nKQorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRTdHJlYW1UeXBlcyhVcmkgdXJpLCBTdHJpbmcgbWltZVR5cGVGaWx0ZXIpIHsKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2FsbGVkIGJ5IGEgY2xpZW50IHRvIG9wZW4gYSByZWFkLW9ubHkgc3RyZWFtIGNvbnRhaW5pbmcgZGF0YSBvZiBhCisgICAgICogcGFydGljdWxhciBNSU1FIHR5cGUuICBUaGlzIGlzIGxpa2Uge0BsaW5rICNvcGVuQXNzZXRGaWxlKFVyaSwgU3RyaW5nKX0sCisgICAgICogZXhjZXB0IHRoZSBmaWxlIGNhbiBvbmx5IGJlIHJlYWQtb25seSBhbmQgdGhlIGNvbnRlbnQgcHJvdmlkZXIgbWF5CisgICAgICogcGVyZm9ybSBkYXRhIGNvbnZlcnNpb25zIHRvIGdlbmVyYXRlIGRhdGEgb2YgdGhlIGRlc2lyZWQgdHlwZS4KKyAgICAgKgorICAgICAqIDxwPlRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIGNvbXBhcmVzIHRoZSBnaXZlbiBtaW1lVHlwZSBhZ2FpbnN0IHRoZQorICAgICAqIHJlc3VsdCBvZiB7QGxpbmsgI2dldFR5cGUoVXJpKX0gYW5kLCBpZiB0aGUgbWF0Y2gsIHNpbXBsZSBjYWxscworICAgICAqIHtAbGluayAjb3BlbkFzc2V0RmlsZShVcmksIFN0cmluZyl9LgorICAgICAqCisgICAgICogPHA+U2VlIHtAbGluayBDbGlwRGF0YX0gZm9yIGV4YW1wbGVzIG9mIHRoZSB1c2UgYW5kIGltcGxlbWVudGF0aW9uCisgICAgICogb2YgdGhpcyBtZXRob2QuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdXJpIFRoZSBkYXRhIGluIHRoZSBjb250ZW50IHByb3ZpZGVyIGJlaW5nIHF1ZXJpZWQuCisgICAgICogQHBhcmFtIG1pbWVUeXBlRmlsdGVyIFRoZSB0eXBlIG9mIGRhdGEgdGhlIGNsaWVudCBkZXNpcmVzLiAgTWF5IGJlCisgICAgICogYSBwYXR0ZXJuLCBzdWNoIGFzICpcLyosIGlmIHRoZSBjYWxsZXIgZG9lcyBub3QgaGF2ZSBzcGVjaWZpYyB0eXBlCisgICAgICogcmVxdWlyZW1lbnRzOyBpbiB0aGlzIGNhc2UgdGhlIGNvbnRlbnQgcHJvdmlkZXIgd2lsbCBwaWNrIGl0cyBiZXN0CisgICAgICogdHlwZSBtYXRjaGluZyB0aGUgcGF0dGVybi4KKyAgICAgKiBAcGFyYW0gb3B0cyBBZGRpdGlvbmFsIG9wdGlvbnMgZnJvbSB0aGUgY2xpZW50LiAgVGhlIGRlZmluaXRpb25zIG9mCisgICAgICogdGhlc2UgYXJlIHNwZWNpZmljIHRvIHRoZSBjb250ZW50IHByb3ZpZGVyIGJlaW5nIGNhbGxlZC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gUmV0dXJucyBhIG5ldyBBc3NldEZpbGVEZXNjcmlwdG9yIGZyb20gd2hpY2ggdGhlIGNsaWVudCBjYW4KKyAgICAgKiByZWFkIGRhdGEgb2YgdGhlIGRlc2lyZWQgdHlwZS4KKyAgICAgKgorICAgICAqIEB0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uIFRocm93cyBGaWxlTm90Rm91bmRFeGNlcHRpb24gaWYgdGhlcmUgaXMKKyAgICAgKiBubyBmaWxlIGFzc29jaWF0ZWQgd2l0aCB0aGUgZ2l2ZW4gVVJJIG9yIHRoZSBtb2RlIGlzIGludmFsaWQuCisgICAgICogQHRocm93cyBTZWN1cml0eUV4Y2VwdGlvbiBUaHJvd3MgU2VjdXJpdHlFeGNlcHRpb24gaWYgdGhlIGNhbGxlciBkb2VzCisgICAgICogbm90IGhhdmUgcGVybWlzc2lvbiB0byBhY2Nlc3MgdGhlIGRhdGEuCisgICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gVGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGUKKyAgICAgKiBjb250ZW50IHByb3ZpZGVyIGRvZXMgbm90IHN1cHBvcnQgdGhlIHJlcXVlc3RlZCBNSU1FIHR5cGUuCisgICAgICoKKyAgICAgKiBAc2VlICNnZXRTdHJlYW1UeXBlcyhVcmksIFN0cmluZykKKyAgICAgKiBAc2VlICNvcGVuQXNzZXRGaWxlKFVyaSwgU3RyaW5nKQorICAgICAqIEBzZWUgQ2xpcERlc2NyaXB0aW9uI2NvbXBhcmVNaW1lVHlwZXMoU3RyaW5nLCBTdHJpbmcpCisgICAgICovCisgICAgcHVibGljIEFzc2V0RmlsZURlc2NyaXB0b3Igb3BlblR5cGVkQXNzZXRGaWxlKFVyaSB1cmksIFN0cmluZyBtaW1lVHlwZUZpbHRlciwgQnVuZGxlIG9wdHMpCisgICAgICAgICAgICB0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKCIqLyoiLmVxdWFscyhtaW1lVHlwZUZpbHRlcikpIHsKKyAgICAgICAgICAgIC8vIElmIHRoZXkgY2FuIHRha2UgYW55dGhpbmcsIHRoZSB1bnR5cGVkIG9wZW4gY2FsbCBpcyBnb29kIGVub3VnaC4KKyAgICAgICAgICAgIHJldHVybiBvcGVuQXNzZXRGaWxlKHVyaSwgInIiKTsKKyAgICAgICAgfQorICAgICAgICBTdHJpbmcgYmFzZVR5cGUgPSBnZXRUeXBlKHVyaSk7CisgICAgICAgIGlmIChiYXNlVHlwZSAhPSBudWxsICYmIENsaXBEZXNjcmlwdGlvbi5jb21wYXJlTWltZVR5cGVzKGJhc2VUeXBlLCBtaW1lVHlwZUZpbHRlcikpIHsKKyAgICAgICAgICAgIC8vIFVzZSBvbGQgdW50eXBlZCBvcGVuIGNhbGwgaWYgdGhpcyBwcm92aWRlciBoYXMgYSB0eXBlIGZvciB0aGlzCisgICAgICAgICAgICAvLyBVUkkgYW5kIGl0IG1hdGNoZXMgdGhlIHJlcXVlc3QuCisgICAgICAgICAgICByZXR1cm4gb3BlbkFzc2V0RmlsZSh1cmksICJyIik7CisgICAgICAgIH0KKyAgICAgICAgdGhyb3cgbmV3IEZpbGVOb3RGb3VuZEV4Y2VwdGlvbigiQ2FuJ3Qgb3BlbiAiICsgdXJpICsgIiBhcyB0eXBlICIgKyBtaW1lVHlwZUZpbHRlcik7CisgICAgfQorCisgICAgLyoqCisgICAgICogSW50ZXJmYWNlIHRvIHdyaXRlIGEgc3RyZWFtIG9mIGRhdGEgdG8gYSBwaXBlLiAgVXNlIHdpdGgKKyAgICAgKiB7QGxpbmsgQ29udGVudFByb3ZpZGVyI29wZW5QaXBlSGVscGVyfS4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50ZXJmYWNlIFBpcGVEYXRhV3JpdGVyPFQ+IHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIENhbGxlZCBmcm9tIGEgYmFja2dyb3VuZCB0aHJlYWQgdG8gc3RyZWFtIGRhdGEgb3V0IHRvIGEgcGlwZS4KKyAgICAgICAgICogTm90ZSB0aGF0IHRoZSBwaXBlIGlzIGJsb2NraW5nLCBzbyB0aGlzIHRocmVhZCBjYW4gYmxvY2sgb24KKyAgICAgICAgICogd3JpdGVzIGZvciBhbiBhcmJpdHJhcnkgYW1vdW50IG9mIHRpbWUgaWYgdGhlIGNsaWVudCBpcyBzbG93CisgICAgICAgICAqIGF0IHJlYWRpbmcuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBvdXRwdXQgVGhlIHBpcGUgd2hlcmUgZGF0YSBzaG91bGQgYmUgd3JpdHRlbi4gIFRoaXMgd2lsbCBiZQorICAgICAgICAgKiBjbG9zZWQgZm9yIHlvdSB1cG9uIHJldHVybmluZyBmcm9tIHRoaXMgZnVuY3Rpb24uCisgICAgICAgICAqIEBwYXJhbSB1cmkgVGhlIFVSSSB3aG9zZSBkYXRhIGlzIHRvIGJlIHdyaXR0ZW4uCisgICAgICAgICAqIEBwYXJhbSBtaW1lVHlwZSBUaGUgZGVzaXJlZCB0eXBlIG9mIGRhdGEgdG8gYmUgd3JpdHRlbi4KKyAgICAgICAgICogQHBhcmFtIG9wdHMgT3B0aW9ucyBzdXBwbGllZCBieSBjYWxsZXIuCisgICAgICAgICAqIEBwYXJhbSBhcmdzIFlvdXIgb3duIGN1c3RvbSBhcmd1bWVudHMuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgdm9pZCB3cml0ZURhdGFUb1BpcGUoUGFyY2VsRmlsZURlc2NyaXB0b3Igb3V0cHV0LCBVcmkgdXJpLCBTdHJpbmcgbWltZVR5cGUsCisgICAgICAgICAgICAgICAgQnVuZGxlIG9wdHMsIFQgYXJncyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQSBoZWxwZXIgZnVuY3Rpb24gZm9yIGltcGxlbWVudGluZyB7QGxpbmsgI29wZW5UeXBlZEFzc2V0RmlsZX0sIGZvcgorICAgICAqIGNyZWF0aW5nIGEgZGF0YSBwaXBlIGFuZCBiYWNrZ3JvdW5kIHRocmVhZCBhbGxvd2luZyB5b3UgdG8gc3RyZWFtCisgICAgICogZ2VuZXJhdGVkIGRhdGEgYmFjayB0byB0aGUgY2xpZW50LiAgVGhpcyBmdW5jdGlvbiByZXR1cm5zIGEgbmV3CisgICAgICogUGFyY2VsRmlsZURlc2NyaXB0b3IgdGhhdCBzaG91bGQgYmUgcmV0dXJuZWQgdG8gdGhlIGNhbGxlciAodGhlIGNhbGxlcgorICAgICAqIGlzIHJlc3BvbnNpYmxlIGZvciBjbG9zaW5nIGl0KS4KKyAgICAgKgorICAgICAqIEBwYXJhbSB1cmkgVGhlIFVSSSB3aG9zZSBkYXRhIGlzIHRvIGJlIHdyaXR0ZW4uCisgICAgICogQHBhcmFtIG1pbWVUeXBlIFRoZSBkZXNpcmVkIHR5cGUgb2YgZGF0YSB0byBiZSB3cml0dGVuLgorICAgICAqIEBwYXJhbSBvcHRzIE9wdGlvbnMgc3VwcGxpZWQgYnkgY2FsbGVyLgorICAgICAqIEBwYXJhbSBhcmdzIFlvdXIgb3duIGN1c3RvbSBhcmd1bWVudHMuCisgICAgICogQHBhcmFtIGZ1bmMgSW50ZXJmYWNlIGltcGxlbWVudGluZyB0aGUgZnVuY3Rpb24gdGhhdCB3aWxsIGFjdHVhbGx5CisgICAgICogc3RyZWFtIHRoZSBkYXRhLgorICAgICAqIEByZXR1cm4gUmV0dXJucyBhIG5ldyBQYXJjZWxGaWxlRGVzY3JpcHRvciBob2xkaW5nIHRoZSByZWFkIHNpZGUgb2YKKyAgICAgKiB0aGUgcGlwZS4gIFRoaXMgc2hvdWxkIGJlIHJldHVybmVkIHRvIHRoZSBjYWxsZXIgZm9yIHJlYWRpbmc7IHRoZSBjYWxsZXIKKyAgICAgKiBpcyByZXNwb25zaWJsZSBmb3IgY2xvc2luZyBpdCB3aGVuIGRvbmUuCisgICAgICovCisgICAgcHVibGljIDxUPiBQYXJjZWxGaWxlRGVzY3JpcHRvciBvcGVuUGlwZUhlbHBlcihmaW5hbCBVcmkgdXJpLCBmaW5hbCBTdHJpbmcgbWltZVR5cGUsCisgICAgICAgICAgICBmaW5hbCBCdW5kbGUgb3B0cywgZmluYWwgVCBhcmdzLCBmaW5hbCBQaXBlRGF0YVdyaXRlcjxUPiBmdW5jKQorICAgICAgICAgICAgdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBmaW5hbCBQYXJjZWxGaWxlRGVzY3JpcHRvcltdIGZkcyA9IFBhcmNlbEZpbGVEZXNjcmlwdG9yLmNyZWF0ZVBpcGUoKTsKKworICAgICAgICAgICAgQXN5bmNUYXNrPE9iamVjdCwgT2JqZWN0LCBPYmplY3Q+IHRhc2sgPSBuZXcgQXN5bmNUYXNrPE9iamVjdCwgT2JqZWN0LCBPYmplY3Q+KCkgeworICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgIHByb3RlY3RlZCBPYmplY3QgZG9JbkJhY2tncm91bmQoT2JqZWN0Li4uIHBhcmFtcykgeworICAgICAgICAgICAgICAgICAgICBmdW5jLndyaXRlRGF0YVRvUGlwZShmZHNbMV0sIHVyaSwgbWltZVR5cGUsIG9wdHMsIGFyZ3MpOworICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgZmRzWzFdLmNsb3NlKCk7CisgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIExvZy53KFRBRywgIkZhaWx1cmUgY2xvc2luZyBwaXBlIiwgZSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfTsKKyAgICAgICAgICAgIHRhc2suZXhlY3V0ZSgoT2JqZWN0W10pbnVsbCk7CisKKyAgICAgICAgICAgIHJldHVybiBmZHNbMF07CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBGaWxlTm90Rm91bmRFeGNlcHRpb24oImZhaWx1cmUgbWFraW5nIHBpcGUiKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgogICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIGluc3RhbmNlIGlzIGEgdGVtcG9yYXJ5IGNvbnRlbnQgcHJvdmlkZXIuCiAgICAgICogQHJldHVybiB0cnVlIGlmIHRoaXMgaW5zdGFuY2UgaXMgYSB0ZW1wb3JhcnkgY29udGVudCBwcm92aWRlcgogICAgICAqLwpAQCAtNzc1LDYgKzkzMCwxMSBAQAogICAgICAqIEBwYXJhbSBpbmZvIFJlZ2lzdGVyZWQgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBjb250ZW50IHByb3ZpZGVyCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgYXR0YWNoSW5mbyhDb250ZXh0IGNvbnRleHQsIFByb3ZpZGVySW5mbyBpbmZvKSB7CisgICAgICAgIC8qCisgICAgICAgICAqIFdlIG1heSBiZSB1c2luZyBBc3luY1Rhc2sgZnJvbSBiaW5kZXIgdGhyZWFkcy4gIE1ha2UgaXQgaW5pdCBoZXJlCisgICAgICAgICAqIHNvIGl0cyBzdGF0aWMgaGFuZGxlciBpcyBvbiB0aGUgbWFpbiB0aHJlYWQuCisgICAgICAgICAqLworICAgICAgICBBc3luY1Rhc2suaW5pdCgpOwogCiAgICAgICAgIC8qCiAgICAgICAgICAqIE9ubHkgYWxsb3cgaXQgdG8gYmUgc2V0IG9uY2UsIHNvIGFmdGVyIHRoZSBjb250ZW50IHNlcnZpY2UgZ2l2ZXMKQEAgLTgyMyw3ICs5ODMsNyBAQAogICAgIC8qKgogICAgICAqIEBoaWRlIC0tIHVudGlsIGludGVyZmFjZSBoYXMgcHJvdmVuIGl0c2VsZgogICAgICAqCi0gICAgICogQ2FsbCBhbiBwcm92aWRlci1kZWZpbmVkIG1ldGhvZC4gIFRoaXMgY2FuIGJlIHVzZWQgdG8gaW1wbGVtZW50CisgICAgICogQ2FsbCBhIHByb3ZpZGVyLWRlZmluZWQgbWV0aG9kLiAgVGhpcyBjYW4gYmUgdXNlZCB0byBpbXBsZW1lbnQKICAgICAgKiBpbnRlcmZhY2VzIHRoYXQgYXJlIGNoZWFwZXIgdGhhbiB1c2luZyBhIEN1cnNvci4KICAgICAgKgogICAgICAqIEBwYXJhbSBtZXRob2QgTWV0aG9kIG5hbWUgdG8gY2FsbC4gIE9wYXF1ZSB0byBmcmFtZXdvcmsuCkBAIC04MzMsNCArOTkzLDMxIEBACiAgICAgcHVibGljIEJ1bmRsZSBjYWxsKFN0cmluZyBtZXRob2QsIFN0cmluZyByZXF1ZXN0LCBCdW5kbGUgYXJncykgewogICAgICAgICByZXR1cm4gbnVsbDsKICAgICB9CisKKyAgICAvKioKKyAgICAgKiBJbXBsZW1lbnQgdGhpcyB0byBzaHV0IGRvd24gdGhlIENvbnRlbnRQcm92aWRlciBpbnN0YW5jZS4gWW91IGNhbiB0aGVuCisgICAgICogaW52b2tlIHRoaXMgbWV0aG9kIGluIHVuaXQgdGVzdHMuCisgICAgICogCisgICAgICogPHA+CisgICAgICogQW5kcm9pZCBub3JtYWxseSBoYW5kbGVzIENvbnRlbnRQcm92aWRlciBzdGFydHVwIGFuZCBzaHV0ZG93bgorICAgICAqIGF1dG9tYXRpY2FsbHkuIFlvdSBkbyBub3QgbmVlZCB0byBzdGFydCB1cCBvciBzaHV0IGRvd24gYQorICAgICAqIENvbnRlbnRQcm92aWRlci4gV2hlbiB5b3UgaW52b2tlIGEgdGVzdCBtZXRob2Qgb24gYSBDb250ZW50UHJvdmlkZXIsCisgICAgICogaG93ZXZlciwgYSBDb250ZW50UHJvdmlkZXIgaW5zdGFuY2UgaXMgc3RhcnRlZCBhbmQga2VlcHMgcnVubmluZyBhZnRlcgorICAgICAqIHRoZSB0ZXN0IGZpbmlzaGVzLCBldmVuIGlmIGEgc3VjY2VlZGluZyB0ZXN0IGluc3RhbnRpYXRlcyBhbm90aGVyCisgICAgICogQ29udGVudFByb3ZpZGVyLiBBIGNvbmZsaWN0IGRldmVsb3BzIGJlY2F1c2UgdGhlIHR3byBpbnN0YW5jZXMgYXJlCisgICAgICogdXN1YWxseSBydW5uaW5nIGFnYWluc3QgdGhlIHNhbWUgdW5kZXJseWluZyBkYXRhIHNvdXJjZSAoZm9yIGV4YW1wbGUsIGFuCisgICAgICogc3FsaXRlIGRhdGFiYXNlKS4KKyAgICAgKiA8L3A+CisgICAgICogPHA+CisgICAgICogSW1wbGVtZW50aW5nIHNodXREb3duKCkgYXZvaWRzIHRoaXMgY29uZmxpY3QgYnkgcHJvdmlkaW5nIGEgd2F5IHRvCisgICAgICogdGVybWluYXRlIHRoZSBDb250ZW50UHJvdmlkZXIuIFRoaXMgbWV0aG9kIGNhbiBhbHNvIHByZXZlbnQgbWVtb3J5IGxlYWtzCisgICAgICogZnJvbSBtdWx0aXBsZSBpbnN0YW50aWF0aW9ucyBvZiB0aGUgQ29udGVudFByb3ZpZGVyLCBhbmQgaXQgY2FuIGVuc3VyZQorICAgICAqIHVuaXQgdGVzdCBpc29sYXRpb24gYnkgYWxsb3dpbmcgeW91IHRvIGNvbXBsZXRlbHkgY2xlYW4gdXAgdGhlIHRlc3QKKyAgICAgKiBmaXh0dXJlIGJlZm9yZSBtb3Zpbmcgb24gdG8gdGhlIG5leHQgdGVzdC4KKyAgICAgKiA8L3A+CisgICAgICovCisgICAgcHVibGljIHZvaWQgc2h1dGRvd24oKSB7CisgICAgICAgIExvZy53KFRBRywgImltcGxlbWVudCBDb250ZW50UHJvdmlkZXIgc2h1dGRvd24oKSB0byBtYWtlIHN1cmUgYWxsIGRhdGFiYXNlICIgKworICAgICAgICAgICAgICAgICJjb25uZWN0aW9ucyBhcmUgZ3JhY2VmdWxseSBzaHV0ZG93biIpOworICAgIH0KIH0KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvQ29udGVudFByb3ZpZGVyQ2xpZW50LmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L0NvbnRlbnRQcm92aWRlckNsaWVudC5qYXZhCmluZGV4IDA4NThlYTUuLjA1NDAxMDkgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvQ29udGVudFByb3ZpZGVyQ2xpZW50LmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9Db250ZW50UHJvdmlkZXJDbGllbnQuamF2YQpAQCAtMTgsNiArMTgsNyBAQAogCiBpbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5DdXJzb3I7CiBpbXBvcnQgYW5kcm9pZC5uZXQuVXJpOworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOwogaW1wb3J0IGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uOwogaW1wb3J0IGFuZHJvaWQub3MuUGFyY2VsRmlsZURlc2NyaXB0b3I7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5Bc3NldEZpbGVEZXNjcmlwdG9yOwpAQCAtNDMsNTMgKzQ0LDc3IEBACiAgICAgICAgIG1Db250ZW50UmVzb2x2ZXIgPSBjb250ZW50UmVzb2x2ZXI7CiAgICAgfQogCi0gICAgLyoqIHNlZSB7QGxpbmsgQ29udGVudFByb3ZpZGVyI3F1ZXJ5fSAqLworICAgIC8qKiBTZWUge0BsaW5rIENvbnRlbnRQcm92aWRlciNxdWVyeSBDb250ZW50UHJvdmlkZXIucXVlcnl9ICovCiAgICAgcHVibGljIEN1cnNvciBxdWVyeShVcmkgdXJsLCBTdHJpbmdbXSBwcm9qZWN0aW9uLCBTdHJpbmcgc2VsZWN0aW9uLAogICAgICAgICAgICAgU3RyaW5nW10gc2VsZWN0aW9uQXJncywgU3RyaW5nIHNvcnRPcmRlcikgdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbiB7CiAgICAgICAgIHJldHVybiBtQ29udGVudFByb3ZpZGVyLnF1ZXJ5KHVybCwgcHJvamVjdGlvbiwgc2VsZWN0aW9uLCAgc2VsZWN0aW9uQXJncywgc29ydE9yZGVyKTsKICAgICB9CiAKLSAgICAvKiogc2VlIHtAbGluayBDb250ZW50UHJvdmlkZXIjZ2V0VHlwZX0gKi8KKyAgICAvKiogU2VlIHtAbGluayBDb250ZW50UHJvdmlkZXIjZ2V0VHlwZSBDb250ZW50UHJvdmlkZXIuZ2V0VHlwZX0gKi8KICAgICBwdWJsaWMgU3RyaW5nIGdldFR5cGUoVXJpIHVybCkgdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbiB7CiAgICAgICAgIHJldHVybiBtQ29udGVudFByb3ZpZGVyLmdldFR5cGUodXJsKTsKICAgICB9CiAKLSAgICAvKiogc2VlIHtAbGluayBDb250ZW50UHJvdmlkZXIjaW5zZXJ0fSAqLworICAgIC8qKiBTZWUge0BsaW5rIENvbnRlbnRQcm92aWRlciNnZXRTdHJlYW1UeXBlcyBDb250ZW50UHJvdmlkZXIuZ2V0U3RyZWFtVHlwZXN9ICovCisgICAgcHVibGljIFN0cmluZ1tdIGdldFN0cmVhbVR5cGVzKFVyaSB1cmwsIFN0cmluZyBtaW1lVHlwZUZpbHRlcikgdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBtQ29udGVudFByb3ZpZGVyLmdldFN0cmVhbVR5cGVzKHVybCwgbWltZVR5cGVGaWx0ZXIpOworICAgIH0KKworICAgIC8qKiBTZWUge0BsaW5rIENvbnRlbnRQcm92aWRlciNpbnNlcnQgQ29udGVudFByb3ZpZGVyLmluc2VydH0gKi8KICAgICBwdWJsaWMgVXJpIGluc2VydChVcmkgdXJsLCBDb250ZW50VmFsdWVzIGluaXRpYWxWYWx1ZXMpCiAgICAgICAgICAgICB0aHJvd3MgUmVtb3RlRXhjZXB0aW9uIHsKICAgICAgICAgcmV0dXJuIG1Db250ZW50UHJvdmlkZXIuaW5zZXJ0KHVybCwgaW5pdGlhbFZhbHVlcyk7CiAgICAgfQogCi0gICAgLyoqIHNlZSB7QGxpbmsgQ29udGVudFByb3ZpZGVyI2J1bGtJbnNlcnR9ICovCisgICAgLyoqIFNlZSB7QGxpbmsgQ29udGVudFByb3ZpZGVyI2J1bGtJbnNlcnQgQ29udGVudFByb3ZpZGVyLmJ1bGtJbnNlcnR9ICovCiAgICAgcHVibGljIGludCBidWxrSW5zZXJ0KFVyaSB1cmwsIENvbnRlbnRWYWx1ZXNbXSBpbml0aWFsVmFsdWVzKSB0aHJvd3MgUmVtb3RlRXhjZXB0aW9uIHsKICAgICAgICAgcmV0dXJuIG1Db250ZW50UHJvdmlkZXIuYnVsa0luc2VydCh1cmwsIGluaXRpYWxWYWx1ZXMpOwogICAgIH0KIAotICAgIC8qKiBzZWUge0BsaW5rIENvbnRlbnRQcm92aWRlciNkZWxldGV9ICovCisgICAgLyoqIFNlZSB7QGxpbmsgQ29udGVudFByb3ZpZGVyI2RlbGV0ZSBDb250ZW50UHJvdmlkZXIuZGVsZXRlfSAqLwogICAgIHB1YmxpYyBpbnQgZGVsZXRlKFVyaSB1cmwsIFN0cmluZyBzZWxlY3Rpb24sIFN0cmluZ1tdIHNlbGVjdGlvbkFyZ3MpCiAgICAgICAgICAgICB0aHJvd3MgUmVtb3RlRXhjZXB0aW9uIHsKICAgICAgICAgcmV0dXJuIG1Db250ZW50UHJvdmlkZXIuZGVsZXRlKHVybCwgc2VsZWN0aW9uLCBzZWxlY3Rpb25BcmdzKTsKICAgICB9CiAKLSAgICAvKiogc2VlIHtAbGluayBDb250ZW50UHJvdmlkZXIjdXBkYXRlfSAqLworICAgIC8qKiBTZWUge0BsaW5rIENvbnRlbnRQcm92aWRlciN1cGRhdGUgQ29udGVudFByb3ZpZGVyLnVwZGF0ZX0gKi8KICAgICBwdWJsaWMgaW50IHVwZGF0ZShVcmkgdXJsLCBDb250ZW50VmFsdWVzIHZhbHVlcywgU3RyaW5nIHNlbGVjdGlvbiwKICAgICAgICAgICAgIFN0cmluZ1tdIHNlbGVjdGlvbkFyZ3MpIHRocm93cyBSZW1vdGVFeGNlcHRpb24gewogICAgICAgICByZXR1cm4gbUNvbnRlbnRQcm92aWRlci51cGRhdGUodXJsLCB2YWx1ZXMsIHNlbGVjdGlvbiwgc2VsZWN0aW9uQXJncyk7CiAgICAgfQogCi0gICAgLyoqIHNlZSB7QGxpbmsgQ29udGVudFByb3ZpZGVyI29wZW5GaWxlfSAqLworICAgIC8qKgorICAgICAqIFNlZSB7QGxpbmsgQ29udGVudFByb3ZpZGVyI29wZW5GaWxlIENvbnRlbnRQcm92aWRlci5vcGVuRmlsZX0uICBOb3RlIHRoYXQKKyAgICAgKiB0aGlzIDxlbT5kb2VzIG5vdDwvZW0+CisgICAgICogdGFrZSBjYXJlIG9mIG5vbi1jb250ZW50OiBVUklzIHN1Y2ggYXMgZmlsZTouICBJdCBpcyBzdHJvbmdseSByZWNvbW1lbmRlZAorICAgICAqIHlvdSB1c2UgdGhlIHtAbGluayBDb250ZW50UmVzb2x2ZXIjb3BlbkZpbGVEZXNjcmlwdG9yCisgICAgICogQ29udGVudFJlc29sdmVyLm9wZW5GaWxlRGVzY3JpcHRvcn0gQVBJIGluc3RlYWQuCisgICAgICovCiAgICAgcHVibGljIFBhcmNlbEZpbGVEZXNjcmlwdG9yIG9wZW5GaWxlKFVyaSB1cmwsIFN0cmluZyBtb2RlKQogICAgICAgICAgICAgdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbiwgRmlsZU5vdEZvdW5kRXhjZXB0aW9uIHsKICAgICAgICAgcmV0dXJuIG1Db250ZW50UHJvdmlkZXIub3BlbkZpbGUodXJsLCBtb2RlKTsKICAgICB9CiAKLSAgICAvKiogc2VlIHtAbGluayBDb250ZW50UHJvdmlkZXIjb3BlbkFzc2V0RmlsZX0gKi8KKyAgICAvKioKKyAgICAgKiBTZWUge0BsaW5rIENvbnRlbnRQcm92aWRlciNvcGVuQXNzZXRGaWxlIENvbnRlbnRQcm92aWRlci5vcGVuQXNzZXRGaWxlfS4KKyAgICAgKiBOb3RlIHRoYXQgdGhpcyA8ZW0+ZG9lcyBub3Q8L2VtPgorICAgICAqIHRha2UgY2FyZSBvZiBub24tY29udGVudDogVVJJcyBzdWNoIGFzIGZpbGU6LiAgSXQgaXMgc3Ryb25nbHkgcmVjb21tZW5kZWQKKyAgICAgKiB5b3UgdXNlIHRoZSB7QGxpbmsgQ29udGVudFJlc29sdmVyI29wZW5Bc3NldEZpbGVEZXNjcmlwdG9yCisgICAgICogQ29udGVudFJlc29sdmVyLm9wZW5Bc3NldEZpbGVEZXNjcmlwdG9yfSBBUEkgaW5zdGVhZC4KKyAgICAgKi8KICAgICBwdWJsaWMgQXNzZXRGaWxlRGVzY3JpcHRvciBvcGVuQXNzZXRGaWxlKFVyaSB1cmwsIFN0cmluZyBtb2RlKQogICAgICAgICAgICAgdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbiwgRmlsZU5vdEZvdW5kRXhjZXB0aW9uIHsKICAgICAgICAgcmV0dXJuIG1Db250ZW50UHJvdmlkZXIub3BlbkFzc2V0RmlsZSh1cmwsIG1vZGUpOwogICAgIH0KIAotICAgICAvKiogc2VlIHtAbGluayBDb250ZW50UHJvdmlkZXIjYXBwbHlCYXRjaH0gKi8KKyAgICAvKiogU2VlIHtAbGluayBDb250ZW50UHJvdmlkZXIjb3BlblR5cGVkQXNzZXRGaWxlIENvbnRlbnRQcm92aWRlci5vcGVuVHlwZWRBc3NldEZpbGV9ICovCisgICAgcHVibGljIGZpbmFsIEFzc2V0RmlsZURlc2NyaXB0b3Igb3BlblR5cGVkQXNzZXRGaWxlRGVzY3JpcHRvcihVcmkgdXJpLAorICAgICAgICAgICAgU3RyaW5nIG1pbWVUeXBlLCBCdW5kbGUgb3B0cykKKyAgICAgICAgICAgIHRocm93cyBSZW1vdGVFeGNlcHRpb24sIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBtQ29udGVudFByb3ZpZGVyLm9wZW5UeXBlZEFzc2V0RmlsZSh1cmksIG1pbWVUeXBlLCBvcHRzKTsKKyAgICB9CisKKyAgICAvKiogU2VlIHtAbGluayBDb250ZW50UHJvdmlkZXIjYXBwbHlCYXRjaCBDb250ZW50UHJvdmlkZXIuYXBwbHlCYXRjaH0gKi8KICAgICBwdWJsaWMgQ29udGVudFByb3ZpZGVyUmVzdWx0W10gYXBwbHlCYXRjaChBcnJheUxpc3Q8Q29udGVudFByb3ZpZGVyT3BlcmF0aW9uPiBvcGVyYXRpb25zKQogICAgICAgICAgICAgdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbiwgT3BlcmF0aW9uQXBwbGljYXRpb25FeGNlcHRpb24gewogICAgICAgICByZXR1cm4gbUNvbnRlbnRQcm92aWRlci5hcHBseUJhdGNoKG9wZXJhdGlvbnMpOwpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9Db250ZW50UHJvdmlkZXJOYXRpdmUuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvQ29udGVudFByb3ZpZGVyTmF0aXZlLmphdmEKaW5kZXggZmRiM2QyMC4uZDFhYjhkNSAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9Db250ZW50UHJvdmlkZXJOYXRpdmUuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L0NvbnRlbnRQcm92aWRlck5hdGl2ZS5qYXZhCkBAIC0yNTcsNiArMjU3LDM4IEBACiAgICAgICAgICAgICAgICAgICAgIHJlcGx5LndyaXRlQnVuZGxlKHJlc3BvbnNlQnVuZGxlKTsKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBHRVRfU1RSRUFNX1RZUEVTX1RSQU5TQUNUSU9OOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZGF0YS5lbmZvcmNlSW50ZXJmYWNlKElDb250ZW50UHJvdmlkZXIuZGVzY3JpcHRvcik7CisgICAgICAgICAgICAgICAgICAgIFVyaSB1cmwgPSBVcmkuQ1JFQVRPUi5jcmVhdGVGcm9tUGFyY2VsKGRhdGEpOworICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbWltZVR5cGVGaWx0ZXIgPSBkYXRhLnJlYWRTdHJpbmcoKTsKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nW10gdHlwZXMgPSBnZXRTdHJlYW1UeXBlcyh1cmwsIG1pbWVUeXBlRmlsdGVyKTsKKyAgICAgICAgICAgICAgICAgICAgcmVwbHkud3JpdGVOb0V4Y2VwdGlvbigpOworICAgICAgICAgICAgICAgICAgICByZXBseS53cml0ZVN0cmluZ0FycmF5KHR5cGVzKTsKKworICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIE9QRU5fVFlQRURfQVNTRVRfRklMRV9UUkFOU0FDVElPTjoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGRhdGEuZW5mb3JjZUludGVyZmFjZShJQ29udGVudFByb3ZpZGVyLmRlc2NyaXB0b3IpOworICAgICAgICAgICAgICAgICAgICBVcmkgdXJsID0gVXJpLkNSRUFUT1IuY3JlYXRlRnJvbVBhcmNlbChkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG1pbWVUeXBlID0gZGF0YS5yZWFkU3RyaW5nKCk7CisgICAgICAgICAgICAgICAgICAgIEJ1bmRsZSBvcHRzID0gZGF0YS5yZWFkQnVuZGxlKCk7CisKKyAgICAgICAgICAgICAgICAgICAgQXNzZXRGaWxlRGVzY3JpcHRvciBmZDsKKyAgICAgICAgICAgICAgICAgICAgZmQgPSBvcGVuVHlwZWRBc3NldEZpbGUodXJsLCBtaW1lVHlwZSwgb3B0cyk7CisgICAgICAgICAgICAgICAgICAgIHJlcGx5LndyaXRlTm9FeGNlcHRpb24oKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGZkICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlcGx5LndyaXRlSW50KDEpOworICAgICAgICAgICAgICAgICAgICAgICAgZmQud3JpdGVUb1BhcmNlbChyZXBseSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFyY2VsYWJsZS5QQVJDRUxBQkxFX1dSSVRFX1JFVFVSTl9WQUxVRSk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXBseS53cml0ZUludCgwKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgICBEYXRhYmFzZVV0aWxzLndyaXRlRXhjZXB0aW9uVG9QYXJjZWwocmVwbHksIGUpOwpAQCAtNTY4LDUgKzYwMCw1MCBAQAogICAgICAgICByZXR1cm4gYnVuZGxlOwogICAgIH0KIAorICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRTdHJlYW1UeXBlcyhVcmkgdXJsLCBTdHJpbmcgbWltZVR5cGVGaWx0ZXIpIHRocm93cyBSZW1vdGVFeGNlcHRpb24KKyAgICB7CisgICAgICAgIFBhcmNlbCBkYXRhID0gUGFyY2VsLm9idGFpbigpOworICAgICAgICBQYXJjZWwgcmVwbHkgPSBQYXJjZWwub2J0YWluKCk7CisKKyAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElDb250ZW50UHJvdmlkZXIuZGVzY3JpcHRvcik7CisKKyAgICAgICAgdXJsLndyaXRlVG9QYXJjZWwoZGF0YSwgMCk7CisgICAgICAgIGRhdGEud3JpdGVTdHJpbmcobWltZVR5cGVGaWx0ZXIpOworCisgICAgICAgIG1SZW1vdGUudHJhbnNhY3QoSUNvbnRlbnRQcm92aWRlci5HRVRfU1RSRUFNX1RZUEVTX1RSQU5TQUNUSU9OLCBkYXRhLCByZXBseSwgMCk7CisKKyAgICAgICAgRGF0YWJhc2VVdGlscy5yZWFkRXhjZXB0aW9uRnJvbVBhcmNlbChyZXBseSk7CisgICAgICAgIFN0cmluZ1tdIG91dCA9IHJlcGx5LmNyZWF0ZVN0cmluZ0FycmF5KCk7CisKKyAgICAgICAgZGF0YS5yZWN5Y2xlKCk7CisgICAgICAgIHJlcGx5LnJlY3ljbGUoKTsKKworICAgICAgICByZXR1cm4gb3V0OworICAgIH0KKworICAgIHB1YmxpYyBBc3NldEZpbGVEZXNjcmlwdG9yIG9wZW5UeXBlZEFzc2V0RmlsZShVcmkgdXJsLCBTdHJpbmcgbWltZVR5cGUsIEJ1bmRsZSBvcHRzKQorICAgICAgICAgICAgdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbiwgRmlsZU5vdEZvdW5kRXhjZXB0aW9uIHsKKyAgICAgICAgUGFyY2VsIGRhdGEgPSBQYXJjZWwub2J0YWluKCk7CisgICAgICAgIFBhcmNlbCByZXBseSA9IFBhcmNlbC5vYnRhaW4oKTsKKworICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUNvbnRlbnRQcm92aWRlci5kZXNjcmlwdG9yKTsKKworICAgICAgICB1cmwud3JpdGVUb1BhcmNlbChkYXRhLCAwKTsKKyAgICAgICAgZGF0YS53cml0ZVN0cmluZyhtaW1lVHlwZSk7CisgICAgICAgIGRhdGEud3JpdGVCdW5kbGUob3B0cyk7CisKKyAgICAgICAgbVJlbW90ZS50cmFuc2FjdChJQ29udGVudFByb3ZpZGVyLk9QRU5fVFlQRURfQVNTRVRfRklMRV9UUkFOU0FDVElPTiwgZGF0YSwgcmVwbHksIDApOworCisgICAgICAgIERhdGFiYXNlVXRpbHMucmVhZEV4Y2VwdGlvbldpdGhGaWxlTm90Rm91bmRFeGNlcHRpb25Gcm9tUGFyY2VsKHJlcGx5KTsKKyAgICAgICAgaW50IGhhcyA9IHJlcGx5LnJlYWRJbnQoKTsKKyAgICAgICAgQXNzZXRGaWxlRGVzY3JpcHRvciBmZCA9IGhhcyAhPSAwCisgICAgICAgICAgICAgICAgPyBBc3NldEZpbGVEZXNjcmlwdG9yLkNSRUFUT1IuY3JlYXRlRnJvbVBhcmNlbChyZXBseSkgOiBudWxsOworCisgICAgICAgIGRhdGEucmVjeWNsZSgpOworICAgICAgICByZXBseS5yZWN5Y2xlKCk7CisKKyAgICAgICAgcmV0dXJuIGZkOworICAgIH0KKwogICAgIHByaXZhdGUgSUJpbmRlciBtUmVtb3RlOwogfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9Db250ZW50UXVlcnlNYXAuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvQ29udGVudFF1ZXJ5TWFwLmphdmEKaW5kZXggZGJjYjRhNy4uYzk1NTA5NCAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9Db250ZW50UXVlcnlNYXAuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L0NvbnRlbnRRdWVyeU1hcC5qYXZhCkBAIC0xMjksNyArMTI5LDkgQEAKICAgICAvKiogUmVxdWVyaWVzIHRoZSBjdXJzb3IgYW5kIHJlYWRzIHRoZSBjb250ZW50cyBpbnRvIHRoZSBjYWNoZSAqLwogICAgIHB1YmxpYyB2b2lkIHJlcXVlcnkoKSB7CiAgICAgICAgIG1EaXJ0eSA9IGZhbHNlOwotICAgICAgICBtQ3Vyc29yLnJlcXVlcnkoKTsKKyAgICAgICAgaWYgKCFtQ3Vyc29yLnJlcXVlcnkoKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigidHJ5aW5nIHRvIHJlcXVlcnkgYW4gYWxyZWFkeSBjbG9zZWQgY3Vyc29yIik7CisgICAgICAgIH0KICAgICAgICAgcmVhZEN1cnNvckludG9DYWNoZSgpOwogICAgICAgICBzZXRDaGFuZ2VkKCk7CiAgICAgICAgIG5vdGlmeU9ic2VydmVycygpOwpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9Db250ZW50UmVzb2x2ZXIuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvQ29udGVudFJlc29sdmVyLmphdmEKaW5kZXggNjlmNzYxMS4uMjJmZWI5YSAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9Db250ZW50UmVzb2x2ZXIuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L0NvbnRlbnRSZXNvbHZlci5qYXZhCkBAIC00NCw5ICs0NCw5IEBACiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwogaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLkxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLlJhbmRvbTsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwogCiAKIC8qKgpAQCAtMTg2LDggKzE4Niw3IEBACiAgICAgICogdXNpbmcgdGhlIGNvbnRlbnQ6Ly8gc2NoZW1lLgogICAgICAqIEByZXR1cm4gQSBNSU1FIHR5cGUgZm9yIHRoZSBjb250ZW50LCBvciBudWxsIGlmIHRoZSBVUkwgaXMgaW52YWxpZCBvciB0aGUgdHlwZSBpcyB1bmtub3duCiAgICAgICovCi0gICAgcHVibGljIGZpbmFsIFN0cmluZyBnZXRUeXBlKFVyaSB1cmwpCi0gICAgeworICAgIHB1YmxpYyBmaW5hbCBTdHJpbmcgZ2V0VHlwZShVcmkgdXJsKSB7CiAgICAgICAgIElDb250ZW50UHJvdmlkZXIgcHJvdmlkZXIgPSBhY3F1aXJlUHJvdmlkZXIodXJsKTsKICAgICAgICAgaWYgKHByb3ZpZGVyID09IG51bGwpIHsKICAgICAgICAgICAgIHJldHVybiBudWxsOwpAQCAtMjA0LDYgKzIwMywzOSBAQAogICAgIH0KIAogICAgIC8qKgorICAgICAqIFF1ZXJ5IGZvciB0aGUgcG9zc2libGUgTUlNRSB0eXBlcyBmb3IgdGhlIHJlcHJlc2VudGF0aW9ucyB0aGUgZ2l2ZW4KKyAgICAgKiBjb250ZW50IFVSTCBjYW4gYmUgcmV0dXJuZWQgd2hlbiBvcGVuZWQgYXMgYXMgc3RyZWFtIHdpdGgKKyAgICAgKiB7QGxpbmsgI29wZW5UeXBlZEFzc2V0RmlsZURlc2NyaXB0b3J9LiAgTm90ZSB0aGF0IHRoZSB0eXBlcyBoZXJlIGFyZQorICAgICAqIG5vdCBuZWNlc3NhcmlseSBhIHN1cGVyc2V0IG9mIHRoZSB0eXBlIHJldHVybmVkIGJ5IHtAbGluayAjZ2V0VHlwZX0gLS0KKyAgICAgKiBtYW55IGNvbnRlbnQgcHJvdmlkZXJzIGNhbiBub3QgcmV0dXJuIGEgcmF3IHN0cmVhbSBmb3IgdGhlIHN0cnVjdHVyZWQKKyAgICAgKiBkYXRhIHRoYXQgdGhleSBjb250YWluLgorICAgICAqCisgICAgICogQHBhcmFtIHVybCBBIFVyaSBpZGVudGlmeWluZyBjb250ZW50IChlaXRoZXIgYSBsaXN0IG9yIHNwZWNpZmljIHR5cGUpLAorICAgICAqIHVzaW5nIHRoZSBjb250ZW50Oi8vIHNjaGVtZS4KKyAgICAgKiBAcGFyYW0gbWltZVR5cGVGaWx0ZXIgVGhlIGRlc2lyZWQgTUlNRSB0eXBlLiAgVGhpcyBtYXkgYmUgYSBwYXR0ZXJuLAorICAgICAqIHN1Y2ggYXMgKlwvKiwgdG8gcXVlcnkgZm9yIGFsbCBhdmFpbGFibGUgTUlNRSB0eXBlcyB0aGF0IG1hdGNoIHRoZQorICAgICAqIHBhdHRlcm4uCisgICAgICogQHJldHVybiBSZXR1cm5zIGFuIGFycmF5IG9mIE1JTUUgdHlwZSBzdHJpbmdzIGZvciBhbGwgYXZhaWxhYmxsZQorICAgICAqIGRhdGEgc3RyZWFtcyB0aGF0IG1hdGNoIHRoZSBnaXZlbiBtaW1lVHlwZUZpbHRlci4gIElmIHRoZXJlIGFyZSBub25lLAorICAgICAqIG51bGwgaXMgcmV0dXJuZWQuCisgICAgICovCisgICAgcHVibGljIFN0cmluZ1tdIGdldFN0cmVhbVR5cGVzKFVyaSB1cmwsIFN0cmluZyBtaW1lVHlwZUZpbHRlcikgeworICAgICAgICBJQ29udGVudFByb3ZpZGVyIHByb3ZpZGVyID0gYWNxdWlyZVByb3ZpZGVyKHVybCk7CisgICAgICAgIGlmIChwcm92aWRlciA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuIHByb3ZpZGVyLmdldFN0cmVhbVR5cGVzKHVybCwgbWltZVR5cGVGaWx0ZXIpOworICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0gY2F0Y2ggKGphdmEubGFuZy5FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICByZWxlYXNlUHJvdmlkZXIocHJvdmlkZXIpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCiAgICAgICogPHA+CiAgICAgICogUXVlcnkgdGhlIGdpdmVuIFVSSSwgcmV0dXJuaW5nIGEge0BsaW5rIEN1cnNvcn0gb3ZlciB0aGUgcmVzdWx0IHNldC4KICAgICAgKiA8L3A+CkBAIC0zNDksNyArMzgxLDcgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBPcGVuIGEgcmF3IGZpbGUgZGVzY3JpcHRvciB0byBhY2Nlc3MgZGF0YSB1bmRlciBhICJjb250ZW50OiIgVVJJLiAgVGhpcworICAgICAqIE9wZW4gYSByYXcgZmlsZSBkZXNjcmlwdG9yIHRvIGFjY2VzcyBkYXRhIHVuZGVyIGEgVVJJLiAgVGhpcwogICAgICAqIGlzIGxpa2Uge0BsaW5rICNvcGVuQXNzZXRGaWxlRGVzY3JpcHRvcihVcmksIFN0cmluZyl9LCBidXQgdXNlcyB0aGUKICAgICAgKiB1bmRlcmx5aW5nIHtAbGluayBDb250ZW50UHJvdmlkZXIjb3BlbkZpbGV9CiAgICAgICogQ29udGVudFByb3ZpZGVyLm9wZW5GaWxlKCl9IG1ldGhvZCwgc28gd2lsbCA8ZW0+bm90PC9lbT4gd29yayB3aXRoCkBAIC0zOTksMTAgKzQzMSw5IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogT3BlbiBhIHJhdyBmaWxlIGRlc2NyaXB0b3IgdG8gYWNjZXNzIGRhdGEgdW5kZXIgYSAiY29udGVudDoiIFVSSS4gIFRoaXMKKyAgICAgKiBPcGVuIGEgcmF3IGZpbGUgZGVzY3JpcHRvciB0byBhY2Nlc3MgZGF0YSB1bmRlciBhIFVSSS4gIFRoaXMKICAgICAgKiBpbnRlcmFjdHMgd2l0aCB0aGUgdW5kZXJseWluZyB7QGxpbmsgQ29udGVudFByb3ZpZGVyI29wZW5Bc3NldEZpbGV9Ci0gICAgICogQ29udGVudFByb3ZpZGVyLm9wZW5Bc3NldEZpbGUoKX0gbWV0aG9kIG9mIHRoZSBwcm92aWRlciBhc3NvY2lhdGVkIHdpdGggdGhlCi0gICAgICogZ2l2ZW4gVVJJLCB0byByZXRyaWV2ZSBhbnkgZmlsZSBzdG9yZWQgdGhlcmUuCisgICAgICogbWV0aG9kIG9mIHRoZSBwcm92aWRlciBhc3NvY2lhdGVkIHdpdGggdGhlIGdpdmVuIFVSSSwgdG8gcmV0cmlldmUgYW55IGZpbGUgc3RvcmVkIHRoZXJlLgogICAgICAqCiAgICAgICogPGg1PkFjY2VwdHMgdGhlIGZvbGxvd2luZyBVUkkgc2NoZW1lczo8L2g1PgogICAgICAqIDx1bD4KQEAgLTQzNCw2ICs0NjUsMTEgQEAKICAgICAgKiA8L2xpPgogICAgICAqIDwvdWw+CiAgICAgICoKKyAgICAgKiA8cD5Ob3RlIHRoYXQgaWYgdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgZm9yIHJlYWQtb25seSBpbnB1dCAobW9kZSBpcyAiciIpCisgICAgICogb24gYSBjb250ZW50OiBVUkksIGl0IHdpbGwgaW5zdGVhZCBjYWxsIHtAbGluayAjb3BlblR5cGVkQXNzZXRGaWxlRGVzY3JpcHRvcn0KKyAgICAgKiBmb3IgeW91IHdpdGggYSBNSU1FIHR5cGUgb2YgIipcLyoiLiAgVGhpcyBhbGxvd3Mgc3VjaCBjYWxsZXJzIHRvIGJlbmVmaXQKKyAgICAgKiBmcm9tIGFueSBidWlsdC1pbiBkYXRhIGNvbnZlcnNpb24gdGhhdCBhIHByb3ZpZGVyIGltcGxlbWVudHMuCisgICAgICoKICAgICAgKiBAcGFyYW0gdXJpIFRoZSBkZXNpcmVkIFVSSSB0byBvcGVuLgogICAgICAqIEBwYXJhbSBtb2RlIFRoZSBmaWxlIG1vZGUgdG8gdXNlLCBhcyBwZXIge0BsaW5rIENvbnRlbnRQcm92aWRlciNvcGVuQXNzZXRGaWxlCiAgICAgICogQ29udGVudFByb3ZpZGVyLm9wZW5Bc3NldEZpbGV9LgpAQCAtNDYwLDI5ICs0OTYsOTcgQEAKICAgICAgICAgICAgICAgICAgICAgbmV3IEZpbGUodXJpLmdldFBhdGgoKSksIG1vZGVUb01vZGUodXJpLCBtb2RlKSk7CiAgICAgICAgICAgICByZXR1cm4gbmV3IEFzc2V0RmlsZURlc2NyaXB0b3IocGZkLCAwLCAtMSk7CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBJQ29udGVudFByb3ZpZGVyIHByb3ZpZGVyID0gYWNxdWlyZVByb3ZpZGVyKHVyaSk7Ci0gICAgICAgICAgICBpZiAocHJvdmlkZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBGaWxlTm90Rm91bmRFeGNlcHRpb24oIk5vIGNvbnRlbnQgcHJvdmlkZXI6ICIgKyB1cmkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBBc3NldEZpbGVEZXNjcmlwdG9yIGZkID0gcHJvdmlkZXIub3BlbkFzc2V0RmlsZSh1cmksIG1vZGUpOwotICAgICAgICAgICAgICAgIGlmKGZkID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcmVsZWFzZVByb3ZpZGVyKHByb3ZpZGVyKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICBpZiAoInIiLmVxdWFscyhtb2RlKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBvcGVuVHlwZWRBc3NldEZpbGVEZXNjcmlwdG9yKHVyaSwgIiovKiIsIG51bGwpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBJQ29udGVudFByb3ZpZGVyIHByb3ZpZGVyID0gYWNxdWlyZVByb3ZpZGVyKHVyaSk7CisgICAgICAgICAgICAgICAgaWYgKHByb3ZpZGVyID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEZpbGVOb3RGb3VuZEV4Y2VwdGlvbigiTm8gY29udGVudCBwcm92aWRlcjogIiArIHVyaSk7CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIFBhcmNlbEZpbGVEZXNjcmlwdG9yIHBmZCA9IG5ldyBQYXJjZWxGaWxlRGVzY3JpcHRvcklubmVyKAotICAgICAgICAgICAgICAgICAgICAgICAgZmQuZ2V0UGFyY2VsRmlsZURlc2NyaXB0b3IoKSwgcHJvdmlkZXIpOwotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQXNzZXRGaWxlRGVzY3JpcHRvcihwZmQsIGZkLmdldFN0YXJ0T2Zmc2V0KCksCi0gICAgICAgICAgICAgICAgICAgICAgICBmZC5nZXREZWNsYXJlZExlbmd0aCgpKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgQXNzZXRGaWxlRGVzY3JpcHRvciBmZCA9IHByb3ZpZGVyLm9wZW5Bc3NldEZpbGUodXJpLCBtb2RlKTsKKyAgICAgICAgICAgICAgICAgICAgaWYoZmQgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmVsZWFzZVByb3ZpZGVyKHByb3ZpZGVyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIFBhcmNlbEZpbGVEZXNjcmlwdG9yIHBmZCA9IG5ldyBQYXJjZWxGaWxlRGVzY3JpcHRvcklubmVyKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZkLmdldFBhcmNlbEZpbGVEZXNjcmlwdG9yKCksIHByb3ZpZGVyKTsKKworICAgICAgICAgICAgICAgICAgICAvLyBTdWNjZXNzISAgRG9uJ3QgcmVsZWFzZSB0aGUgcHJvdmlkZXIgd2hlbiBleGl0aW5nLCBsZXQKKyAgICAgICAgICAgICAgICAgICAgLy8gUGFyY2VsRmlsZURlc2NyaXB0b3JJbm5lciBkbyB0aGF0IHdoZW4gaXQgaXMgY2xvc2VkLgorICAgICAgICAgICAgICAgICAgICBwcm92aWRlciA9IG51bGw7CisKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBBc3NldEZpbGVEZXNjcmlwdG9yKHBmZCwgZmQuZ2V0U3RhcnRPZmZzZXQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmZC5nZXREZWNsYXJlZExlbmd0aCgpKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRmlsZU5vdEZvdW5kRXhjZXB0aW9uKCJEZWFkIGNvbnRlbnQgcHJvdmlkZXI6ICIgKyB1cmkpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IGU7CisgICAgICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHByb3ZpZGVyICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlbGVhc2VQcm92aWRlcihwcm92aWRlcik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBPcGVuIGEgcmF3IGZpbGUgZGVzY3JpcHRvciB0byBhY2Nlc3MgKHBvdGVudGlhbGx5IHR5cGUgdHJhbnNmb3JtZWQpCisgICAgICogZGF0YSBmcm9tIGEgImNvbnRlbnQ6IiBVUkkuICBUaGlzIGludGVyYWN0cyB3aXRoIHRoZSB1bmRlcmx5aW5nCisgICAgICoge0BsaW5rIENvbnRlbnRQcm92aWRlciNvcGVuVHlwZWRBc3NldEZpbGV9IG1ldGhvZCBvZiB0aGUgcHJvdmlkZXIKKyAgICAgKiBhc3NvY2lhdGVkIHdpdGggdGhlIGdpdmVuIFVSSSwgdG8gcmV0cmlldmUgcmV0cmlldmUgYW55IGFwcHJvcHJpYXRlCisgICAgICogZGF0YSBzdHJlYW0gZm9yIHRoZSBkYXRhIHN0b3JlZCB0aGVyZS4KKyAgICAgKgorICAgICAqIDxwPlVubGlrZSB7QGxpbmsgI29wZW5Bc3NldEZpbGVEZXNjcmlwdG9yfSwgdGhpcyBmdW5jdGlvbiBvbmx5IHdvcmtzCisgICAgICogd2l0aCAiY29udGVudDoiIFVSSXMsIGJlY2F1c2UgY29udGVudCBwcm92aWRlcnMgYXJlIHRoZSBvbmx5IGZhY2lsaXR5CisgICAgICogd2l0aCBhbiBhc3NvY2lhdGVkIE1JTUUgdHlwZSB0byBlbnN1cmUgdGhhdCB0aGUgcmV0dXJuZWQgZGF0YSBzdHJlYW0KKyAgICAgKiBpcyBvZiB0aGUgZGVzaXJlZCB0eXBlLgorICAgICAqCisgICAgICogPHA+QWxsIHRleHQvKiBzdHJlYW1zIGFyZSBlbmNvZGVkIGluIFVURi04LgorICAgICAqCisgICAgICogQHBhcmFtIHVyaSBUaGUgZGVzaXJlZCBVUkkgdG8gb3Blbi4KKyAgICAgKiBAcGFyYW0gbWltZVR5cGUgVGhlIGRlc2lyZWQgTUlNRSB0eXBlIG9mIHRoZSByZXR1cm5lZCBkYXRhLiAgVGhpcyBjYW4KKyAgICAgKiBiZSBhIHBhdHRlcm4gc3VjaCBhcyAqXC8qLCB3aGljaCB3aWxsIGFsbG93IHRoZSBjb250ZW50IHByb3ZpZGVyIHRvCisgICAgICogc2VsZWN0IGEgdHlwZSwgdGhvdWdoIHRoZXJlIGlzIG5vIHdheSBmb3IgeW91IHRvIGRldGVybWluZSB3aGF0IHR5cGUKKyAgICAgKiBpdCBpcyByZXR1cm5pbmcuCisgICAgICogQHBhcmFtIG9wdHMgQWRkaXRpb25hbCBwcm92aWRlci1kZXBlbmRlbnQgb3B0aW9ucy4KKyAgICAgKiBAcmV0dXJuIFJldHVybnMgYSBuZXcgUGFyY2VsRmlsZURlc2NyaXB0b3IgZnJvbSB3aGljaCB5b3UgY2FuIHJlYWQgdGhlCisgICAgICogZGF0YSBzdHJlYW0gZnJvbSB0aGUgcHJvdmlkZXIuICBOb3RlIHRoYXQgdGhpcyBtYXkgYmUgYSBwaXBlLCBtZWFuaW5nCisgICAgICogeW91IGNhbid0IHNlZWsgaW4gaXQuICBUaGUgb25seSBzZWVrIHlvdSBzaG91bGQgZG8gaXMgaWYgdGhlCisgICAgICogQXNzZXRGaWxlRGVzY3JpcHRvciBjb250YWlucyBhbiBvZmZzZXQsIHRvIG1vdmUgdG8gdGhhdCBvZmZzZXQgYmVmb3JlCisgICAgICogcmVhZGluZy4gIFlvdSBvd24gdGhpcyBkZXNjcmlwdG9yIGFuZCBhcmUgcmVzcG9uc2libGUgZm9yIGNsb3NpbmcgaXQgd2hlbiBkb25lLgorICAgICAqIEB0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uIFRocm93cyBGaWxlTm90Rm91bmRFeGNlcHRpb24gb2Ygbm8KKyAgICAgKiBkYXRhIG9mIHRoZSBkZXNpcmVkIHR5cGUgZXhpc3RzIHVuZGVyIHRoZSBVUkkuCisgICAgICovCisgICAgcHVibGljIGZpbmFsIEFzc2V0RmlsZURlc2NyaXB0b3Igb3BlblR5cGVkQXNzZXRGaWxlRGVzY3JpcHRvcihVcmkgdXJpLAorICAgICAgICAgICAgU3RyaW5nIG1pbWVUeXBlLCBCdW5kbGUgb3B0cykgdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiB7CisgICAgICAgIElDb250ZW50UHJvdmlkZXIgcHJvdmlkZXIgPSBhY3F1aXJlUHJvdmlkZXIodXJpKTsKKyAgICAgICAgaWYgKHByb3ZpZGVyID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBGaWxlTm90Rm91bmRFeGNlcHRpb24oIk5vIGNvbnRlbnQgcHJvdmlkZXI6ICIgKyB1cmkpOworICAgICAgICB9CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBBc3NldEZpbGVEZXNjcmlwdG9yIGZkID0gcHJvdmlkZXIub3BlblR5cGVkQXNzZXRGaWxlKHVyaSwgbWltZVR5cGUsIG9wdHMpOworICAgICAgICAgICAgaWYgKGZkID09IG51bGwpIHsKICAgICAgICAgICAgICAgICByZWxlYXNlUHJvdmlkZXIocHJvdmlkZXIpOwotICAgICAgICAgICAgICAgIHRocm93IG5ldyBGaWxlTm90Rm91bmRFeGNlcHRpb24oIkRlYWQgY29udGVudCBwcm92aWRlcjogIiArIHVyaSk7Ci0gICAgICAgICAgICB9IGNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgfQorICAgICAgICAgICAgUGFyY2VsRmlsZURlc2NyaXB0b3IgcGZkID0gbmV3IFBhcmNlbEZpbGVEZXNjcmlwdG9ySW5uZXIoCisgICAgICAgICAgICAgICAgICAgIGZkLmdldFBhcmNlbEZpbGVEZXNjcmlwdG9yKCksIHByb3ZpZGVyKTsKKworICAgICAgICAgICAgLy8gU3VjY2VzcyEgIERvbid0IHJlbGVhc2UgdGhlIHByb3ZpZGVyIHdoZW4gZXhpdGluZywgbGV0CisgICAgICAgICAgICAvLyBQYXJjZWxGaWxlRGVzY3JpcHRvcklubmVyIGRvIHRoYXQgd2hlbiBpdCBpcyBjbG9zZWQuCisgICAgICAgICAgICBwcm92aWRlciA9IG51bGw7CisKKyAgICAgICAgICAgIHJldHVybiBuZXcgQXNzZXRGaWxlRGVzY3JpcHRvcihwZmQsIGZkLmdldFN0YXJ0T2Zmc2V0KCksCisgICAgICAgICAgICAgICAgICAgIGZkLmdldERlY2xhcmVkTGVuZ3RoKCkpOworICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEZpbGVOb3RGb3VuZEV4Y2VwdGlvbigiRGVhZCBjb250ZW50IHByb3ZpZGVyOiAiICsgdXJpKTsKKyAgICAgICAgfSBjYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IGU7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBpZiAocHJvdmlkZXIgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgIHJlbGVhc2VQcm92aWRlcihwcm92aWRlcik7Ci0gICAgICAgICAgICAgICAgdGhyb3cgZTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIHJlbGVhc2VQcm92aWRlcihwcm92aWRlcik7Ci0gICAgICAgICAgICAgICAgdGhyb3cgZTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KQEAgLTEzNDIsNyArMTQ0Niw3IEBACiAgICAgfQogCiAgICAgcHJpdmF0ZSBmaW5hbCBjbGFzcyBDdXJzb3JXcmFwcGVySW5uZXIgZXh0ZW5kcyBDdXJzb3JXcmFwcGVyIHsKLSAgICAgICAgcHJpdmF0ZSBJQ29udGVudFByb3ZpZGVyIG1Db250ZW50UHJvdmlkZXI7CisgICAgICAgIHByaXZhdGUgZmluYWwgSUNvbnRlbnRQcm92aWRlciBtQ29udGVudFByb3ZpZGVyOwogICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQUc9IkN1cnNvcldyYXBwZXJJbm5lciI7CiAgICAgICAgIHByaXZhdGUgYm9vbGVhbiBtQ2xvc2VGbGFnID0gZmFsc2U7CiAKQEAgLTEzNzEsNyArMTQ3NSw3IEBACiAgICAgfQogCiAgICAgcHJpdmF0ZSBmaW5hbCBjbGFzcyBQYXJjZWxGaWxlRGVzY3JpcHRvcklubmVyIGV4dGVuZHMgUGFyY2VsRmlsZURlc2NyaXB0b3IgewotICAgICAgICBwcml2YXRlIElDb250ZW50UHJvdmlkZXIgbUNvbnRlbnRQcm92aWRlcjsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBJQ29udGVudFByb3ZpZGVyIG1Db250ZW50UHJvdmlkZXI7CiAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRz0iUGFyY2VsRmlsZURlc2NyaXB0b3JJbm5lciI7CiAgICAgICAgIHByaXZhdGUgYm9vbGVhbiBtUmVsZWFzZVByb3ZpZGVyRmxhZyA9IGZhbHNlOwogCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L0NvbnRlbnRWYWx1ZXMuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvQ29udGVudFZhbHVlcy5qYXZhCmluZGV4IDc1Nzg3Y2QuLmNlMDQ3ZjYgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvQ29udGVudFZhbHVlcy5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvQ29udGVudFZhbHVlcy5qYXZhCkBAIC00NDYsNiArNDQ2LDE1IEBACiAgICAgICAgIHJldHVybiBtVmFsdWVzLmVudHJ5U2V0KCk7CiAgICAgfQogCisgICAgLyoqCisgICAgICogUmV0dXJucyBhIHNldCBvZiBhbGwgb2YgdGhlIGtleXMKKyAgICAgKgorICAgICAqIEByZXR1cm4gYSBzZXQgb2YgYWxsIG9mIHRoZSBrZXlzCisgICAgICovCisgICAgcHVibGljIFNldDxTdHJpbmc+IGtleVNldCgpIHsKKyAgICAgICAgcmV0dXJuIG1WYWx1ZXMua2V5U2V0KCk7CisgICAgfQorCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBQYXJjZWxhYmxlLkNyZWF0b3I8Q29udGVudFZhbHVlcz4gQ1JFQVRPUiA9CiAgICAgICAgICAgICBuZXcgUGFyY2VsYWJsZS5DcmVhdG9yPENvbnRlbnRWYWx1ZXM+KCkgewogICAgICAgICBAU3VwcHJlc3NXYXJuaW5ncyh7ImRlcHJlY2F0aW9uIiwgInVuY2hlY2tlZCJ9KQpAQCAtNDg4LDYgKzQ5NywxMCBAQAogICAgICAgICByZXR1cm4gKEFycmF5TGlzdDxTdHJpbmc+KSBtVmFsdWVzLmdldChrZXkpOwogICAgIH0KIAorICAgIC8qKgorICAgICAqIFJldHVybnMgYSBzdHJpbmcgY29udGFpbmluZyBhIGNvbmNpc2UsIGh1bWFuLXJlYWRhYmxlIGRlc2NyaXB0aW9uIG9mIHRoaXMgb2JqZWN0LgorICAgICAqIEByZXR1cm4gYSBwcmludGFibGUgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBvYmplY3QuCisgICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKICAgICAgICAgU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L0NvbnRleHQuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvQ29udGV4dC5qYXZhCmluZGV4IDAxMDA1NTAuLjNkMjkzNzkgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvQ29udGV4dC5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvQ29udGV4dC5qYXZhCkBAIC0yMSwxMCArMjEsMTIgQEAKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLkFzc2V0TWFuYWdlcjsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlJlc291cmNlczsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlR5cGVkQXJyYXk7CitpbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5EYXRhYmFzZUVycm9ySGFuZGxlcjsKIGltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZS5TUUxpdGVEYXRhYmFzZTsKIGltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZS5TUUxpdGVEYXRhYmFzZS5DdXJzb3JGYWN0b3J5OwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwOwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuRHJhd2FibGU7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYVNjYW5uZXJDb25uZWN0aW9uLk9uU2NhbkNvbXBsZXRlZExpc3RlbmVyOwogaW1wb3J0IGFuZHJvaWQubmV0LlVyaTsKIGltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKIGltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXI7CkBAIC01ODgsNiArNTkwLDMyIEBACiAgICAgICAgICAgICBpbnQgbW9kZSwgQ3Vyc29yRmFjdG9yeSBmYWN0b3J5KTsKIAogICAgIC8qKgorICAgICAqIE9wZW4gYSBuZXcgcHJpdmF0ZSBTUUxpdGVEYXRhYmFzZSBhc3NvY2lhdGVkIHdpdGggdGhpcyBDb250ZXh0J3MKKyAgICAgKiBhcHBsaWNhdGlvbiBwYWNrYWdlLiAgQ3JlYXRlcyB0aGUgZGF0YWJhc2UgZmlsZSBpZiBpdCBkb2Vzbid0IGV4aXN0LgorICAgICAqCisgICAgICogPHA+QWNjZXB0cyBpbnB1dCBwYXJhbTogYSBjb25jcmV0ZSBpbnN0YW5jZSBvZiB7QGxpbmsgRGF0YWJhc2VFcnJvckhhbmRsZXJ9IHRvIGJlCisgICAgICogdXNlZCB0byBoYW5kbGUgY29ycnVwdGlvbiB3aGVuIHNxbGl0ZSByZXBvcnRzIGRhdGFiYXNlIGNvcnJ1cHRpb24uPC9wPgorICAgICAqCisgICAgICogQHBhcmFtIG5hbWUgVGhlIG5hbWUgKHVuaXF1ZSBpbiB0aGUgYXBwbGljYXRpb24gcGFja2FnZSkgb2YgdGhlIGRhdGFiYXNlLgorICAgICAqIEBwYXJhbSBtb2RlIE9wZXJhdGluZyBtb2RlLiAgVXNlIDAgb3Ige0BsaW5rICNNT0RFX1BSSVZBVEV9IGZvciB0aGUKKyAgICAgKiAgICAgZGVmYXVsdCBvcGVyYXRpb24sIHtAbGluayAjTU9ERV9XT1JMRF9SRUFEQUJMRX0KKyAgICAgKiAgICAgYW5kIHtAbGluayAjTU9ERV9XT1JMRF9XUklURUFCTEV9IHRvIGNvbnRyb2wgcGVybWlzc2lvbnMuCisgICAgICogQHBhcmFtIGZhY3RvcnkgQW4gb3B0aW9uYWwgZmFjdG9yeSBjbGFzcyB0aGF0IGlzIGNhbGxlZCB0byBpbnN0YW50aWF0ZSBhCisgICAgICogICAgIGN1cnNvciB3aGVuIHF1ZXJ5IGlzIGNhbGxlZC4KKyAgICAgKiBAcGFyYW0gZXJyb3JIYW5kbGVyIHRoZSB7QGxpbmsgRGF0YWJhc2VFcnJvckhhbmRsZXJ9IHRvIGJlIHVzZWQgd2hlbiBzcWxpdGUgcmVwb3J0cyBkYXRhYmFzZQorICAgICAqIGNvcnJ1cHRpb24uIGlmIG51bGwsIHtAbGluayBhbmRyb2lkLmRhdGFiYXNlLkRlZmF1bHREYXRhYmFzZUVycm9ySGFuZGxlcn0gaXMgYXNzdW1lZC4KKyAgICAgKiBAcmV0dXJuIFRoZSBjb250ZW50cyBvZiBhIG5ld2x5IGNyZWF0ZWQgZGF0YWJhc2Ugd2l0aCB0aGUgZ2l2ZW4gbmFtZS4KKyAgICAgKiBAdGhyb3dzIGFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlLlNRTGl0ZUV4Y2VwdGlvbiBpZiB0aGUgZGF0YWJhc2UgZmlsZSBjb3VsZCBub3QgYmUgb3BlbmVkLgorICAgICAqCisgICAgICogQHNlZSAjTU9ERV9QUklWQVRFCisgICAgICogQHNlZSAjTU9ERV9XT1JMRF9SRUFEQUJMRQorICAgICAqIEBzZWUgI01PREVfV09STERfV1JJVEVBQkxFCisgICAgICogQHNlZSAjZGVsZXRlRGF0YWJhc2UKKyAgICAgKi8KKyAgICBwdWJsaWMgYWJzdHJhY3QgU1FMaXRlRGF0YWJhc2Ugb3Blbk9yQ3JlYXRlRGF0YWJhc2UoU3RyaW5nIG5hbWUsCisgICAgICAgICAgICBpbnQgbW9kZSwgQ3Vyc29yRmFjdG9yeSBmYWN0b3J5LCBEYXRhYmFzZUVycm9ySGFuZGxlciBlcnJvckhhbmRsZXIpOworCisgICAgLyoqCiAgICAgICogRGVsZXRlIGFuIGV4aXN0aW5nIHByaXZhdGUgU1FMaXRlRGF0YWJhc2UgYXNzb2NpYXRlZCB3aXRoIHRoaXMgQ29udGV4dCdzCiAgICAgICogYXBwbGljYXRpb24gcGFja2FnZS4KICAgICAgKgpAQCAtMTM1Niw3ICsxMzg0LDE2IEBACiAgICAgICogQHNlZSBhbmRyb2lkLmxvY2F0aW9uLkxvY2F0aW9uTWFuYWdlcgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIExPQ0FUSU9OX1NFUlZJQ0UgPSAibG9jYXRpb24iOwotICAgIAorCisgICAgLyoqCisgICAgICogVXNlIHdpdGgge0BsaW5rICNnZXRTeXN0ZW1TZXJ2aWNlfSB0byByZXRyaWV2ZSBhCisgICAgICoge0BsaW5rIGFuZHJvaWQubG9jYXRpb24uQ291bnRyeURldGVjdG9yfSBmb3IgZGV0ZWN0aW5nIHRoZSBjb3VudHJ5IHRoYXQKKyAgICAgKiB0aGUgdXNlciBpcyBpbi4KKyAgICAgKgorICAgICAqIEBoaWRlCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09VTlRSWV9ERVRFQ1RPUiA9ICJjb3VudHJ5X2RldGVjdG9yIjsKKwogICAgIC8qKgogICAgICAqIFVzZSB3aXRoIHtAbGluayAjZ2V0U3lzdGVtU2VydmljZX0gdG8gcmV0cmlldmUgYSB7QGxpbmsKICAgICAgKiBhbmRyb2lkLmFwcC5TZWFyY2hNYW5hZ2VyfSBmb3IgaGFuZGxpbmcgc2VhcmNoZXMuCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L0NvbnRleHRXcmFwcGVyLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L0NvbnRleHRXcmFwcGVyLmphdmEKaW5kZXggYTQ0NzEwOC4uM2Y1ZDIxNSAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9Db250ZXh0V3JhcHBlci5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvQ29udGV4dFdyYXBwZXIuamF2YQpAQCAtMjAsNiArMjAsNyBAQAogaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5QYWNrYWdlTWFuYWdlcjsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLkFzc2V0TWFuYWdlcjsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlJlc291cmNlczsKK2ltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLkRhdGFiYXNlRXJyb3JIYW5kbGVyOwogaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlLlNRTGl0ZURhdGFiYXNlOwogaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlLlNRTGl0ZURhdGFiYXNlLkN1cnNvckZhY3Rvcnk7CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5CaXRtYXA7CkBAIC0yMDQsNiArMjA1LDEyIEBACiAgICAgfQogCiAgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFNRTGl0ZURhdGFiYXNlIG9wZW5PckNyZWF0ZURhdGFiYXNlKFN0cmluZyBuYW1lLCBpbnQgbW9kZSwgQ3Vyc29yRmFjdG9yeSBmYWN0b3J5LAorICAgICAgICAgICAgRGF0YWJhc2VFcnJvckhhbmRsZXIgZXJyb3JIYW5kbGVyKSB7CisgICAgICAgIHJldHVybiBtQmFzZS5vcGVuT3JDcmVhdGVEYXRhYmFzZShuYW1lLCBtb2RlLCBmYWN0b3J5LCBlcnJvckhhbmRsZXIpOworICAgIH0KKworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBib29sZWFuIGRlbGV0ZURhdGFiYXNlKFN0cmluZyBuYW1lKSB7CiAgICAgICAgIHJldHVybiBtQmFzZS5kZWxldGVEYXRhYmFzZShuYW1lKTsKICAgICB9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L0N1cnNvckxvYWRlci5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9DdXJzb3JMb2FkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MjU5OWVkCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9DdXJzb3JMb2FkZXIuamF2YQpAQCAtMCwwICsxLDE2NSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5jb250ZW50OworCitpbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5DdXJzb3I7CitpbXBvcnQgYW5kcm9pZC5uZXQuVXJpOworCisvKioKKyAqIEEgbG9hZGVyIHRoYXQgcXVlcmllcyB0aGUge0BsaW5rIENvbnRlbnRSZXNvbHZlcn0gYW5kIHJldHVybnMgYSB7QGxpbmsgQ3Vyc29yfS4KKyAqLworcHVibGljIGNsYXNzIEN1cnNvckxvYWRlciBleHRlbmRzIEFzeW5jVGFza0xvYWRlcjxDdXJzb3I+IHsKKyAgICBDdXJzb3IgbUN1cnNvcjsKKyAgICBGb3JjZUxvYWRDb250ZW50T2JzZXJ2ZXIgbU9ic2VydmVyOworICAgIGJvb2xlYW4gbVN0b3BwZWQ7CisgICAgVXJpIG1Vcmk7CisgICAgU3RyaW5nW10gbVByb2plY3Rpb247CisgICAgU3RyaW5nIG1TZWxlY3Rpb247CisgICAgU3RyaW5nW10gbVNlbGVjdGlvbkFyZ3M7CisgICAgU3RyaW5nIG1Tb3J0T3JkZXI7CisKKyAgICAvKiBSdW5zIG9uIGEgd29ya2VyIHRocmVhZCAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBDdXJzb3IgbG9hZEluQmFja2dyb3VuZCgpIHsKKyAgICAgICAgQ3Vyc29yIGN1cnNvciA9IGdldENvbnRleHQoKS5nZXRDb250ZW50UmVzb2x2ZXIoKS5xdWVyeShtVXJpLCBtUHJvamVjdGlvbiwgbVNlbGVjdGlvbiwKKyAgICAgICAgICAgICAgICBtU2VsZWN0aW9uQXJncywgbVNvcnRPcmRlcik7CisgICAgICAgIC8vIEVuc3VyZSB0aGUgY3Vyc29yIHdpbmRvdyBpcyBmaWxsZWQKKyAgICAgICAgaWYgKGN1cnNvciAhPSBudWxsKSB7CisgICAgICAgICAgICBjdXJzb3IuZ2V0Q291bnQoKTsKKyAgICAgICAgICAgIGN1cnNvci5yZWdpc3RlckNvbnRlbnRPYnNlcnZlcihtT2JzZXJ2ZXIpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBjdXJzb3I7CisgICAgfQorCisgICAgLyogUnVucyBvbiB0aGUgVUkgdGhyZWFkICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgZGVsaXZlclJlc3VsdChDdXJzb3IgY3Vyc29yKSB7CisgICAgICAgIGlmIChtU3RvcHBlZCkgeworICAgICAgICAgICAgLy8gQW4gYXN5bmMgcXVlcnkgY2FtZSBpbiB3aGlsZSB0aGUgbG9hZGVyIGlzIHN0b3BwZWQKKyAgICAgICAgICAgIGlmIChjdXJzb3IgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGN1cnNvci5jbG9zZSgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIEN1cnNvciBvbGRDdXJzb3IgPSBtQ3Vyc29yOworICAgICAgICBtQ3Vyc29yID0gY3Vyc29yOworICAgICAgICBzdXBlci5kZWxpdmVyUmVzdWx0KGN1cnNvcik7CisKKyAgICAgICAgaWYgKG9sZEN1cnNvciAhPSBudWxsICYmICFvbGRDdXJzb3IuaXNDbG9zZWQoKSkgeworICAgICAgICAgICAgb2xkQ3Vyc29yLmNsb3NlKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgQ3Vyc29yTG9hZGVyKENvbnRleHQgY29udGV4dCwgVXJpIHVyaSwgU3RyaW5nW10gcHJvamVjdGlvbiwgU3RyaW5nIHNlbGVjdGlvbiwKKyAgICAgICAgICAgIFN0cmluZ1tdIHNlbGVjdGlvbkFyZ3MsIFN0cmluZyBzb3J0T3JkZXIpIHsKKyAgICAgICAgc3VwZXIoY29udGV4dCk7CisgICAgICAgIG1PYnNlcnZlciA9IG5ldyBGb3JjZUxvYWRDb250ZW50T2JzZXJ2ZXIoKTsKKyAgICAgICAgbVVyaSA9IHVyaTsKKyAgICAgICAgbVByb2plY3Rpb24gPSBwcm9qZWN0aW9uOworICAgICAgICBtU2VsZWN0aW9uID0gc2VsZWN0aW9uOworICAgICAgICBtU2VsZWN0aW9uQXJncyA9IHNlbGVjdGlvbkFyZ3M7CisgICAgICAgIG1Tb3J0T3JkZXIgPSBzb3J0T3JkZXI7CisgICAgfQorCisgICAgLyoqCisgICAgICogU3RhcnRzIGFuIGFzeW5jaHJvbm91cyBsb2FkIG9mIHRoZSBjb250YWN0cyBsaXN0IGRhdGEuIFdoZW4gdGhlIHJlc3VsdCBpcyByZWFkeSB0aGUgY2FsbGJhY2tzCisgICAgICogd2lsbCBiZSBjYWxsZWQgb24gdGhlIFVJIHRocmVhZC4gSWYgYSBwcmV2aW91cyBsb2FkIGhhcyBiZWVuIGNvbXBsZXRlZCBhbmQgaXMgc3RpbGwgdmFsaWQKKyAgICAgKiB0aGUgcmVzdWx0IG1heSBiZSBwYXNzZWQgdG8gdGhlIGNhbGxiYWNrcyBpbW1lZGlhdGVseS4KKyAgICAgKgorICAgICAqIE11c3QgYmUgY2FsbGVkIGZyb20gdGhlIFVJIHRocmVhZAorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHN0YXJ0TG9hZGluZygpIHsKKyAgICAgICAgbVN0b3BwZWQgPSBmYWxzZTsKKworICAgICAgICBpZiAobUN1cnNvciAhPSBudWxsKSB7CisgICAgICAgICAgICBkZWxpdmVyUmVzdWx0KG1DdXJzb3IpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZm9yY2VMb2FkKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBNdXN0IGJlIGNhbGxlZCBmcm9tIHRoZSBVSSB0aHJlYWQKKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBzdG9wTG9hZGluZygpIHsKKyAgICAgICAgaWYgKG1DdXJzb3IgIT0gbnVsbCAmJiAhbUN1cnNvci5pc0Nsb3NlZCgpKSB7CisgICAgICAgICAgICBtQ3Vyc29yLmNsb3NlKCk7CisgICAgICAgIH0KKyAgICAgICAgbUN1cnNvciA9IG51bGw7CisKKyAgICAgICAgLy8gQXR0ZW1wdCB0byBjYW5jZWwgdGhlIGN1cnJlbnQgbG9hZCB0YXNrIGlmIHBvc3NpYmxlLgorICAgICAgICBjYW5jZWxMb2FkKCk7CisKKyAgICAgICAgLy8gTWFrZSBzdXJlIHRoYXQgYW55IG91dHN0YW5kaW5nIGxvYWRzIGNsZWFuIHRoZW1zZWx2ZXMgdXAgcHJvcGVybHkKKyAgICAgICAgbVN0b3BwZWQgPSB0cnVlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9uQ2FuY2VsbGVkKEN1cnNvciBjdXJzb3IpIHsKKyAgICAgICAgaWYgKGN1cnNvciAhPSBudWxsICYmICFjdXJzb3IuaXNDbG9zZWQoKSkgeworICAgICAgICAgICAgY3Vyc29yLmNsb3NlKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBkZXN0cm95KCkgeworICAgICAgICAvLyBFbnN1cmUgdGhlIGxvYWRlciBpcyBzdG9wcGVkCisgICAgICAgIHN0b3BMb2FkaW5nKCk7CisgICAgfQorCisgICAgcHVibGljIFVyaSBnZXRVcmkoKSB7CisgICAgICAgIHJldHVybiBtVXJpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFVyaShVcmkgdXJpKSB7CisgICAgICAgIG1VcmkgPSB1cmk7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZ1tdIGdldFByb2plY3Rpb24oKSB7CisgICAgICAgIHJldHVybiBtUHJvamVjdGlvbjsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRQcm9qZWN0aW9uKFN0cmluZ1tdIHByb2plY3Rpb24pIHsKKyAgICAgICAgbVByb2plY3Rpb24gPSBwcm9qZWN0aW9uOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0U2VsZWN0aW9uKCkgeworICAgICAgICByZXR1cm4gbVNlbGVjdGlvbjsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRTZWxlY3Rpb24oU3RyaW5nIHNlbGVjdGlvbikgeworICAgICAgICBtU2VsZWN0aW9uID0gc2VsZWN0aW9uOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRTZWxlY3Rpb25BcmdzKCkgeworICAgICAgICByZXR1cm4gbVNlbGVjdGlvbkFyZ3M7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0U2VsZWN0aW9uQXJncyhTdHJpbmdbXSBzZWxlY3Rpb25BcmdzKSB7CisgICAgICAgIG1TZWxlY3Rpb25BcmdzID0gc2VsZWN0aW9uQXJnczsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldFNvcnRPcmRlcigpIHsKKyAgICAgICAgcmV0dXJuIG1Tb3J0T3JkZXI7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0U29ydE9yZGVyKFN0cmluZyBzb3J0T3JkZXIpIHsKKyAgICAgICAgbVNvcnRPcmRlciA9IHNvcnRPcmRlcjsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L0lDbGlwYm9hcmQuYWlkbCBiL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvSUNsaXBib2FyZC5haWRsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNlMWZlNTUKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L0lDbGlwYm9hcmQuYWlkbApAQCAtMCwwICsxLDQwIEBACisvKioKKyAqIENvcHlyaWdodCAoYykgMjAwOCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5jb250ZW50OworCitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNsaXBEYXRhOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5DbGlwRGVzY3JpcHRpb247CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LklPblByaW1hcnlDbGlwQ2hhbmdlZExpc3RlbmVyOworCisvKioKKyAqIFByb2dyYW1taW5nIGludGVyZmFjZSB0byB0aGUgY2xpcGJvYXJkLCB3aGljaCBhbGxvd3MgY29weWluZyBhbmQgcGFzdGluZworICogYmV0d2VlbiBhcHBsaWNhdGlvbnMuCisgKiB7QGhpZGV9CisgKi8KK2ludGVyZmFjZSBJQ2xpcGJvYXJkIHsKKyAgICB2b2lkIHNldFByaW1hcnlDbGlwKGluIENsaXBEYXRhIGNsaXApOworICAgIENsaXBEYXRhIGdldFByaW1hcnlDbGlwKCk7CisgICAgQ2xpcERlc2NyaXB0aW9uIGdldFByaW1hcnlDbGlwRGVzY3JpcHRpb24oKTsKKyAgICBib29sZWFuIGhhc1ByaW1hcnlDbGlwKCk7CisgICAgdm9pZCBhZGRQcmltYXJ5Q2xpcENoYW5nZWRMaXN0ZW5lcihpbiBJT25QcmltYXJ5Q2xpcENoYW5nZWRMaXN0ZW5lciBsaXN0ZW5lcik7CisgICAgdm9pZCByZW1vdmVQcmltYXJ5Q2xpcENoYW5nZWRMaXN0ZW5lcihpbiBJT25QcmltYXJ5Q2xpcENoYW5nZWRMaXN0ZW5lciBsaXN0ZW5lcik7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGNsaXBib2FyZCBjb250YWlucyB0ZXh0OyBmYWxzZSBvdGhlcndpc2UuCisgICAgICovCisgICAgYm9vbGVhbiBoYXNDbGlwYm9hcmRUZXh0KCk7Cit9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L0lDb250ZW50UHJvdmlkZXIuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvSUNvbnRlbnRQcm92aWRlci5qYXZhCmluZGV4IDY3ZTc1ODEuLjhmMTIyY2UgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvSUNvbnRlbnRQcm92aWRlci5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvSUNvbnRlbnRQcm92aWRlci5qYXZhCkBAIC01OSw2ICs1OSw3IEBACiAgICAgICAgICAgICB0aHJvd3MgUmVtb3RlRXhjZXB0aW9uLCBGaWxlTm90Rm91bmRFeGNlcHRpb247CiAgICAgcHVibGljIENvbnRlbnRQcm92aWRlclJlc3VsdFtdIGFwcGx5QmF0Y2goQXJyYXlMaXN0PENvbnRlbnRQcm92aWRlck9wZXJhdGlvbj4gb3BlcmF0aW9ucykKICAgICAgICAgICAgIHRocm93cyBSZW1vdGVFeGNlcHRpb24sIE9wZXJhdGlvbkFwcGxpY2F0aW9uRXhjZXB0aW9uOworCiAgICAgLyoqCiAgICAgICogQGhpZGUgLS0gdW50aWwgaW50ZXJmYWNlIGhhcyBwcm92ZW4gaXRzZWxmCiAgICAgICoKQEAgLTcxLDYgKzcyLDExIEBACiAgICAgICovCiAgICAgcHVibGljIEJ1bmRsZSBjYWxsKFN0cmluZyBtZXRob2QsIFN0cmluZyByZXF1ZXN0LCBCdW5kbGUgYXJncykgdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbjsKIAorICAgIC8vIERhdGEgaW50ZXJjaGFuZ2UuCisgICAgcHVibGljIFN0cmluZ1tdIGdldFN0cmVhbVR5cGVzKFVyaSB1cmwsIFN0cmluZyBtaW1lVHlwZUZpbHRlcikgdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbjsKKyAgICBwdWJsaWMgQXNzZXRGaWxlRGVzY3JpcHRvciBvcGVuVHlwZWRBc3NldEZpbGUoVXJpIHVybCwgU3RyaW5nIG1pbWVUeXBlLCBCdW5kbGUgb3B0cykKKyAgICAgICAgICAgIHRocm93cyBSZW1vdGVFeGNlcHRpb24sIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKKwogICAgIC8qIElQQyBjb25zdGFudHMgKi8KICAgICBzdGF0aWMgZmluYWwgU3RyaW5nIGRlc2NyaXB0b3IgPSAiYW5kcm9pZC5jb250ZW50LklDb250ZW50UHJvdmlkZXIiOwogCkBAIC04NCw0ICs5MCw2IEBACiAgICAgc3RhdGljIGZpbmFsIGludCBPUEVOX0FTU0VUX0ZJTEVfVFJBTlNBQ1RJT04gPSBJQmluZGVyLkZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyAxNDsKICAgICBzdGF0aWMgZmluYWwgaW50IEFQUExZX0JBVENIX1RSQU5TQUNUSU9OID0gSUJpbmRlci5GSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgMTk7CiAgICAgc3RhdGljIGZpbmFsIGludCBDQUxMX1RSQU5TQUNUSU9OID0gSUJpbmRlci5GSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgMjA7CisgICAgc3RhdGljIGZpbmFsIGludCBHRVRfU1RSRUFNX1RZUEVTX1RSQU5TQUNUSU9OID0gSUJpbmRlci5GSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgMjE7CisgICAgc3RhdGljIGZpbmFsIGludCBPUEVOX1RZUEVEX0FTU0VUX0ZJTEVfVFJBTlNBQ1RJT04gPSBJQmluZGVyLkZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyAyMjsKIH0KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvSU9uUHJpbWFyeUNsaXBDaGFuZ2VkTGlzdGVuZXIuYWlkbCBiL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvSU9uUHJpbWFyeUNsaXBDaGFuZ2VkTGlzdGVuZXIuYWlkbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYjQyYTQ1Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9JT25QcmltYXJ5Q2xpcENoYW5nZWRMaXN0ZW5lci5haWRsCkBAIC0wLDAgKzEsMjEgQEAKKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDA4LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLmNvbnRlbnQ7CisKK29uZXdheSBpbnRlcmZhY2UgSU9uUHJpbWFyeUNsaXBDaGFuZ2VkTGlzdGVuZXIgeworICAgIHZvaWQgZGlzcGF0Y2hQcmltYXJ5Q2xpcENoYW5nZWQoKTsKK30KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvSW50ZW50LmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L0ludGVudC5qYXZhCmluZGV4IDcxNTRhZWUuLjRkMGI4YjAgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvSW50ZW50LmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9JbnRlbnQuamF2YQpAQCAtNTM0LDYgKzUzNCw3IEBACiAgKiAgICAgPGxpPiB7QGxpbmsgI0NBVEVHT1JZX0NBUl9ET0NLfQogICogICAgIDxsaT4ge0BsaW5rICNDQVRFR09SWV9ERVNLX0RPQ0t9CiAgKiAgICAgPGxpPiB7QGxpbmsgI0NBVEVHT1JZX0NBUl9NT0RFfQorICogICAgIDxsaT4ge0BsaW5rICNDQVRFR09SWV9BUFBfTUFSS0VUfQogICogPC91bD4KICAqCiAgKiA8aDM+U3RhbmRhcmQgRXh0cmEgRGF0YTwvaDM+CkBAIC05ODUsNiArOTg2LDE1IEBACiAgICAgQFNka0NvbnN0YW50KFNka0NvbnN0YW50VHlwZS5BQ1RJVklUWV9JTlRFTlRfQUNUSU9OKQogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFDVElPTl9JTlNFUlQgPSAiYW5kcm9pZC5pbnRlbnQuYWN0aW9uLklOU0VSVCI7CiAgICAgLyoqCisgICAgICogQWN0aXZpdHkgQWN0aW9uOiBDcmVhdGUgYSBuZXcgaXRlbSBpbiB0aGUgZ2l2ZW4gY29udGFpbmVyLCBpbml0aWFsaXppbmcgaXQKKyAgICAgKiBmcm9tIHRoZSBjdXJyZW50IGNvbnRlbnRzIG9mIHRoZSBjbGlwYm9hcmQuCisgICAgICogPHA+SW5wdXQ6IHtAbGluayAjZ2V0RGF0YX0gaXMgVVJJIG9mIHRoZSBkaXJlY3RvcnkgKHZuZC5hbmRyb2lkLmN1cnNvci5kaXIvKikKKyAgICAgKiBpbiB3aGljaCB0byBwbGFjZSB0aGUgZGF0YS4KKyAgICAgKiA8cD5PdXRwdXQ6IFVSSSBvZiB0aGUgbmV3IGRhdGEgdGhhdCB3YXMgY3JlYXRlZC4KKyAgICAgKi8KKyAgICBAU2RrQ29uc3RhbnQoU2RrQ29uc3RhbnRUeXBlLkFDVElWSVRZX0lOVEVOVF9BQ1RJT04pCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUNUSU9OX1BBU1RFID0gImFuZHJvaWQuaW50ZW50LmFjdGlvbi5QQVNURSI7CisgICAgLyoqCiAgICAgICogQWN0aXZpdHkgQWN0aW9uOiBEZWxldGUgdGhlIGdpdmVuIGRhdGEgZnJvbSBpdHMgY29udGFpbmVyLgogICAgICAqIDxwPklucHV0OiB7QGxpbmsgI2dldERhdGF9IGlzIFVSSSBvZiBkYXRhIHRvIGJlIGRlbGV0ZWQuCiAgICAgICogPHA+T3V0cHV0OiBub3RoaW5nLgpAQCAtMjAwMSw2ICsyMDExLDExIEBACiAgICAgQFNka0NvbnN0YW50KFNka0NvbnN0YW50VHlwZS5JTlRFTlRfQ0FURUdPUlkpCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0FURUdPUllfRU1CRUQgPSAiYW5kcm9pZC5pbnRlbnQuY2F0ZWdvcnkuRU1CRUQiOwogICAgIC8qKgorICAgICAqIFRoaXMgYWN0aXZpdHkgYWxsb3dzIHRoZSB1c2VyIHRvIGJyb3dzZSBhbmQgZG93bmxvYWQgbmV3IGFwcGxpY2F0aW9ucy4KKyAgICAgKi8KKyAgICBAU2RrQ29uc3RhbnQoU2RrQ29uc3RhbnRUeXBlLklOVEVOVF9DQVRFR09SWSkKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDQVRFR09SWV9BUFBfTUFSS0VUID0gImFuZHJvaWQuaW50ZW50LmNhdGVnb3J5LkFQUF9NQVJLRVQiOworICAgIC8qKgogICAgICAqIFRoaXMgYWN0aXZpdHkgbWF5IGJlIGV4ZXJjaXNlZCBieSB0aGUgbW9ua2V5IG9yIG90aGVyIGF1dG9tYXRlZCB0ZXN0IHRvb2xzLgogICAgICAqLwogICAgIEBTZGtDb25zdGFudChTZGtDb25zdGFudFR5cGUuSU5URU5UX0NBVEVHT1JZKQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9Mb2FkZXIuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvTG9hZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjM0MDk2YQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvTG9hZGVyLmphdmEKQEAgLTAsMCArMSwxNjQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQuY29udGVudDsKKworaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2UuQ29udGVudE9ic2VydmVyOworaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlcjsKKworLyoqCisgKiBBbiBhYnN0cmFjdCBjbGFzcyB0aGF0IHBlcmZvcm1zIGFzeW5jaHJvbm91cyBsb2FkaW5nIG9mIGRhdGEuIFdoaWxlIExvYWRlcnMgYXJlIGFjdGl2ZQorICogdGhleSBzaG91bGQgbW9uaXRvciB0aGUgc291cmNlIG9mIHRoZWlyIGRhdGEgYW5kIGRlbGl2ZXIgbmV3IHJlc3VsdHMgd2hlbiB0aGUgY29udGVudHMKKyAqIGNoYW5nZS4KKyAqCisgKiBAcGFyYW0gPEQ+IFRoZSByZXN1bHQgcmV0dXJuZWQgd2hlbiB0aGUgbG9hZCBpcyBjb21wbGV0ZQorICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgTG9hZGVyPEQ+IHsKKyAgICBpbnQgbUlkOworICAgIE9uTG9hZENvbXBsZXRlTGlzdGVuZXI8RD4gbUxpc3RlbmVyOworICAgIENvbnRleHQgbUNvbnRleHQ7CisKKyAgICBwdWJsaWMgZmluYWwgY2xhc3MgRm9yY2VMb2FkQ29udGVudE9ic2VydmVyIGV4dGVuZHMgQ29udGVudE9ic2VydmVyIHsKKyAgICAgICAgcHVibGljIEZvcmNlTG9hZENvbnRlbnRPYnNlcnZlcigpIHsKKyAgICAgICAgICAgIHN1cGVyKG5ldyBIYW5kbGVyKCkpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIGRlbGl2ZXJTZWxmTm90aWZpY2F0aW9ucygpIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIG9uQ2hhbmdlKGJvb2xlYW4gc2VsZkNoYW5nZSkgeworICAgICAgICAgICAgb25Db250ZW50Q2hhbmdlZCgpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIGludGVyZmFjZSBPbkxvYWRDb21wbGV0ZUxpc3RlbmVyPEQ+IHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIENhbGxlZCBvbiB0aGUgdGhyZWFkIHRoYXQgY3JlYXRlZCB0aGUgTG9hZGVyIHdoZW4gdGhlIGxvYWQgaXMgY29tcGxldGUuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBsb2FkZXIgdGhlIGxvYWRlciB0aGF0IGNvbXBsZXRlZCB0aGUgbG9hZAorICAgICAgICAgKiBAcGFyYW0gZGF0YSB0aGUgcmVzdWx0IG9mIHRoZSBsb2FkCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgdm9pZCBvbkxvYWRDb21wbGV0ZShMb2FkZXI8RD4gbG9hZGVyLCBEIGRhdGEpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFN0b3JlcyBhd2F5IHRoZSBhcHBsaWNhdGlvbiBjb250ZXh0IGFzc29jaWF0ZWQgd2l0aCBjb250ZXh0LiBTaW5jZSBMb2FkZXJzIGNhbiBiZSB1c2VkCisgICAgICogYWNyb3NzIG11bHRpcGxlIGFjdGl2aXRpZXMgaXQncyBkYW5nZXJvdXMgdG8gc3RvcmUgdGhlIGNvbnRleHQgZGlyZWN0bHkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29udGV4dCB1c2VkIHRvIHJldHJpZXZlIHRoZSBhcHBsaWNhdGlvbiBjb250ZXh0LgorICAgICAqLworICAgIHB1YmxpYyBMb2FkZXIoQ29udGV4dCBjb250ZXh0KSB7CisgICAgICAgIG1Db250ZXh0ID0gY29udGV4dC5nZXRBcHBsaWNhdGlvbkNvbnRleHQoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZW5kcyB0aGUgcmVzdWx0IG9mIHRoZSBsb2FkIHRvIHRoZSByZWdpc3RlcmVkIGxpc3RlbmVyLiBTaG91bGQgb25seSBiZSBjYWxsZWQgYnkgc3ViY2xhc3Nlcy4KKyAgICAgKgorICAgICAqIE11c3QgYmUgY2FsbGVkIGZyb20gdGhlIFVJIHRocmVhZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBkYXRhIHRoZSByZXN1bHQgb2YgdGhlIGxvYWQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBkZWxpdmVyUmVzdWx0KEQgZGF0YSkgeworICAgICAgICBpZiAobUxpc3RlbmVyICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1MaXN0ZW5lci5vbkxvYWRDb21wbGV0ZSh0aGlzLCBkYXRhKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4gYW4gYXBwbGljYXRpb24gY29udGV4dCByZXRyaWV2ZWQgZnJvbSB0aGUgQ29udGV4dCBwYXNzZWQgdG8gdGhlIGNvbnN0cnVjdG9yLgorICAgICAqLworICAgIHB1YmxpYyBDb250ZXh0IGdldENvbnRleHQoKSB7CisgICAgICAgIHJldHVybiBtQ29udGV4dDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIHRoZSBJRCBvZiB0aGlzIGxvYWRlcgorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0SWQoKSB7CisgICAgICAgIHJldHVybiBtSWQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVnaXN0ZXJzIGEgY2xhc3MgdGhhdCB3aWxsIHJlY2VpdmUgY2FsbGJhY2tzIHdoZW4gYSBsb2FkIGlzIGNvbXBsZXRlLiBUaGUgY2FsbGJhY2tzIHdpbGwKKyAgICAgKiBiZSBjYWxsZWQgb24gdGhlIFVJIHRocmVhZCBzbyBpdCdzIHNhZmUgdG8gcGFzcyB0aGUgcmVzdWx0cyB0byB3aWRnZXRzLgorICAgICAqCisgICAgICogTXVzdCBiZSBjYWxsZWQgZnJvbSB0aGUgVUkgdGhyZWFkCisgICAgICovCisgICAgcHVibGljIHZvaWQgcmVnaXN0ZXJMaXN0ZW5lcihpbnQgaWQsIE9uTG9hZENvbXBsZXRlTGlzdGVuZXI8RD4gbGlzdGVuZXIpIHsKKyAgICAgICAgaWYgKG1MaXN0ZW5lciAhPSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJUaGVyZSBpcyBhbHJlYWR5IGEgbGlzdGVuZXIgcmVnaXN0ZXJlZCIpOworICAgICAgICB9CisgICAgICAgIG1MaXN0ZW5lciA9IGxpc3RlbmVyOworICAgICAgICBtSWQgPSBpZDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBNdXN0IGJlIGNhbGxlZCBmcm9tIHRoZSBVSSB0aHJlYWQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB1bnJlZ2lzdGVyTGlzdGVuZXIoT25Mb2FkQ29tcGxldGVMaXN0ZW5lcjxEPiBsaXN0ZW5lcikgeworICAgICAgICBpZiAobUxpc3RlbmVyID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIk5vIGxpc3RlbmVyIHJlZ2lzdGVyIik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1MaXN0ZW5lciAhPSBsaXN0ZW5lcikgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiQXR0ZW1wdGluZyB0byB1bnJlZ2lzdGVyIHRoZSB3cm9uZyBsaXN0ZW5lciIpOworICAgICAgICB9CisgICAgICAgIG1MaXN0ZW5lciA9IG51bGw7CisgICAgfQorCisgICAgLyoqCisgICAgICogU3RhcnRzIGFuIGFzeW5jaHJvbm91cyBsb2FkIG9mIHRoZSBjb250YWN0cyBsaXN0IGRhdGEuIFdoZW4gdGhlIHJlc3VsdCBpcyByZWFkeSB0aGUgY2FsbGJhY2tzCisgICAgICogd2lsbCBiZSBjYWxsZWQgb24gdGhlIFVJIHRocmVhZC4gSWYgYSBwcmV2aW91cyBsb2FkIGhhcyBiZWVuIGNvbXBsZXRlZCBhbmQgaXMgc3RpbGwgdmFsaWQKKyAgICAgKiB0aGUgcmVzdWx0IG1heSBiZSBwYXNzZWQgdG8gdGhlIGNhbGxiYWNrcyBpbW1lZGlhdGVseS4gVGhlIGxvYWRlciB3aWxsIG1vbml0b3IgdGhlIHNvdXJjZSBvZgorICAgICAqIHRoZSBkYXRhIHNldCBhbmQgbWF5IGRlbGl2ZXIgZnV0dXJlIGNhbGxiYWNrcyBpZiB0aGUgc291cmNlIGNoYW5nZXMuIENhbGxpbmcKKyAgICAgKiB7QGxpbmsgI3N0b3BMb2FkaW5nfSB3aWxsIHN0b3AgdGhlIGRlbGl2ZXJ5IG9mIGNhbGxiYWNrcy4KKyAgICAgKgorICAgICAqIE11c3QgYmUgY2FsbGVkIGZyb20gdGhlIFVJIHRocmVhZAorICAgICAqLworICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHN0YXJ0TG9hZGluZygpOworCisgICAgLyoqCisgICAgICogRm9yY2UgYW4gYXN5bmNocm9ub3VzIGxvYWQuIFVubGlrZSB7QGxpbmsgI3N0YXJ0TG9hZGluZygpfSB0aGlzIHdpbGwgaWdub3JlIGEgcHJldmlvdXNseQorICAgICAqIGxvYWRlZCBkYXRhIHNldCBhbmQgbG9hZCBhIG5ldyBvbmUuCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IHZvaWQgZm9yY2VMb2FkKCk7CisKKyAgICAvKioKKyAgICAgKiBTdG9wcyBkZWxpdmVyeSBvZiB1cGRhdGVzIHVudGlsIHRoZSBuZXh0IHRpbWUge0BsaW5rICNzdGFydExvYWRpbmcoKX0gaXMgY2FsbGVkCisgICAgICoKKyAgICAgKiBNdXN0IGJlIGNhbGxlZCBmcm9tIHRoZSBVSSB0aHJlYWQKKyAgICAgKi8KKyAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBzdG9wTG9hZGluZygpOworCisgICAgLyoqCisgICAgICogRGVzdHJveXMgdGhlIGxvYWRlciBhbmQgZnJlZXMgaXRzIHJlc291cmNlcywgbWFraW5nIGl0IHVudXNhYmxlLgorICAgICAqCisgICAgICogTXVzdCBiZSBjYWxsZWQgZnJvbSB0aGUgVUkgdGhyZWFkCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IHZvaWQgZGVzdHJveSgpOworCisgICAgLyoqCisgICAgICogQ2FsbGVkIHdoZW4ge0BsaW5rIEZvcmNlTG9hZENvbnRlbnRPYnNlcnZlcn0gZGV0ZWN0cyBhIGNoYW5nZS4gIENhbGxzIHtAbGluayAjZm9yY2VMb2FkKCl9CisgICAgICogYnkgZGVmYXVsdC4KKyAgICAgKgorICAgICAqIE11c3QgYmUgY2FsbGVkIGZyb20gdGhlIFVJIHRocmVhZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIG9uQ29udGVudENoYW5nZWQoKSB7CisgICAgICAgIGZvcmNlTG9hZCgpOworICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L1NoYXJlZFByZWZlcmVuY2VzLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L1NoYXJlZFByZWZlcmVuY2VzLmphdmEKaW5kZXggMTQ4NDIwNC4uYzA3ODhmNSAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9TaGFyZWRQcmVmZXJlbmNlcy5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvU2hhcmVkUHJlZmVyZW5jZXMuamF2YQpAQCAtMTcsNiArMTcsNyBAQAogcGFja2FnZSBhbmRyb2lkLmNvbnRlbnQ7CiAKIGltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5TZXQ7CiAKIC8qKgogICogSW50ZXJmYWNlIGZvciBhY2Nlc3NpbmcgYW5kIG1vZGlmeWluZyBwcmVmZXJlbmNlIGRhdGEgcmV0dXJuZWQgYnkge0BsaW5rCkBAIC03MSw2ICs3MiwxNyBAQAogICAgICAgICBFZGl0b3IgcHV0U3RyaW5nKFN0cmluZyBrZXksIFN0cmluZyB2YWx1ZSk7CiAgICAgICAgIAogICAgICAgICAvKioKKyAgICAgICAgICogU2V0IGEgc2V0IG9mIFN0cmluZyB2YWx1ZXMgaW4gdGhlIHByZWZlcmVuY2VzIGVkaXRvciwgdG8gYmUgd3JpdHRlbgorICAgICAgICAgKiBiYWNrIG9uY2Uge0BsaW5rICNjb21taXR9IGlzIGNhbGxlZC4KKyAgICAgICAgICogCisgICAgICAgICAqIEBwYXJhbSBrZXkgVGhlIG5hbWUgb2YgdGhlIHByZWZlcmVuY2UgdG8gbW9kaWZ5LgorICAgICAgICAgKiBAcGFyYW0gdmFsdWVzIFRoZSBuZXcgdmFsdWVzIGZvciB0aGUgcHJlZmVyZW5jZS4KKyAgICAgICAgICogQHJldHVybiBSZXR1cm5zIGEgcmVmZXJlbmNlIHRvIHRoZSBzYW1lIEVkaXRvciBvYmplY3QsIHNvIHlvdSBjYW4KKyAgICAgICAgICogY2hhaW4gcHV0IGNhbGxzIHRvZ2V0aGVyLgorICAgICAgICAgKi8KKyAgICAgICAgRWRpdG9yIHB1dFN0cmluZ1NldChTdHJpbmcga2V5LCBTZXQ8U3RyaW5nPiB2YWx1ZXMpOworICAgICAgICAKKyAgICAgICAgLyoqCiAgICAgICAgICAqIFNldCBhbiBpbnQgdmFsdWUgaW4gdGhlIHByZWZlcmVuY2VzIGVkaXRvciwgdG8gYmUgd3JpdHRlbiBiYWNrIG9uY2UKICAgICAgICAgICoge0BsaW5rICNjb21taXR9IG9yIHtAbGluayAjYXBwbHl9IGFyZSBjYWxsZWQuCiAgICAgICAgICAqIApAQCAtMjE4LDYgKzIzMCwyMCBAQAogICAgIFN0cmluZyBnZXRTdHJpbmcoU3RyaW5nIGtleSwgU3RyaW5nIGRlZlZhbHVlKTsKICAgICAKICAgICAvKioKKyAgICAgKiBSZXRyaWV2ZSBhIHNldCBvZiBTdHJpbmcgdmFsdWVzIGZyb20gdGhlIHByZWZlcmVuY2VzLgorICAgICAqIAorICAgICAqIEBwYXJhbSBrZXkgVGhlIG5hbWUgb2YgdGhlIHByZWZlcmVuY2UgdG8gcmV0cmlldmUuCisgICAgICogQHBhcmFtIGRlZlZhbHVlcyBWYWx1ZXMgdG8gcmV0dXJuIGlmIHRoaXMgcHJlZmVyZW5jZSBkb2VzIG5vdCBleGlzdC4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIHByZWZlcmVuY2UgdmFsdWVzIGlmIHRoZXkgZXhpc3QsIG9yIGRlZlZhbHVlcy4KKyAgICAgKiBUaHJvd3MgQ2xhc3NDYXN0RXhjZXB0aW9uIGlmIHRoZXJlIGlzIGEgcHJlZmVyZW5jZSB3aXRoIHRoaXMgbmFtZQorICAgICAqIHRoYXQgaXMgbm90IGEgU2V0LgorICAgICAqIAorICAgICAqIEB0aHJvd3MgQ2xhc3NDYXN0RXhjZXB0aW9uCisgICAgICovCisgICAgU2V0PFN0cmluZz4gZ2V0U3RyaW5nU2V0KFN0cmluZyBrZXksIFNldDxTdHJpbmc+IGRlZlZhbHVlcyk7CisgICAgCisgICAgLyoqCiAgICAgICogUmV0cmlldmUgYW4gaW50IHZhbHVlIGZyb20gdGhlIHByZWZlcmVuY2VzLgogICAgICAqIAogICAgICAqIEBwYXJhbSBrZXkgVGhlIG5hbWUgb2YgdGhlIHByZWZlcmVuY2UgdG8gcmV0cmlldmUuCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L1N5bmNNYW5hZ2VyLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L1N5bmNNYW5hZ2VyLmphdmEKaW5kZXggMjZiNmFkNy4uOTUwZDMzOSAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9TeW5jTWFuYWdlci5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvU3luY01hbmFnZXIuamF2YQpAQCAtMTYsNiArMTYsOCBAQAogCiBwYWNrYWdlIGFuZHJvaWQuY29udGVudDsKIAoraW1wb3J0IGNvbS5nb29nbGUuYW5kcm9pZC5jb2xsZWN0Lk1hcHM7CisKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC5SOwogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnV0aWwuQXJyYXlVdGlsczsKIApAQCAtNTYsNiArNTgsNyBAQAogaW1wb3J0IGphdmEuaW8uRmlsZURlc2NyaXB0b3I7CiBpbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwogaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwogaW1wb3J0IGphdmEudXRpbC5MaXN0OwogaW1wb3J0IGphdmEudXRpbC5SYW5kb207CkBAIC0xMjcsMTQgKzEzMCwxMyBAQAogCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IElOSVRJQUxJWkFUSU9OX1VOQklORF9ERUxBWV9NUyA9IDUwMDA7CiAKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1lOQ19XQUtFX0xPQ0sgPSAiKnN5bmMqIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1lOQ19XQUtFX0xPQ0tfUFJFRklYID0gIipzeW5jKiI7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEhBTkRMRV9TWU5DX0FMQVJNX1dBS0VfTE9DSyA9ICJTeW5jTWFuYWdlckhhbmRsZVN5bmNBbGFybSI7CiAKICAgICBwcml2YXRlIENvbnRleHQgbUNvbnRleHQ7CiAKICAgICBwcml2YXRlIHZvbGF0aWxlIEFjY291bnRbXSBtQWNjb3VudHMgPSBJTklUSUFMX0FDQ09VTlRTX0FSUkFZOwogCi0gICAgdm9sYXRpbGUgcHJpdmF0ZSBQb3dlck1hbmFnZXIuV2FrZUxvY2sgbVN5bmNXYWtlTG9jazsKICAgICB2b2xhdGlsZSBwcml2YXRlIFBvd2VyTWFuYWdlci5XYWtlTG9jayBtSGFuZGxlQWxhcm1XYWtlTG9jazsKICAgICB2b2xhdGlsZSBwcml2YXRlIGJvb2xlYW4gbURhdGFDb25uZWN0aW9uSXNDb25uZWN0ZWQgPSBmYWxzZTsKICAgICB2b2xhdGlsZSBwcml2YXRlIGJvb2xlYW4gbVN0b3JhZ2VJc0xvdyA9IGZhbHNlOwpAQCAtMTk2LDYgKzE5OCw4IEBACiAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBBY2NvdW50W10gSU5JVElBTF9BQ0NPVU5UU19BUlJBWSA9IG5ldyBBY2NvdW50WzBdOwogCisgICAgcHJpdmF0ZSBmaW5hbCBQb3dlck1hbmFnZXIgbVBvd2VyTWFuYWdlcjsKKwogICAgIHB1YmxpYyB2b2lkIG9uQWNjb3VudHNVcGRhdGVkKEFjY291bnRbXSBhY2NvdW50cykgewogICAgICAgICAvLyByZW1lbWJlciBpZiB0aGlzIHdhcyB0aGUgZmlyc3QgdGltZSB0aGlzIHdhcyBjYWxsZWQgYWZ0ZXIgYW4gdXBkYXRlCiAgICAgICAgIGZpbmFsIGJvb2xlYW4ganVzdEJvb3RlZFVwID0gbUFjY291bnRzID09IElOSVRJQUxfQUNDT1VOVFNfQVJSQVk7CkBAIC0zNTcsMTUgKzM2MSwxMyBAQAogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgbU5vdGlmaWNhdGlvbk1nciA9IG51bGw7CiAgICAgICAgIH0KLSAgICAgICAgUG93ZXJNYW5hZ2VyIHBtID0gKFBvd2VyTWFuYWdlcikgY29udGV4dC5nZXRTeXN0ZW1TZXJ2aWNlKENvbnRleHQuUE9XRVJfU0VSVklDRSk7Ci0gICAgICAgIG1TeW5jV2FrZUxvY2sgPSBwbS5uZXdXYWtlTG9jayhQb3dlck1hbmFnZXIuUEFSVElBTF9XQUtFX0xPQ0ssIFNZTkNfV0FLRV9MT0NLKTsKLSAgICAgICAgbVN5bmNXYWtlTG9jay5zZXRSZWZlcmVuY2VDb3VudGVkKGZhbHNlKTsKKyAgICAgICAgbVBvd2VyTWFuYWdlciA9IChQb3dlck1hbmFnZXIpIGNvbnRleHQuZ2V0U3lzdGVtU2VydmljZShDb250ZXh0LlBPV0VSX1NFUlZJQ0UpOwogCiAgICAgICAgIC8vIFRoaXMgV2FrZUxvY2sgaXMgdXNlZCB0byBlbnN1cmUgdGhhdCB3ZSBzdGF5IGF3YWtlIGJldHdlZW4gdGhlIHRpbWUgdGhhdCB3ZSByZWNlaXZlCiAgICAgICAgIC8vIGEgc3luYyBhbGFybSBub3RpZmljYXRpb24gYW5kIHdoZW4gd2UgZmluaXNoIHByb2Nlc3NpbmcgaXQuIFdlIG5lZWQgdG8gZG8gdGhpcwogICAgICAgICAvLyBiZWNhdXNlIHdlIGRvbid0IGRvIHRoZSB3b3JrIGluIHRoZSBhbGFybSBoYW5kbGVyLCByYXRoZXIgd2UgZG8gaXQgaW4gYSBtZXNzYWdlCiAgICAgICAgIC8vIGhhbmRsZXIuCi0gICAgICAgIG1IYW5kbGVBbGFybVdha2VMb2NrID0gcG0ubmV3V2FrZUxvY2soUG93ZXJNYW5hZ2VyLlBBUlRJQUxfV0FLRV9MT0NLLAorICAgICAgICBtSGFuZGxlQWxhcm1XYWtlTG9jayA9IG1Qb3dlck1hbmFnZXIubmV3V2FrZUxvY2soUG93ZXJNYW5hZ2VyLlBBUlRJQUxfV0FLRV9MT0NLLAogICAgICAgICAgICAgICAgIEhBTkRMRV9TWU5DX0FMQVJNX1dBS0VfTE9DSyk7CiAgICAgICAgIG1IYW5kbGVBbGFybVdha2VMb2NrLnNldFJlZmVyZW5jZUNvdW50ZWQoZmFsc2UpOwogCkBAIC0xMzAzLDYgKzEzMDUsOSBAQAogICAgICAgICBwdWJsaWMgZmluYWwgU3luY05vdGlmaWNhdGlvbkluZm8gbVN5bmNOb3RpZmljYXRpb25JbmZvID0gbmV3IFN5bmNOb3RpZmljYXRpb25JbmZvKCk7CiAgICAgICAgIHByaXZhdGUgTG9uZyBtQWxhcm1TY2hlZHVsZVRpbWUgPSBudWxsOwogICAgICAgICBwdWJsaWMgZmluYWwgU3luY1RpbWVUcmFja2VyIG1TeW5jVGltZVRyYWNrZXIgPSBuZXcgU3luY1RpbWVUcmFja2VyKCk7CisgICAgICAgIHByaXZhdGUgUG93ZXJNYW5hZ2VyLldha2VMb2NrIG1TeW5jV2FrZUxvY2s7CisgICAgICAgIHByaXZhdGUgZmluYWwgSGFzaE1hcDxQYWlyPFN0cmluZywgU3RyaW5nPiwgIFBvd2VyTWFuYWdlci5XYWtlTG9jaz4gbVdha2VMb2NrcyA9CisgICAgICAgICAgICAgICAgTWFwcy5uZXdIYXNoTWFwKCk7CiAKICAgICAgICAgLy8gdXNlZCB0byB0cmFjayBpZiB3ZSBoYXZlIGluc3RhbGxlZCB0aGUgZXJyb3Igbm90aWZpY2F0aW9uIHNvIHRoYXQgd2UgZG9uJ3QgcmVpbnN0YWxsCiAgICAgICAgIC8vIGl0IGlmIHN5bmMgaXMgc3RpbGwgZmFpbGluZwpAQCAtMTMxNiw2ICsxMzIxLDE4IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIAorICAgICAgICBwcml2YXRlIFBvd2VyTWFuYWdlci5XYWtlTG9jayBnZXRTeW5jV2FrZUxvY2soU3RyaW5nIGFjY291bnRUeXBlLCBTdHJpbmcgYXV0aG9yaXR5KSB7CisgICAgICAgICAgICBmaW5hbCBQYWlyPFN0cmluZywgU3RyaW5nPiB3YWtlTG9ja0tleSA9IFBhaXIuY3JlYXRlKGFjY291bnRUeXBlLCBhdXRob3JpdHkpOworICAgICAgICAgICAgUG93ZXJNYW5hZ2VyLldha2VMb2NrIHdha2VMb2NrID0gbVdha2VMb2Nrcy5nZXQod2FrZUxvY2tLZXkpOworICAgICAgICAgICAgaWYgKHdha2VMb2NrID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgbmFtZSA9IFNZTkNfV0FLRV9MT0NLX1BSRUZJWCArICJfIiArIGF1dGhvcml0eSArICJfIiArIGFjY291bnRUeXBlOworICAgICAgICAgICAgICAgIHdha2VMb2NrID0gbVBvd2VyTWFuYWdlci5uZXdXYWtlTG9jayhQb3dlck1hbmFnZXIuUEFSVElBTF9XQUtFX0xPQ0ssIG5hbWUpOworICAgICAgICAgICAgICAgIHdha2VMb2NrLnNldFJlZmVyZW5jZUNvdW50ZWQoZmFsc2UpOworICAgICAgICAgICAgICAgIG1XYWtlTG9ja3MucHV0KHdha2VMb2NrS2V5LCB3YWtlTG9jayk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gd2FrZUxvY2s7CisgICAgICAgIH0KKwogICAgICAgICBwcml2YXRlIHZvaWQgd2FpdFVudGlsUmVhZHlUb1J1bigpIHsKICAgICAgICAgICAgIENvdW50RG93bkxhdGNoIGxhdGNoID0gbVJlYWR5VG9SdW5MYXRjaDsKICAgICAgICAgICAgIGlmIChsYXRjaCAhPSBudWxsKSB7CkBAIC0xNDc4LDggKzE0OTUsOSBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0gZmluYWxseSB7CiAgICAgICAgICAgICAgICAgZmluYWwgYm9vbGVhbiBpc1N5bmNJblByb2dyZXNzID0gbUFjdGl2ZVN5bmNDb250ZXh0ICE9IG51bGw7Ci0gICAgICAgICAgICAgICAgaWYgKCFpc1N5bmNJblByb2dyZXNzKSB7CisgICAgICAgICAgICAgICAgaWYgKCFpc1N5bmNJblByb2dyZXNzICYmIG1TeW5jV2FrZUxvY2sgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgICBtU3luY1dha2VMb2NrLnJlbGVhc2UoKTsKKyAgICAgICAgICAgICAgICAgICAgbVN5bmNXYWtlTG9jayA9IG51bGw7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIG1hbmFnZVN5bmNOb3RpZmljYXRpb24oKTsKICAgICAgICAgICAgICAgICBtYW5hZ2VFcnJvck5vdGlmaWNhdGlvbigpOwpAQCAtMTcwMSwxMyArMTcxOSwzMSBAQAogICAgICAgICAgICAgICAgIG1BY3RpdmVTeW5jQ29udGV4dC5jbG9zZSgpOwogICAgICAgICAgICAgICAgIG1BY3RpdmVTeW5jQ29udGV4dCA9IG51bGw7CiAgICAgICAgICAgICAgICAgbVN5bmNTdG9yYWdlRW5naW5lLnNldEFjdGl2ZVN5bmMobUFjdGl2ZVN5bmNDb250ZXh0KTsKLSAgICAgICAgICAgICAgICBtU3luY1dha2VMb2NrLnNldFdvcmtTb3VyY2UobnVsbCk7CiAgICAgICAgICAgICAgICAgcnVuU3RhdGVJZGxlKCk7CiAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBtU3luY1dha2VMb2NrLnNldFdvcmtTb3VyY2UobmV3IFdvcmtTb3VyY2Uoc3luY0FkYXB0ZXJJbmZvLnVpZCkpOwotICAgICAgICAgICAgbVN5bmNXYWtlTG9jay5hY3F1aXJlKCk7CisgICAgICAgICAgICAvLyBGaW5kIHRoZSB3YWtlbG9jayBmb3IgdGhpcyBhY2NvdW50IGFuZCBhdXRob3JpdHkgYW5kIHN0b3JlIGl0IGluIG1TeW5jV2FrZUxvY2suCisgICAgICAgICAgICAvLyBCZSBzdXJlIHRvIHJlbGVhc2UgdGhlIHByZXZpb3VzIHdha2Vsb2NrIHNvIHRoYXQgd2UgZG9uJ3QgZW5kIHVwIHdpdGggaXQgYmVpbmcKKyAgICAgICAgICAgIC8vIGhlbGQgdW50aWwgaXQgaXMgdXNlZCBhZ2Fpbi4KKyAgICAgICAgICAgIC8vIFRoZXJlIGFyZSBhIGNvdXBsZSB0cmlja3kgdGhpbmdzIGFib3V0IHRoaXMgY29kZToKKyAgICAgICAgICAgIC8vIC0gbWFrZSBzdXJlIHRoYXQgd2UgYWNxdWlyZSB0aGUgbmV3IHdha2Vsb2NrIGJlZm9yZSByZWxlYXNpbmcgdGhlIG9sZCBvbmUsCisgICAgICAgICAgICAvLyAgIG90aGVyd2lzZSB0aGUgZGV2aWNlIG1pZ2h0IGdvIHRvIHNsZWVwIGFzIHNvb24gYXMgd2UgcmVsZWFzZSBpdC4KKyAgICAgICAgICAgIC8vIC0gc2luY2Ugd2UgdXNlIG5vbi1yZWZlcmVuY2UgY291bnRlZCB3YWtlbG9ja3Mgd2UgaGF2ZSB0byBiZSBzdXJlIG5vdCB0byBkbworICAgICAgICAgICAgLy8gICB0aGUgcmVsZWFzZSBpZiB0aGUgd2FrZWxvY2sgZGlkbid0IGNoYW5nZS4gT3RoZXdpc2Ugd2Ugd291bGQgZG8gYW4KKyAgICAgICAgICAgIC8vICAgYWNxdWlyZSBmb2xsb3dlZCBieSBhIHJlbGVhc2Ugb24gdGhlIHNhbWUgbG9jaywgcmVzdWx0aW5nIGluIG5vIGxvY2sKKyAgICAgICAgICAgIC8vICAgYmVpbmcgaGVsZC4KKyAgICAgICAgICAgIFBvd2VyTWFuYWdlci5XYWtlTG9jayBvbGRXYWtlTG9jayA9IG1TeW5jV2FrZUxvY2s7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIG1TeW5jV2FrZUxvY2sgPSBnZXRTeW5jV2FrZUxvY2sob3AuYWNjb3VudC50eXBlLCBvcC5hdXRob3JpdHkpOworCQkJCW1TeW5jV2FrZUxvY2suc2V0V29ya1NvdXJjZShuZXcgV29ya1NvdXJjZShzeW5jQWRhcHRlckluZm8udWlkKSk7CisgICAgICAgICAgICAgICAgbVN5bmNXYWtlTG9jay5hY3F1aXJlKCk7CisgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgIGlmIChvbGRXYWtlTG9jayAhPSBudWxsICYmIG9sZFdha2VMb2NrICE9IG1TeW5jV2FrZUxvY2spIHsKKyAgICAgICAgICAgICAgICAgICAgb2xkV2FrZUxvY2sucmVsZWFzZSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgLy8gbm8gbmVlZCB0byBzY2hlZHVsZSBhbiBhbGFybSwgYXMgdGhhdCB3aWxsIGJlIGRvbmUgYnkgb3VyIGNhbGxlci4KIAogICAgICAgICAgICAgLy8gdGhlIG5leHQgc3RlcCB3aWxsIG9jY3VyIHdoZW4gd2UgZ2V0IGVpdGhlciBhIHRpbWVvdXQgb3IgYQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9YbWxEb2N1bWVudFByb3ZpZGVyLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L1htbERvY3VtZW50UHJvdmlkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNTNhZDM4Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9YbWxEb2N1bWVudFByb3ZpZGVyLmphdmEKQEAgLTAsMCArMSw0MzYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQuY29udGVudDsKKworaW1wb3J0IG9yZy5hcGFjaGUuaHR0cC5IdHRwRW50aXR5OworaW1wb3J0IG9yZy5hcGFjaGUuaHR0cC5IdHRwUmVzcG9uc2U7CitpbXBvcnQgb3JnLmFwYWNoZS5odHRwLkh0dHBTdGF0dXM7CitpbXBvcnQgb3JnLmFwYWNoZS5odHRwLmNsaWVudC5tZXRob2RzLkh0dHBHZXQ7CitpbXBvcnQgb3JnLnhtbHB1bGwudjEuWG1sUHVsbFBhcnNlcjsKK2ltcG9ydCBvcmcueG1scHVsbC52MS5YbWxQdWxsUGFyc2VyRXhjZXB0aW9uOworaW1wb3J0IG9yZy54bWxwdWxsLnYxLlhtbFB1bGxQYXJzZXJGYWN0b3J5OworCitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRSZXNvbHZlci5PcGVuUmVzb3VyY2VJZFJlc3VsdDsKK2ltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLkN1cnNvcjsKK2ltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLk1hdHJpeEN1cnNvcjsKK2ltcG9ydCBhbmRyb2lkLm5ldC5Vcmk7CitpbXBvcnQgYW5kcm9pZC5uZXQuaHR0cC5BbmRyb2lkSHR0cENsaWVudDsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkN1cnNvckFkYXB0ZXI7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS51dGlsLkJpdFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuU3RhY2s7CitpbXBvcnQgamF2YS51dGlsLnJlZ2V4LlBhdHRlcm47CisKKy8qKgorICogQSByZWFkLW9ubHkgY29udGVudCBwcm92aWRlciB3aGljaCBleHRyYWN0cyBkYXRhIG91dCBvZiBhbiBYTUwgZG9jdW1lbnQuCisgKgorICogPHA+QSBYUGF0aC1saWtlIHNlbGVjdGlvbiBwYXR0ZXJuIGlzIHVzZWQgdG8gc2VsZWN0IHNvbWUgbm9kZXMgaW4gdGhlIFhNTCBkb2N1bWVudC4gRWFjaCBzdWNoCisgKiBub2RlIHdpbGwgY3JlYXRlIGEgcm93IGluIHRoZSB7QGxpbmsgQ3Vyc29yfSByZXN1bHQuPC9wPgorICoKKyAqIEVhY2ggcm93IGlzIHRoZW4gcG9wdWxhdGVkIHdpdGggY29sdW1ucyB0aGF0IGFyZSBhbHNvIGRlZmluZWQgYXMgWFBhdGgtbGlrZSBwcm9qZWN0aW9ucy4gVGhlc2UKKyAqIHByb2plY3Rpb25zIGZldGNoIGF0dHJpYnV0ZXMgdmFsdWVzIG9yIHRleHQgaW4gdGhlIG1hdGNoaW5nIHJvdyBub2RlIG9yIGl0cyBjaGlsZHJlbi4KKyAqCisgKiA8cD5UbyBhZGQgdGhpcyBwcm92aWRlciBpbiB5b3VyIGFwcGxpY2F0aW9uLCB5b3Ugc2hvdWxkIGFkZCBpdHMgZGVjbGFyYXRpb24gdG8geW91ciBhcHBsaWNhdGlvbgorICogbWFuaWZlc3Q6CisgKiA8cHJlIGNsYXNzPSJwcmV0dHlwcmludCI+CisgKiAmbHQ7cHJvdmlkZXIgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmNvbnRlbnQuWG1sRG9jdW1lbnRQcm92aWRlciIgYW5kcm9pZDphdXRob3JpdGllcz0ieG1sZG9jdW1lbnQiIC8mZ3Q7CisgKiA8L3ByZT4KKyAqIDwvcD4KKyAqCisgKiA8aDI+Tm9kZSBzZWxlY3Rpb24gc3ludGF4PC9oMj4KKyAqIFRoZSBub2RlIHNlbGVjdGlvbiBzeW50YXggaXMgbWFkZSBvZiB0aGUgY29uY2F0ZW5hdGlvbiBvZiBhbiBhcmJpdHJhcnkgbnVtYmVyIChhdCBsZWFzdCBvbmUpIG9mCisgKiA8Y29kZT4vbm9kZV9uYW1lPC9jb2RlPiBub2RlIHNlbGVjdGlvbiBwYXR0ZXJucy4KKyAqCisgKiA8cD5UaGUgPGNvZGU+L3Jvb3QvY2hpbGQxL2NoaWxkMjwvY29kZT4gcGF0dGVybiB3aWxsIGZvciBpbnN0YW5jZSBtYXRjaCBhbGwgbm9kZXMgbmFtZWQKKyAqIDxjb2RlPmNoaWxkMjwvY29kZT4gd2hpY2ggYXJlIGNoaWxkcmVuIG9mIGEgbm9kZSBuYW1lZCA8Y29kZT5jaGlsZDE8L2NvZGU+IHdoaWNoIGFyZSB0aGVtc2VsdmVzCisgKiBjaGlsZHJlbiBvZiBhIHJvb3Qgbm9kZSBuYW1lZCA8Y29kZT5yb290PC9jb2RlPi48L3A+CisgKgorICogQW55IDxjb2RlPi88L2NvZGU+IHNlcGFyYXRvciBpbiB0aGUgcHJldmlvdXMgZXhwcmVzc2lvbiBjYW4gYmUgcmVwbGFjZWQgYnkgYSA8Y29kZT4vLzwvY29kZT4KKyAqIHNlcGFyYXRvciBpbnN0ZWFkLCB3aGljaCBpbmRpY2F0ZWQgYSA8aT5kZXNjZW5kYW50PC9pPiBpbnN0ZWFkIG9mIGEgY2hpbGQuCisgKgorICogPHA+VGhlIDxjb2RlPi8vbm9kZTEvL25vZGUyPC9jb2RlPiBwYXR0ZXJuIHdpbGwgZm9yIGluc3RhbmNlIG1hdGNoIGFsbCBub2RlcyBuYW1lZAorICogPGNvZGU+bm9kZTI8L2NvZGU+IHdoaWNoIGFyZSBkZXNjZW5kYW50IG9mIGEgbm9kZSBuYW1lZCA8Y29kZT5ub2RlMTwvY29kZT4gbG9jYXRlZCBhbnl3aGVyZSBpbgorICogdGhlIGRvY3VtZW50IGhpZXJhcmNoeS48L3A+CisgKgorICogTm9kZSBuYW1lcyBjYW4gY29udGFpbiBuYW1lc3BhY2VzIGluIHRoZSBmb3JtIDxjb2RlPm5hbWVzcGFjZTpub2RlPC9jb2RlPi4KKyAqCisgKiA8aDI+UHJvamVjdGlvbiBzeW50YXg8L2gyPgorICogRm9yIGV2ZXJ5IHNlbGVjdGVkIG5vZGUsIHRoZSBwcm9qZWN0aW9uIHdpbGwgdGhlbiBleHRyYWN0IGFjdHVhbCBkYXRhIGZyb20gdGhpcyBub2RlIGFuZCBpdHMKKyAqIGRlc2NlbmRhbnQuCisgKgorICogPHA+VXNlIGEgc3ludGF4IHNpbWlsYXIgdG8gdGhlIHNlbGVjdGlvbiBzeW50YXggZGVzY3JpYmVkIGFib3ZlIHRvIHNlbGVjdCB0aGUgdGV4dCBhc3NvY2lhdGVkCisgKiB3aXRoIGEgY2hpbGQgb2YgdGhlIHNlbGVjdGVkIG5vZGUuIFRoZSBpbXBsaWNpdCByb290IG9mIHRoaXMgcHJvamVjdGlvbiBwYXR0ZXJuIGlzIHRoZSBzZWxlY3RlZAorICogbm9kZS4gPGNvZGU+LzwvY29kZT4gd2lsbCBoZW5jZSByZWZlciB0byB0aGUgdGV4dCBvZiB0aGUgc2VsZWN0ZWQgbm9kZSwgd2hpbGUKKyAqIDxjb2RlPi9jaGlsZDE8L2NvZGU+IHdpbGwgZmV0Y2ggdGhlIHRleHQgb2YgaXRzIGNoaWxkIG5hbWVkIDxjb2RlPmNoaWxkMTwvY29kZT4gYW5kCisgKiA8Y29kZT4vL2NoaWxkMTwvY29kZT4gd2lsbCBtYXRjaCBhbnkgPGk+ZGVzY2VuZGFudDwvaT4gbmFtZWQgPGNvZGU+Y2hpbGQxPC9jb2RlPi4gSWYgc2V2ZXJhbAorICogbm9kZXMgbWF0Y2ggdGhlIHByb2plY3Rpb24gcGF0dGVybiwgdGhlaXIgdGV4dHMgYXJlIGFwcGVuZGVkIGFzIGEgcmVzdWx0LjwvcD4KKyAqCisgKiBBIHByb2plY3Rpb24gY2FuIGFsc28gZmV0Y2ggYW55IG5vZGUgYXR0cmlidXRlIGJ5IGFwcGVuZGluZyBhIDxjb2RlPkBhdHRyaWJ1dGVfbmFtZTwvY29kZT4KKyAqIHBhdHRlcm4gdG8gdGhlIHByZXZpb3VzbHkgZGVzY3JpYmVkIHN5bnRheC4gPGNvZGU+Ly9jaGlsZDFAcHJpY2U8L2NvZGU+IHdpbGwgZm9yIGluc3RhbmNlIG1hdGNoCisgKiB0aGUgYXR0cmlidXRlIDxjb2RlPnByaWNlPC9jb2RlPiBvZiBhbnkgPGNvZGU+Y2hpbGQxPC9jb2RlPiBkZXNjZW5kYW50LgorICoKKyAqIDxwPklmIGEgcHJvamVjdGlvbiBkb2VzIG5vdCBtYXRjaCBhbnkgbm9kZS9hdHRyaWJ1dGUsIGl0cyBhc3NvY2lhdGVkIHZhbHVlIHdpbGwgYmUgYW4gZW1wdHkKKyAqIHN0cmluZy48L3A+CisgKgorICogPGgyPkV4YW1wbGU8L2gyPgorICogVXNpbmcgdGhlIGZvbGxvd2luZyBYTUwgZG9jdW1lbnQ6CisgKiA8cHJlIGNsYXNzPSJwcmV0dHlwcmludCI+CisgKiAmbHQ7bGlicmFyeSZndDsKKyAqICAgJmx0O2Jvb2sgaWQ9IkVIOTQiJmd0OworICogICAgICZsdDt0aXRsZSZndDtUaGUgT2xkIE1hbiBhbmQgdGhlIFNlYSZsdDsvdGl0bGUmZ3Q7CisgKiAgICAgJmx0O2F1dGhvciZndDtFcm5lc3QgSGVtaW5nd2F5Jmx0Oy9hdXRob3ImZ3Q7CisgKiAgICZsdDsvYm9vayZndDsKKyAqICAgJmx0O2Jvb2sgaWQ9IlhYMTAiJmd0OworICogICAgICZsdDt0aXRsZSZndDtUaGUgQXJhYmlhbiBOaWdodHM6IFRhbGVzIG9mIDEsMDAxIE5pZ2h0cyZsdDsvdGl0bGUmZ3Q7CisgKiAgICZsdDsvYm9vayZndDsKKyAqICAgJmx0O25vLWlkJmd0OworICogICAgICZsdDtib29rJmd0OworICogICAgICAgJmx0O3RpdGxlJmd0O0FuaW1hbCBGYXJtJmx0Oy90aXRsZSZndDsKKyAqICAgICAgICZsdDthdXRob3ImZ3Q7R2VvcmdlIE9yd2VsbCZsdDsvYXV0aG9yJmd0OworICogICAgICZsdDsvYm9vayZndDsKKyAqICAgJmx0Oy9uby1pZCZndDsKKyAqICZsdDsvbGlicmFyeSZndDsKKyAqIDwvcHJlPgorICogQSBzZWxlY3Rpb24gcGF0dGVybiBvZiA8Y29kZT4vbGlicmFyeS8vYm9vazwvY29kZT4gd2lsbCBtYXRjaCB0aGUgdGhyZWUgYm9vayBlbnRyaWVzICh3aGlsZQorICogPGNvZGU+L2xpYnJhcnkvYm9vazwvY29kZT4gd2lsbCBvbmx5IG1hdGNoIHRoZSBmaXJzdCB0d28gb25lcykuCisgKgorICogPHA+RGVmaW5pbmcgdGhlIHByb2plY3Rpb25zIGFzIDxjb2RlPi90aXRsZTwvY29kZT4sIDxjb2RlPi9hdXRob3I8L2NvZGU+IGFuZCA8Y29kZT5AaWQ8L2NvZGU+CisgKiB3aWxsIHJldHJpZXZlIHRoZSBhc3NvY2lhdGVkIGRhdGEuIE5vdGUgdGhhdCB0aGUgYXV0aG9yIG9mIHRoZSBzZWNvbmQgYm9vayBhcyB3ZWxsIGFzIHRoZSBpZCBvZgorICogdGhlIHRoaXJkIGFyZSBlbXB0eSBzdHJpbmdzLgorICovCitwdWJsaWMgY2xhc3MgWG1sRG9jdW1lbnRQcm92aWRlciBleHRlbmRzIENvbnRlbnRQcm92aWRlciB7CisgICAgLyoKKyAgICAgKiBJZGVhcyBmb3IgaW1wcm92ZW1lbnQ6CisgICAgICogLSBFeHBhbmQgWFBhdGgtbGlrZSBzeW50YXggdG8gYWxsb3cgZm9yIFtuYl0gY2hpbGQgbnVtYmVyIHNlbGVjdG9yCisgICAgICogLSBBZGRyZXNzIHRoZSBzdGFydGluZyAuIGJ1ZyBpbiBBYnN0cmFjdEN1cnNvciB3aGljaCBwcmV2ZW50cyBhIHRydWUgWFBhdGggc3ludGF4LgorICAgICAqIC0gUHJvdmlkZSBhbiBhbHRlcm5hdGl2ZSB0byBjb25jYXRlbmF0aW9uIHdoZW4gc2V2ZXJhbCBub2RlIG1hdGNoIChsaXN0LWxpa2UpLgorICAgICAqIC0gU3VwcG9ydCBuYW1lc3BhY2VzIGluIGF0dHJpYnV0ZSBuYW1lcy4KKyAgICAgKiAtIEluY3JlbWVudGFsIEN1cnNvciBjcmVhdGlvbiwgcGFnaW5hdGlvbgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMT0dfVEFHID0gIlhtbERvY3VtZW50UHJvdmlkZXIiOworICAgIHByaXZhdGUgQW5kcm9pZEh0dHBDbGllbnQgbUh0dHBDbGllbnQ7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBvbkNyZWF0ZSgpIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogUXVlcnkgZGF0YSBmcm9tIHRoZSBYTUwgZG9jdW1lbnQgcmVmZXJlbmNlZCBpbiB0aGUgVVJJLgorICAgICAqCisgICAgICogPHA+VGhlIFhNTCBkb2N1bWVudCBjYW4gYmUgYSBsb2NhbCByZXNvdXJjZSBvciBhIGZpbGUgdGhhdCB3aWxsIGJlIGRvd25sb2FkZWQgZnJvbSB0aGUKKyAgICAgKiBJbnRlcm5ldC4gSW4gdGhlIGxhdHRlciBjYXNlLCB5b3VyIGFwcGxpY2F0aW9uIG5lZWRzIHRvIHJlcXVlc3QgdGhlIElOVEVSTkVUIHBlcm1pc3Npb24gaW4KKyAgICAgKiBpdHMgbWFuaWZlc3QuPC9wPgorICAgICAqCisgICAgICogVGhlIFVSSSB3aWxsIGJlIG9mIHRoZSBmb3JtIDxjb2RlPmNvbnRlbnQ6Ly94bWxkb2N1bWVudC8/cmVzb3VyY2U9Ui54bWwubXlGaWxlPC9jb2RlPiBmb3IgYQorICAgICAqIGxvY2FsIHJlc291cmNlLiA8Y29kZT54bWxkb2N1bWVudDwvY29kZT4gc2hvdWxkIG1hdGNoIHRoZSBhdXRob3JpdHkgZGVjbGFyZWQgZm9yIHRoaXMKKyAgICAgKiBwcm92aWRlciBpbiB5b3VyIG1hbmlmZXN0LiBJbnRlcm5ldCBkb2N1bWVudHMgYXJlIHJlZmVyZW5jZWQgdXNpbmcKKyAgICAgKiA8Y29kZT5jb250ZW50Oi8veG1sZG9jdW1lbnQvP3VybD08L2NvZGU+IGZvbGxvd2VkIGJ5IGFuIGVuY29kZWQgdmVyc2lvbiBvZiB0aGUgVVJMIG9mIHlvdXIKKyAgICAgKiBkb2N1bWVudCAoc2VlIHtAbGluayBVcmkjZW5jb2RlKFN0cmluZyl9KS4KKyAgICAgKgorICAgICAqIDxwPlRoZSBudW1iZXIgb2YgY29sdW1ucyBvZiB0aGUgcmVzdWx0aW5nIEN1cnNvciBpcyBlcXVhbCB0byB0aGUgc2l6ZSBvZiB0aGUgcHJvamVjdGlvbgorICAgICAqIGFycmF5IHBsdXMgb25lLCBuYW1lZCA8Y29kZT5faWQ8L2NvZGU+IHdoaWNoIHdpbGwgY29udGFpbiBhIHVuaXF1ZSByb3cgaWQgKGFsbG93aW5nIHRoZQorICAgICAqIEN1cnNvciB0byBiZSB1c2VkIHdpdGggYSB7QGxpbmsgQ3Vyc29yQWRhcHRlcn0pLiBUaGUgb3RoZXIgY29sdW1ucycgbmFtZXMgYXJlIHRoZSBwcm9qZWN0aW9uCisgICAgICogcGF0dGVybnMuPC9wPgorICAgICAqCisgICAgICogQHBhcmFtIHVyaSBUaGUgVVJJIG9mIHlvdXIgbG9jYWwgcmVzb3VyY2Ugb3IgSW50ZXJuZXQgZG9jdW1lbnQuCisgICAgICogQHBhcmFtIHByb2plY3Rpb24gQSBzZXQgb2YgcGF0dGVybnMgdGhhdCB3aWxsIGJlIHVzZWQgdG8gZXh0cmFjdCBkYXRhIGZyb20gZWFjaCBzZWxlY3RlZAorICAgICAqIG5vZGUuIFNlZSBjbGFzcyBkb2N1bWVudGF0aW9uIGZvciBwYXR0ZXJuIHN5bnRheC4KKyAgICAgKiBAcGFyYW0gc2VsZWN0aW9uIEEgc2VsZWN0aW9uIHBhdHRlcm4gd2hpY2ggd2lsbCBzZWxlY3QgdGhlIG5vZGVzIHRoYXQgd2lsbCBjcmVhdGUgdGhlCisgICAgICogQ3Vyc29yJ3Mgcm93cy4gU2VlIGNsYXNzIGRvY3VtZW50YXRpb24gZm9yIHBhdHRlcm4gc3ludGF4LgorICAgICAqIEBwYXJhbSBzZWxlY3Rpb25BcmdzIFRoaXMgcGFyYW1ldGVyIGlzIGlnbm9yZWQuCisgICAgICogQHBhcmFtIHNvcnRPcmRlciBUaGUgcm93IG9yZGVyIGluIHRoZSByZXN1bHRpbmcgY3Vyc29yIGlzIGRldGVybWluZWQgZnJvbSB0aGUgbm9kZSBvcmRlciBpbgorICAgICAqIHRoZSBYTUwgZG9jdW1lbnQuIFRoaXMgcGFyYW1ldGVyIGlzIGlnbm9yZWQuCisgICAgICogQHJldHVybiBBIEN1cnNvciBvciBudWxsIGluIGNhc2Ugb2YgZXJyb3IuCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIEN1cnNvciBxdWVyeShVcmkgdXJpLCBTdHJpbmdbXSBwcm9qZWN0aW9uLCBTdHJpbmcgc2VsZWN0aW9uLCBTdHJpbmdbXSBzZWxlY3Rpb25BcmdzLAorICAgICAgICAgICAgU3RyaW5nIHNvcnRPcmRlcikgeworCisgICAgICAgIFhtbFB1bGxQYXJzZXIgcGFyc2VyID0gbnVsbDsKKyAgICAgICAgbUh0dHBDbGllbnQgPSBudWxsOworCisgICAgICAgIGZpbmFsIFN0cmluZyB1cmwgPSB1cmkuZ2V0UXVlcnlQYXJhbWV0ZXIoInVybCIpOworICAgICAgICBpZiAodXJsICE9IG51bGwpIHsKKyAgICAgICAgICAgIHBhcnNlciA9IGdldFVyaVhtbFB1bGxQYXJzZXIodXJsKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGZpbmFsIFN0cmluZyByZXNvdXJjZSA9IHVyaS5nZXRRdWVyeVBhcmFtZXRlcigicmVzb3VyY2UiKTsKKyAgICAgICAgICAgIGlmIChyZXNvdXJjZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgVXJpIHJlc291cmNlVXJpID0gVXJpLnBhcnNlKENvbnRlbnRSZXNvbHZlci5TQ0hFTUVfQU5EUk9JRF9SRVNPVVJDRSArICI6Ly8iICsKKyAgICAgICAgICAgICAgICAgICAgICAgIGdldENvbnRleHQoKS5nZXRQYWNrYWdlTmFtZSgpICsgIi8iICsgcmVzb3VyY2UpOworICAgICAgICAgICAgICAgIHBhcnNlciA9IGdldFJlc291cmNlWG1sUHVsbFBhcnNlcihyZXNvdXJjZVVyaSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAocGFyc2VyICE9IG51bGwpIHsKKyAgICAgICAgICAgIFhNTEN1cnNvciB4bWxDdXJzb3IgPSBuZXcgWE1MQ3Vyc29yKHNlbGVjdGlvbiwgcHJvamVjdGlvbik7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHhtbEN1cnNvci5wYXJzZVdpdGgocGFyc2VyKTsKKyAgICAgICAgICAgICAgICByZXR1cm4geG1sQ3Vyc29yOworICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIExvZy53KExPR19UQUcsICJJL08gZXJyb3Igd2hpbGUgcGFyc2luZyBYTUwgIiArIHVyaSwgZSk7CisgICAgICAgICAgICB9IGNhdGNoIChYbWxQdWxsUGFyc2VyRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBMb2cudyhMT0dfVEFHLCAiRXJyb3Igd2hpbGUgcGFyc2luZyBYTUwgIiArIHVyaSwgZSk7CisgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgIGlmIChtSHR0cENsaWVudCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIG1IdHRwQ2xpZW50LmNsb3NlKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhbiBYbWxQdWxsUGFyc2VyIGZvciB0aGUgcHJvdmlkZWQgVVJMLiBDYW4gYmUgb3ZlcmxvYWRlZCB0byBwcm92aWRlIHlvdXIgb3duIHBhcnNlci4KKyAgICAgKiBAcGFyYW0gdXJsIFRoZSBVUkwgb2YgdGhlIFhNTCBkb2N1bWVudCB0aGF0IGlzIHRvIGJlIHBhcnNlZC4KKyAgICAgKiBAcmV0dXJuIEFuIFhtbFB1bGxQYXJzZXIgb24gdGhpcyBkb2N1bWVudC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgWG1sUHVsbFBhcnNlciBnZXRVcmlYbWxQdWxsUGFyc2VyKFN0cmluZyB1cmwpIHsKKyAgICAgICAgWG1sUHVsbFBhcnNlciBwYXJzZXIgPSBudWxsOworICAgICAgICB0cnkgeworICAgICAgICAgICAgWG1sUHVsbFBhcnNlckZhY3RvcnkgZmFjdG9yeSA9IFhtbFB1bGxQYXJzZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCk7CisgICAgICAgICAgICBmYWN0b3J5LnNldE5hbWVzcGFjZUF3YXJlKHRydWUpOworICAgICAgICAgICAgcGFyc2VyID0gZmFjdG9yeS5uZXdQdWxsUGFyc2VyKCk7CisgICAgICAgIH0gY2F0Y2ggKFhtbFB1bGxQYXJzZXJFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgTG9nLmUoTE9HX1RBRywgIlVuYWJsZSB0byBjcmVhdGUgWG1sUHVsbFBhcnNlciIsIGUpOworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKworICAgICAgICBJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSA9IG51bGw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBmaW5hbCBIdHRwR2V0IGdldCA9IG5ldyBIdHRwR2V0KHVybCk7CisgICAgICAgICAgICBtSHR0cENsaWVudCA9IEFuZHJvaWRIdHRwQ2xpZW50Lm5ld0luc3RhbmNlKCJBbmRyb2lkIik7CisgICAgICAgICAgICBIdHRwUmVzcG9uc2UgcmVzcG9uc2UgPSBtSHR0cENsaWVudC5leGVjdXRlKGdldCk7CisgICAgICAgICAgICBpZiAocmVzcG9uc2UuZ2V0U3RhdHVzTGluZSgpLmdldFN0YXR1c0NvZGUoKSA9PSBIdHRwU3RhdHVzLlNDX09LKSB7CisgICAgICAgICAgICAgICAgZmluYWwgSHR0cEVudGl0eSBlbnRpdHkgPSByZXNwb25zZS5nZXRFbnRpdHkoKTsKKyAgICAgICAgICAgICAgICBpZiAoZW50aXR5ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgaW5wdXRTdHJlYW0gPSBlbnRpdHkuZ2V0Q29udGVudCgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgTG9nLncoTE9HX1RBRywgIkVycm9yIHdoaWxlIHJldHJpZXZpbmcgWE1MIGZpbGUgIiArIHVybCwgZSk7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBwYXJzZXIuc2V0SW5wdXQoaW5wdXRTdHJlYW0sIG51bGwpOworICAgICAgICB9IGNhdGNoIChYbWxQdWxsUGFyc2VyRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIExvZy53KExPR19UQUcsICJFcnJvciB3aGlsZSByZWFkaW5nIFhNTCBmaWxlIGZyb20gIiArIHVybCwgZSk7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBwYXJzZXI7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhbiBYbWxQdWxsUGFyc2VyIGZvciB0aGUgcHJvdmlkZWQgbG9jYWwgcmVzb3VyY2UuIENhbiBiZSBvdmVybG9hZGVkIHRvIHByb3ZpZGUgeW91cgorICAgICAqIG93biBwYXJzZXIuCisgICAgICogQHBhcmFtIHJlc291cmNlVXJpIEEgZnVsbHkgcXVhbGlmaWVkIHJlc291cmNlIG5hbWUgcmVmZXJlbmNpbmcgYSBsb2NhbCBYTUwgcmVzb3VyY2UuCisgICAgICogQHJldHVybiBBbiBYbWxQdWxsUGFyc2VyIG9uIHRoaXMgcmVzb3VyY2UuCisgICAgICovCisgICAgcHJvdGVjdGVkIFhtbFB1bGxQYXJzZXIgZ2V0UmVzb3VyY2VYbWxQdWxsUGFyc2VyKFVyaSByZXNvdXJjZVVyaSkgeworICAgICAgICBPcGVuUmVzb3VyY2VJZFJlc3VsdCByZXNvdXJjZUlkOworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmVzb3VyY2VJZCA9IGdldENvbnRleHQoKS5nZXRDb250ZW50UmVzb2x2ZXIoKS5nZXRSZXNvdXJjZUlkKHJlc291cmNlVXJpKTsKKyAgICAgICAgICAgIHJldHVybiByZXNvdXJjZUlkLnIuZ2V0WG1sKHJlc291cmNlSWQuaWQpOworICAgICAgICB9IGNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgTG9nLncoTE9HX1RBRywgIlhNTCByZXNvdXJjZSBub3QgZm91bmQ6ICIgKyByZXNvdXJjZVVyaS50b1N0cmluZygpLCBlKTsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyAidm5kLmFuZHJvaWQuY3Vyc29yLmRpci94bWxkb2MiLgorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0VHlwZShVcmkgdXJpKSB7CisgICAgICAgIHJldHVybiAidm5kLmFuZHJvaWQuY3Vyc29yLmRpci94bWxkb2MiOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoaXMgQ29udGVudFByb3ZpZGVyIGlzIHJlYWQtb25seS4gVGhpcyBtZXRob2QgdGhyb3dzIGFuIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uLgorICAgICAqKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgVXJpIGluc2VydChVcmkgdXJpLCBDb250ZW50VmFsdWVzIHZhbHVlcykgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGlzIENvbnRlbnRQcm92aWRlciBpcyByZWFkLW9ubHkuIFRoaXMgbWV0aG9kIHRocm93cyBhbiBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbi4KKyAgICAgKiovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGludCBkZWxldGUoVXJpIHVyaSwgU3RyaW5nIHNlbGVjdGlvbiwgU3RyaW5nW10gc2VsZWN0aW9uQXJncykgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGlzIENvbnRlbnRQcm92aWRlciBpcyByZWFkLW9ubHkuIFRoaXMgbWV0aG9kIHRocm93cyBhbiBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbi4KKyAgICAgKiovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGludCB1cGRhdGUoVXJpIHVyaSwgQ29udGVudFZhbHVlcyB2YWx1ZXMsIFN0cmluZyBzZWxlY3Rpb24sIFN0cmluZ1tdIHNlbGVjdGlvbkFyZ3MpIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgWE1MQ3Vyc29yIGV4dGVuZHMgTWF0cml4Q3Vyc29yIHsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBQYXR0ZXJuIG1TZWxlY3Rpb25QYXR0ZXJuOworICAgICAgICBwcml2YXRlIFBhdHRlcm5bXSBtUHJvamVjdGlvblBhdHRlcm5zOworICAgICAgICBwcml2YXRlIFN0cmluZ1tdIG1BdHRyaWJ1dGVOYW1lczsKKyAgICAgICAgcHJpdmF0ZSBTdHJpbmdbXSBtQ3VycmVudFZhbHVlczsKKyAgICAgICAgcHJpdmF0ZSBCaXRTZXRbXSBtQWN0aXZlVGV4dERlcHRoTWFzazsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBpbnQgbU51bWJlck9mUHJvamVjdGlvbnM7CisKKyAgICAgICAgcHVibGljIFhNTEN1cnNvcihTdHJpbmcgc2VsZWN0aW9uLCBTdHJpbmdbXSBwcm9qZWN0aW9ucykgeworICAgICAgICAgICAgc3VwZXIocHJvamVjdGlvbnMpOworICAgICAgICAgICAgLy8gVGhlIGZpcnN0IGNvbHVtbiBpbiBwcm9qZWN0aW9ucyBpcyB1c2VkIGZvciB0aGUgX0lECisgICAgICAgICAgICBtTnVtYmVyT2ZQcm9qZWN0aW9ucyA9IHByb2plY3Rpb25zLmxlbmd0aCAtIDE7CisgICAgICAgICAgICBtU2VsZWN0aW9uUGF0dGVybiA9IGNyZWF0ZVBhdHRlcm4oc2VsZWN0aW9uKTsKKyAgICAgICAgICAgIGNyZWF0ZVByb2plY3Rpb25QYXR0ZXJuKHByb2plY3Rpb25zKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgUGF0dGVybiBjcmVhdGVQYXR0ZXJuKFN0cmluZyBpbnB1dCkgeworICAgICAgICAgICAgU3RyaW5nIHBhdHRlcm4gPSBpbnB1dC5yZXBsYWNlQWxsKCIvLyIsICIvKC4qL3wpIikucmVwbGFjZUFsbCgiXi8iLCAiXi8iKSArICIkIjsKKyAgICAgICAgICAgIHJldHVybiBQYXR0ZXJuLmNvbXBpbGUocGF0dGVybik7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHZvaWQgY3JlYXRlUHJvamVjdGlvblBhdHRlcm4oU3RyaW5nW10gcHJvamVjdGlvbnMpIHsKKyAgICAgICAgICAgIG1Qcm9qZWN0aW9uUGF0dGVybnMgPSBuZXcgUGF0dGVyblttTnVtYmVyT2ZQcm9qZWN0aW9uc107CisgICAgICAgICAgICBtQXR0cmlidXRlTmFtZXMgPSBuZXcgU3RyaW5nW21OdW1iZXJPZlByb2plY3Rpb25zXTsKKyAgICAgICAgICAgIG1BY3RpdmVUZXh0RGVwdGhNYXNrID0gbmV3IEJpdFNldFttTnVtYmVyT2ZQcm9qZWN0aW9uc107CisgICAgICAgICAgICAvLyBBZGQgYSBjb2x1bW4gdG8gc3RvcmUgX0lECisgICAgICAgICAgICBtQ3VycmVudFZhbHVlcyA9IG5ldyBTdHJpbmdbbU51bWJlck9mUHJvamVjdGlvbnMgKyAxXTsKKworICAgICAgICAgICAgZm9yIChpbnQgaT0wOyBpPG1OdW1iZXJPZlByb2plY3Rpb25zOyBpKyspIHsKKyAgICAgICAgICAgICAgICBtQWN0aXZlVGV4dERlcHRoTWFza1tpXSA9IG5ldyBCaXRTZXQoKTsKKyAgICAgICAgICAgICAgICBTdHJpbmcgcHJvamVjdGlvbiA9IHByb2plY3Rpb25zW2kgKyAxXTsgLy8gKzEgdG8gc2tpcCB0aGUgX0lEIGNvbHVtbgorICAgICAgICAgICAgICAgIGludCBhdEluZGV4ID0gcHJvamVjdGlvbi5sYXN0SW5kZXhPZignQCcsIHByb2plY3Rpb24ubGVuZ3RoKCkpOworICAgICAgICAgICAgICAgIGlmIChhdEluZGV4ID49IDApIHsKKyAgICAgICAgICAgICAgICAgICAgbUF0dHJpYnV0ZU5hbWVzW2ldID0gcHJvamVjdGlvbi5zdWJzdHJpbmcoYXRJbmRleCsxKTsKKyAgICAgICAgICAgICAgICAgICAgcHJvamVjdGlvbiA9IHByb2plY3Rpb24uc3Vic3RyaW5nKDAsIGF0SW5kZXgpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIG1BdHRyaWJ1dGVOYW1lc1tpXSA9IG51bGw7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLy8gQ29uZm9ybXMgdG8gWFBhdGggc3RhbmRhcmQ6IHJlZmVyZW5jZSB0byBsb2NhbCBjb250ZXh0IHN0YXJ0cyB3aXRoIGEgLgorICAgICAgICAgICAgICAgIGlmIChwcm9qZWN0aW9uLmNoYXJBdCgwKSA9PSAnLicpIHsKKyAgICAgICAgICAgICAgICAgICAgcHJvamVjdGlvbiA9IHByb2plY3Rpb24uc3Vic3RyaW5nKDEpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBtUHJvamVjdGlvblBhdHRlcm5zW2ldID0gY3JlYXRlUGF0dGVybihwcm9qZWN0aW9uKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHBhcnNlV2l0aChYbWxQdWxsUGFyc2VyIHBhcnNlcikgdGhyb3dzIElPRXhjZXB0aW9uLCBYbWxQdWxsUGFyc2VyRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIFN0cmluZ0J1aWxkZXIgcGF0aCA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisgICAgICAgICAgICBTdGFjazxJbnRlZ2VyPiBwYXRoTGVuZ3RoU3RhY2sgPSBuZXcgU3RhY2s8SW50ZWdlcj4oKTsKKworICAgICAgICAgICAgLy8gVGhlcmUgYXJlIHR3byBwYXJzaW5nIG1vZGU6IGluIHJvb3QgbW9kZSwgcm9vdFBhdGggaXMgdXBkYXRlZCBhbmQgbm9kZXMgbWF0Y2hpbmcKKyAgICAgICAgICAgIC8vIHNlbGVjdGlvblBhdHRlcm4gYXJlIHNlYXJjaGVkIGZvciBhbmQgY3VycmVudE5vZGVEZXB0aCBpcyBuZWdhdGl2ZS4KKyAgICAgICAgICAgIC8vIFdoZW4gYSBub2RlIG1hdGNoaW5nIHNlbGVjdGlvblBhdHRlcm4gaXMgZm91bmQsIGN1cnJlbnROb2RlRGVwdGggaXMgc2V0IHRvIDAgYW5kCisgICAgICAgICAgICAvLyB1cGRhdGVkIGFzIGNoaWxkcmVuIGFyZSBwYXJzZWQgYW5kIHByb2plY3Rpb25QYXR0ZXJucyBhcmUgc2VhcmNoZWQgaW4gbm9kZVBhdGguCisgICAgICAgICAgICBpbnQgY3VycmVudE5vZGVEZXB0aCA9IC0xOworCisgICAgICAgICAgICAvLyBJbmRleCB3aGVyZSBsb2NhbCBzZWxlY3RlZCBub2RlIHBhdGggc3RhcnRzIGZyb20gaW4gcGF0aAorICAgICAgICAgICAgaW50IGN1cnJlbnROb2RlUGF0aFN0YXJ0SW5kZXggPSAwOworCisgICAgICAgICAgICBpbnQgZXZlbnRUeXBlID0gcGFyc2VyLmdldEV2ZW50VHlwZSgpOworICAgICAgICAgICAgd2hpbGUgKGV2ZW50VHlwZSAhPSBYbWxQdWxsUGFyc2VyLkVORF9ET0NVTUVOVCkgeworCisgICAgICAgICAgICAgICAgaWYgKGV2ZW50VHlwZSA9PSBYbWxQdWxsUGFyc2VyLlNUQVJUX1RBRykgeworICAgICAgICAgICAgICAgICAgICAvLyBVcGRhdGUgcGF0aAorICAgICAgICAgICAgICAgICAgICBwYXRoTGVuZ3RoU3RhY2sucHVzaChwYXRoLmxlbmd0aCgpKTsKKyAgICAgICAgICAgICAgICAgICAgcGF0aC5hcHBlbmQoJy8nKTsKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHByZWZpeCA9IG51bGw7CisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBnZXRQcmVmaXggaXMgbm90IHN1cHBvcnRlZCBieSBsb2NhbCBYbWwgcmVzb3VyY2UgcGFyc2VyCisgICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBwYXJzZXIuZ2V0UHJlZml4KCk7CisgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAocHJlZml4ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBhdGguYXBwZW5kKHByZWZpeCk7CisgICAgICAgICAgICAgICAgICAgICAgICBwYXRoLmFwcGVuZCgnOicpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHBhdGguYXBwZW5kKHBhcnNlci5nZXROYW1lKCkpOworCisgICAgICAgICAgICAgICAgICAgIGlmIChjdXJyZW50Tm9kZURlcHRoID49IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnROb2RlRGVwdGgrKzsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIEEgbm9kZSBtYXRjaGluZyBzZWxlY3Rpb24gaXMgZm91bmQ6IGluaXRpYWxpemUgY2hpbGQgcGFyc2luZyBtb2RlCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobVNlbGVjdGlvblBhdHRlcm4ubWF0Y2hlcihwYXRoLnRvU3RyaW5nKCkpLm1hdGNoZXMoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnROb2RlRGVwdGggPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnROb2RlUGF0aFN0YXJ0SW5kZXggPSBwYXRoLmxlbmd0aCgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1DdXJyZW50VmFsdWVzWzBdID0gSW50ZWdlci50b1N0cmluZyhnZXRDb3VudCgpKTsgLy8gX0lECisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtTnVtYmVyT2ZQcm9qZWN0aW9uczsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFJlc2V0IHZhbHVlcyB0byBkZWZhdWx0IChlbXB0eSBzdHJpbmcpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1DdXJyZW50VmFsdWVzW2kgKyAxXSA9ICIiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQWN0aXZlVGV4dERlcHRoTWFza1tpXS5jbGVhcigpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIC8vIFRoaXMgdGVzdCBoYXMgdG8gYmUgc2VwYXJhdGVkIGZyb20gdGhlIHByZXZpb3VzIG9uZSBhcyBjdXJyZW50Tm9kZURlcHRoIGNhbgorICAgICAgICAgICAgICAgICAgICAvLyBiZSBtb2RpZmllZCBhYm92ZSAod2hlbiBhIG5vZGUgbWF0Y2hpbmcgc2VsZWN0aW9uIGlzIGZvdW5kKS4KKyAgICAgICAgICAgICAgICAgICAgaWYgKGN1cnJlbnROb2RlRGVwdGggPj0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIGxvY2FsTm9kZVBhdGggPSBwYXRoLnN1YnN0cmluZyhjdXJyZW50Tm9kZVBhdGhTdGFydEluZGV4KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbU51bWJlck9mUHJvamVjdGlvbnM7IGkrKykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtUHJvamVjdGlvblBhdHRlcm5zW2ldLm1hdGNoZXIobG9jYWxOb2RlUGF0aCkubWF0Y2hlcygpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBhdHRyaWJ1dGUgPSBtQXR0cmlidXRlTmFtZXNbaV07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhdHRyaWJ1dGUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUN1cnJlbnRWYWx1ZXNbaSArIDFdID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJzZXIuZ2V0QXR0cmlidXRlVmFsdWUobnVsbCwgYXR0cmlidXRlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1BY3RpdmVUZXh0RGVwdGhNYXNrW2ldLnNldChjdXJyZW50Tm9kZURlcHRoLCB0cnVlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChldmVudFR5cGUgPT0gWG1sUHVsbFBhcnNlci5FTkRfVEFHKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIFBvcCBsYXN0IG5vZGUgZnJvbSBwYXRoCisgICAgICAgICAgICAgICAgICAgIGZpbmFsIGludCBsZW5ndGggPSBwYXRoTGVuZ3RoU3RhY2sucG9wKCk7CisgICAgICAgICAgICAgICAgICAgIHBhdGguc2V0TGVuZ3RoKGxlbmd0aCk7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKGN1cnJlbnROb2RlRGVwdGggPj0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGN1cnJlbnROb2RlRGVwdGggPT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIExlYXZpbmcgYSBzZWxlY3Rpb24gbWF0Y2hpbmcgbm9kZTogYWRkIGEgbmV3IHJvdyB3aXRoIHJlc3VsdHMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRSb3cobUN1cnJlbnRWYWx1ZXMpOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1OdW1iZXJPZlByb2plY3Rpb25zOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUFjdGl2ZVRleHREZXB0aE1hc2tbaV0uc2V0KGN1cnJlbnROb2RlRGVwdGgsIGZhbHNlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50Tm9kZURlcHRoLS07CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoKGV2ZW50VHlwZSA9PSBYbWxQdWxsUGFyc2VyLlRFWFQpICYmICghcGFyc2VyLmlzV2hpdGVzcGFjZSgpKSkgeworICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1OdW1iZXJPZlByb2plY3Rpb25zOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoY3VycmVudE5vZGVEZXB0aCA+PSAwKSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtQWN0aXZlVGV4dERlcHRoTWFza1tpXS5nZXQoY3VycmVudE5vZGVEZXB0aCkpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUN1cnJlbnRWYWx1ZXNbaSArIDFdICs9IHBhcnNlci5nZXRUZXh0KCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBldmVudFR5cGUgPSBwYXJzZXIubmV4dCgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9wbS9BY3Rpdml0eUluZm8uamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvcG0vQWN0aXZpdHlJbmZvLmphdmEKaW5kZXggMzk1YzM5Mi4uZTIxY2I5NyAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9wbS9BY3Rpdml0eUluZm8uamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L3BtL0FjdGl2aXR5SW5mby5qYXZhCkBAIC0xNDksNiArMTQ5LDI3IEBACiAgICAgICoge0BsaW5rIGFuZHJvaWQuUi5hdHRyI2ZpbmlzaE9uQ2xvc2VTeXN0ZW1EaWFsb2dzfSBhdHRyaWJ1dGUuCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRkxBR19GSU5JU0hfT05fQ0xPU0VfU1lTVEVNX0RJQUxPR1MgPSAweDAxMDA7CisgICAgLyoqIAorICAgICAqIEJpdCBpbiB7QGxpbmsgI2ZsYWdzfSBjb3JyZXNwb25kaW5nIHRvIGFuIGltbWVyc2l2ZSBhY3Rpdml0eQorICAgICAqIHRoYXQgd2lzaGVzIG5vdCB0byBiZSBpbnRlcnJ1cHRlZCBieSBub3RpZmljYXRpb25zLgorICAgICAqIEFwcGxpY2F0aW9ucyB0aGF0IGhpZGUgdGhlIHN5c3RlbSBub3RpZmljYXRpb24gYmFyIHdpdGgKKyAgICAgKiB7QGxpbmsgYW5kcm9pZC52aWV3LldpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zI0ZMQUdfRlVMTFNDUkVFTn0KKyAgICAgKiBtYXkgc3RpbGwgYmUgaW50ZXJydXB0ZWQgYnkgaGlnaC1wcmlvcml0eSBub3RpZmljYXRpb25zOyBmb3IgZXhhbXBsZSwgYW4KKyAgICAgKiBpbmNvbWluZyBwaG9uZSBjYWxsIG1heSB1c2UKKyAgICAgKiB7QGxpbmsgYW5kcm9pZC5hcHAuTm90aWZpY2F0aW9uI2Z1bGxTY3JlZW5JbnRlbnQgZnVsbFNjcmVlbkludGVudH0KKyAgICAgKiB0byBwcmVzZW50IGEgZnVsbC1zY3JlZW4gaW4tY2FsbCBhY3Rpdml0eSB0byB0aGUgdXNlciwgcGF1c2luZyB0aGUKKyAgICAgKiBjdXJyZW50IGFjdGl2aXR5IGFzIGEgc2lkZS1lZmZlY3QuIEFuIGFjdGl2aXR5IHdpdGgKKyAgICAgKiB7QGxpbmsgI0ZMQUdfSU1NRVJTSVZFfSBzZXQsIGhvd2V2ZXIsIHdpbGwgbm90IGJlIGludGVycnVwdGVkOyB0aGUKKyAgICAgKiBub3RpZmljYXRpb24gbWF5IGJlIHNob3duIGluIHNvbWUgb3RoZXIgd2F5IChzdWNoIGFzIGEgc21hbGwgZmxvYXRpbmcKKyAgICAgKiAidG9hc3QiIHdpbmRvdykuCisgICAgICoge0BzZWUgYW5kcm9pZC5hcHAuTm90aWZpY2F0aW9uI0ZMQUdfSElHSF9QUklPUklUWX0KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGTEFHX0lNTUVSU0lWRSA9IDB4MDIwMDsKKyAgICAvKioKKyAgICAgKiBWYWx1ZSBmb3Ige0BsaW5rICNmbGFnc306IHRydWUgd2hlbiB0aGUgYXBwbGljYXRpb24ncyByZW5kZXJpbmcgc2hvdWxkCisgICAgICogYmUgaGFyZHdhcmUgYWNjZWxlcmF0ZWQuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRkxBR19IQVJEV0FSRV9BQ0NFTEVSQVRFRCA9IDB4MDQwMDsKICAgICAvKioKICAgICAgKiBPcHRpb25zIHRoYXQgaGF2ZSBiZWVuIHNldCBpbiB0aGUgYWN0aXZpdHkgZGVjbGFyYXRpb24gaW4gdGhlCiAgICAgICogbWFuaWZlc3QuCkBAIC0xNTksNiArMTgwLDcgQEAKICAgICAgKiB7QGxpbmsgI0ZMQUdfU1RBVEVfTk9UX05FRURFRH0sIHtAbGluayAjRkxBR19FWENMVURFX0ZST01fUkVDRU5UU30sCiAgICAgICoge0BsaW5rICNGTEFHX0FMTE9XX1RBU0tfUkVQQVJFTlRJTkd9LCB7QGxpbmsgI0ZMQUdfTk9fSElTVE9SWX0sCiAgICAgICoge0BsaW5rICNGTEFHX0ZJTklTSF9PTl9DTE9TRV9TWVNURU1fRElBTE9HU30sCisgICAgICoge0BsaW5rICNGTEFHX0lNTUVSU0lWRX0sIHtAbGluayAjRkxBR19IQVJEV0FSRV9BQ0NFTEVSQVRFRH0KICAgICAgKi8KICAgICBwdWJsaWMgaW50IGZsYWdzOwogCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L3BtL0FwcGxpY2F0aW9uSW5mby5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9wbS9BcHBsaWNhdGlvbkluZm8uamF2YQppbmRleCAwZGI5NTRkLi4zOGQ4OTdlIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L3BtL0FwcGxpY2F0aW9uSW5mby5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvcG0vQXBwbGljYXRpb25JbmZvLmphdmEKQEAgLTI2OSw3ICsyNjksNiBAQAogICAgICAqIGluY3JlYXNlZCBpbiBzaXplIGZvciBleHRyYSBsYXJnZSBzY3JlZW5zLiAgQ29ycmVzcG9uZHMgdG8KICAgICAgKiB7QGxpbmsgYW5kcm9pZC5SLnN0eWxlYWJsZSNBbmRyb2lkTWFuaWZlc3RTdXBwb3J0c1NjcmVlbnNfeGxhcmdlU2NyZWVucwogICAgICAqIGFuZHJvaWQ6eGxhcmdlU2NyZWVuc30uCi0gICAgICogQGhpZGUKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGTEFHX1NVUFBPUlRTX1hMQVJHRV9TQ1JFRU5TID0gMTw8MTk7CiAgICAgCkBAIC0zMTIsNyArMzExLDcgQEAKICAgICAgKiB7QGxpbmsgI0ZMQUdfQUxMT1dfQ0xFQVJfVVNFUl9EQVRBfSwge0BsaW5rICNGTEFHX1VQREFURURfU1lTVEVNX0FQUH0sCiAgICAgICoge0BsaW5rICNGTEFHX1RFU1RfT05MWX0sIHtAbGluayAjRkxBR19TVVBQT1JUU19TTUFMTF9TQ1JFRU5TfSwKICAgICAgKiB7QGxpbmsgI0ZMQUdfU1VQUE9SVFNfTk9STUFMX1NDUkVFTlN9LAotICAgICAqIHtAbGluayAjRkxBR19TVVBQT1JUU19MQVJHRV9TQ1JFRU5TfSwKKyAgICAgKiB7QGxpbmsgI0ZMQUdfU1VQUE9SVFNfTEFSR0VfU0NSRUVOU30sIHtAbGluayAjRkxBR19TVVBQT1JUU19YTEFSR0VfU0NSRUVOU30sCiAgICAgICoge0BsaW5rICNGTEFHX1JFU0laRUFCTEVfRk9SX1NDUkVFTlN9LAogICAgICAqIHtAbGluayAjRkxBR19TVVBQT1JUU19TQ1JFRU5fREVOU0lUSUVTfSwge0BsaW5rICNGTEFHX1ZNX1NBRkVfTU9ERX0KICAgICAgKi8KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvcG0vUGFja2FnZU1hbmFnZXIuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvcG0vUGFja2FnZU1hbmFnZXIuamF2YQppbmRleCA0YmQ5YmQ5Li4xYTNiY2M0IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L3BtL1BhY2thZ2VNYW5hZ2VyLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9wbS9QYWNrYWdlTWFuYWdlci5qYXZhCkBAIC03MTMsNiArNzEzLDIxIEBACiAKICAgICAvKioKICAgICAgKiBGZWF0dXJlIGZvciB7QGxpbmsgI2dldFN5c3RlbUF2YWlsYWJsZUZlYXR1cmVzfSBhbmQKKyAgICAgKiB7QGxpbmsgI2hhc1N5c3RlbUZlYXR1cmV9OiBUaGUgZGV2aWNlIGluY2x1ZGVzIGFuIGFjY2VsZXJvbWV0ZXIuCisgICAgICovCisgICAgQFNka0NvbnN0YW50KFNka0NvbnN0YW50VHlwZS5GRUFUVVJFKQorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZFQVRVUkVfU0VOU09SX0FDQ0VMRVJPTUVURVIgPSAiYW5kcm9pZC5oYXJkd2FyZS5zZW5zb3IuYWNjZWxlcm9tZXRlciI7CisKKyAgICAvKioKKyAgICAgKiBGZWF0dXJlIGZvciB7QGxpbmsgI2dldFN5c3RlbUF2YWlsYWJsZUZlYXR1cmVzfSBhbmQKKyAgICAgKiB7QGxpbmsgI2hhc1N5c3RlbUZlYXR1cmV9OiBUaGUgZGV2aWNlIGluY2x1ZGVzIGEgYmFyb21ldGVyIChhaXIKKyAgICAgKiBwcmVzc3VyZSBzZW5zb3IuKQorICAgICAqLworICAgIEBTZGtDb25zdGFudChTZGtDb25zdGFudFR5cGUuRkVBVFVSRSkKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGRUFUVVJFX1NFTlNPUl9CQVJPTUVURVIgPSAiYW5kcm9pZC5oYXJkd2FyZS5zZW5zb3IuYmFyb21ldGVyIjsKKworICAgIC8qKgorICAgICAqIEZlYXR1cmUgZm9yIHtAbGluayAjZ2V0U3lzdGVtQXZhaWxhYmxlRmVhdHVyZXN9IGFuZAogICAgICAqIHtAbGluayAjaGFzU3lzdGVtRmVhdHVyZX06IFRoZSBkZXZpY2UgaW5jbHVkZXMgYSBtYWduZXRvbWV0ZXIgKGNvbXBhc3MpLgogICAgICAqLwogICAgIEBTZGtDb25zdGFudChTZGtDb25zdGFudFR5cGUuRkVBVFVSRSkKQEAgLTcyMCwxMCArNzM1LDEwIEBACiAKICAgICAvKioKICAgICAgKiBGZWF0dXJlIGZvciB7QGxpbmsgI2dldFN5c3RlbUF2YWlsYWJsZUZlYXR1cmVzfSBhbmQKLSAgICAgKiB7QGxpbmsgI2hhc1N5c3RlbUZlYXR1cmV9OiBUaGUgZGV2aWNlIGluY2x1ZGVzIGFuIGFjY2VsZXJvbWV0ZXIuCisgICAgICoge0BsaW5rICNoYXNTeXN0ZW1GZWF0dXJlfTogVGhlIGRldmljZSBpbmNsdWRlcyBhIGd5cm9zY29wZS4KICAgICAgKi8KICAgICBAU2RrQ29uc3RhbnQoU2RrQ29uc3RhbnRUeXBlLkZFQVRVUkUpCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkVBVFVSRV9TRU5TT1JfQUNDRUxFUk9NRVRFUiA9ICJhbmRyb2lkLmhhcmR3YXJlLnNlbnNvci5hY2NlbGVyb21ldGVyIjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGRUFUVVJFX1NFTlNPUl9HWVJPU0NPUEUgPSAiYW5kcm9pZC5oYXJkd2FyZS5zZW5zb3IuZ3lyb3Njb3BlIjsKIAogICAgIC8qKgogICAgICAqIEZlYXR1cmUgZm9yIHtAbGluayAjZ2V0U3lzdGVtQXZhaWxhYmxlRmVhdHVyZXN9IGFuZApkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9wbS9QYWNrYWdlUGFyc2VyLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L3BtL1BhY2thZ2VQYXJzZXIuamF2YQppbmRleCBlMjBjYjVlLi45MmE4YTk5IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L3BtL1BhY2thZ2VQYXJzZXIuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L3BtL1BhY2thZ2VQYXJzZXIuamF2YQpAQCAtMTYsOSArMTYsNiBAQAogCiBwYWNrYWdlIGFuZHJvaWQuY29udGVudC5wbTsKIAotaW1wb3J0IG9yZy54bWxwdWxsLnYxLlhtbFB1bGxQYXJzZXI7Ci1pbXBvcnQgb3JnLnhtbHB1bGwudjEuWG1sUHVsbFBhcnNlckV4Y2VwdGlvbjsKLQogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db21wb25lbnROYW1lOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudEZpbHRlcjsKQEAgLTMwLDE0ICsyNywxNCBAQAogaW1wb3J0IGFuZHJvaWQub3MuQnVpbGQ7CiBpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CiBpbXBvcnQgYW5kcm9pZC5vcy5QYXR0ZXJuTWF0Y2hlcjsKLWltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLlNldHRpbmdzOwogaW1wb3J0IGFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQ7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkNvbmZpZzsKIGltcG9ydCBhbmRyb2lkLnV0aWwuRGlzcGxheU1ldHJpY3M7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKIGltcG9ydCBhbmRyb2lkLnV0aWwuVHlwZWRWYWx1ZTsKLQogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnV0aWwuWG1sVXRpbHM7CitpbXBvcnQgb3JnLnhtbHB1bGwudjEuWG1sUHVsbFBhcnNlcjsKK2ltcG9ydCBvcmcueG1scHVsbC52MS5YbWxQdWxsUGFyc2VyRXhjZXB0aW9uOwogCiBpbXBvcnQgamF2YS5pby5GaWxlOwogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CkBAIC00OCw3ICs0NSw2IEBACiBpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247CiBpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwogaW1wb3J0IGphdmEudXRpbC5qYXIuSmFyRW50cnk7CiBpbXBvcnQgamF2YS51dGlsLmphci5KYXJGaWxlOwogCkBAIC0xNDk4LDEyICsxNDk0LDE4IEBACiAgICAgICAgICAgICBhaS5ub25Mb2NhbGl6ZWRMYWJlbCA9IHYuY29lcmNlVG9TdHJpbmcoKTsKICAgICAgICAgfQogCisgICAgICAgIGludCBkZWZhdWx0VGhlbWUgPSAwOworICAgICAgICBpZiAob3duZXIuYXBwbGljYXRpb25JbmZvLnRhcmdldFNka1ZlcnNpb24gPj0gYW5kcm9pZC5vcy5CdWlsZC5WRVJTSU9OX0NPREVTLkhPTkVZQ09NQikgeworICAgICAgICAgICAgLy8gQXMgb2YgaG9uZXljb21iLCB0aGUgZGVmYXVsdCBhcHBsaWNhdGlvbiB0aGVtZSBpcyBob2xvZ3JhcGhpYy4KKyAgICAgICAgICAgIGRlZmF1bHRUaGVtZSA9IGFuZHJvaWQuUi5zdHlsZS5UaGVtZV9Ib2xvOworICAgICAgICB9CisKICAgICAgICAgYWkuaWNvbiA9IHNhLmdldFJlc291cmNlSWQoCiAgICAgICAgICAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZWFibGUuQW5kcm9pZE1hbmlmZXN0QXBwbGljYXRpb25faWNvbiwgMCk7CiAgICAgICAgIGFpLmxvZ28gPSBzYS5nZXRSZXNvdXJjZUlkKAogICAgICAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLkFuZHJvaWRNYW5pZmVzdEFwcGxpY2F0aW9uX2xvZ28sIDApOwogICAgICAgICBhaS50aGVtZSA9IHNhLmdldFJlc291cmNlSWQoCi0gICAgICAgICAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZWFibGUuQW5kcm9pZE1hbmlmZXN0QXBwbGljYXRpb25fdGhlbWUsIDApOworICAgICAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLkFuZHJvaWRNYW5pZmVzdEFwcGxpY2F0aW9uX3RoZW1lLCBkZWZhdWx0VGhlbWUpOwogICAgICAgICBhaS5kZXNjcmlwdGlvblJlcyA9IHNhLmdldFJlc291cmNlSWQoCiAgICAgICAgICAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZWFibGUuQW5kcm9pZE1hbmlmZXN0QXBwbGljYXRpb25fZGVzY3JpcHRpb24sIDApOwogCkBAIC0xNTM1LDYgKzE1MzcsMTAgQEAKICAgICAgICAgICAgIGFpLmZsYWdzIHw9IEFwcGxpY2F0aW9uSW5mby5GTEFHX1ZNX1NBRkVfTU9ERTsKICAgICAgICAgfQogCisgICAgICAgIGJvb2xlYW4gaGFyZHdhcmVBY2NlbGVyYXRlZCA9IHNhLmdldEJvb2xlYW4oCisgICAgICAgICAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZWFibGUuQW5kcm9pZE1hbmlmZXN0QXBwbGljYXRpb25faGFyZHdhcmVBY2NlbGVyYXRlZCwKKyAgICAgICAgICAgICAgICBmYWxzZSk7CisKICAgICAgICAgaWYgKHNhLmdldEJvb2xlYW4oCiAgICAgICAgICAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZWFibGUuQW5kcm9pZE1hbmlmZXN0QXBwbGljYXRpb25faGFzQ29kZSwKICAgICAgICAgICAgICAgICB0cnVlKSkgewpAQCAtMTYzNCw3ICsxNjQwLDggQEAKIAogICAgICAgICAgICAgU3RyaW5nIHRhZ05hbWUgPSBwYXJzZXIuZ2V0TmFtZSgpOwogICAgICAgICAgICAgaWYgKHRhZ05hbWUuZXF1YWxzKCJhY3Rpdml0eSIpKSB7Ci0gICAgICAgICAgICAgICAgQWN0aXZpdHkgYSA9IHBhcnNlQWN0aXZpdHkob3duZXIsIHJlcywgcGFyc2VyLCBhdHRycywgZmxhZ3MsIG91dEVycm9yLCBmYWxzZSk7CisgICAgICAgICAgICAgICAgQWN0aXZpdHkgYSA9IHBhcnNlQWN0aXZpdHkob3duZXIsIHJlcywgcGFyc2VyLCBhdHRycywgZmxhZ3MsIG91dEVycm9yLCBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGhhcmR3YXJlQWNjZWxlcmF0ZWQpOwogICAgICAgICAgICAgICAgIGlmIChhID09IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICAgbVBhcnNlRXJyb3IgPSBQYWNrYWdlTWFuYWdlci5JTlNUQUxMX1BBUlNFX0ZBSUxFRF9NQU5JRkVTVF9NQUxGT1JNRUQ7CiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKQEAgLTE2NDMsNyArMTY1MCw3IEBACiAgICAgICAgICAgICAgICAgb3duZXIuYWN0aXZpdGllcy5hZGQoYSk7CiAKICAgICAgICAgICAgIH0gZWxzZSBpZiAodGFnTmFtZS5lcXVhbHMoInJlY2VpdmVyIikpIHsKLSAgICAgICAgICAgICAgICBBY3Rpdml0eSBhID0gcGFyc2VBY3Rpdml0eShvd25lciwgcmVzLCBwYXJzZXIsIGF0dHJzLCBmbGFncywgb3V0RXJyb3IsIHRydWUpOworICAgICAgICAgICAgICAgIEFjdGl2aXR5IGEgPSBwYXJzZUFjdGl2aXR5KG93bmVyLCByZXMsIHBhcnNlciwgYXR0cnMsIGZsYWdzLCBvdXRFcnJvciwgdHJ1ZSwgZmFsc2UpOwogICAgICAgICAgICAgICAgIGlmIChhID09IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICAgbVBhcnNlRXJyb3IgPSBQYWNrYWdlTWFuYWdlci5JTlNUQUxMX1BBUlNFX0ZBSUxFRF9NQU5JRkVTVF9NQUxGT1JNRUQ7CiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKQEAgLTE3NzgsNyArMTc4NSw4IEBACiAKICAgICBwcml2YXRlIEFjdGl2aXR5IHBhcnNlQWN0aXZpdHkoUGFja2FnZSBvd25lciwgUmVzb3VyY2VzIHJlcywKICAgICAgICAgICAgIFhtbFB1bGxQYXJzZXIgcGFyc2VyLCBBdHRyaWJ1dGVTZXQgYXR0cnMsIGludCBmbGFncywgU3RyaW5nW10gb3V0RXJyb3IsCi0gICAgICAgICAgICBib29sZWFuIHJlY2VpdmVyKSB0aHJvd3MgWG1sUHVsbFBhcnNlckV4Y2VwdGlvbiwgSU9FeGNlcHRpb24geworICAgICAgICAgICAgYm9vbGVhbiByZWNlaXZlciwgYm9vbGVhbiBoYXJkd2FyZUFjY2VsZXJhdGVkKQorICAgICAgICAgICAgdGhyb3dzIFhtbFB1bGxQYXJzZXJFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKICAgICAgICAgVHlwZWRBcnJheSBzYSA9IHJlcy5vYnRhaW5BdHRyaWJ1dGVzKGF0dHJzLAogICAgICAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLkFuZHJvaWRNYW5pZmVzdEFjdGl2aXR5KTsKIApAQCAtMTg4Myw3ICsxODkxLDE5IEBACiAgICAgICAgICAgICBhLmluZm8uZmxhZ3MgfD0gQWN0aXZpdHlJbmZvLkZMQUdfRklOSVNIX09OX0NMT1NFX1NZU1RFTV9ESUFMT0dTOwogICAgICAgICB9CiAKKyAgICAgICAgaWYgKHNhLmdldEJvb2xlYW4oCisgICAgICAgICAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZWFibGUuQW5kcm9pZE1hbmlmZXN0QWN0aXZpdHlfaW1tZXJzaXZlLAorICAgICAgICAgICAgICAgIGZhbHNlKSkgeworICAgICAgICAgICAgYS5pbmZvLmZsYWdzIHw9IEFjdGl2aXR5SW5mby5GTEFHX0lNTUVSU0lWRTsKKyAgICAgICAgfQorICAgICAgICAKICAgICAgICAgaWYgKCFyZWNlaXZlcikgeworICAgICAgICAgICAgaWYgKHNhLmdldEJvb2xlYW4oCisgICAgICAgICAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLkFuZHJvaWRNYW5pZmVzdEFjdGl2aXR5X2hhcmR3YXJlQWNjZWxlcmF0ZWQsCisgICAgICAgICAgICAgICAgICAgIGhhcmR3YXJlQWNjZWxlcmF0ZWQpKSB7CisgICAgICAgICAgICAgICAgYS5pbmZvLmZsYWdzIHw9IEFjdGl2aXR5SW5mby5GTEFHX0hBUkRXQVJFX0FDQ0VMRVJBVEVEOworICAgICAgICAgICAgfQorCiAgICAgICAgICAgICBhLmluZm8ubGF1bmNoTW9kZSA9IHNhLmdldEludCgKICAgICAgICAgICAgICAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZWFibGUuQW5kcm9pZE1hbmlmZXN0QWN0aXZpdHlfbGF1bmNoTW9kZSwKICAgICAgICAgICAgICAgICAgICAgQWN0aXZpdHlJbmZvLkxBVU5DSF9NVUxUSVBMRSk7CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L3Jlcy9Bc3NldEZpbGVEZXNjcmlwdG9yLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L3Jlcy9Bc3NldEZpbGVEZXNjcmlwdG9yLmphdmEKaW5kZXggYTM3ZTRlOC4uMDFhZTFkYSAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9yZXMvQXNzZXRGaWxlRGVzY3JpcHRvci5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvcmVzL0Fzc2V0RmlsZURlc2NyaXB0b3IuamF2YQpAQCAtMjUsOCArMjUsNiBAQAogaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOwogaW1wb3J0IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5uaW8uY2hhbm5lbHMuRmlsZUNoYW5uZWw7CiAKIC8qKgogICogRmlsZSBkZXNjcmlwdG9yIG9mIGFuIGVudHJ5IGluIHRoZSBBc3NldE1hbmFnZXIuICBUaGlzIHByb3ZpZGVzIHlvdXIgb3duCkBAIC01MSw3ICs0OSw3IEBACiAgICAgICogQHBhcmFtIHN0YXJ0T2Zmc2V0IFRoZSBsb2NhdGlvbiB3aXRoaW4gdGhlIGZpbGUgdGhhdCB0aGUgYXNzZXQgc3RhcnRzLgogICAgICAqIFRoaXMgbXVzdCBiZSAwIGlmIGxlbmd0aCBpcyBVTktOT1dOX0xFTkdUSC4KICAgICAgKiBAcGFyYW0gbGVuZ3RoIFRoZSBudW1iZXIgb2YgYnl0ZXMgb2YgdGhlIGFzc2V0LCBvcgotICAgICAqIHtAbGluayAjVU5LTk9XTl9MRU5HVEggaWYgaXQgZXh0ZW5kcyB0byB0aGUgZW5kIG9mIHRoZSBmaWxlLgorICAgICAqIHtAbGluayAjVU5LTk9XTl9MRU5HVEh9IGlmIGl0IGV4dGVuZHMgdG8gdGhlIGVuZCBvZiB0aGUgZmlsZS4KICAgICAgKi8KICAgICBwdWJsaWMgQXNzZXRGaWxlRGVzY3JpcHRvcihQYXJjZWxGaWxlRGVzY3JpcHRvciBmZCwgbG9uZyBzdGFydE9mZnNldCwKICAgICAgICAgICAgIGxvbmcgbGVuZ3RoKSB7CkBAIC0xMjUsMTMgKzEyMyw2IEBACiAgICAgcHVibGljIHZvaWQgY2xvc2UoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICBtRmQuY2xvc2UoKTsKICAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogQ2hlY2tzIHdoZXRoZXIgdGhpcyBmaWxlIGRlc2NyaXB0b3IgaXMgZm9yIGEgbWVtb3J5IGZpbGUuCi0gICAgICovCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzTWVtb3J5RmlsZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiBNZW1vcnlGaWxlLmlzTWVtb3J5RmlsZShtRmQuZ2V0RmlsZURlc2NyaXB0b3IoKSk7Ci0gICAgfQogCiAgICAgLyoqCiAgICAgICogQ3JlYXRlIGFuZCByZXR1cm4gYSBuZXcgYXV0by1jbG9zZSBpbnB1dCBzdHJlYW0gZm9yIHRoaXMgYXNzZXQuICBUaGlzCkBAIC0xNDIsMTIgKzEzMyw2IEBACiAgICAgICogc2hvdWxkIG9ubHkgY2FsbCB0aGlzIG9uY2UgZm9yIGEgcGFydGljdWxhciBhc3NldC4KICAgICAgKi8KICAgICBwdWJsaWMgRmlsZUlucHV0U3RyZWFtIGNyZWF0ZUlucHV0U3RyZWFtKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKGlzTWVtb3J5RmlsZSgpKSB7Ci0gICAgICAgICAgICBpZiAobUxlbmd0aCA+IEludGVnZXIuTUFYX1ZBTFVFKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJGaWxlIGxlbmd0aCB0b28gbGFyZ2UgZm9yIGEgbWVtb3J5IGZpbGU6ICIgKyBtTGVuZ3RoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBuZXcgQXV0b0Nsb3NlTWVtb3J5RmlsZUlucHV0U3RyZWFtKG1GZCwgKGludCltTGVuZ3RoKTsKLSAgICAgICAgfQogICAgICAgICBpZiAobUxlbmd0aCA8IDApIHsKICAgICAgICAgICAgIHJldHVybiBuZXcgUGFyY2VsRmlsZURlc2NyaXB0b3IuQXV0b0Nsb3NlSW5wdXRTdHJlYW0obUZkKTsKICAgICAgICAgfQpAQCAtMjc2LDY2ICsyNjEsNiBAQAogICAgICAgICAgICAgc3VwZXIucmVzZXQoKTsKICAgICAgICAgfQogICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBBbiBpbnB1dCBzdHJlYW0gdGhhdCByZWFkcyBmcm9tIGEgTWVtb3J5RmlsZSBhbmQgY2xvc2VzIGl0IHdoZW4gdGhlIHN0cmVhbSBpcyBjbG9zZWQuCi0gICAgICogVGhpcyBleHRlbmRzIEZpbGVJbnB1dFN0cmVhbSBqdXN0IGJlY2F1c2Uge0BsaW5rICNjcmVhdGVJbnB1dFN0cmVhbX0gcmV0dXJucwotICAgICAqIGEgRmlsZUlucHV0U3RyZWFtLiBBbGwgdGhlIEZpbGVJbnB1dFN0cmVhbSBtZXRob2RzIGFyZQotICAgICAqIG92ZXJyaWRkZW4gdG8gdXNlIHRoZSBNZW1vcnlGaWxlIGluc3RlYWQuCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgQXV0b0Nsb3NlTWVtb3J5RmlsZUlucHV0U3RyZWFtIGV4dGVuZHMgRmlsZUlucHV0U3RyZWFtIHsKLSAgICAgICAgcHJpdmF0ZSBQYXJjZWxGaWxlRGVzY3JpcHRvciBtUGFyY2VsRmQ7Ci0gICAgICAgIHByaXZhdGUgTWVtb3J5RmlsZSBtRmlsZTsKLSAgICAgICAgcHJpdmF0ZSBJbnB1dFN0cmVhbSBtU3RyZWFtOwotCi0gICAgICAgIHB1YmxpYyBBdXRvQ2xvc2VNZW1vcnlGaWxlSW5wdXRTdHJlYW0oUGFyY2VsRmlsZURlc2NyaXB0b3IgZmQsIGludCBsZW5ndGgpCi0gICAgICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgICAgIHN1cGVyKGZkLmdldEZpbGVEZXNjcmlwdG9yKCkpOwotICAgICAgICAgICAgbVBhcmNlbEZkID0gZmQ7Ci0gICAgICAgICAgICBtRmlsZSA9IG5ldyBNZW1vcnlGaWxlKGZkLmdldEZpbGVEZXNjcmlwdG9yKCksIGxlbmd0aCwgInIiKTsKLSAgICAgICAgICAgIG1TdHJlYW0gPSBtRmlsZS5nZXRJbnB1dFN0cmVhbSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBpbnQgYXZhaWxhYmxlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgICAgIHJldHVybiBtU3RyZWFtLmF2YWlsYWJsZSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIGNsb3NlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgICAgIG1QYXJjZWxGZC5jbG9zZSgpOyAgLy8gbXVzdCBjbG9zZSBQYXJjZWxGaWxlRGVzY3JpcHRvciwgbm90IGp1c3QgdGhlIGZpbGUgZGVzY3JpcHRvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2luY2UgaXQgY291bGQgYmUgYSBzdWJjbGFzcyBvZiBQYXJjZWxGaWxlRGVzY3JpcHRvci4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRS5nLiBDb250ZW50UmVzb2x2ZXIuUGFyY2VsRmlsZURlc2NyaXB0b3JJbm5lci5jbG9zZSgpIHJlbGVhc2VzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGEgY29udGVudCBwcm92aWRlcgotICAgICAgICAgICAgbUZpbGUuY2xvc2UoKTsgICAgICAvLyB0byB1bm1hcCB0aGUgbWVtb3J5IGZpbGUgZnJvbSB0aGUgYWRkcmVzcyBzcGFjZS4KLSAgICAgICAgICAgIG1TdHJlYW0uY2xvc2UoKTsgICAgLy8gZG9lc24ndCBhY3R1YWxseSBkbyBhbnl0aGluZwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBGaWxlQ2hhbm5lbCBnZXRDaGFubmVsKCkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIGludCByZWFkKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgICAgIHJldHVybiBtU3RyZWFtLnJlYWQoKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgaW50IHJlYWQoYnl0ZVtdIGJ1ZmZlciwgaW50IG9mZnNldCwgaW50IGNvdW50KSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICAgICAgcmV0dXJuIG1TdHJlYW0ucmVhZChidWZmZXIsIG9mZnNldCwgY291bnQpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBpbnQgcmVhZChieXRlW10gYnVmZmVyKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICAgICAgcmV0dXJuIG1TdHJlYW0ucmVhZChidWZmZXIpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBsb25nIHNraXAobG9uZyBjb3VudCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgICAgIHJldHVybiBtU3RyZWFtLnNraXAoY291bnQpOwotICAgICAgICB9Ci0gICAgfQogCiAgICAgLyoqCiAgICAgICogQW4gT3V0cHV0U3RyZWFtIHlvdSBjYW4gY3JlYXRlIG9uIGEgUGFyY2VsRmlsZURlc2NyaXB0b3IsIHdoaWNoIHdpbGwKQEAgLTQyMiwxNSArMzQ3LDQgQEAKICAgICAgICAgfQogICAgIH07CiAKLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGFuIEFzc2V0RmlsZURlc2NyaXB0b3IgZnJvbSBhIG1lbW9yeSBmaWxlLgotICAgICAqCi0gICAgICogQGhpZGUKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIEFzc2V0RmlsZURlc2NyaXB0b3IgZnJvbU1lbW9yeUZpbGUoTWVtb3J5RmlsZSBtZW1vcnlGaWxlKQotICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgUGFyY2VsRmlsZURlc2NyaXB0b3IgZmQgPSBtZW1vcnlGaWxlLmdldFBhcmNlbEZpbGVEZXNjcmlwdG9yKCk7Ci0gICAgICAgIHJldHVybiBuZXcgQXNzZXRGaWxlRGVzY3JpcHRvcihmZCwgMCwgbWVtb3J5RmlsZS5sZW5ndGgoKSk7Ci0gICAgfQotCiB9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L3Jlcy9Db25maWd1cmF0aW9uLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L3Jlcy9Db25maWd1cmF0aW9uLmphdmEKaW5kZXggNWEzZGQ0MS4uMmYxMTBmMCAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9yZXMvQ29uZmlndXJhdGlvbi5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvcmVzL0NvbmZpZ3VyYXRpb24uamF2YQpAQCAtNjIsNyArNjIsNiBAQAogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNDUkVFTkxBWU9VVF9TSVpFX1NNQUxMID0gMHgwMTsKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTQ1JFRU5MQVlPVVRfU0laRV9OT1JNQUwgPSAweDAyOwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNDUkVFTkxBWU9VVF9TSVpFX0xBUkdFID0gMHgwMzsKLSAgICAvKiogQGhpZGUgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTQ1JFRU5MQVlPVVRfU0laRV9YTEFSR0UgPSAweDA0OwogICAgIAogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNDUkVFTkxBWU9VVF9MT05HX01BU0sgPSAweDMwOwpAQCAtODQsNyArODMsNyBAQAogICAgICAqIDxwPlRoZSB7QGxpbmsgI1NDUkVFTkxBWU9VVF9TSVpFX01BU0t9IGJpdHMgZGVmaW5lIHRoZSBvdmVyYWxsIHNpemUKICAgICAgKiBvZiB0aGUgc2NyZWVuLiAgVGhleSBtYXkgYmUgb25lIG9mCiAgICAgICoge0BsaW5rICNTQ1JFRU5MQVlPVVRfU0laRV9TTUFMTH0sIHtAbGluayAjU0NSRUVOTEFZT1VUX1NJWkVfTk9STUFMfSwKLSAgICAgKiB7QGxpbmsgI1NDUkVFTkxBWU9VVF9TSVpFX0xBUkdFfS4KKyAgICAgKiB7QGxpbmsgI1NDUkVFTkxBWU9VVF9TSVpFX0xBUkdFfSwgb3Ige0BsaW5rICNTQ1JFRU5MQVlPVVRfU0laRV9YTEFSR0V9LgogICAgICAqIAogICAgICAqIDxwPlRoZSB7QGxpbmsgI1NDUkVFTkxBWU9VVF9MT05HX01BU0t9IGRlZmluZXMgd2hldGhlciB0aGUgc2NyZWVuCiAgICAgICogaXMgd2lkZXIvdGFsbGVyIHRoYW4gbm9ybWFsLiAgVGhleSBtYXkgYmUgb25lIG9mCkBAIC0yNjcsMTEgKzI2NiwxOCBAQAogICAgICAgICBzYi5hcHBlbmQoIi8iKTsKICAgICAgICAgc2IuYXBwZW5kKG5hdmlnYXRpb25IaWRkZW4pOwogICAgICAgICBzYi5hcHBlbmQoIiBvcmllbj0iKTsKLSAgICAgICAgc2IuYXBwZW5kKG9yaWVudGF0aW9uKTsKLSAgICAgICAgc2IuYXBwZW5kKCIgbGF5b3V0PSIpOwotICAgICAgICBzYi5hcHBlbmQoc2NyZWVuTGF5b3V0KTsKLSAgICAgICAgc2IuYXBwZW5kKCIgdWlNb2RlPSIpOwotICAgICAgICBzYi5hcHBlbmQodWlNb2RlKTsKKyAgICAgICAgc3dpdGNoKG9yaWVudGF0aW9uKSB7CisgICAgICAgICAgICBjYXNlIE9SSUVOVEFUSU9OX0xBTkRTQ0FQRToKKyAgICAgICAgICAgICAgICBzYi5hcHBlbmQoIkwiKTsgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE9SSUVOVEFUSU9OX1BPUlRSQUlUOgorICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgiUCIpOyBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgc2IuYXBwZW5kKG9yaWVudGF0aW9uKTsKKyAgICAgICAgfQorICAgICAgICBzYi5hcHBlbmQoIiBsYXlvdXQ9MHgiKTsKKyAgICAgICAgc2IuYXBwZW5kKGphdmEubGFuZy5JbnRlZ2VyLnRvSGV4U3RyaW5nKHNjcmVlbkxheW91dCkpOworICAgICAgICBzYi5hcHBlbmQoIiB1aU1vZGU9MHgiKTsKKyAgICAgICAgc2IuYXBwZW5kKGphdmEubGFuZy5JbnRlZ2VyLnRvSGV4U3RyaW5nKHVpTW9kZSkpOwogICAgICAgICBpZiAoc2VxICE9IDApIHsKICAgICAgICAgICAgIHNiLmFwcGVuZCgiIHNlcT0iKTsKICAgICAgICAgICAgIHNiLmFwcGVuZChzZXEpOwpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9yZXMvUGx1cmFsUnVsZXMuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvcmVzL1BsdXJhbFJ1bGVzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJkY2UzYzEuLjAwMDAwMDAKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9yZXMvUGx1cmFsUnVsZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBhbmRyb2lkLmNvbnRlbnQucmVzOwotCi1pbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKLQotLyoKLSAqIFl1Y2stby4gIFRoaXMgaXMgbm90IHRoZSByaWdodCB3YXkgdG8gaW1wbGVtZW50IHRoaXMuICBXaGVuIHRoZSBJQ1UgUGx1cmFsUnVsZXMKLSAqIG9iamVjdCBoYXMgYmVlbiBpbnRlZ3JhdGVkIHRvIGFuZHJvaWQsIHdlIHNob3VsZCBzd2l0Y2ggdG8gdGhhdC4gIEZvciBub3csIHl1Y2stby4KLSAqLwotCi1hYnN0cmFjdCBjbGFzcyBQbHVyYWxSdWxlcyB7Ci0KLSAgICBzdGF0aWMgZmluYWwgaW50IFFVQU5USVRZX09USEVSID0gMHgwMDAwOwotICAgIHN0YXRpYyBmaW5hbCBpbnQgUVVBTlRJVFlfWkVSTyAgPSAweDAwMDE7Ci0gICAgc3RhdGljIGZpbmFsIGludCBRVUFOVElUWV9PTkUgICA9IDB4MDAwMjsKLSAgICBzdGF0aWMgZmluYWwgaW50IFFVQU5USVRZX1RXTyAgID0gMHgwMDA0OwotICAgIHN0YXRpYyBmaW5hbCBpbnQgUVVBTlRJVFlfRkVXICAgPSAweDAwMDg7Ci0gICAgc3RhdGljIGZpbmFsIGludCBRVUFOVElUWV9NQU5ZICA9IDB4MDAxMDsKLQotICAgIHN0YXRpYyBmaW5hbCBpbnQgSURfT1RIRVIgPSAweDAxMDAwMDA0OwotCi0gICAgYWJzdHJhY3QgaW50IHF1YW50aXR5Rm9yTnVtYmVyKGludCBuKTsKLQotICAgIGZpbmFsIGludCBhdHRyRm9yTnVtYmVyKGludCBuKSB7Ci0gICAgICAgIHJldHVybiBQbHVyYWxSdWxlcy5hdHRyRm9yUXVhbnRpdHkocXVhbnRpdHlGb3JOdW1iZXIobikpOwotICAgIH0KLQotICAgIHN0YXRpYyBmaW5hbCBpbnQgYXR0ckZvclF1YW50aXR5KGludCBxdWFudGl0eSkgewotICAgICAgICAvLyBzZWUgaW5jbHVkZS91dGlscy9SZXNvdXJjZVR5cGVzLmgKLSAgICAgICAgc3dpdGNoIChxdWFudGl0eSkgewotICAgICAgICAgICAgY2FzZSBRVUFOVElUWV9aRVJPOiByZXR1cm4gMHgwMTAwMDAwNTsKLSAgICAgICAgICAgIGNhc2UgUVVBTlRJVFlfT05FOiAgcmV0dXJuIDB4MDEwMDAwMDY7Ci0gICAgICAgICAgICBjYXNlIFFVQU5USVRZX1RXTzogIHJldHVybiAweDAxMDAwMDA3OwotICAgICAgICAgICAgY2FzZSBRVUFOVElUWV9GRVc6ICByZXR1cm4gMHgwMTAwMDAwODsKLSAgICAgICAgICAgIGNhc2UgUVVBTlRJVFlfTUFOWTogcmV0dXJuIDB4MDEwMDAwMDk7Ci0gICAgICAgICAgICBkZWZhdWx0OiAgICAgICAgICAgIHJldHVybiBJRF9PVEhFUjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgc3RyaW5nRm9yUXVhbnRpdHkoaW50IHF1YW50aXR5KSB7Ci0gICAgICAgIHN3aXRjaCAocXVhbnRpdHkpIHsKLSAgICAgICAgICAgIGNhc2UgUVVBTlRJVFlfWkVSTzoKLSAgICAgICAgICAgICAgICByZXR1cm4gInplcm8iOwotICAgICAgICAgICAgY2FzZSBRVUFOVElUWV9PTkU6Ci0gICAgICAgICAgICAgICAgcmV0dXJuICJvbmUiOwotICAgICAgICAgICAgY2FzZSBRVUFOVElUWV9UV086Ci0gICAgICAgICAgICAgICAgcmV0dXJuICJ0d28iOwotICAgICAgICAgICAgY2FzZSBRVUFOVElUWV9GRVc6Ci0gICAgICAgICAgICAgICAgcmV0dXJuICJmZXciOwotICAgICAgICAgICAgY2FzZSBRVUFOVElUWV9NQU5ZOgotICAgICAgICAgICAgICAgIHJldHVybiAibWFueSI7Ci0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIHJldHVybiAib3RoZXIiOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgc3RhdGljIGZpbmFsIFBsdXJhbFJ1bGVzIHJ1bGVGb3JMb2NhbGUoTG9jYWxlIGxvY2FsZSkgewotICAgICAgICBTdHJpbmcgbGFuZyA9IGxvY2FsZS5nZXRMYW5ndWFnZSgpOwotICAgICAgICBpZiAoImNzIi5lcXVhbHMobGFuZykpIHsKLSAgICAgICAgICAgIGlmIChjcyA9PSBudWxsKSBjcyA9IG5ldyBjcygpOwotICAgICAgICAgICAgcmV0dXJuIGNzOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgaWYgKGVuID09IG51bGwpIGVuID0gbmV3IGVuKCk7Ci0gICAgICAgICAgICByZXR1cm4gZW47Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBQbHVyYWxSdWxlcyBjczsKLSAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBjcyBleHRlbmRzIFBsdXJhbFJ1bGVzIHsKLSAgICAgICAgaW50IHF1YW50aXR5Rm9yTnVtYmVyKGludCBuKSB7Ci0gICAgICAgICAgICBpZiAobiA9PSAxKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFFVQU5USVRZX09ORTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKG4gPj0gMiAmJiBuIDw9IDQpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gUVVBTlRJVFlfRkVXOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFFVQU5USVRZX09USEVSOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgUGx1cmFsUnVsZXMgZW47Ci0gICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgZW4gZXh0ZW5kcyBQbHVyYWxSdWxlcyB7Ci0gICAgICAgIGludCBxdWFudGl0eUZvck51bWJlcihpbnQgbikgewotICAgICAgICAgICAgaWYgKG4gPT0gMSkgewotICAgICAgICAgICAgICAgIHJldHVybiBRVUFOVElUWV9PTkU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gUVVBTlRJVFlfT1RIRVI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvcmVzL1Jlc291cmNlcy5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9yZXMvUmVzb3VyY2VzLmphdmEKaW5kZXggYTY1MTNhYS4uOWIyM2MxZSAxMDA3NTUKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9yZXMvUmVzb3VyY2VzLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9yZXMvUmVzb3VyY2VzLmphdmEKQEAgLTE2LDcgKzE2LDYgQEAKIAogcGFja2FnZSBhbmRyb2lkLmNvbnRlbnQucmVzOwogCi0KIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC51dGlsLlhtbFV0aWxzOwogCiBpbXBvcnQgb3JnLnhtbHB1bGwudjEuWG1sUHVsbFBhcnNlcjsKQEAgLTQyLDYgKzQxLDggQEAKIGltcG9ydCBqYXZhLmxhbmcucmVmLldlYWtSZWZlcmVuY2U7CiBpbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKIAoraW1wb3J0IGxpYmNvcmUuaWN1Lk5hdGl2ZVBsdXJhbFJ1bGVzOworCiAvKioKICAqIENsYXNzIGZvciBhY2Nlc3NpbmcgYW4gYXBwbGljYXRpb24ncyByZXNvdXJjZXMuICBUaGlzIHNpdHMgb24gdG9wIG9mIHRoZQogICogYXNzZXQgbWFuYWdlciBvZiB0aGUgYXBwbGljYXRpb24gKGFjY2Vzc2libGUgdGhyb3VnaCBnZXRBc3NldHMoKSkgYW5kCkBAIC01Myw2ICs1NCw4IEBACiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVR19DT05GSUcgPSBmYWxzZTsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIFRSQUNFX0ZPUl9QUkVMT0FEID0gZmFsc2U7CiAKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgSURfT1RIRVIgPSAweDAxMDAwMDA0OworCiAgICAgLy8gVXNlIHRoZSBjdXJyZW50IFNESyB2ZXJzaW9uIGNvZGUuICBJZiB3ZSBhcmUgYSBkZXZlbG9wbWVudCBidWlsZCwKICAgICAvLyBhbHNvIGFsbG93IHRoZSBwcmV2aW91cyBTREsgdmVyc2lvbiArIDEuCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IHNTZGtWZXJzaW9uID0gQnVpbGQuVkVSU0lPTi5TREtfSU5UCkBAIC05MSw3ICs5NCw3IEBACiAgICAgLypwYWNrYWdlKi8gZmluYWwgQXNzZXRNYW5hZ2VyIG1Bc3NldHM7CiAgICAgcHJpdmF0ZSBmaW5hbCBDb25maWd1cmF0aW9uIG1Db25maWd1cmF0aW9uID0gbmV3IENvbmZpZ3VyYXRpb24oKTsKICAgICAvKnBhY2thZ2UqLyBmaW5hbCBEaXNwbGF5TWV0cmljcyBtTWV0cmljcyA9IG5ldyBEaXNwbGF5TWV0cmljcygpOwotICAgIFBsdXJhbFJ1bGVzIG1QbHVyYWxSdWxlOworICAgIHByaXZhdGUgTmF0aXZlUGx1cmFsUnVsZXMgbVBsdXJhbFJ1bGU7CiAgICAgCiAgICAgcHJpdmF0ZSBDb21wYXRpYmlsaXR5SW5mbyBtQ29tcGF0aWJpbGl0eUluZm87CiAgICAgcHJpdmF0ZSBEaXNwbGF5IG1EZWZhdWx0RGlzcGxheTsKQEAgLTIwOCw5ICsyMTEsMTcgQEAKICAgICB9CiAKICAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIGNoYXJhY3RlciBzZXF1ZW5jZSBhc3NvY2lhdGVkIHdpdGggYSBwYXJ0aWN1bGFyIHJlc291cmNlIElEIGZvciBhIHBhcnRpY3VsYXIKKyAgICAgKiBudW1lcmljYWwgcXVhbnRpdHkuCisgICAgICoKKyAgICAgKiA8cD5TZWUgPGEgaHJlZj0ie0Bkb2NSb290fWd1aWRlL3RvcGljcy9yZXNvdXJjZXMvc3RyaW5nLXJlc291cmNlLmh0bWwjUGx1cmFscyI+U3RyaW5nCisgICAgICogUmVzb3VyY2VzPC9hPiBmb3IgbW9yZSBvbiBxdWFudGl0eSBzdHJpbmdzLgorICAgICAqCiAgICAgICogQHBhcmFtIGlkIFRoZSBkZXNpcmVkIHJlc291cmNlIGlkZW50aWZpZXIsIGFzIGdlbmVyYXRlZCBieSB0aGUgYWFwdAogICAgICAqICAgICAgICAgICB0b29sLiBUaGlzIGludGVnZXIgZW5jb2RlcyB0aGUgcGFja2FnZSwgdHlwZSwgYW5kIHJlc291cmNlCiAgICAgICogICAgICAgICAgIGVudHJ5LiBUaGUgdmFsdWUgMCBpcyBhbiBpbnZhbGlkIGlkZW50aWZpZXIuCisgICAgICogQHBhcmFtIHF1YW50aXR5IFRoZSBudW1iZXIgdXNlZCB0byBnZXQgdGhlIGNvcnJlY3Qgc3RyaW5nIGZvciB0aGUgY3VycmVudCBsYW5ndWFnZSdzCisgICAgICogICAgICAgICAgIHBsdXJhbCBydWxlcy4KICAgICAgKgogICAgICAqIEB0aHJvd3MgTm90Rm91bmRFeGNlcHRpb24gVGhyb3dzIE5vdEZvdW5kRXhjZXB0aW9uIGlmIHRoZSBnaXZlbiBJRCBkb2VzIG5vdCBleGlzdC4KICAgICAgKgpAQCAtMjE4LDI5ICsyMjksNTIgQEAKICAgICAgKiAgICAgICAgIHBvc3NpYmx5IHN0eWxlZCB0ZXh0IGluZm9ybWF0aW9uLgogICAgICAqLwogICAgIHB1YmxpYyBDaGFyU2VxdWVuY2UgZ2V0UXVhbnRpdHlUZXh0KGludCBpZCwgaW50IHF1YW50aXR5KSB0aHJvd3MgTm90Rm91bmRFeGNlcHRpb24gewotICAgICAgICBQbHVyYWxSdWxlcyBydWxlID0gZ2V0UGx1cmFsUnVsZSgpOwotICAgICAgICBDaGFyU2VxdWVuY2UgcmVzID0gbUFzc2V0cy5nZXRSZXNvdXJjZUJhZ1RleHQoaWQsIHJ1bGUuYXR0ckZvck51bWJlcihxdWFudGl0eSkpOworICAgICAgICBOYXRpdmVQbHVyYWxSdWxlcyBydWxlID0gZ2V0UGx1cmFsUnVsZSgpOworICAgICAgICBDaGFyU2VxdWVuY2UgcmVzID0gbUFzc2V0cy5nZXRSZXNvdXJjZUJhZ1RleHQoaWQsCisgICAgICAgICAgICAgICAgYXR0ckZvclF1YW50aXR5Q29kZShydWxlLnF1YW50aXR5Rm9ySW50KHF1YW50aXR5KSkpOwogICAgICAgICBpZiAocmVzICE9IG51bGwpIHsKICAgICAgICAgICAgIHJldHVybiByZXM7CiAgICAgICAgIH0KLSAgICAgICAgcmVzID0gbUFzc2V0cy5nZXRSZXNvdXJjZUJhZ1RleHQoaWQsIFBsdXJhbFJ1bGVzLklEX09USEVSKTsKKyAgICAgICAgcmVzID0gbUFzc2V0cy5nZXRSZXNvdXJjZUJhZ1RleHQoaWQsIElEX09USEVSKTsKICAgICAgICAgaWYgKHJlcyAhPSBudWxsKSB7CiAgICAgICAgICAgICByZXR1cm4gcmVzOwogICAgICAgICB9CiAgICAgICAgIHRocm93IG5ldyBOb3RGb3VuZEV4Y2VwdGlvbigiUGx1cmFsIHJlc291cmNlIElEICMweCIgKyBJbnRlZ2VyLnRvSGV4U3RyaW5nKGlkKQogICAgICAgICAgICAgICAgICsgIiBxdWFudGl0eT0iICsgcXVhbnRpdHkKLSAgICAgICAgICAgICAgICArICIgaXRlbT0iICsgUGx1cmFsUnVsZXMuc3RyaW5nRm9yUXVhbnRpdHkocnVsZS5xdWFudGl0eUZvck51bWJlcihxdWFudGl0eSkpKTsKKyAgICAgICAgICAgICAgICArICIgaXRlbT0iICsgc3RyaW5nRm9yUXVhbnRpdHlDb2RlKHJ1bGUucXVhbnRpdHlGb3JJbnQocXVhbnRpdHkpKSk7CiAgICAgfQogCi0gICAgcHJpdmF0ZSBQbHVyYWxSdWxlcyBnZXRQbHVyYWxSdWxlKCkgeworICAgIHByaXZhdGUgTmF0aXZlUGx1cmFsUnVsZXMgZ2V0UGx1cmFsUnVsZSgpIHsKICAgICAgICAgc3luY2hyb25pemVkIChtU3luYykgewogICAgICAgICAgICAgaWYgKG1QbHVyYWxSdWxlID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtUGx1cmFsUnVsZSA9IFBsdXJhbFJ1bGVzLnJ1bGVGb3JMb2NhbGUobUNvbmZpZ3VyYXRpb24ubG9jYWxlKTsKKyAgICAgICAgICAgICAgICBtUGx1cmFsUnVsZSA9IE5hdGl2ZVBsdXJhbFJ1bGVzLmZvckxvY2FsZShtQ29uZmlndXJhdGlvbi5sb2NhbGUpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgcmV0dXJuIG1QbHVyYWxSdWxlOwogICAgICAgICB9CiAgICAgfQogCisgICAgcHJpdmF0ZSBzdGF0aWMgaW50IGF0dHJGb3JRdWFudGl0eUNvZGUoaW50IHF1YW50aXR5Q29kZSkgeworICAgICAgICBzd2l0Y2ggKHF1YW50aXR5Q29kZSkgeworICAgICAgICAgICAgY2FzZSBOYXRpdmVQbHVyYWxSdWxlcy5aRVJPOiByZXR1cm4gMHgwMTAwMDAwNTsKKyAgICAgICAgICAgIGNhc2UgTmF0aXZlUGx1cmFsUnVsZXMuT05FOiAgcmV0dXJuIDB4MDEwMDAwMDY7CisgICAgICAgICAgICBjYXNlIE5hdGl2ZVBsdXJhbFJ1bGVzLlRXTzogIHJldHVybiAweDAxMDAwMDA3OworICAgICAgICAgICAgY2FzZSBOYXRpdmVQbHVyYWxSdWxlcy5GRVc6ICByZXR1cm4gMHgwMTAwMDAwODsKKyAgICAgICAgICAgIGNhc2UgTmF0aXZlUGx1cmFsUnVsZXMuTUFOWTogcmV0dXJuIDB4MDEwMDAwMDk7CisgICAgICAgICAgICBkZWZhdWx0OiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBJRF9PVEhFUjsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBzdHJpbmdGb3JRdWFudGl0eUNvZGUoaW50IHF1YW50aXR5Q29kZSkgeworICAgICAgICBzd2l0Y2ggKHF1YW50aXR5Q29kZSkgeworICAgICAgICAgICAgY2FzZSBOYXRpdmVQbHVyYWxSdWxlcy5aRVJPOiByZXR1cm4gInplcm8iOworICAgICAgICAgICAgY2FzZSBOYXRpdmVQbHVyYWxSdWxlcy5PTkU6ICByZXR1cm4gIm9uZSI7CisgICAgICAgICAgICBjYXNlIE5hdGl2ZVBsdXJhbFJ1bGVzLlRXTzogIHJldHVybiAidHdvIjsKKyAgICAgICAgICAgIGNhc2UgTmF0aXZlUGx1cmFsUnVsZXMuRkVXOiAgcmV0dXJuICJmZXciOworICAgICAgICAgICAgY2FzZSBOYXRpdmVQbHVyYWxSdWxlcy5NQU5ZOiByZXR1cm4gIm1hbnkiOworICAgICAgICAgICAgZGVmYXVsdDogICAgICAgICAgICAgICAgICAgICByZXR1cm4gIm90aGVyIjsKKyAgICAgICAgfQorICAgIH0KKwogICAgIC8qKgogICAgICAqIFJldHVybiB0aGUgc3RyaW5nIHZhbHVlIGFzc29jaWF0ZWQgd2l0aCBhIHBhcnRpY3VsYXIgcmVzb3VyY2UgSUQuICBJdAogICAgICAqIHdpbGwgYmUgc3RyaXBwZWQgb2YgYW55IHN0eWxlZCB0ZXh0IGluZm9ybWF0aW9uLgpAQCAtMjk1LDYgKzMyOSw5IEBACiAgICAgICogc3RyaXBwZWQgb2YgYW55IHN0eWxlZCB0ZXh0IGluZm9ybWF0aW9uLgogICAgICAqIHtAbW9yZX0KICAgICAgKgorICAgICAqIDxwPlNlZSA8YSBocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvdG9waWNzL3Jlc291cmNlcy9zdHJpbmctcmVzb3VyY2UuaHRtbCNQbHVyYWxzIj5TdHJpbmcKKyAgICAgKiBSZXNvdXJjZXM8L2E+IGZvciBtb3JlIG9uIHF1YW50aXR5IHN0cmluZ3MuCisgICAgICoKICAgICAgKiBAcGFyYW0gaWQgVGhlIGRlc2lyZWQgcmVzb3VyY2UgaWRlbnRpZmllciwgYXMgZ2VuZXJhdGVkIGJ5IHRoZSBhYXB0CiAgICAgICogICAgICAgICAgIHRvb2wuIFRoaXMgaW50ZWdlciBlbmNvZGVzIHRoZSBwYWNrYWdlLCB0eXBlLCBhbmQgcmVzb3VyY2UKICAgICAgKiAgICAgICAgICAgZW50cnkuIFRoZSB2YWx1ZSAwIGlzIGFuIGludmFsaWQgaWRlbnRpZmllci4KQEAgLTMxNyw2ICszNTQsOSBAQAogICAgICAqIFJldHVybiB0aGUgc3RyaW5nIHZhbHVlIGFzc29jaWF0ZWQgd2l0aCBhIHBhcnRpY3VsYXIgcmVzb3VyY2UgSUQgZm9yIGEgcGFydGljdWxhcgogICAgICAqIG51bWVyaWNhbCBxdWFudGl0eS4KICAgICAgKgorICAgICAqIDxwPlNlZSA8YSBocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvdG9waWNzL3Jlc291cmNlcy9zdHJpbmctcmVzb3VyY2UuaHRtbCNQbHVyYWxzIj5TdHJpbmcKKyAgICAgKiBSZXNvdXJjZXM8L2E+IGZvciBtb3JlIG9uIHF1YW50aXR5IHN0cmluZ3MuCisgICAgICoKICAgICAgKiBAcGFyYW0gaWQgVGhlIGRlc2lyZWQgcmVzb3VyY2UgaWRlbnRpZmllciwgYXMgZ2VuZXJhdGVkIGJ5IHRoZSBhYXB0CiAgICAgICogICAgICAgICAgIHRvb2wuIFRoaXMgaW50ZWdlciBlbmNvZGVzIHRoZSBwYWNrYWdlLCB0eXBlLCBhbmQgcmVzb3VyY2UKICAgICAgKiAgICAgICAgICAgZW50cnkuIFRoZSB2YWx1ZSAwIGlzIGFuIGludmFsaWQgaWRlbnRpZmllci4KQEAgLTEzMTUsNyArMTM1NSw3IEBACiAgICAgICAgIH0KICAgICAgICAgc3luY2hyb25pemVkIChtU3luYykgewogICAgICAgICAgICAgaWYgKG1QbHVyYWxSdWxlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtUGx1cmFsUnVsZSA9IFBsdXJhbFJ1bGVzLnJ1bGVGb3JMb2NhbGUoY29uZmlnLmxvY2FsZSk7CisgICAgICAgICAgICAgICAgbVBsdXJhbFJ1bGUgPSBOYXRpdmVQbHVyYWxSdWxlcy5mb3JMb2NhbGUoY29uZmlnLmxvY2FsZSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CkBAIC0xNTE5LDcgKzE1NTksNyBAQAogICAgIC8qKgogICAgICAqIFBhcnNlIGEgc2VyaWVzIG9mIHtAbGluayBhbmRyb2lkLlIuc3R5bGVhYmxlI0V4dHJhICZsdDtleHRyYSZndDt9IHRhZ3MgZnJvbQogICAgICAqIGFuIFhNTCBmaWxlLiAgWW91IGNhbGwgdGhpcyB3aGVuIHlvdSBhcmUgYXQgdGhlIHBhcmVudCB0YWcgb2YgdGhlCi0gICAgICogZXh0cmEgdGFncywgYW5kIGl0IHJldHVybiBvbmNlIGFsbCBvZiB0aGUgY2hpbGQgdGFncyBoYXZlIGJlZW4gcGFyc2VkLgorICAgICAqIGV4dHJhIHRhZ3MsIGFuZCBpdCB3aWxsIHJldHVybiBvbmNlIGFsbCBvZiB0aGUgY2hpbGQgdGFncyBoYXZlIGJlZW4gcGFyc2VkLgogICAgICAqIFRoaXMgd2lsbCBjYWxsIHtAbGluayAjcGFyc2VCdW5kbGVFeHRyYX0gZm9yIGVhY2ggZXh0cmEgdGFnIGVuY291bnRlcmVkLgogICAgICAqIAogICAgICAqIEBwYXJhbSBwYXJzZXIgVGhlIHBhcnNlciBmcm9tIHdoaWNoIHRvIHJldHJpZXZlIHRoZSBleHRyYXMuCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9BYnN0cmFjdEN1cnNvci5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2UvQWJzdHJhY3RDdXJzb3IuamF2YQppbmRleCBhNWU1ZTQ2Li5iZmFlYjgyIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9BYnN0cmFjdEN1cnNvci5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL0Fic3RyYWN0Q3Vyc29yLmphdmEKQEAgLTE4LDE2ICsxOCwxMSBAQAogCiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRSZXNvbHZlcjsKIGltcG9ydCBhbmRyb2lkLm5ldC5Vcmk7CitpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkNvbmZpZzsKIGltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwotaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOwotaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlcjsKLWltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXJUaHJlYWQ7Ci1pbXBvcnQgYW5kcm9pZC5vcy5Mb29wZXI7Ci1pbXBvcnQgYW5kcm9pZC5vcy5NZXNzYWdlOwogCiBpbXBvcnQgamF2YS5sYW5nLnJlZi5XZWFrUmVmZXJlbmNlOwotaW1wb3J0IGphdmEubGFuZy5VbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKIGltcG9ydCBqYXZhLnV0aWwuTWFwOwogCkBAIC01Niw2ICs1MSwxMCBAQAogICAgIGFic3RyYWN0IHB1YmxpYyBkb3VibGUgZ2V0RG91YmxlKGludCBjb2x1bW4pOwogICAgIGFic3RyYWN0IHB1YmxpYyBib29sZWFuIGlzTnVsbChpbnQgY29sdW1uKTsKIAorICAgIHB1YmxpYyBpbnQgZ2V0VHlwZShpbnQgY29sdW1uKSB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgIH0KKwogICAgIC8vIFRPRE8gaW1wbGVtZW50IGdldEJsb2IgaW4gYWxsIGN1cnNvciB0eXBlcwogICAgIHB1YmxpYyBieXRlW10gZ2V0QmxvYihpbnQgY29sdW1uKSB7CiAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiZ2V0QmxvYiBpcyBub3Qgc3VwcG9ydGVkIik7CkBAIC04OCw3ICs4Nyw3IEBACiAgICAgICAgIH0KICAgICAgICAgbURhdGFTZXRPYnNlcnZhYmxlLm5vdGlmeUludmFsaWRhdGVkKCk7CiAgICAgfQotICAgIAorCiAgICAgcHVibGljIGJvb2xlYW4gcmVxdWVyeSgpIHsKICAgICAgICAgaWYgKG1TZWxmT2JzZXJ2ZXIgIT0gbnVsbCAmJiBtU2VsZk9ic2VydmVyUmVnaXN0ZXJlZCA9PSBmYWxzZSkgewogICAgICAgICAgICAgbUNvbnRlbnRSZXNvbHZlci5yZWdpc3RlckNvbnRlbnRPYnNlcnZlcihtTm90aWZ5VXJpLCB0cnVlLCBtU2VsZk9ic2VydmVyKTsKQEAgLTEwOSwyMiArMTA4LDYgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBAaGlkZQotICAgICAqIEBkZXByZWNhdGVkCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gY29tbWl0VXBkYXRlcyhNYXA8PyBleHRlbmRzIExvbmcsPyBleHRlbmRzIE1hcDxTdHJpbmcsT2JqZWN0Pj4gdmFsdWVzKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAaGlkZQotICAgICAqIEBkZXByZWNhdGVkCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gZGVsZXRlUm93KCkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgLyoqCiAgICAgICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgZXZlcnkgdGltZSB0aGUgY3Vyc29yIGlzIHN1Y2Nlc3NmdWxseSBzY3JvbGxlZAogICAgICAqIHRvIGEgbmV3IHBvc2l0aW9uLCBnaXZpbmcgdGhlIHN1YmNsYXNzIGEgY2hhbmNlIHRvIHVwZGF0ZSBhbnkgc3RhdGUgaXQKICAgICAgKiBtYXkgaGF2ZS4gSWYgaXQgcmV0dXJucyBmYWxzZSB0aGUgbW92ZSBmdW5jdGlvbiB3aWxsIGFsc28gZG8gc28gYW5kIHRoZQpAQCAtMzIwLDEzNyArMzAzLDYgQEAKICAgICAgICAgcmV0dXJuIGdldENvbHVtbk5hbWVzKClbY29sdW1uSW5kZXhdOwogICAgIH0KIAotICAgIC8qKgotICAgICAqIEBoaWRlCi0gICAgICogQGRlcHJlY2F0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiB1cGRhdGVCbG9iKGludCBjb2x1bW5JbmRleCwgYnl0ZVtdIHZhbHVlKSB7Ci0gICAgICAgIHJldHVybiB1cGRhdGUoY29sdW1uSW5kZXgsIHZhbHVlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAaGlkZQotICAgICAqIEBkZXByZWNhdGVkCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gdXBkYXRlU3RyaW5nKGludCBjb2x1bW5JbmRleCwgU3RyaW5nIHZhbHVlKSB7Ci0gICAgICAgIHJldHVybiB1cGRhdGUoY29sdW1uSW5kZXgsIHZhbHVlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAaGlkZQotICAgICAqIEBkZXByZWNhdGVkCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gdXBkYXRlU2hvcnQoaW50IGNvbHVtbkluZGV4LCBzaG9ydCB2YWx1ZSkgewotICAgICAgICByZXR1cm4gdXBkYXRlKGNvbHVtbkluZGV4LCBTaG9ydC52YWx1ZU9mKHZhbHVlKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQGhpZGUKLSAgICAgKiBAZGVwcmVjYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIHVwZGF0ZUludChpbnQgY29sdW1uSW5kZXgsIGludCB2YWx1ZSkgewotICAgICAgICByZXR1cm4gdXBkYXRlKGNvbHVtbkluZGV4LCBJbnRlZ2VyLnZhbHVlT2YodmFsdWUpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAaGlkZQotICAgICAqIEBkZXByZWNhdGVkCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gdXBkYXRlTG9uZyhpbnQgY29sdW1uSW5kZXgsIGxvbmcgdmFsdWUpIHsKLSAgICAgICAgcmV0dXJuIHVwZGF0ZShjb2x1bW5JbmRleCwgTG9uZy52YWx1ZU9mKHZhbHVlKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQGhpZGUKLSAgICAgKiBAZGVwcmVjYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIHVwZGF0ZUZsb2F0KGludCBjb2x1bW5JbmRleCwgZmxvYXQgdmFsdWUpIHsKLSAgICAgICAgcmV0dXJuIHVwZGF0ZShjb2x1bW5JbmRleCwgRmxvYXQudmFsdWVPZih2YWx1ZSkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBoaWRlCi0gICAgICogQGRlcHJlY2F0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiB1cGRhdGVEb3VibGUoaW50IGNvbHVtbkluZGV4LCBkb3VibGUgdmFsdWUpIHsKLSAgICAgICAgcmV0dXJuIHVwZGF0ZShjb2x1bW5JbmRleCwgRG91YmxlLnZhbHVlT2YodmFsdWUpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAaGlkZQotICAgICAqIEBkZXByZWNhdGVkCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gdXBkYXRlVG9OdWxsKGludCBjb2x1bW5JbmRleCkgewotICAgICAgICByZXR1cm4gdXBkYXRlKGNvbHVtbkluZGV4LCBudWxsKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAaGlkZQotICAgICAqIEBkZXByZWNhdGVkCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gdXBkYXRlKGludCBjb2x1bW5JbmRleCwgT2JqZWN0IG9iaikgewotICAgICAgICBpZiAoIXN1cHBvcnRzVXBkYXRlcygpKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBMb25nLnZhbHVlT2YoKSByZXR1cm5zIG51bGwgc29tZXRpbWVzIQotLy8gICAgICAgIExvbmcgcm93aWQgPSBMb25nLnZhbHVlT2YoZ2V0TG9uZyhtUm93SWRDb2x1bW5JbmRleCkpOwotICAgICAgICBMb25nIHJvd2lkID0gbmV3IExvbmcoZ2V0TG9uZyhtUm93SWRDb2x1bW5JbmRleCkpOwotICAgICAgICBpZiAocm93aWQgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigibnVsbCByb3dpZC4gbVJvd0lkQ29sdW1uSW5kZXggPSAiICsgbVJvd0lkQ29sdW1uSW5kZXgpOwotICAgICAgICB9Ci0KLSAgICAgICAgc3luY2hyb25pemVkKG1VcGRhdGVkUm93cykgewotICAgICAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiByb3cgPSBtVXBkYXRlZFJvd3MuZ2V0KHJvd2lkKTsKLSAgICAgICAgICAgIGlmIChyb3cgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJvdyA9IG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpOwotICAgICAgICAgICAgICAgIG1VcGRhdGVkUm93cy5wdXQocm93aWQsIHJvdyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByb3cucHV0KGdldENvbHVtbk5hbWVzKClbY29sdW1uSW5kZXhdLCBvYmopOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGVyZSBhcmUgcGVuZGluZyB1cGRhdGVzIHRoYXQgaGF2ZSBub3QgeWV0IGJlZW4gY29tbWl0dGVkLgotICAgICAqIAotICAgICAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlcmUgYXJlIHBlbmRpbmcgdXBkYXRlcyB0aGF0IGhhdmUgbm90IHlldCBiZWVuIGNvbW1pdHRlZC4KLSAgICAgKiBAaGlkZQotICAgICAqIEBkZXByZWNhdGVkCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaGFzVXBkYXRlcygpIHsKLSAgICAgICAgc3luY2hyb25pemVkKG1VcGRhdGVkUm93cykgewotICAgICAgICAgICAgcmV0dXJuIG1VcGRhdGVkUm93cy5zaXplKCkgPiAwOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQGhpZGUKLSAgICAgKiBAZGVwcmVjYXRlZAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGFib3J0VXBkYXRlcygpIHsKLSAgICAgICAgc3luY2hyb25pemVkKG1VcGRhdGVkUm93cykgewotICAgICAgICAgICAgbVVwZGF0ZWRSb3dzLmNsZWFyKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAaGlkZQotICAgICAqIEBkZXByZWNhdGVkCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gY29tbWl0VXBkYXRlcygpIHsKLSAgICAgICAgcmV0dXJuIGNvbW1pdFVwZGF0ZXMobnVsbCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQGhpZGUKLSAgICAgKiBAZGVwcmVjYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIHN1cHBvcnRzVXBkYXRlcygpIHsKLSAgICAgICAgcmV0dXJuIG1Sb3dJZENvbHVtbkluZGV4ICE9IC0xOwotICAgIH0KLQogICAgIHB1YmxpYyB2b2lkIHJlZ2lzdGVyQ29udGVudE9ic2VydmVyKENvbnRlbnRPYnNlcnZlciBvYnNlcnZlcikgewogICAgICAgICBtQ29udGVudE9ic2VydmFibGUucmVnaXN0ZXJPYnNlcnZlcihvYnNlcnZlcik7CiAgICAgfQpAQCAtNDc4LDkgKzMzMCw5IEBACiAgICAgICAgIHJldHVybiBtRGF0YVNldE9ic2VydmFibGU7CiAgICAgICAgIAogICAgIH0KKwogICAgIHB1YmxpYyB2b2lkIHJlZ2lzdGVyRGF0YVNldE9ic2VydmVyKERhdGFTZXRPYnNlcnZlciBvYnNlcnZlcikgewogICAgICAgICBtRGF0YVNldE9ic2VydmFibGUucmVnaXN0ZXJPYnNlcnZlcihvYnNlcnZlcik7Ci0gICAgICAgIAogICAgIH0KIAogICAgIHB1YmxpYyB2b2lkIHVucmVnaXN0ZXJEYXRhU2V0T2JzZXJ2ZXIoRGF0YVNldE9ic2VydmVyIG9ic2VydmVyKSB7CkBAIC01MjIsNiArMzc0LDEwIEBACiAgICAgICAgIH0KICAgICB9CiAKKyAgICBwdWJsaWMgVXJpIGdldE5vdGlmaWNhdGlvblVyaSgpIHsKKyAgICAgICAgcmV0dXJuIG1Ob3RpZnlVcmk7CisgICAgfQorCiAgICAgcHVibGljIGJvb2xlYW4gZ2V0V2FudHNBbGxPbk1vdmVDYWxscygpIHsKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KQEAgLTUzNSwzNiArMzkxLDE5IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRydWUgaWYgdGhlIGZpZWxkIGhhcyBiZWVuIHVwZGF0ZWQgYW5kIGlzCi0gICAgICogdXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIHtAbGluayAjZ2V0VXBkYXRlZEZpZWxkfSB0byBhbGxvdyBzdWJjbGFzc2VzIHRvCi0gICAgICogc3VwcG9ydCByZWFkaW5nIHVuY29tbWl0dGVkIHVwZGF0ZXMuIE5PVEU6IFRoaXMgZnVuY3Rpb24gYW5kCi0gICAgICoge0BsaW5rICNnZXRVcGRhdGVkRmllbGR9IHNob3VsZCBiZSBjYWxsZWQgdG9nZXRoZXIgaW5zaWRlIG9mIGEKLSAgICAgKiBibG9jayBzeW5jaHJvbml6ZWQgb24gbVVwZGF0ZWRSb3dzLgotICAgICAqCi0gICAgICogQHBhcmFtIGNvbHVtbkluZGV4IHRoZSBjb2x1bW4gaW5kZXggb2YgdGhlIGZpZWxkIHRvIGNoZWNrCi0gICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBmaWVsZCBoYXMgYmVlbiB1cGRhdGVkLCBmYWxzZSBvdGhlcndpc2UKKyAgICAgKiBAZGVwcmVjYXRlZCBBbHdheXMgcmV0dXJucyBmYWxzZSBzaW5jZSBDdXJzb3JzIGRvIG5vdCBzdXBwb3J0IHVwZGF0aW5nIHJvd3MKICAgICAgKi8KKyAgICBARGVwcmVjYXRlZAogICAgIHByb3RlY3RlZCBib29sZWFuIGlzRmllbGRVcGRhdGVkKGludCBjb2x1bW5JbmRleCkgewotICAgICAgICBpZiAobVJvd0lkQ29sdW1uSW5kZXggIT0gLTEgJiYgbVVwZGF0ZWRSb3dzLnNpemUoKSA+IDApIHsKLSAgICAgICAgICAgIE1hcDxTdHJpbmcsIE9iamVjdD4gdXBkYXRlcyA9IG1VcGRhdGVkUm93cy5nZXQobUN1cnJlbnRSb3dJRCk7Ci0gICAgICAgICAgICBpZiAodXBkYXRlcyAhPSBudWxsICYmIHVwZGF0ZXMuY29udGFpbnNLZXkoZ2V0Q29sdW1uTmFtZXMoKVtjb2x1bW5JbmRleF0pKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgdW5jb21taXR0ZWQgdXBkYXRlZCB2YWx1ZSBmb3IgdGhlIGZpZWxkCi0gICAgICogYXQgY29sdW1uSW5kZXguICBOT1RFOiBUaGlzIGZ1bmN0aW9uIGFuZCB7QGxpbmsgI2lzRmllbGRVcGRhdGVkfSBzaG91bGQKLSAgICAgKiBiZSBjYWxsZWQgdG9nZXRoZXIgaW5zaWRlIG9mIGEgYmxvY2sgc3luY2hyb25pemVkIG9uIG1VcGRhdGVkUm93cy4KLSAgICAgKgotICAgICAqIEBwYXJhbSBjb2x1bW5JbmRleCB0aGUgY29sdW1uIGluZGV4IG9mIHRoZSBmaWVsZCB0byByZXRyaWV2ZQotICAgICAqIEByZXR1cm4gdGhlIHVwZGF0ZWQgdmFsdWUKKyAgICAgKiBAZGVwcmVjYXRlZCBBbHdheXMgcmV0dXJucyBudWxsIHNpbmNlIEN1cnNvcnMgZG8gbm90IHN1cHBvcnQgdXBkYXRpbmcgcm93cwogICAgICAqLworICAgIEBEZXByZWNhdGVkCiAgICAgcHJvdGVjdGVkIE9iamVjdCBnZXRVcGRhdGVkRmllbGQoaW50IGNvbHVtbkluZGV4KSB7Ci0gICAgICAgIE1hcDxTdHJpbmcsIE9iamVjdD4gdXBkYXRlcyA9IG1VcGRhdGVkUm93cy5nZXQobUN1cnJlbnRSb3dJRCk7Ci0gICAgICAgIHJldHVybiB1cGRhdGVzLmdldChnZXRDb2x1bW5OYW1lcygpW2NvbHVtbkluZGV4XSk7CisgICAgICAgIHJldHVybiBudWxsOwogICAgIH0KIAogICAgIC8qKgpAQCAtNjE0LDExICs0NTMsOSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFRoaXMgSGFzaE1hcCBjb250YWlucyBhIG1hcHBpbmcgZnJvbSBMb25nIHJvd0lEcyB0byBhbm90aGVyIE1hcAotICAgICAqIHRoYXQgbWFwcyBmcm9tIFN0cmluZyBjb2x1bW4gbmFtZXMgdG8gbmV3IHZhbHVlcy4gQSBOVUxMIHZhbHVlIG1lYW5zIHRvCi0gICAgICogcmVtb3ZlIGFuIGV4aXN0aW5nIHZhbHVlLCBhbmQgYWxsIG51bWVyaWMgdmFsdWVzIGFyZSBpbiB0aGVpciBjbGFzcwotICAgICAqIGZvcm1zLCBpLmUuIEludGVnZXIsIExvbmcsIEZsb2F0LCBldGMuCisgICAgICogQGRlcHJlY2F0ZWQgVGhpcyBpcyBuZXZlciB1cGRhdGVkIGJ5IHRoaXMgY2xhc3MgYW5kIHNob3VsZCBub3QgYmUgdXNlZAogICAgICAqLworICAgIEBEZXByZWNhdGVkCiAgICAgcHJvdGVjdGVkIEhhc2hNYXA8TG9uZywgTWFwPFN0cmluZywgT2JqZWN0Pj4gbVVwZGF0ZWRSb3dzOwogCiAgICAgLyoqCkBAIC02MjgsNiArNDY1LDExIEBACiAgICAgcHJvdGVjdGVkIGludCBtUm93SWRDb2x1bW5JbmRleDsKIAogICAgIHByb3RlY3RlZCBpbnQgbVBvczsKKyAgICAvKioKKyAgICAgKiBJZiB7QGxpbmsgI21Sb3dJZENvbHVtbkluZGV4fSBpcyBub3QgLTEgdGhpcyBjb250YWlucyBjb250YWlucyB0aGUgdmFsdWUgb2YKKyAgICAgKiB0aGUgY29sdW1uIGF0IHtAbGluayAjbVJvd0lkQ29sdW1uSW5kZXh9IGZvciB0aGUgY3VycmVudCByb3cgdGhpcyBjdXJzb3IgaXMKKyAgICAgKiBwb2ludGluZyBhdC4KKyAgICAgKi8KICAgICBwcm90ZWN0ZWQgTG9uZyBtQ3VycmVudFJvd0lEOwogICAgIHByb3RlY3RlZCBDb250ZW50UmVzb2x2ZXIgbUNvbnRlbnRSZXNvbHZlcjsKICAgICBwcm90ZWN0ZWQgYm9vbGVhbiBtQ2xvc2VkID0gZmFsc2U7CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9BYnN0cmFjdFdpbmRvd2VkQ3Vyc29yLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9BYnN0cmFjdFdpbmRvd2VkQ3Vyc29yLmphdmEKaW5kZXggMjdhMDJlMi4uOGFkZGFhOCAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2UvQWJzdHJhY3RXaW5kb3dlZEN1cnNvci5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL0Fic3RyYWN0V2luZG93ZWRDdXJzb3IuamF2YQpAQCAtMTksMjAyICsxOSwxMDUgQEAKIC8qKgogICogQSBiYXNlIGNsYXNzIGZvciBDdXJzb3JzIHRoYXQgc3RvcmUgdGhlaXIgZGF0YSBpbiB7QGxpbmsgQ3Vyc29yV2luZG93fXMuCiAgKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFdpbmRvd2VkQ3Vyc29yIGV4dGVuZHMgQWJzdHJhY3RDdXJzb3IKLXsKK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFdpbmRvd2VkQ3Vyc29yIGV4dGVuZHMgQWJzdHJhY3RDdXJzb3IgewogICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBieXRlW10gZ2V0QmxvYihpbnQgY29sdW1uSW5kZXgpCi0gICAgeworICAgIHB1YmxpYyBieXRlW10gZ2V0QmxvYihpbnQgY29sdW1uSW5kZXgpIHsKICAgICAgICAgY2hlY2tQb3NpdGlvbigpOwotCi0gICAgICAgIHN5bmNocm9uaXplZChtVXBkYXRlZFJvd3MpIHsKLSAgICAgICAgICAgIGlmIChpc0ZpZWxkVXBkYXRlZChjb2x1bW5JbmRleCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gKGJ5dGVbXSlnZXRVcGRhdGVkRmllbGQoY29sdW1uSW5kZXgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KICAgICAgICAgcmV0dXJuIG1XaW5kb3cuZ2V0QmxvYihtUG9zLCBjb2x1bW5JbmRleCk7CiAgICAgfQogCiAgICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFN0cmluZyBnZXRTdHJpbmcoaW50IGNvbHVtbkluZGV4KQotICAgIHsKKyAgICBwdWJsaWMgU3RyaW5nIGdldFN0cmluZyhpbnQgY29sdW1uSW5kZXgpIHsKICAgICAgICAgY2hlY2tQb3NpdGlvbigpOwotCi0gICAgICAgIHN5bmNocm9uaXplZChtVXBkYXRlZFJvd3MpIHsKLSAgICAgICAgICAgIGlmIChpc0ZpZWxkVXBkYXRlZChjb2x1bW5JbmRleCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gKFN0cmluZylnZXRVcGRhdGVkRmllbGQoY29sdW1uSW5kZXgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KICAgICAgICAgcmV0dXJuIG1XaW5kb3cuZ2V0U3RyaW5nKG1Qb3MsIGNvbHVtbkluZGV4KTsKICAgICB9Ci0gICAgCisKICAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBjb3B5U3RyaW5nVG9CdWZmZXIoaW50IGNvbHVtbkluZGV4LCBDaGFyQXJyYXlCdWZmZXIgYnVmZmVyKQotICAgIHsKKyAgICBwdWJsaWMgdm9pZCBjb3B5U3RyaW5nVG9CdWZmZXIoaW50IGNvbHVtbkluZGV4LCBDaGFyQXJyYXlCdWZmZXIgYnVmZmVyKSB7CiAgICAgICAgIGNoZWNrUG9zaXRpb24oKTsKLSAgICAgICAgCi0gICAgICAgIHN5bmNocm9uaXplZChtVXBkYXRlZFJvd3MpIHsKLSAgICAgICAgICAgIGlmIChpc0ZpZWxkVXBkYXRlZChjb2x1bW5JbmRleCkpIHsKLSAgICAgICAgICAgICAgICBzdXBlci5jb3B5U3RyaW5nVG9CdWZmZXIoY29sdW1uSW5kZXgsIGJ1ZmZlcik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCiAgICAgICAgIG1XaW5kb3cuY29weVN0cmluZ1RvQnVmZmVyKG1Qb3MsIGNvbHVtbkluZGV4LCBidWZmZXIpOwogICAgIH0KIAogICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBzaG9ydCBnZXRTaG9ydChpbnQgY29sdW1uSW5kZXgpCi0gICAgeworICAgIHB1YmxpYyBzaG9ydCBnZXRTaG9ydChpbnQgY29sdW1uSW5kZXgpIHsKICAgICAgICAgY2hlY2tQb3NpdGlvbigpOwotCi0gICAgICAgIHN5bmNocm9uaXplZChtVXBkYXRlZFJvd3MpIHsKLSAgICAgICAgICAgIGlmIChpc0ZpZWxkVXBkYXRlZChjb2x1bW5JbmRleCkpIHsKLSAgICAgICAgICAgICAgICBOdW1iZXIgdmFsdWUgPSAoTnVtYmVyKWdldFVwZGF0ZWRGaWVsZChjb2x1bW5JbmRleCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlLnNob3J0VmFsdWUoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCiAgICAgICAgIHJldHVybiBtV2luZG93LmdldFNob3J0KG1Qb3MsIGNvbHVtbkluZGV4KTsKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgaW50IGdldEludChpbnQgY29sdW1uSW5kZXgpCi0gICAgeworICAgIHB1YmxpYyBpbnQgZ2V0SW50KGludCBjb2x1bW5JbmRleCkgewogICAgICAgICBjaGVja1Bvc2l0aW9uKCk7Ci0KLSAgICAgICAgc3luY2hyb25pemVkKG1VcGRhdGVkUm93cykgewotICAgICAgICAgICAgaWYgKGlzRmllbGRVcGRhdGVkKGNvbHVtbkluZGV4KSkgewotICAgICAgICAgICAgICAgIE51bWJlciB2YWx1ZSA9IChOdW1iZXIpZ2V0VXBkYXRlZEZpZWxkKGNvbHVtbkluZGV4KTsKLSAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWUuaW50VmFsdWUoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCiAgICAgICAgIHJldHVybiBtV2luZG93LmdldEludChtUG9zLCBjb2x1bW5JbmRleCk7CiAgICAgfQogCiAgICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGxvbmcgZ2V0TG9uZyhpbnQgY29sdW1uSW5kZXgpCi0gICAgeworICAgIHB1YmxpYyBsb25nIGdldExvbmcoaW50IGNvbHVtbkluZGV4KSB7CiAgICAgICAgIGNoZWNrUG9zaXRpb24oKTsKLQotICAgICAgICBzeW5jaHJvbml6ZWQobVVwZGF0ZWRSb3dzKSB7Ci0gICAgICAgICAgICBpZiAoaXNGaWVsZFVwZGF0ZWQoY29sdW1uSW5kZXgpKSB7Ci0gICAgICAgICAgICAgICAgTnVtYmVyIHZhbHVlID0gKE51bWJlcilnZXRVcGRhdGVkRmllbGQoY29sdW1uSW5kZXgpOwotICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZS5sb25nVmFsdWUoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCiAgICAgICAgIHJldHVybiBtV2luZG93LmdldExvbmcobVBvcywgY29sdW1uSW5kZXgpOwogICAgIH0KIAogICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBmbG9hdCBnZXRGbG9hdChpbnQgY29sdW1uSW5kZXgpCi0gICAgeworICAgIHB1YmxpYyBmbG9hdCBnZXRGbG9hdChpbnQgY29sdW1uSW5kZXgpIHsKICAgICAgICAgY2hlY2tQb3NpdGlvbigpOwotCi0gICAgICAgIHN5bmNocm9uaXplZChtVXBkYXRlZFJvd3MpIHsKLSAgICAgICAgICAgIGlmIChpc0ZpZWxkVXBkYXRlZChjb2x1bW5JbmRleCkpIHsKLSAgICAgICAgICAgICAgICBOdW1iZXIgdmFsdWUgPSAoTnVtYmVyKWdldFVwZGF0ZWRGaWVsZChjb2x1bW5JbmRleCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlLmZsb2F0VmFsdWUoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCiAgICAgICAgIHJldHVybiBtV2luZG93LmdldEZsb2F0KG1Qb3MsIGNvbHVtbkluZGV4KTsKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgZG91YmxlIGdldERvdWJsZShpbnQgY29sdW1uSW5kZXgpCi0gICAgeworICAgIHB1YmxpYyBkb3VibGUgZ2V0RG91YmxlKGludCBjb2x1bW5JbmRleCkgewogICAgICAgICBjaGVja1Bvc2l0aW9uKCk7Ci0KLSAgICAgICAgc3luY2hyb25pemVkKG1VcGRhdGVkUm93cykgewotICAgICAgICAgICAgaWYgKGlzRmllbGRVcGRhdGVkKGNvbHVtbkluZGV4KSkgewotICAgICAgICAgICAgICAgIE51bWJlciB2YWx1ZSA9IChOdW1iZXIpZ2V0VXBkYXRlZEZpZWxkKGNvbHVtbkluZGV4KTsKLSAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWUuZG91YmxlVmFsdWUoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCiAgICAgICAgIHJldHVybiBtV2luZG93LmdldERvdWJsZShtUG9zLCBjb2x1bW5JbmRleCk7CiAgICAgfQogCiAgICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gaXNOdWxsKGludCBjb2x1bW5JbmRleCkKLSAgICB7CisgICAgcHVibGljIGJvb2xlYW4gaXNOdWxsKGludCBjb2x1bW5JbmRleCkgewogICAgICAgICBjaGVja1Bvc2l0aW9uKCk7Ci0KLSAgICAgICAgc3luY2hyb25pemVkKG1VcGRhdGVkUm93cykgewotICAgICAgICAgICAgaWYgKGlzRmllbGRVcGRhdGVkKGNvbHVtbkluZGV4KSkgewotICAgICAgICAgICAgICAgIHJldHVybiBnZXRVcGRhdGVkRmllbGQoY29sdW1uSW5kZXgpID09IG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gbVdpbmRvdy5pc051bGwobVBvcywgY29sdW1uSW5kZXgpOworICAgICAgICByZXR1cm4gbVdpbmRvdy5nZXRUeXBlKG1Qb3MsIGNvbHVtbkluZGV4KSA9PSBDdXJzb3IuRklFTERfVFlQRV9OVUxMOwogICAgIH0KIAotICAgIHB1YmxpYyBib29sZWFuIGlzQmxvYihpbnQgY29sdW1uSW5kZXgpCi0gICAgewotICAgICAgICBjaGVja1Bvc2l0aW9uKCk7Ci0KLSAgICAgICAgc3luY2hyb25pemVkKG1VcGRhdGVkUm93cykgewotICAgICAgICAgICAgaWYgKGlzRmllbGRVcGRhdGVkKGNvbHVtbkluZGV4KSkgewotICAgICAgICAgICAgICAgIE9iamVjdCBvYmplY3QgPSBnZXRVcGRhdGVkRmllbGQoY29sdW1uSW5kZXgpOwotICAgICAgICAgICAgICAgIHJldHVybiBvYmplY3QgPT0gbnVsbCB8fCBvYmplY3QgaW5zdGFuY2VvZiBieXRlW107Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gbVdpbmRvdy5pc0Jsb2IobVBvcywgY29sdW1uSW5kZXgpOworICAgIC8qKgorICAgICAqIEBkZXByZWNhdGVkIFVzZSB7QGxpbmsgI2dldFR5cGV9CisgICAgICovCisgICAgQERlcHJlY2F0ZWQKKyAgICBwdWJsaWMgYm9vbGVhbiBpc0Jsb2IoaW50IGNvbHVtbkluZGV4KSB7CisgICAgICAgIHJldHVybiBnZXRUeXBlKGNvbHVtbkluZGV4KSA9PSBDdXJzb3IuRklFTERfVFlQRV9CTE9COwogICAgIH0KIAotICAgIHB1YmxpYyBib29sZWFuIGlzU3RyaW5nKGludCBjb2x1bW5JbmRleCkKLSAgICB7Ci0gICAgICAgIGNoZWNrUG9zaXRpb24oKTsKLQotICAgICAgICBzeW5jaHJvbml6ZWQobVVwZGF0ZWRSb3dzKSB7Ci0gICAgICAgICAgICBpZiAoaXNGaWVsZFVwZGF0ZWQoY29sdW1uSW5kZXgpKSB7Ci0gICAgICAgICAgICAgICAgT2JqZWN0IG9iamVjdCA9IGdldFVwZGF0ZWRGaWVsZChjb2x1bW5JbmRleCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG9iamVjdCA9PSBudWxsIHx8IG9iamVjdCBpbnN0YW5jZW9mIFN0cmluZzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBtV2luZG93LmlzU3RyaW5nKG1Qb3MsIGNvbHVtbkluZGV4KTsKKyAgICAvKioKKyAgICAgKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rICNnZXRUeXBlfQorICAgICAqLworICAgIEBEZXByZWNhdGVkCisgICAgcHVibGljIGJvb2xlYW4gaXNTdHJpbmcoaW50IGNvbHVtbkluZGV4KSB7CisgICAgICAgIHJldHVybiBnZXRUeXBlKGNvbHVtbkluZGV4KSA9PSBDdXJzb3IuRklFTERfVFlQRV9TVFJJTkc7CiAgICAgfQogCi0gICAgcHVibGljIGJvb2xlYW4gaXNMb25nKGludCBjb2x1bW5JbmRleCkKLSAgICB7Ci0gICAgICAgIGNoZWNrUG9zaXRpb24oKTsKLQotICAgICAgICBzeW5jaHJvbml6ZWQobVVwZGF0ZWRSb3dzKSB7Ci0gICAgICAgICAgICBpZiAoaXNGaWVsZFVwZGF0ZWQoY29sdW1uSW5kZXgpKSB7Ci0gICAgICAgICAgICAgICAgT2JqZWN0IG9iamVjdCA9IGdldFVwZGF0ZWRGaWVsZChjb2x1bW5JbmRleCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG9iamVjdCAhPSBudWxsICYmIChvYmplY3QgaW5zdGFuY2VvZiBJbnRlZ2VyIHx8IG9iamVjdCBpbnN0YW5jZW9mIExvbmcpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIG1XaW5kb3cuaXNMb25nKG1Qb3MsIGNvbHVtbkluZGV4KTsKKyAgICAvKioKKyAgICAgKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rICNnZXRUeXBlfQorICAgICAqLworICAgIEBEZXByZWNhdGVkCisgICAgcHVibGljIGJvb2xlYW4gaXNMb25nKGludCBjb2x1bW5JbmRleCkgeworICAgICAgICByZXR1cm4gZ2V0VHlwZShjb2x1bW5JbmRleCkgPT0gQ3Vyc29yLkZJRUxEX1RZUEVfSU5URUdFUjsKICAgICB9CiAKLSAgICBwdWJsaWMgYm9vbGVhbiBpc0Zsb2F0KGludCBjb2x1bW5JbmRleCkKLSAgICB7Ci0gICAgICAgIGNoZWNrUG9zaXRpb24oKTsKLQotICAgICAgICBzeW5jaHJvbml6ZWQobVVwZGF0ZWRSb3dzKSB7Ci0gICAgICAgICAgICBpZiAoaXNGaWVsZFVwZGF0ZWQoY29sdW1uSW5kZXgpKSB7Ci0gICAgICAgICAgICAgICAgT2JqZWN0IG9iamVjdCA9IGdldFVwZGF0ZWRGaWVsZChjb2x1bW5JbmRleCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG9iamVjdCAhPSBudWxsICYmIChvYmplY3QgaW5zdGFuY2VvZiBGbG9hdCB8fCBvYmplY3QgaW5zdGFuY2VvZiBEb3VibGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIG1XaW5kb3cuaXNGbG9hdChtUG9zLCBjb2x1bW5JbmRleCk7CisgICAgLyoqCisgICAgICogQGRlcHJlY2F0ZWQgVXNlIHtAbGluayAjZ2V0VHlwZX0KKyAgICAgKi8KKyAgICBARGVwcmVjYXRlZAorICAgIHB1YmxpYyBib29sZWFuIGlzRmxvYXQoaW50IGNvbHVtbkluZGV4KSB7CisgICAgICAgIHJldHVybiBnZXRUeXBlKGNvbHVtbkluZGV4KSA9PSBDdXJzb3IuRklFTERfVFlQRV9GTE9BVDsKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCBjaGVja1Bvc2l0aW9uKCkKLSAgICB7CisgICAgcHVibGljIGludCBnZXRUeXBlKGludCBjb2x1bW5JbmRleCkgeworICAgICAgICBjaGVja1Bvc2l0aW9uKCk7CisgICAgICAgIHJldHVybiBtV2luZG93LmdldFR5cGUobVBvcywgY29sdW1uSW5kZXgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIGNoZWNrUG9zaXRpb24oKSB7CiAgICAgICAgIHN1cGVyLmNoZWNrUG9zaXRpb24oKTsKICAgICAgICAgCiAgICAgICAgIGlmIChtV2luZG93ID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBTdGFsZURhdGFFeGNlcHRpb24oIkFjY2VzcyBjbG9zZWQgY3Vyc29yIik7CisgICAgICAgICAgICB0aHJvdyBuZXcgU3RhbGVEYXRhRXhjZXB0aW9uKCJBdHRlbXB0aW5nIHRvIGFjY2VzcyBhIGNsb3NlZCBjdXJzb3IiKTsKICAgICAgICAgfQogICAgIH0KIApkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2UvQnVsa0N1cnNvck5hdGl2ZS5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2UvQnVsa0N1cnNvck5hdGl2ZS5qYXZhCmluZGV4IGJhYTk0ZDguLmZhNjJkNjkgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL0J1bGtDdXJzb3JOYXRpdmUuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9CdWxrQ3Vyc29yTmF0aXZlLmphdmEKQEAgLTE3LDEzICsxNywxMCBAQAogcGFja2FnZSBhbmRyb2lkLmRhdGFiYXNlOwogCiBpbXBvcnQgYW5kcm9pZC5vcy5CaW5kZXI7Ci1pbXBvcnQgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb247CitpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CiBpbXBvcnQgYW5kcm9pZC5vcy5JQmluZGVyOwogaW1wb3J0IGFuZHJvaWQub3MuUGFyY2VsOwotaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbjsKIAogLyoqCiAgKiBOYXRpdmUgaW1wbGVtZW50YXRpb24gb2YgdGhlIGJ1bGsgY3Vyc29yLiBUaGlzIGlzIG9ubHkgZm9yIHVzZSBpbiBpbXBsZW1lbnRpbmcKQEAgLTEyMCwyNiArMTE3LDYgQEAKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgY2FzZSBVUERBVEVfUk9XU19UUkFOU0FDVElPTjogewotICAgICAgICAgICAgICAgICAgICBkYXRhLmVuZm9yY2VJbnRlcmZhY2UoSUJ1bGtDdXJzb3IuZGVzY3JpcHRvcik7Ci0gICAgICAgICAgICAgICAgICAgIC8vIFRPRE8gLSB3aGF0IENsYXNzTG9hZGVyIHNob3VsZCBiZSBwYXNzZWQgdG8gcmVhZEhhc2hNYXA/Ci0gICAgICAgICAgICAgICAgICAgIC8vIFRPRE8gLSBzd2l0Y2ggdG8gQnVuZGxlCi0gICAgICAgICAgICAgICAgICAgIEhhc2hNYXA8TG9uZywgTWFwPFN0cmluZywgT2JqZWN0Pj4gdmFsdWVzID0gZGF0YS5yZWFkSGFzaE1hcChudWxsKTsKLSAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiByZXN1bHQgPSB1cGRhdGVSb3dzKHZhbHVlcyk7Ci0gICAgICAgICAgICAgICAgICAgIHJlcGx5LndyaXRlTm9FeGNlcHRpb24oKTsKLSAgICAgICAgICAgICAgICAgICAgcmVwbHkud3JpdGVJbnQoKHJlc3VsdCA9PSB0cnVlID8gMSA6IDApKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgY2FzZSBERUxFVEVfUk9XX1RSQU5TQUNUSU9OOiB7Ci0gICAgICAgICAgICAgICAgICAgIGRhdGEuZW5mb3JjZUludGVyZmFjZShJQnVsa0N1cnNvci5kZXNjcmlwdG9yKTsKLSAgICAgICAgICAgICAgICAgICAgaW50IHBvc2l0aW9uID0gZGF0YS5yZWFkSW50KCk7Ci0gICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gcmVzdWx0ID0gZGVsZXRlUm93KHBvc2l0aW9uKTsKLSAgICAgICAgICAgICAgICAgICAgcmVwbHkud3JpdGVOb0V4Y2VwdGlvbigpOwotICAgICAgICAgICAgICAgICAgICByZXBseS53cml0ZUludCgocmVzdWx0ID09IHRydWUgPyAxIDogMCkpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0KICAgICAgICAgICAgICAgICBjYXNlIE9OX01PVkVfVFJBTlNBQ1RJT046IHsKICAgICAgICAgICAgICAgICAgICAgZGF0YS5lbmZvcmNlSW50ZXJmYWNlKElCdWxrQ3Vyc29yLmRlc2NyaXB0b3IpOwogICAgICAgICAgICAgICAgICAgICBpbnQgcG9zaXRpb24gPSBkYXRhLnJlYWRJbnQoKTsKQEAgLTM0Myw0OCArMzIwLDYgQEAKICAgICAgICAgcmV0dXJuIGNvdW50OwogICAgIH0KIAotICAgIHB1YmxpYyBib29sZWFuIHVwZGF0ZVJvd3MoTWFwIHZhbHVlcykgdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgUGFyY2VsIGRhdGEgPSBQYXJjZWwub2J0YWluKCk7Ci0gICAgICAgIFBhcmNlbCByZXBseSA9IFBhcmNlbC5vYnRhaW4oKTsKLQotICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUJ1bGtDdXJzb3IuZGVzY3JpcHRvcik7Ci0KLSAgICAgICAgZGF0YS53cml0ZU1hcCh2YWx1ZXMpOwotCi0gICAgICAgIG1SZW1vdGUudHJhbnNhY3QoVVBEQVRFX1JPV1NfVFJBTlNBQ1RJT04sIGRhdGEsIHJlcGx5LCAwKTsKLQotICAgICAgICBEYXRhYmFzZVV0aWxzLnJlYWRFeGNlcHRpb25Gcm9tUGFyY2VsKHJlcGx5KTsKLSAgICAgICAgCi0gICAgICAgIGJvb2xlYW4gcmVzdWx0ID0gKHJlcGx5LnJlYWRJbnQoKSA9PSAxID8gdHJ1ZSA6IGZhbHNlKTsKLQotICAgICAgICBkYXRhLnJlY3ljbGUoKTsKLSAgICAgICAgcmVwbHkucmVjeWNsZSgpOwotCi0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gZGVsZXRlUm93KGludCBwb3NpdGlvbikgdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgUGFyY2VsIGRhdGEgPSBQYXJjZWwub2J0YWluKCk7Ci0gICAgICAgIFBhcmNlbCByZXBseSA9IFBhcmNlbC5vYnRhaW4oKTsKLQotICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUJ1bGtDdXJzb3IuZGVzY3JpcHRvcik7Ci0KLSAgICAgICAgZGF0YS53cml0ZUludChwb3NpdGlvbik7Ci0KLSAgICAgICAgbVJlbW90ZS50cmFuc2FjdChERUxFVEVfUk9XX1RSQU5TQUNUSU9OLCBkYXRhLCByZXBseSwgMCk7Ci0KLSAgICAgICAgRGF0YWJhc2VVdGlscy5yZWFkRXhjZXB0aW9uRnJvbVBhcmNlbChyZXBseSk7Ci0gICAgICAgIAotICAgICAgICBib29sZWFuIHJlc3VsdCA9IChyZXBseS5yZWFkSW50KCkgPT0gMSA/IHRydWUgOiBmYWxzZSk7Ci0KLSAgICAgICAgZGF0YS5yZWN5Y2xlKCk7Ci0gICAgICAgIHJlcGx5LnJlY3ljbGUoKTsKLQotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQogICAgIHB1YmxpYyBib29sZWFuIGdldFdhbnRzQWxsT25Nb3ZlQ2FsbHMoKSB0aHJvd3MgUmVtb3RlRXhjZXB0aW9uIHsKICAgICAgICAgUGFyY2VsIGRhdGEgPSBQYXJjZWwub2J0YWluKCk7CiAgICAgICAgIFBhcmNlbCByZXBseSA9IFBhcmNlbC5vYnRhaW4oKTsKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL0J1bGtDdXJzb3JUb0N1cnNvckFkYXB0b3IuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL0J1bGtDdXJzb3JUb0N1cnNvckFkYXB0b3IuamF2YQppbmRleCAxNDY5ZWEyLi4yY2IyYWVjIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9CdWxrQ3Vyc29yVG9DdXJzb3JBZGFwdG9yLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2UvQnVsa0N1cnNvclRvQ3Vyc29yQWRhcHRvci5qYXZhCkBAIC0xNiwxMiArMTYsMTAgQEAKIAogcGFja2FnZSBhbmRyb2lkLmRhdGFiYXNlOwogCi1pbXBvcnQgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb247CiBpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CitpbXBvcnQgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb247CiBpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKIAotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KIC8qKgogICogQWRhcHRzIGFuIHtAbGluayBJQnVsa0N1cnNvcn0gdG8gYSB7QGxpbmsgQ3Vyc29yfSBmb3IgdXNlIGluIHRoZSBsb2NhbAogICogcHJvY2Vzcy4KQEAgLTE3NCwzOCArMTcyLDYgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIC8qKgotICAgICAqIEBoaWRlCi0gICAgICogQGRlcHJlY2F0ZWQKLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBkZWxldGVSb3coKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBib29sZWFuIHJlc3VsdCA9IG1CdWxrQ3Vyc29yLmRlbGV0ZVJvdyhtUG9zKTsKLSAgICAgICAgICAgIGlmIChyZXN1bHQgIT0gZmFsc2UpIHsKLSAgICAgICAgICAgICAgICAvLyBUaGUgd2luZG93IGNvbnRhaW5zIHRoZSBvbGQgdmFsdWUsIGRpc2NhcmQgaXQKLSAgICAgICAgICAgICAgICBtV2luZG93ID0gbnVsbDsKLSAgICAKLSAgICAgICAgICAgICAgICAvLyBGaXggdXAgdGhlIHBvc2l0aW9uCi0gICAgICAgICAgICAgICAgbUNvdW50ID0gbUJ1bGtDdXJzb3IuY291bnQoKTsKLSAgICAgICAgICAgICAgICBpZiAobVBvcyA8IG1Db3VudCkgewotICAgICAgICAgICAgICAgICAgICBpbnQgb2xkUG9zID0gbVBvczsKLSAgICAgICAgICAgICAgICAgICAgbVBvcyA9IC0xOwotICAgICAgICAgICAgICAgICAgICBtb3ZlVG9Qb3NpdGlvbihvbGRQb3MpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIG1Qb3MgPSBtQ291bnQ7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLy8gU2VuZCB0aGUgY2hhbmdlIG5vdGlmaWNhdGlvbgotICAgICAgICAgICAgICAgIG9uQ2hhbmdlKHRydWUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICBMb2cuZShUQUcsICJVbmFibGUgdG8gZGVsZXRlIHJvdyBiZWNhdXNlIHRoZSByZW1vdGUgcHJvY2VzcyBpcyBkZWFkIik7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICB9Ci0KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgU3RyaW5nW10gZ2V0Q29sdW1uTmFtZXMoKSB7CiAgICAgICAgIGlmIChtQ29sdW1ucyA9PSBudWxsKSB7CkBAIC0yMTksNDQgKzE4NSw2IEBACiAgICAgICAgIHJldHVybiBtQ29sdW1uczsKICAgICB9CiAKLSAgICAvKioKLSAgICAgKiBAaGlkZQotICAgICAqIEBkZXByZWNhdGVkCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gY29tbWl0VXBkYXRlcyhNYXA8PyBleHRlbmRzIExvbmcsCi0gICAgICAgICAgICA/IGV4dGVuZHMgTWFwPFN0cmluZyxPYmplY3Q+PiBhZGRpdGlvbmFsVmFsdWVzKSB7Ci0gICAgICAgIGlmICghc3VwcG9ydHNVcGRhdGVzKCkpIHsKLSAgICAgICAgICAgIExvZy5lKFRBRywgImNvbW1pdFVwZGF0ZXMgbm90IHN1cHBvcnRlZCBvbiB0aGlzIGN1cnNvciwgZGlkIHlvdSBpbmNsdWRlIHRoZSBfaWQgY29sdW1uPyIpOwotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgc3luY2hyb25pemVkKG1VcGRhdGVkUm93cykgewotICAgICAgICAgICAgaWYgKGFkZGl0aW9uYWxWYWx1ZXMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1VcGRhdGVkUm93cy5wdXRBbGwoYWRkaXRpb25hbFZhbHVlcyk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChtVXBkYXRlZFJvd3Muc2l6ZSgpIDw9IDApIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgYm9vbGVhbiByZXN1bHQgPSBtQnVsa0N1cnNvci51cGRhdGVSb3dzKG1VcGRhdGVkUm93cyk7Ci0gICAgCi0gICAgICAgICAgICAgICAgaWYgKHJlc3VsdCA9PSB0cnVlKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1VcGRhdGVkUm93cy5jbGVhcigpOwotCi0gICAgICAgICAgICAgICAgICAgIC8vIFNlbmQgdGhlIGNoYW5nZSBub3RpZmljYXRpb24KLSAgICAgICAgICAgICAgICAgICAgb25DaGFuZ2UodHJ1ZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgICAgICBMb2cuZShUQUcsICJVbmFibGUgdG8gY29tbWl0IHVwZGF0ZXMgYmVjYXVzZSB0aGUgcmVtb3RlIHByb2Nlc3MgaXMgZGVhZCIpOwotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBCdW5kbGUgZ2V0RXh0cmFzKCkgewogICAgICAgICB0cnkgewpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2UvQ3Vyc29yLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9DdXJzb3IuamF2YQppbmRleCA2NTM5MTU2Li5jMDNjNTg2IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9DdXJzb3IuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9DdXJzb3IuamF2YQpAQCAtMzAsNiArMzAsMjUgQEAKICAqIHRocmVhZHMgc2hvdWxkIHBlcmZvcm0gaXRzIG93biBzeW5jaHJvbml6YXRpb24gd2hlbiB1c2luZyB0aGUgQ3Vyc29yLgogICovCiBwdWJsaWMgaW50ZXJmYWNlIEN1cnNvciB7CisgICAgLyoKKyAgICAgKiBWYWx1ZXMgcmV0dXJuZWQgYnkge0BsaW5rICNnZXRUeXBlKGludCl9LgorICAgICAqIFRoZXNlIHNob3VsZCBiZSBjb25zaXN0ZW50IHdpdGggdGhlIGNvcnJlc3BvbmRpbmcgdHlwZXMgZGVmaW5lZCBpbiBDdXJzb3JXaW5kb3cuaAorICAgICAqLworICAgIC8qKiBWYWx1ZSByZXR1cm5lZCBieSB7QGxpbmsgI2dldFR5cGUoaW50KX0gaWYgdGhlIHNwZWNpZmllZCBjb2x1bW4gaXMgbnVsbCAqLworICAgIHN0YXRpYyBmaW5hbCBpbnQgRklFTERfVFlQRV9OVUxMID0gMDsKKworICAgIC8qKiBWYWx1ZSByZXR1cm5lZCBieSB7QGxpbmsgI2dldFR5cGUoaW50KX0gaWYgdGhlIHNwZWNpZmllZCAgY29sdW1uIHR5cGUgaXMgaW50ZWdlciAqLworICAgIHN0YXRpYyBmaW5hbCBpbnQgRklFTERfVFlQRV9JTlRFR0VSID0gMTsKKworICAgIC8qKiBWYWx1ZSByZXR1cm5lZCBieSB7QGxpbmsgI2dldFR5cGUoaW50KX0gaWYgdGhlIHNwZWNpZmllZCBjb2x1bW4gdHlwZSBpcyBmbG9hdCAqLworICAgIHN0YXRpYyBmaW5hbCBpbnQgRklFTERfVFlQRV9GTE9BVCA9IDI7CisKKyAgICAvKiogVmFsdWUgcmV0dXJuZWQgYnkge0BsaW5rICNnZXRUeXBlKGludCl9IGlmIHRoZSBzcGVjaWZpZWQgY29sdW1uIHR5cGUgaXMgc3RyaW5nICovCisgICAgc3RhdGljIGZpbmFsIGludCBGSUVMRF9UWVBFX1NUUklORyA9IDM7CisKKyAgICAvKiogVmFsdWUgcmV0dXJuZWQgYnkge0BsaW5rICNnZXRUeXBlKGludCl9IGlmIHRoZSBzcGVjaWZpZWQgY29sdW1uIHR5cGUgaXMgYmxvYiAqLworICAgIHN0YXRpYyBmaW5hbCBpbnQgRklFTERfVFlQRV9CTE9CID0gNDsKKwogICAgIC8qKgogICAgICAqIFJldHVybnMgdGhlIG51bWJlcnMgb2Ygcm93cyBpbiB0aGUgY3Vyc29yLgogICAgICAqCkBAIC0xNDYsMjIgKzE2NSw2IEBACiAgICAgYm9vbGVhbiBpc0FmdGVyTGFzdCgpOwogCiAgICAgLyoqCi0gICAgICogUmVtb3ZlcyB0aGUgcm93IGF0IHRoZSBjdXJyZW50IGN1cnNvciBwb3NpdGlvbiBmcm9tIHRoZSB1bmRlcmx5aW5nIGRhdGEKLSAgICAgKiBzdG9yZS4gQWZ0ZXIgdGhpcyBtZXRob2QgcmV0dXJucyB0aGUgY3Vyc29yIHdpbGwgYmUgcG9pbnRpbmcgdG8gdGhlIHJvdwotICAgICAqIGFmdGVyIHRoZSByb3cgdGhhdCBpcyBkZWxldGVkLiBUaGlzIGhhcyB0aGUgc2lkZSBlZmZlY3Qgb2YgZGVjcmVtZW50aW5nCi0gICAgICogdGhlIHJlc3VsdCBvZiBjb3VudCgpIGJ5IG9uZS4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGUgcXVlcnkgbXVzdCBoYXZlIHRoZSByb3cgSUQgY29sdW1uIGluIGl0cyBzZWxlY3Rpb24sIG90aGVyd2lzZSB0aGlzCi0gICAgICogY2FsbCB3aWxsIGZhaWwuCi0gICAgICogCi0gICAgICogQGhpZGUKLSAgICAgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHJlY29yZCB3YXMgc3VjY2Vzc2Z1bGx5IGRlbGV0ZWQuCi0gICAgICogQGRlcHJlY2F0ZWQgdXNlIHtAbGluayBDb250ZW50UmVzb2x2ZXIjZGVsZXRlKFVyaSwgU3RyaW5nLCBTdHJpbmdbXSl9Ci0gICAgICovCi0gICAgQERlcHJlY2F0ZWQKLSAgICBib29sZWFuIGRlbGV0ZVJvdygpOwotCi0gICAgLyoqCiAgICAgICogUmV0dXJucyB0aGUgemVyby1iYXNlZCBpbmRleCBmb3IgdGhlIGdpdmVuIGNvbHVtbiBuYW1lLCBvciAtMSBpZiB0aGUgY29sdW1uIGRvZXNuJ3QgZXhpc3QuCiAgICAgICogSWYgeW91IGV4cGVjdCB0aGUgY29sdW1uIHRvIGV4aXN0IHVzZSB7QGxpbmsgI2dldENvbHVtbkluZGV4T3JUaHJvdyhTdHJpbmcpfSBpbnN0ZWFkLCB3aGljaAogICAgICAqIHdpbGwgbWFrZSB0aGUgZXJyb3IgbW9yZSBjbGVhci4KQEAgLTI5NSw2ICsyOTgsMjcgQEAKICAgICBkb3VibGUgZ2V0RG91YmxlKGludCBjb2x1bW5JbmRleCk7CiAKICAgICAvKioKKyAgICAgKiBSZXR1cm5zIGRhdGEgdHlwZSBvZiB0aGUgZ2l2ZW4gY29sdW1uJ3MgdmFsdWUuCisgICAgICogVGhlIHByZWZlcnJlZCB0eXBlIG9mIHRoZSBjb2x1bW4gaXMgcmV0dXJuZWQgYnV0IHRoZSBkYXRhIG1heSBiZSBjb252ZXJ0ZWQgdG8gb3RoZXIgdHlwZXMKKyAgICAgKiBhcyBkb2N1bWVudGVkIGluIHRoZSBnZXQtdHlwZSBtZXRob2RzIHN1Y2ggYXMge0BsaW5rICNnZXRJbnQoaW50KX0sIHtAbGluayAjZ2V0RmxvYXQoaW50KX0KKyAgICAgKiBldGMuCisgICAgICo8cD4KKyAgICAgKiBSZXR1cm5lZCBjb2x1bW4gdHlwZXMgYXJlCisgICAgICogPHVsPgorICAgICAqICAgPGxpPntAbGluayAjRklFTERfVFlQRV9OVUxMfTwvbGk+CisgICAgICogICA8bGk+e0BsaW5rICNGSUVMRF9UWVBFX0lOVEVHRVJ9PC9saT4KKyAgICAgKiAgIDxsaT57QGxpbmsgI0ZJRUxEX1RZUEVfRkxPQVR9PC9saT4KKyAgICAgKiAgIDxsaT57QGxpbmsgI0ZJRUxEX1RZUEVfU1RSSU5HfTwvbGk+CisgICAgICogICA8bGk+e0BsaW5rICNGSUVMRF9UWVBFX0JMT0J9PC9saT4KKyAgICAgKjwvdWw+CisgICAgICo8L3A+CisgICAgICoKKyAgICAgKiBAcGFyYW0gY29sdW1uSW5kZXggdGhlIHplcm8tYmFzZWQgaW5kZXggb2YgdGhlIHRhcmdldCBjb2x1bW4uCisgICAgICogQHJldHVybiBjb2x1bW4gdmFsdWUgdHlwZQorICAgICAqLworICAgIGludCBnZXRUeXBlKGludCBjb2x1bW5JbmRleCk7CisKKyAgICAvKioKICAgICAgKiBSZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSB2YWx1ZSBpbiB0aGUgaW5kaWNhdGVkIGNvbHVtbiBpcyBudWxsLgogICAgICAqCiAgICAgICogQHBhcmFtIGNvbHVtbkluZGV4IHRoZSB6ZXJvLWJhc2VkIGluZGV4IG9mIHRoZSB0YXJnZXQgY29sdW1uLgpAQCAtMzAzLDE4OCArMzI3LDYgQEAKICAgICBib29sZWFuIGlzTnVsbChpbnQgY29sdW1uSW5kZXgpOwogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgY3Vyc29yIHN1cHBvcnRzIHVwZGF0ZXMuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIGN1cnNvciBzdXBwb3J0cyB1cGRhdGVzLgotICAgICAqIEBoaWRlCi0gICAgICogQGRlcHJlY2F0ZWQgdXNlIHRoZSB7QGxpbmsgQ29udGVudFJlc29sdmVyfSB1cGRhdGUgbWV0aG9kcyBpbnN0ZWFkIG9mIHRoZSBDdXJzb3IKLSAgICAgKiB1cGRhdGUgbWV0aG9kcwotICAgICAqLwotICAgIEBEZXByZWNhdGVkCi0gICAgYm9vbGVhbiBzdXBwb3J0c1VwZGF0ZXMoKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlcmUgYXJlIHBlbmRpbmcgdXBkYXRlcyB0aGF0IGhhdmUgbm90IHlldCBiZWVuIGNvbW1pdHRlZC4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZXJlIGFyZSBwZW5kaW5nIHVwZGF0ZXMgdGhhdCBoYXZlIG5vdCB5ZXQgYmVlbiBjb21taXR0ZWQuCi0gICAgICogQGhpZGUKLSAgICAgKiBAZGVwcmVjYXRlZCB1c2UgdGhlIHtAbGluayBDb250ZW50UmVzb2x2ZXJ9IHVwZGF0ZSBtZXRob2RzIGluc3RlYWQgb2YgdGhlIEN1cnNvcgotICAgICAqIHVwZGF0ZSBtZXRob2RzCi0gICAgICovCi0gICAgQERlcHJlY2F0ZWQKLSAgICBib29sZWFuIGhhc1VwZGF0ZXMoKTsKLQotICAgIC8qKgotICAgICAqIFVwZGF0ZXMgdGhlIHZhbHVlIGZvciB0aGUgZ2l2ZW4gY29sdW1uIGluIHRoZSByb3cgdGhlIGN1cnNvciBpcwotICAgICAqIGN1cnJlbnRseSBwb2ludGluZyBhdC4gVXBkYXRlcyBhcmUgbm90IGNvbW1pdHRlZCB0byB0aGUgYmFja2luZyBzdG9yZQotICAgICAqIHVudGlsIHtAbGluayAjY29tbWl0VXBkYXRlcygpfSBpcyBjYWxsZWQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gY29sdW1uSW5kZXggdGhlIHplcm8tYmFzZWQgaW5kZXggb2YgdGhlIHRhcmdldCBjb2x1bW4uCi0gICAgICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUuCi0gICAgICogQHJldHVybiB3aGV0aGVyIHRoZSBvcGVyYXRpb24gc3VjY2VlZGVkLgotICAgICAqIEBoaWRlCi0gICAgICogQGRlcHJlY2F0ZWQgdXNlIHRoZSB7QGxpbmsgQ29udGVudFJlc29sdmVyfSB1cGRhdGUgbWV0aG9kcyBpbnN0ZWFkIG9mIHRoZSBDdXJzb3IKLSAgICAgKiB1cGRhdGUgbWV0aG9kcwotICAgICAqLwotICAgIEBEZXByZWNhdGVkCi0gICAgYm9vbGVhbiB1cGRhdGVCbG9iKGludCBjb2x1bW5JbmRleCwgYnl0ZVtdIHZhbHVlKTsKLQotICAgIC8qKgotICAgICAqIFVwZGF0ZXMgdGhlIHZhbHVlIGZvciB0aGUgZ2l2ZW4gY29sdW1uIGluIHRoZSByb3cgdGhlIGN1cnNvciBpcwotICAgICAqIGN1cnJlbnRseSBwb2ludGluZyBhdC4gVXBkYXRlcyBhcmUgbm90IGNvbW1pdHRlZCB0byB0aGUgYmFja2luZyBzdG9yZQotICAgICAqIHVudGlsIHtAbGluayAjY29tbWl0VXBkYXRlcygpfSBpcyBjYWxsZWQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gY29sdW1uSW5kZXggdGhlIHplcm8tYmFzZWQgaW5kZXggb2YgdGhlIHRhcmdldCBjb2x1bW4uCi0gICAgICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUuCi0gICAgICogQHJldHVybiB3aGV0aGVyIHRoZSBvcGVyYXRpb24gc3VjY2VlZGVkLgotICAgICAqIEBoaWRlCi0gICAgICogQGRlcHJlY2F0ZWQgdXNlIHRoZSB7QGxpbmsgQ29udGVudFJlc29sdmVyfSB1cGRhdGUgbWV0aG9kcyBpbnN0ZWFkIG9mIHRoZSBDdXJzb3IKLSAgICAgKiB1cGRhdGUgbWV0aG9kcwotICAgICAqLwotICAgIEBEZXByZWNhdGVkCi0gICAgYm9vbGVhbiB1cGRhdGVTdHJpbmcoaW50IGNvbHVtbkluZGV4LCBTdHJpbmcgdmFsdWUpOwotCi0gICAgLyoqCi0gICAgICogVXBkYXRlcyB0aGUgdmFsdWUgZm9yIHRoZSBnaXZlbiBjb2x1bW4gaW4gdGhlIHJvdyB0aGUgY3Vyc29yIGlzCi0gICAgICogY3VycmVudGx5IHBvaW50aW5nIGF0LiBVcGRhdGVzIGFyZSBub3QgY29tbWl0dGVkIHRvIHRoZSBiYWNraW5nIHN0b3JlCi0gICAgICogdW50aWwge0BsaW5rICNjb21taXRVcGRhdGVzKCl9IGlzIGNhbGxlZC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBjb2x1bW5JbmRleCB0aGUgemVyby1iYXNlZCBpbmRleCBvZiB0aGUgdGFyZ2V0IGNvbHVtbi4KLSAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZS4KLSAgICAgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIG9wZXJhdGlvbiBzdWNjZWVkZWQuCi0gICAgICogQGhpZGUKLSAgICAgKiBAZGVwcmVjYXRlZCB1c2UgdGhlIHtAbGluayBDb250ZW50UmVzb2x2ZXJ9IHVwZGF0ZSBtZXRob2RzIGluc3RlYWQgb2YgdGhlIEN1cnNvcgotICAgICAqIHVwZGF0ZSBtZXRob2RzCi0gICAgICovCi0gICAgQERlcHJlY2F0ZWQKLSAgICBib29sZWFuIHVwZGF0ZVNob3J0KGludCBjb2x1bW5JbmRleCwgc2hvcnQgdmFsdWUpOwotCi0gICAgLyoqCi0gICAgICogVXBkYXRlcyB0aGUgdmFsdWUgZm9yIHRoZSBnaXZlbiBjb2x1bW4gaW4gdGhlIHJvdyB0aGUgY3Vyc29yIGlzCi0gICAgICogY3VycmVudGx5IHBvaW50aW5nIGF0LiBVcGRhdGVzIGFyZSBub3QgY29tbWl0dGVkIHRvIHRoZSBiYWNraW5nIHN0b3JlCi0gICAgICogdW50aWwge0BsaW5rICNjb21taXRVcGRhdGVzKCl9IGlzIGNhbGxlZC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBjb2x1bW5JbmRleCB0aGUgemVyby1iYXNlZCBpbmRleCBvZiB0aGUgdGFyZ2V0IGNvbHVtbi4KLSAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZS4KLSAgICAgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIG9wZXJhdGlvbiBzdWNjZWVkZWQuCi0gICAgICogQGhpZGUKLSAgICAgKiBAZGVwcmVjYXRlZCB1c2UgdGhlIHtAbGluayBDb250ZW50UmVzb2x2ZXJ9IHVwZGF0ZSBtZXRob2RzIGluc3RlYWQgb2YgdGhlIEN1cnNvcgotICAgICAqIHVwZGF0ZSBtZXRob2RzCi0gICAgICovCi0gICAgQERlcHJlY2F0ZWQKLSAgICBib29sZWFuIHVwZGF0ZUludChpbnQgY29sdW1uSW5kZXgsIGludCB2YWx1ZSk7Ci0KLSAgICAvKioKLSAgICAgKiBVcGRhdGVzIHRoZSB2YWx1ZSBmb3IgdGhlIGdpdmVuIGNvbHVtbiBpbiB0aGUgcm93IHRoZSBjdXJzb3IgaXMKLSAgICAgKiBjdXJyZW50bHkgcG9pbnRpbmcgYXQuIFVwZGF0ZXMgYXJlIG5vdCBjb21taXR0ZWQgdG8gdGhlIGJhY2tpbmcgc3RvcmUKLSAgICAgKiB1bnRpbCB7QGxpbmsgI2NvbW1pdFVwZGF0ZXMoKX0gaXMgY2FsbGVkLgotICAgICAqCi0gICAgICogQHBhcmFtIGNvbHVtbkluZGV4IHRoZSB6ZXJvLWJhc2VkIGluZGV4IG9mIHRoZSB0YXJnZXQgY29sdW1uLgotICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlLgotICAgICAqIEByZXR1cm4gd2hldGhlciB0aGUgb3BlcmF0aW9uIHN1Y2NlZWRlZC4KLSAgICAgKiBAaGlkZQotICAgICAqIEBkZXByZWNhdGVkIHVzZSB0aGUge0BsaW5rIENvbnRlbnRSZXNvbHZlcn0gdXBkYXRlIG1ldGhvZHMgaW5zdGVhZCBvZiB0aGUgQ3Vyc29yCi0gICAgICogdXBkYXRlIG1ldGhvZHMKLSAgICAgKi8KLSAgICBARGVwcmVjYXRlZAotICAgIGJvb2xlYW4gdXBkYXRlTG9uZyhpbnQgY29sdW1uSW5kZXgsIGxvbmcgdmFsdWUpOwotCi0gICAgLyoqCi0gICAgICogVXBkYXRlcyB0aGUgdmFsdWUgZm9yIHRoZSBnaXZlbiBjb2x1bW4gaW4gdGhlIHJvdyB0aGUgY3Vyc29yIGlzCi0gICAgICogY3VycmVudGx5IHBvaW50aW5nIGF0LiBVcGRhdGVzIGFyZSBub3QgY29tbWl0dGVkIHRvIHRoZSBiYWNraW5nIHN0b3JlCi0gICAgICogdW50aWwge0BsaW5rICNjb21taXRVcGRhdGVzKCl9IGlzIGNhbGxlZC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBjb2x1bW5JbmRleCB0aGUgemVyby1iYXNlZCBpbmRleCBvZiB0aGUgdGFyZ2V0IGNvbHVtbi4KLSAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZS4KLSAgICAgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIG9wZXJhdGlvbiBzdWNjZWVkZWQuCi0gICAgICogQGhpZGUKLSAgICAgKiBAZGVwcmVjYXRlZCB1c2UgdGhlIHtAbGluayBDb250ZW50UmVzb2x2ZXJ9IHVwZGF0ZSBtZXRob2RzIGluc3RlYWQgb2YgdGhlIEN1cnNvcgotICAgICAqIHVwZGF0ZSBtZXRob2RzCi0gICAgICovCi0gICAgQERlcHJlY2F0ZWQKLSAgICBib29sZWFuIHVwZGF0ZUZsb2F0KGludCBjb2x1bW5JbmRleCwgZmxvYXQgdmFsdWUpOwotCi0gICAgLyoqCi0gICAgICogVXBkYXRlcyB0aGUgdmFsdWUgZm9yIHRoZSBnaXZlbiBjb2x1bW4gaW4gdGhlIHJvdyB0aGUgY3Vyc29yIGlzCi0gICAgICogY3VycmVudGx5IHBvaW50aW5nIGF0LiBVcGRhdGVzIGFyZSBub3QgY29tbWl0dGVkIHRvIHRoZSBiYWNraW5nIHN0b3JlCi0gICAgICogdW50aWwge0BsaW5rICNjb21taXRVcGRhdGVzKCl9IGlzIGNhbGxlZC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBjb2x1bW5JbmRleCB0aGUgemVyby1iYXNlZCBpbmRleCBvZiB0aGUgdGFyZ2V0IGNvbHVtbi4KLSAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZS4KLSAgICAgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIG9wZXJhdGlvbiBzdWNjZWVkZWQuCi0gICAgICogQGhpZGUKLSAgICAgKiBAZGVwcmVjYXRlZCB1c2UgdGhlIHtAbGluayBDb250ZW50UmVzb2x2ZXJ9IHVwZGF0ZSBtZXRob2RzIGluc3RlYWQgb2YgdGhlIEN1cnNvcgotICAgICAqIHVwZGF0ZSBtZXRob2RzCi0gICAgICovCi0gICAgQERlcHJlY2F0ZWQKLSAgICBib29sZWFuIHVwZGF0ZURvdWJsZShpbnQgY29sdW1uSW5kZXgsIGRvdWJsZSB2YWx1ZSk7Ci0KLSAgICAvKioKLSAgICAgKiBSZW1vdmVzIHRoZSB2YWx1ZSBmb3IgdGhlIGdpdmVuIGNvbHVtbiBpbiB0aGUgcm93IHRoZSBjdXJzb3IgaXMKLSAgICAgKiBjdXJyZW50bHkgcG9pbnRpbmcgYXQuIFVwZGF0ZXMgYXJlIG5vdCBjb21taXR0ZWQgdG8gdGhlIGJhY2tpbmcgc3RvcmUKLSAgICAgKiB1bnRpbCB7QGxpbmsgI2NvbW1pdFVwZGF0ZXMoKX0gaXMgY2FsbGVkLgotICAgICAqCi0gICAgICogQHBhcmFtIGNvbHVtbkluZGV4IHRoZSB6ZXJvLWJhc2VkIGluZGV4IG9mIHRoZSB0YXJnZXQgY29sdW1uLgotICAgICAqIEByZXR1cm4gd2hldGhlciB0aGUgb3BlcmF0aW9uIHN1Y2NlZWRlZC4KLSAgICAgKiBAaGlkZQotICAgICAqIEBkZXByZWNhdGVkIHVzZSB0aGUge0BsaW5rIENvbnRlbnRSZXNvbHZlcn0gdXBkYXRlIG1ldGhvZHMgaW5zdGVhZCBvZiB0aGUgQ3Vyc29yCi0gICAgICogdXBkYXRlIG1ldGhvZHMKLSAgICAgKi8KLSAgICBARGVwcmVjYXRlZAotICAgIGJvb2xlYW4gdXBkYXRlVG9OdWxsKGludCBjb2x1bW5JbmRleCk7Ci0KLSAgICAvKioKLSAgICAgKiBBdG9taWNhbGx5IGNvbW1pdHMgYWxsIHVwZGF0ZXMgdG8gdGhlIGJhY2tpbmcgc3RvcmUuIEFmdGVyIGNvbXBsZXRpb24sCi0gICAgICogdGhpcyBtZXRob2QgbGVhdmVzIHRoZSBkYXRhIGluIGFuIGluY29uc2lzdGVudCBzdGF0ZSBhbmQgeW91IHNob3VsZCBjYWxsCi0gICAgICoge0BsaW5rICNyZXF1ZXJ5fSBiZWZvcmUgcmVhZGluZyBkYXRhIGZyb20gdGhlIGN1cnNvciBhZ2Fpbi4KLSAgICAgKgotICAgICAqIEByZXR1cm4gd2hldGhlciB0aGUgb3BlcmF0aW9uIHN1Y2NlZWRlZC4KLSAgICAgKiBAaGlkZQotICAgICAqIEBkZXByZWNhdGVkIHVzZSB0aGUge0BsaW5rIENvbnRlbnRSZXNvbHZlcn0gdXBkYXRlIG1ldGhvZHMgaW5zdGVhZCBvZiB0aGUgQ3Vyc29yCi0gICAgICogdXBkYXRlIG1ldGhvZHMKLSAgICAgKi8KLSAgICBARGVwcmVjYXRlZAotICAgIGJvb2xlYW4gY29tbWl0VXBkYXRlcygpOwotCi0gICAgLyoqCi0gICAgICogQXRvbWljYWxseSBjb21taXRzIGFsbCB1cGRhdGVzIHRvIHRoZSBiYWNraW5nIHN0b3JlLCBhcyB3ZWxsIGFzIHRoZQotICAgICAqIHVwZGF0ZXMgaW5jbHVkZWQgaW4gdmFsdWVzLiBBZnRlciBjb21wbGV0aW9uLAotICAgICAqIHRoaXMgbWV0aG9kIGxlYXZlcyB0aGUgZGF0YSBpbiBhbiBpbmNvbnNpc3RlbnQgc3RhdGUgYW5kIHlvdSBzaG91bGQgY2FsbAotICAgICAqIHtAbGluayAjcmVxdWVyeX0gYmVmb3JlIHJlYWRpbmcgZGF0YSBmcm9tIHRoZSBjdXJzb3IgYWdhaW4uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gdmFsdWVzIEEgbWFwIGZyb20gcm93IElEcyB0byBNYXBzIGFzc29jaWF0aW5nIGNvbHVtbiBuYW1lcyB3aXRoCi0gICAgICogICAgICAgICAgICAgICB1cGRhdGVkIHZhbHVlcy4gQSBudWxsIHZhbHVlIGluZGljYXRlcyB0aGUgZmllbGQgc2hvdWxkIGJlCi0gICAgICAgICAgICAgICAgICAgICByZW1vdmVkLgotICAgICAqIEByZXR1cm4gd2hldGhlciB0aGUgb3BlcmF0aW9uIHN1Y2NlZWRlZC4KLSAgICAgKiBAaGlkZQotICAgICAqIEBkZXByZWNhdGVkIHVzZSB0aGUge0BsaW5rIENvbnRlbnRSZXNvbHZlcn0gdXBkYXRlIG1ldGhvZHMgaW5zdGVhZCBvZiB0aGUgQ3Vyc29yCi0gICAgICogdXBkYXRlIG1ldGhvZHMKLSAgICAgKi8KLSAgICBARGVwcmVjYXRlZAotICAgIGJvb2xlYW4gY29tbWl0VXBkYXRlcyhNYXA8PyBleHRlbmRzIExvbmcsCi0gICAgICAgICAgICA/IGV4dGVuZHMgTWFwPFN0cmluZyxPYmplY3Q+PiB2YWx1ZXMpOwotCi0gICAgLyoqCi0gICAgICogUmV2ZXJ0cyBhbGwgdXBkYXRlcyBtYWRlIHRvIHRoZSBjdXJzb3Igc2luY2UgdGhlIGxhc3QgY2FsbCB0bwotICAgICAqIGNvbW1pdFVwZGF0ZXMuCi0gICAgICogQGhpZGUKLSAgICAgKiBAZGVwcmVjYXRlZCB1c2UgdGhlIHtAbGluayBDb250ZW50UmVzb2x2ZXJ9IHVwZGF0ZSBtZXRob2RzIGluc3RlYWQgb2YgdGhlIEN1cnNvcgotICAgICAqIHVwZGF0ZSBtZXRob2RzCi0gICAgICovCi0gICAgQERlcHJlY2F0ZWQKLSAgICB2b2lkIGFib3J0VXBkYXRlcygpOwotCi0gICAgLyoqCiAgICAgICogRGVhY3RpdmF0ZXMgdGhlIEN1cnNvciwgbWFraW5nIGFsbCBjYWxscyBvbiBpdCBmYWlsIHVudGlsIHtAbGluayAjcmVxdWVyeX0gaXMgY2FsbGVkLgogICAgICAqIEluYWN0aXZlIEN1cnNvcnMgdXNlIGZld2VyIHJlc291cmNlcyB0aGFuIGFjdGl2ZSBDdXJzb3JzLgogICAgICAqIENhbGxpbmcge0BsaW5rICNyZXF1ZXJ5fSB3aWxsIG1ha2UgdGhlIGN1cnNvciBhY3RpdmUgYWdhaW4uCkBAIC00OTYsNiArMzM4LDEwIEBACiAgICAgICogY29udGVudHMuIFRoaXMgbWF5IGJlIGRvbmUgYXQgYW55IHRpbWUsIGluY2x1ZGluZyBhZnRlciBhIGNhbGwgdG8ge0BsaW5rCiAgICAgICogI2RlYWN0aXZhdGV9LgogICAgICAqCisgICAgICogU2luY2UgdGhpcyBtZXRob2QgY291bGQgZXhlY3V0ZSBhIHF1ZXJ5IG9uIHRoZSBkYXRhYmFzZSBhbmQgcG90ZW50aWFsbHkgdGFrZQorICAgICAqIGEgd2hpbGUsIGl0IGNvdWxkIGNhdXNlIEFOUiBpZiBpdCBpcyBjYWxsZWQgb24gTWFpbiAoVUkpIHRocmVhZC4KKyAgICAgKiBBIHdhcm5pbmcgaXMgcHJpbnRlZCBpZiB0aGlzIG1ldGhvZCBpcyBiZWluZyBleGVjdXRlZCBvbiBNYWluIHRocmVhZC4KKyAgICAgKgogICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgcmVxdWVyeSBzdWNjZWVkZWQsIGZhbHNlIGlmIG5vdCwgaW4gd2hpY2ggY2FzZSB0aGUKICAgICAgKiAgICAgICAgIGN1cnNvciBiZWNvbWVzIGludmFsaWQuCiAgICAgICovCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9DdXJzb3JUb0J1bGtDdXJzb3JBZGFwdG9yLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9DdXJzb3JUb0J1bGtDdXJzb3JBZGFwdG9yLmphdmEKaW5kZXggNzQ4ZWI5OS4uOGJjN2RlMiAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2UvQ3Vyc29yVG9CdWxrQ3Vyc29yQWRhcHRvci5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL0N1cnNvclRvQnVsa0N1cnNvckFkYXB0b3IuamF2YQpAQCAtMTYsMTYgKzE2LDEyIEBACiAKIHBhY2thZ2UgYW5kcm9pZC5kYXRhYmFzZTsKIAotaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlLlNRTGl0ZU1pc3VzZUV4Y2VwdGlvbjsKLWltcG9ydCBhbmRyb2lkLm9zLkJpbmRlcjsKIGltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKIGltcG9ydCBhbmRyb2lkLm9zLklCaW5kZXI7CiBpbXBvcnQgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb247CiBpbXBvcnQgYW5kcm9pZC51dGlsLkNvbmZpZzsKIGltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwogCi1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQogCiAvKioKICAqIFdyYXBzIGEgQnVsa0N1cnNvciBhcm91bmQgYW4gZXhpc3RpbmcgQ3Vyc29yIG1ha2luZyBpdCByZW1vdGFibGUuCkBAIC0zOCw3ICszNCw2IEBACiAgICAgcHJpdmF0ZSBmaW5hbCBDcm9zc1Byb2Nlc3NDdXJzb3IgbUN1cnNvcjsKICAgICBwcml2YXRlIEN1cnNvcldpbmRvdyBtV2luZG93OwogICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIG1Qcm92aWRlck5hbWU7Ci0gICAgcHJpdmF0ZSBmaW5hbCBib29sZWFuIG1SZWFkT25seTsKICAgICBwcml2YXRlIENvbnRlbnRPYnNlcnZlclByb3h5IG1PYnNlcnZlcjsKIAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGNsYXNzIENvbnRlbnRPYnNlcnZlclByb3h5IGV4dGVuZHMgQ29udGVudE9ic2VydmVyIApAQCAtOTgsNyArOTMsNiBAQAogICAgICAgICAgICAgICAgICAgICAiT25seSBDcm9zc1Byb2Nlc3NDdXJzb3IgY3Vyc29ycyBhcmUgc3VwcG9ydGVkIGFjcm9zcyBwcm9jZXNzIGZvciBub3ciLCBlKTsKICAgICAgICAgfQogICAgICAgICBtUHJvdmlkZXJOYW1lID0gcHJvdmlkZXJOYW1lOwotICAgICAgICBtUmVhZE9ubHkgPSAhYWxsb3dXcml0ZTsKIAogICAgICAgICBjcmVhdGVBbmRSZWdpc3Rlck9ic2VydmVyUHJveHkob2JzZXJ2ZXIpOwogICAgIH0KQEAgLTE5NywzMSArMTkxLDYgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIHB1YmxpYyBib29sZWFuIHVwZGF0ZVJvd3MoTWFwPD8gZXh0ZW5kcyBMb25nLCA/IGV4dGVuZHMgTWFwPFN0cmluZywgT2JqZWN0Pj4gdmFsdWVzKSB7Ci0gICAgICAgIGlmIChtUmVhZE9ubHkpIHsKLSAgICAgICAgICAgIExvZy53KCJDb250ZW50UHJvdmlkZXIiLCAiUGVybWlzc2lvbiBEZW5pYWw6IG1vZGlmeWluZyAiCi0gICAgICAgICAgICAgICAgICAgICsgbVByb3ZpZGVyTmFtZQotICAgICAgICAgICAgICAgICAgICArICIgZnJvbSBwaWQ9IiArIEJpbmRlci5nZXRDYWxsaW5nUGlkKCkKLSAgICAgICAgICAgICAgICAgICAgKyAiLCB1aWQ9IiArIEJpbmRlci5nZXRDYWxsaW5nVWlkKCkpOwotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBtQ3Vyc29yLmNvbW1pdFVwZGF0ZXModmFsdWVzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBkZWxldGVSb3coaW50IHBvc2l0aW9uKSB7Ci0gICAgICAgIGlmIChtUmVhZE9ubHkpIHsKLSAgICAgICAgICAgIExvZy53KCJDb250ZW50UHJvdmlkZXIiLCAiUGVybWlzc2lvbiBEZW5pYWw6IG1vZGlmeWluZyAiCi0gICAgICAgICAgICAgICAgICAgICsgbVByb3ZpZGVyTmFtZQotICAgICAgICAgICAgICAgICAgICArICIgZnJvbSBwaWQ9IiArIEJpbmRlci5nZXRDYWxsaW5nUGlkKCkKLSAgICAgICAgICAgICAgICAgICAgKyAiLCB1aWQ9IiArIEJpbmRlci5nZXRDYWxsaW5nVWlkKCkpOwotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIGlmIChtQ3Vyc29yLm1vdmVUb1Bvc2l0aW9uKHBvc2l0aW9uKSA9PSBmYWxzZSkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBtQ3Vyc29yLmRlbGV0ZVJvdygpOwotICAgIH0KLQogICAgIHB1YmxpYyBCdW5kbGUgZ2V0RXh0cmFzKCkgewogICAgICAgICByZXR1cm4gbUN1cnNvci5nZXRFeHRyYXMoKTsKICAgICB9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9DdXJzb3JXaW5kb3cuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL0N1cnNvcldpbmRvdy5qYXZhCmluZGV4IGM3NTY4MjUuLjU5OTQzMWYgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL0N1cnNvcldpbmRvdy5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL0N1cnNvcldpbmRvdy5qYXZhCkBAIC0yMTcsMTggKzIxNywxMyBAQAogICAgICAqIEBwYXJhbSByb3cgdGhlIHJvdyB0byByZWFkIGZyb20sIHJvdyAtIGdldFN0YXJ0UG9zaXRpb24oKSBiZWluZyB0aGUgYWN0dWFsIHJvdyBpbiB0aGUgd2luZG93CiAgICAgICogQHBhcmFtIGNvbCB0aGUgY29sdW1uIHRvIHJlYWQgZnJvbQogICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIGdpdmVuIGZpZWxkIGlzIHtAY29kZSBOVUxMfQorICAgICAqIEBkZXByZWNhdGVkIHVzZSB7QGxpbmsgI2dldFR5cGUoaW50LCBpbnQpfSBpbnN0ZWFkCiAgICAgICovCisgICAgQERlcHJlY2F0ZWQKICAgICBwdWJsaWMgYm9vbGVhbiBpc051bGwoaW50IHJvdywgaW50IGNvbCkgewotICAgICAgICBhY3F1aXJlUmVmZXJlbmNlKCk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZXR1cm4gaXNOdWxsX25hdGl2ZShyb3cgLSBtU3RhcnRQb3MsIGNvbCk7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICByZWxlYXNlUmVmZXJlbmNlKCk7Ci0gICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGdldFR5cGUocm93LCBjb2wpID09IEN1cnNvci5GSUVMRF9UWVBFX05VTEw7CiAgICAgfQogICAgIAotICAgIHByaXZhdGUgbmF0aXZlIGJvb2xlYW4gaXNOdWxsX25hdGl2ZShpbnQgcm93LCBpbnQgY29sKTsKLSAgICAKICAgICAvKioKICAgICAgKiBSZXR1cm5zIGEgYnl0ZSBhcnJheSBmb3IgdGhlIGdpdmVuIGZpZWxkLgogICAgICAqCkBAIC0yNDgsMTkgKzI0Myw0MyBAQAogICAgIHByaXZhdGUgbmF0aXZlIGJ5dGVbXSBnZXRCbG9iX25hdGl2ZShpbnQgcm93LCBpbnQgY29sKTsKIAogICAgIC8qKgorICAgICAqIFJldHVybnMgZGF0YSB0eXBlIG9mIHRoZSBnaXZlbiBjb2x1bW4ncyB2YWx1ZS4KKyAgICAgKjxwPgorICAgICAqIFJldHVybmVkIGNvbHVtbiB0eXBlcyBhcmUKKyAgICAgKiA8dWw+CisgICAgICogICA8bGk+e0BsaW5rIEN1cnNvciNGSUVMRF9UWVBFX05VTEx9PC9saT4KKyAgICAgKiAgIDxsaT57QGxpbmsgQ3Vyc29yI0ZJRUxEX1RZUEVfSU5URUdFUn08L2xpPgorICAgICAqICAgPGxpPntAbGluayBDdXJzb3IjRklFTERfVFlQRV9GTE9BVH08L2xpPgorICAgICAqICAgPGxpPntAbGluayBDdXJzb3IjRklFTERfVFlQRV9TVFJJTkd9PC9saT4KKyAgICAgKiAgIDxsaT57QGxpbmsgQ3Vyc29yI0ZJRUxEX1RZUEVfQkxPQn08L2xpPgorICAgICAqPC91bD4KKyAgICAgKjwvcD4KKyAgICAgKgorICAgICAqIEBwYXJhbSByb3cgdGhlIHJvdyB0byByZWFkIGZyb20sIHJvdyAtIGdldFN0YXJ0UG9zaXRpb24oKSBiZWluZyB0aGUgYWN0dWFsIHJvdyBpbiB0aGUgd2luZG93CisgICAgICogQHBhcmFtIGNvbCB0aGUgY29sdW1uIHRvIHJlYWQgZnJvbQorICAgICAqIEByZXR1cm4gdGhlIHZhbHVlIHR5cGUKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldFR5cGUoaW50IHJvdywgaW50IGNvbCkgeworICAgICAgICBhY3F1aXJlUmVmZXJlbmNlKCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXR1cm4gZ2V0VHlwZV9uYXRpdmUocm93IC0gbVN0YXJ0UG9zLCBjb2wpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgcmVsZWFzZVJlZmVyZW5jZSgpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCiAgICAgICogQ2hlY2tzIGlmIGEgZmllbGQgY29udGFpbnMgZWl0aGVyIGEgYmxvYiBvciBpcyBudWxsLgogICAgICAqCiAgICAgICogQHBhcmFtIHJvdyB0aGUgcm93IHRvIHJlYWQgZnJvbSwgcm93IC0gZ2V0U3RhcnRQb3NpdGlvbigpIGJlaW5nIHRoZSBhY3R1YWwgcm93IGluIHRoZSB3aW5kb3cKICAgICAgKiBAcGFyYW0gY29sIHRoZSBjb2x1bW4gdG8gcmVhZCBmcm9tCiAgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgZ2l2ZW4gZmllbGQgaXMge0Bjb2RlIE5VTEx9IG9yIGEgYmxvYgorICAgICAqIEBkZXByZWNhdGVkIHVzZSB7QGxpbmsgI2dldFR5cGUoaW50LCBpbnQpfSBpbnN0ZWFkCiAgICAgICovCisgICAgQERlcHJlY2F0ZWQKICAgICBwdWJsaWMgYm9vbGVhbiBpc0Jsb2IoaW50IHJvdywgaW50IGNvbCkgewotICAgICAgICBhY3F1aXJlUmVmZXJlbmNlKCk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZXR1cm4gaXNCbG9iX25hdGl2ZShyb3cgLSBtU3RhcnRQb3MsIGNvbCk7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICByZWxlYXNlUmVmZXJlbmNlKCk7Ci0gICAgICAgIH0KKyAgICAgICAgaW50IHR5cGUgPSBnZXRUeXBlKHJvdywgY29sKTsKKyAgICAgICAgcmV0dXJuIHR5cGUgPT0gQ3Vyc29yLkZJRUxEX1RZUEVfQkxPQiB8fCB0eXBlID09IEN1cnNvci5GSUVMRF9UWVBFX05VTEw7CiAgICAgfQogCiAgICAgLyoqCkBAIC0yNjksMTQgKzI4OCwxMSBAQAogICAgICAqIEBwYXJhbSByb3cgdGhlIHJvdyB0byByZWFkIGZyb20sIHJvdyAtIGdldFN0YXJ0UG9zaXRpb24oKSBiZWluZyB0aGUgYWN0dWFsIHJvdyBpbiB0aGUgd2luZG93CiAgICAgICogQHBhcmFtIGNvbCB0aGUgY29sdW1uIHRvIHJlYWQgZnJvbQogICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIGdpdmVuIGZpZWxkIGlzIGEgbG9uZworICAgICAqIEBkZXByZWNhdGVkIHVzZSB7QGxpbmsgI2dldFR5cGUoaW50LCBpbnQpfSBpbnN0ZWFkCiAgICAgICovCisgICAgQERlcHJlY2F0ZWQKICAgICBwdWJsaWMgYm9vbGVhbiBpc0xvbmcoaW50IHJvdywgaW50IGNvbCkgewotICAgICAgICBhY3F1aXJlUmVmZXJlbmNlKCk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZXR1cm4gaXNJbnRlZ2VyX25hdGl2ZShyb3cgLSBtU3RhcnRQb3MsIGNvbCk7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICByZWxlYXNlUmVmZXJlbmNlKCk7Ci0gICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGdldFR5cGUocm93LCBjb2wpID09IEN1cnNvci5GSUVMRF9UWVBFX0lOVEVHRVI7CiAgICAgfQogCiAgICAgLyoqCkBAIC0yODUsMTQgKzMwMSwxMSBAQAogICAgICAqIEBwYXJhbSByb3cgdGhlIHJvdyB0byByZWFkIGZyb20sIHJvdyAtIGdldFN0YXJ0UG9zaXRpb24oKSBiZWluZyB0aGUgYWN0dWFsIHJvdyBpbiB0aGUgd2luZG93CiAgICAgICogQHBhcmFtIGNvbCB0aGUgY29sdW1uIHRvIHJlYWQgZnJvbQogICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIGdpdmVuIGZpZWxkIGlzIGEgZmxvYXQKKyAgICAgKiBAZGVwcmVjYXRlZCB1c2Uge0BsaW5rICNnZXRUeXBlKGludCwgaW50KX0gaW5zdGVhZAogICAgICAqLworICAgIEBEZXByZWNhdGVkCiAgICAgcHVibGljIGJvb2xlYW4gaXNGbG9hdChpbnQgcm93LCBpbnQgY29sKSB7Ci0gICAgICAgIGFjcXVpcmVSZWZlcmVuY2UoKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJldHVybiBpc0Zsb2F0X25hdGl2ZShyb3cgLSBtU3RhcnRQb3MsIGNvbCk7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICByZWxlYXNlUmVmZXJlbmNlKCk7Ci0gICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGdldFR5cGUocm93LCBjb2wpID09IEN1cnNvci5GSUVMRF9UWVBFX0ZMT0FUOwogICAgIH0KIAogICAgIC8qKgpAQCAtMzAxLDIwICszMTQsMTUgQEAKICAgICAgKiBAcGFyYW0gcm93IHRoZSByb3cgdG8gcmVhZCBmcm9tLCByb3cgLSBnZXRTdGFydFBvc2l0aW9uKCkgYmVpbmcgdGhlIGFjdHVhbCByb3cgaW4gdGhlIHdpbmRvdwogICAgICAqIEBwYXJhbSBjb2wgdGhlIGNvbHVtbiB0byByZWFkIGZyb20KICAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiBnaXZlbiBmaWVsZCBpcyB7QGNvZGUgTlVMTH0gb3IgYSBTdHJpbmcKKyAgICAgKiBAZGVwcmVjYXRlZCB1c2Uge0BsaW5rICNnZXRUeXBlKGludCwgaW50KX0gaW5zdGVhZAogICAgICAqLworICAgIEBEZXByZWNhdGVkCiAgICAgcHVibGljIGJvb2xlYW4gaXNTdHJpbmcoaW50IHJvdywgaW50IGNvbCkgewotICAgICAgICBhY3F1aXJlUmVmZXJlbmNlKCk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZXR1cm4gaXNTdHJpbmdfbmF0aXZlKHJvdyAtIG1TdGFydFBvcywgY29sKTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIHJlbGVhc2VSZWZlcmVuY2UoKTsKLSAgICAgICAgfQorICAgICAgICBpbnQgdHlwZSA9IGdldFR5cGUocm93LCBjb2wpOworICAgICAgICByZXR1cm4gdHlwZSA9PSBDdXJzb3IuRklFTERfVFlQRV9TVFJJTkcgfHwgdHlwZSA9PSBDdXJzb3IuRklFTERfVFlQRV9OVUxMOwogICAgIH0KIAotICAgIHByaXZhdGUgbmF0aXZlIGJvb2xlYW4gaXNCbG9iX25hdGl2ZShpbnQgcm93LCBpbnQgY29sKTsKLSAgICBwcml2YXRlIG5hdGl2ZSBib29sZWFuIGlzU3RyaW5nX25hdGl2ZShpbnQgcm93LCBpbnQgY29sKTsKLSAgICBwcml2YXRlIG5hdGl2ZSBib29sZWFuIGlzSW50ZWdlcl9uYXRpdmUoaW50IHJvdywgaW50IGNvbCk7Ci0gICAgcHJpdmF0ZSBuYXRpdmUgYm9vbGVhbiBpc0Zsb2F0X25hdGl2ZShpbnQgcm93LCBpbnQgY29sKTsKKyAgICBwcml2YXRlIG5hdGl2ZSBpbnQgZ2V0VHlwZV9uYXRpdmUoaW50IHJvdywgaW50IGNvbCk7CiAKICAgICAvKioKICAgICAgKiBSZXR1cm5zIGEgU3RyaW5nIGZvciB0aGUgZ2l2ZW4gZmllbGQuCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9DdXJzb3JXcmFwcGVyLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9DdXJzb3JXcmFwcGVyLmphdmEKaW5kZXggZjBhYTdkNy4uM2MzYmQ0MyAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2UvQ3Vyc29yV3JhcHBlci5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL0N1cnNvcldyYXBwZXIuamF2YQpAQCAtMTcsMjggKzE3LDI2IEBACiBwYWNrYWdlIGFuZHJvaWQuZGF0YWJhc2U7CiAKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFJlc29sdmVyOwotaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2UuQ2hhckFycmF5QnVmZmVyOwogaW1wb3J0IGFuZHJvaWQubmV0LlVyaTsKIGltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKIAotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KIC8qKgotICogV3JhcHBlciBjbGFzcyBmb3IgQ3Vyc29yIHRoYXQgZGVsZWdhdGVzIGFsbCBjYWxscyB0byB0aGUgYWN0dWFsIGN1cnNvciBvYmplY3QKKyAqIFdyYXBwZXIgY2xhc3MgZm9yIEN1cnNvciB0aGF0IGRlbGVnYXRlcyBhbGwgY2FsbHMgdG8gdGhlIGFjdHVhbCBjdXJzb3Igb2JqZWN0LiAgVGhlIHByaW1hcnkKKyAqIHVzZSBmb3IgdGhpcyBjbGFzcyBpcyB0byBleHRlbmQgYSBjdXJzb3Igd2hpbGUgb3ZlcnJpZGluZyBvbmx5IGEgc3Vic2V0IG9mIGl0cyBtZXRob2RzLgogICovCi0KIHB1YmxpYyBjbGFzcyBDdXJzb3JXcmFwcGVyIGltcGxlbWVudHMgQ3Vyc29yIHsKIAorICAgIHByaXZhdGUgZmluYWwgQ3Vyc29yIG1DdXJzb3I7CisKICAgICBwdWJsaWMgQ3Vyc29yV3JhcHBlcihDdXJzb3IgY3Vyc29yKSB7CiAgICAgICAgIG1DdXJzb3IgPSBjdXJzb3I7CiAgICAgfQotICAgIAorCiAgICAgLyoqCi0gICAgICogQGhpZGUKLSAgICAgKiBAZGVwcmVjYXRlZAorICAgICAqIEByZXR1cm4gdGhlIHdyYXBwZWQgY3Vyc29yCiAgICAgICovCi0gICAgcHVibGljIHZvaWQgYWJvcnRVcGRhdGVzKCkgewotICAgICAgICBtQ3Vyc29yLmFib3J0VXBkYXRlcygpOworICAgIHB1YmxpYyBDdXJzb3IgZ2V0V3JhcHBlZEN1cnNvcigpIHsKKyAgICAgICAgcmV0dXJuIG1DdXJzb3I7CiAgICAgfQogCiAgICAgcHVibGljIHZvaWQgY2xvc2UoKSB7CkBAIC00OSwyMyArNDcsNiBAQAogICAgICAgICByZXR1cm4gbUN1cnNvci5pc0Nsb3NlZCgpOwogICAgIH0KIAotICAgIC8qKgotICAgICAqIEBoaWRlCi0gICAgICogQGRlcHJlY2F0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBjb21taXRVcGRhdGVzKCkgewotICAgICAgICByZXR1cm4gbUN1cnNvci5jb21taXRVcGRhdGVzKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQGhpZGUKLSAgICAgKiBAZGVwcmVjYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGNvbW1pdFVwZGF0ZXMoCi0gICAgICAgICAgICBNYXA8PyBleHRlbmRzIExvbmcsID8gZXh0ZW5kcyBNYXA8U3RyaW5nLCBPYmplY3Q+PiB2YWx1ZXMpIHsKLSAgICAgICAgcmV0dXJuIG1DdXJzb3IuY29tbWl0VXBkYXRlcyh2YWx1ZXMpOwotICAgIH0KLQogICAgIHB1YmxpYyBpbnQgZ2V0Q291bnQoKSB7CiAgICAgICAgIHJldHVybiBtQ3Vyc29yLmdldENvdW50KCk7CiAgICAgfQpAQCAtNzQsMTQgKzU1LDYgQEAKICAgICAgICAgbUN1cnNvci5kZWFjdGl2YXRlKCk7CiAgICAgfQogCi0gICAgLyoqCi0gICAgICogQGhpZGUKLSAgICAgKiBAZGVwcmVjYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGRlbGV0ZVJvdygpIHsKLSAgICAgICAgcmV0dXJuIG1DdXJzb3IuZGVsZXRlUm93KCk7Ci0gICAgfQotCiAgICAgcHVibGljIGJvb2xlYW4gbW92ZVRvRmlyc3QoKSB7CiAgICAgICAgIHJldHVybiBtQ3Vyc29yLm1vdmVUb0ZpcnN0KCk7CiAgICAgfQpAQCAtMTQ3LDE0ICsxMjAsNiBAQAogICAgICAgICByZXR1cm4gbUN1cnNvci5nZXRXYW50c0FsbE9uTW92ZUNhbGxzKCk7CiAgICAgfQogCi0gICAgLyoqCi0gICAgICogQGhpZGUKLSAgICAgKiBAZGVwcmVjYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGhhc1VwZGF0ZXMoKSB7Ci0gICAgICAgIHJldHVybiBtQ3Vyc29yLmhhc1VwZGF0ZXMoKTsKLSAgICB9Ci0KICAgICBwdWJsaWMgYm9vbGVhbiBpc0FmdGVyTGFzdCgpIHsKICAgICAgICAgcmV0dXJuIG1DdXJzb3IuaXNBZnRlckxhc3QoKTsKICAgICB9CkBAIC0xNzEsNiArMTM2LDEwIEBACiAgICAgICAgIHJldHVybiBtQ3Vyc29yLmlzTGFzdCgpOwogICAgIH0KIAorICAgIHB1YmxpYyBpbnQgZ2V0VHlwZShpbnQgY29sdW1uSW5kZXgpIHsKKyAgICAgICAgcmV0dXJuIG1DdXJzb3IuZ2V0VHlwZShjb2x1bW5JbmRleCk7CisgICAgfQorCiAgICAgcHVibGljIGJvb2xlYW4gaXNOdWxsKGludCBjb2x1bW5JbmRleCkgewogICAgICAgICByZXR1cm4gbUN1cnNvci5pc051bGwoY29sdW1uSW5kZXgpOwogICAgIH0KQEAgLTIxOSwxNCArMTg4LDYgQEAKICAgICAgICAgbUN1cnNvci5zZXROb3RpZmljYXRpb25VcmkoY3IsIHVyaSk7ICAgICAgICAKICAgICB9CiAKLSAgICAvKioKLSAgICAgKiBAaGlkZQotICAgICAqIEBkZXByZWNhdGVkCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gc3VwcG9ydHNVcGRhdGVzKCkgewotICAgICAgICByZXR1cm4gbUN1cnNvci5zdXBwb3J0c1VwZGF0ZXMoKTsKLSAgICB9Ci0KICAgICBwdWJsaWMgdm9pZCB1bnJlZ2lzdGVyQ29udGVudE9ic2VydmVyKENvbnRlbnRPYnNlcnZlciBvYnNlcnZlcikgewogICAgICAgICBtQ3Vyc29yLnVucmVnaXN0ZXJDb250ZW50T2JzZXJ2ZXIob2JzZXJ2ZXIpOyAgICAgICAgCiAgICAgfQpAQCAtMjM0LDcyICsxOTUsNSBAQAogICAgIHB1YmxpYyB2b2lkIHVucmVnaXN0ZXJEYXRhU2V0T2JzZXJ2ZXIoRGF0YVNldE9ic2VydmVyIG9ic2VydmVyKSB7CiAgICAgICAgIG1DdXJzb3IudW5yZWdpc3RlckRhdGFTZXRPYnNlcnZlcihvYnNlcnZlcik7CiAgICAgfQotCi0gICAgLyoqCi0gICAgICogQGhpZGUKLSAgICAgKiBAZGVwcmVjYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIHVwZGF0ZURvdWJsZShpbnQgY29sdW1uSW5kZXgsIGRvdWJsZSB2YWx1ZSkgewotICAgICAgICByZXR1cm4gbUN1cnNvci51cGRhdGVEb3VibGUoY29sdW1uSW5kZXgsIHZhbHVlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAaGlkZQotICAgICAqIEBkZXByZWNhdGVkCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gdXBkYXRlRmxvYXQoaW50IGNvbHVtbkluZGV4LCBmbG9hdCB2YWx1ZSkgewotICAgICAgICByZXR1cm4gbUN1cnNvci51cGRhdGVGbG9hdChjb2x1bW5JbmRleCwgdmFsdWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBoaWRlCi0gICAgICogQGRlcHJlY2F0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiB1cGRhdGVJbnQoaW50IGNvbHVtbkluZGV4LCBpbnQgdmFsdWUpIHsKLSAgICAgICAgcmV0dXJuIG1DdXJzb3IudXBkYXRlSW50KGNvbHVtbkluZGV4LCB2YWx1ZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQGhpZGUKLSAgICAgKiBAZGVwcmVjYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIHVwZGF0ZUxvbmcoaW50IGNvbHVtbkluZGV4LCBsb25nIHZhbHVlKSB7Ci0gICAgICAgIHJldHVybiBtQ3Vyc29yLnVwZGF0ZUxvbmcoY29sdW1uSW5kZXgsIHZhbHVlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAaGlkZQotICAgICAqIEBkZXByZWNhdGVkCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gdXBkYXRlU2hvcnQoaW50IGNvbHVtbkluZGV4LCBzaG9ydCB2YWx1ZSkgewotICAgICAgICByZXR1cm4gbUN1cnNvci51cGRhdGVTaG9ydChjb2x1bW5JbmRleCwgdmFsdWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBoaWRlCi0gICAgICogQGRlcHJlY2F0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiB1cGRhdGVTdHJpbmcoaW50IGNvbHVtbkluZGV4LCBTdHJpbmcgdmFsdWUpIHsKLSAgICAgICAgcmV0dXJuIG1DdXJzb3IudXBkYXRlU3RyaW5nKGNvbHVtbkluZGV4LCB2YWx1ZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQGhpZGUKLSAgICAgKiBAZGVwcmVjYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIHVwZGF0ZUJsb2IoaW50IGNvbHVtbkluZGV4LCBieXRlW10gdmFsdWUpIHsKLSAgICAgICAgcmV0dXJuIG1DdXJzb3IudXBkYXRlQmxvYihjb2x1bW5JbmRleCwgdmFsdWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBoaWRlCi0gICAgICogQGRlcHJlY2F0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiB1cGRhdGVUb051bGwoaW50IGNvbHVtbkluZGV4KSB7Ci0gICAgICAgIHJldHVybiBtQ3Vyc29yLnVwZGF0ZVRvTnVsbChjb2x1bW5JbmRleCk7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgQ3Vyc29yIG1DdXJzb3I7Ci0gICAgCiB9CiAKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL0RhdGFTZXRPYnNlcnZhYmxlLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9EYXRhU2V0T2JzZXJ2YWJsZS5qYXZhCmluZGV4IDkyMDBlODEuLjUxYzcyYzEgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL0RhdGFTZXRPYnNlcnZhYmxlLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2UvRGF0YVNldE9ic2VydmFibGUuamF2YQpAQCAtMjcsOCArMjcsMTIgQEAKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKCkgewogICAgICAgICBzeW5jaHJvbml6ZWQobU9ic2VydmVycykgewotICAgICAgICAgICAgZm9yIChEYXRhU2V0T2JzZXJ2ZXIgb2JzZXJ2ZXIgOiBtT2JzZXJ2ZXJzKSB7Ci0gICAgICAgICAgICAgICAgb2JzZXJ2ZXIub25DaGFuZ2VkKCk7CisgICAgICAgICAgICAvLyBzaW5jZSBvbkNoYW5nZWQoKSBpcyBpbXBsZW1lbnRlZCBieSB0aGUgYXBwLCBpdCBjb3VsZCBkbyBhbnl0aGluZywgaW5jbHVkaW5nCisgICAgICAgICAgICAvLyByZW1vdmluZyBpdHNlbGYgZnJvbSB7QGxpbmsgbU9ic2VydmVyc30gLSBhbmQgdGhhdCBjb3VsZCBjYXVzZSBwcm9ibGVtcyBpZgorICAgICAgICAgICAgLy8gYW4gaXRlcmF0b3IgaXMgdXNlZCBvbiB0aGUgQXJyYXlMaXN0IHtAbGluayBtT2JzZXJ2ZXJzfS4KKyAgICAgICAgICAgIC8vIHRvIGF2b2lkIHN1Y2ggcHJvYmxlbXMsIGp1c3QgbWFyY2ggdGhydSB0aGUgbGlzdCBpbiB0aGUgcmV2ZXJzZSBvcmRlci4KKyAgICAgICAgICAgIGZvciAoaW50IGkgPSBtT2JzZXJ2ZXJzLnNpemUoKSAtIDE7IGkgPj0gMDsgaS0tKSB7CisgICAgICAgICAgICAgICAgbU9ic2VydmVycy5nZXQoaSkub25DaGFuZ2VkKCk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CkBAIC0zOSw4ICs0Myw4IEBACiAgICAgICovCiAgICAgcHVibGljIHZvaWQgbm90aWZ5SW52YWxpZGF0ZWQoKSB7CiAgICAgICAgIHN5bmNocm9uaXplZCAobU9ic2VydmVycykgewotICAgICAgICAgICAgZm9yIChEYXRhU2V0T2JzZXJ2ZXIgb2JzZXJ2ZXIgOiBtT2JzZXJ2ZXJzKSB7Ci0gICAgICAgICAgICAgICAgb2JzZXJ2ZXIub25JbnZhbGlkYXRlZCgpOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IG1PYnNlcnZlcnMuc2l6ZSgpIC0gMTsgaSA+PSAwOyBpLS0pIHsKKyAgICAgICAgICAgICAgICBtT2JzZXJ2ZXJzLmdldChpKS5vbkludmFsaWRhdGVkKCk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9EYXRhYmFzZUVycm9ySGFuZGxlci5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2UvRGF0YWJhc2VFcnJvckhhbmRsZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMGM1NDUyCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2UvRGF0YWJhc2VFcnJvckhhbmRsZXIuamF2YQpAQCAtMCwwICsxLDMzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLmRhdGFiYXNlOworCitpbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGUuU1FMaXRlRGF0YWJhc2U7CisKKy8qKgorICogQW4gaW50ZXJmYWNlIHRvIGxldCB0aGUgYXBwcyBkZWZpbmUgdGhlIGFjdGlvbnMgdG8gdGFrZSB3aGVuIHRoZSBmb2xsb3dpbmcgZXJyb3JzIGFyZSBkZXRlY3RlZAorICogICBkYXRhYmFzZSBjb3JydXB0aW9uCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgRGF0YWJhc2VFcnJvckhhbmRsZXIgeworCisgICAgLyoqCisgICAgICogZGVmaW5lcyB0aGUgbWV0aG9kIHRvIGJlIGludm9rZWQgd2hlbiBkYXRhYmFzZSBjb3JydXB0aW9uIGlzIGRldGVjdGVkLgorICAgICAqIEBwYXJhbSBkYk9iaiB0aGUge0BsaW5rIFNRTGl0ZURhdGFiYXNlfSBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSBkYXRhYmFzZSBvbiB3aGljaCBjb3JydXB0aW9uCisgICAgICogaXMgZGV0ZWN0ZWQuCisgICAgICovCisgICAgdm9pZCBvbkNvcnJ1cHRpb24oU1FMaXRlRGF0YWJhc2UgZGJPYmopOworfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2UvRGF0YWJhc2VVdGlscy5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2UvRGF0YWJhc2VVdGlscy5qYXZhCmluZGV4IDk1ZmMxZmQuLjkwYmIwZTIgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL0RhdGFiYXNlVXRpbHMuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9EYXRhYmFzZVV0aWxzLmphdmEKQEAgLTMxLDYgKzMxLDcgQEAKIGltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZS5TUUxpdGVQcm9ncmFtOwogaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlLlNRTGl0ZVN0YXRlbWVudDsKIGltcG9ydCBhbmRyb2lkLm9zLlBhcmNlbDsKK2ltcG9ydCBhbmRyb2lkLm9zLlBhcmNlbEZpbGVEZXNjcmlwdG9yOwogaW1wb3J0IGFuZHJvaWQudGV4dC5UZXh0VXRpbHM7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkNvbmZpZzsKIGltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwpAQCAtNTAsNiArNTEsMjMgQEAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIERFQlVHID0gZmFsc2U7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBMT0NBTF9MT0dWID0gREVCVUcgPyBDb25maWcuTE9HRCA6IENvbmZpZy5MT0dWOwogCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gY291bnRQcm9qZWN0aW9uID0gbmV3IFN0cmluZ1tdeyJjb3VudCgqKSJ9OworCisgICAgLyoqIE9uZSBvZiB0aGUgdmFsdWVzIHJldHVybmVkIGJ5IHtAbGluayAjZ2V0U3FsU3RhdGVtZW50VHlwZShTdHJpbmcpfS4gKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVEFURU1FTlRfU0VMRUNUID0gMTsKKyAgICAvKiogT25lIG9mIHRoZSB2YWx1ZXMgcmV0dXJuZWQgYnkge0BsaW5rICNnZXRTcWxTdGF0ZW1lbnRUeXBlKFN0cmluZyl9LiAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUQVRFTUVOVF9VUERBVEUgPSAyOworICAgIC8qKiBPbmUgb2YgdGhlIHZhbHVlcyByZXR1cm5lZCBieSB7QGxpbmsgI2dldFNxbFN0YXRlbWVudFR5cGUoU3RyaW5nKX0uICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RBVEVNRU5UX0FUVEFDSCA9IDM7CisgICAgLyoqIE9uZSBvZiB0aGUgdmFsdWVzIHJldHVybmVkIGJ5IHtAbGluayAjZ2V0U3FsU3RhdGVtZW50VHlwZShTdHJpbmcpfS4gKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVEFURU1FTlRfQkVHSU4gPSA0OworICAgIC8qKiBPbmUgb2YgdGhlIHZhbHVlcyByZXR1cm5lZCBieSB7QGxpbmsgI2dldFNxbFN0YXRlbWVudFR5cGUoU3RyaW5nKX0uICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RBVEVNRU5UX0NPTU1JVCA9IDU7CisgICAgLyoqIE9uZSBvZiB0aGUgdmFsdWVzIHJldHVybmVkIGJ5IHtAbGluayAjZ2V0U3FsU3RhdGVtZW50VHlwZShTdHJpbmcpfS4gKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVEFURU1FTlRfQUJPUlQgPSA2OworICAgIC8qKiBPbmUgb2YgdGhlIHZhbHVlcyByZXR1cm5lZCBieSB7QGxpbmsgI2dldFNxbFN0YXRlbWVudFR5cGUoU3RyaW5nKX0uICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RBVEVNRU5UX09USEVSID0gNzsKKwogICAgIC8qKgogICAgICAqIFNwZWNpYWwgZnVuY3Rpb24gZm9yIHdyaXRpbmcgYW4gZXhjZXB0aW9uIHJlc3VsdCBhdCB0aGUgaGVhZGVyIG9mCiAgICAgICogYSBwYXJjZWwsIHRvIGJlIHVzZWQgd2hlbiByZXR1cm5pbmcgYW4gZXhjZXB0aW9uIGZyb20gYSB0cmFuc2FjdGlvbi4KQEAgLTE5MSw2ICsyMDksMzcgQEAKICAgICB9CiAKICAgICAvKioKKyAgICAgKiBSZXR1cm5zIGRhdGEgdHlwZSBvZiB0aGUgZ2l2ZW4gb2JqZWN0J3MgdmFsdWUuCisgICAgICo8cD4KKyAgICAgKiBSZXR1cm5lZCB2YWx1ZXMgYXJlCisgICAgICogPHVsPgorICAgICAqICAgPGxpPntAbGluayBDdXJzb3IjRklFTERfVFlQRV9OVUxMfTwvbGk+CisgICAgICogICA8bGk+e0BsaW5rIEN1cnNvciNGSUVMRF9UWVBFX0lOVEVHRVJ9PC9saT4KKyAgICAgKiAgIDxsaT57QGxpbmsgQ3Vyc29yI0ZJRUxEX1RZUEVfRkxPQVR9PC9saT4KKyAgICAgKiAgIDxsaT57QGxpbmsgQ3Vyc29yI0ZJRUxEX1RZUEVfU1RSSU5HfTwvbGk+CisgICAgICogICA8bGk+e0BsaW5rIEN1cnNvciNGSUVMRF9UWVBFX0JMT0J9PC9saT4KKyAgICAgKjwvdWw+CisgICAgICo8L3A+CisgICAgICoKKyAgICAgKiBAcGFyYW0gb2JqIHRoZSBvYmplY3Qgd2hvc2UgdmFsdWUgdHlwZSBpcyB0byBiZSByZXR1cm5lZAorICAgICAqIEByZXR1cm4gb2JqZWN0IHZhbHVlIHR5cGUKKyAgICAgKiBAaGlkZQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgaW50IGdldFR5cGVPZk9iamVjdChPYmplY3Qgb2JqKSB7CisgICAgICAgIGlmIChvYmogPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIEN1cnNvci5GSUVMRF9UWVBFX05VTEw7CisgICAgICAgIH0gZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgYnl0ZVtdKSB7CisgICAgICAgICAgICByZXR1cm4gQ3Vyc29yLkZJRUxEX1RZUEVfQkxPQjsKKyAgICAgICAgfSBlbHNlIGlmIChvYmogaW5zdGFuY2VvZiBGbG9hdCB8fCBvYmogaW5zdGFuY2VvZiBEb3VibGUpIHsKKyAgICAgICAgICAgIHJldHVybiBDdXJzb3IuRklFTERfVFlQRV9GTE9BVDsKKyAgICAgICAgfSBlbHNlIGlmIChvYmogaW5zdGFuY2VvZiBMb25nIHx8IG9iaiBpbnN0YW5jZW9mIEludGVnZXIpIHsKKyAgICAgICAgICAgIHJldHVybiBDdXJzb3IuRklFTERfVFlQRV9JTlRFR0VSOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIEN1cnNvci5GSUVMRF9UWVBFX1NUUklORzsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgogICAgICAqIEFwcGVuZHMgYW4gU1FMIHN0cmluZyB0byB0aGUgZ2l2ZW4gU3RyaW5nQnVpbGRlciwgaW5jbHVkaW5nIHRoZSBvcGVuaW5nCiAgICAgICogYW5kIGNsb3Npbmcgc2luZ2xlIHF1b3Rlcy4gQW55IHNpbmdsZSBxdW90ZXMgaW50ZXJuYWwgdG8gc3FsU3RyaW5nIHdpbGwKICAgICAgKiBiZSBlc2NhcGVkLgpAQCAtNjU2LDE0ICs3MDUsOCBAQAogICAgICAqIGZpcnN0IGNvbHVtbiBvZiB0aGUgZmlyc3Qgcm93LgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgbG9uZyBsb25nRm9yUXVlcnkoU1FMaXRlU3RhdGVtZW50IHByb2csIFN0cmluZ1tdIHNlbGVjdGlvbkFyZ3MpIHsKLSAgICAgICAgaWYgKHNlbGVjdGlvbkFyZ3MgIT0gbnVsbCkgewotICAgICAgICAgICAgaW50IHNpemUgPSBzZWxlY3Rpb25BcmdzLmxlbmd0aDsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgYmluZE9iamVjdFRvUHJvZ3JhbShwcm9nLCBpICsgMSwgc2VsZWN0aW9uQXJnc1tpXSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgbG9uZyB2YWx1ZSA9IHByb2cuc2ltcGxlUXVlcnlGb3JMb25nKCk7Ci0gICAgICAgIHJldHVybiB2YWx1ZTsKKyAgICAgICAgcHJvZy5iaW5kQWxsQXJnc0FzU3RyaW5ncyhzZWxlY3Rpb25BcmdzKTsKKyAgICAgICAgcmV0dXJuIHByb2cuc2ltcGxlUXVlcnlGb3JMb25nKCk7CiAgICAgfQogCiAgICAgLyoqCkBAIC02ODQsMTQgKzcyNywzNiBAQAogICAgICAqIGZpcnN0IGNvbHVtbiBvZiB0aGUgZmlyc3Qgcm93LgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIHN0cmluZ0ZvclF1ZXJ5KFNRTGl0ZVN0YXRlbWVudCBwcm9nLCBTdHJpbmdbXSBzZWxlY3Rpb25BcmdzKSB7Ci0gICAgICAgIGlmIChzZWxlY3Rpb25BcmdzICE9IG51bGwpIHsKLSAgICAgICAgICAgIGludCBzaXplID0gc2VsZWN0aW9uQXJncy5sZW5ndGg7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotICAgICAgICAgICAgICAgIGJpbmRPYmplY3RUb1Byb2dyYW0ocHJvZywgaSArIDEsIHNlbGVjdGlvbkFyZ3NbaV0pOwotICAgICAgICAgICAgfQorICAgICAgICBwcm9nLmJpbmRBbGxBcmdzQXNTdHJpbmdzKHNlbGVjdGlvbkFyZ3MpOworICAgICAgICByZXR1cm4gcHJvZy5zaW1wbGVRdWVyeUZvclN0cmluZygpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFV0aWxpdHkgbWV0aG9kIHRvIHJ1biB0aGUgcXVlcnkgb24gdGhlIGRiIGFuZCByZXR1cm4gdGhlIGJsb2IgdmFsdWUgaW4gdGhlCisgICAgICogZmlyc3QgY29sdW1uIG9mIHRoZSBmaXJzdCByb3cuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIEEgcmVhZC1vbmx5IGZpbGUgZGVzY3JpcHRvciBmb3IgYSBjb3B5IG9mIHRoZSBibG9iIHZhbHVlLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgUGFyY2VsRmlsZURlc2NyaXB0b3IgYmxvYkZpbGVEZXNjcmlwdG9yRm9yUXVlcnkoU1FMaXRlRGF0YWJhc2UgZGIsCisgICAgICAgICAgICBTdHJpbmcgcXVlcnksIFN0cmluZ1tdIHNlbGVjdGlvbkFyZ3MpIHsKKyAgICAgICAgU1FMaXRlU3RhdGVtZW50IHByb2cgPSBkYi5jb21waWxlU3RhdGVtZW50KHF1ZXJ5KTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJldHVybiBibG9iRmlsZURlc2NyaXB0b3JGb3JRdWVyeShwcm9nLCBzZWxlY3Rpb25BcmdzKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIHByb2cuY2xvc2UoKTsKICAgICAgICAgfQotICAgICAgICBTdHJpbmcgdmFsdWUgPSBwcm9nLnNpbXBsZVF1ZXJ5Rm9yU3RyaW5nKCk7Ci0gICAgICAgIHJldHVybiB2YWx1ZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBVdGlsaXR5IG1ldGhvZCB0byBydW4gdGhlIHByZS1jb21waWxlZCBxdWVyeSBhbmQgcmV0dXJuIHRoZSBibG9iIHZhbHVlIGluIHRoZQorICAgICAqIGZpcnN0IGNvbHVtbiBvZiB0aGUgZmlyc3Qgcm93LgorICAgICAqCisgICAgICogQHJldHVybiBBIHJlYWQtb25seSBmaWxlIGRlc2NyaXB0b3IgZm9yIGEgY29weSBvZiB0aGUgYmxvYiB2YWx1ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFBhcmNlbEZpbGVEZXNjcmlwdG9yIGJsb2JGaWxlRGVzY3JpcHRvckZvclF1ZXJ5KFNRTGl0ZVN0YXRlbWVudCBwcm9nLAorICAgICAgICAgICAgU3RyaW5nW10gc2VsZWN0aW9uQXJncykgeworICAgICAgICBwcm9nLmJpbmRBbGxBcmdzQXNTdHJpbmdzKHNlbGVjdGlvbkFyZ3MpOworICAgICAgICByZXR1cm4gcHJvZy5zaW1wbGVRdWVyeUZvckJsb2JGaWxlRGVzY3JpcHRvcigpOwogICAgIH0KIAogICAgIC8qKgpAQCAtNzA0LDggKzc2OSw4IEBACiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyB2b2lkIGN1cnNvclN0cmluZ1RvQ29udGVudFZhbHVlc0lmUHJlc2VudChDdXJzb3IgY3Vyc29yLCBDb250ZW50VmFsdWVzIHZhbHVlcywKICAgICAgICAgICAgIFN0cmluZyBjb2x1bW4pIHsKLSAgICAgICAgZmluYWwgaW50IGluZGV4ID0gY3Vyc29yLmdldENvbHVtbkluZGV4T3JUaHJvdyhjb2x1bW4pOwotICAgICAgICBpZiAoIWN1cnNvci5pc051bGwoaW5kZXgpKSB7CisgICAgICAgIGZpbmFsIGludCBpbmRleCA9IGN1cnNvci5nZXRDb2x1bW5JbmRleChjb2x1bW4pOworICAgICAgICBpZiAoaW5kZXggIT0gLTEgJiYgIWN1cnNvci5pc051bGwoaW5kZXgpKSB7CiAgICAgICAgICAgICB2YWx1ZXMucHV0KGNvbHVtbiwgY3Vyc29yLmdldFN0cmluZyhpbmRleCkpOwogICAgICAgICB9CiAgICAgfQpAQCAtNzIwLDggKzc4NSw4IEBACiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyB2b2lkIGN1cnNvckxvbmdUb0NvbnRlbnRWYWx1ZXNJZlByZXNlbnQoQ3Vyc29yIGN1cnNvciwgQ29udGVudFZhbHVlcyB2YWx1ZXMsCiAgICAgICAgICAgICBTdHJpbmcgY29sdW1uKSB7Ci0gICAgICAgIGZpbmFsIGludCBpbmRleCA9IGN1cnNvci5nZXRDb2x1bW5JbmRleE9yVGhyb3coY29sdW1uKTsKLSAgICAgICAgaWYgKCFjdXJzb3IuaXNOdWxsKGluZGV4KSkgeworICAgICAgICBmaW5hbCBpbnQgaW5kZXggPSBjdXJzb3IuZ2V0Q29sdW1uSW5kZXgoY29sdW1uKTsKKyAgICAgICAgaWYgKGluZGV4ICE9IC0xICYmICFjdXJzb3IuaXNOdWxsKGluZGV4KSkgewogICAgICAgICAgICAgdmFsdWVzLnB1dChjb2x1bW4sIGN1cnNvci5nZXRMb25nKGluZGV4KSk7CiAgICAgICAgIH0KICAgICB9CkBAIC03MzYsOCArODAxLDggQEAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIHZvaWQgY3Vyc29yU2hvcnRUb0NvbnRlbnRWYWx1ZXNJZlByZXNlbnQoQ3Vyc29yIGN1cnNvciwgQ29udGVudFZhbHVlcyB2YWx1ZXMsCiAgICAgICAgICAgICBTdHJpbmcgY29sdW1uKSB7Ci0gICAgICAgIGZpbmFsIGludCBpbmRleCA9IGN1cnNvci5nZXRDb2x1bW5JbmRleE9yVGhyb3coY29sdW1uKTsKLSAgICAgICAgaWYgKCFjdXJzb3IuaXNOdWxsKGluZGV4KSkgeworICAgICAgICBmaW5hbCBpbnQgaW5kZXggPSBjdXJzb3IuZ2V0Q29sdW1uSW5kZXgoY29sdW1uKTsKKyAgICAgICAgaWYgKGluZGV4ICE9IC0xICYmICFjdXJzb3IuaXNOdWxsKGluZGV4KSkgewogICAgICAgICAgICAgdmFsdWVzLnB1dChjb2x1bW4sIGN1cnNvci5nZXRTaG9ydChpbmRleCkpOwogICAgICAgICB9CiAgICAgfQpAQCAtNzUyLDggKzgxNyw4IEBACiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyB2b2lkIGN1cnNvckludFRvQ29udGVudFZhbHVlc0lmUHJlc2VudChDdXJzb3IgY3Vyc29yLCBDb250ZW50VmFsdWVzIHZhbHVlcywKICAgICAgICAgICAgIFN0cmluZyBjb2x1bW4pIHsKLSAgICAgICAgZmluYWwgaW50IGluZGV4ID0gY3Vyc29yLmdldENvbHVtbkluZGV4T3JUaHJvdyhjb2x1bW4pOwotICAgICAgICBpZiAoIWN1cnNvci5pc051bGwoaW5kZXgpKSB7CisgICAgICAgIGZpbmFsIGludCBpbmRleCA9IGN1cnNvci5nZXRDb2x1bW5JbmRleChjb2x1bW4pOworICAgICAgICBpZiAoaW5kZXggIT0gLTEgJiYgIWN1cnNvci5pc051bGwoaW5kZXgpKSB7CiAgICAgICAgICAgICB2YWx1ZXMucHV0KGNvbHVtbiwgY3Vyc29yLmdldEludChpbmRleCkpOwogICAgICAgICB9CiAgICAgfQpAQCAtNzY4LDggKzgzMyw4IEBACiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyB2b2lkIGN1cnNvckZsb2F0VG9Db250ZW50VmFsdWVzSWZQcmVzZW50KEN1cnNvciBjdXJzb3IsIENvbnRlbnRWYWx1ZXMgdmFsdWVzLAogICAgICAgICAgICAgU3RyaW5nIGNvbHVtbikgewotICAgICAgICBmaW5hbCBpbnQgaW5kZXggPSBjdXJzb3IuZ2V0Q29sdW1uSW5kZXhPclRocm93KGNvbHVtbik7Ci0gICAgICAgIGlmICghY3Vyc29yLmlzTnVsbChpbmRleCkpIHsKKyAgICAgICAgZmluYWwgaW50IGluZGV4ID0gY3Vyc29yLmdldENvbHVtbkluZGV4KGNvbHVtbik7CisgICAgICAgIGlmIChpbmRleCAhPSAtMSAmJiAhY3Vyc29yLmlzTnVsbChpbmRleCkpIHsKICAgICAgICAgICAgIHZhbHVlcy5wdXQoY29sdW1uLCBjdXJzb3IuZ2V0RmxvYXQoaW5kZXgpKTsKICAgICAgICAgfQogICAgIH0KQEAgLTc4NCw4ICs4NDksOCBAQAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBjdXJzb3JEb3VibGVUb0NvbnRlbnRWYWx1ZXNJZlByZXNlbnQoQ3Vyc29yIGN1cnNvciwgQ29udGVudFZhbHVlcyB2YWx1ZXMsCiAgICAgICAgICAgICBTdHJpbmcgY29sdW1uKSB7Ci0gICAgICAgIGZpbmFsIGludCBpbmRleCA9IGN1cnNvci5nZXRDb2x1bW5JbmRleE9yVGhyb3coY29sdW1uKTsKLSAgICAgICAgaWYgKCFjdXJzb3IuaXNOdWxsKGluZGV4KSkgeworICAgICAgICBmaW5hbCBpbnQgaW5kZXggPSBjdXJzb3IuZ2V0Q29sdW1uSW5kZXgoY29sdW1uKTsKKyAgICAgICAgaWYgKGluZGV4ICE9IC0xICYmICFjdXJzb3IuaXNOdWxsKGluZGV4KSkgewogICAgICAgICAgICAgdmFsdWVzLnB1dChjb2x1bW4sIGN1cnNvci5nZXREb3VibGUoaW5kZXgpKTsKICAgICAgICAgfQogICAgIH0KQEAgLTExNTIsNCArMTIxNyw1OSBAQAogICAgICAgICBkYi5zZXRWZXJzaW9uKGRiVmVyc2lvbik7CiAgICAgICAgIGRiLmNsb3NlKCk7CiAgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyBvbmUgb2YgdGhlIGZvbGxvd2luZyB3aGljaCByZXByZXNlbnQgdGhlIHR5cGUgb2YgdGhlIGdpdmVuIFNRTCBzdGF0ZW1lbnQuCisgICAgICogPG9sPgorICAgICAqICAgPGxpPntAbGluayAjU1RBVEVNRU5UX1NFTEVDVH08L2xpPgorICAgICAqICAgPGxpPntAbGluayAjU1RBVEVNRU5UX1VQREFURX08L2xpPgorICAgICAqICAgPGxpPntAbGluayAjU1RBVEVNRU5UX0FUVEFDSH08L2xpPgorICAgICAqICAgPGxpPntAbGluayAjU1RBVEVNRU5UX0JFR0lOfTwvbGk+CisgICAgICogICA8bGk+e0BsaW5rICNTVEFURU1FTlRfQ09NTUlUfTwvbGk+CisgICAgICogICA8bGk+e0BsaW5rICNTVEFURU1FTlRfQUJPUlR9PC9saT4KKyAgICAgKiAgIDxsaT57QGxpbmsgI1NUQVRFTUVOVF9PVEhFUn08L2xpPgorICAgICAqIDwvb2w+CisgICAgICogQHBhcmFtIHNxbCB0aGUgU1FMIHN0YXRlbWVudCB3aG9zZSB0eXBlIGlzIHJldHVybmVkIGJ5IHRoaXMgbWV0aG9kCisgICAgICogQHJldHVybiBvbmUgb2YgdGhlIHZhbHVlcyBsaXN0ZWQgYWJvdmUKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGludCBnZXRTcWxTdGF0ZW1lbnRUeXBlKFN0cmluZyBzcWwpIHsKKyAgICAgICAgc3FsID0gc3FsLnRyaW0oKTsKKyAgICAgICAgaWYgKHNxbC5sZW5ndGgoKSA8IDMpIHsKKyAgICAgICAgICAgIHJldHVybiBTVEFURU1FTlRfT1RIRVI7CisgICAgICAgIH0KKyAgICAgICAgU3RyaW5nIHByZWZpeFNxbCA9IHNxbC5zdWJzdHJpbmcoMCwgMykudG9VcHBlckNhc2UoKTsKKyAgICAgICAgaWYgKHByZWZpeFNxbC5lcXVhbHMoIlNFTCIpKSB7CisgICAgICAgICAgICByZXR1cm4gU1RBVEVNRU5UX1NFTEVDVDsKKyAgICAgICAgfSBlbHNlIGlmIChwcmVmaXhTcWwuZXF1YWxzKCJJTlMiKSB8fAorICAgICAgICAgICAgICAgIHByZWZpeFNxbC5lcXVhbHMoIlVQRCIpIHx8CisgICAgICAgICAgICAgICAgcHJlZml4U3FsLmVxdWFscygiUkVQIikgfHwKKyAgICAgICAgICAgICAgICBwcmVmaXhTcWwuZXF1YWxzKCJERUwiKSkgeworICAgICAgICAgICAgcmV0dXJuIFNUQVRFTUVOVF9VUERBVEU7CisgICAgICAgIH0gZWxzZSBpZiAocHJlZml4U3FsLmVxdWFscygiQVRUIikpIHsKKyAgICAgICAgICAgIHJldHVybiBTVEFURU1FTlRfQVRUQUNIOworICAgICAgICB9IGVsc2UgaWYgKHByZWZpeFNxbC5lcXVhbHMoIkNPTSIpKSB7CisgICAgICAgICAgICByZXR1cm4gU1RBVEVNRU5UX0NPTU1JVDsKKyAgICAgICAgfSBlbHNlIGlmIChwcmVmaXhTcWwuZXF1YWxzKCJFTkQiKSkgeworICAgICAgICAgICAgcmV0dXJuIFNUQVRFTUVOVF9DT01NSVQ7CisgICAgICAgIH0gZWxzZSBpZiAocHJlZml4U3FsLmVxdWFscygiUk9MIikpIHsKKyAgICAgICAgICAgIHJldHVybiBTVEFURU1FTlRfQUJPUlQ7CisgICAgICAgIH0gZWxzZSBpZiAocHJlZml4U3FsLmVxdWFscygiQkVHIikpIHsKKyAgICAgICAgICAgIHJldHVybiBTVEFURU1FTlRfQkVHSU47CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIFNUQVRFTUVOVF9PVEhFUjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBcHBlbmRzIG9uZSBzZXQgb2Ygc2VsZWN0aW9uIGFyZ3MgdG8gYW5vdGhlci4gVGhpcyBpcyB1c2VmdWwgd2hlbiBhZGRpbmcgYSBzZWxlY3Rpb24KKyAgICAgKiBhcmd1bWVudCB0byBhIHVzZXIgcHJvdmlkZWQgc2V0LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nW10gYXBwZW5kU2VsZWN0aW9uQXJncyhTdHJpbmdbXSBvcmlnaW5hbFZhbHVlcywgU3RyaW5nW10gbmV3VmFsdWVzKSB7CisgICAgICAgIGlmIChvcmlnaW5hbFZhbHVlcyA9PSBudWxsIHx8IG9yaWdpbmFsVmFsdWVzLmxlbmd0aCA9PSAwKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3VmFsdWVzOworICAgICAgICB9CisgICAgICAgIFN0cmluZ1tdIHJlc3VsdCA9IG5ldyBTdHJpbmdbb3JpZ2luYWxWYWx1ZXMubGVuZ3RoICsgbmV3VmFsdWVzLmxlbmd0aCBdOworICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KG9yaWdpbmFsVmFsdWVzLCAwLCByZXN1bHQsIDAsIG9yaWdpbmFsVmFsdWVzLmxlbmd0aCk7CisgICAgICAgIFN5c3RlbS5hcnJheWNvcHkobmV3VmFsdWVzLCAwLCByZXN1bHQsIG9yaWdpbmFsVmFsdWVzLmxlbmd0aCwgbmV3VmFsdWVzLmxlbmd0aCk7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2UvRGVmYXVsdERhdGFiYXNlRXJyb3JIYW5kbGVyLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9EZWZhdWx0RGF0YWJhc2VFcnJvckhhbmRsZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNjE5ZTQ4Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2UvRGVmYXVsdERhdGFiYXNlRXJyb3JIYW5kbGVyLmphdmEKQEAgLTAsMCArMSw5NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIGFuZHJvaWQuZGF0YWJhc2U7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKKworaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlLlNRTGl0ZURhdGFiYXNlOworaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlLlNRTGl0ZUV4Y2VwdGlvbjsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworaW1wb3J0IGFuZHJvaWQudXRpbC5QYWlyOworCisvKioKKyAqIERlZmF1bHQgY2xhc3MgdXNlZCBkZWZpbmluZyB0aGUgYWN0aW9ucyB0byB0YWtlIHdoZW4gdGhlIGZvbGxvd2luZyBlcnJvcnMgYXJlIGRldGVjdGVkCisgKiAgIGRhdGFiYXNlIGNvcnJ1cHRpb24KKyAqLworcHVibGljIGZpbmFsIGNsYXNzIERlZmF1bHREYXRhYmFzZUVycm9ySGFuZGxlciBpbXBsZW1lbnRzIERhdGFiYXNlRXJyb3JIYW5kbGVyIHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiRGVmYXVsdERhdGFiYXNlRXJyb3JIYW5kbGVyIjsKKworICAgIC8qKgorICAgICAqIGRlZmluZXMgdGhlIGRlZmF1bHQgbWV0aG9kIHRvIGJlIGludm9rZWQgd2hlbiBkYXRhYmFzZSBjb3JydXB0aW9uIGlzIGRldGVjdGVkLgorICAgICAqIEBwYXJhbSBkYk9iaiB0aGUge0BsaW5rIFNRTGl0ZURhdGFiYXNlfSBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSBkYXRhYmFzZSBvbiB3aGljaCBjb3JydXB0aW9uCisgICAgICogaXMgZGV0ZWN0ZWQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgb25Db3JydXB0aW9uKFNRTGl0ZURhdGFiYXNlIGRiT2JqKSB7CisgICAgICAgIExvZy5lKFRBRywgIkNvcnJ1cHRpb24gcmVwb3J0ZWQgYnkgc3FsaXRlIG9uIGRhdGFiYXNlOiAiICsgZGJPYmouZ2V0UGF0aCgpKTsKKworICAgICAgICAvLyBpcyB0aGUgY29ycnVwdGlvbiBkZXRlY3RlZCBldmVuIGJlZm9yZSBkYXRhYmFzZSBjb3VsZCBiZSAnb3BlbmVkJz8KKyAgICAgICAgaWYgKCFkYk9iai5pc09wZW4oKSkgeworICAgICAgICAgICAgLy8gZGF0YWJhc2UgZmlsZXMgYXJlIG5vdCBldmVuIG9wZW5hYmxlLiBkZWxldGUgdGhpcyBkYXRhYmFzZSBmaWxlLgorICAgICAgICAgICAgLy8gTk9URSBpZiB0aGUgZGF0YWJhc2UgaGFzIGF0dGFjaGVkIGRhdGFiYXNlcywgdGhlbiBhbnkgb2YgdGhlbSBjb3VsZCBiZSBjb3JydXB0LgorICAgICAgICAgICAgLy8gYW5kIG5vdCBkZWxldGluZyBhbGwgb2YgdGhlbSBjb3VsZCBjYXVzZSBjb3JydXB0ZWQgZGF0YWJhc2UgZmlsZSB0byByZW1haW4gYW5kIAorICAgICAgICAgICAgLy8gbWFrZSB0aGUgYXBwbGljYXRpb24gY3Jhc2ggb24gZGF0YWJhc2Ugb3BlbiBvcGVyYXRpb24uIFRvIGF2b2lkIHRoaXMgcHJvYmxlbSwKKyAgICAgICAgICAgIC8vIHRoZSBhcHBsaWNhdGlvbiBzaG91bGQgcHJvdmlkZSBpdHMgb3duIHtAbGluayBEYXRhYmFzZUVycm9ySGFuZGxlcn0gaW1wbCBjbGFzcworICAgICAgICAgICAgLy8gdG8gZGVsZXRlIEFMTCBmaWxlcyBvZiB0aGUgZGF0YWJhc2UgKGluY2x1ZGluZyB0aGUgYXR0YWNoZWQgZGF0YWJhc2VzKS4KKyAgICAgICAgICAgIGRlbGV0ZURhdGFiYXNlRmlsZShkYk9iai5nZXRQYXRoKCkpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgQXJyYXlMaXN0PFBhaXI8U3RyaW5nLCBTdHJpbmc+PiBhdHRhY2hlZERicyA9IG51bGw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyBDbG9zZSB0aGUgZGF0YWJhc2UsIHdoaWNoIHdpbGwgY2F1c2Ugc3Vic2VxdWVudCBvcGVyYXRpb25zIHRvIGZhaWwuCisgICAgICAgICAgICAvLyBiZWZvcmUgdGhhdCwgZ2V0IHRoZSBhdHRhY2hlZCBkYXRhYmFzZSBsaXN0IGZpcnN0LgorICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBhdHRhY2hlZERicyA9IGRiT2JqLmdldEF0dGFjaGVkRGJzKCk7CisgICAgICAgICAgICB9IGNhdGNoIChTUUxpdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIC8qIGlnbm9yZSAqLworICAgICAgICAgICAgfQorICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBkYk9iai5jbG9zZSgpOworICAgICAgICAgICAgfSBjYXRjaCAoU1FMaXRlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAvKiBpZ25vcmUgKi8KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIC8vIERlbGV0ZSBhbGwgZmlsZXMgb2YgdGhpcyBjb3JydXB0IGRhdGFiYXNlIGFuZC9vciBhdHRhY2hlZCBkYXRhYmFzZXMKKyAgICAgICAgICAgIGlmIChhdHRhY2hlZERicyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgZm9yIChQYWlyPFN0cmluZywgU3RyaW5nPiBwIDogYXR0YWNoZWREYnMpIHsKKyAgICAgICAgICAgICAgICAgICAgZGVsZXRlRGF0YWJhc2VGaWxlKHAuc2Vjb25kKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8vIGF0dGFjaGVkRGJzID0gbnVsbCBpcyBwb3NzaWJsZSB3aGVuIHRoZSBkYXRhYmFzZSBpcyBzbyBjb3JydXB0IHRoYXQgZXZlbgorICAgICAgICAgICAgICAgIC8vICJQUkFHTUEgZGF0YWJhc2VfbGlzdDsiIGFsc28gZmFpbHMuIGRlbGV0ZSB0aGUgbWFpbiBkYXRhYmFzZSBmaWxlCisgICAgICAgICAgICAgICAgZGVsZXRlRGF0YWJhc2VGaWxlKGRiT2JqLmdldFBhdGgoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgZGVsZXRlRGF0YWJhc2VGaWxlKFN0cmluZyBmaWxlTmFtZSkgeworICAgICAgICBpZiAoZmlsZU5hbWUuZXF1YWxzSWdub3JlQ2FzZSgiOm1lbW9yeToiKSB8fCBmaWxlTmFtZS50cmltKCkubGVuZ3RoKCkgPT0gMCkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIExvZy5lKFRBRywgImRlbGV0aW5nIHRoZSBkYXRhYmFzZSBmaWxlOiAiICsgZmlsZU5hbWUpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgbmV3IEZpbGUoZmlsZU5hbWUpLmRlbGV0ZSgpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgLyogcHJpbnQgd2FybmluZyBhbmQgaWdub3JlIGV4Y2VwdGlvbiAqLworICAgICAgICAgICAgTG9nLncoVEFHLCAiZGVsZXRlIGZhaWxlZDogIiArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL0lCdWxrQ3Vyc29yLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9JQnVsa0N1cnNvci5qYXZhCmluZGV4IDQ2NzkwYTMuLjI0NGM4OGYgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL0lCdWxrQ3Vyc29yLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2UvSUJ1bGtDdXJzb3IuamF2YQpAQCAtMTYsMTYgKzE2LDE0IEBACiAKIHBhY2thZ2UgYW5kcm9pZC5kYXRhYmFzZTsKIAotaW1wb3J0IGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uOworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOwogaW1wb3J0IGFuZHJvaWQub3MuSUJpbmRlcjsKIGltcG9ydCBhbmRyb2lkLm9zLklJbnRlcmZhY2U7Ci1pbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uOwogCiAvKioKICAqIFRoaXMgaW50ZXJmYWNlIHByb3ZpZGVzIGEgbG93LWxldmVsIHdheSB0byBwYXNzIGJ1bGsgY3Vyc29yIGRhdGEgYWNyb3NzCi0gKiBib3RoIHByb2Nlc3MgYW5kIGxhbmd1YWdlIGJvdW5kcmllcy4gQXBwbGljYXRpb24gY29kZSBzaG91bGQgdXNlIHRoZSBDdXJzb3IKKyAqIGJvdGggcHJvY2VzcyBhbmQgbGFuZ3VhZ2UgYm91bmRhcmllcy4gQXBwbGljYXRpb24gY29kZSBzaG91bGQgdXNlIHRoZSBDdXJzb3IKICAqIGludGVyZmFjZSBkaXJlY3RseS4KICAqCiAgKiB7QGhpZGV9CkBAIC01NCwxMCArNTIsNiBAQAogICAgICAqLwogICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRDb2x1bW5OYW1lcygpIHRocm93cyBSZW1vdGVFeGNlcHRpb247CiAKLSAgICBwdWJsaWMgYm9vbGVhbiB1cGRhdGVSb3dzKE1hcDw/IGV4dGVuZHMgTG9uZywgPyBleHRlbmRzIE1hcDxTdHJpbmcsIE9iamVjdD4+IHZhbHVlcykgdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbjsKLQotICAgIHB1YmxpYyBib29sZWFuIGRlbGV0ZVJvdyhpbnQgcG9zaXRpb24pIHRocm93cyBSZW1vdGVFeGNlcHRpb247Ci0KICAgICBwdWJsaWMgdm9pZCBkZWFjdGl2YXRlKCkgdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbjsKIAogICAgIHB1YmxpYyB2b2lkIGNsb3NlKCkgdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbjsKQEAgLTc2LDggKzcwLDYgQEAKICAgICBzdGF0aWMgZmluYWwgaW50IEdFVF9DVVJTT1JfV0lORE9XX1RSQU5TQUNUSU9OID0gSUJpbmRlci5GSVJTVF9DQUxMX1RSQU5TQUNUSU9OOwogICAgIHN0YXRpYyBmaW5hbCBpbnQgQ09VTlRfVFJBTlNBQ1RJT04gPSBJQmluZGVyLkZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyAxOwogICAgIHN0YXRpYyBmaW5hbCBpbnQgR0VUX0NPTFVNTl9OQU1FU19UUkFOU0FDVElPTiA9IElCaW5kZXIuRklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDI7Ci0gICAgc3RhdGljIGZpbmFsIGludCBVUERBVEVfUk9XU19UUkFOU0FDVElPTiA9IElCaW5kZXIuRklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDM7Ci0gICAgc3RhdGljIGZpbmFsIGludCBERUxFVEVfUk9XX1RSQU5TQUNUSU9OID0gSUJpbmRlci5GSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgNDsKICAgICBzdGF0aWMgZmluYWwgaW50IERFQUNUSVZBVEVfVFJBTlNBQ1RJT04gPSBJQmluZGVyLkZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyA1OwogICAgIHN0YXRpYyBmaW5hbCBpbnQgUkVRVUVSWV9UUkFOU0FDVElPTiA9IElCaW5kZXIuRklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDY7CiAgICAgc3RhdGljIGZpbmFsIGludCBPTl9NT1ZFX1RSQU5TQUNUSU9OID0gSUJpbmRlci5GSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgNzsKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL01hdHJpeEN1cnNvci5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2UvTWF0cml4Q3Vyc29yLmphdmEKaW5kZXggZDVjM2EzMi4uNWMxYjk2OCAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2UvTWF0cml4Q3Vyc29yLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2UvTWF0cml4Q3Vyc29yLmphdmEKQEAgLTI3Miw2ICsyNzIsMTEgQEAKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgaW50IGdldFR5cGUoaW50IGNvbHVtbikgeworICAgICAgICByZXR1cm4gRGF0YWJhc2VVdGlscy5nZXRUeXBlT2ZPYmplY3QoZ2V0KGNvbHVtbikpOworICAgIH0KKworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBib29sZWFuIGlzTnVsbChpbnQgY29sdW1uKSB7CiAgICAgICAgIHJldHVybiBnZXQoY29sdW1uKSA9PSBudWxsOwogICAgIH0KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL01lcmdlQ3Vyc29yLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9NZXJnZUN1cnNvci5qYXZhCmluZGV4IDcyMmQ3MDcuLjJjMjVkYjcgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL01lcmdlQ3Vyc29yLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2UvTWVyZ2VDdXJzb3IuamF2YQpAQCAtOTIsMzIgKzkyLDYgQEAKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIAotICAgIC8qKgotICAgICAqIEBoaWRlCi0gICAgICogQGRlcHJlY2F0ZWQKLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBkZWxldGVSb3coKQotICAgIHsKLSAgICAgICAgcmV0dXJuIG1DdXJzb3IuZGVsZXRlUm93KCk7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIEBoaWRlCi0gICAgICogQGRlcHJlY2F0ZWQKLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBjb21taXRVcGRhdGVzKCkgewotICAgICAgICBpbnQgbGVuZ3RoID0gbUN1cnNvcnMubGVuZ3RoOwotICAgICAgICBmb3IgKGludCBpID0gMCA7IGkgPCBsZW5ndGggOyBpKyspIHsKLSAgICAgICAgICAgIGlmIChtQ3Vyc29yc1tpXSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbUN1cnNvcnNbaV0uY29tbWl0VXBkYXRlcygpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIG9uQ2hhbmdlKHRydWUpOwotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgU3RyaW5nIGdldFN0cmluZyhpbnQgY29sdW1uKQogICAgIHsKQEAgLTE1NSw2ICsxMjksMTEgQEAKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgaW50IGdldFR5cGUoaW50IGNvbHVtbikgeworICAgICAgICByZXR1cm4gbUN1cnNvci5nZXRUeXBlKGNvbHVtbik7CisgICAgfQorCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGJvb2xlYW4gaXNOdWxsKGludCBjb2x1bW4pCiAgICAgewogICAgICAgICByZXR1cm4gbUN1cnNvci5pc051bGwoY29sdW1uKTsKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL1JlcXVlcnlPblVpVGhyZWFkRXhjZXB0aW9uLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9SZXF1ZXJ5T25VaVRocmVhZEV4Y2VwdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk3YTUwZDgKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9SZXF1ZXJ5T25VaVRocmVhZEV4Y2VwdGlvbi5qYXZhCkBAIC0wLDAgKzEsMjkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQuZGF0YWJhc2U7CisKKy8qKgorICogQW4gZXhjZXB0aW9uIHRoYXQgaW5kaWNhdGVzIGludm9raW5nIHtAbGluayBDdXJzb3IjcmVxdWVyeSgpfSBvbiBNYWluIHRocmVhZCBjb3VsZCBjYXVzZSBBTlIuCisgKiBUaGlzIGV4Y2VwdGlvbiBzaG91bGQgZW5jb3VyYWdlIGFwcHMgdG8gaW52b2tlIHtAbGluayBDdXJzb3IjcmVxdWVyeSgpfSBpbiBhIGJhY2tncm91bmQgdGhyZWFkLiAKKyAqIEBoaWRlCisgKi8KK3B1YmxpYyBjbGFzcyBSZXF1ZXJ5T25VaVRocmVhZEV4Y2VwdGlvbiBleHRlbmRzIFJ1bnRpbWVFeGNlcHRpb24geworICAgIHB1YmxpYyBSZXF1ZXJ5T25VaVRocmVhZEV4Y2VwdGlvbihTdHJpbmcgcGFja2FnZU5hbWUpIHsKKyAgICAgICAgc3VwZXIoIkluICIgKyBwYWNrYWdlTmFtZSArICIgUmVxdWVyeSBpcyBleGVjdXRpbmcgb24gbWFpbiAoVUkpIHRocmVhZC4gY291bGQgY2F1c2UgQU5SLiAiICsKKyAgICAgICAgICAgICAgICAiZG8gaXQgaW4gYmFja2dyb3VuZCB0aHJlYWQuIik7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2Uvc3FsaXRlL0RhdGFiYXNlQ29ubmVjdGlvblBvb2wuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9EYXRhYmFzZUNvbm5lY3Rpb25Qb29sLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTRiMDYwNQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9EYXRhYmFzZUNvbm5lY3Rpb25Qb29sLmphdmEKQEAgLTAsMCArMSwzNjQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZTsKKworaW1wb3J0IGFuZHJvaWQub3MuU3lzdGVtQ2xvY2s7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CitpbXBvcnQgamF2YS51dGlsLlJhbmRvbTsKKworLyoqCisgKiBBIGNvbm5lY3Rpb24gcG9vbCB0byBiZSB1c2VkIGJ5IHJlYWRlcnMuCisgKiBOb3RlIHRoYXQgZWFjaCBjb25uZWN0aW9uIGNhbiBiZSB1c2VkIGJ5IG9ubHkgb25lIHJlYWRlciBhdCBhIHRpbWUuCisgKi8KKy8qIHBhY2thZ2UgKi8gY2xhc3MgRGF0YWJhc2VDb25uZWN0aW9uUG9vbCB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIkRhdGFiYXNlQ29ubmVjdGlvblBvb2wiOworCisgICAgLyoqIFRoZSBkZWZhdWx0IGNvbm5lY3Rpb24gcG9vbCBzaXplLiBJdCBpcyBzZXQgYmFzZWQgb24gdGhlIGFtb3VudCBvZiBtZW1vcnkgdGhlIGRldmljZSBoYXMuCisgICAgICogVE9ETzogc2V0IHRoaXMgd2l0aCAnYSBzeXN0ZW0gY2FsbCcgd2hpY2ggcmV0dXJucyB0aGUgYW1vdW50IG9mIG1lbW9yeSB0aGUgZGV2aWNlIGhhcworICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBERUZBVUxUX0NPTk5FQ1RJT05fUE9PTF9TSVpFID0gMTsKKworICAgIC8qKiB0aGUgcG9vbCBzaXplIHNldCBmb3IgdGhpcyB7QGxpbmsgU1FMaXRlRGF0YWJhc2V9ICovCisgICAgcHJpdmF0ZSB2b2xhdGlsZSBpbnQgbU1heFBvb2xTaXplID0gREVGQVVMVF9DT05ORUNUSU9OX1BPT0xfU0laRTsKKworICAgIC8qKiBUaGUgY29ubmVjdGlvbiBwb29sIG9iamVjdHMgYXJlIHN0b3JlZCBpbiB0aGlzIG1lbWJlci4KKyAgICAgKiBUT0RPOiByZXZpc2l0IHRoaXMgZGF0YSBzdHJ1Y3QgYXMgdGhlIG51bWJlciBvZiBwb29sZWQgY29ubmVjdGlvbnMgaW5jcmVhc2UgYmV5b25kCisgICAgICogc2luZ2xlLWRpZ2l0IHZhbHVlcy4KKyAgICAgKi8KKyAgICBwcml2YXRlIGZpbmFsIEFycmF5TGlzdDxQb29sT2JqPiBtUG9vbCA9IG5ldyBBcnJheUxpc3Q8UG9vbE9iaj4obU1heFBvb2xTaXplKTsKKworICAgIC8qKiB0aGUgbWFpbiBkYXRhYmFzZSBjb25uZWN0aW9uIHRvIHdoaWNoIHRoaXMgY29ubmVjdGlvbiBwb29sIGlzIGF0dGFjaGVkICovCisgICAgcHJpdmF0ZSBmaW5hbCBTUUxpdGVEYXRhYmFzZSBtUGFyZW50RGJPYmo7CisKKyAgICAvKiogUmFuZG9tIG51bWJlciBnZW5lcmF0b3IgdXNlZCB0byBwaWNrIGEgZnJlZSBjb25uZWN0aW9uIG91dCBvZiB0aGUgcG9vbCAqLworICAgIHByaXZhdGUgUmFuZG9tIHJhbmQ7IC8vIGxhemlseSBpbml0aWFsaXplZAorCisgICAgLyogcGFja2FnZSAqLyBEYXRhYmFzZUNvbm5lY3Rpb25Qb29sKFNRTGl0ZURhdGFiYXNlIGRiKSB7CisgICAgICAgIHRoaXMubVBhcmVudERiT2JqID0gZGI7CisgICAgICAgIGlmIChMb2cuaXNMb2dnYWJsZShUQUcsIExvZy5ERUJVRykpIHsKKyAgICAgICAgICAgIExvZy5kKFRBRywgIk1heCBQb29sIFNpemU6ICIgKyBtTWF4UG9vbFNpemUpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogY2xvc2UgYWxsIGRhdGFiYXNlIGNvbm5lY3Rpb25zIGluIHRoZSBwb29sIC0gZXZlbiBpZiB0aGV5IGFyZSBpbiB1c2UhCisgICAgICovCisgICAgLyogcGFja2FnZSAqLyB2b2lkIGNsb3NlKCkgeworICAgICAgICBzeW5jaHJvbml6ZWQobVBhcmVudERiT2JqKSB7CisgICAgICAgICAgICBpZiAoTG9nLmlzTG9nZ2FibGUoVEFHLCBMb2cuREVCVUcpKSB7CisgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiQ2xvc2luZyB0aGUgY29ubmVjdGlvbiBwb29sIG9uICIgKyBtUGFyZW50RGJPYmouZ2V0UGF0aCgpICsgdG9TdHJpbmcoKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmb3IgKGludCBpID0gbVBvb2wuc2l6ZSgpIC0gMTsgaSA+PSAwOyBpLS0pIHsKKyAgICAgICAgICAgICAgICBtUG9vbC5nZXQoaSkubURiLmNsb3NlKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtUG9vbC5jbGVhcigpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogZ2V0IGEgZnJlZSBjb25uZWN0aW9uIGZyb20gdGhlIHBvb2wKKyAgICAgKgorICAgICAqIEBwYXJhbSBzcWwgaWYgbm90IG51bGwsIHRyeSB0byBmaW5kIGEgY29ubmVjdGlvbiBpbnRoZSBwb29sIHdoaWNoIGFscmVhZHkgaGFzIGNhY2hlZAorICAgICAqIHRoZSBjb21waWxlZCBzdGF0ZW1lbnQgZm9yIHRoaXMgc3FsLgorICAgICAqIEByZXR1cm4gdGhlIERhdGFiYXNlIGNvbm5lY3Rpb24gdGhhdCB0aGUgY2FsbGVyIGNhbiB1c2UKKyAgICAgKi8KKyAgICAvKiBwYWNrYWdlICovIFNRTGl0ZURhdGFiYXNlIGdldChTdHJpbmcgc3FsKSB7CisgICAgICAgIFNRTGl0ZURhdGFiYXNlIGRiID0gbnVsbDsKKyAgICAgICAgUG9vbE9iaiBwb29sT2JqID0gbnVsbDsKKyAgICAgICAgc3luY2hyb25pemVkKG1QYXJlbnREYk9iaikgeworICAgICAgICAgICAgaW50IHBvb2xTaXplID0gbVBvb2wuc2l6ZSgpOworICAgICAgICAgICAgaWYgKExvZy5pc0xvZ2dhYmxlKFRBRywgTG9nLkRFQlVHKSkgeworICAgICAgICAgICAgICAgIGFzc2VydCBzcWwgIT0gbnVsbDsKKyAgICAgICAgICAgICAgICBkb0Fzc2VydHMoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChnZXRGcmVlUG9vbFNpemUoKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgLy8gbm8gZnJlZSAoID0gYXZhaWxhYmxlKSBjb25uZWN0aW9ucworICAgICAgICAgICAgICAgIGlmIChtTWF4UG9vbFNpemUgPT0gcG9vbFNpemUpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gbWF4ZWQgb3V0LiBjYW4ndCBvcGVuIGFueSBtb3JlIGNvbm5lY3Rpb25zLgorICAgICAgICAgICAgICAgICAgICAvLyBsZXQgdGhlIGNhbGxlciB3YWl0IG9uIG9uZSBvZiB0aGUgcG9vbGVkIGNvbm5lY3Rpb25zCisgICAgICAgICAgICAgICAgICAgIC8vIHByZWZlcmFibHkgYSBjb25uZWN0aW9uIGNhY2hpbmcgdGhlIHByZS1jb21waWxlZCBzdGF0ZW1lbnQgb2YgdGhlIGdpdmVuIFNRTAorICAgICAgICAgICAgICAgICAgICBpZiAobU1heFBvb2xTaXplID09IDEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBvb2xPYmogPSBtUG9vbC5nZXQoMCk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1NYXhQb29sU2l6ZTsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1Qb29sLmdldChpKS5tRGIuaXNTcWxJblN0YXRlbWVudENhY2hlKHNxbCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9vbE9iaiA9IG1Qb29sLmdldChpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBvb2xPYmogPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZXJlIGFyZSBubyBkYXRhYmFzZSBjb25uZWN0aW9ucyB3aXRoIHRoZSBnaXZlbiBTUUwgcHJlLWNvbXBpbGVkLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9rIHRvIHJldHVybiBhbnkgb2YgdGhlIGNvbm5lY3Rpb25zLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyYW5kID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFuZCA9IG5ldyBSYW5kb20oU3lzdGVtQ2xvY2suZWxhcHNlZFJlYWx0aW1lKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb29sT2JqID0gbVBvb2wuZ2V0KHJhbmQubmV4dEludChtTWF4UG9vbFNpemUpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBkYiA9IHBvb2xPYmoubURiOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIC8vIGNyZWF0ZSBhIG5ldyBjb25uZWN0aW9uIGFuZCBhZGQgaXQgdG8gdGhlIHBvb2wsIHNpbmNlIHdlIGhhdmVuJ3QgcmVhY2hlZAorICAgICAgICAgICAgICAgICAgICAvLyBtYXggcG9vbCBzaXplIGFsbG93ZWQKKyAgICAgICAgICAgICAgICAgICAgZGIgPSBtUGFyZW50RGJPYmouY3JlYXRlUG9vbENvbm5lY3Rpb24oKHNob3J0KShwb29sU2l6ZSArIDEpKTsKKyAgICAgICAgICAgICAgICAgICAgcG9vbE9iaiA9IG5ldyBQb29sT2JqKGRiKTsKKyAgICAgICAgICAgICAgICAgICAgbVBvb2wuYWRkKHBvb2xTaXplLCBwb29sT2JqKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8vIHRoZXJlIGFyZSBmcmVlIGNvbm5lY3Rpb25zIGF2YWlsYWJsZS4gcGljayBvbmUKKyAgICAgICAgICAgICAgICAvLyBwcmVmZXJhYmx5IGEgY29ubmVjdGlvbiBjYWNoaW5nIHRoZSBwcmUtY29tcGlsZWQgc3RhdGVtZW50IG9mIHRoZSBnaXZlbiBTUUwKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHBvb2xTaXplOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1Qb29sLmdldChpKS5pc0ZyZWUoKSAmJiBtUG9vbC5nZXQoaSkubURiLmlzU3FsSW5TdGF0ZW1lbnRDYWNoZShzcWwpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwb29sT2JqID0gbVBvb2wuZ2V0KGkpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKHBvb2xPYmogPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAvLyBkaWRuJ3QgZmluZCBhIGZyZWUgZGF0YWJhc2UgY29ubmVjdGlvbiB3aXRoIHRoZSBnaXZlbiBTUUwgYWxyZWFkeQorICAgICAgICAgICAgICAgICAgICAvLyBwcmUtY29tcGlsZWQuIHJldHVybiBhIGZyZWUgY29ubmVjdGlvbiAodGhpcyBtZWFucywgdGhlIHNhbWUgU1FMIGNvdWxkIGJlCisgICAgICAgICAgICAgICAgICAgIC8vIHByZS1jb21waWxlZCBvbiBtb3JlIHRoYW4gb25lIGRhdGFiYXNlIGNvbm5lY3Rpb24uIHBvdGVudGlhbCB3YXN0ZWQgbWVtb3J5LikKKyAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwb29sU2l6ZTsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobVBvb2wuZ2V0KGkpLmlzRnJlZSgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9vbE9iaiA9IG1Qb29sLmdldChpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBkYiA9IHBvb2xPYmoubURiOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBhc3NlcnQgcG9vbE9iaiAhPSBudWxsOworICAgICAgICAgICAgYXNzZXJ0IHBvb2xPYmoubURiID09IGRiOworCisgICAgICAgICAgICBwb29sT2JqLmFjcXVpcmUoKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChMb2cuaXNMb2dnYWJsZShUQUcsIExvZy5ERUJVRykpIHsKKyAgICAgICAgICAgIExvZy5kKFRBRywgIkVORCBnZXQtY29ubmVjdGlvbjogIiArIHRvU3RyaW5nKCkgKyBwb29sT2JqLnRvU3RyaW5nKCkpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBkYjsKKyAgICAgICAgLy8gVE9ETyBpZiBhIHRocmVhZCBhY3F1aXJlcyBhIGNvbm5lY3Rpb24gYW5kIGRpZXMgd2l0aG91dCByZWxlYXNpbmcgdGhlIGNvbm5lY3Rpb24sIHRoZW4KKyAgICAgICAgLy8gdGhlcmUgY291bGQgYmUgYSBjb25uZWN0aW9uIGxlYWsuCisgICAgfQorCisgICAgLyoqCisgICAgICogcmVsZWFzZSB0aGUgZ2l2ZW4gZGF0YWJhc2UgY29ubmVjdGlvbiBiYWNrIHRvIHRoZSBwb29sLgorICAgICAqIEBwYXJhbSBkYiB0aGUgY29ubmVjdGlvbiB0byBiZSByZWxlYXNlZAorICAgICAqLworICAgIC8qIHBhY2thZ2UgKi8gdm9pZCByZWxlYXNlKFNRTGl0ZURhdGFiYXNlIGRiKSB7CisgICAgICAgIFBvb2xPYmogcG9vbE9iajsKKyAgICAgICAgc3luY2hyb25pemVkKG1QYXJlbnREYk9iaikgeworICAgICAgICAgICAgaWYgKExvZy5pc0xvZ2dhYmxlKFRBRywgTG9nLkRFQlVHKSkgeworICAgICAgICAgICAgICAgIGFzc2VydCBkYi5tQ29ubmVjdGlvbk51bSA+IDA7CisgICAgICAgICAgICAgICAgZG9Bc3NlcnRzKCk7CisgICAgICAgICAgICAgICAgYXNzZXJ0IG1Qb29sLmdldChkYi5tQ29ubmVjdGlvbk51bSAtIDEpLm1EYiA9PSBkYjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcG9vbE9iaiA9IG1Qb29sLmdldChkYi5tQ29ubmVjdGlvbk51bSAtIDEpOworCisgICAgICAgICAgICBpZiAoTG9nLmlzTG9nZ2FibGUoVEFHLCBMb2cuREVCVUcpKSB7CisgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiQkVHSU4gcmVsZWFzZS1jb25uOiAiICsgdG9TdHJpbmcoKSArIHBvb2xPYmoudG9TdHJpbmcoKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChwb29sT2JqLmlzRnJlZSgpKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiUmVsZWFzaW5nIG9iamVjdCBhbHJlYWR5IGZyZWVkOiAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRiLm1Db25uZWN0aW9uTnVtKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcG9vbE9iai5yZWxlYXNlKCk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoTG9nLmlzTG9nZ2FibGUoVEFHLCBMb2cuREVCVUcpKSB7CisgICAgICAgICAgICBMb2cuZChUQUcsICJFTkQgcmVsZWFzZS1jb25uOiAiICsgdG9TdHJpbmcoKSArIHBvb2xPYmoudG9TdHJpbmcoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGEgbGlzdCBvZiBhbGwgZGF0YWJhc2UgY29ubmVjdGlvbnMgaW4gdGhlIHBvb2wgKGJvdGggZnJlZSBhbmQgYnVzeSBjb25uZWN0aW9ucykuCisgICAgICogVGhpcyBtZXRob2QgaXMgdXNlZCB3aGVuICJhZGIgYnVncmVwb3J0IiBpcyBkb25lLgorICAgICAqLworICAgIC8qIHBhY2thZ2UgKi8gQXJyYXlMaXN0PFNRTGl0ZURhdGFiYXNlPiBnZXRDb25uZWN0aW9uTGlzdCgpIHsKKyAgICAgICAgQXJyYXlMaXN0PFNRTGl0ZURhdGFiYXNlPiBsaXN0ID0gbmV3IEFycmF5TGlzdDxTUUxpdGVEYXRhYmFzZT4oKTsKKyAgICAgICAgc3luY2hyb25pemVkKG1QYXJlbnREYk9iaikgeworICAgICAgICAgICAgZm9yIChpbnQgaSA9IG1Qb29sLnNpemUoKSAtIDE7IGkgPj0gMDsgaS0tKSB7CisgICAgICAgICAgICAgICAgbGlzdC5hZGQobVBvb2wuZ2V0KGkpLm1EYik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGxpc3Q7CisgICAgfQorCisgICAgLyoqCisgICAgICogcGFja2FnZSBsZXZlbCBhY2Nlc3MgZm9yIHRlc3RpbmcgcHVycG9zZXMgb25seS4gb3RoZXJ3aXNlLCBwcml2YXRlIHNob3VsZCBiZSBzdWZmaWNpZW50LgorICAgICAqLworICAgIC8qIHBhY2thZ2UgKi8gaW50IGdldEZyZWVQb29sU2l6ZSgpIHsKKyAgICAgICAgaW50IGNvdW50ID0gMDsKKyAgICAgICAgZm9yIChpbnQgaSA9IG1Qb29sLnNpemUoKSAtIDE7IGkgPj0gMDsgaS0tKSB7CisgICAgICAgICAgICBpZiAobVBvb2wuZ2V0KGkpLmlzRnJlZSgpKSB7CisgICAgICAgICAgICAgICAgY291bnQrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gY291bnQrKzsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBvbmx5IGZvciB0ZXN0aW5nIHB1cnBvc2VzCisgICAgICovCisgICAgLyogcGFja2FnZSAqLyBBcnJheUxpc3Q8UG9vbE9iaj4gZ2V0UG9vbCgpIHsKKyAgICAgICAgcmV0dXJuIG1Qb29sOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgIFN0cmluZ0J1aWxkZXIgYnVmZiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisgICAgICAgIGJ1ZmYuYXBwZW5kKCJkYjogIik7CisgICAgICAgIGJ1ZmYuYXBwZW5kKG1QYXJlbnREYk9iai5nZXRQYXRoKCkpOworICAgICAgICBidWZmLmFwcGVuZCgiLCB0b3RhbHNpemUgPSAiKTsKKyAgICAgICAgYnVmZi5hcHBlbmQobVBvb2wuc2l6ZSgpKTsKKyAgICAgICAgYnVmZi5hcHBlbmQoIiwgI2ZyZWUgPSAiKTsKKyAgICAgICAgYnVmZi5hcHBlbmQoZ2V0RnJlZVBvb2xTaXplKCkpOworICAgICAgICBidWZmLmFwcGVuZCgiLCBtYXhwb29sc2l6ZSA9ICIpOworICAgICAgICBidWZmLmFwcGVuZChtTWF4UG9vbFNpemUpOworICAgICAgICBmb3IgKFBvb2xPYmogcCA6IG1Qb29sKSB7CisgICAgICAgICAgICBidWZmLmFwcGVuZCgiXG4iKTsKKyAgICAgICAgICAgIGJ1ZmYuYXBwZW5kKHAudG9TdHJpbmcoKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGJ1ZmYudG9TdHJpbmcoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgZG9Bc3NlcnRzKCkgeworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1Qb29sLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICBtUG9vbC5nZXQoaSkudmVyaWZ5KCk7CisgICAgICAgICAgICBhc3NlcnQgbVBvb2wuZ2V0KGkpLm1EYi5tQ29ubmVjdGlvbk51bSA9PSAoaSArIDEpOworICAgICAgICB9CisgICAgfQorCisgICAgLyogcGFja2FnZSAqLyB2b2lkIHNldE1heFBvb2xTaXplKGludCBzaXplKSB7CisgICAgICAgIHN5bmNocm9uaXplZChtUGFyZW50RGJPYmopIHsKKyAgICAgICAgICAgIG1NYXhQb29sU2l6ZSA9IHNpemU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBwYWNrYWdlICovIGludCBnZXRNYXhQb29sU2l6ZSgpIHsKKyAgICAgICAgc3luY2hyb25pemVkKG1QYXJlbnREYk9iaikgeworICAgICAgICAgICAgcmV0dXJuIG1NYXhQb29sU2l6ZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKiBvbmx5IHVzZWQgZm9yIHRlc3RpbmcgcHVycG9zZXMuICovCisgICAgLyogcGFja2FnZSAqLyBib29sZWFuIGlzRGF0YWJhc2VPYmpGcmVlKFNRTGl0ZURhdGFiYXNlIGRiKSB7CisgICAgICAgIHJldHVybiBtUG9vbC5nZXQoZGIubUNvbm5lY3Rpb25OdW0gLSAxKS5pc0ZyZWUoKTsKKyAgICB9CisKKyAgICAvKiogb25seSB1c2VkIGZvciB0ZXN0aW5nIHB1cnBvc2VzLiAqLworICAgIC8qIHBhY2thZ2UgKi8gaW50IGdldFNpemUoKSB7CisgICAgICAgIHJldHVybiBtUG9vbC5zaXplKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogcmVwcmVzZW50cyBvYmplY3RzIGluIHRoZSBjb25uZWN0aW9uIHBvb2wuCisgICAgICogcGFja2FnZS1sZXZlbCBhY2Nlc3MgZm9yIHRlc3RpbmcgcHVycG9zZXMgb25seS4KKyAgICAgKi8KKyAgICAvKiBwYWNrYWdlICovIHN0YXRpYyBjbGFzcyBQb29sT2JqIHsKKworICAgICAgICBwcml2YXRlIGZpbmFsIFNRTGl0ZURhdGFiYXNlIG1EYjsKKyAgICAgICAgcHJpdmF0ZSBib29sZWFuIG1GcmVlQnVzeUZsYWcgPSBGUkVFOworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIEZSRUUgPSB0cnVlOworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIEJVU1kgPSBmYWxzZTsKKworICAgICAgICAvKiogdGhlIG51bWJlciBvZiB0aHJlYWRzIGhvbGRpbmcgdGhpcyBjb25uZWN0aW9uICovCisgICAgICAgIC8vIEBHdWFyZGVkQnkoInRoaXMiKQorICAgICAgICBwcml2YXRlIGludCBtTnVtSG9sZGVycyA9IDA7CisKKyAgICAgICAgLyoqIGNvbnRhaW5zIHRoZSB0aHJlYWRJZHMgb2YgdGhlIHRocmVhZHMgaG9sZGluZyB0aGlzIGNvbm5lY3Rpb24uCisgICAgICAgICAqIHVzZWQgZm9yIGRlYnVnZ2luZyBwdXJwb3NlcyBvbmx5LgorICAgICAgICAgKi8KKyAgICAgICAgLy8gQEd1YXJkZWRCeSgidGhpcyIpCisgICAgICAgIHByaXZhdGUgSGFzaFNldDxMb25nPiBtSG9sZGVySWRzID0gbmV3IEhhc2hTZXQ8TG9uZz4oKTsKKworICAgICAgICBwdWJsaWMgUG9vbE9iaihTUUxpdGVEYXRhYmFzZSBkYikgeworICAgICAgICAgICAgbURiID0gZGI7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN5bmNocm9uaXplZCB2b2lkIGFjcXVpcmUoKSB7CisgICAgICAgICAgICBpZiAoTG9nLmlzTG9nZ2FibGUoVEFHLCBMb2cuREVCVUcpKSB7CisgICAgICAgICAgICAgICAgYXNzZXJ0IGlzRnJlZSgpOworICAgICAgICAgICAgICAgIGxvbmcgaWQgPSBUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldElkKCk7CisgICAgICAgICAgICAgICAgYXNzZXJ0ICFtSG9sZGVySWRzLmNvbnRhaW5zKGlkKTsKKyAgICAgICAgICAgICAgICBtSG9sZGVySWRzLmFkZChpZCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG1OdW1Ib2xkZXJzKys7CisgICAgICAgICAgICBtRnJlZUJ1c3lGbGFnID0gQlVTWTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3luY2hyb25pemVkIHZvaWQgcmVsZWFzZSgpIHsKKyAgICAgICAgICAgIGlmIChMb2cuaXNMb2dnYWJsZShUQUcsIExvZy5ERUJVRykpIHsKKyAgICAgICAgICAgICAgICBsb25nIGlkID0gVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXRJZCgpOworICAgICAgICAgICAgICAgIGFzc2VydCBtSG9sZGVySWRzLnNpemUoKSA9PSBtTnVtSG9sZGVyczsKKyAgICAgICAgICAgICAgICBhc3NlcnQgbUhvbGRlcklkcy5jb250YWlucyhpZCk7CisgICAgICAgICAgICAgICAgbUhvbGRlcklkcy5yZW1vdmUoaWQpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBtTnVtSG9sZGVycy0tOworICAgICAgICAgICAgaWYgKG1OdW1Ib2xkZXJzID09IDApIHsKKyAgICAgICAgICAgICAgICBtRnJlZUJ1c3lGbGFnID0gRlJFRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3luY2hyb25pemVkIGJvb2xlYW4gaXNGcmVlKCkgeworICAgICAgICAgICAgaWYgKExvZy5pc0xvZ2dhYmxlKFRBRywgTG9nLkRFQlVHKSkgeworICAgICAgICAgICAgICAgIHZlcmlmeSgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIChtRnJlZUJ1c3lGbGFnID09IEZSRUUpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzeW5jaHJvbml6ZWQgdm9pZCB2ZXJpZnkoKSB7CisgICAgICAgICAgICBpZiAobUZyZWVCdXN5RmxhZyA9PSBGUkVFKSB7CisgICAgICAgICAgICAgICAgYXNzZXJ0IG1OdW1Ib2xkZXJzID09IDA7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGFzc2VydCBtTnVtSG9sZGVycyA+IDA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogb25seSBmb3IgdGVzdGluZyBwdXJwb3NlcworICAgICAgICAgKi8KKyAgICAgICAgLyogcGFja2FnZSAqLyBzeW5jaHJvbml6ZWQgaW50IGdldE51bUhvbGRlcnMoKSB7CisgICAgICAgICAgICByZXR1cm4gbU51bUhvbGRlcnM7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgICAgIFN0cmluZ0J1aWxkZXIgYnVmZiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisgICAgICAgICAgICBidWZmLmFwcGVuZCgiLCBjb25uICMgIik7CisgICAgICAgICAgICBidWZmLmFwcGVuZChtRGIubUNvbm5lY3Rpb25OdW0pOworICAgICAgICAgICAgYnVmZi5hcHBlbmQoIiwgbUNvdW50SG9sZGVycyA9ICIpOworICAgICAgICAgICAgc3luY2hyb25pemVkKHRoaXMpIHsKKyAgICAgICAgICAgICAgICBidWZmLmFwcGVuZChtTnVtSG9sZGVycyk7CisgICAgICAgICAgICAgICAgYnVmZi5hcHBlbmQoIiwgZnJlZUJ1c3lGbGFnID0gIik7CisgICAgICAgICAgICAgICAgYnVmZi5hcHBlbmQobUZyZWVCdXN5RmxhZyk7CisgICAgICAgICAgICAgICAgZm9yIChMb25nIGwgOiBtSG9sZGVySWRzKSB7CisgICAgICAgICAgICAgICAgICAgIGJ1ZmYuYXBwZW5kKCIsIGlkID0gIiArIGwpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBidWZmLnRvU3RyaW5nKCk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9zcWxpdGUvRGF0YWJhc2VPYmplY3ROb3RDbG9zZWRFeGNlcHRpb24uamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9EYXRhYmFzZU9iamVjdE5vdENsb3NlZEV4Y2VwdGlvbi5qYXZhCmluZGV4IDhhYzRjMGYuLmYyOGM3MGYgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9EYXRhYmFzZU9iamVjdE5vdENsb3NlZEV4Y2VwdGlvbi5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9EYXRhYmFzZU9iamVjdE5vdENsb3NlZEV4Y2VwdGlvbi5qYXZhCkBAIC0yMSwxMyArMjEsMTEgQEAKICAqIHRoYXQgaXMgbm90IGV4cGxpY2l0bHkgY2xvc2VkCiAgKiBAaGlkZQogICovCi1wdWJsaWMgY2xhc3MgRGF0YWJhc2VPYmplY3ROb3RDbG9zZWRFeGNlcHRpb24gZXh0ZW5kcyBSdW50aW1lRXhjZXB0aW9uCi17CitwdWJsaWMgY2xhc3MgRGF0YWJhc2VPYmplY3ROb3RDbG9zZWRFeGNlcHRpb24gZXh0ZW5kcyBSdW50aW1lRXhjZXB0aW9uIHsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgcyA9ICJBcHBsaWNhdGlvbiBkaWQgbm90IGNsb3NlIHRoZSBjdXJzb3Igb3IgZGF0YWJhc2Ugb2JqZWN0ICIgKwogICAgICAgICAgICAgInRoYXQgd2FzIG9wZW5lZCBoZXJlIjsKIAotICAgIHB1YmxpYyBEYXRhYmFzZU9iamVjdE5vdENsb3NlZEV4Y2VwdGlvbigpCi0gICAgeworICAgIHB1YmxpYyBEYXRhYmFzZU9iamVjdE5vdENsb3NlZEV4Y2VwdGlvbigpIHsKICAgICAgICAgc3VwZXIocyk7CiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2Uvc3FsaXRlL1NRTGl0ZUFjY2Vzc1Blcm1FeGNlcHRpb24uamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9TUUxpdGVBY2Nlc3NQZXJtRXhjZXB0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjM4ZGE0YgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9TUUxpdGVBY2Nlc3NQZXJtRXhjZXB0aW9uLmphdmEKQEAgLTAsMCArMSwyOSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGU7CisKKy8qKgorICogVGhpcyBleGNlcHRpb24gY2xhc3MgaXMgdXNlZCB3aGVuIHNxbGl0ZSBjYW4ndCBhY2Nlc3MgdGhlIGRhdGFiYXNlIGZpbGUKKyAqIGR1ZSB0byBsYWNrIG9mIHBlcm1pc3Npb25zIG9uIHRoZSBmaWxlLgorICovCitwdWJsaWMgY2xhc3MgU1FMaXRlQWNjZXNzUGVybUV4Y2VwdGlvbiBleHRlbmRzIFNRTGl0ZUV4Y2VwdGlvbiB7CisgICAgcHVibGljIFNRTGl0ZUFjY2Vzc1Blcm1FeGNlcHRpb24oKSB7fQorCisgICAgcHVibGljIFNRTGl0ZUFjY2Vzc1Blcm1FeGNlcHRpb24oU3RyaW5nIGVycm9yKSB7CisgICAgICAgIHN1cGVyKGVycm9yKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9zcWxpdGUvU1FMaXRlQmluZE9yQ29sdW1uSW5kZXhPdXRPZlJhbmdlRXhjZXB0aW9uLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9zcWxpdGUvU1FMaXRlQmluZE9yQ29sdW1uSW5kZXhPdXRPZlJhbmdlRXhjZXB0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDFmMmY5YwotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9TUUxpdGVCaW5kT3JDb2x1bW5JbmRleE91dE9mUmFuZ2VFeGNlcHRpb24uamF2YQpAQCAtMCwwICsxLDI4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZTsKKworLyoqCisgKiBUaHJvd24gaWYgdGhlIHRoZSBiaW5kIG9yIGNvbHVtbiBwYXJhbWV0ZXIgaW5kZXggaXMgb3V0IG9mIHJhbmdlCisgKi8KK3B1YmxpYyBjbGFzcyBTUUxpdGVCaW5kT3JDb2x1bW5JbmRleE91dE9mUmFuZ2VFeGNlcHRpb24gZXh0ZW5kcyBTUUxpdGVFeGNlcHRpb24geworICAgIHB1YmxpYyBTUUxpdGVCaW5kT3JDb2x1bW5JbmRleE91dE9mUmFuZ2VFeGNlcHRpb24oKSB7fQorCisgICAgcHVibGljIFNRTGl0ZUJpbmRPckNvbHVtbkluZGV4T3V0T2ZSYW5nZUV4Y2VwdGlvbihTdHJpbmcgZXJyb3IpIHsKKyAgICAgICAgc3VwZXIoZXJyb3IpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9TUUxpdGVCbG9iVG9vQmlnRXhjZXB0aW9uLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9zcWxpdGUvU1FMaXRlQmxvYlRvb0JpZ0V4Y2VwdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE4MjY3NmIKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9zcWxpdGUvU1FMaXRlQmxvYlRvb0JpZ0V4Y2VwdGlvbi5qYXZhCkBAIC0wLDAgKzEsMjUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlOworCitwdWJsaWMgY2xhc3MgU1FMaXRlQmxvYlRvb0JpZ0V4Y2VwdGlvbiBleHRlbmRzIFNRTGl0ZUV4Y2VwdGlvbiB7CisgICAgcHVibGljIFNRTGl0ZUJsb2JUb29CaWdFeGNlcHRpb24oKSB7fQorCisgICAgcHVibGljIFNRTGl0ZUJsb2JUb29CaWdFeGNlcHRpb24oU3RyaW5nIGVycm9yKSB7CisgICAgICAgIHN1cGVyKGVycm9yKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9zcWxpdGUvU1FMaXRlQ2FudE9wZW5EYXRhYmFzZUV4Y2VwdGlvbi5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2Uvc3FsaXRlL1NRTGl0ZUNhbnRPcGVuRGF0YWJhc2VFeGNlcHRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZjAxNzk2Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2Uvc3FsaXRlL1NRTGl0ZUNhbnRPcGVuRGF0YWJhc2VFeGNlcHRpb24uamF2YQpAQCAtMCwwICsxLDI1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZTsKKworcHVibGljIGNsYXNzIFNRTGl0ZUNhbnRPcGVuRGF0YWJhc2VFeGNlcHRpb24gZXh0ZW5kcyBTUUxpdGVFeGNlcHRpb24geworICAgIHB1YmxpYyBTUUxpdGVDYW50T3BlbkRhdGFiYXNlRXhjZXB0aW9uKCkge30KKworICAgIHB1YmxpYyBTUUxpdGVDYW50T3BlbkRhdGFiYXNlRXhjZXB0aW9uKFN0cmluZyBlcnJvcikgeworICAgICAgICBzdXBlcihlcnJvcik7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2Uvc3FsaXRlL1NRTGl0ZUNsb3NhYmxlLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9zcWxpdGUvU1FMaXRlQ2xvc2FibGUuamF2YQppbmRleCAxODMwZjZjLi41OGRhYjJiIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9zcWxpdGUvU1FMaXRlQ2xvc2FibGUuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9zcWxpdGUvU1FMaXRlQ2xvc2FibGUuamF2YQpAQCAtMjMsMTMgKzIzLDEzIEBACiAgKi8KIHB1YmxpYyBhYnN0cmFjdCBjbGFzcyBTUUxpdGVDbG9zYWJsZSB7CiAgICAgcHJpdmF0ZSBpbnQgbVJlZmVyZW5jZUNvdW50ID0gMTsKLSAgICBwcml2YXRlIE9iamVjdCBtTG9jayA9IG5ldyBPYmplY3QoKTsKIAogICAgIHByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIG9uQWxsUmVmZXJlbmNlc1JlbGVhc2VkKCk7CiAgICAgcHJvdGVjdGVkIHZvaWQgb25BbGxSZWZlcmVuY2VzUmVsZWFzZWRGcm9tQ29udGFpbmVyKCkge30KIAogICAgIHB1YmxpYyB2b2lkIGFjcXVpcmVSZWZlcmVuY2UoKSB7Ci0gICAgICAgIHN5bmNocm9uaXplZChtTG9jaykgeworICAgICAgICBzeW5jaHJvbml6ZWQodGhpcykgeworICAgICAgICAgICAgY2hlY2tSZWZDb3VudCgpOwogICAgICAgICAgICAgaWYgKG1SZWZlcmVuY2VDb3VudCA8PSAwKSB7CiAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigKICAgICAgICAgICAgICAgICAgICAgICAgICJhdHRlbXB0IHRvIHJlLW9wZW4gYW4gYWxyZWFkeS1jbG9zZWQgb2JqZWN0OiAiICsgZ2V0T2JqSW5mbygpKTsKQEAgLTM5LDcgKzM5LDggQEAKICAgICB9CiAKICAgICBwdWJsaWMgdm9pZCByZWxlYXNlUmVmZXJlbmNlKCkgewotICAgICAgICBzeW5jaHJvbml6ZWQobUxvY2spIHsKKyAgICAgICAgc3luY2hyb25pemVkKHRoaXMpIHsKKyAgICAgICAgICAgIGNoZWNrUmVmQ291bnQoKTsKICAgICAgICAgICAgIG1SZWZlcmVuY2VDb3VudC0tOwogICAgICAgICAgICAgaWYgKG1SZWZlcmVuY2VDb3VudCA9PSAwKSB7CiAgICAgICAgICAgICAgICAgb25BbGxSZWZlcmVuY2VzUmVsZWFzZWQoKTsKQEAgLTQ4LDcgKzQ5LDggQEAKICAgICB9CiAKICAgICBwdWJsaWMgdm9pZCByZWxlYXNlUmVmZXJlbmNlRnJvbUNvbnRhaW5lcigpIHsKLSAgICAgICAgc3luY2hyb25pemVkKG1Mb2NrKSB7CisgICAgICAgIHN5bmNocm9uaXplZCh0aGlzKSB7CisgICAgICAgICAgICBjaGVja1JlZkNvdW50KCk7CiAgICAgICAgICAgICBtUmVmZXJlbmNlQ291bnQtLTsKICAgICAgICAgICAgIGlmIChtUmVmZXJlbmNlQ291bnQgPT0gMCkgewogICAgICAgICAgICAgICAgIG9uQWxsUmVmZXJlbmNlc1JlbGVhc2VkRnJvbUNvbnRhaW5lcigpOwpAQCAtNjMsOCArNjUsNyBAQAogICAgICAgICBpZiAodGhpcyBpbnN0YW5jZW9mIFNRTGl0ZURhdGFiYXNlKSB7CiAgICAgICAgICAgICBidWZmLmFwcGVuZCgiZGF0YWJhc2UgPSAiKTsKICAgICAgICAgICAgIGJ1ZmYuYXBwZW5kKCgoU1FMaXRlRGF0YWJhc2UpdGhpcykuZ2V0UGF0aCgpKTsKLSAgICAgICAgfSBlbHNlIGlmICh0aGlzIGluc3RhbmNlb2YgU1FMaXRlUHJvZ3JhbSB8fCB0aGlzIGluc3RhbmNlb2YgU1FMaXRlU3RhdGVtZW50IHx8Ci0gICAgICAgICAgICAgICAgdGhpcyBpbnN0YW5jZW9mIFNRTGl0ZVF1ZXJ5KSB7CisgICAgICAgIH0gZWxzZSBpZiAodGhpcyBpbnN0YW5jZW9mIFNRTGl0ZVByb2dyYW0pIHsKICAgICAgICAgICAgIGJ1ZmYuYXBwZW5kKCJtU3FsID0gIik7CiAgICAgICAgICAgICBidWZmLmFwcGVuZCgoKFNRTGl0ZVByb2dyYW0pdGhpcykubVNxbCk7CiAgICAgICAgIH0gZWxzZSBpZiAodGhpcyBpbnN0YW5jZW9mIEN1cnNvcldpbmRvdykgewpAQCAtNzQsNCArNzUsMTMgQEAKICAgICAgICAgYnVmZi5hcHBlbmQoIikgIik7CiAgICAgICAgIHJldHVybiBidWZmLnRvU3RyaW5nKCk7CiAgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGNoZWNrUmVmQ291bnQoKSB7CisgICAgICAgIGlmIChTUUxpdGVEZWJ1Zy5ERUJVR19BQ1RJVkVfQ1VSU09SX0ZJTkFMSVpBVElPTikgeworICAgICAgICAgICAgaWYgKG1SZWZlcmVuY2VDb3VudCA+IDEwMDApIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJyZWZjb3VudDogIiArIG1SZWZlcmVuY2VDb3VudCArICIsICIgKworICAgICAgICAgICAgICAgICAgICAgICAgZ2V0T2JqSW5mbygpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KIH0KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9TUUxpdGVDb21waWxlZFNxbC5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2Uvc3FsaXRlL1NRTGl0ZUNvbXBpbGVkU3FsLmphdmEKaW5kZXggMjVhYTliMy4uNTg4Mzg0YiAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2Uvc3FsaXRlL1NRTGl0ZUNvbXBpbGVkU3FsLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2Uvc3FsaXRlL1NRTGl0ZUNvbXBpbGVkU3FsLmphdmEKQEAgLTMxLDEyICszMSwxMiBAQAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiU1FMaXRlQ29tcGlsZWRTcWwiOwogCiAgICAgLyoqIFRoZSBkYXRhYmFzZSB0aGlzIHByb2dyYW0gaXMgY29tcGlsZWQgYWdhaW5zdC4gKi8KLSAgICAvKiBwYWNrYWdlICovIFNRTGl0ZURhdGFiYXNlIG1EYXRhYmFzZTsKKyAgICAvKiBwYWNrYWdlICovIGZpbmFsIFNRTGl0ZURhdGFiYXNlIG1EYXRhYmFzZTsKIAogICAgIC8qKgogICAgICAqIE5hdGl2ZSBsaW5rYWdlLCBkbyBub3QgbW9kaWZ5LiBUaGlzIGNvbWVzIGZyb20gdGhlIGRhdGFiYXNlLgogICAgICAqLwotICAgIC8qIHBhY2thZ2UgKi8gaW50IG5IYW5kbGUgPSAwOworICAgIC8qIHBhY2thZ2UgKi8gZmluYWwgaW50IG5IYW5kbGU7CiAKICAgICAvKioKICAgICAgKiBOYXRpdmUgbGlua2FnZSwgZG8gbm90IG1vZGlmeS4gV2hlbiBub24tMCB0aGlzIGhvbGRzIGEgcmVmZXJlbmNlIHRvIGEgdmFsaWQKQEAgLTU0LDYxICs1NCwyMSBAQAogICAgIHByaXZhdGUgYm9vbGVhbiBtSW5Vc2UgPSBmYWxzZTsKIAogICAgIC8qIHBhY2thZ2UgKi8gU1FMaXRlQ29tcGlsZWRTcWwoU1FMaXRlRGF0YWJhc2UgZGIsIFN0cmluZyBzcWwpIHsKLSAgICAgICAgaWYgKCFkYi5pc09wZW4oKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiZGF0YWJhc2UgIiArIGRiLmdldFBhdGgoKSArICIgYWxyZWFkeSBjbG9zZWQiKTsKLSAgICAgICAgfQorICAgICAgICBkYi52ZXJpZnlEYklzT3BlbigpOworICAgICAgICBkYi52ZXJpZnlMb2NrT3duZXIoKTsKICAgICAgICAgbURhdGFiYXNlID0gZGI7CiAgICAgICAgIG1TcWxTdG10ID0gc3FsOwogICAgICAgICBtU3RhY2tUcmFjZSA9IG5ldyBEYXRhYmFzZU9iamVjdE5vdENsb3NlZEV4Y2VwdGlvbigpLmZpbGxJblN0YWNrVHJhY2UoKTsKLSAgICAgICAgdGhpcy5uSGFuZGxlID0gZGIubU5hdGl2ZUhhbmRsZTsKLSAgICAgICAgY29tcGlsZShzcWwsIHRydWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbXBpbGVzIHRoZSBnaXZlbiBTUUwgaW50byBhIFNRTGl0ZSBieXRlIGNvZGUgcHJvZ3JhbSB1c2luZyBzcWxpdGUzX3ByZXBhcmVfdjIoKS4gSWYKLSAgICAgKiB0aGlzIG1ldGhvZCBoYXMgYmVlbiBjYWxsZWQgcHJldmlvdXNseSB3aXRob3V0IGEgY2FsbCB0byBjbG9zZSBhbmQgZm9yQ29tcGlsYXRpb24gaXMgc2V0Ci0gICAgICogdG8gZmFsc2UgdGhlIHByZXZpb3VzIGNvbXBpbGF0aW9uIHdpbGwgYmUgdXNlZC4gU2V0dGluZyBmb3JjZUNvbXBpbGF0aW9uIHRvIHRydWUgd2lsbAotICAgICAqIGFsd2F5cyByZS1jb21waWxlIHRoZSBwcm9ncmFtIGFuZCBzaG91bGQgYmUgZG9uZSBpZiB5b3UgcGFzcyBkaWZmZXJpbmcgU1FMIHN0cmluZ3MgdG8gdGhpcwotICAgICAqIG1ldGhvZC4KLSAgICAgKgotICAgICAqIDxQPk5vdGU6IHRoaXMgbWV0aG9kIGFjcXVpcmVzIHRoZSBkYXRhYmFzZSBsb2NrLjwvUD4KLSAgICAgKgotICAgICAqIEBwYXJhbSBzcWwgdGhlIFNRTCBzdHJpbmcgdG8gY29tcGlsZQotICAgICAqIEBwYXJhbSBmb3JjZUNvbXBpbGF0aW9uIGZvcmNlcyB0aGUgU1FMIHRvIGJlIHJlY29tcGlsZWQgaW4gdGhlIGV2ZW50IHRoYXQgdGhlcmUgaXMgYW4KLSAgICAgKiAgZXhpc3RpbmcgY29tcGlsZWQgU1FMIHByb2dyYW0gYWxyZWFkeSBhcm91bmQKLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgY29tcGlsZShTdHJpbmcgc3FsLCBib29sZWFuIGZvcmNlQ29tcGlsYXRpb24pIHsKLSAgICAgICAgaWYgKCFtRGF0YWJhc2UuaXNPcGVuKCkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oImRhdGFiYXNlICIgKyBtRGF0YWJhc2UuZ2V0UGF0aCgpICsgIiBhbHJlYWR5IGNsb3NlZCIpOwotICAgICAgICB9Ci0gICAgICAgIC8vIE9ubHkgY29tcGlsZSBpZiB3ZSBkb24ndCBoYXZlIGEgdmFsaWQgc3RhdGVtZW50IGFscmVhZHkgb3IgdGhlIGNhbGxlciBoYXMKLSAgICAgICAgLy8gZXhwbGljaXRseSByZXF1ZXN0ZWQgYSByZWNvbXBpbGUuCi0gICAgICAgIGlmIChmb3JjZUNvbXBpbGF0aW9uKSB7Ci0gICAgICAgICAgICBtRGF0YWJhc2UubG9jaygpOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAvLyBOb3RlIHRoYXQgdGhlIG5hdGl2ZV9jb21waWxlKCkgdGFrZXMgY2FyZSBvZiBkZXN0cm95aW5nIGFueSBwcmV2aW91c2x5Ci0gICAgICAgICAgICAgICAgLy8gZXhpc3RpbmcgcHJvZ3JhbXMgYmVmb3JlIGl0IGNvbXBpbGVzLgotICAgICAgICAgICAgICAgIG5hdGl2ZV9jb21waWxlKHNxbCk7Ci0gICAgICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgICAgIG1EYXRhYmFzZS51bmxvY2soKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQorICAgICAgICBuSGFuZGxlID0gZGIubU5hdGl2ZUhhbmRsZTsKKyAgICAgICAgbmF0aXZlX2NvbXBpbGUoc3FsKTsKICAgICB9CiAKICAgICAvKiBwYWNrYWdlICovIHZvaWQgcmVsZWFzZVNxbFN0YXRlbWVudCgpIHsKICAgICAgICAgLy8gTm90ZSB0aGF0IG5hdGl2ZV9maW5hbGl6ZSgpIGNoZWNrcyB0byBtYWtlIHN1cmUgdGhhdCBuU3RhdGVtZW50IGlzCiAgICAgICAgIC8vIG5vbi1udWxsIGJlZm9yZSBkZXN0cm95aW5nIGl0LgogICAgICAgICBpZiAoblN0YXRlbWVudCAhPSAwKSB7Ci0gICAgICAgICAgICBpZiAoU1FMaXRlRGVidWcuREVCVUdfQUNUSVZFX0NVUlNPUl9GSU5BTElaQVRJT04pIHsKLSAgICAgICAgICAgICAgICBMb2cudihUQUcsICJjbG9zZWQgYW5kIGRlYWxsb2NhdGVkIERiT2JqIChpZCMiICsgblN0YXRlbWVudCArIikiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgbURhdGFiYXNlLmxvY2soKTsKLSAgICAgICAgICAgICAgICBuYXRpdmVfZmluYWxpemUoKTsKLSAgICAgICAgICAgICAgICBuU3RhdGVtZW50ID0gMDsKLSAgICAgICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICAgICAgbURhdGFiYXNlLnVubG9jaygpOwotICAgICAgICAgICAgfQorICAgICAgICAgICAgbURhdGFiYXNlLmZpbmFsaXplU3RhdGVtZW50TGF0ZXIoblN0YXRlbWVudCk7CisgICAgICAgICAgICBuU3RhdGVtZW50ID0gMDsKICAgICAgICAgfQogICAgIH0KIApAQCAtMTE3LDIzICs3NywyOCBAQAogICAgICAqLwogICAgIC8qIHBhY2thZ2UgKi8gc3luY2hyb25pemVkIGJvb2xlYW4gYWNxdWlyZSgpIHsKICAgICAgICAgaWYgKG1JblVzZSkgewotICAgICAgICAgICAgLy8gc29tZW9uZSBhbHJlYWR5IGhhcyBhY3F1aXJlZCBpdC4KKyAgICAgICAgICAgIC8vIGl0IGlzIGFscmVhZHkgaW4gdXNlLgogICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9CiAgICAgICAgIG1JblVzZSA9IHRydWU7Ci0gICAgICAgIGlmIChTUUxpdGVEZWJ1Zy5ERUJVR19BQ1RJVkVfQ1VSU09SX0ZJTkFMSVpBVElPTikgewotICAgICAgICAgICAgTG9nLnYoVEFHLCAiQWNxdWlyZWQgRGJPYmogKGlkIyIgKyBuU3RhdGVtZW50ICsgIikgZnJvbSBEQiBjYWNoZSIpOwotICAgICAgICB9CiAgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KIAogICAgIC8qIHBhY2thZ2UgKi8gc3luY2hyb25pemVkIHZvaWQgcmVsZWFzZSgpIHsKLSAgICAgICAgaWYgKFNRTGl0ZURlYnVnLkRFQlVHX0FDVElWRV9DVVJTT1JfRklOQUxJWkFUSU9OKSB7Ci0gICAgICAgICAgICBMb2cudihUQUcsICJSZWxlYXNlZCBEYk9iaiAoaWQjIiArIG5TdGF0ZW1lbnQgKyAiKSBiYWNrIHRvIERCIGNhY2hlIik7Ci0gICAgICAgIH0KICAgICAgICAgbUluVXNlID0gZmFsc2U7CiAgICAgfQogCisgICAgLyogcGFja2FnZSAqLyBzeW5jaHJvbml6ZWQgYm9vbGVhbiBpc0luVXNlKCkgeworICAgICAgICByZXR1cm4gbUluVXNlOworICAgIH0KKworICAgIC8qIHBhY2thZ2UgKi8gc3luY2hyb25pemVkIHZvaWQgcmVsZWFzZUlmTm90SW5Vc2UoKSB7CisgICAgICAgIC8vIGlmIGl0IGlzIG5vdCBpbiB1c2UsIHJlbGVhc2UgaXRzIG1lbW9yeSBmcm9tIHRoZSBkYXRhYmFzZQorICAgICAgICBpZiAoIWlzSW5Vc2UoKSkgeworICAgICAgICAgICAgcmVsZWFzZVNxbFN0YXRlbWVudCgpOworICAgICAgICB9CisgICAgfQorCiAgICAgLyoqCiAgICAgICogTWFrZSBzdXJlIHRoYXQgdGhlIG5hdGl2ZSByZXNvdXJjZSBpcyBjbGVhbmVkIHVwLgogICAgICAqLwpAQCAtMTQyLDE5ICsxMDcsMzkgQEAKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIGlmIChuU3RhdGVtZW50ID09IDApIHJldHVybjsKICAgICAgICAgICAgIC8vIGZpbmFsaXplciBzaG91bGQgTkVWRVIgZ2V0IGNhbGxlZAotICAgICAgICAgICAgaWYgKFNRTGl0ZURlYnVnLkRFQlVHX0FDVElWRV9DVVJTT1JfRklOQUxJWkFUSU9OKSB7Ci0gICAgICAgICAgICAgICAgTG9nLnYoVEFHLCAiKiogd2FybmluZyAqKiBGaW5hbGl6ZWQgRGJPYmogKGlkIyIgKyBuU3RhdGVtZW50ICsgIikiKTsKKyAgICAgICAgICAgIC8vIGJ1dCBpZiB0aGUgZGF0YWJhc2UgaXRzZWxmIGlzIG5vdCBjbG9zZWQgYW5kIGlzIEdDJ2VkLCB0aGVuCisgICAgICAgICAgICAvLyBhbGwgc3ViLW9iamVjdHMgYXR0YWNoZWQgdG8gdGhlIGRhdGFiYXNlIGNvdWxkIGVuZCB1cCBnZXR0aW5nIEdDJ2VkIHRvby4KKyAgICAgICAgICAgIC8vIGluIHRoYXQgY2FzZSwgZG9uJ3QgcHJpbnQgYW55IHdhcm5pbmcuCisgICAgICAgICAgICBpZiAoIW1JblVzZSkgeworICAgICAgICAgICAgICAgIGludCBsZW4gPSBtU3FsU3RtdC5sZW5ndGgoKTsKKyAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJSZWxlYXNpbmcgc3RhdGVtZW50IGluIGEgZmluYWxpemVyLiBQbGVhc2UgZW5zdXJlICIgKworICAgICAgICAgICAgICAgICAgICAgICAgInRoYXQgeW91IGV4cGxpY2l0bHkgY2FsbCBjbG9zZSgpIG9uIHlvdXIgY3Vyc29yOiAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1TcWxTdG10LnN1YnN0cmluZygwLCAobGVuID4gMTAwKSA/IDEwMCA6IGxlbiksIG1TdGFja1RyYWNlKTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGludCBsZW4gPSBtU3FsU3RtdC5sZW5ndGgoKTsKLSAgICAgICAgICAgIExvZy53KFRBRywgIlJlbGVhc2luZyBzdGF0ZW1lbnQgaW4gYSBmaW5hbGl6ZXIuIFBsZWFzZSBlbnN1cmUgIiArCi0gICAgICAgICAgICAgICAgICAgICJ0aGF0IHlvdSBleHBsaWNpdGx5IGNhbGwgY2xvc2UoKSBvbiB5b3VyIGN1cnNvcjogIiArCi0gICAgICAgICAgICAgICAgICAgIG1TcWxTdG10LnN1YnN0cmluZygwLCAobGVuID4gMTAwKSA/IDEwMCA6IGxlbiksIG1TdGFja1RyYWNlKTsKICAgICAgICAgICAgIHJlbGVhc2VTcWxTdGF0ZW1lbnQoKTsKICAgICAgICAgfSBmaW5hbGx5IHsKICAgICAgICAgICAgIHN1cGVyLmZpbmFsaXplKCk7CiAgICAgICAgIH0KICAgICB9CiAKKyAgICBAT3ZlcnJpZGUgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgc3luY2hyb25pemVkKHRoaXMpIHsKKyAgICAgICAgICAgIFN0cmluZ0J1aWxkZXIgYnVmZiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisgICAgICAgICAgICBidWZmLmFwcGVuZCgiIG5TdGF0ZW1lbnQ9Iik7CisgICAgICAgICAgICBidWZmLmFwcGVuZChuU3RhdGVtZW50KTsKKyAgICAgICAgICAgIGJ1ZmYuYXBwZW5kKCIsIG1JblVzZT0iKTsKKyAgICAgICAgICAgIGJ1ZmYuYXBwZW5kKG1JblVzZSk7CisgICAgICAgICAgICBidWZmLmFwcGVuZCgiLCBkYj0iKTsKKyAgICAgICAgICAgIGJ1ZmYuYXBwZW5kKG1EYXRhYmFzZS5nZXRQYXRoKCkpOworICAgICAgICAgICAgYnVmZi5hcHBlbmQoIiwgZGJfY29ubmVjdGlvbk51bT0iKTsKKyAgICAgICAgICAgIGJ1ZmYuYXBwZW5kKG1EYXRhYmFzZS5tQ29ubmVjdGlvbk51bSk7CisgICAgICAgICAgICBidWZmLmFwcGVuZCgiLCBzcWw9Iik7CisgICAgICAgICAgICBpbnQgbGVuID0gbVNxbFN0bXQubGVuZ3RoKCk7CisgICAgICAgICAgICBidWZmLmFwcGVuZChtU3FsU3RtdC5zdWJzdHJpbmcoMCwgKGxlbiA+IDEwMCkgPyAxMDAgOiBsZW4pKTsKKyAgICAgICAgICAgIHJldHVybiBidWZmLnRvU3RyaW5nKCk7CisgICAgICAgIH0KKyAgICB9CisKICAgICAvKioKICAgICAgKiBDb21waWxlcyBTUUwgaW50byBhIFNRTGl0ZSBwcm9ncmFtLgogICAgICAqCkBAIC0xNjIsNSArMTQ3LDQgQEAKICAgICAgKiBAcGFyYW0gc3FsIFRoZSBTUUwgdG8gY29tcGlsZS4KICAgICAgKi8KICAgICBwcml2YXRlIGZpbmFsIG5hdGl2ZSB2b2lkIG5hdGl2ZV9jb21waWxlKFN0cmluZyBzcWwpOwotICAgIHByaXZhdGUgZmluYWwgbmF0aXZlIHZvaWQgbmF0aXZlX2ZpbmFsaXplKCk7CiB9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9zcWxpdGUvU1FMaXRlQ29udGVudEhlbHBlci5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2Uvc3FsaXRlL1NRTGl0ZUNvbnRlbnRIZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjgwMGQ4Ni4uMDAwMDAwMAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9zcWxpdGUvU1FMaXRlQ29udGVudEhlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGU7Ci0KLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLkFzc2V0RmlsZURlc2NyaXB0b3I7Ci1pbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5DdXJzb3I7Ci1pbXBvcnQgYW5kcm9pZC5vcy5NZW1vcnlGaWxlOwotCi1pbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLQotLyoqCi0gKiBTb21lIGhlbHBlciBmdW5jdGlvbnMgZm9yIHVzaW5nIFNRTGl0ZSBkYXRhYmFzZSB0byBpbXBsZW1lbnQgY29udGVudCBwcm92aWRlcnMuCi0gKgotICogQGhpZGUKLSAqLwotcHVibGljIGNsYXNzIFNRTGl0ZUNvbnRlbnRIZWxwZXIgewotCi0gICAgLyoqCi0gICAgICogUnVucyBhbiBTUUxpdGUgcXVlcnkgYW5kIHJldHVybnMgYW4gQXNzZXRGaWxlRGVzY3JpcHRvciBmb3IgdGhlCi0gICAgICogYmxvYiBpbiBjb2x1bW4gMCBvZiB0aGUgZmlyc3Qgcm93LiBJZiB0aGUgZmlyc3QgY29sdW1uIGRvZXMKLSAgICAgKiBub3QgY29udGFpbiBhIGJsb2IsIGFuIHVuc3BlY2lmaWVkIGV4Y2VwdGlvbiBpcyB0aHJvd24uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZGIgSGFuZGxlIHRvIGEgcmVhZGFibGUgZGF0YWJhc2UuCi0gICAgICogQHBhcmFtIHNxbCBTUUwgcXVlcnksIHBvc3NpYmx5IHdpdGggcXVlcnkgYXJndW1lbnRzLgotICAgICAqIEBwYXJhbSBzZWxlY3Rpb25BcmdzIFF1ZXJ5IGFyZ3VtZW50IHZhbHVlcywgb3Ige0Bjb2RlIG51bGx9IGZvciBubyBhcmd1bWVudC4KLSAgICAgKiBAcmV0dXJuIElmIG5vIGV4Y2VwdGlvbiBpcyB0aHJvd24sIGEgbm9uLW51bGwgQXNzZXRGaWxlRGVzY3JpcHRvciBpcyByZXR1cm5lZC4KLSAgICAgKiBAdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBJZiB0aGUgcXVlcnkgcmV0dXJucyBubyByZXN1bHRzIG9yIHRoZQotICAgICAqICAgICAgICAgdmFsdWUgb2YgY29sdW1uIDAgaXMgTlVMTCwgb3IgaWYgdGhlcmUgaXMgYW4gZXJyb3IgY3JlYXRpbmcgdGhlCi0gICAgICogICAgICAgICBhc3NldCBmaWxlIGRlc2NyaXB0b3IuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBBc3NldEZpbGVEZXNjcmlwdG9yIGdldEJsb2JDb2x1bW5Bc0Fzc2V0RmlsZShTUUxpdGVEYXRhYmFzZSBkYiwgU3RyaW5nIHNxbCwKLSAgICAgICAgICAgIFN0cmluZ1tdIHNlbGVjdGlvbkFyZ3MpIHRocm93cyBGaWxlTm90Rm91bmRFeGNlcHRpb24gewotICAgICAgICB0cnkgewotICAgICAgICAgICAgTWVtb3J5RmlsZSBmaWxlID0gc2ltcGxlUXVlcnlGb3JCbG9iTWVtb3J5RmlsZShkYiwgc3FsLCBzZWxlY3Rpb25BcmdzKTsKLSAgICAgICAgICAgIGlmIChmaWxlID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRmlsZU5vdEZvdW5kRXhjZXB0aW9uKCJObyByZXN1bHRzLiIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIEFzc2V0RmlsZURlc2NyaXB0b3IuZnJvbU1lbW9yeUZpbGUoZmlsZSk7Ci0gICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgRmlsZU5vdEZvdW5kRXhjZXB0aW9uKGV4LnRvU3RyaW5nKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUnVucyBhbiBTUUxpdGUgcXVlcnkgYW5kIHJldHVybnMgYSBNZW1vcnlGaWxlIGZvciB0aGUKLSAgICAgKiBibG9iIGluIGNvbHVtbiAwIG9mIHRoZSBmaXJzdCByb3cuIElmIHRoZSBmaXJzdCBjb2x1bW4gZG9lcwotICAgICAqIG5vdCBjb250YWluIGEgYmxvYiwgYW4gdW5zcGVjaWZpZWQgZXhjZXB0aW9uIGlzIHRocm93bi4KLSAgICAgKgotICAgICAqIEByZXR1cm4gQSBtZW1vcnkgZmlsZSwgb3Ige0Bjb2RlIG51bGx9IGlmIHRoZSBxdWVyeSByZXR1cm5zIG5vIHJlc3VsdHMKLSAgICAgKiAgICAgICAgIG9yIHRoZSB2YWx1ZSBjb2x1bW4gMCBpcyBOVUxMLgotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gSWYgdGhlcmUgaXMgYW4gZXJyb3IgY3JlYXRpbmcgdGhlIG1lbW9yeSBmaWxlLgotICAgICAqLwotICAgIC8vIFRPRE86IG1ha2UgdGhpcyBuYXRpdmUgYW5kIHVzZSB0aGUgU1FMaXRlIGJsb2IgQVBJIHRvIHJlZHVjZSBjb3B5aW5nCi0gICAgcHJpdmF0ZSBzdGF0aWMgTWVtb3J5RmlsZSBzaW1wbGVRdWVyeUZvckJsb2JNZW1vcnlGaWxlKFNRTGl0ZURhdGFiYXNlIGRiLCBTdHJpbmcgc3FsLAotICAgICAgICAgICAgU3RyaW5nW10gc2VsZWN0aW9uQXJncykgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgQ3Vyc29yIGN1cnNvciA9IGRiLnJhd1F1ZXJ5KHNxbCwgc2VsZWN0aW9uQXJncyk7Ci0gICAgICAgIGlmIChjdXJzb3IgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGlmICghY3Vyc29yLm1vdmVUb0ZpcnN0KCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJ5dGVbXSBieXRlcyA9IGN1cnNvci5nZXRCbG9iKDApOwotICAgICAgICAgICAgaWYgKGJ5dGVzID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIE1lbW9yeUZpbGUgZmlsZSA9IG5ldyBNZW1vcnlGaWxlKG51bGwsIGJ5dGVzLmxlbmd0aCk7Ci0gICAgICAgICAgICBmaWxlLndyaXRlQnl0ZXMoYnl0ZXMsIDAsIDAsIGJ5dGVzLmxlbmd0aCk7Ci0gICAgICAgICAgICBmaWxlLmRlYWN0aXZhdGUoKTsKLSAgICAgICAgICAgIHJldHVybiBmaWxlOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgY3Vyc29yLmNsb3NlKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9TUUxpdGVDdXJzb3IuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9TUUxpdGVDdXJzb3IuamF2YQppbmRleCBjN2U1OGZhLi5mYTc3NjNkIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9zcWxpdGUvU1FMaXRlQ3Vyc29yLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2Uvc3FsaXRlL1NRTGl0ZUN1cnNvci5qYXZhCkBAIC0xNiwyMCArMTYsMTkgQEAKIAogcGFja2FnZSBhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZTsKIAoraW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5VGhyZWFkOwogaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2UuQWJzdHJhY3RXaW5kb3dlZEN1cnNvcjsKIGltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLkN1cnNvcldpbmRvdzsKIGltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLkRhdGFTZXRPYnNlcnZlcjsKLWltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLlNRTEV4Y2VwdGlvbjsKLQoraW1wb3J0IGFuZHJvaWQuZGF0YWJhc2UuUmVxdWVyeU9uVWlUaHJlYWRFeGNlcHRpb247CiBpbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyOworaW1wb3J0IGFuZHJvaWQub3MuTG9vcGVyOwogaW1wb3J0IGFuZHJvaWQub3MuTWVzc2FnZTsKIGltcG9ydCBhbmRyb2lkLm9zLlByb2Nlc3M7Ci1pbXBvcnQgYW5kcm9pZC50ZXh0LlRleHRVdGlsczsKIGltcG9ydCBhbmRyb2lkLnV0aWwuQ29uZmlnOwogaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CiAKIGltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CiBpbXBvcnQgamF2YS51dGlsLk1hcDsKIGltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5sb2Nrcy5SZWVudHJhbnRMb2NrOwogCkBAIC00MSwzMiArNDAsMjkgQEAKICAqIHRocmVhZHMgc2hvdWxkIHBlcmZvcm0gaXRzIG93biBzeW5jaHJvbml6YXRpb24gd2hlbiB1c2luZyB0aGUgU1FMaXRlQ3Vyc29yLgogICovCiBwdWJsaWMgY2xhc3MgU1FMaXRlQ3Vyc29yIGV4dGVuZHMgQWJzdHJhY3RXaW5kb3dlZEN1cnNvciB7Ci0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiQ3Vyc29yIjsKKyAgICBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJTUUxpdGVDdXJzb3IiOwogICAgIHN0YXRpYyBmaW5hbCBpbnQgTk9fQ09VTlQgPSAtMTsKIAogICAgIC8qKiBUaGUgbmFtZSBvZiB0aGUgdGFibGUgdG8gZWRpdCAqLwotICAgIHByaXZhdGUgU3RyaW5nIG1FZGl0VGFibGU7CisgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbUVkaXRUYWJsZTsKIAogICAgIC8qKiBUaGUgbmFtZXMgb2YgdGhlIGNvbHVtbnMgaW4gdGhlIHJvd3MgKi8KLSAgICBwcml2YXRlIFN0cmluZ1tdIG1Db2x1bW5zOworICAgIHByaXZhdGUgZmluYWwgU3RyaW5nW10gbUNvbHVtbnM7CiAKICAgICAvKiogVGhlIHF1ZXJ5IG9iamVjdCBmb3IgdGhlIGN1cnNvciAqLwogICAgIHByaXZhdGUgU1FMaXRlUXVlcnkgbVF1ZXJ5OwogCi0gICAgLyoqIFRoZSBkYXRhYmFzZSB0aGUgY3Vyc29yIHdhcyBjcmVhdGVkIGZyb20gKi8KLSAgICBwcml2YXRlIFNRTGl0ZURhdGFiYXNlIG1EYXRhYmFzZTsKLQogICAgIC8qKiBUaGUgY29tcGlsZWQgcXVlcnkgdGhpcyBjdXJzb3IgY2FtZSBmcm9tICovCi0gICAgcHJpdmF0ZSBTUUxpdGVDdXJzb3JEcml2ZXIgbURyaXZlcjsKKyAgICBwcml2YXRlIGZpbmFsIFNRTGl0ZUN1cnNvckRyaXZlciBtRHJpdmVyOwogCiAgICAgLyoqIFRoZSBudW1iZXIgb2Ygcm93cyBpbiB0aGUgY3Vyc29yICovCi0gICAgcHJpdmF0ZSBpbnQgbUNvdW50ID0gTk9fQ09VTlQ7CisgICAgcHJpdmF0ZSB2b2xhdGlsZSBpbnQgbUNvdW50ID0gTk9fQ09VTlQ7CiAKICAgICAvKiogQSBtYXBwaW5nIG9mIGNvbHVtbiBuYW1lcyB0byBjb2x1bW4gaW5kaWNlcywgdG8gc3BlZWQgdXAgbG9va3VwcyAqLwogICAgIHByaXZhdGUgTWFwPFN0cmluZywgSW50ZWdlcj4gbUNvbHVtbk5hbWVNYXA7CiAKICAgICAvKiogVXNlZCB0byBmaW5kIG91dCB3aGVyZSBhIGN1cnNvciB3YXMgYWxsb2NhdGVkIGluIGNhc2UgaXQgbmV2ZXIgZ290IHJlbGVhc2VkLiAqLwotICAgIHByaXZhdGUgVGhyb3dhYmxlIG1TdGFja1RyYWNlOworICAgIHByaXZhdGUgZmluYWwgVGhyb3dhYmxlIG1TdGFja1RyYWNlOwogICAgIAogICAgIC8qKiAKICAgICAgKiAgbU1heFJlYWQgaXMgdGhlIG1heCBpdGVtcyB0aGF0IGVhY2ggY3Vyc29yIHdpbmRvdyByZWFkcyAKQEAgLTc3LDYgKzczLDExIEBACiAgICAgcHJpdmF0ZSBpbnQgbUN1cnNvclN0YXRlID0gMDsKICAgICBwcml2YXRlIFJlZW50cmFudExvY2sgbUxvY2sgPSBudWxsOwogICAgIHByaXZhdGUgYm9vbGVhbiBtUGVuZGluZ0RhdGEgPSBmYWxzZTsKKworICAgIC8qKgorICAgICAqIFVzZWQgYnkge0BsaW5rICNyZXF1ZXJ5KCl9IHRvIHJlbWVtYmVyIGZvciB3aGljaCBkYXRhYmFzZSB3ZSd2ZSBhbHJlYWR5IHNob3duIHRoZSB3YXJuaW5nLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEhhc2hNYXA8U3RyaW5nLCBCb29sZWFuPiBzQWxyZWFkeVdhcm5lZCA9IG5ldyBIYXNoTWFwPFN0cmluZywgQm9vbGVhbj4oKTsKICAgICAKICAgICAvKioKICAgICAgKiAgc3VwcG9ydCBmb3IgYSBjdXJzb3IgdmFyaWFudCB0aGF0IGRvZXNuJ3QgYWx3YXlzIHJlYWQgYWxsIHJlc3VsdHMKQEAgLTEzNiwxNCArMTM3LDIyIEBACiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBpbnQgY291bnQgPSBtUXVlcnkuZmlsbFdpbmRvdyhjdywgbU1heFJlYWQsIG1Db3VudCk7Ci0gICAgICAgICAgICAgICAgICAgIC8vIHJldHVybiAtMSBtZWFucyBub3QgZmluaXNoZWQKKyAgICAgICAgICAgICAgICAgICAgaW50IGNvdW50ID0gZ2V0UXVlcnkoKS5maWxsV2luZG93KGN3LCBtTWF4UmVhZCwgbUNvdW50KTsKKyAgICAgICAgICAgICAgICAgICAgLy8gcmV0dXJuIC0xIG1lYW5zIHRoZXJlIGlzIHN0aWxsIG1vcmUgZGF0YSB0byBiZSByZXRyaWV2ZWQgZnJvbSB0aGUgcmVzdWx0c2V0CiAgICAgICAgICAgICAgICAgICAgIGlmIChjb3VudCAhPSAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY291bnQgPT0gTk9fQ09VTlQpewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Db3VudCArPSBtTWF4UmVhZDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoTG9nLmlzTG9nZ2FibGUoVEFHLCBMb2cuREVCVUcpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgInJlY2VpdmVkIC0xIGZyb20gbmF0aXZlX2ZpbGxfd2luZG93LiByZWFkICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Db3VudCArICIgcm93cyBzbyBmYXIiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VuZE1lc3NhZ2UoKTsKICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ291bnQgPSBjb3VudDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ291bnQgKz0gY291bnQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKExvZy5pc0xvZ2dhYmxlKFRBRywgTG9nLkRFQlVHKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJyZWNlaXZlZCBhbGwgZGF0YSBmcm9tIG5hdGl2ZV9maWxsX3dpbmRvdy4gcmVhZCAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ291bnQgKyAiIHJvd3MuIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbmRNZXNzYWdlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICB9CkBAIC0yMDEsMjQgKzIxMCw0NiBAQAogICAgICAqIGhhcyBwYWNrYWdlIHNjb3BlLgogICAgICAqCiAgICAgICogQHBhcmFtIGRiIGEgcmVmZXJlbmNlIHRvIGEgRGF0YWJhc2Ugb2JqZWN0IHRoYXQgaXMgYWxyZWFkeSBjb25zdHJ1Y3RlZAotICAgICAqICAgICBhbmQgb3BlbmVkCisgICAgICogICAgIGFuZCBvcGVuZWQuIFRoaXMgcGFyYW0gaXMgbm90IHVzZWQgYW55IGxvbmdlcgogICAgICAqIEBwYXJhbSBlZGl0VGFibGUgdGhlIG5hbWUgb2YgdGhlIHRhYmxlIHVzZWQgZm9yIHRoaXMgcXVlcnkKICAgICAgKiBAcGFyYW0gcXVlcnkgdGhlIHJlc3Qgb2YgdGhlIHF1ZXJ5IHRlcm1zCiAgICAgICogICAgIGN1cnNvciBpcyBmaW5hbGl6ZWQKKyAgICAgKiBAZGVwcmVjYXRlZCB1c2Uge0BsaW5rICNTUUxpdGVDdXJzb3IoU1FMaXRlQ3Vyc29yRHJpdmVyLCBTdHJpbmcsIFNRTGl0ZVF1ZXJ5KX0gaW5zdGVhZAogICAgICAqLworICAgIEBEZXByZWNhdGVkCiAgICAgcHVibGljIFNRTGl0ZUN1cnNvcihTUUxpdGVEYXRhYmFzZSBkYiwgU1FMaXRlQ3Vyc29yRHJpdmVyIGRyaXZlciwKICAgICAgICAgICAgIFN0cmluZyBlZGl0VGFibGUsIFNRTGl0ZVF1ZXJ5IHF1ZXJ5KSB7CisgICAgICAgIHRoaXMoZHJpdmVyLCBlZGl0VGFibGUsIHF1ZXJ5KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBFeGVjdXRlIGEgcXVlcnkgYW5kIHByb3ZpZGUgYWNjZXNzIHRvIGl0cyByZXN1bHQgc2V0IHRocm91Z2ggYSBDdXJzb3IKKyAgICAgKiBpbnRlcmZhY2UuIEZvciBhIHF1ZXJ5IHN1Y2ggYXM6IHtAY29kZSBTRUxFQ1QgbmFtZSwgYmlydGgsIHBob25lIEZST00KKyAgICAgKiBteVRhYmxlIFdIRVJFIC4uLiBMSU1JVCAxLDIwIE9SREVSIEJZLi4ufSB0aGUgY29sdW1uIG5hbWVzIChuYW1lLCBiaXJ0aCwKKyAgICAgKiBwaG9uZSkgd291bGQgYmUgaW4gdGhlIHByb2plY3Rpb24gYXJndW1lbnQgYW5kIGV2ZXJ5dGhpbmcgZnJvbQorICAgICAqIHtAY29kZSBGUk9NfSBvbndhcmQgd291bGQgYmUgaW4gdGhlIHBhcmFtcyBhcmd1bWVudC4gVGhpcyBjb25zdHJ1Y3RvcgorICAgICAqIGhhcyBwYWNrYWdlIHNjb3BlLgorICAgICAqCisgICAgICogQHBhcmFtIGVkaXRUYWJsZSB0aGUgbmFtZSBvZiB0aGUgdGFibGUgdXNlZCBmb3IgdGhpcyBxdWVyeQorICAgICAqIEBwYXJhbSBxdWVyeSB0aGUge0BsaW5rIFNRTGl0ZVF1ZXJ5fSBvYmplY3QgYXNzb2NpYXRlZCB3aXRoIHRoaXMgY3Vyc29yIG9iamVjdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgU1FMaXRlQ3Vyc29yKFNRTGl0ZUN1cnNvckRyaXZlciBkcml2ZXIsIFN0cmluZyBlZGl0VGFibGUsIFNRTGl0ZVF1ZXJ5IHF1ZXJ5KSB7CiAgICAgICAgIC8vIFRoZSBBYnN0cmFjdEN1cnNvciBjb25zdHJ1Y3RvciBuZWVkcyB0byBkbyBzb21lIHNldHVwLgogICAgICAgICBzdXBlcigpOworICAgICAgICBpZiAocXVlcnkgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigicXVlcnkgb2JqZWN0IGNhbm5vdCBiZSBudWxsIik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHF1ZXJ5Lm1EYXRhYmFzZSA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJxdWVyeS5tRGF0YWJhc2UgY2Fubm90IGJlIG51bGwiKTsKKyAgICAgICAgfQogICAgICAgICBtU3RhY2tUcmFjZSA9IG5ldyBEYXRhYmFzZU9iamVjdE5vdENsb3NlZEV4Y2VwdGlvbigpLmZpbGxJblN0YWNrVHJhY2UoKTsKLSAgICAgICAgbURhdGFiYXNlID0gZGI7CiAgICAgICAgIG1Ecml2ZXIgPSBkcml2ZXI7CiAgICAgICAgIG1FZGl0VGFibGUgPSBlZGl0VGFibGU7CiAgICAgICAgIG1Db2x1bW5OYW1lTWFwID0gbnVsbDsKICAgICAgICAgbVF1ZXJ5ID0gcXVlcnk7CiAKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGRiLmxvY2soKTsKKyAgICAgICAgICAgIHF1ZXJ5Lm1EYXRhYmFzZS5sb2NrKCk7CiAKICAgICAgICAgICAgIC8vIFNldHVwIHRoZSBsaXN0IG9mIGNvbHVtbnMKICAgICAgICAgICAgIGludCBjb2x1bW5Db3VudCA9IG1RdWVyeS5jb2x1bW5Db3VudExvY2tlZCgpOwpAQCAtMjM5LDcgKzI3MCw3IEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgZGIudW5sb2NrKCk7CisgICAgICAgICAgICBxdWVyeS5tRGF0YWJhc2UudW5sb2NrKCk7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTI0Nyw3ICsyNzgsOSBAQAogICAgICAqIEByZXR1cm4gdGhlIFNRTGl0ZURhdGFiYXNlIHRoYXQgdGhpcyBjdXJzb3IgaXMgYXNzb2NpYXRlZCB3aXRoLgogICAgICAqLwogICAgIHB1YmxpYyBTUUxpdGVEYXRhYmFzZSBnZXREYXRhYmFzZSgpIHsKLSAgICAgICAgcmV0dXJuIG1EYXRhYmFzZTsKKyAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7CisgICAgICAgICAgICByZXR1cm4gbVF1ZXJ5Lm1EYXRhYmFzZTsKKyAgICAgICAgfQogICAgIH0KIAogICAgIEBPdmVycmlkZQpAQCAtMjgzLDEzICszMTYsMjcgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgbVdpbmRvdy5zZXRTdGFydFBvc2l0aW9uKHN0YXJ0UG9zKTsKLSAgICAgICAgbUNvdW50ID0gbVF1ZXJ5LmZpbGxXaW5kb3cobVdpbmRvdywgbUluaXRpYWxSZWFkLCAwKTsKLSAgICAgICAgLy8gcmV0dXJuIC0xIG1lYW5zIG5vdCBmaW5pc2hlZAotICAgICAgICBpZiAobUNvdW50ID09IE5PX0NPVU5UKXsKKyAgICAgICAgaW50IGNvdW50ID0gZ2V0UXVlcnkoKS5maWxsV2luZG93KG1XaW5kb3csIG1Jbml0aWFsUmVhZCwgMCk7CisgICAgICAgIC8vIHJldHVybiAtMSBtZWFucyB0aGVyZSBpcyBzdGlsbCBtb3JlIGRhdGEgdG8gYmUgcmV0cmlldmVkIGZyb20gdGhlIHJlc3VsdHNldAorICAgICAgICBpZiAoY291bnQgPT0gTk9fQ09VTlQpewogICAgICAgICAgICAgbUNvdW50ID0gc3RhcnRQb3MgKyBtSW5pdGlhbFJlYWQ7CisgICAgICAgICAgICBpZiAoTG9nLmlzTG9nZ2FibGUoVEFHLCBMb2cuREVCVUcpKSB7CisgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAicmVjZWl2ZWQgLTEgZnJvbSBuYXRpdmVfZmlsbF93aW5kb3cuIHJlYWQgIiArIG1Db3VudCArICIgcm93cyBzbyBmYXIiKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIFRocmVhZCB0ID0gbmV3IFRocmVhZChuZXcgUXVlcnlUaHJlYWQobUN1cnNvclN0YXRlKSwgInF1ZXJ5IHRocmVhZCIpOwogICAgICAgICAgICAgdC5zdGFydCgpOwotICAgICAgICB9IAorICAgICAgICB9IGVsc2UgaWYgKHN0YXJ0UG9zID09IDApIHsgLy8gbmF0aXZlX2ZpbGxfd2luZG93IHJldHVybnMgY291bnQoKikgb25seSBmb3Igc3RhcnRQb3MgPSAwCisgICAgICAgICAgICBpZiAoTG9nLmlzTG9nZ2FibGUoVEFHLCBMb2cuREVCVUcpKSB7CisgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAicmVjZWl2ZWQgY291bnQoKikgZnJvbSBuYXRpdmVfZmlsbF93aW5kb3c6ICIgKyBjb3VudCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtQ291bnQgPSBjb3VudDsKKyAgICAgICAgfSBlbHNlIGlmIChtQ291bnQgPD0gMCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiY291bnQgc2hvdWxkIG5ldmVyIGJlIG5vbi16ZXJvIG5lZ2F0aXZlIG51bWJlciIpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzeW5jaHJvbml6ZWQgU1FMaXRlUXVlcnkgZ2V0UXVlcnkoKSB7CisgICAgICAgIHJldHVybiBtUXVlcnk7CiAgICAgfQogCiAgICAgQE92ZXJyaWRlCkBAIC0zMjEsMTY2ICszNjgsMTEgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIC8qKgotICAgICAqIEBoaWRlCi0gICAgICogQGRlcHJlY2F0ZWQKLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBkZWxldGVSb3coKSB7Ci0gICAgICAgIGNoZWNrUG9zaXRpb24oKTsKLQotICAgICAgICAvLyBPbmx5IGFsbG93IGRlbGV0ZXMgaWYgdGhlcmUgaXMgYW4gSUQgY29sdW1uLCBhbmQgdGhlIElEIGhhcyBiZWVuIHJlYWQgZnJvbSBpdAotICAgICAgICBpZiAobVJvd0lkQ29sdW1uSW5kZXggPT0gLTEgfHwgbUN1cnJlbnRSb3dJRCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBMb2cuZShUQUcsCi0gICAgICAgICAgICAgICAgICAgICJDb3VsZCBub3QgZGVsZXRlIHJvdyBiZWNhdXNlIGVpdGhlciB0aGUgcm93IElEIGNvbHVtbiBpcyBub3QgYXZhaWxhYmxlIG9yIGl0IiArCi0gICAgICAgICAgICAgICAgICAgICJoYXMgbm90IGJlZW4gcmVhZC4iKTsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIGJvb2xlYW4gc3VjY2VzczsKLQotICAgICAgICAvKgotICAgICAgICAgKiBFbnN1cmUgd2UgZG9uJ3QgY2hhbmdlIHRoZSBzdGF0ZSBvZiB0aGUgZGF0YWJhc2Ugd2hlbiBhbm90aGVyCi0gICAgICAgICAqIHRocmVhZCBpcyBob2xkaW5nIHRoZSBkYXRhYmFzZSBsb2NrLiByZXF1ZXJ5KCkgYW5kIG1vdmVUbygpIGFyZSBhbHNvCi0gICAgICAgICAqIHN5bmNocm9uaXplZCBoZXJlIHRvIG1ha2Ugc3VyZSB0aGV5IGdldCB0aGUgc3RhdGUgb2YgdGhlIGRhdGFiYXNlCi0gICAgICAgICAqIGltbWVkaWF0ZWx5IGZvbGxvd2luZyB0aGUgREVMRVRFLgotICAgICAgICAgKi8KLSAgICAgICAgbURhdGFiYXNlLmxvY2soKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgbURhdGFiYXNlLmRlbGV0ZShtRWRpdFRhYmxlLCBtQ29sdW1uc1ttUm93SWRDb2x1bW5JbmRleF0gKyAiPT8iLAotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFN0cmluZ1tdIHttQ3VycmVudFJvd0lELnRvU3RyaW5nKCl9KTsKLSAgICAgICAgICAgICAgICBzdWNjZXNzID0gdHJ1ZTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKFNRTEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgc3VjY2VzcyA9IGZhbHNlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpbnQgcG9zID0gbVBvczsKLSAgICAgICAgICAgIHJlcXVlcnkoKTsKLQotICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAqIEVuc3VyZSBwcm9wZXIgY3Vyc29yIHN0YXRlLiBOb3RlIHRoYXQgbUN1cnJlbnRSb3dJRCBjaGFuZ2VzCi0gICAgICAgICAgICAgKiBpbiB0aGlzIGNhbGwuCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIG1vdmVUb1Bvc2l0aW9uKHBvcyk7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBtRGF0YWJhc2UudW5sb2NrKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoc3VjY2VzcykgewotICAgICAgICAgICAgb25DaGFuZ2UodHJ1ZSk7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgIH0KLQogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRDb2x1bW5OYW1lcygpIHsKICAgICAgICAgcmV0dXJuIG1Db2x1bW5zOwogICAgIH0KIAotICAgIC8qKgotICAgICAqIEBoaWRlCi0gICAgICogQGRlcHJlY2F0ZWQKLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBzdXBwb3J0c1VwZGF0ZXMoKSB7Ci0gICAgICAgIHJldHVybiBzdXBlci5zdXBwb3J0c1VwZGF0ZXMoKSAmJiAhVGV4dFV0aWxzLmlzRW1wdHkobUVkaXRUYWJsZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQGhpZGUKLSAgICAgKiBAZGVwcmVjYXRlZAotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIGNvbW1pdFVwZGF0ZXMoTWFwPD8gZXh0ZW5kcyBMb25nLAotICAgICAgICAgICAgPyBleHRlbmRzIE1hcDxTdHJpbmcsIE9iamVjdD4+IGFkZGl0aW9uYWxWYWx1ZXMpIHsKLSAgICAgICAgaWYgKCFzdXBwb3J0c1VwZGF0ZXMoKSkgewotICAgICAgICAgICAgTG9nLmUoVEFHLCAiY29tbWl0VXBkYXRlcyBub3Qgc3VwcG9ydGVkIG9uIHRoaXMgY3Vyc29yLCBkaWQgeW91ICIKLSAgICAgICAgICAgICAgICAgICAgKyAiaW5jbHVkZSB0aGUgX2lkIGNvbHVtbj8iKTsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qCi0gICAgICAgICAqIFByZXZlbnQgb3RoZXIgdGhyZWFkcyBmcm9tIGNoYW5naW5nIHRoZSB1cGRhdGVkIHJvd3Mgd2hpbGUgdGhleSdyZQotICAgICAgICAgKiBiZWluZyBwcm9jZXNzZWQgaGVyZS4KLSAgICAgICAgICovCi0gICAgICAgIHN5bmNocm9uaXplZCAobVVwZGF0ZWRSb3dzKSB7Ci0gICAgICAgICAgICBpZiAoYWRkaXRpb25hbFZhbHVlcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbVVwZGF0ZWRSb3dzLnB1dEFsbChhZGRpdGlvbmFsVmFsdWVzKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKG1VcGRhdGVkUm93cy5zaXplKCkgPT0gMCkgewotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvKgotICAgICAgICAgICAgICogUHJldmVudCBvdGhlciB0aHJlYWRzIGZyb20gY2hhbmdpbmcgdGhlIGRhdGFiYXNlIHN0YXRlIHdoaWxlCi0gICAgICAgICAgICAgKiB3ZSBwcm9jZXNzIHRoZSB1cGRhdGVkIHJvd3MsIGFuZCBwcmV2ZW50cyB1cyBmcm9tIGNoYW5naW5nIHRoZQotICAgICAgICAgICAgICogZGF0YWJhc2UgYmVoaW5kIHRoZSBiYWNrIG9mIGFub3RoZXIgdGhyZWFkLgotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBtRGF0YWJhc2UuYmVnaW5UcmFuc2FjdGlvbigpOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBTdHJpbmdCdWlsZGVyIHNxbCA9IG5ldyBTdHJpbmdCdWlsZGVyKDEyOCk7Ci0KLSAgICAgICAgICAgICAgICAvLyBGb3IgZWFjaCByb3cgdGhhdCBoYXMgYmVlbiB1cGRhdGVkCi0gICAgICAgICAgICAgICAgZm9yIChNYXAuRW50cnk8TG9uZywgTWFwPFN0cmluZywgT2JqZWN0Pj4gcm93RW50cnkgOgotICAgICAgICAgICAgICAgICAgICAgICAgbVVwZGF0ZWRSb3dzLmVudHJ5U2V0KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiB2YWx1ZXMgPSByb3dFbnRyeS5nZXRWYWx1ZSgpOwotICAgICAgICAgICAgICAgICAgICBMb25nIHJvd0lkT2JqID0gcm93RW50cnkuZ2V0S2V5KCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKHJvd0lkT2JqID09IG51bGwgfHwgdmFsdWVzID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIm51bGwgcm93SWQgb3IgdmFsdWVzIGZvdW5kISByb3dJZCA9ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyByb3dJZE9iaiArICIsIHZhbHVlcyA9ICIgKyB2YWx1ZXMpOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlcy5zaXplKCkgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBsb25nIHJvd0lkID0gcm93SWRPYmoubG9uZ1ZhbHVlKCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgSXRlcmF0b3I8TWFwLkVudHJ5PFN0cmluZywgT2JqZWN0Pj4gdmFsdWVzSXRlciA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVzLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsKLQotICAgICAgICAgICAgICAgICAgICBzcWwuc2V0TGVuZ3RoKDApOwotICAgICAgICAgICAgICAgICAgICBzcWwuYXBwZW5kKCJVUERBVEUgIiArIG1FZGl0VGFibGUgKyAiIFNFVCAiKTsKLQotICAgICAgICAgICAgICAgICAgICAvLyBGb3IgZWFjaCBjb2x1bW4gdmFsdWUgdGhhdCBoYXMgYmVlbiB1cGRhdGVkCi0gICAgICAgICAgICAgICAgICAgIE9iamVjdFtdIGJpbmRpbmdzID0gbmV3IE9iamVjdFt2YWx1ZXMuc2l6ZSgpXTsKLSAgICAgICAgICAgICAgICAgICAgaW50IGkgPSAwOwotICAgICAgICAgICAgICAgICAgICB3aGlsZSAodmFsdWVzSXRlci5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIE1hcC5FbnRyeTxTdHJpbmcsIE9iamVjdD4gZW50cnkgPSB2YWx1ZXNJdGVyLm5leHQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNxbC5hcHBlbmQoZW50cnkuZ2V0S2V5KCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgc3FsLmFwcGVuZCgiPT8iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJpbmRpbmdzW2ldID0gZW50cnkuZ2V0VmFsdWUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZXNJdGVyLmhhc05leHQoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNxbC5hcHBlbmQoIiwgIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBpKys7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBzcWwuYXBwZW5kKCIgV0hFUkUgIiArIG1Db2x1bW5zW21Sb3dJZENvbHVtbkluZGV4XQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgJz0nICsgcm93SWQpOwotICAgICAgICAgICAgICAgICAgICBzcWwuYXBwZW5kKCc7Jyk7Ci0gICAgICAgICAgICAgICAgICAgIG1EYXRhYmFzZS5leGVjU1FMKHNxbC50b1N0cmluZygpLCBiaW5kaW5ncyk7Ci0gICAgICAgICAgICAgICAgICAgIG1EYXRhYmFzZS5yb3dVcGRhdGVkKG1FZGl0VGFibGUsIHJvd0lkKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbURhdGFiYXNlLnNldFRyYW5zYWN0aW9uU3VjY2Vzc2Z1bCgpOwotICAgICAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgICAgICBtRGF0YWJhc2UuZW5kVHJhbnNhY3Rpb24oKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgbVVwZGF0ZWRSb3dzLmNsZWFyKCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBMZXQgYW55IGNoYW5nZSBvYnNlcnZlcnMga25vdyBhYm91dCB0aGUgdXBkYXRlCi0gICAgICAgIG9uQ2hhbmdlKHRydWUpOwotCi0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQogICAgIHByaXZhdGUgdm9pZCBkZWFjdGl2YXRlQ29tbW9uKCkgewogICAgICAgICBpZiAoQ29uZmlnLkxPR1YpIExvZy52KFRBRywgIjw8PCBSZWxlYXNpbmcgY3Vyc29yICIgKyB0aGlzKTsKICAgICAgICAgbUN1cnNvclN0YXRlID0gMDsKQEAgLTUwMSw5ICszOTMsMzIgQEAKICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBjbG9zZSgpIHsKICAgICAgICAgc3VwZXIuY2xvc2UoKTsKLSAgICAgICAgZGVhY3RpdmF0ZUNvbW1vbigpOwotICAgICAgICBtUXVlcnkuY2xvc2UoKTsKLSAgICAgICAgbURyaXZlci5jdXJzb3JDbG9zZWQoKTsKKyAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7CisgICAgICAgICAgICBkZWFjdGl2YXRlQ29tbW9uKCk7CisgICAgICAgICAgICBtUXVlcnkuY2xvc2UoKTsKKyAgICAgICAgICAgIG1Ecml2ZXIuY3Vyc29yQ2xvc2VkKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTaG93IGEgd2FybmluZyBhZ2FpbnN0IHRoZSB1c2Ugb2YgcmVxdWVyeSgpIGlmIGNhbGxlZCBvbiB0aGUgbWFpbiB0aHJlYWQuCisgICAgICogVGhpcyB3YXJuaW5nIGlzIHNob3duIHBlciBkYXRhYmFzZSBwZXIgcHJvY2Vzcy4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgd2FybklmVWlUaHJlYWQoKSB7CisgICAgICAgIGlmIChMb29wZXIuZ2V0TWFpbkxvb3BlcigpID09IExvb3Blci5teUxvb3BlcigpKSB7CisgICAgICAgICAgICBTdHJpbmcgZGF0YWJhc2VQYXRoID0gZ2V0UXVlcnkoKS5tRGF0YWJhc2UuZ2V0UGF0aCgpOworICAgICAgICAgICAgLy8gV2Ugc2hvdyB0aGUgd2FybmluZyBvbmNlIHBlciBkYXRhYmFzZSBpbiBvcmRlciBub3QgdG8gc3BhbSBsb2djYXQuCisgICAgICAgICAgICBpZiAoIXNBbHJlYWR5V2FybmVkLmNvbnRhaW5zS2V5KGRhdGFiYXNlUGF0aCkpIHsKKyAgICAgICAgICAgICAgICBzQWxyZWFkeVdhcm5lZC5wdXQoZGF0YWJhc2VQYXRoLCB0cnVlKTsKKyAgICAgICAgICAgICAgICBTdHJpbmcgcGFja2FnZU5hbWUgPSBBY3Rpdml0eVRocmVhZC5jdXJyZW50UGFja2FnZU5hbWUoKTsKKyAgICAgICAgICAgICAgICBUaHJvd2FibGUgdCA9IG51bGw7CisgICAgICAgICAgICAgICAgLy8gQkVHSU4gU1RPUFNISVAgcmVtb3ZlIHRoZSBmb2xsb3dpbmcgbGluZQorICAgICAgICAgICAgICAgIHQgPSBuZXcgUmVxdWVyeU9uVWlUaHJlYWRFeGNlcHRpb24ocGFja2FnZU5hbWUpOworICAgICAgICAgICAgICAgIC8vIEVORCBTVE9QU0hJUAorICAgICAgICAgICAgICAgIExvZy53KFRBRywgInNob3VsZCBub3QgYXR0ZW1wdCByZXF1ZXJ5IG9uIG1haW4gKFVJKSB0aHJlYWQ6IGFwcCA9ICIgKworICAgICAgICAgICAgICAgICAgICAgICAgcGFja2FnZU5hbWUgPT0gbnVsbCA/ICIndW5rbm93biciIDogcGFja2FnZU5hbWUsIHQpOworICAgICAgICAgICAgfQorICAgICAgICB9CiAgICAgfQogCiAgICAgQE92ZXJyaWRlCkBAIC01MTEsMjAgKzQyNiwzMCBAQAogICAgICAgICBpZiAoaXNDbG9zZWQoKSkgewogICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9CisgICAgICAgIHdhcm5JZlVpVGhyZWFkKCk7CiAgICAgICAgIGxvbmcgdGltZVN0YXJ0ID0gMDsKICAgICAgICAgaWYgKENvbmZpZy5MT0dWKSB7CiAgICAgICAgICAgICB0aW1lU3RhcnQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKICAgICAgICAgfQotICAgICAgICAvKgotICAgICAgICAgKiBTeW5jaHJvbml6ZSBvbiB0aGUgZGF0YWJhc2UgbG9jayB0byBlbnN1cmUgdGhhdCBtQ291bnQgbWF0Y2hlcyB0aGUKLSAgICAgICAgICogcmVzdWx0cyBvZiBtUXVlcnkucmVxdWVyeSgpLgotICAgICAgICAgKi8KLSAgICAgICAgbURhdGFiYXNlLmxvY2soKTsKLSAgICAgICAgdHJ5IHsKKworICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKICAgICAgICAgICAgIGlmIChtV2luZG93ICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICBtV2luZG93LmNsZWFyKCk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBtUG9zID0gLTE7CisgICAgICAgICAgICBTUUxpdGVEYXRhYmFzZSBkYiA9IG1RdWVyeS5tRGF0YWJhc2UuZ2V0RGF0YWJhc2VIYW5kbGUobVF1ZXJ5Lm1TcWwpOworICAgICAgICAgICAgaWYgKCFkYi5lcXVhbHMobVF1ZXJ5Lm1EYXRhYmFzZSkpIHsKKyAgICAgICAgICAgICAgICAvLyBzaW5jZSB3ZSBuZWVkIHRvIHVzZSBhIGRpZmZlcmVudCBkYXRhYmFzZSBjb25uZWN0aW9uIGhhbmRsZSwKKyAgICAgICAgICAgICAgICAvLyByZS1jb21waWxlIHRoZSBxdWVyeQorICAgICAgICAgICAgICAgIGRiLmxvY2soKTsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAvLyBjbG9zZSB0aGUgb2xkIG1RdWVyeSBvYmplY3QgYW5kIG9wZW4gYSBuZXcgb25lCisgICAgICAgICAgICAgICAgICAgIG1RdWVyeS5jbG9zZSgpOworICAgICAgICAgICAgICAgICAgICBtUXVlcnkgPSBuZXcgU1FMaXRlUXVlcnkoZGIsIG1RdWVyeSk7CisgICAgICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICAgICAgZGIudW5sb2NrKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQogICAgICAgICAgICAgLy8gVGhpcyBvbmUgd2lsbCByZWNyZWF0ZSB0aGUgdGVtcCB0YWJsZSwgYW5kIGdldCBpdHMgY291bnQKICAgICAgICAgICAgIG1Ecml2ZXIuY3Vyc29yUmVxdWVyaWVkKHRoaXMpOwogICAgICAgICAgICAgbUNvdW50ID0gTk9fQ09VTlQ7CkBAIC01MzUsOCArNDYwLDYgQEAKICAgICAgICAgICAgIH0gZmluYWxseSB7CiAgICAgICAgICAgICAgICAgcXVlcnlUaHJlYWRVbmxvY2soKTsKICAgICAgICAgICAgIH0KLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIG1EYXRhYmFzZS51bmxvY2soKTsKICAgICAgICAgfQogCiAgICAgICAgIGlmIChDb25maWcuTE9HVikgewpAQCAtNTg0LDE0ICs1MDcsMTQgQEAKICAgICAgICAgICAgIGlmIChtV2luZG93ICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICBpbnQgbGVuID0gbVF1ZXJ5Lm1TcWwubGVuZ3RoKCk7CiAgICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAiRmluYWxpemluZyBhIEN1cnNvciB0aGF0IGhhcyBub3QgYmVlbiBkZWFjdGl2YXRlZCBvciBjbG9zZWQuICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgImRhdGFiYXNlID0gIiArIG1EYXRhYmFzZS5nZXRQYXRoKCkgKyAiLCB0YWJsZSA9ICIgKyBtRWRpdFRhYmxlICsKKyAgICAgICAgICAgICAgICAgICAgICAgICJkYXRhYmFzZSA9ICIgKyBtUXVlcnkubURhdGFiYXNlLmdldFBhdGgoKSArICIsIHRhYmxlID0gIiArIG1FZGl0VGFibGUgKwogICAgICAgICAgICAgICAgICAgICAgICAgIiwgcXVlcnkgPSAiICsgbVF1ZXJ5Lm1TcWwuc3Vic3RyaW5nKDAsIChsZW4gPiAxMDApID8gMTAwIDogbGVuKSwKICAgICAgICAgICAgICAgICAgICAgICAgIG1TdGFja1RyYWNlKTsKICAgICAgICAgICAgICAgICBjbG9zZSgpOwogICAgICAgICAgICAgICAgIFNRTGl0ZURlYnVnLm5vdGlmeUFjdGl2ZUN1cnNvckZpbmFsaXplZCgpOwogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICBpZiAoQ29uZmlnLkxPR1YpIHsKLSAgICAgICAgICAgICAgICAgICAgTG9nLnYoVEFHLCAiRmluYWxpemluZyBjdXJzb3Igb24gZGF0YWJhc2UgPSAiICsgbURhdGFiYXNlLmdldFBhdGgoKSArCisgICAgICAgICAgICAgICAgICAgIExvZy52KFRBRywgIkZpbmFsaXppbmcgY3Vyc29yIG9uIGRhdGFiYXNlID0gIiArIG1RdWVyeS5tRGF0YWJhc2UuZ2V0UGF0aCgpICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLCB0YWJsZSA9ICIgKyBtRWRpdFRhYmxlICsgIiwgcXVlcnkgPSAiICsgbVF1ZXJ5Lm1TcWwpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KQEAgLTU5OSw0ICs1MjIsMTEgQEAKICAgICAgICAgICAgIHN1cGVyLmZpbmFsaXplKCk7CiAgICAgICAgIH0KICAgICB9CisKKyAgICAvKioKKyAgICAgKiB0aGlzIGlzIG9ubHkgZm9yIHRlc3RpbmcgcHVycG9zZXMuCisgICAgICovCisgICAgLyogcGFja2FnZSAqLyBpbnQgZ2V0TUNvdW50KCkgeworICAgICAgICByZXR1cm4gbUNvdW50OworICAgIH0KIH0KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9TUUxpdGVDdXJzb3JEcml2ZXIuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9TUUxpdGVDdXJzb3JEcml2ZXIuamF2YQppbmRleCBlZGExYjc4Li5iMzk2M2Y5IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9zcWxpdGUvU1FMaXRlQ3Vyc29yRHJpdmVyLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2Uvc3FsaXRlL1NRTGl0ZUN1cnNvckRyaXZlci5qYXZhCkBAIC00MCw4ICs0MCw2IEBACiAKICAgICAvKioKICAgICAgKiBDYWxsZWQgYnkgYSBTUUxpdGVDdXJzb3Igd2hlbiBpdCBpcyByZXF1ZXJ5ZWQuCi0gICAgICogCi0gICAgICogQHJldHVybiBUaGUgbmV3IGNvdW50IHZhbHVlLgogICAgICAqLwogICAgIHZvaWQgY3Vyc29yUmVxdWVyaWVkKEN1cnNvciBjdXJzb3IpOwogCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9zcWxpdGUvU1FMaXRlRGF0YWJhc2UuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9TUUxpdGVEYXRhYmFzZS5qYXZhCmluZGV4IGNkYzliYmIuLjNkZjE3OTAgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9TUUxpdGVEYXRhYmFzZS5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9TUUxpdGVEYXRhYmFzZS5qYXZhCkBAIC0xNiwxNiArMTYsMTYgQEAKIAogcGFja2FnZSBhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZTsKIAotaW1wb3J0IGNvbS5nb29nbGUuYW5kcm9pZC5jb2xsZWN0Lk1hcHM7Ci0KLWltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eVRocmVhZDsKIGltcG9ydCBhbmRyb2lkLmFwcC5BcHBHbG9iYWxzOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZW50VmFsdWVzOwogaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2UuQ3Vyc29yOworaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2UuRGF0YWJhc2VFcnJvckhhbmRsZXI7CiBpbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5EYXRhYmFzZVV0aWxzOworaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2UuRGVmYXVsdERhdGFiYXNlRXJyb3JIYW5kbGVyOwogaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2UuU1FMRXhjZXB0aW9uOwogaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlLlNRTGl0ZURlYnVnLkRiU3RhdHM7CiBpbXBvcnQgYW5kcm9pZC5vcy5EZWJ1ZzsKK2ltcG9ydCBhbmRyb2lkLm9zLlN0YXRGczsKIGltcG9ydCBhbmRyb2lkLm9zLlN5c3RlbUNsb2NrOwogaW1wb3J0IGFuZHJvaWQub3MuU3lzdGVtUHJvcGVydGllczsKIGltcG9ydCBhbmRyb2lkLnRleHQuVGV4dFV0aWxzOwpAQCAtMzgsMTUgKzM4LDEzIEBACiAKIGltcG9ydCBqYXZhLmlvLkZpbGU7CiBpbXBvcnQgamF2YS5sYW5nLnJlZi5XZWFrUmVmZXJlbmNlOwotaW1wb3J0IGphdmEudGV4dC5TaW1wbGVEYXRlRm9ybWF0OwogaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CiBpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5MaW5rZWRIYXNoTWFwOwogaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7CiBpbXBvcnQgamF2YS51dGlsLk1hcDsKIGltcG9ydCBqYXZhLnV0aWwuUmFuZG9tOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7CiBpbXBvcnQgamF2YS51dGlsLldlYWtIYXNoTWFwOwogaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LmxvY2tzLlJlZW50cmFudExvY2s7CiBpbXBvcnQgamF2YS51dGlsLnJlZ2V4LlBhdHRlcm47CkBAIC02Nyw3ICs2NSw3IEBACiAgKiBpcyB0aGUgVW5pY29kZSBDb2xsYXRpb24gQWxnb3JpdGhtIGFuZCBub3QgdGFpbG9yZWQgdG8gdGhlIGN1cnJlbnQgbG9jYWxlLgogICovCiBwdWJsaWMgY2xhc3MgU1FMaXRlRGF0YWJhc2UgZXh0ZW5kcyBTUUxpdGVDbG9zYWJsZSB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJEYXRhYmFzZSI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJTUUxpdGVEYXRhYmFzZSI7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEVWRU5UX0RCX09QRVJBVElPTiA9IDUyMDAwOwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBFVkVOVF9EQl9DT1JSVVBUID0gNzUwMDQ7CiAKQEAgLTE5Miw2ICsxOTAsMTEgQEAKICAgICAgKi8KICAgICBwcml2YXRlIFNRTGl0ZVRyYW5zYWN0aW9uTGlzdGVuZXIgbVRyYW5zYWN0aW9uTGlzdGVuZXI7CiAKKyAgICAvKioKKyAgICAgKiB0aGlzIG1lbWJlciBpcyBzZXQgaWYge0BsaW5rICNleGVjU1FMKFN0cmluZyl9IGlzIHVzZWQgdG8gYmVnaW4gYW5kIGVuZCB0cmFuc2FjdGlvbnMuCisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIG1UcmFuc2FjdGlvblVzaW5nRXhlY1NxbDsKKwogICAgIC8qKiBTeW5jaHJvbml6ZSBvbiB0aGlzIHdoZW4gYWNjZXNzaW5nIHRoZSBkYXRhYmFzZSAqLwogICAgIHByaXZhdGUgZmluYWwgUmVlbnRyYW50TG9jayBtTG9jayA9IG5ldyBSZWVudHJhbnRMb2NrKHRydWUpOwogCkBAIC0yMzMsOTQgKzIzNiwxMzMgQEAKICAgICAvLyBsb2NrIGFjcXVpc3Rpb25zIG9mIHRoZSBkYXRhYmFzZS4KICAgICAvKiBwYWNrYWdlICovIHN0YXRpYyBmaW5hbCBTdHJpbmcgR0VUX0xPQ0tfTE9HX1BSRUZJWCA9ICJHRVRMT0NLOiI7CiAKLSAgICAvKiogVXNlZCBieSBuYXRpdmUgY29kZSwgZG8gbm90IHJlbmFtZSAqLwotICAgIC8qIHBhY2thZ2UgKi8gaW50IG1OYXRpdmVIYW5kbGUgPSAwOworICAgIC8qKiBVc2VkIGJ5IG5hdGl2ZSBjb2RlLCBkbyBub3QgcmVuYW1lLiBtYWtlIGl0IHZvbGF0aWxlLCBzbyBpdCBpcyB0aHJlYWQtc2FmZS4gKi8KKyAgICAvKiBwYWNrYWdlICovIHZvbGF0aWxlIGludCBtTmF0aXZlSGFuZGxlID0gMDsKIAotICAgIC8qKiBVc2VkIHRvIG1ha2UgdGVtcCB0YWJsZSBuYW1lcyB1bmlxdWUgKi8KLSAgICAvKiBwYWNrYWdlICovIGludCBtVGVtcFRhYmxlU2VxdWVuY2UgPSAwOworICAgIC8qKgorICAgICAqIFRoZSBzaXplLCBpbiBieXRlcywgb2YgYSBibG9jayBvbiAiL2RhdGEiLiBUaGlzIGNvcnJlc3BvbmRzIHRvIHRoZSBVbml4CisgICAgICogc3RhdGZzLmZfYnNpemUgZmllbGQuIG5vdGUgdGhhdCB0aGlzIGZpZWxkIGlzIGxhemlseSBpbml0aWFsaXplZC4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBpbnQgc0Jsb2NrU2l6ZSA9IDA7CiAKICAgICAvKiogVGhlIHBhdGggZm9yIHRoZSBkYXRhYmFzZSBmaWxlICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgbVBhdGg7CisgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbVBhdGg7CiAKICAgICAvKiogVGhlIGFub255bWl6ZWQgcGF0aCBmb3IgdGhlIGRhdGFiYXNlIGZpbGUgZm9yIGxvZ2dpbmcgcHVycG9zZXMgKi8KICAgICBwcml2YXRlIFN0cmluZyBtUGF0aEZvckxvZ3MgPSBudWxsOyAgLy8gbGF6aWx5IHBvcHVsYXRlZAogCiAgICAgLyoqIFRoZSBmbGFncyBwYXNzZWQgdG8gb3Blbi9jcmVhdGUgKi8KLSAgICBwcml2YXRlIGludCBtRmxhZ3M7CisgICAgcHJpdmF0ZSBmaW5hbCBpbnQgbUZsYWdzOwogCiAgICAgLyoqIFRoZSBvcHRpb25hbCBmYWN0b3J5IHRvIHVzZSB3aGVuIGNyZWF0aW5nIG5ldyBDdXJzb3JzICovCi0gICAgcHJpdmF0ZSBDdXJzb3JGYWN0b3J5IG1GYWN0b3J5OworICAgIHByaXZhdGUgZmluYWwgQ3Vyc29yRmFjdG9yeSBtRmFjdG9yeTsKIAotICAgIHByaXZhdGUgV2Vha0hhc2hNYXA8U1FMaXRlQ2xvc2FibGUsIE9iamVjdD4gbVByb2dyYW1zOworICAgIHByaXZhdGUgZmluYWwgV2Vha0hhc2hNYXA8U1FMaXRlQ2xvc2FibGUsIE9iamVjdD4gbVByb2dyYW1zOwogCiAgICAgLyoqCi0gICAgICogZm9yIGVhY2ggaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcywgYSBjYWNoZSBpcyBtYWludGFpbmVkIHRvIHN0b3JlCisgICAgICogZm9yIGVhY2ggaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcywgYSBMUlUgY2FjaGUgaXMgbWFpbnRhaW5lZCB0byBzdG9yZQogICAgICAqIHRoZSBjb21waWxlZCBxdWVyeSBzdGF0ZW1lbnQgaWRzIHJldHVybmVkIGJ5IHNxbGl0ZSBkYXRhYmFzZS4KLSAgICAgKiAgICAga2V5ID0gc3FsIHN0YXRlbWVudCB3aXRoICI/IiBmb3IgYmluZCBhcmdzCisgICAgICogICAgIGtleSA9IFNRTCBzdGF0ZW1lbnQgd2l0aCAiPyIgZm9yIGJpbmQgYXJncwogICAgICAqICAgICB2YWx1ZSA9IHtAbGluayBTUUxpdGVDb21waWxlZFNxbH0KICAgICAgKiBJZiBhbiBhcHBsaWNhdGlvbiBvcGVucyB0aGUgZGF0YWJhc2UgYW5kIGtlZXBzIGl0IG9wZW4gZHVyaW5nIGl0cyBlbnRpcmUgbGlmZSwgdGhlbgotICAgICAqIHRoZXJlIHdpbGwgbm90IGJlIGFuIG92ZXJoZWFkIG9mIGNvbXBpbGF0aW9uIG9mIHNxbCBzdGF0ZW1lbnRzIGJ5IHNxbGl0ZS4KKyAgICAgKiB0aGVyZSB3aWxsIG5vdCBiZSBhbiBvdmVyaGVhZCBvZiBjb21waWxhdGlvbiBvZiBTUUwgc3RhdGVtZW50cyBieSBzcWxpdGUuCiAgICAgICoKICAgICAgKiB3aHkgaXMgdGhpcyBjYWNoZSBOT1Qgc3RhdGljPyBiZWNhdXNlIHNxbGl0ZSBhdHRhY2hlcyBjb21waWxlZHNxbCBzdGF0ZW1lbnRzIHRvIHRoZQogICAgICAqIHN0cnVjdCBjcmVhdGVkIHdoZW4ge0BsaW5rIFNRTGl0ZURhdGFiYXNlI29wZW5EYXRhYmFzZShTdHJpbmcsIEN1cnNvckZhY3RvcnksIGludCl9IGlzCiAgICAgICogaW52b2tlZC4KICAgICAgKgogICAgICAqIHRoaXMgY2FjaGUgaGFzIGFuIHVwcGVyIGxpbWl0IG9mIG1NYXhTcWxDYWNoZVNpemUgKHNldHRhYmxlIGJ5IGNhbGxpbmcgdGhlIG1ldGhvZAotICAgICAqIChAbGluayBzZXRNYXhDYWNoZVNpemUoaW50KX0pLiBpdHMgZGVmYXVsdCBpcyAwIC0gaS5lLiwgbm8gY2FjaGluZyBieSBkZWZhdWx0IGJlY2F1c2UKLSAgICAgKiBtb3N0IG9mIHRoZSBhcHBzIGRvbid0IHVzZSAiPyIgc3ludGF4IGluIHRoZWlyIHNxbCwgY2FjaGluZyBpcyBub3QgdXNlZnVsIGZvciB0aGVtLgorICAgICAqIChAbGluayAjc2V0TWF4U3FsQ2FjaGVTaXplKGludCl9KS4KICAgICAgKi8KLSAgICAvKiBwYWNrYWdlICovIE1hcDxTdHJpbmcsIFNRTGl0ZUNvbXBpbGVkU3FsPiBtQ29tcGlsZWRRdWVyaWVzID0gTWFwcy5uZXdIYXNoTWFwKCk7CisgICAgLy8gZGVmYXVsdCBzdGF0ZW1lbnQtY2FjaGUgc2l6ZSBwZXIgZGF0YWJhc2UgY29ubmVjdGlvbiAoID0gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcykKKyAgICBwcml2YXRlIGludCBtTWF4U3FsQ2FjaGVTaXplID0gMjU7CisgICAgLyogcGFja2FnZSAqLyBmaW5hbCBNYXA8U3RyaW5nLCBTUUxpdGVDb21waWxlZFNxbD4gbUNvbXBpbGVkUXVlcmllcyA9CisgICAgICAgIG5ldyBMaW5rZWRIYXNoTWFwPFN0cmluZywgU1FMaXRlQ29tcGlsZWRTcWw+KG1NYXhTcWxDYWNoZVNpemUgKyAxLCAwLjc1ZiwgdHJ1ZSkgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiByZW1vdmVFbGRlc3RFbnRyeShNYXAuRW50cnk8U3RyaW5nLCBTUUxpdGVDb21waWxlZFNxbD4gZWxkZXN0KSB7CisgICAgICAgICAgICAgICAgLy8gZWxkZXN0ID0gbGVhc3QtcmVjZW50bHkgdXNlZCBlbnRyeQorICAgICAgICAgICAgICAgIC8vIGlmIGl0IG5lZWRzIHRvIGJlIHJlbW92ZWQgdG8gYWNjb21tb2RhdGUgYSBuZXcgZW50cnksCisgICAgICAgICAgICAgICAgLy8gICAgIGNsb3NlIHtAbGluayBTUUxpdGVDb21waWxlZFNxbH0gcmVwcmVzZW50ZWQgYnkgdGhpcyBlbnRyeSwgaWYgbm90IGluIHVzZQorICAgICAgICAgICAgICAgIC8vICAgICBhbmQgdGhlbiBsZXQgaXQgYmUgcmVtb3ZlZCBmcm9tIHRoZSBNYXAuCisgICAgICAgICAgICAgICAgLy8gd2hlbiB0aGlzIGlzIGNhbGxlZCwgdGhlIGNhbGxlciBtdXN0IGJlIHRyeWluZyB0byBhZGQgYSBqdXN0LWNvbXBpbGVkIHN0bXQKKyAgICAgICAgICAgICAgICAvLyB0byBjYWNoZTsgaS5lLiwgY2FsbGVyIHNob3VsZCBhbHJlYWR5IGhhdmUgYWNxdWlyZWQgZGF0YWJhc2UgbG9jayBBTkQKKyAgICAgICAgICAgICAgICAvLyB0aGUgbG9jayBvbiBtQ29tcGlsZWRRdWVyaWVzLiBkbyBhcyBhc3NlcnQgb2YgdGhlc2UgdHdvIDIgZmFjdHMuCisgICAgICAgICAgICAgICAgdmVyaWZ5TG9ja093bmVyKCk7CisgICAgICAgICAgICAgICAgaWYgKHRoaXMuc2l6ZSgpIDw9IG1NYXhTcWxDYWNoZVNpemUpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gY2FjaGUgaXMgbm90IGZ1bGwuIG5vdGhpbmcgbmVlZHMgdG8gYmUgcmVtb3ZlZAorICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8vIGNhY2hlIGlzIGZ1bGwuIGVsZGVzdCB3aWxsIGJlIHJlbW92ZWQuCisgICAgICAgICAgICAgICAgZWxkZXN0LmdldFZhbHVlKCkucmVsZWFzZUlmTm90SW5Vc2UoKTsKKyAgICAgICAgICAgICAgICAvLyByZXR1cm4gdHJ1ZSwgc28gdGhhdCB0aGlzIGVudHJ5IGlzIHJlbW92ZWQgYXV0b21hdGljYWxseSBieSB0aGUgY2FsbGVyLgorICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9OwogICAgIC8qKgotICAgICAqIEBoaWRlCisgICAgICogYWJzb2x1dGUgbWF4IHZhbHVlIHRoYXQgY2FuIGJlIHNldCBieSB7QGxpbmsgI3NldE1heFNxbENhY2hlU2l6ZShpbnQpfQorICAgICAqIHNpemUgb2YgZWFjaCBwcmVwYXJlZC1zdGF0ZW1lbnQgaXMgYmV0d2VlbiAxSyAtIDZLLCBkZXBlbmRpbmcgb24gdGhlIGNvbXBsZXhpdHkgb2YgdGhlCisgICAgICogU1FMIHN0YXRlbWVudCAmIHNjaGVtYS4KICAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNQVhfU1FMX0NBQ0hFX1NJWkUgPSAyNTA7Ci0gICAgcHJpdmF0ZSBpbnQgbU1heFNxbENhY2hlU2l6ZSA9IE1BWF9TUUxfQ0FDSEVfU0laRTsgLy8gbWF4IGNhY2hlIHNpemUgcGVyIERhdGFiYXNlIGluc3RhbmNlCi0gICAgcHJpdmF0ZSBpbnQgbUNhY2hlRnVsbFdhcm5pbmdzOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNQVhfV0FSTklOR1NfT05fQ0FDSEVTSVpFX0NPTkRJVElPTiA9IDE7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTUFYX1NRTF9DQUNIRV9TSVpFID0gMTAwOworICAgIHByaXZhdGUgYm9vbGVhbiBtQ2FjaGVGdWxsV2FybmluZzsKIAogICAgIC8qKiBtYWludGFpbiBzdGF0cyBhYm91dCBudW1iZXIgb2YgY2FjaGUgaGl0cyBhbmQgbWlzc2VzICovCiAgICAgcHJpdmF0ZSBpbnQgbU51bUNhY2hlSGl0czsKICAgICBwcml2YXRlIGludCBtTnVtQ2FjaGVNaXNzZXM7CiAKLSAgICAvKiogdGhlIGZvbGxvd2luZyAyIG1lbWJlcnMgbWFpbnRhaW4gdGhlIHRpbWUgd2hlbiBhIGRhdGFiYXNlIGlzIG9wZW5lZCBhbmQgY2xvc2VkICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgbVRpbWVPcGVuZWQgPSBudWxsOwotICAgIHByaXZhdGUgU3RyaW5nIG1UaW1lQ2xvc2VkID0gbnVsbDsKLQogICAgIC8qKiBVc2VkIHRvIGZpbmQgb3V0IHdoZXJlIHRoaXMgb2JqZWN0IHdhcyBjcmVhdGVkIGluIGNhc2UgaXQgbmV2ZXIgZ290IGNsb3NlZC4gKi8KLSAgICBwcml2YXRlIFRocm93YWJsZSBtU3RhY2tUcmFjZSA9IG51bGw7CisgICAgcHJpdmF0ZSBmaW5hbCBUaHJvd2FibGUgbVN0YWNrVHJhY2U7CiAKICAgICAvLyBTeXN0ZW0gcHJvcGVydHkgdGhhdCBlbmFibGVzIGxvZ2dpbmcgb2Ygc2xvdyBxdWVyaWVzLiBTcGVjaWZ5IHRoZSB0aHJlc2hvbGQgaW4gbXMuCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIExPR19TTE9XX1FVRVJJRVNfUFJPUEVSVFkgPSAiZGIubG9nLnNsb3dfcXVlcnlfdGhyZXNob2xkIjsKICAgICBwcml2YXRlIGZpbmFsIGludCBtU2xvd1F1ZXJ5VGhyZXNob2xkOwogCi0gICAgLyoqCi0gICAgICogQHBhcmFtIGNsb3NhYmxlCisgICAgLyoqIHN0b3JlcyB0aGUgbGlzdCBvZiBzdGF0ZW1lbnQgaWRzIHRoYXQgbmVlZCB0byBiZSBmaW5hbGl6ZWQgYnkgc3FsaXRlICovCisgICAgcHJpdmF0ZSBmaW5hbCBBcnJheUxpc3Q8SW50ZWdlcj4gbUNsb3NlZFN0YXRlbWVudElkcyA9IG5ldyBBcnJheUxpc3Q8SW50ZWdlcj4oKTsKKworICAgIC8qKiB7QGxpbmsgRGF0YWJhc2VFcnJvckhhbmRsZXJ9IHRvIGJlIHVzZWQgd2hlbiBTUUxpdGUgcmV0dXJucyBhbnkgb2YgdGhlIGZvbGxvd2luZyBlcnJvcnMKKyAgICAgKiAgICBDb3JydXB0aW9uCisgICAgICogKi8KKyAgICBwcml2YXRlIGZpbmFsIERhdGFiYXNlRXJyb3JIYW5kbGVyIG1FcnJvckhhbmRsZXI7CisKKyAgICAvKiogVGhlIERhdGFiYXNlIGNvbm5lY3Rpb24gcG9vbCB7QGxpbmsgRGF0YWJhc2VDb25uZWN0aW9uUG9vbH0uCisgICAgICogVmlzaWJpbGl0eSBpcyBwYWNrYWdlLXByaXZhdGUgZm9yIHRlc3RpbmcgcHVycG9zZXMuIG90aGVyd2lzZSwgcHJpdmF0ZSB2aXNpYmlsaXR5IGlzIGVub3VnaC4KICAgICAgKi8KLSAgICB2b2lkIGFkZFNRTGl0ZUNsb3NhYmxlKFNRTGl0ZUNsb3NhYmxlIGNsb3NhYmxlKSB7Ci0gICAgICAgIGxvY2soKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIG1Qcm9ncmFtcy5wdXQoY2xvc2FibGUsIG51bGwpOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgdW5sb2NrKCk7Ci0gICAgICAgIH0KKyAgICAvKiBwYWNrYWdlICovIHZvbGF0aWxlIERhdGFiYXNlQ29ubmVjdGlvblBvb2wgbUNvbm5lY3Rpb25Qb29sID0gbnVsbDsKKworICAgIC8qKiBFYWNoIGRhdGFiYXNlIGNvbm5lY3Rpb24gaGFuZGxlIGluIHRoZSBwb29sIGlzIGFzc2lnbmVkIGEgbnVtYmVyIDEuLk4sIHdoZXJlIE4gaXMgdGhlCisgICAgICogc2l6ZSBvZiB0aGUgY29ubmVjdGlvbiBwb29sLgorICAgICAqIFRoZSBtYWluIGNvbm5lY3Rpb24gaGFuZGxlIHRvIHdoaWNoIHRoZSBwb29sIGlzIGF0dGFjaGVkIGlzIGFzc2lnbmVkIGEgdmFsdWUgb2YgMC4KKyAgICAgKi8KKyAgICAvKiBwYWNrYWdlICovIGZpbmFsIHNob3J0IG1Db25uZWN0aW9uTnVtOworCisgICAgLyoqIG9uIHBvb2xlZCBkYXRhYmFzZSBjb25uZWN0aW9ucywgdGhpcyBtZW1iZXIgcG9pbnRzIHRvIHRoZSBwYXJlbnQgKCA9IG1haW4pCisgICAgICogZGF0YWJhc2UgY29ubmVjdGlvbiBoYW5kbGUuCisgICAgICogcGFja2FnZSB2aXNpYmlsaXR5IG9ubHkgZm9yIHRlc3RpbmcgcHVycG9zZXMKKyAgICAgKi8KKyAgICAvKiBwYWNrYWdlICovIFNRTGl0ZURhdGFiYXNlIG1QYXJlbnRDb25uT2JqID0gbnVsbDsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNRU1PUllfREJfUEFUSCA9ICI6bWVtb3J5OiI7CisKKyAgICAvKiogc3RvcmVzIHJlZmVyZW5jZSB0byBhbGwgZGF0YWJhc2VzIG9wZW5lZCBpbiB0aGUgY3VycmVudCBwcm9jZXNzLiAqLworICAgIHByaXZhdGUgc3RhdGljIEFycmF5TGlzdDxXZWFrUmVmZXJlbmNlPFNRTGl0ZURhdGFiYXNlPj4gbUFjdGl2ZURhdGFiYXNlcyA9CisgICAgICAgICAgICBuZXcgQXJyYXlMaXN0PFdlYWtSZWZlcmVuY2U8U1FMaXRlRGF0YWJhc2U+PigpOworCisgICAgc3luY2hyb25pemVkIHZvaWQgYWRkU1FMaXRlQ2xvc2FibGUoU1FMaXRlQ2xvc2FibGUgY2xvc2FibGUpIHsKKyAgICAgICAgLy8gbVByb2dyYW1zIGlzIHBlciBpbnN0YW5jZSBvZiBTUUxpdGVEYXRhYmFzZSBhbmQgaXQgZG9lc24ndCBhY3R1YWxseSB0b3VjaCB0aGUgZGF0YWJhc2UKKyAgICAgICAgLy8gaXRzZWxmLiBzbywgdGhlcmUgaXMgbm8gbmVlZCB0byBsb2NrKCkuCisgICAgICAgIG1Qcm9ncmFtcy5wdXQoY2xvc2FibGUsIG51bGwpOwogICAgIH0KIAotICAgIHZvaWQgcmVtb3ZlU1FMaXRlQ2xvc2FibGUoU1FMaXRlQ2xvc2FibGUgY2xvc2FibGUpIHsKLSAgICAgICAgbG9jaygpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgbVByb2dyYW1zLnJlbW92ZShjbG9zYWJsZSk7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICB1bmxvY2soKTsKLSAgICAgICAgfQorICAgIHN5bmNocm9uaXplZCB2b2lkIHJlbW92ZVNRTGl0ZUNsb3NhYmxlKFNRTGl0ZUNsb3NhYmxlIGNsb3NhYmxlKSB7CisgICAgICAgIG1Qcm9ncmFtcy5yZW1vdmUoY2xvc2FibGUpOwogICAgIH0KIAogICAgIEBPdmVycmlkZQogICAgIHByb3RlY3RlZCB2b2lkIG9uQWxsUmVmZXJlbmNlc1JlbGVhc2VkKCkgewogICAgICAgICBpZiAoaXNPcGVuKCkpIHsKLSAgICAgICAgICAgIGlmIChTUUxpdGVEZWJ1Zy5ERUJVR19TUUxfQ0FDSEUpIHsKLSAgICAgICAgICAgICAgICBtVGltZUNsb3NlZCA9IGdldFRpbWUoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGRiY2xvc2UoKTsKKyAgICAgICAgICAgIC8vIGNsb3NlIHRoZSBkYXRhYmFzZSB3aGljaCB3aWxsIGNsb3NlIGFsbCBwZW5kaW5nIHN0YXRlbWVudHMgdG8gYmUgZmluYWxpemVkIGFsc28KKyAgICAgICAgICAgIGNsb3NlKCk7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTM1MCwxOSArMzkyLDggQEAKICAgICBwcml2YXRlIGJvb2xlYW4gbUxvY2tpbmdFbmFibGVkID0gdHJ1ZTsKIAogICAgIC8qIHBhY2thZ2UgKi8gdm9pZCBvbkNvcnJ1cHRpb24oKSB7Ci0gICAgICAgIExvZy5lKFRBRywgIlJlbW92aW5nIGNvcnJ1cHQgZGF0YWJhc2U6ICIgKyBtUGF0aCk7CiAgICAgICAgIEV2ZW50TG9nLndyaXRlRXZlbnQoRVZFTlRfREJfQ09SUlVQVCwgbVBhdGgpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gQ2xvc2UgdGhlIGRhdGFiYXNlIChpZiB3ZSBjYW4pLCB3aGljaCB3aWxsIGNhdXNlIHN1YnNlcXVlbnQgb3BlcmF0aW9ucyB0byBmYWlsLgotICAgICAgICAgICAgY2xvc2UoKTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIC8vIERlbGV0ZSB0aGUgY29ycnVwdCBmaWxlLiAgRG9uJ3QgcmUtY3JlYXRlIGl0IG5vdyAtLSB0aGF0IHdvdWxkIGp1c3QgY29uZnVzZSBwZW9wbGUKLSAgICAgICAgICAgIC8vIC0tIGJ1dCB0aGUgbmV4dCB0aW1lIHNvbWVvbmUgdHJpZXMgdG8gb3BlbiBpdCwgdGhleSBjYW4gc2V0IGl0IHVwIGZyb20gc2NyYXRjaC4KLSAgICAgICAgICAgIGlmICghbVBhdGguZXF1YWxzSWdub3JlQ2FzZSgiOm1lbW9yeSIpKSB7Ci0gICAgICAgICAgICAgICAgLy8gZGVsZXRlIGlzIG9ubHkgZm9yIG5vbi1tZW1vcnkgZGF0YWJhc2UgZmlsZXMKLSAgICAgICAgICAgICAgICBuZXcgRmlsZShtUGF0aCkuZGVsZXRlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KKyAgICAgICAgbUVycm9ySGFuZGxlci5vbkNvcnJ1cHRpb24odGhpcyk7CiAgICAgfQogCiAgICAgLyoqCkBAIC0zNzQsNiArNDA1LDcgQEAKICAgICAgKiBAc2VlICN1bmxvY2soKQogICAgICAqLwogICAgIC8qIHBhY2thZ2UgKi8gdm9pZCBsb2NrKCkgeworICAgICAgICB2ZXJpZnlEYklzT3BlbigpOwogICAgICAgICBpZiAoIW1Mb2NraW5nRW5hYmxlZCkgcmV0dXJuOwogICAgICAgICBtTG9jay5sb2NrKCk7CiAgICAgICAgIGlmIChTUUxpdGVEZWJ1Zy5ERUJVR19MT0NLX1RJTUVfVFJBQ0tJTkcpIHsKQEAgLTM5NCw2ICs0MjYsNyBAQAogICAgICAqIEBzZWUgI3VubG9ja0ZvcmNlZCgpCiAgICAgICovCiAgICAgcHJpdmF0ZSB2b2lkIGxvY2tGb3JjZWQoKSB7CisgICAgICAgIHZlcmlmeURiSXNPcGVuKCk7CiAgICAgICAgIG1Mb2NrLmxvY2soKTsKICAgICAgICAgaWYgKFNRTGl0ZURlYnVnLkRFQlVHX0xPQ0tfVElNRV9UUkFDS0lORykgewogICAgICAgICAgICAgaWYgKG1Mb2NrLmdldEhvbGRDb3VudCgpID09IDEpIHsKQEAgLTQ2MCwxMSArNDkzLDE0IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQmVnaW5zIGEgdHJhbnNhY3Rpb24uIFRyYW5zYWN0aW9ucyBjYW4gYmUgbmVzdGVkLiBXaGVuIHRoZSBvdXRlciB0cmFuc2FjdGlvbiBpcyBlbmRlZCBhbGwgb2YKKyAgICAgKiBCZWdpbnMgYSB0cmFuc2FjdGlvbiBpbiBFWENMVVNJVkUgbW9kZS4KKyAgICAgKiA8cD4KKyAgICAgKiBUcmFuc2FjdGlvbnMgY2FuIGJlIG5lc3RlZC4KKyAgICAgKiBXaGVuIHRoZSBvdXRlciB0cmFuc2FjdGlvbiBpcyBlbmRlZCBhbGwgb2YKICAgICAgKiB0aGUgd29yayBkb25lIGluIHRoYXQgdHJhbnNhY3Rpb24gYW5kIGFsbCBvZiB0aGUgbmVzdGVkIHRyYW5zYWN0aW9ucyB3aWxsIGJlIGNvbW1pdHRlZCBvcgogICAgICAqIHJvbGxlZCBiYWNrLiBUaGUgY2hhbmdlcyB3aWxsIGJlIHJvbGxlZCBiYWNrIGlmIGFueSB0cmFuc2FjdGlvbiBpcyBlbmRlZCB3aXRob3V0IGJlaW5nCiAgICAgICogbWFya2VkIGFzIGNsZWFuIChieSBjYWxsaW5nIHNldFRyYW5zYWN0aW9uU3VjY2Vzc2Z1bCkuIE90aGVyd2lzZSB0aGV5IHdpbGwgYmUgY29tbWl0dGVkLgotICAgICAqCisgICAgICogPC9wPgogICAgICAqIDxwPkhlcmUgaXMgdGhlIHN0YW5kYXJkIGlkaW9tIGZvciB0cmFuc2FjdGlvbnM6CiAgICAgICoKICAgICAgKiA8cHJlPgpAQCAtNDc4LDE1ICs1MTQsNDIgQEAKICAgICAgKiA8L3ByZT4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBiZWdpblRyYW5zYWN0aW9uKCkgewotICAgICAgICBiZWdpblRyYW5zYWN0aW9uV2l0aExpc3RlbmVyKG51bGwgLyogdHJhbnNhY3Rpb25TdGF0dXNDYWxsYmFjayAqLyk7CisgICAgICAgIGJlZ2luVHJhbnNhY3Rpb24obnVsbCAvKiB0cmFuc2FjdGlvblN0YXR1c0NhbGxiYWNrICovLCB0cnVlKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBCZWdpbnMgYSB0cmFuc2FjdGlvbi4gVHJhbnNhY3Rpb25zIGNhbiBiZSBuZXN0ZWQuIFdoZW4gdGhlIG91dGVyIHRyYW5zYWN0aW9uIGlzIGVuZGVkIGFsbCBvZgorICAgICAqIEJlZ2lucyBhIHRyYW5zYWN0aW9uIGluIElNTUVESUFURSBtb2RlLiBUcmFuc2FjdGlvbnMgY2FuIGJlIG5lc3RlZC4gV2hlbgorICAgICAqIHRoZSBvdXRlciB0cmFuc2FjdGlvbiBpcyBlbmRlZCBhbGwgb2YgdGhlIHdvcmsgZG9uZSBpbiB0aGF0IHRyYW5zYWN0aW9uCisgICAgICogYW5kIGFsbCBvZiB0aGUgbmVzdGVkIHRyYW5zYWN0aW9ucyB3aWxsIGJlIGNvbW1pdHRlZCBvciByb2xsZWQgYmFjay4gVGhlCisgICAgICogY2hhbmdlcyB3aWxsIGJlIHJvbGxlZCBiYWNrIGlmIGFueSB0cmFuc2FjdGlvbiBpcyBlbmRlZCB3aXRob3V0IGJlaW5nCisgICAgICogbWFya2VkIGFzIGNsZWFuIChieSBjYWxsaW5nIHNldFRyYW5zYWN0aW9uU3VjY2Vzc2Z1bCkuIE90aGVyd2lzZSB0aGV5CisgICAgICogd2lsbCBiZSBjb21taXR0ZWQuCisgICAgICogPHA+CisgICAgICogSGVyZSBpcyB0aGUgc3RhbmRhcmQgaWRpb20gZm9yIHRyYW5zYWN0aW9uczoKKyAgICAgKgorICAgICAqIDxwcmU+CisgICAgICogICBkYi5iZWdpblRyYW5zYWN0aW9uTm9uRXhjbHVzaXZlKCk7CisgICAgICogICB0cnkgeworICAgICAqICAgICAuLi4KKyAgICAgKiAgICAgZGIuc2V0VHJhbnNhY3Rpb25TdWNjZXNzZnVsKCk7CisgICAgICogICB9IGZpbmFsbHkgeworICAgICAqICAgICBkYi5lbmRUcmFuc2FjdGlvbigpOworICAgICAqICAgfQorICAgICAqIDwvcHJlPgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGJlZ2luVHJhbnNhY3Rpb25Ob25FeGNsdXNpdmUoKSB7CisgICAgICAgIGJlZ2luVHJhbnNhY3Rpb24obnVsbCAvKiB0cmFuc2FjdGlvblN0YXR1c0NhbGxiYWNrICovLCBmYWxzZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQmVnaW5zIGEgdHJhbnNhY3Rpb24gaW4gRVhDTFVTSVZFIG1vZGUuCisgICAgICogPHA+CisgICAgICogVHJhbnNhY3Rpb25zIGNhbiBiZSBuZXN0ZWQuCisgICAgICogV2hlbiB0aGUgb3V0ZXIgdHJhbnNhY3Rpb24gaXMgZW5kZWQgYWxsIG9mCiAgICAgICogdGhlIHdvcmsgZG9uZSBpbiB0aGF0IHRyYW5zYWN0aW9uIGFuZCBhbGwgb2YgdGhlIG5lc3RlZCB0cmFuc2FjdGlvbnMgd2lsbCBiZSBjb21taXR0ZWQgb3IKICAgICAgKiByb2xsZWQgYmFjay4gVGhlIGNoYW5nZXMgd2lsbCBiZSByb2xsZWQgYmFjayBpZiBhbnkgdHJhbnNhY3Rpb24gaXMgZW5kZWQgd2l0aG91dCBiZWluZwogICAgICAqIG1hcmtlZCBhcyBjbGVhbiAoYnkgY2FsbGluZyBzZXRUcmFuc2FjdGlvblN1Y2Nlc3NmdWwpLiBPdGhlcndpc2UgdGhleSB3aWxsIGJlIGNvbW1pdHRlZC4KLSAgICAgKgorICAgICAqIDwvcD4KICAgICAgKiA8cD5IZXJlIGlzIHRoZSBzdGFuZGFyZCBpZGlvbSBmb3IgdHJhbnNhY3Rpb25zOgogICAgICAqCiAgICAgICogPHByZT4KQEAgLTQ5OCwxNSArNTYxLDQ4IEBACiAgICAgICogICAgIGRiLmVuZFRyYW5zYWN0aW9uKCk7CiAgICAgICogICB9CiAgICAgICogPC9wcmU+CisgICAgICoKICAgICAgKiBAcGFyYW0gdHJhbnNhY3Rpb25MaXN0ZW5lciBsaXN0ZW5lciB0aGF0IHNob3VsZCBiZSBub3RpZmllZCB3aGVuIHRoZSB0cmFuc2FjdGlvbiBiZWdpbnMsCiAgICAgICogY29tbWl0cywgb3IgaXMgcm9sbGVkIGJhY2ssIGVpdGhlciBleHBsaWNpdGx5IG9yIGJ5IGEgY2FsbCB0bwogICAgICAqIHtAbGluayAjeWllbGRJZkNvbnRlbmRlZFNhZmVseX0uCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgYmVnaW5UcmFuc2FjdGlvbldpdGhMaXN0ZW5lcihTUUxpdGVUcmFuc2FjdGlvbkxpc3RlbmVyIHRyYW5zYWN0aW9uTGlzdGVuZXIpIHsKKyAgICAgICAgYmVnaW5UcmFuc2FjdGlvbih0cmFuc2FjdGlvbkxpc3RlbmVyLCB0cnVlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBCZWdpbnMgYSB0cmFuc2FjdGlvbiBpbiBJTU1FRElBVEUgbW9kZS4gVHJhbnNhY3Rpb25zIGNhbiBiZSBuZXN0ZWQuIFdoZW4KKyAgICAgKiB0aGUgb3V0ZXIgdHJhbnNhY3Rpb24gaXMgZW5kZWQgYWxsIG9mIHRoZSB3b3JrIGRvbmUgaW4gdGhhdCB0cmFuc2FjdGlvbgorICAgICAqIGFuZCBhbGwgb2YgdGhlIG5lc3RlZCB0cmFuc2FjdGlvbnMgd2lsbCBiZSBjb21taXR0ZWQgb3Igcm9sbGVkIGJhY2suIFRoZQorICAgICAqIGNoYW5nZXMgd2lsbCBiZSByb2xsZWQgYmFjayBpZiBhbnkgdHJhbnNhY3Rpb24gaXMgZW5kZWQgd2l0aG91dCBiZWluZworICAgICAqIG1hcmtlZCBhcyBjbGVhbiAoYnkgY2FsbGluZyBzZXRUcmFuc2FjdGlvblN1Y2Nlc3NmdWwpLiBPdGhlcndpc2UgdGhleQorICAgICAqIHdpbGwgYmUgY29tbWl0dGVkLgorICAgICAqIDxwPgorICAgICAqIEhlcmUgaXMgdGhlIHN0YW5kYXJkIGlkaW9tIGZvciB0cmFuc2FjdGlvbnM6CisgICAgICoKKyAgICAgKiA8cHJlPgorICAgICAqICAgZGIuYmVnaW5UcmFuc2FjdGlvbldpdGhMaXN0ZW5lck5vbkV4Y2x1c2l2ZShsaXN0ZW5lcik7CisgICAgICogICB0cnkgeworICAgICAqICAgICAuLi4KKyAgICAgKiAgICAgZGIuc2V0VHJhbnNhY3Rpb25TdWNjZXNzZnVsKCk7CisgICAgICogICB9IGZpbmFsbHkgeworICAgICAqICAgICBkYi5lbmRUcmFuc2FjdGlvbigpOworICAgICAqICAgfQorICAgICAqIDwvcHJlPgorICAgICAqCisgICAgICogQHBhcmFtIHRyYW5zYWN0aW9uTGlzdGVuZXIgbGlzdGVuZXIgdGhhdCBzaG91bGQgYmUgbm90aWZpZWQgd2hlbiB0aGUKKyAgICAgKiAgICAgICAgICAgIHRyYW5zYWN0aW9uIGJlZ2lucywgY29tbWl0cywgb3IgaXMgcm9sbGVkIGJhY2ssIGVpdGhlcgorICAgICAqICAgICAgICAgICAgZXhwbGljaXRseSBvciBieSBhIGNhbGwgdG8ge0BsaW5rICN5aWVsZElmQ29udGVuZGVkU2FmZWx5fS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBiZWdpblRyYW5zYWN0aW9uV2l0aExpc3RlbmVyTm9uRXhjbHVzaXZlKAorICAgICAgICAgICAgU1FMaXRlVHJhbnNhY3Rpb25MaXN0ZW5lciB0cmFuc2FjdGlvbkxpc3RlbmVyKSB7CisgICAgICAgIGJlZ2luVHJhbnNhY3Rpb24odHJhbnNhY3Rpb25MaXN0ZW5lciwgZmFsc2UpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBiZWdpblRyYW5zYWN0aW9uKFNRTGl0ZVRyYW5zYWN0aW9uTGlzdGVuZXIgdHJhbnNhY3Rpb25MaXN0ZW5lciwKKyAgICAgICAgICAgIGJvb2xlYW4gZXhjbHVzaXZlKSB7CisgICAgICAgIHZlcmlmeURiSXNPcGVuKCk7CiAgICAgICAgIGxvY2tGb3JjZWQoKTsKLSAgICAgICAgaWYgKCFpc09wZW4oKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiZGF0YWJhc2Ugbm90IG9wZW4iKTsKLSAgICAgICAgfQogICAgICAgICBib29sZWFuIG9rID0gZmFsc2U7CiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAvLyBJZiB0aGlzIHRocmVhZCBhbHJlYWR5IGhhZCB0aGUgbG9jayB0aGVuIGdldCBvdXQKQEAgLTUyNCw3ICs2MjAsMTEgQEAKIAogICAgICAgICAgICAgLy8gVGhpcyB0aHJlYWQgZGlkbid0IGFscmVhZHkgaGF2ZSB0aGUgbG9jaywgc28gYmVnaW4gYSBkYXRhYmFzZQogICAgICAgICAgICAgLy8gdHJhbnNhY3Rpb24gbm93LgotICAgICAgICAgICAgZXhlY1NRTCgiQkVHSU4gRVhDTFVTSVZFOyIpOworICAgICAgICAgICAgaWYgKGV4Y2x1c2l2ZSAmJiBtQ29ubmVjdGlvblBvb2wgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGV4ZWNTUUwoIkJFR0lOIEVYQ0xVU0lWRTsiKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgZXhlY1NRTCgiQkVHSU4gSU1NRURJQVRFOyIpOworICAgICAgICAgICAgfQogICAgICAgICAgICAgbVRyYW5zYWN0aW9uTGlzdGVuZXIgPSB0cmFuc2FjdGlvbkxpc3RlbmVyOwogICAgICAgICAgICAgbVRyYW5zYWN0aW9uSXNTdWNjZXNzZnVsID0gdHJ1ZTsKICAgICAgICAgICAgIG1Jbm5lclRyYW5zYWN0aW9uSXNTdWNjZXNzZnVsID0gZmFsc2U7CkBAIC01NTEsMTIgKzY1MSw3IEBACiAgICAgICogYXJlIGNvbW1pdHRlZCBhbmQgcm9sbGVkIGJhY2suCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgZW5kVHJhbnNhY3Rpb24oKSB7Ci0gICAgICAgIGlmICghaXNPcGVuKCkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oImRhdGFiYXNlIG5vdCBvcGVuIik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCFtTG9jay5pc0hlbGRCeUN1cnJlbnRUaHJlYWQoKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigibm8gdHJhbnNhY3Rpb24gcGVuZGluZyIpOwotICAgICAgICB9CisgICAgICAgIHZlcmlmeUxvY2tPd25lcigpOwogICAgICAgICB0cnkgewogICAgICAgICAgICAgaWYgKG1Jbm5lclRyYW5zYWN0aW9uSXNTdWNjZXNzZnVsKSB7CiAgICAgICAgICAgICAgICAgbUlubmVyVHJhbnNhY3Rpb25Jc1N1Y2Nlc3NmdWwgPSBmYWxzZTsKQEAgLTU4MSw2ICs2NzYsMTggQEAKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmIChtVHJhbnNhY3Rpb25Jc1N1Y2Nlc3NmdWwpIHsKICAgICAgICAgICAgICAgICBleGVjU1FMKENPTU1JVF9TUUwpOworICAgICAgICAgICAgICAgIC8vIGlmIHdyaXRlLWFoZWFkIGxvZ2dpbmcgaXMgdXNlZCwgd2UgaGF2ZSB0byB0YWtlIGNhcmUgb2YgY2hlY2twb2ludC4KKyAgICAgICAgICAgICAgICAvLyBUT0RPOiBzaG91bGQgYXBwbGljYXRpb25zIGJlIGdpdmVuIHRoZSBmbGV4aWJpbGl0eSBvZiBjaG9vc2luZyB3aGVuIHRvCisgICAgICAgICAgICAgICAgLy8gdHJpZ2dlciBjaGVja3BvaW50PworICAgICAgICAgICAgICAgIC8vIGZvciBub3csIGRvIGNoZWNrcG9pbnQgYWZ0ZXIgZXZlcnkgQ09NTUlUIGJlY2F1c2UgdGhhdCBpcyB0aGUgZmFzdGVzdAorICAgICAgICAgICAgICAgIC8vIHdheSB0byBndWFyYW50ZWUgdGhhdCByZWFkZXJzIHdpbGwgc2VlIGxhdGVzdCBkYXRhLgorICAgICAgICAgICAgICAgIC8vIGJ1dCB0aGlzIGlzIHRoZSBzbG93ZXN0IHdheSB0byBydW4gc3FsaXRlIHdpdGggaW4gd3JpdGUtYWhlYWQgbG9nZ2luZyBtb2RlLgorICAgICAgICAgICAgICAgIGlmICh0aGlzLm1Db25uZWN0aW9uUG9vbCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGV4ZWNTUUwoIlBSQUdNQSB3YWxfY2hlY2twb2ludDsiKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKFNRTGl0ZURlYnVnLkRFQlVHX1NRTF9TVEFURU1FTlRTKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBMb2cuaShUQUcsICJQUkFHTUEgd2FsX0NoZWNrcG9pbnQgZG9uZSIpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICBleGVjU1FMKCJST0xMQkFDSzsiKTsKQEAgLTYxNCw5ICs3MjEsNyBAQAogICAgICAqIHRyYW5zYWN0aW9uIGlzIGFscmVhZHkgbWFya2VkIGFzIHN1Y2Nlc3NmdWwuCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0VHJhbnNhY3Rpb25TdWNjZXNzZnVsKCkgewotICAgICAgICBpZiAoIWlzT3BlbigpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJkYXRhYmFzZSBub3Qgb3BlbiIpOwotICAgICAgICB9CisgICAgICAgIHZlcmlmeURiSXNPcGVuKCk7CiAgICAgICAgIGlmICghbUxvY2suaXNIZWxkQnlDdXJyZW50VGhyZWFkKCkpIHsKICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIm5vIHRyYW5zYWN0aW9uIHBlbmRpbmciKTsKICAgICAgICAgfQpAQCAtNjMxLDcgKzczNiw1MCBAQAogICAgICAqIHJldHVybiB0cnVlIGlmIHRoZXJlIGlzIGEgdHJhbnNhY3Rpb24gcGVuZGluZwogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIGluVHJhbnNhY3Rpb24oKSB7Ci0gICAgICAgIHJldHVybiBtTG9jay5nZXRIb2xkQ291bnQoKSA+IDA7CisgICAgICAgIHJldHVybiBtTG9jay5nZXRIb2xkQ291bnQoKSA+IDAgfHwgbVRyYW5zYWN0aW9uVXNpbmdFeGVjU3FsOworICAgIH0KKworICAgIC8qIHBhY2thZ2UgKi8gc3luY2hyb25pemVkIHZvaWQgc2V0VHJhbnNhY3Rpb25Vc2luZ0V4ZWNTcWxGbGFnKCkgeworICAgICAgICBpZiAoTG9nLmlzTG9nZ2FibGUoVEFHLCBMb2cuREVCVUcpKSB7CisgICAgICAgICAgICBMb2cuaShUQUcsICJmb3VuZCBleGVjU1FMKCdiZWdpbiB0cmFuc2FjdGlvbicpIik7CisgICAgICAgIH0KKyAgICAgICAgbVRyYW5zYWN0aW9uVXNpbmdFeGVjU3FsID0gdHJ1ZTsKKyAgICB9CisKKyAgICAvKiBwYWNrYWdlICovIHN5bmNocm9uaXplZCB2b2lkIHJlc2V0VHJhbnNhY3Rpb25Vc2luZ0V4ZWNTcWxGbGFnKCkgeworICAgICAgICBpZiAoTG9nLmlzTG9nZ2FibGUoVEFHLCBMb2cuREVCVUcpKSB7CisgICAgICAgICAgICBpZiAobVRyYW5zYWN0aW9uVXNpbmdFeGVjU3FsKSB7CisgICAgICAgICAgICAgICAgTG9nLmkoVEFHLCAiZm91bmQgZXhlY1NRTCgnY29tbWl0IG9yIGVuZCBvciByb2xsYmFjaycpIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgbVRyYW5zYWN0aW9uVXNpbmdFeGVjU3FsID0gZmFsc2U7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBjYWxsZXIgaXMgY29uc2lkZXJlZCBwYXJ0IG9mIHRoZSBjdXJyZW50IHRyYW5zYWN0aW9uLCBpZiBhbnkuCisgICAgICogPHA+CisgICAgICogQ2FsbGVyIGlzIHBhcnQgb2YgdGhlIGN1cnJlbnQgdHJhbnNhY3Rpb24gaWYgZWl0aGVyIG9mIHRoZSBmb2xsb3dpbmcgaXMgdHJ1ZQorICAgICAqIDxvbD4KKyAgICAgKiAgIDxsaT5JZiB0cmFuc2FjdGlvbiBpcyBzdGFydGVkIGJ5IGNhbGxpbmcgYmVnaW5UcmFuc2FjdGlvbigpIG1ldGhvZHMgQU5EIGlmIHRoZSBjYWxsZXIgaXMKKyAgICAgKiAgIGluIHRoZSBzYW1lIHRocmVhZCBhcyB0aGUgdGhyZWFkIHRoYXQgc3RhcnRlZCB0aGUgdHJhbnNhY3Rpb24uCisgICAgICogICA8L2xpPgorICAgICAqICAgPGxpPklmIHRoZSB0cmFuc2FjdGlvbiBpcyBzdGFydGVkIGJ5IGNhbGxpbmcge0BsaW5rICNleGVjU1FMKFN0cmluZyl9IGxpa2UgdGhpczoKKyAgICAgKiAgIGV4ZWNTUUwoIkJFR0lOIHRyYW5zYWN0aW9uIikuIEluIHRoaXMgY2FzZSwgZXZlcnkgdGhyZWFkIGluIHRoZSBwcm9jZXNzIGlzIGNvbnNpZGVyZWQKKyAgICAgKiAgIHBhcnQgb2YgdGhlIGN1cnJlbnQgdHJhbnNhY3Rpb24uPC9saT4KKyAgICAgKiA8L29sPgorICAgICAqCisgICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBjYWxsZXIgaXMgY29uc2lkZXJlZCBwYXJ0IG9mIHRoZSBjdXJyZW50IHRyYW5zYWN0aW9uLCBpZiBhbnkuCisgICAgICovCisgICAgLyogcGFja2FnZSAqLyBzeW5jaHJvbml6ZWQgYm9vbGVhbiBhbUlJblRyYW5zYWN0aW9uKCkgeworICAgICAgICAvLyBhbHdheXMgZG8gdGhpcyB0ZXN0IG9uIHRoZSBtYWluIGRhdGFiYXNlIGNvbm5lY3Rpb24gLSBOT1Qgb24gcG9vbGVkIGRhdGFiYXNlIGNvbm5lY3Rpb24KKyAgICAgICAgLy8gc2luY2UgdHJhbnNhY3Rpb25zIGFsd2F5cyBvY2N1ciBvbiB0aGUgbWFpbiBkYXRhYmFzZSBjb25uZWN0aW9ucyBvbmx5LgorICAgICAgICBTUUxpdGVEYXRhYmFzZSBkYiA9IChpc1Bvb2xlZENvbm5lY3Rpb24oKSkgPyBtUGFyZW50Q29ubk9iaiA6IHRoaXM7CisgICAgICAgIGJvb2xlYW4gYiA9ICghZGIuaW5UcmFuc2FjdGlvbigpKSA/IGZhbHNlIDoKKyAgICAgICAgICAgICAgICBkYi5tVHJhbnNhY3Rpb25Vc2luZ0V4ZWNTcWwgfHwgZGIubUxvY2suaXNIZWxkQnlDdXJyZW50VGhyZWFkKCk7CisgICAgICAgIGlmIChMb2cuaXNMb2dnYWJsZShUQUcsIExvZy5ERUJVRykpIHsKKyAgICAgICAgICAgIExvZy5pKFRBRywgImFtSWluVHJhbnNhY3Rpb246ICIgKyBiKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gYjsKICAgICB9CiAKICAgICAvKioKQEAgLTczNSw1NCArODgzLDEyIEBACiAgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KIAotICAgIC8qKiBNYXBzIHRhYmxlIG5hbWVzIHRvIGluZm8gYWJvdXQgd2hhdCB0byB3aGljaCBfc3luY190aW1lIGNvbHVtbiB0byBzZXQKLSAgICAgKiB0byBOVUxMIG9uIGFuIHVwZGF0ZS4gVGhpcyBpcyB1c2VkIHRvIHN1cHBvcnQgc3luY2luZy4gKi8KLSAgICBwcml2YXRlIGZpbmFsIE1hcDxTdHJpbmcsIFN5bmNVcGRhdGVJbmZvPiBtU3luY1VwZGF0ZUluZm8gPQotICAgICAgICAgICAgbmV3IEhhc2hNYXA8U3RyaW5nLCBTeW5jVXBkYXRlSW5mbz4oKTsKLQotICAgIHB1YmxpYyBNYXA8U3RyaW5nLCBTdHJpbmc+IGdldFN5bmNlZFRhYmxlcygpIHsKLSAgICAgICAgc3luY2hyb25pemVkKG1TeW5jVXBkYXRlSW5mbykgewotICAgICAgICAgICAgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4gdGFibGVzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCk7Ci0gICAgICAgICAgICBmb3IgKFN0cmluZyB0YWJsZSA6IG1TeW5jVXBkYXRlSW5mby5rZXlTZXQoKSkgewotICAgICAgICAgICAgICAgIFN5bmNVcGRhdGVJbmZvIGluZm8gPSBtU3luY1VwZGF0ZUluZm8uZ2V0KHRhYmxlKTsKLSAgICAgICAgICAgICAgICBpZiAoaW5mby5kZWxldGVkVGFibGUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICB0YWJsZXMucHV0KHRhYmxlLCBpbmZvLmRlbGV0ZWRUYWJsZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIHRhYmxlczsKLSAgICAgICAgfQotICAgIH0KLQogICAgIC8qKgotICAgICAqIEludGVybmFsIGNsYXNzIHVzZWQgdG8ga2VlcCB0cmFjayB3aGF0IG5lZWRzIHRvIGJlIG1hcmtlZCBhcyBjaGFuZ2VkCi0gICAgICogd2hlbiBhbiB1cGRhdGUgb2NjdXJzLiBUaGlzIGlzIHVzZWQgZm9yIHN5bmNpbmcsIHNvIHRoZSBzeW5jIGVuZ2luZQotICAgICAqIGtub3dzIHdoYXQgZGF0YSBoYXMgYmVlbiB1cGRhdGVkIGxvY2FsbHkuCisgICAgICogQGRlcHJlY2F0ZWQgVGhpcyBtZXRob2Qgbm8gbG9uZ2VyIHNlcnZlcyBhbnkgdXNlZnVsIHB1cnBvc2UgYW5kIGhhcyBiZWVuIGRlcHJlY2F0ZWQuCiAgICAgICovCi0gICAgc3RhdGljIHByaXZhdGUgY2xhc3MgU3luY1VwZGF0ZUluZm8gewotICAgICAgICAvKioKLSAgICAgICAgICogQ3JlYXRlcyB0aGUgU3luY1VwZGF0ZUluZm8gY2xhc3MuCi0gICAgICAgICAqCi0gICAgICAgICAqIEBwYXJhbSBtYXN0ZXJUYWJsZSBUaGUgdGFibGUgdG8gc2V0IF9zeW5jX3RpbWUgdG8gTlVMTCBpbgotICAgICAgICAgKiBAcGFyYW0gZGVsZXRlZFRhYmxlIFRoZSBkZWxldGVkIHRhYmxlIHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlCi0gICAgICAgICAqICAgICAgICAgIG1hc3RlciB0YWJsZQotICAgICAgICAgKiBAcGFyYW0gZm9yZWlnbktleSBUaGUga2V5IHRoYXQgcmVmZXJzIHRvIHRoZSBwcmltYXJ5IGtleSBpbiB0YWJsZQotICAgICAgICAgKi8KLSAgICAgICAgU3luY1VwZGF0ZUluZm8oU3RyaW5nIG1hc3RlclRhYmxlLCBTdHJpbmcgZGVsZXRlZFRhYmxlLAotICAgICAgICAgICAgICAgIFN0cmluZyBmb3JlaWduS2V5KSB7Ci0gICAgICAgICAgICB0aGlzLm1hc3RlclRhYmxlID0gbWFzdGVyVGFibGU7Ci0gICAgICAgICAgICB0aGlzLmRlbGV0ZWRUYWJsZSA9IGRlbGV0ZWRUYWJsZTsKLSAgICAgICAgICAgIHRoaXMuZm9yZWlnbktleSA9IGZvcmVpZ25LZXk7Ci0gICAgICAgIH0KLQotICAgICAgICAvKiogVGhlIHRhYmxlIGNvbnRhaW5pbmcgdGhlIF9zeW5jX3RpbWUgY29sdW1uICovCi0gICAgICAgIFN0cmluZyBtYXN0ZXJUYWJsZTsKLQotICAgICAgICAvKiogVGhlIGRlbGV0ZWQgdGFibGUgdGhhdCBjb3JyZXNwb25kcyB0byB0aGUgbWFzdGVyIHRhYmxlICovCi0gICAgICAgIFN0cmluZyBkZWxldGVkVGFibGU7Ci0KLSAgICAgICAgLyoqIFRoZSBrZXkgaW4gdGhlIGxvY2FsIHRhYmxlIHRoZSByb3cgaW4gdGFibGUuIEl0IG1heSBiZSBfaWQsIGlmIHRhYmxlCi0gICAgICAgICAqIGlzIHRoZSBsb2NhbCB0YWJsZS4gKi8KLSAgICAgICAgU3RyaW5nIGZvcmVpZ25LZXk7CisgICAgQERlcHJlY2F0ZWQKKyAgICBwdWJsaWMgTWFwPFN0cmluZywgU3RyaW5nPiBnZXRTeW5jZWRUYWJsZXMoKSB7CisgICAgICAgIHJldHVybiBuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oMCk7CiAgICAgfQogCiAgICAgLyoqCkBAIC03OTEsOCArODk3LDcgQEAKICAgICBwdWJsaWMgaW50ZXJmYWNlIEN1cnNvckZhY3RvcnkgewogICAgICAgICAvKioKICAgICAgICAgICogU2VlCi0gICAgICAgICAqIHtAbGluayBTUUxpdGVDdXJzb3IjU1FMaXRlQ3Vyc29yKFNRTGl0ZURhdGFiYXNlLCBTUUxpdGVDdXJzb3JEcml2ZXIsCi0gICAgICAgICAqIFN0cmluZywgU1FMaXRlUXVlcnkpfS4KKyAgICAgICAgICoge0BsaW5rIFNRTGl0ZUN1cnNvciNTUUxpdGVDdXJzb3IoU1FMaXRlQ3Vyc29yRHJpdmVyLCBTdHJpbmcsIFNRTGl0ZVF1ZXJ5KX0uCiAgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgQ3Vyc29yIG5ld0N1cnNvcihTUUxpdGVEYXRhYmFzZSBkYiwKICAgICAgICAgICAgICAgICBTUUxpdGVDdXJzb3JEcml2ZXIgbWFzdGVyUXVlcnksIFN0cmluZyBlZGl0VGFibGUsCkBAIC04MTQsMzAgKzkxOSw4MCBAQAogICAgICAqIEB0aHJvd3MgU1FMaXRlRXhjZXB0aW9uIGlmIHRoZSBkYXRhYmFzZSBjYW5ub3QgYmUgb3BlbmVkCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBTUUxpdGVEYXRhYmFzZSBvcGVuRGF0YWJhc2UoU3RyaW5nIHBhdGgsIEN1cnNvckZhY3RvcnkgZmFjdG9yeSwgaW50IGZsYWdzKSB7Ci0gICAgICAgIFNRTGl0ZURhdGFiYXNlIHNxbGl0ZURhdGFiYXNlID0gbnVsbDsKKyAgICAgICAgcmV0dXJuIG9wZW5EYXRhYmFzZShwYXRoLCBmYWN0b3J5LCBmbGFncywgbmV3IERlZmF1bHREYXRhYmFzZUVycm9ySGFuZGxlcigpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBPcGVuIHRoZSBkYXRhYmFzZSBhY2NvcmRpbmcgdG8gdGhlIGZsYWdzIHtAbGluayAjT1BFTl9SRUFEV1JJVEV9CisgICAgICoge0BsaW5rICNPUEVOX1JFQURPTkxZfSB7QGxpbmsgI0NSRUFURV9JRl9ORUNFU1NBUll9IGFuZC9vciB7QGxpbmsgI05PX0xPQ0FMSVpFRF9DT0xMQVRPUlN9LgorICAgICAqCisgICAgICogPHA+U2V0cyB0aGUgbG9jYWxlIG9mIHRoZSBkYXRhYmFzZSB0byB0aGUgIHRoZSBzeXN0ZW0ncyBjdXJyZW50IGxvY2FsZS4KKyAgICAgKiBDYWxsIHtAbGluayAjc2V0TG9jYWxlfSBpZiB5b3Ugd291bGQgbGlrZSBzb21ldGhpbmcgZWxzZS48L3A+CisgICAgICoKKyAgICAgKiA8cD5BY2NlcHRzIGlucHV0IHBhcmFtOiBhIGNvbmNyZXRlIGluc3RhbmNlIG9mIHtAbGluayBEYXRhYmFzZUVycm9ySGFuZGxlcn0gdG8gYmUKKyAgICAgKiB1c2VkIHRvIGhhbmRsZSBjb3JydXB0aW9uIHdoZW4gc3FsaXRlIHJlcG9ydHMgZGF0YWJhc2UgY29ycnVwdGlvbi48L3A+CisgICAgICoKKyAgICAgKiBAcGFyYW0gcGF0aCB0byBkYXRhYmFzZSBmaWxlIHRvIG9wZW4gYW5kL29yIGNyZWF0ZQorICAgICAqIEBwYXJhbSBmYWN0b3J5IGFuIG9wdGlvbmFsIGZhY3RvcnkgY2xhc3MgdGhhdCBpcyBjYWxsZWQgdG8gaW5zdGFudGlhdGUgYQorICAgICAqICAgICAgICAgICAgY3Vyc29yIHdoZW4gcXVlcnkgaXMgY2FsbGVkLCBvciBudWxsIGZvciBkZWZhdWx0CisgICAgICogQHBhcmFtIGZsYWdzIHRvIGNvbnRyb2wgZGF0YWJhc2UgYWNjZXNzIG1vZGUKKyAgICAgKiBAcGFyYW0gZXJyb3JIYW5kbGVyIHRoZSB7QGxpbmsgRGF0YWJhc2VFcnJvckhhbmRsZXJ9IG9iaiB0byBiZSB1c2VkIHRvIGhhbmRsZSBjb3JydXB0aW9uCisgICAgICogd2hlbiBzcWxpdGUgcmVwb3J0cyBkYXRhYmFzZSBjb3JydXB0aW9uCisgICAgICogQHJldHVybiB0aGUgbmV3bHkgb3BlbmVkIGRhdGFiYXNlCisgICAgICogQHRocm93cyBTUUxpdGVFeGNlcHRpb24gaWYgdGhlIGRhdGFiYXNlIGNhbm5vdCBiZSBvcGVuZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFNRTGl0ZURhdGFiYXNlIG9wZW5EYXRhYmFzZShTdHJpbmcgcGF0aCwgQ3Vyc29yRmFjdG9yeSBmYWN0b3J5LCBpbnQgZmxhZ3MsCisgICAgICAgICAgICBEYXRhYmFzZUVycm9ySGFuZGxlciBlcnJvckhhbmRsZXIpIHsKKyAgICAgICAgU1FMaXRlRGF0YWJhc2Ugc3FsaXRlRGF0YWJhc2UgPSBvcGVuRGF0YWJhc2UocGF0aCwgZmFjdG9yeSwgZmxhZ3MsIGVycm9ySGFuZGxlciwKKyAgICAgICAgICAgICAgICAoc2hvcnQpIDAgLyogdGhlIG1haW4gY29ubmVjdGlvbiBoYW5kbGUgKi8pOworCisgICAgICAgIC8vIHNldCBzcWxpdGUgcGFnZXNpemUgdG8gbUJsb2NrU2l6ZQorICAgICAgICBpZiAoc0Jsb2NrU2l6ZSA9PSAwKSB7CisgICAgICAgICAgICAvLyBUT0RPOiAiL2RhdGEiIHNob3VsZCBiZSBhIHN0YXRpYyBmaW5hbCBTdHJpbmcgY29uc3RhbnQgc29tZXdoZXJlLiBpdCBpcyBoYXJkY29kZWQKKyAgICAgICAgICAgIC8vIGluIHNldmVyYWwgcGxhY2VzIHJpZ2h0IG5vdy4KKyAgICAgICAgICAgIHNCbG9ja1NpemUgPSBuZXcgU3RhdEZzKCIvZGF0YSIpLmdldEJsb2NrU2l6ZSgpOworICAgICAgICB9CisgICAgICAgIHNxbGl0ZURhdGFiYXNlLnNldFBhZ2VTaXplKHNCbG9ja1NpemUpOworICAgICAgICAvL1NUT1BTSElQIC0gdW5jb21tZW50IHRoZSBmb2xsb3dpbmcgbGluZQorICAgICAgICAvL3NxbGl0ZURhdGFiYXNlLnNldEpvdXJuYWxNb2RlKHBhdGgsICJUUlVOQ0FURSIpOworICAgICAgICAvLyBTVE9QU0hJUCByZW1vdmUgdGhlIGZvbGxvd2luZyBsaW5lcworICAgICAgICBpZiAoIXBhdGguZXF1YWxzSWdub3JlQ2FzZShNRU1PUllfREJfUEFUSCkpIHsKKyAgICAgICAgICAgIHNxbGl0ZURhdGFiYXNlLmVuYWJsZVdyaXRlQWhlYWRMb2dnaW5nKCk7CisgICAgICAgIH0KKyAgICAgICAgLy8gRU5EIFNUT1BTSElQCisKKyAgICAgICAgLy8gYWRkIHRoaXMgZGF0YWJhc2UgdG8gdGhlIGxpc3Qgb2YgZGF0YWJhc2VzIG9wZW5lZCBpbiB0aGlzIHByb2Nlc3MKKyAgICAgICAgc3luY2hyb25pemVkKG1BY3RpdmVEYXRhYmFzZXMpIHsKKyAgICAgICAgICAgIG1BY3RpdmVEYXRhYmFzZXMuYWRkKG5ldyBXZWFrUmVmZXJlbmNlPFNRTGl0ZURhdGFiYXNlPihzcWxpdGVEYXRhYmFzZSkpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBzcWxpdGVEYXRhYmFzZTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBTUUxpdGVEYXRhYmFzZSBvcGVuRGF0YWJhc2UoU3RyaW5nIHBhdGgsIEN1cnNvckZhY3RvcnkgZmFjdG9yeSwgaW50IGZsYWdzLAorICAgICAgICAgICAgRGF0YWJhc2VFcnJvckhhbmRsZXIgZXJyb3JIYW5kbGVyLCBzaG9ydCBjb25uZWN0aW9uTnVtKSB7CisgICAgICAgIFNRTGl0ZURhdGFiYXNlIGRiID0gbmV3IFNRTGl0ZURhdGFiYXNlKHBhdGgsIGZhY3RvcnksIGZsYWdzLCBlcnJvckhhbmRsZXIsIGNvbm5lY3Rpb25OdW0pOwogICAgICAgICB0cnkgeworICAgICAgICAgICAgaWYgKExvZy5pc0xvZ2dhYmxlKFRBRywgTG9nLkRFQlVHKSkgeworICAgICAgICAgICAgICAgIExvZy5pKFRBRywgIm9wZW5pbmcgdGhlIGRiIDogIiArIHBhdGgpOworICAgICAgICAgICAgfQogICAgICAgICAgICAgLy8gT3BlbiB0aGUgZGF0YWJhc2UuCi0gICAgICAgICAgICBzcWxpdGVEYXRhYmFzZSA9IG5ldyBTUUxpdGVEYXRhYmFzZShwYXRoLCBmYWN0b3J5LCBmbGFncyk7CisgICAgICAgICAgICBkYi5kYm9wZW4ocGF0aCwgZmxhZ3MpOworICAgICAgICAgICAgZGIuc2V0TG9jYWxlKExvY2FsZS5nZXREZWZhdWx0KCkpOwogICAgICAgICAgICAgaWYgKFNRTGl0ZURlYnVnLkRFQlVHX1NRTF9TVEFURU1FTlRTKSB7Ci0gICAgICAgICAgICAgICAgc3FsaXRlRGF0YWJhc2UuZW5hYmxlU3FsVHJhY2luZyhwYXRoKTsKKyAgICAgICAgICAgICAgICBkYi5lbmFibGVTcWxUcmFjaW5nKHBhdGgsIGNvbm5lY3Rpb25OdW0pOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKFNRTGl0ZURlYnVnLkRFQlVHX1NRTF9USU1FKSB7Ci0gICAgICAgICAgICAgICAgc3FsaXRlRGF0YWJhc2UuZW5hYmxlU3FsUHJvZmlsaW5nKHBhdGgpOworICAgICAgICAgICAgICAgIGRiLmVuYWJsZVNxbFByb2ZpbGluZyhwYXRoLCBjb25uZWN0aW9uTnVtKTsKICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBkYjsKICAgICAgICAgfSBjYXRjaCAoU1FMaXRlRGF0YWJhc2VDb3JydXB0RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIC8vIFRyeSB0byByZWNvdmVyIGZyb20gdGhpcywgaWYgd2UgY2FuLgotICAgICAgICAgICAgLy8gVE9ETzogc2hvdWxkIHdlIGRvIHRoaXMgZm9yIG90aGVyIG9wZW4gZmFpbHVyZXM/Ci0gICAgICAgICAgICBMb2cuZShUQUcsICJEZWxldGluZyBhbmQgcmUtY3JlYXRpbmcgY29ycnVwdCBkYXRhYmFzZSAiICsgcGF0aCwgZSk7Ci0gICAgICAgICAgICBFdmVudExvZy53cml0ZUV2ZW50KEVWRU5UX0RCX0NPUlJVUFQsIHBhdGgpOwotICAgICAgICAgICAgaWYgKCFwYXRoLmVxdWFsc0lnbm9yZUNhc2UoIjptZW1vcnkiKSkgewotICAgICAgICAgICAgICAgIC8vIGRlbGV0ZSBpcyBvbmx5IGZvciBub24tbWVtb3J5IGRhdGFiYXNlIGZpbGVzCi0gICAgICAgICAgICAgICAgbmV3IEZpbGUocGF0aCkuZGVsZXRlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzcWxpdGVEYXRhYmFzZSA9IG5ldyBTUUxpdGVEYXRhYmFzZShwYXRoLCBmYWN0b3J5LCBmbGFncyk7CisgICAgICAgICAgICBkYi5tRXJyb3JIYW5kbGVyLm9uQ29ycnVwdGlvbihkYik7CisgICAgICAgICAgICByZXR1cm4gU1FMaXRlRGF0YWJhc2Uub3BlbkRhdGFiYXNlKHBhdGgsIGZhY3RvcnksIGZsYWdzLCBlcnJvckhhbmRsZXIpOworICAgICAgICB9IGNhdGNoIChTUUxpdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgTG9nLmUoVEFHLCAiRmFpbGVkIHRvIG9wZW4gdGhlIGRhdGFiYXNlLiBjbG9zaW5nIGl0LiIsIGUpOworICAgICAgICAgICAgZGIuY2xvc2UoKTsKKyAgICAgICAgICAgIHRocm93IGU7CiAgICAgICAgIH0KLSAgICAgICAgQWN0aXZlRGF0YWJhc2VzLmdldEluc3RhbmNlKCkubUFjdGl2ZURhdGFiYXNlcy5hZGQoCi0gICAgICAgICAgICAgICAgbmV3IFdlYWtSZWZlcmVuY2U8U1FMaXRlRGF0YWJhc2U+KHNxbGl0ZURhdGFiYXNlKSk7Ci0gICAgICAgIHJldHVybiBzcWxpdGVEYXRhYmFzZTsKICAgICB9CiAKICAgICAvKioKQEAgLTg1NSw2ICsxMDEwLDI1IEBACiAgICAgfQogCiAgICAgLyoqCisgICAgICogRXF1aXZhbGVudCB0byBvcGVuRGF0YWJhc2UocGF0aCwgZmFjdG9yeSwgQ1JFQVRFX0lGX05FQ0VTU0FSWSwgZXJyb3JIYW5kbGVyKS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFNRTGl0ZURhdGFiYXNlIG9wZW5PckNyZWF0ZURhdGFiYXNlKFN0cmluZyBwYXRoLCBDdXJzb3JGYWN0b3J5IGZhY3RvcnksCisgICAgICAgICAgICBEYXRhYmFzZUVycm9ySGFuZGxlciBlcnJvckhhbmRsZXIpIHsKKyAgICAgICAgcmV0dXJuIG9wZW5EYXRhYmFzZShwYXRoLCBmYWN0b3J5LCBDUkVBVEVfSUZfTkVDRVNTQVJZLCBlcnJvckhhbmRsZXIpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBzZXRKb3VybmFsTW9kZShmaW5hbCBTdHJpbmcgZGJQYXRoLCBmaW5hbCBTdHJpbmcgbW9kZSkgeworICAgICAgICAvLyBqb3VybmFsIG1vZGUgY2FuIGJlIHNldCBvbmx5IGZvciBub24tbWVtb3J5IGRhdGFiYXNlcworICAgICAgICBpZiAoIWRiUGF0aC5lcXVhbHNJZ25vcmVDYXNlKE1FTU9SWV9EQl9QQVRIKSkgeworICAgICAgICAgICAgU3RyaW5nIHMgPSBEYXRhYmFzZVV0aWxzLnN0cmluZ0ZvclF1ZXJ5KHRoaXMsICJQUkFHTUEgam91cm5hbF9tb2RlPSIgKyBtb2RlLCBudWxsKTsKKyAgICAgICAgICAgIGlmICghcy5lcXVhbHNJZ25vcmVDYXNlKG1vZGUpKSB7CisgICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAic2V0dGluZyBqb3VybmFsX21vZGUgdG8gIiArIG1vZGUgKyAiIGZhaWxlZCBmb3IgZGI6ICIgKyBkYlBhdGggKworICAgICAgICAgICAgICAgICAgICAgICAgIiAob24gcHJhZ21hIHNldCBqb3VybmFsX21vZGUsIHNxbGl0ZSByZXR1cm5lZDoiICsgcyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKICAgICAgKiBDcmVhdGUgYSBtZW1vcnkgYmFja2VkIFNRTGl0ZSBkYXRhYmFzZS4gIEl0cyBjb250ZW50cyB3aWxsIGJlIGRlc3Ryb3llZAogICAgICAqIHdoZW4gdGhlIGRhdGFiYXNlIGlzIGNsb3NlZC4KICAgICAgKgpAQCAtODY3LDcgKzEwNDEsNyBAQAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgU1FMaXRlRGF0YWJhc2UgY3JlYXRlKEN1cnNvckZhY3RvcnkgZmFjdG9yeSkgewogICAgICAgICAvLyBUaGlzIGlzIGEgbWFnaWMgc3RyaW5nIHdpdGggc3BlY2lhbCBtZWFuaW5nIGZvciBTUUxpdGUuCi0gICAgICAgIHJldHVybiBvcGVuRGF0YWJhc2UoIjptZW1vcnk6IiwgZmFjdG9yeSwgQ1JFQVRFX0lGX05FQ0VTU0FSWSk7CisgICAgICAgIHJldHVybiBvcGVuRGF0YWJhc2UoTUVNT1JZX0RCX1BBVEgsIGZhY3RvcnksIENSRUFURV9JRl9ORUNFU1NBUlkpOwogICAgIH0KIAogICAgIC8qKgpAQCAtODc3LDE4ICsxMDUxLDMxIEBACiAgICAgICAgIGlmICghaXNPcGVuKCkpIHsKICAgICAgICAgICAgIHJldHVybjsgLy8gYWxyZWFkeSBjbG9zZWQKICAgICAgICAgfQorICAgICAgICBpZiAoTG9nLmlzTG9nZ2FibGUoVEFHLCBMb2cuREVCVUcpKSB7CisgICAgICAgICAgICBMb2cuaShUQUcsICJjbG9zaW5nIGRiOiAiICsgbVBhdGggKyAiIChjb25uZWN0aW9uICMgIiArIG1Db25uZWN0aW9uTnVtKTsKKyAgICAgICAgfQogICAgICAgICBsb2NrKCk7CiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBjbG9zZUNsb3NhYmxlKCk7CisgICAgICAgICAgICAvLyBmaW5hbGl6ZSBBTEwgc3RhdGVtZW50cyBxdWV1ZWQgdXAgc28gZmFyCisgICAgICAgICAgICBjbG9zZVBlbmRpbmdTdGF0ZW1lbnRzKCk7CisgICAgICAgICAgICByZWxlYXNlQ3VzdG9tRnVuY3Rpb25zKCk7CiAgICAgICAgICAgICAvLyBjbG9zZSB0aGlzIGRhdGFiYXNlIGluc3RhbmNlIC0gcmVnYXJkbGVzcyBvZiBpdHMgcmVmZXJlbmNlIGNvdW50IHZhbHVlCi0gICAgICAgICAgICBvbkFsbFJlZmVyZW5jZXNSZWxlYXNlZCgpOworICAgICAgICAgICAgY2xvc2VEYXRhYmFzZSgpOworICAgICAgICAgICAgaWYgKG1Db25uZWN0aW9uUG9vbCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgaWYgKExvZy5pc0xvZ2dhYmxlKFRBRywgTG9nLkRFQlVHKSkgeworICAgICAgICAgICAgICAgICAgICBhc3NlcnQgbUNvbm5lY3Rpb25Qb29sICE9IG51bGw7CisgICAgICAgICAgICAgICAgICAgIExvZy5pKFRBRywgbUNvbm5lY3Rpb25Qb29sLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBtQ29ubmVjdGlvblBvb2wuY2xvc2UoKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIHVubG9jaygpOworICAgICAgICAgICAgdW5sb2NrKCk7ICAgICAgICAgICAgCiAgICAgICAgIH0KICAgICB9CiAKICAgICBwcml2YXRlIHZvaWQgY2xvc2VDbG9zYWJsZSgpIHsKLSAgICAgICAgLyogZGVhbGxvY2F0ZSBhbGwgY29tcGlsZWQgc3FsIHN0YXRlbWVudCBvYmplY3RzIGZyb20gbUNvbXBpbGVkUXVlcmllcyBjYWNoZS4KKyAgICAgICAgLyogZGVhbGxvY2F0ZSBhbGwgY29tcGlsZWQgU1FMIHN0YXRlbWVudCBvYmplY3RzIGZyb20gbUNvbXBpbGVkUXVlcmllcyBjYWNoZS4KICAgICAgICAgICogdGhpcyBzaG91bGQgYmUgZG9uZSBiZWZvcmUgZGUtcmVmZXJlbmNpbmcgYWxsIHtAbGluayBTUUxpdGVDbG9zYWJsZX0gb2JqZWN0cwogICAgICAgICAgKiBmcm9tIHRoaXMgZGF0YWJhc2Ugb2JqZWN0IGJlY2F1c2UgY2FsbGluZwogICAgICAgICAgKiB7QGxpbmsgU1FMaXRlQ2xvc2FibGUjb25BbGxSZWZlcmVuY2VzUmVsZWFzZWRGcm9tQ29udGFpbmVyKCl9IGNvdWxkIGNhdXNlIHRoZSBkYXRhYmFzZQpAQCAtOTA4LDI5ICsxMDk1LDEwNiBAQAogICAgIH0KIAogICAgIC8qKgorICAgICAqIHBhY2thZ2UgbGV2ZWwgYWNjZXNzIGZvciB0ZXN0aW5nIHB1cnBvc2VzCisgICAgICovCisgICAgLyogcGFja2FnZSAqLyB2b2lkIGNsb3NlRGF0YWJhc2UoKSB0aHJvd3MgU1FMaXRlRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGRiY2xvc2UoKTsKKyAgICAgICAgfSBjYXRjaCAoU1FMaXRlVW5maW5hbGl6ZWRPYmplY3RzRXhjZXB0aW9uIGUpICB7CisgICAgICAgICAgICBTdHJpbmcgbXNnID0gZS5nZXRNZXNzYWdlKCk7CisgICAgICAgICAgICBTdHJpbmdbXSB0b2tlbnMgPSBtc2cuc3BsaXQoIiwiLCAyKTsKKyAgICAgICAgICAgIGludCBzdG10SWQgPSBJbnRlZ2VyLnBhcnNlSW50KHRva2Vuc1swXSk7CisgICAgICAgICAgICAvLyBnZXQgZXh0cmEgaW5mbyBhYm91dCB0aGlzIHN0YXRlbWVudCwgaWYgaXQgaXMgc3RpbGwgdG8gYmUgcmVsZWFzZWQgYnkgY2xvc2VDbG9zYWJsZSgpCisgICAgICAgICAgICBJdGVyYXRvcjxNYXAuRW50cnk8U1FMaXRlQ2xvc2FibGUsIE9iamVjdD4+IGl0ZXIgPSBtUHJvZ3JhbXMuZW50cnlTZXQoKS5pdGVyYXRvcigpOworICAgICAgICAgICAgYm9vbGVhbiBmb3VuZCA9IGZhbHNlOworICAgICAgICAgICAgd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICAgICAgTWFwLkVudHJ5PFNRTGl0ZUNsb3NhYmxlLCBPYmplY3Q+IGVudHJ5ID0gaXRlci5uZXh0KCk7CisgICAgICAgICAgICAgICAgU1FMaXRlQ2xvc2FibGUgcHJvZ3JhbSA9IGVudHJ5LmdldEtleSgpOworICAgICAgICAgICAgICAgIGlmIChwcm9ncmFtICE9IG51bGwgJiYgcHJvZ3JhbSBpbnN0YW5jZW9mIFNRTGl0ZVByb2dyYW0pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFNRTGl0ZUNvbXBpbGVkU3FsIGNvbXBpbGVkU3FsID0gKChTUUxpdGVQcm9ncmFtKXByb2dyYW0pLm1Db21waWxlZFNxbDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb21waWxlZFNxbC5uU3RhdGVtZW50ID09IHN0bXRJZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1zZyA9IGNvbXBpbGVkU3FsLnRvU3RyaW5nKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm91bmQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICghZm91bmQpIHsKKyAgICAgICAgICAgICAgICAvLyB0aGUgc3RhdGVtZW50IGlzIGFscmVhZHkgcmVsZWFzZWQgYnkgY2xvc2VDbG9zYWJsZSgpLiBpcyBpdCB3YWl0aW5nIHRvIGJlCisgICAgICAgICAgICAgICAgLy8gZmluYWxpemVkPworICAgICAgICAgICAgICAgIGlmIChtQ2xvc2VkU3RhdGVtZW50SWRzLmNvbnRhaW5zKHN0bXRJZCkpIHsKKyAgICAgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAidGhpcyBzaG91bGRuJ3QgaGFwcGVuLiBmaW5hbGl6aW5nIHRoZSBzdGF0ZW1lbnQgbm93OiAiKTsKKyAgICAgICAgICAgICAgICAgICAgY2xvc2VQZW5kaW5nU3RhdGVtZW50cygpOworICAgICAgICAgICAgICAgICAgICAvLyB0cnkgdG8gY2xvc2UgdGhlIGRhdGFiYXNlIGFnYWluCisgICAgICAgICAgICAgICAgICAgIGNsb3NlRGF0YWJhc2UoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8vIHRoZSBzdGF0ZW1lbnQgaXMgbm90IHlldCBjbG9zZWQuIG1vc3QgcHJvYmFibHkgcHJvZ3JhbW1pbmcgZXJyb3IgaW4gdGhlIGFwcC4KKyAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJkYmNsb3NlIGZhaWxlZCBkdWUgdG8gdW4tY2xvc2UoKWQgU1FMIHN0YXRlbWVudHM6ICIgKyBtc2cpOworICAgICAgICAgICAgICAgIHRocm93IGU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKICAgICAgKiBOYXRpdmUgY2FsbCB0byBjbG9zZSB0aGUgZGF0YWJhc2UuCiAgICAgICovCiAgICAgcHJpdmF0ZSBuYXRpdmUgdm9pZCBkYmNsb3NlKCk7CiAKICAgICAvKioKKyAgICAgKiBBIGNhbGxiYWNrIGludGVyZmFjZSBmb3IgYSBjdXN0b20gc3FsaXRlMyBmdW5jdGlvbi4KKyAgICAgKiBUaGlzIGNhbiBiZSB1c2VkIHRvIGNyZWF0ZSBhIGZ1bmN0aW9uIHRoYXQgY2FuIGJlIGNhbGxlZCBmcm9tCisgICAgICogc3FsaXRlMyBkYXRhYmFzZSB0cmlnZ2Vycy4KKyAgICAgKiBAaGlkZQorICAgICAqLworICAgIHB1YmxpYyBpbnRlcmZhY2UgQ3VzdG9tRnVuY3Rpb24geworICAgICAgICBwdWJsaWMgdm9pZCBjYWxsYmFjayhTdHJpbmdbXSBhcmdzKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZWdpc3RlcnMgYSBDdXN0b21GdW5jdGlvbiBjYWxsYmFjayBhcyBhIGZ1bmN0aW9uIHRoYXQgY2FuIGJlIGNhbGxlZCBmcm9tCisgICAgICogc3FsaXRlMyBkYXRhYmFzZSB0cmlnZ2Vycy4KKyAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiB0aGUgc3FsaXRlMyBmdW5jdGlvbgorICAgICAqIEBwYXJhbSBudW1BcmdzIHRoZSBudW1iZXIgb2YgYXJndW1lbnRzIGZvciB0aGUgZnVuY3Rpb24KKyAgICAgKiBAcGFyYW0gZnVuY3Rpb24gY2FsbGJhY2sgdG8gY2FsbCB3aGVuIHRoZSBmdW5jdGlvbiBpcyBleGVjdXRlZAorICAgICAqIEBoaWRlCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkQ3VzdG9tRnVuY3Rpb24oU3RyaW5nIG5hbWUsIGludCBudW1BcmdzLCBDdXN0b21GdW5jdGlvbiBmdW5jdGlvbikgeworICAgICAgICB2ZXJpZnlEYklzT3BlbigpOworICAgICAgICBzeW5jaHJvbml6ZWQgKG1DdXN0b21GdW5jdGlvbnMpIHsKKyAgICAgICAgICAgIGludCByZWYgPSBuYXRpdmVfYWRkQ3VzdG9tRnVuY3Rpb24obmFtZSwgbnVtQXJncywgZnVuY3Rpb24pOworICAgICAgICAgICAgaWYgKHJlZiAhPSAwKSB7CisgICAgICAgICAgICAgICAgLy8gc2F2ZSBhIHJlZmVyZW5jZSB0byB0aGUgZnVuY3Rpb24gZm9yIGNsZWFudXAgbGF0ZXIKKyAgICAgICAgICAgICAgICBtQ3VzdG9tRnVuY3Rpb25zLmFkZChuZXcgSW50ZWdlcihyZWYpKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFNRTGl0ZUV4Y2VwdGlvbigiZmFpbGVkIHRvIGFkZCBjdXN0b20gZnVuY3Rpb24gIiArIG5hbWUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHJlbGVhc2VDdXN0b21GdW5jdGlvbnMoKSB7CisgICAgICAgIHN5bmNocm9uaXplZCAobUN1c3RvbUZ1bmN0aW9ucykgeworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtQ3VzdG9tRnVuY3Rpb25zLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICAgICAgSW50ZWdlciBmdW5jdGlvbiA9IG1DdXN0b21GdW5jdGlvbnMuZ2V0KGkpOworICAgICAgICAgICAgICAgIG5hdGl2ZV9yZWxlYXNlQ3VzdG9tRnVuY3Rpb24oZnVuY3Rpb24uaW50VmFsdWUoKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtQ3VzdG9tRnVuY3Rpb25zLmNsZWFyKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBsaXN0IG9mIEN1c3RvbUZ1bmN0aW9uIHJlZmVyZW5jZXMgc28gd2UgY2FuIGNsZWFuIHVwIHdoZW4gdGhlIGRhdGFiYXNlIGNsb3NlcworICAgIHByaXZhdGUgZmluYWwgQXJyYXlMaXN0PEludGVnZXI+IG1DdXN0b21GdW5jdGlvbnMgPQorICAgICAgICAgICAgbmV3IEFycmF5TGlzdDxJbnRlZ2VyPigpOworCisgICAgcHJpdmF0ZSBuYXRpdmUgaW50IG5hdGl2ZV9hZGRDdXN0b21GdW5jdGlvbihTdHJpbmcgbmFtZSwgaW50IG51bUFyZ3MsIEN1c3RvbUZ1bmN0aW9uIGZ1bmN0aW9uKTsKKyAgICBwcml2YXRlIG5hdGl2ZSB2b2lkIG5hdGl2ZV9yZWxlYXNlQ3VzdG9tRnVuY3Rpb24oaW50IGZ1bmN0aW9uKTsKKworICAgIC8qKgogICAgICAqIEdldHMgdGhlIGRhdGFiYXNlIHZlcnNpb24uCiAgICAgICoKICAgICAgKiBAcmV0dXJuIHRoZSBkYXRhYmFzZSB2ZXJzaW9uCiAgICAgICovCiAgICAgcHVibGljIGludCBnZXRWZXJzaW9uKCkgewotICAgICAgICBTUUxpdGVTdGF0ZW1lbnQgcHJvZyA9IG51bGw7Ci0gICAgICAgIGxvY2soKTsKLSAgICAgICAgaWYgKCFpc09wZW4oKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiZGF0YWJhc2Ugbm90IG9wZW4iKTsKLSAgICAgICAgfQotICAgICAgICB0cnkgewotICAgICAgICAgICAgcHJvZyA9IG5ldyBTUUxpdGVTdGF0ZW1lbnQodGhpcywgIlBSQUdNQSB1c2VyX3ZlcnNpb247Iik7Ci0gICAgICAgICAgICBsb25nIHZlcnNpb24gPSBwcm9nLnNpbXBsZVF1ZXJ5Rm9yTG9uZygpOwotICAgICAgICAgICAgcmV0dXJuIChpbnQpIHZlcnNpb247Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBpZiAocHJvZyAhPSBudWxsKSBwcm9nLmNsb3NlKCk7Ci0gICAgICAgICAgICB1bmxvY2soKTsKLSAgICAgICAgfQorICAgICAgICByZXR1cm4gKChMb25nKSBEYXRhYmFzZVV0aWxzLmxvbmdGb3JRdWVyeSh0aGlzLCAiUFJBR01BIHVzZXJfdmVyc2lvbjsiLCBudWxsKSkuaW50VmFsdWUoKTsKICAgICB9CiAKICAgICAvKioKQEAgLTk0OCwyMCArMTIxMiw4IEBACiAgICAgICogQHJldHVybiB0aGUgbmV3IG1heGltdW0gZGF0YWJhc2Ugc2l6ZQogICAgICAqLwogICAgIHB1YmxpYyBsb25nIGdldE1heGltdW1TaXplKCkgewotICAgICAgICBTUUxpdGVTdGF0ZW1lbnQgcHJvZyA9IG51bGw7Ci0gICAgICAgIGxvY2soKTsKLSAgICAgICAgaWYgKCFpc09wZW4oKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiZGF0YWJhc2Ugbm90IG9wZW4iKTsKLSAgICAgICAgfQotICAgICAgICB0cnkgewotICAgICAgICAgICAgcHJvZyA9IG5ldyBTUUxpdGVTdGF0ZW1lbnQodGhpcywKLSAgICAgICAgICAgICAgICAgICAgIlBSQUdNQSBtYXhfcGFnZV9jb3VudDsiKTsKLSAgICAgICAgICAgIGxvbmcgcGFnZUNvdW50ID0gcHJvZy5zaW1wbGVRdWVyeUZvckxvbmcoKTsKLSAgICAgICAgICAgIHJldHVybiBwYWdlQ291bnQgKiBnZXRQYWdlU2l6ZSgpOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgaWYgKHByb2cgIT0gbnVsbCkgcHJvZy5jbG9zZSgpOwotICAgICAgICAgICAgdW5sb2NrKCk7Ci0gICAgICAgIH0KKyAgICAgICAgbG9uZyBwYWdlQ291bnQgPSBEYXRhYmFzZVV0aWxzLmxvbmdGb3JRdWVyeSh0aGlzLCAiUFJBR01BIG1heF9wYWdlX2NvdW50OyIsIG51bGwpOworICAgICAgICByZXR1cm4gcGFnZUNvdW50ICogZ2V0UGFnZVNpemUoKTsKICAgICB9CiAKICAgICAvKioKQEAgLTk3MiwyNiArMTIyNCwxNSBAQAogICAgICAqIEByZXR1cm4gdGhlIG5ldyBtYXhpbXVtIGRhdGFiYXNlIHNpemUKICAgICAgKi8KICAgICBwdWJsaWMgbG9uZyBzZXRNYXhpbXVtU2l6ZShsb25nIG51bUJ5dGVzKSB7Ci0gICAgICAgIFNRTGl0ZVN0YXRlbWVudCBwcm9nID0gbnVsbDsKLSAgICAgICAgbG9jaygpOwotICAgICAgICBpZiAoIWlzT3BlbigpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJkYXRhYmFzZSBub3Qgb3BlbiIpOworICAgICAgICBsb25nIHBhZ2VTaXplID0gZ2V0UGFnZVNpemUoKTsKKyAgICAgICAgbG9uZyBudW1QYWdlcyA9IG51bUJ5dGVzIC8gcGFnZVNpemU7CisgICAgICAgIC8vIElmIG51bUJ5dGVzIGlzbid0IGEgbXVsdGlwbGUgb2YgcGFnZVNpemUsIGJ1bXAgdXAgYSBwYWdlCisgICAgICAgIGlmICgobnVtQnl0ZXMgJSBwYWdlU2l6ZSkgIT0gMCkgeworICAgICAgICAgICAgbnVtUGFnZXMrKzsKICAgICAgICAgfQotICAgICAgICB0cnkgewotICAgICAgICAgICAgbG9uZyBwYWdlU2l6ZSA9IGdldFBhZ2VTaXplKCk7Ci0gICAgICAgICAgICBsb25nIG51bVBhZ2VzID0gbnVtQnl0ZXMgLyBwYWdlU2l6ZTsKLSAgICAgICAgICAgIC8vIElmIG51bUJ5dGVzIGlzbid0IGEgbXVsdGlwbGUgb2YgcGFnZVNpemUsIGJ1bXAgdXAgYSBwYWdlCi0gICAgICAgICAgICBpZiAoKG51bUJ5dGVzICUgcGFnZVNpemUpICE9IDApIHsKLSAgICAgICAgICAgICAgICBudW1QYWdlcysrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcHJvZyA9IG5ldyBTUUxpdGVTdGF0ZW1lbnQodGhpcywKLSAgICAgICAgICAgICAgICAgICAgIlBSQUdNQSBtYXhfcGFnZV9jb3VudCA9ICIgKyBudW1QYWdlcyk7Ci0gICAgICAgICAgICBsb25nIG5ld1BhZ2VDb3VudCA9IHByb2cuc2ltcGxlUXVlcnlGb3JMb25nKCk7Ci0gICAgICAgICAgICByZXR1cm4gbmV3UGFnZUNvdW50ICogcGFnZVNpemU7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBpZiAocHJvZyAhPSBudWxsKSBwcm9nLmNsb3NlKCk7Ci0gICAgICAgICAgICB1bmxvY2soKTsKLSAgICAgICAgfQorICAgICAgICBsb25nIG5ld1BhZ2VDb3VudCA9IERhdGFiYXNlVXRpbHMubG9uZ0ZvclF1ZXJ5KHRoaXMsICJQUkFHTUEgbWF4X3BhZ2VfY291bnQgPSAiICsgbnVtUGFnZXMsCisgICAgICAgICAgICAgICAgbnVsbCk7CisgICAgICAgIHJldHVybiBuZXdQYWdlQ291bnQgKiBwYWdlU2l6ZTsKICAgICB9CiAKICAgICAvKioKQEAgLTEwMDAsMjAgKzEyNDEsNyBAQAogICAgICAqIEByZXR1cm4gdGhlIGRhdGFiYXNlIHBhZ2Ugc2l6ZSwgaW4gYnl0ZXMKICAgICAgKi8KICAgICBwdWJsaWMgbG9uZyBnZXRQYWdlU2l6ZSgpIHsKLSAgICAgICAgU1FMaXRlU3RhdGVtZW50IHByb2cgPSBudWxsOwotICAgICAgICBsb2NrKCk7Ci0gICAgICAgIGlmICghaXNPcGVuKCkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oImRhdGFiYXNlIG5vdCBvcGVuIik7Ci0gICAgICAgIH0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHByb2cgPSBuZXcgU1FMaXRlU3RhdGVtZW50KHRoaXMsCi0gICAgICAgICAgICAgICAgICAgICJQUkFHTUEgcGFnZV9zaXplOyIpOwotICAgICAgICAgICAgbG9uZyBzaXplID0gcHJvZy5zaW1wbGVRdWVyeUZvckxvbmcoKTsKLSAgICAgICAgICAgIHJldHVybiBzaXplOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgaWYgKHByb2cgIT0gbnVsbCkgcHJvZy5jbG9zZSgpOwotICAgICAgICAgICAgdW5sb2NrKCk7Ci0gICAgICAgIH0KKyAgICAgICAgcmV0dXJuIERhdGFiYXNlVXRpbHMubG9uZ0ZvclF1ZXJ5KHRoaXMsICJQUkFHTUEgcGFnZV9zaXplOyIsIG51bGwpOwogICAgIH0KIAogICAgIC8qKgpAQCAtMTAzNCw5ICsxMjYyLDEwIEBACiAgICAgICogQHBhcmFtIHRhYmxlIHRoZSB0YWJsZSB0byBtYXJrIGFzIHN5bmNhYmxlCiAgICAgICogQHBhcmFtIGRlbGV0ZWRUYWJsZSBUaGUgZGVsZXRlZCB0YWJsZSB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZQogICAgICAqICAgICAgICAgIHN5bmNhYmxlIHRhYmxlCisgICAgICogQGRlcHJlY2F0ZWQgVGhpcyBtZXRob2Qgbm8gbG9uZ2VyIHNlcnZlcyBhbnkgdXNlZnVsIHB1cnBvc2UgYW5kIGhhcyBiZWVuIGRlcHJlY2F0ZWQuCiAgICAgICovCisgICAgQERlcHJlY2F0ZWQKICAgICBwdWJsaWMgdm9pZCBtYXJrVGFibGVTeW5jYWJsZShTdHJpbmcgdGFibGUsIFN0cmluZyBkZWxldGVkVGFibGUpIHsKLSAgICAgICAgbWFya1RhYmxlU3luY2FibGUodGFibGUsICJfaWQiLCB0YWJsZSwgZGVsZXRlZFRhYmxlKTsKICAgICB9CiAKICAgICAvKioKQEAgLTEwNDksNjAgKzEyNzgsMTAgQEAKICAgICAgKiBAcGFyYW0gZm9yZWlnbktleSB0aGlzIGlzIHRoZSBjb2x1bW4gaW4gdGFibGUgd2hvc2UgdmFsdWUgaXMgYW4gX2lkIGluCiAgICAgICogICAgICAgICAgdXBkYXRlVGFibGUKICAgICAgKiBAcGFyYW0gdXBkYXRlVGFibGUgdGhpcyBpcyB0aGUgdGFibGUgdGhhdCB3aWxsIGhhdmUgaXRzIF9zeW5jX2RpcnR5CisgICAgICogQGRlcHJlY2F0ZWQgVGhpcyBtZXRob2Qgbm8gbG9uZ2VyIHNlcnZlcyBhbnkgdXNlZnVsIHB1cnBvc2UgYW5kIGhhcyBiZWVuIGRlcHJlY2F0ZWQuCiAgICAgICovCi0gICAgcHVibGljIHZvaWQgbWFya1RhYmxlU3luY2FibGUoU3RyaW5nIHRhYmxlLCBTdHJpbmcgZm9yZWlnbktleSwKLSAgICAgICAgICAgIFN0cmluZyB1cGRhdGVUYWJsZSkgewotICAgICAgICBtYXJrVGFibGVTeW5jYWJsZSh0YWJsZSwgZm9yZWlnbktleSwgdXBkYXRlVGFibGUsIG51bGwpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIE1hcmsgdGhpcyB0YWJsZSBhcyBzeW5jYWJsZSwgd2l0aCB0aGUgX3N5bmNfZGlydHkgcmVzaWRpbmcgaW4gYW5vdGhlcgotICAgICAqIHRhYmxlLiBXaGVuIGFuIHVwZGF0ZSBvY2N1cnMgaW4gdGhpcyB0YWJsZSB0aGUgX3N5bmNfZGlydHkgZmllbGQgb2YgdGhlCi0gICAgICogcm93IGluIHVwZGF0ZVRhYmxlIHdpdGggdGhlIF9pZCBpbiBmb3JlaWduS2V5IHdpbGwgYmUgc2V0IHRvCi0gICAgICogZW5zdXJlIHByb3BlciBzeW5jaW5nIG9wZXJhdGlvbi4KLSAgICAgKgotICAgICAqIEBwYXJhbSB0YWJsZSBhbiB1cGRhdGUgb24gdGhpcyB0YWJsZSB3aWxsIHRyaWdnZXIgYSBzeW5jIHRpbWUgcmVtb3ZhbAotICAgICAqIEBwYXJhbSBmb3JlaWduS2V5IHRoaXMgaXMgdGhlIGNvbHVtbiBpbiB0YWJsZSB3aG9zZSB2YWx1ZSBpcyBhbiBfaWQgaW4KLSAgICAgKiAgICAgICAgICB1cGRhdGVUYWJsZQotICAgICAqIEBwYXJhbSB1cGRhdGVUYWJsZSB0aGlzIGlzIHRoZSB0YWJsZSB0aGF0IHdpbGwgaGF2ZSBpdHMgX3N5bmNfZGlydHkKLSAgICAgKiBAcGFyYW0gZGVsZXRlZFRhYmxlIFRoZSBkZWxldGVkIHRhYmxlIHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlCi0gICAgICogICAgICAgICAgdXBkYXRlVGFibGUKLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgbWFya1RhYmxlU3luY2FibGUoU3RyaW5nIHRhYmxlLCBTdHJpbmcgZm9yZWlnbktleSwKLSAgICAgICAgICAgIFN0cmluZyB1cGRhdGVUYWJsZSwgU3RyaW5nIGRlbGV0ZWRUYWJsZSkgewotICAgICAgICBsb2NrKCk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBuYXRpdmVfZXhlY1NRTCgiU0VMRUNUIF9zeW5jX2RpcnR5IEZST00gIiArIHVwZGF0ZVRhYmxlCi0gICAgICAgICAgICAgICAgICAgICsgIiBMSU1JVCAwIik7Ci0gICAgICAgICAgICBuYXRpdmVfZXhlY1NRTCgiU0VMRUNUICIgKyBmb3JlaWduS2V5ICsgIiBGUk9NICIgKyB0YWJsZQotICAgICAgICAgICAgICAgICAgICArICIgTElNSVQgMCIpOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgdW5sb2NrKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBTeW5jVXBkYXRlSW5mbyBpbmZvID0gbmV3IFN5bmNVcGRhdGVJbmZvKHVwZGF0ZVRhYmxlLCBkZWxldGVkVGFibGUsCi0gICAgICAgICAgICAgICAgZm9yZWlnbktleSk7Ci0gICAgICAgIHN5bmNocm9uaXplZCAobVN5bmNVcGRhdGVJbmZvKSB7Ci0gICAgICAgICAgICBtU3luY1VwZGF0ZUluZm8ucHV0KHRhYmxlLCBpbmZvKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIENhbGwgZm9yIGVhY2ggcm93IHRoYXQgaXMgdXBkYXRlZCBpbiBhIGN1cnNvci4KLSAgICAgKgotICAgICAqIEBwYXJhbSB0YWJsZSB0aGUgdGFibGUgdGhlIHJvdyBpcyBpbgotICAgICAqIEBwYXJhbSByb3dJZCB0aGUgcm93IElEIG9mIHRoZSB1cGRhdGVkIHJvdwotICAgICAqLwotICAgIC8qIHBhY2thZ2UgKi8gdm9pZCByb3dVcGRhdGVkKFN0cmluZyB0YWJsZSwgbG9uZyByb3dJZCkgewotICAgICAgICBTeW5jVXBkYXRlSW5mbyBpbmZvOwotICAgICAgICBzeW5jaHJvbml6ZWQgKG1TeW5jVXBkYXRlSW5mbykgewotICAgICAgICAgICAgaW5mbyA9IG1TeW5jVXBkYXRlSW5mby5nZXQodGFibGUpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChpbmZvICE9IG51bGwpIHsKLSAgICAgICAgICAgIGV4ZWNTUUwoIlVQREFURSAiICsgaW5mby5tYXN0ZXJUYWJsZQotICAgICAgICAgICAgICAgICAgICArICIgU0VUIF9zeW5jX2RpcnR5PTEgV0hFUkUgX2lkPShTRUxFQ1QgIiArIGluZm8uZm9yZWlnbktleQotICAgICAgICAgICAgICAgICAgICArICIgRlJPTSAiICsgdGFibGUgKyAiIFdIRVJFIF9pZD0iICsgcm93SWQgKyAiKSIpOwotICAgICAgICB9CisgICAgQERlcHJlY2F0ZWQKKyAgICBwdWJsaWMgdm9pZCBtYXJrVGFibGVTeW5jYWJsZShTdHJpbmcgdGFibGUsIFN0cmluZyBmb3JlaWduS2V5LCBTdHJpbmcgdXBkYXRlVGFibGUpIHsKICAgICB9CiAKICAgICAvKioKQEAgLTExMzQsNiArMTMxMyw4IEBACiAgICAgICogc3RhdGVtZW50IGFuZCBmaWxsIGluIHRob3NlIHZhbHVlcyB3aXRoIHtAbGluayBTUUxpdGVQcm9ncmFtI2JpbmRTdHJpbmd9CiAgICAgICogYW5kIHtAbGluayBTUUxpdGVQcm9ncmFtI2JpbmRMb25nfSBlYWNoIHRpbWUgeW91IHdhbnQgdG8gcnVuIHRoZQogICAgICAqIHN0YXRlbWVudC4gU3RhdGVtZW50cyBtYXkgbm90IHJldHVybiByZXN1bHQgc2V0cyBsYXJnZXIgdGhhbiAxeDEuCisgICAgICo8cD4KKyAgICAgKiBObyB0d28gdGhyZWFkcyBzaG91bGQgYmUgdXNpbmcgdGhlIHNhbWUge0BsaW5rIFNRTGl0ZVN0YXRlbWVudH0gYXQgdGhlIHNhbWUgdGltZS4KICAgICAgKgogICAgICAqIEBwYXJhbSBzcWwgVGhlIHJhdyBTUUwgc3RhdGVtZW50LCBtYXkgY29udGFpbiA/IGZvciB1bmtub3duIHZhbHVlcyB0byBiZQogICAgICAqICAgICAgICAgICAgYm91bmQgbGF0ZXIuCkBAIC0xMTQxLDE1ICsxMzIyLDggQEAKICAgICAgKiB7QGxpbmsgU1FMaXRlU3RhdGVtZW50fXMgYXJlIG5vdCBzeW5jaHJvbml6ZWQsIHNlZSB0aGUgZG9jdW1lbnRhdGlvbiBmb3IgbW9yZSBkZXRhaWxzLgogICAgICAqLwogICAgIHB1YmxpYyBTUUxpdGVTdGF0ZW1lbnQgY29tcGlsZVN0YXRlbWVudChTdHJpbmcgc3FsKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKLSAgICAgICAgbG9jaygpOwotICAgICAgICBpZiAoIWlzT3BlbigpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJkYXRhYmFzZSBub3Qgb3BlbiIpOwotICAgICAgICB9Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IFNRTGl0ZVN0YXRlbWVudCh0aGlzLCBzcWwpOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgdW5sb2NrKCk7Ci0gICAgICAgIH0KKyAgICAgICAgdmVyaWZ5RGJJc09wZW4oKTsKKyAgICAgICAgcmV0dXJuIG5ldyBTUUxpdGVTdGF0ZW1lbnQodGhpcywgc3FsLCBudWxsKTsKICAgICB9CiAKICAgICAvKioKQEAgLTEyMjYsOSArMTQwMCw3IEBACiAgICAgICAgICAgICBib29sZWFuIGRpc3RpbmN0LCBTdHJpbmcgdGFibGUsIFN0cmluZ1tdIGNvbHVtbnMsCiAgICAgICAgICAgICBTdHJpbmcgc2VsZWN0aW9uLCBTdHJpbmdbXSBzZWxlY3Rpb25BcmdzLCBTdHJpbmcgZ3JvdXBCeSwKICAgICAgICAgICAgIFN0cmluZyBoYXZpbmcsIFN0cmluZyBvcmRlckJ5LCBTdHJpbmcgbGltaXQpIHsKLSAgICAgICAgaWYgKCFpc09wZW4oKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiZGF0YWJhc2Ugbm90IG9wZW4iKTsKLSAgICAgICAgfQorICAgICAgICB2ZXJpZnlEYklzT3BlbigpOwogICAgICAgICBTdHJpbmcgc3FsID0gU1FMaXRlUXVlcnlCdWlsZGVyLmJ1aWxkUXVlcnlTdHJpbmcoCiAgICAgICAgICAgICAgICAgZGlzdGluY3QsIHRhYmxlLCBjb2x1bW5zLCBzZWxlY3Rpb24sIGdyb3VwQnksIGhhdmluZywgb3JkZXJCeSwgbGltaXQpOwogCkBAIC0xMzM5LDkgKzE1MTEsNyBAQAogICAgIHB1YmxpYyBDdXJzb3IgcmF3UXVlcnlXaXRoRmFjdG9yeSgKICAgICAgICAgICAgIEN1cnNvckZhY3RvcnkgY3Vyc29yRmFjdG9yeSwgU3RyaW5nIHNxbCwgU3RyaW5nW10gc2VsZWN0aW9uQXJncywKICAgICAgICAgICAgIFN0cmluZyBlZGl0VGFibGUpIHsKLSAgICAgICAgaWYgKCFpc09wZW4oKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiZGF0YWJhc2Ugbm90IG9wZW4iKTsKLSAgICAgICAgfQorICAgICAgICB2ZXJpZnlEYklzT3BlbigpOwogICAgICAgICBCbG9ja0d1YXJkLmdldFRocmVhZFBvbGljeSgpLm9uUmVhZEZyb21EaXNrKCk7CiAgICAgICAgIGxvbmcgdGltZVN0YXJ0ID0gMDsKIApAQCAtMTM0OSw3ICsxNTE5LDggQEAKICAgICAgICAgICAgIHRpbWVTdGFydCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwogICAgICAgICB9CiAKLSAgICAgICAgU1FMaXRlQ3Vyc29yRHJpdmVyIGRyaXZlciA9IG5ldyBTUUxpdGVEaXJlY3RDdXJzb3JEcml2ZXIodGhpcywgc3FsLCBlZGl0VGFibGUpOworICAgICAgICBTUUxpdGVEYXRhYmFzZSBkYiA9IGdldERiQ29ubmVjdGlvbihzcWwpOworICAgICAgICBTUUxpdGVDdXJzb3JEcml2ZXIgZHJpdmVyID0gbmV3IFNRTGl0ZURpcmVjdEN1cnNvckRyaXZlcihkYiwgc3FsLCBlZGl0VGFibGUpOwogCiAgICAgICAgIEN1cnNvciBjdXJzb3IgPSBudWxsOwogICAgICAgICB0cnkgewpAQCAtMTM3NSw2ICsxNTQ2LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICI8bnVsbD4iKSAgKyAiLCBjb3VudCBpcyAiICsgY291bnQpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJlbGVhc2VEYkNvbm5lY3Rpb24oZGIpOwogICAgICAgICB9CiAgICAgICAgIHJldHVybiBjdXJzb3I7CiAgICAgfQpAQCAtMTUwMSw4NCArMTY3Myw0MSBAQAogICAgICAqLwogICAgIHB1YmxpYyBsb25nIGluc2VydFdpdGhPbkNvbmZsaWN0KFN0cmluZyB0YWJsZSwgU3RyaW5nIG51bGxDb2x1bW5IYWNrLAogICAgICAgICAgICAgQ29udGVudFZhbHVlcyBpbml0aWFsVmFsdWVzLCBpbnQgY29uZmxpY3RBbGdvcml0aG0pIHsKLSAgICAgICAgQmxvY2tHdWFyZC5nZXRUaHJlYWRQb2xpY3koKS5vbldyaXRlVG9EaXNrKCk7Ci0gICAgICAgIGlmICghaXNPcGVuKCkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oImRhdGFiYXNlIG5vdCBvcGVuIik7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBNZWFzdXJlbWVudHMgc2hvdyBtb3N0IHNxbCBsZW5ndGhzIDw9IDE1MgotICAgICAgICBTdHJpbmdCdWlsZGVyIHNxbCA9IG5ldyBTdHJpbmdCdWlsZGVyKDE1Mik7CisgICAgICAgIFN0cmluZ0J1aWxkZXIgc3FsID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKICAgICAgICAgc3FsLmFwcGVuZCgiSU5TRVJUIik7CiAgICAgICAgIHNxbC5hcHBlbmQoQ09ORkxJQ1RfVkFMVUVTW2NvbmZsaWN0QWxnb3JpdGhtXSk7CiAgICAgICAgIHNxbC5hcHBlbmQoIiBJTlRPICIpOwogICAgICAgICBzcWwuYXBwZW5kKHRhYmxlKTsKLSAgICAgICAgLy8gTWVhc3VyZW1lbnRzIHNob3cgbW9zdCB2YWx1ZXMgbGVuZ3RocyA8IDQwCi0gICAgICAgIFN0cmluZ0J1aWxkZXIgdmFsdWVzID0gbmV3IFN0cmluZ0J1aWxkZXIoNDApOworICAgICAgICBzcWwuYXBwZW5kKCcoJyk7CiAKLSAgICAgICAgU2V0PE1hcC5FbnRyeTxTdHJpbmcsIE9iamVjdD4+IGVudHJ5U2V0ID0gbnVsbDsKLSAgICAgICAgaWYgKGluaXRpYWxWYWx1ZXMgIT0gbnVsbCAmJiBpbml0aWFsVmFsdWVzLnNpemUoKSA+IDApIHsKLSAgICAgICAgICAgIGVudHJ5U2V0ID0gaW5pdGlhbFZhbHVlcy52YWx1ZVNldCgpOwotICAgICAgICAgICAgSXRlcmF0b3I8TWFwLkVudHJ5PFN0cmluZywgT2JqZWN0Pj4gZW50cmllc0l0ZXIgPSBlbnRyeVNldC5pdGVyYXRvcigpOwotICAgICAgICAgICAgc3FsLmFwcGVuZCgnKCcpOwotCi0gICAgICAgICAgICBib29sZWFuIG5lZWRTZXBhcmF0b3IgPSBmYWxzZTsKLSAgICAgICAgICAgIHdoaWxlIChlbnRyaWVzSXRlci5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgICAgICBpZiAobmVlZFNlcGFyYXRvcikgewotICAgICAgICAgICAgICAgICAgICBzcWwuYXBwZW5kKCIsICIpOwotICAgICAgICAgICAgICAgICAgICB2YWx1ZXMuYXBwZW5kKCIsICIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBuZWVkU2VwYXJhdG9yID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBNYXAuRW50cnk8U3RyaW5nLCBPYmplY3Q+IGVudHJ5ID0gZW50cmllc0l0ZXIubmV4dCgpOwotICAgICAgICAgICAgICAgIHNxbC5hcHBlbmQoZW50cnkuZ2V0S2V5KCkpOwotICAgICAgICAgICAgICAgIHZhbHVlcy5hcHBlbmQoJz8nKTsKKyAgICAgICAgT2JqZWN0W10gYmluZEFyZ3MgPSBudWxsOworICAgICAgICBpbnQgc2l6ZSA9IChpbml0aWFsVmFsdWVzICE9IG51bGwgJiYgaW5pdGlhbFZhbHVlcy5zaXplKCkgPiAwKSA/IGluaXRpYWxWYWx1ZXMuc2l6ZSgpIDogMDsKKyAgICAgICAgaWYgKHNpemUgPiAwKSB7CisgICAgICAgICAgICBiaW5kQXJncyA9IG5ldyBPYmplY3Rbc2l6ZV07CisgICAgICAgICAgICBpbnQgaSA9IDA7CisgICAgICAgICAgICBmb3IgKFN0cmluZyBjb2xOYW1lIDogaW5pdGlhbFZhbHVlcy5rZXlTZXQoKSkgeworICAgICAgICAgICAgICAgIHNxbC5hcHBlbmQoKGkgPiAwKSA/ICIsIiA6ICIiKTsKKyAgICAgICAgICAgICAgICBzcWwuYXBwZW5kKGNvbE5hbWUpOworICAgICAgICAgICAgICAgIGJpbmRBcmdzW2krK10gPSBpbml0aWFsVmFsdWVzLmdldChjb2xOYW1lKTsKICAgICAgICAgICAgIH0KLQogICAgICAgICAgICAgc3FsLmFwcGVuZCgnKScpOworICAgICAgICAgICAgc3FsLmFwcGVuZCgiIFZBTFVFUyAoIik7CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CisgICAgICAgICAgICAgICAgc3FsLmFwcGVuZCgoaSA+IDApID8gIiw/IiA6ICI/Iik7CisgICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBzcWwuYXBwZW5kKCIoIiArIG51bGxDb2x1bW5IYWNrICsgIikgIik7Ci0gICAgICAgICAgICB2YWx1ZXMuYXBwZW5kKCJOVUxMIik7CisgICAgICAgICAgICBzcWwuYXBwZW5kKG51bGxDb2x1bW5IYWNrICsgIikgVkFMVUVTIChOVUxMIik7CiAgICAgICAgIH0KKyAgICAgICAgc3FsLmFwcGVuZCgnKScpOwogCi0gICAgICAgIHNxbC5hcHBlbmQoIiBWQUxVRVMoIik7Ci0gICAgICAgIHNxbC5hcHBlbmQodmFsdWVzKTsKLSAgICAgICAgc3FsLmFwcGVuZCgiKTsiKTsKLQotICAgICAgICBsb2NrKCk7Ci0gICAgICAgIFNRTGl0ZVN0YXRlbWVudCBzdGF0ZW1lbnQgPSBudWxsOworICAgICAgICBTUUxpdGVTdGF0ZW1lbnQgc3RhdGVtZW50ID0gbmV3IFNRTGl0ZVN0YXRlbWVudCh0aGlzLCBzcWwudG9TdHJpbmcoKSwgYmluZEFyZ3MpOwogICAgICAgICB0cnkgewotICAgICAgICAgICAgc3RhdGVtZW50ID0gY29tcGlsZVN0YXRlbWVudChzcWwudG9TdHJpbmcoKSk7Ci0KLSAgICAgICAgICAgIC8vIEJpbmQgdGhlIHZhbHVlcwotICAgICAgICAgICAgaWYgKGVudHJ5U2V0ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBpbnQgc2l6ZSA9IGVudHJ5U2V0LnNpemUoKTsKLSAgICAgICAgICAgICAgICBJdGVyYXRvcjxNYXAuRW50cnk8U3RyaW5nLCBPYmplY3Q+PiBlbnRyaWVzSXRlciA9IGVudHJ5U2V0Lml0ZXJhdG9yKCk7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgTWFwLkVudHJ5PFN0cmluZywgT2JqZWN0PiBlbnRyeSA9IGVudHJpZXNJdGVyLm5leHQoKTsKLSAgICAgICAgICAgICAgICAgICAgRGF0YWJhc2VVdGlscy5iaW5kT2JqZWN0VG9Qcm9ncmFtKHN0YXRlbWVudCwgaSArIDEsIGVudHJ5LmdldFZhbHVlKCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gUnVuIHRoZSBwcm9ncmFtIGFuZCB0aGVuIGNsZWFudXAKLSAgICAgICAgICAgIHN0YXRlbWVudC5leGVjdXRlKCk7Ci0KLSAgICAgICAgICAgIGxvbmcgaW5zZXJ0ZWRSb3dJZCA9IGxhc3RJbnNlcnRSb3coKTsKLSAgICAgICAgICAgIGlmIChpbnNlcnRlZFJvd0lkID09IC0xKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAiRXJyb3IgaW5zZXJ0aW5nICIgKyBpbml0aWFsVmFsdWVzICsgIiB1c2luZyAiICsgc3FsKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaWYgKENvbmZpZy5MT0dEICYmIExvZy5pc0xvZ2dhYmxlKFRBRywgTG9nLlZFUkJPU0UpKSB7Ci0gICAgICAgICAgICAgICAgICAgIExvZy52KFRBRywgIkluc2VydGluZyByb3cgIiArIGluc2VydGVkUm93SWQgKyAiIGZyb20gIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgaW5pdGlhbFZhbHVlcyArICIgdXNpbmcgIiArIHNxbCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGluc2VydGVkUm93SWQ7CisgICAgICAgICAgICByZXR1cm4gc3RhdGVtZW50LmV4ZWN1dGVJbnNlcnQoKTsKICAgICAgICAgfSBjYXRjaCAoU1FMaXRlRGF0YWJhc2VDb3JydXB0RXhjZXB0aW9uIGUpIHsKICAgICAgICAgICAgIG9uQ29ycnVwdGlvbigpOwogICAgICAgICAgICAgdGhyb3cgZTsKICAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIGlmIChzdGF0ZW1lbnQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHN0YXRlbWVudC5jbG9zZSgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdW5sb2NrKCk7CisgICAgICAgICAgICBzdGF0ZW1lbnQuY2xvc2UoKTsKICAgICAgICAgfQogICAgIH0KIApAQCAtMTU5MywzMiArMTcyMiwxNSBAQAogICAgICAqICAgICAgICAgd2hlcmVDbGF1c2UuCiAgICAgICovCiAgICAgcHVibGljIGludCBkZWxldGUoU3RyaW5nIHRhYmxlLCBTdHJpbmcgd2hlcmVDbGF1c2UsIFN0cmluZ1tdIHdoZXJlQXJncykgewotICAgICAgICBCbG9ja0d1YXJkLmdldFRocmVhZFBvbGljeSgpLm9uV3JpdGVUb0Rpc2soKTsKLSAgICAgICAgbG9jaygpOwotICAgICAgICBpZiAoIWlzT3BlbigpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJkYXRhYmFzZSBub3Qgb3BlbiIpOwotICAgICAgICB9Ci0gICAgICAgIFNRTGl0ZVN0YXRlbWVudCBzdGF0ZW1lbnQgPSBudWxsOworICAgICAgICBTUUxpdGVTdGF0ZW1lbnQgc3RhdGVtZW50ID0gIG5ldyBTUUxpdGVTdGF0ZW1lbnQodGhpcywgIkRFTEVURSBGUk9NICIgKyB0YWJsZSArCisgICAgICAgICAgICAgICAgKCFUZXh0VXRpbHMuaXNFbXB0eSh3aGVyZUNsYXVzZSkgPyAiIFdIRVJFICIgKyB3aGVyZUNsYXVzZSA6ICIiKSwgd2hlcmVBcmdzKTsKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHN0YXRlbWVudCA9IGNvbXBpbGVTdGF0ZW1lbnQoIkRFTEVURSBGUk9NICIgKyB0YWJsZQotICAgICAgICAgICAgICAgICAgICArICghVGV4dFV0aWxzLmlzRW1wdHkod2hlcmVDbGF1c2UpCi0gICAgICAgICAgICAgICAgICAgID8gIiBXSEVSRSAiICsgd2hlcmVDbGF1c2UgOiAiIikpOwotICAgICAgICAgICAgaWYgKHdoZXJlQXJncyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgaW50IG51bUFyZ3MgPSB3aGVyZUFyZ3MubGVuZ3RoOwotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtQXJnczsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIERhdGFiYXNlVXRpbHMuYmluZE9iamVjdFRvUHJvZ3JhbShzdGF0ZW1lbnQsIGkgKyAxLCB3aGVyZUFyZ3NbaV0pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHN0YXRlbWVudC5leGVjdXRlKCk7Ci0gICAgICAgICAgICByZXR1cm4gbGFzdENoYW5nZUNvdW50KCk7CisgICAgICAgICAgICByZXR1cm4gc3RhdGVtZW50LmV4ZWN1dGVVcGRhdGVEZWxldGUoKTsKICAgICAgICAgfSBjYXRjaCAoU1FMaXRlRGF0YWJhc2VDb3JydXB0RXhjZXB0aW9uIGUpIHsKICAgICAgICAgICAgIG9uQ29ycnVwdGlvbigpOwogICAgICAgICAgICAgdGhyb3cgZTsKICAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIGlmIChzdGF0ZW1lbnQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHN0YXRlbWVudC5jbG9zZSgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdW5sb2NrKCk7CisgICAgICAgICAgICBzdGF0ZW1lbnQuY2xvc2UoKTsKICAgICAgICAgfQogICAgIH0KIApAQCAtMTY0OSw4ICsxNzYxLDggQEAKICAgICAgKi8KICAgICBwdWJsaWMgaW50IHVwZGF0ZVdpdGhPbkNvbmZsaWN0KFN0cmluZyB0YWJsZSwgQ29udGVudFZhbHVlcyB2YWx1ZXMsCiAgICAgICAgICAgICBTdHJpbmcgd2hlcmVDbGF1c2UsIFN0cmluZ1tdIHdoZXJlQXJncywgaW50IGNvbmZsaWN0QWxnb3JpdGhtKSB7Ci0gICAgICAgIEJsb2NrR3VhcmQuZ2V0VGhyZWFkUG9saWN5KCkub25Xcml0ZVRvRGlzaygpOwotICAgICAgICBpZiAodmFsdWVzID09IG51bGwgfHwgdmFsdWVzLnNpemUoKSA9PSAwKSB7CisgICAgICAgIGludCBzZXRWYWx1ZXNTaXplID0gdmFsdWVzLnNpemUoKTsKKyAgICAgICAgaWYgKHZhbHVlcyA9PSBudWxsIHx8IHNldFZhbHVlc1NpemUgPT0gMCkgewogICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiRW1wdHkgdmFsdWVzIik7CiAgICAgICAgIH0KIApAQCAtMTY2MCw5OCArMTc3Miw2OCBAQAogICAgICAgICBzcWwuYXBwZW5kKHRhYmxlKTsKICAgICAgICAgc3FsLmFwcGVuZCgiIFNFVCAiKTsKIAotICAgICAgICBTZXQ8TWFwLkVudHJ5PFN0cmluZywgT2JqZWN0Pj4gZW50cnlTZXQgPSB2YWx1ZXMudmFsdWVTZXQoKTsKLSAgICAgICAgSXRlcmF0b3I8TWFwLkVudHJ5PFN0cmluZywgT2JqZWN0Pj4gZW50cmllc0l0ZXIgPSBlbnRyeVNldC5pdGVyYXRvcigpOwotCi0gICAgICAgIHdoaWxlIChlbnRyaWVzSXRlci5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgIE1hcC5FbnRyeTxTdHJpbmcsIE9iamVjdD4gZW50cnkgPSBlbnRyaWVzSXRlci5uZXh0KCk7Ci0gICAgICAgICAgICBzcWwuYXBwZW5kKGVudHJ5LmdldEtleSgpKTsKKyAgICAgICAgLy8gbW92ZSBhbGwgYmluZCBhcmdzIHRvIG9uZSBhcnJheQorICAgICAgICBpbnQgYmluZEFyZ3NTaXplID0gKHdoZXJlQXJncyA9PSBudWxsKSA/IHNldFZhbHVlc1NpemUgOiAoc2V0VmFsdWVzU2l6ZSArIHdoZXJlQXJncy5sZW5ndGgpOworICAgICAgICBPYmplY3RbXSBiaW5kQXJncyA9IG5ldyBPYmplY3RbYmluZEFyZ3NTaXplXTsKKyAgICAgICAgaW50IGkgPSAwOworICAgICAgICBmb3IgKFN0cmluZyBjb2xOYW1lIDogdmFsdWVzLmtleVNldCgpKSB7CisgICAgICAgICAgICBzcWwuYXBwZW5kKChpID4gMCkgPyAiLCIgOiAiIik7CisgICAgICAgICAgICBzcWwuYXBwZW5kKGNvbE5hbWUpOworICAgICAgICAgICAgYmluZEFyZ3NbaSsrXSA9IHZhbHVlcy5nZXQoY29sTmFtZSk7CiAgICAgICAgICAgICBzcWwuYXBwZW5kKCI9PyIpOwotICAgICAgICAgICAgaWYgKGVudHJpZXNJdGVyLmhhc05leHQoKSkgewotICAgICAgICAgICAgICAgIHNxbC5hcHBlbmQoIiwgIik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHdoZXJlQXJncyAhPSBudWxsKSB7CisgICAgICAgICAgICBmb3IgKGkgPSBzZXRWYWx1ZXNTaXplOyBpIDwgYmluZEFyZ3NTaXplOyBpKyspIHsKKyAgICAgICAgICAgICAgICBiaW5kQXJnc1tpXSA9IHdoZXJlQXJnc1tpIC0gc2V0VmFsdWVzU2l6ZV07CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KLQogICAgICAgICBpZiAoIVRleHRVdGlscy5pc0VtcHR5KHdoZXJlQ2xhdXNlKSkgewogICAgICAgICAgICAgc3FsLmFwcGVuZCgiIFdIRVJFICIpOwogICAgICAgICAgICAgc3FsLmFwcGVuZCh3aGVyZUNsYXVzZSk7CiAgICAgICAgIH0KIAotICAgICAgICBsb2NrKCk7Ci0gICAgICAgIGlmICghaXNPcGVuKCkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oImRhdGFiYXNlIG5vdCBvcGVuIik7Ci0gICAgICAgIH0KLSAgICAgICAgU1FMaXRlU3RhdGVtZW50IHN0YXRlbWVudCA9IG51bGw7CisgICAgICAgIFNRTGl0ZVN0YXRlbWVudCBzdGF0ZW1lbnQgPSBuZXcgU1FMaXRlU3RhdGVtZW50KHRoaXMsIHNxbC50b1N0cmluZygpLCBiaW5kQXJncyk7CiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBzdGF0ZW1lbnQgPSBjb21waWxlU3RhdGVtZW50KHNxbC50b1N0cmluZygpKTsKLQotICAgICAgICAgICAgLy8gQmluZCB0aGUgdmFsdWVzCi0gICAgICAgICAgICBpbnQgc2l6ZSA9IGVudHJ5U2V0LnNpemUoKTsKLSAgICAgICAgICAgIGVudHJpZXNJdGVyID0gZW50cnlTZXQuaXRlcmF0b3IoKTsKLSAgICAgICAgICAgIGludCBiaW5kQXJnID0gMTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgTWFwLkVudHJ5PFN0cmluZywgT2JqZWN0PiBlbnRyeSA9IGVudHJpZXNJdGVyLm5leHQoKTsKLSAgICAgICAgICAgICAgICBEYXRhYmFzZVV0aWxzLmJpbmRPYmplY3RUb1Byb2dyYW0oc3RhdGVtZW50LCBiaW5kQXJnLCBlbnRyeS5nZXRWYWx1ZSgpKTsKLSAgICAgICAgICAgICAgICBiaW5kQXJnKys7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmICh3aGVyZUFyZ3MgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHNpemUgPSB3aGVyZUFyZ3MubGVuZ3RoOwotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIHN0YXRlbWVudC5iaW5kU3RyaW5nKGJpbmRBcmcsIHdoZXJlQXJnc1tpXSk7Ci0gICAgICAgICAgICAgICAgICAgIGJpbmRBcmcrKzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIFJ1biB0aGUgcHJvZ3JhbSBhbmQgdGhlbiBjbGVhbnVwCi0gICAgICAgICAgICBzdGF0ZW1lbnQuZXhlY3V0ZSgpOwotICAgICAgICAgICAgaW50IG51bUNoYW5nZWRSb3dzID0gbGFzdENoYW5nZUNvdW50KCk7Ci0gICAgICAgICAgICBpZiAoQ29uZmlnLkxPR0QgJiYgTG9nLmlzTG9nZ2FibGUoVEFHLCBMb2cuVkVSQk9TRSkpIHsKLSAgICAgICAgICAgICAgICBMb2cudihUQUcsICJVcGRhdGVkICIgKyBudW1DaGFuZ2VkUm93cyArICIgdXNpbmcgIiArIHZhbHVlcyArICIgYW5kICIgKyBzcWwpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIG51bUNoYW5nZWRSb3dzOworICAgICAgICAgICAgcmV0dXJuIHN0YXRlbWVudC5leGVjdXRlVXBkYXRlRGVsZXRlKCk7CiAgICAgICAgIH0gY2F0Y2ggKFNRTGl0ZURhdGFiYXNlQ29ycnVwdEV4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgICBvbkNvcnJ1cHRpb24oKTsKICAgICAgICAgICAgIHRocm93IGU7Ci0gICAgICAgIH0gY2F0Y2ggKFNRTEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBMb2cuZShUQUcsICJFcnJvciB1cGRhdGluZyAiICsgdmFsdWVzICsgIiB1c2luZyAiICsgc3FsKTsKLSAgICAgICAgICAgIHRocm93IGU7CiAgICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBpZiAoc3RhdGVtZW50ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBzdGF0ZW1lbnQuY2xvc2UoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHVubG9jaygpOworICAgICAgICAgICAgc3RhdGVtZW50LmNsb3NlKCk7CiAgICAgICAgIH0KICAgICB9CiAKICAgICAvKioKLSAgICAgKiBFeGVjdXRlIGEgc2luZ2xlIFNRTCBzdGF0ZW1lbnQgdGhhdCBpcyBub3QgYSBxdWVyeS4gRm9yIGV4YW1wbGUsIENSRUFURQotICAgICAqIFRBQkxFLCBERUxFVEUsIElOU0VSVCwgZXRjLiBNdWx0aXBsZSBzdGF0ZW1lbnRzIHNlcGFyYXRlZCBieSA7cyBhcmUgbm90Ci0gICAgICogc3VwcG9ydGVkLiBpdCB0YWtlcyBhIHdyaXRlIGxvY2sKKyAgICAgKiBFeGVjdXRlIGEgc2luZ2xlIFNRTCBzdGF0ZW1lbnQgdGhhdCBpcyBOT1QgYSBTRUxFQ1QKKyAgICAgKiBvciBhbnkgb3RoZXIgU1FMIHN0YXRlbWVudCB0aGF0IHJldHVybnMgZGF0YS4KKyAgICAgKiA8cD4KKyAgICAgKiBJdCBoYXMgbm8gbWVhbnMgdG8gcmV0dXJuIGFueSBkYXRhIChzdWNoIGFzIHRoZSBudW1iZXIgb2YgYWZmZWN0ZWQgcm93cykuCisgICAgICogSW5zdGVhZCwgeW91J3JlIGVuY291cmFnZWQgdG8gdXNlIHtAbGluayAjaW5zZXJ0KFN0cmluZywgU3RyaW5nLCBDb250ZW50VmFsdWVzKX0sCisgICAgICoge0BsaW5rICN1cGRhdGUoU3RyaW5nLCBDb250ZW50VmFsdWVzLCBTdHJpbmcsIFN0cmluZ1tdKX0sIGV0IGFsLCB3aGVuIHBvc3NpYmxlLgorICAgICAqIDwvcD4KKyAgICAgKiA8cD4KKyAgICAgKiBXaGVuIHVzaW5nIHtAbGluayAjZW5hYmxlV3JpdGVBaGVhZExvZ2dpbmcoKX0sIGpvdXJuYWxfbW9kZSBpcworICAgICAqIGF1dG9tYXRpY2FsbHkgbWFuYWdlZCBieSB0aGlzIGNsYXNzLiBTbywgZG8gbm90IHNldCBqb3VybmFsX21vZGUKKyAgICAgKiB1c2luZyAiUFJBR01BIGpvdXJuYWxfbW9kZSc8dmFsdWU+IiBzdGF0ZW1lbnQgaWYgeW91ciBhcHAgaXMgdXNpbmcKKyAgICAgKiB7QGxpbmsgI2VuYWJsZVdyaXRlQWhlYWRMb2dnaW5nKCl9CisgICAgICogPC9wPgogICAgICAqCisgICAgICogQHBhcmFtIHNxbCB0aGUgU1FMIHN0YXRlbWVudCB0byBiZSBleGVjdXRlZC4gTXVsdGlwbGUgc3RhdGVtZW50cyBzZXBhcmF0ZWQgYnkgc2VtaWNvbG9ucyBhcmUKKyAgICAgKiBub3Qgc3VwcG9ydGVkLgogICAgICAqIEB0aHJvd3MgU1FMRXhjZXB0aW9uIElmIHRoZSBTUUwgc3RyaW5nIGlzIGludmFsaWQgZm9yIHNvbWUgcmVhc29uCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgZXhlY1NRTChTdHJpbmcgc3FsKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKLSAgICAgICAgQmxvY2tHdWFyZC5nZXRUaHJlYWRQb2xpY3koKS5vbldyaXRlVG9EaXNrKCk7CisgICAgICAgIGludCBzdG10VHlwZSA9IERhdGFiYXNlVXRpbHMuZ2V0U3FsU3RhdGVtZW50VHlwZShzcWwpOworICAgICAgICBpZiAoc3RtdFR5cGUgPT0gRGF0YWJhc2VVdGlscy5TVEFURU1FTlRfQVRUQUNIKSB7CisgICAgICAgICAgICBkaXNhYmxlV3JpdGVBaGVhZExvZ2dpbmcoKTsKKyAgICAgICAgfQogICAgICAgICBsb25nIHRpbWVTdGFydCA9IFN5c3RlbUNsb2NrLnVwdGltZU1pbGxpcygpOwotICAgICAgICBsb2NrKCk7Ci0gICAgICAgIGlmICghaXNPcGVuKCkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oImRhdGFiYXNlIG5vdCBvcGVuIik7Ci0gICAgICAgIH0KICAgICAgICAgbG9nVGltZVN0YXQobUxhc3RTcWxTdGF0ZW1lbnQsIHRpbWVTdGFydCwgR0VUX0xPQ0tfTE9HX1BSRUZJWCk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBuYXRpdmVfZXhlY1NRTChzcWwpOwotICAgICAgICB9IGNhdGNoIChTUUxpdGVEYXRhYmFzZUNvcnJ1cHRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgb25Db3JydXB0aW9uKCk7Ci0gICAgICAgICAgICB0aHJvdyBlOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgdW5sb2NrKCk7Ci0gICAgICAgIH0KKyAgICAgICAgZXhlY3V0ZVNxbChzcWwsIG51bGwpOwogCiAgICAgICAgIC8vIExvZyBjb21taXQgc3RhdGVtZW50cyBhbG9uZyB3aXRoIHRoZSBtb3N0IHJlY2VudGx5IGV4ZWN1dGVkCi0gICAgICAgIC8vIFNRTCBzdGF0ZW1lbnQgZm9yIGRpc2FtYmlndWF0aW9uLiAgTm90ZSB0aGF0IGluc3RhbmNlCi0gICAgICAgIC8vIGVxdWFsaXR5IHRvIENPTU1JVF9TUUwgaXMgc2FmZSBoZXJlLgotICAgICAgICBpZiAoc3FsID09IENPTU1JVF9TUUwpIHsKKyAgICAgICAgLy8gU1FMIHN0YXRlbWVudCBmb3IgZGlzYW1iaWd1YXRpb24uCisgICAgICAgIGlmIChzdG10VHlwZSA9PSBEYXRhYmFzZVV0aWxzLlNUQVRFTUVOVF9DT01NSVQpIHsKICAgICAgICAgICAgIGxvZ1RpbWVTdGF0KG1MYXN0U3FsU3RhdGVtZW50LCB0aW1lU3RhcnQsIENPTU1JVF9TUUwpOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgbG9nVGltZVN0YXQoc3FsLCB0aW1lU3RhcnQsIG51bGwpOwpAQCAtMTc1OSw2NSArMTg0MSwxMDAgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBFeGVjdXRlIGEgc2luZ2xlIFNRTCBzdGF0ZW1lbnQgdGhhdCBpcyBub3QgYSBxdWVyeS4gRm9yIGV4YW1wbGUsIENSRUFURQotICAgICAqIFRBQkxFLCBERUxFVEUsIElOU0VSVCwgZXRjLiBNdWx0aXBsZSBzdGF0ZW1lbnRzIHNlcGFyYXRlZCBieSA7cyBhcmUgbm90Ci0gICAgICogc3VwcG9ydGVkLiBpdCB0YWtlcyBhIHdyaXRlIGxvY2ssCisgICAgICogRXhlY3V0ZSBhIHNpbmdsZSBTUUwgc3RhdGVtZW50IHRoYXQgaXMgTk9UIGEgU0VMRUNUL0lOU0VSVC9VUERBVEUvREVMRVRFLgorICAgICAqIDxwPgorICAgICAqIEZvciBJTlNFUlQgc3RhdGVtZW50cywgdXNlIGFueSBvZiB0aGUgZm9sbG93aW5nIGluc3RlYWQuCisgICAgICogPHVsPgorICAgICAqICAgPGxpPntAbGluayAjaW5zZXJ0KFN0cmluZywgU3RyaW5nLCBDb250ZW50VmFsdWVzKX08L2xpPgorICAgICAqICAgPGxpPntAbGluayAjaW5zZXJ0T3JUaHJvdyhTdHJpbmcsIFN0cmluZywgQ29udGVudFZhbHVlcyl9PC9saT4KKyAgICAgKiAgIDxsaT57QGxpbmsgI2luc2VydFdpdGhPbkNvbmZsaWN0KFN0cmluZywgU3RyaW5nLCBDb250ZW50VmFsdWVzLCBpbnQpfTwvbGk+CisgICAgICogPC91bD4KKyAgICAgKiA8cD4KKyAgICAgKiBGb3IgVVBEQVRFIHN0YXRlbWVudHMsIHVzZSBhbnkgb2YgdGhlIGZvbGxvd2luZyBpbnN0ZWFkLgorICAgICAqIDx1bD4KKyAgICAgKiAgIDxsaT57QGxpbmsgI3VwZGF0ZShTdHJpbmcsIENvbnRlbnRWYWx1ZXMsIFN0cmluZywgU3RyaW5nW10pfTwvbGk+CisgICAgICogICA8bGk+e0BsaW5rICN1cGRhdGVXaXRoT25Db25mbGljdChTdHJpbmcsIENvbnRlbnRWYWx1ZXMsIFN0cmluZywgU3RyaW5nW10sIGludCl9PC9saT4KKyAgICAgKiA8L3VsPgorICAgICAqIDxwPgorICAgICAqIEZvciBERUxFVEUgc3RhdGVtZW50cywgdXNlIGFueSBvZiB0aGUgZm9sbG93aW5nIGluc3RlYWQuCisgICAgICogPHVsPgorICAgICAqICAgPGxpPntAbGluayAjZGVsZXRlKFN0cmluZywgU3RyaW5nLCBTdHJpbmdbXSl9PC9saT4KKyAgICAgKiA8L3VsPgorICAgICAqIDxwPgorICAgICAqIEZvciBleGFtcGxlLCB0aGUgZm9sbG93aW5nIGFyZSBnb29kIGNhbmRpZGF0ZXMgZm9yIHVzaW5nIHRoaXMgbWV0aG9kOgorICAgICAqIDx1bD4KKyAgICAgKiAgIDxsaT5BTFRFUiBUQUJMRTwvbGk+CisgICAgICogICA8bGk+Q1JFQVRFIG9yIERST1AgdGFibGUgLyB0cmlnZ2VyIC8gdmlldyAvIGluZGV4IC8gdmlydHVhbCB0YWJsZTwvbGk+CisgICAgICogICA8bGk+UkVJTkRFWDwvbGk+CisgICAgICogICA8bGk+UkVMRUFTRTwvbGk+CisgICAgICogICA8bGk+U0FWRVBPSU5UPC9saT4KKyAgICAgKiAgIDxsaT5QUkFHTUEgdGhhdCByZXR1cm5zIG5vIGRhdGE8L2xpPgorICAgICAqIDwvdWw+CisgICAgICogPC9wPgorICAgICAqIDxwPgorICAgICAqIFdoZW4gdXNpbmcge0BsaW5rICNlbmFibGVXcml0ZUFoZWFkTG9nZ2luZygpfSwgam91cm5hbF9tb2RlIGlzCisgICAgICogYXV0b21hdGljYWxseSBtYW5hZ2VkIGJ5IHRoaXMgY2xhc3MuIFNvLCBkbyBub3Qgc2V0IGpvdXJuYWxfbW9kZQorICAgICAqIHVzaW5nICJQUkFHTUEgam91cm5hbF9tb2RlJzx2YWx1ZT4iIHN0YXRlbWVudCBpZiB5b3VyIGFwcCBpcyB1c2luZworICAgICAqIHtAbGluayAjZW5hYmxlV3JpdGVBaGVhZExvZ2dpbmcoKX0KKyAgICAgKiA8L3A+CiAgICAgICoKLSAgICAgKiBAcGFyYW0gc3FsCisgICAgICogQHBhcmFtIHNxbCB0aGUgU1FMIHN0YXRlbWVudCB0byBiZSBleGVjdXRlZC4gTXVsdGlwbGUgc3RhdGVtZW50cyBzZXBhcmF0ZWQgYnkgc2VtaWNvbG9ucyBhcmUKKyAgICAgKiBub3Qgc3VwcG9ydGVkLgogICAgICAqIEBwYXJhbSBiaW5kQXJncyBvbmx5IGJ5dGVbXSwgU3RyaW5nLCBMb25nIGFuZCBEb3VibGUgYXJlIHN1cHBvcnRlZCBpbiBiaW5kQXJncy4KICAgICAgKiBAdGhyb3dzIFNRTEV4Y2VwdGlvbiBJZiB0aGUgU1FMIHN0cmluZyBpcyBpbnZhbGlkIGZvciBzb21lIHJlYXNvbgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIGV4ZWNTUUwoU3RyaW5nIHNxbCwgT2JqZWN0W10gYmluZEFyZ3MpIHRocm93cyBTUUxFeGNlcHRpb24gewotICAgICAgICBCbG9ja0d1YXJkLmdldFRocmVhZFBvbGljeSgpLm9uV3JpdGVUb0Rpc2soKTsKICAgICAgICAgaWYgKGJpbmRBcmdzID09IG51bGwpIHsKICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkVtcHR5IGJpbmRBcmdzIik7CiAgICAgICAgIH0KKyAgICAgICAgZXhlY3V0ZVNxbChzcWwsIGJpbmRBcmdzKTsKKyAgICB9CisKKyAgICBwcml2YXRlIGludCBleGVjdXRlU3FsKFN0cmluZyBzcWwsIE9iamVjdFtdIGJpbmRBcmdzKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKICAgICAgICAgbG9uZyB0aW1lU3RhcnQgPSBTeXN0ZW1DbG9jay51cHRpbWVNaWxsaXMoKTsKLSAgICAgICAgbG9jaygpOwotICAgICAgICBpZiAoIWlzT3BlbigpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJkYXRhYmFzZSBub3Qgb3BlbiIpOwotICAgICAgICB9Ci0gICAgICAgIFNRTGl0ZVN0YXRlbWVudCBzdGF0ZW1lbnQgPSBudWxsOworICAgICAgICBpbnQgbjsKKyAgICAgICAgU1FMaXRlU3RhdGVtZW50IHN0YXRlbWVudCA9IG5ldyBTUUxpdGVTdGF0ZW1lbnQodGhpcywgc3FsLCBiaW5kQXJncyk7CiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBzdGF0ZW1lbnQgPSBjb21waWxlU3RhdGVtZW50KHNxbCk7Ci0gICAgICAgICAgICBpZiAoYmluZEFyZ3MgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGludCBudW1BcmdzID0gYmluZEFyZ3MubGVuZ3RoOwotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtQXJnczsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIERhdGFiYXNlVXRpbHMuYmluZE9iamVjdFRvUHJvZ3JhbShzdGF0ZW1lbnQsIGkgKyAxLCBiaW5kQXJnc1tpXSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgc3RhdGVtZW50LmV4ZWN1dGUoKTsKKyAgICAgICAgICAgIG4gPSBzdGF0ZW1lbnQuZXhlY3V0ZVVwZGF0ZURlbGV0ZSgpOwogICAgICAgICB9IGNhdGNoIChTUUxpdGVEYXRhYmFzZUNvcnJ1cHRFeGNlcHRpb24gZSkgewogICAgICAgICAgICAgb25Db3JydXB0aW9uKCk7CiAgICAgICAgICAgICB0aHJvdyBlOwogICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgaWYgKHN0YXRlbWVudCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgc3RhdGVtZW50LmNsb3NlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB1bmxvY2soKTsKKyAgICAgICAgICAgIHN0YXRlbWVudC5jbG9zZSgpOwogICAgICAgICB9CiAgICAgICAgIGxvZ1RpbWVTdGF0KHNxbCwgdGltZVN0YXJ0KTsKKyAgICAgICAgcmV0dXJuIG47CiAgICAgfQogCiAgICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgZmluYWxpemUoKSB7Ci0gICAgICAgIGlmIChpc09wZW4oKSkgewotICAgICAgICAgICAgTG9nLmUoVEFHLCAiY2xvc2UoKSB3YXMgbmV2ZXIgZXhwbGljaXRseSBjYWxsZWQgb24gZGF0YWJhc2UgJyIgKwotICAgICAgICAgICAgICAgICAgICBtUGF0aCArICInICIsIG1TdGFja1RyYWNlKTsKLSAgICAgICAgICAgIGNsb3NlQ2xvc2FibGUoKTsKLSAgICAgICAgICAgIG9uQWxsUmVmZXJlbmNlc1JlbGVhc2VkKCk7CisgICAgcHJvdGVjdGVkIHZvaWQgZmluYWxpemUoKSB0aHJvd3MgVGhyb3dhYmxlIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGlmIChpc09wZW4oKSkgeworICAgICAgICAgICAgICAgIExvZy5lKFRBRywgImNsb3NlKCkgd2FzIG5ldmVyIGV4cGxpY2l0bHkgY2FsbGVkIG9uIGRhdGFiYXNlICciICsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1QYXRoICsgIicgIiwgbVN0YWNrVHJhY2UpOworICAgICAgICAgICAgICAgIGNsb3NlQ2xvc2FibGUoKTsKKyAgICAgICAgICAgICAgICBvbkFsbFJlZmVyZW5jZXNSZWxlYXNlZCgpOworICAgICAgICAgICAgICAgIHJlbGVhc2VDdXN0b21GdW5jdGlvbnMoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIHN1cGVyLmZpbmFsaXplKCk7CiAgICAgICAgIH0KICAgICB9CiAKICAgICAvKioKLSAgICAgKiBQcml2YXRlIGNvbnN0cnVjdG9yLiBTZWUge0BsaW5rICNjcmVhdGV9IGFuZCB7QGxpbmsgI29wZW5EYXRhYmFzZX0uCisgICAgICogUHJpdmF0ZSBjb25zdHJ1Y3Rvci4KICAgICAgKgogICAgICAqIEBwYXJhbSBwYXRoIFRoZSBmdWxsIHBhdGggdG8gdGhlIGRhdGFiYXNlCiAgICAgICogQHBhcmFtIGZhY3RvcnkgVGhlIGZhY3RvcnkgdG8gdXNlIHdoZW4gY3JlYXRpbmcgY3Vyc29ycywgbWF5IGJlIE5VTEwuCiAgICAgICogQHBhcmFtIGZsYWdzIDAgb3Ige0BsaW5rICNOT19MT0NBTElaRURfQ09MTEFUT1JTfS4gIElmIHRoZSBkYXRhYmFzZSBmaWxlIGFscmVhZHkKICAgICAgKiAgICAgICAgICAgICAgZXhpc3RzLCBtRmxhZ3Mgd2lsbCBiZSB1cGRhdGVkIGFwcHJvcHJpYXRlbHkuCisgICAgICogQHBhcmFtIGVycm9ySGFuZGxlciBUaGUge0BsaW5rIERhdGFiYXNlRXJyb3JIYW5kbGVyfSB0byBiZSB1c2VkIHdoZW4gc3FsaXRlIHJlcG9ydHMgZGF0YWJhc2UKKyAgICAgKiBjb3JydXB0aW9uLiBtYXkgYmUgTlVMTC4KKyAgICAgKiBAcGFyYW0gY29ubmVjdGlvbk51bSAwIGZvciBtYWluIGRhdGFiYXNlIGNvbm5lY3Rpb24gaGFuZGxlLiAxLi5OIGZvciBwb29sZWQgZGF0YWJhc2UKKyAgICAgKiBjb25uZWN0aW9uIGhhbmRsZXMuCiAgICAgICovCi0gICAgcHJpdmF0ZSBTUUxpdGVEYXRhYmFzZShTdHJpbmcgcGF0aCwgQ3Vyc29yRmFjdG9yeSBmYWN0b3J5LCBpbnQgZmxhZ3MpIHsKKyAgICBwcml2YXRlIFNRTGl0ZURhdGFiYXNlKFN0cmluZyBwYXRoLCBDdXJzb3JGYWN0b3J5IGZhY3RvcnksIGludCBmbGFncywKKyAgICAgICAgICAgIERhdGFiYXNlRXJyb3JIYW5kbGVyIGVycm9ySGFuZGxlciwgc2hvcnQgY29ubmVjdGlvbk51bSkgewogICAgICAgICBpZiAocGF0aCA9PSBudWxsKSB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJwYXRoIHNob3VsZCBub3QgYmUgbnVsbCIpOwogICAgICAgICB9CkBAIC0xODI2LDI1ICsxOTQzLDExIEBACiAgICAgICAgIG1TbG93UXVlcnlUaHJlc2hvbGQgPSBTeXN0ZW1Qcm9wZXJ0aWVzLmdldEludChMT0dfU0xPV19RVUVSSUVTX1BST1BFUlRZLCAtMSk7CiAgICAgICAgIG1TdGFja1RyYWNlID0gbmV3IERhdGFiYXNlT2JqZWN0Tm90Q2xvc2VkRXhjZXB0aW9uKCkuZmlsbEluU3RhY2tUcmFjZSgpOwogICAgICAgICBtRmFjdG9yeSA9IGZhY3Rvcnk7Ci0gICAgICAgIGRib3BlbihtUGF0aCwgbUZsYWdzKTsKLSAgICAgICAgaWYgKFNRTGl0ZURlYnVnLkRFQlVHX1NRTF9DQUNIRSkgewotICAgICAgICAgICAgbVRpbWVPcGVuZWQgPSBnZXRUaW1lKCk7Ci0gICAgICAgIH0KICAgICAgICAgbVByb2dyYW1zID0gbmV3IFdlYWtIYXNoTWFwPFNRTGl0ZUNsb3NhYmxlLE9iamVjdD4oKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHNldExvY2FsZShMb2NhbGUuZ2V0RGVmYXVsdCgpKTsKLSAgICAgICAgfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBMb2cuZShUQUcsICJGYWlsZWQgdG8gc2V0TG9jYWxlKCkgd2hlbiBjb25zdHJ1Y3RpbmcsIGNsb3NpbmcgdGhlIGRhdGFiYXNlIiwgZSk7Ci0gICAgICAgICAgICBkYmNsb3NlKCk7Ci0gICAgICAgICAgICBpZiAoU1FMaXRlRGVidWcuREVCVUdfU1FMX0NBQ0hFKSB7Ci0gICAgICAgICAgICAgICAgbVRpbWVDbG9zZWQgPSBnZXRUaW1lKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB0aHJvdyBlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBTdHJpbmcgZ2V0VGltZSgpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBTaW1wbGVEYXRlRm9ybWF0KCJ5eXl5LU1NLWRkIEhIOm1tOnNzLlNTUyAiKS5mb3JtYXQoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkpOworICAgICAgICAvLyBTZXQgdGhlIERhdGFiYXNlRXJyb3JIYW5kbGVyIHRvIGJlIHVzZWQgd2hlbiBTUUxpdGUgcmVwb3J0cyBjb3JydXB0aW9uLgorICAgICAgICAvLyBJZiB0aGUgY2FsbGVyIHNldHMgZXJyb3JIYW5kbGVyID0gbnVsbCwgdGhlbiB1c2UgZGVmYXVsdCBlcnJvcmhhbmRsZXIuCisgICAgICAgIG1FcnJvckhhbmRsZXIgPSAoZXJyb3JIYW5kbGVyID09IG51bGwpID8gbmV3IERlZmF1bHREYXRhYmFzZUVycm9ySGFuZGxlcigpIDogZXJyb3JIYW5kbGVyOworICAgICAgICBtQ29ubmVjdGlvbk51bSA9IGNvbm5lY3Rpb25OdW07CiAgICAgfQogCiAgICAgLyoqCkBAIC0xOTAxLDcgKzIwMDQsNyBAQAogICAgICAgICB9CiAgICAgICAgIGlmIChkdXJhdGlvbk1pbGxpcyA+PSBzUXVlcnlMb2dUaW1lSW5NaWxsaXMpIHsKICAgICAgICAgICAgIHNhbXBsZVBlcmNlbnQgPSAxMDA7Ci0gICAgICAgIH0gZWxzZSB7OworICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgc2FtcGxlUGVyY2VudCA9IChpbnQpICgxMDAgKiBkdXJhdGlvbk1pbGxpcyAvIHNRdWVyeUxvZ1RpbWVJbk1pbGxpcykgKyAxOwogICAgICAgICAgICAgaWYgKG1SYW5kb20ubmV4dEludCgxMDApID49IHNhbXBsZVBlcmNlbnQpIHJldHVybjsKICAgICAgICAgfQpAQCAtMTk3MCw2NiArMjA3Myw1NSBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgLyoKLSAgICAgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICAgICoKLSAgICAgKiAgICAgICBUaGUgZm9sbG93aW5nIG1ldGhvZHMgZGVhbCB3aXRoIGNvbXBpbGVkLXNxbCBjYWNoZQotICAgICAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgICAgKi8KKyAgICAvKiBwYWNrYWdlICovIHZvaWQgdmVyaWZ5RGJJc09wZW4oKSB7CisgICAgICAgIGlmICghaXNPcGVuKCkpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oImRhdGFiYXNlICIgKyBnZXRQYXRoKCkgKyAiIChjb25uIyAiICsKKyAgICAgICAgICAgICAgICAgICAgbUNvbm5lY3Rpb25OdW0gKyAiKSBhbHJlYWR5IGNsb3NlZCIpOworICAgICAgICB9CisgICAgfQorCisgICAgLyogcGFja2FnZSAqLyB2b2lkIHZlcmlmeUxvY2tPd25lcigpIHsKKyAgICAgICAgdmVyaWZ5RGJJc09wZW4oKTsKKyAgICAgICAgaWYgKG1Mb2NraW5nRW5hYmxlZCAmJiAhaXNEYkxvY2tlZEJ5Q3VycmVudFRocmVhZCgpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJEb24ndCBoYXZlIGRhdGFiYXNlIGxvY2shIik7CisgICAgICAgIH0KKyAgICB9CisKICAgICAvKioKLSAgICAgKiBhZGRzIHRoZSBnaXZlbiBzcWwgYW5kIGl0cyBjb21waWxlZC1zdGF0ZW1lbnQtaWQtcmV0dXJuZWQtYnktc3FsaXRlIHRvIHRoZQorICAgICAqIEFkZHMgdGhlIGdpdmVuIFNRTCBhbmQgaXRzIGNvbXBpbGVkLXN0YXRlbWVudC1pZC1yZXR1cm5lZC1ieS1zcWxpdGUgdG8gdGhlCiAgICAgICogY2FjaGUgb2YgY29tcGlsZWRRdWVyaWVzIGF0dGFjaGVkIHRvICd0aGlzJy4KLSAgICAgKgotICAgICAqIGlmIHRoZXJlIGlzIGFscmVhZHkgYSB7QGxpbmsgU1FMaXRlQ29tcGlsZWRTcWx9IGluIGNvbXBpbGVkUXVlcmllcyBmb3IgdGhlIGdpdmVuIHNxbCwKKyAgICAgKiA8cD4KKyAgICAgKiBJZiB0aGVyZSBpcyBhbHJlYWR5IGEge0BsaW5rIFNRTGl0ZUNvbXBpbGVkU3FsfSBpbiBjb21waWxlZFF1ZXJpZXMgZm9yIHRoZSBnaXZlbiBTUUwsCiAgICAgICogdGhlIG5ldyB7QGxpbmsgU1FMaXRlQ29tcGlsZWRTcWx9IG9iamVjdCBpcyBOT1QgaW5zZXJ0ZWQgaW50byB0aGUgY2FjaGUgKGkuZS4sdGhlIGN1cnJlbnQKICAgICAgKiBtYXBwaW5nIGlzIE5PVCByZXBsYWNlZCB3aXRoIHRoZSBuZXcgbWFwcGluZykuCiAgICAgICovCiAgICAgLyogcGFja2FnZSAqLyB2b2lkIGFkZFRvQ29tcGlsZWRRdWVyaWVzKFN0cmluZyBzcWwsIFNRTGl0ZUNvbXBpbGVkU3FsIGNvbXBpbGVkU3RhdGVtZW50KSB7Ci0gICAgICAgIGlmIChtTWF4U3FsQ2FjaGVTaXplID09IDApIHsKLSAgICAgICAgICAgIC8vIGZvciB0aGlzIGRhdGFiYXNlLCB0aGVyZSBpcyBubyBjYWNoZSBvZiBjb21waWxlZCBzcWwuCi0gICAgICAgICAgICBpZiAoU1FMaXRlRGVidWcuREVCVUdfU1FMX0NBQ0hFKSB7Ci0gICAgICAgICAgICAgICAgTG9nLnYoVEFHLCAifE5PVCBhZGRpbmdfc3FsX3RvX2NhY2hlfCIgKyBnZXRQYXRoKCkgKyAifCIgKyBzcWwpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgU1FMaXRlQ29tcGlsZWRTcWwgY29tcGlsZWRTcWwgPSBudWxsOwogICAgICAgICBzeW5jaHJvbml6ZWQobUNvbXBpbGVkUXVlcmllcykgewogICAgICAgICAgICAgLy8gZG9uJ3QgaW5zZXJ0IHRoZSBuZXcgbWFwcGluZyBpZiBhIG1hcHBpbmcgYWxyZWFkeSBleGlzdHMKLSAgICAgICAgICAgIGNvbXBpbGVkU3FsID0gbUNvbXBpbGVkUXVlcmllcy5nZXQoc3FsKTsKLSAgICAgICAgICAgIGlmIChjb21waWxlZFNxbCAhPSBudWxsKSB7CisgICAgICAgICAgICBpZiAobUNvbXBpbGVkUXVlcmllcy5jb250YWluc0tleShzcWwpKSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gYWRkIHRoaXMgPHNxbCwgY29tcGlsZWRTdGF0ZW1lbnQ+IHRvIHRoZSBjYWNoZQotICAgICAgICAgICAgaWYgKG1Db21waWxlZFF1ZXJpZXMuc2l6ZSgpID09IG1NYXhTcWxDYWNoZVNpemUpIHsKKworICAgICAgICAgICAgaWYgKCFpc0NhY2hlRnVsbFdhcm5pbmdMb2dnZWQoKSAmJiBtQ29tcGlsZWRRdWVyaWVzLnNpemUoKSA9PSBtTWF4U3FsQ2FjaGVTaXplKSB7CiAgICAgICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAgICAgKiBjYWNoZSBzaXplIG9mIHtAbGluayAjbU1heFNxbENhY2hlU2l6ZX0gaXMgbm90IGVub3VnaCBmb3IgdGhpcyBhcHAuCi0gICAgICAgICAgICAgICAgICogbG9nIGEgd2FybmluZyBNQVhfV0FSTklOR1NfT05fQ0FDSEVTSVpFX0NPTkRJVElPTiB0aW1lcwotICAgICAgICAgICAgICAgICAqIGNoYW5jZXMgYXJlIGl0IGlzIE5PVCB1c2luZyA/IGZvciBiaW5kYXJncyAtIHNvIGNhY2hpbmcgaXMgdXNlbGVzcy4KLSAgICAgICAgICAgICAgICAgKiBUT0RPOiBlaXRoZXIgbGV0IHRoZSBjYWxsZXJzIHNldCBtYXggY2NoZXNpemUgZm9yIHRoZWlyIGFwcCwgb3IgaW50ZWxsaWdlbnRseQotICAgICAgICAgICAgICAgICAqIGZpZ3VyZSBvdXQgd2hhdCBzaG91bGQgYmUgY2FjaGVkIGZvciBhIGdpdmVuIGFwcC4KKyAgICAgICAgICAgICAgICAgKiBsb2cgYSB3YXJuaW5nLgorICAgICAgICAgICAgICAgICAqIGNoYW5jZXMgYXJlIGl0IGlzIE5PVCB1c2luZyA/IGZvciBiaW5kYXJncyAtIG9yIGNhY2hlc2l6ZSBpcyB0b28gc21hbGwuCiAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgaWYgKCsrbUNhY2hlRnVsbFdhcm5pbmdzID09IE1BWF9XQVJOSU5HU19PTl9DQUNIRVNJWkVfQ09ORElUSU9OKSB7Ci0gICAgICAgICAgICAgICAgICAgIExvZy53KFRBRywgIlJlYWNoZWQgTUFYIHNpemUgZm9yIGNvbXBpbGVkLXNxbCBzdGF0ZW1lbnQgY2FjaGUgZm9yIGRhdGFiYXNlICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldFBhdGgoKSArICI7IGkuZS4sIE5PIHNwYWNlIGZvciB0aGlzIHNxbCBzdGF0ZW1lbnQgaW4gY2FjaGU6ICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNxbCArICIuIFBsZWFzZSBjaGFuZ2UgeW91ciBzcWwgc3RhdGVtZW50cyB0byB1c2UgJz8nIGZvciAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYmluZGFyZ3MsIGluc3RlYWQgb2YgdXNpbmcgYWN0dWFsIHZhbHVlcyIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAvLyBkb24ndCBhZGQgdGhpcyBlbnRyeSB0byBjYWNoZQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAvLyBjYWNoZSBpcyBOT1QgZnVsbC4gYWRkIHRoaXMgdG8gY2FjaGUuCi0gICAgICAgICAgICAgICAgbUNvbXBpbGVkUXVlcmllcy5wdXQoc3FsLCBjb21waWxlZFN0YXRlbWVudCk7Ci0gICAgICAgICAgICAgICAgaWYgKFNRTGl0ZURlYnVnLkRFQlVHX1NRTF9DQUNIRSkgewotICAgICAgICAgICAgICAgICAgICBMb2cudihUQUcsICJ8YWRkaW5nX3NxbF90b19jYWNoZXwiICsgZ2V0UGF0aCgpICsgInwiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ29tcGlsZWRRdWVyaWVzLnNpemUoKSArICJ8IiArIHNxbCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIExvZy53KFRBRywgIlJlYWNoZWQgTUFYIHNpemUgZm9yIGNvbXBpbGVkLXNxbCBzdGF0ZW1lbnQgY2FjaGUgZm9yIGRhdGFiYXNlICIgKworICAgICAgICAgICAgICAgICAgICAgICAgZ2V0UGF0aCgpICsgIi4gVXNlIHNldE1heFNxbENhY2hlU2l6ZSgpIHRvIGluY3JlYXNlIGNhY2hlc2l6ZS4gIik7CisgICAgICAgICAgICAgICAgc2V0Q2FjaGVGdWxsV2FybmluZ0xvZ2dlZCgpOworICAgICAgICAgICAgfSAKKyAgICAgICAgICAgIC8qIGFkZCB0aGUgZ2l2ZW4gU1FMaXRlQ29tcGlsZWRTcWwgY29tcGlsZWRTdGF0ZW1lbnQgdG8gY2FjaGUuCisgICAgICAgICAgICAgKiBubyBuZWVkIHRvIHdvcnJ5IGFib3V0IHRoZSBjYWNoZSBzaXplIC0gYmVjYXVzZSB7QGxpbmsgI21Db21waWxlZFF1ZXJpZXN9CisgICAgICAgICAgICAgKiBzZWxmLWxpbWl0cyBpdHMgc2l6ZSB0byB7QGxpbmsgI21NYXhTcWxDYWNoZVNpemV9LgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBtQ29tcGlsZWRRdWVyaWVzLnB1dChzcWwsIGNvbXBpbGVkU3RhdGVtZW50KTsKICAgICAgICAgfQotICAgICAgICByZXR1cm47CiAgICAgfQogCi0KLSAgICBwcml2YXRlIHZvaWQgZGVhbGxvY0NhY2hlZFNxbFN0YXRlbWVudHMoKSB7CisgICAgLyoqIHBhY2thZ2UtbGV2ZWwgYWNjZXNzIGZvciB0ZXN0aW5nIHB1cnBvc2VzICovCisgICAgLyogcGFja2FnZSAqLyB2b2lkIGRlYWxsb2NDYWNoZWRTcWxTdGF0ZW1lbnRzKCkgewogICAgICAgICBzeW5jaHJvbml6ZWQgKG1Db21waWxlZFF1ZXJpZXMpIHsKICAgICAgICAgICAgIGZvciAoU1FMaXRlQ29tcGlsZWRTcWwgY29tcGlsZWRTcWwgOiBtQ29tcGlsZWRRdWVyaWVzLnZhbHVlcygpKSB7CiAgICAgICAgICAgICAgICAgY29tcGlsZWRTcWwucmVsZWFzZVNxbFN0YXRlbWVudCgpOwpAQCAtMjAzOSwxNTQgKzIxMzEsMzY3IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogZnJvbSB0aGUgY29tcGlsZWRRdWVyaWVzIGNhY2hlLCByZXR1cm5zIHRoZSBjb21waWxlZC1zdGF0ZW1lbnQtaWQgZm9yIHRoZSBnaXZlbiBzcWwuCi0gICAgICogcmV0dXJucyBudWxsLCBpZiBub3QgZm91bmQgaW4gdGhlIGNhY2hlLgorICAgICAqIEZyb20gdGhlIGNvbXBpbGVkUXVlcmllcyBjYWNoZSwgcmV0dXJucyB0aGUgY29tcGlsZWQtc3RhdGVtZW50LWlkIGZvciB0aGUgZ2l2ZW4gU1FMLgorICAgICAqIFJldHVybnMgbnVsbCwgaWYgbm90IGZvdW5kIGluIHRoZSBjYWNoZS4KICAgICAgKi8KLSAgICAvKiBwYWNrYWdlICovIFNRTGl0ZUNvbXBpbGVkU3FsIGdldENvbXBpbGVkU3RhdGVtZW50Rm9yU3FsKFN0cmluZyBzcWwpIHsKLSAgICAgICAgU1FMaXRlQ29tcGlsZWRTcWwgY29tcGlsZWRTdGF0ZW1lbnQgPSBudWxsOwotICAgICAgICBib29sZWFuIGNhY2hlSGl0OwotICAgICAgICBzeW5jaHJvbml6ZWQobUNvbXBpbGVkUXVlcmllcykgewotICAgICAgICAgICAgaWYgKG1NYXhTcWxDYWNoZVNpemUgPT0gMCkgewotICAgICAgICAgICAgICAgIC8vIGZvciB0aGlzIGRhdGFiYXNlLCB0aGVyZSBpcyBubyBjYWNoZSBvZiBjb21waWxlZCBzcWwuCi0gICAgICAgICAgICAgICAgaWYgKFNRTGl0ZURlYnVnLkRFQlVHX1NRTF9DQUNIRSkgewotICAgICAgICAgICAgICAgICAgICBMb2cudihUQUcsICJ8Y2FjaGUgTk9UIGZvdW5kfCIgKyBnZXRQYXRoKCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhY2hlSGl0ID0gKGNvbXBpbGVkU3RhdGVtZW50ID0gbUNvbXBpbGVkUXVlcmllcy5nZXQoc3FsKSkgIT0gbnVsbDsKLSAgICAgICAgfQotICAgICAgICBpZiAoY2FjaGVIaXQpIHsKLSAgICAgICAgICAgIG1OdW1DYWNoZUhpdHMrKzsKLSAgICAgICAgfSBlbHNlIHsKKyAgICAvKiBwYWNrYWdlICovIHN5bmNocm9uaXplZCBTUUxpdGVDb21waWxlZFNxbCBnZXRDb21waWxlZFN0YXRlbWVudEZvclNxbChTdHJpbmcgc3FsKSB7CisgICAgICAgIFNRTGl0ZUNvbXBpbGVkU3FsIGNvbXBpbGVkU3RhdGVtZW50ID0gbUNvbXBpbGVkUXVlcmllcy5nZXQoc3FsKTsKKyAgICAgICAgaWYgKGNvbXBpbGVkU3RhdGVtZW50ID09IG51bGwpIHsKICAgICAgICAgICAgIG1OdW1DYWNoZU1pc3NlcysrOworICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgIH0KLQotICAgICAgICBpZiAoU1FMaXRlRGVidWcuREVCVUdfU1FMX0NBQ0hFKSB7Ci0gICAgICAgICAgICBMb2cudihUQUcsICJ8Y2FjaGVfc3RhdHN8IiArCi0gICAgICAgICAgICAgICAgICAgIGdldFBhdGgoKSArICJ8IiArIG1Db21waWxlZFF1ZXJpZXMuc2l6ZSgpICsKLSAgICAgICAgICAgICAgICAgICAgInwiICsgbU51bUNhY2hlSGl0cyArICJ8IiArIG1OdW1DYWNoZU1pc3NlcyArCi0gICAgICAgICAgICAgICAgICAgICJ8IiArIGNhY2hlSGl0ICsgInwiICsgbVRpbWVPcGVuZWQgKyAifCIgKyBtVGltZUNsb3NlZCArICJ8IiArIHNxbCk7Ci0gICAgICAgIH0KKyAgICAgICAgbU51bUNhY2hlSGl0cysrOwogICAgICAgICByZXR1cm4gY29tcGlsZWRTdGF0ZW1lbnQ7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogcmV0dXJucyB0cnVlIGlmIHRoZSBnaXZlbiBzcWwgaXMgY2FjaGVkIGluIGNvbXBpbGVkLXNxbCBjYWNoZS4KLSAgICAgKiBAaGlkZQorICAgICAqIFNldHMgdGhlIG1heGltdW0gc2l6ZSBvZiB0aGUgcHJlcGFyZWQtc3RhdGVtZW50IGNhY2hlIGZvciB0aGlzIGRhdGFiYXNlLgorICAgICAqIChzaXplIG9mIHRoZSBjYWNoZSA9IG51bWJlciBvZiBjb21waWxlZC1zcWwtc3RhdGVtZW50cyBzdG9yZWQgaW4gdGhlIGNhY2hlKS4KKyAgICAgKjxwPgorICAgICAqIE1heGltdW0gY2FjaGUgc2l6ZSBjYW4gT05MWSBiZSBpbmNyZWFzZWQgZnJvbSBpdHMgY3VycmVudCBzaXplIChkZWZhdWx0ID0gMTApLgorICAgICAqIElmIHRoaXMgbWV0aG9kIGlzIGNhbGxlZCB3aXRoIHNtYWxsZXIgc2l6ZSB0aGFuIHRoZSBjdXJyZW50IG1heGltdW0gdmFsdWUsCisgICAgICogdGhlbiBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gaXMgdGhyb3duLgorICAgICAqPHA+CisgICAgICogVGhpcyBtZXRob2QgaXMgdGhyZWFkLXNhZmUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY2FjaGVTaXplIHRoZSBzaXplIG9mIHRoZSBjYWNoZS4gY2FuIGJlICgwIHRvIHtAbGluayAjTUFYX1NRTF9DQUNIRV9TSVpFfSkKKyAgICAgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBpZiBpbnB1dCBjYWNoZVNpemUgPiB7QGxpbmsgI01BWF9TUUxfQ0FDSEVfU0laRX0gb3IKKyAgICAgKiB0aGUgdmFsdWUgc2V0IHdpdGggcHJldmlvdXMgc2V0TWF4U3FsQ2FjaGVTaXplKCkgY2FsbC4KICAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0luQ29tcGlsZWRTcWxDYWNoZShTdHJpbmcgc3FsKSB7Ci0gICAgICAgIHN5bmNocm9uaXplZChtQ29tcGlsZWRRdWVyaWVzKSB7CisgICAgcHVibGljIHZvaWQgc2V0TWF4U3FsQ2FjaGVTaXplKGludCBjYWNoZVNpemUpIHsKKyAgICAgICAgc3luY2hyb25pemVkKHRoaXMpIHsKKyAgICAgICAgICAgIGlmIChjYWNoZVNpemUgPiBNQVhfU1FMX0NBQ0hFX1NJWkUgfHwgY2FjaGVTaXplIDwgMCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oImV4cGVjdGVkIHZhbHVlIGJldHdlZW4gMCBhbmQgIiArIE1BWF9TUUxfQ0FDSEVfU0laRSk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGNhY2hlU2l6ZSA8IG1NYXhTcWxDYWNoZVNpemUpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJjYW5ub3Qgc2V0IGNhY2hlU2l6ZSB0byBhIHZhbHVlIGxlc3MgdGhhbiB0aGUgdmFsdWUgIiArCisgICAgICAgICAgICAgICAgICAgICAgICAic2V0IHdpdGggcHJldmlvdXMgc2V0TWF4U3FsQ2FjaGVTaXplKCkgY2FsbC4iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1NYXhTcWxDYWNoZVNpemUgPSBjYWNoZVNpemU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBwYWNrYWdlICovIGJvb2xlYW4gaXNTcWxJblN0YXRlbWVudENhY2hlKFN0cmluZyBzcWwpIHsKKyAgICAgICAgc3luY2hyb25pemVkIChtQ29tcGlsZWRRdWVyaWVzKSB7CiAgICAgICAgICAgICByZXR1cm4gbUNvbXBpbGVkUXVlcmllcy5jb250YWluc0tleShzcWwpOwogICAgICAgICB9CiAgICAgfQogCi0gICAgLyoqCi0gICAgICogcHVyZ2VzIHRoZSBnaXZlbiBzcWwgZnJvbSB0aGUgY29tcGlsZWQtc3FsIGNhY2hlLgotICAgICAqIEBoaWRlCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcHVyZ2VGcm9tQ29tcGlsZWRTcWxDYWNoZShTdHJpbmcgc3FsKSB7Ci0gICAgICAgIHN5bmNocm9uaXplZChtQ29tcGlsZWRRdWVyaWVzKSB7Ci0gICAgICAgICAgICBtQ29tcGlsZWRRdWVyaWVzLnJlbW92ZShzcWwpOworICAgIHByaXZhdGUgc3luY2hyb25pemVkIGJvb2xlYW4gaXNDYWNoZUZ1bGxXYXJuaW5nTG9nZ2VkKCkgeworICAgICAgICByZXR1cm4gbUNhY2hlRnVsbFdhcm5pbmc7CisgICAgfQorCisgICAgcHJpdmF0ZSBzeW5jaHJvbml6ZWQgdm9pZCBzZXRDYWNoZUZ1bGxXYXJuaW5nTG9nZ2VkKCkgeworICAgICAgICBtQ2FjaGVGdWxsV2FybmluZyA9IHRydWU7CisgICAgfQorCisgICAgcHJpdmF0ZSBzeW5jaHJvbml6ZWQgaW50IGdldENhY2hlSGl0TnVtKCkgeworICAgICAgICByZXR1cm4gbU51bUNhY2hlSGl0czsKKyAgICB9CisKKyAgICBwcml2YXRlIHN5bmNocm9uaXplZCBpbnQgZ2V0Q2FjaGVNaXNzTnVtKCkgeworICAgICAgICByZXR1cm4gbU51bUNhY2hlTWlzc2VzOworICAgIH0KKworICAgIHByaXZhdGUgc3luY2hyb25pemVkIGludCBnZXRDYWNoZXNpemUoKSB7CisgICAgICAgIHJldHVybiBtQ29tcGlsZWRRdWVyaWVzLnNpemUoKTsKKyAgICB9CisKKyAgICAvKiBwYWNrYWdlICovIHZvaWQgZmluYWxpemVTdGF0ZW1lbnRMYXRlcihpbnQgaWQpIHsKKyAgICAgICAgaWYgKCFpc09wZW4oKSkgeworICAgICAgICAgICAgLy8gZGF0YWJhc2UgYWxyZWFkeSBjbG9zZWQuIHRoaXMgc3RhdGVtZW50IHdpbGwgYWxyZWFkeSBoYXZlIGJlZW4gZmluYWxpemVkLgorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIHN5bmNocm9uaXplZChtQ2xvc2VkU3RhdGVtZW50SWRzKSB7CisgICAgICAgICAgICBpZiAobUNsb3NlZFN0YXRlbWVudElkcy5jb250YWlucyhpZCkpIHsKKyAgICAgICAgICAgICAgICAvLyB0aGlzIHN0YXRlbWVudCBpZCBpcyBhbHJlYWR5IHF1ZXVlZCB1cCBmb3IgZmluYWxpemF0aW9uLgorICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1DbG9zZWRTdGF0ZW1lbnRJZHMuYWRkKGlkKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIHBhY2thZ2UgKi8gdm9pZCBjbG9zZVBlbmRpbmdTdGF0ZW1lbnRzKCkgeworICAgICAgICBpZiAoIWlzT3BlbigpKSB7CisgICAgICAgICAgICAvLyBzaW5jZSB0aGlzIGRhdGFiYXNlIGlzIGFscmVhZHkgY2xvc2VkLCBubyBuZWVkIHRvIGZpbmFsaXplIGFueXRoaW5nLgorICAgICAgICAgICAgbUNsb3NlZFN0YXRlbWVudElkcy5jbGVhcigpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIHZlcmlmeUxvY2tPd25lcigpOworICAgICAgICAvKiB0byBtaW5pbWl6ZSBzeW5jaHJvbml6YXRpb24gb24gbUNsb3NlZFN0YXRlbWVudElkcywgbWFrZSBhIGNvcHkgb2YgdGhlIGxpc3QgKi8KKyAgICAgICAgQXJyYXlMaXN0PEludGVnZXI+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PEludGVnZXI+KG1DbG9zZWRTdGF0ZW1lbnRJZHMuc2l6ZSgpKTsKKyAgICAgICAgc3luY2hyb25pemVkKG1DbG9zZWRTdGF0ZW1lbnRJZHMpIHsKKyAgICAgICAgICAgIGxpc3QuYWRkQWxsKG1DbG9zZWRTdGF0ZW1lbnRJZHMpOworICAgICAgICAgICAgbUNsb3NlZFN0YXRlbWVudElkcy5jbGVhcigpOworICAgICAgICB9CisgICAgICAgIC8vIGZpbmFsaXplIGFsbCB0aGUgc3RhdGVtZW50cyBmcm9tIHRoZSBjb3BpZWQgbGlzdAorICAgICAgICBpbnQgc2l6ZSA9IGxpc3Quc2l6ZSgpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgeworICAgICAgICAgICAgbmF0aXZlX2ZpbmFsaXplKGxpc3QuZ2V0KGkpKTsKICAgICAgICAgfQogICAgIH0KIAogICAgIC8qKgotICAgICAqIHJlbW92ZSBldmVyeXRoaW5nIGZyb20gdGhlIGNvbXBpbGVkIHNxbCBjYWNoZQorICAgICAqIGZvciB0ZXN0aW5nIG9ubHkKKyAgICAgKi8KKyAgICAvKiBwYWNrYWdlICovIEFycmF5TGlzdDxJbnRlZ2VyPiBnZXRRdWV1ZWRVcFN0bXRMaXN0KCkgeworICAgICAgICByZXR1cm4gbUNsb3NlZFN0YXRlbWVudElkczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGlzIG1ldGhvZCBlbmFibGVzIHBhcmFsbGVsIGV4ZWN1dGlvbiBvZiBxdWVyaWVzIGZyb20gbXVsdGlwbGUgdGhyZWFkcyBvbiB0aGUgc2FtZSBkYXRhYmFzZS4KKyAgICAgKiBJdCBkb2VzIHRoaXMgYnkgb3BlbmluZyBtdWx0aXBsZSBoYW5kbGVzIHRvIHRoZSBkYXRhYmFzZSBhbmQgdXNpbmcgYSBkaWZmZXJlbnQKKyAgICAgKiBkYXRhYmFzZSBoYW5kbGUgZm9yIGVhY2ggcXVlcnkuCisgICAgICogPHA+CisgICAgICogSWYgYSB0cmFuc2FjdGlvbiBpcyBpbiBwcm9ncmVzcyBvbiBvbmUgY29ubmVjdGlvbiBoYW5kbGUgYW5kIHNheSwgYSB0YWJsZSBpcyB1cGRhdGVkIGluIHRoZQorICAgICAqIHRyYW5zYWN0aW9uLCB0aGVuIHF1ZXJ5IG9uIHRoZSBzYW1lIHRhYmxlIG9uIGFub3RoZXIgY29ubmVjdGlvbiBoYW5kbGUgd2lsbCBibG9jayBmb3IgdGhlCisgICAgICogdHJhbnNhY3Rpb24gdG8gY29tcGxldGUuIEJ1dCB0aGlzIG1ldGhvZCBlbmFibGVzIHN1Y2ggcXVlcmllcyB0byBleGVjdXRlIGJ5IGhhdmluZyB0aGVtCisgICAgICogcmV0dXJuIG9sZCB2ZXJzaW9uIG9mIHRoZSBkYXRhIGZyb20gdGhlIHRhYmxlLiBNb3N0IG9mdGVuIGl0IGlzIHRoZSBkYXRhIHRoYXQgZXhpc3RlZCBpbiB0aGUKKyAgICAgKiB0YWJsZSBwcmlvciB0byB0aGUgYWJvdmUgdHJhbnNhY3Rpb24gdXBkYXRlcyBvbiB0aGF0IHRhYmxlLgorICAgICAqIDxwPgorICAgICAqIE1heGltdW0gbnVtYmVyIG9mIHNpbXVsdGFuZW91cyBoYW5kbGVzIHVzZWQgdG8gZXhlY3V0ZSBxdWVyaWVzIGluIHBhcmFsbGVsIGlzCisgICAgICogZGVwZW5kZW50IHVwb24gdGhlIGRldmljZSBtZW1vcnkgYW5kIHBvc3NpYmx5IG90aGVyIHByb3BlcnRpZXMuCisgICAgICogPHA+CisgICAgICogQWZ0ZXIgY2FsbGluZyB0aGlzIG1ldGhvZCwgZXhlY3V0aW9uIG9mIHF1ZXJpZXMgaW4gcGFyYWxsZWwgaXMgZW5hYmxlZCBhcyBsb25nIGFzIHRoaXMKKyAgICAgKiBkYXRhYmFzZSBoYW5kbGUgaXMgb3Blbi4gVG8gZGlzYWJsZSBleGVjdXRpb24gb2YgcXVlcmllcyBpbiBwYXJhbGxlbCwgZGF0YWJhc2Ugc2hvdWxkCisgICAgICogYmUgY2xvc2VkIGFuZCByZW9wZW5lZC4KKyAgICAgKiA8cD4KKyAgICAgKiBJZiBhIHF1ZXJ5IGlzIHBhcnQgb2YgYSB0cmFuc2FjdGlvbiwgdGhlbiBpdCBpcyBleGVjdXRlZCBvbiB0aGUgc2FtZSBkYXRhYmFzZSBoYW5kbGUgdGhlCisgICAgICogdHJhbnNhY3Rpb24gd2FzIGJlZ3VuLgorICAgICAqIDxwPgorICAgICAqIElmIHRoZSBkYXRhYmFzZSBoYXMgYW55IGF0dGFjaGVkIGRhdGFiYXNlcywgdGhlbiBleGVjdXRpb24gb2YgcXVlcmllcyBpbiBwYXJhbGVsIGlzIE5PVAorICAgICAqIHBvc3NpYmxlLiBJbiBzdWNoIGNhc2VzLCBhIG1lc3NhZ2UgaXMgcHJpbnRlZCB0byBsb2djYXQgYW5kIGZhbHNlIGlzIHJldHVybmVkLgorICAgICAqIDxwPgorICAgICAqIFRoaXMgZmVhdHVyZSBpcyBub3QgYXZhaWxhYmxlIGZvciA6bWVtb3J5OiBkYXRhYmFzZXMuIEluIHN1Y2ggY2FzZXMsCisgICAgICogYSBtZXNzYWdlIGlzIHByaW50ZWQgdG8gbG9nY2F0IGFuZCBmYWxzZSBpcyByZXR1cm5lZC4KKyAgICAgKiA8cD4KKyAgICAgKiBBIHR5cGljYWwgd2F5IHRvIHVzZSB0aGlzIG1ldGhvZCBpcyB0aGUgZm9sbG93aW5nOgorICAgICAqIDxwcmU+CisgICAgICogICAgIFNRTGl0ZURhdGFiYXNlIGRiID0gU1FMaXRlRGF0YWJhc2Uub3BlbkRhdGFiYXNlKCJkYl9maWxlbmFtZSIsIGN1cnNvckZhY3RvcnksCisgICAgICogICAgICAgICAgICAgQ1JFQVRFX0lGX05FQ0VTU0FSWSwgbXlEYXRhYmFzZUVycm9ySGFuZGxlcik7CisgICAgICogICAgIGRiLmVuYWJsZVdyaXRlQWhlYWRMb2dnaW5nKCk7CisgICAgICogPC9wcmU+CisgICAgICogPHA+CisgICAgICogV3JpdGVycyBzaG91bGQgdXNlIHtAbGluayAjYmVnaW5UcmFuc2FjdGlvbk5vbkV4Y2x1c2l2ZSgpfSBvcgorICAgICAqIHtAbGluayAjYmVnaW5UcmFuc2FjdGlvbldpdGhMaXN0ZW5lck5vbkV4Y2x1c2l2ZShTUUxpdGVUcmFuc2FjdGlvbkxpc3RlbmVyKX0KKyAgICAgKiB0byBzdGFydCBhIHRyc25zYWN0aW9uLgorICAgICAqIE5vbi1leGNsdXNpdmUgbW9kZSBhbGxvd3MgZGF0YWJhc2UgZmlsZSB0byBiZSBpbiByZWFkYWJsZSBieSB0aHJlYWRzIGV4ZWN1dGluZyBxdWVyaWVzLgorICAgICAqIDwvcD4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB3cml0ZS1haGVhZC1sb2dnaW5nIGlzIHNldC4gZmFsc2Ugb3RoZXJ3aXNlCisgICAgICovCisgICAgcHVibGljIHN5bmNocm9uaXplZCBib29sZWFuIGVuYWJsZVdyaXRlQWhlYWRMb2dnaW5nKCkgeworICAgICAgICBpZiAobVBhdGguZXF1YWxzSWdub3JlQ2FzZShNRU1PUllfREJfUEFUSCkpIHsKKyAgICAgICAgICAgIExvZy5pKFRBRywgImNhbid0IGVuYWJsZSBXQUwgZm9yIG1lbW9yeSBkYXRhYmFzZXMuIik7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICAvLyBtYWtlIHN1cmUgdGhpcyBkYXRhYmFzZSBoYXMgTk8gYXR0YWNoZWQgZGF0YWJhc2VzIGJlY2F1c2Ugc3FsaXRlJ3Mgd3JpdGUtYWhlYWQtbG9nZ2luZworICAgICAgICAvLyBkb2Vzbid0IHdvcmsgZm9yIGRhdGFiYXNlcyB3aXRoIGF0dGFjaGVkIGRhdGFiYXNlcworICAgICAgICBpZiAoZ2V0QXR0YWNoZWREYnMoKS5zaXplKCkgPiAxKSB7CisgICAgICAgICAgICBpZiAoTG9nLmlzTG9nZ2FibGUoVEFHLCBMb2cuREVCVUcpKSB7CisgICAgICAgICAgICAgICAgTG9nLmQoVEFHLAorICAgICAgICAgICAgICAgICAgICAgICAgInRoaXMgZGF0YWJhc2U6ICIgKyBtUGF0aCArICIgaGFzIGF0dGFjaGVkIGRhdGFiYXNlcy4gY2FuJ3QgIGVuYWJsZSBXQUwuIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1Db25uZWN0aW9uUG9vbCA9PSBudWxsKSB7CisgICAgICAgICAgICBtQ29ubmVjdGlvblBvb2wgPSBuZXcgRGF0YWJhc2VDb25uZWN0aW9uUG9vbCh0aGlzKTsKKyAgICAgICAgICAgIHNldEpvdXJuYWxNb2RlKG1QYXRoLCAiV0FMIik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhpcyBtZXRob2QgZGlzYWJsZXMgdGhlIGZlYXR1cmVzIGVuYWJsZWQgYnkge0BsaW5rICNlbmFibGVXcml0ZUFoZWFkTG9nZ2luZygpfS4KICAgICAgKiBAaGlkZQogICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHJlc2V0Q29tcGlsZWRTcWxDYWNoZSgpIHsKLSAgICAgICAgc3luY2hyb25pemVkKG1Db21waWxlZFF1ZXJpZXMpIHsKLSAgICAgICAgICAgIG1Db21waWxlZFF1ZXJpZXMuY2xlYXIoKTsKKyAgICBwdWJsaWMgdm9pZCBkaXNhYmxlV3JpdGVBaGVhZExvZ2dpbmcoKSB7CisgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgeworICAgICAgICAgICAgaWYgKG1Db25uZWN0aW9uUG9vbCA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbUNvbm5lY3Rpb25Qb29sLmNsb3NlKCk7CisgICAgICAgICAgICBtQ29ubmVjdGlvblBvb2wgPSBudWxsOworICAgICAgICAgICAgc2V0Sm91cm5hbE1vZGUobVBhdGgsICJUUlVOQ0FURSIpOworICAgICAgICB9CisgICAgfQorCisgICAgLyogcGFja2FnZSAqLyBTUUxpdGVEYXRhYmFzZSBnZXREYXRhYmFzZUhhbmRsZShTdHJpbmcgc3FsKSB7CisgICAgICAgIGlmIChpc1Bvb2xlZENvbm5lY3Rpb24oKSkgeworICAgICAgICAgICAgLy8gdGhpcyBpcyBhIHBvb2xlZCBkYXRhYmFzZSBjb25uZWN0aW9uCisgICAgICAgICAgICAvLyB1c2UgaXQgaWYgaXQgaXMgb3BlbiBBTkQgaWYgSSBhbSBub3QgY3VycmVudGx5IHBhcnQgb2YgYSB0cmFuc2FjdGlvbgorICAgICAgICAgICAgaWYgKGlzT3BlbigpICYmICFhbUlJblRyYW5zYWN0aW9uKCkpIHsKKyAgICAgICAgICAgICAgICAvLyBUT0RPOiB1c2UgYW5vdGhlciBjb25uZWN0aW9uIGZyb20gdGhlIHBvb2wKKyAgICAgICAgICAgICAgICAvLyBpZiB0aGlzIGNvbm5lY3Rpb24gaXMgY3VycmVudGx5IGluIHVzZSBieSBzb21lIG90aGVyIHRocmVhZAorICAgICAgICAgICAgICAgIC8vIEFORCBpZiB0aGVyZSBhcmUgZnJlZSBjb25uZWN0aW9ucyBpbiB0aGUgcG9vbAorICAgICAgICAgICAgICAgIHJldHVybiB0aGlzOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvLyB0aGUgcG9vbGVkIGNvbm5lY3Rpb24gaXMgbm90IG9wZW4hIGNvdWxkIGhhdmUgYmVlbiBjbG9zZWQgZWl0aGVyIGR1ZQorICAgICAgICAgICAgICAgIC8vIHRvIGNvcnJ1cHRpb24gb24gdGhpcyBvciBzb21lIG90aGVyIGNvbm5lY3Rpb24gdG8gdGhlIGRhdGFiYXNlCisgICAgICAgICAgICAgICAgLy8gT1IsIG1heWJlIHRoZSBjb25uZWN0aW9uIHBvb2wgaXMgZGlzYWJsZWQgYWZ0ZXIgdGhpcyBjb25uZWN0aW9uIGhhcyBiZWVuCisgICAgICAgICAgICAgICAgLy8gYWxsb2NhdGVkIHRvIG1lLiB0cnkgdG8gZ2V0IHNvbWUgb3RoZXIgcG9vbGVkIG9yIG1haW4gZGF0YWJhc2UgY29ubmVjdGlvbgorICAgICAgICAgICAgICAgIHJldHVybiBnZXRQYXJlbnREYkNvbm5PYmooKS5nZXREYkNvbm5lY3Rpb24oc3FsKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIHRoaXMgaXMgTk9UIGEgcG9vbGVkIGNvbm5lY3Rpb24uIGNhbiB3ZSBnZXQgb25lPworICAgICAgICAgICAgcmV0dXJuIGdldERiQ29ubmVjdGlvbihzcWwpOwogICAgICAgICB9CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogcmV0dXJuIHRoZSBjdXJyZW50IG1heENhY2hlU3FsQ2FjaGVTaXplCi0gICAgICogQGhpZGUKKyAgICAgKiBTZXRzIHRoZSBkYXRhYmFzZSBjb25uZWN0aW9uIGhhbmRsZSBwb29sIHNpemUgdG8gdGhlIGdpdmVuIHZhbHVlLgorICAgICAqIERhdGFiYXNlIGNvbm5lY3Rpb24gaGFuZGxlIHBvb2wgaXMgZW5hYmxlZCB3aGVuIHRoZSBhcHAgY2FsbHMKKyAgICAgKiB7QGxpbmsgI2VuYWJsZVdyaXRlQWhlYWRMb2dnaW5nKCl9LgorICAgICAqIDxwPgorICAgICAqIFRoZSBkZWZhdWx0IGNvbm5lY3Rpb24gaGFuZGxlIHBvb2wgaXMgc2V0IGJ5IHRoZSBzeXN0ZW0gYnkgdGFraW5nIGludG8gYWNjb3VudCB2YXJpb3VzCisgICAgICogYXNwZWN0cyBvZiB0aGUgZGV2aWNlLCBzdWNoIGFzIG1lbW9yeSwgbnVtYmVyIG9mIGNvcmVzIGV0Yy4gSXQgaXMgcmVjb21tZW5kZWQgdGhhdAorICAgICAqIGFwcGxpY2F0aW9ucyB1c2UgdGhlIGRlZmF1bHQgcG9vbCBzaXplIHNldCBieSB0aGUgc3lzdGVtLgorICAgICAqCisgICAgICogQHBhcmFtIHNpemUgdGhlIHZhbHVlIHRoZSBjb25uZWN0aW9uIGhhbmRsZSBwb29sIHNpemUgc2hvdWxkIGJlIHNldCB0by4KICAgICAgKi8KLSAgICBwdWJsaWMgc3luY2hyb25pemVkIGludCBnZXRNYXhTcWxDYWNoZVNpemUoKSB7Ci0gICAgICAgIHJldHVybiBtTWF4U3FsQ2FjaGVTaXplOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIHNldCB0aGUgbWF4IHNpemUgb2YgdGhlIGNvbXBpbGVkIHNxbCBjYWNoZSBmb3IgdGhpcyBkYXRhYmFzZSBhZnRlciBwdXJnaW5nIHRoZSBjYWNoZS4KLSAgICAgKiAoc2l6ZSBvZiB0aGUgY2FjaGUgPSBudW1iZXIgb2YgY29tcGlsZWQtc3FsLXN0YXRlbWVudHMgc3RvcmVkIGluIHRoZSBjYWNoZSkuCi0gICAgICoKLSAgICAgKiBtYXggY2FjaGUgc2l6ZSBjYW4gT05MWSBiZSBpbmNyZWFzZWQgZnJvbSBpdHMgY3VycmVudCBzaXplIChkZWZhdWx0ID0gMCkuCi0gICAgICogaWYgdGhpcyBtZXRob2QgaXMgY2FsbGVkIHdpdGggc21hbGxlciBzaXplIHRoYW4gdGhlIGN1cnJlbnQgdmFsdWUgb2YgbU1heFNxbENhY2hlU2l6ZSwKLSAgICAgKiB0aGVuIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBpcyB0aHJvd24KLSAgICAgKgotICAgICAqIHN5bmNocm9uaXplZCBiZWNhdXNlIHdlIGRvbid0IHdhbnQgdCB0aHJlYWRzIHRvIGNoYW5nZSBjYWNoZSBzaXplIGF0IHRoZSBzYW1lIHRpbWUuCi0gICAgICogQHBhcmFtIGNhY2hlU2l6ZSB0aGUgc2l6ZSBvZiB0aGUgY2FjaGUuIGNhbiBiZSAoMCB0byBNQVhfU1FMX0NBQ0hFX1NJWkUpCi0gICAgICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gaWYgaW5wdXQgY2FjaGVTaXplID4gTUFYX1NRTF9DQUNIRV9TSVpFIG9yIDwgMCBvcgotICAgICAqIDwgdGhlIHZhbHVlIHNldCB3aXRoIHByZXZpb3VzIHNldE1heFNxbENhY2hlU2l6ZSgpIGNhbGwuCi0gICAgICoKLSAgICAgKiBAaGlkZQotICAgICAqLwotICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBzZXRNYXhTcWxDYWNoZVNpemUoaW50IGNhY2hlU2l6ZSkgewotICAgICAgICBpZiAoY2FjaGVTaXplID4gTUFYX1NRTF9DQUNIRV9TSVpFIHx8IGNhY2hlU2l6ZSA8IDApIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oImV4cGVjdGVkIHZhbHVlIGJldHdlZW4gMCBhbmQgIiArIE1BWF9TUUxfQ0FDSEVfU0laRSk7Ci0gICAgICAgIH0gZWxzZSBpZiAoY2FjaGVTaXplIDwgbU1heFNxbENhY2hlU2l6ZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiY2Fubm90IHNldCBjYWNoZVNpemUgdG8gYSB2YWx1ZSBsZXNzIHRoYW4gdGhlIHZhbHVlICIgKwotICAgICAgICAgICAgICAgICAgICAic2V0IHdpdGggcHJldmlvdXMgc2V0TWF4U3FsQ2FjaGVTaXplKCkgY2FsbC4iKTsKKyAgICBwdWJsaWMgdm9pZCBzZXRDb25uZWN0aW9uUG9vbFNpemUoaW50IHNpemUpIHsKKyAgICAgICAgc3luY2hyb25pemVkKHRoaXMpIHsKKyAgICAgICAgICAgIGlmIChtQ29ubmVjdGlvblBvb2wgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oImNvbm5lY3Rpb24gcG9vbCBub3QgZW5hYmxlZCIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaW50IGkgPSBtQ29ubmVjdGlvblBvb2wuZ2V0TWF4UG9vbFNpemUoKTsKKyAgICAgICAgICAgIGlmIChzaXplIDwgaSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICAgICAiY2Fubm90IHNldCBtYXggcG9vbCBzaXplIHRvIGEgdmFsdWUgbGVzcyB0aGFuIHRoZSBjdXJyZW50IG1heCB2YWx1ZSg9IiArCisgICAgICAgICAgICAgICAgICAgICAgICBpICsgIikiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1Db25uZWN0aW9uUG9vbC5zZXRNYXhQb29sU2l6ZShzaXplKTsKICAgICAgICAgfQotICAgICAgICBtTWF4U3FsQ2FjaGVTaXplID0gY2FjaGVTaXplOwogICAgIH0KIAotICAgIHN0YXRpYyBjbGFzcyBBY3RpdmVEYXRhYmFzZXMgewotICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBBY3RpdmVEYXRhYmFzZXMgYWN0aXZlRGF0YWJhc2VzID0gbmV3IEFjdGl2ZURhdGFiYXNlcygpOwotICAgICAgICBwcml2YXRlIEhhc2hTZXQ8V2Vha1JlZmVyZW5jZTxTUUxpdGVEYXRhYmFzZT4+IG1BY3RpdmVEYXRhYmFzZXMgPQotICAgICAgICAgICAgbmV3IEhhc2hTZXQ8V2Vha1JlZmVyZW5jZTxTUUxpdGVEYXRhYmFzZT4+KCk7Ci0gICAgICAgIHByaXZhdGUgQWN0aXZlRGF0YWJhc2VzKCkge30gLy8gZGlzYWJsZSBpbnN0YW50aWF0aW9uIG9mIHRoaXMgY2xhc3MKLSAgICAgICAgc3RhdGljIEFjdGl2ZURhdGFiYXNlcyBnZXRJbnN0YW5jZSgpIHtyZXR1cm4gYWN0aXZlRGF0YWJhc2VzO30KKyAgICAvKiBwYWNrYWdlICovIFNRTGl0ZURhdGFiYXNlIGNyZWF0ZVBvb2xDb25uZWN0aW9uKHNob3J0IGNvbm5lY3Rpb25OdW0pIHsKKyAgICAgICAgU1FMaXRlRGF0YWJhc2UgZGIgPSBvcGVuRGF0YWJhc2UobVBhdGgsIG1GYWN0b3J5LCBtRmxhZ3MsIG1FcnJvckhhbmRsZXIsIGNvbm5lY3Rpb25OdW0pOworICAgICAgICBkYi5tUGFyZW50Q29ubk9iaiA9IHRoaXM7CisgICAgICAgIHJldHVybiBkYjsKKyAgICB9CisKKyAgICBwcml2YXRlIHN5bmNocm9uaXplZCBTUUxpdGVEYXRhYmFzZSBnZXRQYXJlbnREYkNvbm5PYmooKSB7CisgICAgICAgIHJldHVybiBtUGFyZW50Q29ubk9iajsKKyAgICB9CisKKyAgICBwcml2YXRlIGJvb2xlYW4gaXNQb29sZWRDb25uZWN0aW9uKCkgeworICAgICAgICByZXR1cm4gdGhpcy5tQ29ubmVjdGlvbk51bSA+IDA7CisgICAgfQorCisgICAgLyogcGFja2FnZSAqLyBTUUxpdGVEYXRhYmFzZSBnZXREYkNvbm5lY3Rpb24oU3RyaW5nIHNxbCkgeworICAgICAgICB2ZXJpZnlEYklzT3BlbigpOworICAgICAgICAvLyB0aGlzIG1ldGhvZCBzaG91bGQgYWx3YXlzIGJlIGNhbGxlZCB3aXRoIG1haW4gZGF0YWJhc2UgY29ubmVjdGlvbiBoYW5kbGUuCisgICAgICAgIC8vIHRoZSBvbmx5IHRpbWUgd2hlbiBpdCBpcyBjYWxsZWQgd2l0aCBwb29sZWQgZGF0YWJhc2UgY29ubmVjdGlvbiBoYW5kbGUgaXMKKyAgICAgICAgLy8gY29ycnVwdGlvbiBvY2N1cnMgd2hpbGUgdHJ5aW5nIHRvIG9wZW4gYSBwb29sZWQgZGF0YWJhc2UgY29ubmVjdGlvbiBoYW5kbGUuCisgICAgICAgIC8vIGluIHRoYXQgY2FzZSwgc2ltcGx5IHJldHVybiAndGhpcycgaGFuZGxlCisgICAgICAgIGlmIChpc1Bvb2xlZENvbm5lY3Rpb24oKSkgeworICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICAgIH0KKworICAgICAgICAvLyB1c2UgdGhlIGN1cnJlbnQgY29ubmVjdGlvbiBoYW5kbGUgaWYKKyAgICAgICAgLy8gMS4gaWYgdGhlIGNhbGxlciBpcyBwYXJ0IG9mIHRoZSBvbmdvaW5nIHRyYW5zYWN0aW9uLCBpZiBhbnkKKyAgICAgICAgLy8gMi4gT1IsIGlmIHRoZXJlIGlzIE5PIGNvbm5lY3Rpb24gaGFuZGxlIHBvb2wgc2V0dXAKKyAgICAgICAgaWYgKGFtSUluVHJhbnNhY3Rpb24oKSB8fCBtQ29ubmVjdGlvblBvb2wgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBnZXQgYSBjb25uZWN0aW9uIGhhbmRsZSBmcm9tIHRoZSBwb29sCisgICAgICAgICAgICBpZiAoTG9nLmlzTG9nZ2FibGUoVEFHLCBMb2cuREVCVUcpKSB7CisgICAgICAgICAgICAgICAgYXNzZXJ0IG1Db25uZWN0aW9uUG9vbCAhPSBudWxsOworICAgICAgICAgICAgICAgIExvZy5pKFRBRywgbUNvbm5lY3Rpb25Qb29sLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIG1Db25uZWN0aW9uUG9vbC5nZXQoc3FsKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCByZWxlYXNlRGJDb25uZWN0aW9uKFNRTGl0ZURhdGFiYXNlIGRiKSB7CisgICAgICAgIC8vIGlnbm9yZSB0aGlzIHJlbGVhc2UgY2FsbCBpZgorICAgICAgICAvLyAxLiB0aGUgZGF0YWJhc2UgaXMgY2xvc2VkCisgICAgICAgIC8vIDIuIE9SLCBpZiBkYiBpcyBOT1QgYSBwb29sZWQgY29ubmVjdGlvbiBoYW5kbGUKKyAgICAgICAgLy8gMy4gT1IsIGlmIHRoZSBkYXRhYmFzZSBiZWluZyByZWxlYXNlZCBpcyBzYW1lIGFzICd0aGlzJyAodGhpcyBjb25kaXRpb24gbWVhbnMKKyAgICAgICAgLy8gICAgIHRoYXQgd2Ugc2hvdWxkIGFsd2F5cyBiZSByZWxlYXNpbmcgYSBwb29sZWQgY29ubmVjdGlvbiBoYW5kbGUgYnkgY2FsbGluZyB0aGlzIG1ldGhvZAorICAgICAgICAvLyAgICAgZnJvbSB0aGUgJ21haW4nIGNvbm5lY3Rpb24gaGFuZGxlCisgICAgICAgIGlmICghaXNPcGVuKCkgfHwgIWRiLmlzUG9vbGVkQ29ubmVjdGlvbigpIHx8IChkYiA9PSB0aGlzKSkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGlmIChMb2cuaXNMb2dnYWJsZShUQUcsIExvZy5ERUJVRykpIHsKKyAgICAgICAgICAgIGFzc2VydCBpc1Bvb2xlZENvbm5lY3Rpb24oKTsKKyAgICAgICAgICAgIGFzc2VydCBtQ29ubmVjdGlvblBvb2wgIT0gbnVsbDsKKyAgICAgICAgICAgIExvZy5kKFRBRywgInJlbGVhc2VEYkNvbm5lY3Rpb24gdGhyZWFkaWQgPSAiICsgVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXRJZCgpICsKKyAgICAgICAgICAgICAgICAgICAgIiwgcmVsZWFzaW5nICMgIiArIGRiLm1Db25uZWN0aW9uTnVtICsgIiwgIiArIGdldFBhdGgoKSk7CisgICAgICAgIH0KKyAgICAgICAgbUNvbm5lY3Rpb25Qb29sLnJlbGVhc2UoZGIpOwogICAgIH0KIAogICAgIC8qKgogICAgICAqIHRoaXMgbWV0aG9kIGlzIHVzZWQgdG8gY29sbGVjdCBkYXRhIGFib3V0IEFMTCBvcGVuIGRhdGFiYXNlcyBpbiB0aGUgY3VycmVudCBwcm9jZXNzLgotICAgICAqIGJ1Z3JlcG9ydCBpcyBhIHVzZXIgb2YgdGhpcyBkYXRhLiAKKyAgICAgKiBidWdyZXBvcnQgaXMgYSB1c2VyIG9mIHRoaXMgZGF0YS4KICAgICAgKi8KICAgICAvKiBwYWNrYWdlICovIHN0YXRpYyBBcnJheUxpc3Q8RGJTdGF0cz4gZ2V0RGJTdGF0cygpIHsKICAgICAgICAgQXJyYXlMaXN0PERiU3RhdHM+IGRiU3RhdHNMaXN0ID0gbmV3IEFycmF5TGlzdDxEYlN0YXRzPigpOwotICAgICAgICBmb3IgKFdlYWtSZWZlcmVuY2U8U1FMaXRlRGF0YWJhc2U+IHcgOiBBY3RpdmVEYXRhYmFzZXMuZ2V0SW5zdGFuY2UoKS5tQWN0aXZlRGF0YWJhc2VzKSB7CisgICAgICAgIC8vIG1ha2UgYSBsb2NhbCBjb3B5IG9mIG1BY3RpdmVEYXRhYmFzZXMgLSBzbyB0aGF0IHRoaXMgbWV0aG9kIGlzIG5vdCBjb21wZXRpbmcKKyAgICAgICAgLy8gZm9yIHN5bmNocm9uaXphdGlvbiBsb2NrIG9uIG1BY3RpdmVEYXRhYmFzZXMKKyAgICAgICAgQXJyYXlMaXN0PFdlYWtSZWZlcmVuY2U8U1FMaXRlRGF0YWJhc2U+PiB0ZW1wTGlzdDsKKyAgICAgICAgc3luY2hyb25pemVkKG1BY3RpdmVEYXRhYmFzZXMpIHsKKyAgICAgICAgICAgIHRlbXBMaXN0ID0gKEFycmF5TGlzdDxXZWFrUmVmZXJlbmNlPFNRTGl0ZURhdGFiYXNlPj4pbUFjdGl2ZURhdGFiYXNlcy5jbG9uZSgpOworICAgICAgICB9CisgICAgICAgIGZvciAoV2Vha1JlZmVyZW5jZTxTUUxpdGVEYXRhYmFzZT4gdyA6IHRlbXBMaXN0KSB7CiAgICAgICAgICAgICBTUUxpdGVEYXRhYmFzZSBkYiA9IHcuZ2V0KCk7CiAgICAgICAgICAgICBpZiAoZGIgPT0gbnVsbCB8fCAhZGIuaXNPcGVuKCkpIHsKICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIGdldCBTUUxJVEVfREJTVEFUVVNfTE9PS0FTSURFX1VTRUQgZm9yIHRoZSBkYgotICAgICAgICAgICAgaW50IGxvb2thc2lkZVVzZWQgPSBkYi5uYXRpdmVfZ2V0RGJMb29rYXNpZGUoKTsKIAotICAgICAgICAgICAgLy8gZ2V0IHRoZSBsYXN0bm9kZSBvZiB0aGUgZGJuYW1lCi0gICAgICAgICAgICBTdHJpbmcgcGF0aCA9IGRiLmdldFBhdGgoKTsKLSAgICAgICAgICAgIGludCBpbmR4ID0gcGF0aC5sYXN0SW5kZXhPZigiLyIpOwotICAgICAgICAgICAgU3RyaW5nIGxhc3Rub2RlID0gcGF0aC5zdWJzdHJpbmcoKGluZHggIT0gLTEpID8gKytpbmR4IDogMCk7CisgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKGRiKSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgLy8gZ2V0IFNRTElURV9EQlNUQVRVU19MT09LQVNJREVfVVNFRCBmb3IgdGhlIGRiCisgICAgICAgICAgICAgICAgICAgIGludCBsb29rYXNpZGVVc2VkID0gZGIubmF0aXZlX2dldERiTG9va2FzaWRlKCk7CiAKLSAgICAgICAgICAgIC8vIGdldCBsaXN0IG9mIGF0dGFjaGVkIGRicyBhbmQgZm9yIGVhY2ggZGIsIGdldCBpdHMgc2l6ZSBhbmQgcGFnZXNpemUKLSAgICAgICAgICAgIEFycmF5TGlzdDxQYWlyPFN0cmluZywgU3RyaW5nPj4gYXR0YWNoZWREYnMgPSBnZXRBdHRhY2hlZERicyhkYik7Ci0gICAgICAgICAgICBpZiAoYXR0YWNoZWREYnMgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhdHRhY2hlZERicy5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgICAgIFBhaXI8U3RyaW5nLCBTdHJpbmc+IHAgPSBhdHRhY2hlZERicy5nZXQoaSk7Ci0gICAgICAgICAgICAgICAgbG9uZyBwYWdlQ291bnQgPSBnZXRQcmFnbWFWYWwoZGIsIHAuZmlyc3QgKyAiLnBhZ2VfY291bnQ7Iik7CisgICAgICAgICAgICAgICAgICAgIC8vIGdldCB0aGUgbGFzdG5vZGUgb2YgdGhlIGRibmFtZQorICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcGF0aCA9IGRiLmdldFBhdGgoKTsKKyAgICAgICAgICAgICAgICAgICAgaW50IGluZHggPSBwYXRoLmxhc3RJbmRleE9mKCIvIik7CisgICAgICAgICAgICAgICAgICAgIFN0cmluZyBsYXN0bm9kZSA9IHBhdGguc3Vic3RyaW5nKChpbmR4ICE9IC0xKSA/ICsraW5keCA6IDApOwogCi0gICAgICAgICAgICAgICAgLy8gZmlyc3QgZW50cnkgaW4gdGhlIGF0dGFjaGVkIGRiIGxpc3QgaXMgYWx3YXlzIHRoZSBtYWluIGRhdGFiYXNlCi0gICAgICAgICAgICAgICAgLy8gZG9uJ3Qgd29ycnkgYWJvdXQgcHJlZml4aW5nIHRoZSBkYm5hbWUgd2l0aCAibWFpbiIKLSAgICAgICAgICAgICAgICBTdHJpbmcgZGJOYW1lOwotICAgICAgICAgICAgICAgIGlmIChpID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgZGJOYW1lID0gbGFzdG5vZGU7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gbG9va2FzaWRlIGlzIG9ubHkgcmVsZXZhbnQgZm9yIHRoZSBtYWluIGRiCi0gICAgICAgICAgICAgICAgICAgIGxvb2thc2lkZVVzZWQgPSAwOwotICAgICAgICAgICAgICAgICAgICBkYk5hbWUgPSAiICAoYXR0YWNoZWQpICIgKyBwLmZpcnN0OwotICAgICAgICAgICAgICAgICAgICAvLyBpZiB0aGUgYXR0YWNoZWQgZGIgaGFzIGEgcGF0aCwgYXR0YWNoIHRoZSBsYXN0bm9kZSBmcm9tIHRoZSBwYXRoIHRvIGFib3ZlCi0gICAgICAgICAgICAgICAgICAgIGlmIChwLnNlY29uZC50cmltKCkubGVuZ3RoKCkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgaWR4ID0gcC5zZWNvbmQubGFzdEluZGV4T2YoIi8iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGRiTmFtZSArPSAiIDogIiArIHAuc2Vjb25kLnN1YnN0cmluZygoaWR4ICE9IC0xKSA/ICsraWR4IDogMCk7CisgICAgICAgICAgICAgICAgICAgIC8vIGdldCBsaXN0IG9mIGF0dGFjaGVkIGRicyBhbmQgZm9yIGVhY2ggZGIsIGdldCBpdHMgc2l6ZSBhbmQgcGFnZXNpemUKKyAgICAgICAgICAgICAgICAgICAgQXJyYXlMaXN0PFBhaXI8U3RyaW5nLCBTdHJpbmc+PiBhdHRhY2hlZERicyA9IGRiLmdldEF0dGFjaGVkRGJzKCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChhdHRhY2hlZERicyA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAocGFnZUNvdW50ID4gMCkgewotICAgICAgICAgICAgICAgICAgICBkYlN0YXRzTGlzdC5hZGQobmV3IERiU3RhdHMoZGJOYW1lLCBwYWdlQ291bnQsIGRiLmdldFBhZ2VTaXplKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9va2FzaWRlVXNlZCkpOworICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGF0dGFjaGVkRGJzLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBQYWlyPFN0cmluZywgU3RyaW5nPiBwID0gYXR0YWNoZWREYnMuZ2V0KGkpOworICAgICAgICAgICAgICAgICAgICAgICAgbG9uZyBwYWdlQ291bnQgPSBEYXRhYmFzZVV0aWxzLmxvbmdGb3JRdWVyeShkYiwgIlBSQUdNQSAiICsgcC5maXJzdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIucGFnZV9jb3VudDsiLCBudWxsKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgLy8gZmlyc3QgZW50cnkgaW4gdGhlIGF0dGFjaGVkIGRiIGxpc3QgaXMgYWx3YXlzIHRoZSBtYWluIGRhdGFiYXNlCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBkb24ndCB3b3JyeSBhYm91dCBwcmVmaXhpbmcgdGhlIGRibmFtZSB3aXRoICJtYWluIgorICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGRiTmFtZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYk5hbWUgPSBsYXN0bm9kZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbG9va2FzaWRlIGlzIG9ubHkgcmVsZXZhbnQgZm9yIHRoZSBtYWluIGRiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9va2FzaWRlVXNlZCA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJOYW1lID0gIiAgKGF0dGFjaGVkKSAiICsgcC5maXJzdDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiB0aGUgYXR0YWNoZWQgZGIgaGFzIGEgcGF0aCwgYXR0YWNoIHRoZSBsYXN0bm9kZSBmcm9tIHRoZSBwYXRoIHRvIGFib3ZlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHAuc2Vjb25kLnRyaW0oKS5sZW5ndGgoKSA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGlkeCA9IHAuc2Vjb25kLmxhc3RJbmRleE9mKCIvIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRiTmFtZSArPSAiIDogIiArIHAuc2Vjb25kLnN1YnN0cmluZygoaWR4ICE9IC0xKSA/ICsraWR4IDogMCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBhZ2VDb3VudCA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYlN0YXRzTGlzdC5hZGQobmV3IERiU3RhdHMoZGJOYW1lLCBwYWdlQ291bnQsIGRiLmdldFBhZ2VTaXplKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb29rYXNpZGVVc2VkLCBkYi5nZXRDYWNoZUhpdE51bSgpLCBkYi5nZXRDYWNoZU1pc3NOdW0oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRiLmdldENhY2hlc2l6ZSgpKSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgLy8gaWYgdGhlcmUgYXJlIHBvb2xlZCBjb25uZWN0aW9ucywgcmV0dXJuIHRoZSBjYWNoZSBzdGF0cyBmb3IgdGhlbSBhbHNvLgorICAgICAgICAgICAgICAgICAgICBpZiAoZGIubUNvbm5lY3Rpb25Qb29sICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoU1FMaXRlRGF0YWJhc2UgcERiIDogZGIubUNvbm5lY3Rpb25Qb29sLmdldENvbm5lY3Rpb25MaXN0KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYlN0YXRzTGlzdC5hZGQobmV3IERiU3RhdHMoIihwb29sZWQgIyAiICsgcERiLm1Db25uZWN0aW9uTnVtICsgIikgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBsYXN0bm9kZSwgMCwgMCwgMCwgcERiLmdldENhY2hlSGl0TnVtKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGIuZ2V0Q2FjaGVNaXNzTnVtKCksIHBEYi5nZXRDYWNoZXNpemUoKSkpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoU1FMaXRlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gaWdub3JlLiB3ZSBkb24ndCBjYXJlIGFib3V0IGV4Y2VwdGlvbnMgd2hlbiB3ZSBhcmUgdGFraW5nIGFkYgorICAgICAgICAgICAgICAgICAgICAvLyBidWdyZXBvcnQhCiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICB9CkBAIC0yMTk0LDQ0ICsyNDk5LDgyIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogZ2V0IHRoZSBzcGVjaWZpZWQgcHJhZ21hIHZhbHVlIGZyb20gc3FsaXRlIGZvciB0aGUgc3BlY2lmaWVkIGRhdGFiYXNlLgotICAgICAqIG9ubHkgaGFuZGxlcyBwcmFnbWEncyB0aGF0IHJldHVybiBpbnQvbG9uZy4KLSAgICAgKiBOTyBKQVZBIGxvY2tzIGFyZSBoZWxkIGluIHRoaXMgbWV0aG9kLgotICAgICAqIFRPRE86IHVzZSB0aGlzIHRvIGRvIGFsbCBwcmFnbWEncyBpbiB0aGlzIGNsYXNzCisgICAgICogUmV0dXJucyBsaXN0IG9mIGZ1bGwgcGF0aG5hbWVzIG9mIGFsbCBhdHRhY2hlZCBkYXRhYmFzZXMgaW5jbHVkaW5nIHRoZSBtYWluIGRhdGFiYXNlCisgICAgICogYnkgZXhlY3V0aW5nICdwcmFnbWEgZGF0YWJhc2VfbGlzdCcgb24gdGhlIGRhdGFiYXNlLgorICAgICAqCisgICAgICogQHJldHVybiBBcnJheUxpc3Qgb2YgcGFpcnMgb2YgKGRhdGFiYXNlIG5hbWUsIGRhdGFiYXNlIGZpbGUgcGF0aCkgb3IgbnVsbCBpZiB0aGUgZGF0YWJhc2UKKyAgICAgKiBpcyBub3Qgb3Blbi4KICAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBsb25nIGdldFByYWdtYVZhbChTUUxpdGVEYXRhYmFzZSBkYiwgU3RyaW5nIHByYWdtYSkgewotICAgICAgICBpZiAoIWRiLmlzT3BlbigpKSB7Ci0gICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgfQotICAgICAgICBTUUxpdGVTdGF0ZW1lbnQgcHJvZyA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBwcm9nID0gbmV3IFNRTGl0ZVN0YXRlbWVudChkYiwgIlBSQUdNQSAiICsgcHJhZ21hKTsKLSAgICAgICAgICAgIGxvbmcgdmFsID0gcHJvZy5zaW1wbGVRdWVyeUZvckxvbmcoKTsKLSAgICAgICAgICAgIHJldHVybiB2YWw7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBpZiAocHJvZyAhPSBudWxsKSBwcm9nLmNsb3NlKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiByZXR1cm5zIGxpc3Qgb2YgZnVsbCBwYXRobmFtZXMgb2YgYWxsIGF0dGFjaGVkIGRhdGFiYXNlcwotICAgICAqIGluY2x1ZGluZyB0aGUgbWFpbiBkYXRhYmFzZQotICAgICAqIFRPRE86IG1vdmUgdGhpcyB0byB7QGxpbmsgRGF0YWJhc2VVdGlsc30KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBBcnJheUxpc3Q8UGFpcjxTdHJpbmcsIFN0cmluZz4+IGdldEF0dGFjaGVkRGJzKFNRTGl0ZURhdGFiYXNlIGRiT2JqKSB7Ci0gICAgICAgIGlmICghZGJPYmouaXNPcGVuKCkpIHsKKyAgICBwdWJsaWMgQXJyYXlMaXN0PFBhaXI8U3RyaW5nLCBTdHJpbmc+PiBnZXRBdHRhY2hlZERicygpIHsKKyAgICAgICAgaWYgKCFpc09wZW4oKSkgewogICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgIH0KICAgICAgICAgQXJyYXlMaXN0PFBhaXI8U3RyaW5nLCBTdHJpbmc+PiBhdHRhY2hlZERicyA9IG5ldyBBcnJheUxpc3Q8UGFpcjxTdHJpbmcsIFN0cmluZz4+KCk7Ci0gICAgICAgIEN1cnNvciBjID0gZGJPYmoucmF3UXVlcnkoInByYWdtYSBkYXRhYmFzZV9saXN0OyIsIG51bGwpOwotICAgICAgICB3aGlsZSAoYy5tb3ZlVG9OZXh0KCkpIHsKLSAgICAgICAgICAgICBhdHRhY2hlZERicy5hZGQobmV3IFBhaXI8U3RyaW5nLCBTdHJpbmc+KGMuZ2V0U3RyaW5nKDEpLCBjLmdldFN0cmluZygyKSkpOworICAgICAgICBDdXJzb3IgYyA9IG51bGw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBjID0gcmF3UXVlcnkoInByYWdtYSBkYXRhYmFzZV9saXN0OyIsIG51bGwpOworICAgICAgICAgICAgd2hpbGUgKGMubW92ZVRvTmV4dCgpKSB7CisgICAgICAgICAgICAgICAgLy8gc3FsaXRlIHJldHVybnMgYSByb3cgZm9yIGVhY2ggZGF0YWJhc2UgaW4gdGhlIHJldHVybmVkIGxpc3Qgb2YgZGF0YWJhc2VzLgorICAgICAgICAgICAgICAgIC8vICAgaW4gZWFjaCByb3csCisgICAgICAgICAgICAgICAgLy8gICAgICAgMXN0IGNvbHVtbiBpcyB0aGUgZGF0YWJhc2UgbmFtZSBzdWNoIGFzIG1haW4sIG9yIHRoZSBkYXRhYmFzZQorICAgICAgICAgICAgICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSBzcGVjaWZpZWQgb24gdGhlICJBVFRBQ0giIGNvbW1hbmQKKyAgICAgICAgICAgICAgICAvLyAgICAgICAybmQgY29sdW1uIGlzIHRoZSBkYXRhYmFzZSBmaWxlIHBhdGguCisgICAgICAgICAgICAgICAgYXR0YWNoZWREYnMuYWRkKG5ldyBQYWlyPFN0cmluZywgU3RyaW5nPihjLmdldFN0cmluZygxKSwgYy5nZXRTdHJpbmcoMikpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIGlmIChjICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBjLmNsb3NlKCk7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KLSAgICAgICAgYy5jbG9zZSgpOwogICAgICAgICByZXR1cm4gYXR0YWNoZWREYnM7CiAgICAgfQogCiAgICAgLyoqCisgICAgICogUnVucyAncHJhZ21hIGludGVncml0eV9jaGVjaycgb24gdGhlIGdpdmVuIGRhdGFiYXNlIChhbmQgYWxsIHRoZSBhdHRhY2hlZCBkYXRhYmFzZXMpCisgICAgICogYW5kIHJldHVybnMgdHJ1ZSBpZiB0aGUgZ2l2ZW4gZGF0YWJhc2UgKGFuZCBhbGwgaXRzIGF0dGFjaGVkIGRhdGFiYXNlcykgcGFzcyBpbnRlZ3JpdHlfY2hlY2ssCisgICAgICogZmFsc2Ugb3RoZXJ3aXNlLgorICAgICAqPHA+CisgICAgICogSWYgdGhlIHJlc3VsdCBpcyBmYWxzZSwgdGhlbiB0aGlzIG1ldGhvZCBsb2dzIHRoZSBlcnJvcnMgcmVwb3J0ZWQgYnkgdGhlIGludGVncml0eV9jaGVjaworICAgICAqIGNvbW1hbmQgZXhlY3V0aW9uLgorICAgICAqPHA+CisgICAgICogTm90ZSB0aGF0ICdwcmFnbWEgaW50ZWdyaXR5X2NoZWNrJyBvbiBhIGRhdGFiYXNlIGNhbiB0YWtlIGEgbG9uZyB0aW1lLgorICAgICAqCisgICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBnaXZlbiBkYXRhYmFzZSAoYW5kIGFsbCBpdHMgYXR0YWNoZWQgZGF0YWJhc2VzKSBwYXNzIGludGVncml0eV9jaGVjaywKKyAgICAgKiBmYWxzZSBvdGhlcndpc2UuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNEYXRhYmFzZUludGVncml0eU9rKCkgeworICAgICAgICB2ZXJpZnlEYklzT3BlbigpOworICAgICAgICBBcnJheUxpc3Q8UGFpcjxTdHJpbmcsIFN0cmluZz4+IGF0dGFjaGVkRGJzID0gbnVsbDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGF0dGFjaGVkRGJzID0gZ2V0QXR0YWNoZWREYnMoKTsKKyAgICAgICAgICAgIGlmIChhdHRhY2hlZERicyA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiZGF0YWJhc2VsaXN0IGZvcjogIiArIGdldFBhdGgoKSArICIgY291bGRuJ3QgIiArCisgICAgICAgICAgICAgICAgICAgICAgICAiYmUgcmV0cmlldmVkLiBwcm9iYWJseSBiZWNhdXNlIHRoZSBkYXRhYmFzZSBpcyBjbG9zZWQiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoU1FMaXRlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIC8vIGNhbid0IGdldCBhdHRhY2hlZERiIGxpc3QuIGRvIGludGVncml0eSBjaGVjayBvbiB0aGUgbWFpbiBkYXRhYmFzZQorICAgICAgICAgICAgYXR0YWNoZWREYnMgPSBuZXcgQXJyYXlMaXN0PFBhaXI8U3RyaW5nLCBTdHJpbmc+PigpOworICAgICAgICAgICAgYXR0YWNoZWREYnMuYWRkKG5ldyBQYWlyPFN0cmluZywgU3RyaW5nPigibWFpbiIsIHRoaXMubVBhdGgpKTsKKyAgICAgICAgfQorICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGF0dGFjaGVkRGJzLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICBQYWlyPFN0cmluZywgU3RyaW5nPiBwID0gYXR0YWNoZWREYnMuZ2V0KGkpOworICAgICAgICAgICAgU1FMaXRlU3RhdGVtZW50IHByb2cgPSBudWxsOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBwcm9nID0gY29tcGlsZVN0YXRlbWVudCgiUFJBR01BICIgKyBwLmZpcnN0ICsgIi5pbnRlZ3JpdHlfY2hlY2soMSk7Iik7CisgICAgICAgICAgICAgICAgU3RyaW5nIHJzbHQgPSBwcm9nLnNpbXBsZVF1ZXJ5Rm9yU3RyaW5nKCk7CisgICAgICAgICAgICAgICAgaWYgKCFyc2x0LmVxdWFsc0lnbm9yZUNhc2UoIm9rIikpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gaW50ZWdyaXR5X2NoZWNrZXIgZmFpbGVkIG9uIG1haW4gb3IgYXR0YWNoZWQgZGF0YWJhc2VzCisgICAgICAgICAgICAgICAgICAgIExvZy5lKFRBRywgIlBSQUdNQSBpbnRlZ3JpdHlfY2hlY2sgb24gIiArIHAuc2Vjb25kICsgIiByZXR1cm5lZDogIiArIHJzbHQpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICBpZiAocHJvZyAhPSBudWxsKSBwcm9nLmNsb3NlKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgLyoqCiAgICAgICogTmF0aXZlIGNhbGwgdG8gb3BlbiB0aGUgZGF0YWJhc2UuCiAgICAgICoKICAgICAgKiBAcGFyYW0gcGF0aCBUaGUgZnVsbCBwYXRoIHRvIHRoZSBkYXRhYmFzZQpAQCAtMjIzOSw1MSArMjU4MiwzNCBAQAogICAgIHByaXZhdGUgbmF0aXZlIHZvaWQgZGJvcGVuKFN0cmluZyBwYXRoLCBpbnQgZmxhZ3MpOwogCiAgICAgLyoqCi0gICAgICogTmF0aXZlIGNhbGwgdG8gc2V0dXAgdHJhY2luZyBvZiBhbGwgc3FsIHN0YXRlbWVudHMKKyAgICAgKiBOYXRpdmUgY2FsbCB0byBzZXR1cCB0cmFjaW5nIG9mIGFsbCBTUUwgc3RhdGVtZW50cwogICAgICAqCiAgICAgICogQHBhcmFtIHBhdGggdGhlIGZ1bGwgcGF0aCB0byB0aGUgZGF0YWJhc2UKKyAgICAgKiBAcGFyYW0gY29ubmVjdGlvbk51bSBjb25uZWN0aW9uIG51bWJlcjogMCAtIE4sIHdoZXJlIHRoZSBtYWluIGRhdGFiYXNlCisgICAgICogICAgICAgICAgICBjb25uZWN0aW9uIGhhbmRsZSBpcyBudW1iZXJlZCAwIGFuZCB0aGUgY29ubmVjdGlvbiBoYW5kbGVzIGluIHRoZSBjb25uZWN0aW9uCisgICAgICogICAgICAgICAgICBwb29sIGFyZSBudW1iZXJlZCAxLi5OLgogICAgICAqLwotICAgIHByaXZhdGUgbmF0aXZlIHZvaWQgZW5hYmxlU3FsVHJhY2luZyhTdHJpbmcgcGF0aCk7CisgICAgcHJpdmF0ZSBuYXRpdmUgdm9pZCBlbmFibGVTcWxUcmFjaW5nKFN0cmluZyBwYXRoLCBzaG9ydCBjb25uZWN0aW9uTnVtKTsKIAogICAgIC8qKgotICAgICAqIE5hdGl2ZSBjYWxsIHRvIHNldHVwIHByb2ZpbGluZyBvZiBhbGwgc3FsIHN0YXRlbWVudHMuCisgICAgICogTmF0aXZlIGNhbGwgdG8gc2V0dXAgcHJvZmlsaW5nIG9mIGFsbCBTUUwgc3RhdGVtZW50cy4KICAgICAgKiBjdXJyZW50bHksIHNxbGl0ZSdzIHByb2ZpbGluZyA9IHByaW50aW5nIG9mIGV4ZWN1dGlvbi10aW1lCi0gICAgICogKHdhbGwtY2xvY2sgdGltZSkgb2YgZWFjaCBvZiB0aGUgc3FsIHN0YXRlbWVudHMsIGFzIHRoZXkKKyAgICAgKiAod2FsbC1jbG9jayB0aW1lKSBvZiBlYWNoIG9mIHRoZSBTUUwgc3RhdGVtZW50cywgYXMgdGhleQogICAgICAqIGFyZSBleGVjdXRlZC4KICAgICAgKgogICAgICAqIEBwYXJhbSBwYXRoIHRoZSBmdWxsIHBhdGggdG8gdGhlIGRhdGFiYXNlCisgICAgICogQHBhcmFtIGNvbm5lY3Rpb25OdW0gY29ubmVjdGlvbiBudW1iZXI6IDAgLSBOLCB3aGVyZSB0aGUgbWFpbiBkYXRhYmFzZQorICAgICAqICAgICAgICAgICAgY29ubmVjdGlvbiBoYW5kbGUgaXMgbnVtYmVyZWQgMCBhbmQgdGhlIGNvbm5lY3Rpb24gaGFuZGxlcyBpbiB0aGUgY29ubmVjdGlvbgorICAgICAqICAgICAgICAgICAgcG9vbCBhcmUgbnVtYmVyZWQgMS4uTi4KICAgICAgKi8KLSAgICBwcml2YXRlIG5hdGl2ZSB2b2lkIGVuYWJsZVNxbFByb2ZpbGluZyhTdHJpbmcgcGF0aCk7Ci0KLSAgICAvKioKLSAgICAgKiBOYXRpdmUgY2FsbCB0byBleGVjdXRlIGEgcmF3IFNRTCBzdGF0ZW1lbnQuIHtAbGluayAjbG9ja30gbXVzdCBiZSBoZWxkCi0gICAgICogd2hlbiBjYWxsaW5nIHRoaXMgbWV0aG9kLgotICAgICAqCi0gICAgICogQHBhcmFtIHNxbCBUaGUgcmF3IFNRTCBzdHJpbmcKLSAgICAgKiBAdGhyb3dzIFNRTEV4Y2VwdGlvbgotICAgICAqLwotICAgIC8qIHBhY2thZ2UgKi8gbmF0aXZlIHZvaWQgbmF0aXZlX2V4ZWNTUUwoU3RyaW5nIHNxbCkgdGhyb3dzIFNRTEV4Y2VwdGlvbjsKKyAgICBwcml2YXRlIG5hdGl2ZSB2b2lkIGVuYWJsZVNxbFByb2ZpbGluZyhTdHJpbmcgcGF0aCwgc2hvcnQgY29ubmVjdGlvbk51bSk7CiAKICAgICAvKioKICAgICAgKiBOYXRpdmUgY2FsbCB0byBzZXQgdGhlIGxvY2FsZS4gIHtAbGluayAjbG9ja30gbXVzdCBiZSBoZWxkIHdoZW4gY2FsbGluZwogICAgICAqIHRoaXMgbWV0aG9kLgogICAgICAqIEB0aHJvd3MgU1FMRXhjZXB0aW9uCiAgICAgICovCi0gICAgLyogcGFja2FnZSAqLyBuYXRpdmUgdm9pZCBuYXRpdmVfc2V0TG9jYWxlKFN0cmluZyBsb2MsIGludCBmbGFncyk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSByb3cgSUQgb2YgdGhlIGxhc3Qgcm93IGluc2VydGVkIGludG8gdGhlIGRhdGFiYXNlLgotICAgICAqCi0gICAgICogQHJldHVybiB0aGUgcm93IElEIG9mIHRoZSBsYXN0IHJvdyBpbnNlcnRlZCBpbnRvIHRoZSBkYXRhYmFzZS4KLSAgICAgKi8KLSAgICAvKiBwYWNrYWdlICovIG5hdGl2ZSBsb25nIGxhc3RJbnNlcnRSb3coKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG51bWJlciBvZiBjaGFuZ2VzIG1hZGUgaW4gdGhlIGxhc3Qgc3RhdGVtZW50IGV4ZWN1dGVkLgotICAgICAqCi0gICAgICogQHJldHVybiB0aGUgbnVtYmVyIG9mIGNoYW5nZXMgbWFkZSBpbiB0aGUgbGFzdCBzdGF0ZW1lbnQgZXhlY3V0ZWQuCi0gICAgICovCi0gICAgLyogcGFja2FnZSAqLyBuYXRpdmUgaW50IGxhc3RDaGFuZ2VDb3VudCgpOworICAgIHByaXZhdGUgbmF0aXZlIHZvaWQgbmF0aXZlX3NldExvY2FsZShTdHJpbmcgbG9jLCBpbnQgZmxhZ3MpOwogCiAgICAgLyoqCiAgICAgICogcmV0dXJuIHRoZSBTUUxJVEVfREJTVEFUVVNfTE9PS0FTSURFX1VTRUQgZG9jdW1lbnRlZCBoZXJlCkBAIC0yMjkxLDQgKzI2MTcsMTEgQEAKICAgICAgKiBAcmV0dXJuIGludCB2YWx1ZSBvZiBTUUxJVEVfREJTVEFUVVNfTE9PS0FTSURFX1VTRUQKICAgICAgKi8KICAgICBwcml2YXRlIG5hdGl2ZSBpbnQgbmF0aXZlX2dldERiTG9va2FzaWRlKCk7CisKKyAgICAvKioKKyAgICAgKiBmaW5hbGl6ZXMgdGhlIGdpdmVuIHN0YXRlbWVudCBpZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzdGF0ZW1lbnRJZCBzdGF0ZW1lbnQgdG8gYmUgZmluemxpZWQgYnkgc3FsaXRlCisgICAgICovCisgICAgcHJpdmF0ZSBmaW5hbCBuYXRpdmUgdm9pZCBuYXRpdmVfZmluYWxpemUoaW50IHN0YXRlbWVudElkKTsKIH0KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9TUUxpdGVEYXRhYmFzZUxvY2tlZEV4Y2VwdGlvbi5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2Uvc3FsaXRlL1NRTGl0ZURhdGFiYXNlTG9ja2VkRXhjZXB0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjBlMmQ4MQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9TUUxpdGVEYXRhYmFzZUxvY2tlZEV4Y2VwdGlvbi5qYXZhCkBAIC0wLDAgKzEsMzMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlOworCisvKioKKyAqIFRocm93biBpZiAgdGhlIGRhdGFiYXNlIGVuZ2luZSB3YXMgdW5hYmxlIHRvIGFjcXVpcmUgdGhlCisgKiBkYXRhYmFzZSBsb2NrcyBpdCBuZWVkcyB0byBkbyBpdHMgam9iLiAgSWYgdGhlIHN0YXRlbWVudCBpcyBhIFtDT01NSVRdCisgKiBvciBvY2N1cnMgb3V0c2lkZSBvZiBhbiBleHBsaWNpdCB0cmFuc2FjdGlvbiwgdGhlbiB5b3UgY2FuIHJldHJ5IHRoZQorICogc3RhdGVtZW50LiAgSWYgdGhlIHN0YXRlbWVudCBpcyBub3QgYSBbQ09NTUlUXSBhbmQgb2NjdXJzIHdpdGhpbiBhCisgKiBleHBsaWNpdCB0cmFuc2FjdGlvbiB0aGVuIHlvdSBzaG91bGQgcm9sbGJhY2sgdGhlIHRyYW5zYWN0aW9uIGJlZm9yZQorICogY29udGludWluZy4KKyAqLworcHVibGljIGNsYXNzIFNRTGl0ZURhdGFiYXNlTG9ja2VkRXhjZXB0aW9uIGV4dGVuZHMgU1FMaXRlRXhjZXB0aW9uIHsKKyAgICBwdWJsaWMgU1FMaXRlRGF0YWJhc2VMb2NrZWRFeGNlcHRpb24oKSB7fQorCisgICAgcHVibGljIFNRTGl0ZURhdGFiYXNlTG9ja2VkRXhjZXB0aW9uKFN0cmluZyBlcnJvcikgeworICAgICAgICBzdXBlcihlcnJvcik7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2Uvc3FsaXRlL1NRTGl0ZURhdGF0eXBlTWlzbWF0Y2hFeGNlcHRpb24uamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9TUUxpdGVEYXRhdHlwZU1pc21hdGNoRXhjZXB0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2Y4MjUzNQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9TUUxpdGVEYXRhdHlwZU1pc21hdGNoRXhjZXB0aW9uLmphdmEKQEAgLTAsMCArMSwyNSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGU7CisKK3B1YmxpYyBjbGFzcyBTUUxpdGVEYXRhdHlwZU1pc21hdGNoRXhjZXB0aW9uIGV4dGVuZHMgU1FMaXRlRXhjZXB0aW9uIHsKKyAgICBwdWJsaWMgU1FMaXRlRGF0YXR5cGVNaXNtYXRjaEV4Y2VwdGlvbigpIHt9CisKKyAgICBwdWJsaWMgU1FMaXRlRGF0YXR5cGVNaXNtYXRjaEV4Y2VwdGlvbihTdHJpbmcgZXJyb3IpIHsKKyAgICAgICAgc3VwZXIoZXJyb3IpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9TUUxpdGVEZWJ1Zy5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2Uvc3FsaXRlL1NRTGl0ZURlYnVnLmphdmEKaW5kZXggODljM2Y5Ni4uOTQ5NjA3OTEgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9TUUxpdGVEZWJ1Zy5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9TUUxpdGVEZWJ1Zy5qYXZhCkBAIC0xMzIsMTEgKzEzMiwxNiBAQAogICAgICAgICAvKiogZG9jdW1lbnRlZCBoZXJlIGh0dHA6Ly93d3cuc3FsaXRlLm9yZy9jM3JlZi9jX2Ric3RhdHVzX2xvb2thc2lkZV91c2VkLmh0bWwgKi8KICAgICAgICAgcHVibGljIGludCBsb29rYXNpZGU7CiAKLSAgICAgICAgcHVibGljIERiU3RhdHMoU3RyaW5nIGRiTmFtZSwgbG9uZyBwYWdlQ291bnQsIGxvbmcgcGFnZVNpemUsIGludCBsb29rYXNpZGUpIHsKKyAgICAgICAgLyoqIHN0YXRlbWVudCBjYWNoZSBzdGF0czogaGl0cy9taXNzZXMvY2FjaGVzaXplICovCisgICAgICAgIHB1YmxpYyBTdHJpbmcgY2FjaGU7CisKKyAgICAgICAgcHVibGljIERiU3RhdHMoU3RyaW5nIGRiTmFtZSwgbG9uZyBwYWdlQ291bnQsIGxvbmcgcGFnZVNpemUsIGludCBsb29rYXNpZGUsCisgICAgICAgICAgICBpbnQgaGl0cywgaW50IG1pc3NlcywgaW50IGNhY2hlc2l6ZSkgewogICAgICAgICAgICAgdGhpcy5kYk5hbWUgPSBkYk5hbWU7Ci0gICAgICAgICAgICB0aGlzLnBhZ2VTaXplID0gcGFnZVNpemU7CisgICAgICAgICAgICB0aGlzLnBhZ2VTaXplID0gcGFnZVNpemUgLyAxMDI0OwogICAgICAgICAgICAgZGJTaXplID0gKHBhZ2VDb3VudCAqIHBhZ2VTaXplKSAvIDEwMjQ7CiAgICAgICAgICAgICB0aGlzLmxvb2thc2lkZSA9IGxvb2thc2lkZTsKKyAgICAgICAgICAgIHRoaXMuY2FjaGUgPSBoaXRzICsgIi8iICsgbWlzc2VzICsgIi8iICsgY2FjaGVzaXplOwogICAgICAgICB9CiAgICAgfQogCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9zcWxpdGUvU1FMaXRlRGlyZWN0Q3Vyc29yRHJpdmVyLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9zcWxpdGUvU1FMaXRlRGlyZWN0Q3Vyc29yRHJpdmVyLmphdmEKaW5kZXggMjE0NGZjMy4uZGUyZmNhOSAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2Uvc3FsaXRlL1NRTGl0ZURpcmVjdEN1cnNvckRyaXZlci5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9TUUxpdGVEaXJlY3RDdXJzb3JEcml2ZXIuamF2YQpAQCAtMzksMTggKzM5LDE2IEBACiAKICAgICBwdWJsaWMgQ3Vyc29yIHF1ZXJ5KEN1cnNvckZhY3RvcnkgZmFjdG9yeSwgU3RyaW5nW10gc2VsZWN0aW9uQXJncykgewogICAgICAgICAvLyBDb21waWxlIHRoZSBxdWVyeQotICAgICAgICBTUUxpdGVRdWVyeSBxdWVyeSA9IG5ldyBTUUxpdGVRdWVyeShtRGF0YWJhc2UsIG1TcWwsIDAsIHNlbGVjdGlvbkFyZ3MpOworICAgICAgICBTUUxpdGVRdWVyeSBxdWVyeSA9IG51bGw7CiAKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEFyZyBiaW5kaW5nCi0gICAgICAgICAgICBpbnQgbnVtQXJncyA9IHNlbGVjdGlvbkFyZ3MgPT0gbnVsbCA/IDAgOiBzZWxlY3Rpb25BcmdzLmxlbmd0aDsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtQXJnczsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgcXVlcnkuYmluZFN0cmluZyhpICsgMSwgc2VsZWN0aW9uQXJnc1tpXSk7Ci0gICAgICAgICAgICB9CisgICAgICAgICAgICBtRGF0YWJhc2UubG9jaygpOworICAgICAgICAgICAgbURhdGFiYXNlLmNsb3NlUGVuZGluZ1N0YXRlbWVudHMoKTsKKyAgICAgICAgICAgIHF1ZXJ5ID0gbmV3IFNRTGl0ZVF1ZXJ5KG1EYXRhYmFzZSwgbVNxbCwgMCwgc2VsZWN0aW9uQXJncyk7CiAKICAgICAgICAgICAgIC8vIENyZWF0ZSB0aGUgY3Vyc29yCiAgICAgICAgICAgICBpZiAoZmFjdG9yeSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbUN1cnNvciA9IG5ldyBTUUxpdGVDdXJzb3IobURhdGFiYXNlLCB0aGlzLCBtRWRpdFRhYmxlLCBxdWVyeSk7CisgICAgICAgICAgICAgICAgbUN1cnNvciA9IG5ldyBTUUxpdGVDdXJzb3IodGhpcywgbUVkaXRUYWJsZSwgcXVlcnkpOwogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICBtQ3Vyc29yID0gZmFjdG9yeS5uZXdDdXJzb3IobURhdGFiYXNlLCB0aGlzLCBtRWRpdFRhYmxlLCBxdWVyeSk7CiAgICAgICAgICAgICB9CkBAIC02MSw2ICs1OSw3IEBACiAgICAgICAgIH0gZmluYWxseSB7CiAgICAgICAgICAgICAvLyBNYWtlIHN1cmUgdGhpcyBvYmplY3QgaXMgY2xlYW5lZCB1cCBpZiBzb21ldGhpbmcgaGFwcGVucwogICAgICAgICAgICAgaWYgKHF1ZXJ5ICE9IG51bGwpIHF1ZXJ5LmNsb3NlKCk7CisgICAgICAgICAgICBtRGF0YWJhc2UudW5sb2NrKCk7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTY5LDEwICs2OCw3IEBACiAgICAgfQogCiAgICAgcHVibGljIHZvaWQgc2V0QmluZEFyZ3VtZW50cyhTdHJpbmdbXSBiaW5kQXJncykgewotICAgICAgICBmaW5hbCBpbnQgbnVtQXJncyA9IGJpbmRBcmdzLmxlbmd0aDsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1BcmdzOyBpKyspIHsKLSAgICAgICAgICAgIG1RdWVyeS5iaW5kU3RyaW5nKGkgKyAxLCBiaW5kQXJnc1tpXSk7Ci0gICAgICAgIH0KKyAgICAgICAgbVF1ZXJ5LmJpbmRBbGxBcmdzQXNTdHJpbmdzKGJpbmRBcmdzKTsKICAgICB9CiAKICAgICBwdWJsaWMgdm9pZCBjdXJzb3JEZWFjdGl2YXRlZCgpIHsKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9TUUxpdGVNaXN1c2VFeGNlcHRpb24uamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9TUUxpdGVNaXN1c2VFeGNlcHRpb24uamF2YQppbmRleCA2ODVmM2VhLi41NDZlYzA4IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9zcWxpdGUvU1FMaXRlTWlzdXNlRXhjZXB0aW9uLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2Uvc3FsaXRlL1NRTGl0ZU1pc3VzZUV4Y2VwdGlvbi5qYXZhCkBAIC0xNiw2ICsxNiwxOCBAQAogCiBwYWNrYWdlIGFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlOwogCisvKioKKyAqIFRoaXMgZXJyb3IgY2FuIG9jY3VyIGlmIHRoZSBhcHBsaWNhdGlvbiBjcmVhdGVzIGEgU1FMaXRlU3RhdGVtZW50IG9iamVjdCBhbmQgYWxsb3dzIG11bHRpcGxlCisgKiB0aHJlYWRzIGluIHRoZSBhcHBsaWNhdGlvbiB1c2UgaXQgYXQgdGhlIHNhbWUgdGltZS4KKyAqIFNxbGl0ZSByZXR1cm5zIHRoaXMgZXJyb3IgaWYgYmluZCBhbmQgZXhlY3V0ZSBtZXRob2RzIG9uIHRoaXMgb2JqZWN0IG9jY3VyIGF0IHRoZSBzYW1lIHRpbWUKKyAqIGZyb20gbXVsdGlwbGUgdGhyZWFkcywgbGlrZSBzbzoKKyAqICAgICB0aHJlYWQgIyAxOiBpbiBleGVjdXRlKCkgbWV0aG9kIG9mIHRoZSBTUUxpdGVTdGF0ZW1lbnQgb2JqZWN0CisgKiAgICAgd2hpbGUgdGhyZWFkICMgMjogaXMgaW4gYmluZC4uKCkgb24gdGhlIHNhbWUgb2JqZWN0LgorICo8L3A+CisgKiBGSVggdGhpcyBieSBORVZFUiBzaGFyaW5nIHRoZSBzYW1lIFNRTGl0ZVN0YXRlbWVudCBvYmplY3QgYmV0d2VlbiB0aHJlYWRzLgorICogQ3JlYXRlIGEgbG9jYWwgaW5zdGFuY2Ugb2YgdGhlIFNRTGl0ZVN0YXRlbWVudCB3aGVuZXZlciBpdCBpcyBuZWVkZWQsIHVzZSBpdCBhbmQgY2xvc2UgaXQgQVNBUC4KKyAqIE5FVkVSIG1ha2UgaXQgZ2xvYmFsbHkgYXZhaWxhYmxlLgorICovCiBwdWJsaWMgY2xhc3MgU1FMaXRlTWlzdXNlRXhjZXB0aW9uIGV4dGVuZHMgU1FMaXRlRXhjZXB0aW9uIHsKICAgICBwdWJsaWMgU1FMaXRlTWlzdXNlRXhjZXB0aW9uKCkge30KIApkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2Uvc3FsaXRlL1NRTGl0ZU9wZW5IZWxwZXIuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9TUUxpdGVPcGVuSGVscGVyLmphdmEKaW5kZXggYjQ2MTVlYi4uY2NmOGQ2OCAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2Uvc3FsaXRlL1NRTGl0ZU9wZW5IZWxwZXIuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9zcWxpdGUvU1FMaXRlT3BlbkhlbHBlci5qYXZhCkBAIC0xNyw2ICsxNyw4IEBACiBwYWNrYWdlIGFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlOwogCiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5EYXRhYmFzZUVycm9ySGFuZGxlcjsKK2ltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLkRlZmF1bHREYXRhYmFzZUVycm9ySGFuZGxlcjsKIGltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZS5TUUxpdGVEYXRhYmFzZS5DdXJzb3JGYWN0b3J5OwogaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CiAKQEAgLTUxLDYgKzUzLDcgQEAKIAogICAgIHByaXZhdGUgU1FMaXRlRGF0YWJhc2UgbURhdGFiYXNlID0gbnVsbDsKICAgICBwcml2YXRlIGJvb2xlYW4gbUlzSW5pdGlhbGl6aW5nID0gZmFsc2U7CisgICAgcHJpdmF0ZSBmaW5hbCBEYXRhYmFzZUVycm9ySGFuZGxlciBtRXJyb3JIYW5kbGVyOwogCiAgICAgLyoqCiAgICAgICogQ3JlYXRlIGEgaGVscGVyIG9iamVjdCB0byBjcmVhdGUsIG9wZW4sIGFuZC9vciBtYW5hZ2UgYSBkYXRhYmFzZS4KQEAgLTY1LDEyICs2OCwzNyBAQAogICAgICAqICAgICB7QGxpbmsgI29uVXBncmFkZX0gd2lsbCBiZSB1c2VkIHRvIHVwZ3JhZGUgdGhlIGRhdGFiYXNlCiAgICAgICovCiAgICAgcHVibGljIFNRTGl0ZU9wZW5IZWxwZXIoQ29udGV4dCBjb250ZXh0LCBTdHJpbmcgbmFtZSwgQ3Vyc29yRmFjdG9yeSBmYWN0b3J5LCBpbnQgdmVyc2lvbikgeworICAgICAgICB0aGlzKGNvbnRleHQsIG5hbWUsIGZhY3RvcnksIHZlcnNpb24sIG5ldyBEZWZhdWx0RGF0YWJhc2VFcnJvckhhbmRsZXIoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlIGEgaGVscGVyIG9iamVjdCB0byBjcmVhdGUsIG9wZW4sIGFuZC9vciBtYW5hZ2UgYSBkYXRhYmFzZS4KKyAgICAgKiBUaGUgZGF0YWJhc2UgaXMgbm90IGFjdHVhbGx5IGNyZWF0ZWQgb3Igb3BlbmVkIHVudGlsIG9uZSBvZgorICAgICAqIHtAbGluayAjZ2V0V3JpdGFibGVEYXRhYmFzZX0gb3Ige0BsaW5rICNnZXRSZWFkYWJsZURhdGFiYXNlfSBpcyBjYWxsZWQuCisgICAgICoKKyAgICAgKiA8cD5BY2NlcHRzIGlucHV0IHBhcmFtOiBhIGNvbmNyZXRlIGluc3RhbmNlIG9mIHtAbGluayBEYXRhYmFzZUVycm9ySGFuZGxlcn0gdG8gYmUKKyAgICAgKiB1c2VkIHRvIGhhbmRsZSBjb3JydXB0aW9uIHdoZW4gc3FsaXRlIHJlcG9ydHMgZGF0YWJhc2UgY29ycnVwdGlvbi48L3A+CisgICAgICoKKyAgICAgKiBAcGFyYW0gY29udGV4dCB0byB1c2UgdG8gb3BlbiBvciBjcmVhdGUgdGhlIGRhdGFiYXNlCisgICAgICogQHBhcmFtIG5hbWUgb2YgdGhlIGRhdGFiYXNlIGZpbGUsIG9yIG51bGwgZm9yIGFuIGluLW1lbW9yeSBkYXRhYmFzZQorICAgICAqIEBwYXJhbSBmYWN0b3J5IHRvIHVzZSBmb3IgY3JlYXRpbmcgY3Vyc29yIG9iamVjdHMsIG9yIG51bGwgZm9yIHRoZSBkZWZhdWx0CisgICAgICogQHBhcmFtIHZlcnNpb24gbnVtYmVyIG9mIHRoZSBkYXRhYmFzZSAoc3RhcnRpbmcgYXQgMSk7IGlmIHRoZSBkYXRhYmFzZSBpcyBvbGRlciwKKyAgICAgKiAgICAge0BsaW5rICNvblVwZ3JhZGV9IHdpbGwgYmUgdXNlZCB0byB1cGdyYWRlIHRoZSBkYXRhYmFzZQorICAgICAqIEBwYXJhbSBlcnJvckhhbmRsZXIgdGhlIHtAbGluayBEYXRhYmFzZUVycm9ySGFuZGxlcn0gdG8gYmUgdXNlZCB3aGVuIHNxbGl0ZSByZXBvcnRzIGRhdGFiYXNlCisgICAgICogY29ycnVwdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgU1FMaXRlT3BlbkhlbHBlcihDb250ZXh0IGNvbnRleHQsIFN0cmluZyBuYW1lLCBDdXJzb3JGYWN0b3J5IGZhY3RvcnksIGludCB2ZXJzaW9uLAorICAgICAgICAgICAgRGF0YWJhc2VFcnJvckhhbmRsZXIgZXJyb3JIYW5kbGVyKSB7CiAgICAgICAgIGlmICh2ZXJzaW9uIDwgMSkgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVmVyc2lvbiBtdXN0IGJlID49IDEsIHdhcyAiICsgdmVyc2lvbik7CisgICAgICAgIGlmIChlcnJvckhhbmRsZXIgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiRGF0YWJhc2VFcnJvckhhbmRsZXIgcGFyYW0gdmFsdWUgY2FuJ3QgYmUgbnVsbC4iKTsKKyAgICAgICAgfQogCiAgICAgICAgIG1Db250ZXh0ID0gY29udGV4dDsKICAgICAgICAgbU5hbWUgPSBuYW1lOwogICAgICAgICBtRmFjdG9yeSA9IGZhY3Rvcnk7CiAgICAgICAgIG1OZXdWZXJzaW9uID0gdmVyc2lvbjsKKyAgICAgICAgbUVycm9ySGFuZGxlciA9IGVycm9ySGFuZGxlcjsKICAgICB9CiAKICAgICAvKioKQEAgLTkzLDggKzEyMSwxMyBAQAogICAgICAqIEByZXR1cm4gYSByZWFkL3dyaXRlIGRhdGFiYXNlIG9iamVjdCB2YWxpZCB1bnRpbCB7QGxpbmsgI2Nsb3NlfSBpcyBjYWxsZWQKICAgICAgKi8KICAgICBwdWJsaWMgc3luY2hyb25pemVkIFNRTGl0ZURhdGFiYXNlIGdldFdyaXRhYmxlRGF0YWJhc2UoKSB7Ci0gICAgICAgIGlmIChtRGF0YWJhc2UgIT0gbnVsbCAmJiBtRGF0YWJhc2UuaXNPcGVuKCkgJiYgIW1EYXRhYmFzZS5pc1JlYWRPbmx5KCkpIHsKLSAgICAgICAgICAgIHJldHVybiBtRGF0YWJhc2U7ICAvLyBUaGUgZGF0YWJhc2UgaXMgYWxyZWFkeSBvcGVuIGZvciBidXNpbmVzcworICAgICAgICBpZiAobURhdGFiYXNlICE9IG51bGwpIHsKKyAgICAgICAgICAgIGlmICghbURhdGFiYXNlLmlzT3BlbigpKSB7CisgICAgICAgICAgICAgICAgLy8gZGFybiEgdGhlIHVzZXIgY2xvc2VkIHRoZSBkYXRhYmFzZSBieSBjYWxsaW5nIG1EYXRhYmFzZS5jbG9zZSgpCisgICAgICAgICAgICAgICAgbURhdGFiYXNlID0gbnVsbDsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoIW1EYXRhYmFzZS5pc1JlYWRPbmx5KCkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbURhdGFiYXNlOyAgLy8gVGhlIGRhdGFiYXNlIGlzIGFscmVhZHkgb3BlbiBmb3IgYnVzaW5lc3MKKyAgICAgICAgICAgIH0KICAgICAgICAgfQogCiAgICAgICAgIGlmIChtSXNJbml0aWFsaXppbmcpIHsKQEAgLTExNSwxMCArMTQ4LDE0IEBACiAgICAgICAgICAgICBpZiAobU5hbWUgPT0gbnVsbCkgewogICAgICAgICAgICAgICAgIGRiID0gU1FMaXRlRGF0YWJhc2UuY3JlYXRlKG51bGwpOwogICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBkYiA9IG1Db250ZXh0Lm9wZW5PckNyZWF0ZURhdGFiYXNlKG1OYW1lLCAwLCBtRmFjdG9yeSk7CisgICAgICAgICAgICAgICAgZGIgPSBtQ29udGV4dC5vcGVuT3JDcmVhdGVEYXRhYmFzZShtTmFtZSwgMCwgbUZhY3RvcnksIG1FcnJvckhhbmRsZXIpOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBpbnQgdmVyc2lvbiA9IGRiLmdldFZlcnNpb24oKTsKKyAgICAgICAgICAgIGlmICh2ZXJzaW9uID4gbU5ld1ZlcnNpb24pIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJEYXRhYmFzZSAiICsgbU5hbWUgKworICAgICAgICAgICAgICAgICAgICAgICAgIiBjYW5ub3QgYmUgZG93bmdyYWRlZC4gaW5zdGVhZCwgcGxlYXNlIHVuaW5zdGFsbCBuZXcgdmVyc2lvbiBmaXJzdC4iKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmICh2ZXJzaW9uICE9IG1OZXdWZXJzaW9uKSB7CiAgICAgICAgICAgICAgICAgZGIuYmVnaW5UcmFuc2FjdGlvbigpOwogICAgICAgICAgICAgICAgIHRyeSB7CkBAIC0xNzUsOCArMjEyLDEzIEBACiAgICAgICogICAgIG9yIHtAbGluayAjY2xvc2V9IGlzIGNhbGxlZC4KICAgICAgKi8KICAgICBwdWJsaWMgc3luY2hyb25pemVkIFNRTGl0ZURhdGFiYXNlIGdldFJlYWRhYmxlRGF0YWJhc2UoKSB7Ci0gICAgICAgIGlmIChtRGF0YWJhc2UgIT0gbnVsbCAmJiBtRGF0YWJhc2UuaXNPcGVuKCkpIHsKLSAgICAgICAgICAgIHJldHVybiBtRGF0YWJhc2U7ICAvLyBUaGUgZGF0YWJhc2UgaXMgYWxyZWFkeSBvcGVuIGZvciBidXNpbmVzcworICAgICAgICBpZiAobURhdGFiYXNlICE9IG51bGwpIHsKKyAgICAgICAgICAgIGlmICghbURhdGFiYXNlLmlzT3BlbigpKSB7CisgICAgICAgICAgICAgICAgLy8gZGFybiEgdGhlIHVzZXIgY2xvc2VkIHRoZSBkYXRhYmFzZSBieSBjYWxsaW5nIG1EYXRhYmFzZS5jbG9zZSgpCisgICAgICAgICAgICAgICAgbURhdGFiYXNlID0gbnVsbDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG1EYXRhYmFzZTsgIC8vIFRoZSBkYXRhYmFzZSBpcyBhbHJlYWR5IG9wZW4gZm9yIGJ1c2luZXNzCisgICAgICAgICAgICB9CiAgICAgICAgIH0KIAogICAgICAgICBpZiAobUlzSW5pdGlhbGl6aW5nKSB7CkBAIC0xOTQsNyArMjM2LDggQEAKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIG1Jc0luaXRpYWxpemluZyA9IHRydWU7CiAgICAgICAgICAgICBTdHJpbmcgcGF0aCA9IG1Db250ZXh0LmdldERhdGFiYXNlUGF0aChtTmFtZSkuZ2V0UGF0aCgpOwotICAgICAgICAgICAgZGIgPSBTUUxpdGVEYXRhYmFzZS5vcGVuRGF0YWJhc2UocGF0aCwgbUZhY3RvcnksIFNRTGl0ZURhdGFiYXNlLk9QRU5fUkVBRE9OTFkpOworICAgICAgICAgICAgZGIgPSBTUUxpdGVEYXRhYmFzZS5vcGVuRGF0YWJhc2UocGF0aCwgbUZhY3RvcnksIFNRTGl0ZURhdGFiYXNlLk9QRU5fUkVBRE9OTFksCisgICAgICAgICAgICAgICAgICAgIG1FcnJvckhhbmRsZXIpOwogICAgICAgICAgICAgaWYgKGRiLmdldFZlcnNpb24oKSAhPSBtTmV3VmVyc2lvbikgewogICAgICAgICAgICAgICAgIHRocm93IG5ldyBTUUxpdGVFeGNlcHRpb24oIkNhbid0IHVwZ3JhZGUgcmVhZC1vbmx5IGRhdGFiYXNlIGZyb20gdmVyc2lvbiAiICsKICAgICAgICAgICAgICAgICAgICAgICAgIGRiLmdldFZlcnNpb24oKSArICIgdG8gIiArIG1OZXdWZXJzaW9uICsgIjogIiArIHBhdGgpOwpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2Uvc3FsaXRlL1NRTGl0ZU91dE9mTWVtb3J5RXhjZXB0aW9uLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9zcWxpdGUvU1FMaXRlT3V0T2ZNZW1vcnlFeGNlcHRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OGNlOGI1Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2Uvc3FsaXRlL1NRTGl0ZU91dE9mTWVtb3J5RXhjZXB0aW9uLmphdmEKQEAgLTAsMCArMSwyNSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGU7CisKK3B1YmxpYyBjbGFzcyBTUUxpdGVPdXRPZk1lbW9yeUV4Y2VwdGlvbiBleHRlbmRzIFNRTGl0ZUV4Y2VwdGlvbiB7CisgICAgcHVibGljIFNRTGl0ZU91dE9mTWVtb3J5RXhjZXB0aW9uKCkge30KKworICAgIHB1YmxpYyBTUUxpdGVPdXRPZk1lbW9yeUV4Y2VwdGlvbihTdHJpbmcgZXJyb3IpIHsKKyAgICAgICAgc3VwZXIoZXJyb3IpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9TUUxpdGVQcm9ncmFtLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9zcWxpdGUvU1FMaXRlUHJvZ3JhbS5qYXZhCmluZGV4IDRkOTZmMTIuLmM3YzBjNzkgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9TUUxpdGVQcm9ncmFtLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2Uvc3FsaXRlL1NRTGl0ZVByb2dyYW0uamF2YQpAQCAtMTYsMTEgKzE2LDE1IEBACiAKIHBhY2thZ2UgYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGU7CiAKK2ltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLkRhdGFiYXNlVXRpbHM7CitpbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5DdXJzb3I7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKIAoraW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworCiAvKioKICAqIEEgYmFzZSBjbGFzcyBmb3IgY29tcGlsZWQgU1FMaXRlIHByb2dyYW1zLgotICoKKyAqPHA+CiAgKiBTUUxpdGVQcm9ncmFtIGlzIG5vdCBpbnRlcm5hbGx5IHN5bmNocm9uaXplZCBzbyBjb2RlIHVzaW5nIGEgU1FMaXRlUHJvZ3JhbSBmcm9tIG11bHRpcGxlCiAgKiB0aHJlYWRzIHNob3VsZCBwZXJmb3JtIGl0cyBvd24gc3luY2hyb25pemF0aW9uIHdoZW4gdXNpbmcgdGhlIFNRTGl0ZVByb2dyYW0uCiAgKi8KQEAgLTQzLDEyICs0NywxMiBAQAogICAgICAqIEBkZXByZWNhdGVkIGRvIG5vdCB1c2UgdGhpcwogICAgICAqLwogICAgIEBEZXByZWNhdGVkCi0gICAgcHJvdGVjdGVkIGludCBuSGFuZGxlID0gMDsKKyAgICBwcm90ZWN0ZWQgaW50IG5IYW5kbGU7CiAKICAgICAvKioKICAgICAgKiB0aGUgU1FMaXRlQ29tcGlsZWRTcWwgb2JqZWN0IGZvciB0aGUgZ2l2ZW4gc3FsIHN0YXRlbWVudC4KICAgICAgKi8KLSAgICBwcml2YXRlIFNRTGl0ZUNvbXBpbGVkU3FsIG1Db21waWxlZFNxbDsKKyAgICAvKiBwYWNrYWdlICovIFNRTGl0ZUNvbXBpbGVkU3FsIG1Db21waWxlZFNxbDsKIAogICAgIC8qKgogICAgICAqIFNRTGl0ZUNvbXBpbGVkU3FsIHN0YXRlbWVudCBpZCBpcyBwb3B1bGF0ZWQgd2l0aCB0aGUgY29ycmVzcG9uZGluZyBvYmplY3QgZnJvbSB0aGUgYWJvdmUKQEAgLTU2LDQxICs2MCw3NiBAQAogICAgICAqIEBkZXByZWNhdGVkIGRvIG5vdCB1c2UgdGhpcwogICAgICAqLwogICAgIEBEZXByZWNhdGVkCi0gICAgcHJvdGVjdGVkIGludCBuU3RhdGVtZW50ID0gMDsKKyAgICBwcm90ZWN0ZWQgaW50IG5TdGF0ZW1lbnQ7CisKKyAgICAvKioKKyAgICAgKiBJbiB0aGUgY2FzZSBvZiB7QGxpbmsgU1FMaXRlU3RhdGVtZW50fSwgdGhpcyBtZW1iZXIgc3RvcmVzIHRoZSBiaW5kYXJncyBwYXNzZWQKKyAgICAgKiB0byB0aGUgZm9sbG93aW5nIG1ldGhvZHMsIGluc3RlYWQgb2YgYWN0dWFsbHkgZG9pbmcgdGhlIGJpbmRpbmcuCisgICAgICogPHVsPgorICAgICAqICAgPGxpPntAbGluayAjYmluZEJsb2IoaW50LCBieXRlW10pfTwvbGk+CisgICAgICogICA8bGk+e0BsaW5rICNiaW5kRG91YmxlKGludCwgZG91YmxlKX08L2xpPgorICAgICAqICAgPGxpPntAbGluayAjYmluZExvbmcoaW50LCBsb25nKX08L2xpPgorICAgICAqICAgPGxpPntAbGluayAjYmluZE51bGwoaW50KX08L2xpPgorICAgICAqICAgPGxpPntAbGluayAjYmluZFN0cmluZyhpbnQsIFN0cmluZyl9PC9saT4KKyAgICAgKiA8L3VsPgorICAgICAqIDxwPgorICAgICAqIEVhY2ggZW50cnkgaW4gdGhlIGFycmF5IGlzIGEgUGFpciBvZgorICAgICAqIDxvbD4KKyAgICAgKiAgIDxsaT5iaW5kIGFyZyBwb3NpdGlvbiBudW1iZXI8L2xpPgorICAgICAqICAgPGxpPnRoZSB2YWx1ZSB0byBiZSBib3VuZCB0byB0aGUgYmluZGFyZzwvbGk+CisgICAgICogPC9vbD4KKyAgICAgKiA8cD4KKyAgICAgKiBJdCBpcyBsYXppbHkgaW5pdGlhbGl6ZWQgaW4gdGhlIGFib3ZlIGJpbmQgbWV0aG9kcworICAgICAqIGFuZCBpdCBpcyBjbGVhcmVkIGluIHtAbGluayAjY2xlYXJCaW5kaW5ncygpfSBtZXRob2QuCisgICAgICogPHA+CisgICAgICogSXQgaXMgcHJvdGVjdGVkIChpbiBtdWx0aS10aHJlYWRlZCBlbnZpcm9ubWVudCkgYnkge0BsaW5rIFNRTGl0ZVByb2dyYW19LnRoaXMKKyAgICAgKi8KKyAgICAvKiBwYWNrYWdlICovIEhhc2hNYXA8SW50ZWdlciwgT2JqZWN0PiBtQmluZEFyZ3MgPSBudWxsOworICAgIC8qIHBhY2thZ2UgKi8gZmluYWwgaW50IG1TdGF0ZW1lbnRUeXBlOwogCiAgICAgLyogcGFja2FnZSAqLyBTUUxpdGVQcm9ncmFtKFNRTGl0ZURhdGFiYXNlIGRiLCBTdHJpbmcgc3FsKSB7Ci0gICAgICAgIG1EYXRhYmFzZSA9IGRiOworICAgICAgICB0aGlzKGRiLCBzcWwsIG51bGwsIHRydWUpOworICAgIH0KKworICAgIC8qIHBhY2thZ2UgKi8gU1FMaXRlUHJvZ3JhbShTUUxpdGVEYXRhYmFzZSBkYiwgU3RyaW5nIHNxbCwgT2JqZWN0W10gYmluZEFyZ3MsCisgICAgICAgICAgICBib29sZWFuIGNvbXBpbGVGbGFnKSB7CiAgICAgICAgIG1TcWwgPSBzcWwudHJpbSgpOworICAgICAgICBtU3RhdGVtZW50VHlwZSA9IERhdGFiYXNlVXRpbHMuZ2V0U3FsU3RhdGVtZW50VHlwZShtU3FsKTsKICAgICAgICAgZGIuYWNxdWlyZVJlZmVyZW5jZSgpOwogICAgICAgICBkYi5hZGRTUUxpdGVDbG9zYWJsZSh0aGlzKTsKLSAgICAgICAgdGhpcy5uSGFuZGxlID0gZGIubU5hdGl2ZUhhbmRsZTsKKyAgICAgICAgbURhdGFiYXNlID0gZGI7CisgICAgICAgIG5IYW5kbGUgPSBkYi5tTmF0aXZlSGFuZGxlOworICAgICAgICBpZiAoYmluZEFyZ3MgIT0gbnVsbCkgeworICAgICAgICAgICAgaW50IHNpemUgPSBiaW5kQXJncy5sZW5ndGg7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgeworICAgICAgICAgICAgICAgIHRoaXMuYWRkVG9CaW5kQXJncyhpICsgMSwgYmluZEFyZ3NbaV0pOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChjb21waWxlRmxhZykgeworICAgICAgICAgICAgY29tcGlsZUFuZGJpbmRBbGxBcmdzKCk7CisgICAgICAgIH0KKyAgICB9CiAKKyAgICBwcml2YXRlIHZvaWQgY29tcGlsZVNxbCgpIHsKICAgICAgICAgLy8gb25seSBjYWNoZSBDUlVEIHN0YXRlbWVudHMKLSAgICAgICAgU3RyaW5nIHByZWZpeFNxbCA9IG1TcWwuc3Vic3RyaW5nKDAsIDYpOwotICAgICAgICBpZiAoIXByZWZpeFNxbC5lcXVhbHNJZ25vcmVDYXNlKCJJTlNFUlQiKSAmJiAhcHJlZml4U3FsLmVxdWFsc0lnbm9yZUNhc2UoIlVQREFURSIpICYmCi0gICAgICAgICAgICAgICAgIXByZWZpeFNxbC5lcXVhbHNJZ25vcmVDYXNlKCJSRVBMQUMiKSAmJgotICAgICAgICAgICAgICAgICFwcmVmaXhTcWwuZXF1YWxzSWdub3JlQ2FzZSgiREVMRVRFIikgJiYgIXByZWZpeFNxbC5lcXVhbHNJZ25vcmVDYXNlKCJTRUxFQ1QiKSkgewotICAgICAgICAgICAgbUNvbXBpbGVkU3FsID0gbmV3IFNRTGl0ZUNvbXBpbGVkU3FsKGRiLCBzcWwpOworICAgICAgICBpZiAobVN0YXRlbWVudFR5cGUgIT0gRGF0YWJhc2VVdGlscy5TVEFURU1FTlRfU0VMRUNUICYmCisgICAgICAgICAgICAgICAgbVN0YXRlbWVudFR5cGUgIT0gRGF0YWJhc2VVdGlscy5TVEFURU1FTlRfVVBEQVRFKSB7CisgICAgICAgICAgICBtQ29tcGlsZWRTcWwgPSBuZXcgU1FMaXRlQ29tcGlsZWRTcWwobURhdGFiYXNlLCBtU3FsKTsKICAgICAgICAgICAgIG5TdGF0ZW1lbnQgPSBtQ29tcGlsZWRTcWwublN0YXRlbWVudDsKICAgICAgICAgICAgIC8vIHNpbmNlIGl0IGlzIG5vdCBpbiB0aGUgY2FjaGUsIG5vIG5lZWQgdG8gYWNxdWlyZSgpIGl0LgogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CiAKLSAgICAgICAgLy8gaXQgaXMgbm90IHByYWdtYQotICAgICAgICBtQ29tcGlsZWRTcWwgPSBkYi5nZXRDb21waWxlZFN0YXRlbWVudEZvclNxbChzcWwpOworICAgICAgICBtQ29tcGlsZWRTcWwgPSBtRGF0YWJhc2UuZ2V0Q29tcGlsZWRTdGF0ZW1lbnRGb3JTcWwobVNxbCk7CiAgICAgICAgIGlmIChtQ29tcGlsZWRTcWwgPT0gbnVsbCkgewogICAgICAgICAgICAgLy8gY3JlYXRlIGEgbmV3IGNvbXBpbGVkLXNxbCBvYmoKLSAgICAgICAgICAgIG1Db21waWxlZFNxbCA9IG5ldyBTUUxpdGVDb21waWxlZFNxbChkYiwgc3FsKTsKKyAgICAgICAgICAgIG1Db21waWxlZFNxbCA9IG5ldyBTUUxpdGVDb21waWxlZFNxbChtRGF0YWJhc2UsIG1TcWwpOwogCiAgICAgICAgICAgICAvLyBhZGQgaXQgdG8gdGhlIGNhY2hlIG9mIGNvbXBpbGVkLXNxbHMKICAgICAgICAgICAgIC8vIGJ1dCBiZWZvcmUgYWRkaW5nIGl0IGFuZCB0aHVzIG1ha2luZyBpdCBhdmFpbGFibGUgZm9yIGFueW9uZSBlbHNlIHRvIHVzZSBpdCwKICAgICAgICAgICAgIC8vIG1ha2Ugc3VyZSBpdCBpcyBhY3F1aXJlZCBieSBtZS4KICAgICAgICAgICAgIG1Db21waWxlZFNxbC5hY3F1aXJlKCk7Ci0gICAgICAgICAgICBkYi5hZGRUb0NvbXBpbGVkUXVlcmllcyhzcWwsIG1Db21waWxlZFNxbCk7Ci0gICAgICAgICAgICBpZiAoU1FMaXRlRGVidWcuREVCVUdfQUNUSVZFX0NVUlNPUl9GSU5BTElaQVRJT04pIHsKLSAgICAgICAgICAgICAgICBMb2cudihUQUcsICJDcmVhdGVkIERiT2JqIChpZCMiICsgbUNvbXBpbGVkU3FsLm5TdGF0ZW1lbnQgKwotICAgICAgICAgICAgICAgICAgICAgICAgIikgZm9yIHNxbDogIiArIHNxbCk7Ci0gICAgICAgICAgICB9CisgICAgICAgICAgICBtRGF0YWJhc2UuYWRkVG9Db21waWxlZFF1ZXJpZXMobVNxbCwgbUNvbXBpbGVkU3FsKTsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIC8vIGl0IGlzIGFscmVhZHkgaW4gY29tcGlsZWQtc3FsIGNhY2hlLgogICAgICAgICAgICAgLy8gdHJ5IHRvIGFjcXVpcmUgdGhlIG9iamVjdC4KQEAgLTEwMCwxMyArMTM5LDcgQEAKICAgICAgICAgICAgICAgICAvLyB3ZSBjYW4ndCBoYXZlIHR3byBkaWZmZXJlbnQgU1FMaXRlUHJvZ2FtIG9iamVjdHMgY2FuJ3Qgc2hhcmUgdGhlIHNhbWUKICAgICAgICAgICAgICAgICAvLyBDb21waWxlZFNxbCBvYmplY3QuIGNyZWF0ZSBhIG5ldyBvbmUuCiAgICAgICAgICAgICAgICAgLy8gZmluYWxpemUgaXQgd2hlbiBJIGFtIGRvbmUgd2l0aCBpdCBpbiAidGhpcyIgb2JqZWN0LgotICAgICAgICAgICAgICAgIG1Db21waWxlZFNxbCA9IG5ldyBTUUxpdGVDb21waWxlZFNxbChkYiwgc3FsKTsKLSAgICAgICAgICAgICAgICBpZiAoU1FMaXRlRGVidWcuREVCVUdfQUNUSVZFX0NVUlNPUl9GSU5BTElaQVRJT04pIHsKLSAgICAgICAgICAgICAgICAgICAgTG9nLnYoVEFHLCAiKiogcG9zc2libGUgYnVnICoqIENyZWF0ZWQgTkVXIERiT2JqIChpZCMiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ29tcGlsZWRTcWwublN0YXRlbWVudCArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIikgYmVjYXVzZSB0aGUgcHJldmlvdXNseSBjcmVhdGVkIERiT2JqIChpZCMiICsgbGFzdCArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIikgd2FzIG5vdCByZWxlYXNlZCBmb3Igc3FsOiIgKyBzcWwpOwotICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBtQ29tcGlsZWRTcWwgPSBuZXcgU1FMaXRlQ29tcGlsZWRTcWwobURhdGFiYXNlLCBtU3FsKTsKICAgICAgICAgICAgICAgICAvLyBzaW5jZSBpdCBpcyBub3QgaW4gdGhlIGNhY2hlLCBubyBuZWVkIHRvIGFjcXVpcmUoKSBpdC4KICAgICAgICAgICAgIH0KICAgICAgICAgfQpAQCAtMTE1LDE4ICsxNDgsMTggQEAKIAogICAgIEBPdmVycmlkZQogICAgIHByb3RlY3RlZCB2b2lkIG9uQWxsUmVmZXJlbmNlc1JlbGVhc2VkKCkgewotICAgICAgICByZWxlYXNlQ29tcGlsZWRTcWxJZk5vdEluQ2FjaGUoKTsKLSAgICAgICAgbURhdGFiYXNlLnJlbGVhc2VSZWZlcmVuY2UoKTsKKyAgICAgICAgcmVsZWFzZSgpOwogICAgICAgICBtRGF0YWJhc2UucmVtb3ZlU1FMaXRlQ2xvc2FibGUodGhpcyk7CisgICAgICAgIG1EYXRhYmFzZS5yZWxlYXNlUmVmZXJlbmNlKCk7CiAgICAgfQogCiAgICAgQE92ZXJyaWRlCiAgICAgcHJvdGVjdGVkIHZvaWQgb25BbGxSZWZlcmVuY2VzUmVsZWFzZWRGcm9tQ29udGFpbmVyKCkgewotICAgICAgICByZWxlYXNlQ29tcGlsZWRTcWxJZk5vdEluQ2FjaGUoKTsKKyAgICAgICAgcmVsZWFzZSgpOwogICAgICAgICBtRGF0YWJhc2UucmVsZWFzZVJlZmVyZW5jZSgpOwogICAgIH0KIAotICAgIHByaXZhdGUgdm9pZCByZWxlYXNlQ29tcGlsZWRTcWxJZk5vdEluQ2FjaGUoKSB7CisgICAgLyogcGFja2FnZSAqLyBzeW5jaHJvbml6ZWQgdm9pZCByZWxlYXNlKCkgewogICAgICAgICBpZiAobUNvbXBpbGVkU3FsID09IG51bGwpIHsKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQpAQCAtMTM1LDIyICsxNjgsMzQgQEAKICAgICAgICAgICAgICAgICAvLyBpdCBpcyBOT1QgaW4gY29tcGlsZWQtc3FsIGNhY2hlLiBpLmUuLCByZXNwb25zaWJpbGl0eSBvZgogICAgICAgICAgICAgICAgIC8vIHJlbGVhc2luZyB0aGlzIHN0YXRlbWVudCBpcyBvbiBtZS4KICAgICAgICAgICAgICAgICBtQ29tcGlsZWRTcWwucmVsZWFzZVNxbFN0YXRlbWVudCgpOwotICAgICAgICAgICAgICAgIG1Db21waWxlZFNxbCA9IG51bGw7Ci0gICAgICAgICAgICAgICAgblN0YXRlbWVudCA9IDA7CiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIC8vIGl0IGlzIGluIGNvbXBpbGVkLXNxbCBjYWNoZS4gcmVzZXQgaXRzIENvbXBpbGVkU3FsI21JblVzZSBmbGFnCiAgICAgICAgICAgICAgICAgbUNvbXBpbGVkU3FsLnJlbGVhc2UoKTsKICAgICAgICAgICAgIH0KLSAgICAgICAgfSAKKyAgICAgICAgfQorICAgICAgICBtQ29tcGlsZWRTcWwgPSBudWxsOworICAgICAgICBuU3RhdGVtZW50ID0gMDsKICAgICB9CiAKICAgICAvKioKICAgICAgKiBSZXR1cm5zIGEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoaXMgcHJvZ3JhbS4KICAgICAgKgogICAgICAqIEByZXR1cm4gYSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhpcyBwcm9ncmFtCisgICAgICogQGRlcHJlY2F0ZWQgZG8gbm90IHVzZSB0aGlzIG1ldGhvZC4gaXQgaXMgbm90IGd1YXJhbnRlZWQgdG8gYmUgdGhlIHNhbWUgYWNyb3NzIGV4ZWN1dGlvbnMgb2YKKyAgICAgKiB0aGUgU1FMIHN0YXRlbWVudCBjb250YWluZWQgaW4gdGhpcyBvYmplY3QuCiAgICAgICovCisgICAgQERlcHJlY2F0ZWQKICAgICBwdWJsaWMgZmluYWwgaW50IGdldFVuaXF1ZUlkKCkgewotICAgICAgICByZXR1cm4gblN0YXRlbWVudDsKKyAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiB1c2VkIG9ubHkgZm9yIHRlc3RpbmcgcHVycG9zZXMKKyAgICAgKi8KKyAgICAvKiBwYWNrYWdlICovIGludCBnZXRTcWxTdGF0ZW1lbnRJZCgpIHsKKyAgICAgIHN5bmNocm9uaXplZCh0aGlzKSB7CisgICAgICAgIHJldHVybiAobUNvbXBpbGVkU3FsID09IG51bGwpID8gMCA6IG5TdGF0ZW1lbnQ7CisgICAgICB9CiAgICAgfQogCiAgICAgLyogcGFja2FnZSAqLyBTdHJpbmcgZ2V0U3FsU3RyaW5nKCkgewpAQCAtMTY5LDYgKzIxNCwzOSBAQAogICAgICAgICAvLyBUT0RPIGlzIHRoZXJlIGEgbmVlZCBmb3IgdGhpcz8KICAgICB9CiAKKyAgICBwcml2YXRlIHZvaWQgYmluZChpbnQgdHlwZSwgaW50IGluZGV4LCBPYmplY3QgdmFsdWUpIHsKKyAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7CisgICAgICAgICAgICBtRGF0YWJhc2UudmVyaWZ5RGJJc09wZW4oKTsKKyAgICAgICAgICAgIGFkZFRvQmluZEFyZ3MoaW5kZXgsICh0eXBlID09IEN1cnNvci5GSUVMRF9UWVBFX05VTEwpID8gbnVsbCA6IHZhbHVlKTsKKyAgICAgICAgICAgIGlmIChuU3RhdGVtZW50ID4gMCkgeworICAgICAgICAgICAgICAgIC8vIGJpbmQgb25seSBpZiB0aGUgU1FMIHN0YXRlbWVudCBpcyBjb21waWxlZAorICAgICAgICAgICAgICAgIGFjcXVpcmVSZWZlcmVuY2UoKTsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHR5cGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQ3Vyc29yLkZJRUxEX1RZUEVfTlVMTDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYXRpdmVfYmluZF9udWxsKGluZGV4KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQ3Vyc29yLkZJRUxEX1RZUEVfQkxPQjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYXRpdmVfYmluZF9ibG9iKGluZGV4LCAoYnl0ZVtdKSB2YWx1ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEN1cnNvci5GSUVMRF9UWVBFX0ZMT0FUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hdGl2ZV9iaW5kX2RvdWJsZShpbmRleCwgKERvdWJsZSkgdmFsdWUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBDdXJzb3IuRklFTERfVFlQRV9JTlRFR0VSOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hdGl2ZV9iaW5kX2xvbmcoaW5kZXgsIChMb25nKSB2YWx1ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEN1cnNvci5GSUVMRF9UWVBFX1NUUklORzoKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmF0aXZlX2JpbmRfc3RyaW5nKGluZGV4LCAoU3RyaW5nKSB2YWx1ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgICAgICByZWxlYXNlUmVmZXJlbmNlKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCiAgICAgLyoqCiAgICAgICogQmluZCBhIE5VTEwgdmFsdWUgdG8gdGhpcyBzdGF0ZW1lbnQuIFRoZSB2YWx1ZSByZW1haW5zIGJvdW5kIHVudGlsCiAgICAgICoge0BsaW5rICNjbGVhckJpbmRpbmdzfSBpcyBjYWxsZWQuCkBAIC0xNzYsMzQgKzI1NCwxOCBAQAogICAgICAqIEBwYXJhbSBpbmRleCBUaGUgMS1iYXNlZCBpbmRleCB0byB0aGUgcGFyYW1ldGVyIHRvIGJpbmQgbnVsbCB0bwogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIGJpbmROdWxsKGludCBpbmRleCkgewotICAgICAgICBpZiAoIW1EYXRhYmFzZS5pc09wZW4oKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiZGF0YWJhc2UgIiArIG1EYXRhYmFzZS5nZXRQYXRoKCkgKyAiIGFscmVhZHkgY2xvc2VkIik7Ci0gICAgICAgIH0KLSAgICAgICAgYWNxdWlyZVJlZmVyZW5jZSgpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgbmF0aXZlX2JpbmRfbnVsbChpbmRleCk7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICByZWxlYXNlUmVmZXJlbmNlKCk7Ci0gICAgICAgIH0KKyAgICAgICAgYmluZChDdXJzb3IuRklFTERfVFlQRV9OVUxMLCBpbmRleCwgbnVsbCk7CiAgICAgfQogCiAgICAgLyoqCiAgICAgICogQmluZCBhIGxvbmcgdmFsdWUgdG8gdGhpcyBzdGF0ZW1lbnQuIFRoZSB2YWx1ZSByZW1haW5zIGJvdW5kIHVudGlsCiAgICAgICoge0BsaW5rICNjbGVhckJpbmRpbmdzfSBpcyBjYWxsZWQuCi0gICAgICoKKyAgICAgKmFkZFRvQmluZEFyZ3MKICAgICAgKiBAcGFyYW0gaW5kZXggVGhlIDEtYmFzZWQgaW5kZXggdG8gdGhlIHBhcmFtZXRlciB0byBiaW5kCiAgICAgICogQHBhcmFtIHZhbHVlIFRoZSB2YWx1ZSB0byBiaW5kCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgYmluZExvbmcoaW50IGluZGV4LCBsb25nIHZhbHVlKSB7Ci0gICAgICAgIGlmICghbURhdGFiYXNlLmlzT3BlbigpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJkYXRhYmFzZSAiICsgbURhdGFiYXNlLmdldFBhdGgoKSArICIgYWxyZWFkeSBjbG9zZWQiKTsKLSAgICAgICAgfQotICAgICAgICBhY3F1aXJlUmVmZXJlbmNlKCk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBuYXRpdmVfYmluZF9sb25nKGluZGV4LCB2YWx1ZSk7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICByZWxlYXNlUmVmZXJlbmNlKCk7Ci0gICAgICAgIH0KKyAgICAgICAgYmluZChDdXJzb3IuRklFTERfVFlQRV9JTlRFR0VSLCBpbmRleCwgdmFsdWUpOwogICAgIH0KIAogICAgIC8qKgpAQCAtMjE0LDE1ICsyNzYsNyBAQAogICAgICAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUgdG8gYmluZAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIGJpbmREb3VibGUoaW50IGluZGV4LCBkb3VibGUgdmFsdWUpIHsKLSAgICAgICAgaWYgKCFtRGF0YWJhc2UuaXNPcGVuKCkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oImRhdGFiYXNlICIgKyBtRGF0YWJhc2UuZ2V0UGF0aCgpICsgIiBhbHJlYWR5IGNsb3NlZCIpOwotICAgICAgICB9Ci0gICAgICAgIGFjcXVpcmVSZWZlcmVuY2UoKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIG5hdGl2ZV9iaW5kX2RvdWJsZShpbmRleCwgdmFsdWUpOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgcmVsZWFzZVJlZmVyZW5jZSgpOwotICAgICAgICB9CisgICAgICAgIGJpbmQoQ3Vyc29yLkZJRUxEX1RZUEVfRkxPQVQsIGluZGV4LCB2YWx1ZSk7CiAgICAgfQogCiAgICAgLyoqCkBAIC0yMzYsMTUgKzI5MCw3IEBACiAgICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJ0aGUgYmluZCB2YWx1ZSBhdCBpbmRleCAiICsgaW5kZXggKyAiIGlzIG51bGwiKTsKICAgICAgICAgfQotICAgICAgICBpZiAoIW1EYXRhYmFzZS5pc09wZW4oKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiZGF0YWJhc2UgIiArIG1EYXRhYmFzZS5nZXRQYXRoKCkgKyAiIGFscmVhZHkgY2xvc2VkIik7Ci0gICAgICAgIH0KLSAgICAgICAgYWNxdWlyZVJlZmVyZW5jZSgpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgbmF0aXZlX2JpbmRfc3RyaW5nKGluZGV4LCB2YWx1ZSk7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICByZWxlYXNlUmVmZXJlbmNlKCk7Ci0gICAgICAgIH0KKyAgICAgICAgYmluZChDdXJzb3IuRklFTERfVFlQRV9TVFJJTkcsIGluZGV4LCB2YWx1ZSk7CiAgICAgfQogCiAgICAgLyoqCkBAIC0yNTgsMjkgKzMwNCwyNSBAQAogICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCkgewogICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigidGhlIGJpbmQgdmFsdWUgYXQgaW5kZXggIiArIGluZGV4ICsgIiBpcyBudWxsIik7CiAgICAgICAgIH0KLSAgICAgICAgaWYgKCFtRGF0YWJhc2UuaXNPcGVuKCkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oImRhdGFiYXNlICIgKyBtRGF0YWJhc2UuZ2V0UGF0aCgpICsgIiBhbHJlYWR5IGNsb3NlZCIpOwotICAgICAgICB9Ci0gICAgICAgIGFjcXVpcmVSZWZlcmVuY2UoKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIG5hdGl2ZV9iaW5kX2Jsb2IoaW5kZXgsIHZhbHVlKTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIHJlbGVhc2VSZWZlcmVuY2UoKTsKLSAgICAgICAgfQorICAgICAgICBiaW5kKEN1cnNvci5GSUVMRF9UWVBFX0JMT0IsIGluZGV4LCB2YWx1ZSk7CiAgICAgfQogCiAgICAgLyoqCiAgICAgICogQ2xlYXJzIGFsbCBleGlzdGluZyBiaW5kaW5ncy4gVW5zZXQgYmluZGluZ3MgYXJlIHRyZWF0ZWQgYXMgTlVMTC4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBjbGVhckJpbmRpbmdzKCkgewotICAgICAgICBpZiAoIW1EYXRhYmFzZS5pc09wZW4oKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiZGF0YWJhc2UgIiArIG1EYXRhYmFzZS5nZXRQYXRoKCkgKyAiIGFscmVhZHkgY2xvc2VkIik7Ci0gICAgICAgIH0KLSAgICAgICAgYWNxdWlyZVJlZmVyZW5jZSgpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgbmF0aXZlX2NsZWFyX2JpbmRpbmdzKCk7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICByZWxlYXNlUmVmZXJlbmNlKCk7CisgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgeworICAgICAgICAgICAgbUJpbmRBcmdzID0gbnVsbDsKKyAgICAgICAgICAgIGlmICh0aGlzLm5TdGF0ZW1lbnQgPT0gMCkgeworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1EYXRhYmFzZS52ZXJpZnlEYklzT3BlbigpOworICAgICAgICAgICAgYWNxdWlyZVJlZmVyZW5jZSgpOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBuYXRpdmVfY2xlYXJfYmluZGluZ3MoKTsKKyAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgcmVsZWFzZVJlZmVyZW5jZSgpOworICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQogCkBAIC0yODgsMTggKzMzMCw3NiBAQAogICAgICAqIFJlbGVhc2UgdGhpcyBwcm9ncmFtJ3MgcmVzb3VyY2VzLCBtYWtpbmcgaXQgaW52YWxpZC4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBjbG9zZSgpIHsKLSAgICAgICAgaWYgKCFtRGF0YWJhc2UuaXNPcGVuKCkpIHsKKyAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7CisgICAgICAgICAgICBtQmluZEFyZ3MgPSBudWxsOworICAgICAgICAgICAgaWYgKG5IYW5kbGUgPT0gMCB8fCAhbURhdGFiYXNlLmlzT3BlbigpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmVsZWFzZVJlZmVyZW5jZSgpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzeW5jaHJvbml6ZWQgdm9pZCBhZGRUb0JpbmRBcmdzKGludCBpbmRleCwgT2JqZWN0IHZhbHVlKSB7CisgICAgICAgIGlmIChtQmluZEFyZ3MgPT0gbnVsbCkgeworICAgICAgICAgICAgbUJpbmRBcmdzID0gbmV3IEhhc2hNYXA8SW50ZWdlciwgT2JqZWN0PigpOworICAgICAgICB9CisgICAgICAgIG1CaW5kQXJncy5wdXQoaW5kZXgsIHZhbHVlKTsKKyAgICB9CisKKyAgICAvKiBwYWNrYWdlICovIHN5bmNocm9uaXplZCB2b2lkIGNvbXBpbGVBbmRiaW5kQWxsQXJncygpIHsKKyAgICAgICAgaWYgKG5TdGF0ZW1lbnQgPT0gMCkgeworICAgICAgICAgICAgLy8gU1FMIHN0YXRlbWVudCBpcyBub3QgY29tcGlsZWQgeWV0LiBjb21waWxlIGl0IG5vdy4KKyAgICAgICAgICAgIGNvbXBpbGVTcWwoKTsKKyAgICAgICAgfQorICAgICAgICBpZiAobUJpbmRBcmdzID09IG51bGwpIHsKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQotICAgICAgICBtRGF0YWJhc2UubG9jaygpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgcmVsZWFzZVJlZmVyZW5jZSgpOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgbURhdGFiYXNlLnVubG9jaygpOworICAgICAgICBmb3IgKGludCBpbmRleCA6IG1CaW5kQXJncy5rZXlTZXQoKSkgeworICAgICAgICAgICAgT2JqZWN0IHZhbHVlID0gbUJpbmRBcmdzLmdldChpbmRleCk7CisgICAgICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG5hdGl2ZV9iaW5kX251bGwoaW5kZXgpOworICAgICAgICAgICAgfSBlbHNlIGlmICh2YWx1ZSBpbnN0YW5jZW9mIERvdWJsZSB8fCB2YWx1ZSBpbnN0YW5jZW9mIEZsb2F0KSB7CisgICAgICAgICAgICAgICAgbmF0aXZlX2JpbmRfZG91YmxlKGluZGV4LCAoKE51bWJlcikgdmFsdWUpLmRvdWJsZVZhbHVlKCkpOworICAgICAgICAgICAgfSBlbHNlIGlmICh2YWx1ZSBpbnN0YW5jZW9mIE51bWJlcikgeworICAgICAgICAgICAgICAgIG5hdGl2ZV9iaW5kX2xvbmcoaW5kZXgsICgoTnVtYmVyKSB2YWx1ZSkubG9uZ1ZhbHVlKCkpOworICAgICAgICAgICAgfSBlbHNlIGlmICh2YWx1ZSBpbnN0YW5jZW9mIEJvb2xlYW4pIHsKKyAgICAgICAgICAgICAgICBCb29sZWFuIGJvb2wgPSAoQm9vbGVhbil2YWx1ZTsKKyAgICAgICAgICAgICAgICBuYXRpdmVfYmluZF9sb25nKGluZGV4LCAoYm9vbCkgPyAxIDogMCk7CisgICAgICAgICAgICAgICAgaWYgKGJvb2wpIHsKKyAgICAgICAgICAgICAgICAgICAgbmF0aXZlX2JpbmRfbG9uZyhpbmRleCwgMSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgbmF0aXZlX2JpbmRfbG9uZyhpbmRleCwgMCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIGlmICh2YWx1ZSBpbnN0YW5jZW9mIGJ5dGVbXSl7CisgICAgICAgICAgICAgICAgbmF0aXZlX2JpbmRfYmxvYihpbmRleCwgKGJ5dGVbXSkgdmFsdWUpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBuYXRpdmVfYmluZF9zdHJpbmcoaW5kZXgsIHZhbHVlLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQogCiAgICAgLyoqCisgICAgICogR2l2ZW4gYW4gYXJyYXkgb2YgU3RyaW5nIGJpbmRBcmdzLCB0aGlzIG1ldGhvZCBiaW5kcyBhbGwgb2YgdGhlbSBpbiBvbmUgc2luZ2xlIGNhbGwuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYmluZEFyZ3MgdGhlIFN0cmluZyBhcnJheSBvZiBiaW5kIGFyZ3MuCisgICAgICovCisgICAgcHVibGljIHZvaWQgYmluZEFsbEFyZ3NBc1N0cmluZ3MoU3RyaW5nW10gYmluZEFyZ3MpIHsKKyAgICAgICAgaWYgKGJpbmRBcmdzID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBpbnQgc2l6ZSA9IGJpbmRBcmdzLmxlbmd0aDsKKyAgICAgICAgc3luY2hyb25pemVkKHRoaXMpIHsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CisgICAgICAgICAgICAgICAgYmluZFN0cmluZyhpICsgMSwgYmluZEFyZ3NbaV0pOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyogcGFja2FnZSAqLyBzeW5jaHJvbml6ZWQgZmluYWwgdm9pZCBzZXROYXRpdmVIYW5kbGUoaW50IG5IYW5kbGUpIHsKKyAgICAgICAgdGhpcy5uSGFuZGxlID0gbkhhbmRsZTsKKyAgICB9CisKKyAgICAvKioKICAgICAgKiBAZGVwcmVjYXRlZCBUaGlzIG1ldGhvZCBpcyBkZXByZWNhdGVkIGFuZCBtdXN0IG5vdCBiZSB1c2VkLgogICAgICAqIENvbXBpbGVzIFNRTCBpbnRvIGEgU1FMaXRlIHByb2dyYW0uCiAgICAgICoKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9TUUxpdGVRdWVyeS5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2Uvc3FsaXRlL1NRTGl0ZVF1ZXJ5LmphdmEKaW5kZXggOTA1YjY2Yi4uZTllMDE3MiAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2Uvc3FsaXRlL1NRTGl0ZVF1ZXJ5LmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2Uvc3FsaXRlL1NRTGl0ZVF1ZXJ5LmphdmEKQEAgLTI4LDI4ICsyOCwzOCBAQAogICogdGhyZWFkcyBzaG91bGQgcGVyZm9ybSBpdHMgb3duIHN5bmNocm9uaXphdGlvbiB3aGVuIHVzaW5nIHRoZSBTUUxpdGVRdWVyeS4KICAqLwogcHVibGljIGNsYXNzIFNRTGl0ZVF1ZXJ5IGV4dGVuZHMgU1FMaXRlUHJvZ3JhbSB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJDdXJzb3IiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiU1FMaXRlUXVlcnkiOwogCiAgICAgLyoqIFRoZSBpbmRleCBvZiB0aGUgdW5ib3VuZCBPRkZTRVQgcGFyYW1ldGVyICovCi0gICAgcHJpdmF0ZSBpbnQgbU9mZnNldEluZGV4OwotICAgIAotICAgIC8qKiBBcmdzIHRvIGJpbmQgb24gcmVxdWVyeSAqLwotICAgIHByaXZhdGUgU3RyaW5nW10gbUJpbmRBcmdzOworICAgIHByaXZhdGUgaW50IG1PZmZzZXRJbmRleCA9IDA7CiAKICAgICBwcml2YXRlIGJvb2xlYW4gbUNsb3NlZCA9IGZhbHNlOwogCiAgICAgLyoqCiAgICAgICogQ3JlYXRlIGEgcGVyc2lzdGVudCBxdWVyeSBvYmplY3QuCi0gICAgICogCisgICAgICoKICAgICAgKiBAcGFyYW0gZGIgVGhlIGRhdGFiYXNlIHRoYXQgdGhpcyBxdWVyeSBvYmplY3QgaXMgYXNzb2NpYXRlZCB3aXRoCiAgICAgICogQHBhcmFtIHF1ZXJ5IFRoZSBTUUwgc3RyaW5nIGZvciB0aGlzIHF1ZXJ5LiAKICAgICAgKiBAcGFyYW0gb2Zmc2V0SW5kZXggVGhlIDEtYmFzZWQgaW5kZXggdG8gdGhlIE9GRlNFVCBwYXJhbWV0ZXIsIAogICAgICAqLwogICAgIC8qIHBhY2thZ2UgKi8gU1FMaXRlUXVlcnkoU1FMaXRlRGF0YWJhc2UgZGIsIFN0cmluZyBxdWVyeSwgaW50IG9mZnNldEluZGV4LCBTdHJpbmdbXSBiaW5kQXJncykgewogICAgICAgICBzdXBlcihkYiwgcXVlcnkpOwotCiAgICAgICAgIG1PZmZzZXRJbmRleCA9IG9mZnNldEluZGV4OwotICAgICAgICBtQmluZEFyZ3MgPSBiaW5kQXJnczsKKyAgICAgICAgYmluZEFsbEFyZ3NBc1N0cmluZ3MoYmluZEFyZ3MpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdG9yIHVzZWQgdG8gY3JlYXRlIG5ldyBpbnN0YW5jZSB0byByZXBsYWNlIGEgZ2l2ZW4gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcy4KKyAgICAgKiBUaGlzIGNvbnN0cnVjdG9yIGlzIHVzZWQgd2hlbiB0aGUgY3VycmVudCBRdWVyeSBvYmplY3QgaXMgbm93IGFzc29jaWF0ZWQgd2l0aCBhIGRpZmZlcmVudAorICAgICAqIHtAbGluayBTUUxpdGVEYXRhYmFzZX0gb2JqZWN0LgorICAgICAqCisgICAgICogQHBhcmFtIGRiIFRoZSBkYXRhYmFzZSB0aGF0IHRoaXMgcXVlcnkgb2JqZWN0IGlzIGFzc29jaWF0ZWQgd2l0aAorICAgICAqIEBwYXJhbSBxdWVyeSB0aGUgaW5zdGFuY2Ugb2Yge0BsaW5rIFNRTGl0ZVF1ZXJ5fSB0byBiZSByZXBsYWNlZAorICAgICAqLworICAgIC8qIHBhY2thZ2UgKi8gU1FMaXRlUXVlcnkoU1FMaXRlRGF0YWJhc2UgZGIsIFNRTGl0ZVF1ZXJ5IHF1ZXJ5KSB7CisgICAgICAgIHN1cGVyKGRiLCBxdWVyeS5tU3FsKTsKKyAgICAgICAgdGhpcy5tQmluZEFyZ3MgPSBxdWVyeS5tQmluZEFyZ3M7CisgICAgICAgIHRoaXMubU9mZnNldEluZGV4ID0gcXVlcnkubU9mZnNldEluZGV4OwogICAgIH0KIAogICAgIC8qKgpAQCAtNzAsMTMgKzgwLDggQEAKICAgICAgICAgICAgICAgICAvLyBpZiB0aGUgc3RhcnQgcG9zIGlzIG5vdCBlcXVhbCB0byAwLCB0aGVuIG1vc3QgbGlrZWx5IHdpbmRvdyBpcwogICAgICAgICAgICAgICAgIC8vIHRvbyBzbWFsbCBmb3IgdGhlIGRhdGEgc2V0LCBsb2FkaW5nIGJ5IGFub3RoZXIgdGhyZWFkCiAgICAgICAgICAgICAgICAgLy8gaXMgbm90IHNhZmUgaW4gdGhpcyBzaXR1YXRpb24uIHRoZSBuYXRpdmUgY29kZSB3aWxsIGlnbm9yZSBtYXhSZWFkCi0gICAgICAgICAgICAgICAgaW50IG51bVJvd3MgPSBuYXRpdmVfZmlsbF93aW5kb3cod2luZG93LCB3aW5kb3cuZ2V0U3RhcnRQb3NpdGlvbigpLCBtT2Zmc2V0SW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICBtYXhSZWFkLCBsYXN0UG9zKTsKLQotICAgICAgICAgICAgICAgIC8vIExvZ2dpbmcKLSAgICAgICAgICAgICAgICBpZiAoU1FMaXRlRGVidWcuREVCVUdfU1FMX1NUQVRFTUVOVFMpIHsKLSAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiZmlsbFdpbmRvdygpOiAiICsgbVNxbCk7Ci0gICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGludCBudW1Sb3dzID0gbmF0aXZlX2ZpbGxfd2luZG93KHdpbmRvdywgd2luZG93LmdldFN0YXJ0UG9zaXRpb24oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1PZmZzZXRJbmRleCwgbWF4UmVhZCwgbGFzdFBvcyk7CiAgICAgICAgICAgICAgICAgbURhdGFiYXNlLmxvZ1RpbWVTdGF0KG1TcWwsIHRpbWVTdGFydCk7CiAgICAgICAgICAgICAgICAgcmV0dXJuIG51bVJvd3M7CiAgICAgICAgICAgICB9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZSl7CkBAIC04NSw2ICs5MCw5IEBACiAgICAgICAgICAgICB9IGNhdGNoIChTUUxpdGVEYXRhYmFzZUNvcnJ1cHRFeGNlcHRpb24gZSkgewogICAgICAgICAgICAgICAgIG1EYXRhYmFzZS5vbkNvcnJ1cHRpb24oKTsKICAgICAgICAgICAgICAgICB0aHJvdyBlOworICAgICAgICAgICAgfSBjYXRjaCAoU1FMaXRlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBMb2cuZShUQUcsICJleGNlcHRpb246ICIgKyBlLmdldE1lc3NhZ2UoKSArICI7IHF1ZXJ5OiAiICsgbVNxbCk7CisgICAgICAgICAgICAgICAgdGhyb3cgZTsKICAgICAgICAgICAgIH0gZmluYWxseSB7CiAgICAgICAgICAgICAgICAgd2luZG93LnJlbGVhc2VSZWZlcmVuY2UoKTsKICAgICAgICAgICAgIH0KQEAgLTE0MSw1MSArMTQ5LDEzIEBACiAgICAgICogQ2FsbGVkIGJ5IFNRTGl0ZUN1cnNvciB3aGVuIGl0IGlzIHJlcXVlcmllZC4KICAgICAgKi8KICAgICAvKiBwYWNrYWdlICovIHZvaWQgcmVxdWVyeSgpIHsKLSAgICAgICAgaWYgKG1CaW5kQXJncyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpbnQgbGVuID0gbUJpbmRBcmdzLmxlbmd0aDsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW47IGkrKykgewotICAgICAgICAgICAgICAgICAgICBzdXBlci5iaW5kU3RyaW5nKGkgKyAxLCBtQmluZEFyZ3NbaV0pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gY2F0Y2ggKFNRTGl0ZU1pc3VzZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nQnVpbGRlciBlcnJNc2cgPSBuZXcgU3RyaW5nQnVpbGRlcigibVNxbCAiICsgbVNxbCk7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW47IGkrKykgewotICAgICAgICAgICAgICAgICAgICBlcnJNc2cuYXBwZW5kKCIgIik7Ci0gICAgICAgICAgICAgICAgICAgIGVyck1zZy5hcHBlbmQobUJpbmRBcmdzW2ldKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZXJyTXNnLmFwcGVuZCgiICIpOwotICAgICAgICAgICAgICAgIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBsZWFrUHJvZ3JhbSA9IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICBlcnJNc2cudG9TdHJpbmcoKSwgZSk7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbGVha1Byb2dyYW07ICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgfQorICAgICAgICBpZiAobUNsb3NlZCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigicmVxdWVyeWluZyBhIGNsb3NlZCBjdXJzb3IiKTsKICAgICAgICAgfQorICAgICAgICBjb21waWxlQW5kYmluZEFsbEFyZ3MoKTsKICAgICB9CiAKLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBiaW5kTnVsbChpbnQgaW5kZXgpIHsKLSAgICAgICAgbUJpbmRBcmdzW2luZGV4IC0gMV0gPSBudWxsOwotICAgICAgICBpZiAoIW1DbG9zZWQpIHN1cGVyLmJpbmROdWxsKGluZGV4KTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBiaW5kTG9uZyhpbnQgaW5kZXgsIGxvbmcgdmFsdWUpIHsKLSAgICAgICAgbUJpbmRBcmdzW2luZGV4IC0gMV0gPSBMb25nLnRvU3RyaW5nKHZhbHVlKTsKLSAgICAgICAgaWYgKCFtQ2xvc2VkKSBzdXBlci5iaW5kTG9uZyhpbmRleCwgdmFsdWUpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGJpbmREb3VibGUoaW50IGluZGV4LCBkb3VibGUgdmFsdWUpIHsKLSAgICAgICAgbUJpbmRBcmdzW2luZGV4IC0gMV0gPSBEb3VibGUudG9TdHJpbmcodmFsdWUpOwotICAgICAgICBpZiAoIW1DbG9zZWQpIHN1cGVyLmJpbmREb3VibGUoaW5kZXgsIHZhbHVlKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBiaW5kU3RyaW5nKGludCBpbmRleCwgU3RyaW5nIHZhbHVlKSB7Ci0gICAgICAgIG1CaW5kQXJnc1tpbmRleCAtIDFdID0gdmFsdWU7Ci0gICAgICAgIGlmICghbUNsb3NlZCkgc3VwZXIuYmluZFN0cmluZyhpbmRleCwgdmFsdWUpOwotICAgIH0KLQotICAgIHByaXZhdGUgZmluYWwgbmF0aXZlIGludCBuYXRpdmVfZmlsbF93aW5kb3coQ3Vyc29yV2luZG93IHdpbmRvdywgCisgICAgcHJpdmF0ZSBmaW5hbCBuYXRpdmUgaW50IG5hdGl2ZV9maWxsX3dpbmRvdyhDdXJzb3JXaW5kb3cgd2luZG93LAogICAgICAgICAgICAgaW50IHN0YXJ0UG9zLCBpbnQgb2Zmc2V0UGFyYW0sIGludCBtYXhSZWFkLCBpbnQgbGFzdFBvcyk7CiAKICAgICBwcml2YXRlIGZpbmFsIG5hdGl2ZSBpbnQgbmF0aXZlX2NvbHVtbl9jb3VudCgpOwpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2Uvc3FsaXRlL1NRTGl0ZVJlYWRPbmx5RGF0YWJhc2VFeGNlcHRpb24uamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9TUUxpdGVSZWFkT25seURhdGFiYXNlRXhjZXB0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWI2MzNjNgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9TUUxpdGVSZWFkT25seURhdGFiYXNlRXhjZXB0aW9uLmphdmEKQEAgLTAsMCArMSwyNSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGU7CisKK3B1YmxpYyBjbGFzcyBTUUxpdGVSZWFkT25seURhdGFiYXNlRXhjZXB0aW9uIGV4dGVuZHMgU1FMaXRlRXhjZXB0aW9uIHsKKyAgICBwdWJsaWMgU1FMaXRlUmVhZE9ubHlEYXRhYmFzZUV4Y2VwdGlvbigpIHt9CisKKyAgICBwdWJsaWMgU1FMaXRlUmVhZE9ubHlEYXRhYmFzZUV4Y2VwdGlvbihTdHJpbmcgZXJyb3IpIHsKKyAgICAgICAgc3VwZXIoZXJyb3IpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9TUUxpdGVTdGF0ZW1lbnQuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9TUUxpdGVTdGF0ZW1lbnQuamF2YQppbmRleCA5ZTQyNWMzLi42NThmYzU4IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9zcWxpdGUvU1FMaXRlU3RhdGVtZW50LmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2Uvc3FsaXRlL1NRTGl0ZVN0YXRlbWVudC5qYXZhCkBAIC0xNiw3ICsxNiwxMiBAQAogCiBwYWNrYWdlIGFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlOwogCitpbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5EYXRhYmFzZVV0aWxzOworaW1wb3J0IGFuZHJvaWQub3MuUGFyY2VsRmlsZURlc2NyaXB0b3I7CiBpbXBvcnQgYW5kcm9pZC5vcy5TeXN0ZW1DbG9jazsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKIAogaW1wb3J0IGRhbHZpay5zeXN0ZW0uQmxvY2tHdWFyZDsKIApAQCAtMjUsNDQgKzMwLDY0IEBACiAgKiBUaGUgc3RhdGVtZW50IGNhbm5vdCByZXR1cm4gbXVsdGlwbGUgcm93cywgYnV0IDF4MSByZXN1bHQgc2V0cyBhcmUgYWxsb3dlZC4KICAqIERvbid0IHVzZSBTUUxpdGVTdGF0ZW1lbnQgY29uc3RydWN0b3IgZGlyZWN0bHksIHBsZWFzZSB1c2UKICAqIHtAbGluayBTUUxpdGVEYXRhYmFzZSNjb21waWxlU3RhdGVtZW50KFN0cmluZyl9Ci0gKgorICo8cD4KICAqIFNRTGl0ZVN0YXRlbWVudCBpcyBub3QgaW50ZXJuYWxseSBzeW5jaHJvbml6ZWQgc28gY29kZSB1c2luZyBhIFNRTGl0ZVN0YXRlbWVudCBmcm9tIG11bHRpcGxlCiAgKiB0aHJlYWRzIHNob3VsZCBwZXJmb3JtIGl0cyBvd24gc3luY2hyb25pemF0aW9uIHdoZW4gdXNpbmcgdGhlIFNRTGl0ZVN0YXRlbWVudC4KICAqLworQFN1cHByZXNzV2FybmluZ3MoImRlcHJlY2F0aW9uIikKIHB1YmxpYyBjbGFzcyBTUUxpdGVTdGF0ZW1lbnQgZXh0ZW5kcyBTUUxpdGVQcm9ncmFtCiB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJTUUxpdGVTdGF0ZW1lbnQiOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBSRUFEID0gdHJ1ZTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIFdSSVRFID0gZmFsc2U7CisKKyAgICBwcml2YXRlIFNRTGl0ZURhdGFiYXNlIG1PcmlnRGI7CisgICAgcHJpdmF0ZSBpbnQgbVN0YXRlOworICAgIC8qKiBwb3NzaWJsZSB2YWx1ZSBmb3Ige0BsaW5rICNtU3RhdGV9LiBpbmRpY2F0ZXMgdGhhdCBhIHRyYW5zYWN0aW9uIGlzIHN0YXJ0ZWQuICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFRSQU5TX1NUQVJURUQgPSAxOworICAgIC8qKiBwb3NzaWJsZSB2YWx1ZSBmb3Ige0BsaW5rICNtU3RhdGV9LiBpbmRpY2F0ZXMgdGhhdCBhIGxvY2sgaXMgYWNxdWlyZWQuICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IExPQ0tfQUNRVUlSRUQgPSAyOworCiAgICAgLyoqCiAgICAgICogRG9uJ3QgdXNlIFNRTGl0ZVN0YXRlbWVudCBjb25zdHJ1Y3RvciBkaXJlY3RseSwgcGxlYXNlIHVzZQogICAgICAqIHtAbGluayBTUUxpdGVEYXRhYmFzZSNjb21waWxlU3RhdGVtZW50KFN0cmluZyl9CiAgICAgICogQHBhcmFtIGRiCiAgICAgICogQHBhcmFtIHNxbAogICAgICAqLwotICAgIC8qIHBhY2thZ2UgKi8gU1FMaXRlU3RhdGVtZW50KFNRTGl0ZURhdGFiYXNlIGRiLCBTdHJpbmcgc3FsKSB7Ci0gICAgICAgIHN1cGVyKGRiLCBzcWwpOworICAgIC8qIHBhY2thZ2UgKi8gU1FMaXRlU3RhdGVtZW50KFNRTGl0ZURhdGFiYXNlIGRiLCBTdHJpbmcgc3FsLCBPYmplY3RbXSBiaW5kQXJncykgeworICAgICAgICBzdXBlcihkYiwgc3FsLCBiaW5kQXJncywgZmFsc2UgLyogZG9uJ3QgY29tcGlsZSBzcWwgc3RhdGVtZW50ICovKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBFeGVjdXRlIHRoaXMgU1FMIHN0YXRlbWVudCwgaWYgaXQgaXMgbm90IGEgcXVlcnkuIEZvciBleGFtcGxlLAotICAgICAqIENSRUFURSBUQUJMRSwgREVMVEUsIElOU0VSVCwgZXRjLgorICAgICAqIEV4ZWN1dGUgdGhpcyBTUUwgc3RhdGVtZW50LCBpZiBpdCBpcyBub3QgYSBTRUxFQ1QgLyBJTlNFUlQgLyBERUxFVEUgLyBVUERBVEUsIGZvciBleGFtcGxlCisgICAgICogQ1JFQVRFIC8gRFJPUCB0YWJsZSwgdmlldywgdHJpZ2dlciwgaW5kZXggZXRjLgogICAgICAqCiAgICAgICogQHRocm93cyBhbmRyb2lkLmRhdGFiYXNlLlNRTEV4Y2VwdGlvbiBJZiB0aGUgU1FMIHN0cmluZyBpcyBpbnZhbGlkIGZvcgogICAgICAqICAgICAgICAgc29tZSByZWFzb24KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBleGVjdXRlKCkgewotICAgICAgICBCbG9ja0d1YXJkLmdldFRocmVhZFBvbGljeSgpLm9uV3JpdGVUb0Rpc2soKTsKLSAgICAgICAgaWYgKCFtRGF0YWJhc2UuaXNPcGVuKCkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oImRhdGFiYXNlICIgKyBtRGF0YWJhc2UuZ2V0UGF0aCgpICsgIiBhbHJlYWR5IGNsb3NlZCIpOwotICAgICAgICB9Ci0gICAgICAgIGxvbmcgdGltZVN0YXJ0ID0gU3lzdGVtQ2xvY2sudXB0aW1lTWlsbGlzKCk7Ci0gICAgICAgIG1EYXRhYmFzZS5sb2NrKCk7CisgICAgICAgIGV4ZWN1dGVVcGRhdGVEZWxldGUoKTsKKyAgICB9CiAKLSAgICAgICAgYWNxdWlyZVJlZmVyZW5jZSgpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgbmF0aXZlX2V4ZWN1dGUoKTsKLSAgICAgICAgICAgIG1EYXRhYmFzZS5sb2dUaW1lU3RhdChtU3FsLCB0aW1lU3RhcnQpOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgcmVsZWFzZVJlZmVyZW5jZSgpOwotICAgICAgICAgICAgbURhdGFiYXNlLnVubG9jaygpOworICAgIC8qKgorICAgICAqIEV4ZWN1dGUgdGhpcyBTUUwgc3RhdGVtZW50LCBpZiB0aGUgdGhlIG51bWJlciBvZiByb3dzIGFmZmVjdGVkIGJ5IGV4ZWN0aW9uIG9mIHRoaXMgU1FMCisgICAgICogc3RhdGVtZW50IGlzIG9mIGFueSBpbXBvcnRhbmNlIHRvIHRoZSBjYWxsZXIgLSBmb3IgZXhhbXBsZSwgVVBEQVRFIC8gREVMRVRFIFNRTCBzdGF0ZW1lbnRzLgorICAgICAqCisgICAgICogQHJldHVybiB0aGUgbnVtYmVyIG9mIHJvd3MgYWZmZWN0ZWQgYnkgdGhpcyBTUUwgc3RhdGVtZW50IGV4ZWN1dGlvbi4KKyAgICAgKiBAdGhyb3dzIGFuZHJvaWQuZGF0YWJhc2UuU1FMRXhjZXB0aW9uIElmIHRoZSBTUUwgc3RyaW5nIGlzIGludmFsaWQgZm9yCisgICAgICogICAgICAgICBzb21lIHJlYXNvbgorICAgICAqLworICAgIHB1YmxpYyBpbnQgZXhlY3V0ZVVwZGF0ZURlbGV0ZSgpIHsKKyAgICAgICAgc3luY2hyb25pemVkKHRoaXMpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgbG9uZyB0aW1lU3RhcnQgPSBhY3F1aXJlQW5kTG9jayhXUklURSk7CisgICAgICAgICAgICAgICAgaW50IG51bUNoYW5nZXMgPSBuYXRpdmVfZXhlY3V0ZSgpOworICAgICAgICAgICAgICAgIG1EYXRhYmFzZS5sb2dUaW1lU3RhdChtU3FsLCB0aW1lU3RhcnQpOworICAgICAgICAgICAgICAgIHJldHVybiBudW1DaGFuZ2VzOworICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICByZWxlYXNlQW5kVW5sb2NrKCk7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTc2LDIxICsxMDEsMTUgQEAKICAgICAgKiAgICAgICAgIHNvbWUgcmVhc29uCiAgICAgICovCiAgICAgcHVibGljIGxvbmcgZXhlY3V0ZUluc2VydCgpIHsKLSAgICAgICAgQmxvY2tHdWFyZC5nZXRUaHJlYWRQb2xpY3koKS5vbldyaXRlVG9EaXNrKCk7Ci0gICAgICAgIGlmICghbURhdGFiYXNlLmlzT3BlbigpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJkYXRhYmFzZSAiICsgbURhdGFiYXNlLmdldFBhdGgoKSArICIgYWxyZWFkeSBjbG9zZWQiKTsKLSAgICAgICAgfQotICAgICAgICBsb25nIHRpbWVTdGFydCA9IFN5c3RlbUNsb2NrLnVwdGltZU1pbGxpcygpOwotICAgICAgICBtRGF0YWJhc2UubG9jaygpOwotCi0gICAgICAgIGFjcXVpcmVSZWZlcmVuY2UoKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIG5hdGl2ZV9leGVjdXRlKCk7Ci0gICAgICAgICAgICBtRGF0YWJhc2UubG9nVGltZVN0YXQobVNxbCwgdGltZVN0YXJ0KTsKLSAgICAgICAgICAgIHJldHVybiAobURhdGFiYXNlLmxhc3RDaGFuZ2VDb3VudCgpID4gMCkgPyBtRGF0YWJhc2UubGFzdEluc2VydFJvdygpIDogLTE7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICByZWxlYXNlUmVmZXJlbmNlKCk7Ci0gICAgICAgICAgICBtRGF0YWJhc2UudW5sb2NrKCk7CisgICAgICAgIHN5bmNocm9uaXplZCh0aGlzKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGxvbmcgdGltZVN0YXJ0ID0gYWNxdWlyZUFuZExvY2soV1JJVEUpOworICAgICAgICAgICAgICAgIGxvbmcgbGFzdEluc2VydGVkUm93SWQgPSBuYXRpdmVfZXhlY3V0ZUluc2VydCgpOworICAgICAgICAgICAgICAgIG1EYXRhYmFzZS5sb2dUaW1lU3RhdChtU3FsLCB0aW1lU3RhcnQpOworICAgICAgICAgICAgICAgIHJldHVybiBsYXN0SW5zZXJ0ZWRSb3dJZDsKKyAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgcmVsZWFzZUFuZFVubG9jaygpOworICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQogCkBAIC0xMDMsMjEgKzEyMiwxNSBAQAogICAgICAqIEB0aHJvd3MgYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGUuU1FMaXRlRG9uZUV4Y2VwdGlvbiBpZiB0aGUgcXVlcnkgcmV0dXJucyB6ZXJvIHJvd3MKICAgICAgKi8KICAgICBwdWJsaWMgbG9uZyBzaW1wbGVRdWVyeUZvckxvbmcoKSB7Ci0gICAgICAgIEJsb2NrR3VhcmQuZ2V0VGhyZWFkUG9saWN5KCkub25SZWFkRnJvbURpc2soKTsKLSAgICAgICAgaWYgKCFtRGF0YWJhc2UuaXNPcGVuKCkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oImRhdGFiYXNlICIgKyBtRGF0YWJhc2UuZ2V0UGF0aCgpICsgIiBhbHJlYWR5IGNsb3NlZCIpOwotICAgICAgICB9Ci0gICAgICAgIGxvbmcgdGltZVN0YXJ0ID0gU3lzdGVtQ2xvY2sudXB0aW1lTWlsbGlzKCk7Ci0gICAgICAgIG1EYXRhYmFzZS5sb2NrKCk7Ci0KLSAgICAgICAgYWNxdWlyZVJlZmVyZW5jZSgpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgbG9uZyByZXRWYWx1ZSA9IG5hdGl2ZV8xeDFfbG9uZygpOwotICAgICAgICAgICAgbURhdGFiYXNlLmxvZ1RpbWVTdGF0KG1TcWwsIHRpbWVTdGFydCk7Ci0gICAgICAgICAgICByZXR1cm4gcmV0VmFsdWU7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICByZWxlYXNlUmVmZXJlbmNlKCk7Ci0gICAgICAgICAgICBtRGF0YWJhc2UudW5sb2NrKCk7CisgICAgICAgIHN5bmNocm9uaXplZCh0aGlzKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGxvbmcgdGltZVN0YXJ0ID0gYWNxdWlyZUFuZExvY2soUkVBRCk7CisgICAgICAgICAgICAgICAgbG9uZyByZXRWYWx1ZSA9IG5hdGl2ZV8xeDFfbG9uZygpOworICAgICAgICAgICAgICAgIG1EYXRhYmFzZS5sb2dUaW1lU3RhdChtU3FsLCB0aW1lU3RhcnQpOworICAgICAgICAgICAgICAgIHJldHVybiByZXRWYWx1ZTsKKyAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgcmVsZWFzZUFuZFVubG9jaygpOworICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQogCkBAIC0xMzAsMjUgKzE0MywxMzYgQEAKICAgICAgKiBAdGhyb3dzIGFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlLlNRTGl0ZURvbmVFeGNlcHRpb24gaWYgdGhlIHF1ZXJ5IHJldHVybnMgemVybyByb3dzCiAgICAgICovCiAgICAgcHVibGljIFN0cmluZyBzaW1wbGVRdWVyeUZvclN0cmluZygpIHsKLSAgICAgICAgQmxvY2tHdWFyZC5nZXRUaHJlYWRQb2xpY3koKS5vblJlYWRGcm9tRGlzaygpOwotICAgICAgICBpZiAoIW1EYXRhYmFzZS5pc09wZW4oKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiZGF0YWJhc2UgIiArIG1EYXRhYmFzZS5nZXRQYXRoKCkgKyAiIGFscmVhZHkgY2xvc2VkIik7Ci0gICAgICAgIH0KLSAgICAgICAgbG9uZyB0aW1lU3RhcnQgPSBTeXN0ZW1DbG9jay51cHRpbWVNaWxsaXMoKTsKLSAgICAgICAgbURhdGFiYXNlLmxvY2soKTsKLQotICAgICAgICBhY3F1aXJlUmVmZXJlbmNlKCk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBTdHJpbmcgcmV0VmFsdWUgPSBuYXRpdmVfMXgxX3N0cmluZygpOwotICAgICAgICAgICAgbURhdGFiYXNlLmxvZ1RpbWVTdGF0KG1TcWwsIHRpbWVTdGFydCk7Ci0gICAgICAgICAgICByZXR1cm4gcmV0VmFsdWU7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICByZWxlYXNlUmVmZXJlbmNlKCk7Ci0gICAgICAgICAgICBtRGF0YWJhc2UudW5sb2NrKCk7CisgICAgICAgIHN5bmNocm9uaXplZCh0aGlzKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGxvbmcgdGltZVN0YXJ0ID0gYWNxdWlyZUFuZExvY2soUkVBRCk7CisgICAgICAgICAgICAgICAgU3RyaW5nIHJldFZhbHVlID0gbmF0aXZlXzF4MV9zdHJpbmcoKTsKKyAgICAgICAgICAgICAgICBtRGF0YWJhc2UubG9nVGltZVN0YXQobVNxbCwgdGltZVN0YXJ0KTsKKyAgICAgICAgICAgICAgICByZXR1cm4gcmV0VmFsdWU7CisgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgIHJlbGVhc2VBbmRVbmxvY2soKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KIAotICAgIHByaXZhdGUgZmluYWwgbmF0aXZlIHZvaWQgbmF0aXZlX2V4ZWN1dGUoKTsKKyAgICAvKioKKyAgICAgKiBFeGVjdXRlcyBhIHN0YXRlbWVudCB0aGF0IHJldHVybnMgYSAxIGJ5IDEgdGFibGUgd2l0aCBhIGJsb2IgdmFsdWUuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIEEgcmVhZC1vbmx5IGZpbGUgZGVzY3JpcHRvciBmb3IgYSBjb3B5IG9mIHRoZSBibG9iIHZhbHVlLCBvciB7QGNvZGUgbnVsbH0KKyAgICAgKiAgICAgICAgIGlmIHRoZSB2YWx1ZSBpcyBudWxsIG9yIGNvdWxkIG5vdCBiZSByZWFkIGZvciBzb21lIHJlYXNvbi4KKyAgICAgKgorICAgICAqIEB0aHJvd3MgYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGUuU1FMaXRlRG9uZUV4Y2VwdGlvbiBpZiB0aGUgcXVlcnkgcmV0dXJucyB6ZXJvIHJvd3MKKyAgICAgKi8KKyAgICBwdWJsaWMgUGFyY2VsRmlsZURlc2NyaXB0b3Igc2ltcGxlUXVlcnlGb3JCbG9iRmlsZURlc2NyaXB0b3IoKSB7CisgICAgICAgIHN5bmNocm9uaXplZCh0aGlzKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGxvbmcgdGltZVN0YXJ0ID0gYWNxdWlyZUFuZExvY2soUkVBRCk7CisgICAgICAgICAgICAgICAgUGFyY2VsRmlsZURlc2NyaXB0b3IgcmV0VmFsdWUgPSBuYXRpdmVfMXgxX2Jsb2JfYXNobWVtKCk7CisgICAgICAgICAgICAgICAgbURhdGFiYXNlLmxvZ1RpbWVTdGF0KG1TcWwsIHRpbWVTdGFydCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHJldFZhbHVlOworICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgICAgICBMb2cuZShUQUcsICJzaW1wbGVRdWVyeUZvckJsb2JGaWxlRGVzY3JpcHRvcigpIGZhaWxlZCIsIGV4KTsKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgcmVsZWFzZUFuZFVubG9jaygpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2FsbGVkIGJlZm9yZSBldmVyeSBtZXRob2QgaW4gdGhpcyBjbGFzcyBiZWZvcmUgZXhlY3V0aW5nIGEgU1FMIHN0YXRlbWVudCwKKyAgICAgKiB0aGlzIG1ldGhvZCBkb2VzIHRoZSBmb2xsb3dpbmc6CisgICAgICogPHVsPgorICAgICAqICAgPGxpPm1ha2Ugc3VyZSB0aGUgZGF0YWJhc2UgaXMgb3BlbjwvbGk+CisgICAgICogICA8bGk+Z2V0IGEgZGF0YWJhc2UgY29ubmVjdGlvbiBmcm9tIHRoZSBjb25uZWN0aW9uIHBvb2wsaWYgcG9zc2libGU8L2xpPgorICAgICAqICAgPGxpPm5vdGlmaWVzIHtAbGluayBCbG9ja0d1YXJkfSBvZiByZWFkL3dyaXRlPC9saT4KKyAgICAgKiAgIDxsaT5pZiB0aGUgU1FMIHN0YXRlbWVudCBpcyBhbiB1cGRhdGUsIHN0YXJ0IHRyYW5zYWN0aW9uIGlmIG5vdCBhbHJlYWR5IGluIG9uZS4KKyAgICAgKiAgIG90aGVyd2lzZSwgZ2V0IGxvY2sgb24gdGhlIGRhdGFiYXNlPC9saT4KKyAgICAgKiAgIDxsaT5hY3F1aXJlIHJlZmVyZW5jZSBvbiB0aGlzIG9iamVjdDwvbGk+CisgICAgICogICA8bGk+YW5kIHRoZW4gcmV0dXJuIHRoZSBjdXJyZW50IHRpbWUgX2JlZm9yZV8gdGhlIGRhdGFiYXNlIGxvY2sgd2FzIGFjcXVpcmVkPC9saT4KKyAgICAgKiA8L3VsPgorICAgICAqIDxwPgorICAgICAqIFRoaXMgbWV0aG9kIHJlbW92ZXMgdGhlIGR1cGxpY2F0ZSBjb2RlIGZyb20gdGhlIG90aGVyIHB1YmxpYworICAgICAqIG1ldGhvZHMgaW4gdGhpcyBjbGFzcy4KKyAgICAgKi8KKyAgICBwcml2YXRlIGxvbmcgYWNxdWlyZUFuZExvY2soYm9vbGVhbiByd0ZsYWcpIHsKKyAgICAgICAgbVN0YXRlID0gMDsKKyAgICAgICAgLy8gdXNlIHBvb2xlZCBkYXRhYmFzZSBjb25uZWN0aW9uIGhhbmRsZXMgZm9yIFNFTEVDVCBTUUwgc3RhdGVtZW50cworICAgICAgICBtRGF0YWJhc2UudmVyaWZ5RGJJc09wZW4oKTsKKyAgICAgICAgU1FMaXRlRGF0YWJhc2UgZGIgPSAobVN0YXRlbWVudFR5cGUgIT0gRGF0YWJhc2VVdGlscy5TVEFURU1FTlRfU0VMRUNUKSA/IG1EYXRhYmFzZQorICAgICAgICAgICAgICAgIDogbURhdGFiYXNlLmdldERiQ29ubmVjdGlvbihtU3FsKTsKKyAgICAgICAgLy8gdXNlIHRoZSBkYXRhYmFzZSBjb25uZWN0aW9uIG9idGFpbmVkIGFib3ZlCisgICAgICAgIG1PcmlnRGIgPSBtRGF0YWJhc2U7CisgICAgICAgIG1EYXRhYmFzZSA9IGRiOworICAgICAgICBzZXROYXRpdmVIYW5kbGUobURhdGFiYXNlLm1OYXRpdmVIYW5kbGUpOworICAgICAgICBpZiAocndGbGFnID09IFdSSVRFKSB7CisgICAgICAgICAgICBCbG9ja0d1YXJkLmdldFRocmVhZFBvbGljeSgpLm9uV3JpdGVUb0Rpc2soKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEJsb2NrR3VhcmQuZ2V0VGhyZWFkUG9saWN5KCkub25SZWFkRnJvbURpc2soKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qCisgICAgICAgICAqIFNwZWNpYWwgY2FzZSBoYW5kbGluZyBvZiBTUUxpdGVEYXRhYmFzZS5leGVjU1FMKCJCRUdJTiB0cmFuc2FjdGlvbiIpLgorICAgICAgICAgKiB3ZSBrbm93IGl0IGlzIGV4ZWNTUUwoIkJFR0lOIHRyYW5zYWN0aW9uIikgZnJvbSB0aGUgY2FsbGVyIElGIHRoZXJlIGlzIG5vIGxvY2sgaGVsZC4KKyAgICAgICAgICogYmVnaW5UcmFuc2FjdGlvbigpIG1ldGhvZHMgaW4gU1FMaXRlRGF0YWJhc2UgY2FsbCBsb2NrRm9yY2VkKCkgYmVmb3JlCisgICAgICAgICAqIGNhbGxpbmcgZXhlY1NRTCgiQkVHSU4gdHJhbnNhY3Rpb24iKS4KKyAgICAgICAgICovCisgICAgICAgIGlmIChtU3RhdGVtZW50VHlwZSA9PSBEYXRhYmFzZVV0aWxzLlNUQVRFTUVOVF9CRUdJTikgeworICAgICAgICAgICAgaWYgKCFtRGF0YWJhc2UuaXNEYkxvY2tlZEJ5Q3VycmVudFRocmVhZCgpKSB7CisgICAgICAgICAgICAgICAgLy8gdHJhbnNhY3Rpb24gaXMgIE5PVCBzdGFydGVkIGJ5IGNhbGxpbmcgYmVnaW5UcmFuc2FjdGlvbigpIG1ldGhvZHMgaW4KKyAgICAgICAgICAgICAgICAvLyBTUUxpdGVEYXRhYmFzZQorICAgICAgICAgICAgICAgIG1EYXRhYmFzZS5zZXRUcmFuc2FjdGlvblVzaW5nRXhlY1NxbEZsYWcoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmIChtU3RhdGVtZW50VHlwZSA9PSBEYXRhYmFzZVV0aWxzLlNUQVRFTUVOVF9VUERBVEUpIHsKKyAgICAgICAgICAgIC8vIGdvdCB1cGRhdGUgU1FMIHN0YXRlbWVudC4gaWYgdGhlcmUgaXMgTk8gcGVuZGluZyB0cmFuc2FjdGlvbiwgc3RhcnQgb25lCisgICAgICAgICAgICBpZiAoIW1EYXRhYmFzZS5pblRyYW5zYWN0aW9uKCkpIHsKKyAgICAgICAgICAgICAgICBtRGF0YWJhc2UuYmVnaW5UcmFuc2FjdGlvbk5vbkV4Y2x1c2l2ZSgpOworICAgICAgICAgICAgICAgIG1TdGF0ZSA9IFRSQU5TX1NUQVJURUQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLy8gZG8gSSBoYXZlIGRhdGFiYXNlIGxvY2s/IGlmIG5vdCwgZ3JhYiBpdC4KKyAgICAgICAgaWYgKCFtRGF0YWJhc2UuaXNEYkxvY2tlZEJ5Q3VycmVudFRocmVhZCgpKSB7CisgICAgICAgICAgICBtRGF0YWJhc2UubG9jaygpOworICAgICAgICAgICAgbVN0YXRlID0gTE9DS19BQ1FVSVJFRDsKKyAgICAgICAgfQorCisgICAgICAgIGFjcXVpcmVSZWZlcmVuY2UoKTsKKyAgICAgICAgbG9uZyBzdGFydFRpbWUgPSBTeXN0ZW1DbG9jay51cHRpbWVNaWxsaXMoKTsKKyAgICAgICAgbURhdGFiYXNlLmNsb3NlUGVuZGluZ1N0YXRlbWVudHMoKTsKKyAgICAgICAgY29tcGlsZUFuZGJpbmRBbGxBcmdzKCk7CisgICAgICAgIHJldHVybiBzdGFydFRpbWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogdGhpcyBtZXRob2QgcmVsZWFzZXMgbG9ja3MgYW5kIHJlZmVyZW5jZXMgYWNxdWlyZWQgaW4ge0BsaW5rICNhY3F1aXJlQW5kTG9jayhib29sZWFuKX0KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgcmVsZWFzZUFuZFVubG9jaygpIHsKKyAgICAgICAgcmVsZWFzZVJlZmVyZW5jZSgpOworICAgICAgICBpZiAobVN0YXRlID09IFRSQU5TX1NUQVJURUQpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgbURhdGFiYXNlLnNldFRyYW5zYWN0aW9uU3VjY2Vzc2Z1bCgpOworICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICBtRGF0YWJhc2UuZW5kVHJhbnNhY3Rpb24oKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmIChtU3RhdGUgPT0gTE9DS19BQ1FVSVJFRCkgeworICAgICAgICAgICAgbURhdGFiYXNlLnVubG9jaygpOworICAgICAgICB9CisgICAgICAgIGlmIChtU3RhdGVtZW50VHlwZSA9PSBEYXRhYmFzZVV0aWxzLlNUQVRFTUVOVF9DT01NSVQgfHwKKyAgICAgICAgICAgICAgICBtU3RhdGVtZW50VHlwZSA9PSBEYXRhYmFzZVV0aWxzLlNUQVRFTUVOVF9BQk9SVCkgeworICAgICAgICAgICAgbURhdGFiYXNlLnJlc2V0VHJhbnNhY3Rpb25Vc2luZ0V4ZWNTcWxGbGFnKCk7CisgICAgICAgIH0KKyAgICAgICAgY2xlYXJCaW5kaW5ncygpOworICAgICAgICAvLyByZWxlYXNlIHRoZSBjb21waWxlZCBzcWwgc3RhdGVtZW50IHNvIHRoYXQgdGhlIGNhbGxlcidzIFNRTGl0ZVN0YXRlbWVudCBubyBsb25nZXIKKyAgICAgICAgLy8gaGFzIGEgaGFyZCByZWZlcmVuY2UgdG8gYSBkYXRhYmFzZSBvYmplY3QgdGhhdCBtYXkgZ2V0IGRlYWxsb2NhdGVkIGF0IGFueSBwb2ludC4KKyAgICAgICAgcmVsZWFzZSgpOworICAgICAgICAvLyByZXN0b3JlIHRoZSBkYXRhYmFzZSBjb25uZWN0aW9uIGhhbmRsZSB0byB0aGUgb3JpZ2luYWwgdmFsdWUKKyAgICAgICAgbURhdGFiYXNlID0gbU9yaWdEYjsKKyAgICAgICAgc2V0TmF0aXZlSGFuZGxlKG1EYXRhYmFzZS5tTmF0aXZlSGFuZGxlKTsKKyAgICB9CisKKyAgICBwcml2YXRlIGZpbmFsIG5hdGl2ZSBpbnQgbmF0aXZlX2V4ZWN1dGUoKTsKKyAgICBwcml2YXRlIGZpbmFsIG5hdGl2ZSBsb25nIG5hdGl2ZV9leGVjdXRlSW5zZXJ0KCk7CiAgICAgcHJpdmF0ZSBmaW5hbCBuYXRpdmUgbG9uZyBuYXRpdmVfMXgxX2xvbmcoKTsKICAgICBwcml2YXRlIGZpbmFsIG5hdGl2ZSBTdHJpbmcgbmF0aXZlXzF4MV9zdHJpbmcoKTsKKyAgICBwcml2YXRlIGZpbmFsIG5hdGl2ZSBQYXJjZWxGaWxlRGVzY3JpcHRvciBuYXRpdmVfMXgxX2Jsb2JfYXNobWVtKCkgdGhyb3dzIElPRXhjZXB0aW9uOwogfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2Uvc3FsaXRlL1NRTGl0ZVRhYmxlTG9ja2VkRXhjZXB0aW9uLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9zcWxpdGUvU1FMaXRlVGFibGVMb2NrZWRFeGNlcHRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44Mjc4ZGYwCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2Uvc3FsaXRlL1NRTGl0ZVRhYmxlTG9ja2VkRXhjZXB0aW9uLmphdmEKQEAgLTAsMCArMSwyNSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGU7CisKK3B1YmxpYyBjbGFzcyBTUUxpdGVUYWJsZUxvY2tlZEV4Y2VwdGlvbiBleHRlbmRzIFNRTGl0ZUV4Y2VwdGlvbiB7CisgICAgcHVibGljIFNRTGl0ZVRhYmxlTG9ja2VkRXhjZXB0aW9uKCkge30KKworICAgIHB1YmxpYyBTUUxpdGVUYWJsZUxvY2tlZEV4Y2VwdGlvbihTdHJpbmcgZXJyb3IpIHsKKyAgICAgICAgc3VwZXIoZXJyb3IpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9TUUxpdGVVbmZpbmFsaXplZE9iamVjdHNFeGNlcHRpb24uamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9TUUxpdGVVbmZpbmFsaXplZE9iamVjdHNFeGNlcHRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iY2Y5NWUyCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2Uvc3FsaXRlL1NRTGl0ZVVuZmluYWxpemVkT2JqZWN0c0V4Y2VwdGlvbi5qYXZhCkBAIC0wLDAgKzEsMzEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlOworCisvKioKKyAqIFRocm93biBpZiB0aGUgZGF0YWJhc2UgY2FuJ3QgYmUgY2xvc2VkIGJlY2F1c2Ugb2Ygc29tZSB1bi1jbG9zZWQKKyAqIEN1cnNvciBvciBTUUxpdGVTdGF0ZW1lbnQgb2JqZWN0cy4gQ291bGQgaGFwcGVuIHdoZW4gYSB0aHJlYWQgaXMgdHJ5aW5nIHRvIGNsb3NlCisgKiB0aGUgZGF0YWJhc2Ugd2hpbGUgYW5vdGhlciB0aHJlYWQgc3RpbGwgaGFzbid0IGNsb3NlZCBhIEN1cnNvciBvbiB0aGF0IGRhdGFiYXNlLgorICogQGhpZGUKKyAqLworcHVibGljIGNsYXNzIFNRTGl0ZVVuZmluYWxpemVkT2JqZWN0c0V4Y2VwdGlvbiBleHRlbmRzIFNRTGl0ZUV4Y2VwdGlvbiB7CisgICAgcHVibGljIFNRTGl0ZVVuZmluYWxpemVkT2JqZWN0c0V4Y2VwdGlvbigpIHt9CisKKyAgICBwdWJsaWMgU1FMaXRlVW5maW5hbGl6ZWRPYmplY3RzRXhjZXB0aW9uKFN0cmluZyBlcnJvcikgeworICAgICAgICBzdXBlcihlcnJvcik7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvaGFyZHdhcmUvVXNiLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9oYXJkd2FyZS9Vc2IuamF2YQppbmRleCA1NzI3MWQ0Li5lYmI4Mjk2IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9oYXJkd2FyZS9Vc2IuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9oYXJkd2FyZS9Vc2IuamF2YQpAQCAtMTcsNiArMTcsMTAgQEAKIAogcGFja2FnZSBhbmRyb2lkLmhhcmR3YXJlOwogCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CisKIC8qKgogICogQ2xhc3MgZm9yIGFjY2Vzc2luZyBVU0Igc3RhdGUgaW5mb3JtYXRpb24uCiAgKiBAaGlkZQpAQCAtNTUsNiArNTksMjQgQEAKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBQ1RJT05fVVNCX1NUQVRFID0KICAgICAgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmFjdGlvbi5VU0JfU1RBVEUiOwogCisgICAvKioKKyAgICAgKiBCcm9hZGNhc3QgQWN0aW9uOiAgQSBicm9hZGNhc3QgZm9yIFVTQiBjYW1lcmEgYXR0YWNoZWQgZXZlbnQuCisgICAgICoKKyAgICAgKiBUaGlzIGludGVudCBpcyBzZW50IHdoZW4gYSBVU0IgZGV2aWNlIHN1cHBvcnRpbmcgUFRQIGlzIGF0dGFjaGVkIHRvIHRoZSBob3N0IFVTQiBidXMuCisgICAgICogVGhlIGludGVudCdzIGRhdGEgY29udGFpbnMgYSBVcmkgZm9yIHRoZSBkZXZpY2UgaW4gdGhlIE1UUCBwcm92aWRlci4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBQ1RJT05fVVNCX0NBTUVSQV9BVFRBQ0hFRCA9CisgICAgICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5hY3Rpb24uVVNCX0NBTUVSQV9BVFRBQ0hFRCI7CisKKyAgIC8qKgorICAgICAqIEJyb2FkY2FzdCBBY3Rpb246ICBBIGJyb2FkY2FzdCBmb3IgVVNCIGNhbWVyYSBkZXRhY2hlZCBldmVudC4KKyAgICAgKgorICAgICAqIFRoaXMgaW50ZW50IGlzIHNlbnQgd2hlbiBhIFVTQiBkZXZpY2Ugc3VwcG9ydGluZyBQVFAgaXMgZGV0YWNoZWQgZnJvbSB0aGUgaG9zdCBVU0IgYnVzLgorICAgICAqIFRoZSBpbnRlbnQncyBkYXRhIGNvbnRhaW5zIGEgVXJpIGZvciB0aGUgZGV2aWNlIGluIHRoZSBNVFAgcHJvdmlkZXIuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUNUSU9OX1VTQl9DQU1FUkFfREVUQUNIRUQgPQorICAgICAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuYWN0aW9uLlVTQl9DQU1FUkFfREVUQUNIRUQiOworCiAgICAgLyoqCiAgICAgICogQm9vbGVhbiBleHRyYSBpbmRpY2F0aW5nIHdoZXRoZXIgVVNCIGlzIGNvbm5lY3RlZCBvciBkaXNjb25uZWN0ZWQuCiAgICAgICogVXNlZCBpbiBleHRyYXMgZm9yIHRoZSB7QGxpbmsgI0FDVElPTl9VU0JfU1RBVEV9IGJyb2FkY2FzdC4KQEAgLTk2LDQgKzExOCwzMCBAQAogICAgICAqIFVzZWQgaW4gZXh0cmFzIGZvciB0aGUge0BsaW5rICNBQ1RJT05fVVNCX0NPTk5FQ1RFRH0gYnJvYWRjYXN0CiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVNCX0ZVTkNUSU9OX0RJU0FCTEVEID0gImRpc2FibGVkIjsKKworICAgIHByaXZhdGUgc3RhdGljIEZpbGUgZ2V0RnVuY3Rpb25FbmFibGVGaWxlKFN0cmluZyBmdW5jdGlvbikgeworICAgICAgICByZXR1cm4gbmV3IEZpbGUoIi9zeXMvY2xhc3MvdXNiX2NvbXBvc2l0ZS8iICsgZnVuY3Rpb24gKyAiL2VuYWJsZSIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgc3BlY2lmaWVkIFVTQiBmdW5jdGlvbiBpcyBzdXBwb3J0ZWQgYnkgdGhlIGtlcm5lbC4KKyAgICAgKiBOb3RlIHRoYXQgYSBVU0IgZnVuY3Rpb24gbWF5YmUgc3VwcG9ydGVkIGJ1dCBkaXNhYmxlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNGdW5jdGlvblN1cHBvcnRlZChTdHJpbmcgZnVuY3Rpb24pIHsKKyAgICAgICAgcmV0dXJuIGdldEZ1bmN0aW9uRW5hYmxlRmlsZShmdW5jdGlvbikuZXhpc3RzKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBzcGVjaWZpZWQgVVNCIGZ1bmN0aW9uIGlzIGN1cnJlbnRseSBlbmFibGVkLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0Z1bmN0aW9uRW5hYmxlZChTdHJpbmcgZnVuY3Rpb24pIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIEZpbGVJbnB1dFN0cmVhbSBzdHJlYW0gPSBuZXcgRmlsZUlucHV0U3RyZWFtKGdldEZ1bmN0aW9uRW5hYmxlRmlsZShmdW5jdGlvbikpOworICAgICAgICAgICAgYm9vbGVhbiBlbmFibGVkID0gKHN0cmVhbS5yZWFkKCkgPT0gJzEnKTsKKyAgICAgICAgICAgIHN0cmVhbS5jbG9zZSgpOworICAgICAgICAgICAgcmV0dXJuIGVuYWJsZWQ7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KIH0KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2lucHV0bWV0aG9kc2VydmljZS9FeHRyYWN0RWRpdFRleHQuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2lucHV0bWV0aG9kc2VydmljZS9FeHRyYWN0RWRpdFRleHQuamF2YQppbmRleCA4YTUyZTQwLi4yMjk2OGIwIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9pbnB1dG1ldGhvZHNlcnZpY2UvRXh0cmFjdEVkaXRUZXh0LmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvaW5wdXRtZXRob2RzZXJ2aWNlL0V4dHJhY3RFZGl0VGV4dC5qYXZhCkBAIC0xOCw3ICsxOCw2IEBACiAKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKIGltcG9ydCBhbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0OwotaW1wb3J0IGFuZHJvaWQudmlldy5Db250ZXh0TWVudTsKIGltcG9ydCBhbmRyb2lkLnZpZXcuaW5wdXRtZXRob2QuRXh0cmFjdGVkVGV4dDsKIGltcG9ydCBhbmRyb2lkLndpZGdldC5FZGl0VGV4dDsKIApAQCAtMjksNyArMjgsNiBAQAogcHVibGljIGNsYXNzIEV4dHJhY3RFZGl0VGV4dCBleHRlbmRzIEVkaXRUZXh0IHsKICAgICBwcml2YXRlIElucHV0TWV0aG9kU2VydmljZSBtSU1FOwogICAgIHByaXZhdGUgaW50IG1TZXR0aW5nRXh0cmFjdGVkVGV4dDsKLSAgICBwcml2YXRlIGJvb2xlYW4gbUNvbnRleHRNZW51U2hvdWxkQmVIYW5kbGVkQnlTdXBlciA9IGZhbHNlOwogICAgIAogICAgIHB1YmxpYyBFeHRyYWN0RWRpdFRleHQoQ29udGV4dCBjb250ZXh0KSB7CiAgICAgICAgIHN1cGVyKGNvbnRleHQsIG51bGwpOwpAQCAtOTksMTkgKzk3LDEyIEBACiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgb25DcmVhdGVDb250ZXh0TWVudShDb250ZXh0TWVudSBtZW51KSB7Ci0gICAgICAgIHN1cGVyLm9uQ3JlYXRlQ29udGV4dE1lbnUobWVudSk7Ci0gICAgICAgIG1Db250ZXh0TWVudVNob3VsZEJlSGFuZGxlZEJ5U3VwZXIgPSB0cnVlOwotICAgIH0KLQogICAgIEBPdmVycmlkZSBwdWJsaWMgYm9vbGVhbiBvblRleHRDb250ZXh0TWVudUl0ZW0oaW50IGlkKSB7Ci0gICAgICAgIGlmIChtSU1FICE9IG51bGwgJiYgIW1Db250ZXh0TWVudVNob3VsZEJlSGFuZGxlZEJ5U3VwZXIpIHsKKyAgICAgICAgaWYgKG1JTUUgIT0gbnVsbCkgewogICAgICAgICAgICAgaWYgKG1JTUUub25FeHRyYWN0VGV4dENvbnRleHRNZW51SXRlbShpZCkpIHsKICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQotICAgICAgICBtQ29udGV4dE1lbnVTaG91bGRCZUhhbmRsZWRCeVN1cGVyID0gZmFsc2U7CiAgICAgICAgIHJldHVybiBzdXBlci5vblRleHRDb250ZXh0TWVudUl0ZW0oaWQpOwogICAgIH0KICAgICAKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2lucHV0bWV0aG9kc2VydmljZS9LZXlib2FyZC5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvaW5wdXRtZXRob2RzZXJ2aWNlL0tleWJvYXJkLmphdmEKaW5kZXggNDgxNGIwYS4uODg1YTZiOCAxMDA3NTUKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvaW5wdXRtZXRob2RzZXJ2aWNlL0tleWJvYXJkLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvaW5wdXRtZXRob2RzZXJ2aWNlL0tleWJvYXJkLmphdmEKQEAgLTUwMCw3ICs1MDAsMzAgQEAKICAgICBwdWJsaWMgS2V5Ym9hcmQoQ29udGV4dCBjb250ZXh0LCBpbnQgeG1sTGF5b3V0UmVzSWQpIHsKICAgICAgICAgdGhpcyhjb250ZXh0LCB4bWxMYXlvdXRSZXNJZCwgMCk7CiAgICAgfQotICAgIAorCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIGtleWJvYXJkIGZyb20gdGhlIGdpdmVuIHhtbCBrZXkgbGF5b3V0IGZpbGUuIFdlZWRzIG91dCByb3dzCisgICAgICogdGhhdCBoYXZlIGEga2V5Ym9hcmQgbW9kZSBkZWZpbmVkIGJ1dCBkb24ndCBtYXRjaCB0aGUgc3BlY2lmaWVkIG1vZGUuCisgICAgICogQHBhcmFtIGNvbnRleHQgdGhlIGFwcGxpY2F0aW9uIG9yIHNlcnZpY2UgY29udGV4dAorICAgICAqIEBwYXJhbSB4bWxMYXlvdXRSZXNJZCB0aGUgcmVzb3VyY2UgZmlsZSB0aGF0IGNvbnRhaW5zIHRoZSBrZXlib2FyZCBsYXlvdXQgYW5kIGtleXMuCisgICAgICogQHBhcmFtIG1vZGVJZCBrZXlib2FyZCBtb2RlIGlkZW50aWZpZXIKKyAgICAgKiBAcGFyYW0gd2lkdGggc2V0cyB3aWR0aCBvZiBrZXlib2FyZAorICAgICAqIEBwYXJhbSBoZWlnaHQgc2V0cyBoZWlnaHQgb2Yga2V5Ym9hcmQKKyAgICAgKi8KKyAgICBwdWJsaWMgS2V5Ym9hcmQoQ29udGV4dCBjb250ZXh0LCBpbnQgeG1sTGF5b3V0UmVzSWQsIGludCBtb2RlSWQsIGludCB3aWR0aCwgaW50IGhlaWdodCkgeworICAgICAgICBtRGlzcGxheVdpZHRoID0gd2lkdGg7CisgICAgICAgIG1EaXNwbGF5SGVpZ2h0ID0gaGVpZ2h0OworCisgICAgICAgIG1EZWZhdWx0SG9yaXpvbnRhbEdhcCA9IDA7CisgICAgICAgIG1EZWZhdWx0V2lkdGggPSBtRGlzcGxheVdpZHRoIC8gMTA7CisgICAgICAgIG1EZWZhdWx0VmVydGljYWxHYXAgPSAwOworICAgICAgICBtRGVmYXVsdEhlaWdodCA9IG1EZWZhdWx0V2lkdGg7CisgICAgICAgIG1LZXlzID0gbmV3IEFycmF5TGlzdDxLZXk+KCk7CisgICAgICAgIG1Nb2RpZmllcktleXMgPSBuZXcgQXJyYXlMaXN0PEtleT4oKTsKKyAgICAgICAgbUtleWJvYXJkTW9kZSA9IG1vZGVJZDsKKyAgICAgICAgbG9hZEtleWJvYXJkKGNvbnRleHQsIGNvbnRleHQuZ2V0UmVzb3VyY2VzKCkuZ2V0WG1sKHhtbExheW91dFJlc0lkKSk7CisgICAgfQorCiAgICAgLyoqCiAgICAgICogQ3JlYXRlcyBhIGtleWJvYXJkIGZyb20gdGhlIGdpdmVuIHhtbCBrZXkgbGF5b3V0IGZpbGUuIFdlZWRzIG91dCByb3dzCiAgICAgICogdGhhdCBoYXZlIGEga2V5Ym9hcmQgbW9kZSBkZWZpbmVkIGJ1dCBkb24ndCBtYXRjaCB0aGUgc3BlY2lmaWVkIG1vZGUuIApkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvaW5wdXRtZXRob2RzZXJ2aWNlL0tleWJvYXJkVmlldy5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvaW5wdXRtZXRob2RzZXJ2aWNlL0tleWJvYXJkVmlldy5qYXZhCmluZGV4IDRiNDg0MDkuLmFiNWM3OGEgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL2lucHV0bWV0aG9kc2VydmljZS9LZXlib2FyZFZpZXcuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9pbnB1dG1ldGhvZHNlcnZpY2UvS2V5Ym9hcmRWaWV3LmphdmEKQEAgLTExMjgsNyArMTEyOCw5IEBACiAKICAgICBwcml2YXRlIGJvb2xlYW4gb25Nb2RpZmllZFRvdWNoRXZlbnQoTW90aW9uRXZlbnQgbWUsIGJvb2xlYW4gcG9zc2libGVQb2x5KSB7CiAgICAgICAgIGludCB0b3VjaFggPSAoaW50KSBtZS5nZXRYKCkgLSBtUGFkZGluZ0xlZnQ7Ci0gICAgICAgIGludCB0b3VjaFkgPSAoaW50KSBtZS5nZXRZKCkgKyBtVmVydGljYWxDb3JyZWN0aW9uIC0gbVBhZGRpbmdUb3A7CisgICAgICAgIGludCB0b3VjaFkgPSAoaW50KSBtZS5nZXRZKCkgLSBtUGFkZGluZ1RvcDsKKyAgICAgICAgaWYgKHRvdWNoWSA+PSAtbVZlcnRpY2FsQ29ycmVjdGlvbikKKyAgICAgICAgICAgIHRvdWNoWSArPSBtVmVydGljYWxDb3JyZWN0aW9uOwogICAgICAgICBmaW5hbCBpbnQgYWN0aW9uID0gbWUuZ2V0QWN0aW9uKCk7CiAgICAgICAgIGZpbmFsIGxvbmcgZXZlbnRUaW1lID0gbWUuZ2V0RXZlbnRUaW1lKCk7CiAgICAgICAgIG1PbGRFdmVudFRpbWUgPSBldmVudFRpbWU7CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9uZXQvQ29ubmVjdGl2aXR5TWFuYWdlci5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvbmV0L0Nvbm5lY3Rpdml0eU1hbmFnZXIuamF2YQppbmRleCBkMTI3Y2E4Li42MWZjOWU2IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9uZXQvQ29ubmVjdGl2aXR5TWFuYWdlci5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL25ldC9Db25uZWN0aXZpdHlNYW5hZ2VyLmphdmEKQEAgLTM1NiwxNCArMzU2LDE0IEBACiAgICAgICogPHA+CiAgICAgICogQWxsIGFwcGxpY2F0aW9ucyB0aGF0IGhhdmUgYmFja2dyb3VuZCBzZXJ2aWNlcyB0aGF0IHVzZSB0aGUgbmV0d29yawogICAgICAqIHNob3VsZCBsaXN0ZW4gdG8ge0BsaW5rICNBQ1RJT05fQkFDS0dST1VORF9EQVRBX1NFVFRJTkdfQ0hBTkdFRH0uCi0gICAgICogCisgICAgICoKICAgICAgKiBAcmV0dXJuIFdoZXRoZXIgYmFja2dyb3VuZCBkYXRhIHVzYWdlIGlzIGFsbG93ZWQuCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gZ2V0QmFja2dyb3VuZERhdGFTZXR0aW5nKCkgewogICAgICAgICB0cnkgewogICAgICAgICAgICAgcmV0dXJuIG1TZXJ2aWNlLmdldEJhY2tncm91bmREYXRhU2V0dGluZygpOwogICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgLy8gRXJyIG9uIHRoZSBzaWRlIG9mIHNhZmV0eSAKKyAgICAgICAgICAgIC8vIEVyciBvbiB0aGUgc2lkZSBvZiBzYWZldHkKICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfQogICAgIH0KQEAgLTUyMSw2ICs1MjEsMTcgQEAKICAgICAgICAgfQogICAgIH0KIAorICAgIC8qKgorICAgICAqIHtAaGlkZX0KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nW10gZ2V0VGV0aGVyYWJsZUJsdWV0b290aFJlZ2V4cygpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJldHVybiBtU2VydmljZS5nZXRUZXRoZXJhYmxlQmx1ZXRvb3RoUmVnZXhzKCk7CisgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IFN0cmluZ1swXTsKKyAgICAgICAgfQorICAgIH0KKwogICAgIC8qKiB7QGhpZGV9ICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVEVUSEVSX0VSUk9SX05PX0VSUk9SICAgICAgICAgICA9IDA7CiAgICAgLyoqIHtAaGlkZX0gKi8KQEAgLTU1OSw2ICs1NzAsMjEgQEAKICAgICB9CiAKICAgICAvKioKKyAgICAgKiBFbnN1cmUgdGhlIGRldmljZSBzdGF5cyBhd2FrZSB1bnRpbCB3ZSBjb25uZWN0IHdpdGggdGhlIG5leHQgbmV0d29yaworICAgICAqIEBwYXJhbSBmb3JXaG9tZSBUaGUgbmFtZSBvZiB0aGUgbmV0d29yayBnb2luZyBkb3duIGZvciBsb2dnaW5nIHB1cnBvc2VzCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gb24gc3VjY2Vzcywge0Bjb2RlIGZhbHNlfSBvbiBmYWlsdXJlCisgICAgICoge0BoaWRlfQorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIHJlcXVlc3ROZXR3b3JrVHJhbnNpdGlvbldha2Vsb2NrKFN0cmluZyBmb3JXaG9tKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBtU2VydmljZS5yZXF1ZXN0TmV0d29ya1RyYW5zaXRpb25XYWtlbG9jayhmb3JXaG9tKTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCiAgICAgICogQHBhcmFtIG5ldHdvcmtUeXBlIFRoZSB0eXBlIG9mIG5ldHdvcmsgeW91IHdhbnQgdG8gcmVwb3J0IG9uCiAgICAgICogQHBhcmFtIHBlcmNlbnRhZ2UgVGhlIHF1YWxpdHkgb2YgdGhlIGNvbm5lY3Rpb24gMCBpcyBiYWQsIDEwMCBpcyBnb29kCiAgICAgICoge0BoaWRlfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvbmV0L0RoY3BJbmZvLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9uZXQvRGhjcEluZm8uamF2YQppbmRleCAxMTc4YmVjLi45YzgxYzE5IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9uZXQvRGhjcEluZm8uamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9uZXQvRGhjcEluZm8uamF2YQpAQCAtMzcsNiArMzcsMTkgQEAKICAgICAgICAgc3VwZXIoKTsKICAgICB9CiAKKyAgICAvKiogY29weSBjb25zdHJ1Y3RvciB7QGhpZGV9ICovCisgICAgcHVibGljIERoY3BJbmZvKERoY3BJbmZvIHNvdXJjZSkgeworICAgICAgICBpZiAoc291cmNlICE9IG51bGwpIHsKKyAgICAgICAgICAgIGlwQWRkcmVzcyA9IHNvdXJjZS5pcEFkZHJlc3M7CisgICAgICAgICAgICBnYXRld2F5ID0gc291cmNlLmdhdGV3YXk7CisgICAgICAgICAgICBuZXRtYXNrID0gc291cmNlLm5ldG1hc2s7CisgICAgICAgICAgICBkbnMxID0gc291cmNlLmRuczE7CisgICAgICAgICAgICBkbnMyID0gc291cmNlLmRuczI7CisgICAgICAgICAgICBzZXJ2ZXJBZGRyZXNzID0gc291cmNlLnNlcnZlckFkZHJlc3M7CisgICAgICAgICAgICBsZWFzZUR1cmF0aW9uID0gc291cmNlLmxlYXNlRHVyYXRpb247CisgICAgICAgIH0KKyAgICB9CisKICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewogICAgICAgICBTdHJpbmdCdWZmZXIgc3RyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwogCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9uZXQvRG93bmxvYWRNYW5hZ2VyLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9uZXQvRG93bmxvYWRNYW5hZ2VyLmphdmEKaW5kZXggZTgyMzdjOS4uYmNlZTk5NSAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvbmV0L0Rvd25sb2FkTWFuYWdlci5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL25ldC9Eb3dubG9hZE1hbmFnZXIuamF2YQpAQCAtMjg2LDggKzI4Niw4IEBACiAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBTdHJpbmcgc2NoZW1lID0gdXJpLmdldFNjaGVtZSgpOwotICAgICAgICAgICAgaWYgKHNjaGVtZSA9PSBudWxsIHx8ICFzY2hlbWUuZXF1YWxzKCJodHRwIikpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJDYW4gb25seSBkb3dubG9hZCBIVFRQIFVSSXM6ICIgKyB1cmkpOworICAgICAgICAgICAgaWYgKHNjaGVtZSA9PSBudWxsIHx8ICghc2NoZW1lLmVxdWFscygiaHR0cCIpICYmICFzY2hlbWUuZXF1YWxzKCJodHRwcyIpKSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkNhbiBvbmx5IGRvd25sb2FkIEhUVFAvSFRUUFMgVVJJczogIiArIHVyaSk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBtVXJpID0gdXJpOwogICAgICAgICB9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9uZXQvRG93bmxvYWRzLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9uZXQvRG93bmxvYWRzLmphdmEKaW5kZXggZmQzMzc4MS4uZGRkZTVjMSAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvbmV0L0Rvd25sb2Fkcy5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL25ldC9Eb3dubG9hZHMuamF2YQpAQCAtNDMwLDExICs0MzAsMTAgQEAKIAogICAgICAgICAgICAgQ29udGVudFJlc29sdmVyIGNyID0gY29udGV4dC5nZXRDb250ZW50UmVzb2x2ZXIoKTsKIAotICAgICAgICAgICAgQ3Vyc29yIGMgPSBjci5xdWVyeSgKLSAgICAgICAgICAgICAgICAgICAgZG93bmxvYWRVcmksIERPV05MT0FEU19QUk9KRUNUSU9OLCBudWxsIC8qIHNlbGVjdGlvbiAqLywgbnVsbCAvKiBzZWxlY3Rpb24gYXJncyAqLywKLSAgICAgICAgICAgICAgICAgICAgbnVsbCAvKiBzb3J0IG9yZGVyICovKTsKKyAgICAgICAgICAgIEN1cnNvciBjID0gY3IucXVlcnkoZG93bmxvYWRVcmksIERPV05MT0FEU19QUk9KRUNUSU9OLCBudWxsIC8qIHNlbGVjdGlvbiAqLywKKyAgICAgICAgICAgICAgICAgICAgbnVsbCAvKiBzZWxlY3Rpb24gYXJncyAqLywgbnVsbCAvKiBzb3J0IG9yZGVyICovKTsKICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgaWYgKCFjLm1vdmVUb05leHQoKSkgeworICAgICAgICAgICAgICAgIGlmIChjID09IG51bGwgfHwgIWMubW92ZVRvTmV4dCgpKSB7CiAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgICAgICAgICAgICAgfQogCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9uZXQvSUNvbm5lY3Rpdml0eU1hbmFnZXIuYWlkbCBiL2NvcmUvamF2YS9hbmRyb2lkL25ldC9JQ29ubmVjdGl2aXR5TWFuYWdlci5haWRsCmluZGV4IGFmY2NkZDkuLjlmMmZjMTcgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL25ldC9JQ29ubmVjdGl2aXR5TWFuYWdlci5haWRsCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL25ldC9JQ29ubmVjdGl2aXR5TWFuYWdlci5haWRsCkBAIC0xLDE2ICsxLDE2IEBACiAvKioKICAqIENvcHlyaWdodCAoYykgMjAwOCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAogICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyAKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZSAKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKQEAgLTc1LDUgKzc1LDkgQEAKIAogICAgIFN0cmluZ1tdIGdldFRldGhlcmFibGVXaWZpUmVnZXhzKCk7CiAKKyAgICBTdHJpbmdbXSBnZXRUZXRoZXJhYmxlQmx1ZXRvb3RoUmVnZXhzKCk7CisKKyAgICB2b2lkIHJlcXVlc3ROZXR3b3JrVHJhbnNpdGlvbldha2Vsb2NrKGluIFN0cmluZyBmb3JXaG9tKTsKKwogICAgIHZvaWQgcmVwb3J0SW5ldENvbmRpdGlvbihpbnQgbmV0d29ya1R5cGUsIGludCBwZXJjZW50YWdlKTsKIH0KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL25ldC9MaW5rUHJvcGVydGllcy5haWRsIGIvY29yZS9qYXZhL2FuZHJvaWQvbmV0L0xpbmtQcm9wZXJ0aWVzLmFpZGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzNjNzk4OAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL25ldC9MaW5rUHJvcGVydGllcy5haWRsCkBAIC0wLDAgKzEsMjIgQEAKKy8qCisqKgorKiogQ29weXJpZ2h0IChDKSAyMDA5IFF1YWxjb21tIElubm92YXRpb24gQ2VudGVyLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorKiogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoqCisqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKioKKyoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoqCisqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCisKK3BhY2thZ2UgYW5kcm9pZC5uZXQ7CisKK3BhcmNlbGFibGUgTGlua1Byb3BlcnRpZXM7CisKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL25ldC9MaW5rUHJvcGVydGllcy5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvbmV0L0xpbmtQcm9wZXJ0aWVzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjRhZWJmYwotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL25ldC9MaW5rUHJvcGVydGllcy5qYXZhCkBAIC0wLDAgKzEsMjA1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLm5ldDsKKworaW1wb3J0IGFuZHJvaWQubmV0LlByb3h5UHJvcGVydGllczsKK2ltcG9ydCBhbmRyb2lkLm9zLlBhcmNlbGFibGU7CitpbXBvcnQgYW5kcm9pZC5vcy5QYXJjZWw7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKKworaW1wb3J0IGphdmEubmV0LkluZXRBZGRyZXNzOworaW1wb3J0IGphdmEubmV0Lk5ldHdvcmtJbnRlcmZhY2U7CitpbXBvcnQgamF2YS5uZXQuU29ja2V0RXhjZXB0aW9uOworaW1wb3J0IGphdmEubmV0LlVua25vd25Ib3N0RXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworCisvKioKKyAqIERlc2NyaWJlcyB0aGUgcHJvcGVydGllcyBvZiBhIG5ldHdvcmsgbGluay4KKyAqIFRPRE8gLSBjb25zaWRlciBhZGRpbmcgb3B0aW9uYWwgZmllbGRzIGxpa2UgQXBuIGFuZCBBcG5UeXBlCisgKiBAaGlkZQorICovCitwdWJsaWMgY2xhc3MgTGlua1Byb3BlcnRpZXMgaW1wbGVtZW50cyBQYXJjZWxhYmxlIHsKKworICAgIHByaXZhdGUgTmV0d29ya0ludGVyZmFjZSBtSWZhY2U7CisgICAgcHJpdmF0ZSBDb2xsZWN0aW9uPEluZXRBZGRyZXNzPiBtQWRkcmVzc2VzOworICAgIHByaXZhdGUgQ29sbGVjdGlvbjxJbmV0QWRkcmVzcz4gbURuc2VzOworICAgIHByaXZhdGUgSW5ldEFkZHJlc3MgbUdhdGV3YXk7CisgICAgcHJpdmF0ZSBQcm94eVByb3BlcnRpZXMgbUh0dHBQcm94eTsKKworICAgIHB1YmxpYyBMaW5rUHJvcGVydGllcygpIHsKKyAgICAgICAgY2xlYXIoKTsKKyAgICB9CisKKyAgICAvLyBjb3B5IGNvbnN0cnVjdG9yIGluc3RlYWQgb2YgY2xvbmUKKyAgICBwdWJsaWMgTGlua1Byb3BlcnRpZXMoTGlua1Byb3BlcnRpZXMgc291cmNlKSB7CisgICAgICAgIGlmIChzb3VyY2UgIT0gbnVsbCkgeworICAgICAgICAgICAgbUlmYWNlID0gc291cmNlLmdldEludGVyZmFjZSgpOworICAgICAgICAgICAgbUFkZHJlc3NlcyA9IHNvdXJjZS5nZXRBZGRyZXNzZXMoKTsKKyAgICAgICAgICAgIG1EbnNlcyA9IHNvdXJjZS5nZXREbnNlcygpOworICAgICAgICAgICAgbUdhdGV3YXkgPSBzb3VyY2UuZ2V0R2F0ZXdheSgpOworICAgICAgICAgICAgbUh0dHBQcm94eSA9IG5ldyBQcm94eVByb3BlcnRpZXMoc291cmNlLmdldEh0dHBQcm94eSgpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldEludGVyZmFjZShOZXR3b3JrSW50ZXJmYWNlIGlmYWNlKSB7CisgICAgICAgIG1JZmFjZSA9IGlmYWNlOworICAgIH0KKyAgICBwdWJsaWMgTmV0d29ya0ludGVyZmFjZSBnZXRJbnRlcmZhY2UoKSB7CisgICAgICAgIHJldHVybiBtSWZhY2U7CisgICAgfQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0SW50ZXJmYWNlTmFtZSgpIHsKKyAgICAgICAgcmV0dXJuIChtSWZhY2UgPT0gbnVsbCA/IG51bGwgOiBtSWZhY2UuZ2V0TmFtZSgpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBhZGRBZGRyZXNzKEluZXRBZGRyZXNzIGFkZHJlc3MpIHsKKyAgICAgICAgbUFkZHJlc3Nlcy5hZGQoYWRkcmVzcyk7CisgICAgfQorICAgIHB1YmxpYyBDb2xsZWN0aW9uPEluZXRBZGRyZXNzPiBnZXRBZGRyZXNzZXMoKSB7CisgICAgICAgIHJldHVybiBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVDb2xsZWN0aW9uKG1BZGRyZXNzZXMpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGFkZERucyhJbmV0QWRkcmVzcyBkbnMpIHsKKyAgICAgICAgbURuc2VzLmFkZChkbnMpOworICAgIH0KKyAgICBwdWJsaWMgQ29sbGVjdGlvbjxJbmV0QWRkcmVzcz4gZ2V0RG5zZXMoKSB7CisgICAgICAgIHJldHVybiBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVDb2xsZWN0aW9uKG1EbnNlcyk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0R2F0ZXdheShJbmV0QWRkcmVzcyBnYXRld2F5KSB7CisgICAgICAgIG1HYXRld2F5ID0gZ2F0ZXdheTsKKyAgICB9CisgICAgcHVibGljIEluZXRBZGRyZXNzIGdldEdhdGV3YXkoKSB7CisgICAgICAgIHJldHVybiBtR2F0ZXdheTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRIdHRwUHJveHkoUHJveHlQcm9wZXJ0aWVzIHByb3h5KSB7CisgICAgICAgIG1IdHRwUHJveHkgPSBwcm94eTsKKyAgICB9CisgICAgcHVibGljIFByb3h5UHJvcGVydGllcyBnZXRIdHRwUHJveHkoKSB7CisgICAgICAgIHJldHVybiBtSHR0cFByb3h5OworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGNsZWFyKCkgeworICAgICAgICBtSWZhY2UgPSBudWxsOworICAgICAgICBtQWRkcmVzc2VzID0gbmV3IEFycmF5TGlzdDxJbmV0QWRkcmVzcz4oKTsKKyAgICAgICAgbURuc2VzID0gbmV3IEFycmF5TGlzdDxJbmV0QWRkcmVzcz4oKTsKKyAgICAgICAgbUdhdGV3YXkgPSBudWxsOworICAgICAgICBtSHR0cFByb3h5ID0gbnVsbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJbXBsZW1lbnQgdGhlIFBhcmNlbGFibGUgaW50ZXJmYWNlCisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGRlc2NyaWJlQ29udGVudHMoKSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgIFN0cmluZyBpZmFjZU5hbWUgPSAobUlmYWNlID09IG51bGwgPyAiIiA6ICJJbnRlcmZhY2VOYW1lOiAiICsgbUlmYWNlLmdldE5hbWUoKSArICIgIik7CisKKyAgICAgICAgU3RyaW5nIGlwID0gIklwQWRkcmVzc2VzOiBbIjsKKyAgICAgICAgZm9yIChJbmV0QWRkcmVzcyBhZGRyIDogbUFkZHJlc3NlcykgaXAgKz0gIGFkZHIuZ2V0SG9zdEFkZHJlc3MoKSArICIsIjsKKyAgICAgICAgaXAgKz0gIl0gIjsKKworICAgICAgICBTdHJpbmcgZG5zID0gIkRuc0FkZHJlc3NlczogWyI7CisgICAgICAgIGZvciAoSW5ldEFkZHJlc3MgYWRkciA6IG1EbnNlcykgZG5zICs9IGFkZHIuZ2V0SG9zdEFkZHJlc3MoKSArICIsIjsKKyAgICAgICAgZG5zICs9ICJdICI7CisKKyAgICAgICAgU3RyaW5nIHByb3h5ID0gKG1IdHRwUHJveHkgPT0gbnVsbCA/ICIiIDogIkh0dHBQcm94eTogIiArIG1IdHRwUHJveHkudG9TdHJpbmcoKSArICIgIik7CisgICAgICAgIFN0cmluZyBnYXRld2F5ID0gKG1HYXRld2F5ID09IG51bGwgPyAiIiA6ICJHYXRld2F5OiAiICsgbUdhdGV3YXkuZ2V0SG9zdEFkZHJlc3MoKSArICIgIik7CisKKyAgICAgICAgcmV0dXJuIGlmYWNlTmFtZSArIGlwICsgZ2F0ZXdheSArIGRucyArIHByb3h5OworICAgIH0KKworICAgIC8qKgorICAgICAqIEltcGxlbWVudCB0aGUgUGFyY2VsYWJsZSBpbnRlcmZhY2UuCisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB3cml0ZVRvUGFyY2VsKFBhcmNlbCBkZXN0LCBpbnQgZmxhZ3MpIHsKKyAgICAgICAgZGVzdC53cml0ZVN0cmluZyhnZXRJbnRlcmZhY2VOYW1lKCkpOworICAgICAgICBkZXN0LndyaXRlSW50KG1BZGRyZXNzZXMuc2l6ZSgpKTsKKyAgICAgICAgLy9UT0RPOiBleHBsb3JlIGFuIGVhc3kgYWx0ZXJuYXRpdmUgdG8gcHJlc2VydmUgaG9zdG5hbWUKKyAgICAgICAgLy8gd2l0aG91dCBkb2luZyBhIGxvb2t1cAorICAgICAgICBmb3IoSW5ldEFkZHJlc3MgYSA6IG1BZGRyZXNzZXMpIHsKKyAgICAgICAgICAgIGRlc3Qud3JpdGVCeXRlQXJyYXkoYS5nZXRBZGRyZXNzKCkpOworICAgICAgICB9CisgICAgICAgIGRlc3Qud3JpdGVJbnQobURuc2VzLnNpemUoKSk7CisgICAgICAgIGZvcihJbmV0QWRkcmVzcyBkIDogbURuc2VzKSB7CisgICAgICAgICAgICBkZXN0LndyaXRlQnl0ZUFycmF5KGQuZ2V0QWRkcmVzcygpKTsKKyAgICAgICAgfQorICAgICAgICBpZiAobUdhdGV3YXkgIT0gbnVsbCkgeworICAgICAgICAgICAgZGVzdC53cml0ZUJ5dGUoKGJ5dGUpMSk7CisgICAgICAgICAgICBkZXN0LndyaXRlQnl0ZUFycmF5KG1HYXRld2F5LmdldEFkZHJlc3MoKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBkZXN0LndyaXRlQnl0ZSgoYnl0ZSkwKTsKKyAgICAgICAgfQorICAgICAgICBpZiAobUh0dHBQcm94eSAhPSBudWxsKSB7CisgICAgICAgICAgICBkZXN0LndyaXRlQnl0ZSgoYnl0ZSkxKTsKKyAgICAgICAgICAgIGRlc3Qud3JpdGVQYXJjZWxhYmxlKG1IdHRwUHJveHksIGZsYWdzKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGRlc3Qud3JpdGVCeXRlKChieXRlKTApOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogSW1wbGVtZW50IHRoZSBQYXJjZWxhYmxlIGludGVyZmFjZS4KKyAgICAgKiBAaGlkZQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQ3JlYXRvcjxMaW5rUHJvcGVydGllcz4gQ1JFQVRPUiA9CisgICAgICAgIG5ldyBDcmVhdG9yPExpbmtQcm9wZXJ0aWVzPigpIHsKKyAgICAgICAgICAgIHB1YmxpYyBMaW5rUHJvcGVydGllcyBjcmVhdGVGcm9tUGFyY2VsKFBhcmNlbCBpbikgeworICAgICAgICAgICAgICAgIExpbmtQcm9wZXJ0aWVzIG5ldFByb3AgPSBuZXcgTGlua1Byb3BlcnRpZXMoKTsKKyAgICAgICAgICAgICAgICBTdHJpbmcgaWZhY2UgPSBpbi5yZWFkU3RyaW5nKCk7CisgICAgICAgICAgICAgICAgaWYgKGlmYWNlICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldFByb3Auc2V0SW50ZXJmYWNlKE5ldHdvcmtJbnRlcmZhY2UuZ2V0QnlOYW1lKGlmYWNlKSk7CisgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpbnQgYWRkcmVzc0NvdW50ID0gaW4ucmVhZEludCgpOworICAgICAgICAgICAgICAgIGZvciAoaW50IGk9MDsgaTxhZGRyZXNzQ291bnQ7IGkrKykgeworICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgbmV0UHJvcC5hZGRBZGRyZXNzKEluZXRBZGRyZXNzLmdldEJ5QWRkcmVzcyhpbi5jcmVhdGVCeXRlQXJyYXkoKSkpOworICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChVbmtub3duSG9zdEV4Y2VwdGlvbiBlKSB7IH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYWRkcmVzc0NvdW50ID0gaW4ucmVhZEludCgpOworICAgICAgICAgICAgICAgIGZvciAoaW50IGk9MDsgaTxhZGRyZXNzQ291bnQ7IGkrKykgeworICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgbmV0UHJvcC5hZGREbnMoSW5ldEFkZHJlc3MuZ2V0QnlBZGRyZXNzKGluLmNyZWF0ZUJ5dGVBcnJheSgpKSk7CisgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFVua25vd25Ib3N0RXhjZXB0aW9uIGUpIHsgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoaW4ucmVhZEJ5dGUoKSA9PSAxKSB7CisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICBuZXRQcm9wLnNldEdhdGV3YXkoSW5ldEFkZHJlc3MuZ2V0QnlBZGRyZXNzKGluLmNyZWF0ZUJ5dGVBcnJheSgpKSk7CisgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFVua25vd25Ib3N0RXhjZXB0aW9uIGUpIHt9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChpbi5yZWFkQnl0ZSgpID09IDEpIHsKKyAgICAgICAgICAgICAgICAgICAgbmV0UHJvcC5zZXRIdHRwUHJveHkoKFByb3h5UHJvcGVydGllcylpbi5yZWFkUGFyY2VsYWJsZShudWxsKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBuZXRQcm9wOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgTGlua1Byb3BlcnRpZXNbXSBuZXdBcnJheShpbnQgc2l6ZSkgeworICAgICAgICAgICAgICAgIHJldHVybiBuZXcgTGlua1Byb3BlcnRpZXNbc2l6ZV07CisgICAgICAgICAgICB9CisgICAgICAgIH07Cit9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9uZXQvTW9iaWxlRGF0YVN0YXRlVHJhY2tlci5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvbmV0L01vYmlsZURhdGFTdGF0ZVRyYWNrZXIuamF2YQppbmRleCAwMDRjZGI3Li42M2JkZjhkIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9uZXQvTW9iaWxlRGF0YVN0YXRlVHJhY2tlci5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL25ldC9Nb2JpbGVEYXRhU3RhdGVUcmFja2VyLmphdmEKQEAgLTE2LDE5ICsxNiwyMSBAQAogCiBwYWNrYWdlIGFuZHJvaWQubmV0OwogCi1pbXBvcnQgamF2YS5uZXQuSW5ldEFkZHJlc3M7Ci0KIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQnJvYWRjYXN0UmVjZWl2ZXI7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50RmlsdGVyOwogaW1wb3J0IGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uOwogaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLklCaW5kZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5NZXNzYWdlOwogaW1wb3J0IGFuZHJvaWQub3MuU2VydmljZU1hbmFnZXI7CiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LklUZWxlcGhvbnk7CiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LlBob25lOwogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5UZWxlcGhvbnlJbnRlbnRzOwogaW1wb3J0IGFuZHJvaWQubmV0Lk5ldHdvcmtJbmZvLkRldGFpbGVkU3RhdGU7CitpbXBvcnQgYW5kcm9pZC5uZXQuTmV0d29ya0luZm87CitpbXBvcnQgYW5kcm9pZC5uZXQuTGlua1Byb3BlcnRpZXM7CiBpbXBvcnQgYW5kcm9pZC50ZWxlcGhvbnkuVGVsZXBob255TWFuYWdlcjsKIGltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwogaW1wb3J0IGFuZHJvaWQudGV4dC5UZXh0VXRpbHM7CkBAIC00MCw3ICs0Miw3IEBACiAgKgogICoge0BoaWRlfQogICovCi1wdWJsaWMgY2xhc3MgTW9iaWxlRGF0YVN0YXRlVHJhY2tlciBleHRlbmRzIE5ldHdvcmtTdGF0ZVRyYWNrZXIgeworcHVibGljIGNsYXNzIE1vYmlsZURhdGFTdGF0ZVRyYWNrZXIgaW1wbGVtZW50cyBOZXR3b3JrU3RhdGVUcmFja2VyIHsKIAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiTW9iaWxlRGF0YVN0YXRlVHJhY2tlciI7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBEQkcgPSB0cnVlOwpAQCAtNDksMTAgKzUxLDE1IEBACiAgICAgcHJpdmF0ZSBJVGVsZXBob255IG1QaG9uZVNlcnZpY2U7CiAKICAgICBwcml2YXRlIFN0cmluZyBtQXBuVHlwZTsKLSAgICBwcml2YXRlIFN0cmluZyBtQXBuVHlwZVRvV2F0Y2hGb3I7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgbUFwbk5hbWU7Ci0gICAgcHJpdmF0ZSBib29sZWFuIG1FbmFibGVkOwotICAgIHByaXZhdGUgQnJvYWRjYXN0UmVjZWl2ZXIgbVN0YXRlUmVjZWl2ZXI7CisgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nW10gc0Ruc1Byb3BOYW1lczsKKyAgICBwcml2YXRlIE5ldHdvcmtJbmZvIG1OZXR3b3JrSW5mbzsKKyAgICBwcml2YXRlIGJvb2xlYW4gbVRlYXJkb3duUmVxdWVzdGVkID0gZmFsc2U7CisgICAgcHJpdmF0ZSBIYW5kbGVyIG1UYXJnZXQ7CisgICAgcHJpdmF0ZSBDb250ZXh0IG1Db250ZXh0OworICAgIHByaXZhdGUgTGlua1Byb3BlcnRpZXMgbUxpbmtQcm9wZXJ0aWVzOworICAgIHByaXZhdGUgYm9vbGVhbiBtUHJpdmF0ZURuc1JvdXRlU2V0ID0gZmFsc2U7CisgICAgcHJpdmF0ZSBpbnQgbURlZmF1bHRHYXRld2F5QWRkciA9IDA7CisgICAgcHJpdmF0ZSBib29sZWFuIG1EZWZhdWx0Um91dGVTZXQgPSBmYWxzZTsKIAogICAgIC8vIERFRkFVTFQgYW5kIEhJUFJJIGFyZSB0aGUgc2FtZSBjb25uZWN0aW9uLiAgSWYgd2UncmUgb25lIG9mIHRoZXNlIHdlIG5lZWQgdG8gY2hlY2sgaWYKICAgICAvLyB0aGUgb3RoZXIgaXMgYWxzbyBkaXNjb25uZWN0ZWQgYmVmb3JlIHdlIHJlc2V0IHNvY2tldHMKQEAgLTYwLDM1ICs2NywyMiBAQAogCiAgICAgLyoqCiAgICAgICogQ3JlYXRlIGEgbmV3IE1vYmlsZURhdGFTdGF0ZVRyYWNrZXIKLSAgICAgKiBAcGFyYW0gY29udGV4dCB0aGUgYXBwbGljYXRpb24gY29udGV4dCBvZiB0aGUgY2FsbGVyCi0gICAgICogQHBhcmFtIHRhcmdldCBhIG1lc3NhZ2UgaGFuZGxlciBmb3IgZ2V0dGluZyBjYWxsYmFja3MgYWJvdXQgc3RhdGUgY2hhbmdlcwogICAgICAqIEBwYXJhbSBuZXRUeXBlIHRoZSBDb25uZWN0aXZpdHlNYW5hZ2VyIG5ldHdvcmsgdHlwZQotICAgICAqIEBwYXJhbSBhcG5UeXBlIHRoZSBQaG9uZSBhcG5UeXBlCiAgICAgICogQHBhcmFtIHRhZyB0aGUgbmFtZSBvZiB0aGlzIG5ldHdvcmsKICAgICAgKi8KLSAgICBwdWJsaWMgTW9iaWxlRGF0YVN0YXRlVHJhY2tlcihDb250ZXh0IGNvbnRleHQsIEhhbmRsZXIgdGFyZ2V0LCBpbnQgbmV0VHlwZSwgU3RyaW5nIHRhZykgewotICAgICAgICBzdXBlcihjb250ZXh0LCB0YXJnZXQsIG5ldFR5cGUsCisgICAgcHVibGljIE1vYmlsZURhdGFTdGF0ZVRyYWNrZXIoaW50IG5ldFR5cGUsIFN0cmluZyB0YWcpIHsKKyAgICAgICAgbU5ldHdvcmtJbmZvID0gbmV3IE5ldHdvcmtJbmZvKG5ldFR5cGUsCiAgICAgICAgICAgICAgICAgVGVsZXBob255TWFuYWdlci5nZXREZWZhdWx0KCkuZ2V0TmV0d29ya1R5cGUoKSwgdGFnLAogICAgICAgICAgICAgICAgIFRlbGVwaG9ueU1hbmFnZXIuZ2V0RGVmYXVsdCgpLmdldE5ldHdvcmtUeXBlTmFtZSgpKTsKICAgICAgICAgbUFwblR5cGUgPSBuZXR3b3JrVHlwZVRvQXBuVHlwZShuZXRUeXBlKTsKLSAgICAgICAgaWYgKFRleHRVdGlscy5lcXVhbHMobUFwblR5cGUsIFBob25lLkFQTl9UWVBFX0hJUFJJKSkgewotICAgICAgICAgICAgbUFwblR5cGVUb1dhdGNoRm9yID0gUGhvbmUuQVBOX1RZUEVfREVGQVVMVDsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1BcG5UeXBlVG9XYXRjaEZvciA9IG1BcG5UeXBlOwotICAgICAgICB9CiAgICAgICAgIGlmIChuZXRUeXBlID09IENvbm5lY3Rpdml0eU1hbmFnZXIuVFlQRV9NT0JJTEUgfHwKICAgICAgICAgICAgICAgICBuZXRUeXBlID09IENvbm5lY3Rpdml0eU1hbmFnZXIuVFlQRV9NT0JJTEVfSElQUkkpIHsKICAgICAgICAgICAgIG1Jc0RlZmF1bHRPckhpcHJpID0gdHJ1ZTsKICAgICAgICAgfQogCiAgICAgICAgIG1QaG9uZVNlcnZpY2UgPSBudWxsOwotICAgICAgICBpZihuZXRUeXBlID09IENvbm5lY3Rpdml0eU1hbmFnZXIuVFlQRV9NT0JJTEUpIHsKLSAgICAgICAgICAgIG1FbmFibGVkID0gdHJ1ZTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1FbmFibGVkID0gZmFsc2U7Ci0gICAgICAgIH0KIAotICAgICAgICBtRG5zUHJvcE5hbWVzID0gbmV3IFN0cmluZ1tdIHsKKyAgICAgICAgc0Ruc1Byb3BOYW1lcyA9IG5ldyBTdHJpbmdbXSB7CiAgICAgICAgICAgICAgICAgIm5ldC5ybW5ldDAuZG5zMSIsCiAgICAgICAgICAgICAgICAgIm5ldC5ybW5ldDAuZG5zMiIsCiAgICAgICAgICAgICAgICAgIm5ldC5ldGgwLmRuczEiLApAQCAtOTksMTY1ICs5MywxNjIgQEAKICAgICAgICAgICAgICAgICAibmV0LmdwcnMuZG5zMiIsCiAgICAgICAgICAgICAgICAgIm5ldC5wcHAwLmRuczEiLAogICAgICAgICAgICAgICAgICJuZXQucHBwMC5kbnMyIn07Ci0KICAgICB9CiAKICAgICAvKioKLSAgICAgKiBCZWdpbiBtb25pdG9yaW5nIG1vYmlsZSBkYXRhIGNvbm5lY3Rpdml0eS4KKyAgICAgKiBCZWdpbiBtb25pdG9yaW5nIGRhdGEgY29ubmVjdGl2aXR5LgorICAgICAqCisgICAgICogQHBhcmFtIGNvbnRleHQgaXMgdGhlIGN1cnJlbnQgQW5kcm9pZCBjb250ZXh0CisgICAgICogQHBhcmFtIHRhcmdldCBpcyB0aGUgSGFuZGVyIHRvIHdoaWNoIHRvIHJldHVybiB0aGUgZXZlbnRzLgogICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHN0YXJ0TW9uaXRvcmluZygpIHsKLSAgICAgICAgSW50ZW50RmlsdGVyIGZpbHRlciA9Ci0gICAgICAgICAgICAgICAgbmV3IEludGVudEZpbHRlcihUZWxlcGhvbnlJbnRlbnRzLkFDVElPTl9BTllfREFUQV9DT05ORUNUSU9OX1NUQVRFX0NIQU5HRUQpOworICAgIHB1YmxpYyB2b2lkIHN0YXJ0TW9uaXRvcmluZyhDb250ZXh0IGNvbnRleHQsIEhhbmRsZXIgdGFyZ2V0KSB7CisgICAgICAgIG1UYXJnZXQgPSB0YXJnZXQ7CisgICAgICAgIG1Db250ZXh0ID0gY29udGV4dDsKKworICAgICAgICBJbnRlbnRGaWx0ZXIgZmlsdGVyID0gbmV3IEludGVudEZpbHRlcigpOworICAgICAgICBmaWx0ZXIuYWRkQWN0aW9uKFRlbGVwaG9ueUludGVudHMuQUNUSU9OX0FOWV9EQVRBX0NPTk5FQ1RJT05fU1RBVEVfQ0hBTkdFRCk7CiAgICAgICAgIGZpbHRlci5hZGRBY3Rpb24oVGVsZXBob255SW50ZW50cy5BQ1RJT05fREFUQV9DT05ORUNUSU9OX0ZBSUxFRCk7Ci0gICAgICAgIGZpbHRlci5hZGRBY3Rpb24oVGVsZXBob255SW50ZW50cy5BQ1RJT05fU0VSVklDRV9TVEFURV9DSEFOR0VEKTsKIAotICAgICAgICBtU3RhdGVSZWNlaXZlciA9IG5ldyBNb2JpbGVEYXRhU3RhdGVSZWNlaXZlcigpOwotICAgICAgICBJbnRlbnQgaW50ZW50ID0gbUNvbnRleHQucmVnaXN0ZXJSZWNlaXZlcihtU3RhdGVSZWNlaXZlciwgZmlsdGVyKTsKLSAgICAgICAgaWYgKGludGVudCAhPSBudWxsKQotICAgICAgICAgICAgbU1vYmlsZURhdGFTdGF0ZSA9IGdldE1vYmlsZURhdGFTdGF0ZShpbnRlbnQpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBtTW9iaWxlRGF0YVN0YXRlID0gUGhvbmUuRGF0YVN0YXRlLkRJU0NPTk5FQ1RFRDsKKyAgICAgICAgbUNvbnRleHQucmVnaXN0ZXJSZWNlaXZlcihuZXcgTW9iaWxlRGF0YVN0YXRlUmVjZWl2ZXIoKSwgZmlsdGVyKTsKKyAgICAgICAgbU1vYmlsZURhdGFTdGF0ZSA9IFBob25lLkRhdGFTdGF0ZS5ESVNDT05ORUNURUQ7CiAgICAgfQogCi0gICAgcHJpdmF0ZSBQaG9uZS5EYXRhU3RhdGUgZ2V0TW9iaWxlRGF0YVN0YXRlKEludGVudCBpbnRlbnQpIHsKLSAgICAgICAgU3RyaW5nIHN0ciA9IGludGVudC5nZXRTdHJpbmdFeHRyYShQaG9uZS5TVEFURV9LRVkpOwotICAgICAgICBpZiAoc3RyICE9IG51bGwpIHsKLSAgICAgICAgICAgIFN0cmluZyBhcG5UeXBlTGlzdCA9Ci0gICAgICAgICAgICAgICAgICAgIGludGVudC5nZXRTdHJpbmdFeHRyYShQaG9uZS5EQVRBX0FQTl9UWVBFU19LRVkpOwotICAgICAgICAgICAgaWYgKGlzQXBuVHlwZUluY2x1ZGVkKGFwblR5cGVMaXN0KSkgewotICAgICAgICAgICAgICAgIHJldHVybiBFbnVtLnZhbHVlT2YoUGhvbmUuRGF0YVN0YXRlLmNsYXNzLCBzdHIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBQaG9uZS5EYXRhU3RhdGUuRElTQ09OTkVDVEVEOworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgSVAgYWRkcmVzc2VzIG9mIHRoZSBETlMgc2VydmVycyBhdmFpbGFibGUgZm9yIHRoZSBtb2JpbGUgZGF0YQorICAgICAqIG5ldHdvcmsgaW50ZXJmYWNlLgorICAgICAqIEByZXR1cm4gYSBsaXN0IG9mIEROUyBhZGRyZXNzZXMsIHdpdGggbm8gaG9sZXMuCisgICAgICovCisgICAgcHVibGljIFN0cmluZ1tdIGdldERuc1Byb3BOYW1lcygpIHsKKyAgICAgICAgcmV0dXJuIHNEbnNQcm9wTmFtZXM7CiAgICAgfQogCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzQXBuVHlwZUluY2x1ZGVkKFN0cmluZyB0eXBlTGlzdCkgewotICAgICAgICAvKiBjb21tYSBzZXBlcmF0ZWQgbGlzdCAtIHNwbGl0IGFuZCBjaGVjayAqLwotICAgICAgICBpZiAodHlwZUxpc3QgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICBwdWJsaWMgYm9vbGVhbiBpc1ByaXZhdGVEbnNSb3V0ZVNldCgpIHsKKyAgICAgICAgcmV0dXJuIG1Qcml2YXRlRG5zUm91dGVTZXQ7CisgICAgfQogCi0gICAgICAgIFN0cmluZ1tdIGxpc3QgPSB0eXBlTGlzdC5zcGxpdCgiLCIpOwotICAgICAgICBmb3IoaW50IGk9MDsgaTwgbGlzdC5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgaWYgKFRleHRVdGlscy5lcXVhbHMobGlzdFtpXSwgbUFwblR5cGVUb1dhdGNoRm9yKSB8fAotICAgICAgICAgICAgICAgIFRleHRVdGlscy5lcXVhbHMobGlzdFtpXSwgUGhvbmUuQVBOX1RZUEVfQUxMKSkgewotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKKyAgICBwdWJsaWMgdm9pZCBwcml2YXRlRG5zUm91dGVTZXQoYm9vbGVhbiBlbmFibGVkKSB7CisgICAgICAgIG1Qcml2YXRlRG5zUm91dGVTZXQgPSBlbmFibGVkOworICAgIH0KKworICAgIHB1YmxpYyBOZXR3b3JrSW5mbyBnZXROZXR3b3JrSW5mbygpIHsKKyAgICAgICAgcmV0dXJuIG1OZXR3b3JrSW5mbzsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGdldERlZmF1bHRHYXRld2F5QWRkcigpIHsKKyAgICAgICAgcmV0dXJuIG1EZWZhdWx0R2F0ZXdheUFkZHI7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaXNEZWZhdWx0Um91dGVTZXQoKSB7CisgICAgICAgIHJldHVybiBtRGVmYXVsdFJvdXRlU2V0OworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGRlZmF1bHRSb3V0ZVNldChib29sZWFuIGVuYWJsZWQpIHsKKyAgICAgICAgbURlZmF1bHRSb3V0ZVNldCA9IGVuYWJsZWQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhpcyBpcyBub3QgaW1wbGVtZW50ZWQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgcmVsZWFzZVdha2VMb2NrKCkgewogICAgIH0KIAogICAgIHByaXZhdGUgY2xhc3MgTW9iaWxlRGF0YVN0YXRlUmVjZWl2ZXIgZXh0ZW5kcyBCcm9hZGNhc3RSZWNlaXZlciB7Ci0gICAgICAgIENvbm5lY3Rpdml0eU1hbmFnZXIgbUNvbm5lY3Rpdml0eU1hbmFnZXI7CisgICAgICAgIElDb25uZWN0aXZpdHlNYW5hZ2VyIG1Db25uZWN0aXZpdHlNYW5hZ2VyOworCiAgICAgICAgIHB1YmxpYyB2b2lkIG9uUmVjZWl2ZShDb250ZXh0IGNvbnRleHQsIEludGVudCBpbnRlbnQpIHsKLSAgICAgICAgICAgIHN5bmNocm9uaXplZCh0aGlzKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGludGVudC5nZXRBY3Rpb24oKS5lcXVhbHMoVGVsZXBob255SW50ZW50cy4KLSAgICAgICAgICAgICAgICAgICAgICAgIEFDVElPTl9BTllfREFUQV9DT05ORUNUSU9OX1NUQVRFX0NIQU5HRUQpKSB7Ci0gICAgICAgICAgICAgICAgICAgIFBob25lLkRhdGFTdGF0ZSBzdGF0ZSA9IGdldE1vYmlsZURhdGFTdGF0ZShpbnRlbnQpOwotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcmVhc29uID0gaW50ZW50LmdldFN0cmluZ0V4dHJhKFBob25lLlNUQVRFX0NIQU5HRV9SRUFTT05fS0VZKTsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGFwbk5hbWUgPSBpbnRlbnQuZ2V0U3RyaW5nRXh0cmEoUGhvbmUuREFUQV9BUE5fS0VZKTsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGFwblR5cGVMaXN0ID0gaW50ZW50LmdldFN0cmluZ0V4dHJhKFBob25lLkRBVEFfQVBOX1RZUEVTX0tFWSk7Ci0gICAgICAgICAgICAgICAgICAgIG1BcG5OYW1lID0gYXBuTmFtZTsKKyAgICAgICAgICAgIGlmIChpbnRlbnQuZ2V0QWN0aW9uKCkuZXF1YWxzKFRlbGVwaG9ueUludGVudHMuCisgICAgICAgICAgICAgICAgICAgIEFDVElPTl9BTllfREFUQV9DT05ORUNUSU9OX1NUQVRFX0NIQU5HRUQpKSB7CisgICAgICAgICAgICAgICAgU3RyaW5nIGFwblR5cGUgPSBpbnRlbnQuZ2V0U3RyaW5nRXh0cmEoUGhvbmUuREFUQV9BUE5fVFlQRV9LRVkpOworICAgICAgICAgICAgICAgIGlmICghVGV4dFV0aWxzLmVxdWFscyhhcG5UeXBlLCBtQXBuVHlwZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBQaG9uZS5EYXRhU3RhdGUgc3RhdGUgPSBFbnVtLnZhbHVlT2YoUGhvbmUuRGF0YVN0YXRlLmNsYXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgaW50ZW50LmdldFN0cmluZ0V4dHJhKFBob25lLlNUQVRFX0tFWSkpOworICAgICAgICAgICAgICAgIFN0cmluZyByZWFzb24gPSBpbnRlbnQuZ2V0U3RyaW5nRXh0cmEoUGhvbmUuU1RBVEVfQ0hBTkdFX1JFQVNPTl9LRVkpOworICAgICAgICAgICAgICAgIFN0cmluZyBhcG5OYW1lID0gaW50ZW50LmdldFN0cmluZ0V4dHJhKFBob25lLkRBVEFfQVBOX0tFWSk7CiAKLSAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiB1bmF2YWlsYWJsZSA9IGludGVudC5nZXRCb29sZWFuRXh0cmEoUGhvbmUuTkVUV09SS19VTkFWQUlMQUJMRV9LRVksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UpOworICAgICAgICAgICAgICAgIG1OZXR3b3JrSW5mby5zZXRJc0F2YWlsYWJsZSghaW50ZW50LmdldEJvb2xlYW5FeHRyYShQaG9uZS5ORVRXT1JLX1VOQVZBSUxBQkxFX0tFWSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlKSk7CiAKLSAgICAgICAgICAgICAgICAgICAgLy8gc2V0IHRoaXMgcmVnYXJkbGVzcyBvZiB0aGUgYXBuVHlwZUxpc3QuICBJdCdzIGFsbCB0aGUgc2FtZSByYWRpby9uZXR3b3JrCi0gICAgICAgICAgICAgICAgICAgIC8vIHVuZGVybmVhdGgKLSAgICAgICAgICAgICAgICAgICAgbU5ldHdvcmtJbmZvLnNldElzQXZhaWxhYmxlKCF1bmF2YWlsYWJsZSk7CisgICAgICAgICAgICAgICAgaWYgKERCRykgTG9nLmQoVEFHLCBtQXBuVHlwZSArICIgUmVjZWl2ZWQgc3RhdGU9ICIgKyBzdGF0ZSArICIsIG9sZD0gIiArCisgICAgICAgICAgICAgICAgICAgICAgICBtTW9iaWxlRGF0YVN0YXRlICsgIiwgcmVhc29uPSAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgIChyZWFzb24gPT0gbnVsbCA/ICIodW5zcGVjaWZpZWQpIiA6IHJlYXNvbikpOwogCi0gICAgICAgICAgICAgICAgICAgIGlmIChpc0FwblR5cGVJbmNsdWRlZChhcG5UeXBlTGlzdCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtRW5hYmxlZCA9PSBmYWxzZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIHdlJ3JlIG5vdCBlbmFibGVkIGJ1dCB0aGUgQVBOIFR5cGUgaXMgc3VwcG9ydGVkIGJ5IHRoaXMgY29ubmVjdGlvbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdlIHNob3VsZCByZWNvcmQgdGhlIGludGVyZmFjZSBuYW1lIGlmIG9uZSdzIHByb3ZpZGVkLiAgSWYgdGhlIHVzZXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0dXJucyBvbiB0aGlzIG5ldHdvcmsgd2Ugd2lsbCBuZWVkIHRoZSBpbnRlcmZhY2VuYW1lIGJ1dCB3b24ndCBnZXQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhIGZyZXNoIGNvbm5lY3RlZCBtZXNzYWdlIC0gVE9ETyBmaXggdGhpcyB3aGVuIHdlIGdldCBwZXItQVBOCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbm90aWZpY2F0aW9ucwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdGF0ZSA9PSBQaG9uZS5EYXRhU3RhdGUuQ09OTkVDVEVEKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChEQkcpIExvZy5kKFRBRywgInJlcGxhY2luZyBvbGQgbUludGVyZmFjZU5hbWUgKCIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1JbnRlcmZhY2VOYW1lICsgIikgd2l0aCAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlbnQuZ2V0U3RyaW5nRXh0cmEoUGhvbmUuREFUQV9JRkFDRV9OQU1FX0tFWSkgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgZm9yICIgKyBtQXBuVHlwZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1JbnRlcmZhY2VOYW1lID0gaW50ZW50LmdldFN0cmluZ0V4dHJhKFBob25lLkRBVEFfSUZBQ0VfTkFNRV9LRVkpOworICAgICAgICAgICAgICAgIGlmIChtTW9iaWxlRGF0YVN0YXRlICE9IHN0YXRlKSB7CisgICAgICAgICAgICAgICAgICAgIG1Nb2JpbGVEYXRhU3RhdGUgPSBzdGF0ZTsKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdGF0ZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBESVNDT05ORUNURUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoaXNUZWFyZG93blJlcXVlc3RlZCgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFRlYXJkb3duUmVxdWVzdGVkKGZhbHNlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICAgICAgaWYgKERCRykgTG9nLmQoVEFHLCBtQXBuVHlwZSArICIgUmVjZWl2ZWQgc3RhdGU9ICIgKyBzdGF0ZSArICIsIG9sZD0gIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbU1vYmlsZURhdGFTdGF0ZSArICIsIHJlYXNvbj0gIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKHJlYXNvbiA9PSBudWxsID8gIih1bnNwZWNpZmllZCkiIDogcmVhc29uKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIiwgYXBuVHlwZUxpc3Q9ICIgKyBhcG5UeXBlTGlzdCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKG1Nb2JpbGVEYXRhU3RhdGUgIT0gc3RhdGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1Nb2JpbGVEYXRhU3RhdGUgPSBzdGF0ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3RhdGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIERJU0NPTk5FQ1RFRDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoaXNUZWFyZG93blJlcXVlc3RlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtRW5hYmxlZCA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0VGVhcmRvd25SZXF1ZXN0ZWQoZmFsc2UpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldERldGFpbGVkU3RhdGUoRGV0YWlsZWRTdGF0ZS5ESVNDT05ORUNURUQsIHJlYXNvbiwgYXBuTmFtZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBkb1Jlc2V0ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobUlzRGVmYXVsdE9ySGlwcmkgPT0gdHJ1ZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBib3RoIGRlZmF1bHQgYW5kIGhpcHJpIG11c3QgZ28gZG93biBiZWZvcmUgd2UgcmVzZXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHR5cGVUb0NoZWNrID0gKFBob25lLkFQTl9UWVBFX0RFRkFVTFQuZXF1YWxzKG1BcG5UeXBlKSA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25uZWN0aXZpdHlNYW5hZ2VyLlRZUEVfTU9CSUxFX0hJUFJJIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbm5lY3Rpdml0eU1hbmFnZXIuVFlQRV9NT0JJTEUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobUNvbm5lY3Rpdml0eU1hbmFnZXIgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUJpbmRlciBiID0gU2VydmljZU1hbmFnZXIuZ2V0U2VydmljZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udGV4dC5DT05ORUNUSVZJVFlfU0VSVklDRSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ29ubmVjdGl2aXR5TWFuYWdlciA9IElDb25uZWN0aXZpdHlNYW5hZ2VyLlN0dWIuYXNJbnRlcmZhY2UoYik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXREZXRhaWxlZFN0YXRlKERldGFpbGVkU3RhdGUuRElTQ09OTkVDVEVELCByZWFzb24sIGFwbk5hbWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIGRvUmVzZXQgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobUlzRGVmYXVsdE9ySGlwcmkgPT0gdHJ1ZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYm90aCBkZWZhdWx0IGFuZCBoaXByaSBtdXN0IGdvIGRvd24gYmVmb3JlIHdlIHJlc2V0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdHlwZVRvQ2hlY2sgPSAoUGhvbmUuQVBOX1RZUEVfREVGQVVMVC5lcXVhbHMobUFwblR5cGUpID8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29ubmVjdGl2aXR5TWFuYWdlci5UWVBFX01PQklMRV9ISVBSSSA6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbm5lY3Rpdml0eU1hbmFnZXIuVFlQRV9NT0JJTEUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1Db25uZWN0aXZpdHlNYW5hZ2VyID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ29ubmVjdGl2aXR5TWFuYWdlciA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQ29ubmVjdGl2aXR5TWFuYWdlciljb250ZXh0LmdldFN5c3RlbVNlcnZpY2UoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb250ZXh0LkNPTk5FQ1RJVklUWV9TRVJWSUNFKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtQ29ubmVjdGl2aXR5TWFuYWdlciAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTmV0d29ya0luZm8gaW5mbyA9IG1Db25uZWN0aXZpdHlNYW5hZ2VyLmdldE5ldHdvcmtJbmZvKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVUb0NoZWNrKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5mbyAhPSBudWxsICYmIGluZm8uaXNDb25uZWN0ZWQoKSA9PSB0cnVlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlVG9DaGVjayk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGluZm8uaXNDb25uZWN0ZWQoKSA9PSB0cnVlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvUmVzZXQgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBqdXN0IGdvIGFoZWFkIHdpdGggdGhlIHJlc2V0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2cuZShUQUcsICJFeGNlcHRpb24gdHJ5aW5nIHRvIGNvbnRhY3QgQ29ublNlcnZpY2U6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZG9SZXNldCAmJiBtSW50ZXJmYWNlTmFtZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOZXR3b3JrVXRpbHMucmVzZXRDb25uZWN0aW9ucyhtSW50ZXJmYWNlTmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2FuJ3QgZG8gdGhpcyBoZXJlIC0gQ29ubmVjdGl2aXR5U2VydmljZSBuZWVkcyBpdCB0byBjbGVhciBzdHVmZgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpdCdzIG9rIHRob3VnaCAtIGp1c3QgbGVhdmUgaXQgdG8gYmUgcmVmcmVzaGVkIG5leHQgdGltZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3ZSBjb25uZWN0LgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2lmIChEQkcpIExvZy5kKFRBRywgImNsZWFyaW5nIG1JbnRlcmZhY2VOYW1lIGZvciAiKyBtQXBuVHlwZSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICAgICAiIGFzIGl0IERJU0NPTk5FQ1RFRCIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL21JbnRlcmZhY2VOYW1lID0gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9tRGVmYXVsdEdhdGV3YXlBZGRyID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBDT05ORUNUSU5HOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXREZXRhaWxlZFN0YXRlKERldGFpbGVkU3RhdGUuQ09OTkVDVElORywgcmVhc29uLCBhcG5OYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBTVVNQRU5ERUQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldERldGFpbGVkU3RhdGUoRGV0YWlsZWRTdGF0ZS5TVVNQRU5ERUQsIHJlYXNvbiwgYXBuTmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQ09OTkVDVEVEOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtSW50ZXJmYWNlTmFtZSA9IGludGVudC5nZXRTdHJpbmdFeHRyYShQaG9uZS5EQVRBX0lGQUNFX05BTUVfS0VZKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1JbnRlcmZhY2VOYW1lID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIkNPTk5FQ1RFRCBldmVudCBkaWQgbm90IHN1cHBseSBpbnRlcmZhY2UgbmFtZS4iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtRGVmYXVsdEdhdGV3YXlBZGRyID0gaW50ZW50LmdldEludEV4dHJhKFBob25lLkRBVEFfR0FURVdBWV9LRVksIDApOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXREZXRhaWxlZFN0YXRlKERldGFpbGVkU3RhdGUuQ09OTkVDVEVELCByZWFzb24sIGFwbk5hbWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRvUmVzZXQgJiYgbUxpbmtQcm9wZXJ0aWVzICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGlmYWNlID0gbUxpbmtQcm9wZXJ0aWVzLmdldEludGVyZmFjZU5hbWUoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlmYWNlICE9IG51bGwpIE5ldHdvcmtVdGlscy5yZXNldENvbm5lY3Rpb25zKGlmYWNlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ETyAtIGNoZWNrIHRoaXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjYW4ndCBkbyB0aGlzIGhlcmUgLSBDb25uZWN0aXZpdHlTZXJ2aWNlIG5lZWRzIGl0IHRvIGNsZWFyIHN0dWZmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaXQncyBvayB0aG91Z2ggLSBqdXN0IGxlYXZlIGl0IHRvIGJlIHJlZnJlc2hlZCBuZXh0IHRpbWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3ZSBjb25uZWN0LgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vaWYgKERCRykgTG9nLmQoVEFHLCAiY2xlYXJpbmcgbUludGVyZmFjZU5hbWUgZm9yICIrIG1BcG5UeXBlICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgICAgIiBhcyBpdCBESVNDT05ORUNURUQiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL21JbnRlcmZhY2VOYW1lID0gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL21EZWZhdWx0R2F0ZXdheUFkZHIgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBDT05ORUNUSU5HOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldERldGFpbGVkU3RhdGUoRGV0YWlsZWRTdGF0ZS5DT05ORUNUSU5HLCByZWFzb24sIGFwbk5hbWUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBTVVNQRU5ERUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0RGV0YWlsZWRTdGF0ZShEZXRhaWxlZFN0YXRlLlNVU1BFTkRFRCwgcmVhc29uLCBhcG5OYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQ09OTkVDVEVEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1MaW5rUHJvcGVydGllcyA9IGludGVudC5nZXRQYXJjZWxhYmxlRXh0cmEoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQaG9uZS5EQVRBX0xJTktfUFJPUEVSVElFU19LRVkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtTGlua1Byb3BlcnRpZXMgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNPTk5FQ1RFRCBldmVudCBkaWQgbm90IHN1cHBseSBsaW5rIHByb3BlcnRpZXMuIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldERldGFpbGVkU3RhdGUoRGV0YWlsZWRTdGF0ZS5DT05ORUNURUQsIHJlYXNvbiwgYXBuTmFtZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGludGVudC5nZXRBY3Rpb24oKS4KLSAgICAgICAgICAgICAgICAgICAgICAgIGVxdWFscyhUZWxlcGhvbnlJbnRlbnRzLkFDVElPTl9EQVRBX0NPTk5FQ1RJT05fRkFJTEVEKSkgewotICAgICAgICAgICAgICAgICAgICBtRW5hYmxlZCA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcmVhc29uID0gaW50ZW50LmdldFN0cmluZ0V4dHJhKFBob25lLkZBSUxVUkVfUkVBU09OX0tFWSk7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBhcG5OYW1lID0gaW50ZW50LmdldFN0cmluZ0V4dHJhKFBob25lLkRBVEFfQVBOX0tFWSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChEQkcpIExvZy5kKFRBRywgIlJlY2VpdmVkICIgKyBpbnRlbnQuZ2V0QWN0aW9uKCkgKyAiIGJyb2FkY2FzdCIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYXNvbiA9PSBudWxsID8gIiIgOiAiKCIgKyByZWFzb24gKyAiKSIpOwotICAgICAgICAgICAgICAgICAgICBzZXREZXRhaWxlZFN0YXRlKERldGFpbGVkU3RhdGUuRkFJTEVELCByZWFzb24sIGFwbk5hbWUpOwogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBUZWxlcGhvbnlNYW5hZ2VyIHRtID0gVGVsZXBob255TWFuYWdlci5nZXREZWZhdWx0KCk7Ci0gICAgICAgICAgICAgICAgc2V0Um9hbWluZ1N0YXR1cyh0bS5pc05ldHdvcmtSb2FtaW5nKCkpOwotICAgICAgICAgICAgICAgIHNldFN1YnR5cGUodG0uZ2V0TmV0d29ya1R5cGUoKSwgdG0uZ2V0TmV0d29ya1R5cGVOYW1lKCkpOworICAgICAgICAgICAgfSBlbHNlIGlmIChpbnRlbnQuZ2V0QWN0aW9uKCkuCisgICAgICAgICAgICAgICAgICAgIGVxdWFscyhUZWxlcGhvbnlJbnRlbnRzLkFDVElPTl9EQVRBX0NPTk5FQ1RJT05fRkFJTEVEKSkgeworICAgICAgICAgICAgICAgIFN0cmluZyBhcG5UeXBlID0gaW50ZW50LmdldFN0cmluZ0V4dHJhKFBob25lLkRBVEFfQVBOX1RZUEVfS0VZKTsKKyAgICAgICAgICAgICAgICBpZiAoIVRleHRVdGlscy5lcXVhbHMoYXBuVHlwZSwgbUFwblR5cGUpKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgU3RyaW5nIHJlYXNvbiA9IGludGVudC5nZXRTdHJpbmdFeHRyYShQaG9uZS5GQUlMVVJFX1JFQVNPTl9LRVkpOworICAgICAgICAgICAgICAgIFN0cmluZyBhcG5OYW1lID0gaW50ZW50LmdldFN0cmluZ0V4dHJhKFBob25lLkRBVEFfQVBOX0tFWSk7CisgICAgICAgICAgICAgICAgaWYgKERCRykgTG9nLmQoVEFHLCBtQXBuVHlwZSArICJSZWNlaXZlZCAiICsgaW50ZW50LmdldEFjdGlvbigpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICIgYnJvYWRjYXN0IiArIHJlYXNvbiA9PSBudWxsID8gIiIgOiAiKCIgKyByZWFzb24gKyAiKSIpOworICAgICAgICAgICAgICAgIHNldERldGFpbGVkU3RhdGUoRGV0YWlsZWRTdGF0ZS5GQUlMRUQsIHJlYXNvbiwgYXBuTmFtZSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CkBAIC0yNzIsMzMgKzI2Myw3IEBACiAgICAgICogUmVwb3J0IHdoZXRoZXIgZGF0YSBjb25uZWN0aXZpdHkgaXMgcG9zc2libGUuCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gaXNBdmFpbGFibGUoKSB7Ci0gICAgICAgIGdldFBob25lU2VydmljZShmYWxzZSk7Ci0KLSAgICAgICAgLyoKLSAgICAgICAgICogSWYgdGhlIHBob25lIHByb2Nlc3MgaGFzIGNyYXNoZWQgaW4gdGhlIHBhc3QsIHdlJ2xsIGdldCBhCi0gICAgICAgICAqIFJlbW90ZUV4Y2VwdGlvbiBhbmQgbmVlZCB0byByZS1yZWZlcmVuY2UgdGhlIHNlcnZpY2UuCi0gICAgICAgICAqLwotICAgICAgICBmb3IgKGludCByZXRyeSA9IDA7IHJldHJ5IDwgMjsgcmV0cnkrKykgewotICAgICAgICAgICAgaWYgKG1QaG9uZVNlcnZpY2UgPT0gbnVsbCkgYnJlYWs7Ci0KLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG1QaG9uZVNlcnZpY2UuaXNEYXRhQ29ubmVjdGl2aXR5UG9zc2libGUoKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgLy8gRmlyc3QtdGltZSBmYWlsZWQsIGdldCB0aGUgcGhvbmUgc2VydmljZSBhZ2FpbgotICAgICAgICAgICAgICAgIGlmIChyZXRyeSA9PSAwKSBnZXRQaG9uZVNlcnZpY2UodHJ1ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICoge0Bpbmhlcml0RG9jfQotICAgICAqIFRoZSBtb2JpbGUgZGF0YSBuZXR3b3JrIHN1YnR5cGUgaW5kaWNhdGVzIHdoYXQgZ2VuZXJhdGlvbiBuZXR3b3JrIHRlY2hub2xvZ3kgaXMgaW4gZWZmZWN0LAotICAgICAqIGUuZy4sIEdQUlMsIEVER0UsIFVNVFMsIGV0Yy4KLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IGdldE5ldHdvcmtTdWJ0eXBlKCkgewotICAgICAgICByZXR1cm4gVGVsZXBob255TWFuYWdlci5nZXREZWZhdWx0KCkuZ2V0TmV0d29ya1R5cGUoKTsKKyAgICAgICAgcmV0dXJuIG1OZXR3b3JrSW5mby5pc0F2YWlsYWJsZSgpOwogICAgIH0KIAogICAgIC8qKgpAQCAtMzUwLDcwICszMTUsNzQgQEAKICAgICAvKioKICAgICAgKiBUZWFyIGRvd24gbW9iaWxlIGRhdGEgY29ubmVjdGl2aXR5LCBpLmUuLCBkaXNhYmxlIHRoZSBhYmlsaXR5IHRvIGNyZWF0ZQogICAgICAqIG1vYmlsZSBkYXRhIGNvbm5lY3Rpb25zLgorICAgICAqIFRPRE8gLSBtYWtlIGFzeW5jIGFuZCByZXR1cm4gbm90aGluZz8KICAgICAgKi8KLSAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgYm9vbGVhbiB0ZWFyZG93bigpIHsKLSAgICAgICAgLy8gc2luY2Ugd2Ugd29uJ3QgZ2V0IGEgbm90aWZpY2F0aW9uIGN1cnJlbnRseSAoVE9ETyAtIHBlciBBUE4gbm90aWZpY2F0aW9ucykKLSAgICAgICAgLy8gd2Ugd29uJ3QgZ2V0IGEgZGlzY29ubmVjdCBtZXNzYWdlIHVudGlsIGFsbCBBUE4ncyBvbiB0aGUgY3VycmVudCBjb25uZWN0aW9uJ3MKLSAgICAgICAgLy8gQVBOIGxpc3QgYXJlIGRpc2FibGVkLiAgVGhhdCBtZWFucyBwcml2YXRlUm91dGVzIGZvciBETlMgYW5kIHN1Y2ggd2lsbCByZW1haW4gb24gLQotICAgICAgICAvLyBub3QgYSBwcm9ibGVtIHNpbmNlIHRoYXQncyBhbGwgc2hhcmVkIHdpdGggd2hhdGV2ZXIgb3RoZXIgQVBOIGlzIHN0aWxsIG9uLCBidXQKLSAgICAgICAgLy8gdWdseS4KICAgICAgICAgc2V0VGVhcmRvd25SZXF1ZXN0ZWQodHJ1ZSk7CiAgICAgICAgIHJldHVybiAoc2V0RW5hYmxlQXBuKG1BcG5UeXBlLCBmYWxzZSkgIT0gUGhvbmUuQVBOX1JFUVVFU1RfRkFJTEVEKTsKICAgICB9CiAKICAgICAvKioKKyAgICAgKiBSZWNvcmQgdGhlIGRldGFpbGVkIHN0YXRlIG9mIGEgbmV0d29yaywgYW5kIGlmIGl0IGlzIGEKKyAgICAgKiBjaGFuZ2UgZnJvbSB0aGUgcHJldmlvdXMgc3RhdGUsIHNlbmQgYSBub3RpZmljYXRpb24gdG8KKyAgICAgKiBhbnkgbGlzdGVuZXJzLgorICAgICAqIEBwYXJhbSBzdGF0ZSB0aGUgbmV3IEB7Y29kZSBEZXRhaWxlZFN0YXRlfQorICAgICAqIEBwYXJhbSByZWFzb24gYSB7QGNvZGUgU3RyaW5nfSBpbmRpY2F0aW5nIGEgcmVhc29uIGZvciB0aGUgc3RhdGUgY2hhbmdlLAorICAgICAqIGlmIG9uZSB3YXMgc3VwcGxpZWQuIE1heSBiZSB7QGNvZGUgbnVsbH0uCisgICAgICogQHBhcmFtIGV4dHJhSW5mbyBvcHRpb25hbCB7QGNvZGUgU3RyaW5nfSBwcm92aWRpbmcgZXh0cmEgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHN0YXRlIGNoYW5nZQorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBzZXREZXRhaWxlZFN0YXRlKE5ldHdvcmtJbmZvLkRldGFpbGVkU3RhdGUgc3RhdGUsIFN0cmluZyByZWFzb24sIFN0cmluZyBleHRyYUluZm8pIHsKKyAgICAgICAgaWYgKERCRykgTG9nLmQoVEFHLCAic2V0RGV0YWlsZWQgc3RhdGUsIG9sZCA9IgorICAgICAgICAgICAgICAgICsgbU5ldHdvcmtJbmZvLmdldERldGFpbGVkU3RhdGUoKSArICIgYW5kIG5ldyBzdGF0ZT0iICsgc3RhdGUpOworICAgICAgICBpZiAoc3RhdGUgIT0gbU5ldHdvcmtJbmZvLmdldERldGFpbGVkU3RhdGUoKSkgeworICAgICAgICAgICAgYm9vbGVhbiB3YXNDb25uZWN0aW5nID0gKG1OZXR3b3JrSW5mby5nZXRTdGF0ZSgpID09IE5ldHdvcmtJbmZvLlN0YXRlLkNPTk5FQ1RJTkcpOworICAgICAgICAgICAgU3RyaW5nIGxhc3RSZWFzb24gPSBtTmV0d29ya0luZm8uZ2V0UmVhc29uKCk7CisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogSWYgYSByZWFzb24gd2FzIHN1cHBsaWVkIHdoZW4gdGhlIENPTk5FQ1RJTkcgc3RhdGUgd2FzIGVudGVyZWQsIGFuZCBubworICAgICAgICAgICAgICogcmVhc29uIHdhcyBzdXBwbGllZCBmb3IgZW50ZXJpbmcgdGhlIENPTk5FQ1RFRCBzdGF0ZSwgdGhlbiByZXRhaW4gdGhlCisgICAgICAgICAgICAgKiByZWFzb24gdGhhdCB3YXMgc3VwcGxpZWQgd2hlbiBnb2luZyB0byBDT05ORUNUSU5HLgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBpZiAod2FzQ29ubmVjdGluZyAmJiBzdGF0ZSA9PSBOZXR3b3JrSW5mby5EZXRhaWxlZFN0YXRlLkNPTk5FQ1RFRCAmJiByZWFzb24gPT0gbnVsbAorICAgICAgICAgICAgICAgICAgICAmJiBsYXN0UmVhc29uICE9IG51bGwpCisgICAgICAgICAgICAgICAgcmVhc29uID0gbGFzdFJlYXNvbjsKKyAgICAgICAgICAgIG1OZXR3b3JrSW5mby5zZXREZXRhaWxlZFN0YXRlKHN0YXRlLCByZWFzb24sIGV4dHJhSW5mbyk7CisgICAgICAgICAgICBNZXNzYWdlIG1zZyA9IG1UYXJnZXQub2J0YWluTWVzc2FnZShFVkVOVF9TVEFURV9DSEFOR0VELCBtTmV0d29ya0luZm8pOworICAgICAgICAgICAgbXNnLnNlbmRUb1RhcmdldCgpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0VGVhcmRvd25SZXF1ZXN0ZWQoYm9vbGVhbiBpc1JlcXVlc3RlZCkgeworICAgICAgICBtVGVhcmRvd25SZXF1ZXN0ZWQgPSBpc1JlcXVlc3RlZDsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBpc1RlYXJkb3duUmVxdWVzdGVkKCkgeworICAgICAgICByZXR1cm4gbVRlYXJkb3duUmVxdWVzdGVkOworICAgIH0KKworICAgIC8qKgogICAgICAqIFJlLWVuYWJsZSBtb2JpbGUgZGF0YSBjb25uZWN0aXZpdHkgYWZ0ZXIgYSB7QGxpbmsgI3RlYXJkb3duKCl9LgorICAgICAqIFRPRE8gLSBtYWtlIGFzeW5jIGFuZCBhbHdheXMgZ2V0IGEgbm90aWZpY2F0aW9uPwogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIHJlY29ubmVjdCgpIHsKKyAgICAgICAgYm9vbGVhbiByZXRWYWx1ZSA9IGZhbHNlOyAvL2Nvbm5lY3RlZCBvciBleHBlY3QgdG8gYmU/CiAgICAgICAgIHNldFRlYXJkb3duUmVxdWVzdGVkKGZhbHNlKTsKICAgICAgICAgc3dpdGNoIChzZXRFbmFibGVBcG4obUFwblR5cGUsIHRydWUpKSB7CiAgICAgICAgICAgICBjYXNlIFBob25lLkFQTl9BTFJFQURZX0FDVElWRToKLSAgICAgICAgICAgICAgICAvLyBUT0RPIC0gcmVtb3ZlIHRoaXMgd2hlbiB3ZSBnZXQgcGVyLWFwbiBub3RpZmljYXRpb25zCi0gICAgICAgICAgICAgICAgbUVuYWJsZWQgPSB0cnVlOwogICAgICAgICAgICAgICAgIC8vIG5lZWQgdG8gc2V0IHNlbGYgdG8gQ09OTkVDVElORyBzbyB0aGUgYmVsb3cgbWVzc2FnZSBpcyBoYW5kbGVkLgotICAgICAgICAgICAgICAgIG1Nb2JpbGVEYXRhU3RhdGUgPSBQaG9uZS5EYXRhU3RhdGUuQ09OTkVDVElORzsKLSAgICAgICAgICAgICAgICBzZXREZXRhaWxlZFN0YXRlKERldGFpbGVkU3RhdGUuQ09OTkVDVElORywgUGhvbmUuUkVBU09OX0FQTl9DSEFOR0VELCBudWxsKTsKLSAgICAgICAgICAgICAgICAvL3NlbmQgb3V0IGEgY29ubmVjdGVkIG1lc3NhZ2UKLSAgICAgICAgICAgICAgICBJbnRlbnQgaW50ZW50ID0gbmV3IEludGVudChUZWxlcGhvbnlJbnRlbnRzLgotICAgICAgICAgICAgICAgICAgICAgICAgQUNUSU9OX0FOWV9EQVRBX0NPTk5FQ1RJT05fU1RBVEVfQ0hBTkdFRCk7Ci0gICAgICAgICAgICAgICAgaW50ZW50LnB1dEV4dHJhKFBob25lLlNUQVRFX0tFWSwgUGhvbmUuRGF0YVN0YXRlLkNPTk5FQ1RFRC50b1N0cmluZygpKTsKLSAgICAgICAgICAgICAgICBpbnRlbnQucHV0RXh0cmEoUGhvbmUuU1RBVEVfQ0hBTkdFX1JFQVNPTl9LRVksIFBob25lLlJFQVNPTl9BUE5fQ0hBTkdFRCk7Ci0gICAgICAgICAgICAgICAgaW50ZW50LnB1dEV4dHJhKFBob25lLkRBVEFfQVBOX1RZUEVTX0tFWSwgbUFwblR5cGVUb1dhdGNoRm9yKTsKLSAgICAgICAgICAgICAgICBpbnRlbnQucHV0RXh0cmEoUGhvbmUuREFUQV9BUE5fS0VZLCBtQXBuTmFtZSk7Ci0gICAgICAgICAgICAgICAgaW50ZW50LnB1dEV4dHJhKFBob25lLkRBVEFfSUZBQ0VfTkFNRV9LRVksIG1JbnRlcmZhY2VOYW1lKTsKLSAgICAgICAgICAgICAgICBpbnRlbnQucHV0RXh0cmEoUGhvbmUuTkVUV09SS19VTkFWQUlMQUJMRV9LRVksIGZhbHNlKTsKLSAgICAgICAgICAgICAgICBpZiAobVN0YXRlUmVjZWl2ZXIgIT0gbnVsbCkgbVN0YXRlUmVjZWl2ZXIub25SZWNlaXZlKG1Db250ZXh0LCBpbnRlbnQpOworICAgICAgICAgICAgICAgIHJldFZhbHVlID0gdHJ1ZTsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIGNhc2UgUGhvbmUuQVBOX1JFUVVFU1RfU1RBUlRFRDoKLSAgICAgICAgICAgICAgICBtRW5hYmxlZCA9IHRydWU7CiAgICAgICAgICAgICAgICAgLy8gbm8gbmVlZCB0byBkbyBhbnl0aGluZyAtIHdlJ3JlIGFscmVhZHkgZHVlIHNvbWUgc3RhdHVzIHVwZGF0ZSBpbnRlbnRzCisgICAgICAgICAgICAgICAgcmV0VmFsdWUgPSB0cnVlOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgY2FzZSBQaG9uZS5BUE5fUkVRVUVTVF9GQUlMRUQ6Ci0gICAgICAgICAgICAgICAgaWYgKG1QaG9uZVNlcnZpY2UgPT0gbnVsbCAmJiBtQXBuVHlwZSA9PSBQaG9uZS5BUE5fVFlQRV9ERUZBVUxUKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIG9uIHN0YXJ0dXAgd2UgbWF5IHRyeSB0byB0YWxrIHRvIHRoZSBwaG9uZSBiZWZvcmUgaXQncyByZWFkeQotICAgICAgICAgICAgICAgICAgICAvLyBzaW5jZSB0aGUgcGhvbmUgd2lsbCBjb21lIHVwIGVuYWJsZWQsIGdvIHdpdGggdGhhdC4KLSAgICAgICAgICAgICAgICAgICAgLy8gVE9ETyAtIHRoaXMgYWxzbyBjb21lcyB1cCBvbiB0ZWxlcGhvbnkgY3Jhc2g6IGlmIHdlIHRoaW5rIG1vYmlsZSBkYXRhIGlzCi0gICAgICAgICAgICAgICAgICAgIC8vIG9mZiBhbmQgdGhlIHRlbGVwaG9ueSBzdHVmZiBjcmFzaGVzIGFuZCBoYXMgdG8gcmVzdGFydCBpdCB3aWxsIGNvbWUgdXAKLSAgICAgICAgICAgICAgICAgICAgLy8gZW5hYmxlZCAobWFraW5nIGEgZGF0YSBjb25uZWN0aW9uKS4gIFdlIHdpbGwgdGhlbiBiZSBvdXQgb2Ygc3luYy4KLSAgICAgICAgICAgICAgICAgICAgLy8gQSBwb3NzaWJsZSBzb2x1dGlvbiBpcyBhIGJyb2FkY2FzdCB3aGVuIHRlbGVwaG9ueSByZXN0YXJ0cy4KLSAgICAgICAgICAgICAgICAgICAgbUVuYWJsZWQgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIC8vIGVsc2UgZmFsbCB0aHJvdWdoCiAgICAgICAgICAgICBjYXNlIFBob25lLkFQTl9UWVBFX05PVF9BVkFJTEFCTEU6Ci0gICAgICAgICAgICAgICAgLy8gRGVmYXVsdCBpcyBhbHdheXMgYXZhaWxhYmxlLCBidXQgbWF5IGJlIG9mZiBkdWUgdG8KLSAgICAgICAgICAgICAgICAvLyBBaXJwbGFuZU1vZGUgb3IgRS1DYWxsIG9yIHdoYXRldmVyLi4KLSAgICAgICAgICAgICAgICBpZiAobUFwblR5cGUgIT0gUGhvbmUuQVBOX1RZUEVfREVGQVVMVCkgewotICAgICAgICAgICAgICAgICAgICBtRW5hYmxlZCA9IGZhbHNlOwotICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAiRXJyb3IgaW4gcmVjb25uZWN0IC0gdW5leHBlY3RlZCByZXNwb25zZS4iKTsKLSAgICAgICAgICAgICAgICBtRW5hYmxlZCA9IGZhbHNlOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9Ci0gICAgICAgIHJldHVybiBtRW5hYmxlZDsKKyAgICAgICAgcmV0dXJuIHJldFZhbHVlOwogICAgIH0KIAogICAgIC8qKgpAQCAtNDg2LDI1ICs0NTUsNiBAQAogICAgICAgICByZXR1cm4gLTE7CiAgICAgfQogCi0gICAgLyoqCi0gICAgICogRW5zdXJlIHRoYXQgYSBuZXR3b3JrIHJvdXRlIGV4aXN0cyB0byBkZWxpdmVyIHRyYWZmaWMgdG8gdGhlIHNwZWNpZmllZAotICAgICAqIGhvc3QgdmlhIHRoZSBtb2JpbGUgZGF0YSBuZXR3b3JrLgotICAgICAqIEBwYXJhbSBob3N0QWRkcmVzcyB0aGUgSVAgYWRkcmVzcyBvZiB0aGUgaG9zdCB0byB3aGljaCB0aGUgcm91dGUgaXMgZGVzaXJlZCwKLSAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBvbiBzdWNjZXNzLCB7QGNvZGUgZmFsc2V9IG9uIGZhaWx1cmUKLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiByZXF1ZXN0Um91dGVUb0hvc3QoSW5ldEFkZHJlc3MgaG9zdEFkZHJlc3MpIHsKLSAgICAgICAgaWYgKERCRykgewotICAgICAgICAgICAgTG9nLmQoVEFHLCAiUmVxdWVzdGVkIGhvc3Qgcm91dGUgdG8gIiArIGhvc3RBZGRyZXNzLmdldEhvc3RBZGRyZXNzKCkgKwotICAgICAgICAgICAgICAgICAgICAiIGZvciAiICsgbUFwblR5cGUgKyAiKCIgKyBtSW50ZXJmYWNlTmFtZSArICIpIik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG1JbnRlcmZhY2VOYW1lICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBOZXR3b3JrVXRpbHMuYWRkSG9zdFJvdXRlKG1JbnRlcmZhY2VOYW1lLCBob3N0QWRkcmVzcywgbnVsbCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICB9Ci0KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewogICAgICAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCJNb2JpbGUgZGF0YSBzdGF0ZTogIik7CkBAIC01NjYsNCArNTE2LDggQEAKICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgfQogICAgIH0KKworICAgIHB1YmxpYyBMaW5rUHJvcGVydGllcyBnZXRMaW5rUHJvcGVydGllcygpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBMaW5rUHJvcGVydGllcyhtTGlua1Byb3BlcnRpZXMpOworICAgIH0KIH0KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL25ldC9OZXR3b3JrSW5mby5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvbmV0L05ldHdvcmtJbmZvLmphdmEKaW5kZXggNjQ5Y2I4Yy4uNWY1ZTExYyAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvbmV0L05ldHdvcmtJbmZvLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvbmV0L05ldHdvcmtJbmZvLmphdmEKQEAgLTk3LDcgKzk3LDcgQEAKICAgICAgICAgc3RhdGVNYXAucHV0KERldGFpbGVkU3RhdGUuRElTQ09OTkVDVEVELCBTdGF0ZS5ESVNDT05ORUNURUQpOwogICAgICAgICBzdGF0ZU1hcC5wdXQoRGV0YWlsZWRTdGF0ZS5GQUlMRUQsIFN0YXRlLkRJU0NPTk5FQ1RFRCk7CiAgICAgfQotICAgIAorCiAgICAgcHJpdmF0ZSBpbnQgbU5ldHdvcmtUeXBlOwogICAgIHByaXZhdGUgaW50IG1TdWJ0eXBlOwogICAgIHByaXZhdGUgU3RyaW5nIG1UeXBlTmFtZTsKQEAgLTEyMSw3ICsxMjEsMTAgQEAKICAgICAgKi8KICAgICBwdWJsaWMgTmV0d29ya0luZm8oaW50IHR5cGUpIHt9CiAKLSAgICBOZXR3b3JrSW5mbyhpbnQgdHlwZSwgaW50IHN1YnR5cGUsIFN0cmluZyB0eXBlTmFtZSwgU3RyaW5nIHN1YnR5cGVOYW1lKSB7CisgICAgLyoqCisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgTmV0d29ya0luZm8oaW50IHR5cGUsIGludCBzdWJ0eXBlLCBTdHJpbmcgdHlwZU5hbWUsIFN0cmluZyBzdWJ0eXBlTmFtZSkgewogICAgICAgICBpZiAoIUNvbm5lY3Rpdml0eU1hbmFnZXIuaXNOZXR3b3JrVHlwZVZhbGlkKHR5cGUpKSB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJJbnZhbGlkIG5ldHdvcmsgdHlwZTogIiArIHR5cGUpOwogICAgICAgICB9CkBAIC0xNDEsNyArMTQ0LDkgQEAKICAgICAgKiBAcmV0dXJuIHRoZSBuZXR3b3JrIHR5cGUKICAgICAgKi8KICAgICBwdWJsaWMgaW50IGdldFR5cGUoKSB7Ci0gICAgICAgIHJldHVybiBtTmV0d29ya1R5cGU7CisgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgeworICAgICAgICAgICAgcmV0dXJuIG1OZXR3b3JrVHlwZTsKKyAgICAgICAgfQogICAgIH0KIAogICAgIC8qKgpAQCAtMTUwLDEyICsxNTUsMTYgQEAKICAgICAgKiBAcmV0dXJuIHRoZSBuZXR3b3JrIHN1YnR5cGUKICAgICAgKi8KICAgICBwdWJsaWMgaW50IGdldFN1YnR5cGUoKSB7Ci0gICAgICAgIHJldHVybiBtU3VidHlwZTsKKyAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7CisgICAgICAgICAgICByZXR1cm4gbVN1YnR5cGU7CisgICAgICAgIH0KICAgICB9CiAKICAgICB2b2lkIHNldFN1YnR5cGUoaW50IHN1YnR5cGUsIFN0cmluZyBzdWJ0eXBlTmFtZSkgewotICAgICAgICBtU3VidHlwZSA9IHN1YnR5cGU7Ci0gICAgICAgIG1TdWJ0eXBlTmFtZSA9IHN1YnR5cGVOYW1lOworICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKKyAgICAgICAgICAgIG1TdWJ0eXBlID0gc3VidHlwZTsKKyAgICAgICAgICAgIG1TdWJ0eXBlTmFtZSA9IHN1YnR5cGVOYW1lOworICAgICAgICB9CiAgICAgfQogCiAgICAgLyoqCkBAIC0xNjQsNyArMTczLDkgQEAKICAgICAgKiBAcmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBuZXR3b3JrIHR5cGUKICAgICAgKi8KICAgICBwdWJsaWMgU3RyaW5nIGdldFR5cGVOYW1lKCkgewotICAgICAgICByZXR1cm4gbVR5cGVOYW1lOworICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKKyAgICAgICAgICAgIHJldHVybiBtVHlwZU5hbWU7CisgICAgICAgIH0KICAgICB9CiAKICAgICAvKioKQEAgLTE3Miw3ICsxODMsOSBAQAogICAgICAqIEByZXR1cm4gdGhlIG5hbWUgb2YgdGhlIG5ldHdvcmsgc3VidHlwZQogICAgICAqLwogICAgIHB1YmxpYyBTdHJpbmcgZ2V0U3VidHlwZU5hbWUoKSB7Ci0gICAgICAgIHJldHVybiBtU3VidHlwZU5hbWU7CisgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgeworICAgICAgICAgICAgcmV0dXJuIG1TdWJ0eXBlTmFtZTsKKyAgICAgICAgfQogICAgIH0KIAogICAgIC8qKgpAQCAtMTg1LDcgKzE5OCw5IEBACiAgICAgICogb2YgYmVpbmcgZXN0YWJsaXNoZWQsIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlLgogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIGlzQ29ubmVjdGVkT3JDb25uZWN0aW5nKCkgewotICAgICAgICByZXR1cm4gbVN0YXRlID09IFN0YXRlLkNPTk5FQ1RFRCB8fCBtU3RhdGUgPT0gU3RhdGUuQ09OTkVDVElORzsKKyAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7CisgICAgICAgICAgICByZXR1cm4gbVN0YXRlID09IFN0YXRlLkNPTk5FQ1RFRCB8fCBtU3RhdGUgPT0gU3RhdGUuQ09OTkVDVElORzsKKyAgICAgICAgfQogICAgIH0KIAogICAgIC8qKgpAQCAtMTk0LDcgKzIwOSw5IEBACiAgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgbmV0d29yayBjb25uZWN0aXZpdHkgZXhpc3RzLCB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZS4KICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiBpc0Nvbm5lY3RlZCgpIHsKLSAgICAgICAgcmV0dXJuIG1TdGF0ZSA9PSBTdGF0ZS5DT05ORUNURUQ7CisgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgeworICAgICAgICAgICAgcmV0dXJuIG1TdGF0ZSA9PSBTdGF0ZS5DT05ORUNURUQ7CisgICAgICAgIH0KICAgICB9CiAKICAgICAvKioKQEAgLTIxMCw3ICsyMjcsOSBAQAogICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoZSBuZXR3b3JrIGlzIGF2YWlsYWJsZSwge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UKICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiBpc0F2YWlsYWJsZSgpIHsKLSAgICAgICAgcmV0dXJuIG1Jc0F2YWlsYWJsZTsKKyAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7CisgICAgICAgICAgICByZXR1cm4gbUlzQXZhaWxhYmxlOworICAgICAgICB9CiAgICAgfQogCiAgICAgLyoqCkBAIC0yMjAsNyArMjM5LDkgQEAKICAgICAgKiBAaGlkZQogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldElzQXZhaWxhYmxlKGJvb2xlYW4gaXNBdmFpbGFibGUpIHsKLSAgICAgICAgbUlzQXZhaWxhYmxlID0gaXNBdmFpbGFibGU7CisgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgeworICAgICAgICAgICAgbUlzQXZhaWxhYmxlID0gaXNBdmFpbGFibGU7CisgICAgICAgIH0KICAgICB9CiAKICAgICAvKioKQEAgLTIzMSw3ICsyNTIsOSBAQAogICAgICAqIG90aGVyd2lzZS4KICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiBpc0ZhaWxvdmVyKCkgewotICAgICAgICByZXR1cm4gbUlzRmFpbG92ZXI7CisgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgeworICAgICAgICAgICAgcmV0dXJuIG1Jc0ZhaWxvdmVyOworICAgICAgICB9CiAgICAgfQogCiAgICAgLyoqCkBAIC0yNDEsNyArMjY0LDkgQEAKICAgICAgKiBAaGlkZQogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldEZhaWxvdmVyKGJvb2xlYW4gaXNGYWlsb3ZlcikgewotICAgICAgICBtSXNGYWlsb3ZlciA9IGlzRmFpbG92ZXI7CisgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgeworICAgICAgICAgICAgbUlzRmFpbG92ZXIgPSBpc0ZhaWxvdmVyOworICAgICAgICB9CiAgICAgfQogCiAgICAgLyoqCkBAIC0yNTEsMTEgKzI3NiwxNSBAQAogICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHJvYW1pbmcgaXMgaW4gZWZmZWN0LCB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZS4KICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiBpc1JvYW1pbmcoKSB7Ci0gICAgICAgIHJldHVybiBtSXNSb2FtaW5nOworICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKKyAgICAgICAgICAgIHJldHVybiBtSXNSb2FtaW5nOworICAgICAgICB9CiAgICAgfQogCiAgICAgdm9pZCBzZXRSb2FtaW5nKGJvb2xlYW4gaXNSb2FtaW5nKSB7Ci0gICAgICAgIG1Jc1JvYW1pbmcgPSBpc1JvYW1pbmc7CisgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgeworICAgICAgICAgICAgbUlzUm9hbWluZyA9IGlzUm9hbWluZzsKKyAgICAgICAgfQogICAgIH0KIAogICAgIC8qKgpAQCAtMjYzLDcgKzI5Miw5IEBACiAgICAgICogQHJldHVybiB0aGUgY29hcnNlLWdyYWluZWQgc3RhdGUKICAgICAgKi8KICAgICBwdWJsaWMgU3RhdGUgZ2V0U3RhdGUoKSB7Ci0gICAgICAgIHJldHVybiBtU3RhdGU7CisgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgeworICAgICAgICAgICAgcmV0dXJuIG1TdGF0ZTsKKyAgICAgICAgfQogICAgIH0KIAogICAgIC8qKgpAQCAtMjcxLDcgKzMwMiw5IEBACiAgICAgICogQHJldHVybiB0aGUgZmluZS1ncmFpbmVkIHN0YXRlCiAgICAgICovCiAgICAgcHVibGljIERldGFpbGVkU3RhdGUgZ2V0RGV0YWlsZWRTdGF0ZSgpIHsKLSAgICAgICAgcmV0dXJuIG1EZXRhaWxlZFN0YXRlOworICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKKyAgICAgICAgICAgIHJldHVybiBtRGV0YWlsZWRTdGF0ZTsKKyAgICAgICAgfQogICAgIH0KIAogICAgIC8qKgpAQCAtMjgxLDEyICszMTQsMTUgQEAKICAgICAgKiBpZiBvbmUgd2FzIHN1cHBsaWVkLiBNYXkgYmUge0Bjb2RlIG51bGx9LgogICAgICAqIEBwYXJhbSBleHRyYUluZm8gYW4gb3B0aW9uYWwge0Bjb2RlIFN0cmluZ30gcHJvdmlkaW5nIGFkZGRpdGlvbmFsIG5ldHdvcmsgc3RhdGUKICAgICAgKiBpbmZvcm1hdGlvbiBwYXNzZWQgdXAgZnJvbSB0aGUgbG93ZXIgbmV0d29ya2luZyBsYXllcnMuCisgICAgICogQGhpZGUKICAgICAgKi8KLSAgICB2b2lkIHNldERldGFpbGVkU3RhdGUoRGV0YWlsZWRTdGF0ZSBkZXRhaWxlZFN0YXRlLCBTdHJpbmcgcmVhc29uLCBTdHJpbmcgZXh0cmFJbmZvKSB7Ci0gICAgICAgIHRoaXMubURldGFpbGVkU3RhdGUgPSBkZXRhaWxlZFN0YXRlOwotICAgICAgICB0aGlzLm1TdGF0ZSA9IHN0YXRlTWFwLmdldChkZXRhaWxlZFN0YXRlKTsKLSAgICAgICAgdGhpcy5tUmVhc29uID0gcmVhc29uOwotICAgICAgICB0aGlzLm1FeHRyYUluZm8gPSBleHRyYUluZm87CisgICAgcHVibGljIHZvaWQgc2V0RGV0YWlsZWRTdGF0ZShEZXRhaWxlZFN0YXRlIGRldGFpbGVkU3RhdGUsIFN0cmluZyByZWFzb24sIFN0cmluZyBleHRyYUluZm8pIHsKKyAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7CisgICAgICAgICAgICB0aGlzLm1EZXRhaWxlZFN0YXRlID0gZGV0YWlsZWRTdGF0ZTsKKyAgICAgICAgICAgIHRoaXMubVN0YXRlID0gc3RhdGVNYXAuZ2V0KGRldGFpbGVkU3RhdGUpOworICAgICAgICAgICAgdGhpcy5tUmVhc29uID0gcmVhc29uOworICAgICAgICAgICAgdGhpcy5tRXh0cmFJbmZvID0gZXh0cmFJbmZvOworICAgICAgICB9CiAgICAgfQogCiAgICAgLyoqCkBAIC0yOTUsNyArMzMxLDkgQEAKICAgICAgKiBAcmV0dXJuIHRoZSByZWFzb24gZm9yIGZhaWx1cmUsIG9yIG51bGwgaWYgbm90IGF2YWlsYWJsZQogICAgICAqLwogICAgIHB1YmxpYyBTdHJpbmcgZ2V0UmVhc29uKCkgewotICAgICAgICByZXR1cm4gbVJlYXNvbjsKKyAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7CisgICAgICAgICAgICByZXR1cm4gbVJlYXNvbjsKKyAgICAgICAgfQogICAgIH0KIAogICAgIC8qKgpAQCAtMzA1LDIwICszNDMsMjQgQEAKICAgICAgKiBAcmV0dXJuIHRoZSBleHRyYSBpbmZvcm1hdGlvbiwgb3IgbnVsbCBpZiBub3QgYXZhaWxhYmxlCiAgICAgICovCiAgICAgcHVibGljIFN0cmluZyBnZXRFeHRyYUluZm8oKSB7Ci0gICAgICAgIHJldHVybiBtRXh0cmFJbmZvOworICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKKyAgICAgICAgICAgIHJldHVybiBtRXh0cmFJbmZvOworICAgICAgICB9CiAgICAgfQogCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAgICAgU3RyaW5nQnVpbGRlciBidWlsZGVyID0gbmV3IFN0cmluZ0J1aWxkZXIoIk5ldHdvcmtJbmZvOiAiKTsKLSAgICAgICAgYnVpbGRlci5hcHBlbmQoInR5cGU6ICIpLmFwcGVuZChnZXRUeXBlTmFtZSgpKS5hcHBlbmQoIlsiKS5hcHBlbmQoZ2V0U3VidHlwZU5hbWUoKSkuCi0gICAgICAgICAgICAgICAgYXBwZW5kKCJdLCBzdGF0ZTogIikuYXBwZW5kKG1TdGF0ZSkuYXBwZW5kKCIvIikuYXBwZW5kKG1EZXRhaWxlZFN0YXRlKS4KLSAgICAgICAgICAgICAgICBhcHBlbmQoIiwgcmVhc29uOiAiKS5hcHBlbmQobVJlYXNvbiA9PSBudWxsID8gIih1bnNwZWNpZmllZCkiIDogbVJlYXNvbikuCi0gICAgICAgICAgICAgICAgYXBwZW5kKCIsIGV4dHJhOiAiKS5hcHBlbmQobUV4dHJhSW5mbyA9PSBudWxsID8gIihub25lKSIgOiBtRXh0cmFJbmZvKS4KLSAgICAgICAgICAgICAgICBhcHBlbmQoIiwgcm9hbWluZzogIikuYXBwZW5kKG1Jc1JvYW1pbmcpLgotICAgICAgICAgICAgICAgIGFwcGVuZCgiLCBmYWlsb3ZlcjogIikuYXBwZW5kKG1Jc0ZhaWxvdmVyKS4KLSAgICAgICAgICAgICAgICBhcHBlbmQoIiwgaXNBdmFpbGFibGU6ICIpLmFwcGVuZChtSXNBdmFpbGFibGUpOwotICAgICAgICByZXR1cm4gYnVpbGRlci50b1N0cmluZygpOworICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKKyAgICAgICAgICAgIFN0cmluZ0J1aWxkZXIgYnVpbGRlciA9IG5ldyBTdHJpbmdCdWlsZGVyKCJOZXR3b3JrSW5mbzogIik7CisgICAgICAgICAgICBidWlsZGVyLmFwcGVuZCgidHlwZTogIikuYXBwZW5kKGdldFR5cGVOYW1lKCkpLmFwcGVuZCgiWyIpLmFwcGVuZChnZXRTdWJ0eXBlTmFtZSgpKS4KKyAgICAgICAgICAgIGFwcGVuZCgiXSwgc3RhdGU6ICIpLmFwcGVuZChtU3RhdGUpLmFwcGVuZCgiLyIpLmFwcGVuZChtRGV0YWlsZWRTdGF0ZSkuCisgICAgICAgICAgICBhcHBlbmQoIiwgcmVhc29uOiAiKS5hcHBlbmQobVJlYXNvbiA9PSBudWxsID8gIih1bnNwZWNpZmllZCkiIDogbVJlYXNvbikuCisgICAgICAgICAgICBhcHBlbmQoIiwgZXh0cmE6ICIpLmFwcGVuZChtRXh0cmFJbmZvID09IG51bGwgPyAiKG5vbmUpIiA6IG1FeHRyYUluZm8pLgorICAgICAgICAgICAgYXBwZW5kKCIsIHJvYW1pbmc6ICIpLmFwcGVuZChtSXNSb2FtaW5nKS4KKyAgICAgICAgICAgIGFwcGVuZCgiLCBmYWlsb3ZlcjogIikuYXBwZW5kKG1Jc0ZhaWxvdmVyKS4KKyAgICAgICAgICAgIGFwcGVuZCgiLCBpc0F2YWlsYWJsZTogIikuYXBwZW5kKG1Jc0F2YWlsYWJsZSk7CisgICAgICAgICAgICByZXR1cm4gYnVpbGRlci50b1N0cmluZygpOworICAgICAgICB9CiAgICAgfQogCiAgICAgLyoqCkBAIC0zMzQsMTcgKzM3NiwxOSBAQAogICAgICAqIEBoaWRlCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgd3JpdGVUb1BhcmNlbChQYXJjZWwgZGVzdCwgaW50IGZsYWdzKSB7Ci0gICAgICAgIGRlc3Qud3JpdGVJbnQobU5ldHdvcmtUeXBlKTsKLSAgICAgICAgZGVzdC53cml0ZUludChtU3VidHlwZSk7Ci0gICAgICAgIGRlc3Qud3JpdGVTdHJpbmcobVR5cGVOYW1lKTsKLSAgICAgICAgZGVzdC53cml0ZVN0cmluZyhtU3VidHlwZU5hbWUpOwotICAgICAgICBkZXN0LndyaXRlU3RyaW5nKG1TdGF0ZS5uYW1lKCkpOwotICAgICAgICBkZXN0LndyaXRlU3RyaW5nKG1EZXRhaWxlZFN0YXRlLm5hbWUoKSk7Ci0gICAgICAgIGRlc3Qud3JpdGVJbnQobUlzRmFpbG92ZXIgPyAxIDogMCk7Ci0gICAgICAgIGRlc3Qud3JpdGVJbnQobUlzQXZhaWxhYmxlID8gMSA6IDApOwotICAgICAgICBkZXN0LndyaXRlSW50KG1Jc1JvYW1pbmcgPyAxIDogMCk7Ci0gICAgICAgIGRlc3Qud3JpdGVTdHJpbmcobVJlYXNvbik7Ci0gICAgICAgIGRlc3Qud3JpdGVTdHJpbmcobUV4dHJhSW5mbyk7CisgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgeworICAgICAgICAgICAgZGVzdC53cml0ZUludChtTmV0d29ya1R5cGUpOworICAgICAgICAgICAgZGVzdC53cml0ZUludChtU3VidHlwZSk7CisgICAgICAgICAgICBkZXN0LndyaXRlU3RyaW5nKG1UeXBlTmFtZSk7CisgICAgICAgICAgICBkZXN0LndyaXRlU3RyaW5nKG1TdWJ0eXBlTmFtZSk7CisgICAgICAgICAgICBkZXN0LndyaXRlU3RyaW5nKG1TdGF0ZS5uYW1lKCkpOworICAgICAgICAgICAgZGVzdC53cml0ZVN0cmluZyhtRGV0YWlsZWRTdGF0ZS5uYW1lKCkpOworICAgICAgICAgICAgZGVzdC53cml0ZUludChtSXNGYWlsb3ZlciA/IDEgOiAwKTsKKyAgICAgICAgICAgIGRlc3Qud3JpdGVJbnQobUlzQXZhaWxhYmxlID8gMSA6IDApOworICAgICAgICAgICAgZGVzdC53cml0ZUludChtSXNSb2FtaW5nID8gMSA6IDApOworICAgICAgICAgICAgZGVzdC53cml0ZVN0cmluZyhtUmVhc29uKTsKKyAgICAgICAgICAgIGRlc3Qud3JpdGVTdHJpbmcobUV4dHJhSW5mbyk7CisgICAgICAgIH0KICAgICB9CiAKICAgICAvKioKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL25ldC9OZXR3b3JrU3RhdGVUcmFja2VyLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9uZXQvTmV0d29ya1N0YXRlVHJhY2tlci5qYXZhCmluZGV4IDA3MDdkZjMuLjU0MjBkOGYgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL25ldC9OZXR3b3JrU3RhdGVUcmFja2VyLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvbmV0L05ldHdvcmtTdGF0ZVRyYWNrZXIuamF2YQpAQCAtMTYsMzcxICsxNiwxMzMgQEAKIAogcGFja2FnZSBhbmRyb2lkLm5ldDsKIAotaW1wb3J0IGphdmEuaW8uRmlsZVdyaXRlcjsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LkluZXRBZGRyZXNzOwotaW1wb3J0IGphdmEubmV0LlVua25vd25Ib3N0RXhjZXB0aW9uOwotCi1pbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyOwotaW1wb3J0IGFuZHJvaWQub3MuTWVzc2FnZTsKLWltcG9ydCBhbmRyb2lkLm9zLlN5c3RlbVByb3BlcnRpZXM7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7Ci1pbXBvcnQgYW5kcm9pZC50ZXh0LlRleHRVdGlsczsKLWltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwotCitpbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyOwogCiAvKioKLSAqIEVhY2ggc3ViY2xhc3Mgb2YgdGhpcyBjbGFzcyBrZWVwcyB0cmFjayBvZiB0aGUgc3RhdGUgb2YgY29ubmVjdGl2aXR5Ci0gKiBvZiBhIG5ldHdvcmsgaW50ZXJmYWNlLiBBbGwgc3RhdGUgaW5mb3JtYXRpb24gZm9yIGEgbmV0d29yayBzaG91bGQKLSAqIGJlIGtlcHQgaW4gYSBUcmFja2VyIGNsYXNzLiBUaGlzIHN1cGVyY2xhc3MgbWFuYWdlcyB0aGUKLSAqIG5ldHdvcmstdHlwZS1pbmRlcGVuZGVudCBhc3BlY3RzIG9mIG5ldHdvcmsgc3RhdGUuCisgKiBJbnRlcmZhY2UgcHJvdmlkZXMgdGhlIHtAbGluayBjb20uYW5kcm9pZC5zZXJ2ZXIuQ29ubmVjdGl2aXR5U2VydmljZX0KKyAqIHdpdGggdGhyZWUgc2VydmljZXMuIEV2ZW50cyB0byB0aGUgQ29ubmVjdGl2aXR5U2VydmljZSB3aGVuCisgKiBjaGFuZ2VzIG9jY3VyLCBhbiBBUEkgZm9yIGNvbnRyb2xsaW5nIHRoZSBuZXR3b3JrIGFuZCBzdG9yYWdlCisgKiBmb3IgbmV0d29yayBzcGVjaWZpYyBpbmZvcm1hdGlvbi4KKyAqCisgKiBUaGUgQ29ubmVjdGl2aXR5IHdpbGwgY2FsbCBzdGFydE1vbml0b3JpbmcgYmVmb3JlIGFueSBvdGhlcgorICogbWV0aG9kIGlzIGNhbGxlZC4KICAqCiAgKiB7QGhpZGV9CiAgKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBOZXR3b3JrU3RhdGVUcmFja2VyIGV4dGVuZHMgSGFuZGxlciB7CitwdWJsaWMgaW50ZXJmYWNlIE5ldHdvcmtTdGF0ZVRyYWNrZXIgewogCi0gICAgcHJvdGVjdGVkIE5ldHdvcmtJbmZvIG1OZXR3b3JrSW5mbzsKLSAgICBwcm90ZWN0ZWQgQ29udGV4dCBtQ29udGV4dDsKLSAgICBwcm90ZWN0ZWQgSGFuZGxlciBtVGFyZ2V0OwotICAgIHByb3RlY3RlZCBTdHJpbmcgbUludGVyZmFjZU5hbWU7Ci0gICAgcHJvdGVjdGVkIFN0cmluZ1tdIG1EbnNQcm9wTmFtZXM7Ci0gICAgcHJpdmF0ZSBib29sZWFuIG1Qcml2YXRlRG5zUm91dGVTZXQ7Ci0gICAgcHJvdGVjdGVkIGludCBtRGVmYXVsdEdhdGV3YXlBZGRyOwotICAgIHByaXZhdGUgYm9vbGVhbiBtVGVhcmRvd25SZXF1ZXN0ZWQ7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIERCRyA9IHRydWU7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJOZXR3b3JrU3RhdGVUcmFja2VyIjsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVWRU5UX1NUQVRFX0NIQU5HRUQgPSAxOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVWRU5UX1NDQU5fUkVTVUxUU19BVkFJTEFCTEUgPSAyOwogICAgIC8qKgotICAgICAqIGFyZzE6IDEgdG8gc2hvdywgMCB0byBoaWRlCi0gICAgICogYXJnMjogSUQgb2YgdGhlIG5vdGlmaWNhdGlvbgotICAgICAqIG9iajogTm90aWZpY2F0aW9uIChpZiBzaG93aW5nKQorICAgICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgKiBFdmVudCBJbnRlcmZhY2UgYmFjayB0byBDb25uZWN0aXZpdHlTZXJ2aWNlLgorICAgICAqCisgICAgICogVGhlIGV2ZW50cyB0aGF0IGFyZSB0byBiZSBzZW50IGJhY2sgdG8gdGhlIEhhbmRsZXIgcGFzc2VkCisgICAgICogdG8gc3RhcnRNb25pdG9yaW5nIHdoZW4gdGhlIHBhcnRpY3VsYXIgZXZlbnQgb2NjdXJzLgorICAgICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFVkVOVF9OT1RJRklDQVRJT05fQ0hBTkdFRCA9IDM7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRVZFTlRfQ09ORklHVVJBVElPTl9DSEFOR0VEID0gNDsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFVkVOVF9ST0FNSU5HX0NIQU5HRUQgPSA1OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVWRU5UX05FVFdPUktfU1VCVFlQRV9DSEFOR0VEID0gNjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFVkVOVF9SRVNUT1JFX0RFRkFVTFRfTkVUV09SSyA9IDc7CisKICAgICAvKioKLSAgICAgKiBhcmcxOiBuZXR3b3JrIHR5cGUKLSAgICAgKiBhcmcyOiBjb25kaXRpb24gKDAgYmFkLCAxMDAgZ29vZCkKKyAgICAgKiBUaGUgbmV0d29yayBzdGF0ZSBoYXMgY2hhbmdlZCBhbmQgdGhlIE5ldHdvcmtJbmZvIG9iamVjdAorICAgICAqIGNvbnRhaW5zIHRoZSBuZXcgc3RhdGUuCisgICAgICoKKyAgICAgKiBtc2cud2hhdCA9IEVWRU5UX1NUQVRFX0NIQU5HRUQKKyAgICAgKiBtc2cub2JqID0gTmV0d29ya0luZm8gb2JqZWN0CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRVZFTlRfU1RBVEVfQ0hBTkdFRCA9IDE7CisKKyAgICAvKioKKyAgICAgKiBtc2cud2hhdCA9IEVWRU5UX0NPTkZJR1VSQVRJT05fQ0hBTkdFRAorICAgICAqIG1zZy5vYmogPSBOZXR3b3JrSW5mbyBvYmplY3QKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFVkVOVF9DT05GSUdVUkFUSU9OX0NIQU5HRUQgPSAzOworCisgICAgLyoqCisgICAgICogbXNnLndoYXQgPSBFVkVOVF9SRVNUT1JFX0RFRkFVTFRfTkVUV09SSworICAgICAqIG1zZy5vYmogPSBGZWF0dXJlVXNlciBvYmplY3QKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFVkVOVF9SRVNUT1JFX0RFRkFVTFRfTkVUV09SSyA9IDY7CisKKyAgICAvKioKKyAgICAgKiBVU0VEIGJ5IENvbm5lY3Rpdml0eVNlcnZpY2Ugb25seQorICAgICAqCisgICAgICogbXNnLndoYXQgPSBFVkVOVF9DTEVBUl9ORVRfVFJBTlNJVElPTl9XQUtFTE9DSworICAgICAqIG1zZy5hcmcxID0gbU5ldFRyYW5zaXRpb25XYWtlTG9ja1NlcmlhbE51bWJlcgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVWRU5UX0NMRUFSX05FVF9UUkFOU0lUSU9OX1dBS0VMT0NLID0gNzsKKworICAgIC8qKgorICAgICAqIG1zZy5hcmcxID0gbmV0d29yayB0eXBlCisgICAgICogbXNnLmFyZzIgPSBjb25kaXRpb24gKDAgYmFkLCAxMDAgZ29vZCkKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFVkVOVF9JTkVUX0NPTkRJVElPTl9DSEFOR0UgPSA4OworCiAgICAgLyoqCi0gICAgICogYXJnMTogbmV0d29yayB0eXBlCisgICAgICogbXNnLmFyZzEgPSBuZXR3b3JrIHR5cGUKKyAgICAgKiBtc2cuYXJnMiA9IGRlZmF1bHQgY29ubmVjdGlvbiBzZXF1ZW5jZSBudW1iZXIKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFVkVOVF9JTkVUX0NPTkRJVElPTl9IT0xEX0VORCA9IDk7CiAKLSAgICBwdWJsaWMgTmV0d29ya1N0YXRlVHJhY2tlcihDb250ZXh0IGNvbnRleHQsCi0gICAgICAgICAgICBIYW5kbGVyIHRhcmdldCwKLSAgICAgICAgICAgIGludCBuZXR3b3JrVHlwZSwKLSAgICAgICAgICAgIGludCBzdWJUeXBlLAotICAgICAgICAgICAgU3RyaW5nIHR5cGVOYW1lLAotICAgICAgICAgICAgU3RyaW5nIHN1YnR5cGVOYW1lKSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgICAgIG1Db250ZXh0ID0gY29udGV4dDsKLSAgICAgICAgbVRhcmdldCA9IHRhcmdldDsKLSAgICAgICAgbVRlYXJkb3duUmVxdWVzdGVkID0gZmFsc2U7CisgICAgLyoqCisgICAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAqIENvbnRyb2wgSW50ZXJmYWNlCisgICAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAqLworICAgIC8qKgorICAgICAqIEJlZ2luIG1vbml0b3JpbmcgZGF0YSBjb25uZWN0aXZpdHkuCisgICAgICoKKyAgICAgKiBUaGlzIGlzIHRoZSBmaXJzdCBtZXRob2QgY2FsbGVkIHdoZW4gdGhpcyBpbnRlcmZhY2UgaXMgdXNlZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb250ZXh0IGlzIHRoZSBjdXJyZW50IEFuZHJvaWQgY29udGV4dAorICAgICAqIEBwYXJhbSB0YXJnZXQgaXMgdGhlIEhhbmRlciB0byB3aGljaCB0byByZXR1cm4gdGhlIGV2ZW50cy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzdGFydE1vbml0b3JpbmcoQ29udGV4dCBjb250ZXh0LCBIYW5kbGVyIHRhcmdldCk7CiAKLSAgICAgICAgdGhpcy5tTmV0d29ya0luZm8gPSBuZXcgTmV0d29ya0luZm8obmV0d29ya1R5cGUsIHN1YlR5cGUsIHR5cGVOYW1lLCBzdWJ0eXBlTmFtZSk7Ci0gICAgfQorICAgIC8qKgorICAgICAqIEZldGNoIE5ldHdvcmtJbmZvIGZvciB0aGUgbmV0d29yaworICAgICAqLworICAgIHB1YmxpYyBOZXR3b3JrSW5mbyBnZXROZXR3b3JrSW5mbygpOwogCi0gICAgcHVibGljIE5ldHdvcmtJbmZvIGdldE5ldHdvcmtJbmZvKCkgewotICAgICAgICByZXR1cm4gbU5ldHdvcmtJbmZvOwotICAgIH0KKyAgICAvKioKKyAgICAgKiBGZXRjaCBMaW5rUHJvcGVydGllcyBmb3IgdGhlIG5ldHdvcmsKKyAgICAgKi8KKyAgICBwdWJsaWMgTGlua1Byb3BlcnRpZXMgZ2V0TGlua1Byb3BlcnRpZXMoKTsKIAogICAgIC8qKgogICAgICAqIFJldHVybiB0aGUgc3lzdGVtIHByb3BlcnRpZXMgbmFtZSBhc3NvY2lhdGVkIHdpdGggdGhlIHRjcCBidWZmZXIgc2l6ZXMKICAgICAgKiBmb3IgdGhpcyBuZXR3b3JrLgogICAgICAqLwotICAgIHB1YmxpYyBhYnN0cmFjdCBTdHJpbmcgZ2V0VGNwQnVmZmVyU2l6ZXNQcm9wTmFtZSgpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJuIHRoZSBJUCBhZGRyZXNzZXMgb2YgdGhlIEROUyBzZXJ2ZXJzIGF2YWlsYWJsZSBmb3IgdGhlIG1vYmlsZSBkYXRhCi0gICAgICogbmV0d29yayBpbnRlcmZhY2UuCi0gICAgICogQHJldHVybiBhIGxpc3Qgb2YgRE5TIGFkZHJlc3Nlcywgd2l0aCBubyBob2xlcy4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nW10gZ2V0TmFtZVNlcnZlcnMoKSB7Ci0gICAgICAgIHJldHVybiBnZXROYW1lU2VydmVyTGlzdChtRG5zUHJvcE5hbWVzKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm4gdGhlIElQIGFkZHJlc3NlcyBvZiB0aGUgRE5TIHNlcnZlcnMgYXZhaWxhYmxlIGZvciB0aGlzCi0gICAgICogbmV0d29yayBpbnRlcmZhY2UuCi0gICAgICogQHBhcmFtIHByb3BlcnR5TmFtZXMgdGhlIG5hbWVzIG9mIHRoZSBzeXN0ZW0gcHJvcGVydGllcyB3aG9zZSB2YWx1ZXMKLSAgICAgKiBnaXZlIHRoZSBJUCBhZGRyZXNzZXMuIFByb3BlcnRpZXMgd2l0aCBubyB2YWx1ZXMgYXJlIHNraXBwZWQuCi0gICAgICogQHJldHVybiBhbiBhcnJheSBvZiB7QGNvZGUgU3RyaW5nfXMgY29udGFpbmluZyB0aGUgSVAgYWRkcmVzc2VzCi0gICAgICogb2YgdGhlIEROUyBzZXJ2ZXJzLCBpbiBkb3Qtbm90YXRpb24uIFRoaXMgbWF5IGhhdmUgZmV3ZXIKLSAgICAgKiBub24tbnVsbCBlbnRyaWVzIHRoYW4gdGhlIGxpc3Qgb2YgbmFtZXMgcGFzc2VkIGluLCBzaW5jZQotICAgICAqIHNvbWUgb2YgdGhlIHBhc3NlZC1pbiBuYW1lcyBtYXkgaGF2ZSBlbXB0eSB2YWx1ZXMuCi0gICAgICovCi0gICAgc3RhdGljIHByb3RlY3RlZCBTdHJpbmdbXSBnZXROYW1lU2VydmVyTGlzdChTdHJpbmdbXSBwcm9wZXJ0eU5hbWVzKSB7Ci0gICAgICAgIFN0cmluZ1tdIGRuc0FkZHJlc3NlcyA9IG5ldyBTdHJpbmdbcHJvcGVydHlOYW1lcy5sZW5ndGhdOwotICAgICAgICBpbnQgaSwgajsKLQotICAgICAgICBmb3IgKGkgPSAwLCBqID0gMDsgaSA8IHByb3BlcnR5TmFtZXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIFN0cmluZyB2YWx1ZSA9IFN5c3RlbVByb3BlcnRpZXMuZ2V0KHByb3BlcnR5TmFtZXNbaV0pOwotICAgICAgICAgICAgLy8gVGhlIEdTTSBsYXllciBzb21ldGltZXMgc2V0cyBhIGJvZ3VzIEROUyBzZXJ2ZXIgYWRkcmVzcyBvZgotICAgICAgICAgICAgLy8gMC4wLjAuMAotICAgICAgICAgICAgaWYgKCFUZXh0VXRpbHMuaXNFbXB0eSh2YWx1ZSkgJiYgIVRleHRVdGlscy5lcXVhbHModmFsdWUsICIwLjAuMC4wIikpIHsKLSAgICAgICAgICAgICAgICBkbnNBZGRyZXNzZXNbaisrXSA9IHZhbHVlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBkbnNBZGRyZXNzZXM7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYWRkUHJpdmF0ZURuc1JvdXRlcygpIHsKLSAgICAgICAgaWYgKERCRykgewotICAgICAgICAgICAgTG9nLmQoVEFHLCAiYWRkUHJpdmF0ZURuc1JvdXRlcyBmb3IgIiArIHRoaXMgKwotICAgICAgICAgICAgICAgICAgICAiKCIgKyBtSW50ZXJmYWNlTmFtZSArICIpIC0gbVByaXZhdGVEbnNSb3V0ZVNldCA9ICIrbVByaXZhdGVEbnNSb3V0ZVNldCk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG1JbnRlcmZhY2VOYW1lICE9IG51bGwgJiYgIW1Qcml2YXRlRG5zUm91dGVTZXQpIHsKLSAgICAgICAgICAgIGZvciAoU3RyaW5nIGFkZHJTdHJpbmcgOiBnZXROYW1lU2VydmVycygpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGFkZHJTdHJpbmcgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAgICAgSW5ldEFkZHJlc3MgaW5ldEFkZHJlc3MgPSBJbmV0QWRkcmVzcy5nZXRCeU5hbWUoYWRkclN0cmluZyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoREJHKSBMb2cuZChUQUcsICIgIGFkZGluZyAiICsgYWRkclN0cmluZyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoTmV0d29ya1V0aWxzLmFkZEhvc3RSb3V0ZShtSW50ZXJmYWNlTmFtZSwgaW5ldEFkZHJlc3MsIG51bGwpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbVByaXZhdGVEbnNSb3V0ZVNldCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFVua25vd25Ib3N0RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChEQkcpIExvZy5kKFRBRywgIiBETlMgYWRkcmVzcyAiICsgYWRkclN0cmluZyArICIgOiBFeGNlcHRpb24gIiArIGUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcmVtb3ZlUHJpdmF0ZURuc1JvdXRlcygpIHsKLSAgICAgICAgLy8gVE9ETyAtIHdlIHNob3VsZCBkbyB0aGlzIGV4cGxpY2l0bHkgYnV0IHRoZSBOZXRVdGlscyBhcGkgZG9lc250Ci0gICAgICAgIC8vIHN1cHBvcnQgdGhpcyB5ZXQgLSBtdXN0IHJlbW92ZSBhbGwuICBObyB3b3JzZSB0aGFuIGJlZm9yZQotICAgICAgICBpZiAobUludGVyZmFjZU5hbWUgIT0gbnVsbCAmJiBtUHJpdmF0ZURuc1JvdXRlU2V0KSB7Ci0gICAgICAgICAgICBpZiAoREJHKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAicmVtb3ZlUHJpdmF0ZURuc1JvdXRlcyBmb3IgIiArIG1OZXR3b3JrSW5mby5nZXRUeXBlTmFtZSgpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICIgKCIgKyBtSW50ZXJmYWNlTmFtZSArICIpIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBOZXR3b3JrVXRpbHMucmVtb3ZlSG9zdFJvdXRlcyhtSW50ZXJmYWNlTmFtZSk7Ci0gICAgICAgICAgICBtUHJpdmF0ZURuc1JvdXRlU2V0ID0gZmFsc2U7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBhZGREZWZhdWx0Um91dGUoKSB7Ci0gICAgICAgIGlmICgobUludGVyZmFjZU5hbWUgIT0gbnVsbCkgJiYgKG1EZWZhdWx0R2F0ZXdheUFkZHIgIT0gMCkpIHsKLSAgICAgICAgICAgIGlmIChEQkcpIHsKLSAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJhZGREZWZhdWx0Um91dGUgZm9yICIgKyBtTmV0d29ya0luZm8uZ2V0VHlwZU5hbWUoKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAiICgiICsgbUludGVyZmFjZU5hbWUgKyAiKSwgR2F0ZXdheUFkZHI9IiArIG1EZWZhdWx0R2F0ZXdheUFkZHIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgSW5ldEFkZHJlc3MgaW5ldEFkZHJlc3MgPSBOZXR3b3JrVXRpbHMuaW50VG9JbmV0QWRkcmVzcyhtRGVmYXVsdEdhdGV3YXlBZGRyKTsKLSAgICAgICAgICAgIGlmIChpbmV0QWRkcmVzcyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgaWYgKERCRykgTG9nLmQoVEFHLCAiIFVuYWJsZSB0byBhZGQgZGVmYXVsdCByb3V0ZS4gbURlZmF1bHRHYXRld2F5QWRkciBFcnJvciIpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBpZiAoIU5ldHdvcmtVdGlscy5hZGREZWZhdWx0Um91dGUobUludGVyZmFjZU5hbWUsIGluZXRBZGRyZXNzKSAmJiBEQkcpIHsKLSAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiICBVbmFibGUgdG8gYWRkIGRlZmF1bHQgcm91dGUuIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcmVtb3ZlRGVmYXVsdFJvdXRlKCkgewotICAgICAgICBpZiAobUludGVyZmFjZU5hbWUgIT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKERCRykgewotICAgICAgICAgICAgICAgIExvZy5kKFRBRywgInJlbW92ZURlZmF1bHRSb3V0ZSBmb3IgIiArIG1OZXR3b3JrSW5mby5nZXRUeXBlTmFtZSgpICsgIiAoIiArCi0gICAgICAgICAgICAgICAgICAgICAgICBtSW50ZXJmYWNlTmFtZSArICIpIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBOZXR3b3JrVXRpbHMucmVtb3ZlRGVmYXVsdFJvdXRlKG1JbnRlcmZhY2VOYW1lKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJlYWRzIHRoZSBuZXR3b3JrIHNwZWNpZmljIFRDUCBidWZmZXIgc2l6ZXMgZnJvbSBTeXN0ZW1Qcm9wZXJ0aWVzCi0gICAgICogbmV0LnRjcC5idWZmZXJzaXplLltkZWZhdWx0fHdpZml8dW10c3xlZGdlfGdwcnNdIGFuZCBzZXQgdGhlbSBmb3Igc3lzdGVtCi0gICAgICogd2lkZSB1c2UKLSAgICAgKi8KLSAgIHB1YmxpYyB2b2lkIHVwZGF0ZU5ldHdvcmtTZXR0aW5ncygpIHsKLSAgICAgICAgU3RyaW5nIGtleSA9IGdldFRjcEJ1ZmZlclNpemVzUHJvcE5hbWUoKTsKLSAgICAgICAgU3RyaW5nIGJ1ZmZlclNpemVzID0gU3lzdGVtUHJvcGVydGllcy5nZXQoa2V5KTsKLQotICAgICAgICBpZiAoYnVmZmVyU2l6ZXMubGVuZ3RoKCkgPT0gMCkgewotICAgICAgICAgICAgTG9nLmUoVEFHLCBrZXkgKyAiIG5vdCBmb3VuZCBpbiBzeXN0ZW0gcHJvcGVydGllcy4gVXNpbmcgZGVmYXVsdHMiKTsKLQotICAgICAgICAgICAgLy8gU2V0dGluZyB0byBkZWZhdWx0IHZhbHVlcyBzbyB3ZSB3b24ndCBiZSBzdHVjayB0byBwcmV2aW91cyB2YWx1ZXMKLSAgICAgICAgICAgIGtleSA9ICJuZXQudGNwLmJ1ZmZlcnNpemUuZGVmYXVsdCI7Ci0gICAgICAgICAgICBidWZmZXJTaXplcyA9IFN5c3RlbVByb3BlcnRpZXMuZ2V0KGtleSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBTZXQgdmFsdWVzIGluIGtlcm5lbAotICAgICAgICBpZiAoYnVmZmVyU2l6ZXMubGVuZ3RoKCkgIT0gMCkgewotICAgICAgICAgICAgaWYgKERCRykgewotICAgICAgICAgICAgICAgIExvZy52KFRBRywgIlNldHRpbmcgVENQIHZhbHVlczogWyIgKyBidWZmZXJTaXplcwotICAgICAgICAgICAgICAgICAgICAgICAgKyAiXSB3aGljaCBjb21lcyBmcm9tIFsiICsga2V5ICsgIl0iKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNldEJ1ZmZlclNpemUoYnVmZmVyU2l6ZXMpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVsZWFzZSB0aGUgd2FrZWxvY2ssIGlmIGFueSwgdGhhdCBtYXkgYmUgaGVsZCB3aGlsZSBoYW5kbGluZyBhCi0gICAgICogZGlzY29ubmVjdCBvcGVyYXRpb24uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcmVsZWFzZVdha2VMb2NrKCkgewotICAgIH0KLQotICAgIC8qKgotICAgICAqIFdyaXRlcyBUQ1AgYnVmZmVyIHNpemVzIHRvIC9zeXMva2VybmVsL2lwdjQvdGNwX1tyL3ddbWVtX1ttaW4vZGVmL21heF0KLSAgICAgKiB3aGljaCBtYXBzIHRvIC9wcm9jL3N5cy9uZXQvaXB2NC90Y3Bfcm1lbSBhbmQgdGNwd21lbQotICAgICAqIAotICAgICAqIEBwYXJhbSBidWZmZXJTaXplcyBpbiB0aGUgZm9ybWF0IG9mICJyZWFkTWluLCByZWFkSW5pdGlhbCwgcmVhZE1heCwKLSAgICAgKiAgICAgICAgd3JpdGVNaW4sIHdyaXRlSW5pdGlhbCwgd3JpdGVNYXgiCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHNldEJ1ZmZlclNpemUoU3RyaW5nIGJ1ZmZlclNpemVzKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBTdHJpbmdbXSB2YWx1ZXMgPSBidWZmZXJTaXplcy5zcGxpdCgiLCIpOwotCi0gICAgICAgICAgICBpZiAodmFsdWVzLmxlbmd0aCA9PSA2KSB7Ci0gICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBwcmVmaXggPSAiL3N5cy9rZXJuZWwvaXB2NC90Y3BfIjsKLSAgICAgICAgICAgICAgICBzdHJpbmdUb0ZpbGUocHJlZml4ICsgInJtZW1fbWluIiwgdmFsdWVzWzBdKTsKLSAgICAgICAgICAgICAgICBzdHJpbmdUb0ZpbGUocHJlZml4ICsgInJtZW1fZGVmIiwgdmFsdWVzWzFdKTsKLSAgICAgICAgICAgICAgICBzdHJpbmdUb0ZpbGUocHJlZml4ICsgInJtZW1fbWF4IiwgdmFsdWVzWzJdKTsKLSAgICAgICAgICAgICAgICBzdHJpbmdUb0ZpbGUocHJlZml4ICsgIndtZW1fbWluIiwgdmFsdWVzWzNdKTsKLSAgICAgICAgICAgICAgICBzdHJpbmdUb0ZpbGUocHJlZml4ICsgIndtZW1fZGVmIiwgdmFsdWVzWzRdKTsKLSAgICAgICAgICAgICAgICBzdHJpbmdUb0ZpbGUocHJlZml4ICsgIndtZW1fbWF4IiwgdmFsdWVzWzVdKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAiSW52YWxpZCBidWZmZXJzaXplIHN0cmluZzogIiArIGJ1ZmZlclNpemVzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgTG9nLmUoVEFHLCAiQ2FuJ3Qgc2V0IHRjcCBidWZmZXIgc2l6ZXM6IiArIGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogV3JpdGVzIHN0cmluZyB0byBmaWxlLiBCYXNpY2FsbHkgc2FtZSBhcyAiZWNobyAtbiAkc3RyaW5nID4gJGZpbGVuYW1lIgotICAgICAqIAotICAgICAqIEBwYXJhbSBmaWxlbmFtZQotICAgICAqIEBwYXJhbSBzdHJpbmcKLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHN0cmluZ1RvRmlsZShTdHJpbmcgZmlsZW5hbWUsIFN0cmluZyBzdHJpbmcpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIEZpbGVXcml0ZXIgb3V0ID0gbmV3IEZpbGVXcml0ZXIoZmlsZW5hbWUpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgb3V0LndyaXRlKHN0cmluZyk7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBvdXQuY2xvc2UoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJlY29yZCB0aGUgZGV0YWlsZWQgc3RhdGUgb2YgYSBuZXR3b3JrLCBhbmQgaWYgaXQgaXMgYQotICAgICAqIGNoYW5nZSBmcm9tIHRoZSBwcmV2aW91cyBzdGF0ZSwgc2VuZCBhIG5vdGlmaWNhdGlvbiB0bwotICAgICAqIGFueSBsaXN0ZW5lcnMuCi0gICAgICogQHBhcmFtIHN0YXRlIHRoZSBuZXcgQHtjb2RlIERldGFpbGVkU3RhdGV9Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0RGV0YWlsZWRTdGF0ZShOZXR3b3JrSW5mby5EZXRhaWxlZFN0YXRlIHN0YXRlKSB7Ci0gICAgICAgIHNldERldGFpbGVkU3RhdGUoc3RhdGUsIG51bGwsIG51bGwpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJlY29yZCB0aGUgZGV0YWlsZWQgc3RhdGUgb2YgYSBuZXR3b3JrLCBhbmQgaWYgaXQgaXMgYQotICAgICAqIGNoYW5nZSBmcm9tIHRoZSBwcmV2aW91cyBzdGF0ZSwgc2VuZCBhIG5vdGlmaWNhdGlvbiB0bwotICAgICAqIGFueSBsaXN0ZW5lcnMuCi0gICAgICogQHBhcmFtIHN0YXRlIHRoZSBuZXcgQHtjb2RlIERldGFpbGVkU3RhdGV9Ci0gICAgICogQHBhcmFtIHJlYXNvbiBhIHtAY29kZSBTdHJpbmd9IGluZGljYXRpbmcgYSByZWFzb24gZm9yIHRoZSBzdGF0ZSBjaGFuZ2UsCi0gICAgICogaWYgb25lIHdhcyBzdXBwbGllZC4gTWF5IGJlIHtAY29kZSBudWxsfS4KLSAgICAgKiBAcGFyYW0gZXh0cmFJbmZvIG9wdGlvbmFsIHtAY29kZSBTdHJpbmd9IHByb3ZpZGluZyBleHRyYSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgc3RhdGUgY2hhbmdlCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0RGV0YWlsZWRTdGF0ZShOZXR3b3JrSW5mby5EZXRhaWxlZFN0YXRlIHN0YXRlLCBTdHJpbmcgcmVhc29uLCBTdHJpbmcgZXh0cmFJbmZvKSB7Ci0gICAgICAgIGlmIChEQkcpIExvZy5kKFRBRywgInNldERldGFpbGVkIHN0YXRlLCBvbGQgPSIrbU5ldHdvcmtJbmZvLmdldERldGFpbGVkU3RhdGUoKSsiIGFuZCBuZXcgc3RhdGU9IitzdGF0ZSk7Ci0gICAgICAgIGlmIChzdGF0ZSAhPSBtTmV0d29ya0luZm8uZ2V0RGV0YWlsZWRTdGF0ZSgpKSB7Ci0gICAgICAgICAgICBib29sZWFuIHdhc0Nvbm5lY3RpbmcgPSAobU5ldHdvcmtJbmZvLmdldFN0YXRlKCkgPT0gTmV0d29ya0luZm8uU3RhdGUuQ09OTkVDVElORyk7Ci0gICAgICAgICAgICBTdHJpbmcgbGFzdFJlYXNvbiA9IG1OZXR3b3JrSW5mby5nZXRSZWFzb24oKTsKLSAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgKiBJZiBhIHJlYXNvbiB3YXMgc3VwcGxpZWQgd2hlbiB0aGUgQ09OTkVDVElORyBzdGF0ZSB3YXMgZW50ZXJlZCwgYW5kIG5vCi0gICAgICAgICAgICAgKiByZWFzb24gd2FzIHN1cHBsaWVkIGZvciBlbnRlcmluZyB0aGUgQ09OTkVDVEVEIHN0YXRlLCB0aGVuIHJldGFpbiB0aGUKLSAgICAgICAgICAgICAqIHJlYXNvbiB0aGF0IHdhcyBzdXBwbGllZCB3aGVuIGdvaW5nIHRvIENPTk5FQ1RJTkcuCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIGlmICh3YXNDb25uZWN0aW5nICYmIHN0YXRlID09IE5ldHdvcmtJbmZvLkRldGFpbGVkU3RhdGUuQ09OTkVDVEVEICYmIHJlYXNvbiA9PSBudWxsCi0gICAgICAgICAgICAgICAgICAgICYmIGxhc3RSZWFzb24gIT0gbnVsbCkKLSAgICAgICAgICAgICAgICByZWFzb24gPSBsYXN0UmVhc29uOwotICAgICAgICAgICAgbU5ldHdvcmtJbmZvLnNldERldGFpbGVkU3RhdGUoc3RhdGUsIHJlYXNvbiwgZXh0cmFJbmZvKTsKLSAgICAgICAgICAgIE1lc3NhZ2UgbXNnID0gbVRhcmdldC5vYnRhaW5NZXNzYWdlKEVWRU5UX1NUQVRFX0NIQU5HRUQsIG1OZXR3b3JrSW5mbyk7Ci0gICAgICAgICAgICBtc2cuc2VuZFRvVGFyZ2V0KCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXREZXRhaWxlZFN0YXRlSW50ZXJuYWwoTmV0d29ya0luZm8uRGV0YWlsZWRTdGF0ZSBzdGF0ZSkgewotICAgICAgICBtTmV0d29ya0luZm8uc2V0RGV0YWlsZWRTdGF0ZShzdGF0ZSwgbnVsbCwgbnVsbCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0VGVhcmRvd25SZXF1ZXN0ZWQoYm9vbGVhbiBpc1JlcXVlc3RlZCkgewotICAgICAgICBtVGVhcmRvd25SZXF1ZXN0ZWQgPSBpc1JlcXVlc3RlZDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1RlYXJkb3duUmVxdWVzdGVkKCkgewotICAgICAgICByZXR1cm4gbVRlYXJkb3duUmVxdWVzdGVkOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBTZW5kIGEgIG5vdGlmaWNhdGlvbiB0aGF0IHRoZSByZXN1bHRzIG9mIGEgc2NhbiBmb3IgbmV0d29yayBhY2Nlc3MKLSAgICAgKiBwb2ludHMgaGFzIGNvbXBsZXRlZCwgYW5kIHJlc3VsdHMgYXJlIGF2YWlsYWJsZS4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZW5kU2NhblJlc3VsdHNBdmFpbGFibGUoKSB7Ci0gICAgICAgIE1lc3NhZ2UgbXNnID0gbVRhcmdldC5vYnRhaW5NZXNzYWdlKEVWRU5UX1NDQU5fUkVTVUxUU19BVkFJTEFCTEUsIG1OZXR3b3JrSW5mbyk7Ci0gICAgICAgIG1zZy5zZW5kVG9UYXJnZXQoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZWNvcmQgdGhlIHJvYW1pbmcgc3RhdHVzIG9mIHRoZSBkZXZpY2UsIGFuZCBpZiBpdCBpcyBhIGNoYW5nZSBmcm9tIHRoZSBwcmV2aW91cwotICAgICAqIHN0YXR1cywgc2VuZCBhIG5vdGlmaWNhdGlvbiB0byBhbnkgbGlzdGVuZXJzLgotICAgICAqIEBwYXJhbSBpc1JvYW1pbmcge0Bjb2RlIHRydWV9IGlmIHRoZSBkZXZpY2UgaXMgbm93IHJvYW1pbmcsIHtAY29kZSBmYWxzZX0KLSAgICAgKiBpZiBpdCBpcyBubyBsb25nZXIgcm9hbWluZy4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRSb2FtaW5nU3RhdHVzKGJvb2xlYW4gaXNSb2FtaW5nKSB7Ci0gICAgICAgIGlmIChpc1JvYW1pbmcgIT0gbU5ldHdvcmtJbmZvLmlzUm9hbWluZygpKSB7Ci0gICAgICAgICAgICBtTmV0d29ya0luZm8uc2V0Um9hbWluZyhpc1JvYW1pbmcpOwotICAgICAgICAgICAgTWVzc2FnZSBtc2cgPSBtVGFyZ2V0Lm9idGFpbk1lc3NhZ2UoRVZFTlRfUk9BTUlOR19DSEFOR0VELCBtTmV0d29ya0luZm8pOwotICAgICAgICAgICAgbXNnLnNlbmRUb1RhcmdldCgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0U3VidHlwZShpbnQgc3VidHlwZSwgU3RyaW5nIHN1YnR5cGVOYW1lKSB7Ci0gICAgICAgIGlmIChtTmV0d29ya0luZm8uaXNDb25uZWN0ZWQoKSkgewotICAgICAgICAgICAgaW50IG9sZFN1YnR5cGUgPSBtTmV0d29ya0luZm8uZ2V0U3VidHlwZSgpOwotICAgICAgICAgICAgaWYgKHN1YnR5cGUgIT0gb2xkU3VidHlwZSkgewotICAgICAgICAgICAgICAgIG1OZXR3b3JrSW5mby5zZXRTdWJ0eXBlKHN1YnR5cGUsIHN1YnR5cGVOYW1lKTsKLSAgICAgICAgICAgICAgICBNZXNzYWdlIG1zZyA9IG1UYXJnZXQub2J0YWluTWVzc2FnZSgKLSAgICAgICAgICAgICAgICAgICAgICAgIEVWRU5UX05FVFdPUktfU1VCVFlQRV9DSEFOR0VELCBvbGRTdWJ0eXBlLCAwLCBtTmV0d29ya0luZm8pOwotICAgICAgICAgICAgICAgIG1zZy5zZW5kVG9UYXJnZXQoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHN0YXJ0TW9uaXRvcmluZygpOworICAgIHB1YmxpYyBTdHJpbmcgZ2V0VGNwQnVmZmVyU2l6ZXNQcm9wTmFtZSgpOwogCiAgICAgLyoqCiAgICAgICogRGlzYWJsZSBjb25uZWN0aXZpdHkgdG8gYSBuZXR3b3JrCiAgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgYSB0ZWFyZG93biBvY2N1cnJlZCwge0Bjb2RlIGZhbHNlfSBpZiB0aGUKICAgICAgKiB0ZWFyZG93biBkaWQgbm90IG9jY3VyLgogICAgICAqLwotICAgIHB1YmxpYyBhYnN0cmFjdCBib29sZWFuIHRlYXJkb3duKCk7CisgICAgcHVibGljIGJvb2xlYW4gdGVhcmRvd24oKTsKIAogICAgIC8qKgogICAgICAqIFJlZW5hYmxlIGNvbm5lY3Rpdml0eSB0byBhIG5ldHdvcmsgYWZ0ZXIgYSB7QGxpbmsgI3RlYXJkb3duKCl9LgorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHdlJ3JlIGNvbm5lY3RlZCBvciBleHBlY3QgdG8gYmUgY29ubmVjdGVkCiAgICAgICovCi0gICAgcHVibGljIGFic3RyYWN0IGJvb2xlYW4gcmVjb25uZWN0KCk7CisgICAgcHVibGljIGJvb2xlYW4gcmVjb25uZWN0KCk7CiAKICAgICAvKioKICAgICAgKiBUdXJuIHRoZSB3aXJlbGVzcyByYWRpbyBvZmYgZm9yIGEgbmV0d29yay4KICAgICAgKiBAcGFyYW0gdHVybk9uIHtAY29kZSB0cnVlfSB0byB0dXJuIHRoZSByYWRpbyBvbiwge0Bjb2RlIGZhbHNlfQogICAgICAqLwotICAgIHB1YmxpYyBhYnN0cmFjdCBib29sZWFuIHNldFJhZGlvKGJvb2xlYW4gdHVybk9uKTsKKyAgICBwdWJsaWMgYm9vbGVhbiBzZXRSYWRpbyhib29sZWFuIHR1cm5Pbik7CiAKICAgICAvKioKICAgICAgKiBSZXR1cm5zIGFuIGluZGljYXRpb24gb2Ygd2hldGhlciB0aGlzIG5ldHdvcmsgaXMgYXZhaWxhYmxlIGZvcgogICAgICAqIGNvbm5lY3Rpb25zLiBBIHZhbHVlIG9mIHtAY29kZSBmYWxzZX0gbWVhbnMgdGhhdCBzb21lIHF1YXNpLXBlcm1hbmVudAogICAgICAqIGNvbmRpdGlvbiBwcmV2ZW50cyBjb25uZWN0aXZpdHkgdG8gdGhpcyBuZXR3b3JrLgogICAgICAqLwotICAgIHB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGlzQXZhaWxhYmxlKCk7CisgICAgcHVibGljIGJvb2xlYW4gaXNBdmFpbGFibGUoKTsKKworICAgIC8qKgorICAgICAqIEZldGNoIGRlZmF1bHQgZ2F0ZXdheSBhZGRyZXNzIGZvciB0aGUgbmV0d29yaworICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0RGVmYXVsdEdhdGV3YXlBZGRyKCk7CiAKICAgICAvKioKICAgICAgKiBUZWxscyB0aGUgdW5kZXJseWluZyBuZXR3b3JraW5nIHN5c3RlbSB0aGF0IHRoZSBjYWxsZXIgd2FudHMgdG8KQEAgLTM5NCw3ICsxNTYsNyBAQAogICAgICAqIGltcGxlbWVudGF0aW9uK2ZlYXR1cmUgY29tYmluYXRpb24sIGV4Y2VwdCB0aGF0IHRoZSB2YWx1ZSB7QGNvZGUgLTF9CiAgICAgICogYWx3YXlzIGluZGljYXRlcyBmYWlsdXJlLgogICAgICAqLwotICAgIHB1YmxpYyBhYnN0cmFjdCBpbnQgc3RhcnRVc2luZ05ldHdvcmtGZWF0dXJlKFN0cmluZyBmZWF0dXJlLCBpbnQgY2FsbGluZ1BpZCwgaW50IGNhbGxpbmdVaWQpOworICAgIHB1YmxpYyBpbnQgc3RhcnRVc2luZ05ldHdvcmtGZWF0dXJlKFN0cmluZyBmZWF0dXJlLCBpbnQgY2FsbGluZ1BpZCwgaW50IGNhbGxpbmdVaWQpOwogCiAgICAgLyoqCiAgICAgICogVGVsbHMgdGhlIHVuZGVybHlpbmcgbmV0d29ya2luZyBzeXN0ZW0gdGhhdCB0aGUgY2FsbGVyIGlzIGZpbmlzaGVkCkBAIC00MDgsMjMgKzE3MCw0MyBAQAogICAgICAqIGltcGxlbWVudGF0aW9uK2ZlYXR1cmUgY29tYmluYXRpb24sIGV4Y2VwdCB0aGF0IHRoZSB2YWx1ZSB7QGNvZGUgLTF9CiAgICAgICogYWx3YXlzIGluZGljYXRlcyBmYWlsdXJlLgogICAgICAqLwotICAgIHB1YmxpYyBhYnN0cmFjdCBpbnQgc3RvcFVzaW5nTmV0d29ya0ZlYXR1cmUoU3RyaW5nIGZlYXR1cmUsIGludCBjYWxsaW5nUGlkLCBpbnQgY2FsbGluZ1VpZCk7CisgICAgcHVibGljIGludCBzdG9wVXNpbmdOZXR3b3JrRmVhdHVyZShTdHJpbmcgZmVhdHVyZSwgaW50IGNhbGxpbmdQaWQsIGludCBjYWxsaW5nVWlkKTsKIAogICAgIC8qKgotICAgICAqIEVuc3VyZSB0aGF0IGEgbmV0d29yayByb3V0ZSBleGlzdHMgdG8gZGVsaXZlciB0cmFmZmljIHRvIHRoZSBzcGVjaWZpZWQKLSAgICAgKiBob3N0IHZpYSB0aGlzIG5ldHdvcmsgaW50ZXJmYWNlLgotICAgICAqIEBwYXJhbSBob3N0QWRkcmVzcyB0aGUgSVAgYWRkcmVzcyBvZiB0aGUgaG9zdCB0byB3aGljaCB0aGUgcm91dGUgaXMgZGVzaXJlZAotICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IG9uIHN1Y2Nlc3MsIHtAY29kZSBmYWxzZX0gb24gZmFpbHVyZQorICAgICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgKiBTdG9yYWdlIEFQSSB1c2VkIGJ5IENvbm5lY3Rpdml0eVNlcnZpY2UgZm9yIHNhdmluZworICAgICAqIE5ldHdvcmsgc3BlY2lmaWMgaW5mb3JtYXRpb24uCisgICAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIHJlcXVlc3RSb3V0ZVRvSG9zdChJbmV0QWRkcmVzcyBob3N0QWRkcmVzcykgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQogCiAgICAgLyoqCi0gICAgICogSW50ZXJwcmV0cyBzY2FuIHJlc3VsdHMuIFRoaXMgd2lsbCBiZSBjYWxsZWQgYXQgYSBzYWZlIHRpbWUgZm9yCi0gICAgICogcHJvY2Vzc2luZywgYW5kIGZyb20gYSBzYWZlIHRocmVhZC4KKyAgICAgKiBDaGVjayBpZiBwcml2YXRlIEROUyByb3V0ZSBpcyBzZXQgZm9yIHRoZSBuZXR3b3JrCiAgICAgICovCi0gICAgcHVibGljIHZvaWQgaW50ZXJwcmV0U2NhblJlc3VsdHNBdmFpbGFibGUoKSB7Ci0gICAgfQorICAgIHB1YmxpYyBib29sZWFuIGlzUHJpdmF0ZURuc1JvdXRlU2V0KCk7CisKKyAgICAvKioKKyAgICAgKiBTZXQgYSBmbGFnIGluZGljYXRpbmcgcHJpdmF0ZSBETlMgcm91dGUgaXMgc2V0CisgICAgICovCisgICAgcHVibGljIHZvaWQgcHJpdmF0ZURuc1JvdXRlU2V0KGJvb2xlYW4gZW5hYmxlZCk7CisKKyAgICAvKioKKyAgICAgKiBDaGVjayBpZiBkZWZhdWx0IHJvdXRlIGlzIHNldAorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzRGVmYXVsdFJvdXRlU2V0KCk7CisKKyAgICAvKioKKyAgICAgKiBTZXQgYSBmbGFnIGluZGljYXRpbmcgZGVmYXVsdCByb3V0ZSBpcyBzZXQgZm9yIHRoZSBuZXR3b3JrCisgICAgICovCisgICAgcHVibGljIHZvaWQgZGVmYXVsdFJvdXRlU2V0KGJvb2xlYW4gZW5hYmxlZCk7CisKKyAgICAvKioKKyAgICAgKiBDaGVjayBpZiB0ZWFyIGRvd24gd2FzIHJlcXVlc3RlZAorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzVGVhcmRvd25SZXF1ZXN0ZWQoKTsKKworICAgIC8qKgorICAgICAqIEluZGljYXRlIHRlYXIgZG93biByZXF1ZXN0ZWQgZnJvbSBjb25uZWN0aXZpdHkKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRUZWFyZG93blJlcXVlc3RlZChib29sZWFuIGlzUmVxdWVzdGVkKTsKIAogfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvbmV0L05ldHdvcmtVdGlscy5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvbmV0L05ldHdvcmtVdGlscy5qYXZhCmluZGV4IDVkNGIwOTkuLjAxMDA0YzIgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL25ldC9OZXR3b3JrVXRpbHMuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9uZXQvTmV0d29ya1V0aWxzLmphdmEKQEAgLTUyLDcgKzUyLDExIEBACiAgICAgICAgICAgaW50IHByZWZpeExlbmd0aCwgU3RyaW5nIGd3KTsKIAogICAgIC8qKiBSZXR1cm4gdGhlIGdhdGV3YXkgYWRkcmVzcyBmb3IgdGhlIGRlZmF1bHQgcm91dGUgZm9yIHRoZSBuYW1lZCBpbnRlcmZhY2UuICovCi0gICAgcHVibGljIG5hdGl2ZSBzdGF0aWMgaW50IGdldERlZmF1bHRSb3V0ZShTdHJpbmcgaW50ZXJmYWNlTmFtZSk7CisgICAgcHVibGljIHN0YXRpYyBJbmV0QWRkcmVzcyBnZXREZWZhdWx0Um91dGUoU3RyaW5nIGludGVyZmFjZU5hbWUpIHsKKyAgICAgICAgaW50IGFkZHIgPSBnZXREZWZhdWx0Um91dGVOYXRpdmUoaW50ZXJmYWNlTmFtZSk7CisgICAgICAgIHJldHVybiBpbnRUb0luZXRBZGRyZXNzKGFkZHIpOworICAgIH0KKyAgICBwcml2YXRlIG5hdGl2ZSBzdGF0aWMgaW50IGdldERlZmF1bHRSb3V0ZU5hdGl2ZShTdHJpbmcgaW50ZXJmYWNlTmFtZSk7CiAKICAgICAvKiogUmVtb3ZlIGhvc3Qgcm91dGVzIHRoYXQgdXNlcyB0aGUgbmFtZWQgaW50ZXJmYWNlLiAqLwogICAgIHB1YmxpYyBuYXRpdmUgc3RhdGljIGludCByZW1vdmVIb3N0Um91dGVzKFN0cmluZyBpbnRlcmZhY2VOYW1lKTsKQEAgLTE5NCwxOSArMTk4LDQgQEAKICAgICAgICAgfQogICAgICAgICByZXR1cm4gYWRkUm91dGUoaW50ZXJmYWNlTmFtZSwgZHN0U3RyLCBwcmVmaXhMZW5ndGgsIGd3U3RyKSA9PSAwOwogICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgaW50IHY0U3RyaW5nVG9JbnQoU3RyaW5nIHN0cikgewotICAgICAgICBpbnQgcmVzdWx0ID0gMDsKLSAgICAgICAgU3RyaW5nW10gYXJyYXkgPSBzdHIuc3BsaXQoIlxcLiIpOwotICAgICAgICBpZiAoYXJyYXkubGVuZ3RoICE9IDQpIHJldHVybiAwOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgcmVzdWx0ID0gSW50ZWdlci5wYXJzZUludChhcnJheVszXSk7Ci0gICAgICAgICAgICByZXN1bHQgPSAocmVzdWx0IDw8IDgpICsgSW50ZWdlci5wYXJzZUludChhcnJheVsyXSk7Ci0gICAgICAgICAgICByZXN1bHQgPSAocmVzdWx0IDw8IDgpICsgSW50ZWdlci5wYXJzZUludChhcnJheVsxXSk7Ci0gICAgICAgICAgICByZXN1bHQgPSAocmVzdWx0IDw8IDgpICsgSW50ZWdlci5wYXJzZUludChhcnJheVswXSk7Ci0gICAgICAgIH0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KIH0KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL25ldC9Qcm94eS5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvbmV0L1Byb3h5LmphdmEKaW5kZXggMjJjMzBhNS4uOWM2M2NkOSAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvbmV0L1Byb3h5LmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvbmV0L1Byb3h5LmphdmEKQEAgLTE2LDMyICsxNiwxNjUgQEAKIAogcGFja2FnZSBhbmRyb2lkLm5ldDsKIAotaW1wb3J0IG9yZy5hcGFjaGUuaHR0cC5IdHRwSG9zdDsKLQogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZW50UmVzb2x2ZXI7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5Db250ZW50T2JzZXJ2ZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyOwogaW1wb3J0IGFuZHJvaWQub3MuU3lzdGVtUHJvcGVydGllczsKIGltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLlNldHRpbmdzOwotaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CiAKIGltcG9ydCBqYXZhLm5ldC5JbmV0QWRkcmVzczsKK2ltcG9ydCBqYXZhLm5ldC5JbmV0U29ja2V0QWRkcmVzczsKK2ltcG9ydCBqYXZhLm5ldC5Tb2NrZXRBZGRyZXNzOwogaW1wb3J0IGphdmEubmV0LlVSSTsKIGltcG9ydCBqYXZhLm5ldC5Vbmtub3duSG9zdEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5sb2Nrcy5SZWFkV3JpdGVMb2NrOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LmxvY2tzLlJlZW50cmFudFJlYWRXcml0ZUxvY2s7CitpbXBvcnQgamF2YS51dGlsLnJlZ2V4Lk1hdGNoZXI7CitpbXBvcnQgamF2YS51dGlsLnJlZ2V4LlBhdHRlcm47CiAKIGltcG9ydCBqdW5pdC5mcmFtZXdvcmsuQXNzZXJ0OwogCitpbXBvcnQgb3JnLmFwYWNoZS5odHRwLkh0dHBIb3N0OworCiAvKioKICAqIEEgY29udmVuaWVuY2UgY2xhc3MgZm9yIGFjY2Vzc2luZyB0aGUgdXNlciBhbmQgZGVmYXVsdCBwcm94eQogICogc2V0dGluZ3MuCiAgKi8KLWZpbmFsIHB1YmxpYyBjbGFzcyBQcm94eSB7CitwdWJsaWMgZmluYWwgY2xhc3MgUHJveHkgewogCiAgICAgLy8gU2V0IHRvIHRydWUgdG8gZW5hYmxlIGV4dHJhIGRlYnVnZ2luZy4KLSAgICBzdGF0aWMgZmluYWwgcHJpdmF0ZSBib29sZWFuIERFQlVHID0gZmFsc2U7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVRyA9IGZhbHNlOwogCi0gICAgc3RhdGljIGZpbmFsIHB1YmxpYyBTdHJpbmcgUFJPWFlfQ0hBTkdFX0FDVElPTiA9CisgICAgLy8gVXNlZCB0byBub3RpZnkgYW4gYXBwIHRoYXQncyBjYWNoaW5nIHRoZSBkZWZhdWx0IGNvbm5lY3Rpb24gcHJveHkKKyAgICAvLyB0aGF0IGVpdGhlciB0aGUgZGVmYXVsdCBjb25uZWN0aW9uIG9yIGl0cyBwcm94eSBoYXMgY2hhbmdlZAorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1hZX0NIQU5HRV9BQ1RJT04gPQogICAgICAgICAiYW5kcm9pZC5pbnRlbnQuYWN0aW9uLlBST1hZX0NIQU5HRSI7CiAKKyAgICBwcml2YXRlIHN0YXRpYyBSZWFkV3JpdGVMb2NrIHNQcm94eUluZm9Mb2NrID0gbmV3IFJlZW50cmFudFJlYWRXcml0ZUxvY2soKTsKKworICAgIHByaXZhdGUgc3RhdGljIFNldHRpbmdzT2JzZXJ2ZXIgc0dsb2JhbFByb3h5Q2hhbmdlZE9ic2VydmVyID0gbnVsbDsKKworICAgIHByaXZhdGUgc3RhdGljIFByb3h5U3BlYyBzR2xvYmFsUHJveHlTcGVjID0gbnVsbDsKKworICAgIC8vIEhvc3RuYW1lIC8gSVAgUkVHRVggdmFsaWRhdGlvbgorICAgIC8vIE1hdGNoZXMgYmxhbmsgaW5wdXQsIGlwcywgYW5kIGRvbWFpbiBuYW1lcworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FX0lQX1JFR0VYID0KKyAgICAgICAgIlthLXpBLVowLTldKyhcXC1bYS16QS1aMC05XSspKihcXC5bYS16QS1aMC05XSsoXFwtW2EtekEtWjAtOV0rKSopKiI7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSE9TVE5BTUVfUkVHRVhQID0gIl4kfF4iICsgTkFNRV9JUF9SRUdFWCArICIkIjsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFBhdHRlcm4gSE9TVE5BTUVfUEFUVEVSTjsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFWENMTElTVF9SRUdFWFAgPSAiJHxeKC4/IiArIE5BTUVfSVBfUkVHRVgKKyAgICAgICAgKyAiKSsoLCguPyIgKyBOQU1FX0lQX1JFR0VYICsgIikpKiQiOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgUGF0dGVybiBFWENMTElTVF9QQVRURVJOOworCisgICAgc3RhdGljIHsKKyAgICAgICAgSE9TVE5BTUVfUEFUVEVSTiA9IFBhdHRlcm4uY29tcGlsZShIT1NUTkFNRV9SRUdFWFApOworICAgICAgICBFWENMTElTVF9QQVRURVJOID0gUGF0dGVybi5jb21waWxlKEVYQ0xMSVNUX1JFR0VYUCk7CisgICAgfQorCisgICAgLy8gdXNlZnVsIGJlY2F1c2UgaXQgaG9sZHMgdGhlIHByb2Nlc3NlZCBleGNsdXNpb24gbGlzdCAtIGRvbid0IHdhbnQgdG8gcmVwYXJzZSBpdCBlYWNoIHRpbWUKKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBQcm94eVNwZWMgeworICAgICAgICBTdHJpbmdbXSBleGNsdXNpb25MaXN0ID0gbnVsbDsKKyAgICAgICAgSW5ldFNvY2tldEFkZHJlc3MgYWRkcmVzcyA9IG51bGw7CisgICAgICAgIHB1YmxpYyBQcm94eVNwZWMoKSB7IH07CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc1VSTEluRXhjbHVzaW9uTGlzdFJlYWRMb2NrZWQoU3RyaW5nIHVybCwgU3RyaW5nW10gZXhjbHVzaW9uTGlzdCkgeworICAgICAgICBpZiAoZXhjbHVzaW9uTGlzdCA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgVXJpIHUgPSBVcmkucGFyc2UodXJsKTsKKyAgICAgICAgU3RyaW5nIHVybERvbWFpbiA9IHUuZ2V0SG9zdCgpOworICAgICAgICAvLyBJZiB0aGUgZG9tYWluIGlzIGRlZmluZWQgYXMgIi5hbmRyb2lkLmNvbSIgb3IgImFuZHJvaWQuY29tIiwgd2Ugd2lzaCB0byBtYXRjaAorICAgICAgICAvLyBodHRwOi8vYW5kcm9pZC5jb20gYXMgd2VsbCBhcyBodHRwOi8veHh4LmFuZHJvaWQuY29tICwgYnV0IG5vdAorICAgICAgICAvLyBodHRwOi8vbXlhbmRyb2lkLmNvbSAuIFRoaXMgY29kZSB3b3JrcyBvdXQgdGhlIGxvZ2ljLgorICAgICAgICBmb3IgKFN0cmluZyBleGNsdWRlZERvbWFpbiA6IGV4Y2x1c2lvbkxpc3QpIHsKKyAgICAgICAgICAgIFN0cmluZyBkb3REb21haW4gPSAiLiIgKyBleGNsdWRlZERvbWFpbjsKKyAgICAgICAgICAgIGlmICh1cmxEb21haW4uZXF1YWxzKGV4Y2x1ZGVkRG9tYWluKSkgeworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHVybERvbWFpbi5lbmRzV2l0aChkb3REb21haW4pKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLy8gTm8gbWF0Y2gKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBwYXJzZUhvc3QoU3RyaW5nIHByb3h5U3BlYykgeworICAgICAgICBpbnQgaSA9IHByb3h5U3BlYy5pbmRleE9mKCc6Jyk7CisgICAgICAgIGlmIChpID09IC0xKSB7CisgICAgICAgICAgICBpZiAoREVCVUcpIHsKKyAgICAgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShwcm94eVNwZWMubGVuZ3RoKCkgPT0gMCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcHJveHlTcGVjLnN1YnN0cmluZygwLCBpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBpbnQgcGFyc2VQb3J0KFN0cmluZyBwcm94eVNwZWMpIHsKKyAgICAgICAgaW50IGkgPSBwcm94eVNwZWMuaW5kZXhPZignOicpOworICAgICAgICBpZiAoaSA9PSAtMSkgeworICAgICAgICAgICAgaWYgKERFQlVHKSB7CisgICAgICAgICAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUocHJveHlTcGVjLmxlbmd0aCgpID09IDApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgICAgIGlmIChERUJVRykgeworICAgICAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoaSA8IHByb3h5U3BlYy5sZW5ndGgoKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIEludGVnZXIucGFyc2VJbnQocHJveHlTcGVjLnN1YnN0cmluZyhpKzEpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHByb3h5IG9iamVjdCB0byBiZSB1c2VkIGZvciB0aGUgVVJMIGdpdmVuIGFzIHBhcmFtZXRlci4KKyAgICAgKiBAcGFyYW0gY3R4IEEgQ29udGV4dCB1c2VkIHRvIGdldCB0aGUgc2V0dGluZ3MgZm9yIHRoZSBwcm94eSBob3N0LgorICAgICAqIEBwYXJhbSB1cmwgQSBVUkwgdG8gYmUgYWNjZXNzZWQuIFVzZWQgdG8gZXZhbHVhdGUgZXhjbHVzaW9uIGxpc3QuCisgICAgICogQHJldHVybiBQcm94eSAoamF2YS5uZXQpIG9iamVjdCBjb250YWluaW5nIHRoZSBob3N0IG5hbWUuIElmIHRoZQorICAgICAqICAgICAgICAgdXNlciBkaWQgbm90IHNldCBhIGhvc3RuYW1lIGl0IHJldHVybnMgdGhlIGRlZmF1bHQgaG9zdC4KKyAgICAgKiAgICAgICAgIEEgbnVsbCB2YWx1ZSBtZWFucyB0aGF0IG5vIGhvc3QgaXMgdG8gYmUgdXNlZC4KKyAgICAgKiB7QGhpZGV9CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLm5ldC5Qcm94eSBnZXRQcm94eShDb250ZXh0IGN0eCwgU3RyaW5nIHVybCkgeworICAgICAgICBzUHJveHlJbmZvTG9jay5yZWFkTG9jaygpLmxvY2soKTsKKyAgICAgICAgamF2YS5uZXQuUHJveHkgcmV0dmFsOworICAgICAgICB0cnkgeworICAgICAgICAgICAgaWYgKHNHbG9iYWxQcm94eUNoYW5nZWRPYnNlcnZlciA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgcmVnaXN0ZXJDb250ZW50T2JzZXJ2ZXJzUmVhZExvY2tlZChjdHgpOworICAgICAgICAgICAgICAgIHBhcnNlR2xvYmFsUHJveHlJbmZvUmVhZExvY2tlZChjdHgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHNHbG9iYWxQcm94eVNwZWMgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIC8vIFByb3h5IGRlZmluZWQgLSBBcHBseSBleGNsdXNpb24gcnVsZXMKKyAgICAgICAgICAgICAgICBpZiAoaXNVUkxJbkV4Y2x1c2lvbkxpc3RSZWFkTG9ja2VkKHVybCwgc0dsb2JhbFByb3h5U3BlYy5leGNsdXNpb25MaXN0KSkgeworICAgICAgICAgICAgICAgICAgICAvLyBSZXR1cm4gbm8gcHJveHkKKyAgICAgICAgICAgICAgICAgICAgcmV0dmFsID0gamF2YS5uZXQuUHJveHkuTk9fUFJPWFk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dmFsID0KKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBqYXZhLm5ldC5Qcm94eShqYXZhLm5ldC5Qcm94eS5UeXBlLkhUVFAsIHNHbG9iYWxQcm94eVNwZWMuYWRkcmVzcyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvLyBJZiBuZXR3b3JrIGlzIFdpRmksIHJldHVybiBubyBwcm94eS4KKyAgICAgICAgICAgICAgICAvLyBPdGhlcndpc2UsIHJldHVybiB0aGUgTW9iaWxlIE9wZXJhdG9yIHByb3h5LgorICAgICAgICAgICAgICAgIGlmICghaXNOZXR3b3JrV2lmaShjdHgpKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHZhbCA9IGdldERlZmF1bHRQcm94eSh1cmwpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHJldHZhbCA9IGphdmEubmV0LlByb3h5Lk5PX1BST1hZOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIHNQcm94eUluZm9Mb2NrLnJlYWRMb2NrKCkudW5sb2NrKCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKChyZXR2YWwgIT0gamF2YS5uZXQuUHJveHkuTk9fUFJPWFkpICYmIChpc0xvY2FsSG9zdCh1cmwpKSkgeworICAgICAgICAgICAgcmV0dmFsID0gamF2YS5uZXQuUHJveHkuTk9fUFJPWFk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJldHZhbDsKKyAgICB9CisKKyAgICAvLyBUT0RPOiBkZXByZWNhdGUgdGhpcyBmdW5jdGlvbgogICAgIC8qKgogICAgICAqIFJldHVybiB0aGUgcHJveHkgaG9zdCBzZXQgYnkgdGhlIHVzZXIuCiAgICAgICogQHBhcmFtIGN0eCBBIENvbnRleHQgdXNlZCB0byBnZXQgdGhlIHNldHRpbmdzIGZvciB0aGUgcHJveHkgaG9zdC4KQEAgLTQ5LDYwICsxODIsNTUgQEAKICAgICAgKiAgICAgICAgIG5hbWUgaXQgcmV0dXJucyB0aGUgZGVmYXVsdCBob3N0LiBBIG51bGwgdmFsdWUgbWVhbnMgdGhhdCBubwogICAgICAqICAgICAgICAgaG9zdCBpcyB0byBiZSB1c2VkLgogICAgICAqLwotICAgIHN0YXRpYyBmaW5hbCBwdWJsaWMgU3RyaW5nIGdldEhvc3QoQ29udGV4dCBjdHgpIHsKLSAgICAgICAgQ29udGVudFJlc29sdmVyIGNvbnRlbnRSZXNvbHZlciA9IGN0eC5nZXRDb250ZW50UmVzb2x2ZXIoKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydE5vdE51bGwoY29udGVudFJlc29sdmVyKTsKLSAgICAgICAgU3RyaW5nIGhvc3QgPSBTZXR0aW5ncy5TZWN1cmUuZ2V0U3RyaW5nKAotICAgICAgICAgICAgICAgIGNvbnRlbnRSZXNvbHZlciwKLSAgICAgICAgICAgICAgICBTZXR0aW5ncy5TZWN1cmUuSFRUUF9QUk9YWSk7Ci0gICAgICAgIGlmIChob3N0ICE9IG51bGwpIHsKLSAgICAgICAgICAgIGludCBpID0gaG9zdC5pbmRleE9mKCc6Jyk7Ci0gICAgICAgICAgICBpZiAoaSA9PSAtMSkgewotICAgICAgICAgICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShob3N0Lmxlbmd0aCgpID09IDApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBnZXRIb3N0KENvbnRleHQgY3R4KSB7CisgICAgICAgIHNQcm94eUluZm9Mb2NrLnJlYWRMb2NrKCkubG9jaygpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgaWYgKHNHbG9iYWxQcm94eUNoYW5nZWRPYnNlcnZlciA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgcmVnaXN0ZXJDb250ZW50T2JzZXJ2ZXJzUmVhZExvY2tlZChjdHgpOworICAgICAgICAgICAgICAgIHBhcnNlR2xvYmFsUHJveHlJbmZvUmVhZExvY2tlZChjdHgpOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGhvc3Quc3Vic3RyaW5nKDAsIGkpOworICAgICAgICAgICAgaWYgKHNHbG9iYWxQcm94eVNwZWMgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIEluZXRTb2NrZXRBZGRyZXNzIHNhID0gc0dsb2JhbFByb3h5U3BlYy5hZGRyZXNzOworICAgICAgICAgICAgICAgIHJldHVybiBzYS5nZXRIb3N0TmFtZSgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGdldERlZmF1bHRIb3N0KCk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBzUHJveHlJbmZvTG9jay5yZWFkTG9jaygpLnVubG9jaygpOwogICAgICAgICB9Ci0gICAgICAgIHJldHVybiBnZXREZWZhdWx0SG9zdCgpOwogICAgIH0KIAorICAgIC8vIFRPRE86IGRlcHJlY2F0ZSB0aGlzIGZ1bmN0aW9uCiAgICAgLyoqCiAgICAgICogUmV0dXJuIHRoZSBwcm94eSBwb3J0IHNldCBieSB0aGUgdXNlci4KICAgICAgKiBAcGFyYW0gY3R4IEEgQ29udGV4dCB1c2VkIHRvIGdldCB0aGUgc2V0dGluZ3MgZm9yIHRoZSBwcm94eSBwb3J0LgogICAgICAqIEByZXR1cm4gVGhlIHBvcnQgbnVtYmVyIHRvIHVzZSBvciAtMSBpZiBubyBwcm94eSBpcyB0byBiZSB1c2VkLgogICAgICAqLwotICAgIHN0YXRpYyBmaW5hbCBwdWJsaWMgaW50IGdldFBvcnQoQ29udGV4dCBjdHgpIHsKLSAgICAgICAgQ29udGVudFJlc29sdmVyIGNvbnRlbnRSZXNvbHZlciA9IGN0eC5nZXRDb250ZW50UmVzb2x2ZXIoKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydE5vdE51bGwoY29udGVudFJlc29sdmVyKTsKLSAgICAgICAgU3RyaW5nIGhvc3QgPSBTZXR0aW5ncy5TZWN1cmUuZ2V0U3RyaW5nKAotICAgICAgICAgICAgICAgIGNvbnRlbnRSZXNvbHZlciwKLSAgICAgICAgICAgICAgICBTZXR0aW5ncy5TZWN1cmUuSFRUUF9QUk9YWSk7Ci0gICAgICAgIGlmIChob3N0ICE9IG51bGwpIHsKLSAgICAgICAgICAgIGludCBpID0gaG9zdC5pbmRleE9mKCc6Jyk7Ci0gICAgICAgICAgICBpZiAoaSA9PSAtMSkgewotICAgICAgICAgICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShob3N0Lmxlbmd0aCgpID09IDApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgZ2V0UG9ydChDb250ZXh0IGN0eCkgeworICAgICAgICBzUHJveHlJbmZvTG9jay5yZWFkTG9jaygpLmxvY2soKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGlmIChzR2xvYmFsUHJveHlDaGFuZ2VkT2JzZXJ2ZXIgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHJlZ2lzdGVyQ29udGVudE9ic2VydmVyc1JlYWRMb2NrZWQoY3R4KTsKKyAgICAgICAgICAgICAgICBwYXJzZUdsb2JhbFByb3h5SW5mb1JlYWRMb2NrZWQoY3R4KTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKGkgPCBob3N0Lmxlbmd0aCgpKTsKKyAgICAgICAgICAgIGlmIChzR2xvYmFsUHJveHlTcGVjICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBJbmV0U29ja2V0QWRkcmVzcyBzYSA9IHNHbG9iYWxQcm94eVNwZWMuYWRkcmVzczsKKyAgICAgICAgICAgICAgICByZXR1cm4gc2EuZ2V0UG9ydCgpOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIEludGVnZXIucGFyc2VJbnQoaG9zdC5zdWJzdHJpbmcoaSsxKSk7CisgICAgICAgICAgICByZXR1cm4gZ2V0RGVmYXVsdFBvcnQoKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIHNQcm94eUluZm9Mb2NrLnJlYWRMb2NrKCkudW5sb2NrKCk7CiAgICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGdldERlZmF1bHRQb3J0KCk7CiAgICAgfQogCisgICAgLy8gVE9ETzogZGVwcmVjYXRlIHRoaXMgZnVuY3Rpb24KICAgICAvKioKICAgICAgKiBSZXR1cm4gdGhlIGRlZmF1bHQgcHJveHkgaG9zdCBzcGVjaWZpZWQgYnkgdGhlIGNhcnJpZXIuCiAgICAgICogQHJldHVybiBTdHJpbmcgY29udGFpbmluZyB0aGUgaG9zdCBuYW1lIG9yIG51bGwgaWYgdGhlcmUgaXMgbm8gcHJveHkgZm9yCiAgICAgICogdGhpcyBjYXJyaWVyLgogICAgICAqLwotICAgIHN0YXRpYyBmaW5hbCBwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRIb3N0KCkgeworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGdldERlZmF1bHRIb3N0KCkgewogICAgICAgICBTdHJpbmcgaG9zdCA9IFN5c3RlbVByb3BlcnRpZXMuZ2V0KCJuZXQuZ3Bycy5odHRwLXByb3h5Iik7Ci0gICAgICAgIGlmIChob3N0ICE9IG51bGwpIHsKKyAgICAgICAgaWYgKChob3N0ICE9IG51bGwpICYmIChob3N0Lmxlbmd0aCgpICE9IDApKSB7CiAgICAgICAgICAgICBVcmkgdSA9IFVyaS5wYXJzZShob3N0KTsKICAgICAgICAgICAgIGhvc3QgPSB1LmdldEhvc3QoKTsKICAgICAgICAgICAgIHJldHVybiBob3N0OwpAQCAtMTExLDE0ICsyMzksMTUgQEAKICAgICAgICAgfQogICAgIH0KIAorICAgIC8vIFRPRE86IGRlcHJlY2F0ZSB0aGlzIGZ1bmN0aW9uCiAgICAgLyoqCiAgICAgICogUmV0dXJuIHRoZSBkZWZhdWx0IHByb3h5IHBvcnQgc3BlY2lmaWVkIGJ5IHRoZSBjYXJyaWVyLgogICAgICAqIEByZXR1cm4gVGhlIHBvcnQgbnVtYmVyIHRvIGJlIHVzZWQgd2l0aCB0aGUgcHJveHkgaG9zdCBvciAtMSBpZiB0aGVyZSBpcwogICAgICAqIG5vIHByb3h5IGZvciB0aGlzIGNhcnJpZXIuCiAgICAgICovCi0gICAgc3RhdGljIGZpbmFsIHB1YmxpYyBpbnQgZ2V0RGVmYXVsdFBvcnQoKSB7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgZ2V0RGVmYXVsdFBvcnQoKSB7CiAgICAgICAgIFN0cmluZyBob3N0ID0gU3lzdGVtUHJvcGVydGllcy5nZXQoIm5ldC5ncHJzLmh0dHAtcHJveHkiKTsKLSAgICAgICAgaWYgKGhvc3QgIT0gbnVsbCkgeworICAgICAgICBpZiAoKGhvc3QgIT0gbnVsbCkgJiYgKGhvc3QubGVuZ3RoKCkgIT0gMCkpIHsKICAgICAgICAgICAgIFVyaSB1ID0gVXJpLnBhcnNlKGhvc3QpOwogICAgICAgICAgICAgcmV0dXJuIHUuZ2V0UG9ydCgpOwogICAgICAgICB9IGVsc2UgewpAQCAtMTI2LDYgKzI1NSwyMCBAQAogICAgICAgICB9CiAgICAgfQogCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgamF2YS5uZXQuUHJveHkgZ2V0RGVmYXVsdFByb3h5KFN0cmluZyB1cmwpIHsKKyAgICAgICAgLy8gVE9ETzogVGhpcyB3aWxsIGdvIGF3YXkgd2hlbiBpbmZvcm1hdGlvbiBpcyBjb2xsZWN0ZWQgZnJvbSBDb25uZWN0aXZpdHlNYW5hZ2VyLi4uCisgICAgICAgIC8vIFRoZXJlIGFyZSBicm9hZGNhc3Qgb2YgbmV0d29yayBwcm94aWVzLCBzbyB0aGV5IGFyZSBwYXJzZSBtYW51YWxseS4KKyAgICAgICAgU3RyaW5nIGhvc3QgPSBTeXN0ZW1Qcm9wZXJ0aWVzLmdldCgibmV0LmdwcnMuaHR0cC1wcm94eSIpOworICAgICAgICBpZiAoKGhvc3QgIT0gbnVsbCkgJiYgKGhvc3QubGVuZ3RoKCkgIT0gMCkpIHsKKyAgICAgICAgICAgIFVyaSB1ID0gVXJpLnBhcnNlKGhvc3QpOworICAgICAgICAgICAgcmV0dXJuIG5ldyBqYXZhLm5ldC5Qcm94eShqYXZhLm5ldC5Qcm94eS5UeXBlLkhUVFAsCisgICAgICAgICAgICAgICAgICAgIG5ldyBJbmV0U29ja2V0QWRkcmVzcyh1LmdldEhvc3QoKSwgdS5nZXRQb3J0KCkpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiBqYXZhLm5ldC5Qcm94eS5OT19QUk9YWTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIFRPRE86IHJlbW92ZSB0aGlzIGZ1bmN0aW9uIC8gZGVwcmVjYXRlCiAgICAgLyoqCiAgICAgICogUmV0dXJucyB0aGUgcHJlZmVycmVkIHByb3h5IHRvIGJlIHVzZWQgYnkgY2xpZW50cy4gVGhpcyBpcyBhIHdyYXBwZXIKICAgICAgKiBhcm91bmQge0BsaW5rIGFuZHJvaWQubmV0LlByb3h5I2dldEhvc3QoKX0uIEN1cnJlbnRseSBubyBwcm94eSB3aWxsCkBAIC0xMzgsMjYgKzI4MSwyMyBAQAogICAgICAqIGFuZHJvaWQucGVybWlzc2lvbi5BQ0NFU1NfTkVUV09SS19TVEFURQogICAgICAqIEByZXR1cm4gVGhlIHByZWZlcnJlZCBwcm94eSB0byBiZSB1c2VkIGJ5IGNsaWVudHMsIG9yIG51bGwgaWYgdGhlcmUKICAgICAgKiBpcyBubyBwcm94eS4KLSAgICAgKgogICAgICAqIHtAaGlkZX0KICAgICAgKi8KLSAgICBzdGF0aWMgZmluYWwgcHVibGljIEh0dHBIb3N0IGdldFByZWZlcnJlZEh0dHBIb3N0KENvbnRleHQgY29udGV4dCwKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEh0dHBIb3N0IGdldFByZWZlcnJlZEh0dHBIb3N0KENvbnRleHQgY29udGV4dCwKICAgICAgICAgICAgIFN0cmluZyB1cmwpIHsKLSAgICAgICAgaWYgKCFpc0xvY2FsSG9zdCh1cmwpICYmICFpc05ldHdvcmtXaWZpKGNvbnRleHQpKSB7Ci0gICAgICAgICAgICBmaW5hbCBTdHJpbmcgcHJveHlIb3N0ID0gUHJveHkuZ2V0SG9zdChjb250ZXh0KTsKLSAgICAgICAgICAgIGlmIChwcm94eUhvc3QgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgSHR0cEhvc3QocHJveHlIb3N0LCBQcm94eS5nZXRQb3J0KGNvbnRleHQpLCAiaHR0cCIpOwotICAgICAgICAgICAgfQorICAgICAgICBqYXZhLm5ldC5Qcm94eSBwcmVmUHJveHkgPSBnZXRQcm94eShjb250ZXh0LCB1cmwpOworICAgICAgICBpZiAocHJlZlByb3h5LmVxdWFscyhqYXZhLm5ldC5Qcm94eS5OT19QUk9YWSkpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgSW5ldFNvY2tldEFkZHJlc3Mgc2EgPSAoSW5ldFNvY2tldEFkZHJlc3MpcHJlZlByb3h5LmFkZHJlc3MoKTsKKyAgICAgICAgICAgIHJldHVybiBuZXcgSHR0cEhvc3Qoc2EuZ2V0SG9zdE5hbWUoKSwgc2EuZ2V0UG9ydCgpLCAiaHR0cCIpOwogICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgfQogCi0gICAgc3RhdGljIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBpc0xvY2FsSG9zdChTdHJpbmcgdXJsKSB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBpc0xvY2FsSG9zdChTdHJpbmcgdXJsKSB7CiAgICAgICAgIGlmICh1cmwgPT0gbnVsbCkgewogICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9Ci0KICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIGZpbmFsIFVSSSB1cmkgPSBVUkkuY3JlYXRlKHVybCk7CiAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgaG9zdCA9IHVyaS5nZXRIb3N0KCk7CkBAIC0xNzQsMTUgKzMxNCwxMyBAQAogICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWV4KSB7CiAgICAgICAgICAgICAvLyBJZ25vcmUgKFVSSS5jcmVhdGUpCiAgICAgICAgIH0KLQogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogCi0gICAgc3RhdGljIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBpc05ldHdvcmtXaWZpKENvbnRleHQgY29udGV4dCkgeworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gaXNOZXR3b3JrV2lmaShDb250ZXh0IGNvbnRleHQpIHsKICAgICAgICAgaWYgKGNvbnRleHQgPT0gbnVsbCkgewogICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9Ci0KICAgICAgICAgZmluYWwgQ29ubmVjdGl2aXR5TWFuYWdlciBjb25uZWN0aXZpdHkgPSAoQ29ubmVjdGl2aXR5TWFuYWdlcikKICAgICAgICAgICAgIGNvbnRleHQuZ2V0U3lzdGVtU2VydmljZShDb250ZXh0LkNPTk5FQ1RJVklUWV9TRVJWSUNFKTsKICAgICAgICAgaWYgKGNvbm5lY3Rpdml0eSAhPSBudWxsKSB7CkBAIC0xOTIsNyArMzMwLDEyOSBAQAogICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICAgfQogICAgICAgICB9Ci0KICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KLX07CisKKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBTZXR0aW5nc09ic2VydmVyIGV4dGVuZHMgQ29udGVudE9ic2VydmVyIHsKKworICAgICAgICBwcml2YXRlIENvbnRleHQgbUNvbnRleHQ7CisKKyAgICAgICAgU2V0dGluZ3NPYnNlcnZlcihDb250ZXh0IGN0eCkgeworICAgICAgICAgICAgc3VwZXIobmV3IEhhbmRsZXIoY3R4LmdldE1haW5Mb29wZXIoKSkpOworICAgICAgICAgICAgbUNvbnRleHQgPSBjdHg7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgb25DaGFuZ2UoYm9vbGVhbiBzZWxmQ2hhbmdlKSB7CisgICAgICAgICAgICBzUHJveHlJbmZvTG9jay5yZWFkTG9jaygpLmxvY2soKTsKKyAgICAgICAgICAgIHBhcnNlR2xvYmFsUHJveHlJbmZvUmVhZExvY2tlZChtQ29udGV4dCk7CisgICAgICAgICAgICBzUHJveHlJbmZvTG9jay5yZWFkTG9jaygpLnVubG9jaygpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgdm9pZCByZWdpc3RlckNvbnRlbnRPYnNlcnZlcnNSZWFkTG9ja2VkKENvbnRleHQgY3R4KSB7CisgICAgICAgIFVyaSB1cmlHbG9iYWxQcm94eSA9IFNldHRpbmdzLlNlY3VyZS5nZXRVcmlGb3IoU2V0dGluZ3MuU2VjdXJlLkhUVFBfUFJPWFkpOworICAgICAgICBVcmkgdXJpR2xvYmFsRXhjbExpc3QgPQorICAgICAgICAgICAgU2V0dGluZ3MuU2VjdXJlLmdldFVyaUZvcihTZXR0aW5ncy5TZWN1cmUuSFRUUF9QUk9YWV9FWENMVVNJT05fTElTVCk7CisKKyAgICAgICAgLy8gTm8gbG9jayB1cGdyYWRpbmcgKGZyb20gcmVhZCB0byB3cml0ZSkgYWxsb3dlZAorICAgICAgICBzUHJveHlJbmZvTG9jay5yZWFkTG9jaygpLnVubG9jaygpOworICAgICAgICBzUHJveHlJbmZvTG9jay53cml0ZUxvY2soKS5sb2NrKCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBzR2xvYmFsUHJveHlDaGFuZ2VkT2JzZXJ2ZXIgPSBuZXcgU2V0dGluZ3NPYnNlcnZlcihjdHgpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgLy8gRG93bmdyYWRpbmcgbG9ja3MgKGZyb20gd3JpdGUgdG8gcmVhZCkgaXMgYWxsb3dlZAorICAgICAgICAgICAgc1Byb3h5SW5mb0xvY2sucmVhZExvY2soKS5sb2NrKCk7CisgICAgICAgICAgICBzUHJveHlJbmZvTG9jay53cml0ZUxvY2soKS51bmxvY2soKTsKKyAgICAgICAgfQorICAgICAgICBjdHguZ2V0Q29udGVudFJlc29sdmVyKCkucmVnaXN0ZXJDb250ZW50T2JzZXJ2ZXIodXJpR2xvYmFsUHJveHksIGZhbHNlLAorICAgICAgICAgICAgICAgIHNHbG9iYWxQcm94eUNoYW5nZWRPYnNlcnZlcik7CisgICAgICAgIGN0eC5nZXRDb250ZW50UmVzb2x2ZXIoKS5yZWdpc3RlckNvbnRlbnRPYnNlcnZlcih1cmlHbG9iYWxFeGNsTGlzdCwgZmFsc2UsCisgICAgICAgICAgICAgICAgc0dsb2JhbFByb3h5Q2hhbmdlZE9ic2VydmVyKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCB2b2lkIHBhcnNlR2xvYmFsUHJveHlJbmZvUmVhZExvY2tlZChDb250ZXh0IGN0eCkgeworICAgICAgICBDb250ZW50UmVzb2x2ZXIgY29udGVudFJlc29sdmVyID0gY3R4LmdldENvbnRlbnRSZXNvbHZlcigpOworICAgICAgICBTdHJpbmcgcHJveHlIb3N0ID0gIFNldHRpbmdzLlNlY3VyZS5nZXRTdHJpbmcoCisgICAgICAgICAgICAgICAgY29udGVudFJlc29sdmVyLAorICAgICAgICAgICAgICAgIFNldHRpbmdzLlNlY3VyZS5IVFRQX1BST1hZKTsKKyAgICAgICAgaWYgKChwcm94eUhvc3QgPT0gbnVsbCkgfHwgKHByb3h5SG9zdC5sZW5ndGgoKSA9PSAwKSkgeworICAgICAgICAgICAgLy8gQ2xlYXIgc2lnbmFsCisgICAgICAgICAgICBzUHJveHlJbmZvTG9jay5yZWFkTG9jaygpLnVubG9jaygpOworICAgICAgICAgICAgc1Byb3h5SW5mb0xvY2sud3JpdGVMb2NrKCkubG9jaygpOworICAgICAgICAgICAgc0dsb2JhbFByb3h5U3BlYyA9IG51bGw7CisgICAgICAgICAgICBzUHJveHlJbmZvTG9jay5yZWFkTG9jaygpLmxvY2soKTsKKyAgICAgICAgICAgIHNQcm94eUluZm9Mb2NrLndyaXRlTG9jaygpLnVubG9jaygpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIFN0cmluZyBleGNsdXNpb25MaXN0U3BlYyA9IFNldHRpbmdzLlNlY3VyZS5nZXRTdHJpbmcoCisgICAgICAgICAgICAgICAgY29udGVudFJlc29sdmVyLAorICAgICAgICAgICAgICAgIFNldHRpbmdzLlNlY3VyZS5IVFRQX1BST1hZX0VYQ0xVU0lPTl9MSVNUKTsKKyAgICAgICAgU3RyaW5nIGhvc3QgPSBwYXJzZUhvc3QocHJveHlIb3N0KTsKKyAgICAgICAgaW50IHBvcnQgPSBwYXJzZVBvcnQocHJveHlIb3N0KTsKKyAgICAgICAgaWYgKHByb3h5SG9zdCAhPSBudWxsKSB7CisgICAgICAgICAgICBzR2xvYmFsUHJveHlTcGVjID0gbmV3IFByb3h5U3BlYygpOworICAgICAgICAgICAgc0dsb2JhbFByb3h5U3BlYy5hZGRyZXNzPSBuZXcgSW5ldFNvY2tldEFkZHJlc3MoaG9zdCwgcG9ydCk7CisgICAgICAgICAgICBpZiAoKGV4Y2x1c2lvbkxpc3RTcGVjICE9IG51bGwpICYmIChleGNsdXNpb25MaXN0U3BlYy5sZW5ndGgoKSAhPSAwKSkgeworICAgICAgICAgICAgICAgIFN0cmluZ1tdIGV4Y2x1c2lvbkxpc3RFbnRyaWVzID0gZXhjbHVzaW9uTGlzdFNwZWMudG9Mb3dlckNhc2UoKS5zcGxpdCgiLCIpOworICAgICAgICAgICAgICAgIFN0cmluZ1tdIHByb2Nlc3NlZEVudHJpZXMgPSBuZXcgU3RyaW5nW2V4Y2x1c2lvbkxpc3RFbnRyaWVzLmxlbmd0aF07CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBleGNsdXNpb25MaXN0RW50cmllcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgICAgICBTdHJpbmcgZW50cnkgPSBleGNsdXNpb25MaXN0RW50cmllc1tpXS50cmltKCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChlbnRyeS5zdGFydHNXaXRoKCIuIikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVudHJ5ID0gZW50cnkuc3Vic3RyaW5nKDEpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NlZEVudHJpZXNbaV0gPSBlbnRyeTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgc1Byb3h5SW5mb0xvY2sucmVhZExvY2soKS51bmxvY2soKTsKKyAgICAgICAgICAgICAgICBzUHJveHlJbmZvTG9jay53cml0ZUxvY2soKS5sb2NrKCk7CisgICAgICAgICAgICAgICAgc0dsb2JhbFByb3h5U3BlYy5leGNsdXNpb25MaXN0ID0gcHJvY2Vzc2VkRW50cmllczsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgc1Byb3h5SW5mb0xvY2sucmVhZExvY2soKS51bmxvY2soKTsKKyAgICAgICAgICAgICAgICBzUHJveHlJbmZvTG9jay53cml0ZUxvY2soKS5sb2NrKCk7CisgICAgICAgICAgICAgICAgc0dsb2JhbFByb3h5U3BlYy5leGNsdXNpb25MaXN0ID0gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHNQcm94eUluZm9Mb2NrLnJlYWRMb2NrKCkudW5sb2NrKCk7CisgICAgICAgICAgICBzUHJveHlJbmZvTG9jay53cml0ZUxvY2soKS5sb2NrKCk7CisgICAgICAgICAgICBzR2xvYmFsUHJveHlTcGVjID0gbnVsbDsKKyAgICAgICAgfQorICAgICAgICBzUHJveHlJbmZvTG9jay5yZWFkTG9jaygpLmxvY2soKTsKKyAgICAgICAgc1Byb3h5SW5mb0xvY2sud3JpdGVMb2NrKCkudW5sb2NrKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVmFsaWRhdGUgc3ludGF4IG9mIGhvc3RuYW1lLCBwb3J0IGFuZCBleGNsdXNpb24gbGlzdCBlbnRyaWVzCisgICAgICoge0BoaWRlfQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB2YWxpZGF0ZShTdHJpbmcgaG9zdG5hbWUsIFN0cmluZyBwb3J0LCBTdHJpbmcgZXhjbExpc3QpIHsKKyAgICAgICAgTWF0Y2hlciBtYXRjaCA9IEhPU1ROQU1FX1BBVFRFUk4ubWF0Y2hlcihob3N0bmFtZSk7CisgICAgICAgIE1hdGNoZXIgbGlzdE1hdGNoID0gRVhDTExJU1RfUEFUVEVSTi5tYXRjaGVyKGV4Y2xMaXN0KTsKKworICAgICAgICBpZiAoIW1hdGNoLm1hdGNoZXMoKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCFsaXN0TWF0Y2gubWF0Y2hlcygpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoaG9zdG5hbWUubGVuZ3RoKCkgPiAwICYmIHBvcnQubGVuZ3RoKCkgPT0gMCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHBvcnQubGVuZ3RoKCkgPiAwKSB7CisgICAgICAgICAgICBpZiAoaG9zdG5hbWUubGVuZ3RoKCkgPT0gMCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGludCBwb3J0VmFsID0gLTE7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHBvcnRWYWwgPSBJbnRlZ2VyLnBhcnNlSW50KHBvcnQpOworICAgICAgICAgICAgfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHBvcnRWYWwgPD0gMCB8fCBwb3J0VmFsID4gMHhGRkZGKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvbmV0L1Byb3h5UHJvcGVydGllcy5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvbmV0L1Byb3h5UHJvcGVydGllcy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZiNTlmZWQKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9uZXQvUHJveHlQcm9wZXJ0aWVzLmphdmEKQEAgLTAsMCArMSwxMjYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQubmV0OworCisKK2ltcG9ydCBhbmRyb2lkLm9zLlBhcmNlbDsKK2ltcG9ydCBhbmRyb2lkLm9zLlBhcmNlbGFibGU7CisKK2ltcG9ydCBqYXZhLm5ldC5JbmV0QWRkcmVzczsKK2ltcG9ydCBqYXZhLm5ldC5JbmV0U29ja2V0QWRkcmVzczsKK2ltcG9ydCBqYXZhLm5ldC5Vbmtub3duSG9zdEV4Y2VwdGlvbjsKKworLyoqCisgKiBBIGNvbnRhaW5lciBjbGFzcyBmb3IgdGhlIGh0dHAgcHJveHkgaW5mbworICogQGhpZGUKKyAqLworcHVibGljIGNsYXNzIFByb3h5UHJvcGVydGllcyBpbXBsZW1lbnRzIFBhcmNlbGFibGUgeworCisgICAgcHJpdmF0ZSBJbmV0U29ja2V0QWRkcmVzcyBtUHJveHk7CisgICAgcHJpdmF0ZSBTdHJpbmcgbUV4Y2x1c2lvbkxpc3Q7CisKKyAgICBwdWJsaWMgUHJveHlQcm9wZXJ0aWVzKCkgeworICAgIH0KKworICAgIC8vIGNvcHkgY29uc3RydWN0b3IgaW5zdGVhZCBvZiBjbG9uZQorICAgIHB1YmxpYyBQcm94eVByb3BlcnRpZXMoUHJveHlQcm9wZXJ0aWVzIHNvdXJjZSkgeworICAgICAgICBpZiAoc291cmNlICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1Qcm94eSA9IHNvdXJjZS5nZXRTb2NrZXRBZGRyZXNzKCk7CisgICAgICAgICAgICBTdHJpbmcgZXhjbHVzaW9uTGlzdCA9IHNvdXJjZS5nZXRFeGNsdXNpb25MaXN0KCk7CisgICAgICAgICAgICBpZiAoZXhjbHVzaW9uTGlzdCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgbUV4Y2x1c2lvbkxpc3QgPSBuZXcgU3RyaW5nKGV4Y2x1c2lvbkxpc3QpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIEluZXRTb2NrZXRBZGRyZXNzIGdldFNvY2tldEFkZHJlc3MoKSB7CisgICAgICAgIHJldHVybiBtUHJveHk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0U29ja2V0QWRkcmVzcyhJbmV0U29ja2V0QWRkcmVzcyBwcm94eSkgeworICAgICAgICBtUHJveHkgPSBwcm94eTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldEV4Y2x1c2lvbkxpc3QoKSB7CisgICAgICAgIHJldHVybiBtRXhjbHVzaW9uTGlzdDsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRFeGNsdXNpb25MaXN0KFN0cmluZyBleGNsdXNpb25MaXN0KSB7CisgICAgICAgIG1FeGNsdXNpb25MaXN0ID0gZXhjbHVzaW9uTGlzdDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICBTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKyAgICAgICAgaWYgKG1Qcm94eSAhPSBudWxsKSB7CisgICAgICAgICAgICBzYi5hcHBlbmQobVByb3h5LnRvU3RyaW5nKCkpOworICAgICAgICAgICAgaWYgKG1FeGNsdXNpb25MaXN0ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCIgeGw9IikuYXBwZW5kKG1FeGNsdXNpb25MaXN0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc2IudG9TdHJpbmcoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJbXBsZW1lbnQgdGhlIFBhcmNlbGFibGUgaW50ZXJmYWNlCisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGRlc2NyaWJlQ29udGVudHMoKSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIC8qKgorICAgICAqIEltcGxlbWVudCB0aGUgUGFyY2VsYWJsZSBpbnRlcmZhY2UuCisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB3cml0ZVRvUGFyY2VsKFBhcmNlbCBkZXN0LCBpbnQgZmxhZ3MpIHsKKyAgICAgICAgaWYgKG1Qcm94eSAhPSBudWxsKSB7CisgICAgICAgICAgICBJbmV0QWRkcmVzcyBhZGRyID0gbVByb3h5LmdldEFkZHJlc3MoKTsKKyAgICAgICAgICAgIGlmIChhZGRyICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBkZXN0LndyaXRlQnl0ZSgoYnl0ZSkxKTsKKyAgICAgICAgICAgICAgICBkZXN0LndyaXRlQnl0ZUFycmF5KGFkZHIuZ2V0QWRkcmVzcygpKTsKKyAgICAgICAgICAgICAgICBkZXN0LndyaXRlSW50KG1Qcm94eS5nZXRQb3J0KCkpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZGVzdC53cml0ZUJ5dGUoKGJ5dGUpMCk7CisgICAgICAgIH0KKyAgICAgICAgZGVzdC53cml0ZVN0cmluZyhtRXhjbHVzaW9uTGlzdCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogSW1wbGVtZW50IHRoZSBQYXJjZWxhYmxlIGludGVyZmFjZS4KKyAgICAgKiBAaGlkZQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQ3JlYXRvcjxQcm94eVByb3BlcnRpZXM+IENSRUFUT1IgPQorICAgICAgICBuZXcgQ3JlYXRvcjxQcm94eVByb3BlcnRpZXM+KCkgeworICAgICAgICAgICAgcHVibGljIFByb3h5UHJvcGVydGllcyBjcmVhdGVGcm9tUGFyY2VsKFBhcmNlbCBpbikgeworICAgICAgICAgICAgICAgIFByb3h5UHJvcGVydGllcyBwcm94eVByb3BlcnRpZXMgPSBuZXcgUHJveHlQcm9wZXJ0aWVzKCk7CisgICAgICAgICAgICAgICAgaWYgKGluLnJlYWRCeXRlKCkgPT0gMSkgeworICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgSW5ldEFkZHJlc3MgYWRkciA9IEluZXRBZGRyZXNzLmdldEJ5QWRkcmVzcyhpbi5jcmVhdGVCeXRlQXJyYXkoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBwcm94eVByb3BlcnRpZXMuc2V0U29ja2V0QWRkcmVzcyhuZXcgSW5ldFNvY2tldEFkZHJlc3MoYWRkciwgaW4ucmVhZEludCgpKSk7CisgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFVua25vd25Ib3N0RXhjZXB0aW9uIGUpIHsgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBwcm94eVByb3BlcnRpZXMuc2V0RXhjbHVzaW9uTGlzdChpbi5yZWFkU3RyaW5nKCkpOworICAgICAgICAgICAgICAgIHJldHVybiBwcm94eVByb3BlcnRpZXM7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBQcm94eVByb3BlcnRpZXNbXSBuZXdBcnJheShpbnQgc2l6ZSkgeworICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUHJveHlQcm9wZXJ0aWVzW3NpemVdOworICAgICAgICAgICAgfQorICAgICAgICB9OworfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvbmV0L1VyaS5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvbmV0L1VyaS5qYXZhCmluZGV4IDQ3ZmFhYmEuLjNiMjE1OTAgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL25ldC9VcmkuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9uZXQvVXJpLmphdmEKQEAgLTI4LDggKzI4LDEwIEBACiBpbXBvcnQgamF2YS51dGlsLkFic3RyYWN0TGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwogaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuTGlua2VkSGFzaFNldDsKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuUmFuZG9tQWNjZXNzOworaW1wb3J0IGphdmEudXRpbC5TZXQ7CiAKIC8qKgogICogSW1tdXRhYmxlIFVSSSByZWZlcmVuY2UuIEEgVVJJIHJlZmVyZW5jZSBpbmNsdWRlcyBhIFVSSSBhbmQgYSBmcmFnbWVudCwgdGhlCkBAIC00Nyw3ICs0OSw3IEBACiAgICAgLyoKIAogICAgIFRoaXMgY2xhc3MgYWltcyB0byBkbyBhcyBsaXR0bGUgdXAgZnJvbnQgd29yayBhcyBwb3NzaWJsZS4gVG8gYWNjb21wbGlzaAotICAgIHRoYXQsIHdlIHZhcnkgdGhlIGltcGxlbWVudGF0aW9uIGRlcGVuZGVuZGluZyBvbiB3aGF0IHRoZSB1c2VyIHBhc3NlcyBpbi4KKyAgICB0aGF0LCB3ZSB2YXJ5IHRoZSBpbXBsZW1lbnRhdGlvbiBkZXBlbmRpbmcgb24gd2hhdCB0aGUgdXNlciBwYXNzZXMgaW4uCiAgICAgRm9yIGV4YW1wbGUsIHdlIGhhdmUgb25lIGltcGxlbWVudGF0aW9uIGlmIHRoZSB1c2VyIHBhc3NlcyBpbiBhCiAgICAgVVJJIHN0cmluZyAoU3RyaW5nVXJpKSBhbmQgYW5vdGhlciBpZiB0aGUgdXNlciBwYXNzZXMgaW4gdGhlCiAgICAgaW5kaXZpZHVhbCBjb21wb25lbnRzIChPcGFxdWVVcmkpLgpAQCAtMTI1MywxNCArMTI1NSwxNiBAQAogICAgICAqIGNvbmN1cnJlbnQgdXNlLgogICAgICAqCiAgICAgICogPHA+QW4gYWJzb2x1dGUgaGllcmFyY2hpY2FsIFVSSSByZWZlcmVuY2UgZm9sbG93cyB0aGUgcGF0dGVybjoKLSAgICAgKiB7QGNvZGUgJmx0O3NjaGVtZSZndDs6Ly8mbHQ7YXV0aG9yaXR5Jmd0OyZsdDthYnNvbHV0ZSBwYXRoJmd0Oz8mbHQ7cXVlcnkmZ3Q7IyZsdDtmcmFnbWVudCZndDt9CisgICAgICoge0Bjb2RlIDxzY2hlbWU+Oi8vPGF1dGhvcml0eT48YWJzb2x1dGUgcGF0aD4/PHF1ZXJ5PiM8ZnJhZ21lbnQ+fQogICAgICAqCiAgICAgICogPHA+UmVsYXRpdmUgVVJJIHJlZmVyZW5jZXMgKHdoaWNoIGFyZSBhbHdheXMgaGllcmFyY2hpY2FsKSBmb2xsb3cgb25lCi0gICAgICogb2YgdHdvIHBhdHRlcm5zOiB7QGNvZGUgJmx0O3JlbGF0aXZlIG9yIGFic29sdXRlIHBhdGgmZ3Q7PyZsdDtxdWVyeSZndDsjJmx0O2ZyYWdtZW50Jmd0O30KLSAgICAgKiBvciB7QGNvZGUgLy8mbHQ7YXV0aG9yaXR5Jmd0OyZsdDthYnNvbHV0ZSBwYXRoJmd0Oz8mbHQ7cXVlcnkmZ3Q7IyZsdDtmcmFnbWVudCZndDt9CisgICAgICogb2YgdHdvIHBhdHRlcm5zOiB7QGNvZGUgPHJlbGF0aXZlIG9yIGFic29sdXRlIHBhdGg+PzxxdWVyeT4jPGZyYWdtZW50Pn0KKyAgICAgKiBvciB7QGNvZGUgLy88YXV0aG9yaXR5PjxhYnNvbHV0ZSBwYXRoPj88cXVlcnk+IzxmcmFnbWVudD59CiAgICAgICoKICAgICAgKiA8cD5BbiBvcGFxdWUgVVJJIGZvbGxvd3MgdGhpcyBwYXR0ZXJuOgotICAgICAqIHtAY29kZSAmbHQ7c2NoZW1lJmd0OzombHQ7b3BhcXVlIHBhcnQmZ3Q7IyZsdDtmcmFnbWVudCZndDt9CisgICAgICoge0Bjb2RlIDxzY2hlbWU+OjxvcGFxdWUgcGFydD4jPGZyYWdtZW50Pn0KKyAgICAgKiAKKyAgICAgKiA8cD5Vc2Uge0BsaW5rIFVyaSNidWlsZFVwb24oKX0gdG8gb2J0YWluIGEgYnVpbGRlciByZXByZXNlbnRpbmcgYW4gZXhpc3RpbmcgVVJJLgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgQnVpbGRlciB7CiAKQEAgLTE0NDcsNiArMTQ1MSwxMyBAQAogICAgICAgICB9CiAKICAgICAgICAgLyoqCisgICAgICAgICAqIENsZWFycyB0aGUgdGhlIHByZXZpb3VzbHkgc2V0IHF1ZXJ5LgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIEJ1aWxkZXIgY2xlYXJRdWVyeSgpIHsKKyAgICAgICAgICByZXR1cm4gcXVlcnkoKFBhcnQpIG51bGwpOworICAgICAgICB9CisKKyAgICAgICAgLyoqCiAgICAgICAgICAqIENvbnN0cnVjdHMgYSBVcmkgd2l0aCB0aGUgY3VycmVudCBhdHRyaWJ1dGVzLgogICAgICAgICAgKgogICAgICAgICAgKiBAdGhyb3dzIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGlmIHRoZSBVUkkgaXMgb3BhcXVlIGFuZCB0aGUKQEAgLTE0OTEsMTkgKzE1MDIsNjAgQEAKICAgICB9CiAKICAgICAvKioKKyAgICAgKiBSZXR1cm5zIGEgc2V0IG9mIHRoZSB1bmlxdWUgbmFtZXMgb2YgYWxsIHF1ZXJ5IHBhcmFtZXRlcnMuIEl0ZXJhdGluZworICAgICAqIG92ZXIgdGhlIHNldCB3aWxsIHJldHVybiB0aGUgbmFtZXMgaW4gb3JkZXIgb2YgdGhlaXIgZmlyc3Qgb2NjdXJyZW5jZS4KKyAgICAgKgorICAgICAqIEB0aHJvd3MgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gaWYgdGhpcyBpc24ndCBhIGhpZXJhcmNoaWNhbCBVUkkKKyAgICAgKgorICAgICAqIEByZXR1cm4gYSBzZXQgb2YgZGVjb2RlZCBuYW1lcworICAgICAqLworICAgIHB1YmxpYyBTZXQ8U3RyaW5nPiBnZXRRdWVyeVBhcmFtZXRlck5hbWVzKCkgeworICAgICAgICBpZiAoaXNPcGFxdWUoKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKE5PVF9ISUVSQVJDSElDQUwpOworICAgICAgICB9CisKKyAgICAgICAgU3RyaW5nIHF1ZXJ5ID0gZ2V0RW5jb2RlZFF1ZXJ5KCk7CisgICAgICAgIGlmIChxdWVyeSA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlTZXQoKTsKKyAgICAgICAgfQorCisgICAgICAgIFNldDxTdHJpbmc+IG5hbWVzID0gbmV3IExpbmtlZEhhc2hTZXQ8U3RyaW5nPigpOworICAgICAgICBpbnQgc3RhcnQgPSAwOworICAgICAgICBkbyB7CisgICAgICAgICAgICBpbnQgbmV4dCA9IHF1ZXJ5LmluZGV4T2YoJyYnLCBzdGFydCk7CisgICAgICAgICAgICBpbnQgZW5kID0gKG5leHQgPT0gLTEpID8gcXVlcnkubGVuZ3RoKCkgOiBuZXh0OworCisgICAgICAgICAgICBpbnQgc2VwYXJhdG9yID0gcXVlcnkuaW5kZXhPZignPScsIHN0YXJ0KTsKKyAgICAgICAgICAgIGlmIChzZXBhcmF0b3IgPiBlbmQgfHwgc2VwYXJhdG9yID09IC0xKSB7CisgICAgICAgICAgICAgICAgc2VwYXJhdG9yID0gZW5kOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBTdHJpbmcgbmFtZSA9IHF1ZXJ5LnN1YnN0cmluZyhzdGFydCwgc2VwYXJhdG9yKTsKKyAgICAgICAgICAgIG5hbWVzLmFkZChkZWNvZGUobmFtZSkpOworCisgICAgICAgICAgICAvLyBNb3ZlIHN0YXJ0IHRvIGVuZCBvZiBuYW1lLgorICAgICAgICAgICAgc3RhcnQgPSBlbmQgKyAxOworICAgICAgICB9IHdoaWxlIChzdGFydCA8IHF1ZXJ5Lmxlbmd0aCgpKTsKKworICAgICAgICByZXR1cm4gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlU2V0KG5hbWVzKTsKKyAgICB9CisKKyAgICAvKioKICAgICAgKiBTZWFyY2hlcyB0aGUgcXVlcnkgc3RyaW5nIGZvciBwYXJhbWV0ZXIgdmFsdWVzIHdpdGggdGhlIGdpdmVuIGtleS4KICAgICAgKgogICAgICAqIEBwYXJhbSBrZXkgd2hpY2ggd2lsbCBiZSBlbmNvZGVkCiAgICAgICoKICAgICAgKiBAdGhyb3dzIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGlmIHRoaXMgaXNuJ3QgYSBoaWVyYXJjaGljYWwgVVJJCiAgICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbiBpZiBrZXkgaXMgbnVsbAotICAgICAqCiAgICAgICogQHJldHVybiBhIGxpc3Qgb2YgZGVjb2RlZCB2YWx1ZXMKICAgICAgKi8KICAgICBwdWJsaWMgTGlzdDxTdHJpbmc+IGdldFF1ZXJ5UGFyYW1ldGVycyhTdHJpbmcga2V5KSB7CiAgICAgICAgIGlmIChpc09wYXF1ZSgpKSB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oTk9UX0hJRVJBUkNISUNBTCk7CiAgICAgICAgIH0KKyAgICAgICAgaWYgKGtleSA9PSBudWxsKSB7CisgICAgICAgICAgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCJrZXkiKTsKKyAgICAgICAgfQogCiAgICAgICAgIFN0cmluZyBxdWVyeSA9IGdldEVuY29kZWRRdWVyeSgpOwogICAgICAgICBpZiAocXVlcnkgPT0gbnVsbCkgewpAQCAtMTUxNywzOSArMTU2OSwzNCBAQAogICAgICAgICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbkVycm9yKGUpOwogICAgICAgICB9CiAKLSAgICAgICAgLy8gUHJlcGVuZCBxdWVyeSB3aXRoICImIiBtYWtpbmcgdGhlIGZpcnN0IHBhcmFtZXRlciB0aGUgc2FtZSBhcyB0aGUKLSAgICAgICAgLy8gcmVzdC4KLSAgICAgICAgcXVlcnkgPSAiJiIgKyBxdWVyeTsKLQotICAgICAgICAvLyBQYXJhbWV0ZXIgcHJlZml4LgotICAgICAgICBTdHJpbmcgcHJlZml4ID0gIiYiICsgZW5jb2RlZEtleSArICI9IjsKLQogICAgICAgICBBcnJheUxpc3Q8U3RyaW5nPiB2YWx1ZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKIAogICAgICAgICBpbnQgc3RhcnQgPSAwOwotICAgICAgICBpbnQgbGVuZ3RoID0gcXVlcnkubGVuZ3RoKCk7Ci0gICAgICAgIHdoaWxlIChzdGFydCA8IGxlbmd0aCkgewotICAgICAgICAgICAgc3RhcnQgPSBxdWVyeS5pbmRleE9mKHByZWZpeCwgc3RhcnQpOworICAgICAgICBkbyB7CisgICAgICAgICAgICBpbnQgbmV4dEFtcGVyc2FuZCA9IHF1ZXJ5LmluZGV4T2YoJyYnLCBzdGFydCk7CisgICAgICAgICAgICBpbnQgZW5kID0gbmV4dEFtcGVyc2FuZCAhPSAtMSA/IG5leHRBbXBlcnNhbmQgOiBxdWVyeS5sZW5ndGgoKTsKIAotICAgICAgICAgICAgaWYgKHN0YXJ0ID09IC0xKSB7Ci0gICAgICAgICAgICAgICAgLy8gTm8gbW9yZSB2YWx1ZXMuCisgICAgICAgICAgICBpbnQgc2VwYXJhdG9yID0gcXVlcnkuaW5kZXhPZignPScsIHN0YXJ0KTsKKyAgICAgICAgICAgIGlmIChzZXBhcmF0b3IgPiBlbmQgfHwgc2VwYXJhdG9yID09IC0xKSB7CisgICAgICAgICAgICAgICAgc2VwYXJhdG9yID0gZW5kOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoc2VwYXJhdG9yIC0gc3RhcnQgPT0gZW5jb2RlZEtleS5sZW5ndGgoKQorICAgICAgICAgICAgICAgICAgICAmJiBxdWVyeS5yZWdpb25NYXRjaGVzKHN0YXJ0LCBlbmNvZGVkS2V5LCAwLCBlbmNvZGVkS2V5Lmxlbmd0aCgpKSkgeworICAgICAgICAgICAgICAgIGlmIChzZXBhcmF0b3IgPT0gZW5kKSB7CisgICAgICAgICAgICAgICAgICB2YWx1ZXMuYWRkKCIiKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgdmFsdWVzLmFkZChkZWNvZGUocXVlcnkuc3Vic3RyaW5nKHNlcGFyYXRvciArIDEsIGVuZCkpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIE1vdmUgc3RhcnQgdG8gZW5kIG9mIG5hbWUuCisgICAgICAgICAgICBpZiAobmV4dEFtcGVyc2FuZCAhPSAtMSkgeworICAgICAgICAgICAgICAgIHN0YXJ0ID0gbmV4dEFtcGVyc2FuZCArIDE7CisgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBNb3ZlIHN0YXJ0IHRvIHN0YXJ0IG9mIHZhbHVlLgotICAgICAgICAgICAgc3RhcnQgKz0gcHJlZml4Lmxlbmd0aCgpOwotCi0gICAgICAgICAgICAvLyBGaW5kIGVuZCBvZiB2YWx1ZS4KLSAgICAgICAgICAgIGludCBlbmQgPSBxdWVyeS5pbmRleE9mKCcmJywgc3RhcnQpOwotICAgICAgICAgICAgaWYgKGVuZCA9PSAtMSkgewotICAgICAgICAgICAgICAgIGVuZCA9IHF1ZXJ5Lmxlbmd0aCgpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBTdHJpbmcgdmFsdWUgPSBxdWVyeS5zdWJzdHJpbmcoc3RhcnQsIGVuZCk7Ci0gICAgICAgICAgICB2YWx1ZXMuYWRkKGRlY29kZSh2YWx1ZSkpOwotCi0gICAgICAgICAgICBzdGFydCA9IGVuZDsKLSAgICAgICAgfQorICAgICAgICB9IHdoaWxlICh0cnVlKTsKIAogICAgICAgICByZXR1cm4gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTGlzdCh2YWx1ZXMpOwogICAgIH0KQEAgLTE1NjAsNyArMTYwNyw2IEBACiAgICAgICogQHBhcmFtIGtleSB3aGljaCB3aWxsIGJlIGVuY29kZWQKICAgICAgKiBAdGhyb3dzIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGlmIHRoaXMgaXNuJ3QgYSBoaWVyYXJjaGljYWwgVVJJCiAgICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbiBpZiBrZXkgaXMgbnVsbAotICAgICAqCiAgICAgICogQHJldHVybiB0aGUgZGVjb2RlZCB2YWx1ZSBvciBudWxsIGlmIG5vIHBhcmFtZXRlciBpcyBmb3VuZAogICAgICAqLwogICAgIHB1YmxpYyBTdHJpbmcgZ2V0UXVlcnlQYXJhbWV0ZXIoU3RyaW5nIGtleSkgewpAQCAtMTU2OCw3ICsxNjE0LDcgQEAKICAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbihOT1RfSElFUkFSQ0hJQ0FMKTsKICAgICAgICAgfQogICAgICAgICBpZiAoa2V5ID09IG51bGwpIHsKLSAgICAgICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oImtleSIpOworICAgICAgICAgICAgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCJrZXkiKTsKICAgICAgICAgfQogCiAgICAgICAgIGZpbmFsIFN0cmluZyBxdWVyeSA9IGdldEVuY29kZWRRdWVyeSgpOwpAQCAtMTU3NywzNyArMTYyMyw1NCBAQAogICAgICAgICB9CiAKICAgICAgICAgZmluYWwgU3RyaW5nIGVuY29kZWRLZXkgPSBlbmNvZGUoa2V5LCBudWxsKTsKLSAgICAgICAgZmluYWwgaW50IGVuY29kZWRLZXlMZW5ndGggPSBlbmNvZGVkS2V5Lmxlbmd0aCgpOworICAgICAgICBmaW5hbCBpbnQgbGVuZ3RoID0gcXVlcnkubGVuZ3RoKCk7CisgICAgICAgIGludCBzdGFydCA9IDA7CisgICAgICAgIGRvIHsKKyAgICAgICAgICAgIGludCBuZXh0QW1wZXJzYW5kID0gcXVlcnkuaW5kZXhPZignJicsIHN0YXJ0KTsKKyAgICAgICAgICAgIGludCBlbmQgPSBuZXh0QW1wZXJzYW5kICE9IC0xID8gbmV4dEFtcGVyc2FuZCA6IGxlbmd0aDsKIAotICAgICAgICBpbnQgZW5jb2RlZEtleVNlYXJjaEluZGV4ID0gMDsKLSAgICAgICAgZmluYWwgaW50IGVuY29kZWRLZXlTZWFyY2hFbmQgPSBxdWVyeS5sZW5ndGgoKSAtIChlbmNvZGVkS2V5TGVuZ3RoICsgMSk7CisgICAgICAgICAgICBpbnQgc2VwYXJhdG9yID0gcXVlcnkuaW5kZXhPZignPScsIHN0YXJ0KTsKKyAgICAgICAgICAgIGlmIChzZXBhcmF0b3IgPiBlbmQgfHwgc2VwYXJhdG9yID09IC0xKSB7CisgICAgICAgICAgICAgICAgc2VwYXJhdG9yID0gZW5kOworICAgICAgICAgICAgfQogCi0gICAgICAgIHdoaWxlIChlbmNvZGVkS2V5U2VhcmNoSW5kZXggPD0gZW5jb2RlZEtleVNlYXJjaEVuZCkgewotICAgICAgICAgICAgaW50IGtleUluZGV4ID0gcXVlcnkuaW5kZXhPZihlbmNvZGVkS2V5LCBlbmNvZGVkS2V5U2VhcmNoSW5kZXgpOwotICAgICAgICAgICAgaWYgKGtleUluZGV4ID09IC0xKSB7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmaW5hbCBpbnQgZXF1YWxzSW5kZXggPSBrZXlJbmRleCArIGVuY29kZWRLZXlMZW5ndGg7Ci0gICAgICAgICAgICBpZiAoZXF1YWxzSW5kZXggPj0gcXVlcnkubGVuZ3RoKCkpIHsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChxdWVyeS5jaGFyQXQoZXF1YWxzSW5kZXgpICE9ICc9JykgewotICAgICAgICAgICAgICAgIGVuY29kZWRLZXlTZWFyY2hJbmRleCA9IGVxdWFsc0luZGV4ICsgMTsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChrZXlJbmRleCA9PSAwIHx8IHF1ZXJ5LmNoYXJBdChrZXlJbmRleCAtIDEpID09ICcmJykgewotICAgICAgICAgICAgICAgIGludCBlbmQgPSBxdWVyeS5pbmRleE9mKCcmJywgZXF1YWxzSW5kZXgpOwotICAgICAgICAgICAgICAgIGlmIChlbmQgPT0gLTEpIHsKLSAgICAgICAgICAgICAgICAgICAgZW5kID0gcXVlcnkubGVuZ3RoKCk7CisgICAgICAgICAgICBpZiAoc2VwYXJhdG9yIC0gc3RhcnQgPT0gZW5jb2RlZEtleS5sZW5ndGgoKQorICAgICAgICAgICAgICAgICAgICAmJiBxdWVyeS5yZWdpb25NYXRjaGVzKHN0YXJ0LCBlbmNvZGVkS2V5LCAwLCBlbmNvZGVkS2V5Lmxlbmd0aCgpKSkgeworICAgICAgICAgICAgICAgIGlmIChzZXBhcmF0b3IgPT0gZW5kKSB7CisgICAgICAgICAgICAgICAgICByZXR1cm4gIiI7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgIHJldHVybiBkZWNvZGUocXVlcnkuc3Vic3RyaW5nKHNlcGFyYXRvciArIDEsIGVuZCkpOwogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gZGVjb2RlKHF1ZXJ5LnN1YnN0cmluZyhlcXVhbHNJbmRleCArIDEsIGVuZCkpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBlbmNvZGVkS2V5U2VhcmNoSW5kZXggPSBlcXVhbHNJbmRleCArIDE7CiAgICAgICAgICAgICB9Ci0gICAgICAgIH0KKworICAgICAgICAgICAgLy8gTW92ZSBzdGFydCB0byBlbmQgb2YgbmFtZS4KKyAgICAgICAgICAgIGlmIChuZXh0QW1wZXJzYW5kICE9IC0xKSB7CisgICAgICAgICAgICAgICAgc3RhcnQgPSBuZXh0QW1wZXJzYW5kICsgMTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0gd2hpbGUgKHRydWUpOwogICAgICAgICByZXR1cm4gbnVsbDsKICAgICB9CiAKKyAgICAvKioKKyAgICAgKiBTZWFyY2hlcyB0aGUgcXVlcnkgc3RyaW5nIGZvciB0aGUgZmlyc3QgdmFsdWUgd2l0aCB0aGUgZ2l2ZW4ga2V5IGFuZCBpbnRlcnByZXRzIGl0CisgICAgICogYXMgYSBib29sZWFuIHZhbHVlLiAiZmFsc2UiIGFuZCAiMCIgYXJlIGludGVycHJldGVkIGFzIDxjb2RlPmZhbHNlPC9jb2RlPiwgZXZlcnl0aGluZworICAgICAqIGVsc2UgaXMgaW50ZXJwcmV0ZWQgYXMgPGNvZGU+dHJ1ZTwvY29kZT4uCisgICAgICoKKyAgICAgKiBAcGFyYW0ga2V5IHdoaWNoIHdpbGwgYmUgZGVjb2RlZAorICAgICAqIEBwYXJhbSBkZWZhdWx0VmFsdWUgdGhlIGRlZmF1bHQgdmFsdWUgdG8gcmV0dXJuIGlmIHRoZXJlIGlzIG5vIHF1ZXJ5IHBhcmFtZXRlciBmb3Iga2V5CisgICAgICogQHJldHVybiB0aGUgYm9vbGVhbiBpbnRlcnByZXRhdGlvbiBvZiB0aGUgcXVlcnkgcGFyYW1ldGVyIGtleQorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGdldEJvb2xlYW5RdWVyeVBhcmFtZXRlcihTdHJpbmcga2V5LCBib29sZWFuIGRlZmF1bHRWYWx1ZSkgeworICAgICAgICBTdHJpbmcgZmxhZyA9IGdldFF1ZXJ5UGFyYW1ldGVyKGtleSk7CisgICAgICAgIGlmIChmbGFnID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBkZWZhdWx0VmFsdWU7CisgICAgICAgIH0KKyAgICAgICAgZmxhZyA9IGZsYWcudG9Mb3dlckNhc2UoKTsKKyAgICAgICAgcmV0dXJuICghImZhbHNlIi5lcXVhbHMoZmxhZykgJiYgISIwIi5lcXVhbHMoZmxhZykpOworICAgIH0KKwogICAgIC8qKiBJZGVudGlmaWVzIGEgbnVsbCBwYXJjZWxsZWQgVXJpLiAqLwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBOVUxMX1RZUEVfSUQgPSAwOwogCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9uZXQvV2ViQWRkcmVzcy5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvbmV0L1dlYkFkZHJlc3MuamF2YQppbmRleCA0MTAxYWI0Li45YzRkNmU4IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9uZXQvV2ViQWRkcmVzcy5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL25ldC9XZWJBZGRyZXNzLmphdmEKQEAgLTU2LDcgKzU2LDcgQEAKICAgICBzdGF0aWMgUGF0dGVybiBzQWRkcmVzc1BhdHRlcm4gPSBQYXR0ZXJuLmNvbXBpbGUoCiAgICAgICAgICAgICAvKiBzY2hlbWUgICAgKi8gIig/OihodHRwfGh0dHBzfGZpbGUpXFw6XFwvXFwvKT8iICsKICAgICAgICAgICAgIC8qIGF1dGhvcml0eSAqLyAiKD86KFstQS1aYS16MC05JF8uKyEqJygpLDs/Jj1dKyg/OlxcOlstQS1aYS16MC05JF8uKyEqJygpLDs/Jj1dKyk/KUApPyIgKwotICAgICAgICAgICAgLyogaG9zdCAgICAgICovICIoWy0iICsgR09PRF9JUklfQ0hBUiArICIlX10rKD86XFwuWy0iICsgR09PRF9JUklfQ0hBUiArICIlX10rKSp8XFxbWzAtOWEtZkEtRjpcXC5dK1xcXSk/IiArCisgICAgICAgICAgICAvKiBob3N0ICAgICAgKi8gIihbIiArIEdPT0RfSVJJX0NIQVIgKyAiJV8tXVsiICsgR09PRF9JUklfQ0hBUiArICIlX1xcLi1dKnxcXFtbMC05YS1mQS1GOlxcLl0rXFxdKT8iICsKICAgICAgICAgICAgIC8qIHBvcnQgICAgICAqLyAiKD86XFw6KFswLTldKikpPyIgKwogICAgICAgICAgICAgLyogcGF0aCAgICAgICovICIoXFwvP1teI10qKT8iICsKICAgICAgICAgICAgIC8qIGFuY2hvciAgICAqLyAiLioiLCBQYXR0ZXJuLkNBU0VfSU5TRU5TSVRJVkUpOwpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvbmV0L2h0dHAvQW5kcm9pZEh0dHBDbGllbnQuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL25ldC9odHRwL0FuZHJvaWRIdHRwQ2xpZW50LmphdmEKaW5kZXggZTA3ZWU1OS4uOTE1ZTM0MiAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvbmV0L2h0dHAvQW5kcm9pZEh0dHBDbGllbnQuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9uZXQvaHR0cC9BbmRyb2lkSHR0cENsaWVudC5qYXZhCkBAIC02MSw2ICs2MSw3IEBACiBpbXBvcnQgYW5kcm9pZC5uZXQuU1NMQ2VydGlmaWNhdGVTb2NrZXRGYWN0b3J5OwogaW1wb3J0IGFuZHJvaWQubmV0LlNTTFNlc3Npb25DYWNoZTsKIGltcG9ydCBhbmRyb2lkLm9zLkxvb3BlcjsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuQmFzZTY0OwogaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CiAKIC8qKgpAQCAtODEsNiArODIsMTEgQEAKIAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiQW5kcm9pZEh0dHBDbGllbnQiOwogCisgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nW10gdGV4dENvbnRlbnRUeXBlcyA9IG5ldyBTdHJpbmdbXSB7CisgICAgICAgICAgICAidGV4dC8iLAorICAgICAgICAgICAgImFwcGxpY2F0aW9uL3htbCIsCisgICAgICAgICAgICAiYXBwbGljYXRpb24vanNvbiIKKyAgICB9OwogCiAgICAgLyoqIEludGVyY2VwdG9yIHRocm93cyBhbiBleGNlcHRpb24gaWYgdGhlIGV4ZWN1dGluZyB0aHJlYWQgaXMgYmxvY2tlZCAqLwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEh0dHBSZXF1ZXN0SW50ZXJjZXB0b3Igc1RocmVhZENoZWNrSW50ZXJjZXB0b3IgPQpAQCAtMzU4LDcgKzM2NCw3IEBACiAgICAgICAgIH0KICAgICAgICAgaWYgKGxldmVsIDwgTG9nLlZFUkJPU0UgfHwgbGV2ZWwgPiBMb2cuQVNTRVJUKSB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJMZXZlbCBpcyBvdXQgb2YgcmFuZ2UgWyIKLSAgICAgICAgICAgICAgICArIExvZy5WRVJCT1NFICsgIi4uIiArIExvZy5BU1NFUlQgKyAiXSIpOyAgICAKKyAgICAgICAgICAgICAgICArIExvZy5WRVJCT1NFICsgIi4uIiArIExvZy5BU1NFUlQgKyAiXSIpOwogICAgICAgICB9CiAKICAgICAgICAgY3VybENvbmZpZ3VyYXRpb24gPSBuZXcgTG9nZ2luZ0NvbmZpZ3VyYXRpb24obmFtZSwgbGV2ZWwpOwpAQCAtNDMxLDEyICs0MzcsMTcgQEAKICAgICAgICAgICAgICAgICBpZiAoZW50aXR5LmdldENvbnRlbnRMZW5ndGgoKSA8IDEwMjQpIHsKICAgICAgICAgICAgICAgICAgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIHN0cmVhbSA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKICAgICAgICAgICAgICAgICAgICAgZW50aXR5LndyaXRlVG8oc3RyZWFtKTsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGVudGl0eVN0cmluZyA9IHN0cmVhbS50b1N0cmluZygpOwogCi0gICAgICAgICAgICAgICAgICAgIC8vIFRPRE86IENoZWNrIHRoZSBjb250ZW50IHR5cGUsIHRvby4KLSAgICAgICAgICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoIiAtLWRhdGEtYXNjaWkgXCIiKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hcHBlbmQoZW50aXR5U3RyaW5nKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hcHBlbmQoIlwiIik7CisgICAgICAgICAgICAgICAgICAgIGlmIChpc0JpbmFyeUNvbnRlbnQocmVxdWVzdCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBiYXNlNjQgPSBCYXNlNjQuZW5jb2RlVG9TdHJpbmcoc3RyZWFtLnRvQnl0ZUFycmF5KCksIEJhc2U2NC5OT19XUkFQKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIuaW5zZXJ0KDAsICJlY2hvICciICsgYmFzZTY0ICsgIicgfCBiYXNlNjQgLWQgPiAvdG1wLyQkLmJpbjsgIik7CisgICAgICAgICAgICAgICAgICAgICAgICBidWlsZGVyLmFwcGVuZCgiIC0tZGF0YS1iaW5hcnkgQC90bXAvJCQuYmluIik7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgZW50aXR5U3RyaW5nID0gc3RyZWFtLnRvU3RyaW5nKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBidWlsZGVyLmFwcGVuZCgiIC0tZGF0YS1hc2NpaSBcIiIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hcHBlbmQoZW50aXR5U3RyaW5nKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYXBwZW5kKCJcIiIpOworICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoIiBbVE9PIE1VQ0ggREFUQSBUTyBJTkNMVURFXSIpOwogICAgICAgICAgICAgICAgIH0KQEAgLTQ0Niw2ICs0NTcsMzAgQEAKICAgICAgICAgcmV0dXJuIGJ1aWxkZXIudG9TdHJpbmcoKTsKICAgICB9CiAKKyAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzQmluYXJ5Q29udGVudChIdHRwVXJpUmVxdWVzdCByZXF1ZXN0KSB7CisgICAgICAgIEhlYWRlcltdIGhlYWRlcnM7CisgICAgICAgIGhlYWRlcnMgPSByZXF1ZXN0LmdldEhlYWRlcnMoSGVhZGVycy5DT05URU5UX0VOQ09ESU5HKTsKKyAgICAgICAgaWYgKGhlYWRlcnMgIT0gbnVsbCkgeworICAgICAgICAgICAgZm9yIChIZWFkZXIgaGVhZGVyIDogaGVhZGVycykgeworICAgICAgICAgICAgICAgIGlmICgiZ3ppcCIuZXF1YWxzSWdub3JlQ2FzZShoZWFkZXIuZ2V0VmFsdWUoKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaGVhZGVycyA9IHJlcXVlc3QuZ2V0SGVhZGVycyhIZWFkZXJzLkNPTlRFTlRfVFlQRSk7CisgICAgICAgIGlmIChoZWFkZXJzICE9IG51bGwpIHsKKyAgICAgICAgICAgIGZvciAoSGVhZGVyIGhlYWRlciA6IGhlYWRlcnMpIHsKKyAgICAgICAgICAgICAgICBmb3IgKFN0cmluZyBjb250ZW50VHlwZSA6IHRleHRDb250ZW50VHlwZXMpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGhlYWRlci5nZXRWYWx1ZSgpLnN0YXJ0c1dpdGgoY29udGVudFR5cGUpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCiAgICAgLyoqCiAgICAgICogUmV0dXJucyB0aGUgZGF0ZSBvZiB0aGUgZ2l2ZW4gSFRUUCBkYXRlIHN0cmluZy4gVGhpcyBtZXRob2QgY2FuIGlkZW50aWZ5CiAgICAgICogYW5kIHBhcnNlIHRoZSBkYXRlIGZvcm1hdHMgZW1pdHRlZCBieSBjb21tb24gSFRUUCBzZXJ2ZXJzLCBzdWNoIGFzCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9uZXQvaHR0cC9DZXJ0aWZpY2F0ZUNoYWluVmFsaWRhdG9yLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9uZXQvaHR0cC9DZXJ0aWZpY2F0ZUNoYWluVmFsaWRhdG9yLmphdmEKaW5kZXggNGNhNTkwMy4uNTAzYzQ3MCAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvbmV0L2h0dHAvQ2VydGlmaWNhdGVDaGFpblZhbGlkYXRvci5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL25ldC9odHRwL0NlcnRpZmljYXRlQ2hhaW5WYWxpZGF0b3IuamF2YQpAQCAtODAsMTQgKzgwLDEwIEBACiAgICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICBYNTA5Q2VydGlmaWNhdGVbXSBzZXJ2ZXJDZXJ0aWZpY2F0ZXMgPSBudWxsOwogCi0gICAgICAgIC8vIHN0YXJ0IGhhbmRzaGFrZSwgY2xvc2UgdGhlIHNvY2tldCBpZiB3ZSBmYWlsCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBzc2xTb2NrZXQuc2V0VXNlQ2xpZW50TW9kZSh0cnVlKTsKLSAgICAgICAgICAgIHNzbFNvY2tldC5zdGFydEhhbmRzaGFrZSgpOwotICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBjbG9zZVNvY2tldFRocm93RXhjZXB0aW9uKAotICAgICAgICAgICAgICAgIHNzbFNvY2tldCwgZS5nZXRNZXNzYWdlKCksCi0gICAgICAgICAgICAgICAgImZhaWxlZCB0byBwZXJmb3JtIFNTTCBoYW5kc2hha2UiKTsKKyAgICAgICAgLy8gZ2V0IGEgdmFsaWQgU1NMU2Vzc2lvbiwgY2xvc2UgdGhlIHNvY2tldCBpZiB3ZSBmYWlsCisgICAgICAgIFNTTFNlc3Npb24gc3NsU2Vzc2lvbiA9IHNzbFNlc3Npb24gPSBzc2xTb2NrZXQuZ2V0U2Vzc2lvbigpOworICAgICAgICBpZiAoIXNzbFNlc3Npb24uaXNWYWxpZCgpKSB7CisgICAgICAgICAgICBjbG9zZVNvY2tldFRocm93RXhjZXB0aW9uKHNzbFNvY2tldCwgImZhaWxlZCB0byBwZXJmb3JtIFNTTCBoYW5kc2hha2UiKTsKICAgICAgICAgfQogCiAgICAgICAgIC8vIHJldHJpZXZlIHRoZSBjaGFpbiBvZiB0aGUgc2VydmVyIHBlZXIgY2VydGlmaWNhdGVzCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9vcy9Bc3luY1Rhc2suamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL29zL0FzeW5jVGFzay5qYXZhCmluZGV4IDVmYjFkN2MuLmYwMzA5ZDYgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL29zL0FzeW5jVGFzay5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL29zL0FzeW5jVGFzay5qYXZhCkBAIC0xNiwxNiArMTYsMTYgQEAKIAogcGFja2FnZSBhbmRyb2lkLm9zOwogCi1pbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yOwotaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0OwogaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkJsb2NraW5nUXVldWU7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQ2FsbGFibGU7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQ2FuY2VsbGF0aW9uRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5GdXR1cmVUYXNrOwogaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkxpbmtlZEJsb2NraW5nUXVldWU7CiBpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkRmFjdG9yeTsKLWltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5DYWxsYWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5GdXR1cmVUYXNrOwotaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRQb29sRXhlY3V0b3I7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQ7CiBpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZW91dEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5DYW5jZWxsYXRpb25FeGNlcHRpb247CiBpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuYXRvbWljLkF0b21pY0ludGVnZXI7CiAKIC8qKgpAQCAtMzYsOCArMzYsOCBAQAogICogPHA+QW4gYXN5bmNocm9ub3VzIHRhc2sgaXMgZGVmaW5lZCBieSBhIGNvbXB1dGF0aW9uIHRoYXQgcnVucyBvbiBhIGJhY2tncm91bmQgdGhyZWFkIGFuZAogICogd2hvc2UgcmVzdWx0IGlzIHB1Ymxpc2hlZCBvbiB0aGUgVUkgdGhyZWFkLiBBbiBhc3luY2hyb25vdXMgdGFzayBpcyBkZWZpbmVkIGJ5IDMgZ2VuZXJpYwogICogdHlwZXMsIGNhbGxlZCA8Y29kZT5QYXJhbXM8L2NvZGU+LCA8Y29kZT5Qcm9ncmVzczwvY29kZT4gYW5kIDxjb2RlPlJlc3VsdDwvY29kZT4sCi0gKiBhbmQgNCBzdGVwcywgY2FsbGVkIDxjb2RlPmJlZ2luPC9jb2RlPiwgPGNvZGU+ZG9JbkJhY2tncm91bmQ8L2NvZGU+LAotICogPGNvZGU+cHJvY2Vzc1Byb2dyZXNzPC9jb2RlPiBhbmQgPGNvZGU+ZW5kPC9jb2RlPi48L3A+CisgKiBhbmQgNCBzdGVwcywgY2FsbGVkIDxjb2RlPm9uUHJlRXhlY3V0ZTwvY29kZT4sIDxjb2RlPmRvSW5CYWNrZ3JvdW5kPC9jb2RlPiwKKyAqIDxjb2RlPm9uUHJvZ3Jlc3NVcGRhdGU8L2NvZGU+IGFuZCA8Y29kZT5vblBvc3RFeGVjdXRlPC9jb2RlPi48L3A+CiAgKgogICogPGgyPlVzYWdlPC9oMj4KICAqIDxwPkFzeW5jVGFzayBtdXN0IGJlIHN1YmNsYXNzZWQgdG8gYmUgdXNlZC4gVGhlIHN1YmNsYXNzIHdpbGwgb3ZlcnJpZGUgYXQgbGVhc3QKQEAgLTEyMyw2ICsxMjMsMTYgQEAKICAqICAgICA8bGk+VGhlIHRhc2sgY2FuIGJlIGV4ZWN1dGVkIG9ubHkgb25jZSAoYW4gZXhjZXB0aW9uIHdpbGwgYmUgdGhyb3duIGlmCiAgKiAgICAgYSBzZWNvbmQgZXhlY3V0aW9uIGlzIGF0dGVtcHRlZC4pPC9saT4KICAqIDwvdWw+CisgKgorICogPGgyPk1lbW9yeSBvYnNlcnZhYmlsaXR5PC9oMj4KKyAqIDxwPkFzeW5jVGFzayBndWFyYW50ZWVzIHRoYXQgYWxsIGNhbGxiYWNrIGNhbGxzIGFyZSBzeW5jaHJvbml6ZWQgaW4gc3VjaCBhIHdheSB0aGF0IHRoZSBmb2xsb3dpbmcKKyAqIG9wZXJhdGlvbnMgYXJlIHNhZmUgd2l0aG91dCBleHBsaWNpdCBzeW5jaHJvbml6YXRpb25zLjwvcD4KKyAqIDx1bD4KKyAqICAgICA8bGk+U2V0IG1lbWJlciBmaWVsZHMgaW4gdGhlIGNvbnN0cnVjdG9yIG9yIHtAbGluayAjb25QcmVFeGVjdXRlfSwgYW5kIHJlZmVyIHRvIHRoZW0KKyAqICAgICBpbiB7QGxpbmsgI2RvSW5CYWNrZ3JvdW5kfS4KKyAqICAgICA8bGk+U2V0IG1lbWJlciBmaWVsZHMgaW4ge0BsaW5rICNkb0luQmFja2dyb3VuZH0sIGFuZCByZWZlciB0byB0aGVtIGluCisgKiAgICAge0BsaW5rICNvblByb2dyZXNzVXBkYXRlfSBhbmQge0BsaW5rICNvblBvc3RFeGVjdXRlfS4KKyAqIDwvdWw+CiAgKi8KIHB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBc3luY1Rhc2s8UGFyYW1zLCBQcm9ncmVzcywgUmVzdWx0PiB7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIExPR19UQUcgPSAiQXN5bmNUYXNrIjsKQEAgLTE3NSw2ICsxODUsMTEgQEAKICAgICAgICAgRklOSVNIRUQsCiAgICAgfQogCisgICAgLyoqIEBoaWRlIFVzZWQgdG8gZm9yY2Ugc3RhdGljIGhhbmRsZXIgdG8gYmUgY3JlYXRlZC4gKi8KKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgaW5pdCgpIHsKKyAgICAgICAgc0hhbmRsZXIuZ2V0TG9vcGVyKCk7CisgICAgfQorCiAgICAgLyoqCiAgICAgICogQ3JlYXRlcyBhIG5ldyBhc3luY2hyb25vdXMgdGFzay4gVGhpcyBjb25zdHJ1Y3RvciBtdXN0IGJlIGludm9rZWQgb24gdGhlIFVJIHRocmVhZC4KICAgICAgKi8KQEAgLTE4Nyw2ICsyMDIsMTcgQEAKICAgICAgICAgfTsKIAogICAgICAgICBtRnV0dXJlID0gbmV3IEZ1dHVyZVRhc2s8UmVzdWx0PihtV29ya2VyKSB7CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHJvdGVjdGVkIHZvaWQgc2V0KFJlc3VsdCB2KSB7CisgICAgICAgICAgICAgICAgc3VwZXIuc2V0KHYpOworICAgICAgICAgICAgICAgIGlmIChpc0NhbmNlbGxlZCgpKSB7CisgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgbWVzc2FnZSA9IHNIYW5kbGVyLm9idGFpbk1lc3NhZ2UoTUVTU0FHRV9QT1NUX0NBTkNFTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQXN5bmNUYXNrUmVzdWx0PFJlc3VsdD4oQXN5bmNUYXNrLnRoaXMsIChSZXN1bHRbXSkgbnVsbCkpOworICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnNlbmRUb1RhcmdldCgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgICAgICBwcm90ZWN0ZWQgdm9pZCBkb25lKCkgewogICAgICAgICAgICAgICAgIE1lc3NhZ2UgbWVzc2FnZTsKQEAgLTQwMiwxNCArNDI4LDE5IEBACiAgICAgICogc3RpbGwgcnVubmluZy4gRWFjaCBjYWxsIHRvIHRoaXMgbWV0aG9kIHdpbGwgdHJpZ2dlciB0aGUgZXhlY3V0aW9uIG9mCiAgICAgICoge0BsaW5rICNvblByb2dyZXNzVXBkYXRlfSBvbiB0aGUgVUkgdGhyZWFkLgogICAgICAqCisgICAgICoge0BsaW5rICNvblByb2dyZXNzVXBkYXRlfSB3aWxsIG5vdGUgYmUgY2FsbGVkIGlmIHRoZSB0YXNrIGhhcyBiZWVuCisgICAgICogY2FuY2VsZWQuCisgICAgICoKICAgICAgKiBAcGFyYW0gdmFsdWVzIFRoZSBwcm9ncmVzcyB2YWx1ZXMgdG8gdXBkYXRlIHRoZSBVSSB3aXRoLgogICAgICAqCiAgICAgICogQHNlZSAjb25Qcm9ncmVzc1VwZGF0ZQogICAgICAqIEBzZWUgI2RvSW5CYWNrZ3JvdW5kCiAgICAgICovCiAgICAgcHJvdGVjdGVkIGZpbmFsIHZvaWQgcHVibGlzaFByb2dyZXNzKFByb2dyZXNzLi4uIHZhbHVlcykgewotICAgICAgICBzSGFuZGxlci5vYnRhaW5NZXNzYWdlKE1FU1NBR0VfUE9TVF9QUk9HUkVTUywKLSAgICAgICAgICAgICAgICBuZXcgQXN5bmNUYXNrUmVzdWx0PFByb2dyZXNzPih0aGlzLCB2YWx1ZXMpKS5zZW5kVG9UYXJnZXQoKTsKKyAgICAgICAgaWYgKCFpc0NhbmNlbGxlZCgpKSB7CisgICAgICAgICAgICBzSGFuZGxlci5vYnRhaW5NZXNzYWdlKE1FU1NBR0VfUE9TVF9QUk9HUkVTUywKKyAgICAgICAgICAgICAgICAgICAgbmV3IEFzeW5jVGFza1Jlc3VsdDxQcm9ncmVzcz4odGhpcywgdmFsdWVzKSkuc2VuZFRvVGFyZ2V0KCk7CisgICAgICAgIH0KICAgICB9CiAKICAgICBwcml2YXRlIHZvaWQgZmluaXNoKFJlc3VsdCByZXN1bHQpIHsKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL29zL0J1aWxkLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9vcy9CdWlsZC5qYXZhCmluZGV4IDg5MjViZDAuLjkyNjhjZDEgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL29zL0J1aWxkLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvb3MvQnVpbGQuamF2YQpAQCAtMTk5LDYgKzE5OSwxOCBAQAogICAgICAgICAgKiA8L3VsPgogICAgICAgICAgKi8KICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0lOR0VSQlJFQUQgPSBDVVJfREVWRUxPUE1FTlQ7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIE5leHQgbmV4dCB2ZXJzaW9uIG9mIEFuZHJvaWQuCisgICAgICAgICAqCisgICAgICAgICAqIDxwPkFwcGxpY2F0aW9ucyB0YXJnZXRpbmcgdGhpcyBvciBhIGxhdGVyIHJlbGVhc2Ugd2lsbCBnZXQgdGhlc2UKKyAgICAgICAgICogbmV3IGNoYW5nZXMgaW4gYmVoYXZpb3I6PC9wPgorICAgICAgICAgKiA8dWw+CisgICAgICAgICAqIDxsaT4gVGhlIGRlZmF1bHQgdGhlbWUgZm9yIGFwcGxpY2F0aW9ucyBpcyBub3cgZGFyayBob2xvZ3JhcGhpYzoKKyAgICAgICAgICogICAgICB7QGxpbmsgYW5kcm9pZC5SLnN0eWxlI1RoZW1lX0hvbG99LgorICAgICAgICAgKiA8L3VsPgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSE9ORVlDT01CID0gQ1VSX0RFVkVMT1BNRU5UOwogICAgIH0KICAgICAKICAgICAvKiogVGhlIHR5cGUgb2YgYnVpbGQsIGxpa2UgInVzZXIiIG9yICJlbmciLiAqLwpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvb3MvRGVidWcuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL29zL0RlYnVnLmphdmEKaW5kZXggODZmOWE2Yi4uYTU4ZTcwYiAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvb3MvRGVidWcuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9vcy9EZWJ1Zy5qYXZhCkBAIC03MzEsNyArNzMxLDcgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBEdW1wICJocHJvZiIgZGF0YSB0byB0aGUgc3BlY2lmaWVkIGZpbGUuICBUaGlzIHdpbGwgY2F1c2UgYSBHQy4KKyAgICAgKiBEdW1wICJocHJvZiIgZGF0YSB0byB0aGUgc3BlY2lmaWVkIGZpbGUuICBUaGlzIG1heSBjYXVzZSBhIEdDLgogICAgICAqCiAgICAgICogQHBhcmFtIGZpbGVOYW1lIEZ1bGwgcGF0aG5hbWUgb2Ygb3V0cHV0IGZpbGUgKGUuZy4gIi9zZGNhcmQvZHVtcC5ocHJvZiIpLgogICAgICAqIEB0aHJvd3MgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gaWYgdGhlIFZNIHdhcyBidWlsdCB3aXRob3V0CkBAIC03NDMsMTEgKzc0MywyNCBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIENvbGxlY3QgImhwcm9mIiBhbmQgc2VuZCBpdCB0byBERE1TLiAgVGhpcyB3aWxsIGNhdXNlIGEgR0MuCisgICAgICogTGlrZSBkdW1wSHByb2ZEYXRhKFN0cmluZyksIGJ1dCB0YWtlcyBhbiBhbHJlYWR5LW9wZW5lZAorICAgICAqIEZpbGVEZXNjcmlwdG9yIHRvIHdoaWNoIHRoZSB0cmFjZSBpcyB3cml0dGVuLiAgVGhlIGZpbGUgbmFtZSBpcyBhbHNvCisgICAgICogc3VwcGxpZWQgc2ltcGx5IGZvciBsb2dnaW5nLiAgTWFrZXMgYSBkdXAgb2YgdGhlIGZpbGUgZGVzY3JpcHRvci4KKyAgICAgKgorICAgICAqIFByaW1hcmlseSBmb3IgdXNlIGJ5IHRoZSAiYW0iIHNoZWxsIGNvbW1hbmQuCisgICAgICoKKyAgICAgKiBAaGlkZQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBkdW1wSHByb2ZEYXRhKFN0cmluZyBmaWxlTmFtZSwgRmlsZURlc2NyaXB0b3IgZmQpCisgICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBWTURlYnVnLmR1bXBIcHJvZkRhdGEoZmlsZU5hbWUsIGZkKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb2xsZWN0ICJocHJvZiIgYW5kIHNlbmQgaXQgdG8gRERNUy4gIFRoaXMgbWF5IGNhdXNlIGEgR0MuCiAgICAgICoKICAgICAgKiBAdGhyb3dzIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGlmIHRoZSBWTSB3YXMgYnVpbHQgd2l0aG91dAogICAgICAqICAgICAgICAgSFBST0Ygc3VwcG9ydC4KLSAgICAgKgogICAgICAqIEBoaWRlCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyB2b2lkIGR1bXBIcHJvZkRhdGFEZG1zKCkgewpAQCAtNzU1LDYgKzc2OCwxMyBAQAogICAgIH0KIAogICAgIC8qKgorICAgICAqIFdyaXRlcyBuYXRpdmUgaGVhcCBkYXRhIHRvIHRoZSBzcGVjaWZpZWQgZmlsZSBkZXNjcmlwdG9yLgorICAgICAqCisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIG5hdGl2ZSB2b2lkIGR1bXBOYXRpdmVIZWFwKEZpbGVEZXNjcmlwdG9yIGZkKTsKKworICAgIC8qKgogICAgICAqIFJldHVybnMgdGhlIG51bWJlciBvZiBzZW50IHRyYW5zYWN0aW9ucyBmcm9tIHRoaXMgcHJvY2Vzcy4KICAgICAgKiBAcmV0dXJuIFRoZSBudW1iZXIgb2Ygc2VudCB0cmFuc2FjdGlvbnMgb3IgLTEgaWYgaXQgY291bGQgbm90IHJlYWQgdC4KICAgICAgKi8KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL29zL0ZpbGVVdGlscy5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvb3MvRmlsZVV0aWxzLmphdmEKaW5kZXggYTE3YjdmZS4uNzJlMjFkZSAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvb3MvRmlsZVV0aWxzLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvb3MvRmlsZVV0aWxzLmphdmEKQEAgLTg1LDYgKzg1LDggQEAKIAogICAgIHB1YmxpYyBzdGF0aWMgbmF0aXZlIGludCBnZXRQZXJtaXNzaW9ucyhTdHJpbmcgZmlsZSwgaW50W10gb3V0UGVybWlzc2lvbnMpOwogCisgICAgcHVibGljIHN0YXRpYyBuYXRpdmUgaW50IHNldFVNYXNrKGludCBtYXNrKTsKKwogICAgIC8qKiByZXR1cm5zIHRoZSBGQVQgZmlsZSBzeXN0ZW0gdm9sdW1lIElEIGZvciB0aGUgdm9sdW1lIG1vdW50ZWQgCiAgICAgICogYXQgdGhlIGdpdmVuIG1vdW50IHBvaW50LCBvciAtMSBmb3IgZmFpbHVyZQogICAgICAqIEBwYXJhbSBtb3VudCBwb2ludCBmb3IgRkFUIHZvbHVtZQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvb3MvSGFuZGxlci5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvb3MvSGFuZGxlci5qYXZhCmluZGV4IDNiMmJmMWUuLjE2NWU0MzggMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL29zL0hhbmRsZXIuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9vcy9IYW5kbGVyLmphdmEKQEAgLTU4LDcgKzU4LDcgQEAKICAqIHRoZXkgY3JlYXRlLiAgWW91IGNhbiBjcmVhdGUgeW91ciBvd24gdGhyZWFkcywgYW5kIGNvbW11bmljYXRlIGJhY2sgd2l0aAogICogdGhlIG1haW4gYXBwbGljYXRpb24gdGhyZWFkIHRocm91Z2ggYSBIYW5kbGVyLiAgVGhpcyBpcyBkb25lIGJ5IGNhbGxpbmcKICAqIHRoZSBzYW1lIDxlbT5wb3N0PC9lbT4gb3IgPGVtPnNlbmRNZXNzYWdlPC9lbT4gbWV0aG9kcyBhcyBiZWZvcmUsIGJ1dCBmcm9tCi0gKiB5b3VyIG5ldyB0aHJlYWQuICBUaGUgZ2l2ZW4gUnVubmFibGUgb3IgTWVzc2FnZSB3aWxsIHRoYW4gYmUgc2NoZWR1bGVkCisgKiB5b3VyIG5ldyB0aHJlYWQuICBUaGUgZ2l2ZW4gUnVubmFibGUgb3IgTWVzc2FnZSB3aWxsIHRoZW4gYmUgc2NoZWR1bGVkCiAgKiBpbiB0aGUgSGFuZGxlcidzIG1lc3NhZ2UgcXVldWUgYW5kIHByb2Nlc3NlZCB3aGVuIGFwcHJvcHJpYXRlLgogICovCiBwdWJsaWMgY2xhc3MgSGFuZGxlciB7CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9vcy9NZW1vcnlGaWxlLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9vcy9NZW1vcnlGaWxlLmphdmEKaW5kZXggYTgxZTE2Yi4uZjgyNzAyYSAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvb3MvTWVtb3J5RmlsZS5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL29zL01lbW9yeUZpbGUuamF2YQpAQCAtNTgsNyArNTgsNiBAQAogICAgIHByaXZhdGUgaW50IG1BZGRyZXNzOyAgIC8vIGFkZHJlc3Mgb2YgYXNobWVtIG1lbW9yeQogICAgIHByaXZhdGUgaW50IG1MZW5ndGg7ICAgIC8vIHRvdGFsIGxlbmd0aCBvZiBvdXIgYXNobWVtIHJlZ2lvbgogICAgIHByaXZhdGUgYm9vbGVhbiBtQWxsb3dQdXJnaW5nID0gZmFsc2U7ICAvLyB0cnVlIGlmIG91ciBhc2htZW0gcmVnaW9uIGlzIHVucGlubmVkCi0gICAgcHJpdmF0ZSBmaW5hbCBib29sZWFuIG1Pd25zUmVnaW9uOyAgLy8gZmFsc2UgaWYgdGhpcyBpcyBhIHJlZiB0byBhbiBleGlzdGluZyBhc2htZW0gcmVnaW9uCiAKICAgICAvKioKICAgICAgKiBBbGxvY2F0ZXMgYSBuZXcgYXNobWVtIHJlZ2lvbi4gVGhlIHJlZ2lvbiBpcyBpbml0aWFsbHkgbm90IHB1cmdhYmxlLgpAQCAtNzAsMzggKzY5LDExIEBACiAgICAgcHVibGljIE1lbW9yeUZpbGUoU3RyaW5nIG5hbWUsIGludCBsZW5ndGgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIG1MZW5ndGggPSBsZW5ndGg7CiAgICAgICAgIG1GRCA9IG5hdGl2ZV9vcGVuKG5hbWUsIGxlbmd0aCk7Ci0gICAgICAgIG1BZGRyZXNzID0gbmF0aXZlX21tYXAobUZELCBsZW5ndGgsIFBST1RfUkVBRCB8IFBST1RfV1JJVEUpOwotICAgICAgICBtT3duc1JlZ2lvbiA9IHRydWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIHJlZmVyZW5jZSB0byBhbiBleGlzdGluZyBtZW1vcnkgZmlsZS4gQ2hhbmdlcyB0byB0aGUgb3JpZ2luYWwgZmlsZQotICAgICAqIHdpbGwgYmUgYXZhaWxhYmxlIHRocm91Z2ggdGhpcyByZWZlcmVuY2UuCi0gICAgICogQ2FsbHMgdG8ge0BsaW5rICNhbGxvd1B1cmdpbmcoYm9vbGVhbil9IG9uIHRoZSByZXR1cm5lZCBNZW1vcnlGaWxlIHdpbGwgZmFpbC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBmZCBGaWxlIGRlc2NyaXB0b3IgZm9yIGFuIGV4aXN0aW5nIG1lbW9yeSBmaWxlLCBhcyByZXR1cm5lZCBieQotICAgICAqICAgICAgICB7QGxpbmsgI2dldEZpbGVEZXNjcmlwdG9yKCl9LiBUaGlzIGZpbGUgZGVzY3JpcHRvciB3aWxsIGJlIGNsb3NlZAotICAgICAqICAgICAgICBieSB7QGxpbmsgI2Nsb3NlKCl9LgotICAgICAqIEBwYXJhbSBsZW5ndGggTGVuZ3RoIG9mIHRoZSBtZW1vcnkgZmlsZSBpbiBieXRlcy4KLSAgICAgKiBAcGFyYW0gbW9kZSBGaWxlIG1vZGUuIEN1cnJlbnRseSBvbmx5ICJyIiBmb3IgcmVhZC1vbmx5IGFjY2VzcyBpcyBzdXBwb3J0ZWQuCi0gICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbiBpZiA8Y29kZT5mZDwvY29kZT4gaXMgbnVsbC4KLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIElmIDxjb2RlPmZkPC9jb2RlPiBkb2VzIG5vdCByZWZlciB0byBhbiBleGlzdGluZyBtZW1vcnkgZmlsZSwKLSAgICAgKiAgICAgICAgIG9yIGlmIHRoZSBmaWxlIG1vZGUgb2YgdGhlIGV4aXN0aW5nIG1lbW9yeSBmaWxlIGlzIG1vcmUgcmVzdHJpY3RpdmUKLSAgICAgKiAgICAgICAgIHRoYW4gPGNvZGU+bW9kZTwvY29kZT4uCi0gICAgICoKLSAgICAgKiBAaGlkZQotICAgICAqLwotICAgIHB1YmxpYyBNZW1vcnlGaWxlKEZpbGVEZXNjcmlwdG9yIGZkLCBpbnQgbGVuZ3RoLCBTdHJpbmcgbW9kZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKGZkID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigiRmlsZSBkZXNjcmlwdG9yIGlzIG51bGwuIik7CisgICAgICAgIGlmIChsZW5ndGggPiAwKSB7CisgICAgICAgICAgICBtQWRkcmVzcyA9IG5hdGl2ZV9tbWFwKG1GRCwgbGVuZ3RoLCBQUk9UX1JFQUQgfCBQUk9UX1dSSVRFKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1BZGRyZXNzID0gMDsKICAgICAgICAgfQotICAgICAgICBpZiAoIWlzTWVtb3J5RmlsZShmZCkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIk5vdCBhIG1lbW9yeSBmaWxlLiIpOwotICAgICAgICB9Ci0gICAgICAgIG1MZW5ndGggPSBsZW5ndGg7Ci0gICAgICAgIG1GRCA9IGZkOwotICAgICAgICBtQWRkcmVzcyA9IG5hdGl2ZV9tbWFwKG1GRCwgbGVuZ3RoLCBtb2RlVG9Qcm90KG1vZGUpKTsKLSAgICAgICAgbU93bnNSZWdpb24gPSBmYWxzZTsKICAgICB9CiAKICAgICAvKioKQEAgLTEyMiw3ICs5NCw3IEBACiAgICAgICoKICAgICAgKiBAaGlkZQogICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGRlYWN0aXZhdGUoKSB7CisgICAgdm9pZCBkZWFjdGl2YXRlKCkgewogICAgICAgICBpZiAoIWlzRGVhY3RpdmF0ZWQoKSkgewogICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICBuYXRpdmVfbXVubWFwKG1BZGRyZXNzLCBtTGVuZ3RoKTsKQEAgLTE4MSw5ICsxNTMsNiBAQAogICAgICAqIEByZXR1cm4gcHJldmlvdXMgdmFsdWUgb2YgYWxsb3dQdXJnaW5nCiAgICAgICovCiAgICAgc3luY2hyb25pemVkIHB1YmxpYyBib29sZWFuIGFsbG93UHVyZ2luZyhib29sZWFuIGFsbG93UHVyZ2luZykgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKCFtT3duc1JlZ2lvbikgewotICAgICAgICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJPbmx5IHRoZSBvd25lciBjYW4gbWFrZSBhc2htZW0gcmVnaW9ucyBwdXJnYWJsZS4iKTsKLSAgICAgICAgfQogICAgICAgICBib29sZWFuIG9sZFZhbHVlID0gbUFsbG93UHVyZ2luZzsKICAgICAgICAgaWYgKG9sZFZhbHVlICE9IGFsbG93UHVyZ2luZykgewogICAgICAgICAgICAgbmF0aXZlX3BpbihtRkQsICFhbGxvd1B1cmdpbmcpOwpAQCAtMjYwLDI4ICsyMjksNyBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEdldHMgYSBQYXJjZWxGaWxlRGVzY3JpcHRvciBmb3IgdGhlIG1lbW9yeSBmaWxlLiBTZWUge0BsaW5rICNnZXRGaWxlRGVzY3JpcHRvcigpfQotICAgICAqIGZvciBjYXZlYXRzLiBUaGlzIG11c3QgYmUgaGVyZSB0byBhbGxvdyBjbGFzc2VzIG91dHNpZGUgPGNvZGU+YW5kcm9pZC5vczwvY29kZTwgdG8KLSAgICAgKiBtYWtlIFBhcmNlbEZpbGVEZXNjcmlwdG9ycyBmcm9tIE1lbW9yeUZpbGVzLCBhcwotICAgICAqIHtAbGluayBQYXJjZWxGaWxlRGVzY3JpcHRvciNQYXJjZWxGaWxlRGVzY3JpcHRvcihGaWxlRGVzY3JpcHRvcil9IGlzIHBhY2thZ2UgcHJpdmF0ZS4KLSAgICAgKgotICAgICAqCi0gICAgICogQHJldHVybiBUaGUgZmlsZSBkZXNjcmlwdG9yIG93bmVkIGJ5IHRoaXMgbWVtb3J5IGZpbGUgb2JqZWN0LgotICAgICAqICAgICAgICAgVGhlIGZpbGUgZGVzY3JpcHRvciBpcyBub3QgZHVwbGljYXRlZC4KLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIElmIHRoZSBtZW1vcnkgZmlsZSBoYXMgYmVlbiBjbG9zZWQuCi0gICAgICoKLSAgICAgKiBAaGlkZQotICAgICAqLwotICAgIHB1YmxpYyBQYXJjZWxGaWxlRGVzY3JpcHRvciBnZXRQYXJjZWxGaWxlRGVzY3JpcHRvcigpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIEZpbGVEZXNjcmlwdG9yIGZkID0gZ2V0RmlsZURlc2NyaXB0b3IoKTsKLSAgICAgICAgcmV0dXJuIGZkICE9IG51bGwgPyBuZXcgUGFyY2VsRmlsZURlc2NyaXB0b3IoZmQpIDogbnVsbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIGEgRmlsZURlc2NyaXB0b3IgZm9yIHRoZSBtZW1vcnkgZmlsZS4gTm90ZSB0aGF0IHRoaXMgZmlsZSBkZXNjcmlwdG9yCi0gICAgICogaXMgb25seSBzYWZlIHRvIHBhc3MgdG8ge0BsaW5rICNNZW1vcnlGaWxlKEZpbGVEZXNjcmlwdG9yLGludCl9KS4gSXQKLSAgICAgKiBzaG91bGQgbm90IGJlIHVzZWQgd2l0aCBmaWxlIGRlc2NyaXB0b3Igb3BlcmF0aW9ucyB0aGF0IGV4cGVjdCBhIGZpbGUgZGVzY3JpcHRvcgotICAgICAqIGZvciBhIG5vcm1hbCBmaWxlLgorICAgICAqIEdldHMgYSBGaWxlRGVzY3JpcHRvciBmb3IgdGhlIG1lbW9yeSBmaWxlLgogICAgICAqCiAgICAgICogVGhlIHJldHVybmVkIGZpbGUgZGVzY3JpcHRvciBpcyBub3QgZHVwbGljYXRlZC4KICAgICAgKgpAQCAtMjk0LDE3ICsyNDIsNiBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIENoZWNrcyB3aGV0aGVyIHRoZSBnaXZlbiBmaWxlIGRlc2NyaXB0b3IgcmVmZXJzIHRvIGEgbWVtb3J5IGZpbGUuCi0gICAgICoKLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIElmIDxjb2RlPmZkPC9jb2RlPiBpcyBub3QgYSB2YWxpZCBmaWxlIGRlc2NyaXB0b3IuCi0gICAgICoKLSAgICAgKiBAaGlkZQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc01lbW9yeUZpbGUoRmlsZURlc2NyaXB0b3IgZmQpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiAobmF0aXZlX2dldF9zaXplKGZkKSA+PSAwKTsKLSAgICB9Ci0KLSAgICAvKioKICAgICAgKiBSZXR1cm5zIHRoZSBzaXplIG9mIHRoZSBtZW1vcnkgZmlsZSB0aGF0IHRoZSBmaWxlIGRlc2NyaXB0b3IgcmVmZXJzIHRvLAogICAgICAqIG9yIC0xIGlmIHRoZSBmaWxlIGRlc2NyaXB0b3IgZG9lcyBub3QgcmVmZXIgdG8gYSBtZW1vcnkgZmlsZS4KICAgICAgKgpAQCAtMzE2LDIwICsyNTMsNiBAQAogICAgICAgICByZXR1cm4gbmF0aXZlX2dldF9zaXplKGZkKTsKICAgICB9CiAKLSAgICAvKioKLSAgICAgKiBDb252ZXJ0cyBhIGZpbGUgbW9kZSBzdHJpbmcgdG8gYSA8Y29kZT5wcm90PC9jb2RlPiB2YWx1ZSBhcyBleHBlY3RlZCBieQotICAgICAqIG5hdGl2ZV9tbWFwKCkuCi0gICAgICoKLSAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGUgZmlsZSBtb2RlIGlzIGludmFsaWQuCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgaW50IG1vZGVUb1Byb3QoU3RyaW5nIG1vZGUpIHsKLSAgICAgICAgaWYgKCJyIi5lcXVhbHMobW9kZSkpIHsKLSAgICAgICAgICAgIHJldHVybiBQUk9UX1JFQUQ7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJVbnN1cHBvcnRlZCBmaWxlIG1vZGU6ICciICsgbW9kZSArICInIik7Ci0gICAgICAgIH0KLSAgICB9Ci0KICAgICBwcml2YXRlIGNsYXNzIE1lbW9yeUlucHV0U3RyZWFtIGV4dGVuZHMgSW5wdXRTdHJlYW0gewogCiAgICAgICAgIHByaXZhdGUgaW50IG1NYXJrID0gMDsKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL29zL01lc3NhZ2UuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL29zL01lc3NhZ2UuamF2YQppbmRleCA0OWI3MmZlLi5lYjk0MWU0IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9vcy9NZXNzYWdlLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvb3MvTWVzc2FnZS5qYXZhCkBAIC03Myw3ICs3MywxOCBAQAogICAgICAqIHJlY2VpdmVyLgogICAgICAqLwogICAgIHB1YmxpYyBNZXNzZW5nZXIgcmVwbHlUbzsKLSAgICAKKworICAgIC8qKiBJZiBzZXQgbWVzc2FnZSBpcyBpbiB1c2UgKi8KKyAgICAvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgaW50IEZMQUdfSU5fVVNFID0gMTsKKworICAgIC8qKiBGbGFncyByZXNlcnZlZCBmb3IgZnV0dXJlIHVzZSAoQWxsIGFyZSByZXNlcnZlZCBmb3Igbm93KSAqLworICAgIC8qcGFja2FnZSovIHN0YXRpYyBmaW5hbCBpbnQgRkxBR1NfUkVTRVJWRUQgPSB+RkxBR19JTl9VU0U7CisKKyAgICAvKiogRmxhZ3MgdG8gY2xlYXIgaW4gdGhlIGNvcHlGcm9tIG1ldGhvZCAqLworICAgIC8qcGFja2FnZSovIHN0YXRpYyBmaW5hbCBpbnQgRkxBR1NfVE9fQ0xFQVJfT05fQ09QWV9GUk9NID0gRkxBR1NfUkVTRVJWRUQgfCBGTEFHX0lOX1VTRTsKKworICAgIC8qcGFja2FnZSovIGludCBmbGFnczsKKwogICAgIC8qcGFja2FnZSovIGxvbmcgd2hlbjsKICAgICAKICAgICAvKnBhY2thZ2UqLyBCdW5kbGUgZGF0YTsKQEAgLTI1Myw2ICsyNjQsNyBAQAogICAgICAqIHRhcmdldC9jYWxsYmFjayBvZiB0aGUgb3JpZ2luYWwgbWVzc2FnZS4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBjb3B5RnJvbShNZXNzYWdlIG8pIHsKKyAgICAgICAgdGhpcy5mbGFncyA9IG8uZmxhZ3MgJiB+RkxBR1NfVE9fQ0xFQVJfT05fQ09QWV9GUk9NOwogICAgICAgICB0aGlzLndoYXQgPSBvLndoYXQ7CiAgICAgICAgIHRoaXMuYXJnMSA9IG8uYXJnMTsKICAgICAgICAgdGhpcy5hcmcyID0gby5hcmcyOwpAQCAtMzUwLDYgKzM2Miw3IEBACiAgICAgfQogCiAgICAgLypwYWNrYWdlKi8gdm9pZCBjbGVhckZvclJlY3ljbGUoKSB7CisgICAgICAgIGZsYWdzID0gMDsKICAgICAgICAgd2hhdCA9IDA7CiAgICAgICAgIGFyZzEgPSAwOwogICAgICAgICBhcmcyID0gMDsKQEAgLTM2MSw2ICszNzQsMTQgQEAKICAgICAgICAgZGF0YSA9IG51bGw7CiAgICAgfQogCisgICAgLypwYWNrYWdlKi8gYm9vbGVhbiBpc0luVXNlKCkgeworICAgICAgICByZXR1cm4gKChmbGFncyAmIEZMQUdfSU5fVVNFKSA9PSBGTEFHX0lOX1VTRSk7CisgICAgfQorCisgICAgLypwYWNrYWdlKi8gdm9pZCBtYXJrSW5Vc2UoKSB7CisgICAgICAgIGZsYWdzIHw9IEZMQUdfSU5fVVNFOworICAgIH0KKwogICAgIC8qKiBDb25zdHJ1Y3RvciAoYnV0IHRoZSBwcmVmZXJyZWQgd2F5IHRvIGdldCBhIE1lc3NhZ2UgaXMgdG8gY2FsbCB7QGxpbmsgI29idGFpbigpIE1lc3NhZ2Uub2J0YWluKCl9KS4KICAgICAqLwogICAgIHB1YmxpYyBNZXNzYWdlKCkgewpAQCAtNDUzLDQgKzQ3NCwzIEBACiAgICAgICAgIHJlcGx5VG8gPSBNZXNzZW5nZXIucmVhZE1lc3Nlbmdlck9yTnVsbEZyb21QYXJjZWwoc291cmNlKTsKICAgICB9CiB9Ci0KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL29zL01lc3NhZ2VRdWV1ZS5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvb3MvTWVzc2FnZVF1ZXVlLmphdmEKaW5kZXggMjgxMzg2My4uZTg5ZjdjMiAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvb3MvTWVzc2FnZVF1ZXVlLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvb3MvTWVzc2FnZVF1ZXVlLmphdmEKQEAgLTEyMCw2ICsxMjAsNyBAQAogICAgICAgICAgICAgICAgIG5vdyA9IFN5c3RlbUNsb2NrLnVwdGltZU1pbGxpcygpOwogICAgICAgICAgICAgICAgIE1lc3NhZ2UgbXNnID0gcHVsbE5leHRMb2NrZWQobm93KTsKICAgICAgICAgICAgICAgICBpZiAobXNnICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgbXNnLm1hcmtJblVzZSgpOwogICAgICAgICAgICAgICAgICAgICByZXR1cm4gbXNnOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAKQEAgLTE5Miw3ICsxOTMsNyBAQAogICAgIH0KIAogICAgIGZpbmFsIGJvb2xlYW4gZW5xdWV1ZU1lc3NhZ2UoTWVzc2FnZSBtc2csIGxvbmcgd2hlbikgewotICAgICAgICBpZiAobXNnLndoZW4gIT0gMCkgeworICAgICAgICBpZiAobXNnLmlzSW5Vc2UoKSkgewogICAgICAgICAgICAgdGhyb3cgbmV3IEFuZHJvaWRSdW50aW1lRXhjZXB0aW9uKG1zZwogICAgICAgICAgICAgICAgICAgICArICIgVGhpcyBtZXNzYWdlIGlzIGFscmVhZHkgaW4gdXNlLiIpOwogICAgICAgICB9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9vcy9QYXJjZWxGaWxlRGVzY3JpcHRvci5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvb3MvUGFyY2VsRmlsZURlc2NyaXB0b3IuamF2YQppbmRleCA5ZDIxM2IzLi5jMWExODA5IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9vcy9QYXJjZWxGaWxlRGVzY3JpcHRvci5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL29zL1BhcmNlbEZpbGVEZXNjcmlwdG9yLmphdmEKQEAgLTEzNCw2ICsxMzQsNDUgQEAKICAgICBwcml2YXRlIHN0YXRpYyBuYXRpdmUgRmlsZURlc2NyaXB0b3IgZ2V0RmlsZURlc2NyaXB0b3JGcm9tU29ja2V0KFNvY2tldCBzb2NrZXQpOwogCiAgICAgLyoqCisgICAgICogQ3JlYXRlIHR3byBQYXJjZWxGaWxlRGVzY3JpcHRvcnMgc3RydWN0dXJlZCBhcyBhIGRhdGEgcGlwZS4gIFRoZSBmaXJzdAorICAgICAqIFBhcmNlbEZpbGVEZXNjcmlwdG9yIGluIHRoZSByZXR1cm5lZCBhcnJheSBpcyB0aGUgcmVhZCBzaWRlOyB0aGUgc2Vjb25kCisgICAgICogaXMgdGhlIHdyaXRlIHNpZGUuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBQYXJjZWxGaWxlRGVzY3JpcHRvcltdIGNyZWF0ZVBpcGUoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBGaWxlRGVzY3JpcHRvcltdIGZkcyA9IG5ldyBGaWxlRGVzY3JpcHRvclsyXTsKKyAgICAgICAgaW50IHJlcyA9IGNyZWF0ZVBpcGVOYXRpdmUoZmRzKTsKKyAgICAgICAgaWYgKHJlcyA9PSAwKSB7CisgICAgICAgICAgICBQYXJjZWxGaWxlRGVzY3JpcHRvcltdIHBmZHMgPSBuZXcgUGFyY2VsRmlsZURlc2NyaXB0b3JbMl07CisgICAgICAgICAgICBwZmRzWzBdID0gbmV3IFBhcmNlbEZpbGVEZXNjcmlwdG9yKGZkc1swXSk7CisgICAgICAgICAgICBwZmRzWzFdID0gbmV3IFBhcmNlbEZpbGVEZXNjcmlwdG9yKGZkc1sxXSk7CisgICAgICAgICAgICByZXR1cm4gcGZkczsKKyAgICAgICAgfQorICAgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oIlVuYWJsZSB0byBjcmVhdGUgcGlwZTogZXJybm89IiArIC1yZXMpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIG5hdGl2ZSBpbnQgY3JlYXRlUGlwZU5hdGl2ZShGaWxlRGVzY3JpcHRvcltdIG91dEZkcyk7CisKKyAgICAvKioKKyAgICAgKiBHZXRzIGEgZmlsZSBkZXNjcmlwdG9yIGZvciBhIHJlYWQtb25seSBjb3B5IG9mIHRoZSBnaXZlbiBkYXRhLgorICAgICAqCisgICAgICogQHBhcmFtIGRhdGEgRGF0YSB0byBjb3B5LgorICAgICAqIEBwYXJhbSBuYW1lIE5hbWUgZm9yIHRoZSBzaGFyZWQgbWVtb3J5IGFyZWEgdGhhdCBtYXkgYmFjayB0aGUgZmlsZSBkZXNjcmlwdG9yLgorICAgICAqICAgICAgICBUaGlzIGlzIHB1cmVseSBpbmZvcm1hdGl2ZSBhbmQgbWF5IGJlIHtAY29kZSBudWxsfS4KKyAgICAgKiBAcmV0dXJuIEEgUGFyY2VsRmlsZURlc2NyaXB0b3IuCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBpZiB0aGVyZSBpcyBhbiBlcnJvciB3aGlsZSBjcmVhdGluZyB0aGUgc2hhcmVkIG1lbW9yeSBhcmVhLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgUGFyY2VsRmlsZURlc2NyaXB0b3IgZnJvbURhdGEoYnl0ZVtdIGRhdGEsIFN0cmluZyBuYW1lKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBpZiAoZGF0YSA9PSBudWxsKSByZXR1cm4gbnVsbDsKKyAgICAgICAgTWVtb3J5RmlsZSBmaWxlID0gbmV3IE1lbW9yeUZpbGUobmFtZSwgZGF0YS5sZW5ndGgpOworICAgICAgICBpZiAoZGF0YS5sZW5ndGggPiAwKSB7CisgICAgICAgICAgICBmaWxlLndyaXRlQnl0ZXMoZGF0YSwgMCwgMCwgZGF0YS5sZW5ndGgpOworICAgICAgICB9CisgICAgICAgIGZpbGUuZGVhY3RpdmF0ZSgpOworICAgICAgICBGaWxlRGVzY3JpcHRvciBmZCA9IGZpbGUuZ2V0RmlsZURlc2NyaXB0b3IoKTsKKyAgICAgICAgcmV0dXJuIGZkICE9IG51bGwgPyBuZXcgUGFyY2VsRmlsZURlc2NyaXB0b3IoZmQpIDogbnVsbDsKKyAgICB9CisKKyAgICAvKioKICAgICAgKiBSZXRyaWV2ZSB0aGUgYWN0dWFsIEZpbGVEZXNjcmlwdG9yIGFzc29jaWF0ZWQgd2l0aCB0aGlzIG9iamVjdC4KICAgICAgKiAKICAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIEZpbGVEZXNjcmlwdG9yIGFzc29jaWF0ZWQgd2l0aCB0aGlzIG9iamVjdC4KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL29zL3N0b3JhZ2UvU3RvcmFnZUV2ZW50TGlzdGVuZXIuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL29zL3N0b3JhZ2UvU3RvcmFnZUV2ZW50TGlzdGVuZXIuamF2YQppbmRleCA3Yjg4M2E3Li5kM2QzOWQ2IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9vcy9zdG9yYWdlL1N0b3JhZ2VFdmVudExpc3RlbmVyLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvb3Mvc3RvcmFnZS9TdG9yYWdlRXZlbnRMaXN0ZW5lci5qYXZhCkBAIC0xOCw3ICsxOCw2IEBACiAKIC8qKgogICogVXNlZCBmb3IgcmVjZWl2aW5nIG5vdGlmaWNhdGlvbnMgZnJvbSB0aGUgU3RvcmFnZU1hbmFnZXIKLSAqIEBoaWRlCiAgKi8KIHB1YmxpYyBhYnN0cmFjdCBjbGFzcyBTdG9yYWdlRXZlbnRMaXN0ZW5lciB7CiAgICAgLyoqCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9vcy9zdG9yYWdlL1N0b3JhZ2VNYW5hZ2VyLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9vcy9zdG9yYWdlL1N0b3JhZ2VNYW5hZ2VyLmphdmEKaW5kZXggZGYwYjY5Yy4uNGEwMjk2YiAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvb3Mvc3RvcmFnZS9TdG9yYWdlTWFuYWdlci5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL29zL3N0b3JhZ2UvU3RvcmFnZU1hbmFnZXIuamF2YQpAQCAtMzAsNiArMzAsNyBAQAogICogR2V0IGFuIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MgYnkgY2FsbGluZwogICoge0BsaW5rIGFuZHJvaWQuY29udGVudC5Db250ZXh0I2dldFN5c3RlbVNlcnZpY2UoamF2YS5sYW5nLlN0cmluZyl9IHdpdGggYW4gYXJndW1lbnQKICAqIG9mIHtAbGluayBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCNTVE9SQUdFX1NFUlZJQ0V9LgorICoKICAqLwogCiBwdWJsaWMgY2xhc3MgU3RvcmFnZU1hbmFnZXIKQEAgLTIwMyw3ICsyMDQsNiBAQAogICAgICAqCiAgICAgICogQHBhcmFtIGxpc3RlbmVyIEEge0BsaW5rIGFuZHJvaWQub3Muc3RvcmFnZS5TdG9yYWdlRXZlbnRMaXN0ZW5lciBTdG9yYWdlRXZlbnRMaXN0ZW5lcn0gb2JqZWN0LgogICAgICAqCi0gICAgICogQGhpZGUKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCByZWdpc3Rlckxpc3RlbmVyKFN0b3JhZ2VFdmVudExpc3RlbmVyIGxpc3RlbmVyKSB7CiAgICAgICAgIGlmIChsaXN0ZW5lciA9PSBudWxsKSB7CkBAIC0yMjAsNyArMjIwLDYgQEAKICAgICAgKgogICAgICAqIEBwYXJhbSBsaXN0ZW5lciBBIHtAbGluayBhbmRyb2lkLm9zLnN0b3JhZ2UuU3RvcmFnZUV2ZW50TGlzdGVuZXIgU3RvcmFnZUV2ZW50TGlzdGVuZXJ9IG9iamVjdC4KICAgICAgKgotICAgICAqIEBoaWRlCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgdW5yZWdpc3Rlckxpc3RlbmVyKFN0b3JhZ2VFdmVudExpc3RlbmVyIGxpc3RlbmVyKSB7CiAgICAgICAgIGlmIChsaXN0ZW5lciA9PSBudWxsKSB7CkBAIC0yNDEsOCArMjQwLDYgQEAKIAogICAgIC8qKgogICAgICAqIEVuYWJsZXMgVVNCIE1hc3MgU3RvcmFnZSAoVU1TKSBvbiB0aGUgZGV2aWNlLgotICAgICAqCi0gICAgICogQGhpZGUKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBlbmFibGVVc2JNYXNzU3RvcmFnZSgpIHsKICAgICAgICAgdHJ5IHsKQEAgLTI1NCw4ICsyNTEsNiBAQAogCiAgICAgLyoqCiAgICAgICogRGlzYWJsZXMgVVNCIE1hc3MgU3RvcmFnZSAoVU1TKSBvbiB0aGUgZGV2aWNlLgotICAgICAqCi0gICAgICogQGhpZGUKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBkaXNhYmxlVXNiTWFzc1N0b3JhZ2UoKSB7CiAgICAgICAgIHRyeSB7CkBAIC0yNjgsOCArMjYzLDYgQEAKICAgICAvKioKICAgICAgKiBRdWVyeSBpZiBhIFVTQiBNYXNzIFN0b3JhZ2UgKFVNUykgaG9zdCBpcyBjb25uZWN0ZWQuCiAgICAgICogQHJldHVybiB0cnVlIGlmIFVNUyBob3N0IGlzIGNvbm5lY3RlZC4KLSAgICAgKgotICAgICAqIEBoaWRlCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gaXNVc2JNYXNzU3RvcmFnZUNvbm5lY3RlZCgpIHsKICAgICAgICAgdHJ5IHsKQEAgLTI4Myw4ICsyNzYsNiBAQAogICAgIC8qKgogICAgICAqIFF1ZXJ5IGlmIGEgVVNCIE1hc3MgU3RvcmFnZSAoVU1TKSBpcyBlbmFibGVkIG9uIHRoZSBkZXZpY2UuCiAgICAgICogQHJldHVybiB0cnVlIGlmIFVNUyBob3N0IGlzIGVuYWJsZWQuCi0gICAgICoKLSAgICAgKiBAaGlkZQogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIGlzVXNiTWFzc1N0b3JhZ2VFbmFibGVkKCkgewogICAgICAgICB0cnkgewpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvb3Mvc3RvcmFnZS9TdG9yYWdlUmVzdWx0Q29kZS5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvb3Mvc3RvcmFnZS9TdG9yYWdlUmVzdWx0Q29kZS5qYXZhCmluZGV4IDA3NWY0N2YuLjA3ZDk1ZGYgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL29zL3N0b3JhZ2UvU3RvcmFnZVJlc3VsdENvZGUuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9vcy9zdG9yYWdlL1N0b3JhZ2VSZXN1bHRDb2RlLmphdmEKQEAgLTE5LDggKzE5LDYgQEAKIC8qKgogICogQ2xhc3MgdGhhdCBwcm92aWRlcyBhY2Nlc3MgdG8gY29uc3RhbnRzIHJldHVybmVkIGZyb20gU3RvcmFnZU1hbmFnZXIKICAqIGFuZCBsb3dlciBsZXZlbCBNb3VudFNlcnZpY2UgQVBJcy4KLSAqCi0gKiBAaGlkZQogICovCiBwdWJsaWMgY2xhc3MgU3RvcmFnZVJlc3VsdENvZGUKIHsKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3BpbS9SZWN1cnJlbmNlU2V0LmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9waW0vUmVjdXJyZW5jZVNldC5qYXZhCmluZGV4IDYzNTMyM2UuLjI4MjQxN2QgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3BpbS9SZWN1cnJlbmNlU2V0LmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvcGltL1JlY3VycmVuY2VTZXQuamF2YQpAQCAtMTgxLDcgKzE4MSw5IEBACiAgICAgICAgIGJvb2xlYW4gaW5VdGMgPSBzdGFydC5wYXJzZShkdHN0YXJ0KTsKICAgICAgICAgYm9vbGVhbiBhbGxEYXkgPSBzdGFydC5hbGxEYXk7CiAKLSAgICAgICAgaWYgKGluVXRjKSB7CisgICAgICAgIC8vIFdlIGZvcmNlIFRpbWVab25lIHRvIFVUQyBmb3IgImFsbCBkYXkgcmVjdXJyaW5nIGV2ZW50cyIgYXMgdGhlIHNlcnZlciBpcyBzZW5kaW5nIG5vCisgICAgICAgIC8vIFRpbWVab25lIGluIERUU1RBUlQgZm9yIHRoZW0KKyAgICAgICAgaWYgKGluVXRjIHx8IGFsbERheSkgewogICAgICAgICAgICAgdHppZCA9IFRpbWUuVElNRVpPTkVfVVRDOwogICAgICAgICB9CiAgICAgICAgICAgICAgICAgCkBAIC0yMDQsMTAgKzIwNiw3IEBACiAgICAgICAgIH0KICAgICAgICAgCiAgICAgICAgIGlmIChhbGxEYXkpIHsKLSAgICAgICAgCS8vIFRPRE86IGFsc28gY2hhbmdlIHR6aWQgdG8gYmUgVVRDPyAgdGhhdCB3b3VsZCBiZSBjb25zaXN0ZW50LCBidXQKLSAgICAgICAgCS8vIHRoYXQgd291bGQgbm90IHJlZmxlY3QgdGhlIG9yaWdpbmFsIHRpbWV6b25lIHZhbHVlIGJhY2sgdG8gdGhlCi0gICAgICAgIAkvLyBzZXJ2ZXIuCi0gICAgICAgIAlzdGFydC50aW1lem9uZSA9IFRpbWUuVElNRVpPTkVfVVRDOworICAgICAgICAgICAgc3RhcnQudGltZXpvbmUgPSBUaW1lLlRJTUVaT05FX1VUQzsKICAgICAgICAgfQogICAgICAgICBsb25nIG1pbGxpcyA9IHN0YXJ0LnRvTWlsbGlzKGZhbHNlIC8qIHVzZSBpc0RzdCAqLyk7CiAgICAgICAgIHZhbHVlcy5wdXQoQ2FsZW5kYXIuRXZlbnRzLkRUU1RBUlQsIG1pbGxpcyk7CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9waW0vdmNhcmQvSmFwYW5lc2VVdGlscy5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvcGltL3ZjYXJkL0phcGFuZXNlVXRpbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGNmZTk4MC4uMDAwMDAwMAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9waW0vdmNhcmQvSmFwYW5lc2VVdGlscy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzc5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGFuZHJvaWQucGltLnZjYXJkOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotLyoqCi0gKiBUZXh0VXRpbHMgZXNwZWNpYWxseSBmb3IgSmFwYW5lc2UuCi0gKi8KLS8qIHBhY2thZ2UgKi8gY2xhc3MgSmFwYW5lc2VVdGlscyB7Ci0gICAgc3RhdGljIHByaXZhdGUgZmluYWwgTWFwPENoYXJhY3RlciwgU3RyaW5nPiBzSGFsZldpZHRoTWFwID0KLSAgICAgICAgbmV3IEhhc2hNYXA8Q2hhcmFjdGVyLCBTdHJpbmc+KCk7Ci0KLSAgICBzdGF0aWMgewotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDAxJywgIlx1RkY2NCIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDAyJywgIlx1RkY2MSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDBDJywgIlx1RkY2MiIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDBEJywgIlx1RkY2MyIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDFDJywgIn4iKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzA0MScsICJcdUZGNjciKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzA0MicsICJcdUZGNzEiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzA0MycsICJcdUZGNjgiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzA0NCcsICJcdUZGNzIiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzA0NScsICJcdUZGNjkiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzA0NicsICJcdUZGNzMiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzA0NycsICJcdUZGNkEiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzA0OCcsICJcdUZGNzQiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzA0OScsICJcdUZGNkIiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzA0QScsICJcdUZGNzUiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzA0QicsICJcdUZGNzYiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzA0QycsICJcdUZGNzZcdUZGOUUiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzA0RCcsICJcdUZGNzciKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzA0RScsICJcdUZGNzdcdUZGOUUiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzA0RicsICJcdUZGNzgiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzA1MCcsICJcdUZGNzhcdUZGOUUiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzA1MScsICJcdUZGNzkiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzA1MicsICJcdUZGNzlcdUZGOUUiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzA1MycsICJcdUZGN0EiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzA1NCcsICJcdUZGN0FcdUZGOUUiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzA1NScsICJcdUZGN0IiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzA1NicsICJcdUZGN0JcdUZGOUUiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzA1NycsICJcdUZGN0MiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzA1OCcsICJcdUZGN0NcdUZGOUUiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzA1OScsICJcdUZGN0QiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzA1QScsICJcdUZGN0RcdUZGOUUiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzA1QicsICJcdUZGN0UiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzA1QycsICJcdUZGN0VcdUZGOUUiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzA1RCcsICJcdUZGN0YiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzA1RScsICJcdUZGN0ZcdUZGOUUiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzA1RicsICJcdUZGODAiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzA2MCcsICJcdUZGODBcdUZGOUUiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzA2MScsICJcdUZGODEiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzA2MicsICJcdUZGODFcdUZGOUUiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzA2MycsICJcdUZGNkYiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzA2NCcsICJcdUZGODIiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzA2NScsICJcdUZGODJcdUZGOUUiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzA2NicsICJcdUZGODMiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzA2NycsICJcdUZGODNcdUZGOUUiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzA2OCcsICJcdUZGODQiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzA2OScsICJcdUZGODRcdUZGOUUiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzA2QScsICJcdUZGODUiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzA2QicsICJcdUZGODYiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzA2QycsICJcdUZGODciKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzA2RCcsICJcdUZGODgiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzA2RScsICJcdUZGODkiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzA2RicsICJcdUZGOEEiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzA3MCcsICJcdUZGOEFcdUZGOUUiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzA3MScsICJcdUZGOEFcdUZGOUYiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzA3MicsICJcdUZGOEIiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzA3MycsICJcdUZGOEJcdUZGOUUiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzA3NCcsICJcdUZGOEJcdUZGOUYiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzA3NScsICJcdUZGOEMiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzA3NicsICJcdUZGOENcdUZGOUUiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzA3NycsICJcdUZGOENcdUZGOUYiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzA3OCcsICJcdUZGOEQiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzA3OScsICJcdUZGOERcdUZGOUUiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzA3QScsICJcdUZGOERcdUZGOUYiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzA3QicsICJcdUZGOEUiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzA3QycsICJcdUZGOEVcdUZGOUUiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzA3RCcsICJcdUZGOEVcdUZGOUYiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzA3RScsICJcdUZGOEYiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzA3RicsICJcdUZGOTAiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzA4MCcsICJcdUZGOTEiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzA4MScsICJcdUZGOTIiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzA4MicsICJcdUZGOTMiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzA4MycsICJcdUZGNkMiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzA4NCcsICJcdUZGOTQiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzA4NScsICJcdUZGNkQiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzA4NicsICJcdUZGOTUiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzA4NycsICJcdUZGNkUiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzA4OCcsICJcdUZGOTYiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzA4OScsICJcdUZGOTciKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzA4QScsICJcdUZGOTgiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzA4QicsICJcdUZGOTkiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzA4QycsICJcdUZGOUEiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzA4RCcsICJcdUZGOUIiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzA4RScsICJcdUZGOUMiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzA4RicsICJcdUZGOUMiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzA5MCcsICJcdUZGNzIiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzA5MScsICJcdUZGNzQiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzA5MicsICJcdUZGNjYiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzA5MycsICJcdUZGOUQiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzA5QicsICJcdUZGOUUiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzA5QycsICJcdUZGOUYiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzBBMScsICJcdUZGNjciKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzBBMicsICJcdUZGNzEiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzBBMycsICJcdUZGNjgiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzBBNCcsICJcdUZGNzIiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzBBNScsICJcdUZGNjkiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzBBNicsICJcdUZGNzMiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzBBNycsICJcdUZGNkEiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzBBOCcsICJcdUZGNzQiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzBBOScsICJcdUZGNkIiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzBBQScsICJcdUZGNzUiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzBBQicsICJcdUZGNzYiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzBBQycsICJcdUZGNzZcdUZGOUUiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzBBRCcsICJcdUZGNzciKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzBBRScsICJcdUZGNzdcdUZGOUUiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzBBRicsICJcdUZGNzgiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzBCMCcsICJcdUZGNzhcdUZGOUUiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzBCMScsICJcdUZGNzkiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzBCMicsICJcdUZGNzlcdUZGOUUiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzBCMycsICJcdUZGN0EiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzBCNCcsICJcdUZGN0FcdUZGOUUiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzBCNScsICJcdUZGN0IiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzBCNicsICJcdUZGN0JcdUZGOUUiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzBCNycsICJcdUZGN0MiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzBCOCcsICJcdUZGN0NcdUZGOUUiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzBCOScsICJcdUZGN0QiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzBCQScsICJcdUZGN0RcdUZGOUUiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzBCQicsICJcdUZGN0UiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzBCQycsICJcdUZGN0VcdUZGOUUiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzBCRCcsICJcdUZGN0YiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzBCRScsICJcdUZGN0ZcdUZGOUUiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzBCRicsICJcdUZGODAiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzBDMCcsICJcdUZGODBcdUZGOUUiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzBDMScsICJcdUZGODEiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzBDMicsICJcdUZGODFcdUZGOUUiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzBDMycsICJcdUZGNkYiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzBDNCcsICJcdUZGODIiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzBDNScsICJcdUZGODJcdUZGOUUiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzBDNicsICJcdUZGODMiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzBDNycsICJcdUZGODNcdUZGOUUiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzBDOCcsICJcdUZGODQiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzBDOScsICJcdUZGODRcdUZGOUUiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzBDQScsICJcdUZGODUiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzBDQicsICJcdUZGODYiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzBDQycsICJcdUZGODciKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzBDRCcsICJcdUZGODgiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzBDRScsICJcdUZGODkiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzBDRicsICJcdUZGOEEiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzBEMCcsICJcdUZGOEFcdUZGOUUiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzBEMScsICJcdUZGOEFcdUZGOUYiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzBEMicsICJcdUZGOEIiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzBEMycsICJcdUZGOEJcdUZGOUUiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzBENCcsICJcdUZGOEJcdUZGOUYiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzBENScsICJcdUZGOEMiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzBENicsICJcdUZGOENcdUZGOUUiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzBENycsICJcdUZGOENcdUZGOUYiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzBEOCcsICJcdUZGOEQiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzBEOScsICJcdUZGOERcdUZGOUUiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzBEQScsICJcdUZGOERcdUZGOUYiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzBEQicsICJcdUZGOEUiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzBEQycsICJcdUZGOEVcdUZGOUUiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzBERCcsICJcdUZGOEVcdUZGOUYiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzBERScsICJcdUZGOEYiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzBERicsICJcdUZGOTAiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzBFMCcsICJcdUZGOTEiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzBFMScsICJcdUZGOTIiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzBFMicsICJcdUZGOTMiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzBFMycsICJcdUZGNkMiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzBFNCcsICJcdUZGOTQiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzBFNScsICJcdUZGNkQiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzBFNicsICJcdUZGOTUiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzBFNycsICJcdUZGNkUiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzBFOCcsICJcdUZGOTYiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzBFOScsICJcdUZGOTciKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzBFQScsICJcdUZGOTgiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzBFQicsICJcdUZGOTkiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzBFQycsICJcdUZGOUEiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzBFRCcsICJcdUZGOUIiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzBFRScsICJcdUZGOUMiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzBFRicsICJcdUZGOUMiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzBGMCcsICJcdUZGNzIiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzBGMScsICJcdUZGNzQiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzBGMicsICJcdUZGNjYiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzBGMycsICJcdUZGOUQiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzBGNCcsICJcdUZGNzNcdUZGOUUiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzBGNScsICJcdUZGNzYiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzBGNicsICJcdUZGNzkiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzBGQicsICJcdUZGNjUiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzBGQycsICJcdUZGNzAiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1RkYwMScsICIhIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGMDInLCAiXCIiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1RkYwMycsICIjIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGMDQnLCAiJCIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjA1JywgIiUiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1RkYwNicsICImIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGMDcnLCAiJyIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjA4JywgIigiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1RkYwOScsICIpIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGMEEnLCAiKiIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjBCJywgIisiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1RkYwQycsICIsIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGMEQnLCAiLSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjBFJywgIi4iKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1RkYwRicsICIvIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGMTAnLCAiMCIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjExJywgIjEiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1RkYxMicsICIyIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGMTMnLCAiMyIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjE0JywgIjQiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1RkYxNScsICI1Iik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGMTYnLCAiNiIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjE3JywgIjciKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1RkYxOCcsICI4Iik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGMTknLCAiOSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjFBJywgIjoiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1RkYxQicsICI7Iik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGMUMnLCAiPCIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjFEJywgIj0iKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1RkYxRScsICI+Iik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGMUYnLCAiPyIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjIwJywgIkAiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1RkYyMScsICJBIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGMjInLCAiQiIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjIzJywgIkMiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1RkYyNCcsICJEIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGMjUnLCAiRSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjI2JywgIkYiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1RkYyNycsICJHIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGMjgnLCAiSCIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjI5JywgIkkiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1RkYyQScsICJKIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGMkInLCAiSyIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjJDJywgIkwiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1RkYyRCcsICJNIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGMkUnLCAiTiIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjJGJywgIk8iKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1RkYzMCcsICJQIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGMzEnLCAiUSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjMyJywgIlIiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1RkYzMycsICJTIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGMzQnLCAiVCIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjM1JywgIlUiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1RkYzNicsICJWIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGMzcnLCAiVyIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjM4JywgIlgiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1RkYzOScsICJZIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGM0EnLCAiWiIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjNCJywgIlsiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1RkYzQycsICJcXCIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjNEJywgIl0iKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1RkYzRScsICJeIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGM0YnLCAiXyIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjQxJywgImEiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1RkY0MicsICJiIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGNDMnLCAiYyIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjQ0JywgImQiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1RkY0NScsICJlIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGNDYnLCAiZiIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjQ3JywgImciKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1RkY0OCcsICJoIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGNDknLCAiaSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjRBJywgImoiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1RkY0QicsICJrIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGNEMnLCAibCIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjREJywgIm0iKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1RkY0RScsICJuIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGNEYnLCAibyIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjUwJywgInAiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1RkY1MScsICJxIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGNTInLCAiciIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjUzJywgInMiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1RkY1NCcsICJ0Iik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGNTUnLCAidSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjU2JywgInYiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1RkY1NycsICJ3Iik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGNTgnLCAieCIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjU5JywgInkiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1RkY1QScsICJ6Iik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGNUInLCAieyIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjVDJywgInwiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1RkY1RCcsICJ9Iik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGNUUnLCAifiIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjYxJywgIlx1RkY2MSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjYyJywgIlx1RkY2MiIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjYzJywgIlx1RkY2MyIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjY0JywgIlx1RkY2NCIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjY1JywgIlx1RkY2NSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjY2JywgIlx1RkY2NiIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjY3JywgIlx1RkY2NyIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjY4JywgIlx1RkY2OCIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjY5JywgIlx1RkY2OSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjZBJywgIlx1RkY2QSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjZCJywgIlx1RkY2QiIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjZDJywgIlx1RkY2QyIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjZEJywgIlx1RkY2RCIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjZFJywgIlx1RkY2RSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjZGJywgIlx1RkY2RiIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjcwJywgIlx1RkY3MCIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjcxJywgIlx1RkY3MSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjcyJywgIlx1RkY3MiIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjczJywgIlx1RkY3MyIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjc0JywgIlx1RkY3NCIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjc1JywgIlx1RkY3NSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjc2JywgIlx1RkY3NiIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjc3JywgIlx1RkY3NyIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjc4JywgIlx1RkY3OCIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjc5JywgIlx1RkY3OSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjdBJywgIlx1RkY3QSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjdCJywgIlx1RkY3QiIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjdDJywgIlx1RkY3QyIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjdEJywgIlx1RkY3RCIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjdFJywgIlx1RkY3RSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjdGJywgIlx1RkY3RiIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjgwJywgIlx1RkY4MCIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjgxJywgIlx1RkY4MSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjgyJywgIlx1RkY4MiIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjgzJywgIlx1RkY4MyIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjg0JywgIlx1RkY4NCIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjg1JywgIlx1RkY4NSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjg2JywgIlx1RkY4NiIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjg3JywgIlx1RkY4NyIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjg4JywgIlx1RkY4OCIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjg5JywgIlx1RkY4OSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjhBJywgIlx1RkY4QSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjhCJywgIlx1RkY4QiIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjhDJywgIlx1RkY4QyIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjhEJywgIlx1RkY4RCIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjhFJywgIlx1RkY4RSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjhGJywgIlx1RkY4RiIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjkwJywgIlx1RkY5MCIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjkxJywgIlx1RkY5MSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjkyJywgIlx1RkY5MiIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjkzJywgIlx1RkY5MyIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjk0JywgIlx1RkY5NCIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjk1JywgIlx1RkY5NSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjk2JywgIlx1RkY5NiIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjk3JywgIlx1RkY5NyIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjk4JywgIlx1RkY5OCIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjk5JywgIlx1RkY5OSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjlBJywgIlx1RkY5QSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjlCJywgIlx1RkY5QiIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjlDJywgIlx1RkY5QyIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjlEJywgIlx1RkY5RCIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjlFJywgIlx1RkY5RSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjlGJywgIlx1RkY5RiIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRkU1JywgIlx1MDA1Q1x1MDA1QyIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgaGFsZi13aWR0aCB2ZXJzaW9uIG9mIHRoYXQgY2hhcmFjdGVyIGlmIHBvc3NpYmxlLiBSZXR1cm5zIG51bGwgaWYgbm90IHBvc3NpYmxlCi0gICAgICogQHBhcmFtIGNoIGlucHV0IGNoYXJhY3RlcgotICAgICAqIEByZXR1cm4gQ2hhclNlcXVlbmNlIG9iamVjdCBpZiB0aGUgbWFwcGluZyBmb3IgY2ggZXhpc3RzLiBSZXR1cm4gbnVsbCBvdGhlcndpc2UuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgdHJ5R2V0SGFsZldpZHRoVGV4dChmaW5hbCBjaGFyIGNoKSB7Ci0gICAgICAgIGlmIChzSGFsZldpZHRoTWFwLmNvbnRhaW5zS2V5KGNoKSkgewotICAgICAgICAgICAgcmV0dXJuIHNIYWxmV2lkdGhNYXAuZ2V0KGNoKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvcGltL3ZjYXJkL1ZDYXJkQnVpbGRlci5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvcGltL3ZjYXJkL1ZDYXJkQnVpbGRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMjAwN2YyLi4wMDAwMDAwCi0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3BpbS92Y2FyZC9WQ2FyZEJ1aWxkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxNDUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90Ci0gKiB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgotICogdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUCi0gKiBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUKLSAqIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyCi0gKiB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBhbmRyb2lkLnBpbS52Y2FyZDsKLQotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZW50VmFsdWVzOwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5Db21tb25EYXRhS2luZHMuRW1haWw7Ci1pbXBvcnQgYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0LkNvbW1vbkRhdGFLaW5kcy5FdmVudDsKLWltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuQ29tbW9uRGF0YUtpbmRzLkltOwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5Db21tb25EYXRhS2luZHMuTmlja25hbWU7Ci1pbXBvcnQgYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0LkNvbW1vbkRhdGFLaW5kcy5Ob3RlOwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5Db21tb25EYXRhS2luZHMuT3JnYW5pemF0aW9uOwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5Db21tb25EYXRhS2luZHMuUGhvbmU7Ci1pbXBvcnQgYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0LkNvbW1vbkRhdGFLaW5kcy5QaG90bzsKLWltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuQ29tbW9uRGF0YUtpbmRzLlJlbGF0aW9uOwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5Db21tb25EYXRhS2luZHMuU3RydWN0dXJlZE5hbWU7Ci1pbXBvcnQgYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0LkNvbW1vbkRhdGFLaW5kcy5TdHJ1Y3R1cmVkUG9zdGFsOwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5Db21tb25EYXRhS2luZHMuV2Vic2l0ZTsKLWltcG9ydCBhbmRyb2lkLnRlbGVwaG9ueS5QaG9uZU51bWJlclV0aWxzOwotaW1wb3J0IGFuZHJvaWQudGV4dC5UZXh0VXRpbHM7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkJhc2U2NDsKLWltcG9ydCBhbmRyb2lkLnV0aWwuQ2hhcnNldFV0aWxzOwotaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7Ci0KLWltcG9ydCBqYXZhLmlvLlVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uaW8uY2hhcnNldC5VbnN1cHBvcnRlZENoYXJzZXRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLS8qKgotICogPHA+Ci0gKiBUaGUgY2xhc3Mgd2hpY2ggbGV0cyB1c2VycyBjcmVhdGUgdGhlaXIgb3duIHZDYXJkIFN0cmluZy4gVHlwaWNhbCB1c2FnZSBpcyBhcyBmb2xsb3dzOgotICogPC9wPgotICogPHByZSBjbGFzcz0icHJldHR5cHJpbnQiPmZpbmFsIFZDYXJkQnVpbGRlciBidWlsZGVyID0gbmV3IFZDYXJkQnVpbGRlcih2Y2FyZFR5cGUpOwotICogYnVpbGRlci5hcHBlbmROYW1lUHJvcGVydGllcyhjb250ZW50VmFsdWVzTGlzdE1hcC5nZXQoU3RydWN0dXJlZE5hbWUuQ09OVEVOVF9JVEVNX1RZUEUpKQotICogICAgIC5hcHBlbmROaWNrTmFtZXMoY29udGVudFZhbHVlc0xpc3RNYXAuZ2V0KE5pY2tuYW1lLkNPTlRFTlRfSVRFTV9UWVBFKSkKLSAqICAgICAuYXBwZW5kUGhvbmVzKGNvbnRlbnRWYWx1ZXNMaXN0TWFwLmdldChQaG9uZS5DT05URU5UX0lURU1fVFlQRSkpCi0gKiAgICAgLmFwcGVuZEVtYWlscyhjb250ZW50VmFsdWVzTGlzdE1hcC5nZXQoRW1haWwuQ09OVEVOVF9JVEVNX1RZUEUpKQotICogICAgIC5hcHBlbmRQb3N0YWxzKGNvbnRlbnRWYWx1ZXNMaXN0TWFwLmdldChTdHJ1Y3R1cmVkUG9zdGFsLkNPTlRFTlRfSVRFTV9UWVBFKSkKLSAqICAgICAuYXBwZW5kT3JnYW5pemF0aW9ucyhjb250ZW50VmFsdWVzTGlzdE1hcC5nZXQoT3JnYW5pemF0aW9uLkNPTlRFTlRfSVRFTV9UWVBFKSkKLSAqICAgICAuYXBwZW5kV2Vic2l0ZXMoY29udGVudFZhbHVlc0xpc3RNYXAuZ2V0KFdlYnNpdGUuQ09OVEVOVF9JVEVNX1RZUEUpKQotICogICAgIC5hcHBlbmRQaG90b3MoY29udGVudFZhbHVlc0xpc3RNYXAuZ2V0KFBob3RvLkNPTlRFTlRfSVRFTV9UWVBFKSkKLSAqICAgICAuYXBwZW5kTm90ZXMoY29udGVudFZhbHVlc0xpc3RNYXAuZ2V0KE5vdGUuQ09OVEVOVF9JVEVNX1RZUEUpKQotICogICAgIC5hcHBlbmRFdmVudHMoY29udGVudFZhbHVlc0xpc3RNYXAuZ2V0KEV2ZW50LkNPTlRFTlRfSVRFTV9UWVBFKSkKLSAqICAgICAuYXBwZW5kSW1zKGNvbnRlbnRWYWx1ZXNMaXN0TWFwLmdldChJbS5DT05URU5UX0lURU1fVFlQRSkpCi0gKiAgICAgLmFwcGVuZFJlbGF0aW9uKGNvbnRlbnRWYWx1ZXNMaXN0TWFwLmdldChSZWxhdGlvbi5DT05URU5UX0lURU1fVFlQRSkpOwotICogcmV0dXJuIGJ1aWxkZXIudG9TdHJpbmcoKTs8L3ByZT4KLSAqLwotcHVibGljIGNsYXNzIFZDYXJkQnVpbGRlciB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIExPR19UQUcgPSAiVkNhcmRCdWlsZGVyIjsKLQotICAgIC8vIElmIHlvdSBhZGQgdGhlIG90aGVyIGVsZW1lbnQsIHBsZWFzZSBjaGVjayBhbGwgdGhlIGNvbHVtbnMgYXJlIGFibGUgdG8gYmUKLSAgICAvLyBjb252ZXJ0ZWQgdG8gU3RyaW5nLgotICAgIC8vCi0gICAgLy8gZS5nLiBCTE9CIGlzIG5vdCB3aGF0IHdlIGNhbiBoYW5kbGUgaGVyZSBub3cuCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU2V0PFN0cmluZz4gc0FsbG93ZWRBbmRyb2lkUHJvcGVydHlTZXQgPQotICAgICAgICAgICAgQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlU2V0KG5ldyBIYXNoU2V0PFN0cmluZz4oQXJyYXlzLmFzTGlzdCgKLSAgICAgICAgICAgICAgICAgICAgTmlja25hbWUuQ09OVEVOVF9JVEVNX1RZUEUsIEV2ZW50LkNPTlRFTlRfSVRFTV9UWVBFLAotICAgICAgICAgICAgICAgICAgICBSZWxhdGlvbi5DT05URU5UX0lURU1fVFlQRSkpKTsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERFRkFVTFRfUEhPTkVfVFlQRSA9IFBob25lLlRZUEVfSE9NRTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBERUZBVUxUX1BPU1RBTF9UWVBFID0gU3RydWN0dXJlZFBvc3RhbC5UWVBFX0hPTUU7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgREVGQVVMVF9FTUFJTF9UWVBFID0gRW1haWwuVFlQRV9PVEhFUjsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBWQ0FSRF9EQVRBX1ZDQVJEID0gIlZDQVJEIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkNBUkRfREFUQV9QVUJMSUMgPSAiUFVCTElDIjsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBWQ0FSRF9QQVJBTV9TRVBBUkFUT1IgPSAiOyI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFZDQVJEX0VORF9PRl9MSU5FID0gIlxyXG4iOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBWQ0FSRF9EQVRBX1NFUEFSQVRPUiA9ICI6IjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkNBUkRfSVRFTV9TRVBBUkFUT1IgPSAiOyI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFZDQVJEX1dTID0gIiAiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBWQ0FSRF9QQVJBTV9FUVVBTCA9ICI9IjsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBWQ0FSRF9QQVJBTV9FTkNPRElOR19RUCA9Ci0gICAgICAgICAgICAiRU5DT0RJTkc9IiArIFZDYXJkQ29uc3RhbnRzLlBBUkFNX0VOQ09ESU5HX1FQOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBWQ0FSRF9QQVJBTV9FTkNPRElOR19CQVNFNjRfVjIxID0KLSAgICAgICAgICAgICJFTkNPRElORz0iICsgVkNhcmRDb25zdGFudHMuUEFSQU1fRU5DT0RJTkdfQkFTRTY0OwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBWQ0FSRF9QQVJBTV9FTkNPRElOR19CQVNFNjRfQVNfQiA9Ci0gICAgICAgICAgICAiRU5DT0RJTkc9IiArIFZDYXJkQ29uc3RhbnRzLlBBUkFNX0VOQ09ESU5HX0I7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0hJRlRfSklTID0gIlNISUZUX0pJUyI7Ci0KLSAgICBwcml2YXRlIGZpbmFsIGludCBtVkNhcmRUeXBlOwotCi0gICAgcHJpdmF0ZSBmaW5hbCBib29sZWFuIG1Jc1YzME9yVjQwOwotICAgIHByaXZhdGUgZmluYWwgYm9vbGVhbiBtSXNKYXBhbmVzZU1vYmlsZVBob25lOwotICAgIHByaXZhdGUgZmluYWwgYm9vbGVhbiBtT25seU9uZU5vdGVGaWVsZElzQXZhaWxhYmxlOwotICAgIHByaXZhdGUgZmluYWwgYm9vbGVhbiBtSXNEb0NvTW87Ci0gICAgcHJpdmF0ZSBmaW5hbCBib29sZWFuIG1TaG91bGRVc2VRdW90ZWRQcmludGFibGU7Ci0gICAgcHJpdmF0ZSBmaW5hbCBib29sZWFuIG1Vc2VzQW5kcm9pZFByb3BlcnR5OwotICAgIHByaXZhdGUgZmluYWwgYm9vbGVhbiBtVXNlc0RlZmFjdFByb3BlcnR5OwotICAgIHByaXZhdGUgZmluYWwgYm9vbGVhbiBtQXBwZW5kVHlwZVBhcmFtTmFtZTsKLSAgICBwcml2YXRlIGZpbmFsIGJvb2xlYW4gbVJlZnJhaW5zUVBUb05hbWVQcm9wZXJ0aWVzOwotICAgIHByaXZhdGUgZmluYWwgYm9vbGVhbiBtTmVlZHNUb0NvbnZlcnRQaG9uZXRpY1N0cmluZzsKLQotICAgIHByaXZhdGUgZmluYWwgYm9vbGVhbiBtU2hvdWxkQXBwZW5kQ2hhcnNldFBhcmFtOwotCi0gICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbUNoYXJzZXQ7Ci0gICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbVZDYXJkQ2hhcnNldFBhcmFtZXRlcjsKLQotICAgIHByaXZhdGUgU3RyaW5nQnVpbGRlciBtQnVpbGRlcjsKLSAgICBwcml2YXRlIGJvb2xlYW4gbUVuZEFwcGVuZGVkOwotCi0gICAgcHVibGljIFZDYXJkQnVpbGRlcihmaW5hbCBpbnQgdmNhcmRUeXBlKSB7Ci0gICAgICAgIC8vIERlZmF1bHQgY2hhcnNldCBzaG91bGQgYmUgdXNlZAotICAgICAgICB0aGlzKHZjYXJkVHlwZSwgbnVsbCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIHZjYXJkVHlwZQotICAgICAqIEBwYXJhbSBjaGFyc2V0IElmIG51bGwsIHdlIHVzZSBkZWZhdWx0IGNoYXJzZXQgZm9yIGV4cG9ydC4KLSAgICAgKiBAaGlkZQotICAgICAqLwotICAgIHB1YmxpYyBWQ2FyZEJ1aWxkZXIoZmluYWwgaW50IHZjYXJkVHlwZSwgU3RyaW5nIGNoYXJzZXQpIHsKLSAgICAgICAgbVZDYXJkVHlwZSA9IHZjYXJkVHlwZTsKLQotICAgICAgICBMb2cudyhMT0dfVEFHLAotICAgICAgICAgICAgICAgICJTaG91bGQgbm90IHVzZSB2Q2FyZCA0LjAgd2hlbiBidWlsZGluZyB2Q2FyZC4gIiArCi0gICAgICAgICAgICAgICAgIkl0IGlzIG5vdCBvZmZpY2lhbGx5IHB1Ymxpc2hlZCB5ZXQuIik7Ci0KLSAgICAgICAgbUlzVjMwT3JWNDAgPSBWQ2FyZENvbmZpZy5pc1ZlcnNpb24zMCh2Y2FyZFR5cGUpIHx8IFZDYXJkQ29uZmlnLmlzVmVyc2lvbjQwKHZjYXJkVHlwZSk7Ci0gICAgICAgIG1TaG91bGRVc2VRdW90ZWRQcmludGFibGUgPSBWQ2FyZENvbmZpZy5zaG91bGRVc2VRdW90ZWRQcmludGFibGUodmNhcmRUeXBlKTsKLSAgICAgICAgbUlzRG9Db01vID0gVkNhcmRDb25maWcuaXNEb0NvTW8odmNhcmRUeXBlKTsKLSAgICAgICAgbUlzSmFwYW5lc2VNb2JpbGVQaG9uZSA9IFZDYXJkQ29uZmlnLm5lZWRzVG9Db252ZXJ0UGhvbmV0aWNTdHJpbmcodmNhcmRUeXBlKTsKLSAgICAgICAgbU9ubHlPbmVOb3RlRmllbGRJc0F2YWlsYWJsZSA9IFZDYXJkQ29uZmlnLm9ubHlPbmVOb3RlRmllbGRJc0F2YWlsYWJsZSh2Y2FyZFR5cGUpOwotICAgICAgICBtVXNlc0FuZHJvaWRQcm9wZXJ0eSA9IFZDYXJkQ29uZmlnLnVzZXNBbmRyb2lkU3BlY2lmaWNQcm9wZXJ0eSh2Y2FyZFR5cGUpOwotICAgICAgICBtVXNlc0RlZmFjdFByb3BlcnR5ID0gVkNhcmRDb25maWcudXNlc0RlZmFjdFByb3BlcnR5KHZjYXJkVHlwZSk7Ci0gICAgICAgIG1SZWZyYWluc1FQVG9OYW1lUHJvcGVydGllcyA9IFZDYXJkQ29uZmlnLnNob3VsZFJlZnJhaW5RUFRvTmFtZVByb3BlcnRpZXModmNhcmRUeXBlKTsKLSAgICAgICAgbUFwcGVuZFR5cGVQYXJhbU5hbWUgPSBWQ2FyZENvbmZpZy5hcHBlbmRUeXBlUGFyYW1OYW1lKHZjYXJkVHlwZSk7Ci0gICAgICAgIG1OZWVkc1RvQ29udmVydFBob25ldGljU3RyaW5nID0gVkNhcmRDb25maWcubmVlZHNUb0NvbnZlcnRQaG9uZXRpY1N0cmluZyh2Y2FyZFR5cGUpOwotCi0gICAgICAgIC8vIHZDYXJkIDIuMSByZXF1aXJlcyBjaGFyc2V0LgotICAgICAgICAvLyB2Q2FyZCAzLjAgZG9lcyBub3QgYWxsb3cgaXQgYnV0IHdlIGZvdW5kIHNvbWUgZGV2aWNlcyB1c2UgaXQgdG8gZGV0ZXJtaW5lCi0gICAgICAgIC8vIHRoZSBleGFjdCBjaGFyc2V0LgotICAgICAgICAvLyBXZSBjdXJyZW50bHkgYXBwZW5kIGl0IG9ubHkgd2hlbiBjaGFyc2V0IG90aGVyIHRoYW4gVVRGXzggaXMgdXNlZC4KLSAgICAgICAgbVNob3VsZEFwcGVuZENoYXJzZXRQYXJhbSA9Ci0gICAgICAgICAgICAgICAgIShWQ2FyZENvbmZpZy5pc1ZlcnNpb24zMCh2Y2FyZFR5cGUpICYmICJVVEYtOCIuZXF1YWxzSWdub3JlQ2FzZShjaGFyc2V0KSk7Ci0KLSAgICAgICAgaWYgKFZDYXJkQ29uZmlnLmlzRG9Db01vKHZjYXJkVHlwZSkpIHsKLSAgICAgICAgICAgIGlmICghU0hJRlRfSklTLmVxdWFsc0lnbm9yZUNhc2UoY2hhcnNldCkpIHsKLSAgICAgICAgICAgICAgICBMb2cudyhMT0dfVEFHLAotICAgICAgICAgICAgICAgICAgICAgICAgIlRoZSBjaGFyc2V0IFwiIiArIGNoYXJzZXQgKyAiXCIgaXMgdXNlZCB3aGlsZSAiCi0gICAgICAgICAgICAgICAgICAgICAgICArIFNISUZUX0pJUyArICIgaXMgbmVlZGVkIHRvIGJlIHVzZWQuIik7Ci0gICAgICAgICAgICAgICAgaWYgKFRleHRVdGlscy5pc0VtcHR5KGNoYXJzZXQpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1DaGFyc2V0ID0gU0hJRlRfSklTOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjaGFyc2V0ID0gQ2hhcnNldFV0aWxzLmNoYXJzZXRGb3JWZW5kb3IoY2hhcnNldCkubmFtZSgpOwotICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChVbnN1cHBvcnRlZENoYXJzZXRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmkoTE9HX1RBRywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNhcmVlci1zcGVjaWZpYyBcIiIgKyBjaGFyc2V0ICsgIlwiIHdhcyBub3QgZm91bmQgKGFzIHVzdWFsKS4gIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJVc2UgaXQgYXMgaXMuIik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgbUNoYXJzZXQgPSBjaGFyc2V0OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaWYgKG1Jc0RvQ29NbykgewotICAgICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAgICAgY2hhcnNldCA9IENoYXJzZXRVdGlscy5jaGFyc2V0Rm9yVmVuZG9yKFNISUZUX0pJUywgImRvY29tbyIpLm5hbWUoKTsKLSAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoVW5zdXBwb3J0ZWRDaGFyc2V0RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIExvZy5lKExPR19UQUcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJEb0NvTW8tc3BlY2lmaWMgU0hJRlRfSklTIHdhcyBub3QgZm91bmQuICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiVXNlIFNISUZUX0pJUyBhcyBpcy4iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNoYXJzZXQgPSBTSElGVF9KSVM7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAgICAgY2hhcnNldCA9IENoYXJzZXRVdGlscy5jaGFyc2V0Rm9yVmVuZG9yKFNISUZUX0pJUykubmFtZSgpOwotICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChVbnN1cHBvcnRlZENoYXJzZXRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmUoTE9HX1RBRywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNhcmVlci1zcGVjaWZpYyBTSElGVF9KSVMgd2FzIG5vdCBmb3VuZC4gIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJVc2UgU0hJRlRfSklTIGFzIGlzLiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgY2hhcnNldCA9IFNISUZUX0pJUzsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBtQ2hhcnNldCA9IGNoYXJzZXQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtVkNhcmRDaGFyc2V0UGFyYW1ldGVyID0gIkNIQVJTRVQ9IiArIFNISUZUX0pJUzsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGlmIChUZXh0VXRpbHMuaXNFbXB0eShjaGFyc2V0KSkgewotICAgICAgICAgICAgICAgIExvZy5pKExPR19UQUcsCi0gICAgICAgICAgICAgICAgICAgICAgICAiVXNlIHRoZSBjaGFyc2V0IFwiIiArIFZDYXJkQ29uZmlnLkRFRkFVTFRfRVhQT1JUX0NIQVJTRVQKLSAgICAgICAgICAgICAgICAgICAgICAgICsgIlwiIGZvciBleHBvcnQuIik7Ci0gICAgICAgICAgICAgICAgbUNoYXJzZXQgPSBWQ2FyZENvbmZpZy5ERUZBVUxUX0VYUE9SVF9DSEFSU0VUOwotICAgICAgICAgICAgICAgIG1WQ2FyZENoYXJzZXRQYXJhbWV0ZXIgPSAiQ0hBUlNFVD0iICsgVkNhcmRDb25maWcuREVGQVVMVF9FWFBPUlRfQ0hBUlNFVDsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgY2hhcnNldCA9IENoYXJzZXRVdGlscy5jaGFyc2V0Rm9yVmVuZG9yKGNoYXJzZXQpLm5hbWUoKTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChVbnN1cHBvcnRlZENoYXJzZXRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICBMb2cuaShMT0dfVEFHLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDYXJlZXItc3BlY2lmaWMgXCIiICsgY2hhcnNldCArICJcIiB3YXMgbm90IGZvdW5kIChhcyB1c3VhbCkuICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJVc2UgaXQgYXMgaXMuIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG1DaGFyc2V0ID0gY2hhcnNldDsKLSAgICAgICAgICAgICAgICBtVkNhcmRDaGFyc2V0UGFyYW1ldGVyID0gIkNIQVJTRVQ9IiArIGNoYXJzZXQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgY2xlYXIoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBjbGVhcigpIHsKLSAgICAgICAgbUJ1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotICAgICAgICBtRW5kQXBwZW5kZWQgPSBmYWxzZTsKLSAgICAgICAgYXBwZW5kTGluZShWQ2FyZENvbnN0YW50cy5QUk9QRVJUWV9CRUdJTiwgVkNBUkRfREFUQV9WQ0FSRCk7Ci0gICAgICAgIGlmIChWQ2FyZENvbmZpZy5pc1ZlcnNpb240MChtVkNhcmRUeXBlKSkgewotICAgICAgICAgICAgYXBwZW5kTGluZShWQ2FyZENvbnN0YW50cy5QUk9QRVJUWV9WRVJTSU9OLCBWQ2FyZENvbnN0YW50cy5WRVJTSU9OX1Y0MCk7Ci0gICAgICAgIH0gZWxzZSBpZiAoVkNhcmRDb25maWcuaXNWZXJzaW9uMzAobVZDYXJkVHlwZSkpIHsKLSAgICAgICAgICAgIGFwcGVuZExpbmUoVkNhcmRDb25zdGFudHMuUFJPUEVSVFlfVkVSU0lPTiwgVkNhcmRDb25zdGFudHMuVkVSU0lPTl9WMzApOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaWYgKCFWQ2FyZENvbmZpZy5pc1ZlcnNpb24yMShtVkNhcmRUeXBlKSkgewotICAgICAgICAgICAgICAgIExvZy53KExPR19UQUcsICJVbmtub3duIHZDYXJkIHZlcnNpb24gZGV0ZWN0ZWQuIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBhcHBlbmRMaW5lKFZDYXJkQ29uc3RhbnRzLlBST1BFUlRZX1ZFUlNJT04sIFZDYXJkQ29uc3RhbnRzLlZFUlNJT05fVjIxKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgYm9vbGVhbiBjb250YWluc05vbkVtcHR5TmFtZShmaW5hbCBDb250ZW50VmFsdWVzIGNvbnRlbnRWYWx1ZXMpIHsKLSAgICAgICAgZmluYWwgU3RyaW5nIGZhbWlseU5hbWUgPSBjb250ZW50VmFsdWVzLmdldEFzU3RyaW5nKFN0cnVjdHVyZWROYW1lLkZBTUlMWV9OQU1FKTsKLSAgICAgICAgZmluYWwgU3RyaW5nIG1pZGRsZU5hbWUgPSBjb250ZW50VmFsdWVzLmdldEFzU3RyaW5nKFN0cnVjdHVyZWROYW1lLk1JRERMRV9OQU1FKTsKLSAgICAgICAgZmluYWwgU3RyaW5nIGdpdmVuTmFtZSA9IGNvbnRlbnRWYWx1ZXMuZ2V0QXNTdHJpbmcoU3RydWN0dXJlZE5hbWUuR0lWRU5fTkFNRSk7Ci0gICAgICAgIGZpbmFsIFN0cmluZyBwcmVmaXggPSBjb250ZW50VmFsdWVzLmdldEFzU3RyaW5nKFN0cnVjdHVyZWROYW1lLlBSRUZJWCk7Ci0gICAgICAgIGZpbmFsIFN0cmluZyBzdWZmaXggPSBjb250ZW50VmFsdWVzLmdldEFzU3RyaW5nKFN0cnVjdHVyZWROYW1lLlNVRkZJWCk7Ci0gICAgICAgIGZpbmFsIFN0cmluZyBwaG9uZXRpY0ZhbWlseU5hbWUgPQotICAgICAgICAgICAgICAgIGNvbnRlbnRWYWx1ZXMuZ2V0QXNTdHJpbmcoU3RydWN0dXJlZE5hbWUuUEhPTkVUSUNfRkFNSUxZX05BTUUpOwotICAgICAgICBmaW5hbCBTdHJpbmcgcGhvbmV0aWNNaWRkbGVOYW1lID0KLSAgICAgICAgICAgICAgICBjb250ZW50VmFsdWVzLmdldEFzU3RyaW5nKFN0cnVjdHVyZWROYW1lLlBIT05FVElDX01JRERMRV9OQU1FKTsKLSAgICAgICAgZmluYWwgU3RyaW5nIHBob25ldGljR2l2ZW5OYW1lID0KLSAgICAgICAgICAgICAgICBjb250ZW50VmFsdWVzLmdldEFzU3RyaW5nKFN0cnVjdHVyZWROYW1lLlBIT05FVElDX0dJVkVOX05BTUUpOwotICAgICAgICBmaW5hbCBTdHJpbmcgZGlzcGxheU5hbWUgPSBjb250ZW50VmFsdWVzLmdldEFzU3RyaW5nKFN0cnVjdHVyZWROYW1lLkRJU1BMQVlfTkFNRSk7Ci0gICAgICAgIHJldHVybiAhKFRleHRVdGlscy5pc0VtcHR5KGZhbWlseU5hbWUpICYmIFRleHRVdGlscy5pc0VtcHR5KG1pZGRsZU5hbWUpICYmCi0gICAgICAgICAgICAgICAgVGV4dFV0aWxzLmlzRW1wdHkoZ2l2ZW5OYW1lKSAmJiBUZXh0VXRpbHMuaXNFbXB0eShwcmVmaXgpICYmCi0gICAgICAgICAgICAgICAgVGV4dFV0aWxzLmlzRW1wdHkoc3VmZml4KSAmJiBUZXh0VXRpbHMuaXNFbXB0eShwaG9uZXRpY0ZhbWlseU5hbWUpICYmCi0gICAgICAgICAgICAgICAgVGV4dFV0aWxzLmlzRW1wdHkocGhvbmV0aWNNaWRkbGVOYW1lKSAmJiBUZXh0VXRpbHMuaXNFbXB0eShwaG9uZXRpY0dpdmVuTmFtZSkgJiYKLSAgICAgICAgICAgICAgICBUZXh0VXRpbHMuaXNFbXB0eShkaXNwbGF5TmFtZSkpOwotICAgIH0KLQotICAgIHByaXZhdGUgQ29udGVudFZhbHVlcyBnZXRQcmltYXJ5Q29udGVudFZhbHVlKGZpbmFsIExpc3Q8Q29udGVudFZhbHVlcz4gY29udGVudFZhbHVlc0xpc3QpIHsKLSAgICAgICAgQ29udGVudFZhbHVlcyBwcmltYXJ5Q29udGVudFZhbHVlcyA9IG51bGw7Ci0gICAgICAgIENvbnRlbnRWYWx1ZXMgc3VicHJpbWFyeUNvbnRlbnRWYWx1ZXMgPSBudWxsOwotICAgICAgICBmb3IgKENvbnRlbnRWYWx1ZXMgY29udGVudFZhbHVlcyA6IGNvbnRlbnRWYWx1ZXNMaXN0KSB7Ci0gICAgICAgICAgICBpZiAoY29udGVudFZhbHVlcyA9PSBudWxsKXsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIEludGVnZXIgaXNTdXBlclByaW1hcnkgPSBjb250ZW50VmFsdWVzLmdldEFzSW50ZWdlcihTdHJ1Y3R1cmVkTmFtZS5JU19TVVBFUl9QUklNQVJZKTsKLSAgICAgICAgICAgIGlmIChpc1N1cGVyUHJpbWFyeSAhPSBudWxsICYmIGlzU3VwZXJQcmltYXJ5ID4gMCkgewotICAgICAgICAgICAgICAgIC8vIFdlIGNob29zZSAic3VwZXIgcHJpbWFyeSIgQ29udGVudFZhbHVlcy4KLSAgICAgICAgICAgICAgICBwcmltYXJ5Q29udGVudFZhbHVlcyA9IGNvbnRlbnRWYWx1ZXM7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKHByaW1hcnlDb250ZW50VmFsdWVzID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAvLyBXZSBjaG9vc2UgdGhlIGZpcnN0ICJwcmltYXJ5IiBDb250ZW50VmFsdWVzCi0gICAgICAgICAgICAgICAgLy8gaWYgInN1cGVyIHByaW1hcnkiIENvbnRlbnRWYWx1ZXMgZG9lcyBub3QgZXhpc3QuCi0gICAgICAgICAgICAgICAgZmluYWwgSW50ZWdlciBpc1ByaW1hcnkgPSBjb250ZW50VmFsdWVzLmdldEFzSW50ZWdlcihTdHJ1Y3R1cmVkTmFtZS5JU19QUklNQVJZKTsKLSAgICAgICAgICAgICAgICBpZiAoaXNQcmltYXJ5ICE9IG51bGwgJiYgaXNQcmltYXJ5ID4gMCAmJgotICAgICAgICAgICAgICAgICAgICAgICAgY29udGFpbnNOb25FbXB0eU5hbWUoY29udGVudFZhbHVlcykpIHsKLSAgICAgICAgICAgICAgICAgICAgcHJpbWFyeUNvbnRlbnRWYWx1ZXMgPSBjb250ZW50VmFsdWVzOwotICAgICAgICAgICAgICAgICAgICAvLyBEbyBub3QgYnJlYWssIHNpbmNlIHRoZXJlIG1heSBiZSBDb250ZW50VmFsdWVzIHdpdGggInN1cGVyIHByaW1hcnkiCi0gICAgICAgICAgICAgICAgICAgIC8vIGFmdGVyd29yZC4KLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHN1YnByaW1hcnlDb250ZW50VmFsdWVzID09IG51bGwgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRhaW5zTm9uRW1wdHlOYW1lKGNvbnRlbnRWYWx1ZXMpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHN1YnByaW1hcnlDb250ZW50VmFsdWVzID0gY29udGVudFZhbHVlczsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAocHJpbWFyeUNvbnRlbnRWYWx1ZXMgPT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKHN1YnByaW1hcnlDb250ZW50VmFsdWVzICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAvLyBXZSBjaG9vc2UgdGhlIGZpcnN0IENvbnRlbnRWYWx1ZXMgaWYgYW55ICJwcmltYXJ5IiBDb250ZW50VmFsdWVzIGRvZXMgbm90IGV4aXN0LgotICAgICAgICAgICAgICAgIHByaW1hcnlDb250ZW50VmFsdWVzID0gc3VicHJpbWFyeUNvbnRlbnRWYWx1ZXM7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIExvZy5lKExPR19UQUcsICJBbGwgQ29udGVudFZhbHVlcyBnaXZlbiBmcm9tIGRhdGFiYXNlIGlzIGVtcHR5LiIpOwotICAgICAgICAgICAgICAgIHByaW1hcnlDb250ZW50VmFsdWVzID0gbmV3IENvbnRlbnRWYWx1ZXMoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBwcmltYXJ5Q29udGVudFZhbHVlczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUbyBhdm9pZCB1bm5lY2Vzc2FyeSBjb21wbGljYXRpb24gaW4gbG9naWMsIHdlIHVzZSB0aGlzIG1ldGhvZCB0byBjb25zdHJ1Y3QgTiwgRk4KLSAgICAgKiBwcm9wZXJ0aWVzIGZvciB2Q2FyZCA0LjAuCi0gICAgICovCi0gICAgcHJpdmF0ZSBWQ2FyZEJ1aWxkZXIgYXBwZW5kTmFtZVByb3BlcnRpZXNWNDAoZmluYWwgTGlzdDxDb250ZW50VmFsdWVzPiBjb250ZW50VmFsdWVzTGlzdCkgewotICAgICAgICBpZiAobUlzRG9Db01vIHx8IG1OZWVkc1RvQ29udmVydFBob25ldGljU3RyaW5nKSB7Ci0gICAgICAgICAgICAvLyBJZ25vcmUgYWxsIGZsYWdzIHRoYXQgbG9vayBzdGFsZSBmcm9tIHRoZSB2aWV3IG9mIHZDYXJkIDQuMCB0bwotICAgICAgICAgICAgLy8gc2ltcGxpZnkgY29uc3RydWN0aW9uIGFsZ29yaXRobS4gQWN0dWFsbHkgd2UgZG9uJ3QgaGF2ZSBhbnkgdkNhcmQgZmlsZQotICAgICAgICAgICAgLy8gYXZhaWxhYmxlIGZyb20gcmVhbCB3b3JsZCB5ZXQsIHNvIHdlIG1heSBuZWVkIHRvIHJlLWVuYWJsZSBzb21lIG9mIHRoZXNlCi0gICAgICAgICAgICAvLyBpbiB0aGUgZnV0dXJlLgotICAgICAgICAgICAgTG9nLncoTE9HX1RBRywgIkludmFsaWQgZmxhZyBpcyB1c2VkIGluIHZDYXJkIDQuMCBjb25zdHJ1Y3Rpb24uIElnbm9yZWQuIik7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoY29udGVudFZhbHVlc0xpc3QgPT0gbnVsbCB8fCBjb250ZW50VmFsdWVzTGlzdC5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgIGFwcGVuZExpbmUoVkNhcmRDb25zdGFudHMuUFJPUEVSVFlfRk4sICIiKTsKLSAgICAgICAgICAgIHJldHVybiB0aGlzOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gV2UgaGF2ZSBkaWZmaWN1bHR5IGhlcmUuIEhvdyBjYW4gd2UgYXBwcm9wcmlhdGVseSBoYW5kbGUgU3RydWN0dXJlZE5hbWUgd2l0aAotICAgICAgICAvLyBtaXNzaW5nIHBhcnRzIG5lY2Vzc2FyeSBmb3IgZGlzcGxheWluZyB3aGlsZSBpdCBoYXMgc3VwcHJlbWVudGFsIGluZm9ybWF0aW9uLgotICAgICAgICAvLwotICAgICAgICAvLyBlLmcuIEhvdyB0byBoYW5kbGUgbm9uLWVtcHR5IHBob25ldGljIG5hbWVzIHdpdGggZW1wdHkgc3RydWN0dXJlZCBuYW1lcz8KLQotICAgICAgICBmaW5hbCBDb250ZW50VmFsdWVzIGNvbnRlbnRWYWx1ZXMgPSBnZXRQcmltYXJ5Q29udGVudFZhbHVlKGNvbnRlbnRWYWx1ZXNMaXN0KTsKLSAgICAgICAgU3RyaW5nIGZhbWlseU5hbWUgPSBjb250ZW50VmFsdWVzLmdldEFzU3RyaW5nKFN0cnVjdHVyZWROYW1lLkZBTUlMWV9OQU1FKTsKLSAgICAgICAgZmluYWwgU3RyaW5nIG1pZGRsZU5hbWUgPSBjb250ZW50VmFsdWVzLmdldEFzU3RyaW5nKFN0cnVjdHVyZWROYW1lLk1JRERMRV9OQU1FKTsKLSAgICAgICAgZmluYWwgU3RyaW5nIGdpdmVuTmFtZSA9IGNvbnRlbnRWYWx1ZXMuZ2V0QXNTdHJpbmcoU3RydWN0dXJlZE5hbWUuR0lWRU5fTkFNRSk7Ci0gICAgICAgIGZpbmFsIFN0cmluZyBwcmVmaXggPSBjb250ZW50VmFsdWVzLmdldEFzU3RyaW5nKFN0cnVjdHVyZWROYW1lLlBSRUZJWCk7Ci0gICAgICAgIGZpbmFsIFN0cmluZyBzdWZmaXggPSBjb250ZW50VmFsdWVzLmdldEFzU3RyaW5nKFN0cnVjdHVyZWROYW1lLlNVRkZJWCk7Ci0gICAgICAgIGZpbmFsIFN0cmluZyBmb3JtYXR0ZWROYW1lID0gY29udGVudFZhbHVlcy5nZXRBc1N0cmluZyhTdHJ1Y3R1cmVkTmFtZS5ESVNQTEFZX05BTUUpOwotICAgICAgICBpZiAoVGV4dFV0aWxzLmlzRW1wdHkoZmFtaWx5TmFtZSkKLSAgICAgICAgICAgICAgICAmJiBUZXh0VXRpbHMuaXNFbXB0eShnaXZlbk5hbWUpCi0gICAgICAgICAgICAgICAgJiYgVGV4dFV0aWxzLmlzRW1wdHkobWlkZGxlTmFtZSkKLSAgICAgICAgICAgICAgICAmJiBUZXh0VXRpbHMuaXNFbXB0eShwcmVmaXgpCi0gICAgICAgICAgICAgICAgJiYgVGV4dFV0aWxzLmlzRW1wdHkoc3VmZml4KSkgewotICAgICAgICAgICAgaWYgKFRleHRVdGlscy5pc0VtcHR5KGZvcm1hdHRlZE5hbWUpKSB7Ci0gICAgICAgICAgICAgICAgYXBwZW5kTGluZShWQ2FyZENvbnN0YW50cy5QUk9QRVJUWV9GTiwgIiIpOwotICAgICAgICAgICAgICAgIHJldHVybiB0aGlzOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZmFtaWx5TmFtZSA9IGZvcm1hdHRlZE5hbWU7Ci0gICAgICAgIH0KLQotICAgICAgICBmaW5hbCBTdHJpbmcgcGhvbmV0aWNGYW1pbHlOYW1lID0KLSAgICAgICAgICAgICAgICBjb250ZW50VmFsdWVzLmdldEFzU3RyaW5nKFN0cnVjdHVyZWROYW1lLlBIT05FVElDX0ZBTUlMWV9OQU1FKTsKLSAgICAgICAgZmluYWwgU3RyaW5nIHBob25ldGljTWlkZGxlTmFtZSA9Ci0gICAgICAgICAgICAgICAgY29udGVudFZhbHVlcy5nZXRBc1N0cmluZyhTdHJ1Y3R1cmVkTmFtZS5QSE9ORVRJQ19NSURETEVfTkFNRSk7Ci0gICAgICAgIGZpbmFsIFN0cmluZyBwaG9uZXRpY0dpdmVuTmFtZSA9Ci0gICAgICAgICAgICAgICAgY29udGVudFZhbHVlcy5nZXRBc1N0cmluZyhTdHJ1Y3R1cmVkTmFtZS5QSE9ORVRJQ19HSVZFTl9OQU1FKTsKLSAgICAgICAgZmluYWwgU3RyaW5nIGVzY2FwZWRGYW1pbHkgPSBlc2NhcGVDaGFyYWN0ZXJzKGZhbWlseU5hbWUpOwotICAgICAgICBmaW5hbCBTdHJpbmcgZXNjYXBlZEdpdmVuID0gZXNjYXBlQ2hhcmFjdGVycyhnaXZlbk5hbWUpOwotICAgICAgICBmaW5hbCBTdHJpbmcgZXNjYXBlZE1pZGRsZSA9IGVzY2FwZUNoYXJhY3RlcnMobWlkZGxlTmFtZSk7Ci0gICAgICAgIGZpbmFsIFN0cmluZyBlc2NhcGVkUHJlZml4ID0gZXNjYXBlQ2hhcmFjdGVycyhwcmVmaXgpOwotICAgICAgICBmaW5hbCBTdHJpbmcgZXNjYXBlZFN1ZmZpeCA9IGVzY2FwZUNoYXJhY3RlcnMoc3VmZml4KTsKLQotICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNhcmRDb25zdGFudHMuUFJPUEVSVFlfTik7Ci0KLSAgICAgICAgaWYgKCEoVGV4dFV0aWxzLmlzRW1wdHkocGhvbmV0aWNGYW1pbHlOYW1lKSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgVGV4dFV0aWxzLmlzRW1wdHkocGhvbmV0aWNNaWRkbGVOYW1lKSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgVGV4dFV0aWxzLmlzRW1wdHkocGhvbmV0aWNHaXZlbk5hbWUpKSkgewotICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDQVJEX1BBUkFNX1NFUEFSQVRPUik7Ci0gICAgICAgICAgICBmaW5hbCBTdHJpbmcgc29ydEFzID0gZXNjYXBlQ2hhcmFjdGVycyhwaG9uZXRpY0ZhbWlseU5hbWUpCi0gICAgICAgICAgICAgICAgICAgICsgJzsnICsgZXNjYXBlQ2hhcmFjdGVycyhwaG9uZXRpY0dpdmVuTmFtZSkKLSAgICAgICAgICAgICAgICAgICAgKyAnOycgKyBlc2NhcGVDaGFyYWN0ZXJzKHBob25ldGljTWlkZGxlTmFtZSk7Ci0gICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoIlNPUlQtQVM9IikuYXBwZW5kKAotICAgICAgICAgICAgICAgICAgICBWQ2FyZFV0aWxzLnRvU3RyaW5nQXNWNDBQYXJhbVZhbHVlKHNvcnRBcykpOwotICAgICAgICB9Ci0KLSAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDQVJEX0RBVEFfU0VQQVJBVE9SKTsKLSAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKGVzY2FwZWRGYW1pbHkpOwotICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNBUkRfSVRFTV9TRVBBUkFUT1IpOwotICAgICAgICBtQnVpbGRlci5hcHBlbmQoZXNjYXBlZEdpdmVuKTsKLSAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDQVJEX0lURU1fU0VQQVJBVE9SKTsKLSAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKGVzY2FwZWRNaWRkbGUpOwotICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNBUkRfSVRFTV9TRVBBUkFUT1IpOwotICAgICAgICBtQnVpbGRlci5hcHBlbmQoZXNjYXBlZFByZWZpeCk7Ci0gICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ0FSRF9JVEVNX1NFUEFSQVRPUik7Ci0gICAgICAgIG1CdWlsZGVyLmFwcGVuZChlc2NhcGVkU3VmZml4KTsKLSAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDQVJEX0VORF9PRl9MSU5FKTsKLQotICAgICAgICBpZiAoVGV4dFV0aWxzLmlzRW1wdHkoZm9ybWF0dGVkTmFtZSkpIHsKLSAgICAgICAgICAgIC8vIE5vdGU6Ci0gICAgICAgICAgICAvLyBESVNQTEFZX05BTUUgZG9lc24ndCBleGlzdCB3aGlsZSBzb21lIG90aGVyIGVsZW1lbnRzIGRvLCB3aGljaCBpcyB1c3VhbGx5Ci0gICAgICAgICAgICAvLyB3ZWlyZCBpbiBBbmRyb2lkLCBhcyBESVNQTEFZX05BTUUgc2hvdWxkICh1c3VhbGx5KSBiZSBjb25zdHJ1Y3RlZAotICAgICAgICAgICAgLy8gZnJvbSB0aGUgb3RoZXJzIHVzaW5nIGxvY2FsZSBpbmZvcm1hdGlvbiBhbmQgaXRzIGNvZGUgcG9pbnRzLgotICAgICAgICAgICAgTG9nLncoTE9HX1RBRywgIkRJU1BMQVlfTkFNRSBpcyBlbXB0eS4iKTsKLQotICAgICAgICAgICAgZmluYWwgU3RyaW5nIGVzY2FwZWQgPSBlc2NhcGVDaGFyYWN0ZXJzKFZDYXJkVXRpbHMuY29uc3RydWN0TmFtZUZyb21FbGVtZW50cygKLSAgICAgICAgICAgICAgICAgICAgVkNhcmRDb25maWcuZ2V0TmFtZU9yZGVyVHlwZShtVkNhcmRUeXBlKSwKLSAgICAgICAgICAgICAgICAgICAgZmFtaWx5TmFtZSwgbWlkZGxlTmFtZSwgZ2l2ZW5OYW1lLCBwcmVmaXgsIHN1ZmZpeCkpOwotICAgICAgICAgICAgYXBwZW5kTGluZShWQ2FyZENvbnN0YW50cy5QUk9QRVJUWV9GTiwgZXNjYXBlZCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBmaW5hbCBTdHJpbmcgZXNjYXBlZEZvcm1hdHRlZCA9IGVzY2FwZUNoYXJhY3RlcnMoZm9ybWF0dGVkTmFtZSk7Ci0gICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNhcmRDb25zdGFudHMuUFJPUEVSVFlfRk4pOwotICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDQVJEX0RBVEFfU0VQQVJBVE9SKTsKLSAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChlc2NhcGVkRm9ybWF0dGVkKTsKLSAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ0FSRF9FTkRfT0ZfTElORSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBXZSBtYXkgbmVlZCBYLSBwcm9wZXJ0aWVzIGZvciBwaG9uZXRpYyBuYW1lcy4KLSAgICAgICAgYXBwZW5kUGhvbmV0aWNOYW1lRmllbGRzKGNvbnRlbnRWYWx1ZXMpOwotICAgICAgICByZXR1cm4gdGhpczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBGb3Igc2FmZXR5LCB3ZSdsbCBlbWl0IGp1c3Qgb25lIHZhbHVlIGFyb3VuZCBTdHJ1Y3R1cmVkTmFtZSwgYXMgZXh0ZXJuYWwgaW1wb3J0ZXJzCi0gICAgICogbWF5IGdldCBjb25mdXNlZCB3aXRoIG11bHRpcGxlICJOIiwgIkZOIiwgZXRjLiBwcm9wZXJ0aWVzLCB0aG91Z2ggaXQgaXMgdmFsaWQgaW4KLSAgICAgKiB2Q2FyZCBzcGVjLgotICAgICAqLwotICAgIHB1YmxpYyBWQ2FyZEJ1aWxkZXIgYXBwZW5kTmFtZVByb3BlcnRpZXMoZmluYWwgTGlzdDxDb250ZW50VmFsdWVzPiBjb250ZW50VmFsdWVzTGlzdCkgewotICAgICAgICBpZiAoVkNhcmRDb25maWcuaXNWZXJzaW9uNDAobVZDYXJkVHlwZSkpIHsKLSAgICAgICAgICAgIHJldHVybiBhcHBlbmROYW1lUHJvcGVydGllc1Y0MChjb250ZW50VmFsdWVzTGlzdCk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoY29udGVudFZhbHVlc0xpc3QgPT0gbnVsbCB8fCBjb250ZW50VmFsdWVzTGlzdC5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgIGlmIChWQ2FyZENvbmZpZy5pc1ZlcnNpb24zMChtVkNhcmRUeXBlKSkgewotICAgICAgICAgICAgICAgIC8vIHZDYXJkIDMuMCByZXF1aXJlcyAiTiIgYW5kICJGTiIgcHJvcGVydGllcy4KLSAgICAgICAgICAgICAgICAvLyB2Q2FyZCA0LjAgZG9lcyBOT1QgcmVxdWlyZSBOLCBidXQgd2UgdGFrZSBjYXJlIG9mIHBvc3NpYmxlIGJhY2t3YXJkCi0gICAgICAgICAgICAgICAgLy8gY29tcGF0aWJpbGl0eSBpc3N1ZXMuCi0gICAgICAgICAgICAgICAgYXBwZW5kTGluZShWQ2FyZENvbnN0YW50cy5QUk9QRVJUWV9OLCAiIik7Ci0gICAgICAgICAgICAgICAgYXBwZW5kTGluZShWQ2FyZENvbnN0YW50cy5QUk9QRVJUWV9GTiwgIiIpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChtSXNEb0NvTW8pIHsKLSAgICAgICAgICAgICAgICBhcHBlbmRMaW5lKFZDYXJkQ29uc3RhbnRzLlBST1BFUlRZX04sICIiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiB0aGlzOwotICAgICAgICB9Ci0KLSAgICAgICAgZmluYWwgQ29udGVudFZhbHVlcyBjb250ZW50VmFsdWVzID0gZ2V0UHJpbWFyeUNvbnRlbnRWYWx1ZShjb250ZW50VmFsdWVzTGlzdCk7Ci0gICAgICAgIGZpbmFsIFN0cmluZyBmYW1pbHlOYW1lID0gY29udGVudFZhbHVlcy5nZXRBc1N0cmluZyhTdHJ1Y3R1cmVkTmFtZS5GQU1JTFlfTkFNRSk7Ci0gICAgICAgIGZpbmFsIFN0cmluZyBtaWRkbGVOYW1lID0gY29udGVudFZhbHVlcy5nZXRBc1N0cmluZyhTdHJ1Y3R1cmVkTmFtZS5NSURETEVfTkFNRSk7Ci0gICAgICAgIGZpbmFsIFN0cmluZyBnaXZlbk5hbWUgPSBjb250ZW50VmFsdWVzLmdldEFzU3RyaW5nKFN0cnVjdHVyZWROYW1lLkdJVkVOX05BTUUpOwotICAgICAgICBmaW5hbCBTdHJpbmcgcHJlZml4ID0gY29udGVudFZhbHVlcy5nZXRBc1N0cmluZyhTdHJ1Y3R1cmVkTmFtZS5QUkVGSVgpOwotICAgICAgICBmaW5hbCBTdHJpbmcgc3VmZml4ID0gY29udGVudFZhbHVlcy5nZXRBc1N0cmluZyhTdHJ1Y3R1cmVkTmFtZS5TVUZGSVgpOwotICAgICAgICBmaW5hbCBTdHJpbmcgZGlzcGxheU5hbWUgPSBjb250ZW50VmFsdWVzLmdldEFzU3RyaW5nKFN0cnVjdHVyZWROYW1lLkRJU1BMQVlfTkFNRSk7Ci0KLSAgICAgICAgaWYgKCFUZXh0VXRpbHMuaXNFbXB0eShmYW1pbHlOYW1lKSB8fCAhVGV4dFV0aWxzLmlzRW1wdHkoZ2l2ZW5OYW1lKSkgewotICAgICAgICAgICAgZmluYWwgYm9vbGVhbiByZWFsbHlBcHBlbmRDaGFyc2V0UGFyYW1ldGVyVG9OYW1lID0KLSAgICAgICAgICAgICAgICAgICAgc2hvdWxkQXBwZW5kQ2hhcnNldFBhcmFtKGZhbWlseU5hbWUsIGdpdmVuTmFtZSwgbWlkZGxlTmFtZSwgcHJlZml4LCBzdWZmaXgpOwotICAgICAgICAgICAgZmluYWwgYm9vbGVhbiByZWFsbHlVc2VRdW90ZWRQcmludGFibGVUb05hbWUgPQotICAgICAgICAgICAgICAgICAgICAoIW1SZWZyYWluc1FQVG9OYW1lUHJvcGVydGllcyAmJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICEoVkNhcmRVdGlscy5jb250YWluc09ubHlOb25DckxmUHJpbnRhYmxlQXNjaWkoZmFtaWx5TmFtZSkgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZDYXJkVXRpbHMuY29udGFpbnNPbmx5Tm9uQ3JMZlByaW50YWJsZUFzY2lpKGdpdmVuTmFtZSkgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZDYXJkVXRpbHMuY29udGFpbnNPbmx5Tm9uQ3JMZlByaW50YWJsZUFzY2lpKG1pZGRsZU5hbWUpICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWQ2FyZFV0aWxzLmNvbnRhaW5zT25seU5vbkNyTGZQcmludGFibGVBc2NpaShwcmVmaXgpICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWQ2FyZFV0aWxzLmNvbnRhaW5zT25seU5vbkNyTGZQcmludGFibGVBc2NpaShzdWZmaXgpKSk7Ci0KLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyBmb3JtYXR0ZWROYW1lOwotICAgICAgICAgICAgaWYgKCFUZXh0VXRpbHMuaXNFbXB0eShkaXNwbGF5TmFtZSkpIHsKLSAgICAgICAgICAgICAgICBmb3JtYXR0ZWROYW1lID0gZGlzcGxheU5hbWU7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGZvcm1hdHRlZE5hbWUgPSBWQ2FyZFV0aWxzLmNvbnN0cnVjdE5hbWVGcm9tRWxlbWVudHMoCi0gICAgICAgICAgICAgICAgICAgICAgICBWQ2FyZENvbmZpZy5nZXROYW1lT3JkZXJUeXBlKG1WQ2FyZFR5cGUpLAotICAgICAgICAgICAgICAgICAgICAgICAgZmFtaWx5TmFtZSwgbWlkZGxlTmFtZSwgZ2l2ZW5OYW1lLCBwcmVmaXgsIHN1ZmZpeCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmaW5hbCBib29sZWFuIHJlYWxseUFwcGVuZENoYXJzZXRQYXJhbWV0ZXJUb0ZOID0KLSAgICAgICAgICAgICAgICAgICAgc2hvdWxkQXBwZW5kQ2hhcnNldFBhcmFtKGZvcm1hdHRlZE5hbWUpOwotICAgICAgICAgICAgZmluYWwgYm9vbGVhbiByZWFsbHlVc2VRdW90ZWRQcmludGFibGVUb0ZOID0KLSAgICAgICAgICAgICAgICAgICAgIW1SZWZyYWluc1FQVG9OYW1lUHJvcGVydGllcyAmJgotICAgICAgICAgICAgICAgICAgICAhVkNhcmRVdGlscy5jb250YWluc09ubHlOb25DckxmUHJpbnRhYmxlQXNjaWkoZm9ybWF0dGVkTmFtZSk7Ci0KLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyBlbmNvZGVkRmFtaWx5OwotICAgICAgICAgICAgZmluYWwgU3RyaW5nIGVuY29kZWRHaXZlbjsKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyBlbmNvZGVkTWlkZGxlOwotICAgICAgICAgICAgZmluYWwgU3RyaW5nIGVuY29kZWRQcmVmaXg7Ci0gICAgICAgICAgICBmaW5hbCBTdHJpbmcgZW5jb2RlZFN1ZmZpeDsKLSAgICAgICAgICAgIGlmIChyZWFsbHlVc2VRdW90ZWRQcmludGFibGVUb05hbWUpIHsKLSAgICAgICAgICAgICAgICBlbmNvZGVkRmFtaWx5ID0gZW5jb2RlUXVvdGVkUHJpbnRhYmxlKGZhbWlseU5hbWUpOwotICAgICAgICAgICAgICAgIGVuY29kZWRHaXZlbiA9IGVuY29kZVF1b3RlZFByaW50YWJsZShnaXZlbk5hbWUpOwotICAgICAgICAgICAgICAgIGVuY29kZWRNaWRkbGUgPSBlbmNvZGVRdW90ZWRQcmludGFibGUobWlkZGxlTmFtZSk7Ci0gICAgICAgICAgICAgICAgZW5jb2RlZFByZWZpeCA9IGVuY29kZVF1b3RlZFByaW50YWJsZShwcmVmaXgpOwotICAgICAgICAgICAgICAgIGVuY29kZWRTdWZmaXggPSBlbmNvZGVRdW90ZWRQcmludGFibGUoc3VmZml4KTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgZW5jb2RlZEZhbWlseSA9IGVzY2FwZUNoYXJhY3RlcnMoZmFtaWx5TmFtZSk7Ci0gICAgICAgICAgICAgICAgZW5jb2RlZEdpdmVuID0gZXNjYXBlQ2hhcmFjdGVycyhnaXZlbk5hbWUpOwotICAgICAgICAgICAgICAgIGVuY29kZWRNaWRkbGUgPSBlc2NhcGVDaGFyYWN0ZXJzKG1pZGRsZU5hbWUpOwotICAgICAgICAgICAgICAgIGVuY29kZWRQcmVmaXggPSBlc2NhcGVDaGFyYWN0ZXJzKHByZWZpeCk7Ci0gICAgICAgICAgICAgICAgZW5jb2RlZFN1ZmZpeCA9IGVzY2FwZUNoYXJhY3RlcnMoc3VmZml4KTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgZmluYWwgU3RyaW5nIGVuY29kZWRGb3JtYXR0ZWRuYW1lID0KLSAgICAgICAgICAgICAgICAgICAgKHJlYWxseVVzZVF1b3RlZFByaW50YWJsZVRvRk4gPwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuY29kZVF1b3RlZFByaW50YWJsZShmb3JtYXR0ZWROYW1lKSA6IGVzY2FwZUNoYXJhY3RlcnMoZm9ybWF0dGVkTmFtZSkpOwotCi0gICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNhcmRDb25zdGFudHMuUFJPUEVSVFlfTik7Ci0gICAgICAgICAgICBpZiAobUlzRG9Db01vKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHJlYWxseUFwcGVuZENoYXJzZXRQYXJhbWV0ZXJUb05hbWUpIHsKLSAgICAgICAgICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDQVJEX1BBUkFNX1NFUEFSQVRPUik7Ci0gICAgICAgICAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChtVkNhcmRDaGFyc2V0UGFyYW1ldGVyKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKHJlYWxseVVzZVF1b3RlZFByaW50YWJsZVRvTmFtZSkgewotICAgICAgICAgICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNBUkRfUEFSQU1fU0VQQVJBVE9SKTsKLSAgICAgICAgICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDQVJEX1BBUkFNX0VOQ09ESU5HX1FQKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDQVJEX0RBVEFfU0VQQVJBVE9SKTsKLSAgICAgICAgICAgICAgICAvLyBEb0NvTW8gcGhvbmVzIHJlcXVpcmUgdGhhdCBhbGwgdGhlIGVsZW1lbnRzIGluIHRoZSAiZmFtaWx5IG5hbWUiIGZpZWxkLgotICAgICAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChmb3JtYXR0ZWROYW1lKTsKLSAgICAgICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNBUkRfSVRFTV9TRVBBUkFUT1IpOwotICAgICAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ0FSRF9JVEVNX1NFUEFSQVRPUik7Ci0gICAgICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDQVJEX0lURU1fU0VQQVJBVE9SKTsKLSAgICAgICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNBUkRfSVRFTV9TRVBBUkFUT1IpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBpZiAocmVhbGx5QXBwZW5kQ2hhcnNldFBhcmFtZXRlclRvTmFtZSkgewotICAgICAgICAgICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNBUkRfUEFSQU1fU0VQQVJBVE9SKTsKLSAgICAgICAgICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKG1WQ2FyZENoYXJzZXRQYXJhbWV0ZXIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAocmVhbGx5VXNlUXVvdGVkUHJpbnRhYmxlVG9OYW1lKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ0FSRF9QQVJBTV9TRVBBUkFUT1IpOwotICAgICAgICAgICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNBUkRfUEFSQU1fRU5DT0RJTkdfUVApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNBUkRfREFUQV9TRVBBUkFUT1IpOwotICAgICAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChlbmNvZGVkRmFtaWx5KTsKLSAgICAgICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNBUkRfSVRFTV9TRVBBUkFUT1IpOwotICAgICAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChlbmNvZGVkR2l2ZW4pOwotICAgICAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ0FSRF9JVEVNX1NFUEFSQVRPUik7Ci0gICAgICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKGVuY29kZWRNaWRkbGUpOwotICAgICAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ0FSRF9JVEVNX1NFUEFSQVRPUik7Ci0gICAgICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKGVuY29kZWRQcmVmaXgpOwotICAgICAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ0FSRF9JVEVNX1NFUEFSQVRPUik7Ci0gICAgICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKGVuY29kZWRTdWZmaXgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDQVJEX0VORF9PRl9MSU5FKTsKLQotICAgICAgICAgICAgLy8gRk4gcHJvcGVydHkKLSAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ2FyZENvbnN0YW50cy5QUk9QRVJUWV9GTik7Ci0gICAgICAgICAgICBpZiAocmVhbGx5QXBwZW5kQ2hhcnNldFBhcmFtZXRlclRvRk4pIHsKLSAgICAgICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNBUkRfUEFSQU1fU0VQQVJBVE9SKTsKLSAgICAgICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQobVZDYXJkQ2hhcnNldFBhcmFtZXRlcik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAocmVhbGx5VXNlUXVvdGVkUHJpbnRhYmxlVG9GTikgewotICAgICAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ0FSRF9QQVJBTV9TRVBBUkFUT1IpOwotICAgICAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ0FSRF9QQVJBTV9FTkNPRElOR19RUCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNBUkRfREFUQV9TRVBBUkFUT1IpOwotICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKGVuY29kZWRGb3JtYXR0ZWRuYW1lKTsKLSAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ0FSRF9FTkRfT0ZfTElORSk7Ci0gICAgICAgIH0gZWxzZSBpZiAoIVRleHRVdGlscy5pc0VtcHR5KGRpc3BsYXlOYW1lKSkgewotICAgICAgICAgICAgZmluYWwgYm9vbGVhbiByZWFsbHlVc2VRdW90ZWRQcmludGFibGVUb0Rpc3BsYXlOYW1lID0KLSAgICAgICAgICAgICAgICAoIW1SZWZyYWluc1FQVG9OYW1lUHJvcGVydGllcyAmJgotICAgICAgICAgICAgICAgICAgICAgICAgIVZDYXJkVXRpbHMuY29udGFpbnNPbmx5Tm9uQ3JMZlByaW50YWJsZUFzY2lpKGRpc3BsYXlOYW1lKSk7Ci0gICAgICAgICAgICBmaW5hbCBTdHJpbmcgZW5jb2RlZERpc3BsYXlOYW1lID0KLSAgICAgICAgICAgICAgICAgICAgcmVhbGx5VXNlUXVvdGVkUHJpbnRhYmxlVG9EaXNwbGF5TmFtZSA/Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5jb2RlUXVvdGVkUHJpbnRhYmxlKGRpc3BsYXlOYW1lKSA6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVzY2FwZUNoYXJhY3RlcnMoZGlzcGxheU5hbWUpOwotCi0gICAgICAgICAgICAvLyBOCi0gICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNhcmRDb25zdGFudHMuUFJPUEVSVFlfTik7Ci0gICAgICAgICAgICBpZiAoc2hvdWxkQXBwZW5kQ2hhcnNldFBhcmFtKGRpc3BsYXlOYW1lKSkgewotICAgICAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ0FSRF9QQVJBTV9TRVBBUkFUT1IpOwotICAgICAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChtVkNhcmRDaGFyc2V0UGFyYW1ldGVyKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChyZWFsbHlVc2VRdW90ZWRQcmludGFibGVUb0Rpc3BsYXlOYW1lKSB7Ci0gICAgICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDQVJEX1BBUkFNX1NFUEFSQVRPUik7Ci0gICAgICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDQVJEX1BBUkFNX0VOQ09ESU5HX1FQKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ0FSRF9EQVRBX1NFUEFSQVRPUik7Ci0gICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoZW5jb2RlZERpc3BsYXlOYW1lKTsKLSAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ0FSRF9JVEVNX1NFUEFSQVRPUik7Ci0gICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNBUkRfSVRFTV9TRVBBUkFUT1IpOwotICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDQVJEX0lURU1fU0VQQVJBVE9SKTsKLSAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ0FSRF9JVEVNX1NFUEFSQVRPUik7Ci0gICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNBUkRfRU5EX09GX0xJTkUpOwotCi0gICAgICAgICAgICAvLyBGTgotICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDYXJkQ29uc3RhbnRzLlBST1BFUlRZX0ZOKTsKLQotICAgICAgICAgICAgLy8gTm90ZTogIkNIQVJTRVQiIHBhcmFtIGlzIG5vdCBhbGxvd2VkIGluIHZDYXJkIDMuMCwgYnV0IHdlIG1heSBhZGQgaXQKLSAgICAgICAgICAgIC8vICAgICAgIHdoZW4gaXQgd291bGQgYmUgdXNlZnVsIG9yIG5lY2Vzc2FyeSBmb3IgZXh0ZXJuYWwgaW1wb3J0ZXJzLAotICAgICAgICAgICAgLy8gICAgICAgYXNzdW1pbmcgdGhlIGV4dGVybmFsIGltcG9ydGVyIGFsbG93cyB0aGlzIHZpb3JhdGlvbiBvZiB0aGUgc3BlYy4KLSAgICAgICAgICAgIGlmIChzaG91bGRBcHBlbmRDaGFyc2V0UGFyYW0oZGlzcGxheU5hbWUpKSB7Ci0gICAgICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDQVJEX1BBUkFNX1NFUEFSQVRPUik7Ci0gICAgICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKG1WQ2FyZENoYXJzZXRQYXJhbWV0ZXIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDQVJEX0RBVEFfU0VQQVJBVE9SKTsKLSAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChlbmNvZGVkRGlzcGxheU5hbWUpOwotICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDQVJEX0VORF9PRl9MSU5FKTsKLSAgICAgICAgfSBlbHNlIGlmIChWQ2FyZENvbmZpZy5pc1ZlcnNpb24zMChtVkNhcmRUeXBlKSkgewotICAgICAgICAgICAgYXBwZW5kTGluZShWQ2FyZENvbnN0YW50cy5QUk9QRVJUWV9OLCAiIik7Ci0gICAgICAgICAgICBhcHBlbmRMaW5lKFZDYXJkQ29uc3RhbnRzLlBST1BFUlRZX0ZOLCAiIik7Ci0gICAgICAgIH0gZWxzZSBpZiAobUlzRG9Db01vKSB7Ci0gICAgICAgICAgICBhcHBlbmRMaW5lKFZDYXJkQ29uc3RhbnRzLlBST1BFUlRZX04sICIiKTsKLSAgICAgICAgfQotCi0gICAgICAgIGFwcGVuZFBob25ldGljTmFtZUZpZWxkcyhjb250ZW50VmFsdWVzKTsKLSAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRW1pdHMgU09VTkQ7SVJNQywgU09SVC1TVFJJTkcsIGFuZCBkZS1mYWN0IHZhbHVlcyBmb3IgcGhvbmV0aWMgbmFtZXMgbGlrZSBYLVBIT05FVElDLUZBTUlMWS4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgYXBwZW5kUGhvbmV0aWNOYW1lRmllbGRzKGZpbmFsIENvbnRlbnRWYWx1ZXMgY29udGVudFZhbHVlcykgewotICAgICAgICBmaW5hbCBTdHJpbmcgcGhvbmV0aWNGYW1pbHlOYW1lOwotICAgICAgICBmaW5hbCBTdHJpbmcgcGhvbmV0aWNNaWRkbGVOYW1lOwotICAgICAgICBmaW5hbCBTdHJpbmcgcGhvbmV0aWNHaXZlbk5hbWU7Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyB0bXBQaG9uZXRpY0ZhbWlseU5hbWUgPQotICAgICAgICAgICAgICAgIGNvbnRlbnRWYWx1ZXMuZ2V0QXNTdHJpbmcoU3RydWN0dXJlZE5hbWUuUEhPTkVUSUNfRkFNSUxZX05BTUUpOwotICAgICAgICAgICAgZmluYWwgU3RyaW5nIHRtcFBob25ldGljTWlkZGxlTmFtZSA9Ci0gICAgICAgICAgICAgICAgY29udGVudFZhbHVlcy5nZXRBc1N0cmluZyhTdHJ1Y3R1cmVkTmFtZS5QSE9ORVRJQ19NSURETEVfTkFNRSk7Ci0gICAgICAgICAgICBmaW5hbCBTdHJpbmcgdG1wUGhvbmV0aWNHaXZlbk5hbWUgPQotICAgICAgICAgICAgICAgIGNvbnRlbnRWYWx1ZXMuZ2V0QXNTdHJpbmcoU3RydWN0dXJlZE5hbWUuUEhPTkVUSUNfR0lWRU5fTkFNRSk7Ci0gICAgICAgICAgICBpZiAobU5lZWRzVG9Db252ZXJ0UGhvbmV0aWNTdHJpbmcpIHsKLSAgICAgICAgICAgICAgICBwaG9uZXRpY0ZhbWlseU5hbWUgPSBWQ2FyZFV0aWxzLnRvSGFsZldpZHRoU3RyaW5nKHRtcFBob25ldGljRmFtaWx5TmFtZSk7Ci0gICAgICAgICAgICAgICAgcGhvbmV0aWNNaWRkbGVOYW1lID0gVkNhcmRVdGlscy50b0hhbGZXaWR0aFN0cmluZyh0bXBQaG9uZXRpY01pZGRsZU5hbWUpOwotICAgICAgICAgICAgICAgIHBob25ldGljR2l2ZW5OYW1lID0gVkNhcmRVdGlscy50b0hhbGZXaWR0aFN0cmluZyh0bXBQaG9uZXRpY0dpdmVuTmFtZSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHBob25ldGljRmFtaWx5TmFtZSA9IHRtcFBob25ldGljRmFtaWx5TmFtZTsKLSAgICAgICAgICAgICAgICBwaG9uZXRpY01pZGRsZU5hbWUgPSB0bXBQaG9uZXRpY01pZGRsZU5hbWU7Ci0gICAgICAgICAgICAgICAgcGhvbmV0aWNHaXZlbk5hbWUgPSB0bXBQaG9uZXRpY0dpdmVuTmFtZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmIChUZXh0VXRpbHMuaXNFbXB0eShwaG9uZXRpY0ZhbWlseU5hbWUpCi0gICAgICAgICAgICAgICAgJiYgVGV4dFV0aWxzLmlzRW1wdHkocGhvbmV0aWNNaWRkbGVOYW1lKQotICAgICAgICAgICAgICAgICYmIFRleHRVdGlscy5pc0VtcHR5KHBob25ldGljR2l2ZW5OYW1lKSkgewotICAgICAgICAgICAgaWYgKG1Jc0RvQ29NbykgewotICAgICAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ2FyZENvbnN0YW50cy5QUk9QRVJUWV9TT1VORCk7Ci0gICAgICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDQVJEX1BBUkFNX1NFUEFSQVRPUik7Ci0gICAgICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDYXJkQ29uc3RhbnRzLlBBUkFNX1RZUEVfWF9JUk1DX04pOwotICAgICAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ0FSRF9EQVRBX1NFUEFSQVRPUik7Ci0gICAgICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDQVJEX0lURU1fU0VQQVJBVE9SKTsKLSAgICAgICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNBUkRfSVRFTV9TRVBBUkFUT1IpOwotICAgICAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ0FSRF9JVEVNX1NFUEFSQVRPUik7Ci0gICAgICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDQVJEX0lURU1fU0VQQVJBVE9SKTsKLSAgICAgICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNBUkRfRU5EX09GX0xJTkUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKFZDYXJkQ29uZmlnLmlzVmVyc2lvbjQwKG1WQ2FyZFR5cGUpKSB7Ci0gICAgICAgICAgICAvLyBXZSBkb24ndCB3YW50IFNPUlQtU1RSSU5HIGFueXdheS4KLSAgICAgICAgfSBlbHNlIGlmIChWQ2FyZENvbmZpZy5pc1ZlcnNpb24zMChtVkNhcmRUeXBlKSkgewotICAgICAgICAgICAgZmluYWwgU3RyaW5nIHNvcnRTdHJpbmcgPQotICAgICAgICAgICAgICAgICAgICBWQ2FyZFV0aWxzLmNvbnN0cnVjdE5hbWVGcm9tRWxlbWVudHMobVZDYXJkVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaG9uZXRpY0ZhbWlseU5hbWUsIHBob25ldGljTWlkZGxlTmFtZSwgcGhvbmV0aWNHaXZlbk5hbWUpOwotICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDYXJkQ29uc3RhbnRzLlBST1BFUlRZX1NPUlRfU1RSSU5HKTsKLSAgICAgICAgICAgIGlmIChWQ2FyZENvbmZpZy5pc1ZlcnNpb24zMChtVkNhcmRUeXBlKSAmJiBzaG91bGRBcHBlbmRDaGFyc2V0UGFyYW0oc29ydFN0cmluZykpIHsKLSAgICAgICAgICAgICAgICAvLyB2Q2FyZCAzLjAgZG9lcyBub3QgZm9yY2UgdXMgdG8gdXNlIFVURi04IGFuZCBhY3R1YWxseSB3ZSBzZWUgc29tZQotICAgICAgICAgICAgICAgIC8vIHByb2dyYW1zIHdoaWNoIGVtaXQgdGhpcyB2YWx1ZS4gSXQgaXMgaW5jb3JyZWN0IGZyb20gdGhlIHZpZXcgb2YKLSAgICAgICAgICAgICAgICAvLyBzcGVjaWZpY2F0aW9uLCBidXQgYWN0dWFsbHkgbmVjZXNzYXJ5IGZvciBwYXJzaW5nIHZDYXJkIHdpdGggbm9uLVVURi04Ci0gICAgICAgICAgICAgICAgLy8gY2hhcnNldHMsIGV4cGVjdGluZyBvdGhlciBwYXJzZXJzIG5vdCBnZXQgY29uZnVzZWQgd2l0aCB0aGlzIHZhbHVlLgotICAgICAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ0FSRF9QQVJBTV9TRVBBUkFUT1IpOwotICAgICAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChtVkNhcmRDaGFyc2V0UGFyYW1ldGVyKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ0FSRF9EQVRBX1NFUEFSQVRPUik7Ci0gICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoZXNjYXBlQ2hhcmFjdGVycyhzb3J0U3RyaW5nKSk7Ci0gICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNBUkRfRU5EX09GX0xJTkUpOwotICAgICAgICB9IGVsc2UgaWYgKG1Jc0phcGFuZXNlTW9iaWxlUGhvbmUpIHsKLSAgICAgICAgICAgIC8vIE5vdGU6IFRoZXJlIGlzIG5vIGFwcHJvcHJpYXRlIHByb3BlcnR5IGZvciBleHByZXNzaW5nCi0gICAgICAgICAgICAvLyAgICAgICBwaG9uZXRpYyBuYW1lIChZb21pZ2FuYSBpbiBKYXBhbmVzZSkgaW4gdkNhcmQgMi4xLCB3aGlsZSB0aGVyZSBpcyBpbgotICAgICAgICAgICAgLy8gICAgICAgdkNhcmQgMy4wIChTT1JULVNUUklORykuCi0gICAgICAgICAgICAvLyAgICAgICBXZSB1c2UgRG9Db01vJ3Mgd2F5IHdoZW4gdGhlIGRldmljZSBpcyBKYXBhbmVzZSBvbmUgc2luY2UgaXQgaXMgYWxyZWFkeQotICAgICAgICAgICAgLy8gICAgICAgc3VwcG9ydGVkIGJ5IGEgbG90IG9mIEphcGFuZXNlIG1vYmlsZSBwaG9uZXMuCi0gICAgICAgICAgICAvLyAgICAgICBUaGlzIGlzICJYLSIgcHJvcGVydHksIHNvIGFueSBwYXJzZXIgaG9wZWZ1bGx5IHdvdWxkIG5vdCBnZXQKLSAgICAgICAgICAgIC8vICAgICAgIGNvbmZ1c2VkIHdpdGggdGhpcy4KLSAgICAgICAgICAgIC8vCi0gICAgICAgICAgICAvLyAgICAgICBBbHNvLCBEb0NvTW8ncyBzcGVjaWZpY2F0aW9uIHJlcXVpcmVzIHZDYXJkIGNvbXBvc2VyIHRvIHVzZSBqdXN0IHRoZSBmaXJzdAotICAgICAgICAgICAgLy8gICAgICAgY29sdW1uLgotICAgICAgICAgICAgLy8gICAgICAgaS5lLgotICAgICAgICAgICAgLy8gICAgICAgZ29vZDogIFNPVU5EO1gtSVJNQy1OOk1peWFrYXdhIERhaXN1a2U7Ozs7Ci0gICAgICAgICAgICAvLyAgICAgICBiYWQgOiAgU09VTkQ7WC1JUk1DLU46TWl5YWthd2E7RGFpc3VrZTs7OwotICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDYXJkQ29uc3RhbnRzLlBST1BFUlRZX1NPVU5EKTsKLSAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ0FSRF9QQVJBTV9TRVBBUkFUT1IpOwotICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDYXJkQ29uc3RhbnRzLlBBUkFNX1RZUEVfWF9JUk1DX04pOwotCi0gICAgICAgICAgICBib29sZWFuIHJlYWxseVVzZVF1b3RlZFByaW50YWJsZSA9Ci0gICAgICAgICAgICAgICAgKCFtUmVmcmFpbnNRUFRvTmFtZVByb3BlcnRpZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICYmICEoVkNhcmRVdGlscy5jb250YWluc09ubHlOb25DckxmUHJpbnRhYmxlQXNjaWkoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBob25ldGljRmFtaWx5TmFtZSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgVkNhcmRVdGlscy5jb250YWluc09ubHlOb25DckxmUHJpbnRhYmxlQXNjaWkoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGhvbmV0aWNNaWRkbGVOYW1lKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBWQ2FyZFV0aWxzLmNvbnRhaW5zT25seU5vbkNyTGZQcmludGFibGVBc2NpaSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaG9uZXRpY0dpdmVuTmFtZSkpKTsKLQotICAgICAgICAgICAgZmluYWwgU3RyaW5nIGVuY29kZWRQaG9uZXRpY0ZhbWlseU5hbWU7Ci0gICAgICAgICAgICBmaW5hbCBTdHJpbmcgZW5jb2RlZFBob25ldGljTWlkZGxlTmFtZTsKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyBlbmNvZGVkUGhvbmV0aWNHaXZlbk5hbWU7Ci0gICAgICAgICAgICBpZiAocmVhbGx5VXNlUXVvdGVkUHJpbnRhYmxlKSB7Ci0gICAgICAgICAgICAgICAgZW5jb2RlZFBob25ldGljRmFtaWx5TmFtZSA9IGVuY29kZVF1b3RlZFByaW50YWJsZShwaG9uZXRpY0ZhbWlseU5hbWUpOwotICAgICAgICAgICAgICAgIGVuY29kZWRQaG9uZXRpY01pZGRsZU5hbWUgPSBlbmNvZGVRdW90ZWRQcmludGFibGUocGhvbmV0aWNNaWRkbGVOYW1lKTsKLSAgICAgICAgICAgICAgICBlbmNvZGVkUGhvbmV0aWNHaXZlbk5hbWUgPSBlbmNvZGVRdW90ZWRQcmludGFibGUocGhvbmV0aWNHaXZlbk5hbWUpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBlbmNvZGVkUGhvbmV0aWNGYW1pbHlOYW1lID0gZXNjYXBlQ2hhcmFjdGVycyhwaG9uZXRpY0ZhbWlseU5hbWUpOwotICAgICAgICAgICAgICAgIGVuY29kZWRQaG9uZXRpY01pZGRsZU5hbWUgPSBlc2NhcGVDaGFyYWN0ZXJzKHBob25ldGljTWlkZGxlTmFtZSk7Ci0gICAgICAgICAgICAgICAgZW5jb2RlZFBob25ldGljR2l2ZW5OYW1lID0gZXNjYXBlQ2hhcmFjdGVycyhwaG9uZXRpY0dpdmVuTmFtZSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChzaG91bGRBcHBlbmRDaGFyc2V0UGFyYW0oZW5jb2RlZFBob25ldGljRmFtaWx5TmFtZSwKLSAgICAgICAgICAgICAgICAgICAgZW5jb2RlZFBob25ldGljTWlkZGxlTmFtZSwgZW5jb2RlZFBob25ldGljR2l2ZW5OYW1lKSkgewotICAgICAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ0FSRF9QQVJBTV9TRVBBUkFUT1IpOwotICAgICAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChtVkNhcmRDaGFyc2V0UGFyYW1ldGVyKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ0FSRF9EQVRBX1NFUEFSQVRPUik7Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYm9vbGVhbiBmaXJzdCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgaWYgKCFUZXh0VXRpbHMuaXNFbXB0eShlbmNvZGVkUGhvbmV0aWNGYW1pbHlOYW1lKSkgewotICAgICAgICAgICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoZW5jb2RlZFBob25ldGljRmFtaWx5TmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgIGZpcnN0ID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmICghVGV4dFV0aWxzLmlzRW1wdHkoZW5jb2RlZFBob25ldGljTWlkZGxlTmFtZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGZpcnN0KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmaXJzdCA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKCcgJyk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKGVuY29kZWRQaG9uZXRpY01pZGRsZU5hbWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoIVRleHRVdGlscy5pc0VtcHR5KGVuY29kZWRQaG9uZXRpY0dpdmVuTmFtZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCFmaXJzdCkgewotICAgICAgICAgICAgICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKCcgJyk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKGVuY29kZWRQaG9uZXRpY0dpdmVuTmFtZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDQVJEX0lURU1fU0VQQVJBVE9SKTsgIC8vIGZhbWlseTtnaXZlbgotICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDQVJEX0lURU1fU0VQQVJBVE9SKTsgIC8vIGdpdmVuO21pZGRsZQotICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDQVJEX0lURU1fU0VQQVJBVE9SKTsgIC8vIG1pZGRsZTtwcmVmaXgKLSAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ0FSRF9JVEVNX1NFUEFSQVRPUik7ICAvLyBwcmVmaXg7c3VmZml4Ci0gICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNBUkRfRU5EX09GX0xJTkUpOwotICAgICAgICB9Ci0KLSAgICAgICAgTG9nLmQoIkBAQCIsICJob2dlIik7Ci0gICAgICAgIGlmIChtVXNlc0RlZmFjdFByb3BlcnR5KSB7Ci0gICAgICAgICAgICBpZiAoIVRleHRVdGlscy5pc0VtcHR5KHBob25ldGljR2l2ZW5OYW1lKSkgewotICAgICAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gcmVhbGx5VXNlUXVvdGVkUHJpbnRhYmxlID0KLSAgICAgICAgICAgICAgICAgICAgKG1TaG91bGRVc2VRdW90ZWRQcmludGFibGUgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAhVkNhcmRVdGlscy5jb250YWluc09ubHlOb25DckxmUHJpbnRhYmxlQXNjaWkocGhvbmV0aWNHaXZlbk5hbWUpKTsKLSAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgZW5jb2RlZFBob25ldGljR2l2ZW5OYW1lOwotICAgICAgICAgICAgICAgIGlmIChyZWFsbHlVc2VRdW90ZWRQcmludGFibGUpIHsKLSAgICAgICAgICAgICAgICAgICAgZW5jb2RlZFBob25ldGljR2l2ZW5OYW1lID0gZW5jb2RlUXVvdGVkUHJpbnRhYmxlKHBob25ldGljR2l2ZW5OYW1lKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBlbmNvZGVkUGhvbmV0aWNHaXZlbk5hbWUgPSBlc2NhcGVDaGFyYWN0ZXJzKHBob25ldGljR2l2ZW5OYW1lKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDYXJkQ29uc3RhbnRzLlBST1BFUlRZX1hfUEhPTkVUSUNfRklSU1RfTkFNRSk7Ci0gICAgICAgICAgICAgICAgaWYgKHNob3VsZEFwcGVuZENoYXJzZXRQYXJhbShwaG9uZXRpY0dpdmVuTmFtZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDQVJEX1BBUkFNX1NFUEFSQVRPUik7Ci0gICAgICAgICAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChtVkNhcmRDaGFyc2V0UGFyYW1ldGVyKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKHJlYWxseVVzZVF1b3RlZFByaW50YWJsZSkgewotICAgICAgICAgICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNBUkRfUEFSQU1fU0VQQVJBVE9SKTsKLSAgICAgICAgICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDQVJEX1BBUkFNX0VOQ09ESU5HX1FQKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDQVJEX0RBVEFfU0VQQVJBVE9SKTsKLSAgICAgICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoZW5jb2RlZFBob25ldGljR2l2ZW5OYW1lKTsKLSAgICAgICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNBUkRfRU5EX09GX0xJTkUpOwotICAgICAgICAgICAgfSAgLy8gaWYgKCFUZXh0VXRpbHMuaXNFbXB0eShwaG9uZXRpY0dpdmVuTmFtZSkpCi0gICAgICAgICAgICBpZiAoIVRleHRVdGlscy5pc0VtcHR5KHBob25ldGljTWlkZGxlTmFtZSkpIHsKLSAgICAgICAgICAgICAgICBmaW5hbCBib29sZWFuIHJlYWxseVVzZVF1b3RlZFByaW50YWJsZSA9Ci0gICAgICAgICAgICAgICAgICAgIChtU2hvdWxkVXNlUXVvdGVkUHJpbnRhYmxlICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIVZDYXJkVXRpbHMuY29udGFpbnNPbmx5Tm9uQ3JMZlByaW50YWJsZUFzY2lpKHBob25ldGljTWlkZGxlTmFtZSkpOwotICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBlbmNvZGVkUGhvbmV0aWNNaWRkbGVOYW1lOwotICAgICAgICAgICAgICAgIGlmIChyZWFsbHlVc2VRdW90ZWRQcmludGFibGUpIHsKLSAgICAgICAgICAgICAgICAgICAgZW5jb2RlZFBob25ldGljTWlkZGxlTmFtZSA9IGVuY29kZVF1b3RlZFByaW50YWJsZShwaG9uZXRpY01pZGRsZU5hbWUpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGVuY29kZWRQaG9uZXRpY01pZGRsZU5hbWUgPSBlc2NhcGVDaGFyYWN0ZXJzKHBob25ldGljTWlkZGxlTmFtZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ2FyZENvbnN0YW50cy5QUk9QRVJUWV9YX1BIT05FVElDX01JRERMRV9OQU1FKTsKLSAgICAgICAgICAgICAgICBpZiAoc2hvdWxkQXBwZW5kQ2hhcnNldFBhcmFtKHBob25ldGljTWlkZGxlTmFtZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDQVJEX1BBUkFNX1NFUEFSQVRPUik7Ci0gICAgICAgICAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChtVkNhcmRDaGFyc2V0UGFyYW1ldGVyKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKHJlYWxseVVzZVF1b3RlZFByaW50YWJsZSkgewotICAgICAgICAgICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNBUkRfUEFSQU1fU0VQQVJBVE9SKTsKLSAgICAgICAgICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDQVJEX1BBUkFNX0VOQ09ESU5HX1FQKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDQVJEX0RBVEFfU0VQQVJBVE9SKTsKLSAgICAgICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoZW5jb2RlZFBob25ldGljTWlkZGxlTmFtZSk7Ci0gICAgICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDQVJEX0VORF9PRl9MSU5FKTsKLSAgICAgICAgICAgIH0gIC8vIGlmICghVGV4dFV0aWxzLmlzRW1wdHkocGhvbmV0aWNHaXZlbk5hbWUpKQotICAgICAgICAgICAgaWYgKCFUZXh0VXRpbHMuaXNFbXB0eShwaG9uZXRpY0ZhbWlseU5hbWUpKSB7Ci0gICAgICAgICAgICAgICAgZmluYWwgYm9vbGVhbiByZWFsbHlVc2VRdW90ZWRQcmludGFibGUgPQotICAgICAgICAgICAgICAgICAgICAobVNob3VsZFVzZVF1b3RlZFByaW50YWJsZSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICFWQ2FyZFV0aWxzLmNvbnRhaW5zT25seU5vbkNyTGZQcmludGFibGVBc2NpaShwaG9uZXRpY0ZhbWlseU5hbWUpKTsKLSAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgZW5jb2RlZFBob25ldGljRmFtaWx5TmFtZTsKLSAgICAgICAgICAgICAgICBpZiAocmVhbGx5VXNlUXVvdGVkUHJpbnRhYmxlKSB7Ci0gICAgICAgICAgICAgICAgICAgIGVuY29kZWRQaG9uZXRpY0ZhbWlseU5hbWUgPSBlbmNvZGVRdW90ZWRQcmludGFibGUocGhvbmV0aWNGYW1pbHlOYW1lKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBlbmNvZGVkUGhvbmV0aWNGYW1pbHlOYW1lID0gZXNjYXBlQ2hhcmFjdGVycyhwaG9uZXRpY0ZhbWlseU5hbWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNhcmRDb25zdGFudHMuUFJPUEVSVFlfWF9QSE9ORVRJQ19MQVNUX05BTUUpOwotICAgICAgICAgICAgICAgIGlmIChzaG91bGRBcHBlbmRDaGFyc2V0UGFyYW0ocGhvbmV0aWNGYW1pbHlOYW1lKSkgewotICAgICAgICAgICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNBUkRfUEFSQU1fU0VQQVJBVE9SKTsKLSAgICAgICAgICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKG1WQ2FyZENoYXJzZXRQYXJhbWV0ZXIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAocmVhbGx5VXNlUXVvdGVkUHJpbnRhYmxlKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ0FSRF9QQVJBTV9TRVBBUkFUT1IpOwotICAgICAgICAgICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNBUkRfUEFSQU1fRU5DT0RJTkdfUVApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNBUkRfREFUQV9TRVBBUkFUT1IpOwotICAgICAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChlbmNvZGVkUGhvbmV0aWNGYW1pbHlOYW1lKTsKLSAgICAgICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNBUkRfRU5EX09GX0xJTkUpOwotICAgICAgICAgICAgfSAgLy8gaWYgKCFUZXh0VXRpbHMuaXNFbXB0eShwaG9uZXRpY0ZhbWlseU5hbWUpKQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIFZDYXJkQnVpbGRlciBhcHBlbmROaWNrTmFtZXMoZmluYWwgTGlzdDxDb250ZW50VmFsdWVzPiBjb250ZW50VmFsdWVzTGlzdCkgewotICAgICAgICBmaW5hbCBib29sZWFuIHVzZUFuZHJvaWRQcm9wZXJ0eTsKLSAgICAgICAgaWYgKG1Jc1YzME9yVjQwKSB7ICAgLy8gVGhlc2Ugc3BlY2lmaWNhdGlvbnMgaGF2ZSBOSUNLTkFNRSBwcm9wZXJ0eS4KLSAgICAgICAgICAgIHVzZUFuZHJvaWRQcm9wZXJ0eSA9IGZhbHNlOwotICAgICAgICB9IGVsc2UgaWYgKG1Vc2VzQW5kcm9pZFByb3BlcnR5KSB7Ci0gICAgICAgICAgICB1c2VBbmRyb2lkUHJvcGVydHkgPSB0cnVlOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy8gVGhlcmUncyBubyB3YXkgdG8gYWRkIHRoaXMgZmllbGQuCi0gICAgICAgICAgICByZXR1cm4gdGhpczsKLSAgICAgICAgfQotICAgICAgICBpZiAoY29udGVudFZhbHVlc0xpc3QgIT0gbnVsbCkgewotICAgICAgICAgICAgZm9yIChDb250ZW50VmFsdWVzIGNvbnRlbnRWYWx1ZXMgOiBjb250ZW50VmFsdWVzTGlzdCkgewotICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBuaWNrbmFtZSA9IGNvbnRlbnRWYWx1ZXMuZ2V0QXNTdHJpbmcoTmlja25hbWUuTkFNRSk7Ci0gICAgICAgICAgICAgICAgaWYgKFRleHRVdGlscy5pc0VtcHR5KG5pY2tuYW1lKSkgewotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKHVzZUFuZHJvaWRQcm9wZXJ0eSkgewotICAgICAgICAgICAgICAgICAgICBhcHBlbmRBbmRyb2lkU3BlY2lmaWNQcm9wZXJ0eShOaWNrbmFtZS5DT05URU5UX0lURU1fVFlQRSwgY29udGVudFZhbHVlcyk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgYXBwZW5kTGluZVdpdGhDaGFyc2V0QW5kUVBEZXRlY3Rpb24oVkNhcmRDb25zdGFudHMuUFJPUEVSVFlfTklDS05BTUUsIG5pY2tuYW1lKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgfQotCi0gICAgcHVibGljIFZDYXJkQnVpbGRlciBhcHBlbmRQaG9uZXMoZmluYWwgTGlzdDxDb250ZW50VmFsdWVzPiBjb250ZW50VmFsdWVzTGlzdCkgewotICAgICAgICBib29sZWFuIHBob25lTGluZUV4aXN0cyA9IGZhbHNlOwotICAgICAgICBpZiAoY29udGVudFZhbHVlc0xpc3QgIT0gbnVsbCkgewotICAgICAgICAgICAgU2V0PFN0cmluZz4gcGhvbmVTZXQgPSBuZXcgSGFzaFNldDxTdHJpbmc+KCk7Ci0gICAgICAgICAgICBmb3IgKENvbnRlbnRWYWx1ZXMgY29udGVudFZhbHVlcyA6IGNvbnRlbnRWYWx1ZXNMaXN0KSB7Ci0gICAgICAgICAgICAgICAgZmluYWwgSW50ZWdlciB0eXBlQXNPYmplY3QgPSBjb250ZW50VmFsdWVzLmdldEFzSW50ZWdlcihQaG9uZS5UWVBFKTsKLSAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgbGFiZWwgPSBjb250ZW50VmFsdWVzLmdldEFzU3RyaW5nKFBob25lLkxBQkVMKTsKLSAgICAgICAgICAgICAgICBmaW5hbCBJbnRlZ2VyIGlzUHJpbWFyeUFzSW50ZWdlciA9IGNvbnRlbnRWYWx1ZXMuZ2V0QXNJbnRlZ2VyKFBob25lLklTX1BSSU1BUlkpOwotICAgICAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gaXNQcmltYXJ5ID0gKGlzUHJpbWFyeUFzSW50ZWdlciAhPSBudWxsID8KLSAgICAgICAgICAgICAgICAgICAgICAgIChpc1ByaW1hcnlBc0ludGVnZXIgPiAwKSA6IGZhbHNlKTsKLSAgICAgICAgICAgICAgICBTdHJpbmcgcGhvbmVOdW1iZXIgPSBjb250ZW50VmFsdWVzLmdldEFzU3RyaW5nKFBob25lLk5VTUJFUik7Ci0gICAgICAgICAgICAgICAgaWYgKHBob25lTnVtYmVyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcGhvbmVOdW1iZXIgPSBwaG9uZU51bWJlci50cmltKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChUZXh0VXRpbHMuaXNFbXB0eShwaG9uZU51bWJlcikpIHsKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLy8gUEFHRVIgbnVtYmVyIG5lZWRzIHVuZm9ybWF0dGVkICJwaG9uZSBudW1iZXIiLgotICAgICAgICAgICAgICAgIGZpbmFsIGludCB0eXBlID0gKHR5cGVBc09iamVjdCAhPSBudWxsID8gdHlwZUFzT2JqZWN0IDogREVGQVVMVF9QSE9ORV9UWVBFKTsKLSAgICAgICAgICAgICAgICBpZiAodHlwZSA9PSBQaG9uZS5UWVBFX1BBR0VSIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICBWQ2FyZENvbmZpZy5yZWZyYWluUGhvbmVOdW1iZXJGb3JtYXR0aW5nKG1WQ2FyZFR5cGUpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHBob25lTGluZUV4aXN0cyA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIGlmICghcGhvbmVTZXQuY29udGFpbnMocGhvbmVOdW1iZXIpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwaG9uZVNldC5hZGQocGhvbmVOdW1iZXIpOwotICAgICAgICAgICAgICAgICAgICAgICAgYXBwZW5kVGVsTGluZSh0eXBlLCBsYWJlbCwgcGhvbmVOdW1iZXIsIGlzUHJpbWFyeSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBmaW5hbCBMaXN0PFN0cmluZz4gcGhvbmVOdW1iZXJMaXN0ID0gc3BsaXRBbmRUcmltUGhvbmVOdW1iZXJzKHBob25lTnVtYmVyKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHBob25lTnVtYmVyTGlzdC5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHBob25lTGluZUV4aXN0cyA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoU3RyaW5nIGFjdHVhbFBob25lTnVtYmVyIDogcGhvbmVOdW1iZXJMaXN0KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXBob25lU2V0LmNvbnRhaW5zKGFjdHVhbFBob25lTnVtYmVyKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIGludCBmb3JtYXQgPSBWQ2FyZFV0aWxzLmdldFBob25lTnVtYmVyRm9ybWF0KG1WQ2FyZFR5cGUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBmb3JtYXR0ZWRQaG9uZU51bWJlciA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLmZvcm1hdE51bWJlcihhY3R1YWxQaG9uZU51bWJlciwgZm9ybWF0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaG9uZVNldC5hZGQoYWN0dWFsUGhvbmVOdW1iZXIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcGVuZFRlbExpbmUodHlwZSwgbGFiZWwsIGZvcm1hdHRlZFBob25lTnVtYmVyLCBpc1ByaW1hcnkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9ICAvLyBmb3IgKFN0cmluZyBhY3R1YWxQaG9uZU51bWJlciA6IHBob25lTnVtYmVyTGlzdCkgewotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmICghcGhvbmVMaW5lRXhpc3RzICYmIG1Jc0RvQ29NbykgewotICAgICAgICAgICAgYXBwZW5kVGVsTGluZShQaG9uZS5UWVBFX0hPTUUsICIiLCAiIiwgZmFsc2UpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPHA+Ci0gICAgICogU3BsaXRzIGEgZ2l2ZW4gc3RyaW5nIGV4cHJlc3NpbmcgcGhvbmUgbnVtYmVycyBpbnRvIHNldmVyYWwgc3RyaW5ncywgYW5kIHJlbW92ZQotICAgICAqIHVubmVjZXNzYXJ5IGNoYXJhY3RlcnMgaW5zaWRlIHRoZW0uIFRoZSBzaXplIG9mIGEgcmV0dXJuZWQgbGlzdCBiZWNvbWVzIDEgd2hlbgotICAgICAqIG5vIHNwbGl0IGlzIG5lZWRlZC4KLSAgICAgKiA8L3A+Ci0gICAgICogPHA+Ci0gICAgICogVGhlIGdpdmVuIG51bWJlciAibWF5IiBoYXZlIHNldmVyYWwgcGhvbmUgbnVtYmVycyB3aGVuIHRoZSBjb250YWN0IGVudHJ5IGlzIGNvcnJ1cHRlZAotICAgICAqIGJlY2F1c2Ugb2YgaXRzIG9yaWdpbmFsIHNvdXJjZS4KLSAgICAgKiBlLmcuICIxMTEtMjIyLTMzMzMgKE1pYW1pKVxuNDQ0LTU1NS02NjY2IChCcm93YXJkOyAzMDUtNjUzLTY3OTYgKE1pYW1pKSIKLSAgICAgKiA8L3A+Ci0gICAgICogPHA+Ci0gICAgICogVGhpcyBraW5kIG9mICJwaG9uZSBudW1iZXJzIiB3aWxsIG5vdCBiZSBjcmVhdGVkIHdpdGggQW5kcm9pZCB2Q2FyZCBpbXBsZW1lbnRhdGlvbiwKLSAgICAgKiBidXQgd2UgbWF5IGVuY291bnRlciB0aGVtIGlmIHRoZSBzb3VyY2Ugb2YgdGhlIGlucHV0IGRhdGEgaGFzIGFscmVhZHkgY29ycnVwdGVkCi0gICAgICogaW1wbGVtZW50YXRpb24uCi0gICAgICogPC9wPgotICAgICAqIDxwPgotICAgICAqIFRvIGhhbmRsZSB0aGlzIGNhc2UsIHRoaXMgbWV0aG9kIGZpcnN0IHNwbGl0cyBpdHMgaW5wdXQgaW50byBtdWx0aXBsZSBwYXJ0cwotICAgICAqIChlLmcuICIxMTEtMjIyLTMzMzMgKE1pYW1pKSIsICI0NDQtNTU1LTY2NjYgKEJyb3dhcmQiLCBhbmQgMzA1NjUzLTY3OTYgKE1pYW1pKSIpIGFuZAotICAgICAqIHJlbW92ZXMgdW5uZWNlc3Nhcnkgc3RyaW5ncyBsaWtlICIoTWlhbWkpIi4KLSAgICAgKiA8L3A+Ci0gICAgICogPHA+Ci0gICAgICogRG8gbm90IGNhbGwgdGhpcyBtZXRob2Qgd2hlbiB0cmltbWluZyBpcyBpbmFwcHJvcHJpYXRlIGZvciBpdHMgcmVjZWl2ZXJzLgotICAgICAqIDwvcD4KLSAgICAgKi8KLSAgICBwcml2YXRlIExpc3Q8U3RyaW5nPiBzcGxpdEFuZFRyaW1QaG9uZU51bWJlcnMoZmluYWwgU3RyaW5nIHBob25lTnVtYmVyKSB7Ci0gICAgICAgIGZpbmFsIExpc3Q8U3RyaW5nPiBwaG9uZUxpc3QgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQotICAgICAgICBTdHJpbmdCdWlsZGVyIGJ1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotICAgICAgICBmaW5hbCBpbnQgbGVuZ3RoID0gcGhvbmVOdW1iZXIubGVuZ3RoKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIGZpbmFsIGNoYXIgY2ggPSBwaG9uZU51bWJlci5jaGFyQXQoaSk7Ci0gICAgICAgICAgICBpZiAoQ2hhcmFjdGVyLmlzRGlnaXQoY2gpIHx8IGNoID09ICcrJykgewotICAgICAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKGNoKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoKGNoID09ICc7JyB8fCBjaCA9PSAnXG4nKSAmJiBidWlsZGVyLmxlbmd0aCgpID4gMCkgewotICAgICAgICAgICAgICAgIHBob25lTGlzdC5hZGQoYnVpbGRlci50b1N0cmluZygpKTsKLSAgICAgICAgICAgICAgICBidWlsZGVyID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAoYnVpbGRlci5sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICAgIHBob25lTGlzdC5hZGQoYnVpbGRlci50b1N0cmluZygpKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBwaG9uZUxpc3Q7Ci0gICAgfQotCi0gICAgcHVibGljIFZDYXJkQnVpbGRlciBhcHBlbmRFbWFpbHMoZmluYWwgTGlzdDxDb250ZW50VmFsdWVzPiBjb250ZW50VmFsdWVzTGlzdCkgewotICAgICAgICBib29sZWFuIGVtYWlsQWRkcmVzc0V4aXN0cyA9IGZhbHNlOwotICAgICAgICBpZiAoY29udGVudFZhbHVlc0xpc3QgIT0gbnVsbCkgewotICAgICAgICAgICAgZmluYWwgU2V0PFN0cmluZz4gYWRkcmVzc1NldCA9IG5ldyBIYXNoU2V0PFN0cmluZz4oKTsKLSAgICAgICAgICAgIGZvciAoQ29udGVudFZhbHVlcyBjb250ZW50VmFsdWVzIDogY29udGVudFZhbHVlc0xpc3QpIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgZW1haWxBZGRyZXNzID0gY29udGVudFZhbHVlcy5nZXRBc1N0cmluZyhFbWFpbC5EQVRBKTsKLSAgICAgICAgICAgICAgICBpZiAoZW1haWxBZGRyZXNzICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgZW1haWxBZGRyZXNzID0gZW1haWxBZGRyZXNzLnRyaW0oKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKFRleHRVdGlscy5pc0VtcHR5KGVtYWlsQWRkcmVzcykpIHsKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIEludGVnZXIgdHlwZUFzT2JqZWN0ID0gY29udGVudFZhbHVlcy5nZXRBc0ludGVnZXIoRW1haWwuVFlQRSk7Ci0gICAgICAgICAgICAgICAgZmluYWwgaW50IHR5cGUgPSAodHlwZUFzT2JqZWN0ICE9IG51bGwgPwotICAgICAgICAgICAgICAgICAgICAgICAgdHlwZUFzT2JqZWN0IDogREVGQVVMVF9FTUFJTF9UWVBFKTsKLSAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgbGFiZWwgPSBjb250ZW50VmFsdWVzLmdldEFzU3RyaW5nKEVtYWlsLkxBQkVMKTsKLSAgICAgICAgICAgICAgICBJbnRlZ2VyIGlzUHJpbWFyeUFzSW50ZWdlciA9IGNvbnRlbnRWYWx1ZXMuZ2V0QXNJbnRlZ2VyKEVtYWlsLklTX1BSSU1BUlkpOwotICAgICAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gaXNQcmltYXJ5ID0gKGlzUHJpbWFyeUFzSW50ZWdlciAhPSBudWxsID8KLSAgICAgICAgICAgICAgICAgICAgICAgIChpc1ByaW1hcnlBc0ludGVnZXIgPiAwKSA6IGZhbHNlKTsKLSAgICAgICAgICAgICAgICBlbWFpbEFkZHJlc3NFeGlzdHMgPSB0cnVlOwotICAgICAgICAgICAgICAgIGlmICghYWRkcmVzc1NldC5jb250YWlucyhlbWFpbEFkZHJlc3MpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGFkZHJlc3NTZXQuYWRkKGVtYWlsQWRkcmVzcyk7Ci0gICAgICAgICAgICAgICAgICAgIGFwcGVuZEVtYWlsTGluZSh0eXBlLCBsYWJlbCwgZW1haWxBZGRyZXNzLCBpc1ByaW1hcnkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmICghZW1haWxBZGRyZXNzRXhpc3RzICYmIG1Jc0RvQ29NbykgewotICAgICAgICAgICAgYXBwZW5kRW1haWxMaW5lKEVtYWlsLlRZUEVfSE9NRSwgIiIsICIiLCBmYWxzZSk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gdGhpczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgVkNhcmRCdWlsZGVyIGFwcGVuZFBvc3RhbHMoZmluYWwgTGlzdDxDb250ZW50VmFsdWVzPiBjb250ZW50VmFsdWVzTGlzdCkgewotICAgICAgICBpZiAoY29udGVudFZhbHVlc0xpc3QgPT0gbnVsbCB8fCBjb250ZW50VmFsdWVzTGlzdC5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgIGlmIChtSXNEb0NvTW8pIHsKLSAgICAgICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNhcmRDb25zdGFudHMuUFJPUEVSVFlfQURSKTsKLSAgICAgICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNBUkRfUEFSQU1fU0VQQVJBVE9SKTsKLSAgICAgICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNhcmRDb25zdGFudHMuUEFSQU1fVFlQRV9IT01FKTsKLSAgICAgICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNBUkRfREFUQV9TRVBBUkFUT1IpOwotICAgICAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ0FSRF9FTkRfT0ZfTElORSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpZiAobUlzRG9Db01vKSB7Ci0gICAgICAgICAgICAgICAgYXBwZW5kUG9zdGFsc0ZvckRvQ29Nbyhjb250ZW50VmFsdWVzTGlzdCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGFwcGVuZFBvc3RhbHNGb3JHZW5lcmljKGNvbnRlbnRWYWx1ZXNMaXN0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiB0aGlzOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIE1hcDxJbnRlZ2VyLCBJbnRlZ2VyPiBzUG9zdGFsVHlwZVByaW9yaXR5TWFwOwotCi0gICAgc3RhdGljIHsKLSAgICAgICAgc1Bvc3RhbFR5cGVQcmlvcml0eU1hcCA9IG5ldyBIYXNoTWFwPEludGVnZXIsIEludGVnZXI+KCk7Ci0gICAgICAgIHNQb3N0YWxUeXBlUHJpb3JpdHlNYXAucHV0KFN0cnVjdHVyZWRQb3N0YWwuVFlQRV9IT01FLCAwKTsKLSAgICAgICAgc1Bvc3RhbFR5cGVQcmlvcml0eU1hcC5wdXQoU3RydWN0dXJlZFBvc3RhbC5UWVBFX1dPUkssIDEpOwotICAgICAgICBzUG9zdGFsVHlwZVByaW9yaXR5TWFwLnB1dChTdHJ1Y3R1cmVkUG9zdGFsLlRZUEVfT1RIRVIsIDIpOwotICAgICAgICBzUG9zdGFsVHlwZVByaW9yaXR5TWFwLnB1dChTdHJ1Y3R1cmVkUG9zdGFsLlRZUEVfQ1VTVE9NLCAzKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUcmllcyB0byBhcHBlbmQganVzdCBvbmUgbGluZS4gSWYgdGhlcmUncyBubyBhcHByb3ByaWF0ZSBhZGRyZXNzCi0gICAgICogaW5mb3JtYXRpb24sIGFwcGVuZCBhbiBlbXB0eSBsaW5lLgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBhcHBlbmRQb3N0YWxzRm9yRG9Db01vKGZpbmFsIExpc3Q8Q29udGVudFZhbHVlcz4gY29udGVudFZhbHVlc0xpc3QpIHsKLSAgICAgICAgaW50IGN1cnJlbnRQcmlvcml0eSA9IEludGVnZXIuTUFYX1ZBTFVFOwotICAgICAgICBpbnQgY3VycmVudFR5cGUgPSBJbnRlZ2VyLk1BWF9WQUxVRTsKLSAgICAgICAgQ29udGVudFZhbHVlcyBjdXJyZW50Q29udGVudFZhbHVlcyA9IG51bGw7Ci0gICAgICAgIGZvciAoZmluYWwgQ29udGVudFZhbHVlcyBjb250ZW50VmFsdWVzIDogY29udGVudFZhbHVlc0xpc3QpIHsKLSAgICAgICAgICAgIGlmIChjb250ZW50VmFsdWVzID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZpbmFsIEludGVnZXIgdHlwZUFzSW50ZWdlciA9IGNvbnRlbnRWYWx1ZXMuZ2V0QXNJbnRlZ2VyKFN0cnVjdHVyZWRQb3N0YWwuVFlQRSk7Ci0gICAgICAgICAgICBmaW5hbCBJbnRlZ2VyIHByaW9yaXR5QXNJbnRlZ2VyID0gc1Bvc3RhbFR5cGVQcmlvcml0eU1hcC5nZXQodHlwZUFzSW50ZWdlcik7Ci0gICAgICAgICAgICBmaW5hbCBpbnQgcHJpb3JpdHkgPQotICAgICAgICAgICAgICAgICAgICAocHJpb3JpdHlBc0ludGVnZXIgIT0gbnVsbCA/IHByaW9yaXR5QXNJbnRlZ2VyIDogSW50ZWdlci5NQVhfVkFMVUUpOwotICAgICAgICAgICAgaWYgKHByaW9yaXR5IDwgY3VycmVudFByaW9yaXR5KSB7Ci0gICAgICAgICAgICAgICAgY3VycmVudFByaW9yaXR5ID0gcHJpb3JpdHk7Ci0gICAgICAgICAgICAgICAgY3VycmVudFR5cGUgPSB0eXBlQXNJbnRlZ2VyOwotICAgICAgICAgICAgICAgIGN1cnJlbnRDb250ZW50VmFsdWVzID0gY29udGVudFZhbHVlczsKLSAgICAgICAgICAgICAgICBpZiAocHJpb3JpdHkgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoY3VycmVudENvbnRlbnRWYWx1ZXMgPT0gbnVsbCkgewotICAgICAgICAgICAgTG9nLncoTE9HX1RBRywgIlNob3VsZCBub3QgY29tZSBoZXJlLiBNdXN0IGhhdmUgYXQgbGVhc3Qgb25lIHBvc3RhbCBkYXRhLiIpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgZmluYWwgU3RyaW5nIGxhYmVsID0gY3VycmVudENvbnRlbnRWYWx1ZXMuZ2V0QXNTdHJpbmcoU3RydWN0dXJlZFBvc3RhbC5MQUJFTCk7Ci0gICAgICAgIGFwcGVuZFBvc3RhbExpbmUoY3VycmVudFR5cGUsIGxhYmVsLCBjdXJyZW50Q29udGVudFZhbHVlcywgZmFsc2UsIHRydWUpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBhcHBlbmRQb3N0YWxzRm9yR2VuZXJpYyhmaW5hbCBMaXN0PENvbnRlbnRWYWx1ZXM+IGNvbnRlbnRWYWx1ZXNMaXN0KSB7Ci0gICAgICAgIGZvciAoZmluYWwgQ29udGVudFZhbHVlcyBjb250ZW50VmFsdWVzIDogY29udGVudFZhbHVlc0xpc3QpIHsKLSAgICAgICAgICAgIGlmIChjb250ZW50VmFsdWVzID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZpbmFsIEludGVnZXIgdHlwZUFzSW50ZWdlciA9IGNvbnRlbnRWYWx1ZXMuZ2V0QXNJbnRlZ2VyKFN0cnVjdHVyZWRQb3N0YWwuVFlQRSk7Ci0gICAgICAgICAgICBmaW5hbCBpbnQgdHlwZSA9ICh0eXBlQXNJbnRlZ2VyICE9IG51bGwgPwotICAgICAgICAgICAgICAgICAgICB0eXBlQXNJbnRlZ2VyIDogREVGQVVMVF9QT1NUQUxfVFlQRSk7Ci0gICAgICAgICAgICBmaW5hbCBTdHJpbmcgbGFiZWwgPSBjb250ZW50VmFsdWVzLmdldEFzU3RyaW5nKFN0cnVjdHVyZWRQb3N0YWwuTEFCRUwpOwotICAgICAgICAgICAgZmluYWwgSW50ZWdlciBpc1ByaW1hcnlBc0ludGVnZXIgPQotICAgICAgICAgICAgICAgIGNvbnRlbnRWYWx1ZXMuZ2V0QXNJbnRlZ2VyKFN0cnVjdHVyZWRQb3N0YWwuSVNfUFJJTUFSWSk7Ci0gICAgICAgICAgICBmaW5hbCBib29sZWFuIGlzUHJpbWFyeSA9IChpc1ByaW1hcnlBc0ludGVnZXIgIT0gbnVsbCA/Ci0gICAgICAgICAgICAgICAgICAgIChpc1ByaW1hcnlBc0ludGVnZXIgPiAwKSA6IGZhbHNlKTsKLSAgICAgICAgICAgIGFwcGVuZFBvc3RhbExpbmUodHlwZSwgbGFiZWwsIGNvbnRlbnRWYWx1ZXMsIGlzUHJpbWFyeSwgZmFsc2UpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgUG9zdGFsU3RydWN0IHsKLSAgICAgICAgZmluYWwgYm9vbGVhbiByZWFsbHlVc2VRdW90ZWRQcmludGFibGU7Ci0gICAgICAgIGZpbmFsIGJvb2xlYW4gYXBwZW5kQ2hhcnNldDsKLSAgICAgICAgZmluYWwgU3RyaW5nIGFkZHJlc3NEYXRhOwotICAgICAgICBwdWJsaWMgUG9zdGFsU3RydWN0KGZpbmFsIGJvb2xlYW4gcmVhbGx5VXNlUXVvdGVkUHJpbnRhYmxlLAotICAgICAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gYXBwZW5kQ2hhcnNldCwgZmluYWwgU3RyaW5nIGFkZHJlc3NEYXRhKSB7Ci0gICAgICAgICAgICB0aGlzLnJlYWxseVVzZVF1b3RlZFByaW50YWJsZSA9IHJlYWxseVVzZVF1b3RlZFByaW50YWJsZTsKLSAgICAgICAgICAgIHRoaXMuYXBwZW5kQ2hhcnNldCA9IGFwcGVuZENoYXJzZXQ7Ci0gICAgICAgICAgICB0aGlzLmFkZHJlc3NEYXRhID0gYWRkcmVzc0RhdGE7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIG51bGwgd2hlbiB0aGVyZSdzIG5vIGluZm9ybWF0aW9uIGF2YWlsYWJsZSB0byBjb25zdHJ1Y3QgdGhlIGRhdGEuCi0gICAgICovCi0gICAgcHJpdmF0ZSBQb3N0YWxTdHJ1Y3QgdHJ5Q29uc3RydWN0UG9zdGFsU3RydWN0KENvbnRlbnRWYWx1ZXMgY29udGVudFZhbHVlcykgewotICAgICAgICAvLyBhZHItdmFsdWUgICAgPSAwKjYodGV4dC12YWx1ZSAiOyIpIHRleHQtdmFsdWUKLSAgICAgICAgLy8gICAgICAgICAgICAgIDsgUE8gQm94LCBFeHRlbmRlZCBBZGRyZXNzLCBTdHJlZXQsIExvY2FsaXR5LCBSZWdpb24sIFBvc3RhbAotICAgICAgICAvLyAgICAgICAgICAgICAgOyBDb2RlLCBDb3VudHJ5IE5hbWUKLSAgICAgICAgZmluYWwgU3RyaW5nIHJhd1BvQm94ID0gY29udGVudFZhbHVlcy5nZXRBc1N0cmluZyhTdHJ1Y3R1cmVkUG9zdGFsLlBPQk9YKTsKLSAgICAgICAgZmluYWwgU3RyaW5nIHJhd05laWdoYm9yaG9vZCA9IGNvbnRlbnRWYWx1ZXMuZ2V0QXNTdHJpbmcoU3RydWN0dXJlZFBvc3RhbC5ORUlHSEJPUkhPT0QpOwotICAgICAgICBmaW5hbCBTdHJpbmcgcmF3U3RyZWV0ID0gY29udGVudFZhbHVlcy5nZXRBc1N0cmluZyhTdHJ1Y3R1cmVkUG9zdGFsLlNUUkVFVCk7Ci0gICAgICAgIGZpbmFsIFN0cmluZyByYXdMb2NhbGl0eSA9IGNvbnRlbnRWYWx1ZXMuZ2V0QXNTdHJpbmcoU3RydWN0dXJlZFBvc3RhbC5DSVRZKTsKLSAgICAgICAgZmluYWwgU3RyaW5nIHJhd1JlZ2lvbiA9IGNvbnRlbnRWYWx1ZXMuZ2V0QXNTdHJpbmcoU3RydWN0dXJlZFBvc3RhbC5SRUdJT04pOwotICAgICAgICBmaW5hbCBTdHJpbmcgcmF3UG9zdGFsQ29kZSA9IGNvbnRlbnRWYWx1ZXMuZ2V0QXNTdHJpbmcoU3RydWN0dXJlZFBvc3RhbC5QT1NUQ09ERSk7Ci0gICAgICAgIGZpbmFsIFN0cmluZyByYXdDb3VudHJ5ID0gY29udGVudFZhbHVlcy5nZXRBc1N0cmluZyhTdHJ1Y3R1cmVkUG9zdGFsLkNPVU5UUlkpOwotICAgICAgICBmaW5hbCBTdHJpbmdbXSByYXdBZGRyZXNzQXJyYXkgPSBuZXcgU3RyaW5nW117Ci0gICAgICAgICAgICAgICAgcmF3UG9Cb3gsIHJhd05laWdoYm9yaG9vZCwgcmF3U3RyZWV0LCByYXdMb2NhbGl0eSwKLSAgICAgICAgICAgICAgICByYXdSZWdpb24sIHJhd1Bvc3RhbENvZGUsIHJhd0NvdW50cnl9OwotICAgICAgICBpZiAoIVZDYXJkVXRpbHMuYXJlQWxsRW1wdHkocmF3QWRkcmVzc0FycmF5KSkgewotICAgICAgICAgICAgZmluYWwgYm9vbGVhbiByZWFsbHlVc2VRdW90ZWRQcmludGFibGUgPQotICAgICAgICAgICAgICAgIChtU2hvdWxkVXNlUXVvdGVkUHJpbnRhYmxlICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAhVkNhcmRVdGlscy5jb250YWluc09ubHlOb25DckxmUHJpbnRhYmxlQXNjaWkocmF3QWRkcmVzc0FycmF5KSk7Ci0gICAgICAgICAgICBmaW5hbCBib29sZWFuIGFwcGVuZENoYXJzZXQgPQotICAgICAgICAgICAgICAgICFWQ2FyZFV0aWxzLmNvbnRhaW5zT25seVByaW50YWJsZUFzY2lpKHJhd0FkZHJlc3NBcnJheSk7Ci0gICAgICAgICAgICBmaW5hbCBTdHJpbmcgZW5jb2RlZFBvQm94OwotICAgICAgICAgICAgZmluYWwgU3RyaW5nIGVuY29kZWRTdHJlZXQ7Ci0gICAgICAgICAgICBmaW5hbCBTdHJpbmcgZW5jb2RlZExvY2FsaXR5OwotICAgICAgICAgICAgZmluYWwgU3RyaW5nIGVuY29kZWRSZWdpb247Ci0gICAgICAgICAgICBmaW5hbCBTdHJpbmcgZW5jb2RlZFBvc3RhbENvZGU7Ci0gICAgICAgICAgICBmaW5hbCBTdHJpbmcgZW5jb2RlZENvdW50cnk7Ci0gICAgICAgICAgICBmaW5hbCBTdHJpbmcgZW5jb2RlZE5laWdoYm9yaG9vZDsKLQotICAgICAgICAgICAgZmluYWwgU3RyaW5nIHJhd0xvY2FsaXR5MjsKLSAgICAgICAgICAgIC8vIFRoaXMgbG9va3MgaW5lZmZpY2llbnQgc2luY2Ugd2UgZW5jb2RlIHJhd0xvY2FsaXR5IGFuZCByYXdOZWlnaGJvcmhvb2QgdHdpY2UsCi0gICAgICAgICAgICAvLyBidXQgdGhpcyBpcyBpbnRlbnRpb25hbC4KLSAgICAgICAgICAgIC8vCi0gICAgICAgICAgICAvLyBRUCBlbmNvZGluZyBtYXkgYWRkIGxpbmUgZmVlZHMgd2hlbiBuZWVkZWQgYW5kIHRoZSByZXN1bHQgb2YKLSAgICAgICAgICAgIC8vIC0gZW5jb2RlUXVvdGVkUHJpbnRhYmxlKHJhd0xvY2FsaXR5ICsgIiAiICsgcmF3TmVpZ2hib3Job29kKQotICAgICAgICAgICAgLy8gbWF5IGJlIGRpZmZlcmVudCBmcm9tCi0gICAgICAgICAgICAvLyAtIGVuY29kZWRMb2NhbGl0eSArICIgIiArIGVuY29kZWROZWlnaGJvcmhvb2QuCi0gICAgICAgICAgICAvLwotICAgICAgICAgICAgLy8gV2UgdXNlIHNhZmVyIHdheS4KLSAgICAgICAgICAgIGlmIChUZXh0VXRpbHMuaXNFbXB0eShyYXdMb2NhbGl0eSkpIHsKLSAgICAgICAgICAgICAgICBpZiAoVGV4dFV0aWxzLmlzRW1wdHkocmF3TmVpZ2hib3Job29kKSkgewotICAgICAgICAgICAgICAgICAgICByYXdMb2NhbGl0eTIgPSAiIjsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICByYXdMb2NhbGl0eTIgPSByYXdOZWlnaGJvcmhvb2Q7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBpZiAoVGV4dFV0aWxzLmlzRW1wdHkocmF3TmVpZ2hib3Job29kKSkgewotICAgICAgICAgICAgICAgICAgICByYXdMb2NhbGl0eTIgPSByYXdMb2NhbGl0eTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICByYXdMb2NhbGl0eTIgPSByYXdMb2NhbGl0eSArICIgIiArIHJhd05laWdoYm9yaG9vZDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAocmVhbGx5VXNlUXVvdGVkUHJpbnRhYmxlKSB7Ci0gICAgICAgICAgICAgICAgZW5jb2RlZFBvQm94ID0gZW5jb2RlUXVvdGVkUHJpbnRhYmxlKHJhd1BvQm94KTsKLSAgICAgICAgICAgICAgICBlbmNvZGVkU3RyZWV0ID0gZW5jb2RlUXVvdGVkUHJpbnRhYmxlKHJhd1N0cmVldCk7Ci0gICAgICAgICAgICAgICAgZW5jb2RlZExvY2FsaXR5ID0gZW5jb2RlUXVvdGVkUHJpbnRhYmxlKHJhd0xvY2FsaXR5Mik7Ci0gICAgICAgICAgICAgICAgZW5jb2RlZFJlZ2lvbiA9IGVuY29kZVF1b3RlZFByaW50YWJsZShyYXdSZWdpb24pOwotICAgICAgICAgICAgICAgIGVuY29kZWRQb3N0YWxDb2RlID0gZW5jb2RlUXVvdGVkUHJpbnRhYmxlKHJhd1Bvc3RhbENvZGUpOwotICAgICAgICAgICAgICAgIGVuY29kZWRDb3VudHJ5ID0gZW5jb2RlUXVvdGVkUHJpbnRhYmxlKHJhd0NvdW50cnkpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBlbmNvZGVkUG9Cb3ggPSBlc2NhcGVDaGFyYWN0ZXJzKHJhd1BvQm94KTsKLSAgICAgICAgICAgICAgICBlbmNvZGVkU3RyZWV0ID0gZXNjYXBlQ2hhcmFjdGVycyhyYXdTdHJlZXQpOwotICAgICAgICAgICAgICAgIGVuY29kZWRMb2NhbGl0eSA9IGVzY2FwZUNoYXJhY3RlcnMocmF3TG9jYWxpdHkyKTsKLSAgICAgICAgICAgICAgICBlbmNvZGVkUmVnaW9uID0gZXNjYXBlQ2hhcmFjdGVycyhyYXdSZWdpb24pOwotICAgICAgICAgICAgICAgIGVuY29kZWRQb3N0YWxDb2RlID0gZXNjYXBlQ2hhcmFjdGVycyhyYXdQb3N0YWxDb2RlKTsKLSAgICAgICAgICAgICAgICBlbmNvZGVkQ291bnRyeSA9IGVzY2FwZUNoYXJhY3RlcnMocmF3Q291bnRyeSk7Ci0gICAgICAgICAgICAgICAgZW5jb2RlZE5laWdoYm9yaG9vZCA9IGVzY2FwZUNoYXJhY3RlcnMocmF3TmVpZ2hib3Job29kKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZpbmFsIFN0cmluZ0J1aWxkZXIgYWRkcmVzc0J1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotICAgICAgICAgICAgYWRkcmVzc0J1aWxkZXIuYXBwZW5kKGVuY29kZWRQb0JveCk7Ci0gICAgICAgICAgICBhZGRyZXNzQnVpbGRlci5hcHBlbmQoVkNBUkRfSVRFTV9TRVBBUkFUT1IpOyAgLy8gUE8gQk9YIDsgRXh0ZW5kZWQgQWRkcmVzcwotICAgICAgICAgICAgYWRkcmVzc0J1aWxkZXIuYXBwZW5kKFZDQVJEX0lURU1fU0VQQVJBVE9SKTsgIC8vIEV4dGVuZGVkIEFkZHJlc3MgOiBTdHJlZXQKLSAgICAgICAgICAgIGFkZHJlc3NCdWlsZGVyLmFwcGVuZChlbmNvZGVkU3RyZWV0KTsKLSAgICAgICAgICAgIGFkZHJlc3NCdWlsZGVyLmFwcGVuZChWQ0FSRF9JVEVNX1NFUEFSQVRPUik7ICAvLyBTdHJlZXQgOiBMb2NhbGl0eQotICAgICAgICAgICAgYWRkcmVzc0J1aWxkZXIuYXBwZW5kKGVuY29kZWRMb2NhbGl0eSk7Ci0gICAgICAgICAgICBhZGRyZXNzQnVpbGRlci5hcHBlbmQoVkNBUkRfSVRFTV9TRVBBUkFUT1IpOyAgLy8gTG9jYWxpdHkgOiBSZWdpb24KLSAgICAgICAgICAgIGFkZHJlc3NCdWlsZGVyLmFwcGVuZChlbmNvZGVkUmVnaW9uKTsKLSAgICAgICAgICAgIGFkZHJlc3NCdWlsZGVyLmFwcGVuZChWQ0FSRF9JVEVNX1NFUEFSQVRPUik7ICAvLyBSZWdpb24gOiBQb3N0YWwgQ29kZQotICAgICAgICAgICAgYWRkcmVzc0J1aWxkZXIuYXBwZW5kKGVuY29kZWRQb3N0YWxDb2RlKTsKLSAgICAgICAgICAgIGFkZHJlc3NCdWlsZGVyLmFwcGVuZChWQ0FSRF9JVEVNX1NFUEFSQVRPUik7ICAvLyBQb3N0YWwgQ29kZSA6IENvdW50cnkKLSAgICAgICAgICAgIGFkZHJlc3NCdWlsZGVyLmFwcGVuZChlbmNvZGVkQ291bnRyeSk7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IFBvc3RhbFN0cnVjdCgKLSAgICAgICAgICAgICAgICAgICAgcmVhbGx5VXNlUXVvdGVkUHJpbnRhYmxlLCBhcHBlbmRDaGFyc2V0LCBhZGRyZXNzQnVpbGRlci50b1N0cmluZygpKTsKLSAgICAgICAgfSBlbHNlIHsgIC8vIFZDYXJkVXRpbHMuYXJlQWxsRW1wdHkocmF3QWRkcmVzc0FycmF5KSA9PSB0cnVlCi0gICAgICAgICAgICAvLyBUcnkgdG8gdXNlIEZPUk1BVFRFRF9BRERSRVNTIGluc3RlYWQuCi0gICAgICAgICAgICBmaW5hbCBTdHJpbmcgcmF3Rm9ybWF0dGVkQWRkcmVzcyA9Ci0gICAgICAgICAgICAgICAgY29udGVudFZhbHVlcy5nZXRBc1N0cmluZyhTdHJ1Y3R1cmVkUG9zdGFsLkZPUk1BVFRFRF9BRERSRVNTKTsKLSAgICAgICAgICAgIGlmIChUZXh0VXRpbHMuaXNFbXB0eShyYXdGb3JtYXR0ZWRBZGRyZXNzKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZmluYWwgYm9vbGVhbiByZWFsbHlVc2VRdW90ZWRQcmludGFibGUgPQotICAgICAgICAgICAgICAgIChtU2hvdWxkVXNlUXVvdGVkUHJpbnRhYmxlICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAhVkNhcmRVdGlscy5jb250YWluc09ubHlOb25DckxmUHJpbnRhYmxlQXNjaWkocmF3Rm9ybWF0dGVkQWRkcmVzcykpOwotICAgICAgICAgICAgZmluYWwgYm9vbGVhbiBhcHBlbmRDaGFyc2V0ID0KLSAgICAgICAgICAgICAgICAhVkNhcmRVdGlscy5jb250YWluc09ubHlQcmludGFibGVBc2NpaShyYXdGb3JtYXR0ZWRBZGRyZXNzKTsKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyBlbmNvZGVkRm9ybWF0dGVkQWRkcmVzczsKLSAgICAgICAgICAgIGlmIChyZWFsbHlVc2VRdW90ZWRQcmludGFibGUpIHsKLSAgICAgICAgICAgICAgICBlbmNvZGVkRm9ybWF0dGVkQWRkcmVzcyA9IGVuY29kZVF1b3RlZFByaW50YWJsZShyYXdGb3JtYXR0ZWRBZGRyZXNzKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgZW5jb2RlZEZvcm1hdHRlZEFkZHJlc3MgPSBlc2NhcGVDaGFyYWN0ZXJzKHJhd0Zvcm1hdHRlZEFkZHJlc3MpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBXZSB1c2UgdGhlIHNlY29uZCB2YWx1ZSAoIkV4dGVuZGVkIEFkZHJlc3MiKSBqdXN0IGJlY2F1c2UgSmFwYW5lc2UgbW9iaWxlIHBob25lcwotICAgICAgICAgICAgLy8gZG8gc28uIElmIHRoZSBvdGhlciBpbXBvcnRlciBleHBlY3RzIHRoZSB2YWx1ZSBiZSBpbiB0aGUgb3RoZXIgZmllbGQsIHNvbWUgZmxhZyBtYXkKLSAgICAgICAgICAgIC8vIGJlIG5lZWRlZC4KLSAgICAgICAgICAgIGZpbmFsIFN0cmluZ0J1aWxkZXIgYWRkcmVzc0J1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotICAgICAgICAgICAgYWRkcmVzc0J1aWxkZXIuYXBwZW5kKFZDQVJEX0lURU1fU0VQQVJBVE9SKTsgIC8vIFBPIEJPWCA7IEV4dGVuZGVkIEFkZHJlc3MKLSAgICAgICAgICAgIGFkZHJlc3NCdWlsZGVyLmFwcGVuZChlbmNvZGVkRm9ybWF0dGVkQWRkcmVzcyk7Ci0gICAgICAgICAgICBhZGRyZXNzQnVpbGRlci5hcHBlbmQoVkNBUkRfSVRFTV9TRVBBUkFUT1IpOyAgLy8gRXh0ZW5kZWQgQWRkcmVzcyA6IFN0cmVldAotICAgICAgICAgICAgYWRkcmVzc0J1aWxkZXIuYXBwZW5kKFZDQVJEX0lURU1fU0VQQVJBVE9SKTsgIC8vIFN0cmVldCA6IExvY2FsaXR5Ci0gICAgICAgICAgICBhZGRyZXNzQnVpbGRlci5hcHBlbmQoVkNBUkRfSVRFTV9TRVBBUkFUT1IpOyAgLy8gTG9jYWxpdHkgOiBSZWdpb24KLSAgICAgICAgICAgIGFkZHJlc3NCdWlsZGVyLmFwcGVuZChWQ0FSRF9JVEVNX1NFUEFSQVRPUik7ICAvLyBSZWdpb24gOiBQb3N0YWwgQ29kZQotICAgICAgICAgICAgYWRkcmVzc0J1aWxkZXIuYXBwZW5kKFZDQVJEX0lURU1fU0VQQVJBVE9SKTsgIC8vIFBvc3RhbCBDb2RlIDogQ291bnRyeQotICAgICAgICAgICAgcmV0dXJuIG5ldyBQb3N0YWxTdHJ1Y3QoCi0gICAgICAgICAgICAgICAgICAgIHJlYWxseVVzZVF1b3RlZFByaW50YWJsZSwgYXBwZW5kQ2hhcnNldCwgYWRkcmVzc0J1aWxkZXIudG9TdHJpbmcoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgVkNhcmRCdWlsZGVyIGFwcGVuZEltcyhmaW5hbCBMaXN0PENvbnRlbnRWYWx1ZXM+IGNvbnRlbnRWYWx1ZXNMaXN0KSB7Ci0gICAgICAgIGlmIChjb250ZW50VmFsdWVzTGlzdCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBmb3IgKENvbnRlbnRWYWx1ZXMgY29udGVudFZhbHVlcyA6IGNvbnRlbnRWYWx1ZXNMaXN0KSB7Ci0gICAgICAgICAgICAgICAgZmluYWwgSW50ZWdlciBwcm90b2NvbEFzT2JqZWN0ID0gY29udGVudFZhbHVlcy5nZXRBc0ludGVnZXIoSW0uUFJPVE9DT0wpOwotICAgICAgICAgICAgICAgIGlmIChwcm90b2NvbEFzT2JqZWN0ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBwcm9wZXJ0eU5hbWUgPSBWQ2FyZFV0aWxzLmdldFByb3BlcnR5TmFtZUZvckltKHByb3RvY29sQXNPYmplY3QpOwotICAgICAgICAgICAgICAgIGlmIChwcm9wZXJ0eU5hbWUgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGRhdGEgPSBjb250ZW50VmFsdWVzLmdldEFzU3RyaW5nKEltLkRBVEEpOwotICAgICAgICAgICAgICAgIGlmIChkYXRhICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgZGF0YSA9IGRhdGEudHJpbSgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoVGV4dFV0aWxzLmlzRW1wdHkoZGF0YSkpIHsKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyB0eXBlQXNTdHJpbmc7Ci0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBmaW5hbCBJbnRlZ2VyIHR5cGVBc0ludGVnZXIgPSBjb250ZW50VmFsdWVzLmdldEFzSW50ZWdlcihJbS5UWVBFKTsKLSAgICAgICAgICAgICAgICAgICAgc3dpdGNoICh0eXBlQXNJbnRlZ2VyICE9IG51bGwgPyB0eXBlQXNJbnRlZ2VyIDogSW0uVFlQRV9PVEhFUikgewotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBJbS5UWVBFX0hPTUU6IHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlQXNTdHJpbmcgPSBWQ2FyZENvbnN0YW50cy5QQVJBTV9UWVBFX0hPTUU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEltLlRZUEVfV09SSzogewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVBc1N0cmluZyA9IFZDYXJkQ29uc3RhbnRzLlBBUkFNX1RZUEVfV09SSzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgSW0uVFlQRV9DVVNUT006IHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgbGFiZWwgPSBjb250ZW50VmFsdWVzLmdldEFzU3RyaW5nKEltLkxBQkVMKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlQXNTdHJpbmcgPSAobGFiZWwgIT0gbnVsbCA/ICJYLSIgKyBsYWJlbCA6IG51bGwpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBJbS5UWVBFX09USEVSOiAgLy8gSWdub3JlCi0gICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OiB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZUFzU3RyaW5nID0gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGZpbmFsIExpc3Q8U3RyaW5nPiBwYXJhbWV0ZXJMaXN0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0gICAgICAgICAgICAgICAgaWYgKCFUZXh0VXRpbHMuaXNFbXB0eSh0eXBlQXNTdHJpbmcpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlckxpc3QuYWRkKHR5cGVBc1N0cmluZyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGZpbmFsIEludGVnZXIgaXNQcmltYXJ5QXNJbnRlZ2VyID0gY29udGVudFZhbHVlcy5nZXRBc0ludGVnZXIoSW0uSVNfUFJJTUFSWSk7Ci0gICAgICAgICAgICAgICAgZmluYWwgYm9vbGVhbiBpc1ByaW1hcnkgPSAoaXNQcmltYXJ5QXNJbnRlZ2VyICE9IG51bGwgPwotICAgICAgICAgICAgICAgICAgICAgICAgKGlzUHJpbWFyeUFzSW50ZWdlciA+IDApIDogZmFsc2UpOwotICAgICAgICAgICAgICAgIGlmIChpc1ByaW1hcnkpIHsKLSAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVyTGlzdC5hZGQoVkNhcmRDb25zdGFudHMuUEFSQU1fVFlQRV9QUkVGKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBhcHBlbmRMaW5lV2l0aENoYXJzZXRBbmRRUERldGVjdGlvbihwcm9wZXJ0eU5hbWUsIHBhcmFtZXRlckxpc3QsIGRhdGEpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0aGlzOwotICAgIH0KLQotICAgIHB1YmxpYyBWQ2FyZEJ1aWxkZXIgYXBwZW5kV2Vic2l0ZXMoZmluYWwgTGlzdDxDb250ZW50VmFsdWVzPiBjb250ZW50VmFsdWVzTGlzdCkgewotICAgICAgICBpZiAoY29udGVudFZhbHVlc0xpc3QgIT0gbnVsbCkgewotICAgICAgICAgICAgZm9yIChDb250ZW50VmFsdWVzIGNvbnRlbnRWYWx1ZXMgOiBjb250ZW50VmFsdWVzTGlzdCkgewotICAgICAgICAgICAgICAgIFN0cmluZyB3ZWJzaXRlID0gY29udGVudFZhbHVlcy5nZXRBc1N0cmluZyhXZWJzaXRlLlVSTCk7Ci0gICAgICAgICAgICAgICAgaWYgKHdlYnNpdGUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICB3ZWJzaXRlID0gd2Vic2l0ZS50cmltKCk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLy8gTm90ZTogdkNhcmQgMy4wIGRvZXMgbm90IGFsbG93IGFueSBwYXJhbWV0ZXIgYWRkaXRpb24gdG93YXJkICJVUkwiCi0gICAgICAgICAgICAgICAgLy8gICAgICAgcHJvcGVydHksIHdoaWxlIHRoZXJlJ3Mgbm8gZG9jdW1lbnQgaW4gdkNhcmQgMi4xLgotICAgICAgICAgICAgICAgIGlmICghVGV4dFV0aWxzLmlzRW1wdHkod2Vic2l0ZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgYXBwZW5kTGluZVdpdGhDaGFyc2V0QW5kUVBEZXRlY3Rpb24oVkNhcmRDb25zdGFudHMuUFJPUEVSVFlfVVJMLCB3ZWJzaXRlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgfQotCi0gICAgcHVibGljIFZDYXJkQnVpbGRlciBhcHBlbmRPcmdhbml6YXRpb25zKGZpbmFsIExpc3Q8Q29udGVudFZhbHVlcz4gY29udGVudFZhbHVlc0xpc3QpIHsKLSAgICAgICAgaWYgKGNvbnRlbnRWYWx1ZXNMaXN0ICE9IG51bGwpIHsKLSAgICAgICAgICAgIGZvciAoQ29udGVudFZhbHVlcyBjb250ZW50VmFsdWVzIDogY29udGVudFZhbHVlc0xpc3QpIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgY29tcGFueSA9IGNvbnRlbnRWYWx1ZXMuZ2V0QXNTdHJpbmcoT3JnYW5pemF0aW9uLkNPTVBBTlkpOwotICAgICAgICAgICAgICAgIGlmIChjb21wYW55ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgY29tcGFueSA9IGNvbXBhbnkudHJpbSgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBTdHJpbmcgZGVwYXJ0bWVudCA9IGNvbnRlbnRWYWx1ZXMuZ2V0QXNTdHJpbmcoT3JnYW5pemF0aW9uLkRFUEFSVE1FTlQpOwotICAgICAgICAgICAgICAgIGlmIChkZXBhcnRtZW50ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgZGVwYXJ0bWVudCA9IGRlcGFydG1lbnQudHJpbSgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBTdHJpbmcgdGl0bGUgPSBjb250ZW50VmFsdWVzLmdldEFzU3RyaW5nKE9yZ2FuaXphdGlvbi5USVRMRSk7Ci0gICAgICAgICAgICAgICAgaWYgKHRpdGxlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgdGl0bGUgPSB0aXRsZS50cmltKCk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgU3RyaW5nQnVpbGRlciBvcmdCdWlsZGVyID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLSAgICAgICAgICAgICAgICBpZiAoIVRleHRVdGlscy5pc0VtcHR5KGNvbXBhbnkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG9yZ0J1aWxkZXIuYXBwZW5kKGNvbXBhbnkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoIVRleHRVdGlscy5pc0VtcHR5KGRlcGFydG1lbnQpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChvcmdCdWlsZGVyLmxlbmd0aCgpID4gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgb3JnQnVpbGRlci5hcHBlbmQoJzsnKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBvcmdCdWlsZGVyLmFwcGVuZChkZXBhcnRtZW50KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIG9yZ2xpbmUgPSBvcmdCdWlsZGVyLnRvU3RyaW5nKCk7Ci0gICAgICAgICAgICAgICAgYXBwZW5kTGluZShWQ2FyZENvbnN0YW50cy5QUk9QRVJUWV9PUkcsIG9yZ2xpbmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAhVkNhcmRVdGlscy5jb250YWluc09ubHlQcmludGFibGVBc2NpaShvcmdsaW5lKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIChtU2hvdWxkVXNlUXVvdGVkUHJpbnRhYmxlICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICFWQ2FyZFV0aWxzLmNvbnRhaW5zT25seU5vbkNyTGZQcmludGFibGVBc2NpaShvcmdsaW5lKSkpOwotCi0gICAgICAgICAgICAgICAgaWYgKCFUZXh0VXRpbHMuaXNFbXB0eSh0aXRsZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgYXBwZW5kTGluZShWQ2FyZENvbnN0YW50cy5QUk9QRVJUWV9USVRMRSwgdGl0bGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIVZDYXJkVXRpbHMuY29udGFpbnNPbmx5UHJpbnRhYmxlQXNjaWkodGl0bGUpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtU2hvdWxkVXNlUXVvdGVkUHJpbnRhYmxlICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhVkNhcmRVdGlscy5jb250YWluc09ubHlOb25DckxmUHJpbnRhYmxlQXNjaWkodGl0bGUpKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0aGlzOwotICAgIH0KLQotICAgIHB1YmxpYyBWQ2FyZEJ1aWxkZXIgYXBwZW5kUGhvdG9zKGZpbmFsIExpc3Q8Q29udGVudFZhbHVlcz4gY29udGVudFZhbHVlc0xpc3QpIHsKLSAgICAgICAgaWYgKGNvbnRlbnRWYWx1ZXNMaXN0ICE9IG51bGwpIHsKLSAgICAgICAgICAgIGZvciAoQ29udGVudFZhbHVlcyBjb250ZW50VmFsdWVzIDogY29udGVudFZhbHVlc0xpc3QpIHsKLSAgICAgICAgICAgICAgICBpZiAoY29udGVudFZhbHVlcyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBieXRlW10gZGF0YSA9IGNvbnRlbnRWYWx1ZXMuZ2V0QXNCeXRlQXJyYXkoUGhvdG8uUEhPVE8pOwotICAgICAgICAgICAgICAgIGlmIChkYXRhID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBwaG90b1R5cGUgPSBWQ2FyZFV0aWxzLmd1ZXNzSW1hZ2VUeXBlKGRhdGEpOwotICAgICAgICAgICAgICAgIGlmIChwaG90b1R5cGUgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBMb2cuZChMT0dfVEFHLCAiVW5rbm93biBwaG90byB0eXBlLiBJZ25vcmVkLiIpOwotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgLy8gVE9ETzogY2hlY2sgdGhpcyB3b3JrcyBmaW5lLgotICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBwaG90b1N0cmluZyA9IG5ldyBTdHJpbmcoQmFzZTY0LmVuY29kZShkYXRhLCBCYXNlNjQuTk9fV1JBUCkpOwotICAgICAgICAgICAgICAgIGlmICghVGV4dFV0aWxzLmlzRW1wdHkocGhvdG9TdHJpbmcpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGFwcGVuZFBob3RvTGluZShwaG90b1N0cmluZywgcGhvdG9UeXBlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgfQotCi0gICAgcHVibGljIFZDYXJkQnVpbGRlciBhcHBlbmROb3RlcyhmaW5hbCBMaXN0PENvbnRlbnRWYWx1ZXM+IGNvbnRlbnRWYWx1ZXNMaXN0KSB7Ci0gICAgICAgIGlmIChjb250ZW50VmFsdWVzTGlzdCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAobU9ubHlPbmVOb3RlRmllbGRJc0F2YWlsYWJsZSkgewotICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZ0J1aWxkZXIgbm90ZUJ1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotICAgICAgICAgICAgICAgIGJvb2xlYW4gZmlyc3QgPSB0cnVlOwotICAgICAgICAgICAgICAgIGZvciAoZmluYWwgQ29udGVudFZhbHVlcyBjb250ZW50VmFsdWVzIDogY29udGVudFZhbHVlc0xpc3QpIHsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG5vdGUgPSBjb250ZW50VmFsdWVzLmdldEFzU3RyaW5nKE5vdGUuTk9URSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChub3RlID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG5vdGUgPSAiIjsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpZiAobm90ZS5sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmaXJzdCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0ID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vdGVCdWlsZGVyLmFwcGVuZCgnXG4nKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIG5vdGVCdWlsZGVyLmFwcGVuZChub3RlKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgbm90ZVN0ciA9IG5vdGVCdWlsZGVyLnRvU3RyaW5nKCk7Ci0gICAgICAgICAgICAgICAgLy8gVGhpcyBtZWFucyB3ZSBzY2FuIG5vdGVTdHIgY29tcGxldGVseSB0d2ljZSwgd2hpY2ggaXMgcmVkdW5kYW50LgotICAgICAgICAgICAgICAgIC8vIEJ1dCBmb3Igbm93LCB3ZSBhc3N1bWUgdGhpcyBpcyBub3Qgc28gdGltZS1jb25zdW1pbmcuLgotICAgICAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gc2hvdWxkQXBwZW5kQ2hhcnNldEluZm8gPQotICAgICAgICAgICAgICAgICAgICAhVkNhcmRVdGlscy5jb250YWluc09ubHlQcmludGFibGVBc2NpaShub3RlU3RyKTsKLSAgICAgICAgICAgICAgICBmaW5hbCBib29sZWFuIHJlYWxseVVzZVF1b3RlZFByaW50YWJsZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAobVNob3VsZFVzZVF1b3RlZFByaW50YWJsZSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICFWQ2FyZFV0aWxzLmNvbnRhaW5zT25seU5vbkNyTGZQcmludGFibGVBc2NpaShub3RlU3RyKSk7Ci0gICAgICAgICAgICAgICAgYXBwZW5kTGluZShWQ2FyZENvbnN0YW50cy5QUk9QRVJUWV9OT1RFLCBub3RlU3RyLAotICAgICAgICAgICAgICAgICAgICAgICAgc2hvdWxkQXBwZW5kQ2hhcnNldEluZm8sIHJlYWxseVVzZVF1b3RlZFByaW50YWJsZSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGZvciAoQ29udGVudFZhbHVlcyBjb250ZW50VmFsdWVzIDogY29udGVudFZhbHVlc0xpc3QpIHsKLSAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIG5vdGVTdHIgPSBjb250ZW50VmFsdWVzLmdldEFzU3RyaW5nKE5vdGUuTk9URSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmICghVGV4dFV0aWxzLmlzRW1wdHkobm90ZVN0cikpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gc2hvdWxkQXBwZW5kQ2hhcnNldEluZm8gPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhVkNhcmRVdGlscy5jb250YWluc09ubHlQcmludGFibGVBc2NpaShub3RlU3RyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gcmVhbGx5VXNlUXVvdGVkUHJpbnRhYmxlID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1TaG91bGRVc2VRdW90ZWRQcmludGFibGUgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICFWQ2FyZFV0aWxzLmNvbnRhaW5zT25seU5vbkNyTGZQcmludGFibGVBc2NpaShub3RlU3RyKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBhcHBlbmRMaW5lKFZDYXJkQ29uc3RhbnRzLlBST1BFUlRZX05PVEUsIG5vdGVTdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3VsZEFwcGVuZENoYXJzZXRJbmZvLCByZWFsbHlVc2VRdW90ZWRQcmludGFibGUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0aGlzOwotICAgIH0KLQotICAgIHB1YmxpYyBWQ2FyZEJ1aWxkZXIgYXBwZW5kRXZlbnRzKGZpbmFsIExpc3Q8Q29udGVudFZhbHVlcz4gY29udGVudFZhbHVlc0xpc3QpIHsKLSAgICAgICAgLy8gVGhlcmUncyBwb3NzaWJpbGl0eSB3aGVyZSBhIGdpdmVuIG9iamVjdCBtYXkgaGF2ZSBtb3JlIHRoYW4gb25lIGJpcnRoZGF5LCB3aGljaAotICAgICAgICAvLyBpcyBpbmFwcHJvcHJpYXRlLiBXZSBqdXN0IGJ1aWxkIG9uZSBiaXJ0aGRheS4KLSAgICAgICAgaWYgKGNvbnRlbnRWYWx1ZXNMaXN0ICE9IG51bGwpIHsKLSAgICAgICAgICAgIFN0cmluZyBwcmltYXJ5QmlydGhkYXkgPSBudWxsOwotICAgICAgICAgICAgU3RyaW5nIHNlY29uZGFyeUJpcnRoZGF5ID0gbnVsbDsKLSAgICAgICAgICAgIGZvciAoZmluYWwgQ29udGVudFZhbHVlcyBjb250ZW50VmFsdWVzIDogY29udGVudFZhbHVlc0xpc3QpIHsKLSAgICAgICAgICAgICAgICBpZiAoY29udGVudFZhbHVlcyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBmaW5hbCBJbnRlZ2VyIGV2ZW50VHlwZUFzSW50ZWdlciA9IGNvbnRlbnRWYWx1ZXMuZ2V0QXNJbnRlZ2VyKEV2ZW50LlRZUEUpOwotICAgICAgICAgICAgICAgIGZpbmFsIGludCBldmVudFR5cGU7Ci0gICAgICAgICAgICAgICAgaWYgKGV2ZW50VHlwZUFzSW50ZWdlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGV2ZW50VHlwZSA9IGV2ZW50VHlwZUFzSW50ZWdlcjsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBldmVudFR5cGUgPSBFdmVudC5UWVBFX09USEVSOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoZXZlbnRUeXBlID09IEV2ZW50LlRZUEVfQklSVEhEQVkpIHsKLSAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIGJpcnRoZGF5Q2FuZGlkYXRlID0gY29udGVudFZhbHVlcy5nZXRBc1N0cmluZyhFdmVudC5TVEFSVF9EQVRFKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGJpcnRoZGF5Q2FuZGlkYXRlID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGZpbmFsIEludGVnZXIgaXNTdXBlclByaW1hcnlBc0ludGVnZXIgPQotICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudFZhbHVlcy5nZXRBc0ludGVnZXIoRXZlbnQuSVNfU1VQRVJfUFJJTUFSWSk7Ci0gICAgICAgICAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gaXNTdXBlclByaW1hcnkgPSAoaXNTdXBlclByaW1hcnlBc0ludGVnZXIgIT0gbnVsbCA/Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGlzU3VwZXJQcmltYXJ5QXNJbnRlZ2VyID4gMCkgOiBmYWxzZSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChpc1N1cGVyUHJpbWFyeSkgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gInN1cGVyIHByaW1hcnkiIGJpcnRoZGF5IHNob3VsZCB0aGUgcHJlZmVyZWQgb25lLgotICAgICAgICAgICAgICAgICAgICAgICAgcHJpbWFyeUJpcnRoZGF5ID0gYmlydGhkYXlDYW5kaWRhdGU7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBmaW5hbCBJbnRlZ2VyIGlzUHJpbWFyeUFzSW50ZWdlciA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50VmFsdWVzLmdldEFzSW50ZWdlcihFdmVudC5JU19QUklNQVJZKTsKLSAgICAgICAgICAgICAgICAgICAgZmluYWwgYm9vbGVhbiBpc1ByaW1hcnkgPSAoaXNQcmltYXJ5QXNJbnRlZ2VyICE9IG51bGwgPwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpc1ByaW1hcnlBc0ludGVnZXIgPiAwKSA6IGZhbHNlKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGlzUHJpbWFyeSkgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gV2UgZG9uJ3QgYnJlYWsgaGVyZSBzaW5jZSAic3VwZXIgcHJpbWFyeSIgYmlydGhkYXkgbWF5IGV4aXN0IGxhdGVyLgotICAgICAgICAgICAgICAgICAgICAgICAgcHJpbWFyeUJpcnRoZGF5ID0gYmlydGhkYXlDYW5kaWRhdGU7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc2Vjb25kYXJ5QmlydGhkYXkgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gRmlyc3QgZW50cnkgaXMgc2V0IHRvIHRoZSAic2Vjb25kYXJ5IiBjYW5kaWRhdGUuCi0gICAgICAgICAgICAgICAgICAgICAgICBzZWNvbmRhcnlCaXJ0aGRheSA9IGJpcnRoZGF5Q2FuZGlkYXRlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChtVXNlc0FuZHJvaWRQcm9wZXJ0eSkgewotICAgICAgICAgICAgICAgICAgICAvLyBFdmVudCB0eXBlcyBvdGhlciB0aGFuIEJpcnRoZGF5IGlzIG5vdCBzdXBwb3J0ZWQgYnkgdkNhcmQuCi0gICAgICAgICAgICAgICAgICAgIGFwcGVuZEFuZHJvaWRTcGVjaWZpY1Byb3BlcnR5KEV2ZW50LkNPTlRFTlRfSVRFTV9UWVBFLCBjb250ZW50VmFsdWVzKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAocHJpbWFyeUJpcnRoZGF5ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBhcHBlbmRMaW5lV2l0aENoYXJzZXRBbmRRUERldGVjdGlvbihWQ2FyZENvbnN0YW50cy5QUk9QRVJUWV9CREFZLAotICAgICAgICAgICAgICAgICAgICAgICAgcHJpbWFyeUJpcnRoZGF5LnRyaW0oKSk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKHNlY29uZGFyeUJpcnRoZGF5ICE9IG51bGwpewotICAgICAgICAgICAgICAgIGFwcGVuZExpbmVXaXRoQ2hhcnNldEFuZFFQRGV0ZWN0aW9uKFZDYXJkQ29uc3RhbnRzLlBST1BFUlRZX0JEQVksCi0gICAgICAgICAgICAgICAgICAgICAgICBzZWNvbmRhcnlCaXJ0aGRheS50cmltKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0aGlzOwotICAgIH0KLQotICAgIHB1YmxpYyBWQ2FyZEJ1aWxkZXIgYXBwZW5kUmVsYXRpb24oZmluYWwgTGlzdDxDb250ZW50VmFsdWVzPiBjb250ZW50VmFsdWVzTGlzdCkgewotICAgICAgICBpZiAobVVzZXNBbmRyb2lkUHJvcGVydHkgJiYgY29udGVudFZhbHVlc0xpc3QgIT0gbnVsbCkgewotICAgICAgICAgICAgZm9yIChmaW5hbCBDb250ZW50VmFsdWVzIGNvbnRlbnRWYWx1ZXMgOiBjb250ZW50VmFsdWVzTGlzdCkgewotICAgICAgICAgICAgICAgIGlmIChjb250ZW50VmFsdWVzID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGFwcGVuZEFuZHJvaWRTcGVjaWZpY1Byb3BlcnR5KFJlbGF0aW9uLkNPTlRFTlRfSVRFTV9UWVBFLCBjb250ZW50VmFsdWVzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdGhpczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gZW1pdEV2ZXJ5VGltZSBJZiB0cnVlLCBidWlsZGVyIGJ1aWxkcyB0aGUgbGluZSBldmVuIHdoZW4gdGhlcmUncyBubyBlbnRyeS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBhcHBlbmRQb3N0YWxMaW5lKGZpbmFsIGludCB0eXBlLCBmaW5hbCBTdHJpbmcgbGFiZWwsCi0gICAgICAgICAgICBmaW5hbCBDb250ZW50VmFsdWVzIGNvbnRlbnRWYWx1ZXMsCi0gICAgICAgICAgICBmaW5hbCBib29sZWFuIGlzUHJpbWFyeSwgZmluYWwgYm9vbGVhbiBlbWl0RXZlcnlUaW1lKSB7Ci0gICAgICAgIGZpbmFsIGJvb2xlYW4gcmVhbGx5VXNlUXVvdGVkUHJpbnRhYmxlOwotICAgICAgICBmaW5hbCBib29sZWFuIGFwcGVuZENoYXJzZXQ7Ci0gICAgICAgIGZpbmFsIFN0cmluZyBhZGRyZXNzVmFsdWU7Ci0gICAgICAgIHsKLSAgICAgICAgICAgIFBvc3RhbFN0cnVjdCBwb3N0YWxTdHJ1Y3QgPSB0cnlDb25zdHJ1Y3RQb3N0YWxTdHJ1Y3QoY29udGVudFZhbHVlcyk7Ci0gICAgICAgICAgICBpZiAocG9zdGFsU3RydWN0ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBpZiAoZW1pdEV2ZXJ5VGltZSkgewotICAgICAgICAgICAgICAgICAgICByZWFsbHlVc2VRdW90ZWRQcmludGFibGUgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgYXBwZW5kQ2hhcnNldCA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICBhZGRyZXNzVmFsdWUgPSAiIjsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICByZWFsbHlVc2VRdW90ZWRQcmludGFibGUgPSBwb3N0YWxTdHJ1Y3QucmVhbGx5VXNlUXVvdGVkUHJpbnRhYmxlOwotICAgICAgICAgICAgICAgIGFwcGVuZENoYXJzZXQgPSBwb3N0YWxTdHJ1Y3QuYXBwZW5kQ2hhcnNldDsKLSAgICAgICAgICAgICAgICBhZGRyZXNzVmFsdWUgPSBwb3N0YWxTdHJ1Y3QuYWRkcmVzc0RhdGE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBMaXN0PFN0cmluZz4gcGFyYW1ldGVyTGlzdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotICAgICAgICBpZiAoaXNQcmltYXJ5KSB7Ci0gICAgICAgICAgICBwYXJhbWV0ZXJMaXN0LmFkZChWQ2FyZENvbnN0YW50cy5QQVJBTV9UWVBFX1BSRUYpOwotICAgICAgICB9Ci0gICAgICAgIHN3aXRjaCAodHlwZSkgewotICAgICAgICAgICAgY2FzZSBTdHJ1Y3R1cmVkUG9zdGFsLlRZUEVfSE9NRTogewotICAgICAgICAgICAgICAgIHBhcmFtZXRlckxpc3QuYWRkKFZDYXJkQ29uc3RhbnRzLlBBUkFNX1RZUEVfSE9NRSk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXNlIFN0cnVjdHVyZWRQb3N0YWwuVFlQRV9XT1JLOiB7Ci0gICAgICAgICAgICAgICAgcGFyYW1ldGVyTGlzdC5hZGQoVkNhcmRDb25zdGFudHMuUEFSQU1fVFlQRV9XT1JLKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhc2UgU3RydWN0dXJlZFBvc3RhbC5UWVBFX0NVU1RPTTogewotICAgICAgICAgICAgICAgIGlmICghVGV4dFV0aWxzLmlzRW1wdHkobGFiZWwpCi0gICAgICAgICAgICAgICAgICAgICAgICAmJiBWQ2FyZFV0aWxzLmNvbnRhaW5zT25seUFscGhhRGlnaXRIeXBoZW4obGFiZWwpKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIFdlJ3JlIG5vdCBzdXJlIHdoZXRoZXIgdGhlIGxhYmVsIGlzIHZhbGlkIGluIHRoZSBzcGVjCi0gICAgICAgICAgICAgICAgICAgIC8vICgiSUFOQS10b2tlbiIgaW4gdGhlIHZDYXJkIDMuMCBpcyB1bmNsZWFyLi4uKQotICAgICAgICAgICAgICAgICAgICAvLyBKdXN0ICBmb3Igc2FmZXR5LCB3ZSBhZGQgIlgtIiBhdCB0aGUgYmVnZ2luaW5nIG9mIGVhY2ggbGFiZWwuCi0gICAgICAgICAgICAgICAgICAgIC8vIEFsc28gY2hlY2tzIHRoZSBsYWJlbCBvYmV5cyB3aXRoIHZDYXJkIDMuMCBzcGVjLgotICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXJMaXN0LmFkZCgiWC0iICsgbGFiZWwpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhc2UgU3RydWN0dXJlZFBvc3RhbC5UWVBFX09USEVSOiB7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBkZWZhdWx0OiB7Ci0gICAgICAgICAgICAgICAgTG9nLmUoTE9HX1RBRywgIlVua25vd24gU3RydWN0dXJlZFBvc3RhbCB0eXBlOiAiICsgdHlwZSk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNhcmRDb25zdGFudHMuUFJPUEVSVFlfQURSKTsKLSAgICAgICAgaWYgKCFwYXJhbWV0ZXJMaXN0LmlzRW1wdHkoKSkgewotICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDQVJEX1BBUkFNX1NFUEFSQVRPUik7Ci0gICAgICAgICAgICBhcHBlbmRUeXBlUGFyYW1ldGVycyhwYXJhbWV0ZXJMaXN0KTsKLSAgICAgICAgfQotICAgICAgICBpZiAoYXBwZW5kQ2hhcnNldCkgewotICAgICAgICAgICAgLy8gU3RyaWN0bHksIHZDYXJkIDMuMCBkb2VzIG5vdCBhbGxvdyBleHBvcnRlcnMgdG8gZW1pdCBjaGFyc2V0IGluZm9ybWF0aW9uLAotICAgICAgICAgICAgLy8gYnV0IHdlIHdpbGwgYWRkIGl0IHNpbmNlIHRoZSBpbmZvcm1hdGlvbiBzaG91bGQgYmUgdXNlZnVsIGZvciBpbXBvcnRlcnMsCi0gICAgICAgICAgICAvLwotICAgICAgICAgICAgLy8gQXNzdW1lIG5vIHBhcnNlciBkb2VzIG5vdCBlbWl0IGVycm9yIHdpdGggdGhpcyBwYXJhbWV0ZXIgaW4gdkNhcmQgMy4wLgotICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDQVJEX1BBUkFNX1NFUEFSQVRPUik7Ci0gICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQobVZDYXJkQ2hhcnNldFBhcmFtZXRlcik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHJlYWxseVVzZVF1b3RlZFByaW50YWJsZSkgewotICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDQVJEX1BBUkFNX1NFUEFSQVRPUik7Ci0gICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNBUkRfUEFSQU1fRU5DT0RJTkdfUVApOwotICAgICAgICB9Ci0gICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ0FSRF9EQVRBX1NFUEFSQVRPUik7Ci0gICAgICAgIG1CdWlsZGVyLmFwcGVuZChhZGRyZXNzVmFsdWUpOwotICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNBUkRfRU5EX09GX0xJTkUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFwcGVuZEVtYWlsTGluZShmaW5hbCBpbnQgdHlwZSwgZmluYWwgU3RyaW5nIGxhYmVsLAotICAgICAgICAgICAgZmluYWwgU3RyaW5nIHJhd1ZhbHVlLCBmaW5hbCBib29sZWFuIGlzUHJpbWFyeSkgewotICAgICAgICBmaW5hbCBTdHJpbmcgdHlwZUFzU3RyaW5nOwotICAgICAgICBzd2l0Y2ggKHR5cGUpIHsKLSAgICAgICAgICAgIGNhc2UgRW1haWwuVFlQRV9DVVNUT006IHsKLSAgICAgICAgICAgICAgICBpZiAoVkNhcmRVdGlscy5pc01vYmlsZVBob25lTGFiZWwobGFiZWwpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHR5cGVBc1N0cmluZyA9IFZDYXJkQ29uc3RhbnRzLlBBUkFNX1RZUEVfQ0VMTDsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCFUZXh0VXRpbHMuaXNFbXB0eShsYWJlbCkKLSAgICAgICAgICAgICAgICAgICAgICAgICYmIFZDYXJkVXRpbHMuY29udGFpbnNPbmx5QWxwaGFEaWdpdEh5cGhlbihsYWJlbCkpIHsKLSAgICAgICAgICAgICAgICAgICAgdHlwZUFzU3RyaW5nID0gIlgtIiArIGxhYmVsOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHR5cGVBc1N0cmluZyA9IG51bGw7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2FzZSBFbWFpbC5UWVBFX0hPTUU6IHsKLSAgICAgICAgICAgICAgICB0eXBlQXNTdHJpbmcgPSBWQ2FyZENvbnN0YW50cy5QQVJBTV9UWVBFX0hPTUU7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXNlIEVtYWlsLlRZUEVfV09SSzogewotICAgICAgICAgICAgICAgIHR5cGVBc1N0cmluZyA9IFZDYXJkQ29uc3RhbnRzLlBBUkFNX1RZUEVfV09SSzsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhc2UgRW1haWwuVFlQRV9PVEhFUjogewotICAgICAgICAgICAgICAgIHR5cGVBc1N0cmluZyA9IG51bGw7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXNlIEVtYWlsLlRZUEVfTU9CSUxFOiB7Ci0gICAgICAgICAgICAgICAgdHlwZUFzU3RyaW5nID0gVkNhcmRDb25zdGFudHMuUEFSQU1fVFlQRV9DRUxMOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZGVmYXVsdDogewotICAgICAgICAgICAgICAgIExvZy5lKExPR19UQUcsICJVbmtub3duIEVtYWlsIHR5cGU6ICIgKyB0eXBlKTsKLSAgICAgICAgICAgICAgICB0eXBlQXNTdHJpbmcgPSBudWxsOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgZmluYWwgTGlzdDxTdHJpbmc+IHBhcmFtZXRlckxpc3QgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLSAgICAgICAgaWYgKGlzUHJpbWFyeSkgewotICAgICAgICAgICAgcGFyYW1ldGVyTGlzdC5hZGQoVkNhcmRDb25zdGFudHMuUEFSQU1fVFlQRV9QUkVGKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoIVRleHRVdGlscy5pc0VtcHR5KHR5cGVBc1N0cmluZykpIHsKLSAgICAgICAgICAgIHBhcmFtZXRlckxpc3QuYWRkKHR5cGVBc1N0cmluZyk7Ci0gICAgICAgIH0KLQotICAgICAgICBhcHBlbmRMaW5lV2l0aENoYXJzZXRBbmRRUERldGVjdGlvbihWQ2FyZENvbnN0YW50cy5QUk9QRVJUWV9FTUFJTCwgcGFyYW1ldGVyTGlzdCwKLSAgICAgICAgICAgICAgICByYXdWYWx1ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYXBwZW5kVGVsTGluZShmaW5hbCBJbnRlZ2VyIHR5cGVBc0ludGVnZXIsIGZpbmFsIFN0cmluZyBsYWJlbCwKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyBlbmNvZGVkVmFsdWUsIGJvb2xlYW4gaXNQcmltYXJ5KSB7Ci0gICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ2FyZENvbnN0YW50cy5QUk9QRVJUWV9URUwpOwotICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNBUkRfUEFSQU1fU0VQQVJBVE9SKTsKLQotICAgICAgICBmaW5hbCBpbnQgdHlwZTsKLSAgICAgICAgaWYgKHR5cGVBc0ludGVnZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgdHlwZSA9IFBob25lLlRZUEVfT1RIRVI7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB0eXBlID0gdHlwZUFzSW50ZWdlcjsKLSAgICAgICAgfQotCi0gICAgICAgIEFycmF5TGlzdDxTdHJpbmc+IHBhcmFtZXRlckxpc3QgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLSAgICAgICAgc3dpdGNoICh0eXBlKSB7Ci0gICAgICAgICAgICBjYXNlIFBob25lLlRZUEVfSE9NRTogewotICAgICAgICAgICAgICAgIHBhcmFtZXRlckxpc3QuYWRkQWxsKAotICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlzLmFzTGlzdChWQ2FyZENvbnN0YW50cy5QQVJBTV9UWVBFX0hPTUUpKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhc2UgUGhvbmUuVFlQRV9XT1JLOiB7Ci0gICAgICAgICAgICAgICAgcGFyYW1ldGVyTGlzdC5hZGRBbGwoCi0gICAgICAgICAgICAgICAgICAgICAgICBBcnJheXMuYXNMaXN0KFZDYXJkQ29uc3RhbnRzLlBBUkFNX1RZUEVfV09SSykpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2FzZSBQaG9uZS5UWVBFX0ZBWF9IT01FOiB7Ci0gICAgICAgICAgICAgICAgcGFyYW1ldGVyTGlzdC5hZGRBbGwoCi0gICAgICAgICAgICAgICAgICAgICAgICBBcnJheXMuYXNMaXN0KFZDYXJkQ29uc3RhbnRzLlBBUkFNX1RZUEVfSE9NRSwgVkNhcmRDb25zdGFudHMuUEFSQU1fVFlQRV9GQVgpKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhc2UgUGhvbmUuVFlQRV9GQVhfV09SSzogewotICAgICAgICAgICAgICAgIHBhcmFtZXRlckxpc3QuYWRkQWxsKAotICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlzLmFzTGlzdChWQ2FyZENvbnN0YW50cy5QQVJBTV9UWVBFX1dPUkssIFZDYXJkQ29uc3RhbnRzLlBBUkFNX1RZUEVfRkFYKSk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXNlIFBob25lLlRZUEVfTU9CSUxFOiB7Ci0gICAgICAgICAgICAgICAgcGFyYW1ldGVyTGlzdC5hZGQoVkNhcmRDb25zdGFudHMuUEFSQU1fVFlQRV9DRUxMKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhc2UgUGhvbmUuVFlQRV9QQUdFUjogewotICAgICAgICAgICAgICAgIGlmIChtSXNEb0NvTW8pIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gTm90IHN1cmUgYWJvdXQgdGhlIHJlYXNvbiwgYnV0IHByZXZpb3VzIGltcGxlbWVudGF0aW9uIGhhZAotICAgICAgICAgICAgICAgICAgICAvLyB1c2VkICJWT0lDRSIgaW5zdGVhZCBvZiAiUEFHRVIiCi0gICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlckxpc3QuYWRkKFZDYXJkQ29uc3RhbnRzLlBBUkFNX1RZUEVfVk9JQ0UpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlckxpc3QuYWRkKFZDYXJkQ29uc3RhbnRzLlBBUkFNX1RZUEVfUEFHRVIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhc2UgUGhvbmUuVFlQRV9PVEhFUjogewotICAgICAgICAgICAgICAgIHBhcmFtZXRlckxpc3QuYWRkKFZDYXJkQ29uc3RhbnRzLlBBUkFNX1RZUEVfVk9JQ0UpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2FzZSBQaG9uZS5UWVBFX0NBUjogewotICAgICAgICAgICAgICAgIHBhcmFtZXRlckxpc3QuYWRkKFZDYXJkQ29uc3RhbnRzLlBBUkFNX1RZUEVfQ0FSKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhc2UgUGhvbmUuVFlQRV9DT01QQU5ZX01BSU46IHsKLSAgICAgICAgICAgICAgICAvLyBUaGVyZSdzIG5vIHJlbGV2YW50IGZpZWxkIGluIHZDYXJkIChhdCBsZWFzdCAyLjEpLgotICAgICAgICAgICAgICAgIHBhcmFtZXRlckxpc3QuYWRkKFZDYXJkQ29uc3RhbnRzLlBBUkFNX1RZUEVfV09SSyk7Ci0gICAgICAgICAgICAgICAgaXNQcmltYXJ5ID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhc2UgUGhvbmUuVFlQRV9JU0ROOiB7Ci0gICAgICAgICAgICAgICAgcGFyYW1ldGVyTGlzdC5hZGQoVkNhcmRDb25zdGFudHMuUEFSQU1fVFlQRV9JU0ROKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhc2UgUGhvbmUuVFlQRV9NQUlOOiB7Ci0gICAgICAgICAgICAgICAgaXNQcmltYXJ5ID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhc2UgUGhvbmUuVFlQRV9PVEhFUl9GQVg6IHsKLSAgICAgICAgICAgICAgICBwYXJhbWV0ZXJMaXN0LmFkZChWQ2FyZENvbnN0YW50cy5QQVJBTV9UWVBFX0ZBWCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXNlIFBob25lLlRZUEVfVEVMRVg6IHsKLSAgICAgICAgICAgICAgICBwYXJhbWV0ZXJMaXN0LmFkZChWQ2FyZENvbnN0YW50cy5QQVJBTV9UWVBFX1RMWCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXNlIFBob25lLlRZUEVfV09SS19NT0JJTEU6IHsKLSAgICAgICAgICAgICAgICBwYXJhbWV0ZXJMaXN0LmFkZEFsbCgKLSAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5cy5hc0xpc3QoVkNhcmRDb25zdGFudHMuUEFSQU1fVFlQRV9XT1JLLCBWQ2FyZENvbnN0YW50cy5QQVJBTV9UWVBFX0NFTEwpKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhc2UgUGhvbmUuVFlQRV9XT1JLX1BBR0VSOiB7Ci0gICAgICAgICAgICAgICAgcGFyYW1ldGVyTGlzdC5hZGQoVkNhcmRDb25zdGFudHMuUEFSQU1fVFlQRV9XT1JLKTsKLSAgICAgICAgICAgICAgICAvLyBTZWUgYWJvdmUuCi0gICAgICAgICAgICAgICAgaWYgKG1Jc0RvQ29NbykgewotICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXJMaXN0LmFkZChWQ2FyZENvbnN0YW50cy5QQVJBTV9UWVBFX1ZPSUNFKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXJMaXN0LmFkZChWQ2FyZENvbnN0YW50cy5QQVJBTV9UWVBFX1BBR0VSKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXNlIFBob25lLlRZUEVfTU1TOiB7Ci0gICAgICAgICAgICAgICAgcGFyYW1ldGVyTGlzdC5hZGQoVkNhcmRDb25zdGFudHMuUEFSQU1fVFlQRV9NU0cpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2FzZSBQaG9uZS5UWVBFX0NVU1RPTTogewotICAgICAgICAgICAgICAgIGlmIChUZXh0VXRpbHMuaXNFbXB0eShsYWJlbCkpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gSnVzdCBpZ25vcmUgdGhlIGN1c3RvbSB0eXBlLgotICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXJMaXN0LmFkZChWQ2FyZENvbnN0YW50cy5QQVJBTV9UWVBFX1ZPSUNFKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKFZDYXJkVXRpbHMuaXNNb2JpbGVQaG9uZUxhYmVsKGxhYmVsKSkgewotICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXJMaXN0LmFkZChWQ2FyZENvbnN0YW50cy5QQVJBTV9UWVBFX0NFTEwpOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobUlzVjMwT3JWNDApIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gVGhpcyBsYWJlbCBpcyBhcHByb3ByaWF0ZWx5IGVuY29kZWQgaW4gYXBwZW5kVHlwZVBhcmFtZXRlcnMuCi0gICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlckxpc3QuYWRkKGxhYmVsKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgdXBwZXJMYWJlbCA9IGxhYmVsLnRvVXBwZXJDYXNlKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChWQ2FyZFV0aWxzLmlzVmFsaWRJblYyMUJ1dFVua25vd25Ub0NvbnRhY3RzUGhvdGVUeXBlKHVwcGVyTGFiZWwpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXJMaXN0LmFkZCh1cHBlckxhYmVsKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChWQ2FyZFV0aWxzLmNvbnRhaW5zT25seUFscGhhRGlnaXRIeXBoZW4obGFiZWwpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBOb3RlOiBTdHJpY3RseSwgdkNhcmQgMi4xIGRvZXMgbm90IGFsbG93ICJYLSIgcGFyYW1ldGVyIHdpdGhvdXQKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICAgICJUWVBFPSIgc3RyaW5nLgotICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVyTGlzdC5hZGQoIlgtIiArIGxhYmVsKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhc2UgUGhvbmUuVFlQRV9SQURJTzoKLSAgICAgICAgICAgIGNhc2UgUGhvbmUuVFlQRV9UVFlfVEREOgotICAgICAgICAgICAgZGVmYXVsdDogewotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGlzUHJpbWFyeSkgewotICAgICAgICAgICAgcGFyYW1ldGVyTGlzdC5hZGQoVkNhcmRDb25zdGFudHMuUEFSQU1fVFlQRV9QUkVGKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChwYXJhbWV0ZXJMaXN0LmlzRW1wdHkoKSkgewotICAgICAgICAgICAgYXBwZW5kVW5jb21tb25QaG9uZVR5cGUobUJ1aWxkZXIsIHR5cGUpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgYXBwZW5kVHlwZVBhcmFtZXRlcnMocGFyYW1ldGVyTGlzdCk7Ci0gICAgICAgIH0KLQotICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNBUkRfREFUQV9TRVBBUkFUT1IpOwotICAgICAgICBtQnVpbGRlci5hcHBlbmQoZW5jb2RlZFZhbHVlKTsKLSAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDQVJEX0VORF9PRl9MSU5FKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBcHBlbmRzIHBob25lIHR5cGUgc3RyaW5nIHdoaWNoIG1heSBub3QgYmUgYXZhaWxhYmxlIGluIHNvbWUgZGV2aWNlcy4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgYXBwZW5kVW5jb21tb25QaG9uZVR5cGUoZmluYWwgU3RyaW5nQnVpbGRlciBidWlsZGVyLCBmaW5hbCBJbnRlZ2VyIHR5cGUpIHsKLSAgICAgICAgaWYgKG1Jc0RvQ29NbykgewotICAgICAgICAgICAgLy8gVGhlIHByZXZpb3VzIGltcGxlbWVudGF0aW9uIGZvciBEb0NvTW8gaGFkIGJlZW4gY29uc2VydmF0aXZlCi0gICAgICAgICAgICAvLyBhYm91dCBtaXNjZWxsYW5lb3VzIHR5cGVzLgotICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoVkNhcmRDb25zdGFudHMuUEFSQU1fVFlQRV9WT0lDRSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBTdHJpbmcgcGhvbmVUeXBlID0gVkNhcmRVdGlscy5nZXRQaG9uZVR5cGVTdHJpbmcodHlwZSk7Ci0gICAgICAgICAgICBpZiAocGhvbmVUeXBlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBhcHBlbmRUeXBlUGFyYW1ldGVyKHBob25lVHlwZSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIExvZy5lKExPR19UQUcsICJVbmtub3duIG9yIHVuc3VwcG9ydGVkIChieSB2Q2FyZCkgUGhvbmUgdHlwZTogIiArIHR5cGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIGVuY29kZWRWYWx1ZSBNdXN0IGJlIGVuY29kZWQgYnkgQkFTRTY0IAotICAgICAqIEBwYXJhbSBwaG90b1R5cGUKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBhcHBlbmRQaG90b0xpbmUoZmluYWwgU3RyaW5nIGVuY29kZWRWYWx1ZSwgZmluYWwgU3RyaW5nIHBob3RvVHlwZSkgewotICAgICAgICBTdHJpbmdCdWlsZGVyIHRtcEJ1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotICAgICAgICB0bXBCdWlsZGVyLmFwcGVuZChWQ2FyZENvbnN0YW50cy5QUk9QRVJUWV9QSE9UTyk7Ci0gICAgICAgIHRtcEJ1aWxkZXIuYXBwZW5kKFZDQVJEX1BBUkFNX1NFUEFSQVRPUik7Ci0gICAgICAgIGlmIChtSXNWMzBPclY0MCkgewotICAgICAgICAgICAgdG1wQnVpbGRlci5hcHBlbmQoVkNBUkRfUEFSQU1fRU5DT0RJTkdfQkFTRTY0X0FTX0IpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdG1wQnVpbGRlci5hcHBlbmQoVkNBUkRfUEFSQU1fRU5DT0RJTkdfQkFTRTY0X1YyMSk7Ci0gICAgICAgIH0KLSAgICAgICAgdG1wQnVpbGRlci5hcHBlbmQoVkNBUkRfUEFSQU1fU0VQQVJBVE9SKTsKLSAgICAgICAgYXBwZW5kVHlwZVBhcmFtZXRlcih0bXBCdWlsZGVyLCBwaG90b1R5cGUpOwotICAgICAgICB0bXBCdWlsZGVyLmFwcGVuZChWQ0FSRF9EQVRBX1NFUEFSQVRPUik7Ci0gICAgICAgIHRtcEJ1aWxkZXIuYXBwZW5kKGVuY29kZWRWYWx1ZSk7Ci0KLSAgICAgICAgZmluYWwgU3RyaW5nIHRtcFN0ciA9IHRtcEJ1aWxkZXIudG9TdHJpbmcoKTsKLSAgICAgICAgdG1wQnVpbGRlciA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0gICAgICAgIGludCBsaW5lQ291bnQgPSAwOwotICAgICAgICBmaW5hbCBpbnQgbGVuZ3RoID0gdG1wU3RyLmxlbmd0aCgpOwotICAgICAgICBmaW5hbCBpbnQgbWF4TnVtRm9yRmlyc3RMaW5lID0gVkNhcmRDb25zdGFudHMuTUFYX0NIQVJBQ1RFUl9OVU1TX0JBU0U2NF9WMzAKLSAgICAgICAgICAgICAgICAtIFZDQVJEX0VORF9PRl9MSU5FLmxlbmd0aCgpOwotICAgICAgICBmaW5hbCBpbnQgbWF4TnVtSW5HZW5lcmFsID0gbWF4TnVtRm9yRmlyc3RMaW5lIC0gVkNBUkRfV1MubGVuZ3RoKCk7Ci0gICAgICAgIGludCBtYXhOdW0gPSBtYXhOdW1Gb3JGaXJzdExpbmU7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIHRtcEJ1aWxkZXIuYXBwZW5kKHRtcFN0ci5jaGFyQXQoaSkpOwotICAgICAgICAgICAgbGluZUNvdW50Kys7Ci0gICAgICAgICAgICBpZiAobGluZUNvdW50ID4gbWF4TnVtKSB7Ci0gICAgICAgICAgICAgICAgdG1wQnVpbGRlci5hcHBlbmQoVkNBUkRfRU5EX09GX0xJTkUpOwotICAgICAgICAgICAgICAgIHRtcEJ1aWxkZXIuYXBwZW5kKFZDQVJEX1dTKTsKLSAgICAgICAgICAgICAgICBtYXhOdW0gPSBtYXhOdW1JbkdlbmVyYWw7Ci0gICAgICAgICAgICAgICAgbGluZUNvdW50ID0gMDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBtQnVpbGRlci5hcHBlbmQodG1wQnVpbGRlci50b1N0cmluZygpKTsKLSAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDQVJEX0VORF9PRl9MSU5FKTsKLSAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDQVJEX0VORF9PRl9MSU5FKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBhcHBlbmRBbmRyb2lkU3BlY2lmaWNQcm9wZXJ0eSgKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyBtaW1lVHlwZSwgQ29udGVudFZhbHVlcyBjb250ZW50VmFsdWVzKSB7Ci0gICAgICAgIGlmICghc0FsbG93ZWRBbmRyb2lkUHJvcGVydHlTZXQuY29udGFpbnMobWltZVR5cGUpKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgZmluYWwgTGlzdDxTdHJpbmc+IHJhd1ZhbHVlTGlzdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotICAgICAgICBmb3IgKGludCBpID0gMTsgaSA8PSBWQ2FyZENvbnN0YW50cy5NQVhfREFUQV9DT0xVTU47IGkrKykgewotICAgICAgICAgICAgU3RyaW5nIHZhbHVlID0gY29udGVudFZhbHVlcy5nZXRBc1N0cmluZygiZGF0YSIgKyBpKTsKLSAgICAgICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdmFsdWUgPSAiIjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJhd1ZhbHVlTGlzdC5hZGQodmFsdWUpOwotICAgICAgICB9Ci0KLSAgICAgICAgYm9vbGVhbiBuZWVkQ2hhcnNldCA9Ci0gICAgICAgICAgICAobVNob3VsZEFwcGVuZENoYXJzZXRQYXJhbSAmJgotICAgICAgICAgICAgICAgICAgICAhVkNhcmRVdGlscy5jb250YWluc09ubHlOb25DckxmUHJpbnRhYmxlQXNjaWkocmF3VmFsdWVMaXN0KSk7Ci0gICAgICAgIGJvb2xlYW4gcmVhbGx5VXNlUXVvdGVkUHJpbnRhYmxlID0KLSAgICAgICAgICAgIChtU2hvdWxkVXNlUXVvdGVkUHJpbnRhYmxlICYmCi0gICAgICAgICAgICAgICAgICAgICFWQ2FyZFV0aWxzLmNvbnRhaW5zT25seU5vbkNyTGZQcmludGFibGVBc2NpaShyYXdWYWx1ZUxpc3QpKTsKLSAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDYXJkQ29uc3RhbnRzLlBST1BFUlRZX1hfQU5EUk9JRF9DVVNUT00pOwotICAgICAgICBpZiAobmVlZENoYXJzZXQpIHsKLSAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ0FSRF9QQVJBTV9TRVBBUkFUT1IpOwotICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKG1WQ2FyZENoYXJzZXRQYXJhbWV0ZXIpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChyZWFsbHlVc2VRdW90ZWRQcmludGFibGUpIHsKLSAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ0FSRF9QQVJBTV9TRVBBUkFUT1IpOwotICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDQVJEX1BBUkFNX0VOQ09ESU5HX1FQKTsKLSAgICAgICAgfQotICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNBUkRfREFUQV9TRVBBUkFUT1IpOwotICAgICAgICBtQnVpbGRlci5hcHBlbmQobWltZVR5cGUpOyAgLy8gU2hvdWxkIG5vdCBiZSBlbmNvZGVkLgotICAgICAgICBmb3IgKFN0cmluZyByYXdWYWx1ZSA6IHJhd1ZhbHVlTGlzdCkgewotICAgICAgICAgICAgZmluYWwgU3RyaW5nIGVuY29kZWRWYWx1ZTsKLSAgICAgICAgICAgIGlmIChyZWFsbHlVc2VRdW90ZWRQcmludGFibGUpIHsKLSAgICAgICAgICAgICAgICBlbmNvZGVkVmFsdWUgPSBlbmNvZGVRdW90ZWRQcmludGFibGUocmF3VmFsdWUpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAvLyBUT0RPOiBvbmUgbGluZSBtYXkgYmUgdG9vIGh1Z2UsIHdoaWNoIG1heSBiZSBpbnZhbGlkIGluIHZDYXJkIDMuMAotICAgICAgICAgICAgICAgIC8vICAgICAgICAod2hpY2ggc2F5cyAiV2hlbiBnZW5lcmF0aW5nIGEgY29udGVudCBsaW5lLCBsaW5lcyBsb25nZXIgdGhhbgotICAgICAgICAgICAgICAgIC8vICAgICAgICA3NSBjaGFyYWN0ZXJzIFNIT1VMRCBiZSBmb2xkZWQiKSwgdGhvdWdoIHNldmVyYWwKLSAgICAgICAgICAgICAgICAvLyAgICAgICAgKGV2ZW4gd2VsbC1rbm93bikgYXBwbGljYXRpb25zIGRvIG5vdCBjYXJlIHRoaXMuCi0gICAgICAgICAgICAgICAgZW5jb2RlZFZhbHVlID0gZXNjYXBlQ2hhcmFjdGVycyhyYXdWYWx1ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNBUkRfSVRFTV9TRVBBUkFUT1IpOwotICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKGVuY29kZWRWYWx1ZSk7Ci0gICAgICAgIH0KLSAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDQVJEX0VORF9PRl9MSU5FKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBhcHBlbmRMaW5lV2l0aENoYXJzZXRBbmRRUERldGVjdGlvbihmaW5hbCBTdHJpbmcgcHJvcGVydHlOYW1lLAotICAgICAgICAgICAgZmluYWwgU3RyaW5nIHJhd1ZhbHVlKSB7Ci0gICAgICAgIGFwcGVuZExpbmVXaXRoQ2hhcnNldEFuZFFQRGV0ZWN0aW9uKHByb3BlcnR5TmFtZSwgbnVsbCwgcmF3VmFsdWUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFwcGVuZExpbmVXaXRoQ2hhcnNldEFuZFFQRGV0ZWN0aW9uKAotICAgICAgICAgICAgZmluYWwgU3RyaW5nIHByb3BlcnR5TmFtZSwgZmluYWwgTGlzdDxTdHJpbmc+IHJhd1ZhbHVlTGlzdCkgewotICAgICAgICBhcHBlbmRMaW5lV2l0aENoYXJzZXRBbmRRUERldGVjdGlvbihwcm9wZXJ0eU5hbWUsIG51bGwsIHJhd1ZhbHVlTGlzdCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYXBwZW5kTGluZVdpdGhDaGFyc2V0QW5kUVBEZXRlY3Rpb24oZmluYWwgU3RyaW5nIHByb3BlcnR5TmFtZSwKLSAgICAgICAgICAgIGZpbmFsIExpc3Q8U3RyaW5nPiBwYXJhbWV0ZXJMaXN0LCBmaW5hbCBTdHJpbmcgcmF3VmFsdWUpIHsKLSAgICAgICAgZmluYWwgYm9vbGVhbiBuZWVkQ2hhcnNldCA9Ci0gICAgICAgICAgICAgICAgIVZDYXJkVXRpbHMuY29udGFpbnNPbmx5UHJpbnRhYmxlQXNjaWkocmF3VmFsdWUpOwotICAgICAgICBmaW5hbCBib29sZWFuIHJlYWxseVVzZVF1b3RlZFByaW50YWJsZSA9Ci0gICAgICAgICAgICAgICAgKG1TaG91bGRVc2VRdW90ZWRQcmludGFibGUgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICFWQ2FyZFV0aWxzLmNvbnRhaW5zT25seU5vbkNyTGZQcmludGFibGVBc2NpaShyYXdWYWx1ZSkpOwotICAgICAgICBhcHBlbmRMaW5lKHByb3BlcnR5TmFtZSwgcGFyYW1ldGVyTGlzdCwKLSAgICAgICAgICAgICAgICByYXdWYWx1ZSwgbmVlZENoYXJzZXQsIHJlYWxseVVzZVF1b3RlZFByaW50YWJsZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYXBwZW5kTGluZVdpdGhDaGFyc2V0QW5kUVBEZXRlY3Rpb24oZmluYWwgU3RyaW5nIHByb3BlcnR5TmFtZSwKLSAgICAgICAgICAgIGZpbmFsIExpc3Q8U3RyaW5nPiBwYXJhbWV0ZXJMaXN0LCBmaW5hbCBMaXN0PFN0cmluZz4gcmF3VmFsdWVMaXN0KSB7Ci0gICAgICAgIGJvb2xlYW4gbmVlZENoYXJzZXQgPQotICAgICAgICAgICAgKG1TaG91bGRBcHBlbmRDaGFyc2V0UGFyYW0gJiYKLSAgICAgICAgICAgICAgICAgICAgIVZDYXJkVXRpbHMuY29udGFpbnNPbmx5Tm9uQ3JMZlByaW50YWJsZUFzY2lpKHJhd1ZhbHVlTGlzdCkpOwotICAgICAgICBib29sZWFuIHJlYWxseVVzZVF1b3RlZFByaW50YWJsZSA9Ci0gICAgICAgICAgICAobVNob3VsZFVzZVF1b3RlZFByaW50YWJsZSAmJgotICAgICAgICAgICAgICAgICAgICAhVkNhcmRVdGlscy5jb250YWluc09ubHlOb25DckxmUHJpbnRhYmxlQXNjaWkocmF3VmFsdWVMaXN0KSk7Ci0gICAgICAgIGFwcGVuZExpbmUocHJvcGVydHlOYW1lLCBwYXJhbWV0ZXJMaXN0LCByYXdWYWx1ZUxpc3QsCi0gICAgICAgICAgICAgICAgbmVlZENoYXJzZXQsIHJlYWxseVVzZVF1b3RlZFByaW50YWJsZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQXBwZW5kcyBvbmUgbGluZSB3aXRoIGEgZ2l2ZW4gcHJvcGVydHkgbmFtZSBhbmQgdmFsdWUuICAKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBhcHBlbmRMaW5lKGZpbmFsIFN0cmluZyBwcm9wZXJ0eU5hbWUsIGZpbmFsIFN0cmluZyByYXdWYWx1ZSkgewotICAgICAgICBhcHBlbmRMaW5lKHByb3BlcnR5TmFtZSwgcmF3VmFsdWUsIGZhbHNlLCBmYWxzZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYXBwZW5kTGluZShmaW5hbCBTdHJpbmcgcHJvcGVydHlOYW1lLCBmaW5hbCBMaXN0PFN0cmluZz4gcmF3VmFsdWVMaXN0KSB7Ci0gICAgICAgIGFwcGVuZExpbmUocHJvcGVydHlOYW1lLCByYXdWYWx1ZUxpc3QsIGZhbHNlLCBmYWxzZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYXBwZW5kTGluZShmaW5hbCBTdHJpbmcgcHJvcGVydHlOYW1lLAotICAgICAgICAgICAgZmluYWwgU3RyaW5nIHJhd1ZhbHVlLCBmaW5hbCBib29sZWFuIG5lZWRDaGFyc2V0LAotICAgICAgICAgICAgYm9vbGVhbiByZWFsbHlVc2VRdW90ZWRQcmludGFibGUpIHsKLSAgICAgICAgYXBwZW5kTGluZShwcm9wZXJ0eU5hbWUsIG51bGwsIHJhd1ZhbHVlLCBuZWVkQ2hhcnNldCwgcmVhbGx5VXNlUXVvdGVkUHJpbnRhYmxlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBhcHBlbmRMaW5lKGZpbmFsIFN0cmluZyBwcm9wZXJ0eU5hbWUsIGZpbmFsIExpc3Q8U3RyaW5nPiBwYXJhbWV0ZXJMaXN0LAotICAgICAgICAgICAgZmluYWwgU3RyaW5nIHJhd1ZhbHVlKSB7Ci0gICAgICAgIGFwcGVuZExpbmUocHJvcGVydHlOYW1lLCBwYXJhbWV0ZXJMaXN0LCByYXdWYWx1ZSwgZmFsc2UsIGZhbHNlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBhcHBlbmRMaW5lKGZpbmFsIFN0cmluZyBwcm9wZXJ0eU5hbWUsIGZpbmFsIExpc3Q8U3RyaW5nPiBwYXJhbWV0ZXJMaXN0LAotICAgICAgICAgICAgZmluYWwgU3RyaW5nIHJhd1ZhbHVlLCBmaW5hbCBib29sZWFuIG5lZWRDaGFyc2V0LAotICAgICAgICAgICAgYm9vbGVhbiByZWFsbHlVc2VRdW90ZWRQcmludGFibGUpIHsKLSAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKHByb3BlcnR5TmFtZSk7Ci0gICAgICAgIGlmIChwYXJhbWV0ZXJMaXN0ICE9IG51bGwgJiYgcGFyYW1ldGVyTGlzdC5zaXplKCkgPiAwKSB7Ci0gICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNBUkRfUEFSQU1fU0VQQVJBVE9SKTsKLSAgICAgICAgICAgIGFwcGVuZFR5cGVQYXJhbWV0ZXJzKHBhcmFtZXRlckxpc3QpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChuZWVkQ2hhcnNldCkgewotICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDQVJEX1BBUkFNX1NFUEFSQVRPUik7Ci0gICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQobVZDYXJkQ2hhcnNldFBhcmFtZXRlcik7Ci0gICAgICAgIH0KLQotICAgICAgICBmaW5hbCBTdHJpbmcgZW5jb2RlZFZhbHVlOwotICAgICAgICBpZiAocmVhbGx5VXNlUXVvdGVkUHJpbnRhYmxlKSB7Ci0gICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNBUkRfUEFSQU1fU0VQQVJBVE9SKTsKLSAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ0FSRF9QQVJBTV9FTkNPRElOR19RUCk7Ci0gICAgICAgICAgICBlbmNvZGVkVmFsdWUgPSBlbmNvZGVRdW90ZWRQcmludGFibGUocmF3VmFsdWUpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy8gVE9ETzogb25lIGxpbmUgbWF5IGJlIHRvbyBodWdlLCB3aGljaCBtYXkgYmUgaW52YWxpZCBpbiB2Q2FyZCBzcGVjLCB0aG91Z2gKLSAgICAgICAgICAgIC8vICAgICAgIHNldmVyYWwgKGV2ZW4gd2VsbC1rbm93bikgYXBwbGljYXRpb25zIGRvIG5vdCBjYXJlIHRoYXQgdmlvbGF0aW9uLgotICAgICAgICAgICAgZW5jb2RlZFZhbHVlID0gZXNjYXBlQ2hhcmFjdGVycyhyYXdWYWx1ZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNBUkRfREFUQV9TRVBBUkFUT1IpOwotICAgICAgICBtQnVpbGRlci5hcHBlbmQoZW5jb2RlZFZhbHVlKTsKLSAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDQVJEX0VORF9PRl9MSU5FKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBhcHBlbmRMaW5lKGZpbmFsIFN0cmluZyBwcm9wZXJ0eU5hbWUsIGZpbmFsIExpc3Q8U3RyaW5nPiByYXdWYWx1ZUxpc3QsCi0gICAgICAgICAgICBmaW5hbCBib29sZWFuIG5lZWRDaGFyc2V0LCBib29sZWFuIG5lZWRRdW90ZWRQcmludGFibGUpIHsKLSAgICAgICAgYXBwZW5kTGluZShwcm9wZXJ0eU5hbWUsIG51bGwsIHJhd1ZhbHVlTGlzdCwgbmVlZENoYXJzZXQsIG5lZWRRdW90ZWRQcmludGFibGUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFwcGVuZExpbmUoZmluYWwgU3RyaW5nIHByb3BlcnR5TmFtZSwgZmluYWwgTGlzdDxTdHJpbmc+IHBhcmFtZXRlckxpc3QsCi0gICAgICAgICAgICBmaW5hbCBMaXN0PFN0cmluZz4gcmF3VmFsdWVMaXN0LCBmaW5hbCBib29sZWFuIG5lZWRDaGFyc2V0LAotICAgICAgICAgICAgZmluYWwgYm9vbGVhbiBuZWVkUXVvdGVkUHJpbnRhYmxlKSB7Ci0gICAgICAgIG1CdWlsZGVyLmFwcGVuZChwcm9wZXJ0eU5hbWUpOwotICAgICAgICBpZiAocGFyYW1ldGVyTGlzdCAhPSBudWxsICYmIHBhcmFtZXRlckxpc3Quc2l6ZSgpID4gMCkgewotICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDQVJEX1BBUkFNX1NFUEFSQVRPUik7Ci0gICAgICAgICAgICBhcHBlbmRUeXBlUGFyYW1ldGVycyhwYXJhbWV0ZXJMaXN0KTsKLSAgICAgICAgfQotICAgICAgICBpZiAobmVlZENoYXJzZXQpIHsKLSAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ0FSRF9QQVJBTV9TRVBBUkFUT1IpOwotICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKG1WQ2FyZENoYXJzZXRQYXJhbWV0ZXIpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChuZWVkUXVvdGVkUHJpbnRhYmxlKSB7Ci0gICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNBUkRfUEFSQU1fU0VQQVJBVE9SKTsKLSAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ0FSRF9QQVJBTV9FTkNPRElOR19RUCk7Ci0gICAgICAgIH0KLQotICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNBUkRfREFUQV9TRVBBUkFUT1IpOwotICAgICAgICBib29sZWFuIGZpcnN0ID0gdHJ1ZTsKLSAgICAgICAgZm9yIChTdHJpbmcgcmF3VmFsdWUgOiByYXdWYWx1ZUxpc3QpIHsKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyBlbmNvZGVkVmFsdWU7Ci0gICAgICAgICAgICBpZiAobmVlZFF1b3RlZFByaW50YWJsZSkgewotICAgICAgICAgICAgICAgIGVuY29kZWRWYWx1ZSA9IGVuY29kZVF1b3RlZFByaW50YWJsZShyYXdWYWx1ZSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIC8vIFRPRE86IG9uZSBsaW5lIG1heSBiZSB0b28gaHVnZSwgd2hpY2ggbWF5IGJlIGludmFsaWQgaW4gdkNhcmQgMy4wCi0gICAgICAgICAgICAgICAgLy8gICAgICAgICh3aGljaCBzYXlzICJXaGVuIGdlbmVyYXRpbmcgYSBjb250ZW50IGxpbmUsIGxpbmVzIGxvbmdlciB0aGFuCi0gICAgICAgICAgICAgICAgLy8gICAgICAgIDc1IGNoYXJhY3RlcnMgU0hPVUxEIGJlIGZvbGRlZCIpLCB0aG91Z2ggc2V2ZXJhbAotICAgICAgICAgICAgICAgIC8vICAgICAgICAoZXZlbiB3ZWxsLWtub3duKSBhcHBsaWNhdGlvbnMgZG8gbm90IGNhcmUgdGhpcy4KLSAgICAgICAgICAgICAgICBlbmNvZGVkVmFsdWUgPSBlc2NhcGVDaGFyYWN0ZXJzKHJhd1ZhbHVlKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKGZpcnN0KSB7Ci0gICAgICAgICAgICAgICAgZmlyc3QgPSBmYWxzZTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDQVJEX0lURU1fU0VQQVJBVE9SKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChlbmNvZGVkVmFsdWUpOwotICAgICAgICB9Ci0gICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ0FSRF9FTkRfT0ZfTElORSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVkNBUkRfUEFSQU1fU0VQQVJBVE9SIG11c3QgYmUgYXBwZW5kZWQgYmVmb3JlIHRoaXMgbWV0aG9kIGJlaW5nIGNhbGxlZC4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgYXBwZW5kVHlwZVBhcmFtZXRlcnMoZmluYWwgTGlzdDxTdHJpbmc+IHR5cGVzKSB7Ci0gICAgICAgIC8vIFdlIG1heSBoYXZlIHRvIG1ha2UgdGhpcyBjb21tYSBzZXBhcmF0ZWQgZm9ybSBsaWtlICJUWVBFPURPTSxXT1JLIiBpbiB0aGUgZnV0dXJlLAotICAgICAgICAvLyB3aGljaCB3b3VsZCBiZSByZWNvbW1lbmRlZCB3YXkgaW4gdmNhcmQgMy4wIHRob3VnaCBub3QgdmFsaWQgaW4gdkNhcmQgMi4xLgotICAgICAgICBib29sZWFuIGZpcnN0ID0gdHJ1ZTsKLSAgICAgICAgZm9yIChmaW5hbCBTdHJpbmcgdHlwZVZhbHVlIDogdHlwZXMpIHsKLSAgICAgICAgICAgIGlmIChWQ2FyZENvbmZpZy5pc1ZlcnNpb24zMChtVkNhcmRUeXBlKSkgewotICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBlbmNvZGVkID0gVkNhcmRVdGlscy50b1N0cmluZ0FzVjMwUGFyYW1WYWx1ZSh0eXBlVmFsdWUpOwotICAgICAgICAgICAgICAgIGlmIChUZXh0VXRpbHMuaXNFbXB0eShlbmNvZGVkKSkgewotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvLyBOb3RlOiB2Q2FyZCAzLjAgc3BlY2lmaWVzIHRoZSBkaWZmZXJlbnQgdHlwZSBvZiBhY2NlcHRhYmxlIHR5cGUgU3RyaW5ncywgYnV0Ci0gICAgICAgICAgICAgICAgLy8gICAgICAgd2UgZG9uJ3QgZW1pdCB0aGF0IGtpbmQgb2YgdkNhcmQgMy4wIHNwZWNpZmljIHR5cGUgc2luY2UgdGhlcmUgc2hvdWxkIGJlCi0gICAgICAgICAgICAgICAgLy8gICAgICAgaGlnaCBwcm9iYWJpbHl0eSBpbiB3aGljaCBleHRlcm5hbCBpbXBvcnRlcnMgY2Fubm90IHVuZGVyc3RhbmQgdGhlbS4KLSAgICAgICAgICAgICAgICAvLwotICAgICAgICAgICAgICAgIC8vIGUuZy4gVFlQRT0iXHU1NzhCXHUzMDZCXHUzMDg3IiAodkNhcmQgMy4wIGFsbG93cyBub24tQXNjaWkgY2hhcmFjdGVycyBpZiB0aGV5Ci0gICAgICAgICAgICAgICAgLy8gICAgICBhcmUgcXVvdGVkLikKLSAgICAgICAgICAgICAgICBpZiAoZmlyc3QpIHsKLSAgICAgICAgICAgICAgICAgICAgZmlyc3QgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNBUkRfUEFSQU1fU0VQQVJBVE9SKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYXBwZW5kVHlwZVBhcmFtZXRlcihlbmNvZGVkKTsKLSAgICAgICAgICAgIH0gZWxzZSB7ICAvLyB2Q2FyZCAyLjEKLSAgICAgICAgICAgICAgICBpZiAoIVZDYXJkVXRpbHMuaXNWMjFXb3JkKHR5cGVWYWx1ZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChmaXJzdCkgewotICAgICAgICAgICAgICAgICAgICBmaXJzdCA9IGZhbHNlOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ0FSRF9QQVJBTV9TRVBBUkFUT1IpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBhcHBlbmRUeXBlUGFyYW1ldGVyKHR5cGVWYWx1ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBWQ0FSRF9QQVJBTV9TRVBBUkFUT1IgbXVzdCBiZSBhcHBlbmRlZCBiZWZvcmUgdGhpcyBtZXRob2QgYmVpbmcgY2FsbGVkLgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBhcHBlbmRUeXBlUGFyYW1ldGVyKGZpbmFsIFN0cmluZyB0eXBlKSB7Ci0gICAgICAgIGFwcGVuZFR5cGVQYXJhbWV0ZXIobUJ1aWxkZXIsIHR5cGUpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBhcHBlbmRUeXBlUGFyYW1ldGVyKGZpbmFsIFN0cmluZ0J1aWxkZXIgYnVpbGRlciwgZmluYWwgU3RyaW5nIHR5cGUpIHsKLSAgICAgICAgLy8gUmVmcmFpbiBmcm9tIHVzaW5nIGFwcGVuZFR5cGUoKSBzbyB0aGF0ICJUWVBFPSIgaXMgbm90IGJlIGFwcGVuZGVkIHdoZW4gdGhlCi0gICAgICAgIC8vIGRldmljZSBpcyBEb0NvTW8ncyAoanVzdCBmb3Igc2FmZXR5KS4KLSAgICAgICAgLy8KLSAgICAgICAgLy8gTm90ZTogSW4gdkNhcmQgMy4wLCBUeXBlIHN0cmluZ3MgYWxzbyBjYW4gYmUgbGlrZSB0aGlzOiAiVFlQRT1IT01FLFBSRUYiCi0gICAgICAgIGlmIChWQ2FyZENvbmZpZy5pc1ZlcnNpb240MChtVkNhcmRUeXBlKSB8fAotICAgICAgICAgICAgICAgICgoVkNhcmRDb25maWcuaXNWZXJzaW9uMzAobVZDYXJkVHlwZSkgfHwgbUFwcGVuZFR5cGVQYXJhbU5hbWUpICYmICFtSXNEb0NvTW8pKSB7Ci0gICAgICAgICAgICBidWlsZGVyLmFwcGVuZChWQ2FyZENvbnN0YW50cy5QQVJBTV9UWVBFKS5hcHBlbmQoVkNBUkRfUEFSQU1fRVFVQUwpOwotICAgICAgICB9Ci0gICAgICAgIGJ1aWxkZXIuYXBwZW5kKHR5cGUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdHJ1ZSB3aGVuIHRoZSBwcm9wZXJ0eSBsaW5lIHNob3VsZCBjb250YWluIGNoYXJzZXQgcGFyYW1ldGVyCi0gICAgICogaW5mb3JtYXRpb24uIFRoaXMgbWV0aG9kIG1heSByZXR1cm4gdHJ1ZSBldmVuIHdoZW4gdkNhcmQgdmVyc2lvbiBpcyAzLjAuCi0gICAgICoKLSAgICAgKiBTdHJpY3RseSwgYWRkaW5nIGNoYXJzZXQgaW5mb3JtYXRpb24gaXMgaW52YWxpZCBpbiBWQ2FyZCAzLjAuCi0gICAgICogSG93ZXZlciB3ZSdsbCBhZGQgdGhlIGluZm8gb25seSB3aGVuIGNoYXJzZXQgd2UgdXNlIGlzIG5vdCBVVEYtOAotICAgICAqIGluIHZDYXJkIDMuMCBmb3JtYXQsIHNpbmNlIHBhcnNlciBzaWRlIG1heSBiZSBhYmxlIHRvIHVzZSB0aGUgY2hhcnNldAotICAgICAqIHZpYSB0aGlzIGZpZWxkLCB0aG91Z2ggd2UgbWF5IGVuY291bnRlciBhbm90aGVyIHByb2JsZW0gYnkgYWRkaW5nIGl0LgotICAgICAqCi0gICAgICogZS5nLiBKYXBhbmVzZSBtb2JpbGUgcGhvbmVzIHVzZSBTaGlmdF9KaXMgd2hpbGUgUkZDIDI0MjYKLSAgICAgKiByZWNvbW1lbmRzIFVURi04LiBCeSBhZGRpbmcgdGhpcyBmaWVsZCwgcGFyc2VycyBtYXkgYmUgYWJsZQotICAgICAqIHRvIGtub3cgdGhpcyB0ZXh0IGlzIE5PVCBVVEYtOCBidXQgU2hpZnRfSmlzLgotICAgICAqLwotICAgIHByaXZhdGUgYm9vbGVhbiBzaG91bGRBcHBlbmRDaGFyc2V0UGFyYW0oU3RyaW5nLi4ucHJvcGVydHlWYWx1ZUxpc3QpIHsKLSAgICAgICAgaWYgKCFtU2hvdWxkQXBwZW5kQ2hhcnNldFBhcmFtKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgZm9yIChTdHJpbmcgcHJvcGVydHlWYWx1ZSA6IHByb3BlcnR5VmFsdWVMaXN0KSB7Ci0gICAgICAgICAgICBpZiAoIVZDYXJkVXRpbHMuY29udGFpbnNPbmx5UHJpbnRhYmxlQXNjaWkocHJvcGVydHlWYWx1ZSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBTdHJpbmcgZW5jb2RlUXVvdGVkUHJpbnRhYmxlKGZpbmFsIFN0cmluZyBzdHIpIHsKLSAgICAgICAgaWYgKFRleHRVdGlscy5pc0VtcHR5KHN0cikpIHsKLSAgICAgICAgICAgIHJldHVybiAiIjsKLSAgICAgICAgfQotCi0gICAgICAgIGZpbmFsIFN0cmluZ0J1aWxkZXIgYnVpbGRlciA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0gICAgICAgIGludCBpbmRleCA9IDA7Ci0gICAgICAgIGludCBsaW5lQ291bnQgPSAwOwotICAgICAgICBieXRlW10gc3RyQXJyYXkgPSBudWxsOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBzdHJBcnJheSA9IHN0ci5nZXRCeXRlcyhtQ2hhcnNldCk7Ci0gICAgICAgIH0gY2F0Y2ggKFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgTG9nLmUoTE9HX1RBRywgIkNoYXJzZXQgIiArIG1DaGFyc2V0ICsgIiBjYW5ub3QgYmUgdXNlZC4gIgotICAgICAgICAgICAgICAgICAgICArICJUcnkgZGVmYXVsdCBjaGFyc2V0Iik7Ci0gICAgICAgICAgICBzdHJBcnJheSA9IHN0ci5nZXRCeXRlcygpOwotICAgICAgICB9Ci0gICAgICAgIHdoaWxlIChpbmRleCA8IHN0ckFycmF5Lmxlbmd0aCkgewotICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoU3RyaW5nLmZvcm1hdCgiPSUwMlgiLCBzdHJBcnJheVtpbmRleF0pKTsKLSAgICAgICAgICAgIGluZGV4ICs9IDE7Ci0gICAgICAgICAgICBsaW5lQ291bnQgKz0gMzsKLQotICAgICAgICAgICAgaWYgKGxpbmVDb3VudCA+PSA2NykgewotICAgICAgICAgICAgICAgIC8vIFNwZWNpZmljYXRpb24gcmVxdWlyZXMgQ1JMRiBtdXN0IGJlIGluc2VydGVkIGJlZm9yZSB0aGUKLSAgICAgICAgICAgICAgICAvLyBsZW5ndGggb2YgdGhlIGxpbmUKLSAgICAgICAgICAgICAgICAvLyBiZWNvbWVzIG1vcmUgdGhhbiA3Ni4KLSAgICAgICAgICAgICAgICAvLyBBc3N1bWluZyB0aGF0IHRoZSBuZXh0IGNoYXJhY3RlciBpcyBhIG11bHRpLWJ5dGUgY2hhcmFjdGVyLAotICAgICAgICAgICAgICAgIC8vIGl0IHdpbGwgYmVjb21lCi0gICAgICAgICAgICAgICAgLy8gNiBieXRlcy4KLSAgICAgICAgICAgICAgICAvLyA3NiAtIDYgLSAzID0gNjcKLSAgICAgICAgICAgICAgICBidWlsZGVyLmFwcGVuZCgiPVxyXG4iKTsKLSAgICAgICAgICAgICAgICBsaW5lQ291bnQgPSAwOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGJ1aWxkZXIudG9TdHJpbmcoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBcHBlbmQgJ1wnIHRvIHRoZSBjaGFyYWN0ZXJzIHdoaWNoIHNob3VsZCBiZSBlc2NhcGVkLiBUaGUgY2hhcmFjdGVyIHNldCBpcyBkaWZmZXJlbnQKLSAgICAgKiBub3Qgb25seSBiZXR3ZWVuIHZDYXJkIDIuMSBhbmQgdkNhcmQgMy4wIGJ1dCBhbHNvIGFtb25nIGVhY2ggZGV2aWNlLgotICAgICAqCi0gICAgICogTm90ZSB0aGF0IFF1b3RlZC1QcmludGFibGUgc3RyaW5nIG11c3Qgbm90IGJlIGlucHV0IGhlcmUuCi0gICAgICovCi0gICAgQFN1cHByZXNzV2FybmluZ3MoImZhbGx0aHJvdWdoIikKLSAgICBwcml2YXRlIFN0cmluZyBlc2NhcGVDaGFyYWN0ZXJzKGZpbmFsIFN0cmluZyB1bmVzY2FwZWQpIHsKLSAgICAgICAgaWYgKFRleHRVdGlscy5pc0VtcHR5KHVuZXNjYXBlZCkpIHsKLSAgICAgICAgICAgIHJldHVybiAiIjsKLSAgICAgICAgfQotCi0gICAgICAgIGZpbmFsIFN0cmluZ0J1aWxkZXIgdG1wQnVpbGRlciA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0gICAgICAgIGZpbmFsIGludCBsZW5ndGggPSB1bmVzY2FwZWQubGVuZ3RoKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIGZpbmFsIGNoYXIgY2ggPSB1bmVzY2FwZWQuY2hhckF0KGkpOwotICAgICAgICAgICAgc3dpdGNoIChjaCkgewotICAgICAgICAgICAgICAgIGNhc2UgJzsnOiB7Ci0gICAgICAgICAgICAgICAgICAgIHRtcEJ1aWxkZXIuYXBwZW5kKCdcXCcpOwotICAgICAgICAgICAgICAgICAgICB0bXBCdWlsZGVyLmFwcGVuZCgnOycpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY2FzZSAnXHInOiB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChpICsgMSA8IGxlbmd0aCkgewotICAgICAgICAgICAgICAgICAgICAgICAgY2hhciBuZXh0Q2hhciA9IHVuZXNjYXBlZC5jaGFyQXQoaSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobmV4dENoYXIgPT0gJ1xuJykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBmYWxsIHRocm91Z2gKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZhbGwgdGhyb3VnaAotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNhc2UgJ1xuJzogewotICAgICAgICAgICAgICAgICAgICAvLyBJbiB2Q2FyZCAyLjEsIHRoZXJlJ3Mgbm8gc3BlY2lmaWNhdGlvbiBhYm91dCB0aGlzLCB3aGlsZQotICAgICAgICAgICAgICAgICAgICAvLyB2Q2FyZCAzLjAgZXhwbGljaXRseSByZXF1aXJlcyB0aGlzIHNob3VsZCBiZSBlbmNvZGVkIHRvICJcbiIuCi0gICAgICAgICAgICAgICAgICAgIHRtcEJ1aWxkZXIuYXBwZW5kKCJcXG4iKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNhc2UgJ1xcJzogewotICAgICAgICAgICAgICAgICAgICBpZiAobUlzVjMwT3JWNDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRtcEJ1aWxkZXIuYXBwZW5kKCJcXFxcIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZhbGwgdGhyb3VnaAotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNhc2UgJzwnOgotICAgICAgICAgICAgICAgIGNhc2UgJz4nOiB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtSXNEb0NvTW8pIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRtcEJ1aWxkZXIuYXBwZW5kKCdcXCcpOwotICAgICAgICAgICAgICAgICAgICAgICAgdG1wQnVpbGRlci5hcHBlbmQoY2gpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgdG1wQnVpbGRlci5hcHBlbmQoY2gpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjYXNlICcsJzogewotICAgICAgICAgICAgICAgICAgICBpZiAobUlzVjMwT3JWNDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRtcEJ1aWxkZXIuYXBwZW5kKCJcXCwiKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRtcEJ1aWxkZXIuYXBwZW5kKGNoKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogewotICAgICAgICAgICAgICAgICAgICB0bXBCdWlsZGVyLmFwcGVuZChjaCk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdG1wQnVpbGRlci50b1N0cmluZygpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgICAgIGlmICghbUVuZEFwcGVuZGVkKSB7Ci0gICAgICAgICAgICBpZiAobUlzRG9Db01vKSB7Ci0gICAgICAgICAgICAgICAgYXBwZW5kTGluZShWQ2FyZENvbnN0YW50cy5QUk9QRVJUWV9YX0NMQVNTLCBWQ0FSRF9EQVRBX1BVQkxJQyk7Ci0gICAgICAgICAgICAgICAgYXBwZW5kTGluZShWQ2FyZENvbnN0YW50cy5QUk9QRVJUWV9YX1JFRFVDVElPTiwgIiIpOwotICAgICAgICAgICAgICAgIGFwcGVuZExpbmUoVkNhcmRDb25zdGFudHMuUFJPUEVSVFlfWF9OTywgIiIpOwotICAgICAgICAgICAgICAgIGFwcGVuZExpbmUoVkNhcmRDb25zdGFudHMuUFJPUEVSVFlfWF9EQ01fSE1OX01PREUsICIiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGFwcGVuZExpbmUoVkNhcmRDb25zdGFudHMuUFJPUEVSVFlfRU5ELCBWQ0FSRF9EQVRBX1ZDQVJEKTsKLSAgICAgICAgICAgIG1FbmRBcHBlbmRlZCA9IHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG1CdWlsZGVyLnRvU3RyaW5nKCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvcGltL3ZjYXJkL1ZDYXJkQ29tcG9zZXIuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3BpbS92Y2FyZC9WQ2FyZENvbXBvc2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE5M2NmMWUuLjAwMDAwMDAKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvcGltL3ZjYXJkL1ZDYXJkQ29tcG9zZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY3OCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QKLSAqIHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCi0gKiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQKLSAqIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZQotICogTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIKLSAqIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIGFuZHJvaWQucGltLnZjYXJkOwotCi1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRSZXNvbHZlcjsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFZhbHVlczsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuRW50aXR5OwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5FbnRpdHkuTmFtZWRDb250ZW50VmFsdWVzOwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5FbnRpdHlJdGVyYXRvcjsKLWltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLkN1cnNvcjsKLWltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZS5TUUxpdGVFeGNlcHRpb247Ci1pbXBvcnQgYW5kcm9pZC5uZXQuVXJpOwotaW1wb3J0IGFuZHJvaWQucGltLnZjYXJkLmV4Y2VwdGlvbi5WQ2FyZEV4Y2VwdGlvbjsKLWltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuQ29tbW9uRGF0YUtpbmRzLkVtYWlsOwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5Db21tb25EYXRhS2luZHMuRXZlbnQ7Ci1pbXBvcnQgYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0LkNvbW1vbkRhdGFLaW5kcy5JbTsKLWltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuQ29tbW9uRGF0YUtpbmRzLk5pY2tuYW1lOwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5Db21tb25EYXRhS2luZHMuTm90ZTsKLWltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuQ29tbW9uRGF0YUtpbmRzLk9yZ2FuaXphdGlvbjsKLWltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuQ29tbW9uRGF0YUtpbmRzLlBob25lOwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5Db21tb25EYXRhS2luZHMuUGhvdG87Ci1pbXBvcnQgYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0LkNvbW1vbkRhdGFLaW5kcy5SZWxhdGlvbjsKLWltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuQ29tbW9uRGF0YUtpbmRzLlN0cnVjdHVyZWROYW1lOwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5Db21tb25EYXRhS2luZHMuU3RydWN0dXJlZFBvc3RhbDsKLWltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuQ29tbW9uRGF0YUtpbmRzLldlYnNpdGU7Ci1pbXBvcnQgYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0LkNvbnRhY3RzOwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5EYXRhOwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5SYXdDb250YWN0czsKLWltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuUmF3Q29udGFjdHNFbnRpdHk7Ci1pbXBvcnQgYW5kcm9pZC50ZXh0LlRleHRVdGlsczsKLWltcG9ydCBhbmRyb2lkLnV0aWwuQ2hhcnNldFV0aWxzOwotaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7Ci0KLWltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkV3JpdGVyOwotaW1wb3J0IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtV3JpdGVyOwotaW1wb3J0IGphdmEuaW8uVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLldyaXRlcjsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKLWltcG9ydCBqYXZhLm5pby5jaGFyc2V0LlVuc3VwcG9ydGVkQ2hhcnNldEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLS8qKgotICogPHA+Ci0gKiBUaGUgY2xhc3MgZm9yIGNvbXBvc2luZyB2Q2FyZCBmcm9tIENvbnRhY3RzIGluZm9ybWF0aW9uLgotICogPC9wPgotICogPHA+Ci0gKiBVc3VhbGx5LCB0aGlzIGNsYXNzIHNob3VsZCBiZSB1c2VkIGxpa2UgdGhpcy4KLSAqIDwvcD4KLSAqIDxwcmUgY2xhc3M9InByZXR0eXByaW50Ij5WQ2FyZENvbXBvc2VyIGNvbXBvc2VyID0gbnVsbDsKLSAqIHRyeSB7Ci0gKiAgICAgY29tcG9zZXIgPSBuZXcgVkNhcmRDb21wb3Nlcihjb250ZXh0KTsKLSAqICAgICBjb21wb3Nlci5hZGRIYW5kbGVyKAotICogICAgICAgICAgICAgY29tcG9zZXIubmV3IEhhbmRsZXJGb3JPdXRwdXRTdHJlYW0ob3V0cHV0U3RyZWFtKSk7Ci0gKiAgICAgaWYgKCFjb21wb3Nlci5pbml0KCkpIHsKLSAqICAgICAgICAgLy8gRG8gc29tZXRoaW5nIGhhbmRsaW5nIHRoZSBzaXR1YXRpb24uCi0gKiAgICAgICAgIHJldHVybjsKLSAqICAgICB9Ci0gKiAgICAgd2hpbGUgKCFjb21wb3Nlci5pc0FmdGVyTGFzdCgpKSB7Ci0gKiAgICAgICAgIGlmIChtQ2FuY2VsZWQpIHsKLSAqICAgICAgICAgICAgIC8vIEFzc3VtZSBhIHVzZXIgbWF5IGNhbmNlbCB0aGlzIG9wZXJhdGlvbiBkdXJpbmcgdGhlIGV4cG9ydC4KLSAqICAgICAgICAgICAgIHJldHVybjsKLSAqICAgICAgICAgfQotICogICAgICAgICBpZiAoIWNvbXBvc2VyLmNyZWF0ZU9uZUVudHJ5KCkpIHsKLSAqICAgICAgICAgICAgIC8vIERvIHNvbWV0aGluZyBoYW5kbGluZyB0aGUgZXJyb3Igc2l0dWF0aW9uLgotICogICAgICAgICAgICAgcmV0dXJuOwotICogICAgICAgICB9Ci0gKiAgICAgfQotICogfSBmaW5hbGx5IHsKLSAqICAgICBpZiAoY29tcG9zZXIgIT0gbnVsbCkgewotICogICAgICAgICBjb21wb3Nlci50ZXJtaW5hdGUoKTsKLSAqICAgICB9Ci0gKiB9PC9wcmU+Ci0gKiA8cD4KLSAqIFVzZXJzIGhhdmUgdG8gbWFudWFsbHkgdGFrZSBjYXJlIG9mIG1lbW9yeSBlZmZpY2llbmN5LiBFdmVuIG9uZSB2Q2FyZCBtYXkgY29udGFpbgotICogaW1hZ2Ugb2Ygbm9uLXRyaXZpYWwgc2l6ZSBmb3IgbW9iaWxlIGRldmljZXMuCi0gKiA8L3A+Ci0gKiA8cD4KLSAqIHtAbGluayBWQ2FyZEJ1aWxkZXJ9IGlzIHVzZWQgdG8gYnVpbGQgZWFjaCB2Q2FyZC4KLSAqIDwvcD4KLSAqLwotcHVibGljIGNsYXNzIFZDYXJkQ29tcG9zZXIgewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMT0dfVEFHID0gIlZDYXJkQ29tcG9zZXIiOwotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkFJTFVSRV9SRUFTT05fRkFJTEVEX1RPX0dFVF9EQVRBQkFTRV9JTkZPID0KLSAgICAgICAgIkZhaWxlZCB0byBnZXQgZGF0YWJhc2UgaW5mb3JtYXRpb24iOwotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkFJTFVSRV9SRUFTT05fTk9fRU5UUlkgPQotICAgICAgICAiVGhlcmUncyBubyBleHBvcnRhYmxlIGluIHRoZSBkYXRhYmFzZSI7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGQUlMVVJFX1JFQVNPTl9OT1RfSU5JVElBTElaRUQgPQotICAgICAgICAiVGhlIHZDYXJkIGNvbXBvc2VyIG9iamVjdCBpcyBub3QgY29ycmVjdGx5IGluaXRpYWxpemVkIjsKLQotICAgIC8qKiBTaG91bGQgYmUgdmlzaWJsZSBvbmx5IGZyb20gZGV2ZWxvcGVycy4uLiAobm8gbmVlZCB0byB0cmFuc2xhdGUsIGhvcGVmdWxseSkgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGQUlMVVJFX1JFQVNPTl9VTlNVUFBPUlRFRF9VUkkgPQotICAgICAgICAiVGhlIFVyaSB2Q2FyZCBjb21wb3NlciByZWNlaXZlZCBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoZSBjb21wb3Nlci4iOwotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTk9fRVJST1IgPSAiTm8gZXJyb3IiOwotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkNBUkRfVFlQRV9TVFJJTkdfRE9DT01PID0gImRvY29tbyI7Ci0KLSAgICAvLyBTdHJpY3RseSBzcGVha2luZywgIlNoaWZ0X0pJUyIgaXMgdGhlIG1vc3QgYXBwcm9wcmlhdGUsIGJ1dCB3ZSB1c2UgdXBwZXIgdmVyc2lvbiBoZXJlLAotICAgIC8vIHNpbmNlIHVzdWFsIHZDYXJkIGRldmljZXMgZm9yIEphcGFuZXNlIGRldmljZXMgYWxyZWFkeSB1c2UgaXQuCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNISUZUX0pJUyA9ICJTSElGVF9KSVMiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBVVEZfOCA9ICJVVEYtOCI7Ci0KLSAgICAvKioKLSAgICAgKiBTcGVjaWFsIFVSSSBmb3IgdGVzdGluZy4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWQ0FSRF9URVNUX0FVVEhPUklUWSA9ICJjb20uYW5kcm9pZC51bml0X3Rlc3RzLnZjYXJkIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFVyaSBWQ0FSRF9URVNUX0FVVEhPUklUWV9VUkkgPQotICAgICAgICBVcmkucGFyc2UoImNvbnRlbnQ6Ly8iICsgVkNBUkRfVEVTVF9BVVRIT1JJVFkpOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgVXJpIENPTlRBQ1RTX1RFU1RfQ09OVEVOVF9VUkkgPQotICAgICAgICBVcmkud2l0aEFwcGVuZGVkUGF0aChWQ0FSRF9URVNUX0FVVEhPUklUWV9VUkksICJjb250YWN0cyIpOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTWFwPEludGVnZXIsIFN0cmluZz4gc0ltTWFwOwotCi0gICAgc3RhdGljIHsKLSAgICAgICAgc0ltTWFwID0gbmV3IEhhc2hNYXA8SW50ZWdlciwgU3RyaW5nPigpOwotICAgICAgICBzSW1NYXAucHV0KEltLlBST1RPQ09MX0FJTSwgVkNhcmRDb25zdGFudHMuUFJPUEVSVFlfWF9BSU0pOwotICAgICAgICBzSW1NYXAucHV0KEltLlBST1RPQ09MX01TTiwgVkNhcmRDb25zdGFudHMuUFJPUEVSVFlfWF9NU04pOwotICAgICAgICBzSW1NYXAucHV0KEltLlBST1RPQ09MX1lBSE9PLCBWQ2FyZENvbnN0YW50cy5QUk9QRVJUWV9YX1lBSE9PKTsKLSAgICAgICAgc0ltTWFwLnB1dChJbS5QUk9UT0NPTF9JQ1EsIFZDYXJkQ29uc3RhbnRzLlBST1BFUlRZX1hfSUNRKTsKLSAgICAgICAgc0ltTWFwLnB1dChJbS5QUk9UT0NPTF9KQUJCRVIsIFZDYXJkQ29uc3RhbnRzLlBST1BFUlRZX1hfSkFCQkVSKTsKLSAgICAgICAgc0ltTWFwLnB1dChJbS5QUk9UT0NPTF9TS1lQRSwgVkNhcmRDb25zdGFudHMuUFJPUEVSVFlfWF9TS1lQRV9VU0VSTkFNRSk7Ci0gICAgICAgIC8vIFdlIGRvbid0IGFkZCBHb29nbGUgdGFsayBoZXJlIHNpbmNlIGl0IGhhcyB0byBiZSBoYW5kbGVkIHNlcGFyYXRlbHkuCi0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBpbnRlcmZhY2UgT25lRW50cnlIYW5kbGVyIHsKLSAgICAgICAgcHVibGljIGJvb2xlYW4gb25Jbml0KENvbnRleHQgY29udGV4dCk7Ci0gICAgICAgIHB1YmxpYyBib29sZWFuIG9uRW50cnlDcmVhdGVkKFN0cmluZyB2Y2FyZCk7Ci0gICAgICAgIHB1YmxpYyB2b2lkIG9uVGVybWluYXRlKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPHA+Ci0gICAgICogQW4gdXNlZnVsIGhhbmRsZXIgZm9yIGVtaXR0aW5nIHZDYXJkIFN0cmluZyB0byBhbiBPdXRwdXRTdHJlYW0gb2JqZWN0IG9uZSBieSBvbmUuCi0gICAgICogPC9wPgotICAgICAqIDxwPgotICAgICAqIFRoZSBpbnB1dCBPdXRwdXRTdHJlYW0gb2JqZWN0IGlzIGNsb3NlZCgpIG9uIHtAbGluayAjb25UZXJtaW5hdGUoKX0uCi0gICAgICogTXVzdCBub3QgY2xvc2UgdGhlIHN0cmVhbSBvdXRzaWRlIHRoaXMgY2xhc3MuCi0gICAgICogPC9wPgotICAgICAqLwotICAgIHB1YmxpYyBmaW5hbCBjbGFzcyBIYW5kbGVyRm9yT3V0cHV0U3RyZWFtIGltcGxlbWVudHMgT25lRW50cnlIYW5kbGVyIHsKLSAgICAgICAgQFN1cHByZXNzV2FybmluZ3MoImhpZGluZyIpCi0gICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMT0dfVEFHID0gIlZDYXJkQ29tcG9zZXIuSGFuZGxlckZvck91dHB1dFN0cmVhbSI7Ci0KLSAgICAgICAgcHJpdmF0ZSBib29sZWFuIG1PblRlcm1pbmF0ZUlzQ2FsbGVkID0gZmFsc2U7Ci0KLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBPdXRwdXRTdHJlYW0gbU91dHB1dFN0cmVhbTsgLy8gbVdyaXRlciB3aWxsIGNsb3NlIHRoaXMuCi0gICAgICAgIHByaXZhdGUgV3JpdGVyIG1Xcml0ZXI7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIElucHV0IHN0cmVhbSB3aWxsIGJlIGNsb3NlZCBvbiB0aGUgZGV0cnVjdGlvbiBvZiB0aGlzIG9iamVjdC4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBIYW5kbGVyRm9yT3V0cHV0U3RyZWFtKGZpbmFsIE91dHB1dFN0cmVhbSBvdXRwdXRTdHJlYW0pIHsKLSAgICAgICAgICAgIG1PdXRwdXRTdHJlYW0gPSBvdXRwdXRTdHJlYW07Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBvbkluaXQoZmluYWwgQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIG1Xcml0ZXIgPSBuZXcgQnVmZmVyZWRXcml0ZXIobmV3IE91dHB1dFN0cmVhbVdyaXRlcigKLSAgICAgICAgICAgICAgICAgICAgICAgIG1PdXRwdXRTdHJlYW0sIG1DaGFyc2V0KSk7Ci0gICAgICAgICAgICB9IGNhdGNoIChVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIGUxKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmUoTE9HX1RBRywgIlVuc3VwcG9ydGVkIGNoYXJzZXQ6ICIgKyBtQ2hhcnNldCk7Ci0gICAgICAgICAgICAgICAgbUVycm9yUmVhc29uID0gIkVuY29kaW5nIGlzIG5vdCBzdXBwb3J0ZWQgKHVzdWFsbHkgdGhpcyBkb2VzIG5vdCBoYXBwZW4hKTogIgotICAgICAgICAgICAgICAgICAgICAgICAgKyBtQ2hhcnNldDsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChtSXNEb0NvTW8pIHsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAvLyBDcmVhdGUgb25lIGVtcHR5IGVudHJ5LgotICAgICAgICAgICAgICAgICAgICBtV3JpdGVyLndyaXRlKGNyZWF0ZU9uZUVudHJ5SW50ZXJuYWwoIi0xIiwgbnVsbCkpOwotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFZDYXJkRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgTG9nLmUoTE9HX1RBRywgIlZDYXJkRXhjZXB0aW9uIGhhcyBiZWVuIHRocm93biBkdXJpbmcgb24gSW5pdCgpOiAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIExvZy5lKExPR19UQUcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIklPRXhjZXB0aW9uIG9jY3VycmVkIGR1cmluZyBleHBvcnRPbmVDb250YWN0RGF0YTogIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBlLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgICAgICAgICAgICAgIG1FcnJvclJlYXNvbiA9ICJJT0V4Y2VwdGlvbiBvY2N1cnJlZDogIiArIGUuZ2V0TWVzc2FnZSgpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBvbkVudHJ5Q3JlYXRlZChTdHJpbmcgdmNhcmQpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgbVdyaXRlci53cml0ZSh2Y2FyZCk7Ci0gICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmUoTE9HX1RBRywKLSAgICAgICAgICAgICAgICAgICAgICAgICJJT0V4Y2VwdGlvbiBvY2N1cnJlZCBkdXJpbmcgZXhwb3J0T25lQ29udGFjdERhdGE6ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBlLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgICAgICAgICAgbUVycm9yUmVhc29uID0gIklPRXhjZXB0aW9uIG9jY3VycmVkOiAiICsgZS5nZXRNZXNzYWdlKCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBvblRlcm1pbmF0ZSgpIHsKLSAgICAgICAgICAgIG1PblRlcm1pbmF0ZUlzQ2FsbGVkID0gdHJ1ZTsKLSAgICAgICAgICAgIGlmIChtV3JpdGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAvLyBGbHVzaCBhbmQgc3luYyB0aGUgZGF0YSBzbyB0aGF0IGEgdXNlciBpcyBhYmxlIHRvIHB1bGwKLSAgICAgICAgICAgICAgICAgICAgLy8gdGhlIFNEQ2FyZCBqdXN0IGFmdGVyCi0gICAgICAgICAgICAgICAgICAgIC8vIHRoZSBleHBvcnQuCi0gICAgICAgICAgICAgICAgICAgIG1Xcml0ZXIuZmx1c2goKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1PdXRwdXRTdHJlYW0gIT0gbnVsbAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIG1PdXRwdXRTdHJlYW0gaW5zdGFuY2VvZiBGaWxlT3V0cHV0U3RyZWFtKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKChGaWxlT3V0cHV0U3RyZWFtKSBtT3V0cHV0U3RyZWFtKS5nZXRGRCgpLnN5bmMoKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgTG9nLmQoTE9HX1RBRywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSU9FeGNlcHRpb24gZHVyaW5nIGNsb3NpbmcgdGhlIG91dHB1dCBzdHJlYW06ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgZS5nZXRNZXNzYWdlKCkpOwotICAgICAgICAgICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICAgICAgICAgIGNsb3NlT3V0cHV0U3RyZWFtKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgY2xvc2VPdXRwdXRTdHJlYW0oKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIG1Xcml0ZXIuY2xvc2UoKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICBMb2cudyhMT0dfVEFHLCAiSU9FeGNlcHRpb24gaXMgdGhyb3duIGR1cmluZyBjbG9zZSgpLiBJZ25vcmluZy4iKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBmaW5hbGl6ZSgpIHsKLSAgICAgICAgICAgIGlmICghbU9uVGVybWluYXRlSXNDYWxsZWQpIHsKLSAgICAgICAgICAgICAgICBvblRlcm1pbmF0ZSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBmaW5hbCBDb250ZXh0IG1Db250ZXh0OwotICAgIHByaXZhdGUgZmluYWwgaW50IG1WQ2FyZFR5cGU7Ci0gICAgcHJpdmF0ZSBmaW5hbCBib29sZWFuIG1DYXJlSGFuZGxlckVycm9yczsKLSAgICBwcml2YXRlIGZpbmFsIENvbnRlbnRSZXNvbHZlciBtQ29udGVudFJlc29sdmVyOwotCi0gICAgcHJpdmF0ZSBmaW5hbCBib29sZWFuIG1Jc0RvQ29NbzsKLSAgICBwcml2YXRlIEN1cnNvciBtQ3Vyc29yOwotICAgIHByaXZhdGUgaW50IG1JZENvbHVtbjsKLQotICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIG1DaGFyc2V0OwotICAgIHByaXZhdGUgYm9vbGVhbiBtVGVybWluYXRlSXNDYWxsZWQ7Ci0gICAgcHJpdmF0ZSBmaW5hbCBMaXN0PE9uZUVudHJ5SGFuZGxlcj4gbUhhbmRsZXJMaXN0OwotCi0gICAgcHJpdmF0ZSBTdHJpbmcgbUVycm9yUmVhc29uID0gTk9fRVJST1I7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBzQ29udGFjdHNQcm9qZWN0aW9uID0gbmV3IFN0cmluZ1tdIHsKLSAgICAgICAgQ29udGFjdHMuX0lELAotICAgIH07Ci0KLSAgICBwdWJsaWMgVkNhcmRDb21wb3NlcihDb250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgdGhpcyhjb250ZXh0LCBWQ2FyZENvbmZpZy5WQ0FSRF9UWVBFX0RFRkFVTFQsIG51bGwsIHRydWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoZSB2YXJpYW50IHdoaWNoIHNldHMgY2hhcnNldCB0byBudWxsIGFuZCBzZXRzIGNhcmVIYW5kbGVyRXJyb3JzIHRvIHRydWUuCi0gICAgICovCi0gICAgcHVibGljIFZDYXJkQ29tcG9zZXIoQ29udGV4dCBjb250ZXh0LCBpbnQgdmNhcmRUeXBlKSB7Ci0gICAgICAgIHRoaXMoY29udGV4dCwgdmNhcmRUeXBlLCBudWxsLCB0cnVlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgVkNhcmRDb21wb3NlcihDb250ZXh0IGNvbnRleHQsIGludCB2Y2FyZFR5cGUsIFN0cmluZyBjaGFyc2V0KSB7Ci0gICAgICAgIHRoaXMoY29udGV4dCwgdmNhcmRUeXBlLCBjaGFyc2V0LCB0cnVlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgdmFyaWFudCB3aGljaCBzZXRzIGNoYXJzZXQgdG8gbnVsbC4KLSAgICAgKi8KLSAgICBwdWJsaWMgVkNhcmRDb21wb3NlcihmaW5hbCBDb250ZXh0IGNvbnRleHQsIGZpbmFsIGludCB2Y2FyZFR5cGUsCi0gICAgICAgICAgICBmaW5hbCBib29sZWFuIGNhcmVIYW5kbGVyRXJyb3JzKSB7Ci0gICAgICAgIHRoaXMoY29udGV4dCwgdmNhcmRUeXBlLCBudWxsLCBjYXJlSGFuZGxlckVycm9ycyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0IGZvciBzdXBwb3J0aW5nIGNhbGwgbG9nIGVudHJ5IHZDYXJkIGNvbXBvc2luZy4KLSAgICAgKgotICAgICAqIEBwYXJhbSBjb250ZXh0IENvbnRleHQgdG8gYmUgdXNlZCBkdXJpbmcgdGhlIGNvbXBvc2l0aW9uLgotICAgICAqIEBwYXJhbSB2Y2FyZFR5cGUgVGhlIHR5cGUgb2YgdkNhcmQsIHR5cGljYWxseSBhdmFpbGFibGUgdmlhIHtAbGluayBWQ2FyZENvbmZpZ30uCi0gICAgICogQHBhcmFtIGNoYXJzZXQgVGhlIGNoYXJzZXQgdG8gYmUgdXNlZC4gVXNlIG51bGwgd2hlbiB5b3UgZG9uJ3QgbmVlZCB0aGUgY2hhcnNldC4KLSAgICAgKiBAcGFyYW0gY2FyZUhhbmRsZXJFcnJvcnMgSWYgdHJ1ZSwgVGhpcyBvYmplY3QgcmV0dXJucyBmYWxzZSBldmVyeXRpbWUKLSAgICAgKiBhIEhhbmRsZXIgb2JqZWN0IGdpdmVuIHZpYSB7e0BsaW5rICNhZGRIYW5kbGVyKE9uZUVudHJ5SGFuZGxlcil9IHJldHVybnMgZmFsc2UuCi0gICAgICogSWYgZmFsc2UsIHRoaXMgaWdub3JlcyB0aG9zZSBlcnJvcnMuCi0gICAgICovCi0gICAgcHVibGljIFZDYXJkQ29tcG9zZXIoZmluYWwgQ29udGV4dCBjb250ZXh0LCBmaW5hbCBpbnQgdmNhcmRUeXBlLCBTdHJpbmcgY2hhcnNldCwKLSAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gY2FyZUhhbmRsZXJFcnJvcnMpIHsKLSAgICAgICAgbUNvbnRleHQgPSBjb250ZXh0OwotICAgICAgICBtVkNhcmRUeXBlID0gdmNhcmRUeXBlOwotICAgICAgICBtQ2FyZUhhbmRsZXJFcnJvcnMgPSBjYXJlSGFuZGxlckVycm9yczsKLSAgICAgICAgbUNvbnRlbnRSZXNvbHZlciA9IGNvbnRleHQuZ2V0Q29udGVudFJlc29sdmVyKCk7Ci0KLSAgICAgICAgbUlzRG9Db01vID0gVkNhcmRDb25maWcuaXNEb0NvTW8odmNhcmRUeXBlKTsKLSAgICAgICAgbUhhbmRsZXJMaXN0ID0gbmV3IEFycmF5TGlzdDxPbmVFbnRyeUhhbmRsZXI+KCk7Ci0KLSAgICAgICAgY2hhcnNldCA9IChUZXh0VXRpbHMuaXNFbXB0eShjaGFyc2V0KSA/IFZDYXJkQ29uZmlnLkRFRkFVTFRfRVhQT1JUX0NIQVJTRVQgOiBjaGFyc2V0KTsKLSAgICAgICAgZmluYWwgYm9vbGVhbiBzaG91bGRBcHBlbmRDaGFyc2V0UGFyYW0gPSAhKAotICAgICAgICAgICAgICAgIFZDYXJkQ29uZmlnLmlzVmVyc2lvbjMwKHZjYXJkVHlwZSkgJiYgVVRGXzguZXF1YWxzSWdub3JlQ2FzZShjaGFyc2V0KSk7Ci0KLSAgICAgICAgaWYgKG1Jc0RvQ29NbyB8fCBzaG91bGRBcHBlbmRDaGFyc2V0UGFyYW0pIHsKLSAgICAgICAgICAgIGlmIChTSElGVF9KSVMuZXF1YWxzSWdub3JlQ2FzZShjaGFyc2V0KSkgewotICAgICAgICAgICAgICAgIGlmIChtSXNEb0NvTW8pIHsKLSAgICAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNoYXJzZXQgPSBDaGFyc2V0VXRpbHMuY2hhcnNldEZvclZlbmRvcihTSElGVF9KSVMsICJkb2NvbW8iKS5uYW1lKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFVuc3VwcG9ydGVkQ2hhcnNldEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBMb2cuZShMT0dfVEFHLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRG9Db01vLXNwZWNpZmljIFNISUZUX0pJUyB3YXMgbm90IGZvdW5kLiAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIlVzZSBTSElGVF9KSVMgYXMgaXMuIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjaGFyc2V0ID0gU0hJRlRfSklTOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNoYXJzZXQgPSBDaGFyc2V0VXRpbHMuY2hhcnNldEZvclZlbmRvcihTSElGVF9KSVMpLm5hbWUoKTsKLSAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoVW5zdXBwb3J0ZWRDaGFyc2V0RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIExvZy5lKExPR19UQUcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDYXJlZXItc3BlY2lmaWMgU0hJRlRfSklTIHdhcyBub3QgZm91bmQuICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiVXNlIFNISUZUX0pJUyBhcyBpcy4iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNoYXJzZXQgPSBTSElGVF9KSVM7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbUNoYXJzZXQgPSBjaGFyc2V0OwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBMb2cudyhMT0dfVEFHLAotICAgICAgICAgICAgICAgICAgICAgICAgIlRoZSBjaGFyc2V0IFwiIiArIGNoYXJzZXQgKyAiXCIgaXMgdXNlZCB3aGlsZSAiCi0gICAgICAgICAgICAgICAgICAgICAgICArIFNISUZUX0pJUyArICIgaXMgbmVlZGVkIHRvIGJlIHVzZWQuIik7Ci0gICAgICAgICAgICAgICAgaWYgKFRleHRVdGlscy5pc0VtcHR5KGNoYXJzZXQpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1DaGFyc2V0ID0gU0hJRlRfSklTOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjaGFyc2V0ID0gQ2hhcnNldFV0aWxzLmNoYXJzZXRGb3JWZW5kb3IoY2hhcnNldCkubmFtZSgpOwotICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChVbnN1cHBvcnRlZENoYXJzZXRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmkoTE9HX1RBRywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNhcmVlci1zcGVjaWZpYyBcIiIgKyBjaGFyc2V0ICsgIlwiIHdhcyBub3QgZm91bmQgKGFzIHVzdWFsKS4gIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJVc2UgaXQgYXMgaXMuIik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgbUNoYXJzZXQgPSBjaGFyc2V0OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGlmIChUZXh0VXRpbHMuaXNFbXB0eShjaGFyc2V0KSkgewotICAgICAgICAgICAgICAgIG1DaGFyc2V0ID0gVVRGXzg7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIGNoYXJzZXQgPSBDaGFyc2V0VXRpbHMuY2hhcnNldEZvclZlbmRvcihjaGFyc2V0KS5uYW1lKCk7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoVW5zdXBwb3J0ZWRDaGFyc2V0RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgTG9nLmkoTE9HX1RBRywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ2FyZWVyLXNwZWNpZmljIFwiIiArIGNoYXJzZXQgKyAiXCIgd2FzIG5vdCBmb3VuZCAoYXMgdXN1YWwpLiAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiVXNlIGl0IGFzIGlzLiIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBtQ2hhcnNldCA9IGNoYXJzZXQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBMb2cuZChMT0dfVEFHLCAiVXNlIHRoZSBjaGFyc2V0IFwiIiArIG1DaGFyc2V0ICsgIlwiIik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogTXVzdCBiZSBjYWxsZWQgYmVmb3JlIHtAbGluayAjaW5pdCgpfS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBhZGRIYW5kbGVyKE9uZUVudHJ5SGFuZGxlciBoYW5kbGVyKSB7Ci0gICAgICAgIGlmIChoYW5kbGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1IYW5kbGVyTGlzdC5hZGQoaGFuZGxlcik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIFJldHVybnMgdHJ1ZSB3aGVuIGluaXRpYWxpemF0aW9uIGlzIHN1Y2Nlc3NmdWwgYW5kIGFsbCB0aGUgb3RoZXIKLSAgICAgKiAgICAgICAgICBtZXRob2RzIGFyZSBhdmFpbGFibGUuIFJldHVybnMgZmFsc2Ugb3RoZXJ3aXNlLgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGluaXQoKSB7Ci0gICAgICAgIHJldHVybiBpbml0KG51bGwsIG51bGwpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGluaXQoZmluYWwgU3RyaW5nIHNlbGVjdGlvbiwgZmluYWwgU3RyaW5nW10gc2VsZWN0aW9uQXJncykgewotICAgICAgICByZXR1cm4gaW5pdChDb250YWN0cy5DT05URU5UX1VSSSwgc2VsZWN0aW9uLCBzZWxlY3Rpb25BcmdzLCBudWxsKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBOb3RlIHRoYXQgdGhpcyBpcyB1bnN0YWJsZSBpbnRlcmZhY2UsIG1heSBiZSBkZWxldGVkIGluIHRoZSBmdXR1cmUuCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaW5pdChmaW5hbCBVcmkgY29udGVudFVyaSwgZmluYWwgU3RyaW5nIHNlbGVjdGlvbiwKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZ1tdIHNlbGVjdGlvbkFyZ3MsIGZpbmFsIFN0cmluZyBzb3J0T3JkZXIpIHsKLSAgICAgICAgaWYgKGNvbnRlbnRVcmkgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG1DYXJlSGFuZGxlckVycm9ycykgewotICAgICAgICAgICAgZmluYWwgTGlzdDxPbmVFbnRyeUhhbmRsZXI+IGZpbmlzaGVkTGlzdCA9IG5ldyBBcnJheUxpc3Q8T25lRW50cnlIYW5kbGVyPigKLSAgICAgICAgICAgICAgICAgICAgbUhhbmRsZXJMaXN0LnNpemUoKSk7Ci0gICAgICAgICAgICBmb3IgKE9uZUVudHJ5SGFuZGxlciBoYW5kbGVyIDogbUhhbmRsZXJMaXN0KSB7Ci0gICAgICAgICAgICAgICAgaWYgKCFoYW5kbGVyLm9uSW5pdChtQ29udGV4dCkpIHsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChPbmVFbnRyeUhhbmRsZXIgZmluaXNoZWQgOiBmaW5pc2hlZExpc3QpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZpbmlzaGVkLm9uVGVybWluYXRlKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIEp1c3QgaWdub3JlIHRoZSBmYWxzZSByZXR1cm5lZCBmcm9tIG9uSW5pdCgpLgotICAgICAgICAgICAgZm9yIChPbmVFbnRyeUhhbmRsZXIgaGFuZGxlciA6IG1IYW5kbGVyTGlzdCkgewotICAgICAgICAgICAgICAgIGhhbmRsZXIub25Jbml0KG1Db250ZXh0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGZpbmFsIFN0cmluZ1tdIHByb2plY3Rpb247Ci0gICAgICAgIGlmIChDb250YWN0cy5DT05URU5UX1VSSS5lcXVhbHMoY29udGVudFVyaSkgfHwKLSAgICAgICAgICAgICAgICBDT05UQUNUU19URVNUX0NPTlRFTlRfVVJJLmVxdWFscyhjb250ZW50VXJpKSkgewotICAgICAgICAgICAgcHJvamVjdGlvbiA9IHNDb250YWN0c1Byb2plY3Rpb247Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtRXJyb3JSZWFzb24gPSBGQUlMVVJFX1JFQVNPTl9VTlNVUFBPUlRFRF9VUkk7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgbUN1cnNvciA9IG1Db250ZW50UmVzb2x2ZXIucXVlcnkoCi0gICAgICAgICAgICAgICAgY29udGVudFVyaSwgcHJvamVjdGlvbiwgc2VsZWN0aW9uLCBzZWxlY3Rpb25BcmdzLCBzb3J0T3JkZXIpOwotCi0gICAgICAgIGlmIChtQ3Vyc29yID09IG51bGwpIHsKLSAgICAgICAgICAgIG1FcnJvclJlYXNvbiA9IEZBSUxVUkVfUkVBU09OX0ZBSUxFRF9UT19HRVRfREFUQUJBU0VfSU5GTzsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChnZXRDb3VudCgpID09IDAgfHwgIW1DdXJzb3IubW92ZVRvRmlyc3QoKSkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBtQ3Vyc29yLmNsb3NlKCk7Ci0gICAgICAgICAgICB9IGNhdGNoIChTUUxpdGVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIExvZy5lKExPR19UQUcsICJTUUxpdGVFeGNlcHRpb24gb24gQ3Vyc29yI2Nsb3NlKCk6ICIgKyBlLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgICAgIG1DdXJzb3IgPSBudWxsOwotICAgICAgICAgICAgICAgIG1FcnJvclJlYXNvbiA9IEZBSUxVUkVfUkVBU09OX05PX0VOVFJZOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgbUlkQ29sdW1uID0gbUN1cnNvci5nZXRDb2x1bW5JbmRleChDb250YWN0cy5fSUQpOwotCi0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGNyZWF0ZU9uZUVudHJ5KCkgewotICAgICAgICByZXR1cm4gY3JlYXRlT25lRW50cnkobnVsbCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIGdldEVudGl0eUl0ZXJhdG9yTWV0aG9kIEZvciBEZXBlbmRlbmN5IEluamVjdGlvbi4KLSAgICAgKiBAaGlkZSBqdXN0IGZvciB0ZXN0aW5nLgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGNyZWF0ZU9uZUVudHJ5KE1ldGhvZCBnZXRFbnRpdHlJdGVyYXRvck1ldGhvZCkgewotICAgICAgICBpZiAobUN1cnNvciA9PSBudWxsIHx8IG1DdXJzb3IuaXNBZnRlckxhc3QoKSkgewotICAgICAgICAgICAgbUVycm9yUmVhc29uID0gRkFJTFVSRV9SRUFTT05fTk9UX0lOSVRJQUxJWkVEOwotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIGZpbmFsIFN0cmluZyB2Y2FyZDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGlmIChtSWRDb2x1bW4gPj0gMCkgewotICAgICAgICAgICAgICAgIHZjYXJkID0gY3JlYXRlT25lRW50cnlJbnRlcm5hbChtQ3Vyc29yLmdldFN0cmluZyhtSWRDb2x1bW4pLAotICAgICAgICAgICAgICAgICAgICAgICAgZ2V0RW50aXR5SXRlcmF0b3JNZXRob2QpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBMb2cuZShMT0dfVEFHLCAiSW5jb3JyZWN0IG1JZENvbHVtbjogIiArIG1JZENvbHVtbik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKFZDYXJkRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIExvZy5lKExPR19UQUcsICJWQ2FyZEV4Y2VwdGlvbiBoYXMgYmVlbiB0aHJvd246ICIgKyBlLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0gY2F0Y2ggKE91dE9mTWVtb3J5RXJyb3IgZXJyb3IpIHsKLSAgICAgICAgICAgIC8vIE1heWJlIHNvbWUgZGF0YSAoZS5nLiBwaG90bykgaXMgdG9vIGJpZyB0byBoYXZlIGluIG1lbW9yeS4gQnV0IGl0Ci0gICAgICAgICAgICAvLyBzaG91bGQgYmUgcmFyZS4KLSAgICAgICAgICAgIExvZy5lKExPR19UQUcsICJPdXRPZk1lbW9yeUVycm9yIG9jY3VyZWQuIElnbm9yZSB0aGUgZW50cnkuIik7Ci0gICAgICAgICAgICBTeXN0ZW0uZ2MoKTsKLSAgICAgICAgICAgIC8vIFRPRE86IHNob3VsZCB0ZWxsIHVzZXJzIHdoYXQgaGFwcGVuZWQ/Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIG1DdXJzb3IubW92ZVRvTmV4dCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gVGhpcyBmdW5jdGlvbiBkb2VzIG5vdCBjYXJlIHRoZSBPdXRPZk1lbW9yeUVycm9yIG9uIHRoZSBoYW5kbGVyIHNpZGUgOi1QCi0gICAgICAgIGlmIChtQ2FyZUhhbmRsZXJFcnJvcnMpIHsKLSAgICAgICAgICAgIExpc3Q8T25lRW50cnlIYW5kbGVyPiBmaW5pc2hlZExpc3QgPSBuZXcgQXJyYXlMaXN0PE9uZUVudHJ5SGFuZGxlcj4oCi0gICAgICAgICAgICAgICAgICAgIG1IYW5kbGVyTGlzdC5zaXplKCkpOwotICAgICAgICAgICAgZm9yIChPbmVFbnRyeUhhbmRsZXIgaGFuZGxlciA6IG1IYW5kbGVyTGlzdCkgewotICAgICAgICAgICAgICAgIGlmICghaGFuZGxlci5vbkVudHJ5Q3JlYXRlZCh2Y2FyZCkpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGZvciAoT25lRW50cnlIYW5kbGVyIGhhbmRsZXIgOiBtSGFuZGxlckxpc3QpIHsKLSAgICAgICAgICAgICAgICBoYW5kbGVyLm9uRW50cnlDcmVhdGVkKHZjYXJkKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIHByaXZhdGUgU3RyaW5nIGNyZWF0ZU9uZUVudHJ5SW50ZXJuYWwoZmluYWwgU3RyaW5nIGNvbnRhY3RJZCwKLSAgICAgICAgICAgIGZpbmFsIE1ldGhvZCBnZXRFbnRpdHlJdGVyYXRvck1ldGhvZCkgdGhyb3dzIFZDYXJkRXhjZXB0aW9uIHsKLSAgICAgICAgZmluYWwgTWFwPFN0cmluZywgTGlzdDxDb250ZW50VmFsdWVzPj4gY29udGVudFZhbHVlc0xpc3RNYXAgPQotICAgICAgICAgICAgICAgIG5ldyBIYXNoTWFwPFN0cmluZywgTGlzdDxDb250ZW50VmFsdWVzPj4oKTsKLSAgICAgICAgLy8gVGhlIHJlc29sdmVyIG1heSByZXR1cm4gdGhlIGVudGl0eSBpdGVyYXRvciB3aXRoIG5vIGRhdGEuIEl0IGlzIHBvc3NpYmxlLgotICAgICAgICAvLyBlLmcuIElmIGFsbCB0aGUgZGF0YSBpbiB0aGUgY29udGFjdCBvZiB0aGUgZ2l2ZW4gY29udGFjdCBpZCBhcmUgbm90IGV4cG9ydGFibGUgb25lcywKLSAgICAgICAgLy8gICAgICB0aGV5IGFyZSBoaWRkZW4gZnJvbSB0aGUgdmlldyBvZiB0aGlzIG1ldGhvZCwgdGhvdWdoIGNvbnRhY3QgaWQgaXRzZWxmIGV4aXN0cy4KLSAgICAgICAgRW50aXR5SXRlcmF0b3IgZW50aXR5SXRlcmF0b3IgPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgZmluYWwgVXJpIHVyaSA9IFJhd0NvbnRhY3RzRW50aXR5LkNPTlRFTlRfVVJJLmJ1aWxkVXBvbigpCi0gICAgICAgICAgICAgICAgICAgIC8vIC5hcHBlbmRRdWVyeVBhcmFtZXRlcigiZm9yX2V4cG9ydF9vbmx5IiwgIjEiKQotICAgICAgICAgICAgICAgICAgICAuYXBwZW5kUXVlcnlQYXJhbWV0ZXIoRGF0YS5GT1JfRVhQT1JUX09OTFksICIxIikKLSAgICAgICAgICAgICAgICAgICAgLmJ1aWxkKCk7Ci0gICAgICAgICAgICBmaW5hbCBTdHJpbmcgc2VsZWN0aW9uID0gRGF0YS5DT05UQUNUX0lEICsgIj0/IjsKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZ1tdIHNlbGVjdGlvbkFyZ3MgPSBuZXcgU3RyaW5nW10ge2NvbnRhY3RJZH07Ci0gICAgICAgICAgICBpZiAoZ2V0RW50aXR5SXRlcmF0b3JNZXRob2QgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIC8vIFBsZWFzZSBub3RlIHRoYXQgdGhpcyBicmFuY2ggaXMgZXhlY3V0ZWQgYnkgdW5pdCB0ZXN0cyBvbmx5Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgZW50aXR5SXRlcmF0b3IgPSAoRW50aXR5SXRlcmF0b3IpZ2V0RW50aXR5SXRlcmF0b3JNZXRob2QuaW52b2tlKG51bGwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbUNvbnRlbnRSZXNvbHZlciwgdXJpLCBzZWxlY3Rpb24sIHNlbGVjdGlvbkFyZ3MsIG51bGwpOwotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIExvZy5lKExPR19UQUcsICJJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaGFzIGJlZW4gdGhyb3duOiAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIExvZy5lKExPR19UQUcsICJJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGhhcyBiZWVuIHRocm93bjogIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5nZXRNZXNzYWdlKCkpOwotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICBMb2cuZShMT0dfVEFHLCAiSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBoYXMgYmVlbiB0aHJvd246ICIpOwotICAgICAgICAgICAgICAgICAgICBTdGFja1RyYWNlRWxlbWVudFtdIHN0YWNrVHJhY2VFbGVtZW50cyA9IGUuZ2V0Q2F1c2UoKS5nZXRTdGFja1RyYWNlKCk7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoU3RhY2tUcmFjZUVsZW1lbnQgZWxlbWVudCA6IHN0YWNrVHJhY2VFbGVtZW50cykgewotICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmUoTE9HX1RBRywgIiAgICBhdCAiICsgZWxlbWVudC50b1N0cmluZygpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVkNhcmRFeGNlcHRpb24oIkludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gaGFzIGJlZW4gdGhyb3duOiAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLmdldENhdXNlKCkuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGVudGl0eUl0ZXJhdG9yID0gUmF3Q29udGFjdHMubmV3RW50aXR5SXRlcmF0b3IobUNvbnRlbnRSZXNvbHZlci5xdWVyeSgKLSAgICAgICAgICAgICAgICAgICAgICAgIHVyaSwgbnVsbCwgc2VsZWN0aW9uLCBzZWxlY3Rpb25BcmdzLCBudWxsKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChlbnRpdHlJdGVyYXRvciA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmUoTE9HX1RBRywgIkVudGl0eUl0ZXJhdG9yIGlzIG51bGwiKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gIiI7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmICghZW50aXR5SXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgTG9nLncoTE9HX1RBRywgIkRhdGEgZG9lcyBub3QgZXhpc3QuIGNvbnRhY3RJZDogIiArIGNvbnRhY3RJZCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuICIiOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB3aGlsZSAoZW50aXR5SXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgRW50aXR5IGVudGl0eSA9IGVudGl0eUl0ZXJhdG9yLm5leHQoKTsKLSAgICAgICAgICAgICAgICBmb3IgKE5hbWVkQ29udGVudFZhbHVlcyBuYW1lZENvbnRlbnRWYWx1ZXMgOiBlbnRpdHkuZ2V0U3ViVmFsdWVzKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgQ29udGVudFZhbHVlcyBjb250ZW50VmFsdWVzID0gbmFtZWRDb250ZW50VmFsdWVzLnZhbHVlczsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGtleSA9IGNvbnRlbnRWYWx1ZXMuZ2V0QXNTdHJpbmcoRGF0YS5NSU1FVFlQRSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChrZXkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgTGlzdDxDb250ZW50VmFsdWVzPiBjb250ZW50VmFsdWVzTGlzdCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnRWYWx1ZXNMaXN0TWFwLmdldChrZXkpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbnRlbnRWYWx1ZXNMaXN0ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50VmFsdWVzTGlzdCA9IG5ldyBBcnJheUxpc3Q8Q29udGVudFZhbHVlcz4oKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50VmFsdWVzTGlzdE1hcC5wdXQoa2V5LCBjb250ZW50VmFsdWVzTGlzdCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50VmFsdWVzTGlzdC5hZGQoY29udGVudFZhbHVlcyk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBpZiAoZW50aXR5SXRlcmF0b3IgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGVudGl0eUl0ZXJhdG9yLmNsb3NlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gYnVpbGRWQ2FyZChjb250ZW50VmFsdWVzTGlzdE1hcCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQnVpbGRzIGFuZCByZXR1cm5zIHZDYXJkIHVzaW5nIGdpdmVuIG1hcCwgd2hvc2Uga2V5IGlzIENPTlRFTlRfSVRFTV9UWVBFIGRlZmluZWQgaW4KLSAgICAgKiB7Q29udGFjdHNDb250cmFjdH0uIERldmVsb3BlcnMgY2FuIG92ZXJyaWRlIHRoaXMgbWV0aG9kIHRvIGN1c3RvbWl6ZSB0aGUgb3V0cHV0LgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgYnVpbGRWQ2FyZChmaW5hbCBNYXA8U3RyaW5nLCBMaXN0PENvbnRlbnRWYWx1ZXM+PiBjb250ZW50VmFsdWVzTGlzdE1hcCkgewotICAgICAgICBpZiAoY29udGVudFZhbHVlc0xpc3RNYXAgPT0gbnVsbCkgewotICAgICAgICAgICAgTG9nLmUoTE9HX1RBRywgIlRoZSBnaXZlbiBtYXAgaXMgbnVsbC4gSWdub3JlIGFuZCByZXR1cm4gZW1wdHkgU3RyaW5nIik7Ci0gICAgICAgICAgICByZXR1cm4gIiI7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBmaW5hbCBWQ2FyZEJ1aWxkZXIgYnVpbGRlciA9IG5ldyBWQ2FyZEJ1aWxkZXIobVZDYXJkVHlwZSwgbUNoYXJzZXQpOwotICAgICAgICAgICAgYnVpbGRlci5hcHBlbmROYW1lUHJvcGVydGllcyhjb250ZW50VmFsdWVzTGlzdE1hcC5nZXQoU3RydWN0dXJlZE5hbWUuQ09OVEVOVF9JVEVNX1RZUEUpKQotICAgICAgICAgICAgICAgICAgICAuYXBwZW5kTmlja05hbWVzKGNvbnRlbnRWYWx1ZXNMaXN0TWFwLmdldChOaWNrbmFtZS5DT05URU5UX0lURU1fVFlQRSkpCi0gICAgICAgICAgICAgICAgICAgIC5hcHBlbmRQaG9uZXMoY29udGVudFZhbHVlc0xpc3RNYXAuZ2V0KFBob25lLkNPTlRFTlRfSVRFTV9UWVBFKSkKLSAgICAgICAgICAgICAgICAgICAgLmFwcGVuZEVtYWlscyhjb250ZW50VmFsdWVzTGlzdE1hcC5nZXQoRW1haWwuQ09OVEVOVF9JVEVNX1RZUEUpKQotICAgICAgICAgICAgICAgICAgICAuYXBwZW5kUG9zdGFscyhjb250ZW50VmFsdWVzTGlzdE1hcC5nZXQoU3RydWN0dXJlZFBvc3RhbC5DT05URU5UX0lURU1fVFlQRSkpCi0gICAgICAgICAgICAgICAgICAgIC5hcHBlbmRPcmdhbml6YXRpb25zKGNvbnRlbnRWYWx1ZXNMaXN0TWFwLmdldChPcmdhbml6YXRpb24uQ09OVEVOVF9JVEVNX1RZUEUpKQotICAgICAgICAgICAgICAgICAgICAuYXBwZW5kV2Vic2l0ZXMoY29udGVudFZhbHVlc0xpc3RNYXAuZ2V0KFdlYnNpdGUuQ09OVEVOVF9JVEVNX1RZUEUpKTsKLSAgICAgICAgICAgIGlmICgobVZDYXJkVHlwZSAmIFZDYXJkQ29uZmlnLkZMQUdfUkVGUkFJTl9JTUFHRV9FWFBPUlQpID09IDApIHsKLSAgICAgICAgICAgICAgICBidWlsZGVyLmFwcGVuZFBob3Rvcyhjb250ZW50VmFsdWVzTGlzdE1hcC5nZXQoUGhvdG8uQ09OVEVOVF9JVEVNX1RZUEUpKTsgICAgICAgICAgICAKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kTm90ZXMoY29udGVudFZhbHVlc0xpc3RNYXAuZ2V0KE5vdGUuQ09OVEVOVF9JVEVNX1RZUEUpKQotICAgICAgICAgICAgICAgICAgICAuYXBwZW5kRXZlbnRzKGNvbnRlbnRWYWx1ZXNMaXN0TWFwLmdldChFdmVudC5DT05URU5UX0lURU1fVFlQRSkpCi0gICAgICAgICAgICAgICAgICAgIC5hcHBlbmRJbXMoY29udGVudFZhbHVlc0xpc3RNYXAuZ2V0KEltLkNPTlRFTlRfSVRFTV9UWVBFKSkKLSAgICAgICAgICAgICAgICAgICAgLmFwcGVuZFJlbGF0aW9uKGNvbnRlbnRWYWx1ZXNMaXN0TWFwLmdldChSZWxhdGlvbi5DT05URU5UX0lURU1fVFlQRSkpOwotICAgICAgICAgICAgcmV0dXJuIGJ1aWxkZXIudG9TdHJpbmcoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlcm1pbmF0ZSgpIHsKLSAgICAgICAgZm9yIChPbmVFbnRyeUhhbmRsZXIgaGFuZGxlciA6IG1IYW5kbGVyTGlzdCkgewotICAgICAgICAgICAgaGFuZGxlci5vblRlcm1pbmF0ZSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG1DdXJzb3IgIT0gbnVsbCkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBtQ3Vyc29yLmNsb3NlKCk7Ci0gICAgICAgICAgICB9IGNhdGNoIChTUUxpdGVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIExvZy5lKExPR19UQUcsICJTUUxpdGVFeGNlcHRpb24gb24gQ3Vyc29yI2Nsb3NlKCk6ICIgKyBlLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtQ3Vyc29yID0gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIG1UZXJtaW5hdGVJc0NhbGxlZCA9IHRydWU7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgZmluYWxpemUoKSB7Ci0gICAgICAgIGlmICghbVRlcm1pbmF0ZUlzQ2FsbGVkKSB7Ci0gICAgICAgICAgICBMb2cudyhMT0dfVEFHLCAidGVybWluYXRlKCkgaXMgbm90IGNhbGxlZCB5ZXQuIFdlIGNhbGwgaXQgaW4gZmluYWxpemUoKSBzdGVwLiIpOwotICAgICAgICAgICAgdGVybWluYXRlKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIHJldHVybnMgdGhlIG51bWJlciBvZiBhdmFpbGFibGUgZW50aXRpZXMuIFRoZSByZXR1cm4gdmFsdWUgaXMgdW5kZWZpbmVkCi0gICAgICogd2hlbiB0aGlzIG9iamVjdCBpcyBub3QgcmVhZHkgeWV0ICh0eXBpY2FsbHkgd2hlbiB7e0BsaW5rICNpbml0KCl9IGlzIG5vdCBjYWxsZWQKLSAgICAgKiBvciB3aGVuIHtAbGluayAjdGVybWluYXRlKCl9IGlzIGFscmVhZHkgY2FsbGVkKS4KLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IGdldENvdW50KCkgewotICAgICAgICBpZiAobUN1cnNvciA9PSBudWxsKSB7Ci0gICAgICAgICAgICBMb2cudyhMT0dfVEFHLCAiVGhpcyBvYmplY3QgaXMgbm90IHJlYWR5IHlldC4iKTsKLSAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBtQ3Vyc29yLmdldENvdW50KCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHJldHVybiB0cnVlIHdoZW4gdGhlcmUncyBubyBlbnRpdHkgdG8gYmUgYnVpbHQuIFRoZSByZXR1cm4gdmFsdWUgaXMgdW5kZWZpbmVkCi0gICAgICogd2hlbiB0aGlzIG9iamVjdCBpcyBub3QgcmVhZHkgeWV0LgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzQWZ0ZXJMYXN0KCkgewotICAgICAgICBpZiAobUN1cnNvciA9PSBudWxsKSB7Ci0gICAgICAgICAgICBMb2cudyhMT0dfVEFHLCAiVGhpcyBvYmplY3QgaXMgbm90IHJlYWR5IHlldC4iKTsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbUN1cnNvci5pc0FmdGVyTGFzdCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgZXJyb3IgcmVhc29uLgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0RXJyb3JSZWFzb24oKSB7Ci0gICAgICAgIHJldHVybiBtRXJyb3JSZWFzb247Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvcGltL3ZjYXJkL1ZDYXJkQ29uZmlnLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9waW0vdmNhcmQvVkNhcmRDb25maWcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGU3NTllMy4uMDAwMDAwMAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9waW0vdmNhcmQvVkNhcmRDb25maWcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwNSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2UgYW5kcm9pZC5waW0udmNhcmQ7Ci0KLWltcG9ydCBhbmRyb2lkLnRlbGVwaG9ueS5QaG9uZU51bWJlclV0aWxzOwotaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLS8qKgotICogVGhlIGNsYXNzIHJlcHJlc2VudGluZyBWQ2FyZCByZWxhdGVkIGNvbmZpZ3VyYXRpb25zLiBVc2VmdWwgc3RhdGljIG1ldGhvZHMgYXJlIG5vdCBpbiB0aGlzIGNsYXNzCi0gKiBidXQgaW4gVkNhcmRVdGlscy4KLSAqLwotcHVibGljIGNsYXNzIFZDYXJkQ29uZmlnIHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTE9HX1RBRyA9ICJWQ2FyZENvbmZpZyI7Ci0KLSAgICAvKiBwYWNrYWdlICovIHN0YXRpYyBmaW5hbCBpbnQgTE9HX0xFVkVMX05PTkUgPSAwOwotICAgIC8qIHBhY2thZ2UgKi8gc3RhdGljIGZpbmFsIGludCBMT0dfTEVWRUxfUEVSRk9STUFOQ0VfTUVBU1VSRU1FTlQgPSAweDE7Ci0gICAgLyogcGFja2FnZSAqLyBzdGF0aWMgZmluYWwgaW50IExPR19MRVZFTF9TSE9XX1dBUk5JTkcgPSAweDI7Ci0gICAgLyogcGFja2FnZSAqLyBzdGF0aWMgZmluYWwgaW50IExPR19MRVZFTF9WRVJCT1NFID0KLSAgICAgICAgTE9HX0xFVkVMX1BFUkZPUk1BTkNFX01FQVNVUkVNRU5UIHwgTE9HX0xFVkVMX1NIT1dfV0FSTklORzsKLQotICAgIC8qIHBhY2thZ2UgKi8gc3RhdGljIGZpbmFsIGludCBMT0dfTEVWRUwgPSBMT0dfTEVWRUxfTk9ORTsKLQotICAgIC8qKgotICAgICAqIDxwPgotICAgICAqIFRoZSBjaGFyc2V0IHVzZWQgZHVyaW5nIGltcG9ydC4KLSAgICAgKiA8L3A+Ci0gICAgICogPHA+Ci0gICAgICogV2UgY2Fubm90IGRldGVybWluZSB3aGljaCBjaGFyc2V0IHNob3VsZCBiZSB1c2VkIHRvIGludGVycHJldCBsaW5lcyBpbiB2Q2FyZCwKLSAgICAgKiB3aGlsZSBKYXZhIHJlcXVpcmVzIHVzIHRvIHNwZWNpZnkgaXQgd2hlbiBJbnB1dFN0cmVhbSBpcyB1c2VkLgotICAgICAqIFdlIG5lZWQgdG8gcmVseSBvbiB0aGUgbWVjaGFuaXNtIGR1ZSB0byBzb21lIHBlcmZvcm1hbmNlIHJlYXNvbi4KLSAgICAgKiA8L3A+Ci0gICAgICogPHA+Ci0gICAgICogSW4gb3JkZXIgdG8gYXZvaWQgIm1pc2ludGVycHJldGF0aW9uIiBvZiBjaGFyc2V0IGFuZCBsb3NlIGFueSBkYXRhIGluIHZDYXJkLAotICAgICAqICJJU08tODg1OS0xIiBpcyBmaXJzdCB1c2VkIGZvciByZWFkaW5nIHRoZSBzdHJlYW0uCi0gICAgICogV2hlbiBhIGNoYXJzZXQgaXMgc3BlY2lmaWVkIGluIGEgcHJvcGVydHkgKHdpdGggIkNIQVJTRVQ9Li4uIiBwYXJhbWV0ZXIpLAotICAgICAqIHRoZSBzdHJpbmcgaXMgZGVjb2RlZCB0byByYXcgYnl0ZXMgYW5kIGVuY29kZWQgaW50byB0aGUgc3BlY2lmaWMgY2hhcnNldCwKLSAgICAgKiA8L3A+Ci0gICAgICogPHA+Ci0gICAgICogVW5pY29kZSBzcGVjaWZpY2F0aW9uIHRoZXJlJ3MgYSBvbmUgdG8gb25lIG1hcHBpbmcgYmV0d2VlbiBlYWNoIGJ5dGUgaW4gSVNPLTg4NTktMQotICAgICAqIGFuZCBhIGNvZGVwb2ludCwgYW5kIEphdmEgc3BlY2lmaWNhdGlvbiByZXF1aXJlcyBydW50aW1lIG11c3QgaGF2ZSB0aGUgY2hhcnNldC4KLSAgICAgKiBUaHVzLCBJU08tODg1OS0xIGlzIG9uZSBlZmZlY3RpdmUgbWFwcGluZyBmb3IgaW50ZXJtZWRpYXRlIG1hcHBpbmcuCi0gICAgICogPC9wPgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfSU5URVJNRURJQVRFX0NIQVJTRVQgPSAiSVNPLTg4NTktMSI7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgY2hhcnNldCB1c2VkIHdoZW4gdGhlcmUncyBubyBpbmZvcm1hdGlvbiBhZmZib3V0IHdoYXQgY2hhcnNldCBzaG91bGQgYmUgdXNlZCB0bwotICAgICAqIGVuY29kZSB0aGUgYmluYXJ5IGdpdmVuIGZyb20gdkNhcmQuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9JTVBPUlRfQ0hBUlNFVCA9ICJVVEYtOCI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9FWFBPUlRfQ0hBUlNFVCA9ICJVVEYtOCI7Ci0KLSAgICAvKioKLSAgICAgKiBEbyBub3QgdXNlIHN0YXRpY2FsbHkgbGlrZSAidmVyc2lvbiA9PSBWRVJTSU9OX1YyMSIKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBWRVJTSU9OXzIxID0gMDsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBWRVJTSU9OXzMwID0gMTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBWRVJTSU9OXzQwID0gMjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBWRVJTSU9OX01BU0sgPSAzOwotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTkFNRV9PUkRFUl9ERUZBVUxUID0gMDsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBOQU1FX09SREVSX0VVUk9QRSA9IDB4NDsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBOQU1FX09SREVSX0pBUEFORVNFID0gMHg4OwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBOQU1FX09SREVSX01BU0sgPSAweEM7Ci0KLSAgICAvLyAweDEwIGlzIHJlc2VydmVkIGZvciBzYWZldHkKLQotICAgIC8qKgotICAgICAqIDxwPgotICAgICAqIFRoZSBmbGFnIGluZGljYXRpbmcgdGhlIHZDYXJkIGNvbXBvc2VyIHdpbGwgYWRkIHNvbWUgIlgtIiBwcm9wZXJ0aWVzIHVzZWQgb25seSBpbiBBbmRyb2lkCi0gICAgICogd2hlbiB0aGUgZm9ybWFsIHZDYXJkIHNwZWNpZmljYXRpb24gZG9lcyBub3QgaGF2ZSBhcHByb3ByaWF0ZSBmaWVsZHMgZm9yIHRoYXQgZGF0YS4KLSAgICAgKiA8L3A+Ci0gICAgICogPHA+Ci0gICAgICogRm9yIGV4YW1wbGUsIEFuZHJvaWQgYWNjZXB0cyBuaWNrbmFtZSBpbmZvcm1hdGlvbiB3aGlsZSB2Q2FyZCAyLjEgZG9lcyBub3QuCi0gICAgICogV2hlbiB0aGlzIGZsYWcgaXMgb24sIHZDYXJkIGNvbXBvc2VyIGVtaXRzIGFsdGVybmF0aXZlICJYLSIgcHJvcGVydHkgKGxpa2UgIlgtTklDS05BTUUiKQotICAgICAqIGluc3RlYWQgb2YganVzdCBkcm9wcGluZyBpdC4KLSAgICAgKiA8L3A+Ci0gICAgICogPHA+Ci0gICAgICogdkNhcmQgcGFyc2VyIGNvZGUgYXV0b21hdGljYWxseSBwYXJzZXMgdGhlIGZpZWxkIGVtaXR0ZWQgZXZlbiB3aGVuIHRoaXMgZmxhZyBpcyBvZmYuCi0gICAgICogPC9wPgotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBGTEFHX1VTRV9BTkRST0lEX1BST1BFUlRZID0gMHg4MDAwMDAwMDsKLSAgICAKLSAgICAvKioKLSAgICAgKiA8cD4KLSAgICAgKiBUaGUgZmxhZyBpbmRpY2F0aW5nIHRoZSB2Q2FyZCBjb21wb3NlciB3aWxsIGFkZCBzb21lICJYLSIgcHJvcGVydGllcyBzZWVuIGluIHRoZQotICAgICAqIHZDYXJkIGRhdGEgZW1pdHRlZCBieSB0aGUgb3RoZXIgc29mdHdhcmVzL2RldmljZXMgd2hlbiB0aGUgZm9ybWFsIHZDYXJkIHNwZWNpZmljYXRpb24KLSAgICAgKiBkb2VzIG5vdCBoYXZlIGFwcHJvcHJpYXRlIGZpZWxkKHMpIGZvciB0aGF0IGRhdGEuCi0gICAgICogPC9wPiAKLSAgICAgKiA8cD4KLSAgICAgKiBPbmUgZXhhbXBsZSBpcyBYLVBIT05FVElDLUZJUlNULU5BTUUvWC1QSE9ORVRJQy1NSURETEUtTkFNRS9YLVBIT05FVElDLUxBU1QtTkFNRSwgd2hpY2ggYXJlCi0gICAgICogZm9yIHBob25ldGljIG5hbWUgKGhvdyB0aGUgbmFtZSBpcyBwcm9ub3VuY2VkKSwgc2VlbiBpbiB0aGUgdkNhcmQgZW1pdHRlZCBieSBzb21lIG90aGVyCi0gICAgICogbm9uLUFuZHJvaWQgZGV2aWNlcy9zb2Z0d2FyZXMuIFdlIGNob3NlIHRvIGVuYWJsZSB0aGUgdkNhcmQgY29tcG9zZXIgdG8gdXNlIHRob3NlCi0gICAgICogZGVmYWN0IHByb3BlcnRpZXMgc2luY2UgdGhleSBhcmUgYWxzbyB1c2VmdWwgZm9yIEFuZHJvaWQgZGV2aWNlcy4KLSAgICAgKiA8L3A+Ci0gICAgICogPHA+Ci0gICAgICogTm90ZSBmb3IgZGV2ZWxvcGVyczogb25seSAiWC0iIHByb3BlcnRpZXMgc2hvdWxkIGJlIGFkZGVkIHdpdGggdGhpcyBmbGFnLiB2Q2FyZCAyLjEvMy4wCi0gICAgICogYWxsb3dzIGFueSBraW5kIG9mICJYLSIgcHJvcGVydGllcyBidXQgZG9lcyBub3QgYWxsb3cgbm9uLSJYLSIgcHJvcGVydGllcyAoZXhjZXB0IElBTkEgdG9rZW5zCi0gICAgICogaW4gdkNhcmQgMy4wKS4gU29tZSBleHRlcm5hbCBwYXJzZXJzIG1heSBnZXQgY29uZnVzZWQgd2l0aCBub24tdmFsaWQsIG5vbi0iWC0iIHByb3BlcnRpZXMuCi0gICAgICogPC9wPgotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBGTEFHX1VTRV9ERUZBQ1RfUFJPUEVSVFkgPSAweDQwMDAwMDAwOwotCi0gICAgLyoqCi0gICAgICogPHA+Ci0gICAgICogVGhlIGZsYWcgaW5kaWNhdGluZyBzb21lIHNwZWNpZmljIGRpYWxlY3Qgc2VlbiBpbiB2Q2FyZCBvZiBEb0NvTW8gKG9uZSBvZiBKYXBhbmVzZQotICAgICAqIG1vYmlsZSBjYXJlZXJzKSBzaG91bGQgYmUgdXNlZC4gVGhpcyBmbGFnIGRvZXMgbm90IGluY2x1ZGUgYW55IG90aGVyIGluZm9ybWF0aW9uIGxpa2UKLSAgICAgKiB0aGF0ICJ0aGUgdkNhcmQgaXMgZm9yIEphcGFuZXNlIi4gU28gaXQgaXMgInBvc3NpYmxlIiB0aGF0ICJ0aGUgdkNhcmQgc2hvdWxkIGhhdmUgRG9Db01vJ3MKLSAgICAgKiBkaWFsZWN0IGJ1dCB0aGUgbmFtZSBvcmRlciBzaG91bGQgYmUgRXVyb3BlYW4iLCBidXQgaXQgaXMgbm90IHJlY29tbWVuZGVkLgotICAgICAqIDwvcD4KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRkxBR19ET0NPTU8gPSAweDIwMDAwMDAwOwotCi0gICAgLyoqCi0gICAgICogPHA+Ci0gICAgICogVGhlIGZsYWcgaW5kaWNhdGluZyB0aGUgdkNhcmQgY29tcG9zZXIgZG9lcyAiTk9UIiB1c2UgUXVvdGVkLVByaW50YWJsZSB0b3dhcmQgInByaW1hcnkiCi0gICAgICogcHJvcGVydGllcyBldmVuIHRob3VnaCBpdCBpcyByZXF1aXJlZCBieSB2Q2FyZCAyLjEgKFFQIGlzIHByb2hpYml0ZWQgaW4gdkNhcmQgMy4wKS4KLSAgICAgKiA8L3A+Ci0gICAgICogPHA+Ci0gICAgICogV2UgYWN0dWFsbHkgY2Fubm90IGRlZmluZSB3aGF0IGlzIHRoZSAicHJpbWFyeSIgcHJvcGVydHkuIE5vdGUgdGhhdCB0aGlzIGlzIE5PVCBkZWZpbmVkCi0gICAgICogaW4gdkNhcmQgc3BlY2lmaWNhdGlvbiBlaXRoZXIuIEFsc28gYmUgYXdhcmUgdGhhdCBpdCBpcyBOT1QgcmVsYXRlZCB0byAicHJpbWFyeSIgbm90aW9uCi0gICAgICogdXNlZCBpbiB7QGxpbmsgYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0fS4KLSAgICAgKiBUaGlzIG5vdGlvbiBpcyBqdXN0IGZvciB2Q2FyZCBjb21wb3NpdGlvbiBpbiBBbmRyb2lkLgotICAgICAqIDwvcD4KLSAgICAgKiA8cD4KLSAgICAgKiBXZSBhZGRlZCB0aGlzIEFuZHJvaWQtc3BlY2lmaWMgbm90aW9uIHNpbmNlIHNvbWUgKGluY29tcGxldGUpIHZDYXJkIGV4cG9ydGVycyBmb3IgdkNhcmQgMi4xCi0gICAgICogZG8gTk9UIHVzZSBRdW90ZWQtUHJpbnRhYmxlIGVuY29kaW5nIHRvd2FyZCBzb21lIHByb3BlcnRpZXMgcmVsYXRlZCBuYW1lcyBsaWtlICJOIiwgIkZOIiwgZXRjLgotICAgICAqIGV2ZW4gd2hlbiB0aGVpciB2YWx1ZXMgY29udGFpbiBub24tYXNjaWkgb3IvYW5kIENSL0xGLCB3aGlsZSB0aGV5IHVzZSB0aGUgZW5jb2RpbmcgaW4gdGhlCi0gICAgICogb3RoZXIgcHJvcGVydGllcyBsaWtlICJBRFIiLCAiT1JHIiwgZXRjLgotICAgICAqIDxwPgotICAgICAqIFdlIGFyZSBhZnJhaWQgb2YgdGhlIGNhc2Ugd2hlcmUgc29tZSB2Q2FyZCBpbXBvcnRlciBhbHNvIGZvcmdldCBoYW5kbGluZyBRUCBwcmVzdW1pbmcgUVAgaXMKLSAgICAgKiBub3QgdXNlZCBpbiBzdWNoIGZpZWxkcy4KLSAgICAgKiA8L3A+Ci0gICAgICogPHA+Ci0gICAgICogVGhpcyBmbGFnIGlzIHVzZWZ1bCB3aGVuIHNvbWUgdGFyZ2V0IGltcG9ydGVyIHlvdSBhcmUgZ29pbmcgdG8gZm9jdXMgb24gZG9lcyBub3QgYWNjZXB0Ci0gICAgICogc3VjaCBwcm9wZXJ0aWVzIHdpdGggUXVvdGVkLVByaW50YWJsZSBlbmNvZGluZy4KLSAgICAgKiA8L3A+Ci0gICAgICogPHA+Ci0gICAgICogQWdhaW4sIHdlIHNob3VsZCBub3QgdXNlIHRoaXMgZmxhZyBhdCBhbGwgZm9yIGNvbXBseWluZyB2Q2FyZCAyLjEgc3BlYy4KLSAgICAgKiA8L3A+Ci0gICAgICogPHA+Ci0gICAgICogSW4gdkNhcmQgMy4wLCBRdW90ZWQtUHJpbnRhYmxlIGlzIGV4cGxpY2l0bHkgInByb2hpYml0dGVkIiwgc28gd2UgZG9uJ3QgbmVlZCB0byBjYXJlIHRoaXMKLSAgICAgKiBraW5kIG9mIHByb2JsZW0gKGhvcGVmdWxseSkuCi0gICAgICogPC9wPgotICAgICAqIEBoaWRlCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRkxBR19SRUZSQUlOX1FQX1RPX05BTUVfUFJPUEVSVElFUyA9IDB4MTAwMDAwMDA7Ci0KLSAgICAvKioKLSAgICAgKiA8cD4KLSAgICAgKiBUaGUgZmxhZyBpbmRpY2F0aW5nIHRoYXQgcGhvbmV0aWMgbmFtZSByZWxhdGVkIGZpZWxkcyBtdXN0IGJlIGNvbnZlcnRlZCB0bwotICAgICAqIGFwcHJvcHJpYXRlIGZvcm0uIE5vdGUgdGhhdCAiYXBwcm9wcmlhdGUiIGlzIG5vdCBkZWZpbmVkIGluIGFueSB2Q2FyZCBzcGVjaWZpY2F0aW9uLgotICAgICAqIFRoaXMgaXMgQW5kcm9pZC1zcGVjaWZpYy4KLSAgICAgKiA8L3A+Ci0gICAgICogPHA+Ci0gICAgICogT25lIHR5cGljYWwgKGFuZCBjdXJyZW50bHkgc29sZSkgZXhhbXBsZSB3aGVyZSB3ZSBuZWVkIHRoaXMgZmxhZyBpcyB0aGUgdGltZSB3aGVuCi0gICAgICogd2UgbmVlZCB0byBlbWl0IEphcGFuZXNlIHBob25ldGljIG5hbWVzIGludG8gdkNhcmQgZW50cmllcy4gVGhlIHByb3BlcnR5IHZhbHVlcwotICAgICAqIHNob3VsZCBiZSBlbmNvZGVkIGludG8gaGFsZi13aWR0aCBrYXRha2FuYSB3aGVuIHRoZSB0YXJnZXQgaW1wb3J0ZXIgaXMgSmFwYW5lc2UgbW9iaWxlCi0gICAgICogcGhvbmVzJywgd2hpY2ggYXJlIHByb2JhYmx5IG5vdCBhYmxlIHRvIHBhcnNlIGZ1bGwtd2lkdGggaGlyYWdhbmEva2F0YWthbmEgZm9yCi0gICAgICogaGlzdG9yaWNhbCByZWFzb25zLCB3aGlsZSB0aGUgdkNhcmQgaW1wb3J0ZXJzIGVtYmVkZGVkIHRvIHNvZnR3YXJlcyBmb3IgUEMgc2hvdWxkIGJlCi0gICAgICogYWJsZSB0byBwYXJzZSB0aGVtIGFzIHdlIGV4cGVjdC4KLSAgICAgKiA8L3A+Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRkxBR19DT05WRVJUX1BIT05FVElDX05BTUVfU1RSSU5HUyA9IDB4MDgwMDAwMDA7Ci0KLSAgICAvKioKLSAgICAgKiA8cD4KLSAgICAgKiBUaGUgZmxhZyBpbmRpY2F0aW5nIHRoZSB2Q2FyZCBjb21wb3NlciAiZm9yIDIuMSIgZW1pdHMgIlRZUEU9IiBzdHJpbmcgdG93YXJkIFRZUEUgcGFyYW1zCi0gICAgICogZXZlcnkgdGltZSBwb3NzaWJsZS4gVGhlIGRlZmF1bHQgYmVoYXZpb3IgZG9lcyBub3QgZW1pdCBpdCBhbmQgaXMgdmFsaWQgaW4gdGhlIHNwZWMuCi0gICAgICogSW4gdkNyYWQgMy4wLCB0aGlzIGZsYWcgaXMgdW5uZWNlc3NhcnksIHNpbmNlICJUWVBFPSIgaXMgTVVTVCBpbiB2Q2FyZCAzLjAgc3BlY2lmaWNhdGlvbi4KLSAgICAgKiA8L3A+Ci0gICAgICogPHA+Ci0gICAgICogRGV0YWlsOgotICAgICAqIEhvdyBtb3JlIHRoYW4gb25lIFRZUEUgZmllbGRzIGFyZSBleHByZXNzZWQgaXMgZGlmZmVyZW50IGJldHdlZW4gdkNhcmQgMi4xIGFuZCB2Q2FyZCAzLjAuCi0gICAgICogPC9wPgotICAgICAqIDxwPgotICAgICAqIGUuZy4KLSAgICAgKiA8L3A+Ci0gICAgICogPG9sPgotICAgICAqIDxsaT5Qcm9iYWJseSB2YWxpZCBpbiBib3RoIHZDYXJkIDIuMSBhbmQgdkNhcmQgMy4wOiAiQURSO1RZUEU9RE9NO1RZUEU9SE9NRTouLi4iPC9saT4KLSAgICAgKiA8bGk+VmFsaWQgaW4gdkNhcmQgMi4xIGJ1dCBub3QgaW4gdkNhcmQgMy4wOiAiQURSO0RPTTtIT01FOi4uLiI8L2xpPgotICAgICAqIDxsaT5WYWxpZCBpbiB2Q2FyZCAzLjAgYnV0IG5vdCBpbiB2Q2FyZCAyLjE6ICJBRFI7VFlQRT1ET00sSE9NRTouLi4iPC9saT4KLSAgICAgKiA8L29sPgotICAgICAqIDxwPgotICAgICAqIElmIHlvdSBhcmUgdGFyZ2V0aW5nIHRvIHRoZSBpbXBvcnRlciB3aGljaCBjYW5ub3QgYWNjZXB0IFRZUEUgcGFyYW1zIHdpdGhvdXQgIlRZUEU9IgotICAgICAqIHN0cmluZ3MgKHdoaWNoIHNob3VsZCBiZSByYXJlIHRob3VnaCksIHBsZWFzZSB1c2UgdGhpcyBmbGFnLgotICAgICAqIDwvcD4KLSAgICAgKiA8cD4KLSAgICAgKiBFeGFtcGxlIHVzYWdlOgotICAgICAqIDxwcmUgY2xhc3M9InByZXR0eXByaW50Ij5pbnQgdHlwZSA9IChWQ0FSRF9UWVBFX1YyMV9HRU5FUklDIHwgRkxBR19BUFBFTkRfVFlQRV9QQVJBTSk7PC9wcmU+Ci0gICAgICogPC9wPgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZMQUdfQVBQRU5EX1RZUEVfUEFSQU0gPSAweDA0MDAwMDAwOwotCi0gICAgLyoqCi0gICAgICogPHA+Ci0gICAgICogVGhlIGZsYWcgaW5kaWNhdGluZyB0aGUgdkNhcmQgY29tcG9zZXIgZG9lcyB0b3VjaCBub3RoaW5nIHRvd2FyZCBwaG9uZSBudW1iZXIgU3RyaW5ncwotICAgICAqIGJ1dCBsZWF2ZSBpdCBhcyBpcy4KLSAgICAgKiA8L3A+Ci0gICAgICogPHA+Ci0gICAgICogVGhlIHZDYXJkIHNwZWNpZmljYXRpb25zIG1lbnRpb24gbm90aGluZyB0b3dhcmQgcGhvbmUgbnVtYmVycywgd2hpbGUgc29tZSBkZXZpY2VzCi0gICAgICogZG8gKHdyb25nbHksIGJ1dCB3aXRoIGlubmV2aXRhYmxlIHJlYXNvbnMpLgotICAgICAqIEZvciBleGFtcGxlLCB0aGVyZSdzIGEgcG9zc2liaWxpdHkgSmFwYW5lc2UgbW9iaWxlIHBob25lcyBhcmUgZXhwZWN0ZWQgdG8gaGF2ZQotICAgICAqIGp1c3QgbnVtYmVycywgaHlwZW5zLCBwbHVzLCBldGMuIGJ1dCBub3QgdXN1YWwgYWxwaGFiZXRzLCB3aGlsZSBVUyBtb2JpbGUgcGhvbmVzCi0gICAgICogc2hvdWxkIGdldCBzdWNoIGNoYXJhY3RlcnMuIFRvIG1ha2UgZXhwb3J0ZWQgdkNhcmQgc2ltcGxlIGZvciBleHRlcm5hbCBwYXJzZXJzLAotICAgICAqIHdlIGhhdmUgdXNlZCB7QGxpbmsgUGhvbmVOdW1iZXJVdGlscyNmb3JtYXROdW1iZXIoU3RyaW5nKX0gZHVyaW5nIGV4cG9ydCwgYW5kCi0gICAgICogcmVtb3ZlZCB1bm5lY2Vzc2FyeSBjaGFyYWN0ZXJzIGluc2lkZSB0aGUgbnVtYmVyIChlLmcuICIxMTEtMjIyLTMzMzMgKE1pYW1pKSIKLSAgICAgKiBiZWNvbWVzICIxMTEtMjIyLTMzMzMiKS4KLSAgICAgKiBVbmZvcnR1bmF0ZSBzaWRlIGVmZmVjdCBvZiB0aGF0IHVzZSB3YXMgc29tZSBjb250cm9sIGNoYXJhY3RlcnMgdXNlZCBpbiB0aGUgb3RoZXIKLSAgICAgKiBhcmVhcyBtYXkgYmUgYmFkbHkgYWZmZWN0ZWQgYnkgdGhlIGZvcm1hdHRpbmcuCi0gICAgICogPC9wPgotICAgICAqIDxwPgotICAgICAqIFRoaXMgZmxhZyBkaXNhYmxlcyB0aGF0IGZvcm1hdHRpbmcsIGFmZmVjdGluZyBib3RoIGltcG9ydGVyIGFuZCBleHBvcnRlci4KLSAgICAgKiBJZiB0aGUgdXNlciBpcyBhd2FyZSBvZiBzb21lIHNpZGUgZWZmZWN0cyBkdWUgdG8gdGhlIGltcGxpY2l0IGZvcm1hdHRpbmcsIHVzZSB0aGlzIGZsYWcuCi0gICAgICogPC9wPgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZMQUdfUkVGUkFJTl9QSE9ORV9OVU1CRVJfRk9STUFUVElORyA9IDB4MDIwMDAwMDA7Ci0KLSAgICAvKioKLSAgICAgKiA8cD4KLSAgICAgKiBGb3IgaW1wb3J0ZXIgb25seS4gSWdub3JlZCBpbiBleHBvcnRlci4KLSAgICAgKiA8L3A+Ci0gICAgICogPHA+Ci0gICAgICogVGhlIGZsYWcgaW5kaWNhdGluZyB0aGUgcGFyc2VyIHNob3VsZCBoYW5kbGUgYSBuZXN0ZWQgdkNhcmQsIGluIHdoaWNoIHZDYXJkIGNsYXVzZSBzdGFydHMKLSAgICAgKiBpbiBhbm90aGVyIHZDYXJkIGNsYXVzZS4gSGVyZSdzIGEgdHlwaWNhbCBleGFtcGxlLgotICAgICAqIDwvcD4KLSAgICAgKiA8cHJlIGNsYXNzPSJwcmV0dHlwcmludCI+QkVHSU46VkNBUkQKLSAgICAgKiBCRUdJTjpWQ0FSRAotICAgICAqIFZFUlNJT046Mi4xCi0gICAgICogLi4uCi0gICAgICogRU5EOlZDQVJECi0gICAgICogRU5EOlZDQVJEPC9wcmU+Ci0gICAgICogPHA+Ci0gICAgICogVGhlIHZDYXJkIDIuMSBzcGVjaWZpY2F0aW9uIGFsbG93cyB0aGUgbmVzdCwgYnV0IGFsc28gbGV0IHBhcnNlcnMgaWdub3JlIG5lc3RlZCBlbnRyaWVzLAotICAgICAqIHdoaWxlIHNvbWUgbW9iaWxlIGRldmljZXMgZW1pdCBuZXN0ZWQgb25lcyBhcyBwcmltYXJ5IGRhdGEgdG8gYmUgaW1wb3J0ZWQuCi0gICAgICogPC9wPgotICAgICAqIDxwPgotICAgICAqIFRoaXMgZmxhZyBmb3JjZXMgYSB2Q2FyZCBwYXJzZXIgdG8gdG9yZWxhdGUgc3VjaCBhIG5lc3QgYW5kIHVuZGVyc3RhbmQgaXRzIGNvbnRlbnQuCi0gICAgICogPC9wPgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZMQUdfVE9SRUxBVEVfTkVTVCA9IDB4MDEwMDAwMDA7Ci0KLSAgICAvLy8vIFRoZSBmb2xsb3dpbmdzIGFyZSBWQ2FyZCB0eXBlcyBhdmFpbGFibGUgZnJvbSBpbXBvcnRlci9leHBvcnRlci4gLy8vLwotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRkxBR19SRUZSQUlOX0lNQUdFX0VYUE9SVCA9IDB4MDA4MDAwMDA7Ci0KLSAgICAvKioKLSAgICAgKiA8cD4KLSAgICAgKiBUaGUgdHlwZSBpbmRpY2F0aW5nIG5vdGhpbmcuIFVzZWQgYnkge0BsaW5rIFZDYXJkU291cmNlRGV0ZWN0b3J9IHdoZW4gaXQKLSAgICAgKiB3YXMgbm90IGFibGUgdG8gZ3Vlc3MgdGhlIGV4YWN0IHZDYXJkIHR5cGUuCi0gICAgICogPC9wPgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZDQVJEX1RZUEVfVU5LTk9XTiA9IDA7Ci0KLSAgICAvKioKLSAgICAgKiA8cD4KLSAgICAgKiBHZW5lcmljIHZDYXJkIGZvcm1hdCB3aXRoIHRoZSB2Q2FyZCAyLjEuIFdoZW4gY29tcG9zaW5nIGEgdkNhcmQgZW50cnksCi0gICAgICogdGhlIFVTIGNvbnZlbnNpb24gd2lsbCBiZSB1c2VkIHRvd2FyZCBmb3JtYXR0aW5nIHNvbWUgdmFsdWVzLgotICAgICAqIDwvcD4KLSAgICAgKiA8cD4KLSAgICAgKiBlLmcuIFRoZSBvcmRlciBvZiB0aGUgZGlzcGxheSBuYW1lIHdvdWxkIGJlICJQcmVmaXggR2l2ZW4gTWlkZGxlIEZhbWlseSBTdWZmaXgiLAotICAgICAqIHdoaWxlIGl0IHNob3VsZCBiZSAiUHJlZml4IEZhbWlseSBNaWRkbGUgR2l2ZW4gU3VmZml4IiBpbiBKYXBhbiBmb3IgZXhhbXBsZS4KLSAgICAgKiA8L3A+Ci0gICAgICogPHA+Ci0gICAgICogVXNlcyBVVEYtOCBmb3IgdGhlIGNoYXJzZXQgYXMgYSBjaGFyc2V0IGZvciBleHBvcnRpbmcuIE5vdGUgdGhhdCBvbGQgdkNhcmQgaW1wb3J0ZXIKLSAgICAgKiBvdXRzaWRlIEFuZHJvaWQgY2Fubm90IGFjY2VwdCBpdCBzaW5jZSB2Q2FyZCAyLjEgc3BlY2lmaWNhbGx5IGRvZXMgbm90IGFsbG93Ci0gICAgICogdGhhdCBjaGFyc2V0LCB3aGlsZSB3ZSBuZWVkIHRvIHVzZSBpdCB0byBzdXBwb3J0IHZhcmlvdXMgbGFuZ3VhZ2VzIGFyb3VuZCB0aGUgd29ybGQuCi0gICAgICogPC9wPgotICAgICAqIDxwPgotICAgICAqIElmIHlvdSB3YW50IHRvIHVzZSBhbHRlcm5hdGl2ZSBjaGFyc2V0LCB5b3Ugc2hvdWxkIG5vdGlmeSB0aGUgY2hhcnNldCB0byB0aGUgb3RoZXIKLSAgICAgKiBjb21wb250ZW50IHRvIGJlIHVzZWQuCi0gICAgICogPC9wPgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZDQVJEX1RZUEVfVjIxX0dFTkVSSUMgPQotICAgICAgICAoVkVSU0lPTl8yMSB8IE5BTUVfT1JERVJfREVGQVVMVCB8IEZMQUdfVVNFX0RFRkFDVF9QUk9QRVJUWSB8IEZMQUdfVVNFX0FORFJPSURfUFJPUEVSVFkpOwotCi0gICAgLyogcGFja2FnZSAqLyBzdGF0aWMgU3RyaW5nIFZDQVJEX1RZUEVfVjIxX0dFTkVSSUNfU1RSID0gInYyMV9nZW5lcmljIjsKLSAgICAKLSAgICAvKioKLSAgICAgKiA8cD4KLSAgICAgKiBHZW5lcmFsIHZDYXJkIGZvcm1hdCB3aXRoIHRoZSB2ZXJzaW9uIDMuMC4gVXNlcyBVVEYtOCBmb3IgdGhlIGNoYXJzZXQuCi0gICAgICogPC9wPgotICAgICAqIDxwPgotICAgICAqIE5vdCBmdWxseSByZWFkeSB5ZXQuIFVzZSB3aXRoIGNhdXRpb24gd2hlbiB5b3UgdXNlIHRoaXMuCi0gICAgICogPC9wPgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZDQVJEX1RZUEVfVjMwX0dFTkVSSUMgPQotICAgICAgICAoVkVSU0lPTl8zMCB8IE5BTUVfT1JERVJfREVGQVVMVCB8IEZMQUdfVVNFX0RFRkFDVF9QUk9QRVJUWSB8IEZMQUdfVVNFX0FORFJPSURfUFJPUEVSVFkpOwotCi0gICAgLyogcGFja2FnZSAqLyBzdGF0aWMgZmluYWwgU3RyaW5nIFZDQVJEX1RZUEVfVjMwX0dFTkVSSUNfU1RSID0gInYzMF9nZW5lcmljIjsKLQotICAgIC8qKgotICAgICAqIEdlbmVyYWwgdkNhcmQgZm9ybWF0IHdpdGggdGhlIHZlcnNpb24gNC4wLgotICAgICAqIEBoaWRlIHZDYXJkIDQuMCBpcyBub3QgcHVibGlzaGVkIHlldC4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBWQ0FSRF9UWVBFX1Y0MF9HRU5FUklDID0KLSAgICAgICAgKFZFUlNJT05fNDAgfCBOQU1FX09SREVSX0RFRkFVTFQgfCBGTEFHX1VTRV9ERUZBQ1RfUFJPUEVSVFkgfCBGTEFHX1VTRV9BTkRST0lEX1BST1BFUlRZKTsKLQotICAgIC8qIHBhY2thZ2UgKi8gc3RhdGljIGZpbmFsIFN0cmluZyBWQ0FSRF9UWVBFX1Y0MF9HRU5FUklDX1NUUiA9ICJ2NDBfZ2VuZXJpYyI7Ci0KLSAgICAvKioKLSAgICAgKiA8cD4KLSAgICAgKiBHZW5lcmFsIHZDYXJkIGZvcm1hdCBmb3IgdGhlIHZDYXJkIDIuMSB3aXRoIHNvbWUgRXVyb3BlIGNvbnZlbnNpb24uIFVzZXMgVXRmLTguCi0gICAgICogQ3VycmVudGx5LCBvbmx5IG5hbWUgb3JkZXIgaXMgY29uc2lkZXJlZCAoIlByZWZpeCBNaWRkbGUgR2l2ZW4gRmFtaWx5IFN1ZmZpeCIpCi0gICAgICogPC9wPgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZDQVJEX1RZUEVfVjIxX0VVUk9QRSA9Ci0gICAgICAgIChWRVJTSU9OXzIxIHwgTkFNRV9PUkRFUl9FVVJPUEUgfCBGTEFHX1VTRV9ERUZBQ1RfUFJPUEVSVFkgfCBGTEFHX1VTRV9BTkRST0lEX1BST1BFUlRZKTsKLQotICAgIC8qIHBhY2thZ2UgKi8gc3RhdGljIGZpbmFsIFN0cmluZyBWQ0FSRF9UWVBFX1YyMV9FVVJPUEVfU1RSID0gInYyMV9ldXJvcGUiOwotICAgIAotICAgIC8qKgotICAgICAqIDxwPgotICAgICAqIEdlbmVyYWwgdkNhcmQgZm9ybWF0IHdpdGggdGhlIHZlcnNpb24gMy4wIHdpdGggc29tZSBFdXJvcGUgY29udmVuc2lvbi4gVXNlcyBVVEYtOC4KLSAgICAgKiA8L3A+Ci0gICAgICogPHA+Ci0gICAgICogTm90IHJlYWR5IHlldC4gVXNlIHdpdGggY2F1dGlvbiB3aGVuIHlvdSB1c2UgdGhpcy4KLSAgICAgKiA8L3A+Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVkNBUkRfVFlQRV9WMzBfRVVST1BFID0KLSAgICAgICAgKFZFUlNJT05fMzAgfCBOQU1FX09SREVSX0VVUk9QRSB8IEZMQUdfVVNFX0RFRkFDVF9QUk9QRVJUWSB8IEZMQUdfVVNFX0FORFJPSURfUFJPUEVSVFkpOwotICAgIAotICAgIC8qIHBhY2thZ2UgKi8gc3RhdGljIGZpbmFsIFN0cmluZyBWQ0FSRF9UWVBFX1YzMF9FVVJPUEVfU1RSID0gInYzMF9ldXJvcGUiOwotCi0gICAgLyoqCi0gICAgICogPHA+Ci0gICAgICogVGhlIHZDYXJkIDIuMSBmb3JtYXQgZm9yIG1pc2NlbGxhbmVvdXMgSmFwYW5lc2UgZGV2aWNlcywgdXNpbmcgVVRGLTggYXMgZGVmYXVsdCBjaGFyc2V0LgotICAgICAqIDwvcD4KLSAgICAgKiA8cD4KLSAgICAgKiBOb3QgcmVhZHkgeWV0LiBVc2Ugd2l0aCBjYXV0aW9uIHdoZW4geW91IHVzZSB0aGlzLgotICAgICAqIDwvcD4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBWQ0FSRF9UWVBFX1YyMV9KQVBBTkVTRSA9Ci0gICAgICAgIChWRVJTSU9OXzIxIHwgTkFNRV9PUkRFUl9KQVBBTkVTRSB8IEZMQUdfVVNFX0RFRkFDVF9QUk9QRVJUWSB8IEZMQUdfVVNFX0FORFJPSURfUFJPUEVSVFkpOwotCi0gICAgLyogcGFja2FnZSAqLyBzdGF0aWMgZmluYWwgU3RyaW5nIFZDQVJEX1RZUEVfVjIxX0pBUEFORVNFX1NUUiA9ICJ2MjFfamFwYW5lc2VfdXRmOCI7Ci0KLSAgICAvKioKLSAgICAgKiA8cD4KLSAgICAgKiBUaGUgdkNhcmQgMy4wIGZvcm1hdCBmb3IgbWlzY2VsbGFuZW91cyBKYXBhbmVzZSBkZXZpY2VzLCB1c2luZyBVVEYtOCBhcyBkZWZhdWx0IGNoYXJzZXQuCi0gICAgICogPC9wPgotICAgICAqIDxwPgotICAgICAqIE5vdCByZWFkeSB5ZXQuIFVzZSB3aXRoIGNhdXRpb24gd2hlbiB5b3UgdXNlIHRoaXMuCi0gICAgICogPC9wPgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZDQVJEX1RZUEVfVjMwX0pBUEFORVNFID0KLSAgICAgICAgKFZFUlNJT05fMzAgfCBOQU1FX09SREVSX0pBUEFORVNFIHwgRkxBR19VU0VfREVGQUNUX1BST1BFUlRZIHwgRkxBR19VU0VfQU5EUk9JRF9QUk9QRVJUWSk7Ci0KLSAgICAvKiBwYWNrYWdlICovIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkNBUkRfVFlQRV9WMzBfSkFQQU5FU0VfU1RSID0gInYzMF9qYXBhbmVzZV91dGY4IjsKLQotICAgIC8qKgotICAgICAqIDxwPgotICAgICAqIFRoZSB2Q2FyZCAyLjEgYmFzZWQgZm9ybWF0IHdoaWNoIChwYXJ0aWFsbHkpIGNvbnNpZGVycyB0aGUgY29udmVudGlvbiBpbiBKYXBhbmVzZQotICAgICAqIG1vYmlsZSBwaG9uZXMsIHdoZXJlIHBob25ldGljIG5hbWVzIGFyZSB0cmFuc2xhdGVkIHRvIGhhbGYtd2lkdGgga2F0YWthbmEgaWYKLSAgICAgKiBwb3NzaWJsZSwgZXRjLiBJdCB3b3VsZCBiZSBiZXR0ZXIgdG8gdXNlIFNoaWZ0X0pJUyBhcyBhIGNoYXJzZXQgZm9yIG1heGltdW0KLSAgICAgKiBjb21wYXRpYmlsaXR5LgotICAgICAqIDwvcD4KLSAgICAgKiBAaGlkZSBTaG91bGQgbm90IGJlIGF2YWlsYWJsZSB3b3JsZCB3aWRlLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZDQVJEX1RZUEVfVjIxX0pBUEFORVNFX01PQklMRSA9Ci0gICAgICAgIChWRVJTSU9OXzIxIHwgTkFNRV9PUkRFUl9KQVBBTkVTRSB8Ci0gICAgICAgICAgICAgICAgRkxBR19DT05WRVJUX1BIT05FVElDX05BTUVfU1RSSU5HUyB8IEZMQUdfUkVGUkFJTl9RUF9UT19OQU1FX1BST1BFUlRJRVMpOwotCi0gICAgLyogcGFja2FnZSAqLyBzdGF0aWMgZmluYWwgU3RyaW5nIFZDQVJEX1RZUEVfVjIxX0pBUEFORVNFX01PQklMRV9TVFIgPSAidjIxX2phcGFuZXNlX21vYmlsZSI7Ci0KLSAgICAvKioKLSAgICAgKiA8cD4KLSAgICAgKiBUaGUgdkNhcmQgZm9ybWF0IHVzZWQgaW4gRG9Db01vLCB3aGljaCBpcyBvbmUgb2YgSmFwYW5lc2UgbW9iaWxlIHBob25lIGNhcmVlcnMuCi0gICAgICogPC9wPgotICAgICAqIDxwPgotICAgICAqIEJhc2UgdmVyc2lvbiBpcyB2Q2FyZCAyLjEsIGJ1dCB0aGUgZGF0YSBoYXMgc2V2ZXJhbCBEb0NvTW8tc3BlY2lmaWMgY29udmVuc2lvbnMuCi0gICAgICogTm8gQW5kcm9pZC1zcGVjaWZpYyBwcm9wZXJ0eSBub3IgZGVmYWN0IHByb3BlcnR5IGlzIGluY2x1ZGVkLiBUaGUgIlByaW1hcnkiIHByb3BlcnRpZXMKLSAgICAgKiBhcmUgTk9UIGVuY29kZWQgdG8gUXVvdGVkLVByaW50YWJsZS4KLSAgICAgKiA8L3A+Ci0gICAgICogQGhpZGUgU2hvdWxkIG5vdCBiZSBhdmFpbGFibGUgd29ybGQgd2lkZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBWQ0FSRF9UWVBFX0RPQ09NTyA9Ci0gICAgICAgIChWQ0FSRF9UWVBFX1YyMV9KQVBBTkVTRV9NT0JJTEUgfCBGTEFHX0RPQ09NTyk7Ci0KLSAgICAvKiBwYWNrYWdlICovIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkNBUkRfVFlQRV9ET0NPTU9fU1RSID0gImRvY29tbyI7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGludCBWQ0FSRF9UWVBFX0RFRkFVTFQgPSBWQ0FSRF9UWVBFX1YyMV9HRU5FUklDOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTWFwPFN0cmluZywgSW50ZWdlcj4gc1ZDYXJkVHlwZU1hcDsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTZXQ8SW50ZWdlcj4gc0phcGFuZXNlTW9iaWxlVHlwZVNldDsKLSAgICAKLSAgICBzdGF0aWMgewotICAgICAgICBzVkNhcmRUeXBlTWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBJbnRlZ2VyPigpOwotICAgICAgICBzVkNhcmRUeXBlTWFwLnB1dChWQ0FSRF9UWVBFX1YyMV9HRU5FUklDX1NUUiwgVkNBUkRfVFlQRV9WMjFfR0VORVJJQyk7Ci0gICAgICAgIHNWQ2FyZFR5cGVNYXAucHV0KFZDQVJEX1RZUEVfVjMwX0dFTkVSSUNfU1RSLCBWQ0FSRF9UWVBFX1YzMF9HRU5FUklDKTsKLSAgICAgICAgc1ZDYXJkVHlwZU1hcC5wdXQoVkNBUkRfVFlQRV9WMjFfRVVST1BFX1NUUiwgVkNBUkRfVFlQRV9WMjFfRVVST1BFKTsKLSAgICAgICAgc1ZDYXJkVHlwZU1hcC5wdXQoVkNBUkRfVFlQRV9WMzBfRVVST1BFX1NUUiwgVkNBUkRfVFlQRV9WMzBfRVVST1BFKTsKLSAgICAgICAgc1ZDYXJkVHlwZU1hcC5wdXQoVkNBUkRfVFlQRV9WMjFfSkFQQU5FU0VfU1RSLCBWQ0FSRF9UWVBFX1YyMV9KQVBBTkVTRSk7Ci0gICAgICAgIHNWQ2FyZFR5cGVNYXAucHV0KFZDQVJEX1RZUEVfVjMwX0pBUEFORVNFX1NUUiwgVkNBUkRfVFlQRV9WMzBfSkFQQU5FU0UpOwotICAgICAgICBzVkNhcmRUeXBlTWFwLnB1dChWQ0FSRF9UWVBFX1YyMV9KQVBBTkVTRV9NT0JJTEVfU1RSLCBWQ0FSRF9UWVBFX1YyMV9KQVBBTkVTRV9NT0JJTEUpOwotICAgICAgICBzVkNhcmRUeXBlTWFwLnB1dChWQ0FSRF9UWVBFX0RPQ09NT19TVFIsIFZDQVJEX1RZUEVfRE9DT01PKTsKLQotICAgICAgICBzSmFwYW5lc2VNb2JpbGVUeXBlU2V0ID0gbmV3IEhhc2hTZXQ8SW50ZWdlcj4oKTsKLSAgICAgICAgc0phcGFuZXNlTW9iaWxlVHlwZVNldC5hZGQoVkNBUkRfVFlQRV9WMjFfSkFQQU5FU0UpOwotICAgICAgICBzSmFwYW5lc2VNb2JpbGVUeXBlU2V0LmFkZChWQ0FSRF9UWVBFX1YzMF9KQVBBTkVTRSk7Ci0gICAgICAgIHNKYXBhbmVzZU1vYmlsZVR5cGVTZXQuYWRkKFZDQVJEX1RZUEVfVjIxX0pBUEFORVNFX01PQklMRSk7Ci0gICAgICAgIHNKYXBhbmVzZU1vYmlsZVR5cGVTZXQuYWRkKFZDQVJEX1RZUEVfRE9DT01PKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGludCBnZXRWQ2FyZFR5cGVGcm9tU3RyaW5nKGZpbmFsIFN0cmluZyB2Y2FyZFR5cGVTdHJpbmcpIHsKLSAgICAgICAgZmluYWwgU3RyaW5nIGxvd2VyZWRLZXkgPSB2Y2FyZFR5cGVTdHJpbmcudG9Mb3dlckNhc2UoKTsKLSAgICAgICAgaWYgKHNWQ2FyZFR5cGVNYXAuY29udGFpbnNLZXkobG93ZXJlZEtleSkpIHsKLSAgICAgICAgICAgIHJldHVybiBzVkNhcmRUeXBlTWFwLmdldChsb3dlcmVkS2V5KTsKLSAgICAgICAgfSBlbHNlIGlmICgiZGVmYXVsdCIuZXF1YWxzSWdub3JlQ2FzZSh2Y2FyZFR5cGVTdHJpbmcpKSB7Ci0gICAgICAgICAgICByZXR1cm4gVkNBUkRfVFlQRV9ERUZBVUxUOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgTG9nLmUoTE9HX1RBRywgIlVua25vd24gdkNhcmQgdHlwZSBTdHJpbmc6IFwiIiArIHZjYXJkVHlwZVN0cmluZyArICJcIiIpOwotICAgICAgICAgICAgcmV0dXJuIFZDQVJEX1RZUEVfREVGQVVMVDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1ZlcnNpb24yMShmaW5hbCBpbnQgdmNhcmRUeXBlKSB7Ci0gICAgICAgIHJldHVybiAodmNhcmRUeXBlICYgVkVSU0lPTl9NQVNLKSA9PSBWRVJTSU9OXzIxOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1ZlcnNpb24zMChmaW5hbCBpbnQgdmNhcmRUeXBlKSB7Ci0gICAgICAgIHJldHVybiAodmNhcmRUeXBlICYgVkVSU0lPTl9NQVNLKSA9PSBWRVJTSU9OXzMwOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1ZlcnNpb240MChmaW5hbCBpbnQgdmNhcmRUeXBlKSB7Ci0gICAgICAgIHJldHVybiAodmNhcmRUeXBlICYgVkVSU0lPTl9NQVNLKSA9PSBWRVJTSU9OXzQwOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBzaG91bGRVc2VRdW90ZWRQcmludGFibGUoZmluYWwgaW50IHZjYXJkVHlwZSkgewotICAgICAgICByZXR1cm4gIWlzVmVyc2lvbjMwKHZjYXJkVHlwZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBpbnQgZ2V0TmFtZU9yZGVyVHlwZShmaW5hbCBpbnQgdmNhcmRUeXBlKSB7Ci0gICAgICAgIHJldHVybiB2Y2FyZFR5cGUgJiBOQU1FX09SREVSX01BU0s7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIHVzZXNBbmRyb2lkU3BlY2lmaWNQcm9wZXJ0eShmaW5hbCBpbnQgdmNhcmRUeXBlKSB7Ci0gICAgICAgIHJldHVybiAoKHZjYXJkVHlwZSAmIEZMQUdfVVNFX0FORFJPSURfUFJPUEVSVFkpICE9IDApOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiB1c2VzRGVmYWN0UHJvcGVydHkoZmluYWwgaW50IHZjYXJkVHlwZSkgewotICAgICAgICByZXR1cm4gKCh2Y2FyZFR5cGUgJiBGTEFHX1VTRV9ERUZBQ1RfUFJPUEVSVFkpICE9IDApOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBzaG93UGVyZm9ybWFuY2VMb2coKSB7Ci0gICAgICAgIHJldHVybiAoVkNhcmRDb25maWcuTE9HX0xFVkVMICYgVkNhcmRDb25maWcuTE9HX0xFVkVMX1BFUkZPUk1BTkNFX01FQVNVUkVNRU5UKSAhPSAwOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBzaG91bGRSZWZyYWluUVBUb05hbWVQcm9wZXJ0aWVzKGZpbmFsIGludCB2Y2FyZFR5cGUpIHsKLSAgICAgICByZXR1cm4gKCFzaG91bGRVc2VRdW90ZWRQcmludGFibGUodmNhcmRUeXBlKSB8fAotICAgICAgICAgICAgICAgKCh2Y2FyZFR5cGUgJiBGTEFHX1JFRlJBSU5fUVBfVE9fTkFNRV9QUk9QRVJUSUVTKSAhPSAwKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGFwcGVuZFR5cGVQYXJhbU5hbWUoZmluYWwgaW50IHZjYXJkVHlwZSkgewotICAgICAgICByZXR1cm4gKGlzVmVyc2lvbjMwKHZjYXJkVHlwZSkgfHwgKCh2Y2FyZFR5cGUgJiBGTEFHX0FQUEVORF9UWVBFX1BBUkFNKSAhPSAwKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBkZXZpY2UgaXMgSmFwYW5lc2UgYW5kIHNvbWUgSmFwYW5lc2UgY29udmVuc2lvbiBpcwotICAgICAqIGFwcGxpZWQgdG8gY3JlYXRpbmcgImZvcm1hdHRlZCIgc29tZXRoaW5nIGxpa2UgRk9STUFUVEVEX0FERFJFU1MuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzSmFwYW5lc2VEZXZpY2UoZmluYWwgaW50IHZjYXJkVHlwZSkgewotICAgICAgICAvLyBUT0RPOiBTb21lIG1hc2sgd2lsbCBiZSByZXF1aXJlZCBzbyB0aGF0IHRoaXMgbWV0aG9kIHdyb25nbHkgaW50ZXJwcmV0Ci0gICAgICAgIC8vICAgICAgICBKYXBhbmVzZSItbGlrZSIgdkNhcmQgdHlwZS4KLSAgICAgICAgLy8gICAgICAgIGUuZy4gVkNBUkRfVFlQRV9WMjFfSkFQQU5FU0VfU0pJUyB8IEZMQUdfQVBQRU5EX1RZUEVfUEFSQU1TCi0gICAgICAgIHJldHVybiBzSmFwYW5lc2VNb2JpbGVUeXBlU2V0LmNvbnRhaW5zKHZjYXJkVHlwZSk7Ci0gICAgfQotCi0gICAgLyogcGFja2FnZSAqLyBzdGF0aWMgYm9vbGVhbiByZWZyYWluUGhvbmVOdW1iZXJGb3JtYXR0aW5nKGZpbmFsIGludCB2Y2FyZFR5cGUpIHsKLSAgICAgICAgcmV0dXJuICgodmNhcmRUeXBlICYgRkxBR19SRUZSQUlOX1BIT05FX05VTUJFUl9GT1JNQVRUSU5HKSAhPSAwKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gbmVlZHNUb0NvbnZlcnRQaG9uZXRpY1N0cmluZyhmaW5hbCBpbnQgdmNhcmRUeXBlKSB7Ci0gICAgICAgIHJldHVybiAoKHZjYXJkVHlwZSAmIEZMQUdfQ09OVkVSVF9QSE9ORVRJQ19OQU1FX1NUUklOR1MpICE9IDApOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBvbmx5T25lTm90ZUZpZWxkSXNBdmFpbGFibGUoZmluYWwgaW50IHZjYXJkVHlwZSkgewotICAgICAgICByZXR1cm4gdmNhcmRUeXBlID09IFZDQVJEX1RZUEVfRE9DT01POwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0RvQ29NbyhmaW5hbCBpbnQgdmNhcmRUeXBlKSB7Ci0gICAgICAgIHJldHVybiAoKHZjYXJkVHlwZSAmIEZMQUdfRE9DT01PKSAhPSAwKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIFZDYXJkQ29uZmlnKCkgewotICAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9waW0vdmNhcmQvVkNhcmRDb25zdGFudHMuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3BpbS92Y2FyZC9WQ2FyZENvbnN0YW50cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NjM3MWVmOS4uMDAwMDAwMAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9waW0vdmNhcmQvVkNhcmRDb25zdGFudHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3NSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2UgYW5kcm9pZC5waW0udmNhcmQ7Ci0KLS8qKgotICogQ29uc3RhbnRzIHVzZWQgaW4gYm90aCBleHBvcnRlciBhbmQgaW1wb3J0ZXIgY29kZS4KLSAqLwotcHVibGljIGNsYXNzIFZDYXJkQ29uc3RhbnRzIHsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWRVJTSU9OX1YyMSA9ICIyLjEiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZFUlNJT05fVjMwID0gIjMuMCI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkVSU0lPTl9WNDAgPSAiNC4wIjsKLQotICAgIC8vIFRoZSBwcm9wZXJ0eSBuYW1lcyB2YWxpZCBib3RoIGluIHZDYXJkIDIuMSBhbmQgMy4wLgotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BFUlRZX0JFR0lOID0gIkJFR0lOIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QRVJUWV9WRVJTSU9OID0gIlZFUlNJT04iOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BFUlRZX04gPSAiTiI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVFlfRk4gPSAiRk4iOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BFUlRZX0FEUiA9ICJBRFIiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BFUlRZX0VNQUlMID0gIkVNQUlMIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QRVJUWV9OT1RFID0gIk5PVEUiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BFUlRZX09SRyA9ICJPUkciOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BFUlRZX1NPVU5EID0gIlNPVU5EIjsgIC8vIE5vdCBmdWxseSBzdXBwb3J0ZWQuCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVFlfVEVMID0gIlRFTCI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVFlfVElUTEUgPSAiVElUTEUiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BFUlRZX1JPTEUgPSAiUk9MRSI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVFlfUEhPVE8gPSAiUEhPVE8iOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BFUlRZX0xPR08gPSAiTE9HTyI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVFlfVVJMID0gIlVSTCI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVFlfQkRBWSA9ICJCREFZIjsgIC8vIEJpcnRoZGF5ICgzLjAsIDQuMCkKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QRVJUWV9CSVJUSCA9ICJCSVJUSCI7ICAvLyBQbGFjZSBvZiBiaXJ0aCAoNC4wKQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BFUlRZX0FOTklWRVJTQVJZID0gIkFOTklWRVJTQVJZIjsgIC8vIERhdGUgb2YgbWFycmlhZ2UgKDQuMCkKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QRVJUWV9OQU1FID0gIk5BTUUiOyAgLy8gKDMuMCwgNCwwKQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BFUlRZX05JQ0tOQU1FID0gIk5JQ0tOQU1FIjsgIC8vICgzLjAsIDQuMCkKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QRVJUWV9TT1JUX1NUUklORyA9ICJTT1JULVNUUklORyI7ICAvLyAoMy4wLCA0LjApCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVFlfRU5EID0gIkVORCI7Ci0KLSAgICAvLyBWYWxpZCBwcm9wZXJ0eSBuYW1lcyBub3Qgc3VwcG9ydGVkIChub3QgYXBwcm9wcmlhdGVseSBoYW5kbGVkKSBieSBvdXIgaW1wb3J0ZXIuCi0gICAgLy8gVE9ETzogU2hvdWxkIGJlIHJlbW92ZWQgZnJvbSB0aGUgdmlldyBvZiBtZW1vcnkgZWZmaWNpZW5jeT8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QRVJUWV9SRVYgPSAiUkVWIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QRVJUWV9BR0VOVCA9ICJBR0VOVCI7ICAvLyAoMy4wKQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BFUlRZX0REQVkgPSAiRERBWSI7ICAvLyBEYXRlIG9mIGRlYXRoICg0LjApCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVFlfREVBVEggPSAiREVBVEgiOyAgLy8gUGxhY2Ugb2YgZGVhdGggKDQuMCkKLQotICAgIC8vIEF2YWlsYWJsZSBpbiB2Q2FyZCAzLjAuIFNob3VkIG5vdCB1c2Ugd2hlbiBjb21wb3NpbmcgdkNhcmQgMi4xIGZpbGUuCi0gICAgCi0gICAgLy8gRGUtZmFjdCBwcm9wZXJ0eSB2YWx1ZXMgZXhwcmVzc2luZyBwaG9uZXRpYyBuYW1lcy4KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QRVJUWV9YX1BIT05FVElDX0ZJUlNUX05BTUUgPSAiWC1QSE9ORVRJQy1GSVJTVC1OQU1FIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QRVJUWV9YX1BIT05FVElDX01JRERMRV9OQU1FID0gIlgtUEhPTkVUSUMtTUlERExFLU5BTUUiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BFUlRZX1hfUEhPTkVUSUNfTEFTVF9OQU1FID0gIlgtUEhPTkVUSUMtTEFTVC1OQU1FIjsKLQotICAgIC8vIFByb3BlcnRpZXMgYm90aCBDb250YWN0c1N0cnVjdCBhbmQgZGUtZmFjdCB2Q2FyZCBleHRlbnNpb25zCi0gICAgLy8gU2hvd24gaW4gaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9WQ2FyZCBzdXBwb3J0IGFyZSBkZWZpbmVkIGhlcmUuCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVFlfWF9BSU0gPSAiWC1BSU0iOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BFUlRZX1hfTVNOID0gIlgtTVNOIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QRVJUWV9YX1lBSE9PID0gIlgtWUFIT08iOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BFUlRZX1hfSUNRID0gIlgtSUNRIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QRVJUWV9YX0pBQkJFUiA9ICJYLUpBQkJFUiI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVFlfWF9HT09HTEVfVEFMSyA9ICJYLUdPT0dMRS1UQUxLIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QRVJUWV9YX1NLWVBFX1VTRVJOQU1FID0gIlgtU0tZUEUtVVNFUk5BTUUiOwotICAgIC8vIFByb3BlcnRpZXMgb25seSBDb250YWN0c1N0cnVjdCBoYXMuIFdlIGFsc2UgdXNlIHRoaXMuCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVFlfWF9RUSA9ICJYLVFRIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QRVJUWV9YX05FVE1FRVRJTkcgPSAiWC1ORVRNRUVUSU5HIjsKLQotICAgIC8vIFBob25lIG51bWJlciBmb3IgU2t5cGUsIGF2YWlsYWJsZSBhcyB1c3VhbCBwaG9uZS4KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QRVJUWV9YX1NLWVBFX1BTVE5OVU1CRVIgPSAiWC1TS1lQRS1QU1ROTlVNQkVSIjsKLQotICAgIC8vIFByb3BlcnR5IGZvciBBbmRyb2lkLXNwZWNpZmljIGZpZWxkcy4KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QRVJUWV9YX0FORFJPSURfQ1VTVE9NID0gIlgtQU5EUk9JRC1DVVNUT00iOwotCi0gICAgLy8gUHJvcGVydGllcyBmb3IgRG9Db01vIHZDYXJkLgotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BFUlRZX1hfQ0xBU1MgPSAiWC1DTEFTUyI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVFlfWF9SRURVQ1RJT04gPSAiWC1SRURVQ1RJT04iOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BFUlRZX1hfTk8gPSAiWC1OTyI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVFlfWF9EQ01fSE1OX01PREUgPSAiWC1EQ00tSE1OLU1PREUiOwotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSQU1fVFlQRSA9ICJUWVBFIjsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBUkFNX1RZUEVfSE9NRSA9ICJIT01FIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJBTV9UWVBFX1dPUksgPSAiV09SSyI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSQU1fVFlQRV9GQVggPSAiRkFYIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJBTV9UWVBFX0NFTEwgPSAiQ0VMTCI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSQU1fVFlQRV9WT0lDRSA9ICJWT0lDRSI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSQU1fVFlQRV9JTlRFUk5FVCA9ICJJTlRFUk5FVCI7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJBTV9DSEFSU0VUID0gIkNIQVJTRVQiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBUkFNX0VOQ09ESU5HID0gIkVOQ09ESU5HIjsKLQotICAgIC8vIEFiYnJldmlhdGlvbiBvZiAicHJlZmVyZWQiIGFjY29yZGluZyB0byB2Q2FyZCAyLjEgc3BlY2lmaWNhdGlvbi4KLSAgICAvLyBXZSBpbnRlcnByZXQgdGhpcyB2YWx1ZSBhcyAicHJpbWFyeSIgcHJvcGVydHkgZHVyaW5nIGltcG9ydC9leHBvcnQuCi0gICAgLy8KLSAgICAvLyBOb3RlOiBCb3RoIHZDYXJkIHNwZWNzIGRvZXMgbm90IG1lbnRpb24gYW55dGhpbmcgYWJvdXQgdGhlIHJlcXVpcmVtZW50IGZvciB0aGlzIHBhcmFtZXRlciwKLSAgICAvLyAgICAgICBidXQgdGhlcmUgbWF5IGJlIHNvbWUgdkNhcmQgaW1wb3J0ZXIgd2hpY2ggd2lsbCBnZXQgY29uZnVzZWQgd2l0aCBtb3JlIHRoYW4KLSAgICAvLyAgICAgICBvbmUgIlBSRUYicyBpbiBvbmUgcHJvcGVydHkgbmFtZSwgd2hpbGUgQW5kcm9pZCBhY2NlcHRzIHRoZW0uCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSQU1fVFlQRV9QUkVGID0gIlBSRUYiOwotCi0gICAgLy8gUGhvbmUgdHlwZSBwYXJhbWV0ZXJzIHZhbGlkIGluIHZDYXJkIGFuZCBrbm93biB0byBDb250YWN0c0NvbnRyYWN0LCBidXQgbm90IHNvIGNvbW1vbi4KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJBTV9UWVBFX0NBUiA9ICJDQVIiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBUkFNX1RZUEVfSVNETiA9ICJJU0ROIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJBTV9UWVBFX1BBR0VSID0gIlBBR0VSIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJBTV9UWVBFX1RMWCA9ICJUTFgiOyAgLy8gVGVsZXgKLQotICAgIC8vIFBob25lIHR5cGVzIGV4aXN0aW5nIGluIHZDYXJkIDIuMSBidXQgbm90IGtub3duIHRvIENvbnRhY3RzQ29udHJhY3QuCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSQU1fVFlQRV9NT0RFTSA9ICJNT0RFTSI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSQU1fVFlQRV9NU0cgPSAiTVNHIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJBTV9UWVBFX0JCUyA9ICJCQlMiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBUkFNX1RZUEVfVklERU8gPSAiVklERU8iOwotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSQU1fRU5DT0RJTkdfN0JJVCA9ICI3QklUIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJBTV9FTkNPRElOR184QklUID0gIjhCSVQiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBUkFNX0VOQ09ESU5HX1FQID0gIlFVT1RFRC1QUklOVEFCTEUiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBUkFNX0VOQ09ESU5HX0JBU0U2NCA9ICJCQVNFNjQiOyAgLy8gQXZhaWxhYmxlIGluIHZDYXJkIDIuMQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBUkFNX0VOQ09ESU5HX0IgPSAiQiI7ICAvLyBBdmFpbGFibGUgaW4gdkNhcmQgMy4wCi0KLSAgICAvLyBUWVBFIHBhcmFtZXRlcnMgZm9yIFBob25lcywgd2hpY2ggYXJlIG5vdCBmb3JtYWxseSB2YWxpZCBpbiB2Q2FyZCAoYXQgbGVhc3QgMi4xKS4KLSAgICAvLyBUaGVzZSB0eXBlcyBhcmUgYmFzaWNhbGx5IGVuY29kZWQgdG8gIlgtIiBwYXJhbWV0ZXJzIHdoZW4gY29tcG9zaW5nIHZDYXJkLgotICAgIC8vIFBhcnNlciBwYXNzZXMgdGhlc2Ugd2hlbiAiWC0iIGlzIGFkZGVkIHRvIHRoZSBwYXJhbWV0ZXIgb3Igbm90LgotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBUkFNX1BIT05FX0VYVFJBX1RZUEVfQ0FMTEJBQ0sgPSAiQ0FMTEJBQ0siOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBUkFNX1BIT05FX0VYVFJBX1RZUEVfUkFESU8gPSAiUkFESU8iOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBUkFNX1BIT05FX0VYVFJBX1RZUEVfVFRZX1RERCA9ICJUVFktVEREIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJBTV9QSE9ORV9FWFRSQV9UWVBFX0FTU0lTVEFOVCA9ICJBU1NJU1RBTlQiOwotICAgIC8vIHZDYXJkIGNvbXBvc2VyIHRyYW5zbGF0ZXMgdGhpcyB0eXBlIHRvICJXT1JLIiArICJQUkVGIi4gSnVzdCBmb3IgcGFyc2luZy4KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJBTV9QSE9ORV9FWFRSQV9UWVBFX0NPTVBBTllfTUFJTiA9ICJDT01QQU5ZLU1BSU4iOwotICAgIC8vIHZDYXJkIGNvbXBvc2VyIHRyYW5zbGF0ZXMgdGhpcyB0eXBlIHRvICJWT0lDRSIgSnVzdCBmb3IgcGFyc2luZy4KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJBTV9QSE9ORV9FWFRSQV9UWVBFX09USEVSID0gIk9USEVSIjsKLQotICAgIC8vIFRZUEUgcGFyYW1ldGVycyBmb3IgcG9zdGFsIGFkZHJlc3Nlcy4KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJBTV9BRFJfVFlQRV9QQVJDRUwgPSAiUEFSQ0VMIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJBTV9BRFJfVFlQRV9ET00gPSAiRE9NIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJBTV9BRFJfVFlQRV9JTlRMID0gIklOVEwiOwotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSQU1fTEFOR1VBR0UgPSAiTEFOR1VBR0UiOwotCi0gICAgLy8gU09SVC1BUyBwYXJhbWV0ZXIgaW50cm9kdWNlZCBpbiB2Q2FyZCA0LjAgKGFzIG9mIHJldi4xMykKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJBTV9TT1JUX0FTID0gIlNPUlQtQVMiOwotCi0gICAgLy8gVFlQRSBwYXJhbWV0ZXJzIG5vdCBvZmZpY2lhbGx5IHZhbGlkIGJ1dCB1c2VkIGluIHNvbWUgdkNhcmQgZXhwb3J0ZXIuCi0gICAgLy8gRG8gbm90IHVzZSBpbiBjb21wb3NlciBzaWRlLgotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBUkFNX0VYVFJBX1RZUEVfQ09NUEFOWSA9ICJDT01QQU5ZIjsKLQotICAgIHB1YmxpYyBpbnRlcmZhY2UgSW1wb3J0T25seSB7Ci0gICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BFUlRZX1hfTklDS05BTUUgPSAiWC1OSUNLTkFNRSI7Ci0gICAgICAgIC8vIFNvbWUgZGV2aWNlIGVtaXRzIHRoaXMgIlgtIiBwYXJhbWV0ZXIgZm9yIGV4cHJlc3NpbmcgR29vZ2xlIFRhbGssCi0gICAgICAgIC8vIHdoaWNoIGlzIHNwZWNpZmljYWxseSBpbnZhbGlkIGJ1dCBzaG91bGQgYmUgYWx3YXlzIHByb3Blcmx5IGFjY2VwdGVkLCBhbmQgZW1pdHRlZAotICAgICAgICAvLyBpbiBzb21lIHNwZWNpYWwgY2FzZSAoZm9yIHRoYXQgZGV2aWNlL2FwcGxpY2F0aW9uKS4KLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVFlfWF9HT09HTEVfVEFMS19XSVRIX1NQQUNFID0gIlgtR09PR0xFIFRBTEsiOwotICAgIH0KLQotICAgIC8vLy8gTWFpbmx5IGZvciBwYWNrYWdlIGNvbnN0YW50cy4KLQotICAgIC8vIERvQ29NbyBzcGVjaWZpYyB0eXBlIHBhcmFtZXRlci4gVXNlZCB3aXRoICJTT1VORCIgcHJvcGVydHksIHdoaWNoIGlzIGFsdGVybmF0ZSBvZgotICAgIC8vIFNPUlQtU1RSSU5HIGludkNhcmQgMy4wLgotICAgIC8qIHBhY2thZ2UgKi8gc3RhdGljIGZpbmFsIFN0cmluZyBQQVJBTV9UWVBFX1hfSVJNQ19OID0gIlgtSVJNQy1OIjsKLQotICAgIC8vIFVzZWQgaW4gdW5pdCB0ZXN0LgotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1BWF9EQVRBX0NPTFVNTiA9IDE1OwotCi0gICAgLyogcGFja2FnZSAqLyBzdGF0aWMgZmluYWwgaW50IE1BWF9DSEFSQUNURVJfTlVNU19RUCA9IDc2OwotICAgIHN0YXRpYyBmaW5hbCBpbnQgTUFYX0NIQVJBQ1RFUl9OVU1TX0JBU0U2NF9WMzAgPSA3NTsKLQotICAgIHByaXZhdGUgVkNhcmRDb25zdGFudHMoKSB7Ci0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3BpbS92Y2FyZC9WQ2FyZEVudHJ5LmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9waW0vdmNhcmQvVkNhcmRFbnRyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NGY3YzVmLi4wMDAwMDAwCi0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3BpbS92Y2FyZC9WQ2FyZEVudHJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDkzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBhbmRyb2lkLnBpbS52Y2FyZDsKLQotaW1wb3J0IGFuZHJvaWQuYWNjb3VudHMuQWNjb3VudDsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFByb3ZpZGVyT3BlcmF0aW9uOwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZW50UHJvdmlkZXJSZXN1bHQ7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRSZXNvbHZlcjsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuT3BlcmF0aW9uQXBwbGljYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgYW5kcm9pZC5uZXQuVXJpOwotaW1wb3J0IGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uOwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdDsKLWltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuQ29udGFjdHM7Ci1pbXBvcnQgYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0LkRhdGE7Ci1pbXBvcnQgYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0LlJhd0NvbnRhY3RzOwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5Db21tb25EYXRhS2luZHMuRW1haWw7Ci1pbXBvcnQgYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0LkNvbW1vbkRhdGFLaW5kcy5FdmVudDsKLWltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuQ29tbW9uRGF0YUtpbmRzLkdyb3VwTWVtYmVyc2hpcDsKLWltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuQ29tbW9uRGF0YUtpbmRzLkltOwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5Db21tb25EYXRhS2luZHMuTmlja25hbWU7Ci1pbXBvcnQgYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0LkNvbW1vbkRhdGFLaW5kcy5Ob3RlOwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5Db21tb25EYXRhS2luZHMuT3JnYW5pemF0aW9uOwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5Db21tb25EYXRhS2luZHMuUGhvbmU7Ci1pbXBvcnQgYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0LkNvbW1vbkRhdGFLaW5kcy5QaG90bzsKLWltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuQ29tbW9uRGF0YUtpbmRzLlN0cnVjdHVyZWROYW1lOwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5Db21tb25EYXRhS2luZHMuU3RydWN0dXJlZFBvc3RhbDsKLWltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuQ29tbW9uRGF0YUtpbmRzLldlYnNpdGU7Ci1pbXBvcnQgYW5kcm9pZC50ZWxlcGhvbnkuUGhvbmVOdW1iZXJVdGlsczsKLWltcG9ydCBhbmRyb2lkLnRleHQuVGV4dFV0aWxzOwotaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLS8qKgotICogVGhpcyBjbGFzcyBicmlkZ2VzIGJldHdlZW4gZGF0YSBzdHJ1Y3R1cmUgb2YgQ29udGFjdCBhcHAgYW5kIFZDYXJkIGRhdGEuCi0gKi8KLXB1YmxpYyBjbGFzcyBWQ2FyZEVudHJ5IHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTE9HX1RBRyA9ICJWQ2FyZEVudHJ5IjsKLQotICAgIHByaXZhdGUgZmluYWwgc3RhdGljIGludCBERUZBVUxUX09SR0FOSVpBVElPTl9UWVBFID0gT3JnYW5pemF0aW9uLlRZUEVfV09SSzsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIE1hcDxTdHJpbmcsIEludGVnZXI+IHNJbU1hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgSW50ZWdlcj4oKTsKLQotICAgIHN0YXRpYyB7Ci0gICAgICAgIHNJbU1hcC5wdXQoVkNhcmRDb25zdGFudHMuUFJPUEVSVFlfWF9BSU0sIEltLlBST1RPQ09MX0FJTSk7Ci0gICAgICAgIHNJbU1hcC5wdXQoVkNhcmRDb25zdGFudHMuUFJPUEVSVFlfWF9NU04sIEltLlBST1RPQ09MX01TTik7Ci0gICAgICAgIHNJbU1hcC5wdXQoVkNhcmRDb25zdGFudHMuUFJPUEVSVFlfWF9ZQUhPTywgSW0uUFJPVE9DT0xfWUFIT08pOwotICAgICAgICBzSW1NYXAucHV0KFZDYXJkQ29uc3RhbnRzLlBST1BFUlRZX1hfSUNRLCBJbS5QUk9UT0NPTF9JQ1EpOwotICAgICAgICBzSW1NYXAucHV0KFZDYXJkQ29uc3RhbnRzLlBST1BFUlRZX1hfSkFCQkVSLCBJbS5QUk9UT0NPTF9KQUJCRVIpOwotICAgICAgICBzSW1NYXAucHV0KFZDYXJkQ29uc3RhbnRzLlBST1BFUlRZX1hfU0tZUEVfVVNFUk5BTUUsIEltLlBST1RPQ09MX1NLWVBFKTsKLSAgICAgICAgc0ltTWFwLnB1dChWQ2FyZENvbnN0YW50cy5QUk9QRVJUWV9YX0dPT0dMRV9UQUxLLCBJbS5QUk9UT0NPTF9HT09HTEVfVEFMSyk7Ci0gICAgICAgIHNJbU1hcC5wdXQoVkNhcmRDb25zdGFudHMuSW1wb3J0T25seS5QUk9QRVJUWV9YX0dPT0dMRV9UQUxLX1dJVEhfU1BBQ0UsCi0gICAgICAgICAgICAgICAgSW0uUFJPVE9DT0xfR09PR0xFX1RBTEspOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUGhvbmVEYXRhIHsKLSAgICAgICAgcHVibGljIGZpbmFsIGludCB0eXBlOwotICAgICAgICBwdWJsaWMgZmluYWwgU3RyaW5nIGRhdGE7Ci0gICAgICAgIHB1YmxpYyBmaW5hbCBTdHJpbmcgbGFiZWw7Ci0gICAgICAgIC8vIGlzUHJpbWFyeSBpcyAobm90IGZpbmFsIGJ1dCkgY2hhbmdhYmxlLCBvbmx5IHdoZW4gdGhlcmUncyBubyBhcHByb3ByaWF0ZSBvbmUgZXhpc3RpbmcKLSAgICAgICAgLy8gaW4gdGhlIG9yaWdpbmFsIFZDYXJkLgotICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc1ByaW1hcnk7Ci0gICAgICAgIHB1YmxpYyBQaG9uZURhdGEoaW50IHR5cGUsIFN0cmluZyBkYXRhLCBTdHJpbmcgbGFiZWwsIGJvb2xlYW4gaXNQcmltYXJ5KSB7Ci0gICAgICAgICAgICB0aGlzLnR5cGUgPSB0eXBlOwotICAgICAgICAgICAgdGhpcy5kYXRhID0gZGF0YTsKLSAgICAgICAgICAgIHRoaXMubGFiZWwgPSBsYWJlbDsKLSAgICAgICAgICAgIHRoaXMuaXNQcmltYXJ5ID0gaXNQcmltYXJ5OwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7Ci0gICAgICAgICAgICBpZiAoIShvYmogaW5zdGFuY2VvZiBQaG9uZURhdGEpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgUGhvbmVEYXRhIHBob25lRGF0YSA9IChQaG9uZURhdGEpb2JqOwotICAgICAgICAgICAgcmV0dXJuICh0eXBlID09IHBob25lRGF0YS50eXBlICYmIGRhdGEuZXF1YWxzKHBob25lRGF0YS5kYXRhKSAmJgotICAgICAgICAgICAgICAgICAgICBsYWJlbC5lcXVhbHMocGhvbmVEYXRhLmxhYmVsKSAmJiBpc1ByaW1hcnkgPT0gcGhvbmVEYXRhLmlzUHJpbWFyeSk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAgICAgICAgIHJldHVybiBTdHJpbmcuZm9ybWF0KCJ0eXBlOiAlZCwgZGF0YTogJXMsIGxhYmVsOiAlcywgaXNQcmltYXJ5OiAlcyIsCi0gICAgICAgICAgICAgICAgICAgIHR5cGUsIGRhdGEsIGxhYmVsLCBpc1ByaW1hcnkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBjbGFzcyBFbWFpbERhdGEgewotICAgICAgICBwdWJsaWMgZmluYWwgaW50IHR5cGU7Ci0gICAgICAgIHB1YmxpYyBmaW5hbCBTdHJpbmcgZGF0YTsKLSAgICAgICAgLy8gVXNlZCBvbmx5IHdoZW4gVFlQRSBpcyBUWVBFX0NVU1RPTS4KLSAgICAgICAgcHVibGljIGZpbmFsIFN0cmluZyBsYWJlbDsKLSAgICAgICAgcHVibGljIGJvb2xlYW4gaXNQcmltYXJ5OwotICAgICAgICBwdWJsaWMgRW1haWxEYXRhKGludCB0eXBlLCBTdHJpbmcgZGF0YSwgU3RyaW5nIGxhYmVsLCBib29sZWFuIGlzUHJpbWFyeSkgewotICAgICAgICAgICAgdGhpcy50eXBlID0gdHlwZTsKLSAgICAgICAgICAgIHRoaXMuZGF0YSA9IGRhdGE7Ci0gICAgICAgICAgICB0aGlzLmxhYmVsID0gbGFiZWw7Ci0gICAgICAgICAgICB0aGlzLmlzUHJpbWFyeSA9IGlzUHJpbWFyeTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgewotICAgICAgICAgICAgaWYgKCEob2JqIGluc3RhbmNlb2YgRW1haWxEYXRhKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIEVtYWlsRGF0YSBlbWFpbERhdGEgPSAoRW1haWxEYXRhKW9iajsKLSAgICAgICAgICAgIHJldHVybiAodHlwZSA9PSBlbWFpbERhdGEudHlwZSAmJiBkYXRhLmVxdWFscyhlbWFpbERhdGEuZGF0YSkgJiYKLSAgICAgICAgICAgICAgICAgICAgbGFiZWwuZXF1YWxzKGVtYWlsRGF0YS5sYWJlbCkgJiYgaXNQcmltYXJ5ID09IGVtYWlsRGF0YS5pc1ByaW1hcnkpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgICAgICAgICByZXR1cm4gU3RyaW5nLmZvcm1hdCgidHlwZTogJWQsIGRhdGE6ICVzLCBsYWJlbDogJXMsIGlzUHJpbWFyeTogJXMiLAotICAgICAgICAgICAgICAgICAgICB0eXBlLCBkYXRhLCBsYWJlbCwgaXNQcmltYXJ5KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUG9zdGFsRGF0YSB7Ci0gICAgICAgIC8vIERldGVybWluZWQgYnkgdkNhcmQgc3BlY2lmaWNhdGlvbi4KLSAgICAgICAgLy8gLSBQTyBCb3gsIEV4dGVuZGVkIEFkZHIsIFN0cmVldCwgTG9jYWxpdHksIFJlZ2lvbiwgUG9zdGFsIENvZGUsIENvdW50cnkgTmFtZQotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBRERSX01BWF9EQVRBX1NJWkUgPSA3OwotICAgICAgICBwcml2YXRlIGZpbmFsIFN0cmluZ1tdIGRhdGFBcnJheTsKLSAgICAgICAgcHVibGljIGZpbmFsIFN0cmluZyBwb2JveDsKLSAgICAgICAgcHVibGljIGZpbmFsIFN0cmluZyBleHRlbmRlZEFkZHJlc3M7Ci0gICAgICAgIHB1YmxpYyBmaW5hbCBTdHJpbmcgc3RyZWV0OwotICAgICAgICBwdWJsaWMgZmluYWwgU3RyaW5nIGxvY2FsdHk7Ci0gICAgICAgIHB1YmxpYyBmaW5hbCBTdHJpbmcgcmVnaW9uOwotICAgICAgICBwdWJsaWMgZmluYWwgU3RyaW5nIHBvc3RhbENvZGU7Ci0gICAgICAgIHB1YmxpYyBmaW5hbCBTdHJpbmcgY291bnRyeTsKLSAgICAgICAgcHVibGljIGZpbmFsIGludCB0eXBlOwotICAgICAgICBwdWJsaWMgZmluYWwgU3RyaW5nIGxhYmVsOwotICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc1ByaW1hcnk7Ci0KLSAgICAgICAgcHVibGljIFBvc3RhbERhdGEoZmluYWwgaW50IHR5cGUsIGZpbmFsIExpc3Q8U3RyaW5nPiBwcm9wVmFsdWVMaXN0LAotICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBsYWJlbCwgYm9vbGVhbiBpc1ByaW1hcnkpIHsKLSAgICAgICAgICAgIHRoaXMudHlwZSA9IHR5cGU7Ci0gICAgICAgICAgICBkYXRhQXJyYXkgPSBuZXcgU3RyaW5nW0FERFJfTUFYX0RBVEFfU0laRV07Ci0KLSAgICAgICAgICAgIGludCBzaXplID0gcHJvcFZhbHVlTGlzdC5zaXplKCk7Ci0gICAgICAgICAgICBpZiAoc2l6ZSA+IEFERFJfTUFYX0RBVEFfU0laRSkgewotICAgICAgICAgICAgICAgIHNpemUgPSBBRERSX01BWF9EQVRBX1NJWkU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIGFkci12YWx1ZSA9IDAqNih0ZXh0LXZhbHVlICI7IikgdGV4dC12YWx1ZQotICAgICAgICAgICAgLy8gICAgICAgICAgIDsgUE8gQm94LCBFeHRlbmRlZCBBZGRyZXNzLCBTdHJlZXQsIExvY2FsaXR5LCBSZWdpb24sIFBvc3RhbAotICAgICAgICAgICAgLy8gICAgICAgICAgIDsgQ29kZSwgQ291bnRyeSBOYW1lCi0gICAgICAgICAgICAvLwotICAgICAgICAgICAgLy8gVXNlIEl0ZXJhdG9yIGFzc3VtaW5nIExpc3QgbWF5IGJlIExpbmtlZExpc3QsIHRob3VnaCBhY3R1YWxseSBpdCBpcwotICAgICAgICAgICAgLy8gYWx3YXlzIEFycmF5TGlzdCBpbiB0aGUgY3VycmVudCBpbXBsZW1lbnRhdGlvbi4KLSAgICAgICAgICAgIGludCBpID0gMDsKLSAgICAgICAgICAgIGZvciAoU3RyaW5nIGFkZHJlc3NFbGVtZW50IDogcHJvcFZhbHVlTGlzdCkgewotICAgICAgICAgICAgICAgIGRhdGFBcnJheVtpXSA9IGFkZHJlc3NFbGVtZW50OwotICAgICAgICAgICAgICAgIGlmICgrK2kgPj0gc2l6ZSkgewotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB3aGlsZSAoaSA8IEFERFJfTUFYX0RBVEFfU0laRSkgewotICAgICAgICAgICAgICAgIGRhdGFBcnJheVtpKytdID0gbnVsbDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgdGhpcy5wb2JveCA9IGRhdGFBcnJheVswXTsKLSAgICAgICAgICAgIHRoaXMuZXh0ZW5kZWRBZGRyZXNzID0gZGF0YUFycmF5WzFdOwotICAgICAgICAgICAgdGhpcy5zdHJlZXQgPSBkYXRhQXJyYXlbMl07Ci0gICAgICAgICAgICB0aGlzLmxvY2FsdHkgPSBkYXRhQXJyYXlbM107Ci0gICAgICAgICAgICB0aGlzLnJlZ2lvbiA9IGRhdGFBcnJheVs0XTsKLSAgICAgICAgICAgIHRoaXMucG9zdGFsQ29kZSA9IGRhdGFBcnJheVs1XTsKLSAgICAgICAgICAgIHRoaXMuY291bnRyeSA9IGRhdGFBcnJheVs2XTsKLSAgICAgICAgICAgIHRoaXMubGFiZWwgPSBsYWJlbDsKLSAgICAgICAgICAgIHRoaXMuaXNQcmltYXJ5ID0gaXNQcmltYXJ5OwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7Ci0gICAgICAgICAgICBpZiAoIShvYmogaW5zdGFuY2VvZiBQb3N0YWxEYXRhKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZpbmFsIFBvc3RhbERhdGEgcG9zdGFsRGF0YSA9IChQb3N0YWxEYXRhKW9iajsKLSAgICAgICAgICAgIHJldHVybiAoQXJyYXlzLmVxdWFscyhkYXRhQXJyYXksIHBvc3RhbERhdGEuZGF0YUFycmF5KSAmJgotICAgICAgICAgICAgICAgICAgICAodHlwZSA9PSBwb3N0YWxEYXRhLnR5cGUgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAodHlwZSA9PSBTdHJ1Y3R1cmVkUG9zdGFsLlRZUEVfQ1VTVE9NID8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChsYWJlbCA9PSBwb3N0YWxEYXRhLmxhYmVsKSA6IHRydWUpKSAmJgotICAgICAgICAgICAgICAgICAgICAoaXNQcmltYXJ5ID09IHBvc3RhbERhdGEuaXNQcmltYXJ5KSk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgU3RyaW5nIGdldEZvcm1hdHRlZEFkZHJlc3MoZmluYWwgaW50IHZjYXJkVHlwZSkgewotICAgICAgICAgICAgU3RyaW5nQnVpbGRlciBidWlsZGVyID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLSAgICAgICAgICAgIGJvb2xlYW4gZW1wdHkgPSB0cnVlOwotICAgICAgICAgICAgaWYgKFZDYXJkQ29uZmlnLmlzSmFwYW5lc2VEZXZpY2UodmNhcmRUeXBlKSkgewotICAgICAgICAgICAgICAgIC8vIEluIEphcGFuLCB0aGUgb3JkZXIgaXMgcmV2ZXJzZWQuCi0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IEFERFJfTUFYX0RBVEFfU0laRSAtIDE7IGkgPj0gMDsgaS0tKSB7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBhZGRyZXNzUGFydCA9IGRhdGFBcnJheVtpXTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCFUZXh0VXRpbHMuaXNFbXB0eShhZGRyZXNzUGFydCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZW1wdHkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWlsZGVyLmFwcGVuZCgnICcpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbXB0eSA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoYWRkcmVzc1BhcnQpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IEFERFJfTUFYX0RBVEFfU0laRTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBhZGRyZXNzUGFydCA9IGRhdGFBcnJheVtpXTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCFUZXh0VXRpbHMuaXNFbXB0eShhZGRyZXNzUGFydCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZW1wdHkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWlsZGVyLmFwcGVuZCgnICcpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbXB0eSA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoYWRkcmVzc1BhcnQpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gYnVpbGRlci50b1N0cmluZygpLnRyaW0oKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICAgICAgcmV0dXJuIFN0cmluZy5mb3JtYXQoInR5cGU6ICVkLCBsYWJlbDogJXMsIGlzUHJpbWFyeTogJXMiLAotICAgICAgICAgICAgICAgICAgICB0eXBlLCBsYWJlbCwgaXNQcmltYXJ5KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgT3JnYW5pemF0aW9uRGF0YSB7Ci0gICAgICAgIHB1YmxpYyBmaW5hbCBpbnQgdHlwZTsKLSAgICAgICAgLy8gbm9uLWZpbmFsIGlzIEludGVudGlvbmFsOiB3ZSBtYXkgY2hhbmdlIHRoZSB2YWx1ZXMgc2luY2UgdGhpcyBpbmZvIGlzIHNlcGFyYXRlZCBpbnRvCi0gICAgICAgIC8vIHR3byBwYXJ0cyBpbiB2Q2FyZDogIk9SRyIgKyAiVElUTEUiLCBhbmQgd2UgaGF2ZSB0byBjb3BlIHdpdGggZWFjaCBmaWVsZCBpbgotICAgICAgICAvLyBkaWZmZXJlbnQgdGltaW5nLgotICAgICAgICBwdWJsaWMgU3RyaW5nIGNvbXBhbnlOYW1lOwotICAgICAgICBwdWJsaWMgU3RyaW5nIGRlcGFydG1lbnROYW1lOwotICAgICAgICBwdWJsaWMgU3RyaW5nIHRpdGxlTmFtZTsKLSAgICAgICAgcHVibGljIGZpbmFsIFN0cmluZyBwaG9uZXRpY05hbWU7ICAvLyBXZSB3b24ndCBoYXZlIHRoaXMgaW4gIlRJVExFIiBwcm9wZXJ0eS4KLSAgICAgICAgcHVibGljIGJvb2xlYW4gaXNQcmltYXJ5OwotCi0gICAgICAgIHB1YmxpYyBPcmdhbml6YXRpb25EYXRhKGludCB0eXBlLAotICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBjb21wYW55TmFtZSwKLSAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgZGVwYXJ0bWVudE5hbWUsCi0gICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIHRpdGxlTmFtZSwKLSAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgcGhvbmV0aWNOYW1lLAotICAgICAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gaXNQcmltYXJ5KSB7Ci0gICAgICAgICAgICB0aGlzLnR5cGUgPSB0eXBlOwotICAgICAgICAgICAgdGhpcy5jb21wYW55TmFtZSA9IGNvbXBhbnlOYW1lOwotICAgICAgICAgICAgdGhpcy5kZXBhcnRtZW50TmFtZSA9IGRlcGFydG1lbnROYW1lOwotICAgICAgICAgICAgdGhpcy50aXRsZU5hbWUgPSB0aXRsZU5hbWU7Ci0gICAgICAgICAgICB0aGlzLnBob25ldGljTmFtZSA9IHBob25ldGljTmFtZTsKLSAgICAgICAgICAgIHRoaXMuaXNQcmltYXJ5ID0gaXNQcmltYXJ5OwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7Ci0gICAgICAgICAgICBpZiAoIShvYmogaW5zdGFuY2VvZiBPcmdhbml6YXRpb25EYXRhKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIE9yZ2FuaXphdGlvbkRhdGEgb3JnYW5pemF0aW9uID0gKE9yZ2FuaXphdGlvbkRhdGEpb2JqOwotICAgICAgICAgICAgcmV0dXJuICh0eXBlID09IG9yZ2FuaXphdGlvbi50eXBlICYmCi0gICAgICAgICAgICAgICAgICAgIFRleHRVdGlscy5lcXVhbHMoY29tcGFueU5hbWUsIG9yZ2FuaXphdGlvbi5jb21wYW55TmFtZSkgJiYKLSAgICAgICAgICAgICAgICAgICAgVGV4dFV0aWxzLmVxdWFscyhkZXBhcnRtZW50TmFtZSwgb3JnYW5pemF0aW9uLmRlcGFydG1lbnROYW1lKSAmJgotICAgICAgICAgICAgICAgICAgICBUZXh0VXRpbHMuZXF1YWxzKHRpdGxlTmFtZSwgb3JnYW5pemF0aW9uLnRpdGxlTmFtZSkgJiYKLSAgICAgICAgICAgICAgICAgICAgaXNQcmltYXJ5ID09IG9yZ2FuaXphdGlvbi5pc1ByaW1hcnkpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIFN0cmluZyBnZXRGb3JtYXR0ZWRTdHJpbmcoKSB7Ci0gICAgICAgICAgICBmaW5hbCBTdHJpbmdCdWlsZGVyIGJ1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotICAgICAgICAgICAgaWYgKCFUZXh0VXRpbHMuaXNFbXB0eShjb21wYW55TmFtZSkpIHsKLSAgICAgICAgICAgICAgICBidWlsZGVyLmFwcGVuZChjb21wYW55TmFtZSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmICghVGV4dFV0aWxzLmlzRW1wdHkoZGVwYXJ0bWVudE5hbWUpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGJ1aWxkZXIubGVuZ3RoKCkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKCIsICIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBidWlsZGVyLmFwcGVuZChkZXBhcnRtZW50TmFtZSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmICghVGV4dFV0aWxzLmlzRW1wdHkodGl0bGVOYW1lKSkgewotICAgICAgICAgICAgICAgIGlmIChidWlsZGVyLmxlbmd0aCgpID4gMCkgewotICAgICAgICAgICAgICAgICAgICBidWlsZGVyLmFwcGVuZCgiLCAiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQodGl0bGVOYW1lKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmV0dXJuIGJ1aWxkZXIudG9TdHJpbmcoKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICAgICAgcmV0dXJuIFN0cmluZy5mb3JtYXQoCi0gICAgICAgICAgICAgICAgICAgICJ0eXBlOiAlZCwgY29tcGFueTogJXMsIGRlcGFydG1lbnQ6ICVzLCB0aXRsZTogJXMsIGlzUHJpbWFyeTogJXMiLAotICAgICAgICAgICAgICAgICAgICB0eXBlLCBjb21wYW55TmFtZSwgZGVwYXJ0bWVudE5hbWUsIHRpdGxlTmFtZSwgaXNQcmltYXJ5KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgSW1EYXRhIHsKLSAgICAgICAgcHVibGljIGZpbmFsIGludCBwcm90b2NvbDsKLSAgICAgICAgcHVibGljIGZpbmFsIFN0cmluZyBjdXN0b21Qcm90b2NvbDsKLSAgICAgICAgcHVibGljIGZpbmFsIGludCB0eXBlOwotICAgICAgICBwdWJsaWMgZmluYWwgU3RyaW5nIGRhdGE7Ci0gICAgICAgIHB1YmxpYyBmaW5hbCBib29sZWFuIGlzUHJpbWFyeTsKLQotICAgICAgICBwdWJsaWMgSW1EYXRhKGZpbmFsIGludCBwcm90b2NvbCwgZmluYWwgU3RyaW5nIGN1c3RvbVByb3RvY29sLCBmaW5hbCBpbnQgdHlwZSwKLSAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgZGF0YSwgZmluYWwgYm9vbGVhbiBpc1ByaW1hcnkpIHsKLSAgICAgICAgICAgIHRoaXMucHJvdG9jb2wgPSBwcm90b2NvbDsKLSAgICAgICAgICAgIHRoaXMuY3VzdG9tUHJvdG9jb2wgPSBjdXN0b21Qcm90b2NvbDsKLSAgICAgICAgICAgIHRoaXMudHlwZSA9IHR5cGU7Ci0gICAgICAgICAgICB0aGlzLmRhdGEgPSBkYXRhOwotICAgICAgICAgICAgdGhpcy5pc1ByaW1hcnkgPSBpc1ByaW1hcnk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKLSAgICAgICAgICAgIGlmICghKG9iaiBpbnN0YW5jZW9mIEltRGF0YSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBJbURhdGEgaW1EYXRhID0gKEltRGF0YSlvYmo7Ci0gICAgICAgICAgICByZXR1cm4gKHR5cGUgPT0gaW1EYXRhLnR5cGUgJiYgcHJvdG9jb2wgPT0gaW1EYXRhLnByb3RvY29sCi0gICAgICAgICAgICAgICAgICAgICYmIChjdXN0b21Qcm90b2NvbCAhPSBudWxsID8gY3VzdG9tUHJvdG9jb2wuZXF1YWxzKGltRGF0YS5jdXN0b21Qcm90b2NvbCkgOgotICAgICAgICAgICAgICAgICAgICAgICAgKGltRGF0YS5jdXN0b21Qcm90b2NvbCA9PSBudWxsKSkKLSAgICAgICAgICAgICAgICAgICAgJiYgKGRhdGEgIT0gbnVsbCA/IGRhdGEuZXF1YWxzKGltRGF0YS5kYXRhKSA6IChpbURhdGEuZGF0YSA9PSBudWxsKSkKLSAgICAgICAgICAgICAgICAgICAgJiYgaXNQcmltYXJ5ID09IGltRGF0YS5pc1ByaW1hcnkpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgICAgICAgICByZXR1cm4gU3RyaW5nLmZvcm1hdCgKLSAgICAgICAgICAgICAgICAgICAgInR5cGU6ICVkLCBwcm90b2NvbDogJWQsIGN1c3RvbV9wcm90Y29sOiAlcywgZGF0YTogJXMsIGlzUHJpbWFyeTogJXMiLAotICAgICAgICAgICAgICAgICAgICB0eXBlLCBwcm90b2NvbCwgY3VzdG9tUHJvdG9jb2wsIGRhdGEsIGlzUHJpbWFyeSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFBob3RvRGF0YSB7Ci0gICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZPUk1BVF9GTEFTSCA9ICJTV0YiOwotICAgICAgICBwdWJsaWMgZmluYWwgaW50IHR5cGU7Ci0gICAgICAgIHB1YmxpYyBmaW5hbCBTdHJpbmcgZm9ybWF0TmFtZTsgIC8vIHVzZWQgd2hlbiB0eXBlIGlzIG5vdCBkZWZpbmVkIGluIENvbnRhY3RzQ29udHJhY3QuCi0gICAgICAgIHB1YmxpYyBmaW5hbCBieXRlW10gcGhvdG9CeXRlczsKLSAgICAgICAgcHVibGljIGZpbmFsIGJvb2xlYW4gaXNQcmltYXJ5OwotCi0gICAgICAgIHB1YmxpYyBQaG90b0RhdGEoaW50IHR5cGUsIFN0cmluZyBmb3JtYXROYW1lLCBieXRlW10gcGhvdG9CeXRlcywgYm9vbGVhbiBpc1ByaW1hcnkpIHsKLSAgICAgICAgICAgIHRoaXMudHlwZSA9IHR5cGU7Ci0gICAgICAgICAgICB0aGlzLmZvcm1hdE5hbWUgPSBmb3JtYXROYW1lOwotICAgICAgICAgICAgdGhpcy5waG90b0J5dGVzID0gcGhvdG9CeXRlczsKLSAgICAgICAgICAgIHRoaXMuaXNQcmltYXJ5ID0gaXNQcmltYXJ5OwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7Ci0gICAgICAgICAgICBpZiAoIShvYmogaW5zdGFuY2VvZiBQaG90b0RhdGEpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgUGhvdG9EYXRhIHBob3RvRGF0YSA9IChQaG90b0RhdGEpb2JqOwotICAgICAgICAgICAgcmV0dXJuICh0eXBlID09IHBob3RvRGF0YS50eXBlICYmCi0gICAgICAgICAgICAgICAgICAgIChmb3JtYXROYW1lID09IG51bGwgPyAocGhvdG9EYXRhLmZvcm1hdE5hbWUgPT0gbnVsbCkgOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdE5hbWUuZXF1YWxzKHBob3RvRGF0YS5mb3JtYXROYW1lKSkgJiYKLSAgICAgICAgICAgICAgICAgICAgKEFycmF5cy5lcXVhbHMocGhvdG9CeXRlcywgcGhvdG9EYXRhLnBob3RvQnl0ZXMpKSAmJgotICAgICAgICAgICAgICAgICAgICAoaXNQcmltYXJ5ID09IHBob3RvRGF0YS5pc1ByaW1hcnkpKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICAgICAgcmV0dXJuIFN0cmluZy5mb3JtYXQoInR5cGU6ICVkLCBmb3JtYXQ6ICVzOiBzaXplOiAlZCwgaXNQcmltYXJ5OiAlcyIsCi0gICAgICAgICAgICAgICAgICAgIHR5cGUsIGZvcm1hdE5hbWUsIHBob3RvQnl0ZXMubGVuZ3RoLCBpc1ByaW1hcnkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyogcGFja2FnZSAqLyBzdGF0aWMgY2xhc3MgUHJvcGVydHkgewotICAgICAgICBwcml2YXRlIFN0cmluZyBtUHJvcGVydHlOYW1lOwotICAgICAgICBwcml2YXRlIE1hcDxTdHJpbmcsIENvbGxlY3Rpb248U3RyaW5nPj4gbVBhcmFtZXRlck1hcCA9Ci0gICAgICAgICAgICBuZXcgSGFzaE1hcDxTdHJpbmcsIENvbGxlY3Rpb248U3RyaW5nPj4oKTsKLSAgICAgICAgcHJpdmF0ZSBMaXN0PFN0cmluZz4gbVByb3BlcnR5VmFsdWVMaXN0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0gICAgICAgIHByaXZhdGUgYnl0ZVtdIG1Qcm9wZXJ0eUJ5dGVzOwotCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldFByb3BlcnR5TmFtZShmaW5hbCBTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0gICAgICAgICAgICBtUHJvcGVydHlOYW1lID0gcHJvcGVydHlOYW1lOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgYWRkUGFyYW1ldGVyKGZpbmFsIFN0cmluZyBwYXJhbU5hbWUsIGZpbmFsIFN0cmluZyBwYXJhbVZhbHVlKSB7Ci0gICAgICAgICAgICBDb2xsZWN0aW9uPFN0cmluZz4gdmFsdWVzOwotICAgICAgICAgICAgaWYgKCFtUGFyYW1ldGVyTWFwLmNvbnRhaW5zS2V5KHBhcmFtTmFtZSkpIHsKLSAgICAgICAgICAgICAgICBpZiAocGFyYW1OYW1lLmVxdWFscygiVFlQRSIpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHZhbHVlcyA9IG5ldyBIYXNoU2V0PFN0cmluZz4oKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbVBhcmFtZXRlck1hcC5wdXQocGFyYW1OYW1lLCB2YWx1ZXMpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB2YWx1ZXMgPSBtUGFyYW1ldGVyTWFwLmdldChwYXJhbU5hbWUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdmFsdWVzLmFkZChwYXJhbVZhbHVlKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIGFkZFRvUHJvcGVydHlWYWx1ZUxpc3QoZmluYWwgU3RyaW5nIHByb3BlcnR5VmFsdWUpIHsKLSAgICAgICAgICAgIG1Qcm9wZXJ0eVZhbHVlTGlzdC5hZGQocHJvcGVydHlWYWx1ZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBzZXRQcm9wZXJ0eUJ5dGVzKGZpbmFsIGJ5dGVbXSBwcm9wZXJ0eUJ5dGVzKSB7Ci0gICAgICAgICAgICBtUHJvcGVydHlCeXRlcyA9IHByb3BlcnR5Qnl0ZXM7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgZmluYWwgQ29sbGVjdGlvbjxTdHJpbmc+IGdldFBhcmFtZXRlcnMoU3RyaW5nIHR5cGUpIHsKLSAgICAgICAgICAgIHJldHVybiBtUGFyYW1ldGVyTWFwLmdldCh0eXBlKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBmaW5hbCBMaXN0PFN0cmluZz4gZ2V0UHJvcGVydHlWYWx1ZUxpc3QoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbVByb3BlcnR5VmFsdWVMaXN0OwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgY2xlYXIoKSB7Ci0gICAgICAgICAgICBtUHJvcGVydHlOYW1lID0gbnVsbDsKLSAgICAgICAgICAgIG1QYXJhbWV0ZXJNYXAuY2xlYXIoKTsKLSAgICAgICAgICAgIG1Qcm9wZXJ0eVZhbHVlTGlzdC5jbGVhcigpOwotICAgICAgICAgICAgbVByb3BlcnR5Qnl0ZXMgPSBudWxsOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8gVE9ETyhkbWl5YWthd2EpOiB2Q2FyZCA0LjAgbG9naWNhbGx5IGhhcyBtdWx0aXBsZSBmb3JtYXR0ZWQgbmFtZXMgYW5kIHdlIG5lZWQgdG8KLSAgICAvLyBzZWxlY3QgdGhlIG1vc3QgcHJlZmVyYWJsZSBvbmUgdXNpbmcgUFJFRiBwYXJhbWV0ZXIuCi0gICAgLy8KLSAgICAvLyBlLmcuIChiYXNlZCBvbiByZXYuMTMpCi0gICAgLy8gRk47UFJFRj0xOkpvaG4gTS4gRG9lCi0gICAgLy8gRk47UFJFRj0yOkpvaG4gRG9lCi0gICAgLy8gRk47UFJFRj0zO0pvaG4KLQotICAgIHByaXZhdGUgU3RyaW5nIG1GYW1pbHlOYW1lOwotICAgIHByaXZhdGUgU3RyaW5nIG1HaXZlbk5hbWU7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgbU1pZGRsZU5hbWU7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgbVByZWZpeDsKLSAgICBwcml2YXRlIFN0cmluZyBtU3VmZml4OwotCi0gICAgLy8gVXNlZCBvbmx5IHdoZW4gbm8gZmFtaWx5IG5vciBnaXZlbiBuYW1lIGlzIGZvdW5kLgotICAgIHByaXZhdGUgU3RyaW5nIG1Gb3JtYXR0ZWROYW1lOwotCi0gICAgcHJpdmF0ZSBTdHJpbmcgbVBob25ldGljRmFtaWx5TmFtZTsKLSAgICBwcml2YXRlIFN0cmluZyBtUGhvbmV0aWNHaXZlbk5hbWU7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgbVBob25ldGljTWlkZGxlTmFtZTsKLQotICAgIHByaXZhdGUgU3RyaW5nIG1QaG9uZXRpY0Z1bGxOYW1lOwotCi0gICAgcHJpdmF0ZSBMaXN0PFN0cmluZz4gbU5pY2tOYW1lTGlzdDsKLQotICAgIHByaXZhdGUgU3RyaW5nIG1EaXNwbGF5TmFtZTsKLQotICAgIHByaXZhdGUgU3RyaW5nIG1CaXJ0aGRheTsKLSAgICBwcml2YXRlIFN0cmluZyBtQW5uaXZlcnNhcnk7Ci0KLSAgICBwcml2YXRlIExpc3Q8U3RyaW5nPiBtTm90ZUxpc3Q7Ci0gICAgcHJpdmF0ZSBMaXN0PFBob25lRGF0YT4gbVBob25lTGlzdDsKLSAgICBwcml2YXRlIExpc3Q8RW1haWxEYXRhPiBtRW1haWxMaXN0OwotICAgIHByaXZhdGUgTGlzdDxQb3N0YWxEYXRhPiBtUG9zdGFsTGlzdDsKLSAgICBwcml2YXRlIExpc3Q8T3JnYW5pemF0aW9uRGF0YT4gbU9yZ2FuaXphdGlvbkxpc3Q7Ci0gICAgcHJpdmF0ZSBMaXN0PEltRGF0YT4gbUltTGlzdDsKLSAgICBwcml2YXRlIExpc3Q8UGhvdG9EYXRhPiBtUGhvdG9MaXN0OwotICAgIHByaXZhdGUgTGlzdDxTdHJpbmc+IG1XZWJzaXRlTGlzdDsKLSAgICBwcml2YXRlIExpc3Q8TGlzdDxTdHJpbmc+PiBtQW5kcm9pZEN1c3RvbVByb3BlcnR5TGlzdDsKLQotICAgIHByaXZhdGUgZmluYWwgaW50IG1WQ2FyZFR5cGU7Ci0gICAgcHJpdmF0ZSBmaW5hbCBBY2NvdW50IG1BY2NvdW50OwotCi0gICAgcHVibGljIFZDYXJkRW50cnkoKSB7Ci0gICAgICAgIHRoaXMoVkNhcmRDb25maWcuVkNBUkRfVFlQRV9WMjFfR0VORVJJQyk7Ci0gICAgfQotCi0gICAgcHVibGljIFZDYXJkRW50cnkoaW50IHZjYXJkVHlwZSkgewotICAgICAgICB0aGlzKHZjYXJkVHlwZSwgbnVsbCk7Ci0gICAgfQotCi0gICAgcHVibGljIFZDYXJkRW50cnkoaW50IHZjYXJkVHlwZSwgQWNjb3VudCBhY2NvdW50KSB7Ci0gICAgICAgIG1WQ2FyZFR5cGUgPSB2Y2FyZFR5cGU7Ci0gICAgICAgIG1BY2NvdW50ID0gYWNjb3VudDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgYWRkUGhvbmUoaW50IHR5cGUsIFN0cmluZyBkYXRhLCBTdHJpbmcgbGFiZWwsIGJvb2xlYW4gaXNQcmltYXJ5KSB7Ci0gICAgICAgIGlmIChtUGhvbmVMaXN0ID09IG51bGwpIHsKLSAgICAgICAgICAgIG1QaG9uZUxpc3QgPSBuZXcgQXJyYXlMaXN0PFBob25lRGF0YT4oKTsKLSAgICAgICAgfQotICAgICAgICBmaW5hbCBTdHJpbmdCdWlsZGVyIGJ1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotICAgICAgICBmaW5hbCBTdHJpbmcgdHJpbWVkID0gZGF0YS50cmltKCk7Ci0gICAgICAgIGZpbmFsIFN0cmluZyBmb3JtYXR0ZWROdW1iZXI7Ci0gICAgICAgIGlmICh0eXBlID09IFBob25lLlRZUEVfUEFHRVIgfHwgVkNhcmRDb25maWcucmVmcmFpblBob25lTnVtYmVyRm9ybWF0dGluZyhtVkNhcmRUeXBlKSkgewotICAgICAgICAgICAgZm9ybWF0dGVkTnVtYmVyID0gdHJpbWVkOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgZmluYWwgaW50IGxlbmd0aCA9IHRyaW1lZC5sZW5ndGgoKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICBjaGFyIGNoID0gdHJpbWVkLmNoYXJBdChpKTsKLSAgICAgICAgICAgICAgICBpZiAoKCcwJyA8PSBjaCAmJiBjaCA8PSAnOScpIHx8IChpID09IDAgJiYgY2ggPT0gJysnKSkgewotICAgICAgICAgICAgICAgICAgICBidWlsZGVyLmFwcGVuZChjaCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBmaW5hbCBpbnQgZm9ybWF0dGluZ1R5cGUgPSBWQ2FyZFV0aWxzLmdldFBob25lTnVtYmVyRm9ybWF0KG1WQ2FyZFR5cGUpOwotICAgICAgICAgICAgZm9ybWF0dGVkTnVtYmVyID0gUGhvbmVOdW1iZXJVdGlscy5mb3JtYXROdW1iZXIoYnVpbGRlci50b1N0cmluZygpLCBmb3JtYXR0aW5nVHlwZSk7Ci0gICAgICAgIH0KLSAgICAgICAgUGhvbmVEYXRhIHBob25lRGF0YSA9IG5ldyBQaG9uZURhdGEodHlwZSwgZm9ybWF0dGVkTnVtYmVyLCBsYWJlbCwgaXNQcmltYXJ5KTsKLSAgICAgICAgbVBob25lTGlzdC5hZGQocGhvbmVEYXRhKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgYWRkTmlja05hbWUoZmluYWwgU3RyaW5nIG5pY2tOYW1lKSB7Ci0gICAgICAgIGlmIChtTmlja05hbWVMaXN0ID09IG51bGwpIHsKLSAgICAgICAgICAgIG1OaWNrTmFtZUxpc3QgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLSAgICAgICAgfQotICAgICAgICBtTmlja05hbWVMaXN0LmFkZChuaWNrTmFtZSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGFkZEVtYWlsKGludCB0eXBlLCBTdHJpbmcgZGF0YSwgU3RyaW5nIGxhYmVsLCBib29sZWFuIGlzUHJpbWFyeSl7Ci0gICAgICAgIGlmIChtRW1haWxMaXN0ID09IG51bGwpIHsKLSAgICAgICAgICAgIG1FbWFpbExpc3QgPSBuZXcgQXJyYXlMaXN0PEVtYWlsRGF0YT4oKTsKLSAgICAgICAgfQotICAgICAgICBtRW1haWxMaXN0LmFkZChuZXcgRW1haWxEYXRhKHR5cGUsIGRhdGEsIGxhYmVsLCBpc1ByaW1hcnkpKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgYWRkUG9zdGFsKGludCB0eXBlLCBMaXN0PFN0cmluZz4gcHJvcFZhbHVlTGlzdCwgU3RyaW5nIGxhYmVsLCBib29sZWFuIGlzUHJpbWFyeSl7Ci0gICAgICAgIGlmIChtUG9zdGFsTGlzdCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBtUG9zdGFsTGlzdCA9IG5ldyBBcnJheUxpc3Q8UG9zdGFsRGF0YT4oMCk7Ci0gICAgICAgIH0KLSAgICAgICAgbVBvc3RhbExpc3QuYWRkKG5ldyBQb3N0YWxEYXRhKHR5cGUsIHByb3BWYWx1ZUxpc3QsIGxhYmVsLCBpc1ByaW1hcnkpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTaG91bGQgYmUgY2FsbGVkIHZpYSB7QGxpbmsgI2hhbmRsZU9yZ1ZhbHVlKGludCwgTGlzdCwgTWFwLCBib29sZWFuKSBvcgotICAgICAqIHtAbGluayAjaGFuZGxlVGl0bGVWYWx1ZShTdHJpbmcpfS4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgYWRkTmV3T3JnYW5pemF0aW9uKGludCB0eXBlLCBmaW5hbCBTdHJpbmcgY29tcGFueU5hbWUsCi0gICAgICAgICAgICBmaW5hbCBTdHJpbmcgZGVwYXJ0bWVudE5hbWUsCi0gICAgICAgICAgICBmaW5hbCBTdHJpbmcgdGl0bGVOYW1lLAotICAgICAgICAgICAgZmluYWwgU3RyaW5nIHBob25ldGljTmFtZSwKLSAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gaXNQcmltYXJ5KSB7Ci0gICAgICAgIGlmIChtT3JnYW5pemF0aW9uTGlzdCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBtT3JnYW5pemF0aW9uTGlzdCA9IG5ldyBBcnJheUxpc3Q8T3JnYW5pemF0aW9uRGF0YT4oKTsKLSAgICAgICAgfQotICAgICAgICBtT3JnYW5pemF0aW9uTGlzdC5hZGQobmV3IE9yZ2FuaXphdGlvbkRhdGEodHlwZSwgY29tcGFueU5hbWUsCi0gICAgICAgICAgICAgICAgZGVwYXJ0bWVudE5hbWUsIHRpdGxlTmFtZSwgcGhvbmV0aWNOYW1lLCBpc1ByaW1hcnkpKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMaXN0PFN0cmluZz4gc0VtcHR5TGlzdCA9Ci0gICAgICAgICAgICBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVMaXN0KG5ldyBBcnJheUxpc3Q8U3RyaW5nPigwKSk7Ci0KLSAgICBwcml2YXRlIFN0cmluZyBidWlsZFNpbmdsZVBob25ldGljTmFtZUZyb21Tb3J0QXNQYXJhbShNYXA8U3RyaW5nLCBDb2xsZWN0aW9uPFN0cmluZz4+IHBhcmFtTWFwKSB7Ci0gICAgICAgIGZpbmFsIENvbGxlY3Rpb248U3RyaW5nPiBzb3J0QXNDb2xsZWN0aW9uID0gcGFyYW1NYXAuZ2V0KFZDYXJkQ29uc3RhbnRzLlBBUkFNX1NPUlRfQVMpOwotICAgICAgICBpZiAoc29ydEFzQ29sbGVjdGlvbiAhPSBudWxsICYmIHNvcnRBc0NvbGxlY3Rpb24uc2l6ZSgpICE9IDApIHsKLSAgICAgICAgICAgIGlmIChzb3J0QXNDb2xsZWN0aW9uLnNpemUoKSA+IDEpIHsKLSAgICAgICAgICAgICAgICBMb2cudyhMT0dfVEFHLCAiSW5jb3JyZWN0IG11bHRpcGxlIFNPUlRfQVMgcGFyYW1ldGVycyBkZXRlY3RlZDogIiArCi0gICAgICAgICAgICAgICAgICAgICAgICBBcnJheXMudG9TdHJpbmcoc29ydEFzQ29sbGVjdGlvbi50b0FycmF5KCkpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZpbmFsIExpc3Q8U3RyaW5nPiBzb3J0TmFtZXMgPQotICAgICAgICAgICAgICAgICAgICBWQ2FyZFV0aWxzLmNvbnN0cnVjdExpc3RGcm9tVmFsdWUoc29ydEFzQ29sbGVjdGlvbi5pdGVyYXRvcigpLm5leHQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtVkNhcmRUeXBlKTsKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZ0J1aWxkZXIgYnVpbGRlciA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0gICAgICAgICAgICBmb3IgKGZpbmFsIFN0cmluZyBlbGVtIDogc29ydE5hbWVzKSB7Ci0gICAgICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoZWxlbSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gYnVpbGRlci50b1N0cmluZygpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXQgIk9SRyIgcmVsYXRlZCB2YWx1ZXMgdG8gdGhlIGFwcHJvcHJpYXRlIGRhdGEuIElmIHRoZXJlJ3MgbW9yZSB0aGFuIG9uZQotICAgICAqIHtAbGluayBPcmdhbml6YXRpb25EYXRhfSBvYmplY3RzLCB0aGlzIGlucHV0IGRhdGEgYXJlIGF0dGFjaGVkIHRvIHRoZSBsYXN0IG9uZSB3aGljaAotICAgICAqIGRvZXMgbm90IGhhdmUgdmFsaWQgdmFsdWVzIChub3QgaW5jbHVkaW5nIGVtcHR5IGJ1dCBvbmx5IG51bGwpLiBJZiB0aGVyZSdzIG5vCi0gICAgICoge0BsaW5rIE9yZ2FuaXphdGlvbkRhdGF9IG9iamVjdCwgYSBuZXcge0BsaW5rIE9yZ2FuaXphdGlvbkRhdGF9IGlzIGNyZWF0ZWQsCi0gICAgICogd2hvc2UgdGl0bGUgaXMgc2V0IHRvIG51bGwuCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGhhbmRsZU9yZ1ZhbHVlKGZpbmFsIGludCB0eXBlLCBMaXN0PFN0cmluZz4gb3JnTGlzdCwKLSAgICAgICAgICAgIE1hcDxTdHJpbmcsIENvbGxlY3Rpb248U3RyaW5nPj4gcGFyYW1NYXAsIGJvb2xlYW4gaXNQcmltYXJ5KSB7Ci0gICAgICAgIGZpbmFsIFN0cmluZyBwaG9uZXRpY05hbWUgPSBidWlsZFNpbmdsZVBob25ldGljTmFtZUZyb21Tb3J0QXNQYXJhbShwYXJhbU1hcCk7Ci0gICAgICAgIGlmIChvcmdMaXN0ID09IG51bGwpIHsKLSAgICAgICAgICAgIG9yZ0xpc3QgPSBzRW1wdHlMaXN0OwotICAgICAgICB9Ci0gICAgICAgIGZpbmFsIFN0cmluZyBjb21wYW55TmFtZTsKLSAgICAgICAgZmluYWwgU3RyaW5nIGRlcGFydG1lbnROYW1lOwotICAgICAgICBmaW5hbCBpbnQgc2l6ZSA9IG9yZ0xpc3Quc2l6ZSgpOwotICAgICAgICBzd2l0Y2ggKHNpemUpIHsKLSAgICAgICAgICAgIGNhc2UgMDogewotICAgICAgICAgICAgICAgIGNvbXBhbnlOYW1lID0gIiI7Ci0gICAgICAgICAgICAgICAgZGVwYXJ0bWVudE5hbWUgPSBudWxsOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2FzZSAxOiB7Ci0gICAgICAgICAgICAgICAgY29tcGFueU5hbWUgPSBvcmdMaXN0LmdldCgwKTsKLSAgICAgICAgICAgICAgICBkZXBhcnRtZW50TmFtZSA9IG51bGw7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBkZWZhdWx0OiB7ICAvLyBNb3JlIHRoYW4gMS4KLSAgICAgICAgICAgICAgICBjb21wYW55TmFtZSA9IG9yZ0xpc3QuZ2V0KDApOwotICAgICAgICAgICAgICAgIC8vIFdlJ3JlIG5vdCBzdXJlIHdoaWNoIGlzIHRoZSBjb3JyZWN0IHN0cmluZyBmb3IgZGVwYXJ0bWVudC4KLSAgICAgICAgICAgICAgICAvLyBJbiBvcmRlciB0byBrZWVwIGFsbCB0aGUgZGF0YSwgY29uY2F0aW5hdGUgdGhlIHJlc3Qgb2YgZWxlbWVudHMuCi0gICAgICAgICAgICAgICAgU3RyaW5nQnVpbGRlciBidWlsZGVyID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMTsgaSA8IHNpemU7IGkrKykgewotICAgICAgICAgICAgICAgICAgICBpZiAoaSA+IDEpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKCcgJyk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQob3JnTGlzdC5nZXQoaSkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBkZXBhcnRtZW50TmFtZSA9IGJ1aWxkZXIudG9TdHJpbmcoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAobU9yZ2FuaXphdGlvbkxpc3QgPT0gbnVsbCkgewotICAgICAgICAgICAgLy8gQ3JlYXRlIG5ldyBmaXJzdCBvcmdhbml6YXRpb24gZW50cnksIHdpdGggIm51bGwiIHRpdGxlIHdoaWNoIG1heSBiZQotICAgICAgICAgICAgLy8gYWRkZWQgdmlhIGhhbmRsZVRpdGxlVmFsdWUoKS4KLSAgICAgICAgICAgIGFkZE5ld09yZ2FuaXphdGlvbih0eXBlLCBjb21wYW55TmFtZSwgZGVwYXJ0bWVudE5hbWUsIG51bGwsIHBob25ldGljTmFtZSwgaXNQcmltYXJ5KTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBmb3IgKE9yZ2FuaXphdGlvbkRhdGEgb3JnYW5pemF0aW9uRGF0YSA6IG1Pcmdhbml6YXRpb25MaXN0KSB7Ci0gICAgICAgICAgICAvLyBOb3QgdXNlIFRleHRVdGlscy5pc0VtcHR5KCkgc2luY2UgT1JHIHdhcyBzZXQgYnV0IHRoZSBlbGVtZW50cyBtaWdodCBiZSBlbXB0eS4KLSAgICAgICAgICAgIC8vIGUuZy4gIk9SRztQUkVGOjsiIC0+IEJvdGggY29tcGFueU5hbWUgYW5kIGRlcGFydG1lbnROYW1lIGJlY29tZSBlbXB0eSBidXQgbm90IG51bGwuCi0gICAgICAgICAgICBpZiAob3JnYW5pemF0aW9uRGF0YS5jb21wYW55TmFtZSA9PSBudWxsICYmCi0gICAgICAgICAgICAgICAgICAgIG9yZ2FuaXphdGlvbkRhdGEuZGVwYXJ0bWVudE5hbWUgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIC8vIFByb2JhYmx5IHRoZSAiVElUTEUiIHByb3BlcnR5IGNvbWVzIGJlZm9yZSB0aGUgIk9SRyIgcHJvcGVydHkgdmlhCi0gICAgICAgICAgICAgICAgLy8gaGFuZGxlVGl0bGVMaW5lKCkuCi0gICAgICAgICAgICAgICAgb3JnYW5pemF0aW9uRGF0YS5jb21wYW55TmFtZSA9IGNvbXBhbnlOYW1lOwotICAgICAgICAgICAgICAgIG9yZ2FuaXphdGlvbkRhdGEuZGVwYXJ0bWVudE5hbWUgPSBkZXBhcnRtZW50TmFtZTsKLSAgICAgICAgICAgICAgICBvcmdhbml6YXRpb25EYXRhLmlzUHJpbWFyeSA9IGlzUHJpbWFyeTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgLy8gTm8gT3JnYW5pemF0aW9EYXRhIGlzIGF2YWlsYWJsZS4gQ3JlYXRlIGFub3RoZXIgb25lLCB3aXRoICJudWxsIiB0aXRsZSwgd2hpY2ggbWF5IGJlCi0gICAgICAgIC8vIGFkZGVkIHZpYSBoYW5kbGVUaXRsZVZhbHVlKCkuCi0gICAgICAgIGFkZE5ld09yZ2FuaXphdGlvbih0eXBlLCBjb21wYW55TmFtZSwgZGVwYXJ0bWVudE5hbWUsIG51bGwsIHBob25ldGljTmFtZSwgaXNQcmltYXJ5KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXQgInRpdGxlIiB2YWx1ZSB0byB0aGUgYXBwcm9wcmlhdGUgZGF0YS4gSWYgdGhlcmUncyBtb3JlIHRoYW4gb25lCi0gICAgICogT3JnYW5pemF0aW9uRGF0YSBvYmplY3RzLCB0aGlzIGlucHV0IGlzIGF0dGFjaGVkIHRvIHRoZSBsYXN0IG9uZSB3aGljaCBkb2VzIG5vdAotICAgICAqIGhhdmUgdmFsaWQgdGl0bGUgdmFsdWUgKG5vdCBpbmNsdWRpbmcgZW1wdHkgYnV0IG9ubHkgbnVsbCkuIElmIHRoZXJlJ3Mgbm8KLSAgICAgKiBPcmdhbml6YXRpb25EYXRhIG9iamVjdCwgYSBuZXcgT3JnYW5pemF0aW9uRGF0YSBpcyBjcmVhdGVkLCB3aG9zZSBjb21wYW55IG5hbWUgaXMKLSAgICAgKiBzZXQgdG8gbnVsbC4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgaGFuZGxlVGl0bGVWYWx1ZShmaW5hbCBTdHJpbmcgdGl0bGUpIHsKLSAgICAgICAgaWYgKG1Pcmdhbml6YXRpb25MaXN0ID09IG51bGwpIHsKLSAgICAgICAgICAgIC8vIENyZWF0ZSBuZXcgZmlyc3Qgb3JnYW5pemF0aW9uIGVudHJ5LCB3aXRoICJudWxsIiBvdGhlciBpbmZvLCB3aGljaCBtYXkgYmUKLSAgICAgICAgICAgIC8vIGFkZGVkIHZpYSBoYW5kbGVPcmdWYWx1ZSgpLgotICAgICAgICAgICAgYWRkTmV3T3JnYW5pemF0aW9uKERFRkFVTFRfT1JHQU5JWkFUSU9OX1RZUEUsIG51bGwsIG51bGwsIHRpdGxlLCBudWxsLCBmYWxzZSk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgZm9yIChPcmdhbml6YXRpb25EYXRhIG9yZ2FuaXphdGlvbkRhdGEgOiBtT3JnYW5pemF0aW9uTGlzdCkgewotICAgICAgICAgICAgaWYgKG9yZ2FuaXphdGlvbkRhdGEudGl0bGVOYW1lID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBvcmdhbml6YXRpb25EYXRhLnRpdGxlTmFtZSA9IHRpdGxlOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAvLyBObyBPcmdhbml6YXRpb24gaXMgYXZhaWxhYmxlLiBDcmVhdGUgYW5vdGhlciBvbmUsIHdpdGggIm51bGwiIG90aGVyIGluZm8sIHdoaWNoIG1heSBiZQotICAgICAgICAvLyBhZGRlZCB2aWEgaGFuZGxlT3JnVmFsdWUoKS4KLSAgICAgICAgYWRkTmV3T3JnYW5pemF0aW9uKERFRkFVTFRfT1JHQU5JWkFUSU9OX1RZUEUsIG51bGwsIG51bGwsIHRpdGxlLCBudWxsLCBmYWxzZSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGFkZEltKGludCBwcm90b2NvbCwgU3RyaW5nIGN1c3RvbVByb3RvY29sLCBpbnQgdHlwZSwKLSAgICAgICAgICAgIFN0cmluZyBwcm9wVmFsdWUsIGJvb2xlYW4gaXNQcmltYXJ5KSB7Ci0gICAgICAgIGlmIChtSW1MaXN0ID09IG51bGwpIHsKLSAgICAgICAgICAgIG1JbUxpc3QgPSBuZXcgQXJyYXlMaXN0PEltRGF0YT4oKTsKLSAgICAgICAgfQotICAgICAgICBtSW1MaXN0LmFkZChuZXcgSW1EYXRhKHByb3RvY29sLCBjdXN0b21Qcm90b2NvbCwgdHlwZSwgcHJvcFZhbHVlLCBpc1ByaW1hcnkpKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgYWRkTm90ZShmaW5hbCBTdHJpbmcgbm90ZSkgewotICAgICAgICBpZiAobU5vdGVMaXN0ID09IG51bGwpIHsKLSAgICAgICAgICAgIG1Ob3RlTGlzdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigxKTsKLSAgICAgICAgfQotICAgICAgICBtTm90ZUxpc3QuYWRkKG5vdGUpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBhZGRQaG90b0J5dGVzKFN0cmluZyBmb3JtYXROYW1lLCBieXRlW10gcGhvdG9CeXRlcywgYm9vbGVhbiBpc1ByaW1hcnkpIHsKLSAgICAgICAgaWYgKG1QaG90b0xpc3QgPT0gbnVsbCkgewotICAgICAgICAgICAgbVBob3RvTGlzdCA9IG5ldyBBcnJheUxpc3Q8UGhvdG9EYXRhPigxKTsKLSAgICAgICAgfQotICAgICAgICBmaW5hbCBQaG90b0RhdGEgcGhvdG9EYXRhID0gbmV3IFBob3RvRGF0YSgwLCBudWxsLCBwaG90b0J5dGVzLCBpc1ByaW1hcnkpOwotICAgICAgICBtUGhvdG9MaXN0LmFkZChwaG90b0RhdGEpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRyaWVzIHRvIGV4dHJhY3QgcGFyYW1NYXAsIGNvbnN0cnVjdHMgU09SVC1BUyBwYXJhbWV0ZXIgdmFsdWVzLCBhbmQgc3RvcmUgdGhlbSBpbgotICAgICAqIGFwcHJvcHJpYXRlIHBob25ldGljIG5hbWUgdmFyaWFibGVzLgotICAgICAqCi0gICAgICogVGhpcyBtZXRob2QgZG9lcyBub3QgY2FyZSB0aGUgdkNhcmQgdmVyc2lvbi4gRXZlbiB3aGVuIHdlIGhhdmUgU09SVC1BUyBwYXJhbWV0ZXJzIGluCi0gICAgICogaW52YWxpZCB2ZXJzaW9ucyAoaS5lLiAyLjEgYW5kIDMuMCksIHdlIHNjaWxlbnRseSBhY2NlcHQgdGhlbSBzbyB0aGF0IHdlIHdvbid0IGRyb3AKLSAgICAgKiBtZWFuaW5nZnVsIGluZm9ybWF0aW9uLiBJZiB3ZSBoYWQgdGhpcyBwYXJhbWV0ZXIgaW4gdGhlIE4gZmllbGQgb2YgdkNhcmQgMy4wLCBhbmQKLSAgICAgKiB0aGUgY29udGFjdCBkYXRhIGFsc28gaGF2ZSBTT1JULVNUUklORywgd2Ugd2lsbCBwcmVmZXIgU09SVC1TVFJJTkcsIHNpbmNlIGl0IGlzCi0gICAgICogcmVnaXRpbWF0ZSBwcm9wZXJ0eSB0byBiZSB1bmRlcnN0b29kLgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCB0cnlIYW5kbGVTb3J0QXNOYW1lKGZpbmFsIE1hcDxTdHJpbmcsIENvbGxlY3Rpb248U3RyaW5nPj4gcGFyYW1NYXApIHsKLSAgICAgICAgaWYgKFZDYXJkQ29uZmlnLmlzVmVyc2lvbjMwKG1WQ2FyZFR5cGUpICYmCi0gICAgICAgICAgICAgICAgIShUZXh0VXRpbHMuaXNFbXB0eShtUGhvbmV0aWNGYW1pbHlOYW1lKSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgVGV4dFV0aWxzLmlzRW1wdHkobVBob25ldGljTWlkZGxlTmFtZSkgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgIFRleHRVdGlscy5pc0VtcHR5KG1QaG9uZXRpY0dpdmVuTmFtZSkpKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBmaW5hbCBDb2xsZWN0aW9uPFN0cmluZz4gc29ydEFzQ29sbGVjdGlvbiA9IHBhcmFtTWFwLmdldChWQ2FyZENvbnN0YW50cy5QQVJBTV9TT1JUX0FTKTsKLSAgICAgICAgaWYgKHNvcnRBc0NvbGxlY3Rpb24gIT0gbnVsbCAmJiBzb3J0QXNDb2xsZWN0aW9uLnNpemUoKSAhPSAwKSB7Ci0gICAgICAgICAgICBpZiAoc29ydEFzQ29sbGVjdGlvbi5zaXplKCkgPiAxKSB7Ci0gICAgICAgICAgICAgICAgTG9nLncoTE9HX1RBRywgIkluY29ycmVjdCBtdWx0aXBsZSBTT1JUX0FTIHBhcmFtZXRlcnMgZGV0ZWN0ZWQ6ICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlzLnRvU3RyaW5nKHNvcnRBc0NvbGxlY3Rpb24udG9BcnJheSgpKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmaW5hbCBMaXN0PFN0cmluZz4gc29ydE5hbWVzID0KLSAgICAgICAgICAgICAgICAgICAgVkNhcmRVdGlscy5jb25zdHJ1Y3RMaXN0RnJvbVZhbHVlKHNvcnRBc0NvbGxlY3Rpb24uaXRlcmF0b3IoKS5uZXh0KCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbVZDYXJkVHlwZSk7Ci0gICAgICAgICAgICBpbnQgc2l6ZSA9IHNvcnROYW1lcy5zaXplKCk7Ci0gICAgICAgICAgICBpZiAoc2l6ZSA+IDMpIHsKLSAgICAgICAgICAgICAgICBzaXplID0gMzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHN3aXRjaCAoc2l6ZSkgewotICAgICAgICAgICAgY2FzZSAzOiBtUGhvbmV0aWNNaWRkbGVOYW1lID0gc29ydE5hbWVzLmdldCgyKTsgLy8kRkFMTC1USFJPVUdIJAotICAgICAgICAgICAgY2FzZSAyOiBtUGhvbmV0aWNHaXZlbk5hbWUgPSBzb3J0TmFtZXMuZ2V0KDEpOyAvLyRGQUxMLVRIUk9VR0gkCi0gICAgICAgICAgICBkZWZhdWx0OiBtUGhvbmV0aWNGYW1pbHlOYW1lID0gc29ydE5hbWVzLmdldCgwKTsgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAU3VwcHJlc3NXYXJuaW5ncygiZmFsbHRocm91Z2giKQotICAgIHByaXZhdGUgdm9pZCBoYW5kbGVOUHJvcGVydHkoZmluYWwgTGlzdDxTdHJpbmc+IHBhcmFtVmFsdWVzLAotICAgICAgICAgICAgTWFwPFN0cmluZywgQ29sbGVjdGlvbjxTdHJpbmc+PiBwYXJhbU1hcCkgewotICAgICAgICAvLyBpbiB2Q2FyZCA0LjAsIFNPUlQtQVMgcGFyYW1ldGVyIGlzIGF2YWlsYWJsZS4KLSAgICAgICAgdHJ5SGFuZGxlU29ydEFzTmFtZShwYXJhbU1hcCk7Ci0KLSAgICAgICAgLy8gRmFtaWx5LCBHaXZlbiwgTWlkZGxlLCBQcmVmaXgsIFN1ZmZpeC4gKDEgLSA1KQotICAgICAgICBpbnQgc2l6ZTsKLSAgICAgICAgaWYgKHBhcmFtVmFsdWVzID09IG51bGwgfHwgKHNpemUgPSBwYXJhbVZhbHVlcy5zaXplKCkpIDwgMSkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGlmIChzaXplID4gNSkgewotICAgICAgICAgICAgc2l6ZSA9IDU7Ci0gICAgICAgIH0KLQotICAgICAgICBzd2l0Y2ggKHNpemUpIHsKLSAgICAgICAgLy8gRmFsbC10aHJvdWdoLgotICAgICAgICBjYXNlIDU6IG1TdWZmaXggPSBwYXJhbVZhbHVlcy5nZXQoNCk7Ci0gICAgICAgIGNhc2UgNDogbVByZWZpeCA9IHBhcmFtVmFsdWVzLmdldCgzKTsKLSAgICAgICAgY2FzZSAzOiBtTWlkZGxlTmFtZSA9IHBhcmFtVmFsdWVzLmdldCgyKTsKLSAgICAgICAgY2FzZSAyOiBtR2l2ZW5OYW1lID0gcGFyYW1WYWx1ZXMuZ2V0KDEpOwotICAgICAgICBkZWZhdWx0OiBtRmFtaWx5TmFtZSA9IHBhcmFtVmFsdWVzLmdldCgwKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIE5vdGU6IFNvbWUgSmFwYW5lc2UgbW9iaWxlIHBob25lcyB1c2UgdGhpcyBmaWVsZCBmb3IgcGhvbmV0aWMgbmFtZSwKLSAgICAgKiAgICAgICBzaW5jZSB2Q2FyZCAyLjEgZG9lcyBub3QgaGF2ZSAiU09SVC1TVFJJTkciIHR5cGUuCi0gICAgICogICAgICAgQWxzbywgaW4gc29tZSBjYXNlcywgdGhlIGZpZWxkIGhhcyBzb21lICc7J3MgaW4gaXQuCi0gICAgICogICAgICAgQXNzdW1lIHRoZSAnOycgbWVhbnMgdGhlIHNhbWUgbWVhbmluZyBpbiBOIHByb3BlcnR5Ci0gICAgICovCi0gICAgQFN1cHByZXNzV2FybmluZ3MoImZhbGx0aHJvdWdoIikKLSAgICBwcml2YXRlIHZvaWQgaGFuZGxlUGhvbmV0aWNOYW1lRnJvbVNvdW5kKExpc3Q8U3RyaW5nPiBlbGVtcykgewotICAgICAgICBpZiAoIShUZXh0VXRpbHMuaXNFbXB0eShtUGhvbmV0aWNGYW1pbHlOYW1lKSAmJgotICAgICAgICAgICAgICAgIFRleHRVdGlscy5pc0VtcHR5KG1QaG9uZXRpY01pZGRsZU5hbWUpICYmCi0gICAgICAgICAgICAgICAgVGV4dFV0aWxzLmlzRW1wdHkobVBob25ldGljR2l2ZW5OYW1lKSkpIHsKLSAgICAgICAgICAgIC8vIFRoaXMgbWVhbnMgdGhlIG90aGVyIHByb3BlcnRpZXMgbGlrZSAiWC1QSE9ORVRJQy1GSVJTVC1OQU1FIiB3YXMgYWxyZWFkeSBmb3VuZC4KLSAgICAgICAgICAgIC8vIElnbm9yZSAiU09VTkQ7WC1JUk1DLU4iLgotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgaW50IHNpemU7Ci0gICAgICAgIGlmIChlbGVtcyA9PSBudWxsIHx8IChzaXplID0gZWxlbXMuc2l6ZSgpKSA8IDEpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIEFzc3VtZSB0aGF0IHRoZSBvcmRlciBpcyAiRmFtaWx5LCBHaXZlbiwgTWlkZGxlIi4KLSAgICAgICAgLy8gVGhpcyBpcyBub3QgZnJvbSBzcGVjaWZpY2F0aW9uIGJ1dCBtZXJlIGFzc3VtcHRpb24uIFNvbWUgSmFwYW5lc2UgcGhvbmVzIHVzZSB0aGlzIG9yZGVyLgotICAgICAgICBpZiAoc2l6ZSA+IDMpIHsKLSAgICAgICAgICAgIHNpemUgPSAzOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGVsZW1zLmdldCgwKS5sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICAgIGJvb2xlYW4gb25seUZpcnN0RWxlbUlzTm9uRW1wdHkgPSB0cnVlOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDE7IGkgPCBzaXplOyBpKyspIHsKLSAgICAgICAgICAgICAgICBpZiAoZWxlbXMuZ2V0KGkpLmxlbmd0aCgpID4gMCkgewotICAgICAgICAgICAgICAgICAgICBvbmx5Rmlyc3RFbGVtSXNOb25FbXB0eSA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAob25seUZpcnN0RWxlbUlzTm9uRW1wdHkpIHsKLSAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmdbXSBuYW1lc0FycmF5ID0gZWxlbXMuZ2V0KDApLnNwbGl0KCIgIik7Ci0gICAgICAgICAgICAgICAgZmluYWwgaW50IG5hbWVBcnJheUxlbmd0aCA9IG5hbWVzQXJyYXkubGVuZ3RoOwotICAgICAgICAgICAgICAgIGlmIChuYW1lQXJyYXlMZW5ndGggPT0gMykgewotICAgICAgICAgICAgICAgICAgICAvLyBBc3N1bWUgdGhlIHN0cmluZyBpcyAiRmFtaWx5IE1pZGRsZSBHaXZlbiIuCi0gICAgICAgICAgICAgICAgICAgIG1QaG9uZXRpY0ZhbWlseU5hbWUgPSBuYW1lc0FycmF5WzBdOwotICAgICAgICAgICAgICAgICAgICBtUGhvbmV0aWNNaWRkbGVOYW1lID0gbmFtZXNBcnJheVsxXTsKLSAgICAgICAgICAgICAgICAgICAgbVBob25ldGljR2l2ZW5OYW1lID0gbmFtZXNBcnJheVsyXTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG5hbWVBcnJheUxlbmd0aCA9PSAyKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIEFzc3VtZSB0aGUgc3RyaW5nIGlzICJGYW1pbHkgR2l2ZW4iIGJhc2VkIG9uIHRoZSBKYXBhbmVzZSBtb2JpbGUKLSAgICAgICAgICAgICAgICAgICAgLy8gcGhvbmVzJyBwcmVmZXJlbmNlLgotICAgICAgICAgICAgICAgICAgICBtUGhvbmV0aWNGYW1pbHlOYW1lID0gbmFtZXNBcnJheVswXTsKLSAgICAgICAgICAgICAgICAgICAgbVBob25ldGljR2l2ZW5OYW1lID0gbmFtZXNBcnJheVsxXTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBtUGhvbmV0aWNGdWxsTmFtZSA9IGVsZW1zLmdldCgwKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgc3dpdGNoIChzaXplKSB7Ci0gICAgICAgICAgICAvLyBmYWxsdGhyb3VnaAotICAgICAgICAgICAgY2FzZSAzOiBtUGhvbmV0aWNNaWRkbGVOYW1lID0gZWxlbXMuZ2V0KDIpOwotICAgICAgICAgICAgY2FzZSAyOiBtUGhvbmV0aWNHaXZlbk5hbWUgPSBlbGVtcy5nZXQoMSk7Ci0gICAgICAgICAgICBkZWZhdWx0OiBtUGhvbmV0aWNGYW1pbHlOYW1lID0gZWxlbXMuZ2V0KDApOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYWRkUHJvcGVydHkoZmluYWwgUHJvcGVydHkgcHJvcGVydHkpIHsKLSAgICAgICAgZmluYWwgU3RyaW5nIHByb3BOYW1lID0gcHJvcGVydHkubVByb3BlcnR5TmFtZTsKLSAgICAgICAgZmluYWwgTWFwPFN0cmluZywgQ29sbGVjdGlvbjxTdHJpbmc+PiBwYXJhbU1hcCA9IHByb3BlcnR5Lm1QYXJhbWV0ZXJNYXA7Ci0gICAgICAgIGZpbmFsIExpc3Q8U3RyaW5nPiBwcm9wVmFsdWVMaXN0ID0gcHJvcGVydHkubVByb3BlcnR5VmFsdWVMaXN0OwotICAgICAgICBieXRlW10gcHJvcEJ5dGVzID0gcHJvcGVydHkubVByb3BlcnR5Qnl0ZXM7Ci0KLSAgICAgICAgaWYgKHByb3BWYWx1ZUxpc3Quc2l6ZSgpID09IDApIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBmaW5hbCBTdHJpbmcgcHJvcFZhbHVlID0gbGlzdFRvU3RyaW5nKHByb3BWYWx1ZUxpc3QpLnRyaW0oKTsKLQotICAgICAgICBpZiAocHJvcE5hbWUuZXF1YWxzKFZDYXJkQ29uc3RhbnRzLlBST1BFUlRZX1ZFUlNJT04pKSB7Ci0gICAgICAgICAgICAvLyB2Q2FyZCB2ZXJzaW9uLiBJZ25vcmUgdGhpcy4KLSAgICAgICAgfSBlbHNlIGlmIChwcm9wTmFtZS5lcXVhbHMoVkNhcmRDb25zdGFudHMuUFJPUEVSVFlfRk4pKSB7Ci0gICAgICAgICAgICBtRm9ybWF0dGVkTmFtZSA9IHByb3BWYWx1ZTsKLSAgICAgICAgfSBlbHNlIGlmIChwcm9wTmFtZS5lcXVhbHMoVkNhcmRDb25zdGFudHMuUFJPUEVSVFlfTkFNRSkgJiYgbUZvcm1hdHRlZE5hbWUgPT0gbnVsbCkgewotICAgICAgICAgICAgLy8gT25seSBpbiB2Q2FyZCAzLjAuIFVzZSB0aGlzIGlmIEZOLCB3aGljaCBtdXN0IGV4aXN0IGluIHZDYXJkIDMuMCBidXQgbWF5IG5vdAotICAgICAgICAgICAgLy8gYWN0dWFsbHkgZXhpc3QgaW4gdGhlIHJlYWwgdkNhcmQgZGF0YSwgZG9lcyBub3QgZXhpc3QuCi0gICAgICAgICAgICBtRm9ybWF0dGVkTmFtZSA9IHByb3BWYWx1ZTsKLSAgICAgICAgfSBlbHNlIGlmIChwcm9wTmFtZS5lcXVhbHMoVkNhcmRDb25zdGFudHMuUFJPUEVSVFlfTikpIHsKLSAgICAgICAgICAgIGhhbmRsZU5Qcm9wZXJ0eShwcm9wVmFsdWVMaXN0LCBwYXJhbU1hcCk7Ci0gICAgICAgIH0gZWxzZSBpZiAocHJvcE5hbWUuZXF1YWxzKFZDYXJkQ29uc3RhbnRzLlBST1BFUlRZX1NPUlRfU1RSSU5HKSkgewotICAgICAgICAgICAgbVBob25ldGljRnVsbE5hbWUgPSBwcm9wVmFsdWU7Ci0gICAgICAgIH0gZWxzZSBpZiAocHJvcE5hbWUuZXF1YWxzKFZDYXJkQ29uc3RhbnRzLlBST1BFUlRZX05JQ0tOQU1FKSB8fAotICAgICAgICAgICAgICAgIHByb3BOYW1lLmVxdWFscyhWQ2FyZENvbnN0YW50cy5JbXBvcnRPbmx5LlBST1BFUlRZX1hfTklDS05BTUUpKSB7Ci0gICAgICAgICAgICBhZGROaWNrTmFtZShwcm9wVmFsdWUpOwotICAgICAgICB9IGVsc2UgaWYgKHByb3BOYW1lLmVxdWFscyhWQ2FyZENvbnN0YW50cy5QUk9QRVJUWV9TT1VORCkpIHsKLSAgICAgICAgICAgIENvbGxlY3Rpb248U3RyaW5nPiB0eXBlQ29sbGVjdGlvbiA9IHBhcmFtTWFwLmdldChWQ2FyZENvbnN0YW50cy5QQVJBTV9UWVBFKTsKLSAgICAgICAgICAgIGlmICh0eXBlQ29sbGVjdGlvbiAhPSBudWxsCi0gICAgICAgICAgICAgICAgICAgICYmIHR5cGVDb2xsZWN0aW9uLmNvbnRhaW5zKFZDYXJkQ29uc3RhbnRzLlBBUkFNX1RZUEVfWF9JUk1DX04pKSB7Ci0gICAgICAgICAgICAgICAgLy8gQXMgb2YgMjAwOS0xMC0wOCwgUGFyc2VyIHNpZGUgZG9lcyBub3Qgc3BsaXQgYSBwcm9wZXJ0eSB2YWx1ZSBpbnRvIHNlcGFyYXRlZAotICAgICAgICAgICAgICAgIC8vIHZhbHVlcyB1c2luZyAnOycgKGluIG90aGVyIHdvcmRzLCBwcm9wVmFsdWVMaXN0LnNpemUoKSA9PSAxKSwKLSAgICAgICAgICAgICAgICAvLyB3aGljaCBpcyBjb3JyZWN0IGJlaGF2aW9yIGZyb20gdGhlIHZpZXcgb2YgdkNhcmQgMi4xLgotICAgICAgICAgICAgICAgIC8vIEJ1dCB3ZSB3YW50IGl0IHRvIGJlIHNlcGFyYXRlZCwgc28gZG8gdGhlIHNlcGFyYXRpb24gaGVyZS4KLSAgICAgICAgICAgICAgICBmaW5hbCBMaXN0PFN0cmluZz4gcGhvbmV0aWNOYW1lTGlzdCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBWQ2FyZFV0aWxzLmNvbnN0cnVjdExpc3RGcm9tVmFsdWUocHJvcFZhbHVlLCBtVkNhcmRUeXBlKTsKLSAgICAgICAgICAgICAgICBoYW5kbGVQaG9uZXRpY05hbWVGcm9tU291bmQocGhvbmV0aWNOYW1lTGlzdCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIC8vIElnbm9yZSB0aGlzIGZpZWxkIHNpbmNlIEFuZHJvaWQgY2Fubm90IHVuZGVyc3RhbmQgd2hhdCBpdCBpcy4KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmIChwcm9wTmFtZS5lcXVhbHMoVkNhcmRDb25zdGFudHMuUFJPUEVSVFlfQURSKSkgewotICAgICAgICAgICAgYm9vbGVhbiB2YWx1ZXNBcmVBbGxFbXB0eSA9IHRydWU7Ci0gICAgICAgICAgICBmb3IgKFN0cmluZyB2YWx1ZSA6IHByb3BWYWx1ZUxpc3QpIHsKLSAgICAgICAgICAgICAgICBpZiAodmFsdWUubGVuZ3RoKCkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIHZhbHVlc0FyZUFsbEVtcHR5ID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICh2YWx1ZXNBcmVBbGxFbXB0eSkgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaW50IHR5cGUgPSAtMTsKLSAgICAgICAgICAgIFN0cmluZyBsYWJlbCA9ICIiOwotICAgICAgICAgICAgYm9vbGVhbiBpc1ByaW1hcnkgPSBmYWxzZTsKLSAgICAgICAgICAgIENvbGxlY3Rpb248U3RyaW5nPiB0eXBlQ29sbGVjdGlvbiA9IHBhcmFtTWFwLmdldChWQ2FyZENvbnN0YW50cy5QQVJBTV9UWVBFKTsKLSAgICAgICAgICAgIGlmICh0eXBlQ29sbGVjdGlvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgZm9yIChTdHJpbmcgdHlwZVN0cmluZyA6IHR5cGVDb2xsZWN0aW9uKSB7Ci0gICAgICAgICAgICAgICAgICAgIHR5cGVTdHJpbmcgPSB0eXBlU3RyaW5nLnRvVXBwZXJDYXNlKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlU3RyaW5nLmVxdWFscyhWQ2FyZENvbnN0YW50cy5QQVJBTV9UWVBFX1BSRUYpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpc1ByaW1hcnkgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGVTdHJpbmcuZXF1YWxzKFZDYXJkQ29uc3RhbnRzLlBBUkFNX1RZUEVfSE9NRSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUgPSBTdHJ1Y3R1cmVkUG9zdGFsLlRZUEVfSE9NRTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsID0gIiI7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZVN0cmluZy5lcXVhbHMoVkNhcmRDb25zdGFudHMuUEFSQU1fVFlQRV9XT1JLKSB8fAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVTdHJpbmcuZXF1YWxzSWdub3JlQ2FzZShWQ2FyZENvbnN0YW50cy5QQVJBTV9FWFRSQV9UWVBFX0NPTVBBTlkpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyAiQ09NUEFOWSIgc2VlbXMgZW1pdHRlZCBieSBXaW5kb3dzIE1vYmlsZSwgd2hpY2ggaXMgbm90Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBzcGVjaWZpY2FsbHkgc3VwcG9ydGVkIGJ5IHZDYXJkIDIuMS4gV2UgYXNzdW1lIHRoaXMgaXMgc2FtZQotICAgICAgICAgICAgICAgICAgICAgICAgLy8gYXMgIldPUksiLgotICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSA9IFN0cnVjdHVyZWRQb3N0YWwuVFlQRV9XT1JLOwotICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWwgPSAiIjsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlU3RyaW5nLmVxdWFscyhWQ2FyZENvbnN0YW50cy5QQVJBTV9BRFJfVFlQRV9QQVJDRUwpIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZVN0cmluZy5lcXVhbHMoVkNhcmRDb25zdGFudHMuUEFSQU1fQURSX1RZUEVfRE9NKSB8fAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVTdHJpbmcuZXF1YWxzKFZDYXJkQ29uc3RhbnRzLlBBUkFNX0FEUl9UWVBFX0lOVEwpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBXZSBkbyBub3QgaGF2ZSBhbnkgYXBwcm9wcmlhdGUgd2F5IHRvIHN0b3JlIHRoaXMgaW5mb3JtYXRpb24uCi0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZVN0cmluZy5zdGFydHNXaXRoKCJYLSIpICYmIHR5cGUgPCAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZVN0cmluZyA9IHR5cGVTdHJpbmcuc3Vic3RyaW5nKDIpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgLy8gdkNhcmQgMy4wIGFsbG93cyBpYW5hLXRva2VuLiBBbHNvIHNvbWUgdkNhcmQgMi4xIGV4cG9ydGVycwotICAgICAgICAgICAgICAgICAgICAgICAgLy8gZW1pdCBub24tc3RhbmRhcmQgdHlwZXMuIFdlIGRvIG5vdCBoYW5kbGUgdGhlaXIgdmFsdWVzIG5vdy4KLSAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUgPSBTdHJ1Y3R1cmVkUG9zdGFsLlRZUEVfQ1VTVE9NOwotICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWwgPSB0eXBlU3RyaW5nOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gV2UgdXNlICJIT01FIiBhcyBkZWZhdWx0Ci0gICAgICAgICAgICBpZiAodHlwZSA8IDApIHsKLSAgICAgICAgICAgICAgICB0eXBlID0gU3RydWN0dXJlZFBvc3RhbC5UWVBFX0hPTUU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGFkZFBvc3RhbCh0eXBlLCBwcm9wVmFsdWVMaXN0LCBsYWJlbCwgaXNQcmltYXJ5KTsKLSAgICAgICAgfSBlbHNlIGlmIChwcm9wTmFtZS5lcXVhbHMoVkNhcmRDb25zdGFudHMuUFJPUEVSVFlfRU1BSUwpKSB7Ci0gICAgICAgICAgICBpbnQgdHlwZSA9IC0xOwotICAgICAgICAgICAgU3RyaW5nIGxhYmVsID0gbnVsbDsKLSAgICAgICAgICAgIGJvb2xlYW4gaXNQcmltYXJ5ID0gZmFsc2U7Ci0gICAgICAgICAgICBDb2xsZWN0aW9uPFN0cmluZz4gdHlwZUNvbGxlY3Rpb24gPSBwYXJhbU1hcC5nZXQoVkNhcmRDb25zdGFudHMuUEFSQU1fVFlQRSk7Ci0gICAgICAgICAgICBpZiAodHlwZUNvbGxlY3Rpb24gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGZvciAoU3RyaW5nIHR5cGVTdHJpbmcgOiB0eXBlQ29sbGVjdGlvbikgewotICAgICAgICAgICAgICAgICAgICB0eXBlU3RyaW5nID0gdHlwZVN0cmluZy50b1VwcGVyQ2FzZSgpOwotICAgICAgICAgICAgICAgICAgICBpZiAodHlwZVN0cmluZy5lcXVhbHMoVkNhcmRDb25zdGFudHMuUEFSQU1fVFlQRV9QUkVGKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgaXNQcmltYXJ5ID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlU3RyaW5nLmVxdWFscyhWQ2FyZENvbnN0YW50cy5QQVJBTV9UWVBFX0hPTUUpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0eXBlID0gRW1haWwuVFlQRV9IT01FOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGVTdHJpbmcuZXF1YWxzKFZDYXJkQ29uc3RhbnRzLlBBUkFNX1RZUEVfV09SSykpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUgPSBFbWFpbC5UWVBFX1dPUks7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZVN0cmluZy5lcXVhbHMoVkNhcmRDb25zdGFudHMuUEFSQU1fVFlQRV9DRUxMKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSA9IEVtYWlsLlRZUEVfTU9CSUxFOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVTdHJpbmcuc3RhcnRzV2l0aCgiWC0iKSAmJiB0eXBlIDwgMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVTdHJpbmcgPSB0eXBlU3RyaW5nLnN1YnN0cmluZygyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIHZDYXJkIDMuMCBhbGxvd3MgaWFuYS10b2tlbi4KLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdlIG1heSBoYXZlIElOVEVSTkVUIChzcGVjaWZpZWQgaW4gdkNhcmQgc3BlYyksCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBTQ0hPT0wsIGV0Yy4KLSAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUgPSBFbWFpbC5UWVBFX0NVU1RPTTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsID0gdHlwZVN0cmluZzsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICh0eXBlIDwgMCkgewotICAgICAgICAgICAgICAgIHR5cGUgPSBFbWFpbC5UWVBFX09USEVSOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYWRkRW1haWwodHlwZSwgcHJvcFZhbHVlLCBsYWJlbCwgaXNQcmltYXJ5KTsKLSAgICAgICAgfSBlbHNlIGlmIChwcm9wTmFtZS5lcXVhbHMoVkNhcmRDb25zdGFudHMuUFJPUEVSVFlfT1JHKSkgewotICAgICAgICAgICAgLy8gdkNhcmQgc3BlY2lmaWNhdGlvbiBkb2VzIG5vdCBzcGVjaWZ5IG90aGVyIHR5cGVzLgotICAgICAgICAgICAgZmluYWwgaW50IHR5cGUgPSBPcmdhbml6YXRpb24uVFlQRV9XT1JLOwotICAgICAgICAgICAgYm9vbGVhbiBpc1ByaW1hcnkgPSBmYWxzZTsKLSAgICAgICAgICAgIENvbGxlY3Rpb248U3RyaW5nPiB0eXBlQ29sbGVjdGlvbiA9IHBhcmFtTWFwLmdldChWQ2FyZENvbnN0YW50cy5QQVJBTV9UWVBFKTsKLSAgICAgICAgICAgIGlmICh0eXBlQ29sbGVjdGlvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgZm9yIChTdHJpbmcgdHlwZVN0cmluZyA6IHR5cGVDb2xsZWN0aW9uKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlU3RyaW5nLmVxdWFscyhWQ2FyZENvbnN0YW50cy5QQVJBTV9UWVBFX1BSRUYpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpc1ByaW1hcnkgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgaGFuZGxlT3JnVmFsdWUodHlwZSwgcHJvcFZhbHVlTGlzdCwgcGFyYW1NYXAsIGlzUHJpbWFyeSk7Ci0gICAgICAgIH0gZWxzZSBpZiAocHJvcE5hbWUuZXF1YWxzKFZDYXJkQ29uc3RhbnRzLlBST1BFUlRZX1RJVExFKSkgewotICAgICAgICAgICAgaGFuZGxlVGl0bGVWYWx1ZShwcm9wVmFsdWUpOwotICAgICAgICB9IGVsc2UgaWYgKHByb3BOYW1lLmVxdWFscyhWQ2FyZENvbnN0YW50cy5QUk9QRVJUWV9ST0xFKSkgewotICAgICAgICAgICAgLy8gVGhpcyBjb25mbGljdHMgd2l0aCBUSVRMRS4gSWdub3JlIGZvciBub3cuLi4KLSAgICAgICAgICAgIC8vIGhhbmRsZVRpdGxlVmFsdWUocHJvcFZhbHVlKTsKLSAgICAgICAgfSBlbHNlIGlmIChwcm9wTmFtZS5lcXVhbHMoVkNhcmRDb25zdGFudHMuUFJPUEVSVFlfUEhPVE8pIHx8Ci0gICAgICAgICAgICAgICAgcHJvcE5hbWUuZXF1YWxzKFZDYXJkQ29uc3RhbnRzLlBST1BFUlRZX0xPR08pKSB7Ci0gICAgICAgICAgICBDb2xsZWN0aW9uPFN0cmluZz4gcGFyYW1NYXBWYWx1ZSA9IHBhcmFtTWFwLmdldCgiVkFMVUUiKTsKLSAgICAgICAgICAgIGlmIChwYXJhbU1hcFZhbHVlICE9IG51bGwgJiYgcGFyYW1NYXBWYWx1ZS5jb250YWlucygiVVJMIikpIHsKLSAgICAgICAgICAgICAgICAvLyBDdXJyZW50bHkgd2UgZG8gbm90IGhhdmUgYXBwcm9wcmlhdGUgZXhhbXBsZSBmb3IgdGVzdGluZyB0aGlzIGNhc2UuCi0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGZpbmFsIENvbGxlY3Rpb248U3RyaW5nPiB0eXBlQ29sbGVjdGlvbiA9IHBhcmFtTWFwLmdldCgiVFlQRSIpOwotICAgICAgICAgICAgICAgIFN0cmluZyBmb3JtYXROYW1lID0gbnVsbDsKLSAgICAgICAgICAgICAgICBib29sZWFuIGlzUHJpbWFyeSA9IGZhbHNlOwotICAgICAgICAgICAgICAgIGlmICh0eXBlQ29sbGVjdGlvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoU3RyaW5nIHR5cGVWYWx1ZSA6IHR5cGVDb2xsZWN0aW9uKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoVkNhcmRDb25zdGFudHMuUEFSQU1fVFlQRV9QUkVGLmVxdWFscyh0eXBlVmFsdWUpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNQcmltYXJ5ID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZm9ybWF0TmFtZSA9PSBudWxsKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXROYW1lID0gdHlwZVZhbHVlOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGFkZFBob3RvQnl0ZXMoZm9ybWF0TmFtZSwgcHJvcEJ5dGVzLCBpc1ByaW1hcnkpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKHByb3BOYW1lLmVxdWFscyhWQ2FyZENvbnN0YW50cy5QUk9QRVJUWV9URUwpKSB7Ci0gICAgICAgICAgICBmaW5hbCBDb2xsZWN0aW9uPFN0cmluZz4gdHlwZUNvbGxlY3Rpb24gPSBwYXJhbU1hcC5nZXQoVkNhcmRDb25zdGFudHMuUEFSQU1fVFlQRSk7Ci0gICAgICAgICAgICBmaW5hbCBPYmplY3QgdHlwZU9iamVjdCA9Ci0gICAgICAgICAgICAgICAgVkNhcmRVdGlscy5nZXRQaG9uZVR5cGVGcm9tU3RyaW5ncyh0eXBlQ29sbGVjdGlvbiwgcHJvcFZhbHVlKTsKLSAgICAgICAgICAgIGZpbmFsIGludCB0eXBlOwotICAgICAgICAgICAgZmluYWwgU3RyaW5nIGxhYmVsOwotICAgICAgICAgICAgaWYgKHR5cGVPYmplY3QgaW5zdGFuY2VvZiBJbnRlZ2VyKSB7Ci0gICAgICAgICAgICAgICAgdHlwZSA9IChJbnRlZ2VyKXR5cGVPYmplY3Q7Ci0gICAgICAgICAgICAgICAgbGFiZWwgPSBudWxsOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB0eXBlID0gUGhvbmUuVFlQRV9DVVNUT007Ci0gICAgICAgICAgICAgICAgbGFiZWwgPSB0eXBlT2JqZWN0LnRvU3RyaW5nKCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gaXNQcmltYXJ5OwotICAgICAgICAgICAgaWYgKHR5cGVDb2xsZWN0aW9uICE9IG51bGwgJiYgdHlwZUNvbGxlY3Rpb24uY29udGFpbnMoVkNhcmRDb25zdGFudHMuUEFSQU1fVFlQRV9QUkVGKSkgewotICAgICAgICAgICAgICAgIGlzUHJpbWFyeSA9IHRydWU7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGlzUHJpbWFyeSA9IGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYWRkUGhvbmUodHlwZSwgcHJvcFZhbHVlLCBsYWJlbCwgaXNQcmltYXJ5KTsKLSAgICAgICAgfSBlbHNlIGlmIChwcm9wTmFtZS5lcXVhbHMoVkNhcmRDb25zdGFudHMuUFJPUEVSVFlfWF9TS1lQRV9QU1ROTlVNQkVSKSkgewotICAgICAgICAgICAgLy8gVGhlIHBob25lIG51bWJlciBhdmFpbGFibGUgdmlhIFNreXBlLgotICAgICAgICAgICAgQ29sbGVjdGlvbjxTdHJpbmc+IHR5cGVDb2xsZWN0aW9uID0gcGFyYW1NYXAuZ2V0KFZDYXJkQ29uc3RhbnRzLlBBUkFNX1RZUEUpOwotICAgICAgICAgICAgZmluYWwgaW50IHR5cGUgPSBQaG9uZS5UWVBFX09USEVSOwotICAgICAgICAgICAgZmluYWwgYm9vbGVhbiBpc1ByaW1hcnk7Ci0gICAgICAgICAgICBpZiAodHlwZUNvbGxlY3Rpb24gIT0gbnVsbCAmJiB0eXBlQ29sbGVjdGlvbi5jb250YWlucyhWQ2FyZENvbnN0YW50cy5QQVJBTV9UWVBFX1BSRUYpKSB7Ci0gICAgICAgICAgICAgICAgaXNQcmltYXJ5ID0gdHJ1ZTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaXNQcmltYXJ5ID0gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBhZGRQaG9uZSh0eXBlLCBwcm9wVmFsdWUsIG51bGwsIGlzUHJpbWFyeSk7Ci0gICAgICAgIH0gZWxzZSBpZiAoc0ltTWFwLmNvbnRhaW5zS2V5KHByb3BOYW1lKSkgewotICAgICAgICAgICAgZmluYWwgaW50IHByb3RvY29sID0gc0ltTWFwLmdldChwcm9wTmFtZSk7Ci0gICAgICAgICAgICBib29sZWFuIGlzUHJpbWFyeSA9IGZhbHNlOwotICAgICAgICAgICAgaW50IHR5cGUgPSAtMTsKLSAgICAgICAgICAgIGZpbmFsIENvbGxlY3Rpb248U3RyaW5nPiB0eXBlQ29sbGVjdGlvbiA9IHBhcmFtTWFwLmdldChWQ2FyZENvbnN0YW50cy5QQVJBTV9UWVBFKTsKLSAgICAgICAgICAgIGlmICh0eXBlQ29sbGVjdGlvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgZm9yIChTdHJpbmcgdHlwZVN0cmluZyA6IHR5cGVDb2xsZWN0aW9uKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlU3RyaW5nLmVxdWFscyhWQ2FyZENvbnN0YW50cy5QQVJBTV9UWVBFX1BSRUYpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpc1ByaW1hcnkgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGUgPCAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZVN0cmluZy5lcXVhbHNJZ25vcmVDYXNlKFZDYXJkQ29uc3RhbnRzLlBBUkFNX1RZUEVfSE9NRSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlID0gSW0uVFlQRV9IT01FOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlU3RyaW5nLmVxdWFsc0lnbm9yZUNhc2UoVkNhcmRDb25zdGFudHMuUEFSQU1fVFlQRV9XT1JLKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUgPSBJbS5UWVBFX1dPUks7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAodHlwZSA8IDApIHsKLSAgICAgICAgICAgICAgICB0eXBlID0gSW0uVFlQRV9IT01FOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYWRkSW0ocHJvdG9jb2wsIG51bGwsIHR5cGUsIHByb3BWYWx1ZSwgaXNQcmltYXJ5KTsKLSAgICAgICAgfSBlbHNlIGlmIChwcm9wTmFtZS5lcXVhbHMoVkNhcmRDb25zdGFudHMuUFJPUEVSVFlfTk9URSkpIHsKLSAgICAgICAgICAgIGFkZE5vdGUocHJvcFZhbHVlKTsKLSAgICAgICAgfSBlbHNlIGlmIChwcm9wTmFtZS5lcXVhbHMoVkNhcmRDb25zdGFudHMuUFJPUEVSVFlfVVJMKSkgewotICAgICAgICAgICAgaWYgKG1XZWJzaXRlTGlzdCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbVdlYnNpdGVMaXN0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KDEpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbVdlYnNpdGVMaXN0LmFkZChwcm9wVmFsdWUpOwotICAgICAgICB9IGVsc2UgaWYgKHByb3BOYW1lLmVxdWFscyhWQ2FyZENvbnN0YW50cy5QUk9QRVJUWV9CREFZKSkgewotICAgICAgICAgICAgbUJpcnRoZGF5ID0gcHJvcFZhbHVlOwotICAgICAgICB9IGVsc2UgaWYgKHByb3BOYW1lLmVxdWFscyhWQ2FyZENvbnN0YW50cy5QUk9QRVJUWV9BTk5JVkVSU0FSWSkpIHsKLSAgICAgICAgICAgIG1Bbm5pdmVyc2FyeSA9IHByb3BWYWx1ZTsKLSAgICAgICAgfSBlbHNlIGlmIChwcm9wTmFtZS5lcXVhbHMoVkNhcmRDb25zdGFudHMuUFJPUEVSVFlfWF9QSE9ORVRJQ19GSVJTVF9OQU1FKSkgewotICAgICAgICAgICAgbVBob25ldGljR2l2ZW5OYW1lID0gcHJvcFZhbHVlOwotICAgICAgICB9IGVsc2UgaWYgKHByb3BOYW1lLmVxdWFscyhWQ2FyZENvbnN0YW50cy5QUk9QRVJUWV9YX1BIT05FVElDX01JRERMRV9OQU1FKSkgewotICAgICAgICAgICAgbVBob25ldGljTWlkZGxlTmFtZSA9IHByb3BWYWx1ZTsKLSAgICAgICAgfSBlbHNlIGlmIChwcm9wTmFtZS5lcXVhbHMoVkNhcmRDb25zdGFudHMuUFJPUEVSVFlfWF9QSE9ORVRJQ19MQVNUX05BTUUpKSB7Ci0gICAgICAgICAgICBtUGhvbmV0aWNGYW1pbHlOYW1lID0gcHJvcFZhbHVlOwotICAgICAgICB9IGVsc2UgaWYgKHByb3BOYW1lLmVxdWFscyhWQ2FyZENvbnN0YW50cy5QUk9QRVJUWV9YX0FORFJPSURfQ1VTVE9NKSkgewotICAgICAgICAgICAgZmluYWwgTGlzdDxTdHJpbmc+IGN1c3RvbVByb3BlcnR5TGlzdCA9Ci0gICAgICAgICAgICAgICAgVkNhcmRVdGlscy5jb25zdHJ1Y3RMaXN0RnJvbVZhbHVlKHByb3BWYWx1ZSwgbVZDYXJkVHlwZSk7Ci0gICAgICAgICAgICBoYW5kbGVBbmRyb2lkQ3VzdG9tUHJvcGVydHkoY3VzdG9tUHJvcGVydHlMaXN0KTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBoYW5kbGVBbmRyb2lkQ3VzdG9tUHJvcGVydHkoZmluYWwgTGlzdDxTdHJpbmc+IGN1c3RvbVByb3BlcnR5TGlzdCkgewotICAgICAgICBpZiAobUFuZHJvaWRDdXN0b21Qcm9wZXJ0eUxpc3QgPT0gbnVsbCkgewotICAgICAgICAgICAgbUFuZHJvaWRDdXN0b21Qcm9wZXJ0eUxpc3QgPSBuZXcgQXJyYXlMaXN0PExpc3Q8U3RyaW5nPj4oKTsKLSAgICAgICAgfQotICAgICAgICBtQW5kcm9pZEN1c3RvbVByb3BlcnR5TGlzdC5hZGQoY3VzdG9tUHJvcGVydHlMaXN0KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3QgdGhlIGRpc3BsYXkgbmFtZS4gVGhlIGNvbnN0cnVjdGVkIGRhdGEgbXVzdCBub3QgYmUgbnVsbC4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgY29uc3RydWN0RGlzcGxheU5hbWUoKSB7Ci0gICAgICAgIC8vIEZ1bGxOYW1lIChjcmVhdGVkIHZpYSAiRk4iIG9yICJOQU1FIiBmaWVsZCkgaXMgcHJlZmVyZWQuCi0gICAgICAgIGlmICghVGV4dFV0aWxzLmlzRW1wdHkobUZvcm1hdHRlZE5hbWUpKSB7Ci0gICAgICAgICAgICBtRGlzcGxheU5hbWUgPSBtRm9ybWF0dGVkTmFtZTsKLSAgICAgICAgfSBlbHNlIGlmICghKFRleHRVdGlscy5pc0VtcHR5KG1GYW1pbHlOYW1lKSAmJiBUZXh0VXRpbHMuaXNFbXB0eShtR2l2ZW5OYW1lKSkpIHsKLSAgICAgICAgICAgIG1EaXNwbGF5TmFtZSA9IFZDYXJkVXRpbHMuY29uc3RydWN0TmFtZUZyb21FbGVtZW50cyhtVkNhcmRUeXBlLAotICAgICAgICAgICAgICAgICAgICBtRmFtaWx5TmFtZSwgbU1pZGRsZU5hbWUsIG1HaXZlbk5hbWUsIG1QcmVmaXgsIG1TdWZmaXgpOwotICAgICAgICB9IGVsc2UgaWYgKCEoVGV4dFV0aWxzLmlzRW1wdHkobVBob25ldGljRmFtaWx5TmFtZSkgJiYKLSAgICAgICAgICAgICAgICBUZXh0VXRpbHMuaXNFbXB0eShtUGhvbmV0aWNHaXZlbk5hbWUpKSkgewotICAgICAgICAgICAgbURpc3BsYXlOYW1lID0gVkNhcmRVdGlscy5jb25zdHJ1Y3ROYW1lRnJvbUVsZW1lbnRzKG1WQ2FyZFR5cGUsCi0gICAgICAgICAgICAgICAgICAgIG1QaG9uZXRpY0ZhbWlseU5hbWUsIG1QaG9uZXRpY01pZGRsZU5hbWUsIG1QaG9uZXRpY0dpdmVuTmFtZSk7Ci0gICAgICAgIH0gZWxzZSBpZiAobUVtYWlsTGlzdCAhPSBudWxsICYmIG1FbWFpbExpc3Quc2l6ZSgpID4gMCkgewotICAgICAgICAgICAgbURpc3BsYXlOYW1lID0gbUVtYWlsTGlzdC5nZXQoMCkuZGF0YTsKLSAgICAgICAgfSBlbHNlIGlmIChtUGhvbmVMaXN0ICE9IG51bGwgJiYgbVBob25lTGlzdC5zaXplKCkgPiAwKSB7Ci0gICAgICAgICAgICBtRGlzcGxheU5hbWUgPSBtUGhvbmVMaXN0LmdldCgwKS5kYXRhOwotICAgICAgICB9IGVsc2UgaWYgKG1Qb3N0YWxMaXN0ICE9IG51bGwgJiYgbVBvc3RhbExpc3Quc2l6ZSgpID4gMCkgewotICAgICAgICAgICAgbURpc3BsYXlOYW1lID0gbVBvc3RhbExpc3QuZ2V0KDApLmdldEZvcm1hdHRlZEFkZHJlc3MobVZDYXJkVHlwZSk7Ci0gICAgICAgIH0gZWxzZSBpZiAobU9yZ2FuaXphdGlvbkxpc3QgIT0gbnVsbCAmJiBtT3JnYW5pemF0aW9uTGlzdC5zaXplKCkgPiAwKSB7Ci0gICAgICAgICAgICBtRGlzcGxheU5hbWUgPSBtT3JnYW5pemF0aW9uTGlzdC5nZXQoMCkuZ2V0Rm9ybWF0dGVkU3RyaW5nKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobURpc3BsYXlOYW1lID09IG51bGwpIHsKLSAgICAgICAgICAgIG1EaXNwbGF5TmFtZSA9ICIiOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29uc29saWRhdGUgc2V2ZXJhbCBmaWVsc2RzIChsaWtlIG1OYW1lKSB1c2luZyBuYW1lIGNhbmRpZGF0ZXMsCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgY29uc29saWRhdGVGaWVsZHMoKSB7Ci0gICAgICAgIGNvbnN0cnVjdERpc3BsYXlOYW1lKCk7Ci0KLSAgICAgICAgaWYgKG1QaG9uZXRpY0Z1bGxOYW1lICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1QaG9uZXRpY0Z1bGxOYW1lID0gbVBob25ldGljRnVsbE5hbWUudHJpbSgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIFVyaSBwdXNoSW50b0NvbnRlbnRSZXNvbHZlcihDb250ZW50UmVzb2x2ZXIgcmVzb2x2ZXIpIHsKLSAgICAgICAgQXJyYXlMaXN0PENvbnRlbnRQcm92aWRlck9wZXJhdGlvbj4gb3BlcmF0aW9uTGlzdCA9Ci0gICAgICAgICAgICBuZXcgQXJyYXlMaXN0PENvbnRlbnRQcm92aWRlck9wZXJhdGlvbj4oKTsKLSAgICAgICAgLy8gQWZ0ZXIgYXBwbHlpbmcgdGhlIGJhdGNoIHRoZSBmaXJzdCByZXN1bHQncyBVcmkgaXMgcmV0dXJuZWQgc28gaXQgaXMgaW1wb3J0YW50IHRoYXQKLSAgICAgICAgLy8gdGhlIFJhd0NvbnRhY3QgaXMgdGhlIGZpcnN0IG9wZXJhdGlvbiB0aGF0IGdldHMgaW5zZXJ0ZWQgaW50byB0aGUgbGlzdAotICAgICAgICBDb250ZW50UHJvdmlkZXJPcGVyYXRpb24uQnVpbGRlciBidWlsZGVyID0KLSAgICAgICAgICAgIENvbnRlbnRQcm92aWRlck9wZXJhdGlvbi5uZXdJbnNlcnQoUmF3Q29udGFjdHMuQ09OVEVOVF9VUkkpOwotICAgICAgICBTdHJpbmcgbXlHcm91cHNJZCA9IG51bGw7Ci0gICAgICAgIGlmIChtQWNjb3VudCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBidWlsZGVyLndpdGhWYWx1ZShSYXdDb250YWN0cy5BQ0NPVU5UX05BTUUsIG1BY2NvdW50Lm5hbWUpOwotICAgICAgICAgICAgYnVpbGRlci53aXRoVmFsdWUoUmF3Q29udGFjdHMuQUNDT1VOVF9UWVBFLCBtQWNjb3VudC50eXBlKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGJ1aWxkZXIud2l0aFZhbHVlKFJhd0NvbnRhY3RzLkFDQ09VTlRfTkFNRSwgbnVsbCk7Ci0gICAgICAgICAgICBidWlsZGVyLndpdGhWYWx1ZShSYXdDb250YWN0cy5BQ0NPVU5UX1RZUEUsIG51bGwpOwotICAgICAgICB9Ci0gICAgICAgIG9wZXJhdGlvbkxpc3QuYWRkKGJ1aWxkZXIuYnVpbGQoKSk7Ci0KLSAgICAgICAgaWYgKCFuYW1lRmllbGRzQXJlRW1wdHkoKSkgewotICAgICAgICAgICAgYnVpbGRlciA9IENvbnRlbnRQcm92aWRlck9wZXJhdGlvbi5uZXdJbnNlcnQoRGF0YS5DT05URU5UX1VSSSk7Ci0gICAgICAgICAgICBidWlsZGVyLndpdGhWYWx1ZUJhY2tSZWZlcmVuY2UoU3RydWN0dXJlZE5hbWUuUkFXX0NPTlRBQ1RfSUQsIDApOwotICAgICAgICAgICAgYnVpbGRlci53aXRoVmFsdWUoRGF0YS5NSU1FVFlQRSwgU3RydWN0dXJlZE5hbWUuQ09OVEVOVF9JVEVNX1RZUEUpOwotCi0gICAgICAgICAgICBidWlsZGVyLndpdGhWYWx1ZShTdHJ1Y3R1cmVkTmFtZS5HSVZFTl9OQU1FLCBtR2l2ZW5OYW1lKTsKLSAgICAgICAgICAgIGJ1aWxkZXIud2l0aFZhbHVlKFN0cnVjdHVyZWROYW1lLkZBTUlMWV9OQU1FLCBtRmFtaWx5TmFtZSk7Ci0gICAgICAgICAgICBidWlsZGVyLndpdGhWYWx1ZShTdHJ1Y3R1cmVkTmFtZS5NSURETEVfTkFNRSwgbU1pZGRsZU5hbWUpOwotICAgICAgICAgICAgYnVpbGRlci53aXRoVmFsdWUoU3RydWN0dXJlZE5hbWUuUFJFRklYLCBtUHJlZml4KTsKLSAgICAgICAgICAgIGJ1aWxkZXIud2l0aFZhbHVlKFN0cnVjdHVyZWROYW1lLlNVRkZJWCwgbVN1ZmZpeCk7Ci0KLSAgICAgICAgICAgIGlmICghKFRleHRVdGlscy5pc0VtcHR5KG1QaG9uZXRpY0dpdmVuTmFtZSkKLSAgICAgICAgICAgICAgICAgICAgJiYgVGV4dFV0aWxzLmlzRW1wdHkobVBob25ldGljRmFtaWx5TmFtZSkKLSAgICAgICAgICAgICAgICAgICAgJiYgVGV4dFV0aWxzLmlzRW1wdHkobVBob25ldGljTWlkZGxlTmFtZSkpKSB7Ci0gICAgICAgICAgICAgICAgYnVpbGRlci53aXRoVmFsdWUoU3RydWN0dXJlZE5hbWUuUEhPTkVUSUNfR0lWRU5fTkFNRSwgbVBob25ldGljR2l2ZW5OYW1lKTsKLSAgICAgICAgICAgICAgICBidWlsZGVyLndpdGhWYWx1ZShTdHJ1Y3R1cmVkTmFtZS5QSE9ORVRJQ19GQU1JTFlfTkFNRSwgbVBob25ldGljRmFtaWx5TmFtZSk7Ci0gICAgICAgICAgICAgICAgYnVpbGRlci53aXRoVmFsdWUoU3RydWN0dXJlZE5hbWUuUEhPTkVUSUNfTUlERExFX05BTUUsIG1QaG9uZXRpY01pZGRsZU5hbWUpOwotICAgICAgICAgICAgfSBlbHNlIGlmICghVGV4dFV0aWxzLmlzRW1wdHkobVBob25ldGljRnVsbE5hbWUpKSB7Ci0gICAgICAgICAgICAgICAgYnVpbGRlci53aXRoVmFsdWUoU3RydWN0dXJlZE5hbWUuUEhPTkVUSUNfR0lWRU5fTkFNRSwgbVBob25ldGljRnVsbE5hbWUpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBidWlsZGVyLndpdGhWYWx1ZShTdHJ1Y3R1cmVkTmFtZS5ESVNQTEFZX05BTUUsIGdldERpc3BsYXlOYW1lKCkpOwotICAgICAgICAgICAgb3BlcmF0aW9uTGlzdC5hZGQoYnVpbGRlci5idWlsZCgpKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtTmlja05hbWVMaXN0ICE9IG51bGwgJiYgbU5pY2tOYW1lTGlzdC5zaXplKCkgPiAwKSB7Ci0gICAgICAgICAgICBmb3IgKFN0cmluZyBuaWNrTmFtZSA6IG1OaWNrTmFtZUxpc3QpIHsKLSAgICAgICAgICAgICAgICBidWlsZGVyID0gQ29udGVudFByb3ZpZGVyT3BlcmF0aW9uLm5ld0luc2VydChEYXRhLkNPTlRFTlRfVVJJKTsKLSAgICAgICAgICAgICAgICBidWlsZGVyLndpdGhWYWx1ZUJhY2tSZWZlcmVuY2UoTmlja25hbWUuUkFXX0NPTlRBQ1RfSUQsIDApOwotICAgICAgICAgICAgICAgIGJ1aWxkZXIud2l0aFZhbHVlKERhdGEuTUlNRVRZUEUsIE5pY2tuYW1lLkNPTlRFTlRfSVRFTV9UWVBFKTsKLSAgICAgICAgICAgICAgICBidWlsZGVyLndpdGhWYWx1ZShOaWNrbmFtZS5UWVBFLCBOaWNrbmFtZS5UWVBFX0RFRkFVTFQpOwotICAgICAgICAgICAgICAgIGJ1aWxkZXIud2l0aFZhbHVlKE5pY2tuYW1lLk5BTUUsIG5pY2tOYW1lKTsKLSAgICAgICAgICAgICAgICBvcGVyYXRpb25MaXN0LmFkZChidWlsZGVyLmJ1aWxkKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG1QaG9uZUxpc3QgIT0gbnVsbCkgewotICAgICAgICAgICAgZm9yIChQaG9uZURhdGEgcGhvbmVEYXRhIDogbVBob25lTGlzdCkgewotICAgICAgICAgICAgICAgIGJ1aWxkZXIgPSBDb250ZW50UHJvdmlkZXJPcGVyYXRpb24ubmV3SW5zZXJ0KERhdGEuQ09OVEVOVF9VUkkpOwotICAgICAgICAgICAgICAgIGJ1aWxkZXIud2l0aFZhbHVlQmFja1JlZmVyZW5jZShQaG9uZS5SQVdfQ09OVEFDVF9JRCwgMCk7Ci0gICAgICAgICAgICAgICAgYnVpbGRlci53aXRoVmFsdWUoRGF0YS5NSU1FVFlQRSwgUGhvbmUuQ09OVEVOVF9JVEVNX1RZUEUpOwotCi0gICAgICAgICAgICAgICAgYnVpbGRlci53aXRoVmFsdWUoUGhvbmUuVFlQRSwgcGhvbmVEYXRhLnR5cGUpOwotICAgICAgICAgICAgICAgIGlmIChwaG9uZURhdGEudHlwZSA9PSBQaG9uZS5UWVBFX0NVU1RPTSkgewotICAgICAgICAgICAgICAgICAgICBidWlsZGVyLndpdGhWYWx1ZShQaG9uZS5MQUJFTCwgcGhvbmVEYXRhLmxhYmVsKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnVpbGRlci53aXRoVmFsdWUoUGhvbmUuTlVNQkVSLCBwaG9uZURhdGEuZGF0YSk7Ci0gICAgICAgICAgICAgICAgaWYgKHBob25lRGF0YS5pc1ByaW1hcnkpIHsKLSAgICAgICAgICAgICAgICAgICAgYnVpbGRlci53aXRoVmFsdWUoUGhvbmUuSVNfUFJJTUFSWSwgMSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG9wZXJhdGlvbkxpc3QuYWRkKGJ1aWxkZXIuYnVpbGQoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobU9yZ2FuaXphdGlvbkxpc3QgIT0gbnVsbCkgewotICAgICAgICAgICAgZm9yIChPcmdhbml6YXRpb25EYXRhIG9yZ2FuaXphdGlvbkRhdGEgOiBtT3JnYW5pemF0aW9uTGlzdCkgewotICAgICAgICAgICAgICAgIGJ1aWxkZXIgPSBDb250ZW50UHJvdmlkZXJPcGVyYXRpb24ubmV3SW5zZXJ0KERhdGEuQ09OVEVOVF9VUkkpOwotICAgICAgICAgICAgICAgIGJ1aWxkZXIud2l0aFZhbHVlQmFja1JlZmVyZW5jZShPcmdhbml6YXRpb24uUkFXX0NPTlRBQ1RfSUQsIDApOwotICAgICAgICAgICAgICAgIGJ1aWxkZXIud2l0aFZhbHVlKERhdGEuTUlNRVRZUEUsIE9yZ2FuaXphdGlvbi5DT05URU5UX0lURU1fVFlQRSk7Ci0gICAgICAgICAgICAgICAgYnVpbGRlci53aXRoVmFsdWUoT3JnYW5pemF0aW9uLlRZUEUsIG9yZ2FuaXphdGlvbkRhdGEudHlwZSk7Ci0gICAgICAgICAgICAgICAgaWYgKG9yZ2FuaXphdGlvbkRhdGEuY29tcGFueU5hbWUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBidWlsZGVyLndpdGhWYWx1ZShPcmdhbml6YXRpb24uQ09NUEFOWSwgb3JnYW5pemF0aW9uRGF0YS5jb21wYW55TmFtZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChvcmdhbml6YXRpb25EYXRhLmRlcGFydG1lbnROYW1lICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgYnVpbGRlci53aXRoVmFsdWUoT3JnYW5pemF0aW9uLkRFUEFSVE1FTlQsIG9yZ2FuaXphdGlvbkRhdGEuZGVwYXJ0bWVudE5hbWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAob3JnYW5pemF0aW9uRGF0YS50aXRsZU5hbWUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBidWlsZGVyLndpdGhWYWx1ZShPcmdhbml6YXRpb24uVElUTEUsIG9yZ2FuaXphdGlvbkRhdGEudGl0bGVOYW1lKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKG9yZ2FuaXphdGlvbkRhdGEucGhvbmV0aWNOYW1lICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgYnVpbGRlci53aXRoVmFsdWUoT3JnYW5pemF0aW9uLlBIT05FVElDX05BTUUsIG9yZ2FuaXphdGlvbkRhdGEucGhvbmV0aWNOYW1lKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKG9yZ2FuaXphdGlvbkRhdGEuaXNQcmltYXJ5KSB7Ci0gICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIud2l0aFZhbHVlKE9yZ2FuaXphdGlvbi5JU19QUklNQVJZLCAxKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgb3BlcmF0aW9uTGlzdC5hZGQoYnVpbGRlci5idWlsZCgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtRW1haWxMaXN0ICE9IG51bGwpIHsKLSAgICAgICAgICAgIGZvciAoRW1haWxEYXRhIGVtYWlsRGF0YSA6IG1FbWFpbExpc3QpIHsKLSAgICAgICAgICAgICAgICBidWlsZGVyID0gQ29udGVudFByb3ZpZGVyT3BlcmF0aW9uLm5ld0luc2VydChEYXRhLkNPTlRFTlRfVVJJKTsKLSAgICAgICAgICAgICAgICBidWlsZGVyLndpdGhWYWx1ZUJhY2tSZWZlcmVuY2UoRW1haWwuUkFXX0NPTlRBQ1RfSUQsIDApOwotICAgICAgICAgICAgICAgIGJ1aWxkZXIud2l0aFZhbHVlKERhdGEuTUlNRVRZUEUsIEVtYWlsLkNPTlRFTlRfSVRFTV9UWVBFKTsKLQotICAgICAgICAgICAgICAgIGJ1aWxkZXIud2l0aFZhbHVlKEVtYWlsLlRZUEUsIGVtYWlsRGF0YS50eXBlKTsKLSAgICAgICAgICAgICAgICBpZiAoZW1haWxEYXRhLnR5cGUgPT0gRW1haWwuVFlQRV9DVVNUT00pIHsKLSAgICAgICAgICAgICAgICAgICAgYnVpbGRlci53aXRoVmFsdWUoRW1haWwuTEFCRUwsIGVtYWlsRGF0YS5sYWJlbCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJ1aWxkZXIud2l0aFZhbHVlKEVtYWlsLkRBVEEsIGVtYWlsRGF0YS5kYXRhKTsKLSAgICAgICAgICAgICAgICBpZiAoZW1haWxEYXRhLmlzUHJpbWFyeSkgewotICAgICAgICAgICAgICAgICAgICBidWlsZGVyLndpdGhWYWx1ZShEYXRhLklTX1BSSU1BUlksIDEpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBvcGVyYXRpb25MaXN0LmFkZChidWlsZGVyLmJ1aWxkKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG1Qb3N0YWxMaXN0ICE9IG51bGwpIHsKLSAgICAgICAgICAgIGZvciAoUG9zdGFsRGF0YSBwb3N0YWxEYXRhIDogbVBvc3RhbExpc3QpIHsKLSAgICAgICAgICAgICAgICBidWlsZGVyID0gQ29udGVudFByb3ZpZGVyT3BlcmF0aW9uLm5ld0luc2VydChEYXRhLkNPTlRFTlRfVVJJKTsKLSAgICAgICAgICAgICAgICBWQ2FyZFV0aWxzLmluc2VydFN0cnVjdHVyZWRQb3N0YWxEYXRhVXNpbmdDb250YWN0c1N0cnVjdCgKLSAgICAgICAgICAgICAgICAgICAgICAgIG1WQ2FyZFR5cGUsIGJ1aWxkZXIsIHBvc3RhbERhdGEpOwotICAgICAgICAgICAgICAgIG9wZXJhdGlvbkxpc3QuYWRkKGJ1aWxkZXIuYnVpbGQoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobUltTGlzdCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBmb3IgKEltRGF0YSBpbURhdGEgOiBtSW1MaXN0KSB7Ci0gICAgICAgICAgICAgICAgYnVpbGRlciA9IENvbnRlbnRQcm92aWRlck9wZXJhdGlvbi5uZXdJbnNlcnQoRGF0YS5DT05URU5UX1VSSSk7Ci0gICAgICAgICAgICAgICAgYnVpbGRlci53aXRoVmFsdWVCYWNrUmVmZXJlbmNlKEltLlJBV19DT05UQUNUX0lELCAwKTsKLSAgICAgICAgICAgICAgICBidWlsZGVyLndpdGhWYWx1ZShEYXRhLk1JTUVUWVBFLCBJbS5DT05URU5UX0lURU1fVFlQRSk7Ci0gICAgICAgICAgICAgICAgYnVpbGRlci53aXRoVmFsdWUoSW0uVFlQRSwgaW1EYXRhLnR5cGUpOwotICAgICAgICAgICAgICAgIGJ1aWxkZXIud2l0aFZhbHVlKEltLlBST1RPQ09MLCBpbURhdGEucHJvdG9jb2wpOwotICAgICAgICAgICAgICAgIGJ1aWxkZXIud2l0aFZhbHVlKEltLkRBVEEsIGltRGF0YS5kYXRhKTsKLSAgICAgICAgICAgICAgICBpZiAoaW1EYXRhLnByb3RvY29sID09IEltLlBST1RPQ09MX0NVU1RPTSkgewotICAgICAgICAgICAgICAgICAgICBidWlsZGVyLndpdGhWYWx1ZShJbS5DVVNUT01fUFJPVE9DT0wsIGltRGF0YS5jdXN0b21Qcm90b2NvbCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChpbURhdGEuaXNQcmltYXJ5KSB7Ci0gICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIud2l0aFZhbHVlKERhdGEuSVNfUFJJTUFSWSwgMSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG9wZXJhdGlvbkxpc3QuYWRkKGJ1aWxkZXIuYnVpbGQoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobU5vdGVMaXN0ICE9IG51bGwpIHsKLSAgICAgICAgICAgIGZvciAoU3RyaW5nIG5vdGUgOiBtTm90ZUxpc3QpIHsKLSAgICAgICAgICAgICAgICBidWlsZGVyID0gQ29udGVudFByb3ZpZGVyT3BlcmF0aW9uLm5ld0luc2VydChEYXRhLkNPTlRFTlRfVVJJKTsKLSAgICAgICAgICAgICAgICBidWlsZGVyLndpdGhWYWx1ZUJhY2tSZWZlcmVuY2UoTm90ZS5SQVdfQ09OVEFDVF9JRCwgMCk7Ci0gICAgICAgICAgICAgICAgYnVpbGRlci53aXRoVmFsdWUoRGF0YS5NSU1FVFlQRSwgTm90ZS5DT05URU5UX0lURU1fVFlQRSk7Ci0gICAgICAgICAgICAgICAgYnVpbGRlci53aXRoVmFsdWUoTm90ZS5OT1RFLCBub3RlKTsKLSAgICAgICAgICAgICAgICBvcGVyYXRpb25MaXN0LmFkZChidWlsZGVyLmJ1aWxkKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG1QaG90b0xpc3QgIT0gbnVsbCkgewotICAgICAgICAgICAgZm9yIChQaG90b0RhdGEgcGhvdG9EYXRhIDogbVBob3RvTGlzdCkgewotICAgICAgICAgICAgICAgIGJ1aWxkZXIgPSBDb250ZW50UHJvdmlkZXJPcGVyYXRpb24ubmV3SW5zZXJ0KERhdGEuQ09OVEVOVF9VUkkpOwotICAgICAgICAgICAgICAgIGJ1aWxkZXIud2l0aFZhbHVlQmFja1JlZmVyZW5jZShQaG90by5SQVdfQ09OVEFDVF9JRCwgMCk7Ci0gICAgICAgICAgICAgICAgYnVpbGRlci53aXRoVmFsdWUoRGF0YS5NSU1FVFlQRSwgUGhvdG8uQ09OVEVOVF9JVEVNX1RZUEUpOwotICAgICAgICAgICAgICAgIGJ1aWxkZXIud2l0aFZhbHVlKFBob3RvLlBIT1RPLCBwaG90b0RhdGEucGhvdG9CeXRlcyk7Ci0gICAgICAgICAgICAgICAgaWYgKHBob3RvRGF0YS5pc1ByaW1hcnkpIHsKLSAgICAgICAgICAgICAgICAgICAgYnVpbGRlci53aXRoVmFsdWUoUGhvdG8uSVNfUFJJTUFSWSwgMSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG9wZXJhdGlvbkxpc3QuYWRkKGJ1aWxkZXIuYnVpbGQoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobVdlYnNpdGVMaXN0ICE9IG51bGwpIHsKLSAgICAgICAgICAgIGZvciAoU3RyaW5nIHdlYnNpdGUgOiBtV2Vic2l0ZUxpc3QpIHsKLSAgICAgICAgICAgICAgICBidWlsZGVyID0gQ29udGVudFByb3ZpZGVyT3BlcmF0aW9uLm5ld0luc2VydChEYXRhLkNPTlRFTlRfVVJJKTsKLSAgICAgICAgICAgICAgICBidWlsZGVyLndpdGhWYWx1ZUJhY2tSZWZlcmVuY2UoV2Vic2l0ZS5SQVdfQ09OVEFDVF9JRCwgMCk7Ci0gICAgICAgICAgICAgICAgYnVpbGRlci53aXRoVmFsdWUoRGF0YS5NSU1FVFlQRSwgV2Vic2l0ZS5DT05URU5UX0lURU1fVFlQRSk7Ci0gICAgICAgICAgICAgICAgYnVpbGRlci53aXRoVmFsdWUoV2Vic2l0ZS5VUkwsIHdlYnNpdGUpOwotICAgICAgICAgICAgICAgIC8vIFRoZXJlJ3Mgbm8gaW5mb3JtYXRpb24gYWJvdXQgdGhlIHR5cGUgb2YgVVJMIGluIHZDYXJkLgotICAgICAgICAgICAgICAgIC8vIFdlIHVzZSBUWVBFX0hPTUVQQUdFIGZvciBzYWZldHkuCi0gICAgICAgICAgICAgICAgYnVpbGRlci53aXRoVmFsdWUoV2Vic2l0ZS5UWVBFLCBXZWJzaXRlLlRZUEVfSE9NRVBBR0UpOwotICAgICAgICAgICAgICAgIG9wZXJhdGlvbkxpc3QuYWRkKGJ1aWxkZXIuYnVpbGQoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoIVRleHRVdGlscy5pc0VtcHR5KG1CaXJ0aGRheSkpIHsKLSAgICAgICAgICAgIGJ1aWxkZXIgPSBDb250ZW50UHJvdmlkZXJPcGVyYXRpb24ubmV3SW5zZXJ0KERhdGEuQ09OVEVOVF9VUkkpOwotICAgICAgICAgICAgYnVpbGRlci53aXRoVmFsdWVCYWNrUmVmZXJlbmNlKEV2ZW50LlJBV19DT05UQUNUX0lELCAwKTsKLSAgICAgICAgICAgIGJ1aWxkZXIud2l0aFZhbHVlKERhdGEuTUlNRVRZUEUsIEV2ZW50LkNPTlRFTlRfSVRFTV9UWVBFKTsKLSAgICAgICAgICAgIGJ1aWxkZXIud2l0aFZhbHVlKEV2ZW50LlNUQVJUX0RBVEUsIG1CaXJ0aGRheSk7Ci0gICAgICAgICAgICBidWlsZGVyLndpdGhWYWx1ZShFdmVudC5UWVBFLCBFdmVudC5UWVBFX0JJUlRIREFZKTsKLSAgICAgICAgICAgIG9wZXJhdGlvbkxpc3QuYWRkKGJ1aWxkZXIuYnVpbGQoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoIVRleHRVdGlscy5pc0VtcHR5KG1Bbm5pdmVyc2FyeSkpIHsKLSAgICAgICAgICAgIGJ1aWxkZXIgPSBDb250ZW50UHJvdmlkZXJPcGVyYXRpb24ubmV3SW5zZXJ0KERhdGEuQ09OVEVOVF9VUkkpOwotICAgICAgICAgICAgYnVpbGRlci53aXRoVmFsdWVCYWNrUmVmZXJlbmNlKEV2ZW50LlJBV19DT05UQUNUX0lELCAwKTsKLSAgICAgICAgICAgIGJ1aWxkZXIud2l0aFZhbHVlKERhdGEuTUlNRVRZUEUsIEV2ZW50LkNPTlRFTlRfSVRFTV9UWVBFKTsKLSAgICAgICAgICAgIGJ1aWxkZXIud2l0aFZhbHVlKEV2ZW50LlNUQVJUX0RBVEUsIG1Bbm5pdmVyc2FyeSk7Ci0gICAgICAgICAgICBidWlsZGVyLndpdGhWYWx1ZShFdmVudC5UWVBFLCBFdmVudC5UWVBFX0FOTklWRVJTQVJZKTsKLSAgICAgICAgICAgIG9wZXJhdGlvbkxpc3QuYWRkKGJ1aWxkZXIuYnVpbGQoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobUFuZHJvaWRDdXN0b21Qcm9wZXJ0eUxpc3QgIT0gbnVsbCkgewotICAgICAgICAgICAgZm9yIChMaXN0PFN0cmluZz4gY3VzdG9tUHJvcGVydHlMaXN0IDogbUFuZHJvaWRDdXN0b21Qcm9wZXJ0eUxpc3QpIHsKLSAgICAgICAgICAgICAgICBpbnQgc2l6ZSA9IGN1c3RvbVByb3BlcnR5TGlzdC5zaXplKCk7Ci0gICAgICAgICAgICAgICAgaWYgKHNpemUgPCAyIHx8IFRleHRVdGlscy5pc0VtcHR5KGN1c3RvbVByb3BlcnR5TGlzdC5nZXQoMCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc2l6ZSA+IFZDYXJkQ29uc3RhbnRzLk1BWF9EQVRBX0NPTFVNTiArIDEpIHsKLSAgICAgICAgICAgICAgICAgICAgc2l6ZSA9IFZDYXJkQ29uc3RhbnRzLk1BWF9EQVRBX0NPTFVNTiArIDE7Ci0gICAgICAgICAgICAgICAgICAgIGN1c3RvbVByb3BlcnR5TGlzdCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBjdXN0b21Qcm9wZXJ0eUxpc3Quc3ViTGlzdCgwLCBWQ2FyZENvbnN0YW50cy5NQVhfREFUQV9DT0xVTU4gKyAyKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpbnQgaSA9IDA7Ci0gICAgICAgICAgICAgICAgZm9yIChmaW5hbCBTdHJpbmcgY3VzdG9tUHJvcGVydHlWYWx1ZSA6IGN1c3RvbVByb3BlcnR5TGlzdCkgewotICAgICAgICAgICAgICAgICAgICBpZiAoaSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgbWltZVR5cGUgPSBjdXN0b21Qcm9wZXJ0eVZhbHVlOwotICAgICAgICAgICAgICAgICAgICAgICAgYnVpbGRlciA9IENvbnRlbnRQcm92aWRlck9wZXJhdGlvbi5uZXdJbnNlcnQoRGF0YS5DT05URU5UX1VSSSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBidWlsZGVyLndpdGhWYWx1ZUJhY2tSZWZlcmVuY2UoR3JvdXBNZW1iZXJzaGlwLlJBV19DT05UQUNUX0lELCAwKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIud2l0aFZhbHVlKERhdGEuTUlNRVRZUEUsIG1pbWVUeXBlKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsgIC8vIDEgPD0gaSAmJiBpIDw9IE1BWF9EQVRBX0NPTFVNTlMKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICghVGV4dFV0aWxzLmlzRW1wdHkoY3VzdG9tUHJvcGVydHlWYWx1ZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWlsZGVyLndpdGhWYWx1ZSgiZGF0YSIgKyBpLCBjdXN0b21Qcm9wZXJ0eVZhbHVlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGkrKzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgb3BlcmF0aW9uTGlzdC5hZGQoYnVpbGRlci5idWlsZCgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmIChteUdyb3Vwc0lkICE9IG51bGwpIHsKLSAgICAgICAgICAgIGJ1aWxkZXIgPSBDb250ZW50UHJvdmlkZXJPcGVyYXRpb24ubmV3SW5zZXJ0KERhdGEuQ09OVEVOVF9VUkkpOwotICAgICAgICAgICAgYnVpbGRlci53aXRoVmFsdWVCYWNrUmVmZXJlbmNlKEdyb3VwTWVtYmVyc2hpcC5SQVdfQ09OVEFDVF9JRCwgMCk7Ci0gICAgICAgICAgICBidWlsZGVyLndpdGhWYWx1ZShEYXRhLk1JTUVUWVBFLCBHcm91cE1lbWJlcnNoaXAuQ09OVEVOVF9JVEVNX1RZUEUpOwotICAgICAgICAgICAgYnVpbGRlci53aXRoVmFsdWUoR3JvdXBNZW1iZXJzaGlwLkdST1VQX1NPVVJDRV9JRCwgbXlHcm91cHNJZCk7Ci0gICAgICAgICAgICBvcGVyYXRpb25MaXN0LmFkZChidWlsZGVyLmJ1aWxkKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIENvbnRlbnRQcm92aWRlclJlc3VsdFtdIHJlc3VsdHMgPSByZXNvbHZlci5hcHBseUJhdGNoKAotICAgICAgICAgICAgICAgICAgICAgICAgQ29udGFjdHNDb250cmFjdC5BVVRIT1JJVFksIG9wZXJhdGlvbkxpc3QpOwotICAgICAgICAgICAgLy8gdGhlIGZpcnN0IHJlc3VsdCBpcyBhbHdheXMgdGhlIHJhd19jb250YWN0LiByZXR1cm4gaXQncyB1cmkgc28KLSAgICAgICAgICAgIC8vIHRoYXQgaXQgY2FuIGJlIGZvdW5kIGxhdGVyLiBkbyBudWxsIGNoZWNraW5nIGZvciBiYWRseSBiZWhhdmluZwotICAgICAgICAgICAgLy8gQ29udGVudFJlc29sdmVycwotICAgICAgICAgICAgcmV0dXJuIChyZXN1bHRzID09IG51bGwgfHwgcmVzdWx0cy5sZW5ndGggPT0gMCB8fCByZXN1bHRzWzBdID09IG51bGwpCi0gICAgICAgICAgICAgICAgPyBudWxsCi0gICAgICAgICAgICAgICAgOiByZXN1bHRzWzBdLnVyaTsKLSAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIExvZy5lKExPR19UQUcsIFN0cmluZy5mb3JtYXQoIiVzOiAlcyIsIGUudG9TdHJpbmcoKSwgZS5nZXRNZXNzYWdlKCkpKTsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9IGNhdGNoIChPcGVyYXRpb25BcHBsaWNhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBMb2cuZShMT0dfVEFHLCBTdHJpbmcuZm9ybWF0KCIlczogJXMiLCBlLnRvU3RyaW5nKCksIGUuZ2V0TWVzc2FnZSgpKSk7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgVkNhcmRFbnRyeSBidWlsZEZyb21SZXNvbHZlcihDb250ZW50UmVzb2x2ZXIgcmVzb2x2ZXIpIHsKLSAgICAgICAgcmV0dXJuIGJ1aWxkRnJvbVJlc29sdmVyKHJlc29sdmVyLCBDb250YWN0cy5DT05URU5UX1VSSSk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBWQ2FyZEVudHJ5IGJ1aWxkRnJvbVJlc29sdmVyKENvbnRlbnRSZXNvbHZlciByZXNvbHZlciwgVXJpIHVyaSkgewotCi0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHByaXZhdGUgYm9vbGVhbiBuYW1lRmllbGRzQXJlRW1wdHkoKSB7Ci0gICAgICAgIHJldHVybiAoVGV4dFV0aWxzLmlzRW1wdHkobUZhbWlseU5hbWUpCi0gICAgICAgICAgICAgICAgJiYgVGV4dFV0aWxzLmlzRW1wdHkobU1pZGRsZU5hbWUpCi0gICAgICAgICAgICAgICAgJiYgVGV4dFV0aWxzLmlzRW1wdHkobUdpdmVuTmFtZSkKLSAgICAgICAgICAgICAgICAmJiBUZXh0VXRpbHMuaXNFbXB0eShtUHJlZml4KQotICAgICAgICAgICAgICAgICYmIFRleHRVdGlscy5pc0VtcHR5KG1TdWZmaXgpCi0gICAgICAgICAgICAgICAgJiYgVGV4dFV0aWxzLmlzRW1wdHkobUZvcm1hdHRlZE5hbWUpCi0gICAgICAgICAgICAgICAgJiYgVGV4dFV0aWxzLmlzRW1wdHkobVBob25ldGljRmFtaWx5TmFtZSkKLSAgICAgICAgICAgICAgICAmJiBUZXh0VXRpbHMuaXNFbXB0eShtUGhvbmV0aWNNaWRkbGVOYW1lKQotICAgICAgICAgICAgICAgICYmIFRleHRVdGlscy5pc0VtcHR5KG1QaG9uZXRpY0dpdmVuTmFtZSkKLSAgICAgICAgICAgICAgICAmJiBUZXh0VXRpbHMuaXNFbXB0eShtUGhvbmV0aWNGdWxsTmFtZSkpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzSWdub3JhYmxlKCkgewotICAgICAgICByZXR1cm4gZ2V0RGlzcGxheU5hbWUoKS5sZW5ndGgoKSA9PSAwOwotICAgIH0KLQotICAgIHByaXZhdGUgU3RyaW5nIGxpc3RUb1N0cmluZyhMaXN0PFN0cmluZz4gbGlzdCl7Ci0gICAgICAgIGZpbmFsIGludCBzaXplID0gbGlzdC5zaXplKCk7Ci0gICAgICAgIGlmIChzaXplID4gMSkgewotICAgICAgICAgICAgU3RyaW5nQnVpbGRlciBidWlsZGVyID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLSAgICAgICAgICAgIGludCBpID0gMDsKLSAgICAgICAgICAgIGZvciAoU3RyaW5nIHR5cGUgOiBsaXN0KSB7Ci0gICAgICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQodHlwZSk7Ci0gICAgICAgICAgICAgICAgaWYgKGkgPCBzaXplIC0gMSkgewotICAgICAgICAgICAgICAgICAgICBidWlsZGVyLmFwcGVuZCgiOyIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBidWlsZGVyLnRvU3RyaW5nKCk7Ci0gICAgICAgIH0gZWxzZSBpZiAoc2l6ZSA9PSAxKSB7Ci0gICAgICAgICAgICByZXR1cm4gbGlzdC5nZXQoMCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gIiI7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBBbGwgZ2V0dGVyIG1ldGhvZHMgc2hvdWxkIGJlIHVzZWQgY2FyZWZ1bGx5LCBzaW5jZSB0aGV5IG1heSBjaGFuZ2UKLSAgICAvLyBpbiB0aGUgZnV0dXJlIGFzIG9mIDIwMDktMTAtMDUsIG9uIHdoaWNoIEkgY2Fubm90IGJlIHN1cmUgdGhpcyBzdHJ1Y3R1cmUKLSAgICAvLyBpcyBjb21wbGV0ZWx5IGNvbnNvbGlkYXRlZC4KLSAgICAvLwotICAgIC8vIEFsc28gbm90ZSB0aGF0IHRoZXNlIGdldHRlciBtZXRob2RzIHNob3VsZCBiZSB1c2VkIG9ubHkgYWZ0ZXIKLSAgICAvLyBhbGwgcHJvcGVydGllcyBiZWluZyBwdXNoZWQgaW50byB0aGlzIG9iamVjdC4gSWYgbm90LCBpbmNvcnJlY3QKLSAgICAvLyB2YWx1ZSB3aWxsICJiZSBzdG9yZWQgaW4gdGhlIGxvY2FsIGNhY2hlIGFuZCIgYmUgcmV0dXJuZWQgdG8geW91LgotCi0gICAgcHVibGljIFN0cmluZyBnZXRGYW1pbHlOYW1lKCkgewotICAgICAgICByZXR1cm4gbUZhbWlseU5hbWU7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRHaXZlbk5hbWUoKSB7Ci0gICAgICAgIHJldHVybiBtR2l2ZW5OYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TWlkZGxlTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIG1NaWRkbGVOYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UHJlZml4KCkgewotICAgICAgICByZXR1cm4gbVByZWZpeDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFN1ZmZpeCgpIHsKLSAgICAgICAgcmV0dXJuIG1TdWZmaXg7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRGdWxsTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIG1Gb3JtYXR0ZWROYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UGhvbmV0aWNGYW1pbHlOYW1lKCkgewotICAgICAgICByZXR1cm4gbVBob25ldGljRmFtaWx5TmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFBob25ldGljR2l2ZW5OYW1lKCkgewotICAgICAgICByZXR1cm4gbVBob25ldGljR2l2ZW5OYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UGhvbmV0aWNNaWRkbGVOYW1lKCkgewotICAgICAgICByZXR1cm4gbVBob25ldGljTWlkZGxlTmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFBob25ldGljRnVsbE5hbWUoKSB7Ci0gICAgICAgIHJldHVybiBtUGhvbmV0aWNGdWxsTmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgZmluYWwgTGlzdDxTdHJpbmc+IGdldE5pY2tOYW1lTGlzdCgpIHsKLSAgICAgICAgcmV0dXJuIG1OaWNrTmFtZUxpc3Q7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRCaXJ0aGRheSgpIHsKLSAgICAgICAgcmV0dXJuIG1CaXJ0aGRheTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgZmluYWwgTGlzdDxTdHJpbmc+IGdldE5vdGVzKCkgewotICAgICAgICByZXR1cm4gbU5vdGVMaXN0OwotICAgIH0KLQotICAgIHB1YmxpYyBmaW5hbCBMaXN0PFBob25lRGF0YT4gZ2V0UGhvbmVMaXN0KCkgewotICAgICAgICByZXR1cm4gbVBob25lTGlzdDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgZmluYWwgTGlzdDxFbWFpbERhdGE+IGdldEVtYWlsTGlzdCgpIHsKLSAgICAgICAgcmV0dXJuIG1FbWFpbExpc3Q7Ci0gICAgfQotCi0gICAgcHVibGljIGZpbmFsIExpc3Q8UG9zdGFsRGF0YT4gZ2V0UG9zdGFsTGlzdCgpIHsKLSAgICAgICAgcmV0dXJuIG1Qb3N0YWxMaXN0OwotICAgIH0KLQotICAgIHB1YmxpYyBmaW5hbCBMaXN0PE9yZ2FuaXphdGlvbkRhdGE+IGdldE9yZ2FuaXphdGlvbkxpc3QoKSB7Ci0gICAgICAgIHJldHVybiBtT3JnYW5pemF0aW9uTGlzdDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgZmluYWwgTGlzdDxJbURhdGE+IGdldEltTGlzdCgpIHsKLSAgICAgICAgcmV0dXJuIG1JbUxpc3Q7Ci0gICAgfQotCi0gICAgcHVibGljIGZpbmFsIExpc3Q8UGhvdG9EYXRhPiBnZXRQaG90b0xpc3QoKSB7Ci0gICAgICAgIHJldHVybiBtUGhvdG9MaXN0OwotICAgIH0KLQotICAgIHB1YmxpYyBmaW5hbCBMaXN0PFN0cmluZz4gZ2V0V2Vic2l0ZUxpc3QoKSB7Ci0gICAgICAgIHJldHVybiBtV2Vic2l0ZUxpc3Q7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXREaXNwbGF5TmFtZSgpIHsKLSAgICAgICAgaWYgKG1EaXNwbGF5TmFtZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICBjb25zdHJ1Y3REaXNwbGF5TmFtZSgpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBtRGlzcGxheU5hbWU7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvcGltL3ZjYXJkL1ZDYXJkRW50cnlDb21taXR0ZXIuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3BpbS92Y2FyZC9WQ2FyZEVudHJ5Q29tbWl0dGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE4YzgwNTcuLjAwMDAwMDAKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvcGltL3ZjYXJkL1ZDYXJkRW50cnlDb21taXR0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBhbmRyb2lkLnBpbS52Y2FyZDsKLQotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZW50UmVzb2x2ZXI7Ci1pbXBvcnQgYW5kcm9pZC5uZXQuVXJpOwotaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotCi0vKioKLSAqIDxQPgotICoge0BsaW5rIFZDYXJkRW50cnlIYW5kbGVyfSBpbXBsZW1lbnRhdGlvbiB3aGljaCBjb21taXRzIHRoZSBlbnRyeSB0byBDb250ZW50UmVzb2x2ZXIuCi0gKiA8L1A+Ci0gKiA8UD4KLSAqIE5vdGU6PEJSIC8+Ci0gKiBFYWNoIHZDYXJkIG1heSBjb250YWluIGJpZyBwaG90byBpbWFnZXMgZW5jb2RlZCBieSBCQVNFNjQsCi0gKiBJZiB3ZSBzdG9yZSBhbGwgdkNhcmQgZW50cmllcyBpbiBtZW1vcnksIE91dE9mTWVtb3J5RXJyb3IgbWF5IGJlIHRocm93bi4KLSAqIFRodXMsIHRoaXMgY2xhc3MgcHVzaCBlYWNoIFZDYXJkIGVudHJ5IGludG8gQ29udGVudFJlc29sdmVyIGltbWVkaWF0ZWx5LgotICogPC9QPgotICovCi1wdWJsaWMgY2xhc3MgVkNhcmRFbnRyeUNvbW1pdHRlciBpbXBsZW1lbnRzIFZDYXJkRW50cnlIYW5kbGVyIHsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBMT0dfVEFHID0gIlZDYXJkRW50cnlDb21pdHRlciI7Ci0KLSAgICBwcml2YXRlIGZpbmFsIENvbnRlbnRSZXNvbHZlciBtQ29udGVudFJlc29sdmVyOwotICAgIHByaXZhdGUgbG9uZyBtVGltZVRvQ29tbWl0OwotICAgIHByaXZhdGUgQXJyYXlMaXN0PFVyaT4gbUNyZWF0ZWRVcmlzID0gbmV3IEFycmF5TGlzdDxVcmk+KCk7Ci0KLSAgICBwdWJsaWMgVkNhcmRFbnRyeUNvbW1pdHRlcihDb250ZW50UmVzb2x2ZXIgcmVzb2x2ZXIpIHsKLSAgICAgICAgbUNvbnRlbnRSZXNvbHZlciA9IHJlc29sdmVyOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIG9uU3RhcnQoKSB7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgb25FbmQoKSB7Ci0gICAgICAgIGlmIChWQ2FyZENvbmZpZy5zaG93UGVyZm9ybWFuY2VMb2coKSkgewotICAgICAgICAgICAgTG9nLmQoTE9HX1RBRywgU3RyaW5nLmZvcm1hdCgidGltZSB0byBjb21taXQgZW50cmllczogJWQgbXMiLCBtVGltZVRvQ29tbWl0KSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBvbkVudHJ5Q3JlYXRlZChmaW5hbCBWQ2FyZEVudHJ5IHZjYXJkRW50cnkpIHsKLSAgICAgICAgbG9uZyBzdGFydCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotICAgICAgICBtQ3JlYXRlZFVyaXMuYWRkKHZjYXJkRW50cnkucHVzaEludG9Db250ZW50UmVzb2x2ZXIobUNvbnRlbnRSZXNvbHZlcikpOwotICAgICAgICBtVGltZVRvQ29tbWl0ICs9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC0gc3RhcnQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbGlzdCBvZiBjcmVhdGVkIFVyaXMuIFRoaXMgbGlzdCBzaG91bGQgbm90IGJlIG1vZGlmaWVkIGJ5IHRoZSBjYWxsZXIgYXMgaXQgaXMKLSAgICAgKiBub3QgYSBjbG9uZS4KLSAgICAgKi8KLSAgIHB1YmxpYyBBcnJheUxpc3Q8VXJpPiBnZXRDcmVhdGVkVXJpcygpIHsKLSAgICAgICAgcmV0dXJuIG1DcmVhdGVkVXJpczsKLSAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvcGltL3ZjYXJkL1ZDYXJkRW50cnlDb25zdHJ1Y3Rvci5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvcGltL3ZjYXJkL1ZDYXJkRW50cnlDb25zdHJ1Y3Rvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYTNlM2UyLi4wMDAwMDAwCi0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3BpbS92Y2FyZC9WQ2FyZEVudHJ5Q29uc3RydWN0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzNCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2UgYW5kcm9pZC5waW0udmNhcmQ7Ci0KLWltcG9ydCBhbmRyb2lkLmFjY291bnRzLkFjY291bnQ7Ci1pbXBvcnQgYW5kcm9pZC50ZXh0LlRleHRVdGlsczsKLWltcG9ydCBhbmRyb2lkLnV0aWwuQmFzZTY0OwotaW1wb3J0IGFuZHJvaWQudXRpbC5DaGFyc2V0VXRpbHM7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLS8qKgotICogPHA+Ci0gKiBUaGUge0BsaW5rIFZDYXJkSW50ZXJwcmV0ZXJ9IGltcGxlbWVudGF0aW9uIHdoaWNoIGVuYWJsZXMge0BsaW5rIFZDYXJkRW50cnlIYW5kbGVyfSBvYmplY3RzCi0gKiB0byBlYXNpbHkgaGFuZGxlIGVhY2ggdkNhcmQgZW50cnkuCi0gKiA8L3A+Ci0gKiA8cD4KLSAqIFRoaXMgY2xhc3MgdW5kZXJzdGFuZCBkZXRhaWxzIGluc2lkZSB2Q2FyZCBhbmQgdHJhbnNsYXRlcyBpdCB0byB7QGxpbmsgVkNhcmRFbnRyeX0uCi0gKiBUaGVuIHRoZSBjbGFzcyB0aHJvdyBpdCB0byB7QGxpbmsgVkNhcmRFbnRyeUhhbmRsZXJ9IHJlZ2lzdGVyZWQgdmlhCi0gKiB7QGxpbmsgI2FkZEVudHJ5SGFuZGxlcihWQ2FyZEVudHJ5SGFuZGxlcil9LCBzbyB0aGF0IGFsbCB0aG9zZSByZWdpc3RlcmVkIG9iamVjdHMKLSAqIGFyZSBhYmxlIHRvIGhhbmRsZSB0aGUge0BsaW5rIFZDYXJkRW50cnl9IG9iamVjdC4KLSAqIDwvcD4KLSAqIDxwPgotICogSWYgeW91IHdhbnQgdG8ga25vdyB0aGUgZGV0YWlsIGluc2lkZSB2Q2FyZCwgaXQgd291bGQgYmUgYmV0dGVyIHRvIGltcGxlbWVudAotICoge0BsaW5rIFZDYXJkSW50ZXJwcmV0ZXJ9IGRpcmVjdGx5LCBpbnN0ZWFkIG9mIHJlbHlpbmcgb24gdGhpcyBjbGFzcyBhbmQKLSAqIHtAbGluayBWQ2FyZEVudHJ5fSBjcmVhdGVkIGJ5IHRoZSBvYmplY3QuCi0gKiA8L3A+Ci0gKi8KLXB1YmxpYyBjbGFzcyBWQ2FyZEVudHJ5Q29uc3RydWN0b3IgaW1wbGVtZW50cyBWQ2FyZEludGVycHJldGVyIHsKLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgTE9HX1RBRyA9ICJWQ2FyZEVudHJ5Q29uc3RydWN0b3IiOwotCi0gICAgcHJpdmF0ZSBWQ2FyZEVudHJ5LlByb3BlcnR5IG1DdXJyZW50UHJvcGVydHkgPSBuZXcgVkNhcmRFbnRyeS5Qcm9wZXJ0eSgpOwotICAgIHByaXZhdGUgVkNhcmRFbnRyeSBtQ3VycmVudFZDYXJkRW50cnk7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgbVBhcmFtVHlwZTsKLSAgICAKLSAgICAvLyBUaGUgY2hhcnNldCB1c2luZyB3aGljaCB7QGxpbmsgVkNhcmRJbnRlcnByZXRlcn0gcGFyc2VzIHRoZSB0ZXh0LgotICAgIC8vIEVhY2ggU3RyaW5nIGlzIGZpcnN0IGRlY29kZWQgaW50byBiaW5hcnkgc3RyZWFtIHdpdGggdGhpcyBjaGFyc2V0LCBhbmQgZW5jb2RlZCBiYWNrCi0gICAgLy8gdG8gInRhcmdldCBjaGFyc2V0Iiwgd2hpY2ggbWF5IGJlIGV4cGxpY2l0bHkgc3BlY2lmaWVkIGJ5IHRoZSB2Q2FyZCB3aXRoICJDSEFSU0VUIgotICAgIC8vIHByb3BlcnR5IG9yIGltcGxpY2l0bHkgbWVudGlvbmVkIGJ5IGl0cyB2ZXJzaW9uIChlLmcuIHZDYXJkIDMuMCByZWNvbW1lbmRzIFVURi04KS4KLSAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBtU291cmNlQ2hhcnNldDsKLQotICAgIHByaXZhdGUgZmluYWwgYm9vbGVhbiBtU3RyaWN0TGluZUJyZWFraW5nOwotICAgIHByaXZhdGUgZmluYWwgaW50IG1WQ2FyZFR5cGU7Ci0gICAgcHJpdmF0ZSBmaW5hbCBBY2NvdW50IG1BY2NvdW50OwotICAgIAotICAgIC8vIEZvciBtZWFzdXJpbmcgcGVyZm9ybWFuY2UuCi0gICAgcHJpdmF0ZSBsb25nIG1UaW1lUHVzaEludG9Db250ZW50UmVzb2x2ZXI7Ci0KLSAgICBwcml2YXRlIGZpbmFsIExpc3Q8VkNhcmRFbnRyeUhhbmRsZXI+IG1FbnRyeUhhbmRsZXJzID0gbmV3IEFycmF5TGlzdDxWQ2FyZEVudHJ5SGFuZGxlcj4oKTsKLQotICAgIHB1YmxpYyBWQ2FyZEVudHJ5Q29uc3RydWN0b3IoKSB7Ci0gICAgICAgIHRoaXMoVkNhcmRDb25maWcuVkNBUkRfVFlQRV9WMjFfR0VORVJJQywgbnVsbCk7Ci0gICAgfQotCi0gICAgcHVibGljIFZDYXJkRW50cnlDb25zdHJ1Y3RvcihmaW5hbCBpbnQgdmNhcmRUeXBlKSB7Ci0gICAgICAgIHRoaXModmNhcmRUeXBlLCBudWxsLCBudWxsLCBmYWxzZSk7Ci0gICAgfQotCi0gICAgcHVibGljIFZDYXJkRW50cnlDb25zdHJ1Y3RvcihmaW5hbCBpbnQgdmNhcmRUeXBlLCBmaW5hbCBBY2NvdW50IGFjY291bnQpIHsKLSAgICAgICAgdGhpcyh2Y2FyZFR5cGUsIGFjY291bnQsIG51bGwsIGZhbHNlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgVkNhcmRFbnRyeUNvbnN0cnVjdG9yKGZpbmFsIGludCB2Y2FyZFR5cGUsIGZpbmFsIEFjY291bnQgYWNjb3VudCwKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyBpbnB1dENoYXJzZXQpIHsKLSAgICAgICAgdGhpcyh2Y2FyZFR5cGUsIGFjY291bnQsIGlucHV0Q2hhcnNldCwgZmFsc2UpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBoaWRlIEp1c3QgZm9yIHRlc3RpbmcuCi0gICAgICovCi0gICAgcHVibGljIFZDYXJkRW50cnlDb25zdHJ1Y3RvcihmaW5hbCBpbnQgdmNhcmRUeXBlLCBmaW5hbCBBY2NvdW50IGFjY291bnQsCi0gICAgICAgICAgICBmaW5hbCBTdHJpbmcgaW5wdXRDaGFyc2V0LCBmaW5hbCBib29sZWFuIHN0cmljdExpbmVCcmVha1BhcnNpbmcpIHsKLSAgICAgICAgaWYgKGlucHV0Q2hhcnNldCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtU291cmNlQ2hhcnNldCA9IGlucHV0Q2hhcnNldDsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1Tb3VyY2VDaGFyc2V0ID0gVkNhcmRDb25maWcuREVGQVVMVF9JTlRFUk1FRElBVEVfQ0hBUlNFVDsKLSAgICAgICAgfQotICAgICAgICBtU3RyaWN0TGluZUJyZWFraW5nID0gc3RyaWN0TGluZUJyZWFrUGFyc2luZzsKLSAgICAgICAgbVZDYXJkVHlwZSA9IHZjYXJkVHlwZTsKLSAgICAgICAgbUFjY291bnQgPSBhY2NvdW50OwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFkZEVudHJ5SGFuZGxlcihWQ2FyZEVudHJ5SGFuZGxlciBlbnRyeUhhbmRsZXIpIHsKLSAgICAgICAgbUVudHJ5SGFuZGxlcnMuYWRkKGVudHJ5SGFuZGxlcik7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc3RhcnQoKSB7Ci0gICAgICAgIGZvciAoVkNhcmRFbnRyeUhhbmRsZXIgZW50cnlIYW5kbGVyIDogbUVudHJ5SGFuZGxlcnMpIHsKLSAgICAgICAgICAgIGVudHJ5SGFuZGxlci5vblN0YXJ0KCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBlbmQoKSB7Ci0gICAgICAgIGZvciAoVkNhcmRFbnRyeUhhbmRsZXIgZW50cnlIYW5kbGVyIDogbUVudHJ5SGFuZGxlcnMpIHsKLSAgICAgICAgICAgIGVudHJ5SGFuZGxlci5vbkVuZCgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgY2xlYXIoKSB7Ci0gICAgICAgIG1DdXJyZW50VkNhcmRFbnRyeSA9IG51bGw7Ci0gICAgICAgIG1DdXJyZW50UHJvcGVydHkgPSBuZXcgVkNhcmRFbnRyeS5Qcm9wZXJ0eSgpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHN0YXJ0RW50cnkoKSB7Ci0gICAgICAgIGlmIChtQ3VycmVudFZDYXJkRW50cnkgIT0gbnVsbCkgewotICAgICAgICAgICAgTG9nLmUoTE9HX1RBRywgIk5lc3RlZCBWQ2FyZCBjb2RlIGlzIG5vdCBzdXBwb3J0ZWQgbm93LiIpOwotICAgICAgICB9Ci0gICAgICAgIG1DdXJyZW50VkNhcmRFbnRyeSA9IG5ldyBWQ2FyZEVudHJ5KG1WQ2FyZFR5cGUsIG1BY2NvdW50KTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBlbmRFbnRyeSgpIHsKLSAgICAgICAgbUN1cnJlbnRWQ2FyZEVudHJ5LmNvbnNvbGlkYXRlRmllbGRzKCk7Ci0gICAgICAgIGZvciAoVkNhcmRFbnRyeUhhbmRsZXIgZW50cnlIYW5kbGVyIDogbUVudHJ5SGFuZGxlcnMpIHsKLSAgICAgICAgICAgIGVudHJ5SGFuZGxlci5vbkVudHJ5Q3JlYXRlZChtQ3VycmVudFZDYXJkRW50cnkpOwotICAgICAgICB9Ci0gICAgICAgIG1DdXJyZW50VkNhcmRFbnRyeSA9IG51bGw7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc3RhcnRQcm9wZXJ0eSgpIHsKLSAgICAgICAgbUN1cnJlbnRQcm9wZXJ0eS5jbGVhcigpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGVuZFByb3BlcnR5KCkgewotICAgICAgICBtQ3VycmVudFZDYXJkRW50cnkuYWRkUHJvcGVydHkobUN1cnJlbnRQcm9wZXJ0eSk7Ci0gICAgfQotICAgIAotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHByb3BlcnR5TmFtZShTdHJpbmcgbmFtZSkgewotICAgICAgICBtQ3VycmVudFByb3BlcnR5LnNldFByb3BlcnR5TmFtZShuYW1lKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBwcm9wZXJ0eUdyb3VwKFN0cmluZyBncm91cCkgewotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHByb3BlcnR5UGFyYW1UeXBlKFN0cmluZyB0eXBlKSB7Ci0gICAgICAgIGlmIChtUGFyYW1UeXBlICE9IG51bGwpIHsKLSAgICAgICAgICAgIExvZy5lKExPR19UQUcsICJwcm9wZXJ0eVBhcmFtVHlwZSgpIGlzIGNhbGxlZCBtb3JlIHRoYW4gb25jZSAiICsKLSAgICAgICAgICAgICAgICAgICAgImJlZm9yZSBwcm9wZXJ0eVBhcmFtVmFsdWUoKSBpcyBjYWxsZWQiKTsKLSAgICAgICAgfQotICAgICAgICBtUGFyYW1UeXBlID0gdHlwZTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBwcm9wZXJ0eVBhcmFtVmFsdWUoU3RyaW5nIHZhbHVlKSB7Ci0gICAgICAgIGlmIChtUGFyYW1UeXBlID09IG51bGwpIHsKLSAgICAgICAgICAgIC8vIEZyb20gdkNhcmQgMi4xIHNwZWNpZmljYXRpb24uIHZDYXJkIDMuMCBmb3JtYWxseSBkb2VzIG5vdCBhbGxvdyB0aGlzIGNhc2UuCi0gICAgICAgICAgICBtUGFyYW1UeXBlID0gIlRZUEUiOwotICAgICAgICB9Ci0gICAgICAgIGlmICghVkNhcmRVdGlscy5jb250YWluc09ubHlBbHBoYURpZ2l0SHlwaGVuKHZhbHVlKSkgewotICAgICAgICAgICAgdmFsdWUgPSBWQ2FyZFV0aWxzLmNvbnZlcnRTdHJpbmdDaGFyc2V0KAotICAgICAgICAgICAgICAgICAgICB2YWx1ZSwgbVNvdXJjZUNoYXJzZXQsIFZDYXJkQ29uZmlnLkRFRkFVTFRfSU1QT1JUX0NIQVJTRVQpOwotICAgICAgICB9Ci0gICAgICAgIG1DdXJyZW50UHJvcGVydHkuYWRkUGFyYW1ldGVyKG1QYXJhbVR5cGUsIHZhbHVlKTsKLSAgICAgICAgbVBhcmFtVHlwZSA9IG51bGw7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBTdHJpbmcgaGFuZGxlT25lVmFsdWUoU3RyaW5nIHZhbHVlLAotICAgICAgICAgICAgU3RyaW5nIHNvdXJjZUNoYXJzZXQsIFN0cmluZyB0YXJnZXRDaGFyc2V0LCBTdHJpbmcgZW5jb2RpbmcpIHsKLSAgICAgICAgLy8gSXQgaXMgcG9zc2libGUgd2hlbiBzb21lIG9mIG11bHRpcGxlIHZhbHVlcyBhcmUgZW1wdHkuCi0gICAgICAgIC8vIGUuZy4gTjo7YTs7OyAtPiB2YWx1ZXMgYXJlICIiLCAiYSIsICIiLCAiIiwgYW5kICIiLgotICAgICAgICBpZiAoVGV4dFV0aWxzLmlzRW1wdHkodmFsdWUpKSB7Ci0gICAgICAgICAgICByZXR1cm4gIiI7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoZW5jb2RpbmcgIT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKGVuY29kaW5nLmVxdWFscygiQkFTRTY0IikgfHwgZW5jb2RpbmcuZXF1YWxzKCJCIikpIHsKLSAgICAgICAgICAgICAgICBtQ3VycmVudFByb3BlcnR5LnNldFByb3BlcnR5Qnl0ZXMoQmFzZTY0LmRlY29kZSh2YWx1ZS5nZXRCeXRlcygpLCBCYXNlNjQuREVGQVVMVCkpOwotICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoZW5jb2RpbmcuZXF1YWxzKCJRVU9URUQtUFJJTlRBQkxFIikpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gVkNhcmRVdGlscy5wYXJzZVF1b3RlZFByaW50YWJsZSgKLSAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlLCBtU3RyaWN0TGluZUJyZWFraW5nLCBzb3VyY2VDaGFyc2V0LCB0YXJnZXRDaGFyc2V0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIExvZy53KExPR19UQUcsICJVbmtub3duIGVuY29kaW5nLiBGYWxsIGJhY2sgdG8gZGVmYXVsdC4iKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIEp1c3QgdHJhbnNsYXRlIHRoZSBjaGFyc2V0IG9mIGEgZ2l2ZW4gU3RyaW5nIGZyb20gaW5wdXRDaGFyc2V0IHRvIGEgc3lzdGVtIG9uZS4gCi0gICAgICAgIHJldHVybiBWQ2FyZFV0aWxzLmNvbnZlcnRTdHJpbmdDaGFyc2V0KHZhbHVlLCBzb3VyY2VDaGFyc2V0LCB0YXJnZXRDaGFyc2V0KTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgcHJvcGVydHlWYWx1ZXMoTGlzdDxTdHJpbmc+IHZhbHVlcykgewotICAgICAgICBpZiAodmFsdWVzID09IG51bGwgfHwgdmFsdWVzLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgZmluYWwgQ29sbGVjdGlvbjxTdHJpbmc+IGNoYXJzZXRDb2xsZWN0aW9uID0KLSAgICAgICAgICAgICAgICBtQ3VycmVudFByb3BlcnR5LmdldFBhcmFtZXRlcnMoVkNhcmRDb25zdGFudHMuUEFSQU1fQ0hBUlNFVCk7Ci0gICAgICAgIGZpbmFsIENvbGxlY3Rpb248U3RyaW5nPiBlbmNvZGluZ0NvbGxlY3Rpb24gPQotICAgICAgICAgICAgICAgIG1DdXJyZW50UHJvcGVydHkuZ2V0UGFyYW1ldGVycyhWQ2FyZENvbnN0YW50cy5QQVJBTV9FTkNPRElORyk7Ci0gICAgICAgIGZpbmFsIFN0cmluZyBlbmNvZGluZyA9Ci0gICAgICAgICAgICAoKGVuY29kaW5nQ29sbGVjdGlvbiAhPSBudWxsKSA/IGVuY29kaW5nQ29sbGVjdGlvbi5pdGVyYXRvcigpLm5leHQoKSA6IG51bGwpOwotICAgICAgICBTdHJpbmcgdGFyZ2V0Q2hhcnNldCA9IENoYXJzZXRVdGlscy5uYW1lRm9yRGVmYXVsdFZlbmRvcigKLSAgICAgICAgICAgICAgICAoKGNoYXJzZXRDb2xsZWN0aW9uICE9IG51bGwpID8gY2hhcnNldENvbGxlY3Rpb24uaXRlcmF0b3IoKS5uZXh0KCkgOiBudWxsKSk7Ci0gICAgICAgIGlmIChUZXh0VXRpbHMuaXNFbXB0eSh0YXJnZXRDaGFyc2V0KSkgewotICAgICAgICAgICAgdGFyZ2V0Q2hhcnNldCA9IFZDYXJkQ29uZmlnLkRFRkFVTFRfSU1QT1JUX0NIQVJTRVQ7Ci0gICAgICAgIH0KLQotICAgICAgICBmb3IgKGZpbmFsIFN0cmluZyB2YWx1ZSA6IHZhbHVlcykgewotICAgICAgICAgICAgbUN1cnJlbnRQcm9wZXJ0eS5hZGRUb1Byb3BlcnR5VmFsdWVMaXN0KAotICAgICAgICAgICAgICAgICAgICBoYW5kbGVPbmVWYWx1ZSh2YWx1ZSwgbVNvdXJjZUNoYXJzZXQsIHRhcmdldENoYXJzZXQsIGVuY29kaW5nKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAaGlkZQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNob3dQZXJmb3JtYW5jZUluZm8oKSB7Ci0gICAgICAgIExvZy5kKExPR19UQUcsICJ0aW1lIGZvciBpbnNlcnQgQ29udGFjdFN0cnVjdCB0byBkYXRhYmFzZTogIiArIAotICAgICAgICAgICAgICAgIG1UaW1lUHVzaEludG9Db250ZW50UmVzb2x2ZXIgKyAiIG1zIik7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvcGltL3ZjYXJkL1ZDYXJkRW50cnlDb3VudGVyLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9waW0vdmNhcmQvVkNhcmRFbnRyeUNvdW50ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2JhYjUwZC4uMDAwMDAwMAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9waW0vdmNhcmQvVkNhcmRFbnRyeUNvdW50ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBhbmRyb2lkLnBpbS52Y2FyZDsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0vKioKLSAqIFRoZSBjbGFzcyB3aGljaCBqdXN0IGNvdW50cyB0aGUgbnVtYmVyIG9mIHZDYXJkIGVudHJpZXMgaW4gdGhlIHNwZWNpZmllZCBpbnB1dC4KLSAqLwotcHVibGljIGNsYXNzIFZDYXJkRW50cnlDb3VudGVyIGltcGxlbWVudHMgVkNhcmRJbnRlcnByZXRlciB7Ci0gICAgcHJpdmF0ZSBpbnQgbUNvdW50OwotCi0gICAgcHVibGljIGludCBnZXRDb3VudCgpIHsKLSAgICAgICAgcmV0dXJuIG1Db3VudDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzdGFydCgpIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBlbmQoKSB7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc3RhcnRFbnRyeSgpIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBlbmRFbnRyeSgpIHsKLSAgICAgICAgbUNvdW50Kys7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc3RhcnRQcm9wZXJ0eSgpIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBlbmRQcm9wZXJ0eSgpIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBwcm9wZXJ0eUdyb3VwKFN0cmluZyBncm91cCkgewotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHByb3BlcnR5TmFtZShTdHJpbmcgbmFtZSkgewotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHByb3BlcnR5UGFyYW1UeXBlKFN0cmluZyB0eXBlKSB7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcHJvcGVydHlQYXJhbVZhbHVlKFN0cmluZyB2YWx1ZSkgewotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHByb3BlcnR5VmFsdWVzKExpc3Q8U3RyaW5nPiB2YWx1ZXMpIHsKLSAgICB9ICAgIAotfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvcGltL3ZjYXJkL1ZDYXJkRW50cnlIYW5kbGVyLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9waW0vdmNhcmQvVkNhcmRFbnRyeUhhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTZiZjY5ZC4uMDAwMDAwMAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9waW0vdmNhcmQvVkNhcmRFbnRyeUhhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBhbmRyb2lkLnBpbS52Y2FyZDsKLQotLyoqCi0gKiA8cD4KLSAqIFRoZSBpbnRlcmZhY2UgY2FsbGVkIGJ5IHtAbGluayBWQ2FyZEVudHJ5Q29uc3RydWN0b3J9LgotICogPC9wPgotICogPHA+Ci0gKiBUaGlzIGNsYXNzIGlzIHVzZWZ1bCB3aGVuIHlvdSBkb24ndCB3YW50IHRvIGtub3cgdkNhcmQgZGF0YSBpbiBkZXRhaWwuIElmIHlvdSB3YW50IHRvIGtub3cKLSAqIGl0LCBpdCB3b3VsZCBiZSBiZXR0ZXIgdG8gY29uc2lkZXIgdXNpbmcge0BsaW5rIFZDYXJkSW50ZXJwcmV0ZXJ9LgotICogPC9wPgotICovCi1wdWJsaWMgaW50ZXJmYWNlIFZDYXJkRW50cnlIYW5kbGVyIHsKLSAgICAvKioKLSAgICAgKiBDYWxsZWQgd2hlbiB0aGUgcGFyc2luZyBzdGFydGVkLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIG9uU3RhcnQoKTsKLQotICAgIC8qKgotICAgICAqIFRoZSBtZXRob2QgY2FsbGVkIHdoZW4gb25lIFZDYXJkIGVudHJ5IGlzIHN1Y2Nlc3NmdWxseSBjcmVhdGVkCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgb25FbnRyeUNyZWF0ZWQoZmluYWwgVkNhcmRFbnRyeSBlbnRyeSk7Ci0KLSAgICAvKioKLSAgICAgKiBDYWxsZWQgd2hlbiB0aGUgcGFyc2luZyBlbmRlZC4KLSAgICAgKiBBYmxlIHRvIGJlIHVzZSB0aGlzIG1ldGhvZCBmb3Igc2hvd2luZyBwZXJmb3JtYW5jZSBsb2csIGV0Yy4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBvbkVuZCgpOwotfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvcGltL3ZjYXJkL1ZDYXJkSW50ZXJwcmV0ZXIuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3BpbS92Y2FyZC9WQ2FyZEludGVycHJldGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAzNzA0YTIuLjAwMDAwMDAKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvcGltL3ZjYXJkL1ZDYXJkSW50ZXJwcmV0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2UgYW5kcm9pZC5waW0udmNhcmQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotLyoqCi0gKiA8UD4KLSAqIFRoZSBpbnRlcmZhY2Ugd2hpY2ggc2hvdWxkIGJlIGltcGxlbWVudGVkIGJ5IHRoZSBjbGFzc2VzIHdoaWNoIGhhdmUgdG8gYW5hbHl6ZSBlYWNoCi0gKiB2Q2FyZCBlbnRyeSBtaW51dGVseS4KLSAqIDwvUD4KLSAqIDxQPgotICogSGVyZSwgdGhlcmUgYXJlIHNldmVyYWwgdGVybXMgc3BlY2lmaWMgdG8gdkNhcmQgKGFuZCB0aGlzIGxpYnJhcnkpLgotICogPC9QPgotICogPFA+Ci0gKiBUaGUgdGVybSAiZW50cnkiIGlzIG9uZSB2Q2FyZCByZXByZXNlbnRhdGlvbiBpbiB0aGUgaW5wdXQsIHdoaWNoIHNob3VsZCBzdGFydCB3aXRoICJCRUdJTjpWQ0FSRCIKLSAqIGFuZCBlbmQgd2l0aCAiRU5EOlZDQVJEIi4KLSAqIDwvUD4KLSAqIDxQPgotICogVGhlIHRlcm0gInByb3BlcnR5IiBpcyBvbmUgbGluZSBpbiB2Q2FyZCBlbnRyeSwgd2hpY2ggY29uc2lzdHMgb2YgImdyb3VwIiwgInByb3BlcnR5IG5hbWUiLAotICogInBhcmFtZXRlcihwYXJhbSkgbmFtZXMgYW5kIHZhbHVlcyIsIGFuZCAicHJvcGVydHkgdmFsdWVzIi4KLSAqIDwvUD4KLSAqIDxQPgotICogZS5nLiBncm91cDEucHJvcE5hbWU7cGFyYW1OYW1lMT1wYXJhbVZhbHVlMTtwYXJhbU5hbWUyPXBhcmFtVmFsdWUyO3Byb3BlcnR5VmFsdWUxO3Byb3BlcnR5VmFsdWUyLi4uCi0gKiA8L1A+Ci0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgVkNhcmRJbnRlcnByZXRlciB7Ci0gICAgLyoqCi0gICAgICogQ2FsbGVkIHdoZW4gdkNhcmQgaW50ZXJwcmV0YXRpb24gc3RhcnRlZC4KLSAgICAgKi8KLSAgICB2b2lkIHN0YXJ0KCk7Ci0KLSAgICAvKioKLSAgICAgKiBDYWxsZWQgd2hlbiB2Q2FyZCBpbnRlcnByZXRhdGlvbiBmaW5pc2hlZC4KLSAgICAgKi8KLSAgICB2b2lkIGVuZCgpOwotCi0gICAgLyoqIAotICAgICAqIENhbGxlZCB3aGVuIHBhcnNpbmcgb25lIHZDYXJkIGVudHJ5IHN0YXJ0ZWQuCi0gICAgICogTW9yZSBzcGVjaWZpY2FsbHksIHRoaXMgbWV0aG9kIGlzIGNhbGxlZCB3aGVuICJCRUdJTjpWQ0FSRCIgaXMgcmVhZC4KLSAgICAgKi8KLSAgICB2b2lkIHN0YXJ0RW50cnkoKTsKLQotICAgIC8qKgotICAgICAqIENhbGxlZCB3aGVuIHBhcnNpbmcgb25lIHZDYXJkIGVudHJ5IGVuZGVkLgotICAgICAqIE1vcmUgc3BlY2lmaWNhbGx5LCB0aGlzIG1ldGhvZCBpcyBjYWxsZWQgd2hlbiAiRU5EOlZDQVJEIiBpcyByZWFkLgotICAgICAqIE5vdGUgdGhhdCB7QGxpbmsgI3N0YXJ0RW50cnkoKX0gbWF5IGJlIGNhbGxlZCBzaW5jZQotICAgICAqIHZDYXJkIChlc3BlY2lhbGx5IDIuMSkgYWxsb3dzIG5lc3RlZCB2Q2FyZC4KLSAgICAgKi8KLSAgICB2b2lkIGVuZEVudHJ5KCk7Ci0KLSAgICAvKioKLSAgICAgKiBDYWxsZWQgd2hlbiByZWFkaW5nIG9uZSBwcm9wZXJ0eSBzdGFydGVkLgotICAgICAqLwotICAgIHZvaWQgc3RhcnRQcm9wZXJ0eSgpOwotCi0gICAgLyoqCi0gICAgICogQ2FsbGVkIHdoZW4gcmVhZGluZyBvbmUgcHJvcGVydHkgZW5kZWQuCi0gICAgICovCi0gICAgdm9pZCBlbmRQcm9wZXJ0eSgpOwotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIGdyb3VwIEEgZ3JvdXAgbmFtZS4gVGhpcyBtZXRob2QgbWF5IGJlIGNhbGxlZCBtb3JlIHRoYW4gb25jZSBvciBtYXkgbm90IGJlCi0gICAgICogY2FsbGVkIGF0IGFsbCwgZGVwZW5kaW5nIG9uIGhvdyBtYW55IGdydW91cHMgYXJlIGFwcGVuZGVkIHRvIHRoZSBwcm9wZXJ0eS4KLSAgICAgKi8KLSAgICB2b2lkIHByb3BlcnR5R3JvdXAoU3RyaW5nIGdyb3VwKTsKLQotICAgIC8qKgotICAgICAqIEBwYXJhbSBuYW1lIEEgcHJvcGVydHkgbmFtZSBsaWtlICJOIiwgIkZOIiwgIkFEUiIsIGV0Yy4KLSAgICAgKi8KLSAgICB2b2lkIHByb3BlcnR5TmFtZShTdHJpbmcgbmFtZSk7Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gdHlwZSBBIHBhcmFtZXRlciBuYW1lIGxpa2UgIkVOQ09ESU5HIiwgIkNIQVJTRVQiLCBldGMuCi0gICAgICovCi0gICAgdm9pZCBwcm9wZXJ0eVBhcmFtVHlwZShTdHJpbmcgdHlwZSk7Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gdmFsdWUgQSBwYXJhbWV0ZXIgdmFsdWUuIFRoaXMgbWV0aG9kIG1heSBiZSBjYWxsZWQgd2l0aG91dAotICAgICAqIHtAbGluayAjcHJvcGVydHlQYXJhbVR5cGUoU3RyaW5nKX0gYmVpbmcgY2FsbGVkICh3aGVuIHRoZSB2Q2FyZCBpcyB2Q2FyZCAyLjEpLgotICAgICAqLwotICAgIHZvaWQgcHJvcGVydHlQYXJhbVZhbHVlKFN0cmluZyB2YWx1ZSk7Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gdmFsdWVzIExpc3Qgb2YgcHJvcGVydHkgdmFsdWVzLiBUaGUgc2l6ZSBvZiB2YWx1ZXMgd291bGQgYmUgMSB1bmxlc3MKLSAgICAgKiBjb3Jlc3Nwb25kaW5nIHByb3BlcnR5IG5hbWUgaXMgIk4iLCAiQURSIiwgb3IgIk9SRyIuCi0gICAgICovCi0gICAgdm9pZCBwcm9wZXJ0eVZhbHVlcyhMaXN0PFN0cmluZz4gdmFsdWVzKTsKLX0KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3BpbS92Y2FyZC9WQ2FyZEludGVycHJldGVyQ29sbGVjdGlvbi5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvcGltL3ZjYXJkL1ZDYXJkSW50ZXJwcmV0ZXJDb2xsZWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc3ZTQ0YTAuLjAwMDAwMDAKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvcGltL3ZjYXJkL1ZDYXJkSW50ZXJwcmV0ZXJDb2xsZWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIGFuZHJvaWQucGltLnZjYXJkOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLS8qKgotICogVGhlIHtAbGluayBWQ2FyZEludGVycHJldGVyfSBpbXBsZW1lbnRhdGlvbiB3aGljaCBhZ2dyZWdhdGVzIG1vcmUgdGhhbiBvbmUKLSAqIHtAbGluayBWQ2FyZEludGVycHJldGVyfSBvYmplY3RzIGFuZCBtYWtlIGEgdXNlciBvYmplY3QgdHJlYXQgdGhlbSBhcyBvbmUKLSAqIHtAbGluayBWQ2FyZEludGVycHJldGVyfSBvYmplY3QuCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBWQ2FyZEludGVycHJldGVyQ29sbGVjdGlvbiBpbXBsZW1lbnRzIFZDYXJkSW50ZXJwcmV0ZXIgewotICAgIHByaXZhdGUgZmluYWwgQ29sbGVjdGlvbjxWQ2FyZEludGVycHJldGVyPiBtSW50ZXJwcmV0ZXJDb2xsZWN0aW9uOwotCi0gICAgcHVibGljIFZDYXJkSW50ZXJwcmV0ZXJDb2xsZWN0aW9uKENvbGxlY3Rpb248VkNhcmRJbnRlcnByZXRlcj4gaW50ZXJwcmV0ZXJDb2xsZWN0aW9uKSB7Ci0gICAgICAgIG1JbnRlcnByZXRlckNvbGxlY3Rpb24gPSBpbnRlcnByZXRlckNvbGxlY3Rpb247Ci0gICAgfQotCi0gICAgcHVibGljIENvbGxlY3Rpb248VkNhcmRJbnRlcnByZXRlcj4gZ2V0Q29sbGVjdGlvbigpIHsKLSAgICAgICAgcmV0dXJuIG1JbnRlcnByZXRlckNvbGxlY3Rpb247Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc3RhcnQoKSB7Ci0gICAgICAgIGZvciAoVkNhcmRJbnRlcnByZXRlciBidWlsZGVyIDogbUludGVycHJldGVyQ29sbGVjdGlvbikgewotICAgICAgICAgICAgYnVpbGRlci5zdGFydCgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZW5kKCkgewotICAgICAgICBmb3IgKFZDYXJkSW50ZXJwcmV0ZXIgYnVpbGRlciA6IG1JbnRlcnByZXRlckNvbGxlY3Rpb24pIHsKLSAgICAgICAgICAgIGJ1aWxkZXIuZW5kKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzdGFydEVudHJ5KCkgewotICAgICAgICBmb3IgKFZDYXJkSW50ZXJwcmV0ZXIgYnVpbGRlciA6IG1JbnRlcnByZXRlckNvbGxlY3Rpb24pIHsKLSAgICAgICAgICAgIGJ1aWxkZXIuc3RhcnRFbnRyeSgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZW5kRW50cnkoKSB7Ci0gICAgICAgIGZvciAoVkNhcmRJbnRlcnByZXRlciBidWlsZGVyIDogbUludGVycHJldGVyQ29sbGVjdGlvbikgewotICAgICAgICAgICAgYnVpbGRlci5lbmRFbnRyeSgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc3RhcnRQcm9wZXJ0eSgpIHsKLSAgICAgICAgZm9yIChWQ2FyZEludGVycHJldGVyIGJ1aWxkZXIgOiBtSW50ZXJwcmV0ZXJDb2xsZWN0aW9uKSB7Ci0gICAgICAgICAgICBidWlsZGVyLnN0YXJ0UHJvcGVydHkoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGVuZFByb3BlcnR5KCkgewotICAgICAgICBmb3IgKFZDYXJkSW50ZXJwcmV0ZXIgYnVpbGRlciA6IG1JbnRlcnByZXRlckNvbGxlY3Rpb24pIHsKLSAgICAgICAgICAgIGJ1aWxkZXIuZW5kUHJvcGVydHkoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHByb3BlcnR5R3JvdXAoU3RyaW5nIGdyb3VwKSB7Ci0gICAgICAgIGZvciAoVkNhcmRJbnRlcnByZXRlciBidWlsZGVyIDogbUludGVycHJldGVyQ29sbGVjdGlvbikgewotICAgICAgICAgICAgYnVpbGRlci5wcm9wZXJ0eUdyb3VwKGdyb3VwKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHByb3BlcnR5TmFtZShTdHJpbmcgbmFtZSkgewotICAgICAgICBmb3IgKFZDYXJkSW50ZXJwcmV0ZXIgYnVpbGRlciA6IG1JbnRlcnByZXRlckNvbGxlY3Rpb24pIHsKLSAgICAgICAgICAgIGJ1aWxkZXIucHJvcGVydHlOYW1lKG5hbWUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcHJvcGVydHlQYXJhbVR5cGUoU3RyaW5nIHR5cGUpIHsKLSAgICAgICAgZm9yIChWQ2FyZEludGVycHJldGVyIGJ1aWxkZXIgOiBtSW50ZXJwcmV0ZXJDb2xsZWN0aW9uKSB7Ci0gICAgICAgICAgICBidWlsZGVyLnByb3BlcnR5UGFyYW1UeXBlKHR5cGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcHJvcGVydHlQYXJhbVZhbHVlKFN0cmluZyB2YWx1ZSkgewotICAgICAgICBmb3IgKFZDYXJkSW50ZXJwcmV0ZXIgYnVpbGRlciA6IG1JbnRlcnByZXRlckNvbGxlY3Rpb24pIHsKLSAgICAgICAgICAgIGJ1aWxkZXIucHJvcGVydHlQYXJhbVZhbHVlKHZhbHVlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHByb3BlcnR5VmFsdWVzKExpc3Q8U3RyaW5nPiB2YWx1ZXMpIHsKLSAgICAgICAgZm9yIChWQ2FyZEludGVycHJldGVyIGJ1aWxkZXIgOiBtSW50ZXJwcmV0ZXJDb2xsZWN0aW9uKSB7Ci0gICAgICAgICAgICBidWlsZGVyLnByb3BlcnR5VmFsdWVzKHZhbHVlcyk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9waW0vdmNhcmQvVkNhcmRQYXJzZXIuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3BpbS92Y2FyZC9WQ2FyZFBhcnNlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMWI5MzY5Li4wMDAwMDAwCi0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3BpbS92Y2FyZC9WQ2FyZFBhcnNlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIGFuZHJvaWQucGltLnZjYXJkOwotCi1pbXBvcnQgYW5kcm9pZC5waW0udmNhcmQuZXhjZXB0aW9uLlZDYXJkRXhjZXB0aW9uOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotCi1wdWJsaWMgaW50ZXJmYWNlIFZDYXJkUGFyc2VyIHsKLSAgICAvKioKLSAgICAgKiA8cD4KLSAgICAgKiBQYXJzZXMgdGhlIGdpdmVuIHN0cmVhbSBhbmQgc2VuZCB0aGUgdkNhcmQgZGF0YSBpbnRvIFZDYXJkQnVpbGRlckJhc2Ugb2JqZWN0LgotICAgICAqIDwvcD4uCi0gICAgICogPHA+Ci0gICAgICogTm90ZSB0aGF0IHZDYXJkIDIuMSBzcGVjaWZpY2F0aW9uIGFsbG93cyAiQ0hBUlNFVCIgcGFyYW1ldGVyLCBhbmQgc29tZSBjYXJlZXIgc2V0cwotICAgICAqIGxvY2FsIGVuY29kaW5nIHRvIGl0LiBGb3IgZXhhbXBsZSwgSmFwYW5lc2UgcGhvbmUgY2FyZWVyIHVzZXMgU2hpZnRfSklTLCB3aGljaCBpcwotICAgICAqIGZvcm1hbGx5IGFsbG93ZWQgaW4gdkNhcmQgMi4xLCBidXQgbm90IGFsbG93ZWQgaW4gdkNhcmQgMy4wLiBJbiB2Q2FyZCAyLjEsCi0gICAgICogSW4gc29tZSBleHJlbWUgY2FzZSwgaXQgaXMgYWxsb3dlZCBmb3IgdkNhcmQgdG8gaGF2ZSBkaWZmZXJlbnQgY2hhcnNldHMgaW4gb25lIHZDYXJkLgotICAgICAqIDwvcD4KLSAgICAgKiA8cD4KLSAgICAgKiBXZSByZWNvbW1lbmQgeW91IHVzZSB7QGxpbmsgVkNhcmRTb3VyY2VEZXRlY3Rvcn0gYW5kIGRldGVjdCB3aGljaCBraW5kIG9mIHNvdXJjZSB0aGUKLSAgICAgKiB2Q2FyZCBjb21lcyBmcm9tIGFuZCBleHBsaWNpdGx5IHNwZWNpZnkgYSBjaGFyc2V0IHVzaW5nIHRoZSByZXN1bHQuCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogQHBhcmFtIGlzIFRoZSBzb3VyY2UgdG8gcGFyc2UuCi0gICAgICogQHBhcmFtIGludGVyZXByZXRlciBBIHtAbGluayBWQ2FyZEludGVycHJldGVyfSBvYmplY3Qgd2hpY2ggdXNlZCB0byBjb25zdHJ1Y3QgZGF0YS4KLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uLCBWQ2FyZEV4Y2VwdGlvbgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHBhcnNlKElucHV0U3RyZWFtIGlzLCBWQ2FyZEludGVycHJldGVyIGludGVyZXByZXRlcikKLSAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgVkNhcmRFeGNlcHRpb247Ci0KLSAgICAvKioKLSAgICAgKiA8cD4KLSAgICAgKiBDYW5jZWwgcGFyc2luZyB2Q2FyZC4gVXNlZnVsIHdoZW4geW91IHdhbnQgdG8gc3RvcCB0aGUgcGFyc2UgaW4gdGhlIG90aGVyIHRocmVhZHMuCi0gICAgICogPC9wPgotICAgICAqIDxwPgotICAgICAqIEFjdHVhbCBjYW5jZWwgaXMgZG9uZSBhZnRlciBwYXJzaW5nIHRoZSBjdXJyZW50IHZjYXJkLgotICAgICAqIDwvcD4KLSAgICAgKi8KLSAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBjYW5jZWwoKTsKLX0KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3BpbS92Y2FyZC9WQ2FyZFBhcnNlckltcGxfVjIxLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9waW0vdmNhcmQvVkNhcmRQYXJzZXJJbXBsX1YyMS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YjM2NWViLi4wMDAwMDAwCi0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3BpbS92Y2FyZC9WQ2FyZFBhcnNlckltcGxfVjIxLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDQ2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBhbmRyb2lkLnBpbS52Y2FyZDsKLQotaW1wb3J0IGFuZHJvaWQucGltLnZjYXJkLmV4Y2VwdGlvbi5WQ2FyZEFnZW50Tm90U3VwcG9ydGVkRXhjZXB0aW9uOwotaW1wb3J0IGFuZHJvaWQucGltLnZjYXJkLmV4Y2VwdGlvbi5WQ2FyZEV4Y2VwdGlvbjsKLWltcG9ydCBhbmRyb2lkLnBpbS52Y2FyZC5leGNlcHRpb24uVkNhcmRJbnZhbGlkQ29tbWVudExpbmVFeGNlcHRpb247Ci1pbXBvcnQgYW5kcm9pZC5waW0udmNhcmQuZXhjZXB0aW9uLlZDYXJkSW52YWxpZExpbmVFeGNlcHRpb247Ci1pbXBvcnQgYW5kcm9pZC5waW0udmNhcmQuZXhjZXB0aW9uLlZDYXJkTmVzdGVkRXhjZXB0aW9uOwotaW1wb3J0IGFuZHJvaWQucGltLnZjYXJkLmV4Y2VwdGlvbi5WQ2FyZFZlcnNpb25FeGNlcHRpb247Ci1pbXBvcnQgYW5kcm9pZC50ZXh0LlRleHRVdGlsczsKLWltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwotCi1pbXBvcnQgamF2YS5pby5CdWZmZXJlZFJlYWRlcjsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbVJlYWRlcjsKLWltcG9ydCBqYXZhLmlvLlJlYWRlcjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLS8qKgotICogPHA+Ci0gKiBCYXNpYyBpbXBsZW1lbnRhdGlvbiBhY2hpZXZpbmcgdkNhcmQgcGFyc2luZy4gQmFzZWQgb24gdkNhcmQgMi4xLAotICogPC9wPgotICogQGhpZGUKLSAqLwotLyogcGFja2FnZSAqLyBjbGFzcyBWQ2FyZFBhcnNlckltcGxfVjIxIHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTE9HX1RBRyA9ICJWQ2FyZFBhcnNlckltcGxfVjIxIjsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGNsYXNzIEVtcHR5SW50ZXJwcmV0ZXIgaW1wbGVtZW50cyBWQ2FyZEludGVycHJldGVyIHsKLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIGVuZCgpIHsKLSAgICAgICAgfQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgZW5kRW50cnkoKSB7Ci0gICAgICAgIH0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIGVuZFByb3BlcnR5KCkgewotICAgICAgICB9Ci0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBwcm9wZXJ0eUdyb3VwKFN0cmluZyBncm91cCkgewotICAgICAgICB9Ci0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBwcm9wZXJ0eU5hbWUoU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgfQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgcHJvcGVydHlQYXJhbVR5cGUoU3RyaW5nIHR5cGUpIHsKLSAgICAgICAgfQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgcHJvcGVydHlQYXJhbVZhbHVlKFN0cmluZyB2YWx1ZSkgewotICAgICAgICB9Ci0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBwcm9wZXJ0eVZhbHVlcyhMaXN0PFN0cmluZz4gdmFsdWVzKSB7Ci0gICAgICAgIH0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIHN0YXJ0KCkgewotICAgICAgICB9Ci0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBzdGFydEVudHJ5KCkgewotICAgICAgICB9Ci0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBzdGFydFByb3BlcnR5KCkgewotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBjbGFzcyBDdXN0b21CdWZmZXJlZFJlYWRlciBleHRlbmRzIEJ1ZmZlcmVkUmVhZGVyIHsKLSAgICAgICAgcHJpdmF0ZSBsb25nIG1UaW1lOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBOZWVkZWQgc2luY2UgIm5leHQgbGluZSIgbWF5IGJlIG51bGwgZHVlIHRvIGVuZCBvZiBsaW5lLgotICAgICAgICAgKi8KLSAgICAgICAgcHJpdmF0ZSBib29sZWFuIG1OZXh0TGluZUlzVmFsaWQ7Ci0gICAgICAgIHByaXZhdGUgU3RyaW5nIG1OZXh0TGluZTsKLQotICAgICAgICBwdWJsaWMgQ3VzdG9tQnVmZmVyZWRSZWFkZXIoUmVhZGVyIGluKSB7Ci0gICAgICAgICAgICBzdXBlcihpbik7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIFN0cmluZyByZWFkTGluZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgICBpZiAobU5leHRMaW5lSXNWYWxpZCkgewotICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyByZXQgPSBtTmV4dExpbmU7Ci0gICAgICAgICAgICAgICAgbU5leHRMaW5lID0gbnVsbDsKLSAgICAgICAgICAgICAgICBtTmV4dExpbmVJc1ZhbGlkID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgbG9uZyBzdGFydCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotICAgICAgICAgICAgZmluYWwgU3RyaW5nIGxpbmUgPSBzdXBlci5yZWFkTGluZSgpOwotICAgICAgICAgICAgbG9uZyBlbmQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLSAgICAgICAgICAgIG1UaW1lICs9IGVuZCAtIHN0YXJ0OwotICAgICAgICAgICAgcmV0dXJuIGxpbmU7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogUmVhZCBvbmUgbGluZSwgYnV0IG1ha2UgdGhpcyBvYmplY3Qgc3RvcmUgaXQgaW4gaXRzIHF1ZXVlLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIFN0cmluZyBwZWVrTGluZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgICBpZiAoIW1OZXh0TGluZUlzVmFsaWQpIHsKLSAgICAgICAgICAgICAgICBsb25nIHN0YXJ0ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0gICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIGxpbmUgPSBzdXBlci5yZWFkTGluZSgpOwotICAgICAgICAgICAgICAgIGxvbmcgZW5kID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0gICAgICAgICAgICAgICAgbVRpbWUgKz0gZW5kIC0gc3RhcnQ7Ci0KLSAgICAgICAgICAgICAgICBtTmV4dExpbmUgPSBsaW5lOwotICAgICAgICAgICAgICAgIG1OZXh0TGluZUlzVmFsaWQgPSB0cnVlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gbU5leHRMaW5lOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGxvbmcgZ2V0VG90YWxtaWxsaXNlY29uZCgpIHsKLSAgICAgICAgICAgIHJldHVybiBtVGltZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX0VOQ09ESU5HID0gIjhCSVQiOwotCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gbUNhbmNlbGVkOwotICAgIHByb3RlY3RlZCBWQ2FyZEludGVycHJldGVyIG1JbnRlcnByZXRlcjsKLQotICAgIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgbUludGVybWVkaWF0ZUNoYXJzZXQ7Ci0KLSAgICAvKioKLSAgICAgKiA8cD4KLSAgICAgKiBUaGUgZW5jb2RpbmcgdHlwZSBmb3IgZGVjb25kaW5nIGJ5dGUgc3RyZWFtcy4gVGhpcyBtZW1iZXIgdmFyaWFibGUgaXMKLSAgICAgKiByZXNldCB0byBhIGRlZmF1bHQgZW5jb2RpbmcgZXZlcnkgdGltZSB3aGVuIGEgbmV3IGl0ZW0gY29tZXMuCi0gICAgICogPC9wPgotICAgICAqIDxwPgotICAgICAqICJFbmNvZGluZyIgaW4gdkNhcmQgaXMgZGlmZmVyZW50IGZyb20gIkNoYXJzZXQiLiBJdCBpcyBtYWlubHkgdXNlZCBmb3IKLSAgICAgKiBhZGRyZXNzZXMsIG5vdGVzLCBpbWFnZXMuICI3QklUIiwgIjhCSVQiLCAiQkFTRTY0IiwgYW5kCi0gICAgICogIlFVT1RFRC1QUklOVEFCTEUiIGFyZSBrbm93biBleGFtcGxlcy4KLSAgICAgKiA8L3A+Ci0gICAgICovCi0gICAgcHJvdGVjdGVkIFN0cmluZyBtQ3VycmVudEVuY29kaW5nOwotCi0gICAgLyoqCi0gICAgICogPHA+Ci0gICAgICogVGhlIHJlYWRlciBvYmplY3QgdG8gYmUgdXNlZCBpbnRlcm5hbGx5LgotICAgICAqIDwvcD4KLSAgICAgKiA8cD4KLSAgICAgKiBEZXZlbG9wZXJzIHNob3VsZCBub3QgZGlyZWN0bHkgcmVhZCBhIGxpbmUgZnJvbSB0aGlzIG9iamVjdC4gVXNlCi0gICAgICogZ2V0TGluZSgpIHVubGVzcyB0aGVyZSBzb21lIHJlYXNvbi4KLSAgICAgKiA8L3A+Ci0gICAgICovCi0gICAgcHJvdGVjdGVkIEN1c3RvbUJ1ZmZlcmVkUmVhZGVyIG1SZWFkZXI7Ci0KLSAgICAvKioKLSAgICAgKiA8cD4KLSAgICAgKiBTZXQgZm9yIHN0b3JpbmcgdW5rb253biBUWVBFIGF0dHJpYnV0ZXMsIHdoaWNoIGlzIG5vdCBhY2NlcHRhYmxlIGluIHZDYXJkCi0gICAgICogc3BlY2lmaWNhdGlvbiwgYnV0IGhhcHBlbnMgdG8gYmUgc2VlbiBpbiByZWFsIHdvcmxkIHZDYXJkLgotICAgICAqIDwvcD4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgZmluYWwgU2V0PFN0cmluZz4gbVVua25vd25UeXBlU2V0ID0gbmV3IEhhc2hTZXQ8U3RyaW5nPigpOwotCi0gICAgLyoqCi0gICAgICogPHA+Ci0gICAgICogU2V0IGZvciBzdG9yaW5nIHVua29ud24gVkFMVUUgYXR0cmlidXRlcywgd2hpY2ggaXMgbm90IGFjY2VwdGFibGUgaW4KLSAgICAgKiB2Q2FyZCBzcGVjaWZpY2F0aW9uLCBidXQgaGFwcGVucyB0byBiZSBzZWVuIGluIHJlYWwgd29ybGQgdkNhcmQuCi0gICAgICogPC9wPgotICAgICAqLwotICAgIHByb3RlY3RlZCBmaW5hbCBTZXQ8U3RyaW5nPiBtVW5rbm93blZhbHVlU2V0ID0gbmV3IEhhc2hTZXQ8U3RyaW5nPigpOwotCi0KLSAgICAvLyBJbiBzb21lIGNhc2VzLCB2Q2FyZCBpcyBuZXN0ZWQuIEN1cnJlbnRseSwgd2Ugb25seSBjb25zaWRlciB0aGUgbW9zdAotICAgIC8vIGludGVyaW9yIHZDYXJkIGRhdGEuCi0gICAgLy8gU2VlIHYyMV9mb21hXzEudmNmIGluIHRlc3QgZGlyZWN0b3J5IGZvciBtb3JlIGluZm9ybWF0aW9uLgotICAgIC8vIFRPRE86IERvbid0IGlnbm9yZSBieSB1c2luZyBjb3VudCwgYnV0IHJlYWQgYWxsIG9mIGluZm9ybWF0aW9uIG91dHNpZGUgdkNhcmQuCi0gICAgcHJpdmF0ZSBpbnQgbU5lc3RDb3VudDsKLQotICAgIC8vIFVzZWQgb25seSBmb3IgcGFyc2luZyBFTkQ6VkNBUkQuCi0gICAgcHJpdmF0ZSBTdHJpbmcgbVByZXZpb3VzTGluZTsKLQotICAgIC8vIEZvciBtZWFzdXJpbmcgcGVyZm9ybWFuY2UuCi0gICAgcHJpdmF0ZSBsb25nIG1UaW1lVG90YWw7Ci0gICAgcHJpdmF0ZSBsb25nIG1UaW1lUmVhZFN0YXJ0UmVjb3JkOwotICAgIHByaXZhdGUgbG9uZyBtVGltZVJlYWRFbmRSZWNvcmQ7Ci0gICAgcHJpdmF0ZSBsb25nIG1UaW1lU3RhcnRQcm9wZXJ0eTsKLSAgICBwcml2YXRlIGxvbmcgbVRpbWVFbmRQcm9wZXJ0eTsKLSAgICBwcml2YXRlIGxvbmcgbVRpbWVQYXJzZUl0ZW1zOwotICAgIHByaXZhdGUgbG9uZyBtVGltZVBhcnNlTGluZUFuZEhhbmRsZUdyb3VwOwotICAgIHByaXZhdGUgbG9uZyBtVGltZVBhcnNlUHJvcGVydHlWYWx1ZXM7Ci0gICAgcHJpdmF0ZSBsb25nIG1UaW1lUGFyc2VBZHJPcmdOOwotICAgIHByaXZhdGUgbG9uZyBtVGltZUhhbmRsZU1pc2NQcm9wZXJ0eVZhbHVlOwotICAgIHByaXZhdGUgbG9uZyBtVGltZUhhbmRsZVF1b3RlZFByaW50YWJsZTsKLSAgICBwcml2YXRlIGxvbmcgbVRpbWVIYW5kbGVCYXNlNjQ7Ci0KLSAgICBwdWJsaWMgVkNhcmRQYXJzZXJJbXBsX1YyMSgpIHsKLSAgICAgICAgdGhpcyhWQ2FyZENvbmZpZy5WQ0FSRF9UWVBFX0RFRkFVTFQpOwotICAgIH0KLQotICAgIHB1YmxpYyBWQ2FyZFBhcnNlckltcGxfVjIxKGludCB2Y2FyZFR5cGUpIHsKLSAgICAgICAgaWYgKCh2Y2FyZFR5cGUgJiBWQ2FyZENvbmZpZy5GTEFHX1RPUkVMQVRFX05FU1QpICE9IDApIHsKLSAgICAgICAgICAgIG1OZXN0Q291bnQgPSAxOwotICAgICAgICB9Ci0KLSAgICAgICAgbUludGVybWVkaWF0ZUNoYXJzZXQgPSAgVkNhcmRDb25maWcuREVGQVVMVF9JTlRFUk1FRElBVEVfQ0hBUlNFVDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8cD4KLSAgICAgKiBQYXJzZXMgdGhlIGZpbGUgYXQgdGhlIGdpdmVuIHBvc2l0aW9uLgotICAgICAqIDwvcD4KLSAgICAgKi8KLSAgICAvLyA8cHJlIGNsYXNzPSJwcmV0dHlwcmludCI+dmNhcmRfZmlsZSA9IFt3c2xzXSB2Y2FyZCBbd3Nsc108L3ByZT4KLSAgICBwcm90ZWN0ZWQgdm9pZCBwYXJzZVZDYXJkRmlsZSgpIHRocm93cyBJT0V4Y2VwdGlvbiwgVkNhcmRFeGNlcHRpb24gewotICAgICAgICBib29sZWFuIHJlYWRpbmdGaXJzdEZpbGUgPSB0cnVlOwotICAgICAgICB3aGlsZSAodHJ1ZSkgewotICAgICAgICAgICAgaWYgKG1DYW5jZWxlZCkgewotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKCFwYXJzZU9uZVZDYXJkKHJlYWRpbmdGaXJzdEZpbGUpKSB7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZWFkaW5nRmlyc3RGaWxlID0gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobU5lc3RDb3VudCA+IDApIHsKLSAgICAgICAgICAgIGJvb2xlYW4gdXNlQ2FjaGUgPSB0cnVlOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtTmVzdENvdW50OyBpKyspIHsKLSAgICAgICAgICAgICAgICByZWFkRW5kVkNhcmQodXNlQ2FjaGUsIHRydWUpOwotICAgICAgICAgICAgICAgIHVzZUNhY2hlID0gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIHRydWUgd2hlbiBhIGdpdmVuIHByb3BlcnR5IG5hbWUgaXMgYSB2YWxpZCBwcm9wZXJ0eSBuYW1lLgotICAgICAqLwotICAgIHByb3RlY3RlZCBib29sZWFuIGlzVmFsaWRQcm9wZXJ0eU5hbWUoZmluYWwgU3RyaW5nIHByb3BlcnR5TmFtZSkgewotICAgICAgICBpZiAoIShnZXRLbm93blByb3BlcnR5TmFtZVNldCgpLmNvbnRhaW5zKHByb3BlcnR5TmFtZS50b1VwcGVyQ2FzZSgpKSB8fAotICAgICAgICAgICAgICAgIHByb3BlcnR5TmFtZS5zdGFydHNXaXRoKCJYLSIpKQotICAgICAgICAgICAgICAgICYmICFtVW5rbm93blR5cGVTZXQuY29udGFpbnMocHJvcGVydHlOYW1lKSkgewotICAgICAgICAgICAgbVVua25vd25UeXBlU2V0LmFkZChwcm9wZXJ0eU5hbWUpOwotICAgICAgICAgICAgTG9nLncoTE9HX1RBRywgIlByb3BlcnR5IG5hbWUgdW5zdXBwb3J0ZWQgYnkgdkNhcmQgMi4xOiAiICsgcHJvcGVydHlOYW1lKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIFN0cmluZy4gSXQgbWF5IGJlIG51bGwsIG9yIGl0cyBsZW5ndGggbWF5IGJlIDAKLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRMaW5lKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIG1SZWFkZXIucmVhZExpbmUoKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIHBlZWtMaW5lKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIG1SZWFkZXIucGVla0xpbmUoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIFN0cmluZyB3aXRoIGl0J3MgbGVuZ3RoID4gMAotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgKiBAdGhyb3dzIFZDYXJkRXhjZXB0aW9uIHdoZW4gdGhlIHN0cmVhbSByZWFjaGVkIGVuZCBvZiBsaW5lCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXROb25FbXB0eUxpbmUoKSB0aHJvd3MgSU9FeGNlcHRpb24sIFZDYXJkRXhjZXB0aW9uIHsKLSAgICAgICAgU3RyaW5nIGxpbmU7Ci0gICAgICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgICAgICAgICBsaW5lID0gZ2V0TGluZSgpOwotICAgICAgICAgICAgaWYgKGxpbmUgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBWQ2FyZEV4Y2VwdGlvbigiUmVhY2hlZCBlbmQgb2YgYnVmZmVyLiIpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChsaW5lLnRyaW0oKS5sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbGluZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qCi0gICAgICogdmNhcmQgPSAiQkVHSU4iIFt3c10gIjoiIFt3c10gIlZDQVJEIiBbd3NdIDEqQ1JMRgotICAgICAqICAgICAgICAgaXRlbXMgKkNSTEYKLSAgICAgKiAgICAgICAgICJFTkQiIFt3c10gIjoiIFt3c10gIlZDQVJEIgotICAgICAqLwotICAgIHByaXZhdGUgYm9vbGVhbiBwYXJzZU9uZVZDYXJkKGJvb2xlYW4gZmlyc3RSZWFkKSB0aHJvd3MgSU9FeGNlcHRpb24sIFZDYXJkRXhjZXB0aW9uIHsKLSAgICAgICAgYm9vbGVhbiBhbGxvd0dhcmJhZ2UgPSBmYWxzZTsKLSAgICAgICAgaWYgKGZpcnN0UmVhZCkgewotICAgICAgICAgICAgaWYgKG1OZXN0Q291bnQgPiAwKSB7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtTmVzdENvdW50OyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCFyZWFkQmVnaW5WQ2FyZChhbGxvd0dhcmJhZ2UpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgYWxsb3dHYXJiYWdlID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoIXJlYWRCZWdpblZDYXJkKGFsbG93R2FyYmFnZSkpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICBmaW5hbCBsb25nIGJlZm9yZVN0YXJ0RW50cnkgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLSAgICAgICAgbUludGVycHJldGVyLnN0YXJ0RW50cnkoKTsKLSAgICAgICAgbVRpbWVSZWFkU3RhcnRSZWNvcmQgKz0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLSBiZWZvcmVTdGFydEVudHJ5OwotCi0gICAgICAgIGZpbmFsIGxvbmcgYmVmb3JlUGFyc2VJdGVtcyA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotICAgICAgICBwYXJzZUl0ZW1zKCk7Ci0gICAgICAgIG1UaW1lUGFyc2VJdGVtcyArPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAtIGJlZm9yZVBhcnNlSXRlbXM7Ci0KLSAgICAgICAgcmVhZEVuZFZDYXJkKHRydWUsIGZhbHNlKTsKLQotICAgICAgICBmaW5hbCBsb25nIGJlZm9yZUVuZEVudHJ5ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0gICAgICAgIG1JbnRlcnByZXRlci5lbmRFbnRyeSgpOwotICAgICAgICBtVGltZVJlYWRFbmRSZWNvcmQgKz0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLSBiZWZvcmVFbmRFbnRyeTsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHJldHVybiBUcnVlIHdoZW4gc3VjY2Vzc2Z1bC4gRmFsc2Ugd2hlbiByZWFjaGluZyB0aGUgZW5kIG9mIGxpbmUKLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICogQHRocm93cyBWQ2FyZEV4Y2VwdGlvbgotICAgICAqLwotICAgIHByb3RlY3RlZCBib29sZWFuIHJlYWRCZWdpblZDYXJkKGJvb2xlYW4gYWxsb3dHYXJiYWdlKSB0aHJvd3MgSU9FeGNlcHRpb24sIFZDYXJkRXhjZXB0aW9uIHsKLSAgICAgICAgU3RyaW5nIGxpbmU7Ci0gICAgICAgIGRvIHsKLSAgICAgICAgICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgICAgICAgICAgICAgbGluZSA9IGdldExpbmUoKTsKLSAgICAgICAgICAgICAgICBpZiAobGluZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGxpbmUudHJpbSgpLmxlbmd0aCgpID4gMCkgewotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmaW5hbCBTdHJpbmdbXSBzdHJBcnJheSA9IGxpbmUuc3BsaXQoIjoiLCAyKTsKLSAgICAgICAgICAgIGZpbmFsIGludCBsZW5ndGggPSBzdHJBcnJheS5sZW5ndGg7Ci0KLSAgICAgICAgICAgIC8vIEFsdGhvdWdoIHZDYXJkIDIuMS8zLjAgc3BlY2lmaWNhdGlvbiBkb2VzIG5vdCBhbGxvdyBsb3dlciBjYXNlcywKLSAgICAgICAgICAgIC8vIHdlIGZvdW5kIHZDYXJkIGZpbGUgZW1pdHRlZCBieSBzb21lIGV4dGVybmFsIHZDYXJkIGV4cG90ZXIgaGF2ZSBzdWNoCi0gICAgICAgICAgICAvLyBpbnZhbGlkIFN0cmluZ3MuCi0gICAgICAgICAgICAvLyBTbyB3ZSBhbGxvdyBpdC4KLSAgICAgICAgICAgIC8vIGUuZy4KLSAgICAgICAgICAgIC8vIEJFR0lOOnZDYXJkCi0gICAgICAgICAgICBpZiAobGVuZ3RoID09IDIgJiYgc3RyQXJyYXlbMF0udHJpbSgpLmVxdWFsc0lnbm9yZUNhc2UoIkJFR0lOIikKLSAgICAgICAgICAgICAgICAgICAgJiYgc3RyQXJyYXlbMV0udHJpbSgpLmVxdWFsc0lnbm9yZUNhc2UoIlZDQVJEIikpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoIWFsbG93R2FyYmFnZSkgewotICAgICAgICAgICAgICAgIGlmIChtTmVzdENvdW50ID4gMCkgewotICAgICAgICAgICAgICAgICAgICBtUHJldmlvdXNMaW5lID0gbGluZTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBWQ2FyZEV4Y2VwdGlvbigiRXhwZWN0ZWQgU3RyaW5nIFwiQkVHSU46VkNBUkRcIiBkaWQgbm90IGNvbWUgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIihJbnN0ZWFkLCBcIiIgKyBsaW5lICsgIlwiIGNhbWUpIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IHdoaWxlIChhbGxvd0dhcmJhZ2UpOwotCi0gICAgICAgIHRocm93IG5ldyBWQ2FyZEV4Y2VwdGlvbigiUmVhY2hlZCB3aGVyZSBtdXN0IG5vdCBiZSByZWFjaGVkLiIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDxwPgotICAgICAqIFRoZSBhcmd1bWVudHMgdXNlQ2FjaGUgYW5kIGFsbG93R2FyYmFzZSBhcmUgdXN1YWxseSB0cnVlIGFuZCBmYWxzZQotICAgICAqIGFjY29yZGluZ2x5IHdoZW4gdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgb3V0c2lkZSB0aGlzIGZ1bmN0aW9uIGl0c2VsZi4KLSAgICAgKiA8L3A+Ci0gICAgICogCi0gICAgICogQHBhcmFtIHVzZUNhY2hlIFdoZW4gdHJ1ZSwgbGluZSBpcyBvYnRhaW5lZCBmcm9tIG1QcmV2aW91c2xpbmUuCi0gICAgICogICAgICAgICAgICBPdGhlcndpc2UsIGdldExpbmUoKSBpcyB1c2VkLgotICAgICAqIEBwYXJhbSBhbGxvd0dhcmJhZ2UgV2hlbiB0cnVlLCBpZ25vcmUgbm9uICJFTkQ6VkNBUkQiIGxpbmUuCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAqIEB0aHJvd3MgVkNhcmRFeGNlcHRpb24KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCByZWFkRW5kVkNhcmQoYm9vbGVhbiB1c2VDYWNoZSwgYm9vbGVhbiBhbGxvd0dhcmJhZ2UpIHRocm93cyBJT0V4Y2VwdGlvbiwKLSAgICAgICAgICAgIFZDYXJkRXhjZXB0aW9uIHsKLSAgICAgICAgU3RyaW5nIGxpbmU7Ci0gICAgICAgIGRvIHsKLSAgICAgICAgICAgIGlmICh1c2VDYWNoZSkgewotICAgICAgICAgICAgICAgIC8vIFRob3VnaCB2Q2FyZCBzcGVjaWZpY2F0aW9uIGRvZXMgbm90IGFsbG93IGxvd2VyIGNhc2VzLAotICAgICAgICAgICAgICAgIC8vIHNvbWUgZGF0YSBtYXkgaGF2ZSB0aGVtLCBzbyB3ZSBhbGxvdyBpdC4KLSAgICAgICAgICAgICAgICBsaW5lID0gbVByZXZpb3VzTGluZTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgd2hpbGUgKHRydWUpIHsKLSAgICAgICAgICAgICAgICAgICAgbGluZSA9IGdldExpbmUoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGxpbmUgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFZDYXJkRXhjZXB0aW9uKCJFeHBlY3RlZCBFTkQ6VkNBUkQgd2FzIG5vdCBmb3VuZC4iKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChsaW5lLnRyaW0oKS5sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBTdHJpbmdbXSBzdHJBcnJheSA9IGxpbmUuc3BsaXQoIjoiLCAyKTsKLSAgICAgICAgICAgIGlmIChzdHJBcnJheS5sZW5ndGggPT0gMiAmJiBzdHJBcnJheVswXS50cmltKCkuZXF1YWxzSWdub3JlQ2FzZSgiRU5EIikKLSAgICAgICAgICAgICAgICAgICAgJiYgc3RyQXJyYXlbMV0udHJpbSgpLmVxdWFsc0lnbm9yZUNhc2UoIlZDQVJEIikpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKCFhbGxvd0dhcmJhZ2UpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVkNhcmRFeGNlcHRpb24oIkVORDpWQ0FSRCAhPSBcIiIgKyBtUHJldmlvdXNMaW5lICsgIlwiIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB1c2VDYWNoZSA9IGZhbHNlOwotICAgICAgICB9IHdoaWxlIChhbGxvd0dhcmJhZ2UpOwotICAgIH0KLQotICAgIC8qCi0gICAgICogaXRlbXMgPSAqQ1JMRiBpdGVtIC8gaXRlbQotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHBhcnNlSXRlbXMoKSB0aHJvd3MgSU9FeGNlcHRpb24sIFZDYXJkRXhjZXB0aW9uIHsKLSAgICAgICAgYm9vbGVhbiBlbmRlZCA9IGZhbHNlOwotCi0gICAgICAgIGZpbmFsIGxvbmcgYmVmb3JlQmVnaW5Qcm9wZXJ0eSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotICAgICAgICBtSW50ZXJwcmV0ZXIuc3RhcnRQcm9wZXJ0eSgpOwotICAgICAgICBtVGltZVN0YXJ0UHJvcGVydHkgKz0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLSBiZWZvcmVCZWdpblByb3BlcnR5OwotICAgICAgICBlbmRlZCA9IHBhcnNlSXRlbSgpOwotICAgICAgICBpZiAoIWVuZGVkKSB7Ci0gICAgICAgICAgICBmaW5hbCBsb25nIGJlZm9yZUVuZFByb3BlcnR5ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0gICAgICAgICAgICBtSW50ZXJwcmV0ZXIuZW5kUHJvcGVydHkoKTsKLSAgICAgICAgICAgIG1UaW1lRW5kUHJvcGVydHkgKz0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLSBiZWZvcmVFbmRQcm9wZXJ0eTsKLSAgICAgICAgfQotCi0gICAgICAgIHdoaWxlICghZW5kZWQpIHsKLSAgICAgICAgICAgIGZpbmFsIGxvbmcgYmVmb3JlU3RhcnRQcm9wZXJ0eSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotICAgICAgICAgICAgbUludGVycHJldGVyLnN0YXJ0UHJvcGVydHkoKTsKLSAgICAgICAgICAgIG1UaW1lU3RhcnRQcm9wZXJ0eSArPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAtIGJlZm9yZVN0YXJ0UHJvcGVydHk7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGVuZGVkID0gcGFyc2VJdGVtKCk7Ci0gICAgICAgICAgICB9IGNhdGNoIChWQ2FyZEludmFsaWRDb21tZW50TGluZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmUoTE9HX1RBRywgIkludmFsaWQgbGluZSB3aGljaCBsb29rcyBsaWtlIHNvbWUgY29tbWVudCB3YXMgZm91bmQuIElnbm9yZWQuIik7Ci0gICAgICAgICAgICAgICAgZW5kZWQgPSBmYWxzZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKCFlbmRlZCkgewotICAgICAgICAgICAgICAgIGZpbmFsIGxvbmcgYmVmb3JlRW5kUHJvcGVydHkgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLSAgICAgICAgICAgICAgICBtSW50ZXJwcmV0ZXIuZW5kUHJvcGVydHkoKTsKLSAgICAgICAgICAgICAgICBtVGltZUVuZFByb3BlcnR5ICs9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC0gYmVmb3JlRW5kUHJvcGVydHk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKgotICAgICAqIGl0ZW0gPSBbZ3JvdXBzICIuIl0gbmFtZSBbcGFyYW1zXSAiOiIgdmFsdWUgQ1JMRiAvIFtncm91cHMgIi4iXSAiQURSIgotICAgICAqIFtwYXJhbXNdICI6IiBhZGRyZXNzcGFydHMgQ1JMRiAvIFtncm91cHMgIi4iXSAiT1JHIiBbcGFyYW1zXSAiOiIgb3JncGFydHMKLSAgICAgKiBDUkxGIC8gW2dyb3VwcyAiLiJdICJOIiBbcGFyYW1zXSAiOiIgbmFtZXBhcnRzIENSTEYgLyBbZ3JvdXBzICIuIl0KLSAgICAgKiAiQUdFTlQiIFtwYXJhbXNdICI6IiB2Y2FyZCBDUkxGCi0gICAgICovCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gcGFyc2VJdGVtKCkgdGhyb3dzIElPRXhjZXB0aW9uLCBWQ2FyZEV4Y2VwdGlvbiB7Ci0gICAgICAgIG1DdXJyZW50RW5jb2RpbmcgPSBERUZBVUxUX0VOQ09ESU5HOwotCi0gICAgICAgIGZpbmFsIFN0cmluZyBsaW5lID0gZ2V0Tm9uRW1wdHlMaW5lKCk7Ci0gICAgICAgIGxvbmcgc3RhcnQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQotICAgICAgICBTdHJpbmdbXSBwcm9wZXJ0eU5hbWVBbmRWYWx1ZSA9IHNlcGFyYXRlTGluZUFuZEhhbmRsZUdyb3VwKGxpbmUpOwotICAgICAgICBpZiAocHJvcGVydHlOYW1lQW5kVmFsdWUgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHByb3BlcnR5TmFtZUFuZFZhbHVlLmxlbmd0aCAhPSAyKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgVkNhcmRJbnZhbGlkTGluZUV4Y2VwdGlvbigiSW52YWxpZCBsaW5lIFwiIiArIGxpbmUgKyAiXCIiKTsKLSAgICAgICAgfQotICAgICAgICBTdHJpbmcgcHJvcGVydHlOYW1lID0gcHJvcGVydHlOYW1lQW5kVmFsdWVbMF0udG9VcHBlckNhc2UoKTsKLSAgICAgICAgU3RyaW5nIHByb3BlcnR5VmFsdWUgPSBwcm9wZXJ0eU5hbWVBbmRWYWx1ZVsxXTsKLQotICAgICAgICBtVGltZVBhcnNlTGluZUFuZEhhbmRsZUdyb3VwICs9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC0gc3RhcnQ7Ci0KLSAgICAgICAgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoIkFEUiIpIHx8IHByb3BlcnR5TmFtZS5lcXVhbHMoIk9SRyIpIHx8IHByb3BlcnR5TmFtZS5lcXVhbHMoIk4iKSkgewotICAgICAgICAgICAgc3RhcnQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLSAgICAgICAgICAgIGhhbmRsZU11bHRpcGxlUHJvcGVydHlWYWx1ZShwcm9wZXJ0eU5hbWUsIHByb3BlcnR5VmFsdWUpOwotICAgICAgICAgICAgbVRpbWVQYXJzZUFkck9yZ04gKz0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLSBzdGFydDsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfSBlbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKCJBR0VOVCIpKSB7Ci0gICAgICAgICAgICBoYW5kbGVBZ2VudChwcm9wZXJ0eVZhbHVlKTsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfSBlbHNlIGlmIChpc1ZhbGlkUHJvcGVydHlOYW1lKHByb3BlcnR5TmFtZSkpIHsKLSAgICAgICAgICAgIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKCJCRUdJTiIpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHByb3BlcnR5VmFsdWUuZXF1YWxzKCJWQ0FSRCIpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBWQ2FyZE5lc3RlZEV4Y2VwdGlvbigiVGhpcyB2Q2FyZCBoYXMgbmVzdGVkIHZDYXJkIGRhdGEgaW4gaXQuIik7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFZDYXJkRXhjZXB0aW9uKCJVbmtub3duIEJFR0lOIHR5cGU6ICIgKyBwcm9wZXJ0eVZhbHVlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoIlZFUlNJT04iKSAmJiAhcHJvcGVydHlWYWx1ZS5lcXVhbHMoZ2V0VmVyc2lvblN0cmluZygpKSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBWQ2FyZFZlcnNpb25FeGNlcHRpb24oIkluY29tcGF0aWJsZSB2ZXJzaW9uOiAiICsgcHJvcGVydHlWYWx1ZSArICIgIT0gIgotICAgICAgICAgICAgICAgICAgICAgICAgKyBnZXRWZXJzaW9uU3RyaW5nKCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc3RhcnQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLSAgICAgICAgICAgIGhhbmRsZVByb3BlcnR5VmFsdWUocHJvcGVydHlOYW1lLCBwcm9wZXJ0eVZhbHVlKTsKLSAgICAgICAgICAgIG1UaW1lUGFyc2VQcm9wZXJ0eVZhbHVlcyArPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAtIHN0YXJ0OwotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgdGhyb3cgbmV3IFZDYXJkRXhjZXB0aW9uKCJVbmtub3duIHByb3BlcnR5IG5hbWU6IFwiIiArIHByb3BlcnR5TmFtZSArICJcIiIpOwotICAgIH0KLQotICAgIC8vIEZvciBwZXJmb3JtYW5jZSByZWFzb24sIHRoZSBzdGF0ZXMgZm9yIGdyb3VwIGFuZCBwcm9wZXJ0eSBuYW1lIGFyZSBtZXJnZWQgaW50byBvbmUuCi0gICAgc3RhdGljIHByaXZhdGUgZmluYWwgaW50IFNUQVRFX0dST1VQX09SX1BST1BFUlRZX05BTUUgPSAwOwotICAgIHN0YXRpYyBwcml2YXRlIGZpbmFsIGludCBTVEFURV9QQVJBTVMgPSAxOwotICAgIC8vIHZDYXJkIDMuMCBzcGVjaWZpY2F0aW9uIGFsbG93cyBkb3VibGUtcXVvdGVkIHBhcmFtZXRlcnMsIHdoaWxlIHZDYXJkIDIuMSBkb2VzIG5vdC4KLSAgICBzdGF0aWMgcHJpdmF0ZSBmaW5hbCBpbnQgU1RBVEVfUEFSQU1TX0lOX0RRVU9URSA9IDI7Ci0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nW10gc2VwYXJhdGVMaW5lQW5kSGFuZGxlR3JvdXAoU3RyaW5nIGxpbmUpIHRocm93cyBWQ2FyZEV4Y2VwdGlvbiB7Ci0gICAgICAgIGZpbmFsIFN0cmluZ1tdIHByb3BlcnR5TmFtZUFuZFZhbHVlID0gbmV3IFN0cmluZ1syXTsKLSAgICAgICAgZmluYWwgaW50IGxlbmd0aCA9IGxpbmUubGVuZ3RoKCk7Ci0gICAgICAgIGlmIChsZW5ndGggPiAwICYmIGxpbmUuY2hhckF0KDApID09ICcjJykgewotICAgICAgICAgICAgdGhyb3cgbmV3IFZDYXJkSW52YWxpZENvbW1lbnRMaW5lRXhjZXB0aW9uKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBpbnQgc3RhdGUgPSBTVEFURV9HUk9VUF9PUl9QUk9QRVJUWV9OQU1FOwotICAgICAgICBpbnQgbmFtZUluZGV4ID0gMDsKLQotICAgICAgICAvLyBUaGlzIGxvb3AgaXMgZGV2ZWxvcGVkIHNvIHRoYXQgd2UgZG9uJ3QgaGF2ZSB0byB0YWtlIGNhcmUgb2YgYm90dGxlIG5lY2sgaGVyZS4KLSAgICAgICAgLy8gUmVmYWN0b3IgY2FyZWZ1bGx5IHdoZW4geW91IG5lZWQgdG8gZG8gc28uCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIGZpbmFsIGNoYXIgY2ggPSBsaW5lLmNoYXJBdChpKTsKLSAgICAgICAgICAgIHN3aXRjaCAoc3RhdGUpIHsKLSAgICAgICAgICAgICAgICBjYXNlIFNUQVRFX0dST1VQX09SX1BST1BFUlRZX05BTUU6IHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGNoID09ICc6JykgeyAgLy8gRW5kIG9mIGEgcHJvcGVydHkgbmFtZS4KLSAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBwcm9wZXJ0eU5hbWUgPSBsaW5lLnN1YnN0cmluZyhuYW1lSW5kZXgsIGkpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHNJZ25vcmVDYXNlKCJFTkQiKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1QcmV2aW91c0xpbmUgPSBsaW5lOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgbUludGVycHJldGVyLnByb3BlcnR5TmFtZShwcm9wZXJ0eU5hbWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHlOYW1lQW5kVmFsdWVbMF0gPSBwcm9wZXJ0eU5hbWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaSA8IGxlbmd0aCAtIDEpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eU5hbWVBbmRWYWx1ZVsxXSA9IGxpbmUuc3Vic3RyaW5nKGkgKyAxKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHlOYW1lQW5kVmFsdWVbMV0gPSAiIjsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBwcm9wZXJ0eU5hbWVBbmRWYWx1ZTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjaCA9PSAnLicpIHsgIC8vIEVhY2ggZ3JvdXAgaXMgZm9sbG93ZWQgYnkgdGhlIGRvdC4KLSAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBncm91cE5hbWUgPSBsaW5lLnN1YnN0cmluZyhuYW1lSW5kZXgsIGkpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGdyb3VwTmFtZS5sZW5ndGgoKSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9nLncoTE9HX1RBRywgIkVtcHR5IGdyb3VwIGZvdW5kLiBJZ25vcmluZy4iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbUludGVycHJldGVyLnByb3BlcnR5R3JvdXAoZ3JvdXBOYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVJbmRleCA9IGkgKyAxOyAgLy8gTmV4dCBzaG91bGQgYmUgYW5vdGhlciBncm91cCBvciBhIHByb3BlcnR5IG5hbWUuCi0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY2ggPT0gJzsnKSB7ICAvLyBFbmQgb2YgcHJvcGVydHkgbmFtZSBhbmQgYmVnaW5uZW5nIG9mIHBhcmFtZXRlcnMuICAKLSAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBwcm9wZXJ0eU5hbWUgPSBsaW5lLnN1YnN0cmluZyhuYW1lSW5kZXgsIGkpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHNJZ25vcmVDYXNlKCJFTkQiKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1QcmV2aW91c0xpbmUgPSBsaW5lOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgbUludGVycHJldGVyLnByb3BlcnR5TmFtZShwcm9wZXJ0eU5hbWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHlOYW1lQW5kVmFsdWVbMF0gPSBwcm9wZXJ0eU5hbWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICBuYW1lSW5kZXggPSBpICsgMTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlID0gU1RBVEVfUEFSQU1TOyAgLy8gU3RhcnQgcGFyYW1ldGVyIHBhcnNpbmcuCi0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgLy8gVE9ETzogY29tbWEgc3VwcG9ydCAoaW4gdkNhcmQgMy4wIGFuZCA0LjApLgotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY2FzZSBTVEFURV9QQVJBTVM6IHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGNoID09ICciJykgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFZDYXJkQ29uc3RhbnRzLlZFUlNJT05fVjIxLmVxdWFsc0lnbm9yZUNhc2UoZ2V0VmVyc2lvblN0cmluZygpKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvZy53KExPR19UQUcsICJEb3VibGUtcXVvdGVkIHBhcmFtcyBmb3VuZCBpbiB2Q2FyZCAyLjEuICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNpbGVudGx5IGFsbG93IGl0Iik7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZSA9IFNUQVRFX1BBUkFNU19JTl9EUVVPVEU7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY2ggPT0gJzsnKSB7ICAvLyBTdGFydHMgYW5vdGhlciBwYXJhbS4KLSAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZVBhcmFtcyhsaW5lLnN1YnN0cmluZyhuYW1lSW5kZXgsIGkpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVJbmRleCA9IGkgKyAxOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNoID09ICc6JykgeyAgLy8gRW5kIG9mIHBhcmFtIGFuZCBiZWdpbmVubmluZyBvZiB2YWx1ZXMuCi0gICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVQYXJhbXMobGluZS5zdWJzdHJpbmcobmFtZUluZGV4LCBpKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaSA8IGxlbmd0aCAtIDEpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eU5hbWVBbmRWYWx1ZVsxXSA9IGxpbmUuc3Vic3RyaW5nKGkgKyAxKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHlOYW1lQW5kVmFsdWVbMV0gPSAiIjsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBwcm9wZXJ0eU5hbWVBbmRWYWx1ZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY2FzZSBTVEFURV9QQVJBTVNfSU5fRFFVT1RFOiB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjaCA9PSAnIicpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChWQ2FyZENvbnN0YW50cy5WRVJTSU9OX1YyMS5lcXVhbHNJZ25vcmVDYXNlKGdldFZlcnNpb25TdHJpbmcoKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2cudyhMT0dfVEFHLCAiRG91YmxlLXF1b3RlZCBwYXJhbXMgZm91bmQgaW4gdkNhcmQgMi4xLiAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTaWxlbnRseSBhbGxvdyBpdCIpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUgPSBTVEFURV9QQVJBTVM7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgdGhyb3cgbmV3IFZDYXJkSW52YWxpZExpbmVFeGNlcHRpb24oIkludmFsaWQgbGluZTogXCIiICsgbGluZSArICJcIiIpOwotICAgIH0KLQotICAgIC8qCi0gICAgICogcGFyYW1zID0gIjsiIFt3c10gcGFyYW1saXN0IHBhcmFtbGlzdCA9IHBhcmFtbGlzdCBbd3NdICI7IiBbd3NdIHBhcmFtIC8KLSAgICAgKiBwYXJhbSBwYXJhbSA9ICJUWVBFIiBbd3NdICI9IiBbd3NdIHB0eXBldmFsIC8gIlZBTFVFIiBbd3NdICI9IiBbd3NdCi0gICAgICogcHZhbHVldmFsIC8gIkVOQ09ESU5HIiBbd3NdICI9IiBbd3NdIHBlbmNvZGluZ3ZhbCAvICJDSEFSU0VUIiBbd3NdICI9IgotICAgICAqIFt3c10gY2hhcnNldHZhbCAvICJMQU5HVUFHRSIgW3dzXSAiPSIgW3dzXSBsYW5ndmFsIC8gIlgtIiB3b3JkIFt3c10gIj0iCi0gICAgICogW3dzXSB3b3JkIC8ga25vd250eXBlCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgaGFuZGxlUGFyYW1zKFN0cmluZyBwYXJhbXMpIHRocm93cyBWQ2FyZEV4Y2VwdGlvbiB7Ci0gICAgICAgIGZpbmFsIFN0cmluZ1tdIHN0ckFycmF5ID0gcGFyYW1zLnNwbGl0KCI9IiwgMik7Ci0gICAgICAgIGlmIChzdHJBcnJheS5sZW5ndGggPT0gMikgewotICAgICAgICAgICAgZmluYWwgU3RyaW5nIHBhcmFtTmFtZSA9IHN0ckFycmF5WzBdLnRyaW0oKS50b1VwcGVyQ2FzZSgpOwotICAgICAgICAgICAgU3RyaW5nIHBhcmFtVmFsdWUgPSBzdHJBcnJheVsxXS50cmltKCk7Ci0gICAgICAgICAgICBpZiAocGFyYW1OYW1lLmVxdWFscygiVFlQRSIpKSB7Ci0gICAgICAgICAgICAgICAgaGFuZGxlVHlwZShwYXJhbVZhbHVlKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAocGFyYW1OYW1lLmVxdWFscygiVkFMVUUiKSkgewotICAgICAgICAgICAgICAgIGhhbmRsZVZhbHVlKHBhcmFtVmFsdWUpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChwYXJhbU5hbWUuZXF1YWxzKCJFTkNPRElORyIpKSB7Ci0gICAgICAgICAgICAgICAgaGFuZGxlRW5jb2RpbmcocGFyYW1WYWx1ZSk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKHBhcmFtTmFtZS5lcXVhbHMoIkNIQVJTRVQiKSkgewotICAgICAgICAgICAgICAgIGhhbmRsZUNoYXJzZXQocGFyYW1WYWx1ZSk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKHBhcmFtTmFtZS5lcXVhbHMoIkxBTkdVQUdFIikpIHsKLSAgICAgICAgICAgICAgICBoYW5kbGVMYW5ndWFnZShwYXJhbVZhbHVlKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAocGFyYW1OYW1lLnN0YXJ0c1dpdGgoIlgtIikpIHsKLSAgICAgICAgICAgICAgICBoYW5kbGVBbnlQYXJhbShwYXJhbU5hbWUsIHBhcmFtVmFsdWUpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVkNhcmRFeGNlcHRpb24oIlVua25vd24gdHlwZSBcIiIgKyBwYXJhbU5hbWUgKyAiXCIiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGhhbmRsZVBhcmFtV2l0aG91dE5hbWUoc3RyQXJyYXlbMF0pOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogdkNhcmQgMy4wIHBhcnNlciBpbXBsZW1lbnRhdGlvbiBtYXkgdGhyb3cgVkNhcmRFeGNlcHRpb24uCi0gICAgICovCi0gICAgQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpCi0gICAgcHJvdGVjdGVkIHZvaWQgaGFuZGxlUGFyYW1XaXRob3V0TmFtZShmaW5hbCBTdHJpbmcgcGFyYW1WYWx1ZSkgdGhyb3dzIFZDYXJkRXhjZXB0aW9uIHsKLSAgICAgICAgaGFuZGxlVHlwZShwYXJhbVZhbHVlKTsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIHB0eXBldmFsID0ga25vd250eXBlIC8gIlgtIiB3b3JkCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgaGFuZGxlVHlwZShmaW5hbCBTdHJpbmcgcHR5cGV2YWwpIHsKLSAgICAgICAgaWYgKCEoZ2V0S25vd25UeXBlU2V0KCkuY29udGFpbnMocHR5cGV2YWwudG9VcHBlckNhc2UoKSkKLSAgICAgICAgICAgICAgICB8fCBwdHlwZXZhbC5zdGFydHNXaXRoKCJYLSIpKQotICAgICAgICAgICAgICAgICYmICFtVW5rbm93blR5cGVTZXQuY29udGFpbnMocHR5cGV2YWwpKSB7Ci0gICAgICAgICAgICBtVW5rbm93blR5cGVTZXQuYWRkKHB0eXBldmFsKTsKLSAgICAgICAgICAgIExvZy53KExPR19UQUcsIFN0cmluZy5mb3JtYXQoIlRZUEUgdW5zdXBwb3J0ZWQgYnkgJXM6ICIsIGdldFZlcnNpb24oKSwgcHR5cGV2YWwpKTsKLSAgICAgICAgfQotICAgICAgICBtSW50ZXJwcmV0ZXIucHJvcGVydHlQYXJhbVR5cGUoIlRZUEUiKTsKLSAgICAgICAgbUludGVycHJldGVyLnByb3BlcnR5UGFyYW1WYWx1ZShwdHlwZXZhbCk7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBwdmFsdWV2YWwgPSAiSU5MSU5FIiAvICJVUkwiIC8gIkNPTlRFTlQtSUQiIC8gIkNJRCIgLyAiWC0iIHdvcmQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBoYW5kbGVWYWx1ZShmaW5hbCBTdHJpbmcgcHZhbHVldmFsKSB7Ci0gICAgICAgIGlmICghKGdldEtub3duVmFsdWVTZXQoKS5jb250YWlucyhwdmFsdWV2YWwudG9VcHBlckNhc2UoKSkKLSAgICAgICAgICAgICAgICB8fCBwdmFsdWV2YWwuc3RhcnRzV2l0aCgiWC0iKQotICAgICAgICAgICAgICAgIHx8IG1Vbmtub3duVmFsdWVTZXQuY29udGFpbnMocHZhbHVldmFsKSkpIHsKLSAgICAgICAgICAgIG1Vbmtub3duVmFsdWVTZXQuYWRkKHB2YWx1ZXZhbCk7Ci0gICAgICAgICAgICBMb2cudyhMT0dfVEFHLCBTdHJpbmcuZm9ybWF0KAotICAgICAgICAgICAgICAgICAgICAiVGhlIHZhbHVlIHVuc3VwcG9ydGVkIGJ5IFRZUEUgb2YgJXM6ICIsIGdldFZlcnNpb24oKSwgcHZhbHVldmFsKSk7Ci0gICAgICAgIH0KLSAgICAgICAgbUludGVycHJldGVyLnByb3BlcnR5UGFyYW1UeXBlKCJWQUxVRSIpOwotICAgICAgICBtSW50ZXJwcmV0ZXIucHJvcGVydHlQYXJhbVZhbHVlKHB2YWx1ZXZhbCk7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBwZW5jb2Rpbmd2YWwgPSAiN0JJVCIgLyAiOEJJVCIgLyAiUVVPVEVELVBSSU5UQUJMRSIgLyAiQkFTRTY0IiAvICJYLSIgd29yZAotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGhhbmRsZUVuY29kaW5nKFN0cmluZyBwZW5jb2Rpbmd2YWwpIHRocm93cyBWQ2FyZEV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChnZXRBdmFpbGFibGVFbmNvZGluZ1NldCgpLmNvbnRhaW5zKHBlbmNvZGluZ3ZhbCkgfHwKLSAgICAgICAgICAgICAgICBwZW5jb2Rpbmd2YWwuc3RhcnRzV2l0aCgiWC0iKSkgewotICAgICAgICAgICAgbUludGVycHJldGVyLnByb3BlcnR5UGFyYW1UeXBlKCJFTkNPRElORyIpOwotICAgICAgICAgICAgbUludGVycHJldGVyLnByb3BlcnR5UGFyYW1WYWx1ZShwZW5jb2Rpbmd2YWwpOwotICAgICAgICAgICAgbUN1cnJlbnRFbmNvZGluZyA9IHBlbmNvZGluZ3ZhbDsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBWQ2FyZEV4Y2VwdGlvbigiVW5rbm93biBlbmNvZGluZyBcIiIgKyBwZW5jb2Rpbmd2YWwgKyAiXCIiKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIDxwPgotICAgICAqIHZDYXJkIDIuMSBzcGVjaWZpY2F0aW9uIG9ubHkgYWxsb3dzIHVzLWFzY2lpIGFuZCBpc28tODg1OS14eHggKFNlZSBSRkMgMTUyMSksCi0gICAgICogYnV0IHJlY2VudCB2Q2FyZCBmaWxlcyBvZnRlbiBjb250YWluIG90aGVyIGNoYXJzZXQgbGlrZSBVVEYtOCwgU0hJRlRfSklTLCBldGMuCi0gICAgICogV2UgYWxsb3cgYW55IGNoYXJzZXQuCi0gICAgICogPC9wPgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGhhbmRsZUNoYXJzZXQoU3RyaW5nIGNoYXJzZXR2YWwpIHsKLSAgICAgICAgbUludGVycHJldGVyLnByb3BlcnR5UGFyYW1UeXBlKCJDSEFSU0VUIik7Ci0gICAgICAgIG1JbnRlcnByZXRlci5wcm9wZXJ0eVBhcmFtVmFsdWUoY2hhcnNldHZhbCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2VlIGFsc28gU2VjdGlvbiA3LjEgb2YgUkZDIDE1MjEKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBoYW5kbGVMYW5ndWFnZShTdHJpbmcgbGFuZ3ZhbCkgdGhyb3dzIFZDYXJkRXhjZXB0aW9uIHsKLSAgICAgICAgU3RyaW5nW10gc3RyQXJyYXkgPSBsYW5ndmFsLnNwbGl0KCItIik7Ci0gICAgICAgIGlmIChzdHJBcnJheS5sZW5ndGggIT0gMikgewotICAgICAgICAgICAgdGhyb3cgbmV3IFZDYXJkRXhjZXB0aW9uKCJJbnZhbGlkIExhbmd1YWdlOiBcIiIgKyBsYW5ndmFsICsgIlwiIik7Ci0gICAgICAgIH0KLSAgICAgICAgU3RyaW5nIHRtcCA9IHN0ckFycmF5WzBdOwotICAgICAgICBpbnQgbGVuZ3RoID0gdG1wLmxlbmd0aCgpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBpZiAoIWlzQXNjaWlMZXR0ZXIodG1wLmNoYXJBdChpKSkpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVkNhcmRFeGNlcHRpb24oIkludmFsaWQgTGFuZ3VhZ2U6IFwiIiArIGxhbmd2YWwgKyAiXCIiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICB0bXAgPSBzdHJBcnJheVsxXTsKLSAgICAgICAgbGVuZ3RoID0gdG1wLmxlbmd0aCgpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBpZiAoIWlzQXNjaWlMZXR0ZXIodG1wLmNoYXJBdChpKSkpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVkNhcmRFeGNlcHRpb24oIkludmFsaWQgTGFuZ3VhZ2U6IFwiIiArIGxhbmd2YWwgKyAiXCIiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBtSW50ZXJwcmV0ZXIucHJvcGVydHlQYXJhbVR5cGUoVkNhcmRDb25zdGFudHMuUEFSQU1fTEFOR1VBR0UpOwotICAgICAgICBtSW50ZXJwcmV0ZXIucHJvcGVydHlQYXJhbVZhbHVlKGxhbmd2YWwpOwotICAgIH0KLQotICAgIHByaXZhdGUgYm9vbGVhbiBpc0FzY2lpTGV0dGVyKGNoYXIgY2gpIHsKLSAgICAgICAgaWYgKChjaCA+PSAnYScgJiYgY2ggPD0gJ3onKSB8fCAoY2ggPj0gJ0EnICYmIGNoIDw9ICdaJykpIHsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBNYWlubHkgZm9yICJYLSIgdHlwZS4gVGhpcyBhY2NlcHRzIGFueSBraW5kIG9mIHR5cGUgd2l0aG91dCBjaGVjay4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBoYW5kbGVBbnlQYXJhbShTdHJpbmcgcGFyYW1OYW1lLCBTdHJpbmcgcGFyYW1WYWx1ZSkgewotICAgICAgICBtSW50ZXJwcmV0ZXIucHJvcGVydHlQYXJhbVR5cGUocGFyYW1OYW1lKTsKLSAgICAgICAgbUludGVycHJldGVyLnByb3BlcnR5UGFyYW1WYWx1ZShwYXJhbVZhbHVlKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBoYW5kbGVQcm9wZXJ0eVZhbHVlKFN0cmluZyBwcm9wZXJ0eU5hbWUsIFN0cmluZyBwcm9wZXJ0eVZhbHVlKQotICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBWQ2FyZEV4Y2VwdGlvbiB7Ci0gICAgICAgIGZpbmFsIFN0cmluZyB1cHBlckVuY29kaW5nID0gbUN1cnJlbnRFbmNvZGluZy50b1VwcGVyQ2FzZSgpOwotICAgICAgICBpZiAodXBwZXJFbmNvZGluZy5lcXVhbHMoVkNhcmRDb25zdGFudHMuUEFSQU1fRU5DT0RJTkdfUVApKSB7Ci0gICAgICAgICAgICBmaW5hbCBsb25nIHN0YXJ0ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0gICAgICAgICAgICBmaW5hbCBTdHJpbmcgcmVzdWx0ID0gZ2V0UXVvdGVkUHJpbnRhYmxlKHByb3BlcnR5VmFsdWUpOwotICAgICAgICAgICAgZmluYWwgQXJyYXlMaXN0PFN0cmluZz4gdiA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotICAgICAgICAgICAgdi5hZGQocmVzdWx0KTsKLSAgICAgICAgICAgIG1JbnRlcnByZXRlci5wcm9wZXJ0eVZhbHVlcyh2KTsKLSAgICAgICAgICAgIG1UaW1lSGFuZGxlUXVvdGVkUHJpbnRhYmxlICs9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC0gc3RhcnQ7Ci0gICAgICAgIH0gZWxzZSBpZiAodXBwZXJFbmNvZGluZy5lcXVhbHMoVkNhcmRDb25zdGFudHMuUEFSQU1fRU5DT0RJTkdfQkFTRTY0KQotICAgICAgICAgICAgICAgIHx8IHVwcGVyRW5jb2RpbmcuZXF1YWxzKFZDYXJkQ29uc3RhbnRzLlBBUkFNX0VOQ09ESU5HX0IpKSB7Ci0gICAgICAgICAgICBmaW5hbCBsb25nIHN0YXJ0ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0gICAgICAgICAgICAvLyBJdCBpcyB2ZXJ5IHJhcmUsIGJ1dCBzb21lIEJBU0U2NCBkYXRhIG1heSBiZSBzbyBiaWcgdGhhdAotICAgICAgICAgICAgLy8gT3V0T2ZNZW1vcnlFcnJvciBvY2N1cnMuIFRvIGlnbm9yZSBzdWNoIGNhc2VzLCB1c2UgdHJ5LWNhdGNoLgotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBmaW5hbCBBcnJheUxpc3Q8U3RyaW5nPiBhcnJheUxpc3QgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLSAgICAgICAgICAgICAgICBhcnJheUxpc3QuYWRkKGdldEJhc2U2NChwcm9wZXJ0eVZhbHVlKSk7Ci0gICAgICAgICAgICAgICAgbUludGVycHJldGVyLnByb3BlcnR5VmFsdWVzKGFycmF5TGlzdCk7Ci0gICAgICAgICAgICB9IGNhdGNoIChPdXRPZk1lbW9yeUVycm9yIGVycm9yKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmUoTE9HX1RBRywgIk91dE9mTWVtb3J5RXJyb3IgaGFwcGVuZWQgZHVyaW5nIHBhcnNpbmcgQkFTRTY0IGRhdGEhIik7Ci0gICAgICAgICAgICAgICAgbUludGVycHJldGVyLnByb3BlcnR5VmFsdWVzKG51bGwpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbVRpbWVIYW5kbGVCYXNlNjQgKz0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLSBzdGFydDsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGlmICghKHVwcGVyRW5jb2RpbmcuZXF1YWxzKCI3QklUIikgfHwgdXBwZXJFbmNvZGluZy5lcXVhbHMoIjhCSVQiKSB8fAotICAgICAgICAgICAgICAgICAgICB1cHBlckVuY29kaW5nLnN0YXJ0c1dpdGgoIlgtIikpKSB7Ci0gICAgICAgICAgICAgICAgTG9nLncoTE9HX1RBRywKLSAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZy5mb3JtYXQoIlRoZSBlbmNvZGluZyBcIiVzXCIgaXMgdW5zdXBwb3J0ZWQgYnkgdkNhcmQgJXMiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ3VycmVudEVuY29kaW5nLCBnZXRWZXJzaW9uU3RyaW5nKCkpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gU29tZSBkZXZpY2UgdXNlcyBsaW5lIGZvbGRpbmcgZGVmaW5lZCBpbiBSRkMgMjQyNSwgd2hpY2ggaXMgbm90IGFsbG93ZWQKLSAgICAgICAgICAgIC8vIGluIHZDYXJkIDIuMSAod2hpbGUgbmVlZGVkIGluIHZDYXJkIDMuMCkuCi0gICAgICAgICAgICAvLwotICAgICAgICAgICAgLy8gZS5nLgotICAgICAgICAgICAgLy8gQkVHSU46VkNBUkQKLSAgICAgICAgICAgIC8vIFZFUlNJT046Mi4xCi0gICAgICAgICAgICAvLyBOOjtPbWVnYTs7OwotICAgICAgICAgICAgLy8gRU1BSUw7SU5URVJORVQ6Ik9tZWdhIgotICAgICAgICAgICAgLy8gICA8b21lZ2FAZXhhbXBsZS5jb20+Ci0gICAgICAgICAgICAvLyBGTjpPbWVnYQotICAgICAgICAgICAgLy8gRU5EOlZDQVJECi0gICAgICAgICAgICAvLwotICAgICAgICAgICAgLy8gVGhlIHZDYXJkIGFib3ZlIGFzc3VtZXMgdGhhdCBlbWFpbCBhZGRyZXNzIHNob3VsZCBiZWNvbWU6Ci0gICAgICAgICAgICAvLyAiT21lZ2EiIDxvbWVnYUBleGFtcGxlLmNvbT4KLSAgICAgICAgICAgIC8vCi0gICAgICAgICAgICAvLyBCdXQgdkNhcmQgMi4xIHJlcXVpcmVzIFF1b3RlLVByaW50YWJsZSB3aGVuIGEgbGluZSBjb250YWlucyBsaW5lIGJyZWFrKHMpLgotICAgICAgICAgICAgLy8KLSAgICAgICAgICAgIC8vIEZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IGxpbmUgZm9sZGluZywKLSAgICAgICAgICAgIC8vIHNlZSAiNS44LjEuIExpbmUgZGVsaW1pdGluZyBhbmQgZm9sZGluZyIgaW4gUkZDIDI0MjUuCi0gICAgICAgICAgICAvLwotICAgICAgICAgICAgLy8gV2UgdGFrZSBjYXJlIG9mIHRoaXMgY2FzZSBtb3JlIGZvcm1hbGx5IGluIHZDYXJkIDMuMCwgc28gd2Ugb25seSBuZWVkIHRvCi0gICAgICAgICAgICAvLyBkbyB0aGlzIGluIHZDYXJkIDIuMS4KLSAgICAgICAgICAgIGlmIChnZXRWZXJzaW9uKCkgPT0gVkNhcmRDb25maWcuVkVSU0lPTl8yMSkgewotICAgICAgICAgICAgICAgIFN0cmluZ0J1aWxkZXIgYnVpbGRlciA9IG51bGw7Ci0gICAgICAgICAgICAgICAgd2hpbGUgKHRydWUpIHsKLSAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIG5leHRMaW5lID0gcGVla0xpbmUoKTsKLSAgICAgICAgICAgICAgICAgICAgLy8gV2UgZG9uJ3QgbmVlZCB0byBjYXJlIHRvbyBtdWNoIGFib3V0IHRoaXMgZXhjZXB0aW9uYWwgY2FzZSwKLSAgICAgICAgICAgICAgICAgICAgLy8gYnV0IHdlIHNob3VsZCBub3Qgd3JvbmdseSBlYXQgdXAgIkVORDpWQ0FSRCIsIHNpbmNlIGl0IGNyaXRpY2FsbHkKLSAgICAgICAgICAgICAgICAgICAgLy8gYnJlYWtzIHRoaXMgcGFyc2VyJ3Mgc3RhdGUgbWFjaGluZS4KLSAgICAgICAgICAgICAgICAgICAgLy8gVGh1cyB3ZSByb3VnaGx5IGxvb2sgb3ZlciB0aGUgbmV4dCBsaW5lIGFuZCBjb25maXJtIGl0IGlzIGF0IGxlYXN0IG5vdAotICAgICAgICAgICAgICAgICAgICAvLyAiRU5EOlZDQVJEIi4gVGhpcyBleHRyYSBmZWUgaXMgd29ydGggcGF5aW5nLiBUaGlzIGlzIGV4Y2VwdGlvbmFsCi0gICAgICAgICAgICAgICAgICAgIC8vIGFueXdheS4KLSAgICAgICAgICAgICAgICAgICAgaWYgKCFUZXh0VXRpbHMuaXNFbXB0eShuZXh0TGluZSkgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0TGluZS5jaGFyQXQoMCkgPT0gJyAnICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgISJFTkQ6VkNBUkQiLmNvbnRhaW5zKG5leHRMaW5lLnRvVXBwZXJDYXNlKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBnZXRMaW5lKCk7ICAvLyBEcm9wIHRoZSBuZXh0IGxpbmUuCi0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChidWlsZGVyID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWlsZGVyID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWlsZGVyLmFwcGVuZChwcm9wZXJ0eVZhbHVlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKG5leHRMaW5lLnN1YnN0cmluZygxKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoYnVpbGRlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHByb3BlcnR5VmFsdWUgPSBidWlsZGVyLnRvU3RyaW5nKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBmaW5hbCBsb25nIHN0YXJ0ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0gICAgICAgICAgICBBcnJheUxpc3Q8U3RyaW5nPiB2ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0gICAgICAgICAgICB2LmFkZChtYXliZVVuZXNjYXBlVGV4dChwcm9wZXJ0eVZhbHVlKSk7Ci0gICAgICAgICAgICBtSW50ZXJwcmV0ZXIucHJvcGVydHlWYWx1ZXModik7Ci0gICAgICAgICAgICBtVGltZUhhbmRsZU1pc2NQcm9wZXJ0eVZhbHVlICs9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC0gc3RhcnQ7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8cD4KLSAgICAgKiBQYXJzZXMgYW5kIHJldHVybnMgUXVvdGVkLVByaW50YWJsZS4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gZmlyc3RTdHJpbmcgVGhlIHN0cmluZyBmb2xsb3dpbmcgYSBwYXJhbWV0ZXIgbmFtZSBhbmQgYXR0cmlidXRlcy4KLSAgICAgKiAgICAgICAgICAgIEV4YW1wbGU6ICJzdHJpbmciIGluCi0gICAgICogICAgICAgICAgICAiQURSOkVOQ09ESU5HPVFVT1RFRC1QUklOVEFCTEU6c3RyaW5nXG5cciIuCi0gICAgICogQHJldHVybiB3aG9sZSBRdW90ZWQtUHJpbnRhYmxlIHN0cmluZywgaW5jbHVkaW5nIGEgZ2l2ZW4gYXJndW1lbnQgYW5kCi0gICAgICogICAgICAgICBmb2xsb3dpbmcgbGluZXMuIEV4Y2x1ZGVzIHRoZSBsYXN0IGVtcHR5IGxpbmUgZm9sbG93aW5nIHRvIFF1b3RlZAotICAgICAqICAgICAgICAgUHJpbnRhYmxlIGxpbmVzLgotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgKiBAdGhyb3dzIFZDYXJkRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgZ2V0UXVvdGVkUHJpbnRhYmxlKFN0cmluZyBmaXJzdFN0cmluZykgdGhyb3dzIElPRXhjZXB0aW9uLCBWQ2FyZEV4Y2VwdGlvbiB7Ci0gICAgICAgIC8vIFNwZWNpZmljYWxseSwgdGhlcmUgbWF5IGJlIHNvbWUgcGFkZGluZyBiZXR3ZWVuID0gYW5kIENSTEYuCi0gICAgICAgIC8vIFNlZSB0aGUgZm9sbG93aW5nOgotICAgICAgICAvLwotICAgICAgICAvLyBxcC1saW5lIDo9ICoocXAtc2VnbWVudCB0cmFuc3BvcnQtcGFkZGluZyBDUkxGKQotICAgICAgICAvLyBxcC1wYXJ0IHRyYW5zcG9ydC1wYWRkaW5nCi0gICAgICAgIC8vIHFwLXNlZ21lbnQgOj0gcXAtc2VjdGlvbiAqKFNQQUNFIC8gVEFCKSAiPSIKLSAgICAgICAgLy8gOyBNYXhpbXVtIGxlbmd0aCBvZiA3NiBjaGFyYWN0ZXJzCi0gICAgICAgIC8vCi0gICAgICAgIC8vIGUuZy4gKGZyb20gUkZDIDIwNDUpCi0gICAgICAgIC8vIE5vdydzIHRoZSB0aW1lID0KLSAgICAgICAgLy8gZm9yIGFsbCBmb2xrIHRvIGNvbWU9Ci0gICAgICAgIC8vIHRvIHRoZSBhaWQgb2YgdGhlaXIgY291bnRyeS4KLSAgICAgICAgaWYgKGZpcnN0U3RyaW5nLnRyaW0oKS5lbmRzV2l0aCgiPSIpKSB7Ci0gICAgICAgICAgICAvLyByZW1vdmUgInRyYW5zcG9ydC1wYWRkaW5nIgotICAgICAgICAgICAgaW50IHBvcyA9IGZpcnN0U3RyaW5nLmxlbmd0aCgpIC0gMTsKLSAgICAgICAgICAgIHdoaWxlIChmaXJzdFN0cmluZy5jaGFyQXQocG9zKSAhPSAnPScpIHsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIFN0cmluZ0J1aWxkZXIgYnVpbGRlciA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0gICAgICAgICAgICBidWlsZGVyLmFwcGVuZChmaXJzdFN0cmluZy5zdWJzdHJpbmcoMCwgcG9zICsgMSkpOwotICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoIlxyXG4iKTsKLSAgICAgICAgICAgIFN0cmluZyBsaW5lOwotICAgICAgICAgICAgd2hpbGUgKHRydWUpIHsKLSAgICAgICAgICAgICAgICBsaW5lID0gZ2V0TGluZSgpOwotICAgICAgICAgICAgICAgIGlmIChsaW5lID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFZDYXJkRXhjZXB0aW9uKCJGaWxlIGVuZGVkIGR1cmluZyBwYXJzaW5nIGEgUXVvdGVkLVByaW50YWJsZSBTdHJpbmciKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKGxpbmUudHJpbSgpLmVuZHNXaXRoKCI9IikpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gcmVtb3ZlICJ0cmFuc3BvcnQtcGFkZGluZyIKLSAgICAgICAgICAgICAgICAgICAgcG9zID0gbGluZS5sZW5ndGgoKSAtIDE7Ci0gICAgICAgICAgICAgICAgICAgIHdoaWxlIChsaW5lLmNoYXJBdChwb3MpICE9ICc9JykgewotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKGxpbmUuc3Vic3RyaW5nKDAsIHBvcyArIDEpKTsKLSAgICAgICAgICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoIlxyXG4iKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBidWlsZGVyLmFwcGVuZChsaW5lKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGJ1aWxkZXIudG9TdHJpbmcoKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiBmaXJzdFN0cmluZzsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0QmFzZTY0KFN0cmluZyBmaXJzdFN0cmluZykgdGhyb3dzIElPRXhjZXB0aW9uLCBWQ2FyZEV4Y2VwdGlvbiB7Ci0gICAgICAgIFN0cmluZ0J1aWxkZXIgYnVpbGRlciA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0gICAgICAgIGJ1aWxkZXIuYXBwZW5kKGZpcnN0U3RyaW5nKTsKLQotICAgICAgICB3aGlsZSAodHJ1ZSkgewotICAgICAgICAgICAgU3RyaW5nIGxpbmUgPSBnZXRMaW5lKCk7Ci0gICAgICAgICAgICBpZiAobGluZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFZDYXJkRXhjZXB0aW9uKCJGaWxlIGVuZGVkIGR1cmluZyBwYXJzaW5nIEJBU0U2NCBiaW5hcnkiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChsaW5lLmxlbmd0aCgpID09IDApIHsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKGxpbmUpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGJ1aWxkZXIudG9TdHJpbmcoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8cD4KLSAgICAgKiBNYWlubHkgZm9yICJBRFIiLCAiT1JHIiwgYW5kICJOIgotICAgICAqIDwvcD4KLSAgICAgKi8KLSAgICAvKgotICAgICAqIGFkZHJlc3NwYXJ0cyA9IDAqNihzdHJub3NlbWkgIjsiKSBzdHJub3NlbWkgOyBQTyBCb3gsIEV4dGVuZGVkIEFkZHIsCi0gICAgICogU3RyZWV0LCBMb2NhbGl0eSwgUmVnaW9uLCBQb3N0YWwgQ29kZSwgQ291bnRyeSBOYW1lIG9yZ3BhcnRzID0KLSAgICAgKiAqKHN0cm5vc2VtaSAiOyIpIHN0cm5vc2VtaSA7IEZpcnN0IGlzIE9yZ2FuaXphdGlvbiBOYW1lLCByZW1haW5kZXIgYXJlCi0gICAgICogT3JnYW5pemF0aW9uIFVuaXRzLiBuYW1lcGFydHMgPSAwKjQoc3Rybm9zZW1pICI7Iikgc3Rybm9zZW1pIDsgRmFtaWx5LAotICAgICAqIEdpdmVuLCBNaWRkbGUsIFByZWZpeCwgU3VmZml4LiA7IEV4YW1wbGU6UHVibGljO0pvaG47US47UmV2ZXJlbmQgRHIuO0lJSSwKLSAgICAgKiBFc3EuIHN0cm5vc2VtaSA9ICooKm5vbnNlbWkgKCJcOyIgLyAiXCIgQ1JMRikpICpub25zZW1pIDsgVG8gaW5jbHVkZSBhCi0gICAgICogc2VtaWNvbG9uIGluIHRoaXMgc3RyaW5nLCBpdCBtdXN0IGJlIGVzY2FwZWQgOyB3aXRoIGEgIlwiIGNoYXJhY3Rlci4gV2UKLSAgICAgKiBkbyBub3QgY2FyZSB0aGUgbnVtYmVyIG9mICJzdHJub3NlbWkiIGhlcmUuIFdlIGFyZSBub3Qgc3VyZSB3aGV0aGVyIHdlCi0gICAgICogc2hvdWxkIGFkZCAiXCIgQ1JMRiB0byBlYWNoIHZhbHVlLiBXZSBleGNsdWRlIHRoZW0gZm9yIG5vdy4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBoYW5kbGVNdWx0aXBsZVByb3BlcnR5VmFsdWUoU3RyaW5nIHByb3BlcnR5TmFtZSwgU3RyaW5nIHByb3BlcnR5VmFsdWUpCi0gICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFZDYXJkRXhjZXB0aW9uIHsKLSAgICAgICAgLy8gdkNhcmQgMi4xIGRvZXMgbm90IGFsbG93IFFVT1RFRC1QUklOVEFCTEUgaGVyZSwgYnV0IHNvbWUKLSAgICAgICAgLy8gc29mdHdhcmVzL2RldmljZXMKLSAgICAgICAgLy8gZW1pdCBzdWNoIGRhdGEuCi0gICAgICAgIGlmIChtQ3VycmVudEVuY29kaW5nLmVxdWFsc0lnbm9yZUNhc2UoIlFVT1RFRC1QUklOVEFCTEUiKSkgewotICAgICAgICAgICAgcHJvcGVydHlWYWx1ZSA9IGdldFF1b3RlZFByaW50YWJsZShwcm9wZXJ0eVZhbHVlKTsKLSAgICAgICAgfQotCi0gICAgICAgIG1JbnRlcnByZXRlci5wcm9wZXJ0eVZhbHVlcyhWQ2FyZFV0aWxzLmNvbnN0cnVjdExpc3RGcm9tVmFsdWUocHJvcGVydHlWYWx1ZSwKLSAgICAgICAgICAgICAgICBnZXRWZXJzaW9uKCkpKTsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIHZDYXJkIDIuMSBzcGVjaWZpZXMgQUdFTlQgYWxsb3dzIG9uZSB2Y2FyZCBlbnRyeS4gQ3VycmVudGx5IHdlIGVtaXQgYW4KLSAgICAgKiBlcnJvciB0b3dhcmQgdGhlIEFHRU5UIHByb3BlcnR5LgotICAgICAqIC8vIFRPRE86IFN1cHBvcnQgQUdFTlQgcHJvcGVydHkuCi0gICAgICogaXRlbSA9Ci0gICAgICogLi4uIC8gW2dyb3VwcyAiLiJdICJBR0VOVCIgW3BhcmFtc10gIjoiIHZjYXJkIENSTEYgdmNhcmQgPSAiQkVHSU4iIFt3c10KLSAgICAgKiAiOiIgW3dzXSAiVkNBUkQiIFt3c10gMSpDUkxGIGl0ZW1zICpDUkxGICJFTkQiIFt3c10gIjoiIFt3c10gIlZDQVJEIgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGhhbmRsZUFnZW50KGZpbmFsIFN0cmluZyBwcm9wZXJ0eVZhbHVlKSB0aHJvd3MgVkNhcmRFeGNlcHRpb24gewotICAgICAgICBpZiAoIXByb3BlcnR5VmFsdWUudG9VcHBlckNhc2UoKS5jb250YWlucygiQkVHSU46VkNBUkQiKSkgewotICAgICAgICAgICAgLy8gQXBwYXJlbnRseSBpbnZhbGlkIGxpbmUgc2VlbiBpbiBXaW5kb3dzIE1vYmlsZSA2LjUuIElnbm9yZSB0aGVtLgotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdGhyb3cgbmV3IFZDYXJkQWdlbnROb3RTdXBwb3J0ZWRFeGNlcHRpb24oIkFHRU5UIFByb3BlcnR5IGlzIG5vdCBzdXBwb3J0ZWQgbm93LiIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRm9yIHZDYXJkIDMuMC4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIG1heWJlVW5lc2NhcGVUZXh0KGZpbmFsIFN0cmluZyB0ZXh0KSB7Ci0gICAgICAgIHJldHVybiB0ZXh0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdW5lc2NhcGVkIFN0cmluZyBpZiB0aGUgY2hhcmFjdGVyIHNob3VsZCBiZSB1bmVzY2FwZWQuIFJldHVybgotICAgICAqIG51bGwgb3RoZXJ3aXNlLiBlLmcuIEluIHZDYXJkIDIuMSwgIlw7IiBzaG91bGQgYmUgdW5lc2NhcGVkIGludG8gIjsiCi0gICAgICogd2hpbGUgIlx4IiBzaG91bGQgbm90IGJlLgotICAgICAqLwotICAgIHByb3RlY3RlZCBTdHJpbmcgbWF5YmVVbmVzY2FwZUNoYXJhY3RlcihmaW5hbCBjaGFyIGNoKSB7Ci0gICAgICAgIHJldHVybiB1bmVzY2FwZUNoYXJhY3RlcihjaCk7Ci0gICAgfQotCi0gICAgLyogcGFja2FnZSAqLyBzdGF0aWMgU3RyaW5nIHVuZXNjYXBlQ2hhcmFjdGVyKGZpbmFsIGNoYXIgY2gpIHsKLSAgICAgICAgLy8gT3JpZ2luYWwgdkNhcmQgMi4xIHNwZWNpZmljYXRpb24gZG9lcyBub3QgYWxsb3cgdHJhbnNmb3JtYXRpb24KLSAgICAgICAgLy8gIlw6IiAtPiAiOiIsICJcLCIgLT4gIiwiLCBhbmQgIlxcIiAtPiAiXCIsIGJ1dCBwcmV2aW91cwotICAgICAgICAvLyBpbXBsZW1lbnRhdGlvbiBvZgotICAgICAgICAvLyB0aGlzIGNsYXNzIGFsbG93ZWQgdGhlbSwgc28ga2VlcCBpdCBhcyBpcy4KLSAgICAgICAgaWYgKGNoID09ICdcXCcgfHwgY2ggPT0gJzsnIHx8IGNoID09ICc6JyB8fCBjaCA9PSAnLCcpIHsKLSAgICAgICAgICAgIHJldHVybiBTdHJpbmcudmFsdWVPZihjaCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBzaG93UGVyZm9ybWFuY2VJbmZvKCkgewotICAgICAgICBMb2cuZChMT0dfVEFHLCAiVG90YWwgcGFyc2luZyB0aW1lOiAgIiArIG1UaW1lVG90YWwgKyAiIG1zIik7Ci0gICAgICAgIExvZy5kKExPR19UQUcsICJUb3RhbCByZWFkTGluZSB0aW1lOiAiICsgbVJlYWRlci5nZXRUb3RhbG1pbGxpc2Vjb25kKCkgKyAiIG1zIik7Ci0gICAgICAgIExvZy5kKExPR19UQUcsICJUaW1lIGZvciBoYW5kbGluZyB0aGUgYmVnZ2luaW5nIG9mIHRoZSByZWNvcmQ6ICIgKyBtVGltZVJlYWRTdGFydFJlY29yZAotICAgICAgICAgICAgICAgICsgIiBtcyIpOwotICAgICAgICBMb2cuZChMT0dfVEFHLCAiVGltZSBmb3IgaGFuZGxpbmcgdGhlIGVuZCBvZiB0aGUgcmVjb3JkOiAiICsgbVRpbWVSZWFkRW5kUmVjb3JkICsgIiBtcyIpOwotICAgICAgICBMb2cuZChMT0dfVEFHLCAiVGltZSBmb3IgcGFyc2luZyBsaW5lLCBhbmQgaGFuZGxpbmcgZ3JvdXA6ICIgKyBtVGltZVBhcnNlTGluZUFuZEhhbmRsZUdyb3VwCi0gICAgICAgICAgICAgICAgKyAiIG1zIik7Ci0gICAgICAgIExvZy5kKExPR19UQUcsICJUaW1lIGZvciBwYXJzaW5nIEFEUiwgT1JHLCBhbmQgTiBmaWVsZHM6IiArIG1UaW1lUGFyc2VBZHJPcmdOICsgIiBtcyIpOwotICAgICAgICBMb2cuZChMT0dfVEFHLCAiVGltZSBmb3IgcGFyc2luZyBwcm9wZXJ0eSB2YWx1ZXM6ICIgKyBtVGltZVBhcnNlUHJvcGVydHlWYWx1ZXMgKyAiIG1zIik7Ci0gICAgICAgIExvZy5kKExPR19UQUcsICJUaW1lIGZvciBoYW5kbGluZyBub3JtYWwgcHJvcGVydHkgdmFsdWVzOiAiICsgbVRpbWVIYW5kbGVNaXNjUHJvcGVydHlWYWx1ZQotICAgICAgICAgICAgICAgICsgIiBtcyIpOwotICAgICAgICBMb2cuZChMT0dfVEFHLCAiVGltZSBmb3IgaGFuZGxpbmcgUXVvdGVkLVByaW50YWJsZTogIiArIG1UaW1lSGFuZGxlUXVvdGVkUHJpbnRhYmxlICsgIiBtcyIpOwotICAgICAgICBMb2cuZChMT0dfVEFHLCAiVGltZSBmb3IgaGFuZGxpbmcgQmFzZTY0OiAiICsgbVRpbWVIYW5kbGVCYXNlNjQgKyAiIG1zIik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHJldHVybiB7QGxpbmsgVkNhcmRDb25maWcjVkVSU0lPTl8yMX0KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgaW50IGdldFZlcnNpb24oKSB7Ci0gICAgICAgIHJldHVybiBWQ2FyZENvbmZpZy5WRVJTSU9OXzIxOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEByZXR1cm4ge0BsaW5rIFZDYXJkQ29uZmlnI1ZFUlNJT05fMzB9Ci0gICAgICovCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRWZXJzaW9uU3RyaW5nKCkgewotICAgICAgICByZXR1cm4gVkNhcmRDb25zdGFudHMuVkVSU0lPTl9WMjE7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIFNldDxTdHJpbmc+IGdldEtub3duUHJvcGVydHlOYW1lU2V0KCkgewotICAgICAgICByZXR1cm4gVkNhcmRQYXJzZXJfVjIxLnNLbm93blByb3BlcnR5TmFtZVNldDsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgU2V0PFN0cmluZz4gZ2V0S25vd25UeXBlU2V0KCkgewotICAgICAgICByZXR1cm4gVkNhcmRQYXJzZXJfVjIxLnNLbm93blR5cGVTZXQ7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIFNldDxTdHJpbmc+IGdldEtub3duVmFsdWVTZXQoKSB7Ci0gICAgICAgIHJldHVybiBWQ2FyZFBhcnNlcl9WMjEuc0tub3duVmFsdWVTZXQ7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIFNldDxTdHJpbmc+IGdldEF2YWlsYWJsZUVuY29kaW5nU2V0KCkgewotICAgICAgICByZXR1cm4gVkNhcmRQYXJzZXJfVjIxLnNBdmFpbGFibGVFbmNvZGluZzsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldERlZmF1bHRFbmNvZGluZygpIHsKLSAgICAgICAgcmV0dXJuIERFRkFVTFRfRU5DT0RJTkc7Ci0gICAgfQotCi0KLSAgICBwdWJsaWMgdm9pZCBwYXJzZShJbnB1dFN0cmVhbSBpcywgVkNhcmRJbnRlcnByZXRlciBpbnRlcnByZXRlcikKLSAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgVkNhcmRFeGNlcHRpb24gewotICAgICAgICBpZiAoaXMgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCJJbnB1dFN0cmVhbSBtdXN0IG5vdCBiZSBudWxsLiIpOwotICAgICAgICB9Ci0KLSAgICAgICAgZmluYWwgSW5wdXRTdHJlYW1SZWFkZXIgdG1wUmVhZGVyID0gbmV3IElucHV0U3RyZWFtUmVhZGVyKGlzLCBtSW50ZXJtZWRpYXRlQ2hhcnNldCk7Ci0gICAgICAgIG1SZWFkZXIgPSBuZXcgQ3VzdG9tQnVmZmVyZWRSZWFkZXIodG1wUmVhZGVyKTsKLQotICAgICAgICBtSW50ZXJwcmV0ZXIgPSAoaW50ZXJwcmV0ZXIgIT0gbnVsbCA/IGludGVycHJldGVyIDogbmV3IEVtcHR5SW50ZXJwcmV0ZXIoKSk7Ci0KLSAgICAgICAgZmluYWwgbG9uZyBzdGFydCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotICAgICAgICBpZiAobUludGVycHJldGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1JbnRlcnByZXRlci5zdGFydCgpOwotICAgICAgICB9Ci0gICAgICAgIHBhcnNlVkNhcmRGaWxlKCk7Ci0gICAgICAgIGlmIChtSW50ZXJwcmV0ZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgbUludGVycHJldGVyLmVuZCgpOwotICAgICAgICB9Ci0gICAgICAgIG1UaW1lVG90YWwgKz0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLSBzdGFydDsKLQotICAgICAgICBpZiAoVkNhcmRDb25maWcuc2hvd1BlcmZvcm1hbmNlTG9nKCkpIHsKLSAgICAgICAgICAgIHNob3dQZXJmb3JtYW5jZUluZm8oKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBmaW5hbCB2b2lkIGNhbmNlbCgpIHsKLSAgICAgICAgbUNhbmNlbGVkID0gdHJ1ZTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9waW0vdmNhcmQvVkNhcmRQYXJzZXJJbXBsX1YzMC5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvcGltL3ZjYXJkL1ZDYXJkUGFyc2VySW1wbF9WMzAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2ZhZDlhMC4uMDAwMDAwMAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9waW0vdmNhcmQvVkNhcmRQYXJzZXJJbXBsX1YzMC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzg4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBhbmRyb2lkLnBpbS52Y2FyZDsKLQotaW1wb3J0IGFuZHJvaWQucGltLnZjYXJkLmV4Y2VwdGlvbi5WQ2FyZEV4Y2VwdGlvbjsKLWltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi0vKioKLSAqIDxwPgotICogQmFzaWMgaW1wbGVtZW50YXRpb24gYWNoaWV2aW5nIHZDYXJkIDMuMCBwYXJzaW5nLgotICogPC9wPgotICogPHA+Ci0gKiBUaGlzIGNsYXNzIGluaGVyaXRzIHZDYXJkIDIuMSBpbXBsZW1lbnRhdGlvbiBzaW5jZSB0ZWNobmljYWxseSB0aGV5IGFyZSBzaW1pbGFyLAotICogd2hpbGUgc3BlY2lmaWNhbGx5IHRoZXJlJ3MgbG9naWNhbCBubyByZWxldmFuY2UgYmV0d2VlbiB0aGVtLgotICogU28gdGhhdCBkZXZlbG9wZXJzIGFyZSBub3QgY29uZnVzZWQgd2l0aCB0aGUgaW5oZXJpdGFuY2UsCi0gKiB7QGxpbmsgVkNhcmRQYXJzZXJfVjMwfSBkb2VzIG5vdCBpbmhlcml0IHtAbGluayBWQ2FyZFBhcnNlcl9WMjF9LCB3aGlsZQotICoge0BsaW5rIFZDYXJkUGFyc2VySW1wbF9WMzB9IGluaGVyaXRzIHtAbGluayBWQ2FyZFBhcnNlckltcGxfVjIxfS4KLSAqIDwvcD4KLSAqIEBoaWRlCi0gKi8KLS8qIHBhY2thZ2UgKi8gY2xhc3MgVkNhcmRQYXJzZXJJbXBsX1YzMCBleHRlbmRzIFZDYXJkUGFyc2VySW1wbF9WMjEgewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMT0dfVEFHID0gIlZDYXJkUGFyc2VySW1wbF9WMzAiOwotCi0gICAgcHJpdmF0ZSBTdHJpbmcgbVByZXZpb3VzTGluZTsKLSAgICBwcml2YXRlIGJvb2xlYW4gbUVtaXR0ZWRBZ2VudFdhcm5pbmcgPSBmYWxzZTsKLQotICAgIHB1YmxpYyBWQ2FyZFBhcnNlckltcGxfVjMwKCkgewotICAgICAgICBzdXBlcigpOwotICAgIH0KLQotICAgIHB1YmxpYyBWQ2FyZFBhcnNlckltcGxfVjMwKGludCB2Y2FyZFR5cGUpIHsKLSAgICAgICAgc3VwZXIodmNhcmRUeXBlKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgaW50IGdldFZlcnNpb24oKSB7Ci0gICAgICAgIHJldHVybiBWQ2FyZENvbmZpZy5WRVJTSU9OXzMwOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0VmVyc2lvblN0cmluZygpIHsKLSAgICAgICAgcmV0dXJuIFZDYXJkQ29uc3RhbnRzLlZFUlNJT05fVjMwOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0TGluZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChtUHJldmlvdXNMaW5lICE9IG51bGwpIHsKLSAgICAgICAgICAgIFN0cmluZyByZXQgPSBtUHJldmlvdXNMaW5lOwotICAgICAgICAgICAgbVByZXZpb3VzTGluZSA9IG51bGw7Ci0gICAgICAgICAgICByZXR1cm4gcmV0OwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIG1SZWFkZXIucmVhZExpbmUoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIHZDYXJkIDMuMCByZXF1aXJlcyB0aGF0IHRoZSBsaW5lIHdpdGggc3BhY2UgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgbGluZQotICAgICAqIG11c3QgYmUgY29tYmluZWQgd2l0aCBwcmV2aW91cyBsaW5lLgotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0Tm9uRW1wdHlMaW5lKCkgdGhyb3dzIElPRXhjZXB0aW9uLCBWQ2FyZEV4Y2VwdGlvbiB7Ci0gICAgICAgIFN0cmluZyBsaW5lOwotICAgICAgICBTdHJpbmdCdWlsZGVyIGJ1aWxkZXIgPSBudWxsOwotICAgICAgICB3aGlsZSAodHJ1ZSkgewotICAgICAgICAgICAgbGluZSA9IG1SZWFkZXIucmVhZExpbmUoKTsKLSAgICAgICAgICAgIGlmIChsaW5lID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBpZiAoYnVpbGRlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBidWlsZGVyLnRvU3RyaW5nKCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChtUHJldmlvdXNMaW5lICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHJldCA9IG1QcmV2aW91c0xpbmU7Ci0gICAgICAgICAgICAgICAgICAgIG1QcmV2aW91c0xpbmUgPSBudWxsOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVkNhcmRFeGNlcHRpb24oIlJlYWNoZWQgZW5kIG9mIGJ1ZmZlci4iKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAobGluZS5sZW5ndGgoKSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGJ1aWxkZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gYnVpbGRlci50b1N0cmluZygpOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobVByZXZpb3VzTGluZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyByZXQgPSBtUHJldmlvdXNMaW5lOwotICAgICAgICAgICAgICAgICAgICBtUHJldmlvdXNMaW5lID0gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGxpbmUuY2hhckF0KDApID09ICcgJyB8fCBsaW5lLmNoYXJBdCgwKSA9PSAnXHQnKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGJ1aWxkZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAvLyBTZWUgU2VjdGlvbiA1LjguMSBvZiBSRkMgMjQyNSAoTUlNRS1ESVIgZG9jdW1lbnQpLgotICAgICAgICAgICAgICAgICAgICAvLyBGb2xsb3dpbmcgaXMgdGhlIGV4Y2VycHRzIGZyb20gaXQuCi0gICAgICAgICAgICAgICAgICAgIC8vCi0gICAgICAgICAgICAgICAgICAgIC8vIERFU0NSSVBUSU9OOlRoaXMgaXMgYSBsb25nIGRlc2NyaXB0aW9uIHRoYXQgZXhpc3RzIG9uIGEgbG9uZyBsaW5lLgotICAgICAgICAgICAgICAgICAgICAvLwotICAgICAgICAgICAgICAgICAgICAvLyBDYW4gYmUgcmVwcmVzZW50ZWQgYXM6Ci0gICAgICAgICAgICAgICAgICAgIC8vCi0gICAgICAgICAgICAgICAgICAgIC8vIERFU0NSSVBUSU9OOlRoaXMgaXMgYSBsb25nIGRlc2NyaXB0aW9uCi0gICAgICAgICAgICAgICAgICAgIC8vICB0aGF0IGV4aXN0cyBvbiBhIGxvbmcgbGluZS4KLSAgICAgICAgICAgICAgICAgICAgLy8KLSAgICAgICAgICAgICAgICAgICAgLy8gSXQgY291bGQgYWxzbyBiZSByZXByZXNlbnRlZCBhczoKLSAgICAgICAgICAgICAgICAgICAgLy8KLSAgICAgICAgICAgICAgICAgICAgLy8gREVTQ1JJUFRJT046VGhpcyBpcyBhIGxvbmcgZGVzY3JpcAotICAgICAgICAgICAgICAgICAgICAvLyAgdGlvbiB0aGF0IGV4aXN0cyBvCi0gICAgICAgICAgICAgICAgICAgIC8vICBuIGEgbG9uZyBsaW5lLgotICAgICAgICAgICAgICAgICAgICBidWlsZGVyLmFwcGVuZChsaW5lLnN1YnN0cmluZygxKSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChtUHJldmlvdXNMaW5lICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgYnVpbGRlciA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0gICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKG1QcmV2aW91c0xpbmUpOwotICAgICAgICAgICAgICAgICAgICBtUHJldmlvdXNMaW5lID0gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQobGluZS5zdWJzdHJpbmcoMSkpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBWQ2FyZEV4Y2VwdGlvbigiU3BhY2UgZXhpc3RzIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIGxpbmUiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGlmIChtUHJldmlvdXNMaW5lID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgbVByZXZpb3VzTGluZSA9IGxpbmU7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChidWlsZGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBidWlsZGVyLnRvU3RyaW5nKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcmV0ID0gbVByZXZpb3VzTGluZTsKLSAgICAgICAgICAgICAgICAgICAgbVByZXZpb3VzTGluZSA9IGxpbmU7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXQ7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiB2Y2FyZCA9IFtncm91cCAiLiJdICJCRUdJTiIgIjoiICJWQ0FSRCIgMSAqIENSTEYKLSAgICAgKiAgICAgICAgIDEgKiAoY29udGVudGxpbmUpCi0gICAgICogICAgICAgICA7QSB2Q2FyZCBvYmplY3QgTVVTVCBpbmNsdWRlIHRoZSBWRVJTSU9OLCBGTiBhbmQgTiB0eXBlcy4KLSAgICAgKiAgICAgICAgIFtncm91cCAiLiJdICJFTkQiICI6IiAiVkNBUkQiIDEgKiBDUkxGCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gcmVhZEJlZ2luVkNhcmQoYm9vbGVhbiBhbGxvd0dhcmJhZ2UpIHRocm93cyBJT0V4Y2VwdGlvbiwgVkNhcmRFeGNlcHRpb24gewotICAgICAgICAvLyBUT0RPOiB2Q2FyZCAzLjAgc3VwcG9ydHMgZ3JvdXAuCi0gICAgICAgIHJldHVybiBzdXBlci5yZWFkQmVnaW5WQ2FyZChhbGxvd0dhcmJhZ2UpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIHJlYWRFbmRWQ2FyZChib29sZWFuIHVzZUNhY2hlLCBib29sZWFuIGFsbG93R2FyYmFnZSkKLSAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgVkNhcmRFeGNlcHRpb24gewotICAgICAgICAvLyBUT0RPOiB2Q2FyZCAzLjAgc3VwcG9ydHMgZ3JvdXAuCi0gICAgICAgIHN1cGVyLnJlYWRFbmRWQ2FyZCh1c2VDYWNoZSwgYWxsb3dHYXJiYWdlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiB2Q2FyZCAzLjAgYWxsb3dzIGlhbmEtdG9rZW4gYXMgcGFyYW1UeXBlLCB3aGlsZSB2Q2FyZCAyLjEgZG9lcyBub3QuCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgaGFuZGxlUGFyYW1zKGZpbmFsIFN0cmluZyBwYXJhbXMpIHRocm93cyBWQ2FyZEV4Y2VwdGlvbiB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBzdXBlci5oYW5kbGVQYXJhbXMocGFyYW1zKTsKLSAgICAgICAgfSBjYXRjaCAoVkNhcmRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgLy8gbWF5YmUgSUFOQSB0eXBlCi0gICAgICAgICAgICBTdHJpbmdbXSBzdHJBcnJheSA9IHBhcmFtcy5zcGxpdCgiPSIsIDIpOwotICAgICAgICAgICAgaWYgKHN0ckFycmF5Lmxlbmd0aCA9PSAyKSB7Ci0gICAgICAgICAgICAgICAgaGFuZGxlQW55UGFyYW0oc3RyQXJyYXlbMF0sIHN0ckFycmF5WzFdKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgLy8gTXVzdCBub3QgY29tZSBoZXJlIGluIHRoZSBjdXJyZW50IGltcGxlbWVudGF0aW9uLgotICAgICAgICAgICAgICAgIHRocm93IG5ldyBWQ2FyZEV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICAgICJVbmtub3duIHBhcmFtcyB2YWx1ZTogIiArIHBhcmFtcyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCBoYW5kbGVBbnlQYXJhbShmaW5hbCBTdHJpbmcgcGFyYW1OYW1lLCBmaW5hbCBTdHJpbmcgcGFyYW1WYWx1ZSkgewotICAgICAgICBtSW50ZXJwcmV0ZXIucHJvcGVydHlQYXJhbVR5cGUocGFyYW1OYW1lKTsKLSAgICAgICAgc3BsaXRBbmRQdXRQYXJhbVZhbHVlKHBhcmFtVmFsdWUpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIGhhbmRsZVBhcmFtV2l0aG91dE5hbWUoZmluYWwgU3RyaW5nIHBhcmFtVmFsdWUpIHsKLSAgICAgICAgaGFuZGxlVHlwZShwYXJhbVZhbHVlKTsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqICB2Q2FyZCAzLjAgZGVmaW5lcwotICAgICAqCi0gICAgICogIHBhcmFtICAgICAgICAgPSBwYXJhbS1uYW1lICI9IiBwYXJhbS12YWx1ZSAqKCIsIiBwYXJhbS12YWx1ZSkKLSAgICAgKiAgcGFyYW0tbmFtZSAgICA9IGlhbmEtdG9rZW4gLyB4LW5hbWUKLSAgICAgKiAgcGFyYW0tdmFsdWUgICA9IHB0ZXh0IC8gcXVvdGVkLXN0cmluZwotICAgICAqICBxdW90ZWQtc3RyaW5nID0gRFFVT1RFIFFTQUZFLUNIQVIgRFFVT1RFCi0gICAgICogIFFTQUZFLUNIQVIgICAgPSBXU1AgLyAleDIxIC8gJXgyMy03RSAvIE5PTi1BU0NJSQotICAgICAqICAgICAgICAgICAgICAgIDsgQW55IGNoYXJhY3RlciBleGNlcHQgQ1RMcywgRFFVT1RFCi0gICAgICoKLSAgICAgKiAgUVNBRkUtQ0hBUiBtdXN0IG5vdCBjb250YWluIERRVU9URSwgaW5jbHVkaW5nIGVzY2FwZWQgb25lIChcIikuCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgaGFuZGxlVHlwZShmaW5hbCBTdHJpbmcgcGFyYW1WYWx1ZSkgewotICAgICAgICBtSW50ZXJwcmV0ZXIucHJvcGVydHlQYXJhbVR5cGUoIlRZUEUiKTsKLSAgICAgICAgc3BsaXRBbmRQdXRQYXJhbVZhbHVlKHBhcmFtVmFsdWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNwbGl0cyBwYXJhbWV0ZXIgdmFsdWVzIGludG8gcGllY2VzIGluIGFjY29yZGFuY2Ugd2l0aCB2Q2FyZCAzLjAgc3BlY2lmaWNhdGlvbiBhbmQKLSAgICAgKiBwdXRzIHBpZWNlcyBpbnRvIG1JbnRlcnByZXRlci4KLSAgICAgKi8KLSAgICAvKgotICAgICAqICBwYXJhbS12YWx1ZSAgID0gcHRleHQgLyBxdW90ZWQtc3RyaW5nCi0gICAgICogIHF1b3RlZC1zdHJpbmcgPSBEUVVPVEUgUVNBRkUtQ0hBUiBEUVVPVEUKLSAgICAgKiAgUVNBRkUtQ0hBUiAgICA9IFdTUCAvICV4MjEgLyAleDIzLTdFIC8gTk9OLUFTQ0lJCi0gICAgICogICAgICAgICAgICAgICAgOyBBbnkgY2hhcmFjdGVyIGV4Y2VwdCBDVExzLCBEUVVPVEUKLSAgICAgKgotICAgICAqICBRU0FGRS1DSEFSIG11c3Qgbm90IGNvbnRhaW4gRFFVT1RFLCBpbmNsdWRpbmcgZXNjYXBlZCBvbmUgKFwiKQotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBzcGxpdEFuZFB1dFBhcmFtVmFsdWUoU3RyaW5nIHBhcmFtVmFsdWUpIHsKLSAgICAgICAgLy8gImNvbW1hLHNlcGFyYXRlZDppbnNpZGUuZHF1b3RlIixwcmVmCi0gICAgICAgIC8vICAgLS0+Ci0gICAgICAgIC8vIC0gY29tbWEsc2VwYXJhdGVkOmluc2lkZS5kcXVvdGUKLSAgICAgICAgLy8gLSBwcmVmCi0gICAgICAgIC8vCi0gICAgICAgIC8vIE5vdGU6IFRob3VnaCB0aGVyZSdzIGEgY29kZSwgd2UgZG9uJ3QgbmVlZCB0byB0YWtlIG11Y2ggY2FyZSBvZgotICAgICAgICAvLyB3cm9uZ2x5LWFkZGVkIHF1b3RlcyBsaWtlIHRoZSBleGFtcGxlIGFib3ZlLCBhcyB0aGV5IGluZHVjZQotICAgICAgICAvLyBwYXJzZSBlcnJvcnMgYXQgdGhlIHRvcCBsZXZlbCAod2hlbiBzcGxpdHRpbmcgYSBsaW5lIGludG8gcGFydHMpLgotICAgICAgICBTdHJpbmdCdWlsZGVyIGJ1aWxkZXIgPSBudWxsOyAgLy8gRGVsYXkgaW5pdGlhbGl6YXRpb24uCi0gICAgICAgIGJvb2xlYW4gaW5zaWRlRHF1b3RlID0gZmFsc2U7Ci0gICAgICAgIGZpbmFsIGludCBsZW5ndGggPSBwYXJhbVZhbHVlLmxlbmd0aCgpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBmaW5hbCBjaGFyIGNoID0gcGFyYW1WYWx1ZS5jaGFyQXQoaSk7Ci0gICAgICAgICAgICBpZiAoY2ggPT0gJyInKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGluc2lkZURxdW90ZSkgewotICAgICAgICAgICAgICAgICAgICAvLyBFbmQgb2YgRHF1b3RlLgotICAgICAgICAgICAgICAgICAgICBtSW50ZXJwcmV0ZXIucHJvcGVydHlQYXJhbVZhbHVlKGJ1aWxkZXIudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIgPSBudWxsOwotICAgICAgICAgICAgICAgICAgICBpbnNpZGVEcXVvdGUgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBpZiAoYnVpbGRlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoYnVpbGRlci5sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBlLmcuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcHJlZiJxdW90ZWQiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9nLncoTE9HX1RBRywgIlVuZXhwZWN0ZWQgRHF1b3RlIGluc2lkZSBwcm9wZXJ0eS4iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZS5nLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHByZWYsInF1b3RlZCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAicXVvdGVkIixwcmVmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbUludGVycHJldGVyLnByb3BlcnR5UGFyYW1WYWx1ZShidWlsZGVyLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGluc2lkZURxdW90ZSA9IHRydWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIGlmIChjaCA9PSAnLCcgJiYgIWluc2lkZURxdW90ZSkgewotICAgICAgICAgICAgICAgIGlmIChidWlsZGVyID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgTG9nLncoTE9HX1RBRywgIkNvbW1hIGlzIHVzZWQgYmVmb3JlIGFjdHVhbCBzdHJpbmcgY29tZXMuICgiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbVZhbHVlICsgIikiKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBtSW50ZXJwcmV0ZXIucHJvcGVydHlQYXJhbVZhbHVlKGJ1aWxkZXIudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIgPSBudWxsOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgLy8gVG8gc3RvcCBjcmVhdGluZyBlbXB0eSBTdHJpbmdCdWZmZXIgYXQgdGhlIGVuZCBvZiBwYXJhbWV0ZXIsCi0gICAgICAgICAgICAgICAgLy8gd2UgZGVsYXkgY3JlYXRpbmcgdGhpcyBvYmplY3QgdW50aWwgdGhpcyBwb2ludC4KLSAgICAgICAgICAgICAgICBpZiAoYnVpbGRlciA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBidWlsZGVyLmFwcGVuZChjaCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGluc2lkZURxdW90ZSkgewotICAgICAgICAgICAgLy8gZS5nLgotICAgICAgICAgICAgLy8gIm5vbi1xdW90ZS1hdC1lbmQKLSAgICAgICAgICAgIExvZy5kKExPR19UQUcsICJEYW5nbGluZyBEcXVvdGUuIik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGJ1aWxkZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKGJ1aWxkZXIubGVuZ3RoKCkgPT0gMCkgewotICAgICAgICAgICAgICAgIExvZy53KExPR19UQUcsICJVbmludGVuZGVkIGJlaGF2aW9yLiBXZSBtdXN0IG5vdCBzZWUgZW1wdHkgU3RyaW5nQnVpbGRlciAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICJhdCB0aGUgZW5kIG9mIHBhcmFtZXRlciB2YWx1ZSBwYXJzaW5nLiIpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBtSW50ZXJwcmV0ZXIucHJvcGVydHlQYXJhbVZhbHVlKGJ1aWxkZXIudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCBoYW5kbGVBZ2VudChmaW5hbCBTdHJpbmcgcHJvcGVydHlWYWx1ZSkgewotICAgICAgICAvLyBUaGUgd2F5IGhvdyB2Q2FyZCAzLjAgc3VwcG9ydHMgIkFHRU5UIiBpcyBjb21wbGV0ZWx5IGRpZmZlcmVudCBmcm9tIHZDYXJkIDIuMS4KLSAgICAgICAgLy8KLSAgICAgICAgLy8gZS5nLgotICAgICAgICAvLyBBR0VOVDpCRUdJTjpWQ0FSRFxuRk46Sm9lIEZyaWRheVxuVEVMOisxLTkxOS01NTUtNzg3OFxuCi0gICAgICAgIC8vICBUSVRMRTpBcmVhIEFkbWluaXN0cmF0b3JcLCBBc3Npc3RhbnRcbiBFTUFJTFw7VFlQRT1JTlRFUk5cbgotICAgICAgICAvLyAgRVQ6amZyaWRheUBob3N0LmNvbVxuRU5EOlZDQVJEXG4KLSAgICAgICAgLy8KLSAgICAgICAgLy8gVE9ETzogZml4IHRoaXMuCi0gICAgICAgIC8vCi0gICAgICAgIC8vIGlzc3VlOgotICAgICAgICAvLyAgdkNhcmQgMy4wIGFsc28gYWxsb3dzIHRoaXMgYXMgYW4gZXhhbXBsZS4KLSAgICAgICAgLy8KLSAgICAgICAgLy8gQUdFTlQ7VkFMVUU9dXJpOgotICAgICAgICAvLyAgQ0lEOkpRUFVCTElDLnBhcnQzLjk2MDEyOVQwODMwMjAueHl6TWFpbEBob3N0My5jb20KLSAgICAgICAgLy8KLSAgICAgICAgLy8gVGhpcyBpcyBub3QgdkNhcmQuIFNob3VsZCB3ZSBzdXBwb3J0IHRoaXM/Ci0gICAgICAgIC8vCi0gICAgICAgIC8vIEp1c3QgaWdub3JlIHRoZSBsaW5lIGZvciBub3csIHNpbmNlIHdlIGNhbm5vdCBrbm93IGhvdyB0byBoYW5kbGUgaXQuLi4KLSAgICAgICAgaWYgKCFtRW1pdHRlZEFnZW50V2FybmluZykgewotICAgICAgICAgICAgTG9nLncoTE9HX1RBRywgIkFHRU5UIGluIHZDYXJkIDMuMCBpcyBub3Qgc3VwcG9ydGVkIHlldC4gSWdub3JlIGl0Iik7Ci0gICAgICAgICAgICBtRW1pdHRlZEFnZW50V2FybmluZyA9IHRydWU7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiB2Q2FyZCAzLjAgZG9lcyBub3QgcmVxdWlyZSB0d28gQ1JMRiBhdCB0aGUgbGFzdCBvZiBCQVNFNjQgZGF0YS4KLSAgICAgKiBJdCBvbmx5IHJlcXVpcmVzIHRoYXQgZGF0YSBzaG91bGQgYmUgTUlNRS1lbmNvZGVkLgotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0QmFzZTY0KGZpbmFsIFN0cmluZyBmaXJzdFN0cmluZykKLSAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgVkNhcmRFeGNlcHRpb24gewotICAgICAgICBmaW5hbCBTdHJpbmdCdWlsZGVyIGJ1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotICAgICAgICBidWlsZGVyLmFwcGVuZChmaXJzdFN0cmluZyk7Ci0KLSAgICAgICAgd2hpbGUgKHRydWUpIHsKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyBsaW5lID0gZ2V0TGluZSgpOwotICAgICAgICAgICAgaWYgKGxpbmUgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBWQ2FyZEV4Y2VwdGlvbigiRmlsZSBlbmRlZCBkdXJpbmcgcGFyc2luZyBCQVNFNjQgYmluYXJ5Iik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAobGluZS5sZW5ndGgoKSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKCFsaW5lLnN0YXJ0c1dpdGgoIiAiKSAmJiAhbGluZS5zdGFydHNXaXRoKCJcdCIpKSB7Ci0gICAgICAgICAgICAgICAgbVByZXZpb3VzTGluZSA9IGxpbmU7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBidWlsZGVyLmFwcGVuZChsaW5lKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBidWlsZGVyLnRvU3RyaW5nKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRVNDQVBFRC1DSEFSID0gIlxcIiAvICJcOyIgLyAiXCwiIC8gIlxuIiAvICJcTiIpCi0gICAgICogICAgICAgICAgICAgIDsgXFwgZW5jb2RlcyBcLCBcbiBvciBcTiBlbmNvZGVzIG5ld2xpbmUKLSAgICAgKiAgICAgICAgICAgICAgOyBcOyBlbmNvZGVzIDssIFwsIGVuY29kZXMgLAotICAgICAqCi0gICAgICogTm90ZTogQXBwbGUgZXNjYXBlcyAnOicgaW50byAnXDonIHdoaWxlIGRvZXMgbm90IGVzY2FwZSAnXCcKLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgU3RyaW5nIG1heWJlVW5lc2NhcGVUZXh0KGZpbmFsIFN0cmluZyB0ZXh0KSB7Ci0gICAgICAgIHJldHVybiB1bmVzY2FwZVRleHQodGV4dCk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgdW5lc2NhcGVUZXh0KGZpbmFsIFN0cmluZyB0ZXh0KSB7Ci0gICAgICAgIFN0cmluZ0J1aWxkZXIgYnVpbGRlciA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0gICAgICAgIGZpbmFsIGludCBsZW5ndGggPSB0ZXh0Lmxlbmd0aCgpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBjaGFyIGNoID0gdGV4dC5jaGFyQXQoaSk7Ci0gICAgICAgICAgICBpZiAoY2ggPT0gJ1xcJyAmJiBpIDwgbGVuZ3RoIC0gMSkgewotICAgICAgICAgICAgICAgIGZpbmFsIGNoYXIgbmV4dF9jaCA9IHRleHQuY2hhckF0KCsraSk7Ci0gICAgICAgICAgICAgICAgaWYgKG5leHRfY2ggPT0gJ24nIHx8IG5leHRfY2ggPT0gJ04nKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKCJcbiIpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKG5leHRfY2gpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoY2gpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBidWlsZGVyLnRvU3RyaW5nKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIFN0cmluZyBtYXliZVVuZXNjYXBlQ2hhcmFjdGVyKGZpbmFsIGNoYXIgY2gpIHsKLSAgICAgICAgcmV0dXJuIHVuZXNjYXBlQ2hhcmFjdGVyKGNoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyB1bmVzY2FwZUNoYXJhY3RlcihmaW5hbCBjaGFyIGNoKSB7Ci0gICAgICAgIGlmIChjaCA9PSAnbicgfHwgY2ggPT0gJ04nKSB7Ci0gICAgICAgICAgICByZXR1cm4gIlxuIjsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiBTdHJpbmcudmFsdWVPZihjaCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgU2V0PFN0cmluZz4gZ2V0S25vd25Qcm9wZXJ0eU5hbWVTZXQoKSB7Ci0gICAgICAgIHJldHVybiBWQ2FyZFBhcnNlcl9WMzAuc0tub3duUHJvcGVydHlOYW1lU2V0OwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3BpbS92Y2FyZC9WQ2FyZFBhcnNlckltcGxfVjQwLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9waW0vdmNhcmQvVkNhcmRQYXJzZXJJbXBsX1Y0MC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZmU3NmJiLi4wMDAwMDAwCi0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3BpbS92Y2FyZC9WQ2FyZFBhcnNlckltcGxfVjQwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2UgYW5kcm9pZC5waW0udmNhcmQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi0KLS8qKgotICogPHA+Ci0gKiBCYXNpYyBpbXBsZW1lbnRhdGlvbiBwYXJzaW5nIHZDYXJkIDQuMC4KLSAqIDwvcD4KLSAqIDxwPgotICogdkNhcmQgNC4wIGlzIG5vdCBwdWJsaXNoZWQgeWV0LiBBbHNvIHRoaXMgaW1wbGVtZW50YXRpb24gaXMgcHJlbWF0dXJlLiAKLSAqIDwvcD4KLSAqIEBoaWRlCi0gKi8KLS8qIHBhY2thZ2UgKi8gY2xhc3MgVkNhcmRQYXJzZXJJbXBsX1Y0MCBleHRlbmRzIFZDYXJkUGFyc2VySW1wbF9WMzAgewotICAgIC8vIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMT0dfVEFHID0gIlZDYXJkUGFyc2VySW1wbF9WNDAiOwotCi0gICAgcHVibGljIFZDYXJkUGFyc2VySW1wbF9WNDAoKSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgfQotCi0gICAgcHVibGljIFZDYXJkUGFyc2VySW1wbF9WNDAoZmluYWwgaW50IHZjYXJkVHlwZSkgewotICAgICAgICBzdXBlcih2Y2FyZFR5cGUpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBpbnQgZ2V0VmVyc2lvbigpIHsKLSAgICAgICAgcmV0dXJuIFZDYXJkQ29uZmlnLlZFUlNJT05fNDA7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRWZXJzaW9uU3RyaW5nKCkgewotICAgICAgICByZXR1cm4gVkNhcmRDb25zdGFudHMuVkVSU0lPTl9WNDA7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogV2UgZXNjYXBlICJcTiIgaW50byBuZXcgbGluZSBmb3Igc2FmZXR5LgotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBTdHJpbmcgbWF5YmVVbmVzY2FwZVRleHQoZmluYWwgU3RyaW5nIHRleHQpIHsKLSAgICAgICAgcmV0dXJuIHVuZXNjYXBlVGV4dCh0ZXh0KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyB1bmVzY2FwZVRleHQoZmluYWwgU3RyaW5nIHRleHQpIHsKLSAgICAgICAgLy8gVE9ETzogbW9yZSBzdHJpY3RseSwgdkNhcmQgNC4wIHJlcXVpcmVzIGRpZmZlcmVudCB0eXBlIG9mIHVuZXNjYXBpbmcgcnVsZQotICAgICAgICAvLyAgICAgICB0b3dhcmQgZWFjaCBwcm9wZXJ0eS4KLSAgICAgICAgZmluYWwgU3RyaW5nQnVpbGRlciBidWlsZGVyID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLSAgICAgICAgZmluYWwgaW50IGxlbmd0aCA9IHRleHQubGVuZ3RoKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIGNoYXIgY2ggPSB0ZXh0LmNoYXJBdChpKTsKLSAgICAgICAgICAgIGlmIChjaCA9PSAnXFwnICYmIGkgPCBsZW5ndGggLSAxKSB7Ci0gICAgICAgICAgICAgICAgZmluYWwgY2hhciBuZXh0X2NoID0gdGV4dC5jaGFyQXQoKytpKTsKLSAgICAgICAgICAgICAgICBpZiAobmV4dF9jaCA9PSAnbicgfHwgbmV4dF9jaCA9PSAnTicpIHsKLSAgICAgICAgICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoIlxuIik7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQobmV4dF9jaCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBidWlsZGVyLmFwcGVuZChjaCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGJ1aWxkZXIudG9TdHJpbmcoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyB1bmVzY2FwZUNoYXJhY3RlcihmaW5hbCBjaGFyIGNoKSB7Ci0gICAgICAgIGlmIChjaCA9PSAnbicgfHwgY2ggPT0gJ04nKSB7Ci0gICAgICAgICAgICByZXR1cm4gIlxuIjsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiBTdHJpbmcudmFsdWVPZihjaCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgU2V0PFN0cmluZz4gZ2V0S25vd25Qcm9wZXJ0eU5hbWVTZXQoKSB7Ci0gICAgICAgIHJldHVybiBWQ2FyZFBhcnNlcl9WNDAuc0tub3duUHJvcGVydHlOYW1lU2V0OwotICAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9waW0vdmNhcmQvVkNhcmRQYXJzZXJfVjIxLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9waW0vdmNhcmQvVkNhcmRQYXJzZXJfVjIxLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwN2ExNzYuLjAwMDAwMDAKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvcGltL3ZjYXJkL1ZDYXJkUGFyc2VyX1YyMS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBhbmRyb2lkLnBpbS52Y2FyZDsKLQotaW1wb3J0IGFuZHJvaWQucGltLnZjYXJkLmV4Y2VwdGlvbi5WQ2FyZEV4Y2VwdGlvbjsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi0vKioKLSAqIDwvcD4KLSAqIHZDYXJkIHBhcnNlciBmb3IgdkNhcmQgMi4xLiBTZWUgdGhlIHNwZWNpZmljYXRpb24gZm9yIG1vcmUgZGV0YWlsIGFib3V0IHRoZSBzcGVjIGl0c2VsZi4KLSAqIDwvcD4KLSAqIDxwPgotICogVGhlIHNwZWMgaXMgd3JpdHRlbiBpbiAxOTk2LCBhbmQgY3VycmVudGx5IHZhcmlvdXMgdHlwZXMgb2YgInZDYXJkIDIuMSIgZXhpc3QuCi0gKiBUbyBoYW5kbGUgcmVhbCB0aGUgd29ybGQgdkNhcmQgZm9ybWF0cyBhcHByb3ByaWF0ZWx5IGFuZCBlZmZlY3RpdmVseSwgdGhpcyBjbGFzcyBkb2VzIG5vdAotICogb2JleSB3aXRoIHN0cmljdCB2Q2FyZCAyLjEuCi0gKiBJbiBzdGVhZCwgbm90IG9ubHkgdkNhcmQgc3BlYyBidXQgYWxzbyByZWFsIHdvcmxkIHZDYXJkIGlzIGNvbnNpZGVyZWQuCi0gKiA8L3A+Ci0gKiBlLmcuIEEgbG90IG9mIGRldmljZXMgYW5kIHNvZnR3YXJlcyBsZXQgdkNhcmQgaW1wb3J0ZXIvZXhwb3J0ZXIgdG8gdXNlCi0gKiB0aGUgUE5HIGZvcm1hdCB0byBkZXRlcm1pbmUgdGhlIHR5cGUgb2YgaW1hZ2UsIHdoaWxlIGl0IGlzIG5vdCBhbGxvd2VkIGluCi0gKiB0aGUgb3JpZ2luYWwgc3BlY2lmaWNhdGlvbi4gQXMgb2YgMjAxMCwgd2UgY2FuIHNlZSBldmVuIHRoZSBGTFYgZm9ybWF0Ci0gKiAocG9zc2libGUgaW4gSmFwYW5lc2UgbW9iaWxlIHBob25lcykuCi0gKiA8L3A+Ci0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBWQ2FyZFBhcnNlcl9WMjEgaW1wbGVtZW50cyBWQ2FyZFBhcnNlciB7Ci0gICAgLyoqCi0gICAgICogQSB1bm1vZGlmaWFibGUgU2V0IHN0b3JpbmcgdGhlIHByb3BlcnR5IG5hbWVzIGF2YWlsYWJsZSBpbiB0aGUgdkNhcmQgMi4xIHNwZWNpZmljYXRpb24uCi0gICAgICovCi0gICAgLyogcGFja2FnZSAqLyBzdGF0aWMgZmluYWwgU2V0PFN0cmluZz4gc0tub3duUHJvcGVydHlOYW1lU2V0ID0KLSAgICAgICAgICAgIENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZVNldChuZXcgSGFzaFNldDxTdHJpbmc+KAotICAgICAgICAgICAgICAgICAgICBBcnJheXMuYXNMaXN0KCJCRUdJTiIsICJMT0dPIiwgIlBIT1RPIiwgIkxBQkVMIiwgIkZOIiwgIlRJVExFIiwgIlNPVU5EIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVkVSU0lPTiIsICJURUwiLCAiRU1BSUwiLCAiVFoiLCAiR0VPIiwgIk5PVEUiLCAiVVJMIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQkRBWSIsICJST0xFIiwgIlJFViIsICJVSUQiLCAiS0VZIiwgIk1BSUxFUiIpKSk7Ci0KLSAgICAvKioKLSAgICAgKiBBIHVubW9kaWZpYWJsZSBTZXQgc3RvcmluZyB0aGUgdHlwZXMga25vd24gaW4gdkNhcmQgMi4xLgotICAgICAqLwotICAgIC8qIHBhY2thZ2UgKi8gc3RhdGljIGZpbmFsIFNldDxTdHJpbmc+IHNLbm93blR5cGVTZXQgPQotICAgICAgICAgICAgQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlU2V0KG5ldyBIYXNoU2V0PFN0cmluZz4oCi0gICAgICAgICAgICAgICAgICAgIEFycmF5cy5hc0xpc3QoIkRPTSIsICJJTlRMIiwgIlBPU1RBTCIsICJQQVJDRUwiLCAiSE9NRSIsICJXT1JLIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUFJFRiIsICJWT0lDRSIsICJGQVgiLCAiTVNHIiwgIkNFTEwiLCAiUEFHRVIiLCAiQkJTIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTU9ERU0iLCAiQ0FSIiwgIklTRE4iLCAiVklERU8iLCAiQU9MIiwgIkFQUExFTElOSyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFUVE1BSUwiLCAiQ0lTIiwgIkVXT1JMRCIsICJJTlRFUk5FVCIsICJJQk1NQUlMIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTUNJTUFJTCIsICJQT1dFUlNIQVJFIiwgIlBST0RJR1kiLCAiVExYIiwgIlg0MDAiLCAiR0lGIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ0dNIiwgIldNRiIsICJCTVAiLCAiTUVUIiwgIlBNQiIsICJESUIiLCAiUElDVCIsICJUSUZGIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUERGIiwgIlBTIiwgIkpQRUciLCAiUVRJTUUiLCAiTVBFRyIsICJNUEVHMiIsICJBVkkiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJXQVZFIiwgIkFJRkYiLCAiUENNIiwgIlg1MDkiLCAiUEdQIikpKTsKLQotICAgIC8qKgotICAgICAqIEEgdW5tb2RpZmlhYmxlIFNldCBzdG9yaW5nIHRoZSB2YWx1ZXMgZm9yIHRoZSB0eXBlICJWQUxVRSIsIGF2YWlsYWJsZSBpbiB0aGUgdkNhcmQgMi4xLgotICAgICAqLwotICAgIC8qIHBhY2thZ2UgKi8gc3RhdGljIGZpbmFsIFNldDxTdHJpbmc+IHNLbm93blZhbHVlU2V0ID0KLSAgICAgICAgICAgIENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZVNldChuZXcgSGFzaFNldDxTdHJpbmc+KAotICAgICAgICAgICAgICAgICAgICBBcnJheXMuYXNMaXN0KCJJTkxJTkUiLCAiVVJMIiwgIkNPTlRFTlQtSUQiLCAiQ0lEIikpKTsKLQotICAgIC8qKgotICAgICAqIDxwPgotICAgICAqIEEgdW5tb2RpZmlhYmxlIFNldCBzdG9yaW5nIHRoZSB2YWx1ZXMgZm9yIHRoZSB0eXBlICJFTkNPRElORyIsIGF2YWlsYWJsZSBpbiB0aGUgdkNhcmQgMi4xLgotICAgICAqIDwvcD4KLSAgICAgKiA8cD4KLSAgICAgKiBUaG91Z2ggdkNhcmQgMi4xIHNwZWNpZmljYXRpb24gZG9lcyBub3QgYWxsb3cgIkIiIGVuY29kaW5nLCBzb21lIGRhdGEgbWF5IGhhdmUgaXQuCi0gICAgICogV2UgYWxsb3cgaXQgZm9yIHNhZmV0eS4KLSAgICAgKiA8L3A+Ci0gICAgICovCi0gICAgLyogcGFja2FnZSAqLyBzdGF0aWMgZmluYWwgU2V0PFN0cmluZz4gc0F2YWlsYWJsZUVuY29kaW5nID0KLSAgICAgICAgQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlU2V0KG5ldyBIYXNoU2V0PFN0cmluZz4oCi0gICAgICAgICAgICAgICAgQXJyYXlzLmFzTGlzdChWQ2FyZENvbnN0YW50cy5QQVJBTV9FTkNPRElOR183QklULAotICAgICAgICAgICAgICAgICAgICAgICAgVkNhcmRDb25zdGFudHMuUEFSQU1fRU5DT0RJTkdfOEJJVCwKLSAgICAgICAgICAgICAgICAgICAgICAgIFZDYXJkQ29uc3RhbnRzLlBBUkFNX0VOQ09ESU5HX1FQLAotICAgICAgICAgICAgICAgICAgICAgICAgVkNhcmRDb25zdGFudHMuUEFSQU1fRU5DT0RJTkdfQkFTRTY0LAotICAgICAgICAgICAgICAgICAgICAgICAgVkNhcmRDb25zdGFudHMuUEFSQU1fRU5DT0RJTkdfQikpKTsKLQotICAgIHByaXZhdGUgZmluYWwgVkNhcmRQYXJzZXJJbXBsX1YyMSBtVkNhcmRQYXJzZXJJbXBsOwotCi0gICAgcHVibGljIFZDYXJkUGFyc2VyX1YyMSgpIHsKLSAgICAgICAgbVZDYXJkUGFyc2VySW1wbCA9IG5ldyBWQ2FyZFBhcnNlckltcGxfVjIxKCk7Ci0gICAgfQotCi0gICAgcHVibGljIFZDYXJkUGFyc2VyX1YyMShpbnQgdmNhcmRUeXBlKSB7Ci0gICAgICAgIG1WQ2FyZFBhcnNlckltcGwgPSBuZXcgVkNhcmRQYXJzZXJJbXBsX1YyMSh2Y2FyZFR5cGUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHBhcnNlKElucHV0U3RyZWFtIGlzLCBWQ2FyZEludGVycHJldGVyIGludGVyZXByZXRlcikKLSAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgVkNhcmRFeGNlcHRpb24gewotICAgICAgICBtVkNhcmRQYXJzZXJJbXBsLnBhcnNlKGlzLCBpbnRlcmVwcmV0ZXIpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGNhbmNlbCgpIHsKLSAgICAgICAgbVZDYXJkUGFyc2VySW1wbC5jYW5jZWwoKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9waW0vdmNhcmQvVkNhcmRQYXJzZXJfVjMwLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9waW0vdmNhcmQvVkNhcmRQYXJzZXJfVjMwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIzOGQzYTguLjAwMDAwMDAKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvcGltL3ZjYXJkL1ZDYXJkUGFyc2VyX1YzMC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIGFuZHJvaWQucGltLnZjYXJkOwotCi1pbXBvcnQgYW5kcm9pZC5waW0udmNhcmQuZXhjZXB0aW9uLlZDYXJkRXhjZXB0aW9uOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLS8qKgotICogPHA+Ci0gKiB2Q2FyZCBwYXJzZXIgZm9yIHZDYXJkIDMuMC4gU2VlIFJGQyAyNDI2IGZvciBtb3JlIGRldGFpbC4KLSAqIDwvcD4KLSAqIDxwPgotICogVGhpcyBwYXJzZXIgYWxsb3dzIHZDYXJkIGZvcm1hdCB3aGljaCBpcyBub3QgYWxsb3dlZCBpbiB0aGUgUkZDLCBzaW5jZQotICogd2UgaGF2ZSBzZWVuIHNldmVyYWwgdkNhcmQgMy4wIGZpbGVzIHdoaWNoIGRvbid0IGNvbXBseSB3aXRoIGl0LgotICogPC9wPgotICogPHA+Ci0gKiBlLmcuIHZDYXJkIDMuMCBkb2VzIG5vdCBhbGxvdyAiQ0hBUlNFVCIgYXR0cmlidXRlLCBidXQgc29tZSBhY3R1YWwgZmlsZXMKLSAqIGhhdmUgaXQgYW5kIHRoZXkgdXNlcyBub24gVVRGLTggY2hhcnNldHMuIFVURi04IGlzIHJlY29tbWVuZGVkIGluIFJGQyAyNDI2LAotICogYnV0IGl0IGlzIG5vdCBhIG11c3QuIFdlIHNpbGVudGx5IGFsbG93ICJDSEFSU0VUIi4KLSAqIDwvcD4KLSAqLwotcHVibGljIGNsYXNzIFZDYXJkUGFyc2VyX1YzMCBpbXBsZW1lbnRzIFZDYXJkUGFyc2VyIHsKLSAgICAvKiBwYWNrYWdlICovIHN0YXRpYyBmaW5hbCBTZXQ8U3RyaW5nPiBzS25vd25Qcm9wZXJ0eU5hbWVTZXQgPQotICAgICAgICAgICAgQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlU2V0KG5ldyBIYXNoU2V0PFN0cmluZz4oQXJyYXlzLmFzTGlzdCgKLSAgICAgICAgICAgICAgICAgICAgIkJFR0lOIiwgIkxPR08iLCAiUEhPVE8iLCAiTEFCRUwiLCAiRk4iLCAiVElUTEUiLCAiU09VTkQiLCAKLSAgICAgICAgICAgICAgICAgICAgIlZFUlNJT04iLCAiVEVMIiwgIkVNQUlMIiwgIlRaIiwgIkdFTyIsICJOT1RFIiwgIlVSTCIsCi0gICAgICAgICAgICAgICAgICAgICJCREFZIiwgIlJPTEUiLCAiUkVWIiwgIlVJRCIsICJLRVkiLCAiTUFJTEVSIiwgLy8gMi4xCi0gICAgICAgICAgICAgICAgICAgICJOQU1FIiwgIlBST0ZJTEUiLCAiU09VUkNFIiwgIk5JQ0tOQU1FIiwgIkNMQVNTIiwKLSAgICAgICAgICAgICAgICAgICAgIlNPUlQtU1RSSU5HIiwgIkNBVEVHT1JJRVMiLCAiUFJPRElEIikpKTsgLy8gMy4wCi0KLSAgICAvKioKLSAgICAgKiA8cD4KLSAgICAgKiBBIHVubW9kaWZpYWJsZSBTZXQgc3RvcmluZyB0aGUgdmFsdWVzIGZvciB0aGUgdHlwZSAiRU5DT0RJTkciLCBhdmFpbGFibGUgaW4gdGhlIHZDYXJkIDMuMC4KLSAgICAgKiA8L3A+Ci0gICAgICogPHA+Ci0gICAgICogVGhvdWdoIHZDYXJkIDIuMSBzcGVjaWZpY2F0aW9uIGRvZXMgbm90IGFsbG93ICI3QklUIiBvciAiQkFTRTY0Iiwgd2UgYWxsb3cgdGhlbSBmb3Igc2FmZXR5LgotICAgICAqIDwvcD4KLSAgICAgKiA8cD4KLSAgICAgKiAiUVVPVEVELVBSSU5UQUJMRSIgaXMgbm90IGFsbG93ZWQgaW4gdkNhcmQgMy4wIGFuZCBub3QgaW4gdGhpcyBwYXJzZXIgZWl0aGVyLAotICAgICAqIGJlY2F1c2UgdGhlIGVuY29kaW5nIGFtYmlndWF0ZXMgaG93IHRoZSB2Q2FyZCBmaWxlIHRvIGJlIHBhcnNlZC4KLSAgICAgKiA8L3A+Ci0gICAgICovCi0gICAgLyogcGFja2FnZSAqLyBzdGF0aWMgZmluYWwgU2V0PFN0cmluZz4gc0FjY2VwdGFibGVFbmNvZGluZyA9Ci0gICAgICAgICAgICBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVTZXQobmV3IEhhc2hTZXQ8U3RyaW5nPihBcnJheXMuYXNMaXN0KAotICAgICAgICAgICAgICAgICAgICBWQ2FyZENvbnN0YW50cy5QQVJBTV9FTkNPRElOR183QklULAotICAgICAgICAgICAgICAgICAgICBWQ2FyZENvbnN0YW50cy5QQVJBTV9FTkNPRElOR184QklULAotICAgICAgICAgICAgICAgICAgICBWQ2FyZENvbnN0YW50cy5QQVJBTV9FTkNPRElOR19CQVNFNjQsCi0gICAgICAgICAgICAgICAgICAgIFZDYXJkQ29uc3RhbnRzLlBBUkFNX0VOQ09ESU5HX0IpKSk7Ci0KLSAgICBwcml2YXRlIGZpbmFsIFZDYXJkUGFyc2VySW1wbF9WMzAgbVZDYXJkUGFyc2VySW1wbDsKLQotICAgIHB1YmxpYyBWQ2FyZFBhcnNlcl9WMzAoKSB7Ci0gICAgICAgIG1WQ2FyZFBhcnNlckltcGwgPSBuZXcgVkNhcmRQYXJzZXJJbXBsX1YzMCgpOwotICAgIH0KLQotICAgIHB1YmxpYyBWQ2FyZFBhcnNlcl9WMzAoaW50IHZjYXJkVHlwZSkgewotICAgICAgICBtVkNhcmRQYXJzZXJJbXBsID0gbmV3IFZDYXJkUGFyc2VySW1wbF9WMzAodmNhcmRUeXBlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBwYXJzZShJbnB1dFN0cmVhbSBpcywgVkNhcmRJbnRlcnByZXRlciBpbnRlcmVwcmV0ZXIpCi0gICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFZDYXJkRXhjZXB0aW9uIHsKLSAgICAgICAgbVZDYXJkUGFyc2VySW1wbC5wYXJzZShpcywgaW50ZXJlcHJldGVyKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBjYW5jZWwoKSB7Ci0gICAgICAgIG1WQ2FyZFBhcnNlckltcGwuY2FuY2VsKCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvcGltL3ZjYXJkL1ZDYXJkUGFyc2VyX1Y0MC5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvcGltL3ZjYXJkL1ZDYXJkUGFyc2VyX1Y0MC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NWEyZjY4Li4wMDAwMDAwCi0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3BpbS92Y2FyZC9WQ2FyZFBhcnNlcl9WNDAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBhbmRyb2lkLnBpbS52Y2FyZDsKLQotaW1wb3J0IGFuZHJvaWQucGltLnZjYXJkLmV4Y2VwdGlvbi5WQ2FyZEV4Y2VwdGlvbjsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi0vKioKLSAqIDxwPgotICogdkNhcmQgcGFyc2VyIGZvciB2Q2FyZCA0LjAuCi0gKiA8L3A+Ci0gKiA8cD4KLSAqIEN1cnJlbnRseSB0aGlzIHBhcnNlciBpcyBiYXNlZCBvbiB2Q2FyZCA0LjAgc3BlY2lmaWNhdGlvbiByZXYgMTEuCi0gKiA8L3A+Ci0gKi8KLXB1YmxpYyBjbGFzcyBWQ2FyZFBhcnNlcl9WNDAgaW1wbGVtZW50cyBWQ2FyZFBhcnNlciB7Ci0gICAgLyogcGFja2FnZSAqLyBzdGF0aWMgZmluYWwgU2V0PFN0cmluZz4gc0tub3duUHJvcGVydHlOYW1lU2V0ID0KLSAgICAgICAgICAgIENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZVNldChuZXcgSGFzaFNldDxTdHJpbmc+KEFycmF5cy5hc0xpc3QoCi0gICAgICAgICAgICAgICAgICAgICJCRUdJTiIsICJFTkQiLCAiU09VUkNFIiwgIk5BTUUiLCAiS0lORCIsICJYTUwiLAotICAgICAgICAgICAgICAgICAgICAiRk4iLCAiTiIsICJOSUNLTkFNRSIsICJQSE9UTyIsICJCREFZIiwgIkREQVkiLAotICAgICAgICAgICAgICAgICAgICAiQklSVEgiLCAiREVBVEgiLCAiQU5OSVZFUlNBUlkiLCAiU0VYIiwgIkFEUiIsCi0gICAgICAgICAgICAgICAgICAgICJMQUJFTCIsICJURUwiLCAiRU1BSUwiLCAiSU1QUCIsICJMQU5HIiwgIlRaIiwKLSAgICAgICAgICAgICAgICAgICAgIkdFTyIsICJUSVRMRSIsICJST0xFIiwgIkxPR08iLCAiT1JHIiwgIk1FTUJFUiIsCi0gICAgICAgICAgICAgICAgICAgICJSRUxBVEVEIiwgIkNBVEVHT1JJRVMiLCAiTk9URSIsICJQUk9ESUQiLAotICAgICAgICAgICAgICAgICAgICAiUkVWIiwgIlNPVU5EIiwgIlVJRCIsICJDTElFTlRQSURNQVAiLAotICAgICAgICAgICAgICAgICAgICAiVVJMIiwgIlZFUlNJT04iLCAiQ0xBU1MiLCAiS0VZIiwgIkZCVVJMIiwgIkNBTEVORFJVUkkiLAotICAgICAgICAgICAgICAgICAgICAiQ0FMVVJJIikpKTsKLQotICAgIC8qKgotICAgICAqIDxwPgotICAgICAqIEEgdW5tb2RpZmlhYmxlIFNldCBzdG9yaW5nIHRoZSB2YWx1ZXMgZm9yIHRoZSB0eXBlICJFTkNPRElORyIsIGF2YWlsYWJsZSBpbiB2Q2FyZCA0LjAuCi0gICAgICogPC9wPgotICAgICAqLwotICAgIC8qIHBhY2thZ2UgKi8gc3RhdGljIGZpbmFsIFNldDxTdHJpbmc+IHNBY2NlcHRhYmxlRW5jb2RpbmcgPQotICAgICAgICAgICAgQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlU2V0KG5ldyBIYXNoU2V0PFN0cmluZz4oQXJyYXlzLmFzTGlzdCgKLSAgICAgICAgICAgICAgICAgICAgVkNhcmRDb25zdGFudHMuUEFSQU1fRU5DT0RJTkdfOEJJVCwKLSAgICAgICAgICAgICAgICAgICAgVkNhcmRDb25zdGFudHMuUEFSQU1fRU5DT0RJTkdfQikpKTsKLQotICAgIHByaXZhdGUgZmluYWwgVkNhcmRQYXJzZXJJbXBsX1YzMCBtVkNhcmRQYXJzZXJJbXBsOwotCi0gICAgcHVibGljIFZDYXJkUGFyc2VyX1Y0MCgpIHsKLSAgICAgICAgbVZDYXJkUGFyc2VySW1wbCA9IG5ldyBWQ2FyZFBhcnNlckltcGxfVjQwKCk7Ci0gICAgfQotCi0gICAgcHVibGljIFZDYXJkUGFyc2VyX1Y0MChpbnQgdmNhcmRUeXBlKSB7Ci0gICAgICAgIG1WQ2FyZFBhcnNlckltcGwgPSBuZXcgVkNhcmRQYXJzZXJJbXBsX1Y0MCh2Y2FyZFR5cGUpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHBhcnNlKElucHV0U3RyZWFtIGlzLCBWQ2FyZEludGVycHJldGVyIGludGVyZXByZXRlcikKLSAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgVkNhcmRFeGNlcHRpb24gewotICAgICAgICBtVkNhcmRQYXJzZXJJbXBsLnBhcnNlKGlzLCBpbnRlcmVwcmV0ZXIpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGNhbmNlbCgpIHsKLSAgICAgICAgbVZDYXJkUGFyc2VySW1wbC5jYW5jZWwoKTsKLSAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvcGltL3ZjYXJkL1ZDYXJkU291cmNlRGV0ZWN0b3IuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3BpbS92Y2FyZC9WQ2FyZFNvdXJjZURldGVjdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRjNjQ2MWUuLjAwMDAwMDAKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvcGltL3ZjYXJkL1ZDYXJkU291cmNlRGV0ZWN0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwNSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2UgYW5kcm9pZC5waW0udmNhcmQ7Ci0KLWltcG9ydCBhbmRyb2lkLnRleHQuVGV4dFV0aWxzOwotaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLS8qKgotICogPHA+Ci0gKiBUaGUgY2xhc3Mgd2hpY2ggdHJpZXMgdG8gZGV0ZWN0cyB0aGUgc291cmNlIG9mIGEgdkNhcmQgZmlsZSBmcm9tIGl0cyBjb250ZW50cy4KLSAqIDwvcD4KLSAqIDxwPgotICogVGhlIHNwZWNpZmljYXRpb24gb2YgdkNhcmQgKGluY2x1ZGluZyBib3RoIDIuMSBhbmQgMy4wKSBpcyBub3Qgc28gc3RyaWN0IGFzIHRvCi0gKiBndWVzcyBpdHMgZm9ybWF0IGp1c3QgYnkgcmVhZGluZyBiZWdpbm5pbmcgZmV3IGxpbmVzICh1c3VhbGx5IHdlIGNhbiwgYnV0IGluCi0gKiBzb21lIG1vc3QgcGVzc2ltaXN0aWMgY2FzZSwgd2UgY2Fubm90IHVudGlsIGF0IGFsbW9zdCB0aGUgZW5kIG9mIHRoZSBmaWxlKS4KLSAqIEFsc28gd2UgY2Fubm90IHN0b3JlIGFsbCB2Q2FyZCBlbnRyaWVzIGluIG1lbW9yeSwgd2hpbGUgdGhlcmUncyBubyBzcGVjaWZpY2F0aW9uCi0gKiBob3cgYmlnIHRoZSB2Q2FyZCBlbnRyeSB3b3VsZCBiZWNvbWUgYWZ0ZXIgdGhlIHBhcnNlLgotICogPC9wPgotICogPHA+Ci0gKiBUaGlzIGNsYXNzIGlzIHVzdWFsbHkgdXNlZCBmb3IgdGhlICJmaXJzdCBzY2FuIiwgaW4gd2hpY2ggd2UgY2FuIHVuZGVyc3RhbmQgd2hpY2ggdkNhcmQKLSAqIHZlcnNpb24gaXMgdXNlZCAoYW5kIGhvdyBtYW55IGVudHJpZXMgZXhpc3QgaW4gYSBmaWxlKS4KLSAqIDwvcD4KLSAqLwotcHVibGljIGNsYXNzIFZDYXJkU291cmNlRGV0ZWN0b3IgaW1wbGVtZW50cyBWQ2FyZEludGVycHJldGVyIHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTE9HX1RBRyA9ICJWQ2FyZFNvdXJjZURldGVjdG9yIjsKLQotICAgIHByaXZhdGUgc3RhdGljIFNldDxTdHJpbmc+IEFQUExFX1NJR05TID0gbmV3IEhhc2hTZXQ8U3RyaW5nPihBcnJheXMuYXNMaXN0KAotICAgICAgICAgICAgIlgtUEhPTkVUSUMtRklSU1QtTkFNRSIsICJYLVBIT05FVElDLU1JRERMRS1OQU1FIiwgIlgtUEhPTkVUSUMtTEFTVC1OQU1FIiwKLSAgICAgICAgICAgICJYLUFCQURSIiwgIlgtQUJVSUQiKSk7Ci0gICAgCi0gICAgcHJpdmF0ZSBzdGF0aWMgU2V0PFN0cmluZz4gSkFQQU5FU0VfTU9CSUxFX1BIT05FX1NJR05TID0gbmV3IEhhc2hTZXQ8U3RyaW5nPihBcnJheXMuYXNMaXN0KAotICAgICAgICAgICAgIlgtR05PIiwgIlgtR04iLCAiWC1SRURVQ1RJT04iKSk7Ci0gICAgCi0gICAgcHJpdmF0ZSBzdGF0aWMgU2V0PFN0cmluZz4gV0lORE9XU19NT0JJTEVfUEhPTkVfU0lHTlMgPSBuZXcgSGFzaFNldDxTdHJpbmc+KEFycmF5cy5hc0xpc3QoCi0gICAgICAgICAgICAiWC1NSUNST1NPRlQtQVNTVF9URUwiLCAiWC1NSUNST1NPRlQtQVNTSVNUQU5UIiwgIlgtTUlDUk9TT0ZULU9GRklDRUxPQyIpKTsKLSAgICAKLSAgICAvLyBOb3RlOiB0aGVzZSBzaWduZXMgYXBwZWFycyBiZWZvcmUgdGhlIHNpZ25zIG9mIHRoZSBvdGhlciB0eXBlIChlLmcuICJYLUdOIikuCi0gICAgLy8gSW4gb3RoZXIgd29yZHMsIEphcGFuZXNlIEZPTUEgbW9iaWxlIHBob25lcyBhcmUgZGV0ZWN0ZWQgYXMgRk9NQSwgbm90IEpBUEFORVNFX01PQklMRV9QSE9ORVMuCi0gICAgcHJpdmF0ZSBzdGF0aWMgU2V0PFN0cmluZz4gRk9NQV9TSUdOUyA9IG5ldyBIYXNoU2V0PFN0cmluZz4oQXJyYXlzLmFzTGlzdCgKLSAgICAgICAgICAgICJYLVNELVZFUk4iLCAiWC1TRC1GT1JNQVRfVkVSIiwgIlgtU0QtQ0FURUdPUklFUyIsICJYLVNELUNMQVNTIiwgIlgtU0QtRENSRUFURUQiLAotICAgICAgICAgICAgIlgtU0QtREVTQ1JJUFRJT04iKSk7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIFRZUEVfRk9NQV9DSEFSU0VUX1NJR04gPSAiWC1TRC1DSEFSX0NPREUiOwotCi0gICAgLyoqCi0gICAgICogUmVwcmVzZW50cyB0aGF0IG5vIGVzdGltYXRpb24gaXMgYXZhaWxhYmxlLiBVc2VycyBvZiB0aGlzIGNsYXNzIGlzIGFibGUgdG8gdGhpcwotICAgICAqIGNvbnN0YW50IHdoZW4geW91IGRvbid0IHdhbnQgdG8gbGV0IGEgdkNhcmQgcGFyc2VyIHJlbHkgb24gZXN0aW1hdGlvbiBmb3IgcGFyc2UgdHlwZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQQVJTRV9UWVBFX1VOS05PV04gPSAwOwotCi0gICAgLy8gRm9yIEFwcGxlJ3Mgc29mdHdhcmUsIHdoaWNoIGRvZXMgbm90IG1lYW4gdGhpcyB0eXBlIGlzIGVmZmVjdGl2ZSBmb3IgYWxsIGl0cyBwcm9kdWN0cy4KLSAgICAvLyBXZSBjb25maXJtZWQgdGhleSB1c3VhbGx5IHVzZSBVVEYtOCwgYnV0IG5vdCBzdXJlIGFib3V0IHZDYXJkIHR5cGUuCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFBBUlNFX1RZUEVfQVBQTEUgPSAxOwotICAgIC8vIEZvciBKYXBhbmVzZSBtb2JpbGUgcGhvbmVzLCB3aGljaCBhcmUgdXN1YWxseSB1c2luZyBTaGlmdF9KSVMgYXMgYSBjaGFyc2V0LgotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBQQVJTRV9UWVBFX01PQklMRV9QSE9ORV9KUCA9IDI7Ci0gICAgLy8gRm9yIHNvbWUgb2YgbW9iaWxlIHBob25lcyByZWxlYXNlZCBmcm9tIERvQ29Nbywgd2hpY2ggdXNlIG5lc3RlZCB2Q2FyZC4gCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFBBUlNFX1RZUEVfRE9DT01PX1RPUkVMQVRFX05FU1QgPSAzOwotICAgIC8vIEZvciBKYXBhbmVzZSBXaW5kb3dzIE1vYmVsIHBob25lcy4gSXQncyB2ZXJzaW9uIGlzIHN1cHBvc2VkIHRvIGJlIDYuNS4KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUEFSU0VfVFlQRV9XSU5ET1dTX01PQklMRV9WNjVfSlAgPSA0OwotCi0gICAgcHJpdmF0ZSBpbnQgbVBhcnNlVHlwZSA9IDA7ICAvLyBOb3Qgc3VyZS4KLQotICAgIHByaXZhdGUgYm9vbGVhbiBtTmVlZFRvUGFyc2VWZXJzaW9uID0gZmFsc2U7Ci0gICAgcHJpdmF0ZSBpbnQgbVZlcnNpb24gPSAtMTsgIC8vIC0xID09IHVua25vd24KLQotICAgIC8vIFNvbWUgbW9iaWxlIHBob25lcyAobGlrZSBGT01BKSB0ZWxscyB1cyB0aGUgY2hhcnNldCBvZiB0aGUgZGF0YS4KLSAgICBwcml2YXRlIGJvb2xlYW4gbU5lZWRUb1BhcnNlQ2hhcnNldDsKLSAgICBwcml2YXRlIFN0cmluZyBtU3BlY2lmaWVkQ2hhcnNldDsKLSAgICAKLSAgICBwdWJsaWMgdm9pZCBzdGFydCgpIHsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgZW5kKCkgewotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHN0YXJ0RW50cnkoKSB7Ci0gICAgfSAgICAKLQotICAgIHB1YmxpYyB2b2lkIHN0YXJ0UHJvcGVydHkoKSB7Ci0gICAgICAgIG1OZWVkVG9QYXJzZUNoYXJzZXQgPSBmYWxzZTsKLSAgICAgICAgbU5lZWRUb1BhcnNlVmVyc2lvbiA9IGZhbHNlOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBlbmRQcm9wZXJ0eSgpIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBlbmRFbnRyeSgpIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBwcm9wZXJ0eUdyb3VwKFN0cmluZyBncm91cCkgewotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBwcm9wZXJ0eU5hbWUoU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgaWYgKG5hbWUuZXF1YWxzSWdub3JlQ2FzZShWQ2FyZENvbnN0YW50cy5QUk9QRVJUWV9WRVJTSU9OKSkgewotICAgICAgICAgICAgbU5lZWRUb1BhcnNlVmVyc2lvbiA9IHRydWU7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0gZWxzZSBpZiAobmFtZS5lcXVhbHNJZ25vcmVDYXNlKFRZUEVfRk9NQV9DSEFSU0VUX1NJR04pKSB7Ci0gICAgICAgICAgICBtUGFyc2VUeXBlID0gUEFSU0VfVFlQRV9ET0NPTU9fVE9SRUxBVEVfTkVTVDsKLSAgICAgICAgICAgIC8vIFByb2JhYmx5IFNoaWZ0X0pJUyBpcyB1c2VkLCBidXQgd2Ugc2hvdWxkIGRvdWJsZSBjb25maXJtLgotICAgICAgICAgICAgbU5lZWRUb1BhcnNlQ2hhcnNldCA9IHRydWU7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG1QYXJzZVR5cGUgIT0gUEFSU0VfVFlQRV9VTktOT1dOKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKFdJTkRPV1NfTU9CSUxFX1BIT05FX1NJR05TLmNvbnRhaW5zKG5hbWUpKSB7Ci0gICAgICAgICAgICBtUGFyc2VUeXBlID0gUEFSU0VfVFlQRV9XSU5ET1dTX01PQklMRV9WNjVfSlA7Ci0gICAgICAgIH0gZWxzZSBpZiAoRk9NQV9TSUdOUy5jb250YWlucyhuYW1lKSkgewotICAgICAgICAgICAgbVBhcnNlVHlwZSA9IFBBUlNFX1RZUEVfRE9DT01PX1RPUkVMQVRFX05FU1Q7Ci0gICAgICAgIH0gZWxzZSBpZiAoSkFQQU5FU0VfTU9CSUxFX1BIT05FX1NJR05TLmNvbnRhaW5zKG5hbWUpKSB7Ci0gICAgICAgICAgICBtUGFyc2VUeXBlID0gUEFSU0VfVFlQRV9NT0JJTEVfUEhPTkVfSlA7Ci0gICAgICAgIH0gZWxzZSBpZiAoQVBQTEVfU0lHTlMuY29udGFpbnMobmFtZSkpIHsKLSAgICAgICAgICAgIG1QYXJzZVR5cGUgPSBQQVJTRV9UWVBFX0FQUExFOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcHJvcGVydHlQYXJhbVR5cGUoU3RyaW5nIHR5cGUpIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBwcm9wZXJ0eVBhcmFtVmFsdWUoU3RyaW5nIHZhbHVlKSB7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcHJvcGVydHlWYWx1ZXMoTGlzdDxTdHJpbmc+IHZhbHVlcykgewotICAgICAgICBpZiAobU5lZWRUb1BhcnNlVmVyc2lvbiAmJiB2YWx1ZXMuc2l6ZSgpID4gMCkgewotICAgICAgICAgICAgZmluYWwgU3RyaW5nIHZlcnNpb25TdHJpbmcgPSB2YWx1ZXMuZ2V0KDApOwotICAgICAgICAgICAgaWYgKHZlcnNpb25TdHJpbmcuZXF1YWxzKFZDYXJkQ29uc3RhbnRzLlZFUlNJT05fVjIxKSkgewotICAgICAgICAgICAgICAgIG1WZXJzaW9uID0gVkNhcmRDb25maWcuVkVSU0lPTl8yMTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAodmVyc2lvblN0cmluZy5lcXVhbHMoVkNhcmRDb25zdGFudHMuVkVSU0lPTl9WMzApKSB7Ci0gICAgICAgICAgICAgICAgbVZlcnNpb24gPSBWQ2FyZENvbmZpZy5WRVJTSU9OXzMwOwotICAgICAgICAgICAgfSBlbHNlIGlmICh2ZXJzaW9uU3RyaW5nLmVxdWFscyhWQ2FyZENvbnN0YW50cy5WRVJTSU9OX1Y0MCkpIHsKLSAgICAgICAgICAgICAgICBtVmVyc2lvbiA9IFZDYXJkQ29uZmlnLlZFUlNJT05fNDA7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIExvZy53KExPR19UQUcsICJJbnZhbGlkIHZlcnNpb24gc3RyaW5nOiAiICsgdmVyc2lvblN0cmluZyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZiAobU5lZWRUb1BhcnNlQ2hhcnNldCAmJiB2YWx1ZXMuc2l6ZSgpID4gMCkgewotICAgICAgICAgICAgbVNwZWNpZmllZENoYXJzZXQgPSB2YWx1ZXMuZ2V0KDApOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHJldHVybiBUaGUgYXZhaWxhYmxlIHR5cGUgY2FuIGJlIHVzZWQgd2l0aCB2Q2FyZCBwYXJzZXIuIFlvdSBwcm9iYWJseSBuZWVkIHRvCi0gICAgICogdXNlIHt7QGxpbmsgI2dldEVzdGltYXRlZENoYXJzZXQoKX0gdG8gdW5kZXJzdGFuZCB0aGUgY2hhcnNldCB0byBiZSB1c2VkLgotICAgICAqLwotICAgIHB1YmxpYyBpbnQgZ2V0RXN0aW1hdGVkVHlwZSgpIHsKLSAgICAgICAgc3dpdGNoIChtUGFyc2VUeXBlKSB7Ci0gICAgICAgICAgICBjYXNlIFBBUlNFX1RZUEVfRE9DT01PX1RPUkVMQVRFX05FU1Q6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFZDYXJkQ29uZmlnLlZDQVJEX1RZUEVfRE9DT01PIHwgVkNhcmRDb25maWcuRkxBR19UT1JFTEFURV9ORVNUOwotICAgICAgICAgICAgY2FzZSBQQVJTRV9UWVBFX01PQklMRV9QSE9ORV9KUDoKLSAgICAgICAgICAgICAgICByZXR1cm4gVkNhcmRDb25maWcuVkNBUkRfVFlQRV9WMjFfSkFQQU5FU0VfTU9CSUxFOwotICAgICAgICAgICAgY2FzZSBQQVJTRV9UWVBFX0FQUExFOgotICAgICAgICAgICAgY2FzZSBQQVJTRV9UWVBFX1dJTkRPV1NfTU9CSUxFX1Y2NV9KUDoKLSAgICAgICAgICAgIGRlZmF1bHQ6IHsKLSAgICAgICAgICAgICAgICBpZiAobVZlcnNpb24gPT0gVkNhcmRDb25maWcuVkVSU0lPTl8yMSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gVkNhcmRDb25maWcuVkNBUkRfVFlQRV9WMjFfR0VORVJJQzsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG1WZXJzaW9uID09IFZDYXJkQ29uZmlnLlZFUlNJT05fMzApIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFZDYXJkQ29uZmlnLlZDQVJEX1RZUEVfVjMwX0dFTkVSSUM7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChtVmVyc2lvbiA9PSBWQ2FyZENvbmZpZy5WRVJTSU9OXzQwKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBWQ2FyZENvbmZpZy5WQ0FSRF9UWVBFX1Y0MF9HRU5FUklDOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBWQ2FyZENvbmZpZy5WQ0FSRF9UWVBFX1VOS05PV047Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPHA+Ci0gICAgICogUmV0dXJucyBjaGFyc2V0IFN0cmluZyBndWVzc2VkIGZyb20gdGhlIHNvdXJjZSdzIHByb3BlcnRpZXMuCi0gICAgICogVGhpcyBtZXRob2QgbXVzdCBiZSBjYWxsZWQgYWZ0ZXIgcGFyc2luZyB0YXJnZXQgZmlsZShzKS4KLSAgICAgKiA8L3A+Ci0gICAgICogQHJldHVybiBDaGFyc2V0IFN0cmluZy4gTnVsbCBpcyByZXR1cm5lZCBpZiBndWVzc2luZyB0aGUgc291cmNlIGZhaWxzLgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0RXN0aW1hdGVkQ2hhcnNldCgpIHsKLSAgICAgICAgaWYgKFRleHRVdGlscy5pc0VtcHR5KG1TcGVjaWZpZWRDaGFyc2V0KSkgewotICAgICAgICAgICAgcmV0dXJuIG1TcGVjaWZpZWRDaGFyc2V0OwotICAgICAgICB9Ci0gICAgICAgIHN3aXRjaCAobVBhcnNlVHlwZSkgewotICAgICAgICAgICAgY2FzZSBQQVJTRV9UWVBFX1dJTkRPV1NfTU9CSUxFX1Y2NV9KUDoKLSAgICAgICAgICAgIGNhc2UgUEFSU0VfVFlQRV9ET0NPTU9fVE9SRUxBVEVfTkVTVDoKLSAgICAgICAgICAgIGNhc2UgUEFSU0VfVFlQRV9NT0JJTEVfUEhPTkVfSlA6Ci0gICAgICAgICAgICAgICAgcmV0dXJuICJTSElGVF9KSVMiOwotICAgICAgICAgICAgY2FzZSBQQVJTRV9UWVBFX0FQUExFOgotICAgICAgICAgICAgICAgIHJldHVybiAiVVRGLTgiOwotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3BpbS92Y2FyZC9WQ2FyZFV0aWxzLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9waW0vdmNhcmQvVkNhcmRVdGlscy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYmNlY2EwLi4wMDAwMDAwCi0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3BpbS92Y2FyZC9WQ2FyZFV0aWxzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OTYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIGFuZHJvaWQucGltLnZjYXJkOwotCi1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRQcm92aWRlck9wZXJhdGlvbjsKLWltcG9ydCBhbmRyb2lkLnBpbS52Y2FyZC5leGNlcHRpb24uVkNhcmRFeGNlcHRpb247Ci1pbXBvcnQgYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0LkNvbW1vbkRhdGFLaW5kcy5JbTsKLWltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuQ29tbW9uRGF0YUtpbmRzLlBob25lOwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5Db21tb25EYXRhS2luZHMuU3RydWN0dXJlZFBvc3RhbDsKLWltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuRGF0YTsKLWltcG9ydCBhbmRyb2lkLnRlbGVwaG9ueS5QaG9uZU51bWJlclV0aWxzOwotaW1wb3J0IGFuZHJvaWQudGV4dC5UZXh0VXRpbHM7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb2RlYy5EZWNvZGVyRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb2RlYy5uZXQuUXVvdGVkUHJpbnRhYmxlQ29kZWM7Ci0KLWltcG9ydCBqYXZhLmlvLlVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKLWltcG9ydCBqYXZhLm5pby5jaGFyc2V0LkNoYXJzZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotLyoqCi0gKiBVdGlsaXRpZXMgZm9yIFZDYXJkIGhhbmRsaW5nIGNvZGVzLgotICovCi1wdWJsaWMgY2xhc3MgVkNhcmRVdGlscyB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIExPR19UQUcgPSAiVkNhcmRVdGlscyI7Ci0KLSAgICAvLyBOb3RlIHRoYXQgbm90IGFsbCB0eXBlcyBhcmUgaW5jbHVkZWQgaW4gdGhpcyBtYXAvc2V0LCBzaW5jZSwgZm9yIGV4YW1wbGUsIFRZUEVfSE9NRV9GQVggaXMKLSAgICAvLyBjb252ZXJ0ZWQgdG8gdHdvIHBhcmFtZXRlciBTdHJpbmdzLiBUaGVzZSBvbmx5IGNvbnRhaW4gc29tZSBtaW5vciBmaWVsZHMgdmFsaWQgaW4gYm90aAotICAgIC8vIHZDYXJkIGFuZCBjdXJyZW50IChhcyBvZiAyMDA5LTA4LTA3KSBDb250YWN0cyBzdHJ1Y3R1cmUuIAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIE1hcDxJbnRlZ2VyLCBTdHJpbmc+IHNLbm93blBob25lVHlwZXNNYXBfSXRvUzsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTZXQ8U3RyaW5nPiBzUGhvbmVUeXBlc1Vua25vd25Ub0NvbnRhY3RzU2V0OwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIE1hcDxTdHJpbmcsIEludGVnZXI+IHNLbm93blBob25lVHlwZU1hcF9TdG9JOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIE1hcDxJbnRlZ2VyLCBTdHJpbmc+IHNLbm93bkltUHJvcE5hbWVNYXBfSXRvUzsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTZXQ8U3RyaW5nPiBzTW9iaWxlUGhvbmVMYWJlbFNldDsKLQotICAgIHN0YXRpYyB7Ci0gICAgICAgIHNLbm93blBob25lVHlwZXNNYXBfSXRvUyA9IG5ldyBIYXNoTWFwPEludGVnZXIsIFN0cmluZz4oKTsKLSAgICAgICAgc0tub3duUGhvbmVUeXBlTWFwX1N0b0kgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIEludGVnZXI+KCk7Ci0KLSAgICAgICAgc0tub3duUGhvbmVUeXBlc01hcF9JdG9TLnB1dChQaG9uZS5UWVBFX0NBUiwgVkNhcmRDb25zdGFudHMuUEFSQU1fVFlQRV9DQVIpOwotICAgICAgICBzS25vd25QaG9uZVR5cGVNYXBfU3RvSS5wdXQoVkNhcmRDb25zdGFudHMuUEFSQU1fVFlQRV9DQVIsIFBob25lLlRZUEVfQ0FSKTsKLSAgICAgICAgc0tub3duUGhvbmVUeXBlc01hcF9JdG9TLnB1dChQaG9uZS5UWVBFX1BBR0VSLCBWQ2FyZENvbnN0YW50cy5QQVJBTV9UWVBFX1BBR0VSKTsKLSAgICAgICAgc0tub3duUGhvbmVUeXBlTWFwX1N0b0kucHV0KFZDYXJkQ29uc3RhbnRzLlBBUkFNX1RZUEVfUEFHRVIsIFBob25lLlRZUEVfUEFHRVIpOwotICAgICAgICBzS25vd25QaG9uZVR5cGVzTWFwX0l0b1MucHV0KFBob25lLlRZUEVfSVNETiwgVkNhcmRDb25zdGFudHMuUEFSQU1fVFlQRV9JU0ROKTsKLSAgICAgICAgc0tub3duUGhvbmVUeXBlTWFwX1N0b0kucHV0KFZDYXJkQ29uc3RhbnRzLlBBUkFNX1RZUEVfSVNETiwgUGhvbmUuVFlQRV9JU0ROKTsKLSAgICAgICAgCi0gICAgICAgIHNLbm93blBob25lVHlwZU1hcF9TdG9JLnB1dChWQ2FyZENvbnN0YW50cy5QQVJBTV9UWVBFX0hPTUUsIFBob25lLlRZUEVfSE9NRSk7Ci0gICAgICAgIHNLbm93blBob25lVHlwZU1hcF9TdG9JLnB1dChWQ2FyZENvbnN0YW50cy5QQVJBTV9UWVBFX1dPUkssIFBob25lLlRZUEVfV09SSyk7Ci0gICAgICAgIHNLbm93blBob25lVHlwZU1hcF9TdG9JLnB1dChWQ2FyZENvbnN0YW50cy5QQVJBTV9UWVBFX0NFTEwsIFBob25lLlRZUEVfTU9CSUxFKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgc0tub3duUGhvbmVUeXBlTWFwX1N0b0kucHV0KFZDYXJkQ29uc3RhbnRzLlBBUkFNX1BIT05FX0VYVFJBX1RZUEVfT1RIRVIsIFBob25lLlRZUEVfT1RIRVIpOwotICAgICAgICBzS25vd25QaG9uZVR5cGVNYXBfU3RvSS5wdXQoVkNhcmRDb25zdGFudHMuUEFSQU1fUEhPTkVfRVhUUkFfVFlQRV9DQUxMQkFDSywKLSAgICAgICAgICAgICAgICBQaG9uZS5UWVBFX0NBTExCQUNLKTsKLSAgICAgICAgc0tub3duUGhvbmVUeXBlTWFwX1N0b0kucHV0KAotICAgICAgICAgICAgICAgIFZDYXJkQ29uc3RhbnRzLlBBUkFNX1BIT05FX0VYVFJBX1RZUEVfQ09NUEFOWV9NQUlOLCBQaG9uZS5UWVBFX0NPTVBBTllfTUFJTik7Ci0gICAgICAgIHNLbm93blBob25lVHlwZU1hcF9TdG9JLnB1dChWQ2FyZENvbnN0YW50cy5QQVJBTV9QSE9ORV9FWFRSQV9UWVBFX1JBRElPLCBQaG9uZS5UWVBFX1JBRElPKTsKLSAgICAgICAgc0tub3duUGhvbmVUeXBlTWFwX1N0b0kucHV0KFZDYXJkQ29uc3RhbnRzLlBBUkFNX1BIT05FX0VYVFJBX1RZUEVfVFRZX1RERCwKLSAgICAgICAgICAgICAgICBQaG9uZS5UWVBFX1RUWV9UREQpOwotICAgICAgICBzS25vd25QaG9uZVR5cGVNYXBfU3RvSS5wdXQoVkNhcmRDb25zdGFudHMuUEFSQU1fUEhPTkVfRVhUUkFfVFlQRV9BU1NJU1RBTlQsCi0gICAgICAgICAgICAgICAgUGhvbmUuVFlQRV9BU1NJU1RBTlQpOwotCi0gICAgICAgIHNQaG9uZVR5cGVzVW5rbm93blRvQ29udGFjdHNTZXQgPSBuZXcgSGFzaFNldDxTdHJpbmc+KCk7Ci0gICAgICAgIHNQaG9uZVR5cGVzVW5rbm93blRvQ29udGFjdHNTZXQuYWRkKFZDYXJkQ29uc3RhbnRzLlBBUkFNX1RZUEVfTU9ERU0pOwotICAgICAgICBzUGhvbmVUeXBlc1Vua25vd25Ub0NvbnRhY3RzU2V0LmFkZChWQ2FyZENvbnN0YW50cy5QQVJBTV9UWVBFX01TRyk7Ci0gICAgICAgIHNQaG9uZVR5cGVzVW5rbm93blRvQ29udGFjdHNTZXQuYWRkKFZDYXJkQ29uc3RhbnRzLlBBUkFNX1RZUEVfQkJTKTsKLSAgICAgICAgc1Bob25lVHlwZXNVbmtub3duVG9Db250YWN0c1NldC5hZGQoVkNhcmRDb25zdGFudHMuUEFSQU1fVFlQRV9WSURFTyk7Ci0KLSAgICAgICAgc0tub3duSW1Qcm9wTmFtZU1hcF9JdG9TID0gbmV3IEhhc2hNYXA8SW50ZWdlciwgU3RyaW5nPigpOwotICAgICAgICBzS25vd25JbVByb3BOYW1lTWFwX0l0b1MucHV0KEltLlBST1RPQ09MX0FJTSwgVkNhcmRDb25zdGFudHMuUFJPUEVSVFlfWF9BSU0pOwotICAgICAgICBzS25vd25JbVByb3BOYW1lTWFwX0l0b1MucHV0KEltLlBST1RPQ09MX01TTiwgVkNhcmRDb25zdGFudHMuUFJPUEVSVFlfWF9NU04pOwotICAgICAgICBzS25vd25JbVByb3BOYW1lTWFwX0l0b1MucHV0KEltLlBST1RPQ09MX1lBSE9PLCBWQ2FyZENvbnN0YW50cy5QUk9QRVJUWV9YX1lBSE9PKTsKLSAgICAgICAgc0tub3duSW1Qcm9wTmFtZU1hcF9JdG9TLnB1dChJbS5QUk9UT0NPTF9TS1lQRSwgVkNhcmRDb25zdGFudHMuUFJPUEVSVFlfWF9TS1lQRV9VU0VSTkFNRSk7Ci0gICAgICAgIHNLbm93bkltUHJvcE5hbWVNYXBfSXRvUy5wdXQoSW0uUFJPVE9DT0xfR09PR0xFX1RBTEssCi0gICAgICAgICAgICAgICAgVkNhcmRDb25zdGFudHMuUFJPUEVSVFlfWF9HT09HTEVfVEFMSyk7Ci0gICAgICAgIHNLbm93bkltUHJvcE5hbWVNYXBfSXRvUy5wdXQoSW0uUFJPVE9DT0xfSUNRLCBWQ2FyZENvbnN0YW50cy5QUk9QRVJUWV9YX0lDUSk7Ci0gICAgICAgIHNLbm93bkltUHJvcE5hbWVNYXBfSXRvUy5wdXQoSW0uUFJPVE9DT0xfSkFCQkVSLCBWQ2FyZENvbnN0YW50cy5QUk9QRVJUWV9YX0pBQkJFUik7Ci0gICAgICAgIHNLbm93bkltUHJvcE5hbWVNYXBfSXRvUy5wdXQoSW0uUFJPVE9DT0xfUVEsIFZDYXJkQ29uc3RhbnRzLlBST1BFUlRZX1hfUVEpOwotICAgICAgICBzS25vd25JbVByb3BOYW1lTWFwX0l0b1MucHV0KEltLlBST1RPQ09MX05FVE1FRVRJTkcsIFZDYXJkQ29uc3RhbnRzLlBST1BFUlRZX1hfTkVUTUVFVElORyk7Ci0KLSAgICAgICAgLy8gXHU2NDNBXHU1RTJGXHU5NkZCXHU4QTcxID0gRnVsbC13aWR0aCBIaXJhZ2FuYSAiS2VpdGFpLURlbndhIiAobW9iaWxlIHBob25lKQotICAgICAgICAvLyBcdTY0M0FcdTVFMkYgPSBGdWxsLXdpZHRoIEhpcmFnYW5hICJLZWl0YWkiIChtb2JpbGUgcGhvbmUpCi0gICAgICAgIC8vIFx1MzBCMVx1MzBBNFx1MzBCRlx1MzBBNCA9IEZ1bGwtd2lkdGggS2F0YWthbmEgIktlaXRhaSIgKG1vYmlsZSBwaG9uZSkKLSAgICAgICAgLy8gXHVGRjc5XHVGRjcyXHVGRjgwXHVGRjcyID0gSGFsZi13aWR0aCBLYXRha2FuYSAiS2VpdGFpIiAobW9iaWxlIHBob25lKQotICAgICAgICBzTW9iaWxlUGhvbmVMYWJlbFNldCA9IG5ldyBIYXNoU2V0PFN0cmluZz4oQXJyYXlzLmFzTGlzdCgKLSAgICAgICAgICAgICAgICAiTU9CSUxFIiwgIlx1NjQzQVx1NUUyRlx1OTZGQlx1OEE3MSIsICJcdTY0M0FcdTVFMkYiLCAiXHUzMEIxXHUzMEE0XHUzMEJGXHUzMEE0IiwKLSAgICAgICAgICAgICAgICAiXHVGRjc5XHVGRjcyXHVGRjgwXHVGRjcyIikpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFBob25lVHlwZVN0cmluZyhJbnRlZ2VyIHR5cGUpIHsKLSAgICAgICAgcmV0dXJuIHNLbm93blBob25lVHlwZXNNYXBfSXRvUy5nZXQodHlwZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBJbnRlcmdlciB3aGVuIHRoZSBnaXZlbiB0eXBlcyBjYW4gYmUgcGFyc2VkIGFzIGtub3duIHR5cGUuIFJldHVybnMgU3RyaW5nIG9iamVjdAotICAgICAqIHdoZW4gbm90LCB3aGljaCBzaG91bGQgYmUgc2V0IHRvIGxhYmVsLiAKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIE9iamVjdCBnZXRQaG9uZVR5cGVGcm9tU3RyaW5ncyhDb2xsZWN0aW9uPFN0cmluZz4gdHlwZXMsCi0gICAgICAgICAgICBTdHJpbmcgbnVtYmVyKSB7Ci0gICAgICAgIGlmIChudW1iZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgbnVtYmVyID0gIiI7Ci0gICAgICAgIH0KLSAgICAgICAgaW50IHR5cGUgPSAtMTsKLSAgICAgICAgU3RyaW5nIGxhYmVsID0gbnVsbDsKLSAgICAgICAgYm9vbGVhbiBpc0ZheCA9IGZhbHNlOwotICAgICAgICBib29sZWFuIGhhc1ByZWYgPSBmYWxzZTsKLSAgICAgICAgCi0gICAgICAgIGlmICh0eXBlcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBmb3IgKFN0cmluZyB0eXBlU3RyaW5nIDogdHlwZXMpIHsKLSAgICAgICAgICAgICAgICBpZiAodHlwZVN0cmluZyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB0eXBlU3RyaW5nID0gdHlwZVN0cmluZy50b1VwcGVyQ2FzZSgpOwotICAgICAgICAgICAgICAgIGlmICh0eXBlU3RyaW5nLmVxdWFscyhWQ2FyZENvbnN0YW50cy5QQVJBTV9UWVBFX1BSRUYpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGhhc1ByZWYgPSB0cnVlOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZVN0cmluZy5lcXVhbHMoVkNhcmRDb25zdGFudHMuUEFSQU1fVFlQRV9GQVgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlzRmF4ID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBpZiAodHlwZVN0cmluZy5zdGFydHNXaXRoKCJYLSIpICYmIHR5cGUgPCAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0eXBlU3RyaW5nID0gdHlwZVN0cmluZy5zdWJzdHJpbmcoMik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVTdHJpbmcubGVuZ3RoKCkgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZmluYWwgSW50ZWdlciB0bXAgPSBzS25vd25QaG9uZVR5cGVNYXBfU3RvSS5nZXQodHlwZVN0cmluZyk7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh0bXAgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IHR5cGVDYW5kaWRhdGUgPSB0bXA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBUWVBFX1BBR0VSIGlzIHByZWZlcmVkIHdoZW4gdGhlIG51bWJlciBjb250YWlucyBAIHN1cnJvbmRlZCBieQotICAgICAgICAgICAgICAgICAgICAgICAgLy8gYSBwYWdlciBudW1iZXIgYW5kIGEgZG9tYWluIG5hbWUuCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBlLmcuCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBvIDExMTFAZG9tYWluLmNvbQotICAgICAgICAgICAgICAgICAgICAgICAgLy8geCBAZG9tYWluLmNvbQotICAgICAgICAgICAgICAgICAgICAgICAgLy8geCAxMTExQAotICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IGluZGV4T2ZBdCA9IG51bWJlci5pbmRleE9mKCJAIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoKHR5cGVDYW5kaWRhdGUgPT0gUGhvbmUuVFlQRV9QQUdFUgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiAwIDwgaW5kZXhPZkF0ICYmIGluZGV4T2ZBdCA8IG51bWJlci5sZW5ndGgoKSAtIDEpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IHR5cGUgPCAwCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IHR5cGUgPT0gUGhvbmUuVFlQRV9DVVNUT00pIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlID0gdG1wOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGUgPCAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0eXBlID0gUGhvbmUuVFlQRV9DVVNUT007Ci0gICAgICAgICAgICAgICAgICAgICAgICBsYWJlbCA9IHR5cGVTdHJpbmc7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHR5cGUgPCAwKSB7Ci0gICAgICAgICAgICBpZiAoaGFzUHJlZikgewotICAgICAgICAgICAgICAgIHR5cGUgPSBQaG9uZS5UWVBFX01BSU47Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIC8vIGRlZmF1bHQgdG8gVFlQRV9IT01FCi0gICAgICAgICAgICAgICAgdHlwZSA9IFBob25lLlRZUEVfSE9NRTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAoaXNGYXgpIHsKLSAgICAgICAgICAgIGlmICh0eXBlID09IFBob25lLlRZUEVfSE9NRSkgewotICAgICAgICAgICAgICAgIHR5cGUgPSBQaG9uZS5UWVBFX0ZBWF9IT01FOwotICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlID09IFBob25lLlRZUEVfV09SSykgewotICAgICAgICAgICAgICAgIHR5cGUgPSBQaG9uZS5UWVBFX0ZBWF9XT1JLOwotICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlID09IFBob25lLlRZUEVfT1RIRVIpIHsKLSAgICAgICAgICAgICAgICB0eXBlID0gUGhvbmUuVFlQRV9PVEhFUl9GQVg7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHR5cGUgPT0gUGhvbmUuVFlQRV9DVVNUT00pIHsKLSAgICAgICAgICAgIHJldHVybiBsYWJlbDsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiB0eXBlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQFN1cHByZXNzV2FybmluZ3MoImRlcHJlY2F0aW9uIikKLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNNb2JpbGVQaG9uZUxhYmVsKGZpbmFsIFN0cmluZyBsYWJlbCkgewotICAgICAgICAvLyBGb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eS4KLSAgICAgICAgLy8gRGV0YWlsOiBVbnRpbCBEb251dCwgdGhlcmUgaXNuJ3QgVFlQRV9NT0JJTEUgZm9yIGVtYWlsIHdoaWxlIHRoZXJlIGlzIG5vdy4KLSAgICAgICAgLy8gICAgICAgICBUbyBzdXBwb3J0IG1vYmlsZSB0eXBlIGF0IHRoYXQgdGltZSwgdGhpcyBjdXN0b20gbGFiZWwgaGFkIGJlZW4gdXNlZC4KLSAgICAgICAgcmV0dXJuICgiX0FVVE9fQ0VMTCIuZXF1YWxzKGxhYmVsKSB8fCBzTW9iaWxlUGhvbmVMYWJlbFNldC5jb250YWlucyhsYWJlbCkpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1ZhbGlkSW5WMjFCdXRVbmtub3duVG9Db250YWN0c1Bob3RlVHlwZShmaW5hbCBTdHJpbmcgbGFiZWwpIHsKLSAgICAgICAgcmV0dXJuIHNQaG9uZVR5cGVzVW5rbm93blRvQ29udGFjdHNTZXQuY29udGFpbnMobGFiZWwpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFByb3BlcnR5TmFtZUZvckltKGZpbmFsIGludCBwcm90b2NvbCkgewotICAgICAgICByZXR1cm4gc0tub3duSW1Qcm9wTmFtZU1hcF9JdG9TLmdldChwcm90b2NvbCk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmdbXSBzb3J0TmFtZUVsZW1lbnRzKGZpbmFsIGludCB2Y2FyZFR5cGUsCi0gICAgICAgICAgICBmaW5hbCBTdHJpbmcgZmFtaWx5TmFtZSwgZmluYWwgU3RyaW5nIG1pZGRsZU5hbWUsIGZpbmFsIFN0cmluZyBnaXZlbk5hbWUpIHsKLSAgICAgICAgZmluYWwgU3RyaW5nW10gbGlzdCA9IG5ldyBTdHJpbmdbM107Ci0gICAgICAgIGZpbmFsIGludCBuYW1lT3JkZXJUeXBlID0gVkNhcmRDb25maWcuZ2V0TmFtZU9yZGVyVHlwZSh2Y2FyZFR5cGUpOwotICAgICAgICBzd2l0Y2ggKG5hbWVPcmRlclR5cGUpIHsKLSAgICAgICAgICAgIGNhc2UgVkNhcmRDb25maWcuTkFNRV9PUkRFUl9KQVBBTkVTRTogewotICAgICAgICAgICAgICAgIGlmIChjb250YWluc09ubHlQcmludGFibGVBc2NpaShmYW1pbHlOYW1lKSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgY29udGFpbnNPbmx5UHJpbnRhYmxlQXNjaWkoZ2l2ZW5OYW1lKSkgewotICAgICAgICAgICAgICAgICAgICBsaXN0WzBdID0gZ2l2ZW5OYW1lOwotICAgICAgICAgICAgICAgICAgICBsaXN0WzFdID0gbWlkZGxlTmFtZTsKLSAgICAgICAgICAgICAgICAgICAgbGlzdFsyXSA9IGZhbWlseU5hbWU7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgbGlzdFswXSA9IGZhbWlseU5hbWU7Ci0gICAgICAgICAgICAgICAgICAgIGxpc3RbMV0gPSBtaWRkbGVOYW1lOwotICAgICAgICAgICAgICAgICAgICBsaXN0WzJdID0gZ2l2ZW5OYW1lOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhc2UgVkNhcmRDb25maWcuTkFNRV9PUkRFUl9FVVJPUEU6IHsKLSAgICAgICAgICAgICAgICBsaXN0WzBdID0gbWlkZGxlTmFtZTsKLSAgICAgICAgICAgICAgICBsaXN0WzFdID0gZ2l2ZW5OYW1lOwotICAgICAgICAgICAgICAgIGxpc3RbMl0gPSBmYW1pbHlOYW1lOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZGVmYXVsdDogewotICAgICAgICAgICAgICAgIGxpc3RbMF0gPSBnaXZlbk5hbWU7Ci0gICAgICAgICAgICAgICAgbGlzdFsxXSA9IG1pZGRsZU5hbWU7Ci0gICAgICAgICAgICAgICAgbGlzdFsyXSA9IGZhbWlseU5hbWU7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGxpc3Q7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBpbnQgZ2V0UGhvbmVOdW1iZXJGb3JtYXQoZmluYWwgaW50IHZjYXJkVHlwZSkgewotICAgICAgICBpZiAoVkNhcmRDb25maWcuaXNKYXBhbmVzZURldmljZSh2Y2FyZFR5cGUpKSB7Ci0gICAgICAgICAgICByZXR1cm4gUGhvbmVOdW1iZXJVdGlscy5GT1JNQVRfSkFQQU47Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gUGhvbmVOdW1iZXJVdGlscy5GT1JNQVRfTkFOUDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIDxwPgotICAgICAqIEluc2VydHMgcG9zdGFsIGRhdGEgaW50byB0aGUgYnVpbGRlciBvYmplY3QuCi0gICAgICogPC9wPgotICAgICAqIDxwPgotICAgICAqIE5vdGUgdGhhdCB0aGUgZGF0YSBzdHJ1Y3R1cmUgb2YgQ29udGFjdHNDb250cmFjdCBpcyBkaWZmZXJlbnQgZnJvbSB0aGF0IGRlZmluZWQgaW4gdkNhcmQuCi0gICAgICogU28gc29tZSBjb252ZXJzaW9uIG1heSBiZSBwZXJmb3JtZWQgaW4gdGhpcyBtZXRob2QuCi0gICAgICogPC9wPgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBpbnNlcnRTdHJ1Y3R1cmVkUG9zdGFsRGF0YVVzaW5nQ29udGFjdHNTdHJ1Y3QoaW50IHZjYXJkVHlwZSwKLSAgICAgICAgICAgIGZpbmFsIENvbnRlbnRQcm92aWRlck9wZXJhdGlvbi5CdWlsZGVyIGJ1aWxkZXIsCi0gICAgICAgICAgICBmaW5hbCBWQ2FyZEVudHJ5LlBvc3RhbERhdGEgcG9zdGFsRGF0YSkgewotICAgICAgICBidWlsZGVyLndpdGhWYWx1ZUJhY2tSZWZlcmVuY2UoU3RydWN0dXJlZFBvc3RhbC5SQVdfQ09OVEFDVF9JRCwgMCk7Ci0gICAgICAgIGJ1aWxkZXIud2l0aFZhbHVlKERhdGEuTUlNRVRZUEUsIFN0cnVjdHVyZWRQb3N0YWwuQ09OVEVOVF9JVEVNX1RZUEUpOwotCi0gICAgICAgIGJ1aWxkZXIud2l0aFZhbHVlKFN0cnVjdHVyZWRQb3N0YWwuVFlQRSwgcG9zdGFsRGF0YS50eXBlKTsKLSAgICAgICAgaWYgKHBvc3RhbERhdGEudHlwZSA9PSBTdHJ1Y3R1cmVkUG9zdGFsLlRZUEVfQ1VTVE9NKSB7Ci0gICAgICAgICAgICBidWlsZGVyLndpdGhWYWx1ZShTdHJ1Y3R1cmVkUG9zdGFsLkxBQkVMLCBwb3N0YWxEYXRhLmxhYmVsKTsKLSAgICAgICAgfQotCi0gICAgICAgIGZpbmFsIFN0cmluZyBzdHJlZXRTdHJpbmc7Ci0gICAgICAgIGlmIChUZXh0VXRpbHMuaXNFbXB0eShwb3N0YWxEYXRhLnN0cmVldCkpIHsKLSAgICAgICAgICAgIGlmIChUZXh0VXRpbHMuaXNFbXB0eShwb3N0YWxEYXRhLmV4dGVuZGVkQWRkcmVzcykpIHsKLSAgICAgICAgICAgICAgICBzdHJlZXRTdHJpbmcgPSBudWxsOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBzdHJlZXRTdHJpbmcgPSBwb3N0YWxEYXRhLmV4dGVuZGVkQWRkcmVzczsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGlmIChUZXh0VXRpbHMuaXNFbXB0eShwb3N0YWxEYXRhLmV4dGVuZGVkQWRkcmVzcykpIHsKLSAgICAgICAgICAgICAgICBzdHJlZXRTdHJpbmcgPSBwb3N0YWxEYXRhLnN0cmVldDsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgc3RyZWV0U3RyaW5nID0gcG9zdGFsRGF0YS5zdHJlZXQgKyAiICIgKyBwb3N0YWxEYXRhLmV4dGVuZGVkQWRkcmVzczsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBidWlsZGVyLndpdGhWYWx1ZShTdHJ1Y3R1cmVkUG9zdGFsLlBPQk9YLCBwb3N0YWxEYXRhLnBvYm94KTsKLSAgICAgICAgYnVpbGRlci53aXRoVmFsdWUoU3RydWN0dXJlZFBvc3RhbC5TVFJFRVQsIHN0cmVldFN0cmluZyk7Ci0gICAgICAgIGJ1aWxkZXIud2l0aFZhbHVlKFN0cnVjdHVyZWRQb3N0YWwuQ0lUWSwgcG9zdGFsRGF0YS5sb2NhbHR5KTsKLSAgICAgICAgYnVpbGRlci53aXRoVmFsdWUoU3RydWN0dXJlZFBvc3RhbC5SRUdJT04sIHBvc3RhbERhdGEucmVnaW9uKTsKLSAgICAgICAgYnVpbGRlci53aXRoVmFsdWUoU3RydWN0dXJlZFBvc3RhbC5QT1NUQ09ERSwgcG9zdGFsRGF0YS5wb3N0YWxDb2RlKTsKLSAgICAgICAgYnVpbGRlci53aXRoVmFsdWUoU3RydWN0dXJlZFBvc3RhbC5DT1VOVFJZLCBwb3N0YWxEYXRhLmNvdW50cnkpOwotCi0gICAgICAgIGJ1aWxkZXIud2l0aFZhbHVlKFN0cnVjdHVyZWRQb3N0YWwuRk9STUFUVEVEX0FERFJFU1MsCi0gICAgICAgICAgICAgICAgcG9zdGFsRGF0YS5nZXRGb3JtYXR0ZWRBZGRyZXNzKHZjYXJkVHlwZSkpOwotICAgICAgICBpZiAocG9zdGFsRGF0YS5pc1ByaW1hcnkpIHsKLSAgICAgICAgICAgIGJ1aWxkZXIud2l0aFZhbHVlKERhdGEuSVNfUFJJTUFSWSwgMSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBjb25zdHJ1Y3ROYW1lRnJvbUVsZW1lbnRzKGZpbmFsIGludCB2Y2FyZFR5cGUsCi0gICAgICAgICAgICBmaW5hbCBTdHJpbmcgZmFtaWx5TmFtZSwgZmluYWwgU3RyaW5nIG1pZGRsZU5hbWUsIGZpbmFsIFN0cmluZyBnaXZlbk5hbWUpIHsKLSAgICAgICAgcmV0dXJuIGNvbnN0cnVjdE5hbWVGcm9tRWxlbWVudHModmNhcmRUeXBlLCBmYW1pbHlOYW1lLCBtaWRkbGVOYW1lLCBnaXZlbk5hbWUsCi0gICAgICAgICAgICAgICAgbnVsbCwgbnVsbCk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgY29uc3RydWN0TmFtZUZyb21FbGVtZW50cyhmaW5hbCBpbnQgdmNhcmRUeXBlLAotICAgICAgICAgICAgZmluYWwgU3RyaW5nIGZhbWlseU5hbWUsIGZpbmFsIFN0cmluZyBtaWRkbGVOYW1lLCBmaW5hbCBTdHJpbmcgZ2l2ZW5OYW1lLAotICAgICAgICAgICAgZmluYWwgU3RyaW5nIHByZWZpeCwgZmluYWwgU3RyaW5nIHN1ZmZpeCkgewotICAgICAgICBmaW5hbCBTdHJpbmdCdWlsZGVyIGJ1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotICAgICAgICBmaW5hbCBTdHJpbmdbXSBuYW1lTGlzdCA9IHNvcnROYW1lRWxlbWVudHModmNhcmRUeXBlLCBmYW1pbHlOYW1lLCBtaWRkbGVOYW1lLCBnaXZlbk5hbWUpOwotICAgICAgICBib29sZWFuIGZpcnN0ID0gdHJ1ZTsKLSAgICAgICAgaWYgKCFUZXh0VXRpbHMuaXNFbXB0eShwcmVmaXgpKSB7Ci0gICAgICAgICAgICBmaXJzdCA9IGZhbHNlOwotICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQocHJlZml4KTsKLSAgICAgICAgfQotICAgICAgICBmb3IgKGZpbmFsIFN0cmluZyBuYW1lUGFydCA6IG5hbWVMaXN0KSB7Ci0gICAgICAgICAgICBpZiAoIVRleHRVdGlscy5pc0VtcHR5KG5hbWVQYXJ0KSkgewotICAgICAgICAgICAgICAgIGlmIChmaXJzdCkgewotICAgICAgICAgICAgICAgICAgICBmaXJzdCA9IGZhbHNlOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKCcgJyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKG5hbWVQYXJ0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAoIVRleHRVdGlscy5pc0VtcHR5KHN1ZmZpeCkpIHsKLSAgICAgICAgICAgIGlmICghZmlyc3QpIHsKLSAgICAgICAgICAgICAgICBidWlsZGVyLmFwcGVuZCgnICcpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoc3VmZml4KTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gYnVpbGRlci50b1N0cmluZygpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNwbGl0cyB0aGUgZ2l2ZW4gdmFsdWUgaW50byBwaWVjZXMgdXNpbmcgdGhlIGRlbGltaXRlciAnOycgaW5zaWRlIGl0LgotICAgICAqCi0gICAgICogRXNjYXBlZCBjaGFyYWN0ZXJzIGluIHRob3NlIHZhbHVlcyBhcmUgYXV0b21hdGljYWxseSB1bmVzY2FwZWQgaW50byBvcmlnaW5hbCBmb3JtLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgTGlzdDxTdHJpbmc+IGNvbnN0cnVjdExpc3RGcm9tVmFsdWUoZmluYWwgU3RyaW5nIHZhbHVlLAotICAgICAgICAgICAgZmluYWwgaW50IHZjYXJkVHlwZSkgewotICAgICAgICBmaW5hbCBMaXN0PFN0cmluZz4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotICAgICAgICBTdHJpbmdCdWlsZGVyIGJ1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotICAgICAgICBmaW5hbCBpbnQgbGVuZ3RoID0gdmFsdWUubGVuZ3RoKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIGNoYXIgY2ggPSB2YWx1ZS5jaGFyQXQoaSk7Ci0gICAgICAgICAgICBpZiAoY2ggPT0gJ1xcJyAmJiBpIDwgbGVuZ3RoIC0gMSkgewotICAgICAgICAgICAgICAgIGNoYXIgbmV4dENoID0gdmFsdWUuY2hhckF0KGkgKyAxKTsKLSAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgdW5lc2NhcGVkU3RyaW5nOwotICAgICAgICAgICAgICAgIGlmIChWQ2FyZENvbmZpZy5pc1ZlcnNpb240MCh2Y2FyZFR5cGUpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHVuZXNjYXBlZFN0cmluZyA9IFZDYXJkUGFyc2VySW1wbF9WNDAudW5lc2NhcGVDaGFyYWN0ZXIobmV4dENoKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKFZDYXJkQ29uZmlnLmlzVmVyc2lvbjMwKHZjYXJkVHlwZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgdW5lc2NhcGVkU3RyaW5nID0gVkNhcmRQYXJzZXJJbXBsX1YzMC51bmVzY2FwZUNoYXJhY3RlcihuZXh0Q2gpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICghVkNhcmRDb25maWcuaXNWZXJzaW9uMjEodmNhcmRUeXBlKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gVW5rbm93biB2Q2FyZCB0eXBlCi0gICAgICAgICAgICAgICAgICAgICAgICBMb2cudyhMT0dfVEFHLCAiVW5rbm93biB2Q2FyZCB0eXBlIik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgdW5lc2NhcGVkU3RyaW5nID0gVkNhcmRQYXJzZXJJbXBsX1YyMS51bmVzY2FwZUNoYXJhY3RlcihuZXh0Q2gpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmICh1bmVzY2FwZWRTdHJpbmcgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBidWlsZGVyLmFwcGVuZCh1bmVzY2FwZWRTdHJpbmcpOwotICAgICAgICAgICAgICAgICAgICBpKys7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoY2gpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSBpZiAoY2ggPT0gJzsnKSB7Ci0gICAgICAgICAgICAgICAgbGlzdC5hZGQoYnVpbGRlci50b1N0cmluZygpKTsKLSAgICAgICAgICAgICAgICBidWlsZGVyID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoY2gpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGxpc3QuYWRkKGJ1aWxkZXIudG9TdHJpbmcoKSk7Ci0gICAgICAgIHJldHVybiBsaXN0OwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjb250YWluc09ubHlQcmludGFibGVBc2NpaShmaW5hbCBTdHJpbmcuLi52YWx1ZXMpIHsKLSAgICAgICAgaWYgKHZhbHVlcyA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gY29udGFpbnNPbmx5UHJpbnRhYmxlQXNjaWkoQXJyYXlzLmFzTGlzdCh2YWx1ZXMpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gY29udGFpbnNPbmx5UHJpbnRhYmxlQXNjaWkoZmluYWwgQ29sbGVjdGlvbjxTdHJpbmc+IHZhbHVlcykgewotICAgICAgICBpZiAodmFsdWVzID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIGZvciAoZmluYWwgU3RyaW5nIHZhbHVlIDogdmFsdWVzKSB7Ci0gICAgICAgICAgICBpZiAoVGV4dFV0aWxzLmlzRW1wdHkodmFsdWUpKSB7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoIVRleHRVdGlscy5pc1ByaW50YWJsZUFzY2lpT25seSh2YWx1ZSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPHA+Ci0gICAgICogVGhpcyBpcyB1c2VmdWwgd2hlbiBjaGVja2luZyB0aGUgc3RyaW5nIHNob3VsZCBiZSBlbmNvZGVkIGludG8gcXVvdGVkLXByaW50YWJsZQotICAgICAqIG9yIG5vdCwgd2hpY2ggaXMgcmVxdWlyZWQgYnkgdkNhcmQgMi4xLgotICAgICAqIDwvcD4KLSAgICAgKiA8cD4KLSAgICAgKiBTZWUgdGhlIGRlZmluaXRpb24gb2YgIjdiaXQiIGluIHZDYXJkIDIuMSBzcGVjIGZvciBtb3JlIGluZm9ybWF0aW9uLgotICAgICAqIDwvcD4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gY29udGFpbnNPbmx5Tm9uQ3JMZlByaW50YWJsZUFzY2lpKGZpbmFsIFN0cmluZy4uLnZhbHVlcykgewotICAgICAgICBpZiAodmFsdWVzID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBjb250YWluc09ubHlOb25DckxmUHJpbnRhYmxlQXNjaWkoQXJyYXlzLmFzTGlzdCh2YWx1ZXMpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gY29udGFpbnNPbmx5Tm9uQ3JMZlByaW50YWJsZUFzY2lpKGZpbmFsIENvbGxlY3Rpb248U3RyaW5nPiB2YWx1ZXMpIHsKLSAgICAgICAgaWYgKHZhbHVlcyA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICBmaW5hbCBpbnQgYXNjaWlGaXJzdCA9IDB4MjA7Ci0gICAgICAgIGZpbmFsIGludCBhc2NpaUxhc3QgPSAweDdFOyAgLy8gaW5jbHVkZWQKLSAgICAgICAgZm9yIChmaW5hbCBTdHJpbmcgdmFsdWUgOiB2YWx1ZXMpIHsKLSAgICAgICAgICAgIGlmIChUZXh0VXRpbHMuaXNFbXB0eSh2YWx1ZSkpIHsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZpbmFsIGludCBsZW5ndGggPSB2YWx1ZS5sZW5ndGgoKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpID0gdmFsdWUub2Zmc2V0QnlDb2RlUG9pbnRzKGksIDEpKSB7Ci0gICAgICAgICAgICAgICAgZmluYWwgaW50IGMgPSB2YWx1ZS5jb2RlUG9pbnRBdChpKTsKLSAgICAgICAgICAgICAgICBpZiAoIShhc2NpaUZpcnN0IDw9IGMgJiYgYyA8PSBhc2NpaUxhc3QpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU2V0PENoYXJhY3Rlcj4gc1VuQWNjZXB0YWJsZUFzY2lpSW5WMjFXb3JkU2V0ID0KLSAgICAgICAgbmV3IEhhc2hTZXQ8Q2hhcmFjdGVyPihBcnJheXMuYXNMaXN0KCdbJywgJ10nLCAnPScsICc6JywgJy4nLCAnLCcsICcgJykpOwotCi0gICAgLyoqCi0gICAgICogPHA+Ci0gICAgICogVGhpcyBpcyB1c2VmdWwgc2luY2UgdkNhcmQgMy4wIG9mdGVuIHJlcXVpcmVzIHRoZSAoIlgtIikgcHJvcGVydGllcyBhbmQgZ3JvdXBzCi0gICAgICogc2hvdWxkIGNvbnRhaW4gb25seSBhbHBoYWJldHMsIGRpZ2l0cywgYW5kIGh5cGhlbi4KLSAgICAgKiA8L3A+Ci0gICAgICogPHA+IAotICAgICAqIE5vdGU6IEl0IGlzIGFscmVhZHkga25vd24gc29tZSBkZXZpY2VzICh3cm9uZ2x5KSBvdXRwdXRzIHByb3BlcnRpZXMgd2l0aCBjaGFyYWN0ZXJzCi0gICAgICogICAgICAgd2hpY2ggc2hvdWxkIG5vdCBiZSBpbiB0aGUgZmllbGQuIE9uZSBleGFtcGxlIGlzICJYLUdPT0dMRSBUQUxLIi4gV2UgYWNjZXB0Ci0gICAgICogICAgICAgc3VjaCBraW5kIG9mIGlucHV0IGJ1dCBtdXN0IG5ldmVyIG91dHB1dCBpdCB1bmxlc3MgdGhlIHRhcmdldCBpcyB2ZXJ5IHNwZWNpZmljCi0gICAgICogICAgICAgdG8gdGhlIGRldmljZSB3aGljaCBpcyBhYmxlIHRvIHBhcnNlIHRoZSBtYWxmb3JtZWQgaW5wdXQuCi0gICAgICogPC9wPgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjb250YWluc09ubHlBbHBoYURpZ2l0SHlwaGVuKGZpbmFsIFN0cmluZy4uLnZhbHVlcykgewotICAgICAgICBpZiAodmFsdWVzID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBjb250YWluc09ubHlBbHBoYURpZ2l0SHlwaGVuKEFycmF5cy5hc0xpc3QodmFsdWVzKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGNvbnRhaW5zT25seUFscGhhRGlnaXRIeXBoZW4oZmluYWwgQ29sbGVjdGlvbjxTdHJpbmc+IHZhbHVlcykgewotICAgICAgICBpZiAodmFsdWVzID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIGZpbmFsIGludCB1cHBlckFscGhhYmV0Rmlyc3QgPSAweDQxOyAgLy8gQQotICAgICAgICBmaW5hbCBpbnQgdXBwZXJBbHBoYWJldEFmdGVyTGFzdCA9IDB4NWI7ICAvLyBbCi0gICAgICAgIGZpbmFsIGludCBsb3dlckFscGhhYmV0Rmlyc3QgPSAweDYxOyAgLy8gYQotICAgICAgICBmaW5hbCBpbnQgbG93ZXJBbHBoYWJldEFmdGVyTGFzdCA9IDB4N2I7ICAvLyB7Ci0gICAgICAgIGZpbmFsIGludCBkaWdpdEZpcnN0ID0gMHgzMDsgIC8vIDAKLSAgICAgICAgZmluYWwgaW50IGRpZ2l0QWZ0ZXJMYXN0ID0gMHgzQTsgIC8vIDoKLSAgICAgICAgZmluYWwgaW50IGh5cGhlbiA9ICctJzsKLSAgICAgICAgZm9yIChmaW5hbCBTdHJpbmcgc3RyIDogdmFsdWVzKSB7Ci0gICAgICAgICAgICBpZiAoVGV4dFV0aWxzLmlzRW1wdHkoc3RyKSkgewotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZmluYWwgaW50IGxlbmd0aCA9IHN0ci5sZW5ndGgoKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpID0gc3RyLm9mZnNldEJ5Q29kZVBvaW50cyhpLCAxKSkgewotICAgICAgICAgICAgICAgIGludCBjb2RlcG9pbnQgPSBzdHIuY29kZVBvaW50QXQoaSk7Ci0gICAgICAgICAgICAgICAgaWYgKCEoKGxvd2VyQWxwaGFiZXRGaXJzdCA8PSBjb2RlcG9pbnQgJiYgY29kZXBvaW50IDwgbG93ZXJBbHBoYWJldEFmdGVyTGFzdCkgfHwKLSAgICAgICAgICAgICAgICAgICAgKHVwcGVyQWxwaGFiZXRGaXJzdCA8PSBjb2RlcG9pbnQgJiYgY29kZXBvaW50IDwgdXBwZXJBbHBoYWJldEFmdGVyTGFzdCkgfHwKLSAgICAgICAgICAgICAgICAgICAgKGRpZ2l0Rmlyc3QgPD0gY29kZXBvaW50ICYmIGNvZGVwb2ludCA8IGRpZ2l0QWZ0ZXJMYXN0KSB8fAotICAgICAgICAgICAgICAgICAgICAoY29kZXBvaW50ID09IGh5cGhlbikpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGNvbnRhaW5zT25seVdoaXRlU3BhY2VzKGZpbmFsIFN0cmluZy4uLnZhbHVlcykgewotICAgICAgICBpZiAodmFsdWVzID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBjb250YWluc09ubHlXaGl0ZVNwYWNlcyhBcnJheXMuYXNMaXN0KHZhbHVlcykpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjb250YWluc09ubHlXaGl0ZVNwYWNlcyhmaW5hbCBDb2xsZWN0aW9uPFN0cmluZz4gdmFsdWVzKSB7Ci0gICAgICAgIGlmICh2YWx1ZXMgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgZm9yIChmaW5hbCBTdHJpbmcgc3RyIDogdmFsdWVzKSB7Ci0gICAgICAgICAgICBpZiAoVGV4dFV0aWxzLmlzRW1wdHkoc3RyKSkgewotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZmluYWwgaW50IGxlbmd0aCA9IHN0ci5sZW5ndGgoKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpID0gc3RyLm9mZnNldEJ5Q29kZVBvaW50cyhpLCAxKSkgewotICAgICAgICAgICAgICAgIGlmICghQ2hhcmFjdGVyLmlzV2hpdGVzcGFjZShzdHIuY29kZVBvaW50QXQoaSkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPHA+Ci0gICAgICogUmV0dXJucyB0cnVlIHdoZW4gdGhlIGdpdmVuIFN0cmluZyBpcyBjYXRlZ29yaXplZCBhcyAid29yZCIgc3BlY2lmaWVkIGluIHZDYXJkIHNwZWMgMi4xLgotICAgICAqIDwvcD4KLSAgICAgKiA8cD4KLSAgICAgKiB2Q2FyZCAyLjEgc3BlY2lmaWVzOjxiciAvPgotICAgICAqIHdvcmQgPSAmbHQ7YW55IHByaW50YWJsZSA3Yml0IHVzLWFzY2lpIGV4Y2VwdCBbXT06LiwgJmd0OwotICAgICAqIDwvcD4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNWMjFXb3JkKGZpbmFsIFN0cmluZyB2YWx1ZSkgewotICAgICAgICBpZiAoVGV4dFV0aWxzLmlzRW1wdHkodmFsdWUpKSB7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICBmaW5hbCBpbnQgYXNjaWlGaXJzdCA9IDB4MjA7Ci0gICAgICAgIGZpbmFsIGludCBhc2NpaUxhc3QgPSAweDdFOyAgLy8gaW5jbHVkZWQKLSAgICAgICAgZmluYWwgaW50IGxlbmd0aCA9IHZhbHVlLmxlbmd0aCgpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSA9IHZhbHVlLm9mZnNldEJ5Q29kZVBvaW50cyhpLCAxKSkgewotICAgICAgICAgICAgZmluYWwgaW50IGMgPSB2YWx1ZS5jb2RlUG9pbnRBdChpKTsKLSAgICAgICAgICAgIGlmICghKGFzY2lpRmlyc3QgPD0gYyAmJiBjIDw9IGFzY2lpTGFzdCkgfHwKLSAgICAgICAgICAgICAgICAgICAgc1VuQWNjZXB0YWJsZUFzY2lpSW5WMjFXb3JkU2V0LmNvbnRhaW5zKChjaGFyKWMpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludFtdIHNFc2NhcGVJbmRpY2F0b3JzVjMwID0gbmV3IGludFtdewotICAgICAgICAnOicsICc7JywgJywnLCAnICcKLSAgICB9OwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50W10gc0VzY2FwZUluZGljYXRvcnNWNDAgPSBuZXcgaW50W117Ci0gICAgICAgICc7JywgJzonCi0gICAgfTsKLQotICAgIC8qKgotICAgICAqIDxQPgotICAgICAqIFJldHVybnMgU3RyaW5nIGF2YWlsYWJsZSBhcyBwYXJhbWV0ZXIgdmFsdWUgaW4gdkNhcmQgMy4wLgotICAgICAqIDwvUD4KLSAgICAgKiA8UD4KLSAgICAgKiBSRkMgMjQyNiByZXF1aXJlcyB2Q2FyZCBjb21wb3NlciB0byBxdW90ZSBwYXJhbWV0ZXIgdmFsdWVzIHdoZW4gaXQgY29udGFpbnMKLSAgICAgKiBzZW1pLWNvbG9uLCBmb3IgZXhhbXBsZSAoU2VlIFJGQyAyNDI2IGZvciBtb3JlIGluZm9ybWF0aW9uKS4KLSAgICAgKiBUaGlzIG1ldGhvZCBjaGVja3Mgd2hldGhlciB0aGUgZ2l2ZW4gU3RyaW5nIGNhbiBiZSB1c2VkIHdpdGhvdXQgcXVvdGVzLgotICAgICAqIDwvUD4KLSAgICAgKiA8UD4KLSAgICAgKiBOb3RlOiBXZSByZW1vdmUgRFFVT1RFIGluc2lkZSB0aGUgZ2l2ZW4gdmFsdWUgc2lsZW50bHkgZm9yIG5vdy4KLSAgICAgKiA8L1A+Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgdG9TdHJpbmdBc1YzMFBhcmFtVmFsdWUoU3RyaW5nIHZhbHVlKSB7Ci0gICAgICAgIHJldHVybiB0b1N0cmluZ0FzUGFyYW1WYWx1ZSh2YWx1ZSwgc0VzY2FwZUluZGljYXRvcnNWMzApOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIHRvU3RyaW5nQXNWNDBQYXJhbVZhbHVlKFN0cmluZyB2YWx1ZSkgewotICAgICAgICByZXR1cm4gdG9TdHJpbmdBc1BhcmFtVmFsdWUodmFsdWUsIHNFc2NhcGVJbmRpY2F0b3JzVjQwKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgdG9TdHJpbmdBc1BhcmFtVmFsdWUoU3RyaW5nIHZhbHVlLCBmaW5hbCBpbnRbXSBlc2NhcGVJbmRpY2F0b3JzKSB7Ci0gICAgICAgIGlmIChUZXh0VXRpbHMuaXNFbXB0eSh2YWx1ZSkpIHsKLSAgICAgICAgICAgIHZhbHVlID0gIiI7Ci0gICAgICAgIH0KLSAgICAgICAgZmluYWwgaW50IGFzY2lpRmlyc3QgPSAweDIwOwotICAgICAgICBmaW5hbCBpbnQgYXNjaWlMYXN0ID0gMHg3RTsgIC8vIGluY2x1ZGVkCi0gICAgICAgIGZpbmFsIFN0cmluZ0J1aWxkZXIgYnVpbGRlciA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0gICAgICAgIGZpbmFsIGludCBsZW5ndGggPSB2YWx1ZS5sZW5ndGgoKTsKLSAgICAgICAgYm9vbGVhbiBuZWVkUXVvdGUgPSBmYWxzZTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkgPSB2YWx1ZS5vZmZzZXRCeUNvZGVQb2ludHMoaSwgMSkpIHsKLSAgICAgICAgICAgIGZpbmFsIGludCBjb2RlUG9pbnQgPSB2YWx1ZS5jb2RlUG9pbnRBdChpKTsKLSAgICAgICAgICAgIGlmIChjb2RlUG9pbnQgPCBhc2NpaUZpcnN0IHx8IGNvZGVQb2ludCA9PSAnIicpIHsKLSAgICAgICAgICAgICAgICAvLyBDVEwgY2hhcmFjdGVycyBhbmQgRFFVT1RFIGFyZSBuZXZlciBhY2NlcHRlZC4gUmVtb3ZlIHRoZW0uCi0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBidWlsZGVyLmFwcGVuZENvZGVQb2ludChjb2RlUG9pbnQpOwotICAgICAgICAgICAgZm9yIChpbnQgaW5kaWNhdG9yIDogZXNjYXBlSW5kaWNhdG9ycykgewotICAgICAgICAgICAgICAgIGlmIChjb2RlUG9pbnQgPT0gaW5kaWNhdG9yKSB7Ci0gICAgICAgICAgICAgICAgICAgIG5lZWRRdW90ZSA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGZpbmFsIFN0cmluZyByZXN1bHQgPSBidWlsZGVyLnRvU3RyaW5nKCk7Ci0gICAgICAgIHJldHVybiAoKHJlc3VsdC5pc0VtcHR5KCkgfHwgVkNhcmRVdGlscy5jb250YWluc09ubHlXaGl0ZVNwYWNlcyhyZXN1bHQpKQotICAgICAgICAgICAgICAgID8gIiIKLSAgICAgICAgICAgICAgICA6IChuZWVkUXVvdGUgPyAoJyInICsgcmVzdWx0ICsgJyInKQotICAgICAgICAgICAgICAgIDogcmVzdWx0KSk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgdG9IYWxmV2lkdGhTdHJpbmcoZmluYWwgU3RyaW5nIG9yZ1N0cmluZykgewotICAgICAgICBpZiAoVGV4dFV0aWxzLmlzRW1wdHkob3JnU3RyaW5nKSkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgZmluYWwgU3RyaW5nQnVpbGRlciBidWlsZGVyID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLSAgICAgICAgZmluYWwgaW50IGxlbmd0aCA9IG9yZ1N0cmluZy5sZW5ndGgoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkgPSBvcmdTdHJpbmcub2Zmc2V0QnlDb2RlUG9pbnRzKGksIDEpKSB7Ci0gICAgICAgICAgICAvLyBBbGwgSmFwYW5lc2UgY2hhcmFjdGVyIGlzIGFibGUgdG8gYmUgZXhwcmVzc2VkIGJ5IGNoYXIuCi0gICAgICAgICAgICAvLyBEbyBub3QgbmVlZCB0byB1c2UgU3RyaW5nI2NvZGVwUG9pbnRBdCgpLgotICAgICAgICAgICAgZmluYWwgY2hhciBjaCA9IG9yZ1N0cmluZy5jaGFyQXQoaSk7Ci0gICAgICAgICAgICBmaW5hbCBTdHJpbmcgaGFsZldpZHRoVGV4dCA9IEphcGFuZXNlVXRpbHMudHJ5R2V0SGFsZldpZHRoVGV4dChjaCk7Ci0gICAgICAgICAgICBpZiAoaGFsZldpZHRoVGV4dCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoaGFsZldpZHRoVGV4dCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKGNoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gYnVpbGRlci50b1N0cmluZygpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEd1ZXNzZXMgdGhlIGZvcm1hdCBvZiBpbnB1dCBpbWFnZS4gQ3VycmVudGx5IGp1c3QgdGhlIGZpcnN0IGZldyBieXRlcyBhcmUgdXNlZC4KLSAgICAgKiBUaGUgdHlwZSAiR0lGIiwgIlBORyIsIG9yICJKUEVHIiBpcyByZXR1cm5lZCB3aGVuIHBvc3NpYmxlLiBSZXR1cm5zIG51bGwgd2hlbgotICAgICAqIHRoZSBndWVzcyBmYWlsZWQuCi0gICAgICogQHBhcmFtIGlucHV0IEltYWdlIGFzIGJ5dGUgYXJyYXkuCi0gICAgICogQHJldHVybiBUaGUgaW1hZ2UgdHlwZSBvciBudWxsIHdoZW4gdGhlIHR5cGUgY2Fubm90IGJlIGRldGVybWluZWQuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ3Vlc3NJbWFnZVR5cGUoZmluYWwgYnl0ZVtdIGlucHV0KSB7Ci0gICAgICAgIGlmIChpbnB1dCA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgICAgICBpZiAoaW5wdXQubGVuZ3RoID49IDMgJiYgaW5wdXRbMF0gPT0gJ0cnICYmIGlucHV0WzFdID09ICdJJyAmJiBpbnB1dFsyXSA9PSAnRicpIHsKLSAgICAgICAgICAgIHJldHVybiAiR0lGIjsKLSAgICAgICAgfSBlbHNlIGlmIChpbnB1dC5sZW5ndGggPj0gNCAmJiBpbnB1dFswXSA9PSAoYnl0ZSkgMHg4OQotICAgICAgICAgICAgICAgICYmIGlucHV0WzFdID09ICdQJyAmJiBpbnB1dFsyXSA9PSAnTicgJiYgaW5wdXRbM10gPT0gJ0cnKSB7Ci0gICAgICAgICAgICAvLyBOb3RlOiB2Q2FyZCAyLjEgb2ZmaWNpYWxseSBkb2VzIG5vdCBzdXBwb3J0IFBORywgYnV0IHdlIG1heSBoYXZlIGl0IGFuZAotICAgICAgICAgICAgLy8gICAgICAgdXNpbmcgWC0gd29yZCBsaWtlICJYLVBORyIgbWF5IG5vdCBsZXQgaW1wb3J0ZXJzIGtub3cgaXQgaXMgUE5HLgotICAgICAgICAgICAgLy8gICAgICAgU28gd2UgdXNlIHRoZSBTdHJpbmcgIlBORyIgYXMgaXMuLi4KLSAgICAgICAgICAgIHJldHVybiAiUE5HIjsKLSAgICAgICAgfSBlbHNlIGlmIChpbnB1dC5sZW5ndGggPj0gMiAmJiBpbnB1dFswXSA9PSAoYnl0ZSkgMHhmZgotICAgICAgICAgICAgICAgICYmIGlucHV0WzFdID09IChieXRlKSAweGQ4KSB7Ci0gICAgICAgICAgICByZXR1cm4gIkpQRUciOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIFRydWUgd2hlbiBhbGwgdGhlIGdpdmVuIHZhbHVlcyBhcmUgbnVsbCBvciBlbXB0eSBTdHJpbmdzLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBhcmVBbGxFbXB0eShmaW5hbCBTdHJpbmcuLi52YWx1ZXMpIHsKLSAgICAgICAgaWYgKHZhbHVlcyA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIGZvciAoZmluYWwgU3RyaW5nIHZhbHVlIDogdmFsdWVzKSB7Ci0gICAgICAgICAgICBpZiAoIVRleHRVdGlscy5pc0VtcHR5KHZhbHVlKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICAvLy8vIFRoZSBtZXRob2RzIGJlbGxvdyBtYXkgYmUgdXNlZCBieSB1bml0IHRlc3QuCi0KLSAgICAvKioKLSAgICAgKiBVbnF1b3RlcyBnaXZlbiBRdW90ZWQtUHJpbnRhYmxlIHZhbHVlLiB2YWx1ZSBtdXN0IG5vdCBiZSBudWxsLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIHBhcnNlUXVvdGVkUHJpbnRhYmxlKAotICAgICAgICAgICAgZmluYWwgU3RyaW5nIHZhbHVlLCBib29sZWFuIHN0cmljdExpbmVCcmVha2luZywKLSAgICAgICAgICAgIFN0cmluZyBzb3VyY2VDaGFyc2V0LCBTdHJpbmcgdGFyZ2V0Q2hhcnNldCkgewotICAgICAgICAvLyAiPSAiIC0+ICIgIiwgIj1cdCIgLT4gIlx0Ii4KLSAgICAgICAgLy8gUHJldmlvdXMgY29kZSBoYWQgZG9uZSB0aGlzIHJlcGxhY2VtZW50LiBLZWVwIG9uIHRoZSBzYWZlIHNpZGUuCi0gICAgICAgIGZpbmFsIFN0cmluZyBxdW90ZWRQcmludGFibGU7Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZ0J1aWxkZXIgYnVpbGRlciA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0gICAgICAgICAgICBmaW5hbCBpbnQgbGVuZ3RoID0gdmFsdWUubGVuZ3RoKCk7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgY2hhciBjaCA9IHZhbHVlLmNoYXJBdChpKTsKLSAgICAgICAgICAgICAgICBpZiAoY2ggPT0gJz0nICYmIGkgPCBsZW5ndGggLSAxKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNoYXIgbmV4dENoID0gdmFsdWUuY2hhckF0KGkgKyAxKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG5leHRDaCA9PSAnICcgfHwgbmV4dENoID09ICdcdCcpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKG5leHRDaCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpKys7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBidWlsZGVyLmFwcGVuZChjaCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBxdW90ZWRQcmludGFibGUgPSBidWlsZGVyLnRvU3RyaW5nKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBTdHJpbmdbXSBsaW5lczsKLSAgICAgICAgaWYgKHN0cmljdExpbmVCcmVha2luZykgewotICAgICAgICAgICAgbGluZXMgPSBxdW90ZWRQcmludGFibGUuc3BsaXQoIlxyXG4iKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIFN0cmluZ0J1aWxkZXIgYnVpbGRlciA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0gICAgICAgICAgICBmaW5hbCBpbnQgbGVuZ3RoID0gcXVvdGVkUHJpbnRhYmxlLmxlbmd0aCgpOwotICAgICAgICAgICAgQXJyYXlMaXN0PFN0cmluZz4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgIGNoYXIgY2ggPSBxdW90ZWRQcmludGFibGUuY2hhckF0KGkpOwotICAgICAgICAgICAgICAgIGlmIChjaCA9PSAnXG4nKSB7Ci0gICAgICAgICAgICAgICAgICAgIGxpc3QuYWRkKGJ1aWxkZXIudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY2ggPT0gJ1xyJykgewotICAgICAgICAgICAgICAgICAgICBsaXN0LmFkZChidWlsZGVyLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgICAgICAgICBidWlsZGVyID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGkgPCBsZW5ndGggLSAxKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjaGFyIG5leHRDaCA9IHF1b3RlZFByaW50YWJsZS5jaGFyQXQoaSArIDEpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5leHRDaCA9PSAnXG4nKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaSsrOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoY2gpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyBsYXN0TGluZSA9IGJ1aWxkZXIudG9TdHJpbmcoKTsKLSAgICAgICAgICAgIGlmIChsYXN0TGluZS5sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICAgICAgICBsaXN0LmFkZChsYXN0TGluZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBsaW5lcyA9IGxpc3QudG9BcnJheShuZXcgU3RyaW5nWzBdKTsKLSAgICAgICAgfQotCi0gICAgICAgIGZpbmFsIFN0cmluZ0J1aWxkZXIgYnVpbGRlciA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0gICAgICAgIGZvciAoU3RyaW5nIGxpbmUgOiBsaW5lcykgewotICAgICAgICAgICAgaWYgKGxpbmUuZW5kc1dpdGgoIj0iKSkgewotICAgICAgICAgICAgICAgIGxpbmUgPSBsaW5lLnN1YnN0cmluZygwLCBsaW5lLmxlbmd0aCgpIC0gMSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBidWlsZGVyLmFwcGVuZChsaW5lKTsKLSAgICAgICAgfQotCi0gICAgICAgIGZpbmFsIFN0cmluZyByYXdTdHJpbmcgPSBidWlsZGVyLnRvU3RyaW5nKCk7Ci0gICAgICAgIGlmIChUZXh0VXRpbHMuaXNFbXB0eShyYXdTdHJpbmcpKSB7Ci0gICAgICAgICAgICBMb2cudyhMT0dfVEFHLCAiR2l2ZW4gcmF3IHN0cmluZyBpcyBlbXB0eS4iKTsKLSAgICAgICAgfQotCi0gICAgICAgIGJ5dGVbXSByYXdCeXRlcyA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByYXdCeXRlcyA9IHJhd1N0cmluZy5nZXRCeXRlcyhzb3VyY2VDaGFyc2V0KTsgCi0gICAgICAgIH0gY2F0Y2ggKFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgTG9nLncoTE9HX1RBRywgIkZhaWxlZCB0byBkZWNvZGU6ICIgKyBzb3VyY2VDaGFyc2V0KTsKLSAgICAgICAgICAgIHJhd0J5dGVzID0gcmF3U3RyaW5nLmdldEJ5dGVzKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBieXRlW10gZGVjb2RlZEJ5dGVzID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGRlY29kZWRCeXRlcyA9IFF1b3RlZFByaW50YWJsZUNvZGVjLmRlY29kZVF1b3RlZFByaW50YWJsZShyYXdCeXRlcyk7Ci0gICAgICAgIH0gY2F0Y2ggKERlY29kZXJFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgTG9nLmUoTE9HX1RBRywgIkRlY29kZXJFeGNlcHRpb24gaXMgdGhyb3duLiIpOwotICAgICAgICAgICAgZGVjb2RlZEJ5dGVzID0gcmF3Qnl0ZXM7Ci0gICAgICAgIH0KLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmcoZGVjb2RlZEJ5dGVzLCB0YXJnZXRDaGFyc2V0KTsKLSAgICAgICAgfSBjYXRjaCAoVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBMb2cuZShMT0dfVEFHLCAiRmFpbGVkIHRvIGVuY29kZTogY2hhcnNldD0iICsgdGFyZ2V0Q2hhcnNldCk7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IFN0cmluZyhkZWNvZGVkQnl0ZXMpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBWQ2FyZFBhcnNlciBnZXRBcHByb3ByaWF0ZVBhcnNlcihpbnQgdmNhcmRUeXBlKQotICAgICAgICAgICAgdGhyb3dzIFZDYXJkRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKFZDYXJkQ29uZmlnLmlzVmVyc2lvbjIxKHZjYXJkVHlwZSkpIHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgVkNhcmRQYXJzZXJfVjIxKCk7Ci0gICAgICAgIH0gZWxzZSBpZiAoVkNhcmRDb25maWcuaXNWZXJzaW9uMzAodmNhcmRUeXBlKSkgewotICAgICAgICAgICAgcmV0dXJuIG5ldyBWQ2FyZFBhcnNlcl9WMzAoKTsKLSAgICAgICAgfSBlbHNlIGlmIChWQ2FyZENvbmZpZy5pc1ZlcnNpb240MCh2Y2FyZFR5cGUpKSB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IFZDYXJkUGFyc2VyX1Y0MCgpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdGhyb3cgbmV3IFZDYXJkRXhjZXB0aW9uKCJWZXJzaW9uIGlzIG5vdCBzcGVjaWZpZWQiKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGNvbnZlcnRTdHJpbmdDaGFyc2V0KAotICAgICAgICAgICAgU3RyaW5nIG9yaWdpbmFsU3RyaW5nLCBTdHJpbmcgc291cmNlQ2hhcnNldCwgU3RyaW5nIHRhcmdldENoYXJzZXQpIHsKLSAgICAgICAgaWYgKHNvdXJjZUNoYXJzZXQuZXF1YWxzSWdub3JlQ2FzZSh0YXJnZXRDaGFyc2V0KSkgewotICAgICAgICAgICAgcmV0dXJuIG9yaWdpbmFsU3RyaW5nOwotICAgICAgICB9Ci0gICAgICAgIGZpbmFsIENoYXJzZXQgY2hhcnNldCA9IENoYXJzZXQuZm9yTmFtZShzb3VyY2VDaGFyc2V0KTsKLSAgICAgICAgZmluYWwgQnl0ZUJ1ZmZlciBieXRlQnVmZmVyID0gY2hhcnNldC5lbmNvZGUob3JpZ2luYWxTdHJpbmcpOwotICAgICAgICAvLyBieXRlQnVmZmVyLmFycmF5KCkgIm1heSIgcmV0dXJuIGJ5dGUgYXJyYXkgd2hpY2ggaXMgbGFyZ2VyIHRoYW4KLSAgICAgICAgLy8gYnl0ZUJ1ZmZlci5yZW1haW5pbmcoKS4gSGVyZSwgd2Uga2VlcCBvbiB0aGUgc2FmZSBzaWRlLgotICAgICAgICBmaW5hbCBieXRlW10gYnl0ZXMgPSBuZXcgYnl0ZVtieXRlQnVmZmVyLnJlbWFpbmluZygpXTsKLSAgICAgICAgYnl0ZUJ1ZmZlci5nZXQoYnl0ZXMpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmcoYnl0ZXMsIHRhcmdldENoYXJzZXQpOwotICAgICAgICB9IGNhdGNoIChVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIExvZy5lKExPR19UQUcsICJGYWlsZWQgdG8gZW5jb2RlOiBjaGFyc2V0PSIgKyB0YXJnZXRDaGFyc2V0KTsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8gVE9ETzogdXRpbGl0aWVzIGZvciB2Q2FyZCA0LjA6IGRhdGV0aW1lLCB0aW1lc3RhbXAsIGludGVnZXIsIGZsb2F0LCBhbmQgYm9vbGVhbgotCi0gICAgcHJpdmF0ZSBWQ2FyZFV0aWxzKCkgewotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3BpbS92Y2FyZC9leGNlcHRpb24vVkNhcmRBZ2VudE5vdFN1cHBvcnRlZEV4Y2VwdGlvbi5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvcGltL3ZjYXJkL2V4Y2VwdGlvbi9WQ2FyZEFnZW50Tm90U3VwcG9ydGVkRXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU3MmM3ZGYuLjAwMDAwMDAKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvcGltL3ZjYXJkL2V4Y2VwdGlvbi9WQ2FyZEFnZW50Tm90U3VwcG9ydGVkRXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2UgYW5kcm9pZC5waW0udmNhcmQuZXhjZXB0aW9uOwotCi1wdWJsaWMgY2xhc3MgVkNhcmRBZ2VudE5vdFN1cHBvcnRlZEV4Y2VwdGlvbiBleHRlbmRzIFZDYXJkTm90U3VwcG9ydGVkRXhjZXB0aW9uIHsKLSAgICBwdWJsaWMgVkNhcmRBZ2VudE5vdFN1cHBvcnRlZEV4Y2VwdGlvbigpIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgVkNhcmRBZ2VudE5vdFN1cHBvcnRlZEV4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSkgewotICAgICAgICBzdXBlcihtZXNzYWdlKTsKLSAgICB9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9waW0vdmNhcmQvZXhjZXB0aW9uL1ZDYXJkRXhjZXB0aW9uLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9waW0vdmNhcmQvZXhjZXB0aW9uL1ZDYXJkRXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU1NTcyMTkuLjAwMDAwMDAKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvcGltL3ZjYXJkL2V4Y2VwdGlvbi9WQ2FyZEV4Y2VwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIGFuZHJvaWQucGltLnZjYXJkLmV4Y2VwdGlvbjsKLQotcHVibGljIGNsYXNzIFZDYXJkRXhjZXB0aW9uIGV4dGVuZHMgamF2YS5sYW5nLkV4Y2VwdGlvbiB7Ci0gICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhIFZDYXJkRXhjZXB0aW9uIG9iamVjdAotICAgICAqLwotICAgIHB1YmxpYyBWQ2FyZEV4Y2VwdGlvbigpIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RzIGEgVkNhcmRFeGNlcHRpb24gb2JqZWN0Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gbWVzc2FnZSB0aGUgZXJyb3IgbWVzc2FnZQotICAgICAqLwotICAgIHB1YmxpYyBWQ2FyZEV4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSkgewotICAgICAgICBzdXBlcihtZXNzYWdlKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3BpbS92Y2FyZC9leGNlcHRpb24vVkNhcmRJbnZhbGlkQ29tbWVudExpbmVFeGNlcHRpb24uamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3BpbS92Y2FyZC9leGNlcHRpb24vVkNhcmRJbnZhbGlkQ29tbWVudExpbmVFeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjdkYjYyYy4uMDAwMDAwMAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9waW0vdmNhcmQvZXhjZXB0aW9uL1ZDYXJkSW52YWxpZENvbW1lbnRMaW5lRXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBhbmRyb2lkLnBpbS52Y2FyZC5leGNlcHRpb247Ci0KLS8qKgotICogVGhyb3duIHdoZW4gdGhlIHZDYXJkIGhhcyBzb21lIGxpbmUgc3RhcnRpbmcgd2l0aCAnIycuIEluIHRoZSBzcGVjaWZpY2F0aW9uLAotICogYm90aCB2Q2FyZCAyLjEgYW5kIHZDYXJkIDMuMCBkb2VzIG5vdCBhbGxvdyBzdWNoIGxpbmUsIGJ1dCBzb21lIGFjdHVhbCBleHBvcnRlciBlbWl0Ci0gKiBzdWNoIGxpbmVzLgotICovCi1wdWJsaWMgY2xhc3MgVkNhcmRJbnZhbGlkQ29tbWVudExpbmVFeGNlcHRpb24gZXh0ZW5kcyBWQ2FyZEludmFsaWRMaW5lRXhjZXB0aW9uIHsKLSAgICBwdWJsaWMgVkNhcmRJbnZhbGlkQ29tbWVudExpbmVFeGNlcHRpb24oKSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgfQotCi0gICAgcHVibGljIFZDYXJkSW52YWxpZENvbW1lbnRMaW5lRXhjZXB0aW9uKGZpbmFsIFN0cmluZyBtZXNzYWdlKSB7Ci0gICAgICAgIHN1cGVyKG1lc3NhZ2UpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3BpbS92Y2FyZC9leGNlcHRpb24vVkNhcmRJbnZhbGlkTGluZUV4Y2VwdGlvbi5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvcGltL3ZjYXJkL2V4Y2VwdGlvbi9WQ2FyZEludmFsaWRMaW5lRXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI4MDU4NGIuLjAwMDAwMDAKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvcGltL3ZjYXJkL2V4Y2VwdGlvbi9WQ2FyZEludmFsaWRMaW5lRXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2UgYW5kcm9pZC5waW0udmNhcmQuZXhjZXB0aW9uOwotCi0vKioKLSAqIFRocm93biB3aGVuIHRoZSB2Q2FyZCBoYXMgc29tZSBsaW5lIHN0YXJ0aW5nIHdpdGggJyMnLiBJbiB0aGUgc3BlY2lmaWNhdGlvbiwKLSAqIGJvdGggdkNhcmQgMi4xIGFuZCB2Q2FyZCAzLjAgZG9lcyBub3QgYWxsb3cgc3VjaCBsaW5lLCBidXQgc29tZSBhY3R1YWwgZXhwb3J0ZXIgZW1pdAotICogc3VjaCBsaW5lcy4KLSAqLwotcHVibGljIGNsYXNzIFZDYXJkSW52YWxpZExpbmVFeGNlcHRpb24gZXh0ZW5kcyBWQ2FyZEV4Y2VwdGlvbiB7Ci0gICAgcHVibGljIFZDYXJkSW52YWxpZExpbmVFeGNlcHRpb24oKSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgfQotCi0gICAgcHVibGljIFZDYXJkSW52YWxpZExpbmVFeGNlcHRpb24oZmluYWwgU3RyaW5nIG1lc3NhZ2UpIHsKLSAgICAgICAgc3VwZXIobWVzc2FnZSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvcGltL3ZjYXJkL2V4Y2VwdGlvbi9WQ2FyZE5lc3RlZEV4Y2VwdGlvbi5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvcGltL3ZjYXJkL2V4Y2VwdGlvbi9WQ2FyZE5lc3RlZEV4Y2VwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MDNjMmZiLi4wMDAwMDAwCi0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3BpbS92Y2FyZC9leGNlcHRpb24vVkNhcmROZXN0ZWRFeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGFuZHJvaWQucGltLnZjYXJkLmV4Y2VwdGlvbjsKLQotLyoqCi0gKiBWQ2FyZEV4Y2VwdGlvbiB0aHJvd24gd2hlbiBWQ2FyZCBpcyBuZXN0ZWQgd2l0aG91dCBWQ2FyZFBhcnNlcidzIGJlaW5nIG5vdGlmaWVkLgotICovCi1wdWJsaWMgY2xhc3MgVkNhcmROZXN0ZWRFeGNlcHRpb24gZXh0ZW5kcyBWQ2FyZE5vdFN1cHBvcnRlZEV4Y2VwdGlvbiB7Ci0gICAgcHVibGljIFZDYXJkTmVzdGVkRXhjZXB0aW9uKCkgewotICAgICAgICBzdXBlcigpOwotICAgIH0KLSAgICBwdWJsaWMgVkNhcmROZXN0ZWRFeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UpIHsKLSAgICAgICAgc3VwZXIobWVzc2FnZSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvcGltL3ZjYXJkL2V4Y2VwdGlvbi9WQ2FyZE5vdFN1cHBvcnRlZEV4Y2VwdGlvbi5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvcGltL3ZjYXJkL2V4Y2VwdGlvbi9WQ2FyZE5vdFN1cHBvcnRlZEV4Y2VwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MTZhYTc3NjMuLjAwMDAwMDAKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvcGltL3ZjYXJkL2V4Y2VwdGlvbi9WQ2FyZE5vdFN1cHBvcnRlZEV4Y2VwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIGFuZHJvaWQucGltLnZjYXJkLmV4Y2VwdGlvbjsKLQotLyoqCi0gKiBUaGUgZXhjZXB0aW9uIHdoaWNoIHRlbGxzIHRoYXQgdGhlIGlucHV0IFZDYXJkIGlzIHByb2JhYmx5IHZhbGlkIGZyb20gdGhlIHZpZXcgb2YKLSAqIHNwZWNpZmljYXRpb24gYnV0IG5vdCBzdXBwb3J0ZWQgaW4gdGhlIGN1cnJlbnQgZnJhbWV3b3JrIGZvciBub3cuCi0gKiAKLSAqIFRoaXMgaXMgYSBraW5kIG9mIGEgZ29vZCBuZXdzIGZyb20gdGhlIHZpZXcgb2YgZGV2ZWxvcG1lbnQuCi0gKiBJdCBtYXkgYmUgZ29vZCB0byBhc2sgdXNlcnMgdG8gc2VuZCBhIHJlcG9ydCB3aXRoIHRoZSBWQ2FyZCBleGFtcGxlCi0gKiBmb3IgdGhlIGZ1dHVyZSBkZXZlbG9wbWVudC4KLSAqLwotcHVibGljIGNsYXNzIFZDYXJkTm90U3VwcG9ydGVkRXhjZXB0aW9uIGV4dGVuZHMgVkNhcmRFeGNlcHRpb24gewotICAgIHB1YmxpYyBWQ2FyZE5vdFN1cHBvcnRlZEV4Y2VwdGlvbigpIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICB9Ci0gICAgcHVibGljIFZDYXJkTm90U3VwcG9ydGVkRXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlKSB7Ci0gICAgICAgIHN1cGVyKG1lc3NhZ2UpOwotICAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9waW0vdmNhcmQvZXhjZXB0aW9uL1ZDYXJkVmVyc2lvbkV4Y2VwdGlvbi5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvcGltL3ZjYXJkL2V4Y2VwdGlvbi9WQ2FyZFZlcnNpb25FeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDcwOWZlNC4uMDAwMDAwMAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9waW0vdmNhcmQvZXhjZXB0aW9uL1ZDYXJkVmVyc2lvbkV4Y2VwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIGFuZHJvaWQucGltLnZjYXJkLmV4Y2VwdGlvbjsKLQotLyoqCi0gKiBWQ2FyZEV4Y2VwdGlvbiB1c2VkIG9ubHkgd2hlbiB0aGUgdmVyc2lvbiBvZiB0aGUgdkNhcmQgaXMgZGlmZmVyZW50LiAKLSAqLwotcHVibGljIGNsYXNzIFZDYXJkVmVyc2lvbkV4Y2VwdGlvbiBleHRlbmRzIFZDYXJkRXhjZXB0aW9uIHsKLSAgICBwdWJsaWMgVkNhcmRWZXJzaW9uRXhjZXB0aW9uKCkgewotICAgICAgICBzdXBlcigpOwotICAgIH0KLSAgICBwdWJsaWMgVkNhcmRWZXJzaW9uRXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlKSB7Ci0gICAgICAgIHN1cGVyKG1lc3NhZ2UpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3BpbS92Y2FyZC9leGNlcHRpb24vcGFja2FnZS5odG1sIGIvY29yZS9qYXZhL2FuZHJvaWQvcGltL3ZjYXJkL2V4Y2VwdGlvbi9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI2YjhhMzIuLjAwMDAwMDAKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvcGltL3ZjYXJkL2V4Y2VwdGlvbi9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTxIVE1MPgotPEJPRFk+Ci17QGhpZGV9Ci08L0JPRFk+Ci08L0hUTUw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvcGltL3ZjYXJkL3BhY2thZ2UuaHRtbCBiL2NvcmUvamF2YS9hbmRyb2lkL3BpbS92Y2FyZC9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI2YjhhMzIuLjAwMDAwMDAKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvcGltL3ZjYXJkL3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPEhUTUw+Ci08Qk9EWT4KLXtAaGlkZX0KLTwvQk9EWT4KLTwvSFRNTD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9wcmVmZXJlbmNlL011bHRpU2VsZWN0TGlzdFByZWZlcmVuY2UuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3ByZWZlcmVuY2UvTXVsdGlTZWxlY3RMaXN0UHJlZmVyZW5jZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQyZDU1NWNmCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvcHJlZmVyZW5jZS9NdWx0aVNlbGVjdExpc3RQcmVmZXJlbmNlLmphdmEKQEAgLTAsMCArMSwyNzQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQucHJlZmVyZW5jZTsKKworaW1wb3J0IGFuZHJvaWQuYXBwLkFsZXJ0RGlhbG9nLkJ1aWxkZXI7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkRpYWxvZ0ludGVyZmFjZTsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlR5cGVkQXJyYXk7CitpbXBvcnQgYW5kcm9pZC5vcy5QYXJjZWw7CitpbXBvcnQgYW5kcm9pZC5vcy5QYXJjZWxhYmxlOworaW1wb3J0IGFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQ7CisKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworCisvKioKKyAqIEEge0BsaW5rIFByZWZlcmVuY2V9IHRoYXQgZGlzcGxheXMgYSBsaXN0IG9mIGVudHJpZXMgYXMKKyAqIGEgZGlhbG9nLgorICogPHA+CisgKiBUaGlzIHByZWZlcmVuY2Ugd2lsbCBzdG9yZSBhIHNldCBvZiBzdHJpbmdzIGludG8gdGhlIFNoYXJlZFByZWZlcmVuY2VzLgorICogVGhpcyBzZXQgd2lsbCBjb250YWluIG9uZSBvciBtb3JlIHZhbHVlcyBmcm9tIHRoZQorICoge0BsaW5rICNzZXRFbnRyeVZhbHVlcyhDaGFyU2VxdWVuY2VbXSl9IGFycmF5LgorICogCisgKiBAYXR0ciByZWYgYW5kcm9pZC5SLnN0eWxlYWJsZSNNdWx0aVNlbGVjdExpc3RQcmVmZXJlbmNlX2VudHJpZXMKKyAqIEBhdHRyIHJlZiBhbmRyb2lkLlIuc3R5bGVhYmxlI011bHRpU2VsZWN0TGlzdFByZWZlcmVuY2VfZW50cnlWYWx1ZXMKKyAqLworcHVibGljIGNsYXNzIE11bHRpU2VsZWN0TGlzdFByZWZlcmVuY2UgZXh0ZW5kcyBEaWFsb2dQcmVmZXJlbmNlIHsKKyAgICBwcml2YXRlIENoYXJTZXF1ZW5jZVtdIG1FbnRyaWVzOworICAgIHByaXZhdGUgQ2hhclNlcXVlbmNlW10gbUVudHJ5VmFsdWVzOworICAgIHByaXZhdGUgU2V0PFN0cmluZz4gbVZhbHVlcyA9IG5ldyBIYXNoU2V0PFN0cmluZz4oKTsKKyAgICBwcml2YXRlIFNldDxTdHJpbmc+IG1OZXdWYWx1ZXMgPSBuZXcgSGFzaFNldDxTdHJpbmc+KCk7CisgICAgcHJpdmF0ZSBib29sZWFuIG1QcmVmZXJlbmNlQ2hhbmdlZDsKKyAgICAKKyAgICBwdWJsaWMgTXVsdGlTZWxlY3RMaXN0UHJlZmVyZW5jZShDb250ZXh0IGNvbnRleHQsIEF0dHJpYnV0ZVNldCBhdHRycykgeworICAgICAgICBzdXBlcihjb250ZXh0LCBhdHRycyk7CisgICAgICAgIAorICAgICAgICBUeXBlZEFycmF5IGEgPSBjb250ZXh0Lm9idGFpblN0eWxlZEF0dHJpYnV0ZXMoYXR0cnMsCisgICAgICAgICAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZWFibGUuTXVsdGlTZWxlY3RMaXN0UHJlZmVyZW5jZSwgMCwgMCk7CisgICAgICAgIG1FbnRyaWVzID0gYS5nZXRUZXh0QXJyYXkoY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZWFibGUuTXVsdGlTZWxlY3RMaXN0UHJlZmVyZW5jZV9lbnRyaWVzKTsKKyAgICAgICAgbUVudHJ5VmFsdWVzID0gYS5nZXRUZXh0QXJyYXkoY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZWFibGUuTXVsdGlTZWxlY3RMaXN0UHJlZmVyZW5jZV9lbnRyeVZhbHVlcyk7CisgICAgICAgIGEucmVjeWNsZSgpOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgTXVsdGlTZWxlY3RMaXN0UHJlZmVyZW5jZShDb250ZXh0IGNvbnRleHQpIHsKKyAgICAgICAgdGhpcyhjb250ZXh0LCBudWxsKTsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgaHVtYW4tcmVhZGFibGUgZW50cmllcyB0byBiZSBzaG93biBpbiB0aGUgbGlzdC4gVGhpcyB3aWxsIGJlCisgICAgICogc2hvd24gaW4gc3Vic2VxdWVudCBkaWFsb2dzLgorICAgICAqIDxwPgorICAgICAqIEVhY2ggZW50cnkgbXVzdCBoYXZlIGEgY29ycmVzcG9uZGluZyBpbmRleCBpbgorICAgICAqIHtAbGluayAjc2V0RW50cnlWYWx1ZXMoQ2hhclNlcXVlbmNlW10pfS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gZW50cmllcyBUaGUgZW50cmllcy4KKyAgICAgKiBAc2VlICNzZXRFbnRyeVZhbHVlcyhDaGFyU2VxdWVuY2VbXSkKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRFbnRyaWVzKENoYXJTZXF1ZW5jZVtdIGVudHJpZXMpIHsKKyAgICAgICAgbUVudHJpZXMgPSBlbnRyaWVzOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBAc2VlICNzZXRFbnRyaWVzKENoYXJTZXF1ZW5jZVtdKQorICAgICAqIEBwYXJhbSBlbnRyaWVzUmVzSWQgVGhlIGVudHJpZXMgYXJyYXkgYXMgYSByZXNvdXJjZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRFbnRyaWVzKGludCBlbnRyaWVzUmVzSWQpIHsKKyAgICAgICAgc2V0RW50cmllcyhnZXRDb250ZXh0KCkuZ2V0UmVzb3VyY2VzKCkuZ2V0VGV4dEFycmF5KGVudHJpZXNSZXNJZCkpOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBUaGUgbGlzdCBvZiBlbnRyaWVzIHRvIGJlIHNob3duIGluIHRoZSBsaXN0IGluIHN1YnNlcXVlbnQgZGlhbG9ncy4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIFRoZSBsaXN0IGFzIGFuIGFycmF5LgorICAgICAqLworICAgIHB1YmxpYyBDaGFyU2VxdWVuY2VbXSBnZXRFbnRyaWVzKCkgeworICAgICAgICByZXR1cm4gbUVudHJpZXM7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFRoZSBhcnJheSB0byBmaW5kIHRoZSB2YWx1ZSB0byBzYXZlIGZvciBhIHByZWZlcmVuY2Ugd2hlbiBhbiBlbnRyeSBmcm9tCisgICAgICogZW50cmllcyBpcyBzZWxlY3RlZC4gSWYgYSB1c2VyIGNsaWNrcyBvbiB0aGUgc2Vjb25kIGl0ZW0gaW4gZW50cmllcywgdGhlCisgICAgICogc2Vjb25kIGl0ZW0gaW4gdGhpcyBhcnJheSB3aWxsIGJlIHNhdmVkIHRvIHRoZSBwcmVmZXJlbmNlLgorICAgICAqIAorICAgICAqIEBwYXJhbSBlbnRyeVZhbHVlcyBUaGUgYXJyYXkgdG8gYmUgdXNlZCBhcyB2YWx1ZXMgdG8gc2F2ZSBmb3IgdGhlIHByZWZlcmVuY2UuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RW50cnlWYWx1ZXMoQ2hhclNlcXVlbmNlW10gZW50cnlWYWx1ZXMpIHsKKyAgICAgICAgbUVudHJ5VmFsdWVzID0gZW50cnlWYWx1ZXM7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHNlZSAjc2V0RW50cnlWYWx1ZXMoQ2hhclNlcXVlbmNlW10pCisgICAgICogQHBhcmFtIGVudHJ5VmFsdWVzUmVzSWQgVGhlIGVudHJ5IHZhbHVlcyBhcnJheSBhcyBhIHJlc291cmNlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEVudHJ5VmFsdWVzKGludCBlbnRyeVZhbHVlc1Jlc0lkKSB7CisgICAgICAgIHNldEVudHJ5VmFsdWVzKGdldENvbnRleHQoKS5nZXRSZXNvdXJjZXMoKS5nZXRUZXh0QXJyYXkoZW50cnlWYWx1ZXNSZXNJZCkpOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBhcnJheSBvZiB2YWx1ZXMgdG8gYmUgc2F2ZWQgZm9yIHRoZSBwcmVmZXJlbmNlLgorICAgICAqIAorICAgICAqIEByZXR1cm4gVGhlIGFycmF5IG9mIHZhbHVlcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgQ2hhclNlcXVlbmNlW10gZ2V0RW50cnlWYWx1ZXMoKSB7CisgICAgICAgIHJldHVybiBtRW50cnlWYWx1ZXM7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSBrZXkuIFRoaXMgc2hvdWxkIGNvbnRhaW4gZW50cmllcyBpbgorICAgICAqIHtAbGluayAjZ2V0RW50cnlWYWx1ZXMoKX0uCisgICAgICogCisgICAgICogQHBhcmFtIHZhbHVlcyBUaGUgdmFsdWVzIHRvIHNldCBmb3IgdGhlIGtleS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRWYWx1ZXMoU2V0PFN0cmluZz4gdmFsdWVzKSB7CisgICAgICAgIG1WYWx1ZXMgPSB2YWx1ZXM7CisgICAgICAgIAorICAgICAgICBwZXJzaXN0U3RyaW5nU2V0KHZhbHVlcyk7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFJldHJpZXZlcyB0aGUgY3VycmVudCB2YWx1ZSBvZiB0aGUga2V5LgorICAgICAqLworICAgIHB1YmxpYyBTZXQ8U3RyaW5nPiBnZXRWYWx1ZXMoKSB7CisgICAgICAgIHJldHVybiBtVmFsdWVzOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgZ2l2ZW4gdmFsdWUgKGluIHRoZSBlbnRyeSB2YWx1ZXMgYXJyYXkpLgorICAgICAqIAorICAgICAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUgd2hvc2UgaW5kZXggc2hvdWxkIGJlIHJldHVybmVkLgorICAgICAqIEByZXR1cm4gVGhlIGluZGV4IG9mIHRoZSB2YWx1ZSwgb3IgLTEgaWYgbm90IGZvdW5kLgorICAgICAqLworICAgIHB1YmxpYyBpbnQgZmluZEluZGV4T2ZWYWx1ZShTdHJpbmcgdmFsdWUpIHsKKyAgICAgICAgaWYgKHZhbHVlICE9IG51bGwgJiYgbUVudHJ5VmFsdWVzICE9IG51bGwpIHsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSBtRW50cnlWYWx1ZXMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHsKKyAgICAgICAgICAgICAgICBpZiAobUVudHJ5VmFsdWVzW2ldLmVxdWFscyh2YWx1ZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25QcmVwYXJlRGlhbG9nQnVpbGRlcihCdWlsZGVyIGJ1aWxkZXIpIHsKKyAgICAgICAgc3VwZXIub25QcmVwYXJlRGlhbG9nQnVpbGRlcihidWlsZGVyKTsKKyAgICAgICAgCisgICAgICAgIGlmIChtRW50cmllcyA9PSBudWxsIHx8IG1FbnRyeVZhbHVlcyA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAiTXVsdGlTZWxlY3RMaXN0UHJlZmVyZW5jZSByZXF1aXJlcyBhbiBlbnRyaWVzIGFycmF5IGFuZCAiICsKKyAgICAgICAgICAgICAgICAgICAgImFuIGVudHJ5VmFsdWVzIGFycmF5LiIpOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBib29sZWFuW10gY2hlY2tlZEl0ZW1zID0gZ2V0U2VsZWN0ZWRJdGVtcygpOworICAgICAgICBidWlsZGVyLnNldE11bHRpQ2hvaWNlSXRlbXMobUVudHJpZXMsIGNoZWNrZWRJdGVtcywKKyAgICAgICAgICAgICAgICBuZXcgRGlhbG9nSW50ZXJmYWNlLk9uTXVsdGlDaG9pY2VDbGlja0xpc3RlbmVyKCkgeworICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkNsaWNrKERpYWxvZ0ludGVyZmFjZSBkaWFsb2csIGludCB3aGljaCwgYm9vbGVhbiBpc0NoZWNrZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpc0NoZWNrZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtUHJlZmVyZW5jZUNoYW5nZWQgfD0gbU5ld1ZhbHVlcy5hZGQobUVudHJpZXNbd2hpY2hdLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtUHJlZmVyZW5jZUNoYW5nZWQgfD0gbU5ld1ZhbHVlcy5yZW1vdmUobUVudHJpZXNbd2hpY2hdLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSk7CisgICAgICAgIG1OZXdWYWx1ZXMuY2xlYXIoKTsKKyAgICAgICAgbU5ld1ZhbHVlcy5hZGRBbGwobVZhbHVlcyk7CisgICAgfQorICAgIAorICAgIHByaXZhdGUgYm9vbGVhbltdIGdldFNlbGVjdGVkSXRlbXMoKSB7CisgICAgICAgIGZpbmFsIENoYXJTZXF1ZW5jZVtdIGVudHJpZXMgPSBtRW50cmllczsKKyAgICAgICAgZmluYWwgaW50IGVudHJ5Q291bnQgPSBlbnRyaWVzLmxlbmd0aDsKKyAgICAgICAgZmluYWwgU2V0PFN0cmluZz4gdmFsdWVzID0gbVZhbHVlczsKKyAgICAgICAgYm9vbGVhbltdIHJlc3VsdCA9IG5ldyBib29sZWFuW2VudHJ5Q291bnRdOworICAgICAgICAKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBlbnRyeUNvdW50OyBpKyspIHsKKyAgICAgICAgICAgIHJlc3VsdFtpXSA9IHZhbHVlcy5jb250YWlucyhlbnRyaWVzW2ldLnRvU3RyaW5nKCkpOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKyAgICAKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvbkRpYWxvZ0Nsb3NlZChib29sZWFuIHBvc2l0aXZlUmVzdWx0KSB7CisgICAgICAgIHN1cGVyLm9uRGlhbG9nQ2xvc2VkKHBvc2l0aXZlUmVzdWx0KTsKKyAgICAgICAgCisgICAgICAgIGlmIChwb3NpdGl2ZVJlc3VsdCAmJiBtUHJlZmVyZW5jZUNoYW5nZWQpIHsKKyAgICAgICAgICAgIGZpbmFsIFNldDxTdHJpbmc+IHZhbHVlcyA9IG1OZXdWYWx1ZXM7CisgICAgICAgICAgICBpZiAoY2FsbENoYW5nZUxpc3RlbmVyKHZhbHVlcykpIHsKKyAgICAgICAgICAgICAgICBzZXRWYWx1ZXModmFsdWVzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBtUHJlZmVyZW5jZUNoYW5nZWQgPSBmYWxzZTsKKyAgICB9CisgICAgCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIE9iamVjdCBvbkdldERlZmF1bHRWYWx1ZShUeXBlZEFycmF5IGEsIGludCBpbmRleCkgeworICAgICAgICBmaW5hbCBDaGFyU2VxdWVuY2VbXSBkZWZhdWx0VmFsdWVzID0gYS5nZXRUZXh0QXJyYXkoaW5kZXgpOworICAgICAgICBmaW5hbCBpbnQgdmFsdWVDb3VudCA9IGRlZmF1bHRWYWx1ZXMubGVuZ3RoOworICAgICAgICBmaW5hbCBTZXQ8U3RyaW5nPiByZXN1bHQgPSBuZXcgSGFzaFNldDxTdHJpbmc+KCk7CisgICAgICAgIAorICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHZhbHVlQ291bnQ7IGkrKykgeworICAgICAgICAgICAgcmVzdWx0LmFkZChkZWZhdWx0VmFsdWVzW2ldLnRvU3RyaW5nKCkpOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKyAgICAKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvblNldEluaXRpYWxWYWx1ZShib29sZWFuIHJlc3RvcmVWYWx1ZSwgT2JqZWN0IGRlZmF1bHRWYWx1ZSkgeworICAgICAgICBzZXRWYWx1ZXMocmVzdG9yZVZhbHVlID8gZ2V0UGVyc2lzdGVkU3RyaW5nU2V0KG1WYWx1ZXMpIDogKFNldDxTdHJpbmc+KSBkZWZhdWx0VmFsdWUpOworICAgIH0KKyAgICAKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgUGFyY2VsYWJsZSBvblNhdmVJbnN0YW5jZVN0YXRlKCkgeworICAgICAgICBmaW5hbCBQYXJjZWxhYmxlIHN1cGVyU3RhdGUgPSBzdXBlci5vblNhdmVJbnN0YW5jZVN0YXRlKCk7CisgICAgICAgIGlmIChpc1BlcnNpc3RlbnQoKSkgeworICAgICAgICAgICAgLy8gTm8gbmVlZCB0byBzYXZlIGluc3RhbmNlIHN0YXRlCisgICAgICAgICAgICByZXR1cm4gc3VwZXJTdGF0ZTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgZmluYWwgU2F2ZWRTdGF0ZSBteVN0YXRlID0gbmV3IFNhdmVkU3RhdGUoc3VwZXJTdGF0ZSk7CisgICAgICAgIG15U3RhdGUudmFsdWVzID0gZ2V0VmFsdWVzKCk7CisgICAgICAgIHJldHVybiBteVN0YXRlOworICAgIH0KKyAgICAKKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBTYXZlZFN0YXRlIGV4dGVuZHMgQmFzZVNhdmVkU3RhdGUgeworICAgICAgICBTZXQ8U3RyaW5nPiB2YWx1ZXM7CisgICAgICAgIAorICAgICAgICBwdWJsaWMgU2F2ZWRTdGF0ZShQYXJjZWwgc291cmNlKSB7CisgICAgICAgICAgICBzdXBlcihzb3VyY2UpOworICAgICAgICAgICAgdmFsdWVzID0gbmV3IEhhc2hTZXQ8U3RyaW5nPigpOworICAgICAgICAgICAgU3RyaW5nW10gc3RyaW5ncyA9IHNvdXJjZS5yZWFkU3RyaW5nQXJyYXkoKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgZmluYWwgaW50IHN0cmluZ0NvdW50ID0gc3RyaW5ncy5sZW5ndGg7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHN0cmluZ0NvdW50OyBpKyspIHsKKyAgICAgICAgICAgICAgICB2YWx1ZXMuYWRkKHN0cmluZ3NbaV0pOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIAorICAgICAgICBwdWJsaWMgU2F2ZWRTdGF0ZShQYXJjZWxhYmxlIHN1cGVyU3RhdGUpIHsKKyAgICAgICAgICAgIHN1cGVyKHN1cGVyU3RhdGUpOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgd3JpdGVUb1BhcmNlbChQYXJjZWwgZGVzdCwgaW50IGZsYWdzKSB7CisgICAgICAgICAgICBzdXBlci53cml0ZVRvUGFyY2VsKGRlc3QsIGZsYWdzKTsKKyAgICAgICAgICAgIGRlc3Qud3JpdGVTdHJpbmdBcnJheSh2YWx1ZXMudG9BcnJheShuZXcgU3RyaW5nWzBdKSk7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgUGFyY2VsYWJsZS5DcmVhdG9yPFNhdmVkU3RhdGU+IENSRUFUT1IgPQorICAgICAgICAgICAgICAgIG5ldyBQYXJjZWxhYmxlLkNyZWF0b3I8U2F2ZWRTdGF0ZT4oKSB7CisgICAgICAgICAgICBwdWJsaWMgU2F2ZWRTdGF0ZSBjcmVhdGVGcm9tUGFyY2VsKFBhcmNlbCBpbikgeworICAgICAgICAgICAgICAgIHJldHVybiBuZXcgU2F2ZWRTdGF0ZShpbik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAKKyAgICAgICAgICAgIHB1YmxpYyBTYXZlZFN0YXRlW10gbmV3QXJyYXkoaW50IHNpemUpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFNhdmVkU3RhdGVbc2l6ZV07CisgICAgICAgICAgICB9CisgICAgICAgIH07CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvcHJlZmVyZW5jZS9QcmVmZXJlbmNlLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9wcmVmZXJlbmNlL1ByZWZlcmVuY2UuamF2YQppbmRleCBkZGU2NDkzLi4xN2IyZTgyIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9wcmVmZXJlbmNlL1ByZWZlcmVuY2UuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9wcmVmZXJlbmNlL1ByZWZlcmVuY2UuamF2YQpAQCAtMTYsOCArMTYsNyBAQAogCiBwYWNrYWdlIGFuZHJvaWQucHJlZmVyZW5jZTsKIAotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudXRpbC5DaGFyU2VxdWVuY2VzOwogCiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKQEAgLTI4LDcgKzI3LDYgQEAKIGltcG9ydCBhbmRyb2lkLm9zLlBhcmNlbGFibGU7CiBpbXBvcnQgYW5kcm9pZC50ZXh0LlRleHRVdGlsczsKIGltcG9ydCBhbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0OwotaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnV0aWwuQ2hhclNlcXVlbmNlczsKIGltcG9ydCBhbmRyb2lkLnZpZXcuQWJzU2F2ZWRTdGF0ZTsKIGltcG9ydCBhbmRyb2lkLnZpZXcuTGF5b3V0SW5mbGF0ZXI7CiBpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CkBAIC0zNiw2ICszNCwxMCBAQAogaW1wb3J0IGFuZHJvaWQud2lkZ2V0Lkxpc3RWaWV3OwogaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlRleHRWaWV3OwogCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworCiAvKioKICAqIFJlcHJlc2VudHMgdGhlIGJhc2ljIFByZWZlcmVuY2UgVUkgYnVpbGRpbmcKICAqIGJsb2NrIGRpc3BsYXllZCBieSBhIHtAbGluayBQcmVmZXJlbmNlQWN0aXZpdHl9IGluIHRoZSBmb3JtIG9mIGEKQEAgLTU0LDYgKzU2LDcgQEAKICAqIEBhdHRyIHJlZiBhbmRyb2lkLlIuc3R5bGVhYmxlI1ByZWZlcmVuY2VfdGl0bGUKICAqIEBhdHRyIHJlZiBhbmRyb2lkLlIuc3R5bGVhYmxlI1ByZWZlcmVuY2Vfc3VtbWFyeQogICogQGF0dHIgcmVmIGFuZHJvaWQuUi5zdHlsZWFibGUjUHJlZmVyZW5jZV9vcmRlcgorICogQGF0dHIgcmVmIGFuZHJvaWQuUi5zdHlsZWFibGUjUHJlZmVyZW5jZV9mcmFnbWVudAogICogQGF0dHIgcmVmIGFuZHJvaWQuUi5zdHlsZWFibGUjUHJlZmVyZW5jZV9sYXlvdXQKICAqIEBhdHRyIHJlZiBhbmRyb2lkLlIuc3R5bGVhYmxlI1ByZWZlcmVuY2Vfd2lkZ2V0TGF5b3V0CiAgKiBAYXR0ciByZWYgYW5kcm9pZC5SLnN0eWxlYWJsZSNQcmVmZXJlbmNlX2VuYWJsZWQKQEAgLTg2LDYgKzg5LDggQEAKICAgICBwcml2YXRlIENoYXJTZXF1ZW5jZSBtU3VtbWFyeTsKICAgICBwcml2YXRlIFN0cmluZyBtS2V5OwogICAgIHByaXZhdGUgSW50ZW50IG1JbnRlbnQ7CisgICAgcHJpdmF0ZSBTdHJpbmcgbUZyYWdtZW50OworICAgIHByaXZhdGUgQnVuZGxlIG1FeHRyYXM7CiAgICAgcHJpdmF0ZSBib29sZWFuIG1FbmFibGVkID0gdHJ1ZTsKICAgICBwcml2YXRlIGJvb2xlYW4gbVNlbGVjdGFibGUgPSB0cnVlOwogICAgIHByaXZhdGUgYm9vbGVhbiBtUmVxdWlyZXNLZXk7CkBAIC0yMDgsNiArMjEzLDEwIEBACiAgICAgICAgICAgICAgICAgICAgIG1PcmRlciA9IGEuZ2V0SW50KGF0dHIsIG1PcmRlcik7CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogCisgICAgICAgICAgICAgICAgY2FzZSBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZS5QcmVmZXJlbmNlX2ZyYWdtZW50OgorICAgICAgICAgICAgICAgICAgICBtRnJhZ21lbnQgPSBhLmdldFN0cmluZyhhdHRyKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKICAgICAgICAgICAgICAgICBjYXNlIGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLlByZWZlcmVuY2VfbGF5b3V0OgogICAgICAgICAgICAgICAgICAgICBtTGF5b3V0UmVzSWQgPSBhLmdldFJlc291cmNlSWQoYXR0ciwgbUxheW91dFJlc0lkKTsKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CkBAIC0zMTMsNiArMzIyLDQ0IEBACiAgICAgfQogCiAgICAgLyoqCisgICAgICogU2V0cyB0aGUgY2xhc3MgbmFtZSBvZiBhIGZyYWdtZW50IHRvIGJlIHNob3duIHdoZW4gdGhpcyBQcmVmZXJlbmNlIGlzIGNsaWNrZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZnJhZ21lbnQgVGhlIGNsYXNzIG5hbWUgb2YgdGhlIGZyYWdtZW50IGFzc29jaWF0ZWQgd2l0aCB0aGlzIFByZWZlcmVuY2UuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RnJhZ21lbnQoU3RyaW5nIGZyYWdtZW50KSB7CisgICAgICAgIG1GcmFnbWVudCA9IGZyYWdtZW50OworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgZnJhZ21lbnQgY2xhc3MgbmFtZSBhc3NvY2lhdGVkIHdpdGggdGhpcyBQcmVmZXJlbmNlLgorICAgICAqCisgICAgICogQHJldHVybiBUaGUgZnJhZ21lbnQgY2xhc3MgbmFtZSBsYXN0IHNldCB2aWEge0BsaW5rICNzZXRGcmFnbWVudH0gb3IgWE1MLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0RnJhZ21lbnQoKSB7CisgICAgICAgIHJldHVybiBtRnJhZ21lbnQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBleHRyYXMgQnVuZGxlIG9iamVjdCBhc3NvY2lhdGVkIHdpdGggdGhpcyBwcmVmZXJlbmNlLCBjcmVhdGluZworICAgICAqIGEgbmV3IEJ1bmRsZSBpZiB0aGVyZSBjdXJyZW50bHkgaXNuJ3Qgb25lLiAgWW91IGNhbiB1c2UgdGhpcyB0byBnZXQgYW5kCisgICAgICogc2V0IGluZGl2aWR1YWwgZXh0cmEga2V5L3ZhbHVlIHBhaXJzLgorICAgICAqLworICAgIHB1YmxpYyBCdW5kbGUgZ2V0RXh0cmFzKCkgeworICAgICAgICBpZiAobUV4dHJhcyA9PSBudWxsKSB7CisgICAgICAgICAgICBtRXh0cmFzID0gbmV3IEJ1bmRsZSgpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBtRXh0cmFzOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgZXh0cmFzIEJ1bmRsZSBvYmplY3QgYXNzb2NpYXRlZCB3aXRoIHRoaXMgcHJlZmVyZW5jZSwKKyAgICAgKiByZXR1cm5pbmcgbnVsbCBpZiB0aGVyZSBpcyBub3QgY3VycmVudGx5IG9uZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgQnVuZGxlIHBlZWtFeHRyYXMoKSB7CisgICAgICAgIHJldHVybiBtRXh0cmFzOworICAgIH0KKworICAgIC8qKgogICAgICAqIFNldHMgdGhlIGxheW91dCByZXNvdXJjZSB0aGF0IGlzIGluZmxhdGVkIGFzIHRoZSB7QGxpbmsgVmlld30gdG8gYmUgc2hvd24KICAgICAgKiBmb3IgdGhpcyBQcmVmZXJlbmNlLiBJbiBtb3N0IGNhc2VzLCB0aGUgZGVmYXVsdCBsYXlvdXQgaXMgc3VmZmljaWVudCBmb3IKICAgICAgKiBjdXN0b20gUHJlZmVyZW5jZSBvYmplY3RzIGFuZCBvbmx5IHRoZSB3aWRnZXQgbGF5b3V0IG5lZWRzIHRvIGJlIGNoYW5nZWQuCkBAIC0xMjUwLDYgKzEyOTcsNjEgQEAKICAgICB9CiAgICAgCiAgICAgLyoqCisgICAgICogQXR0ZW1wdHMgdG8gcGVyc2lzdCBhIHNldCBvZiBTdHJpbmdzIHRvIHRoZSB7QGxpbmsgYW5kcm9pZC5jb250ZW50LlNoYXJlZFByZWZlcmVuY2VzfS4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGlzIHdpbGwgY2hlY2sgaWYgdGhpcyBQcmVmZXJlbmNlIGlzIHBlcnNpc3RlbnQsIGdldCBhbiBlZGl0b3IgZnJvbQorICAgICAqIHRoZSB7QGxpbmsgUHJlZmVyZW5jZU1hbmFnZXJ9LCBwdXQgaW4gdGhlIHN0cmluZ3MsIGFuZCBjaGVjayBpZiB3ZSBzaG91bGQgY29tbWl0IChhbmQKKyAgICAgKiBjb21taXQgaWYgc28pLgorICAgICAqIAorICAgICAqIEBwYXJhbSB2YWx1ZXMgVGhlIHZhbHVlcyB0byBwZXJzaXN0LgorICAgICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgUHJlZmVyZW5jZSBpcyBwZXJzaXN0ZW50LiAoVGhpcyBpcyBub3Qgd2hldGhlciB0aGUKKyAgICAgKiAgICAgICAgIHZhbHVlIHdhcyBwZXJzaXN0ZWQsIHNpbmNlIHdlIG1heSBub3QgbmVjZXNzYXJpbHkgY29tbWl0IGlmIHRoZXJlCisgICAgICogICAgICAgICB3aWxsIGJlIGEgYmF0Y2ggY29tbWl0IGxhdGVyLikKKyAgICAgKiBAc2VlICNnZXRQZXJzaXN0ZWRTdHJpbmcoU2V0KQorICAgICAqIAorICAgICAqIEBoaWRlIFBlbmRpbmcgQVBJIGFwcHJvdmFsCisgICAgICovCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gcGVyc2lzdFN0cmluZ1NldChTZXQ8U3RyaW5nPiB2YWx1ZXMpIHsKKyAgICAgICAgaWYgKHNob3VsZFBlcnNpc3QoKSkgeworICAgICAgICAgICAgLy8gU2hvdWxkbid0IHN0b3JlIG51bGwKKyAgICAgICAgICAgIGlmICh2YWx1ZXMuZXF1YWxzKGdldFBlcnNpc3RlZFN0cmluZ1NldChudWxsKSkpIHsKKyAgICAgICAgICAgICAgICAvLyBJdCdzIGFscmVhZHkgdGhlcmUsIHNvIHRoZSBzYW1lIGFzIHBlcnNpc3RpbmcKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIAorICAgICAgICAgICAgU2hhcmVkUHJlZmVyZW5jZXMuRWRpdG9yIGVkaXRvciA9IG1QcmVmZXJlbmNlTWFuYWdlci5nZXRFZGl0b3IoKTsKKyAgICAgICAgICAgIGVkaXRvci5wdXRTdHJpbmdTZXQobUtleSwgdmFsdWVzKTsKKyAgICAgICAgICAgIHRyeUNvbW1pdChlZGl0b3IpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8qKgorICAgICAqIEF0dGVtcHRzIHRvIGdldCBhIHBlcnNpc3RlZCBzZXQgb2YgU3RyaW5ncyBmcm9tIHRoZQorICAgICAqIHtAbGluayBhbmRyb2lkLmNvbnRlbnQuU2hhcmVkUHJlZmVyZW5jZXN9LgorICAgICAqIDxwPgorICAgICAqIFRoaXMgd2lsbCBjaGVjayBpZiB0aGlzIFByZWZlcmVuY2UgaXMgcGVyc2lzdGVudCwgZ2V0IHRoZSBTaGFyZWRQcmVmZXJlbmNlcworICAgICAqIGZyb20gdGhlIHtAbGluayBQcmVmZXJlbmNlTWFuYWdlcn0sIGFuZCBnZXQgdGhlIHZhbHVlLgorICAgICAqIAorICAgICAqIEBwYXJhbSBkZWZhdWx0UmV0dXJuVmFsdWUgVGhlIGRlZmF1bHQgdmFsdWUgdG8gcmV0dXJuIGlmIGVpdGhlciB0aGUKKyAgICAgKiAgICAgICAgICAgIFByZWZlcmVuY2UgaXMgbm90IHBlcnNpc3RlbnQgb3IgdGhlIFByZWZlcmVuY2UgaXMgbm90IGluIHRoZQorICAgICAqICAgICAgICAgICAgc2hhcmVkIHByZWZlcmVuY2VzLgorICAgICAqIEByZXR1cm4gVGhlIHZhbHVlIGZyb20gdGhlIFNoYXJlZFByZWZlcmVuY2VzIG9yIHRoZSBkZWZhdWx0IHJldHVybgorICAgICAqICAgICAgICAgdmFsdWUuCisgICAgICogQHNlZSAjcGVyc2lzdFN0cmluZ1NldChTZXQpCisgICAgICogCisgICAgICogQGhpZGUgUGVuZGluZyBBUEkgYXBwcm92YWwKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU2V0PFN0cmluZz4gZ2V0UGVyc2lzdGVkU3RyaW5nU2V0KFNldDxTdHJpbmc+IGRlZmF1bHRSZXR1cm5WYWx1ZSkgeworICAgICAgICBpZiAoIXNob3VsZFBlcnNpc3QoKSkgeworICAgICAgICAgICAgcmV0dXJuIGRlZmF1bHRSZXR1cm5WYWx1ZTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgcmV0dXJuIG1QcmVmZXJlbmNlTWFuYWdlci5nZXRTaGFyZWRQcmVmZXJlbmNlcygpLmdldFN0cmluZ1NldChtS2V5LCBkZWZhdWx0UmV0dXJuVmFsdWUpOworICAgIH0KKyAgICAKKyAgICAvKioKICAgICAgKiBBdHRlbXB0cyB0byBwZXJzaXN0IGFuIGludCB0byB0aGUge0BsaW5rIGFuZHJvaWQuY29udGVudC5TaGFyZWRQcmVmZXJlbmNlc30uCiAgICAgICogCiAgICAgICogQHBhcmFtIHZhbHVlIFRoZSB2YWx1ZSB0byBwZXJzaXN0LgpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvcHJlZmVyZW5jZS9QcmVmZXJlbmNlQWN0aXZpdHkuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3ByZWZlcmVuY2UvUHJlZmVyZW5jZUFjdGl2aXR5LmphdmEKaW5kZXggNzI2NzkzZC4uNDI0N2FlNSAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvcHJlZmVyZW5jZS9QcmVmZXJlbmNlQWN0aXZpdHkuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9wcmVmZXJlbmNlL1ByZWZlcmVuY2VBY3Rpdml0eS5qYXZhCkBAIC0xNiwxMzUgKzE2LDc1NCBAQAogCiBwYWNrYWdlIGFuZHJvaWQucHJlZmVyZW5jZTsKIAotaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5OworaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnV0aWwuWG1sVXRpbHM7CisKK2ltcG9ydCBvcmcueG1scHVsbC52MS5YbWxQdWxsUGFyc2VyOworaW1wb3J0IG9yZy54bWxwdWxsLnYxLlhtbFB1bGxQYXJzZXJFeGNlcHRpb247CisKK2ltcG9ydCBhbmRyb2lkLmFwcC5GcmFnbWVudDsKK2ltcG9ydCBhbmRyb2lkLmFwcC5GcmFnbWVudFRyYW5zYWN0aW9uOwogaW1wb3J0IGFuZHJvaWQuYXBwLkxpc3RBY3Rpdml0eTsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5TaGFyZWRQcmVmZXJlbmNlczsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLkNvbmZpZ3VyYXRpb247CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5UeXBlZEFycmF5OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuWG1sUmVzb3VyY2VQYXJzZXI7CiBpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CiBpbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyOwogaW1wb3J0IGFuZHJvaWQub3MuTWVzc2FnZTsKK2ltcG9ydCBhbmRyb2lkLm9zLlBhcmNlbDsKK2ltcG9ydCBhbmRyb2lkLm9zLlBhcmNlbGFibGU7CitpbXBvcnQgYW5kcm9pZC50ZXh0LlRleHRVdGlsczsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0OworaW1wb3J0IGFuZHJvaWQudXRpbC5YbWw7CitpbXBvcnQgYW5kcm9pZC52aWV3LkxheW91dEluZmxhdGVyOwogaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3Lk9uQ2xpY2tMaXN0ZW5lcjsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlld0dyb3VwOworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkFic0xpc3RWaWV3OworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkFycmF5QWRhcHRlcjsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5CdXR0b247CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuRnJhbWVMYXlvdXQ7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuSW1hZ2VWaWV3OworaW1wb3J0IGFuZHJvaWQud2lkZ2V0Lkxpc3RWaWV3OworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlRleHRWaWV3OworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OwogCiAvKioKLSAqIFNob3dzIGEgaGllcmFyY2h5IG9mIHtAbGluayBQcmVmZXJlbmNlfSBvYmplY3RzIGFzCi0gKiBsaXN0cywgcG9zc2libHkgc3Bhbm5pbmcgbXVsdGlwbGUgc2NyZWVucy4gVGhlc2UgcHJlZmVyZW5jZXMgd2lsbAotICogYXV0b21hdGljYWxseSBzYXZlIHRvIHtAbGluayBTaGFyZWRQcmVmZXJlbmNlc30gYXMgdGhlIHVzZXIgaW50ZXJhY3RzIHdpdGgKLSAqIHRoZW0uIFRvIHJldHJpZXZlIGFuIGluc3RhbmNlIG9mIHtAbGluayBTaGFyZWRQcmVmZXJlbmNlc30gdGhhdCB0aGUKLSAqIHByZWZlcmVuY2UgaGllcmFyY2h5IGluIHRoaXMgYWN0aXZpdHkgd2lsbCB1c2UsIGNhbGwKLSAqIHtAbGluayBQcmVmZXJlbmNlTWFuYWdlciNnZXREZWZhdWx0U2hhcmVkUHJlZmVyZW5jZXMoYW5kcm9pZC5jb250ZW50LkNvbnRleHQpfQotICogd2l0aCBhIGNvbnRleHQgaW4gdGhlIHNhbWUgcGFja2FnZSBhcyB0aGlzIGFjdGl2aXR5LgotICogPHA+Ci0gKiBGdXJ0aGVybW9yZSwgdGhlIHByZWZlcmVuY2VzIHNob3duIHdpbGwgZm9sbG93IHRoZSB2aXN1YWwgc3R5bGUgb2Ygc3lzdGVtCi0gKiBwcmVmZXJlbmNlcy4gSXQgaXMgZWFzeSB0byBjcmVhdGUgYSBoaWVyYXJjaHkgb2YgcHJlZmVyZW5jZXMgKHRoYXQgY2FuIGJlCi0gKiBzaG93biBvbiBtdWx0aXBsZSBzY3JlZW5zKSB2aWEgWE1MLiBGb3IgdGhlc2UgcmVhc29ucywgaXQgaXMgcmVjb21tZW5kZWQgdG8KLSAqIHVzZSB0aGlzIGFjdGl2aXR5IChhcyBhIHN1cGVyY2xhc3MpIHRvIGRlYWwgd2l0aCBwcmVmZXJlbmNlcyBpbiBhcHBsaWNhdGlvbnMuCi0gKiA8cD4KLSAqIEEge0BsaW5rIFByZWZlcmVuY2VTY3JlZW59IG9iamVjdCBzaG91bGQgYmUgYXQgdGhlIHRvcCBvZiB0aGUgcHJlZmVyZW5jZQotICogaGllcmFyY2h5LiBGdXJ0aGVybW9yZSwgc3Vic2VxdWVudCB7QGxpbmsgUHJlZmVyZW5jZVNjcmVlbn0gaW4gdGhlIGhpZXJhcmNoeQotICogZGVub3RlIGEgc2NyZWVuIGJyZWFrLS10aGF0IGlzIHRoZSBwcmVmZXJlbmNlcyBjb250YWluZWQgd2l0aGluIHN1YnNlcXVlbnQKLSAqIHtAbGluayBQcmVmZXJlbmNlU2NyZWVufSBzaG91bGQgYmUgc2hvd24gb24gYW5vdGhlciBzY3JlZW4uIFRoZSBwcmVmZXJlbmNlCi0gKiBmcmFtZXdvcmsgaGFuZGxlcyBzaG93aW5nIHRoZXNlIG90aGVyIHNjcmVlbnMgZnJvbSB0aGUgcHJlZmVyZW5jZSBoaWVyYXJjaHkuCi0gKiA8cD4KLSAqIFRoZSBwcmVmZXJlbmNlIGhpZXJhcmNoeSBjYW4gYmUgZm9ybWVkIGluIG11bHRpcGxlIHdheXM6Ci0gKiA8bGk+IEZyb20gYW4gWE1MIGZpbGUgc3BlY2lmeWluZyB0aGUgaGllcmFyY2h5Ci0gKiA8bGk+IEZyb20gZGlmZmVyZW50IHtAbGluayBBY3Rpdml0eSBBY3Rpdml0aWVzfSB0aGF0IGVhY2ggc3BlY2lmeSBpdHMgb3duCi0gKiBwcmVmZXJlbmNlcyBpbiBhbiBYTUwgZmlsZSB2aWEge0BsaW5rIEFjdGl2aXR5fSBtZXRhLWRhdGEKLSAqIDxsaT4gRnJvbSBhbiBvYmplY3QgaGllcmFyY2h5IHJvb3RlZCB3aXRoIHtAbGluayBQcmVmZXJlbmNlU2NyZWVufQotICogPHA+Ci0gKiBUbyBpbmZsYXRlIGZyb20gWE1MLCB1c2UgdGhlIHtAbGluayAjYWRkUHJlZmVyZW5jZXNGcm9tUmVzb3VyY2UoaW50KX0uIFRoZQotICogcm9vdCBlbGVtZW50IHNob3VsZCBiZSBhIHtAbGluayBQcmVmZXJlbmNlU2NyZWVufS4gU3Vic2VxdWVudCBlbGVtZW50cyBjYW4gcG9pbnQKLSAqIHRvIGFjdHVhbCB7QGxpbmsgUHJlZmVyZW5jZX0gc3ViY2xhc3Nlcy4gQXMgbWVudGlvbmVkIGFib3ZlLCBzdWJzZXF1ZW50Ci0gKiB7QGxpbmsgUHJlZmVyZW5jZVNjcmVlbn0gaW4gdGhlIGhpZXJhcmNoeSB3aWxsIHJlc3VsdCBpbiB0aGUgc2NyZWVuIGJyZWFrLgotICogPHA+Ci0gKiBUbyBzcGVjaWZ5IGFuIHtAbGluayBJbnRlbnR9IHRvIHF1ZXJ5IHtAbGluayBBY3Rpdml0eSBBY3Rpdml0aWVzfSB0aGF0IGVhY2gKLSAqIGhhdmUgcHJlZmVyZW5jZXMsIHVzZSB7QGxpbmsgI2FkZFByZWZlcmVuY2VzRnJvbUludGVudH0uIEVhY2gKLSAqIHtAbGluayBBY3Rpdml0eX0gY2FuIHNwZWNpZnkgbWV0YS1kYXRhIGluIHRoZSBtYW5pZmVzdCAodmlhIHRoZSBrZXkKLSAqIHtAbGluayBQcmVmZXJlbmNlTWFuYWdlciNNRVRBREFUQV9LRVlfUFJFRkVSRU5DRVN9KSB0aGF0IHBvaW50cyB0byBhbiBYTUwKLSAqIHJlc291cmNlLiBUaGVzZSBYTUwgcmVzb3VyY2VzIHdpbGwgYmUgaW5mbGF0ZWQgaW50byBhIHNpbmdsZSBwcmVmZXJlbmNlCi0gKiBoaWVyYXJjaHkgYW5kIHNob3duIGJ5IHRoaXMgYWN0aXZpdHkuCi0gKiA8cD4KLSAqIFRvIHNwZWNpZnkgYW4gb2JqZWN0IGhpZXJhcmNoeSByb290ZWQgd2l0aCB7QGxpbmsgUHJlZmVyZW5jZVNjcmVlbn0sIHVzZQotICoge0BsaW5rICNzZXRQcmVmZXJlbmNlU2NyZWVuKFByZWZlcmVuY2VTY3JlZW4pfS4KLSAqIDxwPgotICogQXMgYSBjb252ZW5pZW5jZSwgdGhpcyBhY3Rpdml0eSBpbXBsZW1lbnRzIGEgY2xpY2sgbGlzdGVuZXIgZm9yIGFueQotICogcHJlZmVyZW5jZSBpbiB0aGUgY3VycmVudCBoaWVyYXJjaHksIHNlZQotICoge0BsaW5rICNvblByZWZlcmVuY2VUcmVlQ2xpY2soUHJlZmVyZW5jZVNjcmVlbiwgUHJlZmVyZW5jZSl9LgotICogCi0gKiBAc2VlIFByZWZlcmVuY2UKLSAqIEBzZWUgUHJlZmVyZW5jZVNjcmVlbgorICogVGhpcyBpcyB0aGUgYmFzZSBjbGFzcyBmb3IgYW4gYWN0aXZpdHkgdG8gc2hvdyBhIGhpZXJhcmNoeSBvZiBwcmVmZXJlbmNlcworICogdG8gdGhlIHVzZXIuICBQcmlvciB0byB7QGxpbmsgYW5kcm9pZC5vcy5CdWlsZC5WRVJTSU9OX0NPREVTI0hPTkVZQ09NQn0KKyAqIHRoaXMgY2xhc3Mgb25seSBhbGxvd2VkIHRoZSBkaXNwbGF5IG9mIGEgc2luZ2xlIHNldCBvZiBwcmVmZXJlbmNlOyB0aGlzCisgKiBmdW5jdGlvbmFsaXR5IHNob3VsZCBub3cgYmUgZm91bmQgaW4gdGhlIG5ldyB7QGxpbmsgUHJlZmVyZW5jZUZyYWdtZW50fQorICogY2xhc3MuICBJZiB5b3UgYXJlIHVzaW5nIFByZWZlcmVuY2VBY3Rpdml0eSBpbiBpdHMgb2xkIG1vZGUsIHRoZSBkb2N1bWVudGF0aW9uCisgKiB0aGVyZSBhcHBsaWVzIHRvIHRoZSBkZXByZWNhdGVkIEFQSXMgaGVyZS4KKyAqCisgKiA8cD5UaGlzIGFjdGl2aXR5IHNob3dzIG9uZSBvciBtb3JlIGhlYWRlcnMgb2YgcHJlZmVyZW5jZXMsIGVhY2ggb2Ygd2l0aAorICogaXMgYXNzb2NpYXRlZCB3aXRoIGEge0BsaW5rIFByZWZlcmVuY2VGcmFnbWVudH0gdG8gZGlzcGxheSB0aGUgcHJlZmVyZW5jZXMKKyAqIG9mIHRoYXQgaGVhZGVyLiAgVGhlIGFjdHVhbCBsYXlvdXQgYW5kIGRpc3BsYXkgb2YgdGhlc2UgYXNzb2NpYXRpb25zIGNhbgorICogaG93ZXZlciB2YXJ5OyBjdXJyZW50bHkgdGhlcmUgYXJlIHR3byBtYWpvciBhcHByb2FjaGVzIGl0IG1heSB0YWtlOgorICoKKyAqIDx1bD4KKyAqIDxsaT5PbiBhIHNtYWxsIHNjcmVlbiBpdCBtYXkgZGlzcGxheSBvbmx5IHRoZSBoZWFkZXJzIGFzIGEgc2luZ2xlIGxpc3QKKyAqIHdoZW4gZmlyc3QgbGF1bmNoZWQuICBTZWxlY3Rpbmcgb25lIG9mIHRoZSBoZWFkZXIgaXRlbXMgd2lsbCByZS1sYXVuY2gKKyAqIHRoZSBhY3Rpdml0eSB3aXRoIGl0IG9ubHkgc2hvd2luZyB0aGUgUHJlZmVyZW5jZUZyYWdtZW50IG9mIHRoYXQgaGVhZGVyLgorICogPGxpPk9uIGEgbGFyZ2Ugc2NyZWVuIGluIG1heSBkaXNwbGF5IGJvdGggdGhlIGhlYWRlcnMgYW5kIGN1cnJlbnQKKyAqIFByZWZlcmVuY2VGcmFnbWVudCB0b2dldGhlciBhcyBwYW5lcy4gIFNlbGVjdGluZyBhIGhlYWRlciBpdGVtIHN3aXRjaGVzCisgKiB0byBzaG93aW5nIHRoZSBjb3JyZWN0IFByZWZlcmVuY2VGcmFnbWVudCBmb3IgdGhhdCBpdGVtLgorICogPC91bD4KKyAqCisgKiA8cD5TdWJjbGFzc2VzIG9mIFByZWZlcmVuY2VBY3Rpdml0eSBzaG91bGQgaW1wbGVtZW50CisgKiB7QGxpbmsgI29uQnVpbGRIZWFkZXJzfSB0byBwb3B1bGF0ZSB0aGUgaGVhZGVyIGxpc3Qgd2l0aCB0aGUgZGVzaXJlZAorICogaXRlbXMuICBEb2luZyB0aGlzIGltcGxpY2l0bHkgc3dpdGNoZXMgdGhlIGNsYXNzIGludG8gaXRzIG5ldyAiaGVhZGVycworICogKyBmcmFnbWVudHMiIG1vZGUgcmF0aGVyIHRoYW4gdGhlIG9sZCBzdHlsZSBvZiBqdXN0IHNob3dpbmcgYSBzaW5nbGUKKyAqIHByZWZlcmVuY2VzIGxpc3QuCisgKgorICogPGEgbmFtZT0iU2FtcGxlQ29kZSI+PC9hPgorICogPGgzPlNhbXBsZSBDb2RlPC9oMz4KKyAqCisgKiA8cD5UaGUgZm9sbG93aW5nIHNhbXBsZSBjb2RlIHNob3dzIGEgc2ltcGxlIHByZWZlcmVuY2UgYWN0aXZpdHkgdGhhdAorICogaGFzIHR3byBkaWZmZXJlbnQgc2V0cyBvZiBwcmVmZXJlbmNlcy4gIFRoZSBpbXBsZW1lbnRhdGlvbiwgY29uc2lzdGluZworICogb2YgdGhlIGFjdGl2aXR5IGl0c2VsZiBhcyB3ZWxsIGFzIGl0cyB0d28gcHJlZmVyZW5jZSBmcmFnbWVudHMgaXM6PC9wPgorICoKKyAqIHtAc2FtcGxlIGRldmVsb3BtZW50L3NhbXBsZXMvQXBpRGVtb3Mvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvYXBpcy9wcmVmZXJlbmNlL1ByZWZlcmVuY2VXaXRoSGVhZGVycy5qYXZhCisgKiAgICAgIGFjdGl2aXR5fQorICoKKyAqIDxwPlRoZSBwcmVmZXJlbmNlX2hlYWRlcnMgcmVzb3VyY2UgZGVzY3JpYmVzIHRoZSBoZWFkZXJzIHRvIGJlIGRpc3BsYXllZAorICogYW5kIHRoZSBmcmFnbWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoZW0uICBJdCBpczoKKyAqCisgKiB7QHNhbXBsZSBkZXZlbG9wbWVudC9zYW1wbGVzL0FwaURlbW9zL3Jlcy94bWwvcHJlZmVyZW5jZV9oZWFkZXJzLnhtbCBoZWFkZXJzfQorICoKKyAqIDxwPlRoZSBmaXJzdCBoZWFkZXIgaXMgc2hvd24gYnkgUHJlZnMxRnJhZ21lbnQsIHdoaWNoIHBvcHVsYXRlcyBpdHNlbGYKKyAqIGZyb20gdGhlIGZvbGxvd2luZyBYTUwgcmVzb3VyY2U6PC9wPgorICoKKyAqIHtAc2FtcGxlIGRldmVsb3BtZW50L3NhbXBsZXMvQXBpRGVtb3MvcmVzL3htbC9mcmFnbWVudGVkX3ByZWZlcmVuY2VzLnhtbCBwcmVmZXJlbmNlc30KKyAqCisgKiA8cD5Ob3RlIHRoYXQgdGhpcyBYTUwgcmVzb3VyY2UgY29udGFpbnMgYSBwcmVmZXJlbmNlIHNjcmVlbiBob2xkaW5nIGFub3RoZXIKKyAqIGZyYWdtZW50LCB0aGUgUHJlZnMxRnJhZ21lbnRJbm5lciBpbXBsZW1lbnRlZCBoZXJlLiAgVGhpcyBhbGxvd3MgdGhlIHVzZXIKKyAqIHRvIHRyYXZlcnNlIGRvd24gYSBoaWVyYXJjaHkgb2YgcHJlZmVyZW5jZXM7IHByZXNzaW5nIGJhY2sgd2lsbCBwb3AgZWFjaAorICogZnJhZ21lbnQgb2ZmIHRoZSBzdGFjayB0byByZXR1cm4gdG8gdGhlIHByZXZpb3VzIHByZWZlcmVuY2VzLgorICoKKyAqIDxwPlNlZSB7QGxpbmsgUHJlZmVyZW5jZUZyYWdtZW50fSBmb3IgaW5mb3JtYXRpb24gb24gaW1wbGVtZW50aW5nIHRoZQorICogZnJhZ21lbnRzIHRoZW1zZWx2ZXMuCiAgKi8KIHB1YmxpYyBhYnN0cmFjdCBjbGFzcyBQcmVmZXJlbmNlQWN0aXZpdHkgZXh0ZW5kcyBMaXN0QWN0aXZpdHkgaW1wbGVtZW50cwotICAgICAgICBQcmVmZXJlbmNlTWFuYWdlci5PblByZWZlcmVuY2VUcmVlQ2xpY2tMaXN0ZW5lciB7Ci0gICAgCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZFUkVOQ0VTX1RBRyA9ICJhbmRyb2lkOnByZWZlcmVuY2VzIjsKLSAgICAKKyAgICAgICAgUHJlZmVyZW5jZU1hbmFnZXIuT25QcmVmZXJlbmNlVHJlZUNsaWNrTGlzdGVuZXIsCisgICAgICAgIFByZWZlcmVuY2VGcmFnbWVudC5PblByZWZlcmVuY2VTdGFydEZyYWdtZW50Q2FsbGJhY2sgeworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiUHJlZmVyZW5jZUFjdGl2aXR5IjsKKworICAgIC8vIENvbnN0YW50cyBmb3Igc3RhdGUgc2F2ZS9yZXN0b3JlCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEhFQURFUlNfVEFHID0gIjphbmRyb2lkOmhlYWRlcnMiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDVVJfSEVBREVSX1RBRyA9ICI6YW5kcm9pZDpjdXJfaGVhZGVyIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0lOR0xFX1BBTkVfVEFHID0gIjphbmRyb2lkOnNpbmdsZV9wYW5lIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRkVSRU5DRVNfVEFHID0gIjphbmRyb2lkOnByZWZlcmVuY2VzIjsKKworICAgIC8qKgorICAgICAqIFdoZW4gc3RhcnRpbmcgdGhpcyBhY3Rpdml0eSwgdGhlIGludm9raW5nIEludGVudCBjYW4gY29udGFpbiB0aGlzIGV4dHJhCisgICAgICogc3RyaW5nIHRvIHNwZWNpZnkgd2hpY2ggZnJhZ21lbnQgc2hvdWxkIGJlIGluaXRpYWxseSBkaXNwbGF5ZWQuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhUUkFfU0hPV19GUkFHTUVOVCA9ICI6YW5kcm9pZDpzaG93X2ZyYWdtZW50IjsKKworICAgIC8qKgorICAgICAqIFdoZW4gc3RhcnRpbmcgdGhpcyBhY3Rpdml0eSBhbmQgdXNpbmcge0BsaW5rICNFWFRSQV9TSE9XX0ZSQUdNRU5UfSwKKyAgICAgKiB0aGlzIGV4dHJhIGNhbiBhbHNvIGJlIHNwZWNpZnkgdG8gc3VwcGx5IGEgQnVuZGxlIG9mIGFyZ3VtZW50cyB0byBwYXNzCisgICAgICogdG8gdGhhdCBmcmFnbWVudCB3aGVuIGl0IGlzIGluc3RhbnRpYXRlZCBkdXJpbmcgdGhlIGluaXRpYWwgY3JlYXRpb24KKyAgICAgKiBvZiBQcmVmZXJlbmNlQWN0aXZpdHkuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhUUkFfU0hPV19GUkFHTUVOVF9BUkdVTUVOVFMgPSAiOmFuZHJvaWQ6c2hvd19mcmFnbWVudF9hcmdzIjsKKworICAgIC8qKgorICAgICAqIFdoZW4gc3RhcnRpbmcgdGhpcyBhY3Rpdml0eSwgdGhlIGludm9raW5nIEludGVudCBjYW4gY29udGFpbiB0aGlzIGV4dHJhCisgICAgICogYm9vbGVhbiB0aGF0IHRoZSBoZWFkZXIgbGlzdCBzaG91bGQgbm90IGJlIGRpc3BsYXllZC4gIFRoaXMgaXMgbW9zdCBvZnRlbgorICAgICAqIHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCB7QGxpbmsgI0VYVFJBX1NIT1dfRlJBR01FTlR9IHRvIGxhdW5jaAorICAgICAqIHRoZSBhY3Rpdml0eSB0byBkaXNwbGF5IGEgc3BlY2lmaWMgZnJhZ21lbnQgdGhhdCB0aGUgdXNlciBoYXMgbmF2aWdhdGVkCisgICAgICogdG8uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhUUkFfTk9fSEVBREVSUyA9ICI6YW5kcm9pZDpub19oZWFkZXJzIjsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCQUNLX1NUQUNLX1BSRUZTID0gIjphbmRyb2lkOnByZWZzIjsKKworICAgIC8vIGV4dHJhcyB0aGF0IGFsbG93IGFueSBwcmVmZXJlbmNlIGFjdGl2aXR5IHRvIGJlIGxhdW5jaGVkIGFzIHBhcnQgb2YgYSB3aXphcmQKKworICAgIC8vIHNob3cgQmFjayBhbmQgTmV4dCBidXR0b25zPyB0YWtlcyBib29sZWFuIHBhcmFtZXRlcgorICAgIC8vIEJhY2sgd2lsbCB0aGVuIHJldHVybiBSRVNVTFRfQ0FOQ0VMRUQgYW5kIE5leHQgUkVTVUxUX09LCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVFJBX1BSRUZTX1NIT1dfQlVUVE9OX0JBUiA9ICJleHRyYV9wcmVmc19zaG93X2J1dHRvbl9iYXIiOworCisgICAgLy8gYWRkIGEgU2tpcCBidXR0b24/CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVFJBX1BSRUZTX1NIT1dfU0tJUCA9ICJleHRyYV9wcmVmc19zaG93X3NraXAiOworCisgICAgLy8gc3BlY2lmeSBjdXN0b20gdGV4dCBmb3IgdGhlIEJhY2sgb3IgTmV4dCBidXR0b25zLCBvciBjYXVzZSBhIGJ1dHRvbiB0byBub3QgYXBwZWFyCisgICAgLy8gYXQgYWxsIGJ5IHNldHRpbmcgaXQgdG8gbnVsbAorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRSQV9QUkVGU19TRVRfTkVYVF9URVhUID0gImV4dHJhX3ByZWZzX3NldF9uZXh0X3RleHQiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRSQV9QUkVGU19TRVRfQkFDS19URVhUID0gImV4dHJhX3ByZWZzX3NldF9iYWNrX3RleHQiOworCisgICAgLy8gLS0tIFN0YXRlIGZvciBuZXcgbW9kZSB3aGVuIHNob3dpbmcgYSBsaXN0IG9mIGhlYWRlcnMgKyBwcmVmcyBmcmFnbWVudAorCisgICAgcHJpdmF0ZSBmaW5hbCBBcnJheUxpc3Q8SGVhZGVyPiBtSGVhZGVycyA9IG5ldyBBcnJheUxpc3Q8SGVhZGVyPigpOworCisgICAgcHJpdmF0ZSBIZWFkZXJBZGFwdGVyIG1BZGFwdGVyOworCisgICAgcHJpdmF0ZSBGcmFtZUxheW91dCBtTGlzdEZvb3RlcjsKKworICAgIHByaXZhdGUgVmlldyBtUHJlZnNDb250YWluZXI7CisKKyAgICBwcml2YXRlIGJvb2xlYW4gbVNpbmdsZVBhbmU7CisKKyAgICBwcml2YXRlIEhlYWRlciBtQ3VySGVhZGVyOworCisgICAgLy8gLS0tIFN0YXRlIGZvciBvbGQgbW9kZSB3aGVuIHNob3dpbmcgYSBzaW5nbGUgcHJlZmVyZW5jZSBsaXN0CisKICAgICBwcml2YXRlIFByZWZlcmVuY2VNYW5hZ2VyIG1QcmVmZXJlbmNlTWFuYWdlcjsKLSAgICAKKwogICAgIHByaXZhdGUgQnVuZGxlIG1TYXZlZEluc3RhbmNlU3RhdGU7CiAKKyAgICAvLyAtLS0gQ29tbW9uIHN0YXRlCisKKyAgICBwcml2YXRlIEJ1dHRvbiBtTmV4dEJ1dHRvbjsKKwogICAgIC8qKgogICAgICAqIFRoZSBzdGFydGluZyByZXF1ZXN0IGNvZGUgZ2l2ZW4gb3V0IHRvIHByZWZlcmVuY2UgZnJhbWV3b3JrLgogICAgICAqLwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBGSVJTVF9SRVFVRVNUX0NPREUgPSAxMDA7Ci0gICAgCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1TR19CSU5EX1BSRUZFUkVOQ0VTID0gMDsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNU0dfQklORF9QUkVGRVJFTkNFUyA9IDE7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1TR19CVUlMRF9IRUFERVJTID0gMjsKICAgICBwcml2YXRlIEhhbmRsZXIgbUhhbmRsZXIgPSBuZXcgSGFuZGxlcigpIHsKICAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgIHB1YmxpYyB2b2lkIGhhbmRsZU1lc3NhZ2UoTWVzc2FnZSBtc2cpIHsKICAgICAgICAgICAgIHN3aXRjaCAobXNnLndoYXQpIHsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBjYXNlIE1TR19CSU5EX1BSRUZFUkVOQ0VTOgorICAgICAgICAgICAgICAgIGNhc2UgTVNHX0JJTkRfUFJFRkVSRU5DRVM6IHsKICAgICAgICAgICAgICAgICAgICAgYmluZFByZWZlcmVuY2VzKCk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0gYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBNU0dfQlVJTERfSEVBREVSUzogeworICAgICAgICAgICAgICAgICAgICBBcnJheUxpc3Q8SGVhZGVyPiBvbGRIZWFkZXJzID0gbmV3IEFycmF5TGlzdDxIZWFkZXI+KG1IZWFkZXJzKTsKKyAgICAgICAgICAgICAgICAgICAgbUhlYWRlcnMuY2xlYXIoKTsKKyAgICAgICAgICAgICAgICAgICAgb25CdWlsZEhlYWRlcnMobUhlYWRlcnMpOworICAgICAgICAgICAgICAgICAgICBtQWRhcHRlci5ub3RpZnlEYXRhU2V0Q2hhbmdlZCgpOworICAgICAgICAgICAgICAgICAgICBIZWFkZXIgaGVhZGVyID0gb25HZXROZXdIZWFkZXIoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGhlYWRlciAhPSBudWxsICYmIGhlYWRlci5mcmFnbWVudCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBIZWFkZXIgbWFwcGVkSGVhZGVyID0gZmluZEJlc3RNYXRjaGluZ0hlYWRlcihoZWFkZXIsIG9sZEhlYWRlcnMpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1hcHBlZEhlYWRlciA9PSBudWxsIHx8IG1DdXJIZWFkZXIgIT0gbWFwcGVkSGVhZGVyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoVG9IZWFkZXIoaGVhZGVyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChtQ3VySGVhZGVyICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEhlYWRlciBtYXBwZWRIZWFkZXIgPSBmaW5kQmVzdE1hdGNoaW5nSGVhZGVyKG1DdXJIZWFkZXIsIG1IZWFkZXJzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtYXBwZWRIZWFkZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFNlbGVjdGVkSGVhZGVyKG1hcHBlZEhlYWRlcik7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaFRvSGVhZGVyKG51bGwpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBicmVhazsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH07CiAKKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBIZWFkZXJBZGFwdGVyIGV4dGVuZHMgQXJyYXlBZGFwdGVyPEhlYWRlcj4geworICAgICAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBIZWFkZXJWaWV3SG9sZGVyIHsKKyAgICAgICAgICAgIEltYWdlVmlldyBpY29uOworICAgICAgICAgICAgVGV4dFZpZXcgdGl0bGU7CisgICAgICAgICAgICBUZXh0VmlldyBzdW1tYXJ5OworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBMYXlvdXRJbmZsYXRlciBtSW5mbGF0ZXI7CisKKyAgICAgICAgcHVibGljIEhlYWRlckFkYXB0ZXIoQ29udGV4dCBjb250ZXh0LCBMaXN0PEhlYWRlcj4gb2JqZWN0cykgeworICAgICAgICAgICAgc3VwZXIoY29udGV4dCwgMCwgb2JqZWN0cyk7CisgICAgICAgICAgICBtSW5mbGF0ZXIgPSAoTGF5b3V0SW5mbGF0ZXIpY29udGV4dC5nZXRTeXN0ZW1TZXJ2aWNlKENvbnRleHQuTEFZT1VUX0lORkxBVEVSX1NFUlZJQ0UpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBWaWV3IGdldFZpZXcoaW50IHBvc2l0aW9uLCBWaWV3IGNvbnZlcnRWaWV3LCBWaWV3R3JvdXAgcGFyZW50KSB7CisgICAgICAgICAgICBIZWFkZXJWaWV3SG9sZGVyIGhvbGRlcjsKKyAgICAgICAgICAgIFZpZXcgdmlldzsKKworICAgICAgICAgICAgaWYgKGNvbnZlcnRWaWV3ID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICB2aWV3ID0gbUluZmxhdGVyLmluZmxhdGUoY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5sYXlvdXQucHJlZmVyZW5jZV9oZWFkZXJfaXRlbSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudCwgZmFsc2UpOworICAgICAgICAgICAgICAgIGhvbGRlciA9IG5ldyBIZWFkZXJWaWV3SG9sZGVyKCk7CisgICAgICAgICAgICAgICAgaG9sZGVyLmljb24gPSAoSW1hZ2VWaWV3KSB2aWV3LmZpbmRWaWV3QnlJZChjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmlkLmljb24pOworICAgICAgICAgICAgICAgIGhvbGRlci50aXRsZSA9IChUZXh0Vmlldykgdmlldy5maW5kVmlld0J5SWQoY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5pZC50aXRsZSk7CisgICAgICAgICAgICAgICAgaG9sZGVyLnN1bW1hcnkgPSAoVGV4dFZpZXcpIHZpZXcuZmluZFZpZXdCeUlkKGNvbS5hbmRyb2lkLmludGVybmFsLlIuaWQuc3VtbWFyeSk7CisgICAgICAgICAgICAgICAgdmlldy5zZXRUYWcoaG9sZGVyKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgdmlldyA9IGNvbnZlcnRWaWV3OworICAgICAgICAgICAgICAgIGhvbGRlciA9IChIZWFkZXJWaWV3SG9sZGVyKSB2aWV3LmdldFRhZygpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBBbGwgdmlldyBmaWVsZHMgbXVzdCBiZSB1cGRhdGVkIGV2ZXJ5IHRpbWUsIGJlY2F1c2UgdGhlIHZpZXcgbWF5IGJlIHJlY3ljbGVkIAorICAgICAgICAgICAgSGVhZGVyIGhlYWRlciA9IGdldEl0ZW0ocG9zaXRpb24pOworICAgICAgICAgICAgaG9sZGVyLmljb24uc2V0SW1hZ2VSZXNvdXJjZShoZWFkZXIuaWNvblJlcyk7CisgICAgICAgICAgICBob2xkZXIudGl0bGUuc2V0VGV4dChoZWFkZXIudGl0bGUpOworICAgICAgICAgICAgaWYgKFRleHRVdGlscy5pc0VtcHR5KGhlYWRlci5zdW1tYXJ5KSkgeworICAgICAgICAgICAgICAgIGhvbGRlci5zdW1tYXJ5LnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaG9sZGVyLnN1bW1hcnkuc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOworICAgICAgICAgICAgICAgIGhvbGRlci5zdW1tYXJ5LnNldFRleHQoaGVhZGVyLnN1bW1hcnkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gdmlldzsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIERlZmF1bHQgdmFsdWUgZm9yIHtAbGluayBIZWFkZXIjaWQgSGVhZGVyLmlkfSBpbmRpY2F0aW5nIHRoYXQgbm8KKyAgICAgKiBpZGVudGlmaWVyIHZhbHVlIGlzIHNldC4gIEFsbCBvdGhlciB2YWx1ZXMgKGluY2x1ZGluZyB0aG9zZSBiZWxvdyAtMSkKKyAgICAgKiBhcmUgdmFsaWQuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBsb25nIEhFQURFUl9JRF9VTkRFRklORUQgPSAtMTsKKyAgICAKKyAgICAvKioKKyAgICAgKiBEZXNjcmlwdGlvbiBvZiBhIHNpbmdsZSBIZWFkZXIgaXRlbSB0aGF0IHRoZSB1c2VyIGNhbiBzZWxlY3QuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBIZWFkZXIgaW1wbGVtZW50cyBQYXJjZWxhYmxlIHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIElkZW50aWZpZXIgZm9yIHRoaXMgaGVhZGVyLCB0byBjb3JyZWxhdGUgd2l0aCBhIG5ldyBsaXN0IHdoZW4KKyAgICAgICAgICogaXQgaXMgdXBkYXRlZC4gIFRoZSBkZWZhdWx0IHZhbHVlIGlzCisgICAgICAgICAqIHtAbGluayBQcmVmZXJlbmNlQWN0aXZpdHkjSEVBREVSX0lEX1VOREVGSU5FRH0sIG1lYW5pbmcgbm8gaWQuCisgICAgICAgICAqIEBhdHRyIHJlZiBhbmRyb2lkLlIuc3R5bGVhYmxlI1ByZWZlcmVuY2VIZWFkZXJfaWQKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBsb25nIGlkID0gSEVBREVSX0lEX1VOREVGSU5FRDsKKworICAgICAgICAvKioKKyAgICAgICAgICogVGl0bGUgb2YgdGhlIGhlYWRlciB0aGF0IGlzIHNob3duIHRvIHRoZSB1c2VyLgorICAgICAgICAgKiBAYXR0ciByZWYgYW5kcm9pZC5SLnN0eWxlYWJsZSNQcmVmZXJlbmNlSGVhZGVyX3RpdGxlCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgQ2hhclNlcXVlbmNlIHRpdGxlOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBPcHRpb25hbCBzdW1tYXJ5IGRlc2NyaWJpbmcgd2hhdCB0aGlzIGhlYWRlciBjb250cm9scy4KKyAgICAgICAgICogQGF0dHIgcmVmIGFuZHJvaWQuUi5zdHlsZWFibGUjUHJlZmVyZW5jZUhlYWRlcl9zdW1tYXJ5CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgQ2hhclNlcXVlbmNlIHN1bW1hcnk7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIE9wdGlvbmFsIGljb24gcmVzb3VyY2UgdG8gc2hvdyBmb3IgdGhpcyBoZWFkZXIuCisgICAgICAgICAqIEBhdHRyIHJlZiBhbmRyb2lkLlIuc3R5bGVhYmxlI1ByZWZlcmVuY2VIZWFkZXJfaWNvbgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIGludCBpY29uUmVzOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBGdWxsIGNsYXNzIG5hbWUgb2YgdGhlIGZyYWdtZW50IHRvIGRpc3BsYXkgd2hlbiB0aGlzIGhlYWRlciBpcworICAgICAgICAgKiBzZWxlY3RlZC4KKyAgICAgICAgICogQGF0dHIgcmVmIGFuZHJvaWQuUi5zdHlsZWFibGUjUHJlZmVyZW5jZUhlYWRlcl9mcmFnbWVudAorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIFN0cmluZyBmcmFnbWVudDsKKworICAgICAgICAvKioKKyAgICAgICAgICogT3B0aW9uYWwgYXJndW1lbnRzIHRvIHN1cHBseSB0byB0aGUgZnJhZ21lbnQgd2hlbiBpdCBpcworICAgICAgICAgKiBpbnN0YW50aWF0ZWQuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgQnVuZGxlIGZyYWdtZW50QXJndW1lbnRzOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBJbnRlbnQgdG8gbGF1bmNoIHdoZW4gdGhlIHByZWZlcmVuY2UgaXMgc2VsZWN0ZWQuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgSW50ZW50IGludGVudDsKKworICAgICAgICAvKioKKyAgICAgICAgICogT3B0aW9uYWwgYWRkaXRpb25hbCBkYXRhIGZvciB1c2UgYnkgc3ViY2xhc3NlcyBvZiBQcmVmZXJlbmNlQWN0aXZpdHkuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgQnVuZGxlIGV4dHJhczsKKworICAgICAgICBwdWJsaWMgSGVhZGVyKCkgeworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBpbnQgZGVzY3JpYmVDb250ZW50cygpIHsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIHdyaXRlVG9QYXJjZWwoUGFyY2VsIGRlc3QsIGludCBmbGFncykgeworICAgICAgICAgICAgZGVzdC53cml0ZUxvbmcoaWQpOworICAgICAgICAgICAgVGV4dFV0aWxzLndyaXRlVG9QYXJjZWwodGl0bGUsIGRlc3QsIGZsYWdzKTsKKyAgICAgICAgICAgIFRleHRVdGlscy53cml0ZVRvUGFyY2VsKHN1bW1hcnksIGRlc3QsIGZsYWdzKTsKKyAgICAgICAgICAgIGRlc3Qud3JpdGVJbnQoaWNvblJlcyk7CisgICAgICAgICAgICBkZXN0LndyaXRlU3RyaW5nKGZyYWdtZW50KTsKKyAgICAgICAgICAgIGRlc3Qud3JpdGVCdW5kbGUoZnJhZ21lbnRBcmd1bWVudHMpOworICAgICAgICAgICAgaWYgKGludGVudCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgZGVzdC53cml0ZUludCgxKTsKKyAgICAgICAgICAgICAgICBpbnRlbnQud3JpdGVUb1BhcmNlbChkZXN0LCBmbGFncyk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGRlc3Qud3JpdGVJbnQoMCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBkZXN0LndyaXRlQnVuZGxlKGV4dHJhcyk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCByZWFkRnJvbVBhcmNlbChQYXJjZWwgaW4pIHsKKyAgICAgICAgICAgIGlkID0gaW4ucmVhZExvbmcoKTsKKyAgICAgICAgICAgIHRpdGxlID0gVGV4dFV0aWxzLkNIQVJfU0VRVUVOQ0VfQ1JFQVRPUi5jcmVhdGVGcm9tUGFyY2VsKGluKTsKKyAgICAgICAgICAgIHN1bW1hcnkgPSBUZXh0VXRpbHMuQ0hBUl9TRVFVRU5DRV9DUkVBVE9SLmNyZWF0ZUZyb21QYXJjZWwoaW4pOworICAgICAgICAgICAgaWNvblJlcyA9IGluLnJlYWRJbnQoKTsKKyAgICAgICAgICAgIGZyYWdtZW50ID0gaW4ucmVhZFN0cmluZygpOworICAgICAgICAgICAgZnJhZ21lbnRBcmd1bWVudHMgPSBpbi5yZWFkQnVuZGxlKCk7CisgICAgICAgICAgICBpZiAoaW4ucmVhZEludCgpICE9IDApIHsKKyAgICAgICAgICAgICAgICBpbnRlbnQgPSBJbnRlbnQuQ1JFQVRPUi5jcmVhdGVGcm9tUGFyY2VsKGluKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGV4dHJhcyA9IGluLnJlYWRCdW5kbGUoKTsKKyAgICAgICAgfQorCisgICAgICAgIEhlYWRlcihQYXJjZWwgaW4pIHsKKyAgICAgICAgICAgIHJlYWRGcm9tUGFyY2VsKGluKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQ3JlYXRvcjxIZWFkZXI+IENSRUFUT1IgPSBuZXcgQ3JlYXRvcjxIZWFkZXI+KCkgeworICAgICAgICAgICAgcHVibGljIEhlYWRlciBjcmVhdGVGcm9tUGFyY2VsKFBhcmNlbCBzb3VyY2UpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEhlYWRlcihzb3VyY2UpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcHVibGljIEhlYWRlcltdIG5ld0FycmF5KGludCBzaXplKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBIZWFkZXJbc2l6ZV07CisgICAgICAgICAgICB9CisgICAgICAgIH07CisgICAgfQorCiAgICAgQE92ZXJyaWRlCiAgICAgcHJvdGVjdGVkIHZvaWQgb25DcmVhdGUoQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgewogICAgICAgICBzdXBlci5vbkNyZWF0ZShzYXZlZEluc3RhbmNlU3RhdGUpOwogCiAgICAgICAgIHNldENvbnRlbnRWaWV3KGNvbS5hbmRyb2lkLmludGVybmFsLlIubGF5b3V0LnByZWZlcmVuY2VfbGlzdF9jb250ZW50KTsKLSAgICAgICAgCi0gICAgICAgIG1QcmVmZXJlbmNlTWFuYWdlciA9IG9uQ3JlYXRlUHJlZmVyZW5jZU1hbmFnZXIoKTsKKworICAgICAgICBtTGlzdEZvb3RlciA9IChGcmFtZUxheW91dClmaW5kVmlld0J5SWQoY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5pZC5saXN0X2Zvb3Rlcik7CisgICAgICAgIG1QcmVmc0NvbnRhaW5lciA9IGZpbmRWaWV3QnlJZChjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmlkLnByZWZzKTsKKyAgICAgICAgYm9vbGVhbiBoaWRpbmdIZWFkZXJzID0gb25Jc0hpZGluZ0hlYWRlcnMoKTsKKyAgICAgICAgbVNpbmdsZVBhbmUgPSBoaWRpbmdIZWFkZXJzIHx8ICFvbklzTXVsdGlQYW5lKCk7CisgICAgICAgIFN0cmluZyBpbml0aWFsRnJhZ21lbnQgPSBnZXRJbnRlbnQoKS5nZXRTdHJpbmdFeHRyYShFWFRSQV9TSE9XX0ZSQUdNRU5UKTsKKyAgICAgICAgQnVuZGxlIGluaXRpYWxBcmd1bWVudHMgPSBnZXRJbnRlbnQoKS5nZXRCdW5kbGVFeHRyYShFWFRSQV9TSE9XX0ZSQUdNRU5UX0FSR1VNRU5UUyk7CisKKyAgICAgICAgaWYgKHNhdmVkSW5zdGFuY2VTdGF0ZSAhPSBudWxsKSB7CisgICAgICAgICAgICAvLyBXZSBhcmUgcmVzdGFydGluZyBmcm9tIGEgcHJldmlvdXMgc2F2ZWQgc3RhdGU7IHVzZWQgdGhhdCB0bworICAgICAgICAgICAgLy8gaW5pdGlhbGl6ZSwgaW5zdGVhZCBvZiBzdGFydGluZyBmcmVzaC4KKyAgICAgICAgICAgIEFycmF5TGlzdDxIZWFkZXI+IGhlYWRlcnMgPSBzYXZlZEluc3RhbmNlU3RhdGUuZ2V0UGFyY2VsYWJsZUFycmF5TGlzdChIRUFERVJTX1RBRyk7CisgICAgICAgICAgICBpZiAoaGVhZGVycyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgbUhlYWRlcnMuYWRkQWxsKGhlYWRlcnMpOworICAgICAgICAgICAgICAgIGludCBjdXJIZWFkZXIgPSBzYXZlZEluc3RhbmNlU3RhdGUuZ2V0SW50KENVUl9IRUFERVJfVEFHLAorICAgICAgICAgICAgICAgICAgICAgICAgKGludClIRUFERVJfSURfVU5ERUZJTkVEKTsKKyAgICAgICAgICAgICAgICBpZiAoY3VySGVhZGVyID49IDAgJiYgY3VySGVhZGVyIDwgbUhlYWRlcnMuc2l6ZSgpKSB7CisgICAgICAgICAgICAgICAgICAgIHNldFNlbGVjdGVkSGVhZGVyKG1IZWFkZXJzLmdldChjdXJIZWFkZXIpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtU2luZ2xlUGFuZSA9IHNhdmVkSW5zdGFuY2VTdGF0ZS5nZXRCb29sZWFuKFNJTkdMRV9QQU5FX1RBRyk7CisKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmIChpbml0aWFsRnJhZ21lbnQgIT0gbnVsbCAmJiBtU2luZ2xlUGFuZSkgeworICAgICAgICAgICAgICAgIC8vIElmIHdlIGFyZSBqdXN0IHNob3dpbmcgYSBmcmFnbWVudCwgd2Ugd2FudCB0byBydW4gaW4KKyAgICAgICAgICAgICAgICAvLyBuZXcgZnJhZ21lbnQgbW9kZSwgYnV0IGRvbid0IG5lZWQgdG8gY29tcHV0ZSBhbmQgc2hvdworICAgICAgICAgICAgICAgIC8vIHRoZSBoZWFkZXJzLgorICAgICAgICAgICAgICAgIHN3aXRjaFRvSGVhZGVyKGluaXRpYWxGcmFnbWVudCwgaW5pdGlhbEFyZ3VtZW50cyk7CisKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLy8gV2UgbmVlZCB0byB0cnkgdG8gYnVpbGQgdGhlIGhlYWRlcnMuCisgICAgICAgICAgICAgICAgb25CdWlsZEhlYWRlcnMobUhlYWRlcnMpOworCisgICAgICAgICAgICAgICAgLy8gSWYgdGhlcmUgYXJlIGhlYWRlcnMsIHRoZW4gYXQgdGhpcyBwb2ludCB3ZSBuZWVkIHRvIHNob3cKKyAgICAgICAgICAgICAgICAvLyB0aGVtIGFuZCwgZGVwZW5kaW5nIG9uIHRoZSBzY3JlZW4sIHdlIG1heSBhbHNvIHNob3cgaW4tbGluZQorICAgICAgICAgICAgICAgIC8vIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgcHJlZmVyZW5jZSBmcmFnbWVudC4KKyAgICAgICAgICAgICAgICBpZiAobUhlYWRlcnMuc2l6ZSgpID4gMCkgeworICAgICAgICAgICAgICAgICAgICBpZiAoIW1TaW5nbGVQYW5lKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5pdGlhbEZyYWdtZW50ID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBIZWFkZXIgaCA9IG9uR2V0SW5pdGlhbEhlYWRlcigpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaFRvSGVhZGVyKGgpOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2hUb0hlYWRlcihpbml0aWFsRnJhZ21lbnQsIGluaXRpYWxBcmd1bWVudHMpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gVGhlIGRlZmF1bHQgY29uZmlndXJhdGlvbiBpcyB0byBvbmx5IHNob3cgdGhlIGxpc3Qgdmlldy4gIEFkanVzdAorICAgICAgICAvLyB2aXNpYmlsaXR5IGZvciBvdGhlciBjb25maWd1cmF0aW9ucy4KKyAgICAgICAgaWYgKGluaXRpYWxGcmFnbWVudCAhPSBudWxsICYmIG1TaW5nbGVQYW5lKSB7CisgICAgICAgICAgICAvLyBTaW5nbGUgcGFuZSwgc2hvd2luZyBqdXN0IGEgcHJlZnMgZnJhZ21lbnQuCisgICAgICAgICAgICBnZXRMaXN0VmlldygpLnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKKyAgICAgICAgICAgIG1QcmVmc0NvbnRhaW5lci5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7CisgICAgICAgIH0gZWxzZSBpZiAobUhlYWRlcnMuc2l6ZSgpID4gMCkgeworICAgICAgICAgICAgbUFkYXB0ZXIgPSBuZXcgSGVhZGVyQWRhcHRlcih0aGlzLCBtSGVhZGVycyk7CisgICAgICAgICAgICBzZXRMaXN0QWRhcHRlcihtQWRhcHRlcik7CisgICAgICAgICAgICBpZiAoIW1TaW5nbGVQYW5lKSB7CisgICAgICAgICAgICAgICAgLy8gTXVsdGktcGFuZS4KKyAgICAgICAgICAgICAgICBnZXRMaXN0VmlldygpLnNldENob2ljZU1vZGUoQWJzTGlzdFZpZXcuQ0hPSUNFX01PREVfU0lOR0xFKTsKKyAgICAgICAgICAgICAgICBpZiAobUN1ckhlYWRlciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIHNldFNlbGVjdGVkSGVhZGVyKG1DdXJIZWFkZXIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBtUHJlZnNDb250YWluZXIuc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gSWYgdGhlcmUgYXJlIG5vIGhlYWRlcnMsIHdlIGFyZSBpbiB0aGUgb2xkICJqdXN0IHNob3cgYSBzY3JlZW4KKyAgICAgICAgICAgIC8vIG9mIHByZWZlcmVuY2VzIiBtb2RlLgorICAgICAgICAgICAgbVByZWZlcmVuY2VNYW5hZ2VyID0gbmV3IFByZWZlcmVuY2VNYW5hZ2VyKHRoaXMsIEZJUlNUX1JFUVVFU1RfQ09ERSk7CisgICAgICAgICAgICBtUHJlZmVyZW5jZU1hbmFnZXIuc2V0T25QcmVmZXJlbmNlVHJlZUNsaWNrTGlzdGVuZXIodGhpcyk7CisgICAgICAgIH0KKwogICAgICAgICBnZXRMaXN0VmlldygpLnNldFNjcm9sbEJhclN0eWxlKFZpZXcuU0NST0xMQkFSU19JTlNJREVfT1ZFUkxBWSk7CisKKyAgICAgICAgLy8gc2VlIGlmIHdlIHNob3VsZCBzaG93IEJhY2svTmV4dCBidXR0b25zCisgICAgICAgIEludGVudCBpbnRlbnQgPSBnZXRJbnRlbnQoKTsKKyAgICAgICAgaWYgKGludGVudC5nZXRCb29sZWFuRXh0cmEoRVhUUkFfUFJFRlNfU0hPV19CVVRUT05fQkFSLCBmYWxzZSkpIHsKKworICAgICAgICAgICAgZmluZFZpZXdCeUlkKGNvbS5hbmRyb2lkLmludGVybmFsLlIuaWQuYnV0dG9uX2Jhcikuc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOworCisgICAgICAgICAgICBCdXR0b24gYmFja0J1dHRvbiA9IChCdXR0b24pZmluZFZpZXdCeUlkKGNvbS5hbmRyb2lkLmludGVybmFsLlIuaWQuYmFja19idXR0b24pOworICAgICAgICAgICAgYmFja0J1dHRvbi5zZXRPbkNsaWNrTGlzdGVuZXIobmV3IE9uQ2xpY2tMaXN0ZW5lcigpIHsKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkNsaWNrKFZpZXcgdikgeworICAgICAgICAgICAgICAgICAgICBzZXRSZXN1bHQoUkVTVUxUX0NBTkNFTEVEKTsKKyAgICAgICAgICAgICAgICAgICAgZmluaXNoKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgICAgICAgICBCdXR0b24gc2tpcEJ1dHRvbiA9IChCdXR0b24pZmluZFZpZXdCeUlkKGNvbS5hbmRyb2lkLmludGVybmFsLlIuaWQuc2tpcF9idXR0b24pOworICAgICAgICAgICAgc2tpcEJ1dHRvbi5zZXRPbkNsaWNrTGlzdGVuZXIobmV3IE9uQ2xpY2tMaXN0ZW5lcigpIHsKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkNsaWNrKFZpZXcgdikgeworICAgICAgICAgICAgICAgICAgICBzZXRSZXN1bHQoUkVTVUxUX09LKTsKKyAgICAgICAgICAgICAgICAgICAgZmluaXNoKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgICAgICAgICBtTmV4dEJ1dHRvbiA9IChCdXR0b24pZmluZFZpZXdCeUlkKGNvbS5hbmRyb2lkLmludGVybmFsLlIuaWQubmV4dF9idXR0b24pOworICAgICAgICAgICAgbU5leHRCdXR0b24uc2V0T25DbGlja0xpc3RlbmVyKG5ldyBPbkNsaWNrTGlzdGVuZXIoKSB7CisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgb25DbGljayhWaWV3IHYpIHsKKyAgICAgICAgICAgICAgICAgICAgc2V0UmVzdWx0KFJFU1VMVF9PSyk7CisgICAgICAgICAgICAgICAgICAgIGZpbmlzaCgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworCisgICAgICAgICAgICAvLyBzZXQgb3VyIHZhcmlvdXMgYnV0dG9uIHBhcmFtZXRlcnMKKyAgICAgICAgICAgIGlmIChpbnRlbnQuaGFzRXh0cmEoRVhUUkFfUFJFRlNfU0VUX05FWFRfVEVYVCkpIHsKKyAgICAgICAgICAgICAgICBTdHJpbmcgYnV0dG9uVGV4dCA9IGludGVudC5nZXRTdHJpbmdFeHRyYShFWFRSQV9QUkVGU19TRVRfTkVYVF9URVhUKTsKKyAgICAgICAgICAgICAgICBpZiAoVGV4dFV0aWxzLmlzRW1wdHkoYnV0dG9uVGV4dCkpIHsKKyAgICAgICAgICAgICAgICAgICAgbU5leHRCdXR0b24uc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgbU5leHRCdXR0b24uc2V0VGV4dChidXR0b25UZXh0KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoaW50ZW50Lmhhc0V4dHJhKEVYVFJBX1BSRUZTX1NFVF9CQUNLX1RFWFQpKSB7CisgICAgICAgICAgICAgICAgU3RyaW5nIGJ1dHRvblRleHQgPSBpbnRlbnQuZ2V0U3RyaW5nRXh0cmEoRVhUUkFfUFJFRlNfU0VUX0JBQ0tfVEVYVCk7CisgICAgICAgICAgICAgICAgaWYgKFRleHRVdGlscy5pc0VtcHR5KGJ1dHRvblRleHQpKSB7CisgICAgICAgICAgICAgICAgICAgIGJhY2tCdXR0b24uc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgYmFja0J1dHRvbi5zZXRUZXh0KGJ1dHRvblRleHQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChpbnRlbnQuZ2V0Qm9vbGVhbkV4dHJhKEVYVFJBX1BSRUZTX1NIT1dfU0tJUCwgZmFsc2UpKSB7CisgICAgICAgICAgICAgICAgc2tpcEJ1dHRvbi5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhpcyBhY3Rpdml0eSBpcyBjdXJyZW50bHkgc2hvd2luZyB0aGUgaGVhZGVyIGxpc3QuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaGFzSGVhZGVycygpIHsKKyAgICAgICAgcmV0dXJuIGdldExpc3RWaWV3KCkuZ2V0VmlzaWJpbGl0eSgpID09IFZpZXcuVklTSUJMRQorICAgICAgICAgICAgICAgICYmIG1QcmVmZXJlbmNlTWFuYWdlciA9PSBudWxsOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIGFjdGl2aXR5IGlzIHNob3dpbmcgbXVsdGlwbGUgcGFuZXMgLS0gdGhlIGhlYWRlcnMKKyAgICAgKiBhbmQgYSBwcmVmZXJlbmNlIGZyYWdtZW50LgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzTXVsdGlQYW5lKCkgeworICAgICAgICByZXR1cm4gaGFzSGVhZGVycygpICYmIG1QcmVmc0NvbnRhaW5lci5nZXRWaXNpYmlsaXR5KCkgPT0gVmlldy5WSVNJQkxFOworICAgIH0KKworICAgIC8qKgorICAgICAqIENhbGxlZCB0byBkZXRlcm1pbmUgaWYgdGhlIGFjdGl2aXR5IHNob3VsZCBydW4gaW4gbXVsdGktcGFuZSBtb2RlLgorICAgICAqIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgdHJ1ZSBpZiB0aGUgc2NyZWVuIGlzIGxhcmdlCisgICAgICogZW5vdWdoLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIG9uSXNNdWx0aVBhbmUoKSB7CisgICAgICAgIENvbmZpZ3VyYXRpb24gY29uZmlnID0gZ2V0UmVzb3VyY2VzKCkuZ2V0Q29uZmlndXJhdGlvbigpOworICAgICAgICBpZiAoKGNvbmZpZy5zY3JlZW5MYXlvdXQmQ29uZmlndXJhdGlvbi5TQ1JFRU5MQVlPVVRfU0laRV9NQVNLKQorICAgICAgICAgICAgICAgID09IENvbmZpZ3VyYXRpb24uU0NSRUVOTEFZT1VUX1NJWkVfWExBUkdFCisgICAgICAgICAgICAgICAgJiYgY29uZmlnLm9yaWVudGF0aW9uID09IENvbmZpZ3VyYXRpb24uT1JJRU5UQVRJT05fTEFORFNDQVBFKSB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2FsbGVkIHRvIGRldGVybWluZSB3aGV0aGVyIHRoZSBoZWFkZXIgbGlzdCBzaG91bGQgYmUgaGlkZGVuLgorICAgICAqIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgdGhlCisgICAgICogdmFsdWUgZ2l2ZW4gaW4ge0BsaW5rICNFWFRSQV9OT19IRUFERVJTfSBvciBmYWxzZSBpZiBpdCBpcyBub3Qgc3VwcGxpZWQuCisgICAgICogVGhpcyBpcyBzZXQgdG8gZmFsc2UsIGZvciBleGFtcGxlLCB3aGVuIHRoZSBhY3Rpdml0eSBpcyBiZWluZyByZS1sYXVuY2hlZAorICAgICAqIHRvIHNob3cgYSBwYXJ0aWN1bGFyIHByZWZlcmVuY2UgYWN0aXZpdHkuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gb25Jc0hpZGluZ0hlYWRlcnMoKSB7CisgICAgICAgIHJldHVybiBnZXRJbnRlbnQoKS5nZXRCb29sZWFuRXh0cmEoRVhUUkFfTk9fSEVBREVSUywgZmFsc2UpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENhbGxlZCB0byBkZXRlcm1pbmUgdGhlIGluaXRpYWwgaGVhZGVyIHRvIGJlIHNob3duLiAgVGhlIGRlZmF1bHQKKyAgICAgKiBpbXBsZW1lbnRhdGlvbiBzaW1wbHkgcmV0dXJucyB0aGUgZnJhZ21lbnQgb2YgdGhlIGZpcnN0IGhlYWRlci4gIE5vdGUKKyAgICAgKiB0aGF0IHRoZSByZXR1cm5lZCBIZWFkZXIgb2JqZWN0IGRvZXMgbm90IGFjdHVhbGx5IG5lZWQgdG8gZXhpc3QgaW4KKyAgICAgKiB5b3VyIGhlYWRlciBsaXN0IC0tIHdoYXRldmVyIGl0cyBmcmFnbWVudCBpcyB3aWxsIHNpbXBseSBiZSB1c2VkIHRvCisgICAgICogc2hvdyBmb3IgdGhlIGluaXRpYWwgVUkuCisgICAgICovCisgICAgcHVibGljIEhlYWRlciBvbkdldEluaXRpYWxIZWFkZXIoKSB7CisgICAgICAgIHJldHVybiBtSGVhZGVycy5nZXQoMCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2FsbGVkIGFmdGVyIHRoZSBoZWFkZXIgbGlzdCBoYXMgYmVlbiB1cGRhdGVkICh7QGxpbmsgI29uQnVpbGRIZWFkZXJzfQorICAgICAqIGhhcyBiZWVuIGNhbGxlZCBhbmQgcmV0dXJuZWQgZHVlIHRvIHtAbGluayAjaW52YWxpZGF0ZUhlYWRlcnMoKX0pIHRvCisgICAgICogc3BlY2lmeSB0aGUgaGVhZGVyIHRoYXQgc2hvdWxkIG5vdyBiZSBzZWxlY3RlZC4gIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uCisgICAgICogcmV0dXJucyBudWxsIHRvIGtlZXAgd2hhdGV2ZXIgaGVhZGVyIGlzIGN1cnJlbnRseSBzZWxlY3RlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgSGVhZGVyIG9uR2V0TmV3SGVhZGVyKCkgeworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDYWxsZWQgd2hlbiB0aGUgYWN0aXZpdHkgbmVlZHMgaXRzIGxpc3Qgb2YgaGVhZGVycyBidWlsZC4gIEJ5CisgICAgICogaW1wbGVtZW50aW5nIHRoaXMgYW5kIGFkZGluZyBhdCBsZWFzdCBvbmUgaXRlbSB0byB0aGUgbGlzdCwgeW91CisgICAgICogd2lsbCBjYXVzZSB0aGUgYWN0aXZpdHkgdG8gcnVuIGluIGl0cyBtb2Rlcm4gZnJhZ21lbnQgbW9kZS4gIE5vdGUKKyAgICAgKiB0aGF0IHRoaXMgZnVuY3Rpb24gbWF5IG5vdCBhbHdheXMgYmUgY2FsbGVkOyBmb3IgZXhhbXBsZSwgaWYgdGhlCisgICAgICogYWN0aXZpdHkgaGFzIGJlZW4gYXNrZWQgdG8gZGlzcGxheSBhIHBhcnRpY3VsYXIgZnJhZ21lbnQgd2l0aG91dAorICAgICAqIHRoZSBoZWFkZXIgbGlzdCwgdGhlcmUgaXMgbm8gbmVlZCB0byBidWlsZCB0aGUgaGVhZGVycy4KKyAgICAgKgorICAgICAqIDxwPlR5cGljYWwgaW1wbGVtZW50YXRpb25zIHdpbGwgdXNlIHtAbGluayAjbG9hZEhlYWRlcnNGcm9tUmVzb3VyY2V9CisgICAgICogdG8gZmlsbCBpbiB0aGUgbGlzdCBmcm9tIGEgcmVzb3VyY2UuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdGFyZ2V0IFRoZSBsaXN0IGluIHdoaWNoIHRvIHBsYWNlIHRoZSBoZWFkZXJzLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIG9uQnVpbGRIZWFkZXJzKExpc3Q8SGVhZGVyPiB0YXJnZXQpIHsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDYWxsIHdoZW4geW91IG5lZWQgdG8gY2hhbmdlIHRoZSBoZWFkZXJzIGJlaW5nIGRpc3BsYXllZC4gIFdpbGwgcmVzdWx0CisgICAgICogaW4gb25CdWlsZEhlYWRlcnMoKSBsYXRlciBiZWluZyBjYWxsZWQgdG8gcmV0cmlldmUgdGhlIG5ldyBsaXN0LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGludmFsaWRhdGVIZWFkZXJzKCkgeworICAgICAgICBpZiAoIW1IYW5kbGVyLmhhc01lc3NhZ2VzKE1TR19CVUlMRF9IRUFERVJTKSkgeworICAgICAgICAgICAgbUhhbmRsZXIuc2VuZEVtcHR5TWVzc2FnZShNU0dfQlVJTERfSEVBREVSUyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQYXJzZSB0aGUgZ2l2ZW4gWE1MIGZpbGUgYXMgYSBoZWFkZXIgZGVzY3JpcHRpb24sIGFkZGluZyBlYWNoCisgICAgICogcGFyc2VkIEhlYWRlciBpbnRvIHRoZSB0YXJnZXQgbGlzdC4KKyAgICAgKgorICAgICAqIEBwYXJhbSByZXNpZCBUaGUgWE1MIHJlc291cmNlIHRvIGxvYWQgYW5kIHBhcnNlLgorICAgICAqIEBwYXJhbSB0YXJnZXQgVGhlIGxpc3QgaW4gd2hpY2ggdGhlIHBhcnNlZCBoZWFkZXJzIHNob3VsZCBiZSBwbGFjZWQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgbG9hZEhlYWRlcnNGcm9tUmVzb3VyY2UoaW50IHJlc2lkLCBMaXN0PEhlYWRlcj4gdGFyZ2V0KSB7CisgICAgICAgIFhtbFJlc291cmNlUGFyc2VyIHBhcnNlciA9IG51bGw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBwYXJzZXIgPSBnZXRSZXNvdXJjZXMoKS5nZXRYbWwocmVzaWQpOworICAgICAgICAgICAgQXR0cmlidXRlU2V0IGF0dHJzID0gWG1sLmFzQXR0cmlidXRlU2V0KHBhcnNlcik7CisKKyAgICAgICAgICAgIGludCB0eXBlOworICAgICAgICAgICAgd2hpbGUgKCh0eXBlPXBhcnNlci5uZXh0KCkpICE9IFhtbFB1bGxQYXJzZXIuRU5EX0RPQ1VNRU5UCisgICAgICAgICAgICAgICAgICAgICYmIHR5cGUgIT0gWG1sUHVsbFBhcnNlci5TVEFSVF9UQUcpIHsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgU3RyaW5nIG5vZGVOYW1lID0gcGFyc2VyLmdldE5hbWUoKTsKKyAgICAgICAgICAgIGlmICghInByZWZlcmVuY2UtaGVhZGVycyIuZXF1YWxzKG5vZGVOYW1lKSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAgICAgIlhNTCBkb2N1bWVudCBtdXN0IHN0YXJ0IHdpdGggPHByZWZlcmVuY2UtaGVhZGVycz4gdGFnOyBmb3VuZCIKKyAgICAgICAgICAgICAgICAgICAgICAgICsgbm9kZU5hbWUgKyAiIGF0ICIgKyBwYXJzZXIuZ2V0UG9zaXRpb25EZXNjcmlwdGlvbigpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQnVuZGxlIGN1ckJ1bmRsZSA9IG51bGw7CisKKyAgICAgICAgICAgIGZpbmFsIGludCBvdXRlckRlcHRoID0gcGFyc2VyLmdldERlcHRoKCk7CisgICAgICAgICAgICB3aGlsZSAoKHR5cGU9cGFyc2VyLm5leHQoKSkgIT0gWG1sUHVsbFBhcnNlci5FTkRfRE9DVU1FTlQKKyAgICAgICAgICAgICAgICAgICAmJiAodHlwZSAhPSBYbWxQdWxsUGFyc2VyLkVORF9UQUcgfHwgcGFyc2VyLmdldERlcHRoKCkgPiBvdXRlckRlcHRoKSkgeworICAgICAgICAgICAgICAgIGlmICh0eXBlID09IFhtbFB1bGxQYXJzZXIuRU5EX1RBRyB8fCB0eXBlID09IFhtbFB1bGxQYXJzZXIuVEVYVCkgeworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBub2RlTmFtZSA9IHBhcnNlci5nZXROYW1lKCk7CisgICAgICAgICAgICAgICAgaWYgKCJoZWFkZXIiLmVxdWFscyhub2RlTmFtZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgSGVhZGVyIGhlYWRlciA9IG5ldyBIZWFkZXIoKTsKKworICAgICAgICAgICAgICAgICAgICBUeXBlZEFycmF5IHNhID0gZ2V0UmVzb3VyY2VzKCkub2J0YWluQXR0cmlidXRlcyhhdHRycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZS5QcmVmZXJlbmNlSGVhZGVyKTsKKyAgICAgICAgICAgICAgICAgICAgaGVhZGVyLmlkID0gc2EuZ2V0SW50KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLlByZWZlcmVuY2VIZWFkZXJfaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludClIRUFERVJfSURfVU5ERUZJTkVEKTsKKyAgICAgICAgICAgICAgICAgICAgaGVhZGVyLnRpdGxlID0gc2EuZ2V0VGV4dCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZS5QcmVmZXJlbmNlSGVhZGVyX3RpdGxlKTsKKyAgICAgICAgICAgICAgICAgICAgaGVhZGVyLnN1bW1hcnkgPSBzYS5nZXRUZXh0KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLlByZWZlcmVuY2VIZWFkZXJfc3VtbWFyeSk7CisgICAgICAgICAgICAgICAgICAgIGhlYWRlci5pY29uUmVzID0gc2EuZ2V0UmVzb3VyY2VJZCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZS5QcmVmZXJlbmNlSGVhZGVyX2ljb24sIDApOworICAgICAgICAgICAgICAgICAgICBoZWFkZXIuZnJhZ21lbnQgPSBzYS5nZXRTdHJpbmcoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZWFibGUuUHJlZmVyZW5jZUhlYWRlcl9mcmFnbWVudCk7CisgICAgICAgICAgICAgICAgICAgIHNhLnJlY3ljbGUoKTsKKworICAgICAgICAgICAgICAgICAgICBpZiAoY3VyQnVuZGxlID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGN1ckJ1bmRsZSA9IG5ldyBCdW5kbGUoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGZpbmFsIGludCBpbm5lckRlcHRoID0gcGFyc2VyLmdldERlcHRoKCk7CisgICAgICAgICAgICAgICAgICAgIHdoaWxlICgodHlwZT1wYXJzZXIubmV4dCgpKSAhPSBYbWxQdWxsUGFyc2VyLkVORF9ET0NVTUVOVAorICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgKHR5cGUgIT0gWG1sUHVsbFBhcnNlci5FTkRfVEFHIHx8IHBhcnNlci5nZXREZXB0aCgpID4gaW5uZXJEZXB0aCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlID09IFhtbFB1bGxQYXJzZXIuRU5EX1RBRyB8fCB0eXBlID09IFhtbFB1bGxQYXJzZXIuVEVYVCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgaW5uZXJOb2RlTmFtZSA9IHBhcnNlci5nZXROYW1lKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5uZXJOb2RlTmFtZS5lcXVhbHMoImV4dHJhIikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRSZXNvdXJjZXMoKS5wYXJzZUJ1bmRsZUV4dHJhKCJleHRyYSIsIGF0dHJzLCBjdXJCdW5kbGUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhtbFV0aWxzLnNraXBDdXJyZW50VGFnKHBhcnNlcik7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoaW5uZXJOb2RlTmFtZS5lcXVhbHMoImludGVudCIpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyLmludGVudCA9IEludGVudC5wYXJzZUludGVudChnZXRSZXNvdXJjZXMoKSwgcGFyc2VyLCBhdHRycyk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgWG1sVXRpbHMuc2tpcEN1cnJlbnRUYWcocGFyc2VyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGlmIChjdXJCdW5kbGUuc2l6ZSgpID4gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyLmZyYWdtZW50QXJndW1lbnRzID0gY3VyQnVuZGxlOworICAgICAgICAgICAgICAgICAgICAgICAgY3VyQnVuZGxlID0gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIHRhcmdldC5hZGQoaGVhZGVyKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBYbWxVdGlscy5za2lwQ3VycmVudFRhZyhwYXJzZXIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICB9IGNhdGNoIChYbWxQdWxsUGFyc2VyRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJFcnJvciBwYXJzaW5nIGhlYWRlcnMiLCBlKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIkVycm9yIHBhcnNpbmcgaGVhZGVycyIsIGUpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgaWYgKHBhcnNlciAhPSBudWxsKSBwYXJzZXIuY2xvc2UoKTsKKyAgICAgICAgfQorCisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IGEgZm9vdGVyIHRoYXQgc2hvdWxkIGJlIHNob3duIGF0IHRoZSBib3R0b20gb2YgdGhlIGhlYWRlciBsaXN0LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldExpc3RGb290ZXIoVmlldyB2aWV3KSB7CisgICAgICAgIG1MaXN0Rm9vdGVyLnJlbW92ZUFsbFZpZXdzKCk7CisgICAgICAgIG1MaXN0Rm9vdGVyLmFkZFZpZXcodmlldywgbmV3IEZyYW1lTGF5b3V0LkxheW91dFBhcmFtcygKKyAgICAgICAgICAgICAgICBGcmFtZUxheW91dC5MYXlvdXRQYXJhbXMuTUFUQ0hfUEFSRU5ULAorICAgICAgICAgICAgICAgIEZyYW1lTGF5b3V0LkxheW91dFBhcmFtcy5XUkFQX0NPTlRFTlQpKTsKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKICAgICBwcm90ZWN0ZWQgdm9pZCBvblN0b3AoKSB7CiAgICAgICAgIHN1cGVyLm9uU3RvcCgpOwotICAgICAgICAKLSAgICAgICAgbVByZWZlcmVuY2VNYW5hZ2VyLmRpc3BhdGNoQWN0aXZpdHlTdG9wKCk7CisKKyAgICAgICAgaWYgKG1QcmVmZXJlbmNlTWFuYWdlciAhPSBudWxsKSB7CisgICAgICAgICAgICBtUHJlZmVyZW5jZU1hbmFnZXIuZGlzcGF0Y2hBY3Rpdml0eVN0b3AoKTsKKyAgICAgICAgfQogICAgIH0KIAogICAgIEBPdmVycmlkZQogICAgIHByb3RlY3RlZCB2b2lkIG9uRGVzdHJveSgpIHsKICAgICAgICAgc3VwZXIub25EZXN0cm95KCk7Ci0gICAgICAgIAotICAgICAgICBtUHJlZmVyZW5jZU1hbmFnZXIuZGlzcGF0Y2hBY3Rpdml0eURlc3Ryb3koKTsKKworICAgICAgICBpZiAobVByZWZlcmVuY2VNYW5hZ2VyICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1QcmVmZXJlbmNlTWFuYWdlci5kaXNwYXRjaEFjdGl2aXR5RGVzdHJveSgpOworICAgICAgICB9CiAgICAgfQogCiAgICAgQE92ZXJyaWRlCiAgICAgcHJvdGVjdGVkIHZvaWQgb25TYXZlSW5zdGFuY2VTdGF0ZShCdW5kbGUgb3V0U3RhdGUpIHsKICAgICAgICAgc3VwZXIub25TYXZlSW5zdGFuY2VTdGF0ZShvdXRTdGF0ZSk7CiAKLSAgICAgICAgZmluYWwgUHJlZmVyZW5jZVNjcmVlbiBwcmVmZXJlbmNlU2NyZWVuID0gZ2V0UHJlZmVyZW5jZVNjcmVlbigpOwotICAgICAgICBpZiAocHJlZmVyZW5jZVNjcmVlbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICBCdW5kbGUgY29udGFpbmVyID0gbmV3IEJ1bmRsZSgpOwotICAgICAgICAgICAgcHJlZmVyZW5jZVNjcmVlbi5zYXZlSGllcmFyY2h5U3RhdGUoY29udGFpbmVyKTsKLSAgICAgICAgICAgIG91dFN0YXRlLnB1dEJ1bmRsZShQUkVGRVJFTkNFU19UQUcsIGNvbnRhaW5lcik7CisgICAgICAgIGlmIChtSGVhZGVycy5zaXplKCkgPiAwKSB7CisgICAgICAgICAgICBvdXRTdGF0ZS5wdXRQYXJjZWxhYmxlQXJyYXlMaXN0KEhFQURFUlNfVEFHLCBtSGVhZGVycyk7CisgICAgICAgICAgICBpZiAobUN1ckhlYWRlciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgaW50IGluZGV4ID0gbUhlYWRlcnMuaW5kZXhPZihtQ3VySGVhZGVyKTsKKyAgICAgICAgICAgICAgICBpZiAoaW5kZXggPj0gMCkgeworICAgICAgICAgICAgICAgICAgICBvdXRTdGF0ZS5wdXRJbnQoQ1VSX0hFQURFUl9UQUcsIGluZGV4KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgb3V0U3RhdGUucHV0Qm9vbGVhbihTSU5HTEVfUEFORV9UQUcsIG1TaW5nbGVQYW5lKTsKKworICAgICAgICBpZiAobVByZWZlcmVuY2VNYW5hZ2VyICE9IG51bGwpIHsKKyAgICAgICAgICAgIGZpbmFsIFByZWZlcmVuY2VTY3JlZW4gcHJlZmVyZW5jZVNjcmVlbiA9IGdldFByZWZlcmVuY2VTY3JlZW4oKTsKKyAgICAgICAgICAgIGlmIChwcmVmZXJlbmNlU2NyZWVuICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBCdW5kbGUgY29udGFpbmVyID0gbmV3IEJ1bmRsZSgpOworICAgICAgICAgICAgICAgIHByZWZlcmVuY2VTY3JlZW4uc2F2ZUhpZXJhcmNoeVN0YXRlKGNvbnRhaW5lcik7CisgICAgICAgICAgICAgICAgb3V0U3RhdGUucHV0QnVuZGxlKFBSRUZFUkVOQ0VTX1RBRywgY29udGFpbmVyKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KIAogICAgIEBPdmVycmlkZQogICAgIHByb3RlY3RlZCB2b2lkIG9uUmVzdG9yZUluc3RhbmNlU3RhdGUoQnVuZGxlIHN0YXRlKSB7Ci0gICAgICAgIEJ1bmRsZSBjb250YWluZXIgPSBzdGF0ZS5nZXRCdW5kbGUoUFJFRkVSRU5DRVNfVEFHKTsKLSAgICAgICAgaWYgKGNvbnRhaW5lciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBmaW5hbCBQcmVmZXJlbmNlU2NyZWVuIHByZWZlcmVuY2VTY3JlZW4gPSBnZXRQcmVmZXJlbmNlU2NyZWVuKCk7Ci0gICAgICAgICAgICBpZiAocHJlZmVyZW5jZVNjcmVlbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcHJlZmVyZW5jZVNjcmVlbi5yZXN0b3JlSGllcmFyY2h5U3RhdGUoY29udGFpbmVyKTsKLSAgICAgICAgICAgICAgICBtU2F2ZWRJbnN0YW5jZVN0YXRlID0gc3RhdGU7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICBpZiAobVByZWZlcmVuY2VNYW5hZ2VyICE9IG51bGwpIHsKKyAgICAgICAgICAgIEJ1bmRsZSBjb250YWluZXIgPSBzdGF0ZS5nZXRCdW5kbGUoUFJFRkVSRU5DRVNfVEFHKTsKKyAgICAgICAgICAgIGlmIChjb250YWluZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGZpbmFsIFByZWZlcmVuY2VTY3JlZW4gcHJlZmVyZW5jZVNjcmVlbiA9IGdldFByZWZlcmVuY2VTY3JlZW4oKTsKKyAgICAgICAgICAgICAgICBpZiAocHJlZmVyZW5jZVNjcmVlbiAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIHByZWZlcmVuY2VTY3JlZW4ucmVzdG9yZUhpZXJhcmNoeVN0YXRlKGNvbnRhaW5lcik7CisgICAgICAgICAgICAgICAgICAgIG1TYXZlZEluc3RhbmNlU3RhdGUgPSBzdGF0ZTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgfQogCkBAIC0xNTYsMTQgKzc3NSwxNzMgQEAKICAgICBAT3ZlcnJpZGUKICAgICBwcm90ZWN0ZWQgdm9pZCBvbkFjdGl2aXR5UmVzdWx0KGludCByZXF1ZXN0Q29kZSwgaW50IHJlc3VsdENvZGUsIEludGVudCBkYXRhKSB7CiAgICAgICAgIHN1cGVyLm9uQWN0aXZpdHlSZXN1bHQocmVxdWVzdENvZGUsIHJlc3VsdENvZGUsIGRhdGEpOwotICAgICAgICAKLSAgICAgICAgbVByZWZlcmVuY2VNYW5hZ2VyLmRpc3BhdGNoQWN0aXZpdHlSZXN1bHQocmVxdWVzdENvZGUsIHJlc3VsdENvZGUsIGRhdGEpOworCisgICAgICAgIGlmIChtUHJlZmVyZW5jZU1hbmFnZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgbVByZWZlcmVuY2VNYW5hZ2VyLmRpc3BhdGNoQWN0aXZpdHlSZXN1bHQocmVxdWVzdENvZGUsIHJlc3VsdENvZGUsIGRhdGEpOworICAgICAgICB9CiAgICAgfQogCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgb25Db250ZW50Q2hhbmdlZCgpIHsKICAgICAgICAgc3VwZXIub25Db250ZW50Q2hhbmdlZCgpOwotICAgICAgICBwb3N0QmluZFByZWZlcmVuY2VzKCk7CisKKyAgICAgICAgaWYgKG1QcmVmZXJlbmNlTWFuYWdlciAhPSBudWxsKSB7CisgICAgICAgICAgICBwb3N0QmluZFByZWZlcmVuY2VzKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvbkxpc3RJdGVtQ2xpY2soTGlzdFZpZXcgbCwgVmlldyB2LCBpbnQgcG9zaXRpb24sIGxvbmcgaWQpIHsKKyAgICAgICAgc3VwZXIub25MaXN0SXRlbUNsaWNrKGwsIHYsIHBvc2l0aW9uLCBpZCk7CisKKyAgICAgICAgaWYgKG1BZGFwdGVyICE9IG51bGwpIHsKKyAgICAgICAgICAgIG9uSGVhZGVyQ2xpY2sobUhlYWRlcnMuZ2V0KHBvc2l0aW9uKSwgcG9zaXRpb24pOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2FsbGVkIHdoZW4gdGhlIHVzZXIgc2VsZWN0cyBhbiBpdGVtIGluIHRoZSBoZWFkZXIgbGlzdC4gIFRoZSBkZWZhdWx0CisgICAgICogaW1wbGVtZW50YXRpb24gd2lsbCBjYWxsIGVpdGhlciB7QGxpbmsgI3N0YXJ0V2l0aEZyYWdtZW50KFN0cmluZywgQnVuZGxlKX0KKyAgICAgKiBvciB7QGxpbmsgI3N3aXRjaFRvSGVhZGVyKEhlYWRlcil9IGFzIGFwcHJvcHJpYXRlLgorICAgICAqCisgICAgICogQHBhcmFtIGhlYWRlciBUaGUgaGVhZGVyIHRoYXQgd2FzIHNlbGVjdGVkLgorICAgICAqIEBwYXJhbSBwb3NpdGlvbiBUaGUgaGVhZGVyJ3MgcG9zaXRpb24gaW4gdGhlIGxpc3QuCisgICAgICovCisgICAgcHVibGljIHZvaWQgb25IZWFkZXJDbGljayhIZWFkZXIgaGVhZGVyLCBpbnQgcG9zaXRpb24pIHsKKyAgICAgICAgaWYgKGhlYWRlci5mcmFnbWVudCAhPSBudWxsKSB7CisgICAgICAgICAgICBpZiAobVNpbmdsZVBhbmUpIHsKKyAgICAgICAgICAgICAgICBzdGFydFdpdGhGcmFnbWVudChoZWFkZXIuZnJhZ21lbnQsIGhlYWRlci5mcmFnbWVudEFyZ3VtZW50cyk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHN3aXRjaFRvSGVhZGVyKGhlYWRlcik7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAoaGVhZGVyLmludGVudCAhPSBudWxsKSB7CisgICAgICAgICAgICBzdGFydEFjdGl2aXR5KGhlYWRlci5pbnRlbnQpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogU3RhcnQgYSBuZXcgaW5zdGFuY2Ugb2YgdGhpcyBhY3Rpdml0eSwgc2hvd2luZyBvbmx5IHRoZSBnaXZlbgorICAgICAqIHByZWZlcmVuY2UgZnJhZ21lbnQuICBXaGVuIGxhdW5jaGVkIGluIHRoaXMgbW9kZSwgdGhlIGhlYWRlciBsaXN0CisgICAgICogd2lsbCBiZSBoaWRkZW4gYW5kIHRoZSBnaXZlbiBwcmVmZXJlbmNlIGZyYWdtZW50IHdpbGwgYmUgaW5zdGFudGlhdGVkCisgICAgICogYW5kIGZpbGwgdGhlIGVudGlyZSBhY3Rpdml0eS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBmcmFnbWVudE5hbWUgVGhlIG5hbWUgb2YgdGhlIGZyYWdtZW50IHRvIGRpc3BsYXkuCisgICAgICogQHBhcmFtIGFyZ3MgT3B0aW9uYWwgYXJndW1lbnRzIHRvIHN1cHBseSB0byB0aGUgZnJhZ21lbnQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc3RhcnRXaXRoRnJhZ21lbnQoU3RyaW5nIGZyYWdtZW50TmFtZSwgQnVuZGxlIGFyZ3MpIHsKKyAgICAgICAgSW50ZW50IGludGVudCA9IG5ldyBJbnRlbnQoSW50ZW50LkFDVElPTl9NQUlOKTsKKyAgICAgICAgaW50ZW50LnNldENsYXNzKHRoaXMsIGdldENsYXNzKCkpOworICAgICAgICBpbnRlbnQucHV0RXh0cmEoRVhUUkFfU0hPV19GUkFHTUVOVCwgZnJhZ21lbnROYW1lKTsKKyAgICAgICAgaW50ZW50LnB1dEV4dHJhKEVYVFJBX1NIT1dfRlJBR01FTlRfQVJHVU1FTlRTLCBhcmdzKTsKKyAgICAgICAgaW50ZW50LnB1dEV4dHJhKEVYVFJBX05PX0hFQURFUlMsIHRydWUpOworICAgICAgICBzdGFydEFjdGl2aXR5KGludGVudCk7CisgICAgfQorCisgICAgdm9pZCBzZXRTZWxlY3RlZEhlYWRlcihIZWFkZXIgaGVhZGVyKSB7CisgICAgICAgIG1DdXJIZWFkZXIgPSBoZWFkZXI7CisgICAgICAgIGludCBpbmRleCA9IG1IZWFkZXJzLmluZGV4T2YoaGVhZGVyKTsKKyAgICAgICAgaWYgKGluZGV4ID49IDApIHsKKyAgICAgICAgICAgIGdldExpc3RWaWV3KCkuc2V0SXRlbUNoZWNrZWQoaW5kZXgsIHRydWUpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZ2V0TGlzdFZpZXcoKS5jbGVhckNob2ljZXMoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFdoZW4gaW4gdHdvLXBhbmUgbW9kZSwgc3dpdGNoIHRoZSBmcmFnbWVudCBwYW5lIHRvIHNob3cgdGhlIGdpdmVuCisgICAgICogcHJlZmVyZW5jZSBmcmFnbWVudC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBmcmFnbWVudE5hbWUgVGhlIG5hbWUgb2YgdGhlIGZyYWdtZW50IHRvIGRpc3BsYXkuCisgICAgICogQHBhcmFtIGFyZ3MgT3B0aW9uYWwgYXJndW1lbnRzIHRvIHN1cHBseSB0byB0aGUgZnJhZ21lbnQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc3dpdGNoVG9IZWFkZXIoU3RyaW5nIGZyYWdtZW50TmFtZSwgQnVuZGxlIGFyZ3MpIHsKKyAgICAgICAgc2V0U2VsZWN0ZWRIZWFkZXIobnVsbCk7CisKKyAgICAgICAgZ2V0RnJhZ21lbnRNYW5hZ2VyKCkucG9wQmFja1N0YWNrKEJBQ0tfU1RBQ0tfUFJFRlMsIFBPUF9CQUNLX1NUQUNLX0lOQ0xVU0lWRSk7CisKKyAgICAgICAgRnJhZ21lbnQgZiA9IEZyYWdtZW50Lmluc3RhbnRpYXRlKHRoaXMsIGZyYWdtZW50TmFtZSwgYXJncyk7CisgICAgICAgIGdldEZyYWdtZW50TWFuYWdlcigpLm9wZW5UcmFuc2FjdGlvbigpLnJlcGxhY2UoCisgICAgICAgICAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5pZC5wcmVmcywgZikuY29tbWl0KCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogV2hlbiBpbiB0d28tcGFuZSBtb2RlLCBzd2l0Y2ggdG8gdGhlIGZyYWdtZW50IHBhbmUgdG8gc2hvdyB0aGUgZ2l2ZW4KKyAgICAgKiBwcmVmZXJlbmNlIGZyYWdtZW50LgorICAgICAqCisgICAgICogQHBhcmFtIGhlYWRlciBUaGUgbmV3IGhlYWRlciB0byBkaXNwbGF5LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHN3aXRjaFRvSGVhZGVyKEhlYWRlciBoZWFkZXIpIHsKKyAgICAgICAgc3dpdGNoVG9IZWFkZXIoaGVhZGVyLmZyYWdtZW50LCBoZWFkZXIuZnJhZ21lbnRBcmd1bWVudHMpOworICAgICAgICBtQ3VySGVhZGVyID0gaGVhZGVyOworICAgICAgICBzZXRTZWxlY3RlZEhlYWRlcihoZWFkZXIpOworICAgIH0KKworICAgIEhlYWRlciBmaW5kQmVzdE1hdGNoaW5nSGVhZGVyKEhlYWRlciBjdXIsIEFycmF5TGlzdDxIZWFkZXI+IGZyb20pIHsKKyAgICAgICAgQXJyYXlMaXN0PEhlYWRlcj4gbWF0Y2hlcyA9IG5ldyBBcnJheUxpc3Q8SGVhZGVyPigpOworICAgICAgICBmb3IgKGludCBqPTA7IGo8ZnJvbS5zaXplKCk7IGorKykgeworICAgICAgICAgICAgSGVhZGVyIG9oID0gZnJvbS5nZXQoaik7CisgICAgICAgICAgICBpZiAoY3VyID09IG9oIHx8IChjdXIuaWQgIT0gSEVBREVSX0lEX1VOREVGSU5FRCAmJiBjdXIuaWQgPT0gb2guaWQpKSB7CisgICAgICAgICAgICAgICAgLy8gTXVzdCBiZSB0aGlzIG9uZS4KKyAgICAgICAgICAgICAgICBtYXRjaGVzLmNsZWFyKCk7CisgICAgICAgICAgICAgICAgbWF0Y2hlcy5hZGQob2gpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGN1ci5mcmFnbWVudCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgaWYgKGN1ci5mcmFnbWVudC5lcXVhbHMob2guZnJhZ21lbnQpKSB7CisgICAgICAgICAgICAgICAgICAgIG1hdGNoZXMuYWRkKG9oKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgaWYgKGN1ci5pbnRlbnQgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGlmIChjdXIuaW50ZW50LmVxdWFscyhvaC5pbnRlbnQpKSB7CisgICAgICAgICAgICAgICAgICAgIG1hdGNoZXMuYWRkKG9oKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgaWYgKGN1ci50aXRsZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgaWYgKGN1ci50aXRsZS5lcXVhbHMob2gudGl0bGUpKSB7CisgICAgICAgICAgICAgICAgICAgIG1hdGNoZXMuYWRkKG9oKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZmluYWwgaW50IE5NID0gbWF0Y2hlcy5zaXplKCk7CisgICAgICAgIGlmIChOTSA9PSAxKSB7CisgICAgICAgICAgICByZXR1cm4gbWF0Y2hlcy5nZXQoMCk7CisgICAgICAgIH0gZWxzZSBpZiAoTk0gPiAxKSB7CisgICAgICAgICAgICBmb3IgKGludCBqPTA7IGo8Tk07IGorKykgeworICAgICAgICAgICAgICAgIEhlYWRlciBvaCA9IG1hdGNoZXMuZ2V0KGopOworICAgICAgICAgICAgICAgIGlmIChjdXIuZnJhZ21lbnRBcmd1bWVudHMgIT0gbnVsbCAmJgorICAgICAgICAgICAgICAgICAgICAgICAgY3VyLmZyYWdtZW50QXJndW1lbnRzLmVxdWFscyhvaC5mcmFnbWVudEFyZ3VtZW50cykpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9oOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoY3VyLmV4dHJhcyAhPSBudWxsICYmIGN1ci5leHRyYXMuZXF1YWxzKG9oLmV4dHJhcykpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9oOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoY3VyLnRpdGxlICE9IG51bGwgJiYgY3VyLnRpdGxlLmVxdWFscyhvaC50aXRsZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9oOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTdGFydCBhIG5ldyBmcmFnbWVudC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBmcmFnbWVudCBUaGUgZnJhZ21lbnQgdG8gc3RhcnQKKyAgICAgKiBAcGFyYW0gcHVzaCBJZiB0cnVlLCB0aGUgY3VycmVudCBmcmFnbWVudCB3aWxsIGJlIHB1c2hlZCBvbnRvIHRoZSBiYWNrIHN0YWNrLiAgSWYgZmFsc2UsCisgICAgICogdGhlIGN1cnJlbnQgZnJhZ21lbnQgd2lsbCBiZSByZXBsYWNlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzdGFydFByZWZlcmVuY2VGcmFnbWVudChGcmFnbWVudCBmcmFnbWVudCwgYm9vbGVhbiBwdXNoKSB7CisgICAgICAgIEZyYWdtZW50VHJhbnNhY3Rpb24gdHJhbnNhY3Rpb24gPSBnZXRGcmFnbWVudE1hbmFnZXIoKS5vcGVuVHJhbnNhY3Rpb24oKTsKKyAgICAgICAgdHJhbnNhY3Rpb24ucmVwbGFjZShjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmlkLnByZWZzLCBmcmFnbWVudCk7CisgICAgICAgIGlmIChwdXNoKSB7CisgICAgICAgICAgICB0cmFuc2FjdGlvbi5hZGRUb0JhY2tTdGFjayhCQUNLX1NUQUNLX1BSRUZTKTsKKyAgICAgICAgfQorICAgICAgICB0cmFuc2FjdGlvbi5jb21taXQoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBvblByZWZlcmVuY2VTdGFydEZyYWdtZW50KFByZWZlcmVuY2VGcmFnbWVudCBjYWxsZXIsIFByZWZlcmVuY2UgcHJlZikgeworICAgICAgICBGcmFnbWVudCBmID0gRnJhZ21lbnQuaW5zdGFudGlhdGUodGhpcywgcHJlZi5nZXRGcmFnbWVudCgpLCBwcmVmLmdldEV4dHJhcygpKTsKKyAgICAgICAgc3RhcnRQcmVmZXJlbmNlRnJhZ21lbnQoZiwgdHJ1ZSk7CisgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KIAogICAgIC8qKgpAQCAtMTc2LDcgKzk1NCw3IEBACiAgICAgICAgIGlmIChtSGFuZGxlci5oYXNNZXNzYWdlcyhNU0dfQklORF9QUkVGRVJFTkNFUykpIHJldHVybjsKICAgICAgICAgbUhhbmRsZXIub2J0YWluTWVzc2FnZShNU0dfQklORF9QUkVGRVJFTkNFUykuc2VuZFRvVGFyZ2V0KCk7CiAgICAgfQotICAgIAorCiAgICAgcHJpdmF0ZSB2b2lkIGJpbmRQcmVmZXJlbmNlcygpIHsKICAgICAgICAgZmluYWwgUHJlZmVyZW5jZVNjcmVlbiBwcmVmZXJlbmNlU2NyZWVuID0gZ2V0UHJlZmVyZW5jZVNjcmVlbigpOwogICAgICAgICBpZiAocHJlZmVyZW5jZVNjcmVlbiAhPSBudWxsKSB7CkBAIC0xODcsMzggKzk2NSw0MSBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQotICAgIAotICAgIC8qKgotICAgICAqIENyZWF0ZXMgdGhlIHtAbGluayBQcmVmZXJlbmNlTWFuYWdlcn0uCi0gICAgICogCi0gICAgICogQHJldHVybiBUaGUge0BsaW5rIFByZWZlcmVuY2VNYW5hZ2VyfSB1c2VkIGJ5IHRoaXMgYWN0aXZpdHkuCi0gICAgICovCi0gICAgcHJpdmF0ZSBQcmVmZXJlbmNlTWFuYWdlciBvbkNyZWF0ZVByZWZlcmVuY2VNYW5hZ2VyKCkgewotICAgICAgICBQcmVmZXJlbmNlTWFuYWdlciBwcmVmZXJlbmNlTWFuYWdlciA9IG5ldyBQcmVmZXJlbmNlTWFuYWdlcih0aGlzLCBGSVJTVF9SRVFVRVNUX0NPREUpOwotICAgICAgICBwcmVmZXJlbmNlTWFuYWdlci5zZXRPblByZWZlcmVuY2VUcmVlQ2xpY2tMaXN0ZW5lcih0aGlzKTsKLSAgICAgICAgcmV0dXJuIHByZWZlcmVuY2VNYW5hZ2VyOwotICAgIH0KLSAgICAKKwogICAgIC8qKgogICAgICAqIFJldHVybnMgdGhlIHtAbGluayBQcmVmZXJlbmNlTWFuYWdlcn0gdXNlZCBieSB0aGlzIGFjdGl2aXR5LgogICAgICAqIEByZXR1cm4gVGhlIHtAbGluayBQcmVmZXJlbmNlTWFuYWdlcn0uCisgICAgICoKKyAgICAgKiBAZGVwcmVjYXRlZCBUaGlzIGZ1bmN0aW9uIGlzIG5vdCByZWxldmFudCBmb3IgYSBtb2Rlcm4gZnJhZ21lbnQtYmFzZWQKKyAgICAgKiBQcmVmZXJlbmNlQWN0aXZpdHkuCiAgICAgICovCisgICAgQERlcHJlY2F0ZWQKICAgICBwdWJsaWMgUHJlZmVyZW5jZU1hbmFnZXIgZ2V0UHJlZmVyZW5jZU1hbmFnZXIoKSB7CiAgICAgICAgIHJldHVybiBtUHJlZmVyZW5jZU1hbmFnZXI7CiAgICAgfQotICAgIAorCiAgICAgcHJpdmF0ZSB2b2lkIHJlcXVpcmVQcmVmZXJlbmNlTWFuYWdlcigpIHsKICAgICAgICAgaWYgKG1QcmVmZXJlbmNlTWFuYWdlciA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiVGhpcyBzaG91bGQgYmUgY2FsbGVkIGFmdGVyIHN1cGVyLm9uQ3JlYXRlLiIpOworICAgICAgICAgICAgaWYgKG1BZGFwdGVyID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiVGhpcyBzaG91bGQgYmUgY2FsbGVkIGFmdGVyIHN1cGVyLm9uQ3JlYXRlLiIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICJNb2Rlcm4gdHdvLXBhbmUgUHJlZmVyZW5jZUFjdGl2aXR5IHJlcXVpcmVzIHVzZSBvZiBhIFByZWZlcmVuY2VGcmFnbWVudCIpOwogICAgICAgICB9CiAgICAgfQogCiAgICAgLyoqCiAgICAgICogU2V0cyB0aGUgcm9vdCBvZiB0aGUgcHJlZmVyZW5jZSBoaWVyYXJjaHkgdGhhdCB0aGlzIGFjdGl2aXR5IGlzIHNob3dpbmcuCi0gICAgICogCisgICAgICoKICAgICAgKiBAcGFyYW0gcHJlZmVyZW5jZVNjcmVlbiBUaGUgcm9vdCB7QGxpbmsgUHJlZmVyZW5jZVNjcmVlbn0gb2YgdGhlIHByZWZlcmVuY2UgaGllcmFyY2h5LgorICAgICAqCisgICAgICogQGRlcHJlY2F0ZWQgVGhpcyBmdW5jdGlvbiBpcyBub3QgcmVsZXZhbnQgZm9yIGEgbW9kZXJuIGZyYWdtZW50LWJhc2VkCisgICAgICogUHJlZmVyZW5jZUFjdGl2aXR5LgogICAgICAqLworICAgIEBEZXByZWNhdGVkCiAgICAgcHVibGljIHZvaWQgc2V0UHJlZmVyZW5jZVNjcmVlbihQcmVmZXJlbmNlU2NyZWVuIHByZWZlcmVuY2VTY3JlZW4pIHsKKyAgICAgICAgcmVxdWlyZVByZWZlcmVuY2VNYW5hZ2VyKCk7CisKICAgICAgICAgaWYgKG1QcmVmZXJlbmNlTWFuYWdlci5zZXRQcmVmZXJlbmNlcyhwcmVmZXJlbmNlU2NyZWVuKSAmJiBwcmVmZXJlbmNlU2NyZWVuICE9IG51bGwpIHsKICAgICAgICAgICAgIHBvc3RCaW5kUHJlZmVyZW5jZXMoKTsKICAgICAgICAgICAgIENoYXJTZXF1ZW5jZSB0aXRsZSA9IGdldFByZWZlcmVuY2VTY3JlZW4oKS5nZXRUaXRsZSgpOwpAQCAtMjI4LDYxICsxMDA5LDg0IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9Ci0gICAgCisKICAgICAvKioKICAgICAgKiBHZXRzIHRoZSByb290IG9mIHRoZSBwcmVmZXJlbmNlIGhpZXJhcmNoeSB0aGF0IHRoaXMgYWN0aXZpdHkgaXMgc2hvd2luZy4KLSAgICAgKiAKKyAgICAgKgogICAgICAqIEByZXR1cm4gVGhlIHtAbGluayBQcmVmZXJlbmNlU2NyZWVufSB0aGF0IGlzIHRoZSByb290IG9mIHRoZSBwcmVmZXJlbmNlCiAgICAgICogICAgICAgICBoaWVyYXJjaHkuCisgICAgICoKKyAgICAgKiBAZGVwcmVjYXRlZCBUaGlzIGZ1bmN0aW9uIGlzIG5vdCByZWxldmFudCBmb3IgYSBtb2Rlcm4gZnJhZ21lbnQtYmFzZWQKKyAgICAgKiBQcmVmZXJlbmNlQWN0aXZpdHkuCiAgICAgICovCisgICAgQERlcHJlY2F0ZWQKICAgICBwdWJsaWMgUHJlZmVyZW5jZVNjcmVlbiBnZXRQcmVmZXJlbmNlU2NyZWVuKCkgewotICAgICAgICByZXR1cm4gbVByZWZlcmVuY2VNYW5hZ2VyLmdldFByZWZlcmVuY2VTY3JlZW4oKTsKKyAgICAgICAgaWYgKG1QcmVmZXJlbmNlTWFuYWdlciAhPSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gbVByZWZlcmVuY2VNYW5hZ2VyLmdldFByZWZlcmVuY2VTY3JlZW4oKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbnVsbDsKICAgICB9Ci0gICAgCisKICAgICAvKioKICAgICAgKiBBZGRzIHByZWZlcmVuY2VzIGZyb20gYWN0aXZpdGllcyB0aGF0IG1hdGNoIHRoZSBnaXZlbiB7QGxpbmsgSW50ZW50fS4KLSAgICAgKiAKKyAgICAgKgogICAgICAqIEBwYXJhbSBpbnRlbnQgVGhlIHtAbGluayBJbnRlbnR9IHRvIHF1ZXJ5IGFjdGl2aXRpZXMuCisgICAgICoKKyAgICAgKiBAZGVwcmVjYXRlZCBUaGlzIGZ1bmN0aW9uIGlzIG5vdCByZWxldmFudCBmb3IgYSBtb2Rlcm4gZnJhZ21lbnQtYmFzZWQKKyAgICAgKiBQcmVmZXJlbmNlQWN0aXZpdHkuCiAgICAgICovCisgICAgQERlcHJlY2F0ZWQKICAgICBwdWJsaWMgdm9pZCBhZGRQcmVmZXJlbmNlc0Zyb21JbnRlbnQoSW50ZW50IGludGVudCkgewogICAgICAgICByZXF1aXJlUHJlZmVyZW5jZU1hbmFnZXIoKTsKLSAgICAgICAgCisKICAgICAgICAgc2V0UHJlZmVyZW5jZVNjcmVlbihtUHJlZmVyZW5jZU1hbmFnZXIuaW5mbGF0ZUZyb21JbnRlbnQoaW50ZW50LCBnZXRQcmVmZXJlbmNlU2NyZWVuKCkpKTsKICAgICB9Ci0gICAgCisKICAgICAvKioKICAgICAgKiBJbmZsYXRlcyB0aGUgZ2l2ZW4gWE1MIHJlc291cmNlIGFuZCBhZGRzIHRoZSBwcmVmZXJlbmNlIGhpZXJhcmNoeSB0byB0aGUgY3VycmVudAogICAgICAqIHByZWZlcmVuY2UgaGllcmFyY2h5LgotICAgICAqIAorICAgICAqCiAgICAgICogQHBhcmFtIHByZWZlcmVuY2VzUmVzSWQgVGhlIFhNTCByZXNvdXJjZSBJRCB0byBpbmZsYXRlLgorICAgICAqCisgICAgICogQGRlcHJlY2F0ZWQgVGhpcyBmdW5jdGlvbiBpcyBub3QgcmVsZXZhbnQgZm9yIGEgbW9kZXJuIGZyYWdtZW50LWJhc2VkCisgICAgICogUHJlZmVyZW5jZUFjdGl2aXR5LgogICAgICAqLworICAgIEBEZXByZWNhdGVkCiAgICAgcHVibGljIHZvaWQgYWRkUHJlZmVyZW5jZXNGcm9tUmVzb3VyY2UoaW50IHByZWZlcmVuY2VzUmVzSWQpIHsKICAgICAgICAgcmVxdWlyZVByZWZlcmVuY2VNYW5hZ2VyKCk7Ci0gICAgICAgIAorCiAgICAgICAgIHNldFByZWZlcmVuY2VTY3JlZW4obVByZWZlcmVuY2VNYW5hZ2VyLmluZmxhdGVGcm9tUmVzb3VyY2UodGhpcywgcHJlZmVyZW5jZXNSZXNJZCwKICAgICAgICAgICAgICAgICBnZXRQcmVmZXJlbmNlU2NyZWVuKCkpKTsKICAgICB9CiAKICAgICAvKioKICAgICAgKiB7QGluaGVyaXREb2N9CisgICAgICoKKyAgICAgKiBAZGVwcmVjYXRlZCBUaGlzIGZ1bmN0aW9uIGlzIG5vdCByZWxldmFudCBmb3IgYSBtb2Rlcm4gZnJhZ21lbnQtYmFzZWQKKyAgICAgKiBQcmVmZXJlbmNlQWN0aXZpdHkuCiAgICAgICovCisgICAgQERlcHJlY2F0ZWQKICAgICBwdWJsaWMgYm9vbGVhbiBvblByZWZlcmVuY2VUcmVlQ2xpY2soUHJlZmVyZW5jZVNjcmVlbiBwcmVmZXJlbmNlU2NyZWVuLCBQcmVmZXJlbmNlIHByZWZlcmVuY2UpIHsKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KLSAgICAKKwogICAgIC8qKgogICAgICAqIEZpbmRzIGEge0BsaW5rIFByZWZlcmVuY2V9IGJhc2VkIG9uIGl0cyBrZXkuCi0gICAgICogCisgICAgICoKICAgICAgKiBAcGFyYW0ga2V5IFRoZSBrZXkgb2YgdGhlIHByZWZlcmVuY2UgdG8gcmV0cmlldmUuCiAgICAgICogQHJldHVybiBUaGUge0BsaW5rIFByZWZlcmVuY2V9IHdpdGggdGhlIGtleSwgb3IgbnVsbC4KICAgICAgKiBAc2VlIFByZWZlcmVuY2VHcm91cCNmaW5kUHJlZmVyZW5jZShDaGFyU2VxdWVuY2UpCisgICAgICoKKyAgICAgKiBAZGVwcmVjYXRlZCBUaGlzIGZ1bmN0aW9uIGlzIG5vdCByZWxldmFudCBmb3IgYSBtb2Rlcm4gZnJhZ21lbnQtYmFzZWQKKyAgICAgKiBQcmVmZXJlbmNlQWN0aXZpdHkuCiAgICAgICovCisgICAgQERlcHJlY2F0ZWQKICAgICBwdWJsaWMgUHJlZmVyZW5jZSBmaW5kUHJlZmVyZW5jZShDaGFyU2VxdWVuY2Uga2V5KSB7Ci0gICAgICAgIAorCiAgICAgICAgIGlmIChtUHJlZmVyZW5jZU1hbmFnZXIgPT0gbnVsbCkgewogICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgIH0KLSAgICAgICAgCisKICAgICAgICAgcmV0dXJuIG1QcmVmZXJlbmNlTWFuYWdlci5maW5kUHJlZmVyZW5jZShrZXkpOwogICAgIH0KIApAQCAtMjkyLDUgKzEwOTYsMTQgQEAKICAgICAgICAgICAgIG1QcmVmZXJlbmNlTWFuYWdlci5kaXNwYXRjaE5ld0ludGVudChpbnRlbnQpOwogICAgICAgICB9CiAgICAgfQotICAgIAorCisgICAgLy8gZ2l2ZSBzdWJjbGFzc2VzIGFjY2VzcyB0byB0aGUgTmV4dCBidXR0b24KKyAgICAvKiogQGhpZGUgKi8KKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiBoYXNOZXh0QnV0dG9uKCkgeworICAgICAgICByZXR1cm4gbU5leHRCdXR0b24gIT0gbnVsbDsKKyAgICB9CisgICAgLyoqIEBoaWRlICovCisgICAgcHJvdGVjdGVkIEJ1dHRvbiBnZXROZXh0QnV0dG9uKCkgeworICAgICAgICByZXR1cm4gbU5leHRCdXR0b247CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvcHJlZmVyZW5jZS9QcmVmZXJlbmNlRnJhZ21lbnQuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3ByZWZlcmVuY2UvUHJlZmVyZW5jZUZyYWdtZW50LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDc5NDk3YQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3ByZWZlcmVuY2UvUHJlZmVyZW5jZUZyYWdtZW50LmphdmEKQEAgLTAsMCArMSwzNDYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQucHJlZmVyZW5jZTsKKworaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5OworaW1wb3J0IGFuZHJvaWQuYXBwLkZyYWdtZW50OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LlNoYXJlZFByZWZlcmVuY2VzOworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLk1lc3NhZ2U7CitpbXBvcnQgYW5kcm9pZC52aWV3LkxheW91dEluZmxhdGVyOworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3R3JvdXA7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuTGlzdFZpZXc7CisKKy8qKgorICogU2hvd3MgYSBoaWVyYXJjaHkgb2Yge0BsaW5rIFByZWZlcmVuY2V9IG9iamVjdHMgYXMKKyAqIGxpc3RzLiBUaGVzZSBwcmVmZXJlbmNlcyB3aWxsCisgKiBhdXRvbWF0aWNhbGx5IHNhdmUgdG8ge0BsaW5rIFNoYXJlZFByZWZlcmVuY2VzfSBhcyB0aGUgdXNlciBpbnRlcmFjdHMgd2l0aAorICogdGhlbS4gVG8gcmV0cmlldmUgYW4gaW5zdGFuY2Ugb2Yge0BsaW5rIFNoYXJlZFByZWZlcmVuY2VzfSB0aGF0IHRoZQorICogcHJlZmVyZW5jZSBoaWVyYXJjaHkgaW4gdGhpcyBmcmFnbWVudCB3aWxsIHVzZSwgY2FsbAorICoge0BsaW5rIFByZWZlcmVuY2VNYW5hZ2VyI2dldERlZmF1bHRTaGFyZWRQcmVmZXJlbmNlcyhhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCl9CisgKiB3aXRoIGEgY29udGV4dCBpbiB0aGUgc2FtZSBwYWNrYWdlIGFzIHRoaXMgZnJhZ21lbnQuCisgKiA8cD4KKyAqIEZ1cnRoZXJtb3JlLCB0aGUgcHJlZmVyZW5jZXMgc2hvd24gd2lsbCBmb2xsb3cgdGhlIHZpc3VhbCBzdHlsZSBvZiBzeXN0ZW0KKyAqIHByZWZlcmVuY2VzLiBJdCBpcyBlYXN5IHRvIGNyZWF0ZSBhIGhpZXJhcmNoeSBvZiBwcmVmZXJlbmNlcyAodGhhdCBjYW4gYmUKKyAqIHNob3duIG9uIG11bHRpcGxlIHNjcmVlbnMpIHZpYSBYTUwuIEZvciB0aGVzZSByZWFzb25zLCBpdCBpcyByZWNvbW1lbmRlZCB0bworICogdXNlIHRoaXMgZnJhZ21lbnQgKGFzIGEgc3VwZXJjbGFzcykgdG8gZGVhbCB3aXRoIHByZWZlcmVuY2VzIGluIGFwcGxpY2F0aW9ucy4KKyAqIDxwPgorICogQSB7QGxpbmsgUHJlZmVyZW5jZVNjcmVlbn0gb2JqZWN0IHNob3VsZCBiZSBhdCB0aGUgdG9wIG9mIHRoZSBwcmVmZXJlbmNlCisgKiBoaWVyYXJjaHkuIEZ1cnRoZXJtb3JlLCBzdWJzZXF1ZW50IHtAbGluayBQcmVmZXJlbmNlU2NyZWVufSBpbiB0aGUgaGllcmFyY2h5CisgKiBkZW5vdGUgYSBzY3JlZW4gYnJlYWstLXRoYXQgaXMgdGhlIHByZWZlcmVuY2VzIGNvbnRhaW5lZCB3aXRoaW4gc3Vic2VxdWVudAorICoge0BsaW5rIFByZWZlcmVuY2VTY3JlZW59IHNob3VsZCBiZSBzaG93biBvbiBhbm90aGVyIHNjcmVlbi4gVGhlIHByZWZlcmVuY2UKKyAqIGZyYW1ld29yayBoYW5kbGVzIHNob3dpbmcgdGhlc2Ugb3RoZXIgc2NyZWVucyBmcm9tIHRoZSBwcmVmZXJlbmNlIGhpZXJhcmNoeS4KKyAqIDxwPgorICogVGhlIHByZWZlcmVuY2UgaGllcmFyY2h5IGNhbiBiZSBmb3JtZWQgaW4gbXVsdGlwbGUgd2F5czoKKyAqIDxsaT4gRnJvbSBhbiBYTUwgZmlsZSBzcGVjaWZ5aW5nIHRoZSBoaWVyYXJjaHkKKyAqIDxsaT4gRnJvbSBkaWZmZXJlbnQge0BsaW5rIEFjdGl2aXR5IEFjdGl2aXRpZXN9IHRoYXQgZWFjaCBzcGVjaWZ5IGl0cyBvd24KKyAqIHByZWZlcmVuY2VzIGluIGFuIFhNTCBmaWxlIHZpYSB7QGxpbmsgQWN0aXZpdHl9IG1ldGEtZGF0YQorICogPGxpPiBGcm9tIGFuIG9iamVjdCBoaWVyYXJjaHkgcm9vdGVkIHdpdGgge0BsaW5rIFByZWZlcmVuY2VTY3JlZW59CisgKiA8cD4KKyAqIFRvIGluZmxhdGUgZnJvbSBYTUwsIHVzZSB0aGUge0BsaW5rICNhZGRQcmVmZXJlbmNlc0Zyb21SZXNvdXJjZShpbnQpfS4gVGhlCisgKiByb290IGVsZW1lbnQgc2hvdWxkIGJlIGEge0BsaW5rIFByZWZlcmVuY2VTY3JlZW59LiBTdWJzZXF1ZW50IGVsZW1lbnRzIGNhbiBwb2ludAorICogdG8gYWN0dWFsIHtAbGluayBQcmVmZXJlbmNlfSBzdWJjbGFzc2VzLiBBcyBtZW50aW9uZWQgYWJvdmUsIHN1YnNlcXVlbnQKKyAqIHtAbGluayBQcmVmZXJlbmNlU2NyZWVufSBpbiB0aGUgaGllcmFyY2h5IHdpbGwgcmVzdWx0IGluIHRoZSBzY3JlZW4gYnJlYWsuCisgKiA8cD4KKyAqIFRvIHNwZWNpZnkgYW4ge0BsaW5rIEludGVudH0gdG8gcXVlcnkge0BsaW5rIEFjdGl2aXR5IEFjdGl2aXRpZXN9IHRoYXQgZWFjaAorICogaGF2ZSBwcmVmZXJlbmNlcywgdXNlIHtAbGluayAjYWRkUHJlZmVyZW5jZXNGcm9tSW50ZW50fS4gRWFjaAorICoge0BsaW5rIEFjdGl2aXR5fSBjYW4gc3BlY2lmeSBtZXRhLWRhdGEgaW4gdGhlIG1hbmlmZXN0ICh2aWEgdGhlIGtleQorICoge0BsaW5rIFByZWZlcmVuY2VNYW5hZ2VyI01FVEFEQVRBX0tFWV9QUkVGRVJFTkNFU30pIHRoYXQgcG9pbnRzIHRvIGFuIFhNTAorICogcmVzb3VyY2UuIFRoZXNlIFhNTCByZXNvdXJjZXMgd2lsbCBiZSBpbmZsYXRlZCBpbnRvIGEgc2luZ2xlIHByZWZlcmVuY2UKKyAqIGhpZXJhcmNoeSBhbmQgc2hvd24gYnkgdGhpcyBmcmFnbWVudC4KKyAqIDxwPgorICogVG8gc3BlY2lmeSBhbiBvYmplY3QgaGllcmFyY2h5IHJvb3RlZCB3aXRoIHtAbGluayBQcmVmZXJlbmNlU2NyZWVufSwgdXNlCisgKiB7QGxpbmsgI3NldFByZWZlcmVuY2VTY3JlZW4oUHJlZmVyZW5jZVNjcmVlbil9LgorICogPHA+CisgKiBBcyBhIGNvbnZlbmllbmNlLCB0aGlzIGZyYWdtZW50IGltcGxlbWVudHMgYSBjbGljayBsaXN0ZW5lciBmb3IgYW55CisgKiBwcmVmZXJlbmNlIGluIHRoZSBjdXJyZW50IGhpZXJhcmNoeSwgc2VlCisgKiB7QGxpbmsgI29uUHJlZmVyZW5jZVRyZWVDbGljayhQcmVmZXJlbmNlU2NyZWVuLCBQcmVmZXJlbmNlKX0uCisgKgorICogPGEgbmFtZT0iU2FtcGxlQ29kZSI+PC9hPgorICogPGgzPlNhbXBsZSBDb2RlPC9oMz4KKyAqCisgKiA8cD5UaGUgZm9sbG93aW5nIHNhbXBsZSBjb2RlIHNob3dzIGEgc2ltcGxlIHByZWZlcmVuY2UgZnJhZ21lbnQgdGhhdCBpcworICogcG9wdWxhdGVkIGZyb20gYSByZXNvdXJjZS4gIFRoZSByZXNvdXJjZSBpdCBsb2FkcyBpczo8L3A+CisgKgorICoge0BzYW1wbGUgZGV2ZWxvcG1lbnQvc2FtcGxlcy9BcGlEZW1vcy9yZXMveG1sL3ByZWZlcmVuY2VzLnhtbCBwcmVmZXJlbmNlc30KKyAqCisgKiA8cD5UaGUgZnJhZ21lbnQgaW1wbGVtZW50YXRpb24gaXRzZWxmIHNpbXBseSBwb3B1bGF0ZXMgdGhlIHByZWZlcmVuY2VzCisgKiB3aGVuIGNyZWF0ZWQuICBOb3RlIHRoYXQgdGhlIHByZWZlcmVuY2VzIGZyYW1ld29yayB0YWtlcyBjYXJlIG9mIGxvYWRpbmcKKyAqIHRoZSBjdXJyZW50IHZhbHVlcyBvdXQgb2YgdGhlIGFwcCBwcmVmZXJlbmNlcyBhbmQgd3JpdGluZyB0aGVtIHdoZW4gY2hhbmdlZDo8L3A+CisgKgorICoge0BzYW1wbGUgZGV2ZWxvcG1lbnQvc2FtcGxlcy9BcGlEZW1vcy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9hcGlzL3ByZWZlcmVuY2UvRnJhZ21lbnRQcmVmZXJlbmNlcy5qYXZhCisgKiAgICAgIGZyYWdtZW50fQorICoKKyAqIEBzZWUgUHJlZmVyZW5jZQorICogQHNlZSBQcmVmZXJlbmNlU2NyZWVuCisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBQcmVmZXJlbmNlRnJhZ21lbnQgZXh0ZW5kcyBGcmFnbWVudCBpbXBsZW1lbnRzCisgICAgICAgIFByZWZlcmVuY2VNYW5hZ2VyLk9uUHJlZmVyZW5jZVRyZWVDbGlja0xpc3RlbmVyIHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGRVJFTkNFU19UQUcgPSAiYW5kcm9pZDpwcmVmZXJlbmNlcyI7CisKKyAgICBwcml2YXRlIFByZWZlcmVuY2VNYW5hZ2VyIG1QcmVmZXJlbmNlTWFuYWdlcjsKKyAgICBwcml2YXRlIExpc3RWaWV3IG1MaXN0OworICAgIHByaXZhdGUgYm9vbGVhbiBtSGF2ZVByZWZzOworICAgIHByaXZhdGUgYm9vbGVhbiBtSW5pdERvbmU7CisKKyAgICAvKioKKyAgICAgKiBUaGUgc3RhcnRpbmcgcmVxdWVzdCBjb2RlIGdpdmVuIG91dCB0byBwcmVmZXJlbmNlIGZyYW1ld29yay4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRklSU1RfUkVRVUVTVF9DT0RFID0gMTAwOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1TR19CSU5EX1BSRUZFUkVOQ0VTID0gMTsKKyAgICBwcml2YXRlIEhhbmRsZXIgbUhhbmRsZXIgPSBuZXcgSGFuZGxlcigpIHsKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIGhhbmRsZU1lc3NhZ2UoTWVzc2FnZSBtc2cpIHsKKyAgICAgICAgICAgIHN3aXRjaCAobXNnLndoYXQpIHsKKworICAgICAgICAgICAgICAgIGNhc2UgTVNHX0JJTkRfUFJFRkVSRU5DRVM6CisgICAgICAgICAgICAgICAgICAgIGJpbmRQcmVmZXJlbmNlcygpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH07CisKKyAgICBmaW5hbCBwcml2YXRlIFJ1bm5hYmxlIG1SZXF1ZXN0Rm9jdXMgPSBuZXcgUnVubmFibGUoKSB7CisgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgIG1MaXN0LmZvY3VzYWJsZVZpZXdBdmFpbGFibGUobUxpc3QpOworICAgICAgICB9CisgICAgfTsKKworICAgIC8qKgorICAgICAqIEludGVyZmFjZSB0aGF0IFByZWZlcmVuY2VGcmFnbWVudCdzIGNvbnRhaW5pbmcgYWN0aXZpdHkgc2hvdWxkCisgICAgICogaW1wbGVtZW50IHRvIGJlIGFibGUgdG8gcHJvY2VzcyBwcmVmZXJlbmNlIGl0ZW1zIHRoYXQgd2lzaCB0bworICAgICAqIHN3aXRjaCB0byBhIG5ldyBmcmFnbWVudC4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50ZXJmYWNlIE9uUHJlZmVyZW5jZVN0YXJ0RnJhZ21lbnRDYWxsYmFjayB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBDYWxsZWQgd2hlbiB0aGUgdXNlciBoYXMgY2xpY2tlZCBvbiBhIFByZWZlcmVuY2UgdGhhdCBoYXMKKyAgICAgICAgICogYSBmcmFnbWVudCBjbGFzcyBuYW1lIGFzc29jaWF0ZWQgd2l0aCBpdC4gIFRoZSBpbXBsZW1lbnRhdGlvbgorICAgICAgICAgKiB0byBzaG91bGQgaW5zdGFudGlhdGUgYW5kIHN3aXRjaCB0byBhbiBpbnN0YW5jZSBvZiB0aGUgZ2l2ZW4KKyAgICAgICAgICogZnJhZ21lbnQuCisgICAgICAgICAqLworICAgICAgICBib29sZWFuIG9uUHJlZmVyZW5jZVN0YXJ0RnJhZ21lbnQoUHJlZmVyZW5jZUZyYWdtZW50IGNhbGxlciwgUHJlZmVyZW5jZSBwcmVmKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvbkNyZWF0ZShCdW5kbGUgc2F2ZWRJbnN0YW5jZVN0YXRlKSB7CisgICAgICAgIHN1cGVyLm9uQ3JlYXRlKHNhdmVkSW5zdGFuY2VTdGF0ZSk7CisgICAgICAgIG1QcmVmZXJlbmNlTWFuYWdlciA9IG5ldyBQcmVmZXJlbmNlTWFuYWdlcihnZXRBY3Rpdml0eSgpLCBGSVJTVF9SRVFVRVNUX0NPREUpOworICAgICAgICBtUHJlZmVyZW5jZU1hbmFnZXIuc2V0T25QcmVmZXJlbmNlVHJlZUNsaWNrTGlzdGVuZXIodGhpcyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFZpZXcgb25DcmVhdGVWaWV3KExheW91dEluZmxhdGVyIGluZmxhdGVyLCBWaWV3R3JvdXAgY29udGFpbmVyLAorICAgICAgICAgICAgQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgeworICAgICAgICByZXR1cm4gaW5mbGF0ZXIuaW5mbGF0ZShjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmxheW91dC5wcmVmZXJlbmNlX2xpc3RfY29udGVudCwKKyAgICAgICAgICAgICAgICBjb250YWluZXIsIGZhbHNlKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvbkFjdGl2aXR5Q3JlYXRlZChCdW5kbGUgc2F2ZWRJbnN0YW5jZVN0YXRlKSB7CisgICAgICAgIHN1cGVyLm9uQWN0aXZpdHlDcmVhdGVkKHNhdmVkSW5zdGFuY2VTdGF0ZSk7CisgICAgICAgIGdldExpc3RWaWV3KCkuc2V0U2Nyb2xsQmFyU3R5bGUoVmlldy5TQ1JPTExCQVJTX0lOU0lERV9PVkVSTEFZKTsKKworICAgICAgICBpZiAobUhhdmVQcmVmcykgeworICAgICAgICAgICAgYmluZFByZWZlcmVuY2VzKCk7CisgICAgICAgIH0KKworICAgICAgICBtSW5pdERvbmUgPSB0cnVlOworCisgICAgICAgIGlmIChzYXZlZEluc3RhbmNlU3RhdGUgIT0gbnVsbCkgeworICAgICAgICAgICAgQnVuZGxlIGNvbnRhaW5lciA9IHNhdmVkSW5zdGFuY2VTdGF0ZS5nZXRCdW5kbGUoUFJFRkVSRU5DRVNfVEFHKTsKKyAgICAgICAgICAgIGlmIChjb250YWluZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGZpbmFsIFByZWZlcmVuY2VTY3JlZW4gcHJlZmVyZW5jZVNjcmVlbiA9IGdldFByZWZlcmVuY2VTY3JlZW4oKTsKKyAgICAgICAgICAgICAgICBpZiAocHJlZmVyZW5jZVNjcmVlbiAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIHByZWZlcmVuY2VTY3JlZW4ucmVzdG9yZUhpZXJhcmNoeVN0YXRlKGNvbnRhaW5lcik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb25TdG9wKCkgeworICAgICAgICBzdXBlci5vblN0b3AoKTsKKyAgICAgICAgbVByZWZlcmVuY2VNYW5hZ2VyLmRpc3BhdGNoQWN0aXZpdHlTdG9wKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb25EZXN0cm95VmlldygpIHsKKyAgICAgICAgbUxpc3QgPSBudWxsOworICAgICAgICBtSGFuZGxlci5yZW1vdmVDYWxsYmFja3MobVJlcXVlc3RGb2N1cyk7CisgICAgICAgIHN1cGVyLm9uRGVzdHJveVZpZXcoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvbkRlc3Ryb3koKSB7CisgICAgICAgIHN1cGVyLm9uRGVzdHJveSgpOworICAgICAgICBtUHJlZmVyZW5jZU1hbmFnZXIuZGlzcGF0Y2hBY3Rpdml0eURlc3Ryb3koKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvblNhdmVJbnN0YW5jZVN0YXRlKEJ1bmRsZSBvdXRTdGF0ZSkgeworICAgICAgICBzdXBlci5vblNhdmVJbnN0YW5jZVN0YXRlKG91dFN0YXRlKTsKKworICAgICAgICBmaW5hbCBQcmVmZXJlbmNlU2NyZWVuIHByZWZlcmVuY2VTY3JlZW4gPSBnZXRQcmVmZXJlbmNlU2NyZWVuKCk7CisgICAgICAgIGlmIChwcmVmZXJlbmNlU2NyZWVuICE9IG51bGwpIHsKKyAgICAgICAgICAgIEJ1bmRsZSBjb250YWluZXIgPSBuZXcgQnVuZGxlKCk7CisgICAgICAgICAgICBwcmVmZXJlbmNlU2NyZWVuLnNhdmVIaWVyYXJjaHlTdGF0ZShjb250YWluZXIpOworICAgICAgICAgICAgb3V0U3RhdGUucHV0QnVuZGxlKFBSRUZFUkVOQ0VTX1RBRywgY29udGFpbmVyKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9uQWN0aXZpdHlSZXN1bHQoaW50IHJlcXVlc3RDb2RlLCBpbnQgcmVzdWx0Q29kZSwgSW50ZW50IGRhdGEpIHsKKyAgICAgICAgc3VwZXIub25BY3Rpdml0eVJlc3VsdChyZXF1ZXN0Q29kZSwgcmVzdWx0Q29kZSwgZGF0YSk7CisKKyAgICAgICAgbVByZWZlcmVuY2VNYW5hZ2VyLmRpc3BhdGNoQWN0aXZpdHlSZXN1bHQocmVxdWVzdENvZGUsIHJlc3VsdENvZGUsIGRhdGEpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIHtAbGluayBQcmVmZXJlbmNlTWFuYWdlcn0gdXNlZCBieSB0aGlzIGZyYWdtZW50LgorICAgICAqIEByZXR1cm4gVGhlIHtAbGluayBQcmVmZXJlbmNlTWFuYWdlcn0uCisgICAgICovCisgICAgcHVibGljIFByZWZlcmVuY2VNYW5hZ2VyIGdldFByZWZlcmVuY2VNYW5hZ2VyKCkgeworICAgICAgICByZXR1cm4gbVByZWZlcmVuY2VNYW5hZ2VyOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIHJvb3Qgb2YgdGhlIHByZWZlcmVuY2UgaGllcmFyY2h5IHRoYXQgdGhpcyBmcmFnbWVudCBpcyBzaG93aW5nLgorICAgICAqCisgICAgICogQHBhcmFtIHByZWZlcmVuY2VTY3JlZW4gVGhlIHJvb3Qge0BsaW5rIFByZWZlcmVuY2VTY3JlZW59IG9mIHRoZSBwcmVmZXJlbmNlIGhpZXJhcmNoeS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRQcmVmZXJlbmNlU2NyZWVuKFByZWZlcmVuY2VTY3JlZW4gcHJlZmVyZW5jZVNjcmVlbikgeworICAgICAgICBpZiAobVByZWZlcmVuY2VNYW5hZ2VyLnNldFByZWZlcmVuY2VzKHByZWZlcmVuY2VTY3JlZW4pICYmIHByZWZlcmVuY2VTY3JlZW4gIT0gbnVsbCkgeworICAgICAgICAgICAgbUhhdmVQcmVmcyA9IHRydWU7CisgICAgICAgICAgICBpZiAobUluaXREb25lKSB7CisgICAgICAgICAgICAgICAgcG9zdEJpbmRQcmVmZXJlbmNlcygpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgcm9vdCBvZiB0aGUgcHJlZmVyZW5jZSBoaWVyYXJjaHkgdGhhdCB0aGlzIGZyYWdtZW50IGlzIHNob3dpbmcuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFRoZSB7QGxpbmsgUHJlZmVyZW5jZVNjcmVlbn0gdGhhdCBpcyB0aGUgcm9vdCBvZiB0aGUgcHJlZmVyZW5jZQorICAgICAqICAgICAgICAgaGllcmFyY2h5LgorICAgICAqLworICAgIHB1YmxpYyBQcmVmZXJlbmNlU2NyZWVuIGdldFByZWZlcmVuY2VTY3JlZW4oKSB7CisgICAgICAgIHJldHVybiBtUHJlZmVyZW5jZU1hbmFnZXIuZ2V0UHJlZmVyZW5jZVNjcmVlbigpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZHMgcHJlZmVyZW5jZXMgZnJvbSBhY3Rpdml0aWVzIHRoYXQgbWF0Y2ggdGhlIGdpdmVuIHtAbGluayBJbnRlbnR9LgorICAgICAqCisgICAgICogQHBhcmFtIGludGVudCBUaGUge0BsaW5rIEludGVudH0gdG8gcXVlcnkgYWN0aXZpdGllcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRQcmVmZXJlbmNlc0Zyb21JbnRlbnQoSW50ZW50IGludGVudCkgeworICAgICAgICByZXF1aXJlUHJlZmVyZW5jZU1hbmFnZXIoKTsKKworICAgICAgICBzZXRQcmVmZXJlbmNlU2NyZWVuKG1QcmVmZXJlbmNlTWFuYWdlci5pbmZsYXRlRnJvbUludGVudChpbnRlbnQsIGdldFByZWZlcmVuY2VTY3JlZW4oKSkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEluZmxhdGVzIHRoZSBnaXZlbiBYTUwgcmVzb3VyY2UgYW5kIGFkZHMgdGhlIHByZWZlcmVuY2UgaGllcmFyY2h5IHRvIHRoZSBjdXJyZW50CisgICAgICogcHJlZmVyZW5jZSBoaWVyYXJjaHkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcHJlZmVyZW5jZXNSZXNJZCBUaGUgWE1MIHJlc291cmNlIElEIHRvIGluZmxhdGUuCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkUHJlZmVyZW5jZXNGcm9tUmVzb3VyY2UoaW50IHByZWZlcmVuY2VzUmVzSWQpIHsKKyAgICAgICAgcmVxdWlyZVByZWZlcmVuY2VNYW5hZ2VyKCk7CisKKyAgICAgICAgc2V0UHJlZmVyZW5jZVNjcmVlbihtUHJlZmVyZW5jZU1hbmFnZXIuaW5mbGF0ZUZyb21SZXNvdXJjZShnZXRBY3Rpdml0eSgpLAorICAgICAgICAgICAgICAgIHByZWZlcmVuY2VzUmVzSWQsIGdldFByZWZlcmVuY2VTY3JlZW4oKSkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIHtAaW5oZXJpdERvY30KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBvblByZWZlcmVuY2VUcmVlQ2xpY2soUHJlZmVyZW5jZVNjcmVlbiBwcmVmZXJlbmNlU2NyZWVuLAorICAgICAgICAgICAgUHJlZmVyZW5jZSBwcmVmZXJlbmNlKSB7CisgICAgICAgIGlmIChwcmVmZXJlbmNlLmdldEZyYWdtZW50KCkgIT0gbnVsbCAmJgorICAgICAgICAgICAgICAgIGdldEFjdGl2aXR5KCkgaW5zdGFuY2VvZiBPblByZWZlcmVuY2VTdGFydEZyYWdtZW50Q2FsbGJhY2spIHsKKyAgICAgICAgICAgIHJldHVybiAoKE9uUHJlZmVyZW5jZVN0YXJ0RnJhZ21lbnRDYWxsYmFjaylnZXRBY3Rpdml0eSgpKS5vblByZWZlcmVuY2VTdGFydEZyYWdtZW50KAorICAgICAgICAgICAgICAgICAgICB0aGlzLCBwcmVmZXJlbmNlKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLyoqCisgICAgICogRmluZHMgYSB7QGxpbmsgUHJlZmVyZW5jZX0gYmFzZWQgb24gaXRzIGtleS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBrZXkgVGhlIGtleSBvZiB0aGUgcHJlZmVyZW5jZSB0byByZXRyaWV2ZS4KKyAgICAgKiBAcmV0dXJuIFRoZSB7QGxpbmsgUHJlZmVyZW5jZX0gd2l0aCB0aGUga2V5LCBvciBudWxsLgorICAgICAqIEBzZWUgUHJlZmVyZW5jZUdyb3VwI2ZpbmRQcmVmZXJlbmNlKENoYXJTZXF1ZW5jZSkKKyAgICAgKi8KKyAgICBwdWJsaWMgUHJlZmVyZW5jZSBmaW5kUHJlZmVyZW5jZShDaGFyU2VxdWVuY2Uga2V5KSB7CisgICAgICAgIGlmIChtUHJlZmVyZW5jZU1hbmFnZXIgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG1QcmVmZXJlbmNlTWFuYWdlci5maW5kUHJlZmVyZW5jZShrZXkpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCByZXF1aXJlUHJlZmVyZW5jZU1hbmFnZXIoKSB7CisgICAgICAgIGlmIChtUHJlZmVyZW5jZU1hbmFnZXIgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIlRoaXMgc2hvdWxkIGJlIGNhbGxlZCBhZnRlciBzdXBlci5vbkNyZWF0ZS4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBwb3N0QmluZFByZWZlcmVuY2VzKCkgeworICAgICAgICBpZiAobUhhbmRsZXIuaGFzTWVzc2FnZXMoTVNHX0JJTkRfUFJFRkVSRU5DRVMpKSByZXR1cm47CisgICAgICAgIG1IYW5kbGVyLm9idGFpbk1lc3NhZ2UoTVNHX0JJTkRfUFJFRkVSRU5DRVMpLnNlbmRUb1RhcmdldCgpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBiaW5kUHJlZmVyZW5jZXMoKSB7CisgICAgICAgIGZpbmFsIFByZWZlcmVuY2VTY3JlZW4gcHJlZmVyZW5jZVNjcmVlbiA9IGdldFByZWZlcmVuY2VTY3JlZW4oKTsKKyAgICAgICAgaWYgKHByZWZlcmVuY2VTY3JlZW4gIT0gbnVsbCkgeworICAgICAgICAgICAgcHJlZmVyZW5jZVNjcmVlbi5iaW5kKGdldExpc3RWaWV3KCkpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqIEBoaWRlICovCisgICAgcHVibGljIExpc3RWaWV3IGdldExpc3RWaWV3KCkgeworICAgICAgICBlbnN1cmVMaXN0KCk7CisgICAgICAgIHJldHVybiBtTGlzdDsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgZW5zdXJlTGlzdCgpIHsKKyAgICAgICAgaWYgKG1MaXN0ICE9IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBWaWV3IHJvb3QgPSBnZXRWaWV3KCk7CisgICAgICAgIGlmIChyb290ID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkNvbnRlbnQgdmlldyBub3QgeWV0IGNyZWF0ZWQiKTsKKyAgICAgICAgfQorICAgICAgICBWaWV3IHJhd0xpc3RWaWV3ID0gcm9vdC5maW5kVmlld0J5SWQoYW5kcm9pZC5SLmlkLmxpc3QpOworICAgICAgICBpZiAoIShyYXdMaXN0VmlldyBpbnN0YW5jZW9mIExpc3RWaWV3KSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICJDb250ZW50IGhhcyB2aWV3IHdpdGggaWQgYXR0cmlidXRlICdhbmRyb2lkLlIuaWQubGlzdCcgIgorICAgICAgICAgICAgICAgICAgICArICJ0aGF0IGlzIG5vdCBhIExpc3RWaWV3IGNsYXNzIik7CisgICAgICAgIH0KKyAgICAgICAgbUxpc3QgPSAoTGlzdFZpZXcpcmF3TGlzdFZpZXc7CisgICAgICAgIGlmIChtTGlzdCA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgIllvdXIgY29udGVudCBtdXN0IGhhdmUgYSBMaXN0VmlldyB3aG9zZSBpZCBhdHRyaWJ1dGUgaXMgIiArCisgICAgICAgICAgICAgICAgICAgICInYW5kcm9pZC5SLmlkLmxpc3QnIik7CisgICAgICAgIH0KKyAgICAgICAgbUhhbmRsZXIucG9zdChtUmVxdWVzdEZvY3VzKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9wcmVmZXJlbmNlL1ByZWZlcmVuY2VJbmZsYXRlci5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvcHJlZmVyZW5jZS9QcmVmZXJlbmNlSW5mbGF0ZXIuamF2YQppbmRleCA3NzllNzQ2Li5jMjFhYTE4IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9wcmVmZXJlbmNlL1ByZWZlcmVuY2VJbmZsYXRlci5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3ByZWZlcmVuY2UvUHJlZmVyZW5jZUluZmxhdGVyLmphdmEKQEAgLTE2LDYgKzE2LDggQEAKIAogcGFja2FnZSBhbmRyb2lkLnByZWZlcmVuY2U7CiAKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC51dGlsLlhtbFV0aWxzOworCiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLnV0aWwuTWFwOwogCkBAIC0zOSw2ICs0MSw3IEBACiBjbGFzcyBQcmVmZXJlbmNlSW5mbGF0ZXIgZXh0ZW5kcyBHZW5lcmljSW5mbGF0ZXI8UHJlZmVyZW5jZSwgUHJlZmVyZW5jZUdyb3VwPiB7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJQcmVmZXJlbmNlSW5mbGF0ZXIiOwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBJTlRFTlRfVEFHX05BTUUgPSAiaW50ZW50IjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhUUkFfVEFHX05BTUUgPSAiZXh0cmEiOwogCiAgICAgcHJpdmF0ZSBQcmVmZXJlbmNlTWFuYWdlciBtUHJlZmVyZW5jZU1hbmFnZXI7CiAgICAgCkBAIC03Myw4ICs3NiwxMCBAQAogICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICBpbnRlbnQgPSBJbnRlbnQucGFyc2VJbnRlbnQoZ2V0Q29udGV4dCgpLmdldFJlc291cmNlcygpLCBwYXJzZXIsIGF0dHJzKTsKICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJDb3VsZCBub3QgcGFyc2UgSW50ZW50LiIpOwotICAgICAgICAgICAgICAgIExvZy53KFRBRywgZSk7CisgICAgICAgICAgICAgICAgWG1sUHVsbFBhcnNlckV4Y2VwdGlvbiBleCA9IG5ldyBYbWxQdWxsUGFyc2VyRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAgICAgIkVycm9yIHBhcnNpbmcgcHJlZmVyZW5jZSIpOworICAgICAgICAgICAgICAgIGV4LmluaXRDYXVzZShlKTsKKyAgICAgICAgICAgICAgICB0aHJvdyBleDsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIAogICAgICAgICAgICAgaWYgKGludGVudCAhPSBudWxsKSB7CkBAIC04Miw2ICs4NywxOCBAQAogICAgICAgICAgICAgfQogICAgICAgICAgICAgCiAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfSBlbHNlIGlmICh0YWcuZXF1YWxzKEVYVFJBX1RBR19OQU1FKSkgeworICAgICAgICAgICAgZ2V0Q29udGV4dCgpLmdldFJlc291cmNlcygpLnBhcnNlQnVuZGxlRXh0cmEoRVhUUkFfVEFHX05BTUUsIGF0dHJzLAorICAgICAgICAgICAgICAgICAgICBwYXJlbnRQcmVmZXJlbmNlLmdldEV4dHJhcygpKTsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgWG1sVXRpbHMuc2tpcEN1cnJlbnRUYWcocGFyc2VyKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBYbWxQdWxsUGFyc2VyRXhjZXB0aW9uIGV4ID0gbmV3IFhtbFB1bGxQYXJzZXJFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICAgICAiRXJyb3IgcGFyc2luZyBwcmVmZXJlbmNlIik7CisgICAgICAgICAgICAgICAgZXguaW5pdENhdXNlKGUpOworICAgICAgICAgICAgICAgIHRocm93IGV4OworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgIH0KICAgICAgICAgCiAgICAgICAgIHJldHVybiBmYWxzZTsKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3ByZWZlcmVuY2UvUHJlZmVyZW5jZVNjcmVlbi5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvcHJlZmVyZW5jZS9QcmVmZXJlbmNlU2NyZWVuLmphdmEKaW5kZXggOTVlNTQzMjQuLmM3ZjhhYjIgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3ByZWZlcmVuY2UvUHJlZmVyZW5jZVNjcmVlbi5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3ByZWZlcmVuY2UvUHJlZmVyZW5jZVNjcmVlbi5qYXZhCkBAIC05MSw3ICs5MSw4IEBACiAKICAgICAvKioKICAgICAgKiBSZXR1cm5zIGFuIGFkYXB0ZXIgdGhhdCBjYW4gYmUgYXR0YWNoZWQgdG8gYSB7QGxpbmsgUHJlZmVyZW5jZUFjdGl2aXR5fQotICAgICAqIHRvIHNob3cgdGhlIHByZWZlcmVuY2VzIGNvbnRhaW5lZCBpbiB0aGlzIHtAbGluayBQcmVmZXJlbmNlU2NyZWVufS4KKyAgICAgKiBvciB7QGxpbmsgUHJlZmVyZW5jZUZyYWdtZW50fSB0byBzaG93IHRoZSBwcmVmZXJlbmNlcyBjb250YWluZWQgaW4gdGhpcworICAgICAqIHtAbGluayBQcmVmZXJlbmNlU2NyZWVufS4KICAgICAgKiA8cD4KICAgICAgKiBUaGlzIHtAbGluayBQcmVmZXJlbmNlU2NyZWVufSB3aWxsIE5PVCBhcHBlYXIgaW4gdGhlIHJldHVybmVkIGFkYXB0ZXIsIGluc3RlYWQKICAgICAgKiBpdCBhcHBlYXJzIGluIHRoZSBoaWVyYXJjaHkgYWJvdmUgdGhpcyB7QGxpbmsgUHJlZmVyZW5jZVNjcmVlbn0uCkBAIC0xMzYsNyArMTM3LDcgQEAKICAgICAKICAgICBAT3ZlcnJpZGUKICAgICBwcm90ZWN0ZWQgdm9pZCBvbkNsaWNrKCkgewotICAgICAgICBpZiAoZ2V0SW50ZW50KCkgIT0gbnVsbCB8fCBnZXRQcmVmZXJlbmNlQ291bnQoKSA9PSAwKSB7CisgICAgICAgIGlmIChnZXRJbnRlbnQoKSAhPSBudWxsIHx8IGdldEZyYWdtZW50KCkgIT0gbnVsbCB8fCBnZXRQcmVmZXJlbmNlQ291bnQoKSA9PSAwKSB7CiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KICAgICAgICAgCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9wcm92aWRlci9Ccm93c2VyLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9wcm92aWRlci9Ccm93c2VyLmphdmEKaW5kZXggMmZiYTFkNzkuLmNiNmUxOGYgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3Byb3ZpZGVyL0Jyb3dzZXIuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9wcm92aWRlci9Ccm93c2VyLmphdmEKQEAgLTE3LDIyICsxNywzMCBAQAogcGFja2FnZSBhbmRyb2lkLnByb3ZpZGVyOwogCiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRSZXNvbHZlcjsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFVyaXM7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRWYWx1ZXM7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKIGltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLkN1cnNvcjsKIGltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLkRhdGFiYXNlVXRpbHM7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5CaXRtYXBGYWN0b3J5OwogaW1wb3J0IGFuZHJvaWQubmV0LlVyaTsKLWltcG9ydCBhbmRyb2lkLm9zLkFzeW5jVGFzazsKK2ltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkJyb3dzZXJDb250cmFjdC5Cb29rbWFya3M7CitpbXBvcnQgYW5kcm9pZC5wcm92aWRlci5Ccm93c2VyQ29udHJhY3QuSGlzdG9yeTsKK2ltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkJyb3dzZXJDb250cmFjdC5TZWFyY2hlczsKIGltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwogaW1wb3J0IGFuZHJvaWQud2Via2l0LldlYkljb25EYXRhYmFzZTsKIAotaW1wb3J0IGphdmEudXRpbC5EYXRlOwotCiBwdWJsaWMgY2xhc3MgQnJvd3NlciB7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIExPR1RBRyA9ICJicm93c2VyIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFVyaSBCT09LTUFSS1NfVVJJID0KLSAgICAgICAgVXJpLnBhcnNlKCJjb250ZW50Oi8vYnJvd3Nlci9ib29rbWFya3MiKTsKKworICAgIC8qKgorICAgICAqIEEgdGFibGUgY29udGFpbmluZyBib3RoIGJvb2ttYXJrcyBhbmQgaGlzdG9yeSBpdGVtcy4gVGhlIGNvbHVtbnMgb2YgdGhlIHRhYmxlIGFyZSBkZWZpbmVkIGluCisgICAgICoge0BsaW5rIEJvb2ttYXJrQ29sdW1uc30uIFJlYWRpbmcgdGhpcyB0YWJsZSByZXF1aXJlcyB0aGUKKyAgICAgKiB7QGxpbmsgYW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uI1JFQURfSElTVE9SWV9CT09LTUFSS1N9IHBlcm1pc3Npb24gYW5kIHdyaXRpbmcgdG8gaXQKKyAgICAgKiByZXF1aXJlcyB0aGUge0BsaW5rIGFuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbiNXUklURV9ISVNUT1JZX0JPT0tNQVJLU30gcGVybWlzc2lvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFVyaSBCT09LTUFSS1NfVVJJID0gVXJpLnBhcnNlKCJjb250ZW50Oi8vYnJvd3Nlci9ib29rbWFya3MiKTsKIAogICAgIC8qKgogICAgICAqIFRoZSBuYW1lIG9mIGV4dHJhIGRhdGEgd2hlbiBzdGFydGluZyBCcm93c2VyIHdpdGggQUNUSU9OX1ZJRVcgb3IKQEAgLTQ5LDEyICs1NywxMSBAQAogICAgICAqIGFwcGxpY2F0aW9uLgogICAgICAqIDxwPgogICAgICAqIFRoZSB2YWx1ZSBpcyBhIHVuaXF1ZSBpZGVudGlmaWNhdGlvbiBzdHJpbmcgdGhhdCB3aWxsIGJlIHVzZWQgdG8KLSAgICAgKiBpbmRlbnRpZnkgdGhlIGNhbGxpbmcgYXBwbGljYXRpb24uIFRoZSBCcm93c2VyIHdpbGwgYXR0ZW1wdCB0byByZXVzZSB0aGUKKyAgICAgKiBpZGVudGlmeSB0aGUgY2FsbGluZyBhcHBsaWNhdGlvbi4gVGhlIEJyb3dzZXIgd2lsbCBhdHRlbXB0IHRvIHJldXNlIHRoZQogICAgICAqIHNhbWUgd2luZG93IGVhY2ggdGltZSB0aGUgYXBwbGljYXRpb24gbGF1bmNoZXMgdGhlIEJyb3dzZXIgd2l0aCB0aGUgc2FtZQogICAgICAqIGlkZW50aWZpZXIuCiAgICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhUUkFfQVBQTElDQVRJT05fSUQgPQotICAgICAgICAiY29tLmFuZHJvaWQuYnJvd3Nlci5hcHBsaWNhdGlvbl9pZCI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhUUkFfQVBQTElDQVRJT05fSUQgPSAiY29tLmFuZHJvaWQuYnJvd3Nlci5hcHBsaWNhdGlvbl9pZCI7CiAKICAgICAvKioKICAgICAgKiBUaGUgbmFtZSBvZiB0aGUgZXh0cmEgZGF0YSBpbiB0aGUgVklFVyBpbnRlbnQuIFRoZSBkYXRhIGFyZSBrZXkvdmFsdWUKQEAgLTY4LDEwICs3NSwxNyBAQAogICAgIC8qIGlmIHlvdSBjaGFuZ2UgY29sdW1uIG9yZGVyIHlvdSBtdXN0IGFsc28gY2hhbmdlIGluZGljZXMKICAgICAgICBiZWxvdyAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nW10gSElTVE9SWV9QUk9KRUNUSU9OID0gbmV3IFN0cmluZ1tdIHsKLSAgICAgICAgQm9va21hcmtDb2x1bW5zLl9JRCwgQm9va21hcmtDb2x1bW5zLlVSTCwgQm9va21hcmtDb2x1bW5zLlZJU0lUUywKLSAgICAgICAgQm9va21hcmtDb2x1bW5zLkRBVEUsIEJvb2ttYXJrQ29sdW1ucy5CT09LTUFSSywgQm9va21hcmtDb2x1bW5zLlRJVExFLAotICAgICAgICBCb29rbWFya0NvbHVtbnMuRkFWSUNPTiwgQm9va21hcmtDb2x1bW5zLlRIVU1CTkFJTCwKLSAgICAgICAgQm9va21hcmtDb2x1bW5zLlRPVUNIX0lDT04sIEJvb2ttYXJrQ29sdW1ucy5VU0VSX0VOVEVSRUQgfTsKKyAgICAgICAgICAgIEJvb2ttYXJrQ29sdW1ucy5fSUQsIC8vIDAKKyAgICAgICAgICAgIEJvb2ttYXJrQ29sdW1ucy5VUkwsIC8vIDEKKyAgICAgICAgICAgIEJvb2ttYXJrQ29sdW1ucy5WSVNJVFMsIC8vIDIKKyAgICAgICAgICAgIEJvb2ttYXJrQ29sdW1ucy5EQVRFLCAvLyAzCisgICAgICAgICAgICBCb29rbWFya0NvbHVtbnMuQk9PS01BUkssIC8vIDQKKyAgICAgICAgICAgIEJvb2ttYXJrQ29sdW1ucy5USVRMRSwgLy8gNQorICAgICAgICAgICAgQm9va21hcmtDb2x1bW5zLkZBVklDT04sIC8vIDYKKyAgICAgICAgICAgIEJvb2ttYXJrQ29sdW1ucy5USFVNQk5BSUwsIC8vIDcKKyAgICAgICAgICAgIEJvb2ttYXJrQ29sdW1ucy5UT1VDSF9JQ09OLCAvLyA4CisgICAgICAgICAgICBCb29rbWFya0NvbHVtbnMuVVNFUl9FTlRFUkVELCAvLyA5CisgICAgfTsKIAogICAgIC8qIHRoZXNlIGluZGljZXMgZGVwZW5kZW50IG9uIEhJU1RPUllfUFJPSkVDVElPTiAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEhJU1RPUllfUFJPSkVDVElPTl9JRF9JTkRFWCA9IDA7CkBAIC05MiwxOSArMTA2LDMzIEBACiAKICAgICAvKiBjb2x1bW5zIG5lZWRlZCB0byBkZXRlcm1pbmUgd2hldGhlciB0byB0cnVuY2F0ZSBoaXN0b3J5ICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBUUlVOQ0FURV9ISVNUT1JZX1BST0pFQ1RJT04gPSBuZXcgU3RyaW5nW10gewotICAgICAgICBCb29rbWFya0NvbHVtbnMuX0lELCBCb29rbWFya0NvbHVtbnMuREFURSwgfTsKKyAgICAgICAgICAgIEJvb2ttYXJrQ29sdW1ucy5fSUQsCisgICAgICAgICAgICBCb29rbWFya0NvbHVtbnMuREFURSwKKyAgICB9OworCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVFJVTkNBVEVfSElTVE9SWV9QUk9KRUNUSU9OX0lEX0lOREVYID0gMDsKIAogICAgIC8qIHRydW5jYXRlIHRoaXMgbWFueSBoaXN0b3J5IGl0ZW1zIGF0IGEgdGltZSAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRSVU5DQVRFX05fT0xERVNUID0gNTsKIAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgVXJpIFNFQVJDSEVTX1VSSSA9Ci0gICAgICAgIFVyaS5wYXJzZSgiY29udGVudDovL2Jyb3dzZXIvc2VhcmNoZXMiKTsKKyAgICAvKioKKyAgICAgKiBBIHRhYmxlIGNvbnRhaW5pbmcgYSBsb2cgb2YgYnJvd3NlciBzZWFyY2hlcy4gVGhlIGNvbHVtbnMgb2YgdGhlIHRhYmxlIGFyZSBkZWZpbmVkIGluCisgICAgICoge0BsaW5rIFNlYXJjaENvbHVtbnN9LiBSZWFkaW5nIHRoaXMgdGFibGUgcmVxdWlyZXMgdGhlCisgICAgICoge0BsaW5rIGFuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbiNSRUFEX0hJU1RPUllfQk9PS01BUktTfSBwZXJtaXNzaW9uIGFuZCB3cml0aW5nIHRvIGl0CisgICAgICogcmVxdWlyZXMgdGhlIHtAbGluayBhbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24jV1JJVEVfSElTVE9SWV9CT09LTUFSS1N9IHBlcm1pc3Npb24uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBVcmkgU0VBUkNIRVNfVVJJID0gVXJpLnBhcnNlKCJjb250ZW50Oi8vYnJvd3Nlci9zZWFyY2hlcyIpOwogCi0gICAgLyogaWYgeW91IGNoYW5nZSBjb2x1bW4gb3JkZXIgeW91IG11c3QgYWxzbyBjaGFuZ2UgaW5kaWNlcwotICAgICAgIGJlbG93ICovCisgICAgLyoqCisgICAgICogQSBwcm9qZWN0aW9uIG9mIHtAbGluayAjU0VBUkNIRVNfVVJJfSB0aGF0IGNvbnRhaW5zIHtAbGluayBTZWFyY2hDb2x1bW5zI19JRH0sCisgICAgICoge0BsaW5rIFNlYXJjaENvbHVtbnMjU0VBUkNIfSwgYW5kIHtAbGluayBTZWFyY2hDb2x1bW5zI0RBVEV9LgorICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nW10gU0VBUkNIRVNfUFJPSkVDVElPTiA9IG5ldyBTdHJpbmdbXSB7Ci0gICAgICAgIFNlYXJjaENvbHVtbnMuX0lELCBTZWFyY2hDb2x1bW5zLlNFQVJDSCwgU2VhcmNoQ29sdW1ucy5EQVRFIH07CisgICAgICAgICAgICAvLyBpZiB5b3UgY2hhbmdlIGNvbHVtbiBvcmRlciB5b3UgbXVzdCBhbHNvIGNoYW5nZSBpbmRpY2VzIGJlbG93CisgICAgICAgICAgICBTZWFyY2hDb2x1bW5zLl9JRCwgLy8gMAorICAgICAgICAgICAgU2VhcmNoQ29sdW1ucy5TRUFSQ0gsIC8vIDEKKyAgICAgICAgICAgIFNlYXJjaENvbHVtbnMuREFURSwgLy8gMgorICAgIH07CiAKICAgICAvKiB0aGVzZSBpbmRpY2VzIGRlcGVuZGVudCBvbiBTRUFSQ0hFU19QUk9KRUNUSU9OICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0VBUkNIRVNfUFJPSkVDVElPTl9TRUFSQ0hfSU5ERVggPSAxOwpAQCAtMTIxLDkgKzE0OSwxMCBAQAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNQVhfSElTVE9SWV9DT1VOVCA9IDI1MDsKIAogICAgIC8qKgotICAgICAqICBPcGVuIHRoZSBBZGRCb29rbWFyayBhY3Rpdml0eSB0byBzYXZlIGEgYm9va21hcmsuICBMYXVuY2ggd2l0aAotICAgICAqICBhbmQvb3IgdXJsLCB3aGljaCBjYW4gYmUgZWRpdGVkIGJ5IHRoZSB1c2VyIGJlZm9yZSBzYXZpbmcuCi0gICAgICogIEBwYXJhbSBjICAgICAgICBDb250ZXh0IHVzZWQgdG8gbGF1bmNoIHRoZSBBZGRCb29rbWFyayBhY3Rpdml0eS4KKyAgICAgKiAgT3BlbiBhbiBhY3Rpdml0eSB0byBzYXZlIGEgYm9va21hcmsuIExhdW5jaCB3aXRoIGEgdGl0bGUKKyAgICAgKiAgYW5kL29yIGEgdXJsLCBib3RoIG9mIHdoaWNoIGNhbiBiZSBlZGl0ZWQgYnkgdGhlIHVzZXIgYmVmb3JlIHNhdmluZy4KKyAgICAgKgorICAgICAqICBAcGFyYW0gYyAgICAgICAgQ29udGV4dCB1c2VkIHRvIGxhdW5jaCB0aGUgYWN0aXZpdHkgdG8gYWRkIGEgYm9va21hcmsuCiAgICAgICogIEBwYXJhbSB0aXRsZSAgICBUaXRsZSBmb3IgdGhlIGJvb2ttYXJrLiBDYW4gYmUgbnVsbCBvciBlbXB0eSBzdHJpbmcuCiAgICAgICogIEBwYXJhbSB1cmwgICAgICBVcmwgZm9yIHRoZSBib29rbWFyay4gQ2FuIGJlIG51bGwgb3IgZW1wdHkgc3RyaW5nLgogICAgICAqLwpAQCAtMTUyLDggKzE4MSwxNSBAQAogICAgICAqLwogICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIEVYVFJBX1NIQVJFX0ZBVklDT04gPSAic2hhcmVfZmF2aWNvbiI7CiAKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIHZvaWQgc2VuZFN0cmluZyhDb250ZXh0IGMsIFN0cmluZyBzKSB7Ci0gICAgICAgIHNlbmRTdHJpbmcoYywgcywgYy5nZXRTdHJpbmcoY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHJpbmcuc2VuZFRleHQpKTsKKyAgICAvKioKKyAgICAgKiBTZW5kcyB0aGUgZ2l2ZW4gc3RyaW5nIHVzaW5nIGFuIEludGVudCB3aXRoIHtAbGluayBJbnRlbnQjQUNUSU9OX1NFTkR9IGFuZCBhIG1pbWUgdHlwZQorICAgICAqIG9mIHRleHQvcGxhaW4uIFRoZSBzdHJpbmcgaXMgcHV0IGludG8ge0BsaW5rIEludGVudCNFWFRSQV9URVhUfS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb250ZXh0IHRoZSBjb250ZXh0IHVzZWQgdG8gc3RhcnQgdGhlIGFjdGl2aXR5CisgICAgICogQHBhcmFtIHN0cmluZyB0aGUgc3RyaW5nIHRvIHNlbmQKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIHZvaWQgc2VuZFN0cmluZyhDb250ZXh0IGNvbnRleHQsIFN0cmluZyBzdHJpbmcpIHsKKyAgICAgICAgc2VuZFN0cmluZyhjb250ZXh0LCBzdHJpbmcsIGNvbnRleHQuZ2V0U3RyaW5nKGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3RyaW5nLnNlbmRUZXh0KSk7CiAgICAgfQogCiAgICAgLyoqCkBAIC0xNzQsNDggKzIxMCw0OSBAQAogICAgICAgICBzZW5kLnB1dEV4dHJhKEludGVudC5FWFRSQV9URVhULCBzdHJpbmdUb1NlbmQpOwogCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBjLnN0YXJ0QWN0aXZpdHkoSW50ZW50LmNyZWF0ZUNob29zZXIoc2VuZCwgY2hvb3NlckRpYWxvZ1RpdGxlKSk7CisgICAgICAgICAgICBJbnRlbnQgaSA9IEludGVudC5jcmVhdGVDaG9vc2VyKHNlbmQsIGNob29zZXJEaWFsb2dUaXRsZSk7CisgICAgICAgICAgICAvLyBJbiBjYXNlIHRoaXMgaXMgY2FsbGVkIGZyb20gb3V0c2lkZSBhbiBBY3Rpdml0eQorICAgICAgICAgICAgaS5zZXRGbGFncyhJbnRlbnQuRkxBR19BQ1RJVklUWV9ORVdfVEFTSyk7CisgICAgICAgICAgICBjLnN0YXJ0QWN0aXZpdHkoaSk7CiAgICAgICAgIH0gY2F0Y2goYW5kcm9pZC5jb250ZW50LkFjdGl2aXR5Tm90Rm91bmRFeGNlcHRpb24gZXgpIHsKICAgICAgICAgICAgIC8vIGlmIG5vIGFwcCBoYW5kbGVzIGl0LCBkbyBub3RoaW5nCiAgICAgICAgIH0KICAgICB9CiAKICAgICAvKioKLSAgICAgKiAgUmV0dXJuIGEgY3Vyc29yIHBvaW50aW5nIHRvIGEgbGlzdCBvZiBhbGwgdGhlIGJvb2ttYXJrcy4KKyAgICAgKiAgUmV0dXJuIGEgY3Vyc29yIHBvaW50aW5nIHRvIGEgbGlzdCBvZiBhbGwgdGhlIGJvb2ttYXJrcy4gVGhlIGN1cnNvciB3aWxsIGhhdmUgYSBzaW5nbGUKKyAgICAgKiAgY29sdW1uLCB7QGxpbmsgQm9va21hcmtDb2x1bW5zI1VSTH0uCisgICAgICogIDxwPgogICAgICAqICBSZXF1aXJlcyB7QGxpbmsgYW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uI1JFQURfSElTVE9SWV9CT09LTUFSS1N9CisgICAgICoKICAgICAgKiAgQHBhcmFtIGNyICAgVGhlIENvbnRlbnRSZXNvbHZlciB1c2VkIHRvIGFjY2VzcyB0aGUgZGF0YWJhc2UuCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBDdXJzb3IgZ2V0QWxsQm9va21hcmtzKENvbnRlbnRSZXNvbHZlciBjcikgdGhyb3dzIAogICAgICAgICAgICAgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIGNyLnF1ZXJ5KEJPT0tNQVJLU19VUkksCi0gICAgICAgICAgICAgICAgbmV3IFN0cmluZ1tdIHsgQm9va21hcmtDb2x1bW5zLlVSTCB9LCAKLSAgICAgICAgICAgICAgICAiYm9va21hcmsgPSAxIiwgbnVsbCwgbnVsbCk7CisgICAgICAgIHJldHVybiBjci5xdWVyeShCb29rbWFya3MuQ09OVEVOVF9VUkksCisgICAgICAgICAgICAgICAgbmV3IFN0cmluZ1tdIHsgQm9va21hcmtzLlVSTCB9LCAKKyAgICAgICAgICAgICAgICBCb29rbWFya3MuSVNfRk9MREVSICsgIiA9IDAiLCBudWxsLCBudWxsKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiAgUmV0dXJuIGEgY3Vyc29yIHBvaW50aW5nIHRvIGEgbGlzdCBvZiBhbGwgdmlzaXRlZCBzaXRlIHVybHMuCisgICAgICogIFJldHVybiBhIGN1cnNvciBwb2ludGluZyB0byBhIGxpc3Qgb2YgYWxsIHZpc2l0ZWQgc2l0ZSB1cmxzLiBUaGUgY3Vyc29yIHdpbGwKKyAgICAgKiAgaGF2ZSBhIHNpbmdsZSBjb2x1bW4sIHtAbGluayBCb29rbWFya0NvbHVtbnMjVVJMfS4KKyAgICAgKiAgPHA+CiAgICAgICogIFJlcXVpcmVzIHtAbGluayBhbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24jUkVBRF9ISVNUT1JZX0JPT0tNQVJLU30KKyAgICAgKgogICAgICAqICBAcGFyYW0gY3IgICBUaGUgQ29udGVudFJlc29sdmVyIHVzZWQgdG8gYWNjZXNzIHRoZSBkYXRhYmFzZS4KICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEN1cnNvciBnZXRBbGxWaXNpdGVkVXJscyhDb250ZW50UmVzb2x2ZXIgY3IpIHRocm93cwogICAgICAgICAgICAgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIGNyLnF1ZXJ5KEJPT0tNQVJLU19VUkksCi0gICAgICAgICAgICAgICAgbmV3IFN0cmluZ1tdIHsgQm9va21hcmtDb2x1bW5zLlVSTCB9LCBudWxsLCBudWxsLCBudWxsKTsKKyAgICAgICAgcmV0dXJuIGNyLnF1ZXJ5KEhpc3RvcnkuQ09OVEVOVF9VUkksCisgICAgICAgICAgICAgICAgbmV3IFN0cmluZ1tdIHsgSGlzdG9yeS5VUkwgfSwgbnVsbCwgbnVsbCwgbnVsbCk7CiAgICAgfQogCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgdm9pZCBhZGRPclVybEVxdWFscyhTdHJpbmdCdWlsZGVyIHNiKSB7CiAgICAgICAgIHNiLmFwcGVuZCgiIE9SICIgKyBCb29rbWFya0NvbHVtbnMuVVJMICsgIiA9ICIpOwogICAgIH0KIAotICAgIC8qKgotICAgICAqICBSZXR1cm4gYSBDdXJzb3Igd2l0aCBhbGwgaGlzdG9yeS9ib29rbWFya3MgdGhhdCBhcmUgc2ltaWxhciB0byB1cmwsCi0gICAgICogIHdoZXJlIHNpbWlsYXIgbWVhbnMgJ2h0dHAocyk6Ly8nIGFuZCAnd3d3LicgYXJlIG9wdGlvbmFsLCBidXQgdGhlIHJlc3QKLSAgICAgKiAgb2YgdGhlIHVybCBpcyB0aGUgc2FtZS4KLSAgICAgKiAgQHBhcmFtIGNyICAgVGhlIENvbnRlbnRSZXNvbHZlciB1c2VkIHRvIGFjY2VzcyB0aGUgZGF0YWJhc2UuCi0gICAgICogIEBwYXJhbSB1cmwgIFRoZSB1cmwgdG8gY29tcGFyZSB0by4KLSAgICAgKiAgQGhpZGUKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEN1cnNvciBnZXRWaXNpdGVkTGlrZShDb250ZW50UmVzb2x2ZXIgY3IsIFN0cmluZyB1cmwpIHsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBDdXJzb3IgZ2V0VmlzaXRlZExpa2UoQ29udGVudFJlc29sdmVyIGNyLCBTdHJpbmcgdXJsKSB7CiAgICAgICAgIGJvb2xlYW4gc2VjdXJlID0gZmFsc2U7CiAgICAgICAgIFN0cmluZyBjb21wYXJlU3RyaW5nID0gdXJsOwogICAgICAgICBpZiAoY29tcGFyZVN0cmluZy5zdGFydHNXaXRoKCJodHRwOi8vIikpIHsKQEAgLTIyOSwxNCArMjY2LDE0IEBACiAgICAgICAgIH0KICAgICAgICAgU3RyaW5nQnVpbGRlciB3aGVyZUNsYXVzZSA9IG51bGw7CiAgICAgICAgIGlmIChzZWN1cmUpIHsKLSAgICAgICAgICAgIHdoZXJlQ2xhdXNlID0gbmV3IFN0cmluZ0J1aWxkZXIoQm9va21hcmtDb2x1bW5zLlVSTCArICIgPSAiKTsKKyAgICAgICAgICAgIHdoZXJlQ2xhdXNlID0gbmV3IFN0cmluZ0J1aWxkZXIoQm9va21hcmtzLlVSTCArICIgPSAiKTsKICAgICAgICAgICAgIERhdGFiYXNlVXRpbHMuYXBwZW5kRXNjYXBlZFNRTFN0cmluZyh3aGVyZUNsYXVzZSwKICAgICAgICAgICAgICAgICAgICAgImh0dHBzOi8vIiArIGNvbXBhcmVTdHJpbmcpOwogICAgICAgICAgICAgYWRkT3JVcmxFcXVhbHMod2hlcmVDbGF1c2UpOwogICAgICAgICAgICAgRGF0YWJhc2VVdGlscy5hcHBlbmRFc2NhcGVkU1FMU3RyaW5nKHdoZXJlQ2xhdXNlLAogICAgICAgICAgICAgICAgICAgICAiaHR0cHM6Ly93d3cuIiArIGNvbXBhcmVTdHJpbmcpOwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgd2hlcmVDbGF1c2UgPSBuZXcgU3RyaW5nQnVpbGRlcihCb29rbWFya0NvbHVtbnMuVVJMICsgIiA9ICIpOworICAgICAgICAgICAgd2hlcmVDbGF1c2UgPSBuZXcgU3RyaW5nQnVpbGRlcihCb29rbWFya3MuVVJMICsgIiA9ICIpOwogICAgICAgICAgICAgRGF0YWJhc2VVdGlscy5hcHBlbmRFc2NhcGVkU1FMU3RyaW5nKHdoZXJlQ2xhdXNlLAogICAgICAgICAgICAgICAgICAgICBjb21wYXJlU3RyaW5nKTsKICAgICAgICAgICAgIGFkZE9yVXJsRXF1YWxzKHdoZXJlQ2xhdXNlKTsKQEAgLTI1MCw3ICsyODcsNyBAQAogICAgICAgICAgICAgRGF0YWJhc2VVdGlscy5hcHBlbmRFc2NhcGVkU1FMU3RyaW5nKHdoZXJlQ2xhdXNlLAogICAgICAgICAgICAgICAgICAgICAiaHR0cDovLyIgKyB3d3dTdHJpbmcpOwogICAgICAgICB9Ci0gICAgICAgIHJldHVybiBjci5xdWVyeShCT09LTUFSS1NfVVJJLCBISVNUT1JZX1BST0pFQ1RJT04sCisgICAgICAgIHJldHVybiBjci5xdWVyeShIaXN0b3J5LkNPTlRFTlRfVVJJLCBuZXcgU3RyaW5nW10geyBIaXN0b3J5Ll9JRCwgSGlzdG9yeS5WSVNJVFMgfSwKICAgICAgICAgICAgICAgICB3aGVyZUNsYXVzZS50b1N0cmluZygpLCBudWxsLCBudWxsKTsKICAgICB9CiAKQEAgLTI2NiwyNiArMzAzLDI0IEBACiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCB2b2lkIHVwZGF0ZVZpc2l0ZWRIaXN0b3J5KENvbnRlbnRSZXNvbHZlciBjciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHVybCwgYm9vbGVhbiByZWFsKSB7Ci0gICAgICAgIGxvbmcgbm93ID0gbmV3IERhdGUoKS5nZXRUaW1lKCk7CisgICAgICAgIGxvbmcgbm93ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CiAgICAgICAgIEN1cnNvciBjID0gbnVsbDsKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIGMgPSBnZXRWaXNpdGVkTGlrZShjciwgdXJsKTsKICAgICAgICAgICAgIC8qIFdlIHNob3VsZCBvbmx5IGdldCBvbmUgYW5zd2VyIHRoYXQgaXMgZXhhY3RseSB0aGUgc2FtZS4gKi8KICAgICAgICAgICAgIGlmIChjLm1vdmVUb0ZpcnN0KCkpIHsKLSAgICAgICAgICAgICAgICBDb250ZW50VmFsdWVzIG1hcCA9IG5ldyBDb250ZW50VmFsdWVzKCk7CisgICAgICAgICAgICAgICAgQ29udGVudFZhbHVlcyB2YWx1ZXMgPSBuZXcgQ29udGVudFZhbHVlcygpOwogICAgICAgICAgICAgICAgIGlmIChyZWFsKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1hcC5wdXQoQm9va21hcmtDb2x1bW5zLlZJU0lUUywgYwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRJbnQoSElTVE9SWV9QUk9KRUNUSU9OX1ZJU0lUU19JTkRFWCkgKyAxKTsKKyAgICAgICAgICAgICAgICAgICAgdmFsdWVzLnB1dChIaXN0b3J5LlZJU0lUUywgYy5nZXRJbnQoMSkgKyAxKTsKICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBtYXAucHV0KEJvb2ttYXJrQ29sdW1ucy5VU0VSX0VOVEVSRUQsIDEpOworICAgICAgICAgICAgICAgICAgICB2YWx1ZXMucHV0KEhpc3RvcnkuVVNFUl9FTlRFUkVELCAxKTsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbWFwLnB1dChCb29rbWFya0NvbHVtbnMuREFURSwgbm93KTsKLSAgICAgICAgICAgICAgICBTdHJpbmdbXSBwcm9qZWN0aW9uID0gbmV3IFN0cmluZ1tdCi0gICAgICAgICAgICAgICAgICAgICAgICB7IEludGVnZXIudmFsdWVPZihjLmdldEludCgwKSkudG9TdHJpbmcoKSB9OwotICAgICAgICAgICAgICAgIGNyLnVwZGF0ZShCT09LTUFSS1NfVVJJLCBtYXAsICJfaWQgPSA/IiwgcHJvamVjdGlvbik7CisgICAgICAgICAgICAgICAgdmFsdWVzLnB1dChIaXN0b3J5LkRBVEVfTEFTVF9WSVNJVEVELCBub3cpOworICAgICAgICAgICAgICAgIGNyLnVwZGF0ZShDb250ZW50VXJpcy53aXRoQXBwZW5kZWRJZChIaXN0b3J5LkNPTlRFTlRfVVJJLCBjLmdldExvbmcoMCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVzLCBudWxsLCBudWxsKTsKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgdHJ1bmNhdGVIaXN0b3J5KGNyKTsKLSAgICAgICAgICAgICAgICBDb250ZW50VmFsdWVzIG1hcCA9IG5ldyBDb250ZW50VmFsdWVzKCk7CisgICAgICAgICAgICAgICAgQ29udGVudFZhbHVlcyB2YWx1ZXMgPSBuZXcgQ29udGVudFZhbHVlcygpOwogICAgICAgICAgICAgICAgIGludCB2aXNpdHM7CiAgICAgICAgICAgICAgICAgaW50IHVzZXJfZW50ZXJlZDsKICAgICAgICAgICAgICAgICBpZiAocmVhbCkgewpAQCAtMjk1LDE0ICszMzAsMTMgQEAKICAgICAgICAgICAgICAgICAgICAgdmlzaXRzID0gMDsKICAgICAgICAgICAgICAgICAgICAgdXNlcl9lbnRlcmVkID0gMTsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbWFwLnB1dChCb29rbWFya0NvbHVtbnMuVVJMLCB1cmwpOwotICAgICAgICAgICAgICAgIG1hcC5wdXQoQm9va21hcmtDb2x1bW5zLlZJU0lUUywgdmlzaXRzKTsKLSAgICAgICAgICAgICAgICBtYXAucHV0KEJvb2ttYXJrQ29sdW1ucy5EQVRFLCBub3cpOwotICAgICAgICAgICAgICAgIG1hcC5wdXQoQm9va21hcmtDb2x1bW5zLkJPT0tNQVJLLCAwKTsKLSAgICAgICAgICAgICAgICBtYXAucHV0KEJvb2ttYXJrQ29sdW1ucy5USVRMRSwgdXJsKTsKLSAgICAgICAgICAgICAgICBtYXAucHV0KEJvb2ttYXJrQ29sdW1ucy5DUkVBVEVELCAwKTsKLSAgICAgICAgICAgICAgICBtYXAucHV0KEJvb2ttYXJrQ29sdW1ucy5VU0VSX0VOVEVSRUQsIHVzZXJfZW50ZXJlZCk7Ci0gICAgICAgICAgICAgICAgY3IuaW5zZXJ0KEJPT0tNQVJLU19VUkksIG1hcCk7CisgICAgICAgICAgICAgICAgdmFsdWVzLnB1dChIaXN0b3J5LlVSTCwgdXJsKTsKKyAgICAgICAgICAgICAgICB2YWx1ZXMucHV0KEhpc3RvcnkuVklTSVRTLCB2aXNpdHMpOworICAgICAgICAgICAgICAgIHZhbHVlcy5wdXQoSGlzdG9yeS5EQVRFX0xBU1RfVklTSVRFRCwgbm93KTsKKyAgICAgICAgICAgICAgICB2YWx1ZXMucHV0KEhpc3RvcnkuVElUTEUsIHVybCk7CisgICAgICAgICAgICAgICAgdmFsdWVzLnB1dChIaXN0b3J5LkRBVEVfQ1JFQVRFRCwgMCk7CisgICAgICAgICAgICAgICAgdmFsdWVzLnB1dChIaXN0b3J5LlVTRVJfRU5URVJFRCwgdXNlcl9lbnRlcmVkKTsKKyAgICAgICAgICAgICAgICBjci5pbnNlcnQoSGlzdG9yeS5DT05URU5UX1VSSSwgdmFsdWVzKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGUpIHsKICAgICAgICAgICAgIExvZy5lKExPR1RBRywgInVwZGF0ZVZpc2l0ZWRIaXN0b3J5IiwgZSk7CkBAIC0zMjIsMTAgKzM1NiwxMCBAQAogICAgICAgICBTdHJpbmdbXSBzdHIgPSBudWxsOwogICAgICAgICB0cnkgewogICAgICAgICAgICAgU3RyaW5nW10gcHJvamVjdGlvbiA9IG5ldyBTdHJpbmdbXSB7Ci0gICAgICAgICAgICAgICAgInVybCIKKyAgICAgICAgICAgICAgICAgICAgSGlzdG9yeS5VUkwsCiAgICAgICAgICAgICB9OwotICAgICAgICAgICAgYyA9IGNyLnF1ZXJ5KEJPT0tNQVJLU19VUkksIHByb2plY3Rpb24sICJ2aXNpdHMgPiAwIiwgbnVsbCwKLSAgICAgICAgICAgICAgICAgICAgbnVsbCk7CisgICAgICAgICAgICBjID0gY3IucXVlcnkoSGlzdG9yeS5DT05URU5UX1VSSSwgcHJvamVjdGlvbiwgSGlzdG9yeS5WSVNJVFMgKyAiID4gMCIsIG51bGwsIG51bGwpOworICAgICAgICAgICAgaWYgKGMgPT0gbnVsbCkgcmV0dXJuIG5ldyBTdHJpbmdbMF07CiAgICAgICAgICAgICBzdHIgPSBuZXcgU3RyaW5nW2MuZ2V0Q291bnQoKV07CiAgICAgICAgICAgICBpbnQgaSA9IDA7CiAgICAgICAgICAgICB3aGlsZSAoYy5tb3ZlVG9OZXh0KCkpIHsKQEAgLTM1MywzMSArMzg3LDI5IEBACiAgICAgICogQHBhcmFtIGNyIFRoZSBDb250ZW50UmVzb2x2ZXIgdXNlZCB0byBhY2Nlc3MgdGhlIGRhdGFiYXNlLgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgdm9pZCB0cnVuY2F0ZUhpc3RvcnkoQ29udGVudFJlc29sdmVyIGNyKSB7Ci0gICAgICAgIEN1cnNvciBjID0gbnVsbDsKKyAgICAgICAgLy8gVE9ETyBtYWtlIGEgc2luZ2xlIHJlcXVlc3QgdG8gdGhlIHByb3ZpZGVyIHRvIGRvIHRoaXMgaW4gYSBzaW5nbGUgdHJhbnNhY3Rpb24KKyAgICAgICAgQ3Vyc29yIGN1cnNvciA9IG51bGw7CiAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAKICAgICAgICAgICAgIC8vIFNlbGVjdCBub24tYm9va21hcmsgaGlzdG9yeSwgb3JkZXJlZCBieSBkYXRlCi0gICAgICAgICAgICBjID0gY3IucXVlcnkoCi0gICAgICAgICAgICAgICAgICAgIEJPT0tNQVJLU19VUkksCi0gICAgICAgICAgICAgICAgICAgIFRSVU5DQVRFX0hJU1RPUllfUFJPSkVDVElPTiwKLSAgICAgICAgICAgICAgICAgICAgImJvb2ttYXJrID0gMCIsCi0gICAgICAgICAgICAgICAgICAgIG51bGwsCi0gICAgICAgICAgICAgICAgICAgIEJvb2ttYXJrQ29sdW1ucy5EQVRFKTsKLSAgICAgICAgICAgIC8vIExvZy52KExPR1RBRywgImhpc3RvcnkgY291bnQgIiArIGMuY291bnQoKSk7Ci0gICAgICAgICAgICBpZiAoYy5tb3ZlVG9GaXJzdCgpICYmIGMuZ2V0Q291bnQoKSA+PSBNQVhfSElTVE9SWV9DT1VOVCkgeworICAgICAgICAgICAgY3Vyc29yID0gY3IucXVlcnkoSGlzdG9yeS5DT05URU5UX1VSSSwKKyAgICAgICAgICAgICAgICAgICAgbmV3IFN0cmluZ1tdIHsgSGlzdG9yeS5fSUQsIEhpc3RvcnkuVVJMLCBIaXN0b3J5LkRBVEVfTEFTVF9WSVNJVEVEIH0sCisgICAgICAgICAgICAgICAgICAgIG51bGwsIG51bGwsIEhpc3RvcnkuREFURV9MQVNUX1ZJU0lURUQgKyAiIEFTQyIpOworCisgICAgICAgICAgICBpZiAoY3Vyc29yLm1vdmVUb0ZpcnN0KCkgJiYgY3Vyc29yLmdldENvdW50KCkgPj0gTUFYX0hJU1RPUllfQ09VTlQpIHsKKyAgICAgICAgICAgICAgICBmaW5hbCBXZWJJY29uRGF0YWJhc2UgaWNvbkRiID0gV2ViSWNvbkRhdGFiYXNlLmdldEluc3RhbmNlKCk7CiAgICAgICAgICAgICAgICAgLyogZWxpbWluYXRlIG9sZGVzdCBoaXN0b3J5IGl0ZW1zICovCiAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBUUlVOQ0FURV9OX09MREVTVDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIExvZy52KExPR1RBRywgInRydW5jYXRlIGhpc3RvcnkgIiArCi0gICAgICAgICAgICAgICAgICAgIC8vIGMuZ2V0SW50KFRSVU5DQVRFX0hJU1RPUllfUFJPSkVDVElPTl9JRF9JTkRFWCkpOwotICAgICAgICAgICAgICAgICAgICBjci5kZWxldGUoQk9PS01BUktTX1VSSSwgIl9pZCA9ICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMuZ2V0SW50KFRSVU5DQVRFX0hJU1RPUllfUFJPSkVDVElPTl9JRF9JTkRFWCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmICghYy5tb3ZlVG9OZXh0KCkpIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjci5kZWxldGUoQ29udGVudFVyaXMud2l0aEFwcGVuZGVkSWQoSGlzdG9yeS5DT05URU5UX1VSSSwgY3Vyc29yLmdldExvbmcoMCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwsIG51bGwpOworICAgICAgICAgICAgICAgICAgICBpY29uRGIucmVsZWFzZUljb25Gb3JQYWdlVXJsKGN1cnNvci5nZXRTdHJpbmcoMSkpOworICAgICAgICAgICAgICAgICAgICBpZiAoIWN1cnNvci5tb3ZlVG9OZXh0KCkpIGJyZWFrOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGUpIHsKICAgICAgICAgICAgIExvZy5lKExPR1RBRywgInRydW5jYXRlSGlzdG9yeSIsIGUpOwogICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgaWYgKGMgIT0gbnVsbCkgYy5jbG9zZSgpOworICAgICAgICAgICAgaWYgKGN1cnNvciAhPSBudWxsKSBjdXJzb3IuY2xvc2UoKTsKICAgICAgICAgfQogICAgIH0KIApAQCAtMzg4LDIzICs0MjAsMTcgQEAKICAgICAgKiBAcmV0dXJuIGJvb2xlYW4gIFRydWUgaWYgdGhlIGhpc3RvcnkgY2FuIGJlIGNsZWFyZWQuCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIGNhbkNsZWFySGlzdG9yeShDb250ZW50UmVzb2x2ZXIgY3IpIHsKLSAgICAgICAgQ3Vyc29yIGMgPSBudWxsOworICAgICAgICBDdXJzb3IgY3Vyc29yID0gbnVsbDsKICAgICAgICAgYm9vbGVhbiByZXQgPSBmYWxzZTsKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGMgPSBjci5xdWVyeSgKLSAgICAgICAgICAgICAgICBCT09LTUFSS1NfVVJJLAotICAgICAgICAgICAgICAgIG5ldyBTdHJpbmcgW10geyBCb29rbWFya0NvbHVtbnMuX0lELCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQm9va21hcmtDb2x1bW5zLkJPT0tNQVJLLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCb29rbWFya0NvbHVtbnMuVklTSVRTIH0sCi0gICAgICAgICAgICAgICAgImJvb2ttYXJrID0gMCBPUiB2aXNpdHMgPiAwIiwgCi0gICAgICAgICAgICAgICAgbnVsbCwKLSAgICAgICAgICAgICAgICBudWxsCi0gICAgICAgICAgICAgICAgKTsKLSAgICAgICAgICAgIHJldCA9IGMubW92ZVRvRmlyc3QoKTsKKyAgICAgICAgICAgIGN1cnNvciA9IGNyLnF1ZXJ5KEhpc3RvcnkuQ09OVEVOVF9VUkksCisgICAgICAgICAgICAgICAgbmV3IFN0cmluZyBbXSB7IEhpc3RvcnkuX0lELCBIaXN0b3J5LlZJU0lUUyB9LAorICAgICAgICAgICAgICAgIG51bGwsIG51bGwsIG51bGwpOworICAgICAgICAgICAgcmV0ID0gY3Vyc29yLmdldENvdW50KCkgPiAwOwogICAgICAgICB9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZSkgewogICAgICAgICAgICAgTG9nLmUoTE9HVEFHLCAiY2FuQ2xlYXJIaXN0b3J5IiwgZSk7CiAgICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBpZiAoYyAhPSBudWxsKSBjLmNsb3NlKCk7CisgICAgICAgICAgICBpZiAoY3Vyc29yICE9IG51bGwpIGN1cnNvci5jbG9zZSgpOwogICAgICAgICB9CiAgICAgICAgIHJldHVybiByZXQ7CiAgICAgfQpAQCAtNDIwLDY3ICs0NDYsMzYgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBIZWxwZXIgZnVuY3Rpb24gdG8gZGVsZXRlIGFsbCBoaXN0b3J5IGl0ZW1zIGFuZCByZXZlcnQgYWxsCi0gICAgICogYm9va21hcmtzIHRvIHplcm8gdmlzaXRzIHdoaWNoIG1lZXQgdGhlIGNyaXRlcmlhIHByb3ZpZGVkLgotICAgICAqICBSZXF1aXJlcyB7QGxpbmsgYW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uI1JFQURfSElTVE9SWV9CT09LTUFSS1N9Ci0gICAgICogIFJlcXVpcmVzIHtAbGluayBhbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24jV1JJVEVfSElTVE9SWV9CT09LTUFSS1N9CisgICAgICogSGVscGVyIGZ1bmN0aW9uIHRvIGRlbGV0ZSBhbGwgaGlzdG9yeSBpdGVtcyBhbmQgcmVsZWFzZSB0aGUgaWNvbnMgZm9yIHRoZW0gaW4gdGhlCisgICAgICoge0BsaW5rIFdlYkljb25EYXRhYmFzZX0uCisgICAgICoKKyAgICAgKiBSZXF1aXJlcyB7QGxpbmsgYW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uI1JFQURfSElTVE9SWV9CT09LTUFSS1N9CisgICAgICogUmVxdWlyZXMge0BsaW5rIGFuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbiNXUklURV9ISVNUT1JZX0JPT0tNQVJLU30KKyAgICAgKgogICAgICAqIEBwYXJhbSBjciAgIFRoZSBDb250ZW50UmVzb2x2ZXIgdXNlZCB0byBhY2Nlc3MgdGhlIGRhdGFiYXNlLgogICAgICAqIEBwYXJhbSB3aGVyZUNsYXVzZSAgIFN0cmluZyB0byBsaW1pdCB0aGUgaXRlbXMgYWZmZWN0ZWQuCiAgICAgICogICAgICAgICAgICAgICAgICAgICAgbnVsbCBtZWFucyBhbGwgaXRlbXMuCiAgICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgdm9pZCBkZWxldGVIaXN0b3J5V2hlcmUoQ29udGVudFJlc29sdmVyIGNyLAotICAgICAgICAgICAgU3RyaW5nIHdoZXJlQ2xhdXNlKSB7Ci0gICAgICAgIEN1cnNvciBjID0gbnVsbDsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCB2b2lkIGRlbGV0ZUhpc3RvcnlXaGVyZShDb250ZW50UmVzb2x2ZXIgY3IsIFN0cmluZyB3aGVyZUNsYXVzZSkgeworICAgICAgICBDdXJzb3IgY3Vyc29yID0gbnVsbDsKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGMgPSBjci5xdWVyeShCT09LTUFSS1NfVVJJLAotICAgICAgICAgICAgICAgIEhJU1RPUllfUFJPSkVDVElPTiwKLSAgICAgICAgICAgICAgICB3aGVyZUNsYXVzZSwKLSAgICAgICAgICAgICAgICBudWxsLAotICAgICAgICAgICAgICAgIG51bGwpOwotICAgICAgICAgICAgaWYgKGMubW92ZVRvRmlyc3QoKSkgeworICAgICAgICAgICAgY3Vyc29yID0gY3IucXVlcnkoSGlzdG9yeS5DT05URU5UX1VSSSwgbmV3IFN0cmluZ1tdIHsgSGlzdG9yeS5VUkwgfSwgd2hlcmVDbGF1c2UsCisgICAgICAgICAgICAgICAgICAgIG51bGwsIG51bGwpOworICAgICAgICAgICAgaWYgKGN1cnNvci5tb3ZlVG9GaXJzdCgpKSB7CiAgICAgICAgICAgICAgICAgZmluYWwgV2ViSWNvbkRhdGFiYXNlIGljb25EYiA9IFdlYkljb25EYXRhYmFzZS5nZXRJbnN0YW5jZSgpOwotICAgICAgICAgICAgICAgIC8qIERlbGV0ZSBmYXZpY29ucywgYW5kIHJldmVydCBib29rbWFya3Mgd2hpY2ggaGF2ZSBiZWVuIHZpc2l0ZWQKLSAgICAgICAgICAgICAgICAgKiB0byBzaW1wbHkgYm9va21hcmtzLgotICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICAgICAgICAgICAgICBib29sZWFuIGZpcnN0VGltZSA9IHRydWU7CiAgICAgICAgICAgICAgICAgZG8gewotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgdXJsID0gYy5nZXRTdHJpbmcoSElTVE9SWV9QUk9KRUNUSU9OX1VSTF9JTkRFWCk7Ci0gICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gaXNCb29rbWFyayA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBjLmdldEludChISVNUT1JZX1BST0pFQ1RJT05fQk9PS01BUktfSU5ERVgpID09IDE7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChpc0Jvb2ttYXJrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmlyc3RUaW1lKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3RUaW1lID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgiIE9SICIpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCIoIF9pZCA9ICIpOwotICAgICAgICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKGMuZ2V0SW50KDApKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgiICkiKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGljb25EYi5yZWxlYXNlSWNvbkZvclBhZ2VVcmwodXJsKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gd2hpbGUgKGMubW92ZVRvTmV4dCgpKTsKKyAgICAgICAgICAgICAgICAgICAgLy8gRGVsZXRlIGZhdmljb25zCisgICAgICAgICAgICAgICAgICAgIC8vIFRPRE8gZG9uJ3QgcmVsZWFzZSBpZiB0aGUgVVJMIGlzIGJvb2ttYXJrZWQKKyAgICAgICAgICAgICAgICAgICAgaWNvbkRiLnJlbGVhc2VJY29uRm9yUGFnZVVybChjdXJzb3IuZ2V0U3RyaW5nKDApKTsKKyAgICAgICAgICAgICAgICB9IHdoaWxlIChjdXJzb3IubW92ZVRvTmV4dCgpKTsKIAotICAgICAgICAgICAgICAgIGlmICghZmlyc3RUaW1lKSB7Ci0gICAgICAgICAgICAgICAgICAgIENvbnRlbnRWYWx1ZXMgbWFwID0gbmV3IENvbnRlbnRWYWx1ZXMoKTsKLSAgICAgICAgICAgICAgICAgICAgbWFwLnB1dChCb29rbWFya0NvbHVtbnMuVklTSVRTLCAwKTsKLSAgICAgICAgICAgICAgICAgICAgbWFwLnB1dChCb29rbWFya0NvbHVtbnMuREFURSwgMCk7Ci0gICAgICAgICAgICAgICAgICAgIC8qIEZJWE1FOiBTaG91bGQgSSBhbHNvIHJlbW92ZSB0aGUgdGl0bGU/ICovCi0gICAgICAgICAgICAgICAgICAgIGNyLnVwZGF0ZShCT09LTUFSS1NfVVJJLCBtYXAsIHNiLnRvU3RyaW5nKCksIG51bGwpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIFN0cmluZyBkZWxldGVXaGVyZUNsYXVzZSA9IEJvb2ttYXJrQ29sdW1ucy5CT09LTUFSSyArICIgPSAwIjsKLSAgICAgICAgICAgICAgICBpZiAod2hlcmVDbGF1c2UgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBkZWxldGVXaGVyZUNsYXVzZSArPSAiIEFORCAiICsgd2hlcmVDbGF1c2U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNyLmRlbGV0ZShCT09LTUFSS1NfVVJJLCBkZWxldGVXaGVyZUNsYXVzZSwgbnVsbCk7CisgICAgICAgICAgICAgICAgY3IuZGVsZXRlKEJPT0tNQVJLU19VUkksIHdoZXJlQ2xhdXNlLCBudWxsKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGUpIHsKICAgICAgICAgICAgIExvZy5lKExPR1RBRywgImRlbGV0ZUhpc3RvcnlXaGVyZSIsIGUpOwogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgaWYgKGMgIT0gbnVsbCkgYy5jbG9zZSgpOworICAgICAgICAgICAgaWYgKGN1cnNvciAhPSBudWxsKSBjdXJzb3IuY2xvc2UoKTsKICAgICAgICAgfQogICAgIH0KIApAQCAtNTIwLDEwICs1MTUsNyBAQAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgdm9pZCBkZWxldGVGcm9tSGlzdG9yeShDb250ZW50UmVzb2x2ZXIgY3IsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgdXJsKSB7Ci0gICAgICAgIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcihCb29rbWFya0NvbHVtbnMuVVJMICsgIiA9ICIpOwotICAgICAgICBEYXRhYmFzZVV0aWxzLmFwcGVuZEVzY2FwZWRTUUxTdHJpbmcoc2IsIHVybCk7Ci0gICAgICAgIFN0cmluZyBtYXRjaGVzVXJsID0gc2IudG9TdHJpbmcoKTsKLSAgICAgICAgZGVsZXRlSGlzdG9yeVdoZXJlKGNyLCBtYXRjaGVzVXJsKTsKKyAgICAgICAgY3IuZGVsZXRlKEhpc3RvcnkuQ09OVEVOVF9VUkksIEhpc3RvcnkuVVJMICsgIj0/IiwgbmV3IFN0cmluZ1tdIHsgdXJsIH0pOwogICAgIH0KIAogICAgIC8qKgpAQCAtNTM0LDMwICs1MjYsMTMgQEAKICAgICAgKiBAcGFyYW0gc2VhcmNoICAgIFRoZSBzdHJpbmcgdG8gYWRkIHRvIHRoZSBzZWFyY2hlcyBkYXRhYmFzZS4KICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIHZvaWQgYWRkU2VhcmNoVXJsKENvbnRlbnRSZXNvbHZlciBjciwgU3RyaW5nIHNlYXJjaCkgewotICAgICAgICBsb25nIG5vdyA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpOwotICAgICAgICBDdXJzb3IgYyA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBjID0gY3IucXVlcnkoCi0gICAgICAgICAgICAgICAgU0VBUkNIRVNfVVJJLAotICAgICAgICAgICAgICAgIFNFQVJDSEVTX1BST0pFQ1RJT04sCi0gICAgICAgICAgICAgICAgU0VBUkNIRVNfV0hFUkVfQ0xBVVNFLAotICAgICAgICAgICAgICAgIG5ldyBTdHJpbmcgW10geyBzZWFyY2ggfSwKLSAgICAgICAgICAgICAgICBudWxsKTsKLSAgICAgICAgICAgIENvbnRlbnRWYWx1ZXMgbWFwID0gbmV3IENvbnRlbnRWYWx1ZXMoKTsKLSAgICAgICAgICAgIG1hcC5wdXQoU2VhcmNoQ29sdW1ucy5TRUFSQ0gsIHNlYXJjaCk7Ci0gICAgICAgICAgICBtYXAucHV0KFNlYXJjaENvbHVtbnMuREFURSwgbm93KTsKLSAgICAgICAgICAgIC8qIFdlIHNob3VsZCBvbmx5IGdldCBvbmUgYW5zd2VyIHRoYXQgaXMgZXhhY3RseSB0aGUgc2FtZS4gKi8KLSAgICAgICAgICAgIGlmIChjLm1vdmVUb0ZpcnN0KCkpIHsKLSAgICAgICAgICAgICAgICBjci51cGRhdGUoU0VBUkNIRVNfVVJJLCBtYXAsICJfaWQgPSAiICsgYy5nZXRJbnQoMCksIG51bGwpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBjci5pbnNlcnQoU0VBUkNIRVNfVVJJLCBtYXApOwotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgTG9nLmUoTE9HVEFHLCAiYWRkU2VhcmNoVXJsIiwgZSk7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBpZiAoYyAhPSBudWxsKSBjLmNsb3NlKCk7Ci0gICAgICAgIH0KKyAgICAgICAgLy8gVGhlIGNvbnRlbnQgcHJvdmlkZXIgd2lsbCB0YWtlIGNhcmUgb2YgdXBkYXRpbmcgZXhpc3Rpbmcgc2VhcmNoZXMgaW5zdGVhZCBvZiBkdXBsaWNhdGluZworICAgICAgICBDb250ZW50VmFsdWVzIHZhbHVlcyA9IG5ldyBDb250ZW50VmFsdWVzKCk7CisgICAgICAgIHZhbHVlcy5wdXQoU2VhcmNoZXMuU0VBUkNILCBzZWFyY2gpOworICAgICAgICB2YWx1ZXMucHV0KFNlYXJjaGVzLkRBVEUsIFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpKTsKKyAgICAgICAgY3IuaW5zZXJ0KFNlYXJjaGVzLkNPTlRFTlRfVVJJLCB2YWx1ZXMpOwogICAgIH0KKwogICAgIC8qKgogICAgICAqIFJlbW92ZSBhbGwgc2VhcmNoZXMgZnJvbSB0aGUgc2VhcmNoIGRhdGFiYXNlLgogICAgICAqICBSZXF1aXJlcyB7QGxpbmsgYW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uI1dSSVRFX0hJU1RPUllfQk9PS01BUktTfQpAQCAtNTY3LDcgKzU0Miw3IEBACiAgICAgICAgIC8vIEZJWE1FOiBTaG91bGQgdGhpcyBjbGVhciB0aGUgdXJscyB0byB3aGljaCB0aGVzZSBzZWFyY2hlcyBsZWFkPwogICAgICAgICAvLyAoaS5lLiByZW1vdmUgZ29vZ2xlLmNvbS9xdWVyeT0gYmxhaCBibGFoIGJsYWgpCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBjci5kZWxldGUoU0VBUkNIRVNfVVJJLCBudWxsLCBudWxsKTsKKyAgICAgICAgICAgIGNyLmRlbGV0ZShTZWFyY2hlcy5DT05URU5UX1VSSSwgbnVsbCwgbnVsbCk7CiAgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgICBMb2cuZShMT0dUQUcsICJjbGVhclNlYXJjaGVzIiwgZSk7CiAgICAgICAgIH0KQEAgLTU4NiwzNSArNTYxLDkyIEBACiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCB2b2lkIHJlcXVlc3RBbGxJY29ucyhDb250ZW50UmVzb2x2ZXIgY3IsIFN0cmluZyB3aGVyZSwKICAgICAgICAgICAgIFdlYkljb25EYXRhYmFzZS5JY29uTGlzdGVuZXIgbGlzdGVuZXIpIHsKLSAgICAgICAgV2ViSWNvbkRhdGFiYXNlLmdldEluc3RhbmNlKCkKLSAgICAgICAgICAgICAgICAuYnVsa1JlcXVlc3RJY29uRm9yUGFnZVVybChjciwgd2hlcmUsIGxpc3RlbmVyKTsKKyAgICAgICAgV2ViSWNvbkRhdGFiYXNlLmdldEluc3RhbmNlKCkuYnVsa1JlcXVlc3RJY29uRm9yUGFnZVVybChjciwgd2hlcmUsIGxpc3RlbmVyKTsKICAgICB9CiAKKyAgICAvKioKKyAgICAgKiBDb2x1bW4gZGVmaW5pdGlvbnMgZm9yIHRoZSBtaXhlZCBib29rbWFyayBhbmQgaGlzdG9yeSBpdGVtcyBhdmFpbGFibGUKKyAgICAgKiBhdCB7QGxpbmsgI0JPT0tNQVJLU19VUkl9LgorICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQm9va21hcmtDb2x1bW5zIGltcGxlbWVudHMgQmFzZUNvbHVtbnMgeworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIFVSTCBvZiB0aGUgYm9va21hcmsgb3IgaGlzdG9yeSBpdGVtLgorICAgICAgICAgKiA8cD5UeXBlOiBURVhUIChVUkwpPC9wPgorICAgICAgICAgKi8KICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVJMID0gInVybCI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBudW1iZXIgb2YgdGltZSB0aGUgaXRlbSBoYXMgYmVlbiB2aXNpdGVkLgorICAgICAgICAgKiA8cD5UeXBlOiBOVU1CRVI8L3A+CisgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWSVNJVFMgPSAidmlzaXRzIjsKKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIGRhdGUgdGhlIGl0ZW0gd2FzIGxhc3QgdmlzaXRlZCwgaW4gbWlsbGlzZWNvbmRzIHNpbmNlIHRoZSBlcG9jaC4KKyAgICAgICAgICogPHA+VHlwZTogTlVNQkVSIChkYXRlIGluIG1pbGxpc2Vjb25kcyBzaW5jZSBKYW51YXJ5IDEsIDE5NzApPC9wPgorICAgICAgICAgKi8KICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREFURSA9ICJkYXRlIjsKKworICAgICAgICAvKioKKyAgICAgICAgICogRmxhZyBpbmRpY2F0aW5nIHRoYXQgYW4gaXRlbSBpcyBhIGJvb2ttYXJrLiBBIHZhbHVlIG9mIDEgaW5kaWNhdGVzIGEgYm9va21hcmssIGEgdmFsdWUKKyAgICAgICAgICogb2YgMCBpbmRpY2F0ZXMgYSBoaXN0b3J5IGl0ZW0uCisgICAgICAgICAqIDxwPlR5cGU6IElOVEVHRVIgKGJvb2xlYW4pPC9wPgorICAgICAgICAgKi8KICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQk9PS01BUksgPSAiYm9va21hcmsiOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgdXNlciB2aXNpYmxlIHRpdGxlIG9mIHRoZSBib29rbWFyayBvciBoaXN0b3J5IGl0ZW0uCisgICAgICAgICAqIDxwPlR5cGU6IFRFWFQ8L3A+CisgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUSVRMRSA9ICJ0aXRsZSI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBkYXRlIHRoZSBpdGVtIGNyZWF0ZWQsIGluIG1pbGxpc2Vjb25kcyBzaW5jZSB0aGUgZXBvY2guCisgICAgICAgICAqIDxwPlR5cGU6IE5VTUJFUiAoZGF0ZSBpbiBtaWxsaXNlY29uZHMgc2luY2UgSmFudWFyeSAxLCAxOTcwKTwvcD4KKyAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENSRUFURUQgPSAiY3JlYXRlZCI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBmYXZpY29uIG9mIHRoZSBib29rbWFyay4gTXVzdCBkZWNvZGUgdmlhIHtAbGluayBCaXRtYXBGYWN0b3J5I2RlY29kZUJ5dGVBcnJheX0uCisgICAgICAgICAqIDxwPlR5cGU6IEJMT0IgKGltYWdlKTwvcD4KKyAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZBVklDT04gPSAiZmF2aWNvbiI7CisKICAgICAgICAgLyoqCiAgICAgICAgICAqIEBoaWRlCiAgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUSFVNQk5BSUwgPSAidGh1bWJuYWlsIjsKKwogICAgICAgICAvKioKICAgICAgICAgICogQGhpZGUKICAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRPVUNIX0lDT04gPSAidG91Y2hfaWNvbiI7CisKICAgICAgICAgLyoqCiAgICAgICAgICAqIEBoaWRlCiAgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVU0VSX0VOVEVSRUQgPSAidXNlcl9lbnRlcmVkIjsKICAgICB9CiAKKyAgICAvKioKKyAgICAgKiBDb2x1bW4gZGVmaW5pdGlvbnMgZm9yIHRoZSBzZWFyY2ggaGlzdG9yeSB0YWJsZSwgYXZhaWxhYmxlIGF0IHtAbGluayAjU0VBUkNIRVNfVVJJfS4KKyAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFNlYXJjaENvbHVtbnMgaW1wbGVtZW50cyBCYXNlQ29sdW1ucyB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBAZGVwcmVjYXRlZCBOb3QgdXNlZC4KKyAgICAgICAgICovCisgICAgICAgIEBEZXByZWNhdGVkCiAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVSTCA9ICJ1cmwiOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgdXNlciBlbnRlcmVkIHNlYXJjaCB0ZXJtLgorICAgICAgICAgKi8KICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VBUkNIID0gInNlYXJjaCI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBkYXRlIHRoZSBzZWFyY2ggd2FzIHBlcmZvcm1lZCwgaW4gbWlsbGlzZWNvbmRzIHNpbmNlIHRoZSBlcG9jaC4KKyAgICAgICAgICogPHA+VHlwZTogTlVNQkVSIChkYXRlIGluIG1pbGxpc2Vjb25kcyBzaW5jZSBKYW51YXJ5IDEsIDE5NzApPC9wPgorICAgICAgICAgKi8KICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREFURSA9ICJkYXRlIjsKICAgICB9CiB9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9wcm92aWRlci9Ccm93c2VyQ29udHJhY3QuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3Byb3ZpZGVyL0Jyb3dzZXJDb250cmFjdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY4YTJhMTMKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9wcm92aWRlci9Ccm93c2VyQ29udHJhY3QuamF2YQpAQCAtMCwwICsxLDM5OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlCisgKi8KKworcGFja2FnZSBhbmRyb2lkLnByb3ZpZGVyOworCitpbXBvcnQgYW5kcm9pZC5hY2NvdW50cy5BY2NvdW50OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZW50UHJvdmlkZXJDbGllbnQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRQcm92aWRlck9wZXJhdGlvbjsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFJlc29sdmVyOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZW50VXJpczsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkJpdG1hcEZhY3Rvcnk7CitpbXBvcnQgYW5kcm9pZC5uZXQuVXJpOworaW1wb3J0IGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uOworaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuU3luY1N0YXRlQ29udHJhY3Q7CitpbXBvcnQgYW5kcm9pZC51dGlsLlBhaXI7CisKKy8qKgorICogQGhpZGUKKyAqLworcHVibGljIGNsYXNzIEJyb3dzZXJDb250cmFjdCB7CisgICAgLyoqIFRoZSBhdXRob3JpdHkgZm9yIHRoZSBicm93c2VyIHByb3ZpZGVyICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVVUSE9SSVRZID0gImNvbS5hbmRyb2lkLmJyb3dzZXIiOworCisgICAgLyoqIEEgY29udGVudDovLyBzdHlsZSB1cmkgdG8gdGhlIGF1dGhvcml0eSBmb3IgdGhlIGJyb3dzZXIgcHJvdmlkZXIgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFVyaSBBVVRIT1JJVFlfVVJJID0gVXJpLnBhcnNlKCJjb250ZW50Oi8vIiArIEFVVEhPUklUWSk7CisKKyAgICAvKioKKyAgICAgKiBBbiBvcHRpb25hbCBpbnNlcnQsIHVwZGF0ZSBvciBkZWxldGUgVVJJIHBhcmFtZXRlciB0aGF0IGFsbG93cyB0aGUgY2FsbGVyCisgICAgICogdG8gc3BlY2lmeSB0aGF0IGl0IGlzIGEgc3luYyBhZGFwdGVyLiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyBmYWxzZS4gSWYgdHJ1ZQorICAgICAqIHRoZSBkaXJ0eSBmbGFnIGlzIG5vdCBhdXRvbWF0aWNhbGx5IHNldCBhbmQgdGhlICJzeW5jVG9OZXR3b3JrIiBwYXJhbWV0ZXIKKyAgICAgKiBpcyBzZXQgdG8gZmFsc2Ugd2hlbiBjYWxsaW5nCisgICAgICoge0BsaW5rIENvbnRlbnRSZXNvbHZlciNub3RpZnlDaGFuZ2UoYW5kcm9pZC5uZXQuVXJpLCBhbmRyb2lkLmRhdGFiYXNlLkNvbnRlbnRPYnNlcnZlciwgYm9vbGVhbil9LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENBTExFUl9JU19TWU5DQURBUFRFUiA9ICJjYWxsZXJfaXNfc3luY2FkYXB0ZXIiOworCisgICAgLyoqCisgICAgICogR2VuZXJpYyBjb2x1bW5zIGZvciB1c2UgYnkgc3luYyBhZGFwdGVycy4gVGhlIHNwZWNpZmljIGZ1bmN0aW9ucyBvZgorICAgICAqIHRoZXNlIGNvbHVtbnMgYXJlIHByaXZhdGUgdG8gdGhlIHN5bmMgYWRhcHRlci4gT3RoZXIgY2xpZW50cyBvZiB0aGUgQVBJCisgICAgICogc2hvdWxkIG5vdCBhdHRlbXB0IHRvIGVpdGhlciByZWFkIG9yIHdyaXRlIHRoZXNlIGNvbHVtbnMuCisgICAgICovCisgICAgaW50ZXJmYWNlIEJhc2VTeW5jQ29sdW1ucyB7CisgICAgICAgIC8qKiBHZW5lcmljIGNvbHVtbiBmb3IgdXNlIGJ5IHN5bmMgYWRhcHRlcnMuICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNZTkMxID0gInN5bmMxIjsKKyAgICAgICAgLyoqIEdlbmVyaWMgY29sdW1uIGZvciB1c2UgYnkgc3luYyBhZGFwdGVycy4gKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1lOQzIgPSAic3luYzIiOworICAgICAgICAvKiogR2VuZXJpYyBjb2x1bW4gZm9yIHVzZSBieSBzeW5jIGFkYXB0ZXJzLiAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTWU5DMyA9ICJzeW5jMyI7CisgICAgICAgIC8qKiBHZW5lcmljIGNvbHVtbiBmb3IgdXNlIGJ5IHN5bmMgYWRhcHRlcnMuICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNZTkM0ID0gInN5bmM0IjsKKyAgICAgICAgLyoqIEdlbmVyaWMgY29sdW1uIGZvciB1c2UgYnkgc3luYyBhZGFwdGVycy4gKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1lOQzUgPSAic3luYzUiOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnZlbmllbmNlIGRlZmluaXRpb25zIGZvciB1c2UgaW4gaW1wbGVtZW50aW5nIGNocm9tZSBib29rbWFya3Mgc3luYyBpbiB0aGUgQm9va21hcmtzIHRhYmxlLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgQ2hyb21lU3luY0NvbHVtbnMgeworICAgICAgICBwcml2YXRlIENocm9tZVN5bmNDb2x1bW5zKCkge30KKworICAgICAgICAvKiogVGhlIHNlcnZlciB1bmlxdWUgSUQgZm9yIGFuIGl0ZW0gKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VSVkVSX1VOSVFVRSA9IEJhc2VTeW5jQ29sdW1ucy5TWU5DMzsKKworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGT0xERVJfTkFNRV9ST09UID0gImdvb2dsZV9jaHJvbWUiOworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGT0xERVJfTkFNRV9CT09LTUFSS1MgPSAiZ29vZ2xlX2Nocm9tZV9ib29rbWFya3MiOworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGT0xERVJfTkFNRV9CT09LTUFSS1NfQkFSID0gImJvb2ttYXJrX2JhciI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZPTERFUl9OQU1FX09USEVSX0JPT0tNQVJLUyA9ICJvdGhlcl9ib29rbWFya3MiOworCisgICAgICAgIC8qKiBUaGUgY2xpZW50IHVuaXF1ZSBJRCBmb3IgYW4gaXRlbSAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDTElFTlRfVU5JUVVFID0gQmFzZVN5bmNDb2x1bW5zLlNZTkM0OworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbHVtbnMgdGhhdCBhcHBlYXIgd2hlbiBlYWNoIHJvdyBvZiBhIHRhYmxlIGJlbG9uZ3MgdG8gYSBzcGVjaWZpYworICAgICAqIGFjY291bnQsIGluY2x1ZGluZyBzeW5jIGluZm9ybWF0aW9uIHRoYXQgYW4gYWNjb3VudCBtYXkgbmVlZC4KKyAgICAgKi8KKyAgICBpbnRlcmZhY2UgU3luY0NvbHVtbnMgZXh0ZW5kcyBCYXNlU3luY0NvbHVtbnMgeworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIG5hbWUgb2YgdGhlIGFjY291bnQgaW5zdGFuY2UgdG8gd2hpY2ggdGhpcyByb3cgYmVsb25ncywgd2hpY2ggd2hlbiBwYWlyZWQgd2l0aAorICAgICAgICAgKiB7QGxpbmsgI0FDQ09VTlRfVFlQRX0gaWRlbnRpZmllcyBhIHNwZWNpZmljIGFjY291bnQuCisgICAgICAgICAqIDxQPlR5cGU6IFRFWFQ8L1A+CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBQ0NPVU5UX05BTUUgPSAiYWNjb3VudF9uYW1lIjsKKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIHR5cGUgb2YgYWNjb3VudCB0byB3aGljaCB0aGlzIHJvdyBiZWxvbmdzLCB3aGljaCB3aGVuIHBhaXJlZCB3aXRoCisgICAgICAgICAqIHtAbGluayAjQUNDT1VOVF9OQU1FfSBpZGVudGlmaWVzIGEgc3BlY2lmaWMgYWNjb3VudC4KKyAgICAgICAgICogPFA+VHlwZTogVEVYVDwvUD4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFDQ09VTlRfVFlQRSA9ICJhY2NvdW50X3R5cGUiOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBTdHJpbmcgdGhhdCB1bmlxdWVseSBpZGVudGlmaWVzIHRoaXMgcm93IHRvIGl0cyBzb3VyY2UgYWNjb3VudC4KKyAgICAgICAgICogPFA+VHlwZTogVEVYVDwvUD4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNPVVJDRV9JRCA9ICJzb3VyY2VpZCI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFZlcnNpb24gbnVtYmVyIHRoYXQgaXMgdXBkYXRlZCB3aGVuZXZlciB0aGlzIHJvdyBvciBpdHMgcmVsYXRlZCBkYXRhCisgICAgICAgICAqIGNoYW5nZXMuCisgICAgICAgICAqIDxQPlR5cGU6IElOVEVHRVI8L1A+CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWRVJTSU9OID0gInZlcnNpb24iOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBGbGFnIGluZGljYXRpbmcgdGhhdCB7QGxpbmsgI1ZFUlNJT059IGhhcyBjaGFuZ2VkLCBhbmQgdGhpcyByb3cgbmVlZHMKKyAgICAgICAgICogdG8gYmUgc3luY2hyb25pemVkIGJ5IGl0cyBvd25pbmcgYWNjb3VudC4KKyAgICAgICAgICogPFA+VHlwZTogSU5URUdFUiAoYm9vbGVhbik8L1A+CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBESVJUWSA9ICJkaXJ0eSI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSB0aW1lIHRoYXQgdGhpcyByb3cgd2FzIGNyZWF0ZWQgb24gaXRzIG9yaWdpbmF0aW5nIGNsaWVudCAobXNlY3MKKyAgICAgICAgICogc2luY2UgdGhlIGVwb2NoKS4KKyAgICAgICAgICogPFA+VHlwZTogSU5URUdFUjwvUD4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERBVEVfQ1JFQVRFRCA9ICJjcmVhdGVkIjsKKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIHRpbWUgdGhhdCB0aGlzIHJvdyB3YXMgbGFzdCBtb2RpZmllZCBieSBhIGNsaWVudCAobXNlY3Mgc2luY2UgdGhlIGVwb2NoKS4KKyAgICAgICAgICogPFA+VHlwZTogSU5URUdFUjwvUD4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERBVEVfTU9ESUZJRUQgPSAibW9kaWZpZWQiOworCisgICAgfQorCisgICAgaW50ZXJmYWNlIEJvb2ttYXJrQ29sdW1ucyB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgdW5pcXVlIElEIGZvciBhIHJvdy4KKyAgICAgICAgICogPFA+VHlwZTogSU5URUdFUiAobG9uZyk8L1A+CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBfSUQgPSAiX2lkIjsKKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIFVSTCBvZiB0aGUgYm9va21hcmsuCisgICAgICAgICAqIDxQPlR5cGU6IFRFWFQgKFVSTCk8L1A+CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVUkwgPSAidXJsIjsKKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIHVzZXIgdmlzaWJsZSB0aXRsZSBvZiB0aGUgYm9va21hcmsuCisgICAgICAgICAqIDxQPlR5cGU6IFRFWFQ8L1A+CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUSVRMRSA9ICJ0aXRsZSI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBmYXZpY29uIG9mIHRoZSBib29rbWFyaywgbWF5IGJlIE5VTEwuCisgICAgICAgICAqIE11c3QgZGVjb2RlIHZpYSB7QGxpbmsgQml0bWFwRmFjdG9yeSNkZWNvZGVCeXRlQXJyYXl9LgorICAgICAgICAgKiA8cD5UeXBlOiBCTE9CIChpbWFnZSk8L3A+CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGQVZJQ09OID0gImZhdmljb24iOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBBIHRodW1ibmFpbCBvZiB0aGUgcGFnZSxtYXkgYmUgTlVMTC4KKyAgICAgICAgICogTXVzdCBkZWNvZGUgdmlhIHtAbGluayBCaXRtYXBGYWN0b3J5I2RlY29kZUJ5dGVBcnJheX0uCisgICAgICAgICAqIDxwPlR5cGU6IEJMT0IgKGltYWdlKTwvcD4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRIVU1CTkFJTCA9ICJ0aHVtYm5haWwiOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgdG91Y2ggaWNvbiBmb3IgdGhlIHdlYiBwYWdlLCBtYXkgYmUgTlVMTC4KKyAgICAgICAgICogTXVzdCBkZWNvZGUgdmlhIHtAbGluayBCaXRtYXBGYWN0b3J5I2RlY29kZUJ5dGVBcnJheX0uCisgICAgICAgICAqIDxwPlR5cGU6IEJMT0IgKGltYWdlKTwvcD4KKyAgICAgICAgICogQGhpZGUKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRPVUNIX0lDT04gPSAidG91Y2hfaWNvbiI7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIGJvb2ttYXJrcyB0YWJsZSwgd2hpY2ggaG9sZHMgdGhlIHVzZXIncyBicm93c2VyIGJvb2ttYXJrcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIEJvb2ttYXJrcyBpbXBsZW1lbnRzIEJvb2ttYXJrQ29sdW1ucywgU3luY0NvbHVtbnMgeworICAgICAgICAvKioKKyAgICAgICAgICogVGhpcyB1dGlsaXR5IGNsYXNzIGNhbm5vdCBiZSBpbnN0YW50aWF0ZWQuCisgICAgICAgICAqLworICAgICAgICBwcml2YXRlIEJvb2ttYXJrcygpIHt9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBjb250ZW50Oi8vIHN0eWxlIFVSSSBmb3IgdGhpcyB0YWJsZQorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBVcmkgQ09OVEVOVF9VUkkgPSBVcmkud2l0aEFwcGVuZGVkUGF0aChBVVRIT1JJVFlfVVJJLCAiYm9va21hcmtzIik7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBjb250ZW50Oi8vIHN0eWxlIFVSSSBmb3IgdGhlIGRlZmF1bHQgZm9sZGVyCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFVyaSBDT05URU5UX1VSSV9ERUZBVUxUX0ZPTERFUiA9CisgICAgICAgICAgICAgICAgVXJpLndpdGhBcHBlbmRlZFBhdGgoQ09OVEVOVF9VUkksICJmb2xkZXIiKTsKKworICAgICAgICAvKioKKyAgICAgICAgICogQnVpbGRzIGEgVVJJIHRoYXQgcG9pbnRzIHRvIGEgc3BlY2lmaWMgZm9sZGVyLgorICAgICAgICAgKiBAcGFyYW0gZm9sZGVySWQgdGhlIElEIG9mIHRoZSBmb2xkZXIgdG8gcG9pbnQgdG8KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgVXJpIGJ1aWxkRm9sZGVyVXJpKGxvbmcgZm9sZGVySWQpIHsKKyAgICAgICAgICAgIHJldHVybiBDb250ZW50VXJpcy53aXRoQXBwZW5kZWRJZChDT05URU5UX1VSSV9ERUZBVUxUX0ZPTERFUiwgZm9sZGVySWQpOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBNSU1FIHR5cGUgb2Yge0BsaW5rICNDT05URU5UX1VSSX0gcHJvdmlkaW5nIGEgZGlyZWN0b3J5IG9mIGJvb2ttYXJrcy4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTlRFTlRfVFlQRSA9ICJ2bmQuYW5kcm9pZC5jdXJzb3IuZGlyL2Jvb2ttYXJrIjsKKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIE1JTUUgdHlwZSBvZiBhIHtAbGluayAjQ09OVEVOVF9VUkl9IG9mIGEgc2luZ2xlIGJvb2ttYXJrLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09OVEVOVF9JVEVNX1RZUEUgPSAidm5kLmFuZHJvaWQuY3Vyc29yLml0ZW0vYm9va21hcmsiOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBRdWVyeSBwYXJhbWV0ZXIgdG8gdXNlIGlmIHlvdSB3YW50IHRvIHNlZSBkZWxldGVkIGJvb2ttYXJrcyB0aGF0IGFyZSBzdGlsbAorICAgICAgICAgKiBhcm91bmQgb24gdGhlIGRldmljZSBhbmQgaGF2ZW4ndCBiZWVuIHN5bmNlZCB5ZXQuCisgICAgICAgICAqIEBzZWUgI0lTX0RFTEVURUQKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFFVRVJZX1BBUkFNRVRFUl9TSE9XX0RFTEVURUQgPSAic2hvd19kZWxldGVkIjsKKworICAgICAgICAvKioKKyAgICAgICAgICogRmxhZyBpbmRpY2F0aW5nIGlmIGFuIGl0ZW0gaXMgYSBmb2xkZXIgb3IgYm9va21hcmsuIE5vbi16ZXJvIHZhbHVlcyBpbmRpY2F0ZQorICAgICAgICAgKiBhIGZvbGRlciBhbmQgemVybyBpbmRpY2F0ZXMgYSBib29rbWFyay4KKyAgICAgICAgICogPFA+VHlwZTogSU5URUdFUiAoYm9vbGVhbik8L1A+CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJU19GT0xERVIgPSAiZm9sZGVyIjsKKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIElEIG9mIHRoZSBwYXJlbnQgZm9sZGVyLiBJRCAwIGlzIHRoZSByb290IGZvbGRlci4KKyAgICAgICAgICogPFA+VHlwZTogSU5URUdFUiAocmVmZXJlbmNlIHRvIGl0ZW0gaW4gdGhlIHNhbWUgdGFibGUpPC9QPgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSRU5UID0gInBhcmVudCI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBwb3NpdGlvbiBvZiB0aGUgYm9va21hcmsgaW4gcmVsYXRpb24gdG8gaXQncyBzaWJsaW5ncyB0aGF0IHNoYXJlIHRoZSBzYW1lCisgICAgICAgICAqIHtAbGluayAjUEFSRU5UfS4gTWF5IGJlIG5lZ2F0aXZlLgorICAgICAgICAgKiA8UD5UeXBlOiBJTlRFR0VSPC9QPgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUE9TSVRJT04gPSAicG9zaXRpb24iOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgaXRlbSB0aGF0IHRoZSBib29rbWFyayBzaG91bGQgYmUgaW5zZXJ0ZWQgYWZ0ZXIuCisgICAgICAgICAqIE1heSBiZSBuZWdhdGl2ZS4KKyAgICAgICAgICogPFA+VHlwZTogSU5URUdFUjwvUD4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElOU0VSVF9BRlRFUiA9ICJpbnNlcnRfYWZ0ZXIiOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBBIGZsYWcgdG8gaW5kaWNhdGUgaWYgYW4gaXRlbSBoYXMgYmVlbiBkZWxldGVkLiBRdWVyaWVzIHdpbGwgbm90IHJldHVybiBkZWxldGVkCisgICAgICAgICAqIGVudHJpZXMgdW5sZXNzIHlvdSBhZGQgdGhlIHtAbGluayAjUVVFUllfUEFSQU1FVEVSX1NIT1dfREVMRVRFRH0gcXVlcnkgcGFyYW10ZXIKKyAgICAgICAgICogdG8gdGhlIFVSSSB3aGVuIHBlcmZvcm1pbmcgeW91ciBxdWVyeS4KKyAgICAgICAgICogPHA+VHlwZTogSU5URUdFUiAobm9uLXplcm8gaWYgdGhlIGl0ZW0gaGFzIGJlZW4gZGVsZXRlZCwgemVybyBpZiBpdCBoYXNuJ3QpCisgICAgICAgICAqIEBzZWUgI1FVRVJZX1BBUkFNRVRFUl9TSE9XX0RFTEVURUQKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElTX0RFTEVURUQgPSAiZGVsZXRlZCI7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIGhpc3RvcnkgdGFibGUsIHdoaWNoIGhvbGRzIHRoZSBicm93c2luZyBoaXN0b3J5LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgSGlzdG9yeSBpbXBsZW1lbnRzIEJvb2ttYXJrQ29sdW1ucyB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGlzIHV0aWxpdHkgY2xhc3MgY2Fubm90IGJlIGluc3RhbnRpYXRlZC4KKyAgICAgICAgICovCisgICAgICAgIHByaXZhdGUgSGlzdG9yeSgpIHt9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBjb250ZW50Oi8vIHN0eWxlIFVSSSBmb3IgdGhpcyB0YWJsZQorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBVcmkgQ09OVEVOVF9VUkkgPSBVcmkud2l0aEFwcGVuZGVkUGF0aChBVVRIT1JJVFlfVVJJLCAiaGlzdG9yeSIpOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgTUlNRSB0eXBlIG9mIHtAbGluayAjQ09OVEVOVF9VUkl9IHByb3ZpZGluZyBhIGRpcmVjdG9yeSBvZiBicm93c2VyIGhpc3RvcnkgaXRlbXMuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT05URU5UX1RZUEUgPSAidm5kLmFuZHJvaWQuY3Vyc29yLmRpci9icm93c2VyLWhpc3RvcnkiOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgTUlNRSB0eXBlIG9mIGEge0BsaW5rICNDT05URU5UX1VSSX0gb2YgYSBzaW5nbGUgYnJvd3NlciBoaXN0b3J5IGl0ZW0uCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT05URU5UX0lURU1fVFlQRSA9ICJ2bmQuYW5kcm9pZC5jdXJzb3IuaXRlbS9icm93c2VyLWhpc3RvcnkiOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgZGF0ZSB0aGUgaXRlbSB3YXMgbGFzdCB2aXNpdGVkLCBpbiBtaWxsaXNlY29uZHMgc2luY2UgdGhlIGVwb2NoLgorICAgICAgICAgKiA8cD5UeXBlOiBJTlRFR0VSIChkYXRlIGluIG1pbGxpc2Vjb25kcyBzaW5jZSBKYW51YXJ5IDEsIDE5NzApPC9wPgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREFURV9MQVNUX1ZJU0lURUQgPSAiZGF0ZSI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBkYXRlIHRoZSBpdGVtIGNyZWF0ZWQsIGluIG1pbGxpc2Vjb25kcyBzaW5jZSB0aGUgZXBvY2guCisgICAgICAgICAqIDxwPlR5cGU6IE5VTUJFUiAoZGF0ZSBpbiBtaWxsaXNlY29uZHMgc2luY2UgSmFudWFyeSAxLCAxOTcwKTwvcD4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERBVEVfQ1JFQVRFRCA9ICJjcmVhdGVkIjsKKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIG51bWJlciBvZiB0aW1lcyB0aGUgaXRlbSBoYXMgYmVlbiB2aXNpdGVkLgorICAgICAgICAgKiA8cD5UeXBlOiBJTlRFR0VSPC9wPgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVklTSVRTID0gInZpc2l0cyI7CisKKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVNFUl9FTlRFUkVEID0gInVzZXJfZW50ZXJlZCI7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIHNlYXJjaCBoaXN0b3J5IHRhYmxlLgorICAgICAqIEBoaWRlCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBTZWFyY2hlcyB7CisgICAgICAgIHByaXZhdGUgU2VhcmNoZXMoKSB7fQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgY29udGVudDovLyBzdHlsZSBVUkkgZm9yIHRoaXMgdGFibGUKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgVXJpIENPTlRFTlRfVVJJID0gVXJpLndpdGhBcHBlbmRlZFBhdGgoQVVUSE9SSVRZX1VSSSwgInNlYXJjaGVzIik7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBNSU1FIHR5cGUgb2Yge0BsaW5rICNDT05URU5UX1VSSX0gcHJvdmlkaW5nIGEgZGlyZWN0b3J5IG9mIGJyb3dzZXIgc2VhcmNoIGl0ZW1zLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09OVEVOVF9UWVBFID0gInZuZC5hbmRyb2lkLmN1cnNvci5kaXIvc2VhcmNoZXMiOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgTUlNRSB0eXBlIG9mIGEge0BsaW5rICNDT05URU5UX1VSSX0gb2YgYSBzaW5nbGUgYnJvd3NlciBzZWFyY2ggaXRlbS4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTlRFTlRfSVRFTV9UWVBFID0gInZuZC5hbmRyb2lkLmN1cnNvci5pdGVtL3NlYXJjaGVzIjsKKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIHVuaXF1ZSBJRCBmb3IgYSByb3cuCisgICAgICAgICAqIDxQPlR5cGU6IElOVEVHRVIgKGxvbmcpPC9QPgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgX0lEID0gIl9pZCI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSB1c2VyIGVudGVyZWQgc2VhcmNoIHRlcm0uCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTRUFSQ0ggPSAic2VhcmNoIjsKKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIGRhdGUgdGhlIHNlYXJjaCB3YXMgcGVyZm9ybWVkLCBpbiBtaWxsaXNlY29uZHMgc2luY2UgdGhlIGVwb2NoLgorICAgICAgICAgKiA8cD5UeXBlOiBOVU1CRVIgKGRhdGUgaW4gbWlsbGlzZWNvbmRzIHNpbmNlIEphbnVhcnkgMSwgMTk3MCk8L3A+CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBEQVRFID0gImRhdGUiOworICAgIH0KKworICAgIC8qKgorICAgICAqIEEgdGFibGUgcHJvdmlkZWQgZm9yIHN5bmMgYWRhcHRlcnMgdG8gdXNlIGZvciBzdG9yaW5nIHByaXZhdGUgc3luYyBzdGF0ZSBkYXRhLgorICAgICAqCisgICAgICogQHNlZSBTeW5jU3RhdGVDb250cmFjdAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgU3luY1N0YXRlIGltcGxlbWVudHMgU3luY1N0YXRlQ29udHJhY3QuQ29sdW1ucyB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGlzIHV0aWxpdHkgY2xhc3MgY2Fubm90IGJlIGluc3RhbnRpYXRlZAorICAgICAgICAgKi8KKyAgICAgICAgcHJpdmF0ZSBTeW5jU3RhdGUoKSB7fQorCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTlRFTlRfRElSRUNUT1JZID0KKyAgICAgICAgICAgICAgICBTeW5jU3RhdGVDb250cmFjdC5Db25zdGFudHMuQ09OVEVOVF9ESVJFQ1RPUlk7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBjb250ZW50Oi8vIHN0eWxlIFVSSSBmb3IgdGhpcyB0YWJsZQorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBVcmkgQ09OVEVOVF9VUkkgPQorICAgICAgICAgICAgICAgIFVyaS53aXRoQXBwZW5kZWRQYXRoKEFVVEhPUklUWV9VUkksIENPTlRFTlRfRElSRUNUT1JZKTsKKworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBhbmRyb2lkLnByb3ZpZGVyLlN5bmNTdGF0ZUNvbnRyYWN0LkhlbHBlcnMjZ2V0CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGJ5dGVbXSBnZXQoQ29udGVudFByb3ZpZGVyQ2xpZW50IHByb3ZpZGVyLCBBY2NvdW50IGFjY291bnQpCisgICAgICAgICAgICAgICAgdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbiB7CisgICAgICAgICAgICByZXR1cm4gU3luY1N0YXRlQ29udHJhY3QuSGVscGVycy5nZXQocHJvdmlkZXIsIENPTlRFTlRfVVJJLCBhY2NvdW50KTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIGFuZHJvaWQucHJvdmlkZXIuU3luY1N0YXRlQ29udHJhY3QuSGVscGVycyNnZXQKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgUGFpcjxVcmksIGJ5dGVbXT4gZ2V0V2l0aFVyaShDb250ZW50UHJvdmlkZXJDbGllbnQgcHJvdmlkZXIsIEFjY291bnQgYWNjb3VudCkKKyAgICAgICAgICAgICAgICB0aHJvd3MgUmVtb3RlRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIHJldHVybiBTeW5jU3RhdGVDb250cmFjdC5IZWxwZXJzLmdldFdpdGhVcmkocHJvdmlkZXIsIENPTlRFTlRfVVJJLCBhY2NvdW50KTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIGFuZHJvaWQucHJvdmlkZXIuU3luY1N0YXRlQ29udHJhY3QuSGVscGVycyNzZXQKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXQoQ29udGVudFByb3ZpZGVyQ2xpZW50IHByb3ZpZGVyLCBBY2NvdW50IGFjY291bnQsIGJ5dGVbXSBkYXRhKQorICAgICAgICAgICAgICAgIHRocm93cyBSZW1vdGVFeGNlcHRpb24geworICAgICAgICAgICAgU3luY1N0YXRlQ29udHJhY3QuSGVscGVycy5zZXQocHJvdmlkZXIsIENPTlRFTlRfVVJJLCBhY2NvdW50LCBkYXRhKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIGFuZHJvaWQucHJvdmlkZXIuU3luY1N0YXRlQ29udHJhY3QuSGVscGVycyNuZXdTZXRPcGVyYXRpb24KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgQ29udGVudFByb3ZpZGVyT3BlcmF0aW9uIG5ld1NldE9wZXJhdGlvbihBY2NvdW50IGFjY291bnQsIGJ5dGVbXSBkYXRhKSB7CisgICAgICAgICAgICByZXR1cm4gU3luY1N0YXRlQ29udHJhY3QuSGVscGVycy5uZXdTZXRPcGVyYXRpb24oQ09OVEVOVF9VUkksIGFjY291bnQsIGRhdGEpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvcHJvdmlkZXIvQ2FsZW5kYXIuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3Byb3ZpZGVyL0NhbGVuZGFyLmphdmEKaW5kZXggNjM1NWE5Yy4uODhjZTBmMCAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvcHJvdmlkZXIvQ2FsZW5kYXIuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9wcm92aWRlci9DYWxlbmRhci5qYXZhCkBAIC03NiwxMSArNzYsMTA2IEBACiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0FMTEVSX0lTX1NZTkNBREFQVEVSID0gImNhbGxlcl9pc19zeW5jYWRhcHRlciI7CiAKKworICAgIC8qKgorICAgICAqIEdlbmVyaWMgY29sdW1ucyBmb3IgdXNlIGJ5IHN5bmMgYWRhcHRlcnMuIFRoZSBzcGVjaWZpYyBmdW5jdGlvbnMgb2YKKyAgICAgKiB0aGVzZSBjb2x1bW5zIGFyZSBwcml2YXRlIHRvIHRoZSBzeW5jIGFkYXB0ZXIuIE90aGVyIGNsaWVudHMgb2YgdGhlIEFQSQorICAgICAqIHNob3VsZCBub3QgYXR0ZW1wdCB0byBlaXRoZXIgcmVhZCBvciB3cml0ZSB0aGlzIGNvbHVtbi4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgaW50ZXJmYWNlIEJhc2VTeW5jQ29sdW1ucyB7CisKKyAgICAgICAgLyoqIEdlbmVyaWMgY29sdW1uIGZvciB1c2UgYnkgc3luYyBhZGFwdGVycy4gKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1lOQzEgPSAic3luYzEiOworICAgICAgICAvKiogR2VuZXJpYyBjb2x1bW4gZm9yIHVzZSBieSBzeW5jIGFkYXB0ZXJzLiAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTWU5DMiA9ICJzeW5jMiI7CisgICAgICAgIC8qKiBHZW5lcmljIGNvbHVtbiBmb3IgdXNlIGJ5IHN5bmMgYWRhcHRlcnMuICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNZTkMzID0gInN5bmMzIjsKKyAgICAgICAgLyoqIEdlbmVyaWMgY29sdW1uIGZvciB1c2UgYnkgc3luYyBhZGFwdGVycy4gKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1lOQzQgPSAic3luYzQiOworICAgICAgICAvKiogR2VuZXJpYyBjb2x1bW4gZm9yIHVzZSBieSBzeW5jIGFkYXB0ZXJzLiAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTWU5DNSA9ICJzeW5jNSI7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29sdW1ucyBmb3IgU3luYyBpbmZvcm1hdGlvbiB1c2VkIGJ5IENhbGVuZGFycyBhbmQgRXZlbnRzIHRhYmxlcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50ZXJmYWNlIFN5bmNDb2x1bW5zIGV4dGVuZHMgQmFzZVN5bmNDb2x1bW5zIHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBhY2NvdW50IHRoYXQgd2FzIHVzZWQgdG8gc3luYyB0aGUgZW50cnkgdG8gdGhlIGRldmljZS4KKyAgICAgICAgICogPFA+VHlwZTogVEVYVDwvUD4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIF9TWU5DX0FDQ09VTlQgPSAiX3N5bmNfYWNjb3VudCI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSB0eXBlIG9mIHRoZSBhY2NvdW50IHRoYXQgd2FzIHVzZWQgdG8gc3luYyB0aGUgZW50cnkgdG8gdGhlIGRldmljZS4KKyAgICAgICAgICogPFA+VHlwZTogVEVYVDwvUD4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIF9TWU5DX0FDQ09VTlRfVFlQRSA9ICJfc3luY19hY2NvdW50X3R5cGUiOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgdW5pcXVlIElEIGZvciBhIHJvdyBhc3NpZ25lZCBieSB0aGUgc3luYyBzb3VyY2UuIE5VTEwgaWYgdGhlIHJvdyBoYXMgbmV2ZXIgYmVlbiBzeW5jZWQuCisgICAgICAgICAqIDxQPlR5cGU6IFRFWFQ8L1A+CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBfU1lOQ19JRCA9ICJfc3luY19pZCI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBsYXN0IHRpbWUsIGZyb20gdGhlIHN5bmMgc291cmNlJ3MgcG9pbnQgb2YgdmlldywgdGhhdCB0aGlzIHJvdyBoYXMgYmVlbiBzeW5jaHJvbml6ZWQuCisgICAgICAgICAqIDxQPlR5cGU6IElOVEVHRVIgKGxvbmcpPC9QPgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgX1NZTkNfVElNRSA9ICJfc3luY190aW1lIjsKKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIHZlcnNpb24gb2YgdGhlIHJvdywgYXMgYXNzaWduZWQgYnkgdGhlIHNlcnZlci4KKyAgICAgICAgICogPFA+VHlwZTogVEVYVDwvUD4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIF9TWU5DX1ZFUlNJT04gPSAiX3N5bmNfdmVyc2lvbiI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEZvciB1c2UgYnkgc3luYyBhZGFwdGVyIGF0IGl0cyBkaXNjcmV0aW9uOyBub3QgbW9kaWZpZWQgYnkgQ2FsZW5kYXJQcm92aWRlcgorICAgICAgICAgKiBOb3RlIHRoYXQgdGhpcyBjb2x1bW4gd2FzIGZvcm1lcmx5IG5hbWVkIF9TWU5DX0xPQ0FMX0lELiAgV2UgYXJlIHVzaW5nIGl0IHRvIGF2b2lkIGEKKyAgICAgICAgICogc2NoZW1hIGNoYW5nZS4KKyAgICAgICAgICogVE9ETyBSZXBsYWNlIHRoaXMgd2l0aCBzb21ldGhpbmcgbW9yZSBnZW5lcmFsIGluIHRoZSBmdXR1cmUuCisgICAgICAgICAqIDxQPlR5cGU6IElOVEVHRVIgKGxvbmcpPC9QPgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgX1NZTkNfREFUQSA9ICJfc3luY19sb2NhbF9pZCI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFVzZWQgb25seSBpbiBwZXJzaXN0ZW50IHByb3ZpZGVycywgYW5kIG9ubHkgZHVyaW5nIG1lcmdpbmcuCisgICAgICAgICAqIDxQPlR5cGU6IElOVEVHRVIgKGxvbmcpPC9QPgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgX1NZTkNfTUFSSyA9ICJfc3luY19tYXJrIjsKKworICAgICAgICAvKioKKyAgICAgICAgICogVXNlZCB0byBpbmRpY2F0ZSB0aGF0IGxvY2FsLCB1bnN5bmNlZCwgY2hhbmdlcyBhcmUgcHJlc2VudC4KKyAgICAgICAgICogPFA+VHlwZTogSU5URUdFUiAobG9uZyk8L1A+CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBfU1lOQ19ESVJUWSA9ICJfc3luY19kaXJ0eSI7CisKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb2x1bW5zIGZyb20gdGhlIEFjY291bnQgaW5mb3JtYXRpb24gdXNlZCBieSBDYWxlbmRhcnMgYW5kIEV2ZW50cyB0YWJsZXMuCisgICAgICovCisgICAgcHVibGljIGludGVyZmFjZSBBY2NvdW50Q29sdW1ucyB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgbmFtZSBvZiB0aGUgYWNjb3VudCBpbnN0YW5jZSB0byB3aGljaCB0aGlzIHJvdyBiZWxvbmdzLCB3aGljaCB3aGVuIHBhaXJlZCB3aXRoCisgICAgICAgICAqIHtAbGluayAjQUNDT1VOVF9UWVBFfSBpZGVudGlmaWVzIGEgc3BlY2lmaWMgYWNjb3VudC4KKyAgICAgICAgICogPFA+VHlwZTogVEVYVDwvUD4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFDQ09VTlRfTkFNRSA9ICJhY2NvdW50X25hbWUiOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgdHlwZSBvZiBhY2NvdW50IHRvIHdoaWNoIHRoaXMgcm93IGJlbG9uZ3MsIHdoaWNoIHdoZW4gcGFpcmVkIHdpdGgKKyAgICAgICAgICoge0BsaW5rICNBQ0NPVU5UX05BTUV9IGlkZW50aWZpZXMgYSBzcGVjaWZpYyBhY2NvdW50LgorICAgICAgICAgKiA8UD5UeXBlOiBURVhUPC9QPgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUNDT1VOVF9UWVBFID0gImFjY291bnRfdHlwZSI7CisgICAgfQorCiAgICAgLyoqCiAgICAgICogQ29sdW1ucyBmcm9tIHRoZSBDYWxlbmRhcnMgdGFibGUgdGhhdCBvdGhlciB0YWJsZXMgam9pbiBpbnRvIHRoZW1zZWx2ZXMuCiAgICAgICovCi0gICAgcHVibGljIGludGVyZmFjZSBDYWxlbmRhcnNDb2x1bW5zCi0gICAgeworICAgIHB1YmxpYyBpbnRlcmZhY2UgQ2FsZW5kYXJzQ29sdW1ucyB7CiAgICAgICAgIC8qKgogICAgICAgICAgKiBUaGUgY29sb3Igb2YgdGhlIGNhbGVuZGFyCiAgICAgICAgICAqIDxQPlR5cGU6IElOVEVHRVIgKGNvbG9yIHZhbHVlKTwvUD4KQEAgLTEzNSw3NSArMjMwLDEwMyBAQAogICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTWU5DX1NUQVRFID0gInN5bmNfc3RhdGUiOwogCiAgICAgICAgIC8qKgotICAgICAgICAgKiBUaGUgYWNjb3VudCB0aGF0IHdhcyB1c2VkIHRvIHN5bmMgdGhlIGVudHJ5IHRvIHRoZSBkZXZpY2UuCi0gICAgICAgICAqIDxQPlR5cGU6IFRFWFQ8L1A+CisgICAgICAgICAqIFdoZXRoZXIgdGhlIHJvdyBoYXMgYmVlbiBkZWxldGVkLiAgQSBkZWxldGVkIHJvdyBzaG91bGQgYmUgaWdub3JlZC4KKyAgICAgICAgICogPFA+VHlwZTogSU5URUdFUiAoYm9vbGVhbik8L1A+CiAgICAgICAgICAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBfU1lOQ19BQ0NPVU5UID0gIl9zeW5jX2FjY291bnQiOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBUaGUgdHlwZSBvZiB0aGUgYWNjb3VudCB0aGF0IHdhcyB1c2VkIHRvIHN5bmMgdGhlIGVudHJ5IHRvIHRoZSBkZXZpY2UuCi0gICAgICAgICAqIDxQPlR5cGU6IFRFWFQ8L1A+Ci0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBfU1lOQ19BQ0NPVU5UX1RZUEUgPSAiX3N5bmNfYWNjb3VudF90eXBlIjsKLQotICAgICAgICAvKioKLSAgICAgICAgICogVGhlIHVuaXF1ZSBJRCBmb3IgYSByb3cgYXNzaWduZWQgYnkgdGhlIHN5bmMgc291cmNlLiBOVUxMIGlmIHRoZSByb3cgaGFzIG5ldmVyIGJlZW4gc3luY2VkLgotICAgICAgICAgKiA8UD5UeXBlOiBURVhUPC9QPgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgX1NZTkNfSUQgPSAiX3N5bmNfaWQiOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBUaGUgbGFzdCB0aW1lLCBmcm9tIHRoZSBzeW5jIHNvdXJjZSdzIHBvaW50IG9mIHZpZXcsIHRoYXQgdGhpcyByb3cgaGFzIGJlZW4gc3luY2hyb25pemVkLgotICAgICAgICAgKiA8UD5UeXBlOiBJTlRFR0VSIChsb25nKTwvUD4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIF9TWU5DX1RJTUUgPSAiX3N5bmNfdGltZSI7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFRoZSB2ZXJzaW9uIG9mIHRoZSByb3csIGFzIGFzc2lnbmVkIGJ5IHRoZSBzZXJ2ZXIuCi0gICAgICAgICAqIDxQPlR5cGU6IFRFWFQ8L1A+Ci0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBfU1lOQ19WRVJTSU9OID0gIl9zeW5jX3ZlcnNpb24iOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBGb3IgdXNlIGJ5IHN5bmMgYWRhcHRlciBhdCBpdHMgZGlzY3JldGlvbjsgbm90IG1vZGlmaWVkIGJ5IENhbGVuZGFyUHJvdmlkZXIKLSAgICAgICAgICogTm90ZSB0aGF0IHRoaXMgY29sdW1uIHdhcyBmb3JtZXJseSBuYW1lZCBfU1lOQ19MT0NBTF9JRC4gIFdlIGFyZSB1c2luZyBpdCB0byBhdm9pZCBhCi0gICAgICAgICAqIHNjaGVtYSBjaGFuZ2UuCi0gICAgICAgICAqIFRPRE8gUmVwbGFjZSB0aGlzIHdpdGggc29tZXRoaW5nIG1vcmUgZ2VuZXJhbCBpbiB0aGUgZnV0dXJlLgotICAgICAgICAgKiA8UD5UeXBlOiBJTlRFR0VSIChsb25nKTwvUD4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIF9TWU5DX0RBVEEgPSAiX3N5bmNfbG9jYWxfaWQiOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBVc2VkIG9ubHkgaW4gcGVyc2lzdGVudCBwcm92aWRlcnMsIGFuZCBvbmx5IGR1cmluZyBtZXJnaW5nLgotICAgICAgICAgKiA8UD5UeXBlOiBJTlRFR0VSIChsb25nKTwvUD4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIF9TWU5DX01BUksgPSAiX3N5bmNfbWFyayI7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFVzZWQgdG8gaW5kaWNhdGUgdGhhdCBsb2NhbCwgdW5zeW5jZWQsIGNoYW5nZXMgYXJlIHByZXNlbnQuCi0gICAgICAgICAqIDxQPlR5cGU6IElOVEVHRVIgKGxvbmcpPC9QPgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgX1NZTkNfRElSVFkgPSAiX3N5bmNfZGlydHkiOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBUaGUgbmFtZSBvZiB0aGUgYWNjb3VudCBpbnN0YW5jZSB0byB3aGljaCB0aGlzIHJvdyBiZWxvbmdzLCB3aGljaCB3aGVuIHBhaXJlZCB3aXRoCi0gICAgICAgICAqIHtAbGluayAjQUNDT1VOVF9UWVBFfSBpZGVudGlmaWVzIGEgc3BlY2lmaWMgYWNjb3VudC4KLSAgICAgICAgICogPFA+VHlwZTogVEVYVDwvUD4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFDQ09VTlRfTkFNRSA9ICJhY2NvdW50X25hbWUiOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBUaGUgdHlwZSBvZiBhY2NvdW50IHRvIHdoaWNoIHRoaXMgcm93IGJlbG9uZ3MsIHdoaWNoIHdoZW4gcGFpcmVkIHdpdGgKLSAgICAgICAgICoge0BsaW5rICNBQ0NPVU5UX05BTUV9IGlkZW50aWZpZXMgYSBzcGVjaWZpYyBhY2NvdW50LgotICAgICAgICAgKiA8UD5UeXBlOiBURVhUPC9QPgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUNDT1VOVF9UWVBFID0gImFjY291bnRfdHlwZSI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFTEVURUQgPSAiZGVsZXRlZCI7CiAgICAgfQogCiAgICAgLyoqCisgICAgICogQ2xhc3MgdGhhdCByZXByZXNlbnRzIGEgQ2FsZW5kYXIgRW50aXR5LiBUaGVyZSBpcyBvbmUgZW50cnkgcGVyIGNhbGVuZGFyLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQ2FsZW5kYXJzRW50aXR5IGltcGxlbWVudHMgQmFzZUNvbHVtbnMsIFN5bmNDb2x1bW5zLCBDYWxlbmRhcnNDb2x1bW5zIHsKKworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFVyaSBDT05URU5UX1VSSSA9IFVyaS5wYXJzZSgiY29udGVudDovLyIgKyBBVVRIT1JJVFkgKworICAgICAgICAgICAgICAgICIvY2FsZW5kYXJfZW50aXRpZXMiKTsKKworICAgICAgICBwdWJsaWMgc3RhdGljIEVudGl0eUl0ZXJhdG9yIG5ld0VudGl0eUl0ZXJhdG9yKEN1cnNvciBjdXJzb3IsIENvbnRlbnRSZXNvbHZlciByZXNvbHZlcikgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBFbnRpdHlJdGVyYXRvckltcGwoY3Vyc29yLCByZXNvbHZlcik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgc3RhdGljIEVudGl0eUl0ZXJhdG9yIG5ld0VudGl0eUl0ZXJhdG9yKEN1cnNvciBjdXJzb3IsCisgICAgICAgICAgICAgICAgQ29udGVudFByb3ZpZGVyQ2xpZW50IHByb3ZpZGVyKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IEVudGl0eUl0ZXJhdG9ySW1wbChjdXJzb3IsIHByb3ZpZGVyKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIEVudGl0eUl0ZXJhdG9ySW1wbCBleHRlbmRzIEN1cnNvckVudGl0eUl0ZXJhdG9yIHsKKyAgICAgICAgICAgIHByaXZhdGUgZmluYWwgQ29udGVudFJlc29sdmVyIG1SZXNvbHZlcjsKKyAgICAgICAgICAgIHByaXZhdGUgZmluYWwgQ29udGVudFByb3ZpZGVyQ2xpZW50IG1Qcm92aWRlcjsKKworICAgICAgICAgICAgcHVibGljIEVudGl0eUl0ZXJhdG9ySW1wbChDdXJzb3IgY3Vyc29yLCBDb250ZW50UmVzb2x2ZXIgcmVzb2x2ZXIpIHsKKyAgICAgICAgICAgICAgICBzdXBlcihjdXJzb3IpOworICAgICAgICAgICAgICAgIG1SZXNvbHZlciA9IHJlc29sdmVyOworICAgICAgICAgICAgICAgIG1Qcm92aWRlciA9IG51bGw7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBFbnRpdHlJdGVyYXRvckltcGwoQ3Vyc29yIGN1cnNvciwgQ29udGVudFByb3ZpZGVyQ2xpZW50IHByb3ZpZGVyKSB7CisgICAgICAgICAgICAgICAgc3VwZXIoY3Vyc29yKTsKKyAgICAgICAgICAgICAgICBtUmVzb2x2ZXIgPSBudWxsOworICAgICAgICAgICAgICAgIG1Qcm92aWRlciA9IHByb3ZpZGVyOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBFbnRpdHkgZ2V0RW50aXR5QW5kSW5jcmVtZW50Q3Vyc29yKEN1cnNvciBjdXJzb3IpIHRocm93cyBSZW1vdGVFeGNlcHRpb24geworICAgICAgICAgICAgICAgIC8vIHdlIGV4cGVjdCB0aGUgY3Vyc29yIGlzIGFscmVhZHkgYXQgdGhlIHJvdyB3ZSBuZWVkIHRvIHJlYWQgZnJvbQorICAgICAgICAgICAgICAgIGZpbmFsIGxvbmcgY2FsZW5kYXJJZCA9IGN1cnNvci5nZXRMb25nKGN1cnNvci5nZXRDb2x1bW5JbmRleE9yVGhyb3coX0lEKSk7CisKKyAgICAgICAgICAgICAgICAvLyBDcmVhdGUgdGhlIGNvbnRlbnQgdmFsdWUKKyAgICAgICAgICAgICAgICBDb250ZW50VmFsdWVzIGN2ID0gbmV3IENvbnRlbnRWYWx1ZXMoKTsKKyAgICAgICAgICAgICAgICBjdi5wdXQoX0lELCBjYWxlbmRhcklkKTsKKworICAgICAgICAgICAgICAgIERhdGFiYXNlVXRpbHMuY3Vyc29yU3RyaW5nVG9Db250ZW50VmFsdWVzSWZQcmVzZW50KGN1cnNvciwgY3YsIF9TWU5DX0FDQ09VTlQpOworICAgICAgICAgICAgICAgIERhdGFiYXNlVXRpbHMuY3Vyc29yU3RyaW5nVG9Db250ZW50VmFsdWVzSWZQcmVzZW50KGN1cnNvciwgY3YsIF9TWU5DX0FDQ09VTlRfVFlQRSk7CisKKyAgICAgICAgICAgICAgICBEYXRhYmFzZVV0aWxzLmN1cnNvclN0cmluZ1RvQ29udGVudFZhbHVlc0lmUHJlc2VudChjdXJzb3IsIGN2LCBfU1lOQ19JRCk7CisgICAgICAgICAgICAgICAgRGF0YWJhc2VVdGlscy5jdXJzb3JTdHJpbmdUb0NvbnRlbnRWYWx1ZXNJZlByZXNlbnQoY3Vyc29yLCBjdiwgX1NZTkNfVkVSU0lPTik7CisgICAgICAgICAgICAgICAgRGF0YWJhc2VVdGlscy5jdXJzb3JTdHJpbmdUb0NvbnRlbnRWYWx1ZXNJZlByZXNlbnQoY3Vyc29yLCBjdiwgX1NZTkNfVElNRSk7CisgICAgICAgICAgICAgICAgRGF0YWJhc2VVdGlscy5jdXJzb3JTdHJpbmdUb0NvbnRlbnRWYWx1ZXNJZlByZXNlbnQoY3Vyc29yLCBjdiwgX1NZTkNfREFUQSk7CisgICAgICAgICAgICAgICAgRGF0YWJhc2VVdGlscy5jdXJzb3JMb25nVG9Db250ZW50VmFsdWVzSWZQcmVzZW50KGN1cnNvciwgY3YsIF9TWU5DX0RJUlRZKTsKKyAgICAgICAgICAgICAgICBEYXRhYmFzZVV0aWxzLmN1cnNvckxvbmdUb0NvbnRlbnRWYWx1ZXNJZlByZXNlbnQoY3Vyc29yLCBjdiwgX1NZTkNfTUFSSyk7CisKKyAgICAgICAgICAgICAgICBEYXRhYmFzZVV0aWxzLmN1cnNvclN0cmluZ1RvQ29udGVudFZhbHVlc0lmUHJlc2VudChjdXJzb3IsIGN2LCBDYWxlbmRhcnMuU1lOQzEpOworICAgICAgICAgICAgICAgIERhdGFiYXNlVXRpbHMuY3Vyc29yU3RyaW5nVG9Db250ZW50VmFsdWVzSWZQcmVzZW50KGN1cnNvciwgY3YsIENhbGVuZGFycy5TWU5DMik7CisgICAgICAgICAgICAgICAgRGF0YWJhc2VVdGlscy5jdXJzb3JTdHJpbmdUb0NvbnRlbnRWYWx1ZXNJZlByZXNlbnQoY3Vyc29yLCBjdiwgQ2FsZW5kYXJzLlNZTkMzKTsKKyAgICAgICAgICAgICAgICBEYXRhYmFzZVV0aWxzLmN1cnNvclN0cmluZ1RvQ29udGVudFZhbHVlc0lmUHJlc2VudChjdXJzb3IsIGN2LCBDYWxlbmRhcnMuU1lOQzQpOworICAgICAgICAgICAgICAgIERhdGFiYXNlVXRpbHMuY3Vyc29yU3RyaW5nVG9Db250ZW50VmFsdWVzSWZQcmVzZW50KGN1cnNvciwgY3YsIENhbGVuZGFycy5TWU5DNSk7CisKKyAgICAgICAgICAgICAgICBEYXRhYmFzZVV0aWxzLmN1cnNvclN0cmluZ1RvQ29udGVudFZhbHVlc0lmUHJlc2VudChjdXJzb3IsIGN2LCBDYWxlbmRhcnMuTkFNRSk7CisgICAgICAgICAgICAgICAgRGF0YWJhc2VVdGlscy5jdXJzb3JTdHJpbmdUb0NvbnRlbnRWYWx1ZXNJZlByZXNlbnQoY3Vyc29yLCBjdiwKKyAgICAgICAgICAgICAgICAgICAgICAgIENhbGVuZGFycy5ESVNQTEFZX05BTUUpOworICAgICAgICAgICAgICAgIERhdGFiYXNlVXRpbHMuY3Vyc29ySW50VG9Db250ZW50VmFsdWVzSWZQcmVzZW50KGN1cnNvciwgY3YsIENhbGVuZGFycy5DT0xPUik7CisgICAgICAgICAgICAgICAgRGF0YWJhc2VVdGlscy5jdXJzb3JJbnRUb0NvbnRlbnRWYWx1ZXNJZlByZXNlbnQoY3Vyc29yLCBjdiwgQUNDRVNTX0xFVkVMKTsKKyAgICAgICAgICAgICAgICBEYXRhYmFzZVV0aWxzLmN1cnNvckludFRvQ29udGVudFZhbHVlc0lmUHJlc2VudChjdXJzb3IsIGN2LCBTRUxFQ1RFRCk7CisgICAgICAgICAgICAgICAgRGF0YWJhc2VVdGlscy5jdXJzb3JJbnRUb0NvbnRlbnRWYWx1ZXNJZlByZXNlbnQoY3Vyc29yLCBjdiwgU1lOQ19FVkVOVFMpOworICAgICAgICAgICAgICAgIERhdGFiYXNlVXRpbHMuY3Vyc29yU3RyaW5nVG9Db250ZW50VmFsdWVzSWZQcmVzZW50KGN1cnNvciwgY3YsIENhbGVuZGFycy5MT0NBVElPTik7CisgICAgICAgICAgICAgICAgRGF0YWJhc2VVdGlscy5jdXJzb3JTdHJpbmdUb0NvbnRlbnRWYWx1ZXNJZlByZXNlbnQoY3Vyc29yLCBjdiwgVElNRVpPTkUpOworICAgICAgICAgICAgICAgIERhdGFiYXNlVXRpbHMuY3Vyc29yU3RyaW5nVG9Db250ZW50VmFsdWVzSWZQcmVzZW50KGN1cnNvciwgY3YsCisgICAgICAgICAgICAgICAgICAgICAgICBDYWxlbmRhcnMuT1dORVJfQUNDT1VOVCk7CisgICAgICAgICAgICAgICAgRGF0YWJhc2VVdGlscy5jdXJzb3JJbnRUb0NvbnRlbnRWYWx1ZXNJZlByZXNlbnQoY3Vyc29yLCBjdiwKKyAgICAgICAgICAgICAgICAgICAgICAgIENhbGVuZGFycy5PUkdBTklaRVJfQ0FOX1JFU1BPTkQpOworCisgICAgICAgICAgICAgICAgRGF0YWJhc2VVdGlscy5jdXJzb3JJbnRUb0NvbnRlbnRWYWx1ZXNJZlByZXNlbnQoY3Vyc29yLCBjdiwgREVMRVRFRCk7CisKKyAgICAgICAgICAgICAgICAvLyBDcmVhdGUgdGhlIEVudGl0eSBmcm9tIHRoZSBDb250ZW50VmFsdWUKKyAgICAgICAgICAgICAgICBFbnRpdHkgZW50aXR5ID0gbmV3IEVudGl0eShjdik7CisKKyAgICAgICAgICAgICAgICAvLyBTZXQgY3Vyc29yIHRvIG5leHQgcm93CisgICAgICAgICAgICAgICAgY3Vyc29yLm1vdmVUb05leHQoKTsKKworICAgICAgICAgICAgICAgIC8vIFJldHVybiB0aGUgY3JlYXRlZCBFbnRpdHkKKyAgICAgICAgICAgICAgICByZXR1cm4gZW50aXR5OworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgIH0KKworICAgIC8qKgogICAgICAqIENvbnRhaW5zIGEgbGlzdCBvZiBhdmFpbGFibGUgY2FsZW5kYXJzLgogICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQ2FsZW5kYXJzIGltcGxlbWVudHMgQmFzZUNvbHVtbnMsIENhbGVuZGFyc0NvbHVtbnMKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIENhbGVuZGFycyBpbXBsZW1lbnRzIEJhc2VDb2x1bW5zLCBTeW5jQ29sdW1ucywgQWNjb3VudENvbHVtbnMsCisgICAgICAgICAgICBDYWxlbmRhcnNDb2x1bW5zCiAgICAgewogICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgV0hFUkVfREVMRVRFX0ZPUl9BQ0NPVU5UID0gQ2FsZW5kYXJzLl9TWU5DX0FDQ09VTlQgKyAiPT8iCiAgICAgICAgICAgICAgICAgKyAiIEFORCAiICsgQ2FsZW5kYXJzLl9TWU5DX0FDQ09VTlRfVFlQRSArICI9PyI7CkBAIC0yNTgsNiArMzgxLDI0IEBACiAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVSTCA9ICJ1cmwiOwogCiAgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgVVJMIGZvciB0aGUgY2FsZW5kYXIgaXRzZWxmCisgICAgICAgICAqIDxQPlR5cGU6IFRFWFQgKFVSTCk8L1A+CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTRUxGX1VSTCA9ICJzZWxmVXJsIjsKKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIFVSTCBmb3IgdGhlIGNhbGVuZGFyIHRvIGJlIGVkaXRlZAorICAgICAgICAgKiA8UD5UeXBlOiBURVhUIChVUkwpPC9QPgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRURJVF9VUkwgPSAiZWRpdFVybCI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBVUkwgZm9yIHRoZSBjYWxlbmRhciBldmVudHMKKyAgICAgICAgICogPFA+VHlwZTogVEVYVCAoVVJMKTwvUD4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVWRU5UU19VUkwgPSAiZXZlbnRzVXJsIjsKKworICAgICAgICAvKioKICAgICAgICAgICogVGhlIG5hbWUgb2YgdGhlIGNhbGVuZGFyCiAgICAgICAgICAqIDxQPlR5cGU6IFRFWFQ8L1A+CiAgICAgICAgICAqLwpAQCAtMjc2LDEyICs0MTcsNiBAQAogICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMT0NBVElPTiA9ICJsb2NhdGlvbiI7CiAKICAgICAgICAgLyoqCi0gICAgICAgICAqIFNob3VsZCB0aGUgY2FsZW5kYXIgYmUgaGlkZGVuIGluIHRoZSBjYWxlbmRhciBzZWxlY3Rpb24gcGFuZWw/Ci0gICAgICAgICAqIDxQPlR5cGU6IElOVEVHRVIgKGJvb2xlYW4pPC9QPgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSElEREVOID0gImhpZGRlbiI7Ci0KLSAgICAgICAgLyoqCiAgICAgICAgICAqIFRoZSBvd25lciBhY2NvdW50IGZvciB0aGlzIGNhbGVuZGFyLCBiYXNlZCBvbiB0aGUgY2FsZW5kYXIgZmVlZC4KICAgICAgICAgICogVGhpcyB3aWxsIGJlIGRpZmZlcmVudCBmcm9tIHRoZSBfU1lOQ19BQ0NPVU5UIGZvciBkZWxlZ2F0ZWQgY2FsZW5kYXJzLgogICAgICAgICAgKiA8UD5UeXBlOiBTdHJpbmc8L1A+CkBAIC0yOTYsNiArNDMxLDkgQEAKICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1JHQU5JWkVSX0NBTl9SRVNQT05EID0gIm9yZ2FuaXplckNhblJlc3BvbmQiOwogICAgIH0KIAorICAgIC8qKgorICAgICAqIENvbHVtbnMgZnJvbSB0aGUgQXR0ZW5kZWVzIHRhYmxlIHRoYXQgb3RoZXIgdGFibGVzIGpvaW4gaW50byB0aGVtc2VsdmVzLgorICAgICAqLwogICAgIHB1YmxpYyBpbnRlcmZhY2UgQXR0ZW5kZWVzQ29sdW1ucyB7CiAKICAgICAgICAgLyoqCkBAIC0zNjEsOCArNDk5LDcgQEAKICAgICAvKioKICAgICAgKiBDb2x1bW5zIGZyb20gdGhlIEV2ZW50cyB0YWJsZSB0aGF0IG90aGVyIHRhYmxlcyBqb2luIGludG8gdGhlbXNlbHZlcy4KICAgICAgKi8KLSAgICBwdWJsaWMgaW50ZXJmYWNlIEV2ZW50c0NvbHVtbnMKLSAgICB7CisgICAgcHVibGljIGludGVyZmFjZSBFdmVudHNDb2x1bW5zIHsKICAgICAgICAgLyoqCiAgICAgICAgICAqIFRoZSBjYWxlbmRhciB0aGUgZXZlbnQgYmVsb25ncyB0bwogICAgICAgICAgKiA8UD5UeXBlOiBJTlRFR0VSIChmb3JlaWduIGtleSB0byB0aGUgQ2FsZW5kYXJzIHRhYmxlKTwvUD4KQEAgLTQzOCw2ICs1NzUsMTggQEAKICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRFRFTkQgPSAiZHRlbmQiOwogCiAgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgdGltZSB0aGUgZXZlbnQgc3RhcnRzIHdpdGggYWxsRGF5IGV2ZW50cyBpbiBhIGxvY2FsIHR6CisgICAgICAgICAqIDxQPlR5cGU6IElOVEVHRVIgKGxvbmc7IG1pbGxpcyBzaW5jZSBlcG9jaCk8L1A+CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBEVFNUQVJUMiA9ICJkdHN0YXJ0MiI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSB0aW1lIHRoZSBldmVudCBlbmRzIHdpdGggYWxsRGF5IGV2ZW50cyBpbiBhIGxvY2FsIHR6CisgICAgICAgICAqIDxQPlR5cGU6IElOVEVHRVIgKGxvbmc7IG1pbGxpcyBzaW5jZSBlcG9jaCk8L1A+CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBEVEVORDIgPSAiZHRlbmQyIjsKKworICAgICAgICAvKioKICAgICAgICAgICogVGhlIGR1cmF0aW9uIG9mIHRoZSBldmVudAogICAgICAgICAgKiA8UD5UeXBlOiBURVhUIChkdXJhdGlvbiBpbiBSRkMyNDQ1IGZvcm1hdCk8L1A+CiAgICAgICAgICAqLwpAQCAtNDUwLDYgKzU5OSwxMiBAQAogICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFVkVOVF9USU1FWk9ORSA9ICJldmVudFRpbWV6b25lIjsKIAogICAgICAgICAvKioKKyAgICAgICAgICogVGhlIHRpbWV6b25lIGZvciB0aGUgZXZlbnQsIGFsbERheSBldmVudHMgd2lsbCBoYXZlIGEgbG9jYWwgdHogaW5zdGVhZCBvZiBVVEMKKyAgICAgICAgICogPFA+VHlwZTogVEVYVAorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVZFTlRfVElNRVpPTkUyID0gImV2ZW50VGltZXpvbmUyIjsKKworICAgICAgICAvKioKICAgICAgICAgICogV2hldGhlciB0aGUgZXZlbnQgbGFzdHMgYWxsIGRheSBvciBub3QKICAgICAgICAgICogPFA+VHlwZTogSU5URUdFUiAoYm9vbGVhbik8L1A+CiAgICAgICAgICAqLwpAQCAtNTk4LDcgKzc1Myw4IEBACiAgICAgLyoqCiAgICAgICogQ29udGFpbnMgb25lIGVudHJ5IHBlciBjYWxlbmRhciBldmVudC4gUmVjdXJyaW5nIGV2ZW50cyBzaG93IHVwIGFzIGEgc2luZ2xlIGVudHJ5LgogICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgRXZlbnRzRW50aXR5IGltcGxlbWVudHMgQmFzZUNvbHVtbnMsIEV2ZW50c0NvbHVtbnMsIENhbGVuZGFyc0NvbHVtbnMgeworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgRXZlbnRzRW50aXR5IGltcGxlbWVudHMgQmFzZUNvbHVtbnMsIFN5bmNDb2x1bW5zLCBBY2NvdW50Q29sdW1ucywKKyAgICAgICAgICAgIEV2ZW50c0NvbHVtbnMgewogICAgICAgICAvKioKICAgICAgICAgICogVGhlIGNvbnRlbnQ6Ly8gc3R5bGUgVVJMIGZvciB0aGlzIHRhYmxlCiAgICAgICAgICAqLwpAQCAtNzAzLDggKzg1OSw4IEBACiAgICAgICAgICAgICAgICAgRGF0YWJhc2VVdGlscy5jdXJzb3JTdHJpbmdUb0NvbnRlbnRWYWx1ZXNJZlByZXNlbnQoY3Vyc29yLCBjdiwgX1NZTkNfREFUQSk7CiAgICAgICAgICAgICAgICAgRGF0YWJhc2VVdGlscy5jdXJzb3JMb25nVG9Db250ZW50VmFsdWVzSWZQcmVzZW50KGN1cnNvciwgY3YsIF9TWU5DX0RJUlRZKTsKICAgICAgICAgICAgICAgICBEYXRhYmFzZVV0aWxzLmN1cnNvclN0cmluZ1RvQ29udGVudFZhbHVlc0lmUHJlc2VudChjdXJzb3IsIGN2LCBfU1lOQ19WRVJTSU9OKTsKLSAgICAgICAgICAgICAgICBEYXRhYmFzZVV0aWxzLmN1cnNvckludFRvQ29udGVudFZhbHVlc0lmUHJlc2VudChjdXJzb3IsIGN2LCBERUxFVEVEKTsKLSAgICAgICAgICAgICAgICBEYXRhYmFzZVV0aWxzLmN1cnNvclN0cmluZ1RvQ29udGVudFZhbHVlc0lmUHJlc2VudChjdXJzb3IsIGN2LCBDYWxlbmRhcnMuVVJMKTsKKyAgICAgICAgICAgICAgICBEYXRhYmFzZVV0aWxzLmN1cnNvckludFRvQ29udGVudFZhbHVlc0lmUHJlc2VudChjdXJzb3IsIGN2LCBFdmVudHNDb2x1bW5zLkRFTEVURUQpOworICAgICAgICAgICAgICAgIERhdGFiYXNlVXRpbHMuY3Vyc29yU3RyaW5nVG9Db250ZW50VmFsdWVzSWZQcmVzZW50KGN1cnNvciwgY3YsIENhbGVuZGFycy5TWU5DMSk7CiAKICAgICAgICAgICAgICAgICBFbnRpdHkgZW50aXR5ID0gbmV3IEVudGl0eShjdik7CiAgICAgICAgICAgICAgICAgQ3Vyc29yIHN1YkN1cnNvcjsKQEAgLTc5NSw3ICs5NTEsOCBAQAogICAgIC8qKgogICAgICAqIENvbnRhaW5zIG9uZSBlbnRyeSBwZXIgY2FsZW5kYXIgZXZlbnQuIFJlY3VycmluZyBldmVudHMgc2hvdyB1cCBhcyBhIHNpbmdsZSBlbnRyeS4KICAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIEV2ZW50cyBpbXBsZW1lbnRzIEJhc2VDb2x1bW5zLCBFdmVudHNDb2x1bW5zLCBDYWxlbmRhcnNDb2x1bW5zIHsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIEV2ZW50cyBpbXBsZW1lbnRzIEJhc2VDb2x1bW5zLCBTeW5jQ29sdW1ucywgQWNjb3VudENvbHVtbnMsCisgICAgICAgICAgICBFdmVudHNDb2x1bW5zIHsKIAogICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBGRVRDSF9FTlRSWV9DT0xVTU5TID0KICAgICAgICAgICAgICAgICBuZXcgU3RyaW5nW10geyBFdmVudHMuX1NZTkNfQUNDT1VOVCwgRXZlbnRzLl9TWU5DX0lEIH07CkBAIC04NjAsNiArMTAxNywxNSBAQAogICAgICAgICB9CiAKICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBDdXJzb3IgcXVlcnkoQ29udGVudFJlc29sdmVyIGNyLCBTdHJpbmdbXSBwcm9qZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb25nIGJlZ2luLCBsb25nIGVuZCwgU3RyaW5nIHNlYXJjaFF1ZXJ5KSB7CisgICAgICAgICAgICBVcmkuQnVpbGRlciBidWlsZGVyID0gQ09OVEVOVF9TRUFSQ0hfVVJJLmJ1aWxkVXBvbigpOworICAgICAgICAgICAgQ29udGVudFVyaXMuYXBwZW5kSWQoYnVpbGRlciwgYmVnaW4pOworICAgICAgICAgICAgQ29udGVudFVyaXMuYXBwZW5kSWQoYnVpbGRlciwgZW5kKTsKKyAgICAgICAgICAgIHJldHVybiBjci5xdWVyeShidWlsZGVyLmJ1aWxkKCksIHByb2plY3Rpb24sIFdIRVJFX0NBTEVOREFSU19TRUxFQ1RFRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgU3RyaW5nW10geyBzZWFyY2hRdWVyeSB9LCBERUZBVUxUX1NPUlRfT1JERVIpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBDdXJzb3IgcXVlcnkoQ29udGVudFJlc29sdmVyIGNyLCBTdHJpbmdbXSBwcm9qZWN0aW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb25nIGJlZ2luLCBsb25nIGVuZCwgU3RyaW5nIHdoZXJlLCBTdHJpbmcgb3JkZXJCeSkgewogICAgICAgICAgICAgVXJpLkJ1aWxkZXIgYnVpbGRlciA9IENPTlRFTlRfVVJJLmJ1aWxkVXBvbigpOwogICAgICAgICAgICAgQ29udGVudFVyaXMuYXBwZW5kSWQoYnVpbGRlciwgYmVnaW4pOwpAQCAtODczLDYgKzEwMzksMjEgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsLCBvcmRlckJ5ID09IG51bGwgPyBERUZBVUxUX1NPUlRfT1JERVIgOiBvcmRlckJ5KTsKICAgICAgICAgfQogCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQ3Vyc29yIHF1ZXJ5KENvbnRlbnRSZXNvbHZlciBjciwgU3RyaW5nW10gcHJvamVjdGlvbiwgbG9uZyBiZWdpbiwKKyAgICAgICAgICAgICAgICBsb25nIGVuZCwgU3RyaW5nIHNlYXJjaFF1ZXJ5LCBTdHJpbmcgd2hlcmUsIFN0cmluZyBvcmRlckJ5KSB7CisgICAgICAgICAgICBVcmkuQnVpbGRlciBidWlsZGVyID0gQ09OVEVOVF9TRUFSQ0hfVVJJLmJ1aWxkVXBvbigpOworICAgICAgICAgICAgQ29udGVudFVyaXMuYXBwZW5kSWQoYnVpbGRlciwgYmVnaW4pOworICAgICAgICAgICAgQ29udGVudFVyaXMuYXBwZW5kSWQoYnVpbGRlciwgZW5kKTsKKyAgICAgICAgICAgIGJ1aWxkZXIgPSBidWlsZGVyLmFwcGVuZFBhdGgoc2VhcmNoUXVlcnkpOworICAgICAgICAgICAgaWYgKFRleHRVdGlscy5pc0VtcHR5KHdoZXJlKSkgeworICAgICAgICAgICAgICAgIHdoZXJlID0gV0hFUkVfQ0FMRU5EQVJTX1NFTEVDVEVEOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICB3aGVyZSA9ICIoIiArIHdoZXJlICsgIikgQU5EICIgKyBXSEVSRV9DQUxFTkRBUlNfU0VMRUNURUQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gY3IucXVlcnkoYnVpbGRlci5idWlsZCgpLCBwcm9qZWN0aW9uLCB3aGVyZSwgbnVsbCwKKyAgICAgICAgICAgICAgICAgICAgb3JkZXJCeSA9PSBudWxsID8gREVGQVVMVF9TT1JUX09SREVSIDogb3JkZXJCeSk7CisgICAgICAgIH0KKwogICAgICAgICAvKioKICAgICAgICAgICogVGhlIGNvbnRlbnQ6Ly8gc3R5bGUgVVJMIGZvciB0aGlzIHRhYmxlCiAgICAgICAgICAqLwpAQCAtODgwLDYgKzEwNjEsMTAgQEAKICAgICAgICAgICAgICAgICAiL2luc3RhbmNlcy93aGVuIik7CiAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgVXJpIENPTlRFTlRfQllfREFZX1VSSSA9CiAgICAgICAgICAgICBVcmkucGFyc2UoImNvbnRlbnQ6Ly8iICsgQVVUSE9SSVRZICsgIi9pbnN0YW5jZXMvd2hlbmJ5ZGF5Iik7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgVXJpIENPTlRFTlRfU0VBUkNIX1VSSSA9IFVyaS5wYXJzZSgiY29udGVudDovLyIgKyBBVVRIT1JJVFkgKworICAgICAgICAgICAgICAgICIvaW5zdGFuY2VzL3NlYXJjaCIpOworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFVyaSBDT05URU5UX1NFQVJDSF9CWV9EQVlfVVJJID0KKyAgICAgICAgICAgIFVyaS5wYXJzZSgiY29udGVudDovLyIgKyBBVVRIT1JJVFkgKyAiL2luc3RhbmNlcy9zZWFyY2hieWRheSIpOwogCiAgICAgICAgIC8qKgogICAgICAgICAgKiBUaGUgZGVmYXVsdCBzb3J0IG9yZGVyIGZvciB0aGlzIHRhYmxlLgpAQCAtODk2LDcgKzEwODEsNiBAQAogICAgICAgICAgKiByZXF1aXJlZCBmb3IgY29ycmVjdG5lc3MsIGl0IGp1c3QgYWRkcyBhIG5pY2UgdG91Y2guCiAgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTT1JUX0NBTEVOREFSX1ZJRVcgPSAiYmVnaW4gQVNDLCBlbmQgREVTQywgdGl0bGUgQVNDIjsKLQogICAgICAgICAvKioKICAgICAgICAgICogVGhlIGJlZ2lubmluZyB0aW1lIG9mIHRoZSBpbnN0YW5jZSwgaW4gVVRDIG1pbGxpc2Vjb25kcwogICAgICAgICAgKiA8UD5UeXBlOiBJTlRFR0VSIChsb25nOyBtaWxsaXMgc2luY2UgZXBvY2gpPC9QPgpAQCAtMTA1NSw3ICsxMjM5LDcgQEAKICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUFYX0VWRU5UREFZUyA9ICJtYXhFdmVudERheXMiOwogICAgIH0KIAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgQ2FsZW5kYXJNZXRhRGF0YSBpbXBsZW1lbnRzIENhbGVuZGFyTWV0YURhdGFDb2x1bW5zIHsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIENhbGVuZGFyTWV0YURhdGEgaW1wbGVtZW50cyBDYWxlbmRhck1ldGFEYXRhQ29sdW1ucywgQmFzZUNvbHVtbnMgewogICAgIH0KIAogICAgIHB1YmxpYyBpbnRlcmZhY2UgRXZlbnREYXlzQ29sdW1ucyB7CkBAIC0xNDUzLDQgKzE2MzcsNDMgQEAKICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBVcmkgQ09OVEVOVF9VUkkgPQogICAgICAgICAgICAgICAgIFVyaS53aXRoQXBwZW5kZWRQYXRoKENhbGVuZGFyLkNPTlRFTlRfVVJJLCBDT05URU5UX0RJUkVDVE9SWSk7CiAgICAgfQorCisgICAgLyoqCisgICAgICogQ29sdW1ucyBmcm9tIHRoZSBFdmVudHNSYXdUaW1lcyB0YWJsZQorICAgICAqLworICAgIHB1YmxpYyBpbnRlcmZhY2UgRXZlbnRzUmF3VGltZXNDb2x1bW5zIHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBjb3JyZXNwb25kaW5nIGV2ZW50IGlkCisgICAgICAgICAqIDxQPlR5cGU6IElOVEVHRVIgKGxvbmcpPC9QPgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVZFTlRfSUQgPSAiZXZlbnRfaWQiOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgUkZDMjQ0NSBjb21wbGlhbnQgdGltZSB0aGUgZXZlbnQgc3RhcnRzCisgICAgICAgICAqIDxQPlR5cGU6IFRFWFQ8L1A+CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBEVFNUQVJUXzI0NDUgPSAiZHRzdGFydDI0NDUiOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgUkZDMjQ0NSBjb21wbGlhbnQgdGltZSB0aGUgZXZlbnQgZW5kcworICAgICAgICAgKiA8UD5UeXBlOiBURVhUPC9QPgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRFRFTkRfMjQ0NSA9ICJkdGVuZDI0NDUiOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgUkZDMjQ0NSBjb21wbGlhbnQgb3JpZ2luYWwgaW5zdGFuY2UgdGltZSBvZiB0aGUgcmVjdXJyaW5nIGV2ZW50IGZvciB3aGljaCB0aGlzCisgICAgICAgICAqIGV2ZW50IGlzIGFuIGV4Y2VwdGlvbi4KKyAgICAgICAgICogPFA+VHlwZTogVEVYVDwvUD4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9SSUdJTkFMX0lOU1RBTkNFX1RJTUVfMjQ0NSA9ICJvcmlnaW5hbEluc3RhbmNlVGltZTI0NDUiOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgUkZDMjQ0NSBjb21wbGlhbnQgbGFzdCBkYXRlIHRoaXMgZXZlbnQgcmVwZWF0cyBvbiwgb3IgTlVMTCBpZiBpdCBuZXZlciBlbmRzCisgICAgICAgICAqIDxQPlR5cGU6IFRFWFQ8L1A+CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMQVNUX0RBVEVfMjQ0NSA9ICJsYXN0RGF0ZTI0NDUiOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgRXZlbnRzUmF3VGltZXMgaW1wbGVtZW50cyBCYXNlQ29sdW1ucywgRXZlbnRzUmF3VGltZXNDb2x1bW5zIHsKKyAgICB9CiB9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9wcm92aWRlci9DYWxsTG9nLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9wcm92aWRlci9DYWxsTG9nLmphdmEKaW5kZXggZDUyNjMyYi4uYmYwNTFmNSAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvcHJvdmlkZXIvQ2FsbExvZy5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3Byb3ZpZGVyL0NhbGxMb2cuamF2YQpAQCAtODgsNiArODgsMTcgQEAKICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTlVNQkVSID0gIm51bWJlciI7CiAKICAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBJU08gMzE2Ni0xIHR3byBsZXR0ZXJzIGNvdW50cnkgY29kZSBvZiB0aGUgY291bnRyeSB3aGVyZSB0aGUKKyAgICAgICAgICogdXNlciByZWNlaXZlZCBvciBtYWRlIHRoZSBjYWxsLgorICAgICAgICAgKiA8UD4KKyAgICAgICAgICogVHlwZTogVEVYVAorICAgICAgICAgKiA8L1A+CisgICAgICAgICAqCisgICAgICAgICAqIEBoaWRlCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT1VOVFJZX0lTTyA9ICJjb3VudHJ5aXNvIjsKKworICAgICAgICAvKioKICAgICAgICAgICogVGhlIGRhdGUgdGhlIGNhbGwgb2NjdXJlZCwgaW4gbWlsbGlzZWNvbmRzIHNpbmNlIHRoZSBlcG9jaAogICAgICAgICAgKiA8UD5UeXBlOiBJTlRFR0VSIChsb25nKTwvUD4KICAgICAgICAgICovCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9wcm92aWRlci9Db250YWN0c0NvbnRyYWN0LmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9wcm92aWRlci9Db250YWN0c0NvbnRyYWN0LmphdmEKaW5kZXggMTNjYmRhOC4uZWNkOWZlOSAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvcHJvdmlkZXIvQ29udGFjdHNDb250cmFjdC5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3Byb3ZpZGVyL0NvbnRhY3RzQ29udHJhY3QuamF2YQpAQCAtMzAsOSArMzAsOSBAQAogaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuUmVzb3VyY2VzOwogaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2UuQ3Vyc29yOwogaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2UuRGF0YWJhc2VVdGlsczsKLWltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZS5TUUxpdGVFeGNlcHRpb247CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5SZWN0OwogaW1wb3J0IGFuZHJvaWQubmV0LlVyaTsKK2ltcG9ydCBhbmRyb2lkLm5ldC5VcmkuQnVpbGRlcjsKIGltcG9ydCBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbjsKIGltcG9ydCBhbmRyb2lkLnRleHQuVGV4dFV0aWxzOwogaW1wb3J0IGFuZHJvaWQudXRpbC5EaXNwbGF5TWV0cmljczsKQEAgLTQxLDYgKzQxLDcgQEAKIAogaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07CiBpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwogCiAvKioKICAqIDxwPgpAQCAtMTMwLDYgKzEzMSwyMCBAQAogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFUVVFU1RJTkdfUEFDS0FHRV9QQVJBTV9LRVkgPSAicmVxdWVzdGluZ19wYWNrYWdlIjsKIAogICAgIC8qKgorICAgICAqIFF1ZXJ5IHBhcmFtZXRlciB0aGF0IHNob3VsZCBiZSB1c2VkIGJ5IHRoZSBjbGllbnQgdG8gYWNjZXNzIGEgc3BlY2lmaWMKKyAgICAgKiB7QGxpbmsgRGlyZWN0b3J5fS4gVGhlIHBhcmFtZXRlciB2YWx1ZSBzaG91bGQgYmUgdGhlIF9JRCBvZiB0aGUgY29ycmVzcG9uZGluZworICAgICAqIGRpcmVjdG9yeSwgZS5nLgorICAgICAqIHtAY29kZSBjb250ZW50Oi8vY29tLmFuZHJvaWQuY29udGFjdHMvZGF0YS9lbWFpbHMvZmlsdGVyL2FjbWU/ZGlyZWN0b3J5PTN9CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRElSRUNUT1JZX1BBUkFNX0tFWSA9ICJkaXJlY3RvcnkiOworCisgICAgLyoqCisgICAgICogQSBxdWVyeSBwYXJhbWV0ZXIgdGhhdCBsaW1pdHMgdGhlIG51bWJlciBvZiByZXN1bHRzIHJldHVybmVkLiBUaGUKKyAgICAgKiBwYXJhbWV0ZXIgdmFsdWUgc2hvdWxkIGJlIGFuIGludGVnZXIuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTElNSVRfUEFSQU1fS0VZID0gImxpbWl0IjsKKworICAgIC8qKgogICAgICAqIEBoaWRlCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBQcmVmZXJlbmNlcyB7CkBAIC0xODEsNiArMTk2LDI5NSBAQAogICAgIH0KIAogICAgIC8qKgorICAgICAqIEEgRGlyZWN0b3J5IHJlcHJlc2VudHMgYSBjb250YWN0cyBjb3JwdXMsIGUuZy4gTG9jYWwgY29udGFjdHMsCisgICAgICogR29vZ2xlIEFwcHMgR2xvYmFsIEFkZHJlc3MgTGlzdCBvciBDb3Jwb3JhdGUgR2xvYmFsIEFkZHJlc3MgTGlzdC4KKyAgICAgKiA8cD4KKyAgICAgKiBBIERpcmVjdG9yeSBpcyBpbXBsZW1lbnRlZCBhcyBhIGNvbnRlbnQgcHJvdmlkZXIgd2l0aCBpdHMgdW5pcXVlIGF1dGhvcml0eSBhbmQKKyAgICAgKiB0aGUgc2FtZSBBUEkgYXMgdGhlIG1haW4gQ29udGFjdHMgUHJvdmlkZXIuICBIb3dldmVyLCB0aGVyZSBpcyBubyBleHBlY3RhdGlvbiB0aGF0CisgICAgICogZXZlcnkgZGlyZWN0b3J5IHByb3ZpZGVyIHdpbGwgaW1wbGVtZW50IHRoaXMgQ29udHJhY3QgaW4gaXRzIGVudGlyZXR5LiAgSWYgYQorICAgICAqIGRpcmVjdG9yeSBwcm92aWRlciBkb2VzIG5vdCBoYXZlIGFuIGltcGxlbWVudGF0aW9uIGZvciBhIHNwZWNpZmljIHJlcXVlc3QsIGl0CisgICAgICogc2hvdWxkIHRocm93IGFuIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uLgorICAgICAqIDwvcD4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGUgbW9zdCBpbXBvcnRhbnQgdXNlIGNhc2UgZm9yIERpcmVjdG9yaWVzIGlzIHNlYXJjaC4gIEEgRGlyZWN0b3J5IHByb3ZpZGVyIGlzCisgICAgICogZXhwZWN0ZWQgdG8gc3VwcG9ydCBhdCBsZWFzdCB7QGxpbmsgQ29udGFjdHNDb250cmFjdC5Db250YWN0cyNDT05URU5UX0ZJTFRFUl9VUkkKKyAgICAgKiBDb250YWN0cy5DT05URU5UX0ZJTFRFUl9VUkl9LiAgSWYgYSBEaXJlY3RvcnkgcHJvdmlkZXIgd2FudHMgdG8gcGFydGljaXBhdGUKKyAgICAgKiBpbiBlbWFpbCBhbmQgcGhvbmUgbG9va3VwIGZ1bmN0aW9uYWxpdGllcywgaXQgc2hvdWxkIGFsc28gaW1wbGVtZW50CisgICAgICoge0BsaW5rIENvbW1vbkRhdGFLaW5kcy5FbWFpbCNDT05URU5UX0ZJTFRFUl9VUkkgQ29tbW9uRGF0YUtpbmRzLkVtYWlsLkNPTlRFTlRfRklMVEVSX1VSSX0KKyAgICAgKiBhbmQKKyAgICAgKiB7QGxpbmsgQ29tbW9uRGF0YUtpbmRzLlBob25lI0NPTlRFTlRfRklMVEVSX1VSSSBDb21tb25EYXRhS2luZHMuUGhvbmUuQ09OVEVOVF9GSUxURVJfVVJJfS4KKyAgICAgKiA8L3A+CisgICAgICogPHA+CisgICAgICogQSBkaXJlY3RvcnkgcHJvdmlkZXIgc2hvdWxkIHJldHVybiBOVUxMIGZvciBldmVyeSBwcm9qZWN0aW9uIGZpZWxkIGl0IGRvZXMgbm90CisgICAgICogcmVjb2duaXplLCByYXRoZXIgdGhhbiB0aHJvd2luZyBhbiBleGNlcHRpb24uICBUaGlzIHdheSBpdCB3aWxsIG5vdCBiZSBicm9rZW4KKyAgICAgKiBpZiBDb250YWN0c0NvbnRyYWN0IGlzIGV4dGVuZGVkIHdpdGggbmV3IGZpZWxkcyBpbiB0aGUgZnV0dXJlLgorICAgICAqIDwvcD4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGUgY2xpZW50IGludGVyYWN0cyB3aXRoIGEgZGlyZWN0b3J5IHZpYSBDb250YWN0cyBQcm92aWRlciBieSBzdXBwbHlpbmcgYW4KKyAgICAgKiBvcHRpb25hbCB7QGNvZGUgZGlyZWN0b3J5PX0gcXVlcnkgcGFyYW1ldGVyLgorICAgICAqIDxwPgorICAgICAqIDxwPgorICAgICAqIFdoZW4gdGhlIENvbnRhY3RzIFByb3ZpZGVyIHJlY2VpdmVzIHRoZSByZXF1ZXN0LCBpdCB0cmFuc2Zvcm1zIHRoZSBVUkkgYW5kIGZvcndhcmRzCisgICAgICogdGhlIHJlcXVlc3QgdG8gdGhlIGNvcnJlc3BvbmRpbmcgZGlyZWN0b3J5IGNvbnRlbnQgcHJvdmlkZXIuCisgICAgICogVGhlIFVSSSBpcyB0cmFuc2Zvcm1lZCBpbiB0aGUgZm9sbG93aW5nIGZhc2hpb246CisgICAgICogPHVsPgorICAgICAqIDxsaT5UaGUgVVJJIGF1dGhvcml0eSBpcyByZXBsYWNlZCB3aXRoIHRoZSBjb3JyZXNwb25kaW5nIHtAbGluayAjRElSRUNUT1JZX0FVVEhPUklUWX0uPC9saT4KKyAgICAgKiA8bGk+VGhlIHtAY29kZSBhY2NvdW50TmFtZT19IGFuZCB7QGNvZGUgYWNjb3VudFR5cGU9fSBwYXJhbWV0ZXJzIGFyZSBhZGRlZCBvcgorICAgICAqIHJlcGxhY2VkIHVzaW5nIHRoZSBjb3JyZXNwb25kaW5nIHtAbGluayAjQUNDT1VOVF9UWVBFfSBhbmQge0BsaW5rICNBQ0NPVU5UX05BTUV9IHZhbHVlcy48L2xpPgorICAgICAqIDxsaT5JZiB0aGUgVVJJIGlzIG1pc3NpbmcgYSBDb250YWN0c0NvbnRyYWN0LlJFUVVFU1RJTkdfUEFDS0FHRV9QQVJBTV9LRVkKKyAgICAgKiBwYXJhbWV0ZXIsIHRoaXMgcGFyYW1ldGVyIGlzIGFkZGVkLjwvbGk+CisgICAgICogPC91bD4KKyAgICAgKiA8L3A+CisgICAgICogPHA+CisgICAgICogQ2xpZW50cyBzaG91bGQgc2VuZCBkaXJlY3RvcnkgcmVxdWVzdHMgdG8gQ29udGFjdHMgUHJvdmlkZXIgYW5kIGxldCBpdAorICAgICAqIGZvcndhcmQgdGhlbSB0byB0aGUgcmVzcGVjdGl2ZSBwcm92aWRlcnMgcmF0aGVyIHRoYW4gY29uc3RydWN0aW5nCisgICAgICogZGlyZWN0b3J5IHByb3ZpZGVyIFVSSXMgYnkgdGhlbXNlbHZlcy4gVGhpcyBsZXZlbCBvZiBpbmRpcmVjdGlvbiBhbGxvd3MKKyAgICAgKiBDb250YWN0cyBQcm92aWRlciB0byBpbXBsZW1lbnQgYWRkaXRpb25hbCBzeXN0ZW0tbGV2ZWwgZmVhdHVyZXMgYW5kCisgICAgICogb3B0aW1pemF0aW9ucy4gQWNjZXNzIHRvIENvbnRhY3RzIFByb3ZpZGVyIGlzIHByb3RlY3RlZCBieSB0aGUKKyAgICAgKiBSRUFEX0NPTlRBQ1RTIHBlcm1pc3Npb24sIGJ1dCBhY2Nlc3MgdG8gdGhlIGRpcmVjdG9yeSBwcm92aWRlciBpcyBub3QuCisgICAgICogVGhlcmVmb3JlIGRpcmVjdG9yeSBwcm92aWRlcnMgbXVzdCByZWplY3QgcmVxdWVzdHMgY29taW5nIGZyb20gY2xpZW50cworICAgICAqIG90aGVyIHRoYW4gdGhlIENvbnRhY3RzIFByb3ZpZGVyIGl0c2VsZi4gQW4gZWFzeSB3YXkgdG8gcHJldmVudCBzdWNoCisgICAgICogdW5hdXRob3JpemVkIGFjY2VzcyBpcyB0byBjaGVjayB0aGUgbmFtZSBvZiB0aGUgY2FsbGluZyBwYWNrYWdlOgorICAgICAqIDxwcmU+CisgICAgICogcHJpdmF0ZSBib29sZWFuIGlzQ2FsbGVyQWxsb3dlZCgpIHsKKyAgICAgKiAgIFBhY2thZ2VNYW5hZ2VyIHBtID0gZ2V0Q29udGV4dCgpLmdldFBhY2thZ2VNYW5hZ2VyKCk7CisgICAgICogICBmb3IgKFN0cmluZyBwYWNrYWdlTmFtZTogcG0uZ2V0UGFja2FnZXNGb3JVaWQoQmluZGVyLmdldENhbGxpbmdVaWQoKSkpIHsKKyAgICAgKiAgICAgaWYgKHBhY2thZ2VOYW1lLmVxdWFscygiY29tLmFuZHJvaWQucHJvdmlkZXJzLmNvbnRhY3RzIikpIHsKKyAgICAgKiAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgKiAgICAgfQorICAgICAqICAgfQorICAgICAqICAgcmV0dXJuIGZhbHNlOworICAgICAqIH0KKyAgICAgKiA8L3ByZT4KKyAgICAgKiA8L3A+CisgICAgICogPHA+CisgICAgICogVGhlIERpcmVjdG9yeSB0YWJsZSBpcyByZWFkLW9ubHkgYW5kIGlzIG1haW50YWluZWQgYnkgdGhlIENvbnRhY3RzIFByb3ZpZGVyCisgICAgICogYXV0b21hdGljYWxseS4KKyAgICAgKiA8L3A+CisgICAgICogPHA+SXQgYWx3YXlzIGhhcyBhdCBsZWFzdCB0aGVzZSB0d28gcm93czoKKyAgICAgKiA8dWw+CisgICAgICogPGxpPgorICAgICAqIFRoZSBsb2NhbCBkaXJlY3RvcnkuIEl0IGhhcyB7QGxpbmsgRGlyZWN0b3J5I19JRCBEaXJlY3RvcnkuX0lEfSA9CisgICAgICoge0BsaW5rIERpcmVjdG9yeSNERUZBVUxUIERpcmVjdG9yeS5ERUZBVUxUfS4gVGhpcyBkaXJlY3RvcnkgY2FuIGJlIHVzZWQgdG8gYWNjZXNzIGxvY2FsbHkKKyAgICAgKiBzdG9yZWQgY29udGFjdHMuIFRoZSBzYW1lIGNhbiBiZSBhY2hpZXZlZCBieSBvbWl0dGluZyB0aGUge0Bjb2RlIGRpcmVjdG9yeT19CisgICAgICogcGFyYW1ldGVyIGFsdG9nZXRoZXIuCisgICAgICogPC9saT4KKyAgICAgKiA8bGk+CisgICAgICogVGhlIGxvY2FsIGludmlzaWJsZSBjb250YWN0cy4gVGhlIGNvcnJlc3BvbmRpbmcgZGlyZWN0b3J5IElEIGlzCisgICAgICoge0BsaW5rIERpcmVjdG9yeSNMT0NBTF9JTlZJU0lCTEUgRGlyZWN0b3J5LkxPQ0FMX0lOVklTSUJMRX0uCisgICAgICogPC9saT4KKyAgICAgKiA8L3VsPgorICAgICAqIDwvcD4KKyAgICAgKiA8cD5DdXN0b20gRGlyZWN0b3JpZXMgYXJlIGRpc2NvdmVyZWQgYnkgdGhlIENvbnRhY3RzIFByb3ZpZGVyIGZvbGxvd2luZyB0aGlzIHByb2NlZHVyZToKKyAgICAgKiA8dWw+CisgICAgICogPGxpPkl0IGZpbmRzIGFsbCBpbnN0YWxsZWQgY29udGVudCBwcm92aWRlcnMgd2l0aCBtZXRhIGRhdGEgaWRlbnRpZnlpbmcgdGhlbQorICAgICAqIGFzIGRpcmVjdG9yeSBwcm92aWRlcnMgaW4gQW5kcm9pZE1hbmlmZXN0LnhtbDoKKyAgICAgKiA8Y29kZT4KKyAgICAgKiAmbHQ7bWV0YS1kYXRhIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5jb250ZW50LkNvbnRhY3REaXJlY3RvcnkiCisgICAgICogICAgICAgICAgICAgICBhbmRyb2lkOnZhbHVlPSJ0cnVlIiAvJmd0OworICAgICAqIDwvY29kZT4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGlzIHRhZyBzaG91bGQgYmUgcGxhY2VkIGluc2lkZSB0aGUgY29ycmVzcG9uZGluZyBjb250ZW50IHByb3ZpZGVyIGRlY2xhcmF0aW9uLgorICAgICAqIDwvcD4KKyAgICAgKiA8L2xpPgorICAgICAqIDxsaT4KKyAgICAgKiBUaGVuIENvbnRhY3RzIFByb3ZpZGVyIHNlbmRzIGEge0BsaW5rIERpcmVjdG9yeSNDT05URU5UX1VSSSBEaXJlY3RvcnkuQ09OVEVOVF9VUkl9CisgICAgICogcXVlcnkgdG8gZWFjaCBvZiB0aGUgZGlyZWN0b3J5IGF1dGhvcml0aWVzLiAgQSBkaXJlY3RvcnkgcHJvdmlkZXIgbXVzdCBpbXBsZW1lbnQKKyAgICAgKiB0aGlzIHF1ZXJ5IGFuZCByZXR1cm4gYSBsaXN0IG9mIGRpcmVjdG9yaWVzLiAgRWFjaCBkaXJlY3RvcnkgcmV0dXJuZWQgYnkKKyAgICAgKiB0aGUgcHJvdmlkZXIgbXVzdCBoYXZlIGEgdW5pcXVlIGNvbWJpbmF0aW9uIGZvciB0aGUge0BsaW5rICNBQ0NPVU5UX05BTUV9IGFuZAorICAgICAqIHtAbGluayAjQUNDT1VOVF9UWVBFfSBjb2x1bW5zIChudWxscyBhcmUgYWxsb3dlZCkuICBTaW5jZSBkaXJlY3RvcnkgSURzIGFyZSBhc3NpZ25lZAorICAgICAqIGF1dG9tYXRpY2FsbHksIHRoZSBfSUQgZmllbGQgd2lsbCBub3QgYmUgcGFydCBvZiB0aGUgcXVlcnkgcHJvamVjdGlvbi4KKyAgICAgKiA8L2xpPgorICAgICAqIDxsaT5Db250YWN0cyBQcm92aWRlciBjb21waWxlcyBkaXJlY3RvcnkgbGlzdHMgcmVjZWl2ZWQgZnJvbSBhbGwgZGlyZWN0b3J5CisgICAgICogcHJvdmlkZXJzIGludG8gb25lLCBhc3NpZ25zIGVhY2ggaW5kaXZpZHVhbCBkaXJlY3RvcnkgYSBnbG9iYWxseSB1bmlxdWUgSUQgYW5kCisgICAgICogc3RvcmVzIGFsbCBkaXJlY3RvcnkgcmVjb3JkcyBpbiB0aGUgRGlyZWN0b3J5IHRhYmxlLgorICAgICAqIDwvbGk+CisgICAgICogPC91bD4KKyAgICAgKiA8L3A+CisgICAgICogPHA+Q29udGFjdHMgUHJvdmlkZXIgYXV0b21hdGljYWxseSBpbnRlcnJvZ2F0ZXMgbmV3bHkgaW5zdGFsbGVkIG9yIHJlcGxhY2VkIHBhY2thZ2VzLgorICAgICAqIFRodXMgc2ltcGx5IGluc3RhbGxpbmcgYSBwYWNrYWdlIGNvbnRhaW5pbmcgYSBkaXJlY3RvcnkgcHJvdmlkZXIgaXMgc3VmZmljaWVudAorICAgICAqIHRvIGhhdmUgdGhhdCBwcm92aWRlciByZWdpc3RlcmVkLiAgQSBwYWNrYWdlIHN1cHBseWluZyBhIGRpcmVjdG9yeSBwcm92aWRlciBkb2VzCisgICAgICogbm90IGhhdmUgdG8gY29udGFpbiBsYXVuY2hhYmxlIGFjdGl2aXRpZXMuCisgICAgICogPC9wPgorICAgICAqIDxwPgorICAgICAqIEV2ZXJ5IHJvdyBpbiB0aGUgRGlyZWN0b3J5IHRhYmxlIGlzIGF1dG9tYXRpY2FsbHkgYXNzb2NpYXRlZCB3aXRoIHRoZSBjb3JyZXNwb25kaW5nIHBhY2thZ2UKKyAgICAgKiAoYXBrKS4gIElmIHRoZSBwYWNrYWdlIGlzIGxhdGVyIHVuaW5zdGFsbGVkLCBhbGwgY29ycmVzcG9uZGluZyBkaXJlY3Rvcnkgcm93cworICAgICAqIGFyZSBhdXRvbWF0aWNhbGx5IHJlbW92ZWQgZnJvbSB0aGUgQ29udGFjdHMgUHJvdmlkZXIuCisgICAgICogPC9wPgorICAgICAqIDxwPgorICAgICAqIFdoZW4gdGhlIGxpc3Qgb2YgZGlyZWN0b3JpZXMgaGFuZGxlZCBieSBhIGRpcmVjdG9yeSBwcm92aWRlciBjaGFuZ2VzCisgICAgICogKGZvciBpbnN0YW5jZSB3aGVuIHRoZSB1c2VyIGFkZHMgYSBuZXcgRGlyZWN0b3J5IGFjY291bnQpLCB0aGUgZGlyZWN0b3J5IHByb3ZpZGVyCisgICAgICogc2hvdWxkIGNhbGwge0BsaW5rICNub3RpZnlEaXJlY3RvcnlDaGFuZ2V9IHRvIG5vdGlmeSB0aGUgQ29udGFjdHMgUHJvdmlkZXIgb2YgdGhlIGNoYW5nZS4KKyAgICAgKiBJbiByZXNwb25zZSwgdGhlIENvbnRhY3RzIFByb3ZpZGVyIHdpbGwgcmVxdWVyeSB0aGUgZGlyZWN0b3J5IHByb3ZpZGVyIHRvIG9idGFpbiB0aGUKKyAgICAgKiBuZXcgbGlzdCBvZiBkaXJlY3Rvcmllcy4KKyAgICAgKiA8L3A+CisgICAgICogPHA+CisgICAgICogQSBkaXJlY3Rvcnkgcm93IGNhbiBiZSBvcHRpb25hbGx5IGFzc29jaWF0ZWQgd2l0aCBhbiBleGlzdGluZyBhY2NvdW50CisgICAgICogKHNlZSB7QGxpbmsgYW5kcm9pZC5hY2NvdW50cy5BY2NvdW50TWFuYWdlcn0pLiBJZiB0aGUgYWNjb3VudCBpcyBsYXRlciByZW1vdmVkLAorICAgICAqIHRoZSBjb3JyZXNwb25kaW5nIGRpcmVjdG9yeSByb3dzIGFyZSBhdXRvbWF0aWNhbGx5IHJlbW92ZWQgZnJvbSB0aGUgQ29udGFjdHMgUHJvdmlkZXIuCisgICAgICogPC9wPgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgRGlyZWN0b3J5IGltcGxlbWVudHMgQmFzZUNvbHVtbnMgeworCisgICAgICAgIC8qKgorICAgICAgICAgKiBOb3QgaW5zdGFudGlhYmxlLgorICAgICAgICAgKi8KKyAgICAgICAgcHJpdmF0ZSBEaXJlY3RvcnkoKSB7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIGNvbnRlbnQ6Ly8gc3R5bGUgVVJJIGZvciB0aGlzIHRhYmxlLiAgUmVxdWVzdHMgdG8gdGhpcyBVUkkgY2FuIGJlCisgICAgICAgICAqIHBlcmZvcm1lZCBvbiB0aGUgVUkgdGhyZWFkIGJlY2F1c2UgdGhleSBhcmUgYWx3YXlzIHVuYmxvY2tpbmcuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFVyaSBDT05URU5UX1VSSSA9CisgICAgICAgICAgICAgICAgVXJpLndpdGhBcHBlbmRlZFBhdGgoQVVUSE9SSVRZX1VSSSwgImRpcmVjdG9yaWVzIik7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBNSU1FLXR5cGUgb2Yge0BsaW5rICNDT05URU5UX1VSSX0gcHJvdmlkaW5nIGEgZGlyZWN0b3J5IG9mCisgICAgICAgICAqIGNvbnRhY3QgZGlyZWN0b3JpZXMuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT05URU5UX1RZUEUgPQorICAgICAgICAgICAgICAgICJ2bmQuYW5kcm9pZC5jdXJzb3IuZGlyL2NvbnRhY3RfZGlyZWN0b3JpZXMiOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgTUlNRSB0eXBlIG9mIGEge0BsaW5rICNDT05URU5UX1VSSX0gaXRlbS4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTlRFTlRfSVRFTV9UWVBFID0KKyAgICAgICAgICAgICAgICAidm5kLmFuZHJvaWQuY3Vyc29yLml0ZW0vY29udGFjdF9kaXJlY3RvcnkiOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBfSUQgb2YgdGhlIGRlZmF1bHQgZGlyZWN0b3J5LCB3aGljaCByZXByZXNlbnRzIGxvY2FsbHkgc3RvcmVkIGNvbnRhY3RzLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBsb25nIERFRkFVTFQgPSAwOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBfSUQgb2YgdGhlIGRpcmVjdG9yeSB0aGF0IHJlcHJlc2VudHMgbG9jYWxseSBzdG9yZWQgaW52aXNpYmxlIGNvbnRhY3RzLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBsb25nIExPQ0FMX0lOVklTSUJMRSA9IDE7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBuYW1lIG9mIHRoZSBwYWNrYWdlIHRoYXQgb3ducyB0aGlzIGRpcmVjdG9yeS4gQ29udGFjdHMgUHJvdmlkZXIKKyAgICAgICAgICogZmlsbCBpdCBpbiB3aXRoIHRoZSBuYW1lIG9mIHRoZSBwYWNrYWdlIGNvbnRhaW5pbmcgdGhlIGRpcmVjdG9yeSBwcm92aWRlci4KKyAgICAgICAgICogSWYgdGhlIHBhY2thZ2UgaXMgbGF0ZXIgdW5pbnN0YWxsZWQsIHRoZSBkaXJlY3RvcmllcyBpdCBvd25zIGFyZQorICAgICAgICAgKiBhdXRvbWF0aWNhbGx5IHJlbW92ZWQgZnJvbSB0aGlzIHRhYmxlLgorICAgICAgICAgKgorICAgICAgICAgKiA8cD5UWVBFOiBURVhUPC9wPgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFDS0FHRV9OQU1FID0gInBhY2thZ2VOYW1lIjsKKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIHR5cGUgb2YgZGlyZWN0b3J5IGNhcHR1cmVkIGFzIGEgcmVzb3VyY2UgSUQgaW4gdGhlIGNvbnRleHQgb2YgdGhlCisgICAgICAgICAqIHBhY2thZ2Uge0BsaW5rICNQQUNLQUdFX05BTUV9LCBlLmcuICJDb3Jwb3JhdGUgRGlyZWN0b3J5IgorICAgICAgICAgKgorICAgICAgICAgKiA8cD5UWVBFOiBJTlRFR0VSPC9wPgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFlQRV9SRVNPVVJDRV9JRCA9ICJ0eXBlUmVzb3VyY2VJZCI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEFuIG9wdGlvbmFsIG5hbWUgdGhhdCBjYW4gYmUgdXNlZCBpbiB0aGUgVUkgdG8gcmVwcmVzZW50IHRoaXMgZGlyZWN0b3J5LAorICAgICAgICAgKiBlLmcuICJBY21lIENvcnAiCisgICAgICAgICAqIDxwPlRZUEU6IHRleHQ8L3A+CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBESVNQTEFZX05BTUUgPSAiZGlzcGxheU5hbWUiOworCisgICAgICAgIC8qKgorICAgICAgICAgKiA8cD4KKyAgICAgICAgICogVGhlIGF1dGhvcml0eSBvZiB0aGUgRGlyZWN0b3J5IFByb3ZpZGVyLiBDb250YWN0cyBQcm92aWRlciB3aWxsCisgICAgICAgICAqIHVzZSB0aGlzIGF1dGhvcml0eSB0byBmb3J3YXJkIHJlcXVlc3RzIHRvIHRoZSBkaXJlY3RvcnkgcHJvdmlkZXIuCisgICAgICAgICAqIEEgZGlyZWN0b3J5IHByb3ZpZGVyIGNhbiBsZWF2ZSB0aGlzIGNvbHVtbiBlbXB0eSAtIENvbnRhY3RzIFByb3ZpZGVyIHdpbGwgZmlsbCBpdCBpbi4KKyAgICAgICAgICogPC9wPgorICAgICAgICAgKiA8cD4KKyAgICAgICAgICogQ2xpZW50cyBvZiB0aGlzIEFQSSBzaG91bGQgbm90IHNlbmQgcmVxdWVzdHMgZGlyZWN0bHkgdG8gdGhpcyBhdXRob3JpdHkuCisgICAgICAgICAqIEFsbCBkaXJlY3RvcnkgcmVxdWVzdHMgbXVzdCBiZSByb3V0ZWQgdGhyb3VnaCBDb250YWN0cyBQcm92aWRlci4KKyAgICAgICAgICogPC9wPgorICAgICAgICAgKgorICAgICAgICAgKiA8cD5UWVBFOiB0ZXh0PC9wPgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRElSRUNUT1JZX0FVVEhPUklUWSA9ICJhdXRob3JpdHkiOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgYWNjb3VudCB0eXBlIHdoaWNoIHRoaXMgZGlyZWN0b3J5IGlzIGFzc29jaWF0ZWQuCisgICAgICAgICAqCisgICAgICAgICAqIDxwPlRZUEU6IHRleHQ8L3A+CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBQ0NPVU5UX1RZUEUgPSAiYWNjb3VudFR5cGUiOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgYWNjb3VudCB3aXRoIHdoaWNoIHRoaXMgZGlyZWN0b3J5IGlzIGFzc29jaWF0ZWQuIElmIHRoZSBhY2NvdW50IGlzIGxhdGVyCisgICAgICAgICAqIHJlbW92ZWQsIHRoZSBkaXJlY3RvcmllcyBpdCBvd25zIGFyZSBhdXRvbWF0aWNhbGx5IHJlbW92ZWQgZnJvbSB0aGlzIHRhYmxlLgorICAgICAgICAgKgorICAgICAgICAgKiA8cD5UWVBFOiB0ZXh0PC9wPgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUNDT1VOVF9OQU1FID0gImFjY291bnROYW1lIjsKKworICAgICAgICAvKioKKyAgICAgICAgICogT25lIG9mIHtAbGluayAjRVhQT1JUX1NVUFBPUlRfTk9ORX0sIHtAbGluayAjRVhQT1JUX1NVUFBPUlRfQU5ZX0FDQ09VTlR9LAorICAgICAgICAgKiB7QGxpbmsgI0VYUE9SVF9TVVBQT1JUX1NBTUVfQUNDT1VOVF9PTkxZfS4gVGhpcyBpcyB0aGUgZXhwZWN0YXRpb24gdGhlCisgICAgICAgICAqIGRpcmVjdG9yeSBoYXMgZm9yIGRhdGEgZXhwb3J0ZWQgZnJvbSBpdC4gIENsaWVudHMgbXVzdCBvYmV5IHRoaXMgc2V0dGluZy4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVYUE9SVF9TVVBQT1JUID0gImV4cG9ydFN1cHBvcnQiOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBBbiB7QGxpbmsgI0VYUE9SVF9TVVBQT1JUfSBzZXR0aW5nIHRoYXQgaW5kaWNhdGVzIHRoYXQgdGhlIGRpcmVjdG9yeQorICAgICAgICAgKiBkb2VzIG5vdCBhbGxvdyBhbnkgZGF0YSB0byBiZSBjb3BpZWQgb3V0IG9mIGl0LgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRVhQT1JUX1NVUFBPUlRfTk9ORSA9IDA7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEFuIHtAbGluayAjRVhQT1JUX1NVUFBPUlR9IHNldHRpbmcgdGhhdCBpbmRpY2F0ZXMgdGhhdCB0aGUgZGlyZWN0b3J5CisgICAgICAgICAqIGFsbG93IGl0cyBkYXRhIGNvcGllZCBvbmx5IHRvIHRoZSBhY2NvdW50IHNwZWNpZmllZCBieQorICAgICAgICAgKiB7QGxpbmsgI0FDQ09VTlRfVFlQRX0ve0BsaW5rICNBQ0NPVU5UX05BTUV9LgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRVhQT1JUX1NVUFBPUlRfU0FNRV9BQ0NPVU5UX09OTFkgPSAxOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBBbiB7QGxpbmsgI0VYUE9SVF9TVVBQT1JUfSBzZXR0aW5nIHRoYXQgaW5kaWNhdGVzIHRoYXQgdGhlIGRpcmVjdG9yeQorICAgICAgICAgKiBhbGxvdyBpdHMgZGF0YSBjb3BpZWQgdG8gYW55IGNvbnRhY3RzIGFjY291bnQuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFWFBPUlRfU1VQUE9SVF9BTllfQUNDT1VOVCA9IDI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIE9uZSBvZiB7QGxpbmsgI1NIT1JUQ1VUX1NVUFBPUlRfTk9ORX0sIHtAbGluayAjU0hPUlRDVVRfU1VQUE9SVF9EQVRBX0lURU1TX09OTFl9LAorICAgICAgICAgKiB7QGxpbmsgI1NIT1JUQ1VUX1NVUFBPUlRfRlVMTH0sIFRoaXMgaXMgdGhlIGV4cGVjdGF0aW9uIHRoZSBkaXJlY3RvcnkKKyAgICAgICAgICogaGFzIGZvciBzaG9ydGN1dHMgY3JlYXRlZCBmb3IgaXRzIGVsZW1lbnRzLiBDbGllbnRzIG11c3Qgb2JleSB0aGlzIHNldHRpbmcuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTSE9SVENVVF9TVVBQT1JUID0gInNob3J0Y3V0U3VwcG9ydCI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEFuIHtAbGluayAjU0hPUlRDVVRfU1VQUE9SVH0gc2V0dGluZyB0aGF0IGluZGljYXRlcyB0aGF0IHRoZSBkaXJlY3RvcnkKKyAgICAgICAgICogZG9lcyBub3QgYWxsb3cgYW55IHNob3J0Y3V0cyBjcmVhdGVkIGZvciBpdHMgY29udGFjdHMuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTSE9SVENVVF9TVVBQT1JUX05PTkUgPSAwOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBBbiB7QGxpbmsgI1NIT1JUQ1VUX1NVUFBPUlR9IHNldHRpbmcgdGhhdCBpbmRpY2F0ZXMgdGhhdCB0aGUgZGlyZWN0b3J5CisgICAgICAgICAqIGFsbG93IGNyZWF0aW9uIG9mIHNob3J0Y3V0cyBmb3IgZGF0YSBpdGVtcyBsaWtlIGVtYWlsLCBwaG9uZSBvciBwb3N0YWwgYWRkcmVzcywKKyAgICAgICAgICogYnV0IG5vdCB0aGUgZW50aXJlIGNvbnRhY3QuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTSE9SVENVVF9TVVBQT1JUX0RBVEFfSVRFTVNfT05MWSA9IDE7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEFuIHtAbGluayAjU0hPUlRDVVRfU1VQUE9SVH0gc2V0dGluZyB0aGF0IGluZGljYXRlcyB0aGF0IHRoZSBkaXJlY3RvcnkKKyAgICAgICAgICogYWxsb3cgY3JlYXRpb24gb2Ygc2hvcnRjdXRzIGZvciBjb250YWN0IGFzIHdlbGwgYXMgdGhlaXIgY29uc3RpdHVlbnQgZWxlbWVudHMuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTSE9SVENVVF9TVVBQT1JUX0ZVTEwgPSAyOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBOb3RpZmllcyB0aGUgc3lzdGVtIG9mIGEgY2hhbmdlIGluIHRoZSBsaXN0IG9mIGRpcmVjdG9yaWVzIGhhbmRsZWQgYnkKKyAgICAgICAgICogYSBwYXJ0aWN1bGFyIGRpcmVjdG9yeSBwcm92aWRlci4gVGhlIENvbnRhY3RzIHByb3ZpZGVyIHdpbGwgdHVybiBhcm91bmQKKyAgICAgICAgICogYW5kIHNlbmQgYSBxdWVyeSB0byB0aGUgZGlyZWN0b3J5IHByb3ZpZGVyIGZvciB0aGUgZnVsbCBsaXN0IG9mIGRpcmVjdG9yaWVzLAorICAgICAgICAgKiB3aGljaCB3aWxsIHJlcGxhY2UgdGhlIHByZXZpb3VzIGxpc3QuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIHZvaWQgbm90aWZ5RGlyZWN0b3J5Q2hhbmdlKENvbnRlbnRSZXNvbHZlciByZXNvbHZlcikgeworICAgICAgICAgICAgLy8gVGhpcyBpcyBkb25lIHRvIHRyaWdnZXIgYSBxdWVyeSBieSBDb250YWN0cyBQcm92aWRlciBiYWNrIHRvIHRoZSBkaXJlY3RvcnkgcHJvdmlkZXIuCisgICAgICAgICAgICAvLyBObyBkYXRhIG5lZWRzIHRvIGJlIHNlbnQgYmFjaywgYmVjYXVzZSB0aGUgcHJvdmlkZXIgY2FuIGluZmVyIHRoZSBjYWxsaW5nCisgICAgICAgICAgICAvLyBwYWNrYWdlIGZyb20gYmluZGVyLgorICAgICAgICAgICAgQ29udGVudFZhbHVlcyBjb250ZW50VmFsdWVzID0gbmV3IENvbnRlbnRWYWx1ZXMoKTsKKyAgICAgICAgICAgIHJlc29sdmVyLnVwZGF0ZShEaXJlY3RvcnkuQ09OVEVOVF9VUkksIGNvbnRlbnRWYWx1ZXMsIG51bGwsIG51bGwpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCiAgICAgICogQGhpZGUgc2hvdWxkIGJlIHJlbW92ZWQgd2hlbiB1c2VycyBhcmUgdXBkYXRlZCB0byByZWZlciB0byBTeW5jU3RhdGUKICAgICAgKiBAZGVwcmVjYXRlZCB1c2UgU3luY1N0YXRlIGluc3RlYWQKICAgICAgKi8KQEAgLTQ1Nyw3ICs3NjEsNiBAQAogICAgICAqICdmYW1pbHkgbmFtZScsICdnaXZlbiBuYW1lJyAnbWlkZGxlIG5hbWUnLiAgVGhlIENKSyB0cmFkaXRpb24gaXMKICAgICAgKiAnZmFtaWx5IG5hbWUnICdtaWRkbGUgbmFtZScgJ2dpdmVuIG5hbWUnLCB3aXRoIEphcGFuZXNlIGZhdm9yaW5nIGEgc3BhY2UgYmV0d2VlbgogICAgICAqIHRoZSBuYW1lcyBhbmQgQ2hpbmVzZSBvbWl0dGluZyB0aGUgc3BhY2UuCi0gICAgICogQGhpZGUKICAgICAgKi8KICAgICBwdWJsaWMgaW50ZXJmYWNlIEZ1bGxOYW1lU3R5bGUgewogICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBVTkRFRklORUQgPSAwOwpAQCAtNDc2LDcgKzc3OSw2IEBACiAKICAgICAvKioKICAgICAgKiBDb25zdGFudHMgZm9yIHZhcmlvdXMgc3R5bGVzIG9mIGNhcHR1cmluZyB0aGUgcHJvbnVuY2lhdGlvbiBvZiBhIHBlcnNvbidzIG5hbWUuCi0gICAgICogQGhpZGUKICAgICAgKi8KICAgICBwdWJsaWMgaW50ZXJmYWNlIFBob25ldGljTmFtZVN0eWxlIHsKICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVU5ERUZJTkVEID0gMDsKQEAgLTUwMiw4ICs4MDQsNiBAQAogICAgIC8qKgogICAgICAqIFR5cGVzIG9mIGRhdGEgdXNlZCB0byBwcm9kdWNlIHRoZSBkaXNwbGF5IG5hbWUgZm9yIGEgY29udGFjdC4gTGlzdGVkIGluIHRoZSBvcmRlcgogICAgICAqIG9mIGluY3JlYXNpbmcgcHJpb3JpdHkuCi0gICAgICoKLSAgICAgKiBAaGlkZQogICAgICAqLwogICAgIHB1YmxpYyBpbnRlcmZhY2UgRGlzcGxheU5hbWVTb3VyY2VzIHsKICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVU5ERUZJTkVEID0gMDsKQEAgLTUxOSwxNSArODE5LDEyIEBACiAgICAgICoKICAgICAgKiBAc2VlIENvbnRhY3RzCiAgICAgICogQHNlZSBSYXdDb250YWN0cwotICAgICAqIEBoaWRlCiAgICAgICovCiAgICAgcHJvdGVjdGVkIGludGVyZmFjZSBDb250YWN0TmFtZUNvbHVtbnMgewogCiAgICAgICAgIC8qKgogICAgICAgICAgKiBUaGUga2luZCBvZiBkYXRhIHRoYXQgaXMgdXNlZCBhcyB0aGUgZGlzcGxheSBuYW1lIGZvciB0aGUgY29udGFjdCwgc3VjaCBhcwotICAgICAgICAgKiBzdHJ1Y3R1cmVkIG5hbWUgb3IgZW1haWwgYWRkcmVzcy4gIFNlZSBEaXNwbGF5TmFtZVNvdXJjZXMuCi0gICAgICAgICAqCi0gICAgICAgICAqIFRPRE86IGNvbnZlcnQgRGlzcGxheU5hbWVTb3VyY2VzIHRvIGEgbGluayBhZnRlciBpdCBpcyB1bi1oaWRkZW4KKyAgICAgICAgICogc3RydWN0dXJlZCBuYW1lIG9yIGVtYWlsIGFkZHJlc3MuICBTZWUge0BsaW5rIERpc3BsYXlOYW1lU291cmNlc30uCiAgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBESVNQTEFZX05BTUVfU09VUkNFID0gImRpc3BsYXlfbmFtZV9zb3VyY2UiOwogCkBAIC01NzUsOSArODcyLDcgQEAKIAogICAgICAgICAvKioKICAgICAgICAgICogVGhlIHBob25ldGljIGFscGhhYmV0IHVzZWQgdG8gcmVwcmVzZW50IHRoZSB7QGxpbmsgI1BIT05FVElDX05BTUV9LiAgU2VlCi0gICAgICAgICAqIFBob25ldGljTmFtZVN0eWxlLgotICAgICAgICAgKgotICAgICAgICAgKiBUT0RPOiBjb252ZXJ0IFBob25ldGljTmFtZVN0eWxlIHRvIGEgbGluayBhZnRlciBpdCBpcyB1bi1oaWRkZW4KKyAgICAgICAgICoge0BsaW5rIFBob25ldGljTmFtZVN0eWxlfS4KICAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBIT05FVElDX05BTUVfU1RZTEUgPSAicGhvbmV0aWNfbmFtZV9zdHlsZSI7CiAKQEAgLTU4NywxMyArODgyLDEwIEBACiAgICAgICAgICAqIHtAbGluayAjUEhPTkVUSUNfTkFNRV9TVFlMRX0uCiAgICAgICAgICAqIDwvcD4KICAgICAgICAgICogPHA+Ci0gICAgICAgICAqIFRoZSB2YWx1ZSBtYXkgYmUgc2V0IG1hbnVhbGx5IGJ5IHRoZSB1c2VyLgotICAgICAgICAgKiBUaGlzIGNhcGFiaWxpdHkgaXMgaXMgb2YgaW50ZXJlc3Qgb25seSBpbiBjb3VudHJpZXMKLSAgICAgICAgICogd2l0aCBjb21tb25seSB1c2VkIHBob25ldGljCi0gICAgICAgICAqIGFscGhhYmV0cywgc3VjaCBhcyBKYXBhbiBhbmQgS29yZWEuICBTZWUgUGhvbmV0aWNOYW1lU3R5bGUuCisgICAgICAgICAqIFRoZSB2YWx1ZSBtYXkgYmUgc2V0IG1hbnVhbGx5IGJ5IHRoZSB1c2VyLiBUaGlzIGNhcGFiaWxpdHkgaXMgb2YKKyAgICAgICAgICogaW50ZXJlc3Qgb25seSBpbiBjb3VudHJpZXMgd2l0aCBjb21tb25seSB1c2VkIHBob25ldGljIGFscGhhYmV0cywKKyAgICAgICAgICogc3VjaCBhcyBKYXBhbiBhbmQgS29yZWEuIFNlZSB7QGxpbmsgUGhvbmV0aWNOYW1lU3R5bGV9LgogICAgICAgICAgKiA8L3A+Ci0gICAgICAgICAqCi0gICAgICAgICAqIFRPRE86IGNvbnZlcnQgUGhvbmV0aWNOYW1lU3R5bGUgdG8gYSBsaW5rIGFmdGVyIGl0IGlzIHVuLWhpZGRlbgogICAgICAgICAgKi8KICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEhPTkVUSUNfTkFNRSA9ICJwaG9uZXRpY19uYW1lIjsKIApAQCAtOTc1LDEwICsxMjY3LDEwIEBACiAgICAgICAgIH0KIAogICAgICAgICAvKioKLSAgICAgICAgICogTWFyayBhIGNvbnRhY3QgYXMgaGF2aW5nIGJlZW4gY29udGFjdGVkLiAgVGhpcyB1cGRhdGVzIHRoZQotICAgICAgICAgKiB7QGxpbmsgI1RJTUVTX0NPTlRBQ1RFRH0gYW5kIHtAbGluayAjTEFTVF9USU1FX0NPTlRBQ1RFRH0gZm9yIHRoZQotICAgICAgICAgKiBjb250YWN0LCBwbHVzIHRoZSBjb3JyZXNwb25kaW5nIHZhbHVlcyBvZiBhbnkgYXNzb2NpYXRlZCByYXcKLSAgICAgICAgICogY29udGFjdHMuCisgICAgICAgICAqIE1hcmsgYSBjb250YWN0IGFzIGhhdmluZyBiZWVuIGNvbnRhY3RlZC4gVXBkYXRlcyB0d28gZmllbGRzOgorICAgICAgICAgKiB7QGxpbmsgI1RJTUVTX0NPTlRBQ1RFRH0gYW5kIHtAbGluayAjTEFTVF9USU1FX0NPTlRBQ1RFRH0uIFRoZQorICAgICAgICAgKiBUSU1FU19DT05UQUNURUQgZmllbGQgaXMgaW5jcmVtZW50ZWQgYnkgMSBhbmQgdGhlIExBU1RfVElNRV9DT05UQUNURUQKKyAgICAgICAgICogZmllbGQgaXMgcG9wdWxhdGVkIHdpdGggdGhlIGN1cnJlbnQgc3lzdGVtIHRpbWUuCiAgICAgICAgICAqCiAgICAgICAgICAqIEBwYXJhbSByZXNvbHZlciB0aGUgQ29udGVudFJlc29sdmVyIHRvIHVzZQogICAgICAgICAgKiBAcGFyYW0gY29udGFjdElkIHRoZSBwZXJzb24gd2hvIHdhcyBjb250YWN0ZWQKQEAgLTEwNDAsNyArMTMzMiw4IEBACiAKICAgICAgICAgLyoqCiAgICAgICAgICAqIEEgc3ViLWRpcmVjdG9yeSBvZiBhIHNpbmdsZSBjb250YWN0IHRoYXQgY29udGFpbnMgYWxsIG9mIHRoZSBjb25zdGl0dWVudCByYXcgY29udGFjdAotICAgICAgICAgKiB7QGxpbmsgQ29udGFjdHNDb250cmFjdC5EYXRhfSByb3dzLgorICAgICAgICAgKiB7QGxpbmsgQ29udGFjdHNDb250cmFjdC5EYXRhfSByb3dzLiAgVGhpcyBkaXJlY3RvcnkgY2FuIGJlIHVzZWQgZWl0aGVyCisgICAgICAgICAqIHdpdGggYSB7QGxpbmsgI0NPTlRFTlRfVVJJfSBvciB7QGxpbmsgI0NPTlRFTlRfTE9PS1VQX1VSSX0uCiAgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIERhdGEgaW1wbGVtZW50cyBCYXNlQ29sdW1ucywgRGF0YUNvbHVtbnMgewogICAgICAgICAgICAgLyoqCkBAIC0xMDU2LDYgKzEzNDksNTcgQEAKIAogICAgICAgICAvKioKICAgICAgICAgICogPHA+CisgICAgICAgICAqIEEgc3ViLWRpcmVjdG9yeSBvZiBhIGNvbnRhY3QgdGhhdCBjb250YWlucyBhbGwgb2YgaXRzCisgICAgICAgICAqIHtAbGluayBDb250YWN0c0NvbnRyYWN0LlJhd0NvbnRhY3RzfSBhcyB3ZWxsIGFzCisgICAgICAgICAqIHtAbGluayBDb250YWN0c0NvbnRyYWN0LkRhdGF9IHJvd3MuIFRvIGFjY2VzcyB0aGlzIGRpcmVjdG9yeSBhcHBlbmQKKyAgICAgICAgICoge0BsaW5rICNDT05URU5UX0RJUkVDVE9SWX0gdG8gdGhlIGNvbnRhY3QgVVJJLgorICAgICAgICAgKiA8L3A+CisgICAgICAgICAqIDxwPgorICAgICAgICAgKiBFbnRpdHkgaGFzIHRocmVlIElEIGZpZWxkczoge0BsaW5rICNDT05UQUNUX0lEfSBmb3IgdGhlIGNvbnRhY3QsCisgICAgICAgICAqIHtAbGluayAjUkFXX0NPTlRBQ1RfSUR9IGZvciB0aGUgcmF3IGNvbnRhY3QgYW5kIHtAbGluayAjREFUQV9JRH0gZm9yCisgICAgICAgICAqIHRoZSBkYXRhIHJvd3MuIEVudGl0eSBhbHdheXMgY29udGFpbnMgYXQgbGVhc3Qgb25lIHJvdyBwZXIKKyAgICAgICAgICogY29uc3RpdHVlbnQgcmF3IGNvbnRhY3QsIGV2ZW4gaWYgdGhlcmUgYXJlIG5vIGFjdHVhbCBkYXRhIHJvd3MuIEluCisgICAgICAgICAqIHRoaXMgY2FzZSB0aGUge0BsaW5rICNEQVRBX0lEfSBmaWVsZCB3aWxsIGJlIG51bGwuCisgICAgICAgICAqIDwvcD4KKyAgICAgICAgICogPHA+CisgICAgICAgICAqIEVudGl0eSByZWFkcyBhbGwgZGF0YSBmb3IgdGhlIGVudGlyZSBjb250YWN0IGluIG9uZSB0cmFuc2FjdGlvbiwgdG8KKyAgICAgICAgICogZ3VhcmFudGVlIGNvbnNpc3RlbmN5LiAgVGhlcmUgaXMgc2lnbmlmaWNhbnQgZGF0YSBkdXBsaWNhdGlvbgorICAgICAgICAgKiBpbiB0aGUgRW50aXR5IChlYWNoIHJvdyByZXBlYXRzIGFsbCBDb250YWN0IGNvbHVtbnMgYW5kIGFsbCBSYXdDb250YWN0CisgICAgICAgICAqIGNvbHVtbnMpLCBzbyB0aGUgYmVuZWZpdHMgb2YgdHJhbnNhY3Rpb25hbCBjb25zaXN0ZW5jeSBzaG91bGQgYmUgd2VpZ2hlZAorICAgICAgICAgKiBhZ2FpbnN0IHRoZSBjb3N0IG9mIHRyYW5zZmVycmluZyBsYXJnZSBhbW91bnRzIG9mIGRlbm9ybWFsaXplZCBkYXRhCisgICAgICAgICAqIGZyb20gdGhlIFByb3ZpZGVyLgorICAgICAgICAgKiA8L3A+CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIEVudGl0eSBpbXBsZW1lbnRzIEJhc2VDb2x1bW5zLCBDb250YWN0c0NvbHVtbnMsCisgICAgICAgICAgICAgICAgQ29udGFjdE5hbWVDb2x1bW5zLCBSYXdDb250YWN0c0NvbHVtbnMsIEJhc2VTeW5jQ29sdW1ucywgU3luY0NvbHVtbnMsIERhdGFDb2x1bW5zLAorICAgICAgICAgICAgICAgIFN0YXR1c0NvbHVtbnMsIENvbnRhY3RPcHRpb25zQ29sdW1ucywgQ29udGFjdFN0YXR1c0NvbHVtbnMgeworICAgICAgICAgICAgLyoqCisgICAgICAgICAgICAgKiBubyBwdWJsaWMgY29uc3RydWN0b3Igc2luY2UgdGhpcyBpcyBhIHV0aWxpdHkgY2xhc3MKKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgcHJpdmF0ZSBFbnRpdHkoKSB7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qKgorICAgICAgICAgICAgICogVGhlIGRpcmVjdG9yeSB0d2lnIGZvciB0aGlzIHN1Yi10YWJsZQorICAgICAgICAgICAgICovCisgICAgICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT05URU5UX0RJUkVDVE9SWSA9ICJlbnRpdGllcyI7CisKKyAgICAgICAgICAgIC8qKgorICAgICAgICAgICAgICogVGhlIElEIG9mIHRoZSByYXcgY29udGFjdCByb3cuCisgICAgICAgICAgICAgKiA8UD5UeXBlOiBJTlRFR0VSPC9QPgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSQVdfQ09OVEFDVF9JRCA9ICJyYXdfY29udGFjdF9pZCI7CisKKyAgICAgICAgICAgIC8qKgorICAgICAgICAgICAgICogVGhlIElEIG9mIHRoZSBkYXRhIHJvdy4gVGhlIHZhbHVlIHdpbGwgYmUgbnVsbCBpZiB0aGlzIHJhdyBjb250YWN0IGhhcyBubworICAgICAgICAgICAgICogZGF0YSByb3dzLgorICAgICAgICAgICAgICogPFA+VHlwZTogSU5URUdFUjwvUD4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREFUQV9JRCA9ICJkYXRhX2lkIjsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiA8cD4KICAgICAgICAgICogQSA8aT5yZWFkLW9ubHk8L2k+IHN1Yi1kaXJlY3Rvcnkgb2YgYSBzaW5nbGUgY29udGFjdCBhZ2dyZWdhdGUgdGhhdAogICAgICAgICAgKiBjb250YWlucyBhbGwgYWdncmVnYXRpb24gc3VnZ2VzdGlvbnMgKG90aGVyIGNvbnRhY3RzKS4gVGhlCiAgICAgICAgICAqIGFnZ3JlZ2F0aW9uIHN1Z2dlc3Rpb25zIGFyZSBjb21wdXRlZCBiYXNlZCBvbiBhcHByb3hpbWF0ZSBkYXRhCkBAIC0xMDgwLDkgKzE0MjQsMTMgQEAKICAgICAgICAgICogPC9wcmU+CiAgICAgICAgICAqCiAgICAgICAgICAqIDwvcD4KKyAgICAgICAgICogPHA+CisgICAgICAgICAqIFRoaXMgZGlyZWN0b3J5IGNhbiBiZSB1c2VkIGVpdGhlciB3aXRoIGEge0BsaW5rICNDT05URU5UX1VSSX0gb3IKKyAgICAgICAgICoge0BsaW5rICNDT05URU5UX0xPT0tVUF9VUkl9LgorICAgICAgICAgKiA8L3A+CiAgICAgICAgICAqLwotICAgICAgICAvLyBUT0RPOiBhZGQgQ29udGFjdE9wdGlvbnNDb2x1bW5zLCBDb250YWN0U3RhdHVzQ29sdW1ucwotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIEFnZ3JlZ2F0aW9uU3VnZ2VzdGlvbnMgaW1wbGVtZW50cyBCYXNlQ29sdW1ucywgQ29udGFjdHNDb2x1bW5zIHsKKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBBZ2dyZWdhdGlvblN1Z2dlc3Rpb25zIGltcGxlbWVudHMgQmFzZUNvbHVtbnMsIENvbnRhY3RzQ29sdW1ucywKKyAgICAgICAgICAgICAgICBDb250YWN0T3B0aW9uc0NvbHVtbnMsIENvbnRhY3RTdGF0dXNDb2x1bW5zIHsKICAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgICogTm8gcHVibGljIGNvbnN0cnVjdG9yIHNpbmNlIHRoaXMgaXMgYSB1dGlsaXR5IGNsYXNzCiAgICAgICAgICAgICAgKi8KQEAgLTEwOTQsNiArMTQ0MiwxMDYgQEAKICAgICAgICAgICAgICAqIHtAbGluayBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuQ29udGFjdHMjQ09OVEVOVF9GSUxURVJfVVJJfS4KICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09OVEVOVF9ESVJFQ1RPUlkgPSAic3VnZ2VzdGlvbnMiOworCisgICAgICAgICAgICAvKioKKyAgICAgICAgICAgICAqIFVzZWQgd2l0aCB7QGxpbmsgQnVpbGRlciNhZGRQYXJhbWV0ZXJ9IHRvIHNwZWNpZnkgd2hhdCBraW5kIG9mIGRhdGEgaXMKKyAgICAgICAgICAgICAqIHN1cHBsaWVkIGZvciB0aGUgc3VnZ2VzdGlvbiBxdWVyeS4KKyAgICAgICAgICAgICAqCisgICAgICAgICAgICAgKiBAaGlkZQorICAgICAgICAgICAgICovCisgICAgICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJBTUVURVJfTUFUQ0hfTkFNRSA9ICJuYW1lIjsKKworICAgICAgICAgICAgLyoqCisgICAgICAgICAgICAgKiBVc2VkIHdpdGgge0BsaW5rIEJ1aWxkZXIjYWRkUGFyYW1ldGVyfSB0byBzcGVjaWZ5IHdoYXQga2luZCBvZiBkYXRhIGlzCisgICAgICAgICAgICAgKiBzdXBwbGllZCBmb3IgdGhlIHN1Z2dlc3Rpb24gcXVlcnkuCisgICAgICAgICAgICAgKgorICAgICAgICAgICAgICogQGhpZGUKKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSQU1FVEVSX01BVENIX0VNQUlMID0gImVtYWlsIjsKKworICAgICAgICAgICAgLyoqCisgICAgICAgICAgICAgKiBVc2VkIHdpdGgge0BsaW5rIEJ1aWxkZXIjYWRkUGFyYW1ldGVyfSB0byBzcGVjaWZ5IHdoYXQga2luZCBvZiBkYXRhIGlzCisgICAgICAgICAgICAgKiBzdXBwbGllZCBmb3IgdGhlIHN1Z2dlc3Rpb24gcXVlcnkuCisgICAgICAgICAgICAgKgorICAgICAgICAgICAgICogQGhpZGUKKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSQU1FVEVSX01BVENIX1BIT05FID0gInBob25lIjsKKworICAgICAgICAgICAgLyoqCisgICAgICAgICAgICAgKiBVc2VkIHdpdGgge0BsaW5rIEJ1aWxkZXIjYWRkUGFyYW1ldGVyfSB0byBzcGVjaWZ5IHdoYXQga2luZCBvZiBkYXRhIGlzCisgICAgICAgICAgICAgKiBzdXBwbGllZCBmb3IgdGhlIHN1Z2dlc3Rpb24gcXVlcnkuCisgICAgICAgICAgICAgKgorICAgICAgICAgICAgICogQGhpZGUKKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSQU1FVEVSX01BVENIX05JQ0tOQU1FID0gIm5pY2tuYW1lIjsKKworICAgICAgICAgICAgLyoqCisgICAgICAgICAgICAgKiBBIGNvbnZlbmllbmNlIGJ1aWxkZXIgZm9yIGFnZ3JlZ2F0aW9uIHN1Z2dlc3Rpb24gY29udGVudCBVUklzLgorICAgICAgICAgICAgICoKKyAgICAgICAgICAgICAqIFRPRE86IGNoYW5nZSBkb2N1bWVudGF0aW9uIGZvciB0aGlzIGNsYXNzIHRvIHVzZSB0aGUgYnVpbGRlci4KKyAgICAgICAgICAgICAqIEBoaWRlCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgQnVpbGRlciB7CisgICAgICAgICAgICAgICAgcHJpdmF0ZSBsb25nIG1Db250YWN0SWQ7CisgICAgICAgICAgICAgICAgcHJpdmF0ZSBBcnJheUxpc3Q8U3RyaW5nPiBtS2luZHMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKKyAgICAgICAgICAgICAgICBwcml2YXRlIEFycmF5TGlzdDxTdHJpbmc+IG1WYWx1ZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKKyAgICAgICAgICAgICAgICBwcml2YXRlIGludCBtTGltaXQ7CisKKyAgICAgICAgICAgICAgICAvKioKKyAgICAgICAgICAgICAgICAgKiBPcHRpb25hbCBleGlzdGluZyBjb250YWN0IElELiAgSWYgaXQgaXMgbm90IHByb3ZpZGVkLCB0aGUgc2VhcmNoCisgICAgICAgICAgICAgICAgICogd2lsbCBiZSBiYXNlZCBleGNsdXNpdmVseSBvbiB0aGUgdmFsdWVzIHN1cHBsaWVkIHdpdGgge0BsaW5rICNhZGRQYXJhbWV0ZXJ9LgorICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgIHB1YmxpYyBCdWlsZGVyIHNldENvbnRhY3RJZChsb25nIGNvbnRhY3RJZCkgeworICAgICAgICAgICAgICAgICAgICB0aGlzLm1Db250YWN0SWQgPSBjb250YWN0SWQ7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8qKgorICAgICAgICAgICAgICAgICAqIEEgdmFsdWUgdGhhdCBjYW4gYmUgdXNlZCB3aGVuIHNlYXJjaGluZyBmb3IgYW4gYWdncmVnYXRpb24KKyAgICAgICAgICAgICAgICAgKiBzdWdnZXN0aW9uLgorICAgICAgICAgICAgICAgICAqCisgICAgICAgICAgICAgICAgICogQHBhcmFtIGtpbmQgY2FuIGJlIG9uZSBvZgorICAgICAgICAgICAgICAgICAqICAgICAgICAgICAge0BsaW5rIEFnZ3JlZ2F0aW9uU3VnZ2VzdGlvbnMjUEFSQU1FVEVSX01BVENIX05BTUV9LAorICAgICAgICAgICAgICAgICAqICAgICAgICAgICAge0BsaW5rIEFnZ3JlZ2F0aW9uU3VnZ2VzdGlvbnMjUEFSQU1FVEVSX01BVENIX0VNQUlMfSwKKyAgICAgICAgICAgICAgICAgKiAgICAgICAgICAgIHtAbGluayBBZ2dyZWdhdGlvblN1Z2dlc3Rpb25zI1BBUkFNRVRFUl9NQVRDSF9OSUNLTkFNRX0sCisgICAgICAgICAgICAgICAgICogICAgICAgICAgICB7QGxpbmsgQWdncmVnYXRpb25TdWdnZXN0aW9ucyNQQVJBTUVURVJfTUFUQ0hfUEhPTkV9CisgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgcHVibGljIEJ1aWxkZXIgYWRkUGFyYW1ldGVyKFN0cmluZyBraW5kLCBTdHJpbmcgdmFsdWUpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFUZXh0VXRpbHMuaXNFbXB0eSh2YWx1ZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1LaW5kcy5hZGQoa2luZCk7CisgICAgICAgICAgICAgICAgICAgICAgICBtVmFsdWVzLmFkZCh2YWx1ZSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcHVibGljIEJ1aWxkZXIgc2V0TGltaXQoaW50IGxpbWl0KSB7CisgICAgICAgICAgICAgICAgICAgIG1MaW1pdCA9IGxpbWl0OworICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpczsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBwdWJsaWMgVXJpIGJ1aWxkKCkgeworICAgICAgICAgICAgICAgICAgICBhbmRyb2lkLm5ldC5VcmkuQnVpbGRlciBidWlsZGVyID0gQ29udGFjdHMuQ09OVEVOVF9VUkkuYnVpbGRVcG9uKCk7CisgICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kRW5jb2RlZFBhdGgoU3RyaW5nLnZhbHVlT2YobUNvbnRhY3RJZCkpOworICAgICAgICAgICAgICAgICAgICBidWlsZGVyLmFwcGVuZFBhdGgoQ29udGFjdHMuQWdncmVnYXRpb25TdWdnZXN0aW9ucy5DT05URU5UX0RJUkVDVE9SWSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChtTGltaXQgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgYnVpbGRlci5hcHBlbmRRdWVyeVBhcmFtZXRlcigibGltaXQiLCBTdHJpbmcudmFsdWVPZihtTGltaXQpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGludCBjb3VudCA9IG1LaW5kcy5zaXplKCk7CisgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeworICAgICAgICAgICAgICAgICAgICAgICAgYnVpbGRlci5hcHBlbmRRdWVyeVBhcmFtZXRlcigicXVlcnkiLCBtS2luZHMuZ2V0KGkpICsgIjoiICsgbVZhbHVlcy5nZXQoaSkpOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJ1aWxkZXIuYnVpbGQoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qKgorICAgICAgICAgICAgICogQGhpZGUKKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBCdWlsZGVyIGJ1aWxkZXIoKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBCdWlsZGVyKCk7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KIAogICAgICAgICAvKioKQEAgLTExMjksOSArMTU3NywxMiBAQAogICAgICAgICAgKiA8cD5Zb3Ugc2hvdWxkIGFsc28gY29uc2lkZXIgdXNpbmcgdGhlIGNvbnZlbmllbmNlIG1ldGhvZAogICAgICAgICAgKiB7QGxpbmsgQ29udGFjdHNDb250cmFjdC5Db250YWN0cyNvcGVuQ29udGFjdFBob3RvSW5wdXRTdHJlYW0oQ29udGVudFJlc29sdmVyLCBVcmkpfQogICAgICAgICAgKiA8L3A+CisgICAgICAgICAqIDxwPgorICAgICAgICAgKiBUaGlzIGRpcmVjdG9yeSBjYW4gYmUgdXNlZCBlaXRoZXIgd2l0aCBhIHtAbGluayAjQ09OVEVOVF9VUkl9IG9yCisgICAgICAgICAqIHtAbGluayAjQ09OVEVOVF9MT09LVVBfVVJJfS4KKyAgICAgICAgICogPC9wPgogICAgICAgICAgKi8KLSAgICAgICAgLy8gVE9ETzogY2hhbmdlIERhdGFDb2x1bW5zIHRvIERhdGFDb2x1bW5zV2l0aEpvaW5zCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgUGhvdG8gaW1wbGVtZW50cyBCYXNlQ29sdW1ucywgRGF0YUNvbHVtbnMgeworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIFBob3RvIGltcGxlbWVudHMgQmFzZUNvbHVtbnMsIERhdGFDb2x1bW5zV2l0aEpvaW5zIHsKICAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgICogbm8gcHVibGljIGNvbnN0cnVjdG9yIHNpbmNlIHRoaXMgaXMgYSB1dGlsaXR5IGNsYXNzCiAgICAgICAgICAgICAgKi8KQEAgLTExNDcsNyArMTU5OCw2IEBACiAgICAgICAgICAgICAgKiB0aGF0IGNvdWxkIGJlIGluZmxhdGVkIHVzaW5nIHtAbGluayBhbmRyb2lkLmdyYXBoaWNzLkJpdG1hcEZhY3Rvcnl9LgogICAgICAgICAgICAgICogPHA+CiAgICAgICAgICAgICAgKiBUeXBlOiBCTE9CCi0gICAgICAgICAgICAgKiBAaGlkZSBUT0RPOiBVbmhpZGUgaW4gYSBzZXBhcmF0ZSBDTAogICAgICAgICAgICAgICovCiAgICAgICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQSE9UTyA9IERBVEExNTsKICAgICAgICAgfQpAQCAtMTE1Niw3ICsxNjA2LDEwIEBACiAgICAgICAgICAqIE9wZW5zIGFuIElucHV0U3RyZWFtIGZvciB0aGUgY29udGFjdHMncyBkZWZhdWx0IHBob3RvIGFuZCByZXR1cm5zIHRoZQogICAgICAgICAgKiBwaG90byBhcyBhIGJ5dGUgc3RyZWFtLiBJZiB0aGVyZSBpcyBub3QgcGhvdG8gbnVsbCB3aWxsIGJlIHJldHVybmVkLgogICAgICAgICAgKgotICAgICAgICAgKiBAcGFyYW0gY29udGFjdFVyaSB0aGUgY29udGFjdCB3aG9zZSBwaG90byBzaG91bGQgYmUgdXNlZAorICAgICAgICAgKiBAcGFyYW0gY29udGFjdFVyaSB0aGUgY29udGFjdCB3aG9zZSBwaG90byBzaG91bGQgYmUgdXNlZC4gVGhpcyBjYW4gYmUgdXNlZCB3aXRoCisgICAgICAgICAqIGVpdGhlciBhIHtAbGluayAjQ09OVEVOVF9VUkl9IG9yIGEge0BsaW5rICNDT05URU5UX0xPT0tVUF9VUkl9IFVSSS4KKyAgICAgICAgICogPC9wPgorCiAgICAgICAgICAqIEByZXR1cm4gYW4gSW5wdXRTdHJlYW0gb2YgdGhlIHBob3RvLCBvciBudWxsIGlmIG5vIHBob3RvIGlzIHByZXNlbnQKICAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyBzdGF0aWMgSW5wdXRTdHJlYW0gb3BlbkNvbnRhY3RQaG90b0lucHV0U3RyZWFtKENvbnRlbnRSZXNvbHZlciBjciwgVXJpIGNvbnRhY3RVcmkpIHsKQEAgLTEyNDQsNiArMTY5NywxMyBAQAogICAgICAgICAgKiBAaGlkZQogICAgICAgICAgKi8KICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRV9WRVJJRklFRCA9ICJuYW1lX3ZlcmlmaWVkIjsKKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlICJyZWFkLW9ubHkiIGZsYWc6ICIwIiBieSBkZWZhdWx0LCAiMSIgaWYgdGhlIHJvdyBjYW5ub3QgYmUgbW9kaWZpZWQgb3IKKyAgICAgICAgICogZGVsZXRlZCBleGNlcHQgYnkgYSBzeW5jIGFkYXB0ZXIuICBTZWUge0BsaW5rIENvbnRhY3RzQ29udHJhY3QjQ0FMTEVSX0lTX1NZTkNBREFQVEVSfS4KKyAgICAgICAgICogPFA+VHlwZTogSU5URUdFUjwvUD4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJBV19DT05UQUNUX0lTX1JFQURfT05MWSA9ICJyYXdfY29udGFjdF9pc19yZWFkX29ubHkiOwogICAgIH0KIAogICAgIC8qKgpAQCAtMTYyOSwxMCArMjA4OSwxMCBAQAogICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBR0dSRUdBVElPTl9NT0RFX0RFRkFVTFQgPSAwOwogCiAgICAgICAgIC8qKgotICAgICAgICAgKiBEbyBub3QgdXNlLgotICAgICAgICAgKgotICAgICAgICAgKiBUT0RPOiBkZXByZWNhdGUgaW4gZmF2b3Igb2Yge0BsaW5rICNBR0dSRUdBVElPTl9NT0RFX0RFRkFVTFR9CisgICAgICAgICAqIEFnZ3JlZ2F0aW9uIG1vZGU6IGFnZ3JlZ2F0ZSBhdCB0aGUgdGltZSB0aGUgcmF3IGNvbnRhY3QgaXMgaW5zZXJ0ZWQvdXBkYXRlZC4KKyAgICAgICAgICogQGRlcHJlY2F0ZWQgQWdncmVnYXRpb24gaXMgc3luY2hyb25vdXMsIHRoaXMgaGlzdG9yaWMgdmFsdWUgaXMgYSBuby1vcAogICAgICAgICAgKi8KKyAgICAgICAgQERlcHJlY2F0ZWQKICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQUdHUkVHQVRJT05fTU9ERV9JTU1FRElBVEUgPSAxOwogCiAgICAgICAgIC8qKgpAQCAtMTcwMCw5ICsyMTYwLDcgQEAKICAgICAgICAgLyoqCiAgICAgICAgICAqIEEgc3ViLWRpcmVjdG9yeSBvZiBhIHNpbmdsZSByYXcgY29udGFjdCB0aGF0IGNvbnRhaW5zIGFsbCBvZiBpdHMKICAgICAgICAgICoge0BsaW5rIENvbnRhY3RzQ29udHJhY3QuRGF0YX0gcm93cy4gVG8gYWNjZXNzIHRoaXMgZGlyZWN0b3J5Ci0gICAgICAgICAqIGFwcGVuZCB7QGxpbmsgRGF0YSNDT05URU5UX0RJUkVDVE9SWX0gdG8gdGhlIGNvbnRhY3QgVVJJLgotICAgICAgICAgKgotICAgICAgICAgKiBUT0RPOiBkZXByZWNhdGUgaW4gZmF2b3Igb2Yge0BsaW5rIFJhd0NvbnRhY3RzLkVudGl0eX0uCisgICAgICAgICAqIGFwcGVuZCB7QGxpbmsgRGF0YSNDT05URU5UX0RJUkVDVE9SWX0gdG8gdGhlIHJhdyBjb250YWN0IFVSSS4KICAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgRGF0YSBpbXBsZW1lbnRzIEJhc2VDb2x1bW5zLCBEYXRhQ29sdW1ucyB7CiAgICAgICAgICAgICAvKioKQEAgLTE3MjEsNyArMjE3OSw3IEBACiAgICAgICAgICAqIDxwPgogICAgICAgICAgKiBBIHN1Yi1kaXJlY3Rvcnkgb2YgYSBzaW5nbGUgcmF3IGNvbnRhY3QgdGhhdCBjb250YWlucyBhbGwgb2YgaXRzCiAgICAgICAgICAqIHtAbGluayBDb250YWN0c0NvbnRyYWN0LkRhdGF9IHJvd3MuIFRvIGFjY2VzcyB0aGlzIGRpcmVjdG9yeSBhcHBlbmQKLSAgICAgICAgICoge0BsaW5rICNDT05URU5UX0RJUkVDVE9SWX0gdG8gdGhlIGNvbnRhY3QgVVJJLiBTZWUKKyAgICAgICAgICoge0BsaW5rIFJhd0NvbnRhY3RzLkVudGl0eSNDT05URU5UX0RJUkVDVE9SWX0gdG8gdGhlIHJhdyBjb250YWN0IFVSSS4gU2VlCiAgICAgICAgICAqIHtAbGluayBSYXdDb250YWN0c0VudGl0eX0gZm9yIGEgc3RhbmQtYWxvbmUgdGFibGUgY29udGFpbmluZyB0aGUgc2FtZQogICAgICAgICAgKiBkYXRhLgogICAgICAgICAgKiA8L3A+CkBAIC0xNzMzLDEwICsyMTkxLDEwIEBACiAgICAgICAgICAqIG51bGwuCiAgICAgICAgICAqIDwvcD4KICAgICAgICAgICogPHA+Ci0gICAgICAgICAqIEVudGl0eSByZWFkcyBhbGwKLSAgICAgICAgICogZGF0YSBmb3IgYSByYXcgY29udGFjdCBpbiBvbmUgdHJhbnNhY3Rpb24sIHRvIGd1YXJhbnRlZQotICAgICAgICAgKiBjb25zaXN0ZW5jeS4KLSAgICAgICAgICogPC9wPgorICAgICAgICAgKiBVc2luZyBFbnRpdHkgc2hvdWxkIGJlIHByZWZlcnJlZCB0byB1c2luZyB0d28gc2VwYXJhdGUgcXVlcmllczoKKyAgICAgICAgICogUmF3Q29udGFjdHMgZm9sbG93ZWQgYnkgRGF0YS4gVGhlIHJlYXNvbiBpcyB0aGF0IEVudGl0eSByZWFkcyBhbGwKKyAgICAgICAgICogZGF0YSBmb3IgYSByYXcgY29udGFjdCBpbiBvbmUgdHJhbnNhY3Rpb24sIHNvIHRoZXJlIGlzIG5vIHBvc3NpYmlsaXR5CisgICAgICAgICAqIG9mIHRoZSBkYXRhIGNoYW5naW5nIGJldHdlZW4gdGhlIHR3byBxdWVyaWVzLgogICAgICAgICAgKi8KICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBFbnRpdHkgaW1wbGVtZW50cyBCYXNlQ29sdW1ucywgRGF0YUNvbHVtbnMgewogICAgICAgICAgICAgLyoqCkBAIC0xNzUxLDcgKzIyMDksNyBAQAogICAgICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09OVEVOVF9ESVJFQ1RPUlkgPSAiZW50aXR5IjsKIAogICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgKiBUaGUgSUQgb2YgdGhlIGRhdGEgY29sdW1uLiBUaGUgdmFsdWUgd2lsbCBiZSBudWxsIGlmIHRoaXMgcmF3IGNvbnRhY3QgaGFzIG5vCisgICAgICAgICAgICAgKiBUaGUgSUQgb2YgdGhlIGRhdGEgcm93LiBUaGUgdmFsdWUgd2lsbCBiZSBudWxsIGlmIHRoaXMgcmF3IGNvbnRhY3QgaGFzIG5vCiAgICAgICAgICAgICAgKiBkYXRhIHJvd3MuCiAgICAgICAgICAgICAgKiA8UD5UeXBlOiBJTlRFR0VSPC9QPgogICAgICAgICAgICAgICovCkBAIC0xODM5LDI4ICsyMjk3LDIxIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGF0YS5EQVRBX1ZFUlNJT04pOwogICAgICAgICAgICAgICAgICAgICBmb3IgKFN0cmluZyBrZXkgOiBEQVRBX0tFWVMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIGludCBjb2x1bW5JbmRleCA9IGN1cnNvci5nZXRDb2x1bW5JbmRleE9yVGhyb3coa2V5KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjdXJzb3IuaXNOdWxsKGNvbHVtbkluZGV4KSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRvbid0IHB1dCBhbnl0aGluZwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChjdXJzb3IuZ2V0VHlwZShjb2x1bW5JbmRleCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEN1cnNvci5GSUVMRF9UWVBFX05VTEw6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRvbid0IHB1dCBhbnl0aGluZworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEN1cnNvci5GSUVMRF9UWVBFX0lOVEVHRVI6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBDdXJzb3IuRklFTERfVFlQRV9GTE9BVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEN1cnNvci5GSUVMRF9UWVBFX1NUUklORzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3YucHV0KGtleSwgY3Vyc29yLmdldFN0cmluZyhjb2x1bW5JbmRleCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFNRTGl0ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQ3Vyc29yLkZJRUxEX1RZUEVfQkxPQjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3YucHV0KGtleSwgY3Vyc29yLmdldEJsb2IoY29sdW1uSW5kZXgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkludmFsaWQgb3IgdW5oYW5kbGVkIGRhdGEgdHlwZSIpOwogICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ETzogZ28gYmFjayB0byB0aGlzIHZlcnNpb24gb2YgdGhlIGNvZGUgd2hlbiBidWcKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIGh0dHA6Ly9iL2lzc3VlP2lkPTIzMDYzNzAgaXMgZml4ZWQuCi0vLyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjdXJzb3IuaXNOdWxsKGNvbHVtbkluZGV4KSkgewotLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZG9uJ3QgcHV0IGFueXRoaW5nCi0vLyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY3Vyc29yLmlzTG9uZyhjb2x1bW5JbmRleCkpIHsKLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlcy5wdXQoa2V5LCBjdXJzb3IuZ2V0TG9uZyhjb2x1bW5JbmRleCkpOwotLy8gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGN1cnNvci5pc0Zsb2F0KGNvbHVtbkluZGV4KSkgewotLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVzLnB1dChrZXksIGN1cnNvci5nZXRGbG9hdChjb2x1bW5JbmRleCkpOwotLy8gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGN1cnNvci5pc1N0cmluZyhjb2x1bW5JbmRleCkpIHsKLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlcy5wdXQoa2V5LCBjdXJzb3IuZ2V0U3RyaW5nKGNvbHVtbkluZGV4KSk7Ci0vLyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY3Vyc29yLmlzQmxvYihjb2x1bW5JbmRleCkpIHsKLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlcy5wdXQoa2V5LCBjdXJzb3IuZ2V0QmxvYihjb2x1bW5JbmRleCkpOwotLy8gICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgY29udGFjdC5hZGRTdWJWYWx1ZShDb250YWN0c0NvbnRyYWN0LkRhdGEuQ09OVEVOVF9VUkksIGN2KTsKICAgICAgICAgICAgICAgICB9IHdoaWxlIChjdXJzb3IubW92ZVRvTmV4dCgpKTsKQEAgLTE5NjUsMTggKzI0MTYsMTkgQEAKICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hBVF9DQVBBQklMSVRZID0gImNoYXRfY2FwYWJpbGl0eSI7CiAKICAgICAgICAgLyoqCi0gICAgICAgICAqIEFuIGFsbG93ZWQgdmFsdWUgb2Yge0BsaW5rICNDSEFUX0NBUEFCSUxJVFl9LiBJbmRpY2F0ZXMgdGhhdCB0aGUgY29udGFjdCdzIGRldmljZSBjYW4KKyAgICAgICAgICogQW4gYWxsb3dlZCBmbGFnIG9mIHtAbGluayAjQ0hBVF9DQVBBQklMSVRZfS4gSW5kaWNhdGVzIGF1ZGlvLWNoYXQgY2FwYWJpbGl0eSAobWljcm9waG9uZQorICAgICAgICAgKiBhbmQgc3BlYWtlcikKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENBUEFCSUxJVFlfSEFTX1ZPSUNFID0gMTsKKworICAgICAgICAvKioKKyAgICAgICAgICogQW4gYWxsb3dlZCBmbGFnIG9mIHtAbGluayAjQ0hBVF9DQVBBQklMSVRZfS4gSW5kaWNhdGVzIHRoYXQgdGhlIGNvbnRhY3QncyBkZXZpY2UgY2FuCiAgICAgICAgICAqIGRpc3BsYXkgYSB2aWRlbyBmZWVkLgogICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ0FQQUJJTElUWV9IQVNfVklERU9fUExBWUJBQ0tfT05MWSA9IDE7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENBUEFCSUxJVFlfSEFTX1ZJREVPID0gMjsKIAogICAgICAgICAvKioKLSAgICAgICAgICogQW4gYWxsb3dlZCB2YWx1ZSBvZiB7QGxpbmsgI0NIQVRfQ0FQQUJJTElUWX0uIEluZGljYXRlcyBhdWRpby1jaGF0IGNhcGFiaWxpdHkuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDQVBBQklMSVRZX0hBU19WT0lDRSA9IDI7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEFuIGFsbG93ZWQgdmFsdWUgb2Yge0BsaW5rICNDSEFUX0NBUEFCSUxJVFl9LiBJbmRpY2F0ZXMgdGhhdCB0aGUgY29udGFjdCdzIGRldmljZSBoYXMgYQorICAgICAgICAgKiBBbiBhbGxvd2VkIGZsYWcgb2Yge0BsaW5rICNDSEFUX0NBUEFCSUxJVFl9LiBJbmRpY2F0ZXMgdGhhdCB0aGUgY29udGFjdCdzIGRldmljZSBoYXMgYQogICAgICAgICAgKiBjYW1lcmEgdGhhdCBjYW4gYmUgdXNlZCBmb3IgdmlkZW8gY2hhdCAoZS5nLiBhIGZyb250LWZhY2luZyBjYW1lcmEgb24gYSBwaG9uZSkuCiAgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDQVBBQklMSVRZX0hBU19DQU1FUkEgPSA0OwpAQCAtMjAyMyw2ICsyNDc1LDEzIEBACiAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElTX1NVUEVSX1BSSU1BUlkgPSAiaXNfc3VwZXJfcHJpbWFyeSI7CiAKICAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSAicmVhZC1vbmx5IiBmbGFnOiAiMCIgYnkgZGVmYXVsdCwgIjEiIGlmIHRoZSByb3cgY2Fubm90IGJlIG1vZGlmaWVkIG9yCisgICAgICAgICAqIGRlbGV0ZWQgZXhjZXB0IGJ5IGEgc3luYyBhZGFwdGVyLiAgU2VlIHtAbGluayBDb250YWN0c0NvbnRyYWN0I0NBTExFUl9JU19TWU5DQURBUFRFUn0uCisgICAgICAgICAqIDxQPlR5cGU6IElOVEVHRVI8L1A+CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJU19SRUFEX09OTFkgPSAiaXNfcmVhZF9vbmx5IjsKKworICAgICAgICAvKioKICAgICAgICAgICogVGhlIHZlcnNpb24gb2YgdGhpcyBkYXRhIHJlY29yZC4gVGhpcyBpcyBhIHJlYWQtb25seSB2YWx1ZS4gVGhlIGRhdGEgY29sdW1uIGlzCiAgICAgICAgICAqIGd1YXJhbnRlZWQgdG8gbm90IGNoYW5nZSB3aXRob3V0IHRoZSB2ZXJzaW9uIGdvaW5nIHVwLiBUaGlzIHZhbHVlIGlzIG1vbm90b25pY2FsbHkKICAgICAgICAgICogaW5jcmVhc2luZy4KQEAgLTI4NTcsNiArMzMxNiwxNCBAQAogICAgICAgICAgKiA8UD5UeXBlOiBURVhUPC9QPgogICAgICAgICAgKi8KICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTEFCRUwgPSAibGFiZWwiOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgcGhvbmUgbnVtYmVyJ3MgRTE2NCByZXByZXNlbnRhdGlvbi4KKyAgICAgICAgICogPFA+VHlwZTogVEVYVDwvUD4KKyAgICAgICAgICoKKyAgICAgICAgICogQGhpZGUKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5PUk1BTElaRURfTlVNQkVSID0gIm5vcm1hbGl6ZWRfbnVtYmVyIjsKICAgICB9CiAKICAgICAvKioKQEAgLTMxMjksMTAgKzM1OTYsMTEgQEAKICAgICAgKiA8dGQ+aW50PC90ZD4KICAgICAgKiA8dGQ+e0BsaW5rICNDSEFUX0NBUEFCSUxJVFl9PC90ZD4KICAgICAgKiA8dGQ+cmVhZC93cml0ZTwvdGQ+Ci0gICAgICogPHRkPkNvbnRhY3QgSU0gY2hhdCBjb21wYXRpYmlsaXR5IHZhbHVlLiBUaGUgYWxsb3dlZCB2YWx1ZXMgYXJlOgorICAgICAqIDx0ZD5Db250YWN0IElNIGNoYXQgY29tcGF0aWJpbGl0eSB2YWx1ZS4gVGhlIGFsbG93ZWQgdmFsdWVzIGNvbWJpbmF0aW9ucyBvZiB0aGUgZm9sbG93aW5nCisgICAgICogZmxhZ3MuIElmIE5vbmUgb2YgdGhlc2UgZmxhZ3MgaXMgc2V0LCB0aGUgZGV2aWNlIGNhbiBvbmx5IGRvIHRleHQgbWVzc2FnaW5nLgogICAgICAqIDxwPgogICAgICAqIDx1bD4KLSAgICAgKiA8bGk+e0BsaW5rICNDQVBBQklMSVRZX0hBU19WSURFT19QTEFZQkFDS19PTkxZfTwvbGk+CisgICAgICogPGxpPntAbGluayAjQ0FQQUJJTElUWV9IQVNfVklERU99PC9saT4KICAgICAgKiA8bGk+e0BsaW5rICNDQVBBQklMSVRZX0hBU19WT0lDRX08L2xpPgogICAgICAqIDxsaT57QGxpbmsgI0NBUEFCSUxJVFlfSEFTX0NBTUVSQX08L2xpPgogICAgICAqIDwvdWw+CkBAIC0zNzA4LDYgKzQxNzYsMTQgQEAKICAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5VTUJFUiA9IERBVEE7CiAKICAgICAgICAgICAgIC8qKgorICAgICAgICAgICAgICogVGhlIHBob25lIG51bWJlcidzIEUxNjQgcmVwcmVzZW50YXRpb24uCisgICAgICAgICAgICAgKiA8UD5UeXBlOiBURVhUPC9QPgorICAgICAgICAgICAgICoKKyAgICAgICAgICAgICAqIEBoaWRlCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5PUk1BTElaRURfTlVNQkVSID0gREFUQTQ7CisKKyAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgICogQGRlcHJlY2F0ZWQgdXNlIHtAbGluayAjZ2V0VHlwZUxhYmVsKFJlc291cmNlcywgaW50LCBDaGFyU2VxdWVuY2UpfSBpbnN0ZWFkLgogICAgICAgICAgICAgICogQGhpZGUKICAgICAgICAgICAgICAqLwpAQCAtMzc4OSw3ICs0MjY1LDcgQEAKICAgICAgICAgICogPC90cj4KICAgICAgICAgICogPHRyPgogICAgICAgICAgKiA8dGQ+U3RyaW5nPC90ZD4KLSAgICAgICAgICogPHRkPntAbGluayAjREFUQX08L3RkPgorICAgICAgICAgKiA8dGQ+e0BsaW5rICNBRERSRVNTfTwvdGQ+CiAgICAgICAgICAqIDx0ZD57QGxpbmsgI0RBVEExfTwvdGQ+CiAgICAgICAgICAqIDx0ZD5FbWFpbCBhZGRyZXNzIGl0c2VsZi48L3RkPgogICAgICAgICAgKiA8L3RyPgpAQCAtMzg4MCw3ICs0MzU2LDYgQEAKICAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgICogVGhlIGVtYWlsIGFkZHJlc3MuCiAgICAgICAgICAgICAgKiA8UD5UeXBlOiBURVhUPC9QPgotICAgICAgICAgICAgICogQGhpZGUgVE9ETzogVW5oaWRlIGluIGEgc2VwYXJhdGUgQ0wKICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUREUkVTUyA9IERBVEExOwogCkBAIC00OTk4LDYgKzU0NzMsMjMgQEAKICAgICAgICAgICogVHlwZTogSU5URUdFUiAoYm9vbGVhbikKICAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNIT1VMRF9TWU5DID0gInNob3VsZF9zeW5jIjsKKworICAgICAgICAvKioKKyAgICAgICAgICogQW55IG5ld2x5IGNyZWF0ZWQgY29udGFjdHMgd2lsbCBhdXRvbWF0aWNhbGx5IGJlIGFkZGVkIHRvIGdyb3VwcyB0aGF0IGhhdmUgdGhpcworICAgICAgICAgKiBmbGFnIHNldCB0byB0cnVlLgorICAgICAgICAgKiA8cD4KKyAgICAgICAgICogVHlwZTogSU5URUdFUiAoYm9vbGVhbikKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFVVE9fQUREID0gImF1dG9fYWRkIjsKKworICAgICAgICAvKioKKyAgICAgICAgICogV2hlbiBhIGNvbnRhY3RzIGlzIG1hcmtlZCBhcyBhIGZhdm9yaXRlcyBpdCB3aWxsIGJlIGF1dG9tYXRpY2FsbHkgYWRkZWQKKyAgICAgICAgICogdG8gdGhlIGdyb3VwcyB0aGF0IGhhdmUgdGhpcyBmbGFnIHNldCwgYW5kIHdoZW4gaXQgaXMgcmVtb3ZlZCBmcm9tIGZhdm9yaXRlcworICAgICAgICAgKiBpdCB3aWxsIGJlIHJlbW92ZWQgZnJvbSB0aGVzZSBncm91cHMuCisgICAgICAgICAqIDxwPgorICAgICAgICAgKiBUeXBlOiBJTlRFR0VSIChib29sZWFuKQorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkFWT1JJVEVTID0gImZhdm9yaXRlcyI7CiAgICAgfQogCiAgICAgLyoqCkBAIC01MTM4LDYgKzU2MzAsOCBAQAogICAgICAgICAgICAgICAgIERhdGFiYXNlVXRpbHMuY3Vyc29yTG9uZ1RvQ29udGVudFZhbHVlc0lmUHJlc2VudChjdXJzb3IsIHZhbHVlcywgREVMRVRFRCk7CiAgICAgICAgICAgICAgICAgRGF0YWJhc2VVdGlscy5jdXJzb3JTdHJpbmdUb0NvbnRlbnRWYWx1ZXNJZlByZXNlbnQoY3Vyc29yLCB2YWx1ZXMsIE5PVEVTKTsKICAgICAgICAgICAgICAgICBEYXRhYmFzZVV0aWxzLmN1cnNvclN0cmluZ1RvQ29udGVudFZhbHVlc0lmUHJlc2VudChjdXJzb3IsIHZhbHVlcywgU0hPVUxEX1NZTkMpOworICAgICAgICAgICAgICAgIERhdGFiYXNlVXRpbHMuY3Vyc29yU3RyaW5nVG9Db250ZW50VmFsdWVzSWZQcmVzZW50KGN1cnNvciwgdmFsdWVzLCBGQVZPUklURVMpOworICAgICAgICAgICAgICAgIERhdGFiYXNlVXRpbHMuY3Vyc29yU3RyaW5nVG9Db250ZW50VmFsdWVzSWZQcmVzZW50KGN1cnNvciwgdmFsdWVzLCBBVVRPX0FERCk7CiAgICAgICAgICAgICAgICAgY3Vyc29yLm1vdmVUb05leHQoKTsKICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEVudGl0eSh2YWx1ZXMpOwogICAgICAgICAgICAgfQpAQCAtNTY1NCw2ICs2MTQ4LDI4IEBACiAgICAgICAgICAgICAgICAgImNvbS5hbmRyb2lkLmNvbnRhY3RzLmFjdGlvbi5TSE9XX09SX0NSRUFURV9DT05UQUNUIjsKIAogICAgICAgICAvKioKKyAgICAgICAgICogU3RhcnRzIGFuIEFjdGl2aXR5IHRoYXQgbGV0cyB0aGUgdXNlciBzZWxlY3QgdGhlIG11bHRpcGxlIHBob25lcyBmcm9tIGEKKyAgICAgICAgICogbGlzdCBvZiBwaG9uZSBudW1iZXJzIHdoaWNoIGNvbWUgZnJvbSB0aGUgY29udGFjdHMgb3IKKyAgICAgICAgICoge0BsaW5rICNFWFRSQV9QSE9ORV9VUklTfS4KKyAgICAgICAgICogPHA+CisgICAgICAgICAqIFRoZSBwaG9uZSBudW1iZXJzIGJlaW5nIHBhc3NlZCBpbiB0aHJvdWdoIHtAbGluayAjRVhUUkFfUEhPTkVfVVJJU30KKyAgICAgICAgICogY291bGQgYmVsb25nIHRvIHRoZSBjb250YWN0cyBvciBub3QsIGFuZCB3aWxsIGJlIHNlbGVjdGVkIGJ5IGRlZmF1bHQuCisgICAgICAgICAqIDxwPgorICAgICAgICAgKiBUaGUgdXNlcidzIHNlbGVjdGlvbiB3aWxsIGJlIHJldHVybmVkIGZyb20KKyAgICAgICAgICoge0BsaW5rIGFuZHJvaWQuYXBwLkFjdGl2aXR5I29uQWN0aXZpdHlSZXN1bHQoaW50LCBpbnQsIGFuZHJvaWQuY29udGVudC5JbnRlbnQpfQorICAgICAgICAgKiBpZiB0aGUgcmVzdWx0Q29kZSBpcworICAgICAgICAgKiB7QGxpbmsgYW5kcm9pZC5hcHAuQWN0aXZpdHkjUkVTVUxUX09LfSwgdGhlIGFycmF5IG9mIHBpY2tlZCBwaG9uZQorICAgICAgICAgKiBudW1iZXJzIGFyZSBpbiB0aGUgSW50ZW50J3MKKyAgICAgICAgICoge0BsaW5rICNFWFRSQV9QSE9ORV9VUklTfTsgb3RoZXJ3aXNlLCB0aGUKKyAgICAgICAgICoge0BsaW5rIGFuZHJvaWQuYXBwLkFjdGl2aXR5I1JFU1VMVF9DQU5DRUxFRH0gaXMgcmV0dXJuZWQgaWYgdGhlIHVzZXIKKyAgICAgICAgICogbGVmdCB0aGUgQWN0aXZpdHkgd2l0aG91dCBjaGFuZ2luZyB0aGUgc2VsZWN0aW9uLgorICAgICAgICAgKgorICAgICAgICAgKiBAaGlkZQorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUNUSU9OX0dFVF9NVUxUSVBMRV9QSE9ORVMgPQorICAgICAgICAgICAgICAgICJjb20uYW5kcm9pZC5jb250YWN0cy5hY3Rpb24uR0VUX01VTFRJUExFX1BIT05FUyI7CisKKyAgICAgICAgLyoqCiAgICAgICAgICAqIFVzZWQgd2l0aCB7QGxpbmsgI1NIT1dfT1JfQ1JFQVRFX0NPTlRBQ1R9IHRvIGZvcmNlIGNyZWF0aW5nIGEgbmV3CiAgICAgICAgICAqIGNvbnRhY3QgaWYgbm8gbWF0Y2hpbmcgY29udGFjdCBmb3VuZC4gT3RoZXJ3aXNlLCBkZWZhdWx0IGJlaGF2aW9yIGlzCiAgICAgICAgICAqIHRvIHByb21wdCB1c2VyIHdpdGggZGlhbG9nIGJlZm9yZSBjcmVhdGluZy4KQEAgLTU2NzQsNiArNjE5MCwyMyBAQAogICAgICAgICAgICAgImNvbS5hbmRyb2lkLmNvbnRhY3RzLmFjdGlvbi5DUkVBVEVfREVTQ1JJUFRJT04iOwogCiAgICAgICAgIC8qKgorICAgICAgICAgKiBVc2VkIHdpdGgge0BsaW5rICNBQ1RJT05fR0VUX01VTFRJUExFX1BIT05FU30gYXMgdGhlIGlucHV0IG9yIG91dHB1dCB2YWx1ZS4KKyAgICAgICAgICogPHA+CisgICAgICAgICAqIFRoZSBwaG9uZSBudW1iZXJzIHdhbnQgdG8gYmUgcGlja2VkIGJ5IGRlZmF1bHQgc2hvdWxkIGJlIHBhc3NlZCBpbiBhcworICAgICAgICAgKiBpbnB1dCB2YWx1ZS4gVGhlc2UgcGhvbmUgbnVtYmVycyBjb3VsZCBiZWxvbmcgdG8gdGhlIGNvbnRhY3RzIG9yIG5vdC4KKyAgICAgICAgICogPHA+CisgICAgICAgICAqIFRoZSBwaG9uZSBudW1iZXJzIHdoaWNoIHdlcmUgcGlja2VkIGJ5IHRoZSB1c2VyIGFyZSByZXR1cm5lZCBhcyBvdXRwdXQKKyAgICAgICAgICogdmFsdWUuCisgICAgICAgICAqIDxwPgorICAgICAgICAgKiBUeXBlOiBhcnJheSBvZiBVUklzLCB0aGUgdGVsIFVSSSBpcyB1c2VkIGZvciB0aGUgcGhvbmUgbnVtYmVycyB3aGljaCBkb24ndAorICAgICAgICAgKiBiZWxvbmcgdG8gYW55IGNvbnRhY3QsIHRoZSBjb250ZW50IFVSSSBpcyB1c2VkIGZvciBwaG9uZSBpZCBpbiBjb250YWN0cy4KKyAgICAgICAgICoKKyAgICAgICAgICogQGhpZGUKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVFJBX1BIT05FX1VSSVMgPQorICAgICAgICAgICAgImNvbS5hbmRyb2lkLmNvbnRhY3RzLmV4dHJhLlBIT05FX1VSSVMiOworCisgICAgICAgIC8qKgogICAgICAgICAgKiBPcHRpb25hbCBleHRyYSB1c2VkIHdpdGgge0BsaW5rICNTSE9XX09SX0NSRUFURV9DT05UQUNUfSB0byBzcGVjaWZ5IGEKICAgICAgICAgICogZGlhbG9nIGxvY2F0aW9uIHVzaW5nIHNjcmVlbiBjb29yZGluYXRlcy4gV2hlbiBub3Qgc3BlY2lmaWVkLCB0aGUKICAgICAgICAgICogZGlhbG9nIHdpbGwgYmUgY2VudGVyZWQuCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9wcm92aWRlci9Ecm1TdG9yZS5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvcHJvdmlkZXIvRHJtU3RvcmUuamF2YQppbmRleCBjNDM4YWM0Li4zNGYyZjBkIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9wcm92aWRlci9Ecm1TdG9yZS5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3Byb3ZpZGVyL0RybVN0b3JlLmphdmEKQEAgLTEzMSw3ICsxMzEsNyBAQAogICAgICAqIFV0aWxpdHkgZnVuY3Rpb24gZm9yIGluc2VydGluZyBhIGZpbGUgc3RyZWFtIGludG8gdGhlIERSTSBjb250ZW50IHByb3ZpZGVyLgogICAgICAqCiAgICAgICogQHBhcmFtIGNyIFRoZSBjb250ZW50IHJlc29sdmVyIHRvIHVzZQotICAgICAqIEBwYXJhbSBmaWxlU3RyZWFtIFRoZSBGaWxlSW5wdXRTdHJlYW0gdG8gaW5zZXJ0CisgICAgICogQHBhcmFtIGZpcyBUaGUgRmlsZUlucHV0U3RyZWFtIHRvIGluc2VydAogICAgICAqIEBwYXJhbSB0aXRsZSBUaGUgdGl0bGUgZm9yIHRoZSBjb250ZW50IChvciBudWxsKQogICAgICAqIEByZXR1cm4gdXJpIHRvIHRoZSBEUk0gcmVjb3JkIG9yIG51bGwKICAgICAgKi8KQEAgLTE0MywxMSArMTQzLDExIEBACiAgICAgICAgICAgICBEcm1SYXdDb250ZW50IGNvbnRlbnQgPSBuZXcgRHJtUmF3Q29udGVudChmaXMsIChpbnQpIGZpcy5hdmFpbGFibGUoKSwKICAgICAgICAgICAgICAgICAgICAgRHJtUmF3Q29udGVudC5EUk1fTUlNRVRZUEVfTUVTU0FHRV9TVFJJTkcpOwogICAgICAgICAgICAgU3RyaW5nIG1pbWVUeXBlID0gY29udGVudC5nZXRDb250ZW50VHlwZSgpOworICAgICAgICAgICAgbG9uZyBzaXplID0gZmlzLmdldENoYW5uZWwoKS5zaXplKCk7CiAKICAgICAgICAgICAgIERybVJpZ2h0c01hbmFnZXIgbWFuYWdlciA9IG1hbmFnZXIgPSBEcm1SaWdodHNNYW5hZ2VyLmdldEluc3RhbmNlKCk7CiAgICAgICAgICAgICBEcm1SaWdodHMgcmlnaHRzID0gbWFuYWdlci5xdWVyeVJpZ2h0cyhjb250ZW50KTsKICAgICAgICAgICAgIElucHV0U3RyZWFtIHN0cmVhbSA9IGNvbnRlbnQuZ2V0Q29udGVudElucHV0U3RyZWFtKHJpZ2h0cyk7Ci0gICAgICAgICAgICBsb25nIHNpemUgPSBzdHJlYW0uYXZhaWxhYmxlKCk7CiAKICAgICAgICAgICAgIFVyaSBjb250ZW50VXJpID0gbnVsbDsKICAgICAgICAgICAgIGlmIChtaW1lVHlwZS5zdGFydHNXaXRoKCJhdWRpby8iKSkgewpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvcHJvdmlkZXIvTWVkaWFTdG9yZS5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvcHJvdmlkZXIvTWVkaWFTdG9yZS5qYXZhCmluZGV4IDA3NWRhMzMuLjE0MTdlZjUgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3Byb3ZpZGVyL01lZGlhU3RvcmUuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9wcm92aWRlci9NZWRpYVN0b3JlLmphdmEKQEAgLTI1Myw5ICsyNTMsMTA3IEBACiAgICAgICAgICAqIDxQPlR5cGU6IFRFWFQ8L1A+CiAgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNSU1FX1RZUEUgPSAibWltZV90eXBlIjsKKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIHJvdyBJRCBpbiB0aGUgTVRQIG9iamVjdCB0YWJsZSBjb3JyZXNwb25kaW5nIHRvIHRoaXMgbWVkaWEgZmlsZS4KKyAgICAgICAgICogPFA+VHlwZTogSU5URUdFUjwvUD4KKyAgICAgICAgICogQGhpZGUKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1UUF9PQkpFQ1RfSUQgPSAib2JqZWN0X2lkIjsKKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIE1UUCBvYmplY3QgaGFuZGxlIG9mIGEgbmV3bHkgdHJhbnNmZXJlZCBmaWxlLgorICAgICAgICAgKiBVc2VkIHRvIHBhc3MgdGhlIG5ldyBmaWxlJ3Mgb2JqZWN0IGhhbmRsZSB0aHJvdWdoIHRoZSBtZWRpYSBzY2FubmVyCisgICAgICAgICAqIGZyb20gTVRQIHRvIHRoZSBtZWRpYSBwcm92aWRlcgorICAgICAgICAgKiBGb3IgaW50ZXJuYWwgdXNlIG9ubHkgYnkgTVRQLCBtZWRpYSBzY2FubmVyIGFuZCBtZWRpYSBwcm92aWRlci4KKyAgICAgICAgICogPFA+VHlwZTogSU5URUdFUjwvUD4KKyAgICAgICAgICogQGhpZGUKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1FRElBX1NDQU5ORVJfTkVXX09CSkVDVF9JRCA9ICJtZWRpYV9zY2FubmVyX25ld19vYmplY3RfaWQiOwogICAgICB9CiAKICAgICAvKioKKyAgICAgKiBNZWRpYSBwcm92aWRlciB0YWJsZSBjb250YWluaW5nIGFuIGluZGV4IG9mIGFsbCBmaWxlcyBpbiB0aGUgc3RvcmFnZS4KKyAgICAgKiBUaGlzIGNhbiBiZSB1c2VkIGJ5IGFwcGxpY2F0aW9ucyB0byBmaW5kIGFsbCBkb2N1bWVudHMgb2YgYSBwYXJ0aWN1bGFyIHR5cGUKKyAgICAgKiBhbmQgaXMgYWxzbyB1c2VkIGludGVybmFsbHkgYnkgdGhlIGRldmljZSBzaWRlIE1UUCBpbXBsZW1lbnRhdGlvbi4KKyAgICAgKiBAaGlkZQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgRmlsZXMgeworCisgICAgICAgIHB1YmxpYyBzdGF0aWMgVXJpIGdldENvbnRlbnRVcmkoU3RyaW5nIHZvbHVtZU5hbWUpIHsKKyAgICAgICAgICAgIHJldHVybiBVcmkucGFyc2UoQ09OVEVOVF9BVVRIT1JJVFlfU0xBU0ggKyB2b2x1bWVOYW1lICsKKyAgICAgICAgICAgICAgICAgICAgIi9maWxlIik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFVyaSBnZXRDb250ZW50VXJpKFN0cmluZyB2b2x1bWVOYW1lLAorICAgICAgICAgICAgICAgIGxvbmcgZmlsZUlkKSB7CisgICAgICAgICAgICByZXR1cm4gVXJpLnBhcnNlKENPTlRFTlRfQVVUSE9SSVRZX1NMQVNIICsgdm9sdW1lTmFtZQorICAgICAgICAgICAgICAgICAgICArICIvZmlsZS8iICsgZmlsZUlkKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBzdGF0aWMgVXJpIGdldE10cE9iamVjdHNVcmkoU3RyaW5nIHZvbHVtZU5hbWUpIHsKKyAgICAgICAgICAgIHJldHVybiBVcmkucGFyc2UoQ09OVEVOVF9BVVRIT1JJVFlfU0xBU0ggKyB2b2x1bWVOYW1lICsKKyAgICAgICAgICAgICAgICAgICAgIi9vYmplY3QiKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgVXJpIGdldE10cE9iamVjdHNVcmkoU3RyaW5nIHZvbHVtZU5hbWUsCisgICAgICAgICAgICAgICAgbG9uZyBmaWxlSWQpIHsKKyAgICAgICAgICAgIHJldHVybiBVcmkucGFyc2UoQ09OVEVOVF9BVVRIT1JJVFlfU0xBU0ggKyB2b2x1bWVOYW1lCisgICAgICAgICAgICAgICAgICAgICsgIi9vYmplY3QvIiArIGZpbGVJZCk7CisgICAgICAgIH0KKworICAgICAgICAvLyBVc2VkIHRvIGltcGxlbWVudCB0aGUgTVRQIEdldE9iamVjdFJlZmVyZW5jZXMgYW5kIFNldE9iamVjdFJlZmVyZW5jZXMgY29tbWFuZHMuCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgVXJpIGdldE10cFJlZmVyZW5jZXNVcmkoU3RyaW5nIHZvbHVtZU5hbWUsCisgICAgICAgICAgICAgICAgbG9uZyBmaWxlSWQpIHsKKyAgICAgICAgICAgIHJldHVybiBVcmkucGFyc2UoQ09OVEVOVF9BVVRIT1JJVFlfU0xBU0ggKyB2b2x1bWVOYW1lCisgICAgICAgICAgICAgICAgICAgICsgIi9vYmplY3QvIiArIGZpbGVJZCArICIvcmVmZXJlbmNlcyIpOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEZpZWxkcyBmb3IgbWFzdGVyIHRhYmxlIGZvciBhbGwgbWVkaWEgZmlsZXMuCisgICAgICAgICAqIFRhYmxlIGFsc28gY29udGFpbnMgTWVkaWFDb2x1bW5zLl9JRCwgREFUQSwgU0laRSBhbmQgREFURV9NT0RJRklFRC4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBpbnRlcmZhY2UgRmlsZUNvbHVtbnMgZXh0ZW5kcyBNZWRpYUNvbHVtbnMgeworICAgICAgICAgICAgLyoqCisgICAgICAgICAgICAgKiBUaGUgTVRQIGZvcm1hdCBjb2RlIG9mIHRoZSBmaWxlCisgICAgICAgICAgICAgKiA8UD5UeXBlOiBJTlRFR0VSPC9QPgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGT1JNQVQgPSAiZm9ybWF0IjsKKworICAgICAgICAgICAgLyoqCisgICAgICAgICAgICAgKiBUaGUgaW5kZXggb2YgdGhlIHBhcmVudCBkaXJlY3Rvcnkgb2YgdGhlIGZpbGUKKyAgICAgICAgICAgICAqIDxQPlR5cGU6IElOVEVHRVI8L1A+CisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBUkVOVCA9ICJwYXJlbnQiOworCisgICAgICAgICAgICAvKioKKyAgICAgICAgICAgICAqIElkZW50aWZpZXIgZm9yIHRoZSBtZWRpYSB0YWJsZSBjb250YWluaW5nIHRoZSBmaWxlLgorICAgICAgICAgICAgICogVXNlZCBpbnRlcm5hbGx5IGJ5IE1lZGlhUHJvdmlkZXIKKyAgICAgICAgICAgICAqIDxQPlR5cGU6IElOVEVHRVI8L1A+CisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1FRElBX1RBQkxFID0gIm1lZGlhX3RhYmxlIjsKKworICAgICAgICAgICAgLyoqCisgICAgICAgICAgICAgKiBUaGUgSUQgb2YgdGhlIGZpbGUgaW4gaXRzIG1lZGlhIHRhYmxlLgorICAgICAgICAgICAgICogPFA+VHlwZTogSU5URUdFUjwvUD4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVESUFfSUQgPSAibWVkaWFfaWQiOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBNSU1FIHR5cGUgb2YgdGhlIGZpbGUKKyAgICAgICAgICogPFA+VHlwZTogVEVYVDwvUD4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1JTUVfVFlQRSA9ICJtaW1lX3R5cGUiOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgdGl0bGUgb2YgdGhlIGNvbnRlbnQKKyAgICAgICAgICogPFA+VHlwZTogVEVYVDwvUD4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRJVExFID0gInRpdGxlIjsKKyAgICB9CisKKyAgICAvKioKICAgICAgKiBUaGlzIGNsYXNzIGlzIHVzZWQgaW50ZXJuYWxseSBieSBJbWFnZXMuVGh1bWJuYWlscyBhbmQgVmlkZW8uVGh1bWJuYWlscywgaXQncyBub3QgaW50ZW5kZWQKICAgICAgKiB0byBiZSBhY2Nlc3NlZCBlbHNld2hlcmUuCiAgICAgICovCkBAIC0zMzUsMjYgKzQzMywyNyBAQAogICAgICAgICAgICAgLy8gTG9nLnYoVEFHLCAiZ2V0VGh1bWJuYWlsOiBvcmlnSWQ9IitvcmlnSWQrIiwga2luZD0iK2tpbmQrIiwgaXNWaWRlbz0iK2lzVmlkZW8pOwogICAgICAgICAgICAgLy8gSWYgdGhlIG1hZ2ljIGlzIG5vbi16ZXJvLCB3ZSBzaW1wbHkgcmV0dXJuIHRodW1ibmFpbCBpZiBpdCBkb2VzIGV4aXN0LgogICAgICAgICAgICAgLy8gcXVlcnlpbmcgTWVkaWFQcm92aWRlciBhbmQgc2ltcGx5IHJldHVybiB0aHVtYm5haWwuCi0gICAgICAgICAgICBNaW5pVGh1bWJGaWxlIHRodW1iRmlsZSA9IE1pbmlUaHVtYkZpbGUuaW5zdGFuY2UoYmFzZVVyaSk7Ci0gICAgICAgICAgICBsb25nIG1hZ2ljID0gdGh1bWJGaWxlLmdldE1hZ2ljKG9yaWdJZCk7Ci0gICAgICAgICAgICBpZiAobWFnaWMgIT0gMCkgewotICAgICAgICAgICAgICAgIGlmIChraW5kID09IE1JQ1JPX0tJTkQpIHsKLSAgICAgICAgICAgICAgICAgICAgc3luY2hyb25pemVkIChzVGh1bWJCdWZMb2NrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc1RodW1iQnVmID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzVGh1bWJCdWYgPSBuZXcgYnl0ZVtNaW5pVGh1bWJGaWxlLkJZVEVTX1BFUl9NSU5USFVNQl07Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGh1bWJGaWxlLmdldE1pbmlUaHVtYkZyb21GaWxlKG9yaWdJZCwgc1RodW1iQnVmKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYml0bWFwID0gQml0bWFwRmFjdG9yeS5kZWNvZGVCeXRlQXJyYXkoc1RodW1iQnVmLCAwLCBzVGh1bWJCdWYubGVuZ3RoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYml0bWFwID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiY291bGRuJ3QgZGVjb2RlIGJ5dGUgYXJyYXkuIik7CisgICAgICAgICAgICBNaW5pVGh1bWJGaWxlIHRodW1iRmlsZSA9IG5ldyBNaW5pVGh1bWJGaWxlKGlzVmlkZW8gPyBWaWRlby5NZWRpYS5FWFRFUk5BTF9DT05URU5UX1VSSQorICAgICAgICAgICAgICAgICAgICA6IEltYWdlcy5NZWRpYS5FWFRFUk5BTF9DT05URU5UX1VSSSk7CisgICAgICAgICAgICBDdXJzb3IgYyA9IG51bGw7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGxvbmcgbWFnaWMgPSB0aHVtYkZpbGUuZ2V0TWFnaWMob3JpZ0lkKTsKKyAgICAgICAgICAgICAgICBpZiAobWFnaWMgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICBpZiAoa2luZCA9PSBNSUNST19LSU5EKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKHNUaHVtYkJ1ZkxvY2spIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc1RodW1iQnVmID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc1RodW1iQnVmID0gbmV3IGJ5dGVbTWluaVRodW1iRmlsZS5CWVRFU19QRVJfTUlOVEhVTUJdOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGh1bWJGaWxlLmdldE1pbmlUaHVtYkZyb21GaWxlKG9yaWdJZCwgc1RodW1iQnVmKSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpdG1hcCA9IEJpdG1hcEZhY3RvcnkuZGVjb2RlQnl0ZUFycmF5KHNUaHVtYkJ1ZiwgMCwgc1RodW1iQnVmLmxlbmd0aCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChiaXRtYXAgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiY291bGRuJ3QgZGVjb2RlIGJ5dGUgYXJyYXkuIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJpdG1hcDsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGtpbmQgPT0gTUlOSV9LSU5EKSB7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBjb2x1bW4gPSBpc1ZpZGVvID8gInZpZGVvX2lkPSIgOiAiaW1hZ2VfaWQ9IjsKLSAgICAgICAgICAgICAgICAgICAgQ3Vyc29yIGMgPSBudWxsOwotICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJpdG1hcDsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChraW5kID09IE1JTklfS0lORCkgeworICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGNvbHVtbiA9IGlzVmlkZW8gPyAidmlkZW9faWQ9IiA6ICJpbWFnZV9pZD0iOwogICAgICAgICAgICAgICAgICAgICAgICAgYyA9IGNyLnF1ZXJ5KGJhc2VVcmksIFBST0pFQ1RJT04sIGNvbHVtbiArIG9yaWdJZCwgbnVsbCwgbnVsbCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYyAhPSBudWxsICYmIGMubW92ZVRvRmlyc3QoKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpdG1hcCA9IGdldE1pbmlUaHVtYkZyb21GaWxlKGMsIGJhc2VVcmksIGNyLCBvcHRpb25zKTsKQEAgLTM2MiwxNyArNDYxLDEzIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiaXRtYXA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGMgIT0gbnVsbCkgYy5jbG9zZSgpOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBDdXJzb3IgYyA9IG51bGw7Ci0gICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgIFVyaSBibG9ja2luZ1VyaSA9IGJhc2VVcmkuYnVpbGRVcG9uKCkuYXBwZW5kUXVlcnlQYXJhbWV0ZXIoImJsb2NraW5nIiwgIjEiKQogICAgICAgICAgICAgICAgICAgICAgICAgLmFwcGVuZFF1ZXJ5UGFyYW1ldGVyKCJvcmlnX2lkIiwgU3RyaW5nLnZhbHVlT2Yob3JpZ0lkKSkKICAgICAgICAgICAgICAgICAgICAgICAgIC5hcHBlbmRRdWVyeVBhcmFtZXRlcigiZ3JvdXBfaWQiLCBTdHJpbmcudmFsdWVPZihncm91cElkKSkuYnVpbGQoKTsKKyAgICAgICAgICAgICAgICBpZiAoYyAhPSBudWxsKSBjLmNsb3NlKCk7CiAgICAgICAgICAgICAgICAgYyA9IGNyLnF1ZXJ5KGJsb2NraW5nVXJpLCBQUk9KRUNUSU9OLCBudWxsLCBudWxsLCBudWxsKTsKICAgICAgICAgICAgICAgICAvLyBUaGlzIGhhcHBlbnMgd2hlbiBvcmlnaW5hbCBpbWFnZS92aWRlbyBkb2Vzbid0IGV4aXN0LgogICAgICAgICAgICAgICAgIGlmIChjID09IG51bGwpIHJldHVybiBudWxsOwpAQCAtNDIzLDYgKzUxOCw5IEBACiAgICAgICAgICAgICAgICAgTG9nLncoVEFHLCBleCk7CiAgICAgICAgICAgICB9IGZpbmFsbHkgewogICAgICAgICAgICAgICAgIGlmIChjICE9IG51bGwpIGMuY2xvc2UoKTsKKyAgICAgICAgICAgICAgICAvLyBUbyBhdm9pZCBmaWxlIGRlc2NyaXB0b3IgbGVhayBpbiBhcHBsaWNhdGlvbiBwcm9jZXNzLgorICAgICAgICAgICAgICAgIHRodW1iRmlsZS5kZWFjdGl2YXRlKCk7CisgICAgICAgICAgICAgICAgdGh1bWJGaWxlID0gbnVsbDsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHJldHVybiBiaXRtYXA7CiAgICAgICAgIH0KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3Byb3ZpZGVyL010cC5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvcHJvdmlkZXIvTXRwLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTI1ZGJhZAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3Byb3ZpZGVyL010cC5qYXZhCkBAIC0wLDAgKzEsMjQ1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLnByb3ZpZGVyOworCitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRVcmlzOworaW1wb3J0IGFuZHJvaWQubmV0LlVyaTsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworCisKKy8qKgorICogVGhlIE1UUCBwcm92aWRlciBzdXBwb3J0cyBhY2Nlc3NpbmcgY29udGVudCBvbiBNVFAgYW5kIFBUUCBkZXZpY2VzLgorICogQGhpZGUKKyAqLworcHVibGljIGZpbmFsIGNsYXNzIE10cAoreworICAgIHByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBUQUcgPSAiTXRwIjsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFVVEhPUklUWSA9ICJtdHAiOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENPTlRFTlRfQVVUSE9SSVRZX1NMQVNIID0gImNvbnRlbnQ6Ly8iICsgQVVUSE9SSVRZICsgIi8iOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDT05URU5UX0FVVEhPUklUWV9ERVZJQ0VfU0xBU0ggPSAiY29udGVudDovLyIgKyBBVVRIT1JJVFkgKyAiL2RldmljZS8iOworCisKKyAgIC8qKgorICAgICAqIEJyb2FkY2FzdCBBY3Rpb246ICBBIGJyb2FkY2FzdCB0byBpbmRpY2F0ZSB0aGUgZW5kIG9mIGFuIE1UUCBzZXNzaW9uIHdpdGggdGhlIGhvc3QuCisgICAgICogVGhpcyBicm9hZGNhc3QgaXMgb25seSBzZW50IGlmIE1UUCBhY3Rpdml0eSBoYXMgbW9kaWZpZWQgdGhlIG1lZGlhIGRhdGFiYXNlIGR1cmluZyB0aGUKKyAgICAgKiBtb3N0IHJlY2VudCBNVFAgc2Vzc2lvbgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFDVElPTl9NVFBfU0VTU0lPTl9FTkQgPSAiYW5kcm9pZC5wcm92aWRlci5hY3Rpb24uTVRQX1NFU1NJT05fRU5EIjsKKworICAgIC8qKgorICAgICAqIENvbnRhaW5zIGxpc3Qgb2YgYWxsIE1UUC9QVFAgZGV2aWNlcworICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgRGV2aWNlIGltcGxlbWVudHMgQmFzZUNvbHVtbnMgeworCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgVXJpIENPTlRFTlRfVVJJID0gVXJpLnBhcnNlKENPTlRFTlRfQVVUSE9SSVRZX1NMQVNIICsgImRldmljZSIpOworCisgICAgICAgIHB1YmxpYyBzdGF0aWMgVXJpIGdldENvbnRlbnRVcmkoaW50IGRldmljZUlEKSB7CisgICAgICAgICAgICByZXR1cm4gVXJpLnBhcnNlKENPTlRFTlRfQVVUSE9SSVRZX0RFVklDRV9TTEFTSCArIGRldmljZUlEKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgbWFudWZhY3R1cmVyIG9mIHRoZSBkZXZpY2UKKyAgICAgICAgICogPFA+VHlwZTogVEVYVDwvUD4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1BTlVGQUNUVVJFUiA9ICJtYW51ZmFjdHVyZXIiOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgbW9kZWwgbmFtZSBvZiB0aGUgZGV2aWNlCisgICAgICAgICAqIDxQPlR5cGU6IFRFWFQ8L1A+CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNT0RFTCA9ICJtb2RlbCI7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29udGFpbnMgbGlzdCBvZiBzdG9yYWdlIHVuaXRzIGZvciBhbiBNVFAvUFRQIGRldmljZQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgU3RvcmFnZSBpbXBsZW1lbnRzIEJhc2VDb2x1bW5zIHsKKworICAgICAgICBwdWJsaWMgc3RhdGljIFVyaSBnZXRDb250ZW50VXJpKGludCBkZXZpY2VJRCkgeworICAgICAgICAgICAgcmV0dXJuIFVyaS5wYXJzZShDT05URU5UX0FVVEhPUklUWV9ERVZJQ0VfU0xBU0ggKyBkZXZpY2VJRCArICIvc3RvcmFnZSIpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHN0YXRpYyBVcmkgZ2V0Q29udGVudFVyaShpbnQgZGV2aWNlSUQsIGludCBzdG9yYWdlSUQpIHsKKyAgICAgICAgICAgIHJldHVybiBVcmkucGFyc2UoQ09OVEVOVF9BVVRIT1JJVFlfREVWSUNFX1NMQVNIICsgZGV2aWNlSUQgKyAiL3N0b3JhZ2UvIiArIHN0b3JhZ2VJRCk7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogU3RvcmFnZSB1bml0IGlkZW50aWZpZXIKKyAgICAgICAgICogPFA+VHlwZTogVEVYVDwvUD4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElERU5USUZJRVIgPSAiaWRlbnRpZmllciI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFN0b3JhZ2UgdW5pdCBkZXNjcmlwdGlvbgorICAgICAgICAgKiA8UD5UeXBlOiBURVhUPC9QPgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVTQ1JJUFRJT04gPSAiZGVzY3JpcHRpb24iOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnRhaW5zIGxpc3Qgb2Ygb2JqZWN0cyBvbiBhbiBNVFAvUFRQIGRldmljZQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgT2JqZWN0IGltcGxlbWVudHMgQmFzZUNvbHVtbnMgeworCisgICAgICAgIHB1YmxpYyBzdGF0aWMgVXJpIGdldENvbnRlbnRVcmkoaW50IGRldmljZUlELCBpbnQgb2JqZWN0SUQpIHsKKyAgICAgICAgICAgIHJldHVybiBVcmkucGFyc2UoQ09OVEVOVF9BVVRIT1JJVFlfREVWSUNFX1NMQVNIICsgZGV2aWNlSUQKKyAgICAgICAgICAgICAgICAgICAgKyAiL29iamVjdC8iICsgb2JqZWN0SUQpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHN0YXRpYyBVcmkgZ2V0Q29udGVudFVyaUZvck9iamVjdENoaWxkcmVuKGludCBkZXZpY2VJRCwgaW50IG9iamVjdElEKSB7CisgICAgICAgICAgICByZXR1cm4gVXJpLnBhcnNlKENPTlRFTlRfQVVUSE9SSVRZX0RFVklDRV9TTEFTSCArIGRldmljZUlECisgICAgICAgICAgICAgICAgICAgICsgIi9vYmplY3QvIiArIG9iamVjdElEICsgIi9jaGlsZCIpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHN0YXRpYyBVcmkgZ2V0Q29udGVudFVyaUZvclN0b3JhZ2VDaGlsZHJlbihpbnQgZGV2aWNlSUQsIGludCBzdG9yYWdlSUQpIHsKKyAgICAgICAgICAgIHJldHVybiBVcmkucGFyc2UoQ09OVEVOVF9BVVRIT1JJVFlfREVWSUNFX1NMQVNIICsgZGV2aWNlSUQKKyAgICAgICAgICAgICAgICAgICAgKyAiL3N0b3JhZ2UvIiArIHN0b3JhZ2VJRCArICIvY2hpbGQiKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgZm9sbG93aW5nIGNvbHVtbnMgY29ycmVzcG9uZCB0byB0aGUgZmllbGRzIGluIHRoZSBPYmplY3RJbmZvIGRhdGFzZXQKKyAgICAgICAgICogYXMgZGVzY3JpYmVkIGluIHRoZSBNVFAgc3BlY2lmaWNhdGlvbi4KKyAgICAgICAgICovCisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBJRCBvZiB0aGUgc3RvcmFnZSB1bml0IGNvbnRhaW5pbmcgdGhlIG9iamVjdC4KKyAgICAgICAgICogPFA+VHlwZTogSU5URUdFUjwvUD4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNUT1JBR0VfSUQgPSAic3RvcmFnZV9pZCI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBvYmplY3QncyBmb3JtYXQuICBDYW4gYmUgb25lIG9mIHRoZSBGT1JNQVRfKiBzeW1ib2xzIGJlbG93LAorICAgICAgICAgKiBvciBhbnkgb2YgdGhlIHZhbGlkIE1UUCBvYmplY3QgZm9ybWF0cyBhcyBkZWZpbmVkIGluIHRoZSBNVFAgc3BlY2lmaWNhdGlvbi4KKyAgICAgICAgICogPFA+VHlwZTogSU5URUdFUjwvUD4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZPUk1BVCA9ICJmb3JtYXQiOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgcHJvdGVjdGlvbiBzdGF0dXMgb2YgdGhlIG9iamVjdC4gIFNlZSB0aGUgUFJPVEVDVElPTl9TVEFUVVNfKnN5bWJvbHMgYmVsb3cuCisgICAgICAgICAqIDxQPlR5cGU6IElOVEVHRVI8L1A+CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9URUNUSU9OX1NUQVRVUyA9ICJwcm90ZWN0aW9uX3N0YXR1cyI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBzaXplIG9mIHRoZSBvYmplY3QgaW4gYnl0ZXMuCisgICAgICAgICAqIDxQPlR5cGU6IElOVEVHRVI8L1A+CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTSVpFID0gInNpemUiOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgb2JqZWN0J3MgdGh1bWJuYWlsIGZvcm1hdC4gIENhbiBiZSBvbmUgb2YgdGhlIEZPUk1BVF8qIHN5bWJvbHMgYmVsb3csCisgICAgICAgICAqIG9yIGFueSBvZiB0aGUgdmFsaWQgTVRQIG9iamVjdCBmb3JtYXRzIGFzIGRlZmluZWQgaW4gdGhlIE1UUCBzcGVjaWZpY2F0aW9uLgorICAgICAgICAgKiA8UD5UeXBlOiBJTlRFR0VSPC9QPgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEhVTUJfRk9STUFUID0gImZvcm1hdCI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBzaXplIG9mIHRoZSBvYmplY3QncyB0aHVtYm5haWwgaW4gYnl0ZXMuCisgICAgICAgICAqIDxQPlR5cGU6IElOVEVHRVI8L1A+CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUSFVNQl9TSVpFID0gInRodW1iX3NpemUiOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgd2lkdGggb2YgdGhlIG9iamVjdCdzIHRodW1ibmFpbCBpbiBwaXhlbHMuCisgICAgICAgICAqIDxQPlR5cGU6IElOVEVHRVI8L1A+CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUSFVNQl9XSURUSCA9ICJ0aHVtYl93aWR0aCI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBoZWlnaHQgb2YgdGhlIG9iamVjdCdzIHRodW1ibmFpbCBpbiBwaXhlbHMuCisgICAgICAgICAqIDxQPlR5cGU6IElOVEVHRVI8L1A+CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUSFVNQl9IRUlHSFQgPSAidGh1bWJfaGVpZ2h0IjsKKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIG9iamVjdCdzIHRodW1ibmFpbC4KKyAgICAgICAgICogPFA+VHlwZTogQkxPQjwvUD4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRIVU1CID0gInRodW1iIjsKKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIHdpZHRoIG9mIHRoZSBvYmplY3QgaW4gcGl4ZWxzLgorICAgICAgICAgKiA8UD5UeXBlOiBJTlRFR0VSPC9QPgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1BR0VfV0lEVEggPSAiaW1hZ2Vfd2lkdGgiOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgaGVpZ2h0IG9mIHRoZSBvYmplY3QgaW4gcGl4ZWxzLgorICAgICAgICAgKiA8UD5UeXBlOiBJTlRFR0VSPC9QPgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1BR0VfSEVJR0hUID0gImltYWdlX2hlaWdodCI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBkZXB0aCBvZiB0aGUgb2JqZWN0IGluIGJpdHMgcGVyIHBpeGVsLgorICAgICAgICAgKiA8UD5UeXBlOiBJTlRFR0VSPC9QPgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1BR0VfREVQVEggPSAiaW1hZ2VfZGVwdGgiOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgSUQgb2YgdGhlIG9iamVjdCdzIHBhcmVudCwgb3IgemVybyBpZiB0aGUgb2JqZWN0CisgICAgICAgICAqIGlzIGluIHRoZSByb290IG9mIGl0cyBzdG9yYWdlIHVuaXQuCisgICAgICAgICAqIDxQPlR5cGU6IElOVEVHRVI8L1A+CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJFTlQgPSAicGFyZW50IjsKKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIGFzc29jaWF0aW9uIHR5cGUgZm9yIGEgY29udGFpbmVyIG9iamVjdC4KKyAgICAgICAgICogRm9yIGZvbGRlcnMgdGhpcyBpcyB0eXBpY2FsbHkge0BsaW5rICNBU1NPQ0lBVElPTl9UWVBFX0dFTkVSSUNfRk9MREVSfQorICAgICAgICAgKiA8UD5UeXBlOiBJTlRFR0VSPC9QPgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVNTT0NJQVRJT05fVFlQRSA9ICJhc3NvY2lhdGlvbl90eXBlIjsKKworICAgICAgICAvKioKKyAgICAgICAgICogQ29udGFpbnMgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBhYm91dCBjb250YWluZXIgb2JqZWN0cy4KKyAgICAgICAgICogPFA+VHlwZTogSU5URUdFUjwvUD4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFTU09DSUFUSU9OX0RFU0MgPSAiYXNzb2NpYXRpb25fZGVzYyI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBzZXF1ZW5jZSBudW1iZXIgb2YgdGhlIG9iamVjdCwgdHlwaWNhbGx5IHVzZWQgZm9yIGFuIGFzc29jaWF0aW9uCisgICAgICAgICAqIGNvbnRhaW5pbmcgaW1hZ2VzIHRha2VuIGluIHNlcXVlbmNlLgorICAgICAgICAgKiA8UD5UeXBlOiBJTlRFR0VSPC9QPgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VRVUVOQ0VfTlVNQkVSID0gInNlcXVlbmNlX251bWJlciI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBuYW1lIG9mIHRoZSBvYmplY3QuCisgICAgICAgICAqIDxQPlR5cGU6IFRFWFQ8L1A+CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FID0gIm5hbWUiOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgZGF0ZSB0aGUgb2JqZWN0IHdhcyBjcmVhdGVkLCBpbiBzZWNvbmRzIHNpbmNlIEphbnVhcnkgMSwgMTk3MC4KKyAgICAgICAgICogPFA+VHlwZTogSU5URUdFUjwvUD4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERBVEVfQ1JFQVRFRCA9ICJkYXRlX2NyZWF0ZWQiOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgZGF0ZSB0aGUgb2JqZWN0IHdhcyBsYXN0IG1vZGlmaWVkLCBpbiBzZWNvbmRzIHNpbmNlIEphbnVhcnkgMSwgMTk3MC4KKyAgICAgICAgICogPFA+VHlwZTogSU5URUdFUjwvUD4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERBVEVfTU9ESUZJRUQgPSAiZGF0ZV9tb2RpZmllZCI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEEgbGlzdCBvZiBrZXl3b3JkcyBhc3NvY2lhdGVkIHdpdGggYW4gb2JqZWN0LCBzZXBhcmF0ZWQgYnkgc3BhY2VzLgorICAgICAgICAgKiA8UD5UeXBlOiBURVhUPC9QPgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZV09SRFMgPSAia2V5d29yZHMiOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3Byb3ZpZGVyL1NldHRpbmdzLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9wcm92aWRlci9TZXR0aW5ncy5qYXZhCmluZGV4IDE5NmM5YWMuLjViNGFlZGIgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3Byb3ZpZGVyL1NldHRpbmdzLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvcHJvdmlkZXIvU2V0dGluZ3MuamF2YQpAQCAtMTYsMTQgKzE2LDExIEBACiAKIHBhY2thZ2UgYW5kcm9pZC5wcm92aWRlcjsKIAotaW1wb3J0IGNvbS5nb29nbGUuYW5kcm9pZC5jb2xsZWN0Lk1hcHM7CiAKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29kZWMuYmluYXJ5LkJhc2U2NDsKIAogaW1wb3J0IGFuZHJvaWQuYW5ub3RhdGlvbi5TZGtDb25zdGFudDsKIGltcG9ydCBhbmRyb2lkLmFubm90YXRpb24uU2RrQ29uc3RhbnQuU2RrQ29uc3RhbnRUeXBlOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db21wb25lbnROYW1lOwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZW50UXVlcnlNYXA7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRSZXNvbHZlcjsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFZhbHVlczsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKQEAgLTM3LDIwICszNCwxOCBAQAogaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2UuQ3Vyc29yOwogaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2UuU1FMRXhjZXB0aW9uOwogaW1wb3J0IGFuZHJvaWQubmV0LlVyaTsKLWltcG9ydCBhbmRyb2lkLm9zLio7Ci1pbXBvcnQgYW5kcm9pZC50ZWxlcGhvbnkuVGVsZXBob255TWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLkJhdHRlcnlNYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworaW1wb3J0IGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uOworaW1wb3J0IGFuZHJvaWQub3MuU3lzdGVtUHJvcGVydGllczsKIGltcG9ydCBhbmRyb2lkLnRleHQuVGV4dFV0aWxzOwogaW1wb3J0IGFuZHJvaWQudXRpbC5BbmRyb2lkRXhjZXB0aW9uOwogaW1wb3J0IGFuZHJvaWQudXRpbC5Db25maWc7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKIAogaW1wb3J0IGphdmEubmV0LlVSSVN5bnRheEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnNlY3VyaXR5Lk1lc3NhZ2VEaWdlc3Q7Ci1pbXBvcnQgamF2YS5zZWN1cml0eS5Ob1N1Y2hBbGdvcml0aG1FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwogaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwogaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7CiAKIAogLyoqCkBAIC0xMDA5LDcgKzEwMDQsNyBAQAogICAgICAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaGFzSW50ZXJlc3RpbmdDb25maWd1cmF0aW9uQ2hhbmdlcyhpbnQgY2hhbmdlcykgewogICAgICAgICAgICAgcmV0dXJuIChjaGFuZ2VzJkFjdGl2aXR5SW5mby5DT05GSUdfRk9OVF9TQ0FMRSkgIT0gMDsKICAgICAgICAgfQotICAgICAgICAKKwogICAgICAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gZ2V0U2hvd0dUYWxrU2VydmljZVN0YXR1cyhDb250ZW50UmVzb2x2ZXIgY3IpIHsKICAgICAgICAgICAgIHJldHVybiBnZXRJbnQoY3IsIFNIT1dfR1RBTEtfU0VSVklDRV9TVEFUVVMsIDApICE9IDA7CiAgICAgICAgIH0KQEAgLTExMzMsNiArMTEyOCw3IEBACiAgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBXSUZJX1NMRUVQX1BPTElDWV9ORVZFUiA9IDI7CiAKKyAgICAgICAgLy9UT0RPOiBkZXByZWNhdGUgc3RhdGljIElQIGNvbnN0YW50cwogICAgICAgICAvKioKICAgICAgICAgICogV2hldGhlciB0byB1c2Ugc3RhdGljIElQIGFuZCBvdGhlciBzdGF0aWMgbmV0d29yayBhdHRyaWJ1dGVzLgogICAgICAgICAgKiA8cD4KQEAgLTEyMTYsNyArMTIxMiw3IEBACiAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIExPQ0tfUEFUVEVSTl9WSVNJQkxFID0gImxvY2tfcGF0dGVybl92aXNpYmxlX3BhdHRlcm4iOwogCiAgICAgICAgIC8qKgotICAgICAgICAgKiBAZGVwcmVjYXRlZCBVc2UgCisgICAgICAgICAqIEBkZXByZWNhdGVkIFVzZQogICAgICAgICAgKiB7QGxpbmsgYW5kcm9pZC5wcm92aWRlci5TZXR0aW5ncy5TZWN1cmUjTE9DS19QQVRURVJOX1RBQ1RJTEVfRkVFREJBQ0tfRU5BQkxFRH0KICAgICAgICAgICogaW5zdGVhZAogICAgICAgICAgKi8KQEAgLTE2OTQsNiArMTY5MCwxMiBAQAogICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVTkxPQ0tfU09VTkQgPSAidW5sb2NrX3NvdW5kIjsKIAogICAgICAgICAvKioKKyAgICAgICAgICogVHJ1ZSBpZiB3ZSBzaG91bGQgYXBwZWFyIGFzIGEgUFRQIGRldmljZSBpbnN0ZWFkIG9mIE1UUC4KKyAgICAgICAgICogQGhpZGUKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVTRV9QVFBfSU5URVJGQUNFID0gInVzZV9wdHBfaW50ZXJmYWNlIjsKKworICAgICAgICAvKioKICAgICAgICAgICogUmVjZWl2ZSBpbmNvbWluZyBTSVAgY2FsbHM/CiAgICAgICAgICAqIDAgPSBubwogICAgICAgICAgKiAxID0geWVzCkBAIC0xNzg5LDYgKzE3OTEsNyBAQAogICAgICAgICAgICAgTE9DS1NDUkVFTl9TT1VORFNfRU5BQkxFRCwKICAgICAgICAgICAgIFNIT1dfV0VCX1NVR0dFU1RJT05TLAogICAgICAgICAgICAgTk9USUZJQ0FUSU9OX0xJR0hUX1BVTFNFLAorICAgICAgICAgICAgVVNFX1BUUF9JTlRFUkZBQ0UsCiAgICAgICAgICAgICBTSVBfQ0FMTF9PUFRJT05TLAogICAgICAgICAgICAgU0lQX1JFQ0VJVkVfQ0FMTFMKICAgICAgICAgfTsKQEAgLTIzMjcsNiArMjMzMCwxNCBAQAogICAgICAgICB9CiAKICAgICAgICAgLyoqCisgICAgICAgICAqIEdldCB0aGUga2V5IHRoYXQgcmV0cmlldmVzIGEgYmx1ZXRvb3RoIElucHV0IERldmljZSdzIHByaW9yaXR5LgorICAgICAgICAgKiBAaGlkZQorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgZ2V0Qmx1ZXRvb3RoSW5wdXREZXZpY2VQcmlvcml0eUtleShTdHJpbmcgYWRkcmVzcykgeworICAgICAgICAgICAgcmV0dXJuICgiYmx1ZXRvb3RoX2lucHV0X2RldmljZV9wcmlvcml0eV8iICsgYWRkcmVzcy50b1VwcGVyQ2FzZSgpKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgogICAgICAgICAgKiBXaGV0aGVyIG9yIG5vdCBkYXRhIHJvYW1pbmcgaXMgZW5hYmxlZC4gKDAgPSBmYWxzZSwgMSA9IHRydWUpCiAgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBEQVRBX1JPQU1JTkcgPSAiZGF0YV9yb2FtaW5nIjsKQEAgLTIzNTgsMTEgKzIzNjksMzIgQEAKICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRElTQUJMRURfU1lTVEVNX0lOUFVUX01FVEhPRFMgPSAiZGlzYWJsZWRfc3lzdGVtX2lucHV0X21ldGhvZHMiOwogCiAgICAgICAgIC8qKgotICAgICAgICAgKiBIb3N0IG5hbWUgYW5kIHBvcnQgZm9yIGEgdXNlci1zZWxlY3RlZCBwcm94eS4KKyAgICAgICAgICogSG9zdCBuYW1lIGFuZCBwb3J0IGZvciBnbG9iYWwgcHJveHkuCiAgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBIVFRQX1BST1hZID0gImh0dHBfcHJveHkiOwogCiAgICAgICAgIC8qKgorICAgICAgICAgKiBFeGNsdXNpb24gbGlzdCBmb3IgZ2xvYmFsIHByb3h5LiBUaGlzIHN0cmluZyBjb250YWlucyBhIGxpc3Qgb2YgY29tbWEtc2VwYXJhdGVkCisgICAgICAgICAqIGRvbWFpbnMgd2hlcmUgdGhlIGdsb2JhbCBwcm94eSBkb2VzIG5vdCBhcHBseS4gRG9tYWlucyBzaG91bGQgYmUgbGlzdGVkIGluIGEgY29tbWEtCisgICAgICAgICAqIHNlcGFyYXRlZCBsaXN0LiBFeGFtcGxlIG9mIGFjY2VwdGFibGUgZm9ybWF0czogIi5kb21haW4xLmNvbSxteS5kb21haW4yLmNvbSIKKyAgICAgICAgICogQGhpZGUKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEhUVFBfUFJPWFlfRVhDTFVTSU9OX0xJU1QgPSAiaHR0cF9wcm94eV9leGNsdXNpb25fbGlzdCI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEVuYWJsZXMgdGhlIFVJIHNldHRpbmcgdG8gYWxsb3cgdGhlIHVzZXIgdG8gc3BlY2lmeSB0aGUgZ2xvYmFsIEhUVFAgcHJveHkKKyAgICAgICAgICogYW5kIGFzc29jaWF0ZWQgZXhjbHVzaW9uIGxpc3QuCisgICAgICAgICAqIEBoaWRlCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTRVRfR0xPQkFMX0hUVFBfUFJPWFkgPSAic2V0X2dsb2JhbF9odHRwX3Byb3h5IjsKKworICAgICAgICAvKioKKyAgICAgICAgICogU2V0dGluZyBmb3IgZGVmYXVsdCBETlMgaW4gY2FzZSBub2JvZHkgc3VnZ2VzdHMgb25lCisgICAgICAgICAqIEBoaWRlCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX0ROU19TRVJWRVIgPSAiZGVmYXVsdF9kbnNfc2VydmVyIjsKKworICAgICAgICAvKioKICAgICAgICAgICogV2hldGhlciB0aGUgcGFja2FnZSBpbnN0YWxsZXIgc2hvdWxkIGFsbG93IGluc3RhbGxhdGlvbiBvZiBhcHBzIGRvd25sb2FkZWQgZnJvbQogICAgICAgICAgKiBzb3VyY2VzIG90aGVyIHRoYW4gdGhlIEFuZHJvaWQgTWFya2V0ICh2ZW5kaW5nIG1hY2hpbmUpLgogICAgICAgICAgKgpAQCAtMjM5Myw2ICsyNDI1LDE0IEBACiAgICAgICAgICAgICAibG9ja19wYXR0ZXJuX3RhY3RpbGVfZmVlZGJhY2tfZW5hYmxlZCI7CiAKICAgICAgICAgLyoqCisgICAgICAgICAqIFRoaXMgcHJlZmVyZW5jZSBhbGxvd3MgdGhlIGRldmljZSB0byBiZSBsb2NrZWQgZ2l2ZW4gdGltZSBhZnRlciBzY3JlZW4gZ29lcyBvZmYsCisgICAgICAgICAqIHN1YmplY3QgdG8gY3VycmVudCBEZXZpY2VBZG1pbiBwb2xpY3kgbGltaXRzLgorICAgICAgICAgKiBAaGlkZQorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTE9DS19TQ1JFRU5fTE9DS19BRlRFUl9USU1FT1VUID0gImxvY2tfc2NyZWVuX2xvY2tfYWZ0ZXJfdGltZW91dCI7CisKKworICAgICAgICAvKioKICAgICAgICAgICogV2hldGhlciBhc3Npc3RlZCBHUFMgc2hvdWxkIGJlIGVuYWJsZWQgb3Igbm90LgogICAgICAgICAgKiBAaGlkZQogICAgICAgICAgKi8KQEAgLTI0NTMsNiArMjQ5MywxNCBAQAogICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJFTlRBTF9DT05UUk9MX1JFRElSRUNUX1VSTCA9ICJwYXJlbnRhbF9jb250cm9sX3JlZGlyZWN0X3VybCI7CiAKICAgICAgICAgLyoqCisgICAgICAgICAqIEEgcG9zaXRpdmUgdmFsdWUgaW5kaWNhdGVzIHRoZSBmcmVxdWVuY3kgb2YgU2FtcGxpbmdQcm9maWxlcgorICAgICAgICAgKiB0YWtpbmcgc25hcHNob3RzIGluIGhlcnR6LiBaZXJvIHZhbHVlIG1lYW5zIFNhbXBsaW5nUHJvZmlsZXIgaXMgZGlzYWJsZWQuCisgICAgICAgICAqCisgICAgICAgICAqIEBoaWRlCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTQU1QTElOR19QUk9GSUxFUl9IWiA9ICJzYW1wbGluZ19wcm9maWxlcl9oeiI7CisKKyAgICAgICAgLyoqCiAgICAgICAgICAqIFNldHRpbmdzIGNsYXNzbmFtZSB0byBsYXVuY2ggd2hlbiBTZXR0aW5ncyBpcyBjbGlja2VkIGZyb20gQWxsCiAgICAgICAgICAqIEFwcGxpY2F0aW9ucy4gIE5lZWRlZCBiZWNhdXNlIG9mIHVzZXIgdGVzdGluZyBiZXR3ZWVuIHRoZSBvbGQKICAgICAgICAgICogYW5kIG5ldyBTZXR0aW5ncyBhcHBzLgpAQCAtMjQ4Myw2ICsyNTMxLDYwIEBACiAgICAgICAgICAgICAiZW5hYmxlZF9hY2Nlc3NpYmlsaXR5X3NlcnZpY2VzIjsKIAogICAgICAgICAvKioKKyAgICAgICAgICogSWYgaW5qZWN0aW9uIG9mIGFjY2Vzc2liaWxpdHkgZW5oYW5jaW5nIEphdmFTY3JpcHQgc2NyaXB0cworICAgICAgICAgKiBpcyBlbmFibGVkLgorICAgICAgICAgKiA8cD4KKyAgICAgICAgICogICBOb3RlOiBBY2Nlc3NpYmlsaXR5IGluamVjdGluZyBzY3JpcHRzIGFyZSBzZXJ2ZWQgYnkgdGhlCisgICAgICAgICAqICAgR29vZ2xlIGluZnJhc3RydWN0dXJlIGFuZCBlbmFibGUgdXNlcnMgd2l0aCBkaXNhYmlsaXRpZXMgdG8KKyAgICAgICAgICogICBlZmZpY2lhbnRseSBuYXZpZ2F0ZSBpbiBhbmQgZXhwbG9yZSB3ZWIgY29udGVudC4KKyAgICAgICAgICogPC9wPgorICAgICAgICAgKiA8cD4KKyAgICAgICAgICogICBUaGlzIHByb3BlcnR5IHJlcHJlc2VudHMgYSBib29sZWFuIHZhbHVlLgorICAgICAgICAgKiA8L3A+CisgICAgICAgICAqIEBoaWRlCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBQ0NFU1NJQklMSVRZX1NDUklQVF9JTkpFQ1RJT04gPQorICAgICAgICAgICAgImFjY2Vzc2liaWxpdHlfc2NyaXB0X2luamVjdGlvbiI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEtleSBiaW5kaW5ncyBmb3IgbmF2aWdhdGlvbiBpbiBidWlsdC1pbiBhY2Nlc3NpYmlsaXR5IHN1cHBvcnQgZm9yIHdlYiBjb250ZW50LgorICAgICAgICAgKiA8cD4KKyAgICAgICAgICogICBOb3RlOiBUaGVzZSBrZXkgYmluZGluZ3MgYXJlIGZvciB0aGUgYnVpbHQtaW4gYWNjZXNzaWJpbGl0eSBuYXZpZ2F0aW9uIGZvcgorICAgICAgICAgKiAgIHdlYiBjb250ZW50IHdoaWNoIGlzIHVzZWQgYXMgYSBmYWxsIGJhY2sgc29sdXRpb24gaWYgSmF2YVNjcmlwdCBpbiBhIFdlYlZpZXcKKyAgICAgICAgICogICBpcyBub3QgZW5hYmxlZCBvciB0aGUgdXNlciBoYXMgbm90IG9wdGVkLWluIHNjcmlwdCBpbmplY3Rpb24gZnJvbSBHb29nbGUuCisgICAgICAgICAqIDwvcD4KKyAgICAgICAgICogPHA+CisgICAgICAgICAqICAgVGhlIGJpbmRpbmdzIGFyZSBzZXBhcmF0ZWQgYnkgc2VtaS1jb2xvbi4gQSBiaW5kaW5nIGlzIGEgbWFwcGluZyBmcm9tCisgICAgICAgICAqICAgYSBrZXkgdG8gYSBzZXF1ZW5jZSBvZiBhY3Rpb25zIChmb3IgbW9yZSBkZXRhaWxzIGxvb2sgYXQKKyAgICAgICAgICogICBhbmRyb2lkLndlYmtpdC5BY2Nlc3NpYmlsaXR5SW5qZWN0b3IpLiBBIGtleSBpcyByZXByZXNlbnRlZCBhcyB0aGUgaGV4YWRlbWljYWwKKyAgICAgICAgICogICBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgYW4gaW50ZWdlciBvYnRhaW5lZCBmcm9tIGEgbWV0YSBzdGF0ZSAob3B0aW9uYWwpIHNoaWZ0ZWQKKyAgICAgICAgICogICBzaXh0ZWVuIHRpbWVzIGxlZnQgYW5kIGJpdHdpc2Ugb3JlZCB3aXRoIGEga2V5IGNvZGUuIEFuIGFjdGlvbiBpcyByZXByZXNlbnRlZAorICAgICAgICAgKiAgIGFzIGEgaGV4YWRlbWljYWwgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIGFuIGludGVnZXIgd2hlcmUgdGhlIGZpcnN0IHR3byBkaWdpdHMKKyAgICAgICAgICogICBhcmUgbmF2aWdhdGlvbiBhY3Rpb24gaW5kZXgsIHRoZSBzZWNvbmQsIHRoZSB0aGlyZCwgYW5kIHRoZSBmb3VydGggZGlnaXQgcGFpcnMKKyAgICAgICAgICogICByZXByZXNlbnQgdGhlIGFjdGlvbiBhcmd1bWVudHMuIFRoZSBzZXBhcmF0ZSBhY3Rpb25zIGluIGEgYmluZGluZyBhcmUgY29sb24KKyAgICAgICAgICogICBzZXBhcmF0ZWQuIFRoZSBrZXkgYW5kIHRoZSBhY3Rpb24gc2VxdWVuY2UgaXQgbWFwcyB0byBhcmUgc2VwYXJhdGVkIGJ5IGVxdWFscy4KKyAgICAgICAgICogPC9wPgorICAgICAgICAgKiA8cD4KKyAgICAgICAgICogICBGb3IgZXhhbXBsZSwgdGhlIGJpbmRpbmcgYmVsb3cgbWFwcyB0aGUgRFBBRCByaWdodCBidXR0b24gdG8gdHJhdmVyc2UgdGhlCisgICAgICAgICAqICAgY3VycmVudCBuYXZpZ2F0aW9uIGF4aXMgb25jZSB3aXRob3V0IGZpcmluZyBhbiBhY2Nlc3NpYmlsaXR5IGV2ZW50IGFuZCB0bworICAgICAgICAgKiAgIHBlcmZvcm0gdGhlIHNhbWUgdHJhdmVyc2FsIGFnYWluIGJ1dCB0byBmaXJlIGFuIGV2ZW50OgorICAgICAgICAgKiAgIDxjb2RlPgorICAgICAgICAgKiAgICAgMHgxNj0weDAxMDAwMTAwOjB4MDEwMDAxMDE7CisgICAgICAgICAqICAgPC9jb2RlPgorICAgICAgICAgKiA8L3A+CisgICAgICAgICAqIDxwPgorICAgICAgICAgKiAgIFRoZSBnb2FsIG9mIHRoaXMgYmluZGluZyBpcyB0byBlbmFibGUgZHluYW1pYyByZWJpbmRpbmcgb2Yga2V5cyB0bworICAgICAgICAgKiAgIG5hdmlnYXRpb24gYWN0aW9ucyBmb3Igd2ViIGNvbnRlbnQgd2l0aG91dCByZXF1aXJpbmcgYSBmcmFtZXdvcmsgY2hhbmdlLgorICAgICAgICAgKiA8L3A+CisgICAgICAgICAqIDxwPgorICAgICAgICAgKiAgIFRoaXMgcHJvcGVydHkgcmVwcmVzZW50cyBhIHN0cmluZyB2YWx1ZS4KKyAgICAgICAgICogPC9wPgorICAgICAgICAgKiBAaGlkZQorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUNDRVNTSUJJTElUWV9XRUJfQ09OVEVOVF9LRVlfQklORElOR1MgPQorICAgICAgICAgICAgImFjY2Vzc2liaWxpdHlfd2ViX2NvbnRlbnRfa2V5X2JpbmRpbmdzIjsKKworICAgICAgICAvKioKICAgICAgICAgICogU2V0dGluZyB0byBhbHdheXMgdXNlIHRoZSBkZWZhdWx0IHRleHQtdG8tc3BlZWNoIHNldHRpbmdzIHJlZ2FyZGxlc3MKICAgICAgICAgICogb2YgdGhlIGFwcGxpY2F0aW9uIHNldHRpbmdzLgogICAgICAgICAgKiAxID0gb3ZlcnJpZGUgYXBwbGljYXRpb24gc2V0dGluZ3MsCkBAIC0zNDUzLDYgKzM1NTUsNyBAQAogICAgICAgICAgICAgUEFSRU5UQUxfQ09OVFJPTF9SRURJUkVDVF9VUkwsCiAgICAgICAgICAgICBVU0JfTUFTU19TVE9SQUdFX0VOQUJMRUQsCiAgICAgICAgICAgICBBQ0NFU1NJQklMSVRZX0VOQUJMRUQsCisgICAgICAgICAgICBBQ0NFU1NJQklMSVRZX1NDUklQVF9JTkpFQ1RJT04sCiAgICAgICAgICAgICBCQUNLVVBfQVVUT19SRVNUT1JFLAogICAgICAgICAgICAgRU5BQkxFRF9BQ0NFU1NJQklMSVRZX1NFUlZJQ0VTLAogICAgICAgICAgICAgVFRTX1VTRV9ERUZBVUxUUywKQEAgLTM2MzYsMjAgKzM3MzksOCBAQAogICAgICAgICAgICAgLy8gSWYgYSBzaG9ydGN1dCBpcyBzdXBwbGllZCwgYW5kIGl0IGlzIGFscmVhZHkgZGVmaW5lZCBmb3IKICAgICAgICAgICAgIC8vIGFub3RoZXIgYm9va21hcmssIHRoZW4gcmVtb3ZlIHRoZSBvbGQgZGVmaW5pdGlvbi4KICAgICAgICAgICAgIGlmIChzaG9ydGN1dCAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgQ3Vyc29yIGMgPSBjci5xdWVyeShDT05URU5UX1VSSSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHNTaG9ydGN1dFByb2plY3Rpb24sIHNTaG9ydGN1dFNlbGVjdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBTdHJpbmdbXSB7IFN0cmluZy52YWx1ZU9mKChpbnQpIHNob3J0Y3V0KSB9LCBudWxsKTsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBpZiAoYy5tb3ZlVG9GaXJzdCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoYy5nZXRDb3VudCgpID4gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghYy5kZWxldGVSb3coKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJDb3VsZCBub3QgZGVsZXRlIGV4aXN0aW5nIHNob3J0Y3V0IHJvdyIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjICE9IG51bGwpIGMuY2xvc2UoKTsKLSAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY3IuZGVsZXRlKENPTlRFTlRfVVJJLCBzU2hvcnRjdXRTZWxlY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICBuZXcgU3RyaW5nW10geyBTdHJpbmcudmFsdWVPZigoaW50KSBzaG9ydGN1dCkgfSk7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIENvbnRlbnRWYWx1ZXMgdmFsdWVzID0gbmV3IENvbnRlbnRWYWx1ZXMoKTsKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3NlcnZlci9CbHVldG9vdGhFdmVudExvb3AuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3NlcnZlci9CbHVldG9vdGhFdmVudExvb3AuamF2YQppbmRleCA2MTFhODAzLi5hYjc5YWFmIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9zZXJ2ZXIvQmx1ZXRvb3RoRXZlbnRMb29wLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvc2VydmVyL0JsdWV0b290aEV2ZW50TG9vcC5qYXZhCkBAIC0yMCw2ICsyMCw4IEBACiBpbXBvcnQgYW5kcm9pZC5ibHVldG9vdGguQmx1ZXRvb3RoQWRhcHRlcjsKIGltcG9ydCBhbmRyb2lkLmJsdWV0b290aC5CbHVldG9vdGhDbGFzczsKIGltcG9ydCBhbmRyb2lkLmJsdWV0b290aC5CbHVldG9vdGhEZXZpY2U7CitpbXBvcnQgYW5kcm9pZC5ibHVldG9vdGguQmx1ZXRvb3RoSW5wdXREZXZpY2U7CitpbXBvcnQgYW5kcm9pZC5ibHVldG9vdGguQmx1ZXRvb3RoUGFuOwogaW1wb3J0IGFuZHJvaWQuYmx1ZXRvb3RoLkJsdWV0b290aFV1aWQ7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKQEAgLTMwMCw3ICszMDIsOCBAQAogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CiAgICAgICAgIGlmIChEQkcpIHsKLSAgICAgICAgICAgIGxvZygiRGV2aWNlIHByb3BlcnR5IGNoYW5nZWQ6IiArIGFkZHJlc3MgKyAicHJvcGVydHk6IiArIG5hbWUpOworICAgICAgICAgICAgbG9nKCJEZXZpY2UgcHJvcGVydHkgY2hhbmdlZDogIiArIGFkZHJlc3MgKyAiIHByb3BlcnR5OiAiCisgICAgICAgICAgICAgICAgICAgICsgbmFtZSArICIgdmFsdWU6ICIgKyBwcm9wVmFsdWVzWzFdKTsKICAgICAgICAgfQogICAgICAgICBCbHVldG9vdGhEZXZpY2UgZGV2aWNlID0gbUFkYXB0ZXIuZ2V0UmVtb3RlRGV2aWNlKGFkZHJlc3MpOwogICAgICAgICBpZiAobmFtZS5lcXVhbHMoIk5hbWUiKSkgewpAQCAtMzY3LDYgKzM3MCw0NCBAQAogICAgICAgICB9CiAgICAgfQogCisgICAgcHJpdmF0ZSB2b2lkIG9uSW5wdXREZXZpY2VQcm9wZXJ0eUNoYW5nZWQoU3RyaW5nIHBhdGgsIFN0cmluZ1tdIHByb3BWYWx1ZXMpIHsKKyAgICAgICAgU3RyaW5nIGFkZHJlc3MgPSBtQmx1ZXRvb3RoU2VydmljZS5nZXRBZGRyZXNzRnJvbU9iamVjdFBhdGgocGF0aCk7CisgICAgICAgIGlmIChhZGRyZXNzID09IG51bGwpIHsKKyAgICAgICAgICAgIExvZy5lKFRBRywgIm9uSW5wdXREZXZpY2VQcm9wZXJ0eUNoYW5nZWQ6IEFkZHJlc3Mgb2YgdGhlIHJlbW90ZSBkZXZpY2UgaW4gbnVsbCIpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGxvZygiIElucHV0IERldmljZSA6IE5hbWUgb2YgUHJvcGVydHkgaXM6IiArIHByb3BWYWx1ZXNbMF0pOworICAgICAgICBib29sZWFuIHN0YXRlID0gZmFsc2U7CisgICAgICAgIGlmIChwcm9wVmFsdWVzWzFdLmVxdWFscygidHJ1ZSIpKSB7CisgICAgICAgICAgICBzdGF0ZSA9IHRydWU7CisgICAgICAgIH0KKyAgICAgICAgbUJsdWV0b290aFNlcnZpY2UuaGFuZGxlSW5wdXREZXZpY2VQcm9wZXJ0eUNoYW5nZShhZGRyZXNzLCBzdGF0ZSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIG9uUGFuRGV2aWNlUHJvcGVydHlDaGFuZ2VkKFN0cmluZyBkZXZpY2VPYmplY3RQYXRoLCBTdHJpbmdbXSBwcm9wVmFsdWVzKSB7CisgICAgICAgIFN0cmluZyBuYW1lID0gcHJvcFZhbHVlc1swXTsKKyAgICAgICAgU3RyaW5nIGFkZHJlc3MgPSBtQmx1ZXRvb3RoU2VydmljZS5nZXRBZGRyZXNzRnJvbU9iamVjdFBhdGgoZGV2aWNlT2JqZWN0UGF0aCk7CisgICAgICAgIGlmIChhZGRyZXNzID09IG51bGwpIHsKKyAgICAgICAgICAgIExvZy5lKFRBRywgIm9uUGFuRGV2aWNlUHJvcGVydHlDaGFuZ2VkOiBBZGRyZXNzIG9mIHRoZSByZW1vdGUgZGV2aWNlIGluIG51bGwiKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBpZiAoREJHKSB7CisgICAgICAgICAgICBsb2coIlBhbiBEZXZpY2UgcHJvcGVydHkgY2hhbmdlZDogIiArIGFkZHJlc3MgKyAiICBwcm9wZXJ0eTogIgorICAgICAgICAgICAgICAgICAgICArIG5hbWUgKyAiIHZhbHVlOiAiKyBwcm9wVmFsdWVzWzFdKTsKKyAgICAgICAgfQorICAgICAgICBCbHVldG9vdGhEZXZpY2UgZGV2aWNlID0gbUFkYXB0ZXIuZ2V0UmVtb3RlRGV2aWNlKGFkZHJlc3MpOworICAgICAgICBpZiAobmFtZS5lcXVhbHMoIkNvbm5lY3RlZCIpKSB7CisgICAgICAgICAgICBpZiAocHJvcFZhbHVlc1sxXS5lcXVhbHMoImZhbHNlIikpIHsKKyAgICAgICAgICAgICAgICBtQmx1ZXRvb3RoU2VydmljZS5oYW5kbGVQYW5EZXZpY2VTdGF0ZUNoYW5nZShkZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCbHVldG9vdGhJbnB1dERldmljZS5TVEFURV9ESVNDT05ORUNURUQpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKG5hbWUuZXF1YWxzKCJJbnRlcmZhY2UiKSkgeworICAgICAgICAgICAgU3RyaW5nIGlmYWNlID0gcHJvcFZhbHVlc1sxXTsKKyAgICAgICAgICAgIG1CbHVldG9vdGhTZXJ2aWNlLmhhbmRsZVBhbkRldmljZVN0YXRlQ2hhbmdlKGRldmljZSwgaWZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJsdWV0b290aElucHV0RGV2aWNlLlNUQVRFX0NPTk5FQ1RFRCk7CisgICAgICAgIH0KKyAgICB9CisKICAgICBwcml2YXRlIFN0cmluZyBjaGVja1BhaXJpbmdSZXF1ZXN0QW5kR2V0QWRkcmVzcyhTdHJpbmcgb2JqZWN0UGF0aCwgaW50IG5hdGl2ZURhdGEpIHsKICAgICAgICAgU3RyaW5nIGFkZHJlc3MgPSBtQmx1ZXRvb3RoU2VydmljZS5nZXRBZGRyZXNzRnJvbU9iamVjdFBhdGgob2JqZWN0UGF0aCk7CiAgICAgICAgIGlmIChhZGRyZXNzID09IG51bGwpIHsKQEAgLTUxOSw2ICs1NjAsOCBAQAogICAgIH0KIAogICAgIHByaXZhdGUgYm9vbGVhbiBvbkFnZW50QXV0aG9yaXplKFN0cmluZyBvYmplY3RQYXRoLCBTdHJpbmcgZGV2aWNlVXVpZCkgeworICAgICAgICBpZiAoIW1CbHVldG9vdGhTZXJ2aWNlLmlzRW5hYmxlZCgpKSByZXR1cm4gZmFsc2U7CisKICAgICAgICAgU3RyaW5nIGFkZHJlc3MgPSBtQmx1ZXRvb3RoU2VydmljZS5nZXRBZGRyZXNzRnJvbU9iamVjdFBhdGgob2JqZWN0UGF0aCk7CiAgICAgICAgIGlmIChhZGRyZXNzID09IG51bGwpIHsKICAgICAgICAgICAgIExvZy5lKFRBRywgIlVuYWJsZSB0byBnZXQgZGV2aWNlIGFkZHJlc3MgaW4gb25BdXRoQWdlbnRBdXRob3JpemUiKTsKQEAgLTUyNywxNSArNTcwLDE1IEBACiAKICAgICAgICAgYm9vbGVhbiBhdXRob3JpemVkID0gZmFsc2U7CiAgICAgICAgIFBhcmNlbFV1aWQgdXVpZCA9IFBhcmNlbFV1aWQuZnJvbVN0cmluZyhkZXZpY2VVdWlkKTsKLSAgICAgICAgQmx1ZXRvb3RoQTJkcCBhMmRwID0gbmV3IEJsdWV0b290aEEyZHAobUNvbnRleHQpOworICAgICAgICBCbHVldG9vdGhEZXZpY2UgZGV2aWNlID0gbUFkYXB0ZXIuZ2V0UmVtb3RlRGV2aWNlKGFkZHJlc3MpOwogCiAgICAgICAgIC8vIEJsdWV6IHNlbmRzIHRoZSBVVUlEIG9mIHRoZSBsb2NhbCBzZXJ2aWNlIGJlaW5nIGFjY2Vzc2VkLCBfbm90XyB0aGUKICAgICAgICAgLy8gcmVtb3RlIHNlcnZpY2UKLSAgICAgICAgaWYgKG1CbHVldG9vdGhTZXJ2aWNlLmlzRW5hYmxlZCgpICYmCi0gICAgICAgICAgICAgICAgKEJsdWV0b290aFV1aWQuaXNBdWRpb1NvdXJjZSh1dWlkKSB8fCBCbHVldG9vdGhVdWlkLmlzQXZyY3BUYXJnZXQodXVpZCkKLSAgICAgICAgICAgICAgICAgICAgICAgIHx8IEJsdWV0b290aFV1aWQuaXNBZHZBdWRpb0Rpc3QodXVpZCkpICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAhaXNPdGhlclNpbmtJbk5vbkRpc2Nvbm5lY3RpbmdTdGF0ZShhZGRyZXNzKSkgewotICAgICAgICAgICAgQmx1ZXRvb3RoRGV2aWNlIGRldmljZSA9IG1BZGFwdGVyLmdldFJlbW90ZURldmljZShhZGRyZXNzKTsKKyAgICAgICAgaWYgKChCbHVldG9vdGhVdWlkLmlzQXVkaW9Tb3VyY2UodXVpZCkgfHwgQmx1ZXRvb3RoVXVpZC5pc0F2cmNwVGFyZ2V0KHV1aWQpCisgICAgICAgICAgICAgIHx8IEJsdWV0b290aFV1aWQuaXNBZHZBdWRpb0Rpc3QodXVpZCkpICYmCisgICAgICAgICAgICAgICFpc090aGVyU2lua0luTm9uRGlzY29ubmVjdGluZ1N0YXRlKGFkZHJlc3MpKSB7CisgICAgICAgICAgICBCbHVldG9vdGhBMmRwIGEyZHAgPSBuZXcgQmx1ZXRvb3RoQTJkcChtQ29udGV4dCk7CisKICAgICAgICAgICAgIGF1dGhvcml6ZWQgPSBhMmRwLmdldFNpbmtQcmlvcml0eShkZXZpY2UpID4gQmx1ZXRvb3RoQTJkcC5QUklPUklUWV9PRkY7CiAgICAgICAgICAgICBpZiAoYXV0aG9yaXplZCkgewogICAgICAgICAgICAgICAgIExvZy5pKFRBRywgIkFsbG93aW5nIGluY29taW5nIEEyRFAgLyBBVlJDUCBjb25uZWN0aW9uIGZyb20gIiArIGFkZHJlc3MpOwpAQCAtNTQzLDYgKzU4NiwxOCBAQAogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICBMb2cuaShUQUcsICJSZWplY3RpbmcgaW5jb21pbmcgQTJEUCAvIEFWUkNQIGNvbm5lY3Rpb24gZnJvbSAiICsgYWRkcmVzcyk7CiAgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAoQmx1ZXRvb3RoVXVpZC5pc0lucHV0RGV2aWNlKHV1aWQpICYmICFpc090aGVySW5wdXREZXZpY2VDb25uZWN0ZWQoYWRkcmVzcykpIHsKKyAgICAgICAgICAgIEJsdWV0b290aElucHV0RGV2aWNlIGlucHV0RGV2aWNlID0gbmV3IEJsdWV0b290aElucHV0RGV2aWNlKG1Db250ZXh0KTsKKyAgICAgICAgICAgIGF1dGhvcml6ZWQgPSBpbnB1dERldmljZS5nZXRJbnB1dERldmljZVByaW9yaXR5KGRldmljZSkgPgorICAgICAgICAgICAgICAgICAgICAgICAgIEJsdWV0b290aElucHV0RGV2aWNlLlBSSU9SSVRZX09GRjsKKyAgICAgICAgICAgICBpZiAoYXV0aG9yaXplZCkgeworICAgICAgICAgICAgICAgICBMb2cuaShUQUcsICJBbGxvd2luZyBpbmNvbWluZyBISUQgY29ubmVjdGlvbiBmcm9tICIgKyBhZGRyZXNzKTsKKyAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICBMb2cuaShUQUcsICJSZWplY3RpbmcgaW5jb21pbmcgSElEIGNvbm5lY3Rpb24gZnJvbSAiICsgYWRkcmVzcyk7CisgICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKEJsdWV0b290aFV1aWQuaXNCbmVwKHV1aWQpIHx8IEJsdWV0b290aFV1aWQuaXNOYXAodXVpZCkgJiYKKyAgICAgICAgICAgICAgICBtQmx1ZXRvb3RoU2VydmljZS5hbGxvd0luY29taW5nVGV0aGVyaW5nKCkpeworICAgICAgICAgICAgYXV0aG9yaXplZCA9IHRydWU7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBMb2cuaShUQUcsICJSZWplY3RpbmcgaW5jb21pbmcgIiArIGRldmljZVV1aWQgKyAiIGNvbm5lY3Rpb24gZnJvbSAiICsgYWRkcmVzcyk7CiAgICAgICAgIH0KQEAgLTU1MCw2ICs2MDUsMTggQEAKICAgICAgICAgcmV0dXJuIGF1dGhvcml6ZWQ7CiAgICAgfQogCisgICAgcHJpdmF0ZSBib29sZWFuIGlzT3RoZXJJbnB1dERldmljZUNvbm5lY3RlZChTdHJpbmcgYWRkcmVzcykgeworICAgICAgICBTZXQ8Qmx1ZXRvb3RoRGV2aWNlPiBkZXZpY2VzID0KKyAgICAgICAgICAgIG1CbHVldG9vdGhTZXJ2aWNlLmxvb2t1cElucHV0RGV2aWNlc01hdGNoaW5nU3RhdGVzKG5ldyBpbnRbXSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCbHVldG9vdGhJbnB1dERldmljZS5TVEFURV9DT05ORUNUSU5HLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmx1ZXRvb3RoSW5wdXREZXZpY2UuU1RBVEVfQ09OTkVDVEVEfSk7CisKKyAgICAgICAgZm9yIChCbHVldG9vdGhEZXZpY2UgZGV2aWNlIDogZGV2aWNlcykgeworICAgICAgICAgICAgaWYgKCFkZXZpY2UuZ2V0QWRkcmVzcygpLmVxdWFscyhhZGRyZXNzKSkgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKwogICAgIHByaXZhdGUgYm9vbGVhbiBvbkFnZW50T3V0T2ZCYW5kRGF0YUF2YWlsYWJsZShTdHJpbmcgb2JqZWN0UGF0aCkgewogICAgICAgICBpZiAoIW1CbHVldG9vdGhTZXJ2aWNlLmlzRW5hYmxlZCgpKSByZXR1cm4gZmFsc2U7CiAKQEAgLTU2MSw3ICs2MjgsNiBAQAogICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIGZhbHNlOwotCiAgICAgfQogCiAgICAgcHJpdmF0ZSBib29sZWFuIGlzT3RoZXJTaW5rSW5Ob25EaXNjb25uZWN0aW5nU3RhdGUoU3RyaW5nIGFkZHJlc3MpIHsKQEAgLTYxNSw2ICs2ODEsNjAgQEAKICAgICAgICAgfQogICAgIH0KIAorICAgIHByaXZhdGUgdm9pZCBvbklucHV0RGV2aWNlQ29ubmVjdGlvblJlc3VsdChTdHJpbmcgcGF0aCwgYm9vbGVhbiByZXN1bHQpIHsKKyAgICAgICAgLy8gU3VjY2VzcyBjYXNlIGdldHMgaGFuZGxlZCBieSBQcm9wZXJ0eSBDaGFuZ2Ugc2lnbmFsCisgICAgICAgIGlmICghcmVzdWx0KSB7CisgICAgICAgICAgICBTdHJpbmcgYWRkcmVzcyA9IG1CbHVldG9vdGhTZXJ2aWNlLmdldEFkZHJlc3NGcm9tT2JqZWN0UGF0aChwYXRoKTsKKyAgICAgICAgICAgIGlmIChhZGRyZXNzID09IG51bGwpIHJldHVybjsKKworICAgICAgICAgICAgYm9vbGVhbiBjb25uZWN0ZWQgPSBmYWxzZTsKKyAgICAgICAgICAgIEJsdWV0b290aERldmljZSBkZXZpY2UgPSBtQWRhcHRlci5nZXRSZW1vdGVEZXZpY2UoYWRkcmVzcyk7CisgICAgICAgICAgICBpbnQgc3RhdGUgPSBtQmx1ZXRvb3RoU2VydmljZS5nZXRJbnB1dERldmljZVN0YXRlKGRldmljZSk7CisgICAgICAgICAgICBpZiAoc3RhdGUgPT0gQmx1ZXRvb3RoSW5wdXREZXZpY2UuU1RBVEVfQ09OTkVDVElORykgeworICAgICAgICAgICAgICAgIGNvbm5lY3RlZCA9IGZhbHNlOworICAgICAgICAgICAgfSBlbHNlIGlmIChzdGF0ZSA9PSBCbHVldG9vdGhJbnB1dERldmljZS5TVEFURV9ESVNDT05ORUNUSU5HKSB7CisgICAgICAgICAgICAgICAgY29ubmVjdGVkID0gdHJ1ZTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAiRXJyb3Igb25JbnB1dERldmljZUNvbm5lY3Rpb25SZXN1bHQuIFN0YXRlIGlzOiIgKyBzdGF0ZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtQmx1ZXRvb3RoU2VydmljZS5oYW5kbGVJbnB1dERldmljZVByb3BlcnR5Q2hhbmdlKGFkZHJlc3MsIGNvbm5lY3RlZCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgb25QYW5EZXZpY2VDb25uZWN0aW9uUmVzdWx0KFN0cmluZyBwYXRoLCBib29sZWFuIHJlc3VsdCkgeworICAgICAgICBsb2cgKCJvblBhbkRldmljZUNvbm5lY3Rpb25SZXN1bHQgIiArIHBhdGggKyAiICIgKyByZXN1bHQpOworICAgICAgICAvLyBTdWNjZXNzIGNhc2UgZ2V0cyBoYW5kbGVkIGJ5IFByb3BlcnR5IENoYW5nZSBzaWduYWwKKyAgICAgICAgaWYgKCFyZXN1bHQpIHsKKyAgICAgICAgICAgIFN0cmluZyBhZGRyZXNzID0gbUJsdWV0b290aFNlcnZpY2UuZ2V0QWRkcmVzc0Zyb21PYmplY3RQYXRoKHBhdGgpOworICAgICAgICAgICAgaWYgKGFkZHJlc3MgPT0gbnVsbCkgcmV0dXJuOworCisgICAgICAgICAgICBib29sZWFuIGNvbm5lY3RlZCA9IGZhbHNlOworICAgICAgICAgICAgQmx1ZXRvb3RoRGV2aWNlIGRldmljZSA9IG1BZGFwdGVyLmdldFJlbW90ZURldmljZShhZGRyZXNzKTsKKyAgICAgICAgICAgIGludCBzdGF0ZSA9IG1CbHVldG9vdGhTZXJ2aWNlLmdldFBhbkRldmljZVN0YXRlKGRldmljZSk7CisgICAgICAgICAgICBpZiAoc3RhdGUgPT0gQmx1ZXRvb3RoUGFuLlNUQVRFX0NPTk5FQ1RJTkcpIHsKKyAgICAgICAgICAgICAgICBjb25uZWN0ZWQgPSBmYWxzZTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoc3RhdGUgPT0gQmx1ZXRvb3RoUGFuLlNUQVRFX0RJU0NPTk5FQ1RJTkcpIHsKKyAgICAgICAgICAgICAgICBjb25uZWN0ZWQgPSB0cnVlOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBMb2cuZShUQUcsICJFcnJvciBvblBhbkRldmljZUNvbm5lY3Rpb25SZXN1bHQuIFN0YXRlIGlzOiAiCisgICAgICAgICAgICAgICAgICAgICAgICArIHN0YXRlICsgIiByZXN1bHQ6ICIrIHJlc3VsdCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpbnQgbmV3U3RhdGUgPSBjb25uZWN0ZWQ/IEJsdWV0b290aFBhbi5TVEFURV9DT05ORUNURUQgOgorICAgICAgICAgICAgICAgIEJsdWV0b290aFBhbi5TVEFURV9ESVNDT05ORUNURUQ7CisgICAgICAgICAgICBtQmx1ZXRvb3RoU2VydmljZS5oYW5kbGVQYW5EZXZpY2VTdGF0ZUNoYW5nZShkZXZpY2UsIG5ld1N0YXRlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBvbk5ldHdvcmtEZXZpY2VEaXNjb25uZWN0ZWQoU3RyaW5nIGFkZHJlc3MpIHsKKyAgICAgICAgQmx1ZXRvb3RoRGV2aWNlIGRldmljZSA9IG1BZGFwdGVyLmdldFJlbW90ZURldmljZShhZGRyZXNzKTsKKyAgICAgICAgbUJsdWV0b290aFNlcnZpY2UuaGFuZGxlUGFuRGV2aWNlU3RhdGVDaGFuZ2UoZGV2aWNlLCBCbHVldG9vdGhQYW4uU1RBVEVfRElTQ09OTkVDVEVEKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgb25OZXR3b3JrRGV2aWNlQ29ubmVjdGVkKFN0cmluZyBhZGRyZXNzLCBTdHJpbmcgaWZhY2UsIGludCBkZXN0VXVpZCkgeworICAgICAgICBCbHVldG9vdGhEZXZpY2UgZGV2aWNlID0gbUFkYXB0ZXIuZ2V0UmVtb3RlRGV2aWNlKGFkZHJlc3MpOworICAgICAgICBtQmx1ZXRvb3RoU2VydmljZS5oYW5kbGVQYW5EZXZpY2VTdGF0ZUNoYW5nZShkZXZpY2UsIGlmYWNlLCBCbHVldG9vdGhQYW4uU1RBVEVfQ09OTkVDVEVEKTsKKyAgICB9CisKICAgICBwcml2YXRlIHZvaWQgb25SZXN0YXJ0UmVxdWlyZWQoKSB7CiAgICAgICAgIGlmIChtQmx1ZXRvb3RoU2VydmljZS5pc0VuYWJsZWQoKSkgewogICAgICAgICAgICAgTG9nLmUoVEFHLCAiKioqIEEgc2VyaW91cyBlcnJvciBvY2N1cmVkIChkaWQgYmx1ZXRvb3RoZCBjcmFzaD8pIC0gIiArCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9zZXJ2ZXIvQmx1ZXRvb3RoU2VydmljZS5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvc2VydmVyL0JsdWV0b290aFNlcnZpY2UuamF2YQppbmRleCBkZmUzYTI1Li43ZjE2MGM0IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9zZXJ2ZXIvQmx1ZXRvb3RoU2VydmljZS5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3NlcnZlci9CbHVldG9vdGhTZXJ2aWNlLmphdmEKQEAgLTI5LDcgKzI5LDkgQEAKIGltcG9ydCBhbmRyb2lkLmJsdWV0b290aC5CbHVldG9vdGhEZXZpY2U7CiBpbXBvcnQgYW5kcm9pZC5ibHVldG9vdGguQmx1ZXRvb3RoSGVhZHNldDsKIGltcG9ydCBhbmRyb2lkLmJsdWV0b290aC5CbHVldG9vdGhEZXZpY2VQcm9maWxlU3RhdGU7CitpbXBvcnQgYW5kcm9pZC5ibHVldG9vdGguQmx1ZXRvb3RoUGFuOwogaW1wb3J0IGFuZHJvaWQuYmx1ZXRvb3RoLkJsdWV0b290aFByb2ZpbGVTdGF0ZTsKK2ltcG9ydCBhbmRyb2lkLmJsdWV0b290aC5CbHVldG9vdGhJbnB1dERldmljZTsKIGltcG9ydCBhbmRyb2lkLmJsdWV0b290aC5CbHVldG9vdGhTb2NrZXQ7CiBpbXBvcnQgYW5kcm9pZC5ibHVldG9vdGguQmx1ZXRvb3RoVXVpZDsKIGltcG9ydCBhbmRyb2lkLmJsdWV0b290aC5JQmx1ZXRvb3RoOwpAQCAtNDAsOSArNDIsMTMgQEAKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnRGaWx0ZXI7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LlNoYXJlZFByZWZlcmVuY2VzOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuUmVzb3VyY2VzLk5vdEZvdW5kRXhjZXB0aW9uOworaW1wb3J0IGFuZHJvaWQubmV0LkNvbm5lY3Rpdml0eU1hbmFnZXI7CitpbXBvcnQgYW5kcm9pZC5uZXQuSW50ZXJmYWNlQ29uZmlndXJhdGlvbjsKIGltcG9ydCBhbmRyb2lkLm9zLkJpbmRlcjsKIGltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXI7CiBpbXBvcnQgYW5kcm9pZC5vcy5JQmluZGVyOworaW1wb3J0IGFuZHJvaWQub3MuSU5ldHdvcmtNYW5hZ2VtZW50U2VydmljZTsKIGltcG9ydCBhbmRyb2lkLm9zLk1lc3NhZ2U7CiBpbXBvcnQgYW5kcm9pZC5vcy5QYXJjZWxVdWlkOwogaW1wb3J0IGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uOwpAQCAtNzEsOCArNzcsMTAgQEAKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwogaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CiBpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CiBpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwogaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLlNldDsKIAogcHVibGljIGNsYXNzIEJsdWV0b290aFNlcnZpY2UgZXh0ZW5kcyBJQmx1ZXRvb3RoLlN0dWIgewogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiQmx1ZXRvb3RoU2VydmljZSI7CkBAIC04NSw2ICs5Myw3IEBACiAgICAgcHJpdmF0ZSBpbnQgbUJsdWV0b290aFN0YXRlOwogICAgIHByaXZhdGUgYm9vbGVhbiBtUmVzdGFydCA9IGZhbHNlOyAgLy8gbmVlZCB0byBjYWxsIGVuYWJsZSgpIGFmdGVyIGRpc2FibGUoKQogICAgIHByaXZhdGUgYm9vbGVhbiBtSXNEaXNjb3ZlcmluZzsKKyAgICBwcml2YXRlIGJvb2xlYW4gbVRldGhlcmluZ09uOwogCiAgICAgcHJpdmF0ZSBCbHVldG9vdGhBZGFwdGVyIG1BZGFwdGVyOyAgLy8gY29uc3RhbnQgYWZ0ZXIgaW5pdCgpCiAgICAgcHJpdmF0ZSBmaW5hbCBCb25kU3RhdGUgbUJvbmRTdGF0ZSA9IG5ldyBCb25kU3RhdGUoKTsgIC8vIGxvY2FsIGNhY2hlIG9mIGJvbmRpbmdzCkBAIC0xMTMsNiArMTIyLDEzIEBACiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBJTklUX0FVVE9fUEFJUklOR19GQUlMVVJFX0FUVEVNUFRfREVMQVkgPSAzMDAwOwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgTUFYX0FVVE9fUEFJUklOR19GQUlMVVJFX0FUVEVNUFRfREVMQVkgPSAxMjAwMDsKIAorICAgIHByaXZhdGUgQXJyYXlMaXN0PFN0cmluZz4gbUJsdWV0b290aElmYWNlQWRkcmVzc2VzOworICAgIHByaXZhdGUgaW50IG1NYXhQYW5EZXZpY2VzOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJMVUVUT09USF9JRkFDRV9BRERSX1NUQVJUPSAiMTkyLjE2OC40NC4xIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQkxVRVRPT1RIX01BWF9QQU5fQ09OTkVDVElPTlMgPSA1OworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCTFVFVE9PVEhfTkVUTUFTSyAgICAgICAgPSAiMjU1LjI1NS4yNTUuMCI7CisKICAgICAvLyBUaGUgdGltZW91dCB1c2VkIHRvIHNlbnQgdGhlIFVVSURzIEludGVudAogICAgIC8vIFRoaXMgdGltZW91dCBzaG91bGQgYmUgZ3JlYXRlciB0aGFuIHRoZSBwYWdlIHRpbWVvdXQKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgVVVJRF9JTlRFTlRfREVMQVkgPSA2MDAwOwpAQCAtMTM2LDEwICsxNTIsMTQgQEAKICAgICBwcml2YXRlIGZpbmFsIEhhc2hNYXA8U3RyaW5nLCBCbHVldG9vdGhEZXZpY2VQcm9maWxlU3RhdGU+IG1EZXZpY2VQcm9maWxlU3RhdGU7CiAgICAgcHJpdmF0ZSBmaW5hbCBCbHVldG9vdGhQcm9maWxlU3RhdGUgbUEyZHBQcm9maWxlU3RhdGU7CiAgICAgcHJpdmF0ZSBmaW5hbCBCbHVldG9vdGhQcm9maWxlU3RhdGUgbUhmcFByb2ZpbGVTdGF0ZTsKKyAgICBwcml2YXRlIGZpbmFsIEJsdWV0b290aFByb2ZpbGVTdGF0ZSBtSGlkUHJvZmlsZVN0YXRlOwogCiAgICAgcHJpdmF0ZSBCbHVldG9vdGhBMmRwU2VydmljZSBtQTJkcFNlcnZpY2U7CisgICAgcHJpdmF0ZSBmaW5hbCBIYXNoTWFwPEJsdWV0b290aERldmljZSwgSW50ZWdlcj4gbUlucHV0RGV2aWNlczsKKyAgICBwcml2YXRlIGZpbmFsIEhhc2hNYXA8Qmx1ZXRvb3RoRGV2aWNlLCBQYWlyPEludGVnZXIsIFN0cmluZz4+IG1QYW5EZXZpY2VzOwogICAgIHByaXZhdGUgZmluYWwgSGFzaE1hcDxTdHJpbmcsIFBhaXI8Ynl0ZVtdLCBieXRlW10+PiBtRGV2aWNlT29iRGF0YTsKIAorCiAgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIG1Eb2NrQWRkcmVzczsKICAgICBwcml2YXRlIFN0cmluZyBtRG9ja1BpbjsKIApAQCAtMTkwLDYgKzIxMCw3IEBACiAKICAgICAgICAgbUJsdWV0b290aFN0YXRlID0gQmx1ZXRvb3RoQWRhcHRlci5TVEFURV9PRkY7CiAgICAgICAgIG1Jc0Rpc2NvdmVyaW5nID0gZmFsc2U7CisgICAgICAgIG1UZXRoZXJpbmdPbiA9IGZhbHNlOwogICAgICAgICBtQWRhcHRlclByb3BlcnRpZXMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKTsKICAgICAgICAgbURldmljZVByb3BlcnRpZXMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE1hcDxTdHJpbmcsU3RyaW5nPj4oKTsKIApAQCAtMjAxLDE1ICsyMjIsMjcgQEAKICAgICAgICAgbURldmljZVByb2ZpbGVTdGF0ZSA9IG5ldyBIYXNoTWFwPFN0cmluZywgQmx1ZXRvb3RoRGV2aWNlUHJvZmlsZVN0YXRlPigpOwogICAgICAgICBtQTJkcFByb2ZpbGVTdGF0ZSA9IG5ldyBCbHVldG9vdGhQcm9maWxlU3RhdGUobUNvbnRleHQsIEJsdWV0b290aFByb2ZpbGVTdGF0ZS5BMkRQKTsKICAgICAgICAgbUhmcFByb2ZpbGVTdGF0ZSA9IG5ldyBCbHVldG9vdGhQcm9maWxlU3RhdGUobUNvbnRleHQsIEJsdWV0b290aFByb2ZpbGVTdGF0ZS5IRlApOworICAgICAgICBtSGlkUHJvZmlsZVN0YXRlID0gbmV3IEJsdWV0b290aFByb2ZpbGVTdGF0ZShtQ29udGV4dCwgQmx1ZXRvb3RoUHJvZmlsZVN0YXRlLkhJRCk7CisKKyAgICAgICAgbUJsdWV0b290aElmYWNlQWRkcmVzc2VzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBtTWF4UGFuRGV2aWNlcyA9IGNvbnRleHQuZ2V0UmVzb3VyY2VzKCkuZ2V0SW50ZWdlcigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmludGVnZXIuY29uZmlnX21heF9wYW5fZGV2aWNlcyk7CisgICAgICAgIH0gY2F0Y2ggKE5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIG1NYXhQYW5EZXZpY2VzID0gQkxVRVRPT1RIX01BWF9QQU5fQ09OTkVDVElPTlM7CisgICAgICAgIH0KIAogICAgICAgICBtSGZwUHJvZmlsZVN0YXRlLnN0YXJ0KCk7CiAgICAgICAgIG1BMmRwUHJvZmlsZVN0YXRlLnN0YXJ0KCk7CisgICAgICAgIG1IaWRQcm9maWxlU3RhdGUuc3RhcnQoKTsKIAogICAgICAgICBJbnRlbnRGaWx0ZXIgZmlsdGVyID0gbmV3IEludGVudEZpbHRlcigpOwogICAgICAgICByZWdpc3RlckZvckFpcnBsYW5lTW9kZShmaWx0ZXIpOwogCiAgICAgICAgIGZpbHRlci5hZGRBY3Rpb24oSW50ZW50LkFDVElPTl9ET0NLX0VWRU5UKTsKICAgICAgICAgbUNvbnRleHQucmVnaXN0ZXJSZWNlaXZlcihtUmVjZWl2ZXIsIGZpbHRlcik7CisgICAgICAgIG1JbnB1dERldmljZXMgPSBuZXcgSGFzaE1hcDxCbHVldG9vdGhEZXZpY2UsIEludGVnZXI+KCk7CisgICAgICAgIG1QYW5EZXZpY2VzID0gbmV3IEhhc2hNYXA8Qmx1ZXRvb3RoRGV2aWNlLCBQYWlyPEludGVnZXIsIFN0cmluZz4+KCk7CiAgICAgfQogCiAgICAgcHVibGljIHN0YXRpYyBzeW5jaHJvbml6ZWQgU3RyaW5nIHJlYWREb2NrQmx1ZXRvb3RoQWRkcmVzcygpIHsKQEAgLTMzNyw2ICszNzAsNyBAQAogICAgICAgICB9CiAgICAgICAgIHNldEJsdWV0b290aFN0YXRlKEJsdWV0b290aEFkYXB0ZXIuU1RBVEVfVFVSTklOR19PRkYpOwogICAgICAgICBtSGFuZGxlci5yZW1vdmVNZXNzYWdlcyhNRVNTQUdFX1JFR0lTVEVSX1NEUF9SRUNPUkRTKTsKKyAgICAgICAgc2V0Qmx1ZXRvb3RoVGV0aGVyaW5nTmF0aXZlKGZhbHNlLCBCbHVldG9vdGhQYW4uTkFQX1JPTEUsIEJsdWV0b290aFBhbi5OQVBfQlJJREdFKTsKIAogICAgICAgICAvLyBBbGxvdyAzIHNlY29uZHMgZm9yIHByb2ZpbGVzIHRvIGdyYWNlZnVsbHkgZGlzY29ubmVjdAogICAgICAgICAvLyBUT0RPOiBJbnRyb2R1Y2UgYSBjYWxsYmFjayBtZWNoYW5pc20gc28gdGhhdCBlYWNoIHByb2ZpbGUgY2FuIG5vdGlmeQpAQCAtNTY3LDggKzYwMSwxMiBAQAogICAgICAgICAgICAgICAgIG1Cb25kU3RhdGUucmVhZEF1dG9QYWlyaW5nRGF0YSgpOwogICAgICAgICAgICAgICAgIG1Cb25kU3RhdGUubG9hZEJvbmRTdGF0ZSgpOwogICAgICAgICAgICAgICAgIGluaXRQcm9maWxlU3RhdGUoKTsKKworICAgICAgICAgICAgICAgIC8vUmVnaXN0ZXIgU0RQIHJlY29yZHMuCiAgICAgICAgICAgICAgICAgbUhhbmRsZXIuc2VuZE1lc3NhZ2VEZWxheWVkKAogICAgICAgICAgICAgICAgICAgICAgICAgbUhhbmRsZXIub2J0YWluTWVzc2FnZShNRVNTQUdFX1JFR0lTVEVSX1NEUF9SRUNPUkRTLCAxLCAtMSksIDMwMDApOworICAgICAgICAgICAgICAgIHNldEJsdWV0b290aFRldGhlcmluZ05hdGl2ZSh0cnVlLCBCbHVldG9vdGhQYW4uTkFQX1JPTEUsIEJsdWV0b290aFBhbi5OQVBfQlJJREdFKTsKKwogCiAgICAgICAgICAgICAgICAgLy8gTG9nIGJsdWV0b290aCBvbiB0byBiYXR0ZXJ5IHN0YXRzLgogICAgICAgICAgICAgICAgIGxvbmcgaWRlbnQgPSBCaW5kZXIuY2xlYXJDYWxsaW5nSWRlbnRpdHkoKTsKQEAgLTc0Nyw2ICs3ODUsMTAgQEAKICAgICAgICAgICAgICAgICByZW1vdmVQcm9maWxlU3RhdGUoYWRkcmVzcyk7CiAgICAgICAgICAgICB9CiAKKyAgICAgICAgICAgIC8vIEhJRCBpcyBoYW5kbGVkIGJ5IEJsdWV0b290aFNlcnZpY2UsIG90aGVyIHByb2ZpbGVzCisgICAgICAgICAgICAvLyB3aWxsIGJlIGhhbmRsZWQgYnkgdGhlaXIgcmVzcGVjdGl2ZSBzZXJ2aWNlcy4KKyAgICAgICAgICAgIHNldEluaXRpYWxJbnB1dERldmljZVByaW9yaXR5KG1BZGFwdGVyLmdldFJlbW90ZURldmljZShhZGRyZXNzKSwgc3RhdGUpOworCiAgICAgICAgICAgICBpZiAoREJHKSBsb2coYWRkcmVzcyArICIgYm9uZCBzdGF0ZSAiICsgb2xkU3RhdGUgKyAiIC0+ICIgKyBzdGF0ZSArICIgKCIgKwogICAgICAgICAgICAgICAgICAgICAgICAgIHJlYXNvbiArICIpIik7CiAgICAgICAgICAgICBJbnRlbnQgaW50ZW50ID0gbmV3IEludGVudChCbHVldG9vdGhEZXZpY2UuQUNUSU9OX0JPTkRfU1RBVEVfQ0hBTkdFRCk7CkBAIC0xMzYyLDYgKzE0MDQsNDA5IEBACiAgICAgICAgIHJldHVybiBzcC5jb250YWlucyhTSEFSRURfUFJFRkVSRU5DRV9ET0NLX0FERFJFU1MgKyBhZGRyZXNzKTsKICAgICB9CiAKKyAgICBwdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4gaXNUZXRoZXJpbmdPbigpIHsKKyAgICAgICAgcmV0dXJuIG1UZXRoZXJpbmdPbjsKKyAgICB9CisKKyAgICAvKnBhY2thZ2UqLyBzeW5jaHJvbml6ZWQgYm9vbGVhbiBhbGxvd0luY29taW5nVGV0aGVyaW5nKCkgeworICAgICAgICBpZiAoaXNUZXRoZXJpbmdPbigpICYmIGdldENvbm5lY3RlZFBhbkRldmljZXMoKS5sZW5ndGggPCBtTWF4UGFuRGV2aWNlcykKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcHJpdmF0ZSBCcm9hZGNhc3RSZWNlaXZlciBtVGV0aGVyaW5nUmVjZWl2ZXIgPSBudWxsOworCisgICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHNldEJsdWV0b290aFRldGhlcmluZyhib29sZWFuIHZhbHVlKSB7CisgICAgICAgIGlmICghdmFsdWUpIHsKKyAgICAgICAgICAgIGRpc2Nvbm5lY3RQYW4oKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChnZXRCbHVldG9vdGhTdGF0ZSgpICE9IEJsdWV0b290aEFkYXB0ZXIuU1RBVEVfT04gJiYgdmFsdWUpIHsKKyAgICAgICAgICAgIEludGVudEZpbHRlciBmaWx0ZXIgPSBuZXcgSW50ZW50RmlsdGVyKCk7CisgICAgICAgICAgICBmaWx0ZXIuYWRkQWN0aW9uKEJsdWV0b290aEFkYXB0ZXIuQUNUSU9OX1NUQVRFX0NIQU5HRUQpOworICAgICAgICAgICAgbVRldGhlcmluZ1JlY2VpdmVyID0gbmV3IEJyb2FkY2FzdFJlY2VpdmVyKCkgeworICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBvblJlY2VpdmUoQ29udGV4dCBjb250ZXh0LCBJbnRlbnQgaW50ZW50KSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChpbnRlbnQuZ2V0SW50RXh0cmEoQmx1ZXRvb3RoQWRhcHRlci5FWFRSQV9TVEFURSwgQmx1ZXRvb3RoQWRhcHRlci5TVEFURV9PRkYpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT0gQmx1ZXRvb3RoQWRhcHRlci5TVEFURV9PTikgeworICAgICAgICAgICAgICAgICAgICAgICAgbVRldGhlcmluZ09uID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1Db250ZXh0LnVucmVnaXN0ZXJSZWNlaXZlcihtVGV0aGVyaW5nUmVjZWl2ZXIpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfTsKKyAgICAgICAgICAgIG1Db250ZXh0LnJlZ2lzdGVyUmVjZWl2ZXIobVRldGhlcmluZ1JlY2VpdmVyLCBmaWx0ZXIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbVRldGhlcmluZ09uID0gdmFsdWU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3luY2hyb25pemVkIGludCBnZXRQYW5EZXZpY2VTdGF0ZShCbHVldG9vdGhEZXZpY2UgZGV2aWNlKSB7CisgICAgICAgIG1Db250ZXh0LmVuZm9yY2VDYWxsaW5nT3JTZWxmUGVybWlzc2lvbihCTFVFVE9PVEhfUEVSTSwgIk5lZWQgQkxVRVRPT1RIIHBlcm1pc3Npb24iKTsKKworICAgICAgICBQYWlyPEludGVnZXIsIFN0cmluZz4gcGFuRGV2aWNlID0gbVBhbkRldmljZXMuZ2V0KGRldmljZSk7CisgICAgICAgIGlmIChwYW5EZXZpY2UgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIEJsdWV0b290aFBhbi5TVEFURV9ESVNDT05ORUNURUQ7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHBhbkRldmljZS5maXJzdDsKKyAgICB9CisKKyAgICBwdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4gY29ubmVjdFBhbkRldmljZShCbHVldG9vdGhEZXZpY2UgZGV2aWNlKSB7CisgICAgICAgIG1Db250ZXh0LmVuZm9yY2VDYWxsaW5nT3JTZWxmUGVybWlzc2lvbihCTFVFVE9PVEhfQURNSU5fUEVSTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJOZWVkIEJMVUVUT09USF9BRE1JTiBwZXJtaXNzaW9uIik7CisKKyAgICAgICAgU3RyaW5nIG9iamVjdFBhdGggPSBnZXRPYmplY3RQYXRoRnJvbUFkZHJlc3MoZGV2aWNlLmdldEFkZHJlc3MoKSk7CisgICAgICAgIGlmIChEQkcpIGxvZygiY29ubmVjdCBQQU4oIiArIG9iamVjdFBhdGggKyAiKSIpOworICAgICAgICBpZiAoZ2V0UGFuRGV2aWNlU3RhdGUoZGV2aWNlKSAhPSBCbHVldG9vdGhQYW4uU1RBVEVfRElTQ09OTkVDVEVEKSB7CisgICAgICAgICAgICBsb2cgKGRldmljZSArICIgYWxyZWFkeSBjb25uZWN0ZWQgdG8gUEFOIik7CisgICAgICAgIH0KKworICAgICAgICBpbnQgY29ubmVjdGVkQ291bnQgPSAwOworICAgICAgICBmb3IgKEJsdWV0b290aERldmljZSBwYW5EZXZpY2U6IG1QYW5EZXZpY2VzLmtleVNldCgpKSB7CisgICAgICAgICAgICBpZiAoZ2V0UGFuRGV2aWNlU3RhdGUocGFuRGV2aWNlKSA9PSBCbHVldG9vdGhQYW4uU1RBVEVfQ09OTkVDVEVEKSB7CisgICAgICAgICAgICAgICAgY29ubmVjdGVkQ291bnQgKys7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKGNvbm5lY3RlZENvdW50ID4gOCkgeworICAgICAgICAgICAgbG9nIChkZXZpY2UgKyAiIGNvdWxkIG5vdCBjb25uZWN0IHRvIFBBTiBiZWNhdXNlIDggb3RoZXIgZGV2aWNlcyBhcmUgYWxyZWFkeSBjb25uZWN0ZWQiKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIGhhbmRsZVBhbkRldmljZVN0YXRlQ2hhbmdlKGRldmljZSwgQmx1ZXRvb3RoUGFuLlNUQVRFX0NPTk5FQ1RJTkcpOworICAgICAgICBpZiAoY29ubmVjdFBhbkRldmljZU5hdGl2ZShvYmplY3RQYXRoLCAibmFwIiwgInBhbnUiKSkgeworICAgICAgICAgICAgbG9nICgiY29ubmVjdGluZyB0byBQQU4iKTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaGFuZGxlUGFuRGV2aWNlU3RhdGVDaGFuZ2UoZGV2aWNlLCBCbHVldG9vdGhQYW4uU1RBVEVfRElTQ09OTkVDVEVEKTsKKyAgICAgICAgICAgIGxvZyAoImNvdWxkIG5vdCBjb25uZWN0IHRvIFBBTiIpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzeW5jaHJvbml6ZWQgYm9vbGVhbiBkaXNjb25uZWN0UGFuKCkgeworICAgICAgICBtQ29udGV4dC5lbmZvcmNlQ2FsbGluZ09yU2VsZlBlcm1pc3Npb24oQkxVRVRPT1RIX1BFUk0sICJOZWVkIEJMVUVUT09USCBwZXJtaXNzaW9uIik7CisgICAgICAgIGlmIChEQkcpIGxvZygiZGlzY29ubmVjdCBhbGwgUEFOIGRldmljZXMiKTsKKworICAgICAgICBmb3IgKEJsdWV0b290aERldmljZSBkZXZpY2U6IG1QYW5EZXZpY2VzLmtleVNldCgpKSB7CisgICAgICAgICAgICBpZiAoZ2V0UGFuRGV2aWNlU3RhdGUoZGV2aWNlKSA9PSBCbHVldG9vdGhQYW4uU1RBVEVfQ09OTkVDVEVEKSB7CisgICAgICAgICAgICAgICAgaWYgKCFkaXNjb25uZWN0UGFuRGV2aWNlKGRldmljZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgbG9nICgiY291bGQgbm90IGRpc2Nvbm5lY3QgUGFuIERldmljZSAiK2RldmljZS5nZXRBZGRyZXNzKCkpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgQmx1ZXRvb3RoRGV2aWNlW10gZ2V0Q29ubmVjdGVkUGFuRGV2aWNlcygpIHsKKyAgICAgICAgbUNvbnRleHQuZW5mb3JjZUNhbGxpbmdPclNlbGZQZXJtaXNzaW9uKEJMVUVUT09USF9QRVJNLCAiTmVlZCBCTFVFVE9PVEggcGVybWlzc2lvbiIpOworCisgICAgICAgIFNldDxCbHVldG9vdGhEZXZpY2U+IGRldmljZXMgPSBuZXcgSGFzaFNldDxCbHVldG9vdGhEZXZpY2U+KCk7CisgICAgICAgIGZvciAoQmx1ZXRvb3RoRGV2aWNlIGRldmljZTogbVBhbkRldmljZXMua2V5U2V0KCkpIHsKKyAgICAgICAgICAgIGlmIChnZXRQYW5EZXZpY2VTdGF0ZShkZXZpY2UpID09IEJsdWV0b290aFBhbi5TVEFURV9DT05ORUNURUQpIHsKKyAgICAgICAgICAgICAgICBkZXZpY2VzLmFkZChkZXZpY2UpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBkZXZpY2VzLnRvQXJyYXkobmV3IEJsdWV0b290aERldmljZVtkZXZpY2VzLnNpemUoKV0pOworICAgIH0KKworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgYm9vbGVhbiBkaXNjb25uZWN0UGFuRGV2aWNlKEJsdWV0b290aERldmljZSBkZXZpY2UpIHsKKyAgICAgICAgbUNvbnRleHQuZW5mb3JjZUNhbGxpbmdPclNlbGZQZXJtaXNzaW9uKEJMVUVUT09USF9BRE1JTl9QRVJNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk5lZWQgQkxVRVRPT1RIX0FETUlOIHBlcm1pc3Npb24iKTsKKyAgICAgICAgU3RyaW5nIG9iamVjdFBhdGggPSBnZXRPYmplY3RQYXRoRnJvbUFkZHJlc3MoZGV2aWNlLmdldEFkZHJlc3MoKSk7CisgICAgICAgIGlmIChEQkcpIGxvZygiZGlzY29ubmVjdCBQQU4oIiArIG9iamVjdFBhdGggKyAiKSIpOworICAgICAgICBpZiAoZ2V0UGFuRGV2aWNlU3RhdGUoZGV2aWNlKSAhPSBCbHVldG9vdGhQYW4uU1RBVEVfQ09OTkVDVEVEKSB7CisgICAgICAgICAgICBsb2cgKGRldmljZSArICIgYWxyZWFkeSBkaXNjb25uZWN0ZWQgZnJvbSBQQU4iKTsKKyAgICAgICAgfQorICAgICAgICBoYW5kbGVQYW5EZXZpY2VTdGF0ZUNoYW5nZShkZXZpY2UsIEJsdWV0b290aFBhbi5TVEFURV9ESVNDT05ORUNUSU5HKTsKKyAgICAgICAgcmV0dXJuIGRpc2Nvbm5lY3RQYW5EZXZpY2VOYXRpdmUob2JqZWN0UGF0aCk7CisgICAgfQorCisgICAgLypwYWNrYWdlKi8gc3luY2hyb25pemVkIHZvaWQgaGFuZGxlUGFuRGV2aWNlU3RhdGVDaGFuZ2UoQmx1ZXRvb3RoRGV2aWNlIGRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgaWZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0YXRlKSB7CisgICAgICAgIGludCBwcmV2U3RhdGU7CisgICAgICAgIFN0cmluZyBpZmFjZUFkZHIgPSBudWxsOworCisgICAgICAgIGlmIChtUGFuRGV2aWNlcy5nZXQoZGV2aWNlKSA9PSBudWxsKSB7CisgICAgICAgICAgICBwcmV2U3RhdGUgPSBCbHVldG9vdGhQYW4uU1RBVEVfRElTQ09OTkVDVEVEOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcHJldlN0YXRlID0gbVBhbkRldmljZXMuZ2V0KGRldmljZSkuZmlyc3Q7CisgICAgICAgICAgICBpZmFjZUFkZHIgPSBtUGFuRGV2aWNlcy5nZXQoZGV2aWNlKS5zZWNvbmQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHByZXZTdGF0ZSA9PSBzdGF0ZSkgcmV0dXJuOworCisgICAgICAgIGlmIChzdGF0ZSA9PSBCbHVldG9vdGhQYW4uU1RBVEVfQ09OTkVDVEVEKSB7CisgICAgICAgICAgICBpZmFjZUFkZHIgPSBlbmFibGVUZXRoZXJpbmcoaWZhY2UpOworICAgICAgICAgICAgaWYgKGlmYWNlQWRkciA9PSBudWxsKSBMb2cuZShUQUcsICJFcnJvciBzZXRpbmcgdXAgdGV0aGVyIGludGVyZmFjZSIpOworICAgICAgICB9IGVsc2UgaWYgKHN0YXRlID09IEJsdWV0b290aFBhbi5TVEFURV9ESVNDT05ORUNURUQpIHsKKyAgICAgICAgICAgIGlmIChpZmFjZUFkZHIgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG1CbHVldG9vdGhJZmFjZUFkZHJlc3Nlcy5yZW1vdmUoaWZhY2VBZGRyKTsKKyAgICAgICAgICAgICAgICBpZmFjZUFkZHIgPSBudWxsOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgUGFpcjxJbnRlZ2VyLCBTdHJpbmc+IHZhbHVlID0gbmV3IFBhaXI8SW50ZWdlciwgU3RyaW5nPihzdGF0ZSwgaWZhY2VBZGRyKTsKKyAgICAgICAgbVBhbkRldmljZXMucHV0KGRldmljZSwgdmFsdWUpOworCisgICAgICAgIEludGVudCBpbnRlbnQgPSBuZXcgSW50ZW50KEJsdWV0b290aFBhbi5BQ1RJT05fUEFOX1NUQVRFX0NIQU5HRUQpOworICAgICAgICBpbnRlbnQucHV0RXh0cmEoQmx1ZXRvb3RoRGV2aWNlLkVYVFJBX0RFVklDRSwgZGV2aWNlKTsKKyAgICAgICAgaW50ZW50LnB1dEV4dHJhKEJsdWV0b290aFBhbi5FWFRSQV9QUkVWSU9VU19QQU5fU1RBVEUsIHByZXZTdGF0ZSk7CisgICAgICAgIGludGVudC5wdXRFeHRyYShCbHVldG9vdGhQYW4uRVhUUkFfUEFOX1NUQVRFLCBzdGF0ZSk7CisgICAgICAgIG1Db250ZXh0LnNlbmRCcm9hZGNhc3QoaW50ZW50LCBCTFVFVE9PVEhfUEVSTSk7CisKKyAgICAgICAgaWYgKERCRykgbG9nKCJQYW4gRGV2aWNlIHN0YXRlIDogZGV2aWNlOiAiICsgZGV2aWNlICsgIiBTdGF0ZToiICsgcHJldlN0YXRlICsgIi0+IiArIHN0YXRlKTsKKyAgICB9CisKKyAgICAvKnBhY2thZ2UqLyBzeW5jaHJvbml6ZWQgdm9pZCBoYW5kbGVQYW5EZXZpY2VTdGF0ZUNoYW5nZShCbHVldG9vdGhEZXZpY2UgZGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdGF0ZSkgeworICAgICAgICBoYW5kbGVQYW5EZXZpY2VTdGF0ZUNoYW5nZShkZXZpY2UsIG51bGwsIHN0YXRlKTsKKyAgICB9CisKKyAgICBwcml2YXRlIFN0cmluZyBjcmVhdGVOZXdUZXRoZXJpbmdBZGRyZXNzTG9ja2VkKCkgeworICAgICAgICBpZiAoZ2V0Q29ubmVjdGVkUGFuRGV2aWNlcygpLmxlbmd0aCA9PSBtTWF4UGFuRGV2aWNlcykgeworICAgICAgICAgICAgbG9nKCJNYXggUEFOIGRldmljZSBjb25uZWN0aW9ucyByZWFjaGVkIik7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgICAgICBTdHJpbmcgYWRkcmVzcyA9IEJMVUVUT09USF9JRkFDRV9BRERSX1NUQVJUOworICAgICAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICAgICAgaWYgKG1CbHVldG9vdGhJZmFjZUFkZHJlc3Nlcy5jb250YWlucyhhZGRyZXNzKSkgeworICAgICAgICAgICAgICAgIFN0cmluZ1tdIGFkZHIgPSBhZGRyZXNzLnNwbGl0KCJcXC4iKTsKKyAgICAgICAgICAgICAgICBJbnRlZ2VyIG5ld0lwID0gSW50ZWdlci5wYXJzZUludChhZGRyWzJdKSArIDE7CisgICAgICAgICAgICAgICAgYWRkcmVzcyA9IGFkZHJlc3MucmVwbGFjZShhZGRyWzJdLCBuZXdJcC50b1N0cmluZygpKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgbUJsdWV0b290aElmYWNlQWRkcmVzc2VzLmFkZChhZGRyZXNzKTsKKyAgICAgICAgcmV0dXJuIGFkZHJlc3M7CisgICAgfQorCisgICAgLy8gY29uZmlndXJlZCB3aGVuIHdlIHN0YXJ0IHRldGhlcmluZworICAgIHByaXZhdGUgc3luY2hyb25pemVkIFN0cmluZyBlbmFibGVUZXRoZXJpbmcoU3RyaW5nIGlmYWNlKSB7CisgICAgICAgIGxvZygidXBkYXRlVGV0aGVyU3RhdGU6IiArIGlmYWNlKTsKKworICAgICAgICBJQmluZGVyIGIgPSBTZXJ2aWNlTWFuYWdlci5nZXRTZXJ2aWNlKENvbnRleHQuTkVUV09SS01BTkFHRU1FTlRfU0VSVklDRSk7CisgICAgICAgIElOZXR3b3JrTWFuYWdlbWVudFNlcnZpY2Ugc2VydmljZSA9IElOZXR3b3JrTWFuYWdlbWVudFNlcnZpY2UuU3R1Yi5hc0ludGVyZmFjZShiKTsKKyAgICAgICAgQ29ubmVjdGl2aXR5TWFuYWdlciBjbSA9CisgICAgICAgICAgICAoQ29ubmVjdGl2aXR5TWFuYWdlciltQ29udGV4dC5nZXRTeXN0ZW1TZXJ2aWNlKENvbnRleHQuQ09OTkVDVElWSVRZX1NFUlZJQ0UpOworICAgICAgICBTdHJpbmdbXSBibHVldG9vdGhSZWdleHMgPSBjbS5nZXRUZXRoZXJhYmxlQmx1ZXRvb3RoUmVnZXhzKCk7CisKKyAgICAgICAgLy8gYnJpbmcgdG9nZ2xlIHRoZSBpbnRlcmZhY2VzCisgICAgICAgIFN0cmluZ1tdIGN1cnJlbnRJZmFjZXMgPSBuZXcgU3RyaW5nWzBdOworICAgICAgICB0cnkgeworICAgICAgICAgICAgY3VycmVudElmYWNlcyA9IHNlcnZpY2UubGlzdEludGVyZmFjZXMoKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIExvZy5lKFRBRywgIkVycm9yIGxpc3RpbmcgSW50ZXJmYWNlcyA6IiArIGUpOworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKworICAgICAgICBib29sZWFuIGZvdW5kID0gZmFsc2U7CisgICAgICAgIGZvciAoU3RyaW5nIGN1cnJJZmFjZTogY3VycmVudElmYWNlcykgeworICAgICAgICAgICAgaWYgKGN1cnJJZmFjZS5lcXVhbHMoaWZhY2UpKSB7CisgICAgICAgICAgICAgICAgZm91bmQgPSB0cnVlOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKCFmb3VuZCkgcmV0dXJuIG51bGw7CisKKyAgICAgICAgU3RyaW5nIGFkZHJlc3MgPSBjcmVhdGVOZXdUZXRoZXJpbmdBZGRyZXNzTG9ja2VkKCk7CisgICAgICAgIGlmIChhZGRyZXNzID09IG51bGwpIHJldHVybiBudWxsOworCisgICAgICAgIEludGVyZmFjZUNvbmZpZ3VyYXRpb24gaWZjZyA9IG51bGw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpZmNnID0gc2VydmljZS5nZXRJbnRlcmZhY2VDb25maWcoaWZhY2UpOworICAgICAgICAgICAgaWYgKGlmY2cgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIFN0cmluZ1tdIGFkZHIgPSBCTFVFVE9PVEhfTkVUTUFTSy5zcGxpdCgiXFwuIik7CisgICAgICAgICAgICAgICAgaWZjZy5uZXRtYXNrID0gKEludGVnZXIucGFyc2VJbnQoYWRkclswXSkgPDwgMjQpICsKKyAgICAgICAgICAgICAgICAgICAgICAgIChJbnRlZ2VyLnBhcnNlSW50KGFkZHJbMV0pIDw8IDE2KSArCisgICAgICAgICAgICAgICAgICAgICAgICAoSW50ZWdlci5wYXJzZUludChhZGRyWzJdKSA8PCA4KSArCisgICAgICAgICAgICAgICAgICAgICAgICAoSW50ZWdlci5wYXJzZUludChhZGRyWzNdKSk7CisgICAgICAgICAgICAgICAgaWYgKGlmY2cuaXBBZGRyID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgYWRkciA9IGFkZHJlc3Muc3BsaXQoIlxcLiIpOworCisgICAgICAgICAgICAgICAgICAgIGlmY2cuaXBBZGRyID0gKEludGVnZXIucGFyc2VJbnQoYWRkclswXSkgPDwgMjQpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoSW50ZWdlci5wYXJzZUludChhZGRyWzFdKSA8PCAxNikgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIChJbnRlZ2VyLnBhcnNlSW50KGFkZHJbMl0pIDw8IDgpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoSW50ZWdlci5wYXJzZUludChhZGRyWzNdKSk7CisgICAgICAgICAgICAgICAgICAgIGlmY2cuaW50ZXJmYWNlRmxhZ3MgPQorICAgICAgICAgICAgICAgICAgICAgICAgaWZjZy5pbnRlcmZhY2VGbGFncy5yZXBsYWNlKCJkb3duIiwgInVwIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmY2cuaW50ZXJmYWNlRmxhZ3MgPSBpZmNnLmludGVyZmFjZUZsYWdzLnJlcGxhY2UoInJ1bm5pbmciLCAiIik7CisgICAgICAgICAgICAgICAgaWZjZy5pbnRlcmZhY2VGbGFncyA9IGlmY2cuaW50ZXJmYWNlRmxhZ3MucmVwbGFjZSgiICAiLCIgIik7CisgICAgICAgICAgICAgICAgc2VydmljZS5zZXRJbnRlcmZhY2VDb25maWcoaWZhY2UsIGlmY2cpOworICAgICAgICAgICAgICAgIGlmIChjbS50ZXRoZXIoaWZhY2UpICE9IENvbm5lY3Rpdml0eU1hbmFnZXIuVEVUSEVSX0VSUk9SX05PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgICAgIExvZy5lKFRBRywgIkVycm9yIHRldGhlcmluZyAiK2lmYWNlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBMb2cuZShUQUcsICJFcnJvciBjb25maWd1cmluZyBpbnRlcmZhY2UgIiArIGlmYWNlICsgIiwgOiIgKyBlKTsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgICAgIHJldHVybiBhZGRyZXNzOworICAgIH0KKworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgYm9vbGVhbiBjb25uZWN0SW5wdXREZXZpY2UoQmx1ZXRvb3RoRGV2aWNlIGRldmljZSkgeworICAgICAgICBtQ29udGV4dC5lbmZvcmNlQ2FsbGluZ09yU2VsZlBlcm1pc3Npb24oQkxVRVRPT1RIX0FETUlOX1BFUk0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTmVlZCBCTFVFVE9PVEhfQURNSU4gcGVybWlzc2lvbiIpOworCisgICAgICAgIFN0cmluZyBvYmplY3RQYXRoID0gZ2V0T2JqZWN0UGF0aEZyb21BZGRyZXNzKGRldmljZS5nZXRBZGRyZXNzKCkpOworICAgICAgICBpZiAob2JqZWN0UGF0aCA9PSBudWxsIHx8CisgICAgICAgICAgICBnZXRJbnB1dERldmljZVN0YXRlKGRldmljZSkgIT0gQmx1ZXRvb3RoSW5wdXREZXZpY2UuU1RBVEVfRElTQ09OTkVDVEVEIHx8CisgICAgICAgICAgICBnZXRJbnB1dERldmljZVByaW9yaXR5KGRldmljZSkgPT0gQmx1ZXRvb3RoSW5wdXREZXZpY2UuUFJJT1JJVFlfT0ZGKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgQmx1ZXRvb3RoRGV2aWNlUHJvZmlsZVN0YXRlIHN0YXRlID0gbURldmljZVByb2ZpbGVTdGF0ZS5nZXQoZGV2aWNlLmdldEFkZHJlc3MoKSk7CisgICAgICAgIGlmIChzdGF0ZSAhPSBudWxsKSB7CisgICAgICAgICAgICBNZXNzYWdlIG1zZyA9IG5ldyBNZXNzYWdlKCk7CisgICAgICAgICAgICBtc2cuYXJnMSA9IEJsdWV0b290aERldmljZVByb2ZpbGVTdGF0ZS5DT05ORUNUX0hJRF9PVVRHT0lORzsKKyAgICAgICAgICAgIG1zZy5vYmogPSBzdGF0ZTsKKyAgICAgICAgICAgIG1IaWRQcm9maWxlU3RhdGUuc2VuZE1lc3NhZ2UobXNnKTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4gY29ubmVjdElucHV0RGV2aWNlSW50ZXJuYWwoQmx1ZXRvb3RoRGV2aWNlIGRldmljZSkgeworICAgICAgICBTdHJpbmcgb2JqZWN0UGF0aCA9IGdldE9iamVjdFBhdGhGcm9tQWRkcmVzcyhkZXZpY2UuZ2V0QWRkcmVzcygpKTsKKyAgICAgICAgaGFuZGxlSW5wdXREZXZpY2VTdGF0ZUNoYW5nZShkZXZpY2UsIEJsdWV0b290aElucHV0RGV2aWNlLlNUQVRFX0NPTk5FQ1RJTkcpOworICAgICAgICBpZiAoIWNvbm5lY3RJbnB1dERldmljZU5hdGl2ZShvYmplY3RQYXRoKSkgeworICAgICAgICAgICAgaGFuZGxlSW5wdXREZXZpY2VTdGF0ZUNoYW5nZShkZXZpY2UsIEJsdWV0b290aElucHV0RGV2aWNlLlNUQVRFX0RJU0NPTk5FQ1RFRCk7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgcHVibGljIHN5bmNocm9uaXplZCBib29sZWFuIGRpc2Nvbm5lY3RJbnB1dERldmljZShCbHVldG9vdGhEZXZpY2UgZGV2aWNlKSB7CisgICAgICAgIG1Db250ZXh0LmVuZm9yY2VDYWxsaW5nT3JTZWxmUGVybWlzc2lvbihCTFVFVE9PVEhfQURNSU5fUEVSTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJOZWVkIEJMVUVUT09USF9BRE1JTiBwZXJtaXNzaW9uIik7CisKKyAgICAgICAgU3RyaW5nIG9iamVjdFBhdGggPSBnZXRPYmplY3RQYXRoRnJvbUFkZHJlc3MoZGV2aWNlLmdldEFkZHJlc3MoKSk7CisgICAgICAgIGlmIChvYmplY3RQYXRoID09IG51bGwgfHwgZ2V0Q29ubmVjdGVkSW5wdXREZXZpY2VzKCkubGVuZ3RoID09IDApIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBCbHVldG9vdGhEZXZpY2VQcm9maWxlU3RhdGUgc3RhdGUgPSBtRGV2aWNlUHJvZmlsZVN0YXRlLmdldChkZXZpY2UuZ2V0QWRkcmVzcygpKTsKKyAgICAgICAgaWYgKHN0YXRlICE9IG51bGwpIHsKKyAgICAgICAgICAgIE1lc3NhZ2UgbXNnID0gbmV3IE1lc3NhZ2UoKTsKKyAgICAgICAgICAgIG1zZy5hcmcxID0gQmx1ZXRvb3RoRGV2aWNlUHJvZmlsZVN0YXRlLkRJU0NPTk5FQ1RfSElEX09VVEdPSU5HOworICAgICAgICAgICAgbXNnLm9iaiA9IHN0YXRlOworICAgICAgICAgICAgbUhpZFByb2ZpbGVTdGF0ZS5zZW5kTWVzc2FnZShtc2cpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgYm9vbGVhbiBkaXNjb25uZWN0SW5wdXREZXZpY2VJbnRlcm5hbChCbHVldG9vdGhEZXZpY2UgZGV2aWNlKSB7CisgICAgICAgIFN0cmluZyBvYmplY3RQYXRoID0gZ2V0T2JqZWN0UGF0aEZyb21BZGRyZXNzKGRldmljZS5nZXRBZGRyZXNzKCkpOworICAgICAgICBoYW5kbGVJbnB1dERldmljZVN0YXRlQ2hhbmdlKGRldmljZSwgQmx1ZXRvb3RoSW5wdXREZXZpY2UuU1RBVEVfRElTQ09OTkVDVElORyk7CisgICAgICAgIGlmICghZGlzY29ubmVjdElucHV0RGV2aWNlTmF0aXZlKG9iamVjdFBhdGgpKSB7CisgICAgICAgICAgICBoYW5kbGVJbnB1dERldmljZVN0YXRlQ2hhbmdlKGRldmljZSwgQmx1ZXRvb3RoSW5wdXREZXZpY2UuU1RBVEVfQ09OTkVDVEVEKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3luY2hyb25pemVkIGludCBnZXRJbnB1dERldmljZVN0YXRlKEJsdWV0b290aERldmljZSBkZXZpY2UpIHsKKyAgICAgICAgbUNvbnRleHQuZW5mb3JjZUNhbGxpbmdPclNlbGZQZXJtaXNzaW9uKEJMVUVUT09USF9QRVJNLCAiTmVlZCBCTFVFVE9PVEggcGVybWlzc2lvbiIpOworCisgICAgICAgIGlmIChtSW5wdXREZXZpY2VzLmdldChkZXZpY2UpID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBCbHVldG9vdGhJbnB1dERldmljZS5TVEFURV9ESVNDT05ORUNURUQ7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG1JbnB1dERldmljZXMuZ2V0KGRldmljZSk7CisgICAgfQorCisgICAgcHVibGljIHN5bmNocm9uaXplZCBCbHVldG9vdGhEZXZpY2VbXSBnZXRDb25uZWN0ZWRJbnB1dERldmljZXMoKSB7CisgICAgICAgIG1Db250ZXh0LmVuZm9yY2VDYWxsaW5nT3JTZWxmUGVybWlzc2lvbihCTFVFVE9PVEhfUEVSTSwgIk5lZWQgQkxVRVRPT1RIIHBlcm1pc3Npb24iKTsKKyAgICAgICAgU2V0PEJsdWV0b290aERldmljZT4gZGV2aWNlcyA9IGxvb2t1cElucHV0RGV2aWNlc01hdGNoaW5nU3RhdGVzKAorICAgICAgICAgICAgbmV3IGludFtdIHtCbHVldG9vdGhJbnB1dERldmljZS5TVEFURV9DT05ORUNURUR9KTsKKyAgICAgICAgcmV0dXJuIGRldmljZXMudG9BcnJheShuZXcgQmx1ZXRvb3RoRGV2aWNlW2RldmljZXMuc2l6ZSgpXSk7CisgICAgfQorCisgICAgcHVibGljIHN5bmNocm9uaXplZCBpbnQgZ2V0SW5wdXREZXZpY2VQcmlvcml0eShCbHVldG9vdGhEZXZpY2UgZGV2aWNlKSB7CisgICAgICAgIG1Db250ZXh0LmVuZm9yY2VDYWxsaW5nT3JTZWxmUGVybWlzc2lvbihCTFVFVE9PVEhfUEVSTSwgIk5lZWQgQkxVRVRPT1RIIHBlcm1pc3Npb24iKTsKKyAgICAgICAgcmV0dXJuIFNldHRpbmdzLlNlY3VyZS5nZXRJbnQobUNvbnRleHQuZ2V0Q29udGVudFJlc29sdmVyKCksCisgICAgICAgICAgICAgICAgU2V0dGluZ3MuU2VjdXJlLmdldEJsdWV0b290aElucHV0RGV2aWNlUHJpb3JpdHlLZXkoZGV2aWNlLmdldEFkZHJlc3MoKSksCisgICAgICAgICAgICAgICAgQmx1ZXRvb3RoSW5wdXREZXZpY2UuUFJJT1JJVFlfVU5ERUZJTkVEKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4gc2V0SW5wdXREZXZpY2VQcmlvcml0eShCbHVldG9vdGhEZXZpY2UgZGV2aWNlLCBpbnQgcHJpb3JpdHkpIHsKKyAgICAgICAgbUNvbnRleHQuZW5mb3JjZUNhbGxpbmdPclNlbGZQZXJtaXNzaW9uKEJMVUVUT09USF9BRE1JTl9QRVJNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk5lZWQgQkxVRVRPT1RIX0FETUlOIHBlcm1pc3Npb24iKTsKKyAgICAgICAgaWYgKCFCbHVldG9vdGhBZGFwdGVyLmNoZWNrQmx1ZXRvb3RoQWRkcmVzcyhkZXZpY2UuZ2V0QWRkcmVzcygpKSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIHJldHVybiBTZXR0aW5ncy5TZWN1cmUucHV0SW50KG1Db250ZXh0LmdldENvbnRlbnRSZXNvbHZlcigpLAorICAgICAgICAgICAgICAgIFNldHRpbmdzLlNlY3VyZS5nZXRCbHVldG9vdGhJbnB1dERldmljZVByaW9yaXR5S2V5KGRldmljZS5nZXRBZGRyZXNzKCkpLAorICAgICAgICAgICAgICAgIHByaW9yaXR5KTsKKyAgICB9CisKKyAgICAvKnBhY2thZ2UqL3N5bmNocm9uaXplZCBTZXQ8Qmx1ZXRvb3RoRGV2aWNlPiBsb29rdXBJbnB1dERldmljZXNNYXRjaGluZ1N0YXRlcyhpbnRbXSBzdGF0ZXMpIHsKKyAgICAgICAgU2V0PEJsdWV0b290aERldmljZT4gaW5wdXREZXZpY2VzID0gbmV3IEhhc2hTZXQ8Qmx1ZXRvb3RoRGV2aWNlPigpOworICAgICAgICBpZiAobUlucHV0RGV2aWNlcy5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIHJldHVybiBpbnB1dERldmljZXM7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChCbHVldG9vdGhEZXZpY2UgZGV2aWNlOiBtSW5wdXREZXZpY2VzLmtleVNldCgpKSB7CisgICAgICAgICAgICBpbnQgaW5wdXREZXZpY2VTdGF0ZSA9IGdldElucHV0RGV2aWNlU3RhdGUoZGV2aWNlKTsKKyAgICAgICAgICAgIGZvciAoaW50IHN0YXRlIDogc3RhdGVzKSB7CisgICAgICAgICAgICAgICAgaWYgKHN0YXRlID09IGlucHV0RGV2aWNlU3RhdGUpIHsKKyAgICAgICAgICAgICAgICAgICAgaW5wdXREZXZpY2VzLmFkZChkZXZpY2UpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGlucHV0RGV2aWNlczsKKyAgICB9CisKKyAgICBwcml2YXRlIHN5bmNocm9uaXplZCB2b2lkIGhhbmRsZUlucHV0RGV2aWNlU3RhdGVDaGFuZ2UoQmx1ZXRvb3RoRGV2aWNlIGRldmljZSwgaW50IHN0YXRlKSB7CisgICAgICAgIGludCBwcmV2U3RhdGU7CisgICAgICAgIGlmIChtSW5wdXREZXZpY2VzLmdldChkZXZpY2UpID09IG51bGwpIHsKKyAgICAgICAgICAgIHByZXZTdGF0ZSA9IEJsdWV0b290aElucHV0RGV2aWNlLlNUQVRFX0RJU0NPTk5FQ1RFRDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHByZXZTdGF0ZSA9IG1JbnB1dERldmljZXMuZ2V0KGRldmljZSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHByZXZTdGF0ZSA9PSBzdGF0ZSkgcmV0dXJuOworCisgICAgICAgIG1JbnB1dERldmljZXMucHV0KGRldmljZSwgc3RhdGUpOworCisgICAgICAgIGlmIChnZXRJbnB1dERldmljZVByaW9yaXR5KGRldmljZSkgPgorICAgICAgICAgICAgICBCbHVldG9vdGhJbnB1dERldmljZS5QUklPUklUWV9PRkYgJiYKKyAgICAgICAgICAgIHN0YXRlID09IEJsdWV0b290aElucHV0RGV2aWNlLlNUQVRFX0NPTk5FQ1RJTkcgfHwKKyAgICAgICAgICAgIHN0YXRlID09IEJsdWV0b290aElucHV0RGV2aWNlLlNUQVRFX0NPTk5FQ1RFRCkgeworICAgICAgICAgICAgLy8gV2UgaGF2ZSBjb25uZWN0ZWQgb3IgYXR0ZW1wdGluZyB0byBjb25uZWN0LgorICAgICAgICAgICAgLy8gQnVtcCBwcmlvcml0eQorICAgICAgICAgICAgc2V0SW5wdXREZXZpY2VQcmlvcml0eShkZXZpY2UsIEJsdWV0b290aElucHV0RGV2aWNlLlBSSU9SSVRZX0FVVE9fQ09OTkVDVCk7CisgICAgICAgIH0KKworICAgICAgICBJbnRlbnQgaW50ZW50ID0gbmV3IEludGVudChCbHVldG9vdGhJbnB1dERldmljZS5BQ1RJT05fSU5QVVRfREVWSUNFX1NUQVRFX0NIQU5HRUQpOworICAgICAgICBpbnRlbnQucHV0RXh0cmEoQmx1ZXRvb3RoRGV2aWNlLkVYVFJBX0RFVklDRSwgZGV2aWNlKTsKKyAgICAgICAgaW50ZW50LnB1dEV4dHJhKEJsdWV0b290aElucHV0RGV2aWNlLkVYVFJBX1BSRVZJT1VTX0lOUFVUX0RFVklDRV9TVEFURSwgcHJldlN0YXRlKTsKKyAgICAgICAgaW50ZW50LnB1dEV4dHJhKEJsdWV0b290aElucHV0RGV2aWNlLkVYVFJBX0lOUFVUX0RFVklDRV9TVEFURSwgc3RhdGUpOworICAgICAgICBtQ29udGV4dC5zZW5kQnJvYWRjYXN0KGludGVudCwgQkxVRVRPT1RIX1BFUk0pOworCisgICAgICAgIGlmIChEQkcpIGxvZygiSW5wdXREZXZpY2Ugc3RhdGUgOiBkZXZpY2U6ICIgKyBkZXZpY2UgKyAiIFN0YXRlOiIgKyBwcmV2U3RhdGUgKyAiLT4iICsgc3RhdGUpOworCisgICAgfQorCisgICAgLypwYWNrYWdlKi8gdm9pZCBoYW5kbGVJbnB1dERldmljZVByb3BlcnR5Q2hhbmdlKFN0cmluZyBhZGRyZXNzLCBib29sZWFuIGNvbm5lY3RlZCkgeworICAgICAgICBpbnQgc3RhdGUgPSBjb25uZWN0ZWQgPyBCbHVldG9vdGhJbnB1dERldmljZS5TVEFURV9DT05ORUNURUQgOgorICAgICAgICAgICAgQmx1ZXRvb3RoSW5wdXREZXZpY2UuU1RBVEVfRElTQ09OTkVDVEVEOworICAgICAgICBCbHVldG9vdGhEZXZpY2UgZGV2aWNlID0gbUFkYXB0ZXIuZ2V0UmVtb3RlRGV2aWNlKGFkZHJlc3MpOworICAgICAgICBoYW5kbGVJbnB1dERldmljZVN0YXRlQ2hhbmdlKGRldmljZSwgc3RhdGUpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBzZXRJbml0aWFsSW5wdXREZXZpY2VQcmlvcml0eShCbHVldG9vdGhEZXZpY2UgZGV2aWNlLCBpbnQgc3RhdGUpIHsKKyAgICAgICAgc3dpdGNoIChzdGF0ZSkgeworICAgICAgICAgICAgY2FzZSBCbHVldG9vdGhEZXZpY2UuQk9ORF9CT05ERUQ6CisgICAgICAgICAgICAgICAgaWYgKGdldElucHV0RGV2aWNlUHJpb3JpdHkoZGV2aWNlKSA9PSBCbHVldG9vdGhJbnB1dERldmljZS5QUklPUklUWV9VTkRFRklORUQpIHsKKyAgICAgICAgICAgICAgICAgICAgc2V0SW5wdXREZXZpY2VQcmlvcml0eShkZXZpY2UsIEJsdWV0b290aElucHV0RGV2aWNlLlBSSU9SSVRZX09OKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJsdWV0b290aERldmljZS5CT05EX05PTkU6CisgICAgICAgICAgICAgICAgc2V0SW5wdXREZXZpY2VQcmlvcml0eShkZXZpY2UsIEJsdWV0b290aElucHV0RGV2aWNlLlBSSU9SSVRZX1VOREVGSU5FRCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKICAgICAvKnBhY2thZ2UqLyBib29sZWFuIGlzUmVtb3RlRGV2aWNlSW5DYWNoZShTdHJpbmcgYWRkcmVzcykgewogICAgICAgICByZXR1cm4gKG1EZXZpY2VQcm9wZXJ0aWVzLmdldChhZGRyZXNzKSAhPSBudWxsKTsKICAgICB9CkBAIC0xMzg0LDcgKzE4MjksNyBAQAogICAgICAgICAgICAgaWYgKHVwZGF0ZVJlbW90ZURldmljZVByb3BlcnRpZXNDYWNoZShhZGRyZXNzKSkKICAgICAgICAgICAgICAgICByZXR1cm4gZ2V0UmVtb3RlRGV2aWNlUHJvcGVydHkoYWRkcmVzcywgcHJvcGVydHkpOwogICAgICAgICB9Ci0gICAgICAgIExvZy5lKFRBRywgImdldFJlbW90ZURldmljZVByb3BlcnR5OiAiICsgcHJvcGVydHkgKyAibm90IHByZXNlbnQ6IiArIGFkZHJlc3MpOworICAgICAgICBMb2cuZShUQUcsICJnZXRSZW1vdGVEZXZpY2VQcm9wZXJ0eTogIiArIHByb3BlcnR5ICsgIiBub3QgcHJlc2VudDogIiArIGFkZHJlc3MpOwogICAgICAgICByZXR1cm4gbnVsbDsKICAgICB9CiAKQEAgLTIyNzcsNCArMjcyMiwxMCBAQAogICAgICAgICAgICAgc2hvcnQgY2hhbm5lbCk7CiAgICAgcHJpdmF0ZSBuYXRpdmUgYm9vbGVhbiByZW1vdmVTZXJ2aWNlUmVjb3JkTmF0aXZlKGludCBoYW5kbGUpOwogICAgIHByaXZhdGUgbmF0aXZlIGJvb2xlYW4gc2V0TGlua1RpbWVvdXROYXRpdmUoU3RyaW5nIHBhdGgsIGludCBudW1fc2xvdHMpOworICAgIHByaXZhdGUgbmF0aXZlIGJvb2xlYW4gY29ubmVjdElucHV0RGV2aWNlTmF0aXZlKFN0cmluZyBwYXRoKTsKKyAgICBwcml2YXRlIG5hdGl2ZSBib29sZWFuIGRpc2Nvbm5lY3RJbnB1dERldmljZU5hdGl2ZShTdHJpbmcgcGF0aCk7CisKKyAgICBwcml2YXRlIG5hdGl2ZSBib29sZWFuIHNldEJsdWV0b290aFRldGhlcmluZ05hdGl2ZShib29sZWFuIHZhbHVlLCBTdHJpbmcgbmFwLCBTdHJpbmcgYnJpZGdlKTsKKyAgICBwcml2YXRlIG5hdGl2ZSBib29sZWFuIGNvbm5lY3RQYW5EZXZpY2VOYXRpdmUoU3RyaW5nIHBhdGgsIFN0cmluZyBzcmNSb2xlLCBTdHJpbmcgZHN0Um9sZSk7CisgICAgcHJpdmF0ZSBuYXRpdmUgYm9vbGVhbiBkaXNjb25uZWN0UGFuRGV2aWNlTmF0aXZlKFN0cmluZyBwYXRoKTsKIH0KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3NwZWVjaC9TcGVlY2hSZWNvZ25pemVyLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9zcGVlY2gvU3BlZWNoUmVjb2duaXplci5qYXZhCmluZGV4IDhmYTBkNTkuLmNkNzNiYTggMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3NwZWVjaC9TcGVlY2hSZWNvZ25pemVyLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvc3BlZWNoL1NwZWVjaFJlY29nbml6ZXIuamF2YQpAQCAtNTAsNyArNTAsNyBAQAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiU3BlZWNoUmVjb2duaXplciI7CiAKICAgICAvKioKLSAgICAgKiBVc2VkIHRvIHJldHJpZXZlIGFuIHtAY29kZSBBcnJheUxpc3QmbHQ7U3RyaW5nJmd0O30gZnJvbSB0aGUge0BsaW5rIEJ1bmRsZX0gcGFzc2VkIHRvIHRoZQorICAgICAqIFVzZWQgdG8gcmV0cmlldmUgYW4ge0Bjb2RlIEFycmF5TGlzdDxTdHJpbmc+fSBmcm9tIHRoZSB7QGxpbmsgQnVuZGxlfSBwYXNzZWQgdG8gdGhlCiAgICAgICoge0BsaW5rIFJlY29nbml0aW9uTGlzdGVuZXIjb25SZXN1bHRzKEJ1bmRsZSl9IGFuZAogICAgICAqIHtAbGluayBSZWNvZ25pdGlvbkxpc3RlbmVyI29uUGFydGlhbFJlc3VsdHMoQnVuZGxlKX0gbWV0aG9kcy4gVGhlc2Ugc3RyaW5ncyBhcmUgdGhlIHBvc3NpYmxlCiAgICAgICogcmVjb2duaXRpb24gcmVzdWx0cywgd2hlcmUgdGhlIGZpcnN0IGVsZW1lbnQgaXMgdGhlIG1vc3QgbGlrZWx5IGNhbmRpZGF0ZS4KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3RleHQvQW5kcm9pZEJpZGkuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3RleHQvQW5kcm9pZEJpZGkuamF2YQppbmRleCBlNGY5MzRlLi5lYWNkNDBkIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC90ZXh0L0FuZHJvaWRCaWRpLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvdGV4dC9BbmRyb2lkQmlkaS5qYXZhCkBAIC0xNiw2ICsxNiw4IEBACiAKIHBhY2thZ2UgYW5kcm9pZC50ZXh0OwogCitpbXBvcnQgYW5kcm9pZC50ZXh0LkxheW91dC5EaXJlY3Rpb25zOworCiAvKioKICAqIEFjY2VzcyB0aGUgSUNVIGJpZGkgaW1wbGVtZW50YXRpb24uCiAgKiBAaGlkZQpAQCAtNDQsNSArNDYsMTMyIEBACiAgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgfQogCisgICAgLyoqCisgICAgICogUmV0dXJucyBydW4gZGlyZWN0aW9uIGluZm9ybWF0aW9uIGZvciBhIGxpbmUgd2l0aGluIGEgcGFyYWdyYXBoLgorICAgICAqCisgICAgICogQHBhcmFtIGRpciBiYXNlIGxpbmUgZGlyZWN0aW9uLCBlaXRoZXIgTGF5b3V0LkRJUl9MRUZUX1RPX1JJR0hUIG9yCisgICAgICogICAgIExheW91dC5ESVJfUklHSFRfVE9fTEVGVAorICAgICAqIEBwYXJhbSBsZXZlbHMgbGV2ZWxzIGFzIHJldHVybmVkIGZyb20ge0BsaW5rICNiaWRpfQorICAgICAqIEBwYXJhbSBsc3RhcnQgc3RhcnQgb2YgdGhlIGxpbmUgaW4gdGhlIGxldmVscyBhcnJheQorICAgICAqIEBwYXJhbSBjaGFycyB0aGUgY2hhcmFjdGVyIGFycmF5ICh1c2VkIHRvIGRldGVybWluZSB3aGl0ZXNwYWNlKQorICAgICAqIEBwYXJhbSBjc3RhcnQgdGhlIHN0YXJ0IG9mIHRoZSBsaW5lIGluIHRoZSBjaGFycyBhcnJheQorICAgICAqIEBwYXJhbSBsZW4gdGhlIGxlbmd0aCBvZiB0aGUgbGluZQorICAgICAqIEByZXR1cm4gdGhlIGRpcmVjdGlvbnMKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIERpcmVjdGlvbnMgZGlyZWN0aW9ucyhpbnQgZGlyLCBieXRlW10gbGV2ZWxzLCBpbnQgbHN0YXJ0LAorICAgICAgICAgICAgY2hhcltdIGNoYXJzLCBpbnQgY3N0YXJ0LCBpbnQgbGVuKSB7CisKKyAgICAgICAgaW50IGJhc2VMZXZlbCA9IGRpciA9PSBMYXlvdXQuRElSX0xFRlRfVE9fUklHSFQgPyAwIDogMTsKKyAgICAgICAgaW50IGN1ckxldmVsID0gbGV2ZWxzW2xzdGFydF07CisgICAgICAgIGludCBtaW5MZXZlbCA9IGN1ckxldmVsOworICAgICAgICBpbnQgcnVuQ291bnQgPSAxOworICAgICAgICBmb3IgKGludCBpID0gbHN0YXJ0ICsgMSwgZSA9IGxzdGFydCArIGxlbjsgaSA8IGU7ICsraSkgeworICAgICAgICAgICAgaW50IGxldmVsID0gbGV2ZWxzW2ldOworICAgICAgICAgICAgaWYgKGxldmVsICE9IGN1ckxldmVsKSB7CisgICAgICAgICAgICAgICAgY3VyTGV2ZWwgPSBsZXZlbDsKKyAgICAgICAgICAgICAgICArK3J1bkNvdW50OworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gYWRkIGZpbmFsIHJ1biBmb3IgdHJhaWxpbmcgY291bnRlci1kaXJlY3Rpb25hbCB3aGl0ZXNwYWNlCisgICAgICAgIGludCB2aXNMZW4gPSBsZW47CisgICAgICAgIGlmICgoY3VyTGV2ZWwgJiAxKSAhPSAoYmFzZUxldmVsICYgMSkpIHsKKyAgICAgICAgICAgIC8vIGxvb2sgZm9yIHZpc2libGUgZW5kCisgICAgICAgICAgICB3aGlsZSAoLS12aXNMZW4gPj0gMCkgeworICAgICAgICAgICAgICAgIGNoYXIgY2ggPSBjaGFyc1tjc3RhcnQgKyB2aXNMZW5dOworCisgICAgICAgICAgICAgICAgaWYgKGNoID09ICdcbicpIHsKKyAgICAgICAgICAgICAgICAgICAgLS12aXNMZW47CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChjaCAhPSAnICcgJiYgY2ggIT0gJ1x0JykgeworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICArK3Zpc0xlbjsKKyAgICAgICAgICAgIGlmICh2aXNMZW4gIT0gbGVuKSB7CisgICAgICAgICAgICAgICAgKytydW5Db3VudDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChydW5Db3VudCA9PSAxICYmIG1pbkxldmVsID09IGJhc2VMZXZlbCkgeworICAgICAgICAgICAgLy8gd2UncmUgZG9uZSwgb25seSBvbmUgcnVuIG9uIHRoaXMgbGluZQorICAgICAgICAgICAgaWYgKChtaW5MZXZlbCAmIDEpICE9IDApIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gTGF5b3V0LkRJUlNfQUxMX1JJR0hUX1RPX0xFRlQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gTGF5b3V0LkRJUlNfQUxMX0xFRlRfVE9fUklHSFQ7CisgICAgICAgIH0KKworICAgICAgICBpbnRbXSBsZCA9IG5ldyBpbnRbcnVuQ291bnQgKiAyXTsKKyAgICAgICAgaW50IG1heExldmVsID0gbWluTGV2ZWw7CisgICAgICAgIGludCBsZXZlbEJpdHMgPSBtaW5MZXZlbCA8PCBMYXlvdXQuUlVOX0xFVkVMX1NISUZUOworICAgICAgICB7CisgICAgICAgICAgICAvLyBTdGFydCBvZiBmaXJzdCBwYWlyIGlzIGFsd2F5cyAwLCB3ZSB3cml0ZQorICAgICAgICAgICAgLy8gbGVuZ3RoIHRoZW4gc3RhcnQgYXQgZWFjaCBuZXcgcnVuLCBhbmQgdGhlCisgICAgICAgICAgICAvLyBsYXN0IHJ1biBsZW5ndGggYWZ0ZXIgd2UncmUgZG9uZS4KKyAgICAgICAgICAgIGludCBuID0gMTsKKyAgICAgICAgICAgIGludCBwcmV2ID0gbHN0YXJ0OworICAgICAgICAgICAgY3VyTGV2ZWwgPSBtaW5MZXZlbDsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSBsc3RhcnQsIGUgPSBsc3RhcnQgKyB2aXNMZW47IGkgPCBlOyArK2kpIHsKKyAgICAgICAgICAgICAgICBpbnQgbGV2ZWwgPSBsZXZlbHNbaV07CisgICAgICAgICAgICAgICAgaWYgKGxldmVsICE9IGN1ckxldmVsKSB7CisgICAgICAgICAgICAgICAgICAgIGN1ckxldmVsID0gbGV2ZWw7CisgICAgICAgICAgICAgICAgICAgIGlmIChsZXZlbCA+IG1heExldmVsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtYXhMZXZlbCA9IGxldmVsOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGxldmVsIDwgbWluTGV2ZWwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1pbkxldmVsID0gbGV2ZWw7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgLy8gWFhYIGlnbm9yZSBydW4gbGVuZ3RoIGxpbWl0IG9mIDJeUlVOX0xFVkVMX1NISUZUCisgICAgICAgICAgICAgICAgICAgIGxkW24rK10gPSAoaSAtIHByZXYpIHwgbGV2ZWxCaXRzOworICAgICAgICAgICAgICAgICAgICBsZFtuKytdID0gaSAtIGxzdGFydDsKKyAgICAgICAgICAgICAgICAgICAgbGV2ZWxCaXRzID0gY3VyTGV2ZWwgPDwgTGF5b3V0LlJVTl9MRVZFTF9TSElGVDsKKyAgICAgICAgICAgICAgICAgICAgcHJldiA9IGk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgbGRbbl0gPSAobHN0YXJ0ICsgdmlzTGVuIC0gcHJldikgfCBsZXZlbEJpdHM7CisgICAgICAgICAgICBpZiAodmlzTGVuIDwgbGVuKSB7CisgICAgICAgICAgICAgICAgbGRbKytuXSA9IHZpc0xlbjsKKyAgICAgICAgICAgICAgICBsZFsrK25dID0gKGxlbiAtIHZpc0xlbikgfCAoYmFzZUxldmVsIDw8IExheW91dC5SVU5fTEVWRUxfU0hJRlQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gU2VlIGlmIHdlIG5lZWQgdG8gc3dhcCBhbnkgcnVucy4KKyAgICAgICAgLy8gSWYgdGhlIG1pbiBsZXZlbCBydW4gZGlyZWN0aW9uIGRvZXNuJ3QgbWF0Y2ggdGhlIGJhc2UKKyAgICAgICAgLy8gZGlyZWN0aW9uLCB3ZSBhbHdheXMgbmVlZCB0byBzd2FwIChhdCB0aGlzIHBvaW50CisgICAgICAgIC8vIHdlIGhhdmUgbW9yZSB0aGFuIG9uZSBydW4pLgorICAgICAgICAvLyBPdGhlcndpc2UsIHdlIGRvbid0IG5lZWQgdG8gc3dhcCB0aGUgbG93ZXN0IGxldmVsLgorICAgICAgICAvLyBTaW5jZSB0aGVyZSBhcmUgbm8gbG9naWNhbGx5IGFkamFjZW50IHJ1bnMgYXQgdGhlIHNhbWUKKyAgICAgICAgLy8gbGV2ZWwsIGlmIHRoZSBtYXggbGV2ZWwgaXMgdGhlIHNhbWUgYXMgdGhlIChuZXcpIG1pbgorICAgICAgICAvLyBsZXZlbCwgd2UgaGF2ZSBhIHNlcmllcyBvZiBhbHRlcm5hdGluZyBsZXZlbHMgdGhhdAorICAgICAgICAvLyBpcyBhbHJlYWR5IGluIG9yZGVyLCBzbyB0aGVyZSdzIG5vIG1vcmUgdG8gZG8uCisgICAgICAgIC8vCisgICAgICAgIGJvb2xlYW4gc3dhcDsKKyAgICAgICAgaWYgKChtaW5MZXZlbCAmIDEpID09IGJhc2VMZXZlbCkgeworICAgICAgICAgICAgbWluTGV2ZWwgKz0gMTsKKyAgICAgICAgICAgIHN3YXAgPSBtYXhMZXZlbCA+IG1pbkxldmVsOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc3dhcCA9IHJ1bkNvdW50ID4gMTsKKyAgICAgICAgfQorICAgICAgICBpZiAoc3dhcCkgeworICAgICAgICAgICAgZm9yIChpbnQgbGV2ZWwgPSBtYXhMZXZlbCAtIDE7IGxldmVsID49IG1pbkxldmVsOyAtLWxldmVsKSB7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZC5sZW5ndGg7IGkgKz0gMikgeworICAgICAgICAgICAgICAgICAgICBpZiAobGV2ZWxzW2xkW2ldXSA+PSBsZXZlbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgaW50IGUgPSBpICsgMjsKKyAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChlIDwgbGQubGVuZ3RoICYmIGxldmVsc1tsZFtlXV0gPj0gbGV2ZWwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlICs9IDI7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBsb3cgPSBpLCBoaSA9IGUgLSAyOyBsb3cgPCBoaTsgbG93ICs9IDIsIGhpIC09IDIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgeCA9IGxkW2xvd107IGxkW2xvd10gPSBsZFtoaV07IGxkW2hpXSA9IHg7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeCA9IGxkW2xvdysxXTsgbGRbbG93KzFdID0gbGRbaGkrMV07IGxkW2hpKzFdID0geDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGkgPSBlICsgMjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbmV3IERpcmVjdGlvbnMobGQpOworICAgIH0KKwogICAgIHByaXZhdGUgbmF0aXZlIHN0YXRpYyBpbnQgcnVuQmlkaShpbnQgZGlyLCBjaGFyW10gY2hzLCBieXRlW10gY2hJbmZvLCBpbnQgbiwgYm9vbGVhbiBoYXZlSW5mbyk7CiB9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvdGV4dC9Cb3JpbmdMYXlvdXQuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3RleHQvQm9yaW5nTGF5b3V0LmphdmEKaW5kZXggOTQ0ZjczNS4uOTMwOWIwNSAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvdGV4dC9Cb3JpbmdMYXlvdXQuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC90ZXh0L0JvcmluZ0xheW91dC5qYXZhCkBAIC0yMDgsMTEgKzIwOCwxMSBAQAogICAgICAgICAgICAgICogd2lkdGggYmVjYXVzZSB0aGUgd2lkdGggdGhhdCB3YXMgcGFzc2VkIGluIHdhcyBmb3IgdGhlCiAgICAgICAgICAgICAgKiBmdWxsIHRleHQsIG5vdCB0aGUgZWxsaXBzaXplZCBmb3JtLgogICAgICAgICAgICAgICovCi0gICAgICAgICAgICBzeW5jaHJvbml6ZWQgKHNUZW1wKSB7Ci0gICAgICAgICAgICAgICAgbU1heCA9IChpbnQpIChGbG9hdE1hdGguY2VpbChTdHlsZWQubWVhc3VyZVRleHQocGFpbnQsIHNUZW1wLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlLCAwLCBzb3VyY2UubGVuZ3RoKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsKSkpOwotICAgICAgICAgICAgfQorICAgICAgICAgICAgVGV4dExpbmUgbGluZSA9IFRleHRMaW5lLm9idGFpbigpOworICAgICAgICAgICAgbGluZS5zZXQocGFpbnQsIHNvdXJjZSwgMCwgc291cmNlLmxlbmd0aCgpLCBMYXlvdXQuRElSX0xFRlRfVE9fUklHSFQsCisgICAgICAgICAgICAgICAgICAgIExheW91dC5ESVJTX0FMTF9MRUZUX1RPX1JJR0hULCBmYWxzZSwgbnVsbCk7CisgICAgICAgICAgICBtTWF4ID0gKGludCkgRmxvYXRNYXRoLmNlaWwobGluZS5tZXRyaWNzKG51bGwpKTsKKyAgICAgICAgICAgIFRleHRMaW5lLnJlY3ljbGUobGluZSk7CiAgICAgICAgIH0KIAogICAgICAgICBpZiAoaW5jbHVkZXBhZCkgewpAQCAtMjc2LDE0ICsyNzYsMTMgQEAKICAgICAgICAgICAgIGlmIChmbSA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgZm0gPSBuZXcgTWV0cmljcygpOwogICAgICAgICAgICAgfQotICAgIAotICAgICAgICAgICAgaW50IHdpZDsKIAotICAgICAgICAgICAgc3luY2hyb25pemVkIChzVGVtcCkgewotICAgICAgICAgICAgICAgIHdpZCA9IChpbnQpIChGbG9hdE1hdGguY2VpbChTdHlsZWQubWVhc3VyZVRleHQocGFpbnQsIHNUZW1wLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dCwgMCwgdGV4dC5sZW5ndGgoKSwgZm0pKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmbS53aWR0aCA9IHdpZDsKKyAgICAgICAgICAgIFRleHRMaW5lIGxpbmUgPSBUZXh0TGluZS5vYnRhaW4oKTsKKyAgICAgICAgICAgIGxpbmUuc2V0KHBhaW50LCB0ZXh0LCAwLCB0ZXh0Lmxlbmd0aCgpLCBMYXlvdXQuRElSX0xFRlRfVE9fUklHSFQsCisgICAgICAgICAgICAgICAgICAgIExheW91dC5ESVJTX0FMTF9MRUZUX1RPX1JJR0hULCBmYWxzZSwgbnVsbCk7CisgICAgICAgICAgICBmbS53aWR0aCA9IChpbnQpIEZsb2F0TWF0aC5jZWlsKGxpbmUubWV0cmljcyhmbSkpOworICAgICAgICAgICAgVGV4dExpbmUucmVjeWNsZShsaW5lKTsKKwogICAgICAgICAgICAgcmV0dXJuIGZtOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgcmV0dXJuIG51bGw7CkBAIC0zODksNyArMzg4LDcgQEAKIAogICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgTWV0cmljcyBleHRlbmRzIFBhaW50LkZvbnRNZXRyaWNzSW50IHsKICAgICAgICAgcHVibGljIGludCB3aWR0aDsKLSAgICAgICAgCisKICAgICAgICAgQE92ZXJyaWRlIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CiAgICAgICAgICAgICByZXR1cm4gc3VwZXIudG9TdHJpbmcoKSArICIgd2lkdGg9IiArIHdpZHRoOwogICAgICAgICB9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC90ZXh0L0NsaXBib2FyZE1hbmFnZXIuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3RleHQvQ2xpcGJvYXJkTWFuYWdlci5qYXZhCmluZGV4IDUyMDM5YWYuLjBiMjM5Y2YgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3RleHQvQ2xpcGJvYXJkTWFuYWdlci5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3RleHQvQ2xpcGJvYXJkTWFuYWdlci5qYXZhCkBAIC0xNiw3MyArMTYsMjYgQEAKIAogcGFja2FnZSBhbmRyb2lkLnRleHQ7CiAKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKLWltcG9ydCBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbjsKLWltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXI7Ci1pbXBvcnQgYW5kcm9pZC5vcy5JQmluZGVyOwotaW1wb3J0IGFuZHJvaWQub3MuU2VydmljZU1hbmFnZXI7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKLQogLyoqCi0gKiBJbnRlcmZhY2UgdG8gdGhlIGNsaXBib2FyZCBzZXJ2aWNlLCBmb3IgcGxhY2luZyBhbmQgcmV0cmlldmluZyB0ZXh0IGluCi0gKiB0aGUgZ2xvYmFsIGNsaXBib2FyZC4KLSAqCi0gKiA8cD4KLSAqIFlvdSBkbyBub3QgaW5zdGFudGlhdGUgdGhpcyBjbGFzcyBkaXJlY3RseTsgaW5zdGVhZCwgcmV0cmlldmUgaXQgdGhyb3VnaAotICoge0BsaW5rIGFuZHJvaWQuY29udGVudC5Db250ZXh0I2dldFN5c3RlbVNlcnZpY2V9LgotICoKLSAqIEBzZWUgYW5kcm9pZC5jb250ZW50LkNvbnRleHQjZ2V0U3lzdGVtU2VydmljZQorICogQGRlcHJlY2F0ZWQgT2xkIHRleHQtb25seSBpbnRlcmFjZSB0byB0aGUgY2xpcGJvYXJkLiAgU2VlCisgKiB7QGxpbmsgYW5kcm9pZC5jb250ZW50LkNsaXBib2FyZE1hbmFnZXJ9IGZvciB0aGUgbW9kZXJuIEFQSS4KICAqLwotcHVibGljIGNsYXNzIENsaXBib2FyZE1hbmFnZXIgewotICAgIHByaXZhdGUgc3RhdGljIElDbGlwYm9hcmQgc1NlcnZpY2U7Ci0KLSAgICBwcml2YXRlIENvbnRleHQgbUNvbnRleHQ7Ci0KLSAgICBzdGF0aWMgcHJpdmF0ZSBJQ2xpcGJvYXJkIGdldFNlcnZpY2UoKSB7Ci0gICAgICAgIGlmIChzU2VydmljZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gc1NlcnZpY2U7Ci0gICAgICAgIH0KLSAgICAgICAgSUJpbmRlciBiID0gU2VydmljZU1hbmFnZXIuZ2V0U2VydmljZSgiY2xpcGJvYXJkIik7Ci0gICAgICAgIHNTZXJ2aWNlID0gSUNsaXBib2FyZC5TdHViLmFzSW50ZXJmYWNlKGIpOwotICAgICAgICByZXR1cm4gc1NlcnZpY2U7Ci0gICAgfQotCi0gICAgLyoqIHtAaGlkZX0gKi8KLSAgICBwdWJsaWMgQ2xpcGJvYXJkTWFuYWdlcihDb250ZXh0IGNvbnRleHQsIEhhbmRsZXIgaGFuZGxlcikgewotICAgICAgICBtQ29udGV4dCA9IGNvbnRleHQ7Ci0gICAgfQotCitARGVwcmVjYXRlZAorcHVibGljIGFic3RyYWN0IGNsYXNzIENsaXBib2FyZE1hbmFnZXIgewogICAgIC8qKgogICAgICAqIFJldHVybnMgdGhlIHRleHQgb24gdGhlIGNsaXBib2FyZC4gIEl0IHdpbGwgZXZlbnR1YWxseSBiZSBwb3NzaWJsZQogICAgICAqIHRvIHN0b3JlIHR5cGVzIG90aGVyIHRoYW4gdGV4dCB0b28sIGluIHdoaWNoIGNhc2UgdGhpcyB3aWxsIHJldHVybgogICAgICAqIG51bGwgaWYgdGhlIHR5cGUgY2Fubm90IGJlIGNvZXJjZWQgdG8gdGV4dC4KICAgICAgKi8KLSAgICBwdWJsaWMgQ2hhclNlcXVlbmNlIGdldFRleHQoKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZXR1cm4gZ2V0U2VydmljZSgpLmdldENsaXBib2FyZFRleHQoKTsKLSAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgfQorICAgIHB1YmxpYyBhYnN0cmFjdCBDaGFyU2VxdWVuY2UgZ2V0VGV4dCgpOwogCiAgICAgLyoqCiAgICAgICogU2V0cyB0aGUgY29udGVudHMgb2YgdGhlIGNsaXBib2FyZCB0byB0aGUgc3BlY2lmaWVkIHRleHQuCiAgICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0VGV4dChDaGFyU2VxdWVuY2UgdGV4dCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgZ2V0U2VydmljZSgpLnNldENsaXBib2FyZFRleHQodGV4dCk7Ci0gICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIH0KLSAgICB9CisgICAgcHVibGljIGFic3RyYWN0IHZvaWQgc2V0VGV4dChDaGFyU2VxdWVuY2UgdGV4dCk7CiAKICAgICAvKioKICAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGNsaXBib2FyZCBjb250YWlucyB0ZXh0OyBmYWxzZSBvdGhlcndpc2UuCiAgICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaGFzVGV4dCgpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJldHVybiBnZXRTZXJ2aWNlKCkuaGFzQ2xpcGJvYXJkVGV4dCgpOwotICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgfQorICAgIHB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGhhc1RleHQoKTsKIH0KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3RleHQvRHluYW1pY0xheW91dC5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvdGV4dC9EeW5hbWljTGF5b3V0LmphdmEKaW5kZXggMTRlNTY1NS4uYjZhYTAzYSAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvdGV4dC9EeW5hbWljTGF5b3V0LmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvdGV4dC9EeW5hbWljTGF5b3V0LmphdmEKQEAgLTMxMCw3ICszMTAsNiBAQAogCiAgICAgICAgIERpcmVjdGlvbnNbXSBvYmplY3RzID0gbmV3IERpcmVjdGlvbnNbMV07CiAKLQogICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG47IGkrKykgewogICAgICAgICAgICAgaW50c1tTVEFSVF0gPSByZWZsb3dlZC5nZXRMaW5lU3RhcnQoaSkgfAogICAgICAgICAgICAgICAgICAgICAgICAgICAocmVmbG93ZWQuZ2V0UGFyYWdyYXBoRGlyZWN0aW9uKGkpIDw8IERJUl9TSElGVCkgfApkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvdGV4dC9HcmFwaGljc09wZXJhdGlvbnMuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3RleHQvR3JhcGhpY3NPcGVyYXRpb25zLmphdmEKaW5kZXggYzNiZDBhZS4uZDQyNmQxMjQgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3RleHQvR3JhcGhpY3NPcGVyYXRpb25zLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvdGV4dC9HcmFwaGljc09wZXJhdGlvbnMuamF2YQpAQCAtMzQsMTMgKzM0LDMzIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgeCwgZmxvYXQgeSwgUGFpbnQgcCk7CiAKICAgICAvKioKKyAgICAgKiBKdXN0IGxpa2Uge0BsaW5rIENhbnZhcyNkcmF3VGV4dFJ1bn0uCisgICAgICoge0BoaWRlfQorICAgICAqLworICAgIHZvaWQgZHJhd1RleHRSdW4oQ2FudmFzIGMsIGludCBzdGFydCwgaW50IGVuZCwgaW50IGNvbnRleHRTdGFydCwgaW50IGNvbnRleHRFbmQsCisgICAgICAgICAgICBmbG9hdCB4LCBmbG9hdCB5LCBpbnQgZmxhZ3MsIFBhaW50IHApOworCisgICAvKioKICAgICAgKiBKdXN0IGxpa2Uge0BsaW5rIFBhaW50I21lYXN1cmVUZXh0fS4KICAgICAgKi8KICAgICBmbG9hdCBtZWFzdXJlVGV4dChpbnQgc3RhcnQsIGludCBlbmQsIFBhaW50IHApOwogCi0KICAgICAvKioKICAgICAgKiBKdXN0IGxpa2Uge0BsaW5rIFBhaW50I2dldFRleHRXaWR0aHN9LgogICAgICAqLwogICAgIHB1YmxpYyBpbnQgZ2V0VGV4dFdpZHRocyhpbnQgc3RhcnQsIGludCBlbmQsIGZsb2F0W10gd2lkdGhzLCBQYWludCBwKTsKKworICAgIC8qKgorICAgICAqIEp1c3QgbGlrZSB7QGxpbmsgUGFpbnQjZ2V0VGV4dFJ1bkFkdmFuY2VzfS4KKyAgICAgKiBAaGlkZQorICAgICAqLworICAgIGZsb2F0IGdldFRleHRSdW5BZHZhbmNlcyhpbnQgc3RhcnQsIGludCBlbmQsIGludCBjb250ZXh0U3RhcnQsIGludCBjb250ZXh0RW5kLAorICAgICAgICAgICAgaW50IGZsYWdzLCBmbG9hdFtdIGFkdmFuY2VzLCBpbnQgYWR2YW5jZXNJbmRleCwgUGFpbnQgcGFpbnQpOworCisgICAgLyoqCisgICAgICogSnVzdCBsaWtlIHtAbGluayBQYWludCNnZXRUZXh0UnVuQ3Vyc29yfS4KKyAgICAgKiBAaGlkZQorICAgICAqLworICAgIGludCBnZXRUZXh0UnVuQ3Vyc29yKGludCBjb250ZXh0U3RhcnQsIGludCBjb250ZXh0RW5kLCBpbnQgZmxhZ3MsIGludCBvZmZzZXQsCisgICAgICAgICAgICBpbnQgY3Vyc29yT3B0LCBQYWludCBwKTsKIH0KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3RleHQvSUNsaXBib2FyZC5haWRsIGIvY29yZS9qYXZhL2FuZHJvaWQvdGV4dC9JQ2xpcGJvYXJkLmFpZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRkZWI1YzguLjAwMDAwMDAKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvdGV4dC9JQ2xpcGJvYXJkLmFpZGwKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgYW5kcm9pZC50ZXh0OwotCi0vKioKLSAqIFByb2dyYW1taW5nIGludGVyZmFjZSB0byB0aGUgY2xpcGJvYXJkLCB3aGljaCBhbGxvd3MgY29weWluZyBhbmQgcGFzdGluZwotICogYmV0d2VlbiBhcHBsaWNhdGlvbnMuCi0gKiB7QGhpZGV9Ci0gKi8KLWludGVyZmFjZSBJQ2xpcGJvYXJkIHsKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSB0ZXh0IG9uIHRoZSBjbGlwYm9hcmQuICBJdCB3aWxsIGV2ZW50dWFsbHkgYmUgcG9zc2libGUKLSAgICAgKiB0byBzdG9yZSB0eXBlcyBvdGhlciB0aGFuIHRleHQgdG9vLCBpbiB3aGljaCBjYXNlIHRoaXMgd2lsbCByZXR1cm4KLSAgICAgKiBudWxsIGlmIHRoZSB0eXBlIGNhbm5vdCBiZSBjb2VyY2VkIHRvIHRleHQuCi0gICAgICovCi0gICAgQ2hhclNlcXVlbmNlIGdldENsaXBib2FyZFRleHQoKTsKLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIGNvbnRlbnRzIG9mIHRoZSBjbGlwYm9hcmQgdG8gdGhlIHNwZWNpZmllZCB0ZXh0LgotICAgICAqLwotICAgIHZvaWQgc2V0Q2xpcGJvYXJkVGV4dChDaGFyU2VxdWVuY2UgdGV4dCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGNsaXBib2FyZCBjb250YWlucyB0ZXh0OyBmYWxzZSBvdGhlcndpc2UuCi0gICAgICovCi0gICAgYm9vbGVhbiBoYXNDbGlwYm9hcmRUZXh0KCk7Ci19Ci0KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3RleHQvTGF5b3V0LmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC90ZXh0L0xheW91dC5qYXZhCm9sZCBtb2RlIDEwMDc1NQpuZXcgbW9kZSAxMDA2NDQKaW5kZXggNGUxOTdjZC4uNTRhYzkwNgotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC90ZXh0L0xheW91dC5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3RleHQvTGF5b3V0LmphdmEKQEAgLTE2LDI5ICsxNiwzMyBAQAogCiBwYWNrYWdlIGFuZHJvaWQudGV4dDsKIAotaW1wb3J0IGFuZHJvaWQuZW1vamkuRW1vamlGYWN0b3J5OwotaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwOwotaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQ2FudmFzOwotaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUGFpbnQ7Ci1pbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5SZWN0OwotaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUmVjdEY7Ci1pbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5QYXRoOwogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnV0aWwuQXJyYXlVdGlsczsKIAotaW1wb3J0IGp1bml0LmZyYW1ld29yay5Bc3NlcnQ7Ci1pbXBvcnQgYW5kcm9pZC50ZXh0LnN0eWxlLio7CitpbXBvcnQgYW5kcm9pZC5lbW9qaS5FbW9qaUZhY3Rvcnk7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5DYW52YXM7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5QYWludDsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlBhdGg7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5SZWN0OwogaW1wb3J0IGFuZHJvaWQudGV4dC5tZXRob2QuVGV4dEtleUxpc3RlbmVyOworaW1wb3J0IGFuZHJvaWQudGV4dC5zdHlsZS5BbGlnbm1lbnRTcGFuOworaW1wb3J0IGFuZHJvaWQudGV4dC5zdHlsZS5MZWFkaW5nTWFyZ2luU3BhbjsKK2ltcG9ydCBhbmRyb2lkLnRleHQuc3R5bGUuTGluZUJhY2tncm91bmRTcGFuOworaW1wb3J0IGFuZHJvaWQudGV4dC5zdHlsZS5QYXJhZ3JhcGhTdHlsZTsKK2ltcG9ydCBhbmRyb2lkLnRleHQuc3R5bGUuUmVwbGFjZW1lbnRTcGFuOworaW1wb3J0IGFuZHJvaWQudGV4dC5zdHlsZS5UYWJTdG9wU3BhbjsKK2ltcG9ydCBhbmRyb2lkLnRleHQuc3R5bGUuTGVhZGluZ01hcmdpblNwYW4uTGVhZGluZ01hcmdpblNwYW4yOwogaW1wb3J0IGFuZHJvaWQudmlldy5LZXlFdmVudDsKIAoraW1wb3J0IGphdmEudXRpbC5BcnJheXM7CisKIC8qKgotICogQSBiYXNlIGNsYXNzIHRoYXQgbWFuYWdlcyB0ZXh0IGxheW91dCBpbiB2aXN1YWwgZWxlbWVudHMgb24gCi0gKiB0aGUgc2NyZWVuLiAKLSAqIDxwPkZvciB0ZXh0IHRoYXQgd2lsbCBiZSBlZGl0ZWQsIHVzZSBhIHtAbGluayBEeW5hbWljTGF5b3V0fSwgCi0gKiB3aGljaCB3aWxsIGJlIHVwZGF0ZWQgYXMgdGhlIHRleHQgY2hhbmdlcy4gIAorICogQSBiYXNlIGNsYXNzIHRoYXQgbWFuYWdlcyB0ZXh0IGxheW91dCBpbiB2aXN1YWwgZWxlbWVudHMgb24KKyAqIHRoZSBzY3JlZW4uCisgKiA8cD5Gb3IgdGV4dCB0aGF0IHdpbGwgYmUgZWRpdGVkLCB1c2UgYSB7QGxpbmsgRHluYW1pY0xheW91dH0sCisgKiB3aGljaCB3aWxsIGJlIHVwZGF0ZWQgYXMgdGhlIHRleHQgY2hhbmdlcy4KICAqIEZvciB0ZXh0IHRoYXQgd2lsbCBub3QgY2hhbmdlLCB1c2UgYSB7QGxpbmsgU3RhdGljTGF5b3V0fS4KICAqLwogcHVibGljIGFic3RyYWN0IGNsYXNzIExheW91dCB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVRyA9IGZhbHNlOwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFBhcmFncmFwaFN0eWxlW10gTk9fUEFSQV9TUEFOUyA9CiAgICAgICAgIEFycmF5VXRpbHMuZW1wdHlBcnJheShQYXJhZ3JhcGhTdHlsZS5jbGFzcyk7CiAKQEAgLTU0LDkgKzU4LDcgQEAKICAgICAgICAgICAgIE1JTl9FTU9KSSA9IC0xOwogICAgICAgICAgICAgTUFYX0VNT0pJID0gLTE7CiAgICAgICAgIH0KLSAgICB9OwotCi0gICAgcHJpdmF0ZSBSZWN0RiBtRW1vamlSZWN0OworICAgIH0KIAogICAgIC8qKgogICAgICAqIFJldHVybiBob3cgd2lkZSBhIGxheW91dCBtdXN0IGJlIGluIG9yZGVyIHRvIGRpc3BsYXkgdGhlCkBAIC02Niw3ICs2OCw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGV4dFBhaW50IHBhaW50KSB7CiAgICAgICAgIHJldHVybiBnZXREZXNpcmVkV2lkdGgoc291cmNlLCAwLCBzb3VyY2UubGVuZ3RoKCksIHBhaW50KTsKICAgICB9Ci0gICAgCisKICAgICAvKioKICAgICAgKiBSZXR1cm4gaG93IHdpZGUgYSBsYXlvdXQgbXVzdCBiZSBpbiBvcmRlciB0byBkaXNwbGF5IHRoZQogICAgICAqIHNwZWNpZmllZCB0ZXh0IHNsaWNlIHdpdGggb25lIGxpbmUgcGVyIHBhcmFncmFwaC4KQEAgLTg1LDggKzg3LDcgQEAKICAgICAgICAgICAgICAgICBuZXh0ID0gZW5kOwogCiAgICAgICAgICAgICAvLyBub3RlLCBvbWl0cyB0cmFpbGluZyBwYXJhZ3JhcGggY2hhcgotICAgICAgICAgICAgZmxvYXQgdyA9IG1lYXN1cmVUZXh0KHBhaW50LCB3b3JrUGFpbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlLCBpLCBuZXh0LCBudWxsLCB0cnVlLCBudWxsKTsKKyAgICAgICAgICAgIGZsb2F0IHcgPSBtZWFzdXJlUGFyYShwYWludCwgd29ya1BhaW50LCBzb3VyY2UsIGksIG5leHQpOwogCiAgICAgICAgICAgICBpZiAodyA+IG5lZWQpCiAgICAgICAgICAgICAgICAgbmVlZCA9IHc7CkBAIC0xMTYsNiArMTE3LDE1IEBACiAgICAgICAgIGlmICh3aWR0aCA8IDApCiAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJMYXlvdXQ6ICIgKyB3aWR0aCArICIgPCAwIik7CiAKKyAgICAgICAgLy8gRW5zdXJlIHBhaW50IGRvZXNuJ3QgaGF2ZSBiYXNlbGluZVNoaWZ0IHNldC4KKyAgICAgICAgLy8gV2hpbGUgbm9ybWFsbHkgd2UgZG9uJ3QgbW9kaWZ5IHRoZSBwYWludCB0aGUgdXNlciBwYXNzZWQgaW4sCisgICAgICAgIC8vIHdlIHdlcmUgYWxyZWFkeSBkb2luZyB0aGlzIGluIFN0eWxlZC5kcmF3VW5pZm9ybVJ1biB3aXRoIGJvdGgKKyAgICAgICAgLy8gYmFzZWxpbmVTaGlmdCBhbmQgYmdDb2xvci4gIFdlIHByb2JhYmx5IHNob3VsZCByZWV2YWx1YXRlIGJnQ29sb3IuCisgICAgICAgIGlmIChwYWludCAhPSBudWxsKSB7CisgICAgICAgICAgICBwYWludC5iZ0NvbG9yID0gMDsKKyAgICAgICAgICAgIHBhaW50LmJhc2VsaW5lU2hpZnQgPSAwOworICAgICAgICB9CisKICAgICAgICAgbVRleHQgPSB0ZXh0OwogICAgICAgICBtUGFpbnQgPSBwYWludDsKICAgICAgICAgbVdvcmtQYWludCA9IG5ldyBUZXh0UGFpbnQoKTsKQEAgLTE3NSw3ICsxODUsNiBAQAogICAgICAgICAgICAgZGJvdHRvbSA9IHNUZW1wUmVjdC5ib3R0b207CiAgICAgICAgIH0KIAotCiAgICAgICAgIGludCB0b3AgPSAwOwogICAgICAgICBpbnQgYm90dG9tID0gZ2V0TGluZVRvcChnZXRMaW5lQ291bnQoKSk7CiAKQEAgLTE4NSwyNiArMTk0LDI4IEBACiAgICAgICAgIGlmIChkYm90dG9tIDwgYm90dG9tKSB7CiAgICAgICAgICAgICBib3R0b20gPSBkYm90dG9tOwogICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBpbnQgZmlyc3QgPSBnZXRMaW5lRm9yVmVydGljYWwodG9wKTsgCisKKyAgICAgICAgaW50IGZpcnN0ID0gZ2V0TGluZUZvclZlcnRpY2FsKHRvcCk7CiAgICAgICAgIGludCBsYXN0ID0gZ2V0TGluZUZvclZlcnRpY2FsKGJvdHRvbSk7Ci0gICAgICAgIAorCiAgICAgICAgIGludCBwcmV2aW91c0xpbmVCb3R0b20gPSBnZXRMaW5lVG9wKGZpcnN0KTsKICAgICAgICAgaW50IHByZXZpb3VzTGluZUVuZCA9IGdldExpbmVTdGFydChmaXJzdCk7Ci0gICAgICAgIAorCiAgICAgICAgIFRleHRQYWludCBwYWludCA9IG1QYWludDsKICAgICAgICAgQ2hhclNlcXVlbmNlIGJ1ZiA9IG1UZXh0OwogICAgICAgICBpbnQgd2lkdGggPSBtV2lkdGg7CiAgICAgICAgIGJvb2xlYW4gc3Bhbm5lZFRleHQgPSBtU3Bhbm5lZFRleHQ7CiAKICAgICAgICAgUGFyYWdyYXBoU3R5bGVbXSBzcGFucyA9IE5PX1BBUkFfU1BBTlM7Ci0gICAgICAgIGludCBzcGFuZW5kID0gMDsKKyAgICAgICAgaW50IHNwYW5FbmQgPSAwOwogICAgICAgICBpbnQgdGV4dExlbmd0aCA9IDA7CiAKICAgICAgICAgLy8gRmlyc3QsIGRyYXcgTGluZUJhY2tncm91bmRTcGFucy4KLSAgICAgICAgLy8gTGluZUJhY2tncm91bmRTcGFucyBrbm93IG5vdGhpbmcgYWJvdXQgdGhlIGFsaWdubWVudCBvciBkaXJlY3Rpb24gb2YKLSAgICAgICAgLy8gdGhlIGxheW91dCBvciBsaW5lLiAgWFhYOiBTaG91bGQgdGhleT8KKyAgICAgICAgLy8gTGluZUJhY2tncm91bmRTcGFucyBrbm93IG5vdGhpbmcgYWJvdXQgdGhlIGFsaWdubWVudCwgbWFyZ2lucywgb3IKKyAgICAgICAgLy8gZGlyZWN0aW9uIG9mIHRoZSBsYXlvdXQgb3IgbGluZS4gIFhYWDogU2hvdWxkIHRoZXk/CisgICAgICAgIC8vIFRoZXkgYXJlIGV2YWx1YXRlZCBhdCBlYWNoIGxpbmUuCiAgICAgICAgIGlmIChzcGFubmVkVGV4dCkgeworICAgICAgICAgICAgU3Bhbm5lZCBzcCA9IChTcGFubmVkKSBidWY7CiAgICAgICAgICAgICB0ZXh0TGVuZ3RoID0gYnVmLmxlbmd0aCgpOwogICAgICAgICAgICAgZm9yIChpbnQgaSA9IGZpcnN0OyBpIDw9IGxhc3Q7IGkrKykgewogICAgICAgICAgICAgICAgIGludCBzdGFydCA9IHByZXZpb3VzTGluZUVuZDsKQEAgLTIxNiwxMiArMjI3LDE0IEBACiAgICAgICAgICAgICAgICAgcHJldmlvdXNMaW5lQm90dG9tID0gbGJvdHRvbTsKICAgICAgICAgICAgICAgICBpbnQgbGJhc2VsaW5lID0gbGJvdHRvbSAtIGdldExpbmVEZXNjZW50KGkpOwogCi0gICAgICAgICAgICAgICAgaWYgKHN0YXJ0ID49IHNwYW5lbmQpIHsKLSAgICAgICAgICAgICAgICAgICBTcGFubmVkIHNwID0gKFNwYW5uZWQpIGJ1ZjsKLSAgICAgICAgICAgICAgICAgICBzcGFuZW5kID0gc3AubmV4dFNwYW5UcmFuc2l0aW9uKHN0YXJ0LCB0ZXh0TGVuZ3RoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGluZUJhY2tncm91bmRTcGFuLmNsYXNzKTsKLSAgICAgICAgICAgICAgICAgICBzcGFucyA9IHNwLmdldFNwYW5zKHN0YXJ0LCBzcGFuZW5kLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGluZUJhY2tncm91bmRTcGFuLmNsYXNzKTsKKyAgICAgICAgICAgICAgICBpZiAoc3RhcnQgPj0gc3BhbkVuZCkgeworICAgICAgICAgICAgICAgICAgICAvLyBUaGVzZSBzaG91bGQgYmUgaW5mcmVxdWVudCwgc28gd2UnbGwgdXNlIHRoaXMgc28gdGhhdAorICAgICAgICAgICAgICAgICAgICAvLyB3ZSBkb24ndCBoYXZlIHRvIGNoZWNrIGFzIG9mdGVuLgorICAgICAgICAgICAgICAgICAgICBzcGFuRW5kID0gc3AubmV4dFNwYW5UcmFuc2l0aW9uKHN0YXJ0LCB0ZXh0TGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpbmVCYWNrZ3JvdW5kU3Bhbi5jbGFzcyk7CisgICAgICAgICAgICAgICAgICAgIC8vIEFsbCBMaW5lQmFja2dyb3VuZFNwYW5zIG9uIGEgbGluZSBjb250cmlidXRlIHRvIGl0cworICAgICAgICAgICAgICAgICAgICAvLyBiYWNrZ3JvdW5kLgorICAgICAgICAgICAgICAgICAgIHNwYW5zID0gZ2V0UGFyYWdyYXBoU3BhbnMoc3AsIHN0YXJ0LCBlbmQsIExpbmVCYWNrZ3JvdW5kU3Bhbi5jbGFzcyk7CiAgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgZm9yIChpbnQgbiA9IDA7IG4gPCBzcGFucy5sZW5ndGg7IG4rKykgewpAQCAtMjM0LDExICsyNDcsMTEgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICAvLyByZXNldCB0byB0aGVpciBvcmlnaW5hbCB2YWx1ZXMKLSAgICAgICAgICAgIHNwYW5lbmQgPSAwOworICAgICAgICAgICAgc3BhbkVuZCA9IDA7CiAgICAgICAgICAgICBwcmV2aW91c0xpbmVCb3R0b20gPSBnZXRMaW5lVG9wKGZpcnN0KTsKICAgICAgICAgICAgIHByZXZpb3VzTGluZUVuZCA9IGdldExpbmVTdGFydChmaXJzdCk7CiAgICAgICAgICAgICBzcGFucyA9IE5PX1BBUkFfU1BBTlM7Ci0gICAgICAgIH0gCisgICAgICAgIH0KIAogICAgICAgICAvLyBUaGVyZSBjYW4gYmUgYSBoaWdobGlnaHQgZXZlbiB3aXRob3V0IHNwYW5zIGlmIHdlIGFyZSBkcmF3aW5nCiAgICAgICAgIC8vIGEgbm9uLXNwYW5uZWQgdHJhbnNmb3JtYXRpb24gb2YgYSBzcGFubmVkIGVkaXRpbmcgYnVmZmVyLgpAQCAtMjU1LDcgKzI2OCwxMSBAQAogICAgICAgICB9CiAKICAgICAgICAgQWxpZ25tZW50IGFsaWduID0gbUFsaWdubWVudDsKLSAgICAgICAgCisgICAgICAgIFRhYlN0b3BzIHRhYlN0b3BzID0gbnVsbDsKKyAgICAgICAgYm9vbGVhbiB0YWJTdG9wc0lzSW5pdGlhbGl6ZWQgPSBmYWxzZTsKKworICAgICAgICBUZXh0TGluZSB0bCA9IFRleHRMaW5lLm9idGFpbigpOworCiAgICAgICAgIC8vIE5leHQgZHJhdyB0aGUgbGluZXMsIG9uZSBhdCBhIHRpbWUuCiAgICAgICAgIC8vIHRoZSBiYXNlbGluZSBpcyB0aGUgdG9wIG9mIHRoZSBmb2xsb3dpbmcgbGluZSBtaW51cyB0aGUgY3VycmVudAogICAgICAgICAvLyBsaW5lJ3MgZGVzY2VudC4KQEAgLTI3MCwxOSArMjg3LDMwIEBACiAgICAgICAgICAgICBwcmV2aW91c0xpbmVCb3R0b20gPSBsYm90dG9tOwogICAgICAgICAgICAgaW50IGxiYXNlbGluZSA9IGxib3R0b20gLSBnZXRMaW5lRGVzY2VudChpKTsKIAotICAgICAgICAgICAgYm9vbGVhbiBpc0ZpcnN0UGFyYUxpbmUgPSBmYWxzZTsKLSAgICAgICAgICAgIGlmIChzcGFubmVkVGV4dCkgeyAKLSAgICAgICAgICAgICAgICBpZiAoc3RhcnQgPT0gMCB8fCBidWYuY2hhckF0KHN0YXJ0IC0gMSkgPT0gJ1xuJykgewotICAgICAgICAgICAgICAgICAgICBpc0ZpcnN0UGFyYUxpbmUgPSB0cnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAvLyBOZXcgYmF0Y2ggb2YgcGFyYWdyYXBoIHN0eWxlcywgY29tcHV0ZSB0aGUgYWxpZ25tZW50LgotICAgICAgICAgICAgICAgIC8vIExhc3QgYWxpZ25tZW50IHN0eWxlIHdpbnMuCi0gICAgICAgICAgICAgICAgaWYgKHN0YXJ0ID49IHNwYW5lbmQpIHsKLSAgICAgICAgICAgICAgICAgICAgU3Bhbm5lZCBzcCA9IChTcGFubmVkKSBidWY7Ci0gICAgICAgICAgICAgICAgICAgIHNwYW5lbmQgPSBzcC5uZXh0U3BhblRyYW5zaXRpb24oc3RhcnQsIHRleHRMZW5ndGgsCisgICAgICAgICAgICBpbnQgZGlyID0gZ2V0UGFyYWdyYXBoRGlyZWN0aW9uKGkpOworICAgICAgICAgICAgaW50IGxlZnQgPSAwOworICAgICAgICAgICAgaW50IHJpZ2h0ID0gbVdpZHRoOworCisgICAgICAgICAgICBpZiAoc3Bhbm5lZFRleHQpIHsKKyAgICAgICAgICAgICAgICBTcGFubmVkIHNwID0gKFNwYW5uZWQpIGJ1ZjsKKyAgICAgICAgICAgICAgICBib29sZWFuIGlzRmlyc3RQYXJhTGluZSA9IChzdGFydCA9PSAwIHx8CisgICAgICAgICAgICAgICAgICAgICAgICBidWYuY2hhckF0KHN0YXJ0IC0gMSkgPT0gJ1xuJyk7CisKKyAgICAgICAgICAgICAgICAvLyBOZXcgYmF0Y2ggb2YgcGFyYWdyYXBoIHN0eWxlcywgY29sbGVjdCBpbnRvIHNwYW5zIGFycmF5LgorICAgICAgICAgICAgICAgIC8vIENvbXB1dGUgdGhlIGFsaWdubWVudCwgbGFzdCBhbGlnbm1lbnQgc3R5bGUgd2lucy4KKyAgICAgICAgICAgICAgICAvLyBSZXNldCB0YWJTdG9wcywgd2UnbGwgcmVidWlsZCBpZiB3ZSBlbmNvdW50ZXIgYSBsaW5lIHdpdGgKKyAgICAgICAgICAgICAgICAvLyB0YWJzLgorICAgICAgICAgICAgICAgIC8vIFdlIGV4cGVjdCBwYXJhZ3JhcGggc3BhbnMgdG8gYmUgcmVsYXRpdmVseSBpbmZyZXF1ZW50LCB1c2UKKyAgICAgICAgICAgICAgICAvLyBzcGFuRW5kIHNvIHRoYXQgd2UgY2FuIGNoZWNrIGxlc3MgZnJlcXVlbnRseS4gIFNpbmNlCisgICAgICAgICAgICAgICAgLy8gcGFyYWdyYXBoIHN0eWxlcyBvdWdodCB0byBhcHBseSB0byBlbnRpcmUgcGFyYWdyYXBocywgd2UgY2FuCisgICAgICAgICAgICAgICAgLy8ganVzdCBjb2xsZWN0IHRoZSBvbmVzIHByZXNlbnQgYXQgdGhlIHN0YXJ0IG9mIHRoZSBwYXJhZ3JhcGguCisgICAgICAgICAgICAgICAgLy8gSWYgc3BhbkVuZCBpcyBiZWZvcmUgdGhlIGVuZCBvZiB0aGUgcGFyYWdyYXBoLCB0aGF0J3Mgbm90CisgICAgICAgICAgICAgICAgLy8gb3VyIHByb2JsZW0uCisgICAgICAgICAgICAgICAgaWYgKHN0YXJ0ID49IHNwYW5FbmQgJiYgKGkgPT0gZmlyc3QgfHwgaXNGaXJzdFBhcmFMaW5lKSkgeworICAgICAgICAgICAgICAgICAgICBzcGFuRW5kID0gc3AubmV4dFNwYW5UcmFuc2l0aW9uKHN0YXJ0LCB0ZXh0TGVuZ3RoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhcmFncmFwaFN0eWxlLmNsYXNzKTsKLSAgICAgICAgICAgICAgICAgICAgc3BhbnMgPSBzcC5nZXRTcGFucyhzdGFydCwgc3BhbmVuZCwgUGFyYWdyYXBoU3R5bGUuY2xhc3MpOwotICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgc3BhbnMgPSBnZXRQYXJhZ3JhcGhTcGFucyhzcCwgc3RhcnQsIHNwYW5FbmQsIFBhcmFncmFwaFN0eWxlLmNsYXNzKTsKKwogICAgICAgICAgICAgICAgICAgICBhbGlnbiA9IG1BbGlnbm1lbnQ7CiAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IG4gPSBzcGFucy5sZW5ndGgtMTsgbiA+PSAwOyBuLS0pIHsKICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzcGFuc1tuXSBpbnN0YW5jZW9mIEFsaWdubWVudFNwYW4pIHsKQEAgLTI5MCw0NSArMzE4LDQ5IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGludCBkaXIgPSBnZXRQYXJhZ3JhcGhEaXJlY3Rpb24oaSk7Ci0gICAgICAgICAgICBpbnQgbGVmdCA9IDA7Ci0gICAgICAgICAgICBpbnQgcmlnaHQgPSBtV2lkdGg7CiAKLSAgICAgICAgICAgIC8vIERyYXcgYWxsIGxlYWRpbmcgbWFyZ2luIHNwYW5zLiAgQWRqdXN0IGxlZnQgb3IgcmlnaHQgYWNjb3JkaW5nCi0gICAgICAgICAgICAvLyB0byB0aGUgcGFyYWdyYXBoIGRpcmVjdGlvbiBvZiB0aGUgbGluZS4KLSAgICAgICAgICAgIGlmIChzcGFubmVkVGV4dCkgeworICAgICAgICAgICAgICAgICAgICB0YWJTdG9wc0lzSW5pdGlhbGl6ZWQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvLyBEcmF3IGFsbCBsZWFkaW5nIG1hcmdpbiBzcGFucy4gIEFkanVzdCBsZWZ0IG9yIHJpZ2h0IGFjY29yZGluZworICAgICAgICAgICAgICAgIC8vIHRvIHRoZSBwYXJhZ3JhcGggZGlyZWN0aW9uIG9mIHRoZSBsaW5lLgogICAgICAgICAgICAgICAgIGZpbmFsIGludCBsZW5ndGggPSBzcGFucy5sZW5ndGg7CiAgICAgICAgICAgICAgICAgZm9yIChpbnQgbiA9IDA7IG4gPCBsZW5ndGg7IG4rKykgewogICAgICAgICAgICAgICAgICAgICBpZiAoc3BhbnNbbl0gaW5zdGFuY2VvZiBMZWFkaW5nTWFyZ2luU3BhbikgewogICAgICAgICAgICAgICAgICAgICAgICAgTGVhZGluZ01hcmdpblNwYW4gbWFyZ2luID0gKExlYWRpbmdNYXJnaW5TcGFuKSBzcGFuc1tuXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gdXNlRmlyc3RMaW5lTWFyZ2luID0gaXNGaXJzdFBhcmFMaW5lOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1hcmdpbiBpbnN0YW5jZW9mIExlYWRpbmdNYXJnaW5TcGFuMikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjb3VudCA9ICgoTGVhZGluZ01hcmdpblNwYW4yKSBtYXJnaW4pLmdldExlYWRpbmdNYXJnaW5MaW5lQ291bnQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RhcnRMaW5lID0gZ2V0TGluZUZvck9mZnNldChzcC5nZXRTcGFuU3RhcnQobWFyZ2luKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlRmlyc3RMaW5lTWFyZ2luID0gaSA8IHN0YXJ0TGluZSArIGNvdW50OworICAgICAgICAgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGlyID09IERJUl9SSUdIVF9UT19MRUZUKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFyZ2luLmRyYXdMZWFkaW5nTWFyZ2luKGMsIHBhaW50LCByaWdodCwgZGlyLCBsdG9wLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYmFzZWxpbmUsIGxib3R0b20sIGJ1ZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnQsIGVuZCwgaXNGaXJzdFBhcmFMaW5lLCB0aGlzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmlnaHQgLT0gbWFyZ2luLmdldExlYWRpbmdNYXJnaW4oaXNGaXJzdFBhcmFMaW5lKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByaWdodCAtPSBtYXJnaW4uZ2V0TGVhZGluZ01hcmdpbih1c2VGaXJzdExpbmVNYXJnaW4pOwogICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXJnaW4uZHJhd0xlYWRpbmdNYXJnaW4oYywgcGFpbnQsIGxlZnQsIGRpciwgbHRvcCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGJhc2VsaW5lLCBsYm90dG9tLCBidWYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0LCBlbmQsIGlzRmlyc3RQYXJhTGluZSwgdGhpcyk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIHVzZU1hcmdpbiA9IGlzRmlyc3RQYXJhTGluZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobWFyZ2luIGluc3RhbmNlb2YgTGVhZGluZ01hcmdpblNwYW4uTGVhZGluZ01hcmdpblNwYW4yKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjb3VudCA9ICgoTGVhZGluZ01hcmdpblNwYW4uTGVhZGluZ01hcmdpblNwYW4yKW1hcmdpbikuZ2V0TGVhZGluZ01hcmdpbkxpbmVDb3VudCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VNYXJnaW4gPSBjb3VudCA+IGk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZnQgKz0gbWFyZ2luLmdldExlYWRpbmdNYXJnaW4odXNlTWFyZ2luKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWZ0ICs9IG1hcmdpbi5nZXRMZWFkaW5nTWFyZ2luKHVzZUZpcnN0TGluZU1hcmdpbik7CiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIC8vIEFkanVzdCB0aGUgcG9pbnQgYXQgd2hpY2ggdG8gc3RhcnQgcmVuZGVyaW5nIGRlcGVuZGluZyBvbiB0aGUKLSAgICAgICAgICAgIC8vIGFsaWdubWVudCBvZiB0aGUgcGFyYWdyYXBoLgorICAgICAgICAgICAgYm9vbGVhbiBoYXNUYWJPckVtb2ppID0gZ2V0TGluZUNvbnRhaW5zVGFiKGkpOworICAgICAgICAgICAgLy8gQ2FuJ3QgdGVsbCBpZiB3ZSBoYXZlIHRhYnMgZm9yIHN1cmUsIGN1cnJlbnRseQorICAgICAgICAgICAgaWYgKGhhc1RhYk9yRW1vamkgJiYgIXRhYlN0b3BzSXNJbml0aWFsaXplZCkgeworICAgICAgICAgICAgICAgIGlmICh0YWJTdG9wcyA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIHRhYlN0b3BzID0gbmV3IFRhYlN0b3BzKFRBQl9JTkNSRU1FTlQsIHNwYW5zKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICB0YWJTdG9wcy5yZXNldChUQUJfSU5DUkVNRU5ULCBzcGFucyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHRhYlN0b3BzSXNJbml0aWFsaXplZCA9IHRydWU7CisgICAgICAgICAgICB9CisKICAgICAgICAgICAgIGludCB4OwogICAgICAgICAgICAgaWYgKGFsaWduID09IEFsaWdubWVudC5BTElHTl9OT1JNQUwpIHsKICAgICAgICAgICAgICAgICBpZiAoZGlyID09IERJUl9MRUZUX1RPX1JJR0hUKSB7CkBAIC0zMzcsNDEgKzM2OSw4MCBAQAogICAgICAgICAgICAgICAgICAgICB4ID0gcmlnaHQ7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBpbnQgbWF4ID0gKGludClnZXRMaW5lTWF4KGksIHNwYW5zLCBmYWxzZSk7CisgICAgICAgICAgICAgICAgaW50IG1heCA9IChpbnQpZ2V0TGluZUV4dGVudChpLCB0YWJTdG9wcywgZmFsc2UpOwogICAgICAgICAgICAgICAgIGlmIChhbGlnbiA9PSBBbGlnbm1lbnQuQUxJR05fT1BQT1NJVEUpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGRpciA9PSBESVJfUklHSFRfVE9fTEVGVCkgewotICAgICAgICAgICAgICAgICAgICAgICAgeCA9IGxlZnQgKyBtYXg7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChkaXIgPT0gRElSX0xFRlRfVE9fUklHSFQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIHggPSByaWdodCAtIG1heDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIEFsaWdubWVudC5BTElHTl9DRU5URVIKLSAgICAgICAgICAgICAgICAgICAgbWF4ID0gbWF4ICYgfjE7Ci0gICAgICAgICAgICAgICAgICAgIGludCBoYWxmID0gKHJpZ2h0IC0gbGVmdCAtIG1heCkgPj4gMTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGRpciA9PSBESVJfUklHSFRfVE9fTEVGVCkgewotICAgICAgICAgICAgICAgICAgICAgICAgeCA9IHJpZ2h0IC0gaGFsZjsKICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHggPSBsZWZ0ICsgaGFsZjsKKyAgICAgICAgICAgICAgICAgICAgICAgIHggPSBsZWZ0IC0gbWF4OwogICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIHsgLy8gQWxpZ25tZW50LkFMSUdOX0NFTlRFUgorICAgICAgICAgICAgICAgICAgICBtYXggPSBtYXggJiB+MTsKKyAgICAgICAgICAgICAgICAgICAgeCA9IChyaWdodCArIGxlZnQgLSBtYXgpID4+IDE7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBEaXJlY3Rpb25zIGRpcmVjdGlvbnMgPSBnZXRMaW5lRGlyZWN0aW9ucyhpKTsKLSAgICAgICAgICAgIGJvb2xlYW4gaGFzVGFiID0gZ2V0TGluZUNvbnRhaW5zVGFiKGkpOwogICAgICAgICAgICAgaWYgKGRpcmVjdGlvbnMgPT0gRElSU19BTExfTEVGVF9UT19SSUdIVCAmJgotICAgICAgICAgICAgICAgICAgICAhc3Bhbm5lZFRleHQgJiYgIWhhc1RhYikgewotICAgICAgICAgICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShkaXIgPT0gRElSX0xFRlRfVE9fUklHSFQpOwotICAgICAgICAgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0Tm90TnVsbChjKTsKLSAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICFzcGFubmVkVGV4dCAmJiAhaGFzVGFiT3JFbW9qaSkgewogICAgICAgICAgICAgICAgIC8vIFhYWDogYXNzdW1lcyB0aGVyZSdzIG5vdGhpbmcgYWRkaXRpb25hbCB0byBiZSBkb25lCiAgICAgICAgICAgICAgICAgYy5kcmF3VGV4dChidWYsIHN0YXJ0LCBlbmQsIHgsIGxiYXNlbGluZSwgcGFpbnQpOwogICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBkcmF3VGV4dChjLCBidWYsIHN0YXJ0LCBlbmQsIGRpciwgZGlyZWN0aW9ucywKLSAgICAgICAgICAgICAgICAgICAgeCwgbHRvcCwgbGJhc2VsaW5lLCBsYm90dG9tLCBwYWludCwgbVdvcmtQYWludCwKLSAgICAgICAgICAgICAgICAgICAgaGFzVGFiLCBzcGFucyk7CisgICAgICAgICAgICAgICAgdGwuc2V0KHBhaW50LCBidWYsIHN0YXJ0LCBlbmQsIGRpciwgZGlyZWN0aW9ucywgaGFzVGFiT3JFbW9qaSwgdGFiU3RvcHMpOworICAgICAgICAgICAgICAgIHRsLmRyYXcoYywgeCwgbHRvcCwgbGJhc2VsaW5lLCBsYm90dG9tKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQorCisgICAgICAgIFRleHRMaW5lLnJlY3ljbGUodGwpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgc3RhcnQgcG9zaXRpb24gb2YgdGhlIGxpbmUsIGdpdmVuIHRoZSBsZWZ0IGFuZCByaWdodCBib3VuZHMKKyAgICAgKiBvZiB0aGUgbWFyZ2lucy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBsaW5lIHRoZSBsaW5lIGluZGV4CisgICAgICogQHBhcmFtIGxlZnQgdGhlIGxlZnQgYm91bmRzICgwLCBvciBsZWFkaW5nIG1hcmdpbiBpZiBsdHIgcGFyYSkKKyAgICAgKiBAcGFyYW0gcmlnaHQgdGhlIHJpZ2h0IGJvdW5kcyAod2lkdGgsIG1pbnVzIGxlYWRpbmcgbWFyZ2luIGlmIHJ0bCBwYXJhKQorICAgICAqIEByZXR1cm4gdGhlIHN0YXJ0IHBvc2l0aW9uIG9mIHRoZSBsaW5lICh0byByaWdodCBvZiBsaW5lIGlmIHJ0bCBwYXJhKQorICAgICAqLworICAgIHByaXZhdGUgaW50IGdldExpbmVTdGFydFBvcyhpbnQgbGluZSwgaW50IGxlZnQsIGludCByaWdodCkgeworICAgICAgICAvLyBBZGp1c3QgdGhlIHBvaW50IGF0IHdoaWNoIHRvIHN0YXJ0IHJlbmRlcmluZyBkZXBlbmRpbmcgb24gdGhlCisgICAgICAgIC8vIGFsaWdubWVudCBvZiB0aGUgcGFyYWdyYXBoLgorICAgICAgICBBbGlnbm1lbnQgYWxpZ24gPSBnZXRQYXJhZ3JhcGhBbGlnbm1lbnQobGluZSk7CisgICAgICAgIGludCBkaXIgPSBnZXRQYXJhZ3JhcGhEaXJlY3Rpb24obGluZSk7CisKKyAgICAgICAgaW50IHg7CisgICAgICAgIGlmIChhbGlnbiA9PSBBbGlnbm1lbnQuQUxJR05fTk9STUFMKSB7CisgICAgICAgICAgICBpZiAoZGlyID09IERJUl9MRUZUX1RPX1JJR0hUKSB7CisgICAgICAgICAgICAgICAgeCA9IGxlZnQ7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHggPSByaWdodDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIFRhYlN0b3BzIHRhYlN0b3BzID0gbnVsbDsKKyAgICAgICAgICAgIGlmIChtU3Bhbm5lZFRleHQgJiYgZ2V0TGluZUNvbnRhaW5zVGFiKGxpbmUpKSB7CisgICAgICAgICAgICAgICAgU3Bhbm5lZCBzcGFubmVkID0gKFNwYW5uZWQpIG1UZXh0OworICAgICAgICAgICAgICAgIGludCBzdGFydCA9IGdldExpbmVTdGFydChsaW5lKTsKKyAgICAgICAgICAgICAgICBpbnQgc3BhbkVuZCA9IHNwYW5uZWQubmV4dFNwYW5UcmFuc2l0aW9uKHN0YXJ0LCBzcGFubmVkLmxlbmd0aCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgVGFiU3RvcFNwYW4uY2xhc3MpOworICAgICAgICAgICAgICAgIFRhYlN0b3BTcGFuW10gdGFiU3BhbnMgPSBnZXRQYXJhZ3JhcGhTcGFucyhzcGFubmVkLCBzdGFydCwgc3BhbkVuZCwgVGFiU3RvcFNwYW4uY2xhc3MpOworICAgICAgICAgICAgICAgIGlmICh0YWJTcGFucy5sZW5ndGggPiAwKSB7CisgICAgICAgICAgICAgICAgICAgIHRhYlN0b3BzID0gbmV3IFRhYlN0b3BzKFRBQl9JTkNSRU1FTlQsIHRhYlNwYW5zKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpbnQgbWF4ID0gKGludClnZXRMaW5lRXh0ZW50KGxpbmUsIHRhYlN0b3BzLCBmYWxzZSk7CisgICAgICAgICAgICBpZiAoYWxpZ24gPT0gQWxpZ25tZW50LkFMSUdOX09QUE9TSVRFKSB7CisgICAgICAgICAgICAgICAgaWYgKGRpciA9PSBESVJfTEVGVF9UT19SSUdIVCkgeworICAgICAgICAgICAgICAgICAgICB4ID0gcmlnaHQgLSBtYXg7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgeCA9IGxlZnQgLSBtYXg7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsgLy8gQWxpZ25tZW50LkFMSUdOX0NFTlRFUgorICAgICAgICAgICAgICAgIG1heCA9IG1heCAmIH4xOworICAgICAgICAgICAgICAgIHggPSAobGVmdCArIHJpZ2h0IC0gbWF4KSA+PiAxOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiB4OwogICAgIH0KIAogICAgIC8qKgpAQCAtNDE3LDcgKzQ4OCw3IEBACiAKICAgICAgICAgbVdpZHRoID0gd2lkOwogICAgIH0KLSAgICAKKwogICAgIC8qKgogICAgICAqIFJldHVybiB0aGUgdG90YWwgaGVpZ2h0IG9mIHRoaXMgbGF5b3V0LgogICAgICAqLwpAQCAtNDUwLDcgKzUyMSw3IEBACiAgICAgICogUmV0dXJuIHRoZSBudW1iZXIgb2YgbGluZXMgb2YgdGV4dCBpbiB0aGlzIGxheW91dC4KICAgICAgKi8KICAgICBwdWJsaWMgYWJzdHJhY3QgaW50IGdldExpbmVDb3VudCgpOwotICAgIAorCiAgICAgLyoqCiAgICAgICogUmV0dXJuIHRoZSBiYXNlbGluZSBmb3IgdGhlIHNwZWNpZmllZCBsaW5lICgwJmhlbGxpcDtnZXRMaW5lQ291bnQoKSAtIDEpCiAgICAgICogSWYgYm91bmRzIGlzIG5vdCBudWxsLCByZXR1cm4gdGhlIHRvcCwgbGVmdCwgcmlnaHQsIGJvdHRvbSBleHRlbnRzCkBAIC01MjQsMTMgKzU5NSw5NSBAQAogICAgICAqLwogICAgIHB1YmxpYyBhYnN0cmFjdCBpbnQgZ2V0Qm90dG9tUGFkZGluZygpOwogCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGNoYXJhY3RlciBhdCBvZmZzZXQgYW5kIHRoZSBwcmVjZWRpbmcgY2hhcmFjdGVyCisgICAgICogYXJlIGF0IGRpZmZlcmVudCBydW4gbGV2ZWxzIChhbmQgdGh1cyB0aGVyZSdzIGEgc3BsaXQgY2FyZXQpLgorICAgICAqIEBwYXJhbSBvZmZzZXQgdGhlIG9mZnNldAorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiBhdCBhIGxldmVsIGJvdW5kYXJ5CisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIGlzTGV2ZWxCb3VuZGFyeShpbnQgb2Zmc2V0KSB7CisgICAgICAgIGludCBsaW5lID0gZ2V0TGluZUZvck9mZnNldChvZmZzZXQpOworICAgICAgICBEaXJlY3Rpb25zIGRpcnMgPSBnZXRMaW5lRGlyZWN0aW9ucyhsaW5lKTsKKyAgICAgICAgaWYgKGRpcnMgPT0gRElSU19BTExfTEVGVF9UT19SSUdIVCB8fCBkaXJzID09IERJUlNfQUxMX1JJR0hUX1RPX0xFRlQpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIGludFtdIHJ1bnMgPSBkaXJzLm1EaXJlY3Rpb25zOworICAgICAgICBpbnQgbGluZVN0YXJ0ID0gZ2V0TGluZVN0YXJ0KGxpbmUpOworICAgICAgICBpbnQgbGluZUVuZCA9IGdldExpbmVFbmQobGluZSk7CisgICAgICAgIGlmIChvZmZzZXQgPT0gbGluZVN0YXJ0IHx8IG9mZnNldCA9PSBsaW5lRW5kKSB7CisgICAgICAgICAgICBpbnQgcGFyYUxldmVsID0gZ2V0UGFyYWdyYXBoRGlyZWN0aW9uKGxpbmUpID09IDEgPyAwIDogMTsKKyAgICAgICAgICAgIGludCBydW5JbmRleCA9IG9mZnNldCA9PSBsaW5lU3RhcnQgPyAwIDogcnVucy5sZW5ndGggLSAyOworICAgICAgICAgICAgcmV0dXJuICgocnVuc1tydW5JbmRleCArIDFdID4+PiBSVU5fTEVWRUxfU0hJRlQpICYgUlVOX0xFVkVMX01BU0spICE9IHBhcmFMZXZlbDsKKyAgICAgICAgfQorCisgICAgICAgIG9mZnNldCAtPSBsaW5lU3RhcnQ7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcnVucy5sZW5ndGg7IGkgKz0gMikgeworICAgICAgICAgICAgaWYgKG9mZnNldCA9PSBydW5zW2ldKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHByaXZhdGUgYm9vbGVhbiBwcmltYXJ5SXNUcmFpbGluZ1ByZXZpb3VzKGludCBvZmZzZXQpIHsKKyAgICAgICAgaW50IGxpbmUgPSBnZXRMaW5lRm9yT2Zmc2V0KG9mZnNldCk7CisgICAgICAgIGludCBsaW5lU3RhcnQgPSBnZXRMaW5lU3RhcnQobGluZSk7CisgICAgICAgIGludCBsaW5lRW5kID0gZ2V0TGluZUVuZChsaW5lKTsKKyAgICAgICAgaW50W10gcnVucyA9IGdldExpbmVEaXJlY3Rpb25zKGxpbmUpLm1EaXJlY3Rpb25zOworCisgICAgICAgIGludCBsZXZlbEF0ID0gLTE7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcnVucy5sZW5ndGg7IGkgKz0gMikgeworICAgICAgICAgICAgaW50IHN0YXJ0ID0gbGluZVN0YXJ0ICsgcnVuc1tpXTsKKyAgICAgICAgICAgIGludCBsaW1pdCA9IHN0YXJ0ICsgKHJ1bnNbaSsxXSAmIFJVTl9MRU5HVEhfTUFTSyk7CisgICAgICAgICAgICBpZiAobGltaXQgPiBsaW5lRW5kKSB7CisgICAgICAgICAgICAgICAgbGltaXQgPSBsaW5lRW5kOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG9mZnNldCA+PSBzdGFydCAmJiBvZmZzZXQgPCBsaW1pdCkgeworICAgICAgICAgICAgICAgIGlmIChvZmZzZXQgPiBzdGFydCkgeworICAgICAgICAgICAgICAgICAgICAvLyBQcmV2aW91cyBjaGFyYWN0ZXIgaXMgYXQgc2FtZSBsZXZlbCwgc28gZG9uJ3QgdXNlIHRyYWlsaW5nLgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGxldmVsQXQgPSAocnVuc1tpKzFdID4+PiBSVU5fTEVWRUxfU0hJRlQpICYgUlVOX0xFVkVMX01BU0s7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKGxldmVsQXQgPT0gLTEpIHsKKyAgICAgICAgICAgIC8vIE9mZnNldCB3YXMgbGltaXQgb2YgbGluZS4KKyAgICAgICAgICAgIGxldmVsQXQgPSBnZXRQYXJhZ3JhcGhEaXJlY3Rpb24obGluZSkgPT0gMSA/IDAgOiAxOworICAgICAgICB9CisKKyAgICAgICAgLy8gQXQgbGV2ZWwgYm91bmRhcnksIGNoZWNrIHByZXZpb3VzIGxldmVsLgorICAgICAgICBpbnQgbGV2ZWxCZWZvcmUgPSAtMTsKKyAgICAgICAgaWYgKG9mZnNldCA9PSBsaW5lU3RhcnQpIHsKKyAgICAgICAgICAgIGxldmVsQmVmb3JlID0gZ2V0UGFyYWdyYXBoRGlyZWN0aW9uKGxpbmUpID09IDEgPyAwIDogMTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG9mZnNldCAtPSAxOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBydW5zLmxlbmd0aDsgaSArPSAyKSB7CisgICAgICAgICAgICAgICAgaW50IHN0YXJ0ID0gbGluZVN0YXJ0ICsgcnVuc1tpXTsKKyAgICAgICAgICAgICAgICBpbnQgbGltaXQgPSBzdGFydCArIChydW5zW2krMV0gJiBSVU5fTEVOR1RIX01BU0spOworICAgICAgICAgICAgICAgIGlmIChsaW1pdCA+IGxpbmVFbmQpIHsKKyAgICAgICAgICAgICAgICAgICAgbGltaXQgPSBsaW5lRW5kOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAob2Zmc2V0ID49IHN0YXJ0ICYmIG9mZnNldCA8IGxpbWl0KSB7CisgICAgICAgICAgICAgICAgICAgIGxldmVsQmVmb3JlID0gKHJ1bnNbaSsxXSA+Pj4gUlVOX0xFVkVMX1NISUZUKSAmIFJVTl9MRVZFTF9NQVNLOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gbGV2ZWxCZWZvcmUgPCBsZXZlbEF0OworICAgIH0KKwogICAgIC8qKgogICAgICAqIEdldCB0aGUgcHJpbWFyeSBob3Jpem9udGFsIHBvc2l0aW9uIGZvciB0aGUgc3BlY2lmaWVkIHRleHQgb2Zmc2V0LgogICAgICAqIFRoaXMgaXMgdGhlIGxvY2F0aW9uIHdoZXJlIGEgbmV3IGNoYXJhY3RlciB3b3VsZCBiZSBpbnNlcnRlZCBpbgogICAgICAqIHRoZSBwYXJhZ3JhcGgncyBwcmltYXJ5IGRpcmVjdGlvbi4KICAgICAgKi8KICAgICBwdWJsaWMgZmxvYXQgZ2V0UHJpbWFyeUhvcml6b250YWwoaW50IG9mZnNldCkgewotICAgICAgICByZXR1cm4gZ2V0SG9yaXpvbnRhbChvZmZzZXQsIGZhbHNlLCB0cnVlKTsKKyAgICAgICAgYm9vbGVhbiB0cmFpbGluZyA9IHByaW1hcnlJc1RyYWlsaW5nUHJldmlvdXMob2Zmc2V0KTsKKyAgICAgICAgcmV0dXJuIGdldEhvcml6b250YWwob2Zmc2V0LCB0cmFpbGluZyk7CiAgICAgfQogCiAgICAgLyoqCkBAIC01MzksNjYgKzY5Miw0MiBAQAogICAgICAqIHRoZSBkaXJlY3Rpb24gb3RoZXIgdGhhbiB0aGUgcGFyYWdyYXBoJ3MgcHJpbWFyeSBkaXJlY3Rpb24uCiAgICAgICovCiAgICAgcHVibGljIGZsb2F0IGdldFNlY29uZGFyeUhvcml6b250YWwoaW50IG9mZnNldCkgewotICAgICAgICByZXR1cm4gZ2V0SG9yaXpvbnRhbChvZmZzZXQsIHRydWUsIHRydWUpOworICAgICAgICBib29sZWFuIHRyYWlsaW5nID0gcHJpbWFyeUlzVHJhaWxpbmdQcmV2aW91cyhvZmZzZXQpOworICAgICAgICByZXR1cm4gZ2V0SG9yaXpvbnRhbChvZmZzZXQsICF0cmFpbGluZyk7CiAgICAgfQogCi0gICAgcHJpdmF0ZSBmbG9hdCBnZXRIb3Jpem9udGFsKGludCBvZmZzZXQsIGJvb2xlYW4gdHJhaWxpbmcsIGJvb2xlYW4gYWx0KSB7CisgICAgcHJpdmF0ZSBmbG9hdCBnZXRIb3Jpem9udGFsKGludCBvZmZzZXQsIGJvb2xlYW4gdHJhaWxpbmcpIHsKICAgICAgICAgaW50IGxpbmUgPSBnZXRMaW5lRm9yT2Zmc2V0KG9mZnNldCk7CiAKLSAgICAgICAgcmV0dXJuIGdldEhvcml6b250YWwob2Zmc2V0LCB0cmFpbGluZywgYWx0LCBsaW5lKTsKKyAgICAgICAgcmV0dXJuIGdldEhvcml6b250YWwob2Zmc2V0LCB0cmFpbGluZywgbGluZSk7CiAgICAgfQogCi0gICAgcHJpdmF0ZSBmbG9hdCBnZXRIb3Jpem9udGFsKGludCBvZmZzZXQsIGJvb2xlYW4gdHJhaWxpbmcsIGJvb2xlYW4gYWx0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGluZSkgeworICAgIHByaXZhdGUgZmxvYXQgZ2V0SG9yaXpvbnRhbChpbnQgb2Zmc2V0LCBib29sZWFuIHRyYWlsaW5nLCBpbnQgbGluZSkgewogICAgICAgICBpbnQgc3RhcnQgPSBnZXRMaW5lU3RhcnQobGluZSk7Ci0gICAgICAgIGludCBlbmQgPSBnZXRMaW5lVmlzaWJsZUVuZChsaW5lKTsKKyAgICAgICAgaW50IGVuZCA9IGdldExpbmVFbmQobGluZSk7CiAgICAgICAgIGludCBkaXIgPSBnZXRQYXJhZ3JhcGhEaXJlY3Rpb24obGluZSk7Ci0gICAgICAgIGJvb2xlYW4gdGFiID0gZ2V0TGluZUNvbnRhaW5zVGFiKGxpbmUpOworICAgICAgICBib29sZWFuIGhhc1RhYk9yRW1vamkgPSBnZXRMaW5lQ29udGFpbnNUYWIobGluZSk7CiAgICAgICAgIERpcmVjdGlvbnMgZGlyZWN0aW9ucyA9IGdldExpbmVEaXJlY3Rpb25zKGxpbmUpOwogCi0gICAgICAgIFRhYlN0b3BTcGFuW10gdGFicyA9IG51bGw7Ci0gICAgICAgIGlmICh0YWIgJiYgbVRleHQgaW5zdGFuY2VvZiBTcGFubmVkKSB7Ci0gICAgICAgICAgICB0YWJzID0gKChTcGFubmVkKSBtVGV4dCkuZ2V0U3BhbnMoc3RhcnQsIGVuZCwgVGFiU3RvcFNwYW4uY2xhc3MpOworICAgICAgICBUYWJTdG9wcyB0YWJTdG9wcyA9IG51bGw7CisgICAgICAgIGlmIChoYXNUYWJPckVtb2ppICYmIG1UZXh0IGluc3RhbmNlb2YgU3Bhbm5lZCkgeworICAgICAgICAgICAgLy8gSnVzdCBjaGVja2luZyB0aGlzIGxpbmUgc2hvdWxkIGJlIGdvb2QgZW5vdWdoLCB0YWJzIHNob3VsZCBiZQorICAgICAgICAgICAgLy8gY29uc2lzdGVudCBhY3Jvc3MgYWxsIGxpbmVzIGluIGEgcGFyYWdyYXBoLgorICAgICAgICAgICAgVGFiU3RvcFNwYW5bXSB0YWJzID0gZ2V0UGFyYWdyYXBoU3BhbnMoKFNwYW5uZWQpIG1UZXh0LCBzdGFydCwgZW5kLCBUYWJTdG9wU3Bhbi5jbGFzcyk7CisgICAgICAgICAgICBpZiAodGFicy5sZW5ndGggPiAwKSB7CisgICAgICAgICAgICAgICAgdGFiU3RvcHMgPSBuZXcgVGFiU3RvcHMoVEFCX0lOQ1JFTUVOVCwgdGFicyk7IC8vIFhYWCBzaG91bGQgcmV1c2UKKyAgICAgICAgICAgIH0KICAgICAgICAgfQogCi0gICAgICAgIGZsb2F0IHdpZCA9IG1lYXN1cmVUZXh0KG1QYWludCwgbVdvcmtQYWludCwgbVRleHQsIHN0YXJ0LCBvZmZzZXQsIGVuZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlyLCBkaXJlY3Rpb25zLCB0cmFpbGluZywgYWx0LCB0YWIsIHRhYnMpOworICAgICAgICBUZXh0TGluZSB0bCA9IFRleHRMaW5lLm9idGFpbigpOworICAgICAgICB0bC5zZXQobVBhaW50LCBtVGV4dCwgc3RhcnQsIGVuZCwgZGlyLCBkaXJlY3Rpb25zLCBoYXNUYWJPckVtb2ppLCB0YWJTdG9wcyk7CisgICAgICAgIGZsb2F0IHdpZCA9IHRsLm1lYXN1cmUob2Zmc2V0IC0gc3RhcnQsIHRyYWlsaW5nLCBudWxsKTsKKyAgICAgICAgVGV4dExpbmUucmVjeWNsZSh0bCk7CiAKLSAgICAgICAgaWYgKG9mZnNldCA+IGVuZCkgewotICAgICAgICAgICAgaWYgKGRpciA9PSBESVJfUklHSFRfVE9fTEVGVCkKLSAgICAgICAgICAgICAgICB3aWQgLT0gbWVhc3VyZVRleHQobVBhaW50LCBtV29ya1BhaW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtVGV4dCwgZW5kLCBvZmZzZXQsIG51bGwsIHRhYiwgdGFicyk7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgd2lkICs9IG1lYXN1cmVUZXh0KG1QYWludCwgbVdvcmtQYWludCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVRleHQsIGVuZCwgb2Zmc2V0LCBudWxsLCB0YWIsIHRhYnMpOwotICAgICAgICB9Ci0KLSAgICAgICAgQWxpZ25tZW50IGFsaWduID0gZ2V0UGFyYWdyYXBoQWxpZ25tZW50KGxpbmUpOwogICAgICAgICBpbnQgbGVmdCA9IGdldFBhcmFncmFwaExlZnQobGluZSk7CiAgICAgICAgIGludCByaWdodCA9IGdldFBhcmFncmFwaFJpZ2h0KGxpbmUpOwogCi0gICAgICAgIGlmIChhbGlnbiA9PSBBbGlnbm1lbnQuQUxJR05fTk9STUFMKSB7Ci0gICAgICAgICAgICBpZiAoZGlyID09IERJUl9SSUdIVF9UT19MRUZUKQotICAgICAgICAgICAgICAgIHJldHVybiByaWdodCArIHdpZDsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICByZXR1cm4gbGVmdCArIHdpZDsKLSAgICAgICAgfQotCi0gICAgICAgIGZsb2F0IG1heCA9IGdldExpbmVNYXgobGluZSk7Ci0KLSAgICAgICAgaWYgKGFsaWduID09IEFsaWdubWVudC5BTElHTl9PUFBPU0lURSkgewotICAgICAgICAgICAgaWYgKGRpciA9PSBESVJfUklHSFRfVE9fTEVGVCkKLSAgICAgICAgICAgICAgICByZXR1cm4gbGVmdCArIG1heCArIHdpZDsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICByZXR1cm4gcmlnaHQgLSBtYXggKyB3aWQ7Ci0gICAgICAgIH0gZWxzZSB7IC8qIGFsaWduID09IEFsaWdubWVudC5BTElHTl9DRU5URVIgKi8KLSAgICAgICAgICAgIGludCBpbWF4ID0gKChpbnQpIG1heCkgJiB+MTsKLQotICAgICAgICAgICAgaWYgKGRpciA9PSBESVJfUklHSFRfVE9fTEVGVCkKLSAgICAgICAgICAgICAgICByZXR1cm4gcmlnaHQgLSAoKChyaWdodCAtIGxlZnQpIC0gaW1heCkgLyAyKSArIHdpZDsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICByZXR1cm4gbGVmdCArICgocmlnaHQgLSBsZWZ0KSAtIGltYXgpIC8gMiArIHdpZDsKLSAgICAgICAgfQorICAgICAgICByZXR1cm4gZ2V0TGluZVN0YXJ0UG9zKGxpbmUsIGxlZnQsIHJpZ2h0KSArIHdpZDsKICAgICB9CiAKICAgICAvKioKQEAgLTY1NiwzOCArNzg1LDc2IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogR2V0cyB0aGUgaG9yaXpvbnRhbCBleHRlbnQgb2YgdGhlIHNwZWNpZmllZCBsaW5lLCBleGNsdWRpbmcKLSAgICAgKiB0cmFpbGluZyB3aGl0ZXNwYWNlLgorICAgICAqIEdldHMgdGhlIHVuc2lnbmVkIGhvcml6b250YWwgZXh0ZW50IG9mIHRoZSBzcGVjaWZpZWQgbGluZSwgaW5jbHVkaW5nCisgICAgICogbGVhZGluZyBtYXJnaW4gaW5kZW50LCBidXQgZXhjbHVkaW5nIHRyYWlsaW5nIHdoaXRlc3BhY2UuCiAgICAgICovCiAgICAgcHVibGljIGZsb2F0IGdldExpbmVNYXgoaW50IGxpbmUpIHsKLSAgICAgICAgcmV0dXJuIGdldExpbmVNYXgobGluZSwgbnVsbCwgZmFsc2UpOworICAgICAgICBmbG9hdCBtYXJnaW4gPSBnZXRQYXJhZ3JhcGhMZWFkaW5nTWFyZ2luKGxpbmUpOworICAgICAgICBmbG9hdCBzaWduZWRFeHRlbnQgPSBnZXRMaW5lRXh0ZW50KGxpbmUsIGZhbHNlKTsKKyAgICAgICAgcmV0dXJuIG1hcmdpbiArIHNpZ25lZEV4dGVudCA+PSAwID8gc2lnbmVkRXh0ZW50IDogLXNpZ25lZEV4dGVudDsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBob3Jpem9udGFsIGV4dGVudCBvZiB0aGUgc3BlY2lmaWVkIGxpbmUsIGluY2x1ZGluZwotICAgICAqIHRyYWlsaW5nIHdoaXRlc3BhY2UuCisgICAgICogR2V0cyB0aGUgdW5zaWduZWQgaG9yaXpvbnRhbCBleHRlbnQgb2YgdGhlIHNwZWNpZmllZCBsaW5lLCBpbmNsdWRpbmcKKyAgICAgKiBsZWFkaW5nIG1hcmdpbiBpbmRlbnQgYW5kIHRyYWlsaW5nIHdoaXRlc3BhY2UuCiAgICAgICovCiAgICAgcHVibGljIGZsb2F0IGdldExpbmVXaWR0aChpbnQgbGluZSkgewotICAgICAgICByZXR1cm4gZ2V0TGluZU1heChsaW5lLCBudWxsLCB0cnVlKTsKKyAgICAgICAgZmxvYXQgbWFyZ2luID0gZ2V0UGFyYWdyYXBoTGVhZGluZ01hcmdpbihsaW5lKTsKKyAgICAgICAgZmxvYXQgc2lnbmVkRXh0ZW50ID0gZ2V0TGluZUV4dGVudChsaW5lLCB0cnVlKTsKKyAgICAgICAgcmV0dXJuIG1hcmdpbiArIHNpZ25lZEV4dGVudCA+PSAwID8gc2lnbmVkRXh0ZW50IDogLXNpZ25lZEV4dGVudDsKICAgICB9CiAKLSAgICBwcml2YXRlIGZsb2F0IGdldExpbmVNYXgoaW50IGxpbmUsIE9iamVjdFtdIHRhYnMsIGJvb2xlYW4gZnVsbCkgeworICAgIC8qKgorICAgICAqIExpa2Uge0BsaW5rICNnZXRMaW5lRXh0ZW50KGludCxUYWJTdG9wcyxib29sZWFuKX0gYnV0IGRldGVybWluZXMgdGhlCisgICAgICogdGFiIHN0b3BzIGluc3RlYWQgb2YgdXNpbmcgdGhlIG9uZXMgcGFzc2VkIGluLgorICAgICAqIEBwYXJhbSBsaW5lIHRoZSBpbmRleCBvZiB0aGUgbGluZQorICAgICAqIEBwYXJhbSBmdWxsIHdoZXRoZXIgdG8gaW5jbHVkZSB0cmFpbGluZyB3aGl0ZXNwYWNlCisgICAgICogQHJldHVybiB0aGUgZXh0ZW50IG9mIHRoZSBsaW5lCisgICAgICovCisgICAgcHJpdmF0ZSBmbG9hdCBnZXRMaW5lRXh0ZW50KGludCBsaW5lLCBib29sZWFuIGZ1bGwpIHsKICAgICAgICAgaW50IHN0YXJ0ID0gZ2V0TGluZVN0YXJ0KGxpbmUpOwotICAgICAgICBpbnQgZW5kOworICAgICAgICBpbnQgZW5kID0gZnVsbCA/IGdldExpbmVFbmQobGluZSkgOiBnZXRMaW5lVmlzaWJsZUVuZChsaW5lKTsKIAotICAgICAgICBpZiAoZnVsbCkgewotICAgICAgICAgICAgZW5kID0gZ2V0TGluZUVuZChsaW5lKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGVuZCA9IGdldExpbmVWaXNpYmxlRW5kKGxpbmUpOwotICAgICAgICB9IAotICAgICAgICBib29sZWFuIHRhYiA9IGdldExpbmVDb250YWluc1RhYihsaW5lKTsKLQotICAgICAgICBpZiAodGFicyA9PSBudWxsICYmIHRhYiAmJiBtVGV4dCBpbnN0YW5jZW9mIFNwYW5uZWQpIHsKLSAgICAgICAgICAgIHRhYnMgPSAoKFNwYW5uZWQpIG1UZXh0KS5nZXRTcGFucyhzdGFydCwgZW5kLCBUYWJTdG9wU3Bhbi5jbGFzcyk7CisgICAgICAgIGJvb2xlYW4gaGFzVGFic09yRW1vamkgPSBnZXRMaW5lQ29udGFpbnNUYWIobGluZSk7CisgICAgICAgIFRhYlN0b3BzIHRhYlN0b3BzID0gbnVsbDsKKyAgICAgICAgaWYgKGhhc1RhYnNPckVtb2ppICYmIG1UZXh0IGluc3RhbmNlb2YgU3Bhbm5lZCkgeworICAgICAgICAgICAgLy8gSnVzdCBjaGVja2luZyB0aGlzIGxpbmUgc2hvdWxkIGJlIGdvb2QgZW5vdWdoLCB0YWJzIHNob3VsZCBiZQorICAgICAgICAgICAgLy8gY29uc2lzdGVudCBhY3Jvc3MgYWxsIGxpbmVzIGluIGEgcGFyYWdyYXBoLgorICAgICAgICAgICAgVGFiU3RvcFNwYW5bXSB0YWJzID0gZ2V0UGFyYWdyYXBoU3BhbnMoKFNwYW5uZWQpIG1UZXh0LCBzdGFydCwgZW5kLCBUYWJTdG9wU3Bhbi5jbGFzcyk7CisgICAgICAgICAgICBpZiAodGFicy5sZW5ndGggPiAwKSB7CisgICAgICAgICAgICAgICAgdGFiU3RvcHMgPSBuZXcgVGFiU3RvcHMoVEFCX0lOQ1JFTUVOVCwgdGFicyk7IC8vIFhYWCBzaG91bGQgcmV1c2UKKyAgICAgICAgICAgIH0KICAgICAgICAgfQorICAgICAgICBEaXJlY3Rpb25zIGRpcmVjdGlvbnMgPSBnZXRMaW5lRGlyZWN0aW9ucyhsaW5lKTsKKyAgICAgICAgaW50IGRpciA9IGdldFBhcmFncmFwaERpcmVjdGlvbihsaW5lKTsKIAotICAgICAgICByZXR1cm4gbWVhc3VyZVRleHQobVBhaW50LCBtV29ya1BhaW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgbVRleHQsIHN0YXJ0LCBlbmQsIG51bGwsIHRhYiwgdGFicyk7CisgICAgICAgIFRleHRMaW5lIHRsID0gVGV4dExpbmUub2J0YWluKCk7CisgICAgICAgIHRsLnNldChtUGFpbnQsIG1UZXh0LCBzdGFydCwgZW5kLCBkaXIsIGRpcmVjdGlvbnMsIGhhc1RhYnNPckVtb2ppLCB0YWJTdG9wcyk7CisgICAgICAgIGZsb2F0IHdpZHRoID0gdGwubWV0cmljcyhudWxsKTsKKyAgICAgICAgVGV4dExpbmUucmVjeWNsZSh0bCk7CisgICAgICAgIHJldHVybiB3aWR0aDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBzaWduZWQgaG9yaXpvbnRhbCBleHRlbnQgb2YgdGhlIHNwZWNpZmllZCBsaW5lLCBleGNsdWRpbmcKKyAgICAgKiBsZWFkaW5nIG1hcmdpbi4gIElmIGZ1bGwgaXMgZmFsc2UsIGV4Y2x1ZGVzIHRyYWlsaW5nIHdoaXRlc3BhY2UuCisgICAgICogQHBhcmFtIGxpbmUgdGhlIGluZGV4IG9mIHRoZSBsaW5lCisgICAgICogQHBhcmFtIHRhYlN0b3BzIHRoZSB0YWIgc3RvcHMsIGNhbiBiZSBudWxsIGlmIHdlIGtub3cgdGhleSdyZSBub3QgdXNlZC4KKyAgICAgKiBAcGFyYW0gZnVsbCB3aGV0aGVyIHRvIGluY2x1ZGUgdHJhaWxpbmcgd2hpdGVzcGFjZQorICAgICAqIEByZXR1cm4gdGhlIGV4dGVudCBvZiB0aGUgdGV4dCBvbiB0aGlzIGxpbmUKKyAgICAgKi8KKyAgICBwcml2YXRlIGZsb2F0IGdldExpbmVFeHRlbnQoaW50IGxpbmUsIFRhYlN0b3BzIHRhYlN0b3BzLCBib29sZWFuIGZ1bGwpIHsKKyAgICAgICAgaW50IHN0YXJ0ID0gZ2V0TGluZVN0YXJ0KGxpbmUpOworICAgICAgICBpbnQgZW5kID0gZnVsbCA/IGdldExpbmVFbmQobGluZSkgOiBnZXRMaW5lVmlzaWJsZUVuZChsaW5lKTsKKyAgICAgICAgYm9vbGVhbiBoYXNUYWJzT3JFbW9qaSA9IGdldExpbmVDb250YWluc1RhYihsaW5lKTsKKyAgICAgICAgRGlyZWN0aW9ucyBkaXJlY3Rpb25zID0gZ2V0TGluZURpcmVjdGlvbnMobGluZSk7CisgICAgICAgIGludCBkaXIgPSBnZXRQYXJhZ3JhcGhEaXJlY3Rpb24obGluZSk7CisKKyAgICAgICAgVGV4dExpbmUgdGwgPSBUZXh0TGluZS5vYnRhaW4oKTsKKyAgICAgICAgdGwuc2V0KG1QYWludCwgbVRleHQsIHN0YXJ0LCBlbmQsIGRpciwgZGlyZWN0aW9ucywgaGFzVGFic09yRW1vamksIHRhYlN0b3BzKTsKKyAgICAgICAgZmxvYXQgd2lkdGggPSB0bC5tZXRyaWNzKG51bGwpOworICAgICAgICBUZXh0TGluZS5yZWN5Y2xlKHRsKTsKKyAgICAgICAgcmV0dXJuIHdpZHRoOwogICAgIH0KIAogICAgIC8qKgpAQCAtNzM4LDcgKzkwNSw3IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogR2V0IHRoZSBjaGFyYWN0ZXIgb2Zmc2V0IG9uIHRoZSBzcGVjZmllZCBsaW5lIHdob3NlIHBvc2l0aW9uIGlzCisgICAgICogR2V0IHRoZSBjaGFyYWN0ZXIgb2Zmc2V0IG9uIHRoZSBzcGVjaWZpZWQgbGluZSB3aG9zZSBwb3NpdGlvbiBpcwogICAgICAqIGNsb3Nlc3QgdG8gdGhlIHNwZWNpZmllZCBob3Jpem9udGFsIHBvc2l0aW9uLgogICAgICAqLwogICAgIHB1YmxpYyBpbnQgZ2V0T2Zmc2V0Rm9ySG9yaXpvbnRhbChpbnQgbGluZSwgZmxvYXQgaG9yaXopIHsKQEAgLTc0OSwyMCArOTE2LDE2IEBACiAgICAgICAgIGlmIChsaW5lID09IGdldExpbmVDb3VudCgpIC0gMSkKICAgICAgICAgICAgIG1heCsrOwogCi0gICAgICAgIGlmIChsaW5lICE9IGdldExpbmVDb3VudCgpIC0gMSkKLSAgICAgICAgICAgIG1heCA9IFRleHRVdGlscy5nZXRPZmZzZXRCZWZvcmUobVRleHQsIGdldExpbmVFbmQobGluZSkpOwotCiAgICAgICAgIGludCBiZXN0ID0gbWluOwogICAgICAgICBmbG9hdCBiZXN0ZGlzdCA9IE1hdGguYWJzKGdldFByaW1hcnlIb3Jpem9udGFsKGJlc3QpIC0gaG9yaXopOwogCi0gICAgICAgIGludCBoZXJlID0gbWluOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGRpcnMubURpcmVjdGlvbnMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIGludCB0aGVyZSA9IGhlcmUgKyBkaXJzLm1EaXJlY3Rpb25zW2ldOwotICAgICAgICAgICAgaW50IHN3YXAgPSAoKGkgJiAxKSA9PSAwKSA/IDEgOiAtMTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBkaXJzLm1EaXJlY3Rpb25zLmxlbmd0aDsgaSArPSAyKSB7CisgICAgICAgICAgICBpbnQgaGVyZSA9IG1pbiArIGRpcnMubURpcmVjdGlvbnNbaV07CisgICAgICAgICAgICBpbnQgdGhlcmUgPSBoZXJlICsgKGRpcnMubURpcmVjdGlvbnNbaSsxXSAmIFJVTl9MRU5HVEhfTUFTSyk7CisgICAgICAgICAgICBpbnQgc3dhcCA9IChkaXJzLm1EaXJlY3Rpb25zW2krMV0gJiBSVU5fUlRMX0ZMQUcpICE9IDAgPyAtMSA6IDE7CiAKICAgICAgICAgICAgIGlmICh0aGVyZSA+IG1heCkKICAgICAgICAgICAgICAgICB0aGVyZSA9IG1heDsKLQogICAgICAgICAgICAgaW50IGhpZ2ggPSB0aGVyZSAtIDEgKyAxLCBsb3cgPSBoZXJlICsgMSAtIDEsIGd1ZXNzOwogCiAgICAgICAgICAgICB3aGlsZSAoaGlnaCAtIGxvdyA+IDEpIHsKQEAgLTc5NSw3ICs5NTgsNyBAQAogCiAgICAgICAgICAgICAgICAgaWYgKGRpc3QgPCBiZXN0ZGlzdCkgewogICAgICAgICAgICAgICAgICAgICBiZXN0ZGlzdCA9IGRpc3Q7Ci0gICAgICAgICAgICAgICAgICAgIGJlc3QgPSBsb3c7ICAgCisgICAgICAgICAgICAgICAgICAgIGJlc3QgPSBsb3c7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogCkBAIC04MDUsOCArOTY4LDYgQEAKICAgICAgICAgICAgICAgICBiZXN0ZGlzdCA9IGRpc3Q7CiAgICAgICAgICAgICAgICAgYmVzdCA9IGhlcmU7CiAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGhlcmUgPSB0aGVyZTsKICAgICAgICAgfQogCiAgICAgICAgIGZsb2F0IGRpc3QgPSBNYXRoLmFicyhnZXRQcmltYXJ5SG9yaXpvbnRhbChtYXgpIC0gaG9yaXopOwpAQCAtODI2LDE5ICs5ODcsMTUgQEAKICAgICAgICAgcmV0dXJuIGdldExpbmVTdGFydChsaW5lICsgMSk7CiAgICAgfQogCi0gICAgLyoqIAorICAgIC8qKgogICAgICAqIFJldHVybiB0aGUgdGV4dCBvZmZzZXQgYWZ0ZXIgdGhlIGxhc3QgdmlzaWJsZSBjaGFyYWN0ZXIgKHNvIHdoaXRlc3BhY2UKICAgICAgKiBpcyBub3QgY291bnRlZCkgb24gdGhlIHNwZWNpZmllZCBsaW5lLgogICAgICAqLwogICAgIHB1YmxpYyBpbnQgZ2V0TGluZVZpc2libGVFbmQoaW50IGxpbmUpIHsKICAgICAgICAgcmV0dXJuIGdldExpbmVWaXNpYmxlRW5kKGxpbmUsIGdldExpbmVTdGFydChsaW5lKSwgZ2V0TGluZVN0YXJ0KGxpbmUrMSkpOwogICAgIH0KLSAgICAKLSAgICBwcml2YXRlIGludCBnZXRMaW5lVmlzaWJsZUVuZChpbnQgbGluZSwgaW50IHN0YXJ0LCBpbnQgZW5kKSB7Ci0gICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoZ2V0TGluZVN0YXJ0KGxpbmUpID09IHN0YXJ0ICYmIGdldExpbmVTdGFydChsaW5lKzEpID09IGVuZCk7Ci0gICAgICAgIH0KIAorICAgIHByaXZhdGUgaW50IGdldExpbmVWaXNpYmxlRW5kKGludCBsaW5lLCBpbnQgc3RhcnQsIGludCBlbmQpIHsKICAgICAgICAgQ2hhclNlcXVlbmNlIHRleHQgPSBtVGV4dDsKICAgICAgICAgY2hhciBjaDsKICAgICAgICAgaWYgKGxpbmUgPT0gZ2V0TGluZUNvdW50KCkgLSAxKSB7CkBAIC04ODUsMjA3ICsxMDQyLDYyIEBACiAgICAgICAgIHJldHVybiBnZXRMaW5lVG9wKGxpbmUpIC0gKGdldExpbmVUb3AobGluZSsxKSAtIGdldExpbmVEZXNjZW50KGxpbmUpKTsKICAgICB9CiAKLSAgICAvKioKLSAgICAgKiBSZXR1cm4gdGhlIHRleHQgb2Zmc2V0IHRoYXQgd291bGQgYmUgcmVhY2hlZCBieSBtb3ZpbmcgbGVmdAotICAgICAqIChwb3NzaWJseSBvbnRvIGFub3RoZXIgbGluZSkgZnJvbSB0aGUgc3BlY2lmaWVkIG9mZnNldC4KLSAgICAgKi8KICAgICBwdWJsaWMgaW50IGdldE9mZnNldFRvTGVmdE9mKGludCBvZmZzZXQpIHsKLSAgICAgICAgaW50IGxpbmUgPSBnZXRMaW5lRm9yT2Zmc2V0KG9mZnNldCk7Ci0gICAgICAgIGludCBzdGFydCA9IGdldExpbmVTdGFydChsaW5lKTsKLSAgICAgICAgaW50IGVuZCA9IGdldExpbmVFbmQobGluZSk7Ci0gICAgICAgIERpcmVjdGlvbnMgZGlycyA9IGdldExpbmVEaXJlY3Rpb25zKGxpbmUpOwotCi0gICAgICAgIGlmIChsaW5lICE9IGdldExpbmVDb3VudCgpIC0gMSkKLSAgICAgICAgICAgIGVuZCA9IFRleHRVdGlscy5nZXRPZmZzZXRCZWZvcmUobVRleHQsIGVuZCk7Ci0KLSAgICAgICAgZmxvYXQgaG9yaXogPSBnZXRQcmltYXJ5SG9yaXpvbnRhbChvZmZzZXQpOwotCi0gICAgICAgIGludCBiZXN0ID0gb2Zmc2V0OwotICAgICAgICBmbG9hdCBiZXN0aCA9IEludGVnZXIuTUlOX1ZBTFVFOwotICAgICAgICBpbnQgY2FuZGlkYXRlOwotCi0gICAgICAgIGNhbmRpZGF0ZSA9IFRleHRVdGlscy5nZXRPZmZzZXRCZWZvcmUobVRleHQsIG9mZnNldCk7Ci0gICAgICAgIGlmIChjYW5kaWRhdGUgPj0gc3RhcnQgJiYgY2FuZGlkYXRlIDw9IGVuZCkgewotICAgICAgICAgICAgZmxvYXQgaCA9IGdldFByaW1hcnlIb3Jpem9udGFsKGNhbmRpZGF0ZSk7Ci0KLSAgICAgICAgICAgIGlmIChoIDwgaG9yaXogJiYgaCA+IGJlc3RoKSB7Ci0gICAgICAgICAgICAgICAgYmVzdCA9IGNhbmRpZGF0ZTsKLSAgICAgICAgICAgICAgICBiZXN0aCA9IGg7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBjYW5kaWRhdGUgPSBUZXh0VXRpbHMuZ2V0T2Zmc2V0QWZ0ZXIobVRleHQsIG9mZnNldCk7Ci0gICAgICAgIGlmIChjYW5kaWRhdGUgPj0gc3RhcnQgJiYgY2FuZGlkYXRlIDw9IGVuZCkgewotICAgICAgICAgICAgZmxvYXQgaCA9IGdldFByaW1hcnlIb3Jpem9udGFsKGNhbmRpZGF0ZSk7Ci0KLSAgICAgICAgICAgIGlmIChoIDwgaG9yaXogJiYgaCA+IGJlc3RoKSB7Ci0gICAgICAgICAgICAgICAgYmVzdCA9IGNhbmRpZGF0ZTsKLSAgICAgICAgICAgICAgICBiZXN0aCA9IGg7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpbnQgaGVyZSA9IHN0YXJ0OwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGRpcnMubURpcmVjdGlvbnMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIGludCB0aGVyZSA9IGhlcmUgKyBkaXJzLm1EaXJlY3Rpb25zW2ldOwotICAgICAgICAgICAgaWYgKHRoZXJlID4gZW5kKQotICAgICAgICAgICAgICAgIHRoZXJlID0gZW5kOwotCi0gICAgICAgICAgICBmbG9hdCBoID0gZ2V0UHJpbWFyeUhvcml6b250YWwoaGVyZSk7Ci0KLSAgICAgICAgICAgIGlmIChoIDwgaG9yaXogJiYgaCA+IGJlc3RoKSB7Ci0gICAgICAgICAgICAgICAgYmVzdCA9IGhlcmU7Ci0gICAgICAgICAgICAgICAgYmVzdGggPSBoOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYW5kaWRhdGUgPSBUZXh0VXRpbHMuZ2V0T2Zmc2V0QWZ0ZXIobVRleHQsIGhlcmUpOwotICAgICAgICAgICAgaWYgKGNhbmRpZGF0ZSA+PSBzdGFydCAmJiBjYW5kaWRhdGUgPD0gZW5kKSB7Ci0gICAgICAgICAgICAgICAgaCA9IGdldFByaW1hcnlIb3Jpem9udGFsKGNhbmRpZGF0ZSk7Ci0KLSAgICAgICAgICAgICAgICBpZiAoaCA8IGhvcml6ICYmIGggPiBiZXN0aCkgewotICAgICAgICAgICAgICAgICAgICBiZXN0ID0gY2FuZGlkYXRlOwotICAgICAgICAgICAgICAgICAgICBiZXN0aCA9IGg7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYW5kaWRhdGUgPSBUZXh0VXRpbHMuZ2V0T2Zmc2V0QmVmb3JlKG1UZXh0LCB0aGVyZSk7Ci0gICAgICAgICAgICBpZiAoY2FuZGlkYXRlID49IHN0YXJ0ICYmIGNhbmRpZGF0ZSA8PSBlbmQpIHsKLSAgICAgICAgICAgICAgICBoID0gZ2V0UHJpbWFyeUhvcml6b250YWwoY2FuZGlkYXRlKTsKLQotICAgICAgICAgICAgICAgIGlmIChoIDwgaG9yaXogJiYgaCA+IGJlc3RoKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJlc3QgPSBjYW5kaWRhdGU7Ci0gICAgICAgICAgICAgICAgICAgIGJlc3RoID0gaDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGhlcmUgPSB0aGVyZTsKLSAgICAgICAgfQotCi0gICAgICAgIGZsb2F0IGggPSBnZXRQcmltYXJ5SG9yaXpvbnRhbChlbmQpOwotCi0gICAgICAgIGlmIChoIDwgaG9yaXogJiYgaCA+IGJlc3RoKSB7Ci0gICAgICAgICAgICBiZXN0ID0gZW5kOwotICAgICAgICAgICAgYmVzdGggPSBoOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGJlc3QgIT0gb2Zmc2V0KQotICAgICAgICAgICAgcmV0dXJuIGJlc3Q7Ci0KLSAgICAgICAgaW50IGRpciA9IGdldFBhcmFncmFwaERpcmVjdGlvbihsaW5lKTsKLQotICAgICAgICBpZiAoZGlyID4gMCkgewotICAgICAgICAgICAgaWYgKGxpbmUgPT0gMCkKLSAgICAgICAgICAgICAgICByZXR1cm4gYmVzdDsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICByZXR1cm4gZ2V0T2Zmc2V0Rm9ySG9yaXpvbnRhbChsaW5lIC0gMSwgMTAwMDApOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaWYgKGxpbmUgPT0gZ2V0TGluZUNvdW50KCkgLSAxKQotICAgICAgICAgICAgICAgIHJldHVybiBiZXN0OwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHJldHVybiBnZXRPZmZzZXRGb3JIb3Jpem9udGFsKGxpbmUgKyAxLCAxMDAwMCk7Ci0gICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGdldE9mZnNldFRvTGVmdFJpZ2h0T2Yob2Zmc2V0LCB0cnVlKTsKICAgICB9CiAKLSAgICAvKioKLSAgICAgKiBSZXR1cm4gdGhlIHRleHQgb2Zmc2V0IHRoYXQgd291bGQgYmUgcmVhY2hlZCBieSBtb3ZpbmcgcmlnaHQKLSAgICAgKiAocG9zc2libHkgb250byBhbm90aGVyIGxpbmUpIGZyb20gdGhlIHNwZWNpZmllZCBvZmZzZXQuCi0gICAgICovCiAgICAgcHVibGljIGludCBnZXRPZmZzZXRUb1JpZ2h0T2YoaW50IG9mZnNldCkgewotICAgICAgICBpbnQgbGluZSA9IGdldExpbmVGb3JPZmZzZXQob2Zmc2V0KTsKLSAgICAgICAgaW50IHN0YXJ0ID0gZ2V0TGluZVN0YXJ0KGxpbmUpOwotICAgICAgICBpbnQgZW5kID0gZ2V0TGluZUVuZChsaW5lKTsKLSAgICAgICAgRGlyZWN0aW9ucyBkaXJzID0gZ2V0TGluZURpcmVjdGlvbnMobGluZSk7CisgICAgICAgIHJldHVybiBnZXRPZmZzZXRUb0xlZnRSaWdodE9mKG9mZnNldCwgZmFsc2UpOworICAgIH0KIAotICAgICAgICBpZiAobGluZSAhPSBnZXRMaW5lQ291bnQoKSAtIDEpCi0gICAgICAgICAgICBlbmQgPSBUZXh0VXRpbHMuZ2V0T2Zmc2V0QmVmb3JlKG1UZXh0LCBlbmQpOworICAgIHByaXZhdGUgaW50IGdldE9mZnNldFRvTGVmdFJpZ2h0T2YoaW50IGNhcmV0LCBib29sZWFuIHRvTGVmdCkgeworICAgICAgICBpbnQgbGluZSA9IGdldExpbmVGb3JPZmZzZXQoY2FyZXQpOworICAgICAgICBpbnQgbGluZVN0YXJ0ID0gZ2V0TGluZVN0YXJ0KGxpbmUpOworICAgICAgICBpbnQgbGluZUVuZCA9IGdldExpbmVFbmQobGluZSk7CisgICAgICAgIGludCBsaW5lRGlyID0gZ2V0UGFyYWdyYXBoRGlyZWN0aW9uKGxpbmUpOwogCi0gICAgICAgIGZsb2F0IGhvcml6ID0gZ2V0UHJpbWFyeUhvcml6b250YWwob2Zmc2V0KTsKLQotICAgICAgICBpbnQgYmVzdCA9IG9mZnNldDsKLSAgICAgICAgZmxvYXQgYmVzdGggPSBJbnRlZ2VyLk1BWF9WQUxVRTsKLSAgICAgICAgaW50IGNhbmRpZGF0ZTsKLQotICAgICAgICBjYW5kaWRhdGUgPSBUZXh0VXRpbHMuZ2V0T2Zmc2V0QmVmb3JlKG1UZXh0LCBvZmZzZXQpOwotICAgICAgICBpZiAoY2FuZGlkYXRlID49IHN0YXJ0ICYmIGNhbmRpZGF0ZSA8PSBlbmQpIHsKLSAgICAgICAgICAgIGZsb2F0IGggPSBnZXRQcmltYXJ5SG9yaXpvbnRhbChjYW5kaWRhdGUpOwotCi0gICAgICAgICAgICBpZiAoaCA+IGhvcml6ICYmIGggPCBiZXN0aCkgewotICAgICAgICAgICAgICAgIGJlc3QgPSBjYW5kaWRhdGU7Ci0gICAgICAgICAgICAgICAgYmVzdGggPSBoOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgY2FuZGlkYXRlID0gVGV4dFV0aWxzLmdldE9mZnNldEFmdGVyKG1UZXh0LCBvZmZzZXQpOwotICAgICAgICBpZiAoY2FuZGlkYXRlID49IHN0YXJ0ICYmIGNhbmRpZGF0ZSA8PSBlbmQpIHsKLSAgICAgICAgICAgIGZsb2F0IGggPSBnZXRQcmltYXJ5SG9yaXpvbnRhbChjYW5kaWRhdGUpOwotCi0gICAgICAgICAgICBpZiAoaCA+IGhvcml6ICYmIGggPCBiZXN0aCkgewotICAgICAgICAgICAgICAgIGJlc3QgPSBjYW5kaWRhdGU7Ci0gICAgICAgICAgICAgICAgYmVzdGggPSBoOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaW50IGhlcmUgPSBzdGFydDsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBkaXJzLm1EaXJlY3Rpb25zLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBpbnQgdGhlcmUgPSBoZXJlICsgZGlycy5tRGlyZWN0aW9uc1tpXTsKLSAgICAgICAgICAgIGlmICh0aGVyZSA+IGVuZCkKLSAgICAgICAgICAgICAgICB0aGVyZSA9IGVuZDsKLQotICAgICAgICAgICAgZmxvYXQgaCA9IGdldFByaW1hcnlIb3Jpem9udGFsKGhlcmUpOwotCi0gICAgICAgICAgICBpZiAoaCA+IGhvcml6ICYmIGggPCBiZXN0aCkgewotICAgICAgICAgICAgICAgIGJlc3QgPSBoZXJlOwotICAgICAgICAgICAgICAgIGJlc3RoID0gaDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FuZGlkYXRlID0gVGV4dFV0aWxzLmdldE9mZnNldEFmdGVyKG1UZXh0LCBoZXJlKTsKLSAgICAgICAgICAgIGlmIChjYW5kaWRhdGUgPj0gc3RhcnQgJiYgY2FuZGlkYXRlIDw9IGVuZCkgewotICAgICAgICAgICAgICAgIGggPSBnZXRQcmltYXJ5SG9yaXpvbnRhbChjYW5kaWRhdGUpOwotCi0gICAgICAgICAgICAgICAgaWYgKGggPiBob3JpeiAmJiBoIDwgYmVzdGgpIHsKLSAgICAgICAgICAgICAgICAgICAgYmVzdCA9IGNhbmRpZGF0ZTsKLSAgICAgICAgICAgICAgICAgICAgYmVzdGggPSBoOworICAgICAgICBib29sZWFuIGFkdmFuY2UgPSB0b0xlZnQgPT0gKGxpbmVEaXIgPT0gRElSX1JJR0hUX1RPX0xFRlQpOworICAgICAgICBpZiAoY2FyZXQgPT0gKGFkdmFuY2UgPyBsaW5lRW5kIDogbGluZVN0YXJ0KSkgeworICAgICAgICAgICAgLy8gd2Fsa2luZyBvZmYgbGluZSwgc28gbG9vayBhdCB0aGUgbGluZSB3ZSdyZSBoZWFkZWQgdG8KKyAgICAgICAgICAgIGlmIChjYXJldCA9PSBsaW5lU3RhcnQpIHsKKyAgICAgICAgICAgICAgICBpZiAobGluZSA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgLS1saW5lOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBjYXJldDsgLy8gYXQgdmVyeSBzdGFydCwgZG9uJ3QgbW92ZQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaWYgKGxpbmUgPCBnZXRMaW5lQ291bnQoKSAtIDEpIHsKKyAgICAgICAgICAgICAgICAgICAgKytsaW5lOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBjYXJldDsgLy8gYXQgdmVyeSBlbmQsIGRvbid0IG1vdmUKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIGNhbmRpZGF0ZSA9IFRleHRVdGlscy5nZXRPZmZzZXRCZWZvcmUobVRleHQsIHRoZXJlKTsKLSAgICAgICAgICAgIGlmIChjYW5kaWRhdGUgPj0gc3RhcnQgJiYgY2FuZGlkYXRlIDw9IGVuZCkgewotICAgICAgICAgICAgICAgIGggPSBnZXRQcmltYXJ5SG9yaXpvbnRhbChjYW5kaWRhdGUpOwotCi0gICAgICAgICAgICAgICAgaWYgKGggPiBob3JpeiAmJiBoIDwgYmVzdGgpIHsKLSAgICAgICAgICAgICAgICAgICAgYmVzdCA9IGNhbmRpZGF0ZTsKLSAgICAgICAgICAgICAgICAgICAgYmVzdGggPSBoOwotICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGxpbmVTdGFydCA9IGdldExpbmVTdGFydChsaW5lKTsKKyAgICAgICAgICAgIGxpbmVFbmQgPSBnZXRMaW5lRW5kKGxpbmUpOworICAgICAgICAgICAgaW50IG5ld0RpciA9IGdldFBhcmFncmFwaERpcmVjdGlvbihsaW5lKTsKKyAgICAgICAgICAgIGlmIChuZXdEaXIgIT0gbGluZURpcikgeworICAgICAgICAgICAgICAgIC8vIHVudXN1YWwgY2FzZS4gIHdlIHdhbnQgdG8gd2FsayBvbnRvIHRoZSBsaW5lLCBidXQgaXQgcnVucworICAgICAgICAgICAgICAgIC8vIGluIGEgZGlmZmVyZW50IGRpcmVjdGlvbiB0aGFuIHRoaXMgb25lLCBzbyB3ZSBmYWtlIG1vdmVtZW50CisgICAgICAgICAgICAgICAgLy8gaW4gdGhlIG9wcG9zaXRlIGRpcmVjdGlvbi4KKyAgICAgICAgICAgICAgICB0b0xlZnQgPSAhdG9MZWZ0OworICAgICAgICAgICAgICAgIGxpbmVEaXIgPSBuZXdEaXI7CiAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGhlcmUgPSB0aGVyZTsKICAgICAgICAgfQogCi0gICAgICAgIGZsb2F0IGggPSBnZXRQcmltYXJ5SG9yaXpvbnRhbChlbmQpOworICAgICAgICBEaXJlY3Rpb25zIGRpcmVjdGlvbnMgPSBnZXRMaW5lRGlyZWN0aW9ucyhsaW5lKTsKIAotICAgICAgICBpZiAoaCA+IGhvcml6ICYmIGggPCBiZXN0aCkgewotICAgICAgICAgICAgYmVzdCA9IGVuZDsKLSAgICAgICAgICAgIGJlc3RoID0gaDsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChiZXN0ICE9IG9mZnNldCkKLSAgICAgICAgICAgIHJldHVybiBiZXN0OwotCi0gICAgICAgIGludCBkaXIgPSBnZXRQYXJhZ3JhcGhEaXJlY3Rpb24obGluZSk7Ci0KLSAgICAgICAgaWYgKGRpciA+IDApIHsKLSAgICAgICAgICAgIGlmIChsaW5lID09IGdldExpbmVDb3VudCgpIC0gMSkKLSAgICAgICAgICAgICAgICByZXR1cm4gYmVzdDsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICByZXR1cm4gZ2V0T2Zmc2V0Rm9ySG9yaXpvbnRhbChsaW5lICsgMSwgLTEwMDAwKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGlmIChsaW5lID09IDApCi0gICAgICAgICAgICAgICAgcmV0dXJuIGJlc3Q7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgcmV0dXJuIGdldE9mZnNldEZvckhvcml6b250YWwobGluZSAtIDEsIC0xMDAwMCk7Ci0gICAgICAgIH0KKyAgICAgICAgVGV4dExpbmUgdGwgPSBUZXh0TGluZS5vYnRhaW4oKTsKKyAgICAgICAgLy8gWFhYOiB3ZSBkb24ndCBjYXJlIGFib3V0IHRhYnMKKyAgICAgICAgdGwuc2V0KG1QYWludCwgbVRleHQsIGxpbmVTdGFydCwgbGluZUVuZCwgbGluZURpciwgZGlyZWN0aW9ucywgZmFsc2UsIG51bGwpOworICAgICAgICBjYXJldCA9IGxpbmVTdGFydCArIHRsLmdldE9mZnNldFRvTGVmdFJpZ2h0T2YoY2FyZXQgLSBsaW5lU3RhcnQsIHRvTGVmdCk7CisgICAgICAgIHRsID0gVGV4dExpbmUucmVjeWNsZSh0bCk7CisgICAgICAgIHJldHVybiBjYXJldDsKICAgICB9CiAKICAgICBwcml2YXRlIGludCBnZXRPZmZzZXRBdFN0YXJ0T2YoaW50IG9mZnNldCkgeworICAgICAgICAvLyBYWFggdGhpcyBwcm9iYWJseSBzaG91bGQgc2tpcCBsb2NhbCByZW9yZGVyaW5ncyBhbmQKKyAgICAgICAgLy8gemVyby13aWR0aCBjaGFyYWN0ZXJzLCBsb29rIGF0IGNhbGxlcnMKICAgICAgICAgaWYgKG9mZnNldCA9PSAwKQogICAgICAgICAgICAgcmV0dXJuIDA7CiAKQEAgLTExMTgsNyArMTEzMCw3IEBACiAgICAgLyoqCiAgICAgICogRmlsbHMgaW4gdGhlIHNwZWNpZmllZCBQYXRoIHdpdGggYSByZXByZXNlbnRhdGlvbiBvZiBhIGN1cnNvcgogICAgICAqIGF0IHRoZSBzcGVjaWZpZWQgb2Zmc2V0LiAgVGhpcyB3aWxsIG9mdGVuIGJlIGEgdmVydGljYWwgbGluZQotICAgICAqIGJ1dCBjYW4gYmUgbXVsdGlwbGUgZGlzY29udGlub3VzIGxpbmVzIGluIHRleHQgd2l0aCBtdWx0aXBsZQorICAgICAqIGJ1dCBjYW4gYmUgbXVsdGlwbGUgZGlzY29udGludW91cyBsaW5lcyBpbiB0ZXh0IHdpdGggbXVsdGlwbGUKICAgICAgKiBkaXJlY3Rpb25hbGl0aWVzLgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIGdldEN1cnNvclBhdGgoaW50IHBvaW50LCBQYXRoIGRlc3QsCkBAIC0xMTMwLDcgKzExNDIsOCBAQAogICAgICAgICBpbnQgYm90dG9tID0gZ2V0TGluZVRvcChsaW5lKzEpOwogCiAgICAgICAgIGZsb2F0IGgxID0gZ2V0UHJpbWFyeUhvcml6b250YWwocG9pbnQpIC0gMC41ZjsKLSAgICAgICAgZmxvYXQgaDIgPSBnZXRTZWNvbmRhcnlIb3Jpem9udGFsKHBvaW50KSAtIDAuNWY7CisgICAgICAgIGZsb2F0IGgyID0gaXNMZXZlbEJvdW5kYXJ5KHBvaW50KSA/CisgICAgICAgICAgICAgICAgICAgIGdldFNlY29uZGFyeUhvcml6b250YWwocG9pbnQpIC0gMC41ZiA6IGgxOwogCiAgICAgICAgIGludCBjYXBzID0gVGV4dEtleUxpc3RlbmVyLmdldE1ldGFTdGF0ZShlZGl0aW5nQnVmZmVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgS2V5RXZlbnQuTUVUQV9TSElGVF9PTikgfApAQCAtMTIwNyw5ICsxMjIwLDEwIEBACiAgICAgICAgIGlmIChsaW5lZW5kID4gbGluZXN0YXJ0ICYmIG1UZXh0LmNoYXJBdChsaW5lZW5kIC0gMSkgPT0gJ1xuJykKICAgICAgICAgICAgIGxpbmVlbmQtLTsKIAotICAgICAgICBpbnQgaGVyZSA9IGxpbmVzdGFydDsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBkaXJzLm1EaXJlY3Rpb25zLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBpbnQgdGhlcmUgPSBoZXJlICsgZGlycy5tRGlyZWN0aW9uc1tpXTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBkaXJzLm1EaXJlY3Rpb25zLmxlbmd0aDsgaSArPSAyKSB7CisgICAgICAgICAgICBpbnQgaGVyZSA9IGxpbmVzdGFydCArIGRpcnMubURpcmVjdGlvbnNbaV07CisgICAgICAgICAgICBpbnQgdGhlcmUgPSBoZXJlICsgKGRpcnMubURpcmVjdGlvbnNbaSsxXSAmIFJVTl9MRU5HVEhfTUFTSyk7CisKICAgICAgICAgICAgIGlmICh0aGVyZSA+IGxpbmVlbmQpCiAgICAgICAgICAgICAgICAgdGhlcmUgPSBsaW5lZW5kOwogCkBAIC0xMjE4LDE0ICsxMjMyLDEyIEBACiAgICAgICAgICAgICAgICAgaW50IGVuID0gTWF0aC5taW4oZW5kLCB0aGVyZSk7CiAKICAgICAgICAgICAgICAgICBpZiAoc3QgIT0gZW4pIHsKLSAgICAgICAgICAgICAgICAgICAgZmxvYXQgaDEgPSBnZXRIb3Jpem9udGFsKHN0LCBmYWxzZSwgZmFsc2UsIGxpbmUpOwotICAgICAgICAgICAgICAgICAgICBmbG9hdCBoMiA9IGdldEhvcml6b250YWwoZW4sIHRydWUsIGZhbHNlLCBsaW5lKTsKKyAgICAgICAgICAgICAgICAgICAgZmxvYXQgaDEgPSBnZXRIb3Jpem9udGFsKHN0LCBmYWxzZSwgbGluZSk7CisgICAgICAgICAgICAgICAgICAgIGZsb2F0IGgyID0gZ2V0SG9yaXpvbnRhbChlbiwgdHJ1ZSwgbGluZSk7CiAKICAgICAgICAgICAgICAgICAgICAgZGVzdC5hZGRSZWN0KGgxLCB0b3AsIGgyLCBib3R0b20sIFBhdGguRGlyZWN0aW9uLkNXKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGhlcmUgPSB0aGVyZTsKICAgICAgICAgfQogICAgIH0KIApAQCAtMTI2MCw3ICsxMjcyLDcgQEAKIAogICAgICAgICAgICAgYWRkU2VsZWN0aW9uKHN0YXJ0bGluZSwgc3RhcnQsIGdldExpbmVFbmQoc3RhcnRsaW5lKSwKICAgICAgICAgICAgICAgICAgICAgICAgICB0b3AsIGdldExpbmVCb3R0b20oc3RhcnRsaW5lKSwgZGVzdCk7Ci0gICAgICAgICAgICAKKwogICAgICAgICAgICAgaWYgKGdldFBhcmFncmFwaERpcmVjdGlvbihzdGFydGxpbmUpID09IERJUl9SSUdIVF9UT19MRUZUKQogICAgICAgICAgICAgICAgIGRlc3QuYWRkUmVjdChnZXRMaW5lTGVmdChzdGFydGxpbmUpLCB0b3AsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCBnZXRMaW5lQm90dG9tKHN0YXJ0bGluZSksIFBhdGguRGlyZWN0aW9uLkNXKTsKQEAgLTEyOTYsNyArMTMwOCw3IEBACiAKICAgICAgICAgaWYgKG1TcGFubmVkVGV4dCkgewogICAgICAgICAgICAgU3Bhbm5lZCBzcCA9IChTcGFubmVkKSBtVGV4dDsKLSAgICAgICAgICAgIEFsaWdubWVudFNwYW5bXSBzcGFucyA9IHNwLmdldFNwYW5zKGdldExpbmVTdGFydChsaW5lKSwKKyAgICAgICAgICAgIEFsaWdubWVudFNwYW5bXSBzcGFucyA9IGdldFBhcmFncmFwaFNwYW5zKHNwLCBnZXRMaW5lU3RhcnQobGluZSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRMaW5lRW5kKGxpbmUpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWxpZ25tZW50U3Bhbi5jbGFzcyk7CiAKQEAgLTEzMTMsNDIzICsxMzI1LDE3MyBAQAogICAgICAqIEdldCB0aGUgbGVmdCBlZGdlIG9mIHRoZSBzcGVjaWZpZWQgcGFyYWdyYXBoLCBpbnNldCBieSBsZWZ0IG1hcmdpbnMuCiAgICAgICovCiAgICAgcHVibGljIGZpbmFsIGludCBnZXRQYXJhZ3JhcGhMZWZ0KGludCBsaW5lKSB7Ci0gICAgICAgIGludCBkaXIgPSBnZXRQYXJhZ3JhcGhEaXJlY3Rpb24obGluZSk7Ci0KICAgICAgICAgaW50IGxlZnQgPSAwOwotCi0gICAgICAgIGJvb2xlYW4gcGFyID0gZmFsc2U7Ci0gICAgICAgIGludCBvZmYgPSBnZXRMaW5lU3RhcnQobGluZSk7Ci0gICAgICAgIGlmIChvZmYgPT0gMCB8fCBtVGV4dC5jaGFyQXQob2ZmIC0gMSkgPT0gJ1xuJykKLSAgICAgICAgICAgIHBhciA9IHRydWU7Ci0KLSAgICAgICAgaWYgKGRpciA9PSBESVJfTEVGVF9UT19SSUdIVCkgewotICAgICAgICAgICAgaWYgKG1TcGFubmVkVGV4dCkgewotICAgICAgICAgICAgICAgIFNwYW5uZWQgc3AgPSAoU3Bhbm5lZCkgbVRleHQ7Ci0gICAgICAgICAgICAgICAgTGVhZGluZ01hcmdpblNwYW5bXSBzcGFucyA9IHNwLmdldFNwYW5zKGdldExpbmVTdGFydChsaW5lKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0TGluZUVuZChsaW5lKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGVhZGluZ01hcmdpblNwYW4uY2xhc3MpOwotCi0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzcGFucy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgICAgICBib29sZWFuIG1hcmdpbiA9IHBhcjsKLSAgICAgICAgICAgICAgICAgICAgTGVhZGluZ01hcmdpblNwYW4gc3BhbiA9IHNwYW5zW2ldOwotICAgICAgICAgICAgICAgICAgICBpZiAoc3BhbiBpbnN0YW5jZW9mIExlYWRpbmdNYXJnaW5TcGFuLkxlYWRpbmdNYXJnaW5TcGFuMikgewotICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNvdW50ID0gKChMZWFkaW5nTWFyZ2luU3Bhbi5MZWFkaW5nTWFyZ2luU3BhbjIpc3BhbikuZ2V0TGVhZGluZ01hcmdpbkxpbmVDb3VudCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgbWFyZ2luID0gY291bnQgPj0gbGluZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBsZWZ0ICs9IHNwYW4uZ2V0TGVhZGluZ01hcmdpbihtYXJnaW4pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KKyAgICAgICAgaW50IGRpciA9IGdldFBhcmFncmFwaERpcmVjdGlvbihsaW5lKTsKKyAgICAgICAgaWYgKGRpciA9PSBESVJfUklHSFRfVE9fTEVGVCB8fCAhbVNwYW5uZWRUZXh0KSB7CisgICAgICAgICAgICByZXR1cm4gbGVmdDsgLy8gbGVhZGluZyBtYXJnaW4gaGFzIG5vIGltcGFjdCwgb3Igbm8gc3R5bGVzCiAgICAgICAgIH0KLQotICAgICAgICByZXR1cm4gbGVmdDsKKyAgICAgICAgcmV0dXJuIGdldFBhcmFncmFwaExlYWRpbmdNYXJnaW4obGluZSk7CiAgICAgfQogCiAgICAgLyoqCiAgICAgICogR2V0IHRoZSByaWdodCBlZGdlIG9mIHRoZSBzcGVjaWZpZWQgcGFyYWdyYXBoLCBpbnNldCBieSByaWdodCBtYXJnaW5zLgogICAgICAqLwogICAgIHB1YmxpYyBmaW5hbCBpbnQgZ2V0UGFyYWdyYXBoUmlnaHQoaW50IGxpbmUpIHsKLSAgICAgICAgaW50IGRpciA9IGdldFBhcmFncmFwaERpcmVjdGlvbihsaW5lKTsKLQogICAgICAgICBpbnQgcmlnaHQgPSBtV2lkdGg7Ci0KLSAgICAgICAgYm9vbGVhbiBwYXIgPSBmYWxzZTsKLSAgICAgICAgaW50IG9mZiA9IGdldExpbmVTdGFydChsaW5lKTsKLSAgICAgICAgaWYgKG9mZiA9PSAwIHx8IG1UZXh0LmNoYXJBdChvZmYgLSAxKSA9PSAnXG4nKQotICAgICAgICAgICAgcGFyID0gdHJ1ZTsKLQotCi0gICAgICAgIGlmIChkaXIgPT0gRElSX1JJR0hUX1RPX0xFRlQpIHsKLSAgICAgICAgICAgIGlmIChtU3Bhbm5lZFRleHQpIHsKLSAgICAgICAgICAgICAgICBTcGFubmVkIHNwID0gKFNwYW5uZWQpIG1UZXh0OwotICAgICAgICAgICAgICAgIExlYWRpbmdNYXJnaW5TcGFuW10gc3BhbnMgPSBzcC5nZXRTcGFucyhnZXRMaW5lU3RhcnQobGluZSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldExpbmVFbmQobGluZSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExlYWRpbmdNYXJnaW5TcGFuLmNsYXNzKTsKLQotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc3BhbnMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgcmlnaHQgLT0gc3BhbnNbaV0uZ2V0TGVhZGluZ01hcmdpbihwYXIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KKyAgICAgICAgaW50IGRpciA9IGdldFBhcmFncmFwaERpcmVjdGlvbihsaW5lKTsKKyAgICAgICAgaWYgKGRpciA9PSBESVJfTEVGVF9UT19SSUdIVCB8fCAhbVNwYW5uZWRUZXh0KSB7CisgICAgICAgICAgICByZXR1cm4gcmlnaHQ7IC8vIGxlYWRpbmcgbWFyZ2luIGhhcyBubyBpbXBhY3QsIG9yIG5vIHN0eWxlcwogICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHJpZ2h0OwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBkcmF3VGV4dChDYW52YXMgY2FudmFzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hhclNlcXVlbmNlIHRleHQsIGludCBzdGFydCwgaW50IGVuZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkaXIsIERpcmVjdGlvbnMgZGlyZWN0aW9ucywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHgsIGludCB0b3AsIGludCB5LCBpbnQgYm90dG9tLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGV4dFBhaW50IHBhaW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGV4dFBhaW50IHdvcmtQYWludCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gaGFzVGFicywgT2JqZWN0W10gcGFyc3BhbnMpIHsKLSAgICAgICAgY2hhcltdIGJ1ZjsKLSAgICAgICAgaWYgKCFoYXNUYWJzKSB7Ci0gICAgICAgICAgICBpZiAoZGlyZWN0aW9ucyA9PSBESVJTX0FMTF9MRUZUX1RPX1JJR0hUKSB7Ci0gICAgICAgICAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICAgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKERJUl9MRUZUX1RPX1JJR0hUID09IGRpcik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIFN0eWxlZC5kcmF3VGV4dChjYW52YXMsIHRleHQsIHN0YXJ0LCBlbmQsIGRpciwgZmFsc2UsIHgsIHRvcCwgeSwgYm90dG9tLCBwYWludCwgd29ya1BhaW50LCBmYWxzZSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnVmID0gbnVsbDsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGJ1ZiA9IFRleHRVdGlscy5vYnRhaW4oZW5kIC0gc3RhcnQpOwotICAgICAgICAgICAgVGV4dFV0aWxzLmdldENoYXJzKHRleHQsIHN0YXJ0LCBlbmQsIGJ1ZiwgMCk7Ci0gICAgICAgIH0KLQotICAgICAgICBmbG9hdCBoID0gMDsKLQotICAgICAgICBpbnQgaGVyZSA9IDA7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZGlyZWN0aW9ucy5tRGlyZWN0aW9ucy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgaW50IHRoZXJlID0gaGVyZSArIGRpcmVjdGlvbnMubURpcmVjdGlvbnNbaV07Ci0gICAgICAgICAgICBpZiAodGhlcmUgPiBlbmQgLSBzdGFydCkKLSAgICAgICAgICAgICAgICB0aGVyZSA9IGVuZCAtIHN0YXJ0OwotCi0gICAgICAgICAgICBpbnQgc2Vnc3RhcnQgPSBoZXJlOwotICAgICAgICAgICAgZm9yIChpbnQgaiA9IGhhc1RhYnMgPyBoZXJlIDogdGhlcmU7IGogPD0gdGhlcmU7IGorKykgewotICAgICAgICAgICAgICAgIGlmIChqID09IHRoZXJlIHx8IGJ1ZltqXSA9PSAnXHQnKSB7Ci0gICAgICAgICAgICAgICAgICAgIGggKz0gU3R5bGVkLmRyYXdUZXh0KGNhbnZhcywgdGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnQgKyBzZWdzdGFydCwgc3RhcnQgKyBqLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXIsIChpICYgMSkgIT0gMCwgeCArIGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvcCwgeSwgYm90dG9tLCBwYWludCwgd29ya1BhaW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydCArIGogIT0gZW5kKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiAoaiAhPSB0aGVyZSAmJiBidWZbal0gPT0gJ1x0JykKLSAgICAgICAgICAgICAgICAgICAgICAgIGggPSBkaXIgKiBuZXh0VGFiKHRleHQsIHN0YXJ0LCBlbmQsIGggKiBkaXIsIHBhcnNwYW5zKTsKLQotICAgICAgICAgICAgICAgICAgICBzZWdzdGFydCA9IGogKyAxOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoaGFzVGFicyAmJiBidWZbal0gPj0gMHhEODAwICYmIGJ1ZltqXSA8PSAweERGRkYgJiYgaiArIDEgPCB0aGVyZSkgewotICAgICAgICAgICAgICAgICAgICBpbnQgZW1vamkgPSBDaGFyYWN0ZXIuY29kZVBvaW50QXQoYnVmLCBqKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiAoZW1vamkgPj0gTUlOX0VNT0pJICYmIGVtb2ppIDw9IE1BWF9FTU9KSSkgewotICAgICAgICAgICAgICAgICAgICAgICAgQml0bWFwIGJtID0gRU1PSklfRkFDVE9SWS4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRCaXRtYXBGcm9tQW5kcm9pZFB1YShlbW9qaSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChibSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaCArPSBTdHlsZWQuZHJhd1RleHQoY2FudmFzLCB0ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0ICsgc2Vnc3RhcnQsIHN0YXJ0ICsgaiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXIsIChpICYgMSkgIT0gMCwgeCArIGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9wLCB5LCBib3R0b20sIHBhaW50LCB3b3JrUGFpbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnQgKyBqICE9IGVuZCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobUVtb2ppUmVjdCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1FbW9qaVJlY3QgPSBuZXcgUmVjdEYoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JrUGFpbnQuc2V0KHBhaW50KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHlsZWQubWVhc3VyZVRleHQocGFpbnQsIHdvcmtQYWludCwgdGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnQgKyBqLCBzdGFydCArIGogKyAxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBiaXRtYXBIZWlnaHQgPSBibS5nZXRIZWlnaHQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCB0ZXh0SGVpZ2h0ID0gLXdvcmtQYWludC5hc2NlbnQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBzY2FsZSA9IHRleHRIZWlnaHQgLyBiaXRtYXBIZWlnaHQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgd2lkdGggPSBibS5nZXRXaWR0aCgpICogc2NhbGU7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtRW1vamlSZWN0LnNldCh4ICsgaCwgeSAtIHRleHRIZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeCArIGggKyB3aWR0aCwgeSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYW52YXMuZHJhd0JpdG1hcChibSwgbnVsbCwgbUVtb2ppUmVjdCwgcGFpbnQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGggKz0gd2lkdGg7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBqKys7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vnc3RhcnQgPSBqICsgMTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaGVyZSA9IHRoZXJlOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGhhc1RhYnMpCi0gICAgICAgICAgICBUZXh0VXRpbHMucmVjeWNsZShidWYpOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGZsb2F0IG1lYXN1cmVUZXh0KFRleHRQYWludCBwYWludCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUZXh0UGFpbnQgd29ya1BhaW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENoYXJTZXF1ZW5jZSB0ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdGFydCwgaW50IG9mZnNldCwgaW50IGVuZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGlyLCBEaXJlY3Rpb25zIGRpcmVjdGlvbnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiB0cmFpbGluZywgYm9vbGVhbiBhbHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBoYXNUYWJzLCBPYmplY3RbXSB0YWJzKSB7Ci0gICAgICAgIGNoYXJbXSBidWYgPSBudWxsOwotCi0gICAgICAgIGlmIChoYXNUYWJzKSB7Ci0gICAgICAgICAgICBidWYgPSBUZXh0VXRpbHMub2J0YWluKGVuZCAtIHN0YXJ0KTsKLSAgICAgICAgICAgIFRleHRVdGlscy5nZXRDaGFycyh0ZXh0LCBzdGFydCwgZW5kLCBidWYsIDApOwotICAgICAgICB9Ci0KLSAgICAgICAgZmxvYXQgaCA9IDA7Ci0KLSAgICAgICAgaWYgKGFsdCkgewotICAgICAgICAgICAgaWYgKGRpciA9PSBESVJfUklHSFRfVE9fTEVGVCkKLSAgICAgICAgICAgICAgICB0cmFpbGluZyA9ICF0cmFpbGluZzsKLSAgICAgICAgfQotCi0gICAgICAgIGludCBoZXJlID0gMDsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBkaXJlY3Rpb25zLm1EaXJlY3Rpb25zLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBpZiAoYWx0KQotICAgICAgICAgICAgICAgIHRyYWlsaW5nID0gIXRyYWlsaW5nOwotCi0gICAgICAgICAgICBpbnQgdGhlcmUgPSBoZXJlICsgZGlyZWN0aW9ucy5tRGlyZWN0aW9uc1tpXTsKLSAgICAgICAgICAgIGlmICh0aGVyZSA+IGVuZCAtIHN0YXJ0KQotICAgICAgICAgICAgICAgIHRoZXJlID0gZW5kIC0gc3RhcnQ7Ci0KLSAgICAgICAgICAgIGludCBzZWdzdGFydCA9IGhlcmU7Ci0gICAgICAgICAgICBmb3IgKGludCBqID0gaGFzVGFicyA/IGhlcmUgOiB0aGVyZTsgaiA8PSB0aGVyZTsgaisrKSB7Ci0gICAgICAgICAgICAgICAgaW50IGNvZGVwdCA9IDA7Ci0gICAgICAgICAgICAgICAgQml0bWFwIGJtID0gbnVsbDsKLQotICAgICAgICAgICAgICAgIGlmIChoYXNUYWJzICYmIGogPCB0aGVyZSkgewotICAgICAgICAgICAgICAgICAgICBjb2RlcHQgPSBidWZbal07Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKGNvZGVwdCA+PSAweEQ4MDAgJiYgY29kZXB0IDw9IDB4REZGRiAmJiBqICsgMSA8IHRoZXJlKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvZGVwdCA9IENoYXJhY3Rlci5jb2RlUG9pbnRBdChidWYsIGopOwotCi0gICAgICAgICAgICAgICAgICAgIGlmIChjb2RlcHQgPj0gTUlOX0VNT0pJICYmIGNvZGVwdCA8PSBNQVhfRU1PSkkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJtID0gRU1PSklfRkFDVE9SWS5nZXRCaXRtYXBGcm9tQW5kcm9pZFB1YShjb2RlcHQpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKGogPT0gdGhlcmUgfHwgY29kZXB0ID09ICdcdCcgfHwgYm0gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBmbG9hdCBzZWd3OwotCi0gICAgICAgICAgICAgICAgICAgIGlmIChvZmZzZXQgPCBzdGFydCArIGogfHwKLSAgICAgICAgICAgICAgICAgICAgICAgKHRyYWlsaW5nICYmIG9mZnNldCA8PSBzdGFydCArIGopKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGlyID09IERJUl9MRUZUX1RPX1JJR0hUICYmIChpICYgMSkgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGggKz0gU3R5bGVkLm1lYXN1cmVUZXh0KHBhaW50LCB3b3JrUGFpbnQsIHRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnQgKyBzZWdzdGFydCwgb2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBoOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGlyID09IERJUl9SSUdIVF9UT19MRUZUICYmIChpICYgMSkgIT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGggLT0gU3R5bGVkLm1lYXN1cmVUZXh0KHBhaW50LCB3b3JrUGFpbnQsIHRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnQgKyBzZWdzdGFydCwgb2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBoOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgc2VndyA9IFN0eWxlZC5tZWFzdXJlVGV4dChwYWludCwgd29ya1BhaW50LCB0ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0ICsgc2Vnc3RhcnQsIHN0YXJ0ICsgaiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiAob2Zmc2V0IDwgc3RhcnQgKyBqIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAodHJhaWxpbmcgJiYgb2Zmc2V0IDw9IHN0YXJ0ICsgaikpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkaXIgPT0gRElSX0xFRlRfVE9fUklHSFQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBoICs9IHNlZ3cgLSBTdHlsZWQubWVhc3VyZVRleHQocGFpbnQsIHdvcmtQYWludCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnQgKyBzZWdzdGFydCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0LCBudWxsKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaDsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRpciA9PSBESVJfUklHSFRfVE9fTEVGVCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGggLT0gc2VndyAtIFN0eWxlZC5tZWFzdXJlVGV4dChwYWludCwgd29ya1BhaW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydCArIHNlZ3N0YXJ0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQsIG51bGwpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBoOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGRpciA9PSBESVJfUklHSFRfVE9fTEVGVCkKLSAgICAgICAgICAgICAgICAgICAgICAgIGggLT0gc2VndzsKLSAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgaCArPSBzZWd3OwotCi0gICAgICAgICAgICAgICAgICAgIGlmIChqICE9IHRoZXJlICYmIGJ1ZltqXSA9PSAnXHQnKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAob2Zmc2V0ID09IHN0YXJ0ICsgaikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaDsKLQotICAgICAgICAgICAgICAgICAgICAgICAgaCA9IGRpciAqIG5leHRUYWIodGV4dCwgc3RhcnQsIGVuZCwgaCAqIGRpciwgdGFicyk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBpZiAoaiAhPSB0aGVyZSAmJiBibSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAob2Zmc2V0ID09IHN0YXJ0ICsgaikgcmV0dXJuIGg7Ci0gICAgICAgICAgICAgICAgICAgICAgICB3b3JrUGFpbnQuc2V0KHBhaW50KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIFN0eWxlZC5tZWFzdXJlVGV4dChwYWludCwgd29ya1BhaW50LCB0ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGosIGogKyAyLCBudWxsKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgd2lkID0gKGZsb2F0KSBibS5nZXRXaWR0aCgpICoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC13b3JrUGFpbnQuYXNjZW50KCkgLyBibS5nZXRIZWlnaHQoKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRpciA9PSBESVJfUklHSFRfVE9fTEVGVCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGggLT0gd2lkOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBoICs9IHdpZDsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgaisrOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgc2Vnc3RhcnQgPSBqICsgMTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGhlcmUgPSB0aGVyZTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChoYXNUYWJzKQotICAgICAgICAgICAgVGV4dFV0aWxzLnJlY3ljbGUoYnVmKTsKLQotICAgICAgICByZXR1cm4gaDsKKyAgICAgICAgcmV0dXJuIHJpZ2h0IC0gZ2V0UGFyYWdyYXBoTGVhZGluZ01hcmdpbihsaW5lKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBNZWFzdXJlIHdpZHRoIG9mIGEgcnVuIG9mIHRleHQgb24gYSBzaW5nbGUgbGluZSB0aGF0IGlzIGtub3duIHRvIGFsbCBiZQotICAgICAqIGluIHRoZSBzYW1lIGRpcmVjdGlvbiBhcyB0aGUgcGFyYWdyYXBoIGJhc2UgZGlyZWN0aW9uLiBSZXR1cm5zIHRoZSB3aWR0aCwKLSAgICAgKiBhbmQgdGhlIGxpbmUgbWV0cmljcyBpbiBmbSBpZiBmbSBpcyBub3QgbnVsbC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBwYWludCB0aGUgcGFpbnQgZm9yIHRoZSB0ZXh0OyB3aWxsIG5vdCBiZSBtb2RpZmllZAotICAgICAqIEBwYXJhbSB3b3JrUGFpbnQgcGFpbnQgYXZhaWxhYmxlIGZvciBtb2RpZmljYXRpb24KLSAgICAgKiBAcGFyYW0gdGV4dCB0ZXh0Ci0gICAgICogQHBhcmFtIHN0YXJ0IHN0YXJ0IG9mIHRoZSBsaW5lCi0gICAgICogQHBhcmFtIGVuZCBsaW1pdCBvZiB0aGUgbGluZQotICAgICAqIEBwYXJhbSBmbSBvYmplY3QgdG8gcmV0dXJuIGludGVnZXIgbWV0cmljcyBpbiwgY2FuIGJlIG51bGwKLSAgICAgKiBAcGFyYW0gaGFzVGFicyB0cnVlIGlmIGl0IGlzIGtub3duIHRoYXQgdGhlIGxpbmUgaGFzIHRhYnMKLSAgICAgKiBAcGFyYW0gdGFicyB0YWIgcG9zaXRpb24gaW5mb3JtYXRpb24KLSAgICAgKiBAcmV0dXJuIHRoZSB3aWR0aCBvZiB0aGUgdGV4dCBmcm9tIHN0YXJ0IHRvIGVuZAorICAgICAqIFJldHVybnMgdGhlIGVmZmVjdGl2ZSBsZWFkaW5nIG1hcmdpbiAodW5zaWduZWQpIGZvciB0aGlzIGxpbmUsCisgICAgICogdGFraW5nIGludG8gYWNjb3VudCBMZWFkaW5nTWFyZ2luU3BhbiBhbmQgTGVhZGluZ01hcmdpblNwYW4yLgorICAgICAqIEBwYXJhbSBsaW5lIHRoZSBsaW5lIGluZGV4CisgICAgICogQHJldHVybiB0aGUgbGVhZGluZyBtYXJnaW4gb2YgdGhpcyBsaW5lCiAgICAgICovCi0gICAgLyogcGFja2FnZSAqLyBzdGF0aWMgZmxvYXQgbWVhc3VyZVRleHQoVGV4dFBhaW50IHBhaW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRleHRQYWludCB3b3JrUGFpbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hhclNlcXVlbmNlIHRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0YXJ0LCBpbnQgZW5kLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhaW50LkZvbnRNZXRyaWNzSW50IGZtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gaGFzVGFicywgT2JqZWN0W10gdGFicykgewotICAgICAgICBjaGFyW10gYnVmID0gbnVsbDsKLSAgCi0gICAgICAgIGlmIChoYXNUYWJzKSB7Ci0gICAgICAgICAgICBidWYgPSBUZXh0VXRpbHMub2J0YWluKGVuZCAtIHN0YXJ0KTsKLSAgICAgICAgICAgIFRleHRVdGlscy5nZXRDaGFycyh0ZXh0LCBzdGFydCwgZW5kLCBidWYsIDApOworICAgIHByaXZhdGUgaW50IGdldFBhcmFncmFwaExlYWRpbmdNYXJnaW4oaW50IGxpbmUpIHsKKyAgICAgICAgaWYgKCFtU3Bhbm5lZFRleHQpIHsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgICAgIFNwYW5uZWQgc3Bhbm5lZCA9IChTcGFubmVkKSBtVGV4dDsKKworICAgICAgICBpbnQgbGluZVN0YXJ0ID0gZ2V0TGluZVN0YXJ0KGxpbmUpOworICAgICAgICBpbnQgbGluZUVuZCA9IGdldExpbmVFbmQobGluZSk7CisgICAgICAgIGludCBzcGFuRW5kID0gc3Bhbm5lZC5uZXh0U3BhblRyYW5zaXRpb24obGluZVN0YXJ0LCBsaW5lRW5kLAorICAgICAgICAgICAgICAgIExlYWRpbmdNYXJnaW5TcGFuLmNsYXNzKTsKKyAgICAgICAgTGVhZGluZ01hcmdpblNwYW5bXSBzcGFucyA9IGdldFBhcmFncmFwaFNwYW5zKHNwYW5uZWQsIGxpbmVTdGFydCwgc3BhbkVuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExlYWRpbmdNYXJnaW5TcGFuLmNsYXNzKTsKKyAgICAgICAgaWYgKHNwYW5zLmxlbmd0aCA9PSAwKSB7CisgICAgICAgICAgICByZXR1cm4gMDsgLy8gbm8gbGVhZGluZyBtYXJnaW4gc3BhbjsKICAgICAgICAgfQogCi0gICAgICAgIGludCBsZW4gPSBlbmQgLSBzdGFydDsKKyAgICAgICAgaW50IG1hcmdpbiA9IDA7CiAKLSAgICAgICAgaW50IGxhc3RQb3MgPSAwOwotICAgICAgICBmbG9hdCB3aWR0aCA9IDA7Ci0gICAgICAgIGludCBhc2NlbnQgPSAwLCBkZXNjZW50ID0gMCwgdG9wID0gMCwgYm90dG9tID0gMDsKKyAgICAgICAgYm9vbGVhbiBpc0ZpcnN0UGFyYUxpbmUgPSBsaW5lU3RhcnQgPT0gMCB8fAorICAgICAgICAgICAgc3Bhbm5lZC5jaGFyQXQobGluZVN0YXJ0IC0gMSkgPT0gJ1xuJzsKIAotICAgICAgICBpZiAoZm0gIT0gbnVsbCkgewotICAgICAgICAgICAgZm0uYXNjZW50ID0gMDsKLSAgICAgICAgICAgIGZtLmRlc2NlbnQgPSAwOwotICAgICAgICB9Ci0KLSAgICAgICAgZm9yIChpbnQgcG9zID0gaGFzVGFicyA/IDAgOiBsZW47IHBvcyA8PSBsZW47IHBvcysrKSB7Ci0gICAgICAgICAgICBpbnQgY29kZXB0ID0gMDsKLSAgICAgICAgICAgIEJpdG1hcCBibSA9IG51bGw7Ci0KLSAgICAgICAgICAgIGlmIChoYXNUYWJzICYmIHBvcyA8IGxlbikgewotICAgICAgICAgICAgICAgIGNvZGVwdCA9IGJ1Zltwb3NdOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNwYW5zLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBMZWFkaW5nTWFyZ2luU3BhbiBzcGFuID0gc3BhbnNbaV07CisgICAgICAgICAgICBib29sZWFuIHVzZUZpcnN0TGluZU1hcmdpbiA9IGlzRmlyc3RQYXJhTGluZTsKKyAgICAgICAgICAgIGlmIChzcGFuIGluc3RhbmNlb2YgTGVhZGluZ01hcmdpblNwYW4yKSB7CisgICAgICAgICAgICAgICAgaW50IHNwU3RhcnQgPSBzcGFubmVkLmdldFNwYW5TdGFydChzcGFuKTsKKyAgICAgICAgICAgICAgICBpbnQgc3BhbkxpbmUgPSBnZXRMaW5lRm9yT2Zmc2V0KHNwU3RhcnQpOworICAgICAgICAgICAgICAgIGludCBjb3VudCA9ICgoTGVhZGluZ01hcmdpblNwYW4yKXNwYW4pLmdldExlYWRpbmdNYXJnaW5MaW5lQ291bnQoKTsKKyAgICAgICAgICAgICAgICB1c2VGaXJzdExpbmVNYXJnaW4gPSBsaW5lIDwgc3BhbkxpbmUgKyBjb3VudDsKICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1hcmdpbiArPSBzcGFuLmdldExlYWRpbmdNYXJnaW4odXNlRmlyc3RMaW5lTWFyZ2luKTsKKyAgICAgICAgfQogCi0gICAgICAgICAgICBpZiAoY29kZXB0ID49IDB4RDgwMCAmJiBjb2RlcHQgPD0gMHhERkZGICYmIHBvcyA8IGxlbikgewotICAgICAgICAgICAgICAgIGNvZGVwdCA9IENoYXJhY3Rlci5jb2RlUG9pbnRBdChidWYsIHBvcyk7CisgICAgICAgIHJldHVybiBtYXJnaW47CisgICAgfQogCi0gICAgICAgICAgICAgICAgaWYgKGNvZGVwdCA+PSBNSU5fRU1PSkkgJiYgY29kZXB0IDw9IE1BWF9FTU9KSSkgewotICAgICAgICAgICAgICAgICAgICBibSA9IEVNT0pJX0ZBQ1RPUlkuZ2V0Qml0bWFwRnJvbUFuZHJvaWRQdWEoY29kZXB0KTsKKyAgICAvKiBwYWNrYWdlICovCisgICAgc3RhdGljIGZsb2F0IG1lYXN1cmVQYXJhKFRleHRQYWludCBwYWludCwgVGV4dFBhaW50IHdvcmtQYWludCwKKyAgICAgICAgICAgIENoYXJTZXF1ZW5jZSB0ZXh0LCBpbnQgc3RhcnQsIGludCBlbmQpIHsKKworICAgICAgICBNZWFzdXJlZFRleHQgbXQgPSBNZWFzdXJlZFRleHQub2J0YWluKCk7CisgICAgICAgIFRleHRMaW5lIHRsID0gVGV4dExpbmUub2J0YWluKCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBtdC5zZXRQYXJhKHRleHQsIHN0YXJ0LCBlbmQsIERJUl9SRVFVRVNUX0xUUik7CisgICAgICAgICAgICBEaXJlY3Rpb25zIGRpcmVjdGlvbnM7CisgICAgICAgICAgICBpbnQgZGlyOworICAgICAgICAgICAgaWYgKG10Lm1FYXN5KSB7CisgICAgICAgICAgICAgICAgZGlyZWN0aW9ucyA9IERJUlNfQUxMX0xFRlRfVE9fUklHSFQ7CisgICAgICAgICAgICAgICAgZGlyID0gTGF5b3V0LkRJUl9MRUZUX1RPX1JJR0hUOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBkaXJlY3Rpb25zID0gQW5kcm9pZEJpZGkuZGlyZWN0aW9ucyhtdC5tRGlyLCBtdC5tTGV2ZWxzLAorICAgICAgICAgICAgICAgICAgICAwLCBtdC5tQ2hhcnMsIDAsIG10Lm1MZW4pOworICAgICAgICAgICAgICAgIGRpciA9IG10Lm1EaXI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjaGFyW10gY2hhcnMgPSBtdC5tQ2hhcnM7CisgICAgICAgICAgICBpbnQgbGVuID0gbXQubUxlbjsKKyAgICAgICAgICAgIGJvb2xlYW4gaGFzVGFicyA9IGZhbHNlOworICAgICAgICAgICAgVGFiU3RvcHMgdGFiU3RvcHMgPSBudWxsOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW47ICsraSkgeworICAgICAgICAgICAgICAgIGlmIChjaGFyc1tpXSA9PSAnXHQnKSB7CisgICAgICAgICAgICAgICAgICAgIGhhc1RhYnMgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICBpZiAodGV4dCBpbnN0YW5jZW9mIFNwYW5uZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFNwYW5uZWQgc3Bhbm5lZCA9IChTcGFubmVkKSB0ZXh0OworICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNwYW5FbmQgPSBzcGFubmVkLm5leHRTcGFuVHJhbnNpdGlvbihzdGFydCwgZW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUYWJTdG9wU3Bhbi5jbGFzcyk7CisgICAgICAgICAgICAgICAgICAgICAgICBUYWJTdG9wU3BhbltdIHNwYW5zID0gZ2V0UGFyYWdyYXBoU3BhbnMoc3Bhbm5lZCwgc3RhcnQsIHNwYW5FbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRhYlN0b3BTcGFuLmNsYXNzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzcGFucy5sZW5ndGggPiAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFiU3RvcHMgPSBuZXcgVGFiU3RvcHMoVEFCX0lOQ1JFTUVOVCwgc3BhbnMpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRsLnNldChwYWludCwgdGV4dCwgc3RhcnQsIGVuZCwgZGlyLCBkaXJlY3Rpb25zLCBoYXNUYWJzLCB0YWJTdG9wcyk7CisgICAgICAgICAgICByZXR1cm4gdGwubWV0cmljcyhudWxsKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIFRleHRMaW5lLnJlY3ljbGUodGwpOworICAgICAgICAgICAgTWVhc3VyZWRUZXh0LnJlY3ljbGUobXQpOworICAgICAgICB9CisgICAgfQogCi0gICAgICAgICAgICBpZiAocG9zID09IGxlbiB8fCBjb2RlcHQgPT0gJ1x0JyB8fCBibSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgd29ya1BhaW50LmJhc2VsaW5lU2hpZnQgPSAwOworICAgIC8qKgorICAgICAqIEBoaWRlCisgICAgICovCisgICAgLyogcGFja2FnZSAqLyBzdGF0aWMgY2xhc3MgVGFiU3RvcHMgeworICAgICAgICBwcml2YXRlIGludFtdIG1TdG9wczsKKyAgICAgICAgcHJpdmF0ZSBpbnQgbU51bVN0b3BzOworICAgICAgICBwcml2YXRlIGludCBtSW5jcmVtZW50OwogCi0gICAgICAgICAgICAgICAgd2lkdGggKz0gU3R5bGVkLm1lYXN1cmVUZXh0KHBhaW50LCB3b3JrUGFpbnQsIHRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnQgKyBsYXN0UG9zLCBzdGFydCArIHBvcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbSk7CisgICAgICAgIFRhYlN0b3BzKGludCBpbmNyZW1lbnQsIE9iamVjdFtdIHNwYW5zKSB7CisgICAgICAgICAgICByZXNldChpbmNyZW1lbnQsIHNwYW5zKTsKKyAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgaWYgKGZtICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHdvcmtQYWludC5iYXNlbGluZVNoaWZ0IDwgMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgZm0uYXNjZW50ICs9IHdvcmtQYWludC5iYXNlbGluZVNoaWZ0OwotICAgICAgICAgICAgICAgICAgICAgICAgZm0udG9wICs9IHdvcmtQYWludC5iYXNlbGluZVNoaWZ0OwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgZm0uZGVzY2VudCArPSB3b3JrUGFpbnQuYmFzZWxpbmVTaGlmdDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZtLmJvdHRvbSArPSB3b3JrUGFpbnQuYmFzZWxpbmVTaGlmdDsKKyAgICAgICAgdm9pZCByZXNldChpbnQgaW5jcmVtZW50LCBPYmplY3RbXSBzcGFucykgeworICAgICAgICAgICAgdGhpcy5tSW5jcmVtZW50ID0gaW5jcmVtZW50OworCisgICAgICAgICAgICBpbnQgbnMgPSAwOworICAgICAgICAgICAgaWYgKHNwYW5zICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBpbnRbXSBzdG9wcyA9IHRoaXMubVN0b3BzOworICAgICAgICAgICAgICAgIGZvciAoT2JqZWN0IG8gOiBzcGFucykgeworICAgICAgICAgICAgICAgICAgICBpZiAobyBpbnN0YW5jZW9mIFRhYlN0b3BTcGFuKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RvcHMgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0b3BzID0gbmV3IGludFsxMF07CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG5zID09IHN0b3BzLmxlbmd0aCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludFtdIG5zdG9wcyA9IG5ldyBpbnRbbnMgKiAyXTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG5zOyArK2kpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnN0b3BzW2ldID0gc3RvcHNbaV07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0b3BzID0gbnN0b3BzOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgc3RvcHNbbnMrK10gPSAoKFRhYlN0b3BTcGFuKSBvKS5nZXRUYWJTdG9wKCk7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAocG9zICE9IGxlbikgewotICAgICAgICAgICAgICAgICAgICBpZiAoYm0gPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gbm8gZW1vamksIG11c3QgaGF2ZSBoaXQgYSB0YWIKLSAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoID0gbmV4dFRhYih0ZXh0LCBzdGFydCwgZW5kLCB3aWR0aCwgdGFicyk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGlzIHNldHMgdXAgd29ya1BhaW50IHdpdGggdGhlIGZvbnQgb24gdGhlIGVtb2ppCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyB0ZXh0LCBzbyB0aGF0IHdlIGNhbiBleHRyYWN0IHRoZSBhc2NlbnQgYW5kIHNjYWxlLgotCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBXZSBjYW4ndCB1c2UgdGhlIHJlc3VsdCBvZiB0aGUgcHJldmlvdXMgY2FsbCB0bwotICAgICAgICAgICAgICAgICAgICAgICAgLy8gbWVhc3VyZVRleHQgYmVjYXVzZSB0aGUgZW1vamkgbWlnaHQgaGF2ZSBpdHMgb3duIHN0eWxlLgotICAgICAgICAgICAgICAgICAgICAgICAgLy8gV2UgaGF2ZSB0byBpbml0aWFsaXplIHdvcmtQYWludCBoZXJlIGJlY2F1c2UgaWYgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyB0ZXh0IGlzIHVuc3R5bGVkIG1lYXN1cmVUZXh0IG1pZ2h0IG5vdCB1c2Ugd29ya1BhaW50Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBhdCBhbGwuCi0gICAgICAgICAgICAgICAgICAgICAgICB3b3JrUGFpbnQuc2V0KHBhaW50KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIFN0eWxlZC5tZWFzdXJlVGV4dChwYWludCwgd29ya1BhaW50LCB0ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0ICsgcG9zLCBzdGFydCArIHBvcyArIDEsIG51bGwpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICB3aWR0aCArPSAoZmxvYXQpIGJtLmdldFdpZHRoKCkgKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLXdvcmtQYWludC5hc2NlbnQoKSAvIGJtLmdldEhlaWdodCgpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBTaW5jZSB3ZSBoYWQgYW4gZW1vamksIHdlIGJ1bXAgcGFzdCB0aGUgc2Vjb25kIGhhbGYKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9mIHRoZSBzdXJyb2dhdGUgcGFpci4KLSAgICAgICAgICAgICAgICAgICAgICAgIHBvcysrOwotICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKG5zID4gMSkgeworICAgICAgICAgICAgICAgICAgICBBcnJheXMuc29ydChzdG9wcywgMCwgbnMpOwogICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChmbSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChmbS5hc2NlbnQgPCBhc2NlbnQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGFzY2VudCA9IGZtLmFzY2VudDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpZiAoZm0uZGVzY2VudCA+IGRlc2NlbnQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NlbnQgPSBmbS5kZXNjZW50OwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGZtLnRvcCA8IHRvcCkgewotICAgICAgICAgICAgICAgICAgICAgICAgdG9wID0gZm0udG9wOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGlmIChmbS5ib3R0b20gPiBib3R0b20pIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJvdHRvbSA9IGZtLmJvdHRvbTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIC8vIE5vIG5lZWQgdG8gdGFrZSBiaXRtYXAgaGVpZ2h0IGludG8gYWNjb3VudCBoZXJlLAotICAgICAgICAgICAgICAgICAgICAvLyBzaW5jZSBpdCBpcyBzY2FsZWQgdG8gbWF0Y2ggdGhlIHRleHQgaGVpZ2h0LgorICAgICAgICAgICAgICAgIGlmIChzdG9wcyAhPSB0aGlzLm1TdG9wcykgeworICAgICAgICAgICAgICAgICAgICB0aGlzLm1TdG9wcyA9IHN0b3BzOwogICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGxhc3RQb3MgPSBwb3MgKyAxOwogICAgICAgICAgICAgfQorICAgICAgICAgICAgdGhpcy5tTnVtU3RvcHMgPSBuczsKICAgICAgICAgfQogCi0gICAgICAgIGlmIChmbSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBmbS5hc2NlbnQgPSBhc2NlbnQ7Ci0gICAgICAgICAgICBmbS5kZXNjZW50ID0gZGVzY2VudDsKLSAgICAgICAgICAgIGZtLnRvcCA9IHRvcDsKLSAgICAgICAgICAgIGZtLmJvdHRvbSA9IGJvdHRvbTsKKyAgICAgICAgZmxvYXQgbmV4dFRhYihmbG9hdCBoKSB7CisgICAgICAgICAgICBpbnQgbnMgPSB0aGlzLm1OdW1TdG9wczsKKyAgICAgICAgICAgIGlmIChucyA+IDApIHsKKyAgICAgICAgICAgICAgICBpbnRbXSBzdG9wcyA9IHRoaXMubVN0b3BzOworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnM7ICsraSkgeworICAgICAgICAgICAgICAgICAgICBpbnQgc3RvcCA9IHN0b3BzW2ldOworICAgICAgICAgICAgICAgICAgICBpZiAoc3RvcCA+IGgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzdG9wOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIG5leHREZWZhdWx0U3RvcChoLCBtSW5jcmVtZW50KTsKICAgICAgICAgfQogCi0gICAgICAgIGlmIChoYXNUYWJzKQotICAgICAgICAgICAgVGV4dFV0aWxzLnJlY3ljbGUoYnVmKTsKLQotICAgICAgICByZXR1cm4gd2lkdGg7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmxvYXQgbmV4dERlZmF1bHRTdG9wKGZsb2F0IGgsIGludCBpbmMpIHsKKyAgICAgICAgICAgIHJldHVybiAoKGludCkgKChoICsgaW5jKSAvIGluYykpICogaW5jOworICAgICAgICB9CiAgICAgfQogCiAgICAgLyoqCkBAIC0xNzUxLDcgKzE1MTMsNyBAQAogCiAgICAgICAgIGlmICh0ZXh0IGluc3RhbmNlb2YgU3Bhbm5lZCkgewogICAgICAgICAgICAgaWYgKHRhYnMgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRhYnMgPSAoKFNwYW5uZWQpIHRleHQpLmdldFNwYW5zKHN0YXJ0LCBlbmQsIFRhYlN0b3BTcGFuLmNsYXNzKTsKKyAgICAgICAgICAgICAgICB0YWJzID0gZ2V0UGFyYWdyYXBoU3BhbnMoKFNwYW5uZWQpIHRleHQsIHN0YXJ0LCBlbmQsIFRhYlN0b3BTcGFuLmNsYXNzKTsKICAgICAgICAgICAgICAgICBhbGx0YWJzID0gdHJ1ZTsKICAgICAgICAgICAgIH0KIApAQCAtMTc3OCw2ICsxNTQwLDM4IEBACiAgICAgICAgIHJldHVybiBtU3Bhbm5lZFRleHQ7CiAgICAgfQogCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgc2FtZSBhcyA8Y29kZT50ZXh0LmdldFNwYW5zKCk8L2NvZGU+LCBleGNlcHQgd2hlcmUKKyAgICAgKiA8Y29kZT5zdGFydDwvY29kZT4gYW5kIDxjb2RlPmVuZDwvY29kZT4gYXJlIHRoZSBzYW1lIGFuZCBhcmUgbm90CisgICAgICogYXQgdGhlIHZlcnkgYmVnaW5uaW5nIG9mIHRoZSB0ZXh0LCBpbiB3aGljaCBjYXNlIGFuIGVtcHR5IGFycmF5CisgICAgICogaXMgcmV0dXJuZWQgaW5zdGVhZC4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGlzIGlzIG5lZWRlZCBiZWNhdXNlIG9mIHRoZSBzcGVjaWFsIGNhc2UgdGhhdCA8Y29kZT5nZXRTcGFucygpPC9jb2RlPgorICAgICAqIG9uIGFuIGVtcHR5IHJhbmdlIHJldHVybnMgdGhlIHNwYW5zIGFkamFjZW50IHRvIHRoYXQgcmFuZ2UsIHdoaWNoIGlzCisgICAgICogcHJpbWFyaWx5IGZvciB0aGUgc2FrZSBvZiA8Y29kZT5UZXh0V2F0Y2hlcnM8L2NvZGU+IHNvIHRoZXkgd2lsbCBnZXQKKyAgICAgKiBub3RpZmljYXRpb25zIHdoZW4gdGV4dCBnb2VzIGZyb20gZW1wdHkgdG8gbm9uLWVtcHR5LiAgQnV0IGl0IGFsc28KKyAgICAgKiBoYXMgdGhlIHVuZm9ydHVuYXRlIHNpZGUgZWZmZWN0IHRoYXQgaWYgdGhlIHRleHQgZW5kcyB3aXRoIGFuIGVtcHR5CisgICAgICogcGFyYWdyYXBoLCB0aGF0IHBhcmFncmFwaCBhY2NpZGVudGFsbHkgcGlja3MgdXAgdGhlIHN0eWxlcyBvZiB0aGUKKyAgICAgKiBwcmVjZWRpbmcgcGFyYWdyYXBoIChldmVuIHRob3VnaCB0aG9zZSBzdHlsZXMgd2lsbCBub3QgYmUgcGlja2VkIHVwCisgICAgICogYnkgbmV3IHRleHQgdGhhdCBpcyBpbnNlcnRlZCBpbnRvIHRoZSBlbXB0eSBwYXJhZ3JhcGgpLgorICAgICAqIDxwPgorICAgICAqIFRoZSByZWFzb24gaXQganVzdCBjaGVja3Mgd2hldGhlciA8Y29kZT5zdGFydDwvY29kZT4gYW5kIDxjb2RlPmVuZDwvY29kZT4KKyAgICAgKiBpcyB0aGUgc2FtZSBpcyB0aGF0IHRoZSBvbmx5IHRpbWUgYSBsaW5lIGNhbiBjb250YWluIDAgY2hhcmFjdGVycworICAgICAqIGlzIGlmIGl0IGlzIHRoZSBmaW5hbCBwYXJhZ3JhcGggb2YgdGhlIExheW91dDsgb3RoZXJ3aXNlIGFueSBsaW5lIHdpbGwKKyAgICAgKiBjb250YWluIGF0IGxlYXN0IG9uZSBwcmludGluZyBvciBuZXdsaW5lIGNoYXJhY3Rlci4gIFRoZSByZWFzb24gZm9yIHRoZQorICAgICAqIGFkZGl0aW9uYWwgY2hlY2sgaWYgPGNvZGU+c3RhcnQ8L2NvZGU+IGlzIGdyZWF0ZXIgdGhhbiAwIGlzIHRoYXQKKyAgICAgKiBpZiB0aGUgZW1wdHkgcGFyYWdyYXBoIGlzIHRoZSBlbnRpcmUgY29udGVudCBvZiB0aGUgYnVmZmVyLCBwYXJhZ3JhcGgKKyAgICAgKiBzdHlsZXMgdGhhdCBhcmUgYWxyZWFkeSBhcHBsaWVkIHRvIHRoZSBidWZmZXIgd2lsbCBhcHBseSB0byB0ZXh0IHRoYXQKKyAgICAgKiBpcyBpbnNlcnRlZCBpbnRvIGl0LgorICAgICAqLworICAgIC8qIHBhY2thZ2UgKi8gc3RhdGljIDxUPiBUW10gZ2V0UGFyYWdyYXBoU3BhbnMoU3Bhbm5lZCB0ZXh0LCBpbnQgc3RhcnQsIGludCBlbmQsIENsYXNzPFQ+IHR5cGUpIHsKKyAgICAgICAgaWYgKHN0YXJ0ID09IGVuZCAmJiBzdGFydCA+IDApIHsKKyAgICAgICAgICAgIHJldHVybiAoVFtdKSBBcnJheVV0aWxzLmVtcHR5QXJyYXkodHlwZSk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gdGV4dC5nZXRTcGFucyhzdGFydCwgZW5kLCB0eXBlKTsKKyAgICB9CisKICAgICBwcml2YXRlIHZvaWQgZWxsaXBzaXplKGludCBzdGFydCwgaW50IGVuZCwgaW50IGxpbmUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyW10gZGVzdCwgaW50IGRlc3RvZmYpIHsKICAgICAgICAgaW50IGVsbGlwc2lzQ291bnQgPSBnZXRFbGxpcHNpc0NvdW50KGxpbmUpOwpAQCAtMTgwOCwyMyArMTYwMiwyMiBAQAogCiAgICAgLyoqCiAgICAgICogU3RvcmVzIGluZm9ybWF0aW9uIGFib3V0IGJpZGlyZWN0aW9uYWwgKGxlZnQtdG8tcmlnaHQgb3IgcmlnaHQtdG8tbGVmdCkKLSAgICAgKiB0ZXh0IHdpdGhpbiB0aGUgbGF5b3V0IG9mIGEgbGluZS4gIFRPRE86IFRoaXMgd29yayBpcyBub3QgY29tcGxldGUKLSAgICAgKiBvciBjb3JyZWN0IGFuZCB3aWxsIGJlIGZsZXNoZWQgb3V0IGluIGEgbGF0ZXIgcmV2aXNpb24uCisgICAgICogdGV4dCB3aXRoaW4gdGhlIGxheW91dCBvZiBhIGxpbmUuCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBjbGFzcyBEaXJlY3Rpb25zIHsKLSAgICAgICAgcHJpdmF0ZSBzaG9ydFtdIG1EaXJlY3Rpb25zOworICAgICAgICAvLyBEaXJlY3Rpb25zIHJlcHJlc2VudHMgZGlyZWN0aW9uYWwgcnVucyB3aXRoaW4gYSBsaW5lIG9mIHRleHQuCisgICAgICAgIC8vIFJ1bnMgYXJlIHBhaXJzIG9mIGludHMgbGlzdGVkIGluIHZpc3VhbCBvcmRlciwgc3RhcnRpbmcgZnJvbSB0aGUKKyAgICAgICAgLy8gbGVhZGluZyBtYXJnaW4uICBUaGUgZmlyc3QgaW50IG9mIGVhY2ggcGFpciBpcyB0aGUgb2Zmc2V0IGZyb20KKyAgICAgICAgLy8gdGhlIGZpcnN0IGNoYXJhY3RlciBvZiB0aGUgbGluZSB0byB0aGUgc3RhcnQgb2YgdGhlIHJ1bi4gIFRoZQorICAgICAgICAvLyBzZWNvbmQgaW50IHJlcHJlc2VudHMgYm90aCB0aGUgbGVuZ3RoIGFuZCBsZXZlbCBvZiB0aGUgcnVuLgorICAgICAgICAvLyBUaGUgbGVuZ3RoIGlzIGluIHRoZSBsb3dlciBiaXRzLCBhY2Nlc3NlZCBieSBtYXNraW5nIHdpdGgKKyAgICAgICAgLy8gRElSX0xFTkdUSF9NQVNLLiAgVGhlIGxldmVsIGlzIGluIHRoZSBoaWdoZXIgYml0cywgYWNjZXNzZWQKKyAgICAgICAgLy8gYnkgc2hpZnRpbmcgYnkgRElSX0xFVkVMX1NISUZUIGFuZCBtYXNraW5nIGJ5IERJUl9MRVZFTF9NQVNLLgorICAgICAgICAvLyBUbyBzaW1wbHkgdGVzdCBmb3IgYW4gUlRMIGRpcmVjdGlvbiwgdGVzdCB0aGUgYml0IHVzaW5nCisgICAgICAgIC8vIERJUl9SVExfRkxBRywgaWYgc2V0IHRoZW4gdGhlIGRpcmVjdGlvbiBpcyBydGwuCiAKLSAgICAgICAgLy8gVGhlIHZhbHVlcyBpbiBtRGlyZWN0aW9ucyBhcmUgdGhlIG9mZnNldHMgZnJvbSB0aGUgZmlyc3QgY2hhcmFjdGVyCi0gICAgICAgIC8vIGluIHRoZSBsaW5lIHRvIHRoZSBuZXh0IGZsaXAgaW4gZGlyZWN0aW9uLiAgUnVucyBhdCBldmVuIGluZGljZXMKLSAgICAgICAgLy8gYXJlIGxlZnQtdG8tcmlnaHQsIHRoZSBvdGhlcnMgYXJlIHJpZ2h0LXRvLWxlZnQuICBTbywgZm9yIGV4YW1wbGUsCi0gICAgICAgIC8vIGEgbGluZSB0aGF0IHN0YXJ0cyB3aXRoIGEgcmlnaHQtdG8tbGVmdCBydW4gaGFzIDAgYXQgbURpcmVjdGlvbnNbMF0sCi0gICAgICAgIC8vIHNpbmNlIHRoZSAnZmlyc3QnIChsdHIpIHJ1biBpcyB6ZXJvIGxlbmd0aC4KLSAgICAgICAgLy8KLSAgICAgICAgLy8gVGhlIGNvZGUgY3VycmVudGx5IGFzc3VtZXMgdGhhdCBlYWNoIHJ1biBpcyBhZGphY2VudCB0byB0aGUgcHJldmlvdXMKLSAgICAgICAgLy8gb25lLCBwcm9ncmVzc2luZyBpbiB0aGUgYmFzZSBsaW5lIGRpcmVjdGlvbi4gIFRoaXMgaXNuJ3Qgc3VmZmljaWVudAotICAgICAgICAvLyB0byBoYW5kbGUgbmVzdGVkIHJ1bnMsIGZvciBleGFtcGxlIG51bWVyaWMgdGV4dCBpbiBhbiBydGwgY29udGV4dAotICAgICAgICAvLyBpbiBhbiBsdHIgcGFyYWdyYXBoLgotICAgICAgICAvKiBwYWNrYWdlICovIERpcmVjdGlvbnMoc2hvcnRbXSBkaXJzKSB7CisgICAgICAgIC8qIHBhY2thZ2UgKi8gaW50W10gbURpcmVjdGlvbnM7CisgICAgICAgIC8qIHBhY2thZ2UgKi8gRGlyZWN0aW9ucyhpbnRbXSBkaXJzKSB7CiAgICAgICAgICAgICBtRGlyZWN0aW9ucyA9IGRpcnM7CiAgICAgICAgIH0KICAgICB9CkBAIC0xODM1LDYgKzE2MjgsNyBAQAogICAgICAqIGxpbmUgaXMgZWxsaXBzaXplZCwgbm90IGdldExpbmVTdGFydCgpLikKICAgICAgKi8KICAgICBwdWJsaWMgYWJzdHJhY3QgaW50IGdldEVsbGlwc2lzU3RhcnQoaW50IGxpbmUpOworCiAgICAgLyoqCiAgICAgICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgdG8gYmUgZWxsaXBzaXplZCBhd2F5LCBvciAwIGlmCiAgICAgICogbm8gZWxsaXBzaXMgaXMgdG8gdGFrZSBwbGFjZS4KQEAgLTE4NzQsNyArMTY2OCw3IEBACiAgICAgICAgIHB1YmxpYyBpbnQgbGVuZ3RoKCkgewogICAgICAgICAgICAgcmV0dXJuIG1UZXh0Lmxlbmd0aCgpOwogICAgICAgICB9Ci0gICAgCisKICAgICAgICAgcHVibGljIENoYXJTZXF1ZW5jZSBzdWJTZXF1ZW5jZShpbnQgc3RhcnQsIGludCBlbmQpIHsKICAgICAgICAgICAgIGNoYXJbXSBzID0gbmV3IGNoYXJbZW5kIC0gc3RhcnRdOwogICAgICAgICAgICAgZ2V0Q2hhcnMoc3RhcnQsIGVuZCwgcywgMCk7CkBAIC0xOTM1LDE3ICsxNzI5LDIyIEBACiAgICAgcHJpdmF0ZSBBbGlnbm1lbnQgbUFsaWdubWVudCA9IEFsaWdubWVudC5BTElHTl9OT1JNQUw7CiAgICAgcHJpdmF0ZSBmbG9hdCBtU3BhY2luZ011bHQ7CiAgICAgcHJpdmF0ZSBmbG9hdCBtU3BhY2luZ0FkZDsKLSAgICBwcml2YXRlIHN0YXRpYyBSZWN0IHNUZW1wUmVjdCA9IG5ldyBSZWN0KCk7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgUmVjdCBzVGVtcFJlY3QgPSBuZXcgUmVjdCgpOwogICAgIHByaXZhdGUgYm9vbGVhbiBtU3Bhbm5lZFRleHQ7CiAKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBESVJfTEVGVF9UT19SSUdIVCA9IDE7CiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRElSX1JJR0hUX1RPX0xFRlQgPSAtMTsKLSAgICAKKwogICAgIC8qIHBhY2thZ2UgKi8gc3RhdGljIGZpbmFsIGludCBESVJfUkVRVUVTVF9MVFIgPSAxOwogICAgIC8qIHBhY2thZ2UgKi8gc3RhdGljIGZpbmFsIGludCBESVJfUkVRVUVTVF9SVEwgPSAtMTsKICAgICAvKiBwYWNrYWdlICovIHN0YXRpYyBmaW5hbCBpbnQgRElSX1JFUVVFU1RfREVGQVVMVF9MVFIgPSAyOwogICAgIC8qIHBhY2thZ2UgKi8gc3RhdGljIGZpbmFsIGludCBESVJfUkVRVUVTVF9ERUZBVUxUX1JUTCA9IC0yOwogCisgICAgLyogcGFja2FnZSAqLyBzdGF0aWMgZmluYWwgaW50IFJVTl9MRU5HVEhfTUFTSyA9IDB4MDNmZmZmZmY7CisgICAgLyogcGFja2FnZSAqLyBzdGF0aWMgZmluYWwgaW50IFJVTl9MRVZFTF9TSElGVCA9IDI2OworICAgIC8qIHBhY2thZ2UgKi8gc3RhdGljIGZpbmFsIGludCBSVU5fTEVWRUxfTUFTSyA9IDB4M2Y7CisgICAgLyogcGFja2FnZSAqLyBzdGF0aWMgZmluYWwgaW50IFJVTl9SVExfRkxBRyA9IDEgPDwgUlVOX0xFVkVMX1NISUZUOworCiAgICAgcHVibGljIGVudW0gQWxpZ25tZW50IHsKICAgICAgICAgQUxJR05fTk9STUFMLAogICAgICAgICBBTElHTl9PUFBPU0lURSwKQEAgLTE5NTcsOCArMTc1Niw3IEBACiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFRBQl9JTkNSRU1FTlQgPSAyMDsKIAogICAgIC8qIHBhY2thZ2UgKi8gc3RhdGljIGZpbmFsIERpcmVjdGlvbnMgRElSU19BTExfTEVGVF9UT19SSUdIVCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgRGlyZWN0aW9ucyhuZXcgc2hvcnRbXSB7IDMyNzY3IH0pOworICAgICAgICBuZXcgRGlyZWN0aW9ucyhuZXcgaW50W10geyAwLCBSVU5fTEVOR1RIX01BU0sgfSk7CiAgICAgLyogcGFja2FnZSAqLyBzdGF0aWMgZmluYWwgRGlyZWN0aW9ucyBESVJTX0FMTF9SSUdIVF9UT19MRUZUID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBEaXJlY3Rpb25zKG5ldyBzaG9ydFtdIHsgMCwgMzI3NjcgfSk7Ci0KKyAgICAgICAgbmV3IERpcmVjdGlvbnMobmV3IGludFtdIHsgMCwgUlVOX0xFTkdUSF9NQVNLIHwgUlVOX1JUTF9GTEFHIH0pOwogfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvdGV4dC9NZWFzdXJlZFRleHQuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3RleHQvTWVhc3VyZWRUZXh0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDU2OTlmMQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3RleHQvTWVhc3VyZWRUZXh0LmphdmEKQEAgLTAsMCArMSwyMjkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQudGV4dDsKKworaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnV0aWwuQXJyYXlVdGlsczsKKworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQ2FudmFzOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUGFpbnQ7CitpbXBvcnQgYW5kcm9pZC50ZXh0LnN0eWxlLk1ldHJpY0FmZmVjdGluZ1NwYW47CitpbXBvcnQgYW5kcm9pZC50ZXh0LnN0eWxlLlJlcGxhY2VtZW50U3BhbjsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworCisvKioKKyAqIEBoaWRlCisgKi8KK2NsYXNzIE1lYXN1cmVkVGV4dCB7CisgICAgLyogcGFja2FnZSAqLyBDaGFyU2VxdWVuY2UgbVRleHQ7CisgICAgLyogcGFja2FnZSAqLyBpbnQgbVRleHRTdGFydDsKKyAgICAvKiBwYWNrYWdlICovIGZsb2F0W10gbVdpZHRoczsKKyAgICAvKiBwYWNrYWdlICovIGNoYXJbXSBtQ2hhcnM7CisgICAgLyogcGFja2FnZSAqLyBieXRlW10gbUxldmVsczsKKyAgICAvKiBwYWNrYWdlICovIGludCBtRGlyOworICAgIC8qIHBhY2thZ2UgKi8gYm9vbGVhbiBtRWFzeTsKKyAgICAvKiBwYWNrYWdlICovIGludCBtTGVuOworICAgIHByaXZhdGUgaW50IG1Qb3M7CisgICAgcHJpdmF0ZSBUZXh0UGFpbnQgbVdvcmtQYWludDsKKworICAgIHByaXZhdGUgTWVhc3VyZWRUZXh0KCkgeworICAgICAgICBtV29ya1BhaW50ID0gbmV3IFRleHRQYWludCgpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIE1lYXN1cmVkVGV4dFtdIGNhY2hlZCA9IG5ldyBNZWFzdXJlZFRleHRbM107CisKKyAgICAvKiBwYWNrYWdlICovCisgICAgc3RhdGljIE1lYXN1cmVkVGV4dCBvYnRhaW4oKSB7CisgICAgICAgIE1lYXN1cmVkVGV4dCBtdDsKKyAgICAgICAgc3luY2hyb25pemVkIChjYWNoZWQpIHsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSBjYWNoZWQubGVuZ3RoOyAtLWkgPj0gMDspIHsKKyAgICAgICAgICAgICAgICBpZiAoY2FjaGVkW2ldICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgbXQgPSBjYWNoZWRbaV07CisgICAgICAgICAgICAgICAgICAgIGNhY2hlZFtpXSA9IG51bGw7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBtdDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgbXQgPSBuZXcgTWVhc3VyZWRUZXh0KCk7CisgICAgICAgIExvZy5lKCJNRUFTIiwgIm5ldzogIiArIG10KTsKKyAgICAgICAgcmV0dXJuIG10OworICAgIH0KKworICAgIC8qIHBhY2thZ2UgKi8KKyAgICBzdGF0aWMgTWVhc3VyZWRUZXh0IHJlY3ljbGUoTWVhc3VyZWRUZXh0IG10KSB7CisgICAgICAgIG10Lm1UZXh0ID0gbnVsbDsKKyAgICAgICAgaWYgKG10Lm1MZW4gPCAxMDAwKSB7CisgICAgICAgICAgICBzeW5jaHJvbml6ZWQoY2FjaGVkKSB7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjYWNoZWQubGVuZ3RoOyArK2kpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNhY2hlZFtpXSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYWNoZWRbaV0gPSBtdDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFuYWx5emVzIHRleHQgZm9yIGJpZGlyZWN0aW9uYWwgcnVucy4gIEFsbG9jYXRlcyB3b3JraW5nIGJ1ZmZlcnMuCisgICAgICovCisgICAgLyogcGFja2FnZSAqLworICAgIHZvaWQgc2V0UGFyYShDaGFyU2VxdWVuY2UgdGV4dCwgaW50IHN0YXJ0LCBpbnQgZW5kLCBpbnQgYmlkaVJlcXVlc3QpIHsKKyAgICAgICAgbVRleHQgPSB0ZXh0OworICAgICAgICBtVGV4dFN0YXJ0ID0gc3RhcnQ7CisKKyAgICAgICAgaW50IGxlbiA9IGVuZCAtIHN0YXJ0OworICAgICAgICBtTGVuID0gbGVuOworICAgICAgICBtUG9zID0gMDsKKworICAgICAgICBpZiAobVdpZHRocyA9PSBudWxsIHx8IG1XaWR0aHMubGVuZ3RoIDwgbGVuKSB7CisgICAgICAgICAgICBtV2lkdGhzID0gbmV3IGZsb2F0W0FycmF5VXRpbHMuaWRlYWxGbG9hdEFycmF5U2l6ZShsZW4pXTsKKyAgICAgICAgfQorICAgICAgICBpZiAobUNoYXJzID09IG51bGwgfHwgbUNoYXJzLmxlbmd0aCA8IGxlbikgeworICAgICAgICAgICAgbUNoYXJzID0gbmV3IGNoYXJbQXJyYXlVdGlscy5pZGVhbENoYXJBcnJheVNpemUobGVuKV07CisgICAgICAgIH0KKyAgICAgICAgVGV4dFV0aWxzLmdldENoYXJzKHRleHQsIHN0YXJ0LCBlbmQsIG1DaGFycywgMCk7CisKKyAgICAgICAgaWYgKHRleHQgaW5zdGFuY2VvZiBTcGFubmVkKSB7CisgICAgICAgICAgICBTcGFubmVkIHNwYW5uZWQgPSAoU3Bhbm5lZCkgdGV4dDsKKyAgICAgICAgICAgIFJlcGxhY2VtZW50U3BhbltdIHNwYW5zID0gc3Bhbm5lZC5nZXRTcGFucyhzdGFydCwgZW5kLAorICAgICAgICAgICAgICAgICAgICBSZXBsYWNlbWVudFNwYW4uY2xhc3MpOworCisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNwYW5zLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgaW50IHN0YXJ0SW5QYXJhID0gc3Bhbm5lZC5nZXRTcGFuU3RhcnQoc3BhbnNbaV0pIC0gc3RhcnQ7CisgICAgICAgICAgICAgICAgaW50IGVuZEluUGFyYSA9IHNwYW5uZWQuZ2V0U3BhbkVuZChzcGFuc1tpXSkgLSBzdGFydDsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBqID0gc3RhcnRJblBhcmE7IGogPCBlbmRJblBhcmE7IGorKykgeworICAgICAgICAgICAgICAgICAgICBtQ2hhcnNbal0gPSAnXHVGRkZDJzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoVGV4dFV0aWxzLmRvZXNOb3ROZWVkQmlkaShtQ2hhcnMsIDAsIGxlbikpIHsKKyAgICAgICAgICAgIG1EaXIgPSBMYXlvdXQuRElSX0xFRlRfVE9fUklHSFQ7CisgICAgICAgICAgICBtRWFzeSA9IHRydWU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAobUxldmVscyA9PSBudWxsIHx8IG1MZXZlbHMubGVuZ3RoIDwgbGVuKSB7CisgICAgICAgICAgICAgICAgbUxldmVscyA9IG5ldyBieXRlW0FycmF5VXRpbHMuaWRlYWxCeXRlQXJyYXlTaXplKGxlbildOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbURpciA9IEFuZHJvaWRCaWRpLmJpZGkoYmlkaVJlcXVlc3QsIG1DaGFycywgbUxldmVscywgbGVuLCBmYWxzZSk7CisgICAgICAgICAgICBtRWFzeSA9IGZhbHNlOworICAgICAgICB9CisgICAgfQorCisgICAgZmxvYXQgYWRkU3R5bGVSdW4oVGV4dFBhaW50IHBhaW50LCBpbnQgbGVuLCBQYWludC5Gb250TWV0cmljc0ludCBmbSkgeworICAgICAgICBpZiAoZm0gIT0gbnVsbCkgeworICAgICAgICAgICAgcGFpbnQuZ2V0Rm9udE1ldHJpY3NJbnQoZm0pOworICAgICAgICB9CisKKyAgICAgICAgaW50IHAgPSBtUG9zOworICAgICAgICBtUG9zID0gcCArIGxlbjsKKworICAgICAgICBpZiAobUVhc3kpIHsKKyAgICAgICAgICAgIGludCBmbGFncyA9IG1EaXIgPT0gTGF5b3V0LkRJUl9MRUZUX1RPX1JJR0hUCisgICAgICAgICAgICAgICAgPyBDYW52YXMuRElSRUNUSU9OX0xUUiA6IENhbnZhcy5ESVJFQ1RJT05fUlRMOworICAgICAgICAgICAgcmV0dXJuIHBhaW50LmdldFRleHRSdW5BZHZhbmNlcyhtQ2hhcnMsIHAsIGxlbiwgcCwgbGVuLCBmbGFncywgbVdpZHRocywgcCk7CisgICAgICAgIH0KKworICAgICAgICBmbG9hdCB0b3RhbEFkdmFuY2UgPSAwOworICAgICAgICBpbnQgbGV2ZWwgPSBtTGV2ZWxzW3BdOworICAgICAgICBmb3IgKGludCBxID0gcCwgaSA9IHAgKyAxLCBlID0gcCArIGxlbjs7ICsraSkgeworICAgICAgICAgICAgaWYgKGkgPT0gZSB8fCBtTGV2ZWxzW2ldICE9IGxldmVsKSB7CisgICAgICAgICAgICAgICAgaW50IGZsYWdzID0gKGxldmVsICYgMHgxKSA9PSAwID8gQ2FudmFzLkRJUkVDVElPTl9MVFIgOiBDYW52YXMuRElSRUNUSU9OX1JUTDsKKyAgICAgICAgICAgICAgICB0b3RhbEFkdmFuY2UgKz0KKyAgICAgICAgICAgICAgICAgICAgICAgIHBhaW50LmdldFRleHRSdW5BZHZhbmNlcyhtQ2hhcnMsIHEsIGkgLSBxLCBxLCBpIC0gcSwgZmxhZ3MsIG1XaWR0aHMsIHEpOworICAgICAgICAgICAgICAgIGlmIChpID09IGUpIHsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHEgPSBpOworICAgICAgICAgICAgICAgIGxldmVsID0gbUxldmVsc1tpXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdG90YWxBZHZhbmNlOworICAgIH0KKworICAgIGZsb2F0IGFkZFN0eWxlUnVuKFRleHRQYWludCBwYWludCwgTWV0cmljQWZmZWN0aW5nU3BhbltdIHNwYW5zLCBpbnQgbGVuLAorICAgICAgICAgICAgUGFpbnQuRm9udE1ldHJpY3NJbnQgZm0pIHsKKworICAgICAgICBUZXh0UGFpbnQgd29ya1BhaW50ID0gbVdvcmtQYWludDsKKyAgICAgICAgd29ya1BhaW50LnNldChwYWludCk7CisgICAgICAgIC8vIFhYWCBwYWludCBzaG91bGQgbm90IGhhdmUgYSBiYXNlbGluZSBzaGlmdCwgYnV0Li4uCisgICAgICAgIHdvcmtQYWludC5iYXNlbGluZVNoaWZ0ID0gMDsKKworICAgICAgICBSZXBsYWNlbWVudFNwYW4gcmVwbGFjZW1lbnQgPSBudWxsOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNwYW5zLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBNZXRyaWNBZmZlY3RpbmdTcGFuIHNwYW4gPSBzcGFuc1tpXTsKKyAgICAgICAgICAgIGlmIChzcGFuIGluc3RhbmNlb2YgUmVwbGFjZW1lbnRTcGFuKSB7CisgICAgICAgICAgICAgICAgcmVwbGFjZW1lbnQgPSAoUmVwbGFjZW1lbnRTcGFuKXNwYW47CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHNwYW4udXBkYXRlTWVhc3VyZVN0YXRlKHdvcmtQYWludCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBmbG9hdCB3aWQ7CisgICAgICAgIGlmIChyZXBsYWNlbWVudCA9PSBudWxsKSB7CisgICAgICAgICAgICB3aWQgPSBhZGRTdHlsZVJ1bih3b3JrUGFpbnQsIGxlbiwgZm0pOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gVXNlIG9yaWdpbmFsIHRleHQuICBTaG91bGRuJ3QgbWF0dGVyLgorICAgICAgICAgICAgd2lkID0gcmVwbGFjZW1lbnQuZ2V0U2l6ZSh3b3JrUGFpbnQsIG1UZXh0LCBtVGV4dFN0YXJ0ICsgbVBvcywKKyAgICAgICAgICAgICAgICAgICAgbVRleHRTdGFydCArIG1Qb3MgKyBsZW4sIGZtKTsKKyAgICAgICAgICAgIGZsb2F0W10gdyA9IG1XaWR0aHM7CisgICAgICAgICAgICB3W21Qb3NdID0gd2lkOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IG1Qb3MgKyAxLCBlID0gbVBvcyArIGxlbjsgaSA8IGU7IGkrKykKKyAgICAgICAgICAgICAgICB3W2ldID0gMDsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChmbSAhPSBudWxsKSB7CisgICAgICAgICAgICBpZiAod29ya1BhaW50LmJhc2VsaW5lU2hpZnQgPCAwKSB7CisgICAgICAgICAgICAgICAgZm0uYXNjZW50ICs9IHdvcmtQYWludC5iYXNlbGluZVNoaWZ0OworICAgICAgICAgICAgICAgIGZtLnRvcCArPSB3b3JrUGFpbnQuYmFzZWxpbmVTaGlmdDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgZm0uZGVzY2VudCArPSB3b3JrUGFpbnQuYmFzZWxpbmVTaGlmdDsKKyAgICAgICAgICAgICAgICBmbS5ib3R0b20gKz0gd29ya1BhaW50LmJhc2VsaW5lU2hpZnQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gd2lkOworICAgIH0KKworICAgIGludCBicmVha1RleHQoaW50IHN0YXJ0LCBpbnQgbGltaXQsIGJvb2xlYW4gZm9yd2FyZHMsIGZsb2F0IHdpZHRoKSB7CisgICAgICAgIGZsb2F0W10gdyA9IG1XaWR0aHM7CisgICAgICAgIGlmIChmb3J3YXJkcykgeworICAgICAgICAgICAgZm9yIChpbnQgaSA9IHN0YXJ0OyBpIDwgbGltaXQ7ICsraSkgeworICAgICAgICAgICAgICAgIGlmICgod2lkdGggLT0gd1tpXSkgPCAwKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBpIC0gc3RhcnQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZm9yIChpbnQgaSA9IGxpbWl0OyAtLWkgPj0gc3RhcnQ7KSB7CisgICAgICAgICAgICAgICAgaWYgKCh3aWR0aCAtPSB3W2ldKSA8IDApIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxpbWl0IC0gaSAtMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gbGltaXQgLSBzdGFydDsKKyAgICB9CisKKyAgICBmbG9hdCBtZWFzdXJlKGludCBzdGFydCwgaW50IGxpbWl0KSB7CisgICAgICAgIGZsb2F0IHdpZHRoID0gMDsKKyAgICAgICAgZmxvYXRbXSB3ID0gbVdpZHRoczsKKyAgICAgICAgZm9yIChpbnQgaSA9IHN0YXJ0OyBpIDwgbGltaXQ7ICsraSkgeworICAgICAgICAgICAgd2lkdGggKz0gd1tpXTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gd2lkdGg7CisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3RleHQvU3Bhbm5hYmxlU3RyaW5nQnVpbGRlci5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvdGV4dC9TcGFubmFibGVTdHJpbmdCdWlsZGVyLmphdmEKaW5kZXggY2FhYWZhMS4uZmMwMWVmMiAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvdGV4dC9TcGFubmFibGVTdHJpbmdCdWlsZGVyLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvdGV4dC9TcGFubmFibGVTdHJpbmdCdWlsZGVyLmphdmEKQEAgLTE3LDggKzE3LDkgQEAKIHBhY2thZ2UgYW5kcm9pZC50ZXh0OwogCiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudXRpbC5BcnJheVV0aWxzOwotaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUGFpbnQ7CisKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkNhbnZhczsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlBhaW50OwogCiBpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuQXJyYXk7CiAKQEAgLTMxMiwxMiArMzEzLDE1IEBACiAKICAgICAgICAgbW92ZUdhcFRvKGVuZCk7CiAKLSAgICAgICAgaWYgKHRiZW5kIC0gdGJzdGFydCA+PSBtR2FwTGVuZ3RoICsgKGVuZCAtIHN0YXJ0KSkKLSAgICAgICAgICAgIHJlc2l6ZUZvcihtVGV4dC5sZW5ndGggLSBtR2FwTGVuZ3RoICsKLSAgICAgICAgICAgICAgICAgICAgICB0YmVuZCAtIHRic3RhcnQgLSAoZW5kIC0gc3RhcnQpKTsKKyAgICAgICAgLy8gQ2FuIGJlIG5lZ2F0aXZlCisgICAgICAgIGZpbmFsIGludCBuYk5ld0NoYXJzID0gKHRiZW5kIC0gdGJzdGFydCkgLSAoZW5kIC0gc3RhcnQpOwogCi0gICAgICAgIG1HYXBTdGFydCArPSB0YmVuZCAtIHRic3RhcnQgLSAoZW5kIC0gc3RhcnQpOwotICAgICAgICBtR2FwTGVuZ3RoIC09IHRiZW5kIC0gdGJzdGFydCAtIChlbmQgLSBzdGFydCk7CisgICAgICAgIGlmIChuYk5ld0NoYXJzID49IG1HYXBMZW5ndGgpIHsKKyAgICAgICAgICAgIHJlc2l6ZUZvcihtVGV4dC5sZW5ndGggKyBuYk5ld0NoYXJzIC0gbUdhcExlbmd0aCk7CisgICAgICAgIH0KKworICAgICAgICBtR2FwU3RhcnQgKz0gbmJOZXdDaGFyczsKKyAgICAgICAgbUdhcExlbmd0aCAtPSBuYk5ld0NoYXJzOwogCiAgICAgICAgIGlmIChtR2FwTGVuZ3RoIDwgMSkKICAgICAgICAgICAgIG5ldyBFeGNlcHRpb24oIm1HYXBMZW5ndGggPCAxIikucHJpbnRTdGFja1RyYWNlKCk7CkBAIC03MDcsNiArNzExLDcgQEAKICAgICAgKiB0aGUgc3BlY2lmaWVkIHJhbmdlIG9mIHRoZSBidWZmZXIuICBUaGUga2luZCBtYXkgYmUgT2JqZWN0LmNsYXNzIHRvIGdldAogICAgICAqIGEgbGlzdCBvZiBhbGwgdGhlIHNwYW5zIHJlZ2FyZGxlc3Mgb2YgdHlwZS4KICAgICAgKi8KKyAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKICAgICBwdWJsaWMgPFQ+IFRbXSBnZXRTcGFucyhpbnQgcXVlcnlTdGFydCwgaW50IHF1ZXJ5RW5kLCBDbGFzczxUPiBraW5kKSB7CiAgICAgICAgIGludCBzcGFuQ291bnQgPSBtU3BhbkNvdW50OwogICAgICAgICBPYmplY3RbXSBzcGFucyA9IG1TcGFuczsKQEAgLTcxNyw4ICs3MjIsOCBAQAogICAgICAgICBpbnQgZ2FwbGVuID0gbUdhcExlbmd0aDsKIAogICAgICAgICBpbnQgY291bnQgPSAwOwotICAgICAgICBPYmplY3RbXSByZXQgPSBudWxsOwotICAgICAgICBPYmplY3QgcmV0MSA9IG51bGw7CisgICAgICAgIFRbXSByZXQgPSBudWxsOworICAgICAgICBUIHJldDEgPSBudWxsOwogCiAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc3BhbkNvdW50OyBpKyspIHsKICAgICAgICAgICAgIGludCBzcGFuU3RhcnQgPSBzdGFydHNbaV07CkBAIC03NTAsMTEgKzc1NSwxMyBAQAogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBpZiAoY291bnQgPT0gMCkgewotICAgICAgICAgICAgICAgIHJldDEgPSBzcGFuc1tpXTsKKyAgICAgICAgICAgICAgICAvLyBTYWZlIGNvbnZlcnNpb24gdGhhbmtzIHRvIHRoZSBpc0luc3RhbmNlIHRlc3QgYWJvdmUKKyAgICAgICAgICAgICAgICByZXQxID0gKFQpIHNwYW5zW2ldOwogICAgICAgICAgICAgICAgIGNvdW50Kys7CiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIGlmIChjb3VudCA9PSAxKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldCA9IChPYmplY3RbXSkgQXJyYXkubmV3SW5zdGFuY2Uoa2luZCwgc3BhbkNvdW50IC0gaSArIDEpOworICAgICAgICAgICAgICAgICAgICAvLyBTYWZlIGNvbnZlcnNpb24sIGJ1dCByZXF1aXJlcyBhIHN1cHByZXNzV2FybmluZworICAgICAgICAgICAgICAgICAgICByZXQgPSAoVFtdKSBBcnJheS5uZXdJbnN0YW5jZShraW5kLCBzcGFuQ291bnQgLSBpICsgMSk7CiAgICAgICAgICAgICAgICAgICAgIHJldFswXSA9IHJldDE7CiAgICAgICAgICAgICAgICAgfQogCkBAIC03NzEsMjkgKzc3OCwzMyBAQAogICAgICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weShyZXQsIGosIHJldCwgaiArIDEsIGNvdW50IC0gaik7Ci0gICAgICAgICAgICAgICAgICAgIHJldFtqXSA9IHNwYW5zW2ldOworICAgICAgICAgICAgICAgICAgICAvLyBTYWZlIGNvbnZlcnNpb24gdGhhbmtzIHRvIHRoZSBpc0luc3RhbmNlIHRlc3QgYWJvdmUKKyAgICAgICAgICAgICAgICAgICAgcmV0W2pdID0gKFQpIHNwYW5zW2ldOwogICAgICAgICAgICAgICAgICAgICBjb3VudCsrOwogICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldFtjb3VudCsrXSA9IHNwYW5zW2ldOworICAgICAgICAgICAgICAgICAgICAvLyBTYWZlIGNvbnZlcnNpb24gdGhhbmtzIHRvIHRoZSBpc0luc3RhbmNlIHRlc3QgYWJvdmUKKyAgICAgICAgICAgICAgICAgICAgcmV0W2NvdW50KytdID0gKFQpIHNwYW5zW2ldOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgfQogCiAgICAgICAgIGlmIChjb3VudCA9PSAwKSB7Ci0gICAgICAgICAgICByZXR1cm4gKFRbXSkgQXJyYXlVdGlscy5lbXB0eUFycmF5KGtpbmQpOworICAgICAgICAgICAgcmV0dXJuIEFycmF5VXRpbHMuZW1wdHlBcnJheShraW5kKTsKICAgICAgICAgfQogICAgICAgICBpZiAoY291bnQgPT0gMSkgewotICAgICAgICAgICAgcmV0ID0gKE9iamVjdFtdKSBBcnJheS5uZXdJbnN0YW5jZShraW5kLCAxKTsKKyAgICAgICAgICAgIC8vIFNhZmUgY29udmVyc2lvbiwgYnV0IHJlcXVpcmVzIGEgc3VwcHJlc3NXYXJuaW5nCisgICAgICAgICAgICByZXQgPSAoVFtdKSBBcnJheS5uZXdJbnN0YW5jZShraW5kLCAxKTsKICAgICAgICAgICAgIHJldFswXSA9IHJldDE7Ci0gICAgICAgICAgICByZXR1cm4gKFRbXSkgcmV0OworICAgICAgICAgICAgcmV0dXJuIHJldDsKICAgICAgICAgfQogICAgICAgICBpZiAoY291bnQgPT0gcmV0Lmxlbmd0aCkgewotICAgICAgICAgICAgcmV0dXJuIChUW10pIHJldDsKKyAgICAgICAgICAgIHJldHVybiByZXQ7CiAgICAgICAgIH0KIAotICAgICAgICBPYmplY3RbXSBucmV0ID0gKE9iamVjdFtdKSBBcnJheS5uZXdJbnN0YW5jZShraW5kLCBjb3VudCk7CisgICAgICAgIC8vIFNhZmUgY29udmVyc2lvbiwgYnV0IHJlcXVpcmVzIGEgc3VwcHJlc3NXYXJuaW5nCisgICAgICAgIFRbXSBucmV0ID0gKFRbXSkgQXJyYXkubmV3SW5zdGFuY2Uoa2luZCwgY291bnQpOwogICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KHJldCwgMCwgbnJldCwgMCwgY291bnQpOwotICAgICAgICByZXR1cm4gKFRbXSkgbnJldDsKKyAgICAgICAgcmV0dXJuIG5yZXQ7CiAgICAgfQogCiAgICAgLyoqCkBAIC04NjIsNiArODczLDcgQEAKICAgICAvKioKICAgICAgKiBSZXR1cm4gYSBTdHJpbmcgY29udGFpbmluZyBhIGNvcHkgb2YgdGhlIGNoYXJzIGluIHRoaXMgYnVmZmVyLgogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CiAgICAgICAgIGludCBsZW4gPSBsZW5ndGgoKTsKICAgICAgICAgY2hhcltdIGJ1ZiA9IG5ldyBjaGFyW2xlbl07CkBAIC05NTIsNiArOTY0LDcgQEAKICAgICAgICAgfQogICAgIH0KIAorLyoKICAgICBwcml2YXRlIGJvb2xlYW4gaXNwcmludChjaGFyIGMpIHsgLy8gWFhYCiAgICAgICAgIGlmIChjID49ICcgJyAmJiBjIDw9ICd+JykKICAgICAgICAgICAgIHJldHVybiB0cnVlOwpAQCAtOTU5LDcgKzk3Miw2IEBACiAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogCi0vKgogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBzdGFydEZsYWcoaW50IGZsYWcpIHsKICAgICAgICAgcmV0dXJuIChmbGFnID4+IDQpICYgMHgwRjsKICAgICB9CkBAIC0xMDU0LDcgKzEwNjYsMzIgQEAKICAgICAgICAgfQogICAgIH0KIAorCiAgICAgLyoqCisgICAgICogRG9uJ3QgY2FsbCB0aGlzIHlvdXJzZWxmIC0tIGV4aXN0cyBmb3IgQ2FudmFzIHRvIHVzZSBpbnRlcm5hbGx5LgorICAgICAqIHtAaGlkZX0KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBkcmF3VGV4dFJ1bihDYW52YXMgYywgaW50IHN0YXJ0LCBpbnQgZW5kLAorICAgICAgICAgICAgaW50IGNvbnRleHRTdGFydCwgaW50IGNvbnRleHRFbmQsCisgICAgICAgICAgICBmbG9hdCB4LCBmbG9hdCB5LCBpbnQgZmxhZ3MsIFBhaW50IHApIHsKKyAgICAgICAgY2hlY2tSYW5nZSgiZHJhd1RleHRSdW4iLCBzdGFydCwgZW5kKTsKKworICAgICAgICBpbnQgY29udGV4dExlbiA9IGNvbnRleHRFbmQgLSBjb250ZXh0U3RhcnQ7CisgICAgICAgIGludCBsZW4gPSBlbmQgLSBzdGFydDsKKyAgICAgICAgaWYgKGNvbnRleHRFbmQgPD0gbUdhcFN0YXJ0KSB7CisgICAgICAgICAgICBjLmRyYXdUZXh0UnVuKG1UZXh0LCBzdGFydCwgbGVuLCBjb250ZXh0U3RhcnQsIGNvbnRleHRMZW4sIHgsIHksIGZsYWdzLCBwKTsKKyAgICAgICAgfSBlbHNlIGlmIChjb250ZXh0U3RhcnQgPj0gbUdhcFN0YXJ0KSB7CisgICAgICAgICAgICBjLmRyYXdUZXh0UnVuKG1UZXh0LCBzdGFydCArIG1HYXBMZW5ndGgsIGxlbiwgY29udGV4dFN0YXJ0ICsgbUdhcExlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgY29udGV4dExlbiwgeCwgeSwgZmxhZ3MsIHApOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgY2hhcltdIGJ1ZiA9IFRleHRVdGlscy5vYnRhaW4oY29udGV4dExlbik7CisgICAgICAgICAgICBnZXRDaGFycyhjb250ZXh0U3RhcnQsIGNvbnRleHRFbmQsIGJ1ZiwgMCk7CisgICAgICAgICAgICBjLmRyYXdUZXh0UnVuKGJ1Ziwgc3RhcnQgLSBjb250ZXh0U3RhcnQsIGxlbiwgMCwgY29udGV4dExlbiwgeCwgeSwgZmxhZ3MsIHApOworICAgICAgICAgICAgVGV4dFV0aWxzLnJlY3ljbGUoYnVmKTsKKyAgICAgICAgfQorICAgIH0KKworICAgLyoqCiAgICAgICogRG9uJ3QgY2FsbCB0aGlzIHlvdXJzZWxmIC0tIGV4aXN0cyBmb3IgUGFpbnQgdG8gdXNlIGludGVybmFsbHkuCiAgICAgICoge0BoaWRlfQogICAgICAqLwpAQCAtMTEwMyw2ICsxMTQwLDU4IEBACiAgICAgICAgIHJldHVybiByZXQ7CiAgICAgfQogCisgICAgLyoqCisgICAgICogRG9uJ3QgY2FsbCB0aGlzIHlvdXJzZWxmIC0tIGV4aXN0cyBmb3IgUGFpbnQgdG8gdXNlIGludGVybmFsbHkuCisgICAgICoge0BoaWRlfQorICAgICAqLworICAgIHB1YmxpYyBmbG9hdCBnZXRUZXh0UnVuQWR2YW5jZXMoaW50IHN0YXJ0LCBpbnQgZW5kLCBpbnQgY29udGV4dFN0YXJ0LCBpbnQgY29udGV4dEVuZCwgaW50IGZsYWdzLAorICAgICAgICAgICAgZmxvYXRbXSBhZHZhbmNlcywgaW50IGFkdmFuY2VzUG9zLCBQYWludCBwKSB7CisKKyAgICAgICAgZmxvYXQgcmV0OworCisgICAgICAgIGludCBjb250ZXh0TGVuID0gY29udGV4dEVuZCAtIGNvbnRleHRTdGFydDsKKyAgICAgICAgaW50IGxlbiA9IGVuZCAtIHN0YXJ0OworCisgICAgICAgIGlmIChlbmQgPD0gbUdhcFN0YXJ0KSB7CisgICAgICAgICAgICByZXQgPSBwLmdldFRleHRSdW5BZHZhbmNlcyhtVGV4dCwgc3RhcnQsIGxlbiwgY29udGV4dFN0YXJ0LCBjb250ZXh0TGVuLAorICAgICAgICAgICAgICAgICAgICBmbGFncywgYWR2YW5jZXMsIGFkdmFuY2VzUG9zKTsKKyAgICAgICAgfSBlbHNlIGlmIChzdGFydCA+PSBtR2FwU3RhcnQpIHsKKyAgICAgICAgICAgIHJldCA9IHAuZ2V0VGV4dFJ1bkFkdmFuY2VzKG1UZXh0LCBzdGFydCArIG1HYXBMZW5ndGgsIGxlbiwKKyAgICAgICAgICAgICAgICAgICAgY29udGV4dFN0YXJ0ICsgbUdhcExlbmd0aCwgY29udGV4dExlbiwgZmxhZ3MsIGFkdmFuY2VzLCBhZHZhbmNlc1Bvcyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBjaGFyW10gYnVmID0gVGV4dFV0aWxzLm9idGFpbihjb250ZXh0TGVuKTsKKyAgICAgICAgICAgIGdldENoYXJzKGNvbnRleHRTdGFydCwgY29udGV4dEVuZCwgYnVmLCAwKTsKKyAgICAgICAgICAgIHJldCA9IHAuZ2V0VGV4dFJ1bkFkdmFuY2VzKGJ1Ziwgc3RhcnQgLSBjb250ZXh0U3RhcnQsIGxlbiwKKyAgICAgICAgICAgICAgICAgICAgMCwgY29udGV4dExlbiwgZmxhZ3MsIGFkdmFuY2VzLCBhZHZhbmNlc1Bvcyk7CisgICAgICAgICAgICBUZXh0VXRpbHMucmVjeWNsZShidWYpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGdldFRleHRSdW5DdXJzb3IoaW50IGNvbnRleHRTdGFydCwgaW50IGNvbnRleHRFbmQsIGludCBmbGFncywgaW50IG9mZnNldCwKKyAgICAgICAgICAgIGludCBjdXJzb3JPcHQsIFBhaW50IHApIHsKKworICAgICAgICBpbnQgcmV0OworCisgICAgICAgIGludCBjb250ZXh0TGVuID0gY29udGV4dEVuZCAtIGNvbnRleHRTdGFydDsKKyAgICAgICAgaWYgKGNvbnRleHRFbmQgPD0gbUdhcFN0YXJ0KSB7CisgICAgICAgICAgICByZXQgPSBwLmdldFRleHRSdW5DdXJzb3IobVRleHQsIGNvbnRleHRTdGFydCwgY29udGV4dExlbiwKKyAgICAgICAgICAgICAgICAgICAgZmxhZ3MsIG9mZnNldCwgY3Vyc29yT3B0KTsKKyAgICAgICAgfSBlbHNlIGlmIChjb250ZXh0U3RhcnQgPj0gbUdhcFN0YXJ0KSB7CisgICAgICAgICAgICByZXQgPSBwLmdldFRleHRSdW5DdXJzb3IobVRleHQsIGNvbnRleHRTdGFydCArIG1HYXBMZW5ndGgsIGNvbnRleHRMZW4sCisgICAgICAgICAgICAgICAgICAgIGZsYWdzLCBvZmZzZXQgKyBtR2FwTGVuZ3RoLCBjdXJzb3JPcHQpIC0gbUdhcExlbmd0aDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGNoYXJbXSBidWYgPSBUZXh0VXRpbHMub2J0YWluKGNvbnRleHRMZW4pOworICAgICAgICAgICAgZ2V0Q2hhcnMoY29udGV4dFN0YXJ0LCBjb250ZXh0RW5kLCBidWYsIDApOworICAgICAgICAgICAgcmV0ID0gcC5nZXRUZXh0UnVuQ3Vyc29yKGJ1ZiwgMCwgY29udGV4dExlbiwKKyAgICAgICAgICAgICAgICAgICAgZmxhZ3MsIG9mZnNldCAtIGNvbnRleHRTdGFydCwgY3Vyc29yT3B0KSArIGNvbnRleHRTdGFydDsKKyAgICAgICAgICAgIFRleHRVdGlscy5yZWN5Y2xlKGJ1Zik7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKwogICAgIC8vIERvY3VtZW50YXRpb24gZnJvbSBpbnRlcmZhY2UKICAgICBwdWJsaWMgdm9pZCBzZXRGaWx0ZXJzKElucHV0RmlsdGVyW10gZmlsdGVycykgewogICAgICAgICBpZiAoZmlsdGVycyA9PSBudWxsKSB7CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC90ZXh0L1NwYW5uZWQuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3RleHQvU3Bhbm5lZC5qYXZhCmluZGV4IDE1NDQ5N2QuLmQxNGZjYmMgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3RleHQvU3Bhbm5lZC5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3RleHQvU3Bhbm5lZC5qYXZhCkBAIC05MSw3ICs5MSw3IEBACiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1BBTl9FWENMVVNJVkVfRVhDTFVTSVZFID0gU1BBTl9QT0lOVF9NQVJLOwogCiAgICAgLyoqCi0gICAgICogTm9uLTAtbGVuZ3RoIHNwYW5zIG9mIHR5cGUgU1BBTl9JTkNMVVNJVkVfRVhDTFVTSVZFIGV4cGFuZAorICAgICAqIE5vbi0wLWxlbmd0aCBzcGFucyBvZiB0eXBlIFNQQU5fRVhDTFVTSVZFX0lOQ0xVU0lWRSBleHBhbmQKICAgICAgKiB0byBpbmNsdWRlIHRleHQgaW5zZXJ0ZWQgYXQgdGhlaXIgZW5kaW5nIHBvaW50IGJ1dCBub3QgYXQgdGhlaXIKICAgICAgKiBzdGFydGluZyBwb2ludC4gIFdoZW4gMC1sZW5ndGgsIHRoZXkgYmVoYXZlIGxpa2UgcG9pbnRzLgogICAgICAqLwpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvdGV4dC9TdGF0aWNMYXlvdXQuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3RleHQvU3RhdGljTGF5b3V0LmphdmEKb2xkIG1vZGUgMTAwNzU1Cm5ldyBtb2RlIDEwMDY0NAppbmRleCBkMGQyNDgyLi5jYzk2OWNiCi0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3RleHQvU3RhdGljTGF5b3V0LmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvdGV4dC9TdGF0aWNMYXlvdXQuamF2YQpAQCAtMTYsMTQgKzE2LDE1IEBACiAKIHBhY2thZ2UgYW5kcm9pZC50ZXh0OwogCitpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudXRpbC5BcnJheVV0aWxzOworCiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5CaXRtYXA7CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5QYWludDsKLWltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC51dGlsLkFycmF5VXRpbHM7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKIGltcG9ydCBhbmRyb2lkLnRleHQuc3R5bGUuTGVhZGluZ01hcmdpblNwYW47CiBpbXBvcnQgYW5kcm9pZC50ZXh0LnN0eWxlLkxpbmVIZWlnaHRTcGFuOwogaW1wb3J0IGFuZHJvaWQudGV4dC5zdHlsZS5NZXRyaWNBZmZlY3RpbmdTcGFuOwotaW1wb3J0IGFuZHJvaWQudGV4dC5zdHlsZS5SZXBsYWNlbWVudFNwYW47CitpbXBvcnQgYW5kcm9pZC50ZXh0LnN0eWxlLlRhYlN0b3BTcGFuOworaW1wb3J0IGFuZHJvaWQudGV4dC5zdHlsZS5MZWFkaW5nTWFyZ2luU3Bhbi5MZWFkaW5nTWFyZ2luU3BhbjI7CiAKIC8qKgogICogU3RhdGljTGF5b3V0IGlzIGEgTGF5b3V0IGZvciB0ZXh0IHRoYXQgd2lsbCBub3QgYmUgZWRpdGVkIGFmdGVyIGl0CkBAIC0zMSw4ICszMiw5IEBACiAgKiA8cD5UaGlzIGlzIHVzZWQgYnkgd2lkZ2V0cyB0byBjb250cm9sIHRleHQgbGF5b3V0LiBZb3Ugc2hvdWxkIG5vdCBuZWVkCiAgKiB0byB1c2UgdGhpcyBjbGFzcyBkaXJlY3RseSB1bmxlc3MgeW91IGFyZSBpbXBsZW1lbnRpbmcgeW91ciBvd24gd2lkZ2V0CiAgKiBvciBjdXN0b20gZGlzcGxheSBvYmplY3QsIG9yIHdvdWxkIGJlIHRlbXB0ZWQgdG8gY2FsbAotICoge0BsaW5rIGFuZHJvaWQuZ3JhcGhpY3MuQ2FudmFzI2RyYXdUZXh0KGphdmEubGFuZy5DaGFyU2VxdWVuY2UsIGludCwgaW50LCBmbG9hdCwgZmxvYXQsIGFuZHJvaWQuZ3JhcGhpY3MuUGFpbnQpCi0gKiAgQ2FudmFzLmRyYXdUZXh0KCl9IGRpcmVjdGx5LjwvcD4KKyAqIHtAbGluayBhbmRyb2lkLmdyYXBoaWNzLkNhbnZhcyNkcmF3VGV4dChqYXZhLmxhbmcuQ2hhclNlcXVlbmNlLCBpbnQsIGludCwKKyAqIGZsb2F0LCBmbG9hdCwgYW5kcm9pZC5ncmFwaGljcy5QYWludCkKKyAqIENhbnZhcy5kcmF3VGV4dCgpfSBkaXJlY3RseS48L3A+CiAgKi8KIHB1YmxpYyBjbGFzcwogU3RhdGljTGF5b3V0CkBAIC02Miw3ICs2NCw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIGluY2x1ZGVwYWQsCiAgICAgICAgICAgICAgICAgICAgICAgICBUZXh0VXRpbHMuVHJ1bmNhdGVBdCBlbGxpcHNpemUsIGludCBlbGxpcHNpemVkV2lkdGgpIHsKICAgICAgICAgc3VwZXIoKGVsbGlwc2l6ZSA9PSBudWxsKQotICAgICAgICAgICAgICAgID8gc291cmNlIAorICAgICAgICAgICAgICAgID8gc291cmNlCiAgICAgICAgICAgICAgICAgOiAoc291cmNlIGluc3RhbmNlb2YgU3Bhbm5lZCkKICAgICAgICAgICAgICAgICAgICAgPyBuZXcgU3Bhbm5lZEVsbGlwc2l6ZXIoc291cmNlKQogICAgICAgICAgICAgICAgICAgICA6IG5ldyBFbGxpcHNpemVyKHNvdXJjZSksCkBAIC03Miw3ICs3NCw3IEBACiAgICAgICAgICAqIFRoaXMgaXMgYW5ub3lpbmcsIGJ1dCB3ZSBjYW4ndCByZWZlciB0byB0aGUgbGF5b3V0IHVudGlsCiAgICAgICAgICAqIHN1cGVyY2xhc3MgY29uc3RydWN0aW9uIGlzIGZpbmlzaGVkLCBhbmQgdGhlIHN1cGVyY2xhc3MKICAgICAgICAgICogY29uc3RydWN0b3Igd2FudHMgdGhlIHJlZmVyZW5jZSB0byB0aGUgZGlzcGxheSB0ZXh0LgotICAgICAgICAgKiAKKyAgICAgICAgICoKICAgICAgICAgICogVGhpcyB3aWxsIGJyZWFrIGlmIHRoZSBzdXBlcmNsYXNzIGNvbnN0cnVjdG9yIGV2ZXIgYWN0dWFsbHkKICAgICAgICAgICogY2FyZXMgYWJvdXQgdGhlIGNvbnRlbnQgaW5zdGVhZCBvZiBqdXN0IGhvbGRpbmcgdGhlIHJlZmVyZW5jZS4KICAgICAgICAgICovCkBAIC05NCwxMyArOTYsMTMgQEAKICAgICAgICAgbUxpbmVEaXJlY3Rpb25zID0gbmV3IERpcmVjdGlvbnNbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5VXRpbHMuaWRlYWxJbnRBcnJheVNpemUoMiAqIG1Db2x1bW5zKV07CiAKKyAgICAgICAgbU1lYXN1cmVkID0gTWVhc3VyZWRUZXh0Lm9idGFpbigpOworCiAgICAgICAgIGdlbmVyYXRlKHNvdXJjZSwgYnVmc3RhcnQsIGJ1ZmVuZCwgcGFpbnQsIG91dGVyd2lkdGgsIGFsaWduLAogICAgICAgICAgICAgICAgICBzcGFjaW5nbXVsdCwgc3BhY2luZ2FkZCwgaW5jbHVkZXBhZCwgaW5jbHVkZXBhZCwKICAgICAgICAgICAgICAgICAgZWxsaXBzaXplICE9IG51bGwsIGVsbGlwc2l6ZWRXaWR0aCwgZWxsaXBzaXplKTsKIAotICAgICAgICBtQ2hkaXJzID0gbnVsbDsKLSAgICAgICAgbUNocyA9IG51bGw7Ci0gICAgICAgIG1XaWR0aHMgPSBudWxsOworICAgICAgICBtTWVhc3VyZWQgPSBNZWFzdXJlZFRleHQucmVjeWNsZShtTWVhc3VyZWQpOwogICAgICAgICBtRm9udE1ldHJpY3NJbnQgPSBudWxsOwogICAgIH0KIApAQCAtMTExLDYgKzExMyw3IEBACiAgICAgICAgIG1MaW5lcyA9IG5ldyBpbnRbQXJyYXlVdGlscy5pZGVhbEludEFycmF5U2l6ZSgyICogbUNvbHVtbnMpXTsKICAgICAgICAgbUxpbmVEaXJlY3Rpb25zID0gbmV3IERpcmVjdGlvbnNbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5VXRpbHMuaWRlYWxJbnRBcnJheVNpemUoMiAqIG1Db2x1bW5zKV07CisgICAgICAgIG1NZWFzdXJlZCA9IE1lYXN1cmVkVGV4dC5vYnRhaW4oKTsKICAgICB9CiAKICAgICAvKiBwYWNrYWdlICovIHZvaWQgZ2VuZXJhdGUoQ2hhclNlcXVlbmNlIHNvdXJjZSwgaW50IGJ1ZnN0YXJ0LCBpbnQgYnVmZW5kLApAQCAtMTI4LDU5ICsxMzEsNTAgQEAKICAgICAgICAgUGFpbnQuRm9udE1ldHJpY3NJbnQgZm0gPSBtRm9udE1ldHJpY3NJbnQ7CiAgICAgICAgIGludFtdIGNob29zZWh0diA9IG51bGw7CiAKLSAgICAgICAgaW50IGVuZCA9IFRleHRVdGlscy5pbmRleE9mKHNvdXJjZSwgJ1xuJywgYnVmc3RhcnQsIGJ1ZmVuZCk7Ci0gICAgICAgIGludCBidWZzaXogPSBlbmQgPj0gMCA/IGVuZCAtIGJ1ZnN0YXJ0IDogYnVmZW5kIC0gYnVmc3RhcnQ7Ci0gICAgICAgIGJvb2xlYW4gZmlyc3QgPSB0cnVlOworICAgICAgICBNZWFzdXJlZFRleHQgbWVhc3VyZWQgPSBtTWVhc3VyZWQ7CiAKLSAgICAgICAgaWYgKG1DaGRpcnMgPT0gbnVsbCkgewotICAgICAgICAgICAgbUNoZGlycyA9IG5ldyBieXRlW0FycmF5VXRpbHMuaWRlYWxCeXRlQXJyYXlTaXplKGJ1ZnNpeiArIDEpXTsKLSAgICAgICAgICAgIG1DaHMgPSBuZXcgY2hhcltBcnJheVV0aWxzLmlkZWFsQ2hhckFycmF5U2l6ZShidWZzaXogKyAxKV07Ci0gICAgICAgICAgICBtV2lkdGhzID0gbmV3IGZsb2F0W0FycmF5VXRpbHMuaWRlYWxJbnRBcnJheVNpemUoKGJ1ZnNpeiArIDEpICogMildOwotICAgICAgICB9Ci0KLSAgICAgICAgYnl0ZVtdIGNoZGlycyA9IG1DaGRpcnM7Ci0gICAgICAgIGNoYXJbXSBjaHMgPSBtQ2hzOwotICAgICAgICBmbG9hdFtdIHdpZHRocyA9IG1XaWR0aHM7Ci0KLSAgICAgICAgQWx0ZXJlZENoYXJTZXF1ZW5jZSBhbHRlciA9IG51bGw7CiAgICAgICAgIFNwYW5uZWQgc3Bhbm5lZCA9IG51bGw7Ci0KICAgICAgICAgaWYgKHNvdXJjZSBpbnN0YW5jZW9mIFNwYW5uZWQpCiAgICAgICAgICAgICBzcGFubmVkID0gKFNwYW5uZWQpIHNvdXJjZTsKIAogICAgICAgICBpbnQgREVGQVVMVF9ESVIgPSBESVJfTEVGVF9UT19SSUdIVDsgLy8gWFhYCiAKLSAgICAgICAgZm9yIChpbnQgc3RhcnQgPSBidWZzdGFydDsgc3RhcnQgPD0gYnVmZW5kOyBzdGFydCA9IGVuZCkgewotICAgICAgICAgICAgaWYgKGZpcnN0KQotICAgICAgICAgICAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICAgIGludCBwYXJhRW5kOworICAgICAgICBmb3IgKGludCBwYXJhU3RhcnQgPSBidWZzdGFydDsgcGFyYVN0YXJ0IDw9IGJ1ZmVuZDsgcGFyYVN0YXJ0ID0gcGFyYUVuZCkgeworICAgICAgICAgICAgcGFyYUVuZCA9IFRleHRVdGlscy5pbmRleE9mKHNvdXJjZSwgJ1xuJywgcGFyYVN0YXJ0LCBidWZlbmQpOworICAgICAgICAgICAgaWYgKHBhcmFFbmQgPCAwKQorICAgICAgICAgICAgICAgIHBhcmFFbmQgPSBidWZlbmQ7CiAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgZW5kID0gVGV4dFV0aWxzLmluZGV4T2Yoc291cmNlLCAnXG4nLCBzdGFydCwgYnVmZW5kKTsKKyAgICAgICAgICAgICAgICBwYXJhRW5kKys7CisgICAgICAgICAgICBpbnQgcGFyYUxlbiA9IHBhcmFFbmQgLSBwYXJhU3RhcnQ7CiAKLSAgICAgICAgICAgIGlmIChlbmQgPCAwKQotICAgICAgICAgICAgICAgIGVuZCA9IGJ1ZmVuZDsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBlbmQrKzsKLQotICAgICAgICAgICAgaW50IGZpcnN0V2lkdGhMaW5lQ291bnQgPSAxOworICAgICAgICAgICAgaW50IGZpcnN0V2lkdGhMaW5lTGltaXQgPSBtTGluZUNvdW50ICsgMTsKICAgICAgICAgICAgIGludCBmaXJzdHdpZHRoID0gb3V0ZXJ3aWR0aDsKICAgICAgICAgICAgIGludCByZXN0d2lkdGggPSBvdXRlcndpZHRoOwogCiAgICAgICAgICAgICBMaW5lSGVpZ2h0U3BhbltdIGNob29zZWh0ID0gbnVsbDsKIAogICAgICAgICAgICAgaWYgKHNwYW5uZWQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIExlYWRpbmdNYXJnaW5TcGFuW10gc3A7Ci0KLSAgICAgICAgICAgICAgICBzcCA9IHNwYW5uZWQuZ2V0U3BhbnMoc3RhcnQsIGVuZCwgTGVhZGluZ01hcmdpblNwYW4uY2xhc3MpOworICAgICAgICAgICAgICAgIExlYWRpbmdNYXJnaW5TcGFuW10gc3AgPSBnZXRQYXJhZ3JhcGhTcGFucyhzcGFubmVkLCBwYXJhU3RhcnQsIHBhcmFFbmQsCisgICAgICAgICAgICAgICAgICAgICAgICBMZWFkaW5nTWFyZ2luU3Bhbi5jbGFzcyk7CiAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzcC5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgICAgICBMZWFkaW5nTWFyZ2luU3BhbiBsbXMgPSBzcFtpXTsKICAgICAgICAgICAgICAgICAgICAgZmlyc3R3aWR0aCAtPSBzcFtpXS5nZXRMZWFkaW5nTWFyZ2luKHRydWUpOwogICAgICAgICAgICAgICAgICAgICByZXN0d2lkdGggLT0gc3BbaV0uZ2V0TGVhZGluZ01hcmdpbihmYWxzZSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChsbXMgaW5zdGFuY2VvZiBMZWFkaW5nTWFyZ2luU3Bhbi5MZWFkaW5nTWFyZ2luU3BhbjIpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0V2lkdGhMaW5lQ291bnQgPSAoKExlYWRpbmdNYXJnaW5TcGFuLkxlYWRpbmdNYXJnaW5TcGFuMilsbXMpLmdldExlYWRpbmdNYXJnaW5MaW5lQ291bnQoKTsKKyAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIC8vIExlYWRpbmdNYXJnaW5TcGFuMiBpcyBvZGQuICBUaGUgY291bnQgYWZmZWN0cyBhbGwKKyAgICAgICAgICAgICAgICAgICAgLy8gbGVhZGluZyBtYXJnaW4gc3BhbnMsIG5vdCBqdXN0IHRoaXMgcGFydGljdWxhciBvbmUsCisgICAgICAgICAgICAgICAgICAgIC8vIGFuZCBzdGFydCBmcm9tIHRoZSB0b3Agb2YgdGhlIHNwYW4sIG5vdCB0aGUgdG9wIG9mIHRoZQorICAgICAgICAgICAgICAgICAgICAvLyBwYXJhZ3JhcGguCisgICAgICAgICAgICAgICAgICAgIGlmIChsbXMgaW5zdGFuY2VvZiBMZWFkaW5nTWFyZ2luU3BhbjIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIExlYWRpbmdNYXJnaW5TcGFuMiBsbXMyID0gKExlYWRpbmdNYXJnaW5TcGFuMikgbG1zOworICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxtc0ZpcnN0TGluZSA9IGdldExpbmVGb3JPZmZzZXQoc3Bhbm5lZC5nZXRTcGFuU3RhcnQobG1zMikpOworICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3RXaWR0aExpbmVMaW1pdCA9IGxtc0ZpcnN0TGluZSArIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxtczIuZ2V0TGVhZGluZ01hcmdpbkxpbmVDb3VudCgpOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgY2hvb3NlaHQgPSBzcGFubmVkLmdldFNwYW5zKHN0YXJ0LCBlbmQsIExpbmVIZWlnaHRTcGFuLmNsYXNzKTsKKyAgICAgICAgICAgICAgICBjaG9vc2VodCA9IGdldFBhcmFncmFwaFNwYW5zKHNwYW5uZWQsIHBhcmFTdGFydCwgcGFyYUVuZCwgTGluZUhlaWdodFNwYW4uY2xhc3MpOwogCiAgICAgICAgICAgICAgICAgaWYgKGNob29zZWh0Lmxlbmd0aCAhPSAwKSB7CiAgICAgICAgICAgICAgICAgICAgIGlmIChjaG9vc2VodHYgPT0gbnVsbCB8fApAQCAtMTkyLDExICsxODYsMTEgQEAKICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjaG9vc2VodC5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgICAgICAgICAgaW50IG8gPSBzcGFubmVkLmdldFNwYW5TdGFydChjaG9vc2VodFtpXSk7CiAKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvIDwgc3RhcnQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvIDwgcGFyYVN0YXJ0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3RhcnRzIGluIHRoaXMgbGF5b3V0LCBiZWZvcmUgdGhlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY3VycmVudCBwYXJhZ3JhcGgKIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNob29zZWh0dltpXSA9IGdldExpbmVUb3AoZ2V0TGluZUZvck9mZnNldChvKSk7IAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNob29zZWh0dltpXSA9IGdldExpbmVUb3AoZ2V0TGluZUZvck9mZnNldChvKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN0YXJ0cyBpbiB0aGlzIHBhcmFncmFwaAogCkBAIC0yMDYsMTY2ICsyMDAsODcgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIGlmIChlbmQgLSBzdGFydCA+IGNoZGlycy5sZW5ndGgpIHsKLSAgICAgICAgICAgICAgICBjaGRpcnMgPSBuZXcgYnl0ZVtBcnJheVV0aWxzLmlkZWFsQnl0ZUFycmF5U2l6ZShlbmQgLSBzdGFydCldOwotICAgICAgICAgICAgICAgIG1DaGRpcnMgPSBjaGRpcnM7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoZW5kIC0gc3RhcnQgPiBjaHMubGVuZ3RoKSB7Ci0gICAgICAgICAgICAgICAgY2hzID0gbmV3IGNoYXJbQXJyYXlVdGlscy5pZGVhbENoYXJBcnJheVNpemUoZW5kIC0gc3RhcnQpXTsKLSAgICAgICAgICAgICAgICBtQ2hzID0gY2hzOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKChlbmQgLSBzdGFydCkgKiAyID4gd2lkdGhzLmxlbmd0aCkgewotICAgICAgICAgICAgICAgIHdpZHRocyA9IG5ldyBmbG9hdFtBcnJheVV0aWxzLmlkZWFsSW50QXJyYXlTaXplKChlbmQgLSBzdGFydCkgKiAyKV07Ci0gICAgICAgICAgICAgICAgbVdpZHRocyA9IHdpZHRoczsKLSAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1lYXN1cmVkLnNldFBhcmEoc291cmNlLCBwYXJhU3RhcnQsIHBhcmFFbmQsIERJUl9SRVFVRVNUX0RFRkFVTFRfTFRSKTsKKyAgICAgICAgICAgIGNoYXJbXSBjaHMgPSBtZWFzdXJlZC5tQ2hhcnM7CisgICAgICAgICAgICBmbG9hdFtdIHdpZHRocyA9IG1lYXN1cmVkLm1XaWR0aHM7CisgICAgICAgICAgICBieXRlW10gY2hkaXJzID0gbWVhc3VyZWQubUxldmVsczsKKyAgICAgICAgICAgIGludCBkaXIgPSBtZWFzdXJlZC5tRGlyOworICAgICAgICAgICAgYm9vbGVhbiBlYXN5ID0gbWVhc3VyZWQubUVhc3k7CiAKLSAgICAgICAgICAgIFRleHRVdGlscy5nZXRDaGFycyhzb3VyY2UsIHN0YXJ0LCBlbmQsIGNocywgMCk7Ci0gICAgICAgICAgICBmaW5hbCBpbnQgbiA9IGVuZCAtIHN0YXJ0OwotCi0gICAgICAgICAgICBib29sZWFuIGVhc3kgPSB0cnVlOwotICAgICAgICAgICAgYm9vbGVhbiBhbHRlcmVkID0gZmFsc2U7Ci0gICAgICAgICAgICBpbnQgZGlyID0gREVGQVVMVF9ESVI7IC8vIFhYWAotCi0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG47IGkrKykgewotICAgICAgICAgICAgICAgIGlmIChjaHNbaV0gPj0gRklSU1RfUklHSFRfVE9fTEVGVCkgewotICAgICAgICAgICAgICAgICAgICBlYXN5ID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gRW5zdXJlIHRoYXQgbm9uZSBvZiB0aGUgdW5kZXJseWluZyBjaGFyYWN0ZXJzIGFyZSB0cmVhdGVkCi0gICAgICAgICAgICAvLyBhcyB2aWFibGUgYnJlYWtwb2ludHMsIGFuZCB0aGF0IHRoZSBlbnRpcmUgcnVuIGdldHMgdGhlCi0gICAgICAgICAgICAvLyBzYW1lIGJpZGkgZGlyZWN0aW9uLgotCi0gICAgICAgICAgICBpZiAoc291cmNlIGluc3RhbmNlb2YgU3Bhbm5lZCkgewotICAgICAgICAgICAgICAgIFNwYW5uZWQgc3AgPSAoU3Bhbm5lZCkgc291cmNlOwotICAgICAgICAgICAgICAgIFJlcGxhY2VtZW50U3BhbltdIHNwYW5zID0gc3AuZ2V0U3BhbnMoc3RhcnQsIGVuZCwgUmVwbGFjZW1lbnRTcGFuLmNsYXNzKTsKLQotICAgICAgICAgICAgICAgIGZvciAoaW50IHkgPSAwOyB5IDwgc3BhbnMubGVuZ3RoOyB5KyspIHsKLSAgICAgICAgICAgICAgICAgICAgaW50IGEgPSBzcC5nZXRTcGFuU3RhcnQoc3BhbnNbeV0pOwotICAgICAgICAgICAgICAgICAgICBpbnQgYiA9IHNwLmdldFNwYW5FbmQoc3BhbnNbeV0pOwotCi0gICAgICAgICAgICAgICAgICAgIGZvciAoaW50IHggPSBhOyB4IDwgYjsgeCsrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjaHNbeCAtIHN0YXJ0XSA9ICdcdUZGRkMnOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoIWVhc3kpIHsKLSAgICAgICAgICAgICAgICAvLyBYWFggcHV0IG92ZXJyaWRlIGZsYWdzLCBldGMuIGludG8gY2hkaXJzCi0gICAgICAgICAgICAgICAgZGlyID0gYmlkaShkaXIsIGNocywgY2hkaXJzLCBuLCBmYWxzZSk7Ci0KLSAgICAgICAgICAgICAgICAvLyBEbyBtaXJyb3JpbmcgZm9yIHJpZ2h0LXRvLWxlZnQgc2VnbWVudHMKLQotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbjsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjaGRpcnNbaV0gPT0gQ2hhcmFjdGVyLkRJUkVDVElPTkFMSVRZX1JJR0hUX1RPX0xFRlQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBqOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGogPSBpOyBqIDwgbjsgaisrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNoZGlyc1tqXSAhPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGFyYWN0ZXIuRElSRUNUSU9OQUxJVFlfUklHSFRfVE9fTEVGVCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChBbmRyb2lkQ2hhcmFjdGVyLm1pcnJvcihjaHMsIGksIGogLSBpKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHRlcmVkID0gdHJ1ZTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgaSA9IGogLSAxOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBDaGFyU2VxdWVuY2Ugc3ViOwotCi0gICAgICAgICAgICBpZiAoYWx0ZXJlZCkgewotICAgICAgICAgICAgICAgIGlmIChhbHRlciA9PSBudWxsKQotICAgICAgICAgICAgICAgICAgICBhbHRlciA9IEFsdGVyZWRDaGFyU2VxdWVuY2UubWFrZShzb3VyY2UsIGNocywgc3RhcnQsIGVuZCk7Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICBhbHRlci51cGRhdGUoY2hzLCBzdGFydCwgZW5kKTsKLQotICAgICAgICAgICAgICAgIHN1YiA9IGFsdGVyOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBzdWIgPSBzb3VyY2U7Ci0gICAgICAgICAgICB9CisgICAgICAgICAgICBDaGFyU2VxdWVuY2Ugc3ViID0gc291cmNlOwogCiAgICAgICAgICAgICBpbnQgd2lkdGggPSBmaXJzdHdpZHRoOwogCiAgICAgICAgICAgICBmbG9hdCB3ID0gMDsKLSAgICAgICAgICAgIGludCBoZXJlID0gc3RhcnQ7CisgICAgICAgICAgICBpbnQgaGVyZSA9IHBhcmFTdGFydDsKIAotICAgICAgICAgICAgaW50IG9rID0gc3RhcnQ7CisgICAgICAgICAgICBpbnQgb2sgPSBwYXJhU3RhcnQ7CiAgICAgICAgICAgICBmbG9hdCBva3dpZHRoID0gdzsKICAgICAgICAgICAgIGludCBva2FzY2VudCA9IDAsIG9rZGVzY2VudCA9IDAsIG9rdG9wID0gMCwgb2tib3R0b20gPSAwOwogCi0gICAgICAgICAgICBpbnQgZml0ID0gc3RhcnQ7CisgICAgICAgICAgICBpbnQgZml0ID0gcGFyYVN0YXJ0OwogICAgICAgICAgICAgZmxvYXQgZml0d2lkdGggPSB3OwogICAgICAgICAgICAgaW50IGZpdGFzY2VudCA9IDAsIGZpdGRlc2NlbnQgPSAwLCBmaXR0b3AgPSAwLCBmaXRib3R0b20gPSAwOwogCi0gICAgICAgICAgICBib29sZWFuIHRhYiA9IGZhbHNlOworICAgICAgICAgICAgYm9vbGVhbiBoYXNUYWJPckVtb2ppID0gZmFsc2U7CisgICAgICAgICAgICBib29sZWFuIGhhc1RhYiA9IGZhbHNlOworICAgICAgICAgICAgVGFiU3RvcHMgdGFiU3RvcHMgPSBudWxsOwogCi0gICAgICAgICAgICBpbnQgbmV4dDsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSBzdGFydDsgaSA8IGVuZDsgaSA9IG5leHQpIHsKLSAgICAgICAgICAgICAgICBpZiAoc3Bhbm5lZCA9PSBudWxsKQotICAgICAgICAgICAgICAgICAgICBuZXh0ID0gZW5kOwotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgbmV4dCA9IHNwYW5uZWQubmV4dFNwYW5UcmFuc2l0aW9uKGksIGVuZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1ldHJpY0FmZmVjdGluZ1NwYW4uCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcyk7CisgICAgICAgICAgICBmb3IgKGludCBzcGFuU3RhcnQgPSBwYXJhU3RhcnQsIHNwYW5FbmQgPSBzcGFuU3RhcnQsIG5leHRTcGFuU3RhcnQ7CisgICAgICAgICAgICAgICAgICAgIHNwYW5TdGFydCA8IHBhcmFFbmQ7IHNwYW5TdGFydCA9IG5leHRTcGFuU3RhcnQpIHsKIAotICAgICAgICAgICAgICAgIGlmIChzcGFubmVkID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IGFjdHVhbE51bSA9IHBhaW50LmdldFRleHRXaWR0aHMoc3ViLCBpLCBuZXh0LCB3aWR0aHMpOwotICAgICAgICAgICAgICAgICAgICBpZiAobmV4dCAtIGkgPiBhY3R1YWxOdW0pCi0gICAgICAgICAgICAgICAgICAgICAgICBhZGp1c3RUZXh0V2lkdGhzKHdpZHRocywgc3ViLCBpLCBuZXh0LCBhY3R1YWxOdW0pOwotICAgICAgICAgICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KHdpZHRocywgMCwgd2lkdGhzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZCAtIHN0YXJ0ICsgKGkgLSBzdGFydCksIG5leHQgLSBpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgcGFpbnQuZ2V0Rm9udE1ldHJpY3NJbnQoZm0pOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIG1Xb3JrUGFpbnQuYmFzZWxpbmVTaGlmdCA9IDA7CisgICAgICAgICAgICAgICAgaWYgKHNwYW5TdGFydCA9PSBzcGFuRW5kKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChzcGFubmVkID09IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICBzcGFuRW5kID0gcGFyYUVuZDsKKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgc3BhbkVuZCA9IHNwYW5uZWQubmV4dFNwYW5UcmFuc2l0aW9uKHNwYW5TdGFydCwgcGFyYUVuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWV0cmljQWZmZWN0aW5nU3Bhbi5jbGFzcyk7CiAKLSAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IGFjdHVhbE51bSA9IFN0eWxlZC5nZXRUZXh0V2lkdGhzKHBhaW50LCBtV29ya1BhaW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwYW5uZWQsIGksIG5leHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGhzLCBmbSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChuZXh0IC0gaSA+IGFjdHVhbE51bSkKLSAgICAgICAgICAgICAgICAgICAgICAgIGFkanVzdFRleHRXaWR0aHMod2lkdGhzLCBzcGFubmVkLCBpLCBuZXh0LCBhY3R1YWxOdW0pOwotICAgICAgICAgICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KHdpZHRocywgMCwgd2lkdGhzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZCAtIHN0YXJ0ICsgKGkgLSBzdGFydCksIG5leHQgLSBpKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiAobVdvcmtQYWludC5iYXNlbGluZVNoaWZ0IDwgMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgZm0uYXNjZW50ICs9IG1Xb3JrUGFpbnQuYmFzZWxpbmVTaGlmdDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZtLnRvcCArPSBtV29ya1BhaW50LmJhc2VsaW5lU2hpZnQ7CisgICAgICAgICAgICAgICAgICAgIGludCBzcGFuTGVuID0gc3BhbkVuZCAtIHNwYW5TdGFydDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHNwYW5uZWQgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgbWVhc3VyZWQuYWRkU3R5bGVSdW4ocGFpbnQsIHNwYW5MZW4sIGZtKTsKICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZtLmRlc2NlbnQgKz0gbVdvcmtQYWludC5iYXNlbGluZVNoaWZ0OwotICAgICAgICAgICAgICAgICAgICAgICAgZm0uYm90dG9tICs9IG1Xb3JrUGFpbnQuYmFzZWxpbmVTaGlmdDsKKyAgICAgICAgICAgICAgICAgICAgICAgIE1ldHJpY0FmZmVjdGluZ1NwYW5bXSBzcGFucyA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Bhbm5lZC5nZXRTcGFucyhzcGFuU3RhcnQsIHNwYW5FbmQsIE1ldHJpY0FmZmVjdGluZ1NwYW4uY2xhc3MpOworICAgICAgICAgICAgICAgICAgICAgICAgbWVhc3VyZWQuYWRkU3R5bGVSdW4ocGFpbnQsIHNwYW5zLCBzcGFuTGVuLCBmbSk7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CiAKKyAgICAgICAgICAgICAgICBuZXh0U3BhblN0YXJ0ID0gc3BhbkVuZDsKKyAgICAgICAgICAgICAgICBpbnQgc3RhcnRJblBhcmEgPSBzcGFuU3RhcnQgLSBwYXJhU3RhcnQ7CisgICAgICAgICAgICAgICAgaW50IGVuZEluUGFyYSA9IHNwYW5FbmQgLSBwYXJhU3RhcnQ7CisKICAgICAgICAgICAgICAgICBpbnQgZm10b3AgPSBmbS50b3A7CiAgICAgICAgICAgICAgICAgaW50IGZtYm90dG9tID0gZm0uYm90dG9tOwogICAgICAgICAgICAgICAgIGludCBmbWFzY2VudCA9IGZtLmFzY2VudDsKICAgICAgICAgICAgICAgICBpbnQgZm1kZXNjZW50ID0gZm0uZGVzY2VudDsKIAotICAgICAgICAgICAgICAgIGlmIChmYWxzZSkgewotICAgICAgICAgICAgICAgICAgICBTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaiA9IGk7IGogPCBuZXh0OyBqKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNiLmFwcGVuZCh3aWR0aHNbaiAtIHN0YXJ0ICsgKGVuZCAtIHN0YXJ0KV0pOwotICAgICAgICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCcgJyk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBMb2cuZSgidGV4dCIsIHNiLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGZvciAoaW50IGogPSBpOyBqIDwgbmV4dDsgaisrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNoYXIgYyA9IGNoc1tqIC0gc3RhcnRdOworICAgICAgICAgICAgICAgIGZvciAoaW50IGogPSBzcGFuU3RhcnQ7IGogPCBzcGFuRW5kOyBqKyspIHsKKyAgICAgICAgICAgICAgICAgICAgY2hhciBjID0gY2hzW2ogLSBwYXJhU3RhcnRdOwogICAgICAgICAgICAgICAgICAgICBmbG9hdCBiZWZvcmUgPSB3OwogCiAgICAgICAgICAgICAgICAgICAgIGlmIChjID09ICdcbicpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIDsKICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjID09ICdcdCcpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHcgPSBMYXlvdXQubmV4dFRhYihzdWIsIHN0YXJ0LCBlbmQsIHcsIG51bGwpOwotICAgICAgICAgICAgICAgICAgICAgICAgdGFiID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjID49IDB4RDgwMCAmJiBjIDw9IDB4REZGRiAmJiBqICsgMSA8IG5leHQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBlbW9qaSA9IENoYXJhY3Rlci5jb2RlUG9pbnRBdChjaHMsIGogLSBzdGFydCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaGFzVGFiID09IGZhbHNlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFzVGFiID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXNUYWJPckVtb2ppID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3Bhbm5lZCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZpcnN0IHRhYiB0aGlzIHBhcmEsIGNoZWNrIGZvciB0YWJzdG9wcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUYWJTdG9wU3BhbltdIHNwYW5zID0gZ2V0UGFyYWdyYXBoU3BhbnMoc3Bhbm5lZCwgcGFyYVN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFFbmQsIFRhYlN0b3BTcGFuLmNsYXNzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNwYW5zLmxlbmd0aCA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhYlN0b3BzID0gbmV3IFRhYlN0b3BzKFRBQl9JTkNSRU1FTlQsIHNwYW5zKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0YWJTdG9wcyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdyA9IHRhYlN0b3BzLm5leHRUYWIodyk7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHcgPSBUYWJTdG9wcy5uZXh0RGVmYXVsdFN0b3AodywgVEFCX0lOQ1JFTUVOVCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYyA+PSAweEQ4MDAgJiYgYyA8PSAweERGRkYgJiYgaiArIDEgPCBzcGFuRW5kKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZW1vamkgPSBDaGFyYWN0ZXIuY29kZVBvaW50QXQoY2hzLCBqIC0gcGFyYVN0YXJ0KTsKIAogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVtb2ppID49IE1JTl9FTU9KSSAmJiBlbW9qaSA8PSBNQVhfRU1PSkkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaXRtYXAgYm0gPSBFTU9KSV9GQUNUT1JZLgpAQCAtMzgwLDIxICsyOTUsMjEgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWNoUGFpbnQgPSBtV29ya1BhaW50OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgd2lkID0gKGZsb2F0KSBibS5nZXRXaWR0aCgpICoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgd2lkID0gYm0uZ2V0V2lkdGgoKSAqCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC13aGljaFBhaW50LmFzY2VudCgpIC8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm0uZ2V0SGVpZ2h0KCk7CiAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdyArPSB3aWQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhYiA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhc1RhYk9yRW1vamkgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqKys7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdyArPSB3aWR0aHNbaiAtIHN0YXJ0ICsgKGVuZCAtIHN0YXJ0KV07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHcgKz0gd2lkdGhzW2ogLSBwYXJhU3RhcnRdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdyArPSB3aWR0aHNbaiAtIHN0YXJ0ICsgKGVuZCAtIHN0YXJ0KV07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdyArPSB3aWR0aHNbaiAtIHBhcmFTdGFydF07CiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB3ICs9IHdpZHRoc1tqIC0gc3RhcnQgKyAoZW5kIC0gc3RhcnQpXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHcgKz0gd2lkdGhzW2ogLSBwYXJhU3RhcnRdOwogICAgICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICAgICAgLy8gTG9nLmUoInRleHQiLCAid2FzICIgKyBiZWZvcmUgKyAiIG5vdyAiICsgdyArICIgYWZ0ZXIgIiArIGMgKyAiIHdpdGhpbiAiICsgd2lkdGgpOwpAQCAtNDE1LDcgKzMzMCw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICAgICAgICAgICAgICogRnJvbSB0aGUgVW5pY29kZSBMaW5lIEJyZWFraW5nIEFsZ29yaXRobToKICAgICAgICAgICAgICAgICAgICAgICAgICAqIChhdCBsZWFzdCBhcHByb3hpbWF0ZWx5KQotICAgICAgICAgICAgICAgICAgICAgICAgICogIAorICAgICAgICAgICAgICAgICAgICAgICAgICoKICAgICAgICAgICAgICAgICAgICAgICAgICAqIC4sOjsgYXJlIGNsYXNzIElTOiBicmVha3BvaW50cwogICAgICAgICAgICAgICAgICAgICAgICAgICogICAgICBleGNlcHQgd2hlbiBhZGphY2VudCB0byBkaWdpdHMKICAgICAgICAgICAgICAgICAgICAgICAgICAqIC8gICAgaXMgY2xhc3MgU1k6IGEgYnJlYWtwb2ludApAQCAtNDMwLDEyICszNDUsMTIgQEAKIAogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGMgPT0gJyAnIHx8IGMgPT0gJ1x0JyB8fAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoYyA9PSAnLicgIHx8IGMgPT0gJywnIHx8IGMgPT0gJzonIHx8IGMgPT0gJzsnKSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaiAtIDEgPCBoZXJlIHx8ICFDaGFyYWN0ZXIuaXNEaWdpdChjaHNbaiAtIDEgLSBzdGFydF0pKSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaiArIDEgPj0gbmV4dCB8fCAhQ2hhcmFjdGVyLmlzRGlnaXQoY2hzW2ogKyAxIC0gc3RhcnRdKSkpIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChqIC0gMSA8IGhlcmUgfHwgIUNoYXJhY3Rlci5pc0RpZ2l0KGNoc1tqIC0gMSAtIHBhcmFTdGFydF0pKSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaiArIDEgPj0gc3BhbkVuZCB8fCAhQ2hhcmFjdGVyLmlzRGlnaXQoY2hzW2ogKyAxIC0gcGFyYVN0YXJ0XSkpKSB8fAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoYyA9PSAnLycgfHwgYyA9PSAnLScpICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIChqICsgMSA+PSBuZXh0IHx8ICFDaGFyYWN0ZXIuaXNEaWdpdChjaHNbaiArIDEgLSBzdGFydF0pKSkgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGogKyAxID49IHNwYW5FbmQgfHwgIUNoYXJhY3Rlci5pc0RpZ2l0KGNoc1tqICsgMSAtIHBhcmFTdGFydF0pKSkgfHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYyA+PSBGSVJTVF9DSksgJiYgaXNJZGVvZ3JhcGhpYyhjLCB0cnVlKSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqICsgMSA8IG5leHQgJiYgaXNJZGVvZ3JhcGhpYyhjaHNbaiArIDEgLSBzdGFydF0sIGZhbHNlKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaiArIDEgPCBzcGFuRW5kICYmIGlzSWRlb2dyYXBoaWMoY2hzW2ogKyAxIC0gcGFyYVN0YXJ0XSwgZmFsc2UpKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9rd2lkdGggPSB3OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9rID0gaiArIDE7CiAKQEAgLTQ1Miw3ICszNjcsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9rICE9IGhlcmUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBMb2cuZSgidGV4dCIsICJvdXRwdXQgb2sgIiArIGhlcmUgKyAiIHRvICIgK29rKTsKIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChvayA8IG5leHQgJiYgY2hzW29rIC0gc3RhcnRdID09ICcgJykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChvayA8IHNwYW5FbmQgJiYgY2hzW29rIC0gcGFyYVN0YXJ0XSA9PSAnICcpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2srKzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAKQEAgLTQ2MSwxMCArMzc2LDEwIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBva2FzY2VudCwgb2tkZXNjZW50LCBva3RvcCwgb2tib3R0b20sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BhY2luZ211bHQsIHNwYWNpbmdhZGQsIGNob29zZWh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hvb3NlaHR2LCBmbSwgdGFiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmVlZE11bHRpcGx5LCBzdGFydCwgY2hkaXJzLCBkaXIsIGVhc3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaG9vc2VodHYsIGZtLCBoYXNUYWJPckVtb2ppLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmVlZE11bHRpcGx5LCBwYXJhU3RhcnQsIGNoZGlycywgZGlyLCBlYXN5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2sgPT0gYnVmZW5kLCBpbmNsdWRlcGFkLCB0cmFja3BhZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRocywgc3RhcnQsIGVuZCAtIHN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hzLCB3aWR0aHMsIGhlcmUgLSBwYXJhU3RhcnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGVyZSwgZWxsaXBzaXplZFdpZHRoLCBva3dpZHRoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFpbnQpOwogCkBAIC00ODgsNyArNDAzLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvayAhPSBoZXJlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTG9nLmUoInRleHQiLCAib3V0cHV0IG9rICIgKyBoZXJlICsgIiB0byAiICtvayk7CiAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAob2sgPCBuZXh0ICYmIGNoc1tvayAtIHN0YXJ0XSA9PSAnICcpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAob2sgPCBzcGFuRW5kICYmIGNoc1tvayAtIHBhcmFTdGFydF0gPT0gJyAnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9rKys7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogCkBAIC00OTcsMTAgKzQxMiwxMCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2thc2NlbnQsIG9rZGVzY2VudCwgb2t0b3AsIG9rYm90dG9tLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwYWNpbmdtdWx0LCBzcGFjaW5nYWRkLCBjaG9vc2VodCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNob29zZWh0diwgZm0sIHRhYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5lZWRNdWx0aXBseSwgc3RhcnQsIGNoZGlycywgZGlyLCBlYXN5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hvb3NlaHR2LCBmbSwgaGFzVGFiT3JFbW9qaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5lZWRNdWx0aXBseSwgcGFyYVN0YXJ0LCBjaGRpcnMsIGRpciwgZWFzeSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9rID09IGJ1ZmVuZCwgaW5jbHVkZXBhZCwgdHJhY2twYWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aHMsIHN0YXJ0LCBlbmQgLSBzdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNocywgd2lkdGhzLCBoZXJlIC0gcGFyYVN0YXJ0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hlcmUsIGVsbGlwc2l6ZWRXaWR0aCwgb2t3aWR0aCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhaW50KTsKIApAQCAtNTEzLDE5ICs0MjgsMjAgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpdHRvcCwgZml0Ym90dG9tLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwYWNpbmdtdWx0LCBzcGFjaW5nYWRkLCBjaG9vc2VodCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNob29zZWh0diwgZm0sIHRhYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5lZWRNdWx0aXBseSwgc3RhcnQsIGNoZGlycywgZGlyLCBlYXN5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hvb3NlaHR2LCBmbSwgaGFzVGFiT3JFbW9qaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5lZWRNdWx0aXBseSwgcGFyYVN0YXJ0LCBjaGRpcnMsIGRpciwgZWFzeSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpdCA9PSBidWZlbmQsIGluY2x1ZGVwYWQsIHRyYWNrcGFkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGhzLCBzdGFydCwgZW5kIC0gc3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaHMsIHdpZHRocywgaGVyZSAtIHBhcmFTdGFydCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoZXJlLCBlbGxpcHNpemVkV2lkdGgsIGZpdHdpZHRoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFpbnQpOwogCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVyZSA9IGZpdDsKICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTG9nLmUoInRleHQiLCAib3V0cHV0IG9uZSAiICsgaGVyZSArICIgdG8gIiArKGhlcmUgKyAxKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVhc3VyZVRleHQocGFpbnQsIG1Xb3JrUGFpbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlLCBoZXJlLCBoZXJlICsgMSwgZm0sIHRhYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBYWFggbm90IHN1cmUgd2h5IHRoZSBleGlzdGluZyBmbSB3YXNuJ3Qgb2suCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbWVhc3VyZVRleHQocGFpbnQsIG1Xb3JrUGFpbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgICAgICAgc291cmNlLCBoZXJlLCBoZXJlICsgMSwgZm0sIHRhYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgICAgICAgICBudWxsKTsKIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHYgPSBvdXQoc291cmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVyZSwgaGVyZSsxLApAQCAtNTMzLDE5ICs0NDksMjIgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZtLnRvcCwgZm0uYm90dG9tLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwYWNpbmdtdWx0LCBzcGFjaW5nYWRkLCBjaG9vc2VodCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNob29zZWh0diwgZm0sIHRhYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5lZWRNdWx0aXBseSwgc3RhcnQsIGNoZGlycywgZGlyLCBlYXN5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hvb3NlaHR2LCBmbSwgaGFzVGFiT3JFbW9qaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5lZWRNdWx0aXBseSwgcGFyYVN0YXJ0LCBjaGRpcnMsIGRpciwgZWFzeSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlcmUgKyAxID09IGJ1ZmVuZCwgaW5jbHVkZXBhZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNrcGFkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGhzLCBzdGFydCwgZW5kIC0gc3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaHMsIHdpZHRocywgaGVyZSAtIHBhcmFTdGFydCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoZXJlLCBlbGxpcHNpemVkV2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aHNbaGVyZSAtIHN0YXJ0XSwgcGFpbnQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGhzW2hlcmUgLSBwYXJhU3RhcnRdLCBwYWludCk7CiAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZXJlID0gaGVyZSArIDE7CiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChoZXJlIDwgaSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGogPSBuZXh0ID0gaGVyZTsgLy8gbXVzdCByZW1lYXN1cmUKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChoZXJlIDwgc3BhblN0YXJ0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZGlkbid0IG91dHB1dCBhbGwgdGhlIHRleHQgZm9yIHRoaXMgc3BhbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdlJ3ZlIG1lYXN1cmVkIHRoZSByYXcgd2lkdGhzLCB0aG91Z2gsIHNvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8ganVzdCByZXNldCB0aGUgc3RhcnQgcG9pbnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBqID0gbmV4dFNwYW5TdGFydCA9IGhlcmU7CiAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGogPSBoZXJlIC0gMTsgICAgLy8gY29udGludWUgbG9vcGluZwogICAgICAgICAgICAgICAgICAgICAgICAgfQpAQCAtNTU1LDE0ICs0NzQsMTQgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIGZpdGFzY2VudCA9IGZpdGRlc2NlbnQgPSBmaXR0b3AgPSBmaXRib3R0b20gPSAwOwogICAgICAgICAgICAgICAgICAgICAgICAgb2thc2NlbnQgPSBva2Rlc2NlbnQgPSBva3RvcCA9IG9rYm90dG9tID0gMDsKIAotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKC0tZmlyc3RXaWR0aExpbmVDb3VudCA8PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoLS1maXJzdFdpZHRoTGluZUxpbWl0IDw9IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aCA9IHJlc3R3aWR0aDsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgaWYgKGVuZCAhPSBoZXJlKSB7CisgICAgICAgICAgICBpZiAocGFyYUVuZCAhPSBoZXJlKSB7CiAgICAgICAgICAgICAgICAgaWYgKChmaXR0b3AgfCBmaXRib3R0b20gfCBmaXRkZXNjZW50IHwgZml0YXNjZW50KSA9PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgIHBhaW50LmdldEZvbnRNZXRyaWNzSW50KGZtKTsKIApAQCAtNTc1LDIwICs0OTQsMjAgQEAKICAgICAgICAgICAgICAgICAvLyBMb2cuZSgidGV4dCIsICJvdXRwdXQgcmVzdCAiICsgaGVyZSArICIgdG8gIiArIGVuZCk7CiAKICAgICAgICAgICAgICAgICB2ID0gb3V0KHNvdXJjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGhlcmUsIGVuZCwgZml0YXNjZW50LCBmaXRkZXNjZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgaGVyZSwgcGFyYUVuZCwgZml0YXNjZW50LCBmaXRkZXNjZW50LAogICAgICAgICAgICAgICAgICAgICAgICAgZml0dG9wLCBmaXRib3R0b20sCiAgICAgICAgICAgICAgICAgICAgICAgICB2LAogICAgICAgICAgICAgICAgICAgICAgICAgc3BhY2luZ211bHQsIHNwYWNpbmdhZGQsIGNob29zZWh0LAotICAgICAgICAgICAgICAgICAgICAgICAgY2hvb3NlaHR2LCBmbSwgdGFiLAotICAgICAgICAgICAgICAgICAgICAgICAgbmVlZE11bHRpcGx5LCBzdGFydCwgY2hkaXJzLCBkaXIsIGVhc3ksCi0gICAgICAgICAgICAgICAgICAgICAgICBlbmQgPT0gYnVmZW5kLCBpbmNsdWRlcGFkLCB0cmFja3BhZCwKLSAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRocywgc3RhcnQsIGVuZCAtIHN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgY2hvb3NlaHR2LCBmbSwgaGFzVGFiT3JFbW9qaSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG5lZWRNdWx0aXBseSwgcGFyYVN0YXJ0LCBjaGRpcnMsIGRpciwgZWFzeSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFFbmQgPT0gYnVmZW5kLCBpbmNsdWRlcGFkLCB0cmFja3BhZCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNocywgd2lkdGhzLCBoZXJlIC0gcGFyYVN0YXJ0LAogICAgICAgICAgICAgICAgICAgICAgICAgd2hlcmUsIGVsbGlwc2l6ZWRXaWR0aCwgdywgcGFpbnQpOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBzdGFydCA9IGVuZDsKKyAgICAgICAgICAgIHBhcmFTdGFydCA9IHBhcmFFbmQ7CiAKLSAgICAgICAgICAgIGlmIChlbmQgPT0gYnVmZW5kKQorICAgICAgICAgICAgaWYgKHBhcmFFbmQgPT0gYnVmZW5kKQogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAKQEAgLTYwMywyNDYgKzUyMiwxMyBAQAogICAgICAgICAgICAgICAgICAgICB2LAogICAgICAgICAgICAgICAgICAgICBzcGFjaW5nbXVsdCwgc3BhY2luZ2FkZCwgbnVsbCwKICAgICAgICAgICAgICAgICAgICAgbnVsbCwgZm0sIGZhbHNlLAotICAgICAgICAgICAgICAgICAgICBuZWVkTXVsdGlwbHksIGJ1ZmVuZCwgY2hkaXJzLCBERUZBVUxUX0RJUiwgdHJ1ZSwKKyAgICAgICAgICAgICAgICAgICAgbmVlZE11bHRpcGx5LCBidWZlbmQsIG51bGwsIERFRkFVTFRfRElSLCB0cnVlLAogICAgICAgICAgICAgICAgICAgICB0cnVlLCBpbmNsdWRlcGFkLCB0cmFja3BhZCwKLSAgICAgICAgICAgICAgICAgICAgd2lkdGhzLCBidWZzdGFydCwgMCwKKyAgICAgICAgICAgICAgICAgICAgbnVsbCwgbnVsbCwgYnVmc3RhcnQsCiAgICAgICAgICAgICAgICAgICAgIHdoZXJlLCBlbGxpcHNpemVkV2lkdGgsIDAsIHBhaW50KTsKICAgICAgICAgfQogICAgIH0KIAotICAgIC8qKgotICAgICAqIFJ1bnMgdGhlIHVuaWNvZGUgYmlkaSBhbGdvcml0aG0gb24gdGhlIGZpcnN0IG4gY2hhcnMgaW4gY2hzLCByZXR1cm5pbmcKLSAgICAgKiB0aGUgY2hhciBkaXJzIGluIGNoSW5mbyBhbmQgdGhlIGJhc2UgbGluZSBkaXJlY3Rpb24gb2YgdGhlIGZpcnN0Ci0gICAgICogcGFyYWdyYXBoLgotICAgICAqIAotICAgICAqIFhYWCBjaGFuZ2UgcmVzdWx0IGZyb20gZGlycyB0byBsZXZlbHMKLSAgICAgKiAgCi0gICAgICogQHBhcmFtIGRpciB0aGUgZGlyZWN0aW9uIGZsYWcsIGVpdGhlciBESVJfUkVRVUVTVF9MVFIsCi0gICAgICogRElSX1JFUVVFU1RfUlRMLCBESVJfUkVRVUVTVF9ERUZBVUxUX0xUUiwgb3IgRElSX1JFUVVFU1RfREVGQVVMVF9SVEwuCi0gICAgICogQHBhcmFtIGNocyB0aGUgdGV4dCB0byBleGFtaW5lCi0gICAgICogQHBhcmFtIGNoSW5mbyBvbiBpbnB1dCwgaWYgaGFzSW5mbyBpcyB0cnVlLCBvdmVycmlkZSBhbmQgb3RoZXIgZmxhZ3MgCi0gICAgICogcmVwcmVzZW50aW5nIG91dC1vZi1iYW5kIGVtYmVkZGluZyBpbmZvcm1hdGlvbi4gT24gb3V0cHV0LCB0aGUgZ2VuZXJhdGVkIAotICAgICAqIGRpcnMgb2YgdGhlIHRleHQuCi0gICAgICogQHBhcmFtIG4gdGhlIGxlbmd0aCBvZiB0aGUgdGV4dC9pbmZvcm1hdGlvbiBpbiBjaHMgYW5kIGNoSW5mbwotICAgICAqIEBwYXJhbSBoYXNJbmZvIHRydWUgaWYgY2hJbmZvIGhhcyBpbnB1dCBpbmZvcm1hdGlvbiwgb3RoZXJ3aXNlIHRoZQotICAgICAqIGlucHV0IGRhdGEgaW4gY2hJbmZvIGlzIGlnbm9yZWQuCi0gICAgICogQHJldHVybiB0aGUgcmVzb2x2ZWQgZGlyZWN0aW9uIGxldmVsIG9mIHRoZSBmaXJzdCBwYXJhZ3JhcGgsIGVpdGhlcgotICAgICAqIERJUl9MRUZUX1RPX1JJR0hUIG9yIERJUl9SSUdIVF9UT19MRUZULgotICAgICAqLwotICAgIC8qIHBhY2thZ2UgKi8gc3RhdGljIGludCBiaWRpKGludCBkaXIsIGNoYXJbXSBjaHMsIGJ5dGVbXSBjaEluZm8sIGludCBuLCAKLSAgICAgICAgICAgIGJvb2xlYW4gaGFzSW5mbykgewotICAgICAgICAKLSAgICAgICAgQW5kcm9pZENoYXJhY3Rlci5nZXREaXJlY3Rpb25hbGl0aWVzKGNocywgY2hJbmZvLCBuKTsKLQotICAgICAgICAvKgotICAgICAgICAgKiBEZXRlcm1pbmUgcHJpbWFyeSBwYXJhZ3JhcGggZGlyZWN0aW9uIGlmIG5vdCBzcGVjaWZpZWQKLSAgICAgICAgICovCi0gICAgICAgIGlmIChkaXIgIT0gRElSX1JFUVVFU1RfTFRSICYmIGRpciAhPSBESVJfUkVRVUVTVF9SVEwpIHsKLSAgICAgICAgICAgIC8vIHNldCB1cCBkZWZhdWx0Ci0gICAgICAgICAgICBkaXIgPSBkaXIgPj0gMCA/IERJUl9MRUZUX1RPX1JJR0hUIDogRElSX1JJR0hUX1RPX0xFRlQ7Ci0gICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IG47IGorKykgewotICAgICAgICAgICAgICAgIGludCBkID0gY2hJbmZvW2pdOwotCi0gICAgICAgICAgICAgICAgaWYgKGQgPT0gQ2hhcmFjdGVyLkRJUkVDVElPTkFMSVRZX0xFRlRfVE9fUklHSFQpIHsKLSAgICAgICAgICAgICAgICAgICAgZGlyID0gRElSX0xFRlRfVE9fUklHSFQ7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoZCA9PSBDaGFyYWN0ZXIuRElSRUNUSU9OQUxJVFlfUklHSFRfVE9fTEVGVCkgewotICAgICAgICAgICAgICAgICAgICBkaXIgPSBESVJfUklHSFRfVE9fTEVGVDsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgZmluYWwgYnl0ZSBTT1IgPSBkaXIgPT0gRElSX0xFRlRfVE9fUklHSFQgPwotICAgICAgICAgICAgICAgIENoYXJhY3Rlci5ESVJFQ1RJT05BTElUWV9MRUZUX1RPX1JJR0hUIDoKLSAgICAgICAgICAgICAgICBDaGFyYWN0ZXIuRElSRUNUSU9OQUxJVFlfUklHSFRfVE9fTEVGVDsKLQotICAgICAgICAvKgotICAgICAgICAgKiBYWFggRXhwbGljaXQgb3ZlcnJpZGVzIHNob3VsZCBnbyBoZXJlCi0gICAgICAgICAqLwotCi0gICAgICAgIC8qCi0gICAgICAgICAqIFdlYWsgdHlwZSByZXNvbHV0aW9uCi0gICAgICAgICAqLwotCi0gICAgICAgIC8vIGR1bXAoY2hkaXJzLCBuLCAiaW5pdGlhbCIpOwotCi0gICAgICAgIC8vIFcxIG5vbiBzcGFjaW5nIG1hcmtzCi0gICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgbjsgaisrKSB7Ci0gICAgICAgICAgICBpZiAoY2hJbmZvW2pdID09IENoYXJhY3Rlci5OT05fU1BBQ0lOR19NQVJLKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGogPT0gMCkKLSAgICAgICAgICAgICAgICAgICAgY2hJbmZvW2pdID0gU09SOwotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgY2hJbmZvW2pdID0gY2hJbmZvW2ogLSAxXTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIGR1bXAoY2hkaXJzLCBuLCAiVzEiKTsKLQotICAgICAgICAvLyBXMiBldXJvcGVhbiBudW1iZXJzCi0gICAgICAgIGJ5dGUgY3VyID0gU09SOwotICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IG47IGorKykgewotICAgICAgICAgICAgYnl0ZSBkID0gY2hJbmZvW2pdOwotCi0gICAgICAgICAgICBpZiAoZCA9PSBDaGFyYWN0ZXIuRElSRUNUSU9OQUxJVFlfTEVGVF9UT19SSUdIVCB8fAotICAgICAgICAgICAgICAgIGQgPT0gQ2hhcmFjdGVyLkRJUkVDVElPTkFMSVRZX1JJR0hUX1RPX0xFRlQgfHwKLSAgICAgICAgICAgICAgICBkID09IENoYXJhY3Rlci5ESVJFQ1RJT05BTElUWV9SSUdIVF9UT19MRUZUX0FSQUJJQykKLSAgICAgICAgICAgICAgICBjdXIgPSBkOwotICAgICAgICAgICAgZWxzZSBpZiAoZCA9PSBDaGFyYWN0ZXIuRElSRUNUSU9OQUxJVFlfRVVST1BFQU5fTlVNQkVSKSB7Ci0gICAgICAgICAgICAgICAgIGlmIChjdXIgPT0KLSAgICAgICAgICAgICAgICAgICAgQ2hhcmFjdGVyLkRJUkVDVElPTkFMSVRZX1JJR0hUX1RPX0xFRlRfQVJBQklDKQotICAgICAgICAgICAgICAgICAgICBjaEluZm9bal0gPSBDaGFyYWN0ZXIuRElSRUNUSU9OQUxJVFlfQVJBQklDX05VTUJFUjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIGR1bXAoY2hkaXJzLCBuLCAiVzIiKTsKLQotICAgICAgICAvLyBXMyBhcmFiaWMgbGV0dGVycwotICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IG47IGorKykgewotICAgICAgICAgICAgaWYgKGNoSW5mb1tqXSA9PSBDaGFyYWN0ZXIuRElSRUNUSU9OQUxJVFlfUklHSFRfVE9fTEVGVF9BUkFCSUMpCi0gICAgICAgICAgICAgICAgY2hJbmZvW2pdID0gQ2hhcmFjdGVyLkRJUkVDVElPTkFMSVRZX1JJR0hUX1RPX0xFRlQ7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBkdW1wKGNoZGlycywgbiwgIlczIik7Ci0KLSAgICAgICAgLy8gVzQgc2luZ2xlIHNlcGFyYXRvciBiZXR3ZWVuIG51bWJlcnMKLSAgICAgICAgZm9yIChpbnQgaiA9IDE7IGogPCBuIC0gMTsgaisrKSB7Ci0gICAgICAgICAgICBieXRlIGQgPSBjaEluZm9bal07Ci0gICAgICAgICAgICBieXRlIHByZXYgPSBjaEluZm9baiAtIDFdOwotICAgICAgICAgICAgYnl0ZSBuZXh0ID0gY2hJbmZvW2ogKyAxXTsKLQotICAgICAgICAgICAgaWYgKGQgPT0gQ2hhcmFjdGVyLkRJUkVDVElPTkFMSVRZX0VVUk9QRUFOX05VTUJFUl9TRVBBUkFUT1IpIHsKLSAgICAgICAgICAgICAgICBpZiAocHJldiA9PSBDaGFyYWN0ZXIuRElSRUNUSU9OQUxJVFlfRVVST1BFQU5fTlVNQkVSICYmCi0gICAgICAgICAgICAgICAgICAgIG5leHQgPT0gQ2hhcmFjdGVyLkRJUkVDVElPTkFMSVRZX0VVUk9QRUFOX05VTUJFUikKLSAgICAgICAgICAgICAgICAgICAgY2hJbmZvW2pdID0gQ2hhcmFjdGVyLkRJUkVDVElPTkFMSVRZX0VVUk9QRUFOX05VTUJFUjsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoZCA9PSBDaGFyYWN0ZXIuRElSRUNUSU9OQUxJVFlfQ09NTU9OX05VTUJFUl9TRVBBUkFUT1IpIHsKLSAgICAgICAgICAgICAgICBpZiAocHJldiA9PSBDaGFyYWN0ZXIuRElSRUNUSU9OQUxJVFlfRVVST1BFQU5fTlVNQkVSICYmCi0gICAgICAgICAgICAgICAgICAgIG5leHQgPT0gQ2hhcmFjdGVyLkRJUkVDVElPTkFMSVRZX0VVUk9QRUFOX05VTUJFUikKLSAgICAgICAgICAgICAgICAgICAgY2hJbmZvW2pdID0gQ2hhcmFjdGVyLkRJUkVDVElPTkFMSVRZX0VVUk9QRUFOX05VTUJFUjsKLSAgICAgICAgICAgICAgICBpZiAocHJldiA9PSBDaGFyYWN0ZXIuRElSRUNUSU9OQUxJVFlfQVJBQklDX05VTUJFUiAmJgotICAgICAgICAgICAgICAgICAgICBuZXh0ID09IENoYXJhY3Rlci5ESVJFQ1RJT05BTElUWV9BUkFCSUNfTlVNQkVSKQotICAgICAgICAgICAgICAgICAgICBjaEluZm9bal0gPSBDaGFyYWN0ZXIuRElSRUNUSU9OQUxJVFlfQVJBQklDX05VTUJFUjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIGR1bXAoY2hkaXJzLCBuLCAiVzQiKTsKLQotICAgICAgICAvLyBXNSBldXJvcGVhbiBudW1iZXIgdGVybWluYXRvcnMKLSAgICAgICAgYm9vbGVhbiBhZGphY2VudCA9IGZhbHNlOwotICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IG47IGorKykgewotICAgICAgICAgICAgYnl0ZSBkID0gY2hJbmZvW2pdOwotCi0gICAgICAgICAgICBpZiAoZCA9PSBDaGFyYWN0ZXIuRElSRUNUSU9OQUxJVFlfRVVST1BFQU5fTlVNQkVSKQotICAgICAgICAgICAgICAgIGFkamFjZW50ID0gdHJ1ZTsKLSAgICAgICAgICAgIGVsc2UgaWYgKGQgPT0gQ2hhcmFjdGVyLkRJUkVDVElPTkFMSVRZX0VVUk9QRUFOX05VTUJFUl9URVJNSU5BVE9SICYmIGFkamFjZW50KQotICAgICAgICAgICAgICAgIGNoSW5mb1tqXSA9IENoYXJhY3Rlci5ESVJFQ1RJT05BTElUWV9FVVJPUEVBTl9OVU1CRVI7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgYWRqYWNlbnQgPSBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vZHVtcChjaGRpcnMsIG4sICJXNSIpOwotCi0gICAgICAgIC8vIFc1IGV1cm9wZWFuIG51bWJlciB0ZXJtaW5hdG9ycyBwYXJ0IDIsCi0gICAgICAgIC8vIFc2IHNlcGFyYXRvcnMgYW5kIHRlcm1pbmF0b3JzCi0gICAgICAgIGFkamFjZW50ID0gZmFsc2U7Ci0gICAgICAgIGZvciAoaW50IGogPSBuIC0gMTsgaiA+PSAwOyBqLS0pIHsKLSAgICAgICAgICAgIGJ5dGUgZCA9IGNoSW5mb1tqXTsKLQotICAgICAgICAgICAgaWYgKGQgPT0gQ2hhcmFjdGVyLkRJUkVDVElPTkFMSVRZX0VVUk9QRUFOX05VTUJFUikKLSAgICAgICAgICAgICAgICBhZGphY2VudCA9IHRydWU7Ci0gICAgICAgICAgICBlbHNlIGlmIChkID09IENoYXJhY3Rlci5ESVJFQ1RJT05BTElUWV9FVVJPUEVBTl9OVU1CRVJfVEVSTUlOQVRPUikgewotICAgICAgICAgICAgICAgIGlmIChhZGphY2VudCkKLSAgICAgICAgICAgICAgICAgICAgY2hJbmZvW2pdID0gQ2hhcmFjdGVyLkRJUkVDVElPTkFMSVRZX0VVUk9QRUFOX05VTUJFUjsKLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIGNoSW5mb1tqXSA9IENoYXJhY3Rlci5ESVJFQ1RJT05BTElUWV9PVEhFUl9ORVVUUkFMUzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgIGFkamFjZW50ID0gZmFsc2U7Ci0KLSAgICAgICAgICAgICAgICBpZiAoZCA9PSBDaGFyYWN0ZXIuRElSRUNUSU9OQUxJVFlfRVVST1BFQU5fTlVNQkVSX1NFUEFSQVRPUiB8fAotICAgICAgICAgICAgICAgICAgICBkID09IENoYXJhY3Rlci5ESVJFQ1RJT05BTElUWV9DT01NT05fTlVNQkVSX1NFUEFSQVRPUiB8fAotICAgICAgICAgICAgICAgICAgICBkID09IENoYXJhY3Rlci5ESVJFQ1RJT05BTElUWV9QQVJBR1JBUEhfU0VQQVJBVE9SIHx8Ci0gICAgICAgICAgICAgICAgICAgIGQgPT0gQ2hhcmFjdGVyLkRJUkVDVElPTkFMSVRZX1NFR01FTlRfU0VQQVJBVE9SKQotICAgICAgICAgICAgICAgICAgICBjaEluZm9bal0gPSBDaGFyYWN0ZXIuRElSRUNUSU9OQUxJVFlfT1RIRVJfTkVVVFJBTFM7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBkdW1wKGNoZGlycywgbiwgIlc2Iik7Ci0KLSAgICAgICAgLy8gVzcgc3Ryb25nIGRpcmVjdGlvbiBvZiBldXJvcGVhbiBudW1iZXJzCi0gICAgICAgIGN1ciA9IFNPUjsKLSAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBuOyBqKyspIHsKLSAgICAgICAgICAgIGJ5dGUgZCA9IGNoSW5mb1tqXTsKLQotICAgICAgICAgICAgaWYgKGQgPT0gU09SIHx8Ci0gICAgICAgICAgICAgICAgZCA9PSBDaGFyYWN0ZXIuRElSRUNUSU9OQUxJVFlfTEVGVF9UT19SSUdIVCB8fAotICAgICAgICAgICAgICAgIGQgPT0gQ2hhcmFjdGVyLkRJUkVDVElPTkFMSVRZX1JJR0hUX1RPX0xFRlQpCi0gICAgICAgICAgICAgICAgY3VyID0gZDsKLQotICAgICAgICAgICAgaWYgKGQgPT0gQ2hhcmFjdGVyLkRJUkVDVElPTkFMSVRZX0VVUk9QRUFOX05VTUJFUikKLSAgICAgICAgICAgICAgICBjaEluZm9bal0gPSBjdXI7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBkdW1wKGNoZGlycywgbiwgIlc3Iik7Ci0KLSAgICAgICAgLy8gTjEsIE4yIG5ldXRyYWxzCi0gICAgICAgIGN1ciA9IFNPUjsKLSAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBuOyBqKyspIHsKLSAgICAgICAgICAgIGJ5dGUgZCA9IGNoSW5mb1tqXTsKLQotICAgICAgICAgICAgaWYgKGQgPT0gQ2hhcmFjdGVyLkRJUkVDVElPTkFMSVRZX0xFRlRfVE9fUklHSFQgfHwKLSAgICAgICAgICAgICAgICBkID09IENoYXJhY3Rlci5ESVJFQ1RJT05BTElUWV9SSUdIVF9UT19MRUZUKSB7Ci0gICAgICAgICAgICAgICAgY3VyID0gZDsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoZCA9PSBDaGFyYWN0ZXIuRElSRUNUSU9OQUxJVFlfRVVST1BFQU5fTlVNQkVSIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgIGQgPT0gQ2hhcmFjdGVyLkRJUkVDVElPTkFMSVRZX0FSQUJJQ19OVU1CRVIpIHsKLSAgICAgICAgICAgICAgICBjdXIgPSBDaGFyYWN0ZXIuRElSRUNUSU9OQUxJVFlfUklHSFRfVE9fTEVGVDsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgYnl0ZSBkZCA9IFNPUjsKLSAgICAgICAgICAgICAgICBpbnQgazsKLQotICAgICAgICAgICAgICAgIGZvciAoayA9IGogKyAxOyBrIDwgbjsgaysrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGRkID0gY2hJbmZvW2tdOwotCi0gICAgICAgICAgICAgICAgICAgIGlmIChkZCA9PSBDaGFyYWN0ZXIuRElSRUNUSU9OQUxJVFlfTEVGVF9UT19SSUdIVCB8fAotICAgICAgICAgICAgICAgICAgICAgICAgZGQgPT0gQ2hhcmFjdGVyLkRJUkVDVElPTkFMSVRZX1JJR0hUX1RPX0xFRlQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGlmIChkZCA9PSBDaGFyYWN0ZXIuRElSRUNUSU9OQUxJVFlfRVVST1BFQU5fTlVNQkVSIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICBkZCA9PSBDaGFyYWN0ZXIuRElSRUNUSU9OQUxJVFlfQVJBQklDX05VTUJFUikgewotICAgICAgICAgICAgICAgICAgICAgICAgZGQgPSBDaGFyYWN0ZXIuRElSRUNUSU9OQUxJVFlfUklHSFRfVE9fTEVGVDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgZm9yIChpbnQgeSA9IGo7IHkgPCBrOyB5KyspIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGRkID09IGN1cikKLSAgICAgICAgICAgICAgICAgICAgICAgIGNoSW5mb1t5XSA9IGN1cjsKLSAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgY2hJbmZvW3ldID0gU09SOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGogPSBrIC0gMTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIGR1bXAoY2hkaXJzLCBuLCAiZmluYWwiKTsKLQotICAgICAgICAvLyBleHRyYTogZW5mb3JjZSB0aGF0IGFsbCB0YWJzIGFuZCBzdXJyb2dhdGUgY2hhcmFjdGVycyBnbyB0aGUKLSAgICAgICAgLy8gcHJpbWFyeSBkaXJlY3Rpb24KLSAgICAgICAgLy8gVE9ETzogYWN0dWFsbHkgZG8gZGlyZWN0aW9ucyByaWdodCBmb3Igc3Vycm9nYXRlcwotCi0gICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgbjsgaisrKSB7Ci0gICAgICAgICAgICBjaGFyIGMgPSBjaHNbal07Ci0KLSAgICAgICAgICAgIGlmIChjID09ICdcdCcgfHwgKGMgPj0gMHhEODAwICYmIGMgPD0gMHhERkZGKSkgewotICAgICAgICAgICAgICAgIGNoSW5mb1tqXSA9IFNPUjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcmV0dXJuIGRpcjsKLSAgICB9Ci0KICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyIEZJUlNUX0NKSyA9ICdcdTJFODAnOwogICAgIC8qKgogICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgc3BlY2lmaWVkIGNoYXJhY3RlciBpcyBvbmUgb2YgdGhvc2Ugc3BlY2lmaWVkCkBAIC05NDgsNTMgKzYzNCwxNSBAQAogICAgIH0KICovCiAKLSAgICBwcml2YXRlIHN0YXRpYyBpbnQgZ2V0Rml0KFRleHRQYWludCBwYWludCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRleHRQYWludCB3b3JrUGFpbnQsCi0gICAgICAgICAgICAgICAgICAgICAgIENoYXJTZXF1ZW5jZSB0ZXh0LCBpbnQgc3RhcnQsIGludCBlbmQsCi0gICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHdpZCkgewotICAgICAgICBpbnQgaGlnaCA9IGVuZCArIDEsIGxvdyA9IHN0YXJ0IC0gMSwgZ3Vlc3M7Ci0KLSAgICAgICAgd2hpbGUgKGhpZ2ggLSBsb3cgPiAxKSB7Ci0gICAgICAgICAgICBndWVzcyA9IChoaWdoICsgbG93KSAvIDI7Ci0KLSAgICAgICAgICAgIGlmIChtZWFzdXJlVGV4dChwYWludCwgd29ya1BhaW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHQsIHN0YXJ0LCBndWVzcywgbnVsbCwgdHJ1ZSwgbnVsbCkgPiB3aWQpCi0gICAgICAgICAgICAgICAgaGlnaCA9IGd1ZXNzOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIGxvdyA9IGd1ZXNzOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGxvdyA8IHN0YXJ0KQotICAgICAgICAgICAgcmV0dXJuIHN0YXJ0OwotICAgICAgICBlbHNlCi0gICAgICAgICAgICByZXR1cm4gbG93OwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIHZvaWQgYWRqdXN0VGV4dFdpZHRocyhmbG9hdFtdIHdpZHRocywgQ2hhclNlcXVlbmNlIHRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY3VyUG9zLCBpbnQgbmV4dFBvcywgaW50IGFjdHVhbE51bSkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgaW50IGRzdEluZGV4ID0gbmV4dFBvcyAtIGN1clBvcyAtIDE7Ci0gICAgICAgICAgICBmb3IgKGludCBzcmNJbmRleCA9IGFjdHVhbE51bSAtIDE7IHNyY0luZGV4ID49IDA7IHNyY0luZGV4LS0pIHsKLSAgICAgICAgICAgICAgICBmaW5hbCBjaGFyIGMgPSB0ZXh0LmNoYXJBdChkc3RJbmRleCArIGN1clBvcyk7Ci0gICAgICAgICAgICAgICAgaWYgKGMgPj0gMHhEODAwICYmIGMgPD0gMHhERkZGKSB7Ci0gICAgICAgICAgICAgICAgICAgIHdpZHRoc1tkc3RJbmRleC0tXSA9IDAuMGY7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHdpZHRoc1tkc3RJbmRleC0tXSA9IHdpZHRoc1tzcmNJbmRleF07Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgTG9nLmUoInRleHQiLCAiYWRqdXN0IHRleHQgd2lkdGhzIGZhaWxlZCIpOwotICAgICAgICB9Ci0gICAgfQotCiAgICAgcHJpdmF0ZSBpbnQgb3V0KENoYXJTZXF1ZW5jZSB0ZXh0LCBpbnQgc3RhcnQsIGludCBlbmQsCiAgICAgICAgICAgICAgICAgICAgICAgaW50IGFib3ZlLCBpbnQgYmVsb3csIGludCB0b3AsIGludCBib3R0b20sIGludCB2LAogICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHNwYWNpbmdtdWx0LCBmbG9hdCBzcGFjaW5nYWRkLAogICAgICAgICAgICAgICAgICAgICAgIExpbmVIZWlnaHRTcGFuW10gY2hvb3NlaHQsIGludFtdIGNob29zZWh0diwKLSAgICAgICAgICAgICAgICAgICAgICBQYWludC5Gb250TWV0cmljc0ludCBmbSwgYm9vbGVhbiB0YWIsCisgICAgICAgICAgICAgICAgICAgICAgUGFpbnQuRm9udE1ldHJpY3NJbnQgZm0sIGJvb2xlYW4gaGFzVGFiT3JFbW9qaSwKICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIG5lZWRNdWx0aXBseSwgaW50IHBzdGFydCwgYnl0ZVtdIGNoZGlycywKICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGlyLCBib29sZWFuIGVhc3ksIGJvb2xlYW4gbGFzdCwKICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIGluY2x1ZGVwYWQsIGJvb2xlYW4gdHJhY2twYWQsCi0gICAgICAgICAgICAgICAgICAgICAgZmxvYXRbXSB3aWR0aHMsIGludCB3aWRzdGFydCwgaW50IHdpZG9mZiwKKyAgICAgICAgICAgICAgICAgICAgICBjaGFyW10gY2hzLCBmbG9hdFtdIHdpZHRocywgaW50IHdpZHN0YXJ0LAogICAgICAgICAgICAgICAgICAgICAgIFRleHRVdGlscy5UcnVuY2F0ZUF0IGVsbGlwc2l6ZSwgZmxvYXQgZWxsaXBzaXN3aWR0aCwKICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCB0ZXh0d2lkdGgsIFRleHRQYWludCBwYWludCkgewogICAgICAgICBpbnQgaiA9IG1MaW5lQ291bnQ7CkBAIC0xMDAyLDggKzY1MCw2IEBACiAgICAgICAgIGludCB3YW50ID0gb2ZmICsgbUNvbHVtbnMgKyBUT1A7CiAgICAgICAgIGludFtdIGxpbmVzID0gbUxpbmVzOwogCi0gICAgICAgIC8vIExvZy5lKCJ0ZXh0IiwgImxpbmUgIiArIHN0YXJ0ICsgIiB0byAiICsgZW5kICsgKGxhc3QgPyAiPT09IiA6ICIiKSk7Ci0KICAgICAgICAgaWYgKHdhbnQgPj0gbGluZXMubGVuZ3RoKSB7CiAgICAgICAgICAgICBpbnQgbmxlbiA9IEFycmF5VXRpbHMuaWRlYWxJbnRBcnJheVNpemUod2FudCArIDEpOwogICAgICAgICAgICAgaW50W10gZ3JvdyA9IG5ldyBpbnRbbmxlbl07CkBAIC0xMDc5LDU5ICs3MjUsMjMgQEAKICAgICAgICAgbGluZXNbb2ZmICsgbUNvbHVtbnMgKyBTVEFSVF0gPSBlbmQ7CiAgICAgICAgIGxpbmVzW29mZiArIG1Db2x1bW5zICsgVE9QXSA9IHY7CiAKLSAgICAgICAgaWYgKHRhYikKKyAgICAgICAgaWYgKGhhc1RhYk9yRW1vamkpCiAgICAgICAgICAgICBsaW5lc1tvZmYgKyBUQUJdIHw9IFRBQl9NQVNLOwogCi0gICAgICAgIHsKLSAgICAgICAgICAgIGxpbmVzW29mZiArIERJUl0gfD0gZGlyIDw8IERJUl9TSElGVDsKLQotICAgICAgICAgICAgaW50IGN1ciA9IENoYXJhY3Rlci5ESVJFQ1RJT05BTElUWV9MRUZUX1RPX1JJR0hUOwotICAgICAgICAgICAgaW50IGNvdW50ID0gMDsKLQotICAgICAgICAgICAgaWYgKCFlYXN5KSB7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgayA9IHN0YXJ0OyBrIDwgZW5kOyBrKyspIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGNoZGlyc1trIC0gcHN0YXJ0XSAhPSBjdXIpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50Kys7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjdXIgPSBjaGRpcnNbayAtIHBzdGFydF07Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIERpcmVjdGlvbnMgbGluZWRpcnM7Ci0KLSAgICAgICAgICAgIGlmIChjb3VudCA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgbGluZWRpcnMgPSBESVJTX0FMTF9MRUZUX1RPX1JJR0hUOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBzaG9ydFtdIGxkID0gbmV3IHNob3J0W2NvdW50ICsgMV07Ci0KLSAgICAgICAgICAgICAgICBjdXIgPSBDaGFyYWN0ZXIuRElSRUNUSU9OQUxJVFlfTEVGVF9UT19SSUdIVDsKLSAgICAgICAgICAgICAgICBjb3VudCA9IDA7Ci0gICAgICAgICAgICAgICAgaW50IGhlcmUgPSBzdGFydDsKLQotICAgICAgICAgICAgICAgIGZvciAoaW50IGsgPSBzdGFydDsgayA8IGVuZDsgaysrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjaGRpcnNbayAtIHBzdGFydF0gIT0gY3VyKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBYWFggY2hlY2sgdG8gbWFrZSBzdXJlIHdlIGRvbid0Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgb3ZlcmZsb3cgc2hvcnQKLSAgICAgICAgICAgICAgICAgICAgICAgIGxkW2NvdW50KytdID0gKHNob3J0KSAoayAtIGhlcmUpOwotICAgICAgICAgICAgICAgICAgICAgICAgY3VyID0gY2hkaXJzW2sgLSBwc3RhcnRdOwotICAgICAgICAgICAgICAgICAgICAgICAgaGVyZSA9IGs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBsZFtjb3VudF0gPSAoc2hvcnQpIChlbmQgLSBoZXJlKTsKLQotICAgICAgICAgICAgICAgIGlmIChjb3VudCA9PSAxICYmIGxkWzBdID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgbGluZWRpcnMgPSBESVJTX0FMTF9SSUdIVF9UT19MRUZUOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGxpbmVkaXJzID0gbmV3IERpcmVjdGlvbnMobGQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQorICAgICAgICBsaW5lc1tvZmYgKyBESVJdIHw9IGRpciA8PCBESVJfU0hJRlQ7CisgICAgICAgIERpcmVjdGlvbnMgbGluZWRpcnMgPSBESVJTX0FMTF9MRUZUX1RPX1JJR0hUOworICAgICAgICAvLyBlYXN5IG1lYW5zIGFsbCBjaGFycyA8IHRoZSBmaXJzdCBSVEwsIHNvIG5vIGVtb2ppLCBubyBub3RoaW5nCisgICAgICAgIC8vIFhYWCBhIHJ1biB3aXRoIG5vIHRleHQgb3IgYWxsIHNwYWNlcyBpcyBlYXN5IGJ1dCBtaWdodCBiZSBhbiBlbXB0eQorICAgICAgICAvLyBSVEwgcGFyYWdyYXBoLiAgTWFrZSBzdXJlIGVhc3kgaXMgZmFsc2UgaWYgdGhpcyBpcyB0aGUgY2FzZS4KKyAgICAgICAgaWYgKGVhc3kpIHsKICAgICAgICAgICAgIG1MaW5lRGlyZWN0aW9uc1tqXSA9IGxpbmVkaXJzOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbUxpbmVEaXJlY3Rpb25zW2pdID0gQW5kcm9pZEJpZGkuZGlyZWN0aW9ucyhkaXIsIGNoZGlycywgd2lkc3RhcnQsIGNocywKKyAgICAgICAgICAgICAgICAgICAgd2lkc3RhcnQsIGVuZCAtIHN0YXJ0KTsKIAogICAgICAgICAgICAgLy8gSWYgZWxsaXBzaXplIGlzIGluIG1hcnF1ZWUgbW9kZSwgZG8gbm90IGFwcGx5IGVsbGlwc2lzIG9uIHRoZSBmaXJzdCBsaW5lCiAgICAgICAgICAgICBpZiAoZWxsaXBzaXplICE9IG51bGwgJiYgKGVsbGlwc2l6ZSAhPSBUZXh0VXRpbHMuVHJ1bmNhdGVBdC5NQVJRVUVFIHx8IGogIT0gMCkpIHsKLSAgICAgICAgICAgICAgICBjYWxjdWxhdGVFbGxpcHNpcyhzdGFydCwgZW5kLCB3aWR0aHMsIHdpZHN0YXJ0LCB3aWRvZmYsCisgICAgICAgICAgICAgICAgY2FsY3VsYXRlRWxsaXBzaXMoc3RhcnQsIGVuZCwgd2lkdGhzLCB3aWRzdGFydCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGxpcHNpc3dpZHRoLCBlbGxpcHNpemUsIGosCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dHdpZHRoLCBwYWludCk7CiAgICAgICAgICAgICB9CkBAIC0xMTQyLDcgKzc1Miw3IEBACiAgICAgfQogCiAgICAgcHJpdmF0ZSB2b2lkIGNhbGN1bGF0ZUVsbGlwc2lzKGludCBsaW5lc3RhcnQsIGludCBsaW5lZW5kLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdFtdIHdpZHRocywgaW50IHdpZHN0YXJ0LCBpbnQgd2lkb2ZmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdFtdIHdpZHRocywgaW50IHdpZHN0YXJ0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBhdmFpbCwgVGV4dFV0aWxzLlRydW5jYXRlQXQgd2hlcmUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsaW5lLCBmbG9hdCB0ZXh0d2lkdGgsIFRleHRQYWludCBwYWludCkgewogICAgICAgICBpbnQgbGVuID0gbGluZWVuZCAtIGxpbmVzdGFydDsKQEAgLTExNjIsNyArNzcyLDcgQEAKICAgICAgICAgICAgIGludCBpOwogCiAgICAgICAgICAgICBmb3IgKGkgPSBsZW47IGkgPj0gMDsgaS0tKSB7Ci0gICAgICAgICAgICAgICAgZmxvYXQgdyA9IHdpZHRoc1tpIC0gMSArIGxpbmVzdGFydCAtIHdpZHN0YXJ0ICsgd2lkb2ZmXTsKKyAgICAgICAgICAgICAgICBmbG9hdCB3ID0gd2lkdGhzW2kgLSAxICsgbGluZXN0YXJ0IC0gd2lkc3RhcnRdOwogCiAgICAgICAgICAgICAgICAgaWYgKHcgKyBzdW0gKyBlbGxpcHNpc3dpZCA+IGF2YWlsKSB7CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwpAQCAtMTE3OCw3ICs3ODgsNyBAQAogICAgICAgICAgICAgaW50IGk7CiAKICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykgewotICAgICAgICAgICAgICAgIGZsb2F0IHcgPSB3aWR0aHNbaSArIGxpbmVzdGFydCAtIHdpZHN0YXJ0ICsgd2lkb2ZmXTsKKyAgICAgICAgICAgICAgICBmbG9hdCB3ID0gd2lkdGhzW2kgKyBsaW5lc3RhcnQgLSB3aWRzdGFydF07CiAKICAgICAgICAgICAgICAgICBpZiAodyArIHN1bSArIGVsbGlwc2lzd2lkID4gYXZhaWwpIHsKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CkBAIC0xMTk1LDcgKzgwNSw3IEBACiAKICAgICAgICAgICAgIGZsb2F0IHJhdmFpbCA9IChhdmFpbCAtIGVsbGlwc2lzd2lkKSAvIDI7CiAgICAgICAgICAgICBmb3IgKHJpZ2h0ID0gbGVuOyByaWdodCA+PSAwOyByaWdodC0tKSB7Ci0gICAgICAgICAgICAgICAgZmxvYXQgdyA9IHdpZHRoc1tyaWdodCAtIDEgKyBsaW5lc3RhcnQgLSB3aWRzdGFydCArIHdpZG9mZl07CisgICAgICAgICAgICAgICAgZmxvYXQgdyA9IHdpZHRoc1tyaWdodCAtIDEgKyBsaW5lc3RhcnQgLSB3aWRzdGFydF07CiAKICAgICAgICAgICAgICAgICBpZiAodyArIHJzdW0gPiByYXZhaWwpIHsKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CkBAIC0xMjA2LDcgKzgxNiw3IEBACiAKICAgICAgICAgICAgIGZsb2F0IGxhdmFpbCA9IGF2YWlsIC0gZWxsaXBzaXN3aWQgLSByc3VtOwogICAgICAgICAgICAgZm9yIChsZWZ0ID0gMDsgbGVmdCA8IHJpZ2h0OyBsZWZ0KyspIHsKLSAgICAgICAgICAgICAgICBmbG9hdCB3ID0gd2lkdGhzW2xlZnQgKyBsaW5lc3RhcnQgLSB3aWRzdGFydCArIHdpZG9mZl07CisgICAgICAgICAgICAgICAgZmxvYXQgdyA9IHdpZHRoc1tsZWZ0ICsgbGluZXN0YXJ0IC0gd2lkc3RhcnRdOwogCiAgICAgICAgICAgICAgICAgaWYgKHcgKyBsc3VtID4gbGF2YWlsKSB7CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwpAQCAtMTIyMyw3ICs4MzMsNyBAQAogICAgICAgICBtTGluZXNbbUNvbHVtbnMgKiBsaW5lICsgRUxMSVBTSVNfQ09VTlRdID0gZWxsaXBzaXNDb3VudDsKICAgICB9CiAKLSAgICAvLyBPdmVycmlkZSB0aGUgYmFzZWNsYXNzIHNvIHdlIGNhbiBkaXJlY3RseSBhY2Nlc3Mgb3VyIG1lbWJlcnMsCisgICAgLy8gT3ZlcnJpZGUgdGhlIGJhc2UgY2xhc3Mgc28gd2UgY2FuIGRpcmVjdGx5IGFjY2VzcyBvdXIgbWVtYmVycywKICAgICAvLyByYXRoZXIgdGhhbiByZWx5aW5nIG9uIG1lbWJlciBmdW5jdGlvbnMuCiAgICAgLy8gVGhlIGxvZ2ljIG1pcnJvcnMgdGhhdCBvZiBMYXlvdXQuZ2V0TGluZUZvclZlcnRpY2FsCiAgICAgLy8gRklYTUU6IEl0IG1heSBiZSBmYXN0ZXIgdG8gZG8gYSBsaW5lYXIgc2VhcmNoIGZvciBsYXlvdXRzIHdpdGhvdXQgbWFueSBsaW5lcy4KQEAgLTEyNTIsMTEgKzg2MiwxMSBAQAogICAgIH0KIAogICAgIHB1YmxpYyBpbnQgZ2V0TGluZVRvcChpbnQgbGluZSkgewotICAgICAgICByZXR1cm4gbUxpbmVzW21Db2x1bW5zICogbGluZSArIFRPUF07ICAgIAorICAgICAgICByZXR1cm4gbUxpbmVzW21Db2x1bW5zICogbGluZSArIFRPUF07CiAgICAgfQogCiAgICAgcHVibGljIGludCBnZXRMaW5lRGVzY2VudChpbnQgbGluZSkgewotICAgICAgICByZXR1cm4gbUxpbmVzW21Db2x1bW5zICogbGluZSArIERFU0NFTlRdOyAgIAorICAgICAgICByZXR1cm4gbUxpbmVzW21Db2x1bW5zICogbGluZSArIERFU0NFTlRdOwogICAgIH0KIAogICAgIHB1YmxpYyBpbnQgZ2V0TGluZVN0YXJ0KGludCBsaW5lKSB7CkBAIC0xMzI5LDEzICs5MzksMTEgQEAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRElSX1NISUZUICA9IDMwOwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBUQUJfTUFTSyAgID0gMHgyMDAwMDAwMDsKIAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGNoYXIgRklSU1RfUklHSFRfVE9fTEVGVCA9ICdcdTA1OTAnOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBUQUJfSU5DUkVNRU5UID0gMjA7IC8vIHNhbWUgYXMgTGF5b3V0LCBidXQgdGhhdCdzIHByaXZhdGUKIAogICAgIC8qCi0gICAgICogVGhlc2UgYXJlIHJldXNlZCBhY3Jvc3MgY2FsbHMgdG8gZ2VuZXJhdGUoKQorICAgICAqIFRoaXMgaXMgcmV1c2VkIGFjcm9zcyBjYWxscyB0byBnZW5lcmF0ZSgpCiAgICAgICovCi0gICAgcHJpdmF0ZSBieXRlW10gbUNoZGlyczsKLSAgICBwcml2YXRlIGNoYXJbXSBtQ2hzOwotICAgIHByaXZhdGUgZmxvYXRbXSBtV2lkdGhzOworICAgIHByaXZhdGUgTWVhc3VyZWRUZXh0IG1NZWFzdXJlZDsKICAgICBwcml2YXRlIFBhaW50LkZvbnRNZXRyaWNzSW50IG1Gb250TWV0cmljc0ludCA9IG5ldyBQYWludC5Gb250TWV0cmljc0ludCgpOwogfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvdGV4dC9TdHlsZWQuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3RleHQvU3R5bGVkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDEzY2M0MmMuLjAwMDAwMDAKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvdGV4dC9TdHlsZWQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzNiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2UgYW5kcm9pZC50ZXh0OwotCi1pbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5DYW52YXM7Ci1pbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5QYWludDsKLWltcG9ydCBhbmRyb2lkLnRleHQuc3R5bGUuQ2hhcmFjdGVyU3R5bGU7Ci1pbXBvcnQgYW5kcm9pZC50ZXh0LnN0eWxlLk1ldHJpY0FmZmVjdGluZ1NwYW47Ci1pbXBvcnQgYW5kcm9pZC50ZXh0LnN0eWxlLlJlcGxhY2VtZW50U3BhbjsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIHByb3ZpZGVzIHN0YXRpYyBtZXRob2RzIGZvciBkcmF3aW5nIGFuZCBtZWFzdXJpbmcgc3R5bGVkIHRleHQsCi0gKiBsaWtlIHtAbGluayBhbmRyb2lkLnRleHQuU3Bhbm5lZH0gb2JqZWN0IHdpdGgKLSAqIHtAbGluayBhbmRyb2lkLnRleHQuc3R5bGUuUmVwbGFjZW1lbnRTcGFufS4KLSAqCi0gKiBAaGlkZQotICovCi1wdWJsaWMgY2xhc3MgU3R5bGVkCi17Ci0gICAgLyoqCi0gICAgICogRHJhd3MgYW5kL29yIG1lYXN1cmVzIGEgdW5pZm9ybSBydW4gb2YgdGV4dCBvbiBhIHNpbmdsZSBsaW5lLiBObyBzcGFuIG9mCi0gICAgICogaW50ZXJlc3Qgc2hvdWxkIHN0YXJ0IG9yIGVuZCBpbiB0aGUgbWlkZGxlIG9mIHRoaXMgcnVuIChpZiBub3QKLSAgICAgKiBkcmF3aW5nLCBjaGFyYWN0ZXIgc3BhbnMgdGhhdCBkb24ndCBhZmZlY3QgbWV0cmljcyBjYW4gYmUgaWdub3JlZCkuCi0gICAgICogTmVpdGhlciBzaG91bGQgdGhlIHJ1biBkaXJlY3Rpb24gY2hhbmdlIGluIHRoZSBtaWRkbGUgb2YgdGhlIHJ1bi4KLSAgICAgKgotICAgICAqIDxwPlRoZSB4IHBvc2l0aW9uIGlzIHRoZSBsZWFkaW5nIGVkZ2Ugb2YgdGhlIHRleHQuIEluIGEgcmlnaHQtdG8tbGVmdAotICAgICAqIHBhcmFncmFwaCwgdGhpcyB3aWxsIGJlIHRvIHRoZSByaWdodCBvZiB0aGUgdGV4dCB0byBiZSBkcmF3bi4gUGFpbnQKLSAgICAgKiBzaG91bGQgbm90IGhhdmUgYW4gQWxpZ24gdmFsdWUgb3RoZXIgdGhhbiBMRUZUIG9yIHBvc2l0aW9uaW5nIHdpbGwgZ2V0Ci0gICAgICogY29uZnVzZWQuCi0gICAgICoKLSAgICAgKiA8cD5PbiByZXR1cm4sIHdvcmtQYWludCB3aWxsIHJlZmxlY3QgdGhlIG9yaWdpbmFsIHBhaW50IHBsdXMgYW55Ci0gICAgICogbW9kaWZpY2F0aW9ucyBtYWRlIGJ5IGNoYXJhY3RlciBzdHlsZXMgb24gdGhlIHJ1bi4KLSAgICAgKgotICAgICAqIDxwPlRoZSByZXR1cm5lZCB3aWR0aCBpcyBzaWduZWQgYW5kIHdpbGwgYmUgPCAwIGlmIHRoZSBwYXJhZ3JhcGgKLSAgICAgKiBkaXJlY3Rpb24gaXMgcmlnaHQtdG8tbGVmdC4KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmbG9hdCBkcmF3VW5pZm9ybVJ1bihDYW52YXMgY2FudmFzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3Bhbm5lZCB0ZXh0LCBpbnQgc3RhcnQsIGludCBlbmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGlyLCBib29sZWFuIHJ1bklzUnRsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgeCwgaW50IHRvcCwgaW50IHksIGludCBib3R0b20sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYWludC5Gb250TWV0cmljc0ludCBmbWksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUZXh0UGFpbnQgcGFpbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUZXh0UGFpbnQgd29ya1BhaW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBuZWVkV2lkdGgpIHsKLQotICAgICAgICBib29sZWFuIGhhdmVXaWR0aCA9IGZhbHNlOwotICAgICAgICBmbG9hdCByZXQgPSAwOwotICAgICAgICBDaGFyYWN0ZXJTdHlsZVtdIHNwYW5zID0gdGV4dC5nZXRTcGFucyhzdGFydCwgZW5kLCBDaGFyYWN0ZXJTdHlsZS5jbGFzcyk7Ci0KLSAgICAgICAgUmVwbGFjZW1lbnRTcGFuIHJlcGxhY2VtZW50ID0gbnVsbDsKLQotICAgICAgICAvLyBYWFg6IFRoaXMgc2hvdWxkbid0IGJlIG1vZGlmeWluZyBwYWludCwgb25seSB3b3JrUGFpbnQuCi0gICAgICAgIC8vIEhvd2V2ZXIsIHRoZSBtZW1iZXJzIGJlbG9uZ2luZyB0byBUZXh0UGFpbnQgc2hvdWxkIGhhdmUgZGVmYXVsdAotICAgICAgICAvLyB2YWx1ZXMgYW55d2F5LiAgQmV0dGVyIHRvIGVuc3VyZSB0aGlzIGluIHRoZSBMYXlvdXQgY29uc3RydWN0b3IuCi0gICAgICAgIHBhaW50LmJnQ29sb3IgPSAwOwotICAgICAgICBwYWludC5iYXNlbGluZVNoaWZ0ID0gMDsKLSAgICAgICAgd29ya1BhaW50LnNldChwYWludCk7Ci0KLQkJaWYgKHNwYW5zLmxlbmd0aCA+IDApIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc3BhbnMubGVuZ3RoOyBpKyspIHsKLQkJCQlDaGFyYWN0ZXJTdHlsZSBzcGFuID0gc3BhbnNbaV07Ci0KLQkJCQlpZiAoc3BhbiBpbnN0YW5jZW9mIFJlcGxhY2VtZW50U3BhbikgewotCQkJCQlyZXBsYWNlbWVudCA9IChSZXBsYWNlbWVudFNwYW4pc3BhbjsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCXNwYW4udXBkYXRlRHJhd1N0YXRlKHdvcmtQYWludCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLSAgICAgICAgaWYgKHJlcGxhY2VtZW50ID09IG51bGwpIHsKLSAgICAgICAgICAgIENoYXJTZXF1ZW5jZSB0bXA7Ci0gICAgICAgICAgICBpbnQgdG1wc3RhcnQsIHRtcGVuZDsKLQotICAgICAgICAgICAgaWYgKHJ1bklzUnRsKSB7Ci0gICAgICAgICAgICAgICAgdG1wID0gVGV4dFV0aWxzLmdldFJldmVyc2UodGV4dCwgc3RhcnQsIGVuZCk7Ci0gICAgICAgICAgICAgICAgdG1wc3RhcnQgPSAwOwotICAgICAgICAgICAgICAgIC8vIFhYWDogYXNzdW1lcyBnZXRSZXZlcnNlIGRvZXNuJ3QgY2hhbmdlIHRoZSBsZW5ndGggb2YgdGhlIHRleHQKLSAgICAgICAgICAgICAgICB0bXBlbmQgPSBlbmQgLSBzdGFydDsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgdG1wID0gdGV4dDsKLSAgICAgICAgICAgICAgICB0bXBzdGFydCA9IHN0YXJ0OwotICAgICAgICAgICAgICAgIHRtcGVuZCA9IGVuZDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKGZtaSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgd29ya1BhaW50LmdldEZvbnRNZXRyaWNzSW50KGZtaSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChjYW52YXMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGlmICh3b3JrUGFpbnQuYmdDb2xvciAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGludCBjID0gd29ya1BhaW50LmdldENvbG9yKCk7Ci0gICAgICAgICAgICAgICAgICAgIFBhaW50LlN0eWxlIHMgPSB3b3JrUGFpbnQuZ2V0U3R5bGUoKTsKLSAgICAgICAgICAgICAgICAgICAgd29ya1BhaW50LnNldENvbG9yKHdvcmtQYWludC5iZ0NvbG9yKTsKLSAgICAgICAgICAgICAgICAgICAgd29ya1BhaW50LnNldFN0eWxlKFBhaW50LlN0eWxlLkZJTEwpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmICghaGF2ZVdpZHRoKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXQgPSB3b3JrUGFpbnQubWVhc3VyZVRleHQodG1wLCB0bXBzdGFydCwgdG1wZW5kKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGhhdmVXaWR0aCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBpZiAoZGlyID09IExheW91dC5ESVJfUklHSFRfVE9fTEVGVCkKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhbnZhcy5kcmF3UmVjdCh4IC0gcmV0LCB0b3AsIHgsIGJvdHRvbSwgd29ya1BhaW50KTsKLSAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgY2FudmFzLmRyYXdSZWN0KHgsIHRvcCwgeCArIHJldCwgYm90dG9tLCB3b3JrUGFpbnQpOwotCi0gICAgICAgICAgICAgICAgICAgIHdvcmtQYWludC5zZXRTdHlsZShzKTsKLSAgICAgICAgICAgICAgICAgICAgd29ya1BhaW50LnNldENvbG9yKGMpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChkaXIgPT0gTGF5b3V0LkRJUl9SSUdIVF9UT19MRUZUKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICghaGF2ZVdpZHRoKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXQgPSB3b3JrUGFpbnQubWVhc3VyZVRleHQodG1wLCB0bXBzdGFydCwgdG1wZW5kKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGhhdmVXaWR0aCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBjYW52YXMuZHJhd1RleHQodG1wLCB0bXBzdGFydCwgdG1wZW5kLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeCAtIHJldCwgeSArIHdvcmtQYWludC5iYXNlbGluZVNoaWZ0LCB3b3JrUGFpbnQpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChuZWVkV2lkdGgpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaGF2ZVdpZHRoKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0ID0gd29ya1BhaW50Lm1lYXN1cmVUZXh0KHRtcCwgdG1wc3RhcnQsIHRtcGVuZCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaGF2ZVdpZHRoID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGNhbnZhcy5kcmF3VGV4dCh0bXAsIHRtcHN0YXJ0LCB0bXBlbmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4LCB5ICsgd29ya1BhaW50LmJhc2VsaW5lU2hpZnQsIHdvcmtQYWludCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBpZiAobmVlZFdpZHRoICYmICFoYXZlV2lkdGgpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0ID0gd29ya1BhaW50Lm1lYXN1cmVUZXh0KHRtcCwgdG1wc3RhcnQsIHRtcGVuZCk7Ci0gICAgICAgICAgICAgICAgICAgIGhhdmVXaWR0aCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0ID0gcmVwbGFjZW1lbnQuZ2V0U2l6ZSh3b3JrUGFpbnQsIHRleHQsIHN0YXJ0LCBlbmQsIGZtaSk7Ci0KLSAgICAgICAgICAgIGlmIChjYW52YXMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGlmIChkaXIgPT0gTGF5b3V0LkRJUl9SSUdIVF9UT19MRUZUKQotICAgICAgICAgICAgICAgICAgICByZXBsYWNlbWVudC5kcmF3KGNhbnZhcywgdGV4dCwgc3RhcnQsIGVuZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4IC0gcmV0LCB0b3AsIHksIGJvdHRvbSwgd29ya1BhaW50KTsKLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIHJlcGxhY2VtZW50LmRyYXcoY2FudmFzLCB0ZXh0LCBzdGFydCwgZW5kLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHgsIHRvcCwgeSwgYm90dG9tLCB3b3JrUGFpbnQpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGRpciA9PSBMYXlvdXQuRElSX1JJR0hUX1RPX0xFRlQpCi0gICAgICAgICAgICByZXR1cm4gLXJldDsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgcmV0dXJuIHJldDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBhZHZhbmNlIHdpZHRocyBmb3IgYSB1bmlmb3JtIGxlZnQtdG8tcmlnaHQgcnVuIG9mIHRleHQgd2l0aAotICAgICAqIG5vIHN0eWxlIGNoYW5nZXMgaW4gdGhlIG1pZGRsZSBvZiB0aGUgcnVuLiBJZiBhbnkgc3R5bGUgaXMgcmVwbGFjZW1lbnQKLSAgICAgKiB0ZXh0LCB0aGUgZmlyc3QgY2hhcmFjdGVyIHdpbGwgZ2V0IHRoZSB3aWR0aCBvZiB0aGUgcmVwbGFjZW1lbnQgYW5kIHRoZQotICAgICAqIHJlbWFpbmluZyBjaGFyYWN0ZXJzIHdpbGwgZ2V0IGEgd2lkdGggb2YgMC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gcGFpbnQgdGhlIHBhaW50LCB3aWxsIG5vdCBiZSBtb2RpZmllZAotICAgICAqIEBwYXJhbSB3b3JrUGFpbnQgYSBwYWludCB0byBtb2RpZnk7IG9uIHJldHVybiB3aWxsIHJlZmxlY3QgdGhlIG9yaWdpbmFsCi0gICAgICogICAgICAgIHBhaW50IHBsdXMgdGhlIGVmZmVjdCBvZiBhbGwgc3BhbnMgb24gdGhlIHJ1bgotICAgICAqIEBwYXJhbSB0ZXh0IHRoZSB0ZXh0Ci0gICAgICogQHBhcmFtIHN0YXJ0IHRoZSBzdGFydCBvZiB0aGUgcnVuCi0gICAgICogQHBhcmFtIGVuZCB0aGUgbGltaXQgb2YgdGhlIHJ1bgotICAgICAqIEBwYXJhbSB3aWR0aHMgYXJyYXkgdG8gcmVjZWl2ZSB0aGUgYWR2YW5jZSB3aWR0aHMgb2YgdGhlIGNoYXJhY3RlcnMuIE11c3QKLSAgICAgKiAgICAgICAgYmUgYXQgbGVhc3QgYSBsYXJnZSBhcyAoZW5kIC0gc3RhcnQpLgotICAgICAqIEBwYXJhbSBmbWkgRm9udE1ldHJpY3MgaW5mb3JtYXRpb247IGNhbiBiZSBudWxsCi0gICAgICogQHJldHVybiB0aGUgYWN0dWFsIG51bWJlciBvZiB3aWR0aHMgcmV0dXJuZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGludCBnZXRUZXh0V2lkdGhzKFRleHRQYWludCBwYWludCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRleHRQYWludCB3b3JrUGFpbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTcGFubmVkIHRleHQsIGludCBzdGFydCwgaW50IGVuZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0W10gd2lkdGhzLCBQYWludC5Gb250TWV0cmljc0ludCBmbWkpIHsKLSAgICAgICAgTWV0cmljQWZmZWN0aW5nU3BhbltdIHNwYW5zID0KLSAgICAgICAgICAgIHRleHQuZ2V0U3BhbnMoc3RhcnQsIGVuZCwgTWV0cmljQWZmZWN0aW5nU3Bhbi5jbGFzcyk7Ci0KLQkJUmVwbGFjZW1lbnRTcGFuIHJlcGxhY2VtZW50ID0gbnVsbDsKLSAgICAgICAgd29ya1BhaW50LnNldChwYWludCk7Ci0JCQotCQlmb3IgKGludCBpID0gMDsgaSA8IHNwYW5zLmxlbmd0aDsgaSsrKSB7Ci0JCQlNZXRyaWNBZmZlY3RpbmdTcGFuIHNwYW4gPSBzcGFuc1tpXTsKLQkJCWlmIChzcGFuIGluc3RhbmNlb2YgUmVwbGFjZW1lbnRTcGFuKSB7Ci0JCQkJcmVwbGFjZW1lbnQgPSAoUmVwbGFjZW1lbnRTcGFuKXNwYW47Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlzcGFuLnVwZGF0ZU1lYXN1cmVTdGF0ZSh3b3JrUGFpbnQpOwotCQkJfQotCQl9Ci0JCi0gICAgICAgIGludCByZXN1bHQ7Ci0gICAgICAgIGlmIChyZXBsYWNlbWVudCA9PSBudWxsKSB7Ci0gICAgICAgICAgICB3b3JrUGFpbnQuZ2V0Rm9udE1ldHJpY3NJbnQoZm1pKTsKLSAgICAgICAgICAgIHJlc3VsdCA9IHdvcmtQYWludC5nZXRUZXh0V2lkdGhzKHRleHQsIHN0YXJ0LCBlbmQsIHdpZHRocyk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpbnQgd2lkID0gcmVwbGFjZW1lbnQuZ2V0U2l6ZSh3b3JrUGFpbnQsIHRleHQsIHN0YXJ0LCBlbmQsIGZtaSk7Ci0KLSAgICAgICAgICAgIGlmIChlbmQgPiBzdGFydCkgewotICAgICAgICAgICAgICAgIHdpZHRoc1swXSA9IHdpZDsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gc3RhcnQgKyAxOyBpIDwgZW5kOyBpKyspCi0gICAgICAgICAgICAgICAgICAgIHdpZHRoc1tpIC0gc3RhcnRdID0gMDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJlc3VsdCA9IGVuZCAtIHN0YXJ0OwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVuZGVycyBhbmQvb3IgbWVhc3VyZXMgYSBkaXJlY3Rpb25hbCBydW4gb2YgdGV4dCBvbiBhIHNpbmdsZSBsaW5lLgotICAgICAqIFVubGlrZSB7QGxpbmsgI2RyYXdVbmlmb3JtUnVufSwgdGhpcyBjYW4gcmVuZGVyIHJ1bnMgdGhhdCBjcm9zcyBzdHlsZQotICAgICAqIGJvdW5kYXJpZXMuICBSZXR1cm5zIHRoZSBzaWduZWQgYWR2YW5jZSB3aWR0aCwgaWYgcmVxdWVzdGVkLgotICAgICAqCi0gICAgICogPHA+VGhlIHggcG9zaXRpb24gaXMgdGhlIGxlYWRpbmcgZWRnZSBvZiB0aGUgdGV4dC4gSW4gYSByaWdodC10by1sZWZ0Ci0gICAgICogcGFyYWdyYXBoLCB0aGlzIHdpbGwgYmUgdG8gdGhlIHJpZ2h0IG9mIHRoZSB0ZXh0IHRvIGJlIGRyYXduLiBQYWludAotICAgICAqIHNob3VsZCBub3QgaGF2ZSBhbiBBbGlnbiB2YWx1ZSBvdGhlciB0aGFuIExFRlQgb3IgcG9zaXRpb25pbmcgd2lsbCBnZXQKLSAgICAgKiBjb25mdXNlZC4KLSAgICAgKgotICAgICAqIDxwPlRoaXMgb3B0aW1pemVzIGZvciB1bnN0eWxlZCB0ZXh0IGFuZCBzbyB3b3JrUGFpbnQgbWlnaHQgbm90IGJlCi0gICAgICogbW9kaWZpZWQgYnkgdGhpcyBjYWxsLgotICAgICAqCi0gICAgICogPHA+VGhlIHJldHVybmVkIGFkdmFuY2Ugd2lkdGggd2lsbCBiZSA8IDAgaWYgdGhlIHBhcmFncmFwaAotICAgICAqIGRpcmVjdGlvbiBpcyByaWdodC10by1sZWZ0LgotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGZsb2F0IGRyYXdEaXJlY3Rpb25hbFJ1bihDYW52YXMgY2FudmFzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hhclNlcXVlbmNlIHRleHQsIGludCBzdGFydCwgaW50IGVuZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkaXIsIGJvb2xlYW4gcnVuSXNSdGwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCB4LCBpbnQgdG9wLCBpbnQgeSwgaW50IGJvdHRvbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhaW50LkZvbnRNZXRyaWNzSW50IGZtaSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRleHRQYWludCBwYWludCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRleHRQYWludCB3b3JrUGFpbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIG5lZWRXaWR0aCkgewotCi0gICAgICAgIC8vIFhYWDogSXQgbG9va3MgbGlrZSBhbGwgY2FsbHMgdG8gdGhpcyBBUEkgbWF0Y2ggZGlyIGFuZCBydW5Jc1J0bCwgc28KLSAgICAgICAgLy8gaGF2aW5nIGJvdGggcGFyYW1ldGVycyBpcyByZWR1bmRhbnQgYW5kIGNvbmZ1c2luZy4KLQotICAgICAgICAvLyBmYXN0IHBhdGggZm9yIHVuc3R5bGVkIHRleHQKLSAgICAgICAgaWYgKCEodGV4dCBpbnN0YW5jZW9mIFNwYW5uZWQpKSB7Ci0gICAgICAgICAgICBmbG9hdCByZXQgPSAwOwotCi0gICAgICAgICAgICBpZiAocnVuSXNSdGwpIHsKLSAgICAgICAgICAgICAgICBDaGFyU2VxdWVuY2UgdG1wID0gVGV4dFV0aWxzLmdldFJldmVyc2UodGV4dCwgc3RhcnQsIGVuZCk7Ci0gICAgICAgICAgICAgICAgLy8gWFhYOiB0aGlzIGFzc3VtZXMgZ2V0UmV2ZXJzZSBkb2Vzbid0IHR3ZWFrIHRoZSBsZW5ndGggb2YKLSAgICAgICAgICAgICAgICAvLyB0aGUgdGV4dAotICAgICAgICAgICAgICAgIGludCB0bXBlbmQgPSBlbmQgLSBzdGFydDsKLQotICAgICAgICAgICAgICAgIGlmIChjYW52YXMgIT0gbnVsbCB8fCBuZWVkV2lkdGgpCi0gICAgICAgICAgICAgICAgICAgIHJldCA9IHBhaW50Lm1lYXN1cmVUZXh0KHRtcCwgMCwgdG1wZW5kKTsKLQotICAgICAgICAgICAgICAgIGlmIChjYW52YXMgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgY2FudmFzLmRyYXdUZXh0KHRtcCwgMCwgdG1wZW5kLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeCAtIHJldCwgeSwgcGFpbnQpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBpZiAobmVlZFdpZHRoKQotICAgICAgICAgICAgICAgICAgICByZXQgPSBwYWludC5tZWFzdXJlVGV4dCh0ZXh0LCBzdGFydCwgZW5kKTsKLQotICAgICAgICAgICAgICAgIGlmIChjYW52YXMgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgY2FudmFzLmRyYXdUZXh0KHRleHQsIHN0YXJ0LCBlbmQsIHgsIHksIHBhaW50KTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKGZtaSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcGFpbnQuZ2V0Rm9udE1ldHJpY3NJbnQoZm1pKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmV0dXJuIHJldCAqIGRpcjsgICAvLyBMYXlvdXQuRElSX1JJR0hUX1RPX0xFRlQgPT0gLTEKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgZmxvYXQgb3ggPSB4OwotICAgICAgICBpbnQgbWluQXNjZW50ID0gMCwgbWF4RGVzY2VudCA9IDAsIG1pblRvcCA9IDAsIG1heEJvdHRvbSA9IDA7Ci0KLSAgICAgICAgU3Bhbm5lZCBzcCA9IChTcGFubmVkKSB0ZXh0OwotICAgICAgICBDbGFzczw/PiBkaXZpc2lvbjsKLQotICAgICAgICBpZiAoY2FudmFzID09IG51bGwpCi0gICAgICAgICAgICBkaXZpc2lvbiA9IE1ldHJpY0FmZmVjdGluZ1NwYW4uY2xhc3M7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIGRpdmlzaW9uID0gQ2hhcmFjdGVyU3R5bGUuY2xhc3M7Ci0KLSAgICAgICAgaW50IG5leHQ7Ci0gICAgICAgIGZvciAoaW50IGkgPSBzdGFydDsgaSA8IGVuZDsgaSA9IG5leHQpIHsKLSAgICAgICAgICAgIG5leHQgPSBzcC5uZXh0U3BhblRyYW5zaXRpb24oaSwgZW5kLCBkaXZpc2lvbik7Ci0KLSAgICAgICAgICAgIC8vIFhYWDogaWYgZGlyIGFuZCBydW5Jc1J0bCB3ZXJlIG5vdCB0aGUgc2FtZSwgdGhpcyB3b3VsZCBkcmF3Ci0gICAgICAgICAgICAvLyBzcGFucyBpbiB0aGUgd3Jvbmcgb3JkZXIsIGJ1dCBubyBvbmUgYXBwZWFycyB0byBjYWxsIGl0IHRoaXMKLSAgICAgICAgICAgIC8vIHdheS4KLSAgICAgICAgICAgIHggKz0gZHJhd1VuaWZvcm1SdW4oY2FudmFzLCBzcCwgaSwgbmV4dCwgZGlyLCBydW5Jc1J0bCwKLSAgICAgICAgICAgICAgICAgIHgsIHRvcCwgeSwgYm90dG9tLCBmbWksIHBhaW50LCB3b3JrUGFpbnQsCi0gICAgICAgICAgICAgICAgICBuZWVkV2lkdGggfHwgbmV4dCAhPSBlbmQpOwotCi0gICAgICAgICAgICBpZiAoZm1pICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBpZiAoZm1pLmFzY2VudCA8IG1pbkFzY2VudCkKLSAgICAgICAgICAgICAgICAgICAgbWluQXNjZW50ID0gZm1pLmFzY2VudDsKLSAgICAgICAgICAgICAgICBpZiAoZm1pLmRlc2NlbnQgPiBtYXhEZXNjZW50KQotICAgICAgICAgICAgICAgICAgICBtYXhEZXNjZW50ID0gZm1pLmRlc2NlbnQ7Ci0KLSAgICAgICAgICAgICAgICBpZiAoZm1pLnRvcCA8IG1pblRvcCkKLSAgICAgICAgICAgICAgICAgICAgbWluVG9wID0gZm1pLnRvcDsKLSAgICAgICAgICAgICAgICBpZiAoZm1pLmJvdHRvbSA+IG1heEJvdHRvbSkKLSAgICAgICAgICAgICAgICAgICAgbWF4Qm90dG9tID0gZm1pLmJvdHRvbTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmIChmbWkgIT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKHN0YXJ0ID09IGVuZCkgewotICAgICAgICAgICAgICAgIHBhaW50LmdldEZvbnRNZXRyaWNzSW50KGZtaSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGZtaS5hc2NlbnQgPSBtaW5Bc2NlbnQ7Ci0gICAgICAgICAgICAgICAgZm1pLmRlc2NlbnQgPSBtYXhEZXNjZW50OwotICAgICAgICAgICAgICAgIGZtaS50b3AgPSBtaW5Ub3A7Ci0gICAgICAgICAgICAgICAgZm1pLmJvdHRvbSA9IG1heEJvdHRvbTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiB4IC0gb3g7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRHJhd3MgYSB1bmlkaXJlY3Rpb25hbCBydW4gb2YgdGV4dCBvbiBhIHNpbmdsZSBsaW5lLCBhbmQgb3B0aW9uYWxseQotICAgICAqIHJldHVybnMgdGhlIHNpZ25lZCBhZHZhbmNlLiAgVW5saWtlIGRyYXdEaXJlY3Rpb25hbFJ1biwgdGhlIHBhcmFncmFwaAotICAgICAqIGRpcmVjdGlvbiBhbmQgcnVuIGRpcmVjdGlvbiBjYW4gYmUgZGlmZmVyZW50LgotICAgICAqLwotICAgIC8qIHBhY2thZ2UgKi8gc3RhdGljIGZsb2F0IGRyYXdUZXh0KENhbnZhcyBjYW52YXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGFyU2VxdWVuY2UgdGV4dCwgaW50IHN0YXJ0LCBpbnQgZW5kLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRpciwgYm9vbGVhbiBydW5Jc1J0bCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHgsIGludCB0b3AsIGludCB5LCBpbnQgYm90dG9tLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGV4dFBhaW50IHBhaW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGV4dFBhaW50IHdvcmtQYWludCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gbmVlZFdpZHRoKSB7Ci0gICAgICAgIC8vIFhYWCB0aGlzIGxvZ2ljIGlzIChkaXIgPT0gRElSX0xFRlRfVE9fUklHSFQpID09IHJ1bklzUnRsCi0gICAgICAgIGlmICgoZGlyID09IExheW91dC5ESVJfUklHSFRfVE9fTEVGVCAmJiAhcnVuSXNSdGwpIHx8Ci0gICAgICAgICAgICAocnVuSXNSdGwgJiYgZGlyID09IExheW91dC5ESVJfTEVGVF9UT19SSUdIVCkpIHsKLSAgICAgICAgICAgIC8vIFRPRE86IHRoaXMgbmVlZHMgdGhlIHJlYWwgZGlyZWN0aW9uCi0gICAgICAgICAgICBmbG9hdCBjaCA9IGRyYXdEaXJlY3Rpb25hbFJ1bihudWxsLCB0ZXh0LCBzdGFydCwgZW5kLAotICAgICAgICAgICAgICAgICAgICBMYXlvdXQuRElSX0xFRlRfVE9fUklHSFQsIGZhbHNlLCAwLCAwLCAwLCAwLCBudWxsLCBwYWludCwKLSAgICAgICAgICAgICAgICAgICAgd29ya1BhaW50LCB0cnVlKTsKLQotICAgICAgICAgICAgY2ggKj0gZGlyOyAgLy8gRElSX1JJR0hUX1RPX0xFRlQgPT0gLTEKLSAgICAgICAgICAgIGRyYXdEaXJlY3Rpb25hbFJ1bihjYW52YXMsIHRleHQsIHN0YXJ0LCBlbmQsIC1kaXIsCi0gICAgICAgICAgICAgICAgICAgIHJ1bklzUnRsLCB4ICsgY2gsIHRvcCwgeSwgYm90dG9tLCBudWxsLCBwYWludCwKLSAgICAgICAgICAgICAgICAgICAgd29ya1BhaW50LCB0cnVlKTsKLQotICAgICAgICAgICAgcmV0dXJuIGNoOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGRyYXdEaXJlY3Rpb25hbFJ1bihjYW52YXMsIHRleHQsIHN0YXJ0LCBlbmQsIGRpciwgcnVuSXNSdGwsCi0gICAgICAgICAgICAgICAgICAgICAgIHgsIHRvcCwgeSwgYm90dG9tLCBudWxsLCBwYWludCwgd29ya1BhaW50LAotICAgICAgICAgICAgICAgICAgICAgICBuZWVkV2lkdGgpOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBEcmF3cyBhIHJ1biBvZiB0ZXh0IG9uIGEgc2luZ2xlIGxpbmUsIHdpdGggaXRzCi0gICAgICogb3JpZ2luIGF0ICh4LHkpLCBpbiB0aGUgc3BlY2lmaWVkIFBhaW50LiBUaGUgb3JpZ2luIGlzIGludGVycHJldGVkIGJhc2VkCi0gICAgICogb24gdGhlIEFsaWduIHNldHRpbmcgaW4gdGhlIFBhaW50LgotICAgICAqCi0gICAgICogVGhpcyBtZXRob2QgY29uc2lkZXJzIHN0eWxlIGluZm9ybWF0aW9uIGluIHRoZSB0ZXh0IChlLmcuIGV2ZW4gd2hlbiB0ZXh0Ci0gICAgICogaXMgYW4gaW5zdGFuY2Ugb2Yge0BsaW5rIGFuZHJvaWQudGV4dC5TcGFubmVkfSwgdGhpcyBtZXRob2QgY29ycmVjdGx5Ci0gICAgICogZHJhd3MgdGhlIHRleHQpLiBTZWUgYWxzbwotICAgICAqIHtAbGluayBhbmRyb2lkLmdyYXBoaWNzLkNhbnZhcyNkcmF3VGV4dChDaGFyU2VxdWVuY2UsIGludCwgaW50LCBmbG9hdCwKLSAgICAgKiBmbG9hdCwgUGFpbnQpfSBhbmQKLSAgICAgKiB7QGxpbmsgYW5kcm9pZC5ncmFwaGljcy5DYW52YXMjZHJhd1JlY3QoZmxvYXQsIGZsb2F0LCBmbG9hdCwgZmxvYXQsCi0gICAgICogUGFpbnQpfS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gY2FudmFzIFRoZSB0YXJnZXQgY2FudmFzCi0gICAgICogQHBhcmFtIHRleHQgVGhlIHRleHQgdG8gYmUgZHJhd24KLSAgICAgKiBAcGFyYW0gc3RhcnQgVGhlIGluZGV4IG9mIHRoZSBmaXJzdCBjaGFyYWN0ZXIgaW4gdGV4dCB0byBkcmF3Ci0gICAgICogQHBhcmFtIGVuZCAoZW5kIC0gMSkgaXMgdGhlIGluZGV4IG9mIHRoZSBsYXN0IGNoYXJhY3RlciBpbiB0ZXh0IHRvIGRyYXcKLSAgICAgKiBAcGFyYW0gZGlyZWN0aW9uIFRoZSBkaXJlY3Rpb24gb2YgdGhlIHRleHQuIFRoaXMgbXVzdCBiZQotICAgICAqICAgICAgICB7QGxpbmsgYW5kcm9pZC50ZXh0LkxheW91dCNESVJfTEVGVF9UT19SSUdIVH0gb3IKLSAgICAgKiAgICAgICAge0BsaW5rIGFuZHJvaWQudGV4dC5MYXlvdXQjRElSX1JJR0hUX1RPX0xFRlR9LgotICAgICAqIEBwYXJhbSB4IFRoZSB4LWNvb3JkaW5hdGUgb2Ygb3JpZ2luIGZvciB3aGVyZSB0byBkcmF3IHRoZSB0ZXh0Ci0gICAgICogQHBhcmFtIHRvcCBUaGUgdG9wIHNpZGUgb2YgdGhlIHJlY3RhbmdsZSB0byBiZSBkcmF3bgotICAgICAqIEBwYXJhbSB5IFRoZSB5LWNvb3JkaW5hdGUgb2Ygb3JpZ2luIGZvciB3aGVyZSB0byBkcmF3IHRoZSB0ZXh0Ci0gICAgICogQHBhcmFtIGJvdHRvbSBUaGUgYm90dG9tIHNpZGUgb2YgdGhlIHJlY3RhbmdsZSB0byBiZSBkcmF3bgotICAgICAqIEBwYXJhbSBwYWludCBUaGUgbWFpbiB7QGxpbmsgVGV4dFBhaW50fSBvYmplY3QuCi0gICAgICogQHBhcmFtIHdvcmtQYWludCBUaGUge0BsaW5rIFRleHRQYWludH0gb2JqZWN0IHVzZWQgZm9yIHRlbXBvcmFsCi0gICAgICogICAgICAgIHdvcmtzcGFjZS4KLSAgICAgKiBAcGFyYW0gbmVlZFdpZHRoIElmIHRydWUsIHRoaXMgbWV0aG9kIHJldHVybnMgdGhlIHdpZHRoIG9mIGRyYXduIHRleHQKLSAgICAgKiBAcmV0dXJuIFdpZHRoIG9mIHRoZSBkcmF3biB0ZXh0IGlmIG5lZWRXaWR0aCBpcyB0cnVlCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmbG9hdCBkcmF3VGV4dChDYW52YXMgY2FudmFzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hhclNlcXVlbmNlIHRleHQsIGludCBzdGFydCwgaW50IGVuZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkaXJlY3Rpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCB4LCBpbnQgdG9wLCBpbnQgeSwgaW50IGJvdHRvbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRleHRQYWludCBwYWludCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRleHRQYWludCB3b3JrUGFpbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIG5lZWRXaWR0aCkgewotICAgICAgICAvLyBGb3Igc2FmZXR5LgotICAgICAgICBkaXJlY3Rpb24gPSBkaXJlY3Rpb24gPj0gMCA/IExheW91dC5ESVJfTEVGVF9UT19SSUdIVAotICAgICAgICAgICAgICAgIDogTGF5b3V0LkRJUl9SSUdIVF9UT19MRUZUOwotCi0gICAgICAgIC8vIEhpZGUgcnVuSXNSdGwgcGFyYW1ldGVyIHNpbmNlIGl0IGlzIG1lYW5pbmdsZXNzIGZvciBleHRlcm5hbAotICAgICAgICAvLyBkZXZlbG9wZXJzLgotICAgICAgICAvLyBYWFg6IHRoZSBydW5Jc1J0bCBwcm9iYWJseSBvdWdodCB0byBiZSB0aGUgc2FtZSBhcyBkaXJlY3Rpb24sIHRoZW4KLSAgICAgICAgLy8gdGhpcyBjb3VsZCBkcmF3IHJ0bCB0ZXh0LgotICAgICAgICByZXR1cm4gZHJhd1RleHQoY2FudmFzLCB0ZXh0LCBzdGFydCwgZW5kLCBkaXJlY3Rpb24sIGZhbHNlLAotICAgICAgICAgICAgICAgICAgICAgICAgeCwgdG9wLCB5LCBib3R0b20sIHBhaW50LCB3b3JrUGFpbnQsIG5lZWRXaWR0aCk7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHdpZHRoIG9mIGEgcnVuIG9mIGxlZnQtdG8tcmlnaHQgdGV4dCBvbiBhIHNpbmdsZSBsaW5lLAotICAgICAqIGNvbnNpZGVyaW5nIHN0eWxlIGluZm9ybWF0aW9uIGluIHRoZSB0ZXh0IChlLmcuIGV2ZW4gd2hlbiB0ZXh0IGlzIGFuCi0gICAgICogaW5zdGFuY2Ugb2Yge0BsaW5rIGFuZHJvaWQudGV4dC5TcGFubmVkfSwgdGhpcyBtZXRob2QgY29ycmVjdGx5IG1lYXN1cmVzCi0gICAgICogdGhlIHdpZHRoIG9mIHRoZSB0ZXh0KS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gcGFpbnQgdGhlIG1haW4ge0BsaW5rIFRleHRQYWludH0gb2JqZWN0OyB3aWxsIG5vdCBiZSBtb2RpZmllZAotICAgICAqIEBwYXJhbSB3b3JrUGFpbnQgdGhlIHtAbGluayBUZXh0UGFpbnR9IG9iamVjdCBhdmFpbGFibGUgZm9yIG1vZGlmaWNhdGlvbjsKLSAgICAgKiAgICAgICAgd2lsbCBub3QgbmVjZXNzYXJpbHkgYmUgdXNlZAotICAgICAqIEBwYXJhbSB0ZXh0IHRoZSB0ZXh0IHRvIG1lYXN1cmUKLSAgICAgKiBAcGFyYW0gc3RhcnQgdGhlIGluZGV4IG9mIHRoZSBmaXJzdCBjaGFyYWN0ZXIgdG8gc3RhcnQgbWVhc3VyaW5nCi0gICAgICogQHBhcmFtIGVuZCAxIGJleW9uZCB0aGUgaW5kZXggb2YgdGhlIGxhc3QgY2hhcmFjdGVyIHRvIG1lYXN1cmUKLSAgICAgKiBAcGFyYW0gZm1pIEZvbnRNZXRyaWNzIGluZm9ybWF0aW9uOyBjYW4gYmUgbnVsbAotICAgICAqIEByZXR1cm4gVGhlIHdpZHRoIG9mIHRoZSB0ZXh0Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmbG9hdCBtZWFzdXJlVGV4dChUZXh0UGFpbnQgcGFpbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUZXh0UGFpbnQgd29ya1BhaW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hhclNlcXVlbmNlIHRleHQsIGludCBzdGFydCwgaW50IGVuZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhaW50LkZvbnRNZXRyaWNzSW50IGZtaSkgewotICAgICAgICByZXR1cm4gZHJhd0RpcmVjdGlvbmFsUnVuKG51bGwsIHRleHQsIHN0YXJ0LCBlbmQsCi0gICAgICAgICAgICAgICAgICAgICAgIExheW91dC5ESVJfTEVGVF9UT19SSUdIVCwgZmFsc2UsCi0gICAgICAgICAgICAgICAgICAgICAgIDAsIDAsIDAsIDAsIGZtaSwgcGFpbnQsIHdvcmtQYWludCwgdHJ1ZSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvdGV4dC9UZXh0TGluZS5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvdGV4dC9UZXh0TGluZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJmNzQ4MmMKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2phdmEvYW5kcm9pZC90ZXh0L1RleHRMaW5lLmphdmEKQEAgLTAsMCArMSw5NDAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQudGV4dDsKKworaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnV0aWwuQXJyYXlVdGlsczsKKworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQ2FudmFzOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUGFpbnQ7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5QYWludC5Gb250TWV0cmljc0ludDsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlJlY3RGOworaW1wb3J0IGFuZHJvaWQudGV4dC5MYXlvdXQuRGlyZWN0aW9uczsKK2ltcG9ydCBhbmRyb2lkLnRleHQuTGF5b3V0LlRhYlN0b3BzOworaW1wb3J0IGFuZHJvaWQudGV4dC5zdHlsZS5DaGFyYWN0ZXJTdHlsZTsKK2ltcG9ydCBhbmRyb2lkLnRleHQuc3R5bGUuTWV0cmljQWZmZWN0aW5nU3BhbjsKK2ltcG9ydCBhbmRyb2lkLnRleHQuc3R5bGUuUmVwbGFjZW1lbnRTcGFuOworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CisKKy8qKgorICogUmVwcmVzZW50cyBhIGxpbmUgb2Ygc3R5bGVkIHRleHQsIGZvciBtZWFzdXJpbmcgaW4gdmlzdWFsIG9yZGVyIGFuZAorICogZm9yIHJlbmRlcmluZy4KKyAqCisgKiA8cD5HZXQgYSBuZXcgaW5zdGFuY2UgdXNpbmcgb2J0YWluKCksIGFuZCB3aGVuIGZpbmlzaGVkIHdpdGggaXQsIHJldHVybiBpdAorICogdG8gdGhlIHBvb2wgdXNpbmcgcmVjeWNsZSgpLgorICoKKyAqIDxwPkNhbGwgc2V0IHRvIHByZXBhcmUgdGhlIGluc3RhbmNlIGZvciB1c2UsIHRoZW4gZWl0aGVyIGRyYXcsIG1lYXN1cmUsCisgKiBtZXRyaWNzLCBvciBjYXJldFRvTGVmdFJpZ2h0T2YuCisgKgorICogQGhpZGUKKyAqLworY2xhc3MgVGV4dExpbmUgeworICAgIHByaXZhdGUgVGV4dFBhaW50IG1QYWludDsKKyAgICBwcml2YXRlIENoYXJTZXF1ZW5jZSBtVGV4dDsKKyAgICBwcml2YXRlIGludCBtU3RhcnQ7CisgICAgcHJpdmF0ZSBpbnQgbUxlbjsKKyAgICBwcml2YXRlIGludCBtRGlyOworICAgIHByaXZhdGUgRGlyZWN0aW9ucyBtRGlyZWN0aW9uczsKKyAgICBwcml2YXRlIGJvb2xlYW4gbUhhc1RhYnM7CisgICAgcHJpdmF0ZSBUYWJTdG9wcyBtVGFiczsKKyAgICBwcml2YXRlIGNoYXJbXSBtQ2hhcnM7CisgICAgcHJpdmF0ZSBib29sZWFuIG1DaGFyc1ZhbGlkOworICAgIHByaXZhdGUgU3Bhbm5lZCBtU3Bhbm5lZDsKKyAgICBwcml2YXRlIGZpbmFsIFRleHRQYWludCBtV29ya1BhaW50ID0gbmV3IFRleHRQYWludCgpOworCisgICAgcHJpdmF0ZSBzdGF0aWMgVGV4dExpbmVbXSBjYWNoZWQgPSBuZXcgVGV4dExpbmVbM107CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGEgbmV3IFRleHRMaW5lIGZyb20gdGhlIHNoYXJlZCBwb29sLgorICAgICAqCisgICAgICogQHJldHVybiBhbiB1bmluaXRpYWxpemVkIFRleHRMaW5lCisgICAgICovCisgICAgc3RhdGljIFRleHRMaW5lIG9idGFpbigpIHsKKyAgICAgICAgVGV4dExpbmUgdGw7CisgICAgICAgIHN5bmNocm9uaXplZCAoY2FjaGVkKSB7CisgICAgICAgICAgICBmb3IgKGludCBpID0gY2FjaGVkLmxlbmd0aDsgLS1pID49IDA7KSB7CisgICAgICAgICAgICAgICAgaWYgKGNhY2hlZFtpXSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIHRsID0gY2FjaGVkW2ldOworICAgICAgICAgICAgICAgICAgICBjYWNoZWRbaV0gPSBudWxsOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHRsID0gbmV3IFRleHRMaW5lKCk7CisgICAgICAgIExvZy52KCJUTElORSIsICJuZXc6ICIgKyB0bCk7CisgICAgICAgIHJldHVybiB0bDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQdXRzIGEgVGV4dExpbmUgYmFjayBpbnRvIHRoZSBzaGFyZWQgcG9vbC4gRG8gbm90IHVzZSB0aGlzIFRleHRMaW5lIG9uY2UKKyAgICAgKiBpdCBoYXMgYmVlbiByZXR1cm5lZC4KKyAgICAgKiBAcGFyYW0gdGwgdGhlIHRleHRMaW5lCisgICAgICogQHJldHVybiBudWxsLCBhcyBhIGNvbnZlbmllbmNlIGZyb20gY2xlYXJpbmcgcmVmZXJlbmNlcyB0byB0aGUgcHJvdmlkZWQKKyAgICAgKiBUZXh0TGluZQorICAgICAqLworICAgIHN0YXRpYyBUZXh0TGluZSByZWN5Y2xlKFRleHRMaW5lIHRsKSB7CisgICAgICAgIHRsLm1UZXh0ID0gbnVsbDsKKyAgICAgICAgdGwubVBhaW50ID0gbnVsbDsKKyAgICAgICAgdGwubURpcmVjdGlvbnMgPSBudWxsOworICAgICAgICBpZiAodGwubUxlbiA8IDI1MCkgeworICAgICAgICAgICAgc3luY2hyb25pemVkKGNhY2hlZCkgeworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2FjaGVkLmxlbmd0aDsgKytpKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChjYWNoZWRbaV0gPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FjaGVkW2ldID0gdGw7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJbml0aWFsaXplcyBhIFRleHRMaW5lIGFuZCBwcmVwYXJlcyBpdCBmb3IgdXNlLgorICAgICAqCisgICAgICogQHBhcmFtIHBhaW50IHRoZSBiYXNlIHBhaW50IGZvciB0aGUgbGluZQorICAgICAqIEBwYXJhbSB0ZXh0IHRoZSB0ZXh0LCBjYW4gYmUgU3R5bGVkCisgICAgICogQHBhcmFtIHN0YXJ0IHRoZSBzdGFydCBvZiB0aGUgbGluZSByZWxhdGl2ZSB0byB0aGUgdGV4dAorICAgICAqIEBwYXJhbSBsaW1pdCB0aGUgbGltaXQgb2YgdGhlIGxpbmUgcmVsYXRpdmUgdG8gdGhlIHRleHQKKyAgICAgKiBAcGFyYW0gZGlyIHRoZSBwYXJhZ3JhcGggZGlyZWN0aW9uIG9mIHRoaXMgbGluZQorICAgICAqIEBwYXJhbSBkaXJlY3Rpb25zIHRoZSBkaXJlY3Rpb25zIGluZm9ybWF0aW9uIG9mIHRoaXMgbGluZQorICAgICAqIEBwYXJhbSBoYXNUYWJzIHRydWUgaWYgdGhlIGxpbmUgbWlnaHQgY29udGFpbiB0YWJzIG9yIGVtb2ppCisgICAgICogQHBhcmFtIHRhYlN0b3BzIHRoZSB0YWJTdG9wcy4gQ2FuIGJlIG51bGwuCisgICAgICovCisgICAgdm9pZCBzZXQoVGV4dFBhaW50IHBhaW50LCBDaGFyU2VxdWVuY2UgdGV4dCwgaW50IHN0YXJ0LCBpbnQgbGltaXQsIGludCBkaXIsCisgICAgICAgICAgICBEaXJlY3Rpb25zIGRpcmVjdGlvbnMsIGJvb2xlYW4gaGFzVGFicywgVGFiU3RvcHMgdGFiU3RvcHMpIHsKKyAgICAgICAgbVBhaW50ID0gcGFpbnQ7CisgICAgICAgIG1UZXh0ID0gdGV4dDsKKyAgICAgICAgbVN0YXJ0ID0gc3RhcnQ7CisgICAgICAgIG1MZW4gPSBsaW1pdCAtIHN0YXJ0OworICAgICAgICBtRGlyID0gZGlyOworICAgICAgICBtRGlyZWN0aW9ucyA9IGRpcmVjdGlvbnM7CisgICAgICAgIG1IYXNUYWJzID0gaGFzVGFiczsKKyAgICAgICAgbVNwYW5uZWQgPSBudWxsOworCisgICAgICAgIGJvb2xlYW4gaGFzUmVwbGFjZW1lbnQgPSBmYWxzZTsKKyAgICAgICAgaWYgKHRleHQgaW5zdGFuY2VvZiBTcGFubmVkKSB7CisgICAgICAgICAgICBtU3Bhbm5lZCA9IChTcGFubmVkKSB0ZXh0OworICAgICAgICAgICAgaGFzUmVwbGFjZW1lbnQgPSBtU3Bhbm5lZC5nZXRTcGFucyhzdGFydCwgbGltaXQsCisgICAgICAgICAgICAgICAgICAgIFJlcGxhY2VtZW50U3Bhbi5jbGFzcykubGVuZ3RoID4gMDsKKyAgICAgICAgfQorCisgICAgICAgIG1DaGFyc1ZhbGlkID0gaGFzUmVwbGFjZW1lbnQgfHwgaGFzVGFicyB8fAorICAgICAgICAgICAgZGlyZWN0aW9ucyAhPSBMYXlvdXQuRElSU19BTExfTEVGVF9UT19SSUdIVDsKKworICAgICAgICBpZiAobUNoYXJzVmFsaWQpIHsKKyAgICAgICAgICAgIGlmIChtQ2hhcnMgPT0gbnVsbCB8fCBtQ2hhcnMubGVuZ3RoIDwgbUxlbikgeworICAgICAgICAgICAgICAgIG1DaGFycyA9IG5ldyBjaGFyW0FycmF5VXRpbHMuaWRlYWxDaGFyQXJyYXlTaXplKG1MZW4pXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFRleHRVdGlscy5nZXRDaGFycyh0ZXh0LCBzdGFydCwgbGltaXQsIG1DaGFycywgMCk7CisgICAgICAgICAgICBpZiAoaGFzUmVwbGFjZW1lbnQpIHsKKyAgICAgICAgICAgICAgICAvLyBIYW5kbGUgdGhlc2UgYWxsIGF0IG9uY2Ugc28gd2UgZG9uJ3QgaGF2ZSB0byBkbyBpdCBhcyB3ZSBnby4KKyAgICAgICAgICAgICAgICAvLyBSZXBsYWNlIHRoZSBmaXJzdCBjaGFyYWN0ZXIgb2YgZWFjaCByZXBsYWNlbWVudCBydW4gd2l0aCB0aGUKKyAgICAgICAgICAgICAgICAvLyBvYmplY3QtcmVwbGFjZW1lbnQgY2hhcmFjdGVyIGFuZCB0aGUgcmVtYWluZGVyIHdpdGggemVybyB3aWR0aAorICAgICAgICAgICAgICAgIC8vIG5vbi1icmVhayBzcGFjZSBha2EgQk9NLiAgQ3Vyc29yIG1vdmVtZW50IGNvZGUgc2tpcHMgdGhlc2UKKyAgICAgICAgICAgICAgICAvLyB6ZXJvLXdpZHRoIGNoYXJhY3RlcnMuCisgICAgICAgICAgICAgICAgY2hhcltdIGNoYXJzID0gbUNoYXJzOworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSBzdGFydCwgaW5leHQ7IGkgPCBsaW1pdDsgaSA9IGluZXh0KSB7CisgICAgICAgICAgICAgICAgICAgIGluZXh0ID0gbVNwYW5uZWQubmV4dFNwYW5UcmFuc2l0aW9uKGksIGxpbWl0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlcGxhY2VtZW50U3Bhbi5jbGFzcyk7CisgICAgICAgICAgICAgICAgICAgIGlmIChtU3Bhbm5lZC5nZXRTcGFucyhpLCBpbmV4dCwgUmVwbGFjZW1lbnRTcGFuLmNsYXNzKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5sZW5ndGggPiAwKSB7IC8vIHRyYW5zaXRpb24gaW50byBhIHNwYW4KKyAgICAgICAgICAgICAgICAgICAgICAgIGNoYXJzW2kgLSBzdGFydF0gPSAnXHVmZmZjJzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGogPSBpIC0gc3RhcnQgKyAxLCBlID0gaW5leHQgLSBzdGFydDsgaiA8IGU7ICsraikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXJzW2pdID0gJ1x1ZmVmZic7IC8vIHVzZWQgYXMgWldOQlMsIG1hcmtzIHBvc2l0aW9ucyB0byBza2lwCisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgbVRhYnMgPSB0YWJTdG9wczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZW5kZXJzIHRoZSBUZXh0TGluZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjIHRoZSBjYW52YXMgdG8gcmVuZGVyIG9uCisgICAgICogQHBhcmFtIHggdGhlIGxlYWRpbmcgbWFyZ2luIHBvc2l0aW9uCisgICAgICogQHBhcmFtIHRvcCB0aGUgdG9wIG9mIHRoZSBsaW5lCisgICAgICogQHBhcmFtIHkgdGhlIGJhc2VsaW5lCisgICAgICogQHBhcmFtIGJvdHRvbSB0aGUgYm90dG9tIG9mIHRoZSBsaW5lCisgICAgICovCisgICAgdm9pZCBkcmF3KENhbnZhcyBjLCBmbG9hdCB4LCBpbnQgdG9wLCBpbnQgeSwgaW50IGJvdHRvbSkgeworICAgICAgICBpZiAoIW1IYXNUYWJzKSB7CisgICAgICAgICAgICBpZiAobURpcmVjdGlvbnMgPT0gTGF5b3V0LkRJUlNfQUxMX0xFRlRfVE9fUklHSFQpIHsKKyAgICAgICAgICAgICAgICBkcmF3UnVuKGMsIDAsIDAsIG1MZW4sIGZhbHNlLCB4LCB0b3AsIHksIGJvdHRvbSwgZmFsc2UpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChtRGlyZWN0aW9ucyA9PSBMYXlvdXQuRElSU19BTExfUklHSFRfVE9fTEVGVCkgeworICAgICAgICAgICAgICAgIGRyYXdSdW4oYywgMCwgMCwgbUxlbiwgdHJ1ZSwgeCwgdG9wLCB5LCBib3R0b20sIGZhbHNlKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBmbG9hdCBoID0gMDsKKyAgICAgICAgaW50W10gcnVucyA9IG1EaXJlY3Rpb25zLm1EaXJlY3Rpb25zOworICAgICAgICBSZWN0RiBlbW9qaVJlY3QgPSBudWxsOworCisgICAgICAgIGludCBsYXN0UnVuSW5kZXggPSBydW5zLmxlbmd0aCAtIDI7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcnVucy5sZW5ndGg7IGkgKz0gMikgeworICAgICAgICAgICAgaW50IHJ1blN0YXJ0ID0gcnVuc1tpXTsKKyAgICAgICAgICAgIGludCBydW5MaW1pdCA9IHJ1blN0YXJ0ICsgKHJ1bnNbaSsxXSAmIExheW91dC5SVU5fTEVOR1RIX01BU0spOworICAgICAgICAgICAgaWYgKHJ1bkxpbWl0ID4gbUxlbikgeworICAgICAgICAgICAgICAgIHJ1bkxpbWl0ID0gbUxlbjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJvb2xlYW4gcnVuSXNSdGwgPSAocnVuc1tpKzFdICYgTGF5b3V0LlJVTl9SVExfRkxBRykgIT0gMDsKKworICAgICAgICAgICAgaW50IHNlZ3N0YXJ0ID0gcnVuU3RhcnQ7CisgICAgICAgICAgICBjaGFyW10gY2hhcnMgPSBtQ2hhcnM7CisgICAgICAgICAgICBmb3IgKGludCBqID0gbUhhc1RhYnMgPyBydW5TdGFydCA6IHJ1bkxpbWl0OyBqIDw9IHJ1bkxpbWl0OyBqKyspIHsKKyAgICAgICAgICAgICAgICBpbnQgY29kZXB0ID0gMDsKKyAgICAgICAgICAgICAgICBCaXRtYXAgYm0gPSBudWxsOworCisgICAgICAgICAgICAgICAgaWYgKG1IYXNUYWJzICYmIGogPCBydW5MaW1pdCkgeworICAgICAgICAgICAgICAgICAgICBjb2RlcHQgPSBtQ2hhcnNbal07CisgICAgICAgICAgICAgICAgICAgIGlmIChjb2RlcHQgPj0gMHhkODAwICYmIGNvZGVwdCA8IDB4ZGMwMCAmJiBqICsgMSA8IHJ1bkxpbWl0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjb2RlcHQgPSBDaGFyYWN0ZXIuY29kZVBvaW50QXQobUNoYXJzLCBqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb2RlcHQgPj0gTGF5b3V0Lk1JTl9FTU9KSSAmJiBjb2RlcHQgPD0gTGF5b3V0Lk1BWF9FTU9KSSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJtID0gTGF5b3V0LkVNT0pJX0ZBQ1RPUlkuZ2V0Qml0bWFwRnJvbUFuZHJvaWRQdWEoY29kZXB0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY29kZXB0ID4gMHhmZmZmKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKytqOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKGogPT0gcnVuTGltaXQgfHwgY29kZXB0ID09ICdcdCcgfHwgYm0gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBoICs9IGRyYXdSdW4oYywgaSwgc2Vnc3RhcnQsIGosIHJ1bklzUnRsLCB4K2gsIHRvcCwgeSwgYm90dG9tLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkgIT0gbGFzdFJ1bkluZGV4IHx8IGogIT0gbUxlbik7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNvZGVwdCA9PSAnXHQnKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBoID0gbURpciAqIG5leHRUYWIoaCAqIG1EaXIpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGJtICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGJtQXNjZW50ID0gYXNjZW50KGopOworICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgYml0bWFwSGVpZ2h0ID0gYm0uZ2V0SGVpZ2h0KCk7CisgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBzY2FsZSA9IC1ibUFzY2VudCAvIGJpdG1hcEhlaWdodDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHdpZHRoID0gYm0uZ2V0V2lkdGgoKSAqIHNjYWxlOworCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZW1vamlSZWN0ID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbW9qaVJlY3QgPSBuZXcgUmVjdEYoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVtb2ppUmVjdC5zZXQoeCArIGgsIHkgKyBibUFzY2VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeCArIGggKyB3aWR0aCwgeSk7CisgICAgICAgICAgICAgICAgICAgICAgICBjLmRyYXdCaXRtYXAoYm0sIG51bGwsIGVtb2ppUmVjdCwgbVBhaW50KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGggKz0gd2lkdGg7CisgICAgICAgICAgICAgICAgICAgICAgICBqKys7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgc2Vnc3RhcnQgPSBqICsgMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIG1ldHJpY3MgaW5mb3JtYXRpb24gZm9yIHRoZSBlbnRpcmUgbGluZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBmbWkgcmVjZWl2ZXMgZm9udCBtZXRyaWNzIGluZm9ybWF0aW9uLCBjYW4gYmUgbnVsbAorICAgICAqIEByZXR1cm4gdGhlIHNpZ25lZCB3aWR0aCBvZiB0aGUgbGluZQorICAgICAqLworICAgIGZsb2F0IG1ldHJpY3MoRm9udE1ldHJpY3NJbnQgZm1pKSB7CisgICAgICAgIHJldHVybiBtZWFzdXJlKG1MZW4sIGZhbHNlLCBmbWkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgaW5mb3JtYXRpb24gYWJvdXQgYSBwb3NpdGlvbiBvbiB0aGUgbGluZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBvZmZzZXQgdGhlIGxpbmUtcmVsYXRpdmUgY2hhcmFjdGVyIG9mZnNldCwgYmV0d2VlbiAwIGFuZCB0aGUKKyAgICAgKiBsaW5lIGxlbmd0aCwgaW5jbHVzaXZlCisgICAgICogQHBhcmFtIHRyYWlsaW5nIHRydWUgdG8gbWVhc3VyZSB0aGUgdHJhaWxpbmcgZWRnZSBvZiB0aGUgY2hhcmFjdGVyCisgICAgICogYmVmb3JlIG9mZnNldCwgZmFsc2UgdG8gbWVhc3VyZSB0aGUgbGVhZGluZyBlZGdlIG9mIHRoZSBjaGFyYWN0ZXIKKyAgICAgKiBhdCBvZmZzZXQuCisgICAgICogQHBhcmFtIGZtaSByZWNlaXZlcyBtZXRyaWNzIGluZm9ybWF0aW9uIGFib3V0IHRoZSByZXF1ZXN0ZWQKKyAgICAgKiBjaGFyYWN0ZXIsIGNhbiBiZSBudWxsLgorICAgICAqIEByZXR1cm4gdGhlIHNpZ25lZCBvZmZzZXQgZnJvbSB0aGUgbGVhZGluZyBtYXJnaW4gdG8gdGhlIHJlcXVlc3RlZAorICAgICAqIGNoYXJhY3RlciBlZGdlLgorICAgICAqLworICAgIGZsb2F0IG1lYXN1cmUoaW50IG9mZnNldCwgYm9vbGVhbiB0cmFpbGluZywgRm9udE1ldHJpY3NJbnQgZm1pKSB7CisgICAgICAgIGludCB0YXJnZXQgPSB0cmFpbGluZyA/IG9mZnNldCAtIDEgOiBvZmZzZXQ7CisgICAgICAgIGlmICh0YXJnZXQgPCAwKSB7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorCisgICAgICAgIGZsb2F0IGggPSAwOworCisgICAgICAgIGlmICghbUhhc1RhYnMpIHsKKyAgICAgICAgICAgIGlmIChtRGlyZWN0aW9ucyA9PSBMYXlvdXQuRElSU19BTExfTEVGVF9UT19SSUdIVCkgeworICAgICAgICAgICAgICAgIHJldHVybiBtZWFzdXJlUnVuKDAsIDAsIG9mZnNldCwgbUxlbiwgZmFsc2UsIGZtaSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobURpcmVjdGlvbnMgPT0gTGF5b3V0LkRJUlNfQUxMX1JJR0hUX1RPX0xFRlQpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbWVhc3VyZVJ1bigwLCAwLCBvZmZzZXQsIG1MZW4sIHRydWUsIGZtaSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBjaGFyW10gY2hhcnMgPSBtQ2hhcnM7CisgICAgICAgIGludFtdIHJ1bnMgPSBtRGlyZWN0aW9ucy5tRGlyZWN0aW9uczsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBydW5zLmxlbmd0aDsgaSArPSAyKSB7CisgICAgICAgICAgICBpbnQgcnVuU3RhcnQgPSBydW5zW2ldOworICAgICAgICAgICAgaW50IHJ1bkxpbWl0ID0gcnVuU3RhcnQgKyAocnVuc1tpKzFdICYgTGF5b3V0LlJVTl9MRU5HVEhfTUFTSyk7CisgICAgICAgICAgICBpZiAocnVuTGltaXQgPiBtTGVuKSB7CisgICAgICAgICAgICAgICAgcnVuTGltaXQgPSBtTGVuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYm9vbGVhbiBydW5Jc1J0bCA9IChydW5zW2krMV0gJiBMYXlvdXQuUlVOX1JUTF9GTEFHKSAhPSAwOworCisgICAgICAgICAgICBpbnQgc2Vnc3RhcnQgPSBydW5TdGFydDsKKyAgICAgICAgICAgIGZvciAoaW50IGogPSBtSGFzVGFicyA/IHJ1blN0YXJ0IDogcnVuTGltaXQ7IGogPD0gcnVuTGltaXQ7IGorKykgeworICAgICAgICAgICAgICAgIGludCBjb2RlcHQgPSAwOworICAgICAgICAgICAgICAgIEJpdG1hcCBibSA9IG51bGw7CisKKyAgICAgICAgICAgICAgICBpZiAobUhhc1RhYnMgJiYgaiA8IHJ1bkxpbWl0KSB7CisgICAgICAgICAgICAgICAgICAgIGNvZGVwdCA9IGNoYXJzW2pdOworICAgICAgICAgICAgICAgICAgICBpZiAoY29kZXB0ID49IDB4ZDgwMCAmJiBjb2RlcHQgPCAweGRjMDAgJiYgaiArIDEgPCBydW5MaW1pdCkgeworICAgICAgICAgICAgICAgICAgICAgICAgY29kZXB0ID0gQ2hhcmFjdGVyLmNvZGVQb2ludEF0KGNoYXJzLCBqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb2RlcHQgPj0gTGF5b3V0Lk1JTl9FTU9KSSAmJiBjb2RlcHQgPD0gTGF5b3V0Lk1BWF9FTU9KSSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJtID0gTGF5b3V0LkVNT0pJX0ZBQ1RPUlkuZ2V0Qml0bWFwRnJvbUFuZHJvaWRQdWEoY29kZXB0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY29kZXB0ID4gMHhmZmZmKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKytqOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKGogPT0gcnVuTGltaXQgfHwgY29kZXB0ID09ICdcdCcgfHwgYm0gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBib29sZWFuIGluU2VnbWVudCA9IHRhcmdldCA+PSBzZWdzdGFydCAmJiB0YXJnZXQgPCBqOworCisgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gYWR2YW5jZSA9IChtRGlyID09IExheW91dC5ESVJfUklHSFRfVE9fTEVGVCkgPT0gcnVuSXNSdGw7CisgICAgICAgICAgICAgICAgICAgIGlmIChpblNlZ21lbnQgJiYgYWR2YW5jZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGggKz0gbWVhc3VyZVJ1bihpLCBzZWdzdGFydCwgb2Zmc2V0LCBqLCBydW5Jc1J0bCwgZm1pKTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGZsb2F0IHcgPSBtZWFzdXJlUnVuKGksIHNlZ3N0YXJ0LCBqLCBqLCBydW5Jc1J0bCwgZm1pKTsKKyAgICAgICAgICAgICAgICAgICAgaCArPSBhZHZhbmNlID8gdyA6IC13OworCisgICAgICAgICAgICAgICAgICAgIGlmIChpblNlZ21lbnQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBoICs9IG1lYXN1cmVSdW4oaSwgc2Vnc3RhcnQsIG9mZnNldCwgaiwgcnVuSXNSdGwsIG51bGwpOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNvZGVwdCA9PSAnXHQnKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAob2Zmc2V0ID09IGopIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGggPSBtRGlyICogbmV4dFRhYihoICogbURpcik7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGFyZ2V0ID09IGopIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGlmIChibSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBibUFzY2VudCA9IGFzY2VudChqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHdpZCA9IGJtLmdldFdpZHRoKCkgKiAtYm1Bc2NlbnQgLyBibS5nZXRIZWlnaHQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGggKz0gbURpciAqIHdpZDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGorKzsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIHNlZ3N0YXJ0ID0gaiArIDE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGg7CisgICAgfQorCisgICAgLyoqCisgICAgICogRHJhd3MgYSB1bmlkaXJlY3Rpb25hbCAoYnV0IHBvc3NpYmx5IG11bHRpLXN0eWxlZCkgcnVuIG9mIHRleHQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYyB0aGUgY2FudmFzIHRvIGRyYXcgb24KKyAgICAgKiBAcGFyYW0gcnVuSW5kZXggdGhlIGluZGV4IG9mIHRoaXMgZGlyZWN0aW9uYWwgcnVuCisgICAgICogQHBhcmFtIHN0YXJ0IHRoZSBsaW5lLXJlbGF0aXZlIHN0YXJ0CisgICAgICogQHBhcmFtIGxpbWl0IHRoZSBsaW5lLXJlbGF0aXZlIGxpbWl0CisgICAgICogQHBhcmFtIHJ1bklzUnRsIHRydWUgaWYgdGhlIHJ1biBpcyByaWdodC10by1sZWZ0CisgICAgICogQHBhcmFtIHggdGhlIHBvc2l0aW9uIG9mIHRoZSBydW4gdGhhdCBpcyBjbG9zZXN0IHRvIHRoZSBsZWFkaW5nIG1hcmdpbgorICAgICAqIEBwYXJhbSB0b3AgdGhlIHRvcCBvZiB0aGUgbGluZQorICAgICAqIEBwYXJhbSB5IHRoZSBiYXNlbGluZQorICAgICAqIEBwYXJhbSBib3R0b20gdGhlIGJvdHRvbSBvZiB0aGUgbGluZQorICAgICAqIEBwYXJhbSBuZWVkV2lkdGggdHJ1ZSBpZiB0aGUgd2lkdGggdmFsdWUgaXMgcmVxdWlyZWQuCisgICAgICogQHJldHVybiB0aGUgc2lnbmVkIHdpZHRoIG9mIHRoZSBydW4sIGJhc2VkIG9uIHRoZSBwYXJhZ3JhcGggZGlyZWN0aW9uLgorICAgICAqIE9ubHkgdmFsaWQgaWYgbmVlZFdpZHRoIGlzIHRydWUuCisgICAgICovCisgICAgcHJpdmF0ZSBmbG9hdCBkcmF3UnVuKENhbnZhcyBjLCBpbnQgcnVuSW5kZXgsIGludCBzdGFydCwKKyAgICAgICAgICAgIGludCBsaW1pdCwgYm9vbGVhbiBydW5Jc1J0bCwgZmxvYXQgeCwgaW50IHRvcCwgaW50IHksIGludCBib3R0b20sCisgICAgICAgICAgICBib29sZWFuIG5lZWRXaWR0aCkgeworCisgICAgICAgIGlmICgobURpciA9PSBMYXlvdXQuRElSX0xFRlRfVE9fUklHSFQpID09IHJ1bklzUnRsKSB7CisgICAgICAgICAgICBmbG9hdCB3ID0gLW1lYXN1cmVSdW4ocnVuSW5kZXgsIHN0YXJ0LCBsaW1pdCwgbGltaXQsIHJ1bklzUnRsLCBudWxsKTsKKyAgICAgICAgICAgIGhhbmRsZVJ1bihydW5JbmRleCwgc3RhcnQsIGxpbWl0LCBsaW1pdCwgcnVuSXNSdGwsIGMsIHggKyB3LCB0b3AsCisgICAgICAgICAgICAgICAgICAgIHksIGJvdHRvbSwgbnVsbCwgZmFsc2UpOworICAgICAgICAgICAgcmV0dXJuIHc7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gaGFuZGxlUnVuKHJ1bkluZGV4LCBzdGFydCwgbGltaXQsIGxpbWl0LCBydW5Jc1J0bCwgYywgeCwgdG9wLAorICAgICAgICAgICAgICAgIHksIGJvdHRvbSwgbnVsbCwgbmVlZFdpZHRoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBNZWFzdXJlcyBhIHVuaWRpcmVjdGlvbmFsIChidXQgcG9zc2libHkgbXVsdGktc3R5bGVkKSBydW4gb2YgdGV4dC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBydW5JbmRleCB0aGUgcnVuIGluZGV4CisgICAgICogQHBhcmFtIHN0YXJ0IHRoZSBsaW5lLXJlbGF0aXZlIHN0YXJ0IG9mIHRoZSBydW4KKyAgICAgKiBAcGFyYW0gb2Zmc2V0IHRoZSBvZmZzZXQgdG8gbWVhc3VyZSB0bywgYmV0d2VlbiBzdGFydCBhbmQgbGltaXQgaW5jbHVzaXZlCisgICAgICogQHBhcmFtIGxpbWl0IHRoZSBsaW5lLXJlbGF0aXZlIGxpbWl0IG9mIHRoZSBydW4KKyAgICAgKiBAcGFyYW0gcnVuSXNSdGwgdHJ1ZSBpZiB0aGUgcnVuIGlzIHJpZ2h0LXRvLWxlZnQKKyAgICAgKiBAcGFyYW0gZm1pIHJlY2VpdmVzIG1ldHJpY3MgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHJlcXVlc3RlZAorICAgICAqIHJ1biwgY2FuIGJlIG51bGwuCisgICAgICogQHJldHVybiB0aGUgc2lnbmVkIHdpZHRoIGZyb20gdGhlIHN0YXJ0IG9mIHRoZSBydW4gdG8gdGhlIGxlYWRpbmcgZWRnZQorICAgICAqIG9mIHRoZSBjaGFyYWN0ZXIgYXQgb2Zmc2V0LCBiYXNlZCBvbiB0aGUgcnVuIChub3QgcGFyYWdyYXBoKSBkaXJlY3Rpb24KKyAgICAgKi8KKyAgICBwcml2YXRlIGZsb2F0IG1lYXN1cmVSdW4oaW50IHJ1bkluZGV4LCBpbnQgc3RhcnQsCisgICAgICAgICAgICBpbnQgb2Zmc2V0LCBpbnQgbGltaXQsIGJvb2xlYW4gcnVuSXNSdGwsIEZvbnRNZXRyaWNzSW50IGZtaSkgeworICAgICAgICByZXR1cm4gaGFuZGxlUnVuKHJ1bkluZGV4LCBzdGFydCwgb2Zmc2V0LCBsaW1pdCwgcnVuSXNSdGwsIG51bGwsCisgICAgICAgICAgICAgICAgMCwgMCwgMCwgMCwgZm1pLCB0cnVlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXYWxrIHRoZSBjdXJzb3IgdGhyb3VnaCB0aGlzIGxpbmUsIHNraXBwaW5nIGNvbmp1bmN0cyBhbmQKKyAgICAgKiB6ZXJvLXdpZHRoIGNoYXJhY3RlcnMuCisgICAgICoKKyAgICAgKiA8cD5UaGlzIGZ1bmN0aW9uIGNhbm5vdCBwcm9wZXJseSB3YWxrIHRoZSBjdXJzb3Igb2ZmIHRoZSBlbmRzIG9mIHRoZSBsaW5lCisgICAgICogc2luY2UgaXQgZG9lcyBub3Qga25vdyBhYm91dCBhbnkgc2hhcGluZyBvbiB0aGUgcHJldmlvdXMvZm9sbG93aW5nIGxpbmUKKyAgICAgKiB0aGF0IG1pZ2h0IGFmZmVjdCB0aGUgY3Vyc29yIHBvc2l0aW9uLiBDYWxsZXJzIG11c3QgZWl0aGVyIGF2b2lkIHRoZXNlCisgICAgICogc2l0dWF0aW9ucyBvciBoYW5kbGUgdGhlIHJlc3VsdCBzcGVjaWFsbHkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY3Vyc29yIHRoZSBzdGFydGluZyBwb3NpdGlvbiBvZiB0aGUgY3Vyc29yLCBiZXR3ZWVuIDAgYW5kIHRoZQorICAgICAqIGxlbmd0aCBvZiB0aGUgbGluZSwgaW5jbHVzaXZlCisgICAgICogQHBhcmFtIHRvTGVmdCB0cnVlIGlmIHRoZSBjYXJldCBpcyBtb3ZpbmcgdG8gdGhlIGxlZnQuCisgICAgICogQHJldHVybiB0aGUgbmV3IG9mZnNldC4gIElmIGl0IGlzIGxlc3MgdGhhbiAwIG9yIGdyZWF0ZXIgdGhhbiB0aGUgbGVuZ3RoCisgICAgICogb2YgdGhlIGxpbmUsIHRoZSBwcmV2aW91cy9mb2xsb3dpbmcgbGluZSBzaG91bGQgYmUgZXhhbWluZWQgdG8gZ2V0IHRoZQorICAgICAqIGFjdHVhbCBvZmZzZXQuCisgICAgICovCisgICAgaW50IGdldE9mZnNldFRvTGVmdFJpZ2h0T2YoaW50IGN1cnNvciwgYm9vbGVhbiB0b0xlZnQpIHsKKyAgICAgICAgLy8gMSkgVGhlIGNhcmV0IG1hcmtzIHRoZSBsZWFkaW5nIGVkZ2Ugb2YgYSBjaGFyYWN0ZXIuIFRoZSBjaGFyYWN0ZXIKKyAgICAgICAgLy8gbG9naWNhbGx5IGJlZm9yZSBpdCBtaWdodCBiZSBvbiBhIGRpZmZlcmVudCBsZXZlbCwgYW5kIHRoZSBhY3RpdmUgY2FyZXQKKyAgICAgICAgLy8gcG9zaXRpb24gaXMgb24gdGhlIGNoYXJhY3RlciBhdCB0aGUgbG93ZXIgbGV2ZWwuIElmIHRoYXQgY2hhcmFjdGVyCisgICAgICAgIC8vIHdhcyB0aGUgcHJldmlvdXMgY2hhcmFjdGVyLCB0aGUgY2FyZXQgaXMgb24gaXRzIHRyYWlsaW5nIGVkZ2UuCisgICAgICAgIC8vIDIpIFRha2UgdGhpcyBjaGFyYWN0ZXIvZWRnZSBhbmQgbW92ZSBpdCBpbiB0aGUgaW5kaWNhdGVkIGRpcmVjdGlvbi4KKyAgICAgICAgLy8gVGhpcyBnaXZlcyB5b3UgYSBuZXcgY2hhcmFjdGVyIGFuZCBhIG5ldyBlZGdlLgorICAgICAgICAvLyAzKSBUaGlzIHBvc2l0aW9uIGlzIGJldHdlZW4gdHdvIHZpc3VhbGx5IGFkamFjZW50IGNoYXJhY3RlcnMuICBPbmUgb2YKKyAgICAgICAgLy8gdGhlc2UgbWlnaHQgYmUgYXQgYSBsb3dlciBsZXZlbC4gIFRoZSBhY3RpdmUgcG9zaXRpb24gaXMgb24gdGhlCisgICAgICAgIC8vIGNoYXJhY3RlciBhdCB0aGUgbG93ZXIgbGV2ZWwuCisgICAgICAgIC8vIDQpIElmIHRoZSBhY3RpdmUgcG9zaXRpb24gaXMgb24gdGhlIHRyYWlsaW5nIGVkZ2Ugb2YgdGhlIGNoYXJhY3RlciwKKyAgICAgICAgLy8gdGhlIG5ldyBjYXJldCBwb3NpdGlvbiBpcyB0aGUgZm9sbG93aW5nIGxvZ2ljYWwgY2hhcmFjdGVyLCBlbHNlIGl0CisgICAgICAgIC8vIGlzIHRoZSBjaGFyYWN0ZXIuCisKKyAgICAgICAgaW50IGxpbmVTdGFydCA9IDA7CisgICAgICAgIGludCBsaW5lRW5kID0gbUxlbjsKKyAgICAgICAgYm9vbGVhbiBwYXJhSXNSdGwgPSBtRGlyID09IC0xOworICAgICAgICBpbnRbXSBydW5zID0gbURpcmVjdGlvbnMubURpcmVjdGlvbnM7CisKKyAgICAgICAgaW50IHJ1bkluZGV4LCBydW5MZXZlbCA9IDAsIHJ1blN0YXJ0ID0gbGluZVN0YXJ0LCBydW5MaW1pdCA9IGxpbmVFbmQsIG5ld0NhcmV0ID0gLTE7CisgICAgICAgIGJvb2xlYW4gdHJhaWxpbmcgPSBmYWxzZTsKKworICAgICAgICBpZiAoY3Vyc29yID09IGxpbmVTdGFydCkgeworICAgICAgICAgICAgcnVuSW5kZXggPSAtMjsKKyAgICAgICAgfSBlbHNlIGlmIChjdXJzb3IgPT0gbGluZUVuZCkgeworICAgICAgICAgICAgcnVuSW5kZXggPSBydW5zLmxlbmd0aDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAvLyBGaXJzdCwgZ2V0IGluZm9ybWF0aW9uIGFib3V0IHRoZSBydW4gY29udGFpbmluZyB0aGUgY2hhcmFjdGVyIHdpdGgKKyAgICAgICAgICAvLyB0aGUgYWN0aXZlIGNhcmV0LgorICAgICAgICAgIGZvciAocnVuSW5kZXggPSAwOyBydW5JbmRleCA8IHJ1bnMubGVuZ3RoOyBydW5JbmRleCArPSAyKSB7CisgICAgICAgICAgICBydW5TdGFydCA9IGxpbmVTdGFydCArIHJ1bnNbcnVuSW5kZXhdOworICAgICAgICAgICAgaWYgKGN1cnNvciA+PSBydW5TdGFydCkgeworICAgICAgICAgICAgICBydW5MaW1pdCA9IHJ1blN0YXJ0ICsgKHJ1bnNbcnVuSW5kZXgrMV0gJiBMYXlvdXQuUlVOX0xFTkdUSF9NQVNLKTsKKyAgICAgICAgICAgICAgaWYgKHJ1bkxpbWl0ID4gbGluZUVuZCkgeworICAgICAgICAgICAgICAgICAgcnVuTGltaXQgPSBsaW5lRW5kOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIGlmIChjdXJzb3IgPCBydW5MaW1pdCkgeworICAgICAgICAgICAgICAgIHJ1bkxldmVsID0gKHJ1bnNbcnVuSW5kZXgrMV0gPj4+IExheW91dC5SVU5fTEVWRUxfU0hJRlQpICYKKyAgICAgICAgICAgICAgICAgICAgTGF5b3V0LlJVTl9MRVZFTF9NQVNLOworICAgICAgICAgICAgICAgIGlmIChjdXJzb3IgPT0gcnVuU3RhcnQpIHsKKyAgICAgICAgICAgICAgICAgIC8vIFRoZSBjYXJldCBpcyBvbiBhIHJ1biBib3VuZGFyeSwgc2VlIGlmIHdlIHNob3VsZAorICAgICAgICAgICAgICAgICAgLy8gdXNlIHRoZSBwb3NpdGlvbiBvbiB0aGUgdHJhaWxpbmcgZWRnZSBvZiB0aGUgcHJldmlvdXMKKyAgICAgICAgICAgICAgICAgIC8vIGxvZ2ljYWwgY2hhcmFjdGVyIGluc3RlYWQuCisgICAgICAgICAgICAgICAgICBpbnQgcHJldlJ1bkluZGV4LCBwcmV2UnVuTGV2ZWwsIHByZXZSdW5TdGFydCwgcHJldlJ1bkxpbWl0OworICAgICAgICAgICAgICAgICAgaW50IHBvcyA9IGN1cnNvciAtIDE7CisgICAgICAgICAgICAgICAgICBmb3IgKHByZXZSdW5JbmRleCA9IDA7IHByZXZSdW5JbmRleCA8IHJ1bnMubGVuZ3RoOyBwcmV2UnVuSW5kZXggKz0gMikgeworICAgICAgICAgICAgICAgICAgICBwcmV2UnVuU3RhcnQgPSBsaW5lU3RhcnQgKyBydW5zW3ByZXZSdW5JbmRleF07CisgICAgICAgICAgICAgICAgICAgIGlmIChwb3MgPj0gcHJldlJ1blN0YXJ0KSB7CisgICAgICAgICAgICAgICAgICAgICAgcHJldlJ1bkxpbWl0ID0gcHJldlJ1blN0YXJ0ICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKHJ1bnNbcHJldlJ1bkluZGV4KzFdICYgTGF5b3V0LlJVTl9MRU5HVEhfTUFTSyk7CisgICAgICAgICAgICAgICAgICAgICAgaWYgKHByZXZSdW5MaW1pdCA+IGxpbmVFbmQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcHJldlJ1bkxpbWl0ID0gbGluZUVuZDsKKyAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgaWYgKHBvcyA8IHByZXZSdW5MaW1pdCkgeworICAgICAgICAgICAgICAgICAgICAgICAgcHJldlJ1bkxldmVsID0gKHJ1bnNbcHJldlJ1bkluZGV4KzFdID4+PiBMYXlvdXQuUlVOX0xFVkVMX1NISUZUKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICYgTGF5b3V0LlJVTl9MRVZFTF9NQVNLOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByZXZSdW5MZXZlbCA8IHJ1bkxldmVsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFN0YXJ0IGZyb20gbG9naWNhbGx5IHByZXZpb3VzIGNoYXJhY3Rlci4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgcnVuSW5kZXggPSBwcmV2UnVuSW5kZXg7CisgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bkxldmVsID0gcHJldlJ1bkxldmVsOworICAgICAgICAgICAgICAgICAgICAgICAgICBydW5TdGFydCA9IHByZXZSdW5TdGFydDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcnVuTGltaXQgPSBwcmV2UnVuTGltaXQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWlsaW5nID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorCisgICAgICAgICAgLy8gY2FyZXQgbWlnaHQgYmUgPT0gbGluZUVuZC4gIFRoaXMgaXMgZ2VuZXJhbGx5IGEgc3BhY2Ugb3IgcGFyYWdyYXBoCisgICAgICAgICAgLy8gc2VwYXJhdG9yIGFuZCBoYXMgYW4gYXNzb2NpYXRlZCBydW4sIGJ1dCBtaWdodCBiZSB0aGUgZW5kIG9mCisgICAgICAgICAgLy8gdGV4dCwgaW4gd2hpY2ggY2FzZSBpdCBkb2Vzbid0LiAgSWYgdGhhdCBoYXBwZW5zLCB3ZSByYW4gb2ZmIHRoZQorICAgICAgICAgIC8vIGVuZCBvZiB0aGUgcnVuIGxpc3QsIGFuZCBydW5JbmRleCA9PSBydW5zLmxlbmd0aC4gIEluIHRoaXMgY2FzZSwKKyAgICAgICAgICAvLyB3ZSBhcmUgYXQgYSBydW4gYm91bmRhcnkgc28gd2Ugc2tpcCB0aGUgYmVsb3cgdGVzdC4KKyAgICAgICAgICBpZiAocnVuSW5kZXggIT0gcnVucy5sZW5ndGgpIHsKKyAgICAgICAgICAgICAgYm9vbGVhbiBydW5Jc1J0bCA9IChydW5MZXZlbCAmIDB4MSkgIT0gMDsKKyAgICAgICAgICAgICAgYm9vbGVhbiBhZHZhbmNlID0gdG9MZWZ0ID09IHJ1bklzUnRsOworICAgICAgICAgICAgICBpZiAoY3Vyc29yICE9IChhZHZhbmNlID8gcnVuTGltaXQgOiBydW5TdGFydCkgfHwgYWR2YW5jZSAhPSB0cmFpbGluZykgeworICAgICAgICAgICAgICAgICAgLy8gTW92aW5nIHdpdGhpbiBvciBpbnRvIHRoZSBydW4sIHNvIHdlIGNhbiBtb3ZlIGxvZ2ljYWxseS4KKyAgICAgICAgICAgICAgICAgIG5ld0NhcmV0ID0gZ2V0T2Zmc2V0QmVmb3JlQWZ0ZXIocnVuSW5kZXgsIHJ1blN0YXJ0LCBydW5MaW1pdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcnVuSXNSdGwsIGN1cnNvciwgYWR2YW5jZSk7CisgICAgICAgICAgICAgICAgICAvLyBJZiB0aGUgbmV3IHBvc2l0aW9uIGlzIGludGVybmFsIHRvIHRoZSBydW4sIHdlJ3JlIGF0IHRoZSBzdHJvbmcKKyAgICAgICAgICAgICAgICAgIC8vIHBvc2l0aW9uIGFscmVhZHkgc28gd2UncmUgZmluaXNoZWQuCisgICAgICAgICAgICAgICAgICBpZiAobmV3Q2FyZXQgIT0gKGFkdmFuY2UgPyBydW5MaW1pdCA6IHJ1blN0YXJ0KSkgeworICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXdDYXJldDsKKyAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIElmIG5ld0NhcmV0IGlzIC0xLCB3ZSdyZSBzdGFydGluZyBhdCBhIHJ1biBib3VuZGFyeSBhbmQgY3Jvc3NpbmcKKyAgICAgICAgLy8gaW50byBhbm90aGVyIHJ1bi4gT3RoZXJ3aXNlIHdlJ3ZlIGFycml2ZWQgYXQgYSBydW4gYm91bmRhcnksIGFuZAorICAgICAgICAvLyBuZWVkIHRvIGZpZ3VyZSBvdXQgd2hpY2ggY2hhcmFjdGVyIHRvIGF0dGFjaCB0by4gIE5vdGUgd2UgbWlnaHQKKyAgICAgICAgLy8gbmVlZCB0byBydW4gdGhpcyB0d2ljZSwgaWYgd2UgY3Jvc3MgYSBydW4gYm91bmRhcnkgYW5kIGVuZCB1cCBhdAorICAgICAgICAvLyBhbm90aGVyIHJ1biBib3VuZGFyeS4KKyAgICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgICBib29sZWFuIGFkdmFuY2UgPSB0b0xlZnQgPT0gcGFyYUlzUnRsOworICAgICAgICAgIGludCBvdGhlclJ1bkluZGV4ID0gcnVuSW5kZXggKyAoYWR2YW5jZSA/IDIgOiAtMik7CisgICAgICAgICAgaWYgKG90aGVyUnVuSW5kZXggPj0gMCAmJiBvdGhlclJ1bkluZGV4IDwgcnVucy5sZW5ndGgpIHsKKyAgICAgICAgICAgIGludCBvdGhlclJ1blN0YXJ0ID0gbGluZVN0YXJ0ICsgcnVuc1tvdGhlclJ1bkluZGV4XTsKKyAgICAgICAgICAgIGludCBvdGhlclJ1bkxpbWl0ID0gb3RoZXJSdW5TdGFydCArCisgICAgICAgICAgICAocnVuc1tvdGhlclJ1bkluZGV4KzFdICYgTGF5b3V0LlJVTl9MRU5HVEhfTUFTSyk7CisgICAgICAgICAgICBpZiAob3RoZXJSdW5MaW1pdCA+IGxpbmVFbmQpIHsKKyAgICAgICAgICAgICAgICBvdGhlclJ1bkxpbWl0ID0gbGluZUVuZDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGludCBvdGhlclJ1bkxldmVsID0gKHJ1bnNbb3RoZXJSdW5JbmRleCsxXSA+Pj4gTGF5b3V0LlJVTl9MRVZFTF9TSElGVCkgJgorICAgICAgICAgICAgICAgIExheW91dC5SVU5fTEVWRUxfTUFTSzsKKyAgICAgICAgICAgIGJvb2xlYW4gb3RoZXJSdW5Jc1J0bCA9IChvdGhlclJ1bkxldmVsICYgMSkgIT0gMDsKKworICAgICAgICAgICAgYWR2YW5jZSA9IHRvTGVmdCA9PSBvdGhlclJ1bklzUnRsOworICAgICAgICAgICAgaWYgKG5ld0NhcmV0ID09IC0xKSB7CisgICAgICAgICAgICAgICAgbmV3Q2FyZXQgPSBnZXRPZmZzZXRCZWZvcmVBZnRlcihvdGhlclJ1bkluZGV4LCBvdGhlclJ1blN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgb3RoZXJSdW5MaW1pdCwgb3RoZXJSdW5Jc1J0bCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGFkdmFuY2UgPyBvdGhlclJ1blN0YXJ0IDogb3RoZXJSdW5MaW1pdCwgYWR2YW5jZSk7CisgICAgICAgICAgICAgICAgaWYgKG5ld0NhcmV0ID09IChhZHZhbmNlID8gb3RoZXJSdW5MaW1pdCA6IG90aGVyUnVuU3RhcnQpKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIENyb3NzZWQgYW5kIGVuZGVkIHVwIGF0IGEgbmV3IGJvdW5kYXJ5LAorICAgICAgICAgICAgICAgICAgICAvLyByZXBlYXQgYSBzZWNvbmQgYW5kIGZpbmFsIHRpbWUuCisgICAgICAgICAgICAgICAgICAgIHJ1bkluZGV4ID0gb3RoZXJSdW5JbmRleDsKKyAgICAgICAgICAgICAgICAgICAgcnVuTGV2ZWwgPSBvdGhlclJ1bkxldmVsOworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIFRoZSBuZXcgY2FyZXQgaXMgYXQgYSBib3VuZGFyeS4KKyAgICAgICAgICAgIGlmIChvdGhlclJ1bkxldmVsIDwgcnVuTGV2ZWwpIHsKKyAgICAgICAgICAgICAgLy8gVGhlIHN0cm9uZyBjaGFyYWN0ZXIgaXMgaW4gdGhlIG90aGVyIHJ1bi4KKyAgICAgICAgICAgICAgbmV3Q2FyZXQgPSBhZHZhbmNlID8gb3RoZXJSdW5TdGFydCA6IG90aGVyUnVuTGltaXQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBpZiAobmV3Q2FyZXQgPT0gLTEpIHsKKyAgICAgICAgICAgICAgLy8gV2UncmUgd2Fsa2luZyBvZmYgdGhlIGVuZCBvZiB0aGUgbGluZS4gIFRoZSBwYXJhZ3JhcGgKKyAgICAgICAgICAgICAgLy8gbGV2ZWwgaXMgYWx3YXlzIGVxdWFsIHRvIG9yIGxvd2VyIHRoYW4gYW55IGludGVybmFsIGxldmVsLCBzbworICAgICAgICAgICAgICAvLyB0aGUgYm91bmRhcmllcyBnZXQgdGhlIHN0cm9uZyBjYXJldC4KKyAgICAgICAgICAgICAgbmV3Q2FyZXQgPSBhZHZhbmNlID8gbUxlbiArIDEgOiAtMTsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorCisgICAgICAgICAgLy8gRWxzZSB3ZSd2ZSBhcnJpdmVkIGF0IHRoZSBlbmQgb2YgdGhlIGxpbmUuICBUaGF0J3MgYSBzdHJvbmcgcG9zaXRpb24uCisgICAgICAgICAgLy8gV2UgbWlnaHQgaGF2ZSBhcnJpdmVkIGhlcmUgYnkgY3Jvc3Npbmcgb3ZlciBhIHJ1biB3aXRoIG5vIGludGVybmFsCisgICAgICAgICAgLy8gYnJlYWtzIGFuZCBkcm9wcGluZyBvdXQgb2YgdGhlIGFib3ZlIGxvb3AgYmVmb3JlIGFkdmFuY2luZyBvbmUgZmluYWwKKyAgICAgICAgICAvLyB0aW1lLCBzbyByZXNldCB0aGUgY2FyZXQuCisgICAgICAgICAgLy8gTm90ZSwgd2UgdXNlICc8PScgYmVsb3cgdG8gaGFuZGxlIGEgc2l0dWF0aW9uIHdoZXJlIHRoZSBvbmx5IHJ1bgorICAgICAgICAgIC8vIG9uIHRoZSBsaW5lIGlzIGEgY291bnRlci1kaXJlY3Rpb25hbCBydW4uICBJZiB3ZSdyZSBub3QgYWR2YW5jaW5nLAorICAgICAgICAgIC8vIHdlIGNhbiBlbmQgdXAgYXQgdGhlICdsaW5lRW5kJyBwb3NpdGlvbiBidXQgdGhlIGNhcmV0IHdlIHdhbnQgaXMgYXQKKyAgICAgICAgICAvLyB0aGUgbGluZVN0YXJ0LgorICAgICAgICAgIGlmIChuZXdDYXJldCA8PSBsaW5lRW5kKSB7CisgICAgICAgICAgICAgIG5ld0NhcmV0ID0gYWR2YW5jZSA/IGxpbmVFbmQgOiBsaW5lU3RhcnQ7CisgICAgICAgICAgfQorICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIG5ld0NhcmV0OworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIG5leHQgdmFsaWQgb2Zmc2V0IHdpdGhpbiB0aGlzIGRpcmVjdGlvbmFsIHJ1biwgc2tpcHBpbmcKKyAgICAgKiBjb25qdW5jdHMgYW5kIHplcm8td2lkdGggY2hhcmFjdGVycy4gIFRoaXMgc2hvdWxkIG5vdCBiZSBjYWxsZWQgdG8gd2FsaworICAgICAqIG9mZiB0aGUgZW5kIG9mIHRoZSBsaW5lLCBzaW5jZSB0aGUgcmV0dXJuZWQgdmFsdWVzIG1pZ2h0IG5vdCBiZSB2YWxpZAorICAgICAqIG9uIG5laWdoYm9yaW5nIGxpbmVzLiAgSWYgdGhlIHJldHVybmVkIG9mZnNldCBpcyBsZXNzIHRoYW4gemVybyBvcgorICAgICAqIGdyZWF0ZXIgdGhhbiB0aGUgbGluZSBsZW5ndGgsIHRoZSBvZmZzZXQgc2hvdWxkIGJlIHJlY29tcHV0ZWQgb24gdGhlCisgICAgICogcHJlY2VkaW5nIG9yIGZvbGxvd2luZyBsaW5lLCByZXNwZWN0aXZlbHkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcnVuSW5kZXggdGhlIHJ1biBpbmRleAorICAgICAqIEBwYXJhbSBydW5TdGFydCB0aGUgc3RhcnQgb2YgdGhlIHJ1bgorICAgICAqIEBwYXJhbSBydW5MaW1pdCB0aGUgbGltaXQgb2YgdGhlIHJ1bgorICAgICAqIEBwYXJhbSBydW5Jc1J0bCB0cnVlIGlmIHRoZSBydW4gaXMgcmlnaHQtdG8tbGVmdAorICAgICAqIEBwYXJhbSBvZmZzZXQgdGhlIG9mZnNldAorICAgICAqIEBwYXJhbSBhZnRlciB0cnVlIGlmIHRoZSBuZXcgb2Zmc2V0IHNob3VsZCBsb2dpY2FsbHkgZm9sbG93IHRoZSBwcm92aWRlZAorICAgICAqIG9mZnNldAorICAgICAqIEByZXR1cm4gdGhlIG5ldyBvZmZzZXQKKyAgICAgKi8KKyAgICBwcml2YXRlIGludCBnZXRPZmZzZXRCZWZvcmVBZnRlcihpbnQgcnVuSW5kZXgsIGludCBydW5TdGFydCwgaW50IHJ1bkxpbWl0LAorICAgICAgICAgICAgYm9vbGVhbiBydW5Jc1J0bCwgaW50IG9mZnNldCwgYm9vbGVhbiBhZnRlcikgeworCisgICAgICAgIGlmIChydW5JbmRleCA8IDAgfHwgb2Zmc2V0ID09IChhZnRlciA/IG1MZW4gOiAwKSkgeworICAgICAgICAgICAgLy8gV2Fsa2luZyBvZmYgZW5kIG9mIGxpbmUuICBTaW5jZSB3ZSBkb24ndCBrbm93CisgICAgICAgICAgICAvLyB3aGF0IGN1cnNvciBwb3NpdGlvbnMgYXJlIGF2YWlsYWJsZSBvbiBvdGhlciBsaW5lcywgd2UgY2FuJ3QKKyAgICAgICAgICAgIC8vIHJldHVybiBhY2N1cmF0ZSB2YWx1ZXMuICBUaGVzZSBhcmUgYSBndWVzcy4KKyAgICAgICAgICAgIGlmIChhZnRlcikgeworICAgICAgICAgICAgICAgIHJldHVybiBUZXh0VXRpbHMuZ2V0T2Zmc2V0QWZ0ZXIobVRleHQsIG9mZnNldCArIG1TdGFydCkgLSBtU3RhcnQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gVGV4dFV0aWxzLmdldE9mZnNldEJlZm9yZShtVGV4dCwgb2Zmc2V0ICsgbVN0YXJ0KSAtIG1TdGFydDsKKyAgICAgICAgfQorCisgICAgICAgIFRleHRQYWludCB3cCA9IG1Xb3JrUGFpbnQ7CisgICAgICAgIHdwLnNldChtUGFpbnQpOworCisgICAgICAgIGludCBzcGFuU3RhcnQgPSBydW5TdGFydDsKKyAgICAgICAgaW50IHNwYW5MaW1pdDsKKyAgICAgICAgaWYgKG1TcGFubmVkID09IG51bGwpIHsKKyAgICAgICAgICAgIHNwYW5MaW1pdCA9IHJ1bkxpbWl0OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaW50IHRhcmdldCA9IGFmdGVyID8gb2Zmc2V0ICsgMSA6IG9mZnNldDsKKyAgICAgICAgICAgIGludCBsaW1pdCA9IG1TdGFydCArIHJ1bkxpbWl0OworICAgICAgICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgICAgICAgICBzcGFuTGltaXQgPSBtU3Bhbm5lZC5uZXh0U3BhblRyYW5zaXRpb24obVN0YXJ0ICsgc3BhblN0YXJ0LCBsaW1pdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIE1ldHJpY0FmZmVjdGluZ1NwYW4uY2xhc3MpIC0gbVN0YXJ0OworICAgICAgICAgICAgICAgIGlmIChzcGFuTGltaXQgPj0gdGFyZ2V0KSB7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzcGFuU3RhcnQgPSBzcGFuTGltaXQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIE1ldHJpY0FmZmVjdGluZ1NwYW5bXSBzcGFucyA9IG1TcGFubmVkLmdldFNwYW5zKG1TdGFydCArIHNwYW5TdGFydCwKKyAgICAgICAgICAgICAgICAgICAgbVN0YXJ0ICsgc3BhbkxpbWl0LCBNZXRyaWNBZmZlY3RpbmdTcGFuLmNsYXNzKTsKKworICAgICAgICAgICAgaWYgKHNwYW5zLmxlbmd0aCA+IDApIHsKKyAgICAgICAgICAgICAgICBSZXBsYWNlbWVudFNwYW4gcmVwbGFjZW1lbnQgPSBudWxsOworICAgICAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgc3BhbnMubGVuZ3RoOyBqKyspIHsKKyAgICAgICAgICAgICAgICAgICAgTWV0cmljQWZmZWN0aW5nU3BhbiBzcGFuID0gc3BhbnNbal07CisgICAgICAgICAgICAgICAgICAgIGlmIChzcGFuIGluc3RhbmNlb2YgUmVwbGFjZW1lbnRTcGFuKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXBsYWNlbWVudCA9IChSZXBsYWNlbWVudFNwYW4pc3BhbjsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNwYW4udXBkYXRlTWVhc3VyZVN0YXRlKHdwKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChyZXBsYWNlbWVudCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIElmIHdlIGhhdmUgYSByZXBsYWNlbWVudCBzcGFuLCB3ZSdyZSBtb3ZpbmcgZWl0aGVyIHRvCisgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBzdGFydCBvciBlbmQgb2YgdGhpcyBzcGFuLgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gYWZ0ZXIgPyBzcGFuTGltaXQgOiBzcGFuU3RhcnQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaW50IGZsYWdzID0gcnVuSXNSdGwgPyBQYWludC5ESVJFQ1RJT05fUlRMIDogUGFpbnQuRElSRUNUSU9OX0xUUjsKKyAgICAgICAgaW50IGN1cnNvck9wdCA9IGFmdGVyID8gUGFpbnQuQ1VSU09SX0FGVEVSIDogUGFpbnQuQ1VSU09SX0JFRk9SRTsKKyAgICAgICAgaWYgKG1DaGFyc1ZhbGlkKSB7CisgICAgICAgICAgICByZXR1cm4gd3AuZ2V0VGV4dFJ1bkN1cnNvcihtQ2hhcnMsIHNwYW5TdGFydCwgc3BhbkxpbWl0IC0gc3BhblN0YXJ0LAorICAgICAgICAgICAgICAgICAgICBmbGFncywgb2Zmc2V0LCBjdXJzb3JPcHQpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIHdwLmdldFRleHRSdW5DdXJzb3IobVRleHQsIG1TdGFydCArIHNwYW5TdGFydCwKKyAgICAgICAgICAgICAgICAgICAgbVN0YXJ0ICsgc3BhbkxpbWl0LCBmbGFncywgbVN0YXJ0ICsgb2Zmc2V0LCBjdXJzb3JPcHQpIC0gbVN0YXJ0OworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVXRpbGl0eSBmdW5jdGlvbiBmb3IgbWVhc3VyaW5nIGFuZCByZW5kZXJpbmcgdGV4dC4gIFRoZSB0ZXh0IG11c3QKKyAgICAgKiBub3QgaW5jbHVkZSBhIHRhYiBvciBlbW9qaS4KKyAgICAgKgorICAgICAqIEBwYXJhbSB3cCB0aGUgd29ya2luZyBwYWludAorICAgICAqIEBwYXJhbSBzdGFydCB0aGUgc3RhcnQgb2YgdGhlIHRleHQKKyAgICAgKiBAcGFyYW0gZW5kIHRoZSBlbmQgb2YgdGhlIHRleHQKKyAgICAgKiBAcGFyYW0gcnVuSXNSdGwgdHJ1ZSBpZiB0aGUgcnVuIGlzIHJpZ2h0LXRvLWxlZnQKKyAgICAgKiBAcGFyYW0gYyB0aGUgY2FudmFzLCBjYW4gYmUgbnVsbCBpZiByZW5kZXJpbmcgaXMgbm90IG5lZWRlZAorICAgICAqIEBwYXJhbSB4IHRoZSBlZGdlIG9mIHRoZSBydW4gY2xvc2VzdCB0byB0aGUgbGVhZGluZyBtYXJnaW4KKyAgICAgKiBAcGFyYW0gdG9wIHRoZSB0b3Agb2YgdGhlIGxpbmUKKyAgICAgKiBAcGFyYW0geSB0aGUgYmFzZWxpbmUKKyAgICAgKiBAcGFyYW0gYm90dG9tIHRoZSBib3R0b20gb2YgdGhlIGxpbmUKKyAgICAgKiBAcGFyYW0gZm1pIHJlY2VpdmVzIG1ldHJpY3MgaW5mb3JtYXRpb24sIGNhbiBiZSBudWxsCisgICAgICogQHBhcmFtIG5lZWRXaWR0aCB0cnVlIGlmIHRoZSB3aWR0aCBvZiB0aGUgcnVuIGlzIG5lZWRlZAorICAgICAqIEByZXR1cm4gdGhlIHNpZ25lZCB3aWR0aCBvZiB0aGUgcnVuIGJhc2VkIG9uIHRoZSBydW4gZGlyZWN0aW9uOyBvbmx5CisgICAgICogdmFsaWQgaWYgbmVlZFdpZHRoIGlzIHRydWUKKyAgICAgKi8KKyAgICBwcml2YXRlIGZsb2F0IGhhbmRsZVRleHQoVGV4dFBhaW50IHdwLCBpbnQgc3RhcnQsIGludCBlbmQsCisgICAgICAgICAgICBpbnQgY29udGV4dFN0YXJ0LCBpbnQgY29udGV4dEVuZCwgYm9vbGVhbiBydW5Jc1J0bCwKKyAgICAgICAgICAgIENhbnZhcyBjLCBmbG9hdCB4LCBpbnQgdG9wLCBpbnQgeSwgaW50IGJvdHRvbSwKKyAgICAgICAgICAgIEZvbnRNZXRyaWNzSW50IGZtaSwgYm9vbGVhbiBuZWVkV2lkdGgpIHsKKworICAgICAgICBmbG9hdCByZXQgPSAwOworCisgICAgICAgIGludCBydW5MZW4gPSBlbmQgLSBzdGFydDsKKyAgICAgICAgaW50IGNvbnRleHRMZW4gPSBjb250ZXh0RW5kIC0gY29udGV4dFN0YXJ0OworICAgICAgICBpZiAobmVlZFdpZHRoIHx8IChjICE9IG51bGwgJiYgKHdwLmJnQ29sb3IgIT0gMCB8fCBydW5Jc1J0bCkpKSB7CisgICAgICAgICAgICBpbnQgZmxhZ3MgPSBydW5Jc1J0bCA/IFBhaW50LkRJUkVDVElPTl9SVEwgOiBQYWludC5ESVJFQ1RJT05fTFRSOworICAgICAgICAgICAgaWYgKG1DaGFyc1ZhbGlkKSB7CisgICAgICAgICAgICAgICAgcmV0ID0gd3AuZ2V0VGV4dFJ1bkFkdmFuY2VzKG1DaGFycywgc3RhcnQsIHJ1bkxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHRTdGFydCwgY29udGV4dExlbiwgZmxhZ3MsIG51bGwsIDApOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpbnQgZGVsdGEgPSBtU3RhcnQ7CisgICAgICAgICAgICAgICAgcmV0ID0gd3AuZ2V0VGV4dFJ1bkFkdmFuY2VzKG1UZXh0LCBkZWx0YSArIHN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgZGVsdGEgKyBlbmQsIGRlbHRhICsgY29udGV4dFN0YXJ0LCBkZWx0YSArIGNvbnRleHRFbmQsCisgICAgICAgICAgICAgICAgICAgICAgICBmbGFncywgbnVsbCwgMCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoZm1pICE9IG51bGwpIHsKKyAgICAgICAgICAgIHdwLmdldEZvbnRNZXRyaWNzSW50KGZtaSk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoYyAhPSBudWxsKSB7CisgICAgICAgICAgICBpZiAocnVuSXNSdGwpIHsKKyAgICAgICAgICAgICAgICB4IC09IHJldDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHdwLmJnQ29sb3IgIT0gMCkgeworICAgICAgICAgICAgICAgIGludCBjb2xvciA9IHdwLmdldENvbG9yKCk7CisgICAgICAgICAgICAgICAgUGFpbnQuU3R5bGUgcyA9IHdwLmdldFN0eWxlKCk7CisgICAgICAgICAgICAgICAgd3Auc2V0Q29sb3Iod3AuYmdDb2xvcik7CisgICAgICAgICAgICAgICAgd3Auc2V0U3R5bGUoUGFpbnQuU3R5bGUuRklMTCk7CisKKyAgICAgICAgICAgICAgICBjLmRyYXdSZWN0KHgsIHRvcCwgeCArIHJldCwgYm90dG9tLCB3cCk7CisKKyAgICAgICAgICAgICAgICB3cC5zZXRTdHlsZShzKTsKKyAgICAgICAgICAgICAgICB3cC5zZXRDb2xvcihjb2xvcik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGRyYXdUZXh0UnVuKGMsIHdwLCBzdGFydCwgZW5kLCBjb250ZXh0U3RhcnQsIGNvbnRleHRFbmQsIHJ1bklzUnRsLAorICAgICAgICAgICAgICAgICAgICB4LCB5ICsgd3AuYmFzZWxpbmVTaGlmdCk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gcnVuSXNSdGwgPyAtcmV0IDogcmV0OworICAgIH0KKworICAgIC8qKgorICAgICAqIFV0aWxpdHkgZnVuY3Rpb24gZm9yIG1lYXN1cmluZyBhbmQgcmVuZGVyaW5nIGEgcmVwbGFjZW1lbnQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVwbGFjZW1lbnQgdGhlIHJlcGxhY2VtZW50CisgICAgICogQHBhcmFtIHdwIHRoZSB3b3JrIHBhaW50CisgICAgICogQHBhcmFtIHJ1bkluZGV4IHRoZSBydW4gaW5kZXgKKyAgICAgKiBAcGFyYW0gc3RhcnQgdGhlIHN0YXJ0IG9mIHRoZSBydW4KKyAgICAgKiBAcGFyYW0gbGltaXQgdGhlIGxpbWl0IG9mIHRoZSBydW4KKyAgICAgKiBAcGFyYW0gcnVuSXNSdGwgdHJ1ZSBpZiB0aGUgcnVuIGlzIHJpZ2h0LXRvLWxlZnQKKyAgICAgKiBAcGFyYW0gYyB0aGUgY2FudmFzLCBjYW4gYmUgbnVsbCBpZiBub3QgcmVuZGVyaW5nCisgICAgICogQHBhcmFtIHggdGhlIGVkZ2Ugb2YgdGhlIHJlcGxhY2VtZW50IGNsb3Nlc3QgdG8gdGhlIGxlYWRpbmcgbWFyZ2luCisgICAgICogQHBhcmFtIHRvcCB0aGUgdG9wIG9mIHRoZSBsaW5lCisgICAgICogQHBhcmFtIHkgdGhlIGJhc2VsaW5lCisgICAgICogQHBhcmFtIGJvdHRvbSB0aGUgYm90dG9tIG9mIHRoZSBsaW5lCisgICAgICogQHBhcmFtIGZtaSByZWNlaXZlcyBtZXRyaWNzIGluZm9ybWF0aW9uLCBjYW4gYmUgbnVsbAorICAgICAqIEBwYXJhbSBuZWVkV2lkdGggdHJ1ZSBpZiB0aGUgd2lkdGggb2YgdGhlIHJlcGxhY2VtZW50IGlzIG5lZWRlZAorICAgICAqIEByZXR1cm4gdGhlIHNpZ25lZCB3aWR0aCBvZiB0aGUgcnVuIGJhc2VkIG9uIHRoZSBydW4gZGlyZWN0aW9uOyBvbmx5CisgICAgICogdmFsaWQgaWYgbmVlZFdpZHRoIGlzIHRydWUKKyAgICAgKi8KKyAgICBwcml2YXRlIGZsb2F0IGhhbmRsZVJlcGxhY2VtZW50KFJlcGxhY2VtZW50U3BhbiByZXBsYWNlbWVudCwgVGV4dFBhaW50IHdwLAorICAgICAgICAgICAgaW50IHJ1bkluZGV4LCBpbnQgc3RhcnQsIGludCBsaW1pdCwgYm9vbGVhbiBydW5Jc1J0bCwgQ2FudmFzIGMsCisgICAgICAgICAgICBmbG9hdCB4LCBpbnQgdG9wLCBpbnQgeSwgaW50IGJvdHRvbSwgRm9udE1ldHJpY3NJbnQgZm1pLAorICAgICAgICAgICAgYm9vbGVhbiBuZWVkV2lkdGgpIHsKKworICAgICAgICBmbG9hdCByZXQgPSAwOworCisgICAgICAgIGludCB0ZXh0U3RhcnQgPSBtU3RhcnQgKyBzdGFydDsKKyAgICAgICAgaW50IHRleHRMaW1pdCA9IG1TdGFydCArIGxpbWl0OworCisgICAgICAgIGlmIChuZWVkV2lkdGggfHwgKGMgIT0gbnVsbCAmJiBydW5Jc1J0bCkpIHsKKyAgICAgICAgICAgIHJldCA9IHJlcGxhY2VtZW50LmdldFNpemUod3AsIG1UZXh0LCB0ZXh0U3RhcnQsIHRleHRMaW1pdCwgZm1pKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChjICE9IG51bGwpIHsKKyAgICAgICAgICAgIGlmIChydW5Jc1J0bCkgeworICAgICAgICAgICAgICAgIHggLT0gcmV0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmVwbGFjZW1lbnQuZHJhdyhjLCBtVGV4dCwgdGV4dFN0YXJ0LCB0ZXh0TGltaXQsCisgICAgICAgICAgICAgICAgICAgIHgsIHRvcCwgeSwgYm90dG9tLCB3cCk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gcnVuSXNSdGwgPyAtcmV0IDogcmV0OworICAgIH0KKworICAgIC8qKgorICAgICAqIFV0aWxpdHkgZnVuY3Rpb24gZm9yIGhhbmRsaW5nIGEgdW5pZGlyZWN0aW9uYWwgcnVuLiAgVGhlIHJ1biBtdXN0IG5vdAorICAgICAqIGNvbnRhaW4gdGFicyBvciBlbW9qaSBidXQgY2FuIGNvbnRhaW4gc3R5bGVzLgorICAgICAqCisgICAgICogQHBhcmFtIHJ1bkluZGV4IHRoZSBydW4gaW5kZXgKKyAgICAgKiBAcGFyYW0gc3RhcnQgdGhlIGxpbmUtcmVsYXRpdmUgc3RhcnQgb2YgdGhlIHJ1bgorICAgICAqIEBwYXJhbSBtZWFzdXJlTGltaXQgdGhlIG9mZnNldCB0byBtZWFzdXJlIHRvLCBiZXR3ZWVuIHN0YXJ0IGFuZCBsaW1pdCBpbmNsdXNpdmUKKyAgICAgKiBAcGFyYW0gbGltaXQgdGhlIGxpbWl0IG9mIHRoZSBydW4KKyAgICAgKiBAcGFyYW0gcnVuSXNSdGwgdHJ1ZSBpZiB0aGUgcnVuIGlzIHJpZ2h0LXRvLWxlZnQKKyAgICAgKiBAcGFyYW0gYyB0aGUgY2FudmFzLCBjYW4gYmUgbnVsbAorICAgICAqIEBwYXJhbSB4IHRoZSBlbmQgb2YgdGhlIHJ1biBjbG9zZXN0IHRvIHRoZSBsZWFkaW5nIG1hcmdpbgorICAgICAqIEBwYXJhbSB0b3AgdGhlIHRvcCBvZiB0aGUgbGluZQorICAgICAqIEBwYXJhbSB5IHRoZSBiYXNlbGluZQorICAgICAqIEBwYXJhbSBib3R0b20gdGhlIGJvdHRvbSBvZiB0aGUgbGluZQorICAgICAqIEBwYXJhbSBmbWkgcmVjZWl2ZXMgbWV0cmljcyBpbmZvcm1hdGlvbiwgY2FuIGJlIG51bGwKKyAgICAgKiBAcGFyYW0gbmVlZFdpZHRoIHRydWUgaWYgdGhlIHdpZHRoIGlzIHJlcXVpcmVkCisgICAgICogQHJldHVybiB0aGUgc2lnbmVkIHdpZHRoIG9mIHRoZSBydW4gYmFzZWQgb24gdGhlIHJ1biBkaXJlY3Rpb247IG9ubHkKKyAgICAgKiB2YWxpZCBpZiBuZWVkV2lkdGggaXMgdHJ1ZQorICAgICAqLworICAgIHByaXZhdGUgZmxvYXQgaGFuZGxlUnVuKGludCBydW5JbmRleCwgaW50IHN0YXJ0LCBpbnQgbWVhc3VyZUxpbWl0LAorICAgICAgICAgICAgaW50IGxpbWl0LCBib29sZWFuIHJ1bklzUnRsLCBDYW52YXMgYywgZmxvYXQgeCwgaW50IHRvcCwgaW50IHksCisgICAgICAgICAgICBpbnQgYm90dG9tLCBGb250TWV0cmljc0ludCBmbWksIGJvb2xlYW4gbmVlZFdpZHRoKSB7CisKKyAgICAgICAgLy8gU2hhcGluZyBuZWVkcyB0byB0YWtlIGludG8gYWNjb3VudCBjb250ZXh0IHVwIHRvIG1ldHJpYyBib3VuZGFyaWVzLAorICAgICAgICAvLyBidXQgcmVuZGVyaW5nIG5lZWRzIHRvIHRha2UgaW50byBhY2NvdW50IGNoYXJhY3RlciBzdHlsZSBib3VuZGFyaWVzLgorICAgICAgICAvLyBTbyB3ZSBpdGVyYXRlIHRocm91Z2ggbWV0cmljIHJ1bnMgdG8gZ2V0IG1ldHJpYyBib3VuZHMsCisgICAgICAgIC8vIHRoZW4gd2l0aGluIGVhY2ggbWV0cmljIHJ1biBpdGVyYXRlIHRocm91Z2ggY2hhcmFjdGVyIHN0eWxlIHJ1bnMKKyAgICAgICAgLy8gZm9yIHRoZSBydW4gYm91bmRzLgorICAgICAgICBmbG9hdCBveCA9IHg7CisgICAgICAgIGZvciAoaW50IGkgPSBzdGFydCwgaW5leHQ7IGkgPCBtZWFzdXJlTGltaXQ7IGkgPSBpbmV4dCkgeworICAgICAgICAgICAgVGV4dFBhaW50IHdwID0gbVdvcmtQYWludDsKKyAgICAgICAgICAgIHdwLnNldChtUGFpbnQpOworCisgICAgICAgICAgICBpbnQgbWxpbWl0OworICAgICAgICAgICAgaWYgKG1TcGFubmVkID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBpbmV4dCA9IGxpbWl0OworICAgICAgICAgICAgICAgIG1saW1pdCA9IG1lYXN1cmVMaW1pdDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaW5leHQgPSBtU3Bhbm5lZC5uZXh0U3BhblRyYW5zaXRpb24obVN0YXJ0ICsgaSwgbVN0YXJ0ICsgbGltaXQsCisgICAgICAgICAgICAgICAgICAgICAgICBNZXRyaWNBZmZlY3RpbmdTcGFuLmNsYXNzKSAtIG1TdGFydDsKKworICAgICAgICAgICAgICAgIG1saW1pdCA9IGluZXh0IDwgbWVhc3VyZUxpbWl0ID8gaW5leHQgOiBtZWFzdXJlTGltaXQ7CisgICAgICAgICAgICAgICAgTWV0cmljQWZmZWN0aW5nU3BhbltdIHNwYW5zID0gbVNwYW5uZWQuZ2V0U3BhbnMobVN0YXJ0ICsgaSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1TdGFydCArIG1saW1pdCwgTWV0cmljQWZmZWN0aW5nU3Bhbi5jbGFzcyk7CisKKyAgICAgICAgICAgICAgICBpZiAoc3BhbnMubGVuZ3RoID4gMCkgeworICAgICAgICAgICAgICAgICAgICBSZXBsYWNlbWVudFNwYW4gcmVwbGFjZW1lbnQgPSBudWxsOworICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IHNwYW5zLmxlbmd0aDsgaisrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBNZXRyaWNBZmZlY3RpbmdTcGFuIHNwYW4gPSBzcGFuc1tqXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzcGFuIGluc3RhbmNlb2YgUmVwbGFjZW1lbnRTcGFuKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwbGFjZW1lbnQgPSAoUmVwbGFjZW1lbnRTcGFuKXNwYW47CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdlIG1pZ2h0IGhhdmUgYSByZXBsYWNlbWVudCB0aGF0IHVzZXMgdGhlIGRyYXcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzdGF0ZSwgb3RoZXJ3aXNlIG1lYXN1cmUgc3RhdGUgd291bGQgc3VmZmljZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcGFuLnVwZGF0ZURyYXdTdGF0ZSh3cCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBpZiAocmVwbGFjZW1lbnQgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgeCArPSBoYW5kbGVSZXBsYWNlbWVudChyZXBsYWNlbWVudCwgd3AsIHJ1bkluZGV4LCBpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbGltaXQsIHJ1bklzUnRsLCBjLCB4LCB0b3AsIHksIGJvdHRvbSwgZm1pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZWVkV2lkdGggfHwgbWxpbWl0IDwgbWVhc3VyZUxpbWl0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAobVNwYW5uZWQgPT0gbnVsbCB8fCBjID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICB4ICs9IGhhbmRsZVRleHQod3AsIGksIG1saW1pdCwgaSwgaW5leHQsIHJ1bklzUnRsLCBjLCB4LCB0b3AsCisgICAgICAgICAgICAgICAgICAgICAgICB5LCBib3R0b20sIGZtaSwgbmVlZFdpZHRoIHx8IG1saW1pdCA8IG1lYXN1cmVMaW1pdCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGZvciAoaW50IGogPSBpLCBqbmV4dDsgaiA8IG1saW1pdDsgaiA9IGpuZXh0KSB7CisgICAgICAgICAgICAgICAgICAgIGpuZXh0ID0gbVNwYW5uZWQubmV4dFNwYW5UcmFuc2l0aW9uKG1TdGFydCArIGosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVN0YXJ0ICsgbWxpbWl0LCBDaGFyYWN0ZXJTdHlsZS5jbGFzcykgLSBtU3RhcnQ7CisKKyAgICAgICAgICAgICAgICAgICAgQ2hhcmFjdGVyU3R5bGVbXSBzcGFucyA9IG1TcGFubmVkLmdldFNwYW5zKG1TdGFydCArIGosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVN0YXJ0ICsgam5leHQsIENoYXJhY3RlclN0eWxlLmNsYXNzKTsKKworICAgICAgICAgICAgICAgICAgICB3cC5zZXQobVBhaW50KTsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgayA9IDA7IGsgPCBzcGFucy5sZW5ndGg7IGsrKykgeworICAgICAgICAgICAgICAgICAgICAgICAgQ2hhcmFjdGVyU3R5bGUgc3BhbiA9IHNwYW5zW2tdOworICAgICAgICAgICAgICAgICAgICAgICAgc3Bhbi51cGRhdGVEcmF3U3RhdGUod3ApOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgeCArPSBoYW5kbGVUZXh0KHdwLCBqLCBqbmV4dCwgaSwgaW5leHQsIHJ1bklzUnRsLCBjLCB4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvcCwgeSwgYm90dG9tLCBmbWksIG5lZWRXaWR0aCB8fCBqbmV4dCA8IG1lYXN1cmVMaW1pdCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHggLSBveDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZW5kZXIgYSB0ZXh0IHJ1biB3aXRoIHRoZSBzZXQtdXAgcGFpbnQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYyB0aGUgY2FudmFzCisgICAgICogQHBhcmFtIHdwIHRoZSBwYWludCB1c2VkIHRvIHJlbmRlciB0aGUgdGV4dAorICAgICAqIEBwYXJhbSBzdGFydCB0aGUgc3RhcnQgb2YgdGhlIHJ1bgorICAgICAqIEBwYXJhbSBlbmQgdGhlIGVuZCBvZiB0aGUgcnVuCisgICAgICogQHBhcmFtIGNvbnRleHRTdGFydCB0aGUgc3RhcnQgb2YgY29udGV4dCBmb3IgdGhlIHJ1bgorICAgICAqIEBwYXJhbSBjb250ZXh0RW5kIHRoZSBlbmQgb2YgdGhlIGNvbnRleHQgZm9yIHRoZSBydW4KKyAgICAgKiBAcGFyYW0gcnVuSXNSdGwgdHJ1ZSBpZiB0aGUgcnVuIGlzIHJpZ2h0LXRvLWxlZnQKKyAgICAgKiBAcGFyYW0geCB0aGUgeCBwb3NpdGlvbiBvZiB0aGUgbGVmdCBlZGdlIG9mIHRoZSBydW4KKyAgICAgKiBAcGFyYW0geSB0aGUgYmFzZWxpbmUgb2YgdGhlIHJ1bgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBkcmF3VGV4dFJ1bihDYW52YXMgYywgVGV4dFBhaW50IHdwLCBpbnQgc3RhcnQsIGludCBlbmQsCisgICAgICAgICAgICBpbnQgY29udGV4dFN0YXJ0LCBpbnQgY29udGV4dEVuZCwgYm9vbGVhbiBydW5Jc1J0bCwgZmxvYXQgeCwgaW50IHkpIHsKKworICAgICAgICBpbnQgZmxhZ3MgPSBydW5Jc1J0bCA/IENhbnZhcy5ESVJFQ1RJT05fUlRMIDogQ2FudmFzLkRJUkVDVElPTl9MVFI7CisgICAgICAgIGlmIChtQ2hhcnNWYWxpZCkgeworICAgICAgICAgICAgaW50IGNvdW50ID0gZW5kIC0gc3RhcnQ7CisgICAgICAgICAgICBpbnQgY29udGV4dENvdW50ID0gY29udGV4dEVuZCAtIGNvbnRleHRTdGFydDsKKyAgICAgICAgICAgIGMuZHJhd1RleHRSdW4obUNoYXJzLCBzdGFydCwgY291bnQsIGNvbnRleHRTdGFydCwgY29udGV4dENvdW50LAorICAgICAgICAgICAgICAgICAgICB4LCB5LCBmbGFncywgd3ApOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaW50IGRlbHRhID0gbVN0YXJ0OworICAgICAgICAgICAgYy5kcmF3VGV4dFJ1bihtVGV4dCwgZGVsdGEgKyBzdGFydCwgZGVsdGEgKyBlbmQsCisgICAgICAgICAgICAgICAgICAgIGRlbHRhICsgY29udGV4dFN0YXJ0LCBkZWx0YSArIGNvbnRleHRFbmQsIHgsIHksIGZsYWdzLCB3cCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBhc2NlbnQgb2YgdGhlIHRleHQgYXQgc3RhcnQuICBUaGlzIGlzIHVzZWQgZm9yIHNjYWxpbmcKKyAgICAgKiBlbW9qaS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwb3MgdGhlIGxpbmUtcmVsYXRpdmUgcG9zaXRpb24KKyAgICAgKiBAcmV0dXJuIHRoZSBhc2NlbnQgb2YgdGhlIHRleHQgYXQgc3RhcnQKKyAgICAgKi8KKyAgICBmbG9hdCBhc2NlbnQoaW50IHBvcykgeworICAgICAgICBpZiAobVNwYW5uZWQgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIG1QYWludC5hc2NlbnQoKTsKKyAgICAgICAgfQorCisgICAgICAgIHBvcyArPSBtU3RhcnQ7CisgICAgICAgIE1ldHJpY0FmZmVjdGluZ1NwYW5bXSBzcGFucyA9IG1TcGFubmVkLmdldFNwYW5zKHBvcywgcG9zICsgMSwKKyAgICAgICAgICAgICAgICBNZXRyaWNBZmZlY3RpbmdTcGFuLmNsYXNzKTsKKyAgICAgICAgaWYgKHNwYW5zLmxlbmd0aCA9PSAwKSB7CisgICAgICAgICAgICByZXR1cm4gbVBhaW50LmFzY2VudCgpOworICAgICAgICB9CisKKyAgICAgICAgVGV4dFBhaW50IHdwID0gbVdvcmtQYWludDsKKyAgICAgICAgd3Auc2V0KG1QYWludCk7CisgICAgICAgIGZvciAoTWV0cmljQWZmZWN0aW5nU3BhbiBzcGFuIDogc3BhbnMpIHsKKyAgICAgICAgICAgIHNwYW4udXBkYXRlTWVhc3VyZVN0YXRlKHdwKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gd3AuYXNjZW50KCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgbmV4dCB0YWIgcG9zaXRpb24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gaCB0aGUgKHVuc2lnbmVkKSBvZmZzZXQgZnJvbSB0aGUgbGVhZGluZyBtYXJnaW4KKyAgICAgKiBAcmV0dXJuIHRoZSAodW5zaWduZWQpIHRhYiBwb3NpdGlvbiBhZnRlciB0aGlzIG9mZnNldAorICAgICAqLworICAgIGZsb2F0IG5leHRUYWIoZmxvYXQgaCkgeworICAgICAgICBpZiAobVRhYnMgIT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIG1UYWJzLm5leHRUYWIoaCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIFRhYlN0b3BzLm5leHREZWZhdWx0U3RvcChoLCBUQUJfSU5DUkVNRU5UKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgVEFCX0lOQ1JFTUVOVCA9IDIwOworfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvdGV4dC9UZXh0VXRpbHMuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3RleHQvVGV4dFV0aWxzLmphdmEKaW5kZXggODY3NWQwNS4uNzc0ODI2NSAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvdGV4dC9UZXh0VXRpbHMuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC90ZXh0L1RleHRVdGlscy5qYXZhCkBAIC0xNywxMiArMTcsMTEgQEAKIHBhY2thZ2UgYW5kcm9pZC50ZXh0OwogCiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwuUjsKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC51dGlsLkFycmF5VXRpbHM7CiAKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLkNvbG9yU3RhdGVMaXN0OwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuUmVzb3VyY2VzOwogaW1wb3J0IGFuZHJvaWQub3MuUGFyY2VsOwogaW1wb3J0IGFuZHJvaWQub3MuUGFyY2VsYWJsZTsKLWltcG9ydCBhbmRyb2lkLnRleHQubWV0aG9kLlRleHRLZXlMaXN0ZW5lci5DYXBpdGFsaXplOwogaW1wb3J0IGFuZHJvaWQudGV4dC5zdHlsZS5BYnNvbHV0ZVNpemVTcGFuOwogaW1wb3J0IGFuZHJvaWQudGV4dC5zdHlsZS5BbGlnbm1lbnRTcGFuOwogaW1wb3J0IGFuZHJvaWQudGV4dC5zdHlsZS5CYWNrZ3JvdW5kQ29sb3JTcGFuOwpAQCAtNDUsMTAgKzQ0LDggQEAKIGltcG9ydCBhbmRyb2lkLnRleHQuc3R5bGUuVW5kZXJsaW5lU3BhbjsKIGltcG9ydCBhbmRyb2lkLnV0aWwuUHJpbnRlcjsKIAotaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnV0aWwuQXJyYXlVdGlsczsKLQotaW1wb3J0IGphdmEudXRpbC5yZWdleC5QYXR0ZXJuOwogaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwucmVnZXguUGF0dGVybjsKIAogcHVibGljIGNsYXNzIFRleHRVdGlscyB7CiAgICAgcHJpdmF0ZSBUZXh0VXRpbHMoKSB7IC8qIGNhbm5vdCBiZSBpbnN0YW50aWF0ZWQgKi8gfQpAQCAtOTgzLDcgKzk4MCw3IEBACiAgICAgLyoqCiAgICAgICogUmV0dXJucyB0aGUgb3JpZ2luYWwgdGV4dCBpZiBpdCBmaXRzIGluIHRoZSBzcGVjaWZpZWQgd2lkdGgKICAgICAgKiBnaXZlbiB0aGUgcHJvcGVydGllcyBvZiB0aGUgc3BlY2lmaWVkIFBhaW50LAotICAgICAqIG9yLCBpZiBpdCBkb2VzIG5vdCBmaXQsIGEgY29weSB3aXRoIGVsbGlwc2lzIGNoYXJhY3RlciBhZGRlZCAKKyAgICAgKiBvciwgaWYgaXQgZG9lcyBub3QgZml0LCBhIGNvcHkgd2l0aCBlbGxpcHNpcyBjaGFyYWN0ZXIgYWRkZWQKICAgICAgKiBhdCB0aGUgc3BlY2lmaWVkIGVkZ2Ugb3IgY2VudGVyLgogICAgICAqIElmIDxjb2RlPnByZXNlcnZlTGVuZ3RoPC9jb2RlPiBpcyBzcGVjaWZpZWQsIHRoZSByZXR1cm5lZCBjb3B5CiAgICAgICogd2lsbCBiZSBwYWRkZWQgd2l0aCB6ZXJvLXdpZHRoIHNwYWNlcyB0byBwcmVzZXJ2ZSB0aGUgb3JpZ2luYWwKQEAgLTk5Miw3ICs5ODksNyBAQAogICAgICAqIHJlcG9ydCB0aGUgc3RhcnQgYW5kIGVuZCBvZiB0aGUgZWxsaXBzaXplZCByYW5nZS4KICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIENoYXJTZXF1ZW5jZSBlbGxpcHNpemUoQ2hhclNlcXVlbmNlIHRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRleHRQYWludCBwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUZXh0UGFpbnQgcGFpbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGF2YWlsLCBUcnVuY2F0ZUF0IHdoZXJlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIHByZXNlcnZlTGVuZ3RoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFbGxpcHNpemVDYWxsYmFjayBjYWxsYmFjaykgewpAQCAtMTAwMywxMyArMTAwMCwxMiBAQAogCiAgICAgICAgIGludCBsZW4gPSB0ZXh0Lmxlbmd0aCgpOwogCi0gICAgICAgIC8vIFVzZSBQYWludC5icmVha1RleHQoKSBmb3IgdGhlIG5vbi1TcGFubmVkIGNhc2UgdG8gYXZvaWQgaGF2aW5nCi0gICAgICAgIC8vIHRvIGFsbG9jYXRlIG1lbW9yeSBhbmQgYWNjdW11bGF0ZSB0aGUgY2hhcmFjdGVyIHdpZHRocyBvdXJzZWx2ZXMuCisgICAgICAgIE1lYXN1cmVkVGV4dCBtdCA9IE1lYXN1cmVkVGV4dC5vYnRhaW4oKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGZsb2F0IHdpZHRoID0gc2V0UGFyYShtdCwgcGFpbnQsIHRleHQsIDAsIHRleHQubGVuZ3RoKCksCisgICAgICAgICAgICAgICAgICAgIExheW91dC5ESVJfUkVRVUVTVF9ERUZBVUxUX0xUUik7CiAKLSAgICAgICAgaWYgKCEodGV4dCBpbnN0YW5jZW9mIFNwYW5uZWQpKSB7Ci0gICAgICAgICAgICBmbG9hdCB3aWQgPSBwLm1lYXN1cmVUZXh0KHRleHQsIDAsIGxlbik7Ci0KLSAgICAgICAgICAgIGlmICh3aWQgPD0gYXZhaWwpIHsKKyAgICAgICAgICAgIGlmICh3aWR0aCA8PSBhdmFpbCkgewogICAgICAgICAgICAgICAgIGlmIChjYWxsYmFjayAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrLmVsbGlwc2l6ZWQoMCwgMCk7CiAgICAgICAgICAgICAgICAgfQpAQCAtMTAxNywyNTAgKzEwMTMsNjkgQEAKICAgICAgICAgICAgICAgICByZXR1cm4gdGV4dDsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgZmxvYXQgZWxsaXBzaXN3aWQgPSBwLm1lYXN1cmVUZXh0KHNFbGxpcHNpcyk7CisgICAgICAgICAgICAvLyBYWFggYXNzdW1lcyBlbGxpcHNpcyBzdHJpbmcgZG9lcyBub3QgcmVxdWlyZSBzaGFwaW5nIGFuZAorICAgICAgICAgICAgLy8gaXMgdW5hZmZlY3RlZCBieSBzdHlsZQorICAgICAgICAgICAgZmxvYXQgZWxsaXBzaXN3aWQgPSBwYWludC5tZWFzdXJlVGV4dChzRWxsaXBzaXMpOworICAgICAgICAgICAgYXZhaWwgLT0gZWxsaXBzaXN3aWQ7CiAKLSAgICAgICAgICAgIGlmIChlbGxpcHNpc3dpZCA+IGF2YWlsKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGNhbGxiYWNrICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2suZWxsaXBzaXplZCgwLCBsZW4pOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChwcmVzZXJ2ZUxlbmd0aCkgewotICAgICAgICAgICAgICAgICAgICBjaGFyW10gYnVmID0gb2J0YWluKGxlbik7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZltpXSA9ICdcdUZFRkYnOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyByZXQgPSBuZXcgU3RyaW5nKGJ1ZiwgMCwgbGVuKTsKLSAgICAgICAgICAgICAgICAgICAgcmVjeWNsZShidWYpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0OwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiAiIjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmICh3aGVyZSA9PSBUcnVuY2F0ZUF0LlNUQVJUKSB7Ci0gICAgICAgICAgICAgICAgaW50IGZpdCA9IHAuYnJlYWtUZXh0KHRleHQsIDAsIGxlbiwgZmFsc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2YWlsIC0gZWxsaXBzaXN3aWQsIG51bGwpOwotCi0gICAgICAgICAgICAgICAgaWYgKGNhbGxiYWNrICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2suZWxsaXBzaXplZCgwLCBsZW4gLSBmaXQpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChwcmVzZXJ2ZUxlbmd0aCkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmxhbmsodGV4dCwgMCwgbGVuIC0gZml0KTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gc0VsbGlwc2lzICsgdGV4dC50b1N0cmluZygpLnN1YnN0cmluZyhsZW4gLSBmaXQsIGxlbik7Ci0gICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgaW50IGxlZnQgPSAwOworICAgICAgICAgICAgaW50IHJpZ2h0ID0gbGVuOworICAgICAgICAgICAgaWYgKGF2YWlsIDwgMCkgeworICAgICAgICAgICAgICAgIC8vIGl0IGFsbCBnb2VzCisgICAgICAgICAgICB9IGVsc2UgaWYgKHdoZXJlID09IFRydW5jYXRlQXQuU1RBUlQpIHsKKyAgICAgICAgICAgICAgICByaWdodCA9IGxlbiAtIG10LmJyZWFrVGV4dCgwLCBsZW4sIGZhbHNlLCBhdmFpbCk7CiAgICAgICAgICAgICB9IGVsc2UgaWYgKHdoZXJlID09IFRydW5jYXRlQXQuRU5EKSB7Ci0gICAgICAgICAgICAgICAgaW50IGZpdCA9IHAuYnJlYWtUZXh0KHRleHQsIDAsIGxlbiwgdHJ1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZhaWwgLSBlbGxpcHNpc3dpZCwgbnVsbCk7Ci0KLSAgICAgICAgICAgICAgICBpZiAoY2FsbGJhY2sgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBjYWxsYmFjay5lbGxpcHNpemVkKGZpdCwgbGVuKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAocHJlc2VydmVMZW5ndGgpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJsYW5rKHRleHQsIGZpdCwgbGVuKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGV4dC50b1N0cmluZygpLnN1YnN0cmluZygwLCBmaXQpICsgc0VsbGlwc2lzOwotICAgICAgICAgICAgICAgIH0gCi0gICAgICAgICAgICB9IGVsc2UgLyogd2hlcmUgPT0gVHJ1bmNhdGVBdC5NSURETEUgKi8gewotICAgICAgICAgICAgICAgIGludCByaWdodCA9IHAuYnJlYWtUZXh0KHRleHQsIDAsIGxlbiwgZmFsc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGF2YWlsIC0gZWxsaXBzaXN3aWQpIC8gMiwgbnVsbCk7Ci0gICAgICAgICAgICAgICAgZmxvYXQgdXNlZCA9IHAubWVhc3VyZVRleHQodGV4dCwgbGVuIC0gcmlnaHQsIGxlbik7Ci0gICAgICAgICAgICAgICAgaW50IGxlZnQgPSBwLmJyZWFrVGV4dCh0ZXh0LCAwLCBsZW4gLSByaWdodCwgdHJ1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2YWlsIC0gZWxsaXBzaXN3aWQgLSB1c2VkLCBudWxsKTsKLQotICAgICAgICAgICAgICAgIGlmIChjYWxsYmFjayAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrLmVsbGlwc2l6ZWQobGVmdCwgbGVuIC0gcmlnaHQpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChwcmVzZXJ2ZUxlbmd0aCkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmxhbmsodGV4dCwgbGVmdCwgbGVuIC0gcmlnaHQpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBzID0gdGV4dC50b1N0cmluZygpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gcy5zdWJzdHJpbmcoMCwgbGVmdCkgKyBzRWxsaXBzaXMgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgcy5zdWJzdHJpbmcobGVuIC0gcmlnaHQsIGxlbik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gQnV0IGRvIHRoZSBTcGFubmVkIGNhc2VzIGJ5IGhhbmQsIGJlY2F1c2UgaXQncyBzdWNoIGEgcGFpbgotICAgICAgICAvLyB0byBpdGVyYXRlIHRoZSBzcGFuIHRyYW5zaXRpb25zIGJhY2t3YXJkcyBhbmQgZ2V0VGV4dFdpZHRocygpCi0gICAgICAgIC8vIHdpbGwgZ2l2ZSB1cyB0aGUgaW5mb3JtYXRpb24gd2UgbmVlZC4KLQotICAgICAgICAvLyBnZXRUZXh0V2lkdGhzKCkgYWx3YXlzIHdyaXRlcyBpbnRvIHRoZSBzdGFydCBvZiB0aGUgYXJyYXksCi0gICAgICAgIC8vIHNvIG1lYXN1cmUgZWFjaCBzcGFuIGludG8gdGhlIGZpcnN0IGhhbGYgYW5kIHRoZW4gY29weSB0aGUKLSAgICAgICAgLy8gcmVzdWx0cyBpbnRvIHRoZSBzZWNvbmQgaGFsZiB0byB1c2UgbGF0ZXIuCi0KLSAgICAgICAgZmxvYXRbXSB3aWQgPSBuZXcgZmxvYXRbbGVuICogMl07Ci0gICAgICAgIFRleHRQYWludCB0ZW1wcGFpbnQgPSBuZXcgVGV4dFBhaW50KCk7Ci0gICAgICAgIFNwYW5uZWQgc3AgPSAoU3Bhbm5lZCkgdGV4dDsKLQotICAgICAgICBpbnQgbmV4dDsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW47IGkgPSBuZXh0KSB7Ci0gICAgICAgICAgICBuZXh0ID0gc3AubmV4dFNwYW5UcmFuc2l0aW9uKGksIGxlbiwgTWV0cmljQWZmZWN0aW5nU3Bhbi5jbGFzcyk7Ci0KLSAgICAgICAgICAgIFN0eWxlZC5nZXRUZXh0V2lkdGhzKHAsIHRlbXBwYWludCwgc3AsIGksIG5leHQsIHdpZCwgbnVsbCk7Ci0gICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KHdpZCwgMCwgd2lkLCBsZW4gKyBpLCBuZXh0IC0gaSk7Ci0gICAgICAgIH0KLQotICAgICAgICBmbG9hdCBzdW0gPSAwOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7Ci0gICAgICAgICAgICBzdW0gKz0gd2lkW2xlbiArIGldOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHN1bSA8PSBhdmFpbCkgewotICAgICAgICAgICAgaWYgKGNhbGxiYWNrICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBjYWxsYmFjay5lbGxpcHNpemVkKDAsIDApOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gdGV4dDsKLSAgICAgICAgfQotCi0gICAgICAgIGZsb2F0IGVsbGlwc2lzd2lkID0gcC5tZWFzdXJlVGV4dChzRWxsaXBzaXMpOwotCi0gICAgICAgIGlmIChlbGxpcHNpc3dpZCA+IGF2YWlsKSB7Ci0gICAgICAgICAgICBpZiAoY2FsbGJhY2sgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGNhbGxiYWNrLmVsbGlwc2l6ZWQoMCwgbGVuKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKHByZXNlcnZlTGVuZ3RoKSB7Ci0gICAgICAgICAgICAgICAgY2hhcltdIGJ1ZiA9IG9idGFpbihsZW4pOwotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgYnVmW2ldID0gJ1x1RkVGRic7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIFNwYW5uYWJsZVN0cmluZyBzcyA9IG5ldyBTcGFubmFibGVTdHJpbmcobmV3IFN0cmluZyhidWYsIDAsIGxlbikpOwotICAgICAgICAgICAgICAgIHJlY3ljbGUoYnVmKTsKLSAgICAgICAgICAgICAgICBjb3B5U3BhbnNGcm9tKHNwLCAwLCBsZW4sIE9iamVjdC5jbGFzcywgc3MsIDApOwotICAgICAgICAgICAgICAgIHJldHVybiBzczsKKyAgICAgICAgICAgICAgICBsZWZ0ID0gbXQuYnJlYWtUZXh0KDAsIGxlbiwgdHJ1ZSwgYXZhaWwpOwogICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gIiI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAod2hlcmUgPT0gVHJ1bmNhdGVBdC5TVEFSVCkgewotICAgICAgICAgICAgc3VtID0gMDsKLSAgICAgICAgICAgIGludCBpOwotCi0gICAgICAgICAgICBmb3IgKGkgPSBsZW47IGkgPj0gMDsgaS0tKSB7Ci0gICAgICAgICAgICAgICAgZmxvYXQgdyA9IHdpZFtsZW4gKyBpIC0gMV07Ci0KLSAgICAgICAgICAgICAgICBpZiAodyArIHN1bSArIGVsbGlwc2lzd2lkID4gYXZhaWwpIHsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgc3VtICs9IHc7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChjYWxsYmFjayAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgY2FsbGJhY2suZWxsaXBzaXplZCgwLCBpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKHByZXNlcnZlTGVuZ3RoKSB7Ci0gICAgICAgICAgICAgICAgU3Bhbm5hYmxlU3RyaW5nIHNzID0gbmV3IFNwYW5uYWJsZVN0cmluZyhibGFuayh0ZXh0LCAwLCBpKSk7Ci0gICAgICAgICAgICAgICAgY29weVNwYW5zRnJvbShzcCwgMCwgbGVuLCBPYmplY3QuY2xhc3MsIHNzLCAwKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gc3M7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIFNwYW5uYWJsZVN0cmluZ0J1aWxkZXIgb3V0ID0gbmV3IFNwYW5uYWJsZVN0cmluZ0J1aWxkZXIoc0VsbGlwc2lzKTsKLSAgICAgICAgICAgICAgICBvdXQuaW5zZXJ0KDEsIHRleHQsIGksIGxlbik7Ci0KLSAgICAgICAgICAgICAgICByZXR1cm4gb3V0OwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKHdoZXJlID09IFRydW5jYXRlQXQuRU5EKSB7Ci0gICAgICAgICAgICBzdW0gPSAwOwotICAgICAgICAgICAgaW50IGk7Ci0KLSAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykgewotICAgICAgICAgICAgICAgIGZsb2F0IHcgPSB3aWRbbGVuICsgaV07Ci0KLSAgICAgICAgICAgICAgICBpZiAodyArIHN1bSArIGVsbGlwc2lzd2lkID4gYXZhaWwpIHsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgc3VtICs9IHc7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChjYWxsYmFjayAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgY2FsbGJhY2suZWxsaXBzaXplZChpLCBsZW4pOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAocHJlc2VydmVMZW5ndGgpIHsKLSAgICAgICAgICAgICAgICBTcGFubmFibGVTdHJpbmcgc3MgPSBuZXcgU3Bhbm5hYmxlU3RyaW5nKGJsYW5rKHRleHQsIGksIGxlbikpOwotICAgICAgICAgICAgICAgIGNvcHlTcGFuc0Zyb20oc3AsIDAsIGxlbiwgT2JqZWN0LmNsYXNzLCBzcywgMCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHNzOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBTcGFubmFibGVTdHJpbmdCdWlsZGVyIG91dCA9IG5ldyBTcGFubmFibGVTdHJpbmdCdWlsZGVyKHNFbGxpcHNpcyk7Ci0gICAgICAgICAgICAgICAgb3V0Lmluc2VydCgwLCB0ZXh0LCAwLCBpKTsKLQotICAgICAgICAgICAgICAgIHJldHVybiBvdXQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSAvKiB3aGVyZSA9IFRydW5jYXRlQXQuTUlERExFICovIHsKLSAgICAgICAgICAgIGZsb2F0IGxzdW0gPSAwLCByc3VtID0gMDsKLSAgICAgICAgICAgIGludCBsZWZ0ID0gMCwgcmlnaHQgPSBsZW47Ci0KLSAgICAgICAgICAgIGZsb2F0IHJhdmFpbCA9IChhdmFpbCAtIGVsbGlwc2lzd2lkKSAvIDI7Ci0gICAgICAgICAgICBmb3IgKHJpZ2h0ID0gbGVuOyByaWdodCA+PSAwOyByaWdodC0tKSB7Ci0gICAgICAgICAgICAgICAgZmxvYXQgdyA9IHdpZFtsZW4gKyByaWdodCAtIDFdOwotCi0gICAgICAgICAgICAgICAgaWYgKHcgKyByc3VtID4gcmF2YWlsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHJzdW0gKz0gdzsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgZmxvYXQgbGF2YWlsID0gYXZhaWwgLSBlbGxpcHNpc3dpZCAtIHJzdW07Ci0gICAgICAgICAgICBmb3IgKGxlZnQgPSAwOyBsZWZ0IDwgcmlnaHQ7IGxlZnQrKykgewotICAgICAgICAgICAgICAgIGZsb2F0IHcgPSB3aWRbbGVuICsgbGVmdF07Ci0KLSAgICAgICAgICAgICAgICBpZiAodyArIGxzdW0gPiBsYXZhaWwpIHsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgbHN1bSArPSB3OworICAgICAgICAgICAgICAgIHJpZ2h0ID0gbGVuIC0gbXQuYnJlYWtUZXh0KDAsIGxlbiwgZmFsc2UsIGF2YWlsIC8gMik7CisgICAgICAgICAgICAgICAgYXZhaWwgLT0gbXQubWVhc3VyZShyaWdodCwgbGVuKTsKKyAgICAgICAgICAgICAgICBsZWZ0ID0gbXQuYnJlYWtUZXh0KDAsIHJpZ2h0LCB0cnVlLCBhdmFpbCk7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIGlmIChjYWxsYmFjayAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgY2FsbGJhY2suZWxsaXBzaXplZChsZWZ0LCByaWdodCk7CiAgICAgICAgICAgICB9CiAKKyAgICAgICAgICAgIGNoYXJbXSBidWYgPSBtdC5tQ2hhcnM7CisgICAgICAgICAgICBTcGFubmVkIHNwID0gdGV4dCBpbnN0YW5jZW9mIFNwYW5uZWQgPyAoU3Bhbm5lZCkgdGV4dCA6IG51bGw7CisKKyAgICAgICAgICAgIGludCByZW1haW5pbmcgPSBsZW4gLSAocmlnaHQgLSBsZWZ0KTsKICAgICAgICAgICAgIGlmIChwcmVzZXJ2ZUxlbmd0aCkgewotICAgICAgICAgICAgICAgIFNwYW5uYWJsZVN0cmluZyBzcyA9IG5ldyBTcGFubmFibGVTdHJpbmcoYmxhbmsodGV4dCwgbGVmdCwgcmlnaHQpKTsKKyAgICAgICAgICAgICAgICBpZiAocmVtYWluaW5nID4gMCkgeyAvLyBlbHNlIGVsaW1pbmF0ZSB0aGUgZWxsaXBzaXMgdG9vCisgICAgICAgICAgICAgICAgICAgIGJ1ZltsZWZ0KytdID0gJ1x1MjAyNic7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSBsZWZ0OyBpIDwgcmlnaHQ7IGkrKykgeworICAgICAgICAgICAgICAgICAgICBidWZbaV0gPSAnXHVGRUZGJzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgU3RyaW5nIHMgPSBuZXcgU3RyaW5nKGJ1ZiwgMCwgbGVuKTsKKyAgICAgICAgICAgICAgICBpZiAoc3AgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gczsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgU3Bhbm5hYmxlU3RyaW5nIHNzID0gbmV3IFNwYW5uYWJsZVN0cmluZyhzKTsKICAgICAgICAgICAgICAgICBjb3B5U3BhbnNGcm9tKHNwLCAwLCBsZW4sIE9iamVjdC5jbGFzcywgc3MsIDApOwogICAgICAgICAgICAgICAgIHJldHVybiBzczsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgU3Bhbm5hYmxlU3RyaW5nQnVpbGRlciBvdXQgPSBuZXcgU3Bhbm5hYmxlU3RyaW5nQnVpbGRlcihzRWxsaXBzaXMpOwotICAgICAgICAgICAgICAgIG91dC5pbnNlcnQoMCwgdGV4dCwgMCwgbGVmdCk7Ci0gICAgICAgICAgICAgICAgb3V0Lmluc2VydChvdXQubGVuZ3RoKCksIHRleHQsIHJpZ2h0LCBsZW4pOwotCi0gICAgICAgICAgICAgICAgcmV0dXJuIG91dDsKICAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KIAotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBibGFuayhDaGFyU2VxdWVuY2Ugc291cmNlLCBpbnQgc3RhcnQsIGludCBlbmQpIHsKLSAgICAgICAgaW50IGxlbiA9IHNvdXJjZS5sZW5ndGgoKTsKLSAgICAgICAgY2hhcltdIGJ1ZiA9IG9idGFpbihsZW4pOwotCi0gICAgICAgIGlmIChzdGFydCAhPSAwKSB7Ci0gICAgICAgICAgICBnZXRDaGFycyhzb3VyY2UsIDAsIHN0YXJ0LCBidWYsIDApOwotICAgICAgICB9Ci0gICAgICAgIGlmIChlbmQgIT0gbGVuKSB7Ci0gICAgICAgICAgICBnZXRDaGFycyhzb3VyY2UsIGVuZCwgbGVuLCBidWYsIGVuZCk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoc3RhcnQgIT0gZW5kKSB7Ci0gICAgICAgICAgICBidWZbc3RhcnRdID0gJ1x1MjAyNic7Ci0KLSAgICAgICAgICAgIGZvciAoaW50IGkgPSBzdGFydCArIDE7IGkgPCBlbmQ7IGkrKykgewotICAgICAgICAgICAgICAgIGJ1ZltpXSA9ICdcdUZFRkYnOworICAgICAgICAgICAgaWYgKHJlbWFpbmluZyA9PSAwKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuICIiOwogICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgCi0gICAgICAgIFN0cmluZyByZXQgPSBuZXcgU3RyaW5nKGJ1ZiwgMCwgbGVuKTsKLSAgICAgICAgcmVjeWNsZShidWYpOwogCi0gICAgICAgIHJldHVybiByZXQ7CisgICAgICAgICAgICBpZiAoc3AgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcihyZW1haW5pbmcgKyBzRWxsaXBzaXMubGVuZ3RoKCkpOworICAgICAgICAgICAgICAgIHNiLmFwcGVuZChidWYsIDAsIGxlZnQpOworICAgICAgICAgICAgICAgIHNiLmFwcGVuZChzRWxsaXBzaXMpOworICAgICAgICAgICAgICAgIHNiLmFwcGVuZChidWYsIHJpZ2h0LCBsZW4gLSByaWdodCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIFNwYW5uYWJsZVN0cmluZ0J1aWxkZXIgc3NiID0gbmV3IFNwYW5uYWJsZVN0cmluZ0J1aWxkZXIoKTsKKyAgICAgICAgICAgIHNzYi5hcHBlbmQodGV4dCwgMCwgbGVmdCk7CisgICAgICAgICAgICBzc2IuYXBwZW5kKHNFbGxpcHNpcyk7CisgICAgICAgICAgICBzc2IuYXBwZW5kKHRleHQsIHJpZ2h0LCBsZW4pOworICAgICAgICAgICAgcmV0dXJuIHNzYjsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIE1lYXN1cmVkVGV4dC5yZWN5Y2xlKG10KTsKKyAgICAgICAgfQogICAgIH0KIAogICAgIC8qKgpAQCAtMTI3OCw4MCArMTA5MywxMjEgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUZXh0UGFpbnQgcCwgZmxvYXQgYXZhaWwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG9uZU1vcmUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG1vcmUpIHsKLSAgICAgICAgaW50IGxlbiA9IHRleHQubGVuZ3RoKCk7Ci0gICAgICAgIGNoYXJbXSBidWYgPSBuZXcgY2hhcltsZW5dOwotICAgICAgICBUZXh0VXRpbHMuZ2V0Q2hhcnModGV4dCwgMCwgbGVuLCBidWYsIDApOwogCi0gICAgICAgIGludCBjb21tYUNvdW50ID0gMDsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW47IGkrKykgewotICAgICAgICAgICAgaWYgKGJ1ZltpXSA9PSAnLCcpIHsKLSAgICAgICAgICAgICAgICBjb21tYUNvdW50Kys7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBmbG9hdFtdIHdpZDsKLQotICAgICAgICBpZiAodGV4dCBpbnN0YW5jZW9mIFNwYW5uZWQpIHsKLSAgICAgICAgICAgIFNwYW5uZWQgc3AgPSAoU3Bhbm5lZCkgdGV4dDsKLSAgICAgICAgICAgIFRleHRQYWludCB0ZW1wcGFpbnQgPSBuZXcgVGV4dFBhaW50KCk7Ci0gICAgICAgICAgICB3aWQgPSBuZXcgZmxvYXRbbGVuICogMl07Ci0KLSAgICAgICAgICAgIGludCBuZXh0OwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW47IGkgPSBuZXh0KSB7Ci0gICAgICAgICAgICAgICAgbmV4dCA9IHNwLm5leHRTcGFuVHJhbnNpdGlvbihpLCBsZW4sIE1ldHJpY0FmZmVjdGluZ1NwYW4uY2xhc3MpOwotCi0gICAgICAgICAgICAgICAgU3R5bGVkLmdldFRleHRXaWR0aHMocCwgdGVtcHBhaW50LCBzcCwgaSwgbmV4dCwgd2lkLCBudWxsKTsKLSAgICAgICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KHdpZCwgMCwgd2lkLCBsZW4gKyBpLCBuZXh0IC0gaSk7CisgICAgICAgIE1lYXN1cmVkVGV4dCBtdCA9IE1lYXN1cmVkVGV4dC5vYnRhaW4oKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBsZW4gPSB0ZXh0Lmxlbmd0aCgpOworICAgICAgICAgICAgZmxvYXQgd2lkdGggPSBzZXRQYXJhKG10LCBwLCB0ZXh0LCAwLCBsZW4sIExheW91dC5ESVJfUkVRVUVTVF9ERUZBVUxUX0xUUik7CisgICAgICAgICAgICBpZiAod2lkdGggPD0gYXZhaWwpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdGV4dDsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weSh3aWQsIGxlbiwgd2lkLCAwLCBsZW4pOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgd2lkID0gbmV3IGZsb2F0W2xlbl07Ci0gICAgICAgICAgICBwLmdldFRleHRXaWR0aHModGV4dCwgMCwgbGVuLCB3aWQpOwotICAgICAgICB9CisgICAgICAgICAgICBjaGFyW10gYnVmID0gbXQubUNoYXJzOwogCi0gICAgICAgIGludCBvayA9IDA7Ci0gICAgICAgIGludCBva1JlbWFpbmluZyA9IGNvbW1hQ291bnQgKyAxOwotICAgICAgICBTdHJpbmcgb2tGb3JtYXQgPSAiIjsKLQotICAgICAgICBpbnQgdyA9IDA7Ci0gICAgICAgIGludCBjb3VudCA9IDA7Ci0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW47IGkrKykgewotICAgICAgICAgICAgdyArPSB3aWRbaV07Ci0KLSAgICAgICAgICAgIGlmIChidWZbaV0gPT0gJywnKSB7Ci0gICAgICAgICAgICAgICAgY291bnQrKzsKLQotICAgICAgICAgICAgICAgIGludCByZW1haW5pbmcgPSBjb21tYUNvdW50IC0gY291bnQgKyAxOwotICAgICAgICAgICAgICAgIGZsb2F0IG1vcmVXaWQ7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGZvcm1hdDsKLQotICAgICAgICAgICAgICAgIGlmIChyZW1haW5pbmcgPT0gMSkgewotICAgICAgICAgICAgICAgICAgICBmb3JtYXQgPSAiICIgKyBvbmVNb3JlOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGZvcm1hdCA9ICIgIiArIFN0cmluZy5mb3JtYXQobW9yZSwgcmVtYWluaW5nKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBtb3JlV2lkID0gcC5tZWFzdXJlVGV4dChmb3JtYXQpOwotCi0gICAgICAgICAgICAgICAgaWYgKHcgKyBtb3JlV2lkIDw9IGF2YWlsKSB7Ci0gICAgICAgICAgICAgICAgICAgIG9rID0gaSArIDE7Ci0gICAgICAgICAgICAgICAgICAgIG9rUmVtYWluaW5nID0gcmVtYWluaW5nOwotICAgICAgICAgICAgICAgICAgICBva0Zvcm1hdCA9IGZvcm1hdDsKKyAgICAgICAgICAgIGludCBjb21tYUNvdW50ID0gMDsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKKyAgICAgICAgICAgICAgICBpZiAoYnVmW2ldID09ICcsJykgeworICAgICAgICAgICAgICAgICAgICBjb21tYUNvdW50Kys7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQotICAgICAgICB9CiAKLSAgICAgICAgaWYgKHcgPD0gYXZhaWwpIHsKLSAgICAgICAgICAgIHJldHVybiB0ZXh0OwotICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaW50IHJlbWFpbmluZyA9IGNvbW1hQ291bnQgKyAxOworCisgICAgICAgICAgICBpbnQgb2sgPSAwOworICAgICAgICAgICAgaW50IG9rUmVtYWluaW5nID0gcmVtYWluaW5nOworICAgICAgICAgICAgU3RyaW5nIG9rRm9ybWF0ID0gIiI7CisKKyAgICAgICAgICAgIGludCB3ID0gMDsKKyAgICAgICAgICAgIGludCBjb3VudCA9IDA7CisgICAgICAgICAgICBmbG9hdFtdIHdpZHRocyA9IG10Lm1XaWR0aHM7CisKKyAgICAgICAgICAgIGludCByZXF1ZXN0ID0gbXQubURpciA9PSAxID8gTGF5b3V0LkRJUl9SRVFVRVNUX0xUUiA6CisgICAgICAgICAgICAgICAgTGF5b3V0LkRJUl9SRVFVRVNUX1JUTDsKKworICAgICAgICAgICAgTWVhc3VyZWRUZXh0IHRlbXBNdCA9IE1lYXN1cmVkVGV4dC5vYnRhaW4oKTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKKyAgICAgICAgICAgICAgICB3ICs9IHdpZHRoc1tpXTsKKworICAgICAgICAgICAgICAgIGlmIChidWZbaV0gPT0gJywnKSB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50Kys7CisKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGZvcm1hdDsKKyAgICAgICAgICAgICAgICAgICAgLy8gWFhYIHNob3VsZCBub3QgaW5zZXJ0IHNwYWNlcywgc2hvdWxkIGJlIHBhcnQgb2Ygc3RyaW5nCisgICAgICAgICAgICAgICAgICAgIC8vIFhYWCBzaG91bGQgdXNlIHBsdXJhbCBydWxlcyBhbmQgbm90IGFzc3VtZSBFbmdsaXNoIHBsdXJhbHMKKyAgICAgICAgICAgICAgICAgICAgaWYgKC0tcmVtYWluaW5nID09IDEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdCA9ICIgIiArIG9uZU1vcmU7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXQgPSAiICIgKyBTdHJpbmcuZm9ybWF0KG1vcmUsIHJlbWFpbmluZyk7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAvLyBYWFggdGhpcyBpcyBwcm9iYWJseSBvaywgYnV0IG5lZWQgdG8gbG9vayBhdCBpdCBtb3JlCisgICAgICAgICAgICAgICAgICAgIHRlbXBNdC5zZXRQYXJhKGZvcm1hdCwgMCwgZm9ybWF0Lmxlbmd0aCgpLCByZXF1ZXN0KTsKKyAgICAgICAgICAgICAgICAgICAgZmxvYXQgbW9yZVdpZCA9IG10LmFkZFN0eWxlUnVuKHAsIG10Lm1MZW4sIG51bGwpOworCisgICAgICAgICAgICAgICAgICAgIGlmICh3ICsgbW9yZVdpZCA8PSBhdmFpbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgb2sgPSBpICsgMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG9rUmVtYWluaW5nID0gcmVtYWluaW5nOworICAgICAgICAgICAgICAgICAgICAgICAgb2tGb3JtYXQgPSBmb3JtYXQ7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBNZWFzdXJlZFRleHQucmVjeWNsZSh0ZW1wTXQpOworCiAgICAgICAgICAgICBTcGFubmFibGVTdHJpbmdCdWlsZGVyIG91dCA9IG5ldyBTcGFubmFibGVTdHJpbmdCdWlsZGVyKG9rRm9ybWF0KTsKICAgICAgICAgICAgIG91dC5pbnNlcnQoMCwgdGV4dCwgMCwgb2spOwogICAgICAgICAgICAgcmV0dXJuIG91dDsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIE1lYXN1cmVkVGV4dC5yZWN5Y2xlKG10KTsKICAgICAgICAgfQogICAgIH0KIAorICAgIHByaXZhdGUgc3RhdGljIGZsb2F0IHNldFBhcmEoTWVhc3VyZWRUZXh0IG10LCBUZXh0UGFpbnQgcGFpbnQsCisgICAgICAgICAgICBDaGFyU2VxdWVuY2UgdGV4dCwgaW50IHN0YXJ0LCBpbnQgZW5kLCBpbnQgYmlkaVJlcXVlc3QpIHsKKworICAgICAgICBtdC5zZXRQYXJhKHRleHQsIHN0YXJ0LCBlbmQsIGJpZGlSZXF1ZXN0KTsKKworICAgICAgICBmbG9hdCB3aWR0aDsKKyAgICAgICAgU3Bhbm5lZCBzcCA9IHRleHQgaW5zdGFuY2VvZiBTcGFubmVkID8gKFNwYW5uZWQpIHRleHQgOiBudWxsOworICAgICAgICBpbnQgbGVuID0gZW5kIC0gc3RhcnQ7CisgICAgICAgIGlmIChzcCA9PSBudWxsKSB7CisgICAgICAgICAgICB3aWR0aCA9IG10LmFkZFN0eWxlUnVuKHBhaW50LCBsZW4sIG51bGwpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgd2lkdGggPSAwOworICAgICAgICAgICAgaW50IHNwYW5FbmQ7CisgICAgICAgICAgICBmb3IgKGludCBzcGFuU3RhcnQgPSAwOyBzcGFuU3RhcnQgPCBsZW47IHNwYW5TdGFydCA9IHNwYW5FbmQpIHsKKyAgICAgICAgICAgICAgICBzcGFuRW5kID0gc3AubmV4dFNwYW5UcmFuc2l0aW9uKHNwYW5TdGFydCwgbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgTWV0cmljQWZmZWN0aW5nU3Bhbi5jbGFzcyk7CisgICAgICAgICAgICAgICAgTWV0cmljQWZmZWN0aW5nU3BhbltdIHNwYW5zID0gc3AuZ2V0U3BhbnMoCisgICAgICAgICAgICAgICAgICAgICAgICBzcGFuU3RhcnQsIHNwYW5FbmQsIE1ldHJpY0FmZmVjdGluZ1NwYW4uY2xhc3MpOworICAgICAgICAgICAgICAgIHdpZHRoICs9IG10LmFkZFN0eWxlUnVuKHBhaW50LCBzcGFucywgc3BhbkVuZCAtIHNwYW5TdGFydCwgbnVsbCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gd2lkdGg7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2hhciBGSVJTVF9SSUdIVF9UT19MRUZUID0gJ1x1MDU5MCc7CisKKyAgICAvKiBwYWNrYWdlICovCisgICAgc3RhdGljIGJvb2xlYW4gZG9lc05vdE5lZWRCaWRpKENoYXJTZXF1ZW5jZSBzLCBpbnQgc3RhcnQsIGludCBlbmQpIHsKKyAgICAgICAgZm9yIChpbnQgaSA9IHN0YXJ0OyBpIDwgZW5kOyBpKyspIHsKKyAgICAgICAgICAgIGlmIChzLmNoYXJBdChpKSA+PSBGSVJTVF9SSUdIVF9UT19MRUZUKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIC8qIHBhY2thZ2UgKi8KKyAgICBzdGF0aWMgYm9vbGVhbiBkb2VzTm90TmVlZEJpZGkoY2hhcltdIHRleHQsIGludCBzdGFydCwgaW50IGxlbikgeworICAgICAgICBmb3IgKGludCBpID0gc3RhcnQsIGUgPSBpICsgbGVuOyBpIDwgZTsgaSsrKSB7CisgICAgICAgICAgICBpZiAodGV4dFtpXSA+PSBGSVJTVF9SSUdIVF9UT19MRUZUKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKwogICAgIC8qIHBhY2thZ2UgKi8gc3RhdGljIGNoYXJbXSBvYnRhaW4oaW50IGxlbikgewogICAgICAgICBjaGFyW10gYnVmOwogCkBAIC0xNTI5LDcgKzEzODUsNyBAQAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENBUF9NT0RFX0NIQVJBQ1RFUlMKICAgICAgICAgICAgID0gSW5wdXRUeXBlLlRZUEVfVEVYVF9GTEFHX0NBUF9DSEFSQUNURVJTOwotICAgIAorCiAgICAgLyoqCiAgICAgICogQ2FwaXRhbGl6YXRpb24gbW9kZSBmb3Ige0BsaW5rICNnZXRDYXBzTW9kZX06IGNhcGl0YWxpemUgdGhlIGZpcnN0CiAgICAgICogY2hhcmFjdGVyIG9mIGFsbCB3b3Jkcy4gIFRoaXMgdmFsdWUgaXMgZXhwbGljaXRseSBkZWZpbmVkIHRvIGJlIHRoZSBzYW1lIGFzCkBAIC0xNTM3LDcgKzEzOTMsNyBAQAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENBUF9NT0RFX1dPUkRTCiAgICAgICAgICAgICA9IElucHV0VHlwZS5UWVBFX1RFWFRfRkxBR19DQVBfV09SRFM7Ci0gICAgCisKICAgICAvKioKICAgICAgKiBDYXBpdGFsaXphdGlvbiBtb2RlIGZvciB7QGxpbmsgI2dldENhcHNNb2RlfTogY2FwaXRhbGl6ZSB0aGUgZmlyc3QKICAgICAgKiBjaGFyYWN0ZXIgb2YgZWFjaCBzZW50ZW5jZS4gIFRoaXMgdmFsdWUgaXMgZXhwbGljaXRseSBkZWZpbmVkIHRvIGJlIHRoZSBzYW1lIGFzCkBAIC0xNTQ1LDEzICsxNDAxLDEzIEBACiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ0FQX01PREVfU0VOVEVOQ0VTCiAgICAgICAgICAgICA9IElucHV0VHlwZS5UWVBFX1RFWFRfRkxBR19DQVBfU0VOVEVOQ0VTOwotICAgIAorCiAgICAgLyoqCiAgICAgICogRGV0ZXJtaW5lIHdoYXQgY2FwcyBtb2RlIHNob3VsZCBiZSBpbiBlZmZlY3QgYXQgdGhlIGN1cnJlbnQgb2Zmc2V0IGluCiAgICAgICogdGhlIHRleHQuICBPbmx5IHRoZSBtb2RlIGJpdHMgc2V0IGluIDx2YXI+cmVxTW9kZXM8L3Zhcj4gd2lsbCBiZQogICAgICAqIGNoZWNrZWQuICBOb3RlIHRoYXQgdGhlIGNhcHMgbW9kZSBmbGFncyBoZXJlIGFyZSBleHBsaWNpdGx5IGRlZmluZWQKICAgICAgKiB0byBtYXRjaCB0aG9zZSBpbiB7QGxpbmsgSW5wdXRUeXBlfS4KLSAgICAgKiAKKyAgICAgKgogICAgICAqIEBwYXJhbSBjcyBUaGUgdGV4dCB0aGF0IHNob3VsZCBiZSBjaGVja2VkIGZvciBjYXBzIG1vZGVzLgogICAgICAqIEBwYXJhbSBvZmYgTG9jYXRpb24gaW4gdGhlIHRleHQgYXQgd2hpY2ggdG8gY2hlY2suCiAgICAgICogQHBhcmFtIHJlcU1vZGVzIFRoZSBtb2RlcyB0byBiZSBjaGVja2VkOiBtYXkgYmUgYW55IGNvbWJpbmF0aW9uIG9mCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC90ZXh0L21ldGhvZC9Ub3VjaC5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvdGV4dC9tZXRob2QvVG91Y2guamF2YQppbmRleCBhMTlhNzhlLi4zYjk4ZmMzIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC90ZXh0L21ldGhvZC9Ub3VjaC5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3RleHQvbWV0aG9kL1RvdWNoLmphdmEKQEAgLTQ0LDYgKzQ0LDcgQEAKICAgICAgICAgaW50IGxlZnQgPSBJbnRlZ2VyLk1BWF9WQUxVRTsKICAgICAgICAgaW50IHJpZ2h0ID0gMDsKICAgICAgICAgQWxpZ25tZW50IGEgPSBudWxsOworICAgICAgICBib29sZWFuIGx0ciA9IHRydWU7CiAKICAgICAgICAgZm9yIChpbnQgaSA9IHRvcDsgaSA8PSBib3R0b207IGkrKykgewogICAgICAgICAgICAgbGVmdCA9IChpbnQpIE1hdGgubWluKGxlZnQsIGxheW91dC5nZXRMaW5lTGVmdChpKSk7CkBAIC01MSw2ICs1Miw3IEBACiAKICAgICAgICAgICAgIGlmIChhID09IG51bGwpIHsKICAgICAgICAgICAgICAgICBhID0gbGF5b3V0LmdldFBhcmFncmFwaEFsaWdubWVudChpKTsKKyAgICAgICAgICAgICAgICBsdHIgPSBsYXlvdXQuZ2V0UGFyYWdyYXBoRGlyZWN0aW9uKGkpID4gMDsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCkBAIC01OCwxMCArNjAsMTIgQEAKICAgICAgICAgaW50IHdpZHRoID0gd2lkZ2V0LmdldFdpZHRoKCk7CiAgICAgICAgIGludCBkaWZmID0gMDsKIAorICAgICAgICAvLyBhbGlnbl9vcHBvc2l0ZSBkb2VzIE5PVCBtZWFuIGFsaWduX3JpZ2h0LCB3ZSBuZWVkIHRoZSBwYXJhZ3JhcGgKKyAgICAgICAgLy8gZGlyZWN0aW9uIHRvIHJlc29sdmUgaXQgdG8gbGVmdCBvciByaWdodAogICAgICAgICBpZiAocmlnaHQgLSBsZWZ0IDwgd2lkdGggLSBwYWRkaW5nKSB7CiAgICAgICAgICAgICBpZiAoYSA9PSBBbGlnbm1lbnQuQUxJR05fQ0VOVEVSKSB7CiAgICAgICAgICAgICAgICAgZGlmZiA9ICh3aWR0aCAtIHBhZGRpbmcgLSAocmlnaHQgLSBsZWZ0KSkgLyAyOwotICAgICAgICAgICAgfSBlbHNlIGlmIChhID09IEFsaWdubWVudC5BTElHTl9PUFBPU0lURSkgeworICAgICAgICAgICAgfSBlbHNlIGlmIChsdHIgPT0gKGEgPT0gQWxpZ25tZW50LkFMSUdOX09QUE9TSVRFKSkgewogICAgICAgICAgICAgICAgIGRpZmYgPSB3aWR0aCAtIHBhZGRpbmcgLSAocmlnaHQgLSBsZWZ0KTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvdXRpbC9BbmRyb2lkRXhjZXB0aW9uLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC91dGlsL0FuZHJvaWRFeGNlcHRpb24uamF2YQppbmRleCBhNzY3ZWExLi5kZmUwMGM5YiAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvdXRpbC9BbmRyb2lkRXhjZXB0aW9uLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvdXRpbC9BbmRyb2lkRXhjZXB0aW9uLmphdmEKQEAgLTI3LDYgKzI3LDEwIEBACiAgICAgICAgIHN1cGVyKG5hbWUpOwogICAgIH0KIAorICAgIHB1YmxpYyBBbmRyb2lkRXhjZXB0aW9uKFN0cmluZyBuYW1lLCBUaHJvd2FibGUgY2F1c2UpIHsKKyAgICAgICAgc3VwZXIobmFtZSwgY2F1c2UpOworICAgIH0KKwogICAgIHB1YmxpYyBBbmRyb2lkRXhjZXB0aW9uKEV4Y2VwdGlvbiBjYXVzZSkgewogICAgICAgICBzdXBlcihjYXVzZSk7CiAgICAgfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvdXRpbC9BbmRyb2lkUnVudGltZUV4Y2VwdGlvbi5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvdXRpbC9BbmRyb2lkUnVudGltZUV4Y2VwdGlvbi5qYXZhCmluZGV4IDRlZDE3YmMuLjJiODI0YmYgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3V0aWwvQW5kcm9pZFJ1bnRpbWVFeGNlcHRpb24uamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC91dGlsL0FuZHJvaWRSdW50aW1lRXhjZXB0aW9uLmphdmEKQEAgLTI3LDYgKzI3LDEwIEBACiAgICAgICAgIHN1cGVyKG5hbWUpOwogICAgIH0KIAorICAgIHB1YmxpYyBBbmRyb2lkUnVudGltZUV4Y2VwdGlvbihTdHJpbmcgbmFtZSwgVGhyb3dhYmxlIGNhdXNlKSB7CisgICAgICAgIHN1cGVyKG5hbWUsIGNhdXNlKTsKKyAgICB9CisKICAgICBwdWJsaWMgQW5kcm9pZFJ1bnRpbWVFeGNlcHRpb24oRXhjZXB0aW9uIGNhdXNlKSB7CiAgICAgICAgIHN1cGVyKGNhdXNlKTsKICAgICB9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC91dGlsL0NoYXJzZXRVdGlscy5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvdXRpbC9DaGFyc2V0VXRpbHMuamF2YQppbmRleCA5ZDkxYWNhLi5hNzYzYTY5IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC91dGlsL0NoYXJzZXRVdGlscy5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3V0aWwvQ2hhcnNldFV0aWxzLmphdmEKQEAgLTE3LDM2ICsxNyw1OCBAQAogcGFja2FnZSBhbmRyb2lkLnV0aWw7CiAKIGltcG9ydCBhbmRyb2lkLm9zLkJ1aWxkOworaW1wb3J0IGFuZHJvaWQudGV4dC5UZXh0VXRpbHM7CiAKIGltcG9ydCBqYXZhLm5pby5jaGFyc2V0LkNoYXJzZXQ7CiBpbXBvcnQgamF2YS5uaW8uY2hhcnNldC5JbGxlZ2FsQ2hhcnNldE5hbWVFeGNlcHRpb247CiBpbXBvcnQgamF2YS5uaW8uY2hhcnNldC5VbnN1cHBvcnRlZENoYXJzZXRFeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKIAogLyoqCisgKiA8cD4KICAqIEEgY2xhc3MgY29udGFpbmluZyB1dGlsaXR5IG1ldGhvZHMgcmVsYXRlZCB0byBjaGFyYWN0ZXIgc2V0cy4gVGhpcwogICogY2xhc3MgaXMgcHJpbWFyaWx5IHVzZWZ1bCBmb3IgY29kZSB0aGF0IHdpc2hlcyB0byBiZSB2ZW5kb3ItYXdhcmUKLSAqIGluIGl0cyBpbnRlcnByZXRhdGlvbiBvZiBKYXBhbmVzZSBlbmNvZGluZyBuYW1lcy4KLSAqIAotICogPHA+QXMgb2YgdGhpcyB3cml0aW5nLCB0aGUgb25seSB2ZW5kb3IgdGhhdCBpcyByZWNvZ25pemVkIGJ5IHRoaXMKLSAqIGNsYXNzIGlzIERvY29tbyAoaWRlbnRpZmllZCBjYXNlLWluc2Vuc2l0aXZlbHkgYXMge0Bjb2RlICJkb2NvbW8ifSkuPC9wPgotICogCi0gKiA8Yj5Ob3RlOjwvYj4gVGhpcyBjbGFzcyBpcyBoaWRkZW4gaW4gQ3VwY2FrZSwgd2l0aCBhIHBsYW4gdG8KLSAqIHVuLWhpZGUgaW4gRG9udXQuIFRoaXMgd2FzIGRvbmUgYmVjYXVzZSB0aGUgZmlyc3QgZGVwbG95bWVudCB0byB1c2UKLSAqIHRoaXMgY29kZSBpcyBiYXNlZCBvbiBDdXBjYWtlLCBidXQgdGhlIEFQSSBoYWQgdG8gYmUgaW50cm9kdWNlZAotICogYWZ0ZXIgdGhlIHB1YmxpYyBBUEkgZnJlZXplIGZvciB0aGF0IHJlbGVhc2UuIFRoZSB1cHNob3QgaXMgdGhhdAotICogb25seSBzeXN0ZW0gYXBwbGljYXRpb25zIGNhbiBzYWZlbHkgdXNlIHRoaXMgY2xhc3MgdW50aWwgRG9udXQgaXMKLSAqIGF2YWlsYWJsZS4KLSAqIAorICogaW4gaXRzIGludGVycHJldGF0aW9uIG9mIEphcGFuZXNlIGNoYXJzZXQgbmFtZXMgKHVzZWQgaW4gRG9Db01vLAorICogS0RESSwgYW5kIFNvZnRCYW5rKS4KKyAqIDwvcD4KKyAqCisgKiA8cD4KKyAqIDxiPk5vdGU6PC9iPiBEZXZlbG9wZXJzIHdpbGwgbmVlZCB0byBhZGQgYW4gYXBwcm9wcmlhdGUgbWFwcGluZyBmb3IKKyAqIGVhY2ggdmVuZG9yLXNwZWNpZmljIGNoYXJzZXQuIFlvdSBtYXkgbmVlZCB0byBtb2RpZnkgdGhlIEMgbGlicmFyaWVzCisgKiBsaWtlIGljdTRjIGluIG9yZGVyIHRvIGxldCBBbmRyb2lkIHN1cHBvcnQgYW4gYWRkaXRpb25hbCBjaGFyc2V0LgorICogPC9wPgorICoKICAqIEBoaWRlCiAgKi8KIHB1YmxpYyBmaW5hbCBjbGFzcyBDaGFyc2V0VXRpbHMgewogICAgIC8qKgotICAgICAqIG5hbWUgb2YgdGhlIHZlbmRvciAiRG9jb21vIi4gPGI+Tm90ZTo8L2I+IFRoaXMgaXNuJ3QgYSBwdWJsaWMKKyAgICAgKiBuYW1lIG9mIHRoZSB2ZW5kb3IgIkRvQ29NbyIuIDxiPk5vdGU6PC9iPiBUaGlzIGlzbid0IGEgcHVibGljCiAgICAgICogY29uc3RhbnQsIGluIG9yZGVyIHRvIGtlZXAgdGhpcyBjbGFzcyBmcm9tIGJlY29taW5nIGEgZGUgZmFjdG8KICAgICAgKiByZWZlcmVuY2UgbGlzdCBvZiB2ZW5kb3IgbmFtZXMuCiAgICAgICovCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFZFTkRPUl9ET0NPTU8gPSAiZG9jb21vIjsKLSAgICAKKyAgICAvKioKKyAgICAgKiBOYW1lIG9mIHRoZSB2ZW5kb3IgIktEREkiLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBWRU5ET1JfS0RESSA9ICJrZGRpIjsKKyAgICAvKioKKyAgICAgKiBOYW1lIG9mIHRoZSB2ZW5kb3IgIlNvZnRCYW5rIi4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkVORE9SX1NPRlRCQU5LID0gInNvZnRiYW5rIjsKKworICAgIC8qKgorICAgICAqIFJlcHJlc2VudHMgb25lLXRvLW9uZSBtYXBwaW5nIGZyb20gYSB2ZW5kb3IgbmFtZSB0byBhIGNoYXJzZXQgc3BlY2lmaWMgdG8gdGhlIHZlbmRvci4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBNYXA8U3RyaW5nLCBTdHJpbmc+IHNWZW5kb3JTaGlmdEppc01hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPigpOworCisgICAgc3RhdGljIHsKKyAgICAgICAgLy8gVGhlc2UgdmFyaWFudHMgb2YgU2hpZnRfSklTIGNvbWUgZnJvbSBpY3UncyBtYXBwaW5nIGRhdGEgKGNvbnZydHJzLnR4dCkKKyAgICAgICAgc1ZlbmRvclNoaWZ0SmlzTWFwLnB1dChWRU5ET1JfRE9DT01PLCAiZG9jb21vLXNoaWZ0X2ppcy0yMDA3Iik7CisgICAgICAgIHNWZW5kb3JTaGlmdEppc01hcC5wdXQoVkVORE9SX0tEREksICJrZGRpLXNoaWZ0X2ppcy0yMDA3Iik7CisgICAgICAgIHNWZW5kb3JTaGlmdEppc01hcC5wdXQoVkVORE9SX1NPRlRCQU5LLCAic29mdGJhbmstc2hpZnRfamlzLTIwMDciKTsKKyAgICB9CisKICAgICAvKioKICAgICAgKiBUaGlzIGNsYXNzIGlzIHVuaW5zdGFudGlhYmxlLgogICAgICAqLwpAQCAtNTgsMjAgKzgwLDIyIEBACiAgICAgICogUmV0dXJucyB0aGUgbmFtZSBvZiB0aGUgdmVuZG9yLXNwZWNpZmljIGNoYXJhY3RlciBzZXQKICAgICAgKiBjb3JyZXNwb25kaW5nIHRvIHRoZSBnaXZlbiBvcmlnaW5hbCBjaGFyYWN0ZXIgc2V0IG5hbWUgYW5kCiAgICAgICogdmVuZG9yLiBJZiB0aGVyZSBpcyBubyB2ZW5kb3Itc3BlY2lmaWMgY2hhcmFjdGVyIHNldCBmb3IgdGhlCi0gICAgICogZ2l2ZW4gbmFtZS92ZW5kb3IgcGFpciwgdGhpcyByZXR1cm5zIHRoZSBvcmlnaW5hbCBjaGFyYWN0ZXIgc2V0Ci0gICAgICogbmFtZS4gVGhlIHZlbmRvciBuYW1lIGlzIG1hdGNoZWQgY2FzZS1pbnNlbnNpdGl2ZWx5LgotICAgICAqIAorICAgICAqIGdpdmVuIG5hbWUvdmVuZG9yIHBhaXIsIHRoaXMgcmV0dXJucyB0aGUgb3JpZ2luYWwgY2hhcmFjdGVyIHNldCBuYW1lLgorICAgICAqCiAgICAgICogQHBhcmFtIGNoYXJzZXROYW1lIHRoZSBiYXNlIGNoYXJhY3RlciBzZXQgbmFtZQotICAgICAqIEBwYXJhbSB2ZW5kb3IgdGhlIHZlbmRvciB0byBzcGVjaWFsaXplIGZvcgorICAgICAqIEBwYXJhbSB2ZW5kb3IgdGhlIHZlbmRvciB0byBzcGVjaWFsaXplIGZvci4gQWxsIGNoYXJhY3RlcnMgc2hvdWxkIGJlIGxvd2VyLWNhc2VkLgogICAgICAqIEByZXR1cm4gdGhlIHNwZWNpYWxpemVkIGNoYXJhY3RlciBzZXQgbmFtZSwgb3Ige0Bjb2RlIGNoYXJzZXROYW1lfSBpZgogICAgICAqIHRoZXJlIGlzIG5vIHNwZWNpYWxpemVkIG5hbWUKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBuYW1lRm9yVmVuZG9yKFN0cmluZyBjaGFyc2V0TmFtZSwgU3RyaW5nIHZlbmRvcikgewotICAgICAgICAvLyBUT0RPOiBFdmVudHVhbGx5LCB0aGlzIG1heSB3YW50IHRvIGJlIHRhYmxlLWRyaXZlbi4KLQotICAgICAgICBpZiAodmVuZG9yLmVxdWFsc0lnbm9yZUNhc2UoVkVORE9SX0RPQ09NTykKLSAgICAgICAgICAgICAgICAmJiBpc1NoaWZ0SmlzKGNoYXJzZXROYW1lKSkgewotICAgICAgICAgICAgcmV0dXJuICJkb2NvbW8tc2hpZnRfamlzLTIwMDciOworICAgICAgICBpZiAoIVRleHRVdGlscy5pc0VtcHR5KGNoYXJzZXROYW1lKSAmJiAhVGV4dFV0aWxzLmlzRW1wdHkodmVuZG9yKSkgeworICAgICAgICAgICAgLy8gWW91IGNhbiBhZGQgeW91ciBvd24gbWFwcGluZyBoZXJlLgorICAgICAgICAgICAgaWYgKGlzU2hpZnRKaXMoY2hhcnNldE5hbWUpKSB7CisgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIHZlbmRvclNoaWZ0SmlzID0gc1ZlbmRvclNoaWZ0SmlzTWFwLmdldCh2ZW5kb3IpOworICAgICAgICAgICAgICAgIGlmICh2ZW5kb3JTaGlmdEppcyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB2ZW5kb3JTaGlmdEppczsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CiAgICAgICAgIH0KIAogICAgICAgICByZXR1cm4gY2hhcnNldE5hbWU7CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC91dGlsL0ZpbmFsaXplcnMuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3V0aWwvRmluYWxpemVycy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY3MWYyZDQKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2phdmEvYW5kcm9pZC91dGlsL0ZpbmFsaXplcnMuamF2YQpAQCAtMCwwICsxLDEyNyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC51dGlsOworCitpbXBvcnQgamF2YS5sYW5nLnJlZi5QaGFudG9tUmVmZXJlbmNlOworaW1wb3J0IGphdmEubGFuZy5yZWYuUmVmZXJlbmNlOworaW1wb3J0IGphdmEubGFuZy5yZWYuUmVmZXJlbmNlUXVldWU7CisKKy8qKgorICogVGhpcyBjbGFzcyBjYW4gYmUgdXNlZCB0byBpbXBsZW1lbnQgcmVsaWFibGUgZmluYWxpemVycy4KKyAqIAorICogQGhpZGUKKyAqLworcHVibGljIGZpbmFsIGNsYXNzIEZpbmFsaXplcnMgeworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMT0dfVEFHID0gIkZpbmFsaXplcnMiOworICAgIAorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIE9iamVjdFtdIHNMb2NrID0gbmV3IE9iamVjdFswXTsKKyAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIHNJbml0OworICAgIHByaXZhdGUgc3RhdGljIFJlY2xhaW1lciBzUmVjbGFpbWVyOworCisgICAgLyoqCisgICAgICogU3ViY2xhc3Mgb2YgUGhhbnRvbVJlZmVyZW5jZSB1c2VkIHRvIHJlY2xhaW0gcmVzb3VyY2VzLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgYWJzdHJhY3QgY2xhc3MgUmVjbGFpbWFibGVSZWZlcmVuY2U8VD4gZXh0ZW5kcyBQaGFudG9tUmVmZXJlbmNlPFQ+IHsKKyAgICAgICAgcHVibGljIFJlY2xhaW1hYmxlUmVmZXJlbmNlKFQgciwgUmVmZXJlbmNlUXVldWU8T2JqZWN0PiBxKSB7CisgICAgICAgICAgICBzdXBlcihyLCBxKTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgcHVibGljIGFic3RyYWN0IHZvaWQgcmVjbGFpbSgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIHF1ZXVlIHVzZWQgdG8gcmVjbGFpbSBSZWNsYWltYWJsZVJlZmVyZW5jZXMuCisgICAgICogCisgICAgICogQHJldHVybiBBIHJlZmVyZW5jZSBxdWV1ZSBvciBudWxsIGJlZm9yZSBpbml0aWFsaXphdGlvbgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgUmVmZXJlbmNlUXVldWU8T2JqZWN0PiBnZXRRdWV1ZSgpIHsKKyAgICAgICAgc3luY2hyb25pemVkIChzTG9jaykgeworICAgICAgICAgICAgaWYgKCFzSW5pdCkgeworICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCFzUmVjbGFpbWVyLmlzUnVubmluZygpKSB7CisgICAgICAgICAgICAgICAgc1JlY2xhaW1lciA9IG5ldyBSZWNsYWltZXIoc1JlY2xhaW1lci5tUXVldWUpOworICAgICAgICAgICAgICAgIHNSZWNsYWltZXIuc3RhcnQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBzUmVjbGFpbWVyLm1RdWV1ZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEludm9rZWQgYnkgWnlnb3RlLiBEb24ndCB0b3VjaCEKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgaW5pdCgpIHsKKyAgICAgICAgc3luY2hyb25pemVkIChzTG9jaykgeworICAgICAgICAgICAgaWYgKCFzSW5pdCAmJiBzUmVjbGFpbWVyID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBzUmVjbGFpbWVyID0gbmV3IFJlY2xhaW1lcigpOworICAgICAgICAgICAgICAgIHNSZWNsYWltZXIuc3RhcnQoKTsKKyAgICAgICAgICAgICAgICBzSW5pdCA9IHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgUmVjbGFpbWVyIGV4dGVuZHMgVGhyZWFkIHsKKyAgICAgICAgUmVmZXJlbmNlUXVldWU8T2JqZWN0PiBtUXVldWU7CisKKyAgICAgICAgcHJpdmF0ZSB2b2xhdGlsZSBib29sZWFuIG1SdW5uaW5nID0gZmFsc2U7CisKKyAgICAgICAgUmVjbGFpbWVyKCkgeworICAgICAgICAgICAgdGhpcyhuZXcgUmVmZXJlbmNlUXVldWU8T2JqZWN0PigpKTsKKyAgICAgICAgfQorCisgICAgICAgIFJlY2xhaW1lcihSZWZlcmVuY2VRdWV1ZTxPYmplY3Q+IHF1ZXVlKSB7CisgICAgICAgICAgICBzdXBlcigiUmVjbGFpbWVyIik7CisgICAgICAgICAgICBzZXREYWVtb24odHJ1ZSk7CisgICAgICAgICAgICBtUXVldWUgPSBxdWV1ZTsgICAgICAgICAgICAKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBzdGFydCgpIHsKKyAgICAgICAgICAgIG1SdW5uaW5nID0gdHJ1ZTsKKyAgICAgICAgICAgIHN1cGVyLnN0YXJ0KCk7CisgICAgICAgIH0KKworICAgICAgICBib29sZWFuIGlzUnVubmluZygpIHsKKyAgICAgICAgICAgIHJldHVybiBtUnVubmluZzsKKyAgICAgICAgfQorCisgICAgICAgIEBTdXBwcmVzc1dhcm5pbmdzKHsiSW5maW5pdGVMb29wU3RhdGVtZW50In0pCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjbGVhblVwKG1RdWV1ZS5yZW1vdmUoKSk7CisgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIElnbm9yZQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBMb2cuZShMT0dfVEFHLCAiUmVjbGFpbWVyIHRocmVhZCBleGl0aW5nOiAiLCBlKTsKKyAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgbVJ1bm5pbmcgPSBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgdm9pZCBjbGVhblVwKFJlZmVyZW5jZTw/PiByZWZlcmVuY2UpIHsKKyAgICAgICAgICAgIGRvIHsKKyAgICAgICAgICAgICAgICByZWZlcmVuY2UuY2xlYXIoKTsKKyAgICAgICAgICAgICAgICAoKFJlY2xhaW1hYmxlUmVmZXJlbmNlPD8+KSByZWZlcmVuY2UpLnJlY2xhaW0oKTsKKyAgICAgICAgICAgIH0gd2hpbGUgKChyZWZlcmVuY2UgPSBtUXVldWUucG9sbCgpKSAhPSBudWxsKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3V0aWwvSnNvblJlYWRlci5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvdXRpbC9Kc29uUmVhZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzM0NWJmYQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3V0aWwvSnNvblJlYWRlci5qYXZhCkBAIC0wLDAgKzEsMTA1OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC51dGlsOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLlJlYWRlcjsKK2ltcG9ydCBqYXZhLmlvLkNsb3NlYWJsZTsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCisvKioKKyAqIFJlYWRzIGEgSlNPTiAoPGEgaHJlZj0iaHR0cDovL3d3dy5pZXRmLm9yZy9yZmMvcmZjNDYyNy50eHQiPlJGQyA0NjI3PC9hPikKKyAqIGVuY29kZWQgdmFsdWUgYXMgYSBzdHJlYW0gb2YgdG9rZW5zLiBUaGlzIHN0cmVhbSBpbmNsdWRlcyBib3RoIGxpdGVyYWwKKyAqIHZhbHVlcyAoc3RyaW5ncywgbnVtYmVycywgYm9vbGVhbnMsIGFuZCBudWxscykgYXMgd2VsbCBhcyB0aGUgYmVnaW4gYW5kCisgKiBlbmQgZGVsaW1pdGVycyBvZiBvYmplY3RzIGFuZCBhcnJheXMuIFRoZSB0b2tlbnMgYXJlIHRyYXZlcnNlZCBpbgorICogZGVwdGgtZmlyc3Qgb3JkZXIsIHRoZSBzYW1lIG9yZGVyIHRoYXQgdGhleSBhcHBlYXIgaW4gdGhlIEpTT04gZG9jdW1lbnQuCisgKiBXaXRoaW4gSlNPTiBvYmplY3RzLCBuYW1lL3ZhbHVlIHBhaXJzIGFyZSByZXByZXNlbnRlZCBieSBhIHNpbmdsZSB0b2tlbi4KKyAqCisgKiA8aDM+UGFyc2luZyBKU09OPC9oMz4KKyAqIFRvIGNyZWF0ZSBhIHJlY3Vyc2l2ZSBkZXNjZW50IHBhcnNlciB5b3VyIG93biBKU09OIHN0cmVhbXMsIGZpcnN0IGNyZWF0ZSBhbgorICogZW50cnkgcG9pbnQgbWV0aG9kIHRoYXQgY3JlYXRlcyBhIHtAY29kZSBKc29uUmVhZGVyfS4KKyAqCisgKiA8cD5OZXh0LCBjcmVhdGUgaGFuZGxlciBtZXRob2RzIGZvciBlYWNoIHN0cnVjdHVyZSBpbiB5b3VyIEpTT04gdGV4dC4gWW91J2xsCisgKiBuZWVkIGEgbWV0aG9kIGZvciBlYWNoIG9iamVjdCB0eXBlIGFuZCBmb3IgZWFjaCBhcnJheSB0eXBlLgorICogPHVsPgorICogICA8bGk+V2l0aGluIDxzdHJvbmc+YXJyYXkgaGFuZGxpbmc8L3N0cm9uZz4gbWV0aG9kcywgZmlyc3QgY2FsbCB7QGxpbmsKKyAqICAgICAgICNiZWdpbkFycmF5fSB0byBjb25zdW1lIHRoZSBhcnJheSdzIG9wZW5pbmcgYnJhY2tldC4gVGhlbiBjcmVhdGUgYQorICogICAgICAgd2hpbGUgbG9vcCB0aGF0IGFjY3VtdWxhdGVzIHZhbHVlcywgdGVybWluYXRpbmcgd2hlbiB7QGxpbmsgI2hhc05leHR9CisgKiAgICAgICBpcyBmYWxzZS4gRmluYWxseSwgcmVhZCB0aGUgYXJyYXkncyBjbG9zaW5nIGJyYWNrZXQgYnkgY2FsbGluZyB7QGxpbmsKKyAqICAgICAgICNlbmRBcnJheX0uCisgKiAgIDxsaT5XaXRoaW4gPHN0cm9uZz5vYmplY3QgaGFuZGxpbmc8L3N0cm9uZz4gbWV0aG9kcywgZmlyc3QgY2FsbCB7QGxpbmsKKyAqICAgICAgICNiZWdpbk9iamVjdH0gdG8gY29uc3VtZSB0aGUgb2JqZWN0J3Mgb3BlbmluZyBicmFjZS4gVGhlbiBjcmVhdGUgYQorICogICAgICAgd2hpbGUgbG9vcCB0aGF0IGFzc2lnbnMgdmFsdWVzIHRvIGxvY2FsIHZhcmlhYmxlcyBiYXNlZCBvbiB0aGVpciBuYW1lLgorICogICAgICAgVGhpcyBsb29wIHNob3VsZCB0ZXJtaW5hdGUgd2hlbiB7QGxpbmsgI2hhc05leHR9IGlzIGZhbHNlLiBGaW5hbGx5LAorICogICAgICAgcmVhZCB0aGUgb2JqZWN0J3MgY2xvc2luZyBicmFjZSBieSBjYWxsaW5nIHtAbGluayAjZW5kT2JqZWN0fS4KKyAqIDwvdWw+CisgKiA8cD5XaGVuIGEgbmVzdGVkIG9iamVjdCBvciBhcnJheSBpcyBlbmNvdW50ZXJlZCwgZGVsZWdhdGUgdG8gdGhlCisgKiBjb3JyZXNwb25kaW5nIGhhbmRsZXIgbWV0aG9kLgorICoKKyAqIDxwPldoZW4gYW4gdW5rbm93biBuYW1lIGlzIGVuY291bnRlcmVkLCBzdHJpY3QgcGFyc2VycyBzaG91bGQgZmFpbCB3aXRoIGFuCisgKiBleGNlcHRpb24uIExlbmllbnQgcGFyc2VycyBzaG91bGQgY2FsbCB7QGxpbmsgI3NraXBWYWx1ZSgpfSB0byByZWN1cnNpdmVseQorICogc2tpcCB0aGUgdmFsdWUncyBuZXN0ZWQgdG9rZW5zLCB3aGljaCBtYXkgb3RoZXJ3aXNlIGNvbmZsaWN0LgorICoKKyAqIDxwPklmIGEgdmFsdWUgbWF5IGJlIG51bGwsIHlvdSBzaG91bGQgZmlyc3QgY2hlY2sgdXNpbmcge0BsaW5rICNwZWVrKCl9LgorICogTnVsbCBsaXRlcmFscyBjYW4gYmUgY29uc3VtZWQgdXNpbmcgZWl0aGVyIHtAbGluayAjbmV4dE51bGwoKX0gb3Ige0BsaW5rCisgKiAjc2tpcFZhbHVlKCl9LgorICoKKyAqIDxoMz5FeGFtcGxlPC9oMz4KKyAqIFN1cHBvc2Ugd2UnZCBsaWtlIHRvIHBhcnNlIGEgc3RyZWFtIG9mIG1lc3NhZ2VzIHN1Y2ggYXMgdGhlIGZvbGxvd2luZzogPHByZT4ge0Bjb2RlCisgKiBbCisgKiAgIHsKKyAqICAgICAiaWQiOiA5MTIzNDU2Nzg5MDEsCisgKiAgICAgInRleHQiOiAiSG93IGRvIEkgcmVhZCBKU09OIG9uIEFuZHJvaWQ/IiwKKyAqICAgICAiZ2VvIjogbnVsbCwKKyAqICAgICAidXNlciI6IHsKKyAqICAgICAgICJuYW1lIjogImFuZHJvaWRfbmV3YiIsCisgKiAgICAgICAiZm9sbG93ZXJzX2NvdW50IjogNDEKKyAqICAgICAgfQorICogICB9LAorICogICB7CisgKiAgICAgImlkIjogOTEyMzQ1Njc4OTAyLAorICogICAgICJ0ZXh0IjogIkBhbmRyb2lkX25ld2IganVzdCB1c2UgYW5kcm9pZC51dGlsLkpzb25SZWFkZXIhIiwKKyAqICAgICAiZ2VvIjogWzUwLjQ1NDcyMiwgLTEwNC42MDY2NjddLAorICogICAgICJ1c2VyIjogeworICogICAgICAgIm5hbWUiOiAiamVzc2UiLAorICogICAgICAgImZvbGxvd2Vyc19jb3VudCI6IDIKKyAqICAgICB9CisgKiAgIH0KKyAqIF19PC9wcmU+CisgKiBUaGlzIGNvZGUgaW1wbGVtZW50cyB0aGUgcGFyc2VyIGZvciB0aGUgYWJvdmUgc3RydWN0dXJlOiA8cHJlPiAgIHtAY29kZQorICoKKyAqICAgcHVibGljIExpc3Q8TWVzc2FnZT4gcmVhZEpzb25TdHJlYW0oSW5wdXRTdHJlYW0gaW4pIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgKiAgICAgSnNvblJlYWRlciByZWFkZXIgPSBuZXcgSnNvblJlYWRlcihuZXcgSW5wdXRTdHJlYW1SZWFkZXIoaW4sICJVVEYtOCIpKTsKKyAqICAgICByZXR1cm4gcmVhZE1lc3NhZ2VzQXJyYXkocmVhZGVyKTsKKyAqICAgfQorICoKKyAqICAgcHVibGljIExpc3Q8TWVzc2FnZT4gcmVhZE1lc3NhZ2VzQXJyYXkoSnNvblJlYWRlciByZWFkZXIpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgKiAgICAgTGlzdDxNZXNzYWdlPiBtZXNzYWdlcyA9IG5ldyBBcnJheUxpc3Q8TWVzc2FnZT4oKTsKKyAqCisgKiAgICAgcmVhZGVyLmJlZ2luQXJyYXkoKTsKKyAqICAgICB3aGlsZSAocmVhZGVyLmhhc05leHQoKSkgeworICogICAgICAgbWVzc2FnZXMuYWRkKHJlYWRNZXNzYWdlKHJlYWRlcikpOworICogICAgIH0KKyAqICAgICByZWFkZXIuZW5kQXJyYXkoKTsKKyAqICAgICByZXR1cm4gbWVzc2FnZXM7CisgKiAgIH0KKyAqCisgKiAgIHB1YmxpYyBNZXNzYWdlIHJlYWRNZXNzYWdlKEpzb25SZWFkZXIgcmVhZGVyKSB0aHJvd3MgSU9FeGNlcHRpb24geworICogICAgIGxvbmcgaWQgPSAtMTsKKyAqICAgICBTdHJpbmcgdGV4dCA9IG51bGw7CisgKiAgICAgVXNlciB1c2VyID0gbnVsbDsKKyAqICAgICBMaXN0PERvdWJsZT4gZ2VvID0gbnVsbDsKKyAqCisgKiAgICAgcmVhZGVyLmJlZ2luT2JqZWN0KCk7CisgKiAgICAgd2hpbGUgKHJlYWRlci5oYXNOZXh0KCkpIHsKKyAqICAgICAgIFN0cmluZyBuYW1lID0gcmVhZGVyLm5leHROYW1lKCk7CisgKiAgICAgICBpZiAobmFtZS5lcXVhbHMoImlkIikpIHsKKyAqICAgICAgICAgaWQgPSByZWFkZXIubmV4dExvbmcoKTsKKyAqICAgICAgIH0gZWxzZSBpZiAobmFtZS5lcXVhbHMoInRleHQiKSkgeworICogICAgICAgICB0ZXh0ID0gcmVhZGVyLm5leHRTdHJpbmcoKTsKKyAqICAgICAgIH0gZWxzZSBpZiAobmFtZS5lcXVhbHMoImdlbyIpICYmIHJlYWRlci5wZWVrKCkgIT0gSnNvblRva2VuLk5VTEwpIHsKKyAqICAgICAgICAgZ2VvID0gcmVhZERvdWJsZXNBcnJheShyZWFkZXIpOworICogICAgICAgfSBlbHNlIGlmIChuYW1lLmVxdWFscygidXNlciIpKSB7CisgKiAgICAgICAgIHVzZXIgPSByZWFkVXNlcihyZWFkZXIpOworICogICAgICAgfSBlbHNlIHsKKyAqICAgICAgICAgcmVhZGVyLnNraXBWYWx1ZSgpOworICogICAgICAgfQorICogICAgIH0KKyAqICAgICByZWFkZXIuZW5kT2JqZWN0KCk7CisgKiAgICAgcmV0dXJuIG5ldyBNZXNzYWdlKGlkLCB0ZXh0LCB1c2VyLCBnZW8pOworICogICB9CisgKgorICogICBwdWJsaWMgTGlzdDxEb3VibGU+IHJlYWREb3VibGVzQXJyYXkoSnNvblJlYWRlciByZWFkZXIpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgKiAgICAgTGlzdDxEb3VibGU+IGRvdWJsZXMgPSBuZXcgQXJyYXlMaXN0PERvdWJsZT4oKTsKKyAqCisgKiAgICAgcmVhZGVyLmJlZ2luQXJyYXkoKTsKKyAqICAgICB3aGlsZSAocmVhZGVyLmhhc05leHQoKSkgeworICogICAgICAgZG91Ymxlcy5hZGQocmVhZGVyLm5leHREb3VibGUoKSk7CisgKiAgICAgfQorICogICAgIHJlYWRlci5lbmRBcnJheSgpOworICogICAgIHJldHVybiBkb3VibGVzOworICogICB9CisgKgorICogICBwdWJsaWMgVXNlciByZWFkVXNlcihKc29uUmVhZGVyIHJlYWRlcikgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAqICAgICBTdHJpbmcgdXNlcm5hbWUgPSBudWxsOworICogICAgIGludCBmb2xsb3dlcnNDb3VudCA9IC0xOworICoKKyAqICAgICByZWFkZXIuYmVnaW5PYmplY3QoKTsKKyAqICAgICB3aGlsZSAocmVhZGVyLmhhc05leHQoKSkgeworICogICAgICAgU3RyaW5nIG5hbWUgPSByZWFkZXIubmV4dE5hbWUoKTsKKyAqICAgICAgIGlmIChuYW1lLmVxdWFscygibmFtZSIpKSB7CisgKiAgICAgICAgIHVzZXJuYW1lID0gcmVhZGVyLm5leHRTdHJpbmcoKTsKKyAqICAgICAgIH0gZWxzZSBpZiAobmFtZS5lcXVhbHMoImZvbGxvd2Vyc19jb3VudCIpKSB7CisgKiAgICAgICAgIGZvbGxvd2Vyc0NvdW50ID0gcmVhZGVyLm5leHRJbnQoKTsKKyAqICAgICAgIH0gZWxzZSB7CisgKiAgICAgICAgIHJlYWRlci5za2lwVmFsdWUoKTsKKyAqICAgICAgIH0KKyAqICAgICB9CisgKiAgICAgcmVhZGVyLmVuZE9iamVjdCgpOworICogICAgIHJldHVybiBuZXcgVXNlcih1c2VybmFtZSwgZm9sbG93ZXJzQ291bnQpOworICogICB9fTwvcHJlPgorICoKKyAqIDxoMz5OdW1iZXIgSGFuZGxpbmc8L2gzPgorICogVGhpcyByZWFkZXIgcGVybWl0cyBudW1lcmljIHZhbHVlcyB0byBiZSByZWFkIGFzIHN0cmluZ3MgYW5kIHN0cmluZyB2YWx1ZXMgdG8KKyAqIGJlIHJlYWQgYXMgbnVtYmVycy4gRm9yIGV4YW1wbGUsIGJvdGggZWxlbWVudHMgb2YgdGhlIEpTT04gYXJyYXkge0Bjb2RlCisgKiBbMSwgIjEiXX0gbWF5IGJlIHJlYWQgdXNpbmcgZWl0aGVyIHtAbGluayAjbmV4dEludH0gb3Ige0BsaW5rICNuZXh0U3RyaW5nfS4KKyAqIFRoaXMgYmVoYXZpb3IgaXMgaW50ZW5kZWQgdG8gcHJldmVudCBsb3NzeSBudW1lcmljIGNvbnZlcnNpb25zOiBkb3VibGUgaXMKKyAqIEphdmFTY3JpcHQncyBvbmx5IG51bWVyaWMgdHlwZSBhbmQgdmVyeSBsYXJnZSB2YWx1ZXMgbGlrZSB7QGNvZGUKKyAqIDkwMDcxOTkyNTQ3NDA5OTN9IGNhbm5vdCBiZSByZXByZXNlbnRlZCBleGFjdGx5IG9uIHRoYXQgcGxhdGZvcm0uIFRvIG1pbmltaXplCisgKiBwcmVjaXNpb24gbG9zcywgZXh0cmVtZWx5IGxhcmdlIHZhbHVlcyBzaG91bGQgYmUgd3JpdHRlbiBhbmQgcmVhZCBhcyBzdHJpbmdzCisgKiBpbiBKU09OLgorICoKKyAqIDxwPkVhY2gge0Bjb2RlIEpzb25SZWFkZXJ9IG1heSBiZSB1c2VkIHRvIHJlYWQgYSBzaW5nbGUgSlNPTiBzdHJlYW0uIEluc3RhbmNlcworICogb2YgdGhpcyBjbGFzcyBhcmUgbm90IHRocmVhZCBzYWZlLgorICovCitwdWJsaWMgZmluYWwgY2xhc3MgSnNvblJlYWRlciBpbXBsZW1lbnRzIENsb3NlYWJsZSB7CisKKyAgICAvKiogVGhlIGlucHV0IEpTT04uICovCisgICAgcHJpdmF0ZSBmaW5hbCBSZWFkZXIgaW47CisKKyAgICAvKiogVHJ1ZSB0byBhY2NlcHQgbm9uLXNwZWMgY29tcGxpYW50IEpTT04gKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gbGVuaWVudCA9IGZhbHNlOworCisgICAgLyoqCisgICAgICogVXNlIGEgbWFudWFsIGJ1ZmZlciB0byBlYXNpbHkgcmVhZCBhbmQgdW5yZWFkIHVwY29taW5nIGNoYXJhY3RlcnMsIGFuZAorICAgICAqIGFsc28gc28gd2UgY2FuIGNyZWF0ZSBzdHJpbmdzIHdpdGhvdXQgYW4gaW50ZXJtZWRpYXRlIFN0cmluZ0J1aWxkZXIuCisgICAgICovCisgICAgcHJpdmF0ZSBmaW5hbCBjaGFyW10gYnVmZmVyID0gbmV3IGNoYXJbMTAyNF07CisgICAgcHJpdmF0ZSBpbnQgcG9zID0gMDsKKyAgICBwcml2YXRlIGludCBsaW1pdCA9IDA7CisKKyAgICBwcml2YXRlIGZpbmFsIExpc3Q8SnNvblNjb3BlPiBzdGFjayA9IG5ldyBBcnJheUxpc3Q8SnNvblNjb3BlPigpOworICAgIHsKKyAgICAgICAgcHVzaChKc29uU2NvcGUuRU1QVFlfRE9DVU1FTlQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRydWUgaWYgd2UndmUgYWxyZWFkeSByZWFkIHRoZSBuZXh0IHRva2VuLiBJZiB3ZSBoYXZlLCB0aGUgc3RyaW5nIHZhbHVlCisgICAgICogZm9yIHRoYXQgdG9rZW4gd2lsbCBiZSBhc3NpZ25lZCB0byB7QGNvZGUgdmFsdWV9IGlmIHN1Y2ggYSBzdHJpbmcgdmFsdWUKKyAgICAgKiBleGlzdHMuIEFuZCB0aGUgdG9rZW4gdHlwZSB3aWxsIGJlIGFzc2lnbmVkIHRvIHtAY29kZSB0b2tlbn0gaWYgdGhlIHRva2VuCisgICAgICogdHlwZSBpcyBrbm93bi4gVGhlIHRva2VuIHR5cGUgbWF5IGJlIG51bGwgZm9yIGxpdGVyYWxzLCBzaW5jZSB3ZSBkZXJpdmUKKyAgICAgKiB0aGF0IGxhemlseS4KKyAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gaGFzVG9rZW47CisKKyAgICAvKioKKyAgICAgKiBUaGUgdHlwZSBvZiB0aGUgbmV4dCB0b2tlbiB0byBiZSByZXR1cm5lZCBieSB7QGxpbmsgI3BlZWt9IGFuZCB7QGxpbmsKKyAgICAgKiAjYWR2YW5jZX0sIG9yIHtAY29kZSBudWxsfSBpZiBpdCBpcyB1bmtub3duIGFuZCBtdXN0IGZpcnN0IGJlIGRlcml2ZWQKKyAgICAgKiBmcm9tIHtAY29kZSB2YWx1ZX0uIFRoaXMgdmFsdWUgaXMgdW5kZWZpbmVkIGlmIHtAY29kZSBoYXNUb2tlbn0gaXMgZmFsc2UuCisgICAgICovCisgICAgcHJpdmF0ZSBKc29uVG9rZW4gdG9rZW47CisKKyAgICAvKiogVGhlIHRleHQgb2YgdGhlIG5leHQgbmFtZS4gKi8KKyAgICBwcml2YXRlIFN0cmluZyBuYW1lOworCisgICAgLyoqIFRoZSB0ZXh0IG9mIHRoZSBuZXh0IGxpdGVyYWwgdmFsdWUuICovCisgICAgcHJpdmF0ZSBTdHJpbmcgdmFsdWU7CisKKyAgICAvKiogVHJ1ZSBpZiB3ZSdyZSBjdXJyZW50bHkgaGFuZGxpbmcgYSBza2lwVmFsdWUoKSBjYWxsLiAqLworICAgIHByaXZhdGUgYm9vbGVhbiBza2lwcGluZyA9IGZhbHNlOworCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZSB0aGF0IHJlYWRzIGEgSlNPTi1lbmNvZGVkIHN0cmVhbSBmcm9tIHtAY29kZSBpbn0uCisgICAgICovCisgICAgcHVibGljIEpzb25SZWFkZXIoUmVhZGVyIGluKSB7CisgICAgICAgIGlmIChpbiA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oImluID09IG51bGwiKTsKKyAgICAgICAgfQorICAgICAgICB0aGlzLmluID0gaW47CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29uZmlndXJlIHRoaXMgcGFyc2VyIHRvIGJlICBiZSBsaWJlcmFsIGluIHdoYXQgaXQgYWNjZXB0cy4gQnkgZGVmYXVsdCwKKyAgICAgKiB0aGlzIHBhcnNlciBpcyBzdHJpY3QgYW5kIG9ubHkgYWNjZXB0cyBKU09OIGFzIHNwZWNpZmllZCBieSA8YQorICAgICAqIGhyZWY9Imh0dHA6Ly93d3cuaWV0Zi5vcmcvcmZjL3JmYzQ2MjcudHh0Ij5SRkMgNDYyNzwvYT4uIFNldHRpbmcgdGhlCisgICAgICogcGFyc2VyIHRvIGxlbmllbnQgY2F1c2VzIGl0IHRvIGlnbm9yZSB0aGUgZm9sbG93aW5nIHN5bnRheCBlcnJvcnM6CisgICAgICoKKyAgICAgKiA8dWw+CisgICAgICogICA8bGk+RW5kIG9mIGxpbmUgY29tbWVudHMgc3RhcnRpbmcgd2l0aCB7QGNvZGUgLy99IG9yIHtAY29kZSAjfSBhbmQKKyAgICAgKiAgICAgICBlbmRpbmcgd2l0aCBhIG5ld2xpbmUgY2hhcmFjdGVyLgorICAgICAqICAgPGxpPkMtc3R5bGUgY29tbWVudHMgc3RhcnRpbmcgd2l0aCB7QGNvZGUgLyp9IGFuZCBlbmRpbmcgd2l0aAorICAgICAqICAgICAgIHtAY29kZSAqfXtAY29kZSAvfS4gU3VjaCBjb21tZW50cyBtYXkgbm90IGJlIG5lc3RlZC4KKyAgICAgKiAgIDxsaT5OYW1lcyB0aGF0IGFyZSB1bnF1b3RlZCBvciB7QGNvZGUgJ3NpbmdsZSBxdW90ZWQnfS4KKyAgICAgKiAgIDxsaT5TdHJpbmdzIHRoYXQgYXJlIHVucXVvdGVkIG9yIHtAY29kZSAnc2luZ2xlIHF1b3RlZCd9LgorICAgICAqICAgPGxpPkFycmF5IGVsZW1lbnRzIHNlcGFyYXRlZCBieSB7QGNvZGUgO30gaW5zdGVhZCBvZiB7QGNvZGUgLH0uCisgICAgICogICA8bGk+VW5uZWNlc3NhcnkgYXJyYXkgc2VwYXJhdG9ycy4gVGhlc2UgYXJlIGludGVycHJldGVkIGFzIGlmIG51bGwKKyAgICAgKiAgICAgICB3YXMgdGhlIG9taXR0ZWQgdmFsdWUuCisgICAgICogICA8bGk+TmFtZXMgYW5kIHZhbHVlcyBzZXBhcmF0ZWQgYnkge0Bjb2RlID19IG9yIHtAY29kZSA9Pn0gaW5zdGVhZCBvZgorICAgICAqICAgICAgIHtAY29kZSA6fS4KKyAgICAgKiAgIDxsaT5OYW1lL3ZhbHVlIHBhaXJzIHNlcGFyYXRlZCBieSB7QGNvZGUgO30gaW5zdGVhZCBvZiB7QGNvZGUgLH0uCisgICAgICogPC91bD4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRMZW5pZW50KGJvb2xlYW4gbGVuaWVudCkgeworICAgICAgICB0aGlzLmxlbmllbnQgPSBsZW5pZW50OworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnN1bWVzIHRoZSBuZXh0IHRva2VuIGZyb20gdGhlIEpTT04gc3RyZWFtIGFuZCBhc3NlcnRzIHRoYXQgaXQgaXMgdGhlCisgICAgICogYmVnaW5uaW5nIG9mIGEgbmV3IGFycmF5LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGJlZ2luQXJyYXkoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBleHBlY3QoSnNvblRva2VuLkJFR0lOX0FSUkFZKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25zdW1lcyB0aGUgbmV4dCB0b2tlbiBmcm9tIHRoZSBKU09OIHN0cmVhbSBhbmQgYXNzZXJ0cyB0aGF0IGl0IGlzIHRoZQorICAgICAqIGVuZCBvZiB0aGUgY3VycmVudCBhcnJheS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBlbmRBcnJheSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGV4cGVjdChKc29uVG9rZW4uRU5EX0FSUkFZKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25zdW1lcyB0aGUgbmV4dCB0b2tlbiBmcm9tIHRoZSBKU09OIHN0cmVhbSBhbmQgYXNzZXJ0cyB0aGF0IGl0IGlzIHRoZQorICAgICAqIGJlZ2lubmluZyBvZiBhIG5ldyBvYmplY3QuCisgICAgICovCisgICAgcHVibGljIHZvaWQgYmVnaW5PYmplY3QoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBleHBlY3QoSnNvblRva2VuLkJFR0lOX09CSkVDVCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29uc3VtZXMgdGhlIG5leHQgdG9rZW4gZnJvbSB0aGUgSlNPTiBzdHJlYW0gYW5kIGFzc2VydHMgdGhhdCBpdCBpcyB0aGUKKyAgICAgKiBlbmQgb2YgdGhlIGN1cnJlbnQgYXJyYXkuCisgICAgICovCisgICAgcHVibGljIHZvaWQgZW5kT2JqZWN0KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgZXhwZWN0KEpzb25Ub2tlbi5FTkRfT0JKRUNUKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25zdW1lcyB7QGNvZGUgZXhwZWN0ZWR9LgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBleHBlY3QoSnNvblRva2VuIGV4cGVjdGVkKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBxdWlja1BlZWsoKTsKKyAgICAgICAgaWYgKHRva2VuICE9IGV4cGVjdGVkKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJFeHBlY3RlZCAiICsgZXhwZWN0ZWQgKyAiIGJ1dCB3YXMgIiArIHBlZWsoKSk7CisgICAgICAgIH0KKyAgICAgICAgYWR2YW5jZSgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgY3VycmVudCBhcnJheSBvciBvYmplY3QgaGFzIGFub3RoZXIgZWxlbWVudC4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBoYXNOZXh0KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgcXVpY2tQZWVrKCk7CisgICAgICAgIHJldHVybiB0b2tlbiAhPSBKc29uVG9rZW4uRU5EX09CSkVDVCAmJiB0b2tlbiAhPSBKc29uVG9rZW4uRU5EX0FSUkFZOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIHR5cGUgb2YgdGhlIG5leHQgdG9rZW4gd2l0aG91dCBjb25zdW1pbmcgaXQuCisgICAgICovCisgICAgcHVibGljIEpzb25Ub2tlbiBwZWVrKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgcXVpY2tQZWVrKCk7CisKKyAgICAgICAgaWYgKHRva2VuID09IG51bGwpIHsKKyAgICAgICAgICAgIGRlY29kZUxpdGVyYWwoKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiB0b2tlbjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBFbnN1cmVzIHRoYXQgYSB0b2tlbiBpcyByZWFkeS4gQWZ0ZXIgdGhpcyBjYWxsIGVpdGhlciB7QGNvZGUgdG9rZW59IG9yCisgICAgICoge0Bjb2RlIHZhbHVlfSB3aWxsIGJlIG5vbi1udWxsLiBUbyBlbnN1cmUge0Bjb2RlIHRva2VufSBoYXMgYSBkZWZpbml0aXZlCisgICAgICogdmFsdWUsIHVzZSB7QGxpbmsgI3BlZWsoKX0KKyAgICAgKi8KKyAgICBwcml2YXRlIEpzb25Ub2tlbiBxdWlja1BlZWsoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBpZiAoaGFzVG9rZW4pIHsKKyAgICAgICAgICAgIHJldHVybiB0b2tlbjsKKyAgICAgICAgfQorCisgICAgICAgIHN3aXRjaCAocGVla1N0YWNrKCkpIHsKKyAgICAgICAgICAgIGNhc2UgRU1QVFlfRE9DVU1FTlQ6CisgICAgICAgICAgICAgICAgcmVwbGFjZVRvcChKc29uU2NvcGUuTk9ORU1QVFlfRE9DVU1FTlQpOworICAgICAgICAgICAgICAgIEpzb25Ub2tlbiBmaXJzdFRva2VuID0gbmV4dFZhbHVlKCk7CisgICAgICAgICAgICAgICAgaWYgKHRva2VuICE9IEpzb25Ub2tlbi5CRUdJTl9BUlJBWSAmJiB0b2tlbiAhPSBKc29uVG9rZW4uQkVHSU5fT0JKRUNUKSB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRXhwZWN0ZWQgSlNPTiBkb2N1bWVudCB0byBzdGFydCB3aXRoICdbJyBvciAneycgYnV0IHdhcyAiICsgdG9rZW4pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gZmlyc3RUb2tlbjsKKyAgICAgICAgICAgIGNhc2UgRU1QVFlfQVJSQVk6CisgICAgICAgICAgICAgICAgcmV0dXJuIG5leHRJbkFycmF5KHRydWUpOworICAgICAgICAgICAgY2FzZSBOT05FTVBUWV9BUlJBWToKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV4dEluQXJyYXkoZmFsc2UpOworICAgICAgICAgICAgY2FzZSBFTVBUWV9PQkpFQ1Q6CisgICAgICAgICAgICAgICAgcmV0dXJuIG5leHRJbk9iamVjdCh0cnVlKTsKKyAgICAgICAgICAgIGNhc2UgREFOR0xJTkdfTkFNRToKKyAgICAgICAgICAgICAgICByZXR1cm4gb2JqZWN0VmFsdWUoKTsKKyAgICAgICAgICAgIGNhc2UgTk9ORU1QVFlfT0JKRUNUOgorICAgICAgICAgICAgICAgIHJldHVybiBuZXh0SW5PYmplY3QoZmFsc2UpOworICAgICAgICAgICAgY2FzZSBOT05FTVBUWV9ET0NVTUVOVDoKKyAgICAgICAgICAgICAgICBoYXNUb2tlbiA9IHRydWU7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRva2VuID0gSnNvblRva2VuLkVORF9ET0NVTUVOVDsKKyAgICAgICAgICAgIGNhc2UgQ0xPU0VEOgorICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkpzb25SZWFkZXIgaXMgY2xvc2VkIik7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25FcnJvcigpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQWR2YW5jZXMgdGhlIGN1cnNvciBpbiB0aGUgSlNPTiBzdHJlYW0gdG8gdGhlIG5leHQgdG9rZW4uCisgICAgICovCisgICAgcHJpdmF0ZSBKc29uVG9rZW4gYWR2YW5jZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIHF1aWNrUGVlaygpOworCisgICAgICAgIEpzb25Ub2tlbiByZXN1bHQgPSB0b2tlbjsKKyAgICAgICAgaGFzVG9rZW4gPSBmYWxzZTsKKyAgICAgICAgdG9rZW4gPSBudWxsOworICAgICAgICB2YWx1ZSA9IG51bGw7CisgICAgICAgIG5hbWUgPSBudWxsOworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIG5leHQgdG9rZW4sIGEge0BsaW5rIEpzb25Ub2tlbiNOQU1FIHByb3BlcnR5IG5hbWV9LCBhbmQKKyAgICAgKiBjb25zdW1lcyBpdC4KKyAgICAgKgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gaWYgdGhlIG5leHQgdG9rZW4gaW4gdGhlIHN0cmVhbSBpcyBub3QgYSBwcm9wZXJ0eQorICAgICAqICAgICBuYW1lLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgbmV4dE5hbWUoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBxdWlja1BlZWsoKTsKKyAgICAgICAgaWYgKHRva2VuICE9IEpzb25Ub2tlbi5OQU1FKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJFeHBlY3RlZCBhIG5hbWUgYnV0IHdhcyAiICsgcGVlaygpKTsKKyAgICAgICAgfQorICAgICAgICBTdHJpbmcgcmVzdWx0ID0gbmFtZTsKKyAgICAgICAgYWR2YW5jZSgpOworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIHtAbGluayBKc29uVG9rZW4jU1RSSU5HIHN0cmluZ30gdmFsdWUgb2YgdGhlIG5leHQgdG9rZW4sCisgICAgICogY29uc3VtaW5nIGl0LiBJZiB0aGUgbmV4dCB0b2tlbiBpcyBhIG51bWJlciwgdGhpcyBtZXRob2Qgd2lsbCByZXR1cm4gaXRzCisgICAgICogc3RyaW5nIGZvcm0uCisgICAgICoKKyAgICAgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBpZiB0aGUgbmV4dCB0b2tlbiBpcyBub3QgYSBzdHJpbmcgb3IgaWYKKyAgICAgKiAgICAgdGhpcyByZWFkZXIgaXMgY2xvc2VkLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgbmV4dFN0cmluZygpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIHBlZWsoKTsKKyAgICAgICAgaWYgKHZhbHVlID09IG51bGwgfHwgKHRva2VuICE9IEpzb25Ub2tlbi5TVFJJTkcgJiYgdG9rZW4gIT0gSnNvblRva2VuLk5VTUJFUikpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkV4cGVjdGVkIGEgc3RyaW5nIGJ1dCB3YXMgIiArIHBlZWsoKSk7CisgICAgICAgIH0KKworICAgICAgICBTdHJpbmcgcmVzdWx0ID0gdmFsdWU7CisgICAgICAgIGFkdmFuY2UoKTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSB7QGxpbmsgSnNvblRva2VuI0JPT0xFQU4gYm9vbGVhbn0gdmFsdWUgb2YgdGhlIG5leHQgdG9rZW4sCisgICAgICogY29uc3VtaW5nIGl0LgorICAgICAqCisgICAgICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gaWYgdGhlIG5leHQgdG9rZW4gaXMgbm90IGEgYm9vbGVhbiBvciBpZgorICAgICAqICAgICB0aGlzIHJlYWRlciBpcyBjbG9zZWQuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gbmV4dEJvb2xlYW4oKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBxdWlja1BlZWsoKTsKKyAgICAgICAgaWYgKHZhbHVlID09IG51bGwgfHwgdG9rZW4gPT0gSnNvblRva2VuLlNUUklORykgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiRXhwZWN0ZWQgYSBib29sZWFuIGJ1dCB3YXMgIiArIHBlZWsoKSk7CisgICAgICAgIH0KKworICAgICAgICBib29sZWFuIHJlc3VsdDsKKyAgICAgICAgaWYgKHZhbHVlLmVxdWFsc0lnbm9yZUNhc2UoInRydWUiKSkgeworICAgICAgICAgICAgcmVzdWx0ID0gdHJ1ZTsKKyAgICAgICAgfSBlbHNlIGlmICh2YWx1ZS5lcXVhbHNJZ25vcmVDYXNlKCJmYWxzZSIpKSB7CisgICAgICAgICAgICByZXN1bHQgPSBmYWxzZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIk5vdCBhIGJvb2xlYW46ICIgKyB2YWx1ZSk7CisgICAgICAgIH0KKworICAgICAgICBhZHZhbmNlKCk7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29uc3VtZXMgdGhlIG5leHQgdG9rZW4gZnJvbSB0aGUgSlNPTiBzdHJlYW0gYW5kIGFzc2VydHMgdGhhdCBpdCBpcyBhCisgICAgICogbGl0ZXJhbCBudWxsLgorICAgICAqCisgICAgICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gaWYgdGhlIG5leHQgdG9rZW4gaXMgbm90IG51bGwgb3IgaWYgdGhpcworICAgICAqICAgICByZWFkZXIgaXMgY2xvc2VkLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIG5leHROdWxsKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgcXVpY2tQZWVrKCk7CisgICAgICAgIGlmICh2YWx1ZSA9PSBudWxsIHx8IHRva2VuID09IEpzb25Ub2tlbi5TVFJJTkcpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkV4cGVjdGVkIG51bGwgYnV0IHdhcyAiICsgcGVlaygpKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICghdmFsdWUuZXF1YWxzSWdub3JlQ2FzZSgibnVsbCIpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJOb3QgYSBudWxsOiAiICsgdmFsdWUpOworICAgICAgICB9CisKKyAgICAgICAgYWR2YW5jZSgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIHtAbGluayBKc29uVG9rZW4jTlVNQkVSIGRvdWJsZX0gdmFsdWUgb2YgdGhlIG5leHQgdG9rZW4sCisgICAgICogY29uc3VtaW5nIGl0LiBJZiB0aGUgbmV4dCB0b2tlbiBpcyBhIHN0cmluZywgdGhpcyBtZXRob2Qgd2lsbCBhdHRlbXB0IHRvCisgICAgICogcGFyc2UgaXQgYXMgYSBkb3VibGUuCisgICAgICoKKyAgICAgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBpZiB0aGUgbmV4dCB0b2tlbiBpcyBub3QgYSBsaXRlcmFsIHZhbHVlLgorICAgICAqIEB0aHJvd3MgTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGlmIHRoZSBuZXh0IGxpdGVyYWwgdmFsdWUgY2Fubm90IGJlIHBhcnNlZAorICAgICAqICAgICBhcyBhIGRvdWJsZSwgb3IgaXMgbm9uLWZpbml0ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgZG91YmxlIG5leHREb3VibGUoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBxdWlja1BlZWsoKTsKKyAgICAgICAgaWYgKHZhbHVlID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkV4cGVjdGVkIGEgZG91YmxlIGJ1dCB3YXMgIiArIHBlZWsoKSk7CisgICAgICAgIH0KKworICAgICAgICBkb3VibGUgcmVzdWx0ID0gRG91YmxlLnBhcnNlRG91YmxlKHZhbHVlKTsKKworICAgICAgICBpZiAoKHJlc3VsdCA+PSAxLjBkICYmIHZhbHVlLnN0YXJ0c1dpdGgoIjAiKSkKKyAgICAgICAgICAgICAgICB8fCBEb3VibGUuaXNOYU4ocmVzdWx0KQorICAgICAgICAgICAgICAgIHx8IERvdWJsZS5pc0luZmluaXRlKHJlc3VsdCkpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBOdW1iZXJGb3JtYXRFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICJKU09OIGZvcmJpZHMgb2N0YWwgcHJlZml4ZXMsIE5hTiBhbmQgaW5maW5pdGllczogIiArIHZhbHVlKTsKKyAgICAgICAgfQorCisgICAgICAgIGFkdmFuY2UoKTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSB7QGxpbmsgSnNvblRva2VuI05VTUJFUiBsb25nfSB2YWx1ZSBvZiB0aGUgbmV4dCB0b2tlbiwKKyAgICAgKiBjb25zdW1pbmcgaXQuIElmIHRoZSBuZXh0IHRva2VuIGlzIGEgc3RyaW5nLCB0aGlzIG1ldGhvZCB3aWxsIGF0dGVtcHQgdG8KKyAgICAgKiBwYXJzZSBpdCBhcyBhIGxvbmcuIElmIHRoZSBuZXh0IHRva2VuJ3MgbnVtZXJpYyB2YWx1ZSBjYW5ub3QgYmUgZXhhY3RseQorICAgICAqIHJlcHJlc2VudGVkIGJ5IGEgSmF2YSB7QGNvZGUgbG9uZ30sIHRoaXMgbWV0aG9kIHRocm93cy4KKyAgICAgKgorICAgICAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGlmIHRoZSBuZXh0IHRva2VuIGlzIG5vdCBhIGxpdGVyYWwgdmFsdWUuCisgICAgICogQHRocm93cyBOdW1iZXJGb3JtYXRFeGNlcHRpb24gaWYgdGhlIG5leHQgbGl0ZXJhbCB2YWx1ZSBjYW5ub3QgYmUgcGFyc2VkCisgICAgICogICAgIGFzIGEgbnVtYmVyLCBvciBleGFjdGx5IHJlcHJlc2VudGVkIGFzIGEgbG9uZy4KKyAgICAgKi8KKyAgICBwdWJsaWMgbG9uZyBuZXh0TG9uZygpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIHF1aWNrUGVlaygpOworICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiRXhwZWN0ZWQgYSBsb25nIGJ1dCB3YXMgIiArIHBlZWsoKSk7CisgICAgICAgIH0KKworICAgICAgICBsb25nIHJlc3VsdDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJlc3VsdCA9IExvbmcucGFyc2VMb25nKHZhbHVlKTsKKyAgICAgICAgfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGlnbm9yZWQpIHsKKyAgICAgICAgICAgIGRvdWJsZSBhc0RvdWJsZSA9IERvdWJsZS5wYXJzZURvdWJsZSh2YWx1ZSk7IC8vIGRvbid0IGNhdGNoIHRoaXMgTnVtYmVyRm9ybWF0RXhjZXB0aW9uCisgICAgICAgICAgICByZXN1bHQgPSAobG9uZykgYXNEb3VibGU7CisgICAgICAgICAgICBpZiAoKGRvdWJsZSkgcmVzdWx0ICE9IGFzRG91YmxlKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE51bWJlckZvcm1hdEV4Y2VwdGlvbih2YWx1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAocmVzdWx0ID49IDFMICYmIHZhbHVlLnN0YXJ0c1dpdGgoIjAiKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IE51bWJlckZvcm1hdEV4Y2VwdGlvbigiSlNPTiBmb3JiaWRzIG9jdGFsIHByZWZpeGVzOiAiICsgdmFsdWUpOworICAgICAgICB9CisKKyAgICAgICAgYWR2YW5jZSgpOworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIHtAbGluayBKc29uVG9rZW4jTlVNQkVSIGludH0gdmFsdWUgb2YgdGhlIG5leHQgdG9rZW4sCisgICAgICogY29uc3VtaW5nIGl0LiBJZiB0aGUgbmV4dCB0b2tlbiBpcyBhIHN0cmluZywgdGhpcyBtZXRob2Qgd2lsbCBhdHRlbXB0IHRvCisgICAgICogcGFyc2UgaXQgYXMgYW4gaW50LiBJZiB0aGUgbmV4dCB0b2tlbidzIG51bWVyaWMgdmFsdWUgY2Fubm90IGJlIGV4YWN0bHkKKyAgICAgKiByZXByZXNlbnRlZCBieSBhIEphdmEge0Bjb2RlIGludH0sIHRoaXMgbWV0aG9kIHRocm93cy4KKyAgICAgKgorICAgICAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGlmIHRoZSBuZXh0IHRva2VuIGlzIG5vdCBhIGxpdGVyYWwgdmFsdWUuCisgICAgICogQHRocm93cyBOdW1iZXJGb3JtYXRFeGNlcHRpb24gaWYgdGhlIG5leHQgbGl0ZXJhbCB2YWx1ZSBjYW5ub3QgYmUgcGFyc2VkCisgICAgICogICAgIGFzIGEgbnVtYmVyLCBvciBleGFjdGx5IHJlcHJlc2VudGVkIGFzIGFuIGludC4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IG5leHRJbnQoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBxdWlja1BlZWsoKTsKKyAgICAgICAgaWYgKHZhbHVlID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkV4cGVjdGVkIGFuIGludCBidXQgd2FzICIgKyBwZWVrKCkpOworICAgICAgICB9CisKKyAgICAgICAgaW50IHJlc3VsdDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJlc3VsdCA9IEludGVnZXIucGFyc2VJbnQodmFsdWUpOworICAgICAgICB9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gaWdub3JlZCkgeworICAgICAgICAgICAgZG91YmxlIGFzRG91YmxlID0gRG91YmxlLnBhcnNlRG91YmxlKHZhbHVlKTsgLy8gZG9uJ3QgY2F0Y2ggdGhpcyBOdW1iZXJGb3JtYXRFeGNlcHRpb24KKyAgICAgICAgICAgIHJlc3VsdCA9IChpbnQpIGFzRG91YmxlOworICAgICAgICAgICAgaWYgKChkb3VibGUpIHJlc3VsdCAhPSBhc0RvdWJsZSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBOdW1iZXJGb3JtYXRFeGNlcHRpb24odmFsdWUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKHJlc3VsdCA+PSAxTCAmJiB2YWx1ZS5zdGFydHNXaXRoKCIwIikpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBOdW1iZXJGb3JtYXRFeGNlcHRpb24oIkpTT04gZm9yYmlkcyBvY3RhbCBwcmVmaXhlczogIiArIHZhbHVlKTsKKyAgICAgICAgfQorCisgICAgICAgIGFkdmFuY2UoKTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDbG9zZXMgdGhpcyBKU09OIHJlYWRlciBhbmQgdGhlIHVuZGVybHlpbmcge0BsaW5rIFJlYWRlcn0uCisgICAgICovCisgICAgcHVibGljIHZvaWQgY2xvc2UoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBoYXNUb2tlbiA9IGZhbHNlOworICAgICAgICB2YWx1ZSA9IG51bGw7CisgICAgICAgIHRva2VuID0gbnVsbDsKKyAgICAgICAgc3RhY2suY2xlYXIoKTsKKyAgICAgICAgc3RhY2suYWRkKEpzb25TY29wZS5DTE9TRUQpOworICAgICAgICBpbi5jbG9zZSgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNraXBzIHRoZSBuZXh0IHZhbHVlIHJlY3Vyc2l2ZWx5LiBJZiBpdCBpcyBhbiBvYmplY3Qgb3IgYXJyYXksIGFsbCBuZXN0ZWQKKyAgICAgKiBlbGVtZW50cyBhcmUgc2tpcHBlZC4gVGhpcyBtZXRob2QgaXMgaW50ZW5kZWQgZm9yIHVzZSB3aGVuIHRoZSBKU09OIHRva2VuCisgICAgICogc3RyZWFtIGNvbnRhaW5zIHVucmVjb2duaXplZCBvciB1bmhhbmRsZWQgdmFsdWVzLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNraXBWYWx1ZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIHNraXBwaW5nID0gdHJ1ZTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBjb3VudCA9IDA7CisgICAgICAgICAgICBkbyB7CisgICAgICAgICAgICAgICAgSnNvblRva2VuIHRva2VuID0gYWR2YW5jZSgpOworICAgICAgICAgICAgICAgIGlmICh0b2tlbiA9PSBKc29uVG9rZW4uQkVHSU5fQVJSQVkgfHwgdG9rZW4gPT0gSnNvblRva2VuLkJFR0lOX09CSkVDVCkgeworICAgICAgICAgICAgICAgICAgICBjb3VudCsrOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodG9rZW4gPT0gSnNvblRva2VuLkVORF9BUlJBWSB8fCB0b2tlbiA9PSBKc29uVG9rZW4uRU5EX09CSkVDVCkgeworICAgICAgICAgICAgICAgICAgICBjb3VudC0tOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gd2hpbGUgKGNvdW50ICE9IDApOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgc2tpcHBpbmcgPSBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgSnNvblNjb3BlIHBlZWtTdGFjaygpIHsKKyAgICAgICAgcmV0dXJuIHN0YWNrLmdldChzdGFjay5zaXplKCkgLSAxKTsKKyAgICB9CisKKyAgICBwcml2YXRlIEpzb25TY29wZSBwb3AoKSB7CisgICAgICAgIHJldHVybiBzdGFjay5yZW1vdmUoc3RhY2suc2l6ZSgpIC0gMSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHB1c2goSnNvblNjb3BlIG5ld1RvcCkgeworICAgICAgICBzdGFjay5hZGQobmV3VG9wKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXBsYWNlIHRoZSB2YWx1ZSBvbiB0aGUgdG9wIG9mIHRoZSBzdGFjayB3aXRoIHRoZSBnaXZlbiB2YWx1ZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgcmVwbGFjZVRvcChKc29uU2NvcGUgbmV3VG9wKSB7CisgICAgICAgIHN0YWNrLnNldChzdGFjay5zaXplKCkgLSAxLCBuZXdUb3ApOworICAgIH0KKworICAgIHByaXZhdGUgSnNvblRva2VuIG5leHRJbkFycmF5KGJvb2xlYW4gZmlyc3RFbGVtZW50KSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBpZiAoZmlyc3RFbGVtZW50KSB7CisgICAgICAgICAgICByZXBsYWNlVG9wKEpzb25TY29wZS5OT05FTVBUWV9BUlJBWSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvKiBMb29rIGZvciBhIGNvbW1hIGJlZm9yZSBlYWNoIGVsZW1lbnQgYWZ0ZXIgdGhlIGZpcnN0IGVsZW1lbnQuICovCisgICAgICAgICAgICBzd2l0Y2ggKG5leHROb25XaGl0ZXNwYWNlKCkpIHsKKyAgICAgICAgICAgICAgICBjYXNlICddJzoKKyAgICAgICAgICAgICAgICAgICAgcG9wKCk7CisgICAgICAgICAgICAgICAgICAgIGhhc1Rva2VuID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRva2VuID0gSnNvblRva2VuLkVORF9BUlJBWTsKKyAgICAgICAgICAgICAgICBjYXNlICc7JzoKKyAgICAgICAgICAgICAgICAgICAgY2hlY2tMZW5pZW50KCk7IC8vIGZhbGwtdGhyb3VnaAorICAgICAgICAgICAgICAgIGNhc2UgJywnOgorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICB0aHJvdyBzeW50YXhFcnJvcigiVW50ZXJtaW5hdGVkIGFycmF5Iik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBzd2l0Y2ggKG5leHROb25XaGl0ZXNwYWNlKCkpIHsKKyAgICAgICAgICAgIGNhc2UgJ10nOgorICAgICAgICAgICAgICAgIGlmIChmaXJzdEVsZW1lbnQpIHsKKyAgICAgICAgICAgICAgICAgICAgcG9wKCk7CisgICAgICAgICAgICAgICAgICAgIGhhc1Rva2VuID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRva2VuID0gSnNvblRva2VuLkVORF9BUlJBWTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgLy8gZmFsbC10aHJvdWdoIHRvIGhhbmRsZSAiLF0iCisgICAgICAgICAgICBjYXNlICc7JzoKKyAgICAgICAgICAgIGNhc2UgJywnOgorICAgICAgICAgICAgICAgIC8qIEluIGxlbmllbnQgbW9kZSwgYSAwLWxlbmd0aCBsaXRlcmFsIG1lYW5zICdudWxsJyAqLworICAgICAgICAgICAgICAgIGNoZWNrTGVuaWVudCgpOworICAgICAgICAgICAgICAgIHBvcy0tOworICAgICAgICAgICAgICAgIGhhc1Rva2VuID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB2YWx1ZSA9ICJudWxsIjsKKyAgICAgICAgICAgICAgICByZXR1cm4gdG9rZW4gPSBKc29uVG9rZW4uTlVMTDsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgcG9zLS07CisgICAgICAgICAgICAgICAgcmV0dXJuIG5leHRWYWx1ZSgpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBKc29uVG9rZW4gbmV4dEluT2JqZWN0KGJvb2xlYW4gZmlyc3RFbGVtZW50KSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAvKgorICAgICAgICAgKiBSZWFkIGRlbGltaXRlcnMuIEVpdGhlciBhIGNvbW1hL3NlbWljb2xvbiBzZXBhcmF0aW5nIHRoaXMgYW5kIHRoZQorICAgICAgICAgKiBwcmV2aW91cyBuYW1lLXZhbHVlIHBhaXIsIG9yIGEgY2xvc2UgYnJhY2UgdG8gZGVub3RlIHRoZSBlbmQgb2YgdGhlCisgICAgICAgICAqIG9iamVjdC4KKyAgICAgICAgICovCisgICAgICAgIGlmIChmaXJzdEVsZW1lbnQpIHsKKyAgICAgICAgICAgIC8qIFBlZWsgdG8gc2VlIGlmIHRoaXMgaXMgdGhlIGVtcHR5IG9iamVjdC4gKi8KKyAgICAgICAgICAgIHN3aXRjaCAobmV4dE5vbldoaXRlc3BhY2UoKSkgeworICAgICAgICAgICAgICAgIGNhc2UgJ30nOgorICAgICAgICAgICAgICAgICAgICBwb3AoKTsKKyAgICAgICAgICAgICAgICAgICAgaGFzVG9rZW4gPSB0cnVlOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gdG9rZW4gPSBKc29uVG9rZW4uRU5EX09CSkVDVDsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICBwb3MtLTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHN3aXRjaCAobmV4dE5vbldoaXRlc3BhY2UoKSkgeworICAgICAgICAgICAgICAgIGNhc2UgJ30nOgorICAgICAgICAgICAgICAgICAgICBwb3AoKTsKKyAgICAgICAgICAgICAgICAgICAgaGFzVG9rZW4gPSB0cnVlOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gdG9rZW4gPSBKc29uVG9rZW4uRU5EX09CSkVDVDsKKyAgICAgICAgICAgICAgICBjYXNlICc7JzoKKyAgICAgICAgICAgICAgICBjYXNlICcsJzoKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgc3ludGF4RXJyb3IoIlVudGVybWluYXRlZCBvYmplY3QiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8qIFJlYWQgdGhlIG5hbWUuICovCisgICAgICAgIGludCBxdW90ZSA9IG5leHROb25XaGl0ZXNwYWNlKCk7CisgICAgICAgIHN3aXRjaCAocXVvdGUpIHsKKyAgICAgICAgICAgIGNhc2UgJ1wnJzoKKyAgICAgICAgICAgICAgICBjaGVja0xlbmllbnQoKTsgLy8gZmFsbC10aHJvdWdoCisgICAgICAgICAgICBjYXNlICciJzoKKyAgICAgICAgICAgICAgICBuYW1lID0gbmV4dFN0cmluZygoY2hhcikgcXVvdGUpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBjaGVja0xlbmllbnQoKTsKKyAgICAgICAgICAgICAgICBwb3MtLTsKKyAgICAgICAgICAgICAgICBuYW1lID0gbmV4dExpdGVyYWwoKTsKKyAgICAgICAgICAgICAgICBpZiAobmFtZS5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgc3ludGF4RXJyb3IoIkV4cGVjdGVkIG5hbWUiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXBsYWNlVG9wKEpzb25TY29wZS5EQU5HTElOR19OQU1FKTsKKyAgICAgICAgaGFzVG9rZW4gPSB0cnVlOworICAgICAgICByZXR1cm4gdG9rZW4gPSBKc29uVG9rZW4uTkFNRTsKKyAgICB9CisKKyAgICBwcml2YXRlIEpzb25Ub2tlbiBvYmplY3RWYWx1ZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIC8qCisgICAgICAgICAqIFJlYWQgdGhlIG5hbWUvdmFsdWUgc2VwYXJhdG9yLiBVc3VhbGx5IGEgY29sb24gJzonLiBJbiBsZW5pZW50IG1vZGUKKyAgICAgICAgICogd2UgYWxzbyBhY2NlcHQgYW4gZXF1YWxzIHNpZ24gJz0nLCBvciBhbiBhcnJvdyAiPT4iLgorICAgICAgICAgKi8KKyAgICAgICAgc3dpdGNoIChuZXh0Tm9uV2hpdGVzcGFjZSgpKSB7CisgICAgICAgICAgICBjYXNlICc6JzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgJz0nOgorICAgICAgICAgICAgICAgIGNoZWNrTGVuaWVudCgpOworICAgICAgICAgICAgICAgIGlmICgocG9zIDwgbGltaXQgfHwgZmlsbEJ1ZmZlcigxKSkgJiYgYnVmZmVyW3Bvc10gPT0gJz4nKSB7CisgICAgICAgICAgICAgICAgICAgIHBvcysrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgdGhyb3cgc3ludGF4RXJyb3IoIkV4cGVjdGVkICc6JyIpOworICAgICAgICB9CisKKyAgICAgICAgcmVwbGFjZVRvcChKc29uU2NvcGUuTk9ORU1QVFlfT0JKRUNUKTsKKyAgICAgICAgcmV0dXJuIG5leHRWYWx1ZSgpOworICAgIH0KKworICAgIHByaXZhdGUgSnNvblRva2VuIG5leHRWYWx1ZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGludCBjID0gbmV4dE5vbldoaXRlc3BhY2UoKTsKKyAgICAgICAgc3dpdGNoIChjKSB7CisgICAgICAgICAgICBjYXNlICd7JzoKKyAgICAgICAgICAgICAgICBwdXNoKEpzb25TY29wZS5FTVBUWV9PQkpFQ1QpOworICAgICAgICAgICAgICAgIGhhc1Rva2VuID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdG9rZW4gPSBKc29uVG9rZW4uQkVHSU5fT0JKRUNUOworCisgICAgICAgICAgICBjYXNlICdbJzoKKyAgICAgICAgICAgICAgICBwdXNoKEpzb25TY29wZS5FTVBUWV9BUlJBWSk7CisgICAgICAgICAgICAgICAgaGFzVG9rZW4gPSB0cnVlOworICAgICAgICAgICAgICAgIHJldHVybiB0b2tlbiA9IEpzb25Ub2tlbi5CRUdJTl9BUlJBWTsKKworICAgICAgICAgICAgY2FzZSAnXCcnOgorICAgICAgICAgICAgICAgIGNoZWNrTGVuaWVudCgpOyAvLyBmYWxsLXRocm91Z2gKKyAgICAgICAgICAgIGNhc2UgJyInOgorICAgICAgICAgICAgICAgIHZhbHVlID0gbmV4dFN0cmluZygoY2hhcikgYyk7CisgICAgICAgICAgICAgICAgaGFzVG9rZW4gPSB0cnVlOworICAgICAgICAgICAgICAgIHJldHVybiB0b2tlbiA9IEpzb25Ub2tlbi5TVFJJTkc7CisKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgcG9zLS07CisgICAgICAgICAgICAgICAgcmV0dXJuIHJlYWRMaXRlcmFsKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRydWUgb25jZSB7QGNvZGUgbGltaXQgLSBwb3MgPj0gbWluaW11bX0uIElmIHRoZSBkYXRhIGlzCisgICAgICogZXhoYXVzdGVkIGJlZm9yZSB0aGF0IG1hbnkgY2hhcmFjdGVycyBhcmUgYXZhaWxhYmxlLCB0aGlzIHJldHVybnMKKyAgICAgKiBmYWxzZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gZmlsbEJ1ZmZlcihpbnQgbWluaW11bSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKGxpbWl0ICE9IHBvcykgeworICAgICAgICAgICAgbGltaXQgLT0gcG9zOworICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weShidWZmZXIsIHBvcywgYnVmZmVyLCAwLCBsaW1pdCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBsaW1pdCA9IDA7CisgICAgICAgIH0KKworICAgICAgICBwb3MgPSAwOworICAgICAgICBpbnQgdG90YWw7CisgICAgICAgIHdoaWxlICgodG90YWwgPSBpbi5yZWFkKGJ1ZmZlciwgbGltaXQsIGJ1ZmZlci5sZW5ndGggLSBsaW1pdCkpICE9IC0xKSB7CisgICAgICAgICAgICBsaW1pdCArPSB0b3RhbDsKKyAgICAgICAgICAgIGlmIChsaW1pdCA+PSBtaW5pbXVtKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHByaXZhdGUgaW50IG5leHROb25XaGl0ZXNwYWNlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgd2hpbGUgKHBvcyA8IGxpbWl0IHx8IGZpbGxCdWZmZXIoMSkpIHsKKyAgICAgICAgICAgIGludCBjID0gYnVmZmVyW3BvcysrXTsKKyAgICAgICAgICAgIHN3aXRjaCAoYykgeworICAgICAgICAgICAgICAgIGNhc2UgJ1x0JzoKKyAgICAgICAgICAgICAgICBjYXNlICcgJzoKKyAgICAgICAgICAgICAgICBjYXNlICdcbic6CisgICAgICAgICAgICAgICAgY2FzZSAnXHInOgorICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICAgICAgICAgIGNhc2UgJy8nOgorICAgICAgICAgICAgICAgICAgICBpZiAocG9zID09IGxpbWl0ICYmICFmaWxsQnVmZmVyKDEpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYzsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGNoZWNrTGVuaWVudCgpOworICAgICAgICAgICAgICAgICAgICBjaGFyIHBlZWsgPSBidWZmZXJbcG9zXTsKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChwZWVrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICcqJzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBza2lwIGEgLyogYy1zdHlsZSBjb21tZW50ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zKys7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFza2lwVG8oIiovIikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgc3ludGF4RXJyb3IoIlVudGVybWluYXRlZCBjb21tZW50Iik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvcyArPSAyOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICcvJzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBza2lwIGEgLy8gZW5kLW9mLWxpbmUgY29tbWVudAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvcysrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNraXBUb0VuZE9mTGluZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlICcjJzoKKyAgICAgICAgICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgICAgICAgICogU2tpcCBhICMgaGFzaCBlbmQtb2YtbGluZSBjb21tZW50LiBUaGUgSlNPTiBSRkMgZG9lc24ndAorICAgICAgICAgICAgICAgICAgICAgKiBzcGVjaWZ5IHRoaXMgYmVoYXZpb3VyLCBidXQgaXQncyByZXF1aXJlZCB0byBwYXJzZQorICAgICAgICAgICAgICAgICAgICAgKiBleGlzdGluZyBkb2N1bWVudHMuIFNlZSBodHRwOi8vYi8yNTcxNDIzLgorICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgY2hlY2tMZW5pZW50KCk7CisgICAgICAgICAgICAgICAgICAgIHNraXBUb0VuZE9mTGluZSgpOworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBjOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgdGhyb3cgc3ludGF4RXJyb3IoIkVuZCBvZiBpbnB1dCIpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBjaGVja0xlbmllbnQoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBpZiAoIWxlbmllbnQpIHsKKyAgICAgICAgICAgIHRocm93IHN5bnRheEVycm9yKCJVc2UgSnNvblJlYWRlci5zZXRMZW5pZW50KHRydWUpIHRvIGFjY2VwdCBtYWxmb3JtZWQgSlNPTiIpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQWR2YW5jZXMgdGhlIHBvc2l0aW9uIHVudGlsIGFmdGVyIHRoZSBuZXh0IG5ld2xpbmUgY2hhcmFjdGVyLiBJZiB0aGUgbGluZQorICAgICAqIGlzIHRlcm1pbmF0ZWQgYnkgIlxyXG4iLCB0aGUgJ1xuJyBtdXN0IGJlIGNvbnN1bWVkIGFzIHdoaXRlc3BhY2UgYnkgdGhlCisgICAgICogY2FsbGVyLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBza2lwVG9FbmRPZkxpbmUoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICB3aGlsZSAocG9zIDwgbGltaXQgfHwgZmlsbEJ1ZmZlcigxKSkgeworICAgICAgICAgICAgY2hhciBjID0gYnVmZmVyW3BvcysrXTsKKyAgICAgICAgICAgIGlmIChjID09ICdccicgfHwgYyA9PSAnXG4nKSB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIGJvb2xlYW4gc2tpcFRvKFN0cmluZyB0b0ZpbmQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIG91dGVyOgorICAgICAgICBmb3IgKDsgcG9zICsgdG9GaW5kLmxlbmd0aCgpIDwgbGltaXQgfHwgZmlsbEJ1ZmZlcih0b0ZpbmQubGVuZ3RoKCkpOyBwb3MrKykgeworICAgICAgICAgICAgZm9yIChpbnQgYyA9IDA7IGMgPCB0b0ZpbmQubGVuZ3RoKCk7IGMrKykgeworICAgICAgICAgICAgICAgIGlmIChidWZmZXJbcG9zICsgY10gIT0gdG9GaW5kLmNoYXJBdChjKSkgeworICAgICAgICAgICAgICAgICAgICBjb250aW51ZSBvdXRlcjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgc3RyaW5nIHVwIHRvIGJ1dCBub3QgaW5jbHVkaW5nIHtAY29kZSBxdW90ZX0sIHVuZXNjYXBpbmcgYW55CisgICAgICogY2hhcmFjdGVyIGVzY2FwZSBzZXF1ZW5jZXMgZW5jb3VudGVyZWQgYWxvbmcgdGhlIHdheS4gVGhlIG9wZW5pbmcgcXVvdGUKKyAgICAgKiBzaG91bGQgaGF2ZSBhbHJlYWR5IGJlZW4gcmVhZC4gVGhpcyBjb25zdW1lcyB0aGUgY2xvc2luZyBxdW90ZSwgYnV0IGRvZXMKKyAgICAgKiBub3QgaW5jbHVkZSBpdCBpbiB0aGUgcmV0dXJuZWQgc3RyaW5nLgorICAgICAqCisgICAgICogQHBhcmFtIHF1b3RlIGVpdGhlciAnIG9yICIuCisgICAgICogQHRocm93cyBOdW1iZXJGb3JtYXRFeGNlcHRpb24gaWYgYW55IHVuaWNvZGUgZXNjYXBlIHNlcXVlbmNlcyBhcmUKKyAgICAgKiAgICAgbWFsZm9ybWVkLgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIG5leHRTdHJpbmcoY2hhciBxdW90ZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgU3RyaW5nQnVpbGRlciBidWlsZGVyID0gbnVsbDsKKyAgICAgICAgZG8geworICAgICAgICAgICAgLyogdGhlIGluZGV4IG9mIHRoZSBmaXJzdCBjaGFyYWN0ZXIgbm90IHlldCBhcHBlbmRlZCB0byB0aGUgYnVpbGRlci4gKi8KKyAgICAgICAgICAgIGludCBzdGFydCA9IHBvczsKKyAgICAgICAgICAgIHdoaWxlIChwb3MgPCBsaW1pdCkgeworICAgICAgICAgICAgICAgIGludCBjID0gYnVmZmVyW3BvcysrXTsKKworICAgICAgICAgICAgICAgIGlmIChjID09IHF1b3RlKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChza2lwcGluZykgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJza2lwcGVkISI7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYnVpbGRlciA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFN0cmluZyhidWZmZXIsIHN0YXJ0LCBwb3MgLSBzdGFydCAtIDEpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoYnVmZmVyLCBzdGFydCwgcG9zIC0gc3RhcnQgLSAxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBidWlsZGVyLnRvU3RyaW5nKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYyA9PSAnXFwnKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChidWlsZGVyID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKGJ1ZmZlciwgc3RhcnQsIHBvcyAtIHN0YXJ0IC0gMSk7CisgICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKHJlYWRFc2NhcGVDaGFyYWN0ZXIoKSk7CisgICAgICAgICAgICAgICAgICAgIHN0YXJ0ID0gcG9zOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGJ1aWxkZXIgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGJ1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoYnVmZmVyLCBzdGFydCwgcG9zIC0gc3RhcnQpOworICAgICAgICB9IHdoaWxlIChmaWxsQnVmZmVyKDEpKTsKKworICAgICAgICB0aHJvdyBzeW50YXhFcnJvcigiVW50ZXJtaW5hdGVkIHN0cmluZyIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIHN0cmluZyB1cCB0byBidXQgbm90IGluY2x1ZGluZyBhbnkgZGVsaW1pdGVyIGNoYXJhY3RlcnMuIFRoaXMKKyAgICAgKiBkb2VzIG5vdCBjb25zdW1lIHRoZSBkZWxpbWl0ZXIgY2hhcmFjdGVyLgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIG5leHRMaXRlcmFsKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgU3RyaW5nQnVpbGRlciBidWlsZGVyID0gbnVsbDsKKyAgICAgICAgZG8geworICAgICAgICAgICAgLyogdGhlIGluZGV4IG9mIHRoZSBmaXJzdCBjaGFyYWN0ZXIgbm90IHlldCBhcHBlbmRlZCB0byB0aGUgYnVpbGRlci4gKi8KKyAgICAgICAgICAgIGludCBzdGFydCA9IHBvczsKKyAgICAgICAgICAgIHdoaWxlIChwb3MgPCBsaW1pdCkgeworICAgICAgICAgICAgICAgIGludCBjID0gYnVmZmVyW3BvcysrXTsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKGMpIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAnLyc6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgJ1xcJzoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAnOyc6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgJyMnOgorICAgICAgICAgICAgICAgICAgICBjYXNlICc9JzoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrTGVuaWVudCgpOyAvLyBmYWxsLXRocm91Z2gKKworICAgICAgICAgICAgICAgICAgICBjYXNlICd7JzoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAnfSc6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgJ1snOgorICAgICAgICAgICAgICAgICAgICBjYXNlICddJzoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAnOic6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgJywnOgorICAgICAgICAgICAgICAgICAgICBjYXNlICcgJzoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAnXHQnOgorICAgICAgICAgICAgICAgICAgICBjYXNlICdcZic6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgJ1xyJzoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAnXG4nOgorICAgICAgICAgICAgICAgICAgICAgICAgcG9zLS07CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2tpcHBpbmcpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gInNraXBwZWQhIjsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYnVpbGRlciA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmcoYnVmZmVyLCBzdGFydCwgcG9zIC0gc3RhcnQpOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWlsZGVyLmFwcGVuZChidWZmZXIsIHN0YXJ0LCBwb3MgLSBzdGFydCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJ1aWxkZXIudG9TdHJpbmcoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChidWlsZGVyID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBidWlsZGVyID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKGJ1ZmZlciwgc3RhcnQsIHBvcyAtIHN0YXJ0KTsKKyAgICAgICAgfSB3aGlsZSAoZmlsbEJ1ZmZlcigxKSk7CisKKyAgICAgICAgcmV0dXJuIGJ1aWxkZXIudG9TdHJpbmcoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgcmV0dXJuIGdldENsYXNzKCkuZ2V0U2ltcGxlTmFtZSgpICsgIiBuZWFyICIgKyBnZXRTbmlwcGV0KCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVW5lc2NhcGVzIHRoZSBjaGFyYWN0ZXIgaWRlbnRpZmllZCBieSB0aGUgY2hhcmFjdGVyIG9yIGNoYXJhY3RlcnMgdGhhdAorICAgICAqIGltbWVkaWF0ZWx5IGZvbGxvdyBhIGJhY2tzbGFzaC4gVGhlIGJhY2tzbGFzaCAnXCcgc2hvdWxkIGhhdmUgYWxyZWFkeQorICAgICAqIGJlZW4gcmVhZC4gVGhpcyBzdXBwb3J0cyBib3RoIHVuaWNvZGUgZXNjYXBlcyAidTAwMEEiIGFuZCB0d28tY2hhcmFjdGVyCisgICAgICogZXNjYXBlcyAiXG4iLgorICAgICAqCisgICAgICogQHRocm93cyBOdW1iZXJGb3JtYXRFeGNlcHRpb24gaWYgYW55IHVuaWNvZGUgZXNjYXBlIHNlcXVlbmNlcyBhcmUKKyAgICAgKiAgICAgbWFsZm9ybWVkLgorICAgICAqLworICAgIHByaXZhdGUgY2hhciByZWFkRXNjYXBlQ2hhcmFjdGVyKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKHBvcyA9PSBsaW1pdCAmJiAhZmlsbEJ1ZmZlcigxKSkgeworICAgICAgICAgICAgdGhyb3cgc3ludGF4RXJyb3IoIlVudGVybWluYXRlZCBlc2NhcGUgc2VxdWVuY2UiKTsKKyAgICAgICAgfQorCisgICAgICAgIGNoYXIgZXNjYXBlZCA9IGJ1ZmZlcltwb3MrK107CisgICAgICAgIHN3aXRjaCAoZXNjYXBlZCkgeworICAgICAgICAgICAgY2FzZSAndSc6CisgICAgICAgICAgICAgICAgaWYgKHBvcyArIDQgPiBsaW1pdCAmJiAhZmlsbEJ1ZmZlcig0KSkgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBzeW50YXhFcnJvcigiVW50ZXJtaW5hdGVkIGVzY2FwZSBzZXF1ZW5jZSIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBTdHJpbmcgaGV4ID0gbmV3IFN0cmluZyhidWZmZXIsIHBvcywgNCk7CisgICAgICAgICAgICAgICAgcG9zICs9IDQ7CisgICAgICAgICAgICAgICAgcmV0dXJuIChjaGFyKSBJbnRlZ2VyLnBhcnNlSW50KGhleCwgMTYpOworCisgICAgICAgICAgICBjYXNlICd0JzoKKyAgICAgICAgICAgICAgICByZXR1cm4gJ1x0JzsKKworICAgICAgICAgICAgY2FzZSAnYic6CisgICAgICAgICAgICAgICAgcmV0dXJuICdcYic7CisKKyAgICAgICAgICAgIGNhc2UgJ24nOgorICAgICAgICAgICAgICAgIHJldHVybiAnXG4nOworCisgICAgICAgICAgICBjYXNlICdyJzoKKyAgICAgICAgICAgICAgICByZXR1cm4gJ1xyJzsKKworICAgICAgICAgICAgY2FzZSAnZic6CisgICAgICAgICAgICAgICAgcmV0dXJuICdcZic7CisKKyAgICAgICAgICAgIGNhc2UgJ1wnJzoKKyAgICAgICAgICAgIGNhc2UgJyInOgorICAgICAgICAgICAgY2FzZSAnXFwnOgorICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICByZXR1cm4gZXNjYXBlZDsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFJlYWRzIGEgbnVsbCwgYm9vbGVhbiwgbnVtZXJpYyBvciB1bnF1b3RlZCBzdHJpbmcgbGl0ZXJhbCB2YWx1ZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIEpzb25Ub2tlbiByZWFkTGl0ZXJhbCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIFN0cmluZyBsaXRlcmFsID0gbmV4dExpdGVyYWwoKTsKKyAgICAgICAgaWYgKGxpdGVyYWwuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICB0aHJvdyBzeW50YXhFcnJvcigiRXhwZWN0ZWQgbGl0ZXJhbCB2YWx1ZSIpOworICAgICAgICB9CisgICAgICAgIHZhbHVlID0gbGl0ZXJhbDsKKyAgICAgICAgaGFzVG9rZW4gPSB0cnVlOworICAgICAgICByZXR1cm4gdG9rZW4gPSBudWxsOyAvLyB1c2UgZGVjb2RlTGl0ZXJhbCgpIHRvIGdldCB0aGUgdG9rZW4gdHlwZQorICAgIH0KKworICAgIC8qKgorICAgICAqIEFzc2lnbnMge0Bjb2RlIG5leHRUb2tlbn0gYmFzZWQgb24gdGhlIHZhbHVlIG9mIHtAY29kZSBuZXh0VmFsdWV9LgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBkZWNvZGVMaXRlcmFsKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKHZhbHVlLmVxdWFsc0lnbm9yZUNhc2UoIm51bGwiKSkgeworICAgICAgICAgICAgdG9rZW4gPSBKc29uVG9rZW4uTlVMTDsKKyAgICAgICAgfSBlbHNlIGlmICh2YWx1ZS5lcXVhbHNJZ25vcmVDYXNlKCJ0cnVlIikgfHwgdmFsdWUuZXF1YWxzSWdub3JlQ2FzZSgiZmFsc2UiKSkgeworICAgICAgICAgICAgdG9rZW4gPSBKc29uVG9rZW4uQk9PTEVBTjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgRG91YmxlLnBhcnNlRG91YmxlKHZhbHVlKTsgLy8gdGhpcyB3b3JrIGNvdWxkIHBvdGVudGlhbGx5IGJlIGNhY2hlZAorICAgICAgICAgICAgICAgIHRva2VuID0gSnNvblRva2VuLk5VTUJFUjsKKyAgICAgICAgICAgIH0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBpZ25vcmVkKSB7CisgICAgICAgICAgICAgICAgLy8gdGhpcyBtdXN0IGJlIGFuIHVucXVvdGVkIHN0cmluZworICAgICAgICAgICAgICAgIGNoZWNrTGVuaWVudCgpOworICAgICAgICAgICAgICAgIHRva2VuID0gSnNvblRva2VuLlNUUklORzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFRocm93cyBhIG5ldyBJTyBleGNlcHRpb24gd2l0aCB0aGUgZ2l2ZW4gbWVzc2FnZSBhbmQgYSBjb250ZXh0IHNuaXBwZXQKKyAgICAgKiB3aXRoIHRoaXMgcmVhZGVyJ3MgY29udGVudC4KKyAgICAgKi8KKyAgICBwdWJsaWMgSU9FeGNlcHRpb24gc3ludGF4RXJyb3IoU3RyaW5nIG1lc3NhZ2UpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIHRocm93IG5ldyBKc29uU3ludGF4RXhjZXB0aW9uKG1lc3NhZ2UgKyAiIG5lYXIgIiArIGdldFNuaXBwZXQoKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBDaGFyU2VxdWVuY2UgZ2V0U25pcHBldCgpIHsKKyAgICAgICAgU3RyaW5nQnVpbGRlciBzbmlwcGV0ID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKyAgICAgICAgaW50IGJlZm9yZVBvcyA9IE1hdGgubWluKHBvcywgMjApOworICAgICAgICBzbmlwcGV0LmFwcGVuZChidWZmZXIsIHBvcyAtIGJlZm9yZVBvcywgYmVmb3JlUG9zKTsKKyAgICAgICAgaW50IGFmdGVyUG9zID0gTWF0aC5taW4obGltaXQgLSBwb3MsIDIwKTsKKyAgICAgICAgc25pcHBldC5hcHBlbmQoYnVmZmVyLCBwb3MsIGFmdGVyUG9zKTsKKyAgICAgICAgcmV0dXJuIHNuaXBwZXQ7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgSnNvblN5bnRheEV4Y2VwdGlvbiBleHRlbmRzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgcHJpdmF0ZSBKc29uU3ludGF4RXhjZXB0aW9uKFN0cmluZyBzKSB7CisgICAgICAgICAgICBzdXBlcihzKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3V0aWwvSnNvblNjb3BlLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC91dGlsL0pzb25TY29wZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNhNTM0ZTkKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2phdmEvYW5kcm9pZC91dGlsL0pzb25TY29wZS5qYXZhCkBAIC0wLDAgKzEsNjggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQudXRpbDsKKworLyoqCisgKiBMZXhpY2FsIHNjb3BpbmcgZWxlbWVudHMgd2l0aGluIGEgSlNPTiByZWFkZXIgb3Igd3JpdGVyLgorICovCitlbnVtIEpzb25TY29wZSB7CisKKyAgICAvKioKKyAgICAgKiBBbiBhcnJheSB3aXRoIG5vIGVsZW1lbnRzIHJlcXVpcmVzIG5vIHNlcGFyYXRvcnMgb3IgbmV3bGluZXMgYmVmb3JlCisgICAgICogaXQgaXMgY2xvc2VkLgorICAgICAqLworICAgIEVNUFRZX0FSUkFZLAorCisgICAgLyoqCisgICAgICogQSBhcnJheSB3aXRoIGF0IGxlYXN0IG9uZSB2YWx1ZSByZXF1aXJlcyBhIGNvbW1hIGFuZCBuZXdsaW5lIGJlZm9yZQorICAgICAqIHRoZSBuZXh0IGVsZW1lbnQuCisgICAgICovCisgICAgTk9ORU1QVFlfQVJSQVksCisKKyAgICAvKioKKyAgICAgKiBBbiBvYmplY3Qgd2l0aCBubyBuYW1lL3ZhbHVlIHBhaXJzIHJlcXVpcmVzIG5vIHNlcGFyYXRvcnMgb3IgbmV3bGluZXMKKyAgICAgKiBiZWZvcmUgaXQgaXMgY2xvc2VkLgorICAgICAqLworICAgIEVNUFRZX09CSkVDVCwKKworICAgIC8qKgorICAgICAqIEFuIG9iamVjdCB3aG9zZSBtb3N0IHJlY2VudCBlbGVtZW50IGlzIGEga2V5LiBUaGUgbmV4dCBlbGVtZW50IG11c3QKKyAgICAgKiBiZSBhIHZhbHVlLgorICAgICAqLworICAgIERBTkdMSU5HX05BTUUsCisKKyAgICAvKioKKyAgICAgKiBBbiBvYmplY3Qgd2l0aCBhdCBsZWFzdCBvbmUgbmFtZS92YWx1ZSBwYWlyIHJlcXVpcmVzIGEgY29tbWEgYW5kCisgICAgICogbmV3bGluZSBiZWZvcmUgdGhlIG5leHQgZWxlbWVudC4KKyAgICAgKi8KKyAgICBOT05FTVBUWV9PQkpFQ1QsCisKKyAgICAvKioKKyAgICAgKiBObyBvYmplY3Qgb3IgYXJyYXkgaGFzIGJlZW4gc3RhcnRlZC4KKyAgICAgKi8KKyAgICBFTVBUWV9ET0NVTUVOVCwKKworICAgIC8qKgorICAgICAqIEEgZG9jdW1lbnQgd2l0aCBhdCBhbiBhcnJheSBvciBvYmplY3QuCisgICAgICovCisgICAgTk9ORU1QVFlfRE9DVU1FTlQsCisKKyAgICAvKioKKyAgICAgKiBBIGRvY3VtZW50IHRoYXQncyBiZWVuIGNsb3NlZCBhbmQgY2Fubm90IGJlIGFjY2Vzc2VkLgorICAgICAqLworICAgIENMT1NFRCwKK30KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3V0aWwvSnNvblRva2VuLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC91dGlsL0pzb25Ub2tlbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ1YmM2Y2EKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2phdmEvYW5kcm9pZC91dGlsL0pzb25Ub2tlbi5qYXZhCkBAIC0wLDAgKzEsODIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQudXRpbDsKKworLyoqCisgKiBBIHN0cnVjdHVyZSwgbmFtZSBvciB2YWx1ZSB0eXBlIGluIGEgSlNPTi1lbmNvZGVkIHN0cmluZy4KKyAqLworcHVibGljIGVudW0gSnNvblRva2VuIHsKKworICAgIC8qKgorICAgICAqIFRoZSBvcGVuaW5nIG9mIGEgSlNPTiBhcnJheS4gV3JpdHRlbiB1c2luZyB7QGxpbmsgSnNvbldyaXRlciNiZWdpbk9iamVjdH0KKyAgICAgKiBhbmQgcmVhZCB1c2luZyB7QGxpbmsgSnNvblJlYWRlciNiZWdpbk9iamVjdH0uCisgICAgICovCisgICAgQkVHSU5fQVJSQVksCisKKyAgICAvKioKKyAgICAgKiBUaGUgY2xvc2luZyBvZiBhIEpTT04gYXJyYXkuIFdyaXR0ZW4gdXNpbmcge0BsaW5rIEpzb25Xcml0ZXIjZW5kQXJyYXl9CisgICAgICogYW5kIHJlYWQgdXNpbmcge0BsaW5rIEpzb25SZWFkZXIjZW5kQXJyYXl9LgorICAgICAqLworICAgIEVORF9BUlJBWSwKKworICAgIC8qKgorICAgICAqIFRoZSBvcGVuaW5nIG9mIGEgSlNPTiBvYmplY3QuIFdyaXR0ZW4gdXNpbmcge0BsaW5rIEpzb25Xcml0ZXIjYmVnaW5PYmplY3R9CisgICAgICogYW5kIHJlYWQgdXNpbmcge0BsaW5rIEpzb25SZWFkZXIjYmVnaW5PYmplY3R9LgorICAgICAqLworICAgIEJFR0lOX09CSkVDVCwKKworICAgIC8qKgorICAgICAqIFRoZSBjbG9zaW5nIG9mIGEgSlNPTiBvYmplY3QuIFdyaXR0ZW4gdXNpbmcge0BsaW5rIEpzb25Xcml0ZXIjZW5kT2JqZWN0fQorICAgICAqIGFuZCByZWFkIHVzaW5nIHtAbGluayBKc29uUmVhZGVyI2VuZE9iamVjdH0uCisgICAgICovCisgICAgRU5EX09CSkVDVCwKKworICAgIC8qKgorICAgICAqIEEgSlNPTiBwcm9wZXJ0eSBuYW1lLiBXaXRoaW4gb2JqZWN0cywgdG9rZW5zIGFsdGVybmF0ZSBiZXR3ZWVuIG5hbWVzIGFuZAorICAgICAqIHRoZWlyIHZhbHVlcy4gV3JpdHRlbiB1c2luZyB7QGxpbmsgSnNvbldyaXRlciNuYW1lfSBhbmQgcmVhZCB1c2luZyB7QGxpbmsKKyAgICAgKiBKc29uUmVhZGVyI25leHROYW1lfQorICAgICAqLworICAgIE5BTUUsCisKKyAgICAvKioKKyAgICAgKiBBIEpTT04gc3RyaW5nLgorICAgICAqLworICAgIFNUUklORywKKworICAgIC8qKgorICAgICAqIEEgSlNPTiBudW1iZXIgcmVwcmVzZW50ZWQgaW4gdGhpcyBBUEkgYnkgYSBKYXZhIHtAY29kZSBkb3VibGV9LCB7QGNvZGUKKyAgICAgKiBsb25nfSwgb3Ige0Bjb2RlIGludH0uCisgICAgICovCisgICAgTlVNQkVSLAorCisgICAgLyoqCisgICAgICogQSBKU09OIHtAY29kZSB0cnVlfSBvciB7QGNvZGUgZmFsc2V9LgorICAgICAqLworICAgIEJPT0xFQU4sCisKKyAgICAvKioKKyAgICAgKiBBIEpTT04ge0Bjb2RlIG51bGx9LgorICAgICAqLworICAgIE5VTEwsCisKKyAgICAvKioKKyAgICAgKiBUaGUgZW5kIG9mIHRoZSBKU09OIHN0cmVhbS4gVGhpcyBzZW50aW5lbCB2YWx1ZSBpcyByZXR1cm5lZCBieSB7QGxpbmsKKyAgICAgKiBKc29uUmVhZGVyI3BlZWsoKX0gdG8gc2lnbmFsIHRoYXQgdGhlIEpTT04tZW5jb2RlZCB2YWx1ZSBoYXMgbm8gbW9yZQorICAgICAqIHRva2Vucy4KKyAgICAgKi8KKyAgICBFTkRfRE9DVU1FTlQKK30KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3V0aWwvSnNvbldyaXRlci5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvdXRpbC9Kc29uV3JpdGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmVjYzFjOAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3V0aWwvSnNvbldyaXRlci5qYXZhCkBAIC0wLDAgKzEsNDcyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLnV0aWw7CisKK2ltcG9ydCBqYXZhLmlvLkNsb3NlYWJsZTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uV3JpdGVyOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKKy8qKgorICogV3JpdGVzIGEgSlNPTiAoPGEgaHJlZj0iaHR0cDovL3d3dy5pZXRmLm9yZy9yZmMvcmZjNDYyNy50eHQiPlJGQyA0NjI3PC9hPikKKyAqIGVuY29kZWQgdmFsdWUgdG8gYSBzdHJlYW0sIG9uZSB0b2tlbiBhdCBhIHRpbWUuIFRoZSBzdHJlYW0gaW5jbHVkZXMgYm90aAorICogbGl0ZXJhbCB2YWx1ZXMgKHN0cmluZ3MsIG51bWJlcnMsIGJvb2xlYW5zIGFuZCBudWxscykgYXMgd2VsbCBhcyB0aGUgYmVnaW4KKyAqIGFuZCBlbmQgZGVsaW1pdGVycyBvZiBvYmplY3RzIGFuZCBhcnJheXMuCisgKgorICogPGgzPkVuY29kaW5nIEpTT048L2gzPgorICogVG8gZW5jb2RlIHlvdXIgZGF0YSBhcyBKU09OLCBjcmVhdGUgYSBuZXcge0Bjb2RlIEpzb25Xcml0ZXJ9LiBFYWNoIEpTT04KKyAqIGRvY3VtZW50IG11c3QgY29udGFpbiBvbmUgdG9wLWxldmVsIGFycmF5IG9yIG9iamVjdC4gQ2FsbCBtZXRob2RzIG9uIHRoZQorICogd3JpdGVyIGFzIHlvdSB3YWxrIHRoZSBzdHJ1Y3R1cmUncyBjb250ZW50cywgbmVzdGluZyBhcnJheXMgYW5kIG9iamVjdHMgYXMKKyAqIG5lY2Vzc2FyeToKKyAqIDx1bD4KKyAqICAgPGxpPlRvIHdyaXRlIDxzdHJvbmc+YXJyYXlzPC9zdHJvbmc+LCBmaXJzdCBjYWxsIHtAbGluayAjYmVnaW5BcnJheSgpfS4KKyAqICAgICAgIFdyaXRlIGVhY2ggb2YgdGhlIGFycmF5J3MgZWxlbWVudHMgd2l0aCB0aGUgYXBwcm9wcmlhdGUge0BsaW5rICN2YWx1ZX0KKyAqICAgICAgIG1ldGhvZHMgb3IgYnkgbmVzdGluZyBvdGhlciBhcnJheXMgYW5kIG9iamVjdHMuIEZpbmFsbHkgY2xvc2UgdGhlIGFycmF5CisgKiAgICAgICB1c2luZyB7QGxpbmsgI2VuZEFycmF5KCl9LgorICogICA8bGk+VG8gd3JpdGUgPHN0cm9uZz5vYmplY3RzPC9zdHJvbmc+LCBmaXJzdCBjYWxsIHtAbGluayAjYmVnaW5PYmplY3QoKX0uCisgKiAgICAgICBXcml0ZSBlYWNoIG9mIHRoZSBvYmplY3QncyBwcm9wZXJ0aWVzIGJ5IGFsdGVybmF0aW5nIGNhbGxzIHRvCisgKiAgICAgICB7QGxpbmsgI25hbWV9IHdpdGggdGhlIHByb3BlcnR5J3MgdmFsdWUuIFdyaXRlIHByb3BlcnR5IHZhbHVlcyB3aXRoIHRoZQorICogICAgICAgYXBwcm9wcmlhdGUge0BsaW5rICN2YWx1ZX0gbWV0aG9kIG9yIGJ5IG5lc3Rpbmcgb3RoZXIgb2JqZWN0cyBvciBhcnJheXMuCisgKiAgICAgICBGaW5hbGx5IGNsb3NlIHRoZSBvYmplY3QgdXNpbmcge0BsaW5rICNlbmRPYmplY3QoKX0uCisgKiA8L3VsPgorICoKKyAqIDxoMz5FeGFtcGxlPC9oMz4KKyAqIFN1cHBvc2Ugd2UnZCBsaWtlIHRvIGVuY29kZSBhIHN0cmVhbSBvZiBtZXNzYWdlcyBzdWNoIGFzIHRoZSBmb2xsb3dpbmc6IDxwcmU+IHtAY29kZQorICogWworICogICB7CisgKiAgICAgImlkIjogOTEyMzQ1Njc4OTAxLAorICogICAgICJ0ZXh0IjogIkhvdyBkbyBJIHdyaXRlIEpTT04gb24gQW5kcm9pZD8iLAorICogICAgICJnZW8iOiBudWxsLAorICogICAgICJ1c2VyIjogeworICogICAgICAgIm5hbWUiOiAiYW5kcm9pZF9uZXdiIiwKKyAqICAgICAgICJmb2xsb3dlcnNfY291bnQiOiA0MQorICogICAgICB9CisgKiAgIH0sCisgKiAgIHsKKyAqICAgICAiaWQiOiA5MTIzNDU2Nzg5MDIsCisgKiAgICAgInRleHQiOiAiQGFuZHJvaWRfbmV3YiBqdXN0IHVzZSBhbmRyb2lkLnV0aWwuSnNvbldyaXRlciEiLAorICogICAgICJnZW8iOiBbNTAuNDU0NzIyLCAtMTA0LjYwNjY2N10sCisgKiAgICAgInVzZXIiOiB7CisgKiAgICAgICAibmFtZSI6ICJqZXNzZSIsCisgKiAgICAgICAiZm9sbG93ZXJzX2NvdW50IjogMgorICogICAgIH0KKyAqICAgfQorICogXX08L3ByZT4KKyAqIFRoaXMgY29kZSBlbmNvZGVzIHRoZSBhYm92ZSBzdHJ1Y3R1cmU6IDxwcmU+ICAge0Bjb2RlCisgKiAgIHB1YmxpYyB2b2lkIHdyaXRlSnNvblN0cmVhbShPdXRwdXRTdHJlYW0gb3V0LCBMaXN0PE1lc3NhZ2U+IG1lc3NhZ2VzKSB0aHJvd3MgSU9FeGNlcHRpb24geworICogICAgIEpzb25Xcml0ZXIgd3JpdGVyID0gbmV3IEpzb25Xcml0ZXIobmV3IE91dHB1dFN0cmVhbVdyaXRlcihvdXQsICJVVEYtOCIpKTsKKyAqICAgICB3cml0ZXIuc2V0SW5kZW50U3BhY2VzKDQpOworICogICAgIHdyaXRlTWVzc2FnZXNBcnJheSh3cml0ZXIsIG1lc3NhZ2VzKTsKKyAqICAgICB3cml0ZXIuY2xvc2UoKTsKKyAqICAgfQorICoKKyAqICAgcHVibGljIHZvaWQgd3JpdGVNZXNzYWdlc0FycmF5KEpzb25Xcml0ZXIgd3JpdGVyLCBMaXN0PE1lc3NhZ2U+IG1lc3NhZ2VzKSB0aHJvd3MgSU9FeGNlcHRpb24geworICogICAgIHdyaXRlci5iZWdpbkFycmF5KCk7CisgKiAgICAgZm9yIChNZXNzYWdlIG1lc3NhZ2UgOiBtZXNzYWdlcykgeworICogICAgICAgd3JpdGVNZXNzYWdlKHdyaXRlciwgbWVzc2FnZSk7CisgKiAgICAgfQorICogICAgIHdyaXRlci5lbmRBcnJheSgpOworICogICB9CisgKgorICogICBwdWJsaWMgdm9pZCB3cml0ZU1lc3NhZ2UoSnNvbldyaXRlciB3cml0ZXIsIE1lc3NhZ2UgbWVzc2FnZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAqICAgICB3cml0ZXIuYmVnaW5PYmplY3QoKTsKKyAqICAgICB3cml0ZXIubmFtZSgiaWQiKS52YWx1ZShtZXNzYWdlLmdldElkKCkpOworICogICAgIHdyaXRlci5uYW1lKCJ0ZXh0IikudmFsdWUobWVzc2FnZS5nZXRUZXh0KCkpOworICogICAgIGlmIChtZXNzYWdlLmdldEdlbygpICE9IG51bGwpIHsKKyAqICAgICAgIHdyaXRlci5uYW1lKCJnZW8iKTsKKyAqICAgICAgIHdyaXRlRG91Ymxlc0FycmF5KHdyaXRlciwgbWVzc2FnZS5nZXRHZW8oKSk7CisgKiAgICAgfSBlbHNlIHsKKyAqICAgICAgIHdyaXRlci5uYW1lKCJnZW8iKS5udWxsVmFsdWUoKTsKKyAqICAgICB9CisgKiAgICAgd3JpdGVyLm5hbWUoInVzZXIiKTsKKyAqICAgICB3cml0ZVVzZXIod3JpdGVyLCBtZXNzYWdlLmdldFVzZXIoKSk7CisgKiAgICAgd3JpdGVyLmVuZE9iamVjdCgpOworICogICB9CisgKgorICogICBwdWJsaWMgdm9pZCB3cml0ZVVzZXIoSnNvbldyaXRlciB3cml0ZXIsIFVzZXIgdXNlcikgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAqICAgICB3cml0ZXIuYmVnaW5PYmplY3QoKTsKKyAqICAgICB3cml0ZXIubmFtZSgibmFtZSIpLnZhbHVlKHVzZXIuZ2V0TmFtZSgpKTsKKyAqICAgICB3cml0ZXIubmFtZSgiZm9sbG93ZXJzX2NvdW50IikudmFsdWUodXNlci5nZXRGb2xsb3dlcnNDb3VudCgpKTsKKyAqICAgICB3cml0ZXIuZW5kT2JqZWN0KCk7CisgKiAgIH0KKyAqCisgKiAgIHB1YmxpYyB2b2lkIHdyaXRlRG91Ymxlc0FycmF5KEpzb25Xcml0ZXIgd3JpdGVyLCBMaXN0PERvdWJsZT4gZG91YmxlcykgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAqICAgICB3cml0ZXIuYmVnaW5BcnJheSgpOworICogICAgIGZvciAoRG91YmxlIHZhbHVlIDogZG91YmxlcykgeworICogICAgICAgd3JpdGVyLnZhbHVlKHZhbHVlKTsKKyAqICAgICB9CisgKiAgICAgd3JpdGVyLmVuZEFycmF5KCk7CisgKiAgIH19PC9wcmU+CisgKgorICogPHA+RWFjaCB7QGNvZGUgSnNvbldyaXRlcn0gbWF5IGJlIHVzZWQgdG8gd3JpdGUgYSBzaW5nbGUgSlNPTiBzdHJlYW0uCisgKiBJbnN0YW5jZXMgb2YgdGhpcyBjbGFzcyBhcmUgbm90IHRocmVhZCBzYWZlLiBDYWxscyB0aGF0IHdvdWxkIHJlc3VsdCBpbiBhCisgKiBtYWxmb3JtZWQgSlNPTiBzdHJpbmcgd2lsbCBmYWlsIHdpdGggYW4ge0BsaW5rIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbn0uCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBKc29uV3JpdGVyIGltcGxlbWVudHMgQ2xvc2VhYmxlIHsKKworICAgIC8qKiBUaGUgb3V0cHV0IGRhdGEsIGNvbnRhaW5pbmcgYXQgbW9zdCBvbmUgdG9wLWxldmVsIGFycmF5IG9yIG9iamVjdC4gKi8KKyAgICBwcml2YXRlIGZpbmFsIFdyaXRlciBvdXQ7CisKKyAgICBwcml2YXRlIGZpbmFsIExpc3Q8SnNvblNjb3BlPiBzdGFjayA9IG5ldyBBcnJheUxpc3Q8SnNvblNjb3BlPigpOworICAgIHsKKyAgICAgICAgc3RhY2suYWRkKEpzb25TY29wZS5FTVBUWV9ET0NVTUVOVCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQSBzdHJpbmcgY29udGFpbmluZyBhIGZ1bGwgc2V0IG9mIHNwYWNlcyBmb3IgYSBzaW5nbGUgbGV2ZWwgb2YKKyAgICAgKiBpbmRlbnRhdGlvbiwgb3IgbnVsbCBmb3Igbm8gcHJldHR5IHByaW50aW5nLgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIGluZGVudDsKKworICAgIC8qKgorICAgICAqIFRoZSBuYW1lL3ZhbHVlIHNlcGFyYXRvcjsgZWl0aGVyICI6IiBvciAiOiAiLgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIHNlcGFyYXRvciA9ICI6IjsKKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UgdGhhdCB3cml0ZXMgYSBKU09OLWVuY29kZWQgc3RyZWFtIHRvIHtAY29kZSBvdXR9LgorICAgICAqIEZvciBiZXN0IHBlcmZvcm1hbmNlLCBlbnN1cmUge0BsaW5rIFdyaXRlcn0gaXMgYnVmZmVyZWQ7IHdyYXBwaW5nIGluCisgICAgICoge0BsaW5rIGphdmEuaW8uQnVmZmVyZWRXcml0ZXIgQnVmZmVyZWRXcml0ZXJ9IGlmIG5lY2Vzc2FyeS4KKyAgICAgKi8KKyAgICBwdWJsaWMgSnNvbldyaXRlcihXcml0ZXIgb3V0KSB7CisgICAgICAgIGlmIChvdXQgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCJvdXQgPT0gbnVsbCIpOworICAgICAgICB9CisgICAgICAgIHRoaXMub3V0ID0gb3V0OworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIGluZGVudGF0aW9uIHN0cmluZyB0byBiZSByZXBlYXRlZCBmb3IgZWFjaCBsZXZlbCBvZiBpbmRlbnRhdGlvbgorICAgICAqIGluIHRoZSBlbmNvZGVkIGRvY3VtZW50LiBJZiB7QGNvZGUgaW5kZW50LmlzRW1wdHkoKX0gdGhlIGVuY29kZWQgZG9jdW1lbnQKKyAgICAgKiB3aWxsIGJlIGNvbXBhY3QuIE90aGVyd2lzZSB0aGUgZW5jb2RlZCBkb2N1bWVudCB3aWxsIGJlIG1vcmUKKyAgICAgKiBodW1hbi1yZWFkYWJsZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBpbmRlbnQgYSBzdHJpbmcgY29udGFpbmluZyBvbmx5IHdoaXRlc3BhY2UuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0SW5kZW50KFN0cmluZyBpbmRlbnQpIHsKKyAgICAgICAgaWYgKGluZGVudC5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIHRoaXMuaW5kZW50ID0gbnVsbDsKKyAgICAgICAgICAgIHRoaXMuc2VwYXJhdG9yID0gIjoiOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdGhpcy5pbmRlbnQgPSBpbmRlbnQ7CisgICAgICAgICAgICB0aGlzLnNlcGFyYXRvciA9ICI6ICI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBCZWdpbnMgZW5jb2RpbmcgYSBuZXcgYXJyYXkuIEVhY2ggY2FsbCB0byB0aGlzIG1ldGhvZCBtdXN0IGJlIHBhaXJlZCB3aXRoCisgICAgICogYSBjYWxsIHRvIHtAbGluayAjZW5kQXJyYXl9LgorICAgICAqCisgICAgICogQHJldHVybiB0aGlzIHdyaXRlci4KKyAgICAgKi8KKyAgICBwdWJsaWMgSnNvbldyaXRlciBiZWdpbkFycmF5KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIG9wZW4oSnNvblNjb3BlLkVNUFRZX0FSUkFZLCAiWyIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEVuZHMgZW5jb2RpbmcgdGhlIGN1cnJlbnQgYXJyYXkuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoaXMgd3JpdGVyLgorICAgICAqLworICAgIHB1YmxpYyBKc29uV3JpdGVyIGVuZEFycmF5KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIGNsb3NlKEpzb25TY29wZS5FTVBUWV9BUlJBWSwgSnNvblNjb3BlLk5PTkVNUFRZX0FSUkFZLCAiXSIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEJlZ2lucyBlbmNvZGluZyBhIG5ldyBvYmplY3QuIEVhY2ggY2FsbCB0byB0aGlzIG1ldGhvZCBtdXN0IGJlIHBhaXJlZAorICAgICAqIHdpdGggYSBjYWxsIHRvIHtAbGluayAjZW5kT2JqZWN0fS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhpcyB3cml0ZXIuCisgICAgICovCisgICAgcHVibGljIEpzb25Xcml0ZXIgYmVnaW5PYmplY3QoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICByZXR1cm4gb3BlbihKc29uU2NvcGUuRU1QVFlfT0JKRUNULCAieyIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEVuZHMgZW5jb2RpbmcgdGhlIGN1cnJlbnQgb2JqZWN0LgorICAgICAqCisgICAgICogQHJldHVybiB0aGlzIHdyaXRlci4KKyAgICAgKi8KKyAgICBwdWJsaWMgSnNvbldyaXRlciBlbmRPYmplY3QoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICByZXR1cm4gY2xvc2UoSnNvblNjb3BlLkVNUFRZX09CSkVDVCwgSnNvblNjb3BlLk5PTkVNUFRZX09CSkVDVCwgIn0iKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBFbnRlcnMgYSBuZXcgc2NvcGUgYnkgYXBwZW5kaW5nIGFueSBuZWNlc3Nhcnkgd2hpdGVzcGFjZSBhbmQgdGhlIGdpdmVuCisgICAgICogYnJhY2tldC4KKyAgICAgKi8KKyAgICBwcml2YXRlIEpzb25Xcml0ZXIgb3BlbihKc29uU2NvcGUgZW1wdHksIFN0cmluZyBvcGVuQnJhY2tldCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgYmVmb3JlVmFsdWUodHJ1ZSk7CisgICAgICAgIHN0YWNrLmFkZChlbXB0eSk7CisgICAgICAgIG91dC53cml0ZShvcGVuQnJhY2tldCk7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIC8qKgorICAgICAqIENsb3NlcyB0aGUgY3VycmVudCBzY29wZSBieSBhcHBlbmRpbmcgYW55IG5lY2Vzc2FyeSB3aGl0ZXNwYWNlIGFuZCB0aGUKKyAgICAgKiBnaXZlbiBicmFja2V0LgorICAgICAqLworICAgIHByaXZhdGUgSnNvbldyaXRlciBjbG9zZShKc29uU2NvcGUgZW1wdHksIEpzb25TY29wZSBub25lbXB0eSwgU3RyaW5nIGNsb3NlQnJhY2tldCkKKyAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIEpzb25TY29wZSBjb250ZXh0ID0gcGVlaygpOworICAgICAgICBpZiAoY29udGV4dCAhPSBub25lbXB0eSAmJiBjb250ZXh0ICE9IGVtcHR5KSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJOZXN0aW5nIHByb2JsZW06ICIgKyBzdGFjayk7CisgICAgICAgIH0KKworICAgICAgICBzdGFjay5yZW1vdmUoc3RhY2suc2l6ZSgpIC0gMSk7CisgICAgICAgIGlmIChjb250ZXh0ID09IG5vbmVtcHR5KSB7CisgICAgICAgICAgICBuZXdsaW5lKCk7CisgICAgICAgIH0KKyAgICAgICAgb3V0LndyaXRlKGNsb3NlQnJhY2tldCk7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIHZhbHVlIG9uIHRoZSB0b3Agb2YgdGhlIHN0YWNrLgorICAgICAqLworICAgIHByaXZhdGUgSnNvblNjb3BlIHBlZWsoKSB7CisgICAgICAgIHJldHVybiBzdGFjay5nZXQoc3RhY2suc2l6ZSgpIC0gMSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVwbGFjZSB0aGUgdmFsdWUgb24gdGhlIHRvcCBvZiB0aGUgc3RhY2sgd2l0aCB0aGUgZ2l2ZW4gdmFsdWUuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIHJlcGxhY2VUb3AoSnNvblNjb3BlIHRvcE9mU3RhY2spIHsKKyAgICAgICAgc3RhY2suc2V0KHN0YWNrLnNpemUoKSAtIDEsIHRvcE9mU3RhY2spOworICAgIH0KKworICAgIC8qKgorICAgICAqIEVuY29kZXMgdGhlIHByb3BlcnR5IG5hbWUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiB0aGUgZm9ydGhjb21pbmcgdmFsdWUuIE1heSBub3QgYmUgbnVsbC4KKyAgICAgKiBAcmV0dXJuIHRoaXMgd3JpdGVyLgorICAgICAqLworICAgIHB1YmxpYyBKc29uV3JpdGVyIG5hbWUoU3RyaW5nIG5hbWUpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGlmIChuYW1lID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigibmFtZSA9PSBudWxsIik7CisgICAgICAgIH0KKyAgICAgICAgYmVmb3JlTmFtZSgpOworICAgICAgICBzdHJpbmcobmFtZSk7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIC8qKgorICAgICAqIEVuY29kZXMge0Bjb2RlIHZhbHVlfS4KKyAgICAgKgorICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgbGl0ZXJhbCBzdHJpbmcgdmFsdWUsIG9yIG51bGwgdG8gZW5jb2RlIGEgbnVsbCBsaXRlcmFsLgorICAgICAqIEByZXR1cm4gdGhpcyB3cml0ZXIuCisgICAgICovCisgICAgcHVibGljIEpzb25Xcml0ZXIgdmFsdWUoU3RyaW5nIHZhbHVlKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIG51bGxWYWx1ZSgpOworICAgICAgICB9CisgICAgICAgIGJlZm9yZVZhbHVlKGZhbHNlKTsKKyAgICAgICAgc3RyaW5nKHZhbHVlKTsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgLyoqCisgICAgICogRW5jb2RlcyB7QGNvZGUgbnVsbH0uCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoaXMgd3JpdGVyLgorICAgICAqLworICAgIHB1YmxpYyBKc29uV3JpdGVyIG51bGxWYWx1ZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGJlZm9yZVZhbHVlKGZhbHNlKTsKKyAgICAgICAgb3V0LndyaXRlKCJudWxsIik7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIC8qKgorICAgICAqIEVuY29kZXMge0Bjb2RlIHZhbHVlfS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhpcyB3cml0ZXIuCisgICAgICovCisgICAgcHVibGljIEpzb25Xcml0ZXIgdmFsdWUoYm9vbGVhbiB2YWx1ZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgYmVmb3JlVmFsdWUoZmFsc2UpOworICAgICAgICBvdXQud3JpdGUodmFsdWUgPyAidHJ1ZSIgOiAiZmFsc2UiKTsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgLyoqCisgICAgICogRW5jb2RlcyB7QGNvZGUgdmFsdWV9LgorICAgICAqCisgICAgICogQHBhcmFtIHZhbHVlIGEgZmluaXRlIHZhbHVlLiBNYXkgbm90IGJlIHtAbGluayBEb3VibGUjaXNOYU4oKSBOYU5zfSBvcgorICAgICAqICAgICB7QGxpbmsgRG91YmxlI2lzSW5maW5pdGUoKSBpbmZpbml0aWVzfS4KKyAgICAgKiBAcmV0dXJuIHRoaXMgd3JpdGVyLgorICAgICAqLworICAgIHB1YmxpYyBKc29uV3JpdGVyIHZhbHVlKGRvdWJsZSB2YWx1ZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKERvdWJsZS5pc05hTih2YWx1ZSkgfHwgRG91YmxlLmlzSW5maW5pdGUodmFsdWUpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJOdW1lcmljIHZhbHVlcyBtdXN0IGJlIGZpbml0ZSwgYnV0IHdhcyAiICsgdmFsdWUpOworICAgICAgICB9CisgICAgICAgIGJlZm9yZVZhbHVlKGZhbHNlKTsKKyAgICAgICAgb3V0LmFwcGVuZChEb3VibGUudG9TdHJpbmcodmFsdWUpKTsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgLyoqCisgICAgICogRW5jb2RlcyB7QGNvZGUgdmFsdWV9LgorICAgICAqCisgICAgICogQHJldHVybiB0aGlzIHdyaXRlci4KKyAgICAgKi8KKyAgICBwdWJsaWMgSnNvbldyaXRlciB2YWx1ZShsb25nIHZhbHVlKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBiZWZvcmVWYWx1ZShmYWxzZSk7CisgICAgICAgIG91dC53cml0ZShMb25nLnRvU3RyaW5nKHZhbHVlKSk7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIC8qKgorICAgICAqIEVuc3VyZXMgYWxsIGJ1ZmZlcmVkIGRhdGEgaXMgd3JpdHRlbiB0byB0aGUgdW5kZXJseWluZyB7QGxpbmsgV3JpdGVyfQorICAgICAqIGFuZCBmbHVzaGVzIHRoYXQgd3JpdGVyLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGZsdXNoKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgb3V0LmZsdXNoKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogRmx1c2hlcyBhbmQgY2xvc2VzIHRoaXMgd3JpdGVyIGFuZCB0aGUgdW5kZXJseWluZyB7QGxpbmsgV3JpdGVyfS4KKyAgICAgKgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gaWYgdGhlIEpTT04gZG9jdW1lbnQgaXMgaW5jb21wbGV0ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBjbG9zZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIG91dC5jbG9zZSgpOworCisgICAgICAgIGlmIChwZWVrKCkgIT0gSnNvblNjb3BlLk5PTkVNUFRZX0RPQ1VNRU5UKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oIkluY29tcGxldGUgZG9jdW1lbnQiKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBzdHJpbmcoU3RyaW5nIHZhbHVlKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBvdXQud3JpdGUoIlwiIik7CisgICAgICAgIGZvciAoaW50IGkgPSAwLCBsZW5ndGggPSB2YWx1ZS5sZW5ndGgoKTsgaSA8IGxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBjaGFyIGMgPSB2YWx1ZS5jaGFyQXQoaSk7CisKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgKiBGcm9tIFJGQyA0NjI3LCAiQWxsIFVuaWNvZGUgY2hhcmFjdGVycyBtYXkgYmUgcGxhY2VkIHdpdGhpbiB0aGUKKyAgICAgICAgICAgICAqIHF1b3RhdGlvbiBtYXJrcyBleGNlcHQgZm9yIHRoZSBjaGFyYWN0ZXJzIHRoYXQgbXVzdCBiZSBlc2NhcGVkOgorICAgICAgICAgICAgICogcXVvdGF0aW9uIG1hcmssIHJldmVyc2Ugc29saWR1cywgYW5kIHRoZSBjb250cm9sIGNoYXJhY3RlcnMKKyAgICAgICAgICAgICAqIChVKzAwMDAgdGhyb3VnaCBVKzAwMUYpLiIKKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgc3dpdGNoIChjKSB7CisgICAgICAgICAgICAgICAgY2FzZSAnIic6CisgICAgICAgICAgICAgICAgY2FzZSAnXFwnOgorICAgICAgICAgICAgICAgIGNhc2UgJy8nOgorICAgICAgICAgICAgICAgICAgICBvdXQud3JpdGUoJ1xcJyk7CisgICAgICAgICAgICAgICAgICAgIG91dC53cml0ZShjKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlICdcdCc6CisgICAgICAgICAgICAgICAgICAgIG91dC53cml0ZSgiXFx0Iik7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSAnXGInOgorICAgICAgICAgICAgICAgICAgICBvdXQud3JpdGUoIlxcYiIpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGNhc2UgJ1xuJzoKKyAgICAgICAgICAgICAgICAgICAgb3V0LndyaXRlKCJcXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlICdccic6CisgICAgICAgICAgICAgICAgICAgIG91dC53cml0ZSgiXFxyIik7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSAnXGYnOgorICAgICAgICAgICAgICAgICAgICBvdXQud3JpdGUoIlxcZiIpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIGlmIChjIDw9IDB4MUYpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG91dC53cml0ZShTdHJpbmcuZm9ybWF0KCJcXHUlMDR4IiwgKGludCkgYykpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgb3V0LndyaXRlKGMpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgb3V0LndyaXRlKCJcIiIpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBuZXdsaW5lKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKGluZGVudCA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBvdXQud3JpdGUoIlxuIik7CisgICAgICAgIGZvciAoaW50IGkgPSAxOyBpIDwgc3RhY2suc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgIG91dC53cml0ZShpbmRlbnQpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogSW5zZXJ0cyBhbnkgbmVjZXNzYXJ5IHNlcGFyYXRvcnMgYW5kIHdoaXRlc3BhY2UgYmVmb3JlIGEgbmFtZS4gQWxzbworICAgICAqIGFkanVzdHMgdGhlIHN0YWNrIHRvIGV4cGVjdCB0aGUgbmFtZSdzIHZhbHVlLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBiZWZvcmVOYW1lKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgSnNvblNjb3BlIGNvbnRleHQgPSBwZWVrKCk7CisgICAgICAgIGlmIChjb250ZXh0ID09IEpzb25TY29wZS5OT05FTVBUWV9PQkpFQ1QpIHsgLy8gZmlyc3QgaW4gb2JqZWN0CisgICAgICAgICAgICBvdXQud3JpdGUoJywnKTsKKyAgICAgICAgfSBlbHNlIGlmIChjb250ZXh0ICE9IEpzb25TY29wZS5FTVBUWV9PQkpFQ1QpIHsgLy8gbm90IGluIGFuIG9iamVjdCEKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIk5lc3RpbmcgcHJvYmxlbTogIiArIHN0YWNrKTsKKyAgICAgICAgfQorICAgICAgICBuZXdsaW5lKCk7CisgICAgICAgIHJlcGxhY2VUb3AoSnNvblNjb3BlLkRBTkdMSU5HX05BTUUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEluc2VydHMgYW55IG5lY2Vzc2FyeSBzZXBhcmF0b3JzIGFuZCB3aGl0ZXNwYWNlIGJlZm9yZSBhIGxpdGVyYWwgdmFsdWUsCisgICAgICogaW5saW5lIGFycmF5LCBvciBpbmxpbmUgb2JqZWN0LiBBbHNvIGFkanVzdHMgdGhlIHN0YWNrIHRvIGV4cGVjdCBlaXRoZXIgYQorICAgICAqIGNsb3NpbmcgYnJhY2tldCBvciBhbm90aGVyIGVsZW1lbnQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcm9vdCB0cnVlIGlmIHRoZSB2YWx1ZSBpcyBhIG5ldyBhcnJheSBvciBvYmplY3QsIHRoZSB0d28gdmFsdWVzCisgICAgICogICAgIHBlcm1pdHRlZCBhcyB0b3AtbGV2ZWwgZWxlbWVudHMuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIGJlZm9yZVZhbHVlKGJvb2xlYW4gcm9vdCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgc3dpdGNoIChwZWVrKCkpIHsKKyAgICAgICAgICAgIGNhc2UgRU1QVFlfRE9DVU1FTlQ6IC8vIGZpcnN0IGluIGRvY3VtZW50CisgICAgICAgICAgICAgICAgaWYgKCFyb290KSB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkpTT04gbXVzdCBzdGFydCB3aXRoIGFuIGFycmF5IG9yIGFuIG9iamVjdC4iKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmVwbGFjZVRvcChKc29uU2NvcGUuTk9ORU1QVFlfRE9DVU1FTlQpOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIEVNUFRZX0FSUkFZOiAvLyBmaXJzdCBpbiBhcnJheQorICAgICAgICAgICAgICAgIHJlcGxhY2VUb3AoSnNvblNjb3BlLk5PTkVNUFRZX0FSUkFZKTsKKyAgICAgICAgICAgICAgICBuZXdsaW5lKCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgTk9ORU1QVFlfQVJSQVk6IC8vIGFub3RoZXIgaW4gYXJyYXkKKyAgICAgICAgICAgICAgICBvdXQuYXBwZW5kKCcsJyk7CisgICAgICAgICAgICAgICAgbmV3bGluZSgpOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIERBTkdMSU5HX05BTUU6IC8vIHZhbHVlIGZvciBuYW1lCisgICAgICAgICAgICAgICAgb3V0LmFwcGVuZChzZXBhcmF0b3IpOworICAgICAgICAgICAgICAgIHJlcGxhY2VUb3AoSnNvblNjb3BlLk5PTkVNUFRZX09CSkVDVCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgTk9ORU1QVFlfRE9DVU1FTlQ6CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgICAgICJKU09OIG11c3QgaGF2ZSBvbmx5IG9uZSB0b3AtbGV2ZWwgdmFsdWUuIik7CisKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiTmVzdGluZyBwcm9ibGVtOiAiICsgc3RhY2spOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvdXRpbC9QYXR0ZXJucy5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvdXRpbC9QYXR0ZXJucy5qYXZhCmluZGV4IDVjYmZkMjkuLjNiY2QyNjYgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3V0aWwvUGF0dGVybnMuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC91dGlsL1BhdHRlcm5zLmphdmEKQEAgLTI1LDcgKzI1LDcgQEAKIHB1YmxpYyBjbGFzcyBQYXR0ZXJucyB7CiAgICAgLyoqCiAgICAgICogIFJlZ3VsYXIgZXhwcmVzc2lvbiB0byBtYXRjaCBhbGwgSUFOQSB0b3AtbGV2ZWwgZG9tYWlucy4KLSAgICAgKiAgTGlzdCBhY2N1cmF0ZSBhcyBvZiAyMDEwLzAyLzA1LiAgTGlzdCB0YWtlbiBmcm9tOgorICAgICAqICBMaXN0IGFjY3VyYXRlIGFzIG9mIDIwMTAvMDUvMDYuICBMaXN0IHRha2VuIGZyb206CiAgICAgICogIGh0dHA6Ly9kYXRhLmlhbmEub3JnL1RMRC90bGRzLWFscGhhLWJ5LWRvbWFpbi50eHQKICAgICAgKiAgVGhpcyBwYXR0ZXJuIGlzIGF1dG8tZ2VuZXJhdGVkIGJ5IGZyYW1ld29ya3MvYmFzZS9jb21tb24vdG9vbHMvbWFrZS1pYW5hLXRsZC1wYXR0ZXJuLnB5CiAgICAgICovCkBAIC01Myw4ICs1Myw4IEBACiAgICAgICAgICsgInx1W2Fna3N5el0iCiAgICAgICAgICsgInx2W2FjZWdpbnVdIgogICAgICAgICArICJ8d1tmc10iCi0gICAgICAgICsgInwoeG5cXC1cXC0wendtNTZkfHhuXFwtXFwtMTFiNWJzM2E5YWo2Z3x4blxcLVxcLTgwYWtoYnlrbmo0Znx4blxcLVxcLTl0NGIxMXlpNWF8eG5cXC1cXC1kZWJhMGFkfHhuXFwtXFwtZzZ3MjUxZHx4blxcLVxcLWhnYms2YWo3ZjUzYmJhfHhuXFwtXFwtaGxjajZheWE5ZXNjN2F8eG5cXC1cXC1qeGFscGRscHx4blxcLVxcLWtnYmVjaHR2fHhuXFwtXFwtemNremFoKSIKLSAgICAgICAgKyAifHlbZXR1XSIKKyAgICAgICAgKyAifCh4blxcLVxcLTB6d201NmR8eG5cXC1cXC0xMWI1YnMzYTlhajZnfHhuXFwtXFwtODBha2hieWtuajRmfHhuXFwtXFwtOXQ0YjExeWk1YXx4blxcLVxcLWRlYmEwYWR8eG5cXC1cXC1nNncyNTFkfHhuXFwtXFwtaGdiazZhajdmNTNiYmF8eG5cXC1cXC1obGNqNmF5YTllc2M3YXx4blxcLVxcLWp4YWxwZGxwfHhuXFwtXFwta2diZWNodHZ8eG5cXC1cXC1tZ2JhYW03YThofHhuXFwtXFwtbWdiZXJwNGE1ZDRhcnx4blxcLVxcLXdnYmgxY3x4blxcLVxcLXpja3phaCkiCisgICAgICAgICsgInx5W2V0XSIKICAgICAgICAgKyAifHpbYW13XSkiOwogCiAgICAgLyoqCkBAIC02NSw3ICs2NSw3IEBACiAKICAgICAvKioKICAgICAgKiAgUmVndWxhciBleHByZXNzaW9uIHRvIG1hdGNoIGFsbCBJQU5BIHRvcC1sZXZlbCBkb21haW5zIGZvciBXRUJfVVJMLgotICAgICAqICBMaXN0IGFjY3VyYXRlIGFzIG9mIDIwMTAvMDIvMDUuICBMaXN0IHRha2VuIGZyb206CisgICAgICogIExpc3QgYWNjdXJhdGUgYXMgb2YgMjAxMC8wNS8wNi4gIExpc3QgdGFrZW4gZnJvbToKICAgICAgKiAgaHR0cDovL2RhdGEuaWFuYS5vcmcvVExEL3RsZHMtYWxwaGEtYnktZG9tYWluLnR4dAogICAgICAqICBUaGlzIHBhdHRlcm4gaXMgYXV0by1nZW5lcmF0ZWQgYnkgZnJhbWV3b3Jrcy9iYXNlL2NvbW1vbi90b29scy9tYWtlLWlhbmEtdGxkLXBhdHRlcm4ucHkKICAgICAgKi8KQEAgLTk0LDggKzk0LDggQEAKICAgICAgICAgKyAifHVbYWdrc3l6XSIKICAgICAgICAgKyAifHZbYWNlZ2ludV0iCiAgICAgICAgICsgInx3W2ZzXSIKLSAgICAgICAgKyAifCg/OnhuXFwtXFwtMHp3bTU2ZHx4blxcLVxcLTExYjViczNhOWFqNmd8eG5cXC1cXC04MGFraGJ5a25qNGZ8eG5cXC1cXC05dDRiMTF5aTVhfHhuXFwtXFwtZGViYTBhZHx4blxcLVxcLWc2dzI1MWR8eG5cXC1cXC1oZ2JrNmFqN2Y1M2JiYXx4blxcLVxcLWhsY2o2YXlhOWVzYzdhfHhuXFwtXFwtanhhbHBkbHB8eG5cXC1cXC1rZ2JlY2h0dnx4blxcLVxcLXpja3phaCkiCi0gICAgICAgICsgInx5W2V0dV0iCisgICAgICAgICsgInwoPzp4blxcLVxcLTB6d201NmR8eG5cXC1cXC0xMWI1YnMzYTlhajZnfHhuXFwtXFwtODBha2hieWtuajRmfHhuXFwtXFwtOXQ0YjExeWk1YXx4blxcLVxcLWRlYmEwYWR8eG5cXC1cXC1nNncyNTFkfHhuXFwtXFwtaGdiazZhajdmNTNiYmF8eG5cXC1cXC1obGNqNmF5YTllc2M3YXx4blxcLVxcLWp4YWxwZGxwfHhuXFwtXFwta2diZWNodHZ8eG5cXC1cXC1tZ2JhYW03YThofHhuXFwtXFwtbWdiZXJwNGE1ZDRhcnx4blxcLVxcLXdnYmgxY3x4blxcLVxcLXpja3phaCkiCisgICAgICAgICsgInx5W2V0XSIKICAgICAgICAgKyAifHpbYW13XSkpIjsKIAogICAgIC8qKgpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvdXRpbC9TcGFyc2VBcnJheS5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvdXRpbC9TcGFyc2VBcnJheS5qYXZhCmluZGV4IDFjOGIzMzAuLjdmYzQzYjkgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3V0aWwvU3BhcnNlQXJyYXkuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC91dGlsL1NwYXJzZUFycmF5LmphdmEKQEAgLTkwLDYgKzkwLDE2IEBACiAgICAgICAgIGRlbGV0ZShrZXkpOwogICAgIH0KIAorICAgIC8qKgorICAgICAqIFJlbW92ZXMgdGhlIG1hcHBpbmcgYXQgdGhlIHNwZWNpZmllZCBpbmRleC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZW1vdmVBdChpbnQgaW5kZXgpIHsKKyAgICAgICAgaWYgKG1WYWx1ZXNbaW5kZXhdICE9IERFTEVURUQpIHsKKyAgICAgICAgICAgIG1WYWx1ZXNbaW5kZXhdID0gREVMRVRFRDsKKyAgICAgICAgICAgIG1HYXJiYWdlID0gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KKyAgICAKICAgICBwcml2YXRlIHZvaWQgZ2MoKSB7CiAgICAgICAgIC8vIExvZy5lKCJTcGFyc2VBcnJheSIsICJnYyBzdGFydCB3aXRoICIgKyBtU2l6ZSk7CiAKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3V0aWwvVGltaW5nTG9nZ2VyLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC91dGlsL1RpbWluZ0xvZ2dlci5qYXZhCmluZGV4IDBmMzljOTcuLmJlNDQyZGEgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3V0aWwvVGltaW5nTG9nZ2VyLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvdXRpbC9UaW1pbmdMb2dnZXIuamF2YQpAQCAtMjQsMjIgKzI0LDI2IEBACiAgKiBBIHV0aWxpdHkgY2xhc3MgdG8gaGVscCBsb2cgdGltaW5ncyBzcGxpdHMgdGhyb3VnaG91dCBhIG1ldGhvZCBjYWxsLgogICogVHlwaWNhbCB1c2FnZSBpczoKICAqCi0gKiBUaW1pbmdMb2dnZXIgdGltaW5ncyA9IG5ldyBUaW1pbmdMb2dnZXIoVEFHLCAibWV0aG9kQSIpOwotICogLi4uIGRvIHNvbWUgd29yayBBIC4uLgotICogdGltaW5ncy5hZGRTcGxpdCgid29yayBBIik7Ci0gKiAuLi4gZG8gc29tZSB3b3JrIEIgLi4uCi0gKiB0aW1pbmdzLmFkZFNwbGl0KCJ3b3JrIEIiKTsKLSAqIC4uLiBkbyBzb21lIHdvcmsgQyAuLi4KLSAqIHRpbWluZ3MuYWRkU3BsaXQoIndvcmsgQyIpOwotICogdGltaW5ncy5kdW1wVG9Mb2coKTsKKyAqIDxwcmU+CisgKiAgICAgVGltaW5nTG9nZ2VyIHRpbWluZ3MgPSBuZXcgVGltaW5nTG9nZ2VyKFRBRywgIm1ldGhvZEEiKTsKKyAqICAgICAvLyAuLi4gZG8gc29tZSB3b3JrIEEgLi4uCisgKiAgICAgdGltaW5ncy5hZGRTcGxpdCgid29yayBBIik7CisgKiAgICAgLy8gLi4uIGRvIHNvbWUgd29yayBCIC4uLgorICogICAgIHRpbWluZ3MuYWRkU3BsaXQoIndvcmsgQiIpOworICogICAgIC8vIC4uLiBkbyBzb21lIHdvcmsgQyAuLi4KKyAqICAgICB0aW1pbmdzLmFkZFNwbGl0KCJ3b3JrIEMiKTsKKyAqICAgICB0aW1pbmdzLmR1bXBUb0xvZygpOworICogPC9wcmU+CiAgKgotICogVGhlIGR1bXBUb0xvZyBjYWxsIHdvdWxkIGFkZCB0aGUgZm9sbG93aW5nIHRvIHRoZSBsb2c6CisgKiA8cD5UaGUgZHVtcFRvTG9nIGNhbGwgd291bGQgYWRkIHRoZSBmb2xsb3dpbmcgdG8gdGhlIGxvZzo8L3A+CiAgKgotICogRC9UQUcgICAgICggMzQ1OSk6IG1ldGhvZEE6IGJlZ2luCi0gKiBEL1RBRyAgICAgKCAzNDU5KTogbWV0aG9kQTogICAgICA5IG1zLCB3b3JrIEEKLSAqIEQvVEFHICAgICAoIDM0NTkpOiBtZXRob2RBOiAgICAgIDEgbXMsIHdvcmsgQgotICogRC9UQUcgICAgICggMzQ1OSk6IG1ldGhvZEE6ICAgICAgNiBtcywgd29yayBDCi0gKiBEL1RBRyAgICAgKCAzNDU5KTogbWV0aG9kQTogZW5kLCAxNiBtcworICogPHByZT4KKyAqICAgICBEL1RBRyAgICAgKCAzNDU5KTogbWV0aG9kQTogYmVnaW4KKyAqICAgICBEL1RBRyAgICAgKCAzNDU5KTogbWV0aG9kQTogICAgICA5IG1zLCB3b3JrIEEKKyAqICAgICBEL1RBRyAgICAgKCAzNDU5KTogbWV0aG9kQTogICAgICAxIG1zLCB3b3JrIEIKKyAqICAgICBEL1RBRyAgICAgKCAzNDU5KTogbWV0aG9kQTogICAgICA2IG1zLCB3b3JrIEMKKyAqICAgICBEL1RBRyAgICAgKCAzNDU5KTogbWV0aG9kQTogZW5kLCAxNiBtcworICogPC9wcmU+CiAgKi8KIHB1YmxpYyBjbGFzcyBUaW1pbmdMb2dnZXIgewogCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC92aWV3L0FjdGlvbk1vZGUuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvQWN0aW9uTW9kZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJmYWZhOTgKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2phdmEvYW5kcm9pZC92aWV3L0FjdGlvbk1vZGUuamF2YQpAQCAtMCwwICsxLDE4MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC52aWV3OworCisKKy8qKgorICogUmVwcmVzZW50cyBhIGNvbnRleHR1YWwgbW9kZSBvZiB0aGUgdXNlciBpbnRlcmZhY2UuIEFjdGlvbiBtb2RlcyBjYW4gYmUgdXNlZCBmb3IKKyAqIG1vZGFsIGludGVyYWN0aW9ucyB3aXRoIGNvbnRlbnQgYW5kIHJlcGxhY2UgcGFydHMgb2YgdGhlIG5vcm1hbCBVSSB1bnRpbCBmaW5pc2hlZC4KKyAqIEV4YW1wbGVzIG9mIGdvb2QgYWN0aW9uIG1vZGVzIGluY2x1ZGUgc2VsZWN0aW9uIG1vZGVzLCBzZWFyY2gsIGNvbnRlbnQgZWRpdGluZywgZXRjLgorICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWN0aW9uTW9kZSB7CisgICAgLyoqCisgICAgICogU2V0IHRoZSB0aXRsZSBvZiB0aGUgYWN0aW9uIG1vZGUuIFRoaXMgbWV0aG9kIHdpbGwgaGF2ZSBubyB2aXNpYmxlIGVmZmVjdCBpZgorICAgICAqIGEgY3VzdG9tIHZpZXcgaGFzIGJlZW4gc2V0LgorICAgICAqCisgICAgICogQHBhcmFtIHRpdGxlIFRpdGxlIHN0cmluZyB0byBzZXQKKyAgICAgKgorICAgICAqIEBzZWUgI3NldFRpdGxlKGludCkKKyAgICAgKiBAc2VlICNzZXRDdXN0b21WaWV3KFZpZXcpCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IHZvaWQgc2V0VGl0bGUoQ2hhclNlcXVlbmNlIHRpdGxlKTsKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgdGl0bGUgb2YgdGhlIGFjdGlvbiBtb2RlLiBUaGlzIG1ldGhvZCB3aWxsIGhhdmUgbm8gdmlzaWJsZSBlZmZlY3QgaWYKKyAgICAgKiBhIGN1c3RvbSB2aWV3IGhhcyBiZWVuIHNldC4KKyAgICAgKgorICAgICAqIEBwYXJhbSByZXNJZCBSZXNvdXJjZSBJRCBvZiBhIHN0cmluZyB0byBzZXQgYXMgdGhlIHRpdGxlCisgICAgICoKKyAgICAgKiBAc2VlICNzZXRUaXRsZShDaGFyU2VxdWVuY2UpCisgICAgICogQHNlZSAjc2V0Q3VzdG9tVmlldyhWaWV3KQorICAgICAqLworICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHNldFRpdGxlKGludCByZXNJZCk7CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIHN1YnRpdGxlIG9mIHRoZSBhY3Rpb24gbW9kZS4gVGhpcyBtZXRob2Qgd2lsbCBoYXZlIG5vIHZpc2libGUgZWZmZWN0IGlmCisgICAgICogYSBjdXN0b20gdmlldyBoYXMgYmVlbiBzZXQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gc3VidGl0bGUgU3VidGl0bGUgc3RyaW5nIHRvIHNldAorICAgICAqCisgICAgICogQHNlZSAjc2V0U3VidGl0bGUoaW50KQorICAgICAqIEBzZWUgI3NldEN1c3RvbVZpZXcoVmlldykKKyAgICAgKi8KKyAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZXRTdWJ0aXRsZShDaGFyU2VxdWVuY2Ugc3VidGl0bGUpOworCisgICAgLyoqCisgICAgICogU2V0IHRoZSBzdWJ0aXRsZSBvZiB0aGUgYWN0aW9uIG1vZGUuIFRoaXMgbWV0aG9kIHdpbGwgaGF2ZSBubyB2aXNpYmxlIGVmZmVjdCBpZgorICAgICAqIGEgY3VzdG9tIHZpZXcgaGFzIGJlZW4gc2V0LgorICAgICAqCisgICAgICogQHBhcmFtIHJlc0lkIFJlc291cmNlIElEIG9mIGEgc3RyaW5nIHRvIHNldCBhcyB0aGUgc3VidGl0bGUKKyAgICAgKgorICAgICAqIEBzZWUgI3NldFN1YnRpdGxlKENoYXJTZXF1ZW5jZSkKKyAgICAgKiBAc2VlICNzZXRDdXN0b21WaWV3KFZpZXcpCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IHZvaWQgc2V0U3VidGl0bGUoaW50IHJlc0lkKTsKKworICAgIC8qKgorICAgICAqIFNldCBhIGN1c3RvbSB2aWV3IGZvciB0aGlzIGFjdGlvbiBtb2RlLiBUaGUgY3VzdG9tIHZpZXcgd2lsbCB0YWtlIHRoZSBwbGFjZSBvZgorICAgICAqIHRoZSB0aXRsZSBhbmQgc3VidGl0bGUuIFVzZWZ1bCBmb3IgdGhpbmdzIGxpa2Ugc2VhcmNoIGJveGVzLgorICAgICAqCisgICAgICogQHBhcmFtIHZpZXcgQ3VzdG9tIHZpZXcgdG8gdXNlIGluIHBsYWNlIG9mIHRoZSB0aXRsZS9zdWJ0aXRsZS4KKyAgICAgKgorICAgICAqIEBzZWUgI3NldFRpdGxlKENoYXJTZXF1ZW5jZSkKKyAgICAgKiBAc2VlICNzZXRTdWJ0aXRsZShDaGFyU2VxdWVuY2UpCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IHZvaWQgc2V0Q3VzdG9tVmlldyhWaWV3IHZpZXcpOworCisgICAgLyoqCisgICAgICogSW52YWxpZGF0ZSB0aGUgYWN0aW9uIG1vZGUgYW5kIHJlZnJlc2ggbWVudSBjb250ZW50LiBUaGUgbW9kZSdzCisgICAgICoge0BsaW5rIEFjdGlvbk1vZGUuQ2FsbGJhY2t9IHdpbGwgaGF2ZSBpdHMKKyAgICAgKiB7QGxpbmsgQ2FsbGJhY2sjb25QcmVwYXJlQWN0aW9uTW9kZShBY3Rpb25Nb2RlLCBNZW51KX0gbWV0aG9kIGNhbGxlZC4KKyAgICAgKiBJZiBpdCByZXR1cm5zIHRydWUgdGhlIG1lbnUgd2lsbCBiZSBzY2FubmVkIGZvciB1cGRhdGVkIGNvbnRlbnQgYW5kIGFueSByZWxldmFudCBjaGFuZ2VzCisgICAgICogd2lsbCBiZSByZWZsZWN0ZWQgdG8gdGhlIHVzZXIuCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IHZvaWQgaW52YWxpZGF0ZSgpOworCisgICAgLyoqCisgICAgICogRmluaXNoIGFuZCBjbG9zZSB0aGlzIGFjdGlvbiBtb2RlLiBUaGUgYWN0aW9uIG1vZGUncyB7QGxpbmsgQWN0aW9uTW9kZS5DYWxsYmFja30gd2lsbAorICAgICAqIGhhdmUgaXRzIHtAbGluayBDYWxsYmFjayNvbkRlc3Ryb3lBY3Rpb25Nb2RlKEFjdGlvbk1vZGUpfSBtZXRob2QgY2FsbGVkLgorICAgICAqLworICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIGZpbmlzaCgpOworCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgbWVudSBvZiBhY3Rpb25zIHRoYXQgdGhpcyBhY3Rpb24gbW9kZSBwcmVzZW50cy4KKyAgICAgKiBAcmV0dXJuIFRoZSBhY3Rpb24gbW9kZSdzIG1lbnUuCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IE1lbnUgZ2V0TWVudSgpOworCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgY3VycmVudCB0aXRsZSBvZiB0aGlzIGFjdGlvbiBtb2RlLgorICAgICAqIEByZXR1cm4gVGl0bGUgdGV4dAorICAgICAqLworICAgIHB1YmxpYyBhYnN0cmFjdCBDaGFyU2VxdWVuY2UgZ2V0VGl0bGUoKTsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIGN1cnJlbnQgc3VidGl0bGUgb2YgdGhpcyBhY3Rpb24gbW9kZS4KKyAgICAgKiBAcmV0dXJuIFN1YnRpdGxlIHRleHQKKyAgICAgKi8KKyAgICBwdWJsaWMgYWJzdHJhY3QgQ2hhclNlcXVlbmNlIGdldFN1YnRpdGxlKCk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBjdXJyZW50IGN1c3RvbSB2aWV3IGZvciB0aGlzIGFjdGlvbiBtb2RlLgorICAgICAqIEByZXR1cm4gVGhlIGN1cnJlbnQgY3VzdG9tIHZpZXcKKyAgICAgKi8KKyAgICBwdWJsaWMgYWJzdHJhY3QgVmlldyBnZXRDdXN0b21WaWV3KCk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGEge0BsaW5rIE1lbnVJbmZsYXRlcn0gd2l0aCB0aGUgQWN0aW9uTW9kZSdzIGNvbnRleHQuCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IE1lbnVJbmZsYXRlciBnZXRNZW51SW5mbGF0ZXIoKTsKKworICAgIC8qKgorICAgICAqIENhbGxiYWNrIGludGVyZmFjZSBmb3IgYWN0aW9uIG1vZGVzLiBTdXBwbGllZCB0bworICAgICAqIHtAbGluayBWaWV3I3N0YXJ0QWN0aW9uTW9kZShDYWxsYmFjayl9LCBhIENhbGxiYWNrCisgICAgICogY29uZmlndXJlcyBhbmQgaGFuZGxlcyBldmVudHMgcmFpc2VkIGJ5IGEgdXNlcidzIGludGVyYWN0aW9uIHdpdGggYW4gYWN0aW9uIG1vZGUuCisgICAgICoKKyAgICAgKiA8cD5BbiBhY3Rpb24gbW9kZSdzIGxpZmVjeWNsZSBpcyBhcyBmb2xsb3dzOgorICAgICAqIDx1bD4KKyAgICAgKiA8bGk+e0BsaW5rIENhbGxiYWNrI29uQ3JlYXRlQWN0aW9uTW9kZShBY3Rpb25Nb2RlLCBNZW51KX0gb25jZSBvbiBpbml0aWFsCisgICAgICogY3JlYXRpb248L2xpPgorICAgICAqIDxsaT57QGxpbmsgQ2FsbGJhY2sjb25QcmVwYXJlQWN0aW9uTW9kZShBY3Rpb25Nb2RlLCBNZW51KX0gYWZ0ZXIgY3JlYXRpb24KKyAgICAgKiBhbmQgYW55IHRpbWUgdGhlIHtAbGluayBBY3Rpb25Nb2RlfSBpcyBpbnZhbGlkYXRlZDwvbGk+CisgICAgICogPGxpPntAbGluayBDYWxsYmFjayNvbkFjdGlvbkl0ZW1DbGlja2VkKEFjdGlvbk1vZGUsIE1lbnVJdGVtKX0gYW55IHRpbWUgYQorICAgICAqIGNvbnRleHR1YWwgYWN0aW9uIGJ1dHRvbiBpcyBjbGlja2VkPC9saT4KKyAgICAgKiA8bGk+e0BsaW5rIENhbGxiYWNrI29uRGVzdHJveUFjdGlvbk1vZGUoQWN0aW9uTW9kZSl9IHdoZW4gdGhlIGFjdGlvbiBtb2RlCisgICAgICogaXMgY2xvc2VkPC9saT4KKyAgICAgKiA8L3VsPgorICAgICAqLworICAgIHB1YmxpYyBpbnRlcmZhY2UgQ2FsbGJhY2sgeworICAgICAgICAvKioKKyAgICAgICAgICogQ2FsbGVkIHdoZW4gYWN0aW9uIG1vZGUgaXMgZmlyc3QgY3JlYXRlZC4gVGhlIG1lbnUgc3VwcGxpZWQgd2lsbCBiZSB1c2VkIHRvCisgICAgICAgICAqIGdlbmVyYXRlIGFjdGlvbiBidXR0b25zIGZvciB0aGUgYWN0aW9uIG1vZGUuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBtb2RlIEFjdGlvbk1vZGUgYmVpbmcgY3JlYXRlZAorICAgICAgICAgKiBAcGFyYW0gbWVudSBNZW51IHVzZWQgdG8gcG9wdWxhdGUgYWN0aW9uIGJ1dHRvbnMKKyAgICAgICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBhY3Rpb24gbW9kZSBzaG91bGQgYmUgY3JlYXRlZCwgZmFsc2UgaWYgZW50ZXJpbmcgdGhpcworICAgICAgICAgKiAgICAgICAgICAgICAgbW9kZSBzaG91bGQgYmUgYWJvcnRlZC4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBib29sZWFuIG9uQ3JlYXRlQWN0aW9uTW9kZShBY3Rpb25Nb2RlIG1vZGUsIE1lbnUgbWVudSk7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIENhbGxlZCB0byByZWZyZXNoIGFuIGFjdGlvbiBtb2RlJ3MgYWN0aW9uIG1lbnUgd2hlbmV2ZXIgaXQgaXMgaW52YWxpZGF0ZWQuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBtb2RlIEFjdGlvbk1vZGUgYmVpbmcgcHJlcGFyZWQKKyAgICAgICAgICogQHBhcmFtIG1lbnUgTWVudSB1c2VkIHRvIHBvcHVsYXRlIGFjdGlvbiBidXR0b25zCisgICAgICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgbWVudSBvciBhY3Rpb24gbW9kZSB3YXMgdXBkYXRlZCwgZmFsc2Ugb3RoZXJ3aXNlLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIGJvb2xlYW4gb25QcmVwYXJlQWN0aW9uTW9kZShBY3Rpb25Nb2RlIG1vZGUsIE1lbnUgbWVudSk7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIENhbGxlZCB0byByZXBvcnQgYSB1c2VyIGNsaWNrIG9uIGFuIGFjdGlvbiBidXR0b24uCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBtb2RlIFRoZSBjdXJyZW50IEFjdGlvbk1vZGUKKyAgICAgICAgICogQHBhcmFtIGl0ZW0gVGhlIGl0ZW0gdGhhdCB3YXMgY2xpY2tlZAorICAgICAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhpcyBjYWxsYmFjayBoYW5kbGVkIHRoZSBldmVudCwgZmFsc2UgaWYgdGhlIHN0YW5kYXJkIE1lbnVJdGVtCisgICAgICAgICAqICAgICAgICAgIGludm9jYXRpb24gc2hvdWxkIGNvbnRpbnVlLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIGJvb2xlYW4gb25BY3Rpb25JdGVtQ2xpY2tlZChBY3Rpb25Nb2RlIG1vZGUsIE1lbnVJdGVtIGl0ZW0pOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBDYWxsZWQgd2hlbiBhbiBhY3Rpb24gbW9kZSBpcyBhYm91dCB0byBiZSBleGl0ZWQgYW5kIGRlc3Ryb3llZC4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIG1vZGUgVGhlIGN1cnJlbnQgQWN0aW9uTW9kZSBiZWluZyBkZXN0cm95ZWQKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2b2lkIG9uRGVzdHJveUFjdGlvbk1vZGUoQWN0aW9uTW9kZSBtb2RlKTsKKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9HTEVTMjBDYW52YXMuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvR0xFUzIwQ2FudmFzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTFhNWQ2OQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvR0xFUzIwQ2FudmFzLmphdmEKQEAgLTAsMCArMSw4MjYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQudmlldzsKKworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQ2FudmFzOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQ29sb3JGaWx0ZXI7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5EcmF3RmlsdGVyOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuTWF0cml4OworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUGFpbnQ7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5QYXRoOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUGljdHVyZTsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlBvcnRlckR1ZmY7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5SZWN0OworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUmVjdEY7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5SZWdpb247CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5TaGFkZXI7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5UZW1wb3JhcnlCdWZmZXI7CitpbXBvcnQgYW5kcm9pZC50ZXh0LkdyYXBoaWNzT3BlcmF0aW9uczsKK2ltcG9ydCBhbmRyb2lkLnRleHQuU3Bhbm5hYmxlU3RyaW5nOworaW1wb3J0IGFuZHJvaWQudGV4dC5TcGFubmVkU3RyaW5nOworaW1wb3J0IGFuZHJvaWQudGV4dC5UZXh0VXRpbHM7CisKK2ltcG9ydCBqYXZheC5taWNyb2VkaXRpb24ua2hyb25vcy5vcGVuZ2xlcy5HTDsKKworLyoqCisgKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiBDYW52YXMgb24gdG9wIG9mIE9wZW5HTCBFUyAyLjAuCisgKi8KK2NsYXNzIEdMRVMyMENhbnZhcyBleHRlbmRzIENhbnZhcyB7CisgICAgQFN1cHByZXNzV2FybmluZ3MoeyJGaWVsZENhbkJlTG9jYWwiLCAiVW51c2VkRGVjbGFyYXRpb24ifSkKKyAgICBwcml2YXRlIGZpbmFsIEdMIG1HbDsKKyAgICBwcml2YXRlIGZpbmFsIGJvb2xlYW4gbU9wYXF1ZTsKKyAgICBwcml2YXRlIGludCBtUmVuZGVyZXI7CisgICAgCisgICAgcHJpdmF0ZSBpbnQgbVdpZHRoOworICAgIHByaXZhdGUgaW50IG1IZWlnaHQ7CisgICAgCisgICAgcHJpdmF0ZSBmaW5hbCBmbG9hdFtdIG1Qb2ludCA9IG5ldyBmbG9hdFsyXTsKKyAgICBwcml2YXRlIGZpbmFsIGZsb2F0W10gbUxpbmUgPSBuZXcgZmxvYXRbNF07CisgICAgCisgICAgcHJpdmF0ZSBmaW5hbCBSZWN0IG1DbGlwQm91bmRzID0gbmV3IFJlY3QoKTsKKworICAgIHByaXZhdGUgRHJhd0ZpbHRlciBtRmlsdGVyOworCisgICAgcHJpdmF0ZSBib29sZWFuIG1Db250ZXh0TG9ja2VkOworCisgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisgICAgLy8gSk5JCisgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKyAgICBwcml2YXRlIHN0YXRpYyBuYXRpdmUgYm9vbGVhbiBuSXNBdmFpbGFibGUoKTsKKyAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIHNJc0F2YWlsYWJsZSA9IG5Jc0F2YWlsYWJsZSgpOworCisgICAgc3RhdGljIGJvb2xlYW4gaXNBdmFpbGFibGUoKSB7CisgICAgICAgIHJldHVybiBzSXNBdmFpbGFibGU7CisgICAgfQorCisgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisgICAgLy8gQ29uc3RydWN0b3JzCisgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisgICAgCisgICAgR0xFUzIwQ2FudmFzKEdMIGdsLCBib29sZWFuIHRyYW5zbHVjZW50KSB7CisgICAgICAgIG1HbCA9IGdsOworICAgICAgICBtT3BhcXVlID0gIXRyYW5zbHVjZW50OworCisgICAgICAgIG1SZW5kZXJlciA9IG5DcmVhdGVSZW5kZXJlcigpOworICAgICAgICBpZiAobVJlbmRlcmVyID09IDApIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkNvdWxkIG5vdCBjcmVhdGUgR0xFUzIwQ2FudmFzIHJlbmRlcmVyIik7CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgcHJpdmF0ZSBuYXRpdmUgaW50IG5DcmVhdGVSZW5kZXJlcigpOworCisgICAgLyoqCisgICAgICogVGhpcyBtZXRob2QgPHN0cm9uZz5tdXN0PC9zdHJvbmc+IGJlIGNhbGxlZCBiZWZvcmUgcmVsZWFzaW5nIGEKKyAgICAgKiByZWZlcmVuY2UgdG8gYSBHTEVTMjBDYW52YXMuIFRoaXMgbWV0aG9kIGlzIHJlc3BvbnNpYmxlIGZvciBmcmVlaW5nCisgICAgICogbmF0aXZlIHJlc291cmNlcyBhc3NvY2lhdGVkIHdpdGggdGhlIGhhcmR3YXJlLiBOb3QgaW52b2tpbmcgdGhpcworICAgICAqIG1ldGhvZCBwcm9wZXJseSBjYW4gcmVzdWx0IGluIG1lbW9yeSBsZWFrcy4KKyAgICAgKiAKKyAgICAgKiBAaGlkZQorICAgICAqLworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBkZXN0cm95KCkgeworICAgICAgICBpZiAobVJlbmRlcmVyICE9IDApIHsKKyAgICAgICAgICAgIG5EZXN0cm95UmVuZGVyZXIobVJlbmRlcmVyKTsKKyAgICAgICAgICAgIG1SZW5kZXJlciA9IDA7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIG5hdGl2ZSB2b2lkIG5EZXN0cm95UmVuZGVyZXIoaW50IHJlbmRlcmVyKTsKKworICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworICAgIC8vIENhbnZhcyBtYW5hZ2VtZW50CisgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisgICAgCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gaXNIYXJkd2FyZUFjY2VsZXJhdGVkKCkgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBzZXRCaXRtYXAoQml0bWFwIGJpdG1hcCkgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBpc09wYXF1ZSgpIHsKKyAgICAgICAgcmV0dXJuIG1PcGFxdWU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGludCBnZXRXaWR0aCgpIHsKKyAgICAgICAgcmV0dXJuIG1XaWR0aDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgaW50IGdldEhlaWdodCgpIHsKKyAgICAgICAgcmV0dXJuIG1IZWlnaHQ7CisgICAgfQorCisgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisgICAgLy8gU2V0dXAKKyAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHNldFZpZXdwb3J0KGludCB3aWR0aCwgaW50IGhlaWdodCkgeworICAgICAgICBtV2lkdGggPSB3aWR0aDsKKyAgICAgICAgbUhlaWdodCA9IGhlaWdodDsKKworICAgICAgICBuU2V0Vmlld3BvcnQobVJlbmRlcmVyLCB3aWR0aCwgaGVpZ2h0KTsKKyAgICB9CisgICAgCisgICAgcHJpdmF0ZSBuYXRpdmUgdm9pZCBuU2V0Vmlld3BvcnQoaW50IHJlbmRlcmVyLCBpbnQgd2lkdGgsIGludCBoZWlnaHQpOworCisgICAgdm9pZCBvblByZURyYXcoKSB7CisgICAgICAgIG5QcmVwYXJlKG1SZW5kZXJlcik7CisgICAgfQorICAgIAorICAgIHByaXZhdGUgbmF0aXZlIHZvaWQgblByZXBhcmUoaW50IHJlbmRlcmVyKTsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGFjcXVpcmVDb250ZXh0KCkgeworICAgICAgICBpZiAoIW1Db250ZXh0TG9ja2VkKSB7CisgICAgICAgICAgICBuQWNxdWlyZUNvbnRleHQobVJlbmRlcmVyKTsKKyAgICAgICAgICAgIG1Db250ZXh0TG9ja2VkID0gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbUNvbnRleHRMb2NrZWQ7CisgICAgfQorCisgICAgcHJpdmF0ZSBuYXRpdmUgdm9pZCBuQWNxdWlyZUNvbnRleHQoaW50IHJlbmRlcmVyKTsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHJlbGVhc2VDb250ZXh0KCkgeworICAgICAgICBpZiAobUNvbnRleHRMb2NrZWQpIHsKKyAgICAgICAgICAgIG5SZWxlYXNlQ29udGV4dChtUmVuZGVyZXIpOworICAgICAgICAgICAgbUNvbnRleHRMb2NrZWQgPSBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgbmF0aXZlIHZvaWQgblJlbGVhc2VDb250ZXh0KGludCByZW5kZXJlcik7CisKKyAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyAgICAvLyBDbGlwcGluZworICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gY2xpcFBhdGgoUGF0aCBwYXRoKSB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGNsaXBQYXRoKFBhdGggcGF0aCwgUmVnaW9uLk9wIG9wKSB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGNsaXBSZWN0KGZsb2F0IGxlZnQsIGZsb2F0IHRvcCwgZmxvYXQgcmlnaHQsIGZsb2F0IGJvdHRvbSkgeworICAgICAgICByZXR1cm4gbkNsaXBSZWN0KG1SZW5kZXJlciwgbGVmdCwgdG9wLCByaWdodCwgYm90dG9tLCBSZWdpb24uT3AuSU5URVJTRUNULm5hdGl2ZUludCk7CisgICAgfQorICAgIAorICAgIHByaXZhdGUgbmF0aXZlIGJvb2xlYW4gbkNsaXBSZWN0KGludCByZW5kZXJlciwgZmxvYXQgbGVmdCwgZmxvYXQgdG9wLAorICAgICAgICAgICAgZmxvYXQgcmlnaHQsIGZsb2F0IGJvdHRvbSwgaW50IG9wKTsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGNsaXBSZWN0KGZsb2F0IGxlZnQsIGZsb2F0IHRvcCwgZmxvYXQgcmlnaHQsIGZsb2F0IGJvdHRvbSwgUmVnaW9uLk9wIG9wKSB7CisgICAgICAgIHJldHVybiBuQ2xpcFJlY3QobVJlbmRlcmVyLCBsZWZ0LCB0b3AsIHJpZ2h0LCBib3R0b20sIG9wLm5hdGl2ZUludCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gY2xpcFJlY3QoaW50IGxlZnQsIGludCB0b3AsIGludCByaWdodCwgaW50IGJvdHRvbSkgeworICAgICAgICByZXR1cm4gbkNsaXBSZWN0KG1SZW5kZXJlciwgbGVmdCwgdG9wLCByaWdodCwgYm90dG9tLCBSZWdpb24uT3AuSU5URVJTRUNULm5hdGl2ZUludCk7ICAgICAgICAKKyAgICB9CisgICAgCisgICAgcHJpdmF0ZSBuYXRpdmUgYm9vbGVhbiBuQ2xpcFJlY3QoaW50IHJlbmRlcmVyLCBpbnQgbGVmdCwgaW50IHRvcCwgaW50IHJpZ2h0LCBpbnQgYm90dG9tLCBpbnQgb3ApOworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gY2xpcFJlY3QoUmVjdCByZWN0KSB7CisgICAgICAgIHJldHVybiBuQ2xpcFJlY3QobVJlbmRlcmVyLCByZWN0LmxlZnQsIHJlY3QudG9wLCByZWN0LnJpZ2h0LCByZWN0LmJvdHRvbSwKKyAgICAgICAgICAgICAgICBSZWdpb24uT3AuSU5URVJTRUNULm5hdGl2ZUludCk7ICAgICAgICAKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBjbGlwUmVjdChSZWN0IHJlY3QsIFJlZ2lvbi5PcCBvcCkgeworICAgICAgICByZXR1cm4gbkNsaXBSZWN0KG1SZW5kZXJlciwgcmVjdC5sZWZ0LCByZWN0LnRvcCwgcmVjdC5yaWdodCwgcmVjdC5ib3R0b20sIG9wLm5hdGl2ZUludCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gY2xpcFJlY3QoUmVjdEYgcmVjdCkgeworICAgICAgICByZXR1cm4gbkNsaXBSZWN0KG1SZW5kZXJlciwgcmVjdC5sZWZ0LCByZWN0LnRvcCwgcmVjdC5yaWdodCwgcmVjdC5ib3R0b20sCisgICAgICAgICAgICAgICAgUmVnaW9uLk9wLklOVEVSU0VDVC5uYXRpdmVJbnQpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGNsaXBSZWN0KFJlY3RGIHJlY3QsIFJlZ2lvbi5PcCBvcCkgeworICAgICAgICByZXR1cm4gbkNsaXBSZWN0KG1SZW5kZXJlciwgcmVjdC5sZWZ0LCByZWN0LnRvcCwgcmVjdC5yaWdodCwgcmVjdC5ib3R0b20sIG9wLm5hdGl2ZUludCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gY2xpcFJlZ2lvbihSZWdpb24gcmVnaW9uKSB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGNsaXBSZWdpb24oUmVnaW9uIHJlZ2lvbiwgUmVnaW9uLk9wIG9wKSB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGdldENsaXBCb3VuZHMoUmVjdCBib3VuZHMpIHsKKyAgICAgICAgcmV0dXJuIG5HZXRDbGlwQm91bmRzKG1SZW5kZXJlciwgYm91bmRzKTsKKyAgICB9CisKKyAgICBwcml2YXRlIG5hdGl2ZSBib29sZWFuIG5HZXRDbGlwQm91bmRzKGludCByZW5kZXJlciwgUmVjdCBib3VuZHMpOworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gcXVpY2tSZWplY3QoZmxvYXQgbGVmdCwgZmxvYXQgdG9wLCBmbG9hdCByaWdodCwgZmxvYXQgYm90dG9tLCBFZGdlVHlwZSB0eXBlKSB7CisgICAgICAgIHJldHVybiBuUXVpY2tSZWplY3QobVJlbmRlcmVyLCBsZWZ0LCB0b3AsIHJpZ2h0LCBib3R0b20sIHR5cGUubmF0aXZlSW50KTsKKyAgICB9CisgICAgCisgICAgcHJpdmF0ZSBuYXRpdmUgYm9vbGVhbiBuUXVpY2tSZWplY3QoaW50IHJlbmRlcmVyLCBmbG9hdCBsZWZ0LCBmbG9hdCB0b3AsCisgICAgICAgICAgICBmbG9hdCByaWdodCwgZmxvYXQgYm90dG9tLCBpbnQgZWRnZSk7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBxdWlja1JlamVjdChQYXRoIHBhdGgsIEVkZ2VUeXBlIHR5cGUpIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gcXVpY2tSZWplY3QoUmVjdEYgcmVjdCwgRWRnZVR5cGUgdHlwZSkgeworICAgICAgICByZXR1cm4gcXVpY2tSZWplY3QocmVjdC5sZWZ0LCByZWN0LnRvcCwgcmVjdC5yaWdodCwgcmVjdC5ib3R0b20sIHR5cGUpOworICAgIH0KKworICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworICAgIC8vIFRyYW5zZm9ybWF0aW9ucworICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgdHJhbnNsYXRlKGZsb2F0IGR4LCBmbG9hdCBkeSkgeworICAgICAgICBuVHJhbnNsYXRlKG1SZW5kZXJlciwgZHgsIGR5KTsKKyAgICB9CisgICAgCisgICAgcHJpdmF0ZSBuYXRpdmUgdm9pZCBuVHJhbnNsYXRlKGludCByZW5kZXJlciwgZmxvYXQgZHgsIGZsb2F0IGR5KTsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHNrZXcoZmxvYXQgc3gsIGZsb2F0IHN5KSB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHJvdGF0ZShmbG9hdCBkZWdyZWVzKSB7CisgICAgICAgIG5Sb3RhdGUobVJlbmRlcmVyLCBkZWdyZWVzKTsKKyAgICB9CisgICAgCisgICAgcHJpdmF0ZSBuYXRpdmUgdm9pZCBuUm90YXRlKGludCByZW5kZXJlciwgZmxvYXQgZGVncmVlcyk7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBzY2FsZShmbG9hdCBzeCwgZmxvYXQgc3kpIHsKKyAgICAgICAgblNjYWxlKG1SZW5kZXJlciwgc3gsIHN5KTsKKyAgICB9CisgICAgCisgICAgcHJpdmF0ZSBuYXRpdmUgdm9pZCBuU2NhbGUoaW50IHJlbmRlcmVyLCBmbG9hdCBzeCwgZmxvYXQgc3kpOworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgc2V0TWF0cml4KE1hdHJpeCBtYXRyaXgpIHsKKyAgICAgICAgblNldE1hdHJpeChtUmVuZGVyZXIsIG1hdHJpeC5uYXRpdmVfaW5zdGFuY2UpOworICAgIH0KKyAgICAKKyAgICBwcml2YXRlIG5hdGl2ZSB2b2lkIG5TZXRNYXRyaXgoaW50IHJlbmRlcmVyLCBpbnQgbWF0cml4KTsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGdldE1hdHJpeChNYXRyaXggbWF0cml4KSB7CisgICAgICAgIG5HZXRNYXRyaXgobVJlbmRlcmVyLCBtYXRyaXgubmF0aXZlX2luc3RhbmNlKTsKKyAgICB9CisgICAgCisgICAgcHJpdmF0ZSBuYXRpdmUgdm9pZCBuR2V0TWF0cml4KGludCByZW5kZXJlciwgaW50IG1hdHJpeCk7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBjb25jYXQoTWF0cml4IG1hdHJpeCkgeworICAgICAgICBuQ29uY2F0TWF0cml4KG1SZW5kZXJlciwgbWF0cml4Lm5hdGl2ZV9pbnN0YW5jZSk7CisgICAgfQorICAgIAorICAgIHByaXZhdGUgbmF0aXZlIHZvaWQgbkNvbmNhdE1hdHJpeChpbnQgcmVuZGVyZXIsIGludCBtYXRyaXgpOworICAgIAorICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworICAgIC8vIFN0YXRlIG1hbmFnZW1lbnQKKyAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBpbnQgc2F2ZSgpIHsKKyAgICAgICAgcmV0dXJuIG5TYXZlKG1SZW5kZXJlciwgQ2FudmFzLkNMSVBfU0FWRV9GTEFHIHwgQ2FudmFzLk1BVFJJWF9TQVZFX0ZMQUcpOworICAgIH0KKyAgICAKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgaW50IHNhdmUoaW50IHNhdmVGbGFncykgeworICAgICAgICByZXR1cm4gblNhdmUobVJlbmRlcmVyLCBzYXZlRmxhZ3MpOworICAgIH0KKworICAgIHByaXZhdGUgbmF0aXZlIGludCBuU2F2ZShpbnQgcmVuZGVyZXIsIGludCBmbGFncyk7CisgICAgCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGludCBzYXZlTGF5ZXIoUmVjdEYgYm91bmRzLCBQYWludCBwYWludCwgaW50IHNhdmVGbGFncykgeworICAgICAgICByZXR1cm4gc2F2ZUxheWVyKGJvdW5kcy5sZWZ0LCBib3VuZHMudG9wLCBib3VuZHMucmlnaHQsIGJvdW5kcy5ib3R0b20sIHBhaW50LCBzYXZlRmxhZ3MpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBpbnQgc2F2ZUxheWVyKGZsb2F0IGxlZnQsIGZsb2F0IHRvcCwgZmxvYXQgcmlnaHQsIGZsb2F0IGJvdHRvbSwgUGFpbnQgcGFpbnQsCisgICAgICAgICAgICBpbnQgc2F2ZUZsYWdzKSB7CisgICAgICAgIGludCBuYXRpdmVQYWludCA9IHBhaW50ID09IG51bGwgPyAwIDogcGFpbnQubU5hdGl2ZVBhaW50OworICAgICAgICByZXR1cm4gblNhdmVMYXllcihtUmVuZGVyZXIsIGxlZnQsIHRvcCwgcmlnaHQsIGJvdHRvbSwgbmF0aXZlUGFpbnQsIHNhdmVGbGFncyk7CisgICAgfQorCisgICAgcHJpdmF0ZSBuYXRpdmUgaW50IG5TYXZlTGF5ZXIoaW50IHJlbmRlcmVyLCBmbG9hdCBsZWZ0LCBmbG9hdCB0b3AsIGZsb2F0IHJpZ2h0LCBmbG9hdCBib3R0b20sCisgICAgICAgICAgICBpbnQgcGFpbnQsIGludCBzYXZlRmxhZ3MpOworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGludCBzYXZlTGF5ZXJBbHBoYShSZWN0RiBib3VuZHMsIGludCBhbHBoYSwgaW50IHNhdmVGbGFncykgeworICAgICAgICByZXR1cm4gc2F2ZUxheWVyQWxwaGEoYm91bmRzLmxlZnQsIGJvdW5kcy50b3AsIGJvdW5kcy5yaWdodCwgYm91bmRzLmJvdHRvbSwKKyAgICAgICAgICAgICAgICBhbHBoYSwgc2F2ZUZsYWdzKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgaW50IHNhdmVMYXllckFscGhhKGZsb2F0IGxlZnQsIGZsb2F0IHRvcCwgZmxvYXQgcmlnaHQsIGZsb2F0IGJvdHRvbSwgaW50IGFscGhhLAorICAgICAgICAgICAgaW50IHNhdmVGbGFncykgeworICAgICAgICByZXR1cm4gblNhdmVMYXllckFscGhhKG1SZW5kZXJlciwgbGVmdCwgdG9wLCByaWdodCwgYm90dG9tLCBhbHBoYSwgc2F2ZUZsYWdzKTsKKyAgICB9CisKKyAgICBwcml2YXRlIG5hdGl2ZSBpbnQgblNhdmVMYXllckFscGhhKGludCByZW5kZXJlciwgZmxvYXQgbGVmdCwgZmxvYXQgdG9wLCBmbG9hdCByaWdodCwKKyAgICAgICAgICAgIGZsb2F0IGJvdHRvbSwgaW50IGFscGhhLCBpbnQgc2F2ZUZsYWdzKTsKKyAgICAKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCByZXN0b3JlKCkgeworICAgICAgICBuUmVzdG9yZShtUmVuZGVyZXIpOworICAgIH0KKyAgICAKKyAgICBwcml2YXRlIG5hdGl2ZSB2b2lkIG5SZXN0b3JlKGludCByZW5kZXJlcik7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCByZXN0b3JlVG9Db3VudChpbnQgc2F2ZUNvdW50KSB7CisgICAgICAgIG5SZXN0b3JlVG9Db3VudChtUmVuZGVyZXIsIHNhdmVDb3VudCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBuYXRpdmUgdm9pZCBuUmVzdG9yZVRvQ291bnQoaW50IHJlbmRlcmVyLCBpbnQgc2F2ZUNvdW50KTsKKyAgICAKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgaW50IGdldFNhdmVDb3VudCgpIHsKKyAgICAgICAgcmV0dXJuIG5HZXRTYXZlQ291bnQobVJlbmRlcmVyKTsKKyAgICB9CisgICAgCisgICAgcHJpdmF0ZSBuYXRpdmUgaW50IG5HZXRTYXZlQ291bnQoaW50IHJlbmRlcmVyKTsKKworICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworICAgIC8vIEZpbHRlcmluZworICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgc2V0RHJhd0ZpbHRlcihEcmF3RmlsdGVyIGZpbHRlcikgeworICAgICAgICBtRmlsdGVyID0gZmlsdGVyOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBEcmF3RmlsdGVyIGdldERyYXdGaWx0ZXIoKSB7CisgICAgICAgIHJldHVybiBtRmlsdGVyOworICAgIH0KKworICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworICAgIC8vIERyYXdpbmcKKyAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGRyYXdBcmMoUmVjdEYgb3ZhbCwgZmxvYXQgc3RhcnRBbmdsZSwgZmxvYXQgc3dlZXBBbmdsZSwgYm9vbGVhbiB1c2VDZW50ZXIsCisgICAgICAgICAgICBQYWludCBwYWludCkgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBkcmF3QVJHQihpbnQgYSwgaW50IHIsIGludCBnLCBpbnQgYikgeworICAgICAgICBkcmF3Q29sb3IoKGEgJiAweEZGKSA8PCAyNCB8IChyICYgMHhGRikgPDwgMTYgfCAoZyAmIDB4RkYpIDw8IDggfCAoYiAmIDB4RkYpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBkcmF3UGF0Y2goQml0bWFwIGJpdG1hcCwgYnl0ZVtdIGNodW5rcywgUmVjdEYgZHN0LCBQYWludCBwYWludCkgeworICAgICAgICAvLyBTaGFkZXJzIGFyZSBpZ25vcmVkIHdoZW4gZHJhd2luZyBwYXRjaGVzCisgICAgICAgIGJvb2xlYW4gaGFzQ29sb3JGaWx0ZXIgPSBwYWludCAhPSBudWxsICYmIHNldHVwQ29sb3JGaWx0ZXIocGFpbnQpOworICAgICAgICBmaW5hbCBpbnQgbmF0aXZlUGFpbnQgPSBwYWludCA9PSBudWxsID8gMCA6IHBhaW50Lm1OYXRpdmVQYWludDsKKyAgICAgICAgbkRyYXdQYXRjaChtUmVuZGVyZXIsIGJpdG1hcC5tTmF0aXZlQml0bWFwLCBjaHVua3MsIGRzdC5sZWZ0LCBkc3QudG9wLAorICAgICAgICAgICAgICAgIGRzdC5yaWdodCwgZHN0LmJvdHRvbSwgbmF0aXZlUGFpbnQpOworICAgICAgICBpZiAoaGFzQ29sb3JGaWx0ZXIpIG5SZXNldE1vZGlmaWVycyhtUmVuZGVyZXIpOworICAgIH0KKworICAgIHByaXZhdGUgbmF0aXZlIHZvaWQgbkRyYXdQYXRjaChpbnQgcmVuZGVyZXIsIGludCBiaXRtYXAsIGJ5dGVbXSBjaHVua3MsIGZsb2F0IGxlZnQsIGZsb2F0IHRvcCwKKyAgICAgICAgICAgIGZsb2F0IHJpZ2h0LCBmbG9hdCBib3R0b20sIGludCBwYWludCk7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBkcmF3Qml0bWFwKEJpdG1hcCBiaXRtYXAsIGZsb2F0IGxlZnQsIGZsb2F0IHRvcCwgUGFpbnQgcGFpbnQpIHsKKyAgICAgICAgLy8gU2hhZGVycyBhcmUgaWdub3JlZCB3aGVuIGRyYXdpbmcgYml0bWFwcworICAgICAgICBib29sZWFuIGhhc0NvbG9yRmlsdGVyID0gcGFpbnQgIT0gbnVsbCAmJiBzZXR1cENvbG9yRmlsdGVyKHBhaW50KTsKKyAgICAgICAgZmluYWwgaW50IG5hdGl2ZVBhaW50ID0gcGFpbnQgPT0gbnVsbCA/IDAgOiBwYWludC5tTmF0aXZlUGFpbnQ7CisgICAgICAgIG5EcmF3Qml0bWFwKG1SZW5kZXJlciwgYml0bWFwLm1OYXRpdmVCaXRtYXAsIGxlZnQsIHRvcCwgbmF0aXZlUGFpbnQpOworICAgICAgICBpZiAoaGFzQ29sb3JGaWx0ZXIpIG5SZXNldE1vZGlmaWVycyhtUmVuZGVyZXIpOworICAgIH0KKworICAgIHByaXZhdGUgbmF0aXZlIHZvaWQgbkRyYXdCaXRtYXAoaW50IHJlbmRlcmVyLCBpbnQgYml0bWFwLCBmbG9hdCBsZWZ0LCBmbG9hdCB0b3AsIGludCBwYWludCk7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBkcmF3Qml0bWFwKEJpdG1hcCBiaXRtYXAsIE1hdHJpeCBtYXRyaXgsIFBhaW50IHBhaW50KSB7CisgICAgICAgIC8vIFNoYWRlcnMgYXJlIGlnbm9yZWQgd2hlbiBkcmF3aW5nIGJpdG1hcHMKKyAgICAgICAgYm9vbGVhbiBoYXNDb2xvckZpbHRlciA9IHBhaW50ICE9IG51bGwgJiYgc2V0dXBDb2xvckZpbHRlcihwYWludCk7CisgICAgICAgIGZpbmFsIGludCBuYXRpdmVQYWludCA9IHBhaW50ID09IG51bGwgPyAwIDogcGFpbnQubU5hdGl2ZVBhaW50OworICAgICAgICBuRHJhd0JpdG1hcChtUmVuZGVyZXIsIGJpdG1hcC5tTmF0aXZlQml0bWFwLCBtYXRyaXgubmF0aXZlX2luc3RhbmNlLCBuYXRpdmVQYWludCk7CisgICAgICAgIGlmIChoYXNDb2xvckZpbHRlcikgblJlc2V0TW9kaWZpZXJzKG1SZW5kZXJlcik7CisgICAgfQorCisgICAgcHJpdmF0ZSBuYXRpdmUgdm9pZCBuRHJhd0JpdG1hcChpbnQgcmVuZGVyZXIsIGludCBiaXRtYXAsIGludCBtYXRyaXgsIGludCBwYWludCk7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBkcmF3Qml0bWFwKEJpdG1hcCBiaXRtYXAsIFJlY3Qgc3JjLCBSZWN0IGRzdCwgUGFpbnQgcGFpbnQpIHsKKyAgICAgICAgLy8gU2hhZGVycyBhcmUgaWdub3JlZCB3aGVuIGRyYXdpbmcgYml0bWFwcworICAgICAgICBib29sZWFuIGhhc0NvbG9yRmlsdGVyID0gcGFpbnQgIT0gbnVsbCAmJiBzZXR1cENvbG9yRmlsdGVyKHBhaW50KTsKKyAgICAgICAgZmluYWwgaW50IG5hdGl2ZVBhaW50ID0gcGFpbnQgPT0gbnVsbCA/IDAgOiBwYWludC5tTmF0aXZlUGFpbnQ7CisKKyAgICAgICAgaW50IGxlZnQsIHRvcCwgcmlnaHQsIGJvdHRvbTsKKyAgICAgICAgaWYgKHNyYyA9PSBudWxsKSB7CisgICAgICAgICAgICBsZWZ0ID0gdG9wID0gMDsKKyAgICAgICAgICAgIHJpZ2h0ID0gYml0bWFwLmdldFdpZHRoKCk7CisgICAgICAgICAgICBib3R0b20gPSBiaXRtYXAuZ2V0SGVpZ2h0KCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBsZWZ0ID0gc3JjLmxlZnQ7CisgICAgICAgICAgICByaWdodCA9IHNyYy5yaWdodDsKKyAgICAgICAgICAgIHRvcCA9IHNyYy50b3A7CisgICAgICAgICAgICBib3R0b20gPSBzcmMuYm90dG9tOworICAgICAgICB9CisKKyAgICAgICAgbkRyYXdCaXRtYXAobVJlbmRlcmVyLCBiaXRtYXAubU5hdGl2ZUJpdG1hcCwgbGVmdCwgdG9wLCByaWdodCwgYm90dG9tLAorICAgICAgICAgICAgICAgIGRzdC5sZWZ0LCBkc3QudG9wLCBkc3QucmlnaHQsIGRzdC5ib3R0b20sIG5hdGl2ZVBhaW50KTsKKyAgICAgICAgaWYgKGhhc0NvbG9yRmlsdGVyKSBuUmVzZXRNb2RpZmllcnMobVJlbmRlcmVyKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBkcmF3Qml0bWFwKEJpdG1hcCBiaXRtYXAsIFJlY3Qgc3JjLCBSZWN0RiBkc3QsIFBhaW50IHBhaW50KSB7CisgICAgICAgIC8vIFNoYWRlcnMgYXJlIGlnbm9yZWQgd2hlbiBkcmF3aW5nIGJpdG1hcHMKKyAgICAgICAgYm9vbGVhbiBoYXNDb2xvckZpbHRlciA9IHBhaW50ICE9IG51bGwgJiYgc2V0dXBDb2xvckZpbHRlcihwYWludCk7CisgICAgICAgIGZpbmFsIGludCBuYXRpdmVQYWludCA9IHBhaW50ID09IG51bGwgPyAwIDogcGFpbnQubU5hdGl2ZVBhaW50OworICAgICAgICBuRHJhd0JpdG1hcChtUmVuZGVyZXIsIGJpdG1hcC5tTmF0aXZlQml0bWFwLCBzcmMubGVmdCwgc3JjLnRvcCwgc3JjLnJpZ2h0LCBzcmMuYm90dG9tLAorICAgICAgICAgICAgICAgIGRzdC5sZWZ0LCBkc3QudG9wLCBkc3QucmlnaHQsIGRzdC5ib3R0b20sIG5hdGl2ZVBhaW50KTsKKyAgICAgICAgaWYgKGhhc0NvbG9yRmlsdGVyKSBuUmVzZXRNb2RpZmllcnMobVJlbmRlcmVyKTsKKyAgICB9CisKKyAgICBwcml2YXRlIG5hdGl2ZSB2b2lkIG5EcmF3Qml0bWFwKGludCByZW5kZXJlciwgaW50IGJpdG1hcCwKKyAgICAgICAgICAgIGZsb2F0IHNyY0xlZnQsIGZsb2F0IHNyY1RvcCwgZmxvYXQgc3JjUmlnaHQsIGZsb2F0IHNyY0JvdHRvbSwKKyAgICAgICAgICAgIGZsb2F0IGxlZnQsIGZsb2F0IHRvcCwgZmxvYXQgcmlnaHQsIGZsb2F0IGJvdHRvbSwgaW50IHBhaW50KTsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGRyYXdCaXRtYXAoaW50W10gY29sb3JzLCBpbnQgb2Zmc2V0LCBpbnQgc3RyaWRlLCBmbG9hdCB4LCBmbG9hdCB5LAorICAgICAgICAgICAgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBib29sZWFuIGhhc0FscGhhLCBQYWludCBwYWludCkgeworICAgICAgICAvLyBTaGFkZXJzIGFyZSBpZ25vcmVkIHdoZW4gZHJhd2luZyBiaXRtYXBzCisgICAgICAgIGJvb2xlYW4gaGFzQ29sb3JGaWx0ZXIgPSBwYWludCAhPSBudWxsICYmIHNldHVwQ29sb3JGaWx0ZXIocGFpbnQpOworICAgICAgICBmaW5hbCBCaXRtYXAuQ29uZmlnIGNvbmZpZyA9IGhhc0FscGhhID8gQml0bWFwLkNvbmZpZy5BUkdCXzg4ODggOiBCaXRtYXAuQ29uZmlnLlJHQl81NjU7CisgICAgICAgIGZpbmFsIEJpdG1hcCBiID0gQml0bWFwLmNyZWF0ZUJpdG1hcChjb2xvcnMsIG9mZnNldCwgc3RyaWRlLCB3aWR0aCwgaGVpZ2h0LCBjb25maWcpOworICAgICAgICBmaW5hbCBpbnQgbmF0aXZlUGFpbnQgPSBwYWludCA9PSBudWxsID8gMCA6IHBhaW50Lm1OYXRpdmVQYWludDsKKyAgICAgICAgbkRyYXdCaXRtYXAobVJlbmRlcmVyLCBiLm1OYXRpdmVCaXRtYXAsIHgsIHksIG5hdGl2ZVBhaW50KTsKKyAgICAgICAgYi5yZWN5Y2xlKCk7CisgICAgICAgIGlmIChoYXNDb2xvckZpbHRlcikgblJlc2V0TW9kaWZpZXJzKG1SZW5kZXJlcik7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgZHJhd0JpdG1hcChpbnRbXSBjb2xvcnMsIGludCBvZmZzZXQsIGludCBzdHJpZGUsIGludCB4LCBpbnQgeSwKKyAgICAgICAgICAgIGludCB3aWR0aCwgaW50IGhlaWdodCwgYm9vbGVhbiBoYXNBbHBoYSwgUGFpbnQgcGFpbnQpIHsKKyAgICAgICAgLy8gU2hhZGVycyBhcmUgaWdub3JlZCB3aGVuIGRyYXdpbmcgYml0bWFwcworICAgICAgICBkcmF3Qml0bWFwKGNvbG9ycywgb2Zmc2V0LCBzdHJpZGUsIChmbG9hdCkgeCwgKGZsb2F0KSB5LCB3aWR0aCwgaGVpZ2h0LCBoYXNBbHBoYSwgcGFpbnQpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGRyYXdCaXRtYXBNZXNoKEJpdG1hcCBiaXRtYXAsIGludCBtZXNoV2lkdGgsIGludCBtZXNoSGVpZ2h0LCBmbG9hdFtdIHZlcnRzLAorICAgICAgICAgICAgaW50IHZlcnRPZmZzZXQsIGludFtdIGNvbG9ycywgaW50IGNvbG9yT2Zmc2V0LCBQYWludCBwYWludCkgeworICAgICAgICAvLyBUT0RPOiBJbXBsZW1lbnQKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBkcmF3Q2lyY2xlKGZsb2F0IGN4LCBmbG9hdCBjeSwgZmxvYXQgcmFkaXVzLCBQYWludCBwYWludCkgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBkcmF3Q29sb3IoaW50IGNvbG9yKSB7CisgICAgICAgIGRyYXdDb2xvcihjb2xvciwgUG9ydGVyRHVmZi5Nb2RlLlNSQ19PVkVSKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBkcmF3Q29sb3IoaW50IGNvbG9yLCBQb3J0ZXJEdWZmLk1vZGUgbW9kZSkgeworICAgICAgICBuRHJhd0NvbG9yKG1SZW5kZXJlciwgY29sb3IsIG1vZGUubmF0aXZlSW50KTsKKyAgICB9CisgICAgCisgICAgcHJpdmF0ZSBuYXRpdmUgdm9pZCBuRHJhd0NvbG9yKGludCByZW5kZXJlciwgaW50IGNvbG9yLCBpbnQgbW9kZSk7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBkcmF3TGluZShmbG9hdCBzdGFydFgsIGZsb2F0IHN0YXJ0WSwgZmxvYXQgc3RvcFgsIGZsb2F0IHN0b3BZLCBQYWludCBwYWludCkgeworICAgICAgICBtTGluZVswXSA9IHN0YXJ0WDsKKyAgICAgICAgbUxpbmVbMV0gPSBzdGFydFk7CisgICAgICAgIG1MaW5lWzJdID0gc3RvcFg7CisgICAgICAgIG1MaW5lWzNdID0gc3RvcFk7CisgICAgICAgIGRyYXdMaW5lcyhtTGluZSwgMCwgMSwgcGFpbnQpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGRyYXdMaW5lcyhmbG9hdFtdIHB0cywgaW50IG9mZnNldCwgaW50IGNvdW50LCBQYWludCBwYWludCkgeworICAgICAgICAvLyBUT0RPOiBJbXBsZW1lbnQKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBkcmF3TGluZXMoZmxvYXRbXSBwdHMsIFBhaW50IHBhaW50KSB7CisgICAgICAgIGRyYXdMaW5lcyhwdHMsIDAsIHB0cy5sZW5ndGggLyA0LCBwYWludCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgZHJhd092YWwoUmVjdEYgb3ZhbCwgUGFpbnQgcGFpbnQpIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgZHJhd1BhaW50KFBhaW50IHBhaW50KSB7CisgICAgICAgIGZpbmFsIFJlY3QgciA9IG1DbGlwQm91bmRzOworICAgICAgICBuR2V0Q2xpcEJvdW5kcyhtUmVuZGVyZXIsIHIpOworICAgICAgICBkcmF3UmVjdChyLmxlZnQsIHIudG9wLCByLnJpZ2h0LCByLmJvdHRvbSwgcGFpbnQpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGRyYXdQYXRoKFBhdGggcGF0aCwgUGFpbnQgcGFpbnQpIHsKKyAgICAgICAgYm9vbGVhbiBoYXNNb2RpZmllciA9IHNldHVwTW9kaWZpZXJzKHBhaW50KTsKKyAgICAgICAgaWYgKHBhdGguaXNTaW1wbGVQYXRoKSB7CisgICAgICAgICAgICBpZiAocGF0aC5yZWN0cyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgbkRyYXdSZWN0cyhtUmVuZGVyZXIsIHBhdGgucmVjdHMubU5hdGl2ZVJlZ2lvbiwgcGFpbnQubU5hdGl2ZVBhaW50KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG5EcmF3UGF0aChtUmVuZGVyZXIsIHBhdGgubU5hdGl2ZVBhdGgsIHBhaW50Lm1OYXRpdmVQYWludCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGhhc01vZGlmaWVyKSBuUmVzZXRNb2RpZmllcnMobVJlbmRlcmVyKTsKKyAgICB9CisKKyAgICBwcml2YXRlIG5hdGl2ZSB2b2lkIG5EcmF3UGF0aChpbnQgcmVuZGVyZXIsIGludCBwYXRoLCBpbnQgcGFpbnQpOworICAgIHByaXZhdGUgbmF0aXZlIHZvaWQgbkRyYXdSZWN0cyhpbnQgcmVuZGVyZXIsIGludCByZWdpb24sIGludCBwYWludCk7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBkcmF3UGljdHVyZShQaWN0dXJlIHBpY3R1cmUpIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgZHJhd1BpY3R1cmUoUGljdHVyZSBwaWN0dXJlLCBSZWN0IGRzdCkgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBkcmF3UGljdHVyZShQaWN0dXJlIHBpY3R1cmUsIFJlY3RGIGRzdCkgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBkcmF3UG9pbnQoZmxvYXQgeCwgZmxvYXQgeSwgUGFpbnQgcGFpbnQpIHsKKyAgICAgICAgbVBvaW50WzBdID0geDsKKyAgICAgICAgbVBvaW50WzFdID0geTsKKyAgICAgICAgZHJhd1BvaW50cyhtUG9pbnQsIDAsIDEsIHBhaW50KTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBkcmF3UG9pbnRzKGZsb2F0W10gcHRzLCBpbnQgb2Zmc2V0LCBpbnQgY291bnQsIFBhaW50IHBhaW50KSB7CisgICAgICAgIC8vIFRPRE86IEltcGxlbWVudAorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGRyYXdQb2ludHMoZmxvYXRbXSBwdHMsIFBhaW50IHBhaW50KSB7CisgICAgICAgIGRyYXdQb2ludHMocHRzLCAwLCBwdHMubGVuZ3RoIC8gMiwgcGFpbnQpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGRyYXdQb3NUZXh0KGNoYXJbXSB0ZXh0LCBpbnQgaW5kZXgsIGludCBjb3VudCwgZmxvYXRbXSBwb3MsIFBhaW50IHBhaW50KSB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGRyYXdQb3NUZXh0KFN0cmluZyB0ZXh0LCBmbG9hdFtdIHBvcywgUGFpbnQgcGFpbnQpIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgZHJhd1JlY3QoZmxvYXQgbGVmdCwgZmxvYXQgdG9wLCBmbG9hdCByaWdodCwgZmxvYXQgYm90dG9tLCBQYWludCBwYWludCkgeworICAgICAgICBib29sZWFuIGhhc01vZGlmaWVyID0gc2V0dXBNb2RpZmllcnMocGFpbnQpOworICAgICAgICBuRHJhd1JlY3QobVJlbmRlcmVyLCBsZWZ0LCB0b3AsIHJpZ2h0LCBib3R0b20sIHBhaW50Lm1OYXRpdmVQYWludCk7CisgICAgICAgIGlmIChoYXNNb2RpZmllcikgblJlc2V0TW9kaWZpZXJzKG1SZW5kZXJlcik7CisgICAgfQorCisgICAgcHJpdmF0ZSBuYXRpdmUgdm9pZCBuRHJhd1JlY3QoaW50IHJlbmRlcmVyLCBmbG9hdCBsZWZ0LCBmbG9hdCB0b3AsIGZsb2F0IHJpZ2h0LCBmbG9hdCBib3R0b20sCisgICAgICAgICAgICBpbnQgcGFpbnQpOworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgZHJhd1JlY3QoUmVjdCByLCBQYWludCBwYWludCkgeworICAgICAgICBkcmF3UmVjdChyLmxlZnQsIHIudG9wLCByLnJpZ2h0LCByLmJvdHRvbSwgcGFpbnQpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGRyYXdSZWN0KFJlY3RGIHIsIFBhaW50IHBhaW50KSB7CisgICAgICAgIGRyYXdSZWN0KHIubGVmdCwgci50b3AsIHIucmlnaHQsIHIuYm90dG9tLCBwYWludCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgZHJhd1JHQihpbnQgciwgaW50IGcsIGludCBiKSB7CisgICAgICAgIGRyYXdDb2xvcigweEZGMDAwMDAwIHwgKHIgJiAweEZGKSA8PCAxNiB8IChnICYgMHhGRikgPDwgOCB8IChiICYgMHhGRikpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGRyYXdSb3VuZFJlY3QoUmVjdEYgcmVjdCwgZmxvYXQgcngsIGZsb2F0IHJ5LCBQYWludCBwYWludCkgeworICAgICAgICAvLyBUT0RPOiBJbXBsZW1lbnQKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBkcmF3VGV4dChjaGFyW10gdGV4dCwgaW50IGluZGV4LCBpbnQgY291bnQsIGZsb2F0IHgsIGZsb2F0IHksIFBhaW50IHBhaW50KSB7CisgICAgICAgIGlmICgoaW5kZXggfCBjb3VudCB8IChpbmRleCArIGNvdW50KSB8ICh0ZXh0Lmxlbmd0aCAtIGluZGV4IC0gY291bnQpKSA8IDApIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKworICAgICAgICBib29sZWFuIGhhc01vZGlmaWVyID0gc2V0dXBNb2RpZmllcnMocGFpbnQpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgbkRyYXdUZXh0KG1SZW5kZXJlciwgdGV4dCwgaW5kZXgsIGNvdW50LCB4LCB5LCBwYWludC5tQmlkaUZsYWdzLCBwYWludC5tTmF0aXZlUGFpbnQpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgaWYgKGhhc01vZGlmaWVyKSBuUmVzZXRNb2RpZmllcnMobVJlbmRlcmVyKTsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICBwcml2YXRlIG5hdGl2ZSB2b2lkIG5EcmF3VGV4dChpbnQgcmVuZGVyZXIsIGNoYXJbXSB0ZXh0LCBpbnQgaW5kZXgsIGludCBjb3VudCwgZmxvYXQgeCwgZmxvYXQgeSwKKyAgICAgICAgICAgIGludCBiaWRpRmxhZ3MsIGludCBwYWludCk7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBkcmF3VGV4dChDaGFyU2VxdWVuY2UgdGV4dCwgaW50IHN0YXJ0LCBpbnQgZW5kLCBmbG9hdCB4LCBmbG9hdCB5LCBQYWludCBwYWludCkgeworICAgICAgICBib29sZWFuIGhhc01vZGlmaWVyID0gc2V0dXBNb2RpZmllcnMocGFpbnQpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgaWYgKHRleHQgaW5zdGFuY2VvZiBTdHJpbmcgfHwgdGV4dCBpbnN0YW5jZW9mIFNwYW5uZWRTdHJpbmcgfHwKKyAgICAgICAgICAgICAgICAgICAgdGV4dCBpbnN0YW5jZW9mIFNwYW5uYWJsZVN0cmluZykgeworICAgICAgICAgICAgICAgIG5EcmF3VGV4dChtUmVuZGVyZXIsIHRleHQudG9TdHJpbmcoKSwgc3RhcnQsIGVuZCwgeCwgeSwgcGFpbnQubUJpZGlGbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgIHBhaW50Lm1OYXRpdmVQYWludCk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHRleHQgaW5zdGFuY2VvZiBHcmFwaGljc09wZXJhdGlvbnMpIHsKKyAgICAgICAgICAgICAgICAoKEdyYXBoaWNzT3BlcmF0aW9ucykgdGV4dCkuZHJhd1RleHQodGhpcywgc3RhcnQsIGVuZCwgeCwgeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhaW50KTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgY2hhcltdIGJ1ZiA9IFRlbXBvcmFyeUJ1ZmZlci5vYnRhaW4oZW5kIC0gc3RhcnQpOworICAgICAgICAgICAgICAgIFRleHRVdGlscy5nZXRDaGFycyh0ZXh0LCBzdGFydCwgZW5kLCBidWYsIDApOworICAgICAgICAgICAgICAgIG5EcmF3VGV4dChtUmVuZGVyZXIsIGJ1ZiwgMCwgZW5kIC0gc3RhcnQsIHgsIHksIHBhaW50Lm1CaWRpRmxhZ3MsIHBhaW50Lm1OYXRpdmVQYWludCk7CisgICAgICAgICAgICAgICAgVGVtcG9yYXJ5QnVmZmVyLnJlY3ljbGUoYnVmKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIGlmIChoYXNNb2RpZmllcikgblJlc2V0TW9kaWZpZXJzKG1SZW5kZXJlcik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBkcmF3VGV4dChTdHJpbmcgdGV4dCwgaW50IHN0YXJ0LCBpbnQgZW5kLCBmbG9hdCB4LCBmbG9hdCB5LCBQYWludCBwYWludCkgeworICAgICAgICBpZiAoKHN0YXJ0IHwgZW5kIHwgKGVuZCAtIHN0YXJ0KSB8ICh0ZXh0Lmxlbmd0aCgpIC0gZW5kKSkgPCAwKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbigpOworICAgICAgICB9CisKKyAgICAgICAgYm9vbGVhbiBoYXNNb2RpZmllciA9IHNldHVwTW9kaWZpZXJzKHBhaW50KTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG5EcmF3VGV4dChtUmVuZGVyZXIsIHRleHQsIHN0YXJ0LCBlbmQsIHgsIHksIHBhaW50Lm1CaWRpRmxhZ3MsIHBhaW50Lm1OYXRpdmVQYWludCk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBpZiAoaGFzTW9kaWZpZXIpIG5SZXNldE1vZGlmaWVycyhtUmVuZGVyZXIpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBuYXRpdmUgdm9pZCBuRHJhd1RleHQoaW50IHJlbmRlcmVyLCBTdHJpbmcgdGV4dCwgaW50IHN0YXJ0LCBpbnQgZW5kLCBmbG9hdCB4LCBmbG9hdCB5LAorICAgICAgICAgICAgaW50IGJpZGlGbGFncywgaW50IHBhaW50KTsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGRyYXdUZXh0KFN0cmluZyB0ZXh0LCBmbG9hdCB4LCBmbG9hdCB5LCBQYWludCBwYWludCkgeworICAgICAgICBib29sZWFuIGhhc01vZGlmaWVyID0gc2V0dXBNb2RpZmllcnMocGFpbnQpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgbkRyYXdUZXh0KG1SZW5kZXJlciwgdGV4dCwgMCwgdGV4dC5sZW5ndGgoKSwgeCwgeSwgcGFpbnQubUJpZGlGbGFncywKKyAgICAgICAgICAgICAgICAgICAgcGFpbnQubU5hdGl2ZVBhaW50KTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIGlmIChoYXNNb2RpZmllcikgblJlc2V0TW9kaWZpZXJzKG1SZW5kZXJlcik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBkcmF3VGV4dE9uUGF0aChjaGFyW10gdGV4dCwgaW50IGluZGV4LCBpbnQgY291bnQsIFBhdGggcGF0aCwgZmxvYXQgaE9mZnNldCwKKyAgICAgICAgICAgIGZsb2F0IHZPZmZzZXQsIFBhaW50IHBhaW50KSB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGRyYXdUZXh0T25QYXRoKFN0cmluZyB0ZXh0LCBQYXRoIHBhdGgsIGZsb2F0IGhPZmZzZXQsIGZsb2F0IHZPZmZzZXQsIFBhaW50IHBhaW50KSB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGRyYXdUZXh0UnVuKGNoYXJbXSB0ZXh0LCBpbnQgaW5kZXgsIGludCBjb3VudCwgaW50IGNvbnRleHRJbmRleCwgaW50IGNvbnRleHRDb3VudCwKKyAgICAgICAgICAgIGZsb2F0IHgsIGZsb2F0IHksIGludCBkaXIsIFBhaW50IHBhaW50KSB7CisgICAgICAgIGlmICgoaW5kZXggfCBjb3VudCB8IHRleHQubGVuZ3RoIC0gaW5kZXggLSBjb3VudCkgPCAwKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbigpOworICAgICAgICB9CisgICAgICAgIGlmIChkaXIgIT0gRElSRUNUSU9OX0xUUiAmJiBkaXIgIT0gRElSRUNUSU9OX1JUTCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVW5rbm93biBkaXJlY3Rpb246ICIgKyBkaXIpOworICAgICAgICB9CisKKyAgICAgICAgYm9vbGVhbiBoYXNNb2RpZmllciA9IHNldHVwTW9kaWZpZXJzKHBhaW50KTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG5EcmF3VGV4dFJ1bihtUmVuZGVyZXIsIHRleHQsIGluZGV4LCBjb3VudCwgY29udGV4dEluZGV4LCBjb250ZXh0Q291bnQsIHgsIHksIGRpciwKKyAgICAgICAgICAgICAgICAgICAgcGFpbnQubU5hdGl2ZVBhaW50KTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIGlmIChoYXNNb2RpZmllcikgblJlc2V0TW9kaWZpZXJzKG1SZW5kZXJlcik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIG5hdGl2ZSB2b2lkIG5EcmF3VGV4dFJ1bihpbnQgcmVuZGVyZXIsIGNoYXJbXSB0ZXh0LCBpbnQgaW5kZXgsIGludCBjb3VudCwKKyAgICAgICAgICAgIGludCBjb250ZXh0SW5kZXgsIGludCBjb250ZXh0Q291bnQsIGZsb2F0IHgsIGZsb2F0IHksIGludCBkaXIsIGludCBuYXRpdmVQYWludCk7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBkcmF3VGV4dFJ1bihDaGFyU2VxdWVuY2UgdGV4dCwgaW50IHN0YXJ0LCBpbnQgZW5kLCBpbnQgY29udGV4dFN0YXJ0LCBpbnQgY29udGV4dEVuZCwKKyAgICAgICAgICAgIGZsb2F0IHgsIGZsb2F0IHksIGludCBkaXIsIFBhaW50IHBhaW50KSB7CisgICAgICAgIGlmICgoc3RhcnQgfCBlbmQgfCBlbmQgLSBzdGFydCB8IHRleHQubGVuZ3RoKCkgLSBlbmQpIDwgMCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24oKTsKKyAgICAgICAgfQorCisgICAgICAgIGJvb2xlYW4gaGFzTW9kaWZpZXIgPSBzZXR1cE1vZGlmaWVycyhwYWludCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgZmxhZ3MgPSBkaXIgPT0gMCA/IDAgOiAxOworICAgICAgICAgICAgaWYgKHRleHQgaW5zdGFuY2VvZiBTdHJpbmcgfHwgdGV4dCBpbnN0YW5jZW9mIFNwYW5uZWRTdHJpbmcgfHwKKyAgICAgICAgICAgICAgICAgICAgdGV4dCBpbnN0YW5jZW9mIFNwYW5uYWJsZVN0cmluZykgeworICAgICAgICAgICAgICAgIG5EcmF3VGV4dFJ1bihtUmVuZGVyZXIsIHRleHQudG9TdHJpbmcoKSwgc3RhcnQsIGVuZCwgY29udGV4dFN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dEVuZCwgeCwgeSwgZmxhZ3MsIHBhaW50Lm1OYXRpdmVQYWludCk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHRleHQgaW5zdGFuY2VvZiBHcmFwaGljc09wZXJhdGlvbnMpIHsKKyAgICAgICAgICAgICAgICAoKEdyYXBoaWNzT3BlcmF0aW9ucykgdGV4dCkuZHJhd1RleHRSdW4odGhpcywgc3RhcnQsIGVuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHRTdGFydCwgY29udGV4dEVuZCwgeCwgeSwgZmxhZ3MsIHBhaW50KTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaW50IGNvbnRleHRMZW4gPSBjb250ZXh0RW5kIC0gY29udGV4dFN0YXJ0OworICAgICAgICAgICAgICAgIGludCBsZW4gPSBlbmQgLSBzdGFydDsKKyAgICAgICAgICAgICAgICBjaGFyW10gYnVmID0gVGVtcG9yYXJ5QnVmZmVyLm9idGFpbihjb250ZXh0TGVuKTsKKyAgICAgICAgICAgICAgICBUZXh0VXRpbHMuZ2V0Q2hhcnModGV4dCwgY29udGV4dFN0YXJ0LCBjb250ZXh0RW5kLCBidWYsIDApOworICAgICAgICAgICAgICAgIG5EcmF3VGV4dFJ1bihtUmVuZGVyZXIsIGJ1Ziwgc3RhcnQgLSBjb250ZXh0U3RhcnQsIGxlbiwgMCwgY29udGV4dExlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHgsIHksIGZsYWdzLCBwYWludC5tTmF0aXZlUGFpbnQpOworICAgICAgICAgICAgICAgIFRlbXBvcmFyeUJ1ZmZlci5yZWN5Y2xlKGJ1Zik7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBpZiAoaGFzTW9kaWZpZXIpIG5SZXNldE1vZGlmaWVycyhtUmVuZGVyZXIpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBuYXRpdmUgdm9pZCBuRHJhd1RleHRSdW4oaW50IHJlbmRlcmVyLCBTdHJpbmcgdGV4dCwgaW50IHN0YXJ0LCBpbnQgZW5kLAorICAgICAgICAgICAgaW50IGNvbnRleHRTdGFydCwgaW50IGNvbnRleHRFbmQsIGZsb2F0IHgsIGZsb2F0IHksIGludCBmbGFncywgaW50IG5hdGl2ZVBhaW50KTsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGRyYXdWZXJ0aWNlcyhWZXJ0ZXhNb2RlIG1vZGUsIGludCB2ZXJ0ZXhDb3VudCwgZmxvYXRbXSB2ZXJ0cywgaW50IHZlcnRPZmZzZXQsCisgICAgICAgICAgICBmbG9hdFtdIHRleHMsIGludCB0ZXhPZmZzZXQsIGludFtdIGNvbG9ycywgaW50IGNvbG9yT2Zmc2V0LCBzaG9ydFtdIGluZGljZXMsCisgICAgICAgICAgICBpbnQgaW5kZXhPZmZzZXQsIGludCBpbmRleENvdW50LCBQYWludCBwYWludCkgeworICAgICAgICAvLyBUT0RPOiBJbXBsZW1lbnQKKyAgICB9CisKKyAgICBwcml2YXRlIGJvb2xlYW4gc2V0dXBNb2RpZmllcnMoUGFpbnQgcGFpbnQpIHsKKyAgICAgICAgYm9vbGVhbiBoYXNNb2RpZmllciA9IGZhbHNlOworCisgICAgICAgIGlmIChwYWludC5oYXNTaGFkb3cpIHsKKyAgICAgICAgICAgIG5TZXR1cFNoYWRvdyhtUmVuZGVyZXIsIHBhaW50LnNoYWRvd1JhZGl1cywgcGFpbnQuc2hhZG93RHgsIHBhaW50LnNoYWRvd0R5LAorICAgICAgICAgICAgICAgICAgICBwYWludC5zaGFkb3dDb2xvcik7CisgICAgICAgICAgICBoYXNNb2RpZmllciA9IHRydWU7CisgICAgICAgIH0KKworICAgICAgICBmaW5hbCBTaGFkZXIgc2hhZGVyID0gcGFpbnQuZ2V0U2hhZGVyKCk7CisgICAgICAgIGlmIChzaGFkZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgblNldHVwU2hhZGVyKG1SZW5kZXJlciwgc2hhZGVyLm5hdGl2ZV9zaGFkZXIpOworICAgICAgICAgICAgaGFzTW9kaWZpZXIgPSB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgZmluYWwgQ29sb3JGaWx0ZXIgZmlsdGVyID0gcGFpbnQuZ2V0Q29sb3JGaWx0ZXIoKTsKKyAgICAgICAgaWYgKGZpbHRlciAhPSBudWxsKSB7CisgICAgICAgICAgICBuU2V0dXBDb2xvckZpbHRlcihtUmVuZGVyZXIsIGZpbHRlci5uYXRpdmVDb2xvckZpbHRlcik7CisgICAgICAgICAgICBoYXNNb2RpZmllciA9IHRydWU7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gaGFzTW9kaWZpZXI7CisgICAgfQorCisgICAgcHJpdmF0ZSBib29sZWFuIHNldHVwQ29sb3JGaWx0ZXIoUGFpbnQgcGFpbnQpIHsKKyAgICAgICAgZmluYWwgQ29sb3JGaWx0ZXIgZmlsdGVyID0gcGFpbnQuZ2V0Q29sb3JGaWx0ZXIoKTsKKyAgICAgICAgaWYgKGZpbHRlciAhPSBudWxsKSB7CisgICAgICAgICAgICBuU2V0dXBDb2xvckZpbHRlcihtUmVuZGVyZXIsIGZpbHRlci5uYXRpdmVDb2xvckZpbHRlcik7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7ICAgICAgICAKKyAgICB9CisgICAgCisgICAgcHJpdmF0ZSBuYXRpdmUgdm9pZCBuU2V0dXBTaGFkZXIoaW50IHJlbmRlcmVyLCBpbnQgc2hhZGVyKTsKKyAgICBwcml2YXRlIG5hdGl2ZSB2b2lkIG5TZXR1cENvbG9yRmlsdGVyKGludCByZW5kZXJlciwgaW50IGNvbG9yRmlsdGVyKTsKKyAgICBwcml2YXRlIG5hdGl2ZSB2b2lkIG5TZXR1cFNoYWRvdyhpbnQgcmVuZGVyZXIsIGZsb2F0IHJhZGl1cywgZmxvYXQgZHgsIGZsb2F0IGR5LCBpbnQgY29sb3IpOworCisgICAgcHJpdmF0ZSBuYXRpdmUgdm9pZCBuUmVzZXRNb2RpZmllcnMoaW50IHJlbmRlcmVyKTsKK30KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvSGFyZHdhcmVSZW5kZXJlci5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9IYXJkd2FyZVJlbmRlcmVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWQ4NTA3NgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvSGFyZHdhcmVSZW5kZXJlci5qYXZhCkBAIC0wLDAgKzEsNTgwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIGFuZHJvaWQudmlldzsKKworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQ2FudmFzOworaW1wb3J0IGFuZHJvaWQub3MuU3lzdGVtQ2xvY2s7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKKworaW1wb3J0IGphdmF4Lm1pY3JvZWRpdGlvbi5raHJvbm9zLmVnbC5FR0wxMDsKK2ltcG9ydCBqYXZheC5taWNyb2VkaXRpb24ua2hyb25vcy5lZ2wuRUdMMTE7CitpbXBvcnQgamF2YXgubWljcm9lZGl0aW9uLmtocm9ub3MuZWdsLkVHTENvbmZpZzsKK2ltcG9ydCBqYXZheC5taWNyb2VkaXRpb24ua2hyb25vcy5lZ2wuRUdMQ29udGV4dDsKK2ltcG9ydCBqYXZheC5taWNyb2VkaXRpb24ua2hyb25vcy5lZ2wuRUdMRGlzcGxheTsKK2ltcG9ydCBqYXZheC5taWNyb2VkaXRpb24ua2hyb25vcy5lZ2wuRUdMU3VyZmFjZTsKK2ltcG9ydCBqYXZheC5taWNyb2VkaXRpb24ua2hyb25vcy5vcGVuZ2xlcy5HTDsKKworLyoqCisgKiBJbnRlcmZhY2UgZm9yIHJlbmRlcmluZyBhIFZpZXdSb290IHVzaW5nIGhhcmR3YXJlIGFjY2VsZXJhdGlvbi4KKyAqIAorICogQGhpZGUKKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIEhhcmR3YXJlUmVuZGVyZXIgeworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMT0dfVEFHID0gIkhhcmR3YXJlUmVuZGVyZXIiOworCisgICAgLyoqCisgICAgICogQSBwcm9jZXNzIGNhbiBzZXQgdGhpcyBmbGFnIHRvIGZhbHNlIHRvIHByZXZlbnQgdGhlIHVzZSBvZiBoYXJkd2FyZQorICAgICAqIHJlbmRlcmluZy4KKyAgICAgKiAKKyAgICAgKiBAaGlkZQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBzUmVuZGVyZXJEaXNhYmxlZCA9IGZhbHNlOworCisgICAgcHJpdmF0ZSBib29sZWFuIG1FbmFibGVkOworICAgIHByaXZhdGUgYm9vbGVhbiBtUmVxdWVzdGVkID0gdHJ1ZTsKKworICAgIC8qKgorICAgICAqIEluZGljYXRlcyB0aGF0IHRoZSBjdXJyZW50IHByb2Nlc3MgY2Fubm90IHVzZSBoYXJkd2FyZSByZW5kZXJpbmcuCisgICAgICogCisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgZGlzYWJsZSgpIHsKKyAgICAgICAgc1JlbmRlcmVyRGlzYWJsZWQgPSB0cnVlOworICAgIH0KKworICAgIC8qKgorICAgICAqIEluZGljYXRlcyB3aGV0aGVyIGhhcmR3YXJlIGFjY2VsZXJhdGlvbiBpcyBhdmFpbGFibGUgdW5kZXIgYW55IGZvcm0gZm9yCisgICAgICogdGhlIHZpZXcgaGllcmFyY2h5LgorICAgICAqIAorICAgICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgdmlldyBoaWVyYXJjaHkgY2FuIHBvdGVudGlhbGx5IGJlIGhhcmR3YXJlIGFjY2VsZXJhdGVkLAorICAgICAqICAgICAgICAgZmFsc2Ugb3RoZXJ3aXNlCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzQXZhaWxhYmxlKCkgeworICAgICAgICByZXR1cm4gR0xFUzIwQ2FudmFzLmlzQXZhaWxhYmxlKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogRGVzdHJveXMgdGhlIGhhcmR3YXJlIHJlbmRlcmluZyBjb250ZXh0LgorICAgICAqIAorICAgICAqIEBwYXJhbSBmdWxsIElmIHRydWUsIGRlc3Ryb3lzIGFsbCBhc3NvY2lhdGVkIHJlc291cmNlcy4KKyAgICAgKi8KKyAgICBhYnN0cmFjdCB2b2lkIGRlc3Ryb3koYm9vbGVhbiBmdWxsKTsKKworICAgIC8qKgorICAgICAqIEluaXRpYWxpemVzIHRoZSBoYXJkd2FyZSByZW5kZXJlciBmb3IgdGhlIHNwZWNpZmllZCBzdXJmYWNlLgorICAgICAqIAorICAgICAqIEBwYXJhbSBob2xkZXIgVGhlIGhvbGRlciBmb3IgdGhlIHN1cmZhY2UgdG8gaGFyZHdhcmUgYWNjZWxlcmF0ZS4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIFRydWUgaWYgdGhlIGluaXRpYWxpemF0aW9uIHdhcyBzdWNjZXNzZnVsLCBmYWxzZSBvdGhlcndpc2UuCisgICAgICovCisgICAgYWJzdHJhY3QgYm9vbGVhbiBpbml0aWFsaXplKFN1cmZhY2VIb2xkZXIgaG9sZGVyKTsKKworICAgIC8qKgorICAgICAqIFNldHVwIHRoZSBoYXJkd2FyZSByZW5kZXJlciBmb3IgZHJhd2luZy4gVGhpcyBpcyBjYWxsZWQgZm9yIGV2ZXJ5CisgICAgICogZnJhbWUgdG8gZHJhdy4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gd2lkdGggV2lkdGggb2YgdGhlIGRyYXdpbmcgc3VyZmFjZS4KKyAgICAgKiBAcGFyYW0gaGVpZ2h0IEhlaWdodCBvZiB0aGUgZHJhd2luZyBzdXJmYWNlLgorICAgICAqLworICAgIGFic3RyYWN0IHZvaWQgc2V0dXAoaW50IHdpZHRoLCBpbnQgaGVpZ2h0KTsKKworICAgIC8qKgorICAgICAqIERyYXdzIHRoZSBzcGVjaWZpZWQgdmlldy4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gdmlldyBUaGUgdmlldyB0byBkcmF3LgorICAgICAqIEBwYXJhbSBhdHRhY2hJbmZvIEF0dGFjaEluZm8gdGllZCB0byB0aGUgc3BlY2lmaWVkIHZpZXcuCisgICAgICovCisgICAgYWJzdHJhY3Qgdm9pZCBkcmF3KFZpZXcgdmlldywgVmlldy5BdHRhY2hJbmZvIGF0dGFjaEluZm8sIGludCB5T2Zmc2V0KTsKKworICAgIC8qKgorICAgICAqIEluaXRpYWxpemVzIHRoZSBoYXJkd2FyZSByZW5kZXJlciBmb3IgdGhlIHNwZWNpZmllZCBzdXJmYWNlIGFuZCBzZXR1cCB0aGUKKyAgICAgKiByZW5kZXJlciBmb3IgZHJhd2luZywgaWYgbmVlZGVkLiBUaGlzIGlzIGludm9rZWQgd2hlbiB0aGUgVmlld1Jvb3QgaGFzCisgICAgICogcG90ZW50aWFsbHkgbG9zdCB0aGUgaGFyZHdhcmUgcmVuZGVyZXIuIFRoZSBoYXJkd2FyZSByZW5kZXJlciBzaG91bGQgYmUKKyAgICAgKiByZWluaXRpYWxpemVkIGFuZCBzZXR1cCB3aGVuIHRoZSByZW5kZXIge0BsaW5rICNpc1JlcXVlc3RlZCgpfSBhbmQKKyAgICAgKiB7QGxpbmsgI2lzRW5hYmxlZCgpfS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gd2lkdGggVGhlIHdpZHRoIG9mIHRoZSBkcmF3aW5nIHN1cmZhY2UuCisgICAgICogQHBhcmFtIGhlaWdodCBUaGUgaGVpZ2h0IG9mIHRoZSBkcmF3aW5nIHN1cmZhY2UuCisgICAgICogQHBhcmFtIGF0dGFjaEluZm8gVGhlIAorICAgICAqIEBwYXJhbSBob2xkZXIKKyAgICAgKi8KKyAgICB2b2lkIGluaXRpYWxpemVJZk5lZWRlZChpbnQgd2lkdGgsIGludCBoZWlnaHQsIFZpZXcuQXR0YWNoSW5mbyBhdHRhY2hJbmZvLAorICAgICAgICAgICAgU3VyZmFjZUhvbGRlciBob2xkZXIpIHsKKyAgICAgICAgaWYgKGlzUmVxdWVzdGVkKCkpIHsKKyAgICAgICAgICAgIC8vIFdlIGxvc3QgdGhlIGdsIGNvbnRleHQsIHNvIHJlY3JlYXRlIGl0LgorICAgICAgICAgICAgaWYgKCFpc0VuYWJsZWQoKSkgeworICAgICAgICAgICAgICAgIGlmIChpbml0aWFsaXplKGhvbGRlcikpIHsKKyAgICAgICAgICAgICAgICAgICAgc2V0dXAod2lkdGgsIGhlaWdodCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9ICAgICAgICAKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgaGFyZHdhcmUgcmVuZGVyZXIgdXNpbmcgT3BlbkdMLgorICAgICAqIAorICAgICAqIEBwYXJhbSBnbFZlcnNpb24gVGhlIHZlcnNpb24gb2YgT3BlbkdMIHRvIHVzZSAoMSBmb3IgT3BlbkdMIDEsIDExIGZvciBPcGVuR0wgMS4xLCBldGMuKQorICAgICAqIEBwYXJhbSB0cmFuc2x1Y2VudCBUcnVlIGlmIHRoZSBzdXJmYWNlIGlzIHRyYW5zbHVjZW50LCBmYWxzZSBvdGhlcndpc2UKKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIEEgaGFyZHdhcmUgcmVuZGVyZXIgYmFja2VkIGJ5IE9wZW5HTC4KKyAgICAgKi8KKyAgICBzdGF0aWMgSGFyZHdhcmVSZW5kZXJlciBjcmVhdGVHbFJlbmRlcmVyKGludCBnbFZlcnNpb24sIGJvb2xlYW4gdHJhbnNsdWNlbnQpIHsKKyAgICAgICAgc3dpdGNoIChnbFZlcnNpb24pIHsKKyAgICAgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgICAgICByZXR1cm4gR2wyMFJlbmRlcmVyLmNyZWF0ZSh0cmFuc2x1Y2VudCk7CisgICAgICAgIH0KKyAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVW5rbm93biBHTCB2ZXJzaW9uOiAiICsgZ2xWZXJzaW9uKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJbmRpY2F0ZXMgd2hldGhlciBoYXJkd2FyZSBhY2NlbGVyYXRpb24gaXMgY3VycmVudGx5IGVuYWJsZWQuCisgICAgICogCisgICAgICogQHJldHVybiBUcnVlIGlmIGhhcmR3YXJlIGFjY2VsZXJhdGlvbiBpcyBpbiB1c2UsIGZhbHNlIG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICBib29sZWFuIGlzRW5hYmxlZCgpIHsKKyAgICAgICAgcmV0dXJuIG1FbmFibGVkOworICAgIH0KKworICAgIC8qKgorICAgICAqIEluZGljYXRlcyB3aGV0aGVyIGhhcmR3YXJlIGFjY2VsZXJhdGlvbiBpcyBjdXJyZW50bHkgZW5hYmxlZC4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gZW5hYmxlZCBUcnVlIGlmIHRoZSBoYXJkd2FyZSByZW5kZXJlciBpcyBpbiB1c2UsIGZhbHNlIG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICB2b2lkIHNldEVuYWJsZWQoYm9vbGVhbiBlbmFibGVkKSB7CisgICAgICAgIG1FbmFibGVkID0gZW5hYmxlZDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJbmRpY2F0ZXMgd2hldGhlciBoYXJkd2FyZSBhY2NlbGVyYXRpb24gaXMgY3VycmVudGx5IHJlcXVlc3QgYnV0IG5vdAorICAgICAqIG5lY2Vzc2FyaWx5IGVuYWJsZWQgeWV0LgorICAgICAqIAorICAgICAqIEByZXR1cm4gVHJ1ZSBpZiByZXF1ZXN0ZWQsIGZhbHNlIG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICBib29sZWFuIGlzUmVxdWVzdGVkKCkgeworICAgICAgICByZXR1cm4gbVJlcXVlc3RlZDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJbmRpY2F0ZXMgd2hldGhlciBoYXJkd2FyZSBhY2NlbGVyYXRpb24gaXMgY3VycmVudGx5IHJlcXVlc3QgYnV0IG5vdAorICAgICAqIG5lY2Vzc2FyaWx5IGVuYWJsZWQgeWV0LgorICAgICAqIAorICAgICAqIEByZXR1cm4gVHJ1ZSB0byByZXF1ZXN0IGhhcmR3YXJlIGFjY2VsZXJhdGlvbiwgZmFsc2Ugb3RoZXJ3aXNlLgorICAgICAqLworICAgIHZvaWQgc2V0UmVxdWVzdGVkKGJvb2xlYW4gcmVxdWVzdGVkKSB7CisgICAgICAgIG1SZXF1ZXN0ZWQgPSByZXF1ZXN0ZWQ7CisgICAgfQorCisgICAgQFN1cHByZXNzV2FybmluZ3MoeyJkZXByZWNhdGlvbiJ9KQorICAgIHN0YXRpYyBhYnN0cmFjdCBjbGFzcyBHbFJlbmRlcmVyIGV4dGVuZHMgSGFyZHdhcmVSZW5kZXJlciB7CisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBFR0xfQ09OVEVYVF9DTElFTlRfVkVSU0lPTiA9IDB4MzA5ODsKKworICAgICAgICBzdGF0aWMgRUdMQ29udGV4dCBzRWdsQ29udGV4dDsKKyAgICAgICAgc3RhdGljIEVHTDEwIHNFZ2w7CisgICAgICAgIHN0YXRpYyBFR0xEaXNwbGF5IHNFZ2xEaXNwbGF5OworICAgICAgICBzdGF0aWMgRUdMQ29uZmlnIHNFZ2xDb25maWc7CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgVGhyZWFkIHNFZ2xUaHJlYWQ7ICAgICAgICAKKworICAgICAgICBFR0xTdXJmYWNlIG1FZ2xTdXJmYWNlOworICAgICAgICAKKyAgICAgICAgR0wgbUdsOworICAgICAgICBHTEVTMjBDYW52YXMgbUNhbnZhczsKKworICAgICAgICBmaW5hbCBpbnQgbUdsVmVyc2lvbjsKKyAgICAgICAgZmluYWwgYm9vbGVhbiBtVHJhbnNsdWNlbnQ7CisKKyAgICAgICAgcHJpdmF0ZSBib29sZWFuIG1EZXN0cm95ZWQ7CisKKyAgICAgICAgR2xSZW5kZXJlcihpbnQgZ2xWZXJzaW9uLCBib29sZWFuIHRyYW5zbHVjZW50KSB7CisgICAgICAgICAgICBtR2xWZXJzaW9uID0gZ2xWZXJzaW9uOworICAgICAgICAgICAgbVRyYW5zbHVjZW50ID0gdHJhbnNsdWNlbnQ7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogQ2hlY2tzIGZvciBPcGVuR0wgZXJyb3JzLiBJZiBhbiBlcnJvciBoYXMgb2NjdXJlZCwge0BsaW5rICNkZXN0cm95KGJvb2xlYW4pfQorICAgICAgICAgKiBpcyBpbnZva2VkIGFuZCB0aGUgcmVxdWVzdGVkIGZsYWcgaXMgdHVybmVkIG9mZi4gVGhlIGVycm9yIGNvZGUgaXMKKyAgICAgICAgICogYWxzbyBsb2dnZWQgYXMgYSB3YXJuaW5nLgorICAgICAgICAgKi8KKyAgICAgICAgdm9pZCBjaGVja0Vycm9ycygpIHsKKyAgICAgICAgICAgIGlmIChpc0VuYWJsZWQoKSkgeworICAgICAgICAgICAgICAgIGludCBlcnJvciA9IHNFZ2wuZWdsR2V0RXJyb3IoKTsKKyAgICAgICAgICAgICAgICBpZiAoZXJyb3IgIT0gRUdMMTAuRUdMX1NVQ0NFU1MpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gc29tZXRoaW5nIGJhZCBoYXMgaGFwcGVuZWQgcmV2ZXJ0IHRvCisgICAgICAgICAgICAgICAgICAgIC8vIG5vcm1hbCByZW5kZXJpbmcuCisgICAgICAgICAgICAgICAgICAgIGRlc3Ryb3kodHJ1ZSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChlcnJvciAhPSBFR0wxMS5FR0xfQ09OVEVYVF9MT1NUKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyB3ZSdsbCB0cnkgYWdhaW4gaWYgaXQgd2FzIGNvbnRleHQgbG9zdAorICAgICAgICAgICAgICAgICAgICAgICAgc2V0UmVxdWVzdGVkKGZhbHNlKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBMb2cudyhMT0dfVEFHLCAiT3BlbkdMIGVycm9yOiAiICsgZXJyb3IpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIGJvb2xlYW4gaW5pdGlhbGl6ZShTdXJmYWNlSG9sZGVyIGhvbGRlcikgeworICAgICAgICAgICAgaWYgKGlzUmVxdWVzdGVkKCkgJiYgIWlzRW5hYmxlZCgpKSB7CisgICAgICAgICAgICAgICAgaW5pdGlhbGl6ZUVnbCgpOworICAgICAgICAgICAgICAgIG1HbCA9IGNyZWF0ZUVnbFN1cmZhY2UoaG9sZGVyKTsKKyAgICAgICAgICAgICAgICBtRGVzdHJveWVkID0gZmFsc2U7CisKKyAgICAgICAgICAgICAgICBpZiAobUdsICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgaW50IGVyciA9IHNFZ2wuZWdsR2V0RXJyb3IoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGVyciAhPSBFR0wxMC5FR0xfU1VDQ0VTUykgeworICAgICAgICAgICAgICAgICAgICAgICAgZGVzdHJveSh0cnVlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNldFJlcXVlc3RlZChmYWxzZSk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobUNhbnZhcyA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUNhbnZhcyA9IGNyZWF0ZUNhbnZhcygpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1DYW52YXMgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldEVuYWJsZWQodHJ1ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvZy53KExPR19UQUcsICJIYXJkd2FyZSBhY2NlbGVyYXRlZCBDYW52YXMgY291bGQgbm90IGJlIGNyZWF0ZWQiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBtQ2FudmFzICE9IG51bGw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgYWJzdHJhY3QgR0xFUzIwQ2FudmFzIGNyZWF0ZUNhbnZhcygpOworCisgICAgICAgIHZvaWQgaW5pdGlhbGl6ZUVnbCgpIHsKKyAgICAgICAgICAgIGlmIChzRWdsQ29udGV4dCAhPSBudWxsKSByZXR1cm47CisKKyAgICAgICAgICAgIHNFZ2xUaHJlYWQgPSBUaHJlYWQuY3VycmVudFRocmVhZCgpOworICAgICAgICAgICAgc0VnbCA9IChFR0wxMCkgRUdMQ29udGV4dC5nZXRFR0woKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgLy8gR2V0IHRvIHRoZSBkZWZhdWx0IGRpc3BsYXkuCisgICAgICAgICAgICBzRWdsRGlzcGxheSA9IHNFZ2wuZWdsR2V0RGlzcGxheShFR0wxMC5FR0xfREVGQVVMVF9ESVNQTEFZKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgaWYgKHNFZ2xEaXNwbGF5ID09IEVHTDEwLkVHTF9OT19ESVNQTEFZKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oImVnbEdldERpc3BsYXkgZmFpbGVkIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAKKyAgICAgICAgICAgIC8vIFdlIGNhbiBub3cgaW5pdGlhbGl6ZSBFR0wgZm9yIHRoYXQgZGlzcGxheQorICAgICAgICAgICAgaW50W10gdmVyc2lvbiA9IG5ldyBpbnRbMl07CisgICAgICAgICAgICBpZiAoIXNFZ2wuZWdsSW5pdGlhbGl6ZShzRWdsRGlzcGxheSwgdmVyc2lvbikpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiZWdsSW5pdGlhbGl6ZSBmYWlsZWQiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNFZ2xDb25maWcgPSBnZXRDb25maWdDaG9vc2VyKG1HbFZlcnNpb24pLmNob29zZUNvbmZpZyhzRWdsLCBzRWdsRGlzcGxheSk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAqIENyZWF0ZSBhbiBFR0wgY29udGV4dC4gV2Ugd2FudCB0byBkbyB0aGlzIGFzIHJhcmVseSBhcyB3ZSBjYW4sIGJlY2F1c2UgYW4KKyAgICAgICAgICAgICogRUdMIGNvbnRleHQgaXMgYSBzb21ld2hhdCBoZWF2eSBvYmplY3QuCisgICAgICAgICAgICAqLworICAgICAgICAgICAgc0VnbENvbnRleHQgPSBjcmVhdGVDb250ZXh0KHNFZ2wsIHNFZ2xEaXNwbGF5LCBzRWdsQ29uZmlnKTsKKyAgICAgICAgfQorCisgICAgICAgIEdMIGNyZWF0ZUVnbFN1cmZhY2UoU3VyZmFjZUhvbGRlciBob2xkZXIpIHsKKyAgICAgICAgICAgIC8vIENoZWNrIHByZWNvbmRpdGlvbnMuCisgICAgICAgICAgICBpZiAoc0VnbCA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oImVnbCBub3QgaW5pdGlhbGl6ZWQiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChzRWdsRGlzcGxheSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oImVnbERpc3BsYXkgbm90IGluaXRpYWxpemVkIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoc0VnbENvbmZpZyA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIm1FZ2xDb25maWcgbm90IGluaXRpYWxpemVkIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoVGhyZWFkLmN1cnJlbnRUaHJlYWQoKSAhPSBzRWdsVGhyZWFkKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiSGFyZHdhcmVSZW5kZXJlciBjYW5ub3QgYmUgdXNlZCAiIAorICAgICAgICAgICAgICAgICAgICAgICAgKyAiZnJvbSBtdWx0aXBsZSB0aHJlYWRzIik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgKiAgVGhlIHdpbmRvdyBzaXplIGhhcyBjaGFuZ2VkLCBzbyB3ZSBuZWVkIHRvIGNyZWF0ZSBhIG5ldworICAgICAgICAgICAgICogIHN1cmZhY2UuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGlmIChtRWdsU3VyZmFjZSAhPSBudWxsICYmIG1FZ2xTdXJmYWNlICE9IEVHTDEwLkVHTF9OT19TVVJGQUNFKSB7CisgICAgICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgICAgKiBVbmJpbmQgYW5kIGRlc3Ryb3kgdGhlIG9sZCBFR0wgc3VyZmFjZSwgaWYKKyAgICAgICAgICAgICAgICAgKiB0aGVyZSBpcyBvbmUuCisgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgc0VnbC5lZ2xNYWtlQ3VycmVudChzRWdsRGlzcGxheSwgRUdMMTAuRUdMX05PX1NVUkZBQ0UsCisgICAgICAgICAgICAgICAgICAgICAgICBFR0wxMC5FR0xfTk9fU1VSRkFDRSwgRUdMMTAuRUdMX05PX0NPTlRFWFQpOworICAgICAgICAgICAgICAgIHNFZ2wuZWdsRGVzdHJveVN1cmZhY2Uoc0VnbERpc3BsYXksIG1FZ2xTdXJmYWNlKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gQ3JlYXRlIGFuIEVHTCBzdXJmYWNlIHdlIGNhbiByZW5kZXIgaW50by4KKyAgICAgICAgICAgIG1FZ2xTdXJmYWNlID0gc0VnbC5lZ2xDcmVhdGVXaW5kb3dTdXJmYWNlKHNFZ2xEaXNwbGF5LCBzRWdsQ29uZmlnLCBob2xkZXIsIG51bGwpOworCisgICAgICAgICAgICBpZiAobUVnbFN1cmZhY2UgPT0gbnVsbCB8fCBtRWdsU3VyZmFjZSA9PSBFR0wxMC5FR0xfTk9fU1VSRkFDRSkgeworICAgICAgICAgICAgICAgIGludCBlcnJvciA9IHNFZ2wuZWdsR2V0RXJyb3IoKTsKKyAgICAgICAgICAgICAgICBpZiAoZXJyb3IgPT0gRUdMMTAuRUdMX0JBRF9OQVRJVkVfV0lORE9XKSB7CisgICAgICAgICAgICAgICAgICAgIExvZy5lKCJFZ2xIZWxwZXIiLCAiY3JlYXRlV2luZG93U3VyZmFjZSByZXR1cm5lZCBFR0xfQkFEX05BVElWRV9XSU5ET1cuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiY3JlYXRlV2luZG93U3VyZmFjZSBmYWlsZWQiKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIEJlZm9yZSB3ZSBjYW4gaXNzdWUgR0wgY29tbWFuZHMsIHdlIG5lZWQgdG8gbWFrZSBzdXJlCisgICAgICAgICAgICAgKiB0aGUgY29udGV4dCBpcyBjdXJyZW50IGFuZCBib3VuZCB0byBhIHN1cmZhY2UuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGlmICghc0VnbC5lZ2xNYWtlQ3VycmVudChzRWdsRGlzcGxheSwgbUVnbFN1cmZhY2UsIG1FZ2xTdXJmYWNlLCBzRWdsQ29udGV4dCkpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiZWdsTWFrZUN1cnJlbnQgZmFpbGVkIik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiBzRWdsQ29udGV4dC5nZXRHTCgpOworICAgICAgICB9CisKKyAgICAgICAgRUdMQ29udGV4dCBjcmVhdGVDb250ZXh0KEVHTDEwIGVnbCwgRUdMRGlzcGxheSBlZ2xEaXNwbGF5LCBFR0xDb25maWcgZWdsQ29uZmlnKSB7CisgICAgICAgICAgICBpbnRbXSBhdHRyaWJfbGlzdCA9IHsgRUdMX0NPTlRFWFRfQ0xJRU5UX1ZFUlNJT04sIG1HbFZlcnNpb24sIEVHTDEwLkVHTF9OT05FIH07CisKKyAgICAgICAgICAgIHJldHVybiBlZ2wuZWdsQ3JlYXRlQ29udGV4dChlZ2xEaXNwbGF5LCBlZ2xDb25maWcsIEVHTDEwLkVHTF9OT19DT05URVhULAorICAgICAgICAgICAgICAgICAgICBtR2xWZXJzaW9uICE9IDAgPyBhdHRyaWJfbGlzdCA6IG51bGwpOyAgICAgICAgICAgIAorICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHZvaWQgaW5pdGlhbGl6ZUlmTmVlZGVkKGludCB3aWR0aCwgaW50IGhlaWdodCwgVmlldy5BdHRhY2hJbmZvIGF0dGFjaEluZm8sCisgICAgICAgICAgICAgICAgU3VyZmFjZUhvbGRlciBob2xkZXIpIHsKKyAgICAgICAgICAgIGlmIChpc1JlcXVlc3RlZCgpKSB7CisgICAgICAgICAgICAgICAgY2hlY2tFcnJvcnMoKTsKKyAgICAgICAgICAgICAgICBzdXBlci5pbml0aWFsaXplSWZOZWVkZWQod2lkdGgsIGhlaWdodCwgYXR0YWNoSW5mbywgaG9sZGVyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHZvaWQgZGVzdHJveShib29sZWFuIGZ1bGwpIHsKKyAgICAgICAgICAgIGlmIChmdWxsICYmIG1DYW52YXMgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG1DYW52YXMuZGVzdHJveSgpOworICAgICAgICAgICAgICAgIG1DYW52YXMgPSBudWxsOworICAgICAgICAgICAgfQorICAgICAgICAgICAgCisgICAgICAgICAgICBpZiAoIWlzRW5hYmxlZCgpIHx8IG1EZXN0cm95ZWQpIHJldHVybjsKKworICAgICAgICAgICAgbURlc3Ryb3llZCA9IHRydWU7CisKKyAgICAgICAgICAgIHNFZ2wuZWdsTWFrZUN1cnJlbnQoc0VnbERpc3BsYXksIEVHTDEwLkVHTF9OT19TVVJGQUNFLAorICAgICAgICAgICAgICAgICAgICBFR0wxMC5FR0xfTk9fU1VSRkFDRSwgRUdMMTAuRUdMX05PX0NPTlRFWFQpOworICAgICAgICAgICAgc0VnbC5lZ2xEZXN0cm95U3VyZmFjZShzRWdsRGlzcGxheSwgbUVnbFN1cmZhY2UpOworCisgICAgICAgICAgICBtRWdsU3VyZmFjZSA9IG51bGw7CisgICAgICAgICAgICBtR2wgPSBudWxsOworCisgICAgICAgICAgICBzZXRFbmFibGVkKGZhbHNlKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICB2b2lkIHNldHVwKGludCB3aWR0aCwgaW50IGhlaWdodCkgeworICAgICAgICAgICAgbUNhbnZhcy5zZXRWaWV3cG9ydCh3aWR0aCwgaGVpZ2h0KTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgYm9vbGVhbiBjYW5EcmF3KCkgeworICAgICAgICAgICAgcmV0dXJuIG1HbCAhPSBudWxsICYmIG1DYW52YXMgIT0gbnVsbDsKKyAgICAgICAgfSAgICAgICAgCisgICAgICAgIAorICAgICAgICB2b2lkIG9uUHJlRHJhdygpIHsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBEZWZpbmVzIHRoZSBFR0wgY29uZmlndXJhdGlvbiBmb3IgdGhpcyByZW5kZXJlci4gVGhlIGRlZmF1bHQgY29uZmlndXJhdGlvbgorICAgICAgICAgKiBpcyBSR0JYLCBubyBkZXB0aCwgbm8gc3RlbmNpbC4KKyAgICAgICAgICogCisgICAgICAgICAqIEByZXR1cm4gQW4ge0BsaW5rIGFuZHJvaWQudmlldy5IYXJkd2FyZVJlbmRlcmVyLkdsUmVuZGVyZXIuRWdsQ29uZmlnQ2hvb3Nlcn0uCisgICAgICAgICAqIEBwYXJhbSBnbFZlcnNpb24KKyAgICAgICAgICovCisgICAgICAgIEVnbENvbmZpZ0Nob29zZXIgZ2V0Q29uZmlnQ2hvb3NlcihpbnQgZ2xWZXJzaW9uKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IENvbXBvbmVudFNpemVDaG9vc2VyKGdsVmVyc2lvbiwgOCwgOCwgOCwgOCwgMCwgMCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgdm9pZCBkcmF3KFZpZXcgdmlldywgVmlldy5BdHRhY2hJbmZvIGF0dGFjaEluZm8sIGludCB5T2Zmc2V0KSB7CisgICAgICAgICAgICBpZiAoY2FuRHJhdygpKSB7CisgICAgICAgICAgICAgICAgYXR0YWNoSW5mby5tRHJhd2luZ1RpbWUgPSBTeXN0ZW1DbG9jay51cHRpbWVNaWxsaXMoKTsKKyAgICAgICAgICAgICAgICBhdHRhY2hJbmZvLm1JZ25vcmVEaXJ0eVN0YXRlID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB2aWV3Lm1Qcml2YXRlRmxhZ3MgfD0gVmlldy5EUkFXTjsKKworICAgICAgICAgICAgICAgIGNoZWNrQ3VycmVudCgpOworCisgICAgICAgICAgICAgICAgb25QcmVEcmF3KCk7CisKKyAgICAgICAgICAgICAgICBDYW52YXMgY2FudmFzID0gbUNhbnZhczsKKyAgICAgICAgICAgICAgICBpbnQgc2F2ZUNvdW50ID0gY2FudmFzLnNhdmUoKTsKKyAgICAgICAgICAgICAgICBjYW52YXMudHJhbnNsYXRlKDAsIC15T2Zmc2V0KTsKKworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIHZpZXcuZHJhdyhjYW52YXMpOworICAgICAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgICAgIGNhbnZhcy5yZXN0b3JlVG9Db3VudChzYXZlQ291bnQpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGF0dGFjaEluZm8ubUlnbm9yZURpcnR5U3RhdGUgPSBmYWxzZTsKKworICAgICAgICAgICAgICAgIHNFZ2wuZWdsU3dhcEJ1ZmZlcnMoc0VnbERpc3BsYXksIG1FZ2xTdXJmYWNlKTsKKyAgICAgICAgICAgICAgICBjaGVja0Vycm9ycygpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSB2b2lkIGNoZWNrQ3VycmVudCgpIHsKKyAgICAgICAgICAgIC8vIFRPRE86IERvbid0IGNoZWNrIHRoZSBjdXJyZW50IGNvbnRleHQgd2hlbiB3ZSBoYXZlIG9uZSBwZXIgVUkgdGhyZWFkCisgICAgICAgICAgICAvLyBUT0RPOiBVc2UgYSB0aHJlYWRsb2NhbCBmbGFnIHRvIGtub3cgd2hldGhlciB0aGUgc3VyZmFjZSBoYXMgY2hhbmdlZAorICAgICAgICAgICAgaWYgKHNFZ2wuZWdsR2V0Q3VycmVudENvbnRleHQoKSAhPSBzRWdsQ29udGV4dCB8fAorICAgICAgICAgICAgICAgICAgICBzRWdsLmVnbEdldEN1cnJlbnRTdXJmYWNlKEVHTDEwLkVHTF9EUkFXKSAhPSBtRWdsU3VyZmFjZSkgeworICAgICAgICAgICAgICAgIGlmICghc0VnbC5lZ2xNYWtlQ3VycmVudChzRWdsRGlzcGxheSwgbUVnbFN1cmZhY2UsIG1FZ2xTdXJmYWNlLCBzRWdsQ29udGV4dCkpIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oImVnbE1ha2VDdXJyZW50IGZhaWxlZCIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHN0YXRpYyBhYnN0cmFjdCBjbGFzcyBFZ2xDb25maWdDaG9vc2VyIHsKKyAgICAgICAgICAgIGZpbmFsIGludFtdIG1Db25maWdTcGVjOworICAgICAgICAgICAgcHJpdmF0ZSBmaW5hbCBpbnQgbUdsVmVyc2lvbjsKKworICAgICAgICAgICAgRWdsQ29uZmlnQ2hvb3NlcihpbnQgZ2xWZXJzaW9uLCBpbnRbXSBjb25maWdTcGVjKSB7CisgICAgICAgICAgICAgICAgbUdsVmVyc2lvbiA9IGdsVmVyc2lvbjsKKyAgICAgICAgICAgICAgICBtQ29uZmlnU3BlYyA9IGZpbHRlckNvbmZpZ1NwZWMoY29uZmlnU3BlYyk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEVHTENvbmZpZyBjaG9vc2VDb25maWcoRUdMMTAgZWdsLCBFR0xEaXNwbGF5IGRpc3BsYXkpIHsKKyAgICAgICAgICAgICAgICBpbnRbXSBpbmRleCA9IG5ldyBpbnRbMV07CisgICAgICAgICAgICAgICAgaWYgKCFlZ2wuZWdsQ2hvb3NlQ29uZmlnKGRpc3BsYXksIG1Db25maWdTcGVjLCBudWxsLCAwLCBpbmRleCkpIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiZWdsQ2hvb3NlQ29uZmlnIGZhaWxlZCIpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGludCBudW1Db25maWdzID0gaW5kZXhbMF07CisgICAgICAgICAgICAgICAgaWYgKG51bUNvbmZpZ3MgPD0gMCkgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJObyBjb25maWdzIG1hdGNoIGNvbmZpZ1NwZWMiKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBFR0xDb25maWdbXSBjb25maWdzID0gbmV3IEVHTENvbmZpZ1tudW1Db25maWdzXTsKKyAgICAgICAgICAgICAgICBpZiAoIWVnbC5lZ2xDaG9vc2VDb25maWcoZGlzcGxheSwgbUNvbmZpZ1NwZWMsIGNvbmZpZ3MsIG51bUNvbmZpZ3MsIGluZGV4KSkgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJlZ2xDaG9vc2VDb25maWcgZmFpbGVkIik7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgRUdMQ29uZmlnIGNvbmZpZyA9IGNob29zZUNvbmZpZyhlZ2wsIGRpc3BsYXksIGNvbmZpZ3MpOworICAgICAgICAgICAgICAgIGlmIChjb25maWcgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJObyBjb25maWcgY2hvc2VuIik7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcmV0dXJuIGNvbmZpZzsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYWJzdHJhY3QgRUdMQ29uZmlnIGNob29zZUNvbmZpZyhFR0wxMCBlZ2wsIEVHTERpc3BsYXkgZGlzcGxheSwgRUdMQ29uZmlnW10gY29uZmlncyk7CisKKyAgICAgICAgICAgIHByaXZhdGUgaW50W10gZmlsdGVyQ29uZmlnU3BlYyhpbnRbXSBjb25maWdTcGVjKSB7CisgICAgICAgICAgICAgICAgaWYgKG1HbFZlcnNpb24gIT0gMikgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29uZmlnU3BlYzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgLyogV2Uga25vdyBub25lIG9mIHRoZSBzdWJjbGFzc2VzIGRlZmluZSBFR0xfUkVOREVSQUJMRV9UWVBFLgorICAgICAgICAgICAgICAgICAqIEFuZCB3ZSBrbm93IHRoZSBjb25maWdTcGVjIGlzIHdlbGwgZm9ybWVkLgorICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgIGludCBsZW4gPSBjb25maWdTcGVjLmxlbmd0aDsKKyAgICAgICAgICAgICAgICBpbnRbXSBuZXdDb25maWdTcGVjID0gbmV3IGludFtsZW4gKyAyXTsKKyAgICAgICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KGNvbmZpZ1NwZWMsIDAsIG5ld0NvbmZpZ1NwZWMsIDAsIGxlbiAtIDEpOworICAgICAgICAgICAgICAgIG5ld0NvbmZpZ1NwZWNbbGVuIC0gMV0gPSBFR0wxMC5FR0xfUkVOREVSQUJMRV9UWVBFOworICAgICAgICAgICAgICAgIG5ld0NvbmZpZ1NwZWNbbGVuXSA9IDQ7IC8qIEVHTF9PUEVOR0xfRVMyX0JJVCAqLworICAgICAgICAgICAgICAgIG5ld0NvbmZpZ1NwZWNbbGVuICsgMV0gPSBFR0wxMC5FR0xfTk9ORTsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3Q29uZmlnU3BlYzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBDaG9vc2UgYSBjb25maWd1cmF0aW9uIHdpdGggZXhhY3RseSB0aGUgc3BlY2lmaWVkIHIsZyxiLGEgc2l6ZXMsCisgICAgICAgICAqIGFuZCBhdCBsZWFzdCB0aGUgc3BlY2lmaWVkIGRlcHRoIGFuZCBzdGVuY2lsIHNpemVzLgorICAgICAgICAgKi8KKyAgICAgICAgc3RhdGljIGNsYXNzIENvbXBvbmVudFNpemVDaG9vc2VyIGV4dGVuZHMgRWdsQ29uZmlnQ2hvb3NlciB7CisgICAgICAgICAgICBwcml2YXRlIGludFtdIG1WYWx1ZTsKKworICAgICAgICAgICAgcHJpdmF0ZSBpbnQgbVJlZFNpemU7CisgICAgICAgICAgICBwcml2YXRlIGludCBtR3JlZW5TaXplOworICAgICAgICAgICAgcHJpdmF0ZSBpbnQgbUJsdWVTaXplOworICAgICAgICAgICAgcHJpdmF0ZSBpbnQgbUFscGhhU2l6ZTsKKyAgICAgICAgICAgIHByaXZhdGUgaW50IG1EZXB0aFNpemU7CisgICAgICAgICAgICBwcml2YXRlIGludCBtU3RlbmNpbFNpemU7CisKKyAgICAgICAgICAgIENvbXBvbmVudFNpemVDaG9vc2VyKGludCBnbFZlcnNpb24sIGludCByZWRTaXplLCBpbnQgZ3JlZW5TaXplLCBpbnQgYmx1ZVNpemUsCisgICAgICAgICAgICAgICAgICAgIGludCBhbHBoYVNpemUsIGludCBkZXB0aFNpemUsIGludCBzdGVuY2lsU2l6ZSkgeworICAgICAgICAgICAgICAgIHN1cGVyKGdsVmVyc2lvbiwgbmV3IGludFtdIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEVHTDEwLkVHTF9SRURfU0laRSwgcmVkU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEVHTDEwLkVHTF9HUkVFTl9TSVpFLCBncmVlblNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICBFR0wxMC5FR0xfQkxVRV9TSVpFLCBibHVlU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEVHTDEwLkVHTF9BTFBIQV9TSVpFLCBhbHBoYVNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICBFR0wxMC5FR0xfREVQVEhfU0laRSwgZGVwdGhTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgRUdMMTAuRUdMX1NURU5DSUxfU0laRSwgc3RlbmNpbFNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICBFR0wxMC5FR0xfTk9ORSB9KTsKKyAgICAgICAgICAgICAgICBtVmFsdWUgPSBuZXcgaW50WzFdOworICAgICAgICAgICAgICAgIG1SZWRTaXplID0gcmVkU2l6ZTsKKyAgICAgICAgICAgICAgICBtR3JlZW5TaXplID0gZ3JlZW5TaXplOworICAgICAgICAgICAgICAgIG1CbHVlU2l6ZSA9IGJsdWVTaXplOworICAgICAgICAgICAgICAgIG1BbHBoYVNpemUgPSBhbHBoYVNpemU7CisgICAgICAgICAgICAgICAgbURlcHRoU2l6ZSA9IGRlcHRoU2l6ZTsKKyAgICAgICAgICAgICAgICBtU3RlbmNpbFNpemUgPSBzdGVuY2lsU2l6ZTsKKyAgICAgICAgICAgfQorCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIEVHTENvbmZpZyBjaG9vc2VDb25maWcoRUdMMTAgZWdsLCBFR0xEaXNwbGF5IGRpc3BsYXksIEVHTENvbmZpZ1tdIGNvbmZpZ3MpIHsKKyAgICAgICAgICAgICAgICBmb3IgKEVHTENvbmZpZyBjb25maWcgOiBjb25maWdzKSB7CisgICAgICAgICAgICAgICAgICAgIGludCBkID0gZmluZENvbmZpZ0F0dHJpYihlZ2wsIGRpc3BsYXksIGNvbmZpZywgRUdMMTAuRUdMX0RFUFRIX1NJWkUsIDApOworICAgICAgICAgICAgICAgICAgICBpbnQgcyA9IGZpbmRDb25maWdBdHRyaWIoZWdsLCBkaXNwbGF5LCBjb25maWcsIEVHTDEwLkVHTF9TVEVOQ0lMX1NJWkUsIDApOworICAgICAgICAgICAgICAgICAgICBpZiAoZCA+PSBtRGVwdGhTaXplICYmIHMgPj0gbVN0ZW5jaWxTaXplKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgciA9IGZpbmRDb25maWdBdHRyaWIoZWdsLCBkaXNwbGF5LCBjb25maWcsIEVHTDEwLkVHTF9SRURfU0laRSwgMCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZyA9IGZpbmRDb25maWdBdHRyaWIoZWdsLCBkaXNwbGF5LCBjb25maWcsIEVHTDEwLkVHTF9HUkVFTl9TSVpFLCAwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBiID0gZmluZENvbmZpZ0F0dHJpYihlZ2wsIGRpc3BsYXksIGNvbmZpZywgRUdMMTAuRUdMX0JMVUVfU0laRSwgMCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYSA9IGZpbmRDb25maWdBdHRyaWIoZWdsLCBkaXNwbGF5LCBjb25maWcsIEVHTDEwLkVHTF9BTFBIQV9TSVpFLCAwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyID49IG1SZWRTaXplICYmIGcgPj0gbUdyZWVuU2l6ZSAmJiBiID49IG1CbHVlU2l6ZSAmJiBhID49IG1BbHBoYVNpemUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29uZmlnOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwcml2YXRlIGludCBmaW5kQ29uZmlnQXR0cmliKEVHTDEwIGVnbCwgRUdMRGlzcGxheSBkaXNwbGF5LCBFR0xDb25maWcgY29uZmlnLAorICAgICAgICAgICAgICAgICAgICBpbnQgYXR0cmlidXRlLCBpbnQgZGVmYXVsdFZhbHVlKSB7CisgICAgICAgICAgICAgICAgaWYgKGVnbC5lZ2xHZXRDb25maWdBdHRyaWIoZGlzcGxheSwgY29uZmlnLCBhdHRyaWJ1dGUsIG1WYWx1ZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1WYWx1ZVswXTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICByZXR1cm4gZGVmYXVsdFZhbHVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogSGFyZHdhcmUgcmVuZGVyZXIgdXNpbmcgT3BlbkdMIEVTIDIuMC4KKyAgICAgKi8KKyAgICBzdGF0aWMgY2xhc3MgR2wyMFJlbmRlcmVyIGV4dGVuZHMgR2xSZW5kZXJlciB7CisgICAgICAgIHByaXZhdGUgR0xFUzIwQ2FudmFzIG1HbENhbnZhczsKKworICAgICAgICBHbDIwUmVuZGVyZXIoYm9vbGVhbiB0cmFuc2x1Y2VudCkgeworICAgICAgICAgICAgc3VwZXIoMiwgdHJhbnNsdWNlbnQpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIEdMRVMyMENhbnZhcyBjcmVhdGVDYW52YXMoKSB7CisgICAgICAgICAgICByZXR1cm4gbUdsQ2FudmFzID0gbmV3IEdMRVMyMENhbnZhcyhtR2wsIHRydWUpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHZvaWQgb25QcmVEcmF3KCkgeworICAgICAgICAgICAgbUdsQ2FudmFzLm9uUHJlRHJhdygpOworICAgICAgICB9CisKKyAgICAgICAgc3RhdGljIEhhcmR3YXJlUmVuZGVyZXIgY3JlYXRlKGJvb2xlYW4gdHJhbnNsdWNlbnQpIHsKKyAgICAgICAgICAgIGlmIChHTEVTMjBDYW52YXMuaXNBdmFpbGFibGUoKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBuZXcgR2wyMFJlbmRlcmVyKHRyYW5zbHVjZW50KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9MYXlvdXRJbmZsYXRlci5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9MYXlvdXRJbmZsYXRlci5qYXZhCmluZGV4IDE5NGMwMTMuLjQ1ODI3NGYgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvTGF5b3V0SW5mbGF0ZXIuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC92aWV3L0xheW91dEluZmxhdGVyLmphdmEKQEAgLTE2LDE1ICsxNiwxNSBAQAogCiBwYWNrYWdlIGFuZHJvaWQudmlldzsKIAoraW1wb3J0IG9yZy54bWxwdWxsLnYxLlhtbFB1bGxQYXJzZXI7CitpbXBvcnQgb3JnLnhtbHB1bGwudjEuWG1sUHVsbFBhcnNlckV4Y2VwdGlvbjsKKwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuVHlwZWRBcnJheTsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlhtbFJlc291cmNlUGFyc2VyOwogaW1wb3J0IGFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQ7CiBpbXBvcnQgYW5kcm9pZC51dGlsLlhtbDsKIAotaW1wb3J0IG9yZy54bWxwdWxsLnYxLlhtbFB1bGxQYXJzZXI7Ci1pbXBvcnQgb3JnLnhtbHB1bGwudjEuWG1sUHVsbFBhcnNlckV4Y2VwdGlvbjsKLQogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CiBpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuQ29uc3RydWN0b3I7CiBpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CkBAIC03MSwxMSArNzEsMTEgQEAKIAogICAgIHByaXZhdGUgZmluYWwgT2JqZWN0W10gbUNvbnN0cnVjdG9yQXJncyA9IG5ldyBPYmplY3RbMl07CiAKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBDbGFzc1tdIG1Db25zdHJ1Y3RvclNpZ25hdHVyZSA9IG5ldyBDbGFzc1tdIHsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBDbGFzczw/PltdIG1Db25zdHJ1Y3RvclNpZ25hdHVyZSA9IG5ldyBDbGFzc1tdIHsKICAgICAgICAgICAgIENvbnRleHQuY2xhc3MsIEF0dHJpYnV0ZVNldC5jbGFzc307CiAKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBIYXNoTWFwPFN0cmluZywgQ29uc3RydWN0b3I+IHNDb25zdHJ1Y3Rvck1hcCA9Ci0gICAgICAgICAgICBuZXcgSGFzaE1hcDxTdHJpbmcsIENvbnN0cnVjdG9yPigpOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEhhc2hNYXA8U3RyaW5nLCBDb25zdHJ1Y3Rvcjw/IGV4dGVuZHMgVmlldz4+IHNDb25zdHJ1Y3Rvck1hcCA9CisgICAgICAgICAgICBuZXcgSGFzaE1hcDxTdHJpbmcsIENvbnN0cnVjdG9yPD8gZXh0ZW5kcyBWaWV3Pj4oKTsKICAgICAKICAgICBwcml2YXRlIEhhc2hNYXA8U3RyaW5nLCBCb29sZWFuPiBtRmlsdGVyTWFwOwogCkBAIC05Nyw2ICs5Nyw3IEBACiAgICAgICAgICAqIAogICAgICAgICAgKiBAcmV0dXJuIFRydWUgaWYgdGhpcyBjbGFzcyBpcyBhbGxvd2VkIHRvIGJlIGluZmxhdGVkLCBvciBmYWxzZSBvdGhlcndpc2UKICAgICAgICAgICovCisgICAgICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQogICAgICAgICBib29sZWFuIG9uTG9hZENsYXNzKENsYXNzIGNsYXp6KTsKICAgICB9CiAgICAgCkBAIC0zODAsNyArMzgxLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiVmlld0dyb3VwIHJvb3QgYW5kIGF0dGFjaFRvUm9vdD10cnVlIik7CiAgICAgICAgICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgICAgICAgICBySW5mbGF0ZShwYXJzZXIsIHJvb3QsIGF0dHJzKTsKKyAgICAgICAgICAgICAgICAgICAgckluZmxhdGUocGFyc2VyLCByb290LCBhdHRycywgZmFsc2UpOwogICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgIC8vIFRlbXAgaXMgdGhlIHJvb3QgdmlldyB0aGF0IHdhcyBmb3VuZCBpbiB0aGUgeG1sCiAgICAgICAgICAgICAgICAgICAgIFZpZXcgdGVtcCA9IGNyZWF0ZVZpZXdGcm9tVGFnKG5hbWUsIGF0dHJzKTsKQEAgLTQwNSw3ICs0MDYsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCItLS0tLT4gc3RhcnQgaW5mbGF0aW5nIGNoaWxkcmVuIik7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgLy8gSW5mbGF0ZSBhbGwgY2hpbGRyZW4gdW5kZXIgdGVtcAotICAgICAgICAgICAgICAgICAgICBySW5mbGF0ZShwYXJzZXIsIHRlbXAsIGF0dHJzKTsKKyAgICAgICAgICAgICAgICAgICAgckluZmxhdGUocGFyc2VyLCB0ZW1wLCBhdHRycywgdHJ1ZSk7CiAgICAgICAgICAgICAgICAgICAgIGlmIChERUJVRykgewogICAgICAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCItLS0tLT4gZG9uZSBpbmZsYXRpbmcgY2hpbGRyZW4iKTsKICAgICAgICAgICAgICAgICAgICAgfQpAQCAtNDU4LDE4ICs0NTksMTggQEAKICAgICAgKiBAcGFyYW0gbmFtZSBUaGUgZnVsbCBuYW1lIG9mIHRoZSBjbGFzcyB0byBiZSBpbnN0YW50aWF0ZWQuCiAgICAgICogQHBhcmFtIGF0dHJzIFRoZSBYTUwgYXR0cmlidXRlcyBzdXBwbGllZCBmb3IgdGhpcyBpbnN0YW5jZS4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIFZpZXcgVGhlIG5ld2x5IGluc3RhbnRpZWQgdmlldywgb3IgbnVsbC4KKyAgICAgKiBAcmV0dXJuIFZpZXcgVGhlIG5ld2x5IGluc3RhbnRpYXRlZCB2aWV3LCBvciBudWxsLgogICAgICAqLwogICAgIHB1YmxpYyBmaW5hbCBWaWV3IGNyZWF0ZVZpZXcoU3RyaW5nIG5hbWUsIFN0cmluZyBwcmVmaXgsIEF0dHJpYnV0ZVNldCBhdHRycykKICAgICAgICAgICAgIHRocm93cyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uLCBJbmZsYXRlRXhjZXB0aW9uIHsKLSAgICAgICAgQ29uc3RydWN0b3IgY29uc3RydWN0b3IgPSBzQ29uc3RydWN0b3JNYXAuZ2V0KG5hbWUpOwotICAgICAgICBDbGFzcyBjbGF6eiA9IG51bGw7CisgICAgICAgIENvbnN0cnVjdG9yPD8gZXh0ZW5kcyBWaWV3PiBjb25zdHJ1Y3RvciA9IHNDb25zdHJ1Y3Rvck1hcC5nZXQobmFtZSk7CisgICAgICAgIENsYXNzPD8gZXh0ZW5kcyBWaWV3PiBjbGF6eiA9IG51bGw7CiAKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIGlmIChjb25zdHJ1Y3RvciA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgLy8gQ2xhc3Mgbm90IGZvdW5kIGluIHRoZSBjYWNoZSwgc2VlIGlmIGl0J3MgcmVhbCwgYW5kIHRyeSB0byBhZGQgaXQKICAgICAgICAgICAgICAgICBjbGF6eiA9IG1Db250ZXh0LmdldENsYXNzTG9hZGVyKCkubG9hZENsYXNzKAotICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ICE9IG51bGwgPyAocHJlZml4ICsgbmFtZSkgOiBuYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCAhPSBudWxsID8gKHByZWZpeCArIG5hbWUpIDogbmFtZSkuYXNTdWJjbGFzcyhWaWV3LmNsYXNzKTsKICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICBpZiAobUZpbHRlciAhPSBudWxsICYmIGNsYXp6ICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBhbGxvd2VkID0gbUZpbHRlci5vbkxvYWRDbGFzcyhjbGF6eik7CkBAIC00ODcsNyArNDg4LDcgQEAKICAgICAgICAgICAgICAgICAgICAgaWYgKGFsbG93ZWRTdGF0ZSA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBOZXcgY2xhc3MgLS0gcmVtZW1iZXIgd2hldGhlciBpdCBpcyBhbGxvd2VkCiAgICAgICAgICAgICAgICAgICAgICAgICBjbGF6eiA9IG1Db250ZXh0LmdldENsYXNzTG9hZGVyKCkubG9hZENsYXNzKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggIT0gbnVsbCA/IChwcmVmaXggKyBuYW1lKSA6IG5hbWUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggIT0gbnVsbCA/IChwcmVmaXggKyBuYW1lKSA6IG5hbWUpLmFzU3ViY2xhc3MoVmlldy5jbGFzcyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gYWxsb3dlZCA9IGNsYXp6ICE9IG51bGwgJiYgbUZpbHRlci5vbkxvYWRDbGFzcyhjbGF6eik7CiAgICAgICAgICAgICAgICAgICAgICAgICBtRmlsdGVyTWFwLnB1dChuYW1lLCBhbGxvd2VkKTsKQEAgLTUwMiw3ICs1MDMsNyBAQAogCiAgICAgICAgICAgICBPYmplY3RbXSBhcmdzID0gbUNvbnN0cnVjdG9yQXJnczsKICAgICAgICAgICAgIGFyZ3NbMV0gPSBhdHRyczsKLSAgICAgICAgICAgIHJldHVybiAoVmlldykgY29uc3RydWN0b3IubmV3SW5zdGFuY2UoYXJncyk7CisgICAgICAgICAgICByZXR1cm4gY29uc3RydWN0b3IubmV3SW5zdGFuY2UoYXJncyk7CiAKICAgICAgICAgfSBjYXRjaCAoTm9TdWNoTWV0aG9kRXhjZXB0aW9uIGUpIHsKICAgICAgICAgICAgIEluZmxhdGVFeGNlcHRpb24gaWUgPSBuZXcgSW5mbGF0ZUV4Y2VwdGlvbihhdHRycy5nZXRQb3NpdGlvbkRlc2NyaXB0aW9uKCkKQEAgLTUxMSw2ICs1MTIsMTMgQEAKICAgICAgICAgICAgIGllLmluaXRDYXVzZShlKTsKICAgICAgICAgICAgIHRocm93IGllOwogCisgICAgICAgIH0gY2F0Y2ggKENsYXNzQ2FzdEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAvLyBJZiBsb2FkZWQgY2xhc3MgaXMgbm90IGEgVmlldyBzdWJjbGFzcworICAgICAgICAgICAgSW5mbGF0ZUV4Y2VwdGlvbiBpZSA9IG5ldyBJbmZsYXRlRXhjZXB0aW9uKGF0dHJzLmdldFBvc2l0aW9uRGVzY3JpcHRpb24oKQorICAgICAgICAgICAgICAgICAgICArICI6IENsYXNzIGlzIG5vdCBhIFZpZXcgIgorICAgICAgICAgICAgICAgICAgICArIChwcmVmaXggIT0gbnVsbCA/IChwcmVmaXggKyBuYW1lKSA6IG5hbWUpKTsKKyAgICAgICAgICAgIGllLmluaXRDYXVzZShlKTsKKyAgICAgICAgICAgIHRocm93IGllOwogICAgICAgICB9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKICAgICAgICAgICAgIC8vIElmIGxvYWRDbGFzcyBmYWlscywgd2Ugc2hvdWxkIHByb3BhZ2F0ZSB0aGUgZXhjZXB0aW9uLgogICAgICAgICAgICAgdGhyb3cgZTsKQEAgLTUyNCw3ICs1MzIsNyBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFRocm93IGFuIGV4Y3BldGlvbiBiZWNhdXNlIHRoZSBzcGVjaWZpZWQgY2xhc3MgaXMgbm90IGFsbG93ZWQgdG8gYmUgaW5mbGF0ZWQuCisgICAgICogVGhyb3cgYW4gZXhjZXB0aW9uIGJlY2F1c2UgdGhlIHNwZWNpZmllZCBjbGFzcyBpcyBub3QgYWxsb3dlZCB0byBiZSBpbmZsYXRlZC4KICAgICAgKi8KICAgICBwcml2YXRlIHZvaWQgZmFpbE5vdEFsbG93ZWQoU3RyaW5nIG5hbWUsIFN0cmluZyBwcmVmaXgsIEF0dHJpYnV0ZVNldCBhdHRycykgewogICAgICAgICBJbmZsYXRlRXhjZXB0aW9uIGllID0gbmV3IEluZmxhdGVFeGNlcHRpb24oYXR0cnMuZ2V0UG9zaXRpb25EZXNjcmlwdGlvbigpCkBAIC01OTUsOCArNjAzLDggQEAKICAgICAgKiBSZWN1cnNpdmUgbWV0aG9kIHVzZWQgdG8gZGVzY2VuZCBkb3duIHRoZSB4bWwgaGllcmFyY2h5IGFuZCBpbnN0YW50aWF0ZQogICAgICAqIHZpZXdzLCBpbnN0YW50aWF0ZSB0aGVpciBjaGlsZHJlbiwgYW5kIHRoZW4gY2FsbCBvbkZpbmlzaEluZmxhdGUoKS4KICAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgckluZmxhdGUoWG1sUHVsbFBhcnNlciBwYXJzZXIsIFZpZXcgcGFyZW50LCBmaW5hbCBBdHRyaWJ1dGVTZXQgYXR0cnMpCi0gICAgICAgICAgICB0aHJvd3MgWG1sUHVsbFBhcnNlckV4Y2VwdGlvbiwgSU9FeGNlcHRpb24geworICAgIHByaXZhdGUgdm9pZCBySW5mbGF0ZShYbWxQdWxsUGFyc2VyIHBhcnNlciwgVmlldyBwYXJlbnQsIGZpbmFsIEF0dHJpYnV0ZVNldCBhdHRycywKKyAgICAgICAgICAgIGJvb2xlYW4gZmluaXNoSW5mbGF0ZSkgdGhyb3dzIFhtbFB1bGxQYXJzZXJFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKIAogICAgICAgICBmaW5hbCBpbnQgZGVwdGggPSBwYXJzZXIuZ2V0RGVwdGgoKTsKICAgICAgICAgaW50IHR5cGU7CkBAIC02MjMsMTIgKzYzMSwxMiBAQAogICAgICAgICAgICAgICAgIGZpbmFsIFZpZXcgdmlldyA9IGNyZWF0ZVZpZXdGcm9tVGFnKG5hbWUsIGF0dHJzKTsKICAgICAgICAgICAgICAgICBmaW5hbCBWaWV3R3JvdXAgdmlld0dyb3VwID0gKFZpZXdHcm91cCkgcGFyZW50OwogICAgICAgICAgICAgICAgIGZpbmFsIFZpZXdHcm91cC5MYXlvdXRQYXJhbXMgcGFyYW1zID0gdmlld0dyb3VwLmdlbmVyYXRlTGF5b3V0UGFyYW1zKGF0dHJzKTsKLSAgICAgICAgICAgICAgICBySW5mbGF0ZShwYXJzZXIsIHZpZXcsIGF0dHJzKTsKKyAgICAgICAgICAgICAgICBySW5mbGF0ZShwYXJzZXIsIHZpZXcsIGF0dHJzLCB0cnVlKTsKICAgICAgICAgICAgICAgICB2aWV3R3JvdXAuYWRkVmlldyh2aWV3LCBwYXJhbXMpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAKLSAgICAgICAgcGFyZW50Lm9uRmluaXNoSW5mbGF0ZSgpOworICAgICAgICBpZiAoZmluaXNoSW5mbGF0ZSkgcGFyZW50Lm9uRmluaXNoSW5mbGF0ZSgpOwogICAgIH0KIAogICAgIHByaXZhdGUgdm9pZCBwYXJzZVJlcXVlc3RGb2N1cyhYbWxQdWxsUGFyc2VyIHBhcnNlciwgVmlldyBwYXJlbnQpCkBAIC02NzksNyArNjg3LDcgQEAKIAogICAgICAgICAgICAgICAgICAgICBpZiAoVEFHX01FUkdFLmVxdWFscyhjaGlsZE5hbWUpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJbmZsYXRlIGFsbCBjaGlsZHJlbi4KLSAgICAgICAgICAgICAgICAgICAgICAgIHJJbmZsYXRlKGNoaWxkUGFyc2VyLCBwYXJlbnQsIGNoaWxkQXR0cnMpOworICAgICAgICAgICAgICAgICAgICAgICAgckluZmxhdGUoY2hpbGRQYXJzZXIsIHBhcmVudCwgY2hpbGRBdHRycywgZmFsc2UpOwogICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgVmlldyB2aWV3ID0gY3JlYXRlVmlld0Zyb21UYWcoY2hpbGROYW1lLCBjaGlsZEF0dHJzKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFZpZXdHcm91cCBncm91cCA9IChWaWV3R3JvdXApIHBhcmVudDsKQEAgLTcwNCw3ICs3MTIsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJbmZsYXRlIGFsbCBjaGlsZHJlbi4KLSAgICAgICAgICAgICAgICAgICAgICAgIHJJbmZsYXRlKGNoaWxkUGFyc2VyLCB2aWV3LCBjaGlsZEF0dHJzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJJbmZsYXRlKGNoaWxkUGFyc2VyLCB2aWV3LCBjaGlsZEF0dHJzLCB0cnVlKTsKIAogICAgICAgICAgICAgICAgICAgICAgICAgLy8gQXR0ZW1wdCB0byBvdmVycmlkZSB0aGUgaW5jbHVkZWQgbGF5b3V0J3MgYW5kcm9pZDppZCB3aXRoIHRoZQogICAgICAgICAgICAgICAgICAgICAgICAgLy8gb25lIHNldCBvbiB0aGUgPGluY2x1ZGUgLz4gdGFnIGl0c2VsZi4KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvTWVudUluZmxhdGVyLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC92aWV3L01lbnVJbmZsYXRlci5qYXZhCmluZGV4IDQ2YzgwNWMuLjdkNWRjZDggMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvTWVudUluZmxhdGVyLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9NZW51SW5mbGF0ZXIuamF2YQpAQCAtMTgsOCArMTgsNiBAQAogCiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudmlldy5tZW51Lk1lbnVJdGVtSW1wbDsKIAotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci0KIGltcG9ydCBvcmcueG1scHVsbC52MS5YbWxQdWxsUGFyc2VyOwogaW1wb3J0IG9yZy54bWxwdWxsLnYxLlhtbFB1bGxQYXJzZXJFeGNlcHRpb247CiAKQEAgLTMwLDYgKzI4LDEwIEBACiBpbXBvcnQgYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldDsKIGltcG9ydCBhbmRyb2lkLnV0aWwuWG1sOwogCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5Db25zdHJ1Y3RvcjsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7CisKIC8qKgogICogVGhpcyBjbGFzcyBpcyB1c2VkIHRvIGluc3RhbnRpYXRlIG1lbnUgWE1MIGZpbGVzIGludG8gTWVudSBvYmplY3RzLgogICogPHA+CkBAIC01MSw2ICs1Myw4IEBACiAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTk9fSUQgPSAwOwogICAgIAorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIENsYXNzPD8+W10gQUNUSU9OX1ZJRVdfQ09OU1RSVUNUT1JfU0lHTkFUVVJFID0gbmV3IENsYXNzW117Q29udGV4dC5jbGFzc307CisKICAgICBwcml2YXRlIENvbnRleHQgbUNvbnRleHQ7CiAgICAgCiAgICAgLyoqCkBAIC0xNjYsNiArMTcwLDQxIEBACiAgICAgICAgIH0KICAgICB9CiAgICAgCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgSW5mbGF0ZWRPbk1lbnVJdGVtQ2xpY2tMaXN0ZW5lcgorICAgICAgICAgICAgaW1wbGVtZW50cyBNZW51SXRlbS5Pbk1lbnVJdGVtQ2xpY2tMaXN0ZW5lciB7CisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIENsYXNzW10gUEFSQU1fVFlQRVMgPSBuZXcgQ2xhc3NbXSB7IE1lbnVJdGVtLmNsYXNzIH07CisgICAgICAgIAorICAgICAgICBwcml2YXRlIENvbnRleHQgbUNvbnRleHQ7CisgICAgICAgIHByaXZhdGUgTWV0aG9kIG1NZXRob2Q7CisgICAgICAgIAorICAgICAgICBwdWJsaWMgSW5mbGF0ZWRPbk1lbnVJdGVtQ2xpY2tMaXN0ZW5lcihDb250ZXh0IGNvbnRleHQsIFN0cmluZyBtZXRob2ROYW1lKSB7CisgICAgICAgICAgICBtQ29udGV4dCA9IGNvbnRleHQ7CisgICAgICAgICAgICBDbGFzcyBjID0gY29udGV4dC5nZXRDbGFzcygpOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBtTWV0aG9kID0gYy5nZXRNZXRob2QobWV0aG9kTmFtZSwgUEFSQU1fVFlQRVMpOworICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBJbmZsYXRlRXhjZXB0aW9uIGV4ID0gbmV3IEluZmxhdGVFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICAgICAiQ291bGRuJ3QgcmVzb2x2ZSBtZW51IGl0ZW0gb25DbGljayBoYW5kbGVyICIgKyBtZXRob2ROYW1lICsKKyAgICAgICAgICAgICAgICAgICAgICAgICIgaW4gY2xhc3MgIiArIGMuZ2V0TmFtZSgpKTsKKyAgICAgICAgICAgICAgICBleC5pbml0Q2F1c2UoZSk7CisgICAgICAgICAgICAgICAgdGhyb3cgZXg7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIHB1YmxpYyBib29sZWFuIG9uTWVudUl0ZW1DbGljayhNZW51SXRlbSBpdGVtKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGlmIChtTWV0aG9kLmdldFJldHVyblR5cGUoKSA9PSBCb29sZWFuLlRZUEUpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChCb29sZWFuKSBtTWV0aG9kLmludm9rZShtQ29udGV4dCwgaXRlbSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgbU1ldGhvZC5pbnZva2UobUNvbnRleHQsIGl0ZW0pOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIAogICAgIC8qKgogICAgICAqIFN0YXRlIGZvciB0aGUgY3VycmVudCBtZW51LgogICAgICAqIDxwPgpAQCAtMjA1LDYgKzI0NCwyMCBAQAogICAgICAgICBwcml2YXRlIGJvb2xlYW4gaXRlbVZpc2libGU7CiAgICAgICAgIHByaXZhdGUgYm9vbGVhbiBpdGVtRW5hYmxlZDsKICAgICAgICAgCisgICAgICAgIC8qKgorICAgICAgICAgKiBTeW5jIHRvIGF0dHJzLnhtbCBlbnVtLCB2YWx1ZXMgaW4gTWVudUl0ZW06CisgICAgICAgICAqIC0gMDogbmV2ZXIKKyAgICAgICAgICogLSAxOiBpZlJvb20KKyAgICAgICAgICogLSAyOiBhbHdheXMKKyAgICAgICAgICogLSAtMTogU2FmZSBzZW50aW5lbCBmb3IgIm5vIHZhbHVlIi4KKyAgICAgICAgICovCisgICAgICAgIHByaXZhdGUgaW50IGl0ZW1TaG93QXNBY3Rpb247CisKKyAgICAgICAgcHJpdmF0ZSBpbnQgaXRlbUFjdGlvblZpZXdMYXlvdXQ7CisgICAgICAgIHByaXZhdGUgU3RyaW5nIGl0ZW1BY3Rpb25WaWV3Q2xhc3NOYW1lOworICAgICAgICAKKyAgICAgICAgcHJpdmF0ZSBTdHJpbmcgaXRlbUxpc3RlbmVyTWV0aG9kTmFtZTsKKyAgICAgICAgCiAgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBkZWZhdWx0R3JvdXBJZCA9IE5PX0lEOwogICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgZGVmYXVsdEl0ZW1JZCA9IE5PX0lEOwogICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgZGVmYXVsdEl0ZW1DYXRlZ29yeSA9IDA7CkBAIC0yNzYsNiArMzI5LDEwIEBACiAgICAgICAgICAgICBpdGVtQ2hlY2tlZCA9IGEuZ2V0Qm9vbGVhbihjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZS5NZW51SXRlbV9jaGVja2VkLCBkZWZhdWx0SXRlbUNoZWNrZWQpOwogICAgICAgICAgICAgaXRlbVZpc2libGUgPSBhLmdldEJvb2xlYW4oY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZWFibGUuTWVudUl0ZW1fdmlzaWJsZSwgZ3JvdXBWaXNpYmxlKTsKICAgICAgICAgICAgIGl0ZW1FbmFibGVkID0gYS5nZXRCb29sZWFuKGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLk1lbnVJdGVtX2VuYWJsZWQsIGdyb3VwRW5hYmxlZCk7CisgICAgICAgICAgICBpdGVtU2hvd0FzQWN0aW9uID0gYS5nZXRJbnQoY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZWFibGUuTWVudUl0ZW1fc2hvd0FzQWN0aW9uLCAtMSk7CisgICAgICAgICAgICBpdGVtTGlzdGVuZXJNZXRob2ROYW1lID0gYS5nZXRTdHJpbmcoY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZWFibGUuTWVudUl0ZW1fb25DbGljayk7CisgICAgICAgICAgICBpdGVtQWN0aW9uVmlld0xheW91dCA9IGEuZ2V0UmVzb3VyY2VJZChjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZS5NZW51SXRlbV9hY3Rpb25MYXlvdXQsIDApOworICAgICAgICAgICAgaXRlbUFjdGlvblZpZXdDbGFzc05hbWUgPSBhLmdldFN0cmluZyhjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZS5NZW51SXRlbV9hY3Rpb25WaWV3Q2xhc3MpOwogICAgICAgICAgICAgCiAgICAgICAgICAgICBhLnJlY3ljbGUoKTsKICAgICAgICAgICAgIApAQCAtMjk5LDkgKzM1NiwzOCBAQAogICAgICAgICAgICAgICAgIC5zZXRJY29uKGl0ZW1JY29uUmVzSWQpCiAgICAgICAgICAgICAgICAgLnNldEFscGhhYmV0aWNTaG9ydGN1dChpdGVtQWxwaGFiZXRpY1Nob3J0Y3V0KQogICAgICAgICAgICAgICAgIC5zZXROdW1lcmljU2hvcnRjdXQoaXRlbU51bWVyaWNTaG9ydGN1dCk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGlmIChpdGVtU2hvd0FzQWN0aW9uID49IDApIHsKKyAgICAgICAgICAgICAgICBpdGVtLnNldFNob3dBc0FjdGlvbihpdGVtU2hvd0FzQWN0aW9uKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIAorICAgICAgICAgICAgaWYgKGl0ZW1MaXN0ZW5lck1ldGhvZE5hbWUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGlmIChtQ29udGV4dC5pc1Jlc3RyaWN0ZWQoKSkgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJUaGUgYW5kcm9pZDpvbkNsaWNrIGF0dHJpYnV0ZSBjYW5ub3QgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgImJlIHVzZWQgd2l0aGluIGEgcmVzdHJpY3RlZCBjb250ZXh0Iik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGl0ZW0uc2V0T25NZW51SXRlbUNsaWNrTGlzdGVuZXIoCisgICAgICAgICAgICAgICAgICAgICAgICBuZXcgSW5mbGF0ZWRPbk1lbnVJdGVtQ2xpY2tMaXN0ZW5lcihtQ29udGV4dCwgaXRlbUxpc3RlbmVyTWV0aG9kTmFtZSkpOworICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBpZiAoaXRlbUNoZWNrYWJsZSA+PSAyKSB7Ci0gICAgICAgICAgICAgICAgKChNZW51SXRlbUltcGwpIGl0ZW0pLnNldEV4Y2x1c2l2ZUNoZWNrYWJsZSh0cnVlKTsKKyAgICAgICAgICAgIGlmIChpdGVtIGluc3RhbmNlb2YgTWVudUl0ZW1JbXBsKSB7CisgICAgICAgICAgICAgICAgTWVudUl0ZW1JbXBsIGltcGwgPSAoTWVudUl0ZW1JbXBsKSBpdGVtOworICAgICAgICAgICAgICAgIGlmIChpdGVtQ2hlY2thYmxlID49IDIpIHsKKyAgICAgICAgICAgICAgICAgICAgaW1wbC5zZXRFeGNsdXNpdmVDaGVja2FibGUodHJ1ZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoaXRlbUFjdGlvblZpZXdDbGFzc05hbWUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIGZpbmFsIENsYXNzPD8+IGNsYXp6ID0gQ2xhc3MuZm9yTmFtZShpdGVtQWN0aW9uVmlld0NsYXNzTmFtZSk7CisgICAgICAgICAgICAgICAgICAgIENvbnN0cnVjdG9yPD8+IGMgPSBjbGF6ei5nZXRDb25zdHJ1Y3RvcihBQ1RJT05fVklFV19DT05TVFJVQ1RPUl9TSUdOQVRVUkUpOworICAgICAgICAgICAgICAgICAgICBpdGVtLnNldEFjdGlvblZpZXcoKFZpZXcpIGMubmV3SW5zdGFuY2UobUNvbnRleHQpKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSW5mbGF0ZUV4Y2VwdGlvbihlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgaWYgKGl0ZW1BY3Rpb25WaWV3TGF5b3V0ID4gMCkgeworICAgICAgICAgICAgICAgIGZpbmFsIExheW91dEluZmxhdGVyIGluZmxhdGVyID0gTGF5b3V0SW5mbGF0ZXIuZnJvbShtQ29udGV4dCk7CisgICAgICAgICAgICAgICAgaXRlbS5zZXRBY3Rpb25WaWV3KGluZmxhdGVyLmluZmxhdGUoaXRlbUFjdGlvblZpZXdMYXlvdXQsIG51bGwpKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICAKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvTWVudUl0ZW0uamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvTWVudUl0ZW0uamF2YQppbmRleCBmY2ViZWM1Li44YjlkNjU5IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC92aWV3L01lbnVJdGVtLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9NZW51SXRlbS5qYXZhCkBAIC0zMSw2ICszMSwyMSBAQAogICogRm9yIGEgZmVhdHVyZSBzZXQgb2Ygc3BlY2lmaWMgbWVudSB0eXBlcywgc2VlIHtAbGluayBNZW51fS4KICAqLwogcHVibGljIGludGVyZmFjZSBNZW51SXRlbSB7CisgICAgLyoKKyAgICAgKiBUaGVzZSBzaG91bGQgYmUga2VwdCBpbiBzeW5jIHdpdGggYXR0cnMueG1sIGVudW0gY29uc3RhbnRzIGZvciBzaG93QXNBY3Rpb24KKyAgICAgKi8KKyAgICAvKiogTmV2ZXIgc2hvdyB0aGlzIGl0ZW0gYXMgYSBidXR0b24gaW4gYW4gQWN0aW9uIEJhci4gKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTSE9XX0FTX0FDVElPTl9ORVZFUiA9IDA7CisgICAgLyoqIFNob3cgdGhpcyBpdGVtIGFzIGEgYnV0dG9uIGluIGFuIEFjdGlvbiBCYXIgaWYgdGhlIHN5c3RlbSBkZWNpZGVzIHRoZXJlIGlzIHJvb20gZm9yIGl0LiAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNIT1dfQVNfQUNUSU9OX0lGX1JPT00gPSAxOworICAgIC8qKgorICAgICAqIEFsd2F5cyBzaG93IHRoaXMgaXRlbSBhcyBhIGJ1dHRvbiBpbiBhbiBBY3Rpb24gQmFyLgorICAgICAqIFVzZSBzcGFyaW5nbHkhIElmIHRvbyBtYW55IGl0ZW1zIGFyZSBzZXQgdG8gYWx3YXlzIHNob3cgaW4gdGhlIEFjdGlvbiBCYXIgaXQgY2FuCisgICAgICogY3Jvd2QgdGhlIEFjdGlvbiBCYXIgYW5kIGRlZ3JhZGUgdGhlIHVzZXIgZXhwZXJpZW5jZSBvbiBkZXZpY2VzIHdpdGggc21hbGxlciBzY3JlZW5zLgorICAgICAqIEEgZ29vZCBydWxlIG9mIHRodW1iIGlzIHRvIGhhdmUgbm8gbW9yZSB0aGFuIDIgaXRlbXMgc2V0IHRvIGFsd2F5cyBzaG93IGF0IGEgdGltZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTSE9XX0FTX0FDVElPTl9BTFdBWVMgPSAyOworICAgIAogICAgIC8qKgogICAgICAqIEludGVyZmFjZSBkZWZpbml0aW9uIGZvciBhIGNhbGxiYWNrIHRvIGJlIGludm9rZWQgd2hlbiBhIG1lbnUgaXRlbSBpcwogICAgICAqIGNsaWNrZWQuCkBAIC0zODEsNCArMzk2LDM4IEBACiAgICAgICogICAgICAgICBtZW51IGl0ZW0gdG8gdGhlIG1lbnUuIFRoaXMgY2FuIGJlIG51bGwuCiAgICAgICovCiAgICAgcHVibGljIENvbnRleHRNZW51SW5mbyBnZXRNZW51SW5mbygpOworICAgIAorICAgIC8qKgorICAgICAqIFNldHMgaG93IHRoaXMgaXRlbSBzaG91bGQgZGlzcGxheSBpbiB0aGUgcHJlc2VuY2Ugb2YgYW4gQWN0aW9uIEJhci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBhY3Rpb25FbnVtIEhvdyB0aGUgaXRlbSBzaG91bGQgZGlzcGxheS4gT25lIG9mCisgICAgICoge0BsaW5rICNTSE9XX0FTX0FDVElPTl9BTFdBWVN9LCB7QGxpbmsgI1NIT1dfQVNfQUNUSU9OX0lGX1JPT019LCBvcgorICAgICAqIHtAbGluayAjU0hPV19BU19BQ1RJT05fTkVWRVJ9LiBTSE9XX0FTX0FDVElPTl9ORVZFUiBpcyB0aGUgZGVmYXVsdC4KKyAgICAgKiAKKyAgICAgKiBAc2VlIGFuZHJvaWQuYXBwLkFjdGlvbkJhcgorICAgICAqIEBzZWUgI3NldEFjdGlvblZpZXcoVmlldykKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRTaG93QXNBY3Rpb24oaW50IGFjdGlvbkVudW0pOworCisgICAgLyoqCisgICAgICogU2V0IGFuIGFjdGlvbiB2aWV3IGZvciB0aGlzIG1lbnUgaXRlbS4gQW4gYWN0aW9uIHZpZXcgd2lsbCBiZSBkaXNwbGF5ZWQgaW4gcGxhY2UKKyAgICAgKiBvZiBhbiBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBtZW51IGl0ZW0gZWxlbWVudCBpbiB0aGUgVUkgd2hlbiB0aGlzIGl0ZW0gaXMgc2hvd24KKyAgICAgKiBhcyBhbiBhY3Rpb24gd2l0aGluIGEgcGFyZW50LgorICAgICAqCisgICAgICogQHBhcmFtIHZpZXcgVmlldyB0byB1c2UgZm9yIHByZXNlbnRpbmcgdGhpcyBpdGVtIHRvIHRoZSB1c2VyLgorICAgICAqIEByZXR1cm4gVGhpcyBJdGVtIHNvIGFkZGl0aW9uYWwgc2V0dGVycyBjYW4gYmUgY2FsbGVkLgorICAgICAqCisgICAgICogQHNlZSAjc2V0U2hvd0FzQWN0aW9uKGludCkKKyAgICAgKi8KKyAgICBwdWJsaWMgTWVudUl0ZW0gc2V0QWN0aW9uVmlldyhWaWV3IHZpZXcpOworCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgY3VycmVudGx5IHNldCBhY3Rpb24gdmlldyBmb3IgdGhpcyBtZW51IGl0ZW0uCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFRoaXMgaXRlbSdzIGFjdGlvbiB2aWV3CisgICAgICoKKyAgICAgKiBAc2VlICNzZXRBY3Rpb25WaWV3KFZpZXcpCisgICAgICogQHNlZSAjc2V0U2hvd0FzQWN0aW9uKGludCkKKyAgICAgKi8KKyAgICBwdWJsaWMgVmlldyBnZXRBY3Rpb25WaWV3KCk7CiB9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9TY2FsZUdlc3R1cmVEZXRlY3Rvci5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9TY2FsZUdlc3R1cmVEZXRlY3Rvci5qYXZhCmluZGV4IDA5OTk1OTguLjE3YjVkZDcgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvU2NhbGVHZXN0dXJlRGV0ZWN0b3IuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC92aWV3L1NjYWxlR2VzdHVyZURldGVjdG9yLmphdmEKQEAgLTI1LDcgKzI1LDcgQEAKICAqIHVzaW5nIHRoZSBzdXBwbGllZCB7QGxpbmsgTW90aW9uRXZlbnR9cy4gVGhlIHtAbGluayBPblNjYWxlR2VzdHVyZUxpc3RlbmVyfQogICogY2FsbGJhY2sgd2lsbCBub3RpZnkgdXNlcnMgd2hlbiBhIHBhcnRpY3VsYXIgZ2VzdHVyZSBldmVudCBoYXMgb2NjdXJyZWQuCiAgKiBUaGlzIGNsYXNzIHNob3VsZCBvbmx5IGJlIHVzZWQgd2l0aCB7QGxpbmsgTW90aW9uRXZlbnR9cyByZXBvcnRlZCB2aWEgdG91Y2guCi0gKiAKKyAqCiAgKiBUbyB1c2UgdGhpcyBjbGFzczoKICAqIDx1bD4KICAqICA8bGk+Q3JlYXRlIGFuIGluc3RhbmNlIG9mIHRoZSB7QGNvZGUgU2NhbGVHZXN0dXJlRGV0ZWN0b3J9IGZvciB5b3VyCkBAIC00MSw3ICs0MSw3IEBACiAgICAgICogSWYgeW91IHdhbnQgdG8gbGlzdGVuIGZvciBhbGwgdGhlIGRpZmZlcmVudCBnZXN0dXJlcyB0aGVuIGltcGxlbWVudAogICAgICAqIHRoaXMgaW50ZXJmYWNlLiBJZiB5b3Ugb25seSB3YW50IHRvIGxpc3RlbiBmb3IgYSBzdWJzZXQgaXQgbWlnaHQKICAgICAgKiBiZSBlYXNpZXIgdG8gZXh0ZW5kIHtAbGluayBTaW1wbGVPblNjYWxlR2VzdHVyZUxpc3RlbmVyfS4KLSAgICAgKiAKKyAgICAgKgogICAgICAqIEFuIGFwcGxpY2F0aW9uIHdpbGwgcmVjZWl2ZSBldmVudHMgaW4gdGhlIGZvbGxvd2luZyBvcmRlcjoKICAgICAgKiA8dWw+CiAgICAgICogIDxsaT5PbmUge0BsaW5rIE9uU2NhbGVHZXN0dXJlTGlzdGVuZXIjb25TY2FsZUJlZ2luKFNjYWxlR2VzdHVyZURldGVjdG9yKX0KQEAgLTUzLDcgKzUzLDcgQEAKICAgICAgICAgLyoqCiAgICAgICAgICAqIFJlc3BvbmRzIHRvIHNjYWxpbmcgZXZlbnRzIGZvciBhIGdlc3R1cmUgaW4gcHJvZ3Jlc3MuCiAgICAgICAgICAqIFJlcG9ydGVkIGJ5IHBvaW50ZXIgbW90aW9uLgotICAgICAgICAgKiAKKyAgICAgICAgICoKICAgICAgICAgICogQHBhcmFtIGRldGVjdG9yIFRoZSBkZXRlY3RvciByZXBvcnRpbmcgdGhlIGV2ZW50IC0gdXNlIHRoaXMgdG8KICAgICAgICAgICogICAgICAgICAgcmV0cmlldmUgZXh0ZW5kZWQgaW5mbyBhYm91dCBldmVudCBzdGF0ZS4KICAgICAgICAgICogQHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgZGV0ZWN0b3Igc2hvdWxkIGNvbnNpZGVyIHRoaXMgZXZlbnQKQEAgLTY4LDcgKzY4LDcgQEAKICAgICAgICAgLyoqCiAgICAgICAgICAqIFJlc3BvbmRzIHRvIHRoZSBiZWdpbm5pbmcgb2YgYSBzY2FsaW5nIGdlc3R1cmUuIFJlcG9ydGVkIGJ5CiAgICAgICAgICAqIG5ldyBwb2ludGVycyBnb2luZyBkb3duLgotICAgICAgICAgKiAKKyAgICAgICAgICoKICAgICAgICAgICogQHBhcmFtIGRldGVjdG9yIFRoZSBkZXRlY3RvciByZXBvcnRpbmcgdGhlIGV2ZW50IC0gdXNlIHRoaXMgdG8KICAgICAgICAgICogICAgICAgICAgcmV0cmlldmUgZXh0ZW5kZWQgaW5mbyBhYm91dCBldmVudCBzdGF0ZS4KICAgICAgICAgICogQHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgZGV0ZWN0b3Igc2hvdWxkIGNvbnRpbnVlIHJlY29nbml6aW5nCkBAIC04MiwxNyArODIsMTcgQEAKICAgICAgICAgLyoqCiAgICAgICAgICAqIFJlc3BvbmRzIHRvIHRoZSBlbmQgb2YgYSBzY2FsZSBnZXN0dXJlLiBSZXBvcnRlZCBieSBleGlzdGluZwogICAgICAgICAgKiBwb2ludGVycyBnb2luZyB1cC4KLSAgICAgICAgICogCisgICAgICAgICAqCiAgICAgICAgICAqIE9uY2UgYSBzY2FsZSBoYXMgZW5kZWQsIHtAbGluayBTY2FsZUdlc3R1cmVEZXRlY3RvciNnZXRGb2N1c1goKX0KICAgICAgICAgICogYW5kIHtAbGluayBTY2FsZUdlc3R1cmVEZXRlY3RvciNnZXRGb2N1c1koKX0gd2lsbCByZXR1cm4gdGhlIGxvY2F0aW9uCiAgICAgICAgICAqIG9mIHRoZSBwb2ludGVyIHJlbWFpbmluZyBvbiB0aGUgc2NyZWVuLgotICAgICAgICAgKiAKKyAgICAgICAgICoKICAgICAgICAgICogQHBhcmFtIGRldGVjdG9yIFRoZSBkZXRlY3RvciByZXBvcnRpbmcgdGhlIGV2ZW50IC0gdXNlIHRoaXMgdG8KICAgICAgICAgICogICAgICAgICAgcmV0cmlldmUgZXh0ZW5kZWQgaW5mbyBhYm91dCBldmVudCBzdGF0ZS4KICAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyB2b2lkIG9uU2NhbGVFbmQoU2NhbGVHZXN0dXJlRGV0ZWN0b3IgZGV0ZWN0b3IpOwogICAgIH0KLSAgICAKKwogICAgIC8qKgogICAgICAqIEEgY29udmVuaWVuY2UgY2xhc3MgdG8gZXh0ZW5kIHdoZW4geW91IG9ubHkgd2FudCB0byBsaXN0ZW4gZm9yIGEgc3Vic2V0CiAgICAgICogb2Ygc2NhbGluZy1yZWxhdGVkIGV2ZW50cy4gVGhpcyBpbXBsZW1lbnRzIGFsbCBtZXRob2RzIGluCkBAIC0xMDEsNyArMTAxLDcgQEAKICAgICAgKiB7QGNvZGUgZmFsc2V9IHNvIHRoYXQgYSBzdWJjbGFzcyBjYW4gcmV0cmlldmUgdGhlIGFjY3VtdWxhdGVkIHNjYWxlCiAgICAgICogZmFjdG9yIGluIGFuIG92ZXJyaWRkZW4gb25TY2FsZUVuZC4KICAgICAgKiB7QGxpbmsgT25TY2FsZUdlc3R1cmVMaXN0ZW5lciNvblNjYWxlQmVnaW4oU2NhbGVHZXN0dXJlRGV0ZWN0b3IpfSByZXR1cm5zCi0gICAgICoge0Bjb2RlIHRydWV9LiAKKyAgICAgKiB7QGNvZGUgdHJ1ZX0uCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBjbGFzcyBTaW1wbGVPblNjYWxlR2VzdHVyZUxpc3RlbmVyIGltcGxlbWVudHMgT25TY2FsZUdlc3R1cmVMaXN0ZW5lciB7CiAKQEAgLTE0OCw3ICsxNDgsNyBAQAogICAgIHByaXZhdGUgZmxvYXQgbUN1cnJQcmVzc3VyZTsKICAgICBwcml2YXRlIGZsb2F0IG1QcmV2UHJlc3N1cmU7CiAgICAgcHJpdmF0ZSBsb25nIG1UaW1lRGVsdGE7Ci0gICAgCisKICAgICBwcml2YXRlIGZpbmFsIGZsb2F0IG1FZGdlU2xvcDsKICAgICBwcml2YXRlIGZsb2F0IG1SaWdodFNsb3BFZGdlOwogICAgIHByaXZhdGUgZmxvYXQgbUJvdHRvbVNsb3BFZGdlOwpAQCAtMjE3LDcgKzIxNyw3IEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAKKwogICAgICAgICAgICAgY2FzZSBNb3Rpb25FdmVudC5BQ1RJT05fTU9WRToKICAgICAgICAgICAgICAgICBpZiAobVNsb3BweUdlc3R1cmUpIHsKICAgICAgICAgICAgICAgICAgICAgLy8gSW5pdGlhdGUgc2xvcHB5IGdlc3R1cmVzIGlmIHdlJ3ZlIG1vdmVkIG91dHNpZGUgb2YgdGhlIHNsb3AgYXJlYS4KQEAgLTI0OSw3ICsyNDksNyBAQAogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIAorCiAgICAgICAgICAgICBjYXNlIE1vdGlvbkV2ZW50LkFDVElPTl9QT0lOVEVSX1VQOgogICAgICAgICAgICAgICAgIGlmIChtU2xvcHB5R2VzdHVyZSkgewogICAgICAgICAgICAgICAgICAgICAvLyBTZXQgZm9jdXMgcG9pbnQgdG8gdGhlIHJlbWFpbmluZyBmaW5nZXIKQEAgLTMwNywxNyArMzA3LDE3IEBACiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIGhhbmRsZWQ7CiAgICAgfQotICAgIAorCiAgICAgLyoqCi0gICAgICogTW90aW9uRXZlbnQgaGFzIG5vIGdldFJhd1goaW50KSBtZXRob2Q7IHNpbXVsYXRlIGl0IHBlbmRpbmcgZnV0dXJlIEFQSSBhcHByb3ZhbC4gCisgICAgICogTW90aW9uRXZlbnQgaGFzIG5vIGdldFJhd1goaW50KSBtZXRob2Q7IHNpbXVsYXRlIGl0IHBlbmRpbmcgZnV0dXJlIEFQSSBhcHByb3ZhbC4KICAgICAgKi8KICAgICBwcml2YXRlIHN0YXRpYyBmbG9hdCBnZXRSYXdYKE1vdGlvbkV2ZW50IGV2ZW50LCBpbnQgcG9pbnRlckluZGV4KSB7CiAgICAgICAgIGZsb2F0IG9mZnNldCA9IGV2ZW50LmdldFJhd1goKSAtIGV2ZW50LmdldFgoKTsKICAgICAgICAgcmV0dXJuIGV2ZW50LmdldFgocG9pbnRlckluZGV4KSArIG9mZnNldDsKICAgICB9Ci0gICAgCisKICAgICAvKioKLSAgICAgKiBNb3Rpb25FdmVudCBoYXMgbm8gZ2V0UmF3WShpbnQpIG1ldGhvZDsgc2ltdWxhdGUgaXQgcGVuZGluZyBmdXR1cmUgQVBJIGFwcHJvdmFsLiAKKyAgICAgKiBNb3Rpb25FdmVudCBoYXMgbm8gZ2V0UmF3WShpbnQpIG1ldGhvZDsgc2ltdWxhdGUgaXQgcGVuZGluZyBmdXR1cmUgQVBJIGFwcHJvdmFsLgogICAgICAqLwogICAgIHByaXZhdGUgc3RhdGljIGZsb2F0IGdldFJhd1koTW90aW9uRXZlbnQgZXZlbnQsIGludCBwb2ludGVySW5kZXgpIHsKICAgICAgICAgZmxvYXQgb2Zmc2V0ID0gZXZlbnQuZ2V0UmF3WSgpIC0gZXZlbnQuZ2V0WSgpOwpAQCAtMzkwLDcgKzM5MCw3IEBACiAgICAgICogcmVtYWluaW5nIHBvaW50ZXIgb24gdGhlIHNjcmVlbi4KICAgICAgKiBJZiB7QGxpbmsgI2lzSW5Qcm9ncmVzcygpfSB3b3VsZCByZXR1cm4gZmFsc2UsIHRoZSByZXN1bHQgb2YgdGhpcwogICAgICAqIGZ1bmN0aW9uIGlzIHVuZGVmaW5lZC4KLSAgICAgKiAKKyAgICAgKgogICAgICAqIEByZXR1cm4gWCBjb29yZGluYXRlIG9mIHRoZSBmb2NhbCBwb2ludCBpbiBwaXhlbHMuCiAgICAgICovCiAgICAgcHVibGljIGZsb2F0IGdldEZvY3VzWCgpIHsKQEAgLTQwNSw3ICs0MDUsNyBAQAogICAgICAqIHJlbWFpbmluZyBwb2ludGVyIG9uIHRoZSBzY3JlZW4uCiAgICAgICogSWYge0BsaW5rICNpc0luUHJvZ3Jlc3MoKX0gd291bGQgcmV0dXJuIGZhbHNlLCB0aGUgcmVzdWx0IG9mIHRoaXMKICAgICAgKiBmdW5jdGlvbiBpcyB1bmRlZmluZWQuCi0gICAgICogCisgICAgICoKICAgICAgKiBAcmV0dXJuIFkgY29vcmRpbmF0ZSBvZiB0aGUgZm9jYWwgcG9pbnQgaW4gcGl4ZWxzLgogICAgICAqLwogICAgIHB1YmxpYyBmbG9hdCBnZXRGb2N1c1koKSB7CkBAIC00MTUsNyArNDE1LDcgQEAKICAgICAvKioKICAgICAgKiBSZXR1cm4gdGhlIGN1cnJlbnQgZGlzdGFuY2UgYmV0d2VlbiB0aGUgdHdvIHBvaW50ZXJzIGZvcm1pbmcgdGhlCiAgICAgICogZ2VzdHVyZSBpbiBwcm9ncmVzcy4KLSAgICAgKiAKKyAgICAgKgogICAgICAqIEByZXR1cm4gRGlzdGFuY2UgYmV0d2VlbiBwb2ludGVycyBpbiBwaXhlbHMuCiAgICAgICovCiAgICAgcHVibGljIGZsb2F0IGdldEN1cnJlbnRTcGFuKCkgewpAQCAtNDI4LDkgKzQyOCwyOSBAQAogICAgIH0KIAogICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgY3VycmVudCB4IGRpc3RhbmNlIGJldHdlZW4gdGhlIHR3byBwb2ludGVycyBmb3JtaW5nIHRoZQorICAgICAqIGdlc3R1cmUgaW4gcHJvZ3Jlc3MuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIERpc3RhbmNlIGJldHdlZW4gcG9pbnRlcnMgaW4gcGl4ZWxzLgorICAgICAqLworICAgIHB1YmxpYyBmbG9hdCBnZXRDdXJyZW50U3BhblgoKSB7CisgICAgICAgIHJldHVybiBtQ3VyckZpbmdlckRpZmZYOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgY3VycmVudCB5IGRpc3RhbmNlIGJldHdlZW4gdGhlIHR3byBwb2ludGVycyBmb3JtaW5nIHRoZQorICAgICAqIGdlc3R1cmUgaW4gcHJvZ3Jlc3MuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIERpc3RhbmNlIGJldHdlZW4gcG9pbnRlcnMgaW4gcGl4ZWxzLgorICAgICAqLworICAgIHB1YmxpYyBmbG9hdCBnZXRDdXJyZW50U3BhblkoKSB7CisgICAgICAgIHJldHVybiBtQ3VyckZpbmdlckRpZmZZOworICAgIH0KKworICAgIC8qKgogICAgICAqIFJldHVybiB0aGUgcHJldmlvdXMgZGlzdGFuY2UgYmV0d2VlbiB0aGUgdHdvIHBvaW50ZXJzIGZvcm1pbmcgdGhlCiAgICAgICogZ2VzdHVyZSBpbiBwcm9ncmVzcy4KLSAgICAgKiAKKyAgICAgKgogICAgICAqIEByZXR1cm4gUHJldmlvdXMgZGlzdGFuY2UgYmV0d2VlbiBwb2ludGVycyBpbiBwaXhlbHMuCiAgICAgICovCiAgICAgcHVibGljIGZsb2F0IGdldFByZXZpb3VzU3BhbigpIHsKQEAgLTQ0MywxMCArNDYzLDMwIEBACiAgICAgfQogCiAgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBwcmV2aW91cyB4IGRpc3RhbmNlIGJldHdlZW4gdGhlIHR3byBwb2ludGVycyBmb3JtaW5nIHRoZQorICAgICAqIGdlc3R1cmUgaW4gcHJvZ3Jlc3MuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFByZXZpb3VzIGRpc3RhbmNlIGJldHdlZW4gcG9pbnRlcnMgaW4gcGl4ZWxzLgorICAgICAqLworICAgIHB1YmxpYyBmbG9hdCBnZXRQcmV2aW91c1NwYW5YKCkgeworICAgICAgICByZXR1cm4gbVByZXZGaW5nZXJEaWZmWDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHByZXZpb3VzIHkgZGlzdGFuY2UgYmV0d2VlbiB0aGUgdHdvIHBvaW50ZXJzIGZvcm1pbmcgdGhlCisgICAgICogZ2VzdHVyZSBpbiBwcm9ncmVzcy4KKyAgICAgKgorICAgICAqIEByZXR1cm4gUHJldmlvdXMgZGlzdGFuY2UgYmV0d2VlbiBwb2ludGVycyBpbiBwaXhlbHMuCisgICAgICovCisgICAgcHVibGljIGZsb2F0IGdldFByZXZpb3VzU3BhblkoKSB7CisgICAgICAgIHJldHVybiBtUHJldkZpbmdlckRpZmZZOworICAgIH0KKworICAgIC8qKgogICAgICAqIFJldHVybiB0aGUgc2NhbGluZyBmYWN0b3IgZnJvbSB0aGUgcHJldmlvdXMgc2NhbGUgZXZlbnQgdG8gdGhlIGN1cnJlbnQKICAgICAgKiBldmVudC4gVGhpcyB2YWx1ZSBpcyBkZWZpbmVkIGFzCiAgICAgICogKHtAbGluayAjZ2V0Q3VycmVudFNwYW4oKX0gLyB7QGxpbmsgI2dldFByZXZpb3VzU3BhbigpfSkuCi0gICAgICogCisgICAgICoKICAgICAgKiBAcmV0dXJuIFRoZSBjdXJyZW50IHNjYWxpbmcgZmFjdG9yLgogICAgICAqLwogICAgIHB1YmxpYyBmbG9hdCBnZXRTY2FsZUZhY3RvcigpIHsKQEAgLTQ1NSwyMCArNDk1LDIwIEBACiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIG1TY2FsZUZhY3RvcjsKICAgICB9Ci0gICAgCisKICAgICAvKioKICAgICAgKiBSZXR1cm4gdGhlIHRpbWUgZGlmZmVyZW5jZSBpbiBtaWxsaXNlY29uZHMgYmV0d2VlbiB0aGUgcHJldmlvdXMKICAgICAgKiBhY2NlcHRlZCBzY2FsaW5nIGV2ZW50IGFuZCB0aGUgY3VycmVudCBzY2FsaW5nIGV2ZW50LgotICAgICAqIAorICAgICAqCiAgICAgICogQHJldHVybiBUaW1lIGRpZmZlcmVuY2Ugc2luY2UgdGhlIGxhc3Qgc2NhbGluZyBldmVudCBpbiBtaWxsaXNlY29uZHMuCiAgICAgICovCiAgICAgcHVibGljIGxvbmcgZ2V0VGltZURlbHRhKCkgewogICAgICAgICByZXR1cm4gbVRpbWVEZWx0YTsKICAgICB9Ci0gICAgCisKICAgICAvKioKICAgICAgKiBSZXR1cm4gdGhlIGV2ZW50IHRpbWUgb2YgdGhlIGN1cnJlbnQgZXZlbnQgYmVpbmcgcHJvY2Vzc2VkLgotICAgICAqIAorICAgICAqCiAgICAgICogQHJldHVybiBDdXJyZW50IGV2ZW50IHRpbWUgaW4gbWlsbGlzZWNvbmRzLgogICAgICAqLwogICAgIHB1YmxpYyBsb25nIGdldEV2ZW50VGltZSgpIHsKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvVmVsb2NpdHlUcmFja2VyLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC92aWV3L1ZlbG9jaXR5VHJhY2tlci5qYXZhCmluZGV4IGZiODhjNzEuLmIxZmRlYzggMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvVmVsb2NpdHlUcmFja2VyLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9WZWxvY2l0eVRyYWNrZXIuamF2YQpAQCAtNDEsNiArNDEsNyBAQAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNQVhfQUdFX01JTExJU0VDT05EUyA9IDIwMDsKICAgICAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUE9JTlRFUl9QT09MX0NBUEFDSVRZID0gMjA7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IElOVkFMSURfUE9JTlRFUiA9IC0xOwogCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgUG9vbDxWZWxvY2l0eVRyYWNrZXI+IHNQb29sID0gUG9vbHMuc3luY2hyb25pemVkUG9vbCgKICAgICAgICAgICAgIFBvb2xzLmZpbml0ZVBvb2wobmV3IFBvb2xhYmxlTWFuYWdlcjxWZWxvY2l0eVRyYWNrZXI+KCkgewpAQCAtNzYsNiArNzcsNyBAQAogICAgIHByaXZhdGUgUG9pbnRlciBtUG9pbnRlckxpc3RIZWFkOyAvLyBzb3J0ZWQgYnkgaWQgaW4gaW5jcmVhc2luZyBvcmRlcgogICAgIHByaXZhdGUgaW50IG1MYXN0VG91Y2hJbmRleDsKICAgICBwcml2YXRlIGludCBtR2VuZXJhdGlvbjsKKyAgICBwcml2YXRlIGludCBtQWN0aXZlUG9pbnRlcklkOwogCiAgICAgcHJpdmF0ZSBWZWxvY2l0eVRyYWNrZXIgbU5leHQ7CiAKQEAgLTEyNSw2ICsxMjcsNyBAQAogICAgICAgICAKICAgICAgICAgbVBvaW50ZXJMaXN0SGVhZCA9IG51bGw7CiAgICAgICAgIG1MYXN0VG91Y2hJbmRleCA9IDA7CisgICAgICAgIG1BY3RpdmVQb2ludGVySWQgPSBJTlZBTElEX1BPSU5URVI7CiAgICAgfQogICAgIAogICAgIC8qKgpAQCAtMTgwLDYgKzE4MywxMCBAQAogICAgICAgICAgICAgICAgIC8vIFBvaW50ZXIgd2VudCBkb3duLiAgQWRkIGl0IHRvIHRoZSBsaXN0LgogICAgICAgICAgICAgICAgIC8vIFdyaXRlIGEgc2VudGluZWwgYXQgdGhlIGVuZCBvZiB0aGUgcGFzdFRpbWUgdHJhY2Ugc28gd2Ugd2lsbCBiZSBhYmxlIHRvCiAgICAgICAgICAgICAgICAgLy8gdGVsbCB3aGVuIHRoZSB0cmFjZSBzdGFydGVkLgorICAgICAgICAgICAgICAgIGlmIChtQWN0aXZlUG9pbnRlcklkID09IElOVkFMSURfUE9JTlRFUikgeworICAgICAgICAgICAgICAgICAgICAvLyBDb25ncmF0dWxhdGlvbnMhIFlvdSdyZSB0aGUgbmV3IGFjdGl2ZSBwb2ludGVyIQorICAgICAgICAgICAgICAgICAgICBtQWN0aXZlUG9pbnRlcklkID0gcG9pbnRlcklkOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBwb2ludGVyID0gb2J0YWluUG9pbnRlcigpOwogICAgICAgICAgICAgICAgIHBvaW50ZXIuaWQgPSBwb2ludGVySWQ7CiAgICAgICAgICAgICAgICAgcG9pbnRlci5wYXN0VGltZVtsYXN0VG91Y2hJbmRleF0gPSBMb25nLk1JTl9WQUxVRTsKQEAgLTIxNCw2ICsyMjEsNyBAQAogICAgICAgICBwcmV2aW91c1BvaW50ZXIgPSBudWxsOwogICAgICAgICBmb3IgKFBvaW50ZXIgcG9pbnRlciA9IG1Qb2ludGVyTGlzdEhlYWQ7IHBvaW50ZXIgIT0gbnVsbDsgKSB7CiAgICAgICAgICAgICBmaW5hbCBQb2ludGVyIG5leHRQb2ludGVyID0gcG9pbnRlci5uZXh0OworICAgICAgICAgICAgZmluYWwgaW50IHBvaW50ZXJJZCA9IHBvaW50ZXIuaWQ7CiAgICAgICAgICAgICBpZiAocG9pbnRlci5nZW5lcmF0aW9uICE9IGdlbmVyYXRpb24pIHsKICAgICAgICAgICAgICAgICAvLyBQb2ludGVyIHdlbnQgdXAuICBSZW1vdmUgaXQgZnJvbSB0aGUgbGlzdC4KICAgICAgICAgICAgICAgICBpZiAocHJldmlvdXNQb2ludGVyID09IG51bGwpIHsKQEAgLTIyMiw2ICsyMzAsMTIgQEAKICAgICAgICAgICAgICAgICAgICAgcHJldmlvdXNQb2ludGVyLm5leHQgPSBuZXh0UG9pbnRlcjsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgcmVsZWFzZVBvaW50ZXIocG9pbnRlcik7CisKKyAgICAgICAgICAgICAgICBpZiAocG9pbnRlcklkID09IG1BY3RpdmVQb2ludGVySWQpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gUGljayBhIG5ldyBhY3RpdmUgcG9pbnRlci4gSG93IGlzIGFyYml0cmFyeS4KKyAgICAgICAgICAgICAgICAgICAgbUFjdGl2ZVBvaW50ZXJJZCA9IG1Qb2ludGVyTGlzdEhlYWQgIT0gbnVsbCA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVBvaW50ZXJMaXN0SGVhZC5pZCA6IElOVkFMSURfUE9JTlRFUjsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIHByZXZpb3VzUG9pbnRlciA9IHBvaW50ZXI7CiAgICAgICAgICAgICB9CkBAIC0zMzQsNyArMzQ4LDcgQEAKICAgICAgKiBAcmV0dXJuIFRoZSBwcmV2aW91c2x5IGNvbXB1dGVkIFggdmVsb2NpdHkuCiAgICAgICovCiAgICAgcHVibGljIGZsb2F0IGdldFhWZWxvY2l0eSgpIHsKLSAgICAgICAgUG9pbnRlciBwb2ludGVyID0gZ2V0UG9pbnRlcigwKTsKKyAgICAgICAgUG9pbnRlciBwb2ludGVyID0gZ2V0UG9pbnRlcihtQWN0aXZlUG9pbnRlcklkKTsKICAgICAgICAgcmV0dXJuIHBvaW50ZXIgIT0gbnVsbCA/IHBvaW50ZXIueFZlbG9jaXR5IDogMDsKICAgICB9CiAgICAgCkBAIC0zNDUsNyArMzU5LDcgQEAKICAgICAgKiBAcmV0dXJuIFRoZSBwcmV2aW91c2x5IGNvbXB1dGVkIFkgdmVsb2NpdHkuCiAgICAgICovCiAgICAgcHVibGljIGZsb2F0IGdldFlWZWxvY2l0eSgpIHsKLSAgICAgICAgUG9pbnRlciBwb2ludGVyID0gZ2V0UG9pbnRlcigwKTsKKyAgICAgICAgUG9pbnRlciBwb2ludGVyID0gZ2V0UG9pbnRlcihtQWN0aXZlUG9pbnRlcklkKTsKICAgICAgICAgcmV0dXJuIHBvaW50ZXIgIT0gbnVsbCA/IHBvaW50ZXIueVZlbG9jaXR5IDogMDsKICAgICB9CiAgICAgCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC92aWV3L1ZpZXcuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvVmlldy5qYXZhCmluZGV4IGI3OTRhNmEuLmQwNDAwN2MgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvVmlldy5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvVmlldy5qYXZhCkBAIC0xNiwxNCArMTYsMTIgQEAKIAogcGFja2FnZSBhbmRyb2lkLnZpZXc7CiAKLWltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC5SOwotaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnZpZXcubWVudS5NZW51QnVpbGRlcjsKLQogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuQ29uZmlndXJhdGlvbjsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlJlc291cmNlczsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlR5cGVkQXJyYXk7CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5CaXRtYXA7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5DYW1lcmE7CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5DYW52YXM7CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5JbnRlcnBvbGF0b3I7CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5MaW5lYXJHcmFkaWVudDsKQEAgLTM0LDYgKzMyLDcgQEAKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlBvcnRlckR1ZmY7CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5Qb3J0ZXJEdWZmWGZlcm1vZGU7CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5SZWN0OworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUmVjdEY7CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5SZWdpb247CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5TaGFkZXI7CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5Db2xvckRyYXdhYmxlOwpAQCAtNDcsOCArNDYsNiBAQAogaW1wb3J0IGFuZHJvaWQub3MuU3lzdGVtQ2xvY2s7CiBpbXBvcnQgYW5kcm9pZC5vcy5TeXN0ZW1Qcm9wZXJ0aWVzOwogaW1wb3J0IGFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQ7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkNvbmZpZzsKLWltcG9ydCBhbmRyb2lkLnV0aWwuRXZlbnRMb2c7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKIGltcG9ydCBhbmRyb2lkLnV0aWwuUG9vbDsKIGltcG9ydCBhbmRyb2lkLnV0aWwuUG9vbGFibGU7CkBAIC02NSwxMiArNjIsMTQgQEAKIGltcG9ydCBhbmRyb2lkLnZpZXcuaW5wdXRtZXRob2QuSW5wdXRDb25uZWN0aW9uOwogaW1wb3J0IGFuZHJvaWQudmlldy5pbnB1dG1ldGhvZC5JbnB1dE1ldGhvZE1hbmFnZXI7CiBpbXBvcnQgYW5kcm9pZC53aWRnZXQuU2Nyb2xsQmFyRHJhd2FibGU7CitpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwuUjsKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC52aWV3Lm1lbnUuTWVudUJ1aWxkZXI7CiAKLWltcG9ydCBqYXZhLmxhbmcucmVmLlNvZnRSZWZlcmVuY2U7CiBpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7CiBpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5MaXN0OwogaW1wb3J0IGphdmEudXRpbC5XZWFrSGFzaE1hcDsKIAogLyoqCkBAIC0yNjAsNyArMjU5LDggQEAKICAqIDx1bD4KICAqIDxsaT5EZWZpbmUgYSBCdXR0b24gaW4gdGhlIGxheW91dCBmaWxlIGFuZCBhc3NpZ24gaXQgYSB1bmlxdWUgSUQuCiAgKiA8cHJlPgotICogJmx0O0J1dHRvbiBpZD0iQCtpZC9teV9idXR0b24iCisgKiAmbHQ7QnV0dG9uCisgKiAgICAgYW5kcm9pZDppZD0iQCtpZC9teV9idXR0b24iCiAgKiAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKICAqICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKICAqICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvbXlfYnV0dG9uX3RleHQiLyZndDsKQEAgLTkxNyw2ICs5MTcsMjAgQEAKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBIQVBUSUNfRkVFREJBQ0tfRU5BQkxFRCA9IDB4MTAwMDAwMDA7CiAKICAgICAvKioKKyAgICAgKiA8cD5JbmRpY2F0ZXMgdGhhdCB0aGUgdmlldyBoaWVyYXJjaHkgc2hvdWxkIHN0b3Agc2F2aW5nIHN0YXRlIHdoZW4KKyAgICAgKiBpdCByZWFjaGVzIHRoaXMgdmlldy4gIElmIHN0YXRlIHNhdmluZyBpcyBpbml0aWF0ZWQgaW1tZWRpYXRlbHkgYXQKKyAgICAgKiB0aGUgdmlldywgaXQgd2lsbCBiZSBhbGxvd2VkLgorICAgICAqIHtAaGlkZX0KKyAgICAgKi8KKyAgICBzdGF0aWMgZmluYWwgaW50IFBBUkVOVF9TQVZFX0RJU0FCTEVEID0gMHgyMDAwMDAwMDsKKworICAgIC8qKgorICAgICAqIDxwPk1hc2sgZm9yIHVzZSB3aXRoIHNldEZsYWdzIGluZGljYXRpbmcgYml0cyB1c2VkIGZvciBQQVJFTlRfU0FWRV9ESVNBQkxFRC48L3A+CisgICAgICoge0BoaWRlfQorICAgICAqLworICAgIHN0YXRpYyBmaW5hbCBpbnQgUEFSRU5UX1NBVkVfRElTQUJMRURfTUFTSyA9IDB4MjAwMDAwMDA7CisKKyAgICAvKioKICAgICAgKiBWaWV3IGZsYWcgaW5kaWNhdGluZyB3aGV0aGVyIHtAbGluayAjYWRkRm9jdXNhYmxlcyhBcnJheUxpc3QsIGludCwgaW50KX0KICAgICAgKiBzaG91bGQgYWRkIGFsbCBmb2N1c2FibGUgVmlld3MgcmVnYXJkbGVzcyBpZiB0aGV5IGFyZSBmb2N1c2FibGUgaW4gdG91Y2ggbW9kZS4KICAgICAgKi8KQEAgLTk3Miw3ICs5ODYsNyBAQAogICAgICAqIEBzZWUgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZQogICAgICAqIEBzZWUgI2dldERyYXdhYmxlU3RhdGUoKQogICAgICAqLwotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50W10gRU1QVFlfU1RBVEVfU0VUID0ge307CisgICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnRbXSBFTVBUWV9TVEFURV9TRVQ7CiAgICAgLyoqCiAgICAgICogSW5kaWNhdGVzIHRoZSB2aWV3IGlzIGVuYWJsZWQuIFN0YXRlcyBhcmUgdXNlZCB3aXRoCiAgICAgICoge0BsaW5rIGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuRHJhd2FibGV9IHRvIGNoYW5nZSB0aGUgZHJhd2luZyBvZiB0aGUKQEAgLTk4MSw3ICs5OTUsNyBAQAogICAgICAqIEBzZWUgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZQogICAgICAqIEBzZWUgI2dldERyYXdhYmxlU3RhdGUoKQogICAgICAqLwotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50W10gRU5BQkxFRF9TVEFURV9TRVQgPSB7Ui5hdHRyLnN0YXRlX2VuYWJsZWR9OworICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50W10gRU5BQkxFRF9TVEFURV9TRVQ7CiAgICAgLyoqCiAgICAgICogSW5kaWNhdGVzIHRoZSB2aWV3IGlzIGZvY3VzZWQuIFN0YXRlcyBhcmUgdXNlZCB3aXRoCiAgICAgICoge0BsaW5rIGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuRHJhd2FibGV9IHRvIGNoYW5nZSB0aGUgZHJhd2luZyBvZiB0aGUKQEAgLTk5MCw3ICsxMDA0LDcgQEAKICAgICAgKiBAc2VlIGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuRHJhd2FibGUKICAgICAgKiBAc2VlICNnZXREcmF3YWJsZVN0YXRlKCkKICAgICAgKi8KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludFtdIEZPQ1VTRURfU1RBVEVfU0VUID0ge1IuYXR0ci5zdGF0ZV9mb2N1c2VkfTsKKyAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludFtdIEZPQ1VTRURfU1RBVEVfU0VUOwogICAgIC8qKgogICAgICAqIEluZGljYXRlcyB0aGUgdmlldyBpcyBzZWxlY3RlZC4gU3RhdGVzIGFyZSB1c2VkIHdpdGgKICAgICAgKiB7QGxpbmsgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZX0gdG8gY2hhbmdlIHRoZSBkcmF3aW5nIG9mIHRoZQpAQCAtOTk5LDcgKzEwMTMsNyBAQAogICAgICAqIEBzZWUgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZQogICAgICAqIEBzZWUgI2dldERyYXdhYmxlU3RhdGUoKQogICAgICAqLwotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50W10gU0VMRUNURURfU1RBVEVfU0VUID0ge1IuYXR0ci5zdGF0ZV9zZWxlY3RlZH07CisgICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnRbXSBTRUxFQ1RFRF9TVEFURV9TRVQ7CiAgICAgLyoqCiAgICAgICogSW5kaWNhdGVzIHRoZSB2aWV3IGlzIHByZXNzZWQuIFN0YXRlcyBhcmUgdXNlZCB3aXRoCiAgICAgICoge0BsaW5rIGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuRHJhd2FibGV9IHRvIGNoYW5nZSB0aGUgZHJhd2luZyBvZiB0aGUKQEAgLTEwMDksNyArMTAyMyw3IEBACiAgICAgICogQHNlZSAjZ2V0RHJhd2FibGVTdGF0ZSgpCiAgICAgICogQGhpZGUKICAgICAgKi8KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludFtdIFBSRVNTRURfU1RBVEVfU0VUID0ge1IuYXR0ci5zdGF0ZV9wcmVzc2VkfTsKKyAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludFtdIFBSRVNTRURfU1RBVEVfU0VUOwogICAgIC8qKgogICAgICAqIEluZGljYXRlcyB0aGUgdmlldydzIHdpbmRvdyBoYXMgZm9jdXMuIFN0YXRlcyBhcmUgdXNlZCB3aXRoCiAgICAgICoge0BsaW5rIGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuRHJhd2FibGV9IHRvIGNoYW5nZSB0aGUgZHJhd2luZyBvZiB0aGUKQEAgLTEwMTgsOCArMTAzMiw3IEBACiAgICAgICogQHNlZSBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlCiAgICAgICogQHNlZSAjZ2V0RHJhd2FibGVTdGF0ZSgpCiAgICAgICovCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnRbXSBXSU5ET1dfRk9DVVNFRF9TVEFURV9TRVQgPQotICAgICAgICAgICAge1IuYXR0ci5zdGF0ZV93aW5kb3dfZm9jdXNlZH07CisgICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnRbXSBXSU5ET1dfRk9DVVNFRF9TVEFURV9TRVQ7CiAgICAgLy8gRG91YmxlcwogICAgIC8qKgogICAgICAqIEluZGljYXRlcyB0aGUgdmlldyBpcyBlbmFibGVkIGFuZCBoYXMgdGhlIGZvY3VzLgpAQCAtMTAyNyw0OCArMTA0MCw0MiBAQAogICAgICAqIEBzZWUgI0VOQUJMRURfU1RBVEVfU0VUCiAgICAgICogQHNlZSAjRk9DVVNFRF9TVEFURV9TRVQKICAgICAgKi8KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludFtdIEVOQUJMRURfRk9DVVNFRF9TVEFURV9TRVQgPQotICAgICAgICAgICAgc3RhdGVTZXRVbmlvbihFTkFCTEVEX1NUQVRFX1NFVCwgRk9DVVNFRF9TVEFURV9TRVQpOworICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50W10gRU5BQkxFRF9GT0NVU0VEX1NUQVRFX1NFVDsKICAgICAvKioKICAgICAgKiBJbmRpY2F0ZXMgdGhlIHZpZXcgaXMgZW5hYmxlZCBhbmQgc2VsZWN0ZWQuCiAgICAgICoKICAgICAgKiBAc2VlICNFTkFCTEVEX1NUQVRFX1NFVAogICAgICAqIEBzZWUgI1NFTEVDVEVEX1NUQVRFX1NFVAogICAgICAqLwotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50W10gRU5BQkxFRF9TRUxFQ1RFRF9TVEFURV9TRVQgPQotICAgICAgICAgICAgc3RhdGVTZXRVbmlvbihFTkFCTEVEX1NUQVRFX1NFVCwgU0VMRUNURURfU1RBVEVfU0VUKTsKKyAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludFtdIEVOQUJMRURfU0VMRUNURURfU1RBVEVfU0VUOwogICAgIC8qKgogICAgICAqIEluZGljYXRlcyB0aGUgdmlldyBpcyBlbmFibGVkIGFuZCB0aGF0IGl0cyB3aW5kb3cgaGFzIGZvY3VzLgogICAgICAqCiAgICAgICogQHNlZSAjRU5BQkxFRF9TVEFURV9TRVQKICAgICAgKiBAc2VlICNXSU5ET1dfRk9DVVNFRF9TVEFURV9TRVQKICAgICAgKi8KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludFtdIEVOQUJMRURfV0lORE9XX0ZPQ1VTRURfU1RBVEVfU0VUID0KLSAgICAgICAgICAgIHN0YXRlU2V0VW5pb24oRU5BQkxFRF9TVEFURV9TRVQsIFdJTkRPV19GT0NVU0VEX1NUQVRFX1NFVCk7CisgICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnRbXSBFTkFCTEVEX1dJTkRPV19GT0NVU0VEX1NUQVRFX1NFVDsKICAgICAvKioKICAgICAgKiBJbmRpY2F0ZXMgdGhlIHZpZXcgaXMgZm9jdXNlZCBhbmQgc2VsZWN0ZWQuCiAgICAgICoKICAgICAgKiBAc2VlICNGT0NVU0VEX1NUQVRFX1NFVAogICAgICAqIEBzZWUgI1NFTEVDVEVEX1NUQVRFX1NFVAogICAgICAqLwotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50W10gRk9DVVNFRF9TRUxFQ1RFRF9TVEFURV9TRVQgPQotICAgICAgICAgICAgc3RhdGVTZXRVbmlvbihGT0NVU0VEX1NUQVRFX1NFVCwgU0VMRUNURURfU1RBVEVfU0VUKTsKKyAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludFtdIEZPQ1VTRURfU0VMRUNURURfU1RBVEVfU0VUOwogICAgIC8qKgogICAgICAqIEluZGljYXRlcyB0aGUgdmlldyBoYXMgdGhlIGZvY3VzIGFuZCB0aGF0IGl0cyB3aW5kb3cgaGFzIHRoZSBmb2N1cy4KICAgICAgKgogICAgICAqIEBzZWUgI0ZPQ1VTRURfU1RBVEVfU0VUCiAgICAgICogQHNlZSAjV0lORE9XX0ZPQ1VTRURfU1RBVEVfU0VUCiAgICAgICovCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnRbXSBGT0NVU0VEX1dJTkRPV19GT0NVU0VEX1NUQVRFX1NFVCA9Ci0gICAgICAgICAgICBzdGF0ZVNldFVuaW9uKEZPQ1VTRURfU1RBVEVfU0VULCBXSU5ET1dfRk9DVVNFRF9TVEFURV9TRVQpOworICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50W10gRk9DVVNFRF9XSU5ET1dfRk9DVVNFRF9TVEFURV9TRVQ7CiAgICAgLyoqCiAgICAgICogSW5kaWNhdGVzIHRoZSB2aWV3IGlzIHNlbGVjdGVkIGFuZCB0aGF0IGl0cyB3aW5kb3cgaGFzIHRoZSBmb2N1cy4KICAgICAgKgogICAgICAqIEBzZWUgI1NFTEVDVEVEX1NUQVRFX1NFVAogICAgICAqIEBzZWUgI1dJTkRPV19GT0NVU0VEX1NUQVRFX1NFVAogICAgICAqLwotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50W10gU0VMRUNURURfV0lORE9XX0ZPQ1VTRURfU1RBVEVfU0VUID0KLSAgICAgICAgICAgIHN0YXRlU2V0VW5pb24oU0VMRUNURURfU1RBVEVfU0VULCBXSU5ET1dfRk9DVVNFRF9TVEFURV9TRVQpOworICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50W10gU0VMRUNURURfV0lORE9XX0ZPQ1VTRURfU1RBVEVfU0VUOwogICAgIC8vIFRyaXBsZXMKICAgICAvKioKICAgICAgKiBJbmRpY2F0ZXMgdGhlIHZpZXcgaXMgZW5hYmxlZCwgZm9jdXNlZCBhbmQgc2VsZWN0ZWQuCkBAIC0xMDc3LDggKzEwODQsNyBAQAogICAgICAqIEBzZWUgI0ZPQ1VTRURfU1RBVEVfU0VUCiAgICAgICogQHNlZSAjU0VMRUNURURfU1RBVEVfU0VUCiAgICAgICovCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnRbXSBFTkFCTEVEX0ZPQ1VTRURfU0VMRUNURURfU1RBVEVfU0VUID0KLSAgICAgICAgICAgIHN0YXRlU2V0VW5pb24oRU5BQkxFRF9GT0NVU0VEX1NUQVRFX1NFVCwgU0VMRUNURURfU1RBVEVfU0VUKTsKKyAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludFtdIEVOQUJMRURfRk9DVVNFRF9TRUxFQ1RFRF9TVEFURV9TRVQ7CiAgICAgLyoqCiAgICAgICogSW5kaWNhdGVzIHRoZSB2aWV3IGlzIGVuYWJsZWQsIGZvY3VzZWQgYW5kIGl0cyB3aW5kb3cgaGFzIHRoZSBmb2N1cy4KICAgICAgKgpAQCAtMTA4Niw4ICsxMDkyLDcgQEAKICAgICAgKiBAc2VlICNGT0NVU0VEX1NUQVRFX1NFVAogICAgICAqIEBzZWUgI1dJTkRPV19GT0NVU0VEX1NUQVRFX1NFVAogICAgICAqLwotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50W10gRU5BQkxFRF9GT0NVU0VEX1dJTkRPV19GT0NVU0VEX1NUQVRFX1NFVCA9Ci0gICAgICAgICAgICBzdGF0ZVNldFVuaW9uKEVOQUJMRURfRk9DVVNFRF9TVEFURV9TRVQsIFdJTkRPV19GT0NVU0VEX1NUQVRFX1NFVCk7CisgICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnRbXSBFTkFCTEVEX0ZPQ1VTRURfV0lORE9XX0ZPQ1VTRURfU1RBVEVfU0VUOwogICAgIC8qKgogICAgICAqIEluZGljYXRlcyB0aGUgdmlldyBpcyBlbmFibGVkLCBzZWxlY3RlZCBhbmQgaXRzIHdpbmRvdyBoYXMgdGhlIGZvY3VzLgogICAgICAqCkBAIC0xMDk1LDggKzExMDAsNyBAQAogICAgICAqIEBzZWUgI1NFTEVDVEVEX1NUQVRFX1NFVAogICAgICAqIEBzZWUgI1dJTkRPV19GT0NVU0VEX1NUQVRFX1NFVAogICAgICAqLwotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50W10gRU5BQkxFRF9TRUxFQ1RFRF9XSU5ET1dfRk9DVVNFRF9TVEFURV9TRVQgPQotICAgICAgICAgICAgc3RhdGVTZXRVbmlvbihFTkFCTEVEX1NFTEVDVEVEX1NUQVRFX1NFVCwgV0lORE9XX0ZPQ1VTRURfU1RBVEVfU0VUKTsKKyAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludFtdIEVOQUJMRURfU0VMRUNURURfV0lORE9XX0ZPQ1VTRURfU1RBVEVfU0VUOwogICAgIC8qKgogICAgICAqIEluZGljYXRlcyB0aGUgdmlldyBpcyBmb2N1c2VkLCBzZWxlY3RlZCBhbmQgaXRzIHdpbmRvdyBoYXMgdGhlIGZvY3VzLgogICAgICAqCkBAIC0xMTA0LDggKzExMDgsNyBAQAogICAgICAqIEBzZWUgI1NFTEVDVEVEX1NUQVRFX1NFVAogICAgICAqIEBzZWUgI1dJTkRPV19GT0NVU0VEX1NUQVRFX1NFVAogICAgICAqLwotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50W10gRk9DVVNFRF9TRUxFQ1RFRF9XSU5ET1dfRk9DVVNFRF9TVEFURV9TRVQgPQotICAgICAgICAgICAgc3RhdGVTZXRVbmlvbihGT0NVU0VEX1NFTEVDVEVEX1NUQVRFX1NFVCwgV0lORE9XX0ZPQ1VTRURfU1RBVEVfU0VUKTsKKyAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludFtdIEZPQ1VTRURfU0VMRUNURURfV0lORE9XX0ZPQ1VTRURfU1RBVEVfU0VUOwogICAgIC8qKgogICAgICAqIEluZGljYXRlcyB0aGUgdmlldyBpcyBlbmFibGVkLCBmb2N1c2VkLCBzZWxlY3RlZCBhbmQgaXRzIHdpbmRvdwogICAgICAqIGhhcyB0aGUgZm9jdXMuCkBAIC0xMTE1LDI4ICsxMTE4LDIxIEBACiAgICAgICogQHNlZSAjU0VMRUNURURfU1RBVEVfU0VUCiAgICAgICogQHNlZSAjV0lORE9XX0ZPQ1VTRURfU1RBVEVfU0VUCiAgICAgICovCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnRbXSBFTkFCTEVEX0ZPQ1VTRURfU0VMRUNURURfV0lORE9XX0ZPQ1VTRURfU1RBVEVfU0VUID0KLSAgICAgICAgICAgIHN0YXRlU2V0VW5pb24oRU5BQkxFRF9GT0NVU0VEX1NFTEVDVEVEX1NUQVRFX1NFVCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgV0lORE9XX0ZPQ1VTRURfU1RBVEVfU0VUKTsKLQorICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50W10gRU5BQkxFRF9GT0NVU0VEX1NFTEVDVEVEX1dJTkRPV19GT0NVU0VEX1NUQVRFX1NFVDsKICAgICAvKioKICAgICAgKiBJbmRpY2F0ZXMgdGhlIHZpZXcgaXMgcHJlc3NlZCBhbmQgaXRzIHdpbmRvdyBoYXMgdGhlIGZvY3VzLgogICAgICAqCiAgICAgICogQHNlZSAjUFJFU1NFRF9TVEFURV9TRVQKICAgICAgKiBAc2VlICNXSU5ET1dfRk9DVVNFRF9TVEFURV9TRVQKICAgICAgKi8KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludFtdIFBSRVNTRURfV0lORE9XX0ZPQ1VTRURfU1RBVEVfU0VUID0KLSAgICAgICAgICAgIHN0YXRlU2V0VW5pb24oUFJFU1NFRF9TVEFURV9TRVQsIFdJTkRPV19GT0NVU0VEX1NUQVRFX1NFVCk7Ci0KKyAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludFtdIFBSRVNTRURfV0lORE9XX0ZPQ1VTRURfU1RBVEVfU0VUOwogICAgIC8qKgogICAgICAqIEluZGljYXRlcyB0aGUgdmlldyBpcyBwcmVzc2VkIGFuZCBzZWxlY3RlZC4KICAgICAgKgogICAgICAqIEBzZWUgI1BSRVNTRURfU1RBVEVfU0VUCiAgICAgICogQHNlZSAjU0VMRUNURURfU1RBVEVfU0VUCiAgICAgICovCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnRbXSBQUkVTU0VEX1NFTEVDVEVEX1NUQVRFX1NFVCA9Ci0gICAgICAgICAgICBzdGF0ZVNldFVuaW9uKFBSRVNTRURfU1RBVEVfU0VULCBTRUxFQ1RFRF9TVEFURV9TRVQpOwotCisgICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnRbXSBQUkVTU0VEX1NFTEVDVEVEX1NUQVRFX1NFVDsKICAgICAvKioKICAgICAgKiBJbmRpY2F0ZXMgdGhlIHZpZXcgaXMgcHJlc3NlZCwgc2VsZWN0ZWQgYW5kIGl0cyB3aW5kb3cgaGFzIHRoZSBmb2N1cy4KICAgICAgKgpAQCAtMTE0NCwxOCArMTE0MCwxNCBAQAogICAgICAqIEBzZWUgI1NFTEVDVEVEX1NUQVRFX1NFVAogICAgICAqIEBzZWUgI1dJTkRPV19GT0NVU0VEX1NUQVRFX1NFVAogICAgICAqLwotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50W10gUFJFU1NFRF9TRUxFQ1RFRF9XSU5ET1dfRk9DVVNFRF9TVEFURV9TRVQgPQotICAgICAgICAgICAgc3RhdGVTZXRVbmlvbihQUkVTU0VEX1NFTEVDVEVEX1NUQVRFX1NFVCwgV0lORE9XX0ZPQ1VTRURfU1RBVEVfU0VUKTsKLQorICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50W10gUFJFU1NFRF9TRUxFQ1RFRF9XSU5ET1dfRk9DVVNFRF9TVEFURV9TRVQ7CiAgICAgLyoqCiAgICAgICogSW5kaWNhdGVzIHRoZSB2aWV3IGlzIHByZXNzZWQgYW5kIGZvY3VzZWQuCiAgICAgICoKICAgICAgKiBAc2VlICNQUkVTU0VEX1NUQVRFX1NFVAogICAgICAqIEBzZWUgI0ZPQ1VTRURfU1RBVEVfU0VUCiAgICAgICovCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnRbXSBQUkVTU0VEX0ZPQ1VTRURfU1RBVEVfU0VUID0KLSAgICAgICAgICAgIHN0YXRlU2V0VW5pb24oUFJFU1NFRF9TVEFURV9TRVQsIEZPQ1VTRURfU1RBVEVfU0VUKTsKLQorICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50W10gUFJFU1NFRF9GT0NVU0VEX1NUQVRFX1NFVDsKICAgICAvKioKICAgICAgKiBJbmRpY2F0ZXMgdGhlIHZpZXcgaXMgcHJlc3NlZCwgZm9jdXNlZCBhbmQgaXRzIHdpbmRvdyBoYXMgdGhlIGZvY3VzLgogICAgICAqCkBAIC0xMTYzLDkgKzExNTUsNyBAQAogICAgICAqIEBzZWUgI0ZPQ1VTRURfU1RBVEVfU0VUCiAgICAgICogQHNlZSAjV0lORE9XX0ZPQ1VTRURfU1RBVEVfU0VUCiAgICAgICovCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnRbXSBQUkVTU0VEX0ZPQ1VTRURfV0lORE9XX0ZPQ1VTRURfU1RBVEVfU0VUID0KLSAgICAgICAgICAgIHN0YXRlU2V0VW5pb24oUFJFU1NFRF9GT0NVU0VEX1NUQVRFX1NFVCwgV0lORE9XX0ZPQ1VTRURfU1RBVEVfU0VUKTsKLQorICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50W10gUFJFU1NFRF9GT0NVU0VEX1dJTkRPV19GT0NVU0VEX1NUQVRFX1NFVDsKICAgICAvKioKICAgICAgKiBJbmRpY2F0ZXMgdGhlIHZpZXcgaXMgcHJlc3NlZCwgZm9jdXNlZCBhbmQgc2VsZWN0ZWQuCiAgICAgICoKQEAgLTExNzMsOSArMTE2Myw3IEBACiAgICAgICogQHNlZSAjU0VMRUNURURfU1RBVEVfU0VUCiAgICAgICogQHNlZSAjRk9DVVNFRF9TVEFURV9TRVQKICAgICAgKi8KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludFtdIFBSRVNTRURfRk9DVVNFRF9TRUxFQ1RFRF9TVEFURV9TRVQgPQotICAgICAgICAgICAgc3RhdGVTZXRVbmlvbihQUkVTU0VEX0ZPQ1VTRURfU1RBVEVfU0VULCBTRUxFQ1RFRF9TVEFURV9TRVQpOwotCisgICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnRbXSBQUkVTU0VEX0ZPQ1VTRURfU0VMRUNURURfU1RBVEVfU0VUOwogICAgIC8qKgogICAgICAqIEluZGljYXRlcyB0aGUgdmlldyBpcyBwcmVzc2VkLCBmb2N1c2VkLCBzZWxlY3RlZCBhbmQgaXRzIHdpbmRvdyBoYXMgdGhlIGZvY3VzLgogICAgICAqCkBAIC0xMTg0LDE4ICsxMTcyLDE0IEBACiAgICAgICogQHNlZSAjU0VMRUNURURfU1RBVEVfU0VUCiAgICAgICogQHNlZSAjV0lORE9XX0ZPQ1VTRURfU1RBVEVfU0VUCiAgICAgICovCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnRbXSBQUkVTU0VEX0ZPQ1VTRURfU0VMRUNURURfV0lORE9XX0ZPQ1VTRURfU1RBVEVfU0VUID0KLSAgICAgICAgICAgIHN0YXRlU2V0VW5pb24oUFJFU1NFRF9GT0NVU0VEX1NFTEVDVEVEX1NUQVRFX1NFVCwgV0lORE9XX0ZPQ1VTRURfU1RBVEVfU0VUKTsKLQorICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50W10gUFJFU1NFRF9GT0NVU0VEX1NFTEVDVEVEX1dJTkRPV19GT0NVU0VEX1NUQVRFX1NFVDsKICAgICAvKioKICAgICAgKiBJbmRpY2F0ZXMgdGhlIHZpZXcgaXMgcHJlc3NlZCBhbmQgZW5hYmxlZC4KICAgICAgKgogICAgICAqIEBzZWUgI1BSRVNTRURfU1RBVEVfU0VUCiAgICAgICogQHNlZSAjRU5BQkxFRF9TVEFURV9TRVQKICAgICAgKi8KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludFtdIFBSRVNTRURfRU5BQkxFRF9TVEFURV9TRVQgPQotICAgICAgICAgICAgc3RhdGVTZXRVbmlvbihQUkVTU0VEX1NUQVRFX1NFVCwgRU5BQkxFRF9TVEFURV9TRVQpOwotCisgICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnRbXSBQUkVTU0VEX0VOQUJMRURfU1RBVEVfU0VUOwogICAgIC8qKgogICAgICAqIEluZGljYXRlcyB0aGUgdmlldyBpcyBwcmVzc2VkLCBlbmFibGVkIGFuZCBpdHMgd2luZG93IGhhcyB0aGUgZm9jdXMuCiAgICAgICoKQEAgLTEyMDMsOSArMTE4Nyw3IEBACiAgICAgICogQHNlZSAjRU5BQkxFRF9TVEFURV9TRVQKICAgICAgKiBAc2VlICNXSU5ET1dfRk9DVVNFRF9TVEFURV9TRVQKICAgICAgKi8KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludFtdIFBSRVNTRURfRU5BQkxFRF9XSU5ET1dfRk9DVVNFRF9TVEFURV9TRVQgPQotICAgICAgICAgICAgc3RhdGVTZXRVbmlvbihQUkVTU0VEX0VOQUJMRURfU1RBVEVfU0VULCBXSU5ET1dfRk9DVVNFRF9TVEFURV9TRVQpOwotCisgICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnRbXSBQUkVTU0VEX0VOQUJMRURfV0lORE9XX0ZPQ1VTRURfU1RBVEVfU0VUOwogICAgIC8qKgogICAgICAqIEluZGljYXRlcyB0aGUgdmlldyBpcyBwcmVzc2VkLCBlbmFibGVkIGFuZCBzZWxlY3RlZC4KICAgICAgKgpAQCAtMTIxMyw5ICsxMTk1LDcgQEAKICAgICAgKiBAc2VlICNFTkFCTEVEX1NUQVRFX1NFVAogICAgICAqIEBzZWUgI1NFTEVDVEVEX1NUQVRFX1NFVAogICAgICAqLwotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50W10gUFJFU1NFRF9FTkFCTEVEX1NFTEVDVEVEX1NUQVRFX1NFVCA9Ci0gICAgICAgICAgICBzdGF0ZVNldFVuaW9uKFBSRVNTRURfRU5BQkxFRF9TVEFURV9TRVQsIFNFTEVDVEVEX1NUQVRFX1NFVCk7Ci0KKyAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludFtdIFBSRVNTRURfRU5BQkxFRF9TRUxFQ1RFRF9TVEFURV9TRVQ7CiAgICAgLyoqCiAgICAgICogSW5kaWNhdGVzIHRoZSB2aWV3IGlzIHByZXNzZWQsIGVuYWJsZWQsIHNlbGVjdGVkIGFuZCBpdHMgd2luZG93IGhhcyB0aGUKICAgICAgKiBmb2N1cy4KQEAgLTEyMjUsOSArMTIwNSw3IEBACiAgICAgICogQHNlZSAjU0VMRUNURURfU1RBVEVfU0VUCiAgICAgICogQHNlZSAjV0lORE9XX0ZPQ1VTRURfU1RBVEVfU0VUCiAgICAgICovCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnRbXSBQUkVTU0VEX0VOQUJMRURfU0VMRUNURURfV0lORE9XX0ZPQ1VTRURfU1RBVEVfU0VUID0KLSAgICAgICAgICAgIHN0YXRlU2V0VW5pb24oUFJFU1NFRF9FTkFCTEVEX1NFTEVDVEVEX1NUQVRFX1NFVCwgV0lORE9XX0ZPQ1VTRURfU1RBVEVfU0VUKTsKLQorICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50W10gUFJFU1NFRF9FTkFCTEVEX1NFTEVDVEVEX1dJTkRPV19GT0NVU0VEX1NUQVRFX1NFVDsKICAgICAvKioKICAgICAgKiBJbmRpY2F0ZXMgdGhlIHZpZXcgaXMgcHJlc3NlZCwgZW5hYmxlZCBhbmQgZm9jdXNlZC4KICAgICAgKgpAQCAtMTIzNSw5ICsxMjEzLDcgQEAKICAgICAgKiBAc2VlICNFTkFCTEVEX1NUQVRFX1NFVAogICAgICAqIEBzZWUgI0ZPQ1VTRURfU1RBVEVfU0VUCiAgICAgICovCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnRbXSBQUkVTU0VEX0VOQUJMRURfRk9DVVNFRF9TVEFURV9TRVQgPQotICAgICAgICAgICAgc3RhdGVTZXRVbmlvbihQUkVTU0VEX0VOQUJMRURfU1RBVEVfU0VULCBGT0NVU0VEX1NUQVRFX1NFVCk7Ci0KKyAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludFtdIFBSRVNTRURfRU5BQkxFRF9GT0NVU0VEX1NUQVRFX1NFVDsKICAgICAvKioKICAgICAgKiBJbmRpY2F0ZXMgdGhlIHZpZXcgaXMgcHJlc3NlZCwgZW5hYmxlZCwgZm9jdXNlZCBhbmQgaXRzIHdpbmRvdyBoYXMgdGhlCiAgICAgICogZm9jdXMuCkBAIC0xMjQ3LDkgKzEyMjMsNyBAQAogICAgICAqIEBzZWUgI0ZPQ1VTRURfU1RBVEVfU0VUCiAgICAgICogQHNlZSAjV0lORE9XX0ZPQ1VTRURfU1RBVEVfU0VUCiAgICAgICovCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnRbXSBQUkVTU0VEX0VOQUJMRURfRk9DVVNFRF9XSU5ET1dfRk9DVVNFRF9TVEFURV9TRVQgPQotICAgICAgICAgICAgc3RhdGVTZXRVbmlvbihQUkVTU0VEX0VOQUJMRURfRk9DVVNFRF9TVEFURV9TRVQsIFdJTkRPV19GT0NVU0VEX1NUQVRFX1NFVCk7Ci0KKyAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludFtdIFBSRVNTRURfRU5BQkxFRF9GT0NVU0VEX1dJTkRPV19GT0NVU0VEX1NUQVRFX1NFVDsKICAgICAvKioKICAgICAgKiBJbmRpY2F0ZXMgdGhlIHZpZXcgaXMgcHJlc3NlZCwgZW5hYmxlZCwgZm9jdXNlZCBhbmQgc2VsZWN0ZWQuCiAgICAgICoKQEAgLTEyNTgsOSArMTIzMiw3IEBACiAgICAgICogQHNlZSAjU0VMRUNURURfU1RBVEVfU0VUCiAgICAgICogQHNlZSAjRk9DVVNFRF9TVEFURV9TRVQKICAgICAgKi8KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludFtdIFBSRVNTRURfRU5BQkxFRF9GT0NVU0VEX1NFTEVDVEVEX1NUQVRFX1NFVCA9Ci0gICAgICAgICAgICBzdGF0ZVNldFVuaW9uKFBSRVNTRURfRU5BQkxFRF9GT0NVU0VEX1NUQVRFX1NFVCwgU0VMRUNURURfU1RBVEVfU0VUKTsKLQorICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50W10gUFJFU1NFRF9FTkFCTEVEX0ZPQ1VTRURfU0VMRUNURURfU1RBVEVfU0VUOwogICAgIC8qKgogICAgICAqIEluZGljYXRlcyB0aGUgdmlldyBpcyBwcmVzc2VkLCBlbmFibGVkLCBmb2N1c2VkLCBzZWxlY3RlZCBhbmQgaXRzIHdpbmRvdwogICAgICAqIGhhcyB0aGUgZm9jdXMuCkBAIC0xMjcxLDQ3ICsxMjQzLDEzNyBAQAogICAgICAqIEBzZWUgI0ZPQ1VTRURfU1RBVEVfU0VUCiAgICAgICogQHNlZSAjV0lORE9XX0ZPQ1VTRURfU1RBVEVfU0VUCiAgICAgICovCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnRbXSBQUkVTU0VEX0VOQUJMRURfRk9DVVNFRF9TRUxFQ1RFRF9XSU5ET1dfRk9DVVNFRF9TVEFURV9TRVQgPQotICAgICAgICAgICAgc3RhdGVTZXRVbmlvbihQUkVTU0VEX0VOQUJMRURfRk9DVVNFRF9TRUxFQ1RFRF9TVEFURV9TRVQsIFdJTkRPV19GT0NVU0VEX1NUQVRFX1NFVCk7CisgICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnRbXSBQUkVTU0VEX0VOQUJMRURfRk9DVVNFRF9TRUxFQ1RFRF9XSU5ET1dfRk9DVVNFRF9TVEFURV9TRVQ7CiAKICAgICAvKioKICAgICAgKiBUaGUgb3JkZXIgaGVyZSBpcyB2ZXJ5IGltcG9ydGFudCB0byB7QGxpbmsgI2dldERyYXdhYmxlU3RhdGUoKX0KICAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnRbXVtdIFZJRVdfU1RBVEVfU0VUUyA9IHsKLSAgICAgICAgRU1QVFlfU1RBVEVfU0VULCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAwIDAgMCAwIDAKLSAgICAgICAgV0lORE9XX0ZPQ1VTRURfU1RBVEVfU0VULCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAwIDAgMCAwIDEKLSAgICAgICAgU0VMRUNURURfU1RBVEVfU0VULCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAwIDAgMCAxIDAKLSAgICAgICAgU0VMRUNURURfV0lORE9XX0ZPQ1VTRURfU1RBVEVfU0VULCAgICAgICAgICAgICAgICAgICAgICAgICAvLyAwIDAgMCAxIDEKLSAgICAgICAgRk9DVVNFRF9TVEFURV9TRVQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAwIDAgMSAwIDAKLSAgICAgICAgRk9DVVNFRF9XSU5ET1dfRk9DVVNFRF9TVEFURV9TRVQsICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAwIDAgMSAwIDEKLSAgICAgICAgRk9DVVNFRF9TRUxFQ1RFRF9TVEFURV9TRVQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAwIDAgMSAxIDAKLSAgICAgICAgRk9DVVNFRF9TRUxFQ1RFRF9XSU5ET1dfRk9DVVNFRF9TVEFURV9TRVQsICAgICAgICAgICAgICAgICAvLyAwIDAgMSAxIDEKLSAgICAgICAgRU5BQkxFRF9TVEFURV9TRVQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAwIDEgMCAwIDAKLSAgICAgICAgRU5BQkxFRF9XSU5ET1dfRk9DVVNFRF9TVEFURV9TRVQsICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAwIDEgMCAwIDEKLSAgICAgICAgRU5BQkxFRF9TRUxFQ1RFRF9TVEFURV9TRVQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAwIDEgMCAxIDAKLSAgICAgICAgRU5BQkxFRF9TRUxFQ1RFRF9XSU5ET1dfRk9DVVNFRF9TVEFURV9TRVQsICAgICAgICAgICAgICAgICAvLyAwIDEgMCAxIDEKLSAgICAgICAgRU5BQkxFRF9GT0NVU0VEX1NUQVRFX1NFVCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAwIDEgMSAwIDAKLSAgICAgICAgRU5BQkxFRF9GT0NVU0VEX1dJTkRPV19GT0NVU0VEX1NUQVRFX1NFVCwgICAgICAgICAgICAgICAgICAvLyAwIDEgMSAwIDEKLSAgICAgICAgRU5BQkxFRF9GT0NVU0VEX1NFTEVDVEVEX1NUQVRFX1NFVCwgICAgICAgICAgICAgICAgICAgICAgICAvLyAwIDEgMSAxIDAKLSAgICAgICAgRU5BQkxFRF9GT0NVU0VEX1NFTEVDVEVEX1dJTkRPV19GT0NVU0VEX1NUQVRFX1NFVCwgICAgICAgICAvLyAwIDEgMSAxIDEKLSAgICAgICAgUFJFU1NFRF9TVEFURV9TRVQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAxIDAgMCAwIDAKLSAgICAgICAgUFJFU1NFRF9XSU5ET1dfRk9DVVNFRF9TVEFURV9TRVQsICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAxIDAgMCAwIDEKLSAgICAgICAgUFJFU1NFRF9TRUxFQ1RFRF9TVEFURV9TRVQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAxIDAgMCAxIDAKLSAgICAgICAgUFJFU1NFRF9TRUxFQ1RFRF9XSU5ET1dfRk9DVVNFRF9TVEFURV9TRVQsICAgICAgICAgICAgICAgICAvLyAxIDAgMCAxIDEKLSAgICAgICAgUFJFU1NFRF9GT0NVU0VEX1NUQVRFX1NFVCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAxIDAgMSAwIDAKLSAgICAgICAgUFJFU1NFRF9GT0NVU0VEX1dJTkRPV19GT0NVU0VEX1NUQVRFX1NFVCwgICAgICAgICAgICAgICAgICAvLyAxIDAgMSAwIDEKLSAgICAgICAgUFJFU1NFRF9GT0NVU0VEX1NFTEVDVEVEX1NUQVRFX1NFVCwgICAgICAgICAgICAgICAgICAgICAgICAvLyAxIDAgMSAxIDAKLSAgICAgICAgUFJFU1NFRF9GT0NVU0VEX1NFTEVDVEVEX1dJTkRPV19GT0NVU0VEX1NUQVRFX1NFVCwgICAgICAgICAvLyAxIDAgMSAxIDEKLSAgICAgICAgUFJFU1NFRF9FTkFCTEVEX1NUQVRFX1NFVCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAxIDEgMCAwIDAKLSAgICAgICAgUFJFU1NFRF9FTkFCTEVEX1dJTkRPV19GT0NVU0VEX1NUQVRFX1NFVCwgICAgICAgICAgICAgICAgICAvLyAxIDEgMCAwIDEKLSAgICAgICAgUFJFU1NFRF9FTkFCTEVEX1NFTEVDVEVEX1NUQVRFX1NFVCwgICAgICAgICAgICAgICAgICAgICAgICAvLyAxIDEgMCAxIDAKLSAgICAgICAgUFJFU1NFRF9FTkFCTEVEX1NFTEVDVEVEX1dJTkRPV19GT0NVU0VEX1NUQVRFX1NFVCwgICAgICAgICAvLyAxIDEgMCAxIDEKLSAgICAgICAgUFJFU1NFRF9FTkFCTEVEX0ZPQ1VTRURfU1RBVEVfU0VULCAgICAgICAgICAgICAgICAgICAgICAgICAvLyAxIDEgMSAwIDAKLSAgICAgICAgUFJFU1NFRF9FTkFCTEVEX0ZPQ1VTRURfV0lORE9XX0ZPQ1VTRURfU1RBVEVfU0VULCAgICAgICAgICAvLyAxIDEgMSAwIDEKLSAgICAgICAgUFJFU1NFRF9FTkFCTEVEX0ZPQ1VTRURfU0VMRUNURURfU1RBVEVfU0VULCAgICAgICAgICAgICAgICAvLyAxIDEgMSAxIDAKLSAgICAgICAgUFJFU1NFRF9FTkFCTEVEX0ZPQ1VTRURfU0VMRUNURURfV0lORE9XX0ZPQ1VTRURfU1RBVEVfU0VULCAvLyAxIDEgMSAxIDEKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnRbXVtdIFZJRVdfU1RBVEVfU0VUUzsKKworICAgIHN0YXRpYyBmaW5hbCBpbnQgVklFV19TVEFURV9XSU5ET1dfRk9DVVNFRCA9IDE8PDA7CisgICAgc3RhdGljIGZpbmFsIGludCBWSUVXX1NUQVRFX1NFTEVDVEVEID0gMTw8MTsKKyAgICBzdGF0aWMgZmluYWwgaW50IFZJRVdfU1RBVEVfRk9DVVNFRCA9IDE8PDI7CisgICAgc3RhdGljIGZpbmFsIGludCBWSUVXX1NUQVRFX0VOQUJMRUQgPSAxPDwzOworICAgIHN0YXRpYyBmaW5hbCBpbnQgVklFV19TVEFURV9QUkVTU0VEID0gMTw8NDsKKyAgICBzdGF0aWMgZmluYWwgaW50IFZJRVdfU1RBVEVfQUNUSVZBVEVEID0gMTw8NTsKKworICAgIHN0YXRpYyBmaW5hbCBpbnRbXSBWSUVXX1NUQVRFX0lEUyA9IG5ldyBpbnRbXSB7CisgICAgICAgIFIuYXR0ci5zdGF0ZV93aW5kb3dfZm9jdXNlZCwgICAgVklFV19TVEFURV9XSU5ET1dfRk9DVVNFRCwKKyAgICAgICAgUi5hdHRyLnN0YXRlX3NlbGVjdGVkLCAgICAgICAgICBWSUVXX1NUQVRFX1NFTEVDVEVELAorICAgICAgICBSLmF0dHIuc3RhdGVfZm9jdXNlZCwgICAgICAgICAgIFZJRVdfU1RBVEVfRk9DVVNFRCwKKyAgICAgICAgUi5hdHRyLnN0YXRlX2VuYWJsZWQsICAgICAgICAgICBWSUVXX1NUQVRFX0VOQUJMRUQsCisgICAgICAgIFIuYXR0ci5zdGF0ZV9wcmVzc2VkLCAgICAgICAgICAgVklFV19TVEFURV9QUkVTU0VELAorICAgICAgICBSLmF0dHIuc3RhdGVfYWN0aXZhdGVkLCAgICAgICAgIFZJRVdfU1RBVEVfQUNUSVZBVEVELAogICAgIH07CiAKKyAgICBzdGF0aWMgeworICAgICAgICBpbnRbXSBvcmRlcmVkSWRzID0gbmV3IGludFtWSUVXX1NUQVRFX0lEUy5sZW5ndGhdOworICAgICAgICBmb3IgKGludCBpPTA7IGk8Ui5zdHlsZWFibGUuVmlld0RyYXdhYmxlU3RhdGVzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBpbnQgdmlld1N0YXRlID0gUi5zdHlsZWFibGUuVmlld0RyYXdhYmxlU3RhdGVzW2ldOworICAgICAgICAgICAgZm9yIChpbnQgaj0wOyBqPFZJRVdfU1RBVEVfSURTLmxlbmd0aDsgais9MikgeworICAgICAgICAgICAgICAgIGlmIChWSUVXX1NUQVRFX0lEU1tqXSA9PSB2aWV3U3RhdGUpIHsKKyAgICAgICAgICAgICAgICAgICAgb3JkZXJlZElkc1tpKjJdID0gdmlld1N0YXRlOworICAgICAgICAgICAgICAgICAgICBvcmRlcmVkSWRzW2kqMisxXSA9IFZJRVdfU1RBVEVfSURTW2orMV07CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGZpbmFsIGludCBOVU1fQklUUyA9IFZJRVdfU1RBVEVfSURTLmxlbmd0aC8yOworICAgICAgICBWSUVXX1NUQVRFX1NFVFMgPSBuZXcgaW50WzE8PE5VTV9CSVRTXVtdOworICAgICAgICBmb3IgKGludCBpPTA7IGk8VklFV19TVEFURV9TRVRTLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBpbnQgbnVtQml0cyA9IEludGVnZXIuYml0Q291bnQoaSk7CisgICAgICAgICAgICBpbnRbXSBzZXQgPSBuZXcgaW50W251bUJpdHNdOworICAgICAgICAgICAgaW50IHBvcyA9IDA7CisgICAgICAgICAgICBmb3IgKGludCBqPTA7IGo8b3JkZXJlZElkcy5sZW5ndGg7IGorPTIpIHsKKyAgICAgICAgICAgICAgICBpZiAoKGkmb3JkZXJlZElkc1tqKzFdKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChmYWxzZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmkoIlZpZXciLCAiSW5kZXggIyIgKyBpICsgIiBAIG9yZGVyZWQgIyIgKyBqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiByZXNpZD0weCIgKyBJbnRlZ2VyLnRvSGV4U3RyaW5nKG9yZGVyZWRJZHNbal0pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBtYXNrICIgKyBvcmRlcmVkSWRzW2orMV0pOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHNldFtwb3MrK10gPSBvcmRlcmVkSWRzW2pdOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFZJRVdfU1RBVEVfU0VUU1tpXSA9IHNldDsKKyAgICAgICAgfQorCisgICAgICAgIEVNUFRZX1NUQVRFX1NFVCA9IFZJRVdfU1RBVEVfU0VUU1swXTsKKyAgICAgICAgV0lORE9XX0ZPQ1VTRURfU1RBVEVfU0VUID0gVklFV19TVEFURV9TRVRTW1ZJRVdfU1RBVEVfV0lORE9XX0ZPQ1VTRURdOworICAgICAgICBTRUxFQ1RFRF9TVEFURV9TRVQgPSBWSUVXX1NUQVRFX1NFVFNbVklFV19TVEFURV9TRUxFQ1RFRF07CisgICAgICAgIFNFTEVDVEVEX1dJTkRPV19GT0NVU0VEX1NUQVRFX1NFVCA9IFZJRVdfU1RBVEVfU0VUU1sKKyAgICAgICAgICAgICAgICBWSUVXX1NUQVRFX1dJTkRPV19GT0NVU0VEIHwgVklFV19TVEFURV9TRUxFQ1RFRF07CisgICAgICAgIEZPQ1VTRURfU1RBVEVfU0VUID0gVklFV19TVEFURV9TRVRTW1ZJRVdfU1RBVEVfRk9DVVNFRF07CisgICAgICAgIEZPQ1VTRURfV0lORE9XX0ZPQ1VTRURfU1RBVEVfU0VUID0gVklFV19TVEFURV9TRVRTWworICAgICAgICAgICAgICAgIFZJRVdfU1RBVEVfV0lORE9XX0ZPQ1VTRUQgfCBWSUVXX1NUQVRFX0ZPQ1VTRURdOworICAgICAgICBGT0NVU0VEX1NFTEVDVEVEX1NUQVRFX1NFVCA9IFZJRVdfU1RBVEVfU0VUU1sKKyAgICAgICAgICAgICAgICBWSUVXX1NUQVRFX1NFTEVDVEVEIHwgVklFV19TVEFURV9GT0NVU0VEXTsKKyAgICAgICAgRk9DVVNFRF9TRUxFQ1RFRF9XSU5ET1dfRk9DVVNFRF9TVEFURV9TRVQgPSBWSUVXX1NUQVRFX1NFVFNbCisgICAgICAgICAgICAgICAgVklFV19TVEFURV9XSU5ET1dfRk9DVVNFRCB8IFZJRVdfU1RBVEVfU0VMRUNURUQKKyAgICAgICAgICAgICAgICB8IFZJRVdfU1RBVEVfRk9DVVNFRF07CisgICAgICAgIEVOQUJMRURfU1RBVEVfU0VUID0gVklFV19TVEFURV9TRVRTW1ZJRVdfU1RBVEVfRU5BQkxFRF07CisgICAgICAgIEVOQUJMRURfV0lORE9XX0ZPQ1VTRURfU1RBVEVfU0VUID0gVklFV19TVEFURV9TRVRTWworICAgICAgICAgICAgICAgIFZJRVdfU1RBVEVfV0lORE9XX0ZPQ1VTRUQgfCBWSUVXX1NUQVRFX0VOQUJMRURdOworICAgICAgICBFTkFCTEVEX1NFTEVDVEVEX1NUQVRFX1NFVCA9IFZJRVdfU1RBVEVfU0VUU1sKKyAgICAgICAgICAgICAgICBWSUVXX1NUQVRFX1NFTEVDVEVEIHwgVklFV19TVEFURV9FTkFCTEVEXTsKKyAgICAgICAgRU5BQkxFRF9TRUxFQ1RFRF9XSU5ET1dfRk9DVVNFRF9TVEFURV9TRVQgPSBWSUVXX1NUQVRFX1NFVFNbCisgICAgICAgICAgICAgICAgVklFV19TVEFURV9XSU5ET1dfRk9DVVNFRCB8IFZJRVdfU1RBVEVfU0VMRUNURUQKKyAgICAgICAgICAgICAgICB8IFZJRVdfU1RBVEVfRU5BQkxFRF07CisgICAgICAgIEVOQUJMRURfRk9DVVNFRF9TVEFURV9TRVQgPSBWSUVXX1NUQVRFX1NFVFNbCisgICAgICAgICAgICAgICAgVklFV19TVEFURV9GT0NVU0VEIHwgVklFV19TVEFURV9FTkFCTEVEXTsKKyAgICAgICAgRU5BQkxFRF9GT0NVU0VEX1dJTkRPV19GT0NVU0VEX1NUQVRFX1NFVCA9IFZJRVdfU1RBVEVfU0VUU1sKKyAgICAgICAgICAgICAgICBWSUVXX1NUQVRFX1dJTkRPV19GT0NVU0VEIHwgVklFV19TVEFURV9GT0NVU0VECisgICAgICAgICAgICAgICAgfCBWSUVXX1NUQVRFX0VOQUJMRURdOworICAgICAgICBFTkFCTEVEX0ZPQ1VTRURfU0VMRUNURURfU1RBVEVfU0VUID0gVklFV19TVEFURV9TRVRTWworICAgICAgICAgICAgICAgIFZJRVdfU1RBVEVfU0VMRUNURUQgfCBWSUVXX1NUQVRFX0ZPQ1VTRUQKKyAgICAgICAgICAgICAgICB8IFZJRVdfU1RBVEVfRU5BQkxFRF07CisgICAgICAgIEVOQUJMRURfRk9DVVNFRF9TRUxFQ1RFRF9XSU5ET1dfRk9DVVNFRF9TVEFURV9TRVQgPSBWSUVXX1NUQVRFX1NFVFNbCisgICAgICAgICAgICAgICAgVklFV19TVEFURV9XSU5ET1dfRk9DVVNFRCB8IFZJRVdfU1RBVEVfU0VMRUNURUQKKyAgICAgICAgICAgICAgICB8IFZJRVdfU1RBVEVfRk9DVVNFRHwgVklFV19TVEFURV9FTkFCTEVEXTsKKworICAgICAgICBQUkVTU0VEX1NUQVRFX1NFVCA9IFZJRVdfU1RBVEVfU0VUU1tWSUVXX1NUQVRFX1BSRVNTRURdOworICAgICAgICBQUkVTU0VEX1dJTkRPV19GT0NVU0VEX1NUQVRFX1NFVCA9IFZJRVdfU1RBVEVfU0VUU1sKKyAgICAgICAgICAgICAgICBWSUVXX1NUQVRFX1dJTkRPV19GT0NVU0VEIHwgVklFV19TVEFURV9QUkVTU0VEXTsKKyAgICAgICAgUFJFU1NFRF9TRUxFQ1RFRF9TVEFURV9TRVQgPSBWSUVXX1NUQVRFX1NFVFNbCisgICAgICAgICAgICAgICAgVklFV19TVEFURV9TRUxFQ1RFRCB8IFZJRVdfU1RBVEVfUFJFU1NFRF07CisgICAgICAgIFBSRVNTRURfU0VMRUNURURfV0lORE9XX0ZPQ1VTRURfU1RBVEVfU0VUID0gVklFV19TVEFURV9TRVRTWworICAgICAgICAgICAgICAgIFZJRVdfU1RBVEVfV0lORE9XX0ZPQ1VTRUQgfCBWSUVXX1NUQVRFX1NFTEVDVEVECisgICAgICAgICAgICAgICAgfCBWSUVXX1NUQVRFX1BSRVNTRURdOworICAgICAgICBQUkVTU0VEX0ZPQ1VTRURfU1RBVEVfU0VUID0gVklFV19TVEFURV9TRVRTWworICAgICAgICAgICAgICAgIFZJRVdfU1RBVEVfRk9DVVNFRCB8IFZJRVdfU1RBVEVfUFJFU1NFRF07CisgICAgICAgIFBSRVNTRURfRk9DVVNFRF9XSU5ET1dfRk9DVVNFRF9TVEFURV9TRVQgPSBWSUVXX1NUQVRFX1NFVFNbCisgICAgICAgICAgICAgICAgVklFV19TVEFURV9XSU5ET1dfRk9DVVNFRCB8IFZJRVdfU1RBVEVfRk9DVVNFRAorICAgICAgICAgICAgICAgIHwgVklFV19TVEFURV9QUkVTU0VEXTsKKyAgICAgICAgUFJFU1NFRF9GT0NVU0VEX1NFTEVDVEVEX1NUQVRFX1NFVCA9IFZJRVdfU1RBVEVfU0VUU1sKKyAgICAgICAgICAgICAgICBWSUVXX1NUQVRFX1NFTEVDVEVEIHwgVklFV19TVEFURV9GT0NVU0VECisgICAgICAgICAgICAgICAgfCBWSUVXX1NUQVRFX1BSRVNTRURdOworICAgICAgICBQUkVTU0VEX0ZPQ1VTRURfU0VMRUNURURfV0lORE9XX0ZPQ1VTRURfU1RBVEVfU0VUID0gVklFV19TVEFURV9TRVRTWworICAgICAgICAgICAgICAgIFZJRVdfU1RBVEVfV0lORE9XX0ZPQ1VTRUQgfCBWSUVXX1NUQVRFX1NFTEVDVEVECisgICAgICAgICAgICAgICAgfCBWSUVXX1NUQVRFX0ZPQ1VTRUQgfCBWSUVXX1NUQVRFX1BSRVNTRURdOworICAgICAgICBQUkVTU0VEX0VOQUJMRURfU1RBVEVfU0VUID0gVklFV19TVEFURV9TRVRTWworICAgICAgICAgICAgICAgIFZJRVdfU1RBVEVfRU5BQkxFRCB8IFZJRVdfU1RBVEVfUFJFU1NFRF07CisgICAgICAgIFBSRVNTRURfRU5BQkxFRF9XSU5ET1dfRk9DVVNFRF9TVEFURV9TRVQgPSBWSUVXX1NUQVRFX1NFVFNbCisgICAgICAgICAgICAgICAgVklFV19TVEFURV9XSU5ET1dfRk9DVVNFRCB8IFZJRVdfU1RBVEVfRU5BQkxFRAorICAgICAgICAgICAgICAgIHwgVklFV19TVEFURV9QUkVTU0VEXTsKKyAgICAgICAgUFJFU1NFRF9FTkFCTEVEX1NFTEVDVEVEX1NUQVRFX1NFVCA9IFZJRVdfU1RBVEVfU0VUU1sKKyAgICAgICAgICAgICAgICBWSUVXX1NUQVRFX1NFTEVDVEVEIHwgVklFV19TVEFURV9FTkFCTEVECisgICAgICAgICAgICAgICAgfCBWSUVXX1NUQVRFX1BSRVNTRURdOworICAgICAgICBQUkVTU0VEX0VOQUJMRURfU0VMRUNURURfV0lORE9XX0ZPQ1VTRURfU1RBVEVfU0VUID0gVklFV19TVEFURV9TRVRTWworICAgICAgICAgICAgICAgIFZJRVdfU1RBVEVfV0lORE9XX0ZPQ1VTRUQgfCBWSUVXX1NUQVRFX1NFTEVDVEVECisgICAgICAgICAgICAgICAgfCBWSUVXX1NUQVRFX0VOQUJMRUQgfCBWSUVXX1NUQVRFX1BSRVNTRURdOworICAgICAgICBQUkVTU0VEX0VOQUJMRURfRk9DVVNFRF9TVEFURV9TRVQgPSBWSUVXX1NUQVRFX1NFVFNbCisgICAgICAgICAgICAgICAgVklFV19TVEFURV9GT0NVU0VEIHwgVklFV19TVEFURV9FTkFCTEVECisgICAgICAgICAgICAgICAgfCBWSUVXX1NUQVRFX1BSRVNTRURdOworICAgICAgICBQUkVTU0VEX0VOQUJMRURfRk9DVVNFRF9XSU5ET1dfRk9DVVNFRF9TVEFURV9TRVQgPSBWSUVXX1NUQVRFX1NFVFNbCisgICAgICAgICAgICAgICAgVklFV19TVEFURV9XSU5ET1dfRk9DVVNFRCB8IFZJRVdfU1RBVEVfRk9DVVNFRAorICAgICAgICAgICAgICAgIHwgVklFV19TVEFURV9FTkFCTEVEIHwgVklFV19TVEFURV9QUkVTU0VEXTsKKyAgICAgICAgUFJFU1NFRF9FTkFCTEVEX0ZPQ1VTRURfU0VMRUNURURfU1RBVEVfU0VUID0gVklFV19TVEFURV9TRVRTWworICAgICAgICAgICAgICAgIFZJRVdfU1RBVEVfU0VMRUNURUQgfCBWSUVXX1NUQVRFX0ZPQ1VTRUQKKyAgICAgICAgICAgICAgICB8IFZJRVdfU1RBVEVfRU5BQkxFRCB8IFZJRVdfU1RBVEVfUFJFU1NFRF07CisgICAgICAgIFBSRVNTRURfRU5BQkxFRF9GT0NVU0VEX1NFTEVDVEVEX1dJTkRPV19GT0NVU0VEX1NUQVRFX1NFVCA9IFZJRVdfU1RBVEVfU0VUU1sKKyAgICAgICAgICAgICAgICBWSUVXX1NUQVRFX1dJTkRPV19GT0NVU0VEIHwgVklFV19TVEFURV9TRUxFQ1RFRAorICAgICAgICAgICAgICAgIHwgVklFV19TVEFURV9GT0NVU0VEfCBWSUVXX1NUQVRFX0VOQUJMRUQKKyAgICAgICAgICAgICAgICB8IFZJRVdfU1RBVEVfUFJFU1NFRF07CisgICAgfQorCiAgICAgLyoqCiAgICAgICogVXNlZCBieSB2aWV3cyB0aGF0IGNvbnRhaW4gbGlzdHMgb2YgaXRlbXMuIFRoaXMgc3RhdGUgaW5kaWNhdGVzIHRoYXQKICAgICAgKiB0aGUgdmlldyBpcyBzaG93aW5nIHRoZSBsYXN0IGl0ZW0uCkBAIC0xNTUxLDM4ICsxNjEzLDE1IEBACiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEFXQUtFTl9TQ1JPTExfQkFSU19PTl9BVFRBQ0ggPSAweDA4MDAwMDAwOwogCiAgICAgLyoqCi0gICAgICogQWx3YXlzIGFsbG93IGEgdXNlciB0byBvdmVyc2Nyb2xsIHRoaXMgdmlldywgcHJvdmlkZWQgaXQgaXMgYQotICAgICAqIHZpZXcgdGhhdCBjYW4gc2Nyb2xsLgorICAgICAqIEluZGljYXRlcyB0aGF0IHBpdm90WCBvciBwaXZvdFkgd2VyZSBleHBsaWNpdGx5IHNldCBhbmQgd2Ugc2hvdWxkIG5vdCBhc3N1bWUgdGhlIGNlbnRlcgorICAgICAqIGZvciB0cmFuc2Zvcm0gb3BlcmF0aW9ucwogICAgICAqCi0gICAgICogQHNlZSAjZ2V0T3ZlcnNjcm9sbE1vZGUoKQotICAgICAqIEBzZWUgI3NldE92ZXJzY3JvbGxNb2RlKGludCkKKyAgICAgKiBAaGlkZQogICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9WRVJTQ1JPTExfQUxXQVlTID0gMDsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUElWT1RfRVhQTElDSVRMWV9TRVQgPSAweDEwMDAwMDAwOwogCi0gICAgLyoqCi0gICAgICogQWxsb3cgYSB1c2VyIHRvIG92ZXJzY3JvbGwgdGhpcyB2aWV3IG9ubHkgaWYgdGhlIGNvbnRlbnQgaXMgbGFyZ2UKLSAgICAgKiBlbm91Z2ggdG8gbWVhbmluZ2Z1bGx5IHNjcm9sbCwgcHJvdmlkZWQgaXQgaXMgYSB2aWV3IHRoYXQgY2FuIHNjcm9sbC4KLSAgICAgKgotICAgICAqIEBzZWUgI2dldE92ZXJzY3JvbGxNb2RlKCkKLSAgICAgKiBAc2VlICNzZXRPdmVyc2Nyb2xsTW9kZShpbnQpCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT1ZFUlNDUk9MTF9JRl9DT05URU5UX1NDUk9MTFMgPSAxOwotCi0gICAgLyoqCi0gICAgICogTmV2ZXIgYWxsb3cgYSB1c2VyIHRvIG92ZXJzY3JvbGwgdGhpcyB2aWV3LgotICAgICAqCi0gICAgICogQHNlZSAjZ2V0T3ZlcnNjcm9sbE1vZGUoKQotICAgICAqIEBzZWUgI3NldE92ZXJzY3JvbGxNb2RlKGludCkKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBPVkVSU0NST0xMX05FVkVSID0gMjsKLQotICAgIC8qKgotICAgICAqIENvbnRyb2xzIHRoZSBvdmVyc2Nyb2xsIG1vZGUgZm9yIHRoaXMgdmlldy4KLSAgICAgKiBTZWUge0BsaW5rICNvdmVyc2Nyb2xsQnkoaW50LCBpbnQsIGludCwgaW50LCBpbnQsIGludCwgaW50LCBpbnQsIGJvb2xlYW4pfSwKLSAgICAgKiB7QGxpbmsgI09WRVJTQ1JPTExfQUxXQVlTfSwge0BsaW5rICNPVkVSU0NST0xMX0lGX0NPTlRFTlRfU0NST0xMU30sCi0gICAgICogYW5kIHtAbGluayAjT1ZFUlNDUk9MTF9ORVZFUn0uCi0gICAgICovCi0gICAgcHJpdmF0ZSBpbnQgbU92ZXJzY3JvbGxNb2RlOworICAgIC8qKiB7QGhpZGV9ICovCisgICAgc3RhdGljIGZpbmFsIGludCBBQ1RJVkFURUQgICAgICAgICAgICAgICAgICAgID0gMHgyMDAwMDAwMDsKIAogICAgIC8qKgogICAgICAqIFRoZSBwYXJlbnQgdGhpcyB2aWV3IGlzIGF0dGFjaGVkIHRvLgpAQCAtMTYzNSw2ICsxNjc0LDEzNSBAQAogICAgIGludCBtVmlld0ZsYWdzOwogCiAgICAgLyoqCisgICAgICogVGhlIHRyYW5zZm9ybSBtYXRyaXggZm9yIHRoZSBWaWV3LiBUaGlzIHRyYW5zZm9ybSBpcyBjYWxjdWxhdGVkIGludGVybmFsbHkKKyAgICAgKiBiYXNlZCBvbiB0aGUgcm90YXRpb24sIHNjYWxlWCwgYW5kIHNjYWxlWSBwcm9wZXJ0aWVzLiBUaGUgaWRlbnRpdHkgbWF0cml4CisgICAgICogaXMgdXNlZCBieSBkZWZhdWx0LiBEbyAqbm90KiB1c2UgdGhpcyB2YXJpYWJsZSBkaXJlY3RseTsgaW5zdGVhZCBjYWxsCisgICAgICogZ2V0TWF0cml4KCksIHdoaWNoIHdpbGwgYXV0b21hdGljYWxseSByZWNhbGN1bGF0ZSB0aGUgbWF0cml4IGlmIG5lY2Vzc2FyeQorICAgICAqIHRvIGdldCB0aGUgY29ycmVjdCBtYXRyaXggYmFzZWQgb24gdGhlIGxhdGVzdCByb3RhdGlvbiBhbmQgc2NhbGUgcHJvcGVydGllcy4KKyAgICAgKi8KKyAgICBwcml2YXRlIGZpbmFsIE1hdHJpeCBtTWF0cml4ID0gbmV3IE1hdHJpeCgpOworCisgICAgLyoqCisgICAgICogVGhlIHRyYW5zZm9ybSBtYXRyaXggZm9yIHRoZSBWaWV3LiBUaGlzIHRyYW5zZm9ybSBpcyBjYWxjdWxhdGVkIGludGVybmFsbHkKKyAgICAgKiBiYXNlZCBvbiB0aGUgcm90YXRpb24sIHNjYWxlWCwgYW5kIHNjYWxlWSBwcm9wZXJ0aWVzLiBUaGUgaWRlbnRpdHkgbWF0cml4CisgICAgICogaXMgdXNlZCBieSBkZWZhdWx0LiBEbyAqbm90KiB1c2UgdGhpcyB2YXJpYWJsZSBkaXJlY3RseTsgaW5zdGVhZCBjYWxsCisgICAgICogZ2V0TWF0cml4KCksIHdoaWNoIHdpbGwgYXV0b21hdGljYWxseSByZWNhbGN1bGF0ZSB0aGUgbWF0cml4IGlmIG5lY2Vzc2FyeQorICAgICAqIHRvIGdldCB0aGUgY29ycmVjdCBtYXRyaXggYmFzZWQgb24gdGhlIGxhdGVzdCByb3RhdGlvbiBhbmQgc2NhbGUgcHJvcGVydGllcy4KKyAgICAgKi8KKyAgICBwcml2YXRlIE1hdHJpeCBtSW52ZXJzZU1hdHJpeDsKKworICAgIC8qKgorICAgICAqIEFuIGludGVybmFsIHZhcmlhYmxlIHRoYXQgdHJhY2tzIHdoZXRoZXIgd2UgbmVlZCB0byByZWNhbGN1bGF0ZSB0aGUKKyAgICAgKiB0cmFuc2Zvcm0gbWF0cml4LCBiYXNlZCBvbiB3aGV0aGVyIHRoZSByb3RhdGlvbiBvciBzY2FsZVgvWSBwcm9wZXJ0aWVzCisgICAgICogaGF2ZSBjaGFuZ2VkIHNpbmNlIHRoZSBtYXRyaXggd2FzIGxhc3QgY2FsY3VsYXRlZC4KKyAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gbU1hdHJpeERpcnR5ID0gZmFsc2U7CisKKyAgICAvKioKKyAgICAgKiBBbiBpbnRlcm5hbCB2YXJpYWJsZSB0aGF0IHRyYWNrcyB3aGV0aGVyIHdlIG5lZWQgdG8gcmVjYWxjdWxhdGUgdGhlCisgICAgICogdHJhbnNmb3JtIG1hdHJpeCwgYmFzZWQgb24gd2hldGhlciB0aGUgcm90YXRpb24gb3Igc2NhbGVYL1kgcHJvcGVydGllcworICAgICAqIGhhdmUgY2hhbmdlZCBzaW5jZSB0aGUgbWF0cml4IHdhcyBsYXN0IGNhbGN1bGF0ZWQuCisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIG1JbnZlcnNlTWF0cml4RGlydHkgPSB0cnVlOworCisgICAgLyoqCisgICAgICogQSB2YXJpYWJsZSB0aGF0IHRyYWNrcyB3aGV0aGVyIHdlIG5lZWQgdG8gcmVjYWxjdWxhdGUgdGhlCisgICAgICogdHJhbnNmb3JtIG1hdHJpeCwgYmFzZWQgb24gd2hldGhlciB0aGUgcm90YXRpb24gb3Igc2NhbGVYL1kgcHJvcGVydGllcworICAgICAqIGhhdmUgY2hhbmdlZCBzaW5jZSB0aGUgbWF0cml4IHdhcyBsYXN0IGNhbGN1bGF0ZWQuIFRoaXMgdmFyaWFibGUKKyAgICAgKiBpcyBvbmx5IHZhbGlkIGFmdGVyIGEgY2FsbCB0byBnZXRNYXRyaXgoKS4KKyAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gbU1hdHJpeElzSWRlbnRpdHkgPSB0cnVlOworCisgICAgLyoqCisgICAgICogVGhlIENhbWVyYSBvYmplY3QgaXMgdXNlZCB0byBjb21wdXRlIGEgM0QgbWF0cml4IHdoZW4gcm90YXRpb25YIG9yIHJvdGF0aW9uWSBhcmUgc2V0LgorICAgICAqLworICAgIHByaXZhdGUgQ2FtZXJhIG1DYW1lcmEgPSBudWxsOworCisgICAgLyoqCisgICAgICogVGhpcyBtYXRyaXggaXMgdXNlZCB3aGVuIGNvbXB1dGluZyB0aGUgbWF0cml4IGZvciAzRCByb3RhdGlvbnMuCisgICAgICovCisgICAgcHJpdmF0ZSBNYXRyaXggbWF0cml4M0QgPSBudWxsOworCisgICAgLyoqCisgICAgICogVGhlc2UgcHJldiB2YWx1ZXMgYXJlIHVzZWQgdG8gcmVjYWxjdWxhdGUgYSBjZW50ZXJlZCBwaXZvdCBwb2ludCB3aGVuIG5lY2Vzc2FyeS4gVGhlCisgICAgICogcGl2b3QgcG9pbnQgaXMgb25seSB1c2VkIGluIG1hdHJpeCBvcGVyYXRpb25zICh3aGVuIHJvdGF0aW9uLCBzY2FsZSwgb3IgdHJhbnNsYXRpb24gYXJlCisgICAgICogc2V0KSwgc28gdGhlcyB2YWx1ZXMgYXJlIG9ubHkgdXNlZCB0aGVuIGFzIHdlbGwuCisgICAgICovCisgICAgcHJpdmF0ZSBpbnQgbVByZXZXaWR0aCA9IC0xOworICAgIHByaXZhdGUgaW50IG1QcmV2SGVpZ2h0ID0gLTE7CisKKyAgICAvKioKKyAgICAgKiBDb252ZW5pZW5jZSB2YWx1ZSB0byBjaGVjayBmb3IgZmxvYXQgdmFsdWVzIHRoYXQgYXJlIGNsb3NlIGVub3VnaCB0byB6ZXJvIHRvIGJlIGNvbnNpZGVyZWQKKyAgICAgKiB6ZXJvLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGZsb2F0IE5PTlpFUk9fRVBTSUxPTiA9IC4wMDFmOworCisgICAgLyoqCisgICAgICogVGhlIGRlZ3JlZXMgcm90YXRpb24gYXJvdW5kIHRoZSB2ZXJ0aWNhbCBheGlzIHRocm91Z2ggdGhlIHBpdm90IHBvaW50LgorICAgICAqLworICAgIEBWaWV3RGVidWcuRXhwb3J0ZWRQcm9wZXJ0eQorICAgIHByaXZhdGUgZmxvYXQgbVJvdGF0aW9uWSA9IDBmOworCisgICAgLyoqCisgICAgICogVGhlIGRlZ3JlZXMgcm90YXRpb24gYXJvdW5kIHRoZSBob3Jpem9udGFsIGF4aXMgdGhyb3VnaCB0aGUgcGl2b3QgcG9pbnQuCisgICAgICovCisgICAgQFZpZXdEZWJ1Zy5FeHBvcnRlZFByb3BlcnR5CisgICAgcHJpdmF0ZSBmbG9hdCBtUm90YXRpb25YID0gMGY7CisKKyAgICAvKioKKyAgICAgKiBUaGUgZGVncmVlcyByb3RhdGlvbiBhcm91bmQgdGhlIHBpdm90IHBvaW50LgorICAgICAqLworICAgIEBWaWV3RGVidWcuRXhwb3J0ZWRQcm9wZXJ0eQorICAgIHByaXZhdGUgZmxvYXQgbVJvdGF0aW9uID0gMGY7CisKKyAgICAvKioKKyAgICAgKiBUaGUgYW1vdW50IG9mIHRyYW5zbGF0aW9uIG9mIHRoZSBvYmplY3QgYXdheSBmcm9tIGl0cyBsZWZ0IHByb3BlcnR5IChwb3N0LWxheW91dCkuCisgICAgICovCisgICAgQFZpZXdEZWJ1Zy5FeHBvcnRlZFByb3BlcnR5CisgICAgcHJpdmF0ZSBmbG9hdCBtVHJhbnNsYXRpb25YID0gMGY7CisKKyAgICAvKioKKyAgICAgKiBUaGUgYW1vdW50IG9mIHRyYW5zbGF0aW9uIG9mIHRoZSBvYmplY3QgYXdheSBmcm9tIGl0cyB0b3AgcHJvcGVydHkgKHBvc3QtbGF5b3V0KS4KKyAgICAgKi8KKyAgICBAVmlld0RlYnVnLkV4cG9ydGVkUHJvcGVydHkKKyAgICBwcml2YXRlIGZsb2F0IG1UcmFuc2xhdGlvblkgPSAwZjsKKworICAgIC8qKgorICAgICAqIFRoZSBhbW91bnQgb2Ygc2NhbGUgaW4gdGhlIHggZGlyZWN0aW9uIGFyb3VuZCB0aGUgcGl2b3QgcG9pbnQuIEEKKyAgICAgKiB2YWx1ZSBvZiAxIG1lYW5zIG5vIHNjYWxpbmcgaXMgYXBwbGllZC4KKyAgICAgKi8KKyAgICBAVmlld0RlYnVnLkV4cG9ydGVkUHJvcGVydHkKKyAgICBwcml2YXRlIGZsb2F0IG1TY2FsZVggPSAxZjsKKworICAgIC8qKgorICAgICAqIFRoZSBhbW91bnQgb2Ygc2NhbGUgaW4gdGhlIHkgZGlyZWN0aW9uIGFyb3VuZCB0aGUgcGl2b3QgcG9pbnQuIEEKKyAgICAgKiB2YWx1ZSBvZiAxIG1lYW5zIG5vIHNjYWxpbmcgaXMgYXBwbGllZC4KKyAgICAgKi8KKyAgICBAVmlld0RlYnVnLkV4cG9ydGVkUHJvcGVydHkKKyAgICBwcml2YXRlIGZsb2F0IG1TY2FsZVkgPSAxZjsKKworICAgIC8qKgorICAgICAqIFRoZSBhbW91bnQgb2Ygc2NhbGUgaW4gdGhlIHggZGlyZWN0aW9uIGFyb3VuZCB0aGUgcGl2b3QgcG9pbnQuIEEKKyAgICAgKiB2YWx1ZSBvZiAxIG1lYW5zIG5vIHNjYWxpbmcgaXMgYXBwbGllZC4KKyAgICAgKi8KKyAgICBAVmlld0RlYnVnLkV4cG9ydGVkUHJvcGVydHkKKyAgICBwcml2YXRlIGZsb2F0IG1QaXZvdFggPSAwZjsKKworICAgIC8qKgorICAgICAqIFRoZSBhbW91bnQgb2Ygc2NhbGUgaW4gdGhlIHkgZGlyZWN0aW9uIGFyb3VuZCB0aGUgcGl2b3QgcG9pbnQuIEEKKyAgICAgKiB2YWx1ZSBvZiAxIG1lYW5zIG5vIHNjYWxpbmcgaXMgYXBwbGllZC4KKyAgICAgKi8KKyAgICBAVmlld0RlYnVnLkV4cG9ydGVkUHJvcGVydHkKKyAgICBwcml2YXRlIGZsb2F0IG1QaXZvdFkgPSAwZjsKKworICAgIC8qKgorICAgICAqIFRoZSBvcGFjaXR5IG9mIHRoZSBWaWV3LiBUaGlzIGlzIGEgdmFsdWUgZnJvbSAwIHRvIDEsIHdoZXJlIDAgbWVhbnMKKyAgICAgKiBjb21wbGV0ZWx5IHRyYW5zcGFyZW50IGFuZCAxIG1lYW5zIGNvbXBsZXRlbHkgb3BhcXVlLgorICAgICAqLworICAgIEBWaWV3RGVidWcuRXhwb3J0ZWRQcm9wZXJ0eQorICAgIHByaXZhdGUgZmxvYXQgbUFscGhhID0gMWY7CisKKyAgICAvKioKICAgICAgKiBUaGUgZGlzdGFuY2UgaW4gcGl4ZWxzIGZyb20gdGhlIGxlZnQgZWRnZSBvZiB0aGlzIHZpZXcncyBwYXJlbnQKICAgICAgKiB0byB0aGUgbGVmdCBlZGdlIG9mIHRoaXMgdmlldy4KICAgICAgKiB7QGhpZGV9CkBAIC0xNzQ4LDYgKzE5MTYsMTEgQEAKICAgICBwcm90ZWN0ZWQgT25Gb2N1c0NoYW5nZUxpc3RlbmVyIG1PbkZvY3VzQ2hhbmdlTGlzdGVuZXI7CiAKICAgICAvKioKKyAgICAgKiBMaXN0ZW5lcnMgZm9yIGxheW91dCBjaGFuZ2UgZXZlbnRzLgorICAgICAqLworICAgIHByaXZhdGUgQXJyYXlMaXN0PE9uTGF5b3V0Q2hhbmdlTGlzdGVuZXI+IG1PbkxheW91dENoYW5nZUxpc3RlbmVyczsKKworICAgIC8qKgogICAgICAqIExpc3RlbmVyIHVzZWQgdG8gZGlzcGF0Y2ggY2xpY2sgZXZlbnRzLgogICAgICAqIFRoaXMgZmllbGQgc2hvdWxkIGJlIG1hZGUgcHJpdmF0ZSwgc28gaXQgaXMgaGlkZGVuIGZyb20gdGhlIFNESy4KICAgICAgKiB7QGhpZGV9CkBAIC0xNzgzLDggKzE5NTYsOCBAQAogCiAgICAgcHJpdmF0ZSBpbnRbXSBtRHJhd2FibGVTdGF0ZSA9IG51bGw7CiAKLSAgICBwcml2YXRlIFNvZnRSZWZlcmVuY2U8Qml0bWFwPiBtRHJhd2luZ0NhY2hlOwotICAgIHByaXZhdGUgU29mdFJlZmVyZW5jZTxCaXRtYXA+IG1VbnNjYWxlZERyYXdpbmdDYWNoZTsKKyAgICBwcml2YXRlIEJpdG1hcCBtRHJhd2luZ0NhY2hlOworICAgIHByaXZhdGUgQml0bWFwIG1VbnNjYWxlZERyYXdpbmdDYWNoZTsKIAogICAgIC8qKgogICAgICAqIFdoZW4gdGhpcyB2aWV3IGhhcyBmb2N1cyBhbmQgdGhlIG5leHQgZm9jdXMgaXMge0BsaW5rICNGT0NVU19MRUZUfSwKQEAgLTE4NjAsOSArMjAzMyw2IEBACiAgICAgICovCiAgICAgcHJpdmF0ZSBpbnQgbVRvdWNoU2xvcDsKIAotICAgIC8vIFVzZWQgZm9yIGRlYnVnIG9ubHkKLSAgICBzdGF0aWMgbG9uZyBzSW5zdGFuY2VDb3VudCA9IDA7Ci0KICAgICAvKioKICAgICAgKiBTaW1wbGUgY29uc3RydWN0b3IgdG8gdXNlIHdoZW4gY3JlYXRpbmcgYSB2aWV3IGZyb20gY29kZS4KICAgICAgKgpAQCAtMTg3MywxMCArMjA0Myw3IEBACiAgICAgICAgIG1Db250ZXh0ID0gY29udGV4dDsKICAgICAgICAgbVJlc291cmNlcyA9IGNvbnRleHQgIT0gbnVsbCA/IGNvbnRleHQuZ2V0UmVzb3VyY2VzKCkgOiBudWxsOwogICAgICAgICBtVmlld0ZsYWdzID0gU09VTkRfRUZGRUNUU19FTkFCTEVEIHwgSEFQVElDX0ZFRURCQUNLX0VOQUJMRUQ7Ci0gICAgICAgIC8vIFVzZWQgZm9yIGRlYnVnIG9ubHkKLSAgICAgICAgLy8rK3NJbnN0YW5jZUNvdW50OwogICAgICAgICBtVG91Y2hTbG9wID0gVmlld0NvbmZpZ3VyYXRpb24uZ2V0KGNvbnRleHQpLmdldFNjYWxlZFRvdWNoU2xvcCgpOwotICAgICAgICBzZXRPdmVyc2Nyb2xsTW9kZShPVkVSU0NST0xMX0FMV0FZUyk7CiAgICAgfQogCiAgICAgLyoqCkBAIC0xOTQyLDcgKzIxMDksNiBAQAogCiAgICAgICAgIGludCBzY3JvbGxiYXJTdHlsZSA9IFNDUk9MTEJBUlNfSU5TSURFX09WRVJMQVk7CiAKLSAgICAgICAgaW50IG92ZXJzY3JvbGxNb2RlID0gbU92ZXJzY3JvbGxNb2RlOwogICAgICAgICBmaW5hbCBpbnQgTiA9IGEuZ2V0SW5kZXhDb3VudCgpOwogICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IE47IGkrKykgewogICAgICAgICAgICAgaW50IGF0dHIgPSBhLmdldEluZGV4KGkpOwpAQCAtMjE0OCwxNCArMjMxNCw5IEBACiAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIFIuc3R5bGVhYmxlLlZpZXdfb3ZlcnNjcm9sbE1vZGU6Ci0gICAgICAgICAgICAgICAgICAgIG92ZXJzY3JvbGxNb2RlID0gYS5nZXRJbnQoYXR0ciwgT1ZFUlNDUk9MTF9BTFdBWVMpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCi0gICAgICAgIHNldE92ZXJzY3JvbGxNb2RlKG92ZXJzY3JvbGxNb2RlKTsKLQogICAgICAgICBpZiAoYmFja2dyb3VuZCAhPSBudWxsKSB7CiAgICAgICAgICAgICBzZXRCYWNrZ3JvdW5kRHJhd2FibGUoYmFja2dyb3VuZCk7CiAgICAgICAgIH0KQEAgLTIyMDQsMTUgKzIzNjUsNiBAQAogICAgIFZpZXcoKSB7CiAgICAgfQogCi0gICAgLy8gVXNlZCBmb3IgZGVidWcgb25seQotICAgIC8qCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgZmluYWxpemUoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLSAgICAgICAgc3VwZXIuZmluYWxpemUoKTsKLSAgICAgICAgLS1zSW5zdGFuY2VDb3VudDsKLSAgICB9Ci0gICAgKi8KLQogICAgIC8qKgogICAgICAqIDxwPgogICAgICAqIEluaXRpYWxpemVzIHRoZSBmYWRpbmcgZWRnZXMgZnJvbSBhIGdpdmVuIHNldCBvZiBzdHlsZWQgYXR0cmlidXRlcy4gVGhpcwpAQCAtMjQxOSw2ICsyNTcxLDM5IEBACiAgICAgfQogCiAgICAgLyoqCisgICAgICogQWRkIGEgbGlzdGVuZXIgdGhhdCB3aWxsIGJlIGNhbGxlZCB3aGVuIHRoZSBib3VuZHMgb2YgdGhlIHZpZXcgY2hhbmdlIGR1ZSB0bworICAgICAqIGxheW91dCBwcm9jZXNzaW5nLgorICAgICAqCisgICAgICogQHBhcmFtIGxpc3RlbmVyIFRoZSBsaXN0ZW5lciB0aGF0IHdpbGwgYmUgY2FsbGVkIHdoZW4gbGF5b3V0IGJvdW5kcyBjaGFuZ2UuCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkT25MYXlvdXRDaGFuZ2VMaXN0ZW5lcihPbkxheW91dENoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKSB7CisgICAgICAgIGlmIChtT25MYXlvdXRDaGFuZ2VMaXN0ZW5lcnMgPT0gbnVsbCkgeworICAgICAgICAgICAgbU9uTGF5b3V0Q2hhbmdlTGlzdGVuZXJzID0gbmV3IEFycmF5TGlzdDxPbkxheW91dENoYW5nZUxpc3RlbmVyPigpOworICAgICAgICB9CisgICAgICAgIG1PbkxheW91dENoYW5nZUxpc3RlbmVycy5hZGQobGlzdGVuZXIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlbW92ZSBhIGxpc3RlbmVyIGZvciBsYXlvdXQgY2hhbmdlcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBsaXN0ZW5lciBUaGUgbGlzdGVuZXIgZm9yIGxheW91dCBib3VuZHMgY2hhbmdlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJlbW92ZU9uTGF5b3V0Q2hhbmdlTGlzdGVuZXIoT25MYXlvdXRDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcikgeworICAgICAgICBpZiAobU9uTGF5b3V0Q2hhbmdlTGlzdGVuZXJzID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBtT25MYXlvdXRDaGFuZ2VMaXN0ZW5lcnMucmVtb3ZlKGxpc3RlbmVyKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSBjdXJyZW50IGxpc3Qgb2YgbGlzdGVuZXJzIGZvciBsYXlvdXQgY2hhbmdlcy4KKyAgICAgKiBAcmV0dXJuCisgICAgICovCisgICAgcHVibGljIExpc3Q8T25MYXlvdXRDaGFuZ2VMaXN0ZW5lcj4gZ2V0T25MYXlvdXRDaGFuZ2VMaXN0ZW5lcnMoKSB7CisgICAgICAgIHJldHVybiBtT25MYXlvdXRDaGFuZ2VMaXN0ZW5lcnM7CisgICAgfQorCisgICAgLyoqCiAgICAgICogUmV0dXJucyB0aGUgZm9jdXMtY2hhbmdlIGNhbGxiYWNrIHJlZ2lzdGVyZWQgZm9yIHRoaXMgdmlldy4KICAgICAgKgogICAgICAqIEByZXR1cm4gVGhlIGNhbGxiYWNrLCBvciBudWxsIGlmIG9uZSBpcyBub3QgcmVnaXN0ZXJlZC4KQEAgLTI1MjEsNiArMjcwNiwxOCBAQAogICAgIH0KIAogICAgIC8qKgorICAgICAqIFN0YXJ0IGFuIGFjdGlvbiBtb2RlLgorICAgICAqCisgICAgICogQHBhcmFtIGNhbGxiYWNrIENhbGxiYWNrIHRoYXQgd2lsbCBjb250cm9sIHRoZSBsaWZlY3ljbGUgb2YgdGhlIGFjdGlvbiBtb2RlCisgICAgICogQHJldHVybiBUaGUgbmV3IGFjdGlvbiBtb2RlIGlmIGl0IGlzIHN0YXJ0ZWQsIG51bGwgb3RoZXJ3aXNlCisgICAgICoKKyAgICAgKiBAc2VlIEFjdGlvbk1vZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgQWN0aW9uTW9kZSBzdGFydEFjdGlvbk1vZGUoQWN0aW9uTW9kZS5DYWxsYmFjayBjYWxsYmFjaykgeworICAgICAgICByZXR1cm4gZ2V0UGFyZW50KCkuc3RhcnRBY3Rpb25Nb2RlRm9yQ2hpbGQodGhpcywgY2FsbGJhY2spOworICAgIH0KKworICAgIC8qKgogICAgICAqIFJlZ2lzdGVyIGEgY2FsbGJhY2sgdG8gYmUgaW52b2tlZCB3aGVuIGEga2V5IGlzIHByZXNzZWQgaW4gdGhpcyB2aWV3LgogICAgICAqIEBwYXJhbSBsIHRoZSBrZXkgbGlzdGVuZXIgdG8gYXR0YWNoIHRvIHRoaXMgdmlldwogICAgICAqLwpAQCAtMzM1MCw3ICszNTQ3LDcgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBwcmVzc2VkIHRoYXQgZm9yIHRoaXMgdmlldy4KKyAgICAgKiBTZXRzIHRoZSBwcmVzc2VkIHN0YXRlIGZvciB0aGlzIHZpZXcuCiAgICAgICoKICAgICAgKiBAc2VlICNpc0NsaWNrYWJsZSgpCiAgICAgICogQHNlZSAjc2V0Q2xpY2thYmxlKGJvb2xlYW4pCkBAIC0zNDU3LDYgKzM2NTQsMzggQEAKICAgICB9CiAKICAgICAvKioKKyAgICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgZW50aXJlIGhpZXJhcmNoeSB1bmRlciB0aGlzIHZpZXcgd2lsbCBzYXZlIGl0cworICAgICAqIHN0YXRlIHdoZW4gYSBzdGF0ZSBzYXZpbmcgdHJhdmVyc2FsIG9jY3VycyBmcm9tIGl0cyBwYXJlbnQuICBUaGUgZGVmYXVsdAorICAgICAqIGlzIHRydWU7IGlmIGZhbHNlLCB0aGVzZSB2aWV3cyB3aWxsIG5vdCBiZSBzYXZlZCB1bmxlc3MKKyAgICAgKiB7QGxpbmsgI3NhdmVIaWVyYXJjaHlTdGF0ZShTcGFyc2VBcnJheSl9IGlzIGNhbGxlZCBkaXJlY3RseSBvbiB0aGlzIHZpZXcuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFJldHVybnMgdHJ1ZSBpZiB0aGUgdmlldyBzdGF0ZSBzYXZpbmcgZnJvbSBwYXJlbnQgaXMgZW5hYmxlZCwgZWxzZSBmYWxzZS4KKyAgICAgKgorICAgICAqIEBzZWUgI3NldFNhdmVGcm9tUGFyZW50RW5hYmxlZChib29sZWFuKQorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzU2F2ZUZyb21QYXJlbnRFbmFibGVkKCkgeworICAgICAgICByZXR1cm4gKG1WaWV3RmxhZ3MgJiBQQVJFTlRfU0FWRV9ESVNBQkxFRF9NQVNLKSAhPSBQQVJFTlRfU0FWRV9ESVNBQkxFRDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb250cm9scyB3aGV0aGVyIHRoZSBlbnRpcmUgaGllcmFyY2h5IHVuZGVyIHRoaXMgdmlldyB3aWxsIHNhdmUgaXRzCisgICAgICogc3RhdGUgd2hlbiBhIHN0YXRlIHNhdmluZyB0cmF2ZXJzYWwgb2NjdXJzIGZyb20gaXRzIHBhcmVudC4gIFRoZSBkZWZhdWx0CisgICAgICogaXMgdHJ1ZTsgaWYgZmFsc2UsIHRoZXNlIHZpZXdzIHdpbGwgbm90IGJlIHNhdmVkIHVubGVzcworICAgICAqIHtAbGluayAjc2F2ZUhpZXJhcmNoeVN0YXRlKFNwYXJzZUFycmF5KX0gaXMgY2FsbGVkIGRpcmVjdGx5IG9uIHRoaXMgdmlldy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBlbmFibGVkIFNldCB0byBmYWxzZSB0byA8ZW0+ZGlzYWJsZTwvZW0+IHN0YXRlIHNhdmluZywgb3IgdHJ1ZQorICAgICAqICh0aGUgZGVmYXVsdCkgdG8gYWxsb3cgaXQuCisgICAgICoKKyAgICAgKiBAc2VlICNpc1NhdmVGcm9tUGFyZW50RW5hYmxlZCgpCisgICAgICogQHNlZSAjc2V0SWQoaW50KQorICAgICAqIEBzZWUgI29uU2F2ZUluc3RhbmNlU3RhdGUoKQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFNhdmVGcm9tUGFyZW50RW5hYmxlZChib29sZWFuIGVuYWJsZWQpIHsKKyAgICAgICAgc2V0RmxhZ3MoZW5hYmxlZCA/IDAgOiBQQVJFTlRfU0FWRV9ESVNBQkxFRCwgUEFSRU5UX1NBVkVfRElTQUJMRURfTUFTSyk7CisgICAgfQorCisKKyAgICAvKioKICAgICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyBWaWV3IGlzIGFibGUgdG8gdGFrZSBmb2N1cy4KICAgICAgKgogICAgICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGlzIHZpZXcgY2FuIHRha2UgZm9jdXMsIG9yIGZhbHNlIG90aGVyd2lzZS4KQEAgLTM4NDEsMTIgKzQwNzAsMTMgQEAKICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiBkaXNwYXRjaEtleUV2ZW50KEtleUV2ZW50IGV2ZW50KSB7CiAgICAgICAgIC8vIElmIGFueSBhdHRhY2hlZCBrZXkgbGlzdGVuZXIgYSBmaXJzdCBjcmFjayBhdCB0aGUgZXZlbnQuCi0gICAgICAgIC8vbm9pbnNwZWN0aW9uIFNpbXBsaWZpYWJsZUlmU3RhdGVtZW50CiAKKyAgICAgICAgLy9ub2luc3BlY3Rpb24gU2ltcGxpZmlhYmxlSWZTdGF0ZW1lbnQsZGVwcmVjYXRpb24KICAgICAgICAgaWYgKGFuZHJvaWQudXRpbC5Db25maWcuTE9HVikgewogICAgICAgICAgICAgY2FwdHVyZVZpZXdJbmZvKCJjYXB0dXJlVmlld0tleUV2ZW50IiwgdGhpcyk7CiAgICAgICAgIH0KIAorICAgICAgICAvL25vaW5zcGVjdGlvbiBTaW1wbGlmaWFibGVJZlN0YXRlbWVudAogICAgICAgICBpZiAobU9uS2V5TGlzdGVuZXIgIT0gbnVsbCAmJiAobVZpZXdGbGFncyAmIEVOQUJMRURfTUFTSykgPT0gRU5BQkxFRAogICAgICAgICAgICAgICAgICYmIG1PbktleUxpc3RlbmVyLm9uS2V5KHRoaXMsIGV2ZW50LmdldEtleUNvZGUoKSwgZXZlbnQpKSB7CiAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKQEAgLTM4NzgsNiArNDEwOCw3IEBACiAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KIAorICAgICAgICAvL25vaW5zcGVjdGlvbiBTaW1wbGlmaWFibGVJZlN0YXRlbWVudAogICAgICAgICBpZiAobU9uVG91Y2hMaXN0ZW5lciAhPSBudWxsICYmIChtVmlld0ZsYWdzICYgRU5BQkxFRF9NQVNLKSA9PSBFTkFCTEVEICYmCiAgICAgICAgICAgICAgICAgbU9uVG91Y2hMaXN0ZW5lci5vblRvdWNoKHRoaXMsIGV2ZW50KSkgewogICAgICAgICAgICAgcmV0dXJuIHRydWU7CkBAIC0zODk0LDYgKzQxMjUsNyBAQAogICAgICAqIEBzZWUgI2dldEZpbHRlclRvdWNoZXNXaGVuT2JzY3VyZWQKICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiBvbkZpbHRlclRvdWNoRXZlbnRGb3JTZWN1cml0eShNb3Rpb25FdmVudCBldmVudCkgeworICAgICAgICAvL25vaW5zcGVjdGlvbiBSZWR1bmRhbnRJZlN0YXRlbWVudAogICAgICAgICBpZiAoKG1WaWV3RmxhZ3MgJiBGSUxURVJfVE9VQ0hFU19XSEVOX09CU0NVUkVEKSAhPSAwCiAgICAgICAgICAgICAgICAgJiYgKGV2ZW50LmdldEZsYWdzKCkgJiBNb3Rpb25FdmVudC5GTEFHX1dJTkRPV19JU19PQlNDVVJFRCkgIT0gMCkgewogICAgICAgICAgICAgLy8gV2luZG93IGlzIG9ic2N1cmVkLCBkcm9wIHRoaXMgdG91Y2guCkBAIC00NTAwLDkgKzQ3MzIsNyBAQAogICAgICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgeSA9IChpbnQpIGV2ZW50LmdldFkoKTsKIAogICAgICAgICAgICAgICAgICAgICAvLyBCZSBsZW5pZW50IGFib3V0IG1vdmluZyBvdXRzaWRlIG9mIGJ1dHRvbnMKLSAgICAgICAgICAgICAgICAgICAgaW50IHNsb3AgPSBtVG91Y2hTbG9wOwotICAgICAgICAgICAgICAgICAgICBpZiAoKHggPCAwIC0gc2xvcCkgfHwgKHggPj0gZ2V0V2lkdGgoKSArIHNsb3ApIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKHkgPCAwIC0gc2xvcCkgfHwgKHkgPj0gZ2V0SGVpZ2h0KCkgKyBzbG9wKSkgeworICAgICAgICAgICAgICAgICAgICBpZiAoIXBvaW50SW5WaWV3KHgsIHksIG1Ub3VjaFNsb3ApKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBPdXRzaWRlIGJ1dHRvbgogICAgICAgICAgICAgICAgICAgICAgICAgcmVtb3ZlVGFwQ2FsbGJhY2soKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgobVByaXZhdGVGbGFncyAmIFBSRVNTRUQpICE9IDApIHsKQEAgLTQ3MzcsNiArNDk2NywyOCBAQAogICAgIH0KIAogICAgIC8qKgorICAgICAqIEludGVyZmFjZSBkZWZpbml0aW9uIGZvciBhIGNhbGxiYWNrIHRvIGJlIGludm9rZWQgd2hlbiB0aGUgbGF5b3V0IGJvdW5kcyBvZiBhIHZpZXcKKyAgICAgKiBjaGFuZ2VzIGR1ZSB0byBsYXlvdXQgcHJvY2Vzc2luZy4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50ZXJmYWNlIE9uTGF5b3V0Q2hhbmdlTGlzdGVuZXIgeworICAgICAgICAvKioKKyAgICAgICAgICogQ2FsbGVkIHdoZW4gdGhlIGZvY3VzIHN0YXRlIG9mIGEgdmlldyBoYXMgY2hhbmdlZC4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIHYgVGhlIHZpZXcgd2hvc2Ugc3RhdGUgaGFzIGNoYW5nZWQuCisgICAgICAgICAqIEBwYXJhbSBsZWZ0IFRoZSBuZXcgdmFsdWUgb2YgdGhlIHZpZXcncyBsZWZ0IHByb3BlcnR5LgorICAgICAgICAgKiBAcGFyYW0gdG9wIFRoZSBuZXcgdmFsdWUgb2YgdGhlIHZpZXcncyB0b3AgcHJvcGVydHkuCisgICAgICAgICAqIEBwYXJhbSByaWdodCBUaGUgbmV3IHZhbHVlIG9mIHRoZSB2aWV3J3MgcmlnaHQgcHJvcGVydHkuCisgICAgICAgICAqIEBwYXJhbSBib3R0b20gVGhlIG5ldyB2YWx1ZSBvZiB0aGUgdmlldydzIGJvdHRvbSBwcm9wZXJ0eS4KKyAgICAgICAgICogQHBhcmFtIG9sZExlZnQgVGhlIHByZXZpb3VzIHZhbHVlIG9mIHRoZSB2aWV3J3MgbGVmdCBwcm9wZXJ0eS4KKyAgICAgICAgICogQHBhcmFtIG9sZFRvcCBUaGUgcHJldmlvdXMgdmFsdWUgb2YgdGhlIHZpZXcncyB0b3AgcHJvcGVydHkuCisgICAgICAgICAqIEBwYXJhbSBvbGRSaWdodCBUaGUgcHJldmlvdXMgdmFsdWUgb2YgdGhlIHZpZXcncyByaWdodCBwcm9wZXJ0eS4KKyAgICAgICAgICogQHBhcmFtIG9sZEJvdHRvbSBUaGUgcHJldmlvdXMgdmFsdWUgb2YgdGhlIHZpZXcncyBib3R0b20gcHJvcGVydHkuCisgICAgICAgICAqLworICAgICAgICB2b2lkIG9uTGF5b3V0Q2hhbmdlKFZpZXcgdiwgaW50IGxlZnQsIGludCB0b3AsIGludCByaWdodCwgaW50IGJvdHRvbSwKKyAgICAgICAgICAgIGludCBvbGRMZWZ0LCBpbnQgb2xkVG9wLCBpbnQgb2xkUmlnaHQsIGludCBvbGRCb3R0b20pOworICAgIH0KKworICAgIC8qKgogICAgICAqIFRoaXMgaXMgY2FsbGVkIGR1cmluZyBsYXlvdXQgd2hlbiB0aGUgc2l6ZSBvZiB0aGlzIHZpZXcgaGFzIGNoYW5nZWQuIElmCiAgICAgICogeW91IHdlcmUganVzdCBhZGRlZCB0byB0aGUgdmlldyBoaWVyYXJjaHksIHlvdSdyZSBjYWxsZWQgd2l0aCB0aGUgb2xkCiAgICAgICogdmFsdWVzIG9mIDAuCkBAIC00ODQ4LDYgKzUxMDAsMzUzIEBACiAgICAgfQogCiAgICAgLyoqCisgICAgICogVGhlIHRyYW5zZm9ybSBtYXRyaXggb2YgdGhpcyB2aWV3LCB3aGljaCBpcyBjYWxjdWxhdGVkIGJhc2VkIG9uIHRoZSBjdXJyZW50CisgICAgICogcm9hdGlvbiwgc2NhbGUsIGFuZCBwaXZvdCBwcm9wZXJ0aWVzLgorICAgICAqCisgICAgICogQHNlZSAjZ2V0Um90YXRpb24oKQorICAgICAqIEBzZWUgI2dldFNjYWxlWCgpCisgICAgICogQHNlZSAjZ2V0U2NhbGVZKCkKKyAgICAgKiBAc2VlICNnZXRQaXZvdFgoKQorICAgICAqIEBzZWUgI2dldFBpdm90WSgpCisgICAgICogQHJldHVybiBUaGUgY3VycmVudCB0cmFuc2Zvcm0gbWF0cml4IGZvciB0aGUgdmlldworICAgICAqLworICAgIHB1YmxpYyBNYXRyaXggZ2V0TWF0cml4KCkgeworICAgICAgICBoYXNJZGVudGl0eU1hdHJpeCgpOworICAgICAgICByZXR1cm4gbU1hdHJpeDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBVdGlsaXR5IGZ1bmN0aW9uIHRvIGRldGVybWluZSBpZiB0aGUgdmFsdWUgaXMgZmFyIGVub3VnaCBhd2F5IGZyb20gemVybyB0byBiZQorICAgICAqIGNvbnNpZGVyZWQgbm9uLXplcm8uCisgICAgICogQHBhcmFtIHZhbHVlIEEgZmxvYXRpbmcgcG9pbnQgdmFsdWUgdG8gY2hlY2sgZm9yIHplcm8tbmVzcworICAgICAqIEByZXR1cm4gd2hldGhlciB0aGUgcGFzc2VkLWluIHZhbHVlIGlzIGZhciBlbm91Z2ggYXdheSBmcm9tIHplcm8gdG8gYmUgY29uc2lkZXJlZCBub24temVybworICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gbm9uemVybyhmbG9hdCB2YWx1ZSkgeworICAgICAgICByZXR1cm4gKHZhbHVlIDwgLU5PTlpFUk9fRVBTSUxPTiB8fCB2YWx1ZSA+IE5PTlpFUk9fRVBTSUxPTik7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVjb21wdXRlcyB0aGUgdHJhbnNmb3JtIG1hdHJpeCBpZiBuZWNlc3NhcnkuCisgICAgICogCisgICAgICogQHJldHVybiBUcnVlIGlmIHRoZSB0cmFuc2Zvcm0gbWF0cml4IGlzIHRoZSBpZGVudGl0eSBtYXRyaXgsIGZhbHNlIG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICBib29sZWFuIGhhc0lkZW50aXR5TWF0cml4KCkgeworICAgICAgICBpZiAobU1hdHJpeERpcnR5KSB7CisgICAgICAgICAgICAvLyB0cmFuc2Zvcm0tcmVsYXRlZCBwcm9wZXJ0aWVzIGhhdmUgY2hhbmdlZCBzaW5jZSB0aGUgbGFzdCB0aW1lIHNvbWVvbmUKKyAgICAgICAgICAgIC8vIGFza2VkIGZvciB0aGUgbWF0cml4OyByZWNhbGN1bGF0ZSBpdCB3aXRoIHRoZSBjdXJyZW50IHZhbHVlcworCisgICAgICAgICAgICAvLyBGaWd1cmUgb3V0IGlmIHdlIG5lZWQgdG8gdXBkYXRlIHRoZSBwaXZvdCBwb2ludAorICAgICAgICAgICAgaWYgKChtUHJpdmF0ZUZsYWdzICYgUElWT1RfRVhQTElDSVRMWV9TRVQpID09IDApIHsKKyAgICAgICAgICAgICAgICBpZiAoKG1SaWdodCAtIG1MZWZ0KSAhPSBtUHJldldpZHRoICYmIChtQm90dG9tIC0gbVRvcCkgIT0gbVByZXZIZWlnaHQpIHsKKyAgICAgICAgICAgICAgICAgICAgbVByZXZXaWR0aCA9IG1SaWdodCAtIG1MZWZ0OworICAgICAgICAgICAgICAgICAgICBtUHJldkhlaWdodCA9IG1Cb3R0b20gLSBtVG9wOworICAgICAgICAgICAgICAgICAgICBtUGl2b3RYID0gKGZsb2F0KSBtUHJldldpZHRoIC8gMmY7CisgICAgICAgICAgICAgICAgICAgIG1QaXZvdFkgPSAoZmxvYXQpIG1QcmV2SGVpZ2h0IC8gMmY7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgbU1hdHJpeC5yZXNldCgpOworICAgICAgICAgICAgaWYgKCFub256ZXJvKG1Sb3RhdGlvblgpICYmICFub256ZXJvKG1Sb3RhdGlvblkpKSB7CisgICAgICAgICAgICAgICAgbU1hdHJpeC5zZXRUcmFuc2xhdGUobVRyYW5zbGF0aW9uWCwgbVRyYW5zbGF0aW9uWSk7CisgICAgICAgICAgICAgICAgbU1hdHJpeC5wcmVSb3RhdGUobVJvdGF0aW9uLCBtUGl2b3RYLCBtUGl2b3RZKTsKKyAgICAgICAgICAgICAgICBtTWF0cml4LnByZVNjYWxlKG1TY2FsZVgsIG1TY2FsZVksIG1QaXZvdFgsIG1QaXZvdFkpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZiAobUNhbWVyYSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIG1DYW1lcmEgPSBuZXcgQ2FtZXJhKCk7CisgICAgICAgICAgICAgICAgICAgIG1hdHJpeDNEID0gbmV3IE1hdHJpeCgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBtQ2FtZXJhLnNhdmUoKTsKKyAgICAgICAgICAgICAgICBtTWF0cml4LnByZVNjYWxlKG1TY2FsZVgsIG1TY2FsZVksIG1QaXZvdFgsIG1QaXZvdFkpOworICAgICAgICAgICAgICAgIG1DYW1lcmEucm90YXRlWChtUm90YXRpb25YKTsKKyAgICAgICAgICAgICAgICBtQ2FtZXJhLnJvdGF0ZVkobVJvdGF0aW9uWSk7CisgICAgICAgICAgICAgICAgbUNhbWVyYS5yb3RhdGVaKC1tUm90YXRpb24pOworICAgICAgICAgICAgICAgIG1DYW1lcmEuZ2V0TWF0cml4KG1hdHJpeDNEKTsKKyAgICAgICAgICAgICAgICBtYXRyaXgzRC5wcmVUcmFuc2xhdGUoLW1QaXZvdFgsIC1tUGl2b3RZKTsKKyAgICAgICAgICAgICAgICBtYXRyaXgzRC5wb3N0VHJhbnNsYXRlKG1QaXZvdFggKyBtVHJhbnNsYXRpb25YLCBtUGl2b3RZICsgbVRyYW5zbGF0aW9uWSk7CisgICAgICAgICAgICAgICAgbU1hdHJpeC5wb3N0Q29uY2F0KG1hdHJpeDNEKTsKKyAgICAgICAgICAgICAgICBtQ2FtZXJhLnJlc3RvcmUoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1NYXRyaXhEaXJ0eSA9IGZhbHNlOworICAgICAgICAgICAgbU1hdHJpeElzSWRlbnRpdHkgPSBtTWF0cml4LmlzSWRlbnRpdHkoKTsKKyAgICAgICAgICAgIG1JbnZlcnNlTWF0cml4RGlydHkgPSB0cnVlOworICAgICAgICB9CisgICAgICAgIHJldHVybiBtTWF0cml4SXNJZGVudGl0eTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBVdGlsaXR5IG1ldGhvZCB0byByZXRyaWV2ZSB0aGUgaW52ZXJzZSBvZiB0aGUgY3VycmVudCBtTWF0cml4IHByb3BlcnR5LgorICAgICAqIFdlIGNhY2hlIHRoZSBtYXRyaXggdG8gYXZvaWQgcmVjYWxjdWxhdGluZyBpdCB3aGVuIHRyYW5zZm9ybSBwcm9wZXJ0aWVzCisgICAgICogaGF2ZSBub3QgY2hhbmdlZC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gVGhlIGludmVyc2Ugb2YgdGhlIGN1cnJlbnQgbWF0cml4IG9mIHRoaXMgdmlldy4KKyAgICAgKi8KKyAgICBNYXRyaXggZ2V0SW52ZXJzZU1hdHJpeCgpIHsKKyAgICAgICAgaWYgKG1JbnZlcnNlTWF0cml4RGlydHkpIHsKKyAgICAgICAgICAgIGlmIChtSW52ZXJzZU1hdHJpeCA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgbUludmVyc2VNYXRyaXggPSBuZXcgTWF0cml4KCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtTWF0cml4LmludmVydChtSW52ZXJzZU1hdHJpeCk7CisgICAgICAgICAgICBtSW52ZXJzZU1hdHJpeERpcnR5ID0gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG1JbnZlcnNlTWF0cml4OworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSBkZWdyZWVzIHRoYXQgdGhlIHZpZXcgaXMgcm90YXRlZCBhcm91bmQgdGhlIHBpdm90IHBvaW50LgorICAgICAqCisgICAgICogQHNlZSAjZ2V0UGl2b3RYKCkKKyAgICAgKiBAc2VlICNnZXRQaXZvdFkoKQorICAgICAqIEByZXR1cm4gVGhlIGRlZ3JlZXMgb2Ygcm90YXRpb24uCisgICAgICovCisgICAgcHVibGljIGZsb2F0IGdldFJvdGF0aW9uKCkgeworICAgICAgICByZXR1cm4gbVJvdGF0aW9uOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIGRlZ3JlZXMgdGhhdCB0aGUgdmlldyBpcyByb3RhdGVkIGFyb3VuZCB0aGUgcGl2b3QgcG9pbnQuIEluY3JlYXNpbmcgdmFsdWVzCisgICAgICogcmVzdWx0IGluIGNsb2Nrd2lzZSByb3RhdGlvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSByb3RhdGlvbiBUaGUgZGVncmVlcyBvZiByb3RhdGlvbi4KKyAgICAgKiBAc2VlICNnZXRQaXZvdFgoKQorICAgICAqIEBzZWUgI2dldFBpdm90WSgpCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Um90YXRpb24oZmxvYXQgcm90YXRpb24pIHsKKyAgICAgICAgaWYgKG1Sb3RhdGlvbiAhPSByb3RhdGlvbikgeworICAgICAgICAgICAgLy8gRG91YmxlLWludmFsaWRhdGlvbiBpcyBuZWNlc3NhcnkgdG8gY2FwdHVyZSB2aWV3J3Mgb2xkIGFuZCBuZXcgYXJlYXMKKyAgICAgICAgICAgIGludmFsaWRhdGUoKTsKKyAgICAgICAgICAgIG1Sb3RhdGlvbiA9IHJvdGF0aW9uOworICAgICAgICAgICAgbU1hdHJpeERpcnR5ID0gdHJ1ZTsKKyAgICAgICAgICAgIG1Qcml2YXRlRmxhZ3MgfD0gRFJBV047IC8vIGZvcmNlIGFub3RoZXIgaW52YWxpZGF0aW9uIHdpdGggdGhlIG5ldyBvcmllbnRhdGlvbgorICAgICAgICAgICAgaW52YWxpZGF0ZSgpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIGRlZ3JlZXMgdGhhdCB0aGUgdmlldyBpcyByb3RhdGVkIGFyb3VuZCB0aGUgdmVydGljYWwgYXhpcyB0aHJvdWdoIHRoZSBwaXZvdCBwb2ludC4KKyAgICAgKgorICAgICAqIEBzZWUgI2dldFBpdm90WCgpCisgICAgICogQHNlZSAjZ2V0UGl2b3RZKCkKKyAgICAgKiBAcmV0dXJuIFRoZSBkZWdyZWVzIG9mIFkgcm90YXRpb24uCisgICAgICovCisgICAgcHVibGljIGZsb2F0IGdldFJvdGF0aW9uWSgpIHsKKyAgICAgICAgcmV0dXJuIG1Sb3RhdGlvblk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgZGVncmVlcyB0aGF0IHRoZSB2aWV3IGlzIHJvdGF0ZWQgYXJvdW5kIHRoZSB2ZXJ0aWNhbCBheGlzIHRocm91Z2ggdGhlIHBpdm90IHBvaW50LgorICAgICAqIEluY3JlYXNpbmcgdmFsdWVzIHJlc3VsdCBpbiBjb3VudGVyLWNsb2Nrd2lzZSByb3RhdGlvbiBmcm9tIHRoZSB2aWV3cG9pbnQgb2YgbG9va2luZworICAgICAqIGRvd24gdGhlIHkgYXhpcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSByb3RhdGlvblkgVGhlIGRlZ3JlZXMgb2YgWSByb3RhdGlvbi4KKyAgICAgKiBAc2VlICNnZXRQaXZvdFgoKQorICAgICAqIEBzZWUgI2dldFBpdm90WSgpCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Um90YXRpb25ZKGZsb2F0IHJvdGF0aW9uWSkgeworICAgICAgICBpZiAobVJvdGF0aW9uWSAhPSByb3RhdGlvblkpIHsKKyAgICAgICAgICAgIC8vIERvdWJsZS1pbnZhbGlkYXRpb24gaXMgbmVjZXNzYXJ5IHRvIGNhcHR1cmUgdmlldydzIG9sZCBhbmQgbmV3IGFyZWFzCisgICAgICAgICAgICBpbnZhbGlkYXRlKCk7CisgICAgICAgICAgICBtUm90YXRpb25ZID0gcm90YXRpb25ZOworICAgICAgICAgICAgbU1hdHJpeERpcnR5ID0gdHJ1ZTsKKyAgICAgICAgICAgIG1Qcml2YXRlRmxhZ3MgfD0gRFJBV047IC8vIGZvcmNlIGFub3RoZXIgaW52YWxpZGF0aW9uIHdpdGggdGhlIG5ldyBvcmllbnRhdGlvbgorICAgICAgICAgICAgaW52YWxpZGF0ZSgpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIGRlZ3JlZXMgdGhhdCB0aGUgdmlldyBpcyByb3RhdGVkIGFyb3VuZCB0aGUgaG9yaXpvbnRhbCBheGlzIHRocm91Z2ggdGhlIHBpdm90IHBvaW50LgorICAgICAqCisgICAgICogQHNlZSAjZ2V0UGl2b3RYKCkKKyAgICAgKiBAc2VlICNnZXRQaXZvdFkoKQorICAgICAqIEByZXR1cm4gVGhlIGRlZ3JlZXMgb2YgWCByb3RhdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgZmxvYXQgZ2V0Um90YXRpb25YKCkgeworICAgICAgICByZXR1cm4gbVJvdGF0aW9uWDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBkZWdyZWVzIHRoYXQgdGhlIHZpZXcgaXMgcm90YXRlZCBhcm91bmQgdGhlIGhvcml6b250YWwgYXhpcyB0aHJvdWdoIHRoZSBwaXZvdCBwb2ludC4KKyAgICAgKiBJbmNyZWFzaW5nIHZhbHVlcyByZXN1bHQgaW4gY2xvY2t3aXNlIHJvdGF0aW9uIGZyb20gdGhlIHZpZXdwb2ludCBvZiBsb29raW5nIGRvd24gdGhlCisgICAgICogeCBheGlzLgorICAgICAqCisgICAgICogQHBhcmFtIHJvdGF0aW9uWCBUaGUgZGVncmVlcyBvZiBYIHJvdGF0aW9uLgorICAgICAqIEBzZWUgI2dldFBpdm90WCgpCisgICAgICogQHNlZSAjZ2V0UGl2b3RZKCkKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRSb3RhdGlvblgoZmxvYXQgcm90YXRpb25YKSB7CisgICAgICAgIGlmIChtUm90YXRpb25YICE9IHJvdGF0aW9uWCkgeworICAgICAgICAgICAgLy8gRG91YmxlLWludmFsaWRhdGlvbiBpcyBuZWNlc3NhcnkgdG8gY2FwdHVyZSB2aWV3J3Mgb2xkIGFuZCBuZXcgYXJlYXMKKyAgICAgICAgICAgIGludmFsaWRhdGUoKTsKKyAgICAgICAgICAgIG1Sb3RhdGlvblggPSByb3RhdGlvblg7CisgICAgICAgICAgICBtTWF0cml4RGlydHkgPSB0cnVlOworICAgICAgICAgICAgbVByaXZhdGVGbGFncyB8PSBEUkFXTjsgLy8gZm9yY2UgYW5vdGhlciBpbnZhbGlkYXRpb24gd2l0aCB0aGUgbmV3IG9yaWVudGF0aW9uCisgICAgICAgICAgICBpbnZhbGlkYXRlKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgYW1vdW50IHRoYXQgdGhlIHZpZXcgaXMgc2NhbGVkIGluIHggYXJvdW5kIHRoZSBwaXZvdCBwb2ludCwgYXMgYSBwcm9wb3J0aW9uIG9mCisgICAgICogdGhlIHZpZXcncyB1bnNjYWxlZCB3aWR0aC4gQSB2YWx1ZSBvZiAxLCB0aGUgZGVmYXVsdCwgbWVhbnMgdGhhdCBubyBzY2FsaW5nIGlzIGFwcGxpZWQuCisgICAgICoKKyAgICAgKiBAZGVmYXVsdCAxLjBmCisgICAgICogQHNlZSAjZ2V0UGl2b3RYKCkKKyAgICAgKiBAc2VlICNnZXRQaXZvdFkoKQorICAgICAqIEByZXR1cm4gVGhlIHNjYWxpbmcgZmFjdG9yLgorICAgICAqLworICAgIHB1YmxpYyBmbG9hdCBnZXRTY2FsZVgoKSB7CisgICAgICAgIHJldHVybiBtU2NhbGVYOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIGFtb3VudCB0aGF0IHRoZSB2aWV3IGlzIHNjYWxlZCBpbiB4IGFyb3VuZCB0aGUgcGl2b3QgcG9pbnQsIGFzIGEgcHJvcG9ydGlvbiBvZgorICAgICAqIHRoZSB2aWV3J3MgdW5zY2FsZWQgd2lkdGguIEEgdmFsdWUgb2YgMSBtZWFucyB0aGF0IG5vIHNjYWxpbmcgaXMgYXBwbGllZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzY2FsZVggVGhlIHNjYWxpbmcgZmFjdG9yLgorICAgICAqIEBzZWUgI2dldFBpdm90WCgpCisgICAgICogQHNlZSAjZ2V0UGl2b3RZKCkKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRTY2FsZVgoZmxvYXQgc2NhbGVYKSB7CisgICAgICAgIGlmIChtU2NhbGVYICE9IHNjYWxlWCkgeworICAgICAgICAgICAgLy8gRG91YmxlLWludmFsaWRhdGlvbiBpcyBuZWNlc3NhcnkgdG8gY2FwdHVyZSB2aWV3J3Mgb2xkIGFuZCBuZXcgYXJlYXMKKyAgICAgICAgICAgIGludmFsaWRhdGUoKTsKKyAgICAgICAgICAgIG1TY2FsZVggPSBzY2FsZVg7CisgICAgICAgICAgICBtTWF0cml4RGlydHkgPSB0cnVlOworICAgICAgICAgICAgbVByaXZhdGVGbGFncyB8PSBEUkFXTjsgLy8gZm9yY2UgYW5vdGhlciBpbnZhbGlkYXRpb24gd2l0aCB0aGUgbmV3IG9yaWVudGF0aW9uCisgICAgICAgICAgICBpbnZhbGlkYXRlKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgYW1vdW50IHRoYXQgdGhlIHZpZXcgaXMgc2NhbGVkIGluIHkgYXJvdW5kIHRoZSBwaXZvdCBwb2ludCwgYXMgYSBwcm9wb3J0aW9uIG9mCisgICAgICogdGhlIHZpZXcncyB1bnNjYWxlZCBoZWlnaHQuIEEgdmFsdWUgb2YgMSwgdGhlIGRlZmF1bHQsIG1lYW5zIHRoYXQgbm8gc2NhbGluZyBpcyBhcHBsaWVkLgorICAgICAqCisgICAgICogQGRlZmF1bHQgMS4wZgorICAgICAqIEBzZWUgI2dldFBpdm90WCgpCisgICAgICogQHNlZSAjZ2V0UGl2b3RZKCkKKyAgICAgKiBAcmV0dXJuIFRoZSBzY2FsaW5nIGZhY3Rvci4KKyAgICAgKi8KKyAgICBwdWJsaWMgZmxvYXQgZ2V0U2NhbGVZKCkgeworICAgICAgICByZXR1cm4gbVNjYWxlWTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBhbW91bnQgdGhhdCB0aGUgdmlldyBpcyBzY2FsZWQgaW4gWSBhcm91bmQgdGhlIHBpdm90IHBvaW50LCBhcyBhIHByb3BvcnRpb24gb2YKKyAgICAgKiB0aGUgdmlldydzIHVuc2NhbGVkIHdpZHRoLiBBIHZhbHVlIG9mIDEgbWVhbnMgdGhhdCBubyBzY2FsaW5nIGlzIGFwcGxpZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gc2NhbGVZIFRoZSBzY2FsaW5nIGZhY3Rvci4KKyAgICAgKiBAc2VlICNnZXRQaXZvdFgoKQorICAgICAqIEBzZWUgI2dldFBpdm90WSgpCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0U2NhbGVZKGZsb2F0IHNjYWxlWSkgeworICAgICAgICBpZiAobVNjYWxlWSAhPSBzY2FsZVkpIHsKKyAgICAgICAgICAgIC8vIERvdWJsZS1pbnZhbGlkYXRpb24gaXMgbmVjZXNzYXJ5IHRvIGNhcHR1cmUgdmlldydzIG9sZCBhbmQgbmV3IGFyZWFzCisgICAgICAgICAgICBpbnZhbGlkYXRlKCk7CisgICAgICAgICAgICBtU2NhbGVZID0gc2NhbGVZOworICAgICAgICAgICAgbU1hdHJpeERpcnR5ID0gdHJ1ZTsKKyAgICAgICAgICAgIG1Qcml2YXRlRmxhZ3MgfD0gRFJBV047IC8vIGZvcmNlIGFub3RoZXIgaW52YWxpZGF0aW9uIHdpdGggdGhlIG5ldyBvcmllbnRhdGlvbgorICAgICAgICAgICAgaW52YWxpZGF0ZSgpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIHggbG9jYXRpb24gb2YgdGhlIHBvaW50IGFyb3VuZCB3aGljaCB0aGUgdmlldyBpcyB7QGxpbmsgI3NldFJvdGF0aW9uKGZsb2F0KSByb3RhdGVkfQorICAgICAqIGFuZCB7QGxpbmsgI3NldFNjYWxlWChmbG9hdCkgc2NhbGVkfS4KKyAgICAgKgorICAgICAqIEBzZWUgI2dldFJvdGF0aW9uKCkKKyAgICAgKiBAc2VlICNnZXRTY2FsZVgoKQorICAgICAqIEBzZWUgI2dldFNjYWxlWSgpCisgICAgICogQHNlZSAjZ2V0UGl2b3RZKCkKKyAgICAgKiBAcmV0dXJuIFRoZSB4IGxvY2F0aW9uIG9mIHRoZSBwaXZvdCBwb2ludC4KKyAgICAgKi8KKyAgICBwdWJsaWMgZmxvYXQgZ2V0UGl2b3RYKCkgeworICAgICAgICByZXR1cm4gbVBpdm90WDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSB4IGxvY2F0aW9uIG9mIHRoZSBwb2ludCBhcm91bmQgd2hpY2ggdGhlIHZpZXcgaXMKKyAgICAgKiB7QGxpbmsgI3NldFJvdGF0aW9uKGZsb2F0KSByb3RhdGVkfSBhbmQge0BsaW5rICNzZXRTY2FsZVgoZmxvYXQpIHNjYWxlZH0uCisgICAgICogQnkgZGVmYXVsdCwgdGhlIHBpdm90IHBvaW50IGlzIGNlbnRlcmVkIG9uIHRoZSBvYmplY3QuCisgICAgICogU2V0dGluZyB0aGlzIHByb3BlcnR5IGRpc2FibGVzIHRoaXMgYmVoYXZpb3IgYW5kIGNhdXNlcyB0aGUgdmlldyB0byB1c2Ugb25seSB0aGUKKyAgICAgKiBleHBsaWNpdGx5IHNldCBwaXZvdFggYW5kIHBpdm90WSB2YWx1ZXMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcGl2b3RYIFRoZSB4IGxvY2F0aW9uIG9mIHRoZSBwaXZvdCBwb2ludC4KKyAgICAgKiBAc2VlICNnZXRSb3RhdGlvbigpCisgICAgICogQHNlZSAjZ2V0U2NhbGVYKCkKKyAgICAgKiBAc2VlICNnZXRTY2FsZVkoKQorICAgICAqIEBzZWUgI2dldFBpdm90WSgpCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UGl2b3RYKGZsb2F0IHBpdm90WCkgeworICAgICAgICBtUHJpdmF0ZUZsYWdzIHw9IFBJVk9UX0VYUExJQ0lUTFlfU0VUOworICAgICAgICBpZiAobVBpdm90WCAhPSBwaXZvdFgpIHsKKyAgICAgICAgICAgIC8vIERvdWJsZS1pbnZhbGlkYXRpb24gaXMgbmVjZXNzYXJ5IHRvIGNhcHR1cmUgdmlldydzIG9sZCBhbmQgbmV3IGFyZWFzCisgICAgICAgICAgICBpbnZhbGlkYXRlKCk7CisgICAgICAgICAgICBtUGl2b3RYID0gcGl2b3RYOworICAgICAgICAgICAgbU1hdHJpeERpcnR5ID0gdHJ1ZTsKKyAgICAgICAgICAgIG1Qcml2YXRlRmxhZ3MgfD0gRFJBV047IC8vIGZvcmNlIGFub3RoZXIgaW52YWxpZGF0aW9uIHdpdGggdGhlIG5ldyBvcmllbnRhdGlvbgorICAgICAgICAgICAgaW52YWxpZGF0ZSgpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIHkgbG9jYXRpb24gb2YgdGhlIHBvaW50IGFyb3VuZCB3aGljaCB0aGUgdmlldyBpcyB7QGxpbmsgI3NldFJvdGF0aW9uKGZsb2F0KSByb3RhdGVkfQorICAgICAqIGFuZCB7QGxpbmsgI3NldFNjYWxlWShmbG9hdCkgc2NhbGVkfS4KKyAgICAgKgorICAgICAqIEBzZWUgI2dldFJvdGF0aW9uKCkKKyAgICAgKiBAc2VlICNnZXRTY2FsZVgoKQorICAgICAqIEBzZWUgI2dldFNjYWxlWSgpCisgICAgICogQHNlZSAjZ2V0UGl2b3RZKCkKKyAgICAgKiBAcmV0dXJuIFRoZSB5IGxvY2F0aW9uIG9mIHRoZSBwaXZvdCBwb2ludC4KKyAgICAgKi8KKyAgICBwdWJsaWMgZmxvYXQgZ2V0UGl2b3RZKCkgeworICAgICAgICByZXR1cm4gbVBpdm90WTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSB5IGxvY2F0aW9uIG9mIHRoZSBwb2ludCBhcm91bmQgd2hpY2ggdGhlIHZpZXcgaXMge0BsaW5rICNzZXRSb3RhdGlvbihmbG9hdCkgcm90YXRlZH0KKyAgICAgKiBhbmQge0BsaW5rICNzZXRTY2FsZVkoZmxvYXQpIHNjYWxlZH0uIEJ5IGRlZmF1bHQsIHRoZSBwaXZvdCBwb2ludCBpcyBjZW50ZXJlZCBvbiB0aGUgb2JqZWN0LgorICAgICAqIFNldHRpbmcgdGhpcyBwcm9wZXJ0eSBkaXNhYmxlcyB0aGlzIGJlaGF2aW9yIGFuZCBjYXVzZXMgdGhlIHZpZXcgdG8gdXNlIG9ubHkgdGhlCisgICAgICogZXhwbGljaXRseSBzZXQgcGl2b3RYIGFuZCBwaXZvdFkgdmFsdWVzLgorICAgICAqCisgICAgICogQHBhcmFtIHBpdm90WSBUaGUgeSBsb2NhdGlvbiBvZiB0aGUgcGl2b3QgcG9pbnQuCisgICAgICogQHNlZSAjZ2V0Um90YXRpb24oKQorICAgICAqIEBzZWUgI2dldFNjYWxlWCgpCisgICAgICogQHNlZSAjZ2V0U2NhbGVZKCkKKyAgICAgKiBAc2VlICNnZXRQaXZvdFkoKQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFBpdm90WShmbG9hdCBwaXZvdFkpIHsKKyAgICAgICAgbVByaXZhdGVGbGFncyB8PSBQSVZPVF9FWFBMSUNJVExZX1NFVDsKKyAgICAgICAgaWYgKG1QaXZvdFkgIT0gcGl2b3RZKSB7CisgICAgICAgICAgICAvLyBEb3VibGUtaW52YWxpZGF0aW9uIGlzIG5lY2Vzc2FyeSB0byBjYXB0dXJlIHZpZXcncyBvbGQgYW5kIG5ldyBhcmVhcworICAgICAgICAgICAgaW52YWxpZGF0ZSgpOworICAgICAgICAgICAgbVBpdm90WSA9IHBpdm90WTsKKyAgICAgICAgICAgIG1NYXRyaXhEaXJ0eSA9IHRydWU7CisgICAgICAgICAgICBtUHJpdmF0ZUZsYWdzIHw9IERSQVdOOyAvLyBmb3JjZSBhbm90aGVyIGludmFsaWRhdGlvbiB3aXRoIHRoZSBuZXcgb3JpZW50YXRpb24KKyAgICAgICAgICAgIGludmFsaWRhdGUoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSBvcGFjaXR5IG9mIHRoZSB2aWV3LiBUaGlzIGlzIGEgdmFsdWUgZnJvbSAwIHRvIDEsIHdoZXJlIDAgbWVhbnMgdGhlIHZpZXcgaXMKKyAgICAgKiBjb21wbGV0ZWx5IHRyYW5zcGFyZW50IGFuZCAxIG1lYW5zIHRoZSB2aWV3IGlzIGNvbXBsZXRlbHkgb3BhcXVlLgorICAgICAqCisgICAgICogQGRlZmF1bHQgMS4wZgorICAgICAqIEByZXR1cm4gVGhlIG9wYWNpdHkgb2YgdGhlIHZpZXcuCisgICAgICovCisgICAgcHVibGljIGZsb2F0IGdldEFscGhhKCkgeworICAgICAgICByZXR1cm4gbUFscGhhOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIG9wYWNpdHkgb2YgdGhlIHZpZXcuIFRoaXMgaXMgYSB2YWx1ZSBmcm9tIDAgdG8gMSwgd2hlcmUgMCBtZWFucyB0aGUgdmlldyBpcworICAgICAqIGNvbXBsZXRlbHkgdHJhbnNwYXJlbnQgYW5kIDEgbWVhbnMgdGhlIHZpZXcgaXMgY29tcGxldGVseSBvcGFxdWUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYWxwaGEgVGhlIG9wYWNpdHkgb2YgdGhlIHZpZXcuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0QWxwaGEoZmxvYXQgYWxwaGEpIHsKKyAgICAgICAgbUFscGhhID0gYWxwaGE7CisgICAgICAgIG9uU2V0QWxwaGEoKGludCkgKGFscGhhICogMjU1KSk7CisgICAgICAgIGludmFsaWRhdGUoKTsKKyAgICB9CisKKyAgICAvKioKICAgICAgKiBUb3AgcG9zaXRpb24gb2YgdGhpcyB2aWV3IHJlbGF0aXZlIHRvIGl0cyBwYXJlbnQuCiAgICAgICoKICAgICAgKiBAcmV0dXJuIFRoZSB0b3Agb2YgdGhpcyB2aWV3LCBpbiBwaXhlbHMuCkBAIC00ODU4LDYgKzU0NTcsNDUgQEAKICAgICB9CiAKICAgICAvKioKKyAgICAgKiBTZXRzIHRoZSB0b3AgcG9zaXRpb24gb2YgdGhpcyB2aWV3IHJlbGF0aXZlIHRvIGl0cyBwYXJlbnQuIFRoaXMgbWV0aG9kIGlzIG1lYW50IHRvIGJlIGNhbGxlZAorICAgICAqIGJ5IHRoZSBsYXlvdXQgc3lzdGVtIGFuZCBzaG91bGQgbm90IGdlbmVyYWxseSBiZSBjYWxsZWQgb3RoZXJ3aXNlLCBiZWNhdXNlIHRoZSBwcm9wZXJ0eQorICAgICAqIG1heSBiZSBjaGFuZ2VkIGF0IGFueSB0aW1lIGJ5IHRoZSBsYXlvdXQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdG9wIFRoZSB0b3Agb2YgdGhpcyB2aWV3LCBpbiBwaXhlbHMuCisgICAgICovCisgICAgcHVibGljIGZpbmFsIHZvaWQgc2V0VG9wKGludCB0b3ApIHsKKyAgICAgICAgaWYgKHRvcCAhPSBtVG9wKSB7CisgICAgICAgICAgICBpZiAoaGFzSWRlbnRpdHlNYXRyaXgoKSkgeworICAgICAgICAgICAgICAgIGZpbmFsIFZpZXdQYXJlbnQgcCA9IG1QYXJlbnQ7CisgICAgICAgICAgICAgICAgaWYgKHAgIT0gbnVsbCAmJiBtQXR0YWNoSW5mbyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGZpbmFsIFJlY3QgciA9IG1BdHRhY2hJbmZvLm1UbXBJbnZhbFJlY3Q7CisgICAgICAgICAgICAgICAgICAgIGludCBtaW5Ub3A7CisgICAgICAgICAgICAgICAgICAgIGludCB5TG9jOworICAgICAgICAgICAgICAgICAgICBpZiAodG9wIDwgbVRvcCkgeworICAgICAgICAgICAgICAgICAgICAgICAgbWluVG9wID0gdG9wOworICAgICAgICAgICAgICAgICAgICAgICAgeUxvYyA9IHRvcCAtIG1Ub3A7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtaW5Ub3AgPSBtVG9wOworICAgICAgICAgICAgICAgICAgICAgICAgeUxvYyA9IDA7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgci5zZXQoMCwgeUxvYywgbVJpZ2h0IC0gbUxlZnQsIG1Cb3R0b20gLSBtaW5Ub3ApOworICAgICAgICAgICAgICAgICAgICBwLmludmFsaWRhdGVDaGlsZCh0aGlzLCByKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8vIERvdWJsZS1pbnZhbGlkYXRpb24gaXMgbmVjZXNzYXJ5IHRvIGNhcHR1cmUgdmlldydzIG9sZCBhbmQgbmV3IGFyZWFzCisgICAgICAgICAgICAgICAgaW52YWxpZGF0ZSgpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBtVG9wID0gdG9wOworCisgICAgICAgICAgICBpZiAoIW1NYXRyaXhJc0lkZW50aXR5KSB7CisgICAgICAgICAgICAgICAgbVByaXZhdGVGbGFncyB8PSBEUkFXTjsgLy8gZm9yY2UgYW5vdGhlciBpbnZhbGlkYXRpb24gd2l0aCB0aGUgbmV3IG9yaWVudGF0aW9uCisgICAgICAgICAgICAgICAgaW52YWxpZGF0ZSgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCiAgICAgICogQm90dG9tIHBvc2l0aW9uIG9mIHRoaXMgdmlldyByZWxhdGl2ZSB0byBpdHMgcGFyZW50LgogICAgICAqCiAgICAgICogQHJldHVybiBUaGUgYm90dG9tIG9mIHRoaXMgdmlldywgaW4gcGl4ZWxzLgpAQCAtNDg2OCw2ICs1NTA2LDQyIEBACiAgICAgfQogCiAgICAgLyoqCisgICAgICogU2V0cyB0aGUgYm90dG9tIHBvc2l0aW9uIG9mIHRoaXMgdmlldyByZWxhdGl2ZSB0byBpdHMgcGFyZW50LiBUaGlzIG1ldGhvZCBpcyBtZWFudCB0byBiZQorICAgICAqIGNhbGxlZCBieSB0aGUgbGF5b3V0IHN5c3RlbSBhbmQgc2hvdWxkIG5vdCBnZW5lcmFsbHkgYmUgY2FsbGVkIG90aGVyd2lzZSwgYmVjYXVzZSB0aGUKKyAgICAgKiBwcm9wZXJ0eSBtYXkgYmUgY2hhbmdlZCBhdCBhbnkgdGltZSBieSB0aGUgbGF5b3V0LgorICAgICAqCisgICAgICogQHBhcmFtIGJvdHRvbSBUaGUgYm90dG9tIG9mIHRoaXMgdmlldywgaW4gcGl4ZWxzLgorICAgICAqLworICAgIHB1YmxpYyBmaW5hbCB2b2lkIHNldEJvdHRvbShpbnQgYm90dG9tKSB7CisgICAgICAgIGlmIChib3R0b20gIT0gbUJvdHRvbSkgeworICAgICAgICAgICAgaWYgKGhhc0lkZW50aXR5TWF0cml4KCkpIHsKKyAgICAgICAgICAgICAgICBmaW5hbCBWaWV3UGFyZW50IHAgPSBtUGFyZW50OworICAgICAgICAgICAgICAgIGlmIChwICE9IG51bGwgJiYgbUF0dGFjaEluZm8gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBmaW5hbCBSZWN0IHIgPSBtQXR0YWNoSW5mby5tVG1wSW52YWxSZWN0OworICAgICAgICAgICAgICAgICAgICBpbnQgbWF4Qm90dG9tOworICAgICAgICAgICAgICAgICAgICBpZiAoYm90dG9tIDwgbUJvdHRvbSkgeworICAgICAgICAgICAgICAgICAgICAgICAgbWF4Qm90dG9tID0gbUJvdHRvbTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1heEJvdHRvbSA9IGJvdHRvbTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICByLnNldCgwLCAwLCBtUmlnaHQgLSBtTGVmdCwgbWF4Qm90dG9tIC0gbVRvcCk7CisgICAgICAgICAgICAgICAgICAgIHAuaW52YWxpZGF0ZUNoaWxkKHRoaXMsIHIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLy8gRG91YmxlLWludmFsaWRhdGlvbiBpcyBuZWNlc3NhcnkgdG8gY2FwdHVyZSB2aWV3J3Mgb2xkIGFuZCBuZXcgYXJlYXMKKyAgICAgICAgICAgICAgICBpbnZhbGlkYXRlKCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG1Cb3R0b20gPSBib3R0b207CisKKyAgICAgICAgICAgIGlmICghbU1hdHJpeElzSWRlbnRpdHkpIHsKKyAgICAgICAgICAgICAgICBtUHJpdmF0ZUZsYWdzIHw9IERSQVdOOyAvLyBmb3JjZSBhbm90aGVyIGludmFsaWRhdGlvbiB3aXRoIHRoZSBuZXcgb3JpZW50YXRpb24KKyAgICAgICAgICAgICAgICBpbnZhbGlkYXRlKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKICAgICAgKiBMZWZ0IHBvc2l0aW9uIG9mIHRoaXMgdmlldyByZWxhdGl2ZSB0byBpdHMgcGFyZW50LgogICAgICAqCiAgICAgICogQHJldHVybiBUaGUgbGVmdCBlZGdlIG9mIHRoaXMgdmlldywgaW4gcGl4ZWxzLgpAQCAtNDg3OCw2ICs1NTUyLDQ2IEBACiAgICAgfQogCiAgICAgLyoqCisgICAgICogU2V0cyB0aGUgbGVmdCBwb3NpdGlvbiBvZiB0aGlzIHZpZXcgcmVsYXRpdmUgdG8gaXRzIHBhcmVudC4gVGhpcyBtZXRob2QgaXMgbWVhbnQgdG8gYmUgY2FsbGVkCisgICAgICogYnkgdGhlIGxheW91dCBzeXN0ZW0gYW5kIHNob3VsZCBub3QgZ2VuZXJhbGx5IGJlIGNhbGxlZCBvdGhlcndpc2UsIGJlY2F1c2UgdGhlIHByb3BlcnR5CisgICAgICogbWF5IGJlIGNoYW5nZWQgYXQgYW55IHRpbWUgYnkgdGhlIGxheW91dC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBsZWZ0IFRoZSBib3R0b20gb2YgdGhpcyB2aWV3LCBpbiBwaXhlbHMuCisgICAgICovCisgICAgcHVibGljIGZpbmFsIHZvaWQgc2V0TGVmdChpbnQgbGVmdCkgeworICAgICAgICBpZiAobGVmdCAhPSBtTGVmdCkgeworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJ2aWV3ICIgKyB0aGlzICsgIiBsZWZ0ID0gIiArIGxlZnQpOworICAgICAgICAgICAgaWYgKGhhc0lkZW50aXR5TWF0cml4KCkpIHsKKyAgICAgICAgICAgICAgICBmaW5hbCBWaWV3UGFyZW50IHAgPSBtUGFyZW50OworICAgICAgICAgICAgICAgIGlmIChwICE9IG51bGwgJiYgbUF0dGFjaEluZm8gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBmaW5hbCBSZWN0IHIgPSBtQXR0YWNoSW5mby5tVG1wSW52YWxSZWN0OworICAgICAgICAgICAgICAgICAgICBpbnQgbWluTGVmdDsKKyAgICAgICAgICAgICAgICAgICAgaW50IHhMb2M7CisgICAgICAgICAgICAgICAgICAgIGlmIChsZWZ0IDwgbUxlZnQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1pbkxlZnQgPSBsZWZ0OworICAgICAgICAgICAgICAgICAgICAgICAgeExvYyA9IGxlZnQgLSBtTGVmdDsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1pbkxlZnQgPSBtTGVmdDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHhMb2MgPSAwOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHIuc2V0KHhMb2MsIDAsIG1SaWdodCAtIG1pbkxlZnQsIG1Cb3R0b20gLSBtVG9wKTsKKyAgICAgICAgICAgICAgICAgICAgcC5pbnZhbGlkYXRlQ2hpbGQodGhpcywgcik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvLyBEb3VibGUtaW52YWxpZGF0aW9uIGlzIG5lY2Vzc2FyeSB0byBjYXB0dXJlIHZpZXcncyBvbGQgYW5kIG5ldyBhcmVhcworICAgICAgICAgICAgICAgIGludmFsaWRhdGUoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgbUxlZnQgPSBsZWZ0OworCisgICAgICAgICAgICBpZiAoIW1NYXRyaXhJc0lkZW50aXR5KSB7CisgICAgICAgICAgICAgICAgbVByaXZhdGVGbGFncyB8PSBEUkFXTjsgLy8gZm9yY2UgYW5vdGhlciBpbnZhbGlkYXRpb24gd2l0aCB0aGUgbmV3IG9yaWVudGF0aW9uCisgICAgICAgICAgICAgICAgaW52YWxpZGF0ZSgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCiAgICAgICogUmlnaHQgcG9zaXRpb24gb2YgdGhpcyB2aWV3IHJlbGF0aXZlIHRvIGl0cyBwYXJlbnQuCiAgICAgICoKICAgICAgKiBAcmV0dXJuIFRoZSByaWdodCBlZGdlIG9mIHRoaXMgdmlldywgaW4gcGl4ZWxzLgpAQCAtNDg4OCwxMiArNTYwMiwxNzQgQEAKICAgICB9CiAKICAgICAvKioKKyAgICAgKiBTZXRzIHRoZSByaWdodCBwb3NpdGlvbiBvZiB0aGlzIHZpZXcgcmVsYXRpdmUgdG8gaXRzIHBhcmVudC4gVGhpcyBtZXRob2QgaXMgbWVhbnQgdG8gYmUgY2FsbGVkCisgICAgICogYnkgdGhlIGxheW91dCBzeXN0ZW0gYW5kIHNob3VsZCBub3QgZ2VuZXJhbGx5IGJlIGNhbGxlZCBvdGhlcndpc2UsIGJlY2F1c2UgdGhlIHByb3BlcnR5CisgICAgICogbWF5IGJlIGNoYW5nZWQgYXQgYW55IHRpbWUgYnkgdGhlIGxheW91dC4KKyAgICAgKgorICAgICAqIEBwYXJhbSByaWdodCBUaGUgYm90dG9tIG9mIHRoaXMgdmlldywgaW4gcGl4ZWxzLgorICAgICAqLworICAgIHB1YmxpYyBmaW5hbCB2b2lkIHNldFJpZ2h0KGludCByaWdodCkgeworICAgICAgICBpZiAocmlnaHQgIT0gbVJpZ2h0KSB7CisgICAgICAgICAgICBpZiAoaGFzSWRlbnRpdHlNYXRyaXgoKSkgeworICAgICAgICAgICAgICAgIGZpbmFsIFZpZXdQYXJlbnQgcCA9IG1QYXJlbnQ7CisgICAgICAgICAgICAgICAgaWYgKHAgIT0gbnVsbCAmJiBtQXR0YWNoSW5mbyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGZpbmFsIFJlY3QgciA9IG1BdHRhY2hJbmZvLm1UbXBJbnZhbFJlY3Q7CisgICAgICAgICAgICAgICAgICAgIGludCBtYXhSaWdodDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHJpZ2h0IDwgbVJpZ2h0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtYXhSaWdodCA9IG1SaWdodDsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1heFJpZ2h0ID0gcmlnaHQ7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgci5zZXQoMCwgMCwgbWF4UmlnaHQgLSBtTGVmdCwgbUJvdHRvbSAtIG1Ub3ApOworICAgICAgICAgICAgICAgICAgICBwLmludmFsaWRhdGVDaGlsZCh0aGlzLCByKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8vIERvdWJsZS1pbnZhbGlkYXRpb24gaXMgbmVjZXNzYXJ5IHRvIGNhcHR1cmUgdmlldydzIG9sZCBhbmQgbmV3IGFyZWFzCisgICAgICAgICAgICAgICAgaW52YWxpZGF0ZSgpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBtUmlnaHQgPSByaWdodDsKKworICAgICAgICAgICAgaWYgKCFtTWF0cml4SXNJZGVudGl0eSkgeworICAgICAgICAgICAgICAgIG1Qcml2YXRlRmxhZ3MgfD0gRFJBV047IC8vIGZvcmNlIGFub3RoZXIgaW52YWxpZGF0aW9uIHdpdGggdGhlIG5ldyBvcmllbnRhdGlvbgorICAgICAgICAgICAgICAgIGludmFsaWRhdGUoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSB2aXN1YWwgeCBwb3NpdGlvbiBvZiB0aGlzIHZpZXcsIGluIHBpeGVscy4gVGhpcyBpcyBlcXVpdmFsZW50IHRvIHRoZQorICAgICAqIHtAbGluayAjc2V0VHJhbnNsYXRpb25YKGZsb2F0KSB0cmFuc2xhdGlvblh9IHByb3BlcnR5IHBsdXMgdGhlIGN1cnJlbnQKKyAgICAgKiB7QGxpbmsgI2dldExlZnQoKSBsZWZ0fSBwcm9wZXJ0eS4gCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFRoZSB2aXN1YWwgeCBwb3NpdGlvbiBvZiB0aGlzIHZpZXcsIGluIHBpeGVscy4KKyAgICAgKi8KKyAgICBwdWJsaWMgZmxvYXQgZ2V0WCgpIHsKKyAgICAgICAgcmV0dXJuIG1MZWZ0ICsgbVRyYW5zbGF0aW9uWDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSB2aXN1YWwgeCBwb3NpdGlvbiBvZiB0aGlzIHZpZXcsIGluIHBpeGVscy4gVGhpcyBpcyBlcXVpdmFsZW50IHRvIHNldHRpbmcgdGhlCisgICAgICoge0BsaW5rICNzZXRUcmFuc2xhdGlvblgoZmxvYXQpIHRyYW5zbGF0aW9uWH0gcHJvcGVydHkgdG8gYmUgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbgorICAgICAqIHRoZSB4IHZhbHVlIHBhc3NlZCBpbiBhbmQgdGhlIGN1cnJlbnQge0BsaW5rICNnZXRMZWZ0KCkgbGVmdH0gcHJvcGVydHkuCisgICAgICoKKyAgICAgKiBAcGFyYW0geCBUaGUgdmlzdWFsIHggcG9zaXRpb24gb2YgdGhpcyB2aWV3LCBpbiBwaXhlbHMuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0WChmbG9hdCB4KSB7CisgICAgICAgIHNldFRyYW5zbGF0aW9uWCh4IC0gbUxlZnQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSB2aXN1YWwgeSBwb3NpdGlvbiBvZiB0aGlzIHZpZXcsIGluIHBpeGVscy4gVGhpcyBpcyBlcXVpdmFsZW50IHRvIHRoZQorICAgICAqIHtAbGluayAjc2V0VHJhbnNsYXRpb25ZKGZsb2F0KSB0cmFuc2xhdGlvbll9IHByb3BlcnR5IHBsdXMgdGhlIGN1cnJlbnQKKyAgICAgKiB7QGxpbmsgI2dldFRvcCgpIHRvcH0gcHJvcGVydHkuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFRoZSB2aXN1YWwgeSBwb3NpdGlvbiBvZiB0aGlzIHZpZXcsIGluIHBpeGVscy4KKyAgICAgKi8KKyAgICBwdWJsaWMgZmxvYXQgZ2V0WSgpIHsKKyAgICAgICAgcmV0dXJuIG1Ub3AgKyBtVHJhbnNsYXRpb25ZOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIHZpc3VhbCB5IHBvc2l0aW9uIG9mIHRoaXMgdmlldywgaW4gcGl4ZWxzLiBUaGlzIGlzIGVxdWl2YWxlbnQgdG8gc2V0dGluZyB0aGUKKyAgICAgKiB7QGxpbmsgI3NldFRyYW5zbGF0aW9uWShmbG9hdCkgdHJhbnNsYXRpb25ZfSBwcm9wZXJ0eSB0byBiZSB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuCisgICAgICogdGhlIHkgdmFsdWUgcGFzc2VkIGluIGFuZCB0aGUgY3VycmVudCB7QGxpbmsgI2dldFRvcCgpIHRvcH0gcHJvcGVydHkuCisgICAgICoKKyAgICAgKiBAcGFyYW0geSBUaGUgdmlzdWFsIHkgcG9zaXRpb24gb2YgdGhpcyB2aWV3LCBpbiBwaXhlbHMuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0WShmbG9hdCB5KSB7CisgICAgICAgIHNldFRyYW5zbGF0aW9uWSh5IC0gbVRvcCk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBUaGUgaG9yaXpvbnRhbCBsb2NhdGlvbiBvZiB0aGlzIHZpZXcgcmVsYXRpdmUgdG8gaXRzIHtAbGluayAjZ2V0TGVmdCgpIGxlZnR9IHBvc2l0aW9uLgorICAgICAqIFRoaXMgcG9zaXRpb24gaXMgcG9zdC1sYXlvdXQsIGluIGFkZGl0aW9uIHRvIHdoZXJldmVyIHRoZSBvYmplY3QncworICAgICAqIGxheW91dCBwbGFjZWQgaXQuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFRoZSBob3Jpem9udGFsIHBvc2l0aW9uIG9mIHRoaXMgdmlldyByZWxhdGl2ZSB0byBpdHMgbGVmdCBwb3NpdGlvbiwgaW4gcGl4ZWxzLgorICAgICAqLworICAgIHB1YmxpYyBmbG9hdCBnZXRUcmFuc2xhdGlvblgoKSB7CisgICAgICAgIHJldHVybiBtVHJhbnNsYXRpb25YOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIGhvcml6b250YWwgbG9jYXRpb24gb2YgdGhpcyB2aWV3IHJlbGF0aXZlIHRvIGl0cyB7QGxpbmsgI2dldExlZnQoKSBsZWZ0fSBwb3NpdGlvbi4KKyAgICAgKiBUaGlzIGVmZmVjdGl2ZWx5IHBvc2l0aW9ucyB0aGUgb2JqZWN0IHBvc3QtbGF5b3V0LCBpbiBhZGRpdGlvbiB0byB3aGVyZXZlciB0aGUgb2JqZWN0J3MKKyAgICAgKiBsYXlvdXQgcGxhY2VkIGl0LgorICAgICAqCisgICAgICogQHBhcmFtIHRyYW5zbGF0aW9uWCBUaGUgaG9yaXpvbnRhbCBwb3NpdGlvbiBvZiB0aGlzIHZpZXcgcmVsYXRpdmUgdG8gaXRzIGxlZnQgcG9zaXRpb24sCisgICAgICogaW4gcGl4ZWxzLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFRyYW5zbGF0aW9uWChmbG9hdCB0cmFuc2xhdGlvblgpIHsKKyAgICAgICAgaWYgKG1UcmFuc2xhdGlvblggIT0gdHJhbnNsYXRpb25YKSB7CisgICAgICAgICAgICAvLyBEb3VibGUtaW52YWxpZGF0aW9uIGlzIG5lY2Vzc2FyeSB0byBjYXB0dXJlIHZpZXcncyBvbGQgYW5kIG5ldyBhcmVhcworICAgICAgICAgICAgaW52YWxpZGF0ZSgpOworICAgICAgICAgICAgbVRyYW5zbGF0aW9uWCA9IHRyYW5zbGF0aW9uWDsKKyAgICAgICAgICAgIG1NYXRyaXhEaXJ0eSA9IHRydWU7CisgICAgICAgICAgICBtUHJpdmF0ZUZsYWdzIHw9IERSQVdOOyAvLyBmb3JjZSBhbm90aGVyIGludmFsaWRhdGlvbiB3aXRoIHRoZSBuZXcgb3JpZW50YXRpb24KKyAgICAgICAgICAgIGludmFsaWRhdGUoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSBob3Jpem9udGFsIGxvY2F0aW9uIG9mIHRoaXMgdmlldyByZWxhdGl2ZSB0byBpdHMge0BsaW5rICNnZXRUb3AoKSB0b3B9IHBvc2l0aW9uLgorICAgICAqIFRoaXMgcG9zaXRpb24gaXMgcG9zdC1sYXlvdXQsIGluIGFkZGl0aW9uIHRvIHdoZXJldmVyIHRoZSBvYmplY3QncworICAgICAqIGxheW91dCBwbGFjZWQgaXQuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFRoZSB2ZXJ0aWNhbCBwb3NpdGlvbiBvZiB0aGlzIHZpZXcgcmVsYXRpdmUgdG8gaXRzIHRvcCBwb3NpdGlvbiwKKyAgICAgKiBpbiBwaXhlbHMuCisgICAgICovCisgICAgcHVibGljIGZsb2F0IGdldFRyYW5zbGF0aW9uWSgpIHsKKyAgICAgICAgcmV0dXJuIG1UcmFuc2xhdGlvblk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgdmVydGljYWwgbG9jYXRpb24gb2YgdGhpcyB2aWV3IHJlbGF0aXZlIHRvIGl0cyB7QGxpbmsgI2dldFRvcCgpIHRvcH0gcG9zaXRpb24uCisgICAgICogVGhpcyBlZmZlY3RpdmVseSBwb3NpdGlvbnMgdGhlIG9iamVjdCBwb3N0LWxheW91dCwgaW4gYWRkaXRpb24gdG8gd2hlcmV2ZXIgdGhlIG9iamVjdCdzCisgICAgICogbGF5b3V0IHBsYWNlZCBpdC4KKyAgICAgKgorICAgICAqIEBwYXJhbSB0cmFuc2xhdGlvblkgVGhlIHZlcnRpY2FsIHBvc2l0aW9uIG9mIHRoaXMgdmlldyByZWxhdGl2ZSB0byBpdHMgdG9wIHBvc2l0aW9uLAorICAgICAqIGluIHBpeGVscy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRUcmFuc2xhdGlvblkoZmxvYXQgdHJhbnNsYXRpb25ZKSB7CisgICAgICAgIGlmIChtVHJhbnNsYXRpb25ZICE9IHRyYW5zbGF0aW9uWSkgeworICAgICAgICAgICAgLy8gRG91YmxlLWludmFsaWRhdGlvbiBpcyBuZWNlc3NhcnkgdG8gY2FwdHVyZSB2aWV3J3Mgb2xkIGFuZCBuZXcgYXJlYXMKKyAgICAgICAgICAgIGludmFsaWRhdGUoKTsKKyAgICAgICAgICAgIG1UcmFuc2xhdGlvblkgPSB0cmFuc2xhdGlvblk7CisgICAgICAgICAgICBtTWF0cml4RGlydHkgPSB0cnVlOworICAgICAgICAgICAgbVByaXZhdGVGbGFncyB8PSBEUkFXTjsgLy8gZm9yY2UgYW5vdGhlciBpbnZhbGlkYXRpb24gd2l0aCB0aGUgbmV3IG9yaWVudGF0aW9uCisgICAgICAgICAgICBpbnZhbGlkYXRlKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKICAgICAgKiBIaXQgcmVjdGFuZ2xlIGluIHBhcmVudCdzIGNvb3JkaW5hdGVzCiAgICAgICoKICAgICAgKiBAcGFyYW0gb3V0UmVjdCBUaGUgaGl0IHJlY3RhbmdsZSBvZiB0aGUgdmlldy4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBnZXRIaXRSZWN0KFJlY3Qgb3V0UmVjdCkgewotICAgICAgICBvdXRSZWN0LnNldChtTGVmdCwgbVRvcCwgbVJpZ2h0LCBtQm90dG9tKTsKKyAgICAgICAgaWYgKGhhc0lkZW50aXR5TWF0cml4KCkgfHwgbUF0dGFjaEluZm8gPT0gbnVsbCkgeworICAgICAgICAgICAgb3V0UmVjdC5zZXQobUxlZnQsIG1Ub3AsIG1SaWdodCwgbUJvdHRvbSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBNYXRyaXggbSA9IGdldE1hdHJpeCgpOworICAgICAgICAgICAgZmluYWwgUmVjdEYgdG1wUmVjdCA9IG1BdHRhY2hJbmZvLm1UbXBUcmFuc2Zvcm1SZWN0OworICAgICAgICAgICAgdG1wUmVjdC5zZXQoLW1QaXZvdFgsIC1tUGl2b3RZLCBnZXRXaWR0aCgpIC0gbVBpdm90WCwgZ2V0SGVpZ2h0KCkgLSBtUGl2b3RZKTsKKyAgICAgICAgICAgIG0ubWFwUmVjdCh0bXBSZWN0KTsKKyAgICAgICAgICAgIG91dFJlY3Quc2V0KChpbnQpIHRtcFJlY3QubGVmdCArIG1MZWZ0LCAoaW50KSB0bXBSZWN0LnRvcCArIG1Ub3AsCisgICAgICAgICAgICAgICAgICAgIChpbnQpIHRtcFJlY3QucmlnaHQgKyBtTGVmdCwgKGludCkgdG1wUmVjdC5ib3R0b20gKyBtVG9wKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFV0aWxpdHkgbWV0aG9kIHRvIGRldGVybWluZSB3aGV0aGVyIHRoZSBnaXZlbiBwb2ludCwgaW4gbG9jYWwgY29vcmRpbmF0ZXMsCisgICAgICogaXMgaW5zaWRlIHRoZSB2aWV3LCB3aGVyZSB0aGUgYXJlYSBvZiB0aGUgdmlldyBpcyBleHBhbmRlZCBieSB0aGUgc2xvcCBmYWN0b3IuCisgICAgICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIHdoaWxlIHByb2Nlc3NpbmcgdG91Y2gtbW92ZSBldmVudHMgdG8gZGV0ZXJtaW5lIGlmIHRoZSBldmVudAorICAgICAqIGlzIHN0aWxsIHdpdGhpbiB0aGUgdmlldy4KKyAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gcG9pbnRJblZpZXcoZmxvYXQgbG9jYWxYLCBmbG9hdCBsb2NhbFksIGZsb2F0IHNsb3ApIHsKKyAgICAgICAgcmV0dXJuIGxvY2FsWCA+IC1zbG9wICYmIGxvY2FsWSA+IC1zbG9wICYmIGxvY2FsWCA8ICgobVJpZ2h0IC0gbUxlZnQpICsgc2xvcCkgJiYKKyAgICAgICAgICAgICAgICBsb2NhbFkgPCAoKG1Cb3R0b20gLSBtVG9wKSArIHNsb3ApOwogICAgIH0KIAogICAgIC8qKgpAQCAtNDk1Niw4ICs1ODMyLDM4IEBACiAgICAgICogQHBhcmFtIG9mZnNldCB0aGUgbnVtYmVyIG9mIHBpeGVscyB0byBvZmZzZXQgdGhlIHZpZXcgYnkKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBvZmZzZXRUb3BBbmRCb3R0b20oaW50IG9mZnNldCkgewotICAgICAgICBtVG9wICs9IG9mZnNldDsKLSAgICAgICAgbUJvdHRvbSArPSBvZmZzZXQ7CisgICAgICAgIGlmIChvZmZzZXQgIT0gMCkgeworICAgICAgICAgICAgaWYgKGhhc0lkZW50aXR5TWF0cml4KCkpIHsKKyAgICAgICAgICAgICAgICBmaW5hbCBWaWV3UGFyZW50IHAgPSBtUGFyZW50OworICAgICAgICAgICAgICAgIGlmIChwICE9IG51bGwgJiYgbUF0dGFjaEluZm8gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBmaW5hbCBSZWN0IHIgPSBtQXR0YWNoSW5mby5tVG1wSW52YWxSZWN0OworICAgICAgICAgICAgICAgICAgICBpbnQgbWluVG9wOworICAgICAgICAgICAgICAgICAgICBpbnQgbWF4Qm90dG9tOworICAgICAgICAgICAgICAgICAgICBpbnQgeUxvYzsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG9mZnNldCA8IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1pblRvcCA9IG1Ub3AgKyBvZmZzZXQ7CisgICAgICAgICAgICAgICAgICAgICAgICBtYXhCb3R0b20gPSBtQm90dG9tOworICAgICAgICAgICAgICAgICAgICAgICAgeUxvYyA9IG9mZnNldDsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1pblRvcCA9IG1Ub3A7CisgICAgICAgICAgICAgICAgICAgICAgICBtYXhCb3R0b20gPSBtQm90dG9tICsgb2Zmc2V0OworICAgICAgICAgICAgICAgICAgICAgICAgeUxvYyA9IDA7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgci5zZXQoMCwgeUxvYywgbVJpZ2h0IC0gbUxlZnQsIG1heEJvdHRvbSAtIG1pblRvcCk7CisgICAgICAgICAgICAgICAgICAgIHAuaW52YWxpZGF0ZUNoaWxkKHRoaXMsIHIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaW52YWxpZGF0ZSgpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBtVG9wICs9IG9mZnNldDsKKyAgICAgICAgICAgIG1Cb3R0b20gKz0gb2Zmc2V0OworCisgICAgICAgICAgICBpZiAoIW1NYXRyaXhJc0lkZW50aXR5KSB7CisgICAgICAgICAgICAgICAgbVByaXZhdGVGbGFncyB8PSBEUkFXTjsgLy8gZm9yY2UgYW5vdGhlciBpbnZhbGlkYXRpb24gd2l0aCB0aGUgbmV3IG9yaWVudGF0aW9uCisgICAgICAgICAgICAgICAgaW52YWxpZGF0ZSgpOworICAgICAgICAgICAgfQorICAgICAgICB9CiAgICAgfQogCiAgICAgLyoqCkBAIC00OTY2LDggKzU4NzIsMzUgQEAKICAgICAgKiBAcGFyYW0gb2Zmc2V0IHRoZSBudW1lciBvZiBwaXhlbHMgdG8gb2Zmc2V0IHRoZSB2aWV3IGJ5CiAgICAgICovCiAgICAgcHVibGljIHZvaWQgb2Zmc2V0TGVmdEFuZFJpZ2h0KGludCBvZmZzZXQpIHsKLSAgICAgICAgbUxlZnQgKz0gb2Zmc2V0OwotICAgICAgICBtUmlnaHQgKz0gb2Zmc2V0OworICAgICAgICBpZiAob2Zmc2V0ICE9IDApIHsKKyAgICAgICAgICAgIGlmIChoYXNJZGVudGl0eU1hdHJpeCgpKSB7CisgICAgICAgICAgICAgICAgZmluYWwgVmlld1BhcmVudCBwID0gbVBhcmVudDsKKyAgICAgICAgICAgICAgICBpZiAocCAhPSBudWxsICYmIG1BdHRhY2hJbmZvICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgZmluYWwgUmVjdCByID0gbUF0dGFjaEluZm8ubVRtcEludmFsUmVjdDsKKyAgICAgICAgICAgICAgICAgICAgaW50IG1pbkxlZnQ7CisgICAgICAgICAgICAgICAgICAgIGludCBtYXhSaWdodDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG9mZnNldCA8IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1pbkxlZnQgPSBtTGVmdCArIG9mZnNldDsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1heFJpZ2h0ID0gbVJpZ2h0OworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgbWluTGVmdCA9IG1MZWZ0OworICAgICAgICAgICAgICAgICAgICAgICAgbWF4UmlnaHQgPSBtUmlnaHQgKyBvZmZzZXQ7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgci5zZXQoMCwgMCwgbWF4UmlnaHQgLSBtaW5MZWZ0LCBtQm90dG9tIC0gbVRvcCk7CisgICAgICAgICAgICAgICAgICAgIHAuaW52YWxpZGF0ZUNoaWxkKHRoaXMsIHIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaW52YWxpZGF0ZSgpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBtTGVmdCArPSBvZmZzZXQ7CisgICAgICAgICAgICBtUmlnaHQgKz0gb2Zmc2V0OworCisgICAgICAgICAgICBpZiAoIW1NYXRyaXhJc0lkZW50aXR5KSB7CisgICAgICAgICAgICAgICAgbVByaXZhdGVGbGFncyB8PSBEUkFXTjsgLy8gZm9yY2UgYW5vdGhlciBpbnZhbGlkYXRpb24gd2l0aCB0aGUgbmV3IG9yaWVudGF0aW9uCisgICAgICAgICAgICAgICAgaW52YWxpZGF0ZSgpOworICAgICAgICAgICAgfQorICAgICAgICB9CiAgICAgfQogCiAgICAgLyoqCkBAIC02MDA2LDkgKzY5MzksOCBAQAogICAgICAqIEBzZWUgYW5kcm9pZC53aWRnZXQuU2Nyb2xsQmFyRHJhd2FibGUKICAgICAgKiBAaGlkZQogICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIG9uRHJhd0hvcml6b250YWxTY3JvbGxCYXIoQ2FudmFzIGNhbnZhcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERyYXdhYmxlIHNjcm9sbEJhciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsLCBpbnQgdCwgaW50IHIsIGludCBiKSB7CisgICAgcHJvdGVjdGVkIHZvaWQgb25EcmF3SG9yaXpvbnRhbFNjcm9sbEJhcihDYW52YXMgY2FudmFzLCBEcmF3YWJsZSBzY3JvbGxCYXIsCisgICAgICAgICAgICBpbnQgbCwgaW50IHQsIGludCByLCBpbnQgYikgewogICAgICAgICBzY3JvbGxCYXIuc2V0Qm91bmRzKGwsIHQsIHIsIGIpOwogICAgICAgICBzY3JvbGxCYXIuZHJhdyhjYW52YXMpOwogICAgIH0KQEAgLTYwMjcsOSArNjk1OSw4IEBACiAgICAgICogQHNlZSBhbmRyb2lkLndpZGdldC5TY3JvbGxCYXJEcmF3YWJsZQogICAgICAqIEBoaWRlCiAgICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgb25EcmF3VmVydGljYWxTY3JvbGxCYXIoQ2FudmFzIGNhbnZhcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEcmF3YWJsZSBzY3JvbGxCYXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGwsIGludCB0LCBpbnQgciwgaW50IGIpIHsKKyAgICBwcm90ZWN0ZWQgdm9pZCBvbkRyYXdWZXJ0aWNhbFNjcm9sbEJhcihDYW52YXMgY2FudmFzLCBEcmF3YWJsZSBzY3JvbGxCYXIsCisgICAgICAgICAgICBpbnQgbCwgaW50IHQsIGludCByLCBpbnQgYikgewogICAgICAgICBzY3JvbGxCYXIuc2V0Qm91bmRzKGwsIHQsIHIsIGIpOwogICAgICAgICBzY3JvbGxCYXIuZHJhdyhjYW52YXMpOwogICAgIH0KQEAgLTY0MjcsOCArNzM1OCw3IEBACiAgICAgICAgIGlmICgobVZpZXdGbGFncyAmIERSQVdJTkdfQ0FDSEVfRU5BQkxFRCkgPT0gRFJBV0lOR19DQUNIRV9FTkFCTEVEKSB7CiAgICAgICAgICAgICBidWlsZERyYXdpbmdDYWNoZShhdXRvU2NhbGUpOwogICAgICAgICB9Ci0gICAgICAgIHJldHVybiBhdXRvU2NhbGUgPyAobURyYXdpbmdDYWNoZSA9PSBudWxsID8gbnVsbCA6IG1EcmF3aW5nQ2FjaGUuZ2V0KCkpIDoKLSAgICAgICAgICAgICAgICAobVVuc2NhbGVkRHJhd2luZ0NhY2hlID09IG51bGwgPyBudWxsIDogbVVuc2NhbGVkRHJhd2luZ0NhY2hlLmdldCgpKTsKKyAgICAgICAgcmV0dXJuIGF1dG9TY2FsZSA/IG1EcmF3aW5nQ2FjaGUgOiBtVW5zY2FsZWREcmF3aW5nQ2FjaGU7CiAgICAgfQogCiAgICAgLyoqCkBAIC02NDQzLDEzICs3MzczLDExIEBACiAgICAgICovCiAgICAgcHVibGljIHZvaWQgZGVzdHJveURyYXdpbmdDYWNoZSgpIHsKICAgICAgICAgaWYgKG1EcmF3aW5nQ2FjaGUgIT0gbnVsbCkgewotICAgICAgICAgICAgZmluYWwgQml0bWFwIGJpdG1hcCA9IG1EcmF3aW5nQ2FjaGUuZ2V0KCk7Ci0gICAgICAgICAgICBpZiAoYml0bWFwICE9IG51bGwpIGJpdG1hcC5yZWN5Y2xlKCk7CisgICAgICAgICAgICBtRHJhd2luZ0NhY2hlLnJlY3ljbGUoKTsKICAgICAgICAgICAgIG1EcmF3aW5nQ2FjaGUgPSBudWxsOwogICAgICAgICB9CiAgICAgICAgIGlmIChtVW5zY2FsZWREcmF3aW5nQ2FjaGUgIT0gbnVsbCkgewotICAgICAgICAgICAgZmluYWwgQml0bWFwIGJpdG1hcCA9IG1VbnNjYWxlZERyYXdpbmdDYWNoZS5nZXQoKTsKLSAgICAgICAgICAgIGlmIChiaXRtYXAgIT0gbnVsbCkgYml0bWFwLnJlY3ljbGUoKTsKKyAgICAgICAgICAgIG1VbnNjYWxlZERyYXdpbmdDYWNoZS5yZWN5Y2xlKCk7CiAgICAgICAgICAgICBtVW5zY2FsZWREcmF3aW5nQ2FjaGUgPSBudWxsOwogICAgICAgICB9CiAgICAgfQpAQCAtNjUxMCwxNSArNzQzOCwxMSBAQAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIGJ1aWxkRHJhd2luZ0NhY2hlKGJvb2xlYW4gYXV0b1NjYWxlKSB7CiAgICAgICAgIGlmICgobVByaXZhdGVGbGFncyAmIERSQVdJTkdfQ0FDSEVfVkFMSUQpID09IDAgfHwgKGF1dG9TY2FsZSA/Ci0gICAgICAgICAgICAgICAgKG1EcmF3aW5nQ2FjaGUgPT0gbnVsbCB8fCBtRHJhd2luZ0NhY2hlLmdldCgpID09IG51bGwpIDoKLSAgICAgICAgICAgICAgICAobVVuc2NhbGVkRHJhd2luZ0NhY2hlID09IG51bGwgfHwgbVVuc2NhbGVkRHJhd2luZ0NhY2hlLmdldCgpID09IG51bGwpKSkgeworICAgICAgICAgICAgICAgIG1EcmF3aW5nQ2FjaGUgPT0gbnVsbCA6IG1VbnNjYWxlZERyYXdpbmdDYWNoZSA9PSBudWxsKSkgewogCiAgICAgICAgICAgICBpZiAoVmlld0RlYnVnLlRSQUNFX0hJRVJBUkNIWSkgewogICAgICAgICAgICAgICAgIFZpZXdEZWJ1Zy50cmFjZSh0aGlzLCBWaWV3RGVidWcuSGllcmFyY2h5VHJhY2VUeXBlLkJVSUxEX0NBQ0hFKTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChDb25maWcuREVCVUcgJiYgVmlld0RlYnVnLnByb2ZpbGVEcmF3aW5nKSB7Ci0gICAgICAgICAgICAgICAgRXZlbnRMb2cud3JpdGVFdmVudCg2MDAwMiwgaGFzaENvZGUoKSk7Ci0gICAgICAgICAgICB9CiAKICAgICAgICAgICAgIGludCB3aWR0aCA9IG1SaWdodCAtIG1MZWZ0OwogICAgICAgICAgICAgaW50IGhlaWdodCA9IG1Cb3R0b20gLSBtVG9wOwpAQCAtNjU0NCw4ICs3NDY4LDcgQEAKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgYm9vbGVhbiBjbGVhciA9IHRydWU7Ci0gICAgICAgICAgICBCaXRtYXAgYml0bWFwID0gYXV0b1NjYWxlID8gKG1EcmF3aW5nQ2FjaGUgPT0gbnVsbCA/IG51bGwgOiBtRHJhd2luZ0NhY2hlLmdldCgpKSA6Ci0gICAgICAgICAgICAgICAgICAgIChtVW5zY2FsZWREcmF3aW5nQ2FjaGUgPT0gbnVsbCA/IG51bGwgOiBtVW5zY2FsZWREcmF3aW5nQ2FjaGUuZ2V0KCkpOworICAgICAgICAgICAgQml0bWFwIGJpdG1hcCA9IGF1dG9TY2FsZSA/IG1EcmF3aW5nQ2FjaGUgOiBtVW5zY2FsZWREcmF3aW5nQ2FjaGU7CiAKICAgICAgICAgICAgIGlmIChiaXRtYXAgPT0gbnVsbCB8fCBiaXRtYXAuZ2V0V2lkdGgoKSAhPSB3aWR0aCB8fCBiaXRtYXAuZ2V0SGVpZ2h0KCkgIT0gaGVpZ2h0KSB7CiAgICAgICAgICAgICAgICAgQml0bWFwLkNvbmZpZyBxdWFsaXR5OwpAQCAtNjU3Nyw5ICs3NTAwLDkgQEAKICAgICAgICAgICAgICAgICAgICAgYml0bWFwID0gQml0bWFwLmNyZWF0ZUJpdG1hcCh3aWR0aCwgaGVpZ2h0LCBxdWFsaXR5KTsKICAgICAgICAgICAgICAgICAgICAgYml0bWFwLnNldERlbnNpdHkoZ2V0UmVzb3VyY2VzKCkuZ2V0RGlzcGxheU1ldHJpY3MoKS5kZW5zaXR5RHBpKTsKICAgICAgICAgICAgICAgICAgICAgaWYgKGF1dG9TY2FsZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgbURyYXdpbmdDYWNoZSA9IG5ldyBTb2Z0UmVmZXJlbmNlPEJpdG1hcD4oYml0bWFwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1EcmF3aW5nQ2FjaGUgPSBiaXRtYXA7CiAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtVW5zY2FsZWREcmF3aW5nQ2FjaGUgPSBuZXcgU29mdFJlZmVyZW5jZTxCaXRtYXA+KGJpdG1hcCk7CisgICAgICAgICAgICAgICAgICAgICAgICBtVW5zY2FsZWREcmF3aW5nQ2FjaGUgPSBiaXRtYXA7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgaWYgKG9wYXF1ZSAmJiB0cmFuc2x1Y2VudFdpbmRvdykgYml0bWFwLnNldEhhc0FscGhhKGZhbHNlKTsKICAgICAgICAgICAgICAgICB9IGNhdGNoIChPdXRPZk1lbW9yeUVycm9yIGUpIHsKQEAgLTY4MTgsNiArNzc0MSwyNSBAQAogICAgIH0KIAogICAgIC8qKgorICAgICAqIDxwPkluZGljYXRlcyB3aGV0aGVyIHRoaXMgdmlldyBpcyBhdHRhY2hlZCB0byBhbiBoYXJkd2FyZSBhY2NlbGVyYXRlZAorICAgICAqIHdpbmRvdyBvciBub3QuPC9wPgorICAgICAqIAorICAgICAqIDxwPkV2ZW4gaWYgdGhpcyBtZXRob2QgcmV0dXJucyB0cnVlLCBpdCBkb2VzIG5vdCBtZWFuIHRoYXQgZXZlcnkgY2FsbAorICAgICAqIHRvIHtAbGluayAjZHJhdyhhbmRyb2lkLmdyYXBoaWNzLkNhbnZhcyl9IHdpbGwgYmUgbWFkZSB3aXRoIGFuIGhhcmR3YXJlCisgICAgICogYWNjZWxlcmF0ZWQge0BsaW5rIGFuZHJvaWQuZ3JhcGhpY3MuQ2FudmFzfS4gRm9yIGluc3RhbmNlLCBpZiB0aGlzIHZpZXcKKyAgICAgKiBpcyBkcmF3biBvbnRvIGFuIG9mZnNjcmVuIHtAbGluayBhbmRyb2lkLmdyYXBoaWNzLkJpdG1hcH0gYW5kIGl0cworICAgICAqIHdpbmRvdyBpcyBoYXJkd2FyZSBhY2NlbGVyYXRlZCwKKyAgICAgKiB7QGxpbmsgYW5kcm9pZC5ncmFwaGljcy5DYW52YXMjaXNIYXJkd2FyZUFjY2VsZXJhdGVkKCl9IHdpbGwgbGlrZWx5CisgICAgICogcmV0dXJuIGZhbHNlLCBhbmQgdGhpcyBtZXRob2Qgd2lsbCByZXR1cm4gdHJ1ZS48L3A+CisgICAgICogCisgICAgICogQHJldHVybiBUcnVlIGlmIHRoZSB2aWV3IGlzIGF0dGFjaGVkIHRvIGEgd2luZG93IGFuZCB0aGUgd2luZG93IGlzCisgICAgICogICAgICAgICBoYXJkd2FyZSBhY2NlbGVyYXRlZDsgZmFsc2UgaW4gYW55IG90aGVyIGNhc2UuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNIYXJkd2FyZUFjY2VsZXJhdGVkKCkgeworICAgICAgICByZXR1cm4gbUF0dGFjaEluZm8gIT0gbnVsbCAmJiBtQXR0YWNoSW5mby5tSGFyZHdhcmVBY2NlbGVyYXRlZDsKKyAgICB9CisgICAgCisgICAgLyoqCiAgICAgICogTWFudWFsbHkgcmVuZGVyIHRoaXMgdmlldyAoYW5kIGFsbCBvZiBpdHMgY2hpbGRyZW4pIHRvIHRoZSBnaXZlbiBDYW52YXMuCiAgICAgICogVGhlIHZpZXcgbXVzdCBoYXZlIGFscmVhZHkgZG9uZSBhIGZ1bGwgbGF5b3V0IGJlZm9yZSB0aGlzIGZ1bmN0aW9uIGlzCiAgICAgICogY2FsbGVkLiAgV2hlbiBpbXBsZW1lbnRpbmcgYSB2aWV3LCBkbyBub3Qgb3ZlcnJpZGUgdGhpcyBtZXRob2Q7IGluc3RlYWQsCkBAIC02OTQyLDE2ICs3ODg0LDE2IEBACiAKICAgICAgICAgaWYgKHZlcnRpY2FsRWRnZXMpIHsKICAgICAgICAgICAgIHRvcEZhZGVTdHJlbmd0aCA9IE1hdGgubWF4KDAuMGYsIE1hdGgubWluKDEuMGYsIGdldFRvcEZhZGluZ0VkZ2VTdHJlbmd0aCgpKSk7Ci0gICAgICAgICAgICBkcmF3VG9wID0gdG9wRmFkZVN0cmVuZ3RoID49IDAuMGY7CisgICAgICAgICAgICBkcmF3VG9wID0gdG9wRmFkZVN0cmVuZ3RoID4gMC4wZjsKICAgICAgICAgICAgIGJvdHRvbUZhZGVTdHJlbmd0aCA9IE1hdGgubWF4KDAuMGYsIE1hdGgubWluKDEuMGYsIGdldEJvdHRvbUZhZGluZ0VkZ2VTdHJlbmd0aCgpKSk7Ci0gICAgICAgICAgICBkcmF3Qm90dG9tID0gYm90dG9tRmFkZVN0cmVuZ3RoID49IDAuMGY7CisgICAgICAgICAgICBkcmF3Qm90dG9tID0gYm90dG9tRmFkZVN0cmVuZ3RoID4gMC4wZjsKICAgICAgICAgfQogCiAgICAgICAgIGlmIChob3Jpem9udGFsRWRnZXMpIHsKICAgICAgICAgICAgIGxlZnRGYWRlU3RyZW5ndGggPSBNYXRoLm1heCgwLjBmLCBNYXRoLm1pbigxLjBmLCBnZXRMZWZ0RmFkaW5nRWRnZVN0cmVuZ3RoKCkpKTsKLSAgICAgICAgICAgIGRyYXdMZWZ0ID0gbGVmdEZhZGVTdHJlbmd0aCA+PSAwLjBmOworICAgICAgICAgICAgZHJhd0xlZnQgPSBsZWZ0RmFkZVN0cmVuZ3RoID4gMC4wZjsKICAgICAgICAgICAgIHJpZ2h0RmFkZVN0cmVuZ3RoID0gTWF0aC5tYXgoMC4wZiwgTWF0aC5taW4oMS4wZiwgZ2V0UmlnaHRGYWRpbmdFZGdlU3RyZW5ndGgoKSkpOwotICAgICAgICAgICAgZHJhd1JpZ2h0ID0gcmlnaHRGYWRlU3RyZW5ndGggPj0gMC4wZjsKKyAgICAgICAgICAgIGRyYXdSaWdodCA9IHJpZ2h0RmFkZVN0cmVuZ3RoID4gMC4wZjsKICAgICAgICAgfQogCiAgICAgICAgIHNhdmVDb3VudCA9IGNhbnZhcy5nZXRTYXZlQ291bnQoKTsKQEAgLTcxNTgsMTQgKzgxMDAsMTkgQEAKICAgICAgKgogICAgICAqIERlcml2ZWQgY2xhc3NlcyB3aXRoIGNoaWxkcmVuIHNob3VsZCBvdmVycmlkZQogICAgICAqIG9uTGF5b3V0LiBJbiB0aGF0IG1ldGhvZCwgdGhleSBzaG91bGQKLSAgICAgKiBjYWxsIGxheW91dCBvbiBlYWNoIG9mIHRoZWlyIHRoZWlyIGNoaWxkcmVuLgorICAgICAqIGNhbGwgbGF5b3V0IG9uIGVhY2ggb2YgdGhlaXIgY2hpbGRyZW4uCiAgICAgICoKICAgICAgKiBAcGFyYW0gbCBMZWZ0IHBvc2l0aW9uLCByZWxhdGl2ZSB0byBwYXJlbnQKICAgICAgKiBAcGFyYW0gdCBUb3AgcG9zaXRpb24sIHJlbGF0aXZlIHRvIHBhcmVudAogICAgICAqIEBwYXJhbSByIFJpZ2h0IHBvc2l0aW9uLCByZWxhdGl2ZSB0byBwYXJlbnQKICAgICAgKiBAcGFyYW0gYiBCb3R0b20gcG9zaXRpb24sIHJlbGF0aXZlIHRvIHBhcmVudAogICAgICAqLworICAgIEBTdXBwcmVzc1dhcm5pbmdzKHsidW5jaGVja2VkIn0pCiAgICAgcHVibGljIGZpbmFsIHZvaWQgbGF5b3V0KGludCBsLCBpbnQgdCwgaW50IHIsIGludCBiKSB7CisgICAgICAgIGludCBvbGRMID0gbUxlZnQ7CisgICAgICAgIGludCBvbGRUID0gbVRvcDsKKyAgICAgICAgaW50IG9sZEIgPSBtQm90dG9tOworICAgICAgICBpbnQgb2xkUiA9IG1SaWdodDsKICAgICAgICAgYm9vbGVhbiBjaGFuZ2VkID0gc2V0RnJhbWUobCwgdCwgciwgYik7CiAgICAgICAgIGlmIChjaGFuZ2VkIHx8IChtUHJpdmF0ZUZsYWdzICYgTEFZT1VUX1JFUVVJUkVEKSA9PSBMQVlPVVRfUkVRVUlSRUQpIHsKICAgICAgICAgICAgIGlmIChWaWV3RGVidWcuVFJBQ0VfSElFUkFSQ0hZKSB7CkBAIC03MTc0LDYgKzgxMjEsMTUgQEAKIAogICAgICAgICAgICAgb25MYXlvdXQoY2hhbmdlZCwgbCwgdCwgciwgYik7CiAgICAgICAgICAgICBtUHJpdmF0ZUZsYWdzICY9IH5MQVlPVVRfUkVRVUlSRUQ7CisKKyAgICAgICAgICAgIGlmIChtT25MYXlvdXRDaGFuZ2VMaXN0ZW5lcnMgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIEFycmF5TGlzdDxPbkxheW91dENoYW5nZUxpc3RlbmVyPiBsaXN0ZW5lcnNDb3B5ID0KKyAgICAgICAgICAgICAgICAgICAgICAgIChBcnJheUxpc3Q8T25MYXlvdXRDaGFuZ2VMaXN0ZW5lcj4pIG1PbkxheW91dENoYW5nZUxpc3RlbmVycy5jbG9uZSgpOworICAgICAgICAgICAgICAgIGludCBudW1MaXN0ZW5lcnMgPSBsaXN0ZW5lcnNDb3B5LnNpemUoKTsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bUxpc3RlbmVyczsgKytpKSB7CisgICAgICAgICAgICAgICAgICAgIGxpc3RlbmVyc0NvcHkuZ2V0KGkpLm9uTGF5b3V0Q2hhbmdlKHRoaXMsIGwsIHIsIHQsIGIsIG9sZEwsIG9sZFQsIG9sZFIsIG9sZEIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICBtUHJpdmF0ZUZsYWdzICY9IH5GT1JDRV9MQVlPVVQ7CiAgICAgfQpAQCAtNzE4NCw3ICs4MTQwLDcgQEAKICAgICAgKgogICAgICAqIERlcml2ZWQgY2xhc3NlcyB3aXRoIGNoaWxkcmVuIHNob3VsZCBvdmVycmlkZQogICAgICAqIHRoaXMgbWV0aG9kIGFuZCBjYWxsIGxheW91dCBvbiBlYWNoIG9mCi0gICAgICogdGhlaXIgdGhlaXIgY2hpbGRyZW4uCisgICAgICogdGhlaXIgY2hpbGRyZW4uCiAgICAgICogQHBhcmFtIGNoYW5nZWQgVGhpcyBpcyBhIG5ldyBzaXplIG9yIHBvc2l0aW9uIGZvciB0aGlzIHZpZXcKICAgICAgKiBAcGFyYW0gbGVmdCBMZWZ0IHBvc2l0aW9uLCByZWxhdGl2ZSB0byBwYXJlbnQKICAgICAgKiBAcGFyYW0gdG9wIFRvcCBwb3NpdGlvbiwgcmVsYXRpdmUgdG8gcGFyZW50CkBAIC03NDM4LDE4ICs4Mzk0LDEzIEBACiAKICAgICAgICAgaW50IHByaXZhdGVGbGFncyA9IG1Qcml2YXRlRmxhZ3M7CiAKLSAgICAgICAgaW50IHZpZXdTdGF0ZUluZGV4ID0gKCgocHJpdmF0ZUZsYWdzICYgUFJFU1NFRCkgIT0gMCkgPyAxIDogMCk7Ci0KLSAgICAgICAgdmlld1N0YXRlSW5kZXggPSAodmlld1N0YXRlSW5kZXggPDwgMSkKLSAgICAgICAgICAgICAgICArICgoKG1WaWV3RmxhZ3MgJiBFTkFCTEVEX01BU0spID09IEVOQUJMRUQpID8gMSA6IDApOwotCi0gICAgICAgIHZpZXdTdGF0ZUluZGV4ID0gKHZpZXdTdGF0ZUluZGV4IDw8IDEpICsgKGlzRm9jdXNlZCgpID8gMSA6IDApOwotCi0gICAgICAgIHZpZXdTdGF0ZUluZGV4ID0gKHZpZXdTdGF0ZUluZGV4IDw8IDEpCi0gICAgICAgICAgICAgICAgKyAoKChwcml2YXRlRmxhZ3MgJiBTRUxFQ1RFRCkgIT0gMCkgPyAxIDogMCk7Ci0KLSAgICAgICAgZmluYWwgYm9vbGVhbiBoYXNXaW5kb3dGb2N1cyA9IGhhc1dpbmRvd0ZvY3VzKCk7Ci0gICAgICAgIHZpZXdTdGF0ZUluZGV4ID0gKHZpZXdTdGF0ZUluZGV4IDw8IDEpICsgKGhhc1dpbmRvd0ZvY3VzID8gMSA6IDApOworICAgICAgICBpbnQgdmlld1N0YXRlSW5kZXggPSAwOworICAgICAgICBpZiAoKHByaXZhdGVGbGFncyAmIFBSRVNTRUQpICE9IDApIHZpZXdTdGF0ZUluZGV4IHw9IFZJRVdfU1RBVEVfUFJFU1NFRDsKKyAgICAgICAgaWYgKChtVmlld0ZsYWdzICYgRU5BQkxFRF9NQVNLKSA9PSBFTkFCTEVEKSB2aWV3U3RhdGVJbmRleCB8PSBWSUVXX1NUQVRFX0VOQUJMRUQ7CisgICAgICAgIGlmIChpc0ZvY3VzZWQoKSkgdmlld1N0YXRlSW5kZXggfD0gVklFV19TVEFURV9GT0NVU0VEOworICAgICAgICBpZiAoKHByaXZhdGVGbGFncyAmIFNFTEVDVEVEKSAhPSAwKSB2aWV3U3RhdGVJbmRleCB8PSBWSUVXX1NUQVRFX1BSRVNTRUQ7CisgICAgICAgIGlmIChoYXNXaW5kb3dGb2N1cygpKSB2aWV3U3RhdGVJbmRleCB8PSBWSUVXX1NUQVRFX1dJTkRPV19GT0NVU0VEOworICAgICAgICBpZiAoKHByaXZhdGVGbGFncyAmIEFDVElWQVRFRCkgIT0gMCkgdmlld1N0YXRlSW5kZXggfD0gVklFV19TVEFURV9BQ1RJVkFURUQ7CiAKICAgICAgICAgZHJhd2FibGVTdGF0ZSA9IFZJRVdfU1RBVEVfU0VUU1t2aWV3U3RhdGVJbmRleF07CiAKQEAgLTc0NjEsNyArODQxMiw3IEBACiAgICAgICAgICAgICAgICAgICAgICsgIiBlbj0iICsgKChtVmlld0ZsYWdzICYgRU5BQkxFRF9NQVNLKSA9PSBFTkFCTEVEKQogICAgICAgICAgICAgICAgICAgICArICIgZm89IiArIGhhc0ZvY3VzKCkKICAgICAgICAgICAgICAgICAgICAgKyAiIHNsPSIgKyAoKHByaXZhdGVGbGFncyAmIFNFTEVDVEVEKSAhPSAwKQotICAgICAgICAgICAgICAgICAgICArICIgd2Y9IiArIGhhc1dpbmRvd0ZvY3VzCisgICAgICAgICAgICAgICAgICAgICsgIiB3Zj0iICsgaGFzV2luZG93Rm9jdXMoKQogICAgICAgICAgICAgICAgICAgICArICI6ICIgKyBBcnJheXMudG9TdHJpbmcoZHJhd2FibGVTdGF0ZSkpOwogICAgICAgICB9CiAKQEAgLTc3NzUsNiArODcyNiw0OCBAQAogICAgIH0KIAogICAgIC8qKgorICAgICAqIENoYW5nZXMgdGhlIGFjdGl2YXRlZCBzdGF0ZSBvZiB0aGlzIHZpZXcuIEEgdmlldyBjYW4gYmUgYWN0aXZhdGVkIG9yIG5vdC4KKyAgICAgKiBOb3RlIHRoYXQgYWN0aXZhdGlvbiBpcyBub3QgdGhlIHNhbWUgYXMgc2VsZWN0aW9uLiAgU2VsZWN0aW9uIGlzCisgICAgICogYSB0cmFuc2llbnQgcHJvcGVydHksIHJlcHJlc2VudGluZyB0aGUgdmlldyAoaGllcmFyY2h5KSB0aGUgdXNlciBpcworICAgICAqIGN1cnJlbnRseSBpbnRlcmFjdGluZyB3aXRoLiAgQWN0aXZhdGlvbiBpcyBhIGxvbmdlci10ZXJtIHN0YXRlIHRoYXQgdGhlCisgICAgICogdXNlciBjYW4gbW92ZSB2aWV3cyBpbiBhbmQgb3V0IG9mLiAgRm9yIGV4YW1wbGUsIGluIGEgbGlzdCB2aWV3IHdpdGgKKyAgICAgKiBzaW5nbGUgb3IgbXVsdGlwbGUgc2VsZWN0aW9uIGVuYWJsZWQsIHRoZSB2aWV3cyBpbiB0aGUgY3VycmVudCBzZWxlY3Rpb24KKyAgICAgKiBzZXQgYXJlIGFjdGl2YXRlZC4gIChVbSwgeWVhaCwgd2UgYXJlIGRlZXBseSBzb3JyeSBhYm91dCB0aGUgdGVybWlub2xvZ3kKKyAgICAgKiBoZXJlLikgIFRoZSBhY3RpdmF0ZWQgc3RhdGUgaXMgcHJvcGFnYXRlZCBkb3duIHRvIGNoaWxkcmVuIG9mIHRoZSB2aWV3IGl0CisgICAgICogaXMgc2V0IG9uLgorICAgICAqCisgICAgICogQHBhcmFtIGFjdGl2YXRlZCB0cnVlIGlmIHRoZSB2aWV3IG11c3QgYmUgYWN0aXZhdGVkLCBmYWxzZSBvdGhlcndpc2UKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRBY3RpdmF0ZWQoYm9vbGVhbiBhY3RpdmF0ZWQpIHsKKyAgICAgICAgaWYgKCgobVByaXZhdGVGbGFncyAmIEFDVElWQVRFRCkgIT0gMCkgIT0gYWN0aXZhdGVkKSB7CisgICAgICAgICAgICBtUHJpdmF0ZUZsYWdzID0gKG1Qcml2YXRlRmxhZ3MgJiB+QUNUSVZBVEVEKSB8IChhY3RpdmF0ZWQgPyBBQ1RJVkFURUQgOiAwKTsKKyAgICAgICAgICAgIGludmFsaWRhdGUoKTsKKyAgICAgICAgICAgIHJlZnJlc2hEcmF3YWJsZVN0YXRlKCk7CisgICAgICAgICAgICBkaXNwYXRjaFNldFNlbGVjdGVkKGFjdGl2YXRlZCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBEaXNwYXRjaCBzZXRBY3RpdmF0ZWQgdG8gYWxsIG9mIHRoaXMgVmlldydzIGNoaWxkcmVuLgorICAgICAqCisgICAgICogQHNlZSAjc2V0QWN0aXZhdGVkKGJvb2xlYW4pCisgICAgICoKKyAgICAgKiBAcGFyYW0gYWN0aXZhdGVkIFRoZSBuZXcgYWN0aXZhdGVkIHN0YXRlCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgZGlzcGF0Y2hTZXRBY3RpdmF0ZWQoYm9vbGVhbiBhY3RpdmF0ZWQpIHsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJbmRpY2F0ZXMgdGhlIGFjdGl2YXRpb24gc3RhdGUgb2YgdGhpcyB2aWV3LgorICAgICAqCisgICAgICogQHJldHVybiB0cnVlIGlmIHRoZSB2aWV3IGlzIGFjdGl2YXRlZCwgZmFsc2Ugb3RoZXJ3aXNlCisgICAgICovCisgICAgQFZpZXdEZWJ1Zy5FeHBvcnRlZFByb3BlcnR5CisgICAgcHVibGljIGJvb2xlYW4gaXNBY3RpdmF0ZWQoKSB7CisgICAgICAgIHJldHVybiAobVByaXZhdGVGbGFncyAmIEFDVElWQVRFRCkgIT0gMDsKKyAgICB9CisKKyAgICAvKioKICAgICAgKiBSZXR1cm5zIHRoZSBWaWV3VHJlZU9ic2VydmVyIGZvciB0aGlzIHZpZXcncyBoaWVyYXJjaHkuIFRoZSB2aWV3IHRyZWUKICAgICAgKiBvYnNlcnZlciBjYW4gYmUgdXNlZCB0byBnZXQgbm90aWZpY2F0aW9ucyB3aGVuIGdsb2JhbCBldmVudHMsIGxpa2UKICAgICAgKiBsYXlvdXQsIGhhcHBlbi4KQEAgLTg2OTAsMTMgKzk2ODMsMTMgQEAKICAgICAgICAgaWYgKG1BdHRhY2hJbmZvID09IG51bGwpIHsKICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfQotICAgICAgICBpZiAoKGZsYWdzJkhhcHRpY0ZlZWRiYWNrQ29uc3RhbnRzLkZMQUdfSUdOT1JFX1ZJRVdfU0VUVElORykgPT0gMAorICAgICAgICAvL25vaW5zcGVjdGlvbiBTaW1wbGlmaWFibGVJZlN0YXRlbWVudAorICAgICAgICBpZiAoKGZsYWdzICYgSGFwdGljRmVlZGJhY2tDb25zdGFudHMuRkxBR19JR05PUkVfVklFV19TRVRUSU5HKSA9PSAwCiAgICAgICAgICAgICAgICAgJiYgIWlzSGFwdGljRmVlZGJhY2tFbmFibGVkKCkpIHsKICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfQotICAgICAgICByZXR1cm4gbUF0dGFjaEluZm8ubVJvb3RDYWxsYmFja3MucGVyZm9ybUhhcHRpY0ZlZWRiYWNrKAotICAgICAgICAgICAgICAgIGZlZWRiYWNrQ29uc3RhbnQsCi0gICAgICAgICAgICAgICAgKGZsYWdzJkhhcHRpY0ZlZWRiYWNrQ29uc3RhbnRzLkZMQUdfSUdOT1JFX0dMT0JBTF9TRVRUSU5HKSAhPSAwKTsKKyAgICAgICAgcmV0dXJuIG1BdHRhY2hJbmZvLm1Sb290Q2FsbGJhY2tzLnBlcmZvcm1IYXB0aWNGZWVkYmFjayhmZWVkYmFja0NvbnN0YW50LAorICAgICAgICAgICAgICAgIChmbGFncyAmIEhhcHRpY0ZlZWRiYWNrQ29uc3RhbnRzLkZMQUdfSUdOT1JFX0dMT0JBTF9TRVRUSU5HKSAhPSAwKTsKICAgICB9CiAKICAgICAvKioKQEAgLTg3NjcsOCArOTc2MCw3IEBACiAgICAgICAgICAgICAgICAgVmlld0NvbmZpZ3VyYXRpb24uZ2V0TG9uZ1ByZXNzVGltZW91dCgpIC0gZGVsYXlPZmZzZXQpOwogICAgIH0KIAotICAgIHByaXZhdGUgc3RhdGljIGludFtdIHN0YXRlU2V0VW5pb24oZmluYWwgaW50W10gc3RhdGVTZXQxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50W10gc3RhdGVTZXQyKSB7CisgICAgcHJpdmF0ZSBzdGF0aWMgaW50W10gc3RhdGVTZXRVbmlvbihmaW5hbCBpbnRbXSBzdGF0ZVNldDEsIGZpbmFsIGludFtdIHN0YXRlU2V0MikgewogICAgICAgICBmaW5hbCBpbnQgc3RhdGVTZXQxTGVuZ3RoID0gc3RhdGVTZXQxLmxlbmd0aDsKICAgICAgICAgZmluYWwgaW50IHN0YXRlU2V0Mkxlbmd0aCA9IHN0YXRlU2V0Mi5sZW5ndGg7CiAgICAgICAgIGZpbmFsIGludFtdIG5ld1NldCA9IG5ldyBpbnRbc3RhdGVTZXQxTGVuZ3RoICsgc3RhdGVTZXQyTGVuZ3RoXTsKQEAgLTg4MDgsMTI4ICs5ODAwLDYgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBTY3JvbGwgdGhlIHZpZXcgd2l0aCBzdGFuZGFyZCBiZWhhdmlvciBmb3Igc2Nyb2xsaW5nIGJleW9uZCB0aGUgbm9ybWFsCi0gICAgICogY29udGVudCBib3VuZGFyaWVzLiBWaWV3cyB0aGF0IGNhbGwgdGhpcyBtZXRob2Qgc2hvdWxkIG92ZXJyaWRlCi0gICAgICoge0BsaW5rICNvbk92ZXJzY3JvbGxlZChpbnQsIGludCwgYm9vbGVhbiwgYm9vbGVhbil9IHRvIHJlc3BvbmQgdG8gdGhlCi0gICAgICogcmVzdWx0cyBvZiBhbiBvdmVyc2Nyb2xsIG9wZXJhdGlvbi4KLSAgICAgKgotICAgICAqIFZpZXdzIGNhbiB1c2UgdGhpcyBtZXRob2QgdG8gaGFuZGxlIGFueSB0b3VjaCBvciBmbGluZy1iYXNlZCBzY3JvbGxpbmcuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZGVsdGFYIENoYW5nZSBpbiBYIGluIHBpeGVscwotICAgICAqIEBwYXJhbSBkZWx0YVkgQ2hhbmdlIGluIFkgaW4gcGl4ZWxzCi0gICAgICogQHBhcmFtIHNjcm9sbFggQ3VycmVudCBYIHNjcm9sbCB2YWx1ZSBpbiBwaXhlbHMgYmVmb3JlIGFwcGx5aW5nIGRlbHRhWAotICAgICAqIEBwYXJhbSBzY3JvbGxZIEN1cnJlbnQgWSBzY3JvbGwgdmFsdWUgaW4gcGl4ZWxzIGJlZm9yZSBhcHBseWluZyBkZWx0YVkKLSAgICAgKiBAcGFyYW0gc2Nyb2xsUmFuZ2VYIE1heGltdW0gY29udGVudCBzY3JvbGwgcmFuZ2UgYWxvbmcgdGhlIFggYXhpcwotICAgICAqIEBwYXJhbSBzY3JvbGxSYW5nZVkgTWF4aW11bSBjb250ZW50IHNjcm9sbCByYW5nZSBhbG9uZyB0aGUgWSBheGlzCi0gICAgICogQHBhcmFtIG1heE92ZXJzY3JvbGxYIE51bWJlciBvZiBwaXhlbHMgdG8gb3ZlcnNjcm9sbCBieSBpbiBlaXRoZXIgZGlyZWN0aW9uCi0gICAgICogICAgICAgICAgYWxvbmcgdGhlIFggYXhpcy4KLSAgICAgKiBAcGFyYW0gbWF4T3ZlcnNjcm9sbFkgTnVtYmVyIG9mIHBpeGVscyB0byBvdmVyc2Nyb2xsIGJ5IGluIGVpdGhlciBkaXJlY3Rpb24KLSAgICAgKiAgICAgICAgICBhbG9uZyB0aGUgWSBheGlzLgotICAgICAqIEBwYXJhbSBpc1RvdWNoRXZlbnQgdHJ1ZSBpZiB0aGlzIHNjcm9sbCBvcGVyYXRpb24gaXMgdGhlIHJlc3VsdCBvZiBhIHRvdWNoIGV2ZW50LgotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiBzY3JvbGxpbmcgd2FzIGNsYW1wZWQgdG8gYW4gb3ZlcnNjcm9sbCBib3VuZGFyeSBhbG9uZyBlaXRoZXIKLSAgICAgKiAgICAgICAgICBheGlzLCBmYWxzZSBvdGhlcndpc2UuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gb3ZlcnNjcm9sbEJ5KGludCBkZWx0YVgsIGludCBkZWx0YVksCi0gICAgICAgICAgICBpbnQgc2Nyb2xsWCwgaW50IHNjcm9sbFksCi0gICAgICAgICAgICBpbnQgc2Nyb2xsUmFuZ2VYLCBpbnQgc2Nyb2xsUmFuZ2VZLAotICAgICAgICAgICAgaW50IG1heE92ZXJzY3JvbGxYLCBpbnQgbWF4T3ZlcnNjcm9sbFksCi0gICAgICAgICAgICBib29sZWFuIGlzVG91Y2hFdmVudCkgewotICAgICAgICBmaW5hbCBpbnQgb3ZlcnNjcm9sbE1vZGUgPSBtT3ZlcnNjcm9sbE1vZGU7Ci0gICAgICAgIGZpbmFsIGJvb2xlYW4gY2FuU2Nyb2xsSG9yaXpvbnRhbCA9Ci0gICAgICAgICAgICAgICAgY29tcHV0ZUhvcml6b250YWxTY3JvbGxSYW5nZSgpID4gY29tcHV0ZUhvcml6b250YWxTY3JvbGxFeHRlbnQoKTsKLSAgICAgICAgZmluYWwgYm9vbGVhbiBjYW5TY3JvbGxWZXJ0aWNhbCA9Ci0gICAgICAgICAgICAgICAgY29tcHV0ZVZlcnRpY2FsU2Nyb2xsUmFuZ2UoKSA+IGNvbXB1dGVWZXJ0aWNhbFNjcm9sbEV4dGVudCgpOwotICAgICAgICBmaW5hbCBib29sZWFuIG92ZXJzY3JvbGxIb3Jpem9udGFsID0gb3ZlcnNjcm9sbE1vZGUgPT0gT1ZFUlNDUk9MTF9BTFdBWVMgfHwKLSAgICAgICAgICAgICAgICAob3ZlcnNjcm9sbE1vZGUgPT0gT1ZFUlNDUk9MTF9JRl9DT05URU5UX1NDUk9MTFMgJiYgY2FuU2Nyb2xsSG9yaXpvbnRhbCk7Ci0gICAgICAgIGZpbmFsIGJvb2xlYW4gb3ZlcnNjcm9sbFZlcnRpY2FsID0gb3ZlcnNjcm9sbE1vZGUgPT0gT1ZFUlNDUk9MTF9BTFdBWVMgfHwKLSAgICAgICAgICAgICAgICAob3ZlcnNjcm9sbE1vZGUgPT0gT1ZFUlNDUk9MTF9JRl9DT05URU5UX1NDUk9MTFMgJiYgY2FuU2Nyb2xsVmVydGljYWwpOwotCi0gICAgICAgIGludCBuZXdTY3JvbGxYID0gc2Nyb2xsWCArIGRlbHRhWDsKLSAgICAgICAgaWYgKCFvdmVyc2Nyb2xsSG9yaXpvbnRhbCkgewotICAgICAgICAgICAgbWF4T3ZlcnNjcm9sbFggPSAwOwotICAgICAgICB9Ci0KLSAgICAgICAgaW50IG5ld1Njcm9sbFkgPSBzY3JvbGxZICsgZGVsdGFZOwotICAgICAgICBpZiAoIW92ZXJzY3JvbGxWZXJ0aWNhbCkgewotICAgICAgICAgICAgbWF4T3ZlcnNjcm9sbFkgPSAwOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gQ2xhbXAgdmFsdWVzIGlmIGF0IHRoZSBsaW1pdHMgYW5kIHJlY29yZAotICAgICAgICBmaW5hbCBpbnQgbGVmdCA9IC1tYXhPdmVyc2Nyb2xsWDsKLSAgICAgICAgZmluYWwgaW50IHJpZ2h0ID0gbWF4T3ZlcnNjcm9sbFggKyBzY3JvbGxSYW5nZVg7Ci0gICAgICAgIGZpbmFsIGludCB0b3AgPSAtbWF4T3ZlcnNjcm9sbFk7Ci0gICAgICAgIGZpbmFsIGludCBib3R0b20gPSBtYXhPdmVyc2Nyb2xsWSArIHNjcm9sbFJhbmdlWTsKLQotICAgICAgICBib29sZWFuIGNsYW1wZWRYID0gZmFsc2U7Ci0gICAgICAgIGlmIChuZXdTY3JvbGxYID4gcmlnaHQpIHsKLSAgICAgICAgICAgIG5ld1Njcm9sbFggPSByaWdodDsKLSAgICAgICAgICAgIGNsYW1wZWRYID0gdHJ1ZTsKLSAgICAgICAgfSBlbHNlIGlmIChuZXdTY3JvbGxYIDwgbGVmdCkgewotICAgICAgICAgICAgbmV3U2Nyb2xsWCA9IGxlZnQ7Ci0gICAgICAgICAgICBjbGFtcGVkWCA9IHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgICBib29sZWFuIGNsYW1wZWRZID0gZmFsc2U7Ci0gICAgICAgIGlmIChuZXdTY3JvbGxZID4gYm90dG9tKSB7Ci0gICAgICAgICAgICBuZXdTY3JvbGxZID0gYm90dG9tOwotICAgICAgICAgICAgY2xhbXBlZFkgPSB0cnVlOwotICAgICAgICB9IGVsc2UgaWYgKG5ld1Njcm9sbFkgPCB0b3ApIHsKLSAgICAgICAgICAgIG5ld1Njcm9sbFkgPSB0b3A7Ci0gICAgICAgICAgICBjbGFtcGVkWSA9IHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgICBvbk92ZXJzY3JvbGxlZChuZXdTY3JvbGxYLCBuZXdTY3JvbGxZLCBjbGFtcGVkWCwgY2xhbXBlZFkpOwotCi0gICAgICAgIHJldHVybiBjbGFtcGVkWCB8fCBjbGFtcGVkWTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDYWxsZWQgYnkge0BsaW5rICNvdmVyc2Nyb2xsQnkoaW50LCBpbnQsIGludCwgaW50LCBpbnQsIGludCwgaW50LCBpbnQsIGJvb2xlYW4pfSB0bwotICAgICAqIHJlc3BvbmQgdG8gdGhlIHJlc3VsdHMgb2YgYW4gb3ZlcnNjcm9sbCBvcGVyYXRpb24uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gc2Nyb2xsWCBOZXcgWCBzY3JvbGwgdmFsdWUgaW4gcGl4ZWxzCi0gICAgICogQHBhcmFtIHNjcm9sbFkgTmV3IFkgc2Nyb2xsIHZhbHVlIGluIHBpeGVscwotICAgICAqIEBwYXJhbSBjbGFtcGVkWCBUcnVlIGlmIHNjcm9sbFggd2FzIGNsYW1wZWQgdG8gYW4gb3ZlcnNjcm9sbCBib3VuZGFyeQotICAgICAqIEBwYXJhbSBjbGFtcGVkWSBUcnVlIGlmIHNjcm9sbFkgd2FzIGNsYW1wZWQgdG8gYW4gb3ZlcnNjcm9sbCBib3VuZGFyeQotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIG9uT3ZlcnNjcm9sbGVkKGludCBzY3JvbGxYLCBpbnQgc2Nyb2xsWSwKLSAgICAgICAgICAgIGJvb2xlYW4gY2xhbXBlZFgsIGJvb2xlYW4gY2xhbXBlZFkpIHsKLSAgICAgICAgLy8gSW50ZW50aW9uYWxseSBlbXB0eS4KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBvdmVyc2Nyb2xsIG1vZGUgZm9yIHRoaXMgdmlldy4gVGhlIHJlc3VsdCB3aWxsIGJlCi0gICAgICogb25lIG9mIHtAbGluayAjT1ZFUlNDUk9MTF9BTFdBWVN9IChkZWZhdWx0KSwge0BsaW5rICNPVkVSU0NST0xMX0lGX0NPTlRFTlRfU0NST0xMU30KLSAgICAgKiAoYWxsb3cgb3ZlcnNjcm9sbGluZyBvbmx5IGlmIHRoZSB2aWV3IGNvbnRlbnQgaXMgbGFyZ2VyIHRoYW4gdGhlIGNvbnRhaW5lciksCi0gICAgICogb3Ige0BsaW5rICNPVkVSU0NST0xMX05FVkVSfS4KLSAgICAgKgotICAgICAqIEByZXR1cm4gVGhpcyB2aWV3J3Mgb3ZlcnNjcm9sbCBtb2RlLgotICAgICAqLwotICAgIHB1YmxpYyBpbnQgZ2V0T3ZlcnNjcm9sbE1vZGUoKSB7Ci0gICAgICAgIHJldHVybiBtT3ZlcnNjcm9sbE1vZGU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0IHRoZSBvdmVyc2Nyb2xsIG1vZGUgZm9yIHRoaXMgdmlldy4gVmFsaWQgb3ZlcnNjcm9sbCBtb2RlcyBhcmUKLSAgICAgKiB7QGxpbmsgI09WRVJTQ1JPTExfQUxXQVlTfSAoZGVmYXVsdCksIHtAbGluayAjT1ZFUlNDUk9MTF9JRl9DT05URU5UX1NDUk9MTFN9Ci0gICAgICogKGFsbG93IG92ZXJzY3JvbGxpbmcgb25seSBpZiB0aGUgdmlldyBjb250ZW50IGlzIGxhcmdlciB0aGFuIHRoZSBjb250YWluZXIpLAotICAgICAqIG9yIHtAbGluayAjT1ZFUlNDUk9MTF9ORVZFUn0uCi0gICAgICoKLSAgICAgKiBTZXR0aW5nIHRoZSBvdmVyc2Nyb2xsIG1vZGUgb2YgYSB2aWV3IHdpbGwgaGF2ZSBhbiBlZmZlY3Qgb25seSBpZiB0aGUKLSAgICAgKiB2aWV3IGlzIGNhcGFibGUgb2Ygc2Nyb2xsaW5nLgotICAgICAqCi0gICAgICogQHBhcmFtIG92ZXJzY3JvbGxNb2RlIFRoZSBuZXcgb3ZlcnNjcm9sbCBtb2RlIGZvciB0aGlzIHZpZXcuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0T3ZlcnNjcm9sbE1vZGUoaW50IG92ZXJzY3JvbGxNb2RlKSB7Ci0gICAgICAgIGlmIChvdmVyc2Nyb2xsTW9kZSAhPSBPVkVSU0NST0xMX0FMV0FZUyAmJgotICAgICAgICAgICAgICAgIG92ZXJzY3JvbGxNb2RlICE9IE9WRVJTQ1JPTExfSUZfQ09OVEVOVF9TQ1JPTExTICYmCi0gICAgICAgICAgICAgICAgb3ZlcnNjcm9sbE1vZGUgIT0gT1ZFUlNDUk9MTF9ORVZFUikgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiSW52YWxpZCBvdmVyc2Nyb2xsIG1vZGUgIiArIG92ZXJzY3JvbGxNb2RlKTsKLSAgICAgICAgfQotICAgICAgICBtT3ZlcnNjcm9sbE1vZGUgPSBvdmVyc2Nyb2xsTW9kZTsKLSAgICB9Ci0KLSAgICAvKioKICAgICAgKiBBIE1lYXN1cmVTcGVjIGVuY2Fwc3VsYXRlcyB0aGUgbGF5b3V0IHJlcXVpcmVtZW50cyBwYXNzZWQgZnJvbSBwYXJlbnQgdG8gY2hpbGQuCiAgICAgICogRWFjaCBNZWFzdXJlU3BlYyByZXByZXNlbnRzIGEgcmVxdWlyZW1lbnQgZm9yIGVpdGhlciB0aGUgd2lkdGggb3IgdGhlIGhlaWdodC4KICAgICAgKiBBIE1lYXN1cmVTcGVjIGlzIGNvbXByaXNlZCBvZiBhIHNpemUgYW5kIGEgbW9kZS4gVGhlcmUgYXJlIHRocmVlIHBvc3NpYmxlCkBAIC05Mjk0LDYgKzEwMTY0LDggQEAKICAgICAgICAgSUJpbmRlciBtUGFuZWxQYXJlbnRXaW5kb3dUb2tlbjsKICAgICAgICAgU3VyZmFjZSBtU3VyZmFjZTsKIAorICAgICAgICBib29sZWFuIG1IYXJkd2FyZUFjY2VsZXJhdGVkOyAgICAgICAgCisgICAgICAgIAogICAgICAgICAvKioKICAgICAgICAgICogU2NhbGUgZmFjdG9yIHVzZWQgYnkgdGhlIGNvbXBhdGliaWxpdHkgbW9kZQogICAgICAgICAgKi8KQEAgLTk0MTEsNiArMTAyODMsMTMgQEAKICAgICAgICAgICovCiAgICAgICAgIGZpbmFsIGludFtdIG1JbnZhbGlkYXRlQ2hpbGRMb2NhdGlvbiA9IG5ldyBpbnRbMl07CiAKKworICAgICAgICAvKioKKyAgICAgICAgICogR2xvYmFsIHRvIHRoZSB2aWV3IGhpZXJhcmNoeSB1c2VkIGFzIGEgdGVtcG9yYXJ5IGZvciBkZWFsaW5nIHdpdGgKKyAgICAgICAgICogeC95IGxvY2F0aW9uIHdoZW4gdmlldyBpcyB0cmFuc2Zvcm1lZC4KKyAgICAgICAgICovCisgICAgICAgIGZpbmFsIGZsb2F0W10gbVRtcFRyYW5zZm9ybUxvY2F0aW9uID0gbmV3IGZsb2F0WzJdOworCiAgICAgICAgIC8qKgogICAgICAgICAgKiBUaGUgdmlldyB0cmVlIG9ic2VydmVyIHVzZWQgdG8gZGlzcGF0Y2ggZ2xvYmFsIGV2ZW50cyBsaWtlCiAgICAgICAgICAqIGxheW91dCwgcHJlLWRyYXcsIHRvdWNoIG1vZGUgY2hhbmdlLCBldGMuCkBAIC05NDQ3LDYgKzEwMzI2LDExIEBACiAgICAgICAgIGZpbmFsIFJlY3QgbVRtcEludmFsUmVjdCA9IG5ldyBSZWN0KCk7CiAKICAgICAgICAgLyoqCisgICAgICAgICAqIFRlbXBvcmFyeSBmb3IgdXNlIGluIGNvbXB1dGluZyBoaXQgYXJlYXMgd2l0aCB0cmFuc2Zvcm1lZCB2aWV3cworICAgICAgICAgKi8KKyAgICAgICAgZmluYWwgUmVjdEYgbVRtcFRyYW5zZm9ybVJlY3QgPSBuZXcgUmVjdEYoKTsKKworICAgICAgICAvKioKICAgICAgICAgICogVGVtcG9yYXJ5IGxpc3QgZm9yIHVzZSBpbiBjb2xsZWN0aW5nIGZvY3VzYWJsZSBkZXNjZW5kZW50cyBvZiBhIHZpZXcuCiAgICAgICAgICAqLwogICAgICAgICBmaW5hbCBBcnJheUxpc3Q8Vmlldz4gbUZvY3VzYWJsZXNUZW1wTGlzdCA9IG5ldyBBcnJheUxpc3Q8Vmlldz4oMjQpOwpAQCAtOTUwNiw4ICsxMDM5MCw4IEBACiAKICAgICAgICAgcHVibGljIGZpbmFsIEludGVycG9sYXRvciBzY3JvbGxCYXJJbnRlcnBvbGF0b3IgPSBuZXcgSW50ZXJwb2xhdG9yKDEsIDIpOwogCi0gICAgICAgIHByaXZhdGUgZmluYWwgZmxvYXRbXSBtT3BhcXVlID0gezI1NS4wZn07Ci0gICAgICAgIHByaXZhdGUgZmluYWwgZmxvYXRbXSBtVHJhbnNwYXJlbnQgPSB7MC4wZn07CisgICAgICAgIHByaXZhdGUgZmluYWwgZmxvYXRbXSBtT3BhcXVlID0geyAyNTUuMGYgfTsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBmbG9hdFtdIG1UcmFuc3BhcmVudCA9IHsgMC4wZiB9OwogICAgICAgICAKICAgICAgICAgLyoqCiAgICAgICAgICAqIFdoZW4gZmFkaW5nIHNob3VsZCBzdGFydC4gVGhpcyB0aW1lIG1vdmVzIGludG8gdGhlIGZ1dHVyZSBldmVyeSB0aW1lCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC92aWV3L1ZpZXdDb25maWd1cmF0aW9uLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC92aWV3L1ZpZXdDb25maWd1cmF0aW9uLmphdmEKaW5kZXggOTI0YzlkNC4uYWNkZmMyOCAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9WaWV3Q29uZmlndXJhdGlvbi5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvVmlld0NvbmZpZ3VyYXRpb24uamF2YQpAQCAtMTQwLDE2ICsxNDAsNiBAQAogICAgICAqLwogICAgIHByaXZhdGUgc3RhdGljIGZsb2F0IFNDUk9MTF9GUklDVElPTiA9IDAuMDE1ZjsKIAotICAgIC8qKgotICAgICAqIE1heCBkaXN0YW5jZSB0byBvdmVyc2Nyb2xsIGZvciBlZGdlIGVmZmVjdHMKLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgT1ZFUlNDUk9MTF9ESVNUQU5DRSA9IDA7Ci0KLSAgICAvKioKLSAgICAgKiBNYXggZGlzdGFuY2UgdG8gb3ZlcmZsaW5nIGZvciBlZGdlIGVmZmVjdHMKLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgT1ZFUkZMSU5HX0RJU1RBTkNFID0gNDsKLQogICAgIHByaXZhdGUgZmluYWwgaW50IG1FZGdlU2xvcDsKICAgICBwcml2YXRlIGZpbmFsIGludCBtRmFkaW5nRWRnZUxlbmd0aDsKICAgICBwcml2YXRlIGZpbmFsIGludCBtTWluaW11bUZsaW5nVmVsb2NpdHk7CkBAIC0xNjAsOCArMTUwLDYgQEAKICAgICBwcml2YXRlIGZpbmFsIGludCBtRG91YmxlVGFwU2xvcDsKICAgICBwcml2YXRlIGZpbmFsIGludCBtV2luZG93VG91Y2hTbG9wOwogICAgIHByaXZhdGUgZmluYWwgaW50IG1NYXhpbXVtRHJhd2luZ0NhY2hlU2l6ZTsKLSAgICBwcml2YXRlIGZpbmFsIGludCBtT3ZlcnNjcm9sbERpc3RhbmNlOwotICAgIHByaXZhdGUgZmluYWwgaW50IG1PdmVyZmxpbmdEaXN0YW5jZTsKIAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFNwYXJzZUFycmF5PFZpZXdDb25maWd1cmF0aW9uPiBzQ29uZmlndXJhdGlvbnMgPQogICAgICAgICAgICAgbmV3IFNwYXJzZUFycmF5PFZpZXdDb25maWd1cmF0aW9uPigyKTsKQEAgLTE4Miw4ICsxNzAsNiBAQAogICAgICAgICBtV2luZG93VG91Y2hTbG9wID0gV0lORE9XX1RPVUNIX1NMT1A7CiAgICAgICAgIC8vbm9pbnNwZWN0aW9uIGRlcHJlY2F0aW9uCiAgICAgICAgIG1NYXhpbXVtRHJhd2luZ0NhY2hlU2l6ZSA9IE1BWElNVU1fRFJBV0lOR19DQUNIRV9TSVpFOwotICAgICAgICBtT3ZlcnNjcm9sbERpc3RhbmNlID0gT1ZFUlNDUk9MTF9ESVNUQU5DRTsKLSAgICAgICAgbU92ZXJmbGluZ0Rpc3RhbmNlID0gT1ZFUkZMSU5HX0RJU1RBTkNFOwogICAgIH0KIAogICAgIC8qKgpAQCAtMjEyLDkgKzE5OCw2IEBACiAKICAgICAgICAgLy8gU2l6ZSBvZiB0aGUgc2NyZWVuIGluIGJ5dGVzLCBpbiBBUkdCXzg4ODggZm9ybWF0CiAgICAgICAgIG1NYXhpbXVtRHJhd2luZ0NhY2hlU2l6ZSA9IDQgKiBtZXRyaWNzLndpZHRoUGl4ZWxzICogbWV0cmljcy5oZWlnaHRQaXhlbHM7Ci0KLSAgICAgICAgbU92ZXJzY3JvbGxEaXN0YW5jZSA9IChpbnQpIChkZW5zaXR5ICogT1ZFUlNDUk9MTF9ESVNUQU5DRSArIDAuNWYpOwotICAgICAgICBtT3ZlcmZsaW5nRGlzdGFuY2UgPSAoaW50KSAoZGVuc2l0eSAqIE9WRVJGTElOR19ESVNUQU5DRSArIDAuNWYpOwogICAgIH0KIAogICAgIC8qKgpAQCAtNDcyLDIwICs0NTUsNiBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEByZXR1cm4gVGhlIG1heGltdW0gZGlzdGFuY2UgYSBWaWV3IHNob3VsZCBvdmVyc2Nyb2xsIGJ5IHdoZW4gc2hvd2luZyBlZGdlIGVmZmVjdHMuCi0gICAgICovCi0gICAgcHVibGljIGludCBnZXRTY2FsZWRPdmVyc2Nyb2xsRGlzdGFuY2UoKSB7Ci0gICAgICAgIHJldHVybiBtT3ZlcnNjcm9sbERpc3RhbmNlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gVGhlIG1heGltdW0gZGlzdGFuY2UgYSBWaWV3IHNob3VsZCBvdmVyZmxpbmcgYnkgd2hlbiBzaG93aW5nIGVkZ2UgZWZmZWN0cy4KLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IGdldFNjYWxlZE92ZXJmbGluZ0Rpc3RhbmNlKCkgewotICAgICAgICByZXR1cm4gbU92ZXJmbGluZ0Rpc3RhbmNlOwotICAgIH0KLQotICAgIC8qKgogICAgICAqIFRoZSBhbW91bnQgb2YgdGltZSB0aGF0IHRoZSB6b29tIGNvbnRyb2xzIHNob3VsZCBiZQogICAgICAqIGRpc3BsYXllZCBvbiB0aGUgc2NyZWVuIGV4cHJlc3NlZCBpbiBtaWxsaXNlY29uZHMuCiAgICAgICogCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC92aWV3L1ZpZXdEZWJ1Zy5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9WaWV3RGVidWcuamF2YQppbmRleCA3YjY5OTFmLi5iMWQ1MjcyIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC92aWV3L1ZpZXdEZWJ1Zy5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvVmlld0RlYnVnLmphdmEKQEAgLTI3LDYgKzI3LDcgQEAKIGltcG9ydCBhbmRyb2lkLm9zLkVudmlyb25tZW50OwogaW1wb3J0IGFuZHJvaWQub3MuRGVidWc7CiBpbXBvcnQgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb247CitpbXBvcnQgZGFsdmlrLnN5c3RlbS5WTURlYnVnOwogCiBpbXBvcnQgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW07CiBpbXBvcnQgamF2YS5pby5GaWxlOwpAQCAtMTE4LDI0ICsxMTksMjEgQEAKICAgICAgKgogICAgICAqIEBoaWRlCiAgICAgICovCi0gICAgQERlYnVnLkRlYnVnUHJvcGVydHkKLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gcHJvZmlsZURyYXdpbmcgPSBmYWxzZTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUdfUFJPRklMRV9EUkFXSU5HID0gZmFsc2U7CiAKICAgICAvKioKICAgICAgKiBQcm9maWxlcyBsYXlvdXQgdGltZXMgaW4gdGhlIGV2ZW50cyBsb2cuCiAgICAgICoKICAgICAgKiBAaGlkZQogICAgICAqLwotICAgIEBEZWJ1Zy5EZWJ1Z1Byb3BlcnR5Ci0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIHByb2ZpbGVMYXlvdXQgPSBmYWxzZTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUdfUFJPRklMRV9MQVlPVVQgPSBmYWxzZTsKIAogICAgIC8qKgogICAgICAqIFByb2ZpbGVzIHJlYWwgZnBzICh0aW1lcyBiZXR3ZWVuIGRyYXdzKSBhbmQgZGlzcGxheXMgdGhlIHJlc3VsdC4KICAgICAgKgogICAgICAqIEBoaWRlCiAgICAgICovCi0gICAgQERlYnVnLkRlYnVnUHJvcGVydHkKLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gc2hvd0ZwcyA9IGZhbHNlOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVR19TSE9XX0ZQUyA9IGZhbHNlOwogCiAgICAgLyoqCiAgICAgICogPHA+RW5hYmxlcyBvciBkaXNhYmxlcyB2aWV3cyBjb25zaXN0ZW5jeSBjaGVjay4gRXZlbiB3aGVuIHRoaXMgcHJvcGVydHkgaXMgZW5hYmxlZCwKQEAgLTQyNyw3ICs0MjUsNyBAQAogICAgICAqIEBoaWRlCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBsb25nIGdldFZpZXdJbnN0YW5jZUNvdW50KCkgewotICAgICAgICByZXR1cm4gVmlldy5zSW5zdGFuY2VDb3VudDsKKyAgICAgICAgcmV0dXJuIFZNRGVidWcuY291bnRJbnN0YW5jZXNPZkNsYXNzKFZpZXcuY2xhc3MpOwogICAgIH0KIAogICAgIC8qKgpAQCAtNDM4LDcgKzQzNiw3IEBACiAgICAgICogQGhpZGUKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGxvbmcgZ2V0Vmlld1Jvb3RJbnN0YW5jZUNvdW50KCkgewotICAgICAgICByZXR1cm4gVmlld1Jvb3QuZ2V0SW5zdGFuY2VDb3VudCgpOworICAgICAgICByZXR1cm4gVk1EZWJ1Zy5jb3VudEluc3RhbmNlc09mQ2xhc3MoVmlld1Jvb3QuY2xhc3MpOwogICAgIH0KIAogICAgIC8qKgpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9WaWV3R3JvdXAuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvVmlld0dyb3VwLmphdmEKaW5kZXggMjhiZWQzYS4uYTE4YTk3NyAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9WaWV3R3JvdXAuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC92aWV3L1ZpZXdHcm91cC5qYXZhCkBAIC0xNiw2ICsxNiw3IEBACiAKIHBhY2thZ2UgYW5kcm9pZC52aWV3OwogCitpbXBvcnQgYW5kcm9pZC5hbmltYXRpb24uTGF5b3V0VHJhbnNpdGlvbjsKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC5SOwogCiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CkBAIC0yMyw2ICsyNCw3IEBACiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5UeXBlZEFycmF5OwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwOwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQ2FudmFzOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuTWF0cml4OwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUGFpbnQ7CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5SZWN0OwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUmVjdEY7CkBAIC0zMCw4ICszMiw2IEBACiBpbXBvcnQgYW5kcm9pZC5vcy5QYXJjZWxhYmxlOwogaW1wb3J0IGFuZHJvaWQub3MuU3lzdGVtQ2xvY2s7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldDsKLWltcG9ydCBhbmRyb2lkLnV0aWwuQ29uZmlnOwotaW1wb3J0IGFuZHJvaWQudXRpbC5FdmVudExvZzsKIGltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwogaW1wb3J0IGFuZHJvaWQudXRpbC5TcGFyc2VBcnJheTsKIGltcG9ydCBhbmRyb2lkLnZpZXcuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmlsaXR5RXZlbnQ7CkBAIC02Myw4ICs2MywxMCBAQAogICogQGF0dHIgcmVmIGFuZHJvaWQuUi5zdHlsZWFibGUjVmlld0dyb3VwX2Fsd2F5c0RyYXduV2l0aENhY2hlCiAgKiBAYXR0ciByZWYgYW5kcm9pZC5SLnN0eWxlYWJsZSNWaWV3R3JvdXBfYWRkU3RhdGVzRnJvbUNoaWxkcmVuCiAgKiBAYXR0ciByZWYgYW5kcm9pZC5SLnN0eWxlYWJsZSNWaWV3R3JvdXBfZGVzY2VuZGFudEZvY3VzYWJpbGl0eQorICogQGF0dHIgcmVmIGFuZHJvaWQuUi5zdHlsZWFibGUjVmlld0dyb3VwX2FuaW1hdGVMYXlvdXRDaGFuZ2VzCiAgKi8KIHB1YmxpYyBhYnN0cmFjdCBjbGFzcyBWaWV3R3JvdXAgZXh0ZW5kcyBWaWV3IGltcGxlbWVudHMgVmlld1BhcmVudCwgVmlld01hbmFnZXIgeworCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBEQkcgPSBmYWxzZTsKIAogICAgIC8qKgpAQCAtODYsMTMgKzg4LDI4IEBACiAgICAgLy8gVGhlIHZpZXcgY29udGFpbmVkIHdpdGhpbiB0aGlzIFZpZXdHcm91cCB0aGF0IGhhcyBvciBjb250YWlucyBmb2N1cy4KICAgICBwcml2YXRlIFZpZXcgbUZvY3VzZWQ7CiAKLSAgICAvLyBUaGUgY3VycmVudCB0cmFuc2Zvcm1hdGlvbiB0byBhcHBseSBvbiB0aGUgY2hpbGQgYmVpbmcgZHJhd24KLSAgICBwcml2YXRlIFRyYW5zZm9ybWF0aW9uIG1DaGlsZFRyYW5zZm9ybWF0aW9uOworICAgIC8qKgorICAgICAqIEEgVHJhbnNmb3JtYXRpb24gdXNlZCB3aGVuIGRyYXdpbmcgY2hpbGRyZW4sIHRvCisgICAgICogYXBwbHkgb24gdGhlIGNoaWxkIGJlaW5nIGRyYXduLgorICAgICAqLworICAgIHByaXZhdGUgZmluYWwgVHJhbnNmb3JtYXRpb24gbUNoaWxkVHJhbnNmb3JtYXRpb24gPSBuZXcgVHJhbnNmb3JtYXRpb24oKTsKKworICAgIC8qKgorICAgICAqIFVzZWQgdG8gdHJhY2sgdGhlIGN1cnJlbnQgaW52YWxpZGF0aW9uIHJlZ2lvbi4KKyAgICAgKi8KICAgICBwcml2YXRlIFJlY3RGIG1JbnZhbGlkYXRlUmVnaW9uOwogCisgICAgLyoqCisgICAgICogQSBUcmFuc2Zvcm1hdGlvbiB1c2VkIHRvIGNhbGN1bGF0ZSBhIGNvcnJlY3QKKyAgICAgKiBpbnZhbGlkYXRpb24gYXJlYSB3aGVuIHRoZSBhcHBsaWNhdGlvbiBpcyBhdXRvc2NhbGVkLgorICAgICAqLworICAgIHByaXZhdGUgVHJhbnNmb3JtYXRpb24gbUludmFsaWRhdGlvblRyYW5zZm9ybWF0aW9uOworCiAgICAgLy8gVGFyZ2V0IG9mIE1vdGlvbiBldmVudHMKICAgICBwcml2YXRlIFZpZXcgbU1vdGlvblRhcmdldDsKLSAgICBwcml2YXRlIGZpbmFsIFJlY3QgbVRlbXBSZWN0ID0gbmV3IFJlY3QoKTsKKworICAgIC8vIFRhcmdldHMgb2YgTW90aW9uRXZlbnRzIGluIHNwbGl0IG1vZGUKKyAgICBwcml2YXRlIFNwbGl0TW90aW9uVGFyZ2V0cyBtU3BsaXRNb3Rpb25UYXJnZXRzOwogCiAgICAgLy8gTGF5b3V0IGFuaW1hdGlvbgogICAgIHByaXZhdGUgTGF5b3V0QW5pbWF0aW9uQ29udHJvbGxlciBtTGF5b3V0QW5pbWF0aW9uQ29udHJvbGxlcjsKQEAgLTIyOCw2ICsyNDUsMTEgQEAKICAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBGTEFHX0RJU0FMTE9XX0lOVEVSQ0VQVCA9IDB4ODAwMDA7CiAKICAgICAvKioKKyAgICAgKiBXaGVuIHNldCwgdGhpcyBWaWV3R3JvdXAgd2lsbCBzcGxpdCBNb3Rpb25FdmVudHMgdG8gbXVsdGlwbGUgY2hpbGQgVmlld3Mgd2hlbiBhcHByb3ByaWF0ZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRkxBR19TUExJVF9NT1RJT05fRVZFTlRTID0gMHgxMDAwMDA7CisKKyAgICAvKioKICAgICAgKiBJbmRpY2F0ZXMgd2hpY2ggdHlwZXMgb2YgZHJhd2luZyBjYWNoZXMgYXJlIHRvIGJlIGtlcHQgaW4gbWVtb3J5LgogICAgICAqIFRoaXMgZmllbGQgc2hvdWxkIGJlIG1hZGUgcHJpdmF0ZSwgc28gaXQgaXMgaGlkZGVuIGZyb20gdGhlIFNESy4KICAgICAgKiB7QGhpZGV9CkBAIC0yNzcsNiArMjk5LDE0IEBACiAgICAgLy8gVXNlZCB0byBkcmF3IGNhY2hlZCB2aWV3cwogICAgIHByaXZhdGUgZmluYWwgUGFpbnQgbUNhY2hlUGFpbnQgPSBuZXcgUGFpbnQoKTsKIAorICAgIC8vIFVzZWQgdG8gYW5pbWF0ZSBhZGQvcmVtb3ZlIGNoYW5nZXMgaW4gbGF5b3V0CisgICAgcHJpdmF0ZSBMYXlvdXRUcmFuc2l0aW9uIG1UcmFuc2l0aW9uOworCisgICAgLy8gVGhlIHNldCBvZiB2aWV3cyB0aGF0IGFyZSBjdXJyZW50bHkgYmVpbmcgdHJhbnNpdGlvbmVkLiBUaGlzIGxpc3QgaXMgdXNlZCB0byB0cmFjayB2aWV3cworICAgIC8vIGJlaW5nIHJlbW92ZWQgdGhhdCBzaG91bGQgbm90IGFjdHVhbGx5IGJlIHJlbW92ZWQgZnJvbSB0aGUgcGFyZW50IHlldCBiZWNhdXNlIHRoZXkgYXJlCisgICAgLy8gYmVpbmcgYW5pbWF0ZWQuCisgICAgcHJpdmF0ZSBBcnJheUxpc3Q8Vmlldz4gbVRyYW5zaXRpb25pbmdWaWV3czsKKwogICAgIHB1YmxpYyBWaWV3R3JvdXAoQ29udGV4dCBjb250ZXh0KSB7CiAgICAgICAgIHN1cGVyKGNvbnRleHQpOwogICAgICAgICBpbml0Vmlld0dyb3VwKCk7CkBAIC0zNDgsNiArMzc4LDE1IEBACiAgICAgICAgICAgICAgICAgY2FzZSBSLnN0eWxlYWJsZS5WaWV3R3JvdXBfZGVzY2VuZGFudEZvY3VzYWJpbGl0eToKICAgICAgICAgICAgICAgICAgICAgc2V0RGVzY2VuZGFudEZvY3VzYWJpbGl0eShERVNDRU5EQU5UX0ZPQ1VTQUJJTElUWV9GTEFHU1thLmdldEludChhdHRyLCAwKV0pOwogICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFIuc3R5bGVhYmxlLlZpZXdHcm91cF9zcGxpdE1vdGlvbkV2ZW50czoKKyAgICAgICAgICAgICAgICAgICAgc2V0TW90aW9uRXZlbnRTcGxpdHRpbmdFbmFibGVkKGEuZ2V0Qm9vbGVhbihhdHRyLCBmYWxzZSkpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFIuc3R5bGVhYmxlLlZpZXdHcm91cF9hbmltYXRlTGF5b3V0Q2hhbmdlczoKKyAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBhbmltYXRlTGF5b3V0Q2hhbmdlcyA9IGEuZ2V0Qm9vbGVhbihhdHRyLCBmYWxzZSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChhbmltYXRlTGF5b3V0Q2hhbmdlcykgeworICAgICAgICAgICAgICAgICAgICAgICAgc2V0TGF5b3V0VHJhbnNpdGlvbihuZXcgTGF5b3V0VHJhbnNpdGlvbigpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCkBAIC00NjEsNiArNTAwLDEzIEBACiAgICAgfQogCiAgICAgLyoqCisgICAgICoge0Bpbmhlcml0RG9jfQorICAgICAqLworICAgIHB1YmxpYyBBY3Rpb25Nb2RlIHN0YXJ0QWN0aW9uTW9kZUZvckNoaWxkKFZpZXcgb3JpZ2luYWxWaWV3LCBBY3Rpb25Nb2RlLkNhbGxiYWNrIGNhbGxiYWNrKSB7CisgICAgICAgIHJldHVybiBtUGFyZW50ICE9IG51bGwgPyBtUGFyZW50LnN0YXJ0QWN0aW9uTW9kZUZvckNoaWxkKG9yaWdpbmFsVmlldywgY2FsbGJhY2spIDogbnVsbDsKKyAgICB9CisKKyAgICAvKioKICAgICAgKiBGaW5kIHRoZSBuZWFyZXN0IHZpZXcgaW4gdGhlIHNwZWNpZmllZCBkaXJlY3Rpb24gdGhhdCB3YW50cyB0byB0YWtlCiAgICAgICogZm9jdXMuCiAgICAgICoKQEAgLTgyNiwxMiArODcyLDE4IEBACiAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KIAorICAgICAgICBpZiAoKG1Hcm91cEZsYWdzICYgRkxBR19TUExJVF9NT1RJT05fRVZFTlRTKSA9PSBGTEFHX1NQTElUX01PVElPTl9FVkVOVFMpIHsKKyAgICAgICAgICAgIGlmIChtU3BsaXRNb3Rpb25UYXJnZXRzID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBtU3BsaXRNb3Rpb25UYXJnZXRzID0gbmV3IFNwbGl0TW90aW9uVGFyZ2V0cygpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGRpc3BhdGNoU3BsaXRUb3VjaEV2ZW50KGV2KTsKKyAgICAgICAgfQorCiAgICAgICAgIGZpbmFsIGludCBhY3Rpb24gPSBldi5nZXRBY3Rpb24oKTsKICAgICAgICAgZmluYWwgZmxvYXQgeGYgPSBldi5nZXRYKCk7CiAgICAgICAgIGZpbmFsIGZsb2F0IHlmID0gZXYuZ2V0WSgpOwogICAgICAgICBmaW5hbCBmbG9hdCBzY3JvbGxlZFhGbG9hdCA9IHhmICsgbVNjcm9sbFg7CiAgICAgICAgIGZpbmFsIGZsb2F0IHNjcm9sbGVkWUZsb2F0ID0geWYgKyBtU2Nyb2xsWTsKLSAgICAgICAgZmluYWwgUmVjdCBmcmFtZSA9IG1UZW1wUmVjdDsKIAogICAgICAgICBib29sZWFuIGRpc2FsbG93SW50ZXJjZXB0ID0gKG1Hcm91cEZsYWdzICYgRkxBR19ESVNBTExPV19JTlRFUkNFUFQpICE9IDA7CiAKQEAgLTg1MCwyOSArOTAyLDE3IEBACiAgICAgICAgICAgICAgICAgZXYuc2V0QWN0aW9uKE1vdGlvbkV2ZW50LkFDVElPTl9ET1dOKTsKICAgICAgICAgICAgICAgICAvLyBXZSBrbm93IHdlIHdhbnQgdG8gZGlzcGF0Y2ggdGhlIGV2ZW50IGRvd24sIGZpbmQgYSBjaGlsZAogICAgICAgICAgICAgICAgIC8vIHdobyBjYW4gaGFuZGxlIGl0LCBzdGFydCB3aXRoIHRoZSBmcm9udC1tb3N0IGNoaWxkLgotICAgICAgICAgICAgICAgIGZpbmFsIGludCBzY3JvbGxlZFhJbnQgPSAoaW50KSBzY3JvbGxlZFhGbG9hdDsKLSAgICAgICAgICAgICAgICBmaW5hbCBpbnQgc2Nyb2xsZWRZSW50ID0gKGludCkgc2Nyb2xsZWRZRmxvYXQ7CiAgICAgICAgICAgICAgICAgZmluYWwgVmlld1tdIGNoaWxkcmVuID0gbUNoaWxkcmVuOwogICAgICAgICAgICAgICAgIGZpbmFsIGludCBjb3VudCA9IG1DaGlsZHJlbkNvdW50OwogICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSBjb3VudCAtIDE7IGkgPj0gMDsgaS0tKSB7CiAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFZpZXcgY2hpbGQgPSBjaGlsZHJlbltpXTsKICAgICAgICAgICAgICAgICAgICAgaWYgKChjaGlsZC5tVmlld0ZsYWdzICYgVklTSUJJTElUWV9NQVNLKSA9PSBWSVNJQkxFCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgY2hpbGQuZ2V0QW5pbWF0aW9uKCkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQuZ2V0SGl0UmVjdChmcmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZnJhbWUuY29udGFpbnMoc2Nyb2xsZWRYSW50LCBzY3JvbGxlZFlJbnQpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb2Zmc2V0IHRoZSBldmVudCB0byB0aGUgdmlldydzIGNvb3JkaW5hdGUgc3lzdGVtCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgZmxvYXQgeGMgPSBzY3JvbGxlZFhGbG9hdCAtIGNoaWxkLm1MZWZ0OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIGZsb2F0IHljID0gc2Nyb2xsZWRZRmxvYXQgLSBjaGlsZC5tVG9wOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2LnNldExvY2F0aW9uKHhjLCB5Yyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQubVByaXZhdGVGbGFncyAmPSB+Q0FOQ0VMX05FWFRfVVBfRVZFTlQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNoaWxkLmRpc3BhdGNoVG91Y2hFdmVudChldikpICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEV2ZW50IGhhbmRsZWQsIHdlIGhhdmUgYSB0YXJnZXQgbm93LgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTW90aW9uVGFyZ2V0ID0gY2hpbGQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGUgZXZlbnQgZGlkbid0IGdldCBoYW5kbGVkLCB0cnkgdGhlIG5leHQgdmlldy4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBEb24ndCByZXNldCB0aGUgZXZlbnQncyBsb2NhdGlvbiwgaXQncyBub3QKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBuZWNlc3NhcnkgaGVyZS4KKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNpbmdsZSBkaXNwYXRjaCBhbHdheXMgcGlja3MgaXRzIHRhcmdldCBiYXNlZCBvbiB0aGUgaW5pdGlhbCBkb3duCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBldmVudCdzIHBvc2l0aW9uIC0gaW5kZXggMAorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRpc3BhdGNoVG91Y2hFdmVudElmSW5WaWV3KGNoaWxkLCBldiwgMCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTW90aW9uVGFyZ2V0ID0gY2hpbGQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CkBAIC05MDIsMTEgKzk0MiwyMiBAQAogICAgICAgICAgICAgcmV0dXJuIHN1cGVyLmRpc3BhdGNoVG91Y2hFdmVudChldik7CiAgICAgICAgIH0KIAorICAgICAgICAvLyBDYWxjdWxhdGUgdGhlIG9mZnNldCBwb2ludCBpbnRvIHRoZSB0YXJnZXQncyBsb2NhbCBjb29yZGluYXRlcworICAgICAgICBmbG9hdCB4YyA9IHNjcm9sbGVkWEZsb2F0IC0gKGZsb2F0KSB0YXJnZXQubUxlZnQ7CisgICAgICAgIGZsb2F0IHljID0gc2Nyb2xsZWRZRmxvYXQgLSAoZmxvYXQpIHRhcmdldC5tVG9wOworICAgICAgICBpZiAoIXRhcmdldC5oYXNJZGVudGl0eU1hdHJpeCgpICYmIG1BdHRhY2hJbmZvICE9IG51bGwpIHsKKyAgICAgICAgICAgIC8vIG5vbi1pZGVudGl0eSBtYXRyaXg6IHRyYW5zZm9ybSB0aGUgcG9pbnQgaW50byB0aGUgdmlldydzIGNvb3JkaW5hdGVzCisgICAgICAgICAgICBmaW5hbCBmbG9hdFtdIGxvY2FsWFkgPSBtQXR0YWNoSW5mby5tVG1wVHJhbnNmb3JtTG9jYXRpb247CisgICAgICAgICAgICBsb2NhbFhZWzBdID0geGM7CisgICAgICAgICAgICBsb2NhbFhZWzFdID0geWM7CisgICAgICAgICAgICB0YXJnZXQuZ2V0SW52ZXJzZU1hdHJpeCgpLm1hcFBvaW50cyhsb2NhbFhZKTsKKyAgICAgICAgICAgIHhjID0gbG9jYWxYWVswXTsKKyAgICAgICAgICAgIHljID0gbG9jYWxYWVsxXTsKKyAgICAgICAgfQorCiAgICAgICAgIC8vIGlmIGhhdmUgYSB0YXJnZXQsIHNlZSBpZiB3ZSdyZSBhbGxvd2VkIHRvIGFuZCB3YW50IHRvIGludGVyY2VwdCBpdHMKICAgICAgICAgLy8gZXZlbnRzCiAgICAgICAgIGlmICghZGlzYWxsb3dJbnRlcmNlcHQgJiYgb25JbnRlcmNlcHRUb3VjaEV2ZW50KGV2KSkgewotICAgICAgICAgICAgZmluYWwgZmxvYXQgeGMgPSBzY3JvbGxlZFhGbG9hdCAtIChmbG9hdCkgdGFyZ2V0Lm1MZWZ0OwotICAgICAgICAgICAgZmluYWwgZmxvYXQgeWMgPSBzY3JvbGxlZFlGbG9hdCAtIChmbG9hdCkgdGFyZ2V0Lm1Ub3A7CiAgICAgICAgICAgICBtUHJpdmF0ZUZsYWdzICY9IH5DQU5DRUxfTkVYVF9VUF9FVkVOVDsKICAgICAgICAgICAgIGV2LnNldEFjdGlvbihNb3Rpb25FdmVudC5BQ1RJT05fQ0FOQ0VMKTsKICAgICAgICAgICAgIGV2LnNldExvY2F0aW9uKHhjLCB5Yyk7CkBAIC05MjgsOCArOTc5LDYgQEAKIAogICAgICAgICAvLyBmaW5hbGx5IG9mZnNldCB0aGUgZXZlbnQgdG8gdGhlIHRhcmdldCdzIGNvb3JkaW5hdGUgc3lzdGVtIGFuZAogICAgICAgICAvLyBkaXNwYXRjaCB0aGUgZXZlbnQuCi0gICAgICAgIGZpbmFsIGZsb2F0IHhjID0gc2Nyb2xsZWRYRmxvYXQgLSAoZmxvYXQpIHRhcmdldC5tTGVmdDsKLSAgICAgICAgZmluYWwgZmxvYXQgeWMgPSBzY3JvbGxlZFlGbG9hdCAtIChmbG9hdCkgdGFyZ2V0Lm1Ub3A7CiAgICAgICAgIGV2LnNldExvY2F0aW9uKHhjLCB5Yyk7CiAKICAgICAgICAgaWYgKCh0YXJnZXQubVByaXZhdGVGbGFncyAmIENBTkNFTF9ORVhUX1VQX0VWRU5UKSAhPSAwKSB7CkBAIC05MzgsNyArOTg3LDI4OSBAQAogICAgICAgICAgICAgbU1vdGlvblRhcmdldCA9IG51bGw7CiAgICAgICAgIH0KIAotICAgICAgICByZXR1cm4gdGFyZ2V0LmRpc3BhdGNoVG91Y2hFdmVudChldik7CisgICAgICAgIGlmICh0YXJnZXQuZGlzcGF0Y2hUb3VjaEV2ZW50KGV2KSkgeworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBldi5zZXRMb2NhdGlvbih4ZiwgeWYpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGlzIG1ldGhvZCBkZXRlY3RzIHdoZXRoZXIgdGhlIHBvaW50ZXIgbG9jYXRpb24gYXQgPGNvZGU+cG9pbnRlckluZGV4PC9jb2RlPiB3aXRoaW4KKyAgICAgKiA8Y29kZT5ldjwvY29kZT4gaXMgaW5zaWRlIHRoZSBzcGVjaWZpZWQgdmlldy4gSWYgc28sIHRoZSB0cmFuc2Zvcm1lZCBldmVudCBpcyBkaXNwYXRjaGVkIHRvCisgICAgICogPGNvZGU+Y2hpbGQ8L2NvZGU+LgorICAgICAqCisgICAgICogQHBhcmFtIGNoaWxkIFZpZXcgdG8gaGl0IHRlc3QgYWdhaW5zdAorICAgICAqIEBwYXJhbSBldiBNb3Rpb25FdmVudCB0byB0ZXN0CisgICAgICogQHBhcmFtIHBvaW50ZXJJbmRleCBJbmRleCBvZiB0aGUgcG9pbnRlciB3aXRoaW4gPGNvZGU+ZXY8L2NvZGU+IHRvIHRlc3QKKyAgICAgKiBAcmV0dXJuIDxjb2RlPmZhbHNlPC9jb2RlPiBpZiB0aGUgaGl0IHRlc3QgZmFpbGVkLCBvciB0aGUgcmVzdWx0IG9mCisgICAgICogICAgICAgICA8Y29kZT5jaGlsZC5kaXNwYXRjaFRvdWNoRXZlbnQ8L2NvZGU+CisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIGRpc3BhdGNoVG91Y2hFdmVudElmSW5WaWV3KFZpZXcgY2hpbGQsIE1vdGlvbkV2ZW50IGV2LCBpbnQgcG9pbnRlckluZGV4KSB7CisgICAgICAgIGZpbmFsIGZsb2F0IHggPSBldi5nZXRYKHBvaW50ZXJJbmRleCk7CisgICAgICAgIGZpbmFsIGZsb2F0IHkgPSBldi5nZXRZKHBvaW50ZXJJbmRleCk7CisgICAgICAgIGZpbmFsIGZsb2F0IHNjcm9sbGVkWCA9IHggKyBtU2Nyb2xsWDsKKyAgICAgICAgZmluYWwgZmxvYXQgc2Nyb2xsZWRZID0geSArIG1TY3JvbGxZOworICAgICAgICBmbG9hdCBsb2NhbFggPSBzY3JvbGxlZFggLSBjaGlsZC5tTGVmdDsKKyAgICAgICAgZmxvYXQgbG9jYWxZID0gc2Nyb2xsZWRZIC0gY2hpbGQubVRvcDsKKyAgICAgICAgaWYgKCFjaGlsZC5oYXNJZGVudGl0eU1hdHJpeCgpICYmIG1BdHRhY2hJbmZvICE9IG51bGwpIHsKKyAgICAgICAgICAgIC8vIG5vbi1pZGVudGl0eSBtYXRyaXg6IHRyYW5zZm9ybSB0aGUgcG9pbnQgaW50byB0aGUgdmlldydzIGNvb3JkaW5hdGVzCisgICAgICAgICAgICBmaW5hbCBmbG9hdFtdIGxvY2FsWFkgPSBtQXR0YWNoSW5mby5tVG1wVHJhbnNmb3JtTG9jYXRpb247CisgICAgICAgICAgICBsb2NhbFhZWzBdID0gbG9jYWxYOworICAgICAgICAgICAgbG9jYWxYWVsxXSA9IGxvY2FsWTsKKyAgICAgICAgICAgIGNoaWxkLmdldEludmVyc2VNYXRyaXgoKS5tYXBQb2ludHMobG9jYWxYWSk7CisgICAgICAgICAgICBsb2NhbFggPSBsb2NhbFhZWzBdOworICAgICAgICAgICAgbG9jYWxZID0gbG9jYWxYWVsxXTsKKyAgICAgICAgfQorICAgICAgICBpZiAobG9jYWxYID49IDAgJiYgbG9jYWxZID49IDAgJiYgbG9jYWxYIDwgKGNoaWxkLm1SaWdodCAtIGNoaWxkLm1MZWZ0KSAmJgorICAgICAgICAgICAgICAgIGxvY2FsWSA8IChjaGlsZC5tQm90dG9tIC0gY2hpbGQubVRvcCkpIHsKKyAgICAgICAgICAgIC8vIEl0IHdvdWxkIGJlIHNhZmVyIHRvIGNsb25lIHRoZSBldmVudCBoZXJlIGJ1dCB3ZSBkb24ndCBmb3IgcGVyZm9ybWFuY2UuCisgICAgICAgICAgICAvLyBUaGVyZSBhcmUgbWFueSBzdWJ0bGUgaW50ZXJhY3Rpb25zIGluIHRvdWNoIGV2ZW50IGRpc3BhdGNoOyBjaGFuZ2UgYXQgeW91ciBvd24gcmlzay4KKyAgICAgICAgICAgIGNoaWxkLm1Qcml2YXRlRmxhZ3MgJj0gfkNBTkNFTF9ORVhUX1VQX0VWRU5UOworICAgICAgICAgICAgZXYub2Zmc2V0TG9jYXRpb24obG9jYWxYIC0geCwgbG9jYWxZIC0geSk7CisgICAgICAgICAgICBpZiAoY2hpbGQuZGlzcGF0Y2hUb3VjaEV2ZW50KGV2KSkgeworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBldi5vZmZzZXRMb2NhdGlvbih4IC0gbG9jYWxYLCB5IC0gbG9jYWxZKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHByaXZhdGUgYm9vbGVhbiBkaXNwYXRjaFNwbGl0VG91Y2hFdmVudChNb3Rpb25FdmVudCBldikgeworICAgICAgICBmaW5hbCBTcGxpdE1vdGlvblRhcmdldHMgdGFyZ2V0cyA9IG1TcGxpdE1vdGlvblRhcmdldHM7CisgICAgICAgIGZpbmFsIGludCBhY3Rpb24gPSBldi5nZXRBY3Rpb24oKTsKKyAgICAgICAgZmluYWwgaW50IG1hc2tlZEFjdGlvbiA9IGV2LmdldEFjdGlvbk1hc2tlZCgpOworICAgICAgICBmbG9hdCB4ZiA9IGV2LmdldFgoKTsKKyAgICAgICAgZmxvYXQgeWYgPSBldi5nZXRZKCk7CisgICAgICAgIGZsb2F0IHNjcm9sbGVkWEZsb2F0ID0geGYgKyBtU2Nyb2xsWDsKKyAgICAgICAgZmxvYXQgc2Nyb2xsZWRZRmxvYXQgPSB5ZiArIG1TY3JvbGxZOworCisgICAgICAgIGJvb2xlYW4gZGlzYWxsb3dJbnRlcmNlcHQgPSAobUdyb3VwRmxhZ3MgJiBGTEFHX0RJU0FMTE9XX0lOVEVSQ0VQVCkgIT0gMDsKKworICAgICAgICBpZiAobWFza2VkQWN0aW9uID09IE1vdGlvbkV2ZW50LkFDVElPTl9ET1dOIHx8CisgICAgICAgICAgICAgICAgbWFza2VkQWN0aW9uID09IE1vdGlvbkV2ZW50LkFDVElPTl9QT0lOVEVSX0RPV04pIHsKKyAgICAgICAgICAgIGZpbmFsIGludCBhY3Rpb25JbmRleCA9IGV2LmdldEFjdGlvbkluZGV4KCk7CisgICAgICAgICAgICBmaW5hbCBpbnQgYWN0aW9uSWQgPSBldi5nZXRQb2ludGVySWQoYWN0aW9uSW5kZXgpOworCisgICAgICAgICAgICAvLyBDbGVhciBvdXQgYW55IGN1cnJlbnQgdGFyZ2V0IGZvciB0aGlzIElELgorICAgICAgICAgICAgLy8gWFhYOiBXZSBzaG91bGQgcHJvYmFibHkgc2VuZCBhbiBBQ1RJT05fVVAgdG8gdGhlIGN1cnJlbnQKKyAgICAgICAgICAgIC8vIHRhcmdldCBpZiBwcmVzZW50LgorICAgICAgICAgICAgdGFyZ2V0cy5yZW1vdmVCeUlkKGFjdGlvbklkKTsKKworICAgICAgICAgICAgLy8gSWYgd2UncmUgZGlzYWxsb3dpbmcgaW50ZXJjZXB0IG9yIGlmIHdlJ3JlIGFsbG93aW5nIGFuZCB3ZSBkaWRuJ3QKKyAgICAgICAgICAgIC8vIGludGVyY2VwdAorICAgICAgICAgICAgaWYgKGRpc2FsbG93SW50ZXJjZXB0IHx8ICFvbkludGVyY2VwdFRvdWNoRXZlbnQoZXYpKSB7CisgICAgICAgICAgICAgICAgLy8gcmVzZXQgdGhpcyBldmVudCdzIGFjdGlvbiAoanVzdCB0byBwcm90ZWN0IG91cnNlbHZlcykKKyAgICAgICAgICAgICAgICBldi5zZXRBY3Rpb24oYWN0aW9uKTsKKyAgICAgICAgICAgICAgICAvLyBXZSBrbm93IHdlIHdhbnQgdG8gZGlzcGF0Y2ggdGhlIGV2ZW50IGRvd24sIHRyeSB0byBmaW5kIGEgY2hpbGQKKyAgICAgICAgICAgICAgICAvLyB3aG8gY2FuIGhhbmRsZSBpdCwgc3RhcnQgd2l0aCB0aGUgZnJvbnQtbW9zdCBjaGlsZC4KKyAgICAgICAgICAgICAgICBmaW5hbCBsb25nIGRvd25UaW1lID0gZXYuZ2V0RXZlbnRUaW1lKCk7CisgICAgICAgICAgICAgICAgZmluYWwgVmlld1tdIGNoaWxkcmVuID0gbUNoaWxkcmVuOworICAgICAgICAgICAgICAgIGZpbmFsIGludCBjb3VudCA9IG1DaGlsZHJlbkNvdW50OworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSBjb3VudCAtIDE7IGkgPj0gMDsgaS0tKSB7CisgICAgICAgICAgICAgICAgICAgIGZpbmFsIFZpZXcgY2hpbGQgPSBjaGlsZHJlbltpXTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKChjaGlsZC5tVmlld0ZsYWdzICYgVklTSUJJTElUWV9NQVNLKSA9PSBWSVNJQkxFCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgY2hpbGQuZ2V0QW5pbWF0aW9uKCkgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgTW90aW9uRXZlbnQgY2hpbGRFdmVudCA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldHMuZmlsdGVyTW90aW9uRXZlbnRGb3JDaGlsZChldiwgY2hpbGQsIGRvd25UaW1lKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjaGlsZEV2ZW50ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgY2hpbGRBY3Rpb25JbmRleCA9IGNoaWxkRXZlbnQuZmluZFBvaW50ZXJJbmRleChhY3Rpb25JZCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkaXNwYXRjaFRvdWNoRXZlbnRJZkluVmlldyhjaGlsZCwgY2hpbGRFdmVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZEFjdGlvbkluZGV4KSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0cy5hZGQoYWN0aW9uSWQsIGNoaWxkLCBkb3duVGltZSk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGRFdmVudC5yZWN5Y2xlKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLy8gRGlkbid0IGZpbmQgYSBuZXcgdGFyZ2V0LiBEbyB3ZSBoYXZlIGEgInByaW1hcnkiIHRhcmdldCB0byBzZW5kIHRvPworICAgICAgICAgICAgICAgIGZpbmFsIFNwbGl0TW90aW9uVGFyZ2V0cy5UYXJnZXRJbmZvIHByaW1hcnlUYXJnZXRJbmZvID0gdGFyZ2V0cy5nZXRQcmltYXJ5VGFyZ2V0KCk7CisgICAgICAgICAgICAgICAgaWYgKHByaW1hcnlUYXJnZXRJbmZvICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgZmluYWwgVmlldyBwcmltYXJ5VGFyZ2V0ID0gcHJpbWFyeVRhcmdldEluZm8udmlldzsKKyAgICAgICAgICAgICAgICAgICAgZmluYWwgTW90aW9uRXZlbnQgY2hpbGRFdmVudCA9IHRhcmdldHMuZmlsdGVyTW90aW9uRXZlbnRGb3JDaGlsZChldiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmltYXJ5VGFyZ2V0LCBwcmltYXJ5VGFyZ2V0SW5mby5kb3duVGltZSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChjaGlsZEV2ZW50ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ2FsY3VsYXRlIHRoZSBvZmZzZXQgcG9pbnQgaW50byB0aGUgdGFyZ2V0J3MgbG9jYWwgY29vcmRpbmF0ZXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCB4YyA9IHNjcm9sbGVkWEZsb2F0IC0gKGZsb2F0KSBwcmltYXJ5VGFyZ2V0Lm1MZWZ0OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHljID0gc2Nyb2xsZWRZRmxvYXQgLSAoZmxvYXQpIHByaW1hcnlUYXJnZXQubVRvcDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXByaW1hcnlUYXJnZXQuaGFzSWRlbnRpdHlNYXRyaXgoKSAmJiBtQXR0YWNoSW5mbyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5vbi1pZGVudGl0eSBtYXRyaXg6IHRyYW5zZm9ybSB0aGUgcG9pbnQgaW50byB0aGUgdmlldydzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvb3JkaW5hdGVzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIGZsb2F0W10gbG9jYWxYWSA9IG1BdHRhY2hJbmZvLm1UbXBUcmFuc2Zvcm1Mb2NhdGlvbjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jYWxYWVswXSA9IHhjOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhbFhZWzFdID0geWM7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW1hcnlUYXJnZXQuZ2V0SW52ZXJzZU1hdHJpeCgpLm1hcFBvaW50cyhsb2NhbFhZKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeGMgPSBsb2NhbFhZWzBdOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5YyA9IGxvY2FsWFlbMV07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkRXZlbnQuc2V0TG9jYXRpb24oeGMsIHljKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJpbWFyeVRhcmdldC5kaXNwYXRjaFRvdWNoRXZlbnQoY2hpbGRFdmVudCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0cy5hZGQoYWN0aW9uSWQsIHByaW1hcnlUYXJnZXQsIHByaW1hcnlUYXJnZXRJbmZvLmRvd25UaW1lKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZEV2ZW50LnJlY3ljbGUoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGJvb2xlYW4gaXNVcE9yQ2FuY2VsID0gKGFjdGlvbiA9PSBNb3Rpb25FdmVudC5BQ1RJT05fVVApIHx8CisgICAgICAgICAgICAgICAgKGFjdGlvbiA9PSBNb3Rpb25FdmVudC5BQ1RJT05fQ0FOQ0VMKTsKKworICAgICAgICBpZiAoaXNVcE9yQ2FuY2VsKSB7CisgICAgICAgICAgICAvLyBOb3RlLCB3ZSd2ZSBhbHJlYWR5IGNvcGllZCB0aGUgcHJldmlvdXMgc3RhdGUgdG8gb3VyIGxvY2FsCisgICAgICAgICAgICAvLyB2YXJpYWJsZSwgc28gdGhpcyB0YWtlcyBlZmZlY3Qgb24gdGhlIG5leHQgZXZlbnQKKyAgICAgICAgICAgIG1Hcm91cEZsYWdzICY9IH5GTEFHX0RJU0FMTE9XX0lOVEVSQ0VQVDsKKyAgICAgICAgfQorCisgICAgICAgIGlmICh0YXJnZXRzLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgLy8gV2UgZG9uJ3QgaGF2ZSBhbnkgdGFyZ2V0cywgdGhpcyBtZWFucyB3ZSdyZSBoYW5kbGluZyB0aGUKKyAgICAgICAgICAgIC8vIGV2ZW50IGFzIGEgcmVndWxhciB2aWV3LgorICAgICAgICAgICAgZXYuc2V0TG9jYXRpb24oeGYsIHlmKTsKKyAgICAgICAgICAgIGlmICgobVByaXZhdGVGbGFncyAmIENBTkNFTF9ORVhUX1VQX0VWRU5UKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgZXYuc2V0QWN0aW9uKE1vdGlvbkV2ZW50LkFDVElPTl9DQU5DRUwpOworICAgICAgICAgICAgICAgIG1Qcml2YXRlRmxhZ3MgJj0gfkNBTkNFTF9ORVhUX1VQX0VWRU5UOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHN1cGVyLmRpc3BhdGNoVG91Y2hFdmVudChldik7CisgICAgICAgIH0KKworICAgICAgICAvLyBpZiB3ZSBoYXZlIHRhcmdldHMsIHNlZSBpZiB3ZSdyZSBhbGxvd2VkIHRvIGFuZCB3YW50IHRvIGludGVyY2VwdCB0aGVpcgorICAgICAgICAvLyBldmVudHMKKyAgICAgICAgaW50IHVuaXF1ZVRhcmdldENvdW50ID0gdGFyZ2V0cy5nZXRVbmlxdWVUYXJnZXRDb3VudCgpOworICAgICAgICBpZiAoIWRpc2FsbG93SW50ZXJjZXB0ICYmIG9uSW50ZXJjZXB0VG91Y2hFdmVudChldikpIHsKKyAgICAgICAgICAgIG1Qcml2YXRlRmxhZ3MgJj0gfkNBTkNFTF9ORVhUX1VQX0VWRU5UOworCisgICAgICAgICAgICBmb3IgKGludCB1bmlxdWVJbmRleCA9IDA7IHVuaXF1ZUluZGV4IDwgdW5pcXVlVGFyZ2V0Q291bnQ7IHVuaXF1ZUluZGV4KyspIHsKKyAgICAgICAgICAgICAgICBmaW5hbCBWaWV3IHRhcmdldCA9IHRhcmdldHMuZ2V0VW5pcXVlVGFyZ2V0QXQodW5pcXVlSW5kZXgpLnZpZXc7CisKKyAgICAgICAgICAgICAgICAvLyBDYWxjdWxhdGUgdGhlIG9mZnNldCBwb2ludCBpbnRvIHRoZSB0YXJnZXQncyBsb2NhbCBjb29yZGluYXRlcworICAgICAgICAgICAgICAgIGZsb2F0IHhjID0gc2Nyb2xsZWRYRmxvYXQgLSAoZmxvYXQpIHRhcmdldC5tTGVmdDsKKyAgICAgICAgICAgICAgICBmbG9hdCB5YyA9IHNjcm9sbGVkWUZsb2F0IC0gKGZsb2F0KSB0YXJnZXQubVRvcDsKKyAgICAgICAgICAgICAgICBpZiAoIXRhcmdldC5oYXNJZGVudGl0eU1hdHJpeCgpICYmIG1BdHRhY2hJbmZvICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gbm9uLWlkZW50aXR5IG1hdHJpeDogdHJhbnNmb3JtIHRoZSBwb2ludCBpbnRvIHRoZSB2aWV3J3MgY29vcmRpbmF0ZXMKKyAgICAgICAgICAgICAgICAgICAgZmluYWwgZmxvYXRbXSBsb2NhbFhZID0gbUF0dGFjaEluZm8ubVRtcFRyYW5zZm9ybUxvY2F0aW9uOworICAgICAgICAgICAgICAgICAgICBsb2NhbFhZWzBdID0geGM7CisgICAgICAgICAgICAgICAgICAgIGxvY2FsWFlbMV0gPSB5YzsKKyAgICAgICAgICAgICAgICAgICAgdGFyZ2V0LmdldEludmVyc2VNYXRyaXgoKS5tYXBQb2ludHMobG9jYWxYWSk7CisgICAgICAgICAgICAgICAgICAgIHhjID0gbG9jYWxYWVswXTsKKyAgICAgICAgICAgICAgICAgICAgeWMgPSBsb2NhbFhZWzFdOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGV2LnNldEFjdGlvbihNb3Rpb25FdmVudC5BQ1RJT05fQ0FOQ0VMKTsKKyAgICAgICAgICAgICAgICBldi5zZXRMb2NhdGlvbih4YywgeWMpOworICAgICAgICAgICAgICAgIGlmICghdGFyZ2V0LmRpc3BhdGNoVG91Y2hFdmVudChldikpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gdGFyZ2V0IGRpZG4ndCBoYW5kbGUgQUNUSU9OX0NBTkNFTC4gbm90IG11Y2ggd2UgY2FuIGRvCisgICAgICAgICAgICAgICAgICAgIC8vIGJ1dCB0aGV5IHNob3VsZCBoYXZlLgorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRhcmdldHMuY2xlYXIoKTsKKyAgICAgICAgICAgIC8vIERvbid0IGRpc3BhdGNoIHRoaXMgZXZlbnQgdG8gb3VyIG93biB2aWV3LCBiZWNhdXNlIHdlIGFscmVhZHkKKyAgICAgICAgICAgIC8vIHNhdyBpdCB3aGVuIGludGVyY2VwdGluZzsgd2UganVzdCB3YW50IHRvIGdpdmUgdGhlIGZvbGxvd2luZworICAgICAgICAgICAgLy8gZXZlbnQgdG8gdGhlIG5vcm1hbCBvblRvdWNoRXZlbnQoKS4KKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgYm9vbGVhbiBoYW5kbGVkID0gZmFsc2U7CisgICAgICAgIGZvciAoaW50IHVuaXF1ZUluZGV4ID0gMDsgdW5pcXVlSW5kZXggPCB1bmlxdWVUYXJnZXRDb3VudDsgdW5pcXVlSW5kZXgrKykgeworICAgICAgICAgICAgZmluYWwgU3BsaXRNb3Rpb25UYXJnZXRzLlRhcmdldEluZm8gdGFyZ2V0SW5mbyA9IHRhcmdldHMuZ2V0VW5pcXVlVGFyZ2V0QXQodW5pcXVlSW5kZXgpOworICAgICAgICAgICAgZmluYWwgVmlldyB0YXJnZXQgPSB0YXJnZXRJbmZvLnZpZXc7CisKKyAgICAgICAgICAgIGZpbmFsIE1vdGlvbkV2ZW50IHRhcmdldEV2ZW50ID0KKyAgICAgICAgICAgICAgICAgICAgdGFyZ2V0cy5maWx0ZXJNb3Rpb25FdmVudEZvckNoaWxkKGV2LCB0YXJnZXQsIHRhcmdldEluZm8uZG93blRpbWUpOworICAgICAgICAgICAgaWYgKHRhcmdldEV2ZW50ID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAvLyBDYWxjdWxhdGUgdGhlIG9mZnNldCBwb2ludCBpbnRvIHRoZSB0YXJnZXQncyBsb2NhbCBjb29yZGluYXRlcworICAgICAgICAgICAgICAgIHhmID0gdGFyZ2V0RXZlbnQuZ2V0WCgpOworICAgICAgICAgICAgICAgIHlmID0gdGFyZ2V0RXZlbnQuZ2V0WSgpOworICAgICAgICAgICAgICAgIHNjcm9sbGVkWEZsb2F0ID0geGYgKyBtU2Nyb2xsWDsKKyAgICAgICAgICAgICAgICBzY3JvbGxlZFlGbG9hdCA9IHlmICsgbVNjcm9sbFk7CisgICAgICAgICAgICAgICAgZmxvYXQgeGMgPSBzY3JvbGxlZFhGbG9hdCAtIChmbG9hdCkgdGFyZ2V0Lm1MZWZ0OworICAgICAgICAgICAgICAgIGZsb2F0IHljID0gc2Nyb2xsZWRZRmxvYXQgLSAoZmxvYXQpIHRhcmdldC5tVG9wOworICAgICAgICAgICAgICAgIGlmICghdGFyZ2V0Lmhhc0lkZW50aXR5TWF0cml4KCkgJiYgbUF0dGFjaEluZm8gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAvLyBub24taWRlbnRpdHkgbWF0cml4OiB0cmFuc2Zvcm0gdGhlIHBvaW50IGludG8gdGhlIHZpZXcncyBjb29yZGluYXRlcworICAgICAgICAgICAgICAgICAgICBmaW5hbCBmbG9hdFtdIGxvY2FsWFkgPSBtQXR0YWNoSW5mby5tVG1wVHJhbnNmb3JtTG9jYXRpb247CisgICAgICAgICAgICAgICAgICAgIGxvY2FsWFlbMF0gPSB4YzsKKyAgICAgICAgICAgICAgICAgICAgbG9jYWxYWVsxXSA9IHljOworICAgICAgICAgICAgICAgICAgICB0YXJnZXQuZ2V0SW52ZXJzZU1hdHJpeCgpLm1hcFBvaW50cyhsb2NhbFhZKTsKKyAgICAgICAgICAgICAgICAgICAgeGMgPSBsb2NhbFhZWzBdOworICAgICAgICAgICAgICAgICAgICB5YyA9IGxvY2FsWFlbMV07CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLy8gZmluYWxseSBvZmZzZXQgdGhlIGV2ZW50IHRvIHRoZSB0YXJnZXQncyBjb29yZGluYXRlIHN5c3RlbSBhbmQKKyAgICAgICAgICAgICAgICAvLyBkaXNwYXRjaCB0aGUgZXZlbnQuCisgICAgICAgICAgICAgICAgdGFyZ2V0RXZlbnQuc2V0TG9jYXRpb24oeGMsIHljKTsKKworICAgICAgICAgICAgICAgIGlmICgodGFyZ2V0Lm1Qcml2YXRlRmxhZ3MgJiBDQU5DRUxfTkVYVF9VUF9FVkVOVCkgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICB0YXJnZXRFdmVudC5zZXRBY3Rpb24oTW90aW9uRXZlbnQuQUNUSU9OX0NBTkNFTCk7CisgICAgICAgICAgICAgICAgICAgIHRhcmdldC5tUHJpdmF0ZUZsYWdzICY9IH5DQU5DRUxfTkVYVF9VUF9FVkVOVDsKKyAgICAgICAgICAgICAgICAgICAgdGFyZ2V0cy5yZW1vdmVWaWV3KHRhcmdldCk7CisgICAgICAgICAgICAgICAgICAgIHVuaXF1ZUluZGV4LS07CisgICAgICAgICAgICAgICAgICAgIHVuaXF1ZVRhcmdldENvdW50LS07CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaGFuZGxlZCB8PSB0YXJnZXQuZGlzcGF0Y2hUb3VjaEV2ZW50KHRhcmdldEV2ZW50KTsKKyAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgdGFyZ2V0RXZlbnQucmVjeWNsZSgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKG1hc2tlZEFjdGlvbiA9PSBNb3Rpb25FdmVudC5BQ1RJT05fUE9JTlRFUl9VUCkgeworICAgICAgICAgICAgZmluYWwgaW50IHJlbW92ZUlkID0gZXYuZ2V0UG9pbnRlcklkKGV2LmdldEFjdGlvbkluZGV4KCkpOworICAgICAgICAgICAgdGFyZ2V0cy5yZW1vdmVCeUlkKHJlbW92ZUlkKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChpc1VwT3JDYW5jZWwpIHsKKyAgICAgICAgICAgIHRhcmdldHMuY2xlYXIoKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBoYW5kbGVkOworICAgIH0KKworICAgIC8qKgorICAgICAqIEVuYWJsZSBvciBkaXNhYmxlIHRoZSBzcGxpdHRpbmcgb2YgTW90aW9uRXZlbnRzIHRvIG11bHRpcGxlIGNoaWxkcmVuIGR1cmluZyB0b3VjaCBldmVudAorICAgICAqIGRpc3BhdGNoLiBUaGlzIGJlaGF2aW9yIGlzIGRpc2FibGVkIGJ5IGRlZmF1bHQuCisgICAgICoKKyAgICAgKiA8cD5XaGVuIHRoaXMgb3B0aW9uIGlzIGVuYWJsZWQgTW90aW9uRXZlbnRzIG1heSBiZSBzcGxpdCBhbmQgZGlzcGF0Y2hlZCB0byBkaWZmZXJlbnQgY2hpbGQKKyAgICAgKiB2aWV3cyBkZXBlbmRpbmcgb24gd2hlcmUgZWFjaCBwb2ludGVyIGluaXRpYWxseSB3ZW50IGRvd24uIFRoaXMgYWxsb3dzIGZvciB1c2VyIGludGVyYWN0aW9ucworICAgICAqIHN1Y2ggYXMgc2Nyb2xsaW5nIHR3byBwYW5lcyBvZiBjb250ZW50IGluZGVwZW5kZW50bHksIGNob3JkaW5nIG9mIGJ1dHRvbnMsIGFuZCBwZXJmb3JtaW5nCisgICAgICogaW5kZXBlbmRlbnQgZ2VzdHVyZXMgb24gZGlmZmVyZW50IHBpZWNlcyBvZiBjb250ZW50LgorICAgICAqCisgICAgICogQHBhcmFtIHNwbGl0IDxjb2RlPnRydWU8L2NvZGU+IHRvIGFsbG93IE1vdGlvbkV2ZW50cyB0byBiZSBzcGxpdCBhbmQgZGlzcGF0Y2hlZCB0byBtdWx0aXBsZQorICAgICAqICAgICAgICAgICAgICBjaGlsZCB2aWV3cy4gPGNvZGU+ZmFsc2U8L2NvZGU+IHRvIG9ubHkgYWxsb3cgb25lIGNoaWxkIHZpZXcgdG8gYmUgdGhlIHRhcmdldCBvZgorICAgICAqICAgICAgICAgICAgICBhbnkgTW90aW9uRXZlbnQgcmVjZWl2ZWQgYnkgdGhpcyBWaWV3R3JvdXAuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0TW90aW9uRXZlbnRTcGxpdHRpbmdFbmFibGVkKGJvb2xlYW4gc3BsaXQpIHsKKyAgICAgICAgLy8gVE9ETyBBcHBsaWNhdGlvbnMgcmVhbGx5IHNob3VsZG4ndCBjaGFuZ2UgdGhpcyBzZXR0aW5nIG1pZC10b3VjaCBldmVudCwKKyAgICAgICAgLy8gYnV0IHBlcmhhcHMgdGhpcyBzaG91bGQgaGFuZGxlIHRoYXQgY2FzZSBhbmQgc2VuZCBBQ1RJT05fQ0FOQ0VMcyB0byBhbnkgY2hpbGQgdmlld3MKKyAgICAgICAgLy8gd2l0aCBnZXN0dXJlcyBpbiBwcm9ncmVzcyB3aGVuIHRoaXMgaXMgY2hhbmdlZC4KKyAgICAgICAgaWYgKHNwbGl0KSB7CisgICAgICAgICAgICBtR3JvdXBGbGFncyB8PSBGTEFHX1NQTElUX01PVElPTl9FVkVOVFM7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtR3JvdXBGbGFncyAmPSB+RkxBR19TUExJVF9NT1RJT05fRVZFTlRTOworICAgICAgICAgICAgbVNwbGl0TW90aW9uVGFyZ2V0cyA9IG51bGw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgTW90aW9uRXZlbnRzIGRpc3BhdGNoZWQgdG8gdGhpcyBWaWV3R3JvdXAgY2FuIGJlIHNwbGl0IHRvIG11bHRpcGxlIGNoaWxkcmVuLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzTW90aW9uRXZlbnRTcGxpdHRpbmdFbmFibGVkKCkgeworICAgICAgICByZXR1cm4gKG1Hcm91cEZsYWdzICYgRkxBR19TUExJVF9NT1RJT05fRVZFTlRTKSA9PSBGTEFHX1NQTElUX01PVElPTl9FVkVOVFM7CiAgICAgfQogCiAgICAgLyoqCkBAIC0xMTg2LDcgKzE1MTcsMTAgQEAKICAgICAgICAgZmluYWwgaW50IGNvdW50ID0gbUNoaWxkcmVuQ291bnQ7CiAgICAgICAgIGZpbmFsIFZpZXdbXSBjaGlsZHJlbiA9IG1DaGlsZHJlbjsKICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7Ci0gICAgICAgICAgICBjaGlsZHJlbltpXS5kaXNwYXRjaFNhdmVJbnN0YW5jZVN0YXRlKGNvbnRhaW5lcik7CisgICAgICAgICAgICBWaWV3IGMgPSBjaGlsZHJlbltpXTsKKyAgICAgICAgICAgIGlmICgoYy5tVmlld0ZsYWdzICYgUEFSRU5UX1NBVkVfRElTQUJMRURfTUFTSykgIT0gUEFSRU5UX1NBVkVfRElTQUJMRUQpIHsKKyAgICAgICAgICAgICAgICBjLmRpc3BhdGNoU2F2ZUluc3RhbmNlU3RhdGUoY29udGFpbmVyKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KIApAQCAtMTIxMSw3ICsxNTQ1LDEwIEBACiAgICAgICAgIGZpbmFsIGludCBjb3VudCA9IG1DaGlsZHJlbkNvdW50OwogICAgICAgICBmaW5hbCBWaWV3W10gY2hpbGRyZW4gPSBtQ2hpbGRyZW47CiAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewotICAgICAgICAgICAgY2hpbGRyZW5baV0uZGlzcGF0Y2hSZXN0b3JlSW5zdGFuY2VTdGF0ZShjb250YWluZXIpOworICAgICAgICAgICAgVmlldyBjID0gY2hpbGRyZW5baV07CisgICAgICAgICAgICBpZiAoKGMubVZpZXdGbGFncyAmIFBBUkVOVF9TQVZFX0RJU0FCTEVEX01BU0spICE9IFBBUkVOVF9TQVZFX0RJU0FCTEVEKSB7CisgICAgICAgICAgICAgICAgYy5kaXNwYXRjaFJlc3RvcmVJbnN0YW5jZVN0YXRlKGNvbnRhaW5lcik7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTE0ODEsMjIgKzE4MTgsMjUgQEAKICAgICAgICAgZmluYWwgaW50IGZsYWdzID0gbUdyb3VwRmxhZ3M7CiAKICAgICAgICAgaWYgKChmbGFncyAmIEZMQUdfQ0xFQVJfVFJBTlNGT1JNQVRJT04pID09IEZMQUdfQ0xFQVJfVFJBTlNGT1JNQVRJT04pIHsKLSAgICAgICAgICAgIGlmIChtQ2hpbGRUcmFuc2Zvcm1hdGlvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbUNoaWxkVHJhbnNmb3JtYXRpb24uY2xlYXIoKTsKLSAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1DaGlsZFRyYW5zZm9ybWF0aW9uLmNsZWFyKCk7CiAgICAgICAgICAgICBtR3JvdXBGbGFncyAmPSB+RkxBR19DTEVBUl9UUkFOU0ZPUk1BVElPTjsKICAgICAgICAgfQogCiAgICAgICAgIFRyYW5zZm9ybWF0aW9uIHRyYW5zZm9ybVRvQXBwbHkgPSBudWxsOworICAgICAgICBUcmFuc2Zvcm1hdGlvbiBpbnZhbGlkYXRpb25UcmFuc2Zvcm07CiAgICAgICAgIGZpbmFsIEFuaW1hdGlvbiBhID0gY2hpbGQuZ2V0QW5pbWF0aW9uKCk7CiAgICAgICAgIGJvb2xlYW4gY29uY2F0TWF0cml4ID0gZmFsc2U7CiAKLSAgICAgICAgaWYgKGEgIT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKG1JbnZhbGlkYXRlUmVnaW9uID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtSW52YWxpZGF0ZVJlZ2lvbiA9IG5ldyBSZWN0RigpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZmluYWwgUmVjdEYgcmVnaW9uID0gbUludmFsaWRhdGVSZWdpb247CisgICAgICAgIGJvb2xlYW4gc2NhbGluZ1JlcXVpcmVkID0gZmFsc2U7CisgICAgICAgIGJvb2xlYW4gY2FjaGluZyA9IGZhbHNlOworICAgICAgICBpZiAoIWNhbnZhcy5pc0hhcmR3YXJlQWNjZWxlcmF0ZWQoKSAmJgorICAgICAgICAgICAgICAgIChmbGFncyAmIEZMQUdfQ0hJTERSRU5fRFJBV05fV0lUSF9DQUNIRSkgPT0gRkxBR19DSElMRFJFTl9EUkFXTl9XSVRIX0NBQ0hFIHx8CisgICAgICAgICAgICAgICAgKGZsYWdzICYgRkxBR19BTFdBWVNfRFJBV05fV0lUSF9DQUNIRSkgPT0gRkxBR19BTFdBWVNfRFJBV05fV0lUSF9DQUNIRSkgeworICAgICAgICAgICAgY2FjaGluZyA9IHRydWU7CisgICAgICAgICAgICBpZiAobUF0dGFjaEluZm8gIT0gbnVsbCkgc2NhbGluZ1JlcXVpcmVkID0gbUF0dGFjaEluZm8ubVNjYWxpbmdSZXF1aXJlZDsKKyAgICAgICAgfQogCisgICAgICAgIGlmIChhICE9IG51bGwpIHsKICAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gaW5pdGlhbGl6ZWQgPSBhLmlzSW5pdGlhbGl6ZWQoKTsKICAgICAgICAgICAgIGlmICghaW5pdGlhbGl6ZWQpIHsKICAgICAgICAgICAgICAgICBhLmluaXRpYWxpemUoY3IgLSBjbCwgY2IgLSBjdCwgZ2V0V2lkdGgoKSwgZ2V0SGVpZ2h0KCkpOwpAQCAtMTUwNCwxMCArMTg0NCwxNyBAQAogICAgICAgICAgICAgICAgIGNoaWxkLm9uQW5pbWF0aW9uU3RhcnQoKTsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgaWYgKG1DaGlsZFRyYW5zZm9ybWF0aW9uID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtQ2hpbGRUcmFuc2Zvcm1hdGlvbiA9IG5ldyBUcmFuc2Zvcm1hdGlvbigpOworICAgICAgICAgICAgbW9yZSA9IGEuZ2V0VHJhbnNmb3JtYXRpb24oZHJhd2luZ1RpbWUsIG1DaGlsZFRyYW5zZm9ybWF0aW9uLAorICAgICAgICAgICAgICAgICAgICBzY2FsaW5nUmVxdWlyZWQgPyBtQXR0YWNoSW5mby5tQXBwbGljYXRpb25TY2FsZSA6IDFmKTsKKyAgICAgICAgICAgIGlmIChzY2FsaW5nUmVxdWlyZWQgJiYgbUF0dGFjaEluZm8ubUFwcGxpY2F0aW9uU2NhbGUgIT0gMWYpIHsKKyAgICAgICAgICAgICAgICBpZiAobUludmFsaWRhdGlvblRyYW5zZm9ybWF0aW9uID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgbUludmFsaWRhdGlvblRyYW5zZm9ybWF0aW9uID0gbmV3IFRyYW5zZm9ybWF0aW9uKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGludmFsaWRhdGlvblRyYW5zZm9ybSA9IG1JbnZhbGlkYXRpb25UcmFuc2Zvcm1hdGlvbjsKKyAgICAgICAgICAgICAgICBhLmdldFRyYW5zZm9ybWF0aW9uKGRyYXdpbmdUaW1lLCBpbnZhbGlkYXRpb25UcmFuc2Zvcm0sIDFmKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaW52YWxpZGF0aW9uVHJhbnNmb3JtID0gbUNoaWxkVHJhbnNmb3JtYXRpb247CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBtb3JlID0gYS5nZXRUcmFuc2Zvcm1hdGlvbihkcmF3aW5nVGltZSwgbUNoaWxkVHJhbnNmb3JtYXRpb24pOwogICAgICAgICAgICAgdHJhbnNmb3JtVG9BcHBseSA9IG1DaGlsZFRyYW5zZm9ybWF0aW9uOwogCiAgICAgICAgICAgICBjb25jYXRNYXRyaXggPSBhLndpbGxDaGFuZ2VUcmFuc2Zvcm1hdGlvbk1hdHJpeCgpOwpAQCAtMTUyNCw3ICsxODcxLDExIEBACiAgICAgICAgICAgICAgICAgICAgICAgICBpbnZhbGlkYXRlKGNsLCBjdCwgY3IsIGNiKTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGEuZ2V0SW52YWxpZGF0ZVJlZ2lvbigwLCAwLCBjciAtIGNsLCBjYiAtIGN0LCByZWdpb24sIHRyYW5zZm9ybVRvQXBwbHkpOworICAgICAgICAgICAgICAgICAgICBpZiAobUludmFsaWRhdGVSZWdpb24gPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgbUludmFsaWRhdGVSZWdpb24gPSBuZXcgUmVjdEYoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBmaW5hbCBSZWN0RiByZWdpb24gPSBtSW52YWxpZGF0ZVJlZ2lvbjsKKyAgICAgICAgICAgICAgICAgICAgYS5nZXRJbnZhbGlkYXRlUmVnaW9uKDAsIDAsIGNyIC0gY2wsIGNiIC0gY3QsIHJlZ2lvbiwgaW52YWxpZGF0aW9uVHJhbnNmb3JtKTsKIAogICAgICAgICAgICAgICAgICAgICAvLyBUaGUgY2hpbGQgbmVlZCB0byBkcmF3IGFuIGFuaW1hdGlvbiwgcG90ZW50aWFsbHkgb2Zmc2NyZWVuLCBzbwogICAgICAgICAgICAgICAgICAgICAvLyBtYWtlIHN1cmUgd2UgZG8gbm90IGNhbmNlbCBpbnZhbGlkYXRlIHJlcXVlc3RzCkBAIC0xNTM3LDkgKzE4ODgsNiBAQAogICAgICAgICAgICAgfQogICAgICAgICB9IGVsc2UgaWYgKChmbGFncyAmIEZMQUdfU1VQUE9SVF9TVEFUSUNfVFJBTlNGT1JNQVRJT05TKSA9PQogICAgICAgICAgICAgICAgIEZMQUdfU1VQUE9SVF9TVEFUSUNfVFJBTlNGT1JNQVRJT05TKSB7Ci0gICAgICAgICAgICBpZiAobUNoaWxkVHJhbnNmb3JtYXRpb24gPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1DaGlsZFRyYW5zZm9ybWF0aW9uID0gbmV3IFRyYW5zZm9ybWF0aW9uKCk7Ci0gICAgICAgICAgICB9CiAgICAgICAgICAgICBmaW5hbCBib29sZWFuIGhhc1RyYW5zZm9ybSA9IGdldENoaWxkU3RhdGljVHJhbnNmb3JtYXRpb24oY2hpbGQsIG1DaGlsZFRyYW5zZm9ybWF0aW9uKTsKICAgICAgICAgICAgIGlmIChoYXNUcmFuc2Zvcm0pIHsKICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgdHJhbnNmb3JtVHlwZSA9IG1DaGlsZFRyYW5zZm9ybWF0aW9uLmdldFRyYW5zZm9ybWF0aW9uVHlwZSgpOwpAQCAtMTU0OSw2ICsxODk3LDggQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCisgICAgICAgIGNvbmNhdE1hdHJpeCB8PSAhY2hpbGQuaGFzSWRlbnRpdHlNYXRyaXgoKTsKKwogICAgICAgICAvLyBTZXRzIHRoZSBmbGFnIGFzIGVhcmx5IGFzIHBvc3NpYmxlIHRvIGFsbG93IGRyYXcoKSBpbXBsZW1lbnRhdGlvbnMKICAgICAgICAgLy8gdG8gY2FsbCBpbnZhbGlkYXRlKCkgc3VjY2Vzc2Z1bGx5IHdoZW4gZG9pbmcgYW5pbWF0aW9ucwogICAgICAgICBjaGlsZC5tUHJpdmF0ZUZsYWdzIHw9IERSQVdOOwpAQCAtMTU2MywxMiArMTkxMyw5IEBACiAgICAgICAgIGZpbmFsIGludCBzeCA9IGNoaWxkLm1TY3JvbGxYOwogICAgICAgICBmaW5hbCBpbnQgc3kgPSBjaGlsZC5tU2Nyb2xsWTsKIAotICAgICAgICBib29sZWFuIHNjYWxpbmdSZXF1aXJlZCA9IGZhbHNlOwogICAgICAgICBCaXRtYXAgY2FjaGUgPSBudWxsOwotICAgICAgICBpZiAoKGZsYWdzICYgRkxBR19DSElMRFJFTl9EUkFXTl9XSVRIX0NBQ0hFKSA9PSBGTEFHX0NISUxEUkVOX0RSQVdOX1dJVEhfQ0FDSEUgfHwKLSAgICAgICAgICAgICAgICAoZmxhZ3MgJiBGTEFHX0FMV0FZU19EUkFXTl9XSVRIX0NBQ0hFKSA9PSBGTEFHX0FMV0FZU19EUkFXTl9XSVRIX0NBQ0hFKSB7CisgICAgICAgIGlmIChjYWNoaW5nKSB7CiAgICAgICAgICAgICBjYWNoZSA9IGNoaWxkLmdldERyYXdpbmdDYWNoZSh0cnVlKTsKLSAgICAgICAgICAgIGlmIChtQXR0YWNoSW5mbyAhPSBudWxsKSBzY2FsaW5nUmVxdWlyZWQgPSBtQXR0YWNoSW5mby5tU2NhbGluZ1JlcXVpcmVkOwogICAgICAgICB9CiAKICAgICAgICAgZmluYWwgYm9vbGVhbiBoYXNOb0NhY2hlID0gY2FjaGUgPT0gbnVsbDsKQEAgLTE1ODUsNDAgKzE5MzIsNTYgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCi0gICAgICAgIGZsb2F0IGFscGhhID0gMS4wZjsKKyAgICAgICAgZmxvYXQgYWxwaGEgPSBjaGlsZC5nZXRBbHBoYSgpOwogCi0gICAgICAgIGlmICh0cmFuc2Zvcm1Ub0FwcGx5ICE9IG51bGwpIHsKLSAgICAgICAgICAgIGlmIChjb25jYXRNYXRyaXgpIHsKLSAgICAgICAgICAgICAgICBpbnQgdHJhbnNYID0gMDsKLSAgICAgICAgICAgICAgICBpbnQgdHJhbnNZID0gMDsKLSAgICAgICAgICAgICAgICBpZiAoaGFzTm9DYWNoZSkgewotICAgICAgICAgICAgICAgICAgICB0cmFuc1ggPSAtc3g7Ci0gICAgICAgICAgICAgICAgICAgIHRyYW5zWSA9IC1zeTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgLy8gVW5kbyB0aGUgc2Nyb2xsIHRyYW5zbGF0aW9uLCBhcHBseSB0aGUgdHJhbnNmb3JtYXRpb24gbWF0cml4LAotICAgICAgICAgICAgICAgIC8vIHRoZW4gcmVkbyB0aGUgc2Nyb2xsIHRyYW5zbGF0ZSB0byBnZXQgdGhlIGNvcnJlY3QgcmVzdWx0LgotICAgICAgICAgICAgICAgIGNhbnZhcy50cmFuc2xhdGUoLXRyYW5zWCwgLXRyYW5zWSk7Ci0gICAgICAgICAgICAgICAgY2FudmFzLmNvbmNhdCh0cmFuc2Zvcm1Ub0FwcGx5LmdldE1hdHJpeCgpKTsKLSAgICAgICAgICAgICAgICBjYW52YXMudHJhbnNsYXRlKHRyYW5zWCwgdHJhbnNZKTsKLSAgICAgICAgICAgICAgICBtR3JvdXBGbGFncyB8PSBGTEFHX0NMRUFSX1RSQU5TRk9STUFUSU9OOworICAgICAgICBpZiAodHJhbnNmb3JtVG9BcHBseSAhPSBudWxsIHx8IGFscGhhIDwgMS4wZiB8fCAhY2hpbGQuaGFzSWRlbnRpdHlNYXRyaXgoKSkgeworICAgICAgICAgICAgaW50IHRyYW5zWCA9IDA7CisgICAgICAgICAgICBpbnQgdHJhbnNZID0gMDsKKworICAgICAgICAgICAgaWYgKGhhc05vQ2FjaGUpIHsKKyAgICAgICAgICAgICAgICB0cmFuc1ggPSAtc3g7CisgICAgICAgICAgICAgICAgdHJhbnNZID0gLXN5OwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBhbHBoYSA9IHRyYW5zZm9ybVRvQXBwbHkuZ2V0QWxwaGEoKTsKKyAgICAgICAgICAgIGlmICh0cmFuc2Zvcm1Ub0FwcGx5ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBpZiAoY29uY2F0TWF0cml4KSB7CisgICAgICAgICAgICAgICAgICAgIC8vIFVuZG8gdGhlIHNjcm9sbCB0cmFuc2xhdGlvbiwgYXBwbHkgdGhlIHRyYW5zZm9ybWF0aW9uIG1hdHJpeCwKKyAgICAgICAgICAgICAgICAgICAgLy8gdGhlbiByZWRvIHRoZSBzY3JvbGwgdHJhbnNsYXRlIHRvIGdldCB0aGUgY29ycmVjdCByZXN1bHQuCisgICAgICAgICAgICAgICAgICAgIGNhbnZhcy50cmFuc2xhdGUoLXRyYW5zWCwgLXRyYW5zWSk7CisgICAgICAgICAgICAgICAgICAgIGNhbnZhcy5jb25jYXQodHJhbnNmb3JtVG9BcHBseS5nZXRNYXRyaXgoKSk7CisgICAgICAgICAgICAgICAgICAgIGNhbnZhcy50cmFuc2xhdGUodHJhbnNYLCB0cmFuc1kpOworICAgICAgICAgICAgICAgICAgICBtR3JvdXBGbGFncyB8PSBGTEFHX0NMRUFSX1RSQU5TRk9STUFUSU9OOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZsb2F0IHRyYW5zZm9ybUFscGhhID0gdHJhbnNmb3JtVG9BcHBseS5nZXRBbHBoYSgpOworICAgICAgICAgICAgICAgIGlmICh0cmFuc2Zvcm1BbHBoYSA8IDEuMGYpIHsKKyAgICAgICAgICAgICAgICAgICAgYWxwaGEgKj0gdHJhbnNmb3JtVG9BcHBseS5nZXRBbHBoYSgpOworICAgICAgICAgICAgICAgICAgICBtR3JvdXBGbGFncyB8PSBGTEFHX0NMRUFSX1RSQU5TRk9STUFUSU9OOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCFjaGlsZC5oYXNJZGVudGl0eU1hdHJpeCgpKSB7CisgICAgICAgICAgICAgICAgY2FudmFzLnRyYW5zbGF0ZSgtdHJhbnNYLCAtdHJhbnNZKTsKKyAgICAgICAgICAgICAgICBjYW52YXMuY29uY2F0KGNoaWxkLmdldE1hdHJpeCgpKTsKKyAgICAgICAgICAgICAgICBjYW52YXMudHJhbnNsYXRlKHRyYW5zWCwgdHJhbnNZKTsKKyAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgaWYgKGFscGhhIDwgMS4wZikgewogICAgICAgICAgICAgICAgIG1Hcm91cEZsYWdzIHw9IEZMQUdfQ0xFQVJfVFJBTlNGT1JNQVRJT047Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChhbHBoYSA8IDEuMGYgJiYgaGFzTm9DYWNoZSkgewotICAgICAgICAgICAgICAgIGZpbmFsIGludCBtdWx0aXBsaWVkQWxwaGEgPSAoaW50KSAoMjU1ICogYWxwaGEpOwotICAgICAgICAgICAgICAgIGlmICghY2hpbGQub25TZXRBbHBoYShtdWx0aXBsaWVkQWxwaGEpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNhbnZhcy5zYXZlTGF5ZXJBbHBoYShzeCwgc3ksIHN4ICsgY3IgLSBjbCwgc3kgKyBjYiAtIGN0LCBtdWx0aXBsaWVkQWxwaGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2FudmFzLkhBU19BTFBIQV9MQVlFUl9TQVZFX0ZMQUcgfCBDYW52YXMuQ0xJUF9UT19MQVlFUl9TQVZFX0ZMQUcpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGNoaWxkLm1Qcml2YXRlRmxhZ3MgfD0gQUxQSEFfU0VUOworICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgaWYgKGhhc05vQ2FjaGUpIHsKKyAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IG11bHRpcGxpZWRBbHBoYSA9IChpbnQpICgyNTUgKiBhbHBoYSk7CisgICAgICAgICAgICAgICAgICAgIGlmICghY2hpbGQub25TZXRBbHBoYShtdWx0aXBsaWVkQWxwaGEpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYW52YXMuc2F2ZUxheWVyQWxwaGEoc3gsIHN5LCBzeCArIGNyIC0gY2wsIHN5ICsgY2IgLSBjdCwgbXVsdGlwbGllZEFscGhhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDYW52YXMuSEFTX0FMUEhBX0xBWUVSX1NBVkVfRkxBRyB8IENhbnZhcy5DTElQX1RPX0xBWUVSX1NBVkVfRkxBRyk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZC5tUHJpdmF0ZUZsYWdzIHw9IEFMUEhBX1NFVDsKKyAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgfSBlbHNlIGlmICgoY2hpbGQubVByaXZhdGVGbGFncyAmIEFMUEhBX1NFVCkgPT0gQUxQSEFfU0VUKSB7CiAgICAgICAgICAgICBjaGlsZC5vblNldEFscGhhKDI1NSk7CisgICAgICAgICAgICBjaGlsZC5tUHJpdmF0ZUZsYWdzICY9IH5BTFBIQV9TRVQ7CiAgICAgICAgIH0KIAogICAgICAgICBpZiAoKGZsYWdzICYgRkxBR19DTElQX0NISUxEUkVOKSA9PSBGTEFHX0NMSVBfQ0hJTERSRU4pIHsKQEAgLTE2NTMsOSArMjAxNiw2IEBACiAgICAgICAgICAgICAgICAgY2FjaGVQYWludC5zZXRBbHBoYSgyNTUpOwogICAgICAgICAgICAgICAgIG1Hcm91cEZsYWdzICY9IH5GTEFHX0FMUEhBX0xPV0VSX1RIQU5fT05FOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKENvbmZpZy5ERUJVRyAmJiBWaWV3RGVidWcucHJvZmlsZURyYXdpbmcpIHsKLSAgICAgICAgICAgICAgICBFdmVudExvZy53cml0ZUV2ZW50KDYwMDAzLCBoYXNoQ29kZSgpKTsKLSAgICAgICAgICAgIH0KICAgICAgICAgICAgIGNhbnZhcy5kcmF3Qml0bWFwKGNhY2hlLCAwLjBmLCAwLjBmLCBjYWNoZVBhaW50KTsKICAgICAgICAgfQogCkBAIC0xNzAxLDEwICsyMDYxLDI0IEBACiAgICAgICAgIGZpbmFsIFZpZXdbXSBjaGlsZHJlbiA9IG1DaGlsZHJlbjsKICAgICAgICAgZmluYWwgaW50IGNvdW50ID0gbUNoaWxkcmVuQ291bnQ7CiAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeworICAgICAgICAgICAgCiAgICAgICAgICAgICBjaGlsZHJlbltpXS5zZXRTZWxlY3RlZChzZWxlY3RlZCk7CiAgICAgICAgIH0KICAgICB9CiAKKyAgICAvKioKKyAgICAgKiB7QGluaGVyaXREb2N9CisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgZGlzcGF0Y2hTZXRBY3RpdmF0ZWQoYm9vbGVhbiBhY3RpdmF0ZWQpIHsKKyAgICAgICAgZmluYWwgVmlld1tdIGNoaWxkcmVuID0gbUNoaWxkcmVuOworICAgICAgICBmaW5hbCBpbnQgY291bnQgPSBtQ2hpbGRyZW5Db3VudDsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisKKyAgICAgICAgICAgIGNoaWxkcmVuW2ldLnNldEFjdGl2YXRlZChhY3RpdmF0ZWQpOworICAgICAgICB9CisgICAgfQorCiAgICAgQE92ZXJyaWRlCiAgICAgcHJvdGVjdGVkIHZvaWQgZGlzcGF0Y2hTZXRQcmVzc2VkKGJvb2xlYW4gcHJlc3NlZCkgewogICAgICAgICBmaW5hbCBWaWV3W10gY2hpbGRyZW4gPSBtQ2hpbGRyZW47CkBAIC0xOTc2LDYgKzIzNTAsMTAgQEAKICAgICAgICAgICAgICAgICAgICAgIllvdSBtdXN0IGNhbGwgcmVtb3ZlVmlldygpIG9uIHRoZSBjaGlsZCdzIHBhcmVudCBmaXJzdC4iKTsKICAgICAgICAgfQogCisgICAgICAgIGlmIChtVHJhbnNpdGlvbiAhPSBudWxsKSB7CisgICAgICAgICAgICBtVHJhbnNpdGlvbi5jaGlsZEFkZCh0aGlzLCBjaGlsZCk7CisgICAgICAgIH0KKwogICAgICAgICBpZiAoIWNoZWNrTGF5b3V0UGFyYW1zKHBhcmFtcykpIHsKICAgICAgICAgICAgIHBhcmFtcyA9IGdlbmVyYXRlTGF5b3V0UGFyYW1zKHBhcmFtcyk7CiAgICAgICAgIH0KQEAgLTIwNTMsNyArMjQzMSw5IEBACiAgICAgLy8gVGhpcyBtZXRob2QgYWxzbyBzZXRzIHRoZSBjaGlsZCdzIG1QYXJlbnQgdG8gbnVsbAogICAgIHByaXZhdGUgdm9pZCByZW1vdmVGcm9tQXJyYXkoaW50IGluZGV4KSB7CiAgICAgICAgIGZpbmFsIFZpZXdbXSBjaGlsZHJlbiA9IG1DaGlsZHJlbjsKLSAgICAgICAgY2hpbGRyZW5baW5kZXhdLm1QYXJlbnQgPSBudWxsOworICAgICAgICBpZiAoIShtVHJhbnNpdGlvbmluZ1ZpZXdzICE9IG51bGwgJiYgbVRyYW5zaXRpb25pbmdWaWV3cy5jb250YWlucyhjaGlsZHJlbltpbmRleF0pKSkgeworICAgICAgICAgICAgY2hpbGRyZW5baW5kZXhdLm1QYXJlbnQgPSBudWxsOworICAgICAgICB9CiAgICAgICAgIGZpbmFsIGludCBjb3VudCA9IG1DaGlsZHJlbkNvdW50OwogICAgICAgICBpZiAoaW5kZXggPT0gY291bnQgLSAxKSB7CiAgICAgICAgICAgICBjaGlsZHJlblstLW1DaGlsZHJlbkNvdW50XSA9IG51bGw7CkBAIC0yMTg4LDEzICsyNTY4LDE5IEBACiAgICAgfQogCiAgICAgcHJpdmF0ZSB2b2lkIHJlbW92ZVZpZXdJbnRlcm5hbChpbnQgaW5kZXgsIFZpZXcgdmlldykgeworCisgICAgICAgIGlmIChtVHJhbnNpdGlvbiAhPSBudWxsKSB7CisgICAgICAgICAgICBtVHJhbnNpdGlvbi5jaGlsZFJlbW92ZSh0aGlzLCB2aWV3KTsKKyAgICAgICAgfQorCiAgICAgICAgIGJvb2xlYW4gY2xlYXJDaGlsZEZvY3VzID0gZmFsc2U7CiAgICAgICAgIGlmICh2aWV3ID09IG1Gb2N1c2VkKSB7CiAgICAgICAgICAgICB2aWV3LmNsZWFyRm9jdXNGb3JSZW1vdmFsKCk7CiAgICAgICAgICAgICBjbGVhckNoaWxkRm9jdXMgPSB0cnVlOwogICAgICAgICB9CiAKLSAgICAgICAgaWYgKHZpZXcuZ2V0QW5pbWF0aW9uKCkgIT0gbnVsbCkgeworICAgICAgICBpZiAodmlldy5nZXRBbmltYXRpb24oKSAhPSBudWxsIHx8CisgICAgICAgICAgICAgICAgKG1UcmFuc2l0aW9uaW5nVmlld3MgIT0gbnVsbCAmJiBtVHJhbnNpdGlvbmluZ1ZpZXdzLmNvbnRhaW5zKHZpZXcpKSkgewogICAgICAgICAgICAgYWRkRGlzYXBwZWFyaW5nVmlldyh2aWV3KTsKICAgICAgICAgfSBlbHNlIGlmICh2aWV3Lm1BdHRhY2hJbmZvICE9IG51bGwpIHsKICAgICAgICAgICAgdmlldy5kaXNwYXRjaERldGFjaGVkRnJvbVdpbmRvdygpOwpAQCAtMjIxMyw2ICsyNTk5LDM5IEBACiAgICAgICAgIH0KICAgICB9CiAKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBMYXlvdXRUcmFuc2l0aW9uIG9iamVjdCBmb3IgdGhpcyBWaWV3R3JvdXAuIElmIHRoZSBMYXlvdXRUcmFuc2l0aW9uIG9iamVjdCBpcworICAgICAqIG5vdCBudWxsLCBjaGFuZ2VzIGluIGxheW91dCB3aGljaCBvY2N1ciBiZWNhdXNlIG9mIGNoaWxkcmVuIGJlaW5nIGFkZGVkIHRvIG9yIHJlbW92ZWQgZnJvbQorICAgICAqIHRoZSBWaWV3R3JvdXAgd2lsbCBiZSBhbmltYXRlZCBhY2NvcmRpbmcgdG8gdGhlIGFuaW1hdGlvbnMgZGVmaW5lZCBpbiB0aGF0IExheW91dFRyYW5zaXRpb24KKyAgICAgKiBvYmplY3QuIEJ5IGRlZmF1bHQsIHRoZSB0cmFuc2l0aW9uIG9iamVjdCBpcyBudWxsIChzbyBsYXlvdXQgY2hhbmdlcyBhcmUgbm90IGFuaW1hdGVkKS4KKyAgICAgKgorICAgICAqIEBwYXJhbSB0cmFuc2l0aW9uIFRoZSBMYXlvdXRUcmFuc2l0aW9uIG9iamVjdCB0aGF0IHdpbGwgYW5pbWF0ZWQgY2hhbmdlcyBpbiBsYXlvdXQuIEEgdmFsdWUKKyAgICAgKiBvZiA8Y29kZT5udWxsPC9jb2RlPiBtZWFucyBubyB0cmFuc2l0aW9uIHdpbGwgcnVuIG9uIGxheW91dCBjaGFuZ2VzLgorICAgICAqIEBhdHRyIHJlZiBhbmRyb2lkLlIuc3R5bGVhYmxlI1ZpZXdHcm91cF9hbmltYXRlTGF5b3V0Q2hhbmdlcworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldExheW91dFRyYW5zaXRpb24oTGF5b3V0VHJhbnNpdGlvbiB0cmFuc2l0aW9uKSB7CisgICAgICAgIGlmIChtVHJhbnNpdGlvbiAhPSBudWxsKSB7CisgICAgICAgICAgICBtVHJhbnNpdGlvbi5yZW1vdmVUcmFuc2l0aW9uTGlzdGVuZXIobUxheW91dFRyYW5zaXRpb25MaXN0ZW5lcik7CisgICAgICAgIH0KKyAgICAgICAgbVRyYW5zaXRpb24gPSB0cmFuc2l0aW9uOworICAgICAgICBpZiAobVRyYW5zaXRpb24gIT0gbnVsbCkgeworICAgICAgICAgICAgbVRyYW5zaXRpb24uYWRkVHJhbnNpdGlvbkxpc3RlbmVyKG1MYXlvdXRUcmFuc2l0aW9uTGlzdGVuZXIpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgTGF5b3V0VHJhbnNpdGlvbiBvYmplY3QgZm9yIHRoaXMgVmlld0dyb3VwLiBJZiB0aGUgTGF5b3V0VHJhbnNpdGlvbiBvYmplY3QgaXMKKyAgICAgKiBub3QgbnVsbCwgY2hhbmdlcyBpbiBsYXlvdXQgd2hpY2ggb2NjdXIgYmVjYXVzZSBvZiBjaGlsZHJlbiBiZWluZyBhZGRlZCB0byBvciByZW1vdmVkIGZyb20KKyAgICAgKiB0aGUgVmlld0dyb3VwIHdpbGwgYmUgYW5pbWF0ZWQgYWNjb3JkaW5nIHRvIHRoZSBhbmltYXRpb25zIGRlZmluZWQgaW4gdGhhdCBMYXlvdXRUcmFuc2l0aW9uCisgICAgICogb2JqZWN0LiBCeSBkZWZhdWx0LCB0aGUgdHJhbnNpdGlvbiBvYmplY3QgaXMgbnVsbCAoc28gbGF5b3V0IGNoYW5nZXMgYXJlIG5vdCBhbmltYXRlZCkuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIExheW91dFRyYW5zdGlvbiBUaGUgTGF5b3V0VHJhbnNpdGlvbiBvYmplY3QgdGhhdCB3aWxsIGFuaW1hdGVkIGNoYW5nZXMgaW4gbGF5b3V0LgorICAgICAqIEEgdmFsdWUgb2YgPGNvZGU+bnVsbDwvY29kZT4gbWVhbnMgbm8gdHJhbnNpdGlvbiB3aWxsIHJ1biBvbiBsYXlvdXQgY2hhbmdlcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgTGF5b3V0VHJhbnNpdGlvbiBnZXRMYXlvdXRUcmFuc2l0aW9uKCkgeworICAgICAgICByZXR1cm4gbVRyYW5zaXRpb247CisgICAgfQorCiAgICAgcHJpdmF0ZSB2b2lkIHJlbW92ZVZpZXdzSW50ZXJuYWwoaW50IHN0YXJ0LCBpbnQgY291bnQpIHsKICAgICAgICAgZmluYWwgT25IaWVyYXJjaHlDaGFuZ2VMaXN0ZW5lciBvbkhpZXJhcmNoeUNoYW5nZUxpc3RlbmVyID0gbU9uSGllcmFyY2h5Q2hhbmdlTGlzdGVuZXI7CiAgICAgICAgIGZpbmFsIGJvb2xlYW4gbm90aWZ5TGlzdGVuZXIgPSBvbkhpZXJhcmNoeUNoYW5nZUxpc3RlbmVyICE9IG51bGw7CkBAIC0yMjI2LDEyICsyNjQ1LDE3IEBACiAgICAgICAgIGZvciAoaW50IGkgPSBzdGFydDsgaSA8IGVuZDsgaSsrKSB7CiAgICAgICAgICAgICBmaW5hbCBWaWV3IHZpZXcgPSBjaGlsZHJlbltpXTsKIAorICAgICAgICAgICAgaWYgKG1UcmFuc2l0aW9uICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBtVHJhbnNpdGlvbi5jaGlsZFJlbW92ZSh0aGlzLCB2aWV3KTsKKyAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgaWYgKHZpZXcgPT0gZm9jdXNlZCkgewogICAgICAgICAgICAgICAgIHZpZXcuY2xlYXJGb2N1c0ZvclJlbW92YWwoKTsKICAgICAgICAgICAgICAgICBjbGVhckNoaWxkRm9jdXMgPSB2aWV3OwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBpZiAodmlldy5nZXRBbmltYXRpb24oKSAhPSBudWxsKSB7CisgICAgICAgICAgICBpZiAodmlldy5nZXRBbmltYXRpb24oKSAhPSBudWxsIHx8CisgICAgICAgICAgICAgICAgKG1UcmFuc2l0aW9uaW5nVmlld3MgIT0gbnVsbCAmJiBtVHJhbnNpdGlvbmluZ1ZpZXdzLmNvbnRhaW5zKHZpZXcpKSkgewogICAgICAgICAgICAgICAgIGFkZERpc2FwcGVhcmluZ1ZpZXcodmlldyk7CiAgICAgICAgICAgICB9IGVsc2UgaWYgKGRldGFjaCkgewogICAgICAgICAgICAgICAgdmlldy5kaXNwYXRjaERldGFjaGVkRnJvbVdpbmRvdygpOwpAQCAtMjI5MCwxMiArMjcxNCwxNyBAQAogICAgICAgICBmb3IgKGludCBpID0gY291bnQgLSAxOyBpID49IDA7IGktLSkgewogICAgICAgICAgICAgZmluYWwgVmlldyB2aWV3ID0gY2hpbGRyZW5baV07CiAKKyAgICAgICAgICAgIGlmIChtVHJhbnNpdGlvbiAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgbVRyYW5zaXRpb24uY2hpbGRSZW1vdmUodGhpcywgdmlldyk7CisgICAgICAgICAgICB9CisKICAgICAgICAgICAgIGlmICh2aWV3ID09IGZvY3VzZWQpIHsKICAgICAgICAgICAgICAgICB2aWV3LmNsZWFyRm9jdXNGb3JSZW1vdmFsKCk7CiAgICAgICAgICAgICAgICAgY2xlYXJDaGlsZEZvY3VzID0gdmlldzsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgaWYgKHZpZXcuZ2V0QW5pbWF0aW9uKCkgIT0gbnVsbCkgeworICAgICAgICAgICAgaWYgKHZpZXcuZ2V0QW5pbWF0aW9uKCkgIT0gbnVsbCB8fAorICAgICAgICAgICAgICAgICAgICAobVRyYW5zaXRpb25pbmdWaWV3cyAhPSBudWxsICYmIG1UcmFuc2l0aW9uaW5nVmlld3MuY29udGFpbnModmlldykpKSB7CiAgICAgICAgICAgICAgICAgYWRkRGlzYXBwZWFyaW5nVmlldyh2aWV3KTsKICAgICAgICAgICAgIH0gZWxzZSBpZiAoZGV0YWNoKSB7CiAgICAgICAgICAgICAgICB2aWV3LmRpc3BhdGNoRGV0YWNoZWRGcm9tV2luZG93KCk7CkBAIC0yMzI4LDExICsyNzU3LDE2IEBACiAgICAgICogQHNlZSAjZGV0YWNoVmlld0Zyb21QYXJlbnQoaW50KQogICAgICAqLwogICAgIHByb3RlY3RlZCB2b2lkIHJlbW92ZURldGFjaGVkVmlldyhWaWV3IGNoaWxkLCBib29sZWFuIGFuaW1hdGUpIHsKKyAgICAgICAgaWYgKG1UcmFuc2l0aW9uICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1UcmFuc2l0aW9uLmNoaWxkUmVtb3ZlKHRoaXMsIGNoaWxkKTsKKyAgICAgICAgfQorCiAgICAgICAgIGlmIChjaGlsZCA9PSBtRm9jdXNlZCkgewogICAgICAgICAgICAgY2hpbGQuY2xlYXJGb2N1cygpOwogICAgICAgICB9CiAKLSAgICAgICAgaWYgKGFuaW1hdGUgJiYgY2hpbGQuZ2V0QW5pbWF0aW9uKCkgIT0gbnVsbCkgeworICAgICAgICBpZiAoKGFuaW1hdGUgJiYgY2hpbGQuZ2V0QW5pbWF0aW9uKCkgIT0gbnVsbCkgfHwKKyAgICAgICAgICAgICAgICAobVRyYW5zaXRpb25pbmdWaWV3cyAhPSBudWxsICYmIG1UcmFuc2l0aW9uaW5nVmlld3MuY29udGFpbnMoY2hpbGQpKSkgewogICAgICAgICAgICAgYWRkRGlzYXBwZWFyaW5nVmlldyhjaGlsZCk7CiAgICAgICAgIH0gZWxzZSBpZiAoY2hpbGQubUF0dGFjaEluZm8gIT0gbnVsbCkgewogICAgICAgICAgICAgY2hpbGQuZGlzcGF0Y2hEZXRhY2hlZEZyb21XaW5kb3coKTsKQEAgLTI0NzQsNiArMjkwOCwxNSBAQAogICAgICAgICAgICAgZmluYWwgaW50W10gbG9jYXRpb24gPSBhdHRhY2hJbmZvLm1JbnZhbGlkYXRlQ2hpbGRMb2NhdGlvbjsKICAgICAgICAgICAgIGxvY2F0aW9uW0NISUxEX0xFRlRfSU5ERVhdID0gY2hpbGQubUxlZnQ7CiAgICAgICAgICAgICBsb2NhdGlvbltDSElMRF9UT1BfSU5ERVhdID0gY2hpbGQubVRvcDsKKyAgICAgICAgICAgIE1hdHJpeCBjaGlsZE1hdHJpeCA9IGNoaWxkLmdldE1hdHJpeCgpOworICAgICAgICAgICAgaWYgKCFjaGlsZE1hdHJpeC5pc0lkZW50aXR5KCkpIHsKKyAgICAgICAgICAgICAgICBSZWN0RiBib3VuZGluZ1JlY3QgPSBhdHRhY2hJbmZvLm1UbXBUcmFuc2Zvcm1SZWN0OworICAgICAgICAgICAgICAgIGJvdW5kaW5nUmVjdC5zZXQoZGlydHkpOworICAgICAgICAgICAgICAgIGNoaWxkTWF0cml4Lm1hcFJlY3QoYm91bmRpbmdSZWN0KTsKKyAgICAgICAgICAgICAgICBkaXJ0eS5zZXQoKGludCkgYm91bmRpbmdSZWN0LmxlZnQsIChpbnQpIGJvdW5kaW5nUmVjdC50b3AsCisgICAgICAgICAgICAgICAgICAgICAgICAoaW50KSAoYm91bmRpbmdSZWN0LnJpZ2h0ICsgMC41ZiksCisgICAgICAgICAgICAgICAgICAgICAgICAoaW50KSAoYm91bmRpbmdSZWN0LmJvdHRvbSArIDAuNWYpKTsKKyAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgLy8gSWYgdGhlIGNoaWxkIGlzIGRyYXdpbmcgYW4gYW5pbWF0aW9uLCB3ZSB3YW50IHRvIGNvcHkgdGhpcyBmbGFnIG9udG8KICAgICAgICAgICAgIC8vIG91cnNlbHZlcyBhbmQgdGhlIHBhcmVudCB0byBtYWtlIHN1cmUgdGhlIGludmFsaWRhdGUgcmVxdWVzdCBnb2VzCkBAIC0yNTA4LDYgKzI5NTEsMTggQEAKICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICBwYXJlbnQgPSBwYXJlbnQuaW52YWxpZGF0ZUNoaWxkSW5QYXJlbnQobG9jYXRpb24sIGRpcnR5KTsKKyAgICAgICAgICAgICAgICBpZiAodmlldyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIEFjY291bnQgZm9yIHRyYW5zZm9ybSBvbiBjdXJyZW50IHBhcmVudAorICAgICAgICAgICAgICAgICAgICBNYXRyaXggbSA9IHZpZXcuZ2V0TWF0cml4KCk7CisgICAgICAgICAgICAgICAgICAgIGlmICghbS5pc0lkZW50aXR5KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFJlY3RGIGJvdW5kaW5nUmVjdCA9IGF0dGFjaEluZm8ubVRtcFRyYW5zZm9ybVJlY3Q7CisgICAgICAgICAgICAgICAgICAgICAgICBib3VuZGluZ1JlY3Quc2V0KGRpcnR5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG0ubWFwUmVjdChib3VuZGluZ1JlY3QpOworICAgICAgICAgICAgICAgICAgICAgICAgZGlydHkuc2V0KChpbnQpIGJvdW5kaW5nUmVjdC5sZWZ0LCAoaW50KSBib3VuZGluZ1JlY3QudG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50KSAoYm91bmRpbmdSZWN0LnJpZ2h0ICsgMC41ZiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQpIChib3VuZGluZ1JlY3QuYm90dG9tICsgMC41ZikpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfSB3aGlsZSAocGFyZW50ICE9IG51bGwpOwogICAgICAgICB9CiAgICAgfQpAQCAtMjg3NCw3ICszMzI5LDcgQEAKICAgICAgKi8KICAgICBAVmlld0RlYnVnLkV4cG9ydGVkUHJvcGVydHkoY2F0ZWdvcnkgPSAiZHJhd2luZyIsIG1hcHBpbmcgPSB7CiAgICAgICAgIEBWaWV3RGVidWcuSW50VG9TdHJpbmcoZnJvbSA9IFBFUlNJU1RFTlRfTk9fQ0FDSEUsICAgICAgICB0byA9ICJOT05FIiksCi0gICAgICAgIEBWaWV3RGVidWcuSW50VG9TdHJpbmcoZnJvbSA9IFBFUlNJU1RFTlRfQUxMX0NBQ0hFUywgICAgICB0byA9ICJBTklNQVRJT04iKSwKKyAgICAgICAgQFZpZXdEZWJ1Zy5JbnRUb1N0cmluZyhmcm9tID0gUEVSU0lTVEVOVF9BTklNQVRJT05fQ0FDSEUsIHRvID0gIkFOSU1BVElPTiIpLAogICAgICAgICBAVmlld0RlYnVnLkludFRvU3RyaW5nKGZyb20gPSBQRVJTSVNURU5UX1NDUk9MTElOR19DQUNIRSwgdG8gPSAiU0NST0xMSU5HIiksCiAgICAgICAgIEBWaWV3RGVidWcuSW50VG9TdHJpbmcoZnJvbSA9IFBFUlNJU1RFTlRfQUxMX0NBQ0hFUywgICAgICB0byA9ICJBTEwiKQogICAgIH0pCkBAIC0zMjg3LDYgKzM3NDIsNzUgQEAKICAgICB9CiAKICAgICAvKioKKyAgICAgKiBUaGlzIG1ldGhvZCB0ZWxscyB0aGUgVmlld0dyb3VwIHRoYXQgdGhlIGdpdmVuIFZpZXcgb2JqZWN0LCB3aGljaCBzaG91bGQgaGF2ZSB0aGlzCisgICAgICogVmlld0dyb3VwIGFzIGl0cyBwYXJlbnQsCisgICAgICogc2hvdWxkIGJlIGtlcHQgYXJvdW5kICAocmUtZGlzcGxheWVkIHdoZW4gdGhlIFZpZXdHcm91cCBkcmF3cyBpdHMgY2hpbGRyZW4pIGV2ZW4gaWYgaXQKKyAgICAgKiBpcyByZW1vdmVkIGZyb20gaXRzIHBhcmVudC4gVGhpcyBhbGxvd3MgYW5pbWF0aW9ucywgc3VjaCBhcyB0aG9zZSB1c2VkIGJ5CisgICAgICoge0BsaW5rIGFuZHJvaWQuYXBwLkZyYWdtZW50fSBhbmQge0BsaW5rIGFuZHJvaWQuYW5pbWF0aW9uLkxheW91dFRyYW5zaXRpb259IHRvIGFuaW1hdGUKKyAgICAgKiB0aGUgcmVtb3ZhbCBvZiB2aWV3cy4gQSBjYWxsIHRvIHRoaXMgbWV0aG9kIHNob3VsZCBhbHdheXMgYmUgYWNjb21wYW5pZWQgYnkgYSBsYXRlciBjYWxsCisgICAgICogdG8ge0BsaW5rICNlbmRWaWV3VHJhbnNpdGlvbihWaWV3KX0sIHN1Y2ggYXMgYWZ0ZXIgYW4gYW5pbWF0aW9uIG9uIHRoZSBWaWV3IGhhcyBmaW5pc2hlZCwKKyAgICAgKiBzbyB0aGF0IHRoZSBWaWV3IGZpbmFsbHkgZ2V0cyByZW1vdmVkLgorICAgICAqCisgICAgICogQHBhcmFtIHZpZXcgVGhlIFZpZXcgb2JqZWN0IHRvIGJlIGtlcHQgdmlzaWJsZSBldmVuIGlmIGl0IGdldHMgcmVtb3ZlZCBmcm9tIGl0cyBwYXJlbnQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc3RhcnRWaWV3VHJhbnNpdGlvbihWaWV3IHZpZXcpIHsKKyAgICAgICAgaWYgKHZpZXcubVBhcmVudCA9PSB0aGlzKSB7CisgICAgICAgICAgICBpZiAobVRyYW5zaXRpb25pbmdWaWV3cyA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgbVRyYW5zaXRpb25pbmdWaWV3cyA9IG5ldyBBcnJheUxpc3Q8Vmlldz4oKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1UcmFuc2l0aW9uaW5nVmlld3MuYWRkKHZpZXcpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhpcyBtZXRob2Qgc2hvdWxkIGFsd2F5cyBiZSBjYWxsZWQgZm9sbG93aW5nIGFuIGVhcmxpZXIgY2FsbCB0bworICAgICAqIHtAbGluayAjc3RhcnRWaWV3VHJhbnNpdGlvbihWaWV3KX0uIFRoZSBnaXZlbiBWaWV3IGlzIGZpbmFsbHkgcmVtb3ZlZCBmcm9tIGl0cyBwYXJlbnQKKyAgICAgKiBhbmQgd2lsbCBubyBsb25nZXIgYmUgZGlzcGxheWVkLiBOb3RlIHRoYXQgdGhpcyBtZXRob2QgZG9lcyBub3QgcGVyZm9ybSB0aGUgZnVuY3Rpb25hbGl0eQorICAgICAqIG9mIHJlbW92aW5nIGEgdmlldyBmcm9tIGl0cyBwYXJlbnQ7IGl0IGp1c3QgZGlzY29udGludWVzIHRoZSBkaXNwbGF5IG9mIGEgVmlldyB0aGF0CisgICAgICogaGFzIHByZXZpb3VzbHkgYmVlbiByZW1vdmVkLgorICAgICAqCisgICAgICogQHJldHVybiB2aWV3IFRoZSBWaWV3IG9iamVjdCB0aGF0IGhhcyBiZWVuIHJlbW92ZWQgYnV0IGlzIGJlaW5nIGtlcHQgYXJvdW5kIGluIHRoZSB2aXNpYmxlCisgICAgICogaGllcmFyY2h5IGJ5IGFuIGVhcmxpZXIgY2FsbCB0byB7QGxpbmsgI3N0YXJ0Vmlld1RyYW5zaXRpb24oVmlldyl9LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGVuZFZpZXdUcmFuc2l0aW9uKFZpZXcgdmlldykgeworICAgICAgICBpZiAobVRyYW5zaXRpb25pbmdWaWV3cyAhPSBudWxsKSB7CisgICAgICAgICAgICBtVHJhbnNpdGlvbmluZ1ZpZXdzLnJlbW92ZSh2aWV3KTsKKyAgICAgICAgICAgIGZpbmFsIEFycmF5TGlzdDxWaWV3PiBkaXNhcHBlYXJpbmdDaGlsZHJlbiA9IG1EaXNhcHBlYXJpbmdDaGlsZHJlbjsKKyAgICAgICAgICAgIGlmIChkaXNhcHBlYXJpbmdDaGlsZHJlbiAhPSBudWxsICYmIGRpc2FwcGVhcmluZ0NoaWxkcmVuLmNvbnRhaW5zKHZpZXcpKSB7CisgICAgICAgICAgICAgICAgZGlzYXBwZWFyaW5nQ2hpbGRyZW4ucmVtb3ZlKHZpZXcpOworICAgICAgICAgICAgICAgIGlmICh2aWV3Lm1BdHRhY2hJbmZvICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgdmlldy5kaXNwYXRjaERldGFjaGVkRnJvbVdpbmRvdygpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAodmlldy5tUGFyZW50ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgdmlldy5tUGFyZW50ID0gbnVsbDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbUdyb3VwRmxhZ3MgfD0gRkxBR19JTlZBTElEQVRFX1JFUVVJUkVEOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBMYXlvdXRUcmFuc2l0aW9uLlRyYW5zaXRpb25MaXN0ZW5lciBtTGF5b3V0VHJhbnNpdGlvbkxpc3RlbmVyID0KKyAgICAgICAgICAgIG5ldyBMYXlvdXRUcmFuc2l0aW9uLlRyYW5zaXRpb25MaXN0ZW5lcigpIHsKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIHN0YXJ0VHJhbnNpdGlvbihMYXlvdXRUcmFuc2l0aW9uIHRyYW5zaXRpb24sIFZpZXdHcm91cCBjb250YWluZXIsCisgICAgICAgICAgICAgICAgVmlldyB2aWV3LCBpbnQgdHJhbnNpdGlvblR5cGUpIHsKKyAgICAgICAgICAgIC8vIFdlIG9ubHkgY2FyZSBhYm91dCBkaXNhcHBlYXJpbmcgaXRlbXMsIHNpbmNlIHdlIG5lZWQgc3BlY2lhbCBsb2dpYyB0byBrZWVwCisgICAgICAgICAgICAvLyB0aG9zZSBpdGVtcyB2aXNpYmxlIGFmdGVyIHRoZXkndmUgYmVlbiAncmVtb3ZlZCcKKyAgICAgICAgICAgIGlmICh0cmFuc2l0aW9uVHlwZSA9PSBMYXlvdXRUcmFuc2l0aW9uLkRJU0FQUEVBUklORykgeworICAgICAgICAgICAgICAgIHN0YXJ0Vmlld1RyYW5zaXRpb24odmlldyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgZW5kVHJhbnNpdGlvbihMYXlvdXRUcmFuc2l0aW9uIHRyYW5zaXRpb24sIFZpZXdHcm91cCBjb250YWluZXIsCisgICAgICAgICAgICAgICAgVmlldyB2aWV3LCBpbnQgdHJhbnNpdGlvblR5cGUpIHsKKyAgICAgICAgICAgIGlmICh0cmFuc2l0aW9uVHlwZSA9PSBMYXlvdXRUcmFuc2l0aW9uLkRJU0FQUEVBUklORyAmJiBtVHJhbnNpdGlvbmluZ1ZpZXdzICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBlbmRWaWV3VHJhbnNpdGlvbih2aWV3KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH07CisKKyAgICAvKioKICAgICAgKiB7QGluaGVyaXREb2N9CiAgICAgICovCiAgICAgQE92ZXJyaWRlCkBAIC0zNzQ4LDQgKzQyNzIsMjkyIEBACiAgICAgICAgICAgICBib3R0b21NYXJnaW4gPSBib3R0b207CiAgICAgICAgIH0KICAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBTcGxpdE1vdGlvblRhcmdldHMgeworICAgICAgICBwcml2YXRlIFNwYXJzZUFycmF5PFZpZXc+IG1UYXJnZXRzOworICAgICAgICBwcml2YXRlIFRhcmdldEluZm9bXSBtVW5pcXVlVGFyZ2V0czsKKyAgICAgICAgcHJpdmF0ZSBpbnQgbVVuaXF1ZVRhcmdldENvdW50OworICAgICAgICBwcml2YXRlIE1vdGlvbkV2ZW50LlBvaW50ZXJDb29yZHNbXSBtUG9pbnRlckNvb3JkczsKKyAgICAgICAgcHJpdmF0ZSBpbnRbXSBtUG9pbnRlcklkczsKKworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgSU5JVElBTF9VTklRVUVfTU9USU9OX1RBUkdFVFNfU0laRSA9IDU7CisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBJTklUSUFMX0JVQ0tFVF9TSVpFID0gNTsKKworICAgICAgICBwdWJsaWMgU3BsaXRNb3Rpb25UYXJnZXRzKCkgeworICAgICAgICAgICAgbVRhcmdldHMgPSBuZXcgU3BhcnNlQXJyYXk8Vmlldz4oKTsKKyAgICAgICAgICAgIG1VbmlxdWVUYXJnZXRzID0gbmV3IFRhcmdldEluZm9bSU5JVElBTF9VTklRVUVfTU9USU9OX1RBUkdFVFNfU0laRV07CisgICAgICAgICAgICBtUG9pbnRlcklkcyA9IG5ldyBpbnRbSU5JVElBTF9CVUNLRVRfU0laRV07CisgICAgICAgICAgICBtUG9pbnRlckNvb3JkcyA9IG5ldyBNb3Rpb25FdmVudC5Qb2ludGVyQ29vcmRzW0lOSVRJQUxfQlVDS0VUX1NJWkVdOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBJTklUSUFMX0JVQ0tFVF9TSVpFOyBpKyspIHsKKyAgICAgICAgICAgICAgICBtUG9pbnRlckNvb3Jkc1tpXSA9IG5ldyBNb3Rpb25FdmVudC5Qb2ludGVyQ29vcmRzKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBjbGVhcigpIHsKKyAgICAgICAgICAgIG1UYXJnZXRzLmNsZWFyKCk7CisgICAgICAgICAgICBmaW5hbCBpbnQgY291bnQgPSBtVW5pcXVlVGFyZ2V0Q291bnQ7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKyAgICAgICAgICAgICAgICBtVW5pcXVlVGFyZ2V0c1tpXS5yZWN5Y2xlKCk7CisgICAgICAgICAgICAgICAgbVVuaXF1ZVRhcmdldHNbaV0gPSBudWxsOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbVVuaXF1ZVRhcmdldENvdW50ID0gMDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIGFkZChpbnQgcG9pbnRlcklkLCBWaWV3IHRhcmdldCwgbG9uZyBkb3duVGltZSkgeworICAgICAgICAgICAgbVRhcmdldHMucHV0KHBvaW50ZXJJZCwgdGFyZ2V0KTsKKworICAgICAgICAgICAgZmluYWwgaW50IHVuaXF1ZUNvdW50ID0gbVVuaXF1ZVRhcmdldENvdW50OworICAgICAgICAgICAgYm9vbGVhbiBhZGRVbmlxdWUgPSB0cnVlOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB1bmlxdWVDb3VudDsgaSsrKSB7CisgICAgICAgICAgICAgICAgaWYgKG1VbmlxdWVUYXJnZXRzW2ldLnZpZXcgPT0gdGFyZ2V0KSB7CisgICAgICAgICAgICAgICAgICAgIGFkZFVuaXF1ZSA9IGZhbHNlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChhZGRVbmlxdWUpIHsKKyAgICAgICAgICAgICAgICBpZiAobVVuaXF1ZVRhcmdldHMubGVuZ3RoID09IHVuaXF1ZUNvdW50KSB7CisgICAgICAgICAgICAgICAgICAgIFRhcmdldEluZm9bXSBuZXdUYXJnZXRzID0KKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBUYXJnZXRJbmZvW3VuaXF1ZUNvdW50ICsgSU5JVElBTF9VTklRVUVfTU9USU9OX1RBUkdFVFNfU0laRV07CisgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkobVVuaXF1ZVRhcmdldHMsIDAsIG5ld1RhcmdldHMsIDAsIHVuaXF1ZUNvdW50KTsKKyAgICAgICAgICAgICAgICAgICAgbVVuaXF1ZVRhcmdldHMgPSBuZXdUYXJnZXRzOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBtVW5pcXVlVGFyZ2V0c1t1bmlxdWVDb3VudF0gPSBUYXJnZXRJbmZvLm9idGFpbih0YXJnZXQsIGRvd25UaW1lKTsKKyAgICAgICAgICAgICAgICBtVW5pcXVlVGFyZ2V0Q291bnQrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBpbnQgZ2V0SWRDb3VudCgpIHsKKyAgICAgICAgICAgIHJldHVybiBtVGFyZ2V0cy5zaXplKCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgaW50IGdldFVuaXF1ZVRhcmdldENvdW50KCkgeworICAgICAgICAgICAgcmV0dXJuIG1VbmlxdWVUYXJnZXRDb3VudDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBUYXJnZXRJbmZvIGdldFVuaXF1ZVRhcmdldEF0KGludCBpbmRleCkgeworICAgICAgICAgICAgcmV0dXJuIG1VbmlxdWVUYXJnZXRzW2luZGV4XTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBWaWV3IGdldChpbnQgaWQpIHsKKyAgICAgICAgICAgIHJldHVybiBtVGFyZ2V0cy5nZXQoaWQpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGludCBpbmRleE9mVGFyZ2V0KFZpZXcgdGFyZ2V0KSB7CisgICAgICAgICAgICByZXR1cm4gbVRhcmdldHMuaW5kZXhPZlZhbHVlKHRhcmdldCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgVmlldyB0YXJnZXRBdChpbnQgaW5kZXgpIHsKKyAgICAgICAgICAgIHJldHVybiBtVGFyZ2V0cy52YWx1ZUF0KGluZGV4KTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBUYXJnZXRJbmZvIGdldFByaW1hcnlUYXJnZXQoKSB7CisgICAgICAgICAgICBpZiAoIWlzRW1wdHkoKSkgeworICAgICAgICAgICAgICAgIC8vIEZpbmQgdGhlIGxvbmdlc3QtbGl2ZWQgdGFyZ2V0CisgICAgICAgICAgICAgICAgbG9uZyBmaXJzdFRpbWUgPSBMb25nLk1BWF9WQUxVRTsKKyAgICAgICAgICAgICAgICBpbnQgZmlyc3RJbmRleCA9IDA7CisgICAgICAgICAgICAgICAgZmluYWwgaW50IHVuaXF1ZUNvdW50ID0gbVVuaXF1ZVRhcmdldENvdW50OworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdW5pcXVlQ291bnQ7IGkrKykgeworICAgICAgICAgICAgICAgICAgICBUYXJnZXRJbmZvIGluZm8gPSBtVW5pcXVlVGFyZ2V0c1tpXTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGluZm8uZG93blRpbWUgPCBmaXJzdFRpbWUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0VGltZSA9IGluZm8uZG93blRpbWU7CisgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdEluZGV4ID0gaTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gbVVuaXF1ZVRhcmdldHNbZmlyc3RJbmRleF07CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBib29sZWFuIGlzRW1wdHkoKSB7CisgICAgICAgICAgICByZXR1cm4gbVVuaXF1ZVRhcmdldENvdW50ID09IDA7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCByZW1vdmVCeUlkKGludCBpZCkgeworICAgICAgICAgICAgZmluYWwgaW50IGluZGV4ID0gbVRhcmdldHMuaW5kZXhPZktleShpZCk7CisgICAgICAgICAgICByZW1vdmVBdChpbmRleCk7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIHB1YmxpYyB2b2lkIHJlbW92ZVZpZXcoVmlldyB2aWV3KSB7CisgICAgICAgICAgICBpbnQgaSA9IDA7CisgICAgICAgICAgICB3aGlsZSAoaSA8IG1UYXJnZXRzLnNpemUoKSkgeworICAgICAgICAgICAgICAgIGlmIChtVGFyZ2V0cy52YWx1ZUF0KGkpID09IHZpZXcpIHsKKyAgICAgICAgICAgICAgICAgICAgbVRhcmdldHMucmVtb3ZlQXQoaSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgaSsrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJlbW92ZVVuaXF1ZSh2aWV3KTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHJlbW92ZUF0KGludCBpbmRleCkgeworICAgICAgICAgICAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSBtVGFyZ2V0cy5zaXplKCkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZpbmFsIFZpZXcgcmVtb3ZlVmlldyA9IG1UYXJnZXRzLnZhbHVlQXQoaW5kZXgpOworICAgICAgICAgICAgbVRhcmdldHMucmVtb3ZlQXQoaW5kZXgpOworICAgICAgICAgICAgaWYgKG1UYXJnZXRzLmluZGV4T2ZWYWx1ZShyZW1vdmVWaWV3KSA8IDApIHsKKyAgICAgICAgICAgICAgICByZW1vdmVVbmlxdWUocmVtb3ZlVmlldyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHZvaWQgcmVtb3ZlVW5pcXVlKFZpZXcgcmVtb3ZlVmlldykgeworICAgICAgICAgICAgVGFyZ2V0SW5mb1tdIHVuaXF1ZSA9IG1VbmlxdWVUYXJnZXRzOworICAgICAgICAgICAgaW50IHVuaXF1ZUNvdW50ID0gbVVuaXF1ZVRhcmdldENvdW50OworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB1bmlxdWVDb3VudDsgaSsrKSB7CisgICAgICAgICAgICAgICAgaWYgKHVuaXF1ZVtpXS52aWV3ID09IHJlbW92ZVZpZXcpIHsKKyAgICAgICAgICAgICAgICAgICAgdW5pcXVlW2ldLnJlY3ljbGUoKTsKKyAgICAgICAgICAgICAgICAgICAgdW5pcXVlW2ldID0gdW5pcXVlWy0tdW5pcXVlQ291bnRdOworICAgICAgICAgICAgICAgICAgICB1bmlxdWVbdW5pcXVlQ291bnRdID0gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBtVW5pcXVlVGFyZ2V0Q291bnQgPSB1bmlxdWVDb3VudDsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBSZXR1cm4gYSBuZXcgKG9idGFpbigpZWQpIE1vdGlvbkV2ZW50IGNvbnRhaW5pbmcgb25seSBkYXRhIGZvciBwb2ludGVycyB0aGF0IHNob3VsZAorICAgICAgICAgKiBiZSBkaXNwYXRjaGVkIHRvIGNoaWxkLiBEb24ndCBmb3JnZXQgdG8gcmVjeWNsZSBpdCEKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBNb3Rpb25FdmVudCBmaWx0ZXJNb3Rpb25FdmVudEZvckNoaWxkKE1vdGlvbkV2ZW50IGV2LCBWaWV3IGNoaWxkLCBsb25nIGRvd25UaW1lKSB7CisgICAgICAgICAgICBpbnQgYWN0aW9uID0gZXYuZ2V0QWN0aW9uKCk7CisgICAgICAgICAgICBmaW5hbCBpbnQgbWFza2VkQWN0aW9uID0gYWN0aW9uICYgTW90aW9uRXZlbnQuQUNUSU9OX01BU0s7CisKKyAgICAgICAgICAgIC8vIE9ubHkgc2VuZCBwb2ludGVyIHVwIGV2ZW50cyBpZiB0aGlzIGNoaWxkIHdhcyB0aGUgdGFyZ2V0LiBEcm9wIGl0IG90aGVyd2lzZS4KKyAgICAgICAgICAgIGlmIChtYXNrZWRBY3Rpb24gPT0gTW90aW9uRXZlbnQuQUNUSU9OX1BPSU5URVJfVVAgJiYKKyAgICAgICAgICAgICAgICAgICAgZ2V0KGV2LmdldFBvaW50ZXJJZChldi5nZXRBY3Rpb25JbmRleCgpKSkgIT0gY2hpbGQpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaW50IHBvaW50ZXJDb3VudCA9IDA7CisgICAgICAgICAgICBmaW5hbCBpbnQgaWRDb3VudCA9IGdldElkQ291bnQoKTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaWRDb3VudDsgaSsrKSB7CisgICAgICAgICAgICAgICAgaWYgKHRhcmdldEF0KGkpID09IGNoaWxkKSB7CisgICAgICAgICAgICAgICAgICAgIHBvaW50ZXJDb3VudCsrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaW50IGFjdGlvbklkID0gLTE7CisgICAgICAgICAgICBib29sZWFuIG5lZWRzTmV3SW5kZXggPSBmYWxzZTsgLy8gVHJ1ZSBpZiB3ZSBzaG91bGQgZmlsbCBpbiB0aGUgYWN0aW9uJ3MgbWFza2VkIGluZGV4CisKKyAgICAgICAgICAgIC8vIElmIHdlIGhhdmUgYSBkb3duIGV2ZW50LCBpdCB3YXNuJ3QgY291bnRlZCBhYm92ZS4KKyAgICAgICAgICAgIGlmIChtYXNrZWRBY3Rpb24gPT0gTW90aW9uRXZlbnQuQUNUSU9OX0RPV04pIHsKKyAgICAgICAgICAgICAgICBwb2ludGVyQ291bnQrKzsKKyAgICAgICAgICAgICAgICBhY3Rpb25JZCA9IGV2LmdldFBvaW50ZXJJZCgwKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAobWFza2VkQWN0aW9uID09IE1vdGlvbkV2ZW50LkFDVElPTl9QT0lOVEVSX0RPV04pIHsKKyAgICAgICAgICAgICAgICBwb2ludGVyQ291bnQrKzsKKworICAgICAgICAgICAgICAgIGFjdGlvbklkID0gZXYuZ2V0UG9pbnRlcklkKGV2LmdldEFjdGlvbkluZGV4KCkpOworCisgICAgICAgICAgICAgICAgaWYgKGluZGV4T2ZUYXJnZXQoY2hpbGQpIDwgMCkgeworICAgICAgICAgICAgICAgICAgICAvLyBUaGUgbmV3IGFjdGlvbiBzaG91bGQgYmUgQUNUSU9OX0RPV04gaWYgdGhpcyBjaGlsZCBpc24ndCBjdXJyZW50bHkgZ2V0dGluZworICAgICAgICAgICAgICAgICAgICAvLyBhbnkgZXZlbnRzLgorICAgICAgICAgICAgICAgICAgICBhY3Rpb24gPSBNb3Rpb25FdmVudC5BQ1RJT05fRE9XTjsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAvLyBGaWxsIGluIHRoZSBpbmRleCBwb3J0aW9uIG9mIHRoZSBhY3Rpb24gbGF0ZXIuCisgICAgICAgICAgICAgICAgICAgIG5lZWRzTmV3SW5kZXggPSB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSBpZiAobWFza2VkQWN0aW9uID09IE1vdGlvbkV2ZW50LkFDVElPTl9QT0lOVEVSX1VQKSB7CisgICAgICAgICAgICAgICAgYWN0aW9uSWQgPSBldi5nZXRQb2ludGVySWQoZXYuZ2V0QWN0aW9uSW5kZXgoKSk7CisgICAgICAgICAgICAgICAgaWYgKHBvaW50ZXJDb3VudCA9PSAxKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIFRoZSBuZXcgYWN0aW9uIHNob3VsZCBiZSBBQ1RJT05fVVAgaWYgdGhlcmUncyBvbmx5IG9uZSBwb2ludGVyIGxlZnQgZm9yCisgICAgICAgICAgICAgICAgICAgIC8vIHRoaXMgdGFyZ2V0LgorICAgICAgICAgICAgICAgICAgICBhY3Rpb24gPSBNb3Rpb25FdmVudC5BQ1RJT05fVVA7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gRmlsbCBpbiB0aGUgaW5kZXggcG9ydGlvbiBvZiB0aGUgYWN0aW9uIGxhdGVyLgorICAgICAgICAgICAgICAgICAgICBuZWVkc05ld0luZGV4ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChwb2ludGVyQ291bnQgPT0gMCkgeworICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBGaWxsIHRoZSBidWNrZXRzIHdpdGggcG9pbnRlciBkYXRhIQorICAgICAgICAgICAgZmluYWwgaW50IGV2ZW50UG9pbnRlckNvdW50ID0gZXYuZ2V0UG9pbnRlckNvdW50KCk7CisgICAgICAgICAgICBpbnQgYnVja2V0SW5kZXggPSAwOworICAgICAgICAgICAgaW50IG5ld0FjdGlvbkluZGV4ID0gLTE7CisgICAgICAgICAgICBmb3IgKGludCBldnAgPSAwOyBldnAgPCBldmVudFBvaW50ZXJDb3VudDsgZXZwKyspIHsKKyAgICAgICAgICAgICAgICBmaW5hbCBpbnQgaWQgPSBldi5nZXRQb2ludGVySWQoZXZwKTsKKworICAgICAgICAgICAgICAgIC8vIEFkZCB0aGlzIHBvaW50ZXIgdG8gdGhlIGJ1Y2tldCBpZiBpdCBpcyBuZXcgb3IgdGFyZ2V0ZWQgYXQgY2hpbGQKKyAgICAgICAgICAgICAgICBpZiAoaWQgPT0gYWN0aW9uSWQgfHwgZ2V0KGlkKSA9PSBjaGlsZCkgeworICAgICAgICAgICAgICAgICAgICAvLyBFeHBhbmQgc2NyYXRjaCBhcnJheXMgaWYgbmVlZGVkCisgICAgICAgICAgICAgICAgICAgIGlmIChtUG9pbnRlckNvb3Jkcy5sZW5ndGggPD0gYnVja2V0SW5kZXgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludFtdIHBvaW50ZXJJZHMgPSBuZXcgaW50W3BvaW50ZXJDb3VudF07CisgICAgICAgICAgICAgICAgICAgICAgICBNb3Rpb25FdmVudC5Qb2ludGVyQ29vcmRzW10gcG9pbnRlckNvb3JkcyA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBNb3Rpb25FdmVudC5Qb2ludGVyQ29vcmRzW3BvaW50ZXJDb3VudF07CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gbVBvaW50ZXJDb29yZHMubGVuZ3RoOyBpIDwgcG9pbnRlckNvb3Jkcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvaW50ZXJDb29yZHNbaV0gPSBuZXcgTW90aW9uRXZlbnQuUG9pbnRlckNvb3JkcygpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KG1Qb2ludGVyQ29vcmRzLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb2ludGVyQ29vcmRzLCAwLCBtUG9pbnRlckNvb3Jkcy5sZW5ndGgpOworICAgICAgICAgICAgICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weShtUG9pbnRlcklkcywgMCwgcG9pbnRlcklkcywgMCwgbVBvaW50ZXJJZHMubGVuZ3RoKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgbVBvaW50ZXJDb29yZHMgPSBwb2ludGVyQ29vcmRzOworICAgICAgICAgICAgICAgICAgICAgICAgbVBvaW50ZXJJZHMgPSBwb2ludGVySWRzOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgbVBvaW50ZXJJZHNbYnVja2V0SW5kZXhdID0gaWQ7CisgICAgICAgICAgICAgICAgICAgIGV2LmdldFBvaW50ZXJDb29yZHMoZXZwLCBtUG9pbnRlckNvb3Jkc1tidWNrZXRJbmRleF0pOworCisgICAgICAgICAgICAgICAgICAgIGlmIChuZWVkc05ld0luZGV4ICYmIGlkID09IGFjdGlvbklkKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBuZXdBY3Rpb25JbmRleCA9IGJ1Y2tldEluZGV4OworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgYnVja2V0SW5kZXgrKzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIEVuY29kZSB0aGUgbmV3IGFjdGlvbiBpbmRleCBpZiB3ZSBoYXZlIG9uZQorICAgICAgICAgICAgaWYgKG5ld0FjdGlvbkluZGV4ID49IDApIHsKKyAgICAgICAgICAgICAgICBhY3Rpb24gPSAoYWN0aW9uICYgTW90aW9uRXZlbnQuQUNUSU9OX01BU0spIHwKKyAgICAgICAgICAgICAgICAgICAgICAgIChuZXdBY3Rpb25JbmRleCA8PCBNb3Rpb25FdmVudC5BQ1RJT05fUE9JTlRFUl9JTkRFWF9TSElGVCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiBNb3Rpb25FdmVudC5vYnRhaW4oZG93blRpbWUsIGV2LmdldEV2ZW50VGltZSgpLAorICAgICAgICAgICAgICAgICAgICBhY3Rpb24sIHBvaW50ZXJDb3VudCwgbVBvaW50ZXJJZHMsIG1Qb2ludGVyQ29vcmRzLCBldi5nZXRNZXRhU3RhdGUoKSwKKyAgICAgICAgICAgICAgICAgICAgZXYuZ2V0WFByZWNpc2lvbigpLCBldi5nZXRZUHJlY2lzaW9uKCksIGV2LmdldERldmljZUlkKCksIGV2LmdldEVkZ2VGbGFncygpLAorICAgICAgICAgICAgICAgICAgICBldi5nZXRTb3VyY2UoKSwgZXYuZ2V0RmxhZ3MoKSk7CisgICAgICAgIH0KKworICAgICAgICBzdGF0aWMgY2xhc3MgVGFyZ2V0SW5mbyB7CisgICAgICAgICAgICBwdWJsaWMgVmlldyB2aWV3OworICAgICAgICAgICAgcHVibGljIGxvbmcgZG93blRpbWU7CisKKyAgICAgICAgICAgIHByaXZhdGUgVGFyZ2V0SW5mbyBtTmV4dFJlY3ljbGVkOworCisgICAgICAgICAgICBwcml2YXRlIHN0YXRpYyBUYXJnZXRJbmZvIHNSZWN5Y2xlQmluOworICAgICAgICAgICAgcHJpdmF0ZSBzdGF0aWMgaW50IHNSZWN5Y2xlZENvdW50OworCisgICAgICAgICAgICBwcml2YXRlIHN0YXRpYyBpbnQgTUFYX1JFQ1lDTEVEID0gMTU7CisKKyAgICAgICAgICAgIHByaXZhdGUgVGFyZ2V0SW5mbygpIHsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIHN0YXRpYyBUYXJnZXRJbmZvIG9idGFpbihWaWV3IHYsIGxvbmcgdGltZSkgeworICAgICAgICAgICAgICAgIFRhcmdldEluZm8gaW5mbzsKKyAgICAgICAgICAgICAgICBpZiAoc1JlY3ljbGVCaW4gPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBpbmZvID0gbmV3IFRhcmdldEluZm8oKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBpbmZvID0gc1JlY3ljbGVCaW47CisgICAgICAgICAgICAgICAgICAgIHNSZWN5Y2xlQmluID0gaW5mby5tTmV4dFJlY3ljbGVkOworICAgICAgICAgICAgICAgICAgICBzUmVjeWNsZWRDb3VudC0tOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpbmZvLnZpZXcgPSB2OworICAgICAgICAgICAgICAgIGluZm8uZG93blRpbWUgPSB0aW1lOworICAgICAgICAgICAgICAgIHJldHVybiBpbmZvOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgdm9pZCByZWN5Y2xlKCkgeworICAgICAgICAgICAgICAgIGlmIChzUmVjeWNsZWRDb3VudCA+PSBNQVhfUkVDWUNMRUQpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBtTmV4dFJlY3ljbGVkID0gc1JlY3ljbGVCaW47CisgICAgICAgICAgICAgICAgc1JlY3ljbGVCaW4gPSB0aGlzOworICAgICAgICAgICAgICAgIHNSZWN5Y2xlZENvdW50Kys7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CiB9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC92aWV3L1ZpZXdQYXJlbnQuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvVmlld1BhcmVudC5qYXZhCmluZGV4IGI0NTZjNWQuLmQ3ZDRjM2YgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvVmlld1BhcmVudC5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvVmlld1BhcmVudC5qYXZhCkBAIC0xNjIsNiArMTYyLDIwIEBACiAgICAgcHVibGljIHZvaWQgY3JlYXRlQ29udGV4dE1lbnUoQ29udGV4dE1lbnUgbWVudSk7CiAKICAgICAvKioKKyAgICAgKiBTdGFydCBhbiBhY3Rpb24gbW9kZSBmb3IgdGhlIHNwZWNpZmllZCB2aWV3LgorICAgICAqIDxwPgorICAgICAqIEluIG1vc3QgY2FzZXMsIGEgc3ViY2xhc3MgZG9lcyBub3QgbmVlZCB0byBvdmVycmlkZSB0aGlzLiBIb3dldmVyLCBpZiB0aGUKKyAgICAgKiBzdWJjbGFzcyBpcyBhZGRlZCBkaXJlY3RseSB0byB0aGUgd2luZG93IG1hbmFnZXIgKGZvciBleGFtcGxlLAorICAgICAqIHtAbGluayBWaWV3TWFuYWdlciNhZGRWaWV3KFZpZXcsIGFuZHJvaWQudmlldy5WaWV3R3JvdXAuTGF5b3V0UGFyYW1zKX0pCisgICAgICogdGhlbiBpdCBzaG91bGQgb3ZlcnJpZGUgdGhpcyBhbmQgc3RhcnQgdGhlIGFjdGlvbiBtb2RlLgorICAgICAqCisgICAgICogQHBhcmFtIG9yaWdpbmFsVmlldyBUaGUgc291cmNlIHZpZXcgd2hlcmUgdGhlIGFjdGlvbiBtb2RlIHdhcyBmaXJzdCBpbnZva2VkCisgICAgICogQHBhcmFtIGNhbGxiYWNrIFRoZSBjYWxsYmFjayB0aGF0IHdpbGwgaGFuZGxlIGxpZmVjeWNsZSBldmVudHMgZm9yIHRoZSBhY3Rpb24gbW9kZQorICAgICAqIEByZXR1cm4gVGhlIG5ldyBhY3Rpb24gbW9kZSBpZiBpdCB3YXMgc3RhcnRlZCwgbnVsbCBvdGhlcndpc2UKKyAgICAgKi8KKyAgICBwdWJsaWMgQWN0aW9uTW9kZSBzdGFydEFjdGlvbk1vZGVGb3JDaGlsZChWaWV3IG9yaWdpbmFsVmlldywgQWN0aW9uTW9kZS5DYWxsYmFjayBjYWxsYmFjayk7CisKKyAgICAvKioKICAgICAgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgb24gdGhlIHBhcmVudCB3aGVuIGEgY2hpbGQncyBkcmF3YWJsZSBzdGF0ZQogICAgICAqIGhhcyBjaGFuZ2VkLgogICAgICAqCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC92aWV3L1ZpZXdSb290LmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC92aWV3L1ZpZXdSb290LmphdmEKaW5kZXggNTdjOTA1NS4uN2IyMGI4YiAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9WaWV3Um9vdC5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvVmlld1Jvb3QuamF2YQpAQCAtNTYsMTAgKzU2LDYgQEAKIGltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwogCi1pbXBvcnQgamF2YXgubWljcm9lZGl0aW9uLmtocm9ub3MuZWdsLio7Ci1pbXBvcnQgamF2YXgubWljcm9lZGl0aW9uLmtocm9ub3Mub3BlbmdsZXMuKjsKLWltcG9ydCBzdGF0aWMgamF2YXgubWljcm9lZGl0aW9uLmtocm9ub3Mub3BlbmdsZXMuR0wxMC4qOwotCiAvKioKICAqIFRoZSB0b3Agb2YgYSB2aWV3IGhpZXJhcmNoeSwgaW1wbGVtZW50aW5nIHRoZSBuZWVkZWQgcHJvdG9jb2wgYmV0d2VlbiBWaWV3CiAgKiBhbmQgdGhlIFdpbmRvd01hbmFnZXIuICBUaGlzIGlzIGZvciB0aGUgbW9zdCBwYXJ0IGFuIGludGVybmFsIGltcGxlbWVudGF0aW9uCkBAIC02NywxNCArNjMsMTIgQEAKICAqCiAgKiB7QGhpZGV9CiAgKi8KLUBTdXBwcmVzc1dhcm5pbmdzKHsiRW1wdHlDYXRjaEJsb2NrIn0pCi1wdWJsaWMgZmluYWwgY2xhc3MgVmlld1Jvb3QgZXh0ZW5kcyBIYW5kbGVyIGltcGxlbWVudHMgVmlld1BhcmVudCwKLSAgICAgICAgVmlldy5BdHRhY2hJbmZvLkNhbGxiYWNrcyB7CitAU3VwcHJlc3NXYXJuaW5ncyh7IkVtcHR5Q2F0Y2hCbG9jayIsICJQb2ludGxlc3NCb29sZWFuRXhwcmVzc2lvbiJ9KQorcHVibGljIGZpbmFsIGNsYXNzIFZpZXdSb290IGV4dGVuZHMgSGFuZGxlciBpbXBsZW1lbnRzIFZpZXdQYXJlbnQsIFZpZXcuQXR0YWNoSW5mby5DYWxsYmFja3MgewogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiVmlld1Jvb3QiOwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gREJHID0gZmFsc2U7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBTSE9XX0ZQUyA9IGZhbHNlOwotICAgIEBTdXBwcmVzc1dhcm5pbmdzKHsiQ29uc3RhbnRDb25kaXRpb25hbEV4cHJlc3Npb24ifSkKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIExPQ0FMX0xPR1YgPSBmYWxzZSA/IENvbmZpZy5MT0dEIDogQ29uZmlnLkxPR1Y7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBMT0NBTF9MT0dWID0gZmFsc2U7CiAgICAgLyoqIEBub2luc3BlY3Rpb24gUG9pbnRsZXNzQm9vbGVhbkV4cHJlc3Npb24qLwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUdfRFJBVyA9IGZhbHNlIHx8IExPQ0FMX0xPR1Y7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVR19MQVlPVVQgPSBmYWxzZSB8fCBMT0NBTF9MT0dWOwpAQCAtOTUsOCArODksNiBAQAogICAgICAqLwogICAgIHN0YXRpYyBmaW5hbCBpbnQgTUFYX1RSQUNLQkFMTF9ERUxBWSA9IDI1MDsKIAotICAgIHN0YXRpYyBsb25nIHNJbnN0YW5jZUNvdW50ID0gMDsKLQogICAgIHN0YXRpYyBJV2luZG93U2Vzc2lvbiBzV2luZG93U2Vzc2lvbjsKIAogICAgIHN0YXRpYyBmaW5hbCBPYmplY3QgbVN0YXRpY0luaXQgPSBuZXcgT2JqZWN0KCk7CkBAIC0yMDQsMTQgKzE5Niw3IEBACiAgICAgaW50IG1DdXJTY3JvbGxZOwogICAgIFNjcm9sbGVyIG1TY3JvbGxlcjsKIAotICAgIEVHTDEwIG1FZ2w7Ci0gICAgRUdMRGlzcGxheSBtRWdsRGlzcGxheTsKLSAgICBFR0xDb250ZXh0IG1FZ2xDb250ZXh0OwotICAgIEVHTFN1cmZhY2UgbUVnbFN1cmZhY2U7Ci0gICAgR0wxMSBtR0w7Ci0gICAgQ2FudmFzIG1HbENhbnZhczsKLSAgICBib29sZWFuIG1Vc2VHTDsKLSAgICBib29sZWFuIG1HbFdhbnRlZDsKKyAgICBIYXJkd2FyZVJlbmRlcmVyIG1Id1JlbmRlcmVyOwogCiAgICAgZmluYWwgVmlld0NvbmZpZ3VyYXRpb24gbVZpZXdDb25maWd1cmF0aW9uOwogCkBAIC0yNDEsMTMgKzIyNiwxMiBAQAogICAgIHB1YmxpYyBWaWV3Um9vdChDb250ZXh0IGNvbnRleHQpIHsKICAgICAgICAgc3VwZXIoKTsKIAotICAgICAgICBpZiAoTUVBU1VSRV9MQVRFTkNZICYmIGx0ID09IG51bGwpIHsKLSAgICAgICAgICAgIGx0ID0gbmV3IExhdGVuY3lUaW1lcigxMDAsIDEwMDApOworICAgICAgICBpZiAoTUVBU1VSRV9MQVRFTkNZKSB7CisgICAgICAgICAgICBpZiAobHQgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGx0ID0gbmV3IExhdGVuY3lUaW1lcigxMDAsIDEwMDApOworICAgICAgICAgICAgfQogICAgICAgICB9CiAKLSAgICAgICAgLy8gRm9yIGRlYnVnIG9ubHkKLSAgICAgICAgLy8rK3NJbnN0YW5jZUNvdW50OwotCiAgICAgICAgIC8vIEluaXRpYWxpemUgdGhlIHN0YXRpY3Mgd2hlbiB0aGlzIGNsYXNzIGlzIGZpcnN0IGluc3RhbnRpYXRlZC4gVGhpcyBpcwogICAgICAgICAvLyBkb25lIGhlcmUgaW5zdGVhZCBvZiBpbiB0aGUgc3RhdGljIGJsb2NrIGJlY2F1c2UgWnlnb3RlIGRvZXMgbm90CiAgICAgICAgIC8vIGFsbG93IHRoZSBzcGF3bmluZyBvZiB0aHJlYWRzLgpAQCAtMjYyLDcgKzI0Niw3IEBACiAgICAgICAgIG1UZW1wUmVjdCA9IG5ldyBSZWN0KCk7CiAgICAgICAgIG1WaXNSZWN0ID0gbmV3IFJlY3QoKTsKICAgICAgICAgbVdpbkZyYW1lID0gbmV3IFJlY3QoKTsKLSAgICAgICAgbVdpbmRvdyA9IG5ldyBXKHRoaXMsIGNvbnRleHQpOworICAgICAgICBtV2luZG93ID0gbmV3IFcodGhpcyk7CiAgICAgICAgIG1JbnB1dE1ldGhvZENhbGxiYWNrID0gbmV3IElucHV0TWV0aG9kQ2FsbGJhY2sodGhpcyk7CiAgICAgICAgIG1WaWV3VmlzaWJpbGl0eSA9IFZpZXcuR09ORTsKICAgICAgICAgbVRyYW5zcGFyZW50UmVnaW9uID0gbmV3IFJlZ2lvbigpOwpAQCAtMjc0LDE5ICsyNTgsNiBAQAogICAgICAgICBtRGVuc2l0eSA9IGNvbnRleHQuZ2V0UmVzb3VyY2VzKCkuZ2V0RGlzcGxheU1ldHJpY3MoKS5kZW5zaXR5RHBpOwogICAgIH0KIAotICAgIC8vIEZvciBkZWJ1ZyBvbmx5Ci0gICAgLyoKLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCBmaW5hbGl6ZSgpIHRocm93cyBUaHJvd2FibGUgewotICAgICAgICBzdXBlci5maW5hbGl6ZSgpOwotICAgICAgICAtLXNJbnN0YW5jZUNvdW50OwotICAgIH0KLSAgICAqLwotCi0gICAgcHVibGljIHN0YXRpYyBsb25nIGdldEluc3RhbmNlQ291bnQoKSB7Ci0gICAgICAgIHJldHVybiBzSW5zdGFuY2VDb3VudDsKLSAgICB9Ci0KICAgICBwdWJsaWMgc3RhdGljIHZvaWQgYWRkRmlyc3REcmF3SGFuZGxlcihSdW5uYWJsZSBjYWxsYmFjaykgewogICAgICAgICBzeW5jaHJvbml6ZWQgKHNGaXJzdERyYXdIYW5kbGVycykgewogICAgICAgICAgICAgaWYgKCFzRmlyc3REcmF3Q29tcGxldGUpIHsKQEAgLTMzMCwxMjIgKzMwMSwxOCBAQAogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogCi0gICAgcHJpdmF0ZSB2b2lkIGluaXRpYWxpemVHTCgpIHsKLSAgICAgICAgaW5pdGlhbGl6ZUdMSW5uZXIoKTsKLSAgICAgICAgaW50IGVyciA9IG1FZ2wuZWdsR2V0RXJyb3IoKTsKLSAgICAgICAgaWYgKGVyciAhPSBFR0wxMC5FR0xfU1VDQ0VTUykgewotICAgICAgICAgICAgLy8gZ2l2ZS11cCBvbiB1c2luZyBHTAotICAgICAgICAgICAgZGVzdHJveUdMKCk7Ci0gICAgICAgICAgICBtR2xXYW50ZWQgPSBmYWxzZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBpbml0aWFsaXplR0xJbm5lcigpIHsKLSAgICAgICAgZmluYWwgRUdMMTAgZWdsID0gKEVHTDEwKSBFR0xDb250ZXh0LmdldEVHTCgpOwotICAgICAgICBtRWdsID0gZWdsOwotCi0gICAgICAgIC8qCi0gICAgICAgICAqIEdldCB0byB0aGUgZGVmYXVsdCBkaXNwbGF5LgotICAgICAgICAgKi8KLSAgICAgICAgZmluYWwgRUdMRGlzcGxheSBlZ2xEaXNwbGF5ID0gZWdsLmVnbEdldERpc3BsYXkoRUdMMTAuRUdMX0RFRkFVTFRfRElTUExBWSk7Ci0gICAgICAgIG1FZ2xEaXNwbGF5ID0gZWdsRGlzcGxheTsKLQotICAgICAgICAvKgotICAgICAgICAgKiBXZSBjYW4gbm93IGluaXRpYWxpemUgRUdMIGZvciB0aGF0IGRpc3BsYXkKLSAgICAgICAgICovCi0gICAgICAgIGludFtdIHZlcnNpb24gPSBuZXcgaW50WzJdOwotICAgICAgICBlZ2wuZWdsSW5pdGlhbGl6ZShlZ2xEaXNwbGF5LCB2ZXJzaW9uKTsKLQotICAgICAgICAvKgotICAgICAgICAgKiBTcGVjaWZ5IGEgY29uZmlndXJhdGlvbiBmb3Igb3VyIG9wZW5nbCBzZXNzaW9uCi0gICAgICAgICAqIGFuZCBncmFiIHRoZSBmaXJzdCBjb25maWd1cmF0aW9uIHRoYXQgbWF0Y2hlcyBpcwotICAgICAgICAgKi8KLSAgICAgICAgZmluYWwgaW50W10gY29uZmlnU3BlYyA9IHsKLSAgICAgICAgICAgICAgICBFR0wxMC5FR0xfUkVEX1NJWkUsICAgICAgNSwKLSAgICAgICAgICAgICAgICBFR0wxMC5FR0xfR1JFRU5fU0laRSwgICAgNiwKLSAgICAgICAgICAgICAgICBFR0wxMC5FR0xfQkxVRV9TSVpFLCAgICAgNSwKLSAgICAgICAgICAgICAgICBFR0wxMC5FR0xfREVQVEhfU0laRSwgICAgMCwKLSAgICAgICAgICAgICAgICBFR0wxMC5FR0xfTk9ORQotICAgICAgICB9OwotICAgICAgICBmaW5hbCBFR0xDb25maWdbXSBjb25maWdzID0gbmV3IEVHTENvbmZpZ1sxXTsKLSAgICAgICAgZmluYWwgaW50W10gbnVtX2NvbmZpZyA9IG5ldyBpbnRbMV07Ci0gICAgICAgIGVnbC5lZ2xDaG9vc2VDb25maWcoZWdsRGlzcGxheSwgY29uZmlnU3BlYywgY29uZmlncywgMSwgbnVtX2NvbmZpZyk7Ci0gICAgICAgIGZpbmFsIEVHTENvbmZpZyBjb25maWcgPSBjb25maWdzWzBdOwotCi0gICAgICAgIC8qCi0gICAgICAgICAqIENyZWF0ZSBhbiBPcGVuR0wgRVMgY29udGV4dC4gVGhpcyBtdXN0IGJlIGRvbmUgb25seSBvbmNlLCBhbgotICAgICAgICAgKiBPcGVuR0wgY29udGV4dCBpcyBhIHNvbWV3aGF0IGhlYXZ5IG9iamVjdC4KLSAgICAgICAgICovCi0gICAgICAgIGZpbmFsIEVHTENvbnRleHQgY29udGV4dCA9IGVnbC5lZ2xDcmVhdGVDb250ZXh0KGVnbERpc3BsYXksIGNvbmZpZywKLSAgICAgICAgICAgICAgICBFR0wxMC5FR0xfTk9fQ09OVEVYVCwgbnVsbCk7Ci0gICAgICAgIG1FZ2xDb250ZXh0ID0gY29udGV4dDsKLQotICAgICAgICAvKgotICAgICAgICAgKiBDcmVhdGUgYW4gRUdMIHN1cmZhY2Ugd2UgY2FuIHJlbmRlciBpbnRvLgotICAgICAgICAgKi8KLSAgICAgICAgZmluYWwgRUdMU3VyZmFjZSBzdXJmYWNlID0gZWdsLmVnbENyZWF0ZVdpbmRvd1N1cmZhY2UoZWdsRGlzcGxheSwgY29uZmlnLCBtSG9sZGVyLCBudWxsKTsKLSAgICAgICAgbUVnbFN1cmZhY2UgPSBzdXJmYWNlOwotCi0gICAgICAgIC8qCi0gICAgICAgICAqIEJlZm9yZSB3ZSBjYW4gaXNzdWUgR0wgY29tbWFuZHMsIHdlIG5lZWQgdG8gbWFrZSBzdXJlCi0gICAgICAgICAqIHRoZSBjb250ZXh0IGlzIGN1cnJlbnQgYW5kIGJvdW5kIHRvIGEgc3VyZmFjZS4KLSAgICAgICAgICovCi0gICAgICAgIGVnbC5lZ2xNYWtlQ3VycmVudChlZ2xEaXNwbGF5LCBzdXJmYWNlLCBzdXJmYWNlLCBjb250ZXh0KTsKLQotICAgICAgICAvKgotICAgICAgICAgKiBHZXQgdG8gdGhlIGFwcHJvcHJpYXRlIEdMIGludGVyZmFjZS4KLSAgICAgICAgICogVGhpcyBpcyBzaW1wbHkgZG9uZSBieSBjYXN0aW5nIHRoZSBHTCBjb250ZXh0IHRvIGVpdGhlcgotICAgICAgICAgKiBHTDEwIG9yIEdMMTEuCi0gICAgICAgICAqLwotICAgICAgICBmaW5hbCBHTDExIGdsID0gKEdMMTEpIGNvbnRleHQuZ2V0R0woKTsKLSAgICAgICAgbUdMID0gZ2w7Ci0gICAgICAgIG1HbENhbnZhcyA9IG5ldyBDYW52YXMoZ2wpOwotICAgICAgICBtVXNlR0wgPSB0cnVlOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBkZXN0cm95R0woKSB7Ci0gICAgICAgIC8vIGluZm9ybSBza2lhIHRoYXQgdGhlIGNvbnRleHQgaXMgZ29uZQotICAgICAgICBuYXRpdmVBYmFuZG9uR2xDYWNoZXMoKTsKLQotICAgICAgICBtRWdsLmVnbE1ha2VDdXJyZW50KG1FZ2xEaXNwbGF5LCBFR0wxMC5FR0xfTk9fU1VSRkFDRSwKLSAgICAgICAgICAgICAgICBFR0wxMC5FR0xfTk9fU1VSRkFDRSwgRUdMMTAuRUdMX05PX0NPTlRFWFQpOwotICAgICAgICBtRWdsLmVnbERlc3Ryb3lDb250ZXh0KG1FZ2xEaXNwbGF5LCBtRWdsQ29udGV4dCk7Ci0gICAgICAgIG1FZ2wuZWdsRGVzdHJveVN1cmZhY2UobUVnbERpc3BsYXksIG1FZ2xTdXJmYWNlKTsKLSAgICAgICAgbUVnbC5lZ2xUZXJtaW5hdGUobUVnbERpc3BsYXkpOwotICAgICAgICBtRWdsQ29udGV4dCA9IG51bGw7Ci0gICAgICAgIG1FZ2xTdXJmYWNlID0gbnVsbDsKLSAgICAgICAgbUVnbERpc3BsYXkgPSBudWxsOwotICAgICAgICBtRWdsID0gbnVsbDsKLSAgICAgICAgbUdsQ2FudmFzID0gbnVsbDsKLSAgICAgICAgbUdMID0gbnVsbDsKLSAgICAgICAgbVVzZUdMID0gZmFsc2U7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGNoZWNrRWdsRXJyb3JzKCkgewotICAgICAgICBpZiAobVVzZUdMKSB7Ci0gICAgICAgICAgICBpbnQgZXJyID0gbUVnbC5lZ2xHZXRFcnJvcigpOwotICAgICAgICAgICAgaWYgKGVyciAhPSBFR0wxMC5FR0xfU1VDQ0VTUykgewotICAgICAgICAgICAgICAgIC8vIHNvbWV0aGluZyBiYWQgaGFzIGhhcHBlbmVkIHJldmVydCB0bwotICAgICAgICAgICAgICAgIC8vIG5vcm1hbCByZW5kZXJpbmcuCi0gICAgICAgICAgICAgICAgZGVzdHJveUdMKCk7Ci0gICAgICAgICAgICAgICAgaWYgKGVyciAhPSBFR0wxMS5FR0xfQ09OVEVYVF9MT1NUKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIHdlJ2xsIHRyeSBhZ2FpbiBpZiBpdCB3YXMgY29udGV4dCBsb3N0Ci0gICAgICAgICAgICAgICAgICAgIG1HbFdhbnRlZCA9IGZhbHNlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQogICAgIC8qKgogICAgICAqIFdlIGhhdmUgb25lIGNoaWxkCiAgICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0VmlldyhWaWV3IHZpZXcsIFdpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zIGF0dHJzLAotICAgICAgICAgICAgVmlldyBwYW5lbFBhcmVudFZpZXcpIHsKKyAgICBwdWJsaWMgdm9pZCBzZXRWaWV3KFZpZXcgdmlldywgV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMgYXR0cnMsIFZpZXcgcGFuZWxQYXJlbnRWaWV3KSB7CiAgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgewogICAgICAgICAgICAgaWYgKG1WaWV3ID09IG51bGwpIHsKICAgICAgICAgICAgICAgICBtVmlldyA9IHZpZXc7CiAgICAgICAgICAgICAgICAgbVdpbmRvd0F0dHJpYnV0ZXMuY29weUZyb20oYXR0cnMpOwogICAgICAgICAgICAgICAgIGF0dHJzID0gbVdpbmRvd0F0dHJpYnV0ZXM7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgZW5hYmxlSGFyZHdhcmVBY2NlbGVyYXRpb24oYXR0cnMpOworCiAgICAgICAgICAgICAgICAgaWYgKHZpZXcgaW5zdGFuY2VvZiBSb290Vmlld1N1cmZhY2VUYWtlcikgewogICAgICAgICAgICAgICAgICAgICBtU3VyZmFjZUhvbGRlckNhbGxiYWNrID0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFJvb3RWaWV3U3VyZmFjZVRha2VyKXZpZXcpLndpbGxZb3VUYWtlVGhlU3VyZmFjZSgpOwpAQCAtNTc1LDYgKzQ0MiwyNCBAQAogICAgICAgICB9CiAgICAgfQogCisgICAgcHJpdmF0ZSB2b2lkIGVuYWJsZUhhcmR3YXJlQWNjZWxlcmF0aW9uKFdpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zIGF0dHJzKSB7CisgICAgICAgIC8vIE9ubHkgZW5hYmxlIGhhcmR3YXJlIGFjY2VsZXJhdGlvbiBpZiB3ZSBhcmUgbm90IGluIHRoZSBzeXN0ZW0gcHJvY2VzcworICAgICAgICAvLyBUaGUgd2luZG93IG1hbmFnZXIgY3JlYXRlcyBWaWV3Um9vdHMgdG8gZGlzcGxheSBhbmltYXRlZCBwcmV2aWV3IHdpbmRvd3MKKyAgICAgICAgLy8gb2YgbGF1bmNoaW5nIGFwcHMgYW5kIHdlIGRvbid0IHdhbnQgdGhvc2UgdG8gYmUgaGFyZHdhcmUgYWNjZWxlcmF0ZWQKKyAgICAgICAgaWYgKCFIYXJkd2FyZVJlbmRlcmVyLnNSZW5kZXJlckRpc2FibGVkKSB7CisgICAgICAgICAgICAvLyBUcnkgdG8gZW5hYmxlIGhhcmR3YXJlIGFjY2VsZXJhdGlvbiBpZiByZXF1ZXN0ZWQKKyAgICAgICAgICAgIGlmIChhdHRycyAhPSBudWxsICYmCisgICAgICAgICAgICAgICAgICAgIChhdHRycy5mbGFncyAmIFdpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zLkZMQUdfSEFSRFdBUkVfQUNDRUxFUkFURUQpICE9IDApIHsKKyAgICAgICAgICAgICAgICBmaW5hbCBib29sZWFuIHRyYW5zbHVjZW50ID0gYXR0cnMuZm9ybWF0ICE9IFBpeGVsRm9ybWF0Lk9QQVFVRTsKKyAgICAgICAgICAgICAgICBpZiAobUh3UmVuZGVyZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBtSHdSZW5kZXJlci5kZXN0cm95KHRydWUpOworICAgICAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgbUh3UmVuZGVyZXIgPSBIYXJkd2FyZVJlbmRlcmVyLmNyZWF0ZUdsUmVuZGVyZXIoMiwgdHJhbnNsdWNlbnQpOworICAgICAgICAgICAgICAgIG1BdHRhY2hJbmZvLm1IYXJkd2FyZUFjY2VsZXJhdGVkID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKwogICAgIHB1YmxpYyBWaWV3IGdldFZpZXcoKSB7CiAgICAgICAgIHJldHVybiBtVmlldzsKICAgICB9CkBAIC03MzEsOCArNjE2LDYgQEAKICAgICAgICAgYm9vbGVhbiB2aWV3VmlzaWJpbGl0eUNoYW5nZWQgPSBtVmlld1Zpc2liaWxpdHkgIT0gdmlld1Zpc2liaWxpdHkKICAgICAgICAgICAgICAgICB8fCBtTmV3U3VyZmFjZU5lZWRlZDsKIAotICAgICAgICBmbG9hdCBhcHBTY2FsZSA9IG1BdHRhY2hJbmZvLm1BcHBsaWNhdGlvblNjYWxlOwotCiAgICAgICAgIFdpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zIHBhcmFtcyA9IG51bGw7CiAgICAgICAgIGlmIChtV2luZG93QXR0cmlidXRlc0NoYW5nZWQpIHsKICAgICAgICAgICAgIG1XaW5kb3dBdHRyaWJ1dGVzQ2hhbmdlZCA9IGZhbHNlOwpAQCAtNzgwLDkgKzY2Myw5IEBACiAgICAgICAgICAgICBhdHRhY2hJbmZvLm1XaW5kb3dWaXNpYmlsaXR5ID0gdmlld1Zpc2liaWxpdHk7CiAgICAgICAgICAgICBob3N0LmRpc3BhdGNoV2luZG93VmlzaWJpbGl0eUNoYW5nZWQodmlld1Zpc2liaWxpdHkpOwogICAgICAgICAgICAgaWYgKHZpZXdWaXNpYmlsaXR5ICE9IFZpZXcuVklTSUJMRSB8fCBtTmV3U3VyZmFjZU5lZWRlZCkgewotICAgICAgICAgICAgICAgIGlmIChtVXNlR0wpIHsKLSAgICAgICAgICAgICAgICAgICAgZGVzdHJveUdMKCk7Ci0gICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChtSHdSZW5kZXJlciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIG1Id1JlbmRlcmVyLmRlc3Ryb3koZmFsc2UpOworICAgICAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgCiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAodmlld1Zpc2liaWxpdHkgPT0gVmlldy5HT05FKSB7CiAgICAgICAgICAgICAgICAgLy8gQWZ0ZXIgbWFraW5nIGEgd2luZG93IGdvbmUsIHdlIHdpbGwgY291bnQgaXQgYXMgYmVpbmcKQEAgLTg5NywxMCArNzgwLDEyIEBACiAKICAgICAgICAgZmluYWwgYm9vbGVhbiBjb21wdXRlc0ludGVybmFsSW5zZXRzID0KICAgICAgICAgICAgICAgICBhdHRhY2hJbmZvLm1UcmVlT2JzZXJ2ZXIuaGFzQ29tcHV0ZUludGVybmFsSW5zZXRzTGlzdGVuZXJzKCk7CisKICAgICAgICAgYm9vbGVhbiBpbnNldHNQZW5kaW5nID0gZmFsc2U7CiAgICAgICAgIGludCByZWxheW91dFJlc3VsdCA9IDA7Ci0gICAgICAgIGlmIChtRmlyc3QgfHwgd2luZG93U2hvdWxkUmVzaXplIHx8IGluc2V0c0NoYW5nZWQKLSAgICAgICAgICAgICAgICB8fCB2aWV3VmlzaWJpbGl0eUNoYW5nZWQgfHwgcGFyYW1zICE9IG51bGwpIHsKKworICAgICAgICBpZiAobUZpcnN0IHx8IHdpbmRvd1Nob3VsZFJlc2l6ZSB8fCBpbnNldHNDaGFuZ2VkIHx8CisgICAgICAgICAgICAgICAgdmlld1Zpc2liaWxpdHlDaGFuZ2VkIHx8IHBhcmFtcyAhPSBudWxsKSB7CiAKICAgICAgICAgICAgIGlmICh2aWV3VmlzaWJpbGl0eSA9PSBWaWV3LlZJU0lCTEUpIHsKICAgICAgICAgICAgICAgICAvLyBJZiB0aGlzIHdpbmRvdyBpcyBnaXZpbmcgaW50ZXJuYWwgaW5zZXRzIHRvIHRoZSB3aW5kb3cKQEAgLTkxMiwyNiArNzk3LDE5IEBACiAgICAgICAgICAgICAgICAgLy8gd2luZG93LCB3YWl0aW5nIHVudGlsIHdlIGNhbiBmaW5pc2ggbGF5aW5nIG91dCB0aGlzIHdpbmRvdwogICAgICAgICAgICAgICAgIC8vIGFuZCBnZXQgYmFjayB0byB0aGUgd2luZG93IG1hbmFnZXIgd2l0aCB0aGUgdWx0aW1hdGVseQogICAgICAgICAgICAgICAgIC8vIGNvbXB1dGVkIGluc2V0cy4KLSAgICAgICAgICAgICAgICBpbnNldHNQZW5kaW5nID0gY29tcHV0ZXNJbnRlcm5hbEluc2V0cwotICAgICAgICAgICAgICAgICAgICAgICAgJiYgKG1GaXJzdCB8fCB2aWV3VmlzaWJpbGl0eUNoYW5nZWQpOwotCi0gICAgICAgICAgICAgICAgaWYgKG1XaW5kb3dBdHRyaWJ1dGVzLm1lbW9yeVR5cGUgPT0gV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMuTUVNT1JZX1RZUEVfR1BVKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChwYXJhbXMgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1zID0gbVdpbmRvd0F0dHJpYnV0ZXM7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgbUdsV2FudGVkID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaW5zZXRzUGVuZGluZyA9IGNvbXB1dGVzSW50ZXJuYWxJbnNldHMgJiYgKG1GaXJzdCB8fCB2aWV3VmlzaWJpbGl0eUNoYW5nZWQpOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBpZiAobVN1cmZhY2VIb2xkZXIgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgIG1TdXJmYWNlSG9sZGVyLm1TdXJmYWNlTG9jay5sb2NrKCk7CiAgICAgICAgICAgICAgICAgbURyYXdpbmdBbGxvd2VkID0gdHJ1ZTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgYm9vbGVhbiBpbml0aWFsaXplZCA9IGZhbHNlOworCisgICAgICAgICAgICBib29sZWFuIGh3SW50aWFsaXplZCA9IGZhbHNlOwogICAgICAgICAgICAgYm9vbGVhbiBjb250ZW50SW5zZXRzQ2hhbmdlZCA9IGZhbHNlOwogICAgICAgICAgICAgYm9vbGVhbiB2aXNpYmxlSW5zZXRzQ2hhbmdlZDsKICAgICAgICAgICAgIGJvb2xlYW4gaGFkU3VyZmFjZSA9IG1TdXJmYWNlLmlzVmFsaWQoKTsKKwogICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICBpbnQgZmwgPSAwOwogICAgICAgICAgICAgICAgIGlmIChwYXJhbXMgIT0gbnVsbCkgewpAQCAtOTkxLDkgKzg2OSw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICBmdWxsUmVkcmF3TmVlZGVkID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgIG1QcmV2aW91c1RyYW5zcGFyZW50UmVnaW9uLnNldEVtcHR5KCk7CiAKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtR2xXYW50ZWQgJiYgIW1Vc2VHTCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluaXRpYWxpemVHTCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluaXRpYWxpemVkID0gbUdsQ2FudmFzICE9IG51bGw7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobUh3UmVuZGVyZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGh3SW50aWFsaXplZCA9IG1Id1JlbmRlcmVyLmluaXRpYWxpemUobUhvbGRlcik7CiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCFtU3VyZmFjZS5pc1ZhbGlkKCkpIHsKQEAgLTEwNzAsMTAgKzk0Nyw5IEBACiAgICAgICAgICAgICAgICAgICAgIG1TdXJmYWNlSG9sZGVyLm1TdXJmYWNlTG9jay51bmxvY2soKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmIChpbml0aWFsaXplZCkgewotICAgICAgICAgICAgICAgIG1HbENhbnZhcy5zZXRWaWV3cG9ydCgoaW50KSAobVdpZHRoICogYXBwU2NhbGUgKyAwLjVmKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIChpbnQpIChtSGVpZ2h0ICogYXBwU2NhbGUgKyAwLjVmKSk7CisKKyAgICAgICAgICAgIGlmIChod0ludGlhbGl6ZWQgfHwgKHdpbmRvd1Nob3VsZFJlc2l6ZSAmJiBtSHdSZW5kZXJlciAhPSBudWxsKSkgeworICAgICAgICAgICAgICAgIG1Id1JlbmRlcmVyLnNldHVwKG1XaWR0aCwgbUhlaWdodCk7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIGJvb2xlYW4gZm9jdXNDaGFuZ2VkRHVlVG9Ub3VjaE1vZGUgPSBlbnN1cmVUb3VjaE1vZGVMb2NhbGx5KApAQCAtMTEzMyw3ICsxMDA5LDcgQEAKICAgICAgICAgICAgICAgICBUQUcsICJMYXlpbmcgb3V0ICIgKyBob3N0ICsgIiB0byAoIiArCiAgICAgICAgICAgICAgICAgaG9zdC5tTWVhc3VyZWRXaWR0aCArICIsICIgKyBob3N0Lm1NZWFzdXJlZEhlaWdodCArICIpIik7CiAgICAgICAgICAgICBsb25nIHN0YXJ0VGltZSA9IDBMOwotICAgICAgICAgICAgaWYgKENvbmZpZy5ERUJVRyAmJiBWaWV3RGVidWcucHJvZmlsZUxheW91dCkgeworICAgICAgICAgICAgaWYgKFZpZXdEZWJ1Zy5ERUJVR19QUk9GSUxFX0xBWU9VVCkgewogICAgICAgICAgICAgICAgIHN0YXJ0VGltZSA9IFN5c3RlbUNsb2NrLmVsYXBzZWRSZWFsdGltZSgpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgaG9zdC5sYXlvdXQoMCwgMCwgaG9zdC5tTWVhc3VyZWRXaWR0aCwgaG9zdC5tTWVhc3VyZWRIZWlnaHQpOwpAQCAtMTE0Niw3ICsxMDIyLDcgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIGlmIChDb25maWcuREVCVUcgJiYgVmlld0RlYnVnLnByb2ZpbGVMYXlvdXQpIHsKKyAgICAgICAgICAgIGlmIChWaWV3RGVidWcuREVCVUdfUFJPRklMRV9MQVlPVVQpIHsKICAgICAgICAgICAgICAgICBFdmVudExvZy53cml0ZUV2ZW50KDYwMDAxLCBTeXN0ZW1DbG9jay5lbGFwc2VkUmVhbHRpbWUoKSAtIHN0YXJ0VGltZSk7CiAgICAgICAgICAgICB9CiAKQEAgLTEzNDYsNyArMTIyMiw4IEBACiAgICAgICAgIGlmICghc0ZpcnN0RHJhd0NvbXBsZXRlKSB7CiAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKHNGaXJzdERyYXdIYW5kbGVycykgewogICAgICAgICAgICAgICAgIHNGaXJzdERyYXdDb21wbGV0ZSA9IHRydWU7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaT0wOyBpPHNGaXJzdERyYXdIYW5kbGVycy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgICAgIGZpbmFsIGludCBjb3VudCA9IHNGaXJzdERyYXdIYW5kbGVycy5zaXplKCk7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGk8IGNvdW50OyBpKyspIHsKICAgICAgICAgICAgICAgICAgICAgcG9zdChzRmlyc3REcmF3SGFuZGxlcnMuZ2V0KGkpKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CkBAIC0xMzc5LDYxICsxMjU2LDI0IEBACiAgICAgICAgICAgICBkaXJ0eS5zZXRFbXB0eSgpOwogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBpZiAobVVzZUdMKSB7Ci0gICAgICAgICAgICBpZiAoIWRpcnR5LmlzRW1wdHkoKSkgewotICAgICAgICAgICAgICAgIENhbnZhcyBjYW52YXMgPSBtR2xDYW52YXM7Ci0gICAgICAgICAgICAgICAgaWYgKG1HTCAhPSBudWxsICYmIGNhbnZhcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1HTC5nbERpc2FibGUoR0xfU0NJU1NPUl9URVNUKTsKLSAgICAgICAgICAgICAgICAgICAgbUdMLmdsQ2xlYXJDb2xvcigwLCAwLCAwLCAwKTsKLSAgICAgICAgICAgICAgICAgICAgbUdMLmdsQ2xlYXIoR0xfQ09MT1JfQlVGRkVSX0JJVCk7Ci0gICAgICAgICAgICAgICAgICAgIG1HTC5nbEVuYWJsZShHTF9TQ0lTU09SX1RFU1QpOwotCi0gICAgICAgICAgICAgICAgICAgIG1BdHRhY2hJbmZvLm1EcmF3aW5nVGltZSA9IFN5c3RlbUNsb2NrLnVwdGltZU1pbGxpcygpOwotICAgICAgICAgICAgICAgICAgICBtQXR0YWNoSW5mby5tSWdub3JlRGlydHlTdGF0ZSA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIG1WaWV3Lm1Qcml2YXRlRmxhZ3MgfD0gVmlldy5EUkFXTjsKLQotICAgICAgICAgICAgICAgICAgICBpbnQgc2F2ZUNvdW50ID0gY2FudmFzLnNhdmUoQ2FudmFzLk1BVFJJWF9TQVZFX0ZMQUcpOwotICAgICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAgICAgY2FudmFzLnRyYW5zbGF0ZSgwLCAteW9mZik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobVRyYW5zbGF0b3IgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1UcmFuc2xhdG9yLnRyYW5zbGF0ZUNhbnZhcyhjYW52YXMpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgY2FudmFzLnNldFNjcmVlbkRlbnNpdHkoc2NhbGluZ1JlcXVpcmVkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gRGlzcGxheU1ldHJpY3MuREVOU0lUWV9ERVZJQ0UgOiAwKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1WaWV3LmRyYXcoY2FudmFzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChDb25maWcuREVCVUcgJiYgVmlld0RlYnVnLmNvbnNpc3RlbmN5Q2hlY2tFbmFibGVkKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbVZpZXcuZGlzcGF0Y2hDb25zaXN0ZW5jeUNoZWNrKFZpZXdEZWJ1Zy5DT05TSVNURU5DWV9EUkFXSU5HKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhbnZhcy5yZXN0b3JlVG9Db3VudChzYXZlQ291bnQpOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgbUF0dGFjaEluZm8ubUlnbm9yZURpcnR5U3RhdGUgPSBmYWxzZTsKLQotICAgICAgICAgICAgICAgICAgICBtRWdsLmVnbFN3YXBCdWZmZXJzKG1FZ2xEaXNwbGF5LCBtRWdsU3VyZmFjZSk7Ci0gICAgICAgICAgICAgICAgICAgIGNoZWNrRWdsRXJyb3JzKCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKFNIT1dfRlBTIHx8IENvbmZpZy5ERUJVRyAmJiBWaWV3RGVidWcuc2hvd0ZwcykgewotICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5vdyA9IChpbnQpU3lzdGVtQ2xvY2suZWxhcHNlZFJlYWx0aW1lKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc0RyYXdUaW1lICE9IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYXRpdmVTaG93RlBTKGNhbnZhcywgbm93IC0gc0RyYXdUaW1lKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIHNEcmF3VGltZSA9IG5vdzsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChzY3JvbGxpbmcpIHsKLSAgICAgICAgICAgICAgICBtRnVsbFJlZHJhd05lZWRlZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgc2NoZWR1bGVUcmF2ZXJzYWxzKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KIAogICAgICAgICBpZiAoZnVsbFJlZHJhd05lZWRlZCkgewogICAgICAgICAgICAgbUF0dGFjaEluZm8ubUlnbm9yZURpcnR5U3RhdGUgPSB0cnVlOwogICAgICAgICAgICAgZGlydHkudW5pb24oMCwgMCwgKGludCkgKG1XaWR0aCAqIGFwcFNjYWxlICsgMC41ZiksIChpbnQpIChtSGVpZ2h0ICogYXBwU2NhbGUgKyAwLjVmKSk7CiAgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIGlmIChtSHdSZW5kZXJlciAhPSBudWxsICYmIG1Id1JlbmRlcmVyLmlzRW5hYmxlZCgpKSB7CisgICAgICAgICAgICBpZiAoIWRpcnR5LmlzRW1wdHkoKSkgeworICAgICAgICAgICAgICAgIG1Id1JlbmRlcmVyLmRyYXcobVZpZXcsIG1BdHRhY2hJbmZvLCB5b2ZmKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHNjcm9sbGluZykgeworICAgICAgICAgICAgICAgIG1GdWxsUmVkcmF3TmVlZGVkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBzY2hlZHVsZVRyYXZlcnNhbHMoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CiAKICAgICAgICAgaWYgKERFQlVHX09SSUVOVEFUSU9OIHx8IERFQlVHX0RSQVcpIHsKICAgICAgICAgICAgIExvZy52KFRBRywgIkRyYXcgIiArIG1WaWV3ICsgIi8iCkBAIC0xNDgyLDcgKzEzMjIsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgLy9jYW52YXMuZHJhd0FSR0IoMjU1LCAyNTUsIDAsIDApOwogICAgICAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICAgICAgaWYgKENvbmZpZy5ERUJVRyAmJiBWaWV3RGVidWcucHJvZmlsZURyYXdpbmcpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKFZpZXdEZWJ1Zy5ERUJVR19QUk9GSUxFX0RSQVdJTkcpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0VGltZSA9IFN5c3RlbUNsb2NrLmVsYXBzZWRSZWFsdGltZSgpOwogICAgICAgICAgICAgICAgICAgICB9CiAKQEAgLTE1MDksNyArMTM0OSw2IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIsIG1ldHJpY3M9IiArIGN4dC5nZXRSZXNvdXJjZXMoKS5nZXREaXNwbGF5TWV0cmljcygpICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiwgY29tcGF0aWJpbGl0eUluZm89IiArIGN4dC5nZXRSZXNvdXJjZXMoKS5nZXRDb21wYXRpYmlsaXR5SW5mbygpKTsKICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpbnQgc2F2ZUNvdW50ID0gY2FudmFzLnNhdmUoQ2FudmFzLk1BVFJJWF9TQVZFX0ZMQUcpOwogICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgY2FudmFzLnRyYW5zbGF0ZSgwLCAteW9mZik7CiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobVRyYW5zbGF0b3IgIT0gbnVsbCkgewpAQCAtMTUyMCwxNCArMTM1OSwxMyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgbVZpZXcuZHJhdyhjYW52YXMpOwogICAgICAgICAgICAgICAgICAgICB9IGZpbmFsbHkgewogICAgICAgICAgICAgICAgICAgICAgICAgbUF0dGFjaEluZm8ubUlnbm9yZURpcnR5U3RhdGUgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhbnZhcy5yZXN0b3JlVG9Db3VudChzYXZlQ291bnQpOwogICAgICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICAgICAgaWYgKENvbmZpZy5ERUJVRyAmJiBWaWV3RGVidWcuY29uc2lzdGVuY3lDaGVja0VuYWJsZWQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIG1WaWV3LmRpc3BhdGNoQ29uc2lzdGVuY3lDaGVjayhWaWV3RGVidWcuQ09OU0lTVEVOQ1lfRFJBV0lORyk7CiAgICAgICAgICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgICAgICAgICBpZiAoU0hPV19GUFMgfHwgQ29uZmlnLkRFQlVHICYmIFZpZXdEZWJ1Zy5zaG93RnBzKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChTSE9XX0ZQUyB8fCBWaWV3RGVidWcuREVCVUdfU0hPV19GUFMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIGludCBub3cgPSAoaW50KVN5c3RlbUNsb2NrLmVsYXBzZWRSZWFsdGltZSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNEcmF3VGltZSAhPSAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmF0aXZlU2hvd0ZQUyhjYW52YXMsIG5vdyAtIHNEcmF3VGltZSk7CkBAIC0xNTM1LDcgKzEzNzMsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgc0RyYXdUaW1lID0gbm93OwogICAgICAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICAgICAgaWYgKENvbmZpZy5ERUJVRyAmJiBWaWV3RGVidWcucHJvZmlsZURyYXdpbmcpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKFZpZXdEZWJ1Zy5ERUJVR19QUk9GSUxFX0RSQVdJTkcpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIEV2ZW50TG9nLndyaXRlRXZlbnQoNjAwMDAsIFN5c3RlbUNsb2NrLmVsYXBzZWRSZWFsdGltZSgpIC0gc3RhcnRUaW1lKTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KQEAgLTE3MzgsOCArMTU3Niw2IEBACiAgICAgfQogCiAgICAgdm9pZCBkaXNwYXRjaERldGFjaGVkRnJvbVdpbmRvdygpIHsKLSAgICAgICAgaWYgKENvbmZpZy5MT0dWKSBMb2cudihUQUcsICJEZXRhY2hpbmcgaW4gIiArIHRoaXMgKyAiIG9mICIgKyBtU3VyZmFjZSk7Ci0KICAgICAgICAgaWYgKG1WaWV3ICE9IG51bGwpIHsKICAgICAgICAgICAgIG1WaWV3LmRpc3BhdGNoRGV0YWNoZWRGcm9tV2luZG93KCk7CiAgICAgICAgIH0KQEAgLTE3NDgsOSArMTU4NCwxMiBAQAogICAgICAgICBtQXR0YWNoSW5mby5tUm9vdFZpZXcgPSBudWxsOwogICAgICAgICBtQXR0YWNoSW5mby5tU3VyZmFjZSA9IG51bGw7CiAKLSAgICAgICAgaWYgKG1Vc2VHTCkgewotICAgICAgICAgICAgZGVzdHJveUdMKCk7CisgICAgICAgIGlmIChtSHdSZW5kZXJlciAhPSBudWxsKSB7CisgICAgICAgICAgICBtSHdSZW5kZXJlci5kZXN0cm95KHRydWUpOworICAgICAgICAgICAgbUh3UmVuZGVyZXIgPSBudWxsOworICAgICAgICAgICAgbUF0dGFjaEluZm8ubUhhcmR3YXJlQWNjZWxlcmF0ZWQgPSBmYWxzZTsKICAgICAgICAgfQorCiAgICAgICAgIG1TdXJmYWNlLnJlbGVhc2UoKTsKIAogICAgICAgICBpZiAobUlucHV0Q2hhbm5lbCAhPSBudWxsKSB7CkBAIC0xOTMzLDE4ICsxNzcyLDggQEAKICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBpblRvdWNoTW9kZSA9IG1zZy5hcmcyICE9IDA7CiAgICAgICAgICAgICAgICAgICAgIGVuc3VyZVRvdWNoTW9kZUxvY2FsbHkoaW5Ub3VjaE1vZGUpOwogCi0gICAgICAgICAgICAgICAgICAgIGlmIChtR2xXYW50ZWQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrRWdsRXJyb3JzKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyB3ZSBsb3N0IHRoZSBnbCBjb250ZXh0LCBzbyByZWNyZWF0ZSBpdC4KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtR2xXYW50ZWQgJiYgIW1Vc2VHTCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluaXRpYWxpemVHTCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtR2xDYW52YXMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBhcHBTY2FsZSA9IG1BdHRhY2hJbmZvLm1BcHBsaWNhdGlvblNjYWxlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtR2xDYW52YXMuc2V0Vmlld3BvcnQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludCkgKG1XaWR0aCAqIGFwcFNjYWxlICsgMC41ZiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludCkgKG1IZWlnaHQgKiBhcHBTY2FsZSArIDAuNWYpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChtSHdSZW5kZXJlciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtSHdSZW5kZXJlci5pbml0aWFsaXplSWZOZWVkZWQobVdpZHRoLCBtSGVpZ2h0LCBtQXR0YWNoSW5mbywgbUhvbGRlcik7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CiAKQEAgLTE5OTQsOCArMTgyMyw3IEBACiAgICAgICAgICAgICBpZiAoKGV2ZW50LmdldEZsYWdzKCkmS2V5RXZlbnQuRkxBR19GUk9NX1NZU1RFTSkgIT0gMCkgewogICAgICAgICAgICAgICAgIC8vIFRoZSBJTUUgaXMgdHJ5aW5nIHRvIHNheSB0aGlzIGV2ZW50IGlzIGZyb20gdGhlCiAgICAgICAgICAgICAgICAgLy8gc3lzdGVtISAgQmFkIGJhZCBiYWQhCi0gICAgICAgICAgICAgICAgZXZlbnQgPSBLZXlFdmVudC5jaGFuZ2VGbGFncyhldmVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50LmdldEZsYWdzKCkmfktleUV2ZW50LkZMQUdfRlJPTV9TWVNURU0pOworICAgICAgICAgICAgICAgIGV2ZW50ID0gS2V5RXZlbnQuY2hhbmdlRmxhZ3MoZXZlbnQsIGV2ZW50LmdldEZsYWdzKCkgJiB+S2V5RXZlbnQuRkxBR19GUk9NX1NZU1RFTSk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBkZWxpdmVyS2V5RXZlbnRUb1ZpZXdIaWVyYXJjaHkoKEtleUV2ZW50KW1zZy5vYmosIGZhbHNlKTsKICAgICAgICAgfSBicmVhazsKQEAgLTI0ODMsOCArMjMxMSw3IEBACiAgICAgcHJpdmF0ZSB2b2lkIGRlbGl2ZXJLZXlFdmVudChLZXlFdmVudCBldmVudCwgYm9vbGVhbiBzZW5kRG9uZSkgewogICAgICAgICAvLyBJZiBtVmlldyBpcyBudWxsLCB3ZSBqdXN0IGNvbnN1bWUgdGhlIGtleSBldmVudCBiZWNhdXNlIGl0IGRvZXNuJ3QKICAgICAgICAgLy8gbWFrZSBzZW5zZSB0byBkbyBhbnl0aGluZyBlbHNlIHdpdGggaXQuCi0gICAgICAgIGJvb2xlYW4gaGFuZGxlZCA9IG1WaWV3ICE9IG51bGwKLSAgICAgICAgICAgICAgICA/IG1WaWV3LmRpc3BhdGNoS2V5RXZlbnRQcmVJbWUoZXZlbnQpIDogdHJ1ZTsKKyAgICAgICAgYm9vbGVhbiBoYW5kbGVkID0gbVZpZXcgPT0gbnVsbCB8fCBtVmlldy5kaXNwYXRjaEtleUV2ZW50UHJlSW1lKGV2ZW50KTsKICAgICAgICAgaWYgKGhhbmRsZWQpIHsKICAgICAgICAgICAgIGlmIChzZW5kRG9uZSkgewogICAgICAgICAgICAgICAgIGZpbmlzaEtleUV2ZW50KGV2ZW50KTsKQEAgLTI1MTYsNyArMjM0Myw2IEBACiAgICAgICAgICAgICBmaW5hbCBib29sZWFuIHNlbmREb25lID0gc2VxID49IDA7CiAgICAgICAgICAgICBpZiAoIWhhbmRsZWQpIHsKICAgICAgICAgICAgICAgICBkZWxpdmVyS2V5RXZlbnRUb1ZpZXdIaWVyYXJjaHkoZXZlbnQsIHNlbmREb25lKTsKLSAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICB9IGVsc2UgaWYgKHNlbmREb25lKSB7CiAgICAgICAgICAgICAgICAgZmluaXNoS2V5RXZlbnQoZXZlbnQpOwogICAgICAgICAgICAgfSBlbHNlIHsKQEAgLTI3MTMsNyArMjUzOSw3IEBACiAKICAgICB2b2lkIGRvRGllKCkgewogICAgICAgICBjaGVja1RocmVhZCgpOwotICAgICAgICBpZiAoQ29uZmlnLkxPR1YpIExvZy52KFRBRywgIkRJRSBpbiAiICsgdGhpcyArICIgb2YgIiArIG1TdXJmYWNlKTsKKyAgICAgICAgaWYgKExPQ0FMX0xPR1YpIExvZy52KFRBRywgIkRJRSBpbiAiICsgdGhpcyArICIgb2YgIiArIG1TdXJmYWNlKTsKICAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7CiAgICAgICAgICAgICBpZiAobUFkZGVkICYmICFtRmlyc3QpIHsKICAgICAgICAgICAgICAgICBpbnQgdmlld1Zpc2liaWxpdHkgPSBtVmlldy5nZXRWaXNpYmlsaXR5KCk7CkBAIC0yNzk5LDEzICsyNjI1LDEyIEBACiAgICAgICAgIC8vbm9pbnNwZWN0aW9uIENvbnN0YW50Q29uZGl0aW9ucwogICAgICAgICBpZiAoZmFsc2UgJiYgZXZlbnQuZ2V0QWN0aW9uKCkgPT0gS2V5RXZlbnQuQUNUSU9OX0RPV04pIHsKICAgICAgICAgICAgIGlmIChldmVudC5nZXRLZXlDb2RlKCkgPT0gS2V5RXZlbnQuS0VZQ09ERV9DQU1FUkEpIHsKLSAgICAgICAgICAgICAgICBpZiAoQ29uZmlnLkxPR0QpIExvZy5kKCJrZXlkaXNwIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICI9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0iKTsKLSAgICAgICAgICAgICAgICBpZiAoQ29uZmlnLkxPR0QpIExvZy5kKCJrZXlkaXNwIiwgIkZvY3VzZWQgdmlldyBIaWVyYXJjaHkgaXM6Iik7CisgICAgICAgICAgICAgICAgaWYgKERCRykgTG9nLmQoImtleWRpc3AiLCAiPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Iik7CisgICAgICAgICAgICAgICAgaWYgKERCRykgTG9nLmQoImtleWRpc3AiLCAiRm9jdXNlZCB2aWV3IEhpZXJhcmNoeSBpczoiKTsKKwogICAgICAgICAgICAgICAgIGRlYnVnKCk7CiAKLSAgICAgICAgICAgICAgICBpZiAoQ29uZmlnLkxPR0QpIExvZy5kKCJrZXlkaXNwIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICI9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0iKTsKKyAgICAgICAgICAgICAgICBpZiAoREJHKSBMb2cuZCgia2V5ZGlzcCIsICI9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0iKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCkBAIC0yODg4LDE2ICsyNzEzLDE2IEBACiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAKKyAgICBwdWJsaWMgQWN0aW9uTW9kZSBzdGFydEFjdGlvbk1vZGVGb3JDaGlsZChWaWV3IG9yaWdpbmFsVmlldywgQWN0aW9uTW9kZS5DYWxsYmFjayBjYWxsYmFjaykgeworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKICAgICBwdWJsaWMgdm9pZCBjcmVhdGVDb250ZXh0TWVudShDb250ZXh0TWVudSBtZW51KSB7CiAgICAgfQogCiAgICAgcHVibGljIHZvaWQgY2hpbGREcmF3YWJsZVN0YXRlQ2hhbmdlZChWaWV3IGNoaWxkKSB7CiAgICAgfQogCi0gICAgcHJvdGVjdGVkIFJlY3QgZ2V0V2luZG93RnJhbWUoKSB7Ci0gICAgICAgIHJldHVybiBtV2luRnJhbWU7Ci0gICAgfQotCiAgICAgdm9pZCBjaGVja1RocmVhZCgpIHsKICAgICAgICAgaWYgKG1UaHJlYWQgIT0gVGhyZWFkLmN1cnJlbnRUaHJlYWQoKSkgewogICAgICAgICAgICAgdGhyb3cgbmV3IENhbGxlZEZyb21Xcm9uZ1RocmVhZEV4Y2VwdGlvbigKQEAgLTI5NzYsMTYgKzI4MDEsMTUgQEAKICAgICBzdGF0aWMgY2xhc3MgVyBleHRlbmRzIElXaW5kb3cuU3R1YiB7CiAgICAgICAgIHByaXZhdGUgZmluYWwgV2Vha1JlZmVyZW5jZTxWaWV3Um9vdD4gbVZpZXdSb290OwogCi0gICAgICAgIHB1YmxpYyBXKFZpZXdSb290IHZpZXdSb290LCBDb250ZXh0IGNvbnRleHQpIHsKKyAgICAgICAgVyhWaWV3Um9vdCB2aWV3Um9vdCkgewogICAgICAgICAgICAgbVZpZXdSb290ID0gbmV3IFdlYWtSZWZlcmVuY2U8Vmlld1Jvb3Q+KHZpZXdSb290KTsKICAgICAgICAgfQogCi0gICAgICAgIHB1YmxpYyB2b2lkIHJlc2l6ZWQoaW50IHcsIGludCBoLCBSZWN0IGNvdmVyZWRJbnNldHMsCi0gICAgICAgICAgICAgICAgUmVjdCB2aXNpYmxlSW5zZXRzLCBib29sZWFuIHJlcG9ydERyYXcsIENvbmZpZ3VyYXRpb24gbmV3Q29uZmlnKSB7CisgICAgICAgIHB1YmxpYyB2b2lkIHJlc2l6ZWQoaW50IHcsIGludCBoLCBSZWN0IGNvdmVyZWRJbnNldHMsIFJlY3QgdmlzaWJsZUluc2V0cywKKyAgICAgICAgICAgICAgICBib29sZWFuIHJlcG9ydERyYXcsIENvbmZpZ3VyYXRpb24gbmV3Q29uZmlnKSB7CiAgICAgICAgICAgICBmaW5hbCBWaWV3Um9vdCB2aWV3Um9vdCA9IG1WaWV3Um9vdC5nZXQoKTsKICAgICAgICAgICAgIGlmICh2aWV3Um9vdCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdmlld1Jvb3QuZGlzcGF0Y2hSZXNpemVkKHcsIGgsIGNvdmVyZWRJbnNldHMsCi0gICAgICAgICAgICAgICAgICAgICAgICB2aXNpYmxlSW5zZXRzLCByZXBvcnREcmF3LCBuZXdDb25maWcpOworICAgICAgICAgICAgICAgIHZpZXdSb290LmRpc3BhdGNoUmVzaXplZCh3LCBoLCBjb3ZlcmVkSW5zZXRzLCB2aXNpYmxlSW5zZXRzLCByZXBvcnREcmF3LCBuZXdDb25maWcpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAKQEAgLTMzODgsOCArMzIxMiw0IEBACiAgICAgfQogCiAgICAgcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIHZvaWQgbmF0aXZlU2hvd0ZQUyhDYW52YXMgY2FudmFzLCBpbnQgZHVyYXRpb25NaWxsaXMpOwotCi0gICAgLy8gaW5mb3JtIHNraWEgdG8ganVzdCBhYmFuZG9uIGl0cyB0ZXh0dXJlIGNhY2hlIElEcwotICAgIC8vIGRvZXNuJ3QgY2FsbCBnbERlbGV0ZVRleHR1cmVzCi0gICAgcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIHZvaWQgbmF0aXZlQWJhbmRvbkdsQ2FjaGVzKCk7CiB9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC92aWV3L1dpbmRvdy5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9XaW5kb3cuamF2YQppbmRleCAxMWMwOWMxLi42NjMzMzY3IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC92aWV3L1dpbmRvdy5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvV2luZG93LmphdmEKQEAgLTU2LDExICs1NiwzMiBAQAogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZFQVRVUkVfQ09OVEVYVF9NRU5VID0gNjsKICAgICAvKiogRmxhZyBmb3IgY3VzdG9tIHRpdGxlLiBZb3UgY2Fubm90IGNvbWJpbmUgdGhpcyBmZWF0dXJlIHdpdGggb3RoZXIgdGl0bGUgZmVhdHVyZXMuICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRkVBVFVSRV9DVVNUT01fVElUTEUgPSA3OwotICAgIC8qKiBGbGFnIGZvciBhc2tpbmcgZm9yIGFuIE9wZW5HTCBlbmFibGVkIHdpbmRvdy4KLSAgICAgICAgQWxsIDJEIGdyYXBoaWNzIHdpbGwgYmUgaGFuZGxlZCBieSBPcGVuR0wgRVMuCi0gICAgICAgIEBoaWRlCi0gICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGRUFUVVJFX09QRU5HTCA9IDg7CisgICAgLyoqCisgICAgICogRmxhZyBmb3IgZW5hYmxpbmcgdGhlIEFjdGlvbiBCYXIuCisgICAgICogVGhpcyBpcyBlbmFibGVkIGJ5IGRlZmF1bHQgZm9yIHNvbWUgZGV2aWNlcy4gVGhlIEFjdGlvbiBCYXIKKyAgICAgKiByZXBsYWNlcyB0aGUgdGl0bGUgYmFyIGFuZCBwcm92aWRlcyBhbiBhbHRlcm5hdGUgbG9jYXRpb24KKyAgICAgKiBmb3IgYW4gb24tc2NyZWVuIG1lbnUgYnV0dG9uIG9uIHNvbWUgZGV2aWNlcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGRUFUVVJFX0FDVElPTl9CQVIgPSA4OworICAgIC8qKgorICAgICAqIEZsYWcgZm9yIHJlcXVlc3RpbmcgYW4gQWN0aW9uIEJhciB0aGF0IG92ZXJsYXlzIHdpbmRvdyBjb250ZW50LgorICAgICAqIE5vcm1hbGx5IGFuIEFjdGlvbiBCYXIgd2lsbCBzaXQgaW4gdGhlIHNwYWNlIGFib3ZlIHdpbmRvdyBjb250ZW50LCBidXQgaWYgdGhpcworICAgICAqIGZlYXR1cmUgaXMgcmVxdWVzdGVkIGFsb25nIHdpdGgge0BsaW5rICNGRUFUVVJFX0FDVElPTl9CQVJ9IGl0IHdpbGwgYmUgbGF5ZXJlZCBvdmVyCisgICAgICogdGhlIHdpbmRvdyBjb250ZW50IGl0c2VsZi4gVGhpcyBpcyB1c2VmdWwgaWYgeW91IHdvdWxkIGxpa2UgeW91ciBhcHAgdG8gaGF2ZSBtb3JlIGNvbnRyb2wKKyAgICAgKiBvdmVyIGhvdyB0aGUgQWN0aW9uIEJhciBpcyBkaXNwbGF5ZWQsIHN1Y2ggYXMgbGV0dGluZyBhcHBsaWNhdGlvbiBjb250ZW50IHNjcm9sbCBiZW5lYXRoCisgICAgICogYW4gQWN0aW9uIEJhciB3aXRoIGEgdHJhbnNwYXJlbnQgYmFja2dyb3VuZCBvciBvdGhlcndpc2UgZGlzcGxheWluZyBhIHRyYW5zcGFyZW50L3RyYW5zbHVjZW50CisgICAgICogQWN0aW9uIEJhciBvdmVyIGFwcGxpY2F0aW9uIGNvbnRlbnQuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRkVBVFVSRV9BQ1RJT05fQkFSX09WRVJMQVkgPSA5OworICAgIC8qKgorICAgICAqIEZsYWcgZm9yIHNwZWNpZnlpbmcgdGhlIGJlaGF2aW9yIG9mIGFjdGlvbiBtb2RlcyB3aGVuIGFuIEFjdGlvbiBCYXIgaXMgbm90IHByZXNlbnQuCisgICAgICogSWYgb3ZlcmxheSBpcyBlbmFibGVkLCB0aGUgYWN0aW9uIG1vZGUgVUkgd2lsbCBiZSBhbGxvd2VkIHRvIGNvdmVyIGV4aXN0aW5nIHdpbmRvdyBjb250ZW50LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZFQVRVUkVfQUNUSU9OX01PREVfT1ZFUkxBWSA9IDEwOworICAgIC8qKgorICAgICAqIEZsYWcgZm9yIHJlcXVlc3RpbmcgdGhpcyB3aW5kb3cgdG8gYmUgaGFyZHdhcmUgYWNjZWxlcmF0ZWQsIGlmIHBvc3NpYmxlLiAKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGRUFUVVJFX0hBUkRXQVJFX0FDQ0VMRVJBVEVEID0gMTE7CiAgICAgLyoqIEZsYWcgZm9yIHNldHRpbmcgdGhlIHByb2dyZXNzIGJhcidzIHZpc2liaWxpdHkgdG8gVklTSUJMRSAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST0dSRVNTX1ZJU0lCSUxJVFlfT04gPSAtMTsKICAgICAvKiogRmxhZyBmb3Igc2V0dGluZyB0aGUgcHJvZ3Jlc3MgYmFyJ3MgdmlzaWJpbGl0eSB0byBHT05FICovCkBAIC0xMDksNiArMTMwLDggQEAKIAogICAgIHByaXZhdGUgYm9vbGVhbiBtSGFzU29mdElucHV0TW9kZSA9IGZhbHNlOwogICAgIAorICAgIHByaXZhdGUgYm9vbGVhbiBtRGVzdHJveWVkOworCiAgICAgLy8gVGhlIGN1cnJlbnQgd2luZG93IGF0dHJpYnV0ZXMuCiAgICAgcHJpdmF0ZSBmaW5hbCBXaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcyBtV2luZG93QXR0cmlidXRlcyA9CiAgICAgICAgIG5ldyBXaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcygpOwpAQCAtMjkyLDYgKzMxNSwxNCBAQAogICAgICAgICAgKiBAc2VlIGFuZHJvaWQuYXBwLkFjdGl2aXR5I29uU2VhcmNoUmVxdWVzdGVkKCkgCiAgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgYm9vbGVhbiBvblNlYXJjaFJlcXVlc3RlZCgpOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBDYWxsZWQgd2hlbiBhbiBhY3Rpb24gbW9kZSBpcyBiZWluZyBzdGFydGVkLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gY2FsbGJhY2sgQ2FsbGJhY2sgdG8gY29udHJvbCB0aGUgbGlmZWN5Y2xlIG9mIHRoaXMgYWN0aW9uIG1vZGUKKyAgICAgICAgICogQHJldHVybiBUaGUgQWN0aW9uTW9kZSB0aGF0IHdhcyBzdGFydGVkLCBvciBudWxsIGlmIGl0IHdhcyBjYW5jZWxlZAorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIEFjdGlvbk1vZGUgb25TdGFydEFjdGlvbk1vZGUoQWN0aW9uTW9kZS5DYWxsYmFjayBjYWxsYmFjayk7CiAgICAgfQogCiAgICAgcHVibGljIFdpbmRvdyhDb250ZXh0IGNvbnRleHQpIHsKQEAgLTM1Myw2ICszODQsMTYgQEAKICAgICAgICAgcmV0dXJuIG1IYXNDaGlsZHJlbjsKICAgICB9CiAgICAgCisgICAgLyoqIEBoaWRlICovCisgICAgcHVibGljIGZpbmFsIHZvaWQgZGVzdHJveSgpIHsKKyAgICAgICAgbURlc3Ryb3llZCA9IHRydWU7CisgICAgfQorCisgICAgLyoqIEBoaWRlICovCisgICAgcHVibGljIGZpbmFsIGJvb2xlYW4gaXNEZXN0cm95ZWQoKSB7CisgICAgICAgIHJldHVybiBtRGVzdHJveWVkOworICAgIH0KKwogICAgIC8qKgogICAgICAqIFNldCB0aGUgd2luZG93IG1hbmFnZXIgZm9yIHVzZSBieSB0aGlzIFdpbmRvdyB0bywgZm9yIGV4YW1wbGUsCiAgICAgICogZGlzcGxheSBwYW5lbHMuICBUaGlzIGlzIDxlbT5ub3Q8L2VtPiB1c2VkIGZvciBkaXNwbGF5aW5nIHRoZQpAQCAtMzYwLDIxICs0MDEsMzUgQEAKICAgICAgKgogICAgICAqIEBwYXJhbSB3bSBUaGUgVmlld01hbmFnZXIgZm9yIGFkZGluZyBuZXcgd2luZG93cy4KICAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRXaW5kb3dNYW5hZ2VyKFdpbmRvd01hbmFnZXIgd20sCi0gICAgICAgICAgICBJQmluZGVyIGFwcFRva2VuLCBTdHJpbmcgYXBwTmFtZSkgeworICAgIHB1YmxpYyB2b2lkIHNldFdpbmRvd01hbmFnZXIoV2luZG93TWFuYWdlciB3bSwgSUJpbmRlciBhcHBUb2tlbiwgU3RyaW5nIGFwcE5hbWUpIHsKKyAgICAgICAgc2V0V2luZG93TWFuYWdlcih3bSwgYXBwVG9rZW4sIGFwcE5hbWUsIGZhbHNlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIHdpbmRvdyBtYW5hZ2VyIGZvciB1c2UgYnkgdGhpcyBXaW5kb3cgdG8sIGZvciBleGFtcGxlLAorICAgICAqIGRpc3BsYXkgcGFuZWxzLiAgVGhpcyBpcyA8ZW0+bm90PC9lbT4gdXNlZCBmb3IgZGlzcGxheWluZyB0aGUKKyAgICAgKiBXaW5kb3cgaXRzZWxmIC0tIHRoYXQgbXVzdCBiZSBkb25lIGJ5IHRoZSBjbGllbnQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gd20gVGhlIFZpZXdNYW5hZ2VyIGZvciBhZGRpbmcgbmV3IHdpbmRvd3MuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0V2luZG93TWFuYWdlcihXaW5kb3dNYW5hZ2VyIHdtLCBJQmluZGVyIGFwcFRva2VuLCBTdHJpbmcgYXBwTmFtZSwKKyAgICAgICAgICAgIGJvb2xlYW4gaGFyZHdhcmVBY2NlbGVyYXRlZCkgewogICAgICAgICBtQXBwVG9rZW4gPSBhcHBUb2tlbjsKICAgICAgICAgbUFwcE5hbWUgPSBhcHBOYW1lOwogICAgICAgICBpZiAod20gPT0gbnVsbCkgewogICAgICAgICAgICAgd20gPSBXaW5kb3dNYW5hZ2VySW1wbC5nZXREZWZhdWx0KCk7CiAgICAgICAgIH0KLSAgICAgICAgbVdpbmRvd01hbmFnZXIgPSBuZXcgTG9jYWxXaW5kb3dNYW5hZ2VyKHdtKTsKKyAgICAgICAgbVdpbmRvd01hbmFnZXIgPSBuZXcgTG9jYWxXaW5kb3dNYW5hZ2VyKHdtLCBoYXJkd2FyZUFjY2VsZXJhdGVkKTsKICAgICB9CiAKICAgICBwcml2YXRlIGNsYXNzIExvY2FsV2luZG93TWFuYWdlciBpbXBsZW1lbnRzIFdpbmRvd01hbmFnZXIgewotICAgICAgICBMb2NhbFdpbmRvd01hbmFnZXIoV2luZG93TWFuYWdlciB3bSkgeworICAgICAgICBwcml2YXRlIGJvb2xlYW4gbUhhcmR3YXJlQWNjZWxlcmF0ZWQ7CisKKyAgICAgICAgTG9jYWxXaW5kb3dNYW5hZ2VyKFdpbmRvd01hbmFnZXIgd20sIGJvb2xlYW4gaGFyZHdhcmVBY2NlbGVyYXRlZCkgewogICAgICAgICAgICAgbVdpbmRvd01hbmFnZXIgPSB3bTsKICAgICAgICAgICAgIG1EZWZhdWx0RGlzcGxheSA9IG1Db250ZXh0LmdldFJlc291cmNlcygpLmdldERlZmF1bHREaXNwbGF5KAogICAgICAgICAgICAgICAgICAgICBtV2luZG93TWFuYWdlci5nZXREZWZhdWx0RGlzcGxheSgpKTsKKyAgICAgICAgICAgIG1IYXJkd2FyZUFjY2VsZXJhdGVkID0gaGFyZHdhcmVBY2NlbGVyYXRlZDsKICAgICAgICAgfQogCiAgICAgICAgIHB1YmxpYyBmaW5hbCB2b2lkIGFkZFZpZXcoVmlldyB2aWV3LCBWaWV3R3JvdXAuTGF5b3V0UGFyYW1zIHBhcmFtcykgewpAQCAtNDIxLDYgKzQ3Niw5IEBACiAgICAgICAgICAgICBpZiAod3AucGFja2FnZU5hbWUgPT0gbnVsbCkgewogICAgICAgICAgICAgICAgIHdwLnBhY2thZ2VOYW1lID0gbUNvbnRleHQuZ2V0UGFja2FnZU5hbWUoKTsKICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChtSGFyZHdhcmVBY2NlbGVyYXRlZCkgeworICAgICAgICAgICAgICAgIHdwLmZsYWdzIHw9IFdpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zLkZMQUdfSEFSRFdBUkVfQUNDRUxFUkFURUQ7CisgICAgICAgICAgICB9CiAgICAgICAgICAgICBtV2luZG93TWFuYWdlci5hZGRWaWV3KHZpZXcsIHBhcmFtcyk7CiAgICAgICAgIH0KIApAQCAtNzEzLDYgKzc3MSwxNSBAQAogICAgICAgICByZXR1cm4gKG1GZWF0dXJlcyZmbGFnKSAhPSAwOwogICAgIH0KIAorICAgIC8qKgorICAgICAqIEBoaWRlIFVzZWQgaW50ZXJuYWxseSB0byBoZWxwIHJlc29sdmUgY29uZmxpY3RpbmcgZmVhdHVyZXMuCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgcmVtb3ZlRmVhdHVyZShpbnQgZmVhdHVyZUlkKSB7CisgICAgICAgIGZpbmFsIGludCBmbGFnID0gMTw8ZmVhdHVyZUlkOworICAgICAgICBtRmVhdHVyZXMgJj0gfmZsYWc7CisgICAgICAgIG1Mb2NhbEZlYXR1cmVzICY9IH4obUNvbnRhaW5lciAhPSBudWxsID8gKGZsYWcmfm1Db250YWluZXIubUZlYXR1cmVzKSA6IGZsYWcpOworICAgIH0KKwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1ha2VBY3RpdmUoKSB7CiAgICAgICAgIGlmIChtQ29udGFpbmVyICE9IG51bGwpIHsKICAgICAgICAgICAgIGlmIChtQ29udGFpbmVyLm1BY3RpdmVDaGlsZCAhPSBudWxsKSB7CkBAIC04MTcsNiArODg0LDggQEAKIAogICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHRvZ2dsZVBhbmVsKGludCBmZWF0dXJlSWQsIEtleUV2ZW50IGV2ZW50KTsKIAorICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIGludmFsaWRhdGVQYW5lbE1lbnUoaW50IGZlYXR1cmVJZCk7CisgICAgCiAgICAgcHVibGljIGFic3RyYWN0IGJvb2xlYW4gcGVyZm9ybVBhbmVsU2hvcnRjdXQoaW50IGZlYXR1cmVJZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQga2V5Q29kZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBLZXlFdmVudCBldmVudCwKQEAgLTk5Niw2ICsxMDY1LDE2IEBACiAgICAgewogICAgICAgICByZXR1cm4gbUZlYXR1cmVzOwogICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBRdWVyeSBmb3IgdGhlIGF2YWlsYWJpbGl0eSBvZiBhIGNlcnRhaW4gZmVhdHVyZS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gZmVhdHVyZSBUaGUgZmVhdHVyZSBJRCB0byBjaGVjaworICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgZmVhdHVyZSBpcyBlbmFibGVkLCBmYWxzZSBvdGhlcndpc2UuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaGFzRmVhdHVyZShpbnQgZmVhdHVyZSkgeworICAgICAgICByZXR1cm4gKGdldEZlYXR1cmVzKCkgJiAoMSA8PCBmZWF0dXJlKSkgIT0gMDsKKyAgICB9CiAKICAgICAvKioKICAgICAgKiBSZXR1cm4gdGhlIGZlYXR1cmUgYml0cyB0aGF0IGFyZSBiZWluZyBpbXBsZW1lbnRlZCBieSB0aGlzIFdpbmRvdy4KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvV2luZG93TWFuYWdlci5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9XaW5kb3dNYW5hZ2VyLmphdmEKaW5kZXggZWViYmM5My4uYzE0N2I3NCAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9XaW5kb3dNYW5hZ2VyLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9XaW5kb3dNYW5hZ2VyLmphdmEKQEAgLTcyLDYgKzcyLDcgQEAKICAgICAgICAgICogV2hlbiB1c2luZyB7QGxpbmsgR3Jhdml0eSNMRUZUfSBvciB7QGxpbmsgR3Jhdml0eSNSSUdIVH0gaXQgcHJvdmlkZXMKICAgICAgICAgICogYW4gb2Zmc2V0IGZyb20gdGhlIGdpdmVuIGVkZ2UuCiAgICAgICAgICAqLworICAgICAgICBAVmlld0RlYnVnLkV4cG9ydGVkUHJvcGVydHkKICAgICAgICAgcHVibGljIGludCB4OwogICAgICAgICAKICAgICAgICAgLyoqCkBAIC03OSw2ICs4MCw3IEBACiAgICAgICAgICAqIFdoZW4gdXNpbmcge0BsaW5rIEdyYXZpdHkjVE9QfSBvciB7QGxpbmsgR3Jhdml0eSNCT1RUT019IGl0IHByb3ZpZGVzCiAgICAgICAgICAqIGFuIG9mZnNldCBmcm9tIHRoZSBnaXZlbiBlZGdlLgogICAgICAgICAgKi8KKyAgICAgICAgQFZpZXdEZWJ1Zy5FeHBvcnRlZFByb3BlcnR5CiAgICAgICAgIHB1YmxpYyBpbnQgeTsKIAogICAgICAgICAvKioKQEAgLTg3LDYgKzg5LDcgQEAKICAgICAgICAgICogc2hvdWxkIG5vdCBiZSBzdHJldGNoZWQuIE90aGVyd2lzZSB0aGUgZXh0cmEgcGl4ZWxzIHdpbGwgYmUgcHJvLXJhdGVkCiAgICAgICAgICAqIGFtb25nIGFsbCB2aWV3cyB3aG9zZSB3ZWlnaHQgaXMgZ3JlYXRlciB0aGFuIDAuCiAgICAgICAgICAqLworICAgICAgICBAVmlld0RlYnVnLkV4cG9ydGVkUHJvcGVydHkKICAgICAgICAgcHVibGljIGZsb2F0IGhvcml6b250YWxXZWlnaHQ7CiAKICAgICAgICAgLyoqCkBAIC05NSw4ICs5OCw5IEBACiAgICAgICAgICAqIHNob3VsZCBub3QgYmUgc3RyZXRjaGVkLiBPdGhlcndpc2UgdGhlIGV4dHJhIHBpeGVscyB3aWxsIGJlIHByby1yYXRlZAogICAgICAgICAgKiBhbW9uZyBhbGwgdmlld3Mgd2hvc2Ugd2VpZ2h0IGlzIGdyZWF0ZXIgdGhhbiAwLgogICAgICAgICAgKi8KKyAgICAgICAgQFZpZXdEZWJ1Zy5FeHBvcnRlZFByb3BlcnR5CiAgICAgICAgIHB1YmxpYyBmbG9hdCB2ZXJ0aWNhbFdlaWdodDsKLSAgICAgICAgCisKICAgICAgICAgLyoqCiAgICAgICAgICAqIFRoZSBnZW5lcmFsIHR5cGUgb2Ygd2luZG93LiAgVGhlcmUgYXJlIHRocmVlIG1haW4gY2xhc3NlcyBvZgogICAgICAgICAgKiB3aW5kb3cgdHlwZXM6CkBAIC0zODksNiArMzkzLDcgQEAKICAgICAgICAgICogQHNlZSAjRkxBR19GVUxMU0NSRUVOCiAgICAgICAgICAqIEBzZWUgI0ZMQUdfRk9SQ0VfTk9UX0ZVTExTQ1JFRU4KICAgICAgICAgICogQHNlZSAjRkxBR19JR05PUkVfQ0hFRUtfUFJFU1NFUworICAgICAgICAgKiBAc2VlICNGTEFHX0hBUkRXQVJFX0FDQ0VMRVJBVEVECiAgICAgICAgICAqLwogICAgICAgICBAVmlld0RlYnVnLkV4cG9ydGVkUHJvcGVydHkoZmxhZ01hcHBpbmcgPSB7CiAgICAgICAgICAgICBAVmlld0RlYnVnLkZsYWdUb1N0cmluZyhtYXNrID0gRkxBR19CTFVSX0JFSElORCwgZXF1YWxzID0gRkxBR19CTFVSX0JFSElORCwKQEAgLTQyMCw3ICs0MjUsOSBAQAogICAgICAgICAgICAgQFZpZXdEZWJ1Zy5GbGFnVG9TdHJpbmcobWFzayA9IEZMQUdfRk9SQ0VfTk9UX0ZVTExTQ1JFRU4sCiAgICAgICAgICAgICAgICAgICAgIGVxdWFscyA9IEZMQUdfRk9SQ0VfTk9UX0ZVTExTQ1JFRU4sIG5hbWUgPSAiRkxBR19GT1JDRV9OT1RfRlVMTFNDUkVFTiIpLAogICAgICAgICAgICAgQFZpZXdEZWJ1Zy5GbGFnVG9TdHJpbmcobWFzayA9IEZMQUdfSUdOT1JFX0NIRUVLX1BSRVNTRVMsCi0gICAgICAgICAgICAgICAgICAgIGVxdWFscyA9IEZMQUdfSUdOT1JFX0NIRUVLX1BSRVNTRVMsIG5hbWUgPSAiRkxBR19JR05PUkVfQ0hFRUtfUFJFU1NFUyIpCisgICAgICAgICAgICAgICAgICAgIGVxdWFscyA9IEZMQUdfSUdOT1JFX0NIRUVLX1BSRVNTRVMsIG5hbWUgPSAiRkxBR19JR05PUkVfQ0hFRUtfUFJFU1NFUyIpLAorICAgICAgICAgICAgQFZpZXdEZWJ1Zy5GbGFnVG9TdHJpbmcobWFzayA9IEZMQUdfSEFSRFdBUkVfQUNDRUxFUkFURUQsCisgICAgICAgICAgICAgICAgICAgIGVxdWFscyA9IEZMQUdfSEFSRFdBUkVfQUNDRUxFUkFURUQsIG5hbWUgPSAiRkxBR19IQVJEV0FSRV9BQ0NFTEVSQVRFRCIpCiAgICAgICAgIH0pCiAgICAgICAgIHB1YmxpYyBpbnQgZmxhZ3M7CiAgICAgICAgIApAQCAtNjAzLDYgKzYxMCwxMiBAQAogICAgICAgICAgKiBpdCBpcyBjcmVhdGVkLgogICAgICAgICAgKiB7QGhpZGV9ICovCiAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZMQUdfU1lTVEVNX0VSUk9SID0gMHg0MDAwMDAwMDsKKyAgICAgICAgCisgICAgICAgIC8qKgorICAgICAgICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGlzIHdpbmRvdyBzaG91bGQgYmUgaGFyZHdhcmUgYWNjZWxlcmF0ZWQuCisgICAgICAgICAqIFJlcXVlc3RpbmcgaGFyZHdhcmUgYWNjZWxlcmF0aW9uIGRvZXMgbm90IGd1YXJhbnRlZSBpdCB3aWxsIGhhcHBlbi4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZMQUdfSEFSRFdBUkVfQUNDRUxFUkFURUQgPSAweDgwMDAwMDAwOyAgICAgICAgCiAKICAgICAgICAgLyoqCiAgICAgICAgICAqIEdpdmVuIGEgcGFydGljdWxhciBzZXQgb2Ygd2luZG93IG1hbmFnZXIgZmxhZ3MsIGRldGVybWluZSB3aGV0aGVyCkBAIC0xMDc1LDYgKzEwODgsNyBAQAogICAgICAgICAgICAgICAgIHNjcmVlbk9yaWVudGF0aW9uID0gby5zY3JlZW5PcmllbnRhdGlvbjsKICAgICAgICAgICAgICAgICBjaGFuZ2VzIHw9IFNDUkVFTl9PUklFTlRBVElPTl9DSEFOR0VEOwogICAgICAgICAgICAgfQorCiAgICAgICAgICAgICByZXR1cm4gY2hhbmdlczsKICAgICAgICAgfQogICAgIApkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9hY2Nlc3NpYmlsaXR5L0FjY2Vzc2liaWxpdHlNYW5hZ2VyLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC92aWV3L2FjY2Vzc2liaWxpdHkvQWNjZXNzaWJpbGl0eU1hbmFnZXIuamF2YQppbmRleCAwMTg2MjcwLi5mNDA2ZGE5IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC92aWV3L2FjY2Vzc2liaWxpdHkvQWNjZXNzaWJpbGl0eU1hbmFnZXIuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC92aWV3L2FjY2Vzc2liaWxpdHkvQWNjZXNzaWJpbGl0eU1hbmFnZXIuamF2YQpAQCAtOTQsNyArOTQsOSBAQAogICAgIHB1YmxpYyBzdGF0aWMgQWNjZXNzaWJpbGl0eU1hbmFnZXIgZ2V0SW5zdGFuY2UoQ29udGV4dCBjb250ZXh0KSB7CiAgICAgICAgIHN5bmNocm9uaXplZCAoc0luc3RhbmNlU3luYykgewogICAgICAgICAgICAgaWYgKHNJbnN0YW5jZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgc0luc3RhbmNlID0gbmV3IEFjY2Vzc2liaWxpdHlNYW5hZ2VyKGNvbnRleHQpOworICAgICAgICAgICAgICAgIElCaW5kZXIgaUJpbmRlciA9IFNlcnZpY2VNYW5hZ2VyLmdldFNlcnZpY2UoQ29udGV4dC5BQ0NFU1NJQklMSVRZX1NFUlZJQ0UpOworICAgICAgICAgICAgICAgIElBY2Nlc3NpYmlsaXR5TWFuYWdlciBzZXJ2aWNlID0gSUFjY2Vzc2liaWxpdHlNYW5hZ2VyLlN0dWIuYXNJbnRlcmZhY2UoaUJpbmRlcik7CisgICAgICAgICAgICAgICAgc0luc3RhbmNlID0gbmV3IEFjY2Vzc2liaWxpdHlNYW5hZ2VyKGNvbnRleHQsIHNlcnZpY2UpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIHJldHVybiBzSW5zdGFuY2U7CkBAIC0xMDQsMTMgKzEwNiwxNiBAQAogICAgICAqIENyZWF0ZSBhbiBpbnN0YW5jZS4KICAgICAgKgogICAgICAqIEBwYXJhbSBjb250ZXh0IEEge0BsaW5rIENvbnRleHR9LgorICAgICAqIEBwYXJhbSBzZXJ2aWNlIEFuIGludGVyZmFjZSB0byB0aGUgYmFja2luZyBzZXJ2aWNlLgorICAgICAqCisgICAgICogQGhpZGUKICAgICAgKi8KLSAgICBwcml2YXRlIEFjY2Vzc2liaWxpdHlNYW5hZ2VyKENvbnRleHQgY29udGV4dCkgeworICAgIHB1YmxpYyBBY2Nlc3NpYmlsaXR5TWFuYWdlcihDb250ZXh0IGNvbnRleHQsIElBY2Nlc3NpYmlsaXR5TWFuYWdlciBzZXJ2aWNlKSB7CiAgICAgICAgIG1IYW5kbGVyID0gbmV3IE15SGFuZGxlcihjb250ZXh0LmdldE1haW5Mb29wZXIoKSk7Ci0gICAgICAgIElCaW5kZXIgaUJpbmRlciA9IFNlcnZpY2VNYW5hZ2VyLmdldFNlcnZpY2UoQ29udGV4dC5BQ0NFU1NJQklMSVRZX1NFUlZJQ0UpOwotICAgICAgICBtU2VydmljZSA9IElBY2Nlc3NpYmlsaXR5TWFuYWdlci5TdHViLmFzSW50ZXJmYWNlKGlCaW5kZXIpOworICAgICAgICBtU2VydmljZSA9IHNlcnZpY2U7CisKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIG1TZXJ2aWNlLmFkZENsaWVudChtQ2xpZW50KTsKKyAgICAgICAgICAgIG1Jc0VuYWJsZWQgPSBtU2VydmljZS5hZGRDbGllbnQobUNsaWVudCk7CiAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiByZSkgewogICAgICAgICAgICAgTG9nLmUoTE9HX1RBRywgIkFjY2Vzc2liaWxpdHlNYW5hZ2VyU2VydmljZSBpcyBkZWFkIiwgcmUpOwogICAgICAgICB9CkBAIC0xMjgsNiArMTMzLDE4IEBACiAgICAgfQogCiAgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgY2xpZW50IGludGVyZmFjZSB0aGlzIGluc3RhbmNlIHJlZ2lzdGVycyBpbgorICAgICAqIHRoZSBjZW50cmFsaXplZCBhY2Nlc3NpYmlsaXR5IG1hbmFnZXIgc2VydmljZS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gVGhlIGNsaWVudC4KKyAgICAgKgorICAgICAqIEBoaWRlCisgICAgICovCisgICAgcHVibGljIElBY2Nlc3NpYmlsaXR5TWFuYWdlckNsaWVudCBnZXRDbGllbnQoKSB7CisgICAgICAgcmV0dXJuIChJQWNjZXNzaWJpbGl0eU1hbmFnZXJDbGllbnQpIG1DbGllbnQuYXNCaW5kZXIoKTsgCisgICAgfQorCisgICAgLyoqCiAgICAgICogU2VuZHMgYW4ge0BsaW5rIEFjY2Vzc2liaWxpdHlFdmVudH0uIElmIHRoaXMge0BsaW5rIEFjY2Vzc2liaWxpdHlNYW5hZ2VyfSBpcyBub3QKICAgICAgKiBlbmFibGVkIHRoZSBjYWxsIGlzIGEgTk9PUC4KICAgICAgKgpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9hY2Nlc3NpYmlsaXR5L0lBY2Nlc3NpYmlsaXR5TWFuYWdlci5haWRsIGIvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9hY2Nlc3NpYmlsaXR5L0lBY2Nlc3NpYmlsaXR5TWFuYWdlci5haWRsCmluZGV4IDMyNzg4YmUuLjc2MzM1NjkgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvYWNjZXNzaWJpbGl0eS9JQWNjZXNzaWJpbGl0eU1hbmFnZXIuYWlkbAorKysgYi9jb3JlL2phdmEvYW5kcm9pZC92aWV3L2FjY2Vzc2liaWxpdHkvSUFjY2Vzc2liaWxpdHlNYW5hZ2VyLmFpZGwKQEAgLTI5LDcgKzI5LDcgQEAKICAqLwogaW50ZXJmYWNlIElBY2Nlc3NpYmlsaXR5TWFuYWdlciB7CiAKLSAgICB2b2lkIGFkZENsaWVudChJQWNjZXNzaWJpbGl0eU1hbmFnZXJDbGllbnQgY2xpZW50KTsKKyAgICBib29sZWFuIGFkZENsaWVudChJQWNjZXNzaWJpbGl0eU1hbmFnZXJDbGllbnQgY2xpZW50KTsKIAogICAgIGJvb2xlYW4gc2VuZEFjY2Vzc2liaWxpdHlFdmVudChpbiBBY2Nlc3NpYmlsaXR5RXZlbnQgdWlFdmVudCk7CiAKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvYW5pbWF0aW9uL0FuaW1hdGlvbi5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9hbmltYXRpb24vQW5pbWF0aW9uLmphdmEKaW5kZXggMzQ5YjdlNS4uOWExZTQxYyAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9hbmltYXRpb24vQW5pbWF0aW9uLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9hbmltYXRpb24vQW5pbWF0aW9uLmphdmEKQEAgLTE3NCw3ICsxNzQsMTMgQEAKICAgICAgKiBEZXNpcmVkIFogb3JkZXIgbW9kZSBkdXJpbmcgYW5pbWF0aW9uLgogICAgICAqLwogICAgIHByaXZhdGUgaW50IG1aQWRqdXN0bWVudDsKLSAgICAKKworICAgIC8qKgorICAgICAqIHNjYWxlZmFjdG9yIHRvIGFwcGx5IHRvIHBpdm90IHBvaW50cywgZXRjLiBkdXJpbmcgYW5pbWF0aW9uLiBTdWJjbGFzc2VzIHJldHJpZXZlIHRoZQorICAgICAqIHZhbHVlIHZpYSBnZXRTY2FsZUZhY3RvcigpLgorICAgICAqLworICAgIHByaXZhdGUgZmxvYXQgbVNjYWxlRmFjdG9yID0gMWY7CisKICAgICAvKioKICAgICAgKiBEb24ndCBhbmltYXRlIHRoZSB3YWxscGFwZXIuCiAgICAgICovCkBAIC0zMDEsNyArMzA3LDcgQEAKICAgICAgKiBhbmltYXRlZCBhcyB3ZWxsIGFzIHRoZSBvYmplY3RzIHBhcmVudHMuIChUaGlzIGlzIHRvIHN1cHBvcnQgYW5pbWF0aW9uCiAgICAgICogc2l6ZXMgYmVpbmcgc3BlY2lmZWQgcmVsYXRpdmUgdG8gdGhlc2UgZGltZW5zaW9ucy4pCiAgICAgICoKLSAgICAgKiA8cD5PYmplY3RzIHRoYXQgaW50ZXJwcmV0IGEgQW5pbWF0aW9ucyBzaG91bGQgY2FsbCB0aGlzIG1ldGhvZCB3aGVuCisgICAgICogPHA+T2JqZWN0cyB0aGF0IGludGVycHJldCBBbmltYXRpb25zIHNob3VsZCBjYWxsIHRoaXMgbWV0aG9kIHdoZW4KICAgICAgKiB0aGUgc2l6ZXMgb2YgdGhlIG9iamVjdCBiZWluZyBhbmltYXRlZCBhbmQgaXRzIHBhcmVudCBhcmUga25vd24sIGFuZAogICAgICAqIGJlZm9yZSBjYWxsaW5nIHtAbGluayAjZ2V0VHJhbnNmb3JtYXRpb259LgogICAgICAqCkBAIC01NTMsNiArNTU5LDE5IEBACiAgICAgfQogICAgIAogICAgIC8qKgorICAgICAqIFRoZSBzY2FsZSBmYWN0b3IgaXMgc2V0IGJ5IHRoZSBjYWxsIHRvIDxjb2RlPmdldFRyYW5zZm9ybWF0aW9uPC9jb2RlPi4gT3ZlcnJpZGVzIG9mIAorICAgICAqIHtAbGluayAjZ2V0VHJhbnNmb3JtYXRpb24obG9uZywgVHJhbnNmb3JtYXRpb24sIGZsb2F0KX0gd2lsbCBnZXQgdGhpcyB2YWx1ZQorICAgICAqIGRpcmVjdGx5LiBPdmVycmlkZXMgb2Yge0BsaW5rICNhcHBseVRyYW5zZm9ybWF0aW9uKGZsb2F0LCBUcmFuc2Zvcm1hdGlvbil9IGNhbgorICAgICAqIGNhbGwgdGhpcyBtZXRob2QgdG8gZ2V0IHRoZSB2YWx1ZS4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIGZsb2F0IFRoZSBzY2FsZSBmYWN0b3IgdGhhdCBzaG91bGQgYmUgYXBwbGllZCB0byBwcmUtc2NhbGVkIHZhbHVlcyBpbgorICAgICAqIGFuIEFuaW1hdGlvbiBzdWNoIGFzIHRoZSBwaXZvdCBwb2ludHMgaW4ge0BsaW5rIFNjYWxlQW5pbWF0aW9ufSBhbmQge0BsaW5rIFJvdGF0ZUFuaW1hdGlvbn0uCisgICAgICovCisgICAgcHJvdGVjdGVkIGZsb2F0IGdldFNjYWxlRmFjdG9yKCkgeworICAgICAgICByZXR1cm4gbVNjYWxlRmFjdG9yOworICAgIH0KKworICAgIC8qKgogICAgICAqIElmIGRldGFjaFdhbGxwYXBlciBpcyB0cnVlLCBhbmQgdGhpcyBpcyBhIHdpbmRvdyBhbmltYXRpb24gb2YgYSB3aW5kb3cKICAgICAgKiB0aGF0IGhhcyBhIHdhbGxwYXBlciBiYWNrZ3JvdW5kLCB0aGVuIHRoZSB3aW5kb3cgd2lsbCBiZSBkZXRhY2hlZCBmcm9tCiAgICAgICogdGhlIHdhbGxwYXBlciB3aGlsZSBpdCBydW5zLiAgVGhhdCBpcywgdGhlIGFuaW1hdGlvbiB3aWxsIG9ubHkgYmUgYXBwbGllZApAQCAtNzM1LDYgKzc1NCw3IEBACiAgICAgICogQHJldHVybiBUcnVlIGlmIHRoZSBhbmltYXRpb24gaXMgc3RpbGwgcnVubmluZwogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIGdldFRyYW5zZm9ybWF0aW9uKGxvbmcgY3VycmVudFRpbWUsIFRyYW5zZm9ybWF0aW9uIG91dFRyYW5zZm9ybWF0aW9uKSB7CisKICAgICAgICAgaWYgKG1TdGFydFRpbWUgPT0gLTEpIHsKICAgICAgICAgICAgIG1TdGFydFRpbWUgPSBjdXJyZW50VGltZTsKICAgICAgICAgfQpAQCAtODA2LDYgKzgyNiwyNCBAQAogCiAgICAgICAgIHJldHVybiBtTW9yZTsKICAgICB9CisgICAgCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgdHJhbnNmb3JtYXRpb24gdG8gYXBwbHkgYXQgYSBzcGVjaWZpZWQgcG9pbnQgaW4gdGltZS4gSW1wbGVtZW50YXRpb25zIG9mIHRoaXMKKyAgICAgKiBtZXRob2Qgc2hvdWxkIGFsd2F5cyByZXBsYWNlIHRoZSBzcGVjaWZpZWQgVHJhbnNmb3JtYXRpb24gb3IgZG9jdW1lbnQgdGhleSBhcmUgZG9pbmcKKyAgICAgKiBvdGhlcndpc2UuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY3VycmVudFRpbWUgV2hlcmUgd2UgYXJlIGluIHRoZSBhbmltYXRpb24uIFRoaXMgaXMgd2FsbCBjbG9jayB0aW1lLgorICAgICAqIEBwYXJhbSBvdXRUcmFuc2Zvcm1hdGlvbiBBIHRyYW5mb3JtYXRpb24gb2JqZWN0IHRoYXQgaXMgcHJvdmlkZWQgYnkgdGhlCisgICAgICogICAgICAgIGNhbGxlciBhbmQgd2lsbCBiZSBmaWxsZWQgaW4gYnkgdGhlIGFuaW1hdGlvbi4KKyAgICAgKiBAcGFyYW0gc2NhbGUgU2NhbGluZyBmYWN0b3IgdG8gYXBwbHkgdG8gYW55IGlucHV0cyB0byB0aGUgdHJhbnNmb3JtIG9wZXJhdGlvbiwgc3VjaAorICAgICAqICAgICAgICBwaXZvdCBwb2ludHMgYmVpbmcgcm90YXRlZCBvciBzY2FsZWQgYXJvdW5kLgorICAgICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgYW5pbWF0aW9uIGlzIHN0aWxsIHJ1bm5pbmcKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBnZXRUcmFuc2Zvcm1hdGlvbihsb25nIGN1cnJlbnRUaW1lLCBUcmFuc2Zvcm1hdGlvbiBvdXRUcmFuc2Zvcm1hdGlvbiwKKyAgICAgICAgICAgIGZsb2F0IHNjYWxlKSB7CisgICAgICAgIG1TY2FsZUZhY3RvciA9IHNjYWxlOworICAgICAgICByZXR1cm4gZ2V0VHJhbnNmb3JtYXRpb24oY3VycmVudFRpbWUsIG91dFRyYW5zZm9ybWF0aW9uKTsKKyAgICB9CiAKICAgICAvKioKICAgICAgKiA8cD5JbmRpY2F0ZXMgd2hldGhlciB0aGlzIGFuaW1hdGlvbiBoYXMgc3RhcnRlZCBvciBub3QuPC9wPgpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9hbmltYXRpb24vQW5pbWF0aW9uU2V0LmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC92aWV3L2FuaW1hdGlvbi9BbmltYXRpb25TZXQuamF2YQppbmRleCAxNTQ2ZGNkLi44NzNjZTUzIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC92aWV3L2FuaW1hdGlvbi9BbmltYXRpb25TZXQuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC92aWV3L2FuaW1hdGlvbi9BbmltYXRpb25TZXQuamF2YQpAQCAtMzEyLDcgKzMxMiw3IEBACiAgICAgICAgICAgICBmaW5hbCBBbmltYXRpb24gYSA9IGFuaW1hdGlvbnMuZ2V0KGkpOwogCiAgICAgICAgICAgICB0ZW1wLmNsZWFyKCk7Ci0gICAgICAgICAgICBtb3JlID0gYS5nZXRUcmFuc2Zvcm1hdGlvbihjdXJyZW50VGltZSwgdGVtcCkgfHwgbW9yZTsKKyAgICAgICAgICAgIG1vcmUgPSBhLmdldFRyYW5zZm9ybWF0aW9uKGN1cnJlbnRUaW1lLCB0ZW1wLCBnZXRTY2FsZUZhY3RvcigpKSB8fCBtb3JlOwogICAgICAgICAgICAgdC5jb21wb3NlKHRlbXApOwogCiAgICAgICAgICAgICBzdGFydGVkID0gc3RhcnRlZCB8fCBhLmhhc1N0YXJ0ZWQoKTsKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvYW5pbWF0aW9uL0FuaW1hdGlvblV0aWxzLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC92aWV3L2FuaW1hdGlvbi9BbmltYXRpb25VdGlscy5qYXZhCmluZGV4IDMwODgzODIuLjMyZmY2NDcgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvYW5pbWF0aW9uL0FuaW1hdGlvblV0aWxzLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9hbmltYXRpb24vQW5pbWF0aW9uVXRpbHMuamF2YQpAQCAtMzMsNiArMzMsMTQgQEAKICAqCiAgKi8KIHB1YmxpYyBjbGFzcyBBbmltYXRpb25VdGlscyB7CisKKyAgICAvKioKKyAgICAgKiBUaGVzZSBmbGFncyBhcmUgdXNlZCB3aGVuIHBhcnNpbmcgQW5pbWF0b3JTZXQgb2JqZWN0cworICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBUT0dFVEhFUiA9IDA7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNFUVVFTlRJQUxMWSA9IDE7CisKKwogICAgIC8qKgogICAgICAqIFJldHVybnMgdGhlIGN1cnJlbnQgYW5pbWF0aW9uIHRpbWUgaW4gbWlsbGlzZWNvbmRzLiBUaGlzIHRpbWUgc2hvdWxkIGJlIHVzZWQgd2hlbiBpbnZva2luZwogICAgICAqIHtAbGluayBBbmltYXRpb24jc2V0U3RhcnRUaW1lKGxvbmcpfS4gUmVmZXIgdG8ge0BsaW5rIGFuZHJvaWQub3MuU3lzdGVtQ2xvY2t9IGZvciBtb3JlCkBAIC00OSw3ICs1Nyw3IEBACiAKICAgICAvKioKICAgICAgKiBMb2FkcyBhbiB7QGxpbmsgQW5pbWF0aW9ufSBvYmplY3QgZnJvbSBhIHJlc291cmNlCi0gICAgICogCisgICAgICoKICAgICAgKiBAcGFyYW0gY29udGV4dCBBcHBsaWNhdGlvbiBjb250ZXh0IHVzZWQgdG8gYWNjZXNzIHJlc291cmNlcwogICAgICAqIEBwYXJhbSBpZCBUaGUgcmVzb3VyY2UgaWQgb2YgdGhlIGFuaW1hdGlvbiB0byBsb2FkCiAgICAgICogQHJldHVybiBUaGUgYW5pbWF0aW9uIG9iamVjdCByZWZlcmVuY2UgYnkgdGhlIHNwZWNpZmllZCBpZApAQCAtODIsMTIgKzkwLDEyIEBACiAKICAgICAgICAgcmV0dXJuIGNyZWF0ZUFuaW1hdGlvbkZyb21YbWwoYywgcGFyc2VyLCBudWxsLCBYbWwuYXNBdHRyaWJ1dGVTZXQocGFyc2VyKSk7CiAgICAgfQotICAgIAorCiAgICAgcHJpdmF0ZSBzdGF0aWMgQW5pbWF0aW9uIGNyZWF0ZUFuaW1hdGlvbkZyb21YbWwoQ29udGV4dCBjLCBYbWxQdWxsUGFyc2VyIHBhcnNlciwKICAgICAgICAgICAgIEFuaW1hdGlvblNldCBwYXJlbnQsIEF0dHJpYnV0ZVNldCBhdHRycykgdGhyb3dzIFhtbFB1bGxQYXJzZXJFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKLSAgICAgICAgCisKICAgICAgICAgQW5pbWF0aW9uIGFuaW0gPSBudWxsOwotIAorCiAgICAgICAgIC8vIE1ha2Ugc3VyZSB3ZSBhcmUgb24gYSBzdGFydCB0YWcuCiAgICAgICAgIGludCB0eXBlOwogICAgICAgICBpbnQgZGVwdGggPSBwYXJzZXIuZ2V0RGVwdGgoKTsKQEAgLTEwMCw3ICsxMDgsNyBAQAogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBTdHJpbmcgIG5hbWUgPSBwYXJzZXIuZ2V0TmFtZSgpOwotICAgIAorCiAgICAgICAgICAgICBpZiAobmFtZS5lcXVhbHMoInNldCIpKSB7CiAgICAgICAgICAgICAgICAgYW5pbSA9IG5ldyBBbmltYXRpb25TZXQoYywgYXR0cnMpOwogICAgICAgICAgICAgICAgIGNyZWF0ZUFuaW1hdGlvbkZyb21YbWwoYywgcGFyc2VyLCAoQW5pbWF0aW9uU2V0KWFuaW0sIGF0dHJzKTsKQEAgLTEyMCw3ICsxMjgsNyBAQAogICAgICAgICAgICAgICAgIHBhcmVudC5hZGRBbmltYXRpb24oYW5pbSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KLSAgICAKKwogICAgICAgICByZXR1cm4gYW5pbTsKIAogICAgIH0KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvYW5pbWF0aW9uL1JvdGF0ZUFuaW1hdGlvbi5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9hbmltYXRpb24vUm90YXRlQW5pbWF0aW9uLmphdmEKaW5kZXggMjg0Y2NjZS4uNThiZjA4NCAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9hbmltYXRpb24vUm90YXRlQW5pbWF0aW9uLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9hbmltYXRpb24vUm90YXRlQW5pbWF0aW9uLmphdmEKQEAgLTE0OCwxMSArMTQ4LDEyIEBACiAgICAgQE92ZXJyaWRlCiAgICAgcHJvdGVjdGVkIHZvaWQgYXBwbHlUcmFuc2Zvcm1hdGlvbihmbG9hdCBpbnRlcnBvbGF0ZWRUaW1lLCBUcmFuc2Zvcm1hdGlvbiB0KSB7CiAgICAgICAgIGZsb2F0IGRlZ3JlZXMgPSBtRnJvbURlZ3JlZXMgKyAoKG1Ub0RlZ3JlZXMgLSBtRnJvbURlZ3JlZXMpICogaW50ZXJwb2xhdGVkVGltZSk7Ci0KKyAgICAgICAgZmxvYXQgc2NhbGUgPSBnZXRTY2FsZUZhY3RvcigpOworICAgICAgICAKICAgICAgICAgaWYgKG1QaXZvdFggPT0gMC4wZiAmJiBtUGl2b3RZID09IDAuMGYpIHsKICAgICAgICAgICAgIHQuZ2V0TWF0cml4KCkuc2V0Um90YXRlKGRlZ3JlZXMpOwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdC5nZXRNYXRyaXgoKS5zZXRSb3RhdGUoZGVncmVlcywgbVBpdm90WCwgbVBpdm90WSk7CisgICAgICAgICAgICB0LmdldE1hdHJpeCgpLnNldFJvdGF0ZShkZWdyZWVzLCBtUGl2b3RYICogc2NhbGUsIG1QaXZvdFkgKiBzY2FsZSk7CiAgICAgICAgIH0KICAgICB9CiAKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvYW5pbWF0aW9uL1NjYWxlQW5pbWF0aW9uLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC92aWV3L2FuaW1hdGlvbi9TY2FsZUFuaW1hdGlvbi5qYXZhCmluZGV4IDFhNTZjOGIuLjg1MzdkNDIgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvYW5pbWF0aW9uL1NjYWxlQW5pbWF0aW9uLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9hbmltYXRpb24vU2NhbGVBbmltYXRpb24uamF2YQpAQCAtMTYxLDYgKzE2MSw3IEBACiAgICAgcHJvdGVjdGVkIHZvaWQgYXBwbHlUcmFuc2Zvcm1hdGlvbihmbG9hdCBpbnRlcnBvbGF0ZWRUaW1lLCBUcmFuc2Zvcm1hdGlvbiB0KSB7CiAgICAgICAgIGZsb2F0IHN4ID0gMS4wZjsKICAgICAgICAgZmxvYXQgc3kgPSAxLjBmOworICAgICAgICBmbG9hdCBzY2FsZSA9IGdldFNjYWxlRmFjdG9yKCk7CiAKICAgICAgICAgaWYgKG1Gcm9tWCAhPSAxLjBmIHx8IG1Ub1ggIT0gMS4wZikgewogICAgICAgICAgICAgc3ggPSBtRnJvbVggKyAoKG1Ub1ggLSBtRnJvbVgpICogaW50ZXJwb2xhdGVkVGltZSk7CkBAIC0xNzIsNyArMTczLDcgQEAKICAgICAgICAgaWYgKG1QaXZvdFggPT0gMCAmJiBtUGl2b3RZID09IDApIHsKICAgICAgICAgICAgIHQuZ2V0TWF0cml4KCkuc2V0U2NhbGUoc3gsIHN5KTsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHQuZ2V0TWF0cml4KCkuc2V0U2NhbGUoc3gsIHN5LCBtUGl2b3RYLCBtUGl2b3RZKTsKKyAgICAgICAgICAgIHQuZ2V0TWF0cml4KCkuc2V0U2NhbGUoc3gsIHN5LCBzY2FsZSAqIG1QaXZvdFgsIHNjYWxlICogbVBpdm90WSk7CiAgICAgICAgIH0KICAgICB9CiAKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvaW5wdXRtZXRob2QvSW5wdXRNZXRob2RJbmZvLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC92aWV3L2lucHV0bWV0aG9kL0lucHV0TWV0aG9kSW5mby5qYXZhCmluZGV4IDM1N2NiNWZlLi42OGUyMzFjIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC92aWV3L2lucHV0bWV0aG9kL0lucHV0TWV0aG9kSW5mby5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvaW5wdXRtZXRob2QvSW5wdXRNZXRob2RJbmZvLmphdmEKQEAgLTM3LDYgKzM3LDcgQEAKIGltcG9ydCBhbmRyb2lkLnV0aWwuWG1sOwogCiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwogCiAvKioKICAqIFRoaXMgY2xhc3MgaXMgdXNlZCB0byBzcGVjaWZ5IG1ldGEgaW5mb3JtYXRpb24gb2YgYW4gaW5wdXQgbWV0aG9kLgpAQCAtNjgsNyArNjksMTA4IEBACiAgICAgICogY2FuIGNoYW5nZSBiYXNlZCBvbiB0aGUgY29uZmlndXJhdGlvbiAoaW4gcGFydGljdWxhciBsb2NhbGUpLgogICAgICAqLwogICAgIGZpbmFsIGludCBtSXNEZWZhdWx0UmVzSWQ7Ci0gICAgCisKKyAgICAvKioKKyAgICAgKiBJbnB1dE1ldGhvZFN1YnR5cGUgaXMgYSBzdWJ0eXBlIGNvbnRhaW5lZCBpbiB0aGUgaW5wdXQgbWV0aG9kLiBTdWJ0eXBlIGNhbiBkZXNjcmliZQorICAgICAqIGxvY2FsZXMgKGUuZy4gZW5fVVMsIGZyX0ZSLi4uKSBhbmQgbW9kZXMgKGUuZy4gdm9pY2UsIGtleWJvYXJkLi4uKSwgYW5kIGlzIHVzZWQgZm9yCisgICAgICogSU1FIHN3aXRjaC4gVGhlIHN1YnR5cGUgYWxsb3dzIHRoZSBzeXN0ZW0gdG8gY2FsbCB0aGUgc3BlY2lmaWVkIHN1YnR5cGUgb2YgSU1FIGRpcmVjdGx5LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgSW5wdXRNZXRob2RTdWJ0eXBlIGltcGxlbWVudHMgUGFyY2VsYWJsZSB7CisgICAgICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIG1TdWJ0eXBlTmFtZTsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBpbnQgbVN1YnR5cGVJY29uSWQ7CisgICAgICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIG1TdWJ0eXBlTG9jYWxlOworICAgICAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBtU3VidHlwZU1vZGU7CisgICAgICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIG1TdWJ0eXBlRXh0cmFWYWx1ZTsKKworICAgICAgICAvKioKKyAgICAgICAgICogQ29uc3RydWN0b3IKKyAgICAgICAgICogQHBhcmFtIG5hbWUgVGhlIG5hbWUgb2YgdGhlIHN1YnR5cGUKKyAgICAgICAgICogQHBhcmFtIGljb25JZCBUaGUgaWNvbiBvZiB0aGUgc3VidHlwZQorICAgICAgICAgKiBAcGFyYW0gbG9jYWxlIFRoZSBsb2NhbGUgc3VwcG9ydGVkIGJ5IHRoZSBzdWJ0eXBlCisgICAgICAgICAqIEBwYXJhbSBtb2RlIFRoZSBtb2RlIHN1cHBvcnRlZCBieSB0aGUgc3VidHlwZQorICAgICAgICAgKiBAcGFyYW0gZXh0cmFWYWx1ZSBUaGUgZXh0cmEgdmFsdWUgb2YgdGhlIHN1YnR5cGUKKyAgICAgICAgICovCisgICAgICAgIElucHV0TWV0aG9kU3VidHlwZShTdHJpbmcgbmFtZSwgaW50IGljb25JZCwgU3RyaW5nIGxvY2FsZSwgU3RyaW5nIG1vZGUsCisgICAgICAgICAgICAgICAgU3RyaW5nIGV4dHJhVmFsdWUpIHsKKyAgICAgICAgICAgIG1TdWJ0eXBlTmFtZSA9IG5hbWU7CisgICAgICAgICAgICBtU3VidHlwZUljb25JZCA9IGljb25JZDsKKyAgICAgICAgICAgIG1TdWJ0eXBlTG9jYWxlID0gbG9jYWxlOworICAgICAgICAgICAgbVN1YnR5cGVNb2RlID0gbW9kZTsKKyAgICAgICAgICAgIG1TdWJ0eXBlRXh0cmFWYWx1ZSA9IGV4dHJhVmFsdWU7CisgICAgICAgIH0KKworICAgICAgICBJbnB1dE1ldGhvZFN1YnR5cGUoUGFyY2VsIHNvdXJjZSkgeworICAgICAgICAgICAgbVN1YnR5cGVOYW1lID0gc291cmNlLnJlYWRTdHJpbmcoKTsKKyAgICAgICAgICAgIG1TdWJ0eXBlSWNvbklkID0gc291cmNlLnJlYWRJbnQoKTsKKyAgICAgICAgICAgIG1TdWJ0eXBlTG9jYWxlID0gc291cmNlLnJlYWRTdHJpbmcoKTsKKyAgICAgICAgICAgIG1TdWJ0eXBlTW9kZSA9IHNvdXJjZS5yZWFkU3RyaW5nKCk7CisgICAgICAgICAgICBtU3VidHlwZUV4dHJhVmFsdWUgPSBzb3VyY2UucmVhZFN0cmluZygpOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEByZXR1cm4gdGhlIG5hbWUgb2YgdGhlIHN1YnR5cGUKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBtU3VidHlwZU5hbWU7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogQHJldHVybiB0aGUgaWNvbiBvZiB0aGUgc3VidHlwZQorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIGludCBnZXRJY29uSWQoKSB7CisgICAgICAgICAgICByZXR1cm4gbVN1YnR5cGVJY29uSWQ7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogQHJldHVybiB0aGUgbG9jYWxlIG9mIHRoZSBzdWJ0eXBlCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgU3RyaW5nIGdldExvY2FsZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBtU3VidHlwZUxvY2FsZTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBAcmV0dXJuIHRoZSBtb2RlIG9mIHRoZSBzdWJ0eXBlCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgU3RyaW5nIGdldE1vZGUoKSB7CisgICAgICAgICAgICByZXR1cm4gbVN1YnR5cGVNb2RlOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEByZXR1cm4gdGhlIGV4dHJhIHZhbHVlIG9mIHRoZSBzdWJ0eXBlCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgU3RyaW5nIGdldEV4dHJhVmFsdWUoKSB7CisgICAgICAgICAgICByZXR1cm4gbVN1YnR5cGVFeHRyYVZhbHVlOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGludCBkZXNjcmliZUNvbnRlbnRzKCkgeworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCB3cml0ZVRvUGFyY2VsKFBhcmNlbCBkZXN0LCBpbnQgcGFyY2VsYWJsZUZsYWdzKSB7CisgICAgICAgICAgICBkZXN0LndyaXRlU3RyaW5nKG1TdWJ0eXBlTmFtZSk7CisgICAgICAgICAgICBkZXN0LndyaXRlSW50KG1TdWJ0eXBlSWNvbklkKTsKKyAgICAgICAgICAgIGRlc3Qud3JpdGVTdHJpbmcobVN1YnR5cGVMb2NhbGUpOworICAgICAgICAgICAgZGVzdC53cml0ZVN0cmluZyhtU3VidHlwZU1vZGUpOworICAgICAgICAgICAgZGVzdC53cml0ZVN0cmluZyhtU3VidHlwZUV4dHJhVmFsdWUpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBQYXJjZWxhYmxlLkNyZWF0b3I8SW5wdXRNZXRob2RTdWJ0eXBlPiBDUkVBVE9SCisgICAgICAgICAgICAgICAgPSBuZXcgUGFyY2VsYWJsZS5DcmVhdG9yPElucHV0TWV0aG9kU3VidHlwZT4oKSB7CisgICAgICAgICAgICBwdWJsaWMgSW5wdXRNZXRob2RTdWJ0eXBlIGNyZWF0ZUZyb21QYXJjZWwoUGFyY2VsIHNvdXJjZSkgeworICAgICAgICAgICAgICAgIHJldHVybiBuZXcgSW5wdXRNZXRob2RTdWJ0eXBlKHNvdXJjZSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBJbnB1dE1ldGhvZFN1YnR5cGVbXSBuZXdBcnJheShpbnQgc2l6ZSkgeworICAgICAgICAgICAgICAgIHJldHVybiBuZXcgSW5wdXRNZXRob2RTdWJ0eXBlW3NpemVdOworICAgICAgICAgICAgfQorICAgICAgICB9OworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSBhcnJheSBvZiB0aGUgc3VidHlwZXMuCisgICAgICovCisgICAgcHJpdmF0ZSBmaW5hbCBBcnJheUxpc3Q8SW5wdXRNZXRob2RTdWJ0eXBlPiBtU3VidHlwZXMgPSBuZXcgQXJyYXlMaXN0PElucHV0TWV0aG9kU3VidHlwZT4oKTsKKwogICAgIC8qKgogICAgICAqIENvbnN0cnVjdG9yLgogICAgICAqIApAQCAtODEsMTEgKzE4MywxMSBAQAogICAgICAgICBtU2VydmljZSA9IHNlcnZpY2U7CiAgICAgICAgIFNlcnZpY2VJbmZvIHNpID0gc2VydmljZS5zZXJ2aWNlSW5mbzsKICAgICAgICAgbUlkID0gbmV3IENvbXBvbmVudE5hbWUoc2kucGFja2FnZU5hbWUsIHNpLm5hbWUpLmZsYXR0ZW5Ub1Nob3J0U3RyaW5nKCk7Ci0gICAgICAgIAorCiAgICAgICAgIFBhY2thZ2VNYW5hZ2VyIHBtID0gY29udGV4dC5nZXRQYWNrYWdlTWFuYWdlcigpOwogICAgICAgICBTdHJpbmcgc2V0dGluZ3NBY3Rpdml0eUNvbXBvbmVudCA9IG51bGw7CiAgICAgICAgIGludCBpc0RlZmF1bHRSZXNJZCA9IDA7Ci0gICAgICAgIAorCiAgICAgICAgIFhtbFJlc291cmNlUGFyc2VyIHBhcnNlciA9IG51bGw7CiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBwYXJzZXIgPSBzaS5sb2FkWG1sTWV0YURhdGEocG0sIElucHV0TWV0aG9kLlNFUlZJQ0VfTUVUQV9EQVRBKTsKQEAgLTExNiwxMyArMjE4LDM2IEBACiAgICAgICAgICAgICBpc0RlZmF1bHRSZXNJZCA9IHNhLmdldFJlc291cmNlSWQoCiAgICAgICAgICAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLklucHV0TWV0aG9kX2lzRGVmYXVsdCwgMCk7CiAgICAgICAgICAgICBzYS5yZWN5Y2xlKCk7CisKKyAgICAgICAgICAgIGZpbmFsIGludCBkZXB0aCA9IHBhcnNlci5nZXREZXB0aCgpOworICAgICAgICAgICAgLy8gUGFyc2UgYWxsIHN1YnR5cGVzCisgICAgICAgICAgICB3aGlsZSAoKCh0eXBlID0gcGFyc2VyLm5leHQoKSkgIT0gWG1sUHVsbFBhcnNlci5FTkRfVEFHIHx8IHBhcnNlci5nZXREZXB0aCgpID4gZGVwdGgpCisgICAgICAgICAgICAgICAgICAgICYmIHR5cGUgIT0gWG1sUHVsbFBhcnNlci5FTkRfRE9DVU1FTlQpIHsKKyAgICAgICAgICAgICAgICBub2RlTmFtZSA9IHBhcnNlci5nZXROYW1lKCk7CisgICAgICAgICAgICAgICAgaWYgKCEic3VidHlwZSIuZXF1YWxzKG5vZGVOYW1lKSkgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgWG1sUHVsbFBhcnNlckV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgICAgICJNZXRhLWRhdGEgaW4gaW5wdXQtbWV0aG9kIGRvZXMgbm90IHN0YXJ0IHdpdGggc3VidHlwZSB0YWciKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZmluYWwgVHlwZWRBcnJheSBhID0gcmVzLm9idGFpbkF0dHJpYnV0ZXMoCisgICAgICAgICAgICAgICAgICAgICAgICBhdHRycywgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZWFibGUuSW5wdXRNZXRob2RfU3VidHlwZSk7CisgICAgICAgICAgICAgICAgSW5wdXRNZXRob2RTdWJ0eXBlIHN1YnR5cGUgPSBuZXcgSW5wdXRNZXRob2RTdWJ0eXBlKAorICAgICAgICAgICAgICAgICAgICAgICAgYS5nZXRTdHJpbmcoY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZWFibGUuSW5wdXRNZXRob2RfU3VidHlwZV9sYWJlbCksCisgICAgICAgICAgICAgICAgICAgICAgICBhLmdldFJlc291cmNlSWQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLklucHV0TWV0aG9kX1N1YnR5cGVfaWNvbiwgMCksCisgICAgICAgICAgICAgICAgICAgICAgICBhLmdldFN0cmluZyhjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuSW5wdXRNZXRob2RfU3VidHlwZV9pbWVTdWJ0eXBlTG9jYWxlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGEuZ2V0U3RyaW5nKGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5JbnB1dE1ldGhvZF9TdWJ0eXBlX2ltZVN1YnR5cGVNb2RlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGEuZ2V0U3RyaW5nKGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5JbnB1dE1ldGhvZF9TdWJ0eXBlX2ltZVN1YnR5cGVFeHRyYVZhbHVlKSk7CisgICAgICAgICAgICAgICAgbVN1YnR5cGVzLmFkZChzdWJ0eXBlKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgfSBjYXRjaCAoTmFtZU5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKICAgICAgICAgICAgIHRocm93IG5ldyBYbWxQdWxsUGFyc2VyRXhjZXB0aW9uKAogICAgICAgICAgICAgICAgICAgICAiVW5hYmxlIHRvIGNyZWF0ZSBjb250ZXh0IGZvcjogIiArIHNpLnBhY2thZ2VOYW1lKTsKICAgICAgICAgfSBmaW5hbGx5IHsKICAgICAgICAgICAgIGlmIChwYXJzZXIgIT0gbnVsbCkgcGFyc2VyLmNsb3NlKCk7CiAgICAgICAgIH0KLSAgICAgICAgCiAgICAgICAgIG1TZXR0aW5nc0FjdGl2aXR5TmFtZSA9IHNldHRpbmdzQWN0aXZpdHlDb21wb25lbnQ7CiAgICAgICAgIG1Jc0RlZmF1bHRSZXNJZCA9IGlzRGVmYXVsdFJlc0lkOwogICAgIH0KQEAgLTEzMiw4ICsyNTcsOSBAQAogICAgICAgICBtU2V0dGluZ3NBY3Rpdml0eU5hbWUgPSBzb3VyY2UucmVhZFN0cmluZygpOwogICAgICAgICBtSXNEZWZhdWx0UmVzSWQgPSBzb3VyY2UucmVhZEludCgpOwogICAgICAgICBtU2VydmljZSA9IFJlc29sdmVJbmZvLkNSRUFUT1IuY3JlYXRlRnJvbVBhcmNlbChzb3VyY2UpOworICAgICAgICBzb3VyY2UucmVhZFR5cGVkTGlzdChtU3VidHlwZXMsIElucHV0TWV0aG9kU3VidHlwZS5DUkVBVE9SKTsKICAgICB9Ci0gICAgCisKICAgICAvKioKICAgICAgKiBUZW1wb3JhcnkgQVBJIGZvciBjcmVhdGluZyBhIGJ1aWx0LWluIGlucHV0IG1ldGhvZC4KICAgICAgKi8KQEAgLTE1Niw3ICsyODIsNyBAQAogICAgICAgICBtU2V0dGluZ3NBY3Rpdml0eU5hbWUgPSBzZXR0aW5nc0FjdGl2aXR5OwogICAgICAgICBtSXNEZWZhdWx0UmVzSWQgPSAwOwogICAgIH0KLSAgICAKKwogICAgIC8qKgogICAgICAqIFJldHVybiBhIHVuaXF1ZSBJRCBmb3IgdGhpcyBpbnB1dCBtZXRob2QuICBUaGUgSUQgaXMgZ2VuZXJhdGVkIGZyb20KICAgICAgKiB0aGUgcGFja2FnZSBhbmQgY2xhc3MgbmFtZSBpbXBsZW1lbnRpbmcgdGhlIG1ldGhvZC4KQEAgLTE2NCwxNCArMjkwLDE0IEBACiAgICAgcHVibGljIFN0cmluZyBnZXRJZCgpIHsKICAgICAgICAgcmV0dXJuIG1JZDsKICAgICB9Ci0gICAgCisKICAgICAvKioKICAgICAgKiBSZXR1cm4gdGhlIC5hcGsgcGFja2FnZSB0aGF0IGltcGxlbWVudHMgdGhpcyBpbnB1dCBtZXRob2QuCiAgICAgICovCiAgICAgcHVibGljIFN0cmluZyBnZXRQYWNrYWdlTmFtZSgpIHsKICAgICAgICAgcmV0dXJuIG1TZXJ2aWNlLnNlcnZpY2VJbmZvLnBhY2thZ2VOYW1lOwogICAgIH0KLSAgICAKKwogICAgIC8qKgogICAgICAqIFJldHVybiB0aGUgY2xhc3MgbmFtZSBvZiB0aGUgc2VydmljZSBjb21wb25lbnQgdGhhdCBpbXBsZW1lbnRzCiAgICAgICogdGhpcyBpbnB1dCBtZXRob2QuCkBAIC0xOTYsNyArMzIyLDcgQEAKICAgICAgICAgcmV0dXJuIG5ldyBDb21wb25lbnROYW1lKG1TZXJ2aWNlLnNlcnZpY2VJbmZvLnBhY2thZ2VOYW1lLAogICAgICAgICAgICAgICAgIG1TZXJ2aWNlLnNlcnZpY2VJbmZvLm5hbWUpOwogICAgIH0KLSAgICAKKwogICAgIC8qKgogICAgICAqIExvYWQgdGhlIHVzZXItZGlzcGxheWVkIGxhYmVsIGZvciB0aGlzIGlucHV0IG1ldGhvZC4KICAgICAgKiAKQEAgLTIwNiw3ICszMzIsNyBAQAogICAgIHB1YmxpYyBDaGFyU2VxdWVuY2UgbG9hZExhYmVsKFBhY2thZ2VNYW5hZ2VyIHBtKSB7CiAgICAgICAgIHJldHVybiBtU2VydmljZS5sb2FkTGFiZWwocG0pOwogICAgIH0KLSAgICAKKwogICAgIC8qKgogICAgICAqIExvYWQgdGhlIHVzZXItZGlzcGxheWVkIGljb24gZm9yIHRoaXMgaW5wdXQgbWV0aG9kLgogICAgICAqIApAQCAtMjE2LDcgKzM0Miw3IEBACiAgICAgcHVibGljIERyYXdhYmxlIGxvYWRJY29uKFBhY2thZ2VNYW5hZ2VyIHBtKSB7CiAgICAgICAgIHJldHVybiBtU2VydmljZS5sb2FkSWNvbihwbSk7CiAgICAgfQotICAgIAorCiAgICAgLyoqCiAgICAgICogUmV0dXJuIHRoZSBjbGFzcyBuYW1lIG9mIGFuIGFjdGl2aXR5IHRoYXQgcHJvdmlkZXMgYSBzZXR0aW5ncyBVSSBmb3IKICAgICAgKiB0aGUgaW5wdXQgbWV0aG9kLiAgWW91IGNhbiBsYXVuY2ggdGhpcyBhY3Rpdml0eSBiZSBzdGFydGluZyBpdCB3aXRoCkBAIC0yMzAsNyArMzU2LDE0IEBACiAgICAgcHVibGljIFN0cmluZyBnZXRTZXR0aW5nc0FjdGl2aXR5KCkgewogICAgICAgICByZXR1cm4gbVNldHRpbmdzQWN0aXZpdHlOYW1lOwogICAgIH0KLSAgICAKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgc3VidHlwZXMgb2YgSW5wdXQgTWV0aG9kLgorICAgICAqLworICAgIHB1YmxpYyBBcnJheUxpc3Q8SW5wdXRNZXRob2RTdWJ0eXBlPiBnZXRTdWJ0eXBlcygpIHsKKyAgICAgICAgcmV0dXJuIG1TdWJ0eXBlczsKKyAgICB9CisKICAgICAvKioKICAgICAgKiBSZXR1cm4gdGhlIHJlc291cmNlIGlkZW50aWZpZXIgb2YgYSByZXNvdXJjZSBpbnNpZGUgb2YgdGhpcyBpbnB1dAogICAgICAqIG1ldGhvZCdzIC5hcGsgdGhhdCBkZXRlcm1pbmVzIHdoZXRoZXIgaXQgc2hvdWxkIGJlIGNvbnNpZGVyZWQgYQpAQCAtMjM5LDcgKzM3Miw3IEBACiAgICAgcHVibGljIGludCBnZXRJc0RlZmF1bHRSZXNvdXJjZUlkKCkgewogICAgICAgICByZXR1cm4gbUlzRGVmYXVsdFJlc0lkOwogICAgIH0KLSAgICAKKwogICAgIHB1YmxpYyB2b2lkIGR1bXAoUHJpbnRlciBwdywgU3RyaW5nIHByZWZpeCkgewogICAgICAgICBwdy5wcmludGxuKHByZWZpeCArICJtSWQ9IiArIG1JZAogICAgICAgICAgICAgICAgICsgIiBtU2V0dGluZ3NBY3Rpdml0eU5hbWU9IiArIG1TZXR0aW5nc0FjdGl2aXR5TmFtZSk7CkBAIC0yODUsMTIgKzQxOCwxNCBAQAogICAgICAgICBkZXN0LndyaXRlU3RyaW5nKG1TZXR0aW5nc0FjdGl2aXR5TmFtZSk7CiAgICAgICAgIGRlc3Qud3JpdGVJbnQobUlzRGVmYXVsdFJlc0lkKTsKICAgICAgICAgbVNlcnZpY2Uud3JpdGVUb1BhcmNlbChkZXN0LCBmbGFncyk7CisgICAgICAgIGRlc3Qud3JpdGVUeXBlZExpc3QobVN1YnR5cGVzKTsKICAgICB9CiAKICAgICAvKioKICAgICAgKiBVc2VkIHRvIG1ha2UgdGhpcyBjbGFzcyBwYXJjZWxhYmxlLgogICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgUGFyY2VsYWJsZS5DcmVhdG9yPElucHV0TWV0aG9kSW5mbz4gQ1JFQVRPUiA9IG5ldyBQYXJjZWxhYmxlLkNyZWF0b3I8SW5wdXRNZXRob2RJbmZvPigpIHsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFBhcmNlbGFibGUuQ3JlYXRvcjxJbnB1dE1ldGhvZEluZm8+IENSRUFUT1IKKyAgICAgICAgICAgID0gbmV3IFBhcmNlbGFibGUuQ3JlYXRvcjxJbnB1dE1ldGhvZEluZm8+KCkgewogICAgICAgICBwdWJsaWMgSW5wdXRNZXRob2RJbmZvIGNyZWF0ZUZyb21QYXJjZWwoUGFyY2VsIHNvdXJjZSkgewogICAgICAgICAgICAgcmV0dXJuIG5ldyBJbnB1dE1ldGhvZEluZm8oc291cmNlKTsKICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvd2Via2l0L0FjY2Vzc2liaWxpdHlJbmplY3Rvci5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvd2Via2l0L0FjY2Vzc2liaWxpdHlJbmplY3Rvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJhMTZjOGEKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2phdmEvYW5kcm9pZC93ZWJraXQvQWNjZXNzaWJpbGl0eUluamVjdG9yLmphdmEKQEAgLTAsMCArMSw0ODQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQud2Via2l0OworCitpbXBvcnQgYW5kcm9pZC5wcm92aWRlci5TZXR0aW5nczsKK2ltcG9ydCBhbmRyb2lkLnRleHQuVGV4dFV0aWxzOworaW1wb3J0IGFuZHJvaWQudGV4dC5UZXh0VXRpbHMuU2ltcGxlU3RyaW5nU3BsaXR0ZXI7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuU3BhcnNlQXJyYXk7CitpbXBvcnQgYW5kcm9pZC52aWV3LktleUV2ZW50OworaW1wb3J0IGFuZHJvaWQudmlldy5hY2Nlc3NpYmlsaXR5LkFjY2Vzc2liaWxpdHlFdmVudDsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmlsaXR5TWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkLndlYmtpdC5XZWJWaWV3Q29yZS5FdmVudEh1YjsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLlN0YWNrOworCisvKioKKyAqIFRoaXMgY2xhc3MgaW5qZWN0cyBhY2Nlc3NpYmlsaXR5IGludG8gV2ViVmlld3Mgd2l0aCBkaXNhYmxlZCBKYXZhU2NyaXB0IG9yCisgKiBXZWJWaWV3cyB3aXRoIGVuYWJsZWQgSmF2YVNjcmlwdCBidXQgZm9yIHdoaWNoIHdlIGhhdmUgbm8gYWNjZXNzaWJpbGl0eQorICogc2NyaXB0IHRvIGluamVjdC4KKyAqIDwvcD4KKyAqIE5vdGU6IFRvIGF2b2lkIGNoYW5nZXMgaW4gdGhlIGZyYW1ld29yayB1cG9uIGNoYW5naW5nIHRoZSBhdmFpbGFibGUKKyAqICAgICAgIG5hdmlnYXRpb24gYXhpcywgb3IgcmVvcmRlcmluZyB0aGUgbmF2aWdhdGlvbiBheGlzLCBvciBjaGFuZ2luZworICogICAgICAgdGhlIGtleSBiaW5kaW5ncywgb3IgZGVmaW5pbmcgc2VxdWVuY2Ugb2YgYWN0aW9ucyB0byBiZSBib3VuZCB0bworICogICAgICAgYSBnaXZlbiBrZXkgdGhpcyBjbGFzcyBpcyBuYXZpZ2F0aW9uIGF4aXMgYWdub3N0aWMuIEl0IGlzIG9ubHkKKyAqICAgICAgIGF3YXJlIG9mIG9uZSBuYXZpZ2F0aW9uIGF4aXMgd2hpY2ggaXMgaW4gZmFjdCB0aGUgZGVmYXVsdCBiZWhhdmlvcgorICogICAgICAgb2Ygd2ViVmlld3Mgd2hpbGUgdXNpbmcgdGhlIERQQUQvVHJhY2tCYWxsLgorICogPC9wPgorICogSW4gZ2VuZXJhbCBhIGtleSBiaW5kaW5nIGlzIGEgbWFwcGluZyBmcm9tIG1ldGEgc3RhdGUgKyBrZXkgY29kZSB0bworICogYSBzZXF1ZW5jZSBvZiBhY3Rpb25zLiBGb3IgbW9yZSBkZXRhaWwgaG93IHRvIHNwZWNpZnkga2V5IGJpbmRpbmdzIHJlZmVyIHRvCisgKiB7QGxpbmsgYW5kcm9pZC5wcm92aWRlci5TZXR0aW5ncy5TZWN1cmUjQUNDRVNTSUJJTElUWV9XRUJfQ09OVEVOVF9LRVlfQklORElOR1N9LgorICogPC9wPgorICogVGhlIHBvc3NpYmxlIGFjdGlvbnMgYXJlIGludm9jYXRpb25zIHRvCisgKiB7QGxpbmsgI3NldEN1cnJlbnRBeGlzKGludCwgYm9vbGVhbiwgU3RyaW5nKX0sIG9yCisgKiB7QGxpbmsgI3RyYXZlcnNlQ3VycmVudEF4aXMoaW50LCBib29sZWFuLCBTdHJpbmcpfQorICoge0BsaW5rICN0cmF2ZXJzZUdpdmVuQXhpcyhpbnQsIGludCwgYm9vbGVhbiwgU3RyaW5nKX0KKyAqIHtAbGluayAjcHJlZnJvbUF4aXNUcmFuc2l0aW9uKGludCwgaW50LCBib29sZWFuLCBTdHJpbmcpfQorICogcmVmZXJyZWQgdmlhIHRoZSB2YWx1ZXMgb2Y6CisgKiB7QGxpbmsgI0FDVElPTl9TRVRfQ1VSUkVOVF9BWElTfSwKKyAqIHtAbGluayAjQUNUSU9OX1RSQVZFUlNFX0NVUlJFTlRfQVhJU30sCisgKiB7QGxpbmsgI0FDVElPTl9UUkFWRVJTRV9HSVZFTl9BWElTfSwKKyAqIHtAbGluayAjQUNUSU9OX1BFUkZPUk1fQVhJU19UUkFOU0lUSU9OfSwKKyAqIHJlc3BlY3RpdmVseS4KKyAqIFRoZSBhcmd1bWVudHMgZm9yIHRoZSBhY3Rpb24gaW52b2NhdGlvbiBhcmUgc3BlY2lmaWVkIGFzIG9mZnNldAorICogaGV4YWRlbWljYWwgcGFpcnMuIE5vdGUgdGhlIGxhc3QgYXJndW1lbnQgb2YgdGhlIGludm9jYXRpb24KKyAqIHNob3VsZCBOT1QgYmUgc3BlY2lmaWVkIGluIHRoZSBiaW5kaW5nIGFzIGl0IGlzIHByb3ZpZGVkIGJ5CisgKiB0aGlzIGNsYXNzLiBGb3IgZGV0YWlscyBhYm91dCB0aGUga2V5IGJpbmRpbmcgaW1wbGVtZW50YXRpb24KKyAqIHJlZmVyIHRvIHtAbGluayBBY2Nlc3NpYmlsaXR5V2ViQ29udGVudEtleUJpbmRpbmd9LgorICovCitjbGFzcyBBY2Nlc3NpYmlsaXR5SW5qZWN0b3IgeworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMT0dfVEFHID0gIkFjY2Vzc2liaWxpdHlJbmplY3RvciI7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIERFQlVHID0gdHJ1ZTsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBBQ1RJT05fU0VUX0NVUlJFTlRfQVhJUyA9IDA7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEFDVElPTl9UUkFWRVJTRV9DVVJSRU5UX0FYSVMgPSAxOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBBQ1RJT05fVFJBVkVSU0VfR0lWRU5fQVhJUyA9IDI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEFDVElPTl9QRVJGT1JNX0FYSVNfVFJBTlNJVElPTiA9IDM7CisKKyAgICAvLyB0aGUgZGVmYXVsdCBXZWJWaWV3IGJlaGF2aW9yIGFic3RyYWN0ZWQgYXMgYSBuYXZpZ2F0aW9uIGF4aXMKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTkFWSUdBVElPTl9BWElTX0RFRkFVTFRfV0VCX1ZJRVdfQkVIQVZJT1IgPSA3OworCisgICAgLy8gdGhlc2UgYXJlIHRoZSBzYW1lIGZvciBhbGwgaW5zdGFuY2VzIHNvIG1ha2UgdGhlbSBwcm9jZXNzIHdpZGUKKyAgICBwcml2YXRlIHN0YXRpYyBTcGFyc2VBcnJheTxBY2Nlc3NpYmlsaXR5V2ViQ29udGVudEtleUJpbmRpbmc+IHNCaW5kaW5ncyA9CisgICAgICAgIG5ldyBTcGFyc2VBcnJheTxBY2Nlc3NpYmlsaXR5V2ViQ29udGVudEtleUJpbmRpbmc+KCk7CisKKyAgICAvLyBoYW5kbGUgdG8gdGhlIFdlYlZpZXcgdGhpcyBpbmplY3RvciBpcyBhc3NvY2lhdGVkIHdpdGguCisgICAgcHJpdmF0ZSBmaW5hbCBXZWJWaWV3IG1XZWJWaWV3OworCisgICAgLy8gZXZlbnRzIHNjaGVkdWxlZCBmb3Igc2VuZGluZyBhcyBzb29uIGFzIHdlIHJlY2VpdmUgdGhlIHNlbGVjdGVkIHRleHQKKyAgICBwcml2YXRlIGZpbmFsIFN0YWNrPEFjY2Vzc2liaWxpdHlFdmVudD4gbVNjaGVkdWxlZEV2ZW50U3RhY2sgPSBuZXcgU3RhY2s8QWNjZXNzaWJpbGl0eUV2ZW50PigpOworCisgICAgLy8gdGhlIGN1cnJlbnQgdHJhdmVyc2FsIGF4aXMKKyAgICBwcml2YXRlIGludCBtQ3VycmVudEF4aXMgPSAyOyAvLyBzZW50ZW5jZQorCisgICAgLy8gd2UgbmVlZCB0byBjb25zdW1lIHRoZSB1cCBpZiB3ZSBoYXZlIGhhbmRsZWQgdGhlIGxhc3QgZG93bgorICAgIHByaXZhdGUgYm9vbGVhbiBtTGFzdERvd25FdmVudEhhbmRsZWQ7CisKKyAgICAvLyBnZXR0aW5nIHR3byBlbXB0eSBzZWxlY3Rpb24gc3RyaW5ncyBpbiBhIHJvdyB3ZSBsZXQgdGhlIFdlYlZpZXcgaGFuZGxlIHRoZSBldmVudAorICAgIHByaXZhdGUgYm9vbGVhbiBtSXNMYXN0U2VsZWN0aW9uU3RyaW5nTnVsbDsKKworICAgIC8vIGtlZXAgdHJhY2sgb2YgbGFzdCBkaXJlY3Rpb24KKyAgICBwcml2YXRlIGludCBtTGFzdERpcmVjdGlvbjsKKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBuZXcgaW5qZWN0b3IgYXNzb2NpYXRlZCB3aXRoIGEgZ2l2ZW4ge0BsaW5rIFdlYlZpZXd9LgorICAgICAqCisgICAgICogQHBhcmFtIHdlYlZpZXcgVGhlIGFzc29jaWF0ZWQgV2ViVmlldy4KKyAgICAgKi8KKyAgICBwdWJsaWMgQWNjZXNzaWJpbGl0eUluamVjdG9yKFdlYlZpZXcgd2ViVmlldykgeworICAgICAgICBtV2ViVmlldyA9IHdlYlZpZXc7CisgICAgICAgIGVuc3VyZVdlYkNvbnRlbnRLZXlCaW5kaW5ncygpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFByb2Nlc3NlcyBhIGtleSBkb3duIDxjb2RlPmV2ZW50PC9jb2RlPi4KKyAgICAgKgorICAgICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgZXZlbnQgd2FzIHByb2Nlc3NlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBvbktleUV2ZW50KEtleUV2ZW50IGV2ZW50KSB7CisgICAgICAgIGlmIChldmVudC5nZXRBY3Rpb24oKSA9PSBLZXlFdmVudC5BQ1RJT05fVVApIHsKKyAgICAgICAgICAgIHJldHVybiBtTGFzdERvd25FdmVudEhhbmRsZWQ7CisgICAgICAgIH0KKworICAgICAgICBtTGFzdERvd25FdmVudEhhbmRsZWQgPSBmYWxzZTsKKworICAgICAgICBpbnQga2V5ID0gZXZlbnQuZ2V0TWV0YVN0YXRlKCkgPDwgQWNjZXNzaWJpbGl0eVdlYkNvbnRlbnRLZXlCaW5kaW5nLk9GRlNFVF9NRVRBX1NUQVRFIHwKKyAgICAgICAgICAgIGV2ZW50LmdldEtleUNvZGUoKSA8PCBBY2Nlc3NpYmlsaXR5V2ViQ29udGVudEtleUJpbmRpbmcuT0ZGU0VUX0tFWV9DT0RFOworCisgICAgICAgIEFjY2Vzc2liaWxpdHlXZWJDb250ZW50S2V5QmluZGluZyBiaW5kaW5nID0gc0JpbmRpbmdzLmdldChrZXkpOworICAgICAgICBpZiAoYmluZGluZyA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICBmb3IgKGludCBpID0gMCwgY291bnQgPSBiaW5kaW5nLmdldEFjdGlvbkNvdW50KCk7IGkgPCBjb3VudDsgaSsrKSB7CisgICAgICAgICAgICBpbnQgYWN0aW9uQ29kZSA9IGJpbmRpbmcuZ2V0QWN0aW9uQ29kZShpKTsKKyAgICAgICAgICAgIFN0cmluZyBjb250ZW50RGVzY3JpcHRpb24gPSBJbnRlZ2VyLnRvSGV4U3RyaW5nKGJpbmRpbmcuZ2V0QWN0aW9uKGkpKTsKKyAgICAgICAgICAgIHN3aXRjaCAoYWN0aW9uQ29kZSkgeworICAgICAgICAgICAgICAgIGNhc2UgQUNUSU9OX1NFVF9DVVJSRU5UX0FYSVM6CisgICAgICAgICAgICAgICAgICAgIGludCBheGlzID0gYmluZGluZy5nZXRGaXJzdEFyZ3VtZW50KGkpOworICAgICAgICAgICAgICAgICAgICBib29sZWFuIHNlbmRFdmVudCA9IChiaW5kaW5nLmdldFNlY29uZEFyZ3VtZW50KGkpID09IDEpOworICAgICAgICAgICAgICAgICAgICBzZXRDdXJyZW50QXhpcyhheGlzLCBzZW5kRXZlbnQsIGNvbnRlbnREZXNjcmlwdGlvbik7CisgICAgICAgICAgICAgICAgICAgIG1MYXN0RG93bkV2ZW50SGFuZGxlZCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQUNUSU9OX1RSQVZFUlNFX0NVUlJFTlRfQVhJUzoKKyAgICAgICAgICAgICAgICAgICAgaW50IGRpcmVjdGlvbiA9IGJpbmRpbmcuZ2V0Rmlyc3RBcmd1bWVudChpKTsKKyAgICAgICAgICAgICAgICAgICAgLy8gb24gc2Vjb25kIG51bGwgc2VsZWN0aW9uIHN0cmluZyBpbiBzYW1lIGRpcmVjdGlvbiA9PiBXZWJWaWV3IGhhbmRsZSB0aGUgZXZlbnQKKyAgICAgICAgICAgICAgICAgICAgaWYgKGRpcmVjdGlvbiA9PSBtTGFzdERpcmVjdGlvbiAmJiBtSXNMYXN0U2VsZWN0aW9uU3RyaW5nTnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgbUxhc3REaXJlY3Rpb24gPSBkaXJlY3Rpb247CisgICAgICAgICAgICAgICAgICAgICAgICBtSXNMYXN0U2VsZWN0aW9uU3RyaW5nTnVsbCA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIG1MYXN0RGlyZWN0aW9uID0gZGlyZWN0aW9uOworICAgICAgICAgICAgICAgICAgICBzZW5kRXZlbnQgPSAoYmluZGluZy5nZXRTZWNvbmRBcmd1bWVudChpKSA9PSAxKTsKKyAgICAgICAgICAgICAgICAgICAgbUxhc3REb3duRXZlbnRIYW5kbGVkID0gdHJhdmVyc2VDdXJyZW50QXhpcyhkaXJlY3Rpb24sIHNlbmRFdmVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50RGVzY3JpcHRpb24pOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEFDVElPTl9UUkFWRVJTRV9HSVZFTl9BWElTOgorICAgICAgICAgICAgICAgICAgICBkaXJlY3Rpb24gPSBiaW5kaW5nLmdldEZpcnN0QXJndW1lbnQoaSk7CisgICAgICAgICAgICAgICAgICAgIC8vIG9uIHNlY29uZCBudWxsIHNlbGVjdGlvbiBzdHJpbmcgaW4gc2FtZSBkaXJlY3Rpb24gPT4gV2ViVmlldyBoYW5kbGUgdGhlIGV2ZW50CisgICAgICAgICAgICAgICAgICAgIGlmIChkaXJlY3Rpb24gPT0gbUxhc3REaXJlY3Rpb24gJiYgbUlzTGFzdFNlbGVjdGlvblN0cmluZ051bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1MYXN0RGlyZWN0aW9uID0gZGlyZWN0aW9uOworICAgICAgICAgICAgICAgICAgICAgICAgbUlzTGFzdFNlbGVjdGlvblN0cmluZ051bGwgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBtTGFzdERpcmVjdGlvbiA9IGRpcmVjdGlvbjsKKyAgICAgICAgICAgICAgICAgICAgYXhpcyA9ICBiaW5kaW5nLmdldFNlY29uZEFyZ3VtZW50KGkpOworICAgICAgICAgICAgICAgICAgICBzZW5kRXZlbnQgPSAoYmluZGluZy5nZXRUaGlyZEFyZ3VtZW50KGkpID09IDEpOworICAgICAgICAgICAgICAgICAgICB0cmF2ZXJzZUdpdmVuQXhpcyhkaXJlY3Rpb24sIGF4aXMsIHNlbmRFdmVudCwgY29udGVudERlc2NyaXB0aW9uKTsKKyAgICAgICAgICAgICAgICAgICAgbUxhc3REb3duRXZlbnRIYW5kbGVkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBBQ1RJT05fUEVSRk9STV9BWElTX1RSQU5TSVRJT046CisgICAgICAgICAgICAgICAgICAgIGludCBmcm9tQXhpcyA9IGJpbmRpbmcuZ2V0Rmlyc3RBcmd1bWVudChpKTsKKyAgICAgICAgICAgICAgICAgICAgaW50IHRvQXhpcyA9IGJpbmRpbmcuZ2V0U2Vjb25kQXJndW1lbnQoaSk7CisgICAgICAgICAgICAgICAgICAgIHNlbmRFdmVudCA9IChiaW5kaW5nLmdldFRoaXJkQXJndW1lbnQoaSkgPT0gMSk7CisgICAgICAgICAgICAgICAgICAgIHByZWZyb21BeGlzVHJhbnNpdGlvbihmcm9tQXhpcywgdG9BeGlzLCBzZW5kRXZlbnQsIGNvbnRlbnREZXNjcmlwdGlvbik7CisgICAgICAgICAgICAgICAgICAgIG1MYXN0RG93bkV2ZW50SGFuZGxlZCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIExvZy53KExPR19UQUcsICJVbmtub3duIGFjdGlvbiBjb2RlOiAiICsgYWN0aW9uQ29kZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gbUxhc3REb3duRXZlbnRIYW5kbGVkOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgY3VycmVudCBuYXZpZ2F0aW9uIGF4aXMgd2hpY2ggd2lsbCBiZSB1c2VkIHdoaWxlCisgICAgICogY2FsbGluZyB7QGxpbmsgI3RyYXZlcnNlQ3VycmVudEF4aXMoaW50LCBib29sZWFuLCBTdHJpbmcpfS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBheGlzIFRoZSBheGlzIHRvIHNldC4KKyAgICAgKiBAcGFyYW0gc2VuZEV2ZW50IFdoZXRoZXIgdG8gc2VuZCBhbiBhY2Nlc3NpYmlsaXR5IGV2ZW50IHRvCisgICAgICogICAgICAgIGFubm91bmNlIHRoZSBjaGFuZ2UuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIHNldEN1cnJlbnRBeGlzKGludCBheGlzLCBib29sZWFuIHNlbmRFdmVudCwgU3RyaW5nIGNvbnRlbnREZXNjcmlwdGlvbikgeworICAgICAgICBtQ3VycmVudEF4aXMgPSBheGlzOworICAgICAgICBpZiAoc2VuZEV2ZW50KSB7CisgICAgICAgICAgICBBY2Nlc3NpYmlsaXR5RXZlbnQgZXZlbnQgPSBnZXRQYXJ0aWFseVBvcHVsYXRlZEFjY2Vzc2liaWxpdHlFdmVudCgpOworICAgICAgICAgICAgZXZlbnQuZ2V0VGV4dCgpLmFkZChTdHJpbmcudmFsdWVPZihheGlzKSk7CisgICAgICAgICAgICBldmVudC5zZXRDb250ZW50RGVzY3JpcHRpb24oY29udGVudERlc2NyaXB0aW9uKTsKKyAgICAgICAgICAgIHNlbmRBY2Nlc3NpYmlsaXR5RXZlbnQoZXZlbnQpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUGVyZm9ybXMgY29uZGl0aW9uYWwgdHJhbnNpdGlvbiBvbmUgYXhpcyB0byBhbm90aGVyLgorICAgICAqCisgICAgICogQHBhcmFtIGZyb21BeGlzIFRoZSBheGlzIHdoaWNoIG11c3QgYmUgdGhlIGN1cnJlbnQgZm9yIHRoZSB0cmFuc2l0aW9uIHRvIG9jY3VyLgorICAgICAqIEBwYXJhbSB0b0F4aXMgVGhlIGF4aXMgdG8gd2hpY2ggdG8gdHJhbnNpdGlvbi4KKyAgICAgKiBAcGFyYW0gc2VuZEV2ZW50IEZsYWcgaWYgdG8gc2VuZCBhbiBldmVudCB0byBhbm5vdW5jZSBzdWNjZXNzZnVsIHRyYW5zaXRpb24uCisgICAgICogQHBhcmFtIGNvbnRlbnREZXNjcmlwdGlvbiBBIGRlc2NyaXB0aW9uIG9mIHRoZSBwZXJmb3JtZWQgYWN0aW9uLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBwcmVmcm9tQXhpc1RyYW5zaXRpb24oaW50IGZyb21BeGlzLCBpbnQgdG9BeGlzLCBib29sZWFuIHNlbmRFdmVudCwKKyAgICAgICAgICAgIFN0cmluZyBjb250ZW50RGVzY3JpcHRpb24pIHsKKyAgICAgICAgaWYgKG1DdXJyZW50QXhpcyA9PSBmcm9tQXhpcykgeworICAgICAgICAgICAgc2V0Q3VycmVudEF4aXModG9BeGlzLCBzZW5kRXZlbnQsIGNvbnRlbnREZXNjcmlwdGlvbik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUcmF2ZXJzZSB0aGUgZG9jdW1lbnQgYWxvbmcgdGhlIGN1cnJlbnQgbmF2aWdhdGlvbiBheGlzLgorICAgICAqCisgICAgICogQHBhcmFtIGRpcmVjdGlvbiBUaGUgZGlyZWN0aW9uIG9mIHRyYXZlcnNhbC4KKyAgICAgKiBAcGFyYW0gc2VuZEV2ZW50IFdoZXRoZXIgdG8gc2VuZCBhbiBhY2Nlc3NpYmlsaXR5IGV2ZW50IHRvCisgICAgICogICAgICAgIGFubm91bmNlIHRoZSBjaGFuZ2UuCisgICAgICogQHBhcmFtIGNvbnRlbnREZXNjcmlwdGlvbiBBIGRlc2NyaXB0aW9uIG9mIHRoZSBwZXJmb3JtZWQgYWN0aW9uLgorICAgICAqIEBzZWUgI3NldEN1cnJlbnRBeGlzKGludCwgYm9vbGVhbiwgU3RyaW5nKQorICAgICAqLworICAgIHByaXZhdGUgYm9vbGVhbiB0cmF2ZXJzZUN1cnJlbnRBeGlzKGludCBkaXJlY3Rpb24sIGJvb2xlYW4gc2VuZEV2ZW50LAorICAgICAgICAgICAgU3RyaW5nIGNvbnRlbnREZXNjcmlwdGlvbikgeworICAgICAgICByZXR1cm4gdHJhdmVyc2VHaXZlbkF4aXMoZGlyZWN0aW9uLCBtQ3VycmVudEF4aXMsIHNlbmRFdmVudCwgY29udGVudERlc2NyaXB0aW9uKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUcmF2ZXJzZSB0aGUgZG9jdW1lbnQgYWxvbmcgdGhlIGdpdmVuIG5hdmlnYXRpb24gYXhpcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBkaXJlY3Rpb24gVGhlIGRpcmVjdGlvbiBvZiB0cmF2ZXJzYWwuCisgICAgICogQHBhcmFtIGF4aXMgVGhlIGF4aXMgYWxvbmcgd2hpY2ggdG8gdHJhdmVyc2UuCisgICAgICogQHBhcmFtIHNlbmRFdmVudCBXaGV0aGVyIHRvIHNlbmQgYW4gYWNjZXNzaWJpbGl0eSBldmVudCB0bworICAgICAqICAgICAgICBhbm5vdW5jZSB0aGUgY2hhbmdlLgorICAgICAqIEBwYXJhbSBjb250ZW50RGVzY3JpcHRpb24gQSBkZXNjcmlwdGlvbiBvZiB0aGUgcGVyZm9ybWVkIGFjdGlvbi4KKyAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gdHJhdmVyc2VHaXZlbkF4aXMoaW50IGRpcmVjdGlvbiwgaW50IGF4aXMsIGJvb2xlYW4gc2VuZEV2ZW50LAorICAgICAgICAgICAgU3RyaW5nIGNvbnRlbnREZXNjcmlwdGlvbikgeworICAgICAgICAvLyBpZiB0aGUgYXhpcyBpcyB0aGUgZGVmYXVsdCBsZXQgV2ViVmlldyBoYW5kbGUgdGhlIGV2ZW50CisgICAgICAgIGlmIChheGlzID09IE5BVklHQVRJT05fQVhJU19ERUZBVUxUX1dFQl9WSUVXX0JFSEFWSU9SKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgV2ViVmlld0NvcmUgd2ViVmlld0NvcmUgPSBtV2ViVmlldy5nZXRXZWJWaWV3Q29yZSgpOworICAgICAgICBpZiAod2ViVmlld0NvcmUgIT0gbnVsbCkgeworICAgICAgICAgICAgQWNjZXNzaWJpbGl0eUV2ZW50IGV2ZW50ID0gbnVsbDsKKyAgICAgICAgICAgIGlmIChzZW5kRXZlbnQpIHsKKyAgICAgICAgICAgICAgICBldmVudCA9IGdldFBhcnRpYWx5UG9wdWxhdGVkQWNjZXNzaWJpbGl0eUV2ZW50KCk7CisgICAgICAgICAgICAgICAgLy8gdGhlIHRleHQgd2lsbCBiZSBzZXQgdXBvbiByZWNlaXZpbmcgdGhlIHNlbGVjdGlvbiBzdHJpbmcKKyAgICAgICAgICAgICAgICBldmVudC5zZXRDb250ZW50RGVzY3JpcHRpb24oY29udGVudERlc2NyaXB0aW9uKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1TY2hlZHVsZWRFdmVudFN0YWNrLnB1c2goZXZlbnQpOworICAgICAgICAgICAgd2ViVmlld0NvcmUuc2VuZE1lc3NhZ2UoRXZlbnRIdWIuTU9ESUZZX1NFTEVDVElPTiwgZGlyZWN0aW9uLCBheGlzKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDYWxsZWQgd2hlbiB0aGUgPGNvZGU+c2VsZWN0aW9uU3RyaW5nPC9jb2RlPiBoYXMgY2hhbmdlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBvblNlbGVjdGlvblN0cmluZ0NoYW5nZShTdHJpbmcgc2VsZWN0aW9uU3RyaW5nKSB7CisgICAgICAgIG1Jc0xhc3RTZWxlY3Rpb25TdHJpbmdOdWxsID0gKHNlbGVjdGlvblN0cmluZyA9PSBudWxsKTsKKyAgICAgICAgQWNjZXNzaWJpbGl0eUV2ZW50IGV2ZW50ID0gbVNjaGVkdWxlZEV2ZW50U3RhY2sucG9wKCk7CisgICAgICAgIGlmIChldmVudCAhPSBudWxsKSB7CisgICAgICAgICAgICBldmVudC5nZXRUZXh0KCkuYWRkKHNlbGVjdGlvblN0cmluZyk7CisgICAgICAgICAgICBzZW5kQWNjZXNzaWJpbGl0eUV2ZW50KGV2ZW50KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFNlbmRzIGFuIHtAbGluayBBY2Nlc3NpYmlsaXR5RXZlbnR9LgorICAgICAqCisgICAgICogQHBhcmFtIGV2ZW50IFRoZSBldmVudCB0byBzZW5kLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBzZW5kQWNjZXNzaWJpbGl0eUV2ZW50KEFjY2Vzc2liaWxpdHlFdmVudCBldmVudCkgeworICAgICAgICBpZiAoREVCVUcpIHsKKyAgICAgICAgICAgIExvZy5kKExPR19UQUcsICJEaXNwYXRjaGluZzogIiArIGV2ZW50KTsKKyAgICAgICAgfQorICAgICAgICBBY2Nlc3NpYmlsaXR5TWFuYWdlci5nZXRJbnN0YW5jZShtV2ViVmlldy5nZXRDb250ZXh0KCkpLnNlbmRBY2Nlc3NpYmlsaXR5RXZlbnQoZXZlbnQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4gQW4gYWNjZXNzaWJpbGl0eSBldmVudCB3aG9zZSBtZW1iZXJzIGFyZSBwb3B1bGF0ZWQgZXhjZXB0IGl0cworICAgICAqICAgICAgICAgdGV4dCBhbmQgY29udGVudCBkZXNjcmlwdGlvbi4KKyAgICAgKi8KKyAgICBwcml2YXRlIEFjY2Vzc2liaWxpdHlFdmVudCBnZXRQYXJ0aWFseVBvcHVsYXRlZEFjY2Vzc2liaWxpdHlFdmVudCgpIHsKKyAgICAgICAgQWNjZXNzaWJpbGl0eUV2ZW50IGV2ZW50ID0gQWNjZXNzaWJpbGl0eUV2ZW50Lm9idGFpbihBY2Nlc3NpYmlsaXR5RXZlbnQuVFlQRV9WSUVXX1NFTEVDVEVEKTsKKyAgICAgICAgZXZlbnQuc2V0Q2xhc3NOYW1lKG1XZWJWaWV3LmdldENsYXNzKCkuZ2V0TmFtZSgpKTsKKyAgICAgICAgZXZlbnQuc2V0UGFja2FnZU5hbWUobVdlYlZpZXcuZ2V0Q29udGV4dCgpLmdldFBhY2thZ2VOYW1lKCkpOworICAgICAgICBldmVudC5zZXRFbmFibGVkKG1XZWJWaWV3LmlzRW5hYmxlZCgpKTsKKyAgICAgICAgcmV0dXJuIGV2ZW50OworICAgIH0KKworICAgIC8qKgorICAgICAqIEVuc3VyZXMgdGhhdCB0aGUgV2ViIGNvbnRlbnQga2V5IGJpbmRpbmdzIGFyZSBsb2FkZWQuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIGVuc3VyZVdlYkNvbnRlbnRLZXlCaW5kaW5ncygpIHsKKyAgICAgICAgaWYgKHNCaW5kaW5ncy5zaXplKCkgPiAwKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBTdHJpbmcgd2ViQ29udGVudEtleUJpbmRpbmdzU3RyaW5nICA9IFNldHRpbmdzLlNlY3VyZS5nZXRTdHJpbmcoCisgICAgICAgICAgICAgICAgbVdlYlZpZXcuZ2V0Q29udGV4dCgpLmdldENvbnRlbnRSZXNvbHZlcigpLAorICAgICAgICAgICAgICAgIFNldHRpbmdzLlNlY3VyZS5BQ0NFU1NJQklMSVRZX1dFQl9DT05URU5UX0tFWV9CSU5ESU5HUyk7CisKKyAgICAgICAgU2ltcGxlU3RyaW5nU3BsaXR0ZXIgc2VtaUNvbG9uU3BsaXR0ZXIgPSBuZXcgU2ltcGxlU3RyaW5nU3BsaXR0ZXIoJzsnKTsKKyAgICAgICAgc2VtaUNvbG9uU3BsaXR0ZXIuc2V0U3RyaW5nKHdlYkNvbnRlbnRLZXlCaW5kaW5nc1N0cmluZyk7CisKKyAgICAgICAgQXJyYXlMaXN0PEFjY2Vzc2liaWxpdHlXZWJDb250ZW50S2V5QmluZGluZz4gYmluZGluZ3MgPQorICAgICAgICAgICAgbmV3IEFycmF5TGlzdDxBY2Nlc3NpYmlsaXR5V2ViQ29udGVudEtleUJpbmRpbmc+KCk7CisKKyAgICAgICAgd2hpbGUgKHNlbWlDb2xvblNwbGl0dGVyLmhhc05leHQoKSkgeworICAgICAgICAgICAgU3RyaW5nIGJpbmRpbmdTdHJpbmcgPSBzZW1pQ29sb25TcGxpdHRlci5uZXh0KCk7CisgICAgICAgICAgICBpZiAoVGV4dFV0aWxzLmlzRW1wdHkoYmluZGluZ1N0cmluZykpIHsKKyAgICAgICAgICAgICAgICBMb2cuZShMT0dfVEFHLCAiTWFsZm9ybWVkIFdlYiBjb250ZW50IGtleSBiaW5kaW5nOiAiCisgICAgICAgICAgICAgICAgICAgICAgICArIHdlYkNvbnRlbnRLZXlCaW5kaW5nc1N0cmluZyk7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBTdHJpbmdbXSBrZXlWYWx1ZUFycmF5ID0gYmluZGluZ1N0cmluZy5zcGxpdCgiPSIpOworICAgICAgICAgICAgaWYgKGtleVZhbHVlQXJyYXkubGVuZ3RoICE9IDIpIHsKKyAgICAgICAgICAgICAgICBMb2cuZShMT0dfVEFHLCAiRGlzcmVnYXJkaW5nIG1hbGZvcm1lZCBXZWIgY29udGVudCBrZXkgYmluZGluZzogIiArCisgICAgICAgICAgICAgICAgICAgICAgICBiaW5kaW5nU3RyaW5nKTsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgU2ltcGxlU3RyaW5nU3BsaXR0ZXIgY29sb25TcGxpdHRlciA9IG5ldyBTaW1wbGVTdHJpbmdTcGxpdHRlcignOicpOy8vcmVtb3ZlCisgICAgICAgICAgICAgICAgaW50IGtleSA9IEludGVnZXIuZGVjb2RlKGtleVZhbHVlQXJyYXlbMF0udHJpbSgpKTsKKyAgICAgICAgICAgICAgICBTdHJpbmdbXSBhY3Rpb25TdHJpbmdzID0ga2V5VmFsdWVBcnJheVsxXS5zcGxpdCgiOiIpOworICAgICAgICAgICAgICAgIGludFtdIGFjdGlvbnMgPSBuZXcgaW50W2FjdGlvblN0cmluZ3MubGVuZ3RoXTsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMCwgY291bnQgPSBhY3Rpb25zLmxlbmd0aDsgaSA8IGNvdW50OyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgYWN0aW9uc1tpXSA9IEludGVnZXIuZGVjb2RlKGFjdGlvblN0cmluZ3NbaV0udHJpbSgpKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBiaW5kaW5ncy5hZGQobmV3IEFjY2Vzc2liaWxpdHlXZWJDb250ZW50S2V5QmluZGluZyhrZXksIGFjdGlvbnMpKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBuZmUpIHsKKyAgICAgICAgICAgICAgICBMb2cuZShMT0dfVEFHLCAiRGlzcmVnYXJkaW5nIG1hbGZvcm1lZCBrZXkgYmluZGluZzogIiArIGJpbmRpbmdTdHJpbmcpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgZm9yIChBY2Nlc3NpYmlsaXR5V2ViQ29udGVudEtleUJpbmRpbmcgYmluZGluZyA6IGJpbmRpbmdzKSB7CisgICAgICAgICAgICBzQmluZGluZ3MucHV0KGJpbmRpbmcuZ2V0S2V5KCksIGJpbmRpbmcpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVwcmVzZW50cyBhIHdlYiBjb250ZW50IGtleS1iaW5kaW5nLgorICAgICAqLworICAgIHByaXZhdGUgY2xhc3MgQWNjZXNzaWJpbGl0eVdlYkNvbnRlbnRLZXlCaW5kaW5nIHsKKworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgT0ZGU0VUX01FVEFfU1RBVEUgPSAweDAwMDAwMDEwOworCisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNQVNLX01FVEFfU1RBVEUgPSAweEZGRkYwMDAwOworCisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBPRkZTRVRfS0VZX0NPREUgPSAweDAwMDAwMDAwOworCisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNQVNLX0tFWV9DT0RFID0gMHgwMDAwRkZGRjsKKworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgT0ZGU0VUX0FDVElPTiA9IDB4MDAwMDAwMTg7CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1BU0tfQUNUSU9OID0gMHhGRjAwMDAwMDsKKworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgT0ZGU0VUX0ZJUlNUX0FSR1VNRU5UID0gMHgwMDAwMDAxMDsKKworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUFTS19GSVJTVF9BUkdVTUVOVCA9IDB4MDBGRjAwMDA7CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE9GRlNFVF9TRUNPTkRfQVJHVU1FTlQgPSAweDAwMDAwMDA4OworCisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNQVNLX1NFQ09ORF9BUkdVTUVOVCA9IDB4MDAwMEZGMDA7CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE9GRlNFVF9USElSRF9BUkdVTUVOVCA9IDB4MDAwMDAwMDA7CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1BU0tfVEhJUkRfQVJHVU1FTlQgPSAweDAwMDAwMEZGOworCisgICAgICAgIHByaXZhdGUgaW50IG1LZXk7CisKKyAgICAgICAgcHJpdmF0ZSBpbnQgW10gbUFjdGlvblNlcXVlbmNlOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBAcmV0dXJuIFRoZSBiaW5kaW5nIGtleSB3aXRoIGtleSBjb2RlIGFuZCBtZXRhIHN0YXRlLgorICAgICAgICAgKgorICAgICAgICAgKiBAc2VlICNNQVNLX0tFWV9DT0RFCisgICAgICAgICAqIEBzZWUgI01BU0tfTUVUQV9TVEFURQorICAgICAgICAgKiBAc2VlICNPRkZTRVRfS0VZX0NPREUKKyAgICAgICAgICogQHNlZSAjT0ZGU0VUX01FVEFfU1RBVEUKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBpbnQgZ2V0S2V5KCkgeworICAgICAgICAgICAgcmV0dXJuIG1LZXk7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogQHJldHVybiBUaGUga2V5IGNvZGUgb2YgdGhlIGJpbmRpbmcga2V5LgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIGludCBnZXRLZXlDb2RlKCkgeworICAgICAgICAgICAgcmV0dXJuIChtS2V5ICYgTUFTS19LRVlfQ09ERSkgPj4gT0ZGU0VUX0tFWV9DT0RFOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEByZXR1cm4gVGhlIG1ldGEgc3RhdGUgb2YgdGhlIGJpbmRpbmcga2V5LgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIGludCBnZXRNZXRhU3RhdGUoKSB7CisgICAgICAgICAgICByZXR1cm4gKG1LZXkgJiBNQVNLX01FVEFfU1RBVEUpID4+IE9GRlNFVF9NRVRBX1NUQVRFOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEByZXR1cm4gVGhlIG51bWJlciBvZiBhY3Rpb25zIGluIHRoZSBrZXkgYmluZGluZy4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBpbnQgZ2V0QWN0aW9uQ291bnQoKSB7CisgICAgICAgICAgICByZXR1cm4gbUFjdGlvblNlcXVlbmNlLmxlbmd0aDsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBAcGFyYW0gaW5kZXggVGhlIGFjdGlvbiBmb3IgYSBnaXZlbiBhY3Rpb24gPGNvZGU+aW5kZXg8L2NvZGU+LgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIGludCBnZXRBY3Rpb24oaW50IGluZGV4KSB7CisgICAgICAgICAgICByZXR1cm4gbUFjdGlvblNlcXVlbmNlW2luZGV4XTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBAcGFyYW0gaW5kZXggVGhlIGFjdGlvbiBjb2RlIGZvciBhIGdpdmVuIGFjdGlvbiA8Y29kZT5pbmRleDwvY29kZT4uCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgaW50IGdldEFjdGlvbkNvZGUoaW50IGluZGV4KSB7CisgICAgICAgICAgICByZXR1cm4gKG1BY3Rpb25TZXF1ZW5jZVtpbmRleF0gJiBNQVNLX0FDVElPTikgPj4gT0ZGU0VUX0FDVElPTjsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBAcGFyYW0gaW5kZXggVGhlIGZpcnN0IGFyZ3VtZW50IGZvciBhIGdpdmVuIGFjdGlvbiA8Y29kZT5pbmRleDwvY29kZT4uCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgaW50IGdldEZpcnN0QXJndW1lbnQoaW50IGluZGV4KSB7CisgICAgICAgICAgICByZXR1cm4gKG1BY3Rpb25TZXF1ZW5jZVtpbmRleF0gJiBNQVNLX0ZJUlNUX0FSR1VNRU5UKSA+PiBPRkZTRVRfRklSU1RfQVJHVU1FTlQ7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogQHBhcmFtIGluZGV4IFRoZSBzZWNvbmQgYXJndW1lbnQgZm9yIGEgZ2l2ZW4gYWN0aW9uIDxjb2RlPmluZGV4PC9jb2RlPi4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBpbnQgZ2V0U2Vjb25kQXJndW1lbnQoaW50IGluZGV4KSB7CisgICAgICAgICAgICByZXR1cm4gKG1BY3Rpb25TZXF1ZW5jZVtpbmRleF0gJiBNQVNLX1NFQ09ORF9BUkdVTUVOVCkgPj4gT0ZGU0VUX1NFQ09ORF9BUkdVTUVOVDsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBAcGFyYW0gaW5kZXggVGhlIHRoaXJkIGFyZ3VtZW50IGZvciBhIGdpdmVuIGFjdGlvbiA8Y29kZT5pbmRleDwvY29kZT4uCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgaW50IGdldFRoaXJkQXJndW1lbnQoaW50IGluZGV4KSB7CisgICAgICAgICAgICByZXR1cm4gKG1BY3Rpb25TZXF1ZW5jZVtpbmRleF0gJiBNQVNLX1RISVJEX0FSR1VNRU5UKSA+PiBPRkZTRVRfVEhJUkRfQVJHVU1FTlQ7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KKyAgICAgICAgICogQHBhcmFtIGtleSBUaGUga2V5IGZvciB0aGUgYmluZGluZyAoa2V5IGFuZCBtZXRhIHN0YXRlKQorICAgICAgICAgKiBAcGFyYW0gYWN0aW9uU2VxdWVuY2UgVGhlIHNlcXVlbmNlIG9mIGFjdGlvbiBmb3IgdGhlIGJpbmRpbmcuCisgICAgICAgICAqIEBzZWUgI2dldEtleSgpCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgQWNjZXNzaWJpbGl0eVdlYkNvbnRlbnRLZXlCaW5kaW5nKGludCBrZXksIGludFtdIGFjdGlvblNlcXVlbmNlKSB7CisgICAgICAgICAgICBtS2V5ID0ga2V5OworICAgICAgICAgICAgbUFjdGlvblNlcXVlbmNlID0gYWN0aW9uU2VxdWVuY2U7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgICAgIFN0cmluZ0J1aWxkZXIgYnVpbGRlciA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisgICAgICAgICAgICBidWlsZGVyLmFwcGVuZCgia2V5OiAiKTsKKyAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKGdldEtleSgpKTsKKyAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKCIsIG1ldGFTdGF0ZTogIik7CisgICAgICAgICAgICBidWlsZGVyLmFwcGVuZChnZXRNZXRhU3RhdGUoKSk7CisgICAgICAgICAgICBidWlsZGVyLmFwcGVuZCgiLCBrZXlDb2RlOiAiKTsKKyAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKGdldEtleUNvZGUoKSk7CisgICAgICAgICAgICBidWlsZGVyLmFwcGVuZCgiLCBhY3Rpb25zWyIpOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDAsIGNvdW50ID0gZ2V0QWN0aW9uQ291bnQoKTsgaSA8IGNvdW50OyBpKyspIHsKKyAgICAgICAgICAgICAgICBidWlsZGVyLmFwcGVuZCgie2FjdGlvbkNvZGUiKTsKKyAgICAgICAgICAgICAgICBidWlsZGVyLmFwcGVuZChpKTsKKyAgICAgICAgICAgICAgICBidWlsZGVyLmFwcGVuZCgiOiAiKTsKKyAgICAgICAgICAgICAgICBidWlsZGVyLmFwcGVuZChnZXRBY3Rpb25Db2RlKGkpKTsKKyAgICAgICAgICAgICAgICBidWlsZGVyLmFwcGVuZCgiLCBmaXJzdEFyZ3VtZW50OiAiKTsKKyAgICAgICAgICAgICAgICBidWlsZGVyLmFwcGVuZChnZXRGaXJzdEFyZ3VtZW50KGkpKTsKKyAgICAgICAgICAgICAgICBidWlsZGVyLmFwcGVuZCgiLCBzZWNvbmRBcmd1bWVudDogIik7CisgICAgICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoZ2V0U2Vjb25kQXJndW1lbnQoaSkpOworICAgICAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKCIsIHRoaXJkQXJndW1lbnQ6ICIpOworICAgICAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKGdldFRoaXJkQXJndW1lbnQoaSkpOworICAgICAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKCJ9Iik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBidWlsZGVyLmFwcGVuZCgiXSIpOworICAgICAgICAgICAgcmV0dXJuIGJ1aWxkZXIudG9TdHJpbmcoKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3dlYmtpdC9Ccm93c2VyRnJhbWUuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3dlYmtpdC9Ccm93c2VyRnJhbWUuamF2YQppbmRleCBhMmM4MGYyLi5lOTcyYzI0IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC93ZWJraXQvQnJvd3NlckZyYW1lLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvd2Via2l0L0Jyb3dzZXJGcmFtZS5qYXZhCkBAIC0zOCw2ICszOCw4IEBACiAKIGltcG9ydCBqdW5pdC5mcmFtZXdvcmsuQXNzZXJ0OwogCitpbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwogaW1wb3J0IGphdmEubGFuZy5yZWYuV2Vha1JlZmVyZW5jZTsKIGltcG9ydCBqYXZhLm5ldC5VUkxFbmNvZGVyOwpAQCAtNzIsNiArNzQsOCBAQAogICAgIC8vIHF1ZXVlIGhhcyBiZWVuIGNsZWFyZWQsdGhleSBhcmUgaWdub3JlZC4KICAgICBwcml2YXRlIGJvb2xlYW4gbUJsb2NrTWVzc2FnZXMgPSBmYWxzZTsKIAorICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBzRGF0YURpcmVjdG9yeSA9ICIiOworCiAgICAgLy8gSXMgdGhpcyBmcmFtZSB0aGUgbWFpbiBmcmFtZT8KICAgICBwcml2YXRlIGJvb2xlYW4gbUlzTWFpbkZyYW1lOwogCkBAIC0yMjQsNiArMjI4LDExIEBACiAgICAgICAgIEFzc2V0TWFuYWdlciBhbSA9IGNvbnRleHQuZ2V0QXNzZXRzKCk7CiAgICAgICAgIG5hdGl2ZUNyZWF0ZUZyYW1lKHcsIGFtLCBwcm94eS5nZXRCYWNrRm9yd2FyZExpc3QoKSk7CiAKKyAgICAgICAgaWYgKHNEYXRhRGlyZWN0b3J5Lmxlbmd0aCgpID09IDApIHsKKyAgICAgICAgICAgIFN0cmluZyBkaXIgPSBhcHBDb250ZXh0LmdldEZpbGVzRGlyKCkuZ2V0QWJzb2x1dGVQYXRoKCk7CisgICAgICAgICAgICBzRGF0YURpcmVjdG9yeSA9ICBkaXIuc3Vic3RyaW5nKDAsIGRpci5sYXN0SW5kZXhPZignLycpKTsKKyAgICAgICAgfQorCiAgICAgICAgIGlmIChEZWJ1Z0ZsYWdzLkJST1dTRVJfRlJBTUUpIHsKICAgICAgICAgICAgIExvZy52KExPR1RBRywgIkJyb3dzZXJGcmFtZSBjb25zdHJ1Y3RvcjogdGhpcz0iICsgdGhpcyk7CiAgICAgICAgIH0KQEAgLTI5NCw2ICszMDMsMTggQEAKICAgICB9CiAKICAgICAvKioKKyAgICAgKiBTYXZlcyB0aGUgY29udGVudHMgb2YgdGhlIGZyYW1lIGFzIGEgd2ViIGFyY2hpdmUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYmFzZW5hbWUgVGhlIGZpbGVuYW1lIHdoZXJlIHRoZSBhcmNoaXZlIHNob3VsZCBiZSBwbGFjZWQuCisgICAgICogQHBhcmFtIGF1dG9uYW1lIElmIGZhbHNlLCB0YWtlcyBmaWxlbmFtZSB0byBiZSBhIGZpbGUuIElmIHRydWUsIGZpbGVuYW1lCisgICAgICogICAgICAgICAgICAgICAgIGlzIGFzc3VtZWQgdG8gYmUgYSBkaXJlY3RvcnkgaW4gd2hpY2ggYSBmaWxlbmFtZSB3aWxsIGJlCisgICAgICogICAgICAgICAgICAgICAgIGNob3NlbiBhY2NvcmRpbmcgdG8gdGhlIHVybCBvZiB0aGUgY3VycmVudCBwYWdlLgorICAgICAqLworICAgIC8qIHBhY2thZ2UgKi8gU3RyaW5nIHNhdmVXZWJBcmNoaXZlKFN0cmluZyBiYXNlbmFtZSwgYm9vbGVhbiBhdXRvbmFtZSkgeworICAgICAgICByZXR1cm4gbmF0aXZlU2F2ZVdlYkFyY2hpdmUoYmFzZW5hbWUsIGF1dG9uYW1lKTsKKyAgICB9CisKKyAgICAvKioKICAgICAgKiBHbyBiYWNrIG9yIGZvcndhcmQgdGhlIG51bWJlciBvZiBzdGVwcyBnaXZlbi4KICAgICAgKiBAcGFyYW0gc3RlcHMgQSBuZWdhdGl2ZSBvciBwb3NpdGl2ZSBudW1iZXIgaW5kaWNhdGluZyB0aGUgZGlyZWN0aW9uCiAgICAgICogICAgICAgICAgICAgIGFuZCBudW1iZXIgb2Ygc3RlcHMgdG8gbW92ZS4KQEAgLTUxMCwxMiArNTMxLDIxIEBACiAgICAgcHJpdmF0ZSBuYXRpdmUgU3RyaW5nIGV4dGVybmFsUmVwcmVzZW50YXRpb24oKTsKIAogICAgIC8qKgotICAgICAqIFJldHJpZXZlcyB0aGUgdmlzdWFsIHRleHQgb2YgdGhlIGN1cnJlbnQgZnJhbWUsIHB1dHMgaXQgYXMgdGhlIG9iamVjdCBmb3IKKyAgICAgKiBSZXRyaWV2ZXMgdGhlIHZpc3VhbCB0ZXh0IG9mIHRoZSBmcmFtZXMsIHB1dHMgaXQgYXMgdGhlIG9iamVjdCBmb3IKICAgICAgKiB0aGUgbWVzc2FnZSBhbmQgc2VuZHMgdGhlIG1lc3NhZ2UuCiAgICAgICogQHBhcmFtIGNhbGxiYWNrIHRoZSBtZXNzYWdlIHRvIHVzZSB0byBzZW5kIHRoZSB2aXN1YWwgdGV4dAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIGRvY3VtZW50QXNUZXh0KE1lc3NhZ2UgY2FsbGJhY2spIHsKLSAgICAgICAgY2FsbGJhY2sub2JqID0gZG9jdW1lbnRBc1RleHQoKTs7CisgICAgICAgIFN0cmluZ0J1aWxkZXIgdGV4dCA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisgICAgICAgIGlmIChjYWxsYmFjay5hcmcxICE9IDApIHsKKyAgICAgICAgICAgIC8vIER1bXAgdG9wIGZyYW1lIGFzIHRleHQuCisgICAgICAgICAgICB0ZXh0LmFwcGVuZChkb2N1bWVudEFzVGV4dCgpKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoY2FsbGJhY2suYXJnMiAhPSAwKSB7CisgICAgICAgICAgICAvLyBEdW1wIGNoaWxkIGZyYW1lcyBhcyB0ZXh0LgorICAgICAgICAgICAgdGV4dC5hcHBlbmQoY2hpbGRGcmFtZXNBc1RleHQoKSk7CisgICAgICAgIH0KKyAgICAgICAgY2FsbGJhY2sub2JqID0gdGV4dC50b1N0cmluZygpOwogICAgICAgICBjYWxsYmFjay5zZW5kVG9UYXJnZXQoKTsKICAgICB9CiAKQEAgLTUyNCw2ICs1NTQsMTEgQEAKICAgICAgKi8KICAgICBwcml2YXRlIG5hdGl2ZSBTdHJpbmcgZG9jdW1lbnRBc1RleHQoKTsKIAorICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgdGV4dCBkcmF3biBvbiB0aGUgY2hpbGQgZnJhbWVzIGFzIGEgc3RyaW5nCisgICAgICovCisgICAgcHJpdmF0ZSBuYXRpdmUgU3RyaW5nIGNoaWxkRnJhbWVzQXNUZXh0KCk7CisKICAgICAvKgogICAgICAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBieSBXZWJDb3JlIHRvIGluZm9ybSB0aGUgZnJhbWUgdGhhdAogICAgICAqIHRoZSBKYXZhc2NyaXB0IHdpbmRvdyBvYmplY3QgaGFzIGJlZW4gY2xlYXJlZC4KQEAgLTYxNyw2ICs2NTIsMTA0IEBACiAgICAgfQogCiAgICAgLyoqCisgICAgICogQ2FsbGVkIGJ5IEpOSS4gR2V0cyB0aGUgYXBwbGljYXRpb25zIGRhdGEgZGlyZWN0b3J5CisgICAgICogQHJldHVybiBTdHJpbmcgVGhlIGFwcGxpY2F0aW9ucyBkYXRhIGRpcmVjdG9yeQorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBnZXREYXRhRGlyZWN0b3J5KCkgeworICAgICAgICByZXR1cm4gc0RhdGFEaXJlY3Rvcnk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2FsbGVkIGJ5IEpOSS4KKyAgICAgKiBSZWFkIGZyb20gYW4gSW5wdXRTdHJlYW0gaW50byBhIHN1cHBsaWVkIGJ5dGVbXQorICAgICAqIFRoaXMgbWV0aG9kIGNhdGNoZXMgYW55IGV4Y2VwdGlvbnMgc28gdGhleSBkb24ndCBjcmFzaCB0aGUgSlZNLgorICAgICAqIEBwYXJhbSBpbnB1dFN0cmVhbSBJbnB1dFN0cmVhbSB0byByZWFkIGZyb20uCisgICAgICogQHBhcmFtIG91dHB1dCBCeXRlYXJyYXkgdGhhdCBnZXRzIHRoZSBvdXRwdXQuCisgICAgICogQHJldHVybiB0aGUgbnVtYmVyIG9mIGJ5dGVzIHJlYWQsIG9yIC1pIGlmIHRoZW4gZW5kIG9mIHN0cmVhbSBoYXMgYmVlbiByZWFjaGVkCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgaW50IHJlYWRGcm9tU3RyZWFtKElucHV0U3RyZWFtIGlucHV0U3RyZWFtLCBieXRlW10gb3V0cHV0KSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXR1cm4gaW5wdXRTdHJlYW0ucmVhZChvdXRwdXQpOworICAgICAgICB9IGNhdGNoKGphdmEuaW8uSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgLy8gSWYgd2UgZ2V0IGFuIGV4Y2VwdGlvbiwgcmV0dXJuIGVuZCBvZiBzdHJlYW0KKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB0aGUgSW5wdXRTdHJlYW0gZm9yIGFuIEFuZHJvaWQgcmVzb3VyY2UKKyAgICAgKiBUaGVyZSBhcmUgdGhyZWUgZGlmZmVyZW50IGtpbmRzIG9mIGFuZHJvaWQgcmVzb3VyY2VzOgorICAgICAqIC0gZmlsZTovLy9hbmRyb2lkX3JlcworICAgICAqIC0gZmlsZTovLy9hbmRyb2lkX2Fzc2V0CisgICAgICogLSBjb250ZW50Oi8vCisgICAgICogQHBhcmFtIHVybCBUaGUgdXJsIHRvIGxvYWQuCisgICAgICogQHJldHVybiBBbiBJbnB1dFN0cmVhbSB0byB0aGUgYW5kcm9pZCByZXNvdXJjZQorICAgICAqLworICAgIHByaXZhdGUgSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW1Gb3JBbmRyb2lkUmVzb3VyY2UoU3RyaW5nIHVybCwgaW50IHR5cGUpIHsKKyAgICAgICAgZmluYWwgaW50IFJFU09VUkNFID0gMTsKKyAgICAgICAgZmluYWwgaW50IEFTU0VUID0gMjsKKyAgICAgICAgZmluYWwgaW50IENPTlRFTlQgPSAzOworCisgICAgICAgIGlmICh0eXBlID09IFJFU09VUkNFKSB7CisgICAgICAgICAgICAvLyBmaWxlOi8vL2FuZHJvaWRfcmVzCisgICAgICAgICAgICBpZiAodXJsID09IG51bGwgfHwgdXJsLmxlbmd0aCgpID09IDApIHsKKyAgICAgICAgICAgICAgICBMb2cuZShMT0dUQUcsICJ1cmwgaGFzIGxlbmd0aCAwICIgKyB1cmwpOworICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaW50IHNsYXNoID0gdXJsLmluZGV4T2YoJy8nKTsKKyAgICAgICAgICAgIGludCBkb3QgPSB1cmwuaW5kZXhPZignLicsIHNsYXNoKTsKKyAgICAgICAgICAgIGlmIChzbGFzaCA9PSAtMSB8fCBkb3QgPT0gLTEpIHsKKyAgICAgICAgICAgICAgICBMb2cuZShMT0dUQUcsICJJbmNvcnJlY3QgcmVzIHBhdGg6ICIgKyB1cmwpOworICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgfQorICAgICAgICAgICAgU3RyaW5nIHN1YkNsYXNzTmFtZSA9IHVybC5zdWJzdHJpbmcoMCwgc2xhc2gpOworICAgICAgICAgICAgU3RyaW5nIGZpZWxkTmFtZSA9IHVybC5zdWJzdHJpbmcoc2xhc2ggKyAxLCBkb3QpOworICAgICAgICAgICAgU3RyaW5nIGVycm9yTXNnID0gbnVsbDsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgZmluYWwgQ2xhc3M8Pz4gZCA9IG1Db250ZXh0LmdldEFwcGxpY2F0aW9uQ29udGV4dCgpCisgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0Q2xhc3NMb2FkZXIoKS5sb2FkQ2xhc3MoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Db250ZXh0LmdldFBhY2thZ2VOYW1lKCkgKyAiLlIkIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgc3ViQ2xhc3NOYW1lKTsKKyAgICAgICAgICAgICAgICBmaW5hbCBqYXZhLmxhbmcucmVmbGVjdC5GaWVsZCBmaWVsZCA9IGQuZ2V0RmllbGQoZmllbGROYW1lKTsKKyAgICAgICAgICAgICAgICBmaW5hbCBpbnQgaWQgPSBmaWVsZC5nZXRJbnQobnVsbCk7CisgICAgICAgICAgICAgICAgVHlwZWRWYWx1ZSB2YWx1ZSA9IG5ldyBUeXBlZFZhbHVlKCk7CisgICAgICAgICAgICAgICAgbUNvbnRleHQuZ2V0UmVzb3VyY2VzKCkuZ2V0VmFsdWUoaWQsIHZhbHVlLCB0cnVlKTsKKyAgICAgICAgICAgICAgICBpZiAodmFsdWUudHlwZSA9PSBUeXBlZFZhbHVlLlRZUEVfU1RSSU5HKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBtQ29udGV4dC5nZXRBc3NldHMoKS5vcGVuTm9uQXNzZXQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUuYXNzZXRDb29raWUsIHZhbHVlLnN0cmluZy50b1N0cmluZygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFzc2V0TWFuYWdlci5BQ0NFU1NfU1RSRUFNSU5HKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAvLyBPbGQgc3RhY2sgb25seSBzdXBwb3J0cyBUWVBFX1NUUklORyBmb3IgcmVzIGZpbGVzCisgICAgICAgICAgICAgICAgICAgIExvZy5lKExPR1RBRywgIm5vdCBvZiB0eXBlIHN0cmluZzogIiArIHVybCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgTG9nLmUoTE9HVEFHLCAiRXhjZXB0aW9uOiAiICsgdXJsKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIH0KKworICAgICAgICB9IGVsc2UgaWYgKHR5cGUgPT0gQVNTRVQpIHsKKyAgICAgICAgICAgIC8vIGZpbGU6Ly8vYW5kcm9pZF9hc3NldAorICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBBc3NldE1hbmFnZXIgYXNzZXRzID0gbUNvbnRleHQuZ2V0QXNzZXRzKCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIGFzc2V0cy5vcGVuKHVybCwgQXNzZXRNYW5hZ2VyLkFDQ0VTU19TVFJFQU1JTkcpOworICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKHR5cGUgPT0gQ09OVEVOVCkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBVcmkgdXJpID0gVXJpLnBhcnNlKHVybCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIG1Db250ZXh0LmdldENvbnRlbnRSZXNvbHZlcigpLm9wZW5JbnB1dFN0cmVhbSh1cmkpOworICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBMb2cuZShMT0dUQUcsICJFeGNlcHRpb246ICIgKyB1cmwpOworICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKICAgICAgKiBTdGFydCBsb2FkaW5nIGEgcmVzb3VyY2UuCiAgICAgICogQHBhcmFtIGxvYWRlckhhbmRsZSBUaGUgbmF0aXZlIFJlc291cmNlTG9hZGVyIHRoYXQgaXMgdGhlIHRhcmdldCBvZiB0aGUKICAgICAgKiAgICAgICAgICAgICAgICAgICAgIGRhdGEuCkBAIC04NDIsNiArOTc1LDcgQEAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRklMRV9VUExPQURfTEFCRUwgPSA0OwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBSRVNFVF9MQUJFTCA9IDU7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNVQk1JVF9MQUJFTCA9IDY7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEZJTEVfVVBMT0FEX05PX0ZJTEVfQ0hPU0VOID0gNzsKIAogICAgIFN0cmluZyBnZXRSYXdSZXNGaWxlbmFtZShpbnQgaWQpIHsKICAgICAgICAgaW50IHJlc2lkOwpAQCAtODcxLDYgKzEwMDUsMTAgQEAKICAgICAgICAgICAgICAgICByZXR1cm4gbUNvbnRleHQuZ2V0UmVzb3VyY2VzKCkuZ2V0U3RyaW5nKAogICAgICAgICAgICAgICAgICAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHJpbmcuc3VibWl0KTsKIAorICAgICAgICAgICAgY2FzZSBGSUxFX1VQTE9BRF9OT19GSUxFX0NIT1NFTjoKKyAgICAgICAgICAgICAgICByZXR1cm4gbUNvbnRleHQuZ2V0UmVzb3VyY2VzKCkuZ2V0U3RyaW5nKAorICAgICAgICAgICAgICAgICAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHJpbmcubm9fZmlsZV9jaG9zZW4pOworCiAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgIExvZy5lKExPR1RBRywgImdldFJhd1Jlc0ZpbGVuYW1lIGdvdCBpbmNvbXBhdGlibGUgcmVzb3VyY2UgSUQiKTsKICAgICAgICAgICAgICAgICByZXR1cm4gIiI7CkBAIC0xMDA2LDUgKzExNDQsNyBAQAogICAgICAqLwogICAgIHByaXZhdGUgbmF0aXZlIEhhc2hNYXAgZ2V0Rm9ybVRleHREYXRhKCk7CiAKKyAgICBwcml2YXRlIG5hdGl2ZSBTdHJpbmcgbmF0aXZlU2F2ZVdlYkFyY2hpdmUoU3RyaW5nIGJhc2VuYW1lLCBib29sZWFuIGF1dG9uYW1lKTsKKwogICAgIHByaXZhdGUgbmF0aXZlIHZvaWQgbmF0aXZlT3JpZW50YXRpb25DaGFuZ2VkKGludCBvcmllbnRhdGlvbik7CiB9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC93ZWJraXQvQ2FsbGJhY2tQcm94eS5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvd2Via2l0L0NhbGxiYWNrUHJveHkuamF2YQppbmRleCBkNjVjMTA2Li5iMDBmODhjIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC93ZWJraXQvQ2FsbGJhY2tQcm94eS5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3dlYmtpdC9DYWxsYmFja1Byb3h5LmphdmEKQEAgLTE2LDYgKzE2LDcgQEAKIAogcGFja2FnZSBhbmRyb2lkLndlYmtpdDsKIAoraW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5OwogaW1wb3J0IGFuZHJvaWQuYXBwLkFsZXJ0RGlhbG9nOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5BY3Rpdml0eU5vdEZvdW5kRXhjZXB0aW9uOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwpAQCAtNDEsNiArNDIsNyBAQAogaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLm5ldC5VUkw7CiBpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKIAogLyoqCiAgKiBUaGlzIGNsYXNzIGlzIGEgcHJveHkgY2xhc3MgZm9yIGhhbmRsaW5nIFdlYkNvcmUgLT4gVUkgdGhyZWFkIG1lc3NhZ2luZy4gQWxsCkBAIC0xMTIsNiArMTE0LDcgQEAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQUREX0hJU1RPUllfSVRFTSAgICAgICAgICAgICAgICAgICAgPSAxMzU7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEhJU1RPUllfSU5ERVhfQ0hBTkdFRCAgICAgICAgICAgICAgID0gMTM2OwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBBVVRIX0NSRURFTlRJQUxTICAgICAgICAgICAgICAgICAgICA9IDEzNzsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU0VUX0lOU1RBTExBQkxFX1dFQkFQUCAgICAgICAgICAgICAgPSAxMzg7CiAKICAgICAvLyBNZXNzYWdlIHRyaWdnZXJlZCBieSB0aGUgY2xpZW50IHRvIHJlc3VtZSBleGVjdXRpb24KICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTk9USUZZICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyMDA7CkBAIC0yNTMsMTcgKzI1NiwxMCBAQAogICAgICAgICAvLyAzMi1iaXQgcmVhZHMgYW5kIHdyaXRlcy4KICAgICAgICAgc3dpdGNoIChtc2cud2hhdCkgewogICAgICAgICAgICAgY2FzZSBQQUdFX1NUQVJURUQ6Ci0gICAgICAgICAgICAgICAgLy8gZXZlcnkgdGltZSB3ZSBzdGFydCBhIG5ldyBwYWdlLCB3ZSB3YW50IHRvIHJlc2V0IHRoZQotICAgICAgICAgICAgICAgIC8vIFdlYlZpZXcgY2VydGlmaWNhdGU6Ci0gICAgICAgICAgICAgICAgLy8gaWYgdGhlIG5ldyBzaXRlIGlzIHNlY3VyZSwgd2Ugd2lsbCByZWxvYWQgaXQgYW5kIGdldCBhCi0gICAgICAgICAgICAgICAgLy8gbmV3IGNlcnRpZmljYXRlIHNldDsKLSAgICAgICAgICAgICAgICAvLyBpZiB0aGUgbmV3IHNpdGUgaXMgbm90IHNlY3VyZSwgdGhlIGNlcnRpZmljYXRlIG11c3QgYmUKLSAgICAgICAgICAgICAgICAvLyBudWxsLCBhbmQgdGhhdCB3aWxsIGJlIHRoZSBjYXNlCi0gICAgICAgICAgICAgICAgbVdlYlZpZXcuc2V0Q2VydGlmaWNhdGUobnVsbCk7CisgICAgICAgICAgICAgICAgU3RyaW5nIHN0YXJ0ZWRVcmwgPSBtc2cuZ2V0RGF0YSgpLmdldFN0cmluZygidXJsIik7CisgICAgICAgICAgICAgICAgbVdlYlZpZXcub25QYWdlU3RhcnRlZChzdGFydGVkVXJsKTsKICAgICAgICAgICAgICAgICBpZiAobVdlYlZpZXdDbGllbnQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBtV2ViVmlld0NsaWVudC5vblBhZ2VTdGFydGVkKG1XZWJWaWV3LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1zZy5nZXREYXRhKCkuZ2V0U3RyaW5nKCJ1cmwiKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQml0bWFwKSBtc2cub2JqKTsKKyAgICAgICAgICAgICAgICAgICAgbVdlYlZpZXdDbGllbnQub25QYWdlU3RhcnRlZChtV2ViVmlldywgc3RhcnRlZFVybCwgKEJpdG1hcCkgbXNnLm9iaik7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGJyZWFrOwogCkBAIC01MDAsMTggKzQ5NiwzMiBAQAogICAgICAgICAgICAgICAgICAgICBTdHJpbmcgdXJsID0gbXNnLmdldERhdGEoKS5nZXRTdHJpbmcoInVybCIpOwogICAgICAgICAgICAgICAgICAgICBpZiAoIW1XZWJDaHJvbWVDbGllbnQub25Kc0FsZXJ0KG1XZWJWaWV3LCB1cmwsIG1lc3NhZ2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gb25seSBkaXNwbGF5IHRoZSBhbGVydCBkaWFsb2cgaWYgdGhlIG1Db250ZXh0IGlzCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBBY3Rpdml0eSBhbmQgaXRzIHdpbmRvdyBoYXMgdGhlIGZvY3VzLgorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEobUNvbnRleHQgaW5zdGFuY2VvZiBBY3Rpdml0eSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgISgoQWN0aXZpdHkpIG1Db250ZXh0KS5oYXNXaW5kb3dGb2N1cygpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzLmNhbmNlbCgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcy5zZXRSZWFkeSgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEFsZXJ0RGlhbG9nLkJ1aWxkZXIobUNvbnRleHQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRUaXRsZShnZXRKc0RpYWxvZ1RpdGxlKHVybCkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRNZXNzYWdlKG1lc3NhZ2UpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRQb3NpdGl2ZUJ1dHRvbihSLnN0cmluZy5vaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQWxlcnREaWFsb2cuT25DbGlja0xpc3RlbmVyKCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBEaWFsb2dJbnRlcmZhY2UuT25DbGlja0xpc3RlbmVyKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkNsaWNrKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERpYWxvZ0ludGVyZmFjZSBkaWFsb2csCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdoaWNoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXMuY29uZmlybSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldENhbmNlbGFibGUoZmFsc2UpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRPbkNhbmNlbExpc3RlbmVyKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBEaWFsb2dJbnRlcmZhY2UuT25DYW5jZWxMaXN0ZW5lcigpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgb25DYW5jZWwoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGlhbG9nSW50ZXJmYWNlIGRpYWxvZykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzLmNhbmNlbCgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNob3coKTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICByZXMuc2V0UmVhZHkoKTsKQEAgLTUyNSw2ICs1MzUsMTQgQEAKICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHVybCA9IG1zZy5nZXREYXRhKCkuZ2V0U3RyaW5nKCJ1cmwiKTsKICAgICAgICAgICAgICAgICAgICAgaWYgKCFtV2ViQ2hyb21lQ2xpZW50Lm9uSnNDb25maXJtKG1XZWJWaWV3LCB1cmwsIG1lc3NhZ2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gb25seSBkaXNwbGF5IHRoZSBhbGVydCBkaWFsb2cgaWYgdGhlIG1Db250ZXh0IGlzCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBBY3Rpdml0eSBhbmQgaXRzIHdpbmRvdyBoYXMgdGhlIGZvY3VzLgorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEobUNvbnRleHQgaW5zdGFuY2VvZiBBY3Rpdml0eSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgISgoQWN0aXZpdHkpIG1Db250ZXh0KS5oYXNXaW5kb3dGb2N1cygpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzLmNhbmNlbCgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcy5zZXRSZWFkeSgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEFsZXJ0RGlhbG9nLkJ1aWxkZXIobUNvbnRleHQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRUaXRsZShnZXRKc0RpYWxvZ1RpdGxlKHVybCkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRNZXNzYWdlKG1lc3NhZ2UpCkBAIC01NjUsNiArNTgzLDE0IEBACiAgICAgICAgICAgICAgICAgICAgIFN0cmluZyB1cmwgPSBtc2cuZ2V0RGF0YSgpLmdldFN0cmluZygidXJsIik7CiAgICAgICAgICAgICAgICAgICAgIGlmICghbVdlYkNocm9tZUNsaWVudC5vbkpzUHJvbXB0KG1XZWJWaWV3LCB1cmwsIG1lc3NhZ2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHRWYWwsIHJlcykpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9ubHkgZGlzcGxheSB0aGUgYWxlcnQgZGlhbG9nIGlmIHRoZSBtQ29udGV4dCBpcworICAgICAgICAgICAgICAgICAgICAgICAgLy8gQWN0aXZpdHkgYW5kIGl0cyB3aW5kb3cgaGFzIHRoZSBmb2N1cy4KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghKG1Db250ZXh0IGluc3RhbmNlb2YgQWN0aXZpdHkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICEoKEFjdGl2aXR5KSBtQ29udGV4dCkuaGFzV2luZG93Rm9jdXMoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcy5jYW5jZWwoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXMuc2V0UmVhZHkoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIExheW91dEluZmxhdGVyIGZhY3RvcnkgPSBMYXlvdXRJbmZsYXRlcgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZnJvbShtQ29udGV4dCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBWaWV3IHZpZXcgPSBmYWN0b3J5LmluZmxhdGUoUi5sYXlvdXQuanNfcHJvbXB0LApAQCAtNjE2LDYgKzY0MiwxNCBAQAogICAgICAgICAgICAgICAgICAgICBTdHJpbmcgdXJsID0gbXNnLmdldERhdGEoKS5nZXRTdHJpbmcoInVybCIpOwogICAgICAgICAgICAgICAgICAgICBpZiAoIW1XZWJDaHJvbWVDbGllbnQub25Kc0JlZm9yZVVubG9hZChtV2ViVmlldywgdXJsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UsIHJlcykpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9ubHkgZGlzcGxheSB0aGUgYWxlcnQgZGlhbG9nIGlmIHRoZSBtQ29udGV4dCBpcworICAgICAgICAgICAgICAgICAgICAgICAgLy8gQWN0aXZpdHkgYW5kIGl0cyB3aW5kb3cgaGFzIHRoZSBmb2N1cy4KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghKG1Db250ZXh0IGluc3RhbmNlb2YgQWN0aXZpdHkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICEoKEFjdGl2aXR5KSBtQ29udGV4dCkuaGFzV2luZG93Rm9jdXMoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcy5jYW5jZWwoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXMuc2V0UmVhZHkoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBtID0gbUNvbnRleHQuZ2V0U3RyaW5nKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSLnN0cmluZy5qc19kaWFsb2dfYmVmb3JlX3VubG9hZCwgbWVzc2FnZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQWxlcnREaWFsb2cuQnVpbGRlcihtQ29udGV4dCkKQEAgLTcyNSw3ICs3NTksOCBAQAogCiAgICAgICAgICAgICBjYXNlIE9QRU5fRklMRV9DSE9PU0VSOgogICAgICAgICAgICAgICAgIGlmIChtV2ViQ2hyb21lQ2xpZW50ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgbVdlYkNocm9tZUNsaWVudC5vcGVuRmlsZUNob29zZXIoKFVwbG9hZEZpbGUpIG1zZy5vYmopOworICAgICAgICAgICAgICAgICAgICBVcGxvYWRGaWxlTWVzc2FnZURhdGEgZGF0YSA9IChVcGxvYWRGaWxlTWVzc2FnZURhdGEpbXNnLm9iajsKKyAgICAgICAgICAgICAgICAgICAgbVdlYkNocm9tZUNsaWVudC5vcGVuRmlsZUNob29zZXIoZGF0YS5nZXRVcGxvYWRGaWxlKCksIGRhdGEuZ2V0QWNjZXB0VHlwZSgpKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAKQEAgLTc1MCw2ICs3ODUsOSBAQAogICAgICAgICAgICAgICAgIG1XZWJWaWV3LnNldEh0dHBBdXRoVXNlcm5hbWVQYXNzd29yZCgKICAgICAgICAgICAgICAgICAgICAgICAgIGhvc3QsIHJlYWxtLCB1c2VybmFtZSwgcGFzc3dvcmQpOwogICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBTRVRfSU5TVEFMTEFCTEVfV0VCQVBQOgorICAgICAgICAgICAgICAgIG1XZWJDaHJvbWVDbGllbnQuc2V0SW5zdGFsbGFibGVXZWJBcHAoKTsKKyAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogICAgIH0KIApAQCAtMTA4NywxMCArMTEyNSwxNSBAQAogICAgIHB1YmxpYyB2b2lkIG9uUHJvZ3Jlc3NDaGFuZ2VkKGludCBuZXdQcm9ncmVzcykgewogICAgICAgICAvLyBTeW5jaHJvbml6ZSBzbyB0aGF0IG1MYXRlc3RQcm9ncmVzcyBpcyB1cC10by1kYXRlLgogICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKLSAgICAgICAgICAgIGlmIChtV2ViQ2hyb21lQ2xpZW50ID09IG51bGwgfHwgbUxhdGVzdFByb2dyZXNzID09IG5ld1Byb2dyZXNzKSB7CisgICAgICAgICAgICAvLyB1cGRhdGUgbUxhdGVzdFByb2dyZXNzIGV2ZW4gbVdlYkNocm9tZUNsaWVudCBpcyBudWxsIGFzCisgICAgICAgICAgICAvLyBXZWJWaWV3LmdldFByb2dyZXNzKCkgbmVlZHMgaXQKKyAgICAgICAgICAgIGlmIChtTGF0ZXN0UHJvZ3Jlc3MgPT0gbmV3UHJvZ3Jlc3MpIHsKICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBtTGF0ZXN0UHJvZ3Jlc3MgPSBuZXdQcm9ncmVzczsKKyAgICAgICAgICAgIGlmIChtV2ViQ2hyb21lQ2xpZW50ID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAoIW1Qcm9ncmVzc1VwZGF0ZVBlbmRpbmcpIHsKICAgICAgICAgICAgICAgICBzZW5kRW1wdHlNZXNzYWdlKFBST0dSRVNTKTsKICAgICAgICAgICAgICAgICBtUHJvZ3Jlc3NVcGRhdGVQZW5kaW5nID0gdHJ1ZTsKQEAgLTExNzIsOSArMTIxNSw3IEBACiAgICAgICAgIC8vIGZvciBudWxsLgogICAgICAgICBXZWJIaXN0b3J5SXRlbSBpID0gbUJhY2tGb3J3YXJkTGlzdC5nZXRDdXJyZW50SXRlbSgpOwogICAgICAgICBpZiAoaSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAocHJlY29tcG9zZWQgfHwgaS5nZXRUb3VjaEljb25VcmwoKSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgaS5zZXRUb3VjaEljb25VcmwodXJsKTsKLSAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGkuc2V0VG91Y2hJY29uVXJsKHVybCwgcHJlY29tcG9zZWQpOwogICAgICAgICB9CiAgICAgICAgIC8vIERvIGFuIHVuc3luY2hyb25pemVkIHF1aWNrIGNoZWNrIHRvIGF2b2lkIHBvc3RpbmcgaWYgbm8gY2FsbGJhY2sgaGFzCiAgICAgICAgIC8vIGJlZW4gc2V0LgpAQCAtMTQzMiw2ICsxNDczLDI0IEBACiAgICAgICAgIHNlbmRNZXNzYWdlKG1zZyk7CiAgICAgfQogCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgVXBsb2FkRmlsZU1lc3NhZ2VEYXRhIHsKKyAgICAgICAgcHJpdmF0ZSBVcGxvYWRGaWxlIG1DYWxsYmFjazsKKyAgICAgICAgcHJpdmF0ZSBTdHJpbmcgbUFjY2VwdFR5cGU7CisKKyAgICAgICAgcHVibGljIFVwbG9hZEZpbGVNZXNzYWdlRGF0YShVcGxvYWRGaWxlIHVwbG9hZEZpbGUsIFN0cmluZyBhY2NlcHRUeXBlKSB7CisgICAgICAgICAgICBtQ2FsbGJhY2sgPSB1cGxvYWRGaWxlOworICAgICAgICAgICAgbUFjY2VwdFR5cGUgPSBhY2NlcHRUeXBlOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFVwbG9hZEZpbGUgZ2V0VXBsb2FkRmlsZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBtQ2FsbGJhY2s7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgU3RyaW5nIGdldEFjY2VwdFR5cGUoKSB7CisgICAgICAgICAgICByZXR1cm4gbUFjY2VwdFR5cGU7CisgICAgICAgIH0KKyAgICB9CisKICAgICBwcml2YXRlIGNsYXNzIFVwbG9hZEZpbGUgaW1wbGVtZW50cyBWYWx1ZUNhbGxiYWNrPFVyaT4gewogICAgICAgICBwcml2YXRlIFVyaSBtVmFsdWU7CiAgICAgICAgIHB1YmxpYyB2b2lkIG9uUmVjZWl2ZVZhbHVlKFVyaSB2YWx1ZSkgewpAQCAtMTQ0OCwxMyArMTUwNywxNCBAQAogICAgIC8qKgogICAgICAqIENhbGxlZCBieSBXZWJWaWV3Q29yZSB0byBvcGVuIGEgZmlsZSBjaG9vc2VyLgogICAgICAqLwotICAgIC8qIHBhY2thZ2UgKi8gVXJpIG9wZW5GaWxlQ2hvb3NlcigpIHsKKyAgICAvKiBwYWNrYWdlICovIFVyaSBvcGVuRmlsZUNob29zZXIoU3RyaW5nIGFjY2VwdFR5cGUpIHsKICAgICAgICAgaWYgKG1XZWJDaHJvbWVDbGllbnQgPT0gbnVsbCkgewogICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgIH0KICAgICAgICAgTWVzc2FnZSBteU1lc3NhZ2UgPSBvYnRhaW5NZXNzYWdlKE9QRU5fRklMRV9DSE9PU0VSKTsKICAgICAgICAgVXBsb2FkRmlsZSB1cGxvYWRGaWxlID0gbmV3IFVwbG9hZEZpbGUoKTsKLSAgICAgICAgbXlNZXNzYWdlLm9iaiA9IHVwbG9hZEZpbGU7CisgICAgICAgIFVwbG9hZEZpbGVNZXNzYWdlRGF0YSBkYXRhID0gbmV3IFVwbG9hZEZpbGVNZXNzYWdlRGF0YSh1cGxvYWRGaWxlLCBhY2NlcHRUeXBlKTsKKyAgICAgICAgbXlNZXNzYWdlLm9iaiA9IGRhdGE7CiAgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgewogICAgICAgICAgICAgc2VuZE1lc3NhZ2UobXlNZXNzYWdlKTsKICAgICAgICAgICAgIHRyeSB7CkBAIC0xNDgzLDQgKzE1NDMsMTEgQEAKICAgICAgICAgTWVzc2FnZSBtc2cgPSBvYnRhaW5NZXNzYWdlKEhJU1RPUllfSU5ERVhfQ0hBTkdFRCwgaW5kZXgsIDAsIGl0ZW0pOwogICAgICAgICBzZW5kTWVzc2FnZShtc2cpOwogICAgIH0KKworICAgIHZvaWQgc2V0SW5zdGFsbGFibGVXZWJBcHAoKSB7CisgICAgICAgIGlmIChtV2ViQ2hyb21lQ2xpZW50ID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBzZW5kTWVzc2FnZShvYnRhaW5NZXNzYWdlKFNFVF9JTlNUQUxMQUJMRV9XRUJBUFApKTsKKyAgICB9CiB9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC93ZWJraXQvRGV2aWNlT3JpZW50YXRpb25NYW5hZ2VyLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC93ZWJraXQvRGV2aWNlT3JpZW50YXRpb25NYW5hZ2VyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWFjMmY0MwotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3dlYmtpdC9EZXZpY2VPcmllbnRhdGlvbk1hbmFnZXIuamF2YQpAQCAtMCwwICsxLDY5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLndlYmtpdDsKKworLyoqCisgKiBUaGlzIGNsYXNzIGlzIHNpbXBseSBhIGNvbnRhaW5lciBmb3IgdGhlIG1ldGhvZHMgdXNlZCB0byBpbXBsZW1lbnQgRGV2aWNlT3JpZW50YXRpb24sCisgKiBpbmNsdWRpbmcgdGhlIG1vY2sgRGV2aWNlT3JpZW50YXRpb25DbGllbnQgZm9yIHVzZSBpbiBMYXlvdXRUZXN0cy4KKyAqCisgKiBUaGlzIGNvdWxkIGJlIHBhcnQgb2YgV2ViVmlld0NvcmUsIGJ1dCBoYXZlIG1vdmVkIGl0IHRvIGl0cyBvd24gY2xhc3MgdG8KKyAqIGF2b2lkIGJsb2F0IHRoZXJlLgorICogQGhpZGUKKyAqLworcHVibGljIGZpbmFsIGNsYXNzIERldmljZU9yaWVudGF0aW9uTWFuYWdlciB7CisgICAgcHJpdmF0ZSBXZWJWaWV3Q29yZSBtV2ViVmlld0NvcmU7CisgICAgcHJpdmF0ZSBEZXZpY2VPcmllbnRhdGlvblNlcnZpY2UgbVNlcnZpY2U7CisKKyAgICBwdWJsaWMgRGV2aWNlT3JpZW50YXRpb25NYW5hZ2VyKFdlYlZpZXdDb3JlIHdlYlZpZXdDb3JlKSB7CisgICAgICAgIG1XZWJWaWV3Q29yZSA9IHdlYlZpZXdDb3JlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgd2hldGhlciB0aGUgUGFnZSBmb3IgdGhpcyBXZWJWaWV3Q29yZSBzaG91bGQgdXNlIGEgbW9jayBEZXZpY2VPcmllbnRhdGlvbgorICAgICAqIGNsaWVudC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB1c2VNb2NrKCkgeworICAgICAgICBhc3NlcnQgV2ViVmlld0NvcmUuVEhSRUFEX05BTUUuZXF1YWxzKFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0TmFtZSgpKTsKKyAgICAgICAgbmF0aXZlVXNlTW9jayhtV2ViVmlld0NvcmUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgcG9zaXRpb24gZm9yIHRoZSBtb2NrIERldmljZU9yaWVudGF0aW9uIHNlcnZpY2UgZm9yIHRoaXMgV2ViVmlld0NvcmUuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0TW9ja09yaWVudGF0aW9uKGJvb2xlYW4gY2FuUHJvdmlkZUFscGhhLCBkb3VibGUgYWxwaGEsIGJvb2xlYW4gY2FuUHJvdmlkZUJldGEsCisgICAgICAgICAgICBkb3VibGUgYmV0YSwgYm9vbGVhbiBjYW5Qcm92aWRlR2FtbWEsIGRvdWJsZSBnYW1tYSkgeworICAgICAgICBhc3NlcnQgV2ViVmlld0NvcmUuVEhSRUFEX05BTUUuZXF1YWxzKFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0TmFtZSgpKTsKKyAgICAgICAgbmF0aXZlU2V0TW9ja09yaWVudGF0aW9uKG1XZWJWaWV3Q29yZSwgY2FuUHJvdmlkZUFscGhhLCBhbHBoYSwgY2FuUHJvdmlkZUJldGEsIGJldGEsCisgICAgICAgICAgICAgICAgY2FuUHJvdmlkZUdhbW1hLCBnYW1tYSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgb25PcmllbnRhdGlvbkNoYW5nZShEb3VibGUgYWxwaGEsIERvdWJsZSBiZXRhLCBEb3VibGUgZ2FtbWEpIHsKKyAgICAgICAgbmF0aXZlT25PcmllbnRhdGlvbkNoYW5nZShtV2ViVmlld0NvcmUsCisgICAgICAgICAgICAgICAgYWxwaGEgIT0gbnVsbCwgYWxwaGEgIT0gbnVsbCA/IGFscGhhLmRvdWJsZVZhbHVlKCkgOiAwLjAsCisgICAgICAgICAgICAgICAgYmV0YSAhPSBudWxsLCBiZXRhICE9IG51bGwgPyBiZXRhLmRvdWJsZVZhbHVlKCkgOiAwLjAsCisgICAgICAgICAgICAgICAgZ2FtbWEgIT0gbnVsbCwgZ2FtbWEgIT0gbnVsbCA/IGdhbW1hLmRvdWJsZVZhbHVlKCkgOiAwLjApOworICAgIH0KKworICAgIC8vIE5hdGl2ZSBmdW5jdGlvbnMKKyAgICBwcml2YXRlIHN0YXRpYyBuYXRpdmUgdm9pZCBuYXRpdmVVc2VNb2NrKFdlYlZpZXdDb3JlIHdlYlZpZXdDb3JlKTsKKyAgICBwcml2YXRlIHN0YXRpYyBuYXRpdmUgdm9pZCBuYXRpdmVTZXRNb2NrT3JpZW50YXRpb24oV2ViVmlld0NvcmUgd2ViVmlld0NvcmUsCisgICAgICAgICAgICBib29sZWFuIGNhblByb3ZpZGVBbHBoYSwgZG91YmxlIGFscGhhLCBib29sZWFuIGNhblByb3ZpZGVCZXRhLCBkb3VibGUgYmV0YSwKKyAgICAgICAgICAgIGJvb2xlYW4gY2FuUHJvdmlkZUdhbW1hLCBkb3VibGUgZ2FtbWEpOworICAgIHByaXZhdGUgc3RhdGljIG5hdGl2ZSB2b2lkIG5hdGl2ZU9uT3JpZW50YXRpb25DaGFuZ2UoV2ViVmlld0NvcmUgd2ViVmlld0NvcmUsCisgICAgICAgICAgICBib29sZWFuIGNhblByb3ZpZGVBbHBoYSwgZG91YmxlIGFscGhhLCBib29sZWFuIGNhblByb3ZpZGVCZXRhLCBkb3VibGUgYmV0YSwKKyAgICAgICAgICAgIGJvb2xlYW4gY2FuUHJvdmlkZUdhbW1hLCBkb3VibGUgZ2FtbWEpOworfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvd2Via2l0L0RldmljZU9yaWVudGF0aW9uU2VydmljZS5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvd2Via2l0L0RldmljZU9yaWVudGF0aW9uU2VydmljZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjRmZjg0OWUKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2phdmEvYW5kcm9pZC93ZWJraXQvRGV2aWNlT3JpZW50YXRpb25TZXJ2aWNlLmphdmEKQEAgLTAsMCArMSwyMTQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQud2Via2l0OworCitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5oYXJkd2FyZS5TZW5zb3I7CitpbXBvcnQgYW5kcm9pZC5oYXJkd2FyZS5TZW5zb3JFdmVudDsKK2ltcG9ydCBhbmRyb2lkLmhhcmR3YXJlLlNlbnNvckV2ZW50TGlzdGVuZXI7CitpbXBvcnQgYW5kcm9pZC5oYXJkd2FyZS5TZW5zb3JNYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlcjsKK2ltcG9ydCBhbmRyb2lkLndlYmtpdC5EZXZpY2VPcmllbnRhdGlvbk1hbmFnZXI7CitpbXBvcnQgamF2YS5sYW5nLlJ1bm5hYmxlOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCisKK2ZpbmFsIGNsYXNzIERldmljZU9yaWVudGF0aW9uU2VydmljZSBpbXBsZW1lbnRzIFNlbnNvckV2ZW50TGlzdGVuZXIgeworICAgIC8vIFRoZSBncmF2aXR5IHZlY3RvciBleHByZXNzZWQgaW4gdGhlIGJvZHkgZnJhbWUuCisgICAgcHJpdmF0ZSBmbG9hdFtdIG1HcmF2aXR5VmVjdG9yOworICAgIC8vIFRoZSBnZW9tYWduZXRpYyB2ZWN0b3IgZXhwcmVzc2VkIGluIHRoZSBib2R5IGZyYW1lLgorICAgIHByaXZhdGUgZmxvYXRbXSBtTWFnbmV0aWNGaWVsZFZlY3RvcjsKKworICAgIHByaXZhdGUgRGV2aWNlT3JpZW50YXRpb25NYW5hZ2VyIG1NYW5hZ2VyOworICAgIHByaXZhdGUgYm9vbGVhbiBtSXNSdW5uaW5nOworICAgIHByaXZhdGUgSGFuZGxlciBtSGFuZGxlcjsKKyAgICBwcml2YXRlIFNlbnNvck1hbmFnZXIgbVNlbnNvck1hbmFnZXI7CisgICAgcHJpdmF0ZSBDb250ZXh0IG1Db250ZXh0OworICAgIHByaXZhdGUgRG91YmxlIG1BbHBoYTsKKyAgICBwcml2YXRlIERvdWJsZSBtQmV0YTsKKyAgICBwcml2YXRlIERvdWJsZSBtR2FtbWE7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBkb3VibGUgREVMVEFfREVHUkVTUyA9IDEuMDsKKworICAgIHB1YmxpYyBEZXZpY2VPcmllbnRhdGlvblNlcnZpY2UoRGV2aWNlT3JpZW50YXRpb25NYW5hZ2VyIG1hbmFnZXIsIENvbnRleHQgY29udGV4dCkgeworICAgICAgICBtTWFuYWdlciA9IG1hbmFnZXI7CisgICAgICAgIGFzc2VydChtTWFuYWdlciAhPSBudWxsKTsKKyAgICAgICAgbUNvbnRleHQgPSBjb250ZXh0OworICAgICAgICBhc3NlcnQobUNvbnRleHQgIT0gbnVsbCk7CisgICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHN0YXJ0KCkgeworICAgICAgICBtSXNSdW5uaW5nID0gdHJ1ZTsKKyAgICAgICAgcmVnaXN0ZXJGb3JTZW5zb3JzKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc3RvcCgpIHsKKyAgICAgICAgbUlzUnVubmluZyA9IGZhbHNlOworICAgICAgICB1bnJlZ2lzdGVyRnJvbVNlbnNvcnMoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzdXNwZW5kKCkgeworICAgICAgICBpZiAobUlzUnVubmluZykgeworICAgICAgICAgICAgdW5yZWdpc3RlckZyb21TZW5zb3JzKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCByZXN1bWUoKSB7CisgICAgICAgIGlmIChtSXNSdW5uaW5nKSB7CisgICAgICAgICAgICByZWdpc3RlckZvclNlbnNvcnMoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBzZW5kRXJyb3JFdmVudCgpIHsKKyAgICAgICAgYXNzZXJ0IFdlYlZpZXdDb3JlLlRIUkVBRF9OQU1FLmVxdWFscyhUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldE5hbWUoKSk7CisgICAgICAgIG1IYW5kbGVyLnBvc3QobmV3IFJ1bm5hYmxlKCkgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgYXNzZXJ0IFdlYlZpZXdDb3JlLlRIUkVBRF9OQU1FLmVxdWFscyhUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldE5hbWUoKSk7CisgICAgICAgICAgICAgICAgaWYgKG1Jc1J1bm5pbmcpIHsKKyAgICAgICAgICAgICAgICAgICAgbU1hbmFnZXIub25PcmllbnRhdGlvbkNoYW5nZShudWxsLCBudWxsLCBudWxsKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCByZWdpc3RlckZvclNlbnNvcnMoKSB7CisgICAgICAgIGlmIChtSGFuZGxlciA9PSBudWxsKSB7CisgICAgICAgICAgICBtSGFuZGxlciA9IG5ldyBIYW5kbGVyKCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFyZWdpc3RlckZvckFjY2VsZXJvbWV0ZXJTZW5zb3IoKSB8fCAhcmVnaXN0ZXJGb3JNYWduZXRpY0ZpZWxkU2Vuc29yKCkpIHsKKyAgICAgICAgICAgIHVucmVnaXN0ZXJGcm9tU2Vuc29ycygpOworICAgICAgICAgICAgc2VuZEVycm9yRXZlbnQoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBnZXRPcmllbnRhdGlvblVzaW5nR2V0Um90YXRpb25NYXRyaXgoKSB7CisgICAgICAgIGlmIChtR3Jhdml0eVZlY3RvciA9PSBudWxsIHx8IG1NYWduZXRpY0ZpZWxkVmVjdG9yID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIC8vIEdldCB0aGUgcm90YXRpb24gbWF0cml4LgorICAgICAgICAvLyBUaGUgcm90YXRpb24gbWF0cml4IHRoYXQgdHJhbnNmb3JtcyBmcm9tIHRoZSBib2R5IGZyYW1lIHRvIHRoZSBlYXJ0aCBmcmFtZS4KKyAgICAgICAgZmxvYXRbXSBkZXZpY2VSb3RhdGlvbk1hdHJpeCA9IG5ldyBmbG9hdFs5XTsKKyAgICAgICAgaWYgKCFTZW5zb3JNYW5hZ2VyLmdldFJvdGF0aW9uTWF0cml4KAorICAgICAgICAgICAgICAgIGRldmljZVJvdGF0aW9uTWF0cml4LCBudWxsLCBtR3Jhdml0eVZlY3RvciwgbU1hZ25ldGljRmllbGRWZWN0b3IpKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICAvLyBDb252ZXJ0IHJvdGF0aW9uIG1hdHJpeCB0byByb3RhdGlvbiBhbmdsZXMuCisgICAgICAgIC8vIEFzc3VtaW5nIHRoYXQgdGhlIHJvdGF0aW9ucyBhcmUgYXBwaWVkIGluIHRoZSBvcmRlciBsaXN0ZWQgYXQKKyAgICAgICAgLy8gaHR0cDovL2RldmVsb3Blci5hbmRyb2lkLmNvbS9yZWZlcmVuY2UvYW5kcm9pZC9oYXJkd2FyZS9TZW5zb3JFdmVudC5odG1sI3ZhbHVlcworICAgICAgICAvLyB0aGUgcm90YXRpb25zIGFyZSBhcHBsaWVkIGFib3V0IHRoZSBzYW1lIGF4ZXMgYW5kIGluIHRoZSBzYW1lIG9yZGVyIGFzIHJlcXVpcmVkIGJ5IHRoZQorICAgICAgICAvLyBBUEkuIFRoZSBvbmx5IGNvbnZlcnNpb25zIGFyZSBzaWduIGNoYW5nZXMgYXMgZm9sbG93cy4KKyAgICAgICAgLy8gVGhlIGFuZ2xlcyBhcmUgaW4gcmFkaWFucworICAgICAgICBmbG9hdFtdIHJvdGF0aW9uQW5nbGVzID0gbmV3IGZsb2F0WzNdOworICAgICAgICBTZW5zb3JNYW5hZ2VyLmdldE9yaWVudGF0aW9uKGRldmljZVJvdGF0aW9uTWF0cml4LCByb3RhdGlvbkFuZ2xlcyk7CisgICAgICAgIGRvdWJsZSBhbHBoYSA9IE1hdGgudG9EZWdyZWVzKC1yb3RhdGlvbkFuZ2xlc1swXSkgLSA5MC4wOworICAgICAgICB3aGlsZSAoYWxwaGEgPCAwLjApIHsgYWxwaGEgKz0gMzYwLjA7IH0gLy8gWzAsIDM2MCkKKyAgICAgICAgZG91YmxlIGJldGEgPSBNYXRoLnRvRGVncmVlcygtcm90YXRpb25BbmdsZXNbMV0pOworICAgICAgICB3aGlsZSAoYmV0YSA8IC0xODAuMCkgeyBiZXRhICs9IDM2MC4wOyB9IC8vIFstMTgwLCAxODApCisgICAgICAgIGRvdWJsZSBnYW1tYSA9IE1hdGgudG9EZWdyZWVzKHJvdGF0aW9uQW5nbGVzWzJdKTsKKyAgICAgICAgd2hpbGUgKGdhbW1hIDwgLTkwLjApIHsgZ2FtbWEgKz0gMzYwLjA7IH0gLy8gWy05MCwgOTApCisKKyAgICAgICAgbWF5YmVTZW5kQ2hhbmdlKGFscGhhLCBiZXRhLCBnYW1tYSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBTZW5zb3JNYW5hZ2VyIGdldFNlbnNvck1hbmFnZXIoKSB7CisgICAgICAgIGFzc2VydCBXZWJWaWV3Q29yZS5USFJFQURfTkFNRS5lcXVhbHMoVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXROYW1lKCkpOworICAgICAgICBpZiAobVNlbnNvck1hbmFnZXIgPT0gbnVsbCkgeworICAgICAgICAgICAgbVNlbnNvck1hbmFnZXIgPSAoU2Vuc29yTWFuYWdlcikgbUNvbnRleHQuZ2V0U3lzdGVtU2VydmljZShDb250ZXh0LlNFTlNPUl9TRVJWSUNFKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbVNlbnNvck1hbmFnZXI7CisgICAgfQorCisgICAgcHJpdmF0ZSBib29sZWFuIHJlZ2lzdGVyRm9yQWNjZWxlcm9tZXRlclNlbnNvcigpIHsKKyAgICAgICAgTGlzdDxTZW5zb3I+IHNlbnNvcnMgPSBnZXRTZW5zb3JNYW5hZ2VyKCkuZ2V0U2Vuc29yTGlzdChTZW5zb3IuVFlQRV9BQ0NFTEVST01FVEVSKTsKKyAgICAgICAgaWYgKHNlbnNvcnMuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgLy8gVE9ETzogQ29uc2lkZXIgaGFuZGxpbmcgbXVsdGlwbGUgc2Vuc29ycy4KKyAgICAgICAgcmV0dXJuIGdldFNlbnNvck1hbmFnZXIoKS5yZWdpc3Rlckxpc3RlbmVyKAorICAgICAgICAgICAgICAgIHRoaXMsIHNlbnNvcnMuZ2V0KDApLCBTZW5zb3JNYW5hZ2VyLlNFTlNPUl9ERUxBWV9GQVNURVNULCBtSGFuZGxlcik7CisgICAgfQorCisgICAgcHJpdmF0ZSBib29sZWFuIHJlZ2lzdGVyRm9yTWFnbmV0aWNGaWVsZFNlbnNvcigpIHsKKyAgICAgICAgTGlzdDxTZW5zb3I+IHNlbnNvcnMgPSBnZXRTZW5zb3JNYW5hZ2VyKCkuZ2V0U2Vuc29yTGlzdChTZW5zb3IuVFlQRV9NQUdORVRJQ19GSUVMRCk7CisgICAgICAgIGlmIChzZW5zb3JzLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIC8vIFRPRE86IENvbnNpZGVyIGhhbmRsaW5nIG11bHRpcGxlIHNlbnNvcnMuCisgICAgICAgIHJldHVybiBnZXRTZW5zb3JNYW5hZ2VyKCkucmVnaXN0ZXJMaXN0ZW5lcigKKyAgICAgICAgICAgICAgICB0aGlzLCBzZW5zb3JzLmdldCgwKSwgU2Vuc29yTWFuYWdlci5TRU5TT1JfREVMQVlfRkFTVEVTVCwgbUhhbmRsZXIpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCB1bnJlZ2lzdGVyRnJvbVNlbnNvcnMoKSB7CisgICAgICAgIGdldFNlbnNvck1hbmFnZXIoKS51bnJlZ2lzdGVyTGlzdGVuZXIodGhpcyk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIG1heWJlU2VuZENoYW5nZShkb3VibGUgYWxwaGEsIGRvdWJsZSBiZXRhLCBkb3VibGUgZ2FtbWEpIHsKKyAgICAgICAgYXNzZXJ0IFdlYlZpZXdDb3JlLlRIUkVBRF9OQU1FLmVxdWFscyhUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldE5hbWUoKSk7CisgICAgICAgIGlmIChtQWxwaGEgPT0gbnVsbCB8fCBtQmV0YSA9PSBudWxsIHx8IG1HYW1tYSA9PSBudWxsCisgICAgICAgICAgICAgICAgfHwgTWF0aC5hYnMoYWxwaGEgLSBtQWxwaGEpID4gREVMVEFfREVHUkVTUworICAgICAgICAgICAgICAgIHx8IE1hdGguYWJzKGJldGEgLSBtQmV0YSkgPiBERUxUQV9ERUdSRVNTCisgICAgICAgICAgICAgICAgfHwgTWF0aC5hYnMoZ2FtbWEgLSBtR2FtbWEpID4gREVMVEFfREVHUkVTUykgeworICAgICAgICAgICAgbUFscGhhID0gYWxwaGE7CisgICAgICAgICAgICBtQmV0YSA9IGJldGE7CisgICAgICAgICAgICBtR2FtbWEgPSBnYW1tYTsKKyAgICAgICAgICAgIG1NYW5hZ2VyLm9uT3JpZW50YXRpb25DaGFuZ2UobUFscGhhLCBtQmV0YSwgbUdhbW1hKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFNlbnNvckV2ZW50TGlzdGVuZXIgaW1wbGVtZW50YXRpb24uCisgICAgICogQ2FsbGJhY2tzIGhhcHBlbiBvbiB0aGUgdGhyZWFkIG9uIHdoaWNoIHdlIHJlZ2lzdGVyZWQgLSB0aGUgV2ViQ29yZSB0aHJlYWQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgb25TZW5zb3JDaGFuZ2VkKFNlbnNvckV2ZW50IGV2ZW50KSB7CisgICAgICAgIGFzc2VydChldmVudC52YWx1ZXMubGVuZ3RoID09IDMpOworICAgICAgICBhc3NlcnQgV2ViVmlld0NvcmUuVEhSRUFEX05BTUUuZXF1YWxzKFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0TmFtZSgpKTsKKworICAgICAgICBpZiAoIW1Jc1J1bm5pbmcpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIHN3aXRjaCAoZXZlbnQuc2Vuc29yLmdldFR5cGUoKSkgeworICAgICAgICAgIGNhc2UgU2Vuc29yLlRZUEVfQUNDRUxFUk9NRVRFUjoKKyAgICAgICAgICAgIGlmIChtR3Jhdml0eVZlY3RvciA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgbUdyYXZpdHlWZWN0b3IgPSBuZXcgZmxvYXRbM107CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtR3Jhdml0eVZlY3RvclswXSA9IGV2ZW50LnZhbHVlc1swXTsKKyAgICAgICAgICAgIG1HcmF2aXR5VmVjdG9yWzFdID0gZXZlbnQudmFsdWVzWzFdOworICAgICAgICAgICAgbUdyYXZpdHlWZWN0b3JbMl0gPSBldmVudC52YWx1ZXNbMl07CisgICAgICAgICAgICBnZXRPcmllbnRhdGlvblVzaW5nR2V0Um90YXRpb25NYXRyaXgoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgU2Vuc29yLlRZUEVfTUFHTkVUSUNfRklFTEQ6CisgICAgICAgICAgICBpZiAobU1hZ25ldGljRmllbGRWZWN0b3IgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG1NYWduZXRpY0ZpZWxkVmVjdG9yID0gbmV3IGZsb2F0WzNdOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbU1hZ25ldGljRmllbGRWZWN0b3JbMF0gPSBldmVudC52YWx1ZXNbMF07CisgICAgICAgICAgICBtTWFnbmV0aWNGaWVsZFZlY3RvclsxXSA9IGV2ZW50LnZhbHVlc1sxXTsKKyAgICAgICAgICAgIG1NYWduZXRpY0ZpZWxkVmVjdG9yWzJdID0gZXZlbnQudmFsdWVzWzJdOworICAgICAgICAgICAgZ2V0T3JpZW50YXRpb25Vc2luZ0dldFJvdGF0aW9uTWF0cml4KCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgYXNzZXJ0KGZhbHNlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIG9uQWNjdXJhY3lDaGFuZ2VkKFNlbnNvciBzZW5zb3IsIGludCBhY2N1cmFjeSkgeworICAgICAgICBhc3NlcnQgV2ViVmlld0NvcmUuVEhSRUFEX05BTUUuZXF1YWxzKFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0TmFtZSgpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC93ZWJraXQvRmluZEFjdGlvbk1vZGVDYWxsYmFjay5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvd2Via2l0L0ZpbmRBY3Rpb25Nb2RlQ2FsbGJhY2suamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNzA0M2UwCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvd2Via2l0L0ZpbmRBY3Rpb25Nb2RlQ2FsbGJhY2suamF2YQpAQCAtMCwwICsxLDIzMCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC53ZWJraXQ7CisKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlJlc291cmNlczsKK2ltcG9ydCBhbmRyb2lkLnRleHQuRWRpdGFibGU7CitpbXBvcnQgYW5kcm9pZC50ZXh0LlNlbGVjdGlvbjsKK2ltcG9ydCBhbmRyb2lkLnRleHQuU3Bhbm5hYmxlOworaW1wb3J0IGFuZHJvaWQudGV4dC5UZXh0V2F0Y2hlcjsKK2ltcG9ydCBhbmRyb2lkLndlYmtpdC5XZWJWaWV3OworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkVkaXRUZXh0OworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlRleHRWaWV3OworaW1wb3J0IGFuZHJvaWQudmlldy5BY3Rpb25Nb2RlOworaW1wb3J0IGFuZHJvaWQudmlldy5MYXlvdXRJbmZsYXRlcjsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuTWVudTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuTWVudUluZmxhdGVyOworaW1wb3J0IGFuZHJvaWQudmlldy5NZW51SXRlbTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuaW5wdXRtZXRob2QuSW5wdXRNZXRob2RNYW5hZ2VyOworCitjbGFzcyBGaW5kQWN0aW9uTW9kZUNhbGxiYWNrIGltcGxlbWVudHMgQWN0aW9uTW9kZS5DYWxsYmFjaywgVGV4dFdhdGNoZXIsCisgICAgICAgIFZpZXcuT25Mb25nQ2xpY2tMaXN0ZW5lciB7CisgICAgcHJpdmF0ZSBWaWV3IG1DdXN0b21WaWV3OworICAgIHByaXZhdGUgRWRpdFRleHQgbUVkaXRUZXh0OworICAgIHByaXZhdGUgVGV4dFZpZXcgbU1hdGNoZXM7CisgICAgcHJpdmF0ZSBXZWJWaWV3IG1XZWJWaWV3OworICAgIHByaXZhdGUgSW5wdXRNZXRob2RNYW5hZ2VyIG1JbnB1dDsKKyAgICBwcml2YXRlIFJlc291cmNlcyBtUmVzb3VyY2VzOworICAgIHByaXZhdGUgYm9vbGVhbiBtTWF0Y2hlc0ZvdW5kOworICAgIHByaXZhdGUgaW50IG1OdW1iZXJPZk1hdGNoZXM7CisgICAgcHJpdmF0ZSBWaWV3IG1UaXRsZUJhcjsKKyAgICBwcml2YXRlIEFjdGlvbk1vZGUgbUFjdGlvbk1vZGU7CisKKyAgICBGaW5kQWN0aW9uTW9kZUNhbGxiYWNrKENvbnRleHQgY29udGV4dCkgeworICAgICAgICBtQ3VzdG9tVmlldyA9IExheW91dEluZmxhdGVyLmZyb20oY29udGV4dCkuaW5mbGF0ZSgKKyAgICAgICAgICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmxheW91dC53ZWJ2aWV3X2ZpbmQsIG51bGwpOworICAgICAgICBtRWRpdFRleHQgPSAoRWRpdFRleHQpIG1DdXN0b21WaWV3LmZpbmRWaWV3QnlJZCgKKyAgICAgICAgICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmlkLmVkaXQpOworICAgICAgICAvLyBPdmVycmlkZSBsb25nIGNsaWNrIHNvIHRoYXQgc2VsZWN0IEFjdGlvbk1vZGUgaXMgbm90IG9wZW5lZCwgd2hpY2gKKyAgICAgICAgLy8gd291bGQgZXhpdCBmaW5kIEFjdGlvbk1vZGUuCisgICAgICAgIG1FZGl0VGV4dC5zZXRPbkxvbmdDbGlja0xpc3RlbmVyKHRoaXMpOworICAgICAgICBzZXRUZXh0KCIiKTsKKyAgICAgICAgbU1hdGNoZXMgPSAoVGV4dFZpZXcpIG1DdXN0b21WaWV3LmZpbmRWaWV3QnlJZCgKKyAgICAgICAgICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmlkLm1hdGNoZXMpOworICAgICAgICBtSW5wdXQgPSAoSW5wdXRNZXRob2RNYW5hZ2VyKQorICAgICAgICAgICAgICAgIGNvbnRleHQuZ2V0U3lzdGVtU2VydmljZShDb250ZXh0LklOUFVUX01FVEhPRF9TRVJWSUNFKTsKKyAgICAgICAgbVJlc291cmNlcyA9IGNvbnRleHQuZ2V0UmVzb3VyY2VzKCk7CisgICAgfQorCisgICAgdm9pZCBzZXRUaXRsZUJhcihWaWV3IHYpIHsgbVRpdGxlQmFyID0gdjsgfQorCisgICAgdm9pZCBmaW5pc2goKSB7CisgICAgICAgIG1BY3Rpb25Nb2RlLmZpbmlzaCgpOworICAgIH0KKworICAgIC8qCisgICAgICogUGxhY2UgdGV4dCBpbiB0aGUgdGV4dCBmaWVsZCBzbyBpdCBjYW4gYmUgc2VhcmNoZWQgZm9yLiAgTmVlZCB0byBwcmVzcworICAgICAqIHRoZSBmaW5kIG5leHQgb3IgZmluZCBwcmV2aW91cyBidXR0b24gdG8gZmluZCBhbGwgb2YgdGhlIG1hdGNoZXMuCisgICAgICovCisgICAgdm9pZCBzZXRUZXh0KFN0cmluZyB0ZXh0KSB7CisgICAgICAgIG1FZGl0VGV4dC5zZXRUZXh0KHRleHQpOworICAgICAgICBTcGFubmFibGUgc3BhbiA9IChTcGFubmFibGUpIG1FZGl0VGV4dC5nZXRUZXh0KCk7CisgICAgICAgIGludCBsZW5ndGggPSBzcGFuLmxlbmd0aCgpOworICAgICAgICAvLyBJZGVhbGx5LCB3ZSB3b3VsZCBsaWtlIHRvIHNldCB0aGUgc2VsZWN0aW9uIHRvIHRoZSB3aG9sZSBmaWVsZCwKKyAgICAgICAgLy8gYnV0IHRoaXMgYnJpbmdzIHVwIHRoZSBUZXh0IHNlbGVjdGlvbiBDQUIsIHdoaWNoIGRpc21pc3NlcyB0aGlzCisgICAgICAgIC8vIG9uZS4KKyAgICAgICAgU2VsZWN0aW9uLnNldFNlbGVjdGlvbihzcGFuLCBsZW5ndGgsIGxlbmd0aCk7CisgICAgICAgIC8vIE5lY2Vzc2FyeSBlYWNoIHRpbWUgd2Ugc2V0IHRoZSB0ZXh0LCBzbyB0aGF0IHRoaXMgd2lsbCB3YXRjaAorICAgICAgICAvLyBjaGFuZ2VzIHRvIGl0LgorICAgICAgICBzcGFuLnNldFNwYW4odGhpcywgMCwgbGVuZ3RoLCBTcGFubmFibGUuU1BBTl9JTkNMVVNJVkVfSU5DTFVTSVZFKTsKKyAgICAgICAgbU1hdGNoZXNGb3VuZCA9IGZhbHNlOworICAgIH0KKworICAgIC8qCisgICAgICogU2V0IHRoZSBXZWJWaWV3IHRvIHNlYXJjaC4gIE11c3QgYmUgbm9uIG51bGwsIGFuZCBzZXQgYmVmb3JlIGNhbGxpbmcKKyAgICAgKiBzdGFydEFjdGlvbk1vZGUuCisgICAgICovCisgICAgdm9pZCBzZXRXZWJWaWV3KFdlYlZpZXcgd2ViVmlldykgeworICAgICAgICBpZiAobnVsbCA9PSB3ZWJWaWV3KSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uRXJyb3IoIldlYlZpZXcgc3VwcGxpZWQgdG8gIgorICAgICAgICAgICAgICAgICAgICArICJGaW5kQWN0aW9uTW9kZUNhbGxiYWNrIGNhbm5vdCBiZSBudWxsIik7CisgICAgICAgIH0KKyAgICAgICAgbVdlYlZpZXcgPSB3ZWJWaWV3OworICAgIH0KKworICAgIC8qCisgICAgICogTW92ZSB0aGUgaGlnaGxpZ2h0IHRvIHRoZSBuZXh0IG1hdGNoLgorICAgICAqIEBwYXJhbSBuZXh0IElmIHRydWUsIGZpbmQgdGhlIG5leHQgbWF0Y2ggZnVydGhlciBkb3duIGluIHRoZSBkb2N1bWVudC4KKyAgICAgKiAgICAgICAgICAgICBJZiBmYWxzZSwgZmluZCB0aGUgcHJldmlvdXMgbWF0Y2gsIHVwIGluIHRoZSBkb2N1bWVudC4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgZmluZE5leHQoYm9vbGVhbiBuZXh0KSB7CisgICAgICAgIGlmIChtV2ViVmlldyA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uRXJyb3IoCisgICAgICAgICAgICAgICAgICAgICJObyBXZWJWaWV3IGZvciBGaW5kQWN0aW9uTW9kZUNhbGxiYWNrOjpmaW5kTmV4dCIpOworICAgICAgICB9CisgICAgICAgIG1XZWJWaWV3LmZpbmROZXh0KG5leHQpOworICAgIH0KKworICAgIC8qCisgICAgICogSGlnaGxpZ2h0IGFsbCB0aGUgaW5zdGFuY2VzIG9mIHRoZSBzdHJpbmcgZnJvbSBtRWRpdFRleHQgaW4gbVdlYlZpZXcuCisgICAgICovCisgICAgdm9pZCBmaW5kQWxsKCkgeworICAgICAgICBpZiAobVdlYlZpZXcgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbkVycm9yKAorICAgICAgICAgICAgICAgICAgICAiTm8gV2ViVmlldyBmb3IgRmluZEFjdGlvbk1vZGVDYWxsYmFjazo6ZmluZEFsbCIpOworICAgICAgICB9CisgICAgICAgIENoYXJTZXF1ZW5jZSBmaW5kID0gbUVkaXRUZXh0LmdldFRleHQoKTsKKyAgICAgICAgaWYgKDAgPT0gZmluZC5sZW5ndGgoKSkgeworICAgICAgICAgICAgbVdlYlZpZXcuY2xlYXJNYXRjaGVzKCk7CisgICAgICAgICAgICBtTWF0Y2hlcy5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7CisgICAgICAgICAgICBtTWF0Y2hlc0ZvdW5kID0gZmFsc2U7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtTWF0Y2hlc0ZvdW5kID0gdHJ1ZTsKKyAgICAgICAgICAgIG1NYXRjaGVzLnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKKyAgICAgICAgICAgIG1OdW1iZXJPZk1hdGNoZXMgPSBtV2ViVmlldy5maW5kQWxsKGZpbmQudG9TdHJpbmcoKSk7CisgICAgICAgICAgICBpZiAoMCA9PSBtTnVtYmVyT2ZNYXRjaGVzKSB7CisgICAgICAgICAgICAgICAgbU1hdGNoZXMuc2V0VGV4dChtUmVzb3VyY2VzLmdldFN0cmluZygKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3RyaW5nLm5vX21hdGNoZXMpKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgdXBkYXRlTWF0Y2hlc1N0cmluZygpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoKKyAgICAgKiBVcGRhdGUgdGhlIHN0cmluZyB3aGljaCB0ZWxscyB0aGUgdXNlciBob3cgbWFueSBtYXRjaGVzIHdlcmUgZm91bmQsIGFuZAorICAgICAqIHdoaWNoIG1hdGNoIGlzIGN1cnJlbnRseSBoaWdobGlnaHRlZC4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgdXBkYXRlTWF0Y2hlc1N0cmluZygpIHsKKyAgICAgICAgU3RyaW5nIHRlbXBsYXRlID0gbVJlc291cmNlcy5nZXRRdWFudGl0eVN0cmluZygKKyAgICAgICAgICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnBsdXJhbHMubWF0Y2hlc19mb3VuZCwgbU51bWJlck9mTWF0Y2hlcywKKyAgICAgICAgICAgICAgICBtV2ViVmlldy5maW5kSW5kZXgoKSArIDEsIG1OdW1iZXJPZk1hdGNoZXMpOworCisgICAgICAgIG1NYXRjaGVzLnNldFRleHQodGVtcGxhdGUpOworICAgIH0KKworICAgIC8vIE9uTG9uZ0NsaWNrTGlzdGVuZXIgaW1wbGVtZW50YXRpb24KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIG9uTG9uZ0NsaWNrKFZpZXcgdikgeyByZXR1cm4gdHJ1ZTsgfQorCisgICAgLy8gQWN0aW9uTW9kZS5DYWxsYmFjayBpbXBsZW1lbnRhdGlvbgorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gb25DcmVhdGVBY3Rpb25Nb2RlKEFjdGlvbk1vZGUgbW9kZSwgTWVudSBtZW51KSB7CisgICAgICAgIG1vZGUuc2V0Q3VzdG9tVmlldyhtQ3VzdG9tVmlldyk7CisgICAgICAgIG1vZGUuZ2V0TWVudUluZmxhdGVyKCkuaW5mbGF0ZShjb20uYW5kcm9pZC5pbnRlcm5hbC5SLm1lbnUud2Vidmlld19maW5kLAorICAgICAgICAgICAgICAgIG1lbnUpOworICAgICAgICBtQWN0aW9uTW9kZSA9IG1vZGU7CisgICAgICAgIEVkaXRhYmxlIGVkaXQgPSBtRWRpdFRleHQuZ2V0VGV4dCgpOworICAgICAgICBTZWxlY3Rpb24uc2V0U2VsZWN0aW9uKGVkaXQsIGVkaXQubGVuZ3RoKCkpOworICAgICAgICBtTWF0Y2hlcy5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7CisgICAgICAgIG1NYXRjaGVzRm91bmQgPSBmYWxzZTsKKyAgICAgICAgbU1hdGNoZXMuc2V0VGV4dCgiMCIpOworICAgICAgICBtRWRpdFRleHQucmVxdWVzdEZvY3VzKCk7CisgICAgICAgIG1JbnB1dC5zaG93U29mdElucHV0KG1FZGl0VGV4dCwgMCk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9uRGVzdHJveUFjdGlvbk1vZGUoQWN0aW9uTW9kZSBtb2RlKSB7CisgICAgICAgIGlmIChtVGl0bGVCYXIgIT0gbnVsbCkgbVdlYlZpZXcuc2V0RW1iZWRkZWRUaXRsZUJhcihtVGl0bGVCYXIpOworICAgICAgICBtV2ViVmlldy5ub3RpZnlGaW5kRGlhbG9nRGlzbWlzc2VkKCk7CisgICAgICAgIG1JbnB1dC5oaWRlU29mdElucHV0RnJvbVdpbmRvdyhtV2ViVmlldy5nZXRXaW5kb3dUb2tlbigpLCAwKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBvblByZXBhcmVBY3Rpb25Nb2RlKEFjdGlvbk1vZGUgbW9kZSwgTWVudSBtZW51KSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBvbkFjdGlvbkl0ZW1DbGlja2VkKEFjdGlvbk1vZGUgbW9kZSwgTWVudUl0ZW0gaXRlbSkgeworICAgICAgICBpZiAoIW1NYXRjaGVzRm91bmQpIHsKKyAgICAgICAgICAgIGZpbmRBbGwoKTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIHN3aXRjaChpdGVtLmdldEl0ZW1JZCgpKSB7CisgICAgICAgICAgICBjYXNlIGNvbS5hbmRyb2lkLmludGVybmFsLlIuaWQuZmluZF9wcmV2OgorICAgICAgICAgICAgICAgIGZpbmROZXh0KGZhbHNlKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5pZC5maW5kX25leHQ6CisgICAgICAgICAgICAgICAgZmluZE5leHQodHJ1ZSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICB1cGRhdGVNYXRjaGVzU3RyaW5nKCk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIC8vIFRleHRXYXRjaGVyIGltcGxlbWVudGF0aW9uCisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBiZWZvcmVUZXh0Q2hhbmdlZChDaGFyU2VxdWVuY2UgcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhZnRlcikgeworICAgICAgICAvLyBEb2VzIG5vdGhpbmcuICBOZWVkZWQgdG8gaW1wbGVtZW50IFRleHRXYXRjaGVyLgorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9uVGV4dENoYW5nZWQoQ2hhclNlcXVlbmNlIHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYmVmb3JlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNvdW50KSB7CisgICAgICAgIGZpbmRBbGwoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBhZnRlclRleHRDaGFuZ2VkKEVkaXRhYmxlIHMpIHsKKyAgICAgICAgLy8gRG9lcyBub3RoaW5nLiAgTmVlZGVkIHRvIGltcGxlbWVudCBUZXh0V2F0Y2hlci4KKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3dlYmtpdC9HZW9sb2NhdGlvblNlcnZpY2UuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3dlYmtpdC9HZW9sb2NhdGlvblNlcnZpY2UuamF2YQppbmRleCAyNDMwNmY0Li45MWRlMWQ4IDEwMDc1NQotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC93ZWJraXQvR2VvbG9jYXRpb25TZXJ2aWNlLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvd2Via2l0L0dlb2xvY2F0aW9uU2VydmljZS5qYXZhCkBAIC00NSwxNCArNDUsMTMgQEAKIAogICAgIC8qKgogICAgICAqIENvbnN0cnVjdG9yCisgICAgICogQHBhcmFtIGNvbnRleHQgVGhlIGNvbnRleHQgZnJvbSB3aGljaCB3ZSBvYnRhaW4gdGhlIHN5c3RlbSBzZXJ2aWNlLgogICAgICAqIEBwYXJhbSBuYXRpdmVPYmplY3QgVGhlIG5hdGl2ZSBvYmplY3QgdG8gd2hpY2ggdGhpcyBvYmplY3Qgd2lsbCByZXBvcnQgcG9zaXRpb24gdXBkYXRlcyBhbmQKICAgICAgKiAgICAgZXJyb3JzLgogICAgICAqLwotICAgIHB1YmxpYyBHZW9sb2NhdGlvblNlcnZpY2UobG9uZyBuYXRpdmVPYmplY3QpIHsKKyAgICBwdWJsaWMgR2VvbG9jYXRpb25TZXJ2aWNlKENvbnRleHQgY29udGV4dCwgbG9uZyBuYXRpdmVPYmplY3QpIHsKICAgICAgICAgbU5hdGl2ZU9iamVjdCA9IG5hdGl2ZU9iamVjdDsKICAgICAgICAgLy8gUmVnaXN0ZXIgbmV3TG9jYXRpb25BdmFpbGFibGUgd2l0aCBwbGF0Zm9ybSBzZXJ2aWNlLgotICAgICAgICBBY3Rpdml0eVRocmVhZCB0aHJlYWQgPSBBY3Rpdml0eVRocmVhZC5zeXN0ZW1NYWluKCk7Ci0gICAgICAgIENvbnRleHQgY29udGV4dCA9IHRocmVhZC5nZXRBcHBsaWNhdGlvbigpOwogICAgICAgICBtTG9jYXRpb25NYW5hZ2VyID0gKExvY2F0aW9uTWFuYWdlcikgY29udGV4dC5nZXRTeXN0ZW1TZXJ2aWNlKENvbnRleHQuTE9DQVRJT05fU0VSVklDRSk7CiAgICAgICAgIGlmIChtTG9jYXRpb25NYW5hZ2VyID09IG51bGwpIHsKICAgICAgICAgICAgIExvZy5lKFRBRywgIkNvdWxkIG5vdCBnZXQgbG9jYXRpb24gbWFuYWdlci4iKTsKQEAgLTYyLDkgKzYxLDEwIEBACiAgICAgLyoqCiAgICAgICogU3RhcnQgbGlzdGVuaW5nIGZvciBsb2NhdGlvbiB1cGRhdGVzLgogICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHN0YXJ0KCkgeworICAgIHB1YmxpYyBib29sZWFuIHN0YXJ0KCkgewogICAgICAgICByZWdpc3RlckZvckxvY2F0aW9uVXBkYXRlcygpOwogICAgICAgICBtSXNSdW5uaW5nID0gdHJ1ZTsKKyAgICAgICAgcmV0dXJuIG1Jc05ldHdvcmtQcm92aWRlckF2YWlsYWJsZSB8fCBtSXNHcHNQcm92aWRlckF2YWlsYWJsZTsKICAgICB9CiAKICAgICAvKioKQEAgLTg3LDYgKzg3LDggQEAKICAgICAgICAgICAgICAgICAvLyBvbmx5IHVucmVnaXN0ZXIgZnJvbSBhbGwsIHRoZW4gcmVyZWdpc3RlciB3aXRoIGFsbCBidXQgdGhlIEdQUy4KICAgICAgICAgICAgICAgICB1bnJlZ2lzdGVyRnJvbUxvY2F0aW9uVXBkYXRlcygpOwogICAgICAgICAgICAgICAgIHJlZ2lzdGVyRm9yTG9jYXRpb25VcGRhdGVzKCk7CisgICAgICAgICAgICAgICAgLy8gQ2hlY2sgdGhhdCB0aGUgcHJvdmlkZXJzIGFyZSBzdGlsbCBhdmFpbGFibGUgYWZ0ZXIgd2UgcmUtcmVnaXN0ZXIuCisgICAgICAgICAgICAgICAgbWF5YmVSZXBvcnRFcnJvcigiVGhlIGxhc3QgbG9jYXRpb24gcHJvdmlkZXIgaXMgbm8gbG9uZ2VyIGF2YWlsYWJsZSIpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQpAQCAtMTU2LDExICsxNTgsMTYgQEAKICAgICAgKi8KICAgICBwcml2YXRlIHZvaWQgcmVnaXN0ZXJGb3JMb2NhdGlvblVwZGF0ZXMoKSB7CiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBtTG9jYXRpb25NYW5hZ2VyLnJlcXVlc3RMb2NhdGlvblVwZGF0ZXMoTG9jYXRpb25NYW5hZ2VyLk5FVFdPUktfUFJPVklERVIsIDAsIDAsIHRoaXMpOwotICAgICAgICAgICAgbUlzTmV0d29ya1Byb3ZpZGVyQXZhaWxhYmxlID0gdHJ1ZTsKKyAgICAgICAgICAgIC8vIFJlZ2lzdHJhdGlvbiBtYXkgZmFpbCBpZiBwcm92aWRlcnMgYXJlIG5vdCBwcmVzZW50IG9uIHRoZSBkZXZpY2UuCisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIG1Mb2NhdGlvbk1hbmFnZXIucmVxdWVzdExvY2F0aW9uVXBkYXRlcyhMb2NhdGlvbk1hbmFnZXIuTkVUV09SS19QUk9WSURFUiwgMCwgMCwgdGhpcyk7CisgICAgICAgICAgICAgICAgbUlzTmV0d29ya1Byb3ZpZGVyQXZhaWxhYmxlID0gdHJ1ZTsKKyAgICAgICAgICAgIH0gY2F0Y2goSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsgfQogICAgICAgICAgICAgaWYgKG1Jc0dwc0VuYWJsZWQpIHsKLSAgICAgICAgICAgICAgICBtTG9jYXRpb25NYW5hZ2VyLnJlcXVlc3RMb2NhdGlvblVwZGF0ZXMoTG9jYXRpb25NYW5hZ2VyLkdQU19QUk9WSURFUiwgMCwgMCwgdGhpcyk7Ci0gICAgICAgICAgICAgICAgbUlzR3BzUHJvdmlkZXJBdmFpbGFibGUgPSB0cnVlOworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIG1Mb2NhdGlvbk1hbmFnZXIucmVxdWVzdExvY2F0aW9uVXBkYXRlcyhMb2NhdGlvbk1hbmFnZXIuR1BTX1BST1ZJREVSLCAwLCAwLCB0aGlzKTsKKyAgICAgICAgICAgICAgICAgICAgbUlzR3BzUHJvdmlkZXJBdmFpbGFibGUgPSB0cnVlOworICAgICAgICAgICAgICAgIH0gY2F0Y2goSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsgfQogICAgICAgICAgICAgfQogICAgICAgICB9IGNhdGNoKFNlY3VyaXR5RXhjZXB0aW9uIGUpIHsKICAgICAgICAgICAgIExvZy5lKFRBRywgIkNhdWdodCBzZWN1cml0eSBleGNlcHRpb24gcmVnaXN0ZXJpbmcgZm9yIGxvY2F0aW9uIHVwZGF0ZXMgZnJvbSBzeXN0ZW0uICIgKwpAQCAtMTczLDYgKzE4MCw4IEBACiAgICAgICovCiAgICAgcHJpdmF0ZSB2b2lkIHVucmVnaXN0ZXJGcm9tTG9jYXRpb25VcGRhdGVzKCkgewogICAgICAgICBtTG9jYXRpb25NYW5hZ2VyLnJlbW92ZVVwZGF0ZXModGhpcyk7CisgICAgICAgIG1Jc05ldHdvcmtQcm92aWRlckF2YWlsYWJsZSA9IGZhbHNlOworICAgICAgICBtSXNHcHNQcm92aWRlckF2YWlsYWJsZSA9IGZhbHNlOwogICAgIH0KIAogICAgIC8qKgpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvd2Via2l0L0hUTUw1QXVkaW8uamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3dlYmtpdC9IVE1MNUF1ZGlvLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDI5Mjg4MQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3dlYmtpdC9IVE1MNUF1ZGlvLmphdmEKQEAgLTAsMCArMSwyMjQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQud2Via2l0OworCitpbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYVBsYXllcjsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhUGxheWVyLk9uQnVmZmVyaW5nVXBkYXRlTGlzdGVuZXI7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYVBsYXllci5PbkNvbXBsZXRpb25MaXN0ZW5lcjsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhUGxheWVyLk9uRXJyb3JMaXN0ZW5lcjsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhUGxheWVyLk9uUHJlcGFyZWRMaXN0ZW5lcjsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhUGxheWVyLk9uU2Vla0NvbXBsZXRlTGlzdGVuZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyOworaW1wb3J0IGFuZHJvaWQub3MuTWVzc2FnZTsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuVGltZXI7CitpbXBvcnQgamF2YS51dGlsLlRpbWVyVGFzazsKKworLyoqCisgKiA8cD5IVE1MNSBzdXBwb3J0IGNsYXNzIGZvciBBdWRpby4KKyAqLworY2xhc3MgSFRNTDVBdWRpbyBleHRlbmRzIEhhbmRsZXIKKyAgICAgICAgICAgICAgICAgaW1wbGVtZW50cyBNZWRpYVBsYXllci5PbkJ1ZmZlcmluZ1VwZGF0ZUxpc3RlbmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lZGlhUGxheWVyLk9uQ29tcGxldGlvbkxpc3RlbmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lZGlhUGxheWVyLk9uRXJyb3JMaXN0ZW5lciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZWRpYVBsYXllci5PblByZXBhcmVkTGlzdGVuZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVkaWFQbGF5ZXIuT25TZWVrQ29tcGxldGVMaXN0ZW5lciB7CisgICAgLy8gTG9nZ2luZyB0YWcuCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIExPR1RBRyA9ICJIVE1MNUF1ZGlvIjsKKworICAgIHByaXZhdGUgTWVkaWFQbGF5ZXIgbU1lZGlhUGxheWVyOworCisgICAgLy8gVGhlIEMrKyBNZWRpYVBsYXllclByaXZhdGVBbmRyb2lkIG9iamVjdC4KKyAgICBwcml2YXRlIGludCBtTmF0aXZlUG9pbnRlcjsKKworICAgIHByaXZhdGUgc3RhdGljIGludCBJRExFICAgICAgICA9ICAwOworICAgIHByaXZhdGUgc3RhdGljIGludCBJTklUSUFMSVpFRCA9ICAxOworICAgIHByaXZhdGUgc3RhdGljIGludCBQUkVQQVJFRCAgICA9ICAyOworICAgIHByaXZhdGUgc3RhdGljIGludCBTVEFSVEVEICAgICA9ICA0OworICAgIHByaXZhdGUgc3RhdGljIGludCBDT01QTEVURSAgICA9ICA1OworICAgIHByaXZhdGUgc3RhdGljIGludCBQQVVTRUQgICAgICA9ICA2OworICAgIHByaXZhdGUgc3RhdGljIGludCBTVE9QUEVEICAgICA9IC0yOworICAgIHByaXZhdGUgc3RhdGljIGludCBFUlJPUiAgICAgICA9IC0xOworCisgICAgcHJpdmF0ZSBpbnQgbVN0YXRlID0gSURMRTsKKworICAgIHByaXZhdGUgU3RyaW5nIG1Vcmw7CisgICAgcHJpdmF0ZSBib29sZWFuIG1Bc2tUb1BsYXkgPSBmYWxzZTsKKworICAgIC8vIFRpbWVyIHRocmVhZCAtPiBVSSB0aHJlYWQKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgVElNRVVQREFURSA9IDEwMDsKKworICAgIC8vIFRoZSBzcGVjIHNheXMgdGhlIHRpbWVyIHNob3VsZCBmaXJlIGV2ZXJ5IDI1MCBtcyBvciBsZXNzLgorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBUSU1FVVBEQVRFX1BFUklPRCA9IDI1MDsgIC8vIG1zCisgICAgLy8gVGhlIHRpbWVyIGZvciB0aW1ldXBhdGUgZXZlbnRzLgorICAgIC8vIFNlZSBodHRwOi8vd3d3LndoYXR3Zy5vcmcvc3BlY3Mvd2ViLWFwcHMvY3VycmVudC13b3JrLyNldmVudC1tZWRpYS10aW1ldXBkYXRlCisgICAgcHJpdmF0ZSBUaW1lciBtVGltZXI7CisgICAgcHJpdmF0ZSBmaW5hbCBjbGFzcyBUaW1ldXBkYXRlVGFzayBleHRlbmRzIFRpbWVyVGFzayB7CisgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgIEhUTUw1QXVkaW8udGhpcy5vYnRhaW5NZXNzYWdlKFRJTUVVUERBVEUpLnNlbmRUb1RhcmdldCgpOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgaGFuZGxlTWVzc2FnZShNZXNzYWdlIG1zZykgeworICAgICAgICBzd2l0Y2ggKG1zZy53aGF0KSB7CisgICAgICAgICAgICBjYXNlIFRJTUVVUERBVEU6IHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBpZiAobVN0YXRlICE9IEVSUk9SICYmIG1NZWRpYVBsYXllci5pc1BsYXlpbmcoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgaW50IHBvc2l0aW9uID0gbU1lZGlhUGxheWVyLmdldEN1cnJlbnRQb3NpdGlvbigpOworICAgICAgICAgICAgICAgICAgICAgICAgbmF0aXZlT25UaW1ldXBkYXRlKHBvc2l0aW9uLCBtTmF0aXZlUG9pbnRlcik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICBtU3RhdGUgPSBFUlJPUjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBldmVudCBsaXN0ZW5lcnMgZm9yIE1lZGlhUGxheWVyCisgICAgLy8gVGhvc2UgYXJlIGNhbGxlZCBmcm9tIHRoZSBzYW1lIHRocmVhZCB3ZSBjcmVhdGVkIHRoZSBNZWRpYVBsYXllcgorICAgIC8vIChpLmUuIHRoZSB3ZWJ2aWV3Y29yZSB0aHJlYWQgaGVyZSkKKworICAgIC8vIE1lZGlhUGxheWVyLk9uQnVmZmVyaW5nVXBkYXRlTGlzdGVuZXIKKyAgICBwdWJsaWMgdm9pZCBvbkJ1ZmZlcmluZ1VwZGF0ZShNZWRpYVBsYXllciBtcCwgaW50IHBlcmNlbnQpIHsKKyAgICAgICAgbmF0aXZlT25CdWZmZXJpbmcocGVyY2VudCwgbU5hdGl2ZVBvaW50ZXIpOworICAgIH0KKworICAgIC8vIE1lZGlhUGxheWVyLk9uQ29tcGxldGlvbkxpc3RlbmVyOworICAgIHB1YmxpYyB2b2lkIG9uQ29tcGxldGlvbihNZWRpYVBsYXllciBtcCkgeworICAgICAgICByZXNldE1lZGlhUGxheWVyKCk7CisgICAgICAgIG1TdGF0ZSA9IElETEU7CisgICAgICAgIG5hdGl2ZU9uRW5kZWQobU5hdGl2ZVBvaW50ZXIpOworICAgIH0KKworICAgIC8vIE1lZGlhUGxheWVyLk9uRXJyb3JMaXN0ZW5lcgorICAgIHB1YmxpYyBib29sZWFuIG9uRXJyb3IoTWVkaWFQbGF5ZXIgbXAsIGludCB3aGF0LCBpbnQgZXh0cmEpIHsKKyAgICAgICAgbVN0YXRlID0gRVJST1I7CisgICAgICAgIHJlc2V0TWVkaWFQbGF5ZXIoKTsKKyAgICAgICAgbVN0YXRlID0gSURMRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8vIE1lZGlhUGxheWVyLk9uUHJlcGFyZWRMaXN0ZW5lcgorICAgIHB1YmxpYyB2b2lkIG9uUHJlcGFyZWQoTWVkaWFQbGF5ZXIgbXApIHsKKyAgICAgICAgbVN0YXRlID0gUFJFUEFSRUQ7CisgICAgICAgIGlmIChtVGltZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgbVRpbWVyLnNjaGVkdWxlKG5ldyBUaW1ldXBkYXRlVGFzaygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRJTUVVUERBVEVfUEVSSU9ELCBUSU1FVVBEQVRFX1BFUklPRCk7CisgICAgICAgIH0KKyAgICAgICAgbmF0aXZlT25QcmVwYXJlZChtcC5nZXREdXJhdGlvbigpLCAwLCAwLCBtTmF0aXZlUG9pbnRlcik7CisgICAgICAgIGlmIChtQXNrVG9QbGF5KSB7CisgICAgICAgICAgICBtQXNrVG9QbGF5ID0gZmFsc2U7CisgICAgICAgICAgICBwbGF5KCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBNZWRpYVBsYXllci5PblNlZWtDb21wbGV0ZUxpc3RlbmVyCisgICAgcHVibGljIHZvaWQgb25TZWVrQ29tcGxldGUoTWVkaWFQbGF5ZXIgbXApIHsKKyAgICAgICAgbmF0aXZlT25UaW1ldXBkYXRlKG1wLmdldEN1cnJlbnRQb3NpdGlvbigpLCBtTmF0aXZlUG9pbnRlcik7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBAcGFyYW0gbmF0aXZlUHRyIGlzIHRoZSBDKysgcG9pbnRlciB0byB0aGUgTWVkaWFQbGF5ZXJQcml2YXRlIG9iamVjdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgSFRNTDVBdWRpbyhpbnQgbmF0aXZlUHRyKSB7CisgICAgICAgIC8vIFNhdmUgdGhlIG5hdGl2ZSBwdHIKKyAgICAgICAgbU5hdGl2ZVBvaW50ZXIgPSBuYXRpdmVQdHI7CisgICAgICAgIHJlc2V0TWVkaWFQbGF5ZXIoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgcmVzZXRNZWRpYVBsYXllcigpIHsKKyAgICAgICAgaWYgKG1NZWRpYVBsYXllciA9PSBudWxsKSB7CisgICAgICAgICAgICBtTWVkaWFQbGF5ZXIgPSBuZXcgTWVkaWFQbGF5ZXIoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1NZWRpYVBsYXllci5yZXNldCgpOworICAgICAgICB9CisgICAgICAgIG1NZWRpYVBsYXllci5zZXRPbkJ1ZmZlcmluZ1VwZGF0ZUxpc3RlbmVyKHRoaXMpOworICAgICAgICBtTWVkaWFQbGF5ZXIuc2V0T25Db21wbGV0aW9uTGlzdGVuZXIodGhpcyk7CisgICAgICAgIG1NZWRpYVBsYXllci5zZXRPbkVycm9yTGlzdGVuZXIodGhpcyk7CisgICAgICAgIG1NZWRpYVBsYXllci5zZXRPblByZXBhcmVkTGlzdGVuZXIodGhpcyk7CisgICAgICAgIG1NZWRpYVBsYXllci5zZXRPblNlZWtDb21wbGV0ZUxpc3RlbmVyKHRoaXMpOworCisgICAgICAgIGlmIChtVGltZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgbVRpbWVyLmNhbmNlbCgpOworICAgICAgICB9CisgICAgICAgIG1UaW1lciA9IG5ldyBUaW1lcigpOworICAgICAgICBtU3RhdGUgPSBJRExFOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBzZXREYXRhU291cmNlKFN0cmluZyB1cmwpIHsKKyAgICAgICAgbVVybCA9IHVybDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGlmIChtU3RhdGUgIT0gSURMRSkgeworICAgICAgICAgICAgICAgIHJlc2V0TWVkaWFQbGF5ZXIoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1NZWRpYVBsYXllci5zZXREYXRhU291cmNlKHVybCk7CisgICAgICAgICAgICBtU3RhdGUgPSBJTklUSUFMSVpFRDsKKyAgICAgICAgICAgIG1NZWRpYVBsYXllci5wcmVwYXJlQXN5bmMoKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgTG9nLmUoTE9HVEFHLCAiY291bGRuJ3QgbG9hZCB0aGUgcmVzb3VyY2U6ICIgKyB1cmwgKyAiIGV4YzogIiArIGUpOworICAgICAgICAgICAgcmVzZXRNZWRpYVBsYXllcigpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHBsYXkoKSB7CisgICAgICAgIGlmICgobVN0YXRlID09IEVSUk9SIHx8IG1TdGF0ZSA9PSBJRExFKSAmJiBtVXJsICE9IG51bGwpIHsKKyAgICAgICAgICAgIHJlc2V0TWVkaWFQbGF5ZXIoKTsKKyAgICAgICAgICAgIHNldERhdGFTb3VyY2UobVVybCk7CisgICAgICAgICAgICBtQXNrVG9QbGF5ID0gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChtU3RhdGUgPj0gUFJFUEFSRUQpIHsKKyAgICAgICAgICAgIG1NZWRpYVBsYXllci5zdGFydCgpOworICAgICAgICAgICAgbVN0YXRlID0gU1RBUlRFRDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBwYXVzZSgpIHsKKyAgICAgICAgaWYgKG1TdGF0ZSA9PSBTVEFSVEVEKSB7CisgICAgICAgICAgICBpZiAobVRpbWVyICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBtVGltZXIucHVyZ2UoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1NZWRpYVBsYXllci5wYXVzZSgpOworICAgICAgICAgICAgbVN0YXRlID0gUEFVU0VEOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHNlZWsoaW50IG1zZWMpIHsKKyAgICAgICAgaWYgKG1TdGF0ZSA+PSBQUkVQQVJFRCkgeworICAgICAgICAgICAgbU1lZGlhUGxheWVyLnNlZWtUbyhtc2VjKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCB0ZWFyZG93bigpIHsKKyAgICAgICAgbU1lZGlhUGxheWVyLnJlbGVhc2UoKTsKKyAgICAgICAgbVN0YXRlID0gRVJST1I7CisgICAgICAgIG1OYXRpdmVQb2ludGVyID0gMDsKKyAgICB9CisKKyAgICBwcml2YXRlIGZsb2F0IGdldE1heFRpbWVTZWVrYWJsZSgpIHsKKyAgICAgICAgcmV0dXJuIG1NZWRpYVBsYXllci5nZXREdXJhdGlvbigpIC8gMTAwMC4wZjsKKyAgICB9CisKKyAgICBwcml2YXRlIG5hdGl2ZSB2b2lkIG5hdGl2ZU9uQnVmZmVyaW5nKGludCBwZXJjZW50LCBpbnQgbmF0aXZlUG9pbnRlcik7CisgICAgcHJpdmF0ZSBuYXRpdmUgdm9pZCBuYXRpdmVPbkVuZGVkKGludCBuYXRpdmVQb2ludGVyKTsKKyAgICBwcml2YXRlIG5hdGl2ZSB2b2lkIG5hdGl2ZU9uUHJlcGFyZWQoaW50IGR1cmF0aW9uLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBuYXRpdmVQb2ludGVyKTsKKyAgICBwcml2YXRlIG5hdGl2ZSB2b2lkIG5hdGl2ZU9uVGltZXVwZGF0ZShpbnQgcG9zaXRpb24sIGludCBuYXRpdmVQb2ludGVyKTsKK30KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3dlYmtpdC9KV2ViQ29yZUphdmFCcmlkZ2UuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3dlYmtpdC9KV2ViQ29yZUphdmFCcmlkZ2UuamF2YQppbmRleCAxZjhkNTNmLi45MDg1MjZmIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC93ZWJraXQvSldlYkNvcmVKYXZhQnJpZGdlLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvd2Via2l0L0pXZWJDb3JlSmF2YUJyaWRnZS5qYXZhCkBAIC0xNiw2ICsxNiw3IEBACiAKIHBhY2thZ2UgYW5kcm9pZC53ZWJraXQ7CiAKK2ltcG9ydCBhbmRyb2lkLm5ldC5Vcmk7CiBpbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyOwogaW1wb3J0IGFuZHJvaWQub3MuTWVzc2FnZTsKIGltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwpAQCAtNTIsMTIgKzUzLDE1IEBACiAgICAgLyogcGFja2FnZSAqLwogICAgIHN0YXRpYyBmaW5hbCBpbnQgUkVGUkVTSF9QTFVHSU5TID0gMTAwOwogCisgICAgcHJpdmF0ZSBIYXNoTWFwPFN0cmluZywgU3RyaW5nPiBtQ29udGVudFVyaVRvRmlsZVBhdGhNYXA7CisKICAgICAvKioKICAgICAgKiBDb25zdHJ1Y3QgYSBuZXcgSldlYkNvcmVKYXZhQnJpZGdlIHRvIGludGVyZmFjZSB3aXRoCiAgICAgICogV2ViQ29yZSB0aW1lcnMgYW5kIGNvb2tpZXMuCiAgICAgICovCiAgICAgcHVibGljIEpXZWJDb3JlSmF2YUJyaWRnZSgpIHsKICAgICAgICAgbmF0aXZlQ29uc3RydWN0b3IoKTsKKwogICAgIH0KIAogICAgIEBPdmVycmlkZQpAQCAtMjcxLDYgKzI3NSwyOCBAQAogICAgICAgICB9CiAgICAgfQogCisgICAgLy8gQ2FsbGVkIG9uIHRoZSBXZWJDb3JlIHRocmVhZCB0aHJvdWdoIEpOSS4KKyAgICBwcml2YXRlIFN0cmluZyByZXNvbHZlRmlsZVBhdGhGb3JDb250ZW50VXJpKFN0cmluZyB1cmkpIHsKKyAgICAgICAgaWYgKG1Db250ZW50VXJpVG9GaWxlUGF0aE1hcCAhPSBudWxsKSB7CisgICAgICAgICAgICBTdHJpbmcgZmlsZU5hbWUgPSBtQ29udGVudFVyaVRvRmlsZVBhdGhNYXAuZ2V0KHVyaSk7CisgICAgICAgICAgICBpZiAoZmlsZU5hbWUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHJldHVybiBmaWxlTmFtZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIEZhaWxzYWZlIGZhbGxiYWNrIHRvIGp1c3QgdXNlIHRoZSBsYXN0IHBhdGggc2VnbWVudC4KKyAgICAgICAgLy8gKFNlZSBPcGVuYWJsZUNvbHVtbnMgZG9jdW1lbnRhdGlvbiBpbiB0aGUgU0RLKQorICAgICAgICBVcmkgalVyaSA9IFVyaS5wYXJzZSh1cmkpOworICAgICAgICByZXR1cm4galVyaS5nZXRMYXN0UGF0aFNlZ21lbnQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzdG9yZUZpbGVQYXRoRm9yQ29udGVudFVyaShTdHJpbmcgcGF0aCwgU3RyaW5nIGNvbnRlbnRVcmkpIHsKKyAgICAgICAgaWYgKG1Db250ZW50VXJpVG9GaWxlUGF0aE1hcCA9PSBudWxsKSB7CisgICAgICAgICAgICBtQ29udGVudFVyaVRvRmlsZVBhdGhNYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKTsKKyAgICAgICAgfQorICAgICAgICBtQ29udGVudFVyaVRvRmlsZVBhdGhNYXAucHV0KGNvbnRlbnRVcmksIHBhdGgpOworICAgIH0KKwogICAgIHByaXZhdGUgbmF0aXZlIHZvaWQgbmF0aXZlQ29uc3RydWN0b3IoKTsKICAgICBwcml2YXRlIG5hdGl2ZSB2b2lkIG5hdGl2ZUZpbmFsaXplKCk7CiAgICAgcHJpdmF0ZSBuYXRpdmUgdm9pZCBzaGFyZWRUaW1lckZpcmVkKCk7CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC93ZWJraXQvTG9hZExpc3RlbmVyLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC93ZWJraXQvTG9hZExpc3RlbmVyLmphdmEKaW5kZXggZTZmYTQwNS4uNWIyNTZmMiAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvd2Via2l0L0xvYWRMaXN0ZW5lci5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3dlYmtpdC9Mb2FkTGlzdGVuZXIuamF2YQpAQCAtMTEwLDYgKzExMCw3IEBACiAgICAgcHJpdmF0ZSBSZXF1ZXN0SGFuZGxlIG1SZXF1ZXN0SGFuZGxlOwogICAgIHByaXZhdGUgUmVxdWVzdEhhbmRsZSBtU3NsRXJyb3JSZXF1ZXN0SGFuZGxlOwogICAgIHByaXZhdGUgbG9uZyAgICAgbVBvc3RJZGVudGlmaWVyOworICAgIHByaXZhdGUgYm9vbGVhbiAgbVNldE5hdGl2ZVJlc3BvbnNlOwogCiAgICAgLy8gUmVxdWVzdCBkYXRhLiBJdCBpcyBvbmx5IHZhbGlkIHdoZW4gd2UgYXJlIGRvaW5nIGEgbG9hZCBmcm9tIHRoZQogICAgIC8vIGNhY2hlLiBJdCBpcyBuZWVkZWQgaWYgdGhlIGNhY2hlIHJldHVybnMgYSByZWRpcmVjdApAQCAtMTgxLDYgKzE4Miw3IEBACiAgICAgcHJpdmF0ZSB2b2lkIGNsZWFyTmF0aXZlTG9hZGVyKCkgewogICAgICAgICBzTmF0aXZlTG9hZGVyQ291bnQgLT0gMTsKICAgICAgICAgbU5hdGl2ZUxvYWRlciA9IDA7CisgICAgICAgIG1TZXROYXRpdmVSZXNwb25zZSA9IGZhbHNlOwogICAgIH0KIAogICAgIC8qCkBAIC0xMDg2LDEzICsxMDg4LDE4IEBACiAgICAgICAgIC8vIHJlcXVlc3Qgd2l0aCBzb21lIGNyZWRlbnRpYWxzIHRoZW4gZG9uJ3QgY29tbWl0IHRoZSBoZWFkZXJzCiAgICAgICAgIC8vIG9mIHRoaXMgcmVzcG9uc2U7IHdhaXQgZm9yIHRoZSByZXNwb25zZSB0byB0aGUgcmVxdWVzdCB3aXRoIHRoZQogICAgICAgICAvLyBjcmVkZW50aWFscy4KLSAgICAgICAgaWYgKG1BdXRoSGVhZGVyICE9IG51bGwpCisgICAgICAgIGlmIChtQXV0aEhlYWRlciAhPSBudWxsKSB7CiAgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KIAotICAgICAgICAvLyBDb21taXQgdGhlIGhlYWRlcnMgdG8gV2ViQ29yZQorICAgICAgICBzZXROYXRpdmVSZXNwb25zZSgpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBzZXROYXRpdmVSZXNwb25zZSgpIHsKICAgICAgICAgaW50IG5hdGl2ZVJlc3BvbnNlID0gY3JlYXRlTmF0aXZlUmVzcG9uc2UoKTsKICAgICAgICAgLy8gVGhlIG5hdGl2ZSBjb2RlIGRlbGV0ZXMgdGhlIG5hdGl2ZSByZXNwb25zZSBvYmplY3QuCiAgICAgICAgIG5hdGl2ZVJlY2VpdmVkUmVzcG9uc2UobmF0aXZlUmVzcG9uc2UpOworICAgICAgICBtU2V0TmF0aXZlUmVzcG9uc2UgPSB0cnVlOwogICAgIH0KIAogICAgIC8qKgpAQCAtMTEyNyw2ICsxMTM0LDkgQEAKICAgICAgKi8KICAgICBwcml2YXRlIHZvaWQgY29tbWl0TG9hZCgpIHsKICAgICAgICAgaWYgKG1DYW5jZWxsZWQpIHJldHVybjsKKyAgICAgICAgaWYgKCFtU2V0TmF0aXZlUmVzcG9uc2UpIHsKKyAgICAgICAgICAgIHNldE5hdGl2ZVJlc3BvbnNlKCk7CisgICAgICAgIH0KIAogICAgICAgICBpZiAobUlzTWFpblBhZ2VMb2FkZXIpIHsKICAgICAgICAgICAgIFN0cmluZyB0eXBlID0gc0NlcnRpZmljYXRlVHlwZU1hcC5nZXQobU1pbWVUeXBlKTsKQEAgLTExOTcsNiArMTIwNywxMCBAQAogICAgICAgICB9CiAgICAgICAgIGlmIChtTmF0aXZlTG9hZGVyICE9IDApIHsKICAgICAgICAgICAgIFBlcmZDaGVja2VyIGNoZWNrZXIgPSBuZXcgUGVyZkNoZWNrZXIoKTsKKyAgICAgICAgICAgIGlmICghbVNldE5hdGl2ZVJlc3BvbnNlKSB7CisgICAgICAgICAgICAgICAgc2V0TmF0aXZlUmVzcG9uc2UoKTsKKyAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgbmF0aXZlRmluaXNoZWQoKTsKICAgICAgICAgICAgIGNoZWNrZXIucmVzcG9uc2VBbGVydCgicmVzIG5hdGl2ZUZpbmlzaGVkIik7CiAgICAgICAgICAgICBjbGVhck5hdGl2ZUxvYWRlcigpOwpAQCAtMTMxMiw2ICsxMzI2LDkgQEAKICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgdGV4dCA9IG1Db250ZXh0CiAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0U3RyaW5nKFIuc3RyaW5nLm9wZW5fcGVybWlzc2lvbl9kZW55KQogICAgICAgICAgICAgICAgICAgICAgICAgKyAiXG4iICsgcmVkaXJlY3RUbzsKKyAgICAgICAgICAgICAgICBpZiAoIW1TZXROYXRpdmVSZXNwb25zZSkgeworICAgICAgICAgICAgICAgICAgICBzZXROYXRpdmVSZXNwb25zZSgpOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBuYXRpdmVBZGREYXRhKHRleHQuZ2V0Qnl0ZXMoKSwgdGV4dC5sZW5ndGgoKSk7CiAgICAgICAgICAgICAgICAgbmF0aXZlRmluaXNoZWQoKTsKICAgICAgICAgICAgICAgICBjbGVhck5hdGl2ZUxvYWRlcigpOwpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvd2Via2l0L01pbWVUeXBlTWFwLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC93ZWJraXQvTWltZVR5cGVNYXAuamF2YQppbmRleCBjMWFjMTgwLi5mMDAwMDViIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC93ZWJraXQvTWltZVR5cGVNYXAuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC93ZWJraXQvTWltZVR5cGVNYXAuamF2YQpAQCAtMTYsMzUgKzE2LDIyIEBACiAKIHBhY2thZ2UgYW5kcm9pZC53ZWJraXQ7CiAKK2ltcG9ydCBhbmRyb2lkLnRleHQuVGV4dFV0aWxzOwogaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwogaW1wb3J0IGphdmEudXRpbC5yZWdleC5QYXR0ZXJuOworaW1wb3J0IGxpYmNvcmUubmV0Lk1pbWVVdGlsczsKIAogLyoqCiAgKiBUd28td2F5IG1hcCB0aGF0IG1hcHMgTUlNRS10eXBlcyB0byBmaWxlIGV4dGVuc2lvbnMgYW5kIHZpY2UgdmVyc2EuCisgKgorICogPHA+U2VlIGFsc28ge0BsaW5rIGphdmEubmV0LlVSTENvbm5lY3Rpb24jZ3Vlc3NDb250ZW50VHlwZUZyb21OYW1lfQorICogYW5kIHtAbGluayBqYXZhLm5ldC5VUkxDb25uZWN0aW9uI2d1ZXNzQ29udGVudFR5cGVGcm9tU3RyZWFtfS4gVGhpcworICogY2xhc3MgYW5kIHtAY29kZSBVUkxDb25uZWN0aW9ufSBzaGFyZSB0aGUgc2FtZSBNSU1FLXR5cGUgZGF0YWJhc2UuCiAgKi8KIHB1YmxpYyBjbGFzcyBNaW1lVHlwZU1hcCB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTWltZVR5cGVNYXAgc01pbWVUeXBlTWFwID0gbmV3IE1pbWVUeXBlTWFwKCk7CiAKLSAgICAvKioKLSAgICAgKiBTaW5nbGV0b24gTUlNRS10eXBlIG1hcCBpbnN0YW5jZToKLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBNaW1lVHlwZU1hcCBzTWltZVR5cGVNYXA7Ci0KLSAgICAvKioKLSAgICAgKiBNSU1FLXR5cGUgdG8gZmlsZSBleHRlbnNpb24gbWFwcGluZzoKLSAgICAgKi8KLSAgICBwcml2YXRlIEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+IG1NaW1lVHlwZVRvRXh0ZW5zaW9uTWFwOwotCi0gICAgLyoqCi0gICAgICogRmlsZSBleHRlbnNpb24gdG8gTUlNRSB0eXBlIG1hcHBpbmc6Ci0gICAgICovCi0gICAgcHJpdmF0ZSBIYXNoTWFwPFN0cmluZywgU3RyaW5nPiBtRXh0ZW5zaW9uVG9NaW1lVHlwZU1hcDsKLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBuZXcgTUlNRS10eXBlIG1hcC4KLSAgICAgKi8KICAgICBwcml2YXRlIE1pbWVUeXBlTWFwKCkgewotICAgICAgICBtTWltZVR5cGVUb0V4dGVuc2lvbk1hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPigpOwotICAgICAgICBtRXh0ZW5zaW9uVG9NaW1lVHlwZU1hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPigpOwogICAgIH0KIAogICAgIC8qKgpAQCAtNTUsNyArNDIsNyBAQAogICAgICAqIEByZXR1cm4gVGhlIGZpbGUgZXh0ZW5zaW9uIG9mIHRoZSBnaXZlbiB1cmwuCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0RmlsZUV4dGVuc2lvbkZyb21VcmwoU3RyaW5nIHVybCkgewotICAgICAgICBpZiAodXJsICE9IG51bGwgJiYgdXJsLmxlbmd0aCgpID4gMCkgeworICAgICAgICBpZiAoIVRleHRVdGlscy5pc0VtcHR5KHVybCkpIHsKICAgICAgICAgICAgIGludCBxdWVyeSA9IHVybC5sYXN0SW5kZXhPZignPycpOwogICAgICAgICAgICAgaWYgKHF1ZXJ5ID4gMCkgewogICAgICAgICAgICAgICAgIHVybCA9IHVybC5zdWJzdHJpbmcoMCwgcXVlcnkpOwpAQCAtNjYsNyArNTMsNyBAQAogCiAgICAgICAgICAgICAvLyBpZiB0aGUgZmlsZW5hbWUgY29udGFpbnMgc3BlY2lhbCBjaGFyYWN0ZXJzLCB3ZSBkb24ndAogICAgICAgICAgICAgLy8gY29uc2lkZXIgaXQgdmFsaWQgZm9yIG91ciBtYXRjaGluZyBwdXJwb3NlczoKLSAgICAgICAgICAgIGlmIChmaWxlbmFtZS5sZW5ndGgoKSA+IDAgJiYKKyAgICAgICAgICAgIGlmICghZmlsZW5hbWUuaXNFbXB0eSgpICYmCiAgICAgICAgICAgICAgICAgUGF0dGVybi5tYXRjaGVzKCJbYS16QS1aXzAtOVxcLlxcLVxcKFxcKVxcJV0rIiwgZmlsZW5hbWUpKSB7CiAgICAgICAgICAgICAgICAgaW50IGRvdFBvcyA9IGZpbGVuYW1lLmxhc3RJbmRleE9mKCcuJyk7CiAgICAgICAgICAgICAgICAgaWYgKDAgPD0gZG90UG9zKSB7CkBAIC03OSwzNiArNjYsMTIgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBMb2FkIGFuIGVudHJ5IGludG8gdGhlIG1hcC4gVGhpcyBkb2VzIG5vdCBjaGVjayBpZiB0aGUgaXRlbSBhbHJlYWR5Ci0gICAgICogZXhpc3RzLCBpdCB0cnVzdHMgdGhlIGNhbGxlciEKLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgbG9hZEVudHJ5KFN0cmluZyBtaW1lVHlwZSwgU3RyaW5nIGV4dGVuc2lvbikgewotICAgICAgICAvLwotICAgICAgICAvLyBpZiB3ZSBoYXZlIGFuIGV4aXN0aW5nIHggLS0+IHkgbWFwcGluZywgd2UgZG8gbm90IHdhbnQgdG8KLSAgICAgICAgLy8gb3ZlcnJpZGUgaXQgd2l0aCBhbm90aGVyIG1hcHBpbmcgeCAtLT4gPwotICAgICAgICAvLyB0aGlzIGlzIG1vc3RseSBiZWNhdXNlIG9mIHRoZSB3YXkgdGhlIG1pbWUtdHlwZSBtYXAgYmVsb3cKLSAgICAgICAgLy8gaXMgY29uc3RydWN0ZWQgKGlmIGEgbWltZSB0eXBlIG1hcHMgdG8gc2V2ZXJhbCBleHRlbnNpb25zCi0gICAgICAgIC8vIHRoZSBmaXJzdCBleHRlbnNpb24gaXMgY29uc2lkZXJlZCB0aGUgbW9zdCBwb3B1bGFyIGFuZCBpcwotICAgICAgICAvLyBhZGRlZCBmaXJzdDsgd2UgZG8gbm90IHdhbnQgdG8gb3ZlcndyaXRlIGl0IGxhdGVyKS4KLSAgICAgICAgLy8KLSAgICAgICAgaWYgKCFtTWltZVR5cGVUb0V4dGVuc2lvbk1hcC5jb250YWluc0tleShtaW1lVHlwZSkpIHsKLSAgICAgICAgICAgIG1NaW1lVHlwZVRvRXh0ZW5zaW9uTWFwLnB1dChtaW1lVHlwZSwgZXh0ZW5zaW9uKTsKLSAgICAgICAgfQotCi0gICAgICAgIG1FeHRlbnNpb25Ub01pbWVUeXBlTWFwLnB1dChleHRlbnNpb24sIG1pbWVUeXBlKTsKLSAgICB9Ci0KLSAgICAvKioKICAgICAgKiBSZXR1cm4gdHJ1ZSBpZiB0aGUgZ2l2ZW4gTUlNRSB0eXBlIGhhcyBhbiBlbnRyeSBpbiB0aGUgbWFwLgogICAgICAqIEBwYXJhbSBtaW1lVHlwZSBBIE1JTUUgdHlwZSAoaS5lLiB0ZXh0L3BsYWluKQogICAgICAqIEByZXR1cm4gVHJ1ZSBpZmYgdGhlcmUgaXMgYSBtaW1lVHlwZSBlbnRyeSBpbiB0aGUgbWFwLgogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIGhhc01pbWVUeXBlKFN0cmluZyBtaW1lVHlwZSkgewotICAgICAgICBpZiAobWltZVR5cGUgIT0gbnVsbCAmJiBtaW1lVHlwZS5sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICAgIHJldHVybiBtTWltZVR5cGVUb0V4dGVuc2lvbk1hcC5jb250YWluc0tleShtaW1lVHlwZSk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiBNaW1lVXRpbHMuaGFzTWltZVR5cGUobWltZVR5cGUpOwogICAgIH0KIAogICAgIC8qKgpAQCAtMTE3LDE2ICs4MCwxMiBAQAogICAgICAqIEByZXR1cm4gVGhlIE1JTUUgdHlwZSBmb3IgdGhlIGdpdmVuIGV4dGVuc2lvbiBvciBudWxsIGlmZiB0aGVyZSBpcyBub25lLgogICAgICAqLwogICAgIHB1YmxpYyBTdHJpbmcgZ2V0TWltZVR5cGVGcm9tRXh0ZW5zaW9uKFN0cmluZyBleHRlbnNpb24pIHsKLSAgICAgICAgaWYgKGV4dGVuc2lvbiAhPSBudWxsICYmIGV4dGVuc2lvbi5sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICAgIHJldHVybiBtRXh0ZW5zaW9uVG9NaW1lVHlwZU1hcC5nZXQoZXh0ZW5zaW9uKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBudWxsOworICAgICAgICByZXR1cm4gTWltZVV0aWxzLmd1ZXNzTWltZVR5cGVGcm9tRXh0ZW5zaW9uKGV4dGVuc2lvbik7CiAgICAgfQogCiAgICAgLy8gU3RhdGljIG1ldGhvZCBjYWxsZWQgYnkgam5pLgogICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBtaW1lVHlwZUZyb21FeHRlbnNpb24oU3RyaW5nIGV4dGVuc2lvbikgewotICAgICAgICByZXR1cm4gZ2V0U2luZ2xldG9uKCkuZ2V0TWltZVR5cGVGcm9tRXh0ZW5zaW9uKGV4dGVuc2lvbik7CisgICAgICAgIHJldHVybiBNaW1lVXRpbHMuZ3Vlc3NNaW1lVHlwZUZyb21FeHRlbnNpb24oZXh0ZW5zaW9uKTsKICAgICB9CiAKICAgICAvKioKQEAgLTEzNSwxMCArOTQsNyBAQAogICAgICAqIEByZXR1cm4gVHJ1ZSBpZmYgdGhlcmUgaXMgYW4gZXh0ZW5zaW9uIGVudHJ5IGluIHRoZSBtYXAuCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gaGFzRXh0ZW5zaW9uKFN0cmluZyBleHRlbnNpb24pIHsKLSAgICAgICAgaWYgKGV4dGVuc2lvbiAhPSBudWxsICYmIGV4dGVuc2lvbi5sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICAgIHJldHVybiBtRXh0ZW5zaW9uVG9NaW1lVHlwZU1hcC5jb250YWluc0tleShleHRlbnNpb24pOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIE1pbWVVdGlscy5oYXNFeHRlbnNpb24oZXh0ZW5zaW9uKTsKICAgICB9CiAKICAgICAvKioKQEAgLTE0OSwxMSArMTA1LDcgQEAKICAgICAgKiBAcmV0dXJuIFRoZSBleHRlbnNpb24gZm9yIHRoZSBnaXZlbiBNSU1FIHR5cGUgb3IgbnVsbCBpZmYgdGhlcmUgaXMgbm9uZS4KICAgICAgKi8KICAgICBwdWJsaWMgU3RyaW5nIGdldEV4dGVuc2lvbkZyb21NaW1lVHlwZShTdHJpbmcgbWltZVR5cGUpIHsKLSAgICAgICAgaWYgKG1pbWVUeXBlICE9IG51bGwgJiYgbWltZVR5cGUubGVuZ3RoKCkgPiAwKSB7Ci0gICAgICAgICAgICByZXR1cm4gbU1pbWVUeXBlVG9FeHRlbnNpb25NYXAuZ2V0KG1pbWVUeXBlKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBudWxsOworICAgICAgICByZXR1cm4gTWltZVV0aWxzLmd1ZXNzRXh0ZW5zaW9uRnJvbU1pbWVUeXBlKG1pbWVUeXBlKTsKICAgICB9CiAKICAgICAvKioKQEAgLTE2MSwzNjMgKzExMyw2IEBACiAgICAgICogQHJldHVybiBUaGUgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoZSBNSU1FLXR5cGUgbWFwLgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgTWltZVR5cGVNYXAgZ2V0U2luZ2xldG9uKCkgewotICAgICAgICBpZiAoc01pbWVUeXBlTWFwID09IG51bGwpIHsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcCA9IG5ldyBNaW1lVHlwZU1hcCgpOwotCi0gICAgICAgICAgICAvLyBUaGUgZm9sbG93aW5nIHRhYmxlIGlzIGJhc2VkIG9uIC9ldGMvbWltZS50eXBlcyBkYXRhIG1pbnVzCi0gICAgICAgICAgICAvLyBjaGVtaWNhbC8qIE1JTUUgdHlwZXMgYW5kIE1JTUUgdHlwZXMgdGhhdCBkb24ndCBtYXAgdG8gYW55Ci0gICAgICAgICAgICAvLyBmaWxlIGV4dGVuc2lvbnMuIFdlIGFsc28gZXhjbHVkZSB0b3AtbGV2ZWwgZG9tYWluIG5hbWVzIHRvCi0gICAgICAgICAgICAvLyBkZWFsIHdpdGggY2FzZXMgbGlrZToKLSAgICAgICAgICAgIC8vCi0gICAgICAgICAgICAvLyBtYWlsLmdvb2dsZS5jb20vYS9nb29nbGUuY29tCi0gICAgICAgICAgICAvLwotICAgICAgICAgICAgLy8gYW5kICJhY3RpdmUiIE1JTUUgdHlwZXMgKGR1ZSB0byBwb3RlbnRpYWwgc2VjdXJpdHkgaXNzdWVzKS4KLQotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXBwbGljYXRpb24vYW5kcmV3LWluc2V0IiwgImV6Iik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhcHBsaWNhdGlvbi9kc3B0eXBlIiwgInRzcCIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXBwbGljYXRpb24vZnV0dXJlc3BsYXNoIiwgInNwbCIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXBwbGljYXRpb24vaHRhIiwgImh0YSIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXBwbGljYXRpb24vbWFjLWJpbmhleDQwIiwgImhxeCIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXBwbGljYXRpb24vbWFjLWNvbXBhY3Rwcm8iLCAiY3B0Iik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhcHBsaWNhdGlvbi9tYXRoZW1hdGljYSIsICJuYiIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXBwbGljYXRpb24vbXNhY2Nlc3MiLCAibWRiIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhcHBsaWNhdGlvbi9vZGEiLCAib2RhIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhcHBsaWNhdGlvbi9vZ2ciLCAib2dnIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhcHBsaWNhdGlvbi9wZGYiLCAicGRmIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhcHBsaWNhdGlvbi9wZ3Ata2V5cyIsICJrZXkiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImFwcGxpY2F0aW9uL3BncC1zaWduYXR1cmUiLCAicGdwIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhcHBsaWNhdGlvbi9waWNzLXJ1bGVzIiwgInByZiIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXBwbGljYXRpb24vcmFyIiwgInJhciIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXBwbGljYXRpb24vcmRmK3htbCIsICJyZGYiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImFwcGxpY2F0aW9uL3Jzcyt4bWwiLCAicnNzIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhcHBsaWNhdGlvbi96aXAiLCAiemlwIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhcHBsaWNhdGlvbi92bmQuYW5kcm9pZC5wYWNrYWdlLWFyY2hpdmUiLCAKLSAgICAgICAgICAgICAgICAgICAgImFwayIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXBwbGljYXRpb24vdm5kLmNpbmRlcmVsbGEiLCAiY2R5Iik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhcHBsaWNhdGlvbi92bmQubXMtcGtpLnN0bCIsICJzdGwiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoCi0gICAgICAgICAgICAgICAgICAgICJhcHBsaWNhdGlvbi92bmQub2FzaXMub3BlbmRvY3VtZW50LmRhdGFiYXNlIiwgIm9kYiIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgKLSAgICAgICAgICAgICAgICAgICAgImFwcGxpY2F0aW9uL3ZuZC5vYXNpcy5vcGVuZG9jdW1lbnQuZm9ybXVsYSIsICJvZGYiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoCi0gICAgICAgICAgICAgICAgICAgICJhcHBsaWNhdGlvbi92bmQub2FzaXMub3BlbmRvY3VtZW50LmdyYXBoaWNzIiwgIm9kZyIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgKLSAgICAgICAgICAgICAgICAgICAgImFwcGxpY2F0aW9uL3ZuZC5vYXNpcy5vcGVuZG9jdW1lbnQuZ3JhcGhpY3MtdGVtcGxhdGUiLAotICAgICAgICAgICAgICAgICAgICAib3RnIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KAotICAgICAgICAgICAgICAgICAgICAiYXBwbGljYXRpb24vdm5kLm9hc2lzLm9wZW5kb2N1bWVudC5pbWFnZSIsICJvZGkiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoCi0gICAgICAgICAgICAgICAgICAgICJhcHBsaWNhdGlvbi92bmQub2FzaXMub3BlbmRvY3VtZW50LnNwcmVhZHNoZWV0IiwgIm9kcyIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgKLSAgICAgICAgICAgICAgICAgICAgImFwcGxpY2F0aW9uL3ZuZC5vYXNpcy5vcGVuZG9jdW1lbnQuc3ByZWFkc2hlZXQtdGVtcGxhdGUiLAotICAgICAgICAgICAgICAgICAgICAib3RzIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KAotICAgICAgICAgICAgICAgICAgICAiYXBwbGljYXRpb24vdm5kLm9hc2lzLm9wZW5kb2N1bWVudC50ZXh0IiwgIm9kdCIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgKLSAgICAgICAgICAgICAgICAgICAgImFwcGxpY2F0aW9uL3ZuZC5vYXNpcy5vcGVuZG9jdW1lbnQudGV4dC1tYXN0ZXIiLCAib2RtIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KAotICAgICAgICAgICAgICAgICAgICAiYXBwbGljYXRpb24vdm5kLm9hc2lzLm9wZW5kb2N1bWVudC50ZXh0LXRlbXBsYXRlIiwgIm90dCIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgKLSAgICAgICAgICAgICAgICAgICAgImFwcGxpY2F0aW9uL3ZuZC5vYXNpcy5vcGVuZG9jdW1lbnQudGV4dC13ZWIiLCAib3RoIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhcHBsaWNhdGlvbi9tc3dvcmQiLCAiZG9jIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhcHBsaWNhdGlvbi9tc3dvcmQiLCAiZG90Iik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KAotICAgICAgICAgICAgICAgICAgICAiYXBwbGljYXRpb24vdm5kLm9wZW54bWxmb3JtYXRzLW9mZmljZWRvY3VtZW50LndvcmRwcm9jZXNzaW5nbWwuZG9jdW1lbnQiLAotICAgICAgICAgICAgICAgICAgICAiZG9jeCIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgKLSAgICAgICAgICAgICAgICAgICAgImFwcGxpY2F0aW9uL3ZuZC5vcGVueG1sZm9ybWF0cy1vZmZpY2Vkb2N1bWVudC53b3JkcHJvY2Vzc2luZ21sLnRlbXBsYXRlIiwKLSAgICAgICAgICAgICAgICAgICAgImRvdHgiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImFwcGxpY2F0aW9uL3ZuZC5tcy1leGNlbCIsICJ4bHMiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImFwcGxpY2F0aW9uL3ZuZC5tcy1leGNlbCIsICJ4bHQiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoCi0gICAgICAgICAgICAgICAgICAgICJhcHBsaWNhdGlvbi92bmQub3BlbnhtbGZvcm1hdHMtb2ZmaWNlZG9jdW1lbnQuc3ByZWFkc2hlZXRtbC5zaGVldCIsCi0gICAgICAgICAgICAgICAgICAgICJ4bHN4Iik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KAotICAgICAgICAgICAgICAgICAgICAiYXBwbGljYXRpb24vdm5kLm9wZW54bWxmb3JtYXRzLW9mZmljZWRvY3VtZW50LnNwcmVhZHNoZWV0bWwudGVtcGxhdGUiLAotICAgICAgICAgICAgICAgICAgICAieGx0eCIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXBwbGljYXRpb24vdm5kLm1zLXBvd2VycG9pbnQiLCAicHB0Iik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhcHBsaWNhdGlvbi92bmQubXMtcG93ZXJwb2ludCIsICJwb3QiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImFwcGxpY2F0aW9uL3ZuZC5tcy1wb3dlcnBvaW50IiwgInBwcyIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgKLSAgICAgICAgICAgICAgICAgICAgImFwcGxpY2F0aW9uL3ZuZC5vcGVueG1sZm9ybWF0cy1vZmZpY2Vkb2N1bWVudC5wcmVzZW50YXRpb25tbC5wcmVzZW50YXRpb24iLAotICAgICAgICAgICAgICAgICAgICAicHB0eCIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgKLSAgICAgICAgICAgICAgICAgICAgImFwcGxpY2F0aW9uL3ZuZC5vcGVueG1sZm9ybWF0cy1vZmZpY2Vkb2N1bWVudC5wcmVzZW50YXRpb25tbC50ZW1wbGF0ZSIsCi0gICAgICAgICAgICAgICAgICAgICJwb3R4Iik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KAotICAgICAgICAgICAgICAgICAgICAiYXBwbGljYXRpb24vdm5kLm9wZW54bWxmb3JtYXRzLW9mZmljZWRvY3VtZW50LnByZXNlbnRhdGlvbm1sLnNsaWRlc2hvdyIsCi0gICAgICAgICAgICAgICAgICAgICJwcHN4Iik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhcHBsaWNhdGlvbi92bmQucmltLmNvZCIsICJjb2QiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImFwcGxpY2F0aW9uL3ZuZC5zbWFmIiwgIm1tZiIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXBwbGljYXRpb24vdm5kLnN0YXJkaXZpc2lvbi5jYWxjIiwgInNkYyIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXBwbGljYXRpb24vdm5kLnN0YXJkaXZpc2lvbi5kcmF3IiwgInNkYSIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgKLSAgICAgICAgICAgICAgICAgICAgImFwcGxpY2F0aW9uL3ZuZC5zdGFyZGl2aXNpb24uaW1wcmVzcyIsICJzZGQiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoCi0gICAgICAgICAgICAgICAgICAgICJhcHBsaWNhdGlvbi92bmQuc3RhcmRpdmlzaW9uLmltcHJlc3MiLCAic2RwIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhcHBsaWNhdGlvbi92bmQuc3RhcmRpdmlzaW9uLm1hdGgiLCAic21mIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhcHBsaWNhdGlvbi92bmQuc3RhcmRpdmlzaW9uLndyaXRlciIsCi0gICAgICAgICAgICAgICAgICAgICJzZHciKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImFwcGxpY2F0aW9uL3ZuZC5zdGFyZGl2aXNpb24ud3JpdGVyIiwKLSAgICAgICAgICAgICAgICAgICAgInZvciIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgKLSAgICAgICAgICAgICAgICAgICAgImFwcGxpY2F0aW9uL3ZuZC5zdGFyZGl2aXNpb24ud3JpdGVyLWdsb2JhbCIsICJzZ2wiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImFwcGxpY2F0aW9uL3ZuZC5zdW4ueG1sLmNhbGMiLCAic3hjIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KAotICAgICAgICAgICAgICAgICAgICAiYXBwbGljYXRpb24vdm5kLnN1bi54bWwuY2FsYy50ZW1wbGF0ZSIsICJzdGMiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImFwcGxpY2F0aW9uL3ZuZC5zdW4ueG1sLmRyYXciLCAic3hkIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KAotICAgICAgICAgICAgICAgICAgICAiYXBwbGljYXRpb24vdm5kLnN1bi54bWwuZHJhdy50ZW1wbGF0ZSIsICJzdGQiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImFwcGxpY2F0aW9uL3ZuZC5zdW4ueG1sLmltcHJlc3MiLCAic3hpIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KAotICAgICAgICAgICAgICAgICAgICAiYXBwbGljYXRpb24vdm5kLnN1bi54bWwuaW1wcmVzcy50ZW1wbGF0ZSIsICJzdGkiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImFwcGxpY2F0aW9uL3ZuZC5zdW4ueG1sLm1hdGgiLCAic3htIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhcHBsaWNhdGlvbi92bmQuc3VuLnhtbC53cml0ZXIiLCAic3h3Iik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KAotICAgICAgICAgICAgICAgICAgICAiYXBwbGljYXRpb24vdm5kLnN1bi54bWwud3JpdGVyLmdsb2JhbCIsICJzeGciKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoCi0gICAgICAgICAgICAgICAgICAgICJhcHBsaWNhdGlvbi92bmQuc3VuLnhtbC53cml0ZXIudGVtcGxhdGUiLCAic3R3Iik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhcHBsaWNhdGlvbi92bmQudmlzaW8iLCAidnNkIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhcHBsaWNhdGlvbi94LWFiaXdvcmQiLCAiYWJ3Iik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhcHBsaWNhdGlvbi94LWFwcGxlLWRpc2tpbWFnZSIsICJkbWciKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImFwcGxpY2F0aW9uL3gtYmNwaW8iLCAiYmNwaW8iKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImFwcGxpY2F0aW9uL3gtYml0dG9ycmVudCIsICJ0b3JyZW50Iik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhcHBsaWNhdGlvbi94LWNkZiIsICJjZGYiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImFwcGxpY2F0aW9uL3gtY2RsaW5rIiwgInZjZCIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXBwbGljYXRpb24veC1jaGVzcy1wZ24iLCAicGduIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhcHBsaWNhdGlvbi94LWNwaW8iLCAiY3BpbyIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXBwbGljYXRpb24veC1kZWJpYW4tcGFja2FnZSIsICJkZWIiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImFwcGxpY2F0aW9uL3gtZGViaWFuLXBhY2thZ2UiLCAidWRlYiIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXBwbGljYXRpb24veC1kaXJlY3RvciIsICJkY3IiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImFwcGxpY2F0aW9uL3gtZGlyZWN0b3IiLCAiZGlyIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhcHBsaWNhdGlvbi94LWRpcmVjdG9yIiwgImR4ciIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXBwbGljYXRpb24veC1kbXMiLCAiZG1zIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhcHBsaWNhdGlvbi94LWRvb20iLCAid2FkIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhcHBsaWNhdGlvbi94LWR2aSIsICJkdmkiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImFwcGxpY2F0aW9uL3gtZmxhYyIsICJmbGFjIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhcHBsaWNhdGlvbi94LWZvbnQiLCAicGZhIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhcHBsaWNhdGlvbi94LWZvbnQiLCAicGZiIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhcHBsaWNhdGlvbi94LWZvbnQiLCAiZ3NmIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhcHBsaWNhdGlvbi94LWZvbnQiLCAicGNmIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhcHBsaWNhdGlvbi94LWZvbnQiLCAicGNmLloiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImFwcGxpY2F0aW9uL3gtZnJlZW1pbmQiLCAibW0iKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImFwcGxpY2F0aW9uL3gtZnV0dXJlc3BsYXNoIiwgInNwbCIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXBwbGljYXRpb24veC1nbnVtZXJpYyIsICJnbnVtZXJpYyIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXBwbGljYXRpb24veC1nby1zZ2YiLCAic2dmIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhcHBsaWNhdGlvbi94LWdyYXBoaW5nLWNhbGN1bGF0b3IiLCAiZ2NmIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhcHBsaWNhdGlvbi94LWd0YXIiLCAiZ3RhciIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXBwbGljYXRpb24veC1ndGFyIiwgInRneiIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXBwbGljYXRpb24veC1ndGFyIiwgInRheiIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXBwbGljYXRpb24veC1oZGYiLCAiaGRmIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhcHBsaWNhdGlvbi94LWljYSIsICJpY2EiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImFwcGxpY2F0aW9uL3gtaW50ZXJuZXQtc2lnbnVwIiwgImlucyIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXBwbGljYXRpb24veC1pbnRlcm5ldC1zaWdudXAiLCAiaXNwIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhcHBsaWNhdGlvbi94LWlwaG9uZSIsICJpaWkiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImFwcGxpY2F0aW9uL3gtaXNvOTY2MC1pbWFnZSIsICJpc28iKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImFwcGxpY2F0aW9uL3gtam1vbCIsICJqbXoiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImFwcGxpY2F0aW9uL3gta2NoYXJ0IiwgImNocnQiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImFwcGxpY2F0aW9uL3gta2lsbHVzdHJhdG9yIiwgImtpbCIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXBwbGljYXRpb24veC1rb2FuIiwgInNrcCIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXBwbGljYXRpb24veC1rb2FuIiwgInNrZCIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXBwbGljYXRpb24veC1rb2FuIiwgInNrdCIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXBwbGljYXRpb24veC1rb2FuIiwgInNrbSIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXBwbGljYXRpb24veC1rcHJlc2VudGVyIiwgImtwciIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXBwbGljYXRpb24veC1rcHJlc2VudGVyIiwgImtwdCIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXBwbGljYXRpb24veC1rc3ByZWFkIiwgImtzcCIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXBwbGljYXRpb24veC1rd29yZCIsICJrd2QiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImFwcGxpY2F0aW9uL3gta3dvcmQiLCAia3d0Iik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhcHBsaWNhdGlvbi94LWxhdGV4IiwgImxhdGV4Iik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhcHBsaWNhdGlvbi94LWxoYSIsICJsaGEiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImFwcGxpY2F0aW9uL3gtbHpoIiwgImx6aCIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXBwbGljYXRpb24veC1sengiLCAibHp4Iik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhcHBsaWNhdGlvbi94LW1ha2VyIiwgImZybSIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXBwbGljYXRpb24veC1tYWtlciIsICJtYWtlciIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXBwbGljYXRpb24veC1tYWtlciIsICJmcmFtZSIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXBwbGljYXRpb24veC1tYWtlciIsICJmYiIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXBwbGljYXRpb24veC1tYWtlciIsICJib29rIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhcHBsaWNhdGlvbi94LW1ha2VyIiwgImZiZG9jIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhcHBsaWNhdGlvbi94LW1pZiIsICJtaWYiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImFwcGxpY2F0aW9uL3gtbXMtd21kIiwgIndtZCIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXBwbGljYXRpb24veC1tcy13bXoiLCAid216Iik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhcHBsaWNhdGlvbi94LW1zaSIsICJtc2kiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImFwcGxpY2F0aW9uL3gtbnMtcHJveHktYXV0b2NvbmZpZyIsICJwYWMiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImFwcGxpY2F0aW9uL3gtbndjIiwgIm53YyIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXBwbGljYXRpb24veC1vYmplY3QiLCAibyIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXBwbGljYXRpb24veC1vei1hcHBsaWNhdGlvbiIsICJvemEiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImFwcGxpY2F0aW9uL3gtcGtjczEyIiwgInAxMiIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXBwbGljYXRpb24veC1wa2NzNy1jZXJ0cmVxcmVzcCIsICJwN3IiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImFwcGxpY2F0aW9uL3gtcGtjczctY3JsIiwgImNybCIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXBwbGljYXRpb24veC1xdWlja3RpbWVwbGF5ZXIiLCAicXRsIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhcHBsaWNhdGlvbi94LXNoYXIiLCAic2hhciIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXBwbGljYXRpb24veC1zaG9ja3dhdmUtZmxhc2giLCAic3dmIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhcHBsaWNhdGlvbi94LXN0dWZmaXQiLCAic2l0Iik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhcHBsaWNhdGlvbi94LXN2NGNwaW8iLCAic3Y0Y3BpbyIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXBwbGljYXRpb24veC1zdjRjcmMiLCAic3Y0Y3JjIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhcHBsaWNhdGlvbi94LXRhciIsICJ0YXIiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImFwcGxpY2F0aW9uL3gtdGV4aW5mbyIsICJ0ZXhpbmZvIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhcHBsaWNhdGlvbi94LXRleGluZm8iLCAidGV4aSIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXBwbGljYXRpb24veC10cm9mZiIsICJ0Iik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhcHBsaWNhdGlvbi94LXRyb2ZmIiwgInJvZmYiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImFwcGxpY2F0aW9uL3gtdHJvZmYtbWFuIiwgIm1hbiIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXBwbGljYXRpb24veC11c3RhciIsICJ1c3RhciIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXBwbGljYXRpb24veC13YWlzLXNvdXJjZSIsICJzcmMiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImFwcGxpY2F0aW9uL3gtd2luZ3oiLCAid3oiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImFwcGxpY2F0aW9uL3gtd2ViYXJjaGl2ZSIsICJ3ZWJhcmNoaXZlIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhcHBsaWNhdGlvbi94LXg1MDktY2EtY2VydCIsICJjcnQiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImFwcGxpY2F0aW9uL3gteDUwOS11c2VyLWNlcnQiLCAiY3J0Iik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhcHBsaWNhdGlvbi94LXhjZiIsICJ4Y2YiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImFwcGxpY2F0aW9uL3gteGZpZyIsICJmaWciKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImFwcGxpY2F0aW9uL3hodG1sK3htbCIsICJ4aHRtbCIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXVkaW8vM2dwcCIsICIzZ3BwIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhdWRpby9hbXIiLCAiYW1yIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhdWRpby9iYXNpYyIsICJzbmQiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImF1ZGlvL21pZGkiLCAibWlkIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhdWRpby9taWRpIiwgIm1pZGkiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImF1ZGlvL21pZGkiLCAia2FyIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhdWRpby9taWRpIiwgInhtZiIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXVkaW8vbW9iaWxlLXhtZiIsICJteG1mIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhdWRpby9tcGVnIiwgIm1wZ2EiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImF1ZGlvL21wZWciLCAibXBlZ2EiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImF1ZGlvL21wZWciLCAibXAyIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhdWRpby9tcGVnIiwgIm1wMyIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXVkaW8vbXBlZyIsICJtNGEiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImF1ZGlvL21wZWd1cmwiLCAibTN1Iik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhdWRpby9wcnMuc2lkIiwgInNpZCIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXVkaW8veC1haWZmIiwgImFpZiIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXVkaW8veC1haWZmIiwgImFpZmYiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImF1ZGlvL3gtYWlmZiIsICJhaWZjIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhdWRpby94LWdzbSIsICJnc20iKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImF1ZGlvL3gtbXBlZ3VybCIsICJtM3UiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImF1ZGlvL3gtbXMtd21hIiwgIndtYSIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXVkaW8veC1tcy13YXgiLCAid2F4Iik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhdWRpby94LXBuLXJlYWxhdWRpbyIsICJyYSIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXVkaW8veC1wbi1yZWFsYXVkaW8iLCAicm0iKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImF1ZGlvL3gtcG4tcmVhbGF1ZGlvIiwgInJhbSIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXVkaW8veC1yZWFsYXVkaW8iLCAicmEiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImF1ZGlvL3gtc2NwbHMiLCAicGxzIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhdWRpby94LXNkMiIsICJzZDIiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImF1ZGlvL3gtd2F2IiwgIndhdiIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiaW1hZ2UvYm1wIiwgImJtcCIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiaW1hZ2UvZ2lmIiwgImdpZiIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiaW1hZ2UvaWNvIiwgImN1ciIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiaW1hZ2UvaWNvIiwgImljbyIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiaW1hZ2UvaWVmIiwgImllZiIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiaW1hZ2UvanBlZyIsICJqcGVnIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJpbWFnZS9qcGVnIiwgImpwZyIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiaW1hZ2UvanBlZyIsICJqcGUiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImltYWdlL3BjeCIsICJwY3giKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImltYWdlL3BuZyIsICJwbmciKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImltYWdlL3N2Zyt4bWwiLCAic3ZnIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJpbWFnZS9zdmcreG1sIiwgInN2Z3oiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImltYWdlL3RpZmYiLCAidGlmZiIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiaW1hZ2UvdGlmZiIsICJ0aWYiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImltYWdlL3ZuZC5kanZ1IiwgImRqdnUiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImltYWdlL3ZuZC5kanZ1IiwgImRqdiIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiaW1hZ2Uvdm5kLndhcC53Ym1wIiwgIndibXAiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImltYWdlL3gtY211LXJhc3RlciIsICJyYXMiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImltYWdlL3gtY29yZWxkcmF3IiwgImNkciIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiaW1hZ2UveC1jb3JlbGRyYXdwYXR0ZXJuIiwgInBhdCIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiaW1hZ2UveC1jb3JlbGRyYXd0ZW1wbGF0ZSIsICJjZHQiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImltYWdlL3gtY29yZWxwaG90b3BhaW50IiwgImNwdCIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiaW1hZ2UveC1pY29uIiwgImljbyIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiaW1hZ2UveC1qZyIsICJhcnQiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImltYWdlL3gtam5nIiwgImpuZyIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiaW1hZ2UveC1tcy1ibXAiLCAiYm1wIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJpbWFnZS94LXBob3Rvc2hvcCIsICJwc2QiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImltYWdlL3gtcG9ydGFibGUtYW55bWFwIiwgInBubSIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiaW1hZ2UveC1wb3J0YWJsZS1iaXRtYXAiLCAicGJtIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJpbWFnZS94LXBvcnRhYmxlLWdyYXltYXAiLCAicGdtIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJpbWFnZS94LXBvcnRhYmxlLXBpeG1hcCIsICJwcG0iKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImltYWdlL3gtcmdiIiwgInJnYiIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiaW1hZ2UveC14Yml0bWFwIiwgInhibSIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiaW1hZ2UveC14cGl4bWFwIiwgInhwbSIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiaW1hZ2UveC14d2luZG93ZHVtcCIsICJ4d2QiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoIm1vZGVsL2lnZXMiLCAiaWdzIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJtb2RlbC9pZ2VzIiwgImlnZXMiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoIm1vZGVsL21lc2giLCAibXNoIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJtb2RlbC9tZXNoIiwgIm1lc2giKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoIm1vZGVsL21lc2giLCAic2lsbyIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgidGV4dC9jYWxlbmRhciIsICJpY3MiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoInRleHQvY2FsZW5kYXIiLCAiaWN6Iik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJ0ZXh0L2NvbW1hLXNlcGFyYXRlZC12YWx1ZXMiLCAiY3N2Iik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJ0ZXh0L2NzcyIsICJjc3MiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoInRleHQvaHRtbCIsICJodG0iKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoInRleHQvaHRtbCIsICJodG1sIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJ0ZXh0L2gzMjMiLCAiMzIzIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJ0ZXh0L2l1bHMiLCAidWxzIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJ0ZXh0L21hdGhtbCIsICJtbWwiKTsKLSAgICAgICAgICAgIC8vIGFkZCBpdCBmaXJzdCBzbyBpdCB3aWxsIGJlIHRoZSBkZWZhdWx0IGZvciBFeHRlbnNpb25Gcm9tTWltZVR5cGUKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoInRleHQvcGxhaW4iLCAidHh0Iik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJ0ZXh0L3BsYWluIiwgImFzYyIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgidGV4dC9wbGFpbiIsICJ0ZXh0Iik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJ0ZXh0L3BsYWluIiwgImRpZmYiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoInRleHQvcGxhaW4iLCAicG8iKTsgICAgIC8vIHJlc2VydmUgInBvdCIgZm9yIHZuZC5tcy1wb3dlcnBvaW50Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJ0ZXh0L3JpY2h0ZXh0IiwgInJ0eCIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgidGV4dC9ydGYiLCAicnRmIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJ0ZXh0L3RleG1hY3MiLCAidHMiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoInRleHQvdGV4dCIsICJwaHBzIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJ0ZXh0L3RhYi1zZXBhcmF0ZWQtdmFsdWVzIiwgInRzdiIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgidGV4dC94bWwiLCAieG1sIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJ0ZXh0L3gtYmlidGV4IiwgImJpYiIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgidGV4dC94LWJvbyIsICJib28iKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoInRleHQveC1jKytoZHIiLCAiaCsrIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJ0ZXh0L3gtYysraGRyIiwgImhwcCIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgidGV4dC94LWMrK2hkciIsICJoeHgiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoInRleHQveC1jKytoZHIiLCAiaGgiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoInRleHQveC1jKytzcmMiLCAiYysrIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJ0ZXh0L3gtYysrc3JjIiwgImNwcCIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgidGV4dC94LWMrK3NyYyIsICJjeHgiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoInRleHQveC1jaGRyIiwgImgiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoInRleHQveC1jb21wb25lbnQiLCAiaHRjIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJ0ZXh0L3gtY3NoIiwgImNzaCIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgidGV4dC94LWNzcmMiLCAiYyIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgidGV4dC94LWRzcmMiLCAiZCIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgidGV4dC94LWhhc2tlbGwiLCAiaHMiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoInRleHQveC1qYXZhIiwgImphdmEiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoInRleHQveC1saXRlcmF0ZS1oYXNrZWxsIiwgImxocyIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgidGV4dC94LW1vYyIsICJtb2MiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoInRleHQveC1wYXNjYWwiLCAicCIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgidGV4dC94LXBhc2NhbCIsICJwYXMiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoInRleHQveC1wY3MtZ2NkIiwgImdjZCIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgidGV4dC94LXNldGV4dCIsICJldHgiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoInRleHQveC10Y2wiLCAidGNsIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJ0ZXh0L3gtdGV4IiwgInRleCIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgidGV4dC94LXRleCIsICJsdHgiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoInRleHQveC10ZXgiLCAic3R5Iik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJ0ZXh0L3gtdGV4IiwgImNscyIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgidGV4dC94LXZjYWxlbmRhciIsICJ2Y3MiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoInRleHQveC12Y2FyZCIsICJ2Y2YiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoInZpZGVvLzNncHAiLCAiM2dwcCIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgidmlkZW8vM2dwcCIsICIzZ3AiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoInZpZGVvLzNncHAiLCAiM2cyIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJ2aWRlby9kbCIsICJkbCIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgidmlkZW8vZHYiLCAiZGlmIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJ2aWRlby9kdiIsICJkdiIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgidmlkZW8vZmxpIiwgImZsaSIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgidmlkZW8vbTR2IiwgIm00diIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgidmlkZW8vbXBlZyIsICJtcGVnIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJ2aWRlby9tcGVnIiwgIm1wZyIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgidmlkZW8vbXBlZyIsICJtcGUiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoInZpZGVvL21wNCIsICJtcDQiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoInZpZGVvL21wZWciLCAiVk9CIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJ2aWRlby9xdWlja3RpbWUiLCAicXQiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoInZpZGVvL3F1aWNrdGltZSIsICJtb3YiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoInZpZGVvL3ZuZC5tcGVndXJsIiwgIm14dSIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgidmlkZW8veC1sYS1hc2YiLCAibHNmIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJ2aWRlby94LWxhLWFzZiIsICJsc3giKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoInZpZGVvL3gtbW5nIiwgIm1uZyIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgidmlkZW8veC1tcy1hc2YiLCAiYXNmIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJ2aWRlby94LW1zLWFzZiIsICJhc3giKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoInZpZGVvL3gtbXMtd20iLCAid20iKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoInZpZGVvL3gtbXMtd212IiwgIndtdiIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgidmlkZW8veC1tcy13bXgiLCAid214Iik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJ2aWRlby94LW1zLXd2eCIsICJ3dngiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoInZpZGVvL3gtbXN2aWRlbyIsICJhdmkiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoInZpZGVvL3gtc2dpLW1vdmllIiwgIm1vdmllIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJ4LWNvbmZlcmVuY2UveC1jb29sdGFsayIsICJpY2UiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoIngtZXBvYy94LXNpc3gtYXBwIiwgInNpc3giKTsKLSAgICAgICAgfQotCiAgICAgICAgIHJldHVybiBzTWltZVR5cGVNYXA7CiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvd2Via2l0L05ldHdvcmsuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3dlYmtpdC9OZXR3b3JrLmphdmEKaW5kZXggNTk4ZjIwZC4uMGYwMzI1OCAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvd2Via2l0L05ldHdvcmsuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC93ZWJraXQvTmV0d29yay5qYXZhCkBAIC0xNiw3ICsxNiwxMiBAQAogCiBwYWNrYWdlIGFuZHJvaWQud2Via2l0OwogCitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkJyb2FkY2FzdFJlY2VpdmVyOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudEZpbHRlcjsKK2ltcG9ydCBhbmRyb2lkLm5ldC5Db25uZWN0aXZpdHlNYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQubmV0Lk5ldHdvcmtJbmZvOwogaW1wb3J0IGFuZHJvaWQubmV0Lmh0dHAuKjsKIGltcG9ydCBhbmRyb2lkLm9zLio7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKQEAgLTc2LDYgKzgxLDE5IEBACiAgICAgICovCiAgICAgcHJpdmF0ZSBIdHRwQXV0aEhhbmRsZXIgbUh0dHBBdXRoSGFuZGxlcjsKIAorICAgIHByaXZhdGUgQ29udGV4dCBtQ29udGV4dDsKKworICAgIC8qKgorICAgICAqIFRydWUgaWYgdGhlIGN1cnJlbnRseSB1c2VkIG5ldHdvcmsgY29ubmVjdGlvbiBpcyBhIHJvYW1pbmcgcGhvbmUKKyAgICAgKiBjb25uZWN0aW9uLgorICAgICAqLworICAgIHByaXZhdGUgYm9vbGVhbiBtUm9hbWluZzsKKworICAgIC8qKgorICAgICAqIFRyYWNrcyBpZiB3ZSBhcmUgcm9hbWluZy4KKyAgICAgKi8KKyAgICBwcml2YXRlIFJvYW1pbmdNb25pdG9yIG1Sb2FtaW5nTW9uaXRvcjsKKwogICAgIC8qKgogICAgICAqIEByZXR1cm4gVGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGUgbmV0d29yay4KICAgICAgKi8KQEAgLTEwNyw2ICsxMjUsNyBAQAogICAgICAgICBpZiAoKytzUGxhdGZvcm1Ob3RpZmljYXRpb25FbmFibGVSZWZDb3VudCA9PSAxKSB7CiAgICAgICAgICAgICBpZiAoc05ldHdvcmsgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgIHNOZXR3b3JrLm1SZXF1ZXN0UXVldWUuZW5hYmxlUGxhdGZvcm1Ob3RpZmljYXRpb25zKCk7CisgICAgICAgICAgICAgICAgc05ldHdvcmsubW9uaXRvclJvYW1pbmcoKTsKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgc1BsYXRmb3JtTm90aWZpY2F0aW9ucyA9IHRydWU7CiAgICAgICAgICAgICB9CkBAIC0xMjEsNiArMTQwLDcgQEAKICAgICAgICAgaWYgKC0tc1BsYXRmb3JtTm90aWZpY2F0aW9uRW5hYmxlUmVmQ291bnQgPT0gMCkgewogICAgICAgICAgICAgaWYgKHNOZXR3b3JrICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICBzTmV0d29yay5tUmVxdWVzdFF1ZXVlLmRpc2FibGVQbGF0Zm9ybU5vdGlmaWNhdGlvbnMoKTsKKyAgICAgICAgICAgICAgICBzTmV0d29yay5zdG9wTW9uaXRvcmluZ1JvYW1pbmcoKTsKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgc1BsYXRmb3JtTm90aWZpY2F0aW9ucyA9IGZhbHNlOwogICAgICAgICAgICAgfQpAQCAtMTM2LDEyICsxNTYsMzkgQEAKICAgICAgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKFRocmVhZC5jdXJyZW50VGhyZWFkKCkuCiAgICAgICAgICAgICAgICAgICAgIGdldE5hbWUoKS5lcXVhbHMoV2ViVmlld0NvcmUuVEhSRUFEX05BTUUpKTsKICAgICAgICAgfQorICAgICAgICBtQ29udGV4dCA9IGNvbnRleHQ7CiAgICAgICAgIG1Tc2xFcnJvckhhbmRsZXIgPSBuZXcgU3NsRXJyb3JIYW5kbGVyKCk7CiAgICAgICAgIG1IdHRwQXV0aEhhbmRsZXIgPSBuZXcgSHR0cEF1dGhIYW5kbGVyKHRoaXMpOwogCiAgICAgICAgIG1SZXF1ZXN0UXVldWUgPSBuZXcgUmVxdWVzdFF1ZXVlKGNvbnRleHQpOwogICAgIH0KIAorICAgIHByaXZhdGUgY2xhc3MgUm9hbWluZ01vbml0b3IgZXh0ZW5kcyBCcm9hZGNhc3RSZWNlaXZlciB7CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBvblJlY2VpdmUoQ29udGV4dCBjb250ZXh0LCBJbnRlbnQgaW50ZW50KSB7CisgICAgICAgICAgICBpZiAoIUNvbm5lY3Rpdml0eU1hbmFnZXIuQ09OTkVDVElWSVRZX0FDVElPTi5lcXVhbHMoaW50ZW50LmdldEFjdGlvbigpKSkKKyAgICAgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgICAgIE5ldHdvcmtJbmZvIGluZm8gPSAoTmV0d29ya0luZm8paW50ZW50LmdldFBhcmNlbGFibGVFeHRyYShDb25uZWN0aXZpdHlNYW5hZ2VyLkVYVFJBX05FVFdPUktfSU5GTyk7CisgICAgICAgICAgICBpZiAoaW5mbyAhPSBudWxsKQorICAgICAgICAgICAgICAgIG1Sb2FtaW5nID0gaW5mby5pc1JvYW1pbmcoKTsKKyAgICAgICAgfTsKKyAgICB9OworCisgICAgcHJpdmF0ZSB2b2lkIG1vbml0b3JSb2FtaW5nKCkgeworICAgICAgICBtUm9hbWluZ01vbml0b3IgPSBuZXcgUm9hbWluZ01vbml0b3IoKTsKKyAgICAgICAgSW50ZW50RmlsdGVyIGZpbHRlciA9IG5ldyBJbnRlbnRGaWx0ZXIoKTsKKyAgICAgICAgZmlsdGVyLmFkZEFjdGlvbihDb25uZWN0aXZpdHlNYW5hZ2VyLkNPTk5FQ1RJVklUWV9BQ1RJT04pOworICAgICAgICBtQ29udGV4dC5yZWdpc3RlclJlY2VpdmVyKHNOZXR3b3JrLm1Sb2FtaW5nTW9uaXRvciwgZmlsdGVyKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgc3RvcE1vbml0b3JpbmdSb2FtaW5nKCkgeworICAgICAgICBpZiAobVJvYW1pbmdNb25pdG9yICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1Db250ZXh0LnVucmVnaXN0ZXJSZWNlaXZlcihtUm9hbWluZ01vbml0b3IpOworICAgICAgICAgICAgbVJvYW1pbmdNb25pdG9yID0gbnVsbDsKKyAgICAgICAgfQorICAgIH0KKwogICAgIC8qKgogICAgICAqIFJlcXVlc3QgYSB1cmwgZnJvbSBlaXRoZXIgdGhlIG5ldHdvcmsgb3IgdGhlIGZpbGUgc3lzdGVtLgogICAgICAqIEBwYXJhbSB1cmwgVGhlIHVybCB0byBsb2FkLgpAQCAtMTcwLDYgKzIxNywxMSBAQAogICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9CiAKKyAgICAgICAgLy8gSWYgdGhpcyBpcyBhIHByZWZldGNoLCBhYm9ydCBpdCBpZiB3ZSdyZSByb2FtaW5nLgorICAgICAgICBpZiAobVJvYW1pbmcgJiYgaGVhZGVycy5jb250YWluc0tleSgiWC1Nb3oiKSAmJiAicHJlZmV0Y2giLmVxdWFscyhoZWFkZXJzLmdldCgiWC1Nb3oiKSkpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCiAgICAgICAgIC8qIEZJWE1FOiB0aGlzIGlzIGxhbWUuICBQYXNzIGFuIElucHV0U3RyZWFtIGluLCByYXRoZXIgdGhhbgogICAgICAgICAgICBtYWtpbmcgdGhpcyBsYW1lIG9uZSBoZXJlICovCiAgICAgICAgIElucHV0U3RyZWFtIGJvZHlQcm92aWRlciA9IG51bGw7CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC93ZWJraXQvUGx1Z2luTWFuYWdlci5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvd2Via2l0L1BsdWdpbk1hbmFnZXIuamF2YQppbmRleCBlNWVlYjhjLi5hYjNiNmQ1IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC93ZWJraXQvUGx1Z2luTWFuYWdlci5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3dlYmtpdC9QbHVnaW5NYW5hZ2VyLmphdmEKQEAgLTE1OSw0MSArMTU5LDExIEBACiAgICAgICAgICAgICAgICAgICAgIGRpcmVjdG9yeSA9IFBMVUdJTl9TWVNURU1fTElCICsgcGtnSW5mby5wYWNrYWdlTmFtZTsKICAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICAvLyBjaGVjayBpZiB0aGUgcGx1Z2luIGhhcyB0aGUgcmVxdWlyZWQgcGVybWlzc2lvbnMKLSAgICAgICAgICAgICAgICBTdHJpbmcgcGVybWlzc2lvbnNbXSA9IHBrZ0luZm8ucmVxdWVzdGVkUGVybWlzc2lvbnM7Ci0gICAgICAgICAgICAgICAgaWYgKHBlcm1pc3Npb25zID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAvLyBjaGVjayBpZiB0aGUgcGx1Z2luIGhhcyB0aGUgcmVxdWlyZWQgcGVybWlzc2lvbnMgYW5kCisgICAgICAgICAgICAgICAgLy8gc2lnbmF0dXJlcworICAgICAgICAgICAgICAgIGlmICghY29udGFpbnNQbHVnaW5QZXJtaXNzaW9uQW5kU2lnbmF0dXJlcyhwa2dJbmZvKSkgewogICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYm9vbGVhbiBwZXJtaXNzaW9uT2sgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICBmb3IgKFN0cmluZyBwZXJtaXQgOiBwZXJtaXNzaW9ucykgewotICAgICAgICAgICAgICAgICAgICBpZiAoUExVR0lOX1BFUk1JU1NJT04uZXF1YWxzKHBlcm1pdCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBlcm1pc3Npb25PayA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoIXBlcm1pc3Npb25PaykgewotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvLyBjaGVjayB0byBlbnN1cmUgdGhlIHBsdWdpbiBpcyBwcm9wZXJseSBzaWduZWQKLSAgICAgICAgICAgICAgICBTaWduYXR1cmUgc2lnbmF0dXJlc1tdID0gcGtnSW5mby5zaWduYXR1cmVzOwotICAgICAgICAgICAgICAgIGlmIChzaWduYXR1cmVzID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChTeXN0ZW1Qcm9wZXJ0aWVzLmdldEJvb2xlYW4oInJvLnNlY3VyZSIsIGZhbHNlKSkgewotICAgICAgICAgICAgICAgICAgICBib29sZWFuIHNpZ25hdHVyZU1hdGNoID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoU2lnbmF0dXJlIHNpZ25hdHVyZSA6IHNpZ25hdHVyZXMpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgU0lHTkFUVVJFUy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChTSUdOQVRVUkVTW2ldLmVxdWFscyhzaWduYXR1cmUpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpZ25hdHVyZU1hdGNoID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGlmICghc2lnbmF0dXJlTWF0Y2gpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgLy8gZGV0ZXJtaW5lIHRoZSB0eXBlIG9mIHBsdWdpbiBmcm9tIHRoZSBtYW5pZmVzdAogICAgICAgICAgICAgICAgIGlmIChzZXJ2aWNlSW5mby5tZXRhRGF0YSA9PSBudWxsKSB7CkBAIC0yMzYsNiArMjA2LDY0IEBACiAgICAgfQogCiAgICAgLyogcGFja2FnZSAqLworICAgIGJvb2xlYW4gY29udGFpbnNQbHVnaW5QZXJtaXNzaW9uQW5kU2lnbmF0dXJlcyhTdHJpbmcgcGx1Z2luQVBLTmFtZSkgeworICAgICAgICBQYWNrYWdlTWFuYWdlciBwbSA9IG1Db250ZXh0LmdldFBhY2thZ2VNYW5hZ2VyKCk7CisKKyAgICAgICAgLy8gcmV0cmlldmUgaW5mb3JtYXRpb24gZnJvbSB0aGUgcGx1Z2luJ3MgbWFuaWZlc3QKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIFBhY2thZ2VJbmZvIHBrZ0luZm8gPSBwbS5nZXRQYWNrYWdlSW5mbyhwbHVnaW5BUEtOYW1lLCBQYWNrYWdlTWFuYWdlci5HRVRfUEVSTUlTU0lPTlMKKyAgICAgICAgICAgICAgICAgICAgfCBQYWNrYWdlTWFuYWdlci5HRVRfU0lHTkFUVVJFUyk7CisgICAgICAgICAgICBpZiAocGtnSW5mbyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGNvbnRhaW5zUGx1Z2luUGVybWlzc2lvbkFuZFNpZ25hdHVyZXMocGtnSW5mbyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKE5hbWVOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBMb2cudyhMT0dUQUcsICJDYW4ndCBmaW5kIHBsdWdpbjogIiArIHBsdWdpbkFQS05hbWUpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGNvbnRhaW5zUGx1Z2luUGVybWlzc2lvbkFuZFNpZ25hdHVyZXMoUGFja2FnZUluZm8gcGtnSW5mbykgeworCisgICAgICAgIC8vIGNoZWNrIGlmIHRoZSBwbHVnaW4gaGFzIHRoZSByZXF1aXJlZCBwZXJtaXNzaW9ucworICAgICAgICBTdHJpbmcgcGVybWlzc2lvbnNbXSA9IHBrZ0luZm8ucmVxdWVzdGVkUGVybWlzc2lvbnM7CisgICAgICAgIGlmIChwZXJtaXNzaW9ucyA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgYm9vbGVhbiBwZXJtaXNzaW9uT2sgPSBmYWxzZTsKKyAgICAgICAgZm9yIChTdHJpbmcgcGVybWl0IDogcGVybWlzc2lvbnMpIHsKKyAgICAgICAgICAgIGlmIChQTFVHSU5fUEVSTUlTU0lPTi5lcXVhbHMocGVybWl0KSkgeworICAgICAgICAgICAgICAgIHBlcm1pc3Npb25PayA9IHRydWU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFwZXJtaXNzaW9uT2spIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIGNoZWNrIHRvIGVuc3VyZSB0aGUgcGx1Z2luIGlzIHByb3Blcmx5IHNpZ25lZAorICAgICAgICBTaWduYXR1cmUgc2lnbmF0dXJlc1tdID0gcGtnSW5mby5zaWduYXR1cmVzOworICAgICAgICBpZiAoc2lnbmF0dXJlcyA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgaWYgKFN5c3RlbVByb3BlcnRpZXMuZ2V0Qm9vbGVhbigicm8uc2VjdXJlIiwgZmFsc2UpKSB7CisgICAgICAgICAgICBib29sZWFuIHNpZ25hdHVyZU1hdGNoID0gZmFsc2U7CisgICAgICAgICAgICBmb3IgKFNpZ25hdHVyZSBzaWduYXR1cmUgOiBzaWduYXR1cmVzKSB7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBTSUdOQVRVUkVTLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChTSUdOQVRVUkVTW2ldLmVxdWFscyhzaWduYXR1cmUpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzaWduYXR1cmVNYXRjaCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICghc2lnbmF0dXJlTWF0Y2gpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICAvKiBwYWNrYWdlICovCiAgICAgU3RyaW5nIGdldFBsdWdpbnNBUEtOYW1lKFN0cmluZyBwbHVnaW5MaWIpIHsKIAogICAgICAgICAvLyBiYXNpYyBlcnJvciBjaGVja2luZyBvbiBpbnB1dCBwYXJhbXMKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3dlYmtpdC9TZWxlY3RBY3Rpb25Nb2RlQ2FsbGJhY2suamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3dlYmtpdC9TZWxlY3RBY3Rpb25Nb2RlQ2FsbGJhY2suamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZjkxOTAyCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvd2Via2l0L1NlbGVjdEFjdGlvbk1vZGVDYWxsYmFjay5qYXZhCkBAIC0wLDAgKzEsOTIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQud2Via2l0OworCitpbXBvcnQgYW5kcm9pZC5wcm92aWRlci5Ccm93c2VyOworaW1wb3J0IGFuZHJvaWQud2Via2l0LldlYlZpZXc7CitpbXBvcnQgYW5kcm9pZC52aWV3LkFjdGlvbk1vZGU7CitpbXBvcnQgYW5kcm9pZC52aWV3Lk1lbnU7CitpbXBvcnQgYW5kcm9pZC52aWV3Lk1lbnVJdGVtOworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OworCitjbGFzcyBTZWxlY3RBY3Rpb25Nb2RlQ2FsbGJhY2sgaW1wbGVtZW50cyBBY3Rpb25Nb2RlLkNhbGxiYWNrIHsKKyAgICBwcml2YXRlIFdlYlZpZXcgbVdlYlZpZXc7CisgICAgcHJpdmF0ZSBWaWV3IG1UaXRsZUJhcjsKKyAgICBwcml2YXRlIEFjdGlvbk1vZGUgbUFjdGlvbk1vZGU7CisKKyAgICB2b2lkIHNldFdlYlZpZXcoV2ViVmlldyB3ZWJWaWV3KSB7CisgICAgICAgIG1XZWJWaWV3ID0gd2ViVmlldzsKKyAgICB9CisKKyAgICB2b2lkIHNldFRpdGxlQmFyKFZpZXcgdikgeyBtVGl0bGVCYXIgPSB2OyB9CisKKyAgICB2b2lkIGZpbmlzaCgpIHsKKyAgICAgICAgbUFjdGlvbk1vZGUuZmluaXNoKCk7CisgICAgfQorCisgICAgLy8gQWN0aW9uTW9kZS5DYWxsYmFjayBpbXBsZW1lbnRhdGlvbgorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gb25DcmVhdGVBY3Rpb25Nb2RlKEFjdGlvbk1vZGUgbW9kZSwgTWVudSBtZW51KSB7CisgICAgICAgIG1vZGUuZ2V0TWVudUluZmxhdGVyKCkuaW5mbGF0ZShjb20uYW5kcm9pZC5pbnRlcm5hbC5SLm1lbnUud2Vidmlld19jb3B5LAorICAgICAgICAgICAgICAgIG1lbnUpOworICAgICAgICBtb2RlLnNldFRpdGxlKGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3RyaW5nLnRleHRTZWxlY3Rpb25DQUJUaXRsZSk7CisgICAgICAgIG1BY3Rpb25Nb2RlID0gbW9kZTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gb25QcmVwYXJlQWN0aW9uTW9kZShBY3Rpb25Nb2RlIG1vZGUsIE1lbnUgbWVudSkgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBvbkFjdGlvbkl0ZW1DbGlja2VkKEFjdGlvbk1vZGUgbW9kZSwgTWVudUl0ZW0gaXRlbSkgeworICAgICAgICBzd2l0Y2goaXRlbS5nZXRJdGVtSWQoKSkgeworICAgICAgICAgICAgY2FzZSBhbmRyb2lkLlIuaWQuY29weToKKyAgICAgICAgICAgICAgICBtV2ViVmlldy5jb3B5U2VsZWN0aW9uKCk7CisgICAgICAgICAgICAgICAgbW9kZS5maW5pc2goKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmlkLnNoYXJlOgorICAgICAgICAgICAgICAgIFN0cmluZyBzZWxlY3Rpb24gPSBtV2ViVmlldy5nZXRTZWxlY3Rpb24oKTsKKyAgICAgICAgICAgICAgICBCcm93c2VyLnNlbmRTdHJpbmcobVdlYlZpZXcuZ2V0Q29udGV4dCgpLCBzZWxlY3Rpb24pOworICAgICAgICAgICAgICAgIG1vZGUuZmluaXNoKCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5pZC5zZWxlY3RfYWxsOgorICAgICAgICAgICAgICAgIG1XZWJWaWV3LnNlbGVjdEFsbCgpOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIGNvbS5hbmRyb2lkLmludGVybmFsLlIuaWQuZmluZDoKKyAgICAgICAgICAgICAgICBTdHJpbmcgc2VsPSBtV2ViVmlldy5nZXRTZWxlY3Rpb24oKTsKKyAgICAgICAgICAgICAgICBtb2RlLmZpbmlzaCgpOworICAgICAgICAgICAgICAgIG1XZWJWaWV3LnNob3dGaW5kRGlhbG9nKHNlbCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9uRGVzdHJveUFjdGlvbk1vZGUoQWN0aW9uTW9kZSBtb2RlKSB7CisgICAgICAgIGlmIChtVGl0bGVCYXIgIT0gbnVsbCkgbVdlYlZpZXcuc2V0RW1iZWRkZWRUaXRsZUJhcihtVGl0bGVCYXIpOworICAgICAgICBtV2ViVmlldy5zZWxlY3Rpb25Eb25lKCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvd2Via2l0L1VSTFV0aWwuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3dlYmtpdC9VUkxVdGlsLmphdmEKaW5kZXggN2M1ZjJiMC4uYzEzMTllNSAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvd2Via2l0L1VSTFV0aWwuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC93ZWJraXQvVVJMVXRpbC5qYXZhCkBAIC00Nyw3ICs0Nyw3IEBACiAgICAgICAgIFN0cmluZyByZXRWYWwgPSBpblVybDsKICAgICAgICAgV2ViQWRkcmVzcyB3ZWJBZGRyZXNzOwogCi0gICAgICAgIExvZy52KExPR1RBRywgImd1ZXNzVVJMIGJlZm9yZSBxdWV1ZVJlcXVlc3Q6ICIgKyBpblVybCk7CisgICAgICAgIGlmIChEZWJ1Z0ZsYWdzLlVSTF9VVElMKSBMb2cudihMT0dUQUcsICJndWVzc1VSTCBiZWZvcmUgcXVldWVSZXF1ZXN0OiAiICsgaW5VcmwpOwogCiAgICAgICAgIGlmIChpblVybC5sZW5ndGgoKSA9PSAwKSByZXR1cm4gaW5Vcmw7CiAgICAgICAgIGlmIChpblVybC5zdGFydHNXaXRoKCJhYm91dDoiKSkgcmV0dXJuIGluVXJsOwpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvd2Via2l0L1dlYkNocm9tZUNsaWVudC5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvd2Via2l0L1dlYkNocm9tZUNsaWVudC5qYXZhCmluZGV4IDlmNjQyYzAuLmIyYmE3ZTIzIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC93ZWJraXQvV2ViQ2hyb21lQ2xpZW50LmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvd2Via2l0L1dlYkNocm9tZUNsaWVudC5qYXZhCkBAIC0zMTQsMjggKzMxNCwyMCBAQAogICAgIC8qKgogICAgICAqIFRlbGwgdGhlIGNsaWVudCB0byBvcGVuIGEgZmlsZSBjaG9vc2VyLgogICAgICAqIEBwYXJhbSB1cGxvYWRGaWxlIEEgVmFsdWVDYWxsYmFjayB0byBzZXQgdGhlIFVSSSBvZiB0aGUgZmlsZSB0byB1cGxvYWQuCi0gICAgICogICAgICBvblJlY2VpdmVWYWx1ZSBtdXN0IGJlIGNhbGxlZCB0byB3YWtlIHVwIHRoZSB0aHJlYWQuCisgICAgICogICAgICBvblJlY2VpdmVWYWx1ZSBtdXN0IGJlIGNhbGxlZCB0byB3YWtlIHVwIHRoZSB0aHJlYWQuYQorICAgICAqIEBwYXJhbSBhY2NlcHRUeXBlIFRoZSB2YWx1ZSBvZiB0aGUgJ2FjY2VwdCcgYXR0cmlidXRlIG9mIHRoZSBpbnB1dCB0YWcKKyAgICAgKiAgICAgICAgIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGZpbGUgcGlja2VyLgogICAgICAqIEBoaWRlCiAgICAgICovCi0gICAgcHVibGljIHZvaWQgb3BlbkZpbGVDaG9vc2VyKFZhbHVlQ2FsbGJhY2s8VXJpPiB1cGxvYWRGaWxlKSB7CisgICAgcHVibGljIHZvaWQgb3BlbkZpbGVDaG9vc2VyKFZhbHVlQ2FsbGJhY2s8VXJpPiB1cGxvYWRGaWxlLCBTdHJpbmcgYWNjZXB0VHlwZSkgewogICAgICAgICB1cGxvYWRGaWxlLm9uUmVjZWl2ZVZhbHVlKG51bGwpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFRlbGwgdGhlIGNsaWVudCB0aGF0IHRoZSBzZWxlY3Rpb24gaGFzIGJlZW4gaW5pdGlhdGVkLgorICAgICAqIFRlbGwgdGhlIGNsaWVudCB0aGF0IHRoZSBwYWdlIGJlaW5nIHZpZXdlZCBpcyB3ZWIgYXBwIGNhcGFibGUsCisgICAgICogaS5lLiBoYXMgc3BlY2lmaWVkIHRoZSBmdWxsc2NyZWVuLXdlYi1hcHAtY2FwYWJsZSBtZXRhIHRhZy4KICAgICAgKiBAaGlkZQogICAgICAqLwotICAgIHB1YmxpYyB2b2lkIG9uU2VsZWN0aW9uU3RhcnQoV2ViVmlldyB2aWV3KSB7Ci0gICAgICAgIC8vIEJ5IGRlZmF1bHQgd2UgY2FuY2VsIHRoZSBzZWxlY3Rpb24gYWdhaW4sIHRodXMgZGlzYWJsaW5nCi0gICAgICAgIC8vIHRleHQgc2VsZWN0aW9uIHVubGVzcyB0aGUgY2hyb21lIGNsaWVudCBzdXBwb3J0cyBpdC4KLSAgICAgICAgdmlldy5ub3RpZnlTZWxlY3REaWFsb2dEaXNtaXNzZWQoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUZWxsIHRoZSBjbGllbnQgdGhhdCB0aGUgc2VsZWN0aW9uIGhhcyBiZWVuIGNvcGllZCBvciBjYW5jZWxlZC4KLSAgICAgKiBAaGlkZQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIG9uU2VsZWN0aW9uRG9uZShXZWJWaWV3IHZpZXcpIHsKLSAgICB9CisgICAgcHVibGljIHZvaWQgc2V0SW5zdGFsbGFibGVXZWJBcHAoKSB7IH0KIAogfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvd2Via2l0L1dlYkhpc3RvcnlJdGVtLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC93ZWJraXQvV2ViSGlzdG9yeUl0ZW0uamF2YQppbmRleCA0MjhhNTljLi43YzBlNDc4IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC93ZWJraXQvV2ViSGlzdG9yeUl0ZW0uamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC93ZWJraXQvV2ViSGlzdG9yeUl0ZW0uamF2YQpAQCAtMTgsNiArMTgsOSBAQAogCiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5CaXRtYXA7CiAKK2ltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247CitpbXBvcnQgamF2YS5uZXQuVVJMOworCiAvKioKICAqIEEgY29udmVuaWVuY2UgY2xhc3MgZm9yIGFjY2Vzc2luZyBmaWVsZHMgaW4gYW4gZW50cnkgaW4gdGhlIGJhY2svZm9yd2FyZCBsaXN0CiAgKiBvZiBhIFdlYlZpZXcuIEVhY2ggV2ViSGlzdG9yeUl0ZW0gaXMgYSBzbmFwc2hvdCBvZiB0aGUgcmVxdWVzdGVkIGhpc3RvcnkKQEAgLTM5LDggKzQyLDEyIEBACiAgICAgcHJpdmF0ZSBCaXRtYXAgbUZhdmljb247CiAgICAgLy8gVGhlIHByZS1mbGF0dGVuZWQgZGF0YSB1c2VkIGZvciBzYXZpbmcgdGhlIHN0YXRlLgogICAgIHByaXZhdGUgYnl0ZVtdIG1GbGF0dGVuZWREYXRhOwotICAgIC8vIFRoZSBhcHBsZS10b3VjaC1pY29uIHVybCBmb3IgdXNlIHdoZW4gYWRkaW5nIHRoZSBzaXRlIHRvIHRoZSBob21lIHNjcmVlbgotICAgIHByaXZhdGUgU3RyaW5nIG1Ub3VjaEljb25Vcmw7CisgICAgLy8gVGhlIGFwcGxlLXRvdWNoLWljb24gdXJsIGZvciB1c2Ugd2hlbiBhZGRpbmcgdGhlIHNpdGUgdG8gdGhlIGhvbWUgc2NyZWVuLAorICAgIC8vIGFzIG9idGFpbmVkIGZyb20gYSA8bGluaz4gZWxlbWVudCBpbiB0aGUgcGFnZS4KKyAgICBwcml2YXRlIFN0cmluZyBtVG91Y2hJY29uVXJsRnJvbUxpbms7CisgICAgLy8gSWYgbm8gPGxpbms+IGlzIHNwZWNpZmllZCwgdGhpcyBob2xkcyB0aGUgZGVmYXVsdCBsb2NhdGlvbiBvZiB0aGUKKyAgICAvLyBhcHBsZS10b3VjaC1pY29uLgorICAgIHByaXZhdGUgU3RyaW5nIG1Ub3VjaEljb25VcmxTZXJ2ZXJEZWZhdWx0OwogICAgIC8vIEN1c3RvbSBjbGllbnQgZGF0YSB0aGF0IGlzIG5vdCBmbGF0dGVuZWQgb3IgcmVhZCBieSBuYXRpdmUgY29kZS4KICAgICBwcml2YXRlIE9iamVjdCBtQ3VzdG9tRGF0YTsKIApAQCAtMTMyLDEwICsxMzksMjggQEAKIAogICAgIC8qKgogICAgICAqIFJldHVybiB0aGUgdG91Y2ggaWNvbiB1cmwuCisgICAgICogSWYgbm8gdG91Y2ggaWNvbiA8bGluaz4gdGFnIHdhcyBzcGVjaWZpZWQsIHJldHVybnMKKyAgICAgKiA8aG9zdD4vYXBwbGUtdG91Y2gtaWNvbi5wbmcuIFRoZSBEb3dubG9hZFRvdWNoSWNvbiBjbGFzcyB0aGF0CisgICAgICogYXR0ZW1wdHMgdG8gcmV0cmlldmUgdGhlIHRvdWNoIGljb24gd2lsbCBoYW5kbGUgdGhlIGNhc2Ugd2hlcmUKKyAgICAgKiB0aGF0IGZpbGUgZG9lcyBub3QgZXhpc3QuIEFuIGljb24gc2V0IGJ5IGEgPGxpbms+IHRhZyBpcyBhbHdheXMKKyAgICAgKiB1c2VkIGluIHByZWZlcmVuY2UgdG8gYW4gaWNvbiBzYXZlZCBvbiB0aGUgc2VydmVyLgogICAgICAqIEBoaWRlCiAgICAgICovCiAgICAgcHVibGljIFN0cmluZyBnZXRUb3VjaEljb25VcmwoKSB7Ci0gICAgICAgIHJldHVybiBtVG91Y2hJY29uVXJsOworICAgICAgICBpZiAobVRvdWNoSWNvblVybEZyb21MaW5rICE9IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBtVG91Y2hJY29uVXJsRnJvbUxpbms7CisgICAgICAgIH0gZWxzZSBpZiAobVRvdWNoSWNvblVybFNlcnZlckRlZmF1bHQgIT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIG1Ub3VjaEljb25VcmxTZXJ2ZXJEZWZhdWx0OworICAgICAgICB9CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIFVSTCB1cmwgPSBuZXcgVVJMKG1PcmlnaW5hbFVybCk7CisgICAgICAgICAgICBtVG91Y2hJY29uVXJsU2VydmVyRGVmYXVsdCA9IG5ldyBVUkwodXJsLmdldFByb3RvY29sKCksIHVybC5nZXRIb3N0KCksIHVybC5nZXRQb3J0KCksCisgICAgICAgICAgICAgICAgICAgICIvYXBwbGUtdG91Y2gtaWNvbi5wbmciKS50b1N0cmluZygpOworICAgICAgICB9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG1Ub3VjaEljb25VcmxTZXJ2ZXJEZWZhdWx0OwogICAgIH0KIAogICAgIC8qKgpAQCAtMTcxLDExICsxOTYsMTQgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBTZXQgdGhlIHRvdWNoIGljb24gdXJsLgorICAgICAqIFNldCB0aGUgdG91Y2ggaWNvbiB1cmwuIFdpbGwgbm90IG92ZXJ3cml0ZSBhbiBpY29uIHRoYXQgaGFzIGJlZW4KKyAgICAgKiBzZXQgYWxyZWFkeSBmcm9tIGEgPGxpbms+IHRhZywgdW5sZXNzIHRoZSBuZXcgaWNvbiBpcyBwcmVjb21wb3NlZC4KICAgICAgKiBAaGlkZQogICAgICAqLwotICAgIC8qcGFja2FnZSovIHZvaWQgc2V0VG91Y2hJY29uVXJsKFN0cmluZyB1cmwpIHsKLSAgICAgICAgbVRvdWNoSWNvblVybCA9IHVybDsKKyAgICAvKnBhY2thZ2UqLyB2b2lkIHNldFRvdWNoSWNvblVybChTdHJpbmcgdXJsLCBib29sZWFuIHByZWNvbXBvc2VkKSB7CisgICAgICAgIGlmIChwcmVjb21wb3NlZCB8fCBtVG91Y2hJY29uVXJsRnJvbUxpbmsgPT0gbnVsbCkgeworICAgICAgICAgICAgbVRvdWNoSWNvblVybEZyb21MaW5rID0gdXJsOworICAgICAgICB9CiAgICAgfQogCiAgICAgLyoqCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC93ZWJraXQvV2ViU2V0dGluZ3MuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3dlYmtpdC9XZWJTZXR0aW5ncy5qYXZhCmluZGV4IGRhMGM2MWIuLmQ4MWQ3ZjIgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3dlYmtpdC9XZWJTZXR0aW5ncy5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3dlYmtpdC9XZWJTZXR0aW5ncy5qYXZhCkBAIC0yMiw4ICsyMiw5IEBACiBpbXBvcnQgYW5kcm9pZC5vcy5CdWlsZDsKIGltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXI7CiBpbXBvcnQgYW5kcm9pZC5vcy5NZXNzYWdlOworaW1wb3J0IGFuZHJvaWQudXRpbC5EaXNwbGF5TWV0cmljczsKIGltcG9ydCBhbmRyb2lkLnV0aWwuRXZlbnRMb2c7Ci1pbXBvcnQgamF2YS5sYW5nLlNlY3VyaXR5RXhjZXB0aW9uOworCiBpbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKIAogLyoqCkBAIC0xMDcsNyArMTA4LDcgQEAKICAgICAgKiBVc2Ugd2l0aCB7QGxpbmsgI3NldENhY2hlTW9kZX0uCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTE9BRF9OT19DQUNIRSA9IDI7Ci0gICAgCisKICAgICAvKioKICAgICAgKiBEb24ndCB1c2UgdGhlIG5ldHdvcmssIGxvYWQgZnJvbSBjYWNoZSBvbmx5LgogICAgICAqIFVzZSB3aXRoIHtAbGluayAjc2V0Q2FjaGVNb2RlfS4KQEAgLTE3NiwxNCArMTc3LDE5IEBACiAgICAgcHJpdmF0ZSBib29sZWFuICAgICAgICAgbUphdmFTY3JpcHRDYW5PcGVuV2luZG93c0F1dG9tYXRpY2FsbHkgPSBmYWxzZTsKICAgICBwcml2YXRlIGJvb2xlYW4gICAgICAgICBtVXNlRG91YmxlVHJlZSA9IGZhbHNlOwogICAgIHByaXZhdGUgYm9vbGVhbiAgICAgICAgIG1Vc2VXaWRlVmlld3BvcnQgPSBmYWxzZTsKKyAgICBwcml2YXRlIGJvb2xlYW4gICAgICAgICBtVXNlRml4ZWRWaWV3cG9ydCA9IGZhbHNlOwogICAgIHByaXZhdGUgYm9vbGVhbiAgICAgICAgIG1TdXBwb3J0TXVsdGlwbGVXaW5kb3dzID0gZmFsc2U7CiAgICAgcHJpdmF0ZSBib29sZWFuICAgICAgICAgbVNocmlua3NTdGFuZGFsb25lSW1hZ2VzVG9GaXQgPSBmYWxzZTsKKyAgICBwcml2YXRlIGxvbmcgICAgICAgICAgICBtTWF4aW11bURlY29kZWRJbWFnZVNpemUgPSAwOyAvLyAwIG1lYW5zIGRlZmF1bHQKKyAgICBwcml2YXRlIGJvb2xlYW4gICAgICAgICBtUHJpdmF0ZUJyb3dzaW5nRW5hYmxlZCA9IGZhbHNlOworICAgIHByaXZhdGUgYm9vbGVhbiAgICAgICAgIG1TeW50aGV0aWNMaW5rc0VuYWJsZWQgPSB0cnVlOwogICAgIC8vIEhUTUw1IEFQSSBmbGFncwogICAgIHByaXZhdGUgYm9vbGVhbiAgICAgICAgIG1BcHBDYWNoZUVuYWJsZWQgPSBmYWxzZTsKICAgICBwcml2YXRlIGJvb2xlYW4gICAgICAgICBtRGF0YWJhc2VFbmFibGVkID0gZmFsc2U7CiAgICAgcHJpdmF0ZSBib29sZWFuICAgICAgICAgbURvbVN0b3JhZ2VFbmFibGVkID0gZmFsc2U7CiAgICAgcHJpdmF0ZSBib29sZWFuICAgICAgICAgbVdvcmtlcnNFbmFibGVkID0gZmFsc2U7ICAvLyBvbmx5IGFmZmVjdHMgVjguCiAgICAgcHJpdmF0ZSBib29sZWFuICAgICAgICAgbUdlb2xvY2F0aW9uRW5hYmxlZCA9IHRydWU7CisgICAgcHJpdmF0ZSBib29sZWFuICAgICAgICAgbVhTU0F1ZGl0b3JFbmFibGVkID0gZmFsc2U7CiAgICAgLy8gSFRNTDUgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzCiAgICAgcHJpdmF0ZSBsb25nICAgICAgICAgICAgbUFwcENhY2hlTWF4U2l6ZSA9IExvbmcuTUFYX1ZBTFVFOwogICAgIHByaXZhdGUgU3RyaW5nICAgICAgICAgIG1BcHBDYWNoZVBhdGggPSAiIjsKQEAgLTIwNSw5ICsyMTEsMTAgQEAKICAgICBwcml2YXRlIGJvb2xlYW4gICAgICAgICBtTmF2RHVtcCA9IGZhbHNlOwogICAgIHByaXZhdGUgYm9vbGVhbiAgICAgICAgIG1TdXBwb3J0Wm9vbSA9IHRydWU7CiAgICAgcHJpdmF0ZSBib29sZWFuICAgICAgICAgbUJ1aWx0SW5ab29tQ29udHJvbHMgPSBmYWxzZTsKKyAgICBwcml2YXRlIGJvb2xlYW4gICAgICAgICBtRGlzcGxheVpvb21Db250cm9scyA9IHRydWU7CiAgICAgcHJpdmF0ZSBib29sZWFuICAgICAgICAgbUFsbG93RmlsZUFjY2VzcyA9IHRydWU7CiAgICAgcHJpdmF0ZSBib29sZWFuICAgICAgICAgbUxvYWRXaXRoT3ZlcnZpZXdNb2RlID0gZmFsc2U7Ci0gICAgcHJpdmF0ZSBib29sZWFuICAgICAgICAgbVVzZVdlYlZpZXdCYWNrZ3JvdW5kT3ZlcnNjcm9sbEJhY2tncm91bmQgPSB0cnVlOworICAgIHByaXZhdGUgYm9vbGVhbiAgICAgICAgIG1FbmFibGVTbW9vdGhUcmFuc2l0aW9uID0gZmFsc2U7CiAKICAgICAvLyBwcml2YXRlIFdlYlNldHRpbmdzLCBub3QgYWNjZXNzaWJsZSBieSB0aGUgaG9zdCBhY3Rpdml0eQogICAgIHN0YXRpYyBwcml2YXRlIGludCAgICAgIG1Eb3VibGVUYXBUb2FzdENvdW50ID0gMzsKQEAgLTI5NywxMyArMzA0LDEzIEBACiAgICAgICAgICAgICAiTW96aWxsYS81LjAgKE1hY2ludG9zaDsgVTsgSW50ZWwgTWFjIE9TIFggMTBfNV83OyBlbi11cykiCiAgICAgICAgICAgICArICIgQXBwbGVXZWJLaXQvNTMwLjE3IChLSFRNTCwgbGlrZSBHZWNrbykgVmVyc2lvbi80LjAiCiAgICAgICAgICAgICArICIgU2FmYXJpLzUzMC4xNyI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIElQSE9ORV9VU0VSQUdFTlQgPSAKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSVBIT05FX1VTRVJBR0VOVCA9CiAgICAgICAgICAgICAiTW96aWxsYS81LjAgKGlQaG9uZTsgVTsgQ1BVIGlQaG9uZSBPUyAzXzAgbGlrZSBNYWMgT1MgWDsgZW4tdXMpIgogICAgICAgICAgICAgKyAiIEFwcGxlV2ViS2l0LzUyOC4xOCAoS0hUTUwsIGxpa2UgR2Vja28pIFZlcnNpb24vNC4wIgogICAgICAgICAgICAgKyAiIE1vYmlsZS83QTM0MSBTYWZhcmkvNTI4LjE2IjsKICAgICBwcml2YXRlIHN0YXRpYyBMb2NhbGUgc0xvY2FsZTsKICAgICBwcml2YXRlIHN0YXRpYyBPYmplY3Qgc0xvY2tGb3JMb2NhbGVTZXR0aW5nczsKLSAgICAKKwogICAgIC8qKgogICAgICAqIFBhY2thZ2UgY29uc3RydWN0b3IgdG8gcHJldmVudCBjbGllbnRzIGZyb20gY3JlYXRpbmcgYSBuZXcgc2V0dGluZ3MKICAgICAgKiBpbnN0YW5jZS4KQEAgLTMxNSw2ICszMjIsMTEgQEAKICAgICAgICAgbURlZmF1bHRUZXh0RW5jb2RpbmcgPSBjb250ZXh0LmdldFN0cmluZyhjb20uYW5kcm9pZC5pbnRlcm5hbC4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSLnN0cmluZy5kZWZhdWx0X3RleHRfZW5jb2RpbmcpOwogCisgICAgICAgIC8vIERldGVjdCB0YWJsZXQgZGV2aWNlIGZvciBmaXhlZCB2aWV3cG9ydCBtb2RlLgorICAgICAgICBmaW5hbCBEaXNwbGF5TWV0cmljcyBtZXRyaWNzID0gY29udGV4dC5nZXRSZXNvdXJjZXMoKS5nZXREaXNwbGF5TWV0cmljcygpOworICAgICAgICBtVXNlRml4ZWRWaWV3cG9ydCA9IChtZXRyaWNzLmRlbnNpdHkgPT0gMS4wZiAKKyAgICAgICAgICAgICYmIChtZXRyaWNzLndpZHRoUGl4ZWxzID49IDgwMCB8fG1ldHJpY3MuaGVpZ2h0UGl4ZWxzID49IDgwMCkpOworCiAgICAgICAgIGlmIChzTG9ja0ZvckxvY2FsZVNldHRpbmdzID09IG51bGwpIHsKICAgICAgICAgICAgIHNMb2NrRm9yTG9jYWxlU2V0dGluZ3MgPSBuZXcgT2JqZWN0KCk7CiAgICAgICAgICAgICBzTG9jYWxlID0gTG9jYWxlLmdldERlZmF1bHQoKTsKQEAgLTMyOCw2ICszNDAsOCBAQAogICAgICAgICAgICAgICAgIGFuZHJvaWQub3MuUHJvY2Vzcy5teVVpZCgpKSAhPSBQYWNrYWdlTWFuYWdlci5QRVJNSVNTSU9OX0dSQU5URUQ7CiAgICAgfQogCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFDQ0VQVF9MQU5HX0ZPUl9VU19MT0NBTEUgPSAiZW4tVVMiOworCiAgICAgLyoqCiAgICAgICogTG9va3MgYXQgc0xvY2FsZSBhbmQgcmV0dXJucyBjdXJyZW50IEFjY2VwdExhbmd1YWdlIFN0cmluZy4KICAgICAgKiBAcmV0dXJuIEN1cnJlbnQgQWNjZXB0TGFuZ3VhZ2UgU3RyaW5nLgpAQCAtMzM3LDMyICszNTEsNTMgQEAKICAgICAgICAgc3luY2hyb25pemVkKHNMb2NrRm9yTG9jYWxlU2V0dGluZ3MpIHsKICAgICAgICAgICAgIGxvY2FsZSA9IHNMb2NhbGU7CiAgICAgICAgIH0KLSAgICAgICAgU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICAgICAgZmluYWwgU3RyaW5nIGxhbmd1YWdlID0gbG9jYWxlLmdldExhbmd1YWdlKCk7Ci0gICAgICAgIGlmIChsYW5ndWFnZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBidWZmZXIuYXBwZW5kKGxhbmd1YWdlKTsKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyBjb3VudHJ5ID0gbG9jYWxlLmdldENvdW50cnkoKTsKLSAgICAgICAgICAgIGlmIChjb3VudHJ5ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBidWZmZXIuYXBwZW5kKCItIik7Ci0gICAgICAgICAgICAgICAgYnVmZmVyLmFwcGVuZChjb3VudHJ5KTsKKyAgICAgICAgU3RyaW5nQnVpbGRlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgICAgICBhZGRMb2NhbGVUb0h0dHBBY2NlcHRMYW5ndWFnZShidWZmZXIsIGxvY2FsZSk7CisKKyAgICAgICAgaWYgKCFMb2NhbGUuVVMuZXF1YWxzKGxvY2FsZSkpIHsKKyAgICAgICAgICAgIGlmIChidWZmZXIubGVuZ3RoKCkgPiAwKSB7CisgICAgICAgICAgICAgICAgYnVmZmVyLmFwcGVuZCgiLCAiKTsKICAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAoIWxvY2FsZS5lcXVhbHMoTG9jYWxlLlVTKSkgewotICAgICAgICAgICAgYnVmZmVyLmFwcGVuZCgiLCAiKTsKLSAgICAgICAgICAgIGphdmEudXRpbC5Mb2NhbGUgdXMgPSBMb2NhbGUuVVM7Ci0gICAgICAgICAgICBpZiAodXMuZ2V0TGFuZ3VhZ2UoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgYnVmZmVyLmFwcGVuZCh1cy5nZXRMYW5ndWFnZSgpKTsKLSAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgY291bnRyeSA9IHVzLmdldENvdW50cnkoKTsKLSAgICAgICAgICAgICAgICBpZiAoY291bnRyeSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJ1ZmZlci5hcHBlbmQoIi0iKTsKLSAgICAgICAgICAgICAgICAgICAgYnVmZmVyLmFwcGVuZChjb3VudHJ5KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9CisgICAgICAgICAgICBidWZmZXIuYXBwZW5kKEFDQ0VQVF9MQU5HX0ZPUl9VU19MT0NBTEUpOwogICAgICAgICB9CiAKICAgICAgICAgcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwogICAgIH0KLSAgICAKKworICAgIC8qKgorICAgICAqIENvbnZlcnQgb2Jzb2xldGUgbGFuZ3VhZ2UgY29kZXMsIGluY2x1ZGluZyBIZWJyZXcvSW5kb25lc2lhbi9ZaWRkaXNoLAorICAgICAqIHRvIG5ldyBzdGFuZGFyZC4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgY29udmVydE9ic29sZXRlTGFuZ3VhZ2VDb2RlVG9OZXcoU3RyaW5nIGxhbmdDb2RlKSB7CisgICAgICAgIGlmIChsYW5nQ29kZSA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgICAgICBpZiAoIml3Ii5lcXVhbHMobGFuZ0NvZGUpKSB7CisgICAgICAgICAgICAvLyBIZWJyZXcKKyAgICAgICAgICAgIHJldHVybiAiaGUiOworICAgICAgICB9IGVsc2UgaWYgKCJpbiIuZXF1YWxzKGxhbmdDb2RlKSkgeworICAgICAgICAgICAgLy8gSW5kb25lc2lhbgorICAgICAgICAgICAgcmV0dXJuICJpZCI7CisgICAgICAgIH0gZWxzZSBpZiAoImppIi5lcXVhbHMobGFuZ0NvZGUpKSB7CisgICAgICAgICAgICAvLyBZaWRkaXNoCisgICAgICAgICAgICByZXR1cm4gInlpIjsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbGFuZ0NvZGU7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBhZGRMb2NhbGVUb0h0dHBBY2NlcHRMYW5ndWFnZShTdHJpbmdCdWlsZGVyIGJ1aWxkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2NhbGUgbG9jYWxlKSB7CisgICAgICAgIFN0cmluZyBsYW5ndWFnZSA9IGNvbnZlcnRPYnNvbGV0ZUxhbmd1YWdlQ29kZVRvTmV3KGxvY2FsZS5nZXRMYW5ndWFnZSgpKTsKKyAgICAgICAgaWYgKGxhbmd1YWdlICE9IG51bGwpIHsKKyAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKGxhbmd1YWdlKTsKKyAgICAgICAgICAgIFN0cmluZyBjb3VudHJ5ID0gbG9jYWxlLmdldENvdW50cnkoKTsKKyAgICAgICAgICAgIGlmIChjb3VudHJ5ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBidWlsZGVyLmFwcGVuZCgiLSIpOworICAgICAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKGNvdW50cnkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCiAgICAgLyoqCiAgICAgICogTG9va3MgYXQgc0xvY2FsZSBhbmQgbUNvbnRleHQgYW5kIHJldHVybnMgY3VycmVudCBVc2VyQWdlbnQgU3RyaW5nLgogICAgICAqIEByZXR1cm4gQ3VycmVudCBVc2VyQWdlbnQgU3RyaW5nLgpAQCAtMzgwLDExICs0MTUsMTEgQEAKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIC8vIGRlZmF1bHQgdG8gIjEuMCIKICAgICAgICAgICAgIGJ1ZmZlci5hcHBlbmQoIjEuMCIpOwotICAgICAgICB9ICAKKyAgICAgICAgfQogICAgICAgICBidWZmZXIuYXBwZW5kKCI7ICIpOwogICAgICAgICBmaW5hbCBTdHJpbmcgbGFuZ3VhZ2UgPSBsb2NhbGUuZ2V0TGFuZ3VhZ2UoKTsKICAgICAgICAgaWYgKGxhbmd1YWdlICE9IG51bGwpIHsKLSAgICAgICAgICAgIGJ1ZmZlci5hcHBlbmQobGFuZ3VhZ2UudG9Mb3dlckNhc2UoKSk7CisgICAgICAgICAgICBidWZmZXIuYXBwZW5kKGNvbnZlcnRPYnNvbGV0ZUxhbmd1YWdlQ29kZVRvTmV3KGxhbmd1YWdlKSk7CiAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgY291bnRyeSA9IGxvY2FsZS5nZXRDb3VudHJ5KCk7CiAgICAgICAgICAgICBpZiAoY291bnRyeSAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgYnVmZmVyLmFwcGVuZCgiLSIpOwpAQCAtNDA3LDExICs0NDIsMTMgQEAKICAgICAgICAgICAgIGJ1ZmZlci5hcHBlbmQoIiBCdWlsZC8iKTsKICAgICAgICAgICAgIGJ1ZmZlci5hcHBlbmQoaWQpOwogICAgICAgICB9CisgICAgICAgIFN0cmluZyBtb2JpbGUgPSBtQ29udGV4dC5nZXRSZXNvdXJjZXMoKS5nZXRUZXh0KAorICAgICAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHJpbmcud2ViX3VzZXJfYWdlbnRfdGFyZ2V0X2NvbnRlbnQpLnRvU3RyaW5nKCk7CiAgICAgICAgIGZpbmFsIFN0cmluZyBiYXNlID0gbUNvbnRleHQuZ2V0UmVzb3VyY2VzKCkuZ2V0VGV4dCgKICAgICAgICAgICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0cmluZy53ZWJfdXNlcl9hZ2VudCkudG9TdHJpbmcoKTsKLSAgICAgICAgcmV0dXJuIFN0cmluZy5mb3JtYXQoYmFzZSwgYnVmZmVyKTsKKyAgICAgICAgcmV0dXJuIFN0cmluZy5mb3JtYXQoYmFzZSwgYnVmZmVyLCBtb2JpbGUpOwogICAgIH0KLSAgICAKKwogICAgIC8qKgogICAgICAqIEVuYWJsZXMgZHVtcGluZyB0aGUgcGFnZXMgbmF2aWdhdGlvbiBjYWNoZSB0byBhIHRleHQgZmlsZS4KICAgICAgKi8KQEAgLTQyNyw2ICs0NjQsMjEgQEAKICAgICB9CiAKICAgICAvKioKKyAgICAgKiBJZiBXZWJWaWV3IG9ubHkgc3VwcG9ydHMgdG91Y2gsIGEgZGlmZmVyZW50IG5hdmlnYXRpb24gbW9kZWwgd2lsbCBiZQorICAgICAqIGFwcGxpZWQuIE90aGVyd2lzZSwgdGhlIG5hdmlnYXRpb24gdG8gc3VwcG9ydCBib3RoIHRvdWNoIGFuZCBrZXlib2FyZAorICAgICAqIHdpbGwgYmUgdXNlZC4KKyAgICAgKiBAaGlkZQorICAgIHB1YmxpYyB2b2lkIHNldFN1cHBvcnRUb3VjaE9ubHkoYm9vbGVhbiB0b3VjaE9ubHkpIHsKKyAgICAgICAgbVN1cHBvcnRUb3VuY2hPbmx5ID0gdG91Y2hPbmx5OworICAgIH0KKyAgICAgKi8KKworICAgIGJvb2xlYW4gc3VwcG9ydFRvdWNoT25seSgpIHsKKyAgICAgICAgLy8gZm9yIGRlYnVnIG9ubHksIHVzZSBtTGlnaHRUb3VjaEVuYWJsZWQgZm9yIG1TdXBwb3J0VG91bmNoT25seQorICAgICAgICByZXR1cm4gbUxpZ2h0VG91Y2hFbmFibGVkOworICAgIH0KKworICAgIC8qKgogICAgICAqIFNldCB3aGV0aGVyIHRoZSBXZWJWaWV3IHN1cHBvcnRzIHpvb20KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXRTdXBwb3J0Wm9vbShib29sZWFuIHN1cHBvcnQpIHsKQEAgLTQ0OCwxNCArNTAwLDM0IEBACiAgICAgICAgIG1CdWlsdEluWm9vbUNvbnRyb2xzID0gZW5hYmxlZDsKICAgICAgICAgbVdlYlZpZXcudXBkYXRlTXVsdGlUb3VjaFN1cHBvcnQobUNvbnRleHQpOwogICAgIH0KLSAgICAKKwogICAgIC8qKgogICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgem9vbSBtZWNoYW5pc20gYnVpbHQgaW50byBXZWJWaWV3IGlzIGJlaW5nIHVzZWQuCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gZ2V0QnVpbHRJblpvb21Db250cm9scygpIHsKICAgICAgICAgcmV0dXJuIG1CdWlsdEluWm9vbUNvbnRyb2xzOwogICAgIH0KLSAgICAKKworICAgIC8qKgorICAgICAqIFNldHMgd2hldGhlciB0aGUgb24gc2NyZWVuIHpvb20gYnV0dG9ucyBhcmUgdXNlZC4KKyAgICAgKiBBIGNvbWJpbmF0aW9uIG9mIGJ1aWx0IGluIHpvb20gY29udHJvbHMgZW5hYmxlZAorICAgICAqIGFuZCBvbiBzY3JlZW4gem9vbSBjb250cm9scyBkaXNhYmxlZCBhbGxvd3MgZm9yIHBpbmNoIHRvIHpvb20KKyAgICAgKiB0byB3b3JrIHdpdGhvdXQgdGhlIG9uIHNjcmVlbiBjb250cm9scworICAgICAqIEBoaWRlCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RGlzcGxheVpvb21Db250cm9scyhib29sZWFuIGVuYWJsZWQpIHsKKyAgICAgICAgbURpc3BsYXlab29tQ29udHJvbHMgPSBlbmFibGVkOworICAgICAgICBtV2ViVmlldy51cGRhdGVNdWx0aVRvdWNoU3VwcG9ydChtQ29udGV4dCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBvbiBzY3JlZW4gem9vbSBidXR0b25zIGFyZSBiZWluZyB1c2VkLgorICAgICAqIEBoaWRlCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gZ2V0RGlzcGxheVpvb21Db250cm9scygpIHsKKyAgICAgICAgcmV0dXJuIG1EaXNwbGF5Wm9vbUNvbnRyb2xzOworICAgIH0KKwogICAgIC8qKgogICAgICAqIEVuYWJsZSBvciBkaXNhYmxlIGZpbGUgYWNjZXNzIHdpdGhpbiBXZWJWaWV3LiBGaWxlIGFjY2VzcyBpcyBlbmFibGVkIGJ5CiAgICAgICogZGVmYXVsdC4KQEAgLTQ4NiwyMCArNTU4LDIyIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogU2V0IHdoZXRoZXIgdGhlIFdlYlZpZXcgdXNlcyBpdHMgYmFja2dyb3VuZCBmb3Igb3ZlciBzY3JvbGwgYmFja2dyb3VuZC4KLSAgICAgKiBJZiB0cnVlLCBpdCB3aWxsIHVzZSB0aGUgV2ViVmlldydzIGJhY2tncm91bmQuIElmIGZhbHNlLCBpdCB3aWxsIHVzZSBhbgotICAgICAqIGludGVybmFsIHBhdHRlcm4uIERlZmF1bHQgaXMgdHJ1ZS4KKyAgICAgKiBTZXQgd2hldGhlciB0aGUgV2ViVmlldyB3aWxsIGVuYWJsZSBzbW9vdGggdHJhbnNpdGlvbiB3aGlsZSBwYW5uaW5nIG9yCisgICAgICogem9vbWluZy4gSWYgaXQgaXMgdHJ1ZSwgV2ViVmlldyB3aWxsIGNob29zZSBhIHNvbHV0aW9uIHRvIG1heGltaXplIHRoZQorICAgICAqIHBlcmZvcm1hbmNlLiBlLmcuIHRoZSBXZWJWaWV3J3MgY29udGVudCBtYXkgbm90IGJlIHVwZGF0ZWQgZHVyaW5nIHRoZQorICAgICAqIHRyYW5zaXRpb24uIElmIGl0IGlzIGZhbHNlLCBXZWJWaWV3IHdpbGwga2VlcCBpdHMgZmlkZWxpdHkuIFRoZSBkZWZhdWx0CisgICAgICogdmFsdWUgaXMgZmFsc2UuCiAgICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0VXNlV2ViVmlld0JhY2tncm91bmRGb3JPdmVyc2Nyb2xsQmFja2dyb3VuZChib29sZWFuIHZpZXcpIHsKLSAgICAgICAgbVVzZVdlYlZpZXdCYWNrZ3JvdW5kT3ZlcnNjcm9sbEJhY2tncm91bmQgPSB2aWV3OworICAgIHB1YmxpYyB2b2lkIHNldEVuYWJsZVNtb290aFRyYW5zaXRpb24oYm9vbGVhbiBlbmFibGUpIHsKKyAgICAgICAgbUVuYWJsZVNtb290aFRyYW5zaXRpb24gPSBlbmFibGU7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyB0cnVlIGlmIHRoaXMgV2ViVmlldyB1c2VzIFdlYlZpZXcncyBiYWNrZ3JvdW5kIGluc3RlYWQgb2YKLSAgICAgKiBpbnRlcm5hbCBwYXR0ZXJuIGZvciBvdmVyIHNjcm9sbCBiYWNrZ3JvdW5kLgorICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgV2ViVmlldyBlbmFibGVzIHNtb290aCB0cmFuc2l0aW9uIHdoaWxlIHBhbm5pbmcgb3IKKyAgICAgKiB6b29taW5nLgogICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGdldFVzZVdlYlZpZXdCYWNrZ3JvdW5kRm9yT3ZlcnNjcm9sbEJhY2tncm91bmQoKSB7Ci0gICAgICAgIHJldHVybiBtVXNlV2ViVmlld0JhY2tncm91bmRPdmVyc2Nyb2xsQmFja2dyb3VuZDsKKyAgICBwdWJsaWMgYm9vbGVhbiBlbmFibGVTbW9vdGhUcmFuc2l0aW9uKCkgeworICAgICAgICByZXR1cm4gbUVuYWJsZVNtb290aFRyYW5zaXRpb247CiAgICAgfQogCiAgICAgLyoqCkBAIC0xMDAyLDggKzEwNzYsOCBAQAogCiAgICAgcHJpdmF0ZSB2b2lkIHZlcmlmeU5ldHdvcmtBY2Nlc3MoKSB7CiAgICAgICAgIGlmICghbUJsb2NrTmV0d29ya0xvYWRzKSB7Ci0gICAgICAgICAgICBpZiAobUNvbnRleHQuY2hlY2tQZXJtaXNzaW9uKCJhbmRyb2lkLnBlcm1pc3Npb24uSU5URVJORVQiLCAKLSAgICAgICAgICAgICAgICAgICAgYW5kcm9pZC5vcy5Qcm9jZXNzLm15UGlkKCksIGFuZHJvaWQub3MuUHJvY2Vzcy5teVVpZCgpKSAhPSAKKyAgICAgICAgICAgIGlmIChtQ29udGV4dC5jaGVja1Blcm1pc3Npb24oImFuZHJvaWQucGVybWlzc2lvbi5JTlRFUk5FVCIsCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQub3MuUHJvY2Vzcy5teVBpZCgpLCBhbmRyb2lkLm9zLlByb2Nlc3MubXlVaWQoKSkgIT0KICAgICAgICAgICAgICAgICAgICAgICAgIFBhY2thZ2VNYW5hZ2VyLlBFUk1JU1NJT05fR1JBTlRFRCkgewogICAgICAgICAgICAgICAgIHRocm93IG5ldyBTZWN1cml0eUV4Y2VwdGlvbgogICAgICAgICAgICAgICAgICAgICAgICAgKCJQZXJtaXNzaW9uIGRlbmllZCAtICIgKwpAQCAtMTAyOSw2ICsxMTAzLDcgQEAKICAgICAgKiBAZGVwcmVjYXRlZCBUaGlzIG1ldGhvZCBoYXMgYmVlbiBkZXByZWNhdGVkIGluIGZhdm9yIG9mCiAgICAgICogICAgICAgICAgICAge0BsaW5rICNzZXRQbHVnaW5TdGF0ZX0KICAgICAgKi8KKyAgICBARGVwcmVjYXRlZAogICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBzZXRQbHVnaW5zRW5hYmxlZChib29sZWFuIGZsYWcpIHsKICAgICAgICAgc2V0UGx1Z2luU3RhdGUoUGx1Z2luU3RhdGUuT04pOwogICAgIH0KQEAgLTExOTksNiArMTI3NCwxOCBAQAogICAgIH0KIAogICAgIC8qKgorICAgICAqIFNldHMgd2hldGhlciBYU1MgQXVkaXRvciBpcyBlbmFibGVkLgorICAgICAqIEBwYXJhbSBmbGFnIFdoZXRoZXIgWFNTIEF1ZGl0b3Igc2hvdWxkIGJlIGVuYWJsZWQuCisgICAgICogQGhpZGUgT25seSB1c2VkIGJ5IExheW91dFRlc3RDb250cm9sbGVyLgorICAgICAqLworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBzZXRYU1NBdWRpdG9yRW5hYmxlZChib29sZWFuIGZsYWcpIHsKKyAgICAgICAgaWYgKG1YU1NBdWRpdG9yRW5hYmxlZCAhPSBmbGFnKSB7CisgICAgICAgICAgICBtWFNTQXVkaXRvckVuYWJsZWQgPSBmbGFnOworICAgICAgICAgICAgcG9zdFN5bmMoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgogICAgICAqIFJldHVybiB0cnVlIGlmIGphdmFzY3JpcHQgaXMgZW5hYmxlZC4gPGI+Tm90ZTogVGhlIGRlZmF1bHQgaXMgZmFsc2UuPC9iPgogICAgICAqIEByZXR1cm4gVHJ1ZSBpZiBqYXZhc2NyaXB0IGlzIGVuYWJsZWQuCiAgICAgICovCkBAIC0xMjExLDYgKzEyOTgsNyBAQAogICAgICAqIEByZXR1cm4gVHJ1ZSBpZiBwbHVnaW5zIGFyZSBlbmFibGVkLgogICAgICAqIEBkZXByZWNhdGVkIFRoaXMgbWV0aG9kIGhhcyBiZWVuIHJlcGxhY2VkIGJ5IHtAbGluayAjZ2V0UGx1Z2luU3RhdGV9CiAgICAgICovCisgICAgQERlcHJlY2F0ZWQKICAgICBwdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4gZ2V0UGx1Z2luc0VuYWJsZWQoKSB7CiAgICAgICAgIHJldHVybiBtUGx1Z2luU3RhdGUgPT0gUGx1Z2luU3RhdGUuT047CiAgICAgfQpAQCAtMTI4NCw3ICsxMzcyLDcgQEAKICAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgc2V0VXNlckFnZW50U3RyaW5nKFN0cmluZyB1YSkgewogICAgICAgICBpZiAodWEgPT0gbnVsbCB8fCB1YS5sZW5ndGgoKSA9PSAwKSB7CiAgICAgICAgICAgICBzeW5jaHJvbml6ZWQoc0xvY2tGb3JMb2NhbGVTZXR0aW5ncykgewotICAgICAgICAgICAgICAgIExvY2FsZSBjdXJyZW50TG9jYWxlID0gTG9jYWxlLmdldERlZmF1bHQoKTsgCisgICAgICAgICAgICAgICAgTG9jYWxlIGN1cnJlbnRMb2NhbGUgPSBMb2NhbGUuZ2V0RGVmYXVsdCgpOwogICAgICAgICAgICAgICAgIGlmICghc0xvY2FsZS5lcXVhbHMoY3VycmVudExvY2FsZSkpIHsKICAgICAgICAgICAgICAgICAgICAgc0xvY2FsZSA9IGN1cnJlbnRMb2NhbGU7CiAgICAgICAgICAgICAgICAgICAgIG1BY2NlcHRMYW5ndWFnZSA9IGdldEN1cnJlbnRBY2NlcHRMYW5ndWFnZSgpOwpAQCAtMTMzOSwxMSArMTQyNywxMSBAQAogICAgICAgICB9CiAgICAgICAgIHJldHVybiBtQWNjZXB0TGFuZ3VhZ2U7CiAgICAgfQotICAgIAorCiAgICAgLyoqCiAgICAgICogVGVsbCB0aGUgV2ViVmlldyB3aGV0aGVyIGl0IG5lZWRzIHRvIHNldCBhIG5vZGUgdG8gaGF2ZSBmb2N1cyB3aGVuCiAgICAgICoge0BsaW5rIFdlYlZpZXcjcmVxdWVzdEZvY3VzKGludCwgYW5kcm9pZC5ncmFwaGljcy5SZWN0KX0gaXMgY2FsbGVkLgotICAgICAqIAorICAgICAqCiAgICAgICogQHBhcmFtIGZsYWcKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXROZWVkSW5pdGlhbEZvY3VzKGJvb2xlYW4gZmxhZykgewpAQCAtMTM3MCw3ICsxNDU4LDcgQEAKICAgICAgICAgICAgICAgICAgICAgRXZlbnRIYW5kbGVyLlBSSU9SSVRZKSk7CiAgICAgICAgIH0KICAgICB9Ci0gICAgCisKICAgICAvKioKICAgICAgKiBPdmVycmlkZSB0aGUgd2F5IHRoZSBjYWNoZSBpcyB1c2VkLiBUaGUgd2F5IHRoZSBjYWNoZSBpcyB1c2VkIGlzIGJhc2VkCiAgICAgICogb24gdGhlIG5hdmlnYXRpb24gb3B0aW9uLiBGb3IgYSBub3JtYWwgcGFnZSBsb2FkLCB0aGUgY2FjaGUgaXMgY2hlY2tlZApAQCAtMTM4NCw3ICsxNDcyLDcgQEAKICAgICAgICAgICAgIG1PdmVycmlkZUNhY2hlTW9kZSA9IG1vZGU7CiAgICAgICAgIH0KICAgICB9Ci0gICAgCisKICAgICAvKioKICAgICAgKiBSZXR1cm4gdGhlIGN1cnJlbnQgc2V0dGluZyBmb3Igb3ZlcnJpZGluZyB0aGUgY2FjaGUgbW9kZS4gRm9yIGEgZnVsbAogICAgICAqIGRlc2NyaXB0aW9uLCBzZWUgdGhlIHtAbGluayAjc2V0Q2FjaGVNb2RlKGludCl9IGZ1bmN0aW9uLgpAQCAtMTM5Miw3ICsxNDgwLDcgQEAKICAgICBwdWJsaWMgaW50IGdldENhY2hlTW9kZSgpIHsKICAgICAgICAgcmV0dXJuIG1PdmVycmlkZUNhY2hlTW9kZTsKICAgICB9Ci0gICAgCisKICAgICAvKioKICAgICAgKiBJZiBzZXQsIHdlYmtpdCBhbHRlcm5hdGVseSBzaHJpbmtzIGFuZCBleHBhbmRzIGltYWdlcyB2aWV3ZWQgb3V0c2lkZQogICAgICAqIG9mIGFuIEhUTUwgcGFnZSB0byBmaXQgdGhlIHNjcmVlbi4gVGhpcyBjb25mbGljdHMgd2l0aCBhdHRlbXB0cyBieQpAQCAtMTQwNyw2ICsxNDk1LDUxIEBACiAgICAgICAgIH0KICAgICAgfQogCisgICAgLyoqCisgICAgICogU3BlY2lmeSB0aGUgbWF4aW11bSBkZWNvZGVkIGltYWdlIHNpemUuIFRoZSBkZWZhdWx0IGlzCisgICAgICogMiBtZWdzIGZvciBzbWFsbCBtZW1vcnkgZGV2aWNlcyBhbmQgOCBtZWdzIGZvciBsYXJnZSBtZW1vcnkgZGV2aWNlcy4KKyAgICAgKiBAcGFyYW0gc2l6ZSBUaGUgbWF4aW11bSBkZWNvZGVkIHNpemUsIG9yIHplcm8gdG8gc2V0IHRvIHRoZSBkZWZhdWx0LgorICAgICAqIEBoaWRlIHBlbmRpbmcgYXBpIGNvdW5jaWwgYXBwcm92YWwKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRNYXhpbXVtRGVjb2RlZEltYWdlU2l6ZShsb25nIHNpemUpIHsKKyAgICAgICAgaWYgKG1NYXhpbXVtRGVjb2RlZEltYWdlU2l6ZSAhPSBzaXplKSB7CisgICAgICAgICAgICBtTWF4aW11bURlY29kZWRJbWFnZVNpemUgPSBzaXplOworICAgICAgICAgICAgcG9zdFN5bmMoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgd2hldGhlciB0byB1c2UgZml4ZWQgdmlld3BvcnQuCisgICAgICovCisgICAgLyogcGFja2FnZSAqLyBib29sZWFuIGdldFVzZUZpeGVkVmlld3BvcnQoKSB7CisgICAgICAgIHJldHVybiBtVXNlRml4ZWRWaWV3cG9ydDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHdoZXRoZXIgcHJpdmF0ZSBicm93c2luZyBpcyBlbmFibGVkLgorICAgICAqLworICAgIC8qIHBhY2thZ2UgKi8gYm9vbGVhbiBpc1ByaXZhdGVCcm93c2luZ0VuYWJsZWQoKSB7CisgICAgICAgIHJldHVybiBtUHJpdmF0ZUJyb3dzaW5nRW5hYmxlZDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHdoZXRoZXIgcHJpdmF0ZSBicm93c2luZyBpcyBlbmFibGVkLgorICAgICAqIEBwYXJhbSBmbGFnIFdoZXRoZXIgcHJpdmF0ZSBicm93c2luZyBzaG91bGQgYmUgZW5hYmxlZC4KKyAgICAgKi8KKyAgICAvKiBwYWNrYWdlICovIHN5bmNocm9uaXplZCB2b2lkIHNldFByaXZhdGVCcm93c2luZ0VuYWJsZWQoYm9vbGVhbiBmbGFnKSB7CisgICAgICAgIGlmIChtUHJpdmF0ZUJyb3dzaW5nRW5hYmxlZCAhPSBmbGFnKSB7CisgICAgICAgICAgICBtUHJpdmF0ZUJyb3dzaW5nRW5hYmxlZCA9IGZsYWc7CisgICAgICAgICAgICBwb3N0U3luYygpOworICAgICAgICB9CisgICAgfQorCisgICAgc3luY2hyb25pemVkIHZvaWQgc2V0U3ludGhldGljTGlua3NFbmFibGVkKGJvb2xlYW4gZmxhZykgeworICAgICAgICBpZiAobVN5bnRoZXRpY0xpbmtzRW5hYmxlZCAhPSBmbGFnKSB7CisgICAgICAgICAgICBtU3ludGhldGljTGlua3NFbmFibGVkID0gZmxhZzsKKyAgICAgICAgICAgIHBvc3RTeW5jKCk7CisgICAgICAgIH0KKyAgICB9CisKICAgICBpbnQgZ2V0RG91YmxlVGFwVG9hc3RDb3VudCgpIHsKICAgICAgICAgcmV0dXJuIG1Eb3VibGVUYXBUb2FzdENvdW50OwogICAgIH0KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3dlYmtpdC9XZWJUZXh0Vmlldy5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvd2Via2l0L1dlYlRleHRWaWV3LmphdmEKaW5kZXggMTlhYmVjMS4uZmNhNWVlMSAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvd2Via2l0L1dlYlRleHRWaWV3LmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvd2Via2l0L1dlYlRleHRWaWV3LmphdmEKQEAgLTI4LDYgKzI4LDcgQEAKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlOwogaW1wb3J0IGFuZHJvaWQudGV4dC5FZGl0YWJsZTsKIGltcG9ydCBhbmRyb2lkLnRleHQuSW5wdXRGaWx0ZXI7CitpbXBvcnQgYW5kcm9pZC50ZXh0LkxheW91dDsKIGltcG9ydCBhbmRyb2lkLnRleHQuU2VsZWN0aW9uOwogaW1wb3J0IGFuZHJvaWQudGV4dC5TcGFubmFibGU7CiBpbXBvcnQgYW5kcm9pZC50ZXh0LlRleHRQYWludDsKQEAgLTEwOSw2ICsxMTAsMTEgQEAKICAgICAvLyBGSVhNRTogVGhpcyBjYW4gYmUgcmVwbGFjZWQgd2l0aCBUZXh0Vmlldy5OT19GSUxURVJTIGlmIHRoYXQKICAgICAvLyBpcyBtYWRlIHB1YmxpYy9wcm90ZWN0ZWQuCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgSW5wdXRGaWx0ZXJbXSBOT19GSUxURVJTID0gbmV3IElucHV0RmlsdGVyWzBdOworICAgIC8vIEZvciBrZWVwaW5nIHRyYWNrIG9mIHRoZSBmYWN0IHRoYXQgdGhlIGRlbGV0ZSBrZXkgd2FzIHByZXNzZWQsIHNvCisgICAgLy8gd2UgY2FuIHNpbXBseSBwYXNzIGEgZGVsZXRlIGtleSBpbnN0ZWFkIG9mIGNhbGxpbmcgZGVsZXRlU2VsZWN0aW9uLgorICAgIHByaXZhdGUgYm9vbGVhbiBtR290RGVsZXRlOworICAgIHByaXZhdGUgaW50IG1EZWxTZWxTdGFydDsKKyAgICBwcml2YXRlIGludCBtRGVsU2VsRW5kOwogCiAgICAgLyoqCiAgICAgICogQ3JlYXRlIGEgbmV3IFdlYlRleHRWaWV3LgpAQCAtMTUyLDEzICsxNTgsMjIgQEAKICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICB9CiAgICAgICAgIFNwYW5uYWJsZSB0ZXh0ID0gKFNwYW5uYWJsZSkgZ2V0VGV4dCgpOwotICAgICAgICBpbnQgb2xkTGVuZ3RoID0gdGV4dC5sZW5ndGgoKTsKKyAgICAgICAgaW50IG9sZFN0YXJ0ID0gU2VsZWN0aW9uLmdldFNlbGVjdGlvblN0YXJ0KHRleHQpOworICAgICAgICBpbnQgb2xkRW5kID0gU2VsZWN0aW9uLmdldFNlbGVjdGlvbkVuZCh0ZXh0KTsKICAgICAgICAgLy8gTm9ybWFsbHkgdGhlIGRlbGV0ZSBrZXkncyBkb20gZXZlbnRzIGFyZSBzZW50IHZpYSBvblRleHRDaGFuZ2VkLgotICAgICAgICAvLyBIb3dldmVyLCBpZiB0aGUgbGVuZ3RoIGlzIHplcm8sIHRoZSB0ZXh0IGRpZCBub3QgY2hhbmdlLCBzbyB3ZQotICAgICAgICAvLyBnbyBhaGVhZCBhbmQgcGFzcyB0aGUga2V5IGRvd24gaW1tZWRpYXRlbHkuCi0gICAgICAgIGlmIChLZXlFdmVudC5LRVlDT0RFX0RFTCA9PSBrZXlDb2RlICYmIDAgPT0gb2xkTGVuZ3RoKSB7Ci0gICAgICAgICAgICBzZW5kRG9tRXZlbnQoZXZlbnQpOwotICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIC8vIEhvd2V2ZXIsIGlmIHRoZSBjdXJzb3IgaXMgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgZmllbGQsIHdoaWNoCisgICAgICAgIC8vIGluY2x1ZGVzIHRoZSBjYXNlIHdoZXJlIGl0IGhhcyB6ZXJvIGxlbmd0aCwgdGhlbiB0aGUgdGV4dCBpcyBub3QKKyAgICAgICAgLy8gY2hhbmdlZCwgc28gc2VuZCB0aGUgZXZlbnRzIGltbWVkaWF0ZWx5LgorICAgICAgICBpZiAoS2V5RXZlbnQuS0VZQ09ERV9ERUwgPT0ga2V5Q29kZSkgeworICAgICAgICAgICAgaWYgKG9sZFN0YXJ0ID09IDAgJiYgb2xkRW5kID09IDApIHsKKyAgICAgICAgICAgICAgICBzZW5kRG9tRXZlbnQoZXZlbnQpOworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGRvd24pIHsKKyAgICAgICAgICAgICAgICBtR290RGVsZXRlID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBtRGVsU2VsU3RhcnQgPSBvbGRTdGFydDsKKyAgICAgICAgICAgICAgICBtRGVsU2VsRW5kID0gb2xkRW5kOworICAgICAgICAgICAgfQogICAgICAgICB9CiAKICAgICAgICAgaWYgKChtU2luZ2xlICYmIEtleUV2ZW50LktFWUNPREVfRU5URVIgPT0ga2V5Q29kZSkpIHsKQEAgLTE5Niw5ICsyMTEsOCBAQAogICAgICAgICBpZiAoZ2V0TGF5b3V0KCkgPT0gbnVsbCkgewogICAgICAgICAgICAgbWVhc3VyZShtV2lkdGhTcGVjLCBtSGVpZ2h0U3BlYyk7CiAgICAgICAgIH0KLSAgICAgICAgaW50IG9sZFN0YXJ0ID0gU2VsZWN0aW9uLmdldFNlbGVjdGlvblN0YXJ0KHRleHQpOwotICAgICAgICBpbnQgb2xkRW5kID0gU2VsZWN0aW9uLmdldFNlbGVjdGlvbkVuZCh0ZXh0KTsKIAorICAgICAgICBpbnQgb2xkTGVuZ3RoID0gdGV4dC5sZW5ndGgoKTsKICAgICAgICAgYm9vbGVhbiBtYXhlZE91dCA9IG1NYXhMZW5ndGggIT0gLTEgJiYgb2xkTGVuZ3RoID09IG1NYXhMZW5ndGg7CiAgICAgICAgIC8vIElmIHdlIGFyZSBhdCBtYXggbGVuZ3RoLCBhbmQgdGhlcmUgaXMgYSBzZWxlY3Rpb24gcmF0aGVyIHRoYW4gYQogICAgICAgICAvLyBjdXJzb3IsIHdlIG5lZWQgdG8gc3RvcmUgdGhlIHRleHQgdG8gY29tcGFyZSBsYXRlciwgc2luY2UgdGhlIGtleQpAQCAtMzAwLDYgKzMxNCwzMyBAQAogICAgICAgICByZXR1cm4gY29ubmVjdGlvbjsKICAgICB9CiAKKyAgICAvKioKKyAgICAgKiBJbiBnZW5lcmFsLCBUZXh0VmlldyBtYWtlcyBhIGNhbGwgdG8gSW5wdXRNZXRob2RNYW5hZ2VyLnVwZGF0ZVNlbGVjdGlvbgorICAgICAqIGluIG9uRHJhdy4gIEhvd2V2ZXIsIGluIHRoZSBnZW5lcmFsIGNhc2Ugb2YgV2ViVGV4dFZpZXcsIHdlIGRvIG5vdCBkcmF3LgorICAgICAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBieSBXZWJWaWV3Lm9uRHJhdyB0byB0YWtlIGNhcmUgb2YgdGhlIHBhcnQgdGhhdAorICAgICAqIG5lZWRzIHRvIGJlIGNhbGxlZC4KKyAgICAgKi8KKyAgICAvKiBwYWNrYWdlICovIHZvaWQgb25EcmF3U3Vic3RpdHV0ZSgpIHsKKyAgICAgICAgaWYgKCF3aWxsTm90RHJhdygpKSB7CisgICAgICAgICAgICAvLyBJZiB0aGUgV2ViVGV4dFZpZXcgaXMgc2V0IHRvIGRyYXcsIHN1Y2ggYXMgaW4gdGhlIGNhc2Ugb2YgYQorICAgICAgICAgICAgLy8gcGFzc3dvcmQsIG9uRHJhdyBjYWxscyB1cGRhdGVTZWxlY3Rpb24oKSwgc28gdGhpcyBjb2RlIHBhdGggaXMKKyAgICAgICAgICAgIC8vIHVubmVjZXNzYXJ5LgorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIC8vIFRoaXMgY29kZSBpcyBjb3BpZWQgZnJvbSBUZXh0Vmlldy5vbkRyYXcoKS4gIFRoYXQgY29kZSBkb2VzIG5vdCBnZXQKKyAgICAgICAgLy8gZXhlY3V0ZWQsIGhvd2V2ZXIsIGJlY2F1c2UgdGhlIFdlYlRleHRWaWV3IGRvZXMgbm90IGRyYXcsIGFsbG93aW5nCisgICAgICAgIC8vIHdlYmtpdCdzIGRyYXdpbmcgdG8gc2hvdyB0aHJvdWdoLgorICAgICAgICBJbnB1dE1ldGhvZE1hbmFnZXIgaW1tID0gSW5wdXRNZXRob2RNYW5hZ2VyLnBlZWtJbnN0YW5jZSgpOworICAgICAgICBpZiAoaW1tICE9IG51bGwgJiYgaW1tLmlzQWN0aXZlKHRoaXMpKSB7CisgICAgICAgICAgICBTcGFubmFibGUgc3AgPSAoU3Bhbm5hYmxlKSBnZXRUZXh0KCk7CisgICAgICAgICAgICBpbnQgc2VsU3RhcnQgPSBTZWxlY3Rpb24uZ2V0U2VsZWN0aW9uU3RhcnQoc3ApOworICAgICAgICAgICAgaW50IHNlbEVuZCA9IFNlbGVjdGlvbi5nZXRTZWxlY3Rpb25FbmQoc3ApOworICAgICAgICAgICAgaW50IGNhbmRTdGFydCA9IEVkaXRhYmxlSW5wdXRDb25uZWN0aW9uLmdldENvbXBvc2luZ1NwYW5TdGFydChzcCk7CisgICAgICAgICAgICBpbnQgY2FuZEVuZCA9IEVkaXRhYmxlSW5wdXRDb25uZWN0aW9uLmdldENvbXBvc2luZ1NwYW5FbmQoc3ApOworICAgICAgICAgICAgaW1tLnVwZGF0ZVNlbGVjdGlvbih0aGlzLCBzZWxTdGFydCwgc2VsRW5kLCBjYW5kU3RhcnQsIGNhbmRFbmQpOworICAgICAgICB9CisgICAgfQorCiAgICAgQE92ZXJyaWRlCiAgICAgcHJvdGVjdGVkIHZvaWQgb25EcmF3KENhbnZhcyBjYW52YXMpIHsKICAgICAgICAgLy8gb25EcmF3IHNob3VsZCBvbmx5IGJlIGNhbGxlZCBmb3IgcGFzc3dvcmQgZmllbGRzLiAgSWYgV2ViVGV4dFZpZXcgaXMKQEAgLTMyMiw5ICszNjMsNiBAQAogICAgICAgICBzd2l0Y2ggKGFjdGlvbkNvZGUpIHsKICAgICAgICAgY2FzZSBFZGl0b3JJbmZvLklNRV9BQ1RJT05fTkVYVDoKICAgICAgICAgICAgIGlmIChtV2ViVmlldy5uYXRpdmVNb3ZlQ3Vyc29yVG9OZXh0VGV4dElucHV0KCkpIHsKLSAgICAgICAgICAgICAgICAvLyBTaW5jZSB0aGUgY3Vyc29yIHdpbGwgbm8gbG9uZ2VyIGJlIGluIHRoZSBzYW1lIHBsYWNlIGFzIHRoZQotICAgICAgICAgICAgICAgIC8vIGZvY3VzLCBzZXQgdGhlIGZvY3VzIGNvbnRyb2xsZXIgYmFjayB0byBpbmFjdGl2ZQotICAgICAgICAgICAgICAgIG1XZWJWaWV3LnNldEZvY3VzQ29udHJvbGxlckluYWN0aXZlKCk7CiAgICAgICAgICAgICAgICAgLy8gUHJlZW1wdGl2ZWx5IHJlYnVpbGQgdGhlIFdlYlRleHRWaWV3LCBzbyB0aGF0IHRoZSBhY3Rpb24gd2lsbAogICAgICAgICAgICAgICAgIC8vIGJlIHNldCBwcm9wZXJseS4KICAgICAgICAgICAgICAgICBtV2ViVmlldy5yZWJ1aWxkV2ViVGV4dFZpZXcoKTsKQEAgLTM2MCwxOSArMzk4LDggQEAKIAogICAgIEBPdmVycmlkZQogICAgIHByb3RlY3RlZCB2b2lkIG9uU2VsZWN0aW9uQ2hhbmdlZChpbnQgc2VsU3RhcnQsIGludCBzZWxFbmQpIHsKLSAgICAgICAgaWYgKG1JblNldFRleHRBbmRLZWVwU2VsZWN0aW9uKSByZXR1cm47Ci0gICAgICAgIC8vIFRoaXMgY29kZSBpcyBjb3BpZWQgZnJvbSBUZXh0Vmlldy5vbkRyYXcoKS4gIFRoYXQgY29kZSBkb2VzIG5vdCBnZXQKLSAgICAgICAgLy8gZXhlY3V0ZWQsIGhvd2V2ZXIsIGJlY2F1c2UgdGhlIFdlYlRleHRWaWV3IGRvZXMgbm90IGRyYXcsIGFsbG93aW5nCi0gICAgICAgIC8vIHdlYmtpdCdzIGRyYXdpbmcgdG8gc2hvdyB0aHJvdWdoLgotICAgICAgICBJbnB1dE1ldGhvZE1hbmFnZXIgaW1tID0gSW5wdXRNZXRob2RNYW5hZ2VyLnBlZWtJbnN0YW5jZSgpOwotICAgICAgICBpZiAoaW1tICE9IG51bGwgJiYgaW1tLmlzQWN0aXZlKHRoaXMpKSB7Ci0gICAgICAgICAgICBTcGFubmFibGUgc3AgPSAoU3Bhbm5hYmxlKSBnZXRUZXh0KCk7Ci0gICAgICAgICAgICBpbnQgY2FuZFN0YXJ0ID0gRWRpdGFibGVJbnB1dENvbm5lY3Rpb24uZ2V0Q29tcG9zaW5nU3BhblN0YXJ0KHNwKTsKLSAgICAgICAgICAgIGludCBjYW5kRW5kID0gRWRpdGFibGVJbnB1dENvbm5lY3Rpb24uZ2V0Q29tcG9zaW5nU3BhbkVuZChzcCk7Ci0gICAgICAgICAgICBpbW0udXBkYXRlU2VsZWN0aW9uKHRoaXMsIHNlbFN0YXJ0LCBzZWxFbmQsIGNhbmRTdGFydCwgY2FuZEVuZCk7Ci0gICAgICAgIH0KICAgICAgICAgaWYgKCFtRnJvbVdlYktpdCAmJiAhbUZyb21Gb2N1c0NoYW5nZSAmJiAhbUZyb21TZXRJbnB1dFR5cGUKLSAgICAgICAgICAgICAgICAmJiBtV2ViVmlldyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgJiYgbVdlYlZpZXcgIT0gbnVsbCAmJiAhbUluU2V0VGV4dEFuZEtlZXBTZWxlY3Rpb24pIHsKICAgICAgICAgICAgIGlmIChEZWJ1Z0ZsYWdzLldFQl9URVhUX1ZJRVcpIHsKICAgICAgICAgICAgICAgICBMb2cudihMT0dUQUcsICJvblNlbGVjdGlvbkNoYW5nZWQgc2VsU3RhcnQ9IiArIHNlbFN0YXJ0CiAgICAgICAgICAgICAgICAgICAgICAgICArICIgc2VsRW5kPSIgKyBzZWxFbmQpOwpAQCAtMzk3LDE3ICs0MjQsMzggQEAKICAgICAgICAgbVByZUNoYW5nZSA9IHBvc3RDaGFuZ2U7CiAgICAgICAgIGlmICgwID09IGNvdW50KSB7CiAgICAgICAgICAgICBpZiAoYmVmb3JlID4gMCkgeworICAgICAgICAgICAgICAgIC8vIEZvciB0aGlzIGFuZCBhbGwgY2hhbmdlcyB0byB0aGUgdGV4dCwgdXBkYXRlIG91ciBjYWNoZQorICAgICAgICAgICAgICAgIHVwZGF0ZUNhY2hlZFRleHRmaWVsZCgpOworICAgICAgICAgICAgICAgIGlmIChtR290RGVsZXRlKSB7CisgICAgICAgICAgICAgICAgICAgIG1Hb3REZWxldGUgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgaW50IG9sZEVuZCA9IHN0YXJ0ICsgYmVmb3JlOworICAgICAgICAgICAgICAgICAgICBpZiAobURlbFNlbEVuZCA9PSBvbGRFbmQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiAobURlbFNlbFN0YXJ0ID09IHN0YXJ0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKG1EZWxTZWxTdGFydCA9PSBvbGRFbmQgJiYgYmVmb3JlID09IDEpKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWYgdGhlIHNlbGVjdGlvbiBpcyBzZXQgdXAgcHJvcGVybHkgYmVmb3JlIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgLy8gZGVsZXRlLCBzZW5kIHRoZSBET00gZXZlbnRzLgorICAgICAgICAgICAgICAgICAgICAgICAgc2VuZERvbUV2ZW50KG5ldyBLZXlFdmVudChLZXlFdmVudC5BQ1RJT05fRE9XTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgS2V5RXZlbnQuS0VZQ09ERV9ERUwpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbmREb21FdmVudChuZXcgS2V5RXZlbnQoS2V5RXZlbnQuQUNUSU9OX1VQLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBLZXlFdmVudC5LRVlDT0RFX0RFTCkpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIC8vIFRoaXMgd2FzIHNpbXBseSBhIGRlbGV0ZSBvciBhIGN1dCwgc28ganVzdCBkZWxldGUgdGhlCiAgICAgICAgICAgICAgICAgLy8gc2VsZWN0aW9uLgogICAgICAgICAgICAgICAgIG1XZWJWaWV3LmRlbGV0ZVNlbGVjdGlvbihzdGFydCwgc3RhcnQgKyBiZWZvcmUpOwotICAgICAgICAgICAgICAgIC8vIEZvciB0aGlzIGFuZCBhbGwgY2hhbmdlcyB0byB0aGUgdGV4dCwgdXBkYXRlIG91ciBjYWNoZQotICAgICAgICAgICAgICAgIHVwZGF0ZUNhY2hlZFRleHRmaWVsZCgpOwogICAgICAgICAgICAgfQorICAgICAgICAgICAgbUdvdERlbGV0ZSA9IGZhbHNlOwogICAgICAgICAgICAgLy8gYmVmb3JlIHNob3VsZCBuZXZlciBiZSBuZWdhdGl2ZSwgc28gd2hldGhlciBpdCB3YXMgYSBjdXQKICAgICAgICAgICAgIC8vIChoYW5kbGVkIGFib3ZlKSwgb3IgYmVmb3JlIGlzIDAsIGluIHdoaWNoIGNhc2Ugbm90aGluZyBoYXMKICAgICAgICAgICAgIC8vIGNoYW5nZWQsIHdlIHNob3VsZCByZXR1cm4uCiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KKyAgICAgICAgLy8gRW5zdXJlIHRoYXQgdGhpcyBmbGFnIGdldHMgY2xlYXJlZCwgc2luY2Ugd2l0aCBhdXRvY29ycmVjdCBvbiwgYQorICAgICAgICAvLyBkZWxldGUga2V5IHByZXNzIG1heSBoYXZlIGEgbW9yZSBjb21wbGV4IHJlc3VsdCB0aGFuIGRlbGV0aW5nIG9uZQorICAgICAgICAvLyBjaGFyYWN0ZXIgb3IgdGhlIGV4aXN0aW5nIHNlbGVjdGlvbiwgc28gaXQgd2lsbCBub3QgZ2V0IGNsZWFyZWQKKyAgICAgICAgLy8gYWJvdmUuCisgICAgICAgIG1Hb3REZWxldGUgPSBmYWxzZTsKICAgICAgICAgLy8gRmluZCB0aGUgbGFzdCBjaGFyYWN0ZXIgYmVpbmcgcmVwbGFjZWQuICBJZiBpdCBjYW4gYmUgcmVwcmVzZW50ZWQgYnkKICAgICAgICAgLy8gZXZlbnRzLCB3ZSB3aWxsIHBhc3MgdGhlbSB0byBuYXRpdmUgKGFmdGVyIHJlcGxhY2luZyB0aGUgYmVnaW5uaW5nCiAgICAgICAgIC8vIG9mIHRoZSBjaGFuZ2VkIHRleHQpLCBzbyB3ZSBjYW4gc2VlIGphdmFzY3JpcHQgZXZlbnRzLgpAQCAtNDgxLDkgKzUyOSwxMCBAQAogICAgICAgICAgICAgLy8gdG8gYmlnIGZvciB0aGUgY2FzZSBvZiBhIHNtYWxsIHRleHRmaWVsZC4KICAgICAgICAgICAgIGludCBzbWFsbGVyU2xvcCA9IHNsb3AvMjsKICAgICAgICAgICAgIGlmIChkeCA+IHNtYWxsZXJTbG9wIHx8IGR5ID4gc21hbGxlclNsb3ApIHsKLSAgICAgICAgICAgICAgICBpZiAobVdlYlZpZXcgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBmbG9hdCBtYXhTY3JvbGxYID0gKGZsb2F0KSBUb3VjaC5nZXRNYXhTY3JvbGxYKHRoaXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldExheW91dCgpLCBtU2Nyb2xsWSk7CisgICAgICAgICAgICAgICAgTGF5b3V0IGxheW91dCA9IGdldExheW91dCgpOworICAgICAgICAgICAgICAgIGlmIChtV2ViVmlldyAhPSBudWxsICYmIGxheW91dCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGZsb2F0IG1heFNjcm9sbFggPSAoZmxvYXQpIFRvdWNoLmdldE1heFNjcm9sbFgodGhpcywgbGF5b3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1TY3JvbGxZKTsKICAgICAgICAgICAgICAgICAgICAgaWYgKERlYnVnRmxhZ3MuV0VCX1RFWFRfVklFVykgewogICAgICAgICAgICAgICAgICAgICAgICAgTG9nLnYoTE9HVEFHLCAib25Ub3VjaEV2ZW50IHg9IiArIG1TY3JvbGxYICsgIiB5PSIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBtU2Nyb2xsWSArICIgbWF4WD0iICsgbWF4U2Nyb2xsWCk7CkBAIC01NzgsMTYgKzYyNywzMSBAQAogICAgICAqLwogICAgIC8qIHBhY2thZ2UgKi8gdm9pZCByZW1vdmUoKSB7CiAgICAgICAgIC8vIGhpZGUgdGhlIHNvZnQga2V5Ym9hcmQgd2hlbiB0aGUgZWRpdCB0ZXh0IGlzIG91dCBvZiBmb2N1cwotICAgICAgICBJbnB1dE1ldGhvZE1hbmFnZXIuZ2V0SW5zdGFuY2UobUNvbnRleHQpLmhpZGVTb2Z0SW5wdXRGcm9tV2luZG93KAotICAgICAgICAgICAgICAgIGdldFdpbmRvd1Rva2VuKCksIDApOworICAgICAgICBJbnB1dE1ldGhvZE1hbmFnZXIgaW1tID0gSW5wdXRNZXRob2RNYW5hZ2VyLmdldEluc3RhbmNlKG1Db250ZXh0KTsKKyAgICAgICAgaWYgKGltbS5pc0FjdGl2ZSh0aGlzKSkgeworICAgICAgICAgICAgaW1tLmhpZGVTb2Z0SW5wdXRGcm9tV2luZG93KGdldFdpbmRvd1Rva2VuKCksIDApOworICAgICAgICB9CiAgICAgICAgIG1XZWJWaWV3LnJlbW92ZVZpZXcodGhpcyk7CiAgICAgICAgIG1XZWJWaWV3LnJlcXVlc3RGb2N1cygpOwogICAgIH0KIAorICAgIC8qKgorICAgICAqIE1vdmUgdGhlIGNhcmV0L3NlbGVjdGlvbiBpbnRvIHZpZXcuCisgICAgICovCiAgICAgLyogcGFja2FnZSAqLyB2b2lkIGJyaW5nSW50b1ZpZXcoKSB7Ci0gICAgICAgIGlmIChnZXRMYXlvdXQoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBicmluZ1BvaW50SW50b1ZpZXcoU2VsZWN0aW9uLmdldFNlbGVjdGlvbkVuZChnZXRUZXh0KCkpKTsKKyAgICAgICAgYnJpbmdQb2ludEludG9WaWV3KFNlbGVjdGlvbi5nZXRTZWxlY3Rpb25FbmQoZ2V0VGV4dCgpKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gYnJpbmdQb2ludEludG9WaWV3KGludCBvZmZzZXQpIHsKKyAgICAgICAgaWYgKG1XZWJWaWV3ID09IG51bGwpIHJldHVybiBmYWxzZTsKKyAgICAgICAgaWYgKG1XZWJWaWV3Lm5hdGl2ZUZvY3VzQ2FuZGlkYXRlSXNQYXNzd29yZCgpKSB7CisgICAgICAgICAgICByZXR1cm4gZ2V0TGF5b3V0KCkgIT0gbnVsbCAmJiBzdXBlci5icmluZ1BvaW50SW50b1ZpZXcob2Zmc2V0KTsKICAgICAgICAgfQorICAgICAgICAvLyBGb3Igbm9uIHBhc3N3b3JkIHRleHQgaW5wdXQsIHRlbGwgd2Via2l0IHRvIG1vdmUgdGhlIGNhcmV0L3NlbGVjdGlvbgorICAgICAgICAvLyBvbiBzY3JlZW4sIHNpbmNlIHdlYmtpdCBkcmF3cyB0aGVtLgorICAgICAgICBtV2ViVmlldy5yZXZlYWxTZWxlY3Rpb24oKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQogCiAgICAgLyoqCkBAIC02NjcsNiArNzMxLDcgQEAKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIFNlbGVjdGlvbi5zZXRTZWxlY3Rpb24odGV4dCwgc2VsZWN0aW9uLCBzZWxlY3Rpb24pOwogICAgICAgICB9CisgICAgICAgIGlmIChtV2ViVmlldyAhPSBudWxsKSBtV2ViVmlldy5pbmNyZW1lbnRUZXh0R2VuZXJhdGlvbigpOwogICAgIH0KIAogICAgIC8qKgpAQCAtOTE5LDE0ICs5ODQsNCBAQAogICAgIC8qIHBhY2thZ2UgKi8gdm9pZCB1cGRhdGVDYWNoZWRUZXh0ZmllbGQoKSB7CiAgICAgICAgIG1XZWJWaWV3LnVwZGF0ZUNhY2hlZFRleHRmaWVsZChnZXRUZXh0KCkudG9TdHJpbmcoKSk7CiAgICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gcmVxdWVzdFJlY3RhbmdsZU9uU2NyZWVuKFJlY3QgcmVjdGFuZ2xlKSB7Ci0gICAgICAgIC8vIGRvbid0IHNjcm9sbCB3aGlsZSBpbiB6b29tIGFuaW1hdGlvbi4gV2hlbiBpdCBpcyBkb25lLCB3ZSB3aWxsIGFkanVzdAotICAgICAgICAvLyB0aGUgV2ViVGV4dFZpZXcgaWYgaXQgaXMgaW4gZWRpdGluZyBtb2RlLgotICAgICAgICBpZiAoIW1XZWJWaWV3LmluQW5pbWF0ZVpvb20oKSkgewotICAgICAgICAgICAgcmV0dXJuIHN1cGVyLnJlcXVlc3RSZWN0YW5nbGVPblNjcmVlbihyZWN0YW5nbGUpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9CiB9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC93ZWJraXQvV2ViVmlldy5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvd2Via2l0L1dlYlZpZXcuamF2YQppbmRleCAyYzNkNGI0Li41ZDRhZTZkIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC93ZWJraXQvV2ViVmlldy5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3dlYmtpdC9XZWJWaWV3LmphdmEKQEAgLTE2LDM5ICsxNiw0MSBAQAogCiBwYWNrYWdlIGFuZHJvaWQud2Via2l0OwogCi1pbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwuUjsKLQogaW1wb3J0IGFuZHJvaWQuYW5ub3RhdGlvbi5XaWRnZXQ7CiBpbXBvcnQgYW5kcm9pZC5hcHAuQWxlcnREaWFsb2c7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkJyb2FkY2FzdFJlY2VpdmVyOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5DbGlwYm9hcmRNYW5hZ2VyOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5EaWFsb2dJbnRlcmZhY2U7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudEZpbHRlcjsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuRGlhbG9nSW50ZXJmYWNlLk9uQ2FuY2VsTGlzdGVuZXI7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uUGFja2FnZUluZm87CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLlBhY2thZ2VNYW5hZ2VyOwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuUmVzb3VyY2VzOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7CiBpbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5EYXRhU2V0T2JzZXJ2ZXI7CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5CaXRtYXA7Ci1pbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5CaXRtYXBGYWN0b3J5OwotaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwU2hhZGVyOwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQ2FudmFzOwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQ29sb3I7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5Db3JuZXJQYXRoRWZmZWN0OworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuRHJhd0ZpbHRlcjsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkludGVycG9sYXRvcjsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlBhaW50OworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUGFpbnRGbGFnc0RyYXdGaWx0ZXI7CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5QaWN0dXJlOwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUG9pbnQ7CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5SZWN0OwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUmVjdEY7CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5SZWdpb247Ci1pbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5TaGFkZXI7CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZTsKIGltcG9ydCBhbmRyb2lkLm5ldC5Vcmk7CiBpbXBvcnQgYW5kcm9pZC5uZXQuaHR0cC5Tc2xDZXJ0aWZpY2F0ZTsKK2ltcG9ydCBhbmRyb2lkLm9zLkFzeW5jVGFzazsKIGltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKIGltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXI7CiBpbXBvcnQgYW5kcm9pZC5vcy5NZXNzYWdlOwotaW1wb3J0IGFuZHJvaWQub3MuU2VydmljZU1hbmFnZXI7CiBpbXBvcnQgYW5kcm9pZC5vcy5TeXN0ZW1DbG9jazsKLWltcG9ydCBhbmRyb2lkLnRleHQuSUNsaXBib2FyZDsKK2ltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLlNldHRpbmdzOworaW1wb3J0IGFuZHJvaWQuc3BlZWNoLnR0cy5UZXh0VG9TcGVlY2g7CiBpbXBvcnQgYW5kcm9pZC50ZXh0LlNlbGVjdGlvbjsKIGltcG9ydCBhbmRyb2lkLnRleHQuU3Bhbm5hYmxlOwogaW1wb3J0IGFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQ7CkBAIC02Niw0MCArNjgsNDIgQEAKIGltcG9ydCBhbmRyb2lkLnZpZXcuVmlld0NvbmZpZ3VyYXRpb247CiBpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXdHcm91cDsKIGltcG9ydCBhbmRyb2lkLnZpZXcuVmlld1RyZWVPYnNlcnZlcjsKLWltcG9ydCBhbmRyb2lkLnZpZXcuYW5pbWF0aW9uLkFscGhhQW5pbWF0aW9uOworaW1wb3J0IGFuZHJvaWQudmlldy5hY2Nlc3NpYmlsaXR5LkFjY2Vzc2liaWxpdHlNYW5hZ2VyOwogaW1wb3J0IGFuZHJvaWQudmlldy5pbnB1dG1ldGhvZC5FZGl0b3JJbmZvOwogaW1wb3J0IGFuZHJvaWQudmlldy5pbnB1dG1ldGhvZC5JbnB1dENvbm5lY3Rpb247CiBpbXBvcnQgYW5kcm9pZC52aWV3LmlucHV0bWV0aG9kLklucHV0TWV0aG9kTWFuYWdlcjsKIGltcG9ydCBhbmRyb2lkLndlYmtpdC5XZWJUZXh0Vmlldy5BdXRvQ29tcGxldGVBZGFwdGVyOwogaW1wb3J0IGFuZHJvaWQud2Via2l0LldlYlZpZXdDb3JlLkV2ZW50SHViOwogaW1wb3J0IGFuZHJvaWQud2Via2l0LldlYlZpZXdDb3JlLlRvdWNoRXZlbnREYXRhOworaW1wb3J0IGFuZHJvaWQud2Via2l0LldlYlZpZXdDb3JlLlRvdWNoSGlnaGxpZ2h0RGF0YTsKIGltcG9ydCBhbmRyb2lkLndpZGdldC5BYnNvbHV0ZUxheW91dDsKIGltcG9ydCBhbmRyb2lkLndpZGdldC5BZGFwdGVyOwogaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkFkYXB0ZXJWaWV3OwogaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkFkYXB0ZXJWaWV3Lk9uSXRlbUNsaWNrTGlzdGVuZXI7CiBpbXBvcnQgYW5kcm9pZC53aWRnZXQuQXJyYXlBZGFwdGVyOwogaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkNoZWNrZWRUZXh0VmlldzsKLWltcG9ydCBhbmRyb2lkLndpZGdldC5FZGdlR2xvdzsKLWltcG9ydCBhbmRyb2lkLndpZGdldC5GcmFtZUxheW91dDsKIGltcG9ydCBhbmRyb2lkLndpZGdldC5MaW5lYXJMYXlvdXQ7CiBpbXBvcnQgYW5kcm9pZC53aWRnZXQuTGlzdFZpZXc7Ci1pbXBvcnQgYW5kcm9pZC53aWRnZXQuT3ZlclNjcm9sbGVyOworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlNjcm9sbGVyOwogaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlRvYXN0OwotaW1wb3J0IGFuZHJvaWQud2lkZ2V0Llpvb21CdXR0b25zQ29udHJvbGxlcjsKLWltcG9ydCBhbmRyb2lkLndpZGdldC5ab29tQ29udHJvbHM7CisKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuQXNzZXJ0OwogCiBpbXBvcnQgamF2YS5pby5GaWxlOwogaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOwogaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOwogaW1wb3J0IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW1SZWFkZXI7CiBpbXBvcnQgamF2YS5uZXQuVVJMRGVjb2RlcjsKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwogaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwogaW1wb3J0IGphdmEudXRpbC5MaXN0OwogaW1wb3J0IGphdmEudXRpbC5NYXA7CiBpbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5Bc3NlcnQ7CitpbXBvcnQgamF2YS51dGlsLnJlZ2V4Lk1hdGNoZXI7CitpbXBvcnQgamF2YS51dGlsLnJlZ2V4LlBhdHRlcm47CiAKIC8qKgogICogPHA+QSBWaWV3IHRoYXQgZGlzcGxheXMgd2ViIHBhZ2VzLiBUaGlzIGNsYXNzIGlzIHRoZSBiYXNpcyB1cG9uIHdoaWNoIHlvdQpAQCAtMTE2LDcgKzEyMCw3IEBACiAgKiA8cHJlPiZsdDt1c2VzLXBlcm1pc3Npb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnBlcm1pc3Npb24uSU5URVJORVQiIC8+PC9wcmU+CiAgKgogICogPHA+VGhpcyBtdXN0IGJlIGEgY2hpbGQgb2YgdGhlIDxhCi0gKiBocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvdG9waWNzL21hbmlmZXN0L21hbmlmZXN0LWVsZW1lbnQuaHRtbCI+e0Bjb2RlICZsdDttYW5pZmVzdCZndDt9PC9hPgorICogaHJlZj0ie0Bkb2NSb290fWd1aWRlL3RvcGljcy9tYW5pZmVzdC9tYW5pZmVzdC1lbGVtZW50Lmh0bWwiPntAY29kZSA8bWFuaWZlc3Q+fTwvYT4KICAqIGVsZW1lbnQuPC9wPgogICoKICAqIDxwPlNlZSB0aGUgPGEgaHJlZj0ie0Bkb2NSb290fXJlc291cmNlcy90dXRvcmlhbHMvdmlld3MvaGVsbG8td2Vidmlldy5odG1sIj5XZWIgVmlldwpAQCAtMTM5LDcgKzE0Myw3IEBACiAgKiA8L3ByZT4KICAqIDxwPlNlZSB7QGxpbmsgYW5kcm9pZC5jb250ZW50LkludGVudH0gZm9yIG1vcmUgaW5mb3JtYXRpb24uPC9wPgogICoKLSAqIDxwPlRvIHByb3ZpZGUgYSBXZWJWaWV3IGluIHlvdXIgb3duIEFjdGl2aXR5LCBpbmNsdWRlIGEge0Bjb2RlICZsdDtXZWJWaWV3Jmd0O30gaW4geW91ciBsYXlvdXQsCisgKiA8cD5UbyBwcm92aWRlIGEgV2ViVmlldyBpbiB5b3VyIG93biBBY3Rpdml0eSwgaW5jbHVkZSBhIHtAY29kZSA8V2ViVmlldz59IGluIHlvdXIgbGF5b3V0LAogICogb3Igc2V0IHRoZSBlbnRpcmUgQWN0aXZpdHkgd2luZG93IGFzIGEgV2ViVmlldyBkdXJpbmcge0BsaW5rCiAgKiBhbmRyb2lkLmFwcC5BY3Rpdml0eSNvbkNyZWF0ZShCdW5kbGUpIG9uQ3JlYXRlKCl9OjwvcD4KICAqIDxwcmUgY2xhc3M9InByZXR0eXByaW50Ij4KQEAgLTI4Niw3ICsyOTAsNyBAQAogICogbG93IGRlbnNpdHkgc2NyZWVucyBzY2FsZSBkb3duLiBUaGlzIGlzIGFsc28gdGhlIGRlZmF1bHQgYmVoYXZpb3IuPC9saT4KICAqIDxsaT57QGNvZGUgbG93LWRwaX0gLSBVc2UgbGRwaSBhcyB0aGUgdGFyZ2V0IGRwaS4gTWVkaXVtIGFuZCBoaWdoIGRlbnNpdHkgc2NyZWVucyBzY2FsZSB1cAogICogYXMgYXBwcm9wcmlhdGUuPC9saT4KLSAqIDxsaT48ZW0+e0Bjb2RlICZsdDt2YWx1ZSZndDt9PC9lbT4gLSBTcGVjaWZ5IGEgZHBpIHZhbHVlIHRvIHVzZSBhcyB0aGUgdGFyZ2V0IGRwaSAoYWNjZXB0ZWQKKyAqIDxsaT48ZW0+e0Bjb2RlIDx2YWx1ZT59PC9lbT4gLSBTcGVjaWZ5IGEgZHBpIHZhbHVlIHRvIHVzZSBhcyB0aGUgdGFyZ2V0IGRwaSAoYWNjZXB0ZWQKICAqIHZhbHVlcyBhcmUgNzAtNDAwKS48L2xpPgogICogPC91bD4KICAqIDxwPkhlcmUncyBhbiBleGFtcGxlIG1ldGEgdGFnIHRvIHNwZWNpZnkgdGhlIHRhcmdldCBkZW5zaXR5OjwvcD4KQEAgLTI5OCw3ICszMDIsNyBAQAogICogcHJvcGVydHkgdG8ge0Bjb2RlIGRldmljZS1kcGl9LiBUaGlzIHN0b3BzIEFuZHJvaWQgZnJvbSBwZXJmb3JtaW5nIHNjYWxpbmcgaW4geW91ciB3ZWIgcGFnZSBhbmQKICAqIGFsbG93cyB5b3UgdG8gbWFrZSB0aGUgbmVjZXNzYXJ5IGFkanVzdG1lbnRzIGZvciBlYWNoIGRlbnNpdHkgdmlhIENTUyBhbmQgSmF2YVNjcmlwdC48L3A+CiAgKgotICogCisgKgogICovCiBAV2lkZ2V0CiBwdWJsaWMgY2xhc3MgV2ViVmlldyBleHRlbmRzIEFic29sdXRlTGF5b3V0CkBAIC0zMTUsNDkgKzMxOSw3IEBACiAKICAgICBzdGF0aWMgZmluYWwgU3RyaW5nIExPR1RBRyA9ICJ3ZWJ2aWV3IjsKIAotICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIEV4dGVuZGVkWm9vbUNvbnRyb2xzIGV4dGVuZHMgRnJhbWVMYXlvdXQgewotICAgICAgICBwdWJsaWMgRXh0ZW5kZWRab29tQ29udHJvbHMoQ29udGV4dCBjb250ZXh0LCBBdHRyaWJ1dGVTZXQgYXR0cnMpIHsKLSAgICAgICAgICAgIHN1cGVyKGNvbnRleHQsIGF0dHJzKTsKLSAgICAgICAgICAgIExheW91dEluZmxhdGVyIGluZmxhdGVyID0gKExheW91dEluZmxhdGVyKQotICAgICAgICAgICAgICAgICAgICBjb250ZXh0LmdldFN5c3RlbVNlcnZpY2UoQ29udGV4dC5MQVlPVVRfSU5GTEFURVJfU0VSVklDRSk7Ci0gICAgICAgICAgICBpbmZsYXRlci5pbmZsYXRlKGNvbS5hbmRyb2lkLmludGVybmFsLlIubGF5b3V0Lnpvb21fbWFnbmlmeSwgdGhpcywgdHJ1ZSk7Ci0gICAgICAgICAgICBtUGx1c01pbnVzWm9vbUNvbnRyb2xzID0gKFpvb21Db250cm9scykgZmluZFZpZXdCeUlkKAotICAgICAgICAgICAgICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmlkLnpvb21Db250cm9scyk7Ci0gICAgICAgICAgICBmaW5kVmlld0J5SWQoY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5pZC56b29tTWFnbmlmeSkuc2V0VmlzaWJpbGl0eSgKLSAgICAgICAgICAgICAgICAgICAgVmlldy5HT05FKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHNob3coYm9vbGVhbiBzaG93Wm9vbSwgYm9vbGVhbiBjYW5ab29tT3V0KSB7Ci0gICAgICAgICAgICBtUGx1c01pbnVzWm9vbUNvbnRyb2xzLnNldFZpc2liaWxpdHkoCi0gICAgICAgICAgICAgICAgICAgIHNob3dab29tID8gVmlldy5WSVNJQkxFIDogVmlldy5HT05FKTsKLSAgICAgICAgICAgIGZhZGUoVmlldy5WSVNJQkxFLCAwLjBmLCAxLjBmKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIGhpZGUoKSB7Ci0gICAgICAgICAgICBmYWRlKFZpZXcuR09ORSwgMS4wZiwgMC4wZik7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgZmFkZShpbnQgdmlzaWJpbGl0eSwgZmxvYXQgc3RhcnRBbHBoYSwgZmxvYXQgZW5kQWxwaGEpIHsKLSAgICAgICAgICAgIEFscGhhQW5pbWF0aW9uIGFuaW0gPSBuZXcgQWxwaGFBbmltYXRpb24oc3RhcnRBbHBoYSwgZW5kQWxwaGEpOwotICAgICAgICAgICAgYW5pbS5zZXREdXJhdGlvbig1MDApOwotICAgICAgICAgICAgc3RhcnRBbmltYXRpb24oYW5pbSk7Ci0gICAgICAgICAgICBzZXRWaXNpYmlsaXR5KHZpc2liaWxpdHkpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGJvb2xlYW4gaGFzRm9jdXMoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbVBsdXNNaW51c1pvb21Db250cm9scy5oYXNGb2N1cygpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgc2V0T25ab29tSW5DbGlja0xpc3RlbmVyKE9uQ2xpY2tMaXN0ZW5lciBsaXN0ZW5lcikgewotICAgICAgICAgICAgbVBsdXNNaW51c1pvb21Db250cm9scy5zZXRPblpvb21JbkNsaWNrTGlzdGVuZXIobGlzdGVuZXIpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgc2V0T25ab29tT3V0Q2xpY2tMaXN0ZW5lcihPbkNsaWNrTGlzdGVuZXIgbGlzdGVuZXIpIHsKLSAgICAgICAgICAgIG1QbHVzTWludXNab29tQ29udHJvbHMuc2V0T25ab29tT3V0Q2xpY2tMaXN0ZW5lcihsaXN0ZW5lcik7Ci0gICAgICAgIH0KLQotICAgICAgICBab29tQ29udHJvbHMgICAgbVBsdXNNaW51c1pvb21Db250cm9sczsKLSAgICB9CisgICAgcHJpdmF0ZSBab29tTWFuYWdlciBtWm9vbU1hbmFnZXI7CiAKICAgICAvKioKICAgICAgKiAgVHJhbnNwb3J0YXRpb24gb2JqZWN0IGZvciByZXR1cm5pbmcgV2ViVmlldyBhY3Jvc3MgdGhyZWFkIGJvdW5kYXJpZXMuCkBAIC00MDMsNiArMzY1LDggQEAKICAgICAvLyBtb3JlIGtleSBldmVudHMuCiAgICAgcHJpdmF0ZSBpbnQgbVRleHRHZW5lcmF0aW9uOwogCisgICAgLyogcGFja2FnZSAqLyB2b2lkIGluY3JlbWVudFRleHRHZW5lcmF0aW9uKCkgeyBtVGV4dEdlbmVyYXRpb24rKzsgfQorCiAgICAgLy8gVXNlZCBieSBXZWJWaWV3Q29yZSB0byBjcmVhdGUgY2hpbGQgdmlld3MuCiAgICAgLyogcGFja2FnZSAqLyBmaW5hbCBWaWV3TWFuYWdlciBtVmlld01hbmFnZXI7CiAKQEAgLTQ1MCw2ICs0MTQsMTQgQEAKICAgICBwcml2YXRlIGZsb2F0IG1MYXN0VmVsWDsKICAgICBwcml2YXRlIGZsb2F0IG1MYXN0VmVsWTsKIAorICAgIC8vIEEgcG9pbnRlciB0byB0aGUgbmF0aXZlIHNjcm9sbGFibGUgbGF5ZXIgd2hlbiBkcmFnZ2luZyBsYXllcnMuICBPbmx5CisgICAgLy8gdmFsaWQgd2hlbiBtVG91Y2hNb2RlIGlzIFRPVUNIX0RSQUdfTEFZRVJfTU9ERS4KKyAgICBwcml2YXRlIGludCBtU2Nyb2xsaW5nTGF5ZXI7CisKKyAgICAvLyBvbmx5IHRyaWdnZXIgYWNjZWxlcmF0ZWQgZmxpbmcgaWYgdGhlIG5ldyB2ZWxvY2l0eSBpcyBhdCBsZWFzdAorICAgIC8vIE1JTklNVU1fVkVMT0NJVFlfUkFUSU9fRk9SX0FDQ0VMRVJBVElPTiB0aW1lcyBvZiB0aGUgcHJldmlvdXMgdmVsb2NpdHkKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBmbG9hdCBNSU5JTVVNX1ZFTE9DSVRZX1JBVElPX0ZPUl9BQ0NFTEVSQVRJT04gPSAwLjJmOworCiAgICAgLyoqCiAgICAgICogVG91Y2ggbW9kZQogICAgICAqLwpAQCAtNDYyLDExICs0MzQsNyBAQAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBUT1VDSF9ET1VCTEVfVEFQX01PREUgPSA2OwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBUT1VDSF9ET05FX01PREUgPSA3OwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBUT1VDSF9QSU5DSF9EUkFHID0gODsKLQotICAgIC8qKgotICAgICAqIFRydWUgaWYgd2UgaGF2ZSBhIHRvdWNoIHBhbmVsIGNhcGFibGUgb2YgZGV0ZWN0aW5nIHNtb290aCBwYW4vc2NhbGUgYXQgdGhlIHNhbWUgdGltZQotICAgICAqLwotICAgIHByaXZhdGUgYm9vbGVhbiBtQWxsb3dQYW5BbmRTY2FsZTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgVE9VQ0hfRFJBR19MQVlFUl9NT0RFID0gOTsKIAogICAgIC8vIFdoZXRoZXIgdG8gZm9yd2FyZCB0aGUgdG91Y2ggZXZlbnRzIHRvIFdlYkNvcmUKICAgICBwcml2YXRlIGJvb2xlYW4gbUZvcndhcmRUb3VjaEV2ZW50cyA9IGZhbHNlOwpAQCAtNTA1LDEwICs0NzMsNiBAQAogICAgIC8vIHRydWUgaWYgb25QYXVzZSBoYXMgYmVlbiBjYWxsZWQgKGFuZCBub3Qgb25SZXN1bWUpCiAgICAgcHJpdmF0ZSBib29sZWFuIG1Jc1BhdXNlZDsKIAotICAgIC8vIHRydWUgaWYsIGR1cmluZyBhIHRyYW5zaXRpb24gdG8gYSBuZXcgcGFnZSwgd2UncmUgZGVsYXlpbmcKLSAgICAvLyBkZWxldGluZyBhIHJvb3QgbGF5ZXIgdW50aWwgdGhlcmUncyBzb21ldGhpbmcgdG8gZHJhdyBvZiB0aGUgbmV3IHBhZ2UuCi0gICAgcHJpdmF0ZSBib29sZWFuIG1EZWxheWVkRGVsZXRlUm9vdExheWVyOwotCiAgICAgLyoqCiAgICAgICogQ3VzdG9taXphYmxlIGNvbnN0YW50CiAgICAgICovCkBAIC01MzAsOSArNDk0LDYgQEAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUlOX0ZMSU5HX1RJTUUgPSAyNTA7CiAgICAgLy8gZHJhdyB1bmZpbHRlcmVkIGFmdGVyIGRyYWcgaXMgaGVsZCB3aXRob3V0IG1vdmVtZW50CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1PVElPTkxFU1NfVElNRSA9IDEwMDsKLSAgICAvLyBUaGUgdGltZSB0aGF0IHRoZSBab29tIENvbnRyb2xzIGFyZSB2aXNpYmxlIGJlZm9yZSBmYWRpbmcgYXdheQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgWk9PTV9DT05UUk9MU19USU1FT1VUID0KLSAgICAgICAgICAgIFZpZXdDb25maWd1cmF0aW9uLmdldFpvb21Db250cm9sc1RpbWVvdXQoKTsKICAgICAvLyBUaGUgYW1vdW50IG9mIGNvbnRlbnQgdG8gb3ZlcmxhcCBiZXR3ZWVuIHR3byBzY3JlZW5zIHdoZW4gZ29pbmcgdGhyb3VnaAogICAgIC8vIHBhZ2VzIHdpdGggdGhlIHNwYWNlIGJhciwgaW4gcGl4ZWxzLgogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBQQUdFX1NDUk9MTF9PVkVSTEFQID0gMjQ7CkBAIC01NjQsMTAgKzUyNSw3IEBACiAgICAgLy8gdGltZSBmb3IgdGhlIGxvbmdlc3Qgc2Nyb2xsIGFuaW1hdGlvbgogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNQVhfRFVSQVRJT04gPSA3NTA7ICAgLy8gbWlsbGlzZWNvbmRzCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNMSURFX1RJVExFX0RVUkFUSU9OID0gNTAwOyAgIC8vIG1pbGxpc2Vjb25kcwotICAgIHByaXZhdGUgT3ZlclNjcm9sbGVyIG1TY3JvbGxlcjsKLSAgICBwcml2YXRlIGJvb2xlYW4gbUluT3ZlclNjcm9sbE1vZGUgPSBmYWxzZTsKLSAgICBwcml2YXRlIHN0YXRpYyBQYWludCBtT3ZlclNjcm9sbEJhY2tncm91bmQ7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgUGFpbnQgbU92ZXJTY3JvbGxCb3JkZXI7CisgICAgcHJpdmF0ZSBTY3JvbGxlciBtU2Nyb2xsZXI7CiAKICAgICBwcml2YXRlIGJvb2xlYW4gbVdyYXBDb250ZW50OwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNT1RJT05MRVNTX0ZBTFNFICAgICAgICAgICA9IDA7CkBAIC01NzYsMTUgKzUzNCwyOCBAQAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNT1RJT05MRVNTX0lHTk9SRSAgICAgICAgICA9IDM7CiAgICAgcHJpdmF0ZSBpbnQgbUhlbGRNb3Rpb25sZXNzOwogCi0gICAgLy8gd2hldGhlciBzdXBwb3J0IG11bHRpLXRvdWNoCi0gICAgcHJpdmF0ZSBib29sZWFuIG1TdXBwb3J0TXVsdGlUb3VjaDsKLSAgICAvLyB1c2UgdGhlIGZyYW1ld29yaydzIFNjYWxlR2VzdHVyZURldGVjdG9yIHRvIGhhbmRsZSBtdWx0aS10b3VjaAotICAgIHByaXZhdGUgU2NhbGVHZXN0dXJlRGV0ZWN0b3IgbVNjYWxlRGV0ZWN0b3I7CisgICAgLy8gQW4gaW5zdGFuY2UgZm9yIGluamVjdGluZyBhY2Nlc3NpYmlsaXR5IGluIFdlYlZpZXdzIHdpdGggZGlzYWJsZWQKKyAgICAvLyBKYXZhU2NyaXB0IG9yIG9uZXMgZm9yIHdoaWNoIG5vIGFjY2Vzc2liaWxpdHkgc2NyaXB0IGV4aXN0cworICAgIHByaXZhdGUgQWNjZXNzaWJpbGl0eUluamVjdG9yIG1BY2Nlc3NpYmlsaXR5SW5qZWN0b3I7CiAKLSAgICAvLyB0aGUgYW5jaG9yIHBvaW50IGluIHRoZSBkb2N1bWVudCBzcGFjZSB3aGVyZSBWSUVXX1NJWkVfQ0hBTkdFRCBzaG91bGQKLSAgICAvLyBhcHBseSB0bwotICAgIHByaXZhdGUgaW50IG1BbmNob3JYOwotICAgIHByaXZhdGUgaW50IG1BbmNob3JZOworICAgIC8vIGZsYWcgaW5kaWNhdGluZyBpZiBhY2Nlc3NpYmlsaXR5IHNjcmlwdCBpcyBpbmplY3RlZCBzbyB3ZQorICAgIC8vIGtub3cgdG8gaGFuZGxlIFNoaWZ0IGFuZCBhcnJvd3MgbmF0aXZlbHkgZmlyc3QKKyAgICBwcml2YXRlIGJvb2xlYW4gbUFjY2Vzc2liaWxpdHlTY3JpcHRJbmplY3RlZDsKKworICAgIC8vIHRoZSBjb2xvciB1c2VkIHRvIGhpZ2hsaWdodCB0aGUgdG91Y2ggcmVjdGFuZ2xlcworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBtSGlnaHRsaWdodENvbG9yID0gMHgzMzAwMDAwMDsKKyAgICAvLyB0aGUgcm91bmQgY29ybmVyIGZvciB0aGUgaGlnaGxpZ2h0IHBhdGgKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBmbG9hdCBUT1VDSF9ISUdITElHSFRfQVJDID0gNS4wZjsKKyAgICAvLyB0aGUgcmVnaW9uIGluZGljYXRpbmcgd2hlcmUgdGhlIHVzZXIgdG91Y2hlZCBvbiB0aGUgc2NyZWVuCisgICAgcHJpdmF0ZSBSZWdpb24gbVRvdWNoSGlnaGxpZ2h0UmVnaW9uID0gbmV3IFJlZ2lvbigpOworICAgIC8vIHRoZSBwYWludCBmb3IgdGhlIHRvdWNoIGhpZ2hsaWdodAorICAgIHByaXZhdGUgUGFpbnQgbVRvdWNoSGlnaHRsaWdodFBhaW50OworICAgIC8vIGRlYnVnIG9ubHkKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIERFQlVHX1RPVUNIX0hJR0hMSUdIVCA9IHRydWU7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFRPVUNIX0hJR0hMSUdIVF9FTEFQU0VfVElNRSA9IDIwMDA7CisgICAgcHJpdmF0ZSBQYWludCBtVG91Y2hDcm9zc0hhaXJDb2xvcjsKKyAgICBwcml2YXRlIGludCBtVG91Y2hIaWdobGlnaHRYOworICAgIHByaXZhdGUgaW50IG1Ub3VjaEhpZ2hsaWdodFk7CiAKICAgICAvKgogICAgICAqIFByaXZhdGUgbWVzc2FnZSBpZHMKQEAgLTYxOCw3ICs1ODksNyBAQAogICAgIHN0YXRpYyBmaW5hbCBpbnQgV0VCQ09SRV9JTklUSUFMSVpFRF9NU0dfSUQgICAgICAgICA9IDEwNzsKICAgICBzdGF0aWMgZmluYWwgaW50IFVQREFURV9URVhURklFTERfVEVYVF9NU0dfSUQgICAgICAgPSAxMDg7CiAgICAgc3RhdGljIGZpbmFsIGludCBVUERBVEVfWk9PTV9SQU5HRSAgICAgICAgICAgICAgICAgID0gMTA5OwotICAgIHN0YXRpYyBmaW5hbCBpbnQgTU9WRV9PVVRfT0ZfUExVR0lOICAgICAgICAgICAgICAgICA9IDExMDsKKyAgICBzdGF0aWMgZmluYWwgaW50IFVOSEFORExFRF9OQVZfS0VZICAgICAgICAgICAgICAgICAgPSAxMTA7CiAgICAgc3RhdGljIGZpbmFsIGludCBDTEVBUl9URVhUX0VOVFJZICAgICAgICAgICAgICAgICAgID0gMTExOwogICAgIHN0YXRpYyBmaW5hbCBpbnQgVVBEQVRFX1RFWFRfU0VMRUNUSU9OX01TR19JRCAgICAgICA9IDExMjsKICAgICBzdGF0aWMgZmluYWwgaW50IFNIT1dfUkVDVF9NU0dfSUQgICAgICAgICAgICAgICAgICAgPSAxMTM7CkBAIC02MzIsMTYgKzYwMywxOSBAQAogICAgIHN0YXRpYyBmaW5hbCBpbnQgU0hPV19GVUxMU0NSRUVOICAgICAgICAgICAgICAgICAgICA9IDEyMDsKICAgICBzdGF0aWMgZmluYWwgaW50IEhJREVfRlVMTFNDUkVFTiAgICAgICAgICAgICAgICAgICAgPSAxMjE7CiAgICAgc3RhdGljIGZpbmFsIGludCBET01fRk9DVVNfQ0hBTkdFRCAgICAgICAgICAgICAgICAgID0gMTIyOwotICAgIHN0YXRpYyBmaW5hbCBpbnQgSU1NRURJQVRFX1JFUEFJTlRfTVNHX0lEICAgICAgICAgICA9IDEyMzsKLSAgICBzdGF0aWMgZmluYWwgaW50IFNFVF9ST09UX0xBWUVSX01TR19JRCAgICAgICAgICAgICAgPSAxMjQ7CisgICAgc3RhdGljIGZpbmFsIGludCBSRVBMQUNFX0JBU0VfQ09OVEVOVCAgICAgICAgICAgICAgID0gMTIzOworICAgIC8vIDEyNDsKICAgICBzdGF0aWMgZmluYWwgaW50IFJFVFVSTl9MQUJFTCAgICAgICAgICAgICAgICAgICAgICAgPSAxMjU7CiAgICAgc3RhdGljIGZpbmFsIGludCBGSU5EX0FHQUlOICAgICAgICAgICAgICAgICAgICAgICAgID0gMTI2OwogICAgIHN0YXRpYyBmaW5hbCBpbnQgQ0VOVEVSX0ZJVF9SRUNUICAgICAgICAgICAgICAgICAgICA9IDEyNzsKICAgICBzdGF0aWMgZmluYWwgaW50IFJFUVVFU1RfS0VZQk9BUkRfV0lUSF9TRUxFQ1RJT05fTVNHX0lEID0gMTI4OwogICAgIHN0YXRpYyBmaW5hbCBpbnQgU0VUX1NDUk9MTEJBUl9NT0RFUyAgICAgICAgICAgICAgICA9IDEyOTsKKyAgICBzdGF0aWMgZmluYWwgaW50IFNFTEVDVElPTl9TVFJJTkdfQ0hBTkdFRCAgICAgICAgICAgPSAxMzA7CisgICAgc3RhdGljIGZpbmFsIGludCBTRVRfVE9VQ0hfSElHSExJR0hUX1JFQ1RTICAgICAgICAgID0gMTMxOworICAgIHN0YXRpYyBmaW5hbCBpbnQgU0FWRV9XRUJBUkNISVZFX0ZJTklTSEVEICAgICAgICAgICA9IDEzMjsKIAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBGSVJTVF9QQUNLQUdFX01TR19JRCA9IFNDUk9MTF9UT19NU0dfSUQ7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IExBU1RfUEFDS0FHRV9NU0dfSUQgPSBTRVRfU0NST0xMQkFSX01PREVTOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBMQVNUX1BBQ0tBR0VfTVNHX0lEID0gU0VUX1RPVUNIX0hJR0hMSUdIVF9SRUNUUzsKIAogICAgIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBIYW5kbGVyUHJpdmF0ZURlYnVnU3RyaW5nID0gewogICAgICAgICAiUkVNRU1CRVJfUEFTU1dPUkQiLCAvLyAgICAgICAgICAgICAgPSAxOwpAQCAtNjY2LDcgKzY0MCw3IEBACiAgICAgICAgICJXRUJDT1JFX0lOSVRJQUxJWkVEX01TR19JRCIsIC8vICAgICA9IDEwNzsKICAgICAgICAgIlVQREFURV9URVhURklFTERfVEVYVF9NU0dfSUQiLCAvLyAgID0gMTA4OwogICAgICAgICAiVVBEQVRFX1pPT01fUkFOR0UiLCAvLyAgICAgICAgICAgICAgPSAxMDk7Ci0gICAgICAgICJNT1ZFX09VVF9PRl9QTFVHSU4iLCAvLyAgICAgICAgICAgICA9IDExMDsKKyAgICAgICAgIlVOSEFORExFRF9OQVZfS0VZIiwgLy8gICAgICAgICAgICAgID0gMTEwOwogICAgICAgICAiQ0xFQVJfVEVYVF9FTlRSWSIsIC8vICAgICAgICAgICAgICAgPSAxMTE7CiAgICAgICAgICJVUERBVEVfVEVYVF9TRUxFQ1RJT05fTVNHX0lEIiwgLy8gICA9IDExMjsKICAgICAgICAgIlNIT1dfUkVDVF9NU0dfSUQiLCAvLyAgICAgICAgICAgICAgID0gMTEzOwpAQCAtNjc5LDE4ICs2NTMsMjEgQEAKICAgICAgICAgIlNIT1dfRlVMTFNDUkVFTiIsIC8vICAgICAgICAgICAgICAgID0gMTIwOwogICAgICAgICAiSElERV9GVUxMU0NSRUVOIiwgLy8gICAgICAgICAgICAgICAgPSAxMjE7CiAgICAgICAgICJET01fRk9DVVNfQ0hBTkdFRCIsIC8vICAgICAgICAgICAgICA9IDEyMjsKLSAgICAgICAgIklNTUVESUFURV9SRVBBSU5UX01TR19JRCIsIC8vICAgICAgID0gMTIzOwotICAgICAgICAiU0VUX1JPT1RfTEFZRVJfTVNHX0lEIiwgLy8gICAgICAgICAgPSAxMjQ7CisgICAgICAgICJSRVBMQUNFX0JBU0VfQ09OVEVOVCIsIC8vICAgICAgICAgICA9IDEyMzsKKyAgICAgICAgIjEyNCIsIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTI0OwogICAgICAgICAiUkVUVVJOX0xBQkVMIiwgLy8gICAgICAgICAgICAgICAgICAgPSAxMjU7CiAgICAgICAgICJGSU5EX0FHQUlOIiwgLy8gICAgICAgICAgICAgICAgICAgICA9IDEyNjsKICAgICAgICAgIkNFTlRFUl9GSVRfUkVDVCIsIC8vICAgICAgICAgICAgICAgID0gMTI3OwogICAgICAgICAiUkVRVUVTVF9LRVlCT0FSRF9XSVRIX1NFTEVDVElPTl9NU0dfSUQiLCAvLyA9IDEyODsKLSAgICAgICAgIlNFVF9TQ1JPTExCQVJfTU9ERVMiIC8vICAgICAgICAgICAgID0gMTI5OworICAgICAgICAiU0VUX1NDUk9MTEJBUl9NT0RFUyIsIC8vICAgICAgICAgICAgPSAxMjk7CisgICAgICAgICJTRUxFQ1RJT05fU1RSSU5HX0NIQU5HRUQiLCAvLyAgICAgICA9IDEzMDsKKyAgICAgICAgIlNFVF9UT1VDSF9ISUdITElHSFRfUkVDVFMiLCAvLyAgICAgID0gMTMxOworICAgICAgICAiU0FWRV9XRUJBUkNISVZFX0ZJTklTSEVEIiAvLyAgICAgICAgPSAxMzI7CiAgICAgfTsKIAogICAgIC8vIElmIHRoZSBzaXRlIGRvZXNuJ3QgdXNlIHRoZSB2aWV3cG9ydCBtZXRhIHRhZyB0byBzcGVjaWZ5IHRoZSB2aWV3cG9ydCwKICAgICAvLyB1c2UgREVGQVVMVF9WSUVXUE9SVF9XSURUSCBhcyB0aGUgZGVmYXVsdCB2aWV3cG9ydCB3aWR0aAotICAgIHN0YXRpYyBmaW5hbCBpbnQgREVGQVVMVF9WSUVXUE9SVF9XSURUSCA9IDgwMDsKKyAgICBzdGF0aWMgZmluYWwgaW50IERFRkFVTFRfVklFV1BPUlRfV0lEVEggPSAxMDQwOwogCiAgICAgLy8gbm9ybWFsbHkgd2UgdHJ5IHRvIGZpdCB0aGUgY29udGVudCB0byB0aGUgbWluaW11bSBwcmVmZXJyZWQgd2lkdGgKICAgICAvLyBjYWxjdWxhdGVkIGJ5IHRoZSBXZWJraXQuIFRvIGF2b2lkIHRoZSBiYWQgYmVoYXZpb3Igd2hlbiBzb21lIHNpdGUncwpAQCAtNjk4LDQ5ICs2NzUsOSBAQAogICAgIC8vIHRoZSBtaW5pbXVtIHByZWZlcnJlZCB3aWR0aCBpcyBodWdlLCBhbiB1cHBlciBsaW1pdCBpcyBuZWVkZWQuCiAgICAgc3RhdGljIGludCBzTWF4Vmlld3BvcnRXaWR0aCA9IERFRkFVTFRfVklFV1BPUlRfV0lEVEg7CiAKLSAgICAvLyBkZWZhdWx0IHNjYWxlIGxpbWl0LiBEZXBlbmRpbmcgb24gdGhlIGRpc3BsYXkgZGVuc2l0eQotICAgIHByaXZhdGUgc3RhdGljIGZsb2F0IERFRkFVTFRfTUFYX1pPT01fU0NBTEU7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmxvYXQgREVGQVVMVF9NSU5fWk9PTV9TQ0FMRTsKLSAgICAvLyBzY2FsZSBsaW1pdCwgd2hpY2ggY2FuIGJlIHNldCB0aHJvdWdoIHZpZXdwb3J0IG1ldGEgdGFnIGluIHRoZSB3ZWIgcGFnZQotICAgIHByaXZhdGUgZmxvYXQgbU1heFpvb21TY2FsZTsKLSAgICBwcml2YXRlIGZsb2F0IG1NaW5ab29tU2NhbGU7Ci0gICAgcHJpdmF0ZSBib29sZWFuIG1NaW5ab29tU2NhbGVGaXhlZCA9IHRydWU7Ci0KICAgICAvLyBpbml0aWFsIHNjYWxlIGluIHBlcmNlbnQuIDAgbWVhbnMgdXNpbmcgZGVmYXVsdC4KICAgICBwcml2YXRlIGludCBtSW5pdGlhbFNjYWxlSW5QZXJjZW50ID0gMDsKIAotICAgIC8vIHdoaWxlIGluIHRoZSB6b29tIG92ZXJ2aWV3IG1vZGUsIHRoZSBwYWdlJ3Mgd2lkdGggaXMgZnVsbHkgZml0IHRvIHRoZQotICAgIC8vIGN1cnJlbnQgd2luZG93LiBUaGUgcGFnZSBpcyBhbGl2ZSwgaW4gYW5vdGhlciB3b3JkcywgeW91IGNhbiBjbGljayB0bwotICAgIC8vIGZvbGxvdyB0aGUgbGlua3MuIERvdWJsZSB0YXAgd2lsbCB0b2dnbGUgYmV0d2VlbiB6b29tIG92ZXJ2aWV3IG1vZGUgYW5kCi0gICAgLy8gdGhlIGxhc3Qgem9vbSBzY2FsZS4KLSAgICBib29sZWFuIG1Jblpvb21PdmVydmlldyA9IGZhbHNlOwotCi0gICAgLy8gaWRlYWxseSBtWm9vbU92ZXJ2aWV3V2lkdGggc2hvdWxkIGJlIG1Db250ZW50V2lkdGguIEJ1dCBzaXRlcyBsaWtlIGVzcG4sCi0gICAgLy8gZW5nYWRnZXQgYWx3YXlzIGhhdmUgd2lkZXIgbUNvbnRlbnRXaWR0aCBubyBtYXR0ZXIgd2hhdCB2aWV3cG9ydCBzaXplIGlzLgotICAgIGludCBtWm9vbU92ZXJ2aWV3V2lkdGggPSBERUZBVUxUX1ZJRVdQT1JUX1dJRFRIOwotICAgIGZsb2F0IG1UZXh0V3JhcFNjYWxlOwotCi0gICAgLy8gZGVmYXVsdCBzY2FsZS4gRGVwZW5kaW5nIG9uIHRoZSBkaXNwbGF5IGRlbnNpdHkuCi0gICAgc3RhdGljIGludCBERUZBVUxUX1NDQUxFX1BFUkNFTlQ7Ci0gICAgcHJpdmF0ZSBmbG9hdCBtRGVmYXVsdFNjYWxlOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmxvYXQgTUlOSU1VTV9TQ0FMRV9JTkNSRU1FTlQgPSAwLjAxZjsKLQotICAgIC8vIHNldCB0byB0cnVlIHRlbXBvcmFyaWx5IGR1cmluZyBTY2FsZUdlc3R1cmUgdHJpZ2dlcmVkIHpvb20KLSAgICBwcml2YXRlIGJvb2xlYW4gbVByZXZpZXdab29tT25seSA9IGZhbHNlOwotCi0gICAgLy8gY29tcHV0ZWQgc2NhbGUgYW5kIGludmVyc2UsIGZyb20gbVpvb21XaWR0aC4KLSAgICBwcml2YXRlIGZsb2F0IG1BY3R1YWxTY2FsZTsKLSAgICBwcml2YXRlIGZsb2F0IG1JbnZBY3R1YWxTY2FsZTsKLSAgICAvLyBpZiB0aGlzIGlzIG5vbi16ZXJvLCBpdCBpcyB1c2VkIG9uIGRyYXdpbmcgcmF0aGVyIHRoYW4gbUFjdHVhbFNjYWxlCi0gICAgcHJpdmF0ZSBmbG9hdCBtWm9vbVNjYWxlOwotICAgIHByaXZhdGUgZmxvYXQgbUludkluaXRpYWxab29tU2NhbGU7Ci0gICAgcHJpdmF0ZSBmbG9hdCBtSW52RmluYWxab29tU2NhbGU7Ci0gICAgcHJpdmF0ZSBpbnQgbUluaXRpYWxTY3JvbGxYOwotICAgIHByaXZhdGUgaW50IG1Jbml0aWFsU2Nyb2xsWTsKLSAgICBwcml2YXRlIGxvbmcgbVpvb21TdGFydDsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgWk9PTV9BTklNQVRJT05fTEVOR1RIID0gNTAwOwotCiAgICAgcHJpdmF0ZSBib29sZWFuIG1Vc2VyU2Nyb2xsID0gZmFsc2U7CiAKICAgICBwcml2YXRlIGludCBtU25hcFNjcm9sbE1vZGUgPSBTTkFQX05PTkU7CkBAIC03NjQsMjYgKzcwMSwzMSBAQAogICAgIHByaXZhdGUgaW50IG1Ib3Jpem9udGFsU2Nyb2xsQmFyTW9kZSA9IFNDUk9MTEJBUl9BVVRPOwogICAgIHByaXZhdGUgaW50IG1WZXJ0aWNhbFNjcm9sbEJhck1vZGUgPSBTQ1JPTExCQVJfQVVUTzsKIAotICAgIC8qKgotICAgICAqIE1heCBkaXN0YW5jZSB0byBvdmVyc2Nyb2xsIGJ5IGluIHBpeGVscy4KLSAgICAgKiBUaGlzIGhvdyBmYXIgY29udGVudCBjYW4gYmUgcHVsbGVkIGJleW9uZCBpdHMgbm9ybWFsIGJvdW5kcyBieSB0aGUgdXNlci4KLSAgICAgKi8KLSAgICBwcml2YXRlIGludCBtT3ZlcnNjcm9sbERpc3RhbmNlOworICAgIC8vIGNvbnN0YW50cyBmb3IgZGV0ZXJtaW5pbmcgc2NyaXB0IGluamVjdGlvbiBzdHJhdGVneQorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBBQ0NFU1NJQklMSVRZX1NDUklQVF9JTkpFQ1RJT05fVU5ERUZJTkVEID0gLTE7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEFDQ0VTU0lCSUxJVFlfU0NSSVBUX0lOSkVDVElPTl9PUFRFRF9PVVQgPSAwOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBBQ0NFU1NJQklMSVRZX1NDUklQVF9JTkpFQ1RJT05fUFJPVklERUQgPSAxOwogCi0gICAgLyoqCi0gICAgICogTWF4IGRpc3RhbmNlIHRvIG92ZXJmbGluZyBieSBpbiBwaXhlbHMuCi0gICAgICogVGhpcyBpcyBob3cgZmFyIGZsaW5nZWQgY29udGVudCBjYW4gbW92ZSBiZXlvbmQgdGhlIGVuZCBvZiBpdHMgbm9ybWFsIGJvdW5kcy4KLSAgICAgKi8KLSAgICBwcml2YXRlIGludCBtT3ZlcmZsaW5nRGlzdGFuY2U7CisgICAgLy8gdGhlIGFsaWFzIHZpYSB3aGljaCBhY2Nlc3NpYmlsaXR5IEphdmFTY3JpcHQgaW50ZXJmYWNlIGlzIGV4cG9zZWQKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUxJQVNfQUNDRVNTSUJJTElUWV9KU19JTlRFUkZBQ0UgPSAiYWNjZXNzaWJpbGl0eSI7CiAKLSAgICAvKgotICAgICAqIFRoZXNlIG1hbmFnZSB0aGUgZWRnZSBnbG93IGVmZmVjdCB3aGVuIGZsdW5nIG9yIHB1bGxlZCBiZXlvbmQgdGhlIGVkZ2VzLgotICAgICAqIElmIG9uZSBpcyBub3QgbnVsbCwgYWxsIGFyZSBub3QgbnVsbC4gQ2hlY2tpbmcgb25lIGZvciBudWxsIGlzIGFzIGdvb2QgYXMgY2hlY2tpbmcgZWFjaC4KLSAgICAgKi8KLSAgICBwcml2YXRlIEVkZ2VHbG93IG1FZGdlR2xvd1RvcDsKLSAgICBwcml2YXRlIEVkZ2VHbG93IG1FZGdlR2xvd0JvdHRvbTsKLSAgICBwcml2YXRlIEVkZ2VHbG93IG1FZGdlR2xvd0xlZnQ7Ci0gICAgcHJpdmF0ZSBFZGdlR2xvdyBtRWRnZUdsb3dSaWdodDsKKyAgICAvLyBKYXZhU2NyaXB0IHRvIGluamVjdCB0aGUgc2NyaXB0IGNob29zZXIgd2hpY2ggd2lsbAorICAgIC8vIHBpY2sgdGhlIHJpZ2h0IHNjcmlwdCBmb3IgdGhlIGN1cnJlbnQgVVJMCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFDQ0VTU0lCSUxJVFlfU0NSSVBUX0NIT09TRVJfSkFWQVNDUklQVCA9CisgICAgICAgICJqYXZhc2NyaXB0OihmdW5jdGlvbigpIHsiICsKKyAgICAgICAgIiAgICB2YXIgY2hvb3NlciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NjcmlwdCcpOyIgKworICAgICAgICAiICAgIGNob29zZXIudHlwZSA9ICd0ZXh0L2phdmFzY3JpcHQnOyIgKworICAgICAgICAiICAgIGNob29zZXIuc3JjID0gJ2h0dHBzOi8vc3NsLmdzdGF0aWMuY29tL2FjY2Vzc2liaWxpdHkvamF2YXNjcmlwdC9hbmRyb2lkL0FuZHJvaWRTY3JpcHRDaG9vc2VyLnVzZXIuanMnOyIgKworICAgICAgICAiICAgIGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCdoZWFkJylbMF0uYXBwZW5kQ2hpbGQoY2hvb3Nlcik7IiArCisgICAgICAgICIgIH0pKCk7IjsKKworICAgIC8vIFJlZ3VsYXIgZXhwcmVzc2lvbiB0aGF0IG1hdGNoZXMgdGhlICJheHMiIFVSTCBwYXJhbWV0ZXIuCisgICAgLy8gVGhlIHZhbHVlIG9mIDAgbWVhbnMgdGhlIGFjY2Vzc2liaWxpdHkgc2NyaXB0IGlzIG9wdGVkIG91dAorICAgIC8vIFRoZSB2YWx1ZSBvZiAxIG1lYW5zIHRoZSBhY2Nlc3NpYmlsaXR5IHNjcmlwdCBpcyBhbHJlYWR5IGluamVjdGVkCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBBVFRFUk5fTUFUQ0hfQVhTX1VSTF9QQVJBTUVURVIgPSAiKFxcP2F4cz0oMHwxKSl8KCZheHM9KDB8MSkpIjsKKworICAgIC8vIHZhcmlhYmxlIHRvIGNhY2hlIHRoZSBhYm92ZSBwYXR0ZXJuIGluIGNhc2UgYWNjZXNzaWJpbGl0eSBpcyBlbmFibGVkLgorICAgIHByaXZhdGUgUGF0dGVybiBtTWF0Y2hBeHNVcmxQYXJhbWV0ZXJQYXR0ZXJuOwogCiAgICAgLy8gVXNlZCB0byBtYXRjaCBrZXkgZG93bnMgYW5kIGtleSB1cHMKICAgICBwcml2YXRlIGJvb2xlYW4gbUdvdEtleURvd247CkBAIC04ODksNDMgKzgzMSw2IEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICAvLyBUaGUgVmlldyBjb250YWluaW5nIHRoZSB6b29tIGNvbnRyb2xzCi0gICAgcHJpdmF0ZSBFeHRlbmRlZFpvb21Db250cm9scyBtWm9vbUNvbnRyb2xzOwotICAgIHByaXZhdGUgUnVubmFibGUgbVpvb21Db250cm9sUnVubmFibGU7Ci0KLSAgICAvLyBtWm9vbUJ1dHRvbnNDb250cm9sbGVyIHdpbGwgYmUgbGF6eSBpbml0aWFsaXplZCBpbgotICAgIC8vIGdldFpvb21CdXR0b25zQ29udHJvbGxlcigpIHRvIGdldCBiZXR0ZXIgcGVyZm9ybWFuY2UuCi0gICAgcHJpdmF0ZSBab29tQnV0dG9uc0NvbnRyb2xsZXIgbVpvb21CdXR0b25zQ29udHJvbGxlcjsKLQotICAgIC8vIFRoZXNlIGtlZXAgdHJhY2sgb2YgdGhlIGNlbnRlciBwb2ludCBvZiB0aGUgem9vbS4gIFRoZXkgYXJlIHVzZWQgdG8KLSAgICAvLyBkZXRlcm1pbmUgdGhlIHBvaW50IGFyb3VuZCB3aGljaCB3ZSBzaG91bGQgem9vbS4KLSAgICBwcml2YXRlIGZsb2F0IG1ab29tQ2VudGVyWDsKLSAgICBwcml2YXRlIGZsb2F0IG1ab29tQ2VudGVyWTsKLQotICAgIHByaXZhdGUgWm9vbUJ1dHRvbnNDb250cm9sbGVyLk9uWm9vbUxpc3RlbmVyIG1ab29tTGlzdGVuZXIgPQotICAgICAgICAgICAgbmV3IFpvb21CdXR0b25zQ29udHJvbGxlci5Pblpvb21MaXN0ZW5lcigpIHsKLQotICAgICAgICBwdWJsaWMgdm9pZCBvblZpc2liaWxpdHlDaGFuZ2VkKGJvb2xlYW4gdmlzaWJsZSkgewotICAgICAgICAgICAgaWYgKHZpc2libGUpIHsKLSAgICAgICAgICAgICAgICBzd2l0Y2hPdXREcmF3SGlzdG9yeSgpOwotICAgICAgICAgICAgICAgIC8vIEJyaW5nIGJhY2sgdGhlIGhpZGRlbiB6b29tIGNvbnRyb2xzLgotICAgICAgICAgICAgICAgIG1ab29tQnV0dG9uc0NvbnRyb2xsZXIuZ2V0Wm9vbUNvbnRyb2xzKCkuc2V0VmlzaWJpbGl0eSgKLSAgICAgICAgICAgICAgICAgICAgICAgIFZpZXcuVklTSUJMRSk7Ci0gICAgICAgICAgICAgICAgdXBkYXRlWm9vbUJ1dHRvbnNFbmFibGVkKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBvblpvb20oYm9vbGVhbiB6b29tSW4pIHsKLSAgICAgICAgICAgIGlmICh6b29tSW4pIHsKLSAgICAgICAgICAgICAgICB6b29tSW4oKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgem9vbU91dCgpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB1cGRhdGVab29tQnV0dG9uc0VuYWJsZWQoKTsKLSAgICAgICAgfQotICAgIH07Ci0KICAgICAvKioKICAgICAgKiBDb25zdHJ1Y3QgYSBuZXcgV2ViVmlldyB3aXRoIGEgQ29udGV4dCBvYmplY3QuCiAgICAgICogQHBhcmFtIGNvbnRleHQgQSBDb250ZXh0IG9iamVjdCB1c2VkIHRvIGFjY2VzcyBhcHBsaWNhdGlvbiBhc3NldHMuCkBAIC05NTAsNyArODU1LDE4IEBACiAgICAgICogQHBhcmFtIGRlZlN0eWxlIFRoZSBkZWZhdWx0IHN0eWxlIHJlc291cmNlIElELgogICAgICAqLwogICAgIHB1YmxpYyBXZWJWaWV3KENvbnRleHQgY29udGV4dCwgQXR0cmlidXRlU2V0IGF0dHJzLCBpbnQgZGVmU3R5bGUpIHsKLSAgICAgICAgdGhpcyhjb250ZXh0LCBhdHRycywgZGVmU3R5bGUsIG51bGwpOworICAgICAgICB0aGlzKGNvbnRleHQsIGF0dHJzLCBkZWZTdHlsZSwgZmFsc2UpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdCBhIG5ldyBXZWJWaWV3IHdpdGggbGF5b3V0IHBhcmFtZXRlcnMgYW5kIGEgZGVmYXVsdCBzdHlsZS4KKyAgICAgKiBAcGFyYW0gY29udGV4dCBBIENvbnRleHQgb2JqZWN0IHVzZWQgdG8gYWNjZXNzIGFwcGxpY2F0aW9uIGFzc2V0cy4KKyAgICAgKiBAcGFyYW0gYXR0cnMgQW4gQXR0cmlidXRlU2V0IHBhc3NlZCB0byBvdXIgcGFyZW50LgorICAgICAqIEBwYXJhbSBkZWZTdHlsZSBUaGUgZGVmYXVsdCBzdHlsZSByZXNvdXJjZSBJRC4KKyAgICAgKi8KKyAgICBwdWJsaWMgV2ViVmlldyhDb250ZXh0IGNvbnRleHQsIEF0dHJpYnV0ZVNldCBhdHRycywgaW50IGRlZlN0eWxlLAorICAgICAgICAgICAgYm9vbGVhbiBwcml2YXRlQnJvd3NpbmcpIHsKKyAgICAgICAgdGhpcyhjb250ZXh0LCBhdHRycywgZGVmU3R5bGUsIG51bGwsIHByaXZhdGVCcm93c2luZyk7CiAgICAgfQogCiAgICAgLyoqCkBAIC05NjEsNTMgKzg3NywxMzQgQEAKICAgICAgKiBAcGFyYW0gY29udGV4dCBBIENvbnRleHQgb2JqZWN0IHVzZWQgdG8gYWNjZXNzIGFwcGxpY2F0aW9uIGFzc2V0cy4KICAgICAgKiBAcGFyYW0gYXR0cnMgQW4gQXR0cmlidXRlU2V0IHBhc3NlZCB0byBvdXIgcGFyZW50LgogICAgICAqIEBwYXJhbSBkZWZTdHlsZSBUaGUgZGVmYXVsdCBzdHlsZSByZXNvdXJjZSBJRC4KLSAgICAgKiBAcGFyYW0gamF2YXNjcmlwdEludGVyZmFjZXMgaXMgYSBNYXAgb2YgaW50YXJlZmFjZSBuYW1lcywgYXMga2V5cywgYW5kCisgICAgICogQHBhcmFtIGphdmFzY3JpcHRJbnRlcmZhY2VzIGlzIGEgTWFwIG9mIGludGVyZmFjZSBuYW1lcywgYXMga2V5cywgYW5kCiAgICAgICogb2JqZWN0IGltcGxlbWVudGluZyB0aG9zZSBpbnRlcmZhY2VzLCBhcyB2YWx1ZXMuCiAgICAgICogQGhpZGUgcGVuZGluZyBBUEkgY291bmNpbCBhcHByb3ZhbC4KICAgICAgKi8KICAgICBwcm90ZWN0ZWQgV2ViVmlldyhDb250ZXh0IGNvbnRleHQsIEF0dHJpYnV0ZVNldCBhdHRycywgaW50IGRlZlN0eWxlLAotICAgICAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiBqYXZhc2NyaXB0SW50ZXJmYWNlcykgeworICAgICAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiBqYXZhc2NyaXB0SW50ZXJmYWNlcywgYm9vbGVhbiBwcml2YXRlQnJvd3NpbmcpIHsKICAgICAgICAgc3VwZXIoY29udGV4dCwgYXR0cnMsIGRlZlN0eWxlKTsKLSAgICAgICAgaW5pdCgpOworCisgICAgICAgIGlmIChBY2Nlc3NpYmlsaXR5TWFuYWdlci5nZXRJbnN0YW5jZShjb250ZXh0KS5pc0VuYWJsZWQoKSkgeworICAgICAgICAgICAgaWYgKGphdmFzY3JpcHRJbnRlcmZhY2VzID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBqYXZhc2NyaXB0SW50ZXJmYWNlcyA9IG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZXhwb3NlQWNjZXNzaWJpbGl0eUphdmFTY3JpcHRBcGkoamF2YXNjcmlwdEludGVyZmFjZXMpOworICAgICAgICB9CiAKICAgICAgICAgbUNhbGxiYWNrUHJveHkgPSBuZXcgQ2FsbGJhY2tQcm94eShjb250ZXh0LCB0aGlzKTsKICAgICAgICAgbVZpZXdNYW5hZ2VyID0gbmV3IFZpZXdNYW5hZ2VyKHRoaXMpOwogICAgICAgICBtV2ViVmlld0NvcmUgPSBuZXcgV2ViVmlld0NvcmUoY29udGV4dCwgdGhpcywgbUNhbGxiYWNrUHJveHksIGphdmFzY3JpcHRJbnRlcmZhY2VzKTsKICAgICAgICAgbURhdGFiYXNlID0gV2ViVmlld0RhdGFiYXNlLmdldEluc3RhbmNlKGNvbnRleHQpOwotICAgICAgICBtU2Nyb2xsZXIgPSBuZXcgT3ZlclNjcm9sbGVyKGNvbnRleHQpOworICAgICAgICBtU2Nyb2xsZXIgPSBuZXcgU2Nyb2xsZXIoY29udGV4dCk7CisgICAgICAgIG1ab29tTWFuYWdlciA9IG5ldyBab29tTWFuYWdlcih0aGlzLCBtQ2FsbGJhY2tQcm94eSk7CiAKKyAgICAgICAgLyogVGhlIGluaXQgbWV0aG9kIG11c3QgZm9sbG93IHRoZSBjcmVhdGlvbiBvZiBjZXJ0YWluIG1lbWJlciB2YXJpYWJsZXMsCisgICAgICAgICAqIHN1Y2ggYXMgdGhlIG1ab29tTWFuYWdlci4KKyAgICAgICAgICovCisgICAgICAgIGluaXQoKTsKKyAgICAgICAgc2V0dXBQYWNrYWdlTGlzdGVuZXIoY29udGV4dCk7CiAgICAgICAgIHVwZGF0ZU11bHRpVG91Y2hTdXBwb3J0KGNvbnRleHQpOworCisgICAgICAgIGlmIChwcml2YXRlQnJvd3NpbmcpIHsKKyAgICAgICAgICAgIHN0YXJ0UHJpdmF0ZUJyb3dzaW5nKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKgorICAgICAqIFRoZSBpbnRlbnQgcmVjZWl2ZXIgdGhhdCBtb25pdG9ycyBmb3IgY2hhbmdlcyB0byByZWxldmFudCBwYWNrYWdlcyAoZS5nLiwKKyAgICAgKiBzR29vZ2xlQXBwcykgYW5kIG5vdGlmaWVzIFdlYlZpZXdDb3JlIG9mIHRoZWlyIGV4aXN0ZW5jZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBCcm9hZGNhc3RSZWNlaXZlciBzUGFja2FnZUluc3RhbGxhdGlvblJlY2VpdmVyID0gbnVsbDsKKworICAgIC8qCisgICAgICogQSBzZXQgb2YgR29vZ2xlIHBhY2thZ2VzIHdlIG1vbml0b3IgZm9yIHRoZQorICAgICAqIG5hdmlnYXRvci5pc0FwcGxpY2F0aW9uSW5zdGFsbGVkKCkgQVBJLiBBZGQgYWRkaXRpb25hbCBwYWNrYWdlcyBhcworICAgICAqIG5lZWRlZC4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBTZXQ8U3RyaW5nPiBzR29vZ2xlQXBwczsKKyAgICBzdGF0aWMgeworICAgICAgICBzR29vZ2xlQXBwcyA9IG5ldyBIYXNoU2V0PFN0cmluZz4oKTsKKyAgICAgICAgc0dvb2dsZUFwcHMuYWRkKCJjb20uZ29vZ2xlLmFuZHJvaWQueW91dHViZSIpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBzZXR1cFBhY2thZ2VMaXN0ZW5lcihDb250ZXh0IGNvbnRleHQpIHsKKworICAgICAgICAvKgorICAgICAgICAgKiB3ZSBtdXN0IHN5bmNocm9uaXplIHRoZSBpbnN0YW5jZSBjaGVjayBhbmQgdGhlIGNyZWF0aW9uIG9mIHRoZQorICAgICAgICAgKiByZWNlaXZlciB0byBlbnN1cmUgdGhhdCBvbmx5IE9ORSByZWNlaXZlciBleGlzdHMgZm9yIGFsbCBXZWJWaWV3CisgICAgICAgICAqIGluc3RhbmNlcy4KKyAgICAgICAgICovCisgICAgICAgIHN5bmNocm9uaXplZCAoV2ViVmlldy5jbGFzcykgeworCisgICAgICAgICAgICAvLyBpZiB0aGUgcmVjZWl2ZXIgYWxyZWFkeSBleGlzdHMgdGhlbiB3ZSBkbyBub3QgbmVlZCB0byByZWdpc3RlciBpdAorICAgICAgICAgICAgLy8gYWdhaW4KKyAgICAgICAgICAgIGlmIChzUGFja2FnZUluc3RhbGxhdGlvblJlY2VpdmVyICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEludGVudEZpbHRlciBmaWx0ZXIgPSBuZXcgSW50ZW50RmlsdGVyKEludGVudC5BQ1RJT05fUEFDS0FHRV9BRERFRCk7CisgICAgICAgICAgICBmaWx0ZXIuYWRkQWN0aW9uKEludGVudC5BQ1RJT05fUEFDS0FHRV9SRU1PVkVEKTsKKyAgICAgICAgICAgIGZpbHRlci5hZGREYXRhU2NoZW1lKCJwYWNrYWdlIik7CisgICAgICAgICAgICBzUGFja2FnZUluc3RhbGxhdGlvblJlY2VpdmVyID0gbmV3IEJyb2FkY2FzdFJlY2VpdmVyKCkgeworCisgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgb25SZWNlaXZlKENvbnRleHQgY29udGV4dCwgSW50ZW50IGludGVudCkgeworICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgYWN0aW9uID0gaW50ZW50LmdldEFjdGlvbigpOworICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgcGFja2FnZU5hbWUgPSBpbnRlbnQuZ2V0RGF0YSgpLmdldFNjaGVtZVNwZWNpZmljUGFydCgpOworICAgICAgICAgICAgICAgICAgICBmaW5hbCBib29sZWFuIHJlcGxhY2luZyA9IGludGVudC5nZXRCb29sZWFuRXh0cmEoSW50ZW50LkVYVFJBX1JFUExBQ0lORywgZmFsc2UpOworICAgICAgICAgICAgICAgICAgICBpZiAoSW50ZW50LkFDVElPTl9QQUNLQUdFX1JFTU9WRUQuZXF1YWxzKGFjdGlvbikgJiYgcmVwbGFjaW5nKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiBpdCBpcyByZXBsYWNpbmcsIHJlZnJlc2hQbHVnaW5zKCkgd2hlbiBhZGRpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGlmIChzR29vZ2xlQXBwcy5jb250YWlucyhwYWNrYWdlTmFtZSkgJiYgbVdlYlZpZXdDb3JlICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChJbnRlbnQuQUNUSU9OX1BBQ0tBR0VfQURERUQuZXF1YWxzKGFjdGlvbikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtV2ViVmlld0NvcmUuc2VuZE1lc3NhZ2UoRXZlbnRIdWIuQUREX1BBQ0tBR0VfTkFNRSwgcGFja2FnZU5hbWUpOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtV2ViVmlld0NvcmUuc2VuZE1lc3NhZ2UoRXZlbnRIdWIuUkVNT1ZFX1BBQ0tBR0VfTkFNRSwgcGFja2FnZU5hbWUpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgUGx1Z2luTWFuYWdlciBwbSA9IFBsdWdpbk1hbmFnZXIuZ2V0SW5zdGFuY2UoY29udGV4dCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChwbS5jb250YWluc1BsdWdpblBlcm1pc3Npb25BbmRTaWduYXR1cmVzKHBhY2thZ2VOYW1lKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgcG0ucmVmcmVzaFBsdWdpbnMoSW50ZW50LkFDVElPTl9QQUNLQUdFX0FEREVELmVxdWFscyhhY3Rpb24pKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH07CisKKyAgICAgICAgICAgIGNvbnRleHQuZ2V0QXBwbGljYXRpb25Db250ZXh0KCkucmVnaXN0ZXJSZWNlaXZlcihzUGFja2FnZUluc3RhbGxhdGlvblJlY2VpdmVyLCBmaWx0ZXIpOworICAgICAgICB9CisKKyAgICAgICAgLy8gY2hlY2sgaWYgYW55IG9mIHRoZSBtb25pdG9yZWQgYXBwcyBhcmUgYWxyZWFkeSBpbnN0YWxsZWQKKyAgICAgICAgQXN5bmNUYXNrPFZvaWQsIFZvaWQsIFNldDxTdHJpbmc+PiB0YXNrID0gbmV3IEFzeW5jVGFzazxWb2lkLCBWb2lkLCBTZXQ8U3RyaW5nPj4oKSB7CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHJvdGVjdGVkIFNldDxTdHJpbmc+IGRvSW5CYWNrZ3JvdW5kKFZvaWQuLi4gdW51c2VkKSB7CisgICAgICAgICAgICAgICAgU2V0PFN0cmluZz4gaW5zdGFsbGVkUGFja2FnZXMgPSBuZXcgSGFzaFNldDxTdHJpbmc+KCk7CisgICAgICAgICAgICAgICAgUGFja2FnZU1hbmFnZXIgcG0gPSBtQ29udGV4dC5nZXRQYWNrYWdlTWFuYWdlcigpOworICAgICAgICAgICAgICAgIExpc3Q8UGFja2FnZUluZm8+IHBhY2thZ2VzID0gcG0uZ2V0SW5zdGFsbGVkUGFja2FnZXMoMCk7CisgICAgICAgICAgICAgICAgZm9yIChQYWNrYWdlSW5mbyBwIDogcGFja2FnZXMpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHNHb29nbGVBcHBzLmNvbnRhaW5zKHAucGFja2FnZU5hbWUpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnN0YWxsZWRQYWNrYWdlcy5hZGQocC5wYWNrYWdlTmFtZSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIGluc3RhbGxlZFBhY2thZ2VzOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBFeGVjdXRlcyBvbiB0aGUgVUkgdGhyZWFkCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHByb3RlY3RlZCB2b2lkIG9uUG9zdEV4ZWN1dGUoU2V0PFN0cmluZz4gaW5zdGFsbGVkUGFja2FnZXMpIHsKKyAgICAgICAgICAgICAgICBpZiAobVdlYlZpZXdDb3JlICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgbVdlYlZpZXdDb3JlLnNlbmRNZXNzYWdlKEV2ZW50SHViLkFERF9QQUNLQUdFX05BTUVTLCBpbnN0YWxsZWRQYWNrYWdlcyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9OworICAgICAgICB0YXNrLmV4ZWN1dGUoKTsKICAgICB9CiAKICAgICB2b2lkIHVwZGF0ZU11bHRpVG91Y2hTdXBwb3J0KENvbnRleHQgY29udGV4dCkgewotICAgICAgICBXZWJTZXR0aW5ncyBzZXR0aW5ncyA9IGdldFNldHRpbmdzKCk7Ci0gICAgICAgIGZpbmFsIFBhY2thZ2VNYW5hZ2VyIHBtID0gY29udGV4dC5nZXRQYWNrYWdlTWFuYWdlcigpOwotICAgICAgICBtU3VwcG9ydE11bHRpVG91Y2ggPSBwbS5oYXNTeXN0ZW1GZWF0dXJlKFBhY2thZ2VNYW5hZ2VyLkZFQVRVUkVfVE9VQ0hTQ1JFRU5fTVVMVElUT1VDSCkKLSAgICAgICAgICAgICAgICAmJiBzZXR0aW5ncy5zdXBwb3J0Wm9vbSgpICYmIHNldHRpbmdzLmdldEJ1aWx0SW5ab29tQ29udHJvbHMoKTsKLSAgICAgICAgbUFsbG93UGFuQW5kU2NhbGUgPSBwbS5oYXNTeXN0ZW1GZWF0dXJlKAotICAgICAgICAgICAgICAgIFBhY2thZ2VNYW5hZ2VyLkZFQVRVUkVfVE9VQ0hTQ1JFRU5fTVVMVElUT1VDSF9ESVNUSU5DVCk7Ci0gICAgICAgIGlmIChtU3VwcG9ydE11bHRpVG91Y2ggJiYgKG1TY2FsZURldGVjdG9yID09IG51bGwpKSB7Ci0gICAgICAgICAgICBtU2NhbGVEZXRlY3RvciA9IG5ldyBTY2FsZUdlc3R1cmVEZXRlY3Rvcihjb250ZXh0LAotICAgICAgICAgICAgICAgICAgICBuZXcgU2NhbGVEZXRlY3Rvckxpc3RlbmVyKCkpOwotICAgICAgICB9IGVsc2UgaWYgKCFtU3VwcG9ydE11bHRpVG91Y2ggJiYgKG1TY2FsZURldGVjdG9yICE9IG51bGwpKSB7Ci0gICAgICAgICAgICBtU2NhbGVEZXRlY3RvciA9IG51bGw7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgdXBkYXRlWm9vbUJ1dHRvbnNFbmFibGVkKCkgewotICAgICAgICBpZiAobVpvb21CdXR0b25zQ29udHJvbGxlciA9PSBudWxsKSByZXR1cm47Ci0gICAgICAgIGJvb2xlYW4gY2FuWm9vbUluID0gbUFjdHVhbFNjYWxlIDwgbU1heFpvb21TY2FsZTsKLSAgICAgICAgYm9vbGVhbiBjYW5ab29tT3V0ID0gbUFjdHVhbFNjYWxlID4gbU1pblpvb21TY2FsZSAmJiAhbUluWm9vbU92ZXJ2aWV3OwotICAgICAgICBpZiAoIWNhblpvb21JbiAmJiAhY2FuWm9vbU91dCkgewotICAgICAgICAgICAgLy8gSGlkZSB0aGUgem9vbSBpbiBhbmQgb3V0IGJ1dHRvbnMsIGFzIHdlbGwgYXMgdGhlIGZpdCB0byBwYWdlCi0gICAgICAgICAgICAvLyBidXR0b24sIGlmIHRoZSBwYWdlIGNhbm5vdCB6b29tCi0gICAgICAgICAgICBtWm9vbUJ1dHRvbnNDb250cm9sbGVyLmdldFpvb21Db250cm9scygpLnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIFNldCBlYWNoIG9uZSBpbmRpdmlkdWFsbHksIGFzIGEgcGFnZSBtYXkgYmUgYWJsZSB0byB6b29tIGluCi0gICAgICAgICAgICAvLyBvciBvdXQuCi0gICAgICAgICAgICBtWm9vbUJ1dHRvbnNDb250cm9sbGVyLnNldFpvb21JbkVuYWJsZWQoY2FuWm9vbUluKTsKLSAgICAgICAgICAgIG1ab29tQnV0dG9uc0NvbnRyb2xsZXIuc2V0Wm9vbU91dEVuYWJsZWQoY2FuWm9vbU91dCk7Ci0gICAgICAgIH0KKyAgICAgICAgbVpvb21NYW5hZ2VyLnVwZGF0ZU11bHRpVG91Y2hTdXBwb3J0KGNvbnRleHQpOwogICAgIH0KIAogICAgIHByaXZhdGUgdm9pZCBpbml0KCkgewpAQCAtMTAyNyw1NyArMTAyNCwzOCBAQAogICAgICAgICAvLyB1c2Ugb25lIGxpbmUgaGVpZ2h0LCAxNiBiYXNlZCBvbiBvdXIgY3VycmVudCBkZWZhdWx0IGZvbnQsIGZvciBob3cKICAgICAgICAgLy8gZmFyIHdlIGFsbG93IGEgdG91Y2ggYmUgYXdheSBmcm9tIHRoZSBlZGdlIG9mIGEgbGluawogICAgICAgICBtTmF2U2xvcCA9IChpbnQpICgxNiAqIGRlbnNpdHkpOwotICAgICAgICAvLyBkZW5zaXR5IGFkanVzdGVkIHNjYWxlIGZhY3RvcnMKLSAgICAgICAgREVGQVVMVF9TQ0FMRV9QRVJDRU5UID0gKGludCkgKDEwMCAqIGRlbnNpdHkpOwotICAgICAgICBtRGVmYXVsdFNjYWxlID0gZGVuc2l0eTsKLSAgICAgICAgbUFjdHVhbFNjYWxlID0gZGVuc2l0eTsKLSAgICAgICAgbUludkFjdHVhbFNjYWxlID0gMSAvIGRlbnNpdHk7Ci0gICAgICAgIG1UZXh0V3JhcFNjYWxlID0gZGVuc2l0eTsKLSAgICAgICAgREVGQVVMVF9NQVhfWk9PTV9TQ0FMRSA9IDQuMGYgKiBkZW5zaXR5OwotICAgICAgICBERUZBVUxUX01JTl9aT09NX1NDQUxFID0gMC4yNWYgKiBkZW5zaXR5OwotICAgICAgICBtTWF4Wm9vbVNjYWxlID0gREVGQVVMVF9NQVhfWk9PTV9TQ0FMRTsKLSAgICAgICAgbU1pblpvb21TY2FsZSA9IERFRkFVTFRfTUlOX1pPT01fU0NBTEU7CisgICAgICAgIG1ab29tTWFuYWdlci5pbml0KGRlbnNpdHkpOwogICAgICAgICBtTWF4aW11bUZsaW5nID0gY29uZmlndXJhdGlvbi5nZXRTY2FsZWRNYXhpbXVtRmxpbmdWZWxvY2l0eSgpOwotICAgICAgICBtT3ZlcnNjcm9sbERpc3RhbmNlID0gY29uZmlndXJhdGlvbi5nZXRTY2FsZWRPdmVyc2Nyb2xsRGlzdGFuY2UoKTsKLSAgICAgICAgbU92ZXJmbGluZ0Rpc3RhbmNlID0gY29uZmlndXJhdGlvbi5nZXRTY2FsZWRPdmVyZmxpbmdEaXN0YW5jZSgpOworCisgICAgICAgIC8vIENvbXB1dGUgdGhlIGludmVyc2Ugb2YgdGhlIGRlbnNpdHkgc3F1YXJlZC4KKyAgICAgICAgRFJBR19MQVlFUl9JTlZFUlNFX0RFTlNJVFlfU1FVQVJFRCA9IDEgLyAoZGVuc2l0eSAqIGRlbnNpdHkpOwogICAgIH0KIAotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNldE92ZXJzY3JvbGxNb2RlKGludCBtb2RlKSB7Ci0gICAgICAgIHN1cGVyLnNldE92ZXJzY3JvbGxNb2RlKG1vZGUpOwotICAgICAgICBpZiAobW9kZSAhPSBPVkVSU0NST0xMX05FVkVSKSB7Ci0gICAgICAgICAgICBpZiAobUVkZ2VHbG93VG9wID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBmaW5hbCBSZXNvdXJjZXMgcmVzID0gZ2V0Q29udGV4dCgpLmdldFJlc291cmNlcygpOwotICAgICAgICAgICAgICAgIGZpbmFsIERyYXdhYmxlIGVkZ2UgPSByZXMuZ2V0RHJhd2FibGUoUi5kcmF3YWJsZS5vdmVyc2Nyb2xsX2VkZ2UpOwotICAgICAgICAgICAgICAgIGZpbmFsIERyYXdhYmxlIGdsb3cgPSByZXMuZ2V0RHJhd2FibGUoUi5kcmF3YWJsZS5vdmVyc2Nyb2xsX2dsb3cpOwotICAgICAgICAgICAgICAgIG1FZGdlR2xvd1RvcCA9IG5ldyBFZGdlR2xvdyhlZGdlLCBnbG93KTsKLSAgICAgICAgICAgICAgICBtRWRnZUdsb3dCb3R0b20gPSBuZXcgRWRnZUdsb3coZWRnZSwgZ2xvdyk7Ci0gICAgICAgICAgICAgICAgbUVkZ2VHbG93TGVmdCA9IG5ldyBFZGdlR2xvdyhlZGdlLCBnbG93KTsKLSAgICAgICAgICAgICAgICBtRWRnZUdsb3dSaWdodCA9IG5ldyBFZGdlR2xvdyhlZGdlLCBnbG93KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1FZGdlR2xvd1RvcCA9IG51bGw7Ci0gICAgICAgICAgICBtRWRnZUdsb3dCb3R0b20gPSBudWxsOwotICAgICAgICAgICAgbUVkZ2VHbG93TGVmdCA9IG51bGw7Ci0gICAgICAgICAgICBtRWRnZUdsb3dSaWdodCA9IG51bGw7CisgICAgLyoqCisgICAgICogRXhwb3NlcyBhY2Nlc3NpYmlsaXR5IEFQSXMgdG8gSmF2YVNjcmlwdCBieSBhcHBlbmRpbmcgdGhlbSB0byB0aGUgSmF2YVNjcmlwdAorICAgICAqIGludGVyZmFjZXMgbWFwIHByb3ZpZGVkIGJ5IHRoZSBXZWJWaWV3IGNsaWVudC4gSW4gY2FzZSBvZiBjb25mbGljdGluZworICAgICAqIGFsaWFzIHdpdGggdGhlIG9uZSBvZiB0aGUgYWNjZXNzaWJpbGl0eSBBUEkgdGhlIHVzZXIgc3BlY2lmaWVkIG9uZSB3aW5zLgorICAgICAqCisgICAgICogQHBhcmFtIGphdmFzY3JpcHRJbnRlcmZhY2VzIEEgbWFwIHdpdGggaW50ZXJmYWNlcyB0byBiZSBleHBvc2VkIHRvIEphdmFTY3JpcHQuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIGV4cG9zZUFjY2Vzc2liaWxpdHlKYXZhU2NyaXB0QXBpKE1hcDxTdHJpbmcsIE9iamVjdD4gamF2YXNjcmlwdEludGVyZmFjZXMpIHsKKyAgICAgICAgaWYgKGphdmFzY3JpcHRJbnRlcmZhY2VzLmNvbnRhaW5zS2V5KEFMSUFTX0FDQ0VTU0lCSUxJVFlfSlNfSU5URVJGQUNFKSkgeworICAgICAgICAgICAgTG9nLncoTE9HVEFHLCAiSmF2YVNjcmlwdCBpbnRlcmZhY2UgbWFwcGVkIHRvIFwiIiArIEFMSUFTX0FDQ0VTU0lCSUxJVFlfSlNfSU5URVJGQUNFCisgICAgICAgICAgICAgICAgICAgICsgIlwiIG92ZXJyaWRlcyB0aGUgYWNjZXNzaWJpbGl0eSBBUEkgSmF2YVNjcmlwdCBpbnRlcmZhY2UuIE5vIGFjY2Vzc2liaWxpdHkiCisgICAgICAgICAgICAgICAgICAgICsgIkFQSSB3aWxsIGJlIGV4cG9zZWQgdG8gSmF2YVNjcmlwdCEiKTsKKyAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQorCisgICAgICAgIC8vIGV4cG9zZSB0aGUgVFRTIGZvciBub3cgLi4uCisgICAgICAgIGphdmFzY3JpcHRJbnRlcmZhY2VzLnB1dChBTElBU19BQ0NFU1NJQklMSVRZX0pTX0lOVEVSRkFDRSwKKyAgICAgICAgICAgICAgICBuZXcgVGV4dFRvU3BlZWNoKGdldENvbnRleHQoKSwgbnVsbCkpOwogICAgIH0KIAogICAgIC8qIHBhY2thZ2UgKi92b2lkIHVwZGF0ZURlZmF1bHRab29tRGVuc2l0eShpbnQgem9vbURlbnNpdHkpIHsKLSAgICAgICAgZmluYWwgZmxvYXQgZGVuc2l0eSA9IGdldENvbnRleHQoKS5nZXRSZXNvdXJjZXMoKS5nZXREaXNwbGF5TWV0cmljcygpLmRlbnNpdHkKKyAgICAgICAgZmluYWwgZmxvYXQgZGVuc2l0eSA9IG1Db250ZXh0LmdldFJlc291cmNlcygpLmdldERpc3BsYXlNZXRyaWNzKCkuZGVuc2l0eQogICAgICAgICAgICAgICAgICogMTAwIC8gem9vbURlbnNpdHk7Ci0gICAgICAgIGlmIChNYXRoLmFicyhkZW5zaXR5IC0gbURlZmF1bHRTY2FsZSkgPiAwLjAxKSB7Ci0gICAgICAgICAgICBmbG9hdCBzY2FsZUZhY3RvciA9IGRlbnNpdHkgLyBtRGVmYXVsdFNjYWxlOwotICAgICAgICAgICAgLy8gYWRqdXN0IHRoZSBsaW1pdHMKLSAgICAgICAgICAgIG1OYXZTbG9wID0gKGludCkgKDE2ICogZGVuc2l0eSk7Ci0gICAgICAgICAgICBERUZBVUxUX1NDQUxFX1BFUkNFTlQgPSAoaW50KSAoMTAwICogZGVuc2l0eSk7Ci0gICAgICAgICAgICBERUZBVUxUX01BWF9aT09NX1NDQUxFID0gNC4wZiAqIGRlbnNpdHk7Ci0gICAgICAgICAgICBERUZBVUxUX01JTl9aT09NX1NDQUxFID0gMC4yNWYgKiBkZW5zaXR5OwotICAgICAgICAgICAgbURlZmF1bHRTY2FsZSA9IGRlbnNpdHk7Ci0gICAgICAgICAgICBtTWF4Wm9vbVNjYWxlICo9IHNjYWxlRmFjdG9yOwotICAgICAgICAgICAgbU1pblpvb21TY2FsZSAqPSBzY2FsZUZhY3RvcjsKLSAgICAgICAgICAgIHNldE5ld1pvb21TY2FsZShtQWN0dWFsU2NhbGUgKiBzY2FsZUZhY3RvciwgdHJ1ZSwgZmFsc2UpOwotICAgICAgICB9CisgICAgICAgIG1OYXZTbG9wID0gKGludCkgKDE2ICogZGVuc2l0eSk7CisgICAgICAgIG1ab29tTWFuYWdlci51cGRhdGVEZWZhdWx0Wm9vbURlbnNpdHkoZGVuc2l0eSk7CiAgICAgfQogCiAgICAgLyogcGFja2FnZSAqLyBib29sZWFuIG9uU2F2ZVBhc3N3b3JkKFN0cmluZyBzY2hlbWVQbHVzSG9zdCwgU3RyaW5nIHVzZXJuYW1lLApAQCAtMTE5NCwxNiArMTE3MiwxNyBAQAogICAgICAqIHJldHVybnMgdGhlIGhlaWdodCBvZiB0aGUgdGl0bGViYXJ2aWV3IChpZiBhbnkpLiBEb2VzIG5vdCBjYXJlIGFib3V0CiAgICAgICogc2Nyb2xsaW5nCiAgICAgICovCi0gICAgcHJpdmF0ZSBpbnQgZ2V0VGl0bGVIZWlnaHQoKSB7CisgICAgaW50IGdldFRpdGxlSGVpZ2h0KCkgewogICAgICAgICByZXR1cm4gbVRpdGxlQmFyICE9IG51bGwgPyBtVGl0bGVCYXIuZ2V0SGVpZ2h0KCkgOiAwOwogICAgIH0KIAogICAgIC8qCiAgICAgICogUmV0dXJuIHRoZSBhbW91bnQgb2YgdGhlIHRpdGxlYmFydmlldyAoaWYgYW55KSB0aGF0IGlzIHZpc2libGUKKyAgICAgKgorICAgICAqIEBoaWRlCiAgICAgICovCi0gICAgcHJpdmF0ZSBpbnQgZ2V0VmlzaWJsZVRpdGxlSGVpZ2h0KCkgewotICAgICAgICAvLyBuZWVkIHRvIHJlc3RyaWN0IG1TY3JvbGxZIGR1ZSB0byBvdmVyIHNjcm9sbAotICAgICAgICByZXR1cm4gTWF0aC5tYXgoZ2V0VGl0bGVIZWlnaHQoKSAtIE1hdGgubWF4KDAsIG1TY3JvbGxZKSwgMCk7CisgICAgcHVibGljIGludCBnZXRWaXNpYmxlVGl0bGVIZWlnaHQoKSB7CisgICAgICAgIHJldHVybiBNYXRoLm1heChnZXRUaXRsZUhlaWdodCgpIC0gbVNjcm9sbFksIDApOwogICAgIH0KIAogICAgIC8qCkBAIC0xMjg1LDEyICsxMjY0LDM1IEBACiAgICAgfQogCiAgICAgLyoqCisgICAgICogUmVtb3ZlIEZpbmQgb3IgU2VsZWN0IEFjdGlvbk1vZGVzLCBpZiBhY3RpdmUuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIGNsZWFyQWN0aW9uTW9kZXMoKSB7CisgICAgICAgIGlmIChtU2VsZWN0Q2FsbGJhY2sgIT0gbnVsbCkgeworICAgICAgICAgICAgbVNlbGVjdENhbGxiYWNrLmZpbmlzaCgpOworICAgICAgICB9CisgICAgICAgIGlmIChtRmluZENhbGxiYWNrICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1GaW5kQ2FsbGJhY2suZmluaXNoKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDYWxsZWQgdG8gY2xlYXIgc3RhdGUgd2hlbiBtb3ZpbmcgZnJvbSBvbmUgcGFnZSB0byBhbm90aGVyLCBvciBjaGFuZ2luZworICAgICAqIGluIHNvbWUgb3RoZXIgd2F5IHRoYXQgbWFrZXMgZWxlbWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoZSBjdXJyZW50IHBhZ2UKKyAgICAgKiAoc3VjaCBhcyBXZWJUZXh0VmlldyBvciBBY3Rpb25Nb2Rlcykgbm8gbG9uZ2VyIHJlbGV2YW50LgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBjbGVhckhlbHBlcnMoKSB7CisgICAgICAgIGNsZWFyVGV4dEVudHJ5KCk7CisgICAgICAgIGNsZWFyQWN0aW9uTW9kZXMoKTsKKyAgICB9CisKKyAgICAvKioKICAgICAgKiBEZXN0cm95IHRoZSBpbnRlcm5hbCBzdGF0ZSBvZiB0aGUgV2ViVmlldy4gVGhpcyBtZXRob2Qgc2hvdWxkIGJlIGNhbGxlZAogICAgICAqIGFmdGVyIHRoZSBXZWJWaWV3IGhhcyBiZWVuIHJlbW92ZWQgZnJvbSB0aGUgdmlldyBzeXN0ZW0uIE5vIG90aGVyCiAgICAgICogbWV0aG9kcyBtYXkgYmUgY2FsbGVkIG9uIGEgV2ViVmlldyBhZnRlciBkZXN0cm95LgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIGRlc3Ryb3koKSB7Ci0gICAgICAgIGNsZWFyVGV4dEVudHJ5KGZhbHNlKTsKKyAgICAgICAgY2xlYXJIZWxwZXJzKCk7CisKICAgICAgICAgaWYgKG1XZWJWaWV3Q29yZSAhPSBudWxsKSB7CiAgICAgICAgICAgICAvLyBTZXQgdGhlIGhhbmRsZXJzIHRvIG51bGwgYmVmb3JlIGRlc3Ryb3lpbmcgV2ViVmlld0NvcmUgc28gbm8KICAgICAgICAgICAgIC8vIG1vcmUgbWVzc2FnZXMgd2lsbCBiZSBwb3N0ZWQuCkBAIC0xNDE4LDYgKzE0MjAsOCBAQAogICAgICAgICAgICAgb3V0U3RhdGUucHV0QnVuZGxlKCJjZXJ0aWZpY2F0ZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3NsQ2VydGlmaWNhdGUuc2F2ZVN0YXRlKG1DZXJ0aWZpY2F0ZSkpOwogICAgICAgICB9CisgICAgICAgIG91dFN0YXRlLnB1dEJvb2xlYW4oInByaXZhdGVCcm93c2luZ0VuYWJsZWQiLCBpc1ByaXZhdGVCcm93c2luZ0VuYWJsZWQoKSk7CisgICAgICAgIG1ab29tTWFuYWdlci5zYXZlWm9vbVN0YXRlKG91dFN0YXRlKTsKICAgICAgICAgcmV0dXJuIGxpc3Q7CiAgICAgfQogCkBAIC0xNDYzLDI5ICsxNDY3LDIzIEBACiAgICAgICAgIC8vIG5vdyB1cGRhdGUgdGhlIGJ1bmRsZQogICAgICAgICBiLnB1dEludCgic2Nyb2xsWCIsIG1TY3JvbGxYKTsKICAgICAgICAgYi5wdXRJbnQoInNjcm9sbFkiLCBtU2Nyb2xsWSk7Ci0gICAgICAgIGIucHV0RmxvYXQoInNjYWxlIiwgbUFjdHVhbFNjYWxlKTsKLSAgICAgICAgYi5wdXRGbG9hdCgidGV4dHdyYXBTY2FsZSIsIG1UZXh0V3JhcFNjYWxlKTsKLSAgICAgICAgYi5wdXRCb29sZWFuKCJvdmVydmlldyIsIG1Jblpvb21PdmVydmlldyk7CisgICAgICAgIG1ab29tTWFuYWdlci5zYXZlWm9vbVN0YXRlKGIpOwogICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CiAKICAgICBwcml2YXRlIHZvaWQgcmVzdG9yZUhpc3RvcnlQaWN0dXJlRmllbGRzKFBpY3R1cmUgcCwgQnVuZGxlIGIpIHsKICAgICAgICAgaW50IHN4ID0gYi5nZXRJbnQoInNjcm9sbFgiLCAwKTsKICAgICAgICAgaW50IHN5ID0gYi5nZXRJbnQoInNjcm9sbFkiLCAwKTsKLSAgICAgICAgZmxvYXQgc2NhbGUgPSBiLmdldEZsb2F0KCJzY2FsZSIsIDEuMGYpOworCiAgICAgICAgIG1EcmF3SGlzdG9yeSA9IHRydWU7CiAgICAgICAgIG1IaXN0b3J5UGljdHVyZSA9IHA7CiAgICAgICAgIG1TY3JvbGxYID0gc3g7CiAgICAgICAgIG1TY3JvbGxZID0gc3k7CisgICAgICAgIG1ab29tTWFuYWdlci5yZXN0b3JlWm9vbVN0YXRlKGIpOworICAgICAgICBmaW5hbCBmbG9hdCBzY2FsZSA9IG1ab29tTWFuYWdlci5nZXRTY2FsZSgpOwogICAgICAgICBtSGlzdG9yeVdpZHRoID0gTWF0aC5yb3VuZChwLmdldFdpZHRoKCkgKiBzY2FsZSk7CiAgICAgICAgIG1IaXN0b3J5SGVpZ2h0ID0gTWF0aC5yb3VuZChwLmdldEhlaWdodCgpICogc2NhbGUpOwotICAgICAgICAvLyBhcyBnZXRXaWR0aCgpIC8gZ2V0SGVpZ2h0KCkgb2YgdGhlIHZpZXcgYXJlIG5vdCBhdmFpbGFibGUgeWV0LCBzZXQgdXAKLSAgICAgICAgLy8gbUFjdHVhbFNjYWxlLCBzbyB0aGF0IHdoZW4gb25TaXplQ2hhbmdlZCgpIGlzIGNhbGxlZCwgdGhlIHJlc3Qgd2lsbAotICAgICAgICAvLyBiZSBzZXQgY29ycmVjdGx5Ci0gICAgICAgIG1BY3R1YWxTY2FsZSA9IHNjYWxlOwotICAgICAgICBtSW52QWN0dWFsU2NhbGUgPSAxIC8gc2NhbGU7Ci0gICAgICAgIG1UZXh0V3JhcFNjYWxlID0gYi5nZXRGbG9hdCgidGV4dHdyYXBTY2FsZSIsIHNjYWxlKTsKLSAgICAgICAgbUluWm9vbU92ZXJ2aWV3ID0gYi5nZXRCb29sZWFuKCJvdmVydmlldyIpOworCiAgICAgICAgIGludmFsaWRhdGUoKTsKICAgICB9CiAKQEAgLTE1ODYsNiArMTU4NCwxMSBAQAogICAgICAgICAgICAgICAgIC8vIFVwZGF0ZSB0aGUgY29weSB0byBoYXZlIHRoZSBjb3JyZWN0IGluZGV4LgogICAgICAgICAgICAgICAgIHJldHVybkxpc3Quc2V0Q3VycmVudEluZGV4KGluZGV4KTsKICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIFJlc3RvcmUgcHJpdmF0ZSBicm93c2luZyBzZXR0aW5nLgorICAgICAgICAgICAgaWYgKGluU3RhdGUuZ2V0Qm9vbGVhbigicHJpdmF0ZUJyb3dzaW5nRW5hYmxlZCIpKSB7CisgICAgICAgICAgICAgICAgZ2V0U2V0dGluZ3MoKS5zZXRQcml2YXRlQnJvd3NpbmdFbmFibGVkKHRydWUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbVpvb21NYW5hZ2VyLnJlc3RvcmVab29tU3RhdGUoaW5TdGF0ZSk7CiAgICAgICAgICAgICAvLyBSZW1vdmUgYWxsIHBlbmRpbmcgbWVzc2FnZXMgYmVjYXVzZSB3ZSBhcmUgcmVzdG9yaW5nIHByZXZpb3VzCiAgICAgICAgICAgICAvLyBzdGF0ZS4KICAgICAgICAgICAgIG1XZWJWaWV3Q29yZS5yZW1vdmVNZXNzYWdlcygpOwpAQCAtMTYwOCw3ICsxNjExLDcgQEAKICAgICAgICAgYXJnLm1VcmwgPSB1cmw7CiAgICAgICAgIGFyZy5tRXh0cmFIZWFkZXJzID0gZXh0cmFIZWFkZXJzOwogICAgICAgICBtV2ViVmlld0NvcmUuc2VuZE1lc3NhZ2UoRXZlbnRIdWIuTE9BRF9VUkwsIGFyZyk7Ci0gICAgICAgIGNsZWFyVGV4dEVudHJ5KGZhbHNlKTsKKyAgICAgICAgY2xlYXJIZWxwZXJzKCk7CiAgICAgfQogCiAgICAgLyoqCkBAIC0xNjM3LDcgKzE2NDAsNyBAQAogICAgICAgICAgICAgYXJnLm1VcmwgPSB1cmw7CiAgICAgICAgICAgICBhcmcubVBvc3REYXRhID0gcG9zdERhdGE7CiAgICAgICAgICAgICBtV2ViVmlld0NvcmUuc2VuZE1lc3NhZ2UoRXZlbnRIdWIuUE9TVF9VUkwsIGFyZyk7Ci0gICAgICAgICAgICBjbGVhclRleHRFbnRyeShmYWxzZSk7CisgICAgICAgICAgICBjbGVhckhlbHBlcnMoKTsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIGxvYWRVcmwodXJsKTsKICAgICAgICAgfQpAQCAtMTY5Myw3ICsxNjk2LDQ2IEBACiAgICAgICAgIGFyZy5tRW5jb2RpbmcgPSBlbmNvZGluZzsKICAgICAgICAgYXJnLm1IaXN0b3J5VXJsID0gaGlzdG9yeVVybDsKICAgICAgICAgbVdlYlZpZXdDb3JlLnNlbmRNZXNzYWdlKEV2ZW50SHViLkxPQURfREFUQSwgYXJnKTsKLSAgICAgICAgY2xlYXJUZXh0RW50cnkoZmFsc2UpOworICAgICAgICBjbGVhckhlbHBlcnMoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTYXZlcyB0aGUgY3VycmVudCB2aWV3IGFzIGEgd2ViIGFyY2hpdmUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZmlsZW5hbWUgVGhlIGZpbGVuYW1lIHdoZXJlIHRoZSBhcmNoaXZlIHNob3VsZCBiZSBwbGFjZWQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2F2ZVdlYkFyY2hpdmUoU3RyaW5nIGZpbGVuYW1lKSB7CisgICAgICAgIHNhdmVXZWJBcmNoaXZlKGZpbGVuYW1lLCBmYWxzZSwgbnVsbCk7CisgICAgfQorCisgICAgLyogcGFja2FnZSAqLyBzdGF0aWMgY2xhc3MgU2F2ZVdlYkFyY2hpdmVNZXNzYWdlIHsKKyAgICAgICAgU2F2ZVdlYkFyY2hpdmVNZXNzYWdlIChTdHJpbmcgYmFzZW5hbWUsIGJvb2xlYW4gYXV0b25hbWUsIFZhbHVlQ2FsbGJhY2s8U3RyaW5nPiBjYWxsYmFjaykgeworICAgICAgICAgICAgbUJhc2VuYW1lID0gYmFzZW5hbWU7CisgICAgICAgICAgICBtQXV0b25hbWUgPSBhdXRvbmFtZTsKKyAgICAgICAgICAgIG1DYWxsYmFjayA9IGNhbGxiYWNrOworICAgICAgICB9CisKKyAgICAgICAgLyogcGFja2FnZSAqLyBmaW5hbCBTdHJpbmcgbUJhc2VuYW1lOworICAgICAgICAvKiBwYWNrYWdlICovIGZpbmFsIGJvb2xlYW4gbUF1dG9uYW1lOworICAgICAgICAvKiBwYWNrYWdlICovIGZpbmFsIFZhbHVlQ2FsbGJhY2s8U3RyaW5nPiBtQ2FsbGJhY2s7CisgICAgICAgIC8qIHBhY2thZ2UgKi8gU3RyaW5nIG1SZXN1bHRGaWxlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNhdmVzIHRoZSBjdXJyZW50IHZpZXcgYXMgYSB3ZWIgYXJjaGl2ZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBiYXNlbmFtZSBUaGUgZmlsZW5hbWUgd2hlcmUgdGhlIGFyY2hpdmUgc2hvdWxkIGJlIHBsYWNlZC4KKyAgICAgKiBAcGFyYW0gYXV0b25hbWUgSWYgZmFsc2UsIHRha2VzIGJhc2VuYW1lIHRvIGJlIGEgZmlsZS4gSWYgdHJ1ZSwgYmFzZW5hbWUKKyAgICAgKiAgICAgICAgICAgICAgICAgaXMgYXNzdW1lZCB0byBiZSBhIGRpcmVjdG9yeSBpbiB3aGljaCBhIGZpbGVuYW1lIHdpbGwgYmUKKyAgICAgKiAgICAgICAgICAgICAgICAgY2hvc2VuIGFjY29yZGluZyB0byB0aGUgdXJsIG9mIHRoZSBjdXJyZW50IHBhZ2UuCisgICAgICogQHBhcmFtIGNhbGxiYWNrIENhbGxlZCBhZnRlciB0aGUgd2ViIGFyY2hpdmUgaGFzIGJlZW4gc2F2ZWQuIFRoZQorICAgICAqICAgICAgICAgICAgICAgICBwYXJhbWV0ZXIgZm9yIG9uUmVjZWl2ZVZhbHVlIHdpbGwgZWl0aGVyIGJlIHRoZSBmaWxlbmFtZQorICAgICAqICAgICAgICAgICAgICAgICB1bmRlciB3aGljaCB0aGUgZmlsZSB3YXMgc2F2ZWQsIG9yIG51bGwgaWYgc2F2aW5nIHRoZQorICAgICAqICAgICAgICAgICAgICAgICBmaWxlIGZhaWxlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzYXZlV2ViQXJjaGl2ZShTdHJpbmcgYmFzZW5hbWUsIGJvb2xlYW4gYXV0b25hbWUsIFZhbHVlQ2FsbGJhY2s8U3RyaW5nPiBjYWxsYmFjaykgeworICAgICAgICBtV2ViVmlld0NvcmUuc2VuZE1lc3NhZ2UoRXZlbnRIdWIuU0FWRV9XRUJBUkNISVZFLAorICAgICAgICAgICAgbmV3IFNhdmVXZWJBcmNoaXZlTWVzc2FnZShiYXNlbmFtZSwgYXV0b25hbWUsIGNhbGxiYWNrKSk7CiAgICAgfQogCiAgICAgLyoqCkBAIC0xNzEwLDcgKzE3NTIsNyBAQAogICAgICAqIFJlbG9hZCB0aGUgY3VycmVudCB1cmwuCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgcmVsb2FkKCkgewotICAgICAgICBjbGVhclRleHRFbnRyeShmYWxzZSk7CisgICAgICAgIGNsZWFySGVscGVycygpOwogICAgICAgICBzd2l0Y2hPdXREcmF3SGlzdG9yeSgpOwogICAgICAgICBtV2ViVmlld0NvcmUuc2VuZE1lc3NhZ2UoRXZlbnRIdWIuUkVMT0FEKTsKICAgICB9CkBAIC0xNzkwLDEyICsxODMyLDQ2IEBACiAKICAgICBwcml2YXRlIHZvaWQgZ29CYWNrT3JGb3J3YXJkKGludCBzdGVwcywgYm9vbGVhbiBpZ25vcmVTbmFwc2hvdCkgewogICAgICAgICBpZiAoc3RlcHMgIT0gMCkgewotICAgICAgICAgICAgY2xlYXJUZXh0RW50cnkoZmFsc2UpOworICAgICAgICAgICAgY2xlYXJIZWxwZXJzKCk7CiAgICAgICAgICAgICBtV2ViVmlld0NvcmUuc2VuZE1lc3NhZ2UoRXZlbnRIdWIuR09fQkFDS19GT1JXQVJELCBzdGVwcywKICAgICAgICAgICAgICAgICAgICAgaWdub3JlU25hcHNob3QgPyAxIDogMCk7CiAgICAgICAgIH0KICAgICB9CiAKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRydWUgaWYgcHJpdmF0ZSBicm93c2luZyBpcyBlbmFibGVkIGluIHRoaXMgV2ViVmlldy4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc1ByaXZhdGVCcm93c2luZ0VuYWJsZWQoKSB7CisgICAgICAgIHJldHVybiBnZXRTZXR0aW5ncygpLmlzUHJpdmF0ZUJyb3dzaW5nRW5hYmxlZCgpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBzdGFydFByaXZhdGVCcm93c2luZygpIHsKKyAgICAgICAgYm9vbGVhbiB3YXNQcml2YXRlQnJvd3NpbmdFbmFibGVkID0gaXNQcml2YXRlQnJvd3NpbmdFbmFibGVkKCk7CisKKyAgICAgICAgZ2V0U2V0dGluZ3MoKS5zZXRQcml2YXRlQnJvd3NpbmdFbmFibGVkKHRydWUpOworCisgICAgICAgIGlmICghd2FzUHJpdmF0ZUJyb3dzaW5nRW5hYmxlZCkgeworICAgICAgICAgICAgbG9hZFVybCgiYnJvd3NlcjppbmNvZ25pdG8iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIERlbGV0ZXMgYW55IGZpbGVzIHRoYXQgd2VyZSBjcmVhdGVkIGFzIGEgcGFydCBvZiB0aGUgbGFzdCBwcml2YXRlCisgICAgICogYnJvd3Npbmcgc2Vzc2lvbiBhbmQgY2xlYXJzIGFueSBpbnRlcm5hbCBzdGF0ZSBhc3NvY2lhdGVkIHdpdGggdGhhdAorICAgICAqIHNlc3Npb24uIFRoZSBjb25zZXF1ZW5jZXMgb2YgY2FsbGluZyB0aGlzIG1ldGhvZCB3aGlsZSBhIHByaXZhdGUKKyAgICAgKiBicm93c2luZyBzZXNzaW9uIGlzIGFjdGl2ZSBhcmUgdW5zcGVjaWZpZWQuCisgICAgICogQHBhcmFtIGNvbnRleHQgVGhlIHNhbWUgY29udGV4dCB3aGljaCB3YXMgdXNlZCB0byBjcmVhdGUgdGhlIHByaXZhdGUKKyAgICAgKiAgICAgICAgICAgICAgICBicm93c2luZyBXZWJWaWV3LgorICAgICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgcHJpdmF0ZSBicm93c2luZyBmaWxlcyB3ZXJlIHN1Y2Nlc3NmdWxseSBkZWxldGVkLAorICAgICAqICAgICAgICAgZmFsc2Ugb3RoZXJ3aXNlLgorICAgICAqIEBoaWRlIHBlbmRpbmcgQVBJIGNvdW5jaWwgYXBwcm92YWwuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBib29sZWFuIGNsZWFudXBQcml2YXRlQnJvd3NpbmdGaWxlcyhDb250ZXh0IGNvbnRleHQpIHsKKyAgICAgICAgcmV0dXJuIG5hdGl2ZUNsZWFudXBQcml2YXRlQnJvd3NpbmdGaWxlcyhjb250ZXh0LmdldEZpbGVzRGlyKCkuZ2V0UGFyZW50KCkpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIG5hdGl2ZSBib29sZWFuIG5hdGl2ZUNsZWFudXBQcml2YXRlQnJvd3NpbmdGaWxlcyhTdHJpbmcgZGF0YURpcmVjdG9yeSk7CisKICAgICBwcml2YXRlIGJvb2xlYW4gZXh0ZW5kU2Nyb2xsKGludCB5KSB7CiAgICAgICAgIGludCBmaW5hbFkgPSBtU2Nyb2xsZXIuZ2V0RmluYWxZKCk7CiAgICAgICAgIGludCBuZXdZID0gcGluTG9jWShmaW5hbFkgKyB5KTsKQEAgLTE4NDMsNyArMTkxOSw3IEBACiAgICAgICAgIH0KICAgICAgICAgbmF0aXZlQ2xlYXJDdXJzb3IoKTsgLy8gc3RhcnQgbmV4dCB0cmFja2JhbGwgbW92ZW1lbnQgZnJvbSBwYWdlIGVkZ2UKICAgICAgICAgaWYgKGJvdHRvbSkgewotICAgICAgICAgICAgcmV0dXJuIHBpblNjcm9sbFRvKG1TY3JvbGxYLCBjb21wdXRlUmVhbFZlcnRpY2FsU2Nyb2xsUmFuZ2UoKSwgdHJ1ZSwgMCk7CisgICAgICAgICAgICByZXR1cm4gcGluU2Nyb2xsVG8obVNjcm9sbFgsIGNvbXB1dGVWZXJ0aWNhbFNjcm9sbFJhbmdlKCksIHRydWUsIDApOwogICAgICAgICB9CiAgICAgICAgIC8vIFBhZ2UgZG93bi4KICAgICAgICAgaW50IGggPSBnZXRIZWlnaHQoKTsKQEAgLTE4NjUsNiArMTk0MSw3IEBACiAgICAgcHVibGljIHZvaWQgY2xlYXJWaWV3KCkgewogICAgICAgICBtQ29udGVudFdpZHRoID0gMDsKICAgICAgICAgbUNvbnRlbnRIZWlnaHQgPSAwOworICAgICAgICBuYXRpdmVTZXRCYXNlTGF5ZXIoMCk7CiAgICAgICAgIG1XZWJWaWV3Q29yZS5zZW5kTWVzc2FnZShFdmVudEh1Yi5DTEVBUl9DT05URU5UKTsKICAgICB9CiAKQEAgLTE4NzgsOCArMTk1NSw5IEBACiAgICAgICogICAgICAgICBib3VuZHMgb2YgdGhlIHZpZXcuCiAgICAgICovCiAgICAgcHVibGljIFBpY3R1cmUgY2FwdHVyZVBpY3R1cmUoKSB7Ci0gICAgICAgIGlmIChudWxsID09IG1XZWJWaWV3Q29yZSkgcmV0dXJuIG51bGw7IC8vIGNoZWNrIGZvciBvdXQgb2YgbWVtb3J5IHRhYgotICAgICAgICByZXR1cm4gbVdlYlZpZXdDb3JlLmNvcHlDb250ZW50UGljdHVyZSgpOworICAgICAgICBQaWN0dXJlIHJlc3VsdCA9IG5ldyBQaWN0dXJlKCk7CisgICAgICAgIG5hdGl2ZUNvcHlCYXNlQ29udGVudFRvUGljdHVyZShyZXN1bHQpOworICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgIH0KIAogICAgIC8qKgpAQCAtMTg5MSwxNSArMTk2OSwxMyBAQAogCiAgICAgLyoqCiAgICAgICogUmVtb3ZlIHRoZSBXZWJUZXh0Vmlldy4KLSAgICAgKiBAcGFyYW0gZGlzYWJsZUZvY3VzQ29udHJvbGxlciBJZiB0cnVlLCBzZW5kIGEgbWVzc2FnZSB0byB3ZWJraXQKLSAgICAgKiAgICAgZGlzYWJsaW5nIHRoZSBmb2N1cyBjb250cm9sbGVyLCBzbyB0aGUgY2FyZXQgc3RvcHMgYmxpbmtpbmcuCiAgICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGNsZWFyVGV4dEVudHJ5KGJvb2xlYW4gZGlzYWJsZUZvY3VzQ29udHJvbGxlcikgeworICAgIHByaXZhdGUgdm9pZCBjbGVhclRleHRFbnRyeSgpIHsKICAgICAgICAgaWYgKGluRWRpdGluZ01vZGUoKSkgewogICAgICAgICAgICAgbVdlYlRleHRWaWV3LnJlbW92ZSgpOwotICAgICAgICAgICAgaWYgKGRpc2FibGVGb2N1c0NvbnRyb2xsZXIpIHsKLSAgICAgICAgICAgICAgICBzZXRGb2N1c0NvbnRyb2xsZXJJbmFjdGl2ZSgpOwotICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gVGhlIGtleWJvYXJkIG1heSBiZSBvcGVuIHdpdGggdGhlIFdlYlZpZXcgYXMgdGhlIHNlcnZlZCB2aWV3CisgICAgICAgICAgICBoaWRlU29mdEtleWJvYXJkKCk7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTE5MDgsNyArMTk4NCw3IEBACiAgICAgICogQHJldHVybiBUaGUgY3VycmVudCBzY2FsZS4KICAgICAgKi8KICAgICBwdWJsaWMgZmxvYXQgZ2V0U2NhbGUoKSB7Ci0gICAgICAgIHJldHVybiBtQWN0dWFsU2NhbGU7CisgICAgICAgIHJldHVybiBtWm9vbU1hbmFnZXIuZ2V0U2NhbGUoKTsKICAgICB9CiAKICAgICAvKioKQEAgLTE5MjAsNyArMTk5Niw3IEBACiAgICAgICogQHBhcmFtIHNjYWxlSW5QZXJjZW50IFRoZSBpbml0aWFsIHNjYWxlIGluIHBlcmNlbnQuCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0SW5pdGlhbFNjYWxlKGludCBzY2FsZUluUGVyY2VudCkgewotICAgICAgICBtSW5pdGlhbFNjYWxlSW5QZXJjZW50ID0gc2NhbGVJblBlcmNlbnQ7CisgICAgICAgIG1ab29tTWFuYWdlci5zZXRJbml0aWFsU2NhbGVJblBlcmNlbnQoc2NhbGVJblBlcmNlbnQpOwogICAgIH0KIAogICAgIC8qKgpAQCAtMTkzMywxNCArMjAwOSw4IEBACiAgICAgICAgICAgICBMb2cudyhMT0dUQUcsICJUaGlzIFdlYlZpZXcgZG9lc24ndCBzdXBwb3J0IHpvb20uIik7CiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KLSAgICAgICAgY2xlYXJUZXh0RW50cnkoZmFsc2UpOwotICAgICAgICBpZiAoZ2V0U2V0dGluZ3MoKS5nZXRCdWlsdEluWm9vbUNvbnRyb2xzKCkpIHsKLSAgICAgICAgICAgIGdldFpvb21CdXR0b25zQ29udHJvbGxlcigpLnNldFZpc2libGUodHJ1ZSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtUHJpdmF0ZUhhbmRsZXIucmVtb3ZlQ2FsbGJhY2tzKG1ab29tQ29udHJvbFJ1bm5hYmxlKTsKLSAgICAgICAgICAgIG1Qcml2YXRlSGFuZGxlci5wb3N0RGVsYXllZChtWm9vbUNvbnRyb2xSdW5uYWJsZSwKLSAgICAgICAgICAgICAgICAgICAgWk9PTV9DT05UUk9MU19USU1FT1VUKTsKLSAgICAgICAgfQorICAgICAgICBjbGVhckhlbHBlcnMoKTsKKyAgICAgICAgbVpvb21NYW5hZ2VyLmludm9rZVpvb21QaWNrZXIoKTsKICAgICB9CiAKICAgICAvKioKQEAgLTIwNTUsNyArMjEyNSw3IEBACiAgICAgICAgIG1zZy5zZW5kVG9UYXJnZXQoKTsKICAgICB9CiAKLSAgICBwcml2YXRlIHN0YXRpYyBpbnQgcGluTG9jKGludCB4LCBpbnQgdmlld01heCwgaW50IGRvY01heCkgeworICAgIHN0YXRpYyBpbnQgcGluTG9jKGludCB4LCBpbnQgdmlld01heCwgaW50IGRvY01heCkgewogLy8gICAgICAgIExvZy5kKExPR1RBRywgIi0tIHBpbkxvYyAiICsgeCArICIgIiArIHZpZXdNYXggKyAiICIgKyBkb2NNYXgpOwogICAgICAgICBpZiAoZG9jTWF4IDwgdmlld01heCkgeyAgIC8vIHRoZSBkb2MgaGFzIHJvb20gb24gdGhlIHNpZGVzIGZvciAiYmxhbmsiCiAgICAgICAgICAgICAvLyBwaW4gdGhlIHNob3J0IGRvY3VtZW50IHRvIHRoZSB0b3AvbGVmdCBvZiB0aGUgc2NyZWVuCkBAIC0yMDcyLDE2ICsyMTQyLDE0IEBACiAgICAgfQogCiAgICAgLy8gRXhwZWN0cyB4IGluIHZpZXcgY29vcmRpbmF0ZXMKLSAgICBwcml2YXRlIGludCBwaW5Mb2NYKGludCB4KSB7Ci0gICAgICAgIGlmIChtSW5PdmVyU2Nyb2xsTW9kZSkgcmV0dXJuIHg7Ci0gICAgICAgIHJldHVybiBwaW5Mb2MoeCwgZ2V0Vmlld1dpZHRoKCksIGNvbXB1dGVSZWFsSG9yaXpvbnRhbFNjcm9sbFJhbmdlKCkpOworICAgIGludCBwaW5Mb2NYKGludCB4KSB7CisgICAgICAgIHJldHVybiBwaW5Mb2MoeCwgZ2V0Vmlld1dpZHRoKCksIGNvbXB1dGVIb3Jpem9udGFsU2Nyb2xsUmFuZ2UoKSk7CiAgICAgfQogCiAgICAgLy8gRXhwZWN0cyB5IGluIHZpZXcgY29vcmRpbmF0ZXMKLSAgICBwcml2YXRlIGludCBwaW5Mb2NZKGludCB5KSB7Ci0gICAgICAgIGlmIChtSW5PdmVyU2Nyb2xsTW9kZSkgcmV0dXJuIHk7CisgICAgaW50IHBpbkxvY1koaW50IHkpIHsKICAgICAgICAgcmV0dXJuIHBpbkxvYyh5LCBnZXRWaWV3SGVpZ2h0V2l0aFRpdGxlKCksCi0gICAgICAgICAgICAgICAgICAgICAgY29tcHV0ZVJlYWxWZXJ0aWNhbFNjcm9sbFJhbmdlKCkgKyBnZXRUaXRsZUhlaWdodCgpKTsKKyAgICAgICAgICAgICAgICAgICAgICBjb21wdXRlVmVydGljYWxTY3JvbGxSYW5nZSgpICsgZ2V0VGl0bGVIZWlnaHQoKSk7CiAgICAgfQogCiAgICAgLyoqCkBAIC0yMTA2LDYgKzIxNzQsMTYgQEAKICAgICAgKiBAaGlkZQogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldEVtYmVkZGVkVGl0bGVCYXIoVmlldyB2KSB7CisgICAgICAgIGlmIChudWxsID09IHYpIHsKKyAgICAgICAgICAgIC8vIElmIG9uZSBvZiBvdXIgY2FsbGJhY2tzIGlzIGhvbGRpbmcgb250byB0aGUgdGl0bGViYXIgdG8gcmVwbGFjZQorICAgICAgICAgICAgLy8gaXQgd2hlbiBpdHMgQWN0aW9uTW9kZSBlbmRzLCByZW1vdmUgaXQuCisgICAgICAgICAgICBpZiAobVNlbGVjdENhbGxiYWNrICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBtU2VsZWN0Q2FsbGJhY2suc2V0VGl0bGVCYXIobnVsbCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobUZpbmRDYWxsYmFjayAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgbUZpbmRDYWxsYmFjay5zZXRUaXRsZUJhcihudWxsKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQogICAgICAgICBpZiAobVRpdGxlQmFyID09IHYpIHJldHVybjsKICAgICAgICAgaWYgKG1UaXRsZUJhciAhPSBudWxsKSB7CiAgICAgICAgICAgICByZW1vdmVWaWV3KG1UaXRsZUJhcik7CkBAIC0yMTI5LDcgKzIyMDcsNyBAQAogICAgICAqIGhlaWdodC4KICAgICAgKi8KICAgICBwcml2YXRlIGludCB2aWV3VG9Db250ZW50RGltZW5zaW9uKGludCBkKSB7Ci0gICAgICAgIHJldHVybiBNYXRoLnJvdW5kKGQgKiBtSW52QWN0dWFsU2NhbGUpOworICAgICAgICByZXR1cm4gTWF0aC5yb3VuZChkICogbVpvb21NYW5hZ2VyLmdldEludlNjYWxlKCkpOwogICAgIH0KIAogICAgIC8qKgpAQCAtMjE1NSw3ICsyMjMzLDcgQEAKICAgICAgKiBSZXR1cm5zIHRoZSByZXN1bHQgYXMgYSBmbG9hdC4KICAgICAgKi8KICAgICBwcml2YXRlIGZsb2F0IHZpZXdUb0NvbnRlbnRYZihpbnQgeCkgewotICAgICAgICByZXR1cm4geCAqIG1JbnZBY3R1YWxTY2FsZTsKKyAgICAgICAgcmV0dXJuIHggKiBtWm9vbU1hbmFnZXIuZ2V0SW52U2NhbGUoKTsKICAgICB9CiAKICAgICAvKioKQEAgLTIxNjQsNyArMjI0Miw3IEBACiAgICAgICogZW1iZWRkZWQgaW50byB0aGUgV2ViVmlldy4gUmV0dXJucyB0aGUgcmVzdWx0IGFzIGEgZmxvYXQuCiAgICAgICovCiAgICAgcHJpdmF0ZSBmbG9hdCB2aWV3VG9Db250ZW50WWYoaW50IHkpIHsKLSAgICAgICAgcmV0dXJuICh5IC0gZ2V0VGl0bGVIZWlnaHQoKSkgKiBtSW52QWN0dWFsU2NhbGU7CisgICAgICAgIHJldHVybiAoeSAtIGdldFRpdGxlSGVpZ2h0KCkpICogbVpvb21NYW5hZ2VyLmdldEludlNjYWxlKCk7CiAgICAgfQogCiAgICAgLyoqCkBAIC0yMTc0LDcgKzIyNTIsNyBAQAogICAgICAqIGhlaWdodC4KICAgICAgKi8KICAgICAvKnBhY2thZ2UqLyBpbnQgY29udGVudFRvVmlld0RpbWVuc2lvbihpbnQgZCkgewotICAgICAgICByZXR1cm4gTWF0aC5yb3VuZChkICogbUFjdHVhbFNjYWxlKTsKKyAgICAgICAgcmV0dXJuIE1hdGgucm91bmQoZCAqIG1ab29tTWFuYWdlci5nZXRTY2FsZSgpKTsKICAgICB9CiAKICAgICAvKioKQEAgLTIyMTUsNyArMjI5Myw3IEBACiAgICAgLy8gQ2FsbGVkIGJ5IEpOSSB0byBpbnZhbGlkYXRlIHRoZSBWaWV3LCBnaXZlbiByZWN0YW5nbGUgY29vcmRpbmF0ZXMgaW4KICAgICAvLyBjb250ZW50IHNwYWNlCiAgICAgcHJpdmF0ZSB2b2lkIHZpZXdJbnZhbGlkYXRlKGludCBsLCBpbnQgdCwgaW50IHIsIGludCBiKSB7Ci0gICAgICAgIGZpbmFsIGZsb2F0IHNjYWxlID0gbUFjdHVhbFNjYWxlOworICAgICAgICBmaW5hbCBmbG9hdCBzY2FsZSA9IG1ab29tTWFuYWdlci5nZXRTY2FsZSgpOwogICAgICAgICBmaW5hbCBpbnQgZHkgPSBnZXRUaXRsZUhlaWdodCgpOwogICAgICAgICBpbnZhbGlkYXRlKChpbnQpTWF0aC5mbG9vcihsICogc2NhbGUpLAogICAgICAgICAgICAgICAgICAgIChpbnQpTWF0aC5mbG9vcih0ICogc2NhbGUpICsgZHksCkBAIC0yMjI2LDcgKzIzMDQsNyBAQAogICAgIC8vIENhbGxlZCBieSBKTkkgdG8gaW52YWxpZGF0ZSB0aGUgVmlldyBhZnRlciBhIGRlbGF5LCBnaXZlbiByZWN0YW5nbGUKICAgICAvLyBjb29yZGluYXRlcyBpbiBjb250ZW50IHNwYWNlCiAgICAgcHJpdmF0ZSB2b2lkIHZpZXdJbnZhbGlkYXRlRGVsYXllZChsb25nIGRlbGF5LCBpbnQgbCwgaW50IHQsIGludCByLCBpbnQgYikgewotICAgICAgICBmaW5hbCBmbG9hdCBzY2FsZSA9IG1BY3R1YWxTY2FsZTsKKyAgICAgICAgZmluYWwgZmxvYXQgc2NhbGUgPSBtWm9vbU1hbmFnZXIuZ2V0U2NhbGUoKTsKICAgICAgICAgZmluYWwgaW50IGR5ID0gZ2V0VGl0bGVIZWlnaHQoKTsKICAgICAgICAgcG9zdEludmFsaWRhdGVEZWxheWVkKGRlbGF5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludClNYXRoLmZsb29yKGwgKiBzY2FsZSksCkBAIC0yMjY0LDEzICsyMzQyLDcgQEAKICAgICAgICAgICAgIC8vIHVwZGF0ZWQgd2hlbiB3ZSBnZXQgb3V0IG9mIHRoYXQgbW9kZS4KICAgICAgICAgICAgIGlmICghbURyYXdIaXN0b3J5KSB7CiAgICAgICAgICAgICAgICAgLy8gcmVwaW4gb3VyIHNjcm9sbCwgdGFraW5nIGludG8gYWNjb3VudCB0aGUgbmV3IGNvbnRlbnQgc2l6ZQotICAgICAgICAgICAgICAgIGludCBvbGRYID0gbVNjcm9sbFg7Ci0gICAgICAgICAgICAgICAgaW50IG9sZFkgPSBtU2Nyb2xsWTsKLSAgICAgICAgICAgICAgICBtU2Nyb2xsWCA9IHBpbkxvY1gobVNjcm9sbFgpOwotICAgICAgICAgICAgICAgIG1TY3JvbGxZID0gcGluTG9jWShtU2Nyb2xsWSk7Ci0gICAgICAgICAgICAgICAgaWYgKG9sZFggIT0gbVNjcm9sbFggfHwgb2xkWSAhPSBtU2Nyb2xsWSkgewotICAgICAgICAgICAgICAgICAgICBvblNjcm9sbENoYW5nZWQobVNjcm9sbFgsIG1TY3JvbGxZLCBvbGRYLCBvbGRZKTsKLSAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgdXBkYXRlU2Nyb2xsQ29vcmRpbmF0ZXMocGluTG9jWChtU2Nyb2xsWCksIHBpbkxvY1kobVNjcm9sbFkpKTsKICAgICAgICAgICAgICAgICBpZiAoIW1TY3JvbGxlci5pc0ZpbmlzaGVkKCkpIHsKICAgICAgICAgICAgICAgICAgICAgLy8gV2UgYXJlIGluIHRoZSBtaWRkbGUgb2YgYSBzY3JvbGwuICBSZXBpbiB0aGUgZmluYWwgc2Nyb2xsCiAgICAgICAgICAgICAgICAgICAgIC8vIHBvc2l0aW9uLgpAQCAtMjI4Miw3NyArMjM1NCwxMiBAQAogICAgICAgICBjb250ZW50U2l6ZUNoYW5nZWQodXBkYXRlTGF5b3V0KTsKICAgICB9CiAKLSAgICBwcml2YXRlIHZvaWQgc2V0TmV3Wm9vbVNjYWxlKGZsb2F0IHNjYWxlLCBib29sZWFuIHVwZGF0ZVRleHRXcmFwU2NhbGUsCi0gICAgICAgICAgICBib29sZWFuIGZvcmNlKSB7Ci0gICAgICAgIGlmIChzY2FsZSA8IG1NaW5ab29tU2NhbGUpIHsKLSAgICAgICAgICAgIHNjYWxlID0gbU1pblpvb21TY2FsZTsKLSAgICAgICAgICAgIC8vIHNldCBtSW5ab29tT3ZlcnZpZXcgZm9yIG5vbiBtb2JpbGUgc2l0ZXMKLSAgICAgICAgICAgIGlmIChzY2FsZSA8IG1EZWZhdWx0U2NhbGUpIG1Jblpvb21PdmVydmlldyA9IHRydWU7Ci0gICAgICAgIH0gZWxzZSBpZiAoc2NhbGUgPiBtTWF4Wm9vbVNjYWxlKSB7Ci0gICAgICAgICAgICBzY2FsZSA9IG1NYXhab29tU2NhbGU7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHVwZGF0ZVRleHRXcmFwU2NhbGUpIHsKLSAgICAgICAgICAgIG1UZXh0V3JhcFNjYWxlID0gc2NhbGU7Ci0gICAgICAgICAgICAvLyByZXNldCBtTGFzdEhlaWdodFNlbnQgdG8gZm9yY2UgVklFV19TSVpFX0NIQU5HRUQgc2VudCB0byBXZWJLaXQKLSAgICAgICAgICAgIG1MYXN0SGVpZ2h0U2VudCA9IDA7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHNjYWxlICE9IG1BY3R1YWxTY2FsZSB8fCBmb3JjZSkgewotICAgICAgICAgICAgaWYgKG1EcmF3SGlzdG9yeSkgewotICAgICAgICAgICAgICAgIC8vIElmIGhpc3RvcnkgUGljdHVyZSBpcyBkcmF3biwgZG9uJ3QgdXBkYXRlIHNjcm9sbC4gVGhleSB3aWxsCi0gICAgICAgICAgICAgICAgLy8gYmUgdXBkYXRlZCB3aGVuIHdlIGdldCBvdXQgb2YgdGhhdCBtb2RlLgotICAgICAgICAgICAgICAgIGlmIChzY2FsZSAhPSBtQWN0dWFsU2NhbGUgJiYgIW1QcmV2aWV3Wm9vbU9ubHkpIHsKLSAgICAgICAgICAgICAgICAgICAgbUNhbGxiYWNrUHJveHkub25TY2FsZUNoYW5nZWQobUFjdHVhbFNjYWxlLCBzY2FsZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG1BY3R1YWxTY2FsZSA9IHNjYWxlOwotICAgICAgICAgICAgICAgIG1JbnZBY3R1YWxTY2FsZSA9IDEgLyBzY2FsZTsKLSAgICAgICAgICAgICAgICBzZW5kVmlld1NpemVab29tKCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIC8vIHVwZGF0ZSBvdXIgc2Nyb2xsIHNvIHdlIGRvbid0IGFwcGVhciB0byBqdW1wCi0gICAgICAgICAgICAgICAgLy8gaS5lLiBrZWVwIHRoZSBjZW50ZXIgb2YgdGhlIGRvYyBpbiB0aGUgY2VudGVyIG9mIHRoZSB2aWV3Ci0KLSAgICAgICAgICAgICAgICBpbnQgb2xkWCA9IG1TY3JvbGxYOwotICAgICAgICAgICAgICAgIGludCBvbGRZID0gbVNjcm9sbFk7Ci0gICAgICAgICAgICAgICAgZmxvYXQgcmF0aW8gPSBzY2FsZSAqIG1JbnZBY3R1YWxTY2FsZTsgICAvLyBvbGQgaW52ZXJzZQotICAgICAgICAgICAgICAgIGZsb2F0IHN4ID0gcmF0aW8gKiBvbGRYICsgKHJhdGlvIC0gMSkgKiBtWm9vbUNlbnRlclg7Ci0gICAgICAgICAgICAgICAgZmxvYXQgc3kgPSByYXRpbyAqIG9sZFkgKyAocmF0aW8gLSAxKQotICAgICAgICAgICAgICAgICAgICAgICAgKiAobVpvb21DZW50ZXJZIC0gZ2V0VGl0bGVIZWlnaHQoKSk7Ci0KLSAgICAgICAgICAgICAgICAvLyBub3cgdXBkYXRlIG91ciBuZXcgc2NhbGUgYW5kIGludmVyc2UKLSAgICAgICAgICAgICAgICBpZiAoc2NhbGUgIT0gbUFjdHVhbFNjYWxlICYmICFtUHJldmlld1pvb21Pbmx5KSB7Ci0gICAgICAgICAgICAgICAgICAgIG1DYWxsYmFja1Byb3h5Lm9uU2NhbGVDaGFuZ2VkKG1BY3R1YWxTY2FsZSwgc2NhbGUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBtQWN0dWFsU2NhbGUgPSBzY2FsZTsKLSAgICAgICAgICAgICAgICBtSW52QWN0dWFsU2NhbGUgPSAxIC8gc2NhbGU7Ci0KLSAgICAgICAgICAgICAgICAvLyBTY2FsZSBhbGwgdGhlIGNoaWxkIHZpZXdzCi0gICAgICAgICAgICAgICAgbVZpZXdNYW5hZ2VyLnNjYWxlQWxsKCk7Ci0KLSAgICAgICAgICAgICAgICAvLyBhcyB3ZSBkb24ndCBoYXZlIGFuaW1hdGlvbiBmb3Igc2NhbGluZywgZG9uJ3QgZG8gYW5pbWF0aW9uCi0gICAgICAgICAgICAgICAgLy8gZm9yIHNjcm9sbGluZywgYXMgaXQgY2F1c2VzIHdlaXJkIGludGVybWVkaWF0ZSBzdGF0ZQotICAgICAgICAgICAgICAgIC8vICAgICAgICBwaW5TY3JvbGxUbyhNYXRoLnJvdW5kKHN4KSwgTWF0aC5yb3VuZChzeSkpOwotICAgICAgICAgICAgICAgIG1TY3JvbGxYID0gcGluTG9jWChNYXRoLnJvdW5kKHN4KSk7Ci0gICAgICAgICAgICAgICAgbVNjcm9sbFkgPSBwaW5Mb2NZKE1hdGgucm91bmQoc3kpKTsKLQotICAgICAgICAgICAgICAgIC8vIHVwZGF0ZSB3ZWJraXQKLSAgICAgICAgICAgICAgICBpZiAob2xkWCAhPSBtU2Nyb2xsWCB8fCBvbGRZICE9IG1TY3JvbGxZKSB7Ci0gICAgICAgICAgICAgICAgICAgIG9uU2Nyb2xsQ2hhbmdlZChtU2Nyb2xsWCwgbVNjcm9sbFksIG9sZFgsIG9sZFkpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIHRoZSBzY3JvbGwgcG9zaXRpb24gaXMgYWRqdXN0ZWQgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUKLSAgICAgICAgICAgICAgICAgICAgLy8gem9vbSBhbmltYXRpb24uIEJ1dCB3ZSB3YW50IHRvIHVwZGF0ZSB0aGUgV2ViS2l0IGF0IHRoZQotICAgICAgICAgICAgICAgICAgICAvLyBlbmQgb2YgdGhlIHpvb20gYW5pbWF0aW9uLiBTZWUgY29tbWVudHMgaW4gb25TY2FsZUVuZCgpLgotICAgICAgICAgICAgICAgICAgICBzZW5kT3VyVmlzaWJsZVJlY3QoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgc2VuZFZpZXdTaXplWm9vbSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCiAgICAgLy8gVXNlZCB0byBhdm9pZCBzZW5kaW5nIG1hbnkgdmlzaWJsZSByZWN0IG1lc3NhZ2VzLgogICAgIHByaXZhdGUgUmVjdCBtTGFzdFZpc2libGVSZWN0U2VudDsKICAgICBwcml2YXRlIFJlY3QgbUxhc3RHbG9iYWxSZWN0OwogCi0gICAgcHJpdmF0ZSBSZWN0IHNlbmRPdXJWaXNpYmxlUmVjdCgpIHsKLSAgICAgICAgaWYgKG1QcmV2aWV3Wm9vbU9ubHkpIHJldHVybiBtTGFzdFZpc2libGVSZWN0U2VudDsKKyAgICBSZWN0IHNlbmRPdXJWaXNpYmxlUmVjdCgpIHsKKyAgICAgICAgaWYgKG1ab29tTWFuYWdlci5pc1ByZXZlbnRpbmdXZWJraXRVcGRhdGVzKCkpIHJldHVybiBtTGFzdFZpc2libGVSZWN0U2VudDsKIAogICAgICAgICBSZWN0IHJlY3QgPSBuZXcgUmVjdCgpOwogICAgICAgICBjYWxjT3VyQ29udGVudFZpc2libGVSZWN0KHJlY3QpOwpAQCAtMjM4NSwxNSArMjM5MiwxMiBAQAogICAgICAgICBQb2ludCBwID0gbmV3IFBvaW50KCk7CiAgICAgICAgIGdldEdsb2JhbFZpc2libGVSZWN0KHIsIHApOwogICAgICAgICByLm9mZnNldCgtcC54LCAtcC55KTsKLSAgICAgICAgaWYgKG1GaW5kSXNVcCkgewotICAgICAgICAgICAgci5ib3R0b20gLT0gbUZpbmRIZWlnaHQ7Ci0gICAgICAgIH0KICAgICB9CiAKICAgICAvLyBTZXRzIHIgdG8gYmUgb3VyIHZpc2libGUgcmVjdGFuZ2xlIGluIGNvbnRlbnQgY29vcmRpbmF0ZXMKICAgICBwcml2YXRlIHZvaWQgY2FsY091ckNvbnRlbnRWaXNpYmxlUmVjdChSZWN0IHIpIHsKICAgICAgICAgY2FsY091clZpc2libGVSZWN0KHIpOwotICAgICAgICAvLyBzaW5jZSB3ZSBtaWdodCBvdmVyc2Nyb2xsLCBwaW4gdGhlIHJlY3QgdG8gdGhlIGJvdW5kcyBvZiB0aGUgY29udGVudAorICAgICAgICAvLyBwaW4gdGhlIHJlY3QgdG8gdGhlIGJvdW5kcyBvZiB0aGUgY29udGVudAogICAgICAgICByLmxlZnQgPSBNYXRoLm1heCh2aWV3VG9Db250ZW50WChyLmxlZnQpLCAwKTsKICAgICAgICAgLy8gdmlld1RvQ29udGVudFkgd2lsbCByZW1vdmUgdGhlIHRvdGFsIGhlaWdodCBvZiB0aGUgdGl0bGUgYmFyLiAgQWRkCiAgICAgICAgIC8vIHRoZSB2aXNpYmxlIGhlaWdodCBiYWNrIGluIHRvIGFjY291bnQgZm9yIHRoZSBmYWN0IHRoYXQgaWYgdGhlIHRpdGxlCkBAIC0yNDM0LDE2ICsyNDM4LDE5IEBACiAKICAgICAvKioKICAgICAgKiBDb21wdXRlIHVuem9vbWVkIHdpZHRoIGFuZCBoZWlnaHQsIGFuZCBpZiB0aGV5IGRpZmZlciBmcm9tIHRoZSBsYXN0Ci0gICAgICogdmFsdWVzIHdlIHNlbnQsIHNlbmQgdGhlbSB0byB3ZWJraXQgKHRvIGJlIHVzZWQgaGFzIG5ldyB2aWV3cG9ydCkKKyAgICAgKiB2YWx1ZXMgd2Ugc2VudCwgc2VuZCB0aGVtIHRvIHdlYmtpdCAodG8gYmUgdXNlZCBhcyBuZXcgdmlld3BvcnQpCisgICAgICoKKyAgICAgKiBAcGFyYW0gZm9yY2UgZW5zdXJlcyB0aGF0IHRoZSBtZXNzYWdlIGlzIHNlbnQgdG8gd2Via2l0IGV2ZW4gaWYgdGhlIHdpZHRoCisgICAgICogb3IgaGVpZ2h0IGhhcyBub3QgY2hhbmdlZCBzaW5jZSB0aGUgbGFzdCBtZXNzYWdlCiAgICAgICoKICAgICAgKiBAcmV0dXJuIHRydWUgaWYgbmV3IHZhbHVlcyB3ZXJlIHNlbnQKICAgICAgKi8KLSAgICBwcml2YXRlIGJvb2xlYW4gc2VuZFZpZXdTaXplWm9vbSgpIHsKLSAgICAgICAgaWYgKG1QcmV2aWV3Wm9vbU9ubHkpIHJldHVybiBmYWxzZTsKKyAgICBib29sZWFuIHNlbmRWaWV3U2l6ZVpvb20oYm9vbGVhbiBmb3JjZSkgeworICAgICAgICBpZiAobVpvb21NYW5hZ2VyLmlzUHJldmVudGluZ1dlYmtpdFVwZGF0ZXMoKSkgcmV0dXJuIGZhbHNlOwogCiAgICAgICAgIGludCB2aWV3V2lkdGggPSBnZXRWaWV3V2lkdGgoKTsKLSAgICAgICAgaW50IG5ld1dpZHRoID0gTWF0aC5yb3VuZCh2aWV3V2lkdGggKiBtSW52QWN0dWFsU2NhbGUpOwotICAgICAgICBpbnQgbmV3SGVpZ2h0ID0gTWF0aC5yb3VuZChnZXRWaWV3SGVpZ2h0KCkgKiBtSW52QWN0dWFsU2NhbGUpOworICAgICAgICBpbnQgbmV3V2lkdGggPSBNYXRoLnJvdW5kKHZpZXdXaWR0aCAqIG1ab29tTWFuYWdlci5nZXRJbnZTY2FsZSgpKTsKKyAgICAgICAgaW50IG5ld0hlaWdodCA9IE1hdGgucm91bmQoZ2V0Vmlld0hlaWdodCgpICogbVpvb21NYW5hZ2VyLmdldEludlNjYWxlKCkpOwogICAgICAgICAvKgogICAgICAgICAgKiBCZWNhdXNlIHRoZSBuYXRpdmUgc2lkZSBtYXkgaGF2ZSBhbHJlYWR5IGRvbmUgYSBsYXlvdXQgYmVmb3JlIHRoZQogICAgICAgICAgKiBWaWV3IHN5c3RlbSB3YXMgYWJsZSB0byBtZWFzdXJlIHVzLCB3ZSBoYXZlIHRvIHNlbmQgYSBoZWlnaHQgb2YgMCB0bwpAQCAtMjQ1Niw4NSArMjQ2Myw1MSBAQAogICAgICAgICAgICAgbmV3SGVpZ2h0ID0gMDsKICAgICAgICAgfQogICAgICAgICAvLyBBdm9pZCBzZW5kaW5nIGFub3RoZXIgbWVzc2FnZSBpZiB0aGUgZGltZW5zaW9ucyBoYXZlIG5vdCBjaGFuZ2VkLgotICAgICAgICBpZiAobmV3V2lkdGggIT0gbUxhc3RXaWR0aFNlbnQgfHwgbmV3SGVpZ2h0ICE9IG1MYXN0SGVpZ2h0U2VudCkgeworICAgICAgICBpZiAobmV3V2lkdGggIT0gbUxhc3RXaWR0aFNlbnQgfHwgbmV3SGVpZ2h0ICE9IG1MYXN0SGVpZ2h0U2VudCB8fCBmb3JjZSkgewogICAgICAgICAgICAgVmlld1NpemVEYXRhIGRhdGEgPSBuZXcgVmlld1NpemVEYXRhKCk7CiAgICAgICAgICAgICBkYXRhLm1XaWR0aCA9IG5ld1dpZHRoOwogICAgICAgICAgICAgZGF0YS5tSGVpZ2h0ID0gbmV3SGVpZ2h0OwotICAgICAgICAgICAgZGF0YS5tVGV4dFdyYXBXaWR0aCA9IE1hdGgucm91bmQodmlld1dpZHRoIC8gbVRleHRXcmFwU2NhbGUpOzsKLSAgICAgICAgICAgIGRhdGEubVNjYWxlID0gbUFjdHVhbFNjYWxlOwotICAgICAgICAgICAgZGF0YS5tSWdub3JlSGVpZ2h0ID0gbVpvb21TY2FsZSAhPSAwICYmICFtSGVpZ2h0Q2FuTWVhc3VyZTsKLSAgICAgICAgICAgIGRhdGEubUFuY2hvclggPSBtQW5jaG9yWDsKLSAgICAgICAgICAgIGRhdGEubUFuY2hvclkgPSBtQW5jaG9yWTsKKyAgICAgICAgICAgIGRhdGEubVRleHRXcmFwV2lkdGggPSBNYXRoLnJvdW5kKHZpZXdXaWR0aCAvIG1ab29tTWFuYWdlci5nZXRUZXh0V3JhcFNjYWxlKCkpOworICAgICAgICAgICAgZGF0YS5tU2NhbGUgPSBtWm9vbU1hbmFnZXIuZ2V0U2NhbGUoKTsKKyAgICAgICAgICAgIGRhdGEubUlnbm9yZUhlaWdodCA9IG1ab29tTWFuYWdlci5pc0ZpeGVkTGVuZ3RoQW5pbWF0aW9uSW5Qcm9ncmVzcygpCisgICAgICAgICAgICAgICAgICAgICYmICFtSGVpZ2h0Q2FuTWVhc3VyZTsKKyAgICAgICAgICAgIGRhdGEubUFuY2hvclggPSBtWm9vbU1hbmFnZXIuZ2V0RG9jdW1lbnRBbmNob3JYKCk7CisgICAgICAgICAgICBkYXRhLm1BbmNob3JZID0gbVpvb21NYW5hZ2VyLmdldERvY3VtZW50QW5jaG9yWSgpOwogICAgICAgICAgICAgbVdlYlZpZXdDb3JlLnNlbmRNZXNzYWdlKEV2ZW50SHViLlZJRVdfU0laRV9DSEFOR0VELCBkYXRhKTsKICAgICAgICAgICAgIG1MYXN0V2lkdGhTZW50ID0gbmV3V2lkdGg7CiAgICAgICAgICAgICBtTGFzdEhlaWdodFNlbnQgPSBuZXdIZWlnaHQ7Ci0gICAgICAgICAgICBtQW5jaG9yWCA9IG1BbmNob3JZID0gMDsKKyAgICAgICAgICAgIG1ab29tTWFuYWdlci5jbGVhckRvY3VtZW50QW5jaG9yKCk7CiAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgfQogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogCi0gICAgcHJpdmF0ZSBpbnQgY29tcHV0ZVJlYWxIb3Jpem9udGFsU2Nyb2xsUmFuZ2UoKSB7CisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIGludCBjb21wdXRlSG9yaXpvbnRhbFNjcm9sbFJhbmdlKCkgewogICAgICAgICBpZiAobURyYXdIaXN0b3J5KSB7CiAgICAgICAgICAgICByZXR1cm4gbUhpc3RvcnlXaWR0aDsKICAgICAgICAgfSBlbHNlIGlmIChtSG9yaXpvbnRhbFNjcm9sbEJhck1vZGUgPT0gU0NST0xMQkFSX0FMV0FZU09GRgotICAgICAgICAgICAgICAgICYmIChtQWN0dWFsU2NhbGUgLSBtTWluWm9vbVNjYWxlIDw9IE1JTklNVU1fU0NBTEVfSU5DUkVNRU5UKSkgeworICAgICAgICAgICAgICAgICYmICFtWm9vbU1hbmFnZXIuY2FuWm9vbU91dCgpKSB7CiAgICAgICAgICAgICAvLyBvbmx5IGhvbm9yIHRoZSBzY3JvbGxiYXIgbW9kZSB3aGVuIGl0IGlzIGF0IG1pbmltdW0gem9vbSBsZXZlbAogICAgICAgICAgICAgcmV0dXJuIGNvbXB1dGVIb3Jpem9udGFsU2Nyb2xsRXh0ZW50KCk7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAvLyB0byBhdm9pZCByb3VuZGluZyBlcnJvciBjYXVzZWQgdW5uZWNlc3Nhcnkgc2Nyb2xsYmFyLCB1c2UgZmxvb3IKLSAgICAgICAgICAgIHJldHVybiAoaW50KSBNYXRoLmZsb29yKG1Db250ZW50V2lkdGggKiBtQWN0dWFsU2NhbGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIGludCBjb21wdXRlSG9yaXpvbnRhbFNjcm9sbFJhbmdlKCkgewotICAgICAgICBpbnQgcmFuZ2UgPSBjb21wdXRlUmVhbEhvcml6b250YWxTY3JvbGxSYW5nZSgpOwotCi0gICAgICAgIC8vIEFkanVzdCByZXBvcnRlZCByYW5nZSBpZiBvdmVyc2Nyb2xsZWQgdG8gY29tcHJlc3MgdGhlIHNjcm9sbCBiYXJzCi0gICAgICAgIGZpbmFsIGludCBzY3JvbGxYID0gbVNjcm9sbFg7Ci0gICAgICAgIGZpbmFsIGludCBvdmVyc2Nyb2xsUmlnaHQgPSBjb21wdXRlTWF4U2Nyb2xsWCgpOwotICAgICAgICBpZiAoc2Nyb2xsWCA8IDApIHsKLSAgICAgICAgICAgIHJhbmdlIC09IHNjcm9sbFg7Ci0gICAgICAgIH0gZWxzZSBpZiAoc2Nyb2xsWCA+IG92ZXJzY3JvbGxSaWdodCkgewotICAgICAgICAgICAgcmFuZ2UgKz0gc2Nyb2xsWCAtIG92ZXJzY3JvbGxSaWdodDsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiByYW5nZTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgaW50IGNvbXB1dGVIb3Jpem9udGFsU2Nyb2xsT2Zmc2V0KCkgewotICAgICAgICByZXR1cm4gTWF0aC5tYXgobVNjcm9sbFgsIDApOwotICAgIH0KLQotICAgIHByaXZhdGUgaW50IGNvbXB1dGVSZWFsVmVydGljYWxTY3JvbGxSYW5nZSgpIHsKLSAgICAgICAgaWYgKG1EcmF3SGlzdG9yeSkgewotICAgICAgICAgICAgcmV0dXJuIG1IaXN0b3J5SGVpZ2h0OwotICAgICAgICB9IGVsc2UgaWYgKG1WZXJ0aWNhbFNjcm9sbEJhck1vZGUgPT0gU0NST0xMQkFSX0FMV0FZU09GRgotICAgICAgICAgICAgICAgICYmIChtQWN0dWFsU2NhbGUgLSBtTWluWm9vbVNjYWxlIDw9IE1JTklNVU1fU0NBTEVfSU5DUkVNRU5UKSkgewotICAgICAgICAgICAgLy8gb25seSBob25vciB0aGUgc2Nyb2xsYmFyIG1vZGUgd2hlbiBpdCBpcyBhdCBtaW5pbXVtIHpvb20gbGV2ZWwKLSAgICAgICAgICAgIHJldHVybiBjb21wdXRlVmVydGljYWxTY3JvbGxFeHRlbnQoKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIHRvIGF2b2lkIHJvdW5kaW5nIGVycm9yIGNhdXNlZCB1bm5lY2Vzc2FyeSBzY3JvbGxiYXIsIHVzZSBmbG9vcgotICAgICAgICAgICAgcmV0dXJuIChpbnQpIE1hdGguZmxvb3IobUNvbnRlbnRIZWlnaHQgKiBtQWN0dWFsU2NhbGUpOworICAgICAgICAgICAgcmV0dXJuIChpbnQpIE1hdGguZmxvb3IobUNvbnRlbnRXaWR0aCAqIG1ab29tTWFuYWdlci5nZXRTY2FsZSgpKTsKICAgICAgICAgfQogICAgIH0KIAogICAgIEBPdmVycmlkZQogICAgIHByb3RlY3RlZCBpbnQgY29tcHV0ZVZlcnRpY2FsU2Nyb2xsUmFuZ2UoKSB7Ci0gICAgICAgIGludCByYW5nZSA9IGNvbXB1dGVSZWFsVmVydGljYWxTY3JvbGxSYW5nZSgpOwotCi0gICAgICAgIC8vIEFkanVzdCByZXBvcnRlZCByYW5nZSBpZiBvdmVyc2Nyb2xsZWQgdG8gY29tcHJlc3MgdGhlIHNjcm9sbCBiYXJzCi0gICAgICAgIGZpbmFsIGludCBzY3JvbGxZID0gbVNjcm9sbFk7Ci0gICAgICAgIGZpbmFsIGludCBvdmVyc2Nyb2xsQm90dG9tID0gY29tcHV0ZU1heFNjcm9sbFkoKTsKLSAgICAgICAgaWYgKHNjcm9sbFkgPCAwKSB7Ci0gICAgICAgICAgICByYW5nZSAtPSBzY3JvbGxZOwotICAgICAgICB9IGVsc2UgaWYgKHNjcm9sbFkgPiBvdmVyc2Nyb2xsQm90dG9tKSB7Ci0gICAgICAgICAgICByYW5nZSArPSBzY3JvbGxZIC0gb3ZlcnNjcm9sbEJvdHRvbTsKKyAgICAgICAgaWYgKG1EcmF3SGlzdG9yeSkgeworICAgICAgICAgICAgcmV0dXJuIG1IaXN0b3J5SGVpZ2h0OworICAgICAgICB9IGVsc2UgaWYgKG1WZXJ0aWNhbFNjcm9sbEJhck1vZGUgPT0gU0NST0xMQkFSX0FMV0FZU09GRgorICAgICAgICAgICAgICAgICYmICFtWm9vbU1hbmFnZXIuY2FuWm9vbU91dCgpKSB7CisgICAgICAgICAgICAvLyBvbmx5IGhvbm9yIHRoZSBzY3JvbGxiYXIgbW9kZSB3aGVuIGl0IGlzIGF0IG1pbmltdW0gem9vbSBsZXZlbAorICAgICAgICAgICAgcmV0dXJuIGNvbXB1dGVWZXJ0aWNhbFNjcm9sbEV4dGVudCgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gdG8gYXZvaWQgcm91bmRpbmcgZXJyb3IgY2F1c2VkIHVubmVjZXNzYXJ5IHNjcm9sbGJhciwgdXNlIGZsb29yCisgICAgICAgICAgICByZXR1cm4gKGludCkgTWF0aC5mbG9vcihtQ29udGVudEhlaWdodCAqIG1ab29tTWFuYWdlci5nZXRTY2FsZSgpKTsKICAgICAgICAgfQotCi0gICAgICAgIHJldHVybiByYW5nZTsKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKQEAgLTI1NTIsMzEgKzI1MjUsMTAgQEAKICAgICBwcm90ZWN0ZWQgdm9pZCBvbkRyYXdWZXJ0aWNhbFNjcm9sbEJhcihDYW52YXMgY2FudmFzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERyYXdhYmxlIHNjcm9sbEJhciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbCwgaW50IHQsIGludCByLCBpbnQgYikgewotICAgICAgICBpZiAobVNjcm9sbFkgPCAwKSB7Ci0gICAgICAgICAgICB0IC09IG1TY3JvbGxZOwotICAgICAgICB9CiAgICAgICAgIHNjcm9sbEJhci5zZXRCb3VuZHMobCwgdCArIGdldFZpc2libGVUaXRsZUhlaWdodCgpLCByLCBiKTsKICAgICAgICAgc2Nyb2xsQmFyLmRyYXcoY2FudmFzKTsKICAgICB9CiAKLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCBvbk92ZXJzY3JvbGxlZChpbnQgc2Nyb2xsWCwgaW50IHNjcm9sbFksIGJvb2xlYW4gY2xhbXBlZFgsCi0gICAgICAgICAgICBib29sZWFuIGNsYW1wZWRZKSB7Ci0gICAgICAgIG1Jbk92ZXJTY3JvbGxNb2RlID0gZmFsc2U7Ci0gICAgICAgIGludCBtYXhYID0gY29tcHV0ZU1heFNjcm9sbFgoKTsKLSAgICAgICAgaWYgKG1heFggPT0gMCkgewotICAgICAgICAgICAgLy8gZG8gbm90IG92ZXIgc2Nyb2xsIHggaWYgdGhlIHBhZ2UganVzdCBmaXRzIHRoZSBzY3JlZW4KLSAgICAgICAgICAgIHNjcm9sbFggPSBwaW5Mb2NYKHNjcm9sbFgpOwotICAgICAgICB9IGVsc2UgaWYgKHNjcm9sbFggPCAwIHx8IHNjcm9sbFggPiBtYXhYKSB7Ci0gICAgICAgICAgICBtSW5PdmVyU2Nyb2xsTW9kZSA9IHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHNjcm9sbFkgPCAwIHx8IHNjcm9sbFkgPiBjb21wdXRlTWF4U2Nyb2xsWSgpKSB7Ci0gICAgICAgICAgICBtSW5PdmVyU2Nyb2xsTW9kZSA9IHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgICBzdXBlci5zY3JvbGxUbyhzY3JvbGxYLCBzY3JvbGxZKTsKLSAgICB9Ci0KICAgICAvKioKICAgICAgKiBHZXQgdGhlIHVybCBmb3IgdGhlIGN1cnJlbnQgcGFnZS4gVGhpcyBpcyBub3QgYWx3YXlzIHRoZSBzYW1lIGFzIHRoZSB1cmwKICAgICAgKiBwYXNzZWQgdG8gV2ViVmlld0NsaWVudC5vblBhZ2VTdGFydGVkIGJlY2F1c2UgYWx0aG91Z2ggdGhlIGxvYWQgZm9yCkBAIC0yNjIyLDcgKzI1NzQsOSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEdldCB0aGUgdG91Y2ggaWNvbiB1cmwgZm9yIHRoZSBhcHBsZS10b3VjaC1pY29uIDxsaW5rPiBlbGVtZW50LgorICAgICAqIEdldCB0aGUgdG91Y2ggaWNvbiB1cmwgZm9yIHRoZSBhcHBsZS10b3VjaC1pY29uIDxsaW5rPiBlbGVtZW50LCBvcgorICAgICAqIGEgVVJMIG9uIHRoaXMgc2l0ZSdzIHNlcnZlciBwb2ludGluZyB0byB0aGUgc3RhbmRhcmQgbG9jYXRpb24gb2YgYQorICAgICAqIHRvdWNoIGljb24uCiAgICAgICogQGhpZGUKICAgICAgKi8KICAgICBwdWJsaWMgU3RyaW5nIGdldFRvdWNoSWNvblVybCgpIHsKQEAgLTI3OTUsMjIgKzI3NDksNDkgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBAaGlkZQorICAgICAqIFN0YXJ0IGFuIEFjdGlvbk1vZGUgZm9yIGZpbmRpbmcgdGV4dCBpbiB0aGlzIFdlYlZpZXcuCisgICAgICogQHBhcmFtIHRleHQgSWYgbm9uLW51bGwsIHdpbGwgYmUgdGhlIGluaXRpYWwgdGV4dCB0byBzZWFyY2ggZm9yLgorICAgICAqICAgICAgICAgICAgIE90aGVyd2lzZSwgdGhlIGxhc3QgU3RyaW5nIHNlYXJjaGVkIGZvciBpbiB0aGlzIFdlYlZpZXcgd2lsbAorICAgICAqICAgICAgICAgICAgIGJlIHVzZWQgdG8gc3RhcnQuCiAgICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0RmluZElzVXAoYm9vbGVhbiBpc1VwKSB7Ci0gICAgICAgIG1GaW5kSXNVcCA9IGlzVXA7Ci0gICAgICAgIGlmIChpc1VwKSB7Ci0gICAgICAgICAgICByZWNvcmROZXdDb250ZW50U2l6ZShtQ29udGVudFdpZHRoLCBtQ29udGVudEhlaWdodCArIG1GaW5kSGVpZ2h0LAotICAgICAgICAgICAgICAgICAgICBmYWxzZSk7CisgICAgcHVibGljIHZvaWQgc2hvd0ZpbmREaWFsb2coU3RyaW5nIHRleHQpIHsKKyAgICAgICAgbUZpbmRDYWxsYmFjayA9IG5ldyBGaW5kQWN0aW9uTW9kZUNhbGxiYWNrKG1Db250ZXh0KTsKKyAgICAgICAgc2V0RmluZElzVXAodHJ1ZSk7CisgICAgICAgIG1GaW5kQ2FsbGJhY2suc2V0V2ViVmlldyh0aGlzKTsKKyAgICAgICAgVmlldyB0aXRsZUJhciA9IG1UaXRsZUJhcjsKKyAgICAgICAgLy8gV2UgZG8gbm90IHdhbnQgdG8gc2hvdyB0aGUgZW1iZWRkZWQgdGl0bGUgYmFyIGR1cmluZyBmaW5kIG9yCisgICAgICAgIC8vIHNlbGVjdCwgYnV0IGtlZXAgdHJhY2sgb2YgaXQgc28gdGhhdCBpdCBjYW4gYmUgcmVwbGFjZWQgd2hlbiB0aGUKKyAgICAgICAgLy8gbW9kZSBpcyBleGl0ZWQuCisgICAgICAgIHNldEVtYmVkZGVkVGl0bGVCYXIobnVsbCk7CisgICAgICAgIG1GaW5kQ2FsbGJhY2suc2V0VGl0bGVCYXIodGl0bGVCYXIpOworICAgICAgICBzdGFydEFjdGlvbk1vZGUobUZpbmRDYWxsYmFjayk7CisgICAgICAgIGlmICh0ZXh0ID09IG51bGwpIHsKKyAgICAgICAgICAgIHRleHQgPSBtTGFzdEZpbmQ7CiAgICAgICAgIH0KKyAgICAgICAgaWYgKHRleHQgIT0gbnVsbCkgeworICAgICAgICAgICAgbUZpbmRDYWxsYmFjay5zZXRUZXh0KHRleHQpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogS2VlcCB0cmFjayBvZiB0aGUgZmluZCBjYWxsYmFjayBzbyB0aGF0IHdlIGNhbiByZW1vdmUgaXRzIHRpdGxlYmFyIGlmCisgICAgICogbmVjZXNzYXJ5LgorICAgICAqLworICAgIHByaXZhdGUgRmluZEFjdGlvbk1vZGVDYWxsYmFjayBtRmluZENhbGxiYWNrOworCisgICAgLyoqCisgICAgICogVG9nZ2xlIHdoZXRoZXIgdGhlIGZpbmQgZGlhbG9nIGlzIHNob3dpbmcsIGZvciBib3RoIG5hdGl2ZSBhbmQgSmF2YS4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgc2V0RmluZElzVXAoYm9vbGVhbiBpc1VwKSB7CisgICAgICAgIG1GaW5kSXNVcCA9IGlzVXA7CiAgICAgICAgIGlmICgwID09IG1OYXRpdmVDbGFzcykgcmV0dXJuOyAvLyBjbGllbnQgaXNuJ3QgaW5pdGlhbGl6ZWQKICAgICAgICAgbmF0aXZlU2V0RmluZElzVXAoaXNVcCk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQGhpZGUKKyAgICAgKiBSZXR1cm4gdGhlIGluZGV4IG9mIHRoZSBjdXJyZW50bHkgaGlnaGxpZ2h0ZWQgbWF0Y2guCiAgICAgICovCi0gICAgcHVibGljIGludCBmaW5kSW5kZXgoKSB7CisgICAgaW50IGZpbmRJbmRleCgpIHsKICAgICAgICAgaWYgKDAgPT0gbU5hdGl2ZUNsYXNzKSByZXR1cm4gLTE7CiAgICAgICAgIHJldHVybiBuYXRpdmVGaW5kSW5kZXgoKTsKICAgICB9CkBAIC0yODE5LDkgKzI4MDAsOCBAQAogICAgIC8vIG9yIG5vdCB3ZSBkcmF3IHRoZSBoaWdobGlnaHRzIGZvciBtYXRjaGVzLgogICAgIHByaXZhdGUgYm9vbGVhbiBtRmluZElzVXA7CiAKLSAgICBwcml2YXRlIGludCBtRmluZEhlaWdodDsKLSAgICAvLyBLZWVwIHRyYWNrIG9mIHRoZSBsYXN0IHN0cmluZyBzZW50LCBzbyB3ZSBjYW4gc2VhcmNoIGFnYWluIGFmdGVyIGFuCi0gICAgLy8gb3JpZW50YXRpb24gY2hhbmdlIG9yIHRoZSBkaXNtaXNzYWwgb2YgdGhlIHNvZnQga2V5Ym9hcmQuCisgICAgLy8gS2VlcCB0cmFjayBvZiB0aGUgbGFzdCBzdHJpbmcgc2VudCwgc28gd2UgY2FuIHNlYXJjaCBhZ2FpbiB3aGVuIGZpbmQgaXMKKyAgICAvLyByZW9wZW5lZC4KICAgICBwcml2YXRlIFN0cmluZyBtTGFzdEZpbmQ7CiAKICAgICAvKioKQEAgLTI4NzgsNyArMjg1OCw2IEBACiAgICAgICogQ2xlYXIgdGhlIGhpZ2hsaWdodGluZyBzdXJyb3VuZGluZyB0ZXh0IG1hdGNoZXMgY3JlYXRlZCBieSBmaW5kQWxsLgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIGNsZWFyTWF0Y2hlcygpIHsKLSAgICAgICAgbUxhc3RGaW5kID0gIiI7CiAgICAgICAgIGlmIChtTmF0aXZlQ2xhc3MgPT0gMCkKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgbmF0aXZlU2V0RmluZElzRW1wdHkoKTsKQEAgLTI4ODYsMTYgKzI4NjUsMTUgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBAaGlkZQorICAgICAqIENhbGxlZCB3aGVuIHRoZSBmaW5kIEFjdGlvbk1vZGUgZW5kcy4KICAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBub3RpZnlGaW5kRGlhbG9nRGlzbWlzc2VkKCkgeworICAgIHZvaWQgbm90aWZ5RmluZERpYWxvZ0Rpc21pc3NlZCgpIHsKKyAgICAgICAgbUZpbmRDYWxsYmFjayA9IG51bGw7CiAgICAgICAgIGlmIChtV2ViVmlld0NvcmUgPT0gbnVsbCkgewogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CiAgICAgICAgIGNsZWFyTWF0Y2hlcygpOwogICAgICAgICBzZXRGaW5kSXNVcChmYWxzZSk7Ci0gICAgICAgIHJlY29yZE5ld0NvbnRlbnRTaXplKG1Db250ZW50V2lkdGgsIG1Db250ZW50SGVpZ2h0IC0gbUZpbmRIZWlnaHQsCi0gICAgICAgICAgICAgICAgZmFsc2UpOwogICAgICAgICAvLyBOb3cgdGhhdCB0aGUgZGlhbG9nIGhhcyBiZWVuIHJlbW92ZWQsIGVuc3VyZSB0aGF0IHdlIHNjcm9sbCB0byBhCiAgICAgICAgIC8vIGxvY2F0aW9uIHRoYXQgaXMgbm90IGJleW9uZCB0aGUgZW5kIG9mIHRoZSBwYWdlLgogICAgICAgICBwaW5TY3JvbGxUbyhtU2Nyb2xsWCwgbVNjcm9sbFksIGZhbHNlLCAwKTsKQEAgLTI5MDMsMTYgKzI4ODEsNiBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEBoaWRlCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0RmluZERpYWxvZ0hlaWdodChpbnQgaGVpZ2h0KSB7Ci0gICAgICAgIGlmIChEZWJ1Z0ZsYWdzLldFQl9WSUVXKSB7Ci0gICAgICAgICAgICBMb2cudihMT0dUQUcsICJzZXRGaW5kRGlhbG9nSGVpZ2h0IGhlaWdodD0iICsgaGVpZ2h0KTsKLSAgICAgICAgfQotICAgICAgICBtRmluZEhlaWdodCA9IGhlaWdodDsKLSAgICB9Ci0KLSAgICAvKioKICAgICAgKiBRdWVyeSB0aGUgZG9jdW1lbnQgdG8gc2VlIGlmIGl0IGNvbnRhaW5zIGFueSBpbWFnZSByZWZlcmVuY2VzLiBUaGUKICAgICAgKiBtZXNzYWdlIG9iamVjdCB3aWxsIGJlIGRpc3BhdGNoZWQgd2l0aCBhcmcxIGJlaW5nIHNldCB0byAxIGlmIGltYWdlcwogICAgICAqIHdlcmUgZm91bmQgYW5kIDAgaWYgdGhlIGRvY3VtZW50IGRvZXMgbm90IHJlZmVyZW5jZSBhbnkgaW1hZ2VzLgpAQCAtMjkyNSw0MiArMjg5MywzMSBAQAogICAgICAgICBtV2ViVmlld0NvcmUuc2VuZE1lc3NhZ2UoRXZlbnRIdWIuRE9DX0hBU19JTUFHRVMsIHJlc3BvbnNlKTsKICAgICB9CiAKKyAgICAvKioKKyAgICAgKiBSZXF1ZXN0IHRoZSBzY3JvbGxlciB0byBhYm9ydCBhbnkgb25nb2luZyBhbmltYXRpb24KKyAgICAgKgorICAgICAqIEBoaWRlCisgICAgICovCisgICAgcHVibGljIHZvaWQgc3RvcFNjcm9sbCgpIHsKKyAgICAgICAgbVNjcm9sbGVyLmZvcmNlRmluaXNoZWQodHJ1ZSk7CisgICAgICAgIG1MYXN0VmVsb2NpdHkgPSAwOworICAgIH0KKwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIGNvbXB1dGVTY3JvbGwoKSB7CiAgICAgICAgIGlmIChtU2Nyb2xsZXIuY29tcHV0ZVNjcm9sbE9mZnNldCgpKSB7CiAgICAgICAgICAgICBpbnQgb2xkWCA9IG1TY3JvbGxYOwogICAgICAgICAgICAgaW50IG9sZFkgPSBtU2Nyb2xsWTsKLSAgICAgICAgICAgIGludCB4ID0gbVNjcm9sbGVyLmdldEN1cnJYKCk7Ci0gICAgICAgICAgICBpbnQgeSA9IG1TY3JvbGxlci5nZXRDdXJyWSgpOwotICAgICAgICAgICAgaW52YWxpZGF0ZSgpOyAgLy8gU28gd2UgZHJhdyBhZ2FpbgotCi0gICAgICAgICAgICBpZiAob2xkWCAhPSB4IHx8IG9sZFkgIT0geSkgewotICAgICAgICAgICAgICAgIGZpbmFsIGludCByYW5nZVggPSBjb21wdXRlTWF4U2Nyb2xsWCgpOwotICAgICAgICAgICAgICAgIGZpbmFsIGludCByYW5nZVkgPSBjb21wdXRlTWF4U2Nyb2xsWSgpOwotICAgICAgICAgICAgICAgIG92ZXJzY3JvbGxCeSh4IC0gb2xkWCwgeSAtIG9sZFksIG9sZFgsIG9sZFksCi0gICAgICAgICAgICAgICAgICAgICAgICByYW5nZVgsIHJhbmdlWSwKLSAgICAgICAgICAgICAgICAgICAgICAgIG1PdmVyZmxpbmdEaXN0YW5jZSwgbU92ZXJmbGluZ0Rpc3RhbmNlLCBmYWxzZSk7Ci0KLSAgICAgICAgICAgICAgICBpZiAobUVkZ2VHbG93VG9wICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHJhbmdlWSA+IDAgfHwgZ2V0T3ZlcnNjcm9sbE1vZGUoKSA9PSBPVkVSU0NST0xMX0FMV0FZUykgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHkgPCAwICYmIG9sZFkgPj0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1FZGdlR2xvd1RvcC5vbkFic29yYigoaW50KSBtU2Nyb2xsZXIuZ2V0Q3VyclZlbG9jaXR5KCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh5ID4gcmFuZ2VZICYmIG9sZFkgPD0gcmFuZ2VZKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbUVkZ2VHbG93Qm90dG9tLm9uQWJzb3JiKChpbnQpIG1TY3JvbGxlci5nZXRDdXJyVmVsb2NpdHkoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBpZiAocmFuZ2VYID4gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHggPCAwICYmIG9sZFggPj0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1FZGdlR2xvd0xlZnQub25BYnNvcmIoKGludCkgbVNjcm9sbGVyLmdldEN1cnJWZWxvY2l0eSgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoeCA+IHJhbmdlWCAmJiBvbGRYIDw9IHJhbmdlWCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1FZGdlR2xvd1JpZ2h0Lm9uQWJzb3JiKChpbnQpIG1TY3JvbGxlci5nZXRDdXJyVmVsb2NpdHkoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAobVNjcm9sbGVyLmlzRmluaXNoZWQoKSkgewotICAgICAgICAgICAgICAgIG1Qcml2YXRlSGFuZGxlci5zZW5kRW1wdHlNZXNzYWdlKFJFU1VNRV9XRUJDT1JFX1BSSU9SSVRZKTsKKyAgICAgICAgICAgIG1TY3JvbGxYID0gbVNjcm9sbGVyLmdldEN1cnJYKCk7CisgICAgICAgICAgICBtU2Nyb2xsWSA9IG1TY3JvbGxlci5nZXRDdXJyWSgpOworICAgICAgICAgICAgcG9zdEludmFsaWRhdGUoKTsgIC8vIFNvIHdlIGRyYXcgYWdhaW4KKyAgICAgICAgICAgIGlmIChvbGRYICE9IG1TY3JvbGxYIHx8IG9sZFkgIT0gbVNjcm9sbFkpIHsKKyAgICAgICAgICAgICAgICBvblNjcm9sbENoYW5nZWQobVNjcm9sbFgsIG1TY3JvbGxZLCBvbGRYLCBvbGRZKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgYWJvcnRBbmltYXRpb24oKTsKKyAgICAgICAgICAgICAgICBtUHJpdmF0ZUhhbmRsZXIucmVtb3ZlTWVzc2FnZXMoUkVTVU1FX1dFQkNPUkVfUFJJT1JJVFkpOworICAgICAgICAgICAgICAgIFdlYlZpZXdDb3JlLnJlc3VtZVByaW9yaXR5KCk7CisgICAgICAgICAgICAgICAgV2ViVmlld0NvcmUucmVzdW1lVXBkYXRlUGljdHVyZShtV2ViVmlld0NvcmUpOwogICAgICAgICAgICAgfQogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgc3VwZXIuY29tcHV0ZVNjcm9sbCgpOwpAQCAtMzAzNCw2ICsyOTkxLDIzIEBACiAgICAgfQogCiAgICAgLyoqCisgICAgICogQ2FsbGVkIGJ5IENhbGxiYWNrUHJveHkgd2hlbiB0aGUgcGFnZSBzdGFydHMgbG9hZGluZy4KKyAgICAgKiBAcGFyYW0gdXJsIFRoZSBVUkwgb2YgdGhlIHBhZ2Ugd2hpY2ggaGFzIHN0YXJ0ZWQgbG9hZGluZy4KKyAgICAgKi8KKyAgICAvKiBwYWNrYWdlICovIHZvaWQgb25QYWdlU3RhcnRlZChTdHJpbmcgdXJsKSB7CisgICAgICAgIC8vIGV2ZXJ5IHRpbWUgd2Ugc3RhcnQgYSBuZXcgcGFnZSwgd2Ugd2FudCB0byByZXNldCB0aGUKKyAgICAgICAgLy8gV2ViVmlldyBjZXJ0aWZpY2F0ZTogIGlmIHRoZSBuZXcgc2l0ZSBpcyBzZWN1cmUsIHdlCisgICAgICAgIC8vIHdpbGwgcmVsb2FkIGl0IGFuZCBnZXQgYSBuZXcgY2VydGlmaWNhdGUgc2V0OworICAgICAgICAvLyBpZiB0aGUgbmV3IHNpdGUgaXMgbm90IHNlY3VyZSwgdGhlIGNlcnRpZmljYXRlIG11c3QgYmUKKyAgICAgICAgLy8gbnVsbCwgYW5kIHRoYXQgd2lsbCBiZSB0aGUgY2FzZQorICAgICAgICBzZXRDZXJ0aWZpY2F0ZShudWxsKTsKKworICAgICAgICAvLyByZXNldCB0aGUgZmxhZyBzaW5jZSB3ZSBzZXQgdG8gdHJ1ZSBpbiBpZiBuZWVkIGFmdGVyCisgICAgICAgIC8vIGxvYWRpbmcgaXMgc2VlIG9uUGFnZUZpbmlzaGVkKFVybCkKKyAgICAgICAgbUFjY2Vzc2liaWxpdHlTY3JpcHRJbmplY3RlZCA9IGZhbHNlOworICAgIH0KKworICAgIC8qKgogICAgICAqIENhbGxlZCBieSBDYWxsYmFja1Byb3h5IHdoZW4gdGhlIHBhZ2UgZmluaXNoZXMgbG9hZGluZy4KICAgICAgKiBAcGFyYW0gdXJsIFRoZSBVUkwgb2YgdGhlIHBhZ2Ugd2hpY2ggaGFzIGZpbmlzaGVkIGxvYWRpbmcuCiAgICAgICovCkBAIC0zMDQ5LDYgKzMwMjMsOTkgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIG1QYWdlVGhhdE5lZWRzVG9TbGlkZVRpdGxlQmFyT2ZmU2NyZWVuID0gbnVsbDsKICAgICAgICAgfQorCisgICAgICAgIGluamVjdEFjY2Vzc2liaWxpdHlGb3JVcmwodXJsKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGlzIG1ldGhvZCBpbmplY3RzIGFjY2Vzc2liaWxpdHkgaW4gdGhlIGxvYWRlZCBkb2N1bWVudCBpZiBhY2Nlc3NpYmlsaXR5CisgICAgICogaXMgZW5hYmxlZC4gSWYgSmF2YVNjcmlwdCBpcyBlbmFibGVkIHdlIHRyeSB0byBpbmplY3QgYSBVUkwgc3BlY2lmaWMgc2NyaXB0LgorICAgICAqIElmIG5vIFVSTCBzcGVjaWZpYyBzY3JpcHQgaXMgZm91bmQgb3IgSmF2YVNjcmlwdCBpcyBkaXNhYmxlZCB3ZSBmYWxsYmFjayB0bworICAgICAqIHRoZSBkZWZhdWx0IHtAbGluayBBY2Nlc3NpYmlsaXR5SW5qZWN0b3J9IGltcGxlbWVudGF0aW9uLgorICAgICAqIDwvcD4KKyAgICAgKiBJZiB0aGUgVVJMIGhhcyB0aGUgImF4cyIgcGFyYW10ZXIgc2V0IHRvIDEgaXQgaGFzIGFscmVhZHkgZG9uZSB0aGUKKyAgICAgKiBzY3JpcHQgaW5qZWN0aW9uIHNvIHdlIGRvIG5vdGhpbmcuIElmIHRoZSBwYXJhbWV0ZXIgaXMgc2V0IHRvIDAKKyAgICAgKiB0aGUgVVJMIG9wdHMgb3V0IGFjY2Vzc2liaWxpdHkgc2NyaXB0IGluamVjdGlvbiBzbyB3ZSBmYWxsIGJhY2sgdG8KKyAgICAgKiB0aGUgZGVmYXVsdCB7QGxpbmsgQWNjZXNzaWJpbGl0eUluamVjdG9yfS4KKyAgICAgKiA8L3A+CisgICAgICogTm90ZTogSWYgdGhlIHVzZXIgaGFzIG5vdCBvcHRlZC1pbiB0aGUgYWNjZXNzaWJpbGl0eSBzY3JpcHQgaW5qZWN0aW9uIG5vIHNjcmlwdHMKKyAgICAgKiBhcmUgaW5qZWN0ZWQgcmF0aGVyIHRoZSBkZWZhdWx0IHtAbGluayBBY2Nlc3NpYmlsaXR5SW5qZWN0b3J9IGltcGxlbWVudGF0aW9uCisgICAgICogaXMgdXNlZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSB1cmwgVGhlIFVSTCBsb2FkZWQgYnkgdGhpcyB7QGxpbmsgV2ViVmlld30uCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIGluamVjdEFjY2Vzc2liaWxpdHlGb3JVcmwoU3RyaW5nIHVybCkgeworICAgICAgICBBY2Nlc3NpYmlsaXR5TWFuYWdlciBhY2Nlc3NpYmlsaXR5TWFuYWdlciA9IEFjY2Vzc2liaWxpdHlNYW5hZ2VyLmdldEluc3RhbmNlKG1Db250ZXh0KTsKKworICAgICAgICBpZiAoIWFjY2Vzc2liaWxpdHlNYW5hZ2VyLmlzRW5hYmxlZCgpKSB7CisgICAgICAgICAgICAvLyBpdCBpcyBwb3NzaWJsZSB0aGF0IGFjY2Vzc2liaWxpdHkgd2FzIHR1cm5lZCBvZmYgYmV0d2VlbiByZWxvYWRzCisgICAgICAgICAgICBlbnN1cmVBY2Nlc3NpYmlsaXR5U2NyaXB0SW5qZWN0b3JJbnN0YW5jZShmYWxzZSk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBpZiAoIWdldFNldHRpbmdzKCkuZ2V0SmF2YVNjcmlwdEVuYWJsZWQoKSkgeworICAgICAgICAgICAgLy8gbm8gSlMgc28gd2UgZmFsbGJhY2sgdG8gdGhlIGJhc2ljIGJ1aWwtaW4gc3VwcG9ydAorICAgICAgICAgICAgZW5zdXJlQWNjZXNzaWJpbGl0eVNjcmlwdEluamVjdG9ySW5zdGFuY2UodHJ1ZSk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICAvLyBjaGVjayB0aGUgVVJMICJheHMiIHBhcmFtZXRlciB0byBjaG9vc2UgYXBwcm9wcmlhdGUgYWN0aW9uCisgICAgICAgIGludCBheHNQYXJhbWV0ZXJWYWx1ZSA9IGdldEF4c1VybFBhcmFtZXRlclZhbHVlKHVybCk7CisgICAgICAgIGlmIChheHNQYXJhbWV0ZXJWYWx1ZSA9PSBBQ0NFU1NJQklMSVRZX1NDUklQVF9JTkpFQ1RJT05fVU5ERUZJTkVEKSB7CisgICAgICAgICAgICBib29sZWFuIG9uRGV2aWNlU2NyaXB0SW5qZWN0aW9uRW5hYmxlZCA9IChTZXR0aW5ncy5TZWN1cmUuZ2V0SW50KG1Db250ZXh0CisgICAgICAgICAgICAgICAgICAgIC5nZXRDb250ZW50UmVzb2x2ZXIoKSwgU2V0dGluZ3MuU2VjdXJlLkFDQ0VTU0lCSUxJVFlfU0NSSVBUX0lOSkVDVElPTiwgMCkgPT0gMSk7CisgICAgICAgICAgICBpZiAob25EZXZpY2VTY3JpcHRJbmplY3Rpb25FbmFibGVkKSB7CisgICAgICAgICAgICAgICAgZW5zdXJlQWNjZXNzaWJpbGl0eVNjcmlwdEluamVjdG9ySW5zdGFuY2UoZmFsc2UpOworICAgICAgICAgICAgICAgIC8vIG5laXRoZXIgc2NyaXB0IGluamVjdGVkIG5vciBzY3JpcHQgaW5qZWN0aW9uIG9wdGVkIG91dCA9PiB3ZSBpbmplY3QKKyAgICAgICAgICAgICAgICBsb2FkVXJsKEFDQ0VTU0lCSUxJVFlfU0NSSVBUX0NIT09TRVJfSkFWQVNDUklQVCk7CisgICAgICAgICAgICAgICAgLy8gVE9ETzogU2V0IHRoaXMgZmxhZyBhZnRlciBzdWNjZXNzZnVsbCBzY3JpcHQgaW5qZWN0aW9uLiBNYXliZSB1cG9uIGluamVjdGlvbgorICAgICAgICAgICAgICAgIC8vIHRoZSBjaG9vc2VyIHNob3VsZCB1cGRhdGUgdGhlIG1ldGEgdGFnIGFuZCB3ZSBjaGVjayBpdCB0byBkZWNsYXJlIHN1Y2Nlc3MKKyAgICAgICAgICAgICAgICBtQWNjZXNzaWJpbGl0eVNjcmlwdEluamVjdGVkID0gdHJ1ZTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLy8gaW5qZWN0aW9uIGRpc2FibGVkIHNvIHdlIGZhbGxiYWNrIHRvIHRoZSBiYXNpYyBidWlsdC1pbiBzdXBwb3J0CisgICAgICAgICAgICAgICAgZW5zdXJlQWNjZXNzaWJpbGl0eVNjcmlwdEluamVjdG9ySW5zdGFuY2UodHJ1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAoYXhzUGFyYW1ldGVyVmFsdWUgPT0gQUNDRVNTSUJJTElUWV9TQ1JJUFRfSU5KRUNUSU9OX09QVEVEX09VVCkgeworICAgICAgICAgICAgLy8gaW5qZWN0aW9uIG9wdGVkIG91dCBzbyB3ZSBmYWxsYmFjayB0byB0aGUgYmFzaWMgYnVpbC1pbiBzdXBwb3J0CisgICAgICAgICAgICBlbnN1cmVBY2Nlc3NpYmlsaXR5U2NyaXB0SW5qZWN0b3JJbnN0YW5jZSh0cnVlKTsKKyAgICAgICAgfSBlbHNlIGlmIChheHNQYXJhbWV0ZXJWYWx1ZSA9PSBBQ0NFU1NJQklMSVRZX1NDUklQVF9JTkpFQ1RJT05fUFJPVklERUQpIHsKKyAgICAgICAgICAgIGVuc3VyZUFjY2Vzc2liaWxpdHlTY3JpcHRJbmplY3Rvckluc3RhbmNlKGZhbHNlKTsKKyAgICAgICAgICAgIC8vIHRoZSBVUkwgcHJvdmlkZXMgYWNjZXNzaWJpbGl0eSBidXQgd2Ugc3RpbGwgbmVlZCB0byBhZGQgb3VyIGdlbmVyaWMgc2NyaXB0CisgICAgICAgICAgICBsb2FkVXJsKEFDQ0VTU0lCSUxJVFlfU0NSSVBUX0NIT09TRVJfSkFWQVNDUklQVCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBMb2cuZShMT0dUQUcsICJVbmtub3duIFVSTCB2YWx1ZSBmb3IgdGhlIFwiYXhzXCIgVVJMIHBhcmFtZXRlcjogIiArIGF4c1BhcmFtZXRlclZhbHVlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEVuc3VyZXMgdGhlIGluc3RhbmNlIG9mIHRoZSB7QGxpbmsgQWNjZXNzaWJpbGl0eUluamVjdG9yfSB0byBiZSBwcmVzZW50IG90IG5vdC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwcmVzZW50IFRydWUgdG8gZW5zdXJlIGFuIGluc2FuY2UsIGZhbHNlIHRvIGVuc3VyZSBubyBpbnN0YW5jZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgZW5zdXJlQWNjZXNzaWJpbGl0eVNjcmlwdEluamVjdG9ySW5zdGFuY2UoYm9vbGVhbiBwcmVzZW50KSB7CisgICAgICAgIGlmIChwcmVzZW50ICYmIG1BY2Nlc3NpYmlsaXR5SW5qZWN0b3IgPT0gbnVsbCkgeworICAgICAgICAgICAgbUFjY2Vzc2liaWxpdHlJbmplY3RvciA9IG5ldyBBY2Nlc3NpYmlsaXR5SW5qZWN0b3IodGhpcyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtQWNjZXNzaWJpbGl0eUluamVjdG9yID0gbnVsbDsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgdGhlICJheHMiIFVSTCBwYXJhbWV0ZXIgdmFsdWUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdXJsIEEgdXJsIHRvIGZldGNoIHRoZSBwYXJhbXRlciBmcm9tLgorICAgICAqIEByZXR1cm4gVGhlIHBhcmFtZXRlciB2YWx1ZSBpZiBzdWNoLCAtMSBvdGhlcndpc2UuCisgICAgICovCisgICAgcHJpdmF0ZSBpbnQgZ2V0QXhzVXJsUGFyYW1ldGVyVmFsdWUoU3RyaW5nIHVybCkgeworICAgICAgICBpZiAobU1hdGNoQXhzVXJsUGFyYW1ldGVyUGF0dGVybiA9PSBudWxsKSB7CisgICAgICAgICAgICBtTWF0Y2hBeHNVcmxQYXJhbWV0ZXJQYXR0ZXJuID0gUGF0dGVybi5jb21waWxlKFBBVFRFUk5fTUFUQ0hfQVhTX1VSTF9QQVJBTUVURVIpOworICAgICAgICB9CisgICAgICAgIE1hdGNoZXIgbWF0Y2hlciA9IG1NYXRjaEF4c1VybFBhcmFtZXRlclBhdHRlcm4ubWF0Y2hlcih1cmwpOworICAgICAgICBpZiAobWF0Y2hlci5maW5kKCkpIHsKKyAgICAgICAgICAgIFN0cmluZyBrZXlWYWx1ZVBhaXIgPSB1cmwuc3Vic3RyaW5nKG1hdGNoZXIuc3RhcnQoKSwgbWF0Y2hlci5lbmQoKSk7CisgICAgICAgICAgICByZXR1cm4gSW50ZWdlci5wYXJzZUludChrZXlWYWx1ZVBhaXIuc3BsaXQoIj0iKVsxXSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIC0xOwogICAgIH0KIAogICAgIC8qKgpAQCAtMzE2NSw3ICszMjMyLDcgQEAKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIC8vIElmIHdlIGRvbid0IHJlcXVlc3QgYSBsYXlvdXQsIHRyeSB0byBzZW5kIG91ciB2aWV3IHNpemUgdG8gdGhlCiAgICAgICAgICAgICAvLyBuYXRpdmUgc2lkZSB0byBlbnN1cmUgdGhhdCBXZWJDb3JlIGhhcyB0aGUgY29ycmVjdCBkaW1lbnNpb25zLgotICAgICAgICAgICAgc2VuZFZpZXdTaXplWm9vbSgpOworICAgICAgICAgICAgc2VuZFZpZXdTaXplWm9vbShmYWxzZSk7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTMyOTUsNDYgKzMzNjIsNyBAQAogICAgICAqICAgICAgICAgc2V0dGluZ3MuCiAgICAgICovCiAgICAgcHVibGljIFdlYlNldHRpbmdzIGdldFNldHRpbmdzKCkgewotICAgICAgICByZXR1cm4gbVdlYlZpZXdDb3JlLmdldFNldHRpbmdzKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVXNlIHRoaXMgbWV0aG9kIHRvIGluZm9ybSB0aGUgd2VidmlldyBhYm91dCBwYWNrYWdlcyB0aGF0IGFyZSBpbnN0YWxsZWQKLSAgICAgKiBpbiB0aGUgc3lzdGVtLiBUaGlzIGluZm9ybWF0aW9uIHdpbGwgYmUgdXNlZCBieSB0aGUKLSAgICAgKiBuYXZpZ2F0b3IuaXNBcHBsaWNhdGlvbkluc3RhbGxlZCgpIEFQSS4KLSAgICAgKiBAcGFyYW0gcGFja2FnZU5hbWVzIGlzIGEgc2V0IG9mIHBhY2thZ2UgbmFtZXMgdGhhdCBhcmUga25vd24gdG8gYmUKLSAgICAgKiBpbnN0YWxsZWQgaW4gdGhlIHN5c3RlbS4KLSAgICAgKgotICAgICAqIEBoaWRlIG5vdCBhIHB1YmxpYyBBUEkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBhZGRQYWNrYWdlTmFtZXMoU2V0PFN0cmluZz4gcGFja2FnZU5hbWVzKSB7Ci0gICAgICAgIG1XZWJWaWV3Q29yZS5zZW5kTWVzc2FnZShFdmVudEh1Yi5BRERfUEFDS0FHRV9OQU1FUywgcGFja2FnZU5hbWVzKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBVc2UgdGhpcyBtZXRob2QgdG8gaW5mb3JtIHRoZSB3ZWJ2aWV3IGFib3V0IHNpbmdsZSBwYWNrYWdlcyB0aGF0IGFyZQotICAgICAqIGluc3RhbGxlZCBpbiB0aGUgc3lzdGVtLiBUaGlzIGluZm9ybWF0aW9uIHdpbGwgYmUgdXNlZCBieSB0aGUKLSAgICAgKiBuYXZpZ2F0b3IuaXNBcHBsaWNhdGlvbkluc3RhbGxlZCgpIEFQSS4KLSAgICAgKiBAcGFyYW0gcGFja2FnZU5hbWUgaXMgdGhlIG5hbWUgb2YgYSBwYWNrYWdlIHRoYXQgaXMga25vd24gdG8gYmUKLSAgICAgKiBpbnN0YWxsZWQgaW4gdGhlIHN5c3RlbS4KLSAgICAgKgotICAgICAqIEBoaWRlIG5vdCBhIHB1YmxpYyBBUEkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBhZGRQYWNrYWdlTmFtZShTdHJpbmcgcGFja2FnZU5hbWUpIHsKLSAgICAgICAgbVdlYlZpZXdDb3JlLnNlbmRNZXNzYWdlKEV2ZW50SHViLkFERF9QQUNLQUdFX05BTUUsIHBhY2thZ2VOYW1lKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBVc2UgdGhpcyBtZXRob2QgdG8gaW5mb3JtIHRoZSB3ZWJ2aWV3IGFib3V0IHBhY2thZ2VzIHRoYXQgYXJlIHVuaW5zdGFsbGVkCi0gICAgICogaW4gdGhlIHN5c3RlbS4gVGhpcyBpbmZvcm1hdGlvbiB3aWxsIGJlIHVzZWQgYnkgdGhlCi0gICAgICogbmF2aWdhdG9yLmlzQXBwbGljYXRpb25JbnN0YWxsZWQoKSBBUEkuCi0gICAgICogQHBhcmFtIHBhY2thZ2VOYW1lIGlzIHRoZSBuYW1lIG9mIGEgcGFja2FnZSB0aGF0IGhhcyBiZWVuIHVuaW5zdGFsbGVkIGluCi0gICAgICogdGhlIHN5c3RlbS4KLSAgICAgKgotICAgICAqIEBoaWRlIG5vdCBhIHB1YmxpYyBBUEkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCByZW1vdmVQYWNrYWdlTmFtZShTdHJpbmcgcGFja2FnZU5hbWUpIHsKLSAgICAgICAgbVdlYlZpZXdDb3JlLnNlbmRNZXNzYWdlKEV2ZW50SHViLlJFTU9WRV9QQUNLQUdFX05BTUUsIHBhY2thZ2VOYW1lKTsKKyAgICAgICAgcmV0dXJuIChtV2ViVmlld0NvcmUgIT0gbnVsbCkgPyBtV2ViVmlld0NvcmUuZ2V0U2V0dGluZ3MoKSA6IG51bGw7CiAgICAgfQogCiAgICAvKioKQEAgLTM0MDgsMzYgKzM0MzYsNiBAQAogICAgICAgICB9CiAKICAgICAgICAgaW50IHNhdmVDb3VudCA9IGNhbnZhcy5zYXZlKCk7Ci0gICAgICAgIGlmIChtSW5PdmVyU2Nyb2xsTW9kZSAmJiAhZ2V0U2V0dGluZ3MoKQotICAgICAgICAgICAgICAgIC5nZXRVc2VXZWJWaWV3QmFja2dyb3VuZEZvck92ZXJzY3JvbGxCYWNrZ3JvdW5kKCkpIHsKLSAgICAgICAgICAgIGlmIChtT3ZlclNjcm9sbEJhY2tncm91bmQgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1PdmVyU2Nyb2xsQmFja2dyb3VuZCA9IG5ldyBQYWludCgpOwotICAgICAgICAgICAgICAgIEJpdG1hcCBibSA9IEJpdG1hcEZhY3RvcnkuZGVjb2RlUmVzb3VyY2UoCi0gICAgICAgICAgICAgICAgICAgICAgICBtQ29udGV4dC5nZXRSZXNvdXJjZXMoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuZHJhd2FibGUuc3RhdHVzX2Jhcl9iYWNrZ3JvdW5kKTsKLSAgICAgICAgICAgICAgICBtT3ZlclNjcm9sbEJhY2tncm91bmQuc2V0U2hhZGVyKG5ldyBCaXRtYXBTaGFkZXIoYm0sCi0gICAgICAgICAgICAgICAgICAgICAgICBTaGFkZXIuVGlsZU1vZGUuUkVQRUFULCBTaGFkZXIuVGlsZU1vZGUuUkVQRUFUKSk7Ci0gICAgICAgICAgICAgICAgbU92ZXJTY3JvbGxCb3JkZXIgPSBuZXcgUGFpbnQoKTsKLSAgICAgICAgICAgICAgICBtT3ZlclNjcm9sbEJvcmRlci5zZXRTdHlsZShQYWludC5TdHlsZS5TVFJPS0UpOwotICAgICAgICAgICAgICAgIG1PdmVyU2Nyb2xsQm9yZGVyLnNldFN0cm9rZVdpZHRoKDApOwotICAgICAgICAgICAgICAgIG1PdmVyU2Nyb2xsQm9yZGVyLnNldENvbG9yKDB4ZmZiYmJiYmIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpbnQgdG9wID0gMDsKLSAgICAgICAgICAgIGludCByaWdodCA9IGNvbXB1dGVSZWFsSG9yaXpvbnRhbFNjcm9sbFJhbmdlKCk7Ci0gICAgICAgICAgICBpbnQgYm90dG9tID0gdG9wICsgY29tcHV0ZVJlYWxWZXJ0aWNhbFNjcm9sbFJhbmdlKCk7Ci0gICAgICAgICAgICAvLyBmaXJzdCBkcmF3IHRoZSBiYWNrZ3JvdW5kIGFuZCBhbmNob3IgdG8gdGhlIHRvcCBvZiB0aGUgdmlldwotICAgICAgICAgICAgY2FudmFzLnNhdmUoKTsKLSAgICAgICAgICAgIGNhbnZhcy50cmFuc2xhdGUobVNjcm9sbFgsIG1TY3JvbGxZKTsKLSAgICAgICAgICAgIGNhbnZhcy5jbGlwUmVjdCgtbVNjcm9sbFgsIHRvcCAtIG1TY3JvbGxZLCByaWdodCAtIG1TY3JvbGxYLCBib3R0b20KLSAgICAgICAgICAgICAgICAgICAgLSBtU2Nyb2xsWSwgUmVnaW9uLk9wLkRJRkZFUkVOQ0UpOwotICAgICAgICAgICAgY2FudmFzLmRyYXdQYWludChtT3ZlclNjcm9sbEJhY2tncm91bmQpOwotICAgICAgICAgICAgY2FudmFzLnJlc3RvcmUoKTsKLSAgICAgICAgICAgIC8vIHRoZW4gZHJhdyB0aGUgYm9yZGVyCi0gICAgICAgICAgICBjYW52YXMuZHJhd1JlY3QoLTEsIHRvcCAtIDEsIHJpZ2h0LCBib3R0b20sIG1PdmVyU2Nyb2xsQm9yZGVyKTsKLSAgICAgICAgICAgIC8vIG5leHQgY2xpcCB0aGUgcmVnaW9uIGZvciB0aGUgY29udGVudAotICAgICAgICAgICAgY2FudmFzLmNsaXBSZWN0KDAsIHRvcCwgcmlnaHQsIGJvdHRvbSk7Ci0gICAgICAgIH0KICAgICAgICAgaWYgKG1UaXRsZUJhciAhPSBudWxsKSB7CiAgICAgICAgICAgICBjYW52YXMudHJhbnNsYXRlKDAsIChpbnQpIG1UaXRsZUJhci5nZXRIZWlnaHQoKSk7CiAgICAgICAgIH0KQEAgLTM0NjMsNzEgKzM0NjEsNTAgQEAKICAgICAgICAgICAgICAgICAgICAgbVNjcm9sbFkgKyBoZWlnaHQpOwogICAgICAgICAgICAgbVRpdGxlU2hhZG93LmRyYXcoY2FudmFzKTsKICAgICAgICAgfQotCiAgICAgICAgIGlmIChBVVRPX1JFRFJBV19IQUNLICYmIG1BdXRvUmVkcmF3KSB7CiAgICAgICAgICAgICBpbnZhbGlkYXRlKCk7CiAgICAgICAgIH0KKyAgICAgICAgaWYgKGluRWRpdGluZ01vZGUoKSkgbVdlYlRleHRWaWV3Lm9uRHJhd1N1YnN0aXR1dGUoKTsKICAgICAgICAgbVdlYlZpZXdDb3JlLnNpZ25hbFJlcGFpbnREb25lKCk7Ci0gICAgfQogCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgZHJhdyhDYW52YXMgY2FudmFzKSB7Ci0gICAgICAgIHN1cGVyLmRyYXcoY2FudmFzKTsKLSAgICAgICAgaWYgKG1FZGdlR2xvd1RvcCAhPSBudWxsICYmIGRyYXdFZGdlR2xvd3MoY2FudmFzKSkgewotICAgICAgICAgICAgaW52YWxpZGF0ZSgpOworICAgICAgICAvLyBwYWludCB0aGUgaGlnaGxpZ2h0IGluIHRoZSBlbmQKKyAgICAgICAgaWYgKCFtVG91Y2hIaWdobGlnaHRSZWdpb24uaXNFbXB0eSgpKSB7CisgICAgICAgICAgICBpZiAobVRvdWNoSGlnaHRsaWdodFBhaW50ID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBtVG91Y2hIaWdodGxpZ2h0UGFpbnQgPSBuZXcgUGFpbnQoKTsKKyAgICAgICAgICAgICAgICBtVG91Y2hIaWdodGxpZ2h0UGFpbnQuc2V0Q29sb3IobUhpZ2h0bGlnaHRDb2xvcik7CisgICAgICAgICAgICAgICAgbVRvdWNoSGlnaHRsaWdodFBhaW50LnNldEFudGlBbGlhcyh0cnVlKTsKKyAgICAgICAgICAgICAgICBtVG91Y2hIaWdodGxpZ2h0UGFpbnQuc2V0UGF0aEVmZmVjdChuZXcgQ29ybmVyUGF0aEVmZmVjdCgKKyAgICAgICAgICAgICAgICAgICAgICAgIFRPVUNIX0hJR0hMSUdIVF9BUkMpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhbnZhcy5kcmF3UGF0aChtVG91Y2hIaWdobGlnaHRSZWdpb24uZ2V0Qm91bmRhcnlQYXRoKCksCisgICAgICAgICAgICAgICAgICAgIG1Ub3VjaEhpZ2h0bGlnaHRQYWludCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKERFQlVHX1RPVUNIX0hJR0hMSUdIVCkgeworICAgICAgICAgICAgaWYgKGdldFNldHRpbmdzKCkuZ2V0TmF2RHVtcCgpKSB7CisgICAgICAgICAgICAgICAgaWYgKChtVG91Y2hIaWdobGlnaHRYIHwgbVRvdWNoSGlnaGxpZ2h0WSkgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICBpZiAobVRvdWNoQ3Jvc3NIYWlyQ29sb3IgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgbVRvdWNoQ3Jvc3NIYWlyQ29sb3IgPSBuZXcgUGFpbnQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1Ub3VjaENyb3NzSGFpckNvbG9yLnNldENvbG9yKENvbG9yLlJFRCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgY2FudmFzLmRyYXdMaW5lKG1Ub3VjaEhpZ2hsaWdodFggLSBtTmF2U2xvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtVG91Y2hIaWdobGlnaHRZIC0gbU5hdlNsb3AsIG1Ub3VjaEhpZ2hsaWdodFgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgbU5hdlNsb3AgKyAxLCBtVG91Y2hIaWdobGlnaHRZICsgbU5hdlNsb3AKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgMSwgbVRvdWNoQ3Jvc3NIYWlyQ29sb3IpOworICAgICAgICAgICAgICAgICAgICBjYW52YXMuZHJhd0xpbmUobVRvdWNoSGlnaGxpZ2h0WCArIG1OYXZTbG9wICsgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtVG91Y2hIaWdobGlnaHRZIC0gbU5hdlNsb3AsIG1Ub3VjaEhpZ2hsaWdodFgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gbU5hdlNsb3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVRvdWNoSGlnaGxpZ2h0WSArIG1OYXZTbG9wICsgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtVG91Y2hDcm9zc0hhaXJDb2xvcik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQogCi0gICAgLyoqCi0gICAgICogRHJhdyB0aGUgZ2xvdyBlZmZlY3QgYWxvbmcgdGhlIHNpZGVzIG9mIHRoZSB3aWRnZXQuIG1FZGdlR2xvdyogbXVzdCBiZSBub24tbnVsbC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBjYW52YXMgQ2FudmFzIHRvIGRyYXcgaW50bywgdHJhbnNmb3JtZWQgaW50byB2aWV3IGNvb3JkaW5hdGVzLgotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiBnbG93IGVmZmVjdHMgYXJlIHN0aWxsIGFuaW1hdGluZyBhbmQgdGhlIHZpZXcgc2hvdWxkIGludmFsaWRhdGUgYWdhaW4uCi0gICAgICovCi0gICAgcHJpdmF0ZSBib29sZWFuIGRyYXdFZGdlR2xvd3MoQ2FudmFzIGNhbnZhcykgewotICAgICAgICBmaW5hbCBpbnQgc2Nyb2xsWCA9IG1TY3JvbGxYOwotICAgICAgICBmaW5hbCBpbnQgc2Nyb2xsWSA9IG1TY3JvbGxZOwotICAgICAgICBmaW5hbCBpbnQgd2lkdGggPSBnZXRXaWR0aCgpOwotICAgICAgICBpbnQgaGVpZ2h0ID0gZ2V0SGVpZ2h0KCk7Ci0KLSAgICAgICAgYm9vbGVhbiBpbnZhbGlkYXRlRm9yR2xvdyA9IGZhbHNlOwotICAgICAgICBpZiAoIW1FZGdlR2xvd1RvcC5pc0ZpbmlzaGVkKCkpIHsKLSAgICAgICAgICAgIGZpbmFsIGludCByZXN0b3JlQ291bnQgPSBjYW52YXMuc2F2ZSgpOwotCi0gICAgICAgICAgICBjYW52YXMudHJhbnNsYXRlKC13aWR0aCAvIDIgKyBzY3JvbGxYLCBNYXRoLm1pbigwLCBzY3JvbGxZKSk7Ci0gICAgICAgICAgICBtRWRnZUdsb3dUb3Auc2V0U2l6ZSh3aWR0aCAqIDIsIGhlaWdodCk7Ci0gICAgICAgICAgICBpbnZhbGlkYXRlRm9yR2xvdyB8PSBtRWRnZUdsb3dUb3AuZHJhdyhjYW52YXMpOwotICAgICAgICAgICAgY2FudmFzLnJlc3RvcmVUb0NvdW50KHJlc3RvcmVDb3VudCk7CisgICAgcHJpdmF0ZSB2b2lkIHJlbW92ZVRvdWNoSGlnaGxpZ2h0KGJvb2xlYW4gcmVtb3ZlUGVuZGluZ01lc3NhZ2UpIHsKKyAgICAgICAgaWYgKHJlbW92ZVBlbmRpbmdNZXNzYWdlKSB7CisgICAgICAgICAgICBtV2ViVmlld0NvcmUucmVtb3ZlTWVzc2FnZXMoRXZlbnRIdWIuR0VUX1RPVUNIX0hJR0hMSUdIVF9SRUNUUyk7CiAgICAgICAgIH0KLSAgICAgICAgaWYgKCFtRWRnZUdsb3dCb3R0b20uaXNGaW5pc2hlZCgpKSB7Ci0gICAgICAgICAgICBmaW5hbCBpbnQgcmVzdG9yZUNvdW50ID0gY2FudmFzLnNhdmUoKTsKLQotICAgICAgICAgICAgY2FudmFzLnRyYW5zbGF0ZSgtd2lkdGggLyAyICsgc2Nyb2xsWCwgTWF0aC5tYXgoY29tcHV0ZU1heFNjcm9sbFkoKSwgc2Nyb2xsWSkgKyBoZWlnaHQpOwotICAgICAgICAgICAgY2FudmFzLnJvdGF0ZSgxODAsIHdpZHRoLCAwKTsKLSAgICAgICAgICAgIG1FZGdlR2xvd0JvdHRvbS5zZXRTaXplKHdpZHRoICogMiwgaGVpZ2h0KTsKLSAgICAgICAgICAgIGludmFsaWRhdGVGb3JHbG93IHw9IG1FZGdlR2xvd0JvdHRvbS5kcmF3KGNhbnZhcyk7Ci0gICAgICAgICAgICBjYW52YXMucmVzdG9yZVRvQ291bnQocmVzdG9yZUNvdW50KTsKLSAgICAgICAgfQotICAgICAgICBpZiAoIW1FZGdlR2xvd0xlZnQuaXNGaW5pc2hlZCgpKSB7Ci0gICAgICAgICAgICBmaW5hbCBpbnQgcmVzdG9yZUNvdW50ID0gY2FudmFzLnNhdmUoKTsKLQotICAgICAgICAgICAgY2FudmFzLnJvdGF0ZSgyNzApOwotICAgICAgICAgICAgY2FudmFzLnRyYW5zbGF0ZSgtaGVpZ2h0ICogMS41ZiAtIHNjcm9sbFksIE1hdGgubWluKDAsIHNjcm9sbFgpKTsKLSAgICAgICAgICAgIG1FZGdlR2xvd0xlZnQuc2V0U2l6ZShoZWlnaHQgKiAyLCB3aWR0aCk7Ci0gICAgICAgICAgICBpbnZhbGlkYXRlRm9yR2xvdyB8PSBtRWRnZUdsb3dMZWZ0LmRyYXcoY2FudmFzKTsKLSAgICAgICAgICAgIGNhbnZhcy5yZXN0b3JlVG9Db3VudChyZXN0b3JlQ291bnQpOwotICAgICAgICB9Ci0gICAgICAgIGlmICghbUVkZ2VHbG93UmlnaHQuaXNGaW5pc2hlZCgpKSB7Ci0gICAgICAgICAgICBmaW5hbCBpbnQgcmVzdG9yZUNvdW50ID0gY2FudmFzLnNhdmUoKTsKLQotICAgICAgICAgICAgY2FudmFzLnJvdGF0ZSg5MCk7Ci0gICAgICAgICAgICBjYW52YXMudHJhbnNsYXRlKC1oZWlnaHQgLyAyICsgc2Nyb2xsWSwKLSAgICAgICAgICAgICAgICAgICAgLShNYXRoLm1heChjb21wdXRlTWF4U2Nyb2xsWCgpLCBzY3JvbGxYKSArIHdpZHRoKSk7Ci0gICAgICAgICAgICBtRWRnZUdsb3dSaWdodC5zZXRTaXplKGhlaWdodCAqIDIsIHdpZHRoKTsKLSAgICAgICAgICAgIGludmFsaWRhdGVGb3JHbG93IHw9IG1FZGdlR2xvd1JpZ2h0LmRyYXcoY2FudmFzKTsKLSAgICAgICAgICAgIGNhbnZhcy5yZXN0b3JlVG9Db3VudChyZXN0b3JlQ291bnQpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBpbnZhbGlkYXRlRm9yR2xvdzsKKyAgICAgICAgbVdlYlZpZXdDb3JlLnNlbmRNZXNzYWdlKEV2ZW50SHViLlJFTU9WRV9UT1VDSF9ISUdITElHSFRfUkVDVFMpOwogICAgIH0KIAogICAgIEBPdmVycmlkZQpAQCAtMzU0NCwxMiArMzUyMSwyMCBAQAogICAgICAgICAvLyB0byB3aW5kb3dzIG92ZXJ2aWV3LCB0aGUgV2ViVmlldyB3aWxsIGJlIHRlbXBvcmFyaWx5IHJlbW92ZWQgZnJvbSB0aGUKICAgICAgICAgLy8gdmlldyBzeXN0ZW0uIEluIHRoYXQgY2FzZSwgZG8gbm90aGluZy4KICAgICAgICAgaWYgKGdldFBhcmVudCgpID09IG51bGwpIHJldHVybiBmYWxzZTsKKworICAgICAgICAvLyBBIG11bHRpLWZpbmdlciBnZXN0dXJlIGNhbiBsb29rIGxpa2UgYSBsb25nIHByZXNzOyBtYWtlIHN1cmUgd2UgZG9uJ3QgdGFrZQorICAgICAgICAvLyBsb25nIHByZXNzIGFjdGlvbnMgaWYgd2UncmUgc2NhbGluZy4KKyAgICAgICAgZmluYWwgU2NhbGVHZXN0dXJlRGV0ZWN0b3IgZGV0ZWN0b3IgPSBtWm9vbU1hbmFnZXIuZ2V0TXVsdGlUb3VjaEdlc3R1cmVEZXRlY3RvcigpOworICAgICAgICBpZiAoZGV0ZWN0b3IgIT0gbnVsbCAmJiBkZXRlY3Rvci5pc0luUHJvZ3Jlc3MoKSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIAogICAgICAgICBpZiAobU5hdGl2ZUNsYXNzICE9IDAgJiYgbmF0aXZlQ3Vyc29ySXNUZXh0SW5wdXQoKSkgewogICAgICAgICAgICAgLy8gU2VuZCB0aGUgY2xpY2sgc28gdGhhdCB0aGUgdGV4dGZpZWxkIGlzIGluIGZvY3VzCiAgICAgICAgICAgICBjZW50ZXJLZXlQcmVzc09uVGV4dEZpZWxkKCk7CiAgICAgICAgICAgICByZWJ1aWxkV2ViVGV4dFZpZXcoKTsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGNsZWFyVGV4dEVudHJ5KHRydWUpOworICAgICAgICAgICAgY2xlYXJUZXh0RW50cnkoKTsKICAgICAgICAgfQogICAgICAgICBpZiAoaW5FZGl0aW5nTW9kZSgpKSB7CiAgICAgICAgICAgICByZXR1cm4gbVdlYlRleHRWaWV3LnBlcmZvcm1Mb25nQ2xpY2soKTsKQEAgLTM1NzAsMjYgKzM1NTUsMTcgQEAKICAgICAgICAgc2V0VXBTZWxlY3QoKTsKICAgICAgICAgaWYgKG1OYXRpdmVDbGFzcyAhPSAwICYmIG5hdGl2ZVdvcmRTZWxlY3Rpb24oeCwgeSkpIHsKICAgICAgICAgICAgIG5hdGl2ZVNldEV4dGVuZFNlbGVjdGlvbigpOwotICAgICAgICAgICAgV2ViQ2hyb21lQ2xpZW50IGNsaWVudCA9IGdldFdlYkNocm9tZUNsaWVudCgpOwotICAgICAgICAgICAgaWYgKGNsaWVudCAhPSBudWxsKSBjbGllbnQub25TZWxlY3Rpb25TdGFydCh0aGlzKTsKICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICB9Ci0gICAgICAgIG5vdGlmeVNlbGVjdERpYWxvZ0Rpc21pc3NlZCgpOworICAgICAgICBzZWxlY3Rpb25Eb25lKCk7CiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAKLSAgICBib29sZWFuIGluQW5pbWF0ZVpvb20oKSB7Ci0gICAgICAgIHJldHVybiBtWm9vbVNjYWxlICE9IDA7Ci0gICAgfQotCiAgICAgLyoqCi0gICAgICogTmVlZCB0byBhZGp1c3QgdGhlIFdlYlRleHRWaWV3IGFmdGVyIGEgY2hhbmdlIGluIHpvb20sIHNpbmNlIG1BY3R1YWxTY2FsZQotICAgICAqIGhhcyBjaGFuZ2VkLiAgVGhpcyBpcyBlc3BlY2lhbGx5IGltcG9ydGFudCBmb3IgcGFzc3dvcmQgZmllbGRzLCB3aGljaCBhcmUKLSAgICAgKiBkcmF3biBieSB0aGUgV2ViVGV4dFZpZXcsIHNpbmNlIGl0IGNvbnZleXMgbW9yZSBpbmZvcm1hdGlvbiB0aGFuIHdoYXQKLSAgICAgKiB3ZWJraXQgZHJhd3MuICBUaHVzIHdlIG5lZWQgdG8gcmVwb3NpdGlvbiBpdCB0byBzaG93IGluIHRoZSBjb3JyZWN0Ci0gICAgICogcGxhY2UuCisgICAgICogS2VlcCB0cmFjayBvZiB0aGUgQ2FsbGJhY2sgc28gd2UgY2FuIGVuZCBpdHMgQWN0aW9uTW9kZSBvciByZW1vdmUgaXRzCisgICAgICogdGl0bGViYXIuCiAgICAgICovCi0gICAgcHJpdmF0ZSBib29sZWFuIG1OZWVkVG9BZGp1c3RXZWJUZXh0VmlldzsKKyAgICBwcml2YXRlIFNlbGVjdEFjdGlvbk1vZGVDYWxsYmFjayBtU2VsZWN0Q2FsbGJhY2s7CiAKICAgICBwcml2YXRlIGJvb2xlYW4gZGlkVXBkYXRlVGV4dFZpZXdCb3VuZHMoYm9vbGVhbiBhbGxvd0ludGVyc2VjdCkgewogICAgICAgICBSZWN0IGNvbnRlbnRCb3VuZHMgPSBuYXRpdmVGb2N1c0NhbmRpZGF0ZU5vZGVCb3VuZHMoKTsKQEAgLTM2MTgsMjUgKzM1OTQsNTQgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIHByaXZhdGUgdm9pZCBkcmF3RXh0cmFzKENhbnZhcyBjYW52YXMsIGludCBleHRyYXMsIGJvb2xlYW4gYW5pbWF0aW9uc1J1bm5pbmcpIHsKLSAgICAgICAgLy8gSWYgbU5hdGl2ZUNsYXNzIGlzIDAsIHdlIHNob3VsZCBub3QgcmVhY2ggaGVyZSwgc28gd2UgZG8gbm90Ci0gICAgICAgIC8vIG5lZWQgdG8gY2hlY2sgaXQgYWdhaW4uCi0gICAgICAgIGlmIChhbmltYXRpb25zUnVubmluZykgewotICAgICAgICAgICAgY2FudmFzLnNldERyYXdGaWx0ZXIobVdlYlZpZXdDb3JlLm1ab29tRmlsdGVyKTsKKyAgICBwcml2YXRlIHZvaWQgb25ab29tQW5pbWF0aW9uU3RhcnQoKSB7CisgICAgICAgIC8vIElmIGl0IGlzIGluIHBhc3N3b3JkIG1vZGUsIHR1cm4gaXQgb2ZmIHNvIGl0IGRvZXMgbm90IGRyYXcgbWlzcGxhY2VkLgorICAgICAgICBpZiAoaW5FZGl0aW5nTW9kZSgpICYmIG5hdGl2ZUZvY3VzQ2FuZGlkYXRlSXNQYXNzd29yZCgpKSB7CisgICAgICAgICAgICBtV2ViVGV4dFZpZXcuc2V0SW5QYXNzd29yZChmYWxzZSk7CiAgICAgICAgIH0KLSAgICAgICAgbmF0aXZlRHJhd0V4dHJhcyhjYW52YXMsIGV4dHJhcyk7Ci0gICAgICAgIGNhbnZhcy5zZXREcmF3RmlsdGVyKG51bGwpOwogICAgIH0KIAorICAgIHByaXZhdGUgdm9pZCBvblpvb21BbmltYXRpb25FbmQoKSB7CisgICAgICAgIC8vIGFkanVzdCB0aGUgZWRpdCB0ZXh0IHZpZXcgaWYgbmVlZGVkCisgICAgICAgIGlmIChpbkVkaXRpbmdNb2RlKCkgJiYgZGlkVXBkYXRlVGV4dFZpZXdCb3VuZHMoZmFsc2UpICYmIG5hdGl2ZUZvY3VzQ2FuZGlkYXRlSXNQYXNzd29yZCgpKSB7CisgICAgICAgICAgICAvLyBJZiBpdCBpcyBhIHBhc3N3b3JkIGZpZWxkLCBzdGFydCBkcmF3aW5nIHRoZSBXZWJUZXh0VmlldyBvbmNlCisgICAgICAgICAgICAvLyBhZ2Fpbi4KKyAgICAgICAgICAgIG1XZWJUZXh0Vmlldy5zZXRJblBhc3N3b3JkKHRydWUpOworICAgICAgICB9CisgICAgfQorCisgICAgdm9pZCBvbkZpeGVkTGVuZ3RoWm9vbUFuaW1hdGlvblN0YXJ0KCkgeworICAgICAgICBXZWJWaWV3Q29yZS5wYXVzZVVwZGF0ZVBpY3R1cmUoZ2V0V2ViVmlld0NvcmUoKSk7CisgICAgICAgIG9uWm9vbUFuaW1hdGlvblN0YXJ0KCk7CisgICAgfQorCisgICAgdm9pZCBvbkZpeGVkTGVuZ3RoWm9vbUFuaW1hdGlvbkVuZCgpIHsKKyAgICAgICAgV2ViVmlld0NvcmUucmVzdW1lVXBkYXRlUGljdHVyZShtV2ViVmlld0NvcmUpOworICAgICAgICBvblpvb21BbmltYXRpb25FbmQoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgWk9PTV9CSVRTID0gUGFpbnQuRklMVEVSX0JJVE1BUF9GTEFHIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFpbnQuRElUSEVSX0ZMQUcgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYWludC5TVUJQSVhFTF9URVhUX0ZMQUc7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNDUk9MTF9CSVRTID0gUGFpbnQuRklMVEVSX0JJVE1BUF9GTEFHIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYWludC5ESVRIRVJfRkxBRzsKKworICAgIHByaXZhdGUgZmluYWwgRHJhd0ZpbHRlciBtWm9vbUZpbHRlciA9CisgICAgICAgICAgICBuZXcgUGFpbnRGbGFnc0RyYXdGaWx0ZXIoWk9PTV9CSVRTLCBQYWludC5MSU5FQVJfVEVYVF9GTEFHKTsKKyAgICAvLyBJZiB3ZSBuZWVkIHRvIHRyYWRlIGJldHRlciBxdWFsaXR5IGZvciBzcGVlZCwgc2V0IG1TY3JvbGxGaWx0ZXIgdG8gbnVsbAorICAgIHByaXZhdGUgZmluYWwgRHJhd0ZpbHRlciBtU2Nyb2xsRmlsdGVyID0KKyAgICAgICAgICAgIG5ldyBQYWludEZsYWdzRHJhd0ZpbHRlcihTQ1JPTExfQklUUywgMCk7CisKICAgICBwcml2YXRlIHZvaWQgZHJhd0NvcmVBbmRDdXJzb3JSaW5nKENhbnZhcyBjYW52YXMsIGludCBjb2xvciwKICAgICAgICAgYm9vbGVhbiBkcmF3Q3Vyc29yUmluZykgewogICAgICAgICBpZiAobURyYXdIaXN0b3J5KSB7Ci0gICAgICAgICAgICBjYW52YXMuc2NhbGUobUFjdHVhbFNjYWxlLCBtQWN0dWFsU2NhbGUpOworICAgICAgICAgICAgY2FudmFzLnNjYWxlKG1ab29tTWFuYWdlci5nZXRTY2FsZSgpLCBtWm9vbU1hbmFnZXIuZ2V0U2NhbGUoKSk7CiAgICAgICAgICAgICBjYW52YXMuZHJhd1BpY3R1cmUobUhpc3RvcnlQaWN0dXJlKTsKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQorICAgICAgICBpZiAobU5hdGl2ZUNsYXNzID09IDApIHJldHVybjsKIAotICAgICAgICBib29sZWFuIGFuaW1hdGVab29tID0gbVpvb21TY2FsZSAhPSAwOworICAgICAgICBib29sZWFuIGFuaW1hdGVab29tID0gbVpvb21NYW5hZ2VyLmlzRml4ZWRMZW5ndGhBbmltYXRpb25JblByb2dyZXNzKCk7CiAgICAgICAgIGJvb2xlYW4gYW5pbWF0ZVNjcm9sbCA9ICgoIW1TY3JvbGxlci5pc0ZpbmlzaGVkKCkKICAgICAgICAgICAgICAgICB8fCBtVmVsb2NpdHlUcmFja2VyICE9IG51bGwpCiAgICAgICAgICAgICAgICAgJiYgKG1Ub3VjaE1vZGUgIT0gVE9VQ0hfRFJBR19NT0RFIHx8CkBAIC0zNjU1LDU5ICszNjYwLDkgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICBpZiAoYW5pbWF0ZVpvb20pIHsKLSAgICAgICAgICAgIGZsb2F0IHpvb21TY2FsZTsKLSAgICAgICAgICAgIGludCBpbnRlcnZhbCA9IChpbnQpIChTeXN0ZW1DbG9jay51cHRpbWVNaWxsaXMoKSAtIG1ab29tU3RhcnQpOwotICAgICAgICAgICAgaWYgKGludGVydmFsIDwgWk9PTV9BTklNQVRJT05fTEVOR1RIKSB7Ci0gICAgICAgICAgICAgICAgZmxvYXQgcmF0aW8gPSAoZmxvYXQpIGludGVydmFsIC8gWk9PTV9BTklNQVRJT05fTEVOR1RIOwotICAgICAgICAgICAgICAgIHpvb21TY2FsZSA9IDEuMGYgLyAobUludkluaXRpYWxab29tU2NhbGUKLSAgICAgICAgICAgICAgICAgICAgICAgICsgKG1JbnZGaW5hbFpvb21TY2FsZSAtIG1JbnZJbml0aWFsWm9vbVNjYWxlKSAqIHJhdGlvKTsKLSAgICAgICAgICAgICAgICBpbnZhbGlkYXRlKCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHpvb21TY2FsZSA9IG1ab29tU2NhbGU7Ci0gICAgICAgICAgICAgICAgLy8gc2V0IG1ab29tU2NhbGUgdG8gYmUgMCBhcyB3ZSBoYXZlIGRvbmUgYW5pbWF0aW9uCi0gICAgICAgICAgICAgICAgbVpvb21TY2FsZSA9IDA7Ci0gICAgICAgICAgICAgICAgV2ViVmlld0NvcmUucmVzdW1lVXBkYXRlUGljdHVyZShtV2ViVmlld0NvcmUpOwotICAgICAgICAgICAgICAgIC8vIGNhbGwgaW52YWxpZGF0ZSgpIGFnYWluIHRvIGRyYXcgd2l0aCB0aGUgZmluYWwgZmlsdGVycwotICAgICAgICAgICAgICAgIGludmFsaWRhdGUoKTsKLSAgICAgICAgICAgICAgICBpZiAobU5lZWRUb0FkanVzdFdlYlRleHRWaWV3KSB7Ci0gICAgICAgICAgICAgICAgICAgIG1OZWVkVG9BZGp1c3RXZWJUZXh0VmlldyA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICBpZiAoZGlkVXBkYXRlVGV4dFZpZXdCb3VuZHMoZmFsc2UpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgbmF0aXZlRm9jdXNDYW5kaWRhdGVJc1Bhc3N3b3JkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIElmIGl0IGlzIGEgcGFzc3dvcmQgZmllbGQsIHN0YXJ0IGRyYXdpbmcgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBXZWJUZXh0VmlldyBvbmNlIGFnYWluLgotICAgICAgICAgICAgICAgICAgICAgICAgbVdlYlRleHRWaWV3LnNldEluUGFzc3dvcmQodHJ1ZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBjYWxjdWxhdGUgdGhlIGludGVybWVkaWF0ZSBzY3JvbGwgcG9zaXRpb24uIEFzIHdlIG5lZWQgdG8gdXNlCi0gICAgICAgICAgICAvLyB6b29tU2NhbGUsIHdlIGNhbid0IHVzZSBwaW5Mb2NYL1kgZGlyZWN0bHkuIENvcHkgdGhlIGxvZ2ljIGhlcmUuCi0gICAgICAgICAgICBmbG9hdCBzY2FsZSA9IHpvb21TY2FsZSAqIG1JbnZJbml0aWFsWm9vbVNjYWxlOwotICAgICAgICAgICAgaW50IHR4ID0gTWF0aC5yb3VuZChzY2FsZSAqIChtSW5pdGlhbFNjcm9sbFggKyBtWm9vbUNlbnRlclgpCi0gICAgICAgICAgICAgICAgICAgIC0gbVpvb21DZW50ZXJYKTsKLSAgICAgICAgICAgIHR4ID0gLXBpbkxvYyh0eCwgZ2V0Vmlld1dpZHRoKCksIE1hdGgucm91bmQobUNvbnRlbnRXaWR0aAotICAgICAgICAgICAgICAgICAgICAqIHpvb21TY2FsZSkpICsgbVNjcm9sbFg7Ci0gICAgICAgICAgICBpbnQgdGl0bGVIZWlnaHQgPSBnZXRUaXRsZUhlaWdodCgpOwotICAgICAgICAgICAgaW50IHR5ID0gTWF0aC5yb3VuZChzY2FsZQotICAgICAgICAgICAgICAgICAgICAqIChtSW5pdGlhbFNjcm9sbFkgKyBtWm9vbUNlbnRlclkgLSB0aXRsZUhlaWdodCkKLSAgICAgICAgICAgICAgICAgICAgLSAobVpvb21DZW50ZXJZIC0gdGl0bGVIZWlnaHQpKTsKLSAgICAgICAgICAgIHR5ID0gLSh0eSA8PSB0aXRsZUhlaWdodCA/IE1hdGgubWF4KHR5LCAwKSA6IHBpbkxvYyh0eQotICAgICAgICAgICAgICAgICAgICAtIHRpdGxlSGVpZ2h0LCBnZXRWaWV3SGVpZ2h0KCksIE1hdGgucm91bmQobUNvbnRlbnRIZWlnaHQKLSAgICAgICAgICAgICAgICAgICAgKiB6b29tU2NhbGUpKSArIHRpdGxlSGVpZ2h0KSArIG1TY3JvbGxZOwotICAgICAgICAgICAgY2FudmFzLnRyYW5zbGF0ZSh0eCwgdHkpOwotICAgICAgICAgICAgY2FudmFzLnNjYWxlKHpvb21TY2FsZSwgem9vbVNjYWxlKTsKLSAgICAgICAgICAgIGlmIChpbkVkaXRpbmdNb2RlKCkgJiYgIW1OZWVkVG9BZGp1c3RXZWJUZXh0VmlldwotICAgICAgICAgICAgICAgICAgICAmJiBtWm9vbVNjYWxlICE9IDApIHsKLSAgICAgICAgICAgICAgICAvLyBUaGUgV2ViVGV4dFZpZXcgaXMgdXAuICBLZWVwIHRyYWNrIG9mIHRoaXMgc28gd2UgY2FuIGFkanVzdAotICAgICAgICAgICAgICAgIC8vIGl0cyBzaXplIGFuZCBwbGFjZW1lbnQgd2hlbiB3ZSBmaW5pc2ggem9vbWluZwotICAgICAgICAgICAgICAgIG1OZWVkVG9BZGp1c3RXZWJUZXh0VmlldyA9IHRydWU7Ci0gICAgICAgICAgICAgICAgLy8gSWYgaXQgaXMgaW4gcGFzc3dvcmQgbW9kZSwgdHVybiBpdCBvZmYgc28gaXQgZG9lcyBub3QgZHJhdwotICAgICAgICAgICAgICAgIC8vIG1pc3BsYWNlZC4KLSAgICAgICAgICAgICAgICBpZiAobmF0aXZlRm9jdXNDYW5kaWRhdGVJc1Bhc3N3b3JkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgbVdlYlRleHRWaWV3LnNldEluUGFzc3dvcmQoZmFsc2UpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1ab29tTWFuYWdlci5hbmltYXRlWm9vbShjYW52YXMpOwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgY2FudmFzLnNjYWxlKG1BY3R1YWxTY2FsZSwgbUFjdHVhbFNjYWxlKTsKKyAgICAgICAgICAgIGNhbnZhcy5zY2FsZShtWm9vbU1hbmFnZXIuZ2V0U2NhbGUoKSwgbVpvb21NYW5hZ2VyLmdldFNjYWxlKCkpOwogICAgICAgICB9CiAKICAgICAgICAgYm9vbGVhbiBVSUFuaW1hdGlvbnNSdW5uaW5nID0gZmFsc2U7CkBAIC0zNzE5LDIzICszNjc0LDM4IEBACiAgICAgICAgICAgICAvLyB3ZSBhc2sgZm9yIGEgcmVwYWludC4KICAgICAgICAgICAgIGludmFsaWRhdGUoKTsKICAgICAgICAgfQotICAgICAgICBtV2ViVmlld0NvcmUuZHJhd0NvbnRlbnRQaWN0dXJlKGNhbnZhcywgY29sb3IsCi0gICAgICAgICAgICAgICAgKGFuaW1hdGVab29tIHx8IG1QcmV2aWV3Wm9vbU9ubHkgfHwgVUlBbmltYXRpb25zUnVubmluZyksCi0gICAgICAgICAgICAgICAgYW5pbWF0ZVNjcm9sbCk7Ci0gICAgICAgIGlmIChtTmF0aXZlQ2xhc3MgPT0gMCkgcmV0dXJuOworCiAgICAgICAgIC8vIGRlY2lkZSB3aGljaCBhZG9ybm1lbnRzIHRvIGRyYXcKICAgICAgICAgaW50IGV4dHJhcyA9IERSQVdfRVhUUkFTX05PTkU7CisgICAgICAgIGlmIChEZWJ1Z0ZsYWdzLldFQl9WSUVXKSB7CisgICAgICAgICAgICBMb2cudihMT0dUQUcsICJtRmluZElzVXA9IiArIG1GaW5kSXNVcAorICAgICAgICAgICAgICAgICAgICArICIgbVNlbGVjdGluZ1RleHQ9IiArIG1TZWxlY3RpbmdUZXh0CisgICAgICAgICAgICAgICAgICAgICsgIiBuYXRpdmVQYWdlU2hvdWxkSGFuZGxlU2hpZnRBbmRBcnJvd3MoKT0iCisgICAgICAgICAgICAgICAgICAgICsgbmF0aXZlUGFnZVNob3VsZEhhbmRsZVNoaWZ0QW5kQXJyb3dzKCkKKyAgICAgICAgICAgICAgICAgICAgKyAiIGFuaW1hdGVab29tPSIgKyBhbmltYXRlWm9vbSk7CisgICAgICAgIH0KICAgICAgICAgaWYgKG1GaW5kSXNVcCkgewotICAgICAgICAgICAgICAgIGV4dHJhcyA9IERSQVdfRVhUUkFTX0ZJTkQ7CisgICAgICAgICAgICBleHRyYXMgPSBEUkFXX0VYVFJBU19GSU5EOwogICAgICAgICB9IGVsc2UgaWYgKG1TZWxlY3RpbmdUZXh0KSB7CiAgICAgICAgICAgICBleHRyYXMgPSBEUkFXX0VYVFJBU19TRUxFQ1RJT047CiAgICAgICAgICAgICBuYXRpdmVTZXRTZWxlY3Rpb25Qb2ludGVyKG1EcmF3U2VsZWN0aW9uUG9pbnRlciwKLSAgICAgICAgICAgICAgICAgICAgbUludkFjdHVhbFNjYWxlLAorICAgICAgICAgICAgICAgICAgICBtWm9vbU1hbmFnZXIuZ2V0SW52U2NhbGUoKSwKICAgICAgICAgICAgICAgICAgICAgbVNlbGVjdFgsIG1TZWxlY3RZIC0gZ2V0VGl0bGVIZWlnaHQoKSk7CiAgICAgICAgIH0gZWxzZSBpZiAoZHJhd0N1cnNvclJpbmcpIHsKICAgICAgICAgICAgIGV4dHJhcyA9IERSQVdfRVhUUkFTX0NVUlNPUl9SSU5HOwogICAgICAgICB9Ci0gICAgICAgIGRyYXdFeHRyYXMoY2FudmFzLCBleHRyYXMsIFVJQW5pbWF0aW9uc1J1bm5pbmcpOworICAgICAgICBEcmF3RmlsdGVyIGRmID0gbnVsbDsKKyAgICAgICAgaWYgKG1ab29tTWFuYWdlci5pc1pvb21BbmltYXRpbmcoKSB8fCBVSUFuaW1hdGlvbnNSdW5uaW5nKSB7CisgICAgICAgICAgICBkZiA9IG1ab29tRmlsdGVyOworICAgICAgICB9IGVsc2UgaWYgKGFuaW1hdGVTY3JvbGwpIHsKKyAgICAgICAgICAgIGRmID0gbVNjcm9sbEZpbHRlcjsKKyAgICAgICAgfQorICAgICAgICBjYW52YXMuc2V0RHJhd0ZpbHRlcihkZik7CisgICAgICAgIGludCBjb250ZW50ID0gbmF0aXZlRHJhdyhjYW52YXMsIGNvbG9yLCBleHRyYXMsIHRydWUpOworICAgICAgICBjYW52YXMuc2V0RHJhd0ZpbHRlcihudWxsKTsKKyAgICAgICAgaWYgKGNvbnRlbnQgIT0gMCkgeworICAgICAgICAgICAgbVdlYlZpZXdDb3JlLnNlbmRNZXNzYWdlKEV2ZW50SHViLlNQTElUX1BJQ1RVUkVfU0VULCBjb250ZW50LCAwKTsKKyAgICAgICAgfQogCiAgICAgICAgIGlmIChleHRyYXMgPT0gRFJBV19FWFRSQVNfQ1VSU09SX1JJTkcpIHsKICAgICAgICAgICAgIGlmIChtVG91Y2hNb2RlID09IFRPVUNIX1NIT1JUUFJFU1NfU1RBUlRfTU9ERSkgewpAQCAtMzc2NCwxMCArMzczNCwxNCBAQAogICAgICAgICByZXR1cm4gbURyYXdIaXN0b3J5OwogICAgIH0KIAorICAgIGludCBnZXRIaXN0b3J5UGljdHVyZVdpZHRoKCkgeworICAgICAgICByZXR1cm4gKG1IaXN0b3J5UGljdHVyZSAhPSBudWxsKSA/IG1IaXN0b3J5UGljdHVyZS5nZXRXaWR0aCgpIDogMDsKKyAgICB9CisKICAgICAvLyBTaG91bGQgb25seSBiZSBjYWxsZWQgaW4gVUkgdGhyZWFkCiAgICAgdm9pZCBzd2l0Y2hPdXREcmF3SGlzdG9yeSgpIHsKICAgICAgICAgaWYgKG51bGwgPT0gbVdlYlZpZXdDb3JlKSByZXR1cm47IC8vIENhbGxiYWNrUHJveHkgbWF5IHRyaWdnZXIgdGhpcwotICAgICAgICBpZiAobURyYXdIaXN0b3J5ICYmIG1XZWJWaWV3Q29yZS5waWN0dXJlUmVhZHkoKSkgeworICAgICAgICBpZiAobURyYXdIaXN0b3J5ICYmIChnZXRQcm9ncmVzcygpID09IDEwMCB8fCBuYXRpdmVIYXNDb250ZW50KCkpKSB7CiAgICAgICAgICAgICBtRHJhd0hpc3RvcnkgPSBmYWxzZTsKICAgICAgICAgICAgIG1IaXN0b3J5UGljdHVyZSA9IG51bGw7CiAgICAgICAgICAgICBpbnZhbGlkYXRlKCk7CkBAIC0zODE4LDcgKzM3OTIsOSBAQAogICAgICAqICBAcGFyYW0gIGVuZCAgICAgRW5kIG9mIHNlbGVjdGlvbi4KICAgICAgKi8KICAgICAvKiBwYWNrYWdlICovIHZvaWQgc2V0U2VsZWN0aW9uKGludCBzdGFydCwgaW50IGVuZCkgewotICAgICAgICBtV2ViVmlld0NvcmUuc2VuZE1lc3NhZ2UoRXZlbnRIdWIuU0VUX1NFTEVDVElPTiwgc3RhcnQsIGVuZCk7CisgICAgICAgIGlmIChtV2ViVmlld0NvcmUgIT0gbnVsbCkgeworICAgICAgICAgICAgbVdlYlZpZXdDb3JlLnNlbmRNZXNzYWdlKEV2ZW50SHViLlNFVF9TRUxFQ1RJT04sIHN0YXJ0LCBlbmQpOworICAgICAgICB9CiAgICAgfQogCiAgICAgQE92ZXJyaWRlCkBAIC0zODM2LDE0ICszODEyLDExIEBACiAgICAgICAgIElucHV0TWV0aG9kTWFuYWdlciBpbW0gPSAoSW5wdXRNZXRob2RNYW5hZ2VyKQogICAgICAgICAgICAgICAgIGdldENvbnRleHQoKS5nZXRTeXN0ZW1TZXJ2aWNlKENvbnRleHQuSU5QVVRfTUVUSE9EX1NFUlZJQ0UpOwogCi0gICAgICAgIC8vIGJyaW5nIGl0IGJhY2sgdG8gdGhlIGRlZmF1bHQgc2NhbGUgc28gdGhhdCB1c2VyIGNhbiBlbnRlciB0ZXh0Ci0gICAgICAgIGJvb2xlYW4gem9vbSA9IG1BY3R1YWxTY2FsZSA8IG1EZWZhdWx0U2NhbGU7CisgICAgICAgIC8vIGJyaW5nIGl0IGJhY2sgdG8gdGhlIGRlZmF1bHQgbGV2ZWwgc2NhbGUgc28gdGhhdCB1c2VyIGNhbiBlbnRlciB0ZXh0CisgICAgICAgIGJvb2xlYW4gem9vbSA9IG1ab29tTWFuYWdlci5nZXRTY2FsZSgpIDwgbVpvb21NYW5hZ2VyLmdldERlZmF1bHRTY2FsZSgpOwogICAgICAgICBpZiAoem9vbSkgewotICAgICAgICAgICAgbUluWm9vbU92ZXJ2aWV3ID0gZmFsc2U7Ci0gICAgICAgICAgICBtWm9vbUNlbnRlclggPSBtTGFzdFRvdWNoWDsKLSAgICAgICAgICAgIG1ab29tQ2VudGVyWSA9IG1MYXN0VG91Y2hZOwotICAgICAgICAgICAgLy8gZG8gbm90IGNoYW5nZSB0ZXh0IHdyYXAgc2NhbGUgc28gdGhhdCB0aGVyZSBpcyBubyByZWZsb3cKLSAgICAgICAgICAgIHNldE5ld1pvb21TY2FsZShtRGVmYXVsdFNjYWxlLCBmYWxzZSwgZmFsc2UpOworICAgICAgICAgICAgbVpvb21NYW5hZ2VyLnNldFpvb21DZW50ZXIobUxhc3RUb3VjaFgsIG1MYXN0VG91Y2hZKTsKKyAgICAgICAgICAgIG1ab29tTWFuYWdlci5zZXRab29tU2NhbGUobVpvb21NYW5hZ2VyLmdldERlZmF1bHRTY2FsZSgpLCBmYWxzZSk7CiAgICAgICAgIH0KICAgICAgICAgaWYgKGlzVGV4dFZpZXcpIHsKICAgICAgICAgICAgIHJlYnVpbGRXZWJUZXh0VmlldygpOwpAQCAtMzg1NSw3ICszODI4LDcgQEAKICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KLSAgICAgICAgLy8gVXNlZCBieSBwbHVnaW5zLgorICAgICAgICAvLyBVc2VkIGJ5IHBsdWdpbnMgYW5kIGNvbnRlbnRFZGl0YWJsZS4KICAgICAgICAgLy8gQWxzbyB1c2VkIGlmIHRoZSBuYXZpZ2F0aW9uIGNhY2hlIGlzIG91dCBvZiBkYXRlLCBhbmQKICAgICAgICAgLy8gZG9lcyBub3QgcmVjb2duaXplIHRoYXQgYSB0ZXh0ZmllbGQgaXMgaW4gZm9jdXMuICBJbiB0aGF0CiAgICAgICAgIC8vIGNhc2UsIHVzZSBXZWJWaWV3IGFzIHRoZSB0YXJnZXRlZCB2aWV3LgpAQCAtMzg2Nyw4ICszODQwLDEwIEBACiAgICAgcHJpdmF0ZSB2b2lkIGhpZGVTb2Z0S2V5Ym9hcmQoKSB7CiAgICAgICAgIElucHV0TWV0aG9kTWFuYWdlciBpbW0gPSAoSW5wdXRNZXRob2RNYW5hZ2VyKQogICAgICAgICAgICAgICAgIGdldENvbnRleHQoKS5nZXRTeXN0ZW1TZXJ2aWNlKENvbnRleHQuSU5QVVRfTUVUSE9EX1NFUlZJQ0UpOwotCi0gICAgICAgIGltbS5oaWRlU29mdElucHV0RnJvbVdpbmRvdyh0aGlzLmdldFdpbmRvd1Rva2VuKCksIDApOworICAgICAgICBpZiAoaW1tLmlzQWN0aXZlKHRoaXMpCisgICAgICAgICAgICAgICAgfHwgKGluRWRpdGluZ01vZGUoKSAmJiBpbW0uaXNBY3RpdmUobVdlYlRleHRWaWV3KSkpIHsKKyAgICAgICAgICAgIGltbS5oaWRlU29mdElucHV0RnJvbVdpbmRvdyh0aGlzLmdldFdpbmRvd1Rva2VuKCksIDApOworICAgICAgICB9CiAgICAgfQogCiAgICAgLyoKQEAgLTM5NDYsNiArMzkyMSwxNSBAQAogICAgIH0KIAogICAgIC8qKgorICAgICAqIFRlbGwgd2Via2l0IHRvIHB1dCB0aGUgY3Vyc29yIG9uIHNjcmVlbi4KKyAgICAgKi8KKyAgICAvKiBwYWNrYWdlICovIHZvaWQgcmV2ZWFsU2VsZWN0aW9uKCkgeworICAgICAgICBpZiAobVdlYlZpZXdDb3JlICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1XZWJWaWV3Q29yZS5zZW5kTWVzc2FnZShFdmVudEh1Yi5SRVZFQUxfU0VMRUNUSU9OKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgogICAgICAqIENhbGxlZCBieSBXZWJUZXh0VmlldyB0byBmaW5kIHNhdmVkIGZvcm0gZGF0YSBhc3NvY2lhdGVkIHdpdGggdGhlCiAgICAgICogdGV4dGZpZWxkCiAgICAgICogQHBhcmFtIG5hbWUgTmFtZSBvZiB0aGUgdGV4dGZpZWxkLgpAQCAtNDAzMiw2ICs0MDE2LDI2IEBACiAgICAgfQogCiAgICAgLyoqCisgICAgICogQ2FsbGVkIGJ5IERSVCBvbiBVSSB0aHJlYWQsIG5lZWQgdG8gcHJveHkgdG8gV2ViQ29yZSB0aHJlYWQuCisgICAgICoKKyAgICAgKiBAaGlkZSBkZWJ1ZyBvbmx5CisgICAgICovCisgICAgcHVibGljIHZvaWQgdXNlTW9ja0RldmljZU9yaWVudGF0aW9uKCkgeworICAgICAgICBtV2ViVmlld0NvcmUuc2VuZE1lc3NhZ2UoRXZlbnRIdWIuVVNFX01PQ0tfREVWSUNFX09SSUVOVEFUSU9OKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDYWxsZWQgYnkgRFJUIG9uIFdlYkNvcmUgdGhyZWFkLgorICAgICAqCisgICAgICogQGhpZGUgZGVidWcgb25seQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldE1vY2tEZXZpY2VPcmllbnRhdGlvbihib29sZWFuIGNhblByb3ZpZGVBbHBoYSwgZG91YmxlIGFscGhhLAorICAgICAgICAgICAgYm9vbGVhbiBjYW5Qcm92aWRlQmV0YSwgZG91YmxlIGJldGEsIGJvb2xlYW4gY2FuUHJvdmlkZUdhbW1hLCBkb3VibGUgZ2FtbWEpIHsKKyAgICAgICAgbVdlYlZpZXdDb3JlLnNldE1vY2tEZXZpY2VPcmllbnRhdGlvbihjYW5Qcm92aWRlQWxwaGEsIGFscGhhLCBjYW5Qcm92aWRlQmV0YSwgYmV0YSwKKyAgICAgICAgICAgICAgICBjYW5Qcm92aWRlR2FtbWEsIGdhbW1hKTsKKyAgICB9CisKKyAgICAvKioKICAgICAgKiBEdW1wIHRoZSBWOCBjb3VudGVycyB0byBzdGFuZGFyZCBvdXRwdXQuCiAgICAgICogTm90ZSB0aGF0IHlvdSBuZWVkIGEgYnVpbGQgd2l0aCBWOCBhbmQgV0VCQ09SRV9JTlNUUlVNRU5UQVRJT04gc2V0IHRvCiAgICAgICogdHJ1ZS4gT3RoZXJ3aXNlLCB0aGlzIHdpbGwgZG8gbm90aGluZy4KQEAgLTQwODIsMTQgKzQwODYsMTYgQEAKICAgICAgICAgLy8gQnViYmxlIHVwIHRoZSBrZXkgZXZlbnQgaWYKICAgICAgICAgLy8gMS4gaXQgaXMgYSBzeXN0ZW0ga2V5OyBvcgogICAgICAgICAvLyAyLiB0aGUgaG9zdCBhcHBsaWNhdGlvbiB3YW50cyB0byBoYW5kbGUgaXQ7CisgICAgICAgIC8vIDMuIHRoZSBhY2Nlc3NpYmlsaXR5IGluamVjdG9yIGlzIHByZXNlbnQgYW5kIHdhbnRzIHRvIGhhbmRsZSBpdDsKICAgICAgICAgaWYgKGV2ZW50LmlzU3lzdGVtKCkKLSAgICAgICAgICAgICAgICB8fCBtQ2FsbGJhY2tQcm94eS51aU92ZXJyaWRlS2V5RXZlbnQoZXZlbnQpKSB7CisgICAgICAgICAgICAgICAgfHwgbUNhbGxiYWNrUHJveHkudWlPdmVycmlkZUtleUV2ZW50KGV2ZW50KQorICAgICAgICAgICAgICAgIHx8IChtQWNjZXNzaWJpbGl0eUluamVjdG9yICE9IG51bGwgJiYgbUFjY2Vzc2liaWxpdHlJbmplY3Rvci5vbktleUV2ZW50KGV2ZW50KSkpIHsKICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfQogCiAgICAgICAgIGlmIChrZXlDb2RlID09IEtleUV2ZW50LktFWUNPREVfU0hJRlRfTEVGVAogICAgICAgICAgICAgICAgIHx8IGtleUNvZGUgPT0gS2V5RXZlbnQuS0VZQ09ERV9TSElGVF9SSUdIVCkgewotICAgICAgICAgICAgaWYgKG5hdGl2ZUZvY3VzSXNQbHVnaW4oKSkgeworICAgICAgICAgICAgaWYgKHBhZ2VTaG91bGRIYW5kbGVTaGlmdEFuZEFycm93cygpKSB7CiAgICAgICAgICAgICAgICAgbVNoaWZ0SXNQcmVzc2VkID0gdHJ1ZTsKICAgICAgICAgICAgIH0gZWxzZSBpZiAoIW5hdGl2ZUN1cnNvcldhbnRzS2V5RXZlbnRzKCkgJiYgIW1TZWxlY3RpbmdUZXh0KSB7CiAgICAgICAgICAgICAgICAgc2V0VXBTZWxlY3QoKTsKQEAgLTQxMDksOCArNDExNSw4IEBACiAgICAgICAgIGlmIChrZXlDb2RlID49IEtleUV2ZW50LktFWUNPREVfRFBBRF9VUAogICAgICAgICAgICAgICAgICYmIGtleUNvZGUgPD0gS2V5RXZlbnQuS0VZQ09ERV9EUEFEX1JJR0hUKSB7CiAgICAgICAgICAgICBzd2l0Y2hPdXREcmF3SGlzdG9yeSgpOwotICAgICAgICAgICAgaWYgKG5hdGl2ZUZvY3VzSXNQbHVnaW4oKSkgewotICAgICAgICAgICAgICAgIGxldFBsdWdpbkhhbmRsZU5hdktleShrZXlDb2RlLCBldmVudC5nZXRFdmVudFRpbWUoKSwgdHJ1ZSk7CisgICAgICAgICAgICBpZiAocGFnZVNob3VsZEhhbmRsZVNoaWZ0QW5kQXJyb3dzKCkpIHsKKyAgICAgICAgICAgICAgICBsZXRQYWdlSGFuZGxlTmF2S2V5KGtleUNvZGUsIGV2ZW50LmdldEV2ZW50VGltZSgpLCB0cnVlKTsKICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmIChtU2VsZWN0aW5nVGV4dCkgewpAQCAtNDIzNCwxMyArNDI0MCwxNiBAQAogICAgICAgICAvLyBCdWJibGUgdXAgdGhlIGtleSBldmVudCBpZgogICAgICAgICAvLyAxLiBpdCBpcyBhIHN5c3RlbSBrZXk7IG9yCiAgICAgICAgIC8vIDIuIHRoZSBob3N0IGFwcGxpY2F0aW9uIHdhbnRzIHRvIGhhbmRsZSBpdDsKLSAgICAgICAgaWYgKGV2ZW50LmlzU3lzdGVtKCkgfHwgbUNhbGxiYWNrUHJveHkudWlPdmVycmlkZUtleUV2ZW50KGV2ZW50KSkgeworICAgICAgICAvLyAzLiB0aGUgYWNjZXNzaWJpbGl0eSBpbmplY3RvciBpcyBwcmVzZW50IGFuZCB3YW50cyB0byBoYW5kbGUgaXQ7CisgICAgICAgIGlmIChldmVudC5pc1N5c3RlbSgpCisgICAgICAgICAgICAgICAgfHwgbUNhbGxiYWNrUHJveHkudWlPdmVycmlkZUtleUV2ZW50KGV2ZW50KQorICAgICAgICAgICAgICAgIHx8IChtQWNjZXNzaWJpbGl0eUluamVjdG9yICE9IG51bGwgJiYgbUFjY2Vzc2liaWxpdHlJbmplY3Rvci5vbktleUV2ZW50KGV2ZW50KSkpIHsKICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfQogCiAgICAgICAgIGlmIChrZXlDb2RlID09IEtleUV2ZW50LktFWUNPREVfU0hJRlRfTEVGVAogICAgICAgICAgICAgICAgIHx8IGtleUNvZGUgPT0gS2V5RXZlbnQuS0VZQ09ERV9TSElGVF9SSUdIVCkgewotICAgICAgICAgICAgaWYgKG5hdGl2ZUZvY3VzSXNQbHVnaW4oKSkgeworICAgICAgICAgICAgaWYgKHBhZ2VTaG91bGRIYW5kbGVTaGlmdEFuZEFycm93cygpKSB7CiAgICAgICAgICAgICAgICAgbVNoaWZ0SXNQcmVzc2VkID0gZmFsc2U7CiAgICAgICAgICAgICB9IGVsc2UgaWYgKGNvcHlTZWxlY3Rpb24oKSkgewogICAgICAgICAgICAgICAgIHNlbGVjdGlvbkRvbmUoKTsKQEAgLTQyNTAsOCArNDI1OSw4IEBACiAKICAgICAgICAgaWYgKGtleUNvZGUgPj0gS2V5RXZlbnQuS0VZQ09ERV9EUEFEX1VQCiAgICAgICAgICAgICAgICAgJiYga2V5Q29kZSA8PSBLZXlFdmVudC5LRVlDT0RFX0RQQURfUklHSFQpIHsKLSAgICAgICAgICAgIGlmIChuYXRpdmVGb2N1c0lzUGx1Z2luKCkpIHsKLSAgICAgICAgICAgICAgICBsZXRQbHVnaW5IYW5kbGVOYXZLZXkoa2V5Q29kZSwgZXZlbnQuZ2V0RXZlbnRUaW1lKCksIGZhbHNlKTsKKyAgICAgICAgICAgIGlmIChwYWdlU2hvdWxkSGFuZGxlU2hpZnRBbmRBcnJvd3MoKSkgeworICAgICAgICAgICAgICAgIGxldFBhZ2VIYW5kbGVOYXZLZXkoa2V5Q29kZSwgZXZlbnQuZ2V0RXZlbnRUaW1lKCksIGZhbHNlKTsKICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIC8vIGFsd2F5cyBoYW5kbGUgdGhlIG5hdmlnYXRpb24ga2V5cyBpbiB0aGUgVUkgdGhyZWFkCkBAIC00Mjk0LDggKzQzMDMsOCBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNsZWFyVGV4dEVudHJ5KHRydWUpOwotICAgICAgICAgICAgbmF0aXZlU2V0Rm9sbG93ZWRMaW5rKHRydWUpOworICAgICAgICAgICAgY2xlYXJUZXh0RW50cnkoKTsKKyAgICAgICAgICAgIG5hdGl2ZVNob3dDdXJzb3JUaW1lZCgpOwogICAgICAgICAgICAgaWYgKCFtQ2FsbGJhY2tQcm94eS51aU92ZXJyaWRlVXJsTG9hZGluZyhuYXRpdmVDdXJzb3JUZXh0KCkpKSB7CiAgICAgICAgICAgICAgICAgbVdlYlZpZXdDb3JlLnNlbmRNZXNzYWdlKEV2ZW50SHViLkNMSUNLLCBkYXRhLm1GcmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgIG5hdGl2ZUN1cnNvck5vZGVQb2ludGVyKCkpOwpAQCAtNDMxNSwxMCArNDMyNCw3IEBACiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAKLSAgICAvKioKLSAgICAgKiBAaGlkZSBwZW5kaW5nIEFQSSBjb3VuY2lsIGFwcHJvdmFsLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFVwU2VsZWN0KCkgeworICAgIHByaXZhdGUgdm9pZCBzZXRVcFNlbGVjdCgpIHsKICAgICAgICAgaWYgKDAgPT0gbU5hdGl2ZUNsYXNzKSByZXR1cm47IC8vIGNsaWVudCBpc24ndCBpbml0aWFsaXplZAogICAgICAgICBpZiAoaW5GdWxsU2NyZWVuTW9kZSgpKSByZXR1cm47CiAgICAgICAgIGlmIChtU2VsZWN0aW5nVGV4dCkgcmV0dXJuOwpAQCAtNDMzOSw2ICs0MzQ1LDE1IEBACiAgICAgICAgICAgICBtU2VsZWN0WSA9IG1TY3JvbGxZICsgZ2V0Vmlld0hlaWdodFdpdGhUaXRsZSgpIC8gMjsKICAgICAgICAgfQogICAgICAgICBuYXRpdmVIaWRlQ3Vyc29yKCk7CisgICAgICAgIG1TZWxlY3RDYWxsYmFjayA9IG5ldyBTZWxlY3RBY3Rpb25Nb2RlQ2FsbGJhY2soKTsKKyAgICAgICAgbVNlbGVjdENhbGxiYWNrLnNldFdlYlZpZXcodGhpcyk7CisgICAgICAgIFZpZXcgdGl0bGVCYXIgPSBtVGl0bGVCYXI7CisgICAgICAgIC8vIFdlIGRvIG5vdCB3YW50IHRvIHNob3cgdGhlIGVtYmVkZGVkIHRpdGxlIGJhciBkdXJpbmcgZmluZCBvcgorICAgICAgICAvLyBzZWxlY3QsIGJ1dCBrZWVwIHRyYWNrIG9mIGl0IHNvIHRoYXQgaXQgY2FuIGJlIHJlcGxhY2VkIHdoZW4gdGhlCisgICAgICAgIC8vIG1vZGUgaXMgZXhpdGVkLgorICAgICAgICBzZXRFbWJlZGRlZFRpdGxlQmFyKG51bGwpOworICAgICAgICBtU2VsZWN0Q2FsbGJhY2suc2V0VGl0bGVCYXIodGl0bGVCYXIpOworICAgICAgICBzdGFydEFjdGlvbk1vZGUobVNlbGVjdENhbGxiYWNrKTsKICAgICB9CiAKICAgICAvKioKQEAgLTQzNTAsOSArNDM2NSw5IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQGhpZGUgcGVuZGluZyBBUEkgY291bmNpbCBhcHByb3ZhbC4KKyAgICAgKiBTZWxlY3QgYWxsIG9mIHRoZSB0ZXh0IGluIHRoaXMgV2ViVmlldy4KICAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZWxlY3RBbGwoKSB7CisgICAgdm9pZCBzZWxlY3RBbGwoKSB7CiAgICAgICAgIGlmICgwID09IG1OYXRpdmVDbGFzcykgcmV0dXJuOyAvLyBjbGllbnQgaXNuJ3QgaW5pdGlhbGl6ZWQKICAgICAgICAgaWYgKGluRnVsbFNjcmVlbk1vZGUoKSkgcmV0dXJuOwogICAgICAgICBpZiAoIW1TZWxlY3RpbmdUZXh0KSBzZXRVcFNlbGVjdCgpOwpAQCAtNDM2MywzNiArNDM3OCwyNCBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEBoaWRlIHBlbmRpbmcgQVBJIGNvdW5jaWwgYXBwcm92YWwuCisgICAgICogQ2FsbGVkIHdoZW4gdGhlIHNlbGVjdGlvbiBoYXMgYmVlbiByZW1vdmVkLgogICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIHNlbGVjdERpYWxvZ0lzVXAoKSB7Ci0gICAgICAgIHJldHVybiBtU2VsZWN0aW5nVGV4dDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAaGlkZSBwZW5kaW5nIEFQSSBjb3VuY2lsIGFwcHJvdmFsLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIG5vdGlmeVNlbGVjdERpYWxvZ0Rpc21pc3NlZCgpIHsKLSAgICAgICAgbVNlbGVjdGluZ1RleHQgPSBmYWxzZTsKLSAgICAgICAgV2ViVmlld0NvcmUucmVzdW1lVXBkYXRlUGljdHVyZShtV2ViVmlld0NvcmUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBoaWRlIHBlbmRpbmcgQVBJIGNvdW5jaWwgYXBwcm92YWwuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2VsZWN0aW9uRG9uZSgpIHsKKyAgICB2b2lkIHNlbGVjdGlvbkRvbmUoKSB7CiAgICAgICAgIGlmIChtU2VsZWN0aW5nVGV4dCkgewotICAgICAgICAgICAgV2ViQ2hyb21lQ2xpZW50IGNsaWVudCA9IGdldFdlYkNocm9tZUNsaWVudCgpOwotICAgICAgICAgICAgaWYgKGNsaWVudCAhPSBudWxsKSBjbGllbnQub25TZWxlY3Rpb25Eb25lKHRoaXMpOworICAgICAgICAgICAgbVNlbGVjdGluZ1RleHQgPSBmYWxzZTsKKyAgICAgICAgICAgIC8vIGZpbmlzaCBpcyBpZGVtcG90ZW50LCBzbyB0aGlzIGlzIGZpbmUgZXZlbiBpZiBzZWxlY3Rpb25Eb25lIHdhcworICAgICAgICAgICAgLy8gY2FsbGVkIGJ5IG1TZWxlY3RDYWxsYmFjay5vbkRlc3Ryb3lBY3Rpb25Nb2RlCisgICAgICAgICAgICBtU2VsZWN0Q2FsbGJhY2suZmluaXNoKCk7CisgICAgICAgICAgICBtU2VsZWN0Q2FsbGJhY2sgPSBudWxsOworICAgICAgICAgICAgV2ViVmlld0NvcmUucmVzdW1lVXBkYXRlUGljdHVyZShtV2ViVmlld0NvcmUpOwogICAgICAgICAgICAgaW52YWxpZGF0ZSgpOyAvLyByZWRyYXcgd2l0aG91dCBzZWxlY3Rpb24KLSAgICAgICAgICAgIG5vdGlmeVNlbGVjdERpYWxvZ0Rpc21pc3NlZCgpOwogICAgICAgICB9CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQGhpZGUgcGVuZGluZyBBUEkgY291bmNpbCBhcHByb3ZhbC4KKyAgICAgKiBDb3B5IHRoZSBzZWxlY3Rpb24gdG8gdGhlIGNsaXBib2FyZAogICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGNvcHlTZWxlY3Rpb24oKSB7CisgICAgYm9vbGVhbiBjb3B5U2VsZWN0aW9uKCkgewogICAgICAgICBib29sZWFuIGNvcGllZFNvbWV0aGluZyA9IGZhbHNlOwogICAgICAgICBTdHJpbmcgc2VsZWN0aW9uID0gZ2V0U2VsZWN0aW9uKCk7CiAgICAgICAgIGlmIChzZWxlY3Rpb24gIT0gIiIpIHsKQEAgLTQ0MDMsMjIgKzQ0MDYsMTggQEAKICAgICAgICAgICAgICAgICAgICAgLCBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0cmluZy50ZXh0X2NvcGllZAogICAgICAgICAgICAgICAgICAgICAsIFRvYXN0LkxFTkdUSF9TSE9SVCkuc2hvdygpOwogICAgICAgICAgICAgY29waWVkU29tZXRoaW5nID0gdHJ1ZTsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgSUNsaXBib2FyZCBjbGlwID0gSUNsaXBib2FyZC5TdHViLmFzSW50ZXJmYWNlKAotICAgICAgICAgICAgICAgICAgICAgICAgU2VydmljZU1hbmFnZXIuZ2V0U2VydmljZSgiY2xpcGJvYXJkIikpOwotICAgICAgICAgICAgICAgIGNsaXAuc2V0Q2xpcGJvYXJkVGV4dChzZWxlY3Rpb24pOwotICAgICAgICAgICAgfSBjYXRjaCAoYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIExvZy5lKExPR1RBRywgIkNsaXBib2FyZCBmYWlsZWQiLCBlKTsKLSAgICAgICAgICAgIH0KKyAgICAgICAgICAgIENsaXBib2FyZE1hbmFnZXIgY20gPSAoQ2xpcGJvYXJkTWFuYWdlcilnZXRDb250ZXh0KCkKKyAgICAgICAgICAgICAgICAgICAgLmdldFN5c3RlbVNlcnZpY2UoQ29udGV4dC5DTElQQk9BUkRfU0VSVklDRSk7CisgICAgICAgICAgICBjbS5zZXRUZXh0KHNlbGVjdGlvbik7CiAgICAgICAgIH0KICAgICAgICAgaW52YWxpZGF0ZSgpOyAvLyByZW1vdmUgc2VsZWN0aW9uIHJlZ2lvbiBhbmQgcG9pbnRlcgogICAgICAgICByZXR1cm4gY29waWVkU29tZXRoaW5nOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIEBoaWRlIHBlbmRpbmcgQVBJIGNvdW5jaWwgYXBwcm92YWwuCisgICAgICogUmV0dXJucyB0aGUgY3VycmVudGx5IGhpZ2hsaWdodGVkIHRleHQgYXMgYSBzdHJpbmcuCiAgICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRTZWxlY3Rpb24oKSB7CisgICAgU3RyaW5nIGdldFNlbGVjdGlvbigpIHsKICAgICAgICAgaWYgKG1OYXRpdmVDbGFzcyA9PSAwKSByZXR1cm4gIiI7CiAgICAgICAgIHJldHVybiBuYXRpdmVHZXRTZWxlY3Rpb24oKTsKICAgICB9CkBAIC00NDMxLDEyICs0NDMwLDIyIEBACiAKICAgICBAT3ZlcnJpZGUKICAgICBwcm90ZWN0ZWQgdm9pZCBvbkRldGFjaGVkRnJvbVdpbmRvdygpIHsKLSAgICAgICAgY2xlYXJUZXh0RW50cnkoZmFsc2UpOwotICAgICAgICBkaXNtaXNzWm9vbUNvbnRyb2woKTsKKyAgICAgICAgY2xlYXJIZWxwZXJzKCk7CisgICAgICAgIG1ab29tTWFuYWdlci5kaXNtaXNzWm9vbVBpY2tlcigpOwogICAgICAgICBpZiAoaGFzV2luZG93Rm9jdXMoKSkgc2V0QWN0aXZlKGZhbHNlKTsKICAgICAgICAgc3VwZXIub25EZXRhY2hlZEZyb21XaW5kb3coKTsKICAgICB9CiAKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvblZpc2liaWxpdHlDaGFuZ2VkKFZpZXcgY2hhbmdlZFZpZXcsIGludCB2aXNpYmlsaXR5KSB7CisgICAgICAgIHN1cGVyLm9uVmlzaWJpbGl0eUNoYW5nZWQoY2hhbmdlZFZpZXcsIHZpc2liaWxpdHkpOworICAgICAgICAvLyBUaGUgem9vbU1hbmFnZXIgbWF5IGJlIG51bGwgaWYgdGhlIHdlYnZpZXcgaXMgY3JlYXRlZCBmcm9tIFhNTCB0aGF0CisgICAgICAgIC8vIHNwZWNpZmllcyB0aGUgdmlldydzIHZpc2liaWxpdHkgcGFyYW0gYXMgbm90IHZpc2libGUgKHNlZSBodHRwOi8vYi8yNzk0ODQxKQorICAgICAgICBpZiAodmlzaWJpbGl0eSAhPSBWaWV3LlZJU0lCTEUgJiYgbVpvb21NYW5hZ2VyICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1ab29tTWFuYWdlci5kaXNtaXNzWm9vbVBpY2tlcigpOworICAgICAgICB9CisgICAgfQorCiAgICAgLyoqCiAgICAgICogQGRlcHJlY2F0ZWQgV2ViVmlldyBubyBsb25nZXIgbmVlZHMgdG8gaW1wbGVtZW50CiAgICAgICogVmlld0dyb3VwLk9uSGllcmFyY2h5Q2hhbmdlTGlzdGVuZXIuICBUaGlzIG1ldGhvZCBkb2VzIG5vdGhpbmcgbm93LgpAQCAtNDQ2NiwzMiArNDQ3NSwzMCBAQAogICAgICAgICAgICAgICAgIC8vIElmIG91ciB3aW5kb3cgcmVnYWluZWQgZm9jdXMsIGFuZCB3ZSBoYXZlIGZvY3VzLCB0aGVuIGJlZ2luCiAgICAgICAgICAgICAgICAgLy8gZHJhd2luZyB0aGUgY3Vyc29yIHJpbmcKICAgICAgICAgICAgICAgICBtRHJhd0N1cnNvclJpbmcgPSB0cnVlOworICAgICAgICAgICAgICAgIHNldEZvY3VzQ29udHJvbGxlckFjdGl2ZSh0cnVlKTsKICAgICAgICAgICAgICAgICBpZiAobU5hdGl2ZUNsYXNzICE9IDApIHsKICAgICAgICAgICAgICAgICAgICAgbmF0aXZlUmVjb3JkQnV0dG9ucyh0cnVlLCBmYWxzZSwgdHJ1ZSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChpbkVkaXRpbmdNb2RlKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1XZWJWaWV3Q29yZS5zZW5kTWVzc2FnZShFdmVudEh1Yi5TRVRfQUNUSVZFLCAxLCAwKTsKLSAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgLy8gSWYgb3VyIHdpbmRvdyBnYWluZWQgZm9jdXMsIGJ1dCB3ZSBkbyBub3QgaGF2ZSBpdCwgZG8gbm90Ci0gICAgICAgICAgICAgICAgLy8gZHJhdyB0aGUgY3Vyc29yIHJpbmcuCi0gICAgICAgICAgICAgICAgbURyYXdDdXJzb3JSaW5nID0gZmFsc2U7CisgICAgICAgICAgICAgICAgaWYgKCFpbkVkaXRpbmdNb2RlKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gSWYgb3VyIHdpbmRvdyBnYWluZWQgZm9jdXMsIGJ1dCB3ZSBkbyBub3QgaGF2ZSBpdCwgZG8gbm90CisgICAgICAgICAgICAgICAgICAgIC8vIGRyYXcgdGhlIGN1cnNvciByaW5nLgorICAgICAgICAgICAgICAgICAgICBtRHJhd0N1cnNvclJpbmcgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgc2V0Rm9jdXNDb250cm9sbGVyQWN0aXZlKGZhbHNlKTsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgLy8gV2UgZG8gbm90IGNhbGwgbmF0aXZlUmVjb3JkQnV0dG9ucyBoZXJlIGJlY2F1c2Ugd2UgYXNzdW1lCiAgICAgICAgICAgICAgICAgLy8gdGhhdCB3aGVuIHdlIGxvc3QgZm9jdXMsIG9yIHdpbmRvdyBmb2N1cywgaXQgZ290IGNhbGxlZCB3aXRoCiAgICAgICAgICAgICAgICAgLy8gZmFsc2UgZm9yIHRoZSBmaXJzdCBwYXJhbWV0ZXIKICAgICAgICAgICAgIH0KICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGlmIChtV2ViVmlld0NvcmUgIT0gbnVsbCAmJiBnZXRTZXR0aW5ncygpLmdldEJ1aWx0SW5ab29tQ29udHJvbHMoKQotICAgICAgICAgICAgICAgICAgICAmJiAobVpvb21CdXR0b25zQ29udHJvbGxlciA9PSBudWxsIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIW1ab29tQnV0dG9uc0NvbnRyb2xsZXIuaXNWaXNpYmxlKCkpKSB7CisgICAgICAgICAgICBpZiAoIW1ab29tTWFuYWdlci5pc1pvb21QaWNrZXJWaXNpYmxlKCkpIHsKICAgICAgICAgICAgICAgICAvKgotICAgICAgICAgICAgICAgICAqIFRoZSB6b29tIGNvbnRyb2xzIGNvbWUgaW4gdGhlaXIgb3duIHdpbmRvdywgc28gb3VyIHdpbmRvdwotICAgICAgICAgICAgICAgICAqIGxvc2VzIGZvY3VzLiBPdXIgcG9saWN5IGlzIHRvIG5vdCBkcmF3IHRoZSBjdXJzb3IgcmluZyBpZgotICAgICAgICAgICAgICAgICAqIG91ciB3aW5kb3cgaXMgbm90IGZvY3VzZWQsIGJ1dCB0aGlzIGlzIGFuIGV4Y2VwdGlvbiBzaW5jZQorICAgICAgICAgICAgICAgICAqIFRoZSBleHRlcm5hbCB6b29tIGNvbnRyb2xzIGNvbWUgaW4gdGhlaXIgb3duIHdpbmRvdywgc28gb3VyCisgICAgICAgICAgICAgICAgICogd2luZG93IGxvc2VzIGZvY3VzLiBPdXIgcG9saWN5IGlzIHRvIG5vdCBkcmF3IHRoZSBjdXJzb3IgcmluZworICAgICAgICAgICAgICAgICAqIGlmIG91ciB3aW5kb3cgaXMgbm90IGZvY3VzZWQsIGJ1dCB0aGlzIGlzIGFuIGV4Y2VwdGlvbiBzaW5jZQogICAgICAgICAgICAgICAgICAqIHRoZSB1c2VyIGNhbiBzdGlsbCBuYXZpZ2F0ZSB0aGUgd2ViIHBhZ2Ugd2l0aCB0aGUgem9vbQogICAgICAgICAgICAgICAgICAqIGNvbnRyb2xzIHNob3dpbmcuCiAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgLy8gSWYgb3VyIHdpbmRvdyBoYXMgbG9zdCBmb2N1cywgc3RvcCBkcmF3aW5nIHRoZSBjdXJzb3IgcmluZwogICAgICAgICAgICAgICAgIG1EcmF3Q3Vyc29yUmluZyA9IGZhbHNlOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgbUdvdEtleURvd24gPSBmYWxzZTsKQEAgLTQ1MDEsNyArNDUwOCw3IEBACiAgICAgICAgICAgICBpZiAobU5hdGl2ZUNsYXNzICE9IDApIHsKICAgICAgICAgICAgICAgICBuYXRpdmVSZWNvcmRCdXR0b25zKGZhbHNlLCBmYWxzZSwgdHJ1ZSk7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBzZXRGb2N1c0NvbnRyb2xsZXJJbmFjdGl2ZSgpOworICAgICAgICAgICAgc2V0Rm9jdXNDb250cm9sbGVyQWN0aXZlKGZhbHNlKTsKICAgICAgICAgfQogICAgICAgICBpbnZhbGlkYXRlKCk7CiAgICAgfQpAQCAtNDUyNSwxMSArNDUzMiw5IEBACiAgICAgICogbm90IGRyYXcgdGhlIGJsaW5raW5nIGN1cnNvci4gIEl0IGdldHMgc2V0IHRvICJhY3RpdmUiIHRvIGRyYXcgdGhlIGN1cnNvcgogICAgICAqIGluIFdlYlZpZXdDb3JlLmNwcCwgd2hlbiB0aGUgV2ViQ29yZSB0aHJlYWQgcmVjZWl2ZXMga2V5IGV2ZW50cy9jbGlja3MuCiAgICAgICovCi0gICAgLyogcGFja2FnZSAqLyB2b2lkIHNldEZvY3VzQ29udHJvbGxlckluYWN0aXZlKCkgewotICAgICAgICAvLyBEbyBub3QgbmVlZCB0byBhbHNvIGNoZWNrIHdoZXRoZXIgbVdlYlZpZXdDb3JlIGlzIG51bGwsIGJlY2F1c2UKLSAgICAgICAgLy8gbU5hdGl2ZUNsYXNzIGlzIG9ubHkgc2V0IGlmIG1XZWJWaWV3Q29yZSBpcyBub24gbnVsbAotICAgICAgICBpZiAobU5hdGl2ZUNsYXNzID09IDApIHJldHVybjsKLSAgICAgICAgbVdlYlZpZXdDb3JlLnNlbmRNZXNzYWdlKEV2ZW50SHViLlNFVF9BQ1RJVkUsIDAsIDApOworICAgIC8qIHBhY2thZ2UgKi8gdm9pZCBzZXRGb2N1c0NvbnRyb2xsZXJBY3RpdmUoYm9vbGVhbiBhY3RpdmUpIHsKKyAgICAgICAgaWYgKG1XZWJWaWV3Q29yZSA9PSBudWxsKSByZXR1cm47CisgICAgICAgIG1XZWJWaWV3Q29yZS5zZW5kTWVzc2FnZShFdmVudEh1Yi5TRVRfQUNUSVZFLCBhY3RpdmUgPyAxIDogMCwgMCk7CiAgICAgfQogCiAgICAgQE92ZXJyaWRlCkBAIC00NTQ2LDYgKzQ1NTEsNyBAQAogICAgICAgICAgICAgICAgIGlmIChtTmF0aXZlQ2xhc3MgIT0gMCkgewogICAgICAgICAgICAgICAgICAgICBuYXRpdmVSZWNvcmRCdXR0b25zKHRydWUsIGZhbHNlLCB0cnVlKTsKICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgc2V0Rm9jdXNDb250cm9sbGVyQWN0aXZlKHRydWUpOwogICAgICAgICAgICAgLy99IGVsc2UgewogICAgICAgICAgICAgICAgIC8vIFRoZSBXZWJWaWV3IGhhcyBnYWluZWQgZm9jdXMgd2hpbGUgd2UgZG8gbm90IGhhdmUKICAgICAgICAgICAgICAgICAvLyB3aW5kb3dmb2N1cy4gIFdoZW4gb3VyIHdpbmRvdyBsb3N0IGZvY3VzLCB3ZSBzaG91bGQgaGF2ZQpAQCAtNDU1OSw3ICs0NTY1LDcgQEAKICAgICAgICAgICAgICAgICBpZiAobU5hdGl2ZUNsYXNzICE9IDApIHsKICAgICAgICAgICAgICAgICAgICAgbmF0aXZlUmVjb3JkQnV0dG9ucyhmYWxzZSwgZmFsc2UsIHRydWUpOwogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBzZXRGb2N1c0NvbnRyb2xsZXJJbmFjdGl2ZSgpOworICAgICAgICAgICAgICAgIHNldEZvY3VzQ29udHJvbGxlckFjdGl2ZShmYWxzZSk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBtR290S2V5RG93biA9IGZhbHNlOwogICAgICAgICB9CkBAIC00NTgwLDk0ICs0NTg2LDM1IEBACiAgICAgICAgICAgICAvLyBzeXN0ZW0gd29uJ3QgY2FsbCBvblNpemVDaGFuZ2VkIGlmIHRoZSBkaW1lbnNpb24gaXMgbm90IGNoYW5nZWQuCiAgICAgICAgICAgICAvLyBJbiB0aGlzIGNhc2UsIHdlIG5lZWQgdG8gY2FsbCBzZW5kVmlld1NpemVab29tKCkgZXhwbGljaXRseSB0bwogICAgICAgICAgICAgLy8gbm90aWZ5IHRoZSBXZWJLaXQgYWJvdXQgdGhlIG5ldyBkaW1lbnNpb25zLgotICAgICAgICAgICAgc2VuZFZpZXdTaXplWm9vbSgpOworICAgICAgICAgICAgc2VuZFZpZXdTaXplWm9vbShmYWxzZSk7CiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIGNoYW5nZWQ7CiAgICAgfQogCi0gICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgUG9zdFNjYWxlIGltcGxlbWVudHMgUnVubmFibGUgewotICAgICAgICBmaW5hbCBXZWJWaWV3IG1XZWJWaWV3OwotICAgICAgICBmaW5hbCBib29sZWFuIG1VcGRhdGVUZXh0V3JhcDsKLQotICAgICAgICBwdWJsaWMgUG9zdFNjYWxlKFdlYlZpZXcgd2ViVmlldywgYm9vbGVhbiB1cGRhdGVUZXh0V3JhcCkgewotICAgICAgICAgICAgbVdlYlZpZXcgPSB3ZWJWaWV3OwotICAgICAgICAgICAgbVVwZGF0ZVRleHRXcmFwID0gdXBkYXRlVGV4dFdyYXA7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICAgICAgICBpZiAobVdlYlZpZXcubVdlYlZpZXdDb3JlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAvLyB3ZSBhbHdheXMgZm9yY2UsIGluIGNhc2Ugb3VyIGhlaWdodCBjaGFuZ2VkLCBpbiB3aGljaCBjYXNlIHdlCi0gICAgICAgICAgICAgICAgLy8gc3RpbGwgd2FudCB0byBzZW5kIHRoZSBub3RpZmljYXRpb24gb3ZlciB0byB3ZWJraXQuCi0gICAgICAgICAgICAgICAgbVdlYlZpZXcuc2V0TmV3Wm9vbVNjYWxlKG1XZWJWaWV3Lm1BY3R1YWxTY2FsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIG1VcGRhdGVUZXh0V3JhcCwgdHJ1ZSk7Ci0gICAgICAgICAgICAgICAgLy8gdXBkYXRlIHRoZSB6b29tIGJ1dHRvbnMgYXMgdGhlIHNjYWxlIGNhbiBiZSBjaGFuZ2VkCi0gICAgICAgICAgICAgICAgaWYgKG1XZWJWaWV3LmdldFNldHRpbmdzKCkuZ2V0QnVpbHRJblpvb21Db250cm9scygpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1XZWJWaWV3LnVwZGF0ZVpvb21CdXR0b25zRW5hYmxlZCgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQogICAgIEBPdmVycmlkZQogICAgIHByb3RlY3RlZCB2b2lkIG9uU2l6ZUNoYW5nZWQoaW50IHcsIGludCBoLCBpbnQgb3csIGludCBvaCkgewogICAgICAgICBzdXBlci5vblNpemVDaGFuZ2VkKHcsIGgsIG93LCBvaCk7Ci0gICAgICAgIC8vIENlbnRlciB6b29taW5nIHRvIHRoZSBjZW50ZXIgb2YgdGhlIHNjcmVlbi4KLSAgICAgICAgaWYgKG1ab29tU2NhbGUgPT0gMCkgeyAvLyB1bmxlc3Mgd2UncmUgYWxyZWFkeSB6b29taW5nCi0gICAgICAgICAgICAvLyBUbyBhbmNob3IgYXQgdG9wIGxlZnQgY29ybmVyLgotICAgICAgICAgICAgbVpvb21DZW50ZXJYID0gMDsKLSAgICAgICAgICAgIG1ab29tQ2VudGVyWSA9IGdldFZpc2libGVUaXRsZUhlaWdodCgpOwotICAgICAgICAgICAgbUFuY2hvclggPSB2aWV3VG9Db250ZW50WCgoaW50KSBtWm9vbUNlbnRlclggKyBtU2Nyb2xsWCk7Ci0gICAgICAgICAgICBtQW5jaG9yWSA9IHZpZXdUb0NvbnRlbnRZKChpbnQpIG1ab29tQ2VudGVyWSArIG1TY3JvbGxZKTsKLSAgICAgICAgfQogCiAgICAgICAgIC8vIGFkanVzdCB0aGUgbWF4IHZpZXdwb3J0IHdpZHRoIGRlcGVuZGluZyBvbiB0aGUgdmlldyBkaW1lbnNpb25zLiBUaGlzCiAgICAgICAgIC8vIGlzIHRvIGVuc3VyZSB0aGUgc2NhbGluZyBpcyBub3QgZ29pbmcgaW5zYW5lLiBTbyBkbyBub3Qgc2hyaW5rIGl0IGlmCiAgICAgICAgIC8vIHRoZSB2aWV3IHNpemUgaXMgdGVtcG9yYXJpbHkgc21hbGxlciwgZS5nLiB3aGVuIHNvZnQga2V5Ym9hcmQgaXMgdXAuCi0gICAgICAgIGludCBuZXdNYXhWaWV3cG9ydFdpZHRoID0gKGludCkgKE1hdGgubWF4KHcsIGgpIC8gREVGQVVMVF9NSU5fWk9PTV9TQ0FMRSk7CisgICAgICAgIGludCBuZXdNYXhWaWV3cG9ydFdpZHRoID0gKGludCkgKE1hdGgubWF4KHcsIGgpIC8gbVpvb21NYW5hZ2VyLmdldERlZmF1bHRNaW5ab29tU2NhbGUoKSk7CiAgICAgICAgIGlmIChuZXdNYXhWaWV3cG9ydFdpZHRoID4gc01heFZpZXdwb3J0V2lkdGgpIHsKICAgICAgICAgICAgIHNNYXhWaWV3cG9ydFdpZHRoID0gbmV3TWF4Vmlld3BvcnRXaWR0aDsKICAgICAgICAgfQogCi0gICAgICAgIC8vIHVwZGF0ZSBtTWluWm9vbVNjYWxlIGlmIHRoZSBtaW5pbXVtIHpvb20gc2NhbGUgaXMgbm90IGZpeGVkCi0gICAgICAgIGlmICghbU1pblpvb21TY2FsZUZpeGVkKSB7Ci0gICAgICAgICAgICAvLyB3aGVuIGNoYW5nZSBmcm9tIG5hcnJvdyBzY3JlZW4gdG8gd2lkZSBzY3JlZW4sIHRoZSBuZXcgdmlld1dpZHRoCi0gICAgICAgICAgICAvLyBjYW4gYmUgd2lkZXIgdGhhbiB0aGUgb2xkIGNvbnRlbnQgd2lkdGguIFdlIGxpbWl0IHRoZSBtaW5pbXVtCi0gICAgICAgICAgICAvLyBzY2FsZSB0byAxLjBmLiBUaGUgcHJvcGVyIG1pbmltdW0gc2NhbGUgd2lsbCBiZSBjYWxjdWxhdGVkIHdoZW4KLSAgICAgICAgICAgIC8vIHRoZSBuZXcgcGljdHVyZSBzaG93cyB1cC4KLSAgICAgICAgICAgIG1NaW5ab29tU2NhbGUgPSBNYXRoLm1pbigxLjBmLCAoZmxvYXQpIGdldFZpZXdXaWR0aCgpCi0gICAgICAgICAgICAgICAgICAgIC8gKG1EcmF3SGlzdG9yeSA/IG1IaXN0b3J5UGljdHVyZS5nZXRXaWR0aCgpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBtWm9vbU92ZXJ2aWV3V2lkdGgpKTsKLSAgICAgICAgICAgIGlmIChtSW5pdGlhbFNjYWxlSW5QZXJjZW50ID4gMCkgewotICAgICAgICAgICAgICAgIC8vIGxpbWl0IHRoZSBtaW5ab29tU2NhbGUgdG8gdGhlIGluaXRpYWxTY2FsZSBpZiBpdCBpcyBzZXQKLSAgICAgICAgICAgICAgICBmbG9hdCBpbml0aWFsU2NhbGUgPSBtSW5pdGlhbFNjYWxlSW5QZXJjZW50IC8gMTAwLjBmOwotICAgICAgICAgICAgICAgIGlmIChtTWluWm9vbVNjYWxlID4gaW5pdGlhbFNjYWxlKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1NaW5ab29tU2NhbGUgPSBpbml0aWFsU2NhbGU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgZGlzbWlzc1pvb21Db250cm9sKCk7Ci0KLSAgICAgICAgLy8gb25TaXplQ2hhbmdlZCgpIGlzIGNhbGxlZCBkdXJpbmcgV2ViVmlldyBsYXlvdXQuIEFuZCBhbnkKLSAgICAgICAgLy8gcmVxdWVzdExheW91dCgpIGlzIGJsb2NrZWQgZHVyaW5nIGxheW91dC4gQXMgc2V0TmV3Wm9vbVNjYWxlKCkgd2lsbAotICAgICAgICAvLyBjYWxsIGl0cyBjaGlsZCBWaWV3IHRvIHJlcG9zaXRpb24gaXRzZWxmIHRocm91Z2ggVmlld01hbmFnZXIncwotICAgICAgICAvLyBzY2FsZUFsbCgpLCB3ZSBuZWVkIHRvIHBvc3QgYSBSdW5uYWJsZSB0byBlbnN1cmUgcmVxdWVzdExheW91dCgpLgotICAgICAgICAvLyA8Yi8+Ci0gICAgICAgIC8vIG9ubHkgdXBkYXRlIHRoZSB0ZXh0IHdyYXAgc2NhbGUgaWYgd2lkdGggY2hhbmdlZC4KLSAgICAgICAgcG9zdChuZXcgUG9zdFNjYWxlKHRoaXMsIHcgIT0gb3cpKTsKKyAgICAgICAgbVpvb21NYW5hZ2VyLm9uU2l6ZUNoYW5nZWQodywgaCwgb3csIG9oKTsKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKICAgICBwcm90ZWN0ZWQgdm9pZCBvblNjcm9sbENoYW5nZWQoaW50IGwsIGludCB0LCBpbnQgb2xkbCwgaW50IG9sZHQpIHsKICAgICAgICAgc3VwZXIub25TY3JvbGxDaGFuZ2VkKGwsIHQsIG9sZGwsIG9sZHQpOwotICAgICAgICBpZiAoIW1Jbk92ZXJTY3JvbGxNb2RlKSB7Ci0gICAgICAgICAgICBzZW5kT3VyVmlzaWJsZVJlY3QoKTsKLSAgICAgICAgICAgIC8vIHVwZGF0ZSBXZWJLaXQgaWYgdmlzaWJsZSB0aXRsZSBiYXIgaGVpZ2h0IGNoYW5nZWQuIFRoZSBsb2dpYyBpcyBzYW1lCi0gICAgICAgICAgICAvLyBhcyBnZXRWaXNpYmxlVGl0bGVIZWlnaHQuCi0gICAgICAgICAgICBpbnQgdGl0bGVIZWlnaHQgPSBnZXRUaXRsZUhlaWdodCgpOwotICAgICAgICAgICAgaWYgKE1hdGgubWF4KHRpdGxlSGVpZ2h0IC0gdCwgMCkgIT0gTWF0aC5tYXgodGl0bGVIZWlnaHQgLSBvbGR0LCAwKSkgewotICAgICAgICAgICAgICAgIHNlbmRWaWV3U2l6ZVpvb20oKTsKLSAgICAgICAgICAgIH0KKyAgICAgICAgc2VuZE91clZpc2libGVSZWN0KCk7CisgICAgICAgIC8vIHVwZGF0ZSBXZWJLaXQgaWYgdmlzaWJsZSB0aXRsZSBiYXIgaGVpZ2h0IGNoYW5nZWQuIFRoZSBsb2dpYyBpcyBzYW1lCisgICAgICAgIC8vIGFzIGdldFZpc2libGVUaXRsZUhlaWdodC4KKyAgICAgICAgaW50IHRpdGxlSGVpZ2h0ID0gZ2V0VGl0bGVIZWlnaHQoKTsKKyAgICAgICAgaWYgKE1hdGgubWF4KHRpdGxlSGVpZ2h0IC0gdCwgMCkgIT0gTWF0aC5tYXgodGl0bGVIZWlnaHQgLSBvbGR0LCAwKSkgeworICAgICAgICAgICAgc2VuZFZpZXdTaXplWm9vbShmYWxzZSk7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTQ2NzUsOSArNDYyMiwxMSBAQAogICAgIHB1YmxpYyBib29sZWFuIGRpc3BhdGNoS2V5RXZlbnQoS2V5RXZlbnQgZXZlbnQpIHsKICAgICAgICAgYm9vbGVhbiBkaXNwYXRjaCA9IHRydWU7CiAKLSAgICAgICAgLy8gVGV4dGZpZWxkcyBhbmQgcGx1Z2lucyBuZWVkIHRvIHJlY2VpdmUgdGhlIHNoaWZ0IHVwIGtleSBldmVuIGlmCi0gICAgICAgIC8vIGFub3RoZXIga2V5IHdhcyByZWxlYXNlZCB3aGlsZSB0aGUgc2hpZnQga2V5IHdhcyBoZWxkIGRvd24uCi0gICAgICAgIGlmICghaW5FZGl0aW5nTW9kZSgpICYmIChtTmF0aXZlQ2xhc3MgPT0gMCB8fCAhbmF0aXZlRm9jdXNJc1BsdWdpbigpKSkgeworICAgICAgICAvLyBUZXh0ZmllbGRzLCBwbHVnaW5zLCBhbmQgY29udGVudEVkaXRhYmxlIG5vZGVzIG5lZWQgdG8gcmVjZWl2ZSB0aGUKKyAgICAgICAgLy8gc2hpZnQgdXAga2V5IGV2ZW4gaWYgYW5vdGhlciBrZXkgd2FzIHJlbGVhc2VkIHdoaWxlIHRoZSBzaGlmdCBrZXkKKyAgICAgICAgLy8gd2FzIGhlbGQgZG93bi4KKyAgICAgICAgaWYgKCFpbkVkaXRpbmdNb2RlKCkgJiYgKG1OYXRpdmVDbGFzcyA9PSAwCisgICAgICAgICAgICAgICAgfHwgIW5hdGl2ZVBhZ2VTaG91bGRIYW5kbGVTaGlmdEFuZEFycm93cygpKSkgewogICAgICAgICAgICAgaWYgKGV2ZW50LmdldEFjdGlvbigpID09IEtleUV2ZW50LkFDVElPTl9ET1dOKSB7CiAgICAgICAgICAgICAgICAgbUdvdEtleURvd24gPSB0cnVlOwogICAgICAgICAgICAgfSBlbHNlIHsKQEAgLTQ3MzcsNyArNDY4Niw3IEBACiAgICAgICAgIHB1YmxpYyBEcmFnVHJhY2tlckhhbmRsZXIoZmxvYXQgeCwgZmxvYXQgeSwgRHJhZ1RyYWNrZXIgcHJveHkpIHsKICAgICAgICAgICAgIG1Qcm94eSA9IHByb3h5OwogCi0gICAgICAgICAgICBpbnQgZG9jQm90dG9tID0gY29tcHV0ZVJlYWxWZXJ0aWNhbFNjcm9sbFJhbmdlKCkgKyBnZXRUaXRsZUhlaWdodCgpOworICAgICAgICAgICAgaW50IGRvY0JvdHRvbSA9IGNvbXB1dGVWZXJ0aWNhbFNjcm9sbFJhbmdlKCkgKyBnZXRUaXRsZUhlaWdodCgpOwogICAgICAgICAgICAgaW50IHZpZXdUb3AgPSBnZXRTY3JvbGxZKCk7CiAgICAgICAgICAgICBpbnQgdmlld0JvdHRvbSA9IHZpZXdUb3AgKyBnZXRIZWlnaHQoKTsKIApAQCAtNDc1MCw3ICs0Njk5LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAiIHVwL2Rvd249ICIgKyBtTWluRFkgKyAiICIgKyBtTWF4RFkpOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBpbnQgZG9jUmlnaHQgPSBjb21wdXRlUmVhbEhvcml6b250YWxTY3JvbGxSYW5nZSgpOworICAgICAgICAgICAgaW50IGRvY1JpZ2h0ID0gY29tcHV0ZUhvcml6b250YWxTY3JvbGxSYW5nZSgpOwogICAgICAgICAgICAgaW50IHZpZXdMZWZ0ID0gZ2V0U2Nyb2xsWCgpOwogICAgICAgICAgICAgaW50IHZpZXdSaWdodCA9IHZpZXdMZWZ0ICsgZ2V0V2lkdGgoKTsKICAgICAgICAgICAgIG1TdGFydFggPSB4OwpAQCAtNDkxMSw4MSArNDg2MCw2IEBACiAgICAgcHJpdmF0ZSBEcmFnVHJhY2tlciBtRHJhZ1RyYWNrZXI7CiAgICAgcHJpdmF0ZSBEcmFnVHJhY2tlckhhbmRsZXIgbURyYWdUcmFja2VySGFuZGxlcjsKIAotICAgIHByaXZhdGUgY2xhc3MgU2NhbGVEZXRlY3Rvckxpc3RlbmVyIGltcGxlbWVudHMKLSAgICAgICAgICAgIFNjYWxlR2VzdHVyZURldGVjdG9yLk9uU2NhbGVHZXN0dXJlTGlzdGVuZXIgewotCi0gICAgICAgIHB1YmxpYyBib29sZWFuIG9uU2NhbGVCZWdpbihTY2FsZUdlc3R1cmVEZXRlY3RvciBkZXRlY3RvcikgewotICAgICAgICAgICAgLy8gY2FuY2VsIHRoZSBzaW5nbGUgdG91Y2ggaGFuZGxpbmcKLSAgICAgICAgICAgIGNhbmNlbFRvdWNoKCk7Ci0gICAgICAgICAgICBkaXNtaXNzWm9vbUNvbnRyb2woKTsKLSAgICAgICAgICAgIC8vIHJlc2V0IHRoZSB6b29tIG92ZXJ2aWV3IG1vZGUgc28gdGhhdCB0aGUgcGFnZSB3b24ndCBhdXRvIGdyb3cKLSAgICAgICAgICAgIG1Jblpvb21PdmVydmlldyA9IGZhbHNlOwotICAgICAgICAgICAgLy8gSWYgaXQgaXMgaW4gcGFzc3dvcmQgbW9kZSwgdHVybiBpdCBvZmYgc28gaXQgZG9lcyBub3QgZHJhdwotICAgICAgICAgICAgLy8gbWlzcGxhY2VkLgotICAgICAgICAgICAgaWYgKGluRWRpdGluZ01vZGUoKSAmJiBuYXRpdmVGb2N1c0NhbmRpZGF0ZUlzUGFzc3dvcmQoKSkgewotICAgICAgICAgICAgICAgIG1XZWJUZXh0Vmlldy5zZXRJblBhc3N3b3JkKGZhbHNlKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgbVZpZXdNYW5hZ2VyLnN0YXJ0Wm9vbSgpOwotCi0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uU2NhbGVFbmQoU2NhbGVHZXN0dXJlRGV0ZWN0b3IgZGV0ZWN0b3IpIHsKLSAgICAgICAgICAgIGlmIChtUHJldmlld1pvb21Pbmx5KSB7Ci0gICAgICAgICAgICAgICAgbVByZXZpZXdab29tT25seSA9IGZhbHNlOwotICAgICAgICAgICAgICAgIG1BbmNob3JYID0gdmlld1RvQ29udGVudFgoKGludCkgbVpvb21DZW50ZXJYICsgbVNjcm9sbFgpOwotICAgICAgICAgICAgICAgIG1BbmNob3JZID0gdmlld1RvQ29udGVudFkoKGludCkgbVpvb21DZW50ZXJZICsgbVNjcm9sbFkpOwotICAgICAgICAgICAgICAgIC8vIGRvbid0IHJlZmxvdyB3aGVuIHpvb20gaW47IHdoZW4gem9vbSBvdXQsIGRvIHJlZmxvdyBpZiB0aGUKLSAgICAgICAgICAgICAgICAvLyBuZXcgc2NhbGUgaXMgYWxtb3N0IG1pbmltdW0gc2NhbGU7Ci0gICAgICAgICAgICAgICAgYm9vbGVhbiByZWZsb3dOb3cgPSAobUFjdHVhbFNjYWxlIC0gbU1pblpvb21TY2FsZQotICAgICAgICAgICAgICAgICAgICAgICAgPD0gTUlOSU1VTV9TQ0FMRV9JTkNSRU1FTlQpCi0gICAgICAgICAgICAgICAgICAgICAgICB8fCAoKG1BY3R1YWxTY2FsZSA8PSAwLjggKiBtVGV4dFdyYXBTY2FsZSkpOwotICAgICAgICAgICAgICAgIC8vIGZvcmNlIHpvb20gYWZ0ZXIgbVByZXZpZXdab29tT25seSBpcyBzZXQgdG8gZmFsc2Ugc28gdGhhdCB0aGUKLSAgICAgICAgICAgICAgICAvLyBuZXcgdmlldyBzaXplIHdpbGwgYmUgcGFzc2VkIHRvIHRoZSBXZWJLaXQKLSAgICAgICAgICAgICAgICBzZXROZXdab29tU2NhbGUobUFjdHVhbFNjYWxlLCByZWZsb3dOb3csIHRydWUpOwotICAgICAgICAgICAgICAgIC8vIGNhbGwgaW52YWxpZGF0ZSgpIHRvIGRyYXcgd2l0aG91dCB6b29tIGZpbHRlcgotICAgICAgICAgICAgICAgIGludmFsaWRhdGUoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIGFkanVzdCB0aGUgZWRpdCB0ZXh0IHZpZXcgaWYgbmVlZGVkCi0gICAgICAgICAgICBpZiAoaW5FZGl0aW5nTW9kZSgpICYmIGRpZFVwZGF0ZVRleHRWaWV3Qm91bmRzKGZhbHNlKQotICAgICAgICAgICAgICAgICAgICAmJiBuYXRpdmVGb2N1c0NhbmRpZGF0ZUlzUGFzc3dvcmQoKSkgewotICAgICAgICAgICAgICAgIC8vIElmIGl0IGlzIGEgcGFzc3dvcmQgZmllbGQsIHN0YXJ0IGRyYXdpbmcgdGhlCi0gICAgICAgICAgICAgICAgLy8gV2ViVGV4dFZpZXcgb25jZSBhZ2Fpbi4KLSAgICAgICAgICAgICAgICBtV2ViVGV4dFZpZXcuc2V0SW5QYXNzd29yZCh0cnVlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIHN0YXJ0IGEgZHJhZywgVE9VQ0hfUElOQ0hfRFJBRywgY2FuJ3QgdXNlIFRPVUNIX0lOSVRfTU9ERSBhcyBpdAotICAgICAgICAgICAgLy8gbWF5IHRyaWdnZXIgdGhlIHVud2FudGVkIGNsaWNrLCBjYW4ndCB1c2UgVE9VQ0hfRFJBR19NT0RFIGFzIGl0Ci0gICAgICAgICAgICAvLyBtYXkgdHJpZ2dlciB0aGUgdW53YW50ZWQgZmxpbmcuCi0gICAgICAgICAgICBtVG91Y2hNb2RlID0gVE9VQ0hfUElOQ0hfRFJBRzsKLSAgICAgICAgICAgIG1Db25maXJtTW92ZSA9IHRydWU7Ci0gICAgICAgICAgICBzdGFydFRvdWNoKGRldGVjdG9yLmdldEZvY3VzWCgpLCBkZXRlY3Rvci5nZXRGb2N1c1koKSwKLSAgICAgICAgICAgICAgICAgICAgbUxhc3RUb3VjaFRpbWUpOwotCi0gICAgICAgICAgICBtVmlld01hbmFnZXIuZW5kWm9vbSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGJvb2xlYW4gb25TY2FsZShTY2FsZUdlc3R1cmVEZXRlY3RvciBkZXRlY3RvcikgewotICAgICAgICAgICAgZmxvYXQgc2NhbGUgPSAoZmxvYXQpIChNYXRoLnJvdW5kKGRldGVjdG9yLmdldFNjYWxlRmFjdG9yKCkKLSAgICAgICAgICAgICAgICAgICAgKiBtQWN0dWFsU2NhbGUgKiAxMDApIC8gMTAwLjApOwotICAgICAgICAgICAgaWYgKE1hdGguYWJzKHNjYWxlIC0gbUFjdHVhbFNjYWxlKSA+PSBNSU5JTVVNX1NDQUxFX0lOQ1JFTUVOVCkgewotICAgICAgICAgICAgICAgIG1QcmV2aWV3Wm9vbU9ubHkgPSB0cnVlOwotICAgICAgICAgICAgICAgIC8vIGxpbWl0IHRoZSBzY2FsZSBjaGFuZ2UgcGVyIHN0ZXAKLSAgICAgICAgICAgICAgICBpZiAoc2NhbGUgPiBtQWN0dWFsU2NhbGUpIHsKLSAgICAgICAgICAgICAgICAgICAgc2NhbGUgPSBNYXRoLm1pbihzY2FsZSwgbUFjdHVhbFNjYWxlICogMS4yNWYpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHNjYWxlID0gTWF0aC5tYXgoc2NhbGUsIG1BY3R1YWxTY2FsZSAqIDAuOGYpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBtWm9vbUNlbnRlclggPSBkZXRlY3Rvci5nZXRGb2N1c1goKTsKLSAgICAgICAgICAgICAgICBtWm9vbUNlbnRlclkgPSBkZXRlY3Rvci5nZXRGb2N1c1koKTsKLSAgICAgICAgICAgICAgICBzZXROZXdab29tU2NhbGUoc2NhbGUsIGZhbHNlLCBmYWxzZSk7Ci0gICAgICAgICAgICAgICAgaW52YWxpZGF0ZSgpOwotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgfQotCiAgICAgcHJpdmF0ZSBib29sZWFuIGhpdEZvY3VzZWRQbHVnaW4oaW50IGNvbnRlbnRYLCBpbnQgY29udGVudFkpIHsKICAgICAgICAgaWYgKERlYnVnRmxhZ3MuV0VCX1ZJRVcpIHsKICAgICAgICAgICAgIExvZy52KExPR1RBRywgIm5hdGl2ZUZvY3VzSXNQbHVnaW4oKT0iICsgbmF0aXZlRm9jdXNJc1BsdWdpbigpKTsKQEAgLTUwMDcsNiArNDg4MSw0MSBAQAogICAgICAgICByZXR1cm4gbUZ1bGxTY3JlZW5Ib2xkZXIgIT0gbnVsbDsKICAgICB9CiAKKyAgICB2b2lkIG9uUGluY2hUb1pvb21BbmltYXRpb25TdGFydCgpIHsKKyAgICAgICAgLy8gY2FuY2VsIHRoZSBzaW5nbGUgdG91Y2ggaGFuZGxpbmcKKyAgICAgICAgY2FuY2VsVG91Y2goKTsKKyAgICAgICAgb25ab29tQW5pbWF0aW9uU3RhcnQoKTsKKyAgICB9CisKKyAgICB2b2lkIG9uUGluY2hUb1pvb21BbmltYXRpb25FbmQoU2NhbGVHZXN0dXJlRGV0ZWN0b3IgZGV0ZWN0b3IpIHsKKyAgICAgICAgb25ab29tQW5pbWF0aW9uRW5kKCk7CisgICAgICAgIC8vIHN0YXJ0IGEgZHJhZywgVE9VQ0hfUElOQ0hfRFJBRywgY2FuJ3QgdXNlIFRPVUNIX0lOSVRfTU9ERSBhcworICAgICAgICAvLyBpdCBtYXkgdHJpZ2dlciB0aGUgdW53YW50ZWQgY2xpY2ssIGNhbid0IHVzZSBUT1VDSF9EUkFHX01PREUKKyAgICAgICAgLy8gYXMgaXQgbWF5IHRyaWdnZXIgdGhlIHVud2FudGVkIGZsaW5nLgorICAgICAgICBtVG91Y2hNb2RlID0gVE9VQ0hfUElOQ0hfRFJBRzsKKyAgICAgICAgbUNvbmZpcm1Nb3ZlID0gdHJ1ZTsKKyAgICAgICAgc3RhcnRUb3VjaChkZXRlY3Rvci5nZXRGb2N1c1goKSwgZGV0ZWN0b3IuZ2V0Rm9jdXNZKCksIG1MYXN0VG91Y2hUaW1lKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgc3RhcnRTY3JvbGxpbmdMYXllcihmbG9hdCBnZXN0dXJlWCwgZmxvYXQgZ2VzdHVyZVkpIHsKKyAgICAgICAgaWYgKG1Ub3VjaE1vZGUgIT0gVE9VQ0hfRFJBR19MQVlFUl9NT0RFKSB7CisgICAgICAgICAgICBpbnQgY29udGVudFggPSB2aWV3VG9Db250ZW50WCgoaW50KSBnZXN0dXJlWCArIG1TY3JvbGxYKTsKKyAgICAgICAgICAgIGludCBjb250ZW50WSA9IHZpZXdUb0NvbnRlbnRZKChpbnQpIGdlc3R1cmVZICsgbVNjcm9sbFkpOworICAgICAgICAgICAgbVNjcm9sbGluZ0xheWVyID0gbmF0aXZlU2Nyb2xsYWJsZUxheWVyKGNvbnRlbnRYLCBjb250ZW50WSk7CisgICAgICAgICAgICBpZiAobVNjcm9sbGluZ0xheWVyICE9IDApIHsKKyAgICAgICAgICAgICAgICBtVG91Y2hNb2RlID0gVE9VQ0hfRFJBR19MQVlFUl9NT0RFOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLy8gMS8oZGVuc2l0eSAqIGRlbnNpdHkpIHVzZWQgdG8gY29tcHV0ZSB0aGUgZGlzdGFuY2UgYmV0d2VlbiBwb2ludHMuCisgICAgLy8gQ29tcHV0ZWQgaW4gaW5pdCgpLgorICAgIHByaXZhdGUgZmxvYXQgRFJBR19MQVlFUl9JTlZFUlNFX0RFTlNJVFlfU1FVQVJFRDsKKworICAgIC8vIFRoZSBkaXN0YW5jZSBiZXR3ZWVuIHR3byBwb2ludHMgcmVwb3J0ZWQgaW4gb25Ub3VjaEV2ZW50IHNjYWxlZCBieSB0aGUKKyAgICAvLyBkZW5zaXR5IG9mIHRoZSBzY3JlZW4uCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IERSQUdfTEFZRVJfRklOR0VSX0RJU1RBTkNFID0gMjAwMDA7CisKICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgYm9vbGVhbiBvblRvdWNoRXZlbnQoTW90aW9uRXZlbnQgZXYpIHsKICAgICAgICAgaWYgKG1OYXRpdmVDbGFzcyA9PSAwIHx8ICFpc0NsaWNrYWJsZSgpIHx8ICFpc0xvbmdDbGlja2FibGUoKSkgewpAQCAtNTAxOCw1NyArNDkyNywxMTYgQEAKICAgICAgICAgICAgICAgICAgICAgKyBtVG91Y2hNb2RlKTsKICAgICAgICAgfQogCi0gICAgICAgIGludCBhY3Rpb247Ci0gICAgICAgIGZsb2F0IHgsIHk7CisgICAgICAgIGludCBhY3Rpb24gPSBldi5nZXRBY3Rpb24oKTsKKyAgICAgICAgZmxvYXQgeCA9IGV2LmdldFgoKTsKKyAgICAgICAgZmxvYXQgeSA9IGV2LmdldFkoKTsKICAgICAgICAgbG9uZyBldmVudFRpbWUgPSBldi5nZXRFdmVudFRpbWUoKTsKIAorICAgICAgICBmaW5hbCBTY2FsZUdlc3R1cmVEZXRlY3RvciBkZXRlY3RvciA9CisgICAgICAgICAgICAgICAgbVpvb21NYW5hZ2VyLmdldE11bHRpVG91Y2hHZXN0dXJlRGV0ZWN0b3IoKTsKKyAgICAgICAgYm9vbGVhbiBza2lwU2NhbGVHZXN0dXJlID0gZmFsc2U7CisgICAgICAgIC8vIFNldCB0byB0aGUgbWlkLXBvaW50IG9mIGEgdHdvLWZpbmdlciBnZXN0dXJlIHVzZWQgdG8gZGV0ZWN0IGlmIHRoZQorICAgICAgICAvLyB1c2VyIGhhcyB0b3VjaGVkIGEgbGF5ZXIuCisgICAgICAgIGZsb2F0IGdlc3R1cmVYID0geDsKKyAgICAgICAgZmxvYXQgZ2VzdHVyZVkgPSB5OworICAgICAgICBpZiAoZGV0ZWN0b3IgPT0gbnVsbCB8fCAhZGV0ZWN0b3IuaXNJblByb2dyZXNzKCkpIHsKKyAgICAgICAgICAgIC8vIFRoZSBnZXN0dXJlIGZvciBzY3JvbGxpbmcgYSBsYXllciBpcyB0d28gZmluZ2VycyBjbG9zZSB0b2dldGhlci4KKyAgICAgICAgICAgIC8vIEZJWE1FOiB3ZSBtYXkgY29uc2lkZXIgZ2l2aW5nIFdlYktpdCBhbiBvcHRpb24gdG8gaGFuZGxlCisgICAgICAgICAgICAvLyBtdWx0aS10b3VjaCBldmVudHMgbGF0ZXIuCisgICAgICAgICAgICBpZiAoZXYuZ2V0UG9pbnRlckNvdW50KCkgPiAxKSB7CisgICAgICAgICAgICAgICAgZmxvYXQgZHggPSBldi5nZXRYKDEpIC0gZXYuZ2V0WCgwKTsKKyAgICAgICAgICAgICAgICBmbG9hdCBkeSA9IGV2LmdldFkoMSkgLSBldi5nZXRZKDApOworICAgICAgICAgICAgICAgIGZsb2F0IGRpc3QgPSAoZHggKiBkeCArIGR5ICogZHkpICoKKyAgICAgICAgICAgICAgICAgICAgICAgIERSQUdfTEFZRVJfSU5WRVJTRV9ERU5TSVRZX1NRVUFSRUQ7CisgICAgICAgICAgICAgICAgLy8gVXNlIHRoZSBhcHByb3hpbWF0ZSBjZW50ZXIgdG8gZGV0ZXJtaW5lIGlmIHRoZSBnZXN0dXJlIGlzIGluCisgICAgICAgICAgICAgICAgLy8gYSBsYXllci4KKyAgICAgICAgICAgICAgICBnZXN0dXJlWCA9IGV2LmdldFgoMCkgKyAoZHggKiAuNWYpOworICAgICAgICAgICAgICAgIGdlc3R1cmVZID0gZXYuZ2V0WSgwKSArIChkeSAqIC41Zik7CisgICAgICAgICAgICAgICAgLy8gTm93IHVzZSBhIGNvbnNpc3RlbnQgcG9pbnQgZm9yIHRyYWNraW5nIG1vdmVtZW50LgorICAgICAgICAgICAgICAgIGlmIChldi5nZXRYKDApIDwgZXYuZ2V0WCgxKSkgeworICAgICAgICAgICAgICAgICAgICB4ID0gZXYuZ2V0WCgwKTsKKyAgICAgICAgICAgICAgICAgICAgeSA9IGV2LmdldFkoMCk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgeCA9IGV2LmdldFgoMSk7CisgICAgICAgICAgICAgICAgICAgIHkgPSBldi5nZXRZKDEpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBhY3Rpb24gPSBldi5nZXRBY3Rpb25NYXNrZWQoKTsKKyAgICAgICAgICAgICAgICBpZiAoZGlzdCA8IERSQUdfTEFZRVJfRklOR0VSX0RJU1RBTkNFKSB7CisgICAgICAgICAgICAgICAgICAgIHNraXBTY2FsZUdlc3R1cmUgPSB0cnVlOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobVRvdWNoTW9kZSA9PSBUT1VDSF9EUkFHX0xBWUVSX01PREUpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gRmluZ2VycyBtb3ZlZCB0b28gZmFyIGFwYXJ0IHdoaWxlIGRyYWdnaW5nLCB0aGUgdXNlcgorICAgICAgICAgICAgICAgICAgICAvLyBtaWdodCBiZSB0cnlpbmcgdG8gem9vbS4KKyAgICAgICAgICAgICAgICAgICAgbVRvdWNoTW9kZSA9IFRPVUNIX0lOSVRfTU9ERTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKwogICAgICAgICAvLyBGSVhNRTogd2UgbWF5IGNvbnNpZGVyIHRvIGdpdmUgV2ViS2l0IGFuIG9wdGlvbiB0byBoYW5kbGUgbXVsdGktdG91Y2gKICAgICAgICAgLy8gZXZlbnRzIGxhdGVyLgotICAgICAgICBpZiAobVN1cHBvcnRNdWx0aVRvdWNoICYmIGV2LmdldFBvaW50ZXJDb3VudCgpID4gMSkgewotICAgICAgICAgICAgaWYgKG1BbGxvd1BhbkFuZFNjYWxlIHx8IG1NaW5ab29tU2NhbGUgPCBtTWF4Wm9vbVNjYWxlKSB7Ci0gICAgICAgICAgICAgICAgbVNjYWxlRGV0ZWN0b3Iub25Ub3VjaEV2ZW50KGV2KTsKLSAgICAgICAgICAgICAgICBpZiAobVNjYWxlRGV0ZWN0b3IuaXNJblByb2dyZXNzKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgbUxhc3RUb3VjaFRpbWUgPSBldmVudFRpbWU7Ci0gICAgICAgICAgICAgICAgICAgIGlmICghbUFsbG93UGFuQW5kU2NhbGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHggPSBtU2NhbGVEZXRlY3Rvci5nZXRGb2N1c1goKTsKLSAgICAgICAgICAgICAgICB5ID0gbVNjYWxlRGV0ZWN0b3IuZ2V0Rm9jdXNZKCk7Ci0gICAgICAgICAgICAgICAgYWN0aW9uID0gZXYuZ2V0QWN0aW9uKCkgJiBNb3Rpb25FdmVudC5BQ1RJT05fTUFTSzsKLSAgICAgICAgICAgICAgICBpZiAoYWN0aW9uID09IE1vdGlvbkV2ZW50LkFDVElPTl9QT0lOVEVSX0RPV04pIHsKLSAgICAgICAgICAgICAgICAgICAgY2FuY2VsVG91Y2goKTsKLSAgICAgICAgICAgICAgICAgICAgYWN0aW9uID0gTW90aW9uRXZlbnQuQUNUSU9OX0RPV047Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChhY3Rpb24gPT0gTW90aW9uRXZlbnQuQUNUSU9OX1BPSU5URVJfVVApIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gc2V0IG1MYXN0VG91Y2hYL1kgdG8gdGhlIHJlbWFpbmluZyBwb2ludAotICAgICAgICAgICAgICAgICAgICBtTGFzdFRvdWNoWCA9IHg7Ci0gICAgICAgICAgICAgICAgICAgIG1MYXN0VG91Y2hZID0geTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGFjdGlvbiA9PSBNb3Rpb25FdmVudC5BQ1RJT05fTU9WRSkgewotICAgICAgICAgICAgICAgICAgICAvLyBuZWdhdGl2ZSB4IG9yIHkgaW5kaWNhdGUgaXQgaXMgb24gdGhlIGVkZ2UsIHNraXAgaXQuCi0gICAgICAgICAgICAgICAgICAgIGlmICh4IDwgMCB8fCB5IDwgMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIC8vIGlmIHRoZSBwYWdlIGRpc2FsbG93IHpvb20sIHNraXAgbXVsdGktcG9pbnRlciBhY3Rpb24KKyAgICAgICAgaWYgKG1ab29tTWFuYWdlci5zdXBwb3J0c011bHRpVG91Y2hab29tKCkgJiYgZXYuZ2V0UG9pbnRlckNvdW50KCkgPiAxICYmCisgICAgICAgICAgICAgICAgbVRvdWNoTW9kZSAhPSBUT1VDSF9EUkFHX0xBWUVSX01PREUgJiYgIXNraXBTY2FsZUdlc3R1cmUpIHsKKworICAgICAgICAgICAgLy8gaWYgdGhlIHBhZ2UgZGlzYWxsb3dzIHpvb20sIHNraXAgbXVsdGktcG9pbnRlciBhY3Rpb24KKyAgICAgICAgICAgIGlmICghbVpvb21NYW5hZ2VyLnN1cHBvcnRzUGFuRHVyaW5nWm9vbSgpICYmIG1ab29tTWFuYWdlci5pc1pvb21TY2FsZUZpeGVkKCkpIHsKICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGFjdGlvbiA9IGV2LmdldEFjdGlvbigpOwotICAgICAgICAgICAgeCA9IGV2LmdldFgoKTsKLSAgICAgICAgICAgIHkgPSBldi5nZXRZKCk7CisKKyAgICAgICAgICAgIGlmICghZGV0ZWN0b3IuaXNJblByb2dyZXNzKCkgJiYKKyAgICAgICAgICAgICAgICAgICAgZXYuZ2V0QWN0aW9uTWFza2VkKCkgIT0gTW90aW9uRXZlbnQuQUNUSU9OX1BPSU5URVJfRE9XTikgeworICAgICAgICAgICAgICAgIC8vIEluc2VydCBhIGZha2UgcG9pbnRlciBkb3duIGV2ZW50IGluIG9yZGVyIHRvIHN0YXJ0CisgICAgICAgICAgICAgICAgLy8gdGhlIHpvb20gc2NhbGUgZGV0ZWN0b3IuCisgICAgICAgICAgICAgICAgTW90aW9uRXZlbnQgdGVtcCA9IE1vdGlvbkV2ZW50Lm9idGFpbihldik7CisgICAgICAgICAgICAgICAgLy8gQ2xlYXIgdGhlIG9yaWdpbmFsIGV2ZW50IGFuZCBzZXQgaXQgdG8KKyAgICAgICAgICAgICAgICAvLyBBQ1RJT05fUE9JTlRFUl9ET1dOLgorICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIHRlbXAuc2V0QWN0aW9uKHRlbXAuZ2V0QWN0aW9uKCkgJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH5Nb3Rpb25FdmVudC5BQ1RJT05fTUFTSyB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTW90aW9uRXZlbnQuQUNUSU9OX1BPSU5URVJfRE9XTik7CisgICAgICAgICAgICAgICAgICAgIGRldGVjdG9yLm9uVG91Y2hFdmVudCh0ZW1wKTsKKyAgICAgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgICAgICB0ZW1wLnJlY3ljbGUoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGRldGVjdG9yLm9uVG91Y2hFdmVudChldik7CisKKyAgICAgICAgICAgIGlmIChkZXRlY3Rvci5pc0luUHJvZ3Jlc3MoKSkgeworICAgICAgICAgICAgICAgIG1MYXN0VG91Y2hUaW1lID0gZXZlbnRUaW1lOworICAgICAgICAgICAgICAgIGNhbmNlbExvbmdQcmVzcygpOworICAgICAgICAgICAgICAgIG1Qcml2YXRlSGFuZGxlci5yZW1vdmVNZXNzYWdlcyhTV0lUQ0hfVE9fTE9OR1BSRVNTKTsKKyAgICAgICAgICAgICAgICBpZiAoIW1ab29tTWFuYWdlci5zdXBwb3J0c1BhbkR1cmluZ1pvb20oKSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbVRvdWNoTW9kZSA9IFRPVUNIX0RSQUdfTU9ERTsKKyAgICAgICAgICAgICAgICBpZiAobVZlbG9jaXR5VHJhY2tlciA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIG1WZWxvY2l0eVRyYWNrZXIgPSBWZWxvY2l0eVRyYWNrZXIub2J0YWluKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICB4ID0gZGV0ZWN0b3IuZ2V0Rm9jdXNYKCk7CisgICAgICAgICAgICB5ID0gZGV0ZWN0b3IuZ2V0Rm9jdXNZKCk7CisgICAgICAgICAgICBhY3Rpb24gPSBldi5nZXRBY3Rpb24oKSAmIE1vdGlvbkV2ZW50LkFDVElPTl9NQVNLOworICAgICAgICAgICAgaWYgKGFjdGlvbiA9PSBNb3Rpb25FdmVudC5BQ1RJT05fUE9JTlRFUl9ET1dOKSB7CisgICAgICAgICAgICAgICAgY2FuY2VsVG91Y2goKTsKKyAgICAgICAgICAgICAgICBhY3Rpb24gPSBNb3Rpb25FdmVudC5BQ1RJT05fRE9XTjsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoYWN0aW9uID09IE1vdGlvbkV2ZW50LkFDVElPTl9QT0lOVEVSX1VQKSB7CisgICAgICAgICAgICAgICAgLy8gc2V0IG1MYXN0VG91Y2hYL1kgdG8gdGhlIHJlbWFpbmluZyBwb2ludAorICAgICAgICAgICAgICAgIG1MYXN0VG91Y2hYID0geDsKKyAgICAgICAgICAgICAgICBtTGFzdFRvdWNoWSA9IHk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGFjdGlvbiA9PSBNb3Rpb25FdmVudC5BQ1RJT05fTU9WRSkgeworICAgICAgICAgICAgICAgIC8vIG5lZ2F0aXZlIHggb3IgeSBpbmRpY2F0ZSBpdCBpcyBvbiB0aGUgZWRnZSwgc2tpcCBpdC4KKyAgICAgICAgICAgICAgICBpZiAoeCA8IDAgfHwgeSA8IDApIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQogICAgICAgICB9CiAKICAgICAgICAgLy8gRHVlIHRvIHRoZSB0b3VjaCBzY3JlZW4gZWRnZSBlZmZlY3QsIGEgdG91Y2ggY2xvc2VyIHRvIHRoZSBlZGdlCiAgICAgICAgIC8vIGFsd2F5cyBzbmFwcGVkIHRvIHRoZSBlZGdlLiBBcyBnZXRWaWV3V2lkdGgoKSBjYW4gYmUgZGlmZmVyZW50IGZyb20KICAgICAgICAgLy8gZ2V0V2lkdGgoKSBkdWUgdG8gdGhlIHNjcm9sbGJhciwgYWRqdXN0aW5nIHRoZSBwb2ludCB0byBtYXRjaAogICAgICAgICAvLyBnZXRWaWV3V2lkdGgoKS4gU2FtZSBhcHBsaWVkIHRvIHRoZSBoZWlnaHQuCi0gICAgICAgIGlmICh4ID4gZ2V0Vmlld1dpZHRoKCkgLSAxKSB7Ci0gICAgICAgICAgICB4ID0gZ2V0Vmlld1dpZHRoKCkgLSAxOwotICAgICAgICB9Ci0gICAgICAgIGlmICh5ID4gZ2V0Vmlld0hlaWdodFdpdGhUaXRsZSgpIC0gMSkgewotICAgICAgICAgICAgeSA9IGdldFZpZXdIZWlnaHRXaXRoVGl0bGUoKSAtIDE7Ci0gICAgICAgIH0KKyAgICAgICAgeCA9IE1hdGgubWluKHgsIGdldFZpZXdXaWR0aCgpIC0gMSk7CisgICAgICAgIHkgPSBNYXRoLm1pbih5LCBnZXRWaWV3SGVpZ2h0V2l0aFRpdGxlKCkgLSAxKTsKIAogICAgICAgICBmbG9hdCBmRGVsdGFYID0gbUxhc3RUb3VjaFggLSB4OwogICAgICAgICBmbG9hdCBmRGVsdGFZID0gbUxhc3RUb3VjaFkgLSB5OwpAQCAtNTA5MSw2ICs1MDU5LDkgQEAKICAgICAgICAgICAgICAgICAgICAgbVByaXZhdGVIYW5kbGVyLnJlbW92ZU1lc3NhZ2VzKFJFU1VNRV9XRUJDT1JFX1BSSU9SSVRZKTsKICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG1Qcml2YXRlSGFuZGxlci5oYXNNZXNzYWdlcyhSRUxFQVNFX1NJTkdMRV9UQVApKSB7CiAgICAgICAgICAgICAgICAgICAgIG1Qcml2YXRlSGFuZGxlci5yZW1vdmVNZXNzYWdlcyhSRUxFQVNFX1NJTkdMRV9UQVApOworICAgICAgICAgICAgICAgICAgICBpZiAoZ2V0U2V0dGluZ3MoKS5zdXBwb3J0VG91Y2hPbmx5KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlbW92ZVRvdWNoSGlnaGxpZ2h0KHRydWUpOworICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIGlmIChkZWx0YVggKiBkZWx0YVggKyBkZWx0YVkgKiBkZWx0YVkgPCBtRG91YmxlVGFwU2xvcFNxdWFyZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgbVRvdWNoTW9kZSA9IFRPVUNIX0RPVUJMRV9UQVBfTU9ERTsKICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKQEAgLTUxMDIsMTMgKzUwNzMsMzMgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudFgsIGNvbnRlbnRZKSA6IGZhbHNlOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfSBlbHNlIHsgLy8gdGhlIG5vcm1hbCBjYXNlCi0gICAgICAgICAgICAgICAgICAgIG1QcmV2aWV3Wm9vbU9ubHkgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgbVRvdWNoTW9kZSA9IFRPVUNIX0lOSVRfTU9ERTsKICAgICAgICAgICAgICAgICAgICAgbURlZmVyVG91Y2hQcm9jZXNzID0gKCFpbkZ1bGxTY3JlZW5Nb2RlKCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBtRm9yd2FyZFRvdWNoRXZlbnRzKSA/IGhpdEZvY3VzZWRQbHVnaW4oCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudFgsIGNvbnRlbnRZKSA6IGZhbHNlOwogICAgICAgICAgICAgICAgICAgICBtV2ViVmlld0NvcmUuc2VuZE1lc3NhZ2UoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXZlbnRIdWIuVVBEQVRFX0ZSQU1FX0NBQ0hFX0lGX0xPQURJTkcpOworICAgICAgICAgICAgICAgICAgICBpZiAoZ2V0U2V0dGluZ3MoKS5zdXBwb3J0VG91Y2hPbmx5KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFRvdWNoSGlnaGxpZ2h0RGF0YSBkYXRhID0gbmV3IFRvdWNoSGlnaGxpZ2h0RGF0YSgpOworICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS5tWCA9IGNvbnRlbnRYOworICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS5tWSA9IGNvbnRlbnRZOworICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS5tU2xvcCA9IHZpZXdUb0NvbnRlbnREaW1lbnNpb24obU5hdlNsb3ApOworICAgICAgICAgICAgICAgICAgICAgICAgbVdlYlZpZXdDb3JlLnNlbmRNZXNzYWdlRGVsYXllZCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXZlbnRIdWIuR0VUX1RPVUNIX0hJR0hMSUdIVF9SRUNUUywgZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmlld0NvbmZpZ3VyYXRpb24uZ2V0VGFwVGltZW91dCgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChERUJVR19UT1VDSF9ISUdITElHSFQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZ2V0U2V0dGluZ3MoKS5nZXROYXZEdW1wKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVRvdWNoSGlnaGxpZ2h0WCA9IChpbnQpIHggKyBtU2Nyb2xsWDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVRvdWNoSGlnaGxpZ2h0WSA9IChpbnQpIHkgKyBtU2Nyb2xsWTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVByaXZhdGVIYW5kbGVyLnBvc3REZWxheWVkKG5ldyBSdW5uYWJsZSgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtVG91Y2hIaWdobGlnaHRYID0gbVRvdWNoSGlnaGxpZ2h0WSA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW52YWxpZGF0ZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBUT1VDSF9ISUdITElHSFRfRUxBUFNFX1RJTUUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBpZiAobUxvZ0V2ZW50ICYmIGV2ZW50VGltZSAtIG1MYXN0VG91Y2hVcFRpbWUgPCAxMDAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBFdmVudExvZy53cml0ZUV2ZW50KEV2ZW50TG9nVGFncy5CUk9XU0VSX0RPVUJMRV9UQVBfRFVSQVRJT04sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChldmVudFRpbWUgLSBtTGFzdFRvdWNoVXBUaW1lKSwgZXZlbnRUaW1lKTsKQEAgLTUxNDQsMTcgKzUxMzUsMTUgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIHRlZC5tWSA9IGNvbnRlbnRZOwogICAgICAgICAgICAgICAgICAgICAgICAgdGVkLm1NZXRhU3RhdGUgPSBldi5nZXRNZXRhU3RhdGUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgIHRlZC5tUmVwcm9jZXNzID0gbURlZmVyVG91Y2hQcm9jZXNzOworICAgICAgICAgICAgICAgICAgICAgICAgbVdlYlZpZXdDb3JlLnNlbmRNZXNzYWdlKEV2ZW50SHViLlRPVUNIX0VWRU5ULCB0ZWQpOwogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1EZWZlclRvdWNoUHJvY2VzcykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN0aWxsIG5lZWRzIHRvIHNldCB0aGVtIGZvciBjb21wdXRlIGRlbHRhWC9ZCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUxhc3RUb3VjaFggPSB4OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1MYXN0VG91Y2hZID0geTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZWQubVZpZXdYID0geDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZWQubVZpZXdZID0geTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtV2ViVmlld0NvcmUuc2VuZE1lc3NhZ2UoRXZlbnRIdWIuVE9VQ0hfRVZFTlQsIHRlZCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBtV2ViVmlld0NvcmUuc2VuZE1lc3NhZ2UoRXZlbnRIdWIuVE9VQ0hfRVZFTlQsIHRlZCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWluRnVsbFNjcmVlbk1vZGUoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Qcml2YXRlSGFuZGxlci5yZW1vdmVNZXNzYWdlcyhQUkVWRU5UX0RFRkFVTFRfVElNRU9VVCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVByaXZhdGVIYW5kbGVyLnNlbmRNZXNzYWdlRGVsYXllZChtUHJpdmF0ZUhhbmRsZXIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5vYnRhaW5NZXNzYWdlKFBSRVZFTlRfREVGQVVMVF9USU1FT1VULAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3Rpb24sIDApLCBUQVBfVElNRU9VVCk7CkBAIC01MTc1LDI0ICs1MTY0LDI0IEBACiAgICAgICAgICAgICAgICAgICAgIGlmIChtVG91Y2hNb2RlID09IFRPVUNIX0RPVUJMRV9UQVBfTU9ERSkgewogICAgICAgICAgICAgICAgICAgICAgICAgbVRvdWNoTW9kZSA9IFRPVUNIX0lOSVRfTU9ERTsKICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAoZ2V0U2V0dGluZ3MoKS5zdXBwb3J0VG91Y2hPbmx5KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlbW92ZVRvdWNoSGlnaGxpZ2h0KHRydWUpOworICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIC8vIHBhc3MgdGhlIHRvdWNoIGV2ZW50cyBmcm9tIFVJIHRocmVhZCB0byBXZWJDb3JlIHRocmVhZAogICAgICAgICAgICAgICAgIGlmIChzaG91bGRGb3J3YXJkVG91Y2hFdmVudCgpICYmIG1Db25maXJtTW92ZSAmJiAoZmlyc3RNb3ZlCiAgICAgICAgICAgICAgICAgICAgICAgICB8fCBldmVudFRpbWUgLSBtTGFzdFNlbnRUb3VjaFRpbWUgPiBtQ3VycmVudFRvdWNoSW50ZXJ2YWwpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1MYXN0U2VudFRvdWNoVGltZSA9IGV2ZW50VGltZTsKICAgICAgICAgICAgICAgICAgICAgVG91Y2hFdmVudERhdGEgdGVkID0gbmV3IFRvdWNoRXZlbnREYXRhKCk7CiAgICAgICAgICAgICAgICAgICAgIHRlZC5tQWN0aW9uID0gYWN0aW9uOwogICAgICAgICAgICAgICAgICAgICB0ZWQubVggPSBjb250ZW50WDsKICAgICAgICAgICAgICAgICAgICAgdGVkLm1ZID0gY29udGVudFk7CiAgICAgICAgICAgICAgICAgICAgIHRlZC5tTWV0YVN0YXRlID0gZXYuZ2V0TWV0YVN0YXRlKCk7CiAgICAgICAgICAgICAgICAgICAgIHRlZC5tUmVwcm9jZXNzID0gbURlZmVyVG91Y2hQcm9jZXNzOworICAgICAgICAgICAgICAgICAgICBtV2ViVmlld0NvcmUuc2VuZE1lc3NhZ2UoRXZlbnRIdWIuVE9VQ0hfRVZFTlQsIHRlZCk7CisgICAgICAgICAgICAgICAgICAgIG1MYXN0U2VudFRvdWNoVGltZSA9IGV2ZW50VGltZTsKICAgICAgICAgICAgICAgICAgICAgaWYgKG1EZWZlclRvdWNoUHJvY2VzcykgewotICAgICAgICAgICAgICAgICAgICAgICAgdGVkLm1WaWV3WCA9IHg7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0ZWQubVZpZXdZID0geTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1XZWJWaWV3Q29yZS5zZW5kTWVzc2FnZShFdmVudEh1Yi5UT1VDSF9FVkVOVCwgdGVkKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIG1XZWJWaWV3Q29yZS5zZW5kTWVzc2FnZShFdmVudEh1Yi5UT1VDSF9FVkVOVCwgdGVkKTsKICAgICAgICAgICAgICAgICAgICAgaWYgKGZpcnN0TW92ZSAmJiAhaW5GdWxsU2NyZWVuTW9kZSgpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBtUHJpdmF0ZUhhbmRsZXIuc2VuZE1lc3NhZ2VEZWxheWVkKG1Qcml2YXRlSGFuZGxlcgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAub2J0YWluTWVzc2FnZShQUkVWRU5UX0RFRkFVTFRfVElNRU9VVCwKQEAgLTUyMjEsMTEgKzUyMTAsMTMgQEAKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgaWYgKG1Ub3VjaE1vZGUgIT0gVE9VQ0hfRFJBR19NT0RFKSB7CisgICAgICAgICAgICAgICAgaWYgKG1Ub3VjaE1vZGUgIT0gVE9VQ0hfRFJBR19NT0RFICYmCisgICAgICAgICAgICAgICAgICAgICAgICBtVG91Y2hNb2RlICE9IFRPVUNIX0RSQUdfTEFZRVJfTU9ERSkgewogCiAgICAgICAgICAgICAgICAgICAgIGlmICghbUNvbmZpcm1Nb3ZlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgfQorCiAgICAgICAgICAgICAgICAgICAgIGlmIChtUHJldmVudERlZmF1bHQgPT0gUFJFVkVOVF9ERUZBVUxUX01BWUJFX1lFUwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IG1QcmV2ZW50RGVmYXVsdCA9PSBQUkVWRU5UX0RFRkFVTFRfTk9fRlJPTV9UT1VDSF9ET1dOKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0cmFjayBtTGFzdFRvdWNoVGltZSBhcyB3ZSBtYXkgbmVlZCB0byBkbyBmbGluZyBhdApAQCAtNTIzNSw5ICs1MjI2LDkgQEAKICAgICAgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgICAgIC8vIE9ubHkgbG9jayBkcmFnZ2luZyB0byBvbmUgYXhpcyBpZiB3ZSBkb24ndCBoYXZlIGEgc2NhbGUgaW4gcHJvZ3Jlc3MuCi0gICAgICAgICAgICAgICAgICAgIC8vIFNjYWxpbmcgaW1wbGllcyBmcmVlLXJvYW1pbmcgbW92ZW1lbnQuIE5vdGUgd2UnbGwgb25seSBldmVyIGdldCBoZXJlCi0gICAgICAgICAgICAgICAgICAgIC8vIGlmIG1BbGxvd1BhbkFuZFNjYWxlIGlzIHRydWUuCi0gICAgICAgICAgICAgICAgICAgIGlmIChtU2NhbGVEZXRlY3RvciAhPSBudWxsICYmICFtU2NhbGVEZXRlY3Rvci5pc0luUHJvZ3Jlc3MoKSkgeworICAgICAgICAgICAgICAgICAgICAvLyBTY2FsaW5nIGltcGxpZXMgZnJlZS1yb2FtaW5nIG1vdmVtZW50LiBOb3RlIHRoaXMgaXMgb25seSBldmVyIGEgcXVlc3Rpb24KKyAgICAgICAgICAgICAgICAgICAgLy8gaWYgbVpvb21NYW5hZ2VyLnN1cHBvcnRzUGFuRHVyaW5nWm9vbSgpIGlzIHRydWUuCisgICAgICAgICAgICAgICAgICAgIGlmIChkZXRlY3RvciAhPSBudWxsICYmICFkZXRlY3Rvci5pc0luUHJvZ3Jlc3MoKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgaXQgc3RhcnRzIG5lYXJseSBob3Jpem9udGFsIG9yIHZlcnRpY2FsLCBlbmZvcmNlIGl0CiAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYXggPSBNYXRoLmFicyhkZWx0YVgpOwogICAgICAgICAgICAgICAgICAgICAgICAgaW50IGF5ID0gTWF0aC5hYnMoZGVsdGFZKTsKQEAgLTUyNTgsNiArNTI0OSw5IEBACiAgICAgICAgICAgICAgICAgICAgIGRlbHRhWCA9IDA7CiAgICAgICAgICAgICAgICAgICAgIGRlbHRhWSA9IDA7CiAKKyAgICAgICAgICAgICAgICAgICAgaWYgKHNraXBTY2FsZUdlc3R1cmUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0U2Nyb2xsaW5nTGF5ZXIoZ2VzdHVyZVgsIGdlc3R1cmVZKTsKKyAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBzdGFydERyYWcoKTsKICAgICAgICAgICAgICAgICB9CiAKQEAgLTUyNjYsNiArNTI2MCwyMCBAQAogICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAgIC8vIGRvIHBhbgorICAgICAgICAgICAgICAgIGlmIChtVG91Y2hNb2RlICE9IFRPVUNIX0RSQUdfTEFZRVJfTU9ERSkgeworICAgICAgICAgICAgICAgICAgICBpbnQgbmV3U2Nyb2xsWCA9IHBpbkxvY1gobVNjcm9sbFggKyBkZWx0YVgpOworICAgICAgICAgICAgICAgICAgICBpbnQgbmV3RGVsdGFYID0gbmV3U2Nyb2xsWCAtIG1TY3JvbGxYOworICAgICAgICAgICAgICAgICAgICBpZiAoZGVsdGFYICE9IG5ld0RlbHRhWCkgeworICAgICAgICAgICAgICAgICAgICAgICAgZGVsdGFYID0gbmV3RGVsdGFYOworICAgICAgICAgICAgICAgICAgICAgICAgZkRlbHRhWCA9IChmbG9hdCkgbmV3RGVsdGFYOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGludCBuZXdTY3JvbGxZID0gcGluTG9jWShtU2Nyb2xsWSArIGRlbHRhWSk7CisgICAgICAgICAgICAgICAgICAgIGludCBuZXdEZWx0YVkgPSBuZXdTY3JvbGxZIC0gbVNjcm9sbFk7CisgICAgICAgICAgICAgICAgICAgIGlmIChkZWx0YVkgIT0gbmV3RGVsdGFZKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWx0YVkgPSBuZXdEZWx0YVk7CisgICAgICAgICAgICAgICAgICAgICAgICBmRGVsdGFZID0gKGZsb2F0KSBuZXdEZWx0YVk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgYm9vbGVhbiBkb25lID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgYm9vbGVhbiBrZWVwU2Nyb2xsQmFyc1Zpc2libGUgPSBmYWxzZTsKICAgICAgICAgICAgICAgICBpZiAoTWF0aC5hYnMoZkRlbHRhWCkgPCAxLjBmICYmIE1hdGguYWJzKGZEZWx0YVkpIDwgMS4wZikgewpAQCAtNTMzMiw3ICs1MzQwLDkgQEAKIAogICAgICAgICAgICAgICAgIGRvRHJhZyhkZWx0YVgsIGRlbHRhWSk7CiAKLSAgICAgICAgICAgICAgICBpZiAoa2VlcFNjcm9sbEJhcnNWaXNpYmxlKSB7CisgICAgICAgICAgICAgICAgLy8gVHVybiBvZmYgc2Nyb2xsYmFycyB3aGVuIGRyYWdnaW5nIGEgbGF5ZXIuCisgICAgICAgICAgICAgICAgaWYgKGtlZXBTY3JvbGxCYXJzVmlzaWJsZSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgbVRvdWNoTW9kZSAhPSBUT1VDSF9EUkFHX0xBWUVSX01PREUpIHsKICAgICAgICAgICAgICAgICAgICAgaWYgKG1IZWxkTW90aW9ubGVzcyAhPSBNT1RJT05MRVNTX1RSVUUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIG1IZWxkTW90aW9ubGVzcyA9IE1PVElPTkxFU1NfVFJVRTsKICAgICAgICAgICAgICAgICAgICAgICAgIGludmFsaWRhdGUoKTsKQEAgLTUzNDcsNiArNTM1Nyw3IEBACiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBjYXNlIE1vdGlvbkV2ZW50LkFDVElPTl9VUDogeworICAgICAgICAgICAgICAgIGlmICghaXNGb2N1c2VkKCkpIHJlcXVlc3RGb2N1cygpOwogICAgICAgICAgICAgICAgIC8vIHBhc3MgdGhlIHRvdWNoIGV2ZW50cyBmcm9tIFVJIHRocmVhZCB0byBXZWJDb3JlIHRocmVhZAogICAgICAgICAgICAgICAgIGlmIChzaG91bGRGb3J3YXJkVG91Y2hFdmVudCgpKSB7CiAgICAgICAgICAgICAgICAgICAgIFRvdWNoRXZlbnREYXRhIHRlZCA9IG5ldyBUb3VjaEV2ZW50RGF0YSgpOwpAQCAtNTM1NSwxMCArNTM2Niw2IEBACiAgICAgICAgICAgICAgICAgICAgIHRlZC5tWSA9IGNvbnRlbnRZOwogICAgICAgICAgICAgICAgICAgICB0ZWQubU1ldGFTdGF0ZSA9IGV2LmdldE1ldGFTdGF0ZSgpOwogICAgICAgICAgICAgICAgICAgICB0ZWQubVJlcHJvY2VzcyA9IG1EZWZlclRvdWNoUHJvY2VzczsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1EZWZlclRvdWNoUHJvY2VzcykgewotICAgICAgICAgICAgICAgICAgICAgICAgdGVkLm1WaWV3WCA9IHg7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0ZWQubVZpZXdZID0geTsKLSAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBtV2ViVmlld0NvcmUuc2VuZE1lc3NhZ2UoRXZlbnRIdWIuVE9VQ0hfRVZFTlQsIHRlZCk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIG1MYXN0VG91Y2hVcFRpbWUgPSBldmVudFRpbWU7CkBAIC01MzczLDEzICs1MzgwLDkgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZWQubVkgPSBjb250ZW50WTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZWQubU1ldGFTdGF0ZSA9IGV2LmdldE1ldGFTdGF0ZSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlZC5tUmVwcm9jZXNzID0gbURlZmVyVG91Y2hQcm9jZXNzOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtRGVmZXJUb3VjaFByb2Nlc3MpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVkLm1WaWV3WCA9IHg7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlZC5tVmlld1kgPSB5OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtV2ViVmlld0NvcmUuc2VuZE1lc3NhZ2UoRXZlbnRIdWIuVE9VQ0hfRVZFTlQsIHRlZCk7CiAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG1QcmV2ZW50RGVmYXVsdCAhPSBQUkVWRU5UX0RFRkFVTFRfWUVTKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb0RvdWJsZVRhcCgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ab29tTWFuYWdlci5oYW5kbGVEb3VibGVUYXAobUxhc3RUb3VjaFgsIG1MYXN0VG91Y2hZKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtVG91Y2hNb2RlID0gVE9VQ0hfRE9ORV9NT0RFOwogICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CkBAIC01Mzk0LDkgKzUzOTcsMTcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobVByZXZlbnREZWZhdWx0ICE9IFBSRVZFTlRfREVGQVVMVF9ZRVMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIChjb21wdXRlTWF4U2Nyb2xsWCgpID4gMAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBjb21wdXRlTWF4U2Nyb2xsWSgpID4gMCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVUkgdGFrZXMgY29udHJvbCBiYWNrLCBjYW5jZWwgV2ViQ29yZSB0b3VjaAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYW5jZWxXZWJDb3JlVG91Y2hFdmVudChjb250ZW50WCwgY29udGVudFksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIElmIHRoZSB1c2VyIGhhcyBwZXJmb3JtZWQgYSB2ZXJ5IHF1aWNrIHRvdWNoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNlcXVlbmNlIGl0IGlzIHBvc3NpYmxlIHRoYXQgd2UgbWF5IGdldCBoZXJlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJlZm9yZSBXZWJDb3JlIGhhcyBoYWQgYSBjaGFuY2UgdG8gcHJvY2VzcyB0aGUgZXZlbnRzLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJbiB0aGlzIGNhc2UsIGFueSBjYWxsIHRvIHByZXZlbnREZWZhdWx0IGluIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBKUyB0b3VjaCBoYW5kbGVyIHdpbGwgbm90IGhhdmUgYmVlbiBleGVjdXRlZCB5ZXQuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEhlbmNlIHdlIHdpbGwgc2VlIGJvdGggdGhlIFVJIChub3cpIGFuZCBXZWJDb3JlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICh3aGVuIGNvbnRleHQgc3dpdGNoZXMpIGhhbmRsaW5nIHRoZSBldmVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVnYXJkbGVzcyBvZiB3aGV0aGVyIHRoZSB3ZWIgZGV2ZWxvcGVyIGFjdHVhbGx5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRvZXNlcyBwcmV2ZW50RGVmYXVsdCBpbiB0aGVpciB0b3VjaCBoYW5kbGVyLiBUaGlzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlzIHRoZSBuYXR1cmUgb2Ygb3VyIGFzeW5jaHJvbm91cyB0b3VjaCBtb2RlbC4KKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3ZSB3aWxsIG5vdCByZXdyaXRlIGRyYWcgY29kZSBoZXJlLCBidXQgd2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2lsbCB0cnkgZmxpbmcgaWYgaXQgYXBwbGllcy4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2ViVmlld0NvcmUucmVkdWNlUHJpb3JpdHkoKTsKQEAgLTU0MTQsMTMgKzU0MjUsMTYgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtU2VsZWN0aW5nVGV4dCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmF0aXZlSGl0U2VsZWN0aW9uKGNvbnRlbnRYLCBjb250ZW50WSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvcHlTZWxlY3Rpb24oKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGFwcGluZyBvbiBzZWxlY3Rpb24gb3IgY29udHJvbHMgZG9lcyBub3RoaW5nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghbmF0aXZlSGl0U2VsZWN0aW9uKGNvbnRlbnRYLCBjb250ZW50WSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbkRvbmUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb25Eb25lKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobVRvdWNoTW9kZSA9PSBUT1VDSF9JTklUX01PREUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvbmx5IHRyaWdnZXIgZG91YmxlIHRhcCBpZiB0aGUgV2ViVmlldyBpcworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNjYWxhYmxlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1Ub3VjaE1vZGUgPT0gVE9VQ0hfSU5JVF9NT0RFCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiAoY2FuWm9vbUluKCkgfHwgY2FuWm9vbU91dCgpKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtUHJpdmF0ZUhhbmRsZXIuc2VuZEVtcHR5TWVzc2FnZURlbGF5ZWQoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkVMRUFTRV9TSU5HTEVfVEFQLCBWaWV3Q29uZmlndXJhdGlvbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldERvdWJsZVRhcFRpbWVvdXQoKSk7CkBAIC01NDQ5LDE4ICs1NDYzLDEzIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUhlbGRNb3Rpb25sZXNzID0gTU9USU9OTEVTU19JR05PUkU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9GbGluZygpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobVNjcm9sbGVyLnNwcmluZ2JhY2sobVNjcm9sbFgsIG1TY3JvbGxZLCAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcHV0ZU1heFNjcm9sbFgoKSwgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXB1dGVNYXhTY3JvbGxZKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludmFsaWRhdGUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZWRyYXcgaW4gaGlnaC1xdWFsaXR5LCBhcyB3ZSdyZSBkb25lIGRyYWdnaW5nCiAgICAgICAgICAgICAgICAgICAgICAgICBtSGVsZE1vdGlvbmxlc3MgPSBNT1RJT05MRVNTX1RSVUU7CiAgICAgICAgICAgICAgICAgICAgICAgICBpbnZhbGlkYXRlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBmYWxsIHRocm91Z2gKICAgICAgICAgICAgICAgICAgICAgY2FzZSBUT1VDSF9EUkFHX1NUQVJUX01PREU6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgVE9VQ0hfRFJBR19MQVlFUl9NT0RFOgogICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9VQ0hfRFJBR19TVEFSVF9NT0RFIHNob3VsZCBub3QgaGFwcGVuIGZvciB0aGUgcmVhbAogICAgICAgICAgICAgICAgICAgICAgICAgLy8gZGV2aWNlIGFzIHdlIGFsbW9zdCBjZXJ0YWluIHdpbGwgZ2V0IGEgTU9WRS4gQnV0IHRoaXMKICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlzIHBvc3NpYmxlIG9uIGVtdWxhdG9yLgpAQCAtNTQ3NCw4ICs1NDgzLDYgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGNhc2UgTW90aW9uRXZlbnQuQUNUSU9OX0NBTkNFTDogewogICAgICAgICAgICAgICAgIGlmIChtVG91Y2hNb2RlID09IFRPVUNIX0RSQUdfTU9ERSkgewotICAgICAgICAgICAgICAgICAgICBtU2Nyb2xsZXIuc3ByaW5nYmFjayhtU2Nyb2xsWCwgbVNjcm9sbFksIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcHV0ZU1heFNjcm9sbFgoKSwgMCwgY29tcHV0ZU1heFNjcm9sbFkoKSk7CiAgICAgICAgICAgICAgICAgICAgIGludmFsaWRhdGUoKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgY2FuY2VsV2ViQ29yZVRvdWNoRXZlbnQoY29udGVudFgsIGNvbnRlbnRZLCBmYWxzZSk7CkBAIC01NTE5LDY3ICs1NTI2LDI2IEBACiAgICAgICAgIGlmICghbURyYWdGcm9tVGV4dElucHV0KSB7CiAgICAgICAgICAgICBuYXRpdmVIaWRlQ3Vyc29yKCk7CiAgICAgICAgIH0KLSAgICAgICAgV2ViU2V0dGluZ3Mgc2V0dGluZ3MgPSBnZXRTZXR0aW5ncygpOwotICAgICAgICBpZiAoc2V0dGluZ3Muc3VwcG9ydFpvb20oKQotICAgICAgICAgICAgICAgICYmIHNldHRpbmdzLmdldEJ1aWx0SW5ab29tQ29udHJvbHMoKQotICAgICAgICAgICAgICAgICYmICFnZXRab29tQnV0dG9uc0NvbnRyb2xsZXIoKS5pc1Zpc2libGUoKQotICAgICAgICAgICAgICAgICYmIG1NaW5ab29tU2NhbGUgPCBtTWF4Wm9vbVNjYWxlCi0gICAgICAgICAgICAgICAgJiYgKG1Ib3Jpem9udGFsU2Nyb2xsQmFyTW9kZSAhPSBTQ1JPTExCQVJfQUxXQVlTT0ZGCi0gICAgICAgICAgICAgICAgICAgICAgICB8fCBtVmVydGljYWxTY3JvbGxCYXJNb2RlICE9IFNDUk9MTEJBUl9BTFdBWVNPRkYpKSB7Ci0gICAgICAgICAgICBtWm9vbUJ1dHRvbnNDb250cm9sbGVyLnNldFZpc2libGUodHJ1ZSk7Ci0gICAgICAgICAgICBpbnQgY291bnQgPSBzZXR0aW5ncy5nZXREb3VibGVUYXBUb2FzdENvdW50KCk7Ci0gICAgICAgICAgICBpZiAobUluWm9vbU92ZXJ2aWV3ICYmIGNvdW50ID4gMCkgewotICAgICAgICAgICAgICAgIHNldHRpbmdzLnNldERvdWJsZVRhcFRvYXN0Q291bnQoLS1jb3VudCk7Ci0gICAgICAgICAgICAgICAgVG9hc3QubWFrZVRleHQobUNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0cmluZy5kb3VibGVfdGFwX3RvYXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgVG9hc3QuTEVOR1RIX0xPTkcpLnNob3coKTsKLSAgICAgICAgICAgIH0KKworICAgICAgICBpZiAobUhvcml6b250YWxTY3JvbGxCYXJNb2RlICE9IFNDUk9MTEJBUl9BTFdBWVNPRkYKKyAgICAgICAgICAgICAgICB8fCBtVmVydGljYWxTY3JvbGxCYXJNb2RlICE9IFNDUk9MTEJBUl9BTFdBWVNPRkYpIHsKKyAgICAgICAgICAgIG1ab29tTWFuYWdlci5pbnZva2Vab29tUGlja2VyKCk7CiAgICAgICAgIH0KICAgICB9CiAKICAgICBwcml2YXRlIHZvaWQgZG9EcmFnKGludCBkZWx0YVgsIGludCBkZWx0YVkpIHsKICAgICAgICAgaWYgKChkZWx0YVggfCBkZWx0YVkpICE9IDApIHsKLSAgICAgICAgICAgIGZpbmFsIGludCBvbGRYID0gbVNjcm9sbFg7Ci0gICAgICAgICAgICBmaW5hbCBpbnQgb2xkWSA9IG1TY3JvbGxZOwotICAgICAgICAgICAgZmluYWwgaW50IHJhbmdlWCA9IGNvbXB1dGVNYXhTY3JvbGxYKCk7Ci0gICAgICAgICAgICBmaW5hbCBpbnQgcmFuZ2VZID0gY29tcHV0ZU1heFNjcm9sbFkoKTsKLSAgICAgICAgICAgIG92ZXJzY3JvbGxCeShkZWx0YVgsIGRlbHRhWSwgb2xkWCwgb2xkWSwKLSAgICAgICAgICAgICAgICAgICAgcmFuZ2VYLCByYW5nZVksCi0gICAgICAgICAgICAgICAgICAgIG1PdmVyc2Nyb2xsRGlzdGFuY2UsIG1PdmVyc2Nyb2xsRGlzdGFuY2UsIHRydWUpOwotCi0gICAgICAgICAgICBpZiAobUVkZ2VHbG93VG9wICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAvLyBEb24ndCBzaG93IGxlZnQvcmlnaHQgZ2xvd3MgaWYgd2UgZml0IHRoZSB3aG9sZSBjb250ZW50LgotICAgICAgICAgICAgICAgIGlmIChyYW5nZVggPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZpbmFsIGludCBwdWxsZWRUb1ggPSBvbGRYICsgZGVsdGFYOwotICAgICAgICAgICAgICAgICAgICBpZiAocHVsbGVkVG9YIDwgMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgbUVkZ2VHbG93TGVmdC5vblB1bGwoKGZsb2F0KSBkZWx0YVggLyBnZXRXaWR0aCgpKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChwdWxsZWRUb1ggPiByYW5nZVgpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1FZGdlR2xvd1JpZ2h0Lm9uUHVsbCgoZmxvYXQpIGRlbHRhWCAvIGdldFdpZHRoKCkpOwotICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobVRvdWNoTW9kZSA9PSBUT1VDSF9EUkFHX0xBWUVSX01PREUpIHsKKyAgICAgICAgICAgICAgICBkZWx0YVggPSB2aWV3VG9Db250ZW50RGltZW5zaW9uKGRlbHRhWCk7CisgICAgICAgICAgICAgICAgZGVsdGFZID0gdmlld1RvQ29udGVudERpbWVuc2lvbihkZWx0YVkpOworICAgICAgICAgICAgICAgIGlmIChuYXRpdmVTY3JvbGxMYXllcihtU2Nyb2xsaW5nTGF5ZXIsIGRlbHRhWCwgZGVsdGFZKSkgeworICAgICAgICAgICAgICAgICAgICBpbnZhbGlkYXRlKCk7CiAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKHJhbmdlWSA+IDAgfHwgZ2V0T3ZlcnNjcm9sbE1vZGUoKSA9PSBPVkVSU0NST0xMX0FMV0FZUykgewotICAgICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgcHVsbGVkVG9ZID0gb2xkWSArIGRlbHRhWTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHB1bGxlZFRvWSA8IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1FZGdlR2xvd1RvcC5vblB1bGwoKGZsb2F0KSBkZWx0YVkgLyBnZXRIZWlnaHQoKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocHVsbGVkVG9ZID4gcmFuZ2VZKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtRWRnZUdsb3dCb3R0b20ub25QdWxsKChmbG9hdCkgZGVsdGFZIC8gZ2V0SGVpZ2h0KCkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNjcm9sbEJ5KGRlbHRhWCwgZGVsdGFZKTsKICAgICAgICAgfQotICAgICAgICBpZiAoIWdldFNldHRpbmdzKCkuZ2V0QnVpbHRJblpvb21Db250cm9scygpKSB7Ci0gICAgICAgICAgICBib29sZWFuIHNob3dQbHVzTWludXMgPSBtTWluWm9vbVNjYWxlIDwgbU1heFpvb21TY2FsZTsKLSAgICAgICAgICAgIGlmIChtWm9vbUNvbnRyb2xzICE9IG51bGwgJiYgc2hvd1BsdXNNaW51cykgewotICAgICAgICAgICAgICAgIGlmIChtWm9vbUNvbnRyb2xzLmdldFZpc2liaWxpdHkoKSA9PSBWaWV3LlZJU0lCTEUpIHsKLSAgICAgICAgICAgICAgICAgICAgbVByaXZhdGVIYW5kbGVyLnJlbW92ZUNhbGxiYWNrcyhtWm9vbUNvbnRyb2xSdW5uYWJsZSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgbVpvb21Db250cm9scy5zaG93KHNob3dQbHVzTWludXMsIGZhbHNlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbVByaXZhdGVIYW5kbGVyLnBvc3REZWxheWVkKG1ab29tQ29udHJvbFJ1bm5hYmxlLAotICAgICAgICAgICAgICAgICAgICAgICAgWk9PTV9DT05UUk9MU19USU1FT1VUKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQorICAgICAgICBtWm9vbU1hbmFnZXIua2VlcFpvb21QaWNrZXJWaXNpYmxlKCk7CiAgICAgfQogCiAgICAgcHJpdmF0ZSB2b2lkIHN0b3BUb3VjaCgpIHsKQEAgLTU1OTMsMTQgKzU1NTksNiBAQAogICAgICAgICAgICAgbVZlbG9jaXR5VHJhY2tlci5yZWN5Y2xlKCk7CiAgICAgICAgICAgICBtVmVsb2NpdHlUcmFja2VyID0gbnVsbDsKICAgICAgICAgfQotCi0gICAgICAgIC8vIFJlbGVhc2UgYW55IHB1bGxlZCBnbG93cwotICAgICAgICBpZiAobUVkZ2VHbG93VG9wICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1FZGdlR2xvd1RvcC5vblJlbGVhc2UoKTsKLSAgICAgICAgICAgIG1FZGdlR2xvd0JvdHRvbS5vblJlbGVhc2UoKTsKLSAgICAgICAgICAgIG1FZGdlR2xvd0xlZnQub25SZWxlYXNlKCk7Ci0gICAgICAgICAgICBtRWRnZUdsb3dSaWdodC5vblJlbGVhc2UoKTsKLSAgICAgICAgfQogICAgIH0KIAogICAgIHByaXZhdGUgdm9pZCBjYW5jZWxUb3VjaCgpIHsKQEAgLTU2MTQsMTYgKzU1NzIsOCBAQAogICAgICAgICAgICAgbVZlbG9jaXR5VHJhY2tlci5yZWN5Y2xlKCk7CiAgICAgICAgICAgICBtVmVsb2NpdHlUcmFja2VyID0gbnVsbDsKICAgICAgICAgfQotCi0gICAgICAgIC8vIFJlbGVhc2UgYW55IHB1bGxlZCBnbG93cwotICAgICAgICBpZiAobUVkZ2VHbG93VG9wICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1FZGdlR2xvd1RvcC5vblJlbGVhc2UoKTsKLSAgICAgICAgICAgIG1FZGdlR2xvd0JvdHRvbS5vblJlbGVhc2UoKTsKLSAgICAgICAgICAgIG1FZGdlR2xvd0xlZnQub25SZWxlYXNlKCk7Ci0gICAgICAgICAgICBtRWRnZUdsb3dSaWdodC5vblJlbGVhc2UoKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtVG91Y2hNb2RlID09IFRPVUNIX0RSQUdfTU9ERSkgeworICAgICAgICBpZiAobVRvdWNoTW9kZSA9PSBUT1VDSF9EUkFHX01PREUgfHwKKyAgICAgICAgICAgICAgICBtVG91Y2hNb2RlID09IFRPVUNIX0RSQUdfTEFZRVJfTU9ERSkgewogICAgICAgICAgICAgV2ViVmlld0NvcmUucmVzdW1lUHJpb3JpdHkoKTsKICAgICAgICAgICAgIFdlYlZpZXdDb3JlLnJlc3VtZVVwZGF0ZVBpY3R1cmUobVdlYlZpZXdDb3JlKTsKICAgICAgICAgfQpAQCAtNTYzMSw2ICs1NTgxLDkgQEAKICAgICAgICAgbVByaXZhdGVIYW5kbGVyLnJlbW92ZU1lc3NhZ2VzKFNXSVRDSF9UT19MT05HUFJFU1MpOwogICAgICAgICBtUHJpdmF0ZUhhbmRsZXIucmVtb3ZlTWVzc2FnZXMoRFJBR19IRUxEX01PVElPTkxFU1MpOwogICAgICAgICBtUHJpdmF0ZUhhbmRsZXIucmVtb3ZlTWVzc2FnZXMoQVdBS0VOX1NDUk9MTF9CQVJTKTsKKyAgICAgICAgaWYgKGdldFNldHRpbmdzKCkuc3VwcG9ydFRvdWNoT25seSgpKSB7CisgICAgICAgICAgICByZW1vdmVUb3VjaEhpZ2hsaWdodCh0cnVlKTsKKyAgICAgICAgfQogICAgICAgICBtSGVsZE1vdGlvbmxlc3MgPSBNT1RJT05MRVNTX1RSVUU7CiAgICAgICAgIG1Ub3VjaE1vZGUgPSBUT1VDSF9ET05FX01PREU7CiAgICAgICAgIG5hdGl2ZUhpZGVDdXJzb3IoKTsKQEAgLTU3MjgsNyArNTY4MSw4IEBACiAgICAgICAgICAgICB9CiAgICAgICAgICAgICByZXR1cm4gZmFsc2U7IC8vIGxldCBjb21tb24gY29kZSBpbiBvbktleVVwIGF0IGl0CiAgICAgICAgIH0KLSAgICAgICAgaWYgKG1NYXBUcmFja2JhbGxUb0Fycm93S2V5cyAmJiBtU2hpZnRJc1ByZXNzZWQgPT0gZmFsc2UpIHsKKyAgICAgICAgaWYgKChtTWFwVHJhY2tiYWxsVG9BcnJvd0tleXMgJiYgbVNoaWZ0SXNQcmVzc2VkID09IGZhbHNlKSB8fAorICAgICAgICAgICAgICAgIChtQWNjZXNzaWJpbGl0eUluamVjdG9yICE9IG51bGwgfHwgbUFjY2Vzc2liaWxpdHlTY3JpcHRJbmplY3RlZCkpIHsKICAgICAgICAgICAgIGlmIChEZWJ1Z0ZsYWdzLldFQl9WSUVXKSBMb2cudihMT0dUQUcsICJvblRyYWNrYmFsbEV2ZW50IGdtYWlsIHF1aXQiKTsKICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfQpAQCAtNTg5NiwxMSArNTg1MCwxMSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgKyAiIG1UcmFja2JhbGxSZW1haW5zWD0iICsgbVRyYWNrYmFsbFJlbWFpbnNYCiAgICAgICAgICAgICAgICAgICAgICAgICArICIgbVRyYWNrYmFsbFJlbWFpbnNZPSIgKyBtVHJhY2tiYWxsUmVtYWluc1kpOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKG1OYXRpdmVDbGFzcyAhPSAwICYmIG5hdGl2ZUZvY3VzSXNQbHVnaW4oKSkgeworICAgICAgICAgICAgaWYgKG1OYXRpdmVDbGFzcyAhPSAwICYmIG5hdGl2ZVBhZ2VTaG91bGRIYW5kbGVTaGlmdEFuZEFycm93cygpKSB7CiAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGxldFBsdWdpbkhhbmRsZU5hdktleShzZWxlY3RLZXlDb2RlLCB0aW1lLCB0cnVlKTsKKyAgICAgICAgICAgICAgICAgICAgbGV0UGFnZUhhbmRsZU5hdktleShzZWxlY3RLZXlDb2RlLCB0aW1lLCB0cnVlKTsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbGV0UGx1Z2luSGFuZGxlTmF2S2V5KHNlbGVjdEtleUNvZGUsIHRpbWUsIGZhbHNlKTsKKyAgICAgICAgICAgICAgICBsZXRQYWdlSGFuZGxlTmF2S2V5KHNlbGVjdEtleUNvZGUsIHRpbWUsIGZhbHNlKTsKICAgICAgICAgICAgIH0gZWxzZSBpZiAobmF2SGFuZGxlZEtleShzZWxlY3RLZXlDb2RlLCBjb3VudCwgZmFsc2UsIHRpbWUpKSB7CiAgICAgICAgICAgICAgICAgcGxheVNvdW5kRWZmZWN0KGtleUNvZGVUb1NvdW5kc0VmZmVjdChzZWxlY3RLZXlDb2RlKSk7CiAgICAgICAgICAgICB9CkBAIC01OTMxLDE3ICs1ODg1LDMwIEBACiAgICAgfQogCiAgICAgcHJpdmF0ZSBpbnQgY29tcHV0ZU1heFNjcm9sbFgoKSB7Ci0gICAgICAgIHJldHVybiBNYXRoLm1heChjb21wdXRlUmVhbEhvcml6b250YWxTY3JvbGxSYW5nZSgpIC0gZ2V0Vmlld1dpZHRoKCksIDApOworICAgICAgICByZXR1cm4gTWF0aC5tYXgoY29tcHV0ZUhvcml6b250YWxTY3JvbGxSYW5nZSgpIC0gZ2V0Vmlld1dpZHRoKCksIDApOwogICAgIH0KIAogICAgIHByaXZhdGUgaW50IGNvbXB1dGVNYXhTY3JvbGxZKCkgewotICAgICAgICByZXR1cm4gTWF0aC5tYXgoY29tcHV0ZVJlYWxWZXJ0aWNhbFNjcm9sbFJhbmdlKCkgKyBnZXRUaXRsZUhlaWdodCgpCisgICAgICAgIHJldHVybiBNYXRoLm1heChjb21wdXRlVmVydGljYWxTY3JvbGxSYW5nZSgpICsgZ2V0VGl0bGVIZWlnaHQoKQogICAgICAgICAgICAgICAgIC0gZ2V0Vmlld0hlaWdodFdpdGhUaXRsZSgpLCAwKTsKICAgICB9CiAKKyAgICBib29sZWFuIHVwZGF0ZVNjcm9sbENvb3JkaW5hdGVzKGludCB4LCBpbnQgeSkgeworICAgICAgICBpbnQgb2xkWCA9IG1TY3JvbGxYOworICAgICAgICBpbnQgb2xkWSA9IG1TY3JvbGxZOworICAgICAgICBtU2Nyb2xsWCA9IHg7CisgICAgICAgIG1TY3JvbGxZID0geTsKKyAgICAgICAgaWYgKG9sZFggIT0gbVNjcm9sbFggfHwgb2xkWSAhPSBtU2Nyb2xsWSkgeworICAgICAgICAgICAgb25TY3JvbGxDaGFuZ2VkKG1TY3JvbGxYLCBtU2Nyb2xsWSwgb2xkWCwgb2xkWSk7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKwogICAgIHB1YmxpYyB2b2lkIGZsaW5nU2Nyb2xsKGludCB2eCwgaW50IHZ5KSB7CiAgICAgICAgIG1TY3JvbGxlci5mbGluZyhtU2Nyb2xsWCwgbVNjcm9sbFksIHZ4LCB2eSwgMCwgY29tcHV0ZU1heFNjcm9sbFgoKSwgMCwKLSAgICAgICAgICAgICAgICBjb21wdXRlTWF4U2Nyb2xsWSgpLCBtT3ZlcmZsaW5nRGlzdGFuY2UsIG1PdmVyZmxpbmdEaXN0YW5jZSk7CisgICAgICAgICAgICAgICAgY29tcHV0ZU1heFNjcm9sbFkoKSk7CiAgICAgICAgIGludmFsaWRhdGUoKTsKICAgICB9CiAKQEAgLTU5NzEsMjAgKzU5MzgsMTkgQEAKICAgICAgICAgaWYgKChtYXhYID09IDAgJiYgdnkgPT0gMCkgfHwgKG1heFkgPT0gMCAmJiB2eCA9PSAwKSkgewogICAgICAgICAgICAgV2ViVmlld0NvcmUucmVzdW1lUHJpb3JpdHkoKTsKICAgICAgICAgICAgIFdlYlZpZXdDb3JlLnJlc3VtZVVwZGF0ZVBpY3R1cmUobVdlYlZpZXdDb3JlKTsKLSAgICAgICAgICAgIGlmIChtU2Nyb2xsZXIuc3ByaW5nYmFjayhtU2Nyb2xsWCwgbVNjcm9sbFksIDAsIGNvbXB1dGVNYXhTY3JvbGxYKCksCi0gICAgICAgICAgICAgICAgICAgIDAsIGNvbXB1dGVNYXhTY3JvbGxZKCkpKSB7Ci0gICAgICAgICAgICAgICAgaW52YWxpZGF0ZSgpOwotICAgICAgICAgICAgfQogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CiAgICAgICAgIGZsb2F0IGN1cnJlbnRWZWxvY2l0eSA9IG1TY3JvbGxlci5nZXRDdXJyVmVsb2NpdHkoKTsKLSAgICAgICAgaWYgKG1MYXN0VmVsb2NpdHkgPiAwICYmIGN1cnJlbnRWZWxvY2l0eSA+IDApIHsKKyAgICAgICAgZmxvYXQgdmVsb2NpdHkgPSAoZmxvYXQpIE1hdGguaHlwb3QodngsIHZ5KTsKKyAgICAgICAgaWYgKG1MYXN0VmVsb2NpdHkgPiAwICYmIGN1cnJlbnRWZWxvY2l0eSA+IDAgJiYgdmVsb2NpdHkKKyAgICAgICAgICAgICAgICA+IG1MYXN0VmVsb2NpdHkgKiBNSU5JTVVNX1ZFTE9DSVRZX1JBVElPX0ZPUl9BQ0NFTEVSQVRJT04pIHsKICAgICAgICAgICAgIGZsb2F0IGRlbHRhUiA9IChmbG9hdCkgKE1hdGguYWJzKE1hdGguYXRhbjIobUxhc3RWZWxZLCBtTGFzdFZlbFgpCiAgICAgICAgICAgICAgICAgICAgIC0gTWF0aC5hdGFuMih2eSwgdngpKSk7CiAgICAgICAgICAgICBmaW5hbCBmbG9hdCBjaXJjbGUgPSAoZmxvYXQpIChNYXRoLlBJKSAqIDIuMGY7CiAgICAgICAgICAgICBpZiAoZGVsdGFSID4gY2lyY2xlICogMC45ZiB8fCBkZWx0YVIgPCBjaXJjbGUgKiAwLjFmKSB7CiAgICAgICAgICAgICAgICAgdnggKz0gY3VycmVudFZlbG9jaXR5ICogbUxhc3RWZWxYIC8gbUxhc3RWZWxvY2l0eTsKICAgICAgICAgICAgICAgICB2eSArPSBjdXJyZW50VmVsb2NpdHkgKiBtTGFzdFZlbFkgLyBtTGFzdFZlbG9jaXR5OworICAgICAgICAgICAgICAgIHZlbG9jaXR5ID0gKGZsb2F0KSBNYXRoLmh5cG90KHZ4LCB2eSk7CiAgICAgICAgICAgICAgICAgaWYgKERlYnVnRmxhZ3MuV0VCX1ZJRVcpIHsKICAgICAgICAgICAgICAgICAgICAgTG9nLnYoTE9HVEFHLCAiZG9GbGluZyB2eD0gIiArIHZ4ICsgIiB2eT0iICsgdnkpOwogICAgICAgICAgICAgICAgIH0KQEAgLTU5OTgsNjcgKzU5NjQsMTcgQEAKICAgICAgICAgICAgICAgICAgICAgKyAiIG1heFg9IiArIG1heFggKyAiIG1heFk9IiArIG1heFkKICAgICAgICAgICAgICAgICAgICAgKyAiIG1TY3JvbGxYPSIgKyBtU2Nyb2xsWCArICIgbVNjcm9sbFk9IiArIG1TY3JvbGxZKTsKICAgICAgICAgfQotCi0gICAgICAgIC8vIEFsbG93IHNsb3BweSBmbGluZ3Mgd2l0aG91dCBvdmVyc2Nyb2xsaW5nIGF0IHRoZSBlZGdlcy4KLSAgICAgICAgaWYgKChtU2Nyb2xsWCA9PSAwIHx8IG1TY3JvbGxYID09IG1heFgpICYmIE1hdGguYWJzKHZ4KSA8IE1hdGguYWJzKHZ5KSkgewotICAgICAgICAgICAgdnggPSAwOwotICAgICAgICB9Ci0gICAgICAgIGlmICgobVNjcm9sbFkgPT0gMCB8fCBtU2Nyb2xsWSA9PSBtYXhZKSAmJiBNYXRoLmFicyh2eSkgPCBNYXRoLmFicyh2eCkpIHsKLSAgICAgICAgICAgIHZ5ID0gMDsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtT3ZlcnNjcm9sbERpc3RhbmNlIDwgbU92ZXJmbGluZ0Rpc3RhbmNlKSB7Ci0gICAgICAgICAgICBpZiAobVNjcm9sbFggPT0gLW1PdmVyc2Nyb2xsRGlzdGFuY2UgfHwgbVNjcm9sbFggPT0gbWF4WCArIG1PdmVyc2Nyb2xsRGlzdGFuY2UpIHsKLSAgICAgICAgICAgICAgICB2eCA9IDA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAobVNjcm9sbFkgPT0gLW1PdmVyc2Nyb2xsRGlzdGFuY2UgfHwgbVNjcm9sbFkgPT0gbWF4WSArIG1PdmVyc2Nyb2xsRGlzdGFuY2UpIHsKLSAgICAgICAgICAgICAgICB2eSA9IDA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQogICAgICAgICBtTGFzdFZlbFggPSB2eDsKICAgICAgICAgbUxhc3RWZWxZID0gdnk7Ci0gICAgICAgIG1MYXN0VmVsb2NpdHkgPSAoZmxvYXQpIE1hdGguaHlwb3QodngsIHZ5KTsKKyAgICAgICAgbUxhc3RWZWxvY2l0eSA9IHZlbG9jaXR5OwogCi0gICAgICAgIC8vIG5vIGhvcml6b250YWwgb3ZlcnNjcm9sbCBpZiB0aGUgY29udGVudCBqdXN0IGZpdHMKLSAgICAgICAgbVNjcm9sbGVyLmZsaW5nKG1TY3JvbGxYLCBtU2Nyb2xsWSwgLXZ4LCAtdnksIDAsIG1heFgsIDAsIG1heFksCi0gICAgICAgICAgICAgICAgbWF4WCA9PSAwID8gMCA6IG1PdmVyZmxpbmdEaXN0YW5jZSwgbU92ZXJmbGluZ0Rpc3RhbmNlKTsKLSAgICAgICAgLy8gRHVyYXRpb24gaXMgY2FsY3VsYXRlZCBiYXNlZCBvbiB2ZWxvY2l0eS4gV2l0aCByYW5nZSBib3VuZGFyaWVzIGFuZCBvdmVyc2Nyb2xsCi0gICAgICAgIC8vIHdlIG1heSBub3Qga25vdyBob3cgbG9uZyB0aGUgZmluYWwgYW5pbWF0aW9uIHdpbGwgdGFrZS4gKEhlbmNlIHRoZSBkZXByZWNhdGlvbgotICAgICAgICAvLyB3YXJuaW5nIG9uIHRoZSBjYWxsIGJlbG93LikgSXQncyBub3QgYSBiaWcgZGVhbCBmb3Igc2Nyb2xsIGJhcnMgYnV0IGlmIHdlYmNvcmUKLSAgICAgICAgLy8gcmVzdW1lcyBkdXJpbmcgdGhpcyBlZmZlY3Qgd2Ugd2lsbCB0YWtlIGEgcGVyZm9ybWFuY2UgaGl0LiBTZWUgY29tcHV0ZVNjcm9sbDsKLSAgICAgICAgLy8gd2UgcmVzdW1lIHdlYmNvcmUgdGhlcmUgd2hlbiB0aGUgYW5pbWF0aW9uIGlzIGZpbmlzaGVkLgorICAgICAgICBtU2Nyb2xsZXIuZmxpbmcobVNjcm9sbFgsIG1TY3JvbGxZLCAtdngsIC12eSwgMCwgbWF4WCwgMCwgbWF4WSk7CiAgICAgICAgIGZpbmFsIGludCB0aW1lID0gbVNjcm9sbGVyLmdldER1cmF0aW9uKCk7CisgICAgICAgIG1Qcml2YXRlSGFuZGxlci5zZW5kRW1wdHlNZXNzYWdlRGVsYXllZChSRVNVTUVfV0VCQ09SRV9QUklPUklUWSwgdGltZSk7CiAgICAgICAgIGF3YWtlblNjcm9sbEJhcnModGltZSk7CiAgICAgICAgIGludmFsaWRhdGUoKTsKICAgICB9CiAKLSAgICBwcml2YXRlIGJvb2xlYW4gem9vbVdpdGhQcmV2aWV3KGZsb2F0IHNjYWxlLCBib29sZWFuIHVwZGF0ZVRleHRXcmFwU2NhbGUpIHsKLSAgICAgICAgZmxvYXQgb2xkU2NhbGUgPSBtQWN0dWFsU2NhbGU7Ci0gICAgICAgIG1Jbml0aWFsU2Nyb2xsWCA9IG1TY3JvbGxYOwotICAgICAgICBtSW5pdGlhbFNjcm9sbFkgPSBtU2Nyb2xsWTsKLQotICAgICAgICAvLyBzbmFwIHRvIERFRkFVTFRfU0NBTEUgaWYgaXQgaXMgY2xvc2UKLSAgICAgICAgaWYgKE1hdGguYWJzKHNjYWxlIC0gbURlZmF1bHRTY2FsZSkgPCBNSU5JTVVNX1NDQUxFX0lOQ1JFTUVOVCkgewotICAgICAgICAgICAgc2NhbGUgPSBtRGVmYXVsdFNjYWxlOwotICAgICAgICB9Ci0KLSAgICAgICAgc2V0TmV3Wm9vbVNjYWxlKHNjYWxlLCB1cGRhdGVUZXh0V3JhcFNjYWxlLCBmYWxzZSk7Ci0KLSAgICAgICAgaWYgKG9sZFNjYWxlICE9IG1BY3R1YWxTY2FsZSkgewotICAgICAgICAgICAgLy8gdXNlIG1ab29tUGlja2VyU2NhbGUgdG8gc2VlIHpvb20gcHJldmlldyBmaXJzdAotICAgICAgICAgICAgbVpvb21TdGFydCA9IFN5c3RlbUNsb2NrLnVwdGltZU1pbGxpcygpOwotICAgICAgICAgICAgbUludkluaXRpYWxab29tU2NhbGUgPSAxLjBmIC8gb2xkU2NhbGU7Ci0gICAgICAgICAgICBtSW52RmluYWxab29tU2NhbGUgPSAxLjBmIC8gbUFjdHVhbFNjYWxlOwotICAgICAgICAgICAgbVpvb21TY2FsZSA9IG1BY3R1YWxTY2FsZTsKLSAgICAgICAgICAgIFdlYlZpZXdDb3JlLnBhdXNlVXBkYXRlUGljdHVyZShtV2ViVmlld0NvcmUpOwotICAgICAgICAgICAgaW52YWxpZGF0ZSgpOwotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICB9Ci0KICAgICAvKioKICAgICAgKiBSZXR1cm5zIGEgdmlldyBjb250YWluaW5nIHpvb20gY29udHJvbHMgaS5lLiArLy0gYnV0dG9ucy4gVGhlIGNhbGxlciBpcwogICAgICAqIGluIGNoYXJnZSBvZiBpbnN0YWxsaW5nIHRoaXMgdmlldyB0byB0aGUgdmlldyBoaWVyYXJjaHkuIFRoaXMgdmlldyB3aWxsCkBAIC02MDc4LDgxICs1OTk0LDI5IEBACiAgICAgICAgICAgICBMb2cudyhMT0dUQUcsICJUaGlzIFdlYlZpZXcgZG9lc24ndCBzdXBwb3J0IHpvb20uIik7CiAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgfQotICAgICAgICBpZiAobVpvb21Db250cm9scyA9PSBudWxsKSB7Ci0gICAgICAgICAgICBtWm9vbUNvbnRyb2xzID0gY3JlYXRlWm9vbUNvbnRyb2xzKCk7Ci0KLSAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgKiBuZWVkIHRvIGJlIHNldCB0byBWSVNJQkxFIGZpcnN0IHNvIHRoYXQgZ2V0TWVhc3VyZWRIZWlnaHQoKSBpbgotICAgICAgICAgICAgICoge0BsaW5rICNvblNpemVDaGFuZ2VkKCl9IGNhbiByZXR1cm4gdGhlIG1lYXN1cmVkIHZhbHVlIGZvciBwcm9wZXIKLSAgICAgICAgICAgICAqIGxheW91dC4KLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgbVpvb21Db250cm9scy5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7Ci0gICAgICAgICAgICBtWm9vbUNvbnRyb2xSdW5uYWJsZSA9IG5ldyBSdW5uYWJsZSgpIHsKLSAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0KLSAgICAgICAgICAgICAgICAgICAgLyogRG9uJ3QgZGlzbWlzcyB0aGUgY29udHJvbHMgaWYgdGhlIHVzZXIgaGFzCi0gICAgICAgICAgICAgICAgICAgICAqIGZvY3VzIG9uIHRoZW0uIFdhaXQgYW5kIGNoZWNrIGFnYWluIGxhdGVyLgotICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgaWYgKCFtWm9vbUNvbnRyb2xzLmhhc0ZvY3VzKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1ab29tQ29udHJvbHMuaGlkZSgpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgbVByaXZhdGVIYW5kbGVyLnJlbW92ZUNhbGxiYWNrcyhtWm9vbUNvbnRyb2xSdW5uYWJsZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtUHJpdmF0ZUhhbmRsZXIucG9zdERlbGF5ZWQobVpvb21Db250cm9sUnVubmFibGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFpPT01fQ09OVFJPTFNfVElNRU9VVCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9OwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBtWm9vbUNvbnRyb2xzOworICAgICAgICByZXR1cm4gbVpvb21NYW5hZ2VyLmdldEV4dGVybmFsWm9vbVBpY2tlcigpOwogICAgIH0KIAotICAgIHByaXZhdGUgRXh0ZW5kZWRab29tQ29udHJvbHMgY3JlYXRlWm9vbUNvbnRyb2xzKCkgewotICAgICAgICBFeHRlbmRlZFpvb21Db250cm9scyB6b29tQ29udHJvbHMgPSBuZXcgRXh0ZW5kZWRab29tQ29udHJvbHMobUNvbnRleHQKLSAgICAgICAgICAgICwgbnVsbCk7Ci0gICAgICAgIHpvb21Db250cm9scy5zZXRPblpvb21JbkNsaWNrTGlzdGVuZXIobmV3IE9uQ2xpY2tMaXN0ZW5lcigpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uQ2xpY2soVmlldyB2KSB7Ci0gICAgICAgICAgICAgICAgLy8gcmVzZXQgdGltZSBvdXQKLSAgICAgICAgICAgICAgICBtUHJpdmF0ZUhhbmRsZXIucmVtb3ZlQ2FsbGJhY2tzKG1ab29tQ29udHJvbFJ1bm5hYmxlKTsKLSAgICAgICAgICAgICAgICBtUHJpdmF0ZUhhbmRsZXIucG9zdERlbGF5ZWQobVpvb21Db250cm9sUnVubmFibGUsCi0gICAgICAgICAgICAgICAgICAgICAgICBaT09NX0NPTlRST0xTX1RJTUVPVVQpOwotICAgICAgICAgICAgICAgIHpvb21JbigpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICAgICAgem9vbUNvbnRyb2xzLnNldE9uWm9vbU91dENsaWNrTGlzdGVuZXIobmV3IE9uQ2xpY2tMaXN0ZW5lcigpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uQ2xpY2soVmlldyB2KSB7Ci0gICAgICAgICAgICAgICAgLy8gcmVzZXQgdGltZSBvdXQKLSAgICAgICAgICAgICAgICBtUHJpdmF0ZUhhbmRsZXIucmVtb3ZlQ2FsbGJhY2tzKG1ab29tQ29udHJvbFJ1bm5hYmxlKTsKLSAgICAgICAgICAgICAgICBtUHJpdmF0ZUhhbmRsZXIucG9zdERlbGF5ZWQobVpvb21Db250cm9sUnVubmFibGUsCi0gICAgICAgICAgICAgICAgICAgICAgICBaT09NX0NPTlRST0xTX1RJTUVPVVQpOwotICAgICAgICAgICAgICAgIHpvb21PdXQoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgICAgIHJldHVybiB6b29tQ29udHJvbHM7CisgICAgdm9pZCBkaXNtaXNzWm9vbUNvbnRyb2woKSB7CisgICAgICAgIG1ab29tTWFuYWdlci5kaXNtaXNzWm9vbVBpY2tlcigpOworICAgIH0KKworICAgIGZsb2F0IGdldERlZmF1bHRab29tU2NhbGUoKSB7CisgICAgICAgIHJldHVybiBtWm9vbU1hbmFnZXIuZ2V0RGVmYXVsdFNjYWxlKCk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogR2V0cyB0aGUge0BsaW5rIFpvb21CdXR0b25zQ29udHJvbGxlcn0gd2hpY2ggY2FuIGJlIHVzZWQgdG8gYWRkCi0gICAgICogYWRkaXRpb25hbCBidXR0b25zIHRvIHRoZSB6b29tIGNvbnRyb2xzIHdpbmRvdy4KLSAgICAgKgotICAgICAqIEByZXR1cm4gVGhlIGluc3RhbmNlIG9mIHtAbGluayBab29tQnV0dG9uc0NvbnRyb2xsZXJ9IHVzZWQgYnkgdGhpcyBjbGFzcywKLSAgICAgKiAgICAgICAgIG9yIG51bGwgaWYgaXQgaXMgdW5hdmFpbGFibGUuCi0gICAgICogQGhpZGUKKyAgICAgKiBAcmV0dXJuIFRSVUUgaWYgdGhlIFdlYlZpZXcgY2FuIGJlIHpvb21lZCBpbi4KICAgICAgKi8KLSAgICBwdWJsaWMgWm9vbUJ1dHRvbnNDb250cm9sbGVyIGdldFpvb21CdXR0b25zQ29udHJvbGxlcigpIHsKLSAgICAgICAgaWYgKG1ab29tQnV0dG9uc0NvbnRyb2xsZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgbVpvb21CdXR0b25zQ29udHJvbGxlciA9IG5ldyBab29tQnV0dG9uc0NvbnRyb2xsZXIodGhpcyk7Ci0gICAgICAgICAgICBtWm9vbUJ1dHRvbnNDb250cm9sbGVyLnNldE9uWm9vbUxpc3RlbmVyKG1ab29tTGlzdGVuZXIpOwotICAgICAgICAgICAgLy8gWm9vbUJ1dHRvbnNDb250cm9sbGVyIHBvc2l0aW9ucyB0aGUgYnV0dG9ucyBhdCB0aGUgYm90dG9tLCBidXQgaW4KLSAgICAgICAgICAgIC8vIHRoZSBtaWRkbGUuIENoYW5nZSB0aGVpciBsYXlvdXQgcGFyYW1ldGVycyBzbyB0aGV5IGFwcGVhciBvbiB0aGUKLSAgICAgICAgICAgIC8vIHJpZ2h0LgotICAgICAgICAgICAgVmlldyBjb250cm9scyA9IG1ab29tQnV0dG9uc0NvbnRyb2xsZXIuZ2V0Wm9vbUNvbnRyb2xzKCk7Ci0gICAgICAgICAgICBWaWV3R3JvdXAuTGF5b3V0UGFyYW1zIHBhcmFtcyA9IGNvbnRyb2xzLmdldExheW91dFBhcmFtcygpOwotICAgICAgICAgICAgaWYgKHBhcmFtcyBpbnN0YW5jZW9mIEZyYW1lTGF5b3V0LkxheW91dFBhcmFtcykgewotICAgICAgICAgICAgICAgIEZyYW1lTGF5b3V0LkxheW91dFBhcmFtcyBmcmFtZVBhcmFtcyA9IChGcmFtZUxheW91dC5MYXlvdXRQYXJhbXMpIHBhcmFtczsKLSAgICAgICAgICAgICAgICBmcmFtZVBhcmFtcy5ncmF2aXR5ID0gR3Jhdml0eS5SSUdIVDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbVpvb21CdXR0b25zQ29udHJvbGxlcjsKKyAgICBwdWJsaWMgYm9vbGVhbiBjYW5ab29tSW4oKSB7CisgICAgICAgIHJldHVybiBtWm9vbU1hbmFnZXIuY2FuWm9vbUluKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHJldHVybiBUUlVFIGlmIHRoZSBXZWJWaWV3IGNhbiBiZSB6b29tZWQgb3V0LgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGNhblpvb21PdXQoKSB7CisgICAgICAgIHJldHVybiBtWm9vbU1hbmFnZXIuY2FuWm9vbU91dCgpOwogICAgIH0KIAogICAgIC8qKgpAQCAtNjE2MCwxNSArNjAyNCw3IEBACiAgICAgICogQHJldHVybiBUUlVFIGlmIHpvb20gaW4gc3VjY2VlZHMuIEZBTFNFIGlmIG5vIHpvb20gY2hhbmdlcy4KICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiB6b29tSW4oKSB7Ci0gICAgICAgIC8vIFRPRE86IGFsdGVybmF0aXZlbHkgd2UgY2FuIGRpc2FsbG93IHRoaXMgZHVyaW5nIGRyYXcgaGlzdG9yeSBtb2RlCi0gICAgICAgIHN3aXRjaE91dERyYXdIaXN0b3J5KCk7Ci0gICAgICAgIG1Jblpvb21PdmVydmlldyA9IGZhbHNlOwotICAgICAgICAvLyBDZW50ZXIgem9vbWluZyB0byB0aGUgY2VudGVyIG9mIHRoZSBzY3JlZW4uCi0gICAgICAgIG1ab29tQ2VudGVyWCA9IGdldFZpZXdXaWR0aCgpICogLjVmOwotICAgICAgICBtWm9vbUNlbnRlclkgPSBnZXRWaWV3SGVpZ2h0KCkgKiAuNWY7Ci0gICAgICAgIG1BbmNob3JYID0gdmlld1RvQ29udGVudFgoKGludCkgbVpvb21DZW50ZXJYICsgbVNjcm9sbFgpOwotICAgICAgICBtQW5jaG9yWSA9IHZpZXdUb0NvbnRlbnRZKChpbnQpIG1ab29tQ2VudGVyWSArIG1TY3JvbGxZKTsKLSAgICAgICAgcmV0dXJuIHpvb21XaXRoUHJldmlldyhtQWN0dWFsU2NhbGUgKiAxLjI1ZiwgdHJ1ZSk7CisgICAgICAgIHJldHVybiBtWm9vbU1hbmFnZXIuem9vbUluKCk7CiAgICAgfQogCiAgICAgLyoqCkBAIC02MTc2LDE0ICs2MDMyLDcgQEAKICAgICAgKiBAcmV0dXJuIFRSVUUgaWYgem9vbSBvdXQgc3VjY2VlZHMuIEZBTFNFIGlmIG5vIHpvb20gY2hhbmdlcy4KICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiB6b29tT3V0KCkgewotICAgICAgICAvLyBUT0RPOiBhbHRlcm5hdGl2ZWx5IHdlIGNhbiBkaXNhbGxvdyB0aGlzIGR1cmluZyBkcmF3IGhpc3RvcnkgbW9kZQotICAgICAgICBzd2l0Y2hPdXREcmF3SGlzdG9yeSgpOwotICAgICAgICAvLyBDZW50ZXIgem9vbWluZyB0byB0aGUgY2VudGVyIG9mIHRoZSBzY3JlZW4uCi0gICAgICAgIG1ab29tQ2VudGVyWCA9IGdldFZpZXdXaWR0aCgpICogLjVmOwotICAgICAgICBtWm9vbUNlbnRlclkgPSBnZXRWaWV3SGVpZ2h0KCkgKiAuNWY7Ci0gICAgICAgIG1BbmNob3JYID0gdmlld1RvQ29udGVudFgoKGludCkgbVpvb21DZW50ZXJYICsgbVNjcm9sbFgpOwotICAgICAgICBtQW5jaG9yWSA9IHZpZXdUb0NvbnRlbnRZKChpbnQpIG1ab29tQ2VudGVyWSArIG1TY3JvbGxZKTsKLSAgICAgICAgcmV0dXJuIHpvb21XaXRoUHJldmlldyhtQWN0dWFsU2NhbGUgKiAwLjhmLCB0cnVlKTsKKyAgICAgICAgcmV0dXJuIG1ab29tTWFuYWdlci56b29tT3V0KCk7CiAgICAgfQogCiAgICAgcHJpdmF0ZSB2b2lkIHVwZGF0ZVNlbGVjdGlvbigpIHsKQEAgLTYyODQsNyArNjEzMywxNCBAQAogICAgICAgICAvLyBtTGFzdFRvdWNoWCBhbmQgbUxhc3RUb3VjaFkgYXJlIHRoZSBwb2ludCBpbiB0aGUgY3VycmVudCB2aWV3cG9ydAogICAgICAgICBpbnQgY29udGVudFggPSB2aWV3VG9Db250ZW50WCgoaW50KSBtTGFzdFRvdWNoWCArIG1TY3JvbGxYKTsKICAgICAgICAgaW50IGNvbnRlbnRZID0gdmlld1RvQ29udGVudFkoKGludCkgbUxhc3RUb3VjaFkgKyBtU2Nyb2xsWSk7Ci0gICAgICAgIGlmIChuYXRpdmVQb2ludEluTmF2Q2FjaGUoY29udGVudFgsIGNvbnRlbnRZLCBtTmF2U2xvcCkpIHsKKyAgICAgICAgaWYgKGdldFNldHRpbmdzKCkuc3VwcG9ydFRvdWNoT25seSgpKSB7CisgICAgICAgICAgICByZW1vdmVUb3VjaEhpZ2hsaWdodChmYWxzZSk7CisgICAgICAgICAgICBXZWJWaWV3Q29yZS5Ub3VjaFVwRGF0YSB0b3VjaFVwRGF0YSA9IG5ldyBXZWJWaWV3Q29yZS5Ub3VjaFVwRGF0YSgpOworICAgICAgICAgICAgLy8gdXNlICIwIiBhcyBnZW5lcmF0aW9uIGlkIHRvIGluZm9ybSBXZWJLaXQgdG8gdXNlIHRoZSBzYW1lIHgveSBhcworICAgICAgICAgICAgLy8gaXQgdXNlZCB3aGVuIHByb2Nlc3NpbmcgR0VUX1RPVUNIX0hJR0hMSUdIVF9SRUNUUworICAgICAgICAgICAgdG91Y2hVcERhdGEubU1vdmVHZW5lcmF0aW9uID0gMDsKKyAgICAgICAgICAgIG1XZWJWaWV3Q29yZS5zZW5kTWVzc2FnZShFdmVudEh1Yi5UT1VDSF9VUCwgdG91Y2hVcERhdGEpOworICAgICAgICB9IGVsc2UgaWYgKG5hdGl2ZVBvaW50SW5OYXZDYWNoZShjb250ZW50WCwgY29udGVudFksIG1OYXZTbG9wKSkgewogICAgICAgICAgICAgV2ViVmlld0NvcmUuTW90aW9uVXBEYXRhIG1vdGlvblVwRGF0YSA9IG5ldyBXZWJWaWV3Q29yZQogICAgICAgICAgICAgICAgICAgICAuTW90aW9uVXBEYXRhKCk7CiAgICAgICAgICAgICBtb3Rpb25VcERhdGEubUZyYW1lID0gbmF0aXZlQ2FjaGVIaXRGcmFtZVBvaW50ZXIoKTsKQEAgLTYzMTIsMjcgKzYxNjgsMTYgQEAKICAgICAgKiBSZXR1cm4gdHJ1ZSBpZiB0aGUgdmlldyAoUGx1Z2luKSBpcyBmdWxseSB2aXNpYmxlIGFuZCBtYXhpbWl6ZWQgaW5zaWRlCiAgICAgICogdGhlIFdlYlZpZXcuCiAgICAgICovCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzUGx1Z2luRml0T25TY3JlZW4oVmlld01hbmFnZXIuQ2hpbGRWaWV3IHZpZXcpIHsKLSAgICAgICAgaW50IHZpZXdXaWR0aCA9IGdldFZpZXdXaWR0aCgpOwotICAgICAgICBpbnQgdmlld0hlaWdodCA9IGdldFZpZXdIZWlnaHRXaXRoVGl0bGUoKTsKLSAgICAgICAgZmxvYXQgc2NhbGUgPSBNYXRoLm1pbigoZmxvYXQpIHZpZXdXaWR0aCAvIHZpZXcud2lkdGgsCi0gICAgICAgICAgICAgICAgKGZsb2F0KSB2aWV3SGVpZ2h0IC8gdmlldy5oZWlnaHQpOwotICAgICAgICBpZiAoc2NhbGUgPCBtTWluWm9vbVNjYWxlKSB7Ci0gICAgICAgICAgICBzY2FsZSA9IG1NaW5ab29tU2NhbGU7Ci0gICAgICAgIH0gZWxzZSBpZiAoc2NhbGUgPiBtTWF4Wm9vbVNjYWxlKSB7Ci0gICAgICAgICAgICBzY2FsZSA9IG1NYXhab29tU2NhbGU7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKE1hdGguYWJzKHNjYWxlIC0gbUFjdHVhbFNjYWxlKSA8IE1JTklNVU1fU0NBTEVfSU5DUkVNRU5UKSB7Ci0gICAgICAgICAgICBpZiAoY29udGVudFRvVmlld1godmlldy54KSA+PSBtU2Nyb2xsWAotICAgICAgICAgICAgICAgICAgICAmJiBjb250ZW50VG9WaWV3WCh2aWV3LnggKyB2aWV3LndpZHRoKSA8PSBtU2Nyb2xsWAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgdmlld1dpZHRoCi0gICAgICAgICAgICAgICAgICAgICYmIGNvbnRlbnRUb1ZpZXdZKHZpZXcueSkgPj0gbVNjcm9sbFkKLSAgICAgICAgICAgICAgICAgICAgJiYgY29udGVudFRvVmlld1kodmlldy55ICsgdmlldy5oZWlnaHQpIDw9IG1TY3JvbGxZCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyB2aWV3SGVpZ2h0KSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIGJvb2xlYW4gaXNQbHVnaW5GaXRPblNjcmVlbihWaWV3TWFuYWdlci5DaGlsZFZpZXcgdmlldykgeworICAgICAgICBmaW5hbCBpbnQgdmlld1dpZHRoID0gZ2V0Vmlld1dpZHRoKCk7CisgICAgICAgIGZpbmFsIGludCB2aWV3SGVpZ2h0ID0gZ2V0Vmlld0hlaWdodFdpdGhUaXRsZSgpOworICAgICAgICBmbG9hdCBzY2FsZSA9IE1hdGgubWluKChmbG9hdCkgdmlld1dpZHRoIC8gdmlldy53aWR0aCwgKGZsb2F0KSB2aWV3SGVpZ2h0IC8gdmlldy5oZWlnaHQpOworICAgICAgICBzY2FsZSA9IG1ab29tTWFuYWdlci5jb21wdXRlU2NhbGVXaXRoTGltaXRzKHNjYWxlKTsKKyAgICAgICAgcmV0dXJuICFtWm9vbU1hbmFnZXIud2lsbFNjYWxlVHJpZ2dlclpvb20oc2NhbGUpCisgICAgICAgICAgICAgICAgJiYgY29udGVudFRvVmlld1godmlldy54KSA+PSBtU2Nyb2xsWAorICAgICAgICAgICAgICAgICYmIGNvbnRlbnRUb1ZpZXdYKHZpZXcueCArIHZpZXcud2lkdGgpIDw9IG1TY3JvbGxYICsgdmlld1dpZHRoCisgICAgICAgICAgICAgICAgJiYgY29udGVudFRvVmlld1kodmlldy55KSA+PSBtU2Nyb2xsWQorICAgICAgICAgICAgICAgICYmIGNvbnRlbnRUb1ZpZXdZKHZpZXcueSArIHZpZXcuaGVpZ2h0KSA8PSBtU2Nyb2xsWSArIHZpZXdIZWlnaHQ7CiAgICAgfQogCiAgICAgLyoKQEAgLTYzNDEsMjIgKzYxODYsMTkgQEAKICAgICAgKiBhbmltYXRlZCBzY3JvbGwgdG8gY2VudGVyIGl0LiBJZiB0aGUgem9vbSBuZWVkcyB0byBiZSBjaGFuZ2VkLCBmaW5kIHRoZQogICAgICAqIHpvb20gY2VudGVyIGFuZCBkbyBhIHNtb290aCB6b29tIHRyYW5zaXRpb24uCiAgICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGNlbnRlckZpdFJlY3QoaW50IGRvY1gsIGludCBkb2NZLCBpbnQgZG9jV2lkdGgsIGludCBkb2NIZWlnaHQpIHsKKyAgICB2b2lkIGNlbnRlckZpdFJlY3QoaW50IGRvY1gsIGludCBkb2NZLCBpbnQgZG9jV2lkdGgsIGludCBkb2NIZWlnaHQpIHsKICAgICAgICAgaW50IHZpZXdXaWR0aCA9IGdldFZpZXdXaWR0aCgpOwogICAgICAgICBpbnQgdmlld0hlaWdodCA9IGdldFZpZXdIZWlnaHRXaXRoVGl0bGUoKTsKICAgICAgICAgZmxvYXQgc2NhbGUgPSBNYXRoLm1pbigoZmxvYXQpIHZpZXdXaWR0aCAvIGRvY1dpZHRoLCAoZmxvYXQpIHZpZXdIZWlnaHQKICAgICAgICAgICAgICAgICAvIGRvY0hlaWdodCk7Ci0gICAgICAgIGlmIChzY2FsZSA8IG1NaW5ab29tU2NhbGUpIHsKLSAgICAgICAgICAgIHNjYWxlID0gbU1pblpvb21TY2FsZTsKLSAgICAgICAgfSBlbHNlIGlmIChzY2FsZSA+IG1NYXhab29tU2NhbGUpIHsKLSAgICAgICAgICAgIHNjYWxlID0gbU1heFpvb21TY2FsZTsKLSAgICAgICAgfQotICAgICAgICBpZiAoTWF0aC5hYnMoc2NhbGUgLSBtQWN0dWFsU2NhbGUpIDwgTUlOSU1VTV9TQ0FMRV9JTkNSRU1FTlQpIHsKKyAgICAgICAgc2NhbGUgPSBtWm9vbU1hbmFnZXIuY29tcHV0ZVNjYWxlV2l0aExpbWl0cyhzY2FsZSk7CisgICAgICAgIGlmICghbVpvb21NYW5hZ2VyLndpbGxTY2FsZVRyaWdnZXJab29tKHNjYWxlKSkgewogICAgICAgICAgICAgcGluU2Nyb2xsVG8oY29udGVudFRvVmlld1goZG9jWCArIGRvY1dpZHRoIC8gMikgLSB2aWV3V2lkdGggLyAyLAogICAgICAgICAgICAgICAgICAgICBjb250ZW50VG9WaWV3WShkb2NZICsgZG9jSGVpZ2h0IC8gMikgLSB2aWV3SGVpZ2h0IC8gMiwKICAgICAgICAgICAgICAgICAgICAgdHJ1ZSwgMCk7CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBmbG9hdCBvbGRTY3JlZW5YID0gZG9jWCAqIG1BY3R1YWxTY2FsZSAtIG1TY3JvbGxYOworICAgICAgICAgICAgZmxvYXQgYWN0dWFsU2NhbGUgPSBtWm9vbU1hbmFnZXIuZ2V0U2NhbGUoKTsKKyAgICAgICAgICAgIGZsb2F0IG9sZFNjcmVlblggPSBkb2NYICogYWN0dWFsU2NhbGUgLSBtU2Nyb2xsWDsKICAgICAgICAgICAgIGZsb2F0IHJlY3RWaWV3WCA9IGRvY1ggKiBzY2FsZTsKICAgICAgICAgICAgIGZsb2F0IHJlY3RWaWV3V2lkdGggPSBkb2NXaWR0aCAqIHNjYWxlOwogICAgICAgICAgICAgZmxvYXQgbmV3TWF4V2lkdGggPSBtQ29udGVudFdpZHRoICogc2NhbGU7CkBAIC02MzY3LDkgKzYyMDksOSBAQAogICAgICAgICAgICAgfSBlbHNlIGlmIChuZXdTY3JlZW5YID4gKG5ld01heFdpZHRoIC0gcmVjdFZpZXdYIC0gcmVjdFZpZXdXaWR0aCkpIHsKICAgICAgICAgICAgICAgICBuZXdTY3JlZW5YID0gdmlld1dpZHRoIC0gKG5ld01heFdpZHRoIC0gcmVjdFZpZXdYKTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1ab29tQ2VudGVyWCA9IChvbGRTY3JlZW5YICogc2NhbGUgLSBuZXdTY3JlZW5YICogbUFjdHVhbFNjYWxlKQotICAgICAgICAgICAgICAgICAgICAvIChzY2FsZSAtIG1BY3R1YWxTY2FsZSk7Ci0gICAgICAgICAgICBmbG9hdCBvbGRTY3JlZW5ZID0gZG9jWSAqIG1BY3R1YWxTY2FsZSArIGdldFRpdGxlSGVpZ2h0KCkKKyAgICAgICAgICAgIGZsb2F0IHpvb21DZW50ZXJYID0gKG9sZFNjcmVlblggKiBzY2FsZSAtIG5ld1NjcmVlblggKiBhY3R1YWxTY2FsZSkKKyAgICAgICAgICAgICAgICAgICAgLyAoc2NhbGUgLSBhY3R1YWxTY2FsZSk7CisgICAgICAgICAgICBmbG9hdCBvbGRTY3JlZW5ZID0gZG9jWSAqIGFjdHVhbFNjYWxlICsgZ2V0VGl0bGVIZWlnaHQoKQogICAgICAgICAgICAgICAgICAgICAtIG1TY3JvbGxZOwogICAgICAgICAgICAgZmxvYXQgcmVjdFZpZXdZID0gZG9jWSAqIHNjYWxlICsgZ2V0VGl0bGVIZWlnaHQoKTsKICAgICAgICAgICAgIGZsb2F0IHJlY3RWaWV3SGVpZ2h0ID0gZG9jSGVpZ2h0ICogc2NhbGU7CkBAIC02MzgxLDEwOSArNjIyMywxMCBAQAogICAgICAgICAgICAgfSBlbHNlIGlmIChuZXdTY3JlZW5ZID4gKG5ld01heEhlaWdodCAtIHJlY3RWaWV3WSAtIHJlY3RWaWV3SGVpZ2h0KSkgewogICAgICAgICAgICAgICAgIG5ld1NjcmVlblkgPSB2aWV3SGVpZ2h0IC0gKG5ld01heEhlaWdodCAtIHJlY3RWaWV3WSk7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBtWm9vbUNlbnRlclkgPSAob2xkU2NyZWVuWSAqIHNjYWxlIC0gbmV3U2NyZWVuWSAqIG1BY3R1YWxTY2FsZSkKLSAgICAgICAgICAgICAgICAgICAgLyAoc2NhbGUgLSBtQWN0dWFsU2NhbGUpOwotICAgICAgICAgICAgem9vbVdpdGhQcmV2aWV3KHNjYWxlLCBmYWxzZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICB2b2lkIGRpc21pc3Nab29tQ29udHJvbCgpIHsKLSAgICAgICAgaWYgKG1XZWJWaWV3Q29yZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAvLyBtYXliZSBjYWxsZWQgYWZ0ZXIgV2ViVmlldydzIGRlc3Ryb3koKS4gQXMgd2UgY2FuJ3QgZ2V0IHNldHRpbmdzLAotICAgICAgICAgICAgLy8ganVzdCBoaWRlIHpvb20gY29udHJvbCBmb3IgYm90aCBzdHlsZXMuCi0gICAgICAgICAgICBpZiAobVpvb21CdXR0b25zQ29udHJvbGxlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbVpvb21CdXR0b25zQ29udHJvbGxlci5zZXRWaXNpYmxlKGZhbHNlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChtWm9vbUNvbnRyb2xzICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtWm9vbUNvbnRyb2xzLmhpZGUoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBXZWJTZXR0aW5ncyBzZXR0aW5ncyA9IGdldFNldHRpbmdzKCk7Ci0gICAgICAgIGlmIChzZXR0aW5ncy5nZXRCdWlsdEluWm9vbUNvbnRyb2xzKCkpIHsKLSAgICAgICAgICAgIGlmIChtWm9vbUJ1dHRvbnNDb250cm9sbGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtWm9vbUJ1dHRvbnNDb250cm9sbGVyLnNldFZpc2libGUoZmFsc2UpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaWYgKG1ab29tQ29udHJvbFJ1bm5hYmxlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtUHJpdmF0ZUhhbmRsZXIucmVtb3ZlQ2FsbGJhY2tzKG1ab29tQ29udHJvbFJ1bm5hYmxlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChtWm9vbUNvbnRyb2xzICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtWm9vbUNvbnRyb2xzLmhpZGUoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vIFJ1bGUgZm9yIGRvdWJsZSB0YXA6Ci0gICAgLy8gMS4gaWYgdGhlIGN1cnJlbnQgc2NhbGUgaXMgbm90IHNhbWUgYXMgdGhlIHRleHQgd3JhcCBzY2FsZSBhbmQgbGF5b3V0Ci0gICAgLy8gICAgYWxnb3JpdGhtIGlzIE5BUlJPV19DT0xVTU5TLCBmaXQgdG8gY29sdW1uOwotICAgIC8vIDIuIGlmIHRoZSBjdXJyZW50IHN0YXRlIGlzIG5vdCBvdmVydmlldyBtb2RlLCBjaGFuZ2UgdG8gb3ZlcnZpZXcgbW9kZTsKLSAgICAvLyAzLiBpZiB0aGUgY3VycmVudCBzdGF0ZSBpcyBvdmVydmlldyBtb2RlLCBjaGFuZ2UgdG8gZGVmYXVsdCBzY2FsZS4KLSAgICBwcml2YXRlIHZvaWQgZG9Eb3VibGVUYXAoKSB7Ci0gICAgICAgIGlmIChtV2ViVmlld0NvcmUuZ2V0U2V0dGluZ3MoKS5nZXRVc2VXaWRlVmlld1BvcnQoKSA9PSBmYWxzZSkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIG1ab29tQ2VudGVyWCA9IG1MYXN0VG91Y2hYOwotICAgICAgICBtWm9vbUNlbnRlclkgPSBtTGFzdFRvdWNoWTsKLSAgICAgICAgbUFuY2hvclggPSB2aWV3VG9Db250ZW50WCgoaW50KSBtWm9vbUNlbnRlclggKyBtU2Nyb2xsWCk7Ci0gICAgICAgIG1BbmNob3JZID0gdmlld1RvQ29udGVudFkoKGludCkgbVpvb21DZW50ZXJZICsgbVNjcm9sbFkpOwotICAgICAgICBXZWJTZXR0aW5ncyBzZXR0aW5ncyA9IGdldFNldHRpbmdzKCk7Ci0gICAgICAgIHNldHRpbmdzLnNldERvdWJsZVRhcFRvYXN0Q291bnQoMCk7Ci0gICAgICAgIC8vIHJlbW92ZSB0aGUgem9vbSBjb250cm9sIGFmdGVyIGRvdWJsZSB0YXAKLSAgICAgICAgZGlzbWlzc1pvb21Db250cm9sKCk7Ci0gICAgICAgIFZpZXdNYW5hZ2VyLkNoaWxkVmlldyBwbHVnaW4gPSBtVmlld01hbmFnZXIuaGl0VGVzdChtQW5jaG9yWCwgbUFuY2hvclkpOwotICAgICAgICBpZiAocGx1Z2luICE9IG51bGwpIHsKLSAgICAgICAgICAgIGlmIChpc1BsdWdpbkZpdE9uU2NyZWVuKHBsdWdpbikpIHsKLSAgICAgICAgICAgICAgICBtSW5ab29tT3ZlcnZpZXcgPSB0cnVlOwotICAgICAgICAgICAgICAgIC8vIEZvcmNlIHRoZSB0aXRsZWJhciBmdWxseSByZXZlYWwgaW4gb3ZlcnZpZXcgbW9kZQotICAgICAgICAgICAgICAgIGlmIChtU2Nyb2xsWSA8IGdldFRpdGxlSGVpZ2h0KCkpIG1TY3JvbGxZID0gMDsKLSAgICAgICAgICAgICAgICB6b29tV2l0aFByZXZpZXcoKGZsb2F0KSBnZXRWaWV3V2lkdGgoKSAvIG1ab29tT3ZlcnZpZXdXaWR0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgIHRydWUpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBtSW5ab29tT3ZlcnZpZXcgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICBjZW50ZXJGaXRSZWN0KHBsdWdpbi54LCBwbHVnaW4ueSwgcGx1Z2luLndpZHRoLCBwbHVnaW4uaGVpZ2h0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBib29sZWFuIHpvb21Ub0RlZmF1bHQgPSBmYWxzZTsKLSAgICAgICAgaWYgKChzZXR0aW5ncy5nZXRMYXlvdXRBbGdvcml0aG0oKSA9PSBXZWJTZXR0aW5ncy5MYXlvdXRBbGdvcml0aG0uTkFSUk9XX0NPTFVNTlMpCi0gICAgICAgICAgICAgICAgJiYgKE1hdGguYWJzKG1BY3R1YWxTY2FsZSAtIG1UZXh0V3JhcFNjYWxlKSA+PSBNSU5JTVVNX1NDQUxFX0lOQ1JFTUVOVCkpIHsKLSAgICAgICAgICAgIHNldE5ld1pvb21TY2FsZShtQWN0dWFsU2NhbGUsIHRydWUsIHRydWUpOwotICAgICAgICAgICAgZmxvYXQgb3ZlcnZpZXdTY2FsZSA9IChmbG9hdCkgZ2V0Vmlld1dpZHRoKCkgLyBtWm9vbU92ZXJ2aWV3V2lkdGg7Ci0gICAgICAgICAgICBpZiAoTWF0aC5hYnMobUFjdHVhbFNjYWxlIC0gb3ZlcnZpZXdTY2FsZSkgPCBNSU5JTVVNX1NDQUxFX0lOQ1JFTUVOVCkgewotICAgICAgICAgICAgICAgIG1Jblpvb21PdmVydmlldyA9IHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZiAoIW1Jblpvb21PdmVydmlldykgewotICAgICAgICAgICAgZmxvYXQgbmV3U2NhbGUgPSAoZmxvYXQpIGdldFZpZXdXaWR0aCgpIC8gbVpvb21PdmVydmlld1dpZHRoOwotICAgICAgICAgICAgaWYgKE1hdGguYWJzKG1BY3R1YWxTY2FsZSAtIG5ld1NjYWxlKSA+PSBNSU5JTVVNX1NDQUxFX0lOQ1JFTUVOVCkgewotICAgICAgICAgICAgICAgIG1Jblpvb21PdmVydmlldyA9IHRydWU7Ci0gICAgICAgICAgICAgICAgLy8gRm9yY2UgdGhlIHRpdGxlYmFyIGZ1bGx5IHJldmVhbCBpbiBvdmVydmlldyBtb2RlCi0gICAgICAgICAgICAgICAgaWYgKG1TY3JvbGxZIDwgZ2V0VGl0bGVIZWlnaHQoKSkgbVNjcm9sbFkgPSAwOwotICAgICAgICAgICAgICAgIHpvb21XaXRoUHJldmlldyhuZXdTY2FsZSwgdHJ1ZSk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKE1hdGguYWJzKG1BY3R1YWxTY2FsZSAtIG1EZWZhdWx0U2NhbGUpID49IE1JTklNVU1fU0NBTEVfSU5DUkVNRU5UKSB7Ci0gICAgICAgICAgICAgICAgem9vbVRvRGVmYXVsdCA9IHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB6b29tVG9EZWZhdWx0ID0gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICBpZiAoem9vbVRvRGVmYXVsdCkgewotICAgICAgICAgICAgbUluWm9vbU92ZXJ2aWV3ID0gZmFsc2U7Ci0gICAgICAgICAgICBpbnQgbGVmdCA9IG5hdGl2ZUdldEJsb2NrTGVmdEVkZ2UobUFuY2hvclgsIG1BbmNob3JZLCBtQWN0dWFsU2NhbGUpOwotICAgICAgICAgICAgaWYgKGxlZnQgIT0gTk9fTEVGVEVER0UpIHsKLSAgICAgICAgICAgICAgICAvLyBhZGQgYSA1cHQgcGFkZGluZyB0byB0aGUgbGVmdCBlZGdlLgotICAgICAgICAgICAgICAgIGludCB2aWV3TGVmdCA9IGNvbnRlbnRUb1ZpZXdYKGxlZnQgPCA1ID8gMCA6IChsZWZ0IC0gNSkpCi0gICAgICAgICAgICAgICAgICAgICAgICAtIG1TY3JvbGxYOwotICAgICAgICAgICAgICAgIC8vIFJlLWNhbGN1bGF0ZSB0aGUgem9vbSBjZW50ZXIgc28gdGhhdCB0aGUgbmV3IHNjcm9sbCB4IHdpbGwgYmUKLSAgICAgICAgICAgICAgICAvLyBvbiB0aGUgbGVmdCBlZGdlLgotICAgICAgICAgICAgICAgIGlmICh2aWV3TGVmdCA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgbVpvb21DZW50ZXJYID0gdmlld0xlZnQgKiBtRGVmYXVsdFNjYWxlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyAobURlZmF1bHRTY2FsZSAtIG1BY3R1YWxTY2FsZSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgc2Nyb2xsQnkodmlld0xlZnQsIDApOwotICAgICAgICAgICAgICAgICAgICBtWm9vbUNlbnRlclggPSAwOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHpvb21XaXRoUHJldmlldyhtRGVmYXVsdFNjYWxlLCB0cnVlKTsKKyAgICAgICAgICAgIGZsb2F0IHpvb21DZW50ZXJZID0gKG9sZFNjcmVlblkgKiBzY2FsZSAtIG5ld1NjcmVlblkgKiBhY3R1YWxTY2FsZSkKKyAgICAgICAgICAgICAgICAgICAgLyAoc2NhbGUgLSBhY3R1YWxTY2FsZSk7CisgICAgICAgICAgICBtWm9vbU1hbmFnZXIuc2V0Wm9vbUNlbnRlcih6b29tQ2VudGVyWCwgem9vbUNlbnRlclkpOworICAgICAgICAgICAgbVpvb21NYW5hZ2VyLnN0YXJ0Wm9vbUFuaW1hdGlvbihzY2FsZSwgZmFsc2UpOwogICAgICAgICB9CiAgICAgfQogCkBAIC02NDk1LDYgKzYyMzgsOSBAQAogCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGJvb2xlYW4gcmVxdWVzdEZvY3VzKGludCBkaXJlY3Rpb24sIFJlY3QgcHJldmlvdXNseUZvY3VzZWRSZWN0KSB7CisgICAgICAgIC8vIEZJWE1FOiBJZiBhIHN1YndpbmRvdyBpcyBzaG93aW5nIGZpbmQsIGFuZCB0aGUgdXNlciB0b3VjaGVzIHRoZQorICAgICAgICAvLyBiYWNrZ3JvdW5kIHdpbmRvdywgaXQgY2FuIHN0ZWFsIGZvY3VzLgorICAgICAgICBpZiAobUZpbmRJc1VwKSByZXR1cm4gZmFsc2U7CiAgICAgICAgIGJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7CiAgICAgICAgIGlmIChpbkVkaXRpbmdNb2RlKCkpIHsKICAgICAgICAgICAgIHJlc3VsdCA9IG1XZWJUZXh0Vmlldy5yZXF1ZXN0Rm9jdXMoZGlyZWN0aW9uLApAQCAtNjU4Miw2ICs2MzI4LDEyIEBACiAgICAgcHVibGljIGJvb2xlYW4gcmVxdWVzdENoaWxkUmVjdGFuZ2xlT25TY3JlZW4oVmlldyBjaGlsZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZWN0IHJlY3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBpbW1lZGlhdGUpIHsKKyAgICAgICAgLy8gZG9uJ3Qgc2Nyb2xsIHdoaWxlIGluIHpvb20gYW5pbWF0aW9uLiBXaGVuIGl0IGlzIGRvbmUsIHdlIHdpbGwgYWRqdXN0CisgICAgICAgIC8vIHRoZSBuZWNlc3NhcnkgY29tcG9uZW50cyAoZS5nLiwgV2ViVGV4dFZpZXcgaWYgaXQgaXMgaW4gZWRpdGluZyBtb2RlKQorICAgICAgICBpZiAobVpvb21NYW5hZ2VyLmlzRml4ZWRMZW5ndGhBbmltYXRpb25JblByb2dyZXNzKCkpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCiAgICAgICAgIHJlY3Qub2Zmc2V0KGNoaWxkLmdldExlZnQoKSAtIGNoaWxkLmdldFNjcm9sbFgoKSwKICAgICAgICAgICAgICAgICBjaGlsZC5nZXRUb3AoKSAtIGNoaWxkLmdldFNjcm9sbFkoKSk7CiAKQEAgLTY3MjQsNyArNjQ3Niw4IEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGNhc2UgU1dJVENIX1RPX1NIT1JUUFJFU1M6IHsKICAgICAgICAgICAgICAgICAgICAgaWYgKG1Ub3VjaE1vZGUgPT0gVE9VQ0hfSU5JVF9NT0RFKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobVByZXZlbnREZWZhdWx0ICE9IFBSRVZFTlRfREVGQVVMVF9ZRVMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZ2V0U2V0dGluZ3MoKS5zdXBwb3J0VG91Y2hPbmx5KCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgbVByZXZlbnREZWZhdWx0ICE9IFBSRVZFTlRfREVGQVVMVF9ZRVMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtVG91Y2hNb2RlID0gVE9VQ0hfU0hPUlRQUkVTU19TVEFSVF9NT0RFOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZVNlbGVjdGlvbigpOwogICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKQEAgLTY3MzgsNiArNjQ5MSw5IEBACiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBjYXNlIFNXSVRDSF9UT19MT05HUFJFU1M6IHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGdldFNldHRpbmdzKCkuc3VwcG9ydFRvdWNoT25seSgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZW1vdmVUb3VjaEhpZ2hsaWdodChmYWxzZSk7CisgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgaWYgKGluRnVsbFNjcmVlbk1vZGUoKSB8fCBtRGVmZXJUb3VjaFByb2Nlc3MpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIFRvdWNoRXZlbnREYXRhIHRlZCA9IG5ldyBUb3VjaEV2ZW50RGF0YSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgdGVkLm1BY3Rpb24gPSBXZWJWaWV3Q29yZS5BQ1RJT05fTE9OR1BSRVNTOwpAQCAtNjc0OSwxNSArNjUwNSwxMCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2ltcGxpY2l0eSBmb3Igbm93LCB3ZSBkb24ndCBzZXQgaXQuCiAgICAgICAgICAgICAgICAgICAgICAgICB0ZWQubU1ldGFTdGF0ZSA9IDA7CiAgICAgICAgICAgICAgICAgICAgICAgICB0ZWQubVJlcHJvY2VzcyA9IG1EZWZlclRvdWNoUHJvY2VzczsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtRGVmZXJUb3VjaFByb2Nlc3MpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZWQubVZpZXdYID0gbUxhc3RUb3VjaFg7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVkLm1WaWV3WSA9IG1MYXN0VG91Y2hZOwotICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgbVdlYlZpZXdDb3JlLnNlbmRNZXNzYWdlKEV2ZW50SHViLlRPVUNIX0VWRU5ULCB0ZWQpOwogICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG1QcmV2ZW50RGVmYXVsdCAhPSBQUkVWRU5UX0RFRkFVTFRfWUVTKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBtVG91Y2hNb2RlID0gVE9VQ0hfRE9ORV9NT0RFOwogICAgICAgICAgICAgICAgICAgICAgICAgcGVyZm9ybUxvbmdDbGljaygpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmVidWlsZFdlYlRleHRWaWV3KCk7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgfQpAQCAtNjc5MCw3MCArNjU0MSwzNiBAQAogICAgICAgICAgICAgICAgICAgICBzcGF3bkNvbnRlbnRTY3JvbGxUbyhtc2cuYXJnMSwgbXNnLmFyZzIpOwogICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICBjYXNlIFVQREFURV9aT09NX1JBTkdFOiB7Ci0gICAgICAgICAgICAgICAgICAgIFdlYlZpZXdDb3JlLlJlc3RvcmVTdGF0ZSByZXN0b3JlU3RhdGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IChXZWJWaWV3Q29yZS5SZXN0b3JlU3RhdGUpIG1zZy5vYmo7CisgICAgICAgICAgICAgICAgICAgIFdlYlZpZXdDb3JlLlZpZXdTdGF0ZSB2aWV3U3RhdGUgPSAoV2ViVmlld0NvcmUuVmlld1N0YXRlKSBtc2cub2JqOwogICAgICAgICAgICAgICAgICAgICAvLyBtU2Nyb2xsWCBjb250YWlucyB0aGUgbmV3IG1pblByZWZXaWR0aAotICAgICAgICAgICAgICAgICAgICB1cGRhdGVab29tUmFuZ2UocmVzdG9yZVN0YXRlLCBnZXRWaWV3V2lkdGgoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN0b3JlU3RhdGUubVNjcm9sbFgsIGZhbHNlKTsKKyAgICAgICAgICAgICAgICAgICAgbVpvb21NYW5hZ2VyLnVwZGF0ZVpvb21SYW5nZSh2aWV3U3RhdGUsIGdldFZpZXdXaWR0aCgpLCB2aWV3U3RhdGUubVNjcm9sbFgpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY2FzZSBSRVBMQUNFX0JBU0VfQ09OVEVOVDogeworICAgICAgICAgICAgICAgICAgICBuYXRpdmVSZXBsYWNlQmFzZUNvbnRlbnQobXNnLmFyZzEpOwogICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgY2FzZSBORVdfUElDVFVSRV9NU0dfSUQ6IHsKLSAgICAgICAgICAgICAgICAgICAgLy8gSWYgd2UndmUgcHJldmlvdXNseSBkZWxheWVkIGRlbGV0aW5nIGEgcm9vdAotICAgICAgICAgICAgICAgICAgICAvLyBsYXllciwgZG8gaXQgbm93LgotICAgICAgICAgICAgICAgICAgICBpZiAobURlbGF5ZWREZWxldGVSb290TGF5ZXIpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1EZWxheWVkRGVsZXRlUm9vdExheWVyID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgICAgICBuYXRpdmVTZXRSb290TGF5ZXIoMCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgV2ViU2V0dGluZ3Mgc2V0dGluZ3MgPSBtV2ViVmlld0NvcmUuZ2V0U2V0dGluZ3MoKTsKICAgICAgICAgICAgICAgICAgICAgLy8gY2FsbGVkIGZvciBuZXcgY29udGVudAotICAgICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgdmlld1dpZHRoID0gZ2V0Vmlld1dpZHRoKCk7Ci0gICAgICAgICAgICAgICAgICAgIGZpbmFsIFdlYlZpZXdDb3JlLkRyYXdEYXRhIGRyYXcgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChXZWJWaWV3Q29yZS5EcmF3RGF0YSkgbXNnLm9iajsKKyAgICAgICAgICAgICAgICAgICAgZmluYWwgV2ViVmlld0NvcmUuRHJhd0RhdGEgZHJhdyA9IChXZWJWaWV3Q29yZS5EcmF3RGF0YSkgbXNnLm9iajsKKyAgICAgICAgICAgICAgICAgICAgbmF0aXZlU2V0QmFzZUxheWVyKGRyYXcubUJhc2VMYXllcik7CiAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFBvaW50IHZpZXdTaXplID0gZHJhdy5tVmlld1BvaW50OwotICAgICAgICAgICAgICAgICAgICBib29sZWFuIHVzZVdpZGVWaWV3cG9ydCA9IHNldHRpbmdzLmdldFVzZVdpZGVWaWV3UG9ydCgpOwotICAgICAgICAgICAgICAgICAgICBXZWJWaWV3Q29yZS5SZXN0b3JlU3RhdGUgcmVzdG9yZVN0YXRlID0gZHJhdy5tUmVzdG9yZVN0YXRlOwotICAgICAgICAgICAgICAgICAgICBib29sZWFuIGhhc1Jlc3RvcmVTdGF0ZSA9IHJlc3RvcmVTdGF0ZSAhPSBudWxsOwotICAgICAgICAgICAgICAgICAgICBpZiAoaGFzUmVzdG9yZVN0YXRlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGVab29tUmFuZ2UocmVzdG9yZVN0YXRlLCB2aWV3U2l6ZS54LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkcmF3Lm1NaW5QcmVmV2lkdGgsIHRydWUpOworICAgICAgICAgICAgICAgICAgICBXZWJWaWV3Q29yZS5WaWV3U3RhdGUgdmlld1N0YXRlID0gZHJhdy5tVmlld1N0YXRlOworICAgICAgICAgICAgICAgICAgICBib29sZWFuIGlzUGljdHVyZUFmdGVyRmlyc3RMYXlvdXQgPSB2aWV3U3RhdGUgIT0gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGlzUGljdHVyZUFmdGVyRmlyc3RMYXlvdXQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIFJlc2V0IHRoZSBsYXN0IHNlbnQgZGF0YSBoZXJlIHNpbmNlIGRlYWxpbmcgd2l0aCBuZXcgcGFnZS4KKyAgICAgICAgICAgICAgICAgICAgICAgIG1MYXN0V2lkdGhTZW50ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1ab29tTWFuYWdlci5vbkZpcnN0TGF5b3V0KGRyYXcpOwogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFtRHJhd0hpc3RvcnkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtSW5ab29tT3ZlcnZpZXcgPSBmYWxzZTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtSW5pdGlhbFNjYWxlSW5QZXJjZW50ID4gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXROZXdab29tU2NhbGUobUluaXRpYWxTY2FsZUluUGVyY2VudCAvIDEwMC4wZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Jbml0aWFsU2NhbGVJblBlcmNlbnQgIT0gbVRleHRXcmFwU2NhbGUgKiAxMDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChyZXN0b3JlU3RhdGUubVZpZXdTY2FsZSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVRleHRXcmFwU2NhbGUgPSByZXN0b3JlU3RhdGUubVRleHRXcmFwU2NhbGU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldE5ld1pvb21TY2FsZShyZXN0b3JlU3RhdGUubVZpZXdTY2FsZSwgZmFsc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUluWm9vbU92ZXJ2aWV3ID0gdXNlV2lkZVZpZXdwb3J0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBzZXR0aW5ncy5nZXRMb2FkV2l0aE92ZXJ2aWV3TW9kZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBzY2FsZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1Jblpvb21PdmVydmlldykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NhbGUgPSAoZmxvYXQpIHZpZXdXaWR0aAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8gREVGQVVMVF9WSUVXUE9SVF9XSURUSDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjYWxlID0gcmVzdG9yZVN0YXRlLm1UZXh0V3JhcFNjYWxlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldE5ld1pvb21TY2FsZShzY2FsZSwgTWF0aC5hYnMoc2NhbGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gbVRleHRXcmFwU2NhbGUpID49IE1JTklNVU1fU0NBTEVfSU5DUkVNRU5ULAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRDb250ZW50U2Nyb2xsVG8ocmVzdG9yZVN0YXRlLm1TY3JvbGxYLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN0b3JlU3RhdGUubVNjcm9sbFkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldENvbnRlbnRTY3JvbGxUbyh2aWV3U3RhdGUubVNjcm9sbFgsIHZpZXdTdGF0ZS5tU2Nyb2xsWSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQXMgd2UgYXJlIG9uIGEgbmV3IHBhZ2UsIHJlbW92ZSB0aGUgV2ViVGV4dFZpZXcuIFRoaXMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpcyBuZWNlc3NhcnkgZm9yIHBhZ2UgbG9hZHMgZHJpdmVuIGJ5IHdlYmtpdCwgYW5kIGluCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcGFydGljdWxhciB3aGVuIHRoZSB1c2VyIHdhcyBvbiBhIHBhc3N3b3JkIGZpZWxkLCBzbwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBXZWJUZXh0VmlldyB3YXMgdmlzaWJsZS4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGVhclRleHRFbnRyeShmYWxzZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdXBkYXRlIHRoZSB6b29tIGJ1dHRvbnMgYXMgdGhlIHNjYWxlIGNhbiBiZSBjaGFuZ2VkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGdldFNldHRpbmdzKCkuZ2V0QnVpbHRJblpvb21Db250cm9scygpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZVpvb21CdXR0b25zRW5hYmxlZCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGVhclRleHRFbnRyeSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICB9CisKICAgICAgICAgICAgICAgICAgICAgLy8gV2UgdXBkYXRlIHRoZSBsYXlvdXQgKGkuZS4gcmVxdWVzdCBhIGxheW91dCBmcm9tIHRoZQogICAgICAgICAgICAgICAgICAgICAvLyB2aWV3IHN5c3RlbSkgaWYgdGhlIGxhc3QgdmlldyBzaXplIHRoYXQgd2Ugc2VudCB0bwogICAgICAgICAgICAgICAgICAgICAvLyBXZWJDb3JlIG1hdGNoZXMgdGhlIHZpZXcgc2l6ZSBvZiB0aGUgcGljdHVyZSB3ZSBqdXN0CkBAIC02ODYxLDQ1ICs2NTc4LDI1IEBACiAgICAgICAgICAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gdXBkYXRlTGF5b3V0ID0gdmlld1NpemUueCA9PSBtTGFzdFdpZHRoU2VudAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIHZpZXdTaXplLnkgPT0gbUxhc3RIZWlnaHRTZW50OwogICAgICAgICAgICAgICAgICAgICByZWNvcmROZXdDb250ZW50U2l6ZShkcmF3Lm1XaWR0aEhlaWdodC54LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRyYXcubVdpZHRoSGVpZ2h0LnkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArIChtRmluZElzVXAgPyBtRmluZEhlaWdodCA6IDApLCB1cGRhdGVMYXlvdXQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRyYXcubVdpZHRoSGVpZ2h0LnksIHVwZGF0ZUxheW91dCk7CiAgICAgICAgICAgICAgICAgICAgIGlmIChEZWJ1Z0ZsYWdzLldFQl9WSUVXKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBSZWN0IGIgPSBkcmF3Lm1JbnZhbFJlZ2lvbi5nZXRCb3VuZHMoKTsKICAgICAgICAgICAgICAgICAgICAgICAgIExvZy52KExPR1RBRywgIk5FV19QSUNUVVJFX01TR19JRCB7IiArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGIubGVmdCsiLCIrYi50b3ArIiwiK2IucmlnaHQrIiwiK2IuYm90dG9tKyJ9Iik7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgaW52YWxpZGF0ZUNvbnRlbnRSZWN0KGRyYXcubUludmFsUmVnaW9uLmdldEJvdW5kcygpKTsKKwogICAgICAgICAgICAgICAgICAgICBpZiAobVBpY3R1cmVMaXN0ZW5lciAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBtUGljdHVyZUxpc3RlbmVyLm9uTmV3UGljdHVyZShXZWJWaWV3LnRoaXMsIGNhcHR1cmVQaWN0dXJlKCkpOwogICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGlmICh1c2VXaWRlVmlld3BvcnQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxpbWl0IG1ab29tT3ZlcnZpZXdXaWR0aCB1cHBlciBib3VuZCB0bwotICAgICAgICAgICAgICAgICAgICAgICAgLy8gc01heFZpZXdwb3J0V2lkdGggc28gdGhhdCBpZiB0aGUgcGFnZSBkb2Vzbid0IGJlaGF2ZQotICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2VsbCwgdGhlIFdlYlZpZXcgd29uJ3QgZ28gaW5zYW5lLiBsaW1pdCB0aGUgbG93ZXIKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJvdW5kIHRvIG1hdGNoIHRoZSBkZWZhdWx0IHNjYWxlIGZvciBtb2JpbGUgc2l0ZXMuCi0gICAgICAgICAgICAgICAgICAgICAgICBtWm9vbU92ZXJ2aWV3V2lkdGggPSBNYXRoLm1pbihzTWF4Vmlld3BvcnRXaWR0aCwgTWF0aAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAubWF4KChpbnQpICh2aWV3V2lkdGggLyBtRGVmYXVsdFNjYWxlKSwgTWF0aAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5tYXgoZHJhdy5tTWluUHJlZldpZHRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHJhdy5tVmlld1BvaW50LngpKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYgKCFtTWluWm9vbVNjYWxlRml4ZWQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1NaW5ab29tU2NhbGUgPSAoZmxvYXQpIHZpZXdXaWR0aCAvIG1ab29tT3ZlcnZpZXdXaWR0aDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpZiAoIW1EcmF3SGlzdG9yeSAmJiBtSW5ab29tT3ZlcnZpZXcpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZpdCB0aGUgY29udGVudCB3aWR0aCB0byB0aGUgY3VycmVudCB2aWV3LiBJZ25vcmUKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSByb3VuZGluZyBlcnJvciBjYXNlLgotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKE1hdGguYWJzKCh2aWV3V2lkdGggKiBtSW52QWN0dWFsU2NhbGUpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gbVpvb21PdmVydmlld1dpZHRoKSA+IDEpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXROZXdab29tU2NhbGUoKGZsb2F0KSB2aWV3V2lkdGgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8gbVpvb21PdmVydmlld1dpZHRoLCBNYXRoLmFicyhtQWN0dWFsU2NhbGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gbVRleHRXcmFwU2NhbGUpIDwgTUlOSU1VTV9TQ0FMRV9JTkNSRU1FTlQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAvLyB1cGRhdGUgdGhlIHpvb20gaW5mb3JtYXRpb24gYmFzZWQgb24gdGhlIG5ldyBwaWN0dXJlCisgICAgICAgICAgICAgICAgICAgIG1ab29tTWFuYWdlci5vbk5ld1BpY3R1cmUoZHJhdyk7CisKICAgICAgICAgICAgICAgICAgICAgaWYgKGRyYXcubUZvY3VzU2l6ZUNoYW5nZWQgJiYgaW5FZGl0aW5nTW9kZSgpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBtRm9jdXNTaXplQ2hhbmdlZCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGhhc1Jlc3RvcmVTdGF0ZSkgeworICAgICAgICAgICAgICAgICAgICBpZiAoaXNQaWN0dXJlQWZ0ZXJGaXJzdExheW91dCkgewogICAgICAgICAgICAgICAgICAgICAgICAgbVZpZXdNYW5hZ2VyLnBvc3RSZWFkeVRvRHJhd0FsbCgpOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwpAQCAtNjkzMywxNCArNjYzMCw4IEBACiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIGNhc2UgUkVRVUVTVF9LRVlCT0FSRF9XSVRIX1NFTEVDVElPTl9NU0dfSUQ6CiAgICAgICAgICAgICAgICAgICAgIGRpc3BsYXlTb2Z0S2V5Ym9hcmQodHJ1ZSk7Ci0gICAgICAgICAgICAgICAgICAgIHVwZGF0ZVRleHRTZWxlY3Rpb25Gcm9tTWVzc2FnZShtc2cuYXJnMSwgbXNnLmFyZzIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKFdlYlZpZXdDb3JlLlRleHRTZWxlY3Rpb25EYXRhKSBtc2cub2JqKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIC8vIGZhbGwgdGhyb3VnaCB0byBVUERBVEVfVEVYVF9TRUxFQ1RJT05fTVNHX0lECiAgICAgICAgICAgICAgICAgY2FzZSBVUERBVEVfVEVYVF9TRUxFQ1RJT05fTVNHX0lEOgotICAgICAgICAgICAgICAgICAgICAvLyBJZiBubyB0ZXh0ZmllbGQgd2FzIGluIGZvY3VzLCBhbmQgdGhlIHVzZXIgdG91Y2hlZCBvbmUsCi0gICAgICAgICAgICAgICAgICAgIC8vIGNhdXNpbmcgaXQgdG8gc2VuZCB0aGlzIG1lc3NhZ2UsIHRoZW4gV2ViVGV4dFZpZXcgaGFzIG5vdAotICAgICAgICAgICAgICAgICAgICAvLyBiZWVuIHNldCB1cCB5ZXQuICBSZWJ1aWxkIGl0IHNvIGl0IGNhbiBzZXQgaXRzIHNlbGVjdGlvbi4KLSAgICAgICAgICAgICAgICAgICAgcmVidWlsZFdlYlRleHRWaWV3KCk7CiAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZVRleHRTZWxlY3Rpb25Gcm9tTWVzc2FnZShtc2cuYXJnMSwgbXNnLmFyZzIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFdlYlZpZXdDb3JlLlRleHRTZWxlY3Rpb25EYXRhKSBtc2cub2JqKTsKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CkBAIC02OTU4LDcgKzY2NDksNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgTU9WRV9PVVRfT0ZfUExVR0lOOgorICAgICAgICAgICAgICAgIGNhc2UgVU5IQU5ETEVEX05BVl9LRVk6CiAgICAgICAgICAgICAgICAgICAgIG5hdkhhbmRsZWRLZXkobXNnLmFyZzEsIDEsIGZhbHNlLCAwKTsKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgY2FzZSBVUERBVEVfVEVYVF9FTlRSWV9NU0dfSUQ6CkBAIC02OTcwLDcgKzY2NjEsNyBAQAogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIGNhc2UgQ0xFQVJfVEVYVF9FTlRSWToKLSAgICAgICAgICAgICAgICAgICAgY2xlYXJUZXh0RW50cnkoZmFsc2UpOworICAgICAgICAgICAgICAgICAgICBjbGVhclRleHRFbnRyeSgpOwogICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICBjYXNlIElOVkFMX1JFQ1RfTVNHX0lEOiB7CiAgICAgICAgICAgICAgICAgICAgIFJlY3QgciA9IChSZWN0KW1zZy5vYmo7CkBAIC02OTgzLDIzICs2Njc0LDYgQEAKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY2FzZSBJTU1FRElBVEVfUkVQQUlOVF9NU0dfSUQ6IHsKLSAgICAgICAgICAgICAgICAgICAgaW52YWxpZGF0ZSgpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY2FzZSBTRVRfUk9PVF9MQVlFUl9NU0dfSUQ6IHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKDAgPT0gbXNnLmFyZzEpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIE51bGwgaW5kaWNhdGVzIGRlbGV0aW5nIHRoZSBvbGQgbGF5ZXIsIGJ1dAotICAgICAgICAgICAgICAgICAgICAgICAgLy8gZG9uJ3QgYWN0dWFsbHkgZG8gc28gdW50aWwgd2UndmUgZ290IHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgLy8gbmV3IHBhZ2UgdG8gZGlzcGxheS4KLSAgICAgICAgICAgICAgICAgICAgICAgIG1EZWxheWVkRGVsZXRlUm9vdExheWVyID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1EZWxheWVkRGVsZXRlUm9vdExheWVyID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgICAgICBuYXRpdmVTZXRSb290TGF5ZXIobXNnLmFyZzEpOwotICAgICAgICAgICAgICAgICAgICAgICAgaW52YWxpZGF0ZSgpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBjYXNlIFJFUVVFU1RfRk9STV9EQVRBOgogICAgICAgICAgICAgICAgICAgICBBdXRvQ29tcGxldGVBZGFwdGVyIGFkYXB0ZXIgPSAoQXV0b0NvbXBsZXRlQWRhcHRlcikgbXNnLm9iajsKICAgICAgICAgICAgICAgICAgICAgaWYgKG1XZWJUZXh0Vmlldy5pc1NhbWVUZXh0RmllbGQobXNnLmFyZzEpKSB7CkBAIC03MDQzLDQzICs2NzE3LDQ2IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVByZXZlbnREZWZhdWx0ID0gbXNnLmFyZzIgPT0gMSA/IFBSRVZFTlRfREVGQVVMVF9ZRVMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogUFJFVkVOVF9ERUZBVUxUX05POwogICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1QcmV2ZW50RGVmYXVsdCA9PSBQUkVWRU5UX0RFRkFVTFRfWUVTKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVRvdWNoSGlnaGxpZ2h0UmVnaW9uLnNldEVtcHR5KCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobXNnLmFyZzIgPT0gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgLy8gcHJldmVudCBkZWZhdWx0IGlzIG5vdCBjYWxsZWQgaW4gV2ViQ29yZSwgc28gdGhlCiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBtZXNzYWdlIG5lZWRzIHRvIGJlIHJlcHJvY2Vzc2VkIGluIFVJCiAgICAgICAgICAgICAgICAgICAgICAgICBUb3VjaEV2ZW50RGF0YSB0ZWQgPSAoVG91Y2hFdmVudERhdGEpIG1zZy5vYmo7CiAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHRlZC5tQWN0aW9uKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBNb3Rpb25FdmVudC5BQ1RJT05fRE9XTjoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUxhc3REZWZlclRvdWNoWCA9IHRlZC5tVmlld1g7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1MYXN0RGVmZXJUb3VjaFkgPSB0ZWQubVZpZXdZOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTGFzdERlZmVyVG91Y2hYID0gY29udGVudFRvVmlld1godGVkLm1YKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gbVNjcm9sbFg7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1MYXN0RGVmZXJUb3VjaFkgPSBjb250ZW50VG9WaWV3WSh0ZWQubVkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBtU2Nyb2xsWTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbURlZmVyVG91Y2hNb2RlID0gVE9VQ0hfSU5JVF9NT0RFOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIE1vdGlvbkV2ZW50LkFDVElPTl9NT1ZFOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5vIHNuYXBwaW5nIGluIGRlZmVyIHByb2Nlc3MKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHggPSBjb250ZW50VG9WaWV3WCh0ZWQubVgpIC0gbVNjcm9sbFg7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB5ID0gY29udGVudFRvVmlld1kodGVkLm1ZKSAtIG1TY3JvbGxZOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobURlZmVyVG91Y2hNb2RlICE9IFRPVUNIX0RSQUdfTU9ERSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbURlZmVyVG91Y2hNb2RlID0gVE9VQ0hfRFJBR19NT0RFOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUxhc3REZWZlclRvdWNoWCA9IHRlZC5tVmlld1g7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTGFzdERlZmVyVG91Y2hZID0gdGVkLm1WaWV3WTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1MYXN0RGVmZXJUb3VjaFggPSB4OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUxhc3REZWZlclRvdWNoWSA9IHk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydERyYWcoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVsdGFYID0gcGluTG9jWCgoaW50KSAobVNjcm9sbFgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIG1MYXN0RGVmZXJUb3VjaFggLSB0ZWQubVZpZXdYKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIG1MYXN0RGVmZXJUb3VjaFggLSB4KSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIG1TY3JvbGxYOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVsdGFZID0gcGluTG9jWSgoaW50KSAobVNjcm9sbFkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIG1MYXN0RGVmZXJUb3VjaFkgLSB0ZWQubVZpZXdZKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIG1MYXN0RGVmZXJUb3VjaFkgLSB5KSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIG1TY3JvbGxZOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb0RyYWcoZGVsdGFYLCBkZWx0YVkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVsdGFYICE9IDApIG1MYXN0RGVmZXJUb3VjaFggPSB0ZWQubVZpZXdYOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVsdGFZICE9IDApIG1MYXN0RGVmZXJUb3VjaFkgPSB0ZWQubVZpZXdZOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVsdGFYICE9IDApIG1MYXN0RGVmZXJUb3VjaFggPSB4OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVsdGFZICE9IDApIG1MYXN0RGVmZXJUb3VjaFkgPSB5OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBNb3Rpb25FdmVudC5BQ1RJT05fVVA6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBNb3Rpb25FdmVudC5BQ1RJT05fQ0FOQ0VMOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobURlZmVyVG91Y2hNb2RlID09IFRPVUNIX0RSQUdfTU9ERSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbm8gZmxpbmcgaW4gZGVmZXIgcHJvY2VzcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVNjcm9sbGVyLnNwcmluZ2JhY2sobVNjcm9sbFgsIG1TY3JvbGxZLCAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wdXRlTWF4U2Nyb2xsWCgpLCAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wdXRlTWF4U2Nyb2xsWSgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludmFsaWRhdGUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdlYlZpZXdDb3JlLnJlc3VtZVByaW9yaXR5KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXZWJWaWV3Q29yZS5yZXN1bWVVcGRhdGVQaWN0dXJlKG1XZWJWaWV3Q29yZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KQEAgLTcwODcsOSArNjc2NCw5IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgV2ViVmlld0NvcmUuQUNUSU9OX0RPVUJMRVRBUDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZG9Eb3VibGVUYXAoKSBuZWVkcyBtTGFzdFRvdWNoWC9ZIGFzIGFuY2hvcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTGFzdFRvdWNoWCA9IHRlZC5tVmlld1g7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1MYXN0VG91Y2hZID0gdGVkLm1WaWV3WTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9Eb3VibGVUYXAoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUxhc3RUb3VjaFggPSBjb250ZW50VG9WaWV3WCh0ZWQubVgpIC0gbVNjcm9sbFg7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1MYXN0VG91Y2hZID0gY29udGVudFRvVmlld1kodGVkLm1ZKSAtIG1TY3JvbGxZOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtWm9vbU1hbmFnZXIuaGFuZGxlRG91YmxlVGFwKG1MYXN0VG91Y2hYLCBtTGFzdFRvdWNoWSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1EZWZlclRvdWNoTW9kZSA9IFRPVUNIX0RPTkVfTU9ERTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBXZWJWaWV3Q29yZS5BQ1RJT05fTE9OR1BSRVNTOgpAQCAtNzA5Nyw3ICs2Nzc0LDYgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGhpdFRlc3QgIT0gbnVsbCAmJiBoaXRUZXN0Lm1UeXBlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIT0gSGl0VGVzdFJlc3VsdC5VTktOT1dOX1RZUEUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlcmZvcm1Mb25nQ2xpY2soKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYnVpbGRXZWJUZXh0VmlldygpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1EZWZlclRvdWNoTW9kZSA9IFRPVUNIX0RPTkVfTU9ERTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CkBAIC03MTE1LDggKzY3OTEsOCBAQAogCiAgICAgICAgICAgICAgICAgY2FzZSBGSU5EX0FHQUlOOgogICAgICAgICAgICAgICAgICAgICAvLyBJZ25vcmUgaWYgZmluZCBoYXMgYmVlbiBkaXNtaXNzZWQuCi0gICAgICAgICAgICAgICAgICAgIGlmIChtRmluZElzVXApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZpbmRBbGwobUxhc3RGaW5kKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1GaW5kSXNVcCAmJiBtRmluZENhbGxiYWNrICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1GaW5kQ2FsbGJhY2suZmluZEFsbCgpOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogCkBAIC03MjIxLDcgKzY4OTcsNiBAQAogCiAgICAgICAgICAgICAgICAgY2FzZSBDRU5URVJfRklUX1JFQ1Q6CiAgICAgICAgICAgICAgICAgICAgIFJlY3QgciA9IChSZWN0KW1zZy5vYmo7Ci0gICAgICAgICAgICAgICAgICAgIG1Jblpvb21PdmVydmlldyA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgICBjZW50ZXJGaXRSZWN0KHIubGVmdCwgci50b3AsIHIud2lkdGgoKSwgci5oZWlnaHQoKSk7CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogCkBAIC03MjMwLDYgKzY5MDUsNDMgQEAKICAgICAgICAgICAgICAgICAgICAgbVZlcnRpY2FsU2Nyb2xsQmFyTW9kZSA9IG1zZy5hcmcyOwogICAgICAgICAgICAgICAgICAgICBicmVhazsKIAorICAgICAgICAgICAgICAgIGNhc2UgU0VMRUNUSU9OX1NUUklOR19DSEFOR0VEOgorICAgICAgICAgICAgICAgICAgICBpZiAobUFjY2Vzc2liaWxpdHlJbmplY3RvciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgc2VsZWN0aW9uU3RyaW5nID0gKFN0cmluZykgbXNnLm9iajsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1BY2Nlc3NpYmlsaXR5SW5qZWN0b3Iub25TZWxlY3Rpb25TdHJpbmdDaGFuZ2Uoc2VsZWN0aW9uU3RyaW5nKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGNhc2UgU0VUX1RPVUNIX0hJR0hMSUdIVF9SRUNUUzoKKyAgICAgICAgICAgICAgICAgICAgaW52YWxpZGF0ZShtVG91Y2hIaWdobGlnaHRSZWdpb24uZ2V0Qm91bmRzKCkpOworICAgICAgICAgICAgICAgICAgICBtVG91Y2hIaWdobGlnaHRSZWdpb24uc2V0RW1wdHkoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1zZy5vYmogIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlMaXN0PFJlY3Q+IHJlY3RzID0gKEFycmF5TGlzdDxSZWN0PikgbXNnLm9iajsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoUmVjdCByZWN0IDogcmVjdHMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZWN0IHZpZXdSZWN0ID0gY29udGVudFRvVmlld1JlY3QocmVjdCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc29tZSBzaXRlcywgbGlrZSBzdG9yaWVzIGluIG55dGltZXMuY29tLCBzZXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBtb3VzZSBldmVudCBoYW5kbGVyIGluIHRoZSB0b3AgZGl2LiBJdCBpcyBub3QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB1c2VyIGZyaWVuZGx5IHRvIGhpZ2hsaWdodCB0aGUgZGl2IGlmIGl0IGNvdmVycworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1vcmUgdGhhbiBoYWxmIG9mIHRoZSBzY3JlZW4uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZpZXdSZWN0LndpZHRoKCkgPCBnZXRXaWR0aCgpID4+IDEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IHZpZXdSZWN0LmhlaWdodCgpIDwgZ2V0SGVpZ2h0KCkgPj4gMSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtVG91Y2hIaWdobGlnaHRSZWdpb24udW5pb24odmlld1JlY3QpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnZhbGlkYXRlKHZpZXdSZWN0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2cudyhMT0dUQUcsICJTa2lwIHRoZSBodWdlIHNlbGVjdGlvbiByZWN0OiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHZpZXdSZWN0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlIFNBVkVfV0VCQVJDSElWRV9GSU5JU0hFRDoKKyAgICAgICAgICAgICAgICAgICAgU2F2ZVdlYkFyY2hpdmVNZXNzYWdlIHNhdmVNZXNzYWdlID0gKFNhdmVXZWJBcmNoaXZlTWVzc2FnZSltc2cub2JqOworICAgICAgICAgICAgICAgICAgICBpZiAoc2F2ZU1lc3NhZ2UubUNhbGxiYWNrICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNhdmVNZXNzYWdlLm1DYWxsYmFjay5vblJlY2VpdmVWYWx1ZShzYXZlTWVzc2FnZS5tUmVzdWx0RmlsZSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKICAgICAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgICAgICBzdXBlci5oYW5kbGVNZXNzYWdlKG1zZyk7CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwpAQCAtNzUzNywzNyArNzI0OSw2IEBACiAgICAgICAgICAgICAgICAgbmV3IEludm9rZUxpc3RCb3goYXJyYXksIGVuYWJsZWRBcnJheSwgc2VsZWN0ZWRBcnJheSkpOwogICAgIH0KIAotICAgIHByaXZhdGUgdm9pZCB1cGRhdGVab29tUmFuZ2UoV2ViVmlld0NvcmUuUmVzdG9yZVN0YXRlIHJlc3RvcmVTdGF0ZSwKLSAgICAgICAgICAgIGludCB2aWV3V2lkdGgsIGludCBtaW5QcmVmV2lkdGgsIGJvb2xlYW4gdXBkYXRlWm9vbU92ZXJ2aWV3KSB7Ci0gICAgICAgIGlmIChyZXN0b3JlU3RhdGUubU1pblNjYWxlID09IDApIHsKLSAgICAgICAgICAgIGlmIChyZXN0b3JlU3RhdGUubU1vYmlsZVNpdGUpIHsKLSAgICAgICAgICAgICAgICBpZiAobWluUHJlZldpZHRoID4gTWF0aC5tYXgoMCwgdmlld1dpZHRoKSkgewotICAgICAgICAgICAgICAgICAgICBtTWluWm9vbVNjYWxlID0gKGZsb2F0KSB2aWV3V2lkdGggLyBtaW5QcmVmV2lkdGg7Ci0gICAgICAgICAgICAgICAgICAgIG1NaW5ab29tU2NhbGVGaXhlZCA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICBpZiAodXBkYXRlWm9vbU92ZXJ2aWV3KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBXZWJTZXR0aW5ncyBzZXR0aW5ncyA9IGdldFNldHRpbmdzKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtSW5ab29tT3ZlcnZpZXcgPSBzZXR0aW5ncy5nZXRVc2VXaWRlVmlld1BvcnQoKSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5ncy5nZXRMb2FkV2l0aE92ZXJ2aWV3TW9kZSgpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgbU1pblpvb21TY2FsZSA9IHJlc3RvcmVTdGF0ZS5tRGVmYXVsdFNjYWxlOwotICAgICAgICAgICAgICAgICAgICBtTWluWm9vbVNjYWxlRml4ZWQgPSB0cnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgbU1pblpvb21TY2FsZSA9IERFRkFVTFRfTUlOX1pPT01fU0NBTEU7Ci0gICAgICAgICAgICAgICAgbU1pblpvb21TY2FsZUZpeGVkID0gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtTWluWm9vbVNjYWxlID0gcmVzdG9yZVN0YXRlLm1NaW5TY2FsZTsKLSAgICAgICAgICAgIG1NaW5ab29tU2NhbGVGaXhlZCA9IHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHJlc3RvcmVTdGF0ZS5tTWF4U2NhbGUgPT0gMCkgewotICAgICAgICAgICAgbU1heFpvb21TY2FsZSA9IERFRkFVTFRfTUFYX1pPT01fU0NBTEU7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtTWF4Wm9vbVNjYWxlID0gcmVzdG9yZVN0YXRlLm1NYXhTY2FsZTsKLSAgICAgICAgfQotICAgIH0KLQogICAgIC8qCiAgICAgICogUmVxdWVzdCBhIGRyb3Bkb3duIG1lbnUgZm9yIGEgbGlzdGJveCB3aXRoIHNpbmdsZSBzZWxlY3Rpb24gb3IgYSBzaW5nbGUKICAgICAgKiA8c2VsZWN0PiBlbGVtZW50LgpAQCAtNzYwNiw3ICs3Mjg3LDcgQEAKICAgICAgKi8KICAgICBwcml2YXRlIHZvaWQgc2VuZE1vdmVNb3VzZUlmTGF0ZXN0KGJvb2xlYW4gcmVtb3ZlRm9jdXMpIHsKICAgICAgICAgaWYgKHJlbW92ZUZvY3VzKSB7Ci0gICAgICAgICAgICBjbGVhclRleHRFbnRyeSh0cnVlKTsKKyAgICAgICAgICAgIGNsZWFyVGV4dEVudHJ5KCk7CiAgICAgICAgIH0KICAgICAgICAgbVdlYlZpZXdDb3JlLnNlbmRNZXNzYWdlKEV2ZW50SHViLlNFVF9NT1ZFX01PVVNFX0lGX0xBVEVTVCwKICAgICAgICAgICAgICAgICBjdXJzb3JEYXRhKCkpOwpAQCAtNzY1MCw3ICs3MzMxLDcgQEAKICAgICAgICAgLy8gRklYTUUgdGhlIGRpdmlzb3Igc2hvdWxkIGJlIHJldHJpZXZlZCBmcm9tIHNvbWV3aGVyZQogICAgICAgICAvLyB0aGUgY2xvc2VzdCB0aGluZyB0b2RheSBpcyBoYXJkLWNvZGVkIGludG8gU2Nyb2xsVmlldy5qYXZhCiAgICAgICAgIC8vIChmcm9tIFNjcm9sbFZpZXcuamF2YSwgbGluZSAzNjMpICAgaW50IG1heEp1bXAgPSBoZWlnaHQvMjsKLSAgICAgICAgcmV0dXJuIE1hdGgucm91bmQoaGVpZ2h0ICogbUludkFjdHVhbFNjYWxlKTsKKyAgICAgICAgcmV0dXJuIE1hdGgucm91bmQoaGVpZ2h0ICogbVpvb21NYW5hZ2VyLmdldEludlNjYWxlKCkpOwogICAgIH0KIAogICAgIC8qKgpAQCAtNzY2MSwxMCArNzM0MiwxMCBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFBhc3MgdGhlIGtleSB0byB0aGUgcGx1Z2luLiAgVGhpcyBhc3N1bWVzIHRoYXQgbmF0aXZlRm9jdXNJc1BsdWdpbigpCi0gICAgICogcmV0dXJuZWQgdHJ1ZS4KKyAgICAgKiBQYXNzIHRoZSBrZXkgZGlyZWN0bHkgdG8gdGhlIHBhZ2UuICBUaGlzIGFzc3VtZXMgdGhhdAorICAgICAqIG5hdGl2ZVBhZ2VTaG91bGRIYW5kbGVTaGlmdEFuZEFycm93cygpIHJldHVybmVkIHRydWUuCiAgICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGxldFBsdWdpbkhhbmRsZU5hdktleShpbnQga2V5Q29kZSwgbG9uZyB0aW1lLCBib29sZWFuIGRvd24pIHsKKyAgICBwcml2YXRlIHZvaWQgbGV0UGFnZUhhbmRsZU5hdktleShpbnQga2V5Q29kZSwgbG9uZyB0aW1lLCBib29sZWFuIGRvd24pIHsKICAgICAgICAgaW50IGtleUV2ZW50QWN0aW9uOwogICAgICAgICBpbnQgZXZlbnRIdWJBY3Rpb247CiAgICAgICAgIGlmIChkb3duKSB7CkBAIC03NzM5LDYgKzc0MjAsMTYgQEAKICAgICB9CiAKICAgICAvKioKKyAgICAgKiBAcmV0dXJuIElmIHRoZSBwYWdlIHNob3VsZCByZWNlaXZlIFNoaWZ0IGFuZCBhcnJvd3MuCisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIHBhZ2VTaG91bGRIYW5kbGVTaGlmdEFuZEFycm93cygpIHsKKyAgICAgICAgLy8gVE9ETzogTWF5YmUgdGhlIGluamVjdGVkIHNjcmlwdCBzaG91bGQgYW5ub3VuY2UgaXRzIHByZXNlbmNlIGluCisgICAgICAgIC8vIHRoZSBwYWdlIG1ldGEtdGFnIHNvIHRoZSBuYXRpdmVQYWdlU2hvdWxkSGFuZGxlU2hpZnRBbmRBcnJvd3MKKyAgICAgICAgLy8gd2lsbCBjaGVjayB0aGF0IGFzIG9uZSBvZiB0aGUgY29uZGl0aW9ucyBpdCBsb29rcyBmb3IKKyAgICAgICAgcmV0dXJuIChuYXRpdmVQYWdlU2hvdWxkSGFuZGxlU2hpZnRBbmRBcnJvd3MoKSB8fCBtQWNjZXNzaWJpbGl0eVNjcmlwdEluamVjdGVkKTsKKyAgICB9CisKKyAgICAvKioKICAgICAgKiBTZXQgdGhlIGJhY2tncm91bmQgY29sb3IuIEl0J3Mgd2hpdGUgYnkgZGVmYXVsdC4gUGFzcwogICAgICAqIHplcm8gdG8gbWFrZSB0aGUgdmlldyB0cmFuc3BhcmVudC4KICAgICAgKiBAcGFyYW0gY29sb3IgICB0aGUgQVJHQiBjb2xvciBkZXNjcmliZWQgYnkgQ29sb3IuamF2YQpAQCAtNzc2MSw3ICs3NDUyLDcgQEAKICAgICAgKiBAaGlkZSBvbmx5IG5lZWRzIHRvIGJlIGFjY2Vzc2libGUgdG8gQnJvd3NlciBhbmQgdGVzdGluZwogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIGRyYXdQYWdlKENhbnZhcyBjYW52YXMpIHsKLSAgICAgICAgbVdlYlZpZXdDb3JlLmRyYXdDb250ZW50UGljdHVyZShjYW52YXMsIDAsIGZhbHNlLCBmYWxzZSk7CisgICAgICAgIG5hdGl2ZURyYXcoY2FudmFzLCAwLCAwLCBmYWxzZSk7CiAgICAgfQogCiAgICAgLyoqCkBAIC03ODA1LDEwICs3NDk2LDE4IEBACiAgICAgcHJpdmF0ZSBuYXRpdmUgYm9vbGVhbiAgbmF0aXZlQ3Vyc29yV2FudHNLZXlFdmVudHMoKTsKICAgICBwcml2YXRlIG5hdGl2ZSB2b2lkICAgICBuYXRpdmVEZWJ1Z0R1bXAoKTsKICAgICBwcml2YXRlIG5hdGl2ZSB2b2lkICAgICBuYXRpdmVEZXN0cm95KCk7CisKKyAgICAvKioKKyAgICAgKiBEcmF3IHRoZSBwaWN0dXJlIHNldCB3aXRoIGEgYmFja2dyb3VuZCBjb2xvciBhbmQgZXh0cmEuIElmCisgICAgICogInNwbGl0SWZOZWVkZWQiIGlzIHRydWUgYW5kIHRoZSByZXR1cm4gdmFsdWUgaXMgbm90IDAsIHRoZSByZXR1cm4gdmFsdWUKKyAgICAgKiBNVVNUIGJlIHBhc3NlZCB0byBXZWJWaWV3Q29yZSB3aXRoIFNQTElUX1BJQ1RVUkVfU0VUIG1lc3NhZ2Ugc28gdGhhdCB0aGUKKyAgICAgKiBuYXRpdmUgYWxsb2NhdGlvbiBjYW4gYmUgZnJlZWQuCisgICAgICovCisgICAgcHJpdmF0ZSBuYXRpdmUgaW50IG5hdGl2ZURyYXcoQ2FudmFzIGNhbnZhcywgaW50IGNvbG9yLCBpbnQgZXh0cmEsCisgICAgICAgICAgICBib29sZWFuIHNwbGl0SWZOZWVkZWQpOworICAgIHByaXZhdGUgbmF0aXZlIHZvaWQgICAgIG5hdGl2ZUR1bXBEaXNwbGF5VHJlZShTdHJpbmcgdXJsT3JOdWxsKTsKICAgICBwcml2YXRlIG5hdGl2ZSBib29sZWFuICBuYXRpdmVFdmFsdWF0ZUxheWVyc0FuaW1hdGlvbnMoKTsKICAgICBwcml2YXRlIG5hdGl2ZSB2b2lkICAgICBuYXRpdmVFeHRlbmRTZWxlY3Rpb24oaW50IHgsIGludCB5KTsKLSAgICBwcml2YXRlIG5hdGl2ZSB2b2lkICAgICBuYXRpdmVEcmF3RXh0cmFzKENhbnZhcyBjYW52YXMsIGludCBleHRyYSk7Ci0gICAgcHJpdmF0ZSBuYXRpdmUgdm9pZCAgICAgbmF0aXZlRHVtcERpc3BsYXlUcmVlKFN0cmluZyB1cmxPck51bGwpOwogICAgIHByaXZhdGUgbmF0aXZlIGludCAgICAgIG5hdGl2ZUZpbmRBbGwoU3RyaW5nIGZpbmRMb3dlciwgU3RyaW5nIGZpbmRVcHBlcik7CiAgICAgcHJpdmF0ZSBuYXRpdmUgdm9pZCAgICAgbmF0aXZlRmluZE5leHQoYm9vbGVhbiBmb3J3YXJkKTsKICAgICAvKiBwYWNrYWdlICovIG5hdGl2ZSBpbnQgICAgICBuYXRpdmVGb2N1c0NhbmRpZGF0ZUZyYW1lUG9pbnRlcigpOwpAQCAtNzg0Niw2ICs3NTQ1LDE0IEBACiAgICAgICAgICAgICBib29sZWFuIG5vU2Nyb2xsKTsKICAgICBwcml2YXRlIG5hdGl2ZSBpbnQgICAgICBuYXRpdmVNb3ZlR2VuZXJhdGlvbigpOwogICAgIHByaXZhdGUgbmF0aXZlIHZvaWQgICAgIG5hdGl2ZU1vdmVTZWxlY3Rpb24oaW50IHgsIGludCB5KTsKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHBhZ2Ugc2hvdWxkIGdldCB0aGUgc2hpZnQgYW5kIGFycm93IGtleXMsIHJhdGhlcgorICAgICAqIHRoYW4gc2VsZWN0IHRleHQvbmF2aWdhdGlvbi4KKyAgICAgKgorICAgICAqIElmIHRoZSBmb2N1cyBpcyBhIHBsdWdpbiwgb3IgaWYgdGhlIGZvY3VzIGFuZCBjdXJzb3IgbWF0Y2ggYW5kIGFyZQorICAgICAqIGEgY29udGVudEVkaXRhYmxlIGVsZW1lbnQsIHRoZW4gdGhlIHBhZ2Ugc2hvdWxkIGhhbmRsZSB0aGVzZSBrZXlzLgorICAgICAqLworICAgIHByaXZhdGUgbmF0aXZlIGJvb2xlYW4gIG5hdGl2ZVBhZ2VTaG91bGRIYW5kbGVTaGlmdEFuZEFycm93cygpOwogICAgIHByaXZhdGUgbmF0aXZlIGJvb2xlYW4gIG5hdGl2ZVBvaW50SW5OYXZDYWNoZShpbnQgeCwgaW50IHksIGludCBzbG9wKTsKICAgICAvLyBMaWtlIG1hbnkgb3RoZXIgb2Ygb3VyIG5hdGl2ZSBtZXRob2RzLCB5b3UgbXVzdCBtYWtlIHN1cmUgdGhhdAogICAgIC8vIG1OYXRpdmVDbGFzcyBpcyBub3QgbnVsbCBiZWZvcmUgY2FsbGluZyB0aGlzIG1ldGhvZC4KQEAgLTc4NjAsMTMgKzc1NjcsMTUgQEAKICAgICBwcml2YXRlIG5hdGl2ZSB2b2lkICAgICBuYXRpdmVTZXRFeHRlbmRTZWxlY3Rpb24oKTsKICAgICBwcml2YXRlIG5hdGl2ZSB2b2lkICAgICBuYXRpdmVTZXRGaW5kSXNFbXB0eSgpOwogICAgIHByaXZhdGUgbmF0aXZlIHZvaWQgICAgIG5hdGl2ZVNldEZpbmRJc1VwKGJvb2xlYW4gaXNVcCk7Ci0gICAgcHJpdmF0ZSBuYXRpdmUgdm9pZCAgICAgbmF0aXZlU2V0Rm9sbG93ZWRMaW5rKGJvb2xlYW4gZm9sbG93ZWQpOwogICAgIHByaXZhdGUgbmF0aXZlIHZvaWQgICAgIG5hdGl2ZVNldEhlaWdodENhbk1lYXN1cmUoYm9vbGVhbiBtZWFzdXJlKTsKLSAgICBwcml2YXRlIG5hdGl2ZSB2b2lkICAgICBuYXRpdmVTZXRSb290TGF5ZXIoaW50IGxheWVyKTsKKyAgICBwcml2YXRlIG5hdGl2ZSB2b2lkICAgICBuYXRpdmVTZXRCYXNlTGF5ZXIoaW50IGxheWVyKTsKKyAgICBwcml2YXRlIG5hdGl2ZSB2b2lkICAgICBuYXRpdmVTaG93Q3Vyc29yVGltZWQoKTsKKyAgICBwcml2YXRlIG5hdGl2ZSB2b2lkICAgICBuYXRpdmVSZXBsYWNlQmFzZUNvbnRlbnQoaW50IGNvbnRlbnQpOworICAgIHByaXZhdGUgbmF0aXZlIHZvaWQgICAgIG5hdGl2ZUNvcHlCYXNlQ29udGVudFRvUGljdHVyZShQaWN0dXJlIHBpY3QpOworICAgIHByaXZhdGUgbmF0aXZlIGJvb2xlYW4gIG5hdGl2ZUhhc0NvbnRlbnQoKTsKICAgICBwcml2YXRlIG5hdGl2ZSB2b2lkICAgICBuYXRpdmVTZXRTZWxlY3Rpb25Qb2ludGVyKGJvb2xlYW4gc2V0LAogICAgICAgICAgICAgZmxvYXQgc2NhbGUsIGludCB4LCBpbnQgeSk7CiAgICAgcHJpdmF0ZSBuYXRpdmUgYm9vbGVhbiAgbmF0aXZlU3RhcnRTZWxlY3Rpb24oaW50IHgsIGludCB5KTsKLSAgICBwcml2YXRlIG5hdGl2ZSB2b2lkICAgICBuYXRpdmVTZXRTZWxlY3Rpb25SZWdpb24oYm9vbGVhbiBzZXQpOwogICAgIHByaXZhdGUgbmF0aXZlIFJlY3QgICAgIG5hdGl2ZVN1YnRyYWN0TGF5ZXJzKFJlY3QgY29udGVudCk7CiAgICAgcHJpdmF0ZSBuYXRpdmUgaW50ICAgICAgbmF0aXZlVGV4dEdlbmVyYXRpb24oKTsKICAgICAvLyBOZXZlciBjYWxsIHRoaXMgdmVyc2lvbiBleGNlcHQgYnkgdXBkYXRlQ2FjaGVkVGV4dGZpZWxkKFN0cmluZykgLQpAQCAtNzg3NSw2ICs3NTg0LDEwIEBACiAgICAgICAgICAgICBpbnQgZ2VuZXJhdGlvbik7CiAgICAgcHJpdmF0ZSBuYXRpdmUgYm9vbGVhbiAgbmF0aXZlV29yZFNlbGVjdGlvbihpbnQgeCwgaW50IHkpOwogICAgIC8vIHJldHVybiBOT19MRUZURURHRSBtZWFucyBmYWlsdXJlLgotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBOT19MRUZURURHRSA9IC0xOwotICAgIHByaXZhdGUgbmF0aXZlIGludCAgICAgIG5hdGl2ZUdldEJsb2NrTGVmdEVkZ2UoaW50IHgsIGludCB5LCBmbG9hdCBzY2FsZSk7CisgICAgc3RhdGljIGZpbmFsIGludCBOT19MRUZURURHRSA9IC0xOworICAgIG5hdGl2ZSBpbnQgbmF0aXZlR2V0QmxvY2tMZWZ0RWRnZShpbnQgeCwgaW50IHksIGZsb2F0IHNjYWxlKTsKKworICAgIC8vIFJldHVybnMgYSBwb2ludGVyIHRvIHRoZSBzY3JvbGxhYmxlIExheWVyQW5kcm9pZCBhdCB0aGUgZ2l2ZW4gcG9pbnQuCisgICAgcHJpdmF0ZSBuYXRpdmUgaW50ICAgICAgbmF0aXZlU2Nyb2xsYWJsZUxheWVyKGludCB4LCBpbnQgeSk7CisgICAgcHJpdmF0ZSBuYXRpdmUgYm9vbGVhbiAgbmF0aXZlU2Nyb2xsTGF5ZXIoaW50IGxheWVyLCBpbnQgZHgsIGludCBkeSk7CiB9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC93ZWJraXQvV2ViVmlld0NsaWVudC5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvd2Via2l0L1dlYlZpZXdDbGllbnQuamF2YQppbmRleCAwMmM3MjEwLi4xZjhlZWJhIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC93ZWJraXQvV2ViVmlld0NsaWVudC5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3dlYmtpdC9XZWJWaWV3Q2xpZW50LmphdmEKQEAgLTg5LDYgKzg5LDcgQEAKICAgICAgKiBAZGVwcmVjYXRlZCBUaGlzIG1ldGhvZCBpcyBubyBsb25nZXIgY2FsbGVkLiBXaGVuIHRoZSBXZWJWaWV3IGVuY291bnRlcnMKICAgICAgKiAgICAgICAgICAgICBhIHJlZGlyZWN0IGxvb3AsIGl0IHdpbGwgY2FuY2VsIHRoZSBsb2FkLgogICAgICAqLworICAgIEBEZXByZWNhdGVkCiAgICAgcHVibGljIHZvaWQgb25Ub29NYW55UmVkaXJlY3RzKFdlYlZpZXcgdmlldywgTWVzc2FnZSBjYW5jZWxNc2csCiAgICAgICAgICAgICBNZXNzYWdlIGNvbnRpbnVlTXNnKSB7CiAgICAgICAgIGNhbmNlbE1zZy5zZW5kVG9UYXJnZXQoKTsKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3dlYmtpdC9XZWJWaWV3Q29yZS5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvd2Via2l0L1dlYlZpZXdDb3JlLmphdmEKaW5kZXggYmY0ZDk1Yi4uNTZkNjI5NiAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvd2Via2l0L1dlYlZpZXdDb3JlLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvd2Via2l0L1dlYlZpZXdDb3JlLmphdmEKQEAgLTE3LDE0ICsxNyw4IEBACiBwYWNrYWdlIGFuZHJvaWQud2Via2l0OwogCiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uUGFja2FnZU1hbmFnZXIuTmFtZU5vdEZvdW5kRXhjZXB0aW9uOwogaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2UuQ3Vyc29yOwotaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQ2FudmFzOwotaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuRHJhd0ZpbHRlcjsKLWltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlBhaW50OwotaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUGFpbnRGbGFnc0RyYXdGaWx0ZXI7Ci1pbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5QaWN0dXJlOwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUG9pbnQ7CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5SZWN0OwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUmVnaW9uOwpAQCAtMzMsMTQgKzI3LDE0IEBACiBpbXBvcnQgYW5kcm9pZC5vcy5Mb29wZXI7CiBpbXBvcnQgYW5kcm9pZC5vcy5NZXNzYWdlOwogaW1wb3J0IGFuZHJvaWQub3MuUHJvY2VzczsKLWltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkJyb3dzZXI7Ci1pbXBvcnQgYW5kcm9pZC5wcm92aWRlci5PcGVuYWJsZUNvbHVtbnM7CitpbXBvcnQgYW5kcm9pZC5wcm92aWRlci5NZWRpYVN0b3JlOwogaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CiBpbXBvcnQgYW5kcm9pZC51dGlsLlNwYXJzZUJvb2xlYW5BcnJheTsKIGltcG9ydCBhbmRyb2lkLnZpZXcuS2V5RXZlbnQ7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LlN1cmZhY2VIb2xkZXI7CiBpbXBvcnQgYW5kcm9pZC52aWV3LlN1cmZhY2VWaWV3OwogaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OworaW1wb3J0IGFuZHJvaWQud2Via2l0LkRldmljZU9yaWVudGF0aW9uTWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkLndlYmtpdC5EZXZpY2VPcmllbnRhdGlvblNlcnZpY2U7CiAKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwogaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwpAQCAtMTE3LDEzICsxMTEsMTYgQEAKICAgICBwcml2YXRlIGludCBtVmlld3BvcnREZW5zaXR5RHBpID0gLTE7CiAKICAgICBwcml2YXRlIGludCBtUmVzdG9yZWRTY2FsZSA9IDA7Ci0gICAgcHJpdmF0ZSBpbnQgbVJlc3RvcmVkU2NyZWVuV2lkdGhTY2FsZSA9IDA7CisgICAgcHJpdmF0ZSBpbnQgbVJlc3RvcmVkVGV4dFdyYXBTY2FsZSA9IDA7CiAgICAgcHJpdmF0ZSBpbnQgbVJlc3RvcmVkWCA9IDA7CiAgICAgcHJpdmF0ZSBpbnQgbVJlc3RvcmVkWSA9IDA7CiAKICAgICBwcml2YXRlIGludCBtV2Via2l0U2Nyb2xsWCA9IDA7CiAgICAgcHJpdmF0ZSBpbnQgbVdlYmtpdFNjcm9sbFkgPSAwOwogCisgICAgcHJpdmF0ZSBEZXZpY2VPcmllbnRhdGlvbk1hbmFnZXIgbURldmljZU9yaWVudGF0aW9uTWFuYWdlciA9IG5ldyBEZXZpY2VPcmllbnRhdGlvbk1hbmFnZXIodGhpcyk7CisgICAgcHJpdmF0ZSBEZXZpY2VPcmllbnRhdGlvblNlcnZpY2UgbURldmljZU9yaWVudGF0aW9uU2VydmljZTsKKwogICAgIC8vIFRoZSB0aHJlYWQgbmFtZSB1c2VkIHRvIGlkZW50aWZ5IHRoZSBXZWJDb3JlIHRocmVhZCBhbmQgZm9yIHVzZSBpbgogICAgIC8vIGRlYnVnZ2luZyBvdGhlciBjbGFzc2VzIHRoYXQgcmVxdWlyZSBvcGVyYXRpb24gd2l0aGluIHRoZSBXZWJDb3JlIHRocmVhZC4KICAgICAvKiBwYWNrYWdlICovIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEhSRUFEX05BTUUgPSAiV2ViVmlld0NvcmVUaHJlYWQiOwpAQCAtMjc5LDM0ICsyNzYsMzYgQEAKIAogICAgIC8qKgogICAgICAqIENhbGxlZCBieSBKTkkuICBPcGVuIGEgZmlsZSBjaG9vc2VyIHRvIHVwbG9hZCBhIGZpbGUuCi0gICAgICogQHJldHVybiBTdHJpbmcgdmVyc2lvbiBvZiB0aGUgVVJJIHBsdXMgdGhlIG5hbWUgb2YgdGhlIGZpbGUuCi0gICAgICogRklYTUU6IEp1c3QgcmV0dXJuIHRoZSBVUkkgaGVyZSwgYW5kIGluIEZpbGVTeXN0ZW06OnBhdGhHZXRGaWxlTmFtZSwgY2FsbAotICAgICAqIGludG8gSmF2YSB0byBnZXQgdGhlIGZpbGVuYW1lLgorICAgICAqIEBwYXJhbSBhY2NlcHRUeXBlIFRoZSB2YWx1ZSBvZiB0aGUgJ2FjY2VwdCcgYXR0cmlidXRlIG9mIHRoZQorICAgICAqICAgICAgICAgaW5wdXQgdGFnIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGZpbGUgcGlja2VyLgorICAgICAqIEByZXR1cm4gU3RyaW5nIHZlcnNpb24gb2YgdGhlIFVSSS4KICAgICAgKi8KLSAgICBwcml2YXRlIFN0cmluZyBvcGVuRmlsZUNob29zZXIoKSB7Ci0gICAgICAgIFVyaSB1cmkgPSBtQ2FsbGJhY2tQcm94eS5vcGVuRmlsZUNob29zZXIoKTsKLSAgICAgICAgaWYgKHVyaSA9PSBudWxsKSByZXR1cm4gIiI7Ci0gICAgICAgIC8vIEZpbmQgb3V0IHRoZSBuYW1lLCBhbmQgYXBwZW5kIGl0IHRvIHRoZSBVUkkuCi0gICAgICAgIC8vIFdlYmtpdCB3aWxsIHRyZWF0IHRoZSBuYW1lIGFzIHRoZSBmaWxlbmFtZSwgYW5kCi0gICAgICAgIC8vIHRoZSBVUkkgYXMgdGhlIHBhdGguICBUaGUgVVJJIHdpbGwgYmUgdXNlZAotICAgICAgICAvLyBpbiBCcm93c2VyRnJhbWUgdG8gZ2V0IHRoZSBhY3R1YWwgZGF0YS4KLSAgICAgICAgQ3Vyc29yIGN1cnNvciA9IG1Db250ZXh0LmdldENvbnRlbnRSZXNvbHZlcigpLnF1ZXJ5KAotICAgICAgICAgICAgICAgIHVyaSwKLSAgICAgICAgICAgICAgICBuZXcgU3RyaW5nW10geyBPcGVuYWJsZUNvbHVtbnMuRElTUExBWV9OQU1FIH0sCi0gICAgICAgICAgICAgICAgbnVsbCwKLSAgICAgICAgICAgICAgICBudWxsLAotICAgICAgICAgICAgICAgIG51bGwpOwotICAgICAgICBTdHJpbmcgbmFtZSA9ICIiOwotICAgICAgICBpZiAoY3Vyc29yICE9IG51bGwpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgaWYgKGN1cnNvci5tb3ZlVG9OZXh0KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgbmFtZSA9IGN1cnNvci5nZXRTdHJpbmcoMCk7CisgICAgcHJpdmF0ZSBTdHJpbmcgb3BlbkZpbGVDaG9vc2VyKFN0cmluZyBhY2NlcHRUeXBlKSB7CisgICAgICAgIFVyaSB1cmkgPSBtQ2FsbGJhY2tQcm94eS5vcGVuRmlsZUNob29zZXIoYWNjZXB0VHlwZSk7CisgICAgICAgIGlmICh1cmkgIT0gbnVsbCkgeworICAgICAgICAgICAgU3RyaW5nIGZpbGVQYXRoID0gIiI7CisgICAgICAgICAgICAvLyBOb3RlIC0gcXVlcnlpbmcgZm9yIE1lZGlhU3RvcmUuSW1hZ2VzLk1lZGlhLkRBVEEKKyAgICAgICAgICAgIC8vIHNlZW1zIHRvIHdvcmsgZm9yIGFsbCBjb250ZW50IFVSSXMsIG5vdCBqdXN0IGltYWdlcworICAgICAgICAgICAgQ3Vyc29yIGN1cnNvciA9IG1Db250ZXh0LmdldENvbnRlbnRSZXNvbHZlcigpLnF1ZXJ5KAorICAgICAgICAgICAgICAgICAgICB1cmksCisgICAgICAgICAgICAgICAgICAgIG5ldyBTdHJpbmdbXSB7IE1lZGlhU3RvcmUuSW1hZ2VzLk1lZGlhLkRBVEEgfSwKKyAgICAgICAgICAgICAgICAgICAgbnVsbCwgbnVsbCwgbnVsbCk7CisgICAgICAgICAgICBpZiAoY3Vyc29yICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBpZiAoY3Vyc29yLm1vdmVUb05leHQoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgZmlsZVBhdGggPSBjdXJzb3IuZ2V0U3RyaW5nKDApOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICAgICAgY3Vyc29yLmNsb3NlKCk7CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgICAgICBjdXJzb3IuY2xvc2UoKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgZmlsZVBhdGggPSB1cmkuZ2V0TGFzdFBhdGhTZWdtZW50KCk7CiAgICAgICAgICAgICB9CisgICAgICAgICAgICBTdHJpbmcgdXJpU3RyaW5nID0gdXJpLnRvU3RyaW5nKCk7CisgICAgICAgICAgICBCcm93c2VyRnJhbWUuc0phdmFCcmlkZ2Uuc3RvcmVGaWxlUGF0aEZvckNvbnRlbnRVcmkoZmlsZVBhdGgsIHVyaVN0cmluZyk7CisgICAgICAgICAgICByZXR1cm4gdXJpU3RyaW5nOwogICAgICAgICB9Ci0gICAgICAgIHJldHVybiB1cmkudG9TdHJpbmcoKSArICIvIiArIG5hbWU7CisgICAgICAgIHJldHVybiAiIjsKICAgICB9CiAKICAgICAvKioKQEAgLTQyNCw2ICs0MjMsMTMgQEAKICAgICAgICAgcmV0dXJuIG1DYWxsYmFja1Byb3h5Lm9uSnNUaW1lb3V0KCk7CiAgICAgfQogCisgICAgLyoqCisgICAgICogTm90aWZ5IHRoZSB3ZWJ2aWV3IHRoYXQgdGhpcyBpcyBhbiBpbnN0YWxsYWJsZSB3ZWIgYXBwLgorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIHNldEluc3RhbGxhYmxlV2ViQXBwKCkgeworICAgICAgICBtQ2FsbGJhY2tQcm94eS5zZXRJbnN0YWxsYWJsZVdlYkFwcCgpOworICAgIH0KKwogICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgIC8vIEpOSSBtZXRob2RzCiAgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCkBAIC00MzUsMzYgKzQ0MSwyMSBAQAogICAgICAqLwogICAgIHByaXZhdGUgbmF0aXZlIHZvaWQgbmF0aXZlQ2xlYXJDb250ZW50KCk7CiAKLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYSBmbGF0IHBpY3R1cmUgZnJvbSB0aGUgc2V0IG9mIHBpY3R1cmVzLgotICAgICAqLwotICAgIHByaXZhdGUgbmF0aXZlIHZvaWQgbmF0aXZlQ29weUNvbnRlbnRUb1BpY3R1cmUoUGljdHVyZSBwaWN0dXJlKTsKLQotICAgIC8qKgotICAgICAqIERyYXcgdGhlIHBpY3R1cmUgc2V0IHdpdGggYSBiYWNrZ3JvdW5kIGNvbG9yLiBSZXR1cm5zIHRydWUKLSAgICAgKiBpZiBzb21lIGluZGl2aWR1YWwgcGljdHVyZSB0b29rIHRvbyBsb25nIHRvIGRyYXcgYW5kIGNhbiBiZQotICAgICAqIHNwbGl0IGludG8gcGFydHMuIENhbGxlZCBmcm9tIHRoZSBVSSB0aHJlYWQuCi0gICAgICovCi0gICAgcHJpdmF0ZSBuYXRpdmUgYm9vbGVhbiBuYXRpdmVEcmF3Q29udGVudChDYW52YXMgY2FudmFzLCBpbnQgY29sb3IpOwotCi0gICAgLyoqCi0gICAgICogY2hlY2sgdG8gc2VlIGlmIHBpY3R1cmUgaXMgYmxhbmsgYW5kIGluIHByb2dyZXNzCi0gICAgICovCi0gICAgcHJpdmF0ZSBuYXRpdmUgYm9vbGVhbiBuYXRpdmVQaWN0dXJlUmVhZHkoKTsKKyAgICBwcml2YXRlIG5hdGl2ZSB2b2lkIG5hdGl2ZUNvbnRlbnRJbnZhbGlkYXRlQWxsKCk7CiAKICAgICAvKioKICAgICAgKiBSZWRyYXcgYSBwb3J0aW9uIG9mIHRoZSBwaWN0dXJlIHNldC4gVGhlIFBvaW50IHdoIHJldHVybnMgdGhlCiAgICAgICogd2lkdGggYW5kIGhlaWdodCBvZiB0aGUgb3ZlcmFsbCBwaWN0dXJlLgogICAgICAqLwotICAgIHByaXZhdGUgbmF0aXZlIGJvb2xlYW4gbmF0aXZlUmVjb3JkQ29udGVudChSZWdpb24gaW52YWxSZWdpb24sIFBvaW50IHdoKTsKKyAgICBwcml2YXRlIG5hdGl2ZSBpbnQgbmF0aXZlUmVjb3JkQ29udGVudChSZWdpb24gaW52YWxSZWdpb24sIFBvaW50IHdoKTsKIAogICAgIHByaXZhdGUgbmF0aXZlIGJvb2xlYW4gbmF0aXZlRm9jdXNCb3VuZHNDaGFuZ2VkKCk7CiAKICAgICAvKioKLSAgICAgKiBTcGxpdHMgc2xvdyBwYXJ0cyBvZiB0aGUgcGljdHVyZSBzZXQuIENhbGxlZCBmcm9tIHRoZSB3ZWJraXQKLSAgICAgKiB0aHJlYWQgYWZ0ZXIgbmF0aXZlRHJhd0NvbnRlbnQgcmV0dXJucyB0cnVlLgorICAgICAqIFNwbGl0cyBzbG93IHBhcnRzIG9mIHRoZSBwaWN0dXJlIHNldC4gQ2FsbGVkIGZyb20gdGhlIHdlYmtpdCB0aHJlYWQgYWZ0ZXIKKyAgICAgKiBXZWJWaWV3Lm5hdGl2ZURyYXcoKSByZXR1cm5zIGNvbnRlbnQgdG8gYmUgc3BsaXQuCiAgICAgICovCi0gICAgcHJpdmF0ZSBuYXRpdmUgdm9pZCBuYXRpdmVTcGxpdENvbnRlbnQoKTsKKyAgICBwcml2YXRlIG5hdGl2ZSB2b2lkIG5hdGl2ZVNwbGl0Q29udGVudChpbnQgY29udGVudCk7CiAKICAgICBwcml2YXRlIG5hdGl2ZSBib29sZWFuIG5hdGl2ZUtleShpbnQga2V5Q29kZSwgaW50IHVuaWNoYXIsCiAgICAgICAgICAgICBpbnQgcmVwZWF0Q291bnQsIGJvb2xlYW4gaXNTaGlmdCwgYm9vbGVhbiBpc0FsdCwgYm9vbGVhbiBpc1N5bSwKQEAgLTQ4MCwxMiArNDcxLDEyIEBACiAgICAgICAgIG9mIGxheW91dC9saW5lLWJyZWFraW5nLiBUaGVzZSBjb29yZGluYXRlcyBhcmUgaW4gZG9jdW1lbnQgc3BhY2UsCiAgICAgICAgIHdoaWNoIGlzIHRoZSBzYW1lIGFzIFZpZXcgY29vcmRzIHVubGVzcyB3ZSBoYXZlIHpvb21lZCB0aGUgZG9jdW1lbnQKICAgICAgICAgKHNlZSBuYXRpdmVTZXRab29tKS4KLSAgICAgICAgc2NyZWVuV2lkdGggaXMgdXNlZCBieSBsYXlvdXQgdG8gd3JhcCBjb2x1bW4gYXJvdW5kLiBJZiB2aWV3cG9ydCB1c2VzCi0gICAgICAgIGZpeGVkIHNpemUsIHNjcmVlbldpZHRoIGNhbiBiZSBkaWZmZXJlbnQgZnJvbSB3aWR0aCB3aXRoIHpvb21pbmcuCisgICAgICAgIHRleHRXcmFwV2lkdGggaXMgdXNlZCBieSBsYXlvdXQgdG8gd3JhcCBjb2x1bW4gYXJvdW5kLiBJZiB2aWV3cG9ydCB1c2VzCisgICAgICAgIGZpeGVkIHNpemUsIHRleHRXcmFwV2lkdGggY2FuIGJlIGRpZmZlcmVudCBmcm9tIHdpZHRoIHdpdGggem9vbWluZy4KICAgICAgICAgc2hvdWxkIHRoaXMgYmUgY2FsbGVkIG5hdGl2ZVNldFZpZXdQb3J0U2l6ZT8KICAgICAqLwotICAgIHByaXZhdGUgbmF0aXZlIHZvaWQgbmF0aXZlU2V0U2l6ZShpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBzY3JlZW5XaWR0aCwKLSAgICAgICAgICAgIGZsb2F0IHNjYWxlLCBpbnQgcmVhbFNjcmVlbldpZHRoLCBpbnQgc2NyZWVuSGVpZ2h0LCBpbnQgYW5jaG9yWCwKKyAgICBwcml2YXRlIG5hdGl2ZSB2b2lkIG5hdGl2ZVNldFNpemUoaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgdGV4dFdyYXBXaWR0aCwKKyAgICAgICAgICAgIGZsb2F0IHNjYWxlLCBpbnQgc2NyZWVuV2lkdGgsIGludCBzY3JlZW5IZWlnaHQsIGludCBhbmNob3JYLAogICAgICAgICAgICAgaW50IGFuY2hvclksIGJvb2xlYW4gaWdub3JlSGVpZ2h0KTsKIAogICAgIHByaXZhdGUgbmF0aXZlIGludCBuYXRpdmVHZXRDb250ZW50TWluUHJlZldpZHRoKCk7CkBAIC01NzYsNyArNTY3LDE3IEBACiAgICAgLyoqCiAgICAgICogUHJvdmlkZSBXZWJDb3JlIHdpdGggdGhlIHByZXZpb3VzbHkgdmlzdGVkIGxpbmtzIGZyb20gdGhlIGhpc3RvcnkgZGF0YWJhc2UKICAgICAgKi8KLSAgICBwcml2YXRlIG5hdGl2ZSB2b2lkICBuYXRpdmVQcm92aWRlVmlzaXRlZEhpc3RvcnkoU3RyaW5nW10gaGlzdG9yeSk7CisgICAgcHJpdmF0ZSBuYXRpdmUgdm9pZCBuYXRpdmVQcm92aWRlVmlzaXRlZEhpc3RvcnkoU3RyaW5nW10gaGlzdG9yeSk7CisKKyAgICAvKioKKyAgICAgKiBNb2RpZmllcyB0aGUgY3VycmVudCBzZWxlY3Rpb24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gZGlyZWN0aW9uIFRoZSBkaXJlY3Rpb24gaW4gd2hpY2ggdG8gYWx0ZXIgdGhlIHNlbGVjdGlvbi4KKyAgICAgKiBAcGFyYW0gZ3JhbnVsYXJpdHkgVGhlIGdyYW51bGFyaXR5IG9mIHRoZSBzZWxlY3Rpb24gbW9kaWZpY2F0aW9uLgorICAgICAqCisgICAgICogQHJldHVybiBUaGUgc2VsZWN0aW9uIHN0cmluZy4KKyAgICAgKi8KKyAgICBwcml2YXRlIG5hdGl2ZSBTdHJpbmcgbmF0aXZlTW9kaWZ5U2VsZWN0aW9uKGludCBkaXJlY3Rpb24sIGludCBncmFudWxhcml0eSk7CiAKICAgICAvLyBFdmVudEh1YiBmb3IgcHJvY2Vzc2luZyBtZXNzYWdlcwogICAgIHByaXZhdGUgZmluYWwgRXZlbnRIdWIgbUV2ZW50SHViOwpAQCAtNjk3LDYgKzY5OCwxMiBAQAogICAgICAgICBpbnQgbVk7CiAgICAgfQogCisgICAgc3RhdGljIGNsYXNzIFRvdWNoSGlnaGxpZ2h0RGF0YSB7CisgICAgICAgIGludCBtWDsKKyAgICAgICAgaW50IG1ZOworICAgICAgICBpbnQgbVNsb3A7CisgICAgfQorCiAgICAgLy8gbUFjdGlvbiBvZiBUb3VjaEV2ZW50RGF0YSBjYW4gYmUgTW90aW9uRXZlbnQuZ2V0QWN0aW9uKCkgd2hpY2ggdXNlcyB0aGUKICAgICAvLyBsYXN0IHR3byBieXRlcyBvciBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXMKICAgICBzdGF0aWMgZmluYWwgaW50IEFDVElPTl9MT05HUFJFU1MgPSAweDEwMDsKQEAgLTcwOCw4ICs3MTUsNiBAQAogICAgICAgICBpbnQgbVk7CiAgICAgICAgIGludCBtTWV0YVN0YXRlOwogICAgICAgICBib29sZWFuIG1SZXByb2Nlc3M7Ci0gICAgICAgIGZsb2F0IG1WaWV3WDsKLSAgICAgICAgZmxvYXQgbVZpZXdZOwogICAgIH0KIAogICAgIHN0YXRpYyBjbGFzcyBHZW9sb2NhdGlvblBlcm1pc3Npb25zRGF0YSB7CkBAIC03MTgsOSArNzIzLDggQEAKICAgICAgICAgYm9vbGVhbiBtUmVtZW1iZXI7CiAgICAgfQogCi0KLQogICAgICAgICBzdGF0aWMgZmluYWwgU3RyaW5nW10gSGFuZGxlckRlYnVnU3RyaW5nID0geworICAgICAgICAgICAgIlJFVkVBTF9TRUxFQ1RJT04iLCAvLyA5NgogICAgICAgICAgICAgIlJFUVVFU1RfTEFCRUwiLCAvLyA5NwogICAgICAgICAgICAgIlVQREFURV9GUkFNRV9DQUNIRV9JRl9MT0FESU5HIiwgLy8gPSA5OAogICAgICAgICAgICAgIlNDUk9MTF9URVhUX0lOUFVUIiwgLy8gPSA5OQpAQCAtNzcxLDEwICs3NzUsMTIgQEAKICAgICAgICAgICAgICJPTl9SRVNVTUUiLCAgICAvLyA9IDE0NAogICAgICAgICAgICAgIkZSRUVfTUVNT1JZIiwgIC8vID0gMTQ1CiAgICAgICAgICAgICAiVkFMSURfTk9ERV9CT1VORFMiLCAvLyA9IDE0NgorICAgICAgICAgICAgIlNBVkVfV0VCQVJDSElWRSIsIC8vID0gMTQ3CiAgICAgICAgIH07CiAKICAgICBjbGFzcyBFdmVudEh1YiB7CiAgICAgICAgIC8vIE1lc3NhZ2UgSWRzCisgICAgICAgIHN0YXRpYyBmaW5hbCBpbnQgUkVWRUFMX1NFTEVDVElPTiA9IDk2OwogICAgICAgICBzdGF0aWMgZmluYWwgaW50IFJFUVVFU1RfTEFCRUwgPSA5NzsKICAgICAgICAgc3RhdGljIGZpbmFsIGludCBVUERBVEVfRlJBTUVfQ0FDSEVfSUZfTE9BRElORyA9IDk4OwogICAgICAgICBzdGF0aWMgZmluYWwgaW50IFNDUk9MTF9URVhUX0lOUFVUID0gOTk7CkBAIC04MzcsNiArODQzLDkgQEAKICAgICAgICAgc3RhdGljIGZpbmFsIGludCBGUkVFX01FTU9SWSA9IDE0NTsKICAgICAgICAgc3RhdGljIGZpbmFsIGludCBWQUxJRF9OT0RFX0JPVU5EUyA9IDE0NjsKIAorICAgICAgICAvLyBMb2FkIGFuZCBzYXZlIHdlYiBhcmNoaXZlcworICAgICAgICBzdGF0aWMgZmluYWwgaW50IFNBVkVfV0VCQVJDSElWRSA9IDE0NzsKKwogICAgICAgICAvLyBOZXR3b3JrLWJhc2VkIG1lc3NhZ2luZwogICAgICAgICBzdGF0aWMgZmluYWwgaW50IENMRUFSX1NTTF9QUkVGX1RBQkxFID0gMTUwOwogCkBAIC04NjUsNiArODc0LDE0IEBACiAgICAgICAgIHN0YXRpYyBmaW5hbCBpbnQgQUREX1BBQ0tBR0VfTkFNRSA9IDE4NTsKICAgICAgICAgc3RhdGljIGZpbmFsIGludCBSRU1PVkVfUEFDS0FHRV9OQU1FID0gMTg2OwogCisgICAgICAgIHN0YXRpYyBmaW5hbCBpbnQgR0VUX1RPVUNIX0hJR0hMSUdIVF9SRUNUUyA9IDE4NzsKKyAgICAgICAgc3RhdGljIGZpbmFsIGludCBSRU1PVkVfVE9VQ0hfSElHSExJR0hUX1JFQ1RTID0gMTg4OworCisgICAgICAgIC8vIGFjY2Vzc2liaWxpdHkgc3VwcG9ydAorICAgICAgICBzdGF0aWMgZmluYWwgaW50IE1PRElGWV9TRUxFQ1RJT04gPSAxOTA7CisKKyAgICAgICAgc3RhdGljIGZpbmFsIGludCBVU0VfTU9DS19ERVZJQ0VfT1JJRU5UQVRJT04gPSAxOTE7CisKICAgICAgICAgLy8gcHJpdmF0ZSBtZXNzYWdlIGlkcwogICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgREVTVFJPWSA9ICAgICAyMDA7CiAKQEAgLTg4NSw2ICs5MDIsOSBAQAogICAgICAgICAgKi8KICAgICAgICAgcHJpdmF0ZSBFdmVudEh1YigpIHt9CiAKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEZJUlNUX1BBQ0tBR0VfTVNHX0lEID0gUkVWRUFMX1NFTEVDVElPTjsKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IExBU1RfUEFDS0FHRV9NU0dfSUQgPSBWQUxJRF9OT0RFX0JPVU5EUzsKKwogICAgICAgICAvKioKICAgICAgICAgICogVHJhbnNmZXIgYWxsIG1lc3NhZ2VzIHRvIHRoZSBuZXdseSBjcmVhdGVkIHdlYmNvcmUgdGhyZWFkIGhhbmRsZXIuCiAgICAgICAgICAqLwpAQCAtODk2LDExICs5MTYsMTEgQEAKICAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBoYW5kbGVNZXNzYWdlKE1lc3NhZ2UgbXNnKSB7CiAgICAgICAgICAgICAgICAgICAgIGlmIChEZWJ1Z0ZsYWdzLldFQl9WSUVXX0NPUkUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIExvZy52KExPR1RBRywgKG1zZy53aGF0IDwgUkVRVUVTVF9MQUJFTAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBtc2cud2hhdAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+IFZBTElEX05PREVfQk9VTkRTID8gSW50ZWdlci50b1N0cmluZyhtc2cud2hhdCkKKyAgICAgICAgICAgICAgICAgICAgICAgIExvZy52KExPR1RBRywgKG1zZy53aGF0IDwgRklSU1RfUEFDS0FHRV9NU0dfSUQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgbXNnLndoYXQgPiBMQVNUX1BBQ0tBR0VfTVNHX0lECisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gSW50ZWdlci50b1N0cmluZyhtc2cud2hhdCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBIYW5kbGVyRGVidWdTdHJpbmdbbXNnLndoYXQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIFJFUVVFU1RfTEFCRUxdKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gRklSU1RfUEFDS0FHRV9NU0dfSURdKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgYXJnMT0iICsgbXNnLmFyZzEgKyAiIGFyZzI9IiArIG1zZy5hcmcyCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBvYmo9IiArIG1zZy5vYmopOwogICAgICAgICAgICAgICAgICAgICB9CkBAIC05MjEsNiArOTQxLDEwIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogCisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFJFVkVBTF9TRUxFQ1RJT046CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmF0aXZlUmV2ZWFsU2VsZWN0aW9uKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgUkVRVUVTVF9MQUJFTDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobVdlYlZpZXcgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbm9kZVBvaW50ZXIgPSBtc2cuYXJnMjsKQEAgLTEyMzgsNiArMTI2MiwxMiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hdGl2ZVNldFNlbGVjdGlvbihtc2cuYXJnMSwgbXNnLmFyZzIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogCisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIE1PRElGWV9TRUxFQ1RJT046CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHNlbGVjdGlvblN0cmluZyA9IG5hdGl2ZU1vZGlmeVNlbGVjdGlvbihtc2cuYXJnMSwgbXNnLmFyZzIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1XZWJWaWV3Lm1Qcml2YXRlSGFuZGxlci5vYnRhaW5NZXNzYWdlKFdlYlZpZXcuU0VMRUNUSU9OX1NUUklOR19DSEFOR0VELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uU3RyaW5nKS5zZW5kVG9UYXJnZXQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKwogICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBMSVNUQk9YX0NIT0lDRVM6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3BhcnNlQm9vbGVhbkFycmF5IGNob2ljZXMgPSAoU3BhcnNlQm9vbGVhbkFycmF5KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXNnLm9iajsKQEAgLTEyNzgsNiArMTMwOCwxNSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hdGl2ZVNldEpzRmxhZ3MoKFN0cmluZyltc2cub2JqKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKIAorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBTQVZFX1dFQkFSQ0hJVkU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2ViVmlldy5TYXZlV2ViQXJjaGl2ZU1lc3NhZ2Ugc2F2ZU1lc3NhZ2UgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoV2ViVmlldy5TYXZlV2ViQXJjaGl2ZU1lc3NhZ2UpbXNnLm9iajsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYXZlTWVzc2FnZS5tUmVzdWx0RmlsZSA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhdmVXZWJBcmNoaXZlKHNhdmVNZXNzYWdlLm1CYXNlbmFtZSwgc2F2ZU1lc3NhZ2UubUF1dG9uYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtV2ViVmlldy5tUHJpdmF0ZUhhbmRsZXIub2J0YWluTWVzc2FnZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2ViVmlldy5TQVZFX1dFQkFSQ0hJVkVfRklOSVNIRUQsIHNhdmVNZXNzYWdlKS5zZW5kVG9UYXJnZXQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKwogICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBHRU9MT0NBVElPTl9QRVJNSVNTSU9OU19QUk9WSURFOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdlb2xvY2F0aW9uUGVybWlzc2lvbnNEYXRhIGRhdGEgPQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEdlb2xvY2F0aW9uUGVybWlzc2lvbnNEYXRhKSBtc2cub2JqOwpAQCAtMTI5MSw3ICsxMzMwLDkgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKIAogICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBTUExJVF9QSUNUVVJFX1NFVDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYXRpdmVTcGxpdENvbnRlbnQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYXRpdmVTcGxpdENvbnRlbnQobXNnLmFyZzEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1XZWJWaWV3Lm1Qcml2YXRlSGFuZGxlci5vYnRhaW5NZXNzYWdlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2ViVmlldy5SRVBMQUNFX0JBU0VfQ09OVEVOVCwgbXNnLmFyZzEsIDApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1TcGxpdFBpY3R1cmVJc1NjaGVkdWxlZCA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogCkBAIC0xMzU3LDYgKzEzOTgsMjUgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCcm93c2VyRnJhbWUuc0phdmFCcmlkZ2UucmVtb3ZlUGFja2FnZU5hbWUoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoU3RyaW5nKSBtc2cub2JqKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBHRVRfVE9VQ0hfSElHSExJR0hUX1JFQ1RTOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRvdWNoSGlnaGxpZ2h0RGF0YSBkID0gKFRvdWNoSGlnaGxpZ2h0RGF0YSkgbXNnLm9iajsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheUxpc3Q8UmVjdD4gcmVjdHMgPSBuYXRpdmVHZXRUb3VjaEhpZ2hsaWdodFJlY3RzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZC5tWCwgZC5tWSwgZC5tU2xvcCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVdlYlZpZXcubVByaXZhdGVIYW5kbGVyLm9idGFpbk1lc3NhZ2UoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXZWJWaWV3LlNFVF9UT1VDSF9ISUdITElHSFRfUkVDVFMsIHJlY3RzKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNlbmRUb1RhcmdldCgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFJFTU9WRV9UT1VDSF9ISUdITElHSFRfUkVDVFM6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVdlYlZpZXcubVByaXZhdGVIYW5kbGVyLm9idGFpbk1lc3NhZ2UoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXZWJWaWV3LlNFVF9UT1VDSF9ISUdITElHSFRfUkVDVFMsIG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2VuZFRvVGFyZ2V0KCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgVVNFX01PQ0tfREVWSUNFX09SSUVOVEFUSU9OOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZU1vY2tEZXZpY2VPcmllbnRhdGlvbigpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfTsKQEAgLTE1NjIsNiArMTYyMiwxMyBAQAogICAgICAgICBtQnJvd3NlckZyYW1lLmxvYWRVcmwodXJsLCBleHRyYUhlYWRlcnMpOwogICAgIH0KIAorICAgIHByaXZhdGUgU3RyaW5nIHNhdmVXZWJBcmNoaXZlKFN0cmluZyBmaWxlbmFtZSwgYm9vbGVhbiBhdXRvbmFtZSkgeworICAgICAgICBpZiAoRGVidWdGbGFncy5XRUJfVklFV19DT1JFKSB7CisgICAgICAgICAgICBMb2cudihMT0dUQUcsICIgQ09SRSBzYXZlV2ViQXJjaGl2ZSAiICsgZmlsZW5hbWUgKyAiICIgKyBhdXRvbmFtZSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG1Ccm93c2VyRnJhbWUuc2F2ZVdlYkFyY2hpdmUoZmlsZW5hbWUsIGF1dG9uYW1lKTsKKyAgICB9CisKICAgICBwcml2YXRlIHZvaWQga2V5KEtleUV2ZW50IGV2dCwgYm9vbGVhbiBpc0Rvd24pIHsKICAgICAgICAgaWYgKERlYnVnRmxhZ3MuV0VCX1ZJRVdfQ09SRSkgewogICAgICAgICAgICAgTG9nLnYoTE9HVEFHLCAiQ09SRSBrZXkgYXQgIiArIFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpICsgIiwgIgpAQCAtMTU4MiwxMSArMTY0OSwxMiBAQAogICAgICAgICAgICAgaWYgKGtleUNvZGUgPj0gS2V5RXZlbnQuS0VZQ09ERV9EUEFEX1VQCiAgICAgICAgICAgICAgICAgICAgICYmIGtleUNvZGUgPD0gS2V5RXZlbnQuS0VZQ09ERV9EUEFEX1JJR0hUKSB7CiAgICAgICAgICAgICAgICAgaWYgKERlYnVnRmxhZ3MuV0VCX1ZJRVdfQ09SRSkgewotICAgICAgICAgICAgICAgICAgICBMb2cudihMT0dUQUcsICJrZXk6IGFycm93IHVudXNlZCBieSBwbHVnaW46ICIgKyBrZXlDb2RlKTsKKyAgICAgICAgICAgICAgICAgICAgTG9nLnYoTE9HVEFHLCAia2V5OiBhcnJvdyB1bnVzZWQgYnkgcGFnZTogIiArIGtleUNvZGUpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBpZiAobVdlYlZpZXcgIT0gbnVsbCAmJiBldnQuaXNEb3duKCkpIHsKICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZS5vYnRhaW4obVdlYlZpZXcubVByaXZhdGVIYW5kbGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdlYlZpZXcuTU9WRV9PVVRfT0ZfUExVR0lOLCBrZXlDb2RlKS5zZW5kVG9UYXJnZXQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBXZWJWaWV3LlVOSEFORExFRF9OQVZfS0VZLCBrZXlDb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDApLnNlbmRUb1RhcmdldCgpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICB9CkBAIC0xNjE3LDcgKzE2ODUsNyBAQAogICAgICAgICBpZiAobVNldHRpbmdzLmdldFVzZVdpZGVWaWV3UG9ydCgpKSB7CiAgICAgICAgICAgICBpZiAobVZpZXdwb3J0V2lkdGggPT0gLTEpIHsKICAgICAgICAgICAgICAgICBpZiAobVNldHRpbmdzLmdldExheW91dEFsZ29yaXRobSgpID09Ci0gICAgICAgICAgICAgICAgICAgICAgICBXZWJTZXR0aW5ncy5MYXlvdXRBbGdvcml0aG0uTk9STUFMKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBXZWJTZXR0aW5ncy5MYXlvdXRBbGdvcml0aG0uTk9STUFMIHx8IG1TZXR0aW5ncy5nZXRVc2VGaXhlZFZpZXdwb3J0KCkpIHsKICAgICAgICAgICAgICAgICAgICAgd2lkdGggPSBXZWJWaWV3LkRFRkFVTFRfVklFV1BPUlRfV0lEVEg7CiAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgLyoKQEAgLTE2ODIsNiArMTc1MCwxNCBAQAogICAgICAgICByZXR1cm4gdXNlZFF1b3RhOwogICAgIH0KIAorICAgIC8vIGNhbGxlZCBmcm9tIFVJIHRocmVhZAorICAgIHZvaWQgc3BsaXRDb250ZW50KGludCBjb250ZW50KSB7CisgICAgICAgIGlmICghbVNwbGl0UGljdHVyZUlzU2NoZWR1bGVkKSB7CisgICAgICAgICAgICBtU3BsaXRQaWN0dXJlSXNTY2hlZHVsZWQgPSB0cnVlOworICAgICAgICAgICAgc2VuZE1lc3NhZ2UoRXZlbnRIdWIuU1BMSVRfUElDVFVSRV9TRVQsIGNvbnRlbnQsIDApOworICAgICAgICB9CisgICAgfQorCiAgICAgLy8gVXNlZCB0byBhdm9pZCBwb3N0aW5nIG1vcmUgdGhhbiBvbmUgZHJhdyBtZXNzYWdlLgogICAgIHByaXZhdGUgYm9vbGVhbiBtRHJhd0lzU2NoZWR1bGVkOwogCkBAIC0xNjkxLDExICsxNzY3LDExIEBACiAgICAgLy8gVXNlZCB0byBzdXNwZW5kIGRyYXdpbmcuCiAgICAgcHJpdmF0ZSBib29sZWFuIG1EcmF3SXNQYXVzZWQ7CiAKLSAgICAvLyBtUmVzdG9yZVN0YXRlIGlzIHNldCBpbiBkaWRGaXJzdExheW91dCgpLCBhbmQgcmVzZXQgaW4gdGhlIG5leHQKLSAgICAvLyB3ZWJraXREcmF3IGFmdGVyIHBhc3NpbmcgaXQgdG8gdGhlIFVJIHRocmVhZC4KLSAgICBwcml2YXRlIFJlc3RvcmVTdGF0ZSBtUmVzdG9yZVN0YXRlID0gbnVsbDsKKyAgICAvLyBtSW5pdGlhbFZpZXdTdGF0ZSBpcyBzZXQgYnkgZGlkRmlyc3RMYXlvdXQoKSBhbmQgdGhlbiByZXNldCBpbiB0aGUKKyAgICAvLyBuZXh0IHdlYmtpdERyYXcgYWZ0ZXIgcGFzc2luZyB0aGUgc3RhdGUgdG8gdGhlIFVJIHRocmVhZC4KKyAgICBwcml2YXRlIFZpZXdTdGF0ZSBtSW5pdGlhbFZpZXdTdGF0ZSA9IG51bGw7CiAKLSAgICBzdGF0aWMgY2xhc3MgUmVzdG9yZVN0YXRlIHsKKyAgICBzdGF0aWMgY2xhc3MgVmlld1N0YXRlIHsKICAgICAgICAgZmxvYXQgbU1pblNjYWxlOwogICAgICAgICBmbG9hdCBtTWF4U2NhbGU7CiAgICAgICAgIGZsb2F0IG1WaWV3U2NhbGU7CkBAIC0xNzA4LDE1ICsxNzg0LDE3IEBACiAKICAgICBzdGF0aWMgY2xhc3MgRHJhd0RhdGEgewogICAgICAgICBEcmF3RGF0YSgpIHsKKyAgICAgICAgICAgIG1CYXNlTGF5ZXIgPSAwOwogICAgICAgICAgICAgbUludmFsUmVnaW9uID0gbmV3IFJlZ2lvbigpOwogICAgICAgICAgICAgbVdpZHRoSGVpZ2h0ID0gbmV3IFBvaW50KCk7CiAgICAgICAgIH0KKyAgICAgICAgaW50IG1CYXNlTGF5ZXI7CiAgICAgICAgIFJlZ2lvbiBtSW52YWxSZWdpb247CiAgICAgICAgIFBvaW50IG1WaWV3UG9pbnQ7CiAgICAgICAgIFBvaW50IG1XaWR0aEhlaWdodDsKICAgICAgICAgaW50IG1NaW5QcmVmV2lkdGg7Ci0gICAgICAgIFJlc3RvcmVTdGF0ZSBtUmVzdG9yZVN0YXRlOyAvLyBvbmx5IG5vbi1udWxsIGlmIGl0IGlzIGZvciB0aGUgZmlyc3QKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHBpY3R1cmUgc2V0IGFmdGVyIHRoZSBmaXJzdCBsYXlvdXQKKyAgICAgICAgLy8gb25seSBub24tbnVsbCBpZiBpdCBpcyBmb3IgdGhlIGZpcnN0IHBpY3R1cmUgc2V0IGFmdGVyIHRoZSBmaXJzdCBsYXlvdXQKKyAgICAgICAgVmlld1N0YXRlIG1WaWV3U3RhdGU7CiAgICAgICAgIGJvb2xlYW4gbUZvY3VzU2l6ZUNoYW5nZWQ7CiAgICAgfQogCkBAIC0xNzI0LDggKzE4MDIsOCBAQAogICAgICAgICBtRHJhd0lzU2NoZWR1bGVkID0gZmFsc2U7CiAgICAgICAgIERyYXdEYXRhIGRyYXcgPSBuZXcgRHJhd0RhdGEoKTsKICAgICAgICAgaWYgKERlYnVnRmxhZ3MuV0VCX1ZJRVdfQ09SRSkgTG9nLnYoTE9HVEFHLCAid2Via2l0RHJhdyBzdGFydCIpOwotICAgICAgICBpZiAobmF0aXZlUmVjb3JkQ29udGVudChkcmF3Lm1JbnZhbFJlZ2lvbiwgZHJhdy5tV2lkdGhIZWlnaHQpCi0gICAgICAgICAgICAgICAgPT0gZmFsc2UpIHsKKyAgICAgICAgZHJhdy5tQmFzZUxheWVyID0gbmF0aXZlUmVjb3JkQ29udGVudChkcmF3Lm1JbnZhbFJlZ2lvbiwgZHJhdy5tV2lkdGhIZWlnaHQpOworICAgICAgICBpZiAoZHJhdy5tQmFzZUxheWVyID09IDApIHsKICAgICAgICAgICAgIGlmIChEZWJ1Z0ZsYWdzLldFQl9WSUVXX0NPUkUpIExvZy52KExPR1RBRywgIndlYmtpdERyYXcgYWJvcnQiKTsKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQpAQCAtMTc0MSw5ICsxODE5LDkgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IG1WaWV3cG9ydFdpZHRoKSwKICAgICAgICAgICAgICAgICAgICAgICAgIG5hdGl2ZUdldENvbnRlbnRNaW5QcmVmV2lkdGgoKSk7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAobVJlc3RvcmVTdGF0ZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgZHJhdy5tUmVzdG9yZVN0YXRlID0gbVJlc3RvcmVTdGF0ZTsKLSAgICAgICAgICAgICAgICBtUmVzdG9yZVN0YXRlID0gbnVsbDsKKyAgICAgICAgICAgIGlmIChtSW5pdGlhbFZpZXdTdGF0ZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgZHJhdy5tVmlld1N0YXRlID0gbUluaXRpYWxWaWV3U3RhdGU7CisgICAgICAgICAgICAgICAgbUluaXRpYWxWaWV3U3RhdGUgPSBudWxsOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKERlYnVnRmxhZ3MuV0VCX1ZJRVdfQ09SRSkgTG9nLnYoTE9HVEFHLCAid2Via2l0RHJhdyBORVdfUElDVFVSRV9NU0dfSUQiKTsKICAgICAgICAgICAgIE1lc3NhZ2Uub2J0YWluKG1XZWJWaWV3Lm1Qcml2YXRlSGFuZGxlciwKQEAgLTE3NTgsNTEgKzE4MzYsNiBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0gICAgLy8gVGhlc2UgYXJlIGNhbGxlZCBmcm9tIHRoZSBVSSB0aHJlYWQsIG5vdCBvdXIgdGhyZWFkCi0KLSAgICBzdGF0aWMgZmluYWwgaW50IFpPT01fQklUUyA9IFBhaW50LkZJTFRFUl9CSVRNQVBfRkxBRyB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhaW50LkRJVEhFUl9GTEFHIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFpbnQuU1VCUElYRUxfVEVYVF9GTEFHOwotICAgIHN0YXRpYyBmaW5hbCBpbnQgU0NST0xMX0JJVFMgPSBQYWludC5GSUxURVJfQklUTUFQX0ZMQUcgfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhaW50LkRJVEhFUl9GTEFHOwotCi0gICAgZmluYWwgRHJhd0ZpbHRlciBtWm9vbUZpbHRlciA9Ci0gICAgICAgICAgICAgICAgICAgIG5ldyBQYWludEZsYWdzRHJhd0ZpbHRlcihaT09NX0JJVFMsIFBhaW50LkxJTkVBUl9URVhUX0ZMQUcpOwotICAgIC8vIElmIHdlIG5lZWQgdG8gdHJhZGUgYmV0dGVyIHF1YWxpdHkgZm9yIHNwZWVkLCBzZXQgbVNjcm9sbEZpbHRlciB0byBudWxsCi0gICAgZmluYWwgRHJhd0ZpbHRlciBtU2Nyb2xsRmlsdGVyID0KLSAgICAgICAgICAgICAgICBuZXcgUGFpbnRGbGFnc0RyYXdGaWx0ZXIoU0NST0xMX0JJVFMsIDApOwotCi0gICAgLyogcGFja2FnZSAqLyB2b2lkIGRyYXdDb250ZW50UGljdHVyZShDYW52YXMgY2FudmFzLCBpbnQgY29sb3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIGFuaW1hdGluZ1pvb20sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIGFuaW1hdGluZ1Njcm9sbCkgewotICAgICAgICBEcmF3RmlsdGVyIGRmID0gbnVsbDsKLSAgICAgICAgaWYgKGFuaW1hdGluZ1pvb20pIHsKLSAgICAgICAgICAgIGRmID0gbVpvb21GaWx0ZXI7Ci0gICAgICAgIH0gZWxzZSBpZiAoYW5pbWF0aW5nU2Nyb2xsKSB7Ci0gICAgICAgICAgICBkZiA9IG1TY3JvbGxGaWx0ZXI7Ci0gICAgICAgIH0KLSAgICAgICAgY2FudmFzLnNldERyYXdGaWx0ZXIoZGYpOwotICAgICAgICBib29sZWFuIHRvb2tUb29Mb25nID0gbmF0aXZlRHJhd0NvbnRlbnQoY2FudmFzLCBjb2xvcik7Ci0gICAgICAgIGNhbnZhcy5zZXREcmF3RmlsdGVyKG51bGwpOwotICAgICAgICBpZiAodG9va1Rvb0xvbmcgJiYgbVNwbGl0UGljdHVyZUlzU2NoZWR1bGVkID09IGZhbHNlKSB7Ci0gICAgICAgICAgICBtU3BsaXRQaWN0dXJlSXNTY2hlZHVsZWQgPSB0cnVlOwotICAgICAgICAgICAgc2VuZE1lc3NhZ2UoRXZlbnRIdWIuU1BMSVRfUElDVFVSRV9TRVQpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyogcGFja2FnZSAqLyBzeW5jaHJvbml6ZWQgYm9vbGVhbiBwaWN0dXJlUmVhZHkoKSB7Ci0gICAgICAgIHJldHVybiAwICE9IG1OYXRpdmVDbGFzcyA/IG5hdGl2ZVBpY3R1cmVSZWFkeSgpIDogZmFsc2U7Ci0gICAgfQotCi0gICAgLypwYWNrYWdlKi8gc3luY2hyb25pemVkIFBpY3R1cmUgY29weUNvbnRlbnRQaWN0dXJlKCkgewotICAgICAgICBQaWN0dXJlIHJlc3VsdCA9IG5ldyBQaWN0dXJlKCk7Ci0gICAgICAgIGlmICgwICE9IG1OYXRpdmVDbGFzcykgewotICAgICAgICAgICAgbmF0aXZlQ29weUNvbnRlbnRUb1BpY3R1cmUocmVzdWx0KTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQogICAgIHN0YXRpYyB2b2lkIHJlZHVjZVByaW9yaXR5KCkgewogICAgICAgICAvLyByZW1vdmUgdGhlIHBlbmRpbmcgUkVEVUNFX1BSSU9SSVRZIGFuZCBSRVNVTUVfUFJJT1JJVFkgbWVzc2FnZXMKICAgICAgICAgc1dlYkNvcmVIYW5kbGVyLnJlbW92ZU1lc3NhZ2VzKFdlYkNvcmVUaHJlYWQuUkVEVUNFX1BSSU9SSVRZKTsKQEAgLTE4MjQsNiArMTg1Nyw4IEBACiAgICAgICAgIC8vIGNhbGxlZCBmcm9tIFVJIHRocmVhZCB3aGlsZSBXRUJLSVRfRFJBVyBpcyBqdXN0IHB1bGxlZCBvdXQgb2YgdGhlCiAgICAgICAgIC8vIHF1ZXVlIGluIFdlYkNvcmUgdGhyZWFkIHRvIGJlIGV4ZWN1dGVkLiBUaGVuIHVwZGF0ZSB3b24ndCBiZSBibG9ja2VkLgogICAgICAgICBpZiAoY29yZSAhPSBudWxsKSB7CisgICAgICAgICAgICBpZiAoIWNvcmUuZ2V0U2V0dGluZ3MoKS5lbmFibGVTbW9vdGhUcmFuc2l0aW9uKCkpIHJldHVybjsKKwogICAgICAgICAgICAgc3luY2hyb25pemVkIChjb3JlKSB7CiAgICAgICAgICAgICAgICAgY29yZS5tRHJhd0lzUGF1c2VkID0gdHJ1ZTsKICAgICAgICAgICAgICAgICBpZiAoY29yZS5tRHJhd0lzU2NoZWR1bGVkKSB7CkBAIC0xODM2LDEyICsxODcxLDE2IEBACiAKICAgICBzdGF0aWMgdm9pZCByZXN1bWVVcGRhdGVQaWN0dXJlKFdlYlZpZXdDb3JlIGNvcmUpIHsKICAgICAgICAgaWYgKGNvcmUgIT0gbnVsbCkgeworICAgICAgICAgICAgLy8gaWYgbURyYXdJc1BhdXNlZCBpcyB0cnVlLCBpZ25vcmUgdGhlIHNldHRpbmcsIGNvbnRpbnVlIHRvIHJlc3VtZQorICAgICAgICAgICAgaWYgKCFjb3JlLm1EcmF3SXNQYXVzZWQKKyAgICAgICAgICAgICAgICAgICAgJiYgIWNvcmUuZ2V0U2V0dGluZ3MoKS5lbmFibGVTbW9vdGhUcmFuc2l0aW9uKCkpIHJldHVybjsKKwogICAgICAgICAgICAgc3luY2hyb25pemVkIChjb3JlKSB7CiAgICAgICAgICAgICAgICAgY29yZS5tRHJhd0lzUGF1c2VkID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgaWYgKGNvcmUubURyYXdJc1NjaGVkdWxlZCkgewotICAgICAgICAgICAgICAgICAgICBjb3JlLm1EcmF3SXNTY2hlZHVsZWQgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgY29yZS5jb250ZW50RHJhdygpOwotICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAvLyBhbHdheXMgcmVkcmF3IG9uIHJlc3VtZSB0byByZWVuYWJsZSBnaWYgYW5pbWF0aW9ucworICAgICAgICAgICAgICAgIGNvcmUubURyYXdJc1NjaGVkdWxlZCA9IGZhbHNlOworICAgICAgICAgICAgICAgIGNvcmUubmF0aXZlQ29udGVudEludmFsaWRhdGVBbGwoKTsKKyAgICAgICAgICAgICAgICBjb3JlLmNvbnRlbnREcmF3KCk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CkBAIC0xOTc4LDI0ICsyMDE3LDYgQEAKICAgICAgICAgbVJlcGFpbnRTY2hlZHVsZWQgPSBmYWxzZTsKICAgICB9CiAKLSAgICAvLyBjYWxsZWQgYnkgSk5JCi0gICAgcHJpdmF0ZSB2b2lkIHNlbmRJbW1lZGlhdGVSZXBhaW50KCkgewotICAgICAgICBpZiAobVdlYlZpZXcgIT0gbnVsbCAmJiAhbVJlcGFpbnRTY2hlZHVsZWQpIHsKLSAgICAgICAgICAgIG1SZXBhaW50U2NoZWR1bGVkID0gdHJ1ZTsKLSAgICAgICAgICAgIE1lc3NhZ2Uub2J0YWluKG1XZWJWaWV3Lm1Qcml2YXRlSGFuZGxlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFdlYlZpZXcuSU1NRURJQVRFX1JFUEFJTlRfTVNHX0lEKS5zZW5kVG9UYXJnZXQoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vIGNhbGxlZCBieSBKTkkKLSAgICBwcml2YXRlIHZvaWQgc2V0Um9vdExheWVyKGludCBsYXllcikgewotICAgICAgICBpZiAobVdlYlZpZXcgIT0gbnVsbCkgewotICAgICAgICAgICAgTWVzc2FnZS5vYnRhaW4obVdlYlZpZXcubVByaXZhdGVIYW5kbGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgV2ViVmlldy5TRVRfUk9PVF9MQVlFUl9NU0dfSUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBsYXllciwgMCkuc2VuZFRvVGFyZ2V0KCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KICAgICAvKiBwYWNrYWdlICovIFdlYlZpZXcgZ2V0V2ViVmlldygpIHsKICAgICAgICAgcmV0dXJuIG1XZWJWaWV3OwogICAgIH0KQEAgLTIwMTIsMTggKzIwMzMsMjQgQEAKIAogICAgICAgICBpZiAobVdlYlZpZXcgPT0gbnVsbCkgcmV0dXJuOwogCi0gICAgICAgIGJvb2xlYW4gdXBkYXRlUmVzdG9yZVN0YXRlID0gc3RhbmRhcmRMb2FkIHx8IG1SZXN0b3JlZFNjYWxlID4gMDsKLSAgICAgICAgc2V0dXBWaWV3cG9ydCh1cGRhdGVSZXN0b3JlU3RhdGUpOworICAgICAgICBib29sZWFuIHVwZGF0ZVZpZXdTdGF0ZSA9IHN0YW5kYXJkTG9hZCB8fCBtUmVzdG9yZWRTY2FsZSA+IDA7CisgICAgICAgIHNldHVwVmlld3BvcnQodXBkYXRlVmlld1N0YXRlKTsKICAgICAgICAgLy8gaWYgdXBkYXRlUmVzdG9yZVN0YXRlIGlzIHRydWUsIFZpZXdNYW5hZ2VyLnBvc3RSZWFkeVRvRHJhd0FsbCgpIHdpbGwKLSAgICAgICAgLy8gYmUgY2FsbGVkIGFmdGVyIHRoZSBXZWJWaWV3IHJlc3RvcmUgdGhlIHN0YXRlLiBJZiB1cGRhdGVSZXN0b3JlU3RhdGUKKyAgICAgICAgLy8gYmUgY2FsbGVkIGFmdGVyIHRoZSBXZWJWaWV3IHVwZGF0ZXMgaXRzIHN0YXRlLiBJZiB1cGRhdGVSZXN0b3JlU3RhdGUKICAgICAgICAgLy8gaXMgZmFsc2UsIHN0YXJ0IHRvIGRyYXcgbm93IGFzIGl0IGlzIHJlYWR5LgotICAgICAgICBpZiAoIXVwZGF0ZVJlc3RvcmVTdGF0ZSkgeworICAgICAgICBpZiAoIXVwZGF0ZVZpZXdTdGF0ZSkgewogICAgICAgICAgICAgbVdlYlZpZXcubVZpZXdNYW5hZ2VyLnBvc3RSZWFkeVRvRHJhd0FsbCgpOwogICAgICAgICB9CiAKKyAgICAgICAgLy8gcmVtb3ZlIHRoZSB0b3VjaCBoaWdobGlnaHQgd2hlbiBtb3ZpbmcgdG8gYSBuZXcgcGFnZQorICAgICAgICBpZiAoZ2V0U2V0dGluZ3MoKS5zdXBwb3J0VG91Y2hPbmx5KCkpIHsKKyAgICAgICAgICAgIG1FdmVudEh1Yi5zZW5kTWVzc2FnZShNZXNzYWdlLm9idGFpbihudWxsLAorICAgICAgICAgICAgICAgICAgICBFdmVudEh1Yi5SRU1PVkVfVE9VQ0hfSElHSExJR0hUX1JFQ1RTKSk7CisgICAgICAgIH0KKwogICAgICAgICAvLyByZXNldCB0aGUgc2Nyb2xsIHBvc2l0aW9uLCB0aGUgcmVzdG9yZWQgb2Zmc2V0IGFuZCBzY2FsZXMKICAgICAgICAgbVdlYmtpdFNjcm9sbFggPSBtV2Via2l0U2Nyb2xsWSA9IG1SZXN0b3JlZFggPSBtUmVzdG9yZWRZCi0gICAgICAgICAgICAgICAgPSBtUmVzdG9yZWRTY2FsZSA9IG1SZXN0b3JlZFNjcmVlbldpZHRoU2NhbGUgPSAwOworICAgICAgICAgICAgICAgID0gbVJlc3RvcmVkU2NhbGUgPSBtUmVzdG9yZWRUZXh0V3JhcFNjYWxlID0gMDsKICAgICB9CiAKICAgICAvLyBjYWxsZWQgYnkgSk5JCkBAIC0yMDM3LDE1ICsyMDY0LDE3IEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICBwcml2YXRlIHZvaWQgc2V0dXBWaWV3cG9ydChib29sZWFuIHVwZGF0ZVJlc3RvcmVTdGF0ZSkgeworICAgIHByaXZhdGUgdm9pZCBzZXR1cFZpZXdwb3J0KGJvb2xlYW4gdXBkYXRlVmlld1N0YXRlKSB7CiAgICAgICAgIC8vIHNldCB0aGUgdmlld3BvcnQgc2V0dGluZ3MgZnJvbSBXZWJLaXQKICAgICAgICAgc2V0Vmlld3BvcnRTZXR0aW5nc0Zyb21OYXRpdmUoKTsKIAogICAgICAgICAvLyBhZGp1c3QgdGhlIGRlZmF1bHQgc2NhbGUgdG8gbWF0Y2ggdGhlIGRlbnNpdHlEcGkKICAgICAgICAgZmxvYXQgYWRqdXN0ID0gMS4wZjsKICAgICAgICAgaWYgKG1WaWV3cG9ydERlbnNpdHlEcGkgPT0gLTEpIHsKLSAgICAgICAgICAgIGlmIChXZWJWaWV3LkRFRkFVTFRfU0NBTEVfUEVSQ0VOVCAhPSAxMDApIHsKLSAgICAgICAgICAgICAgICBhZGp1c3QgPSBXZWJWaWV3LkRFRkFVTFRfU0NBTEVfUEVSQ0VOVCAvIDEwMC4wZjsKKyAgICAgICAgICAgIC8vIGNvbnZlcnQgZGVmYXVsdCB6b29tIHNjYWxlIHRvIGEgaW50ZWdlciAocGVyY2VudGFnZSkgdG8gYXZvaWQgYW55CisgICAgICAgICAgICAvLyBpc3N1ZXMgd2l0aCBmbG9hdGluZyBwb2ludCBjb21wYXJpc29ucworICAgICAgICAgICAgaWYgKG1XZWJWaWV3ICE9IG51bGwgJiYgKGludCkobVdlYlZpZXcuZ2V0RGVmYXVsdFpvb21TY2FsZSgpICogMTAwKSAhPSAxMDApIHsKKyAgICAgICAgICAgICAgICBhZGp1c3QgPSBtV2ViVmlldy5nZXREZWZhdWx0Wm9vbVNjYWxlKCk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSBpZiAobVZpZXdwb3J0RGVuc2l0eURwaSA+IDApIHsKICAgICAgICAgICAgIGFkanVzdCA9IChmbG9hdCkgbUNvbnRleHQuZ2V0UmVzb3VyY2VzKCkuZ2V0RGlzcGxheU1ldHJpY3MoKS5kZW5zaXR5RHBpCkBAIC0yMDg3LDE3ICsyMTE2LDE3IEBACiAgICAgICAgIH0KIAogICAgICAgICAvLyBpZiBtVmlld3BvcnRXaWR0aCBpcyAwLCBpdCBtZWFucyBkZXZpY2Utd2lkdGgsIGFsd2F5cyB1cGRhdGUuCi0gICAgICAgIGlmIChtVmlld3BvcnRXaWR0aCAhPSAwICYmICF1cGRhdGVSZXN0b3JlU3RhdGUpIHsKLSAgICAgICAgICAgIFJlc3RvcmVTdGF0ZSByZXN0b3JlU3RhdGUgPSBuZXcgUmVzdG9yZVN0YXRlKCk7Ci0gICAgICAgICAgICByZXN0b3JlU3RhdGUubU1pblNjYWxlID0gbVZpZXdwb3J0TWluaW11bVNjYWxlIC8gMTAwLjBmOwotICAgICAgICAgICAgcmVzdG9yZVN0YXRlLm1NYXhTY2FsZSA9IG1WaWV3cG9ydE1heGltdW1TY2FsZSAvIDEwMC4wZjsKLSAgICAgICAgICAgIHJlc3RvcmVTdGF0ZS5tRGVmYXVsdFNjYWxlID0gYWRqdXN0OworICAgICAgICBpZiAobVZpZXdwb3J0V2lkdGggIT0gMCAmJiAhdXBkYXRlVmlld1N0YXRlKSB7CisgICAgICAgICAgICBWaWV3U3RhdGUgdmlld1N0YXRlID0gbmV3IFZpZXdTdGF0ZSgpOworICAgICAgICAgICAgdmlld1N0YXRlLm1NaW5TY2FsZSA9IG1WaWV3cG9ydE1pbmltdW1TY2FsZSAvIDEwMC4wZjsKKyAgICAgICAgICAgIHZpZXdTdGF0ZS5tTWF4U2NhbGUgPSBtVmlld3BvcnRNYXhpbXVtU2NhbGUgLyAxMDAuMGY7CisgICAgICAgICAgICB2aWV3U3RhdGUubURlZmF1bHRTY2FsZSA9IGFkanVzdDsKICAgICAgICAgICAgIC8vIGFzIG1WaWV3cG9ydFdpZHRoIGlzIG5vdCAwLCBpdCBpcyBub3QgbW9iaWxlIHNpdGUuCi0gICAgICAgICAgICByZXN0b3JlU3RhdGUubU1vYmlsZVNpdGUgPSBmYWxzZTsKKyAgICAgICAgICAgIHZpZXdTdGF0ZS5tTW9iaWxlU2l0ZSA9IGZhbHNlOwogICAgICAgICAgICAgLy8gZm9yIG5vbi1tb2JpbGUgc2l0ZSwgd2UgZG9uJ3QgbmVlZCBtaW5QcmVmV2lkdGgsIHNldCBpdCBhcyAwCi0gICAgICAgICAgICByZXN0b3JlU3RhdGUubVNjcm9sbFggPSAwOworICAgICAgICAgICAgdmlld1N0YXRlLm1TY3JvbGxYID0gMDsKICAgICAgICAgICAgIE1lc3NhZ2Uub2J0YWluKG1XZWJWaWV3Lm1Qcml2YXRlSGFuZGxlciwKLSAgICAgICAgICAgICAgICAgICAgV2ViVmlldy5VUERBVEVfWk9PTV9SQU5HRSwgcmVzdG9yZVN0YXRlKS5zZW5kVG9UYXJnZXQoKTsKKyAgICAgICAgICAgICAgICAgICAgV2ViVmlldy5VUERBVEVfWk9PTV9SQU5HRSwgdmlld1N0YXRlKS5zZW5kVG9UYXJnZXQoKTsKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQogCkBAIC0yMTE4LDMyICsyMTQ3LDMxIEBACiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICB3ZWJWaWV3V2lkdGggPSBNYXRoLnJvdW5kKHZpZXdwb3J0V2lkdGggKiBtQ3VycmVudFZpZXdTY2FsZSk7CiAgICAgICAgIH0KLSAgICAgICAgbVJlc3RvcmVTdGF0ZSA9IG5ldyBSZXN0b3JlU3RhdGUoKTsKLSAgICAgICAgbVJlc3RvcmVTdGF0ZS5tTWluU2NhbGUgPSBtVmlld3BvcnRNaW5pbXVtU2NhbGUgLyAxMDAuMGY7Ci0gICAgICAgIG1SZXN0b3JlU3RhdGUubU1heFNjYWxlID0gbVZpZXdwb3J0TWF4aW11bVNjYWxlIC8gMTAwLjBmOwotICAgICAgICBtUmVzdG9yZVN0YXRlLm1EZWZhdWx0U2NhbGUgPSBhZGp1c3Q7Ci0gICAgICAgIG1SZXN0b3JlU3RhdGUubVNjcm9sbFggPSBtUmVzdG9yZWRYOwotICAgICAgICBtUmVzdG9yZVN0YXRlLm1TY3JvbGxZID0gbVJlc3RvcmVkWTsKLSAgICAgICAgbVJlc3RvcmVTdGF0ZS5tTW9iaWxlU2l0ZSA9ICgwID09IG1WaWV3cG9ydFdpZHRoKTsKKyAgICAgICAgbUluaXRpYWxWaWV3U3RhdGUgPSBuZXcgVmlld1N0YXRlKCk7CisgICAgICAgIG1Jbml0aWFsVmlld1N0YXRlLm1NaW5TY2FsZSA9IG1WaWV3cG9ydE1pbmltdW1TY2FsZSAvIDEwMC4wZjsKKyAgICAgICAgbUluaXRpYWxWaWV3U3RhdGUubU1heFNjYWxlID0gbVZpZXdwb3J0TWF4aW11bVNjYWxlIC8gMTAwLjBmOworICAgICAgICBtSW5pdGlhbFZpZXdTdGF0ZS5tRGVmYXVsdFNjYWxlID0gYWRqdXN0OworICAgICAgICBtSW5pdGlhbFZpZXdTdGF0ZS5tU2Nyb2xsWCA9IG1SZXN0b3JlZFg7CisgICAgICAgIG1Jbml0aWFsVmlld1N0YXRlLm1TY3JvbGxZID0gbVJlc3RvcmVkWTsKKyAgICAgICAgbUluaXRpYWxWaWV3U3RhdGUubU1vYmlsZVNpdGUgPSAoMCA9PSBtVmlld3BvcnRXaWR0aCk7CiAgICAgICAgIGlmIChtUmVzdG9yZWRTY2FsZSA+IDApIHsKLSAgICAgICAgICAgIG1SZXN0b3JlU3RhdGUubVZpZXdTY2FsZSA9IG1SZXN0b3JlZFNjYWxlIC8gMTAwLjBmOwotICAgICAgICAgICAgaWYgKG1SZXN0b3JlZFNjcmVlbldpZHRoU2NhbGUgPiAwKSB7Ci0gICAgICAgICAgICAgICAgbVJlc3RvcmVTdGF0ZS5tVGV4dFdyYXBTY2FsZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBtUmVzdG9yZWRTY3JlZW5XaWR0aFNjYWxlIC8gMTAwLjBmOworICAgICAgICAgICAgbUluaXRpYWxWaWV3U3RhdGUubVZpZXdTY2FsZSA9IG1SZXN0b3JlZFNjYWxlIC8gMTAwLjBmOworICAgICAgICAgICAgaWYgKG1SZXN0b3JlZFRleHRXcmFwU2NhbGUgPiAwKSB7CisgICAgICAgICAgICAgICAgbUluaXRpYWxWaWV3U3RhdGUubVRleHRXcmFwU2NhbGUgPSBtUmVzdG9yZWRUZXh0V3JhcFNjYWxlIC8gMTAwLjBmOwogICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBtUmVzdG9yZVN0YXRlLm1UZXh0V3JhcFNjYWxlID0gbVJlc3RvcmVTdGF0ZS5tVmlld1NjYWxlOworICAgICAgICAgICAgICAgIG1Jbml0aWFsVmlld1N0YXRlLm1UZXh0V3JhcFNjYWxlID0gbUluaXRpYWxWaWV3U3RhdGUubVZpZXdTY2FsZTsKICAgICAgICAgICAgIH0KICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIGlmIChtVmlld3BvcnRJbml0aWFsU2NhbGUgPiAwKSB7Ci0gICAgICAgICAgICAgICAgbVJlc3RvcmVTdGF0ZS5tVmlld1NjYWxlID0gbVJlc3RvcmVTdGF0ZS5tVGV4dFdyYXBTY2FsZSA9CisgICAgICAgICAgICAgICAgbUluaXRpYWxWaWV3U3RhdGUubVZpZXdTY2FsZSA9IG1Jbml0aWFsVmlld1N0YXRlLm1UZXh0V3JhcFNjYWxlID0KICAgICAgICAgICAgICAgICAgICAgICAgIG1WaWV3cG9ydEluaXRpYWxTY2FsZSAvIDEwMC4wZjsKICAgICAgICAgICAgIH0gZWxzZSBpZiAobVZpZXdwb3J0V2lkdGggPiAwICYmIG1WaWV3cG9ydFdpZHRoIDwgd2ViVmlld1dpZHRoKSB7Ci0gICAgICAgICAgICAgICAgbVJlc3RvcmVTdGF0ZS5tVmlld1NjYWxlID0gbVJlc3RvcmVTdGF0ZS5tVGV4dFdyYXBTY2FsZSA9CisgICAgICAgICAgICAgICAgbUluaXRpYWxWaWV3U3RhdGUubVZpZXdTY2FsZSA9IG1Jbml0aWFsVmlld1N0YXRlLm1UZXh0V3JhcFNjYWxlID0KICAgICAgICAgICAgICAgICAgICAgICAgIChmbG9hdCkgd2ViVmlld1dpZHRoIC8gbVZpZXdwb3J0V2lkdGg7CiAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIG1SZXN0b3JlU3RhdGUubVRleHRXcmFwU2NhbGUgPSBhZGp1c3Q7CisgICAgICAgICAgICAgICAgbUluaXRpYWxWaWV3U3RhdGUubVRleHRXcmFwU2NhbGUgPSBhZGp1c3Q7CiAgICAgICAgICAgICAgICAgLy8gMCB3aWxsIHRyaWdnZXIgV2ViVmlldyB0byB0dXJuIG9uIHpvb20gb3ZlcnZpZXcgbW9kZQotICAgICAgICAgICAgICAgIG1SZXN0b3JlU3RhdGUubVZpZXdTY2FsZSA9IDA7CisgICAgICAgICAgICAgICAgbUluaXRpYWxWaWV3U3RhdGUubVZpZXdTY2FsZSA9IDA7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIApAQCAtMjE4NCwxNSArMjIxMiwxNSBAQAogICAgICAgICAgICAgICAgIC8vIG1WaWV3U2NhbGUgYXMgMCBtZWFucyBpdCBpcyBpbiB6b29tIG92ZXJ2aWV3IG1vZGUuIFNvIHdlIGRvbid0CiAgICAgICAgICAgICAgICAgLy8ga25vdyB0aGUgZXhhY3Qgc2NhbGUuIElmIG1SZXN0b3JlZFNjYWxlIGlzIG5vbi16ZXJvLCB1c2UgaXQ7CiAgICAgICAgICAgICAgICAgLy8gb3RoZXJ3aXNlIGp1c3QgdXNlIG1UZXh0V3JhcFNjYWxlIGFzIHRoZSBpbml0aWFsIHNjYWxlLgotICAgICAgICAgICAgICAgIGRhdGEubVNjYWxlID0gbVJlc3RvcmVTdGF0ZS5tVmlld1NjYWxlID09IDAKKyAgICAgICAgICAgICAgICBkYXRhLm1TY2FsZSA9IG1Jbml0aWFsVmlld1N0YXRlLm1WaWV3U2NhbGUgPT0gMAogICAgICAgICAgICAgICAgICAgICAgICAgPyAobVJlc3RvcmVkU2NhbGUgPiAwID8gbVJlc3RvcmVkU2NhbGUgLyAxMDAuMGYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBtUmVzdG9yZVN0YXRlLm1UZXh0V3JhcFNjYWxlKQotICAgICAgICAgICAgICAgICAgICAgICAgOiBtUmVzdG9yZVN0YXRlLm1WaWV3U2NhbGU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogbUluaXRpYWxWaWV3U3RhdGUubVRleHRXcmFwU2NhbGUpCisgICAgICAgICAgICAgICAgICAgICAgICA6IG1Jbml0aWFsVmlld1N0YXRlLm1WaWV3U2NhbGU7CiAgICAgICAgICAgICAgICAgaWYgKERlYnVnRmxhZ3MuV0VCX1ZJRVdfQ09SRSkgewogICAgICAgICAgICAgICAgICAgICBMb2cudihMT0dUQUcsICJzZXR1cFZpZXdwb3J0IgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgbVJlc3RvcmVkU2NhbGU9IiArIG1SZXN0b3JlZFNjYWxlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBtVmlld1NjYWxlPSIgKyBtUmVzdG9yZVN0YXRlLm1WaWV3U2NhbGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIG1UZXh0V3JhcFNjYWxlPSIgKyBtUmVzdG9yZVN0YXRlLm1UZXh0V3JhcFNjYWxlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBtVmlld1NjYWxlPSIgKyBtSW5pdGlhbFZpZXdTdGF0ZS5tVmlld1NjYWxlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBtVGV4dFdyYXBTY2FsZT0iICsgbUluaXRpYWxWaWV3U3RhdGUubVRleHRXcmFwU2NhbGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgZGF0YS5tV2lkdGggPSBNYXRoLnJvdW5kKHdlYlZpZXdXaWR0aCAvIGRhdGEubVNjYWxlKTsKQEAgLTIyMDUsNyArMjIzMyw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICBNYXRoLnJvdW5kKG1XZWJWaWV3LmdldFZpZXdIZWlnaHQoKSAvIGRhdGEubVNjYWxlKQogICAgICAgICAgICAgICAgICAgICAgICAgOiBtQ3VycmVudFZpZXdIZWlnaHQgKiBkYXRhLm1XaWR0aCAvIHZpZXdwb3J0V2lkdGg7CiAgICAgICAgICAgICAgICAgZGF0YS5tVGV4dFdyYXBXaWR0aCA9IE1hdGgucm91bmQod2ViVmlld1dpZHRoCi0gICAgICAgICAgICAgICAgICAgICAgICAvIG1SZXN0b3JlU3RhdGUubVRleHRXcmFwU2NhbGUpOworICAgICAgICAgICAgICAgICAgICAgICAgLyBtSW5pdGlhbFZpZXdTdGF0ZS5tVGV4dFdyYXBTY2FsZSk7CiAgICAgICAgICAgICAgICAgZGF0YS5tSWdub3JlSGVpZ2h0ID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgZGF0YS5tQW5jaG9yWCA9IGRhdGEubUFuY2hvclkgPSAwOwogICAgICAgICAgICAgICAgIC8vIHNlbmQgVklFV19TSVpFX0NIQU5HRUQgdG8gdGhlIGZyb250IG9mIHRoZSBxdWV1ZSBzbyB0aGF0IHdlCkBAIC0yMjE4LDIwICsyMjQ2LDEyIEBACiAgICAgfQogCiAgICAgLy8gY2FsbGVkIGJ5IEpOSQotICAgIHByaXZhdGUgdm9pZCByZXN0b3JlU2NhbGUoaW50IHNjYWxlKSB7CisgICAgcHJpdmF0ZSB2b2lkIHJlc3RvcmVTY2FsZShpbnQgc2NhbGUsIGludCB0ZXh0V3JhcFNjYWxlKSB7CiAgICAgICAgIGlmIChtQnJvd3NlckZyYW1lLmZpcnN0TGF5b3V0RG9uZSgpID09IGZhbHNlKSB7CiAgICAgICAgICAgICBtUmVzdG9yZWRTY2FsZSA9IHNjYWxlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8gY2FsbGVkIGJ5IEpOSQotICAgIHByaXZhdGUgdm9pZCByZXN0b3JlU2NyZWVuV2lkdGhTY2FsZShpbnQgc2NhbGUpIHsKLSAgICAgICAgaWYgKCFtU2V0dGluZ3MuZ2V0VXNlV2lkZVZpZXdQb3J0KCkpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtQnJvd3NlckZyYW1lLmZpcnN0TGF5b3V0RG9uZSgpID09IGZhbHNlKSB7Ci0gICAgICAgICAgICBtUmVzdG9yZWRTY3JlZW5XaWR0aFNjYWxlID0gc2NhbGU7CisgICAgICAgICAgICBpZiAobVNldHRpbmdzLmdldFVzZVdpZGVWaWV3UG9ydCgpKSB7CisgICAgICAgICAgICAgICAgbVJlc3RvcmVkVGV4dFdyYXBTY2FsZSA9IHRleHRXcmFwU2NhbGU7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTIyODEsNiArMjMwMSw3IEBACiAgICAgfQogCiAgICAgcHJpdmF0ZSBuYXRpdmUgdm9pZCBuYXRpdmVVcGRhdGVGcmFtZUNhY2hlSWZMb2FkaW5nKCk7CisgICAgcHJpdmF0ZSBuYXRpdmUgdm9pZCBuYXRpdmVSZXZlYWxTZWxlY3Rpb24oKTsKICAgICBwcml2YXRlIG5hdGl2ZSBTdHJpbmcgbmF0aXZlUmVxdWVzdExhYmVsKGludCBmcmFtZVB0ciwgaW50IG5vZGVQdHIpOwogICAgIC8qKgogICAgICAqIFNjcm9sbCB0aGUgZm9jdXNlZCB0ZXh0ZmllbGQgdG8gKHhQZXJjZW50LCB5KSBpbiBkb2N1bWVudCBzcGFjZQpAQCAtMjQ2OSw2ICsyNDkwLDI0IEBACiAgICAgICAgICAgICAgICAgaE1vZGUsIHZNb2RlKS5zZW5kVG9UYXJnZXQoKTsKICAgICB9CiAKKyAgICBwcml2YXRlIHZvaWQgdXNlTW9ja0RldmljZU9yaWVudGF0aW9uKCkgeworICAgICAgICBtRGV2aWNlT3JpZW50YXRpb25NYW5hZ2VyLnVzZU1vY2soKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRNb2NrRGV2aWNlT3JpZW50YXRpb24oYm9vbGVhbiBjYW5Qcm92aWRlQWxwaGEsIGRvdWJsZSBhbHBoYSwKKyAgICAgICAgICAgIGJvb2xlYW4gY2FuUHJvdmlkZUJldGEsIGRvdWJsZSBiZXRhLCBib29sZWFuIGNhblByb3ZpZGVHYW1tYSwgZG91YmxlIGdhbW1hKSB7CisgICAgICAgIG1EZXZpY2VPcmllbnRhdGlvbk1hbmFnZXIuc2V0TW9ja09yaWVudGF0aW9uKGNhblByb3ZpZGVBbHBoYSwgYWxwaGEsIGNhblByb3ZpZGVCZXRhLCBiZXRhLAorICAgICAgICAgICAgICAgIGNhblByb3ZpZGVHYW1tYSwgZ2FtbWEpOworICAgIH0KKworICAgIHByb3RlY3RlZCBEZXZpY2VPcmllbnRhdGlvblNlcnZpY2UgZ2V0RGV2aWNlT3JpZW50YXRpb25TZXJ2aWNlKCkgeworICAgICAgICBpZiAobURldmljZU9yaWVudGF0aW9uU2VydmljZSA9PSBudWxsKSB7CisgICAgICAgICAgICBtRGV2aWNlT3JpZW50YXRpb25TZXJ2aWNlID0KKyAgICAgICAgICAgICAgICAgICAgbmV3IERldmljZU9yaWVudGF0aW9uU2VydmljZShtRGV2aWNlT3JpZW50YXRpb25NYW5hZ2VyLCBtQ29udGV4dCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG1EZXZpY2VPcmllbnRhdGlvblNlcnZpY2U7CisgICAgfQorCiAgICAgcHJpdmF0ZSBuYXRpdmUgdm9pZCBuYXRpdmVQYXVzZSgpOwogICAgIHByaXZhdGUgbmF0aXZlIHZvaWQgbmF0aXZlUmVzdW1lKCk7CiAgICAgcHJpdmF0ZSBuYXRpdmUgdm9pZCBuYXRpdmVGcmVlTWVtb3J5KCk7CkBAIC0yNDc2LDQgKzI1MTUsNiBAQAogICAgIHByaXZhdGUgbmF0aXZlIGJvb2xlYW4gbmF0aXZlVmFsaWROb2RlQW5kQm91bmRzKGludCBmcmFtZSwgaW50IG5vZGUsCiAgICAgICAgICAgICBSZWN0IGJvdW5kcyk7CiAKKyAgICBwcml2YXRlIG5hdGl2ZSBBcnJheUxpc3Q8UmVjdD4gbmF0aXZlR2V0VG91Y2hIaWdobGlnaHRSZWN0cyhpbnQgeCwgaW50IHksCisgICAgICAgICAgICBpbnQgc2xvcCk7CiB9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC93ZWJraXQvV2ViVmlld0RhdGFiYXNlLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC93ZWJraXQvV2ViVmlld0RhdGFiYXNlLmphdmEKaW5kZXggN2FjZDliYS4uZDdiNDQ1MiAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvd2Via2l0L1dlYlZpZXdEYXRhYmFzZS5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3dlYmtpdC9XZWJWaWV3RGF0YWJhc2UuamF2YQpAQCAtMTczLDExMiArMTczLDE0MCBAQAogCiAgICAgcHJpdmF0ZSBzdGF0aWMgaW50IG1DYWNoZVRyYW5zYWN0aW9uUmVmY291bnQ7CiAKLSAgICBwcml2YXRlIFdlYlZpZXdEYXRhYmFzZSgpIHsKKyAgICAvLyBJbml0aWFsbHkgdHJ1ZSB1bnRpbCB0aGUgYmFja2dyb3VuZCB0aHJlYWQgY29tcGxldGVzLgorICAgIHByaXZhdGUgYm9vbGVhbiBtSW5pdGlhbGl6ZWQgPSBmYWxzZTsKKworICAgIHByaXZhdGUgV2ViVmlld0RhdGFiYXNlKGZpbmFsIENvbnRleHQgY29udGV4dCkgeworICAgICAgICBuZXcgVGhyZWFkKCkgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgaW5pdChjb250ZXh0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfS5zdGFydCgpOworCiAgICAgICAgIC8vIFNpbmdsZXRvbiBvbmx5LCB1c2UgZ2V0SW5zdGFuY2UoKQogICAgIH0KIAogICAgIHB1YmxpYyBzdGF0aWMgc3luY2hyb25pemVkIFdlYlZpZXdEYXRhYmFzZSBnZXRJbnN0YW5jZShDb250ZXh0IGNvbnRleHQpIHsKICAgICAgICAgaWYgKG1JbnN0YW5jZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICBtSW5zdGFuY2UgPSBuZXcgV2ViVmlld0RhdGFiYXNlKCk7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIG1EYXRhYmFzZSA9IGNvbnRleHQKLSAgICAgICAgICAgICAgICAgICAgICAgIC5vcGVuT3JDcmVhdGVEYXRhYmFzZShEQVRBQkFTRV9GSUxFLCAwLCBudWxsKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKFNRTGl0ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgLy8gdHJ5IGFnYWluIGJ5IGRlbGV0aW5nIHRoZSBvbGQgZGIgYW5kIGNyZWF0ZSBhIG5ldyBvbmUKLSAgICAgICAgICAgICAgICBpZiAoY29udGV4dC5kZWxldGVEYXRhYmFzZShEQVRBQkFTRV9GSUxFKSkgewotICAgICAgICAgICAgICAgICAgICBtRGF0YWJhc2UgPSBjb250ZXh0Lm9wZW5PckNyZWF0ZURhdGFiYXNlKERBVEFCQVNFX0ZJTEUsIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQorICAgICAgICAgICAgbUluc3RhbmNlID0gbmV3IFdlYlZpZXdEYXRhYmFzZShjb250ZXh0KTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbUluc3RhbmNlOworICAgIH0KIAotICAgICAgICAgICAgLy8gbURhdGFiYXNlIHNob3VsZCBub3QgYmUgbnVsbCwgCi0gICAgICAgICAgICAvLyB0aGUgb25seSBjYXNlIGlzIFJlcXVlc3RBUEkgdGVzdCBoYXMgcHJvYmxlbSB0byBjcmVhdGUgZGIgCi0gICAgICAgICAgICBpZiAobURhdGFiYXNlICE9IG51bGwgJiYgbURhdGFiYXNlLmdldFZlcnNpb24oKSAhPSBEQVRBQkFTRV9WRVJTSU9OKSB7Ci0gICAgICAgICAgICAgICAgbURhdGFiYXNlLmJlZ2luVHJhbnNhY3Rpb24oKTsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICB1cGdyYWRlRGF0YWJhc2UoKTsKLSAgICAgICAgICAgICAgICAgICAgbURhdGFiYXNlLnNldFRyYW5zYWN0aW9uU3VjY2Vzc2Z1bCgpOwotICAgICAgICAgICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICAgICAgICAgIG1EYXRhYmFzZS5lbmRUcmFuc2FjdGlvbigpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KKyAgICBwcml2YXRlIHN5bmNocm9uaXplZCB2b2lkIGluaXQoQ29udGV4dCBjb250ZXh0KSB7CisgICAgICAgIGlmIChtSW5pdGlhbGl6ZWQpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQogCi0gICAgICAgICAgICBpZiAobURhdGFiYXNlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAvLyB1c2UgcGVyIHRhYmxlIE11dGV4IGxvY2ssIHR1cm4gb2ZmIGRhdGFiYXNlIGxvY2ssIHRoaXMKLSAgICAgICAgICAgICAgICAvLyBpbXByb3ZlcyBwZXJmb3JtYW5jZSBhcyBkYXRhYmFzZSdzIFJlZW50cmFudExvY2sgaXMgZXhwYW5zaXZlCi0gICAgICAgICAgICAgICAgbURhdGFiYXNlLnNldExvY2tpbmdFbmFibGVkKGZhbHNlKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBtQ2FjaGVEYXRhYmFzZSA9IGNvbnRleHQub3Blbk9yQ3JlYXRlRGF0YWJhc2UoCi0gICAgICAgICAgICAgICAgICAgICAgICBDQUNIRV9EQVRBQkFTRV9GSUxFLCAwLCBudWxsKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKFNRTGl0ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgLy8gdHJ5IGFnYWluIGJ5IGRlbGV0aW5nIHRoZSBvbGQgZGIgYW5kIGNyZWF0ZSBhIG5ldyBvbmUKLSAgICAgICAgICAgICAgICBpZiAoY29udGV4dC5kZWxldGVEYXRhYmFzZShDQUNIRV9EQVRBQkFTRV9GSUxFKSkgewotICAgICAgICAgICAgICAgICAgICBtQ2FjaGVEYXRhYmFzZSA9IGNvbnRleHQub3Blbk9yQ3JlYXRlRGF0YWJhc2UoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0FDSEVfREFUQUJBU0VfRklMRSwgMCwgbnVsbCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBtQ2FjaGVEYXRhYmFzZSBzaG91bGQgbm90IGJlIG51bGwsIAotICAgICAgICAgICAgLy8gdGhlIG9ubHkgY2FzZSBpcyBSZXF1ZXN0QVBJIHRlc3QgaGFzIHByb2JsZW0gdG8gY3JlYXRlIGRiIAotICAgICAgICAgICAgaWYgKG1DYWNoZURhdGFiYXNlICE9IG51bGwKLSAgICAgICAgICAgICAgICAgICAgJiYgbUNhY2hlRGF0YWJhc2UuZ2V0VmVyc2lvbigpICE9IENBQ0hFX0RBVEFCQVNFX1ZFUlNJT04pIHsKLSAgICAgICAgICAgICAgICBtQ2FjaGVEYXRhYmFzZS5iZWdpblRyYW5zYWN0aW9uKCk7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgdXBncmFkZUNhY2hlRGF0YWJhc2UoKTsKLSAgICAgICAgICAgICAgICAgICAgYm9vdHN0cmFwQ2FjaGVEYXRhYmFzZSgpOwotICAgICAgICAgICAgICAgICAgICBtQ2FjaGVEYXRhYmFzZS5zZXRUcmFuc2FjdGlvblN1Y2Nlc3NmdWwoKTsKLSAgICAgICAgICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgICAgICAgICBtQ2FjaGVEYXRhYmFzZS5lbmRUcmFuc2FjdGlvbigpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAvLyBFcmFzZSB0aGUgZmlsZXMgZnJvbSB0aGUgZmlsZSBzeXN0ZW0gaW4gdGhlIAotICAgICAgICAgICAgICAgIC8vIGNhc2UgdGhhdCB0aGUgZGF0YWJhc2Ugd2FzIHVwZGF0ZWQgYW5kIHRoZSAKLSAgICAgICAgICAgICAgICAvLyB0aGVyZSB3ZXJlIGV4aXN0aW5nIGNhY2hlIGNvbnRlbnQKLSAgICAgICAgICAgICAgICBDYWNoZU1hbmFnZXIucmVtb3ZlQWxsQ2FjaGVGaWxlcygpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAobUNhY2hlRGF0YWJhc2UgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIC8vIHVzZSByZWFkX3VuY29tbWl0dGVkIHRvIHNwZWVkIHVwIFJFQUQKLSAgICAgICAgICAgICAgICBtQ2FjaGVEYXRhYmFzZS5leGVjU1FMKCJQUkFHTUEgcmVhZF91bmNvbW1pdHRlZCA9IHRydWU7Iik7Ci0gICAgICAgICAgICAgICAgLy8gYXMgb25seSBSRUFEIGNhbiBiZSBjYWxsZWQgaW4gdGhlIG5vbi1XZWJWaWV3V29ya2VyVGhyZWFkLAotICAgICAgICAgICAgICAgIC8vIGFuZCByZWFkX3VuY29tbWl0dGVkIGlzIHVzZWQsIHdlIGNhbiB0dXJuIG9mZiBkYXRhYmFzZSBsb2NrCi0gICAgICAgICAgICAgICAgLy8gdG8gdXNlIHRyYW5zYWN0aW9uLgotICAgICAgICAgICAgICAgIG1DYWNoZURhdGFiYXNlLnNldExvY2tpbmdFbmFibGVkKGZhbHNlKTsKLQotICAgICAgICAgICAgICAgIC8vIHVzZSBJbnNlcnRIZWxwZXIgZm9yIGZhc3RlciBpbnNlcnRpb24KLSAgICAgICAgICAgICAgICBtQ2FjaGVJbnNlcnRlciA9IG5ldyBEYXRhYmFzZVV0aWxzLkluc2VydEhlbHBlcihtQ2FjaGVEYXRhYmFzZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICJjYWNoZSIpOwotICAgICAgICAgICAgICAgIG1DYWNoZVVybENvbEluZGV4ID0gbUNhY2hlSW5zZXJ0ZXIKLSAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRDb2x1bW5JbmRleChDQUNIRV9VUkxfQ09MKTsKLSAgICAgICAgICAgICAgICBtQ2FjaGVGaWxlUGF0aENvbEluZGV4ID0gbUNhY2hlSW5zZXJ0ZXIKLSAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRDb2x1bW5JbmRleChDQUNIRV9GSUxFX1BBVEhfQ09MKTsKLSAgICAgICAgICAgICAgICBtQ2FjaGVMYXN0TW9kaWZ5Q29sSW5kZXggPSBtQ2FjaGVJbnNlcnRlcgotICAgICAgICAgICAgICAgICAgICAgICAgLmdldENvbHVtbkluZGV4KENBQ0hFX0xBU1RfTU9ESUZZX0NPTCk7Ci0gICAgICAgICAgICAgICAgbUNhY2hlRVRhZ0NvbEluZGV4ID0gbUNhY2hlSW5zZXJ0ZXIKLSAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRDb2x1bW5JbmRleChDQUNIRV9FVEFHX0NPTCk7Ci0gICAgICAgICAgICAgICAgbUNhY2hlRXhwaXJlc0NvbEluZGV4ID0gbUNhY2hlSW5zZXJ0ZXIKLSAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRDb2x1bW5JbmRleChDQUNIRV9FWFBJUkVTX0NPTCk7Ci0gICAgICAgICAgICAgICAgbUNhY2hlRXhwaXJlc1N0cmluZ0NvbEluZGV4ID0gbUNhY2hlSW5zZXJ0ZXIKLSAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRDb2x1bW5JbmRleChDQUNIRV9FWFBJUkVTX1NUUklOR19DT0wpOwotICAgICAgICAgICAgICAgIG1DYWNoZU1pbWVUeXBlQ29sSW5kZXggPSBtQ2FjaGVJbnNlcnRlcgotICAgICAgICAgICAgICAgICAgICAgICAgLmdldENvbHVtbkluZGV4KENBQ0hFX01JTUVUWVBFX0NPTCk7Ci0gICAgICAgICAgICAgICAgbUNhY2hlRW5jb2RpbmdDb2xJbmRleCA9IG1DYWNoZUluc2VydGVyCi0gICAgICAgICAgICAgICAgICAgICAgICAuZ2V0Q29sdW1uSW5kZXgoQ0FDSEVfRU5DT0RJTkdfQ09MKTsKLSAgICAgICAgICAgICAgICBtQ2FjaGVIdHRwU3RhdHVzQ29sSW5kZXggPSBtQ2FjaGVJbnNlcnRlcgotICAgICAgICAgICAgICAgICAgICAgICAgLmdldENvbHVtbkluZGV4KENBQ0hFX0hUVFBfU1RBVFVTX0NPTCk7Ci0gICAgICAgICAgICAgICAgbUNhY2hlTG9jYXRpb25Db2xJbmRleCA9IG1DYWNoZUluc2VydGVyCi0gICAgICAgICAgICAgICAgICAgICAgICAuZ2V0Q29sdW1uSW5kZXgoQ0FDSEVfTE9DQVRJT05fQ09MKTsKLSAgICAgICAgICAgICAgICBtQ2FjaGVDb250ZW50TGVuZ3RoQ29sSW5kZXggPSBtQ2FjaGVJbnNlcnRlcgotICAgICAgICAgICAgICAgICAgICAgICAgLmdldENvbHVtbkluZGV4KENBQ0hFX0NPTlRFTlRMRU5HVEhfQ09MKTsKLSAgICAgICAgICAgICAgICBtQ2FjaGVDb250ZW50RGlzcG9zaXRpb25Db2xJbmRleCA9IG1DYWNoZUluc2VydGVyCi0gICAgICAgICAgICAgICAgICAgICAgICAuZ2V0Q29sdW1uSW5kZXgoQ0FDSEVfQ09OVEVOVERJU1BPU0lUSU9OX0NPTCk7Ci0gICAgICAgICAgICAgICAgbUNhY2hlQ3Jvc3NEb21haW5Db2xJbmRleCA9IG1DYWNoZUluc2VydGVyCi0gICAgICAgICAgICAgICAgICAgICAgICAuZ2V0Q29sdW1uSW5kZXgoQ0FDSEVfQ1JPU1NET01BSU5fQ09MKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG1EYXRhYmFzZSA9IGNvbnRleHQub3Blbk9yQ3JlYXRlRGF0YWJhc2UoREFUQUJBU0VfRklMRSwgMCwgbnVsbCk7CisgICAgICAgIH0gY2F0Y2ggKFNRTGl0ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAvLyB0cnkgYWdhaW4gYnkgZGVsZXRpbmcgdGhlIG9sZCBkYiBhbmQgY3JlYXRlIGEgbmV3IG9uZQorICAgICAgICAgICAgaWYgKGNvbnRleHQuZGVsZXRlRGF0YWJhc2UoREFUQUJBU0VfRklMRSkpIHsKKyAgICAgICAgICAgICAgICBtRGF0YWJhc2UgPSBjb250ZXh0Lm9wZW5PckNyZWF0ZURhdGFiYXNlKERBVEFCQVNFX0ZJTEUsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICBudWxsKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCi0gICAgICAgIHJldHVybiBtSW5zdGFuY2U7CisgICAgICAgIC8vIG1EYXRhYmFzZSBzaG91bGQgbm90IGJlIG51bGwsCisgICAgICAgIC8vIHRoZSBvbmx5IGNhc2UgaXMgUmVxdWVzdEFQSSB0ZXN0IGhhcyBwcm9ibGVtIHRvIGNyZWF0ZSBkYgorICAgICAgICBpZiAobURhdGFiYXNlID09IG51bGwpIHsKKyAgICAgICAgICAgIG1Jbml0aWFsaXplZCA9IHRydWU7CisgICAgICAgICAgICBub3RpZnkoKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChtRGF0YWJhc2UuZ2V0VmVyc2lvbigpICE9IERBVEFCQVNFX1ZFUlNJT04pIHsKKyAgICAgICAgICAgIG1EYXRhYmFzZS5iZWdpblRyYW5zYWN0aW9uKCk7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHVwZ3JhZGVEYXRhYmFzZSgpOworICAgICAgICAgICAgICAgIG1EYXRhYmFzZS5zZXRUcmFuc2FjdGlvblN1Y2Nlc3NmdWwoKTsKKyAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgbURhdGFiYXNlLmVuZFRyYW5zYWN0aW9uKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyB1c2UgcGVyIHRhYmxlIE11dGV4IGxvY2ssIHR1cm4gb2ZmIGRhdGFiYXNlIGxvY2ssIHRoaXMKKyAgICAgICAgLy8gaW1wcm92ZXMgcGVyZm9ybWFuY2UgYXMgZGF0YWJhc2UncyBSZWVudHJhbnRMb2NrIGlzCisgICAgICAgIC8vIGV4cGFuc2l2ZQorICAgICAgICBtRGF0YWJhc2Uuc2V0TG9ja2luZ0VuYWJsZWQoZmFsc2UpOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBtQ2FjaGVEYXRhYmFzZSA9IGNvbnRleHQub3Blbk9yQ3JlYXRlRGF0YWJhc2UoCisgICAgICAgICAgICAgICAgICAgIENBQ0hFX0RBVEFCQVNFX0ZJTEUsIDAsIG51bGwpOworICAgICAgICB9IGNhdGNoIChTUUxpdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgLy8gdHJ5IGFnYWluIGJ5IGRlbGV0aW5nIHRoZSBvbGQgZGIgYW5kIGNyZWF0ZSBhIG5ldyBvbmUKKyAgICAgICAgICAgIGlmIChjb250ZXh0LmRlbGV0ZURhdGFiYXNlKENBQ0hFX0RBVEFCQVNFX0ZJTEUpKSB7CisgICAgICAgICAgICAgICAgbUNhY2hlRGF0YWJhc2UgPSBjb250ZXh0Lm9wZW5PckNyZWF0ZURhdGFiYXNlKAorICAgICAgICAgICAgICAgICAgICAgICAgQ0FDSEVfREFUQUJBU0VfRklMRSwgMCwgbnVsbCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBtQ2FjaGVEYXRhYmFzZSBzaG91bGQgbm90IGJlIG51bGwsCisgICAgICAgIC8vIHRoZSBvbmx5IGNhc2UgaXMgUmVxdWVzdEFQSSB0ZXN0IGhhcyBwcm9ibGVtIHRvIGNyZWF0ZSBkYgorICAgICAgICBpZiAobUNhY2hlRGF0YWJhc2UgPT0gbnVsbCkgeworICAgICAgICAgICAgbUluaXRpYWxpemVkID0gdHJ1ZTsKKyAgICAgICAgICAgIG5vdGlmeSgpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG1DYWNoZURhdGFiYXNlLmdldFZlcnNpb24oKSAhPSBDQUNIRV9EQVRBQkFTRV9WRVJTSU9OKSB7CisgICAgICAgICAgICBtQ2FjaGVEYXRhYmFzZS5iZWdpblRyYW5zYWN0aW9uKCk7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHVwZ3JhZGVDYWNoZURhdGFiYXNlKCk7CisgICAgICAgICAgICAgICAgYm9vdHN0cmFwQ2FjaGVEYXRhYmFzZSgpOworICAgICAgICAgICAgICAgIG1DYWNoZURhdGFiYXNlLnNldFRyYW5zYWN0aW9uU3VjY2Vzc2Z1bCgpOworICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICBtQ2FjaGVEYXRhYmFzZS5lbmRUcmFuc2FjdGlvbigpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gRXJhc2UgdGhlIGZpbGVzIGZyb20gdGhlIGZpbGUgc3lzdGVtIGluIHRoZQorICAgICAgICAgICAgLy8gY2FzZSB0aGF0IHRoZSBkYXRhYmFzZSB3YXMgdXBkYXRlZCBhbmQgdGhlCisgICAgICAgICAgICAvLyB0aGVyZSB3ZXJlIGV4aXN0aW5nIGNhY2hlIGNvbnRlbnQKKyAgICAgICAgICAgIENhY2hlTWFuYWdlci5yZW1vdmVBbGxDYWNoZUZpbGVzKCk7CisgICAgICAgIH0KKworICAgICAgICAvLyB1c2UgcmVhZF91bmNvbW1pdHRlZCB0byBzcGVlZCB1cCBSRUFECisgICAgICAgIG1DYWNoZURhdGFiYXNlLmV4ZWNTUUwoIlBSQUdNQSByZWFkX3VuY29tbWl0dGVkID0gdHJ1ZTsiKTsKKyAgICAgICAgLy8gYXMgb25seSBSRUFEIGNhbiBiZSBjYWxsZWQgaW4gdGhlCisgICAgICAgIC8vIG5vbi1XZWJWaWV3V29ya2VyVGhyZWFkLCBhbmQgcmVhZF91bmNvbW1pdHRlZCBpcyB1c2VkLAorICAgICAgICAvLyB3ZSBjYW4gdHVybiBvZmYgZGF0YWJhc2UgbG9jayB0byB1c2UgdHJhbnNhY3Rpb24uCisgICAgICAgIG1DYWNoZURhdGFiYXNlLnNldExvY2tpbmdFbmFibGVkKGZhbHNlKTsKKworICAgICAgICAvLyB1c2UgSW5zZXJ0SGVscGVyIGZvciBmYXN0ZXIgaW5zZXJ0aW9uCisgICAgICAgIG1DYWNoZUluc2VydGVyID0KKyAgICAgICAgICAgICAgICBuZXcgRGF0YWJhc2VVdGlscy5JbnNlcnRIZWxwZXIobUNhY2hlRGF0YWJhc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAiY2FjaGUiKTsKKyAgICAgICAgbUNhY2hlVXJsQ29sSW5kZXggPSBtQ2FjaGVJbnNlcnRlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRDb2x1bW5JbmRleChDQUNIRV9VUkxfQ09MKTsKKyAgICAgICAgbUNhY2hlRmlsZVBhdGhDb2xJbmRleCA9IG1DYWNoZUluc2VydGVyCisgICAgICAgICAgICAgICAgLmdldENvbHVtbkluZGV4KENBQ0hFX0ZJTEVfUEFUSF9DT0wpOworICAgICAgICBtQ2FjaGVMYXN0TW9kaWZ5Q29sSW5kZXggPSBtQ2FjaGVJbnNlcnRlcgorICAgICAgICAgICAgICAgIC5nZXRDb2x1bW5JbmRleChDQUNIRV9MQVNUX01PRElGWV9DT0wpOworICAgICAgICBtQ2FjaGVFVGFnQ29sSW5kZXggPSBtQ2FjaGVJbnNlcnRlcgorICAgICAgICAgICAgICAgIC5nZXRDb2x1bW5JbmRleChDQUNIRV9FVEFHX0NPTCk7CisgICAgICAgIG1DYWNoZUV4cGlyZXNDb2xJbmRleCA9IG1DYWNoZUluc2VydGVyCisgICAgICAgICAgICAgICAgLmdldENvbHVtbkluZGV4KENBQ0hFX0VYUElSRVNfQ09MKTsKKyAgICAgICAgbUNhY2hlRXhwaXJlc1N0cmluZ0NvbEluZGV4ID0gbUNhY2hlSW5zZXJ0ZXIKKyAgICAgICAgICAgICAgICAuZ2V0Q29sdW1uSW5kZXgoQ0FDSEVfRVhQSVJFU19TVFJJTkdfQ09MKTsKKyAgICAgICAgbUNhY2hlTWltZVR5cGVDb2xJbmRleCA9IG1DYWNoZUluc2VydGVyCisgICAgICAgICAgICAgICAgLmdldENvbHVtbkluZGV4KENBQ0hFX01JTUVUWVBFX0NPTCk7CisgICAgICAgIG1DYWNoZUVuY29kaW5nQ29sSW5kZXggPSBtQ2FjaGVJbnNlcnRlcgorICAgICAgICAgICAgICAgIC5nZXRDb2x1bW5JbmRleChDQUNIRV9FTkNPRElOR19DT0wpOworICAgICAgICBtQ2FjaGVIdHRwU3RhdHVzQ29sSW5kZXggPSBtQ2FjaGVJbnNlcnRlcgorICAgICAgICAgICAgICAgIC5nZXRDb2x1bW5JbmRleChDQUNIRV9IVFRQX1NUQVRVU19DT0wpOworICAgICAgICBtQ2FjaGVMb2NhdGlvbkNvbEluZGV4ID0gbUNhY2hlSW5zZXJ0ZXIKKyAgICAgICAgICAgICAgICAuZ2V0Q29sdW1uSW5kZXgoQ0FDSEVfTE9DQVRJT05fQ09MKTsKKyAgICAgICAgbUNhY2hlQ29udGVudExlbmd0aENvbEluZGV4ID0gbUNhY2hlSW5zZXJ0ZXIKKyAgICAgICAgICAgICAgICAuZ2V0Q29sdW1uSW5kZXgoQ0FDSEVfQ09OVEVOVExFTkdUSF9DT0wpOworICAgICAgICBtQ2FjaGVDb250ZW50RGlzcG9zaXRpb25Db2xJbmRleCA9IG1DYWNoZUluc2VydGVyCisgICAgICAgICAgICAgICAgLmdldENvbHVtbkluZGV4KENBQ0hFX0NPTlRFTlRESVNQT1NJVElPTl9DT0wpOworICAgICAgICBtQ2FjaGVDcm9zc0RvbWFpbkNvbEluZGV4ID0gbUNhY2hlSW5zZXJ0ZXIKKyAgICAgICAgICAgICAgICAuZ2V0Q29sdW1uSW5kZXgoQ0FDSEVfQ1JPU1NET01BSU5fQ09MKTsKKworICAgICAgICAvLyBUaHJlYWQgZG9uZSwgbm90aWZ5LgorICAgICAgICBtSW5pdGlhbGl6ZWQgPSB0cnVlOworICAgICAgICBub3RpZnkoKTsKICAgICB9CiAKICAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHVwZ3JhZGVEYXRhYmFzZSgpIHsKQEAgLTM5MSw4ICs0MTksMjUgQEAKICAgICAgICAgfQogICAgIH0KIAorICAgIC8vIFdhaXQgZm9yIHRoZSBiYWNrZ3JvdW5kIGluaXRpYWxpemF0aW9uIHRocmVhZCB0byBjb21wbGV0ZSBhbmQgY2hlY2sgdGhlCisgICAgLy8gZGF0YWJhc2UgY3JlYXRpb24gc3RhdHVzLgorICAgIHByaXZhdGUgYm9vbGVhbiBjaGVja0luaXRpYWxpemVkKCkgeworICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKKyAgICAgICAgICAgIHdoaWxlICghbUluaXRpYWxpemVkKSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgd2FpdCgpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgTG9nLmUoTE9HVEFHLCAiQ2F1Z2h0IGV4Y2VwdGlvbiB3aGlsZSBjaGVja2luZyAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaW5pdGlhbGl6YXRpb24iKTsKKyAgICAgICAgICAgICAgICAgICAgTG9nLmUoTE9HVEFHLCBMb2cuZ2V0U3RhY2tUcmFjZVN0cmluZyhlKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBtRGF0YWJhc2UgIT0gbnVsbDsKKyAgICB9CisKICAgICBwcml2YXRlIGJvb2xlYW4gaGFzRW50cmllcyhpbnQgdGFibGVJZCkgewotICAgICAgICBpZiAobURhdGFiYXNlID09IG51bGwpIHsKKyAgICAgICAgaWYgKCFjaGVja0luaXRpYWxpemVkKCkpIHsKICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfQogCkBAIC00MjIsNyArNDY3LDcgQEAKICAgICAgKi8KICAgICBBcnJheUxpc3Q8Q29va2llPiBnZXRDb29raWVzRm9yRG9tYWluKFN0cmluZyBkb21haW4pIHsKICAgICAgICAgQXJyYXlMaXN0PENvb2tpZT4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8Q29va2llPigpOwotICAgICAgICBpZiAoZG9tYWluID09IG51bGwgfHwgbURhdGFiYXNlID09IG51bGwpIHsKKyAgICAgICAgaWYgKGRvbWFpbiA9PSBudWxsIHx8ICFjaGVja0luaXRpYWxpemVkKCkpIHsKICAgICAgICAgICAgIHJldHVybiBsaXN0OwogICAgICAgICB9CiAKQEAgLTQ4MSw3ICs1MjYsNyBAQAogICAgICAqICAgICAgICAgICAgZGVsZXRlZC4KICAgICAgKi8KICAgICB2b2lkIGRlbGV0ZUNvb2tpZXMoU3RyaW5nIGRvbWFpbiwgU3RyaW5nIHBhdGgsIFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIGlmIChkb21haW4gPT0gbnVsbCB8fCBtRGF0YWJhc2UgPT0gbnVsbCkgeworICAgICAgICBpZiAoZG9tYWluID09IG51bGwgfHwgIWNoZWNrSW5pdGlhbGl6ZWQoKSkgewogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CiAKQEAgLTUwMSw3ICs1NDYsNyBAQAogICAgICAqLwogICAgIHZvaWQgYWRkQ29va2llKENvb2tpZSBjb29raWUpIHsKICAgICAgICAgaWYgKGNvb2tpZS5kb21haW4gPT0gbnVsbCB8fCBjb29raWUucGF0aCA9PSBudWxsIHx8IGNvb2tpZS5uYW1lID09IG51bGwKLSAgICAgICAgICAgICAgICB8fCBtRGF0YWJhc2UgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHx8ICFjaGVja0luaXRpYWxpemVkKCkpIHsKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQogCkBAIC01MzQsNyArNTc5LDcgQEAKICAgICAgKiBDbGVhciBjb29raWUgZGF0YWJhc2UKICAgICAgKi8KICAgICB2b2lkIGNsZWFyQ29va2llcygpIHsKLSAgICAgICAgaWYgKG1EYXRhYmFzZSA9PSBudWxsKSB7CisgICAgICAgIGlmICghY2hlY2tJbml0aWFsaXplZCgpKSB7CiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KIApAQCAtNTQ3LDcgKzU5Miw3IEBACiAgICAgICogQ2xlYXIgc2Vzc2lvbiBjb29raWVzLCB3aGljaCBtZWFucyBjb29raWUgZG9lc24ndCBoYXZlIEVYUElSRVMuCiAgICAgICovCiAgICAgdm9pZCBjbGVhclNlc3Npb25Db29raWVzKCkgewotICAgICAgICBpZiAobURhdGFiYXNlID09IG51bGwpIHsKKyAgICAgICAgaWYgKCFjaGVja0luaXRpYWxpemVkKCkpIHsKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQogCkBAIC01NjQsNyArNjA5LDcgQEAKICAgICAgKiBAcGFyYW0gbm93IFRpbWUgZm9yIG5vdwogICAgICAqLwogICAgIHZvaWQgY2xlYXJFeHBpcmVkQ29va2llcyhsb25nIG5vdykgewotICAgICAgICBpZiAobURhdGFiYXNlID09IG51bGwpIHsKKyAgICAgICAgaWYgKCFjaGVja0luaXRpYWxpemVkKCkpIHsKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQogCkBAIC02MjAsNyArNjY1LDcgQEAKICAgICAgKiBAcmV0dXJuIENhY2hlUmVzdWx0IFRoZSBDYWNoZU1hbmFnZXIuQ2FjaGVSZXN1bHQKICAgICAgKi8KICAgICBDYWNoZVJlc3VsdCBnZXRDYWNoZShTdHJpbmcgdXJsKSB7Ci0gICAgICAgIGlmICh1cmwgPT0gbnVsbCB8fCBtQ2FjaGVEYXRhYmFzZSA9PSBudWxsKSB7CisgICAgICAgIGlmICh1cmwgPT0gbnVsbCB8fCAhY2hlY2tJbml0aWFsaXplZCgpKSB7CiAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgfQogCkBAIC02NjAsNyArNzA1LDcgQEAKICAgICAgKiBAcGFyYW0gdXJsIFRoZSB1cmwKICAgICAgKi8KICAgICB2b2lkIHJlbW92ZUNhY2hlKFN0cmluZyB1cmwpIHsKLSAgICAgICAgaWYgKHVybCA9PSBudWxsIHx8IG1DYWNoZURhdGFiYXNlID09IG51bGwpIHsKKyAgICAgICAgaWYgKHVybCA9PSBudWxsIHx8ICFjaGVja0luaXRpYWxpemVkKCkpIHsKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQogCkBAIC02NzQsNyArNzE5LDcgQEAKICAgICAgKiBAcGFyYW0gYyBUaGUgQ2FjaGVNYW5hZ2VyLkNhY2hlUmVzdWx0CiAgICAgICovCiAgICAgdm9pZCBhZGRDYWNoZShTdHJpbmcgdXJsLCBDYWNoZVJlc3VsdCBjKSB7Ci0gICAgICAgIGlmICh1cmwgPT0gbnVsbCB8fCBtQ2FjaGVEYXRhYmFzZSA9PSBudWxsKSB7CisgICAgICAgIGlmICh1cmwgPT0gbnVsbCB8fCAhY2hlY2tJbml0aWFsaXplZCgpKSB7CiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KIApAQCAtNzAwLDcgKzc0NSw3IEBACiAgICAgICogQ2xlYXIgY2FjaGUgZGF0YWJhc2UKICAgICAgKi8KICAgICB2b2lkIGNsZWFyQ2FjaGUoKSB7Ci0gICAgICAgIGlmIChtQ2FjaGVEYXRhYmFzZSA9PSBudWxsKSB7CisgICAgICAgIGlmICghY2hlY2tJbml0aWFsaXplZCgpKSB7CiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KIApAQCAtNzA4LDcgKzc1Myw3IEBACiAgICAgfQogCiAgICAgYm9vbGVhbiBoYXNDYWNoZSgpIHsKLSAgICAgICAgaWYgKG1DYWNoZURhdGFiYXNlID09IG51bGwpIHsKKyAgICAgICAgaWYgKCFjaGVja0luaXRpYWxpemVkKCkpIHsKICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfQogCkBAIC04MzQsNyArODc5LDcgQEAKICAgICAgKi8KICAgICB2b2lkIHNldFVzZXJuYW1lUGFzc3dvcmQoU3RyaW5nIHNjaGVtZVBsdXNIb3N0LCBTdHJpbmcgdXNlcm5hbWUsCiAgICAgICAgICAgICAgICAgU3RyaW5nIHBhc3N3b3JkKSB7Ci0gICAgICAgIGlmIChzY2hlbWVQbHVzSG9zdCA9PSBudWxsIHx8IG1EYXRhYmFzZSA9PSBudWxsKSB7CisgICAgICAgIGlmIChzY2hlbWVQbHVzSG9zdCA9PSBudWxsIHx8ICFjaGVja0luaXRpYWxpemVkKCkpIHsKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQogCkBAIC04NTYsNyArOTAxLDcgQEAKICAgICAgKiAgICAgICAgIFN0cmluZ1sxXSBpcyBwYXNzd29yZC4gUmV0dXJuIG51bGwgaWYgaXQgY2FuJ3QgZmluZCBhbnl0aGluZy4KICAgICAgKi8KICAgICBTdHJpbmdbXSBnZXRVc2VybmFtZVBhc3N3b3JkKFN0cmluZyBzY2hlbWVQbHVzSG9zdCkgewotICAgICAgICBpZiAoc2NoZW1lUGx1c0hvc3QgPT0gbnVsbCB8fCBtRGF0YWJhc2UgPT0gbnVsbCkgeworICAgICAgICBpZiAoc2NoZW1lUGx1c0hvc3QgPT0gbnVsbCB8fCAhY2hlY2tJbml0aWFsaXplZCgpKSB7CiAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgfQogCkBAIC05MDIsNyArOTQ3LDcgQEAKICAgICAgKiBDbGVhciBwYXNzd29yZCBkYXRhYmFzZQogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIGNsZWFyVXNlcm5hbWVQYXNzd29yZCgpIHsKLSAgICAgICAgaWYgKG1EYXRhYmFzZSA9PSBudWxsKSB7CisgICAgICAgIGlmICghY2hlY2tJbml0aWFsaXplZCgpKSB7CiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KIApAQCAtOTI3LDcgKzk3Miw3IEBACiAgICAgICovCiAgICAgdm9pZCBzZXRIdHRwQXV0aFVzZXJuYW1lUGFzc3dvcmQoU3RyaW5nIGhvc3QsIFN0cmluZyByZWFsbSwgU3RyaW5nIHVzZXJuYW1lLAogICAgICAgICAgICAgU3RyaW5nIHBhc3N3b3JkKSB7Ci0gICAgICAgIGlmIChob3N0ID09IG51bGwgfHwgcmVhbG0gPT0gbnVsbCB8fCBtRGF0YWJhc2UgPT0gbnVsbCkgeworICAgICAgICBpZiAoaG9zdCA9PSBudWxsIHx8IHJlYWxtID09IG51bGwgfHwgIWNoZWNrSW5pdGlhbGl6ZWQoKSkgewogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CiAKQEAgLTk1Miw3ICs5OTcsNyBAQAogICAgICAqICAgICAgICAgU3RyaW5nWzFdIGlzIHBhc3N3b3JkLiBSZXR1cm4gbnVsbCBpZiBpdCBjYW4ndCBmaW5kIGFueXRoaW5nLgogICAgICAqLwogICAgIFN0cmluZ1tdIGdldEh0dHBBdXRoVXNlcm5hbWVQYXNzd29yZChTdHJpbmcgaG9zdCwgU3RyaW5nIHJlYWxtKSB7Ci0gICAgICAgIGlmIChob3N0ID09IG51bGwgfHwgcmVhbG0gPT0gbnVsbCB8fCBtRGF0YWJhc2UgPT0gbnVsbCl7CisgICAgICAgIGlmIChob3N0ID09IG51bGwgfHwgcmVhbG0gPT0gbnVsbCB8fCAhY2hlY2tJbml0aWFsaXplZCgpKXsKICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICB9CiAKQEAgLTk5OSw3ICsxMDQ0LDcgQEAKICAgICAgKiBDbGVhciBIVFRQIGF1dGhlbnRpY2F0aW9uIHBhc3N3b3JkIGRhdGFiYXNlCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgY2xlYXJIdHRwQXV0aFVzZXJuYW1lUGFzc3dvcmQoKSB7Ci0gICAgICAgIGlmIChtRGF0YWJhc2UgPT0gbnVsbCkgeworICAgICAgICBpZiAoIWNoZWNrSW5pdGlhbGl6ZWQoKSkgewogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CiAKQEAgLTEwMjAsNyArMTA2NSw3IEBACiAgICAgICogQHBhcmFtIGZvcm1kYXRhIFRoZSBmb3JtIGRhdGEgaW4gSGFzaE1hcAogICAgICAqLwogICAgIHZvaWQgc2V0Rm9ybURhdGEoU3RyaW5nIHVybCwgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4gZm9ybWRhdGEpIHsKLSAgICAgICAgaWYgKHVybCA9PSBudWxsIHx8IGZvcm1kYXRhID09IG51bGwgfHwgbURhdGFiYXNlID09IG51bGwpIHsKKyAgICAgICAgaWYgKHVybCA9PSBudWxsIHx8IGZvcm1kYXRhID09IG51bGwgfHwgIWNoZWNrSW5pdGlhbGl6ZWQoKSkgewogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CiAKQEAgLTEwNjksNyArMTExNCw3IEBACiAgICAgICovCiAgICAgQXJyYXlMaXN0PFN0cmluZz4gZ2V0Rm9ybURhdGEoU3RyaW5nIHVybCwgU3RyaW5nIG5hbWUpIHsKICAgICAgICAgQXJyYXlMaXN0PFN0cmluZz4gdmFsdWVzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0gICAgICAgIGlmICh1cmwgPT0gbnVsbCB8fCBuYW1lID09IG51bGwgfHwgbURhdGFiYXNlID09IG51bGwpIHsKKyAgICAgICAgaWYgKHVybCA9PSBudWxsIHx8IG5hbWUgPT0gbnVsbCB8fCAhY2hlY2tJbml0aWFsaXplZCgpKSB7CiAgICAgICAgICAgICByZXR1cm4gdmFsdWVzOwogICAgICAgICB9CiAKQEAgLTExMjksNyArMTE3NCw3IEBACiAgICAgICogQ2xlYXIgZm9ybSBkYXRhYmFzZQogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIGNsZWFyRm9ybURhdGEoKSB7Ci0gICAgICAgIGlmIChtRGF0YWJhc2UgPT0gbnVsbCkgeworICAgICAgICBpZiAoIWNoZWNrSW5pdGlhbGl6ZWQoKSkgewogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CiAKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3dlYmtpdC9ab29tQ29udHJvbEJhc2UuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3dlYmtpdC9ab29tQ29udHJvbEJhc2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZTllOGYzCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvd2Via2l0L1pvb21Db250cm9sQmFzZS5qYXZhCkBAIC0wLDAgKzEsNDEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBhbmRyb2lkLndlYmtpdDsKKworaW50ZXJmYWNlIFpvb21Db250cm9sQmFzZSB7CisKKyAgICAvKioKKyAgICAgKiBDYXVzZXMgdGhlIG9uLXNjcmVlbiB6b29tIGNvbnRyb2wgdG8gYmUgbWFkZSB2aXNpYmxlCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2hvdygpOworCisgICAgLyoqCisgICAgICogQ2F1c2VzIHRoZSBvbi1zY3JlZW4gem9vbSBjb250cm9sIHRvIGRpc2FwcGVhcgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGhpZGUoKTsKKworICAgIC8qKgorICAgICAqIEVuYWJsZXMgdGhlIGNvbnRyb2wgdG8gdXBkYXRlIGl0cyBzdGF0ZSBpZiBuZWNlc3NhcnkgaW4gcmVzcG9uc2UgdG8gYQorICAgICAqIGNoYW5nZSBpbiB0aGUgcGFnZXMgem9vbSBsZXZlbC4gRm9yIGV4YW1wbGUsIGlmIHRoZSBtYXggem9vbSBsZXZlbCBpcworICAgICAqIHJlYWNoZWQgdGhlbiB0aGUgY29udHJvbCBjYW4gZGlzYWJsZSB0aGUgYnV0dG9uIGZvciB6b29taW5nIGluLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHVwZGF0ZSgpOworCisgICAgLyoqCisgICAgICogQ2hlY2tzIHRvIHNlZSBpZiB0aGUgY29udHJvbCBpcyBjdXJyZW50bHkgdmlzaWJsZSB0byB0aGUgdXNlci4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc1Zpc2libGUoKTsKK30KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3dlYmtpdC9ab29tQ29udHJvbEVtYmVkZGVkLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC93ZWJraXQvWm9vbUNvbnRyb2xFbWJlZGRlZC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMyOWU3MmIKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2phdmEvYW5kcm9pZC93ZWJraXQvWm9vbUNvbnRyb2xFbWJlZGRlZC5qYXZhCkBAIC0wLDAgKzEsMTE3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2UgYW5kcm9pZC53ZWJraXQ7CisKK2ltcG9ydCBhbmRyb2lkLnZpZXcuR3Jhdml0eTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlld0dyb3VwOworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkZyYW1lTGF5b3V0OworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlRvYXN0OworaW1wb3J0IGFuZHJvaWQud2lkZ2V0Llpvb21CdXR0b25zQ29udHJvbGxlcjsKKworY2xhc3MgWm9vbUNvbnRyb2xFbWJlZGRlZCBpbXBsZW1lbnRzIFpvb21Db250cm9sQmFzZSB7CisKKyAgICBwcml2YXRlIGZpbmFsIFpvb21NYW5hZ2VyIG1ab29tTWFuYWdlcjsKKyAgICBwcml2YXRlIGZpbmFsIFdlYlZpZXcgbVdlYlZpZXc7CisKKyAgICAvLyBUaGUgY29udHJvbGxlciBpcyBsYXppbHkgaW5pdGlhbGl6ZWQgaW4gZ2V0Q29udHJvbHMoKSBmb3IgcGVyZm9ybWFuY2UuCisgICAgcHJpdmF0ZSBab29tQnV0dG9uc0NvbnRyb2xsZXIgbVpvb21CdXR0b25zQ29udHJvbGxlcjsKKworICAgIHB1YmxpYyBab29tQ29udHJvbEVtYmVkZGVkKFpvb21NYW5hZ2VyIHpvb21NYW5hZ2VyLCBXZWJWaWV3IHdlYlZpZXcpIHsKKyAgICAgICAgbVpvb21NYW5hZ2VyID0gem9vbU1hbmFnZXI7CisgICAgICAgIG1XZWJWaWV3ID0gd2ViVmlldzsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzaG93KCkgeworICAgICAgICBpZiAoIWdldENvbnRyb2xzKCkuaXNWaXNpYmxlKCkgJiYgIW1ab29tTWFuYWdlci5pc1pvb21TY2FsZUZpeGVkKCkpIHsKKworICAgICAgICAgICAgbVpvb21CdXR0b25zQ29udHJvbGxlci5zZXRWaXNpYmxlKHRydWUpOworCisgICAgICAgICAgICBXZWJTZXR0aW5ncyBzZXR0aW5ncyA9IG1XZWJWaWV3LmdldFNldHRpbmdzKCk7CisgICAgICAgICAgICBpbnQgY291bnQgPSBzZXR0aW5ncy5nZXREb3VibGVUYXBUb2FzdENvdW50KCk7CisgICAgICAgICAgICBpZiAobVpvb21NYW5hZ2VyLmlzSW5ab29tT3ZlcnZpZXcoKSAmJiBjb3VudCA+IDApIHsKKyAgICAgICAgICAgICAgICBzZXR0aW5ncy5zZXREb3VibGVUYXBUb2FzdENvdW50KC0tY291bnQpOworICAgICAgICAgICAgICAgIFRvYXN0Lm1ha2VUZXh0KG1XZWJWaWV3LmdldENvbnRleHQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3RyaW5nLmRvdWJsZV90YXBfdG9hc3QsCisgICAgICAgICAgICAgICAgICAgICAgICBUb2FzdC5MRU5HVEhfTE9ORykuc2hvdygpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgaGlkZSgpIHsKKyAgICAgICAgaWYgKG1ab29tQnV0dG9uc0NvbnRyb2xsZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgbVpvb21CdXR0b25zQ29udHJvbGxlci5zZXRWaXNpYmxlKGZhbHNlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGlzVmlzaWJsZSgpIHsKKyAgICAgICAgcmV0dXJuIG1ab29tQnV0dG9uc0NvbnRyb2xsZXIgIT0gbnVsbCAmJiBtWm9vbUJ1dHRvbnNDb250cm9sbGVyLmlzVmlzaWJsZSgpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHVwZGF0ZSgpIHsKKyAgICAgICAgaWYgKG1ab29tQnV0dG9uc0NvbnRyb2xsZXIgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgYm9vbGVhbiBjYW5ab29tSW4gPSBtWm9vbU1hbmFnZXIuY2FuWm9vbUluKCk7CisgICAgICAgIGJvb2xlYW4gY2FuWm9vbU91dCA9IG1ab29tTWFuYWdlci5jYW5ab29tT3V0KCkgJiYgIW1ab29tTWFuYWdlci5pc0luWm9vbU92ZXJ2aWV3KCk7CisgICAgICAgIGlmICghY2FuWm9vbUluICYmICFjYW5ab29tT3V0KSB7CisgICAgICAgICAgICAvLyBIaWRlIHRoZSB6b29tIGluIGFuZCBvdXQgYnV0dG9ucyBpZiB0aGUgcGFnZSBjYW5ub3Qgem9vbQorICAgICAgICAgICAgbVpvb21CdXR0b25zQ29udHJvbGxlci5nZXRab29tQ29udHJvbHMoKS5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBTZXQgZWFjaCBvbmUgaW5kaXZpZHVhbGx5LCBhcyBhIHBhZ2UgbWF5IGJlIGFibGUgdG8gem9vbSBpbiBvciBvdXQKKyAgICAgICAgICAgIG1ab29tQnV0dG9uc0NvbnRyb2xsZXIuc2V0Wm9vbUluRW5hYmxlZChjYW5ab29tSW4pOworICAgICAgICAgICAgbVpvb21CdXR0b25zQ29udHJvbGxlci5zZXRab29tT3V0RW5hYmxlZChjYW5ab29tT3V0KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgWm9vbUJ1dHRvbnNDb250cm9sbGVyIGdldENvbnRyb2xzKCkgeworICAgICAgICBpZiAobVpvb21CdXR0b25zQ29udHJvbGxlciA9PSBudWxsKSB7CisgICAgICAgICAgICBtWm9vbUJ1dHRvbnNDb250cm9sbGVyID0gbmV3IFpvb21CdXR0b25zQ29udHJvbGxlcihtV2ViVmlldyk7CisgICAgICAgICAgICBtWm9vbUJ1dHRvbnNDb250cm9sbGVyLnNldE9uWm9vbUxpc3RlbmVyKG5ldyBab29tTGlzdGVuZXIoKSk7CisgICAgICAgICAgICAvLyBab29tQnV0dG9uc0NvbnRyb2xsZXIgcG9zaXRpb25zIHRoZSBidXR0b25zIGF0IHRoZSBib3R0b20sIGJ1dCBpbgorICAgICAgICAgICAgLy8gdGhlIG1pZGRsZS4gQ2hhbmdlIHRoZWlyIGxheW91dCBwYXJhbWV0ZXJzIHNvIHRoZXkgYXBwZWFyIG9uIHRoZQorICAgICAgICAgICAgLy8gcmlnaHQuCisgICAgICAgICAgICBWaWV3IGNvbnRyb2xzID0gbVpvb21CdXR0b25zQ29udHJvbGxlci5nZXRab29tQ29udHJvbHMoKTsKKyAgICAgICAgICAgIFZpZXdHcm91cC5MYXlvdXRQYXJhbXMgcGFyYW1zID0gY29udHJvbHMuZ2V0TGF5b3V0UGFyYW1zKCk7CisgICAgICAgICAgICBpZiAocGFyYW1zIGluc3RhbmNlb2YgRnJhbWVMYXlvdXQuTGF5b3V0UGFyYW1zKSB7CisgICAgICAgICAgICAgICAgKChGcmFtZUxheW91dC5MYXlvdXRQYXJhbXMpIHBhcmFtcykuZ3Jhdml0eSA9IEdyYXZpdHkuUklHSFQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG1ab29tQnV0dG9uc0NvbnRyb2xsZXI7CisgICAgfQorCisgICAgcHJpdmF0ZSBjbGFzcyBab29tTGlzdGVuZXIgaW1wbGVtZW50cyBab29tQnV0dG9uc0NvbnRyb2xsZXIuT25ab29tTGlzdGVuZXIgeworCisgICAgICAgIHB1YmxpYyB2b2lkIG9uVmlzaWJpbGl0eUNoYW5nZWQoYm9vbGVhbiB2aXNpYmxlKSB7CisgICAgICAgICAgICBpZiAodmlzaWJsZSkgeworICAgICAgICAgICAgICAgIG1XZWJWaWV3LnN3aXRjaE91dERyYXdIaXN0b3J5KCk7CisgICAgICAgICAgICAgICAgLy8gQnJpbmcgYmFjayB0aGUgaGlkZGVuIHpvb20gY29udHJvbHMuCisgICAgICAgICAgICAgICAgbVpvb21CdXR0b25zQ29udHJvbGxlci5nZXRab29tQ29udHJvbHMoKS5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7CisgICAgICAgICAgICAgICAgdXBkYXRlKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBvblpvb20oYm9vbGVhbiB6b29tSW4pIHsKKyAgICAgICAgICAgIGlmICh6b29tSW4pIHsKKyAgICAgICAgICAgICAgICBtV2ViVmlldy56b29tSW4oKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbVdlYlZpZXcuem9vbU91dCgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdXBkYXRlKCk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC93ZWJraXQvWm9vbUNvbnRyb2xFeHRlcm5hbC5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvd2Via2l0L1pvb21Db250cm9sRXh0ZXJuYWwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNzUzMTNlCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvd2Via2l0L1pvb21Db250cm9sRXh0ZXJuYWwuamF2YQpAQCAtMCwwICsxLDE1OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIGFuZHJvaWQud2Via2l0OworCitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyOworaW1wb3J0IGFuZHJvaWQudmlldy5MYXlvdXRJbmZsYXRlcjsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlld0NvbmZpZ3VyYXRpb247CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXcuT25DbGlja0xpc3RlbmVyOworaW1wb3J0IGFuZHJvaWQudmlldy5hbmltYXRpb24uQWxwaGFBbmltYXRpb247CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuRnJhbWVMYXlvdXQ7CisKK0BEZXByZWNhdGVkCitjbGFzcyBab29tQ29udHJvbEV4dGVybmFsIGltcGxlbWVudHMgWm9vbUNvbnRyb2xCYXNlIHsKKworICAgIC8vIFRoZSB0aW1lIHRoYXQgdGhlIGV4dGVybmFsIGNvbnRyb2xzIGFyZSB2aXNpYmxlIGJlZm9yZSBmYWRpbmcgYXdheQorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgWk9PTV9DT05UUk9MU19USU1FT1VUID0KKyAgICAgICAgICAgIFZpZXdDb25maWd1cmF0aW9uLmdldFpvb21Db250cm9sc1RpbWVvdXQoKTsKKyAgICAvLyBUaGUgdmlldyBjb250YWluaW5nIHRoZSBleHRlcm5hbCB6b29tIGNvbnRyb2xzCisgICAgcHJpdmF0ZSBFeHRlbmRlZFpvb21Db250cm9scyBtWm9vbUNvbnRyb2xzOworICAgIHByaXZhdGUgUnVubmFibGUgbVpvb21Db250cm9sUnVubmFibGU7CisgICAgcHJpdmF0ZSBmaW5hbCBIYW5kbGVyIG1Qcml2YXRlSGFuZGxlciA9IG5ldyBIYW5kbGVyKCk7CisKKyAgICBwcml2YXRlIGZpbmFsIFdlYlZpZXcgbVdlYlZpZXc7CisKKyAgICBwdWJsaWMgWm9vbUNvbnRyb2xFeHRlcm5hbChXZWJWaWV3IHdlYlZpZXcpIHsKKyAgICAgICAgbVdlYlZpZXcgPSB3ZWJWaWV3OworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNob3coKSB7CisgICAgICAgIGlmKG1ab29tQ29udHJvbFJ1bm5hYmxlICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1Qcml2YXRlSGFuZGxlci5yZW1vdmVDYWxsYmFja3MobVpvb21Db250cm9sUnVubmFibGUpOworICAgICAgICB9CisgICAgICAgIGdldENvbnRyb2xzKCkuc2hvdyh0cnVlKTsKKyAgICAgICAgbVByaXZhdGVIYW5kbGVyLnBvc3REZWxheWVkKG1ab29tQ29udHJvbFJ1bm5hYmxlLCBaT09NX0NPTlRST0xTX1RJTUVPVVQpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGhpZGUoKSB7CisgICAgICAgIGlmIChtWm9vbUNvbnRyb2xSdW5uYWJsZSAhPSBudWxsKSB7CisgICAgICAgICAgICBtUHJpdmF0ZUhhbmRsZXIucmVtb3ZlQ2FsbGJhY2tzKG1ab29tQ29udHJvbFJ1bm5hYmxlKTsKKyAgICAgICAgfQorICAgICAgICBpZiAobVpvb21Db250cm9scyAhPSBudWxsKSB7CisgICAgICAgICAgICBtWm9vbUNvbnRyb2xzLmhpZGUoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGlzVmlzaWJsZSgpIHsKKyAgICAgICAgcmV0dXJuIG1ab29tQ29udHJvbHMgIT0gbnVsbCAmJiBtWm9vbUNvbnRyb2xzLmlzU2hvd24oKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB1cGRhdGUoKSB7IH0KKworICAgIHB1YmxpYyBFeHRlbmRlZFpvb21Db250cm9scyBnZXRDb250cm9scygpIHsKKyAgICAgICAgaWYgKG1ab29tQ29udHJvbHMgPT0gbnVsbCkgeworICAgICAgICAgICAgbVpvb21Db250cm9scyA9IGNyZWF0ZVpvb21Db250cm9scygpOworCisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogbmVlZCB0byBiZSBzZXQgdG8gVklTSUJMRSBmaXJzdCBzbyB0aGF0IGdldE1lYXN1cmVkSGVpZ2h0KCkgaW4KKyAgICAgICAgICAgICAqIHtAbGluayAjb25TaXplQ2hhbmdlZCgpfSBjYW4gcmV0dXJuIHRoZSBtZWFzdXJlZCB2YWx1ZSBmb3IgcHJvcGVyCisgICAgICAgICAgICAgKiBsYXlvdXQuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIG1ab29tQ29udHJvbHMuc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOworICAgICAgICAgICAgbVpvb21Db250cm9sUnVubmFibGUgPSBuZXcgUnVubmFibGUoKSB7CisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgICAgICAvKiBEb24ndCBkaXNtaXNzIHRoZSBjb250cm9scyBpZiB0aGUgdXNlciBoYXMKKyAgICAgICAgICAgICAgICAgICAgICogZm9jdXMgb24gdGhlbS4gV2FpdCBhbmQgY2hlY2sgYWdhaW4gbGF0ZXIuCisgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICAgICBpZiAoIW1ab29tQ29udHJvbHMuaGFzRm9jdXMoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgbVpvb21Db250cm9scy5oaWRlKCk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtUHJpdmF0ZUhhbmRsZXIucmVtb3ZlQ2FsbGJhY2tzKG1ab29tQ29udHJvbFJ1bm5hYmxlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1Qcml2YXRlSGFuZGxlci5wb3N0RGVsYXllZChtWm9vbUNvbnRyb2xSdW5uYWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWk9PTV9DT05UUk9MU19USU1FT1VUKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH07CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG1ab29tQ29udHJvbHM7CisgICAgfQorCisgICAgcHJpdmF0ZSBFeHRlbmRlZFpvb21Db250cm9scyBjcmVhdGVab29tQ29udHJvbHMoKSB7CisgICAgICAgIEV4dGVuZGVkWm9vbUNvbnRyb2xzIHpvb21Db250cm9scyA9IG5ldyBFeHRlbmRlZFpvb21Db250cm9scyhtV2ViVmlldy5nZXRDb250ZXh0KCkpOworICAgICAgICB6b29tQ29udHJvbHMuc2V0T25ab29tSW5DbGlja0xpc3RlbmVyKG5ldyBPbkNsaWNrTGlzdGVuZXIoKSB7CisgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkNsaWNrKFZpZXcgdikgeworICAgICAgICAgICAgICAgIC8vIHJlc2V0IHRpbWUgb3V0CisgICAgICAgICAgICAgICAgbVByaXZhdGVIYW5kbGVyLnJlbW92ZUNhbGxiYWNrcyhtWm9vbUNvbnRyb2xSdW5uYWJsZSk7CisgICAgICAgICAgICAgICAgbVByaXZhdGVIYW5kbGVyLnBvc3REZWxheWVkKG1ab29tQ29udHJvbFJ1bm5hYmxlLCBaT09NX0NPTlRST0xTX1RJTUVPVVQpOworICAgICAgICAgICAgICAgIG1XZWJWaWV3Lnpvb21JbigpOworICAgICAgICAgICAgfQorICAgICAgICB9KTsKKyAgICAgICAgem9vbUNvbnRyb2xzLnNldE9uWm9vbU91dENsaWNrTGlzdGVuZXIobmV3IE9uQ2xpY2tMaXN0ZW5lcigpIHsKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uQ2xpY2soVmlldyB2KSB7CisgICAgICAgICAgICAgICAgLy8gcmVzZXQgdGltZSBvdXQKKyAgICAgICAgICAgICAgICBtUHJpdmF0ZUhhbmRsZXIucmVtb3ZlQ2FsbGJhY2tzKG1ab29tQ29udHJvbFJ1bm5hYmxlKTsKKyAgICAgICAgICAgICAgICBtUHJpdmF0ZUhhbmRsZXIucG9zdERlbGF5ZWQobVpvb21Db250cm9sUnVubmFibGUsIFpPT01fQ09OVFJPTFNfVElNRU9VVCk7CisgICAgICAgICAgICAgICAgbVdlYlZpZXcuem9vbU91dCgpOworICAgICAgICAgICAgfQorICAgICAgICB9KTsKKyAgICAgICAgcmV0dXJuIHpvb21Db250cm9sczsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBFeHRlbmRlZFpvb21Db250cm9scyBleHRlbmRzIEZyYW1lTGF5b3V0IHsKKworICAgICAgICBwcml2YXRlIGFuZHJvaWQud2lkZ2V0Llpvb21Db250cm9scyBtUGx1c01pbnVzWm9vbUNvbnRyb2xzOworCisgICAgICAgIHB1YmxpYyBFeHRlbmRlZFpvb21Db250cm9scyhDb250ZXh0IGNvbnRleHQpIHsKKyAgICAgICAgICAgIHN1cGVyKGNvbnRleHQsIG51bGwpOworICAgICAgICAgICAgTGF5b3V0SW5mbGF0ZXIgaW5mbGF0ZXIgPSAoTGF5b3V0SW5mbGF0ZXIpCisgICAgICAgICAgICAgICAgICAgIGNvbnRleHQuZ2V0U3lzdGVtU2VydmljZShDb250ZXh0LkxBWU9VVF9JTkZMQVRFUl9TRVJWSUNFKTsKKyAgICAgICAgICAgIGluZmxhdGVyLmluZmxhdGUoY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5sYXlvdXQuem9vbV9tYWduaWZ5LCB0aGlzLCB0cnVlKTsKKyAgICAgICAgICAgIG1QbHVzTWludXNab29tQ29udHJvbHMgPSAoYW5kcm9pZC53aWRnZXQuWm9vbUNvbnRyb2xzKSBmaW5kVmlld0J5SWQoCisgICAgICAgICAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuaWQuem9vbUNvbnRyb2xzKTsKKyAgICAgICAgICAgIGZpbmRWaWV3QnlJZChjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmlkLnpvb21NYWduaWZ5KS5zZXRWaXNpYmlsaXR5KAorICAgICAgICAgICAgICAgICAgICBWaWV3LkdPTkUpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgc2hvdyhib29sZWFuIHNob3dab29tKSB7CisgICAgICAgICAgICBtUGx1c01pbnVzWm9vbUNvbnRyb2xzLnNldFZpc2liaWxpdHkoc2hvd1pvb20gPyBWaWV3LlZJU0lCTEUgOiBWaWV3LkdPTkUpOworICAgICAgICAgICAgZmFkZShWaWV3LlZJU0lCTEUsIDAuMGYsIDEuMGYpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgaGlkZSgpIHsKKyAgICAgICAgICAgIGZhZGUoVmlldy5HT05FLCAxLjBmLCAwLjBmKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgdm9pZCBmYWRlKGludCB2aXNpYmlsaXR5LCBmbG9hdCBzdGFydEFscGhhLCBmbG9hdCBlbmRBbHBoYSkgeworICAgICAgICAgICAgQWxwaGFBbmltYXRpb24gYW5pbSA9IG5ldyBBbHBoYUFuaW1hdGlvbihzdGFydEFscGhhLCBlbmRBbHBoYSk7CisgICAgICAgICAgICBhbmltLnNldER1cmF0aW9uKDUwMCk7CisgICAgICAgICAgICBzdGFydEFuaW1hdGlvbihhbmltKTsKKyAgICAgICAgICAgIHNldFZpc2liaWxpdHkodmlzaWJpbGl0eSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYm9vbGVhbiBoYXNGb2N1cygpIHsKKyAgICAgICAgICAgIHJldHVybiBtUGx1c01pbnVzWm9vbUNvbnRyb2xzLmhhc0ZvY3VzKCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBzZXRPblpvb21JbkNsaWNrTGlzdGVuZXIoT25DbGlja0xpc3RlbmVyIGxpc3RlbmVyKSB7CisgICAgICAgICAgICBtUGx1c01pbnVzWm9vbUNvbnRyb2xzLnNldE9uWm9vbUluQ2xpY2tMaXN0ZW5lcihsaXN0ZW5lcik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBzZXRPblpvb21PdXRDbGlja0xpc3RlbmVyKE9uQ2xpY2tMaXN0ZW5lciBsaXN0ZW5lcikgeworICAgICAgICAgICAgbVBsdXNNaW51c1pvb21Db250cm9scy5zZXRPblpvb21PdXRDbGlja0xpc3RlbmVyKGxpc3RlbmVyKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3dlYmtpdC9ab29tTWFuYWdlci5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvd2Via2l0L1pvb21NYW5hZ2VyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTc2MGU5MQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3dlYmtpdC9ab29tTWFuYWdlci5qYXZhCkBAIC0wLDAgKzEsOTMxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLndlYmtpdDsKKworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5QYWNrYWdlTWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkNhbnZhczsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlBvaW50OworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworaW1wb3J0IGFuZHJvaWQub3MuU3lzdGVtQ2xvY2s7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuU2NhbGVHZXN0dXJlRGV0ZWN0b3I7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CisKKy8qKgorICogVGhlIFpvb21NYW5hZ2VyIGlzIHJlc3BvbnNpYmxlIGZvciBtYWludGFpbmluZyB0aGUgV2ViVmlldydzIGN1cnJlbnQgem9vbQorICogbGV2ZWwgc3RhdGUuICBJdCBpcyBhbHNvIHJlc3BvbnNpYmxlIGZvciBtYW5hZ2luZyB0aGUgb24tc2NyZWVuIHpvb20gY29udHJvbHMKKyAqIGFzIHdlbGwgYXMgYW55IGFuaW1hdGlvbiBvZiB0aGUgV2ViVmlldyBkdWUgdG8gem9vbWluZy4KKyAqCisgKiBDdXJyZW50bHksIHRoZXJlIGFyZSB0d28gbWV0aG9kcyBmb3IgYW5pbWF0aW5nIHRoZSB6b29tIG9mIGEgV2ViVmlldy4KKyAqCisgKiAoMSkgVGhlIGZpcnN0IG1ldGhvZCBpcyB0cmlnZ2VyZWQgYnkgc3RhcnRab29tQW5pbWF0aW9uKC4uLikgYW5kIGlzIGEgZml4ZWQKKyAqIGxlbmd0aCBhbmltYXRpb24gd2hlcmUgdGhlIGZpbmFsIHpvb20gc2NhbGUgaXMga25vd24gYXQgc3RhcnR1cC4gIFRoaXMgdHlwZSBvZgorICogYW5pbWF0aW9uIG5vdGlmaWVzIHdlYmtpdCBvZiB0aGUgZmluYWwgc2NhbGUgQkVGT1JFIGl0IGFuaW1hdGVzLiBUaGUgYW5pbWF0aW9uCisgKiBpcyB0aGVuIGRvbmUgYnkgc2NhbGluZyB0aGUgQ0FOVkFTIGluY3JlbWVudGFsbHkgYmFzZWQgb24gYSBzdGVwcGluZyBmdW5jdGlvbi4KKyAqCisgKiAoMikgVGhlIHNlY29uZCBtZXRob2QgaXMgdHJpZ2dlcmVkIGJ5IGEgbXVsdGktdG91Y2ggcGluY2ggYW5kIHRoZSBuZXcgc2NhbGUKKyAqIGlzIGRldGVybWluZWQgZHluYW1pY2FsbHkgYmFzZWQgb24gdGhlIHVzZXIncyBnZXN0dXJlLiBUaGlzIHR5cGUgb2YgYW5pbWF0aW9uCisgKiBvbmx5IG5vdGlmaWVzIHdlYmtpdCBvZiBuZXcgc2NhbGUgQUZURVIgdGhlIGdlc3R1cmUgaXMgY29tcGxldGUuIFRoZSBhbmltYXRpb24KKyAqIGVmZmVjdCBpcyBhY2hpZXZlZCBieSBzY2FsaW5nIHRoZSBWSUVXUyAoYm90aCBXZWJWaWV3IGFuZCBWaWV3TWFuYWdlci5DaGlsZFZpZXcpCisgKiB0byB0aGUgbmV3IHNjYWxlIGluIHJlc3BvbnNlIHRvIGV2ZW50cyByZWxhdGVkIHRvIHRoZSB1c2VyJ3MgZ2VzdHVyZS4KKyAqLworY2xhc3MgWm9vbU1hbmFnZXIgeworCisgICAgc3RhdGljIGZpbmFsIFN0cmluZyBMT0dUQUcgPSAid2Vidmlld1pvb20iOworCisgICAgcHJpdmF0ZSBmaW5hbCBXZWJWaWV3IG1XZWJWaWV3OworICAgIHByaXZhdGUgZmluYWwgQ2FsbGJhY2tQcm94eSBtQ2FsbGJhY2tQcm94eTsKKworICAgIC8vIFdpZGdldHMgcmVzcG9uc2libGUgZm9yIHRoZSBvbi1zY3JlZW4gem9vbSBmdW5jdGlvbnMgb2YgdGhlIFdlYlZpZXcuCisgICAgcHJpdmF0ZSBab29tQ29udHJvbEVtYmVkZGVkIG1FbWJlZGRlZFpvb21Db250cm9sOworICAgIHByaXZhdGUgWm9vbUNvbnRyb2xFeHRlcm5hbCBtRXh0ZXJuYWxab29tQ29udHJvbDsKKworICAgIC8qCisgICAgICogRm9yIGxhcmdlIHNjcmVlbiBkZXZpY2VzLCB0aGUgZGVmYXVsdFNjYWxlIHVzdWFsbHkgc2V0IHRvIDEuMCBhbmQKKyAgICAgKiBlcXVhbCB0byB0aGUgb3ZlcnZpZXcgc2NhbGUsIHRvIGRpZmZlcmVudGlhdGUgdGhlIHpvb20gbGV2ZWwgZm9yIGRvdWJsZSB0YXBwaW5nLAorICAgICAqIGEgbWluaW11bSByZWFkaW5nIGxldmVsIHNjYWxlIGlzIHVzZWQuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgZmxvYXQgTUlOX1JFQURJTkdfTEVWRUxfU0NBTEUgPSAxLjVmOworCisgICAgLyoKKyAgICAgKiBUaGUgc2NhbGUgZmFjdG9ycyB0aGF0IGRldGVybWluZSB0aGUgdXBwZXIgYW5kIGxvd2VyIGJvdW5kcyBmb3IgdGhlCisgICAgICogZGVmYXVsdCB6b29tIHNjYWxlLgorICAgICAqLworICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgZmxvYXQgREVGQVVMVF9NQVhfWk9PTV9TQ0FMRV9GQUNUT1IgPSA0LjAwZjsKKyAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGZsb2F0IERFRkFVTFRfTUlOX1pPT01fU0NBTEVfRkFDVE9SID0gMC4yNWY7CisKKyAgICAvLyBUaGUgZGVmYXVsdCBzY2FsZSBsaW1pdHMsIHdoaWNoIGFyZSBkZXBlbmRlbnQgb24gdGhlIGRpc3BsYXkgZGVuc2l0eS4KKyAgICBwcml2YXRlIGZsb2F0IG1EZWZhdWx0TWF4Wm9vbVNjYWxlOworICAgIHByaXZhdGUgZmxvYXQgbURlZmF1bHRNaW5ab29tU2NhbGU7CisKKyAgICAvLyBUaGUgYWN0dWFsIHNjYWxlIGxpbWl0cywgd2hpY2ggY2FuIGJlIHNldCB0aHJvdWdoIGEgd2VicGFnZSdzIHZpZXdwb3J0CisgICAgLy8gbWV0YS10YWcuCisgICAgcHJpdmF0ZSBmbG9hdCBtTWF4Wm9vbVNjYWxlOworICAgIHByaXZhdGUgZmxvYXQgbU1pblpvb21TY2FsZTsKKworICAgIC8vIExvY2tzIHRoZSBtaW5pbXVtIFpvb21TY2FsZSB0byB0aGUgdmFsdWUgY3VycmVudGx5IHNldCBpbiBtTWluWm9vbVNjYWxlLgorICAgIHByaXZhdGUgYm9vbGVhbiBtTWluWm9vbVNjYWxlRml4ZWQgPSB0cnVlOworCisgICAgLyoKKyAgICAgKiBXaGVuIGxvYWRpbmcgYSBuZXcgcGFnZSB0aGUgV2ViVmlldyBkb2VzIG5vdCBpbml0aWFsbHkga25vdyB0aGUgZmluYWwKKyAgICAgKiB3aWR0aCBvZiB0aGUgcGFnZS4gVGhlcmVmb3JlLCB3aGVuIGEgbmV3IHBhZ2UgaXMgbG9hZGVkIGluIG92ZXJ2aWV3IG1vZGUKKyAgICAgKiB0aGUgb3ZlcnZpZXcgc2NhbGUgaXMgaW5pdGlhbGl6ZWQgdG8gYSBkZWZhdWx0IHZhbHVlLiBUaGlzIGZsYWcgaXMgdGhlbgorICAgICAqIHNldCBhbmQgdXNlZCB0byBub3RpZnkgdGhlIFpvb21NYW5hZ2VyIHRvIHRha2UgdGhlIHdpZHRoIG9mIHRoZSBuZXh0CisgICAgICogcGljdHVyZSBmcm9tIHdlYmtpdCBhbmQgdXNlIHRoYXQgd2lkdGggdG8gZW50ZXIgaW50byB6b29tIG92ZXJ2aWV3IG1vZGUuCisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIG1Jbml0aWFsWm9vbU92ZXJ2aWV3ID0gZmFsc2U7CisKKyAgICAvKgorICAgICAqIFdoZW4gaW4gdGhlIHpvb20gb3ZlcnZpZXcgbW9kZSwgdGhlIHBhZ2UncyB3aWR0aCBpcyBmdWxseSBmaXQgdG8gdGhlCisgICAgICogY3VycmVudCB3aW5kb3cuIEFkZGl0aW9uYWxseSB3aGlsZSB0aGUgcGFnZSBpcyBpbiB0aGlzIHN0YXRlIGl0IGlzCisgICAgICogYWN0aXZlLCBpbiBvdGhlciB3b3JkcywgeW91IGNhbiBjbGljayB0byBmb2xsb3cgdGhlIGxpbmtzLiBXZSBjYWNoZSBhCisgICAgICogYm9vbGVhbiB0byBlbmFibGUgdXMgdG8gcXVpY2tseSBjaGVjayB3aGV0aGVyIG9yIG5vdCB3ZSBhcmUgaW4gb3ZlcnZpZXcKKyAgICAgKiBtb2RlLCBidXQgdGhpcyB2YWx1ZSBzaG91bGQgb25seSBiZSBtb2RpZmllZCBieSBjaGFuZ2VzIHRvIHRoZSB6b29tCisgICAgICogc2NhbGUuCisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIG1Jblpvb21PdmVydmlldyA9IGZhbHNlOworICAgIHByaXZhdGUgaW50IG1ab29tT3ZlcnZpZXdXaWR0aDsKKyAgICBwcml2YXRlIGZsb2F0IG1JbnZab29tT3ZlcnZpZXdXaWR0aDsKKworICAgIC8qCisgICAgICogVGhlc2UgdmFyaWFibGVzIHRyYWNrIHRoZSBjZW50ZXIgcG9pbnQgb2YgdGhlIHpvb20gYW5kIHRoZXkgYXJlIHVzZWQgdG8KKyAgICAgKiBkZXRlcm1pbmUgdGhlIHBvaW50IGFyb3VuZCB3aGljaCB3ZSBzaG91bGQgem9vbS4gVGhleSBhcmUgc3RvcmVkIGluIHZpZXcKKyAgICAgKiBjb29yZGluYXRlcy4KKyAgICAgKi8KKyAgICBwcml2YXRlIGZsb2F0IG1ab29tQ2VudGVyWDsKKyAgICBwcml2YXRlIGZsb2F0IG1ab29tQ2VudGVyWTsKKworICAgIC8qCisgICAgICogVGhlc2UgdmFsdWVzIHJlcHJlc2VudCB0aGUgcG9pbnQgYXJvdW5kIHdoaWNoIHRoZSBzY3JlZW4gc2hvdWxkIGJlCisgICAgICogY2VudGVyZWQgYWZ0ZXIgem9vbWluZy4gSW4gb3RoZXIgd29yZHMgaXQgaXMgdXNlZCB0byBkZXRlcm1pbmUgdGhlIGNlbnRlcgorICAgICAqIHBvaW50IG9mIHRoZSB2aXNpYmxlIGRvY3VtZW50IGFmdGVyIHRoZSBwYWdlIGhhcyBmaW5pc2hlZCB6b29taW5nLiBUaGlzCisgICAgICogaXMgaW1wb3J0YW50IGJlY2F1c2UgdGhlIHpvb20gbWF5IGhhdmUgcG90ZW50aWFsbHkgcmVmbG93ZWQgdGhlIHRleHQgYW5kCisgICAgICogd2UgbmVlZCB0byBlbnN1cmUgdGhlIHByb3BlciBwb3J0aW9uIG9mIHRoZSBkb2N1bWVudCByZW1haW5zIG9uIHRoZQorICAgICAqIHNjcmVlbi4KKyAgICAgKi8KKyAgICBwcml2YXRlIGludCBtQW5jaG9yWDsKKyAgICBwcml2YXRlIGludCBtQW5jaG9yWTsKKworICAgIC8vIFRoZSBzY2FsZSBmYWN0b3IgdGhhdCBpcyB1c2VkIHRvIGRldGVybWluZSB0aGUgY29sdW1uIHdpZHRoIGZvciB0ZXh0CisgICAgcHJpdmF0ZSBmbG9hdCBtVGV4dFdyYXBTY2FsZTsKKworICAgIC8qCisgICAgICogVGhlIGRlZmF1bHQgem9vbSBzY2FsZSBpcyB0aGUgc2NhbGUgZmFjdG9yIHVzZWQgd2hlbiB0aGUgdXNlciB0cmlnZ2VycyBhCisgICAgICogem9vbSBpbiBieSBkb3VibGUgdGFwcGluZyBvbiB0aGUgV2ViVmlldy4gVGhlIHZhbHVlIGlzIGluaXRpYWxseSBzZXQKKyAgICAgKiBiYXNlZCBvbiB0aGUgZGlzcGxheSBkZW5zaXR5LCBidXQgY2FuIGJlIGNoYW5nZWQgYXQgYW55IHRpbWUgdmlhIHRoZQorICAgICAqIFdlYlNldHRpbmdzLgorICAgICAqLworICAgIHByaXZhdGUgZmxvYXQgbURlZmF1bHRTY2FsZTsKKyAgICBwcml2YXRlIGZsb2F0IG1JbnZEZWZhdWx0U2NhbGU7CisKKyAgICAvLyB0aGUgY3VycmVudCBjb21wdXRlZCB6b29tIHNjYWxlIGFuZCBpdHMgaW52ZXJzZS4KKyAgICBwcml2YXRlIGZsb2F0IG1BY3R1YWxTY2FsZTsKKyAgICBwcml2YXRlIGZsb2F0IG1JbnZBY3R1YWxTY2FsZTsKKyAgICAKKyAgICAvKgorICAgICAqIFRoZSBpbml0aWFsIHNjYWxlIGZvciB0aGUgV2ViVmlldy4gMCBtZWFucyBkZWZhdWx0LiBJZiBpbml0aWFsIHNjYWxlIGlzCisgICAgICogZ3JlYXRlciB0aGFuIDAgdGhlIFdlYlZpZXcgc3RhcnRzIHdpdGggdGhpcyB2YWx1ZSBhcyBpdHMgaW5pdGlhbCBzY2FsZS4gVGhlCisgICAgICogdmFsdWUgaXMgY29udmVydGVkIGZyb20gYW4gaW50ZWdlciBwZXJjZW50YWdlIHNvIGl0IGlzIGd1YXJlbnRlZWQgdG8gaGF2ZQorICAgICAqIG5vIG1vcmUgdGhhbiAyIHNpZ25pZmljYW50IGRpZ2l0cyBhZnRlciB0aGUgZGVjaW1hbC4gIFRoaXMgcmVzdHJpY3Rpb24KKyAgICAgKiBhbGxvd3MgdXMgdG8gY29udmVydCB0aGUgc2NhbGUgYmFjayB0byB0aGUgb3JpZ2luYWwgcGVyY2VudGFnZSBieSBzaW1wbHkKKyAgICAgKiBtdWx0aXBseWluZyB0aGUgdmFsdWUgYnkgMTAwLgorICAgICAqLworICAgIHByaXZhdGUgZmxvYXQgbUluaXRpYWxTY2FsZTsKKworICAgIHByaXZhdGUgc3RhdGljIGZsb2F0IE1JTklNVU1fU0NBTEVfSU5DUkVNRU5UID0gMC4wMWY7CisKKyAgICAvKgorICAgICAqIFRoZSBmb2xsb3dpbmcgbWVtYmVyIHZhcmlhYmxlcyBhcmUgb25seSB0byBiZSB1c2VkIGZvciBhbmltYXRpbmcgem9vbS4gSWYKKyAgICAgKiBtWm9vbVNjYWxlIGlzIG5vbi16ZXJvIHRoZW4gd2UgYXJlIGluIHRoZSBtaWRkbGUgb2YgYSB6b29tIGFuaW1hdGlvbi4gVGhlCisgICAgICogb3RoZXIgdmFyaWFibGVzIGFyZSB1c2VkIGFzIGEgY2FjaGUgKGUuZy4gaW52ZXJzZSkgb3IgYXMgYSB3YXkgdG8gc3RvcmUKKyAgICAgKiB0aGUgc3RhdGUgb2YgdGhlIHZpZXcgcHJpb3IgdG8gYW5pbWF0aW5nIChlLmcuIGluaXRpYWwgc2Nyb2xsIGNvb3JkcykuCisgICAgICovCisgICAgcHJpdmF0ZSBmbG9hdCBtWm9vbVNjYWxlOworICAgIHByaXZhdGUgZmxvYXQgbUludkluaXRpYWxab29tU2NhbGU7CisgICAgcHJpdmF0ZSBmbG9hdCBtSW52RmluYWxab29tU2NhbGU7CisgICAgcHJpdmF0ZSBpbnQgbUluaXRpYWxTY3JvbGxYOworICAgIHByaXZhdGUgaW50IG1Jbml0aWFsU2Nyb2xsWTsKKyAgICBwcml2YXRlIGxvbmcgbVpvb21TdGFydDsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBaT09NX0FOSU1BVElPTl9MRU5HVEggPSA1MDA7CisKKyAgICAvLyB3aGV0aGVyIHN1cHBvcnQgbXVsdGktdG91Y2gKKyAgICBwcml2YXRlIGJvb2xlYW4gbVN1cHBvcnRNdWx0aVRvdWNoOworICAgIAorICAgIC8qKgorICAgICAqIFRydWUgaWYgd2UgaGF2ZSBhIHRvdWNoIHBhbmVsIGNhcGFibGUgb2YgZGV0ZWN0aW5nIHNtb290aCBwYW4vc2NhbGUgYXQgdGhlIHNhbWUgdGltZQorICAgICAqLworICAgIHByaXZhdGUgYm9vbGVhbiBtQWxsb3dQYW5BbmRTY2FsZTsKKworICAgIC8vIHVzZSB0aGUgZnJhbWV3b3JrJ3MgU2NhbGVHZXN0dXJlRGV0ZWN0b3IgdG8gaGFuZGxlIG11bHRpLXRvdWNoCisgICAgcHJpdmF0ZSBTY2FsZUdlc3R1cmVEZXRlY3RvciBtU2NhbGVEZXRlY3RvcjsKKyAgICBwcml2YXRlIGJvb2xlYW4gbVBpbmNoVG9ab29tQW5pbWF0aW5nID0gZmFsc2U7CisKKyAgICBwdWJsaWMgWm9vbU1hbmFnZXIoV2ViVmlldyB3ZWJWaWV3LCBDYWxsYmFja1Byb3h5IGNhbGxiYWNrUHJveHkpIHsKKyAgICAgICAgbVdlYlZpZXcgPSB3ZWJWaWV3OworICAgICAgICBtQ2FsbGJhY2tQcm94eSA9IGNhbGxiYWNrUHJveHk7CisKKyAgICAgICAgLyoKKyAgICAgICAgICogSWRlYWxseSBtWm9vbU92ZXJ2aWV3V2lkdGggc2hvdWxkIGJlIG1Db250ZW50V2lkdGguIEJ1dCBzaXRlcyBsaWtlCisgICAgICAgICAqIEVTUE4gYW5kIEVuZ2FkZ2V0IGFsd2F5cyBoYXZlIHdpZGVyIG1Db250ZW50V2lkdGggbm8gbWF0dGVyIHdoYXQgdGhlCisgICAgICAgICAqIHZpZXdwb3J0IHNpemUgaXMuCisgICAgICAgICAqLworICAgICAgICBzZXRab29tT3ZlcnZpZXdXaWR0aChXZWJWaWV3LkRFRkFVTFRfVklFV1BPUlRfV0lEVEgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEluaXRpYWxpemUgYm90aCB0aGUgZGVmYXVsdCBhbmQgYWN0dWFsIHpvb20gc2NhbGUgdG8gdGhlIGdpdmVuIGRlbnNpdHkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZGVuc2l0eSBUaGUgbG9naWNhbCBkZW5zaXR5IG9mIHRoZSBkaXNwbGF5LiBUaGlzIGlzIGEgc2NhbGluZyBmYWN0b3IKKyAgICAgKiBmb3IgdGhlIERlbnNpdHkgSW5kZXBlbmRlbnQgUGl4ZWwgdW5pdCwgd2hlcmUgb25lIERJUCBpcyBvbmUgcGl4ZWwgb24gYW4KKyAgICAgKiBhcHByb3hpbWF0ZWx5IDE2MCBkcGkgc2NyZWVuIChzZWUgYW5kcm9pZC51dGlsLkRpc3BsYXlNZXRyaWNzLmRlbnNpdHkpLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGluaXQoZmxvYXQgZGVuc2l0eSkgeworICAgICAgICBhc3NlcnQgZGVuc2l0eSA+IDA7CisKKyAgICAgICAgc2V0RGVmYXVsdFpvb21TY2FsZShkZW5zaXR5KTsKKyAgICAgICAgbUFjdHVhbFNjYWxlID0gZGVuc2l0eTsKKyAgICAgICAgbUludkFjdHVhbFNjYWxlID0gMSAvIGRlbnNpdHk7CisgICAgICAgIG1UZXh0V3JhcFNjYWxlID0gZGVuc2l0eTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBVcGRhdGUgdGhlIGRlZmF1bHQgem9vbSBzY2FsZSB1c2luZyB0aGUgZ2l2ZW4gZGVuc2l0eS4gSXQgd2lsbCBhbHNvIHJlc2V0CisgICAgICogdGhlIGN1cnJlbnQgbWluIGFuZCBtYXggem9vbSBzY2FsZXMgdG8gdGhlIGRlZmF1bHQgYm91bmRhcmllcyBhcyB3ZWxsIGFzCisgICAgICogZW5zdXJlIHRoYXQgdGhlIGFjdHVhbCBzY2FsZSBmYWxscyB3aXRoaW4gdGhvc2UgYm91bmRhcmllcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBkZW5zaXR5IFRoZSBsb2dpY2FsIGRlbnNpdHkgb2YgdGhlIGRpc3BsYXkuIFRoaXMgaXMgYSBzY2FsaW5nIGZhY3RvcgorICAgICAqIGZvciB0aGUgRGVuc2l0eSBJbmRlcGVuZGVudCBQaXhlbCB1bml0LCB3aGVyZSBvbmUgRElQIGlzIG9uZSBwaXhlbCBvbiBhbgorICAgICAqIGFwcHJveGltYXRlbHkgMTYwIGRwaSBzY3JlZW4gKHNlZSBhbmRyb2lkLnV0aWwuRGlzcGxheU1ldHJpY3MuZGVuc2l0eSkuCisgICAgICovCisgICAgcHVibGljIHZvaWQgdXBkYXRlRGVmYXVsdFpvb21EZW5zaXR5KGZsb2F0IGRlbnNpdHkpIHsKKyAgICAgICAgYXNzZXJ0IGRlbnNpdHkgPiAwOworCisgICAgICAgIGlmIChNYXRoLmFicyhkZW5zaXR5IC0gbURlZmF1bHRTY2FsZSkgPiBNSU5JTVVNX1NDQUxFX0lOQ1JFTUVOVCkgeworICAgICAgICAgICAgLy8gc2V0IHRoZSBuZXcgZGVmYXVsdCBkZW5zaXR5CisgICAgICAgICAgICBzZXREZWZhdWx0Wm9vbVNjYWxlKGRlbnNpdHkpOworICAgICAgICAgICAgLy8gYWRqdXN0IHRoZSBzY2FsZSBpZiBpdCBmYWxscyBvdXRzaWRlIHRoZSBuZXcgem9vbSBib3VuZHMKKyAgICAgICAgICAgIHNldFpvb21TY2FsZShtQWN0dWFsU2NhbGUsIHRydWUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHNldERlZmF1bHRab29tU2NhbGUoZmxvYXQgZGVmYXVsdFNjYWxlKSB7CisgICAgICAgIG1EZWZhdWx0U2NhbGUgPSBkZWZhdWx0U2NhbGU7CisgICAgICAgIG1JbnZEZWZhdWx0U2NhbGUgPSAxIC8gZGVmYXVsdFNjYWxlOworICAgICAgICBtRGVmYXVsdE1heFpvb21TY2FsZSA9IGRlZmF1bHRTY2FsZSAqIERFRkFVTFRfTUFYX1pPT01fU0NBTEVfRkFDVE9SOworICAgICAgICBtRGVmYXVsdE1pblpvb21TY2FsZSA9IGRlZmF1bHRTY2FsZSAqIERFRkFVTFRfTUlOX1pPT01fU0NBTEVfRkFDVE9SOworICAgICAgICBtTWF4Wm9vbVNjYWxlID0gbURlZmF1bHRNYXhab29tU2NhbGU7CisgICAgICAgIG1NaW5ab29tU2NhbGUgPSBtRGVmYXVsdE1pblpvb21TY2FsZTsKKyAgICB9CisKKyAgICBwdWJsaWMgZmluYWwgZmxvYXQgZ2V0U2NhbGUoKSB7CisgICAgICAgIHJldHVybiBtQWN0dWFsU2NhbGU7CisgICAgfQorCisgICAgcHVibGljIGZpbmFsIGZsb2F0IGdldEludlNjYWxlKCkgeworICAgICAgICByZXR1cm4gbUludkFjdHVhbFNjYWxlOworICAgIH0KKworICAgIHB1YmxpYyBmaW5hbCBmbG9hdCBnZXRUZXh0V3JhcFNjYWxlKCkgeworICAgICAgICByZXR1cm4gbVRleHRXcmFwU2NhbGU7CisgICAgfQorCisgICAgcHVibGljIGZpbmFsIGZsb2F0IGdldE1heFpvb21TY2FsZSgpIHsKKyAgICAgICAgcmV0dXJuIG1NYXhab29tU2NhbGU7CisgICAgfQorCisgICAgcHVibGljIGZpbmFsIGZsb2F0IGdldE1pblpvb21TY2FsZSgpIHsKKyAgICAgICAgcmV0dXJuIG1NaW5ab29tU2NhbGU7CisgICAgfQorCisgICAgcHVibGljIGZpbmFsIGZsb2F0IGdldERlZmF1bHRTY2FsZSgpIHsKKyAgICAgICAgcmV0dXJuIG1EZWZhdWx0U2NhbGU7CisgICAgfQorCisgICAgcHVibGljIGZpbmFsIGZsb2F0IGdldFJlYWRpbmdMZXZlbFNjYWxlKCkgeworICAgICAgcmV0dXJuIE1hdGgubWF4KG1EZWZhdWx0U2NhbGUsIE1JTl9SRUFESU5HX0xFVkVMX1NDQUxFKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZmluYWwgZmxvYXQgZ2V0SW52RGVmYXVsdFNjYWxlKCkgeworICAgICAgICByZXR1cm4gbUludkRlZmF1bHRTY2FsZTsKKyAgICB9CisKKyAgICBwdWJsaWMgZmluYWwgZmxvYXQgZ2V0RGVmYXVsdE1heFpvb21TY2FsZSgpIHsKKyAgICAgICAgcmV0dXJuIG1EZWZhdWx0TWF4Wm9vbVNjYWxlOworICAgIH0KKworICAgIHB1YmxpYyBmaW5hbCBmbG9hdCBnZXREZWZhdWx0TWluWm9vbVNjYWxlKCkgeworICAgICAgICByZXR1cm4gbURlZmF1bHRNaW5ab29tU2NhbGU7CisgICAgfQorCisgICAgcHVibGljIGZpbmFsIGludCBnZXREb2N1bWVudEFuY2hvclgoKSB7CisgICAgICAgIHJldHVybiBtQW5jaG9yWDsKKyAgICB9CisKKyAgICBwdWJsaWMgZmluYWwgaW50IGdldERvY3VtZW50QW5jaG9yWSgpIHsKKyAgICAgICAgcmV0dXJuIG1BbmNob3JZOworICAgIH0KKworICAgIHB1YmxpYyBmaW5hbCB2b2lkIGNsZWFyRG9jdW1lbnRBbmNob3IoKSB7CisgICAgICAgIG1BbmNob3JYID0gbUFuY2hvclkgPSAwOworICAgIH0KKworICAgIHB1YmxpYyBmaW5hbCB2b2lkIHNldFpvb21DZW50ZXIoZmxvYXQgeCwgZmxvYXQgeSkgeworICAgICAgICBtWm9vbUNlbnRlclggPSB4OworICAgICAgICBtWm9vbUNlbnRlclkgPSB5OworICAgIH0KKworICAgIHB1YmxpYyBmaW5hbCB2b2lkIHNldEluaXRpYWxTY2FsZUluUGVyY2VudChpbnQgc2NhbGVJblBlcmNlbnQpIHsKKyAgICAgICAgbUluaXRpYWxTY2FsZSA9IHNjYWxlSW5QZXJjZW50ICogMC4wMWY7CisgICAgfQorCisgICAgcHVibGljIGZpbmFsIGZsb2F0IGNvbXB1dGVTY2FsZVdpdGhMaW1pdHMoZmxvYXQgc2NhbGUpIHsKKyAgICAgICAgaWYgKHNjYWxlIDwgbU1pblpvb21TY2FsZSkgeworICAgICAgICAgICAgc2NhbGUgPSBtTWluWm9vbVNjYWxlOworICAgICAgICB9IGVsc2UgaWYgKHNjYWxlID4gbU1heFpvb21TY2FsZSkgeworICAgICAgICAgICAgc2NhbGUgPSBtTWF4Wm9vbVNjYWxlOworICAgICAgICB9CisgICAgICAgIHJldHVybiBzY2FsZTsKKyAgICB9CisKKyAgICBwdWJsaWMgZmluYWwgYm9vbGVhbiBpc1pvb21TY2FsZUZpeGVkKCkgeworICAgICAgICByZXR1cm4gbU1pblpvb21TY2FsZSA+PSBtTWF4Wm9vbVNjYWxlOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBleGNlZWRzTWluU2NhbGVJbmNyZW1lbnQoZmxvYXQgc2NhbGVBLCBmbG9hdCBzY2FsZUIpIHsKKyAgICAgICAgcmV0dXJuIE1hdGguYWJzKHNjYWxlQSAtIHNjYWxlQikgPj0gTUlOSU1VTV9TQ0FMRV9JTkNSRU1FTlQ7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gd2lsbFNjYWxlVHJpZ2dlclpvb20oZmxvYXQgc2NhbGUpIHsKKyAgICAgICAgcmV0dXJuIGV4Y2VlZHNNaW5TY2FsZUluY3JlbWVudChzY2FsZSwgbUFjdHVhbFNjYWxlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZmluYWwgYm9vbGVhbiBjYW5ab29tSW4oKSB7CisgICAgICAgIHJldHVybiBtTWF4Wm9vbVNjYWxlIC0gbUFjdHVhbFNjYWxlID4gTUlOSU1VTV9TQ0FMRV9JTkNSRU1FTlQ7CisgICAgfQorCisgICAgcHVibGljIGZpbmFsIGJvb2xlYW4gY2FuWm9vbU91dCgpIHsKKyAgICAgICAgcmV0dXJuIG1BY3R1YWxTY2FsZSAtIG1NaW5ab29tU2NhbGUgPiBNSU5JTVVNX1NDQUxFX0lOQ1JFTUVOVDsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiB6b29tSW4oKSB7CisgICAgICAgIHJldHVybiB6b29tKDEuMjVmKTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiB6b29tT3V0KCkgeworICAgICAgICByZXR1cm4gem9vbSgwLjhmKTsKKyAgICB9CisKKyAgICAvLyByZXR1cm5zIFRSVUUgaWYgem9vbSBvdXQgc3VjY2VlZHMgYW5kIEZBTFNFIGlmIG5vIHpvb20gY2hhbmdlcy4KKyAgICBwcml2YXRlIGJvb2xlYW4gem9vbShmbG9hdCB6b29tTXVsdGlwbGllcikgeworICAgICAgICAvLyBUT0RPOiBhbHRlcm5hdGl2ZWx5IHdlIGNhbiBkaXNhbGxvdyB0aGlzIGR1cmluZyBkcmF3IGhpc3RvcnkgbW9kZQorICAgICAgICBtV2ViVmlldy5zd2l0Y2hPdXREcmF3SGlzdG9yeSgpOworICAgICAgICAvLyBDZW50ZXIgem9vbWluZyB0byB0aGUgY2VudGVyIG9mIHRoZSBzY3JlZW4uCisgICAgICAgIG1ab29tQ2VudGVyWCA9IG1XZWJWaWV3LmdldFZpZXdXaWR0aCgpICogLjVmOworICAgICAgICBtWm9vbUNlbnRlclkgPSBtV2ViVmlldy5nZXRWaWV3SGVpZ2h0KCkgKiAuNWY7CisgICAgICAgIG1BbmNob3JYID0gbVdlYlZpZXcudmlld1RvQ29udGVudFgoKGludCkgbVpvb21DZW50ZXJYICsgbVdlYlZpZXcuZ2V0U2Nyb2xsWCgpKTsKKyAgICAgICAgbUFuY2hvclkgPSBtV2ViVmlldy52aWV3VG9Db250ZW50WSgoaW50KSBtWm9vbUNlbnRlclkgKyBtV2ViVmlldy5nZXRTY3JvbGxZKCkpOworICAgICAgICByZXR1cm4gc3RhcnRab29tQW5pbWF0aW9uKG1BY3R1YWxTY2FsZSAqIHpvb21NdWx0aXBsaWVyLCB0cnVlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJbml0aWF0ZXMgYW4gYW5pbWF0ZWQgem9vbSBvZiB0aGUgV2ViVmlldy4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgbmV3IHNjYWxlIHRyaWdnZXJlZCBhbiBhbmltYXRpb24gYW5kIGZhbHNlIG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBzdGFydFpvb21BbmltYXRpb24oZmxvYXQgc2NhbGUsIGJvb2xlYW4gcmVmbG93VGV4dCkgeworICAgICAgICBmbG9hdCBvbGRTY2FsZSA9IG1BY3R1YWxTY2FsZTsKKyAgICAgICAgbUluaXRpYWxTY3JvbGxYID0gbVdlYlZpZXcuZ2V0U2Nyb2xsWCgpOworICAgICAgICBtSW5pdGlhbFNjcm9sbFkgPSBtV2ViVmlldy5nZXRTY3JvbGxZKCk7CisKKyAgICAgICAgLy8gc25hcCB0byByZWFkaW5nIGxldmVsIHNjYWxlIGlmIGl0IGlzIGNsb3NlCisgICAgICAgIGlmICghZXhjZWVkc01pblNjYWxlSW5jcmVtZW50KHNjYWxlLCBnZXRSZWFkaW5nTGV2ZWxTY2FsZSgpKSkgeworICAgICAgICAgICAgc2NhbGUgPSBnZXRSZWFkaW5nTGV2ZWxTY2FsZSgpOworICAgICAgICB9CisKKyAgICAgICAgc2V0Wm9vbVNjYWxlKHNjYWxlLCByZWZsb3dUZXh0KTsKKworICAgICAgICBpZiAob2xkU2NhbGUgIT0gbUFjdHVhbFNjYWxlKSB7CisgICAgICAgICAgICAvLyB1c2UgbVpvb21QaWNrZXJTY2FsZSB0byBzZWUgem9vbSBwcmV2aWV3IGZpcnN0CisgICAgICAgICAgICBtWm9vbVN0YXJ0ID0gU3lzdGVtQ2xvY2sudXB0aW1lTWlsbGlzKCk7CisgICAgICAgICAgICBtSW52SW5pdGlhbFpvb21TY2FsZSA9IDEuMGYgLyBvbGRTY2FsZTsKKyAgICAgICAgICAgIG1JbnZGaW5hbFpvb21TY2FsZSA9IDEuMGYgLyBtQWN0dWFsU2NhbGU7CisgICAgICAgICAgICBtWm9vbVNjYWxlID0gbUFjdHVhbFNjYWxlOworICAgICAgICAgICAgbVdlYlZpZXcub25GaXhlZExlbmd0aFpvb21BbmltYXRpb25TdGFydCgpOworICAgICAgICAgICAgbVdlYlZpZXcuaW52YWxpZGF0ZSgpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgYnkgdGhlIFdlYlZpZXcncyBkcmF3aW5nIGNvZGUgd2hlbiBhIGZpeGVkIGxlbmd0aCB6b29tCisgICAgICogYW5pbWF0aW9uIGlzIG9jY3VycmluZy4gSXRzIHB1cnBvc2UgaXMgdG8gYW5pbWF0ZSB0aGUgem9vbWluZyBvZiB0aGUgY2FudmFzCisgICAgICogdG8gdGhlIGRlc2lyZWQgc2NhbGUgd2hpY2ggd2FzIHNwZWNpZmllZCBpbiBzdGFydFpvb21BbmltYXRpb24oLi4uKS4KKyAgICAgKgorICAgICAqIEEgZml4ZWQgbGVuZ3RoIGFuaW1hdGlvbiBiZWdpbnMgd2hlbiBzdGFydFpvb21BbmltYXRpb24oLi4uKSBpcyBjYWxsZWQgYW5kCisgICAgICogY29udGludWVzIHVudGlsIHRoZSBaT09NX0FOSU1BVElPTl9MRU5HVEggdGltZSBoYXMgZWxhcHNlZC4gRHVyaW5nIHRoYXQKKyAgICAgKiBpbnRlcnZhbCBlYWNoIHRpbWUgdGhlIFdlYlZpZXcgZHJhd3MgaXQgY2FsbHMgdGhpcyBmdW5jdGlvbiB3aGljaCBpcyAKKyAgICAgKiByZXNwb25zaWJsZSBmb3IgZ2VuZXJhdGluZyB0aGUgYW5pbWF0aW9uLgorICAgICAqCisgICAgICogQWRkaXRpb25hbGx5LCB0aGUgV2ViVmlldyBjYW4gY2hlY2sgdG8gc2VlIGlmIHN1Y2ggYW4gYW5pbWF0aW9uIGlzIGN1cnJlbnRseQorICAgICAqIGluIHByb2dyZXNzIGJ5IGNhbGxpbmcgaXNGaXhlZExlbmd0aEFuaW1hdGlvbkluUHJvZ3Jlc3MoKS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhbmltYXRlWm9vbShDYW52YXMgY2FudmFzKSB7CisgICAgICAgIGlmIChtWm9vbVNjYWxlID09IDApIHsKKyAgICAgICAgICAgIExvZy53KExPR1RBRywgIkEgV2ViVmlldyBpcyBhdHRlbXB0aW5nIHRvIHBlcmZvcm0gYSBmaXhlZCBsZW5ndGggIgorICAgICAgICAgICAgICAgICAgICArICJ6b29tIGFuaW1hdGlvbiB3aGVuIG5vIHpvb20gaXMgaW4gcHJvZ3Jlc3MiKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGZsb2F0IHpvb21TY2FsZTsKKyAgICAgICAgaW50IGludGVydmFsID0gKGludCkgKFN5c3RlbUNsb2NrLnVwdGltZU1pbGxpcygpIC0gbVpvb21TdGFydCk7CisgICAgICAgIGlmIChpbnRlcnZhbCA8IFpPT01fQU5JTUFUSU9OX0xFTkdUSCkgeworICAgICAgICAgICAgZmxvYXQgcmF0aW8gPSAoZmxvYXQpIGludGVydmFsIC8gWk9PTV9BTklNQVRJT05fTEVOR1RIOworICAgICAgICAgICAgem9vbVNjYWxlID0gMS4wZiAvIChtSW52SW5pdGlhbFpvb21TY2FsZQorICAgICAgICAgICAgICAgICAgICArIChtSW52RmluYWxab29tU2NhbGUgLSBtSW52SW5pdGlhbFpvb21TY2FsZSkgKiByYXRpbyk7CisgICAgICAgICAgICBtV2ViVmlldy5pbnZhbGlkYXRlKCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB6b29tU2NhbGUgPSBtWm9vbVNjYWxlOworICAgICAgICAgICAgLy8gc2V0IG1ab29tU2NhbGUgdG8gYmUgMCBhcyB3ZSBoYXZlIGZpbmlzaGVkIGFuaW1hdGluZworICAgICAgICAgICAgbVpvb21TY2FsZSA9IDA7CisgICAgICAgICAgICBtV2ViVmlldy5vbkZpeGVkTGVuZ3RoWm9vbUFuaW1hdGlvbkVuZCgpOworICAgICAgICB9CisgICAgICAgIC8vIGNhbGN1bGF0ZSB0aGUgaW50ZXJtZWRpYXRlIHNjcm9sbCBwb3NpdGlvbi4gU2luY2Ugd2UgbmVlZCB0byB1c2UKKyAgICAgICAgLy8gem9vbVNjYWxlLCB3ZSBjYW4ndCB1c2UgdGhlIFdlYlZpZXcncyBwaW5Mb2NYL1kgZnVuY3Rpb25zIGRpcmVjdGx5LgorICAgICAgICBmbG9hdCBzY2FsZSA9IHpvb21TY2FsZSAqIG1JbnZJbml0aWFsWm9vbVNjYWxlOworICAgICAgICBpbnQgdHggPSBNYXRoLnJvdW5kKHNjYWxlICogKG1Jbml0aWFsU2Nyb2xsWCArIG1ab29tQ2VudGVyWCkgLSBtWm9vbUNlbnRlclgpOworICAgICAgICB0eCA9IC1XZWJWaWV3LnBpbkxvYyh0eCwgbVdlYlZpZXcuZ2V0Vmlld1dpZHRoKCksIE1hdGgucm91bmQobVdlYlZpZXcuZ2V0Q29udGVudFdpZHRoKCkKKyAgICAgICAgICAgICAgICAqIHpvb21TY2FsZSkpICsgbVdlYlZpZXcuZ2V0U2Nyb2xsWCgpOworICAgICAgICBpbnQgdGl0bGVIZWlnaHQgPSBtV2ViVmlldy5nZXRUaXRsZUhlaWdodCgpOworICAgICAgICBpbnQgdHkgPSBNYXRoLnJvdW5kKHNjYWxlCisgICAgICAgICAgICAgICAgKiAobUluaXRpYWxTY3JvbGxZICsgbVpvb21DZW50ZXJZIC0gdGl0bGVIZWlnaHQpCisgICAgICAgICAgICAgICAgLSAobVpvb21DZW50ZXJZIC0gdGl0bGVIZWlnaHQpKTsKKyAgICAgICAgdHkgPSAtKHR5IDw9IHRpdGxlSGVpZ2h0ID8gTWF0aC5tYXgodHksIDApIDogV2ViVmlldy5waW5Mb2ModHkKKyAgICAgICAgICAgICAgICAtIHRpdGxlSGVpZ2h0LCBtV2ViVmlldy5nZXRWaWV3SGVpZ2h0KCksIE1hdGgucm91bmQobVdlYlZpZXcuZ2V0Q29udGVudEhlaWdodCgpCisgICAgICAgICAgICAgICAgKiB6b29tU2NhbGUpKSArIHRpdGxlSGVpZ2h0KSArIG1XZWJWaWV3LmdldFNjcm9sbFkoKTsKKworICAgICAgICBjYW52YXMudHJhbnNsYXRlKHR4LCB0eSk7CisgICAgICAgIGNhbnZhcy5zY2FsZSh6b29tU2NhbGUsIHpvb21TY2FsZSk7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaXNab29tQW5pbWF0aW5nKCkgeworICAgICAgICByZXR1cm4gaXNGaXhlZExlbmd0aEFuaW1hdGlvbkluUHJvZ3Jlc3MoKSB8fCBtUGluY2hUb1pvb21BbmltYXRpbmc7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaXNGaXhlZExlbmd0aEFuaW1hdGlvbkluUHJvZ3Jlc3MoKSB7CisgICAgICAgIHJldHVybiBtWm9vbVNjYWxlICE9IDA7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgcmVmcmVzaFpvb21TY2FsZShib29sZWFuIHJlZmxvd1RleHQpIHsKKyAgICAgICAgc2V0Wm9vbVNjYWxlKG1BY3R1YWxTY2FsZSwgcmVmbG93VGV4dCwgdHJ1ZSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0Wm9vbVNjYWxlKGZsb2F0IHNjYWxlLCBib29sZWFuIHJlZmxvd1RleHQpIHsKKyAgICAgICAgc2V0Wm9vbVNjYWxlKHNjYWxlLCByZWZsb3dUZXh0LCBmYWxzZSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHNldFpvb21TY2FsZShmbG9hdCBzY2FsZSwgYm9vbGVhbiByZWZsb3dUZXh0LCBib29sZWFuIGZvcmNlKSB7CisgICAgICAgIGZpbmFsIGJvb2xlYW4gaXNTY2FsZUxlc3NUaGFuTWluWm9vbSA9IHNjYWxlIDwgbU1pblpvb21TY2FsZTsKKyAgICAgICAgc2NhbGUgPSBjb21wdXRlU2NhbGVXaXRoTGltaXRzKHNjYWxlKTsKKworICAgICAgICAvLyBkZXRlcm1pbmUgd2hldGhlciBvciBub3Qgd2UgYXJlIGluIHRoZSB6b29tIG92ZXJ2aWV3IG1vZGUKKyAgICAgICAgaWYgKGlzU2NhbGVMZXNzVGhhbk1pblpvb20gJiYgbU1pblpvb21TY2FsZSA8IG1EZWZhdWx0U2NhbGUpIHsKKyAgICAgICAgICAgIG1Jblpvb21PdmVydmlldyA9IHRydWU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtSW5ab29tT3ZlcnZpZXcgPSAhZXhjZWVkc01pblNjYWxlSW5jcmVtZW50KHNjYWxlLCBnZXRab29tT3ZlcnZpZXdTY2FsZSgpKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChyZWZsb3dUZXh0KSB7CisgICAgICAgICAgICBtVGV4dFdyYXBTY2FsZSA9IHNjYWxlOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHNjYWxlICE9IG1BY3R1YWxTY2FsZSB8fCBmb3JjZSkgeworICAgICAgICAgICAgZmxvYXQgb2xkU2NhbGUgPSBtQWN0dWFsU2NhbGU7CisgICAgICAgICAgICBmbG9hdCBvbGRJbnZTY2FsZSA9IG1JbnZBY3R1YWxTY2FsZTsKKworICAgICAgICAgICAgaWYgKHNjYWxlICE9IG1BY3R1YWxTY2FsZSAmJiAhbVBpbmNoVG9ab29tQW5pbWF0aW5nKSB7CisgICAgICAgICAgICAgICAgbUNhbGxiYWNrUHJveHkub25TY2FsZUNoYW5nZWQobUFjdHVhbFNjYWxlLCBzY2FsZSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG1BY3R1YWxTY2FsZSA9IHNjYWxlOworICAgICAgICAgICAgbUludkFjdHVhbFNjYWxlID0gMSAvIHNjYWxlOworCisgICAgICAgICAgICBpZiAoIW1XZWJWaWV3LmRyYXdIaXN0b3J5KCkpIHsKKworICAgICAgICAgICAgICAgIC8vIElmIGhpc3RvcnkgUGljdHVyZSBpcyBkcmF3biwgZG9uJ3QgdXBkYXRlIHNjcm9sbC4gVGhleSB3aWxsCisgICAgICAgICAgICAgICAgLy8gYmUgdXBkYXRlZCB3aGVuIHdlIGdldCBvdXQgb2YgdGhhdCBtb2RlLgorICAgICAgICAgICAgICAgIC8vIHVwZGF0ZSBvdXIgc2Nyb2xsIHNvIHdlIGRvbid0IGFwcGVhciB0byBqdW1wCisgICAgICAgICAgICAgICAgLy8gaS5lLiBrZWVwIHRoZSBjZW50ZXIgb2YgdGhlIGRvYyBpbiB0aGUgY2VudGVyIG9mIHRoZSB2aWV3CisgICAgICAgICAgICAgICAgaW50IG9sZFggPSBtV2ViVmlldy5nZXRTY3JvbGxYKCk7CisgICAgICAgICAgICAgICAgaW50IG9sZFkgPSBtV2ViVmlldy5nZXRTY3JvbGxZKCk7CisgICAgICAgICAgICAgICAgZmxvYXQgcmF0aW8gPSBzY2FsZSAqIG9sZEludlNjYWxlOworICAgICAgICAgICAgICAgIGZsb2F0IHN4ID0gcmF0aW8gKiBvbGRYICsgKHJhdGlvIC0gMSkgKiBtWm9vbUNlbnRlclg7CisgICAgICAgICAgICAgICAgZmxvYXQgc3kgPSByYXRpbyAqIG9sZFkgKyAocmF0aW8gLSAxKQorICAgICAgICAgICAgICAgICAgICAgICAgKiAobVpvb21DZW50ZXJZIC0gbVdlYlZpZXcuZ2V0VGl0bGVIZWlnaHQoKSk7CisKKyAgICAgICAgICAgICAgICAvLyBTY2FsZSBhbGwgdGhlIGNoaWxkIHZpZXdzCisgICAgICAgICAgICAgICAgbVdlYlZpZXcubVZpZXdNYW5hZ2VyLnNjYWxlQWxsKCk7CisKKyAgICAgICAgICAgICAgICAvLyBhcyB3ZSBkb24ndCBoYXZlIGFuaW1hdGlvbiBmb3Igc2NhbGluZywgZG9uJ3QgZG8gYW5pbWF0aW9uCisgICAgICAgICAgICAgICAgLy8gZm9yIHNjcm9sbGluZywgYXMgaXQgY2F1c2VzIHdlaXJkIGludGVybWVkaWF0ZSBzdGF0ZQorICAgICAgICAgICAgICAgIGludCBzY3JvbGxYID0gbVdlYlZpZXcucGluTG9jWChNYXRoLnJvdW5kKHN4KSk7CisgICAgICAgICAgICAgICAgaW50IHNjcm9sbFkgPSBtV2ViVmlldy5waW5Mb2NZKE1hdGgucm91bmQoc3kpKTsKKyAgICAgICAgICAgICAgICBpZighbVdlYlZpZXcudXBkYXRlU2Nyb2xsQ29vcmRpbmF0ZXMoc2Nyb2xsWCwgc2Nyb2xsWSkpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHNjcm9sbCBwb3NpdGlvbiBpcyBhZGp1c3RlZCBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZQorICAgICAgICAgICAgICAgICAgICAvLyB6b29tIGFuaW1hdGlvbi4gQnV0IHdlIHdhbnQgdG8gdXBkYXRlIHRoZSBXZWJLaXQgYXQgdGhlCisgICAgICAgICAgICAgICAgICAgIC8vIGVuZCBvZiB0aGUgem9vbSBhbmltYXRpb24uIFNlZSBjb21tZW50cyBpbiBvblNjYWxlRW5kKCkuCisgICAgICAgICAgICAgICAgICAgIG1XZWJWaWV3LnNlbmRPdXJWaXNpYmxlUmVjdCgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gaWYgdGhlIHdlIG5lZWQgdG8gcmVmbG93IHRoZSB0ZXh0IHRoZW4gZm9yY2UgdGhlIFZJRVdfU0laRV9DSEFOR0VECisgICAgICAgICAgICAvLyBldmVudCB0byBiZSBzZW50IHRvIFdlYktpdAorICAgICAgICAgICAgbVdlYlZpZXcuc2VuZFZpZXdTaXplWm9vbShyZWZsb3dUZXh0KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSBkb3VibGUgdGFwIGdlc3R1cmUgY2FuIHJlc3VsdCBpbiBkaWZmZXJlbnQgYmVoYXZpb3JzIGRlcGVuZGluZyBvbiB0aGUKKyAgICAgKiBjb250ZW50IHRoYXQgaXMgdGFwcGVkLgorICAgICAqCisgICAgICogKDEpIFBMVUdJTlM6IElmIHRoZSB0YXBzIG9jY3VyIG9uIGEgcGx1Z2luIHRoZW4gd2UgbWF4aW1pemUgdGhlIHBsdWdpbiBvbgorICAgICAqIHRoZSBzY3JlZW4uIElmIHRoZSBwbHVnaW4gaXMgYWxyZWFkeSBtYXhpbWl6ZWQgdGhlbiB6b29tIHRoZSB1c2VyIGludG8KKyAgICAgKiBvdmVydmlldyBtb2RlLgorICAgICAqCisgICAgICogKDIpIEhUTUwvT1RIRVI6IElmIHRoZSB0YXBzIG9jY3VyIG91dHNpZGUgYSBwbHVnaW4gdGhlbiB0aGUgZm9sbG93aW5nCisgICAgICogaGV1cmlzdGljIGlzIHVzZWQuCisgICAgICogICBBLiBJZiB0aGUgY3VycmVudCBzY2FsZSBpcyBub3QgdGhlIHNhbWUgYXMgdGhlIHRleHQgd3JhcCBzY2FsZSBhbmQgdGhlCisgICAgICogICAgICBsYXlvdXQgYWxnb3JpdGhtIHNwZWNpZmllcyB0aGUgdXNlIG9mIE5BUlJPV19DT0xVTU5TLCB0aGVuIGZpdCB0bworICAgICAqICAgICAgY29sdW1uIGJ5IHJlZmxvd2luZyB0aGUgdGV4dC4KKyAgICAgKiAgIEIuIElmIHRoZSBwYWdlIGlzIG5vdCBpbiBvdmVydmlldyBtb2RlIHRoZW4gY2hhbmdlIHRvIG92ZXJ2aWV3IG1vZGUuCisgICAgICogICBDLiBJZiB0aGUgcGFnZSBpcyBpbiBvdmVybW9kZSB0aGVuIGNoYW5nZSB0byB0aGUgZGVmYXVsdCBzY2FsZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBoYW5kbGVEb3VibGVUYXAoZmxvYXQgbGFzdFRvdWNoWCwgZmxvYXQgbGFzdFRvdWNoWSkgeworICAgICAgICBXZWJTZXR0aW5ncyBzZXR0aW5ncyA9IG1XZWJWaWV3LmdldFNldHRpbmdzKCk7CisgICAgICAgIGlmIChzZXR0aW5ncyA9PSBudWxsIHx8IHNldHRpbmdzLmdldFVzZVdpZGVWaWV3UG9ydCgpID09IGZhbHNlKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBzZXRab29tQ2VudGVyKGxhc3RUb3VjaFgsIGxhc3RUb3VjaFkpOworICAgICAgICBtQW5jaG9yWCA9IG1XZWJWaWV3LnZpZXdUb0NvbnRlbnRYKChpbnQpIGxhc3RUb3VjaFggKyBtV2ViVmlldy5nZXRTY3JvbGxYKCkpOworICAgICAgICBtQW5jaG9yWSA9IG1XZWJWaWV3LnZpZXdUb0NvbnRlbnRZKChpbnQpIGxhc3RUb3VjaFkgKyBtV2ViVmlldy5nZXRTY3JvbGxZKCkpOworICAgICAgICBzZXR0aW5ncy5zZXREb3VibGVUYXBUb2FzdENvdW50KDApOworCisgICAgICAgIC8vIHJlbW92ZSB0aGUgem9vbSBjb250cm9sIGFmdGVyIGRvdWJsZSB0YXAKKyAgICAgICAgZGlzbWlzc1pvb21QaWNrZXIoKTsKKworICAgICAgICAvKgorICAgICAgICAgKiBJZiB0aGUgZG91YmxlIHRhcCB3YXMgb24gYSBwbHVnaW4gdGhlbiBlaXRoZXIgem9vbSB0byBtYXhpbWl6ZSB0aGUKKyAgICAgICAgICogcGx1Z2luIG9uIHRoZSBzY3JlZW4gb3Igc2NhbGUgdG8gb3ZlcnZpZXcgbW9kZS4KKyAgICAgICAgICovCisgICAgICAgIFZpZXdNYW5hZ2VyLkNoaWxkVmlldyBwbHVnaW4gPSBtV2ViVmlldy5tVmlld01hbmFnZXIuaGl0VGVzdChtQW5jaG9yWCwgbUFuY2hvclkpOworICAgICAgICBpZiAocGx1Z2luICE9IG51bGwpIHsKKyAgICAgICAgICAgIGlmIChtV2ViVmlldy5pc1BsdWdpbkZpdE9uU2NyZWVuKHBsdWdpbikpIHsKKyAgICAgICAgICAgICAgICB6b29tVG9PdmVydmlldygpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBtV2ViVmlldy5jZW50ZXJGaXRSZWN0KHBsdWdpbi54LCBwbHVnaW4ueSwgcGx1Z2luLndpZHRoLCBwbHVnaW4uaGVpZ2h0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChzZXR0aW5ncy5nZXRMYXlvdXRBbGdvcml0aG0oKSA9PSBXZWJTZXR0aW5ncy5MYXlvdXRBbGdvcml0aG0uTkFSUk9XX0NPTFVNTlMKKyAgICAgICAgICAgICAgICAmJiB3aWxsU2NhbGVUcmlnZ2VyWm9vbShtVGV4dFdyYXBTY2FsZSkKKyAgICAgICAgICAgICAgICAvLyBGb3IgdGFibGV0LCBub3QgbXVjaCBuZWVkIHRvIHJlZmxvdyB0ZXh0IHcvbyBkb3VibGUgdGFwcGluZy4KKyAgICAgICAgICAgICAgICAmJiAhc2V0dGluZ3MuZ2V0VXNlRml4ZWRWaWV3cG9ydCgpKSB7CisgICAgICAgICAgICByZWZyZXNoWm9vbVNjYWxlKHRydWUpOworICAgICAgICB9IGVsc2UgaWYgKCFtSW5ab29tT3ZlcnZpZXcpIHsKKyAgICAgICAgICAgIHpvb21Ub092ZXJ2aWV3KCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB6b29tVG9SZWFkaW5nTGV2ZWwoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBzZXRab29tT3ZlcnZpZXdXaWR0aChpbnQgd2lkdGgpIHsKKyAgICAgICAgbVpvb21PdmVydmlld1dpZHRoID0gd2lkdGg7CisgICAgICAgIG1JbnZab29tT3ZlcnZpZXdXaWR0aCA9IDEuMGYgLyB3aWR0aDsKKyAgICB9CisKKyAgICBwcml2YXRlIGZsb2F0IGdldFpvb21PdmVydmlld1NjYWxlKCkgeworICAgICAgICByZXR1cm4gbVdlYlZpZXcuZ2V0Vmlld1dpZHRoKCkgKiBtSW52Wm9vbU92ZXJ2aWV3V2lkdGg7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaXNJblpvb21PdmVydmlldygpIHsKKyAgICAgICAgcmV0dXJuIG1Jblpvb21PdmVydmlldzsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgem9vbVRvT3ZlcnZpZXcoKSB7CisgICAgICAgIGlmICghd2lsbFNjYWxlVHJpZ2dlclpvb20oZ2V0Wm9vbU92ZXJ2aWV3U2NhbGUoKSkpIHJldHVybjsKKworICAgICAgICAvLyBGb3JjZSB0aGUgdGl0bGViYXIgZnVsbHkgcmV2ZWFsIGluIG92ZXJ2aWV3IG1vZGUKKyAgICAgICAgaW50IHNjcm9sbFkgPSBtV2ViVmlldy5nZXRTY3JvbGxZKCk7CisgICAgICAgIGlmIChzY3JvbGxZIDwgbVdlYlZpZXcuZ2V0VGl0bGVIZWlnaHQoKSkgeworICAgICAgICAgICAgbVdlYlZpZXcudXBkYXRlU2Nyb2xsQ29vcmRpbmF0ZXMobVdlYlZpZXcuZ2V0U2Nyb2xsWCgpLCAwKTsKKyAgICAgICAgfQorICAgICAgICBzdGFydFpvb21BbmltYXRpb24oZ2V0Wm9vbU92ZXJ2aWV3U2NhbGUoKSwgdHJ1ZSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHpvb21Ub1JlYWRpbmdMZXZlbCgpIHsKKyAgICAgICAgZmluYWwgZmxvYXQgcmVhZGluZ1NjYWxlID0gZ2V0UmVhZGluZ0xldmVsU2NhbGUoKTsKKyAgICAgICAgaW50IGxlZnQgPSBtV2ViVmlldy5uYXRpdmVHZXRCbG9ja0xlZnRFZGdlKG1BbmNob3JYLCBtQW5jaG9yWSwgbUFjdHVhbFNjYWxlKTsKKyAgICAgICAgaWYgKGxlZnQgIT0gV2ViVmlldy5OT19MRUZURURHRSkgeworICAgICAgICAgICAgLy8gYWRkIGEgNXB0IHBhZGRpbmcgdG8gdGhlIGxlZnQgZWRnZS4KKyAgICAgICAgICAgIGludCB2aWV3TGVmdCA9IG1XZWJWaWV3LmNvbnRlbnRUb1ZpZXdYKGxlZnQgPCA1ID8gMCA6IChsZWZ0IC0gNSkpCisgICAgICAgICAgICAgICAgICAgIC0gbVdlYlZpZXcuZ2V0U2Nyb2xsWCgpOworICAgICAgICAgICAgLy8gUmUtY2FsY3VsYXRlIHRoZSB6b29tIGNlbnRlciBzbyB0aGF0IHRoZSBuZXcgc2Nyb2xsIHggd2lsbCBiZQorICAgICAgICAgICAgLy8gb24gdGhlIGxlZnQgZWRnZS4KKyAgICAgICAgICAgIGlmICh2aWV3TGVmdCA+IDApIHsKKyAgICAgICAgICAgICAgICBtWm9vbUNlbnRlclggPSB2aWV3TGVmdCAqIHJlYWRpbmdTY2FsZSAvIChyZWFkaW5nU2NhbGUgLSBtQWN0dWFsU2NhbGUpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBtV2ViVmlldy5zY3JvbGxCeSh2aWV3TGVmdCwgMCk7CisgICAgICAgICAgICAgICAgbVpvb21DZW50ZXJYID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBzdGFydFpvb21BbmltYXRpb24ocmVhZGluZ1NjYWxlLCB0cnVlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB1cGRhdGVNdWx0aVRvdWNoU3VwcG9ydChDb250ZXh0IGNvbnRleHQpIHsKKyAgICAgICAgLy8gY2hlY2sgdGhlIHByZWNvbmRpdGlvbnMKKyAgICAgICAgYXNzZXJ0IG1XZWJWaWV3LmdldFNldHRpbmdzKCkgIT0gbnVsbDsKKworICAgICAgICBmaW5hbCBXZWJTZXR0aW5ncyBzZXR0aW5ncyA9IG1XZWJWaWV3LmdldFNldHRpbmdzKCk7CisgICAgICAgIGZpbmFsIFBhY2thZ2VNYW5hZ2VyIHBtID0gY29udGV4dC5nZXRQYWNrYWdlTWFuYWdlcigpOworICAgICAgICBtU3VwcG9ydE11bHRpVG91Y2ggPSBwbS5oYXNTeXN0ZW1GZWF0dXJlKFBhY2thZ2VNYW5hZ2VyLkZFQVRVUkVfVE9VQ0hTQ1JFRU5fTVVMVElUT1VDSCkKKyAgICAgICAgICAgICAgICAmJiBzZXR0aW5ncy5zdXBwb3J0Wm9vbSgpICYmIHNldHRpbmdzLmdldEJ1aWx0SW5ab29tQ29udHJvbHMoKTsKKyAgICAgICAgbUFsbG93UGFuQW5kU2NhbGUgPSBwbS5oYXNTeXN0ZW1GZWF0dXJlKAorICAgICAgICAgICAgICAgIFBhY2thZ2VNYW5hZ2VyLkZFQVRVUkVfVE9VQ0hTQ1JFRU5fTVVMVElUT1VDSF9ESVNUSU5DVCk7CisgICAgICAgIGlmIChtU3VwcG9ydE11bHRpVG91Y2ggJiYgKG1TY2FsZURldGVjdG9yID09IG51bGwpKSB7CisgICAgICAgICAgICBtU2NhbGVEZXRlY3RvciA9IG5ldyBTY2FsZUdlc3R1cmVEZXRlY3Rvcihjb250ZXh0LCBuZXcgU2NhbGVEZXRlY3Rvckxpc3RlbmVyKCkpOworICAgICAgICB9IGVsc2UgaWYgKCFtU3VwcG9ydE11bHRpVG91Y2ggJiYgKG1TY2FsZURldGVjdG9yICE9IG51bGwpKSB7CisgICAgICAgICAgICBtU2NhbGVEZXRlY3RvciA9IG51bGw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBzdXBwb3J0c011bHRpVG91Y2hab29tKCkgeworICAgICAgICByZXR1cm4gbVN1cHBvcnRNdWx0aVRvdWNoOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIHN1cHBvcnRzUGFuRHVyaW5nWm9vbSgpIHsKKyAgICAgICAgcmV0dXJuIG1BbGxvd1BhbkFuZFNjYWxlOworICAgIH0KKworICAgIC8qKgorICAgICAqIE5vdGlmaWVzIHRoZSBjYWxsZXIgdGhhdCB0aGUgWm9vbU1hbmFnZXIgaXMgcmVxdWVzdGluZyB0aGF0IHNjYWxlIHJlbGF0ZWQKKyAgICAgKiB1cGRhdGVzIHNob3VsZCBub3QgYmUgc2VudCB0byB3ZWJraXQuIFRoaXMgY2FuIG9jY3VyIGluIGNhc2VzIHdoZXJlIHRoZQorICAgICAqIFpvb21NYW5hZ2VyIGlzIHBlcmZvcm1pbmcgYW4gYW5pbWF0aW9uIGFuZCBkb2VzIG5vdCB3YW50IHdlYmtpdCB0byB1cGRhdGUKKyAgICAgKiB1bnRpbCB0aGUgYW5pbWF0aW9uIGlzIGNvbXBsZXRlLgorICAgICAqCisgICAgICogQHJldHVybiB0cnVlIGlmIHNjYWxlIHJlbGF0ZWQgdXBkYXRlcyBzaG91bGQgbm90IGJlIHNlbnQgdG8gd2Via2l0IGFuZAorICAgICAqICAgICAgICAgZmFsc2Ugb3RoZXJ3aXNlLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzUHJldmVudGluZ1dlYmtpdFVwZGF0ZXMoKSB7CisgICAgICAgIC8vIGN1cnJlbnRseSBvbmx5IGFuaW1hdGluZyBhIG11bHRpLXRvdWNoIHpvb20gcHJldmVudHMgdXBkYXRlcywgYnV0CisgICAgICAgIC8vIG90aGVycyBjYW4gYWRkIHRoZWlyIG93biBjb25kaXRpb25zIHRvIHRoaXMgbWV0aG9kIGlmIG5lY2Vzc2FyeS4KKyAgICAgICAgcmV0dXJuIG1QaW5jaFRvWm9vbUFuaW1hdGluZzsKKyAgICB9CisKKyAgICBwdWJsaWMgU2NhbGVHZXN0dXJlRGV0ZWN0b3IgZ2V0TXVsdGlUb3VjaEdlc3R1cmVEZXRlY3RvcigpIHsKKyAgICAgICAgcmV0dXJuIG1TY2FsZURldGVjdG9yOworICAgIH0KKworICAgIHByaXZhdGUgY2xhc3MgU2NhbGVEZXRlY3Rvckxpc3RlbmVyIGltcGxlbWVudHMgU2NhbGVHZXN0dXJlRGV0ZWN0b3IuT25TY2FsZUdlc3R1cmVMaXN0ZW5lciB7CisKKyAgICAgICAgcHVibGljIGJvb2xlYW4gb25TY2FsZUJlZ2luKFNjYWxlR2VzdHVyZURldGVjdG9yIGRldGVjdG9yKSB7CisgICAgICAgICAgICBkaXNtaXNzWm9vbVBpY2tlcigpOworICAgICAgICAgICAgbVdlYlZpZXcubVZpZXdNYW5hZ2VyLnN0YXJ0Wm9vbSgpOworICAgICAgICAgICAgbVdlYlZpZXcub25QaW5jaFRvWm9vbUFuaW1hdGlvblN0YXJ0KCk7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBib29sZWFuIG9uU2NhbGUoU2NhbGVHZXN0dXJlRGV0ZWN0b3IgZGV0ZWN0b3IpIHsKKyAgICAgICAgICAgIGZsb2F0IHNjYWxlID0gTWF0aC5yb3VuZChkZXRlY3Rvci5nZXRTY2FsZUZhY3RvcigpICogbUFjdHVhbFNjYWxlICogMTAwKSAqIDAuMDFmOworICAgICAgICAgICAgaWYgKHdpbGxTY2FsZVRyaWdnZXJab29tKHNjYWxlKSkgeworICAgICAgICAgICAgICAgIG1QaW5jaFRvWm9vbUFuaW1hdGluZyA9IHRydWU7CisgICAgICAgICAgICAgICAgLy8gbGltaXQgdGhlIHNjYWxlIGNoYW5nZSBwZXIgc3RlcAorICAgICAgICAgICAgICAgIGlmIChzY2FsZSA+IG1BY3R1YWxTY2FsZSkgeworICAgICAgICAgICAgICAgICAgICBzY2FsZSA9IE1hdGgubWluKHNjYWxlLCBtQWN0dWFsU2NhbGUgKiAxLjI1Zik7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgc2NhbGUgPSBNYXRoLm1heChzY2FsZSwgbUFjdHVhbFNjYWxlICogMC44Zik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHNldFpvb21DZW50ZXIoZGV0ZWN0b3IuZ2V0Rm9jdXNYKCksIGRldGVjdG9yLmdldEZvY3VzWSgpKTsKKyAgICAgICAgICAgICAgICBzZXRab29tU2NhbGUoc2NhbGUsIGZhbHNlKTsKKyAgICAgICAgICAgICAgICBtV2ViVmlldy5pbnZhbGlkYXRlKCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBvblNjYWxlRW5kKFNjYWxlR2VzdHVyZURldGVjdG9yIGRldGVjdG9yKSB7CisgICAgICAgICAgICBpZiAobVBpbmNoVG9ab29tQW5pbWF0aW5nKSB7CisgICAgICAgICAgICAgICAgbVBpbmNoVG9ab29tQW5pbWF0aW5nID0gZmFsc2U7CisgICAgICAgICAgICAgICAgbUFuY2hvclggPSBtV2ViVmlldy52aWV3VG9Db250ZW50WCgoaW50KSBtWm9vbUNlbnRlclggKyBtV2ViVmlldy5nZXRTY3JvbGxYKCkpOworICAgICAgICAgICAgICAgIG1BbmNob3JZID0gbVdlYlZpZXcudmlld1RvQ29udGVudFkoKGludCkgbVpvb21DZW50ZXJZICsgbVdlYlZpZXcuZ2V0U2Nyb2xsWSgpKTsKKyAgICAgICAgICAgICAgICAvLyBkb24ndCByZWZsb3cgd2hlbiB6b29tIGluOyB3aGVuIHpvb20gb3V0LCBkbyByZWZsb3cgaWYgdGhlCisgICAgICAgICAgICAgICAgLy8gbmV3IHNjYWxlIGlzIGFsbW9zdCBtaW5pbXVtIHNjYWxlOworICAgICAgICAgICAgICAgIGJvb2xlYW4gcmVmbG93Tm93ID0gIWNhblpvb21PdXQoKSB8fCAobUFjdHVhbFNjYWxlIDw9IDAuOCAqIG1UZXh0V3JhcFNjYWxlKTsKKyAgICAgICAgICAgICAgICAvLyBmb3JjZSB6b29tIGFmdGVyIG1QcmV2aWV3Wm9vbU9ubHkgaXMgc2V0IHRvIGZhbHNlIHNvIHRoYXQgdGhlCisgICAgICAgICAgICAgICAgLy8gbmV3IHZpZXcgc2l6ZSB3aWxsIGJlIHBhc3NlZCB0byB0aGUgV2ViS2l0CisgICAgICAgICAgICAgICAgcmVmcmVzaFpvb21TY2FsZShyZWZsb3dOb3cpOworICAgICAgICAgICAgICAgIC8vIGNhbGwgaW52YWxpZGF0ZSgpIHRvIGRyYXcgd2l0aG91dCB6b29tIGZpbHRlcgorICAgICAgICAgICAgICAgIG1XZWJWaWV3LmludmFsaWRhdGUoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgbVdlYlZpZXcubVZpZXdNYW5hZ2VyLmVuZFpvb20oKTsKKyAgICAgICAgICAgIG1XZWJWaWV3Lm9uUGluY2hUb1pvb21BbmltYXRpb25FbmQoZGV0ZWN0b3IpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgb25TaXplQ2hhbmdlZChpbnQgdywgaW50IGgsIGludCBvdywgaW50IG9oKSB7CisgICAgICAgIC8vIHJlc2V0IHpvb20gYW5kIGFuY2hvciB0byB0aGUgdG9wIGxlZnQgY29ybmVyIG9mIHRoZSBzY3JlZW4KKyAgICAgICAgLy8gdW5sZXNzIHdlIGFyZSBhbHJlYWR5IHpvb21pbmcKKyAgICAgICAgaWYgKCFpc0ZpeGVkTGVuZ3RoQW5pbWF0aW9uSW5Qcm9ncmVzcygpKSB7CisgICAgICAgICAgICBpbnQgdmlzaWJsZVRpdGxlSGVpZ2h0ID0gbVdlYlZpZXcuZ2V0VmlzaWJsZVRpdGxlSGVpZ2h0KCk7CisgICAgICAgICAgICBtWm9vbUNlbnRlclggPSAwOworICAgICAgICAgICAgbVpvb21DZW50ZXJZID0gdmlzaWJsZVRpdGxlSGVpZ2h0OworICAgICAgICAgICAgbUFuY2hvclggPSBtV2ViVmlldy52aWV3VG9Db250ZW50WChtV2ViVmlldy5nZXRTY3JvbGxYKCkpOworICAgICAgICAgICAgbUFuY2hvclkgPSBtV2ViVmlldy52aWV3VG9Db250ZW50WSh2aXNpYmxlVGl0bGVIZWlnaHQgKyBtV2ViVmlldy5nZXRTY3JvbGxZKCkpOworICAgICAgICB9CisKKyAgICAgICAgLy8gdXBkYXRlIG1NaW5ab29tU2NhbGUgaWYgdGhlIG1pbmltdW0gem9vbSBzY2FsZSBpcyBub3QgZml4ZWQKKyAgICAgICAgaWYgKCFtTWluWm9vbVNjYWxlRml4ZWQpIHsKKyAgICAgICAgICAgIC8vIHdoZW4gY2hhbmdlIGZyb20gbmFycm93IHNjcmVlbiB0byB3aWRlIHNjcmVlbiwgdGhlIG5ldyB2aWV3V2lkdGgKKyAgICAgICAgICAgIC8vIGNhbiBiZSB3aWRlciB0aGFuIHRoZSBvbGQgY29udGVudCB3aWR0aC4gV2UgbGltaXQgdGhlIG1pbmltdW0KKyAgICAgICAgICAgIC8vIHNjYWxlIHRvIDEuMGYuIFRoZSBwcm9wZXIgbWluaW11bSBzY2FsZSB3aWxsIGJlIGNhbGN1bGF0ZWQgd2hlbgorICAgICAgICAgICAgLy8gdGhlIG5ldyBwaWN0dXJlIHNob3dzIHVwLgorICAgICAgICAgICAgbU1pblpvb21TY2FsZSA9IE1hdGgubWluKDEuMGYsIChmbG9hdCkgbVdlYlZpZXcuZ2V0Vmlld1dpZHRoKCkKKyAgICAgICAgICAgICAgICAgICAgLyAobVdlYlZpZXcuZHJhd0hpc3RvcnkoKSA/IG1XZWJWaWV3LmdldEhpc3RvcnlQaWN0dXJlV2lkdGgoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogbVpvb21PdmVydmlld1dpZHRoKSk7CisgICAgICAgICAgICAvLyBsaW1pdCB0aGUgbWluWm9vbVNjYWxlIHRvIHRoZSBpbml0aWFsU2NhbGUgaWYgaXQgaXMgc2V0CisgICAgICAgICAgICBpZiAobUluaXRpYWxTY2FsZSA+IDAgJiYgbUluaXRpYWxTY2FsZSA8IG1NaW5ab29tU2NhbGUpIHsKKyAgICAgICAgICAgICAgICBtTWluWm9vbVNjYWxlID0gbUluaXRpYWxTY2FsZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGRpc21pc3Nab29tUGlja2VyKCk7CisKKyAgICAgICAgLy8gb25TaXplQ2hhbmdlZCgpIGlzIGNhbGxlZCBkdXJpbmcgV2ViVmlldyBsYXlvdXQuIEFuZCBhbnkKKyAgICAgICAgLy8gcmVxdWVzdExheW91dCgpIGlzIGJsb2NrZWQgZHVyaW5nIGxheW91dC4gQXMgcmVmcmVzaFpvb21TY2FsZSgpIHdpbGwKKyAgICAgICAgLy8gY2F1c2UgaXRzIGNoaWxkIFZpZXcgdG8gcmVwb3NpdGlvbiBpdHNlbGYgdGhyb3VnaCBWaWV3TWFuYWdlcidzCisgICAgICAgIC8vIHNjYWxlQWxsKCksIHdlIG5lZWQgdG8gcG9zdCBhIFJ1bm5hYmxlIHRvIGVuc3VyZSByZXF1ZXN0TGF5b3V0KCkuCisgICAgICAgIC8vIEFkZGl0aW9uYWxseSwgb25seSB1cGRhdGUgdGhlIHRleHQgd3JhcCBzY2FsZSBpZiB0aGUgd2lkdGggY2hhbmdlZC4KKyAgICAgICAgbVdlYlZpZXcucG9zdChuZXcgUG9zdFNjYWxlKHcgIT0gb3cpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIGNsYXNzIFBvc3RTY2FsZSBpbXBsZW1lbnRzIFJ1bm5hYmxlIHsKKyAgICAgICAgZmluYWwgYm9vbGVhbiBtVXBkYXRlVGV4dFdyYXA7CisKKyAgICAgICAgcHVibGljIFBvc3RTY2FsZShib29sZWFuIHVwZGF0ZVRleHRXcmFwKSB7CisgICAgICAgICAgICBtVXBkYXRlVGV4dFdyYXAgPSB1cGRhdGVUZXh0V3JhcDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgIGlmIChtV2ViVmlldy5nZXRXZWJWaWV3Q29yZSgpICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAvLyB3ZSBhbHdheXMgZm9yY2UsIGluIGNhc2Ugb3VyIGhlaWdodCBjaGFuZ2VkLCBpbiB3aGljaCBjYXNlIHdlCisgICAgICAgICAgICAgICAgLy8gc3RpbGwgd2FudCB0byBzZW5kIHRoZSBub3RpZmljYXRpb24gb3ZlciB0byB3ZWJraXQuCisgICAgICAgICAgICAgICAgc2V0Wm9vbVNjYWxlKE1hdGgubWF4KG1BY3R1YWxTY2FsZSwgZ2V0Wm9vbU92ZXJ2aWV3U2NhbGUoKSksCisgICAgICAgICAgICAgICAgICAgIG1VcGRhdGVUZXh0V3JhcCwgdHJ1ZSk7CisgICAgICAgICAgICAgICAgLy8gdXBkYXRlIHRoZSB6b29tIGJ1dHRvbnMgYXMgdGhlIHNjYWxlIGNhbiBiZSBjaGFuZ2VkCisgICAgICAgICAgICAgICAgdXBkYXRlWm9vbVBpY2tlcigpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdXBkYXRlWm9vbVJhbmdlKFdlYlZpZXdDb3JlLlZpZXdTdGF0ZSB2aWV3U3RhdGUsCisgICAgICAgICAgICBpbnQgdmlld1dpZHRoLCBpbnQgbWluUHJlZldpZHRoKSB7CisgICAgICAgIGlmICh2aWV3U3RhdGUubU1pblNjYWxlID09IDApIHsKKyAgICAgICAgICAgIGlmICh2aWV3U3RhdGUubU1vYmlsZVNpdGUpIHsKKyAgICAgICAgICAgICAgICBpZiAobWluUHJlZldpZHRoID4gTWF0aC5tYXgoMCwgdmlld1dpZHRoKSkgeworICAgICAgICAgICAgICAgICAgICBtTWluWm9vbVNjYWxlID0gKGZsb2F0KSB2aWV3V2lkdGggLyBtaW5QcmVmV2lkdGg7CisgICAgICAgICAgICAgICAgICAgIG1NaW5ab29tU2NhbGVGaXhlZCA9IGZhbHNlOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIG1NaW5ab29tU2NhbGUgPSB2aWV3U3RhdGUubURlZmF1bHRTY2FsZTsKKyAgICAgICAgICAgICAgICAgICAgbU1pblpvb21TY2FsZUZpeGVkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG1NaW5ab29tU2NhbGUgPSBtRGVmYXVsdE1pblpvb21TY2FsZTsKKyAgICAgICAgICAgICAgICBtTWluWm9vbVNjYWxlRml4ZWQgPSBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1NaW5ab29tU2NhbGUgPSB2aWV3U3RhdGUubU1pblNjYWxlOworICAgICAgICAgICAgbU1pblpvb21TY2FsZUZpeGVkID0gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBpZiAodmlld1N0YXRlLm1NYXhTY2FsZSA9PSAwKSB7CisgICAgICAgICAgICBtTWF4Wm9vbVNjYWxlID0gbURlZmF1bHRNYXhab29tU2NhbGU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtTWF4Wm9vbVNjYWxlID0gdmlld1N0YXRlLm1NYXhTY2FsZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFVwZGF0ZXMgem9vbSB2YWx1ZXMgd2hlbiBXZWJraXQgcHJvZHVjZXMgYSBuZXcgcGljdHVyZS4gVGhpcyBtZXRob2QKKyAgICAgKiBzaG91bGQgb25seSBiZSBjYWxsZWQgZnJvbSB0aGUgVUkgdGhyZWFkJ3MgbWVzc2FnZSBoYW5kbGVyLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIG9uTmV3UGljdHVyZShXZWJWaWV3Q29yZS5EcmF3RGF0YSBkcmF3RGF0YSkgeworICAgICAgICBmaW5hbCBpbnQgdmlld1dpZHRoID0gbVdlYlZpZXcuZ2V0Vmlld1dpZHRoKCk7CisKKyAgICAgICAgaWYgKCFtV2ViVmlldy5nZXRTZXR0aW5ncygpLmdldFVzZUZpeGVkVmlld3BvcnQoKQorICAgICAgICAgICAgJiYgbVdlYlZpZXcuZ2V0U2V0dGluZ3MoKS5nZXRVc2VXaWRlVmlld1BvcnQoKSkgeworICAgICAgICAgICAgLy8gbGltaXQgbVpvb21PdmVydmlld1dpZHRoIHVwcGVyIGJvdW5kIHRvCisgICAgICAgICAgICAvLyBzTWF4Vmlld3BvcnRXaWR0aCBzbyB0aGF0IGlmIHRoZSBwYWdlIGRvZXNuJ3QgYmVoYXZlCisgICAgICAgICAgICAvLyB3ZWxsLCB0aGUgV2ViVmlldyB3b24ndCBnbyBpbnNhbmUuIGxpbWl0IHRoZSBsb3dlcgorICAgICAgICAgICAgLy8gYm91bmQgdG8gbWF0Y2ggdGhlIGRlZmF1bHQgc2NhbGUgZm9yIG1vYmlsZSBzaXRlcy4KKyAgICAgICAgICAgIHNldFpvb21PdmVydmlld1dpZHRoKE1hdGgubWluKFdlYlZpZXcuc01heFZpZXdwb3J0V2lkdGgsCisgICAgICAgICAgICAgICAgICAgIE1hdGgubWF4KChpbnQpICh2aWV3V2lkdGggKiBtSW52RGVmYXVsdFNjYWxlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXRoLm1heChkcmF3RGF0YS5tTWluUHJlZldpZHRoLCBkcmF3RGF0YS5tVmlld1BvaW50LngpKSkpOworICAgICAgICB9CisKKyAgICAgICAgZmluYWwgZmxvYXQgem9vbU92ZXJ2aWV3U2NhbGUgPSBnZXRab29tT3ZlcnZpZXdTY2FsZSgpOworICAgICAgICBpZiAoIW1NaW5ab29tU2NhbGVGaXhlZCkgeworICAgICAgICAgICAgbU1pblpvb21TY2FsZSA9IHpvb21PdmVydmlld1NjYWxlOworICAgICAgICB9CisgICAgICAgIC8vIGZpdCB0aGUgY29udGVudCB3aWR0aCB0byB0aGUgY3VycmVudCB2aWV3LiBJZ25vcmUgdGhlIHJvdW5kaW5nIGVycm9yIGNhc2UuCisgICAgICAgIGlmICghbVdlYlZpZXcuZHJhd0hpc3RvcnkoKSAmJiAobUluaXRpYWxab29tT3ZlcnZpZXcgfHwgKG1Jblpvb21PdmVydmlldworICAgICAgICAgICAgICAgICYmIE1hdGguYWJzKCh2aWV3V2lkdGggKiBtSW52QWN0dWFsU2NhbGUpIC0gbVpvb21PdmVydmlld1dpZHRoKSA+IDEpKSkgeworICAgICAgICAgICAgbUluaXRpYWxab29tT3ZlcnZpZXcgPSBmYWxzZTsKKyAgICAgICAgICAgIHNldFpvb21TY2FsZSh6b29tT3ZlcnZpZXdTY2FsZSwgIXdpbGxTY2FsZVRyaWdnZXJab29tKG1UZXh0V3JhcFNjYWxlKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBVcGRhdGVzIHpvb20gdmFsdWVzIGFmdGVyIFdlYmtpdCBjb21wbGV0ZXMgdGhlIGluaXRpYWwgcGFnZSBsYXlvdXQuIEl0CisgICAgICogaXMgY2FsbGVkIHdoZW4gdmlzaXRpbmcgYSBwYWdlIGZvciB0aGUgZmlyc3QgdGltZSBhcyB3ZWxsIGFzIHdoZW4gdGhlCisgICAgICogdXNlciBuYXZpZ2F0ZXMgYmFjayB0byBhIHBhZ2UgKGluIHdoaWNoIGNhc2Ugd2UgbWF5IG5lZWQgdG8gcmVzdG9yZSB0aGUKKyAgICAgKiB6b29tIGxldmVscyB0byB0aGUgc3RhdGUgdGhleSB3ZXJlIHdoZW4geW91IGxlZnQgdGhlIHBhZ2UpLiBUaGlzIG1ldGhvZAorICAgICAqIHNob3VsZCBvbmx5IGJlIGNhbGxlZCBmcm9tIHRoZSBVSSB0aHJlYWQncyBtZXNzYWdlIGhhbmRsZXIuCisgICAgICovCisgICAgcHVibGljIHZvaWQgb25GaXJzdExheW91dChXZWJWaWV3Q29yZS5EcmF3RGF0YSBkcmF3RGF0YSkgeworICAgICAgICAvLyBwcmVjb25kaXRpb24gY2hlY2sKKyAgICAgICAgYXNzZXJ0IGRyYXdEYXRhICE9IG51bGw7CisgICAgICAgIGFzc2VydCBkcmF3RGF0YS5tVmlld1N0YXRlICE9IG51bGw7CisgICAgICAgIGFzc2VydCBtV2ViVmlldy5nZXRTZXR0aW5ncygpICE9IG51bGw7CisKKyAgICAgICAgV2ViVmlld0NvcmUuVmlld1N0YXRlIHZpZXdTdGF0ZSA9IGRyYXdEYXRhLm1WaWV3U3RhdGU7CisgICAgICAgIGZpbmFsIFBvaW50IHZpZXdTaXplID0gZHJhd0RhdGEubVZpZXdQb2ludDsKKyAgICAgICAgdXBkYXRlWm9vbVJhbmdlKHZpZXdTdGF0ZSwgdmlld1NpemUueCwgZHJhd0RhdGEubU1pblByZWZXaWR0aCk7CisKKyAgICAgICAgaWYgKCFtV2ViVmlldy5kcmF3SGlzdG9yeSgpKSB7CisgICAgICAgICAgICBmaW5hbCBmbG9hdCBzY2FsZTsKKyAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gcmVmbG93VGV4dDsKKworICAgICAgICAgICAgaWYgKG1Jbml0aWFsU2NhbGUgPiAwKSB7CisgICAgICAgICAgICAgICAgc2NhbGUgPSBtSW5pdGlhbFNjYWxlOworICAgICAgICAgICAgICAgIHJlZmxvd1RleHQgPSBleGNlZWRzTWluU2NhbGVJbmNyZW1lbnQobVRleHRXcmFwU2NhbGUsIHNjYWxlKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAodmlld1N0YXRlLm1WaWV3U2NhbGUgPiAwKSB7CisgICAgICAgICAgICAgICAgbVRleHRXcmFwU2NhbGUgPSB2aWV3U3RhdGUubVRleHRXcmFwU2NhbGU7CisgICAgICAgICAgICAgICAgc2NhbGUgPSB2aWV3U3RhdGUubVZpZXdTY2FsZTsKKyAgICAgICAgICAgICAgICByZWZsb3dUZXh0ID0gZmFsc2U7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIFdlYlNldHRpbmdzIHNldHRpbmdzID0gbVdlYlZpZXcuZ2V0U2V0dGluZ3MoKTsKKyAgICAgICAgICAgICAgICBpZiAoc2V0dGluZ3MuZ2V0VXNlV2lkZVZpZXdQb3J0KCkKKyAgICAgICAgICAgICAgICAgICAgJiYgKHNldHRpbmdzLmdldExvYWRXaXRoT3ZlcnZpZXdNb2RlKCkgfHwgc2V0dGluZ3MuZ2V0VXNlRml4ZWRWaWV3cG9ydCgpKSkgeworICAgICAgICAgICAgICAgICAgICBtSW5pdGlhbFpvb21PdmVydmlldyA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIHNjYWxlID0gKGZsb2F0KSBtV2ViVmlldy5nZXRWaWV3V2lkdGgoKSAvIFdlYlZpZXcuREVGQVVMVF9WSUVXUE9SVF9XSURUSDsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBzY2FsZSA9IHZpZXdTdGF0ZS5tVGV4dFdyYXBTY2FsZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmVmbG93VGV4dCA9IGV4Y2VlZHNNaW5TY2FsZUluY3JlbWVudChtVGV4dFdyYXBTY2FsZSwgc2NhbGUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2V0Wm9vbVNjYWxlKHNjYWxlLCByZWZsb3dUZXh0KTsKKworICAgICAgICAgICAgLy8gdXBkYXRlIHRoZSB6b29tIGJ1dHRvbnMgYXMgdGhlIHNjYWxlIGNhbiBiZSBjaGFuZ2VkCisgICAgICAgICAgICB1cGRhdGVab29tUGlja2VyKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzYXZlWm9vbVN0YXRlKEJ1bmRsZSBiKSB7CisgICAgICAgIGIucHV0RmxvYXQoInNjYWxlIiwgbUFjdHVhbFNjYWxlKTsKKyAgICAgICAgYi5wdXRGbG9hdCgidGV4dHdyYXBTY2FsZSIsIG1UZXh0V3JhcFNjYWxlKTsKKyAgICAgICAgYi5wdXRCb29sZWFuKCJvdmVydmlldyIsIG1Jblpvb21PdmVydmlldyk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgcmVzdG9yZVpvb21TdGF0ZShCdW5kbGUgYikgeworICAgICAgICAvLyBhcyBnZXRXaWR0aCgpIC8gZ2V0SGVpZ2h0KCkgb2YgdGhlIHZpZXcgYXJlIG5vdCBhdmFpbGFibGUgeWV0LCBzZXQgdXAKKyAgICAgICAgLy8gbUFjdHVhbFNjYWxlLCBzbyB0aGF0IHdoZW4gb25TaXplQ2hhbmdlZCgpIGlzIGNhbGxlZCwgdGhlIHJlc3Qgd2lsbAorICAgICAgICAvLyBiZSBzZXQgY29ycmVjdGx5CisgICAgICAgIG1BY3R1YWxTY2FsZSA9IGIuZ2V0RmxvYXQoInNjYWxlIiwgMS4wZik7CisgICAgICAgIG1JbnZBY3R1YWxTY2FsZSA9IDEgLyBtQWN0dWFsU2NhbGU7CisgICAgICAgIG1UZXh0V3JhcFNjYWxlID0gYi5nZXRGbG9hdCgidGV4dHdyYXBTY2FsZSIsIG1BY3R1YWxTY2FsZSk7CisgICAgICAgIG1Jblpvb21PdmVydmlldyA9IGIuZ2V0Qm9vbGVhbigib3ZlcnZpZXciKTsKKyAgICB9CisKKyAgICBwcml2YXRlIFpvb21Db250cm9sQmFzZSBnZXRDdXJyZW50Wm9vbUNvbnRyb2woKSB7CisgICAgICAgIGlmIChtV2ViVmlldy5nZXRTZXR0aW5ncygpICE9IG51bGwgJiYgbVdlYlZpZXcuZ2V0U2V0dGluZ3MoKS5zdXBwb3J0Wm9vbSgpKSB7CisgICAgICAgICAgICBpZiAobVdlYlZpZXcuZ2V0U2V0dGluZ3MoKS5nZXRCdWlsdEluWm9vbUNvbnRyb2xzKCkpIHsKKyAgICAgICAgICAgICAgICBpZiAoKG1FbWJlZGRlZFpvb21Db250cm9sID09IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICAmJiBtV2ViVmlldy5nZXRTZXR0aW5ncygpLmdldERpc3BsYXlab29tQ29udHJvbHMoKSkgeworICAgICAgICAgICAgICAgICAgICBtRW1iZWRkZWRab29tQ29udHJvbCA9IG5ldyBab29tQ29udHJvbEVtYmVkZGVkKHRoaXMsIG1XZWJWaWV3KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIG1FbWJlZGRlZFpvb21Db250cm9sOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZiAobUV4dGVybmFsWm9vbUNvbnRyb2wgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBtRXh0ZXJuYWxab29tQ29udHJvbCA9IG5ldyBab29tQ29udHJvbEV4dGVybmFsKG1XZWJWaWV3KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIG1FeHRlcm5hbFpvb21Db250cm9sOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGludm9rZVpvb21QaWNrZXIoKSB7CisgICAgICAgIFpvb21Db250cm9sQmFzZSBjb250cm9sID0gZ2V0Q3VycmVudFpvb21Db250cm9sKCk7CisgICAgICAgIGlmIChjb250cm9sICE9IG51bGwpIHsKKyAgICAgICAgICAgIGNvbnRyb2wuc2hvdygpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZGlzbWlzc1pvb21QaWNrZXIoKSB7CisgICAgICAgIFpvb21Db250cm9sQmFzZSBjb250cm9sID0gZ2V0Q3VycmVudFpvb21Db250cm9sKCk7CisgICAgICAgIGlmIChjb250cm9sICE9IG51bGwpIHsKKyAgICAgICAgICAgIGNvbnRyb2wuaGlkZSgpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaXNab29tUGlja2VyVmlzaWJsZSgpIHsKKyAgICAgICAgWm9vbUNvbnRyb2xCYXNlIGNvbnRyb2wgPSBnZXRDdXJyZW50Wm9vbUNvbnRyb2woKTsKKyAgICAgICAgcmV0dXJuIChjb250cm9sICE9IG51bGwpID8gY29udHJvbC5pc1Zpc2libGUoKSA6IGZhbHNlOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHVwZGF0ZVpvb21QaWNrZXIoKSB7CisgICAgICAgIFpvb21Db250cm9sQmFzZSBjb250cm9sID0gZ2V0Q3VycmVudFpvb21Db250cm9sKCk7CisgICAgICAgIGlmIChjb250cm9sICE9IG51bGwpIHsKKyAgICAgICAgICAgIGNvbnRyb2wudXBkYXRlKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgZW1iZWRkZWQgem9vbSBjb250cm9sIGludGVyY2VwdHMgdG91Y2ggZXZlbnRzIGFuZCBhdXRvbWF0aWNhbGx5IHN0YXlzCisgICAgICogdmlzaWJsZS4gVGhlIGV4dGVybmFsIGNvbnRyb2wgbmVlZHMgdG8gY29uc3RhbnRseSByZWZyZXNoIGl0cyBpbnRlcm5hbAorICAgICAqIHRpbWVyIHRvIHN0YXkgdmlzaWJsZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBrZWVwWm9vbVBpY2tlclZpc2libGUoKSB7CisgICAgICAgIFpvb21Db250cm9sQmFzZSBjb250cm9sID0gZ2V0Q3VycmVudFpvb21Db250cm9sKCk7CisgICAgICAgIGlmIChjb250cm9sICE9IG51bGwgJiYgY29udHJvbCA9PSBtRXh0ZXJuYWxab29tQ29udHJvbCkgeworICAgICAgICAgICAgY29udHJvbC5zaG93KCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgVmlldyBnZXRFeHRlcm5hbFpvb21QaWNrZXIoKSB7CisgICAgICAgIFpvb21Db250cm9sQmFzZSBjb250cm9sID0gZ2V0Q3VycmVudFpvb21Db250cm9sKCk7CisgICAgICAgIGlmIChjb250cm9sICE9IG51bGwgJiYgY29udHJvbCA9PSBtRXh0ZXJuYWxab29tQ29udHJvbCkgeworICAgICAgICAgICAgcmV0dXJuIG1FeHRlcm5hbFpvb21Db250cm9sLmdldENvbnRyb2xzKCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3dlYnJ1bnRpbWUvV2ViUnVudGltZUFjdGl2aXR5LmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC93ZWJydW50aW1lL1dlYlJ1bnRpbWVBY3Rpdml0eS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVjOGM2MGMKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2phdmEvYW5kcm9pZC93ZWJydW50aW1lL1dlYlJ1bnRpbWVBY3Rpdml0eS5qYXZhCkBAIC0wLDAgKzEsMjA0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLndlYnJ1bnRpbWU7CisKK2ltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eTsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db21wb25lbnROYW1lOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5BY3Rpdml0eUluZm87CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLlBhY2thZ2VNYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuUmVzb3VyY2VzOworaW1wb3J0IGFuZHJvaWQubmV0LlVyaTsKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworaW1wb3J0IGFuZHJvaWQudmlldy5LZXlFdmVudDsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuTWVudTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuV2luZG93OworaW1wb3J0IGFuZHJvaWQud2Via2l0Lkdlb2xvY2F0aW9uUGVybWlzc2lvbnM7CitpbXBvcnQgYW5kcm9pZC53ZWJraXQuV2ViQ2hyb21lQ2xpZW50OworaW1wb3J0IGFuZHJvaWQud2Via2l0LldlYlZpZXc7CitpbXBvcnQgYW5kcm9pZC53ZWJraXQuV2ViVmlld0NsaWVudDsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5JbWFnZVZpZXc7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuVG9hc3Q7CisKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC5SOworCitpbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmV0LlVSTDsKKworLyoqCisgKiBUaGUgcnVudGltZSB1c2VkIHRvIGRpc3BsYXkgaW5zdGFsbGVkIHdlYiBhcHBsaWNhdGlvbnMuCisgKiBAaGlkZQorICovCitwdWJsaWMgY2xhc3MgV2ViUnVudGltZUFjdGl2aXR5IGV4dGVuZHMgQWN0aXZpdHkKK3sKKyAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgTE9HVEFHID0gIldlYlJ1bnRpbWVBY3Rpdml0eSI7CisKKyAgICBwcml2YXRlIFdlYlZpZXcgbVdlYlZpZXc7CisgICAgcHJpdmF0ZSBVUkwgbUJhc2VVcmw7CisgICAgcHJpdmF0ZSBJbWFnZVZpZXcgbVNwbGFzaFNjcmVlbjsKKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgU2Vuc2l0aXZlRmVhdHVyZXMgeworICAgICAgICAvLyBBbGwgb2YgdGhlIHNlbnNpdGl2ZSBmZWF0dXJlcworICAgICAgICBwcml2YXRlIGJvb2xlYW4gbUdlb2xvY2F0aW9uOworICAgICAgICAvLyBPbiBBbmRyb2lkLCB0aGUgQnJvd3NlciBkb2Vzbid0IHByb21wdCBmb3IgZGF0YWJhc2UgYWNjZXNzLCBzbyB3ZSBkb24ndCByZXF1aXJlIGFuCisgICAgICAgIC8vIGV4cGxpY2l0IHBlcm1pc3Npb24gaGVyZSBpbiB0aGUgV2ViUnVudGltZUFjdGl2aXR5LCBhbmQgdGhlcmUncyBubyBBbmRyb2lkIHN5c3RlbQorICAgICAgICAvLyBwZXJtaXNzaW9uIHJlcXVpcmVkIGZvciBpdCBlaXRoZXIuCisgICAgICAgIC8vcHJpdmF0ZSBib29sZWFuIG1EYXRhYmFzZTsKKworICAgICAgICBwdWJsaWMgYm9vbGVhbiBnZXRHZW9sb2NhdGlvbigpIHsKKyAgICAgICAgICAgIHJldHVybiBtR2VvbG9jYXRpb247CisgICAgICAgIH0KKyAgICAgICAgcHVibGljIHZvaWQgc2V0R2VvbG9jYXRpb24oYm9vbGVhbiBnZW9sb2NhdGlvbikgeworICAgICAgICAgICAgbUdlb2xvY2F0aW9uID0gZ2VvbG9jYXRpb247CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiogQ2FsbGVkIHdoZW4gdGhlIGFjdGl2aXR5IGlzIGZpcnN0IGNyZWF0ZWQuICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb25DcmVhdGUoQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkKKyAgICB7CisgICAgICAgIHN1cGVyLm9uQ3JlYXRlKHNhdmVkSW5zdGFuY2VTdGF0ZSk7CisKKyAgICAgICAgLy8gQ2FuJ3QgZ2V0IG1ldGEgZGF0YSB1c2luZyBnZXRBcHBsaWNhdGlvbkluZm8oKSBhcyBpdCBkb2Vzbid0IHBhc3MgR0VUX01FVEFfREFUQQorICAgICAgICBQYWNrYWdlTWFuYWdlciBwYWNrYWdlTWFuYWdlciA9IGdldFBhY2thZ2VNYW5hZ2VyKCk7CisgICAgICAgIENvbXBvbmVudE5hbWUgY29tcG9uZW50TmFtZSA9IG5ldyBDb21wb25lbnROYW1lKHRoaXMsIGdldENsYXNzKCkpOworICAgICAgICBBY3Rpdml0eUluZm8gYWN0aXZpdHlJbmZvID0gbnVsbDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGFjdGl2aXR5SW5mbyA9IHBhY2thZ2VNYW5hZ2VyLmdldEFjdGl2aXR5SW5mbyhjb21wb25lbnROYW1lLCBQYWNrYWdlTWFuYWdlci5HRVRfTUVUQV9EQVRBKTsKKyAgICAgICAgfSBjYXRjaCAoUGFja2FnZU1hbmFnZXIuTmFtZU5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIExvZy5kKExPR1RBRywgIkZhaWxlZCB0byBmaW5kIGNvbXBvbmVudCIpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGlmIChhY3Rpdml0eUluZm8gPT0gbnVsbCkgeworICAgICAgICAgICAgTG9nLmQoTE9HVEFHLCAiRmFpbGVkIHRvIGdldCBhY3Rpdml0eSBpbmZvIik7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBCdW5kbGUgbWV0YURhdGEgPSBhY3Rpdml0eUluZm8ubWV0YURhdGE7CisgICAgICAgIGlmIChtZXRhRGF0YSA9PSBudWxsKSB7CisgICAgICAgICAgICBMb2cuZChMT0dUQUcsICJObyBtZXRhIGRhdGEiKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIFN0cmluZyB1cmwgPSBtZXRhRGF0YS5nZXRTdHJpbmcoImFuZHJvaWQud2VicnVudGltZS51cmwiKTsKKyAgICAgICAgaWYgKHVybCA9PSBudWxsKSB7CisgICAgICAgICAgICBMb2cuZChMT0dUQUcsICJObyBVUkwiKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBtQmFzZVVybCA9IG5ldyBVUkwodXJsKTsKKyAgICAgICAgfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIExvZy5kKExPR1RBRywgIkludmFsaWQgVVJMIik7CisgICAgICAgIH0KKworICAgICAgICAvLyBBbGwgZmFsc2UgYnkgZGVmYXVsdCwgYW5kIHJlYWRpbmcgbm9uLWV4aXN0ZW50IGJ1bmRsZSBwcm9wZXJ0aWVzIGdpdmVzIGZhbHNlIHRvby4KKyAgICAgICAgZmluYWwgU2Vuc2l0aXZlRmVhdHVyZXMgc2Vuc2l0aXZlRmVhdHVyZXMgPSBuZXcgU2Vuc2l0aXZlRmVhdHVyZXMoKTsKKyAgICAgICAgc2Vuc2l0aXZlRmVhdHVyZXMuc2V0R2VvbG9jYXRpb24obWV0YURhdGEuZ2V0Qm9vbGVhbigiYW5kcm9pZC53ZWJydW50aW1lLlNlbnNpdGl2ZUZlYXR1cmVzR2VvbG9jYXRpb24iKSk7CisKKyAgICAgICAgZ2V0V2luZG93KCkucmVxdWVzdEZlYXR1cmUoV2luZG93LkZFQVRVUkVfTk9fVElUTEUpOworICAgICAgICBzZXRDb250ZW50VmlldyhSLmxheW91dC53ZWJfcnVudGltZSk7CisgICAgICAgIG1XZWJWaWV3ID0gKFdlYlZpZXcpIGZpbmRWaWV3QnlJZChSLmlkLndlYnZpZXcpOworICAgICAgICBtU3BsYXNoU2NyZWVuID0gKEltYWdlVmlldykgZmluZFZpZXdCeUlkKFIuaWQuc3BsYXNoc2NyZWVuKTsKKyAgICAgICAgbVNwbGFzaFNjcmVlbi5zZXRJbWFnZVJlc291cmNlKAorICAgICAgICAgICAgICAgIGdldFJlc291cmNlcygpLmdldElkZW50aWZpZXIoInNwbGFzaF9zY3JlZW4iLCAiZHJhd2FibGUiLCBnZXRQYWNrYWdlTmFtZSgpKSk7CisgICAgICAgIG1XZWJWaWV3LmdldFNldHRpbmdzKCkuc2V0SmF2YVNjcmlwdEVuYWJsZWQodHJ1ZSk7CisgICAgICAgIG1XZWJWaWV3LnNldFdlYlZpZXdDbGllbnQobmV3IFdlYlZpZXdDbGllbnQoKSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIHNob3VsZE92ZXJyaWRlVXJsTG9hZGluZyhXZWJWaWV3IHZpZXcsIFN0cmluZyB1cmwpIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBVUkwgbmV3T3JpZ2luID0gbmV3IFVSTCh1cmwpOworICAgICAgICAgICAgICAgICAgICBpZiAoYXJlU2FtZU9yaWdpbihtQmFzZVVybCwgbmV3T3JpZ2luKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWYgc2ltcGxlIHNhbWUgb3JpZ2luIHRlc3QgcGFzc2VzLCBsb2FkIGluIHRoZSB3ZWJ2aWV3LgorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBjYXRjaChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICAvLyBEb24ndCBsb2FkIGFueXRoaW5nIGlmIHRoaXMgd2Fzbid0IGEgcHJvcGVyIFVSTC4KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLy8gT3RoZXJ3aXNlIHRoaXMgaXMgYSBVUkwgdGhhdCBpcyBub3Qgc2FtZSBvcmlnaW4gc28gcGFzcyBpdCB0byB0aGUKKyAgICAgICAgICAgICAgICAvLyBCcm93c2VyIHRvIGxvYWQuCisgICAgICAgICAgICAgICAgc3RhcnRBY3Rpdml0eShuZXcgSW50ZW50KEludGVudC5BQ1RJT05fVklFVywgVXJpLnBhcnNlKHVybCkpKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBvblBhZ2VGaW5pc2hlZChXZWJWaWV3IHZpZXcsIFN0cmluZyB1cmwpIHsKKyAgICAgICAgICAgICAgICBpZiAobVNwbGFzaFNjcmVlbiAhPSBudWxsICYmIG1TcGxhc2hTY3JlZW4uZ2V0VmlzaWJpbGl0eSgpID09IFZpZXcuVklTSUJMRSkgeworICAgICAgICAgICAgICAgICAgICBtU3BsYXNoU2NyZWVuLnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKKyAgICAgICAgICAgICAgICAgICAgbVNwbGFzaFNjcmVlbiA9IG51bGw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9KTsKKworICAgICAgICAvLyBVc2UgYSBjdXN0b20gV2ViQ2hyb21lQ2xpZW50IHdpdGggZ2VvbG9jYXRpb24gcGVybWlzc2lvbnMgaGFuZGxpbmcuCisgICAgICAgIG1XZWJWaWV3LnNldFdlYkNocm9tZUNsaWVudChuZXcgV2ViQ2hyb21lQ2xpZW50KCkgeworICAgICAgICAgICAgcHVibGljIHZvaWQgb25HZW9sb2NhdGlvblBlcm1pc3Npb25zU2hvd1Byb21wdCgKKyAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBvcmlnaW4sIEdlb2xvY2F0aW9uUGVybWlzc2lvbnMuQ2FsbGJhY2sgY2FsbGJhY2spIHsKKyAgICAgICAgICAgICAgICAvLyBBbGxvdyB0aGlzIG9yaWdpbiBpZiBpdCBoYXMgR2VvbG9jYXRpb24gcGVybWlzc2lvbnMsIG90aGVyd2lzZSBkZW55LgorICAgICAgICAgICAgICAgIGJvb2xlYW4gYWxsb3dlZCA9IGZhbHNlOworICAgICAgICAgICAgICAgIGlmIChzZW5zaXRpdmVGZWF0dXJlcy5nZXRHZW9sb2NhdGlvbigpKSB7CisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICBVUkwgb3JpZ2luVXJsID0gbmV3IFVSTChvcmlnaW4pOworICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dlZCA9IGFyZVNhbWVPcmlnaW4obUJhc2VVcmwsIG9yaWdpblVybCk7CisgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2goTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjYWxsYmFjay5pbnZva2Uob3JpZ2luLCBhbGxvd2VkLCBmYWxzZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworCisgICAgICAgIC8vIFNldCB0aGUgREIgbG9jYXRpb24uIE9wdGlvbmFsLiBHZW9sb2NhdGlvbiB3b3JrcyB3aXRob3V0IERCcy4KKyAgICAgICAgbVdlYlZpZXcuZ2V0U2V0dGluZ3MoKS5zZXRHZW9sb2NhdGlvbkRhdGFiYXNlUGF0aCgKKyAgICAgICAgICAgICAgICBnZXREaXIoImdlb2xvY2F0aW9uIiwgTU9ERV9QUklWQVRFKS5nZXRQYXRoKCkpOworCisgICAgICAgIFN0cmluZyB0aXRsZSA9IG1ldGFEYXRhLmdldFN0cmluZygiYW5kcm9pZC53ZWJydW50aW1lLnRpdGxlIik7CisgICAgICAgIC8vIFdlIHR1cm5lZCBvZmYgdGhlIHRpdGxlIGJhciB0byBnbyBmdWxsIHNjcmVlbiBzbyBkaXNwbGF5IHRoZQorICAgICAgICAvLyB3ZWJhcHAncyB0aXRsZSBhcyBhIHRvYXN0LgorICAgICAgICBpZiAodGl0bGUgIT0gbnVsbCkgeworICAgICAgICAgICAgVG9hc3QubWFrZVRleHQodGhpcywgdGl0bGUsIFRvYXN0LkxFTkdUSF9TSE9SVCkuc2hvdygpOworICAgICAgICB9CisKKyAgICAgICAgLy8gTG9hZCB0aGUgd2ViYXBwJ3MgYmFzZSBVUkwuCisgICAgICAgIG1XZWJWaWV3LmxvYWRVcmwodXJsKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBvbktleURvd24oaW50IGtleUNvZGUsIEtleUV2ZW50IGV2ZW50KSB7CisgICAgICAgIGlmIChrZXlDb2RlID09IEtleUV2ZW50LktFWUNPREVfQkFDSyAmJiBtV2ViVmlldy5jYW5Hb0JhY2soKSkgeworICAgICAgICAgICAgbVdlYlZpZXcuZ29CYWNrKCk7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc3VwZXIub25LZXlEb3duKGtleUNvZGUsIGV2ZW50KTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBvbkNyZWF0ZU9wdGlvbnNNZW51KE1lbnUgbWVudSkgeworICAgICAgICBtZW51LmFkZCgwLCAwLCAwLCAiTWVudSBpdGVtIDEiKTsKKyAgICAgICAgbWVudS5hZGQoMCwgMSwgMCwgIk1lbnUgaXRlbSAyIik7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gYXJlU2FtZU9yaWdpbihVUkwgYSwgVVJMIGIpIHsKKyAgICAgICAgaW50IGFQb3J0ID0gYS5nZXRQb3J0KCkgPT0gLTEgPyBhLmdldERlZmF1bHRQb3J0KCkgOiBhLmdldFBvcnQoKTsKKyAgICAgICAgaW50IGJQb3J0ID0gYi5nZXRQb3J0KCkgPT0gLTEgPyBiLmdldERlZmF1bHRQb3J0KCkgOiBiLmdldFBvcnQoKTsKKyAgICAgICAgcmV0dXJuIGEuZ2V0UHJvdG9jb2woKS5lcXVhbHMoYi5nZXRQcm90b2NvbCgpKSAmJiBhUG9ydCA9PSBiUG9ydCAmJiBhLmdldEhvc3QoKS5lcXVhbHMoYi5nZXRIb3N0KCkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9BYnNMaXN0Vmlldy5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L0Fic0xpc3RWaWV3LmphdmEKaW5kZXggOGY1YzM1ZS4uZjNkZmI3NyAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L0Fic0xpc3RWaWV3LmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L0Fic0xpc3RWaWV3LmphdmEKQEAgLTE5LDcgKzE5LDcgQEAKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC5SOwogCiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5SZXNvdXJjZXM7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlR5cGVkQXJyYXk7CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5DYW52YXM7CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5SZWN0OwpAQCAtMzQsMTEgKzM0LDE2IEBACiBpbXBvcnQgYW5kcm9pZC50ZXh0LlRleHRXYXRjaGVyOwogaW1wb3J0IGFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQ7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9uZ1NwYXJzZUFycmF5OworaW1wb3J0IGFuZHJvaWQudXRpbC5TcGFyc2VCb29sZWFuQXJyYXk7CitpbXBvcnQgYW5kcm9pZC52aWV3LkFjdGlvbk1vZGU7CiBpbXBvcnQgYW5kcm9pZC52aWV3LkNvbnRleHRNZW51LkNvbnRleHRNZW51SW5mbzsKIGltcG9ydCBhbmRyb2lkLnZpZXcuR3Jhdml0eTsKIGltcG9ydCBhbmRyb2lkLnZpZXcuSGFwdGljRmVlZGJhY2tDb25zdGFudHM7CiBpbXBvcnQgYW5kcm9pZC52aWV3LktleUV2ZW50OwogaW1wb3J0IGFuZHJvaWQudmlldy5MYXlvdXRJbmZsYXRlcjsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuTWVudTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuTWVudUl0ZW07CiBpbXBvcnQgYW5kcm9pZC52aWV3Lk1vdGlvbkV2ZW50OwogaW1wb3J0IGFuZHJvaWQudmlldy5WZWxvY2l0eVRyYWNrZXI7CiBpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CkBAIC00Niw3ICs1MSw2IEBACiBpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXdEZWJ1ZzsKIGltcG9ydCBhbmRyb2lkLnZpZXcuVmlld0dyb3VwOwogaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3VHJlZU9ic2VydmVyOwotaW1wb3J0IGFuZHJvaWQudmlldy5hbmltYXRpb24uQW5pbWF0aW9uVXRpbHM7CiBpbXBvcnQgYW5kcm9pZC52aWV3LmlucHV0bWV0aG9kLkJhc2VJbnB1dENvbm5lY3Rpb247CiBpbXBvcnQgYW5kcm9pZC52aWV3LmlucHV0bWV0aG9kLkVkaXRvckluZm87CiBpbXBvcnQgYW5kcm9pZC52aWV3LmlucHV0bWV0aG9kLklucHV0Q29ubmVjdGlvbjsKQEAgLTcwLDEwICs3NCwxMiBAQAogICogQGF0dHIgcmVmIGFuZHJvaWQuUi5zdHlsZWFibGUjQWJzTGlzdFZpZXdfY2FjaGVDb2xvckhpbnQKICAqIEBhdHRyIHJlZiBhbmRyb2lkLlIuc3R5bGVhYmxlI0Fic0xpc3RWaWV3X2Zhc3RTY3JvbGxFbmFibGVkCiAgKiBAYXR0ciByZWYgYW5kcm9pZC5SLnN0eWxlYWJsZSNBYnNMaXN0Vmlld19zbW9vdGhTY3JvbGxiYXIKKyAqIEBhdHRyIHJlZiBhbmRyb2lkLlIuc3R5bGVhYmxlI0Fic0xpc3RWaWV3X2Nob2ljZU1vZGUKICAqLwogcHVibGljIGFic3RyYWN0IGNsYXNzIEFic0xpc3RWaWV3IGV4dGVuZHMgQWRhcHRlclZpZXc8TGlzdEFkYXB0ZXI+IGltcGxlbWVudHMgVGV4dFdhdGNoZXIsCiAgICAgICAgIFZpZXdUcmVlT2JzZXJ2ZXIuT25HbG9iYWxMYXlvdXRMaXN0ZW5lciwgRmlsdGVyLkZpbHRlckxpc3RlbmVyLAotICAgICAgICBWaWV3VHJlZU9ic2VydmVyLk9uVG91Y2hNb2RlQ2hhbmdlTGlzdGVuZXIgeworICAgICAgICBWaWV3VHJlZU9ic2VydmVyLk9uVG91Y2hNb2RlQ2hhbmdlTGlzdGVuZXIsCisgICAgICAgIFJlbW90ZVZpZXdzQWRhcHRlci5SZW1vdGVBZGFwdGVyQ29ubmVjdGlvbkNhbGxiYWNrIHsKIAogICAgIC8qKgogICAgICAqIERpc2FibGVzIHRoZSB0cmFuc2NyaXB0IG1vZGUuCkBAIC0xMzAsMTcgKzEzNiw2IEBACiAgICAgc3RhdGljIGZpbmFsIGludCBUT1VDSF9NT0RFX0ZMSU5HID0gNDsKIAogICAgIC8qKgotICAgICAqIEluZGljYXRlcyB0aGUgdG91Y2ggZ2VzdHVyZSBpcyBhbiBvdmVyc2Nyb2xsIC0gYSBzY3JvbGwgYmV5b25kIHRoZSBiZWdpbm5pbmcgb3IgZW5kLgotICAgICAqLwotICAgIHN0YXRpYyBmaW5hbCBpbnQgVE9VQ0hfTU9ERV9PVkVSU0NST0xMID0gNTsKLQotICAgIC8qKgotICAgICAqIEluZGljYXRlcyB0aGUgdmlldyBpcyBiZWluZyBmbHVuZyBvdXRzaWRlIG9mIG5vcm1hbCBjb250ZW50IGJvdW5kcwotICAgICAqIGFuZCB3aWxsIHNwcmluZyBiYWNrLgotICAgICAqLwotICAgIHN0YXRpYyBmaW5hbCBpbnQgVE9VQ0hfTU9ERV9PVkVSRkxJTkcgPSA2OwotCi0gICAgLyoqCiAgICAgICogUmVndWxhciBsYXlvdXQgLSB1c3VhbGx5IGFuIHVuc29saWNpdGVkIGxheW91dCBmcm9tIHRoZSB2aWV3IHN5c3RlbQogICAgICAqLwogICAgIHN0YXRpYyBmaW5hbCBpbnQgTEFZT1VUX05PUk1BTCA9IDA7CkBAIC0xNzgsNiArMTczLDU3IEBACiAgICAgc3RhdGljIGZpbmFsIGludCBMQVlPVVRfTU9WRV9TRUxFQ1RJT04gPSA2OwogCiAgICAgLyoqCisgICAgICogTm9ybWFsIGxpc3QgdGhhdCBkb2VzIG5vdCBpbmRpY2F0ZSBjaG9pY2VzCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ0hPSUNFX01PREVfTk9ORSA9IDA7CisKKyAgICAvKioKKyAgICAgKiBUaGUgbGlzdCBhbGxvd3MgdXAgdG8gb25lIGNob2ljZQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENIT0lDRV9NT0RFX1NJTkdMRSA9IDE7CisKKyAgICAvKioKKyAgICAgKiBUaGUgbGlzdCBhbGxvd3MgbXVsdGlwbGUgY2hvaWNlcworICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENIT0lDRV9NT0RFX01VTFRJUExFID0gMjsKKworICAgIC8qKgorICAgICAqIFRoZSBsaXN0IGFsbG93cyBtdWx0aXBsZSBjaG9pY2VzIGluIGEgbW9kYWwgc2VsZWN0aW9uIG1vZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDSE9JQ0VfTU9ERV9NVUxUSVBMRV9NT0RBTCA9IDM7CisKKyAgICAvKioKKyAgICAgKiBDb250cm9scyBpZi9ob3cgdGhlIHVzZXIgbWF5IGNob29zZS9jaGVjayBpdGVtcyBpbiB0aGUgbGlzdAorICAgICAqLworICAgIGludCBtQ2hvaWNlTW9kZSA9IENIT0lDRV9NT0RFX05PTkU7CisKKyAgICAvKioKKyAgICAgKiBDb250cm9scyBDSE9JQ0VfTU9ERV9NVUxUSVBMRV9NT0RBTC4gbnVsbCB3aGVuIGluYWN0aXZlLgorICAgICAqLworICAgIEFjdGlvbk1vZGUgbUNob2ljZUFjdGlvbk1vZGU7CisKKyAgICAvKioKKyAgICAgKiBXcmFwcGVyIGZvciB0aGUgbXVsdGlwbGUgY2hvaWNlIG1vZGUgY2FsbGJhY2s7IEFic0xpc3RWaWV3IG5lZWRzIHRvIHBlcmZvcm0KKyAgICAgKiBhIGZldyBleHRyYSBhY3Rpb25zIGFyb3VuZCB3aGF0IGFwcGxpY2F0aW9uIGNvZGUgZG9lcy4KKyAgICAgKi8KKyAgICBNdWx0aUNob2ljZU1vZGVXcmFwcGVyIG1NdWx0aUNob2ljZU1vZGVDYWxsYmFjazsKKworICAgIC8qKgorICAgICAqIFJ1bm5pbmcgY291bnQgb2YgaG93IG1hbnkgaXRlbXMgYXJlIGN1cnJlbnRseSBjaGVja2VkCisgICAgICovCisgICAgaW50IG1DaGVja2VkSXRlbUNvdW50OworCisgICAgLyoqCisgICAgICogUnVubmluZyBzdGF0ZSBvZiB3aGljaCBwb3NpdGlvbnMgYXJlIGN1cnJlbnRseSBjaGVja2VkCisgICAgICovCisgICAgU3BhcnNlQm9vbGVhbkFycmF5IG1DaGVja1N0YXRlczsKKworICAgIC8qKgorICAgICAqIFJ1bm5pbmcgc3RhdGUgb2Ygd2hpY2ggSURzIGFyZSBjdXJyZW50bHkgY2hlY2tlZAorICAgICAqLworICAgIExvbmdTcGFyc2VBcnJheTxCb29sZWFuPiBtQ2hlY2tlZElkU3RhdGVzOworCisgICAgLyoqCiAgICAgICogQ29udHJvbHMgaG93IHRoZSBuZXh0IGxheW91dCB3aWxsIGhhcHBlbgogICAgICAqLwogICAgIGludCBtTGF5b3V0TW9kZSA9IExBWU9VVF9OT1JNQUw7CkBAIC0xOTMsNiArMjM5LDExIEBACiAgICAgTGlzdEFkYXB0ZXIgbUFkYXB0ZXI7CiAKICAgICAvKioKKyAgICAgKiBUaGUgcmVtb3RlIGFkYXB0ZXIgY29udGFpbmluZyB0aGUgZGF0YSB0byBiZSBkaXNwbGF5ZWQgYnkgdGhpcyB2aWV3IHRvIGJlIHNldAorICAgICAqLworICAgIHByaXZhdGUgUmVtb3RlVmlld3NBZGFwdGVyIG1SZW1vdGVBZGFwdGVyOworCisgICAgLyoqCiAgICAgICogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIGxpc3Qgc2VsZWN0b3Igc2hvdWxkIGJlIGRyYXduIG9uIHRvcCBvZiB0aGUgY2hpbGRyZW4gb3IgYmVoaW5kCiAgICAgICovCiAgICAgYm9vbGVhbiBtRHJhd1NlbGVjdG9yT25Ub3AgPSBmYWxzZTsKQEAgLTM4MiwxNiArNDMzLDYgQEAKICAgICBwcml2YXRlIENvbnRleHRNZW51SW5mbyBtQ29udGV4dE1lbnVJbmZvID0gbnVsbDsKICAgICAKICAgICAvKioKLSAgICAgKiBNYXhpbXVtIGRpc3RhbmNlIHRvIHJlY29yZCBvdmVyc2Nyb2xsCi0gICAgICovCi0gICAgaW50IG1PdmVyc2Nyb2xsTWF4OwotCi0gICAgLyoqCi0gICAgICogQ29udGVudCBoZWlnaHQgZGl2aWRlZCBieSB0aGlzIGlzIHRoZSBvdmVyc2Nyb2xsIGxpbWl0LgotICAgICAqLwotICAgIHN0YXRpYyBmaW5hbCBpbnQgT1ZFUlNDUk9MTF9MSU1JVF9ESVZJU09SID0gMzsKLQotICAgIC8qKgogICAgICAqIFVzZWQgdG8gcmVxdWVzdCBhIGxheW91dCB3aGVuIHdlIGNoYW5nZWQgdG91Y2ggbW9kZQogICAgICAqLwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBUT1VDSF9NT0RFX1VOS05PV04gPSAtMTsKQEAgLTQ4NCw0MyArNTI1LDYgQEAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgSU5WQUxJRF9QT0lOVEVSID0gLTE7CiAKICAgICAvKioKLSAgICAgKiBNYXhpbXVtIGRpc3RhbmNlIHRvIG92ZXJzY3JvbGwgYnkgZHVyaW5nIGVkZ2UgZWZmZWN0cwotICAgICAqLwotICAgIGludCBtT3ZlcnNjcm9sbERpc3RhbmNlOwotCi0gICAgLyoqCi0gICAgICogTWF4aW11bSBkaXN0YW5jZSB0byBvdmVyZmxpbmcgZHVyaW5nIGVkZ2UgZWZmZWN0cwotICAgICAqLwotICAgIGludCBtT3ZlcmZsaW5nRGlzdGFuY2U7Ci0KLSAgICAvLyBUaGVzZSB0d28gRWRnZUdsb3dzIGFyZSBhbHdheXMgc2V0IGFuZCB1c2VkIHRvZ2V0aGVyLgotICAgIC8vIENoZWNraW5nIG9uZSBmb3IgbnVsbCBpcyBhcyBnb29kIGFzIGNoZWNraW5nIGJvdGguCi0KLSAgICAvKioKLSAgICAgKiBUcmFja3MgdGhlIHN0YXRlIG9mIHRoZSB0b3AgZWRnZSBnbG93LgotICAgICAqLwotICAgIHByaXZhdGUgRWRnZUdsb3cgbUVkZ2VHbG93VG9wOwotCi0gICAgLyoqCi0gICAgICogVHJhY2tzIHRoZSBzdGF0ZSBvZiB0aGUgYm90dG9tIGVkZ2UgZ2xvdy4KLSAgICAgKi8KLSAgICBwcml2YXRlIEVkZ2VHbG93IG1FZGdlR2xvd0JvdHRvbTsKLQotICAgIC8qKgotICAgICAqIEFuIGVzdGltYXRlIG9mIGhvdyBtYW55IHBpeGVscyBhcmUgYmV0d2VlbiB0aGUgdG9wIG9mIHRoZSBsaXN0IGFuZAotICAgICAqIHRoZSB0b3Agb2YgdGhlIGZpcnN0IHBvc2l0aW9uIGluIHRoZSBhZGFwdGVyLCBiYXNlZCBvbiB0aGUgbGFzdCB0aW1lCi0gICAgICogd2Ugc2F3IGl0LiBVc2VkIHRvIGhpbnQgd2hlcmUgdG8gZHJhdyBlZGdlIGdsb3dzLgotICAgICAqLwotICAgIHByaXZhdGUgaW50IG1GaXJzdFBvc2l0aW9uRGlzdGFuY2VHdWVzczsKLQotICAgIC8qKgotICAgICAqIEFuIGVzdGltYXRlIG9mIGhvdyBtYW55IHBpeGVscyBhcmUgYmV0d2VlbiB0aGUgYm90dG9tIG9mIHRoZSBsaXN0IGFuZAotICAgICAqIHRoZSBib3R0b20gb2YgdGhlIGxhc3QgcG9zaXRpb24gaW4gdGhlIGFkYXB0ZXIsIGJhc2VkIG9uIHRoZSBsYXN0IHRpbWUKLSAgICAgKiB3ZSBzYXcgaXQuIFVzZWQgdG8gaGludCB3aGVyZSB0byBkcmF3IGVkZ2UgZ2xvd3MuCi0gICAgICovCi0gICAgcHJpdmF0ZSBpbnQgbUxhc3RQb3NpdGlvbkRpc3RhbmNlR3Vlc3M7Ci0KLSAgICAvKioKICAgICAgKiBJbnRlcmZhY2UgZGVmaW5pdGlvbiBmb3IgYSBjYWxsYmFjayB0byBiZSBpbnZva2VkIHdoZW4gdGhlIGxpc3Qgb3IgZ3JpZAogICAgICAqIGhhcyBiZWVuIHNjcm9sbGVkLgogICAgICAqLwpAQCAtNjE5LDYgKzYyMywxOCBAQAogCiAgICAgICAgIGJvb2xlYW4gc21vb3RoU2Nyb2xsYmFyID0gYS5nZXRCb29sZWFuKFIuc3R5bGVhYmxlLkFic0xpc3RWaWV3X3Ntb290aFNjcm9sbGJhciwgdHJ1ZSk7CiAgICAgICAgIHNldFNtb290aFNjcm9sbGJhckVuYWJsZWQoc21vb3RoU2Nyb2xsYmFyKTsKKyAgICAgICAgCisgICAgICAgIGZpbmFsIGludCBhZGFwdGVySWQgPSBhLmdldFJlc291cmNlSWQoUi5zdHlsZWFibGUuQWJzTGlzdFZpZXdfYWRhcHRlciwgMCk7CisgICAgICAgIGlmIChhZGFwdGVySWQgIT0gMCkgeworICAgICAgICAgICAgZmluYWwgQ29udGV4dCBjID0gY29udGV4dDsKKyAgICAgICAgICAgIHBvc3QobmV3IFJ1bm5hYmxlKCkgeworICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICAgICAgc2V0QWRhcHRlcihBZGFwdGVycy5sb2FkQWRhcHRlcihjLCBhZGFwdGVySWQpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKyAgICAgICAgfQorCisgICAgICAgIHNldENob2ljZU1vZGUoYS5nZXRJbnQoUi5zdHlsZWFibGUuQWJzTGlzdFZpZXdfY2hvaWNlTW9kZSwgQ0hPSUNFX01PREVfTk9ORSkpOwogCiAgICAgICAgIGEucmVjeWNsZSgpOwogICAgIH0KQEAgLTYzNSwzOSArNjUxLDMxMiBAQAogICAgICAgICBtVG91Y2hTbG9wID0gY29uZmlndXJhdGlvbi5nZXRTY2FsZWRUb3VjaFNsb3AoKTsKICAgICAgICAgbU1pbmltdW1WZWxvY2l0eSA9IGNvbmZpZ3VyYXRpb24uZ2V0U2NhbGVkTWluaW11bUZsaW5nVmVsb2NpdHkoKTsKICAgICAgICAgbU1heGltdW1WZWxvY2l0eSA9IGNvbmZpZ3VyYXRpb24uZ2V0U2NhbGVkTWF4aW11bUZsaW5nVmVsb2NpdHkoKTsKLSAgICAgICAgbU92ZXJzY3JvbGxEaXN0YW5jZSA9IGNvbmZpZ3VyYXRpb24uZ2V0U2NhbGVkT3ZlcnNjcm9sbERpc3RhbmNlKCk7Ci0gICAgICAgIG1PdmVyZmxpbmdEaXN0YW5jZSA9IGNvbmZpZ3VyYXRpb24uZ2V0U2NhbGVkT3ZlcmZsaW5nRGlzdGFuY2UoKTsKLQogICAgICAgICBtRGVuc2l0eVNjYWxlID0gZ2V0Q29udGV4dCgpLmdldFJlc291cmNlcygpLmdldERpc3BsYXlNZXRyaWNzKCkuZGVuc2l0eTsKICAgICB9CiAKKyAgICAvKioKKyAgICAgKiB7QGluaGVyaXREb2N9CisgICAgICovCiAgICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2V0T3ZlcnNjcm9sbE1vZGUoaW50IG1vZGUpIHsKLSAgICAgICAgaWYgKG1vZGUgIT0gT1ZFUlNDUk9MTF9ORVZFUikgewotICAgICAgICAgICAgaWYgKG1FZGdlR2xvd1RvcCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgZmluYWwgUmVzb3VyY2VzIHJlcyA9IGdldENvbnRleHQoKS5nZXRSZXNvdXJjZXMoKTsKLSAgICAgICAgICAgICAgICBmaW5hbCBEcmF3YWJsZSBlZGdlID0gcmVzLmdldERyYXdhYmxlKFIuZHJhd2FibGUub3ZlcnNjcm9sbF9lZGdlKTsKLSAgICAgICAgICAgICAgICBmaW5hbCBEcmF3YWJsZSBnbG93ID0gcmVzLmdldERyYXdhYmxlKFIuZHJhd2FibGUub3ZlcnNjcm9sbF9nbG93KTsKLSAgICAgICAgICAgICAgICBtRWRnZUdsb3dUb3AgPSBuZXcgRWRnZUdsb3coZWRnZSwgZ2xvdyk7Ci0gICAgICAgICAgICAgICAgbUVkZ2VHbG93Qm90dG9tID0gbmV3IEVkZ2VHbG93KGVkZ2UsIGdsb3cpOworICAgIHB1YmxpYyB2b2lkIHNldEFkYXB0ZXIoTGlzdEFkYXB0ZXIgYWRhcHRlcikgeworICAgICAgICBpZiAoYWRhcHRlciAhPSBudWxsKSB7CisgICAgICAgICAgICBpZiAobUNob2ljZU1vZGUgIT0gQ0hPSUNFX01PREVfTk9ORSAmJiBtQWRhcHRlci5oYXNTdGFibGVJZHMoKSAmJgorICAgICAgICAgICAgICAgICAgICBtQ2hlY2tlZElkU3RhdGVzID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBtQ2hlY2tlZElkU3RhdGVzID0gbmV3IExvbmdTcGFyc2VBcnJheTxCb29sZWFuPigpOwogICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbUVkZ2VHbG93VG9wID0gbnVsbDsKLSAgICAgICAgICAgIG1FZGdlR2xvd0JvdHRvbSA9IG51bGw7CiAgICAgICAgIH0KLSAgICAgICAgc3VwZXIuc2V0T3ZlcnNjcm9sbE1vZGUobW9kZSk7CisKKyAgICAgICAgaWYgKG1DaGVja1N0YXRlcyAhPSBudWxsKSB7CisgICAgICAgICAgICBtQ2hlY2tTdGF0ZXMuY2xlYXIoKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChtQ2hlY2tlZElkU3RhdGVzICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1DaGVja2VkSWRTdGF0ZXMuY2xlYXIoKTsKKyAgICAgICAgfQogICAgIH0KIAogICAgIC8qKgotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiBhbGwgbGlzdCBjb250ZW50IGN1cnJlbnRseSBmaXRzIHdpdGhpbiB0aGUgdmlldyBib3VuZGFyaWVzCisgICAgICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIGl0ZW1zIGN1cnJlbnRseSBzZWxlY3RlZC4gVGhpcyB3aWxsIG9ubHkgYmUgdmFsaWQKKyAgICAgKiBpZiB0aGUgY2hvaWNlIG1vZGUgaXMgbm90IHtAbGluayAjQ0hPSUNFX01PREVfTk9ORX0gKGRlZmF1bHQpLgorICAgICAqCisgICAgICogPHA+VG8gZGV0ZXJtaW5lIHRoZSBzcGVjaWZpYyBpdGVtcyB0aGF0IGFyZSBjdXJyZW50bHkgc2VsZWN0ZWQsIHVzZSBvbmUgb2YKKyAgICAgKiB0aGUgPGNvZGU+Z2V0Q2hlY2tlZCo8L2NvZGU+IG1ldGhvZHMuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFRoZSBudW1iZXIgb2YgaXRlbXMgY3VycmVudGx5IHNlbGVjdGVkCisgICAgICoKKyAgICAgKiBAc2VlICNnZXRDaGVja2VkSXRlbVBvc2l0aW9uKCkKKyAgICAgKiBAc2VlICNnZXRDaGVja2VkSXRlbVBvc2l0aW9ucygpCisgICAgICogQHNlZSAjZ2V0Q2hlY2tlZEl0ZW1JZHMoKQogICAgICAqLwotICAgIHByaXZhdGUgYm9vbGVhbiBjb250ZW50Rml0cygpIHsKLSAgICAgICAgZmluYWwgaW50IGNoaWxkQ291bnQgPSBnZXRDaGlsZENvdW50KCk7Ci0gICAgICAgIGlmIChjaGlsZENvdW50ICE9IG1JdGVtQ291bnQpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICBwdWJsaWMgaW50IGdldENoZWNrZWRJdGVtQ291bnQoKSB7CisgICAgICAgIHJldHVybiBtQ2hlY2tlZEl0ZW1Db3VudDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBjaGVja2VkIHN0YXRlIG9mIHRoZSBzcGVjaWZpZWQgcG9zaXRpb24uIFRoZSByZXN1bHQgaXMgb25seQorICAgICAqIHZhbGlkIGlmIHRoZSBjaG9pY2UgbW9kZSBoYXMgYmVlbiBzZXQgdG8ge0BsaW5rICNDSE9JQ0VfTU9ERV9TSU5HTEV9CisgICAgICogb3Ige0BsaW5rICNDSE9JQ0VfTU9ERV9NVUxUSVBMRX0uCisgICAgICoKKyAgICAgKiBAcGFyYW0gcG9zaXRpb24gVGhlIGl0ZW0gd2hvc2UgY2hlY2tlZCBzdGF0ZSB0byByZXR1cm4KKyAgICAgKiBAcmV0dXJuIFRoZSBpdGVtJ3MgY2hlY2tlZCBzdGF0ZSBvciA8Y29kZT5mYWxzZTwvY29kZT4gaWYgY2hvaWNlIG1vZGUKKyAgICAgKiAgICAgICAgIGlzIGludmFsaWQKKyAgICAgKgorICAgICAqIEBzZWUgI3NldENob2ljZU1vZGUoaW50KQorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzSXRlbUNoZWNrZWQoaW50IHBvc2l0aW9uKSB7CisgICAgICAgIGlmIChtQ2hvaWNlTW9kZSAhPSBDSE9JQ0VfTU9ERV9OT05FICYmIG1DaGVja1N0YXRlcyAhPSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gbUNoZWNrU3RhdGVzLmdldChwb3NpdGlvbik7CiAgICAgICAgIH0KIAotICAgICAgICByZXR1cm4gZ2V0Q2hpbGRBdCgwKS5nZXRUb3AoKSA+PSAwICYmIGdldENoaWxkQXQoY2hpbGRDb3VudCAtIDEpLmdldEJvdHRvbSgpIDw9IG1Cb3R0b207CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBjdXJyZW50bHkgY2hlY2tlZCBpdGVtLiBUaGUgcmVzdWx0IGlzIG9ubHkgdmFsaWQgaWYgdGhlIGNob2ljZQorICAgICAqIG1vZGUgaGFzIGJlZW4gc2V0IHRvIHtAbGluayAjQ0hPSUNFX01PREVfU0lOR0xFfS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gVGhlIHBvc2l0aW9uIG9mIHRoZSBjdXJyZW50bHkgY2hlY2tlZCBpdGVtIG9yCisgICAgICogICAgICAgICB7QGxpbmsgI0lOVkFMSURfUE9TSVRJT059IGlmIG5vdGhpbmcgaXMgc2VsZWN0ZWQKKyAgICAgKgorICAgICAqIEBzZWUgI3NldENob2ljZU1vZGUoaW50KQorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0Q2hlY2tlZEl0ZW1Qb3NpdGlvbigpIHsKKyAgICAgICAgaWYgKG1DaG9pY2VNb2RlID09IENIT0lDRV9NT0RFX1NJTkdMRSAmJiBtQ2hlY2tTdGF0ZXMgIT0gbnVsbCAmJiBtQ2hlY2tTdGF0ZXMuc2l6ZSgpID09IDEpIHsKKyAgICAgICAgICAgIHJldHVybiBtQ2hlY2tTdGF0ZXMua2V5QXQoMCk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gSU5WQUxJRF9QT1NJVElPTjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBzZXQgb2YgY2hlY2tlZCBpdGVtcyBpbiB0aGUgbGlzdC4gVGhlIHJlc3VsdCBpcyBvbmx5IHZhbGlkIGlmCisgICAgICogdGhlIGNob2ljZSBtb2RlIGhhcyBub3QgYmVlbiBzZXQgdG8ge0BsaW5rICNDSE9JQ0VfTU9ERV9OT05FfS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gIEEgU3BhcnNlQm9vbGVhbkFycmF5IHdoaWNoIHdpbGwgcmV0dXJuIHRydWUgZm9yIGVhY2ggY2FsbCB0bworICAgICAqICAgICAgICAgIGdldChpbnQgcG9zaXRpb24pIHdoZXJlIHBvc2l0aW9uIGlzIGEgcG9zaXRpb24gaW4gdGhlIGxpc3QsCisgICAgICogICAgICAgICAgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIGNob2ljZSBtb2RlIGlzIHNldCB0bworICAgICAqICAgICAgICAgIHtAbGluayAjQ0hPSUNFX01PREVfTk9ORX0uCisgICAgICovCisgICAgcHVibGljIFNwYXJzZUJvb2xlYW5BcnJheSBnZXRDaGVja2VkSXRlbVBvc2l0aW9ucygpIHsKKyAgICAgICAgaWYgKG1DaG9pY2VNb2RlICE9IENIT0lDRV9NT0RFX05PTkUpIHsKKyAgICAgICAgICAgIHJldHVybiBtQ2hlY2tTdGF0ZXM7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgc2V0IG9mIGNoZWNrZWQgaXRlbXMgaWRzLiBUaGUgcmVzdWx0IGlzIG9ubHkgdmFsaWQgaWYgdGhlCisgICAgICogY2hvaWNlIG1vZGUgaGFzIG5vdCBiZWVuIHNldCB0byB7QGxpbmsgI0NIT0lDRV9NT0RFX05PTkV9IGFuZCB0aGUgYWRhcHRlcgorICAgICAqIGhhcyBzdGFibGUgSURzLiAoe0BsaW5rIExpc3RBZGFwdGVyI2hhc1N0YWJsZUlkcygpfSA9PSB7QGNvZGUgdHJ1ZX0pCisgICAgICoKKyAgICAgKiBAcmV0dXJuIEEgbmV3IGFycmF5IHdoaWNoIGNvbnRhaW5zIHRoZSBpZCBvZiBlYWNoIGNoZWNrZWQgaXRlbSBpbiB0aGUKKyAgICAgKiAgICAgICAgIGxpc3QuCisgICAgICovCisgICAgcHVibGljIGxvbmdbXSBnZXRDaGVja2VkSXRlbUlkcygpIHsKKyAgICAgICAgaWYgKG1DaG9pY2VNb2RlID09IENIT0lDRV9NT0RFX05PTkUgfHwgbUNoZWNrZWRJZFN0YXRlcyA9PSBudWxsIHx8IG1BZGFwdGVyID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgbG9uZ1swXTsKKyAgICAgICAgfQorCisgICAgICAgIGZpbmFsIExvbmdTcGFyc2VBcnJheTxCb29sZWFuPiBpZFN0YXRlcyA9IG1DaGVja2VkSWRTdGF0ZXM7CisgICAgICAgIGZpbmFsIGludCBjb3VudCA9IGlkU3RhdGVzLnNpemUoKTsKKyAgICAgICAgZmluYWwgbG9uZ1tdIGlkcyA9IG5ldyBsb25nW2NvdW50XTsKKworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKyAgICAgICAgICAgIGlkc1tpXSA9IGlkU3RhdGVzLmtleUF0KGkpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGlkczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDbGVhciBhbnkgY2hvaWNlcyBwcmV2aW91c2x5IHNldAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGNsZWFyQ2hvaWNlcygpIHsKKyAgICAgICAgaWYgKG1DaGVja1N0YXRlcyAhPSBudWxsKSB7CisgICAgICAgICAgICBtQ2hlY2tTdGF0ZXMuY2xlYXIoKTsKKyAgICAgICAgfQorICAgICAgICBpZiAobUNoZWNrZWRJZFN0YXRlcyAhPSBudWxsKSB7CisgICAgICAgICAgICBtQ2hlY2tlZElkU3RhdGVzLmNsZWFyKCk7CisgICAgICAgIH0KKyAgICAgICAgbUNoZWNrZWRJdGVtQ291bnQgPSAwOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIGNoZWNrZWQgc3RhdGUgb2YgdGhlIHNwZWNpZmllZCBwb3NpdGlvbi4gVGhlIGlzIG9ubHkgdmFsaWQgaWYKKyAgICAgKiB0aGUgY2hvaWNlIG1vZGUgaGFzIGJlZW4gc2V0IHRvIHtAbGluayAjQ0hPSUNFX01PREVfU0lOR0xFfSBvcgorICAgICAqIHtAbGluayAjQ0hPSUNFX01PREVfTVVMVElQTEV9LgorICAgICAqCisgICAgICogQHBhcmFtIHBvc2l0aW9uIFRoZSBpdGVtIHdob3NlIGNoZWNrZWQgc3RhdGUgaXMgdG8gYmUgY2hlY2tlZAorICAgICAqIEBwYXJhbSB2YWx1ZSBUaGUgbmV3IGNoZWNrZWQgc3RhdGUgZm9yIHRoZSBpdGVtCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0SXRlbUNoZWNrZWQoaW50IHBvc2l0aW9uLCBib29sZWFuIHZhbHVlKSB7CisgICAgICAgIGlmIChtQ2hvaWNlTW9kZSA9PSBDSE9JQ0VfTU9ERV9OT05FKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICAvLyBTdGFydCBzZWxlY3Rpb24gbW9kZSBpZiBuZWVkZWQuIFdlIGRvbid0IG5lZWQgdG8gaWYgd2UncmUgdW5jaGVja2luZyBzb21ldGhpbmcuCisgICAgICAgIGlmICh2YWx1ZSAmJiBtQ2hvaWNlTW9kZSA9PSBDSE9JQ0VfTU9ERV9NVUxUSVBMRV9NT0RBTCAmJiBtQ2hvaWNlQWN0aW9uTW9kZSA9PSBudWxsKSB7CisgICAgICAgICAgICBtQ2hvaWNlQWN0aW9uTW9kZSA9IHN0YXJ0QWN0aW9uTW9kZShtTXVsdGlDaG9pY2VNb2RlQ2FsbGJhY2spOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG1DaG9pY2VNb2RlID09IENIT0lDRV9NT0RFX01VTFRJUExFIHx8IG1DaG9pY2VNb2RlID09IENIT0lDRV9NT0RFX01VTFRJUExFX01PREFMKSB7CisgICAgICAgICAgICBib29sZWFuIG9sZFZhbHVlID0gbUNoZWNrU3RhdGVzLmdldChwb3NpdGlvbik7CisgICAgICAgICAgICBtQ2hlY2tTdGF0ZXMucHV0KHBvc2l0aW9uLCB2YWx1ZSk7CisgICAgICAgICAgICBpZiAobUNoZWNrZWRJZFN0YXRlcyAhPSBudWxsICYmIG1BZGFwdGVyLmhhc1N0YWJsZUlkcygpKSB7CisgICAgICAgICAgICAgICAgaWYgKHZhbHVlKSB7CisgICAgICAgICAgICAgICAgICAgIG1DaGVja2VkSWRTdGF0ZXMucHV0KG1BZGFwdGVyLmdldEl0ZW1JZChwb3NpdGlvbiksIEJvb2xlYW4uVFJVRSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgbUNoZWNrZWRJZFN0YXRlcy5kZWxldGUobUFkYXB0ZXIuZ2V0SXRlbUlkKHBvc2l0aW9uKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG9sZFZhbHVlICE9IHZhbHVlKSB7CisgICAgICAgICAgICAgICAgaWYgKHZhbHVlKSB7CisgICAgICAgICAgICAgICAgICAgIG1DaGVja2VkSXRlbUNvdW50Kys7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgbUNoZWNrZWRJdGVtQ291bnQtLTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobUNob2ljZUFjdGlvbk1vZGUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGZpbmFsIGxvbmcgaWQgPSBtQWRhcHRlci5nZXRJdGVtSWQocG9zaXRpb24pOworICAgICAgICAgICAgICAgIG1NdWx0aUNob2ljZU1vZGVDYWxsYmFjay5vbkl0ZW1DaGVja2VkU3RhdGVDaGFuZ2VkKG1DaG9pY2VBY3Rpb25Nb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgcG9zaXRpb24sIGlkLCB2YWx1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBib29sZWFuIHVwZGF0ZUlkcyA9IG1DaGVja2VkSWRTdGF0ZXMgIT0gbnVsbCAmJiBtQWRhcHRlci5oYXNTdGFibGVJZHMoKTsKKyAgICAgICAgICAgIC8vIENsZWFyIGFsbCB2YWx1ZXMgaWYgd2UncmUgY2hlY2tpbmcgc29tZXRoaW5nLCBvciB1bmNoZWNraW5nIHRoZSBjdXJyZW50bHkKKyAgICAgICAgICAgIC8vIHNlbGVjdGVkIGl0ZW0KKyAgICAgICAgICAgIGlmICh2YWx1ZSB8fCBpc0l0ZW1DaGVja2VkKHBvc2l0aW9uKSkgeworICAgICAgICAgICAgICAgIG1DaGVja1N0YXRlcy5jbGVhcigpOworICAgICAgICAgICAgICAgIGlmICh1cGRhdGVJZHMpIHsKKyAgICAgICAgICAgICAgICAgICAgbUNoZWNrZWRJZFN0YXRlcy5jbGVhcigpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIHRoaXMgbWF5IGVuZCB1cCBzZWxlY3RpbmcgdGhlIHZhbHVlIHdlIGp1c3QgY2xlYXJlZCBidXQgdGhpcyB3YXkKKyAgICAgICAgICAgIC8vIHdlIGVuc3VyZSBsZW5ndGggb2YgbUNoZWNrU3RhdGVzIGlzIDEsIGEgZmFjdCBnZXRDaGVja2VkSXRlbVBvc2l0aW9uIHJlbGllcyBvbgorICAgICAgICAgICAgaWYgKHZhbHVlKSB7CisgICAgICAgICAgICAgICAgbUNoZWNrU3RhdGVzLnB1dChwb3NpdGlvbiwgdHJ1ZSk7CisgICAgICAgICAgICAgICAgaWYgKHVwZGF0ZUlkcykgeworICAgICAgICAgICAgICAgICAgICBtQ2hlY2tlZElkU3RhdGVzLnB1dChtQWRhcHRlci5nZXRJdGVtSWQocG9zaXRpb24pLCBCb29sZWFuLlRSVUUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBtQ2hlY2tlZEl0ZW1Db3VudCA9IDE7CisgICAgICAgICAgICB9IGVsc2UgaWYgKG1DaGVja1N0YXRlcy5zaXplKCkgPT0gMCB8fCAhbUNoZWNrU3RhdGVzLnZhbHVlQXQoMCkpIHsKKyAgICAgICAgICAgICAgICBtQ2hlY2tlZEl0ZW1Db3VudCA9IDA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBEbyBub3QgZ2VuZXJhdGUgYSBkYXRhIGNoYW5nZSB3aGlsZSB3ZSBhcmUgaW4gdGhlIGxheW91dCBwaGFzZQorICAgICAgICBpZiAoIW1JbkxheW91dCAmJiAhbUJsb2NrTGF5b3V0UmVxdWVzdHMpIHsKKyAgICAgICAgICAgIG1EYXRhQ2hhbmdlZCA9IHRydWU7CisgICAgICAgICAgICByZW1lbWJlclN5bmNTdGF0ZSgpOworICAgICAgICAgICAgcmVxdWVzdExheW91dCgpOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gcGVyZm9ybUl0ZW1DbGljayhWaWV3IHZpZXcsIGludCBwb3NpdGlvbiwgbG9uZyBpZCkgeworICAgICAgICBib29sZWFuIGhhbmRsZWQgPSBmYWxzZTsKKworICAgICAgICBpZiAobUNob2ljZU1vZGUgIT0gQ0hPSUNFX01PREVfTk9ORSkgeworICAgICAgICAgICAgaGFuZGxlZCA9IHRydWU7CisKKyAgICAgICAgICAgIGlmIChtQ2hvaWNlTW9kZSA9PSBDSE9JQ0VfTU9ERV9NVUxUSVBMRSB8fAorICAgICAgICAgICAgICAgICAgICAobUNob2ljZU1vZGUgPT0gQ0hPSUNFX01PREVfTVVMVElQTEVfTU9EQUwgJiYgbUNob2ljZUFjdGlvbk1vZGUgIT0gbnVsbCkpIHsKKyAgICAgICAgICAgICAgICBib29sZWFuIG5ld1ZhbHVlID0gIW1DaGVja1N0YXRlcy5nZXQocG9zaXRpb24sIGZhbHNlKTsKKyAgICAgICAgICAgICAgICBtQ2hlY2tTdGF0ZXMucHV0KHBvc2l0aW9uLCBuZXdWYWx1ZSk7CisgICAgICAgICAgICAgICAgaWYgKG1DaGVja2VkSWRTdGF0ZXMgIT0gbnVsbCAmJiBtQWRhcHRlci5oYXNTdGFibGVJZHMoKSkgeworICAgICAgICAgICAgICAgICAgICBpZiAobmV3VmFsdWUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1DaGVja2VkSWRTdGF0ZXMucHV0KG1BZGFwdGVyLmdldEl0ZW1JZChwb3NpdGlvbiksIEJvb2xlYW4uVFJVRSk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtQ2hlY2tlZElkU3RhdGVzLmRlbGV0ZShtQWRhcHRlci5nZXRJdGVtSWQocG9zaXRpb24pKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAobmV3VmFsdWUpIHsKKyAgICAgICAgICAgICAgICAgICAgbUNoZWNrZWRJdGVtQ291bnQrKzsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBtQ2hlY2tlZEl0ZW1Db3VudC0tOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAobUNob2ljZUFjdGlvbk1vZGUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBtTXVsdGlDaG9pY2VNb2RlQ2FsbGJhY2sub25JdGVtQ2hlY2tlZFN0YXRlQ2hhbmdlZChtQ2hvaWNlQWN0aW9uTW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbiwgaWQsIG5ld1ZhbHVlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgaWYgKG1DaG9pY2VNb2RlID09IENIT0lDRV9NT0RFX1NJTkdMRSkgeworICAgICAgICAgICAgICAgIGJvb2xlYW4gbmV3VmFsdWUgPSAhbUNoZWNrU3RhdGVzLmdldChwb3NpdGlvbiwgZmFsc2UpOworICAgICAgICAgICAgICAgIGlmIChuZXdWYWx1ZSkgeworICAgICAgICAgICAgICAgICAgICBtQ2hlY2tTdGF0ZXMuY2xlYXIoKTsKKyAgICAgICAgICAgICAgICAgICAgbUNoZWNrU3RhdGVzLnB1dChwb3NpdGlvbiwgdHJ1ZSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChtQ2hlY2tlZElkU3RhdGVzICE9IG51bGwgJiYgbUFkYXB0ZXIuaGFzU3RhYmxlSWRzKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1DaGVja2VkSWRTdGF0ZXMuY2xlYXIoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1DaGVja2VkSWRTdGF0ZXMucHV0KG1BZGFwdGVyLmdldEl0ZW1JZChwb3NpdGlvbiksIEJvb2xlYW4uVFJVRSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgbUNoZWNrZWRJdGVtQ291bnQgPSAxOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobUNoZWNrU3RhdGVzLnNpemUoKSA9PSAwIHx8ICFtQ2hlY2tTdGF0ZXMudmFsdWVBdCgwKSkgeworICAgICAgICAgICAgICAgICAgICBtQ2hlY2tlZEl0ZW1Db3VudCA9IDA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBtRGF0YUNoYW5nZWQgPSB0cnVlOworICAgICAgICAgICAgcmVtZW1iZXJTeW5jU3RhdGUoKTsKKyAgICAgICAgICAgIHJlcXVlc3RMYXlvdXQoKTsKKyAgICAgICAgfQorCisgICAgICAgIGhhbmRsZWQgfD0gc3VwZXIucGVyZm9ybUl0ZW1DbGljayh2aWV3LCBwb3NpdGlvbiwgaWQpOworCisgICAgICAgIHJldHVybiBoYW5kbGVkOworICAgIH0KKworICAgIC8qKgorICAgICAqIEBzZWUgI3NldENob2ljZU1vZGUoaW50KQorICAgICAqCisgICAgICogQHJldHVybiBUaGUgY3VycmVudCBjaG9pY2UgbW9kZQorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0Q2hvaWNlTW9kZSgpIHsKKyAgICAgICAgcmV0dXJuIG1DaG9pY2VNb2RlOworICAgIH0KKworICAgIC8qKgorICAgICAqIERlZmluZXMgdGhlIGNob2ljZSBiZWhhdmlvciBmb3IgdGhlIExpc3QuIEJ5IGRlZmF1bHQsIExpc3RzIGRvIG5vdCBoYXZlIGFueSBjaG9pY2UgYmVoYXZpb3IKKyAgICAgKiAoe0BsaW5rICNDSE9JQ0VfTU9ERV9OT05FfSkuIEJ5IHNldHRpbmcgdGhlIGNob2ljZU1vZGUgdG8ge0BsaW5rICNDSE9JQ0VfTU9ERV9TSU5HTEV9LCB0aGUKKyAgICAgKiBMaXN0IGFsbG93cyB1cCB0byBvbmUgaXRlbSB0byAgYmUgaW4gYSBjaG9zZW4gc3RhdGUuIEJ5IHNldHRpbmcgdGhlIGNob2ljZU1vZGUgdG8KKyAgICAgKiB7QGxpbmsgI0NIT0lDRV9NT0RFX01VTFRJUExFfSwgdGhlIGxpc3QgYWxsb3dzIGFueSBudW1iZXIgb2YgaXRlbXMgdG8gYmUgY2hvc2VuLgorICAgICAqCisgICAgICogQHBhcmFtIGNob2ljZU1vZGUgT25lIG9mIHtAbGluayAjQ0hPSUNFX01PREVfTk9ORX0sIHtAbGluayAjQ0hPSUNFX01PREVfU0lOR0xFfSwgb3IKKyAgICAgKiB7QGxpbmsgI0NIT0lDRV9NT0RFX01VTFRJUExFfQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldENob2ljZU1vZGUoaW50IGNob2ljZU1vZGUpIHsKKyAgICAgICAgbUNob2ljZU1vZGUgPSBjaG9pY2VNb2RlOworICAgICAgICBpZiAobUNob2ljZUFjdGlvbk1vZGUgIT0gbnVsbCkgeworICAgICAgICAgICAgbUNob2ljZUFjdGlvbk1vZGUuZmluaXNoKCk7CisgICAgICAgICAgICBtQ2hvaWNlQWN0aW9uTW9kZSA9IG51bGw7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1DaG9pY2VNb2RlICE9IENIT0lDRV9NT0RFX05PTkUpIHsKKyAgICAgICAgICAgIGlmIChtQ2hlY2tTdGF0ZXMgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG1DaGVja1N0YXRlcyA9IG5ldyBTcGFyc2VCb29sZWFuQXJyYXkoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChtQ2hlY2tlZElkU3RhdGVzID09IG51bGwgJiYgbUFkYXB0ZXIgIT0gbnVsbCAmJiBtQWRhcHRlci5oYXNTdGFibGVJZHMoKSkgeworICAgICAgICAgICAgICAgIG1DaGVja2VkSWRTdGF0ZXMgPSBuZXcgTG9uZ1NwYXJzZUFycmF5PEJvb2xlYW4+KCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBNb2RhbCBtdWx0aS1jaG9pY2UgbW9kZSBvbmx5IGhhcyBjaG9pY2VzIHdoZW4gdGhlIG1vZGUgaXMgYWN0aXZlLiBDbGVhciB0aGVtLgorICAgICAgICAgICAgaWYgKG1DaG9pY2VNb2RlID09IENIT0lDRV9NT0RFX01VTFRJUExFX01PREFMKSB7CisgICAgICAgICAgICAgICAgY2xlYXJDaG9pY2VzKCk7CisgICAgICAgICAgICAgICAgc2V0TG9uZ0NsaWNrYWJsZSh0cnVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCBhIHtAbGluayBNdWx0aUNob2ljZU1vZGVMaXN0ZW5lcn0gdGhhdCB3aWxsIG1hbmFnZSB0aGUgbGlmZWN5Y2xlIG9mIHRoZQorICAgICAqIHNlbGVjdGlvbiB7QGxpbmsgQWN0aW9uTW9kZX0uIE9ubHkgdXNlZCB3aGVuIHRoZSBjaG9pY2UgbW9kZSBpcyBzZXQgdG8KKyAgICAgKiB7QGxpbmsgI0NIT0lDRV9NT0RFX01VTFRJUExFX01PREFMfS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBsaXN0ZW5lciBMaXN0ZW5lciB0aGF0IHdpbGwgbWFuYWdlIHRoZSBzZWxlY3Rpb24gbW9kZQorICAgICAqCisgICAgICogQHNlZSAjc2V0Q2hvaWNlTW9kZShpbnQpCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0TXVsdGlDaG9pY2VNb2RlTGlzdGVuZXIoTXVsdGlDaG9pY2VNb2RlTGlzdGVuZXIgbGlzdGVuZXIpIHsKKyAgICAgICAgaWYgKG1NdWx0aUNob2ljZU1vZGVDYWxsYmFjayA9PSBudWxsKSB7CisgICAgICAgICAgICBtTXVsdGlDaG9pY2VNb2RlQ2FsbGJhY2sgPSBuZXcgTXVsdGlDaG9pY2VNb2RlV3JhcHBlcigpOworICAgICAgICB9CisgICAgICAgIG1NdWx0aUNob2ljZU1vZGVDYWxsYmFjay5zZXRXcmFwcGVkKGxpc3RlbmVyKTsKICAgICB9CiAKICAgICAvKioKQEAgLTg4OCw2ICsxMTc3LDggQEAKICAgICAgICAgaW50IHBvc2l0aW9uOwogICAgICAgICBpbnQgaGVpZ2h0OwogICAgICAgICBTdHJpbmcgZmlsdGVyOworICAgICAgICBTcGFyc2VCb29sZWFuQXJyYXkgY2hlY2tTdGF0ZTsKKyAgICAgICAgTG9uZ1NwYXJzZUFycmF5PEJvb2xlYW4+IGNoZWNrSWRTdGF0ZTsKIAogICAgICAgICAvKioKICAgICAgICAgICogQ29uc3RydWN0b3IgY2FsbGVkIGZyb20ge0BsaW5rIEFic0xpc3RWaWV3I29uU2F2ZUluc3RhbmNlU3RhdGUoKX0KQEAgLTkwNyw2ICsxMTk4LDEzIEBACiAgICAgICAgICAgICBwb3NpdGlvbiA9IGluLnJlYWRJbnQoKTsKICAgICAgICAgICAgIGhlaWdodCA9IGluLnJlYWRJbnQoKTsKICAgICAgICAgICAgIGZpbHRlciA9IGluLnJlYWRTdHJpbmcoKTsKKyAgICAgICAgICAgIGNoZWNrU3RhdGUgPSBpbi5yZWFkU3BhcnNlQm9vbGVhbkFycmF5KCk7CisgICAgICAgICAgICBsb25nW10gaWRTdGF0ZSA9IGluLmNyZWF0ZUxvbmdBcnJheSgpOworCisgICAgICAgICAgICBpZiAoaWRTdGF0ZS5sZW5ndGggPiAwKSB7CisgICAgICAgICAgICAgICAgY2hlY2tJZFN0YXRlID0gbmV3IExvbmdTcGFyc2VBcnJheTxCb29sZWFuPigpOworICAgICAgICAgICAgICAgIGNoZWNrSWRTdGF0ZS5zZXRWYWx1ZXMoaWRTdGF0ZSwgQm9vbGVhbi5UUlVFKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQogCiAgICAgICAgIEBPdmVycmlkZQpAQCAtOTE4LDYgKzEyMTYsOCBAQAogICAgICAgICAgICAgb3V0LndyaXRlSW50KHBvc2l0aW9uKTsKICAgICAgICAgICAgIG91dC53cml0ZUludChoZWlnaHQpOwogICAgICAgICAgICAgb3V0LndyaXRlU3RyaW5nKGZpbHRlcik7CisgICAgICAgICAgICBvdXQud3JpdGVTcGFyc2VCb29sZWFuQXJyYXkoY2hlY2tTdGF0ZSk7CisgICAgICAgICAgICBvdXQud3JpdGVMb25nQXJyYXkoY2hlY2tJZFN0YXRlICE9IG51bGwgPyBjaGVja0lkU3RhdGUuZ2V0S2V5cygpIDogbmV3IGxvbmdbMF0pOwogICAgICAgICB9CiAKICAgICAgICAgQE92ZXJyaWRlCkBAIC05MjksNyArMTIyOSw4IEBACiAgICAgICAgICAgICAgICAgICAgICsgIiB2aWV3VG9wPSIgKyB2aWV3VG9wCiAgICAgICAgICAgICAgICAgICAgICsgIiBwb3NpdGlvbj0iICsgcG9zaXRpb24KICAgICAgICAgICAgICAgICAgICAgKyAiIGhlaWdodD0iICsgaGVpZ2h0Ci0gICAgICAgICAgICAgICAgICAgICsgIiBmaWx0ZXI9IiArIGZpbHRlciArICJ9IjsKKyAgICAgICAgICAgICAgICAgICAgKyAiIGZpbHRlcj0iICsgZmlsdGVyCisgICAgICAgICAgICAgICAgICAgICsgIiBjaGVja1N0YXRlPSIgKyBjaGVja1N0YXRlICsgIn0iOwogICAgICAgICB9CiAKICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBQYXJjZWxhYmxlLkNyZWF0b3I8U2F2ZWRTdGF0ZT4gQ1JFQVRPUgpAQCAtOTkzLDYgKzEyOTQsOSBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAKKyAgICAgICAgc3MuY2hlY2tTdGF0ZSA9IG1DaGVja1N0YXRlczsKKyAgICAgICAgc3MuY2hlY2tJZFN0YXRlID0gbUNoZWNrZWRJZFN0YXRlczsKKwogICAgICAgICByZXR1cm4gc3M7CiAgICAgfQogCkBAIC0xMDI0LDYgKzEzMjgsMTQgQEAKIAogICAgICAgICBzZXRGaWx0ZXJUZXh0KHNzLmZpbHRlcik7CiAKKyAgICAgICAgaWYgKHNzLmNoZWNrU3RhdGUgIT0gbnVsbCkgeworICAgICAgICAgICAgbUNoZWNrU3RhdGVzID0gc3MuY2hlY2tTdGF0ZTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChzcy5jaGVja0lkU3RhdGUgIT0gbnVsbCkgeworICAgICAgICAgICAgbUNoZWNrZWRJZFN0YXRlcyA9IHNzLmNoZWNrSWRTdGF0ZTsKKyAgICAgICAgfQorCiAgICAgICAgIHJlcXVlc3RMYXlvdXQoKTsKICAgICB9CiAKQEAgLTExNjYsMTAgKzE0NzgsNiBAQAogICAgICAgICBpbnQgcmVzdWx0OwogICAgICAgICBpZiAobVNtb290aFNjcm9sbGJhckVuYWJsZWQpIHsKICAgICAgICAgICAgIHJlc3VsdCA9IE1hdGgubWF4KG1JdGVtQ291bnQgKiAxMDAsIDApOwotICAgICAgICAgICAgaWYgKG1TY3JvbGxZICE9IDApIHsKLSAgICAgICAgICAgICAgICAvLyBDb21wZW5zYXRlIGZvciBvdmVyc2Nyb2xsCi0gICAgICAgICAgICAgICAgcmVzdWx0ICs9IE1hdGguYWJzKChpbnQpICgoZmxvYXQpIG1TY3JvbGxZIC8gZ2V0SGVpZ2h0KCkgKiBtSXRlbUNvdW50ICogMTAwKSk7Ci0gICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICByZXN1bHQgPSBtSXRlbUNvdW50OwogICAgICAgICB9CkBAIC0xMjQyLDggKzE1NTAsNiBAQAogCiAgICAgICAgIGxheW91dENoaWxkcmVuKCk7CiAgICAgICAgIG1JbkxheW91dCA9IGZhbHNlOwotCi0gICAgICAgIG1PdmVyc2Nyb2xsTWF4ID0gKGIgLSB0KSAvIE9WRVJTQ1JPTExfTElNSVRfRElWSVNPUjsKICAgICB9CiAKICAgICAvKioKQEAgLTE2NzMsNiArMTk3OSwxMSBAQAogICAgICAgICAgICAgICAgIHRyZWVPYnNlcnZlci5hZGRPbkdsb2JhbExheW91dExpc3RlbmVyKHRoaXMpOwogICAgICAgICAgICAgfQogICAgICAgICB9CisgICAgICAgIAorICAgICAgICBpZiAobUFkYXB0ZXIgIT0gbnVsbCAmJiBtRGF0YVNldE9ic2VydmVyID09IG51bGwpIHsKKyAgICAgICAgICAgIG1EYXRhU2V0T2JzZXJ2ZXIgPSBuZXcgQWRhcHRlckRhdGFTZXRPYnNlcnZlcigpOworICAgICAgICAgICAgbUFkYXB0ZXIucmVnaXN0ZXJEYXRhU2V0T2JzZXJ2ZXIobURhdGFTZXRPYnNlcnZlcik7CisgICAgICAgIH0KICAgICB9CiAKICAgICBAT3ZlcnJpZGUKQEAgLTE2OTMsNiArMjAwNCwxMSBAQAogICAgICAgICAgICAgICAgIG1HbG9iYWxMYXlvdXRMaXN0ZW5lckFkZGVkRmlsdGVyID0gZmFsc2U7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KKworICAgICAgICBpZiAobUFkYXB0ZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgbUFkYXB0ZXIudW5yZWdpc3RlckRhdGFTZXRPYnNlcnZlcihtRGF0YVNldE9ic2VydmVyKTsKKyAgICAgICAgICAgIG1EYXRhU2V0T2JzZXJ2ZXIgPSBudWxsOworICAgICAgICB9CiAgICAgfQogCiAgICAgQE92ZXJyaWRlCkBAIC0xNzEwLDcgKzIwMjYsNiBAQAogICAgICAgICAgICAgICAgIG1GbGluZ1J1bm5hYmxlLmVuZEZsaW5nKCk7CiAgICAgICAgICAgICAgICAgaWYgKG1TY3JvbGxZICE9IDApIHsKICAgICAgICAgICAgICAgICAgICAgbVNjcm9sbFkgPSAwOwotICAgICAgICAgICAgICAgICAgICBmaW5pc2hHbG93cygpOwogICAgICAgICAgICAgICAgICAgICBpbnZhbGlkYXRlKCk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQpAQCAtMTg0NCwxMCArMjE1OSwyMSBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgcHJpdmF0ZSBib29sZWFuIHBlcmZvcm1Mb25nUHJlc3MoZmluYWwgVmlldyBjaGlsZCwKKyAgICBib29sZWFuIHBlcmZvcm1Mb25nUHJlc3MoZmluYWwgVmlldyBjaGlsZCwKICAgICAgICAgICAgIGZpbmFsIGludCBsb25nUHJlc3NQb3NpdGlvbiwgZmluYWwgbG9uZyBsb25nUHJlc3NJZCkgewotICAgICAgICBib29sZWFuIGhhbmRsZWQgPSBmYWxzZTsKKyAgICAgICAgLy8gQ0hPSUNFX01PREVfTVVMVElQTEVfTU9EQUwgdGFrZXMgb3ZlciBsb25nIHByZXNzLgorICAgICAgICBpZiAobUNob2ljZU1vZGUgPT0gQ0hPSUNFX01PREVfTVVMVElQTEVfTU9EQUwpIHsKKyAgICAgICAgICAgIGlmIChtQ2hvaWNlQWN0aW9uTW9kZSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgbUNob2ljZUFjdGlvbk1vZGUgPSBzdGFydEFjdGlvbk1vZGUobU11bHRpQ2hvaWNlTW9kZUNhbGxiYWNrKTsKKyAgICAgICAgICAgICAgICBzZXRJdGVtQ2hlY2tlZChsb25nUHJlc3NQb3NpdGlvbiwgdHJ1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBUT0RPIFNob3VsZCB3ZSBzZWxlY3QgdGhlIGxvbmcgcHJlc3NlZCBpdGVtIGlmIHdlIHdlcmUgYWxyZWFkeSBpbgorICAgICAgICAgICAgLy8gc2VsZWN0aW9uIG1vZGU/IChpLmUuIHRyZWF0IGl0IGxpa2UgYW4gaXRlbSBjbGljaz8pCisgICAgICAgICAgICBwZXJmb3JtSGFwdGljRmVlZGJhY2soSGFwdGljRmVlZGJhY2tDb25zdGFudHMuTE9OR19QUkVTUyk7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQogCisgICAgICAgIGJvb2xlYW4gaGFuZGxlZCA9IGZhbHNlOwogICAgICAgICBpZiAobU9uSXRlbUxvbmdDbGlja0xpc3RlbmVyICE9IG51bGwpIHsKICAgICAgICAgICAgIGhhbmRsZWQgPSBtT25JdGVtTG9uZ0NsaWNrTGlzdGVuZXIub25JdGVtTG9uZ0NsaWNrKEFic0xpc3RWaWV3LnRoaXMsIGNoaWxkLAogICAgICAgICAgICAgICAgICAgICBsb25nUHJlc3NQb3NpdGlvbiwgbG9uZ1ByZXNzSWQpOwpAQCAtMjAyMCwxMCArMjM0Niw5IEBACiAgICAgICAgIC8vIENoZWNrIGlmIHdlIGhhdmUgbW92ZWQgZmFyIGVub3VnaCB0aGF0IGl0IGxvb2tzIG1vcmUgbGlrZSBhCiAgICAgICAgIC8vIHNjcm9sbCB0aGFuIGEgdGFwCiAgICAgICAgIGZpbmFsIGludCBkaXN0YW5jZSA9IE1hdGguYWJzKGRlbHRhWSk7Ci0gICAgICAgIGZpbmFsIGJvb2xlYW4gb3ZlcnNjcm9sbCA9IG1TY3JvbGxZICE9IDA7Ci0gICAgICAgIGlmIChvdmVyc2Nyb2xsIHx8IGRpc3RhbmNlID4gbVRvdWNoU2xvcCkgeworICAgICAgICBpZiAoZGlzdGFuY2UgPiBtVG91Y2hTbG9wKSB7CiAgICAgICAgICAgICBjcmVhdGVTY3JvbGxpbmdDYWNoZSgpOwotICAgICAgICAgICAgbVRvdWNoTW9kZSA9IG92ZXJzY3JvbGwgPyBUT1VDSF9NT0RFX09WRVJTQ1JPTEwgOiBUT1VDSF9NT0RFX1NDUk9MTDsKKyAgICAgICAgICAgIG1Ub3VjaE1vZGUgPSBUT1VDSF9NT0RFX1NDUk9MTDsKICAgICAgICAgICAgIG1Nb3Rpb25Db3JyZWN0aW9uID0gZGVsdGFZOwogICAgICAgICAgICAgZmluYWwgSGFuZGxlciBoYW5kbGVyID0gZ2V0SGFuZGxlcigpOwogICAgICAgICAgICAgLy8gSGFuZGxlciBzaG91bGQgbm90IGJlIG51bGwgdW5sZXNzIHRoZSBBYnNMaXN0VmlldyBpcyBub3QgYXR0YWNoZWQgdG8gYQpAQCAtMjA1OSwxOSArMjM4NCw2IEBACiAgICAgICAgICAgICAgICAgLy8gdG91Y2ggbW9kZSkuIEZvcmNlIGFuIGluaXRpYWwgbGF5b3V0IHRvIGdldCByaWQgb2YgdGhlIHNlbGVjdGlvbi4KICAgICAgICAgICAgICAgICBsYXlvdXRDaGlsZHJlbigpOwogICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaW50IHRvdWNoTW9kZSA9IG1Ub3VjaE1vZGU7Ci0gICAgICAgICAgICBpZiAodG91Y2hNb2RlID09IFRPVUNIX01PREVfT1ZFUlNDUk9MTCB8fCB0b3VjaE1vZGUgPT0gVE9VQ0hfTU9ERV9PVkVSRkxJTkcpIHsKLSAgICAgICAgICAgICAgICBpZiAobUZsaW5nUnVubmFibGUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBtRmxpbmdSdW5uYWJsZS5lbmRGbGluZygpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChtU2Nyb2xsWSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1TY3JvbGxZID0gMDsKLSAgICAgICAgICAgICAgICAgICAgZmluaXNoR2xvd3MoKTsKLSAgICAgICAgICAgICAgICAgICAgaW52YWxpZGF0ZSgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KIApAQCAtMjEwMiw2MyArMjQxNCw0OSBAQAogCiAgICAgICAgIHN3aXRjaCAoYWN0aW9uICYgTW90aW9uRXZlbnQuQUNUSU9OX01BU0spIHsKICAgICAgICAgY2FzZSBNb3Rpb25FdmVudC5BQ1RJT05fRE9XTjogewotICAgICAgICAgICAgc3dpdGNoIChtVG91Y2hNb2RlKSB7Ci0gICAgICAgICAgICBjYXNlIFRPVUNIX01PREVfT1ZFUkZMSU5HOiB7Ci0gICAgICAgICAgICAgICAgbUZsaW5nUnVubmFibGUuZW5kRmxpbmcoKTsKLSAgICAgICAgICAgICAgICBtVG91Y2hNb2RlID0gVE9VQ0hfTU9ERV9PVkVSU0NST0xMOwotICAgICAgICAgICAgICAgIG1Nb3Rpb25ZID0gbUxhc3RZID0gKGludCkgZXYuZ2V0WSgpOwotICAgICAgICAgICAgICAgIG1Nb3Rpb25Db3JyZWN0aW9uID0gMDsKLSAgICAgICAgICAgICAgICBtQWN0aXZlUG9pbnRlcklkID0gZXYuZ2V0UG9pbnRlcklkKDApOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQorICAgICAgICAgICAgbUFjdGl2ZVBvaW50ZXJJZCA9IGV2LmdldFBvaW50ZXJJZCgwKTsKKyAgICAgICAgICAgIGZpbmFsIGludCB4ID0gKGludCkgZXYuZ2V0WCgpOworICAgICAgICAgICAgZmluYWwgaW50IHkgPSAoaW50KSBldi5nZXRZKCk7CisgICAgICAgICAgICBpbnQgbW90aW9uUG9zaXRpb24gPSBwb2ludFRvUG9zaXRpb24oeCwgeSk7CisgICAgICAgICAgICBpZiAoIW1EYXRhQ2hhbmdlZCkgeworICAgICAgICAgICAgICAgIGlmICgobVRvdWNoTW9kZSAhPSBUT1VDSF9NT0RFX0ZMSU5HKSAmJiAobW90aW9uUG9zaXRpb24gPj0gMCkKKyAgICAgICAgICAgICAgICAgICAgICAgICYmIChnZXRBZGFwdGVyKCkuaXNFbmFibGVkKG1vdGlvblBvc2l0aW9uKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gVXNlciBjbGlja2VkIG9uIGFuIGFjdHVhbCB2aWV3IChhbmQgd2FzIG5vdCBzdG9wcGluZyBhIGZsaW5nKS4gSXQgbWlnaHQgYmUgYQorICAgICAgICAgICAgICAgICAgICAvLyBjbGljayBvciBhIHNjcm9sbC4gQXNzdW1lIGl0IGlzIGEgY2xpY2sgdW50aWwgcHJvdmVuIG90aGVyd2lzZQorICAgICAgICAgICAgICAgICAgICBtVG91Y2hNb2RlID0gVE9VQ0hfTU9ERV9ET1dOOworICAgICAgICAgICAgICAgICAgICAvLyBGSVhNRSBEZWJvdW5jZQorICAgICAgICAgICAgICAgICAgICBpZiAobVBlbmRpbmdDaGVja0ZvclRhcCA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtUGVuZGluZ0NoZWNrRm9yVGFwID0gbmV3IENoZWNrRm9yVGFwKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgcG9zdERlbGF5ZWQobVBlbmRpbmdDaGVja0ZvclRhcCwgVmlld0NvbmZpZ3VyYXRpb24uZ2V0VGFwVGltZW91dCgpKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBpZiAoZXYuZ2V0RWRnZUZsYWdzKCkgIT0gMCAmJiBtb3Rpb25Qb3NpdGlvbiA8IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIElmIHdlIGNvdWxkbid0IGZpbmQgYSB2aWV3IHRvIGNsaWNrIG9uLCBidXQgdGhlIGRvd24gZXZlbnQgd2FzIHRvdWNoaW5nCisgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgZWRnZSwgd2Ugd2lsbCBiYWlsIG91dCBhbmQgdHJ5IGFnYWluLiBUaGlzIGFsbG93cyB0aGUgZWRnZSBjb3JyZWN0aW5nCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb2RlIGluIFZpZXdSb290IHRvIHRyeSB0byBmaW5kIGEgbmVhcmJ5IHZpZXcgdG8gc2VsZWN0CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgZGVmYXVsdDogewotICAgICAgICAgICAgICAgIG1BY3RpdmVQb2ludGVySWQgPSBldi5nZXRQb2ludGVySWQoMCk7Ci0gICAgICAgICAgICAgICAgZmluYWwgaW50IHggPSAoaW50KSBldi5nZXRYKCk7Ci0gICAgICAgICAgICAgICAgZmluYWwgaW50IHkgPSAoaW50KSBldi5nZXRZKCk7Ci0gICAgICAgICAgICAgICAgaW50IG1vdGlvblBvc2l0aW9uID0gcG9pbnRUb1Bvc2l0aW9uKHgsIHkpOwotICAgICAgICAgICAgICAgIGlmICghbURhdGFDaGFuZ2VkKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICgobVRvdWNoTW9kZSAhPSBUT1VDSF9NT0RFX0ZMSU5HKSAmJiAobW90aW9uUG9zaXRpb24gPj0gMCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiAoZ2V0QWRhcHRlcigpLmlzRW5hYmxlZChtb3Rpb25Qb3NpdGlvbikpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBVc2VyIGNsaWNrZWQgb24gYW4gYWN0dWFsIHZpZXcgKGFuZCB3YXMgbm90IHN0b3BwaW5nIGEgZmxpbmcpLiBJdCBtaWdodCBiZSBhCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBjbGljayBvciBhIHNjcm9sbC4gQXNzdW1lIGl0IGlzIGEgY2xpY2sgdW50aWwgcHJvdmVuIG90aGVyd2lzZQotICAgICAgICAgICAgICAgICAgICAgICAgbVRvdWNoTW9kZSA9IFRPVUNIX01PREVfRE9XTjsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZJWE1FIERlYm91bmNlCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobVBlbmRpbmdDaGVja0ZvclRhcCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbVBlbmRpbmdDaGVja0ZvclRhcCA9IG5ldyBDaGVja0ZvclRhcCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgcG9zdERlbGF5ZWQobVBlbmRpbmdDaGVja0ZvclRhcCwgVmlld0NvbmZpZ3VyYXRpb24uZ2V0VGFwVGltZW91dCgpKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChldi5nZXRFZGdlRmxhZ3MoKSAhPSAwICYmIG1vdGlvblBvc2l0aW9uIDwgMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIElmIHdlIGNvdWxkbid0IGZpbmQgYSB2aWV3IHRvIGNsaWNrIG9uLCBidXQgdGhlIGRvd24gZXZlbnQgd2FzIHRvdWNoaW5nCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIGVkZ2UsIHdlIHdpbGwgYmFpbCBvdXQgYW5kIHRyeSBhZ2Fpbi4gVGhpcyBhbGxvd3MgdGhlIGVkZ2UgY29ycmVjdGluZwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvZGUgaW4gVmlld1Jvb3QgdG8gdHJ5IHRvIGZpbmQgYSBuZWFyYnkgdmlldyB0byBzZWxlY3QKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtVG91Y2hNb2RlID09IFRPVUNIX01PREVfRkxJTkcpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBTdG9wcGVkIGEgZmxpbmcuIEl0IGlzIGEgc2Nyb2xsLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyZWF0ZVNjcm9sbGluZ0NhY2hlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbVRvdWNoTW9kZSA9IFRPVUNIX01PREVfU0NST0xMOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Nb3Rpb25Db3JyZWN0aW9uID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb3Rpb25Qb3NpdGlvbiA9IGZpbmRNb3Rpb25Sb3coeSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwb3J0U2Nyb2xsU3RhdGVDaGFuZ2UoT25TY3JvbGxMaXN0ZW5lci5TQ1JPTExfU1RBVEVfVE9VQ0hfU0NST0xMKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKG1Ub3VjaE1vZGUgPT0gVE9VQ0hfTU9ERV9GTElORykgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gU3RvcHBlZCBhIGZsaW5nLiBJdCBpcyBhIHNjcm9sbC4KKyAgICAgICAgICAgICAgICAgICAgICAgIGNyZWF0ZVNjcm9sbGluZ0NhY2hlKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBtVG91Y2hNb2RlID0gVE9VQ0hfTU9ERV9TQ1JPTEw7CisgICAgICAgICAgICAgICAgICAgICAgICBtTW90aW9uQ29ycmVjdGlvbiA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICBtb3Rpb25Qb3NpdGlvbiA9IGZpbmRNb3Rpb25Sb3coeSk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXBvcnRTY3JvbGxTdGF0ZUNoYW5nZShPblNjcm9sbExpc3RlbmVyLlNDUk9MTF9TVEFURV9UT1VDSF9TQ1JPTEwpOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgaWYgKG1vdGlvblBvc2l0aW9uID49IDApIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gUmVtZW1iZXIgd2hlcmUgdGhlIG1vdGlvbiBldmVudCBzdGFydGVkCi0gICAgICAgICAgICAgICAgICAgIHYgPSBnZXRDaGlsZEF0KG1vdGlvblBvc2l0aW9uIC0gbUZpcnN0UG9zaXRpb24pOwotICAgICAgICAgICAgICAgICAgICBtTW90aW9uVmlld09yaWdpbmFsVG9wID0gdi5nZXRUb3AoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbU1vdGlvblggPSB4OwotICAgICAgICAgICAgICAgIG1Nb3Rpb25ZID0geTsKLSAgICAgICAgICAgICAgICBtTW90aW9uUG9zaXRpb24gPSBtb3Rpb25Qb3NpdGlvbjsKLSAgICAgICAgICAgICAgICBtTGFzdFkgPSBJbnRlZ2VyLk1JTl9WQUxVRTsKLSAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGlmIChtb3Rpb25Qb3NpdGlvbiA+PSAwKSB7CisgICAgICAgICAgICAgICAgLy8gUmVtZW1iZXIgd2hlcmUgdGhlIG1vdGlvbiBldmVudCBzdGFydGVkCisgICAgICAgICAgICAgICAgdiA9IGdldENoaWxkQXQobW90aW9uUG9zaXRpb24gLSBtRmlyc3RQb3NpdGlvbik7CisgICAgICAgICAgICAgICAgbU1vdGlvblZpZXdPcmlnaW5hbFRvcCA9IHYuZ2V0VG9wKCk7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9CisgICAgICAgICAgICBtTW90aW9uWCA9IHg7CisgICAgICAgICAgICBtTW90aW9uWSA9IHk7CisgICAgICAgICAgICBtTW90aW9uUG9zaXRpb24gPSBtb3Rpb25Qb3NpdGlvbjsKKyAgICAgICAgICAgIG1MYXN0WSA9IEludGVnZXIuTUlOX1ZBTFVFOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KIApAQCAtMjE5MSwyNSArMjQ4OSw5IEBACiAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0RGlzYWxsb3dJbnRlcmNlcHRUb3VjaEV2ZW50KHRydWUpOwogICAgICAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IHJhd0RlbHRhWSA9IGRlbHRhWTsKICAgICAgICAgICAgICAgICAgICAgZGVsdGFZIC09IG1Nb3Rpb25Db3JyZWN0aW9uOwogICAgICAgICAgICAgICAgICAgICBpbnQgaW5jcmVtZW50YWxEZWx0YVkgPSBtTGFzdFkgIT0gSW50ZWdlci5NSU5fVkFMVUUgPyB5IC0gbUxhc3RZIDogZGVsdGFZOwogICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IG1vdGlvbkluZGV4OwotICAgICAgICAgICAgICAgICAgICBpZiAobU1vdGlvblBvc2l0aW9uID49IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1vdGlvbkluZGV4ID0gbU1vdGlvblBvc2l0aW9uIC0gbUZpcnN0UG9zaXRpb247Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBJZiB3ZSBkb24ndCBoYXZlIGEgbW90aW9uIHBvc2l0aW9uIHRoYXQgd2UgY2FuIHJlbGlhYmx5IHRyYWNrLAotICAgICAgICAgICAgICAgICAgICAgICAgLy8gcGljayBzb21ldGhpbmcgaW4gdGhlIG1pZGRsZSB0byBtYWtlIGEgYmVzdCBndWVzcyBhdCB0aGluZ3MgYmVsb3cuCi0gICAgICAgICAgICAgICAgICAgICAgICBtb3Rpb25JbmRleCA9IGdldENoaWxkQ291bnQoKSAvIDI7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBpbnQgbW90aW9uVmlld1ByZXZUb3AgPSAwOwotICAgICAgICAgICAgICAgICAgICBWaWV3IG1vdGlvblZpZXcgPSB0aGlzLmdldENoaWxkQXQobW90aW9uSW5kZXgpOwotICAgICAgICAgICAgICAgICAgICBpZiAobW90aW9uVmlldyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtb3Rpb25WaWV3UHJldlRvcCA9IG1vdGlvblZpZXcuZ2V0VG9wKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQogICAgICAgICAgICAgICAgICAgICAvLyBObyBuZWVkIHRvIGRvIGFsbCB0aGlzIHdvcmsgaWYgd2UncmUgbm90IGdvaW5nIHRvIG1vdmUgYW55d2F5CiAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gYXRFZGdlID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgIGlmIChpbmNyZW1lbnRhbERlbHRhWSAhPSAwKSB7CkBAIC0yMjE3LDk5ICsyNDk5LDIzIEBACiAgICAgICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAgICAgICAvLyBDaGVjayB0byBzZWUgaWYgd2UgaGF2ZSBidW1wZWQgaW50byB0aGUgc2Nyb2xsIGxpbWl0Ci0gICAgICAgICAgICAgICAgICAgIG1vdGlvblZpZXcgPSB0aGlzLmdldENoaWxkQXQobW90aW9uSW5kZXgpOwotICAgICAgICAgICAgICAgICAgICBpZiAobW90aW9uVmlldyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBDaGVjayBpZiB0aGUgdG9wIG9mIHRoZSBtb3Rpb24gdmlldyBpcyB3aGVyZSBpdCBpcwotICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3VwcG9zZWQgdG8gYmUKLSAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIGludCBtb3Rpb25WaWV3UmVhbFRvcCA9IG1vdGlvblZpZXcuZ2V0VG9wKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoYXRFZGdlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQXBwbHkgb3ZlcnNjcm9sbAotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG92ZXJzY3JvbGwgPSAtaW5jcmVtZW50YWxEZWx0YVkgLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1vdGlvblZpZXdSZWFsVG9wIC0gbW90aW9uVmlld1ByZXZUb3ApOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG92ZXJzY3JvbGxCeSgwLCBvdmVyc2Nyb2xsLCAwLCBtU2Nyb2xsWSwgMCwgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIG1PdmVyc2Nyb2xsRGlzdGFuY2UsIHRydWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChNYXRoLmFicyhtT3ZlcnNjcm9sbERpc3RhbmNlKSA9PSBNYXRoLmFicyhtU2Nyb2xsWSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRG9uJ3QgYWxsb3cgb3ZlcmZsaW5nIGlmIHdlJ3JlIGF0IHRoZSBlZGdlLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtVmVsb2NpdHlUcmFja2VyLmNsZWFyKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IG92ZXJzY3JvbGxNb2RlID0gZ2V0T3ZlcnNjcm9sbE1vZGUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAob3ZlcnNjcm9sbE1vZGUgPT0gT1ZFUlNDUk9MTF9BTFdBWVMgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvdmVyc2Nyb2xsTW9kZSA9PSBPVkVSU0NST0xMX0lGX0NPTlRFTlRfU0NST0xMUyAmJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhY29udGVudEZpdHMoKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVRvdWNoTW9kZSA9IFRPVUNIX01PREVfT1ZFUlNDUk9MTDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJhd0RlbHRhWSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1FZGdlR2xvd1RvcC5vblB1bGwoKGZsb2F0KSBvdmVyc2Nyb2xsIC8gZ2V0SGVpZ2h0KCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHJhd0RlbHRhWSA8IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1FZGdlR2xvd0JvdHRvbS5vblB1bGwoKGZsb2F0KSBvdmVyc2Nyb2xsIC8gZ2V0SGVpZ2h0KCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAoYXRFZGdlICYmIGdldENoaWxkQ291bnQoKSA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRyZWF0IHRoaXMgbGlrZSB3ZSdyZSBzdGFydGluZyBhIG5ldyBzY3JvbGwgZnJvbSB0aGUgY3VycmVudAorICAgICAgICAgICAgICAgICAgICAgICAgLy8gcG9zaXRpb24uIFRoaXMgd2lsbCBsZXQgdGhlIHVzZXIgc3RhcnQgc2Nyb2xsaW5nIGJhY2sgaW50bworICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29udGVudCBpbW1lZGlhdGVseSByYXRoZXIgdGhhbiBuZWVkaW5nIHRvIHNjcm9sbCBiYWNrIHRvIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgLy8gcG9pbnQgd2hlcmUgdGhleSBoaXQgdGhlIGxpbWl0IGZpcnN0LgorICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1vdGlvblBvc2l0aW9uID0gZmluZE1vdGlvblJvdyh5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtb3Rpb25Qb3NpdGlvbiA+PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgVmlldyBtb3Rpb25WaWV3ID0gZ2V0Q2hpbGRBdChtb3Rpb25Qb3NpdGlvbiAtIG1GaXJzdFBvc2l0aW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTW90aW9uVmlld09yaWdpbmFsVG9wID0gbW90aW9uVmlldy5nZXRUb3AoKTsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgIG1Nb3Rpb25ZID0geTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1Nb3Rpb25Qb3NpdGlvbiA9IG1vdGlvblBvc2l0aW9uOwogICAgICAgICAgICAgICAgICAgICAgICAgaW52YWxpZGF0ZSgpOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIG1MYXN0WSA9IHk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIFRPVUNIX01PREVfT1ZFUlNDUk9MTDoKLSAgICAgICAgICAgICAgICBpZiAoeSAhPSBtTGFzdFkpIHsKLSAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IHJhd0RlbHRhWSA9IGRlbHRhWTsKLSAgICAgICAgICAgICAgICAgICAgZGVsdGFZIC09IG1Nb3Rpb25Db3JyZWN0aW9uOwotICAgICAgICAgICAgICAgICAgICBpbnQgaW5jcmVtZW50YWxEZWx0YVkgPSBtTGFzdFkgIT0gSW50ZWdlci5NSU5fVkFMVUUgPyB5IC0gbUxhc3RZIDogZGVsdGFZOwotCi0gICAgICAgICAgICAgICAgICAgIGZpbmFsIGludCBvbGRTY3JvbGwgPSBtU2Nyb2xsWTsKLSAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IG5ld1Njcm9sbCA9IG9sZFNjcm9sbCAtIGluY3JlbWVudGFsRGVsdGFZOwotCi0gICAgICAgICAgICAgICAgICAgIGlmICgob2xkU2Nyb2xsID49IDAgJiYgbmV3U2Nyb2xsIDw9IDApIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9sZFNjcm9sbCA8PSAwICYmIG5ld1Njcm9sbCA+PSAwKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ29taW5nIGJhY2sgdG8gJ3JlYWwnIGxpc3Qgc2Nyb2xsaW5nCi0gICAgICAgICAgICAgICAgICAgICAgICBpbmNyZW1lbnRhbERlbHRhWSA9IC1uZXdTY3JvbGw7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtU2Nyb2xsWSA9IDA7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5vIG5lZWQgdG8gZG8gYWxsIHRoaXMgd29yayBpZiB3ZSdyZSBub3QgZ29pbmcgdG8gbW92ZSBhbnl3YXkKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbmNyZW1lbnRhbERlbHRhWSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2tNb3Rpb25TY3JvbGwoaW5jcmVtZW50YWxEZWx0YVksIGluY3JlbWVudGFsRGVsdGFZKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ2hlY2sgdG8gc2VlIGlmIHdlIGFyZSBiYWNrIGluCi0gICAgICAgICAgICAgICAgICAgICAgICBWaWV3IG1vdGlvblZpZXcgPSB0aGlzLmdldENoaWxkQXQobU1vdGlvblBvc2l0aW9uIC0gbUZpcnN0UG9zaXRpb24pOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1vdGlvblZpZXcgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Ub3VjaE1vZGUgPSBUT1VDSF9NT0RFX1NDUk9MTDsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdlIGRpZCBub3Qgc2Nyb2xsIHRoZSBmdWxsIGFtb3VudC4gVHJlYXQgdGhpcyBlc3NlbnRpYWxseSBsaWtlIHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN0YXJ0IG9mIGEgbmV3IHRvdWNoIHNjcm9sbAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIGludCBtb3Rpb25Qb3NpdGlvbiA9IGZpbmRDbG9zZXN0TW90aW9uUm93KHkpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbU1vdGlvbkNvcnJlY3Rpb24gPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vdGlvblZpZXcgPSBnZXRDaGlsZEF0KG1vdGlvblBvc2l0aW9uIC0gbUZpcnN0UG9zaXRpb24pOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Nb3Rpb25WaWV3T3JpZ2luYWxUb3AgPSBtb3Rpb25WaWV3LmdldFRvcCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Nb3Rpb25ZID0geTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTW90aW9uUG9zaXRpb24gPSBtb3Rpb25Qb3NpdGlvbjsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG92ZXJzY3JvbGxCeSgwLCAtaW5jcmVtZW50YWxEZWx0YVksIDAsIG1TY3JvbGxZLCAwLCAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCBtT3ZlcnNjcm9sbERpc3RhbmNlLCB0cnVlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIGludCBvdmVyc2Nyb2xsTW9kZSA9IGdldE92ZXJzY3JvbGxNb2RlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAob3ZlcnNjcm9sbE1vZGUgPT0gT1ZFUlNDUk9MTF9BTFdBWVMgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG92ZXJzY3JvbGxNb2RlID09IE9WRVJTQ1JPTExfSUZfQ09OVEVOVF9TQ1JPTExTICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIWNvbnRlbnRGaXRzKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJhd0RlbHRhWSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUVkZ2VHbG93VG9wLm9uUHVsbCgoZmxvYXQpIC1pbmNyZW1lbnRhbERlbHRhWSAvIGdldEhlaWdodCgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHJhd0RlbHRhWSA8IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUVkZ2VHbG93Qm90dG9tLm9uUHVsbCgoZmxvYXQpIC1pbmNyZW1lbnRhbERlbHRhWSAvIGdldEhlaWdodCgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW52YWxpZGF0ZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKE1hdGguYWJzKG1PdmVyc2Nyb2xsRGlzdGFuY2UpID09IE1hdGguYWJzKG1TY3JvbGxZKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIERvbid0IGFsbG93IG92ZXJmbGluZyBpZiB3ZSdyZSBhdCB0aGUgZWRnZS4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtVmVsb2NpdHlUcmFja2VyLmNsZWFyKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgbUxhc3RZID0geTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIGJyZWFrOwpAQCAtMjM4MSwyOSArMjU4NywxOCBAQAogICAgICAgICAgICAgY2FzZSBUT1VDSF9NT0RFX1NDUk9MTDoKICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgY2hpbGRDb3VudCA9IGdldENoaWxkQ291bnQoKTsKICAgICAgICAgICAgICAgICBpZiAoY2hpbGRDb3VudCA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IGZpcnN0Q2hpbGRUb3AgPSBnZXRDaGlsZEF0KDApLmdldFRvcCgpOwotICAgICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgbGFzdENoaWxkQm90dG9tID0gZ2V0Q2hpbGRBdChjaGlsZENvdW50IC0gMSkuZ2V0Qm90dG9tKCk7Ci0gICAgICAgICAgICAgICAgICAgIGZpbmFsIGludCBjb250ZW50VG9wID0gbUxpc3RQYWRkaW5nLnRvcDsKLSAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IGNvbnRlbnRCb3R0b20gPSBnZXRIZWlnaHQoKSAtIG1MaXN0UGFkZGluZy5ib3R0b207Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtRmlyc3RQb3NpdGlvbiA9PSAwICYmIGZpcnN0Q2hpbGRUb3AgPj0gY29udGVudFRvcCAmJgorICAgICAgICAgICAgICAgICAgICBpZiAobUZpcnN0UG9zaXRpb24gPT0gMCAmJiBnZXRDaGlsZEF0KDApLmdldFRvcCgpID49IG1MaXN0UGFkZGluZy50b3AgJiYKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtRmlyc3RQb3NpdGlvbiArIGNoaWxkQ291bnQgPCBtSXRlbUNvdW50ICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFzdENoaWxkQm90dG9tIDw9IGdldEhlaWdodCgpIC0gY29udGVudEJvdHRvbSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldENoaWxkQXQoY2hpbGRDb3VudCAtIDEpLmdldEJvdHRvbSgpIDw9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRIZWlnaHQoKSAtIG1MaXN0UGFkZGluZy5ib3R0b20pIHsKICAgICAgICAgICAgICAgICAgICAgICAgIG1Ub3VjaE1vZGUgPSBUT1VDSF9NT0RFX1JFU1Q7CiAgICAgICAgICAgICAgICAgICAgICAgICByZXBvcnRTY3JvbGxTdGF0ZUNoYW5nZShPblNjcm9sbExpc3RlbmVyLlNDUk9MTF9TVEFURV9JRExFKTsKICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFZlbG9jaXR5VHJhY2tlciB2ZWxvY2l0eVRyYWNrZXIgPSBtVmVsb2NpdHlUcmFja2VyOwogICAgICAgICAgICAgICAgICAgICAgICAgdmVsb2NpdHlUcmFja2VyLmNvbXB1dGVDdXJyZW50VmVsb2NpdHkoMTAwMCwgbU1heGltdW1WZWxvY2l0eSk7CiAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgaW5pdGlhbFZlbG9jaXR5ID0gKGludCkgdmVsb2NpdHlUcmFja2VyLmdldFlWZWxvY2l0eShtQWN0aXZlUG9pbnRlcklkKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgLy8gRmxpbmcgaWYgd2UgaGF2ZSBlbm91Z2ggdmVsb2NpdHkgYW5kIHdlIGFyZW4ndCBhdCBhIGJvdW5kYXJ5LgotICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2luY2Ugd2UgY2FuIHBvdGVudGlhbGx5IG92ZXJmbGluZyBtb3JlIHRoYW4gd2UgY2FuIG92ZXJzY3JvbGwsIGRvbid0Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBhbGxvdyB0aGUgd2VpcmQgYmVoYXZpb3Igd2hlcmUgeW91IGNhbiBzY3JvbGwgdG8gYSBib3VuZGFyeSB0aGVuCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBmbGluZyBmdXJ0aGVyLgotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKE1hdGguYWJzKGluaXRpYWxWZWxvY2l0eSkgPiBtTWluaW11bVZlbG9jaXR5ICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICEoKG1GaXJzdFBvc2l0aW9uID09IDAgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdENoaWxkVG9wID09IGNvbnRlbnRUb3AgLSBtT3ZlcnNjcm9sbERpc3RhbmNlKSB8fAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtRmlyc3RQb3NpdGlvbiArIGNoaWxkQ291bnQgPT0gbUl0ZW1Db3VudCAmJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhc3RDaGlsZEJvdHRvbSA9PSBjb250ZW50Qm90dG9tICsgbU92ZXJzY3JvbGxEaXN0YW5jZSkpKSB7CisgICAgCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoTWF0aC5hYnMoaW5pdGlhbFZlbG9jaXR5KSA+IG1NaW5pbXVtVmVsb2NpdHkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobUZsaW5nUnVubmFibGUgPT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtRmxpbmdSdW5uYWJsZSA9IG5ldyBGbGluZ1J1bm5hYmxlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQpAQCAtMjQyMCwzMiArMjYxNSwxMCBAQAogICAgICAgICAgICAgICAgICAgICByZXBvcnRTY3JvbGxTdGF0ZUNoYW5nZShPblNjcm9sbExpc3RlbmVyLlNDUk9MTF9TVEFURV9JRExFKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgVE9VQ0hfTU9ERV9PVkVSU0NST0xMOgotICAgICAgICAgICAgICAgIGlmIChtRmxpbmdSdW5uYWJsZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1GbGluZ1J1bm5hYmxlID0gbmV3IEZsaW5nUnVubmFibGUoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZmluYWwgVmVsb2NpdHlUcmFja2VyIHZlbG9jaXR5VHJhY2tlciA9IG1WZWxvY2l0eVRyYWNrZXI7Ci0gICAgICAgICAgICAgICAgdmVsb2NpdHlUcmFja2VyLmNvbXB1dGVDdXJyZW50VmVsb2NpdHkoMTAwMCwgbU1heGltdW1WZWxvY2l0eSk7Ci0gICAgICAgICAgICAgICAgZmluYWwgaW50IGluaXRpYWxWZWxvY2l0eSA9IChpbnQpIHZlbG9jaXR5VHJhY2tlci5nZXRZVmVsb2NpdHkobUFjdGl2ZVBvaW50ZXJJZCk7Ci0KLSAgICAgICAgICAgICAgICByZXBvcnRTY3JvbGxTdGF0ZUNoYW5nZShPblNjcm9sbExpc3RlbmVyLlNDUk9MTF9TVEFURV9GTElORyk7Ci0gICAgICAgICAgICAgICAgaWYgKE1hdGguYWJzKGluaXRpYWxWZWxvY2l0eSkgPiBtTWluaW11bVZlbG9jaXR5KSB7Ci0gICAgICAgICAgICAgICAgICAgIG1GbGluZ1J1bm5hYmxlLnN0YXJ0T3ZlcmZsaW5nKC1pbml0aWFsVmVsb2NpdHkpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIG1GbGluZ1J1bm5hYmxlLnN0YXJ0U3ByaW5nYmFjaygpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBzZXRQcmVzc2VkKGZhbHNlKTsKIAotICAgICAgICAgICAgaWYgKG1FZGdlR2xvd1RvcCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbUVkZ2VHbG93VG9wLm9uUmVsZWFzZSgpOwotICAgICAgICAgICAgICAgIG1FZGdlR2xvd0JvdHRvbS5vblJlbGVhc2UoKTsKLSAgICAgICAgICAgIH0KLQogICAgICAgICAgICAgLy8gTmVlZCB0byByZWRyYXcgc2luY2Ugd2UgcHJvYmFibHkgYXJlbid0IGRyYXdpbmcgdGhlIHNlbGVjdG9yIGFueW1vcmUKICAgICAgICAgICAgIGludmFsaWRhdGUoKTsKIApAQCAtMjQ3MSw0MiArMjY0NCwyNCBAQAogICAgICAgICB9CiAKICAgICAgICAgY2FzZSBNb3Rpb25FdmVudC5BQ1RJT05fQ0FOQ0VMOiB7Ci0gICAgICAgICAgICBzd2l0Y2ggKG1Ub3VjaE1vZGUpIHsKLSAgICAgICAgICAgIGNhc2UgVE9VQ0hfTU9ERV9PVkVSU0NST0xMOgotICAgICAgICAgICAgICAgIGlmIChtRmxpbmdSdW5uYWJsZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1GbGluZ1J1bm5hYmxlID0gbmV3IEZsaW5nUnVubmFibGUoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbUZsaW5nUnVubmFibGUuc3RhcnRTcHJpbmdiYWNrKCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBtVG91Y2hNb2RlID0gVE9VQ0hfTU9ERV9SRVNUOworICAgICAgICAgICAgc2V0UHJlc3NlZChmYWxzZSk7CisgICAgICAgICAgICBWaWV3IG1vdGlvblZpZXcgPSB0aGlzLmdldENoaWxkQXQobU1vdGlvblBvc2l0aW9uIC0gbUZpcnN0UG9zaXRpb24pOworICAgICAgICAgICAgaWYgKG1vdGlvblZpZXcgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG1vdGlvblZpZXcuc2V0UHJlc3NlZChmYWxzZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjbGVhclNjcm9sbGluZ0NhY2hlKCk7CiAKLSAgICAgICAgICAgIGNhc2UgVE9VQ0hfTU9ERV9PVkVSRkxJTkc6Ci0gICAgICAgICAgICAgICAgLy8gRG8gbm90aGluZyAtIGxldCBpdCBwbGF5IG91dC4KLSAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGZpbmFsIEhhbmRsZXIgaGFuZGxlciA9IGdldEhhbmRsZXIoKTsKKyAgICAgICAgICAgIGlmIChoYW5kbGVyICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBoYW5kbGVyLnJlbW92ZUNhbGxiYWNrcyhtUGVuZGluZ0NoZWNrRm9yTG9uZ1ByZXNzKTsKKyAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICBtVG91Y2hNb2RlID0gVE9VQ0hfTU9ERV9SRVNUOwotICAgICAgICAgICAgICAgIHNldFByZXNzZWQoZmFsc2UpOwotICAgICAgICAgICAgICAgIFZpZXcgbW90aW9uVmlldyA9IHRoaXMuZ2V0Q2hpbGRBdChtTW90aW9uUG9zaXRpb24gLSBtRmlyc3RQb3NpdGlvbik7Ci0gICAgICAgICAgICAgICAgaWYgKG1vdGlvblZpZXcgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBtb3Rpb25WaWV3LnNldFByZXNzZWQoZmFsc2UpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjbGVhclNjcm9sbGluZ0NhY2hlKCk7Ci0KLSAgICAgICAgICAgICAgICBmaW5hbCBIYW5kbGVyIGhhbmRsZXIgPSBnZXRIYW5kbGVyKCk7Ci0gICAgICAgICAgICAgICAgaWYgKGhhbmRsZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBoYW5kbGVyLnJlbW92ZUNhbGxiYWNrcyhtUGVuZGluZ0NoZWNrRm9yTG9uZ1ByZXNzKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAobVZlbG9jaXR5VHJhY2tlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1WZWxvY2l0eVRyYWNrZXIucmVjeWNsZSgpOwotICAgICAgICAgICAgICAgICAgICBtVmVsb2NpdHlUcmFja2VyID0gbnVsbDsKLSAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobVZlbG9jaXR5VHJhY2tlciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgbVZlbG9jaXR5VHJhY2tlci5yZWN5Y2xlKCk7CisgICAgICAgICAgICAgICAgbVZlbG9jaXR5VHJhY2tlciA9IG51bGw7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICAKLSAgICAgICAgICAgIGlmIChtRWRnZUdsb3dUb3AgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1FZGdlR2xvd1RvcC5vblJlbGVhc2UoKTsKLSAgICAgICAgICAgICAgICBtRWRnZUdsb3dCb3R0b20ub25SZWxlYXNlKCk7Ci0gICAgICAgICAgICB9CiAgICAgICAgICAgICBtQWN0aXZlUG9pbnRlcklkID0gSU5WQUxJRF9QT0lOVEVSOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KQEAgLTI1MzEsNjEgKzI2ODYsMTAgQEAKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCBvbk92ZXJzY3JvbGxlZChpbnQgc2Nyb2xsWCwgaW50IHNjcm9sbFksCi0gICAgICAgICAgICBib29sZWFuIGNsYW1wZWRYLCBib29sZWFuIGNsYW1wZWRZKSB7Ci0gICAgICAgIG1TY3JvbGxZID0gc2Nyb2xsWTsKLQotICAgICAgICBpZiAoY2xhbXBlZFkpIHsKLSAgICAgICAgICAgIC8vIFZlbG9jaXR5IGlzIGJyb2tlbiBieSBoaXR0aW5nIHRoZSBsaW1pdDsgZG9uJ3Qgc3RhcnQgYSBmbGluZyBvZmYgb2YgdGhpcy4KLSAgICAgICAgICAgIGlmIChtVmVsb2NpdHlUcmFja2VyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtVmVsb2NpdHlUcmFja2VyLmNsZWFyKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgYXdha2VuU2Nyb2xsQmFycygpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIGRyYXcoQ2FudmFzIGNhbnZhcykgewogICAgICAgICBzdXBlci5kcmF3KGNhbnZhcyk7Ci0gICAgICAgIGlmIChtRWRnZUdsb3dUb3AgIT0gbnVsbCkgewotICAgICAgICAgICAgZmluYWwgaW50IHNjcm9sbFkgPSBtU2Nyb2xsWTsKLSAgICAgICAgICAgIGlmICghbUVkZ2VHbG93VG9wLmlzRmluaXNoZWQoKSkgewotICAgICAgICAgICAgICAgIGZpbmFsIGludCByZXN0b3JlQ291bnQgPSBjYW52YXMuc2F2ZSgpOwotICAgICAgICAgICAgICAgIGZpbmFsIGludCB3aWR0aCA9IGdldFdpZHRoKCk7Ci0KLSAgICAgICAgICAgICAgICBjYW52YXMudHJhbnNsYXRlKC13aWR0aCAvIDIsIE1hdGgubWluKDAsIHNjcm9sbFkgKyBtRmlyc3RQb3NpdGlvbkRpc3RhbmNlR3Vlc3MpKTsKLSAgICAgICAgICAgICAgICBtRWRnZUdsb3dUb3Auc2V0U2l6ZSh3aWR0aCAqIDIsIGdldEhlaWdodCgpKTsKLSAgICAgICAgICAgICAgICBpZiAobUVkZ2VHbG93VG9wLmRyYXcoY2FudmFzKSkgewotICAgICAgICAgICAgICAgICAgICBpbnZhbGlkYXRlKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNhbnZhcy5yZXN0b3JlVG9Db3VudChyZXN0b3JlQ291bnQpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKCFtRWRnZUdsb3dCb3R0b20uaXNGaW5pc2hlZCgpKSB7Ci0gICAgICAgICAgICAgICAgZmluYWwgaW50IHJlc3RvcmVDb3VudCA9IGNhbnZhcy5zYXZlKCk7Ci0gICAgICAgICAgICAgICAgZmluYWwgaW50IHdpZHRoID0gZ2V0V2lkdGgoKTsKLSAgICAgICAgICAgICAgICBmaW5hbCBpbnQgaGVpZ2h0ID0gZ2V0SGVpZ2h0KCk7Ci0KLSAgICAgICAgICAgICAgICBjYW52YXMudHJhbnNsYXRlKC13aWR0aCAvIDIsCi0gICAgICAgICAgICAgICAgICAgICAgICBNYXRoLm1heChoZWlnaHQsIHNjcm9sbFkgKyBtTGFzdFBvc2l0aW9uRGlzdGFuY2VHdWVzcykpOwotICAgICAgICAgICAgICAgIGNhbnZhcy5yb3RhdGUoMTgwLCB3aWR0aCwgMCk7Ci0gICAgICAgICAgICAgICAgbUVkZ2VHbG93Qm90dG9tLnNldFNpemUod2lkdGggKiAyLCBoZWlnaHQpOwotICAgICAgICAgICAgICAgIGlmIChtRWRnZUdsb3dCb3R0b20uZHJhdyhjYW52YXMpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGludmFsaWRhdGUoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY2FudmFzLnJlc3RvcmVUb0NvdW50KHJlc3RvcmVDb3VudCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KICAgICAgICAgaWYgKG1GYXN0U2Nyb2xsZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgZmluYWwgaW50IHNjcm9sbFkgPSBtU2Nyb2xsWTsKLSAgICAgICAgICAgIGlmIChzY3JvbGxZICE9IDApIHsKLSAgICAgICAgICAgICAgICAvLyBQaW4gdG8gdGhlIHRvcC9ib3R0b20gZHVyaW5nIG92ZXJzY3JvbGwKLSAgICAgICAgICAgICAgICBpbnQgcmVzdG9yZUNvdW50ID0gY2FudmFzLnNhdmUoKTsKLSAgICAgICAgICAgICAgICBjYW52YXMudHJhbnNsYXRlKDAsIChmbG9hdCkgc2Nyb2xsWSk7Ci0gICAgICAgICAgICAgICAgbUZhc3RTY3JvbGxlci5kcmF3KGNhbnZhcyk7Ci0gICAgICAgICAgICAgICAgY2FudmFzLnJlc3RvcmVUb0NvdW50KHJlc3RvcmVDb3VudCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIG1GYXN0U2Nyb2xsZXIuZHJhdyhjYW52YXMpOwotICAgICAgICAgICAgfQorICAgICAgICAgICAgbUZhc3RTY3JvbGxlci5kcmF3KGNhbnZhcyk7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTI2MDQsMTAgKzI3MDgsNiBAQAogICAgICAgICBzd2l0Y2ggKGFjdGlvbiAmIE1vdGlvbkV2ZW50LkFDVElPTl9NQVNLKSB7CiAgICAgICAgIGNhc2UgTW90aW9uRXZlbnQuQUNUSU9OX0RPV046IHsKICAgICAgICAgICAgIGludCB0b3VjaE1vZGUgPSBtVG91Y2hNb2RlOwotICAgICAgICAgICAgaWYgKHRvdWNoTW9kZSA9PSBUT1VDSF9NT0RFX09WRVJGTElORyB8fCB0b3VjaE1vZGUgPT0gVE9VQ0hfTU9ERV9PVkVSU0NST0xMKSB7Ci0gICAgICAgICAgICAgICAgbU1vdGlvbkNvcnJlY3Rpb24gPSAwOwotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQogICAgICAgICAgICAgCiAgICAgICAgICAgICBmaW5hbCBpbnQgeCA9IChpbnQpIGV2LmdldFgoKTsKICAgICAgICAgICAgIGZpbmFsIGludCB5ID0gKGludCkgZXYuZ2V0WSgpOwpAQCAtMjY3Miw3ICsyNzcyLDYgQEAKICAgICAgICAgICAgIGZpbmFsIGludCBuZXdQb2ludGVySW5kZXggPSBwb2ludGVySW5kZXggPT0gMCA/IDEgOiAwOwogICAgICAgICAgICAgbU1vdGlvblggPSAoaW50KSBldi5nZXRYKG5ld1BvaW50ZXJJbmRleCk7CiAgICAgICAgICAgICBtTW90aW9uWSA9IChpbnQpIGV2LmdldFkobmV3UG9pbnRlckluZGV4KTsKLSAgICAgICAgICAgIG1Nb3Rpb25Db3JyZWN0aW9uID0gMDsKICAgICAgICAgICAgIG1BY3RpdmVQb2ludGVySWQgPSBldi5nZXRQb2ludGVySWQobmV3UG9pbnRlckluZGV4KTsKICAgICAgICAgICAgIGlmIChtVmVsb2NpdHlUcmFja2VyICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICBtVmVsb2NpdHlUcmFja2VyLmNsZWFyKCk7CkBAIC0yNzI4LDcgKzI4MjcsNyBAQAogICAgICAgICAvKioKICAgICAgICAgICogVHJhY2tzIHRoZSBkZWNheSBvZiBhIGZsaW5nIHNjcm9sbAogICAgICAgICAgKi8KLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBPdmVyU2Nyb2xsZXIgbVNjcm9sbGVyOworICAgICAgICBwcml2YXRlIGZpbmFsIFNjcm9sbGVyIG1TY3JvbGxlcjsKIAogICAgICAgICAvKioKICAgICAgICAgICogWSB2YWx1ZSByZXBvcnRlZCBieSBtU2Nyb2xsZXIgb24gdGhlIHByZXZpb3VzIGZsaW5nCkBAIC0yNzM2LDcgKzI4MzUsNyBAQAogICAgICAgICBwcml2YXRlIGludCBtTGFzdEZsaW5nWTsKIAogICAgICAgICBGbGluZ1J1bm5hYmxlKCkgewotICAgICAgICAgICAgbVNjcm9sbGVyID0gbmV3IE92ZXJTY3JvbGxlcihnZXRDb250ZXh0KCkpOworICAgICAgICAgICAgbVNjcm9sbGVyID0gbmV3IFNjcm9sbGVyKGdldENvbnRleHQoKSk7CiAgICAgICAgIH0KIAogICAgICAgICB2b2lkIHN0YXJ0KGludCBpbml0aWFsVmVsb2NpdHkpIHsKQEAgLTI3NTUsNDIgKzI4NTQsNiBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAKLSAgICAgICAgdm9pZCBzdGFydFNwcmluZ2JhY2soKSB7Ci0gICAgICAgICAgICBpZiAobVNjcm9sbGVyLnNwcmluZ2JhY2soMCwgbVNjcm9sbFksIDAsIDAsIDAsIDApKSB7Ci0gICAgICAgICAgICAgICAgbVRvdWNoTW9kZSA9IFRPVUNIX01PREVfT1ZFUkZMSU5HOwotICAgICAgICAgICAgICAgIGludmFsaWRhdGUoKTsKLSAgICAgICAgICAgICAgICBwb3N0KHRoaXMpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBtVG91Y2hNb2RlID0gVE9VQ0hfTU9ERV9SRVNUOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgdm9pZCBzdGFydE92ZXJmbGluZyhpbnQgaW5pdGlhbFZlbG9jaXR5KSB7Ci0gICAgICAgICAgICBmaW5hbCBpbnQgbWluID0gbVNjcm9sbFkgPiAwID8gSW50ZWdlci5NSU5fVkFMVUUgOiAwOwotICAgICAgICAgICAgZmluYWwgaW50IG1heCA9IG1TY3JvbGxZID4gMCA/IDAgOiBJbnRlZ2VyLk1BWF9WQUxVRTsKLSAgICAgICAgICAgIG1TY3JvbGxlci5mbGluZygwLCBtU2Nyb2xsWSwgMCwgaW5pdGlhbFZlbG9jaXR5LCAwLCAwLCBtaW4sIG1heCwgMCwgZ2V0SGVpZ2h0KCkpOwotICAgICAgICAgICAgbVRvdWNoTW9kZSA9IFRPVUNIX01PREVfT1ZFUkZMSU5HOwotICAgICAgICAgICAgaW52YWxpZGF0ZSgpOwotICAgICAgICAgICAgcG9zdCh0aGlzKTsKLSAgICAgICAgfQotCi0gICAgICAgIHZvaWQgZWRnZVJlYWNoZWQoaW50IGRlbHRhKSB7Ci0gICAgICAgICAgICBtU2Nyb2xsZXIubm90aWZ5VmVydGljYWxFZGdlUmVhY2hlZChtU2Nyb2xsWSwgMCwgbU92ZXJmbGluZ0Rpc3RhbmNlKTsKLSAgICAgICAgICAgIGZpbmFsIGludCBvdmVyc2Nyb2xsTW9kZSA9IGdldE92ZXJzY3JvbGxNb2RlKCk7Ci0gICAgICAgICAgICBpZiAob3ZlcnNjcm9sbE1vZGUgPT0gT1ZFUlNDUk9MTF9BTFdBWVMgfHwKLSAgICAgICAgICAgICAgICAgICAgKG92ZXJzY3JvbGxNb2RlID09IE9WRVJTQ1JPTExfSUZfQ09OVEVOVF9TQ1JPTExTICYmICFjb250ZW50Rml0cygpKSkgewotICAgICAgICAgICAgICAgIG1Ub3VjaE1vZGUgPSBUT1VDSF9NT0RFX09WRVJGTElORzsKLSAgICAgICAgICAgICAgICBmaW5hbCBpbnQgdmVsID0gKGludCkgbVNjcm9sbGVyLmdldEN1cnJWZWxvY2l0eSgpOwotICAgICAgICAgICAgICAgIGlmIChkZWx0YSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgbUVkZ2VHbG93VG9wLm9uQWJzb3JiKHZlbCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgbUVkZ2VHbG93Qm90dG9tLm9uQWJzb3JiKHZlbCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgaW52YWxpZGF0ZSgpOwotICAgICAgICAgICAgcG9zdCh0aGlzKTsKLSAgICAgICAgfQotCiAgICAgICAgIHZvaWQgc3RhcnRTY3JvbGwoaW50IGRpc3RhbmNlLCBpbnQgZHVyYXRpb24pIHsKICAgICAgICAgICAgIGludCBpbml0aWFsWSA9IGRpc3RhbmNlIDwgMCA/IEludGVnZXIuTUFYX1ZBTFVFIDogMDsKICAgICAgICAgICAgIG1MYXN0RmxpbmdZID0gaW5pdGlhbFk7CkBAIC0yODIzLDcgKzI4ODYsNyBAQAogICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgZmluYWwgT3ZlclNjcm9sbGVyIHNjcm9sbGVyID0gbVNjcm9sbGVyOworICAgICAgICAgICAgICAgIGZpbmFsIFNjcm9sbGVyIHNjcm9sbGVyID0gbVNjcm9sbGVyOwogICAgICAgICAgICAgICAgIGJvb2xlYW4gbW9yZSA9IHNjcm9sbGVyLmNvbXB1dGVTY3JvbGxPZmZzZXQoKTsKICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgeSA9IHNjcm9sbGVyLmdldEN1cnJZKCk7CiAKQEAgLTI4NTIsMjQgKzI5MTUsNyBAQAogICAgICAgICAgICAgICAgICAgICBkZWx0YSA9IE1hdGgubWF4KC0oZ2V0SGVpZ2h0KCkgLSBtUGFkZGluZ0JvdHRvbSAtIG1QYWRkaW5nVG9wIC0gMSksIGRlbHRhKTsKICAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICAvLyBDaGVjayB0byBzZWUgaWYgd2UgaGF2ZSBidW1wZWQgaW50byB0aGUgc2Nyb2xsIGxpbWl0Ci0gICAgICAgICAgICAgICAgVmlldyBtb3Rpb25WaWV3ID0gZ2V0Q2hpbGRBdChtTW90aW9uUG9zaXRpb24gLSBtRmlyc3RQb3NpdGlvbik7Ci0gICAgICAgICAgICAgICAgaW50IG9sZFRvcCA9IDA7Ci0gICAgICAgICAgICAgICAgaWYgKG1vdGlvblZpZXcgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBvbGRUb3AgPSBtb3Rpb25WaWV3LmdldFRvcCgpOwotICAgICAgICAgICAgICAgIH0KLQogICAgICAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gYXRFbmQgPSB0cmFja01vdGlvblNjcm9sbChkZWx0YSwgZGVsdGEpOwotICAgICAgICAgICAgICAgIGlmIChhdEVuZCkgewotICAgICAgICAgICAgICAgICAgICBpZiAobW90aW9uVmlldyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBUd2VhayB0aGUgc2Nyb2xsIGZvciBob3cgZmFyIHdlIG92ZXJzaG90Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgb3ZlcnNob290ID0gLShkZWx0YSAtIChtb3Rpb25WaWV3LmdldFRvcCgpIC0gb2xkVG9wKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvdmVyc2Nyb2xsQnkoMCwgb3ZlcnNob290LCAwLCBtU2Nyb2xsWSwgMCwgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgbU92ZXJmbGluZ0Rpc3RhbmNlLCBmYWxzZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWRnZVJlYWNoZWQoZGVsdGEpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICBpZiAobW9yZSAmJiAhYXRFbmQpIHsKICAgICAgICAgICAgICAgICAgICAgaW52YWxpZGF0ZSgpOwpAQCAtMjg4NywyNCArMjkzMyw2IEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIFRPVUNIX01PREVfT1ZFUkZMSU5HOiB7Ci0gICAgICAgICAgICAgICAgZmluYWwgT3ZlclNjcm9sbGVyIHNjcm9sbGVyID0gbVNjcm9sbGVyOwotICAgICAgICAgICAgICAgIGlmIChzY3JvbGxlci5jb21wdXRlU2Nyb2xsT2Zmc2V0KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IHNjcm9sbFkgPSBtU2Nyb2xsWTsKLSAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IGRlbHRhWSA9IHNjcm9sbGVyLmdldEN1cnJZKCkgLSBzY3JvbGxZOwotICAgICAgICAgICAgICAgICAgICBpZiAob3ZlcnNjcm9sbEJ5KDAsIGRlbHRhWSwgMCwgc2Nyb2xsWSwgMCwgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCBtT3ZlcmZsaW5nRGlzdGFuY2UsIGZhbHNlKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRTcHJpbmdiYWNrKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbnZhbGlkYXRlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwb3N0KHRoaXMpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgZW5kRmxpbmcoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAKICAgICAgICAgfQpAQCAtMjkxOCw2ICsyOTQ2LDcgQEAKICAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1PVkVfVVBfUE9TID0gMjsKICAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1PVkVfRE9XTl9CT1VORCA9IDM7CiAgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNT1ZFX1VQX0JPVU5EID0gNDsKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1PVkVfT0ZGU0VUID0gNTsKICAgICAgICAgCiAgICAgICAgIHByaXZhdGUgaW50IG1Nb2RlOwogICAgICAgICBwcml2YXRlIGludCBtVGFyZ2V0UG9zOwpAQCAtMjkyNSw2ICsyOTU0LDggQEAKICAgICAgICAgcHJpdmF0ZSBpbnQgbUxhc3RTZWVuUG9zOwogICAgICAgICBwcml2YXRlIGludCBtU2Nyb2xsRHVyYXRpb247CiAgICAgICAgIHByaXZhdGUgZmluYWwgaW50IG1FeHRyYVNjcm9sbDsKKworICAgICAgICBwcml2YXRlIGludCBtT2Zmc2V0RnJvbVRvcDsKICAgICAgICAgCiAgICAgICAgIFBvc2l0aW9uU2Nyb2xsZXIoKSB7CiAgICAgICAgICAgICBtRXh0cmFTY3JvbGwgPSBWaWV3Q29uZmlndXJhdGlvbi5nZXQobUNvbnRleHQpLmdldFNjYWxlZEZhZGluZ0VkZ2VMZW5ndGgoKTsKQEAgLTMwMTYsMTIgKzMwNDcsNDggQEAKICAgICAgICAgICAgIAogICAgICAgICAgICAgcG9zdCh0aGlzKTsKICAgICAgICAgfQotICAgICAgICAKKworICAgICAgICB2b2lkIHN0YXJ0V2l0aE9mZnNldChpbnQgcG9zaXRpb24sIGludCBvZmZzZXQpIHsKKyAgICAgICAgICAgIG1UYXJnZXRQb3MgPSBwb3NpdGlvbjsKKyAgICAgICAgICAgIG1PZmZzZXRGcm9tVG9wID0gb2Zmc2V0OworICAgICAgICAgICAgbUJvdW5kUG9zID0gSU5WQUxJRF9QT1NJVElPTjsKKyAgICAgICAgICAgIG1MYXN0U2VlblBvcyA9IElOVkFMSURfUE9TSVRJT047CisgICAgICAgICAgICBtTW9kZSA9IE1PVkVfT0ZGU0VUOworCisgICAgICAgICAgICBmaW5hbCBpbnQgZmlyc3RQb3MgPSBtRmlyc3RQb3NpdGlvbjsKKyAgICAgICAgICAgIGZpbmFsIGludCBjaGlsZENvdW50ID0gZ2V0Q2hpbGRDb3VudCgpOworICAgICAgICAgICAgZmluYWwgaW50IGxhc3RQb3MgPSBmaXJzdFBvcyArIGNoaWxkQ291bnQgLSAxOworCisgICAgICAgICAgICBpbnQgdmlld1RyYXZlbENvdW50ID0gMDsKKyAgICAgICAgICAgIGlmIChwb3NpdGlvbiA8IGZpcnN0UG9zKSB7CisgICAgICAgICAgICAgICAgdmlld1RyYXZlbENvdW50ID0gZmlyc3RQb3MgLSBwb3NpdGlvbjsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAocG9zaXRpb24gPiBsYXN0UG9zKSB7CisgICAgICAgICAgICAgICAgdmlld1RyYXZlbENvdW50ID0gcG9zaXRpb24gLSBsYXN0UG9zOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvLyBPbi1zY3JlZW4sIGp1c3Qgc2Nyb2xsLgorICAgICAgICAgICAgICAgIGZpbmFsIGludCB0YXJnZXRUb3AgPSBnZXRDaGlsZEF0KHBvc2l0aW9uIC0gZmlyc3RQb3MpLmdldFRvcCgpOworICAgICAgICAgICAgICAgIHNtb290aFNjcm9sbEJ5KHRhcmdldFRvcCAtIG9mZnNldCwgU0NST0xMX0RVUkFUSU9OKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIEVzdGltYXRlIGhvdyBtYW55IHNjcmVlbnMgd2Ugc2hvdWxkIHRyYXZlbAorICAgICAgICAgICAgZmluYWwgZmxvYXQgc2NyZWVuVHJhdmVsQ291bnQgPSAoZmxvYXQpIHZpZXdUcmF2ZWxDb3VudCAvIGNoaWxkQ291bnQ7CisgICAgICAgICAgICBtU2Nyb2xsRHVyYXRpb24gPSBzY3JlZW5UcmF2ZWxDb3VudCA8IDEgPyAoaW50KSAoc2NyZWVuVHJhdmVsQ291bnQgKiBTQ1JPTExfRFVSQVRJT04pIDoKKyAgICAgICAgICAgICAgICAgICAgKGludCkgKFNDUk9MTF9EVVJBVElPTiAvIHNjcmVlblRyYXZlbENvdW50KTsKKyAgICAgICAgICAgIG1MYXN0U2VlblBvcyA9IElOVkFMSURfUE9TSVRJT047CisKKyAgICAgICAgICAgIHBvc3QodGhpcyk7CisgICAgICAgIH0KKwogICAgICAgICB2b2lkIHN0b3AoKSB7CiAgICAgICAgICAgICByZW1vdmVDYWxsYmFja3ModGhpcyk7CiAgICAgICAgIH0KLSAgICAgICAgCisKICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgaWYgKG1Ub3VjaE1vZGUgIT0gVE9VQ0hfTU9ERV9GTElORyAmJiBtTGFzdFNlZW5Qb3MgIT0gSU5WQUxJRF9QT1NJVElPTikgeworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgZmluYWwgaW50IGxpc3RIZWlnaHQgPSBnZXRIZWlnaHQoKTsKICAgICAgICAgICAgIGZpbmFsIGludCBmaXJzdFBvcyA9IG1GaXJzdFBvc2l0aW9uOwogICAgICAgICAgICAgCkBAIC0zMTQ2LDYgKzMyMTMsMzUgQEAKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KIAorICAgICAgICAgICAgY2FzZSBNT1ZFX09GRlNFVDogeworICAgICAgICAgICAgICAgIGlmIChtTGFzdFNlZW5Qb3MgPT0gZmlyc3RQb3MpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gTm8gbmV3IHZpZXdzLCBsZXQgdGhpbmdzIGtlZXAgZ29pbmcuCisgICAgICAgICAgICAgICAgICAgIHBvc3QodGhpcyk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBtTGFzdFNlZW5Qb3MgPSBmaXJzdFBvczsKKworICAgICAgICAgICAgICAgIGZpbmFsIGludCBjaGlsZENvdW50ID0gZ2V0Q2hpbGRDb3VudCgpOworICAgICAgICAgICAgICAgIGZpbmFsIGludCBwb3NpdGlvbiA9IG1UYXJnZXRQb3M7CisgICAgICAgICAgICAgICAgZmluYWwgaW50IGxhc3RQb3MgPSBmaXJzdFBvcyArIGNoaWxkQ291bnQgLSAxOworCisgICAgICAgICAgICAgICAgaWYgKHBvc2l0aW9uIDwgZmlyc3RQb3MpIHsKKyAgICAgICAgICAgICAgICAgICAgc21vb3RoU2Nyb2xsQnkoLWdldEhlaWdodCgpLCBtU2Nyb2xsRHVyYXRpb24pOworICAgICAgICAgICAgICAgICAgICBwb3N0KHRoaXMpOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocG9zaXRpb24gPiBsYXN0UG9zKSB7CisgICAgICAgICAgICAgICAgICAgIHNtb290aFNjcm9sbEJ5KGdldEhlaWdodCgpLCBtU2Nyb2xsRHVyYXRpb24pOworICAgICAgICAgICAgICAgICAgICBwb3N0KHRoaXMpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIC8vIE9uLXNjcmVlbiwganVzdCBzY3JvbGwuCisgICAgICAgICAgICAgICAgICAgIGZpbmFsIGludCB0YXJnZXRUb3AgPSBnZXRDaGlsZEF0KHBvc2l0aW9uIC0gZmlyc3RQb3MpLmdldFRvcCgpOworICAgICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgZGlzdGFuY2UgPSB0YXJnZXRUb3AgLSBtT2Zmc2V0RnJvbVRvcDsKKyAgICAgICAgICAgICAgICAgICAgc21vb3RoU2Nyb2xsQnkoZGlzdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludCkgKG1TY3JvbGxEdXJhdGlvbiAqICgoZmxvYXQpIGRpc3RhbmNlIC8gZ2V0SGVpZ2h0KCkpKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCiAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQpAQCAtMzE2NSw2ICszMjYxLDI0IEBACiAgICAgfQogICAgIAogICAgIC8qKgorICAgICAqIFNtb290aGx5IHNjcm9sbCB0byB0aGUgc3BlY2lmaWVkIGFkYXB0ZXIgcG9zaXRpb24uIFRoZSB2aWV3IHdpbGwgc2Nyb2xsCisgICAgICogc3VjaCB0aGF0IHRoZSBpbmRpY2F0ZWQgcG9zaXRpb24gaXMgZGlzcGxheWVkIDxjb2RlPm9mZnNldDwvY29kZT4gcGl4ZWxzIGZyb20KKyAgICAgKiB0aGUgdG9wIGVkZ2Ugb2YgdGhlIHZpZXcuIElmIHRoaXMgaXMgaW1wb3NzaWJsZSwgKGUuZy4gdGhlIG9mZnNldCB3b3VsZCBzY3JvbGwKKyAgICAgKiB0aGUgZmlyc3Qgb3IgbGFzdCBpdGVtIGJleW9uZCB0aGUgYm91bmRhcmllcyBvZiB0aGUgbGlzdCkgaXQgd2lsbCBnZXQgYXMgY2xvc2UKKyAgICAgKiBhcyBwb3NzaWJsZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwb3NpdGlvbiBQb3NpdGlvbiB0byBzY3JvbGwgdG8KKyAgICAgKiBAcGFyYW0gb2Zmc2V0IERlc2lyZWQgZGlzdGFuY2UgaW4gcGl4ZWxzIG9mIDxjb2RlPnBvc2l0aW9uPC9jb2RlPiBmcm9tIHRoZSB0b3AKKyAgICAgKiAgICAgICAgICAgICAgIG9mIHRoZSB2aWV3IHdoZW4gc2Nyb2xsaW5nIGlzIGZpbmlzaGVkCisgICAgICovCisgICAgcHVibGljIHZvaWQgc21vb3RoU2Nyb2xsVG9Qb3NpdGlvbkZyb21Ub3AoaW50IHBvc2l0aW9uLCBpbnQgb2Zmc2V0KSB7CisgICAgICAgIGlmIChtUG9zaXRpb25TY3JvbGxlciA9PSBudWxsKSB7CisgICAgICAgICAgICBtUG9zaXRpb25TY3JvbGxlciA9IG5ldyBQb3NpdGlvblNjcm9sbGVyKCk7CisgICAgICAgIH0KKyAgICAgICAgbVBvc2l0aW9uU2Nyb2xsZXIuc3RhcnRXaXRoT2Zmc2V0KHBvc2l0aW9uLCBvZmZzZXQpOworICAgIH0KKworICAgIC8qKgogICAgICAqIFNtb290aGx5IHNjcm9sbCB0byB0aGUgc3BlY2lmaWVkIGFkYXB0ZXIgcG9zaXRpb24uIFRoZSB2aWV3IHdpbGwKICAgICAgKiBzY3JvbGwgc3VjaCB0aGF0IHRoZSBpbmRpY2F0ZWQgcG9zaXRpb24gaXMgZGlzcGxheWVkLCBidXQgaXQgd2lsbAogICAgICAqIHN0b3AgZWFybHkgaWYgc2Nyb2xsaW5nIGZ1cnRoZXIgd291bGQgc2Nyb2xsIGJvdW5kUG9zaXRpb24gb3V0IG9mCkBAIC0zMTk0LDYgKzMzMDgsNDIgQEAKICAgICAgICAgbUZsaW5nUnVubmFibGUuc3RhcnRTY3JvbGwoZGlzdGFuY2UsIGR1cmF0aW9uKTsKICAgICB9CiAKKyAgICAvKioKKyAgICAgKiBBbGxvd3MgUmVtb3RlVmlld3MgdG8gc2Nyb2xsIHJlbGF0aXZlbHkgdG8gYSBwb3NpdGlvbi4KKyAgICAgKi8KKyAgICB2b2lkIHNtb290aFNjcm9sbEJ5T2Zmc2V0KGludCBwb3NpdGlvbikgeworICAgICAgICBpbnQgaW5kZXggPSAtMTsKKyAgICAgICAgaWYgKHBvc2l0aW9uIDwgMCkgeworICAgICAgICAgICAgaW5kZXggPSBnZXRGaXJzdFZpc2libGVQb3NpdGlvbigpOworICAgICAgICB9IGVsc2UgaWYgKHBvc2l0aW9uID4gMCkgeworICAgICAgICAgICAgaW5kZXggPSBnZXRMYXN0VmlzaWJsZVBvc2l0aW9uKCk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoaW5kZXggPiAtMSkgeworICAgICAgICAgICAgVmlldyBjaGlsZCA9IGdldENoaWxkQXQoaW5kZXggLSBnZXRGaXJzdFZpc2libGVQb3NpdGlvbigpKTsKKyAgICAgICAgICAgIGlmIChjaGlsZCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgUmVjdCB2aXNpYmxlUmVjdCA9IG5ldyBSZWN0KCk7CisgICAgICAgICAgICAgICAgaWYgKGNoaWxkLmdldEdsb2JhbFZpc2libGVSZWN0KHZpc2libGVSZWN0KSkgeworICAgICAgICAgICAgICAgICAgICAvLyB0aGUgY2hpbGQgaXMgcGFydGlhbGx5IHZpc2libGUKKyAgICAgICAgICAgICAgICAgICAgaW50IGNoaWxkUmVjdEFyZWEgPSBjaGlsZC5nZXRXaWR0aCgpICogY2hpbGQuZ2V0SGVpZ2h0KCk7CisgICAgICAgICAgICAgICAgICAgIGludCB2aXNpYmxlUmVjdEFyZWEgPSB2aXNpYmxlUmVjdC53aWR0aCgpICogdmlzaWJsZVJlY3QuaGVpZ2h0KCk7CisgICAgICAgICAgICAgICAgICAgIGZsb2F0IHZpc2libGVBcmVhID0gKHZpc2libGVSZWN0QXJlYSAvIChmbG9hdCkgY2hpbGRSZWN0QXJlYSk7CisgICAgICAgICAgICAgICAgICAgIGZpbmFsIGZsb2F0IHZpc2libGVUaHJlc2hvbGQgPSAwLjc1ZjsKKyAgICAgICAgICAgICAgICAgICAgaWYgKChwb3NpdGlvbiA8IDApICYmICh2aXNpYmxlQXJlYSA8IHZpc2libGVUaHJlc2hvbGQpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgdG9wIGluZGV4IGlzIG5vdCBwZXJjZWl2YWJseSB2aXNpYmxlIHNvIG9mZnNldAorICAgICAgICAgICAgICAgICAgICAgICAgLy8gdG8gYWNjb3VudCBmb3Igc2hvd2luZyB0aGF0IHRvcCBpbmRleCBhcyB3ZWxsCisgICAgICAgICAgICAgICAgICAgICAgICArK2luZGV4OworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKChwb3NpdGlvbiA+IDApICYmICh2aXNpYmxlQXJlYSA8IHZpc2libGVUaHJlc2hvbGQpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgYm90dG9tIGluZGV4IGlzIG5vdCBwZXJjZWl2YWJseSB2aXNpYmxlIHNvIG9mZnNldAorICAgICAgICAgICAgICAgICAgICAgICAgLy8gdG8gYWNjb3VudCBmb3Igc2hvd2luZyB0aGF0IGJvdHRvbSBpbmRleCBhcyB3ZWxsCisgICAgICAgICAgICAgICAgICAgICAgICAtLWluZGV4OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHNtb290aFNjcm9sbFRvUG9zaXRpb24oTWF0aC5tYXgoMCwgTWF0aC5taW4oZ2V0Q291bnQoKSwgaW5kZXggKyBwb3NpdGlvbikpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKwogICAgIHByaXZhdGUgdm9pZCBjcmVhdGVTY3JvbGxpbmdDYWNoZSgpIHsKICAgICAgICAgaWYgKG1TY3JvbGxpbmdDYWNoZUVuYWJsZWQgJiYgIW1DYWNoaW5nU3RhcnRlZCkgewogICAgICAgICAgICAgc2V0Q2hpbGRyZW5EcmF3bldpdGhDYWNoZUVuYWJsZWQodHJ1ZSk7CkBAIC0zMjYxLDI5ICszNDExLDE2IEBACiAKICAgICAgICAgZmluYWwgaW50IGZpcnN0UG9zaXRpb24gPSBtRmlyc3RQb3NpdGlvbjsKIAotICAgICAgICAvLyBVcGRhdGUgb3VyIGd1ZXNzZXMgZm9yIHdoZXJlIHRoZSBmaXJzdCBhbmQgbGFzdCB2aWV3cyBhcmUKLSAgICAgICAgaWYgKGZpcnN0UG9zaXRpb24gPT0gMCkgewotICAgICAgICAgICAgbUZpcnN0UG9zaXRpb25EaXN0YW5jZUd1ZXNzID0gZmlyc3RUb3AgLSBtTGlzdFBhZGRpbmcudG9wOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbUZpcnN0UG9zaXRpb25EaXN0YW5jZUd1ZXNzICs9IGluY3JlbWVudGFsRGVsdGFZOwotICAgICAgICB9Ci0gICAgICAgIGlmIChmaXJzdFBvc2l0aW9uICsgY2hpbGRDb3VudCA9PSBtSXRlbUNvdW50KSB7Ci0gICAgICAgICAgICBtTGFzdFBvc2l0aW9uRGlzdGFuY2VHdWVzcyA9IGxhc3RCb3R0b20gKyBtTGlzdFBhZGRpbmcuYm90dG9tOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbUxhc3RQb3NpdGlvbkRpc3RhbmNlR3Vlc3MgKz0gaW5jcmVtZW50YWxEZWx0YVk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoZmlyc3RQb3NpdGlvbiA9PSAwICYmIGZpcnN0VG9wID49IGxpc3RQYWRkaW5nLnRvcCAmJiBpbmNyZW1lbnRhbERlbHRhWSA+PSAwKSB7CisgICAgICAgIGlmIChmaXJzdFBvc2l0aW9uID09IDAgJiYgZmlyc3RUb3AgPj0gbGlzdFBhZGRpbmcudG9wICYmIGRlbHRhWSA+PSAwKSB7CiAgICAgICAgICAgICAvLyBEb24ndCBuZWVkIHRvIG1vdmUgdmlld3MgZG93biBpZiB0aGUgdG9wIG9mIHRoZSBmaXJzdCBwb3NpdGlvbgogICAgICAgICAgICAgLy8gaXMgYWxyZWFkeSB2aXNpYmxlCi0gICAgICAgICAgICByZXR1cm4gaW5jcmVtZW50YWxEZWx0YVkgIT0gMDsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICB9CiAKLSAgICAgICAgaWYgKGZpcnN0UG9zaXRpb24gKyBjaGlsZENvdW50ID09IG1JdGVtQ291bnQgJiYgbGFzdEJvdHRvbSA8PSBlbmQgJiYKLSAgICAgICAgICAgICAgICBpbmNyZW1lbnRhbERlbHRhWSA8PSAwKSB7CisgICAgICAgIGlmIChmaXJzdFBvc2l0aW9uICsgY2hpbGRDb3VudCA9PSBtSXRlbUNvdW50ICYmIGxhc3RCb3R0b20gPD0gZW5kICYmIGRlbHRhWSA8PSAwKSB7CiAgICAgICAgICAgICAvLyBEb24ndCBuZWVkIHRvIG1vdmUgdmlld3MgdXAgaWYgdGhlIGJvdHRvbSBvZiB0aGUgbGFzdCBwb3NpdGlvbgogICAgICAgICAgICAgLy8gaXMgYWxyZWFkeSB2aXNpYmxlCi0gICAgICAgICAgICByZXR1cm4gaW5jcmVtZW50YWxEZWx0YVkgIT0gMDsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICB9CiAKICAgICAgICAgZmluYWwgYm9vbGVhbiBkb3duID0gaW5jcmVtZW50YWxEZWx0YVkgPCAwOwpAQCAtMzU2NSw2ICszNzAyLDcgQEAKIAogICAgICAgICBtUmVzdXJyZWN0VG9Qb3NpdGlvbiA9IElOVkFMSURfUE9TSVRJT047CiAgICAgICAgIHJlbW92ZUNhbGxiYWNrcyhtRmxpbmdSdW5uYWJsZSk7CisgICAgICAgIHJlbW92ZUNhbGxiYWNrcyhtUG9zaXRpb25TY3JvbGxlcik7CiAgICAgICAgIG1Ub3VjaE1vZGUgPSBUT1VDSF9NT0RFX1JFU1Q7CiAgICAgICAgIGNsZWFyU2Nyb2xsaW5nQ2FjaGUoKTsKICAgICAgICAgbVNwZWNpZmljVG9wID0gc2VsZWN0ZWRUb3A7CkBAIC00MTA3LDcgKzQyNDUsMTEgQEAKIAogICAgIC8qKgogICAgICAqIFdoZW4gc2V0IHRvIGEgbm9uLXplcm8gdmFsdWUsIHRoZSBjYWNoZSBjb2xvciBoaW50IGluZGljYXRlcyB0aGF0IHRoaXMgbGlzdCBpcyBhbHdheXMgZHJhd24KLSAgICAgKiBvbiB0b3Agb2YgYSBzb2xpZCwgc2luZ2xlLWNvbG9yLCBvcGFxdWUgYmFja2dyb3VuZAorICAgICAqIG9uIHRvcCBvZiBhIHNvbGlkLCBzaW5nbGUtY29sb3IsIG9wYXF1ZSBiYWNrZ3JvdW5kLgorICAgICAqCisgICAgICogWmVybyBtZWFucyB0aGF0IHdoYXQncyBiZWhpbmQgdGhpcyBvYmplY3QgaXMgdHJhbnNsdWNlbnQgKG5vbiBzb2xpZCkgb3IgaXMgbm90IG1hZGUgb2YgYQorICAgICAqIHNpbmdsZSBjb2xvci4gVGhpcyBoaW50IHdpbGwgbm90IGFmZmVjdCBhbnkgZXhpc3RpbmcgYmFja2dyb3VuZCBkcmF3YWJsZSBzZXQgb24gdGhpcyB2aWV3ICgKKyAgICAgKiB0eXBpY2FsbHkgc2V0IHZpYSB7QGxpbmsgI3NldEJhY2tncm91bmREcmF3YWJsZShEcmF3YWJsZSl9KS4KICAgICAgKgogICAgICAqIEBwYXJhbSBjb2xvciBUaGUgYmFja2dyb3VuZCBjb2xvcgogICAgICAqLwpAQCAtNDIxNywxMCArNDM1OSwzMSBAQAogICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgIH0KIAotICAgIHByaXZhdGUgdm9pZCBmaW5pc2hHbG93cygpIHsKLSAgICAgICAgaWYgKG1FZGdlR2xvd1RvcCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtRWRnZUdsb3dUb3AuZmluaXNoKCk7Ci0gICAgICAgICAgICBtRWRnZUdsb3dCb3R0b20uZmluaXNoKCk7CisgICAgLyoqCisgICAgICogU2V0cyB1cCB0aGlzIEFic0xpc3RWaWV3IHRvIHVzZSBhIHJlbW90ZSB2aWV3cyBhZGFwdGVyIHdoaWNoIGNvbm5lY3RzIHRvIGEgUmVtb3RlVmlld3NTZXJ2aWNlCisgICAgICogdGhyb3VnaCB0aGUgc3BlY2lmaWVkIGludGVudC4KKyAgICAgKiBAcGFyYW0gaW50ZW50IHRoZSBpbnRlbnQgdXNlZCB0byBpZGVudGlmeSB0aGUgUmVtb3RlVmlld3NTZXJ2aWNlIGZvciB0aGUgYWRhcHRlciB0byBjb25uZWN0IHRvLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFJlbW90ZVZpZXdzQWRhcHRlcihJbnRlbnQgaW50ZW50KSB7CisgICAgICAgIG1SZW1vdGVBZGFwdGVyID0gbmV3IFJlbW90ZVZpZXdzQWRhcHRlcihnZXRDb250ZXh0KCksIGludGVudCwgdGhpcyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2FsbGVkIGJhY2sgd2hlbiB0aGUgYWRhcHRlciBjb25uZWN0cyB0byB0aGUgUmVtb3RlVmlld3NTZXJ2aWNlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIG9uUmVtb3RlQWRhcHRlckNvbm5lY3RlZCgpIHsKKyAgICAgICAgaWYgKG1SZW1vdGVBZGFwdGVyICE9IG1BZGFwdGVyKSB7CisgICAgICAgICAgICBzZXRBZGFwdGVyKG1SZW1vdGVBZGFwdGVyKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIENhbGxlZCBiYWNrIHdoZW4gdGhlIGFkYXB0ZXIgZGlzY29ubmVjdHMgZnJvbSB0aGUgUmVtb3RlVmlld3NTZXJ2aWNlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIG9uUmVtb3RlQWRhcHRlckRpc2Nvbm5lY3RlZCgpIHsKKyAgICAgICAgaWYgKG1SZW1vdGVBZGFwdGVyID09IG1BZGFwdGVyKSB7CisgICAgICAgICAgICBtUmVtb3RlQWRhcHRlciA9IG51bGw7CisgICAgICAgICAgICBzZXRBZGFwdGVyKG51bGwpOwogICAgICAgICB9CiAgICAgfQogCkBAIC00MjQwLDYgKzQ0MDMsNzUgQEAKICAgICB9CiAKICAgICAvKioKKyAgICAgKiBBIE11bHRpQ2hvaWNlTW9kZUxpc3RlbmVyIHJlY2VpdmVzIGV2ZW50cyBmb3Ige0BsaW5rIEFic0xpc3RWaWV3I0NIT0lDRV9NT0RFX01VTFRJUExFX01PREFMfS4KKyAgICAgKiBJdCBhY3RzIGFzIHRoZSB7QGxpbmsgQWN0aW9uTW9kZS5DYWxsYmFja30gZm9yIHRoZSBzZWxlY3Rpb24gbW9kZSBhbmQgYWxzbyByZWNlaXZlcworICAgICAqIHtAbGluayAjb25JdGVtQ2hlY2tlZFN0YXRlQ2hhbmdlZChBY3Rpb25Nb2RlLCBpbnQsIGxvbmcsIGJvb2xlYW4pfSBldmVudHMgd2hlbiB0aGUgdXNlcgorICAgICAqIHNlbGVjdHMgYW5kIGRlc2VsZWN0cyBsaXN0IGl0ZW1zLgorICAgICAqLworICAgIHB1YmxpYyBpbnRlcmZhY2UgTXVsdGlDaG9pY2VNb2RlTGlzdGVuZXIgZXh0ZW5kcyBBY3Rpb25Nb2RlLkNhbGxiYWNrIHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIENhbGxlZCB3aGVuIGFuIGl0ZW0gaXMgY2hlY2tlZCBvciB1bmNoZWNrZWQgZHVyaW5nIHNlbGVjdGlvbiBtb2RlLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gbW9kZSBUaGUge0BsaW5rIEFjdGlvbk1vZGV9IHByb3ZpZGluZyB0aGUgc2VsZWN0aW9uIG1vZGUKKyAgICAgICAgICogQHBhcmFtIHBvc2l0aW9uIEFkYXB0ZXIgcG9zaXRpb24gb2YgdGhlIGl0ZW0gdGhhdCB3YXMgY2hlY2tlZCBvciB1bmNoZWNrZWQKKyAgICAgICAgICogQHBhcmFtIGlkIEFkYXB0ZXIgSUQgb2YgdGhlIGl0ZW0gdGhhdCB3YXMgY2hlY2tlZCBvciB1bmNoZWNrZWQKKyAgICAgICAgICogQHBhcmFtIGNoZWNrZWQgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGl0ZW0gaXMgbm93IGNoZWNrZWQsIDxjb2RlPmZhbHNlPC9jb2RlPgorICAgICAgICAgKiAgICAgICAgICAgICAgICBpZiB0aGUgaXRlbSBpcyBub3cgdW5jaGVja2VkLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgb25JdGVtQ2hlY2tlZFN0YXRlQ2hhbmdlZChBY3Rpb25Nb2RlIG1vZGUsCisgICAgICAgICAgICAgICAgaW50IHBvc2l0aW9uLCBsb25nIGlkLCBib29sZWFuIGNoZWNrZWQpOworICAgIH0KKworICAgIGNsYXNzIE11bHRpQ2hvaWNlTW9kZVdyYXBwZXIgaW1wbGVtZW50cyBNdWx0aUNob2ljZU1vZGVMaXN0ZW5lciB7CisgICAgICAgIHByaXZhdGUgTXVsdGlDaG9pY2VNb2RlTGlzdGVuZXIgbVdyYXBwZWQ7CisKKyAgICAgICAgcHVibGljIHZvaWQgc2V0V3JhcHBlZChNdWx0aUNob2ljZU1vZGVMaXN0ZW5lciB3cmFwcGVkKSB7CisgICAgICAgICAgICBtV3JhcHBlZCA9IHdyYXBwZWQ7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYm9vbGVhbiBvbkNyZWF0ZUFjdGlvbk1vZGUoQWN0aW9uTW9kZSBtb2RlLCBNZW51IG1lbnUpIHsKKyAgICAgICAgICAgIGlmIChtV3JhcHBlZC5vbkNyZWF0ZUFjdGlvbk1vZGUobW9kZSwgbWVudSkpIHsKKyAgICAgICAgICAgICAgICAvLyBJbml0aWFsaXplIGNoZWNrZWQgZ3JhcGhpYyBzdGF0ZT8KKyAgICAgICAgICAgICAgICBzZXRMb25nQ2xpY2thYmxlKGZhbHNlKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBib29sZWFuIG9uUHJlcGFyZUFjdGlvbk1vZGUoQWN0aW9uTW9kZSBtb2RlLCBNZW51IG1lbnUpIHsKKyAgICAgICAgICAgIHJldHVybiBtV3JhcHBlZC5vblByZXBhcmVBY3Rpb25Nb2RlKG1vZGUsIG1lbnUpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGJvb2xlYW4gb25BY3Rpb25JdGVtQ2xpY2tlZChBY3Rpb25Nb2RlIG1vZGUsIE1lbnVJdGVtIGl0ZW0pIHsKKyAgICAgICAgICAgIHJldHVybiBtV3JhcHBlZC5vbkFjdGlvbkl0ZW1DbGlja2VkKG1vZGUsIGl0ZW0pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgb25EZXN0cm95QWN0aW9uTW9kZShBY3Rpb25Nb2RlIG1vZGUpIHsKKyAgICAgICAgICAgIG1XcmFwcGVkLm9uRGVzdHJveUFjdGlvbk1vZGUobW9kZSk7CisgICAgICAgICAgICBtQ2hvaWNlQWN0aW9uTW9kZSA9IG51bGw7CisKKyAgICAgICAgICAgIC8vIEVuZGluZyBzZWxlY3Rpb24gbW9kZSBtZWFucyBkZXNlbGVjdGluZyBldmVyeXRoaW5nLgorICAgICAgICAgICAgY2xlYXJDaG9pY2VzKCk7CisKKyAgICAgICAgICAgIG1EYXRhQ2hhbmdlZCA9IHRydWU7CisgICAgICAgICAgICByZW1lbWJlclN5bmNTdGF0ZSgpOworICAgICAgICAgICAgcmVxdWVzdExheW91dCgpOworCisgICAgICAgICAgICBzZXRMb25nQ2xpY2thYmxlKHRydWUpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgb25JdGVtQ2hlY2tlZFN0YXRlQ2hhbmdlZChBY3Rpb25Nb2RlIG1vZGUsCisgICAgICAgICAgICAgICAgaW50IHBvc2l0aW9uLCBsb25nIGlkLCBib29sZWFuIGNoZWNrZWQpIHsKKyAgICAgICAgICAgIG1XcmFwcGVkLm9uSXRlbUNoZWNrZWRTdGF0ZUNoYW5nZWQobW9kZSwgcG9zaXRpb24sIGlkLCBjaGVja2VkKTsKKworICAgICAgICAgICAgLy8gSWYgdGhlcmUgYXJlIG5vIGl0ZW1zIHNlbGVjdGVkIHdlIG5vIGxvbmdlciBuZWVkIHRoZSBzZWxlY3Rpb24gbW9kZS4KKyAgICAgICAgICAgIGlmIChnZXRDaGVja2VkSXRlbUNvdW50KCkgPT0gMCkgeworICAgICAgICAgICAgICAgIG1vZGUuZmluaXNoKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKICAgICAgKiBBYnNMaXN0VmlldyBleHRlbmRzIExheW91dFBhcmFtcyB0byBwcm92aWRlIGEgcGxhY2UgdG8gaG9sZCB0aGUgdmlldyB0eXBlLgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgTGF5b3V0UGFyYW1zIGV4dGVuZHMgVmlld0dyb3VwLkxheW91dFBhcmFtcyB7CkBAIC00NjA3LDcgKzQ4MzksNyBAQAogICAgICAgICAgICAgICAgICAgICBmaW5hbCBBcnJheUxpc3Q8Vmlldz4gc2NyYXAgPSBtU2NyYXBWaWV3c1tpXTsKICAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IHNjcmFwQ291bnQgPSBzY3JhcC5zaXplKCk7CiAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgc2NyYXBDb3VudDsgaisrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzY3JhcC5nZXQoaSkuc2V0RHJhd2luZ0NhY2hlQmFja2dyb3VuZENvbG9yKGNvbG9yKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNjcmFwLmdldChqKS5zZXREcmF3aW5nQ2FjaGVCYWNrZ3JvdW5kQ29sb3IoY29sb3IpOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L0FkYXB0ZXJWaWV3LmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvQWRhcHRlclZpZXcuamF2YQppbmRleCA4ZmNjMmU4Li5hYjc1NDIwIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvQWRhcHRlclZpZXcuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvQWRhcHRlclZpZXcuamF2YQpAQCAtMjI4LDcgKzIyOCw2IEBACiAgICAgICAgIHN1cGVyKGNvbnRleHQsIGF0dHJzLCBkZWZTdHlsZSk7CiAgICAgfQogCi0KICAgICAvKioKICAgICAgKiBJbnRlcmZhY2UgZGVmaW5pdGlvbiBmb3IgYSBjYWxsYmFjayB0byBiZSBpbnZva2VkIHdoZW4gYW4gaXRlbSBpbiB0aGlzCiAgICAgICogQWRhcHRlclZpZXcgaGFzIGJlZW4gY2xpY2tlZC4KQEAgLTYyOSw2ICs2MjgsNyBAQAogICAgIC8qKgogICAgICAqIFNldHMgdGhlIHZpZXcgdG8gc2hvdyBpZiB0aGUgYWRhcHRlciBpcyBlbXB0eQogICAgICAqLworICAgIEBhbmRyb2lkLnZpZXcuUmVtb3RhYmxlVmlld01ldGhvZAogICAgIHB1YmxpYyB2b2lkIHNldEVtcHR5VmlldyhWaWV3IGVtcHR5VmlldykgewogICAgICAgICBtRW1wdHlWaWV3ID0gZW1wdHlWaWV3OwogCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvQWRhcHRlclZpZXdBbmltYXRvci5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L0FkYXB0ZXJWaWV3QW5pbWF0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMzEwYTMxCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L0FkYXB0ZXJWaWV3QW5pbWF0b3IuamF2YQpAQCAtMCwwICsxLDgxMyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC53aWRnZXQ7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworCitpbXBvcnQgYW5kcm9pZC5hbmltYXRpb24uT2JqZWN0QW5pbWF0b3I7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlR5cGVkQXJyYXk7CitpbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyOworaW1wb3J0IGFuZHJvaWQub3MuTG9vcGVyOworaW1wb3J0IGFuZHJvaWQub3MuUGFyY2VsOworaW1wb3J0IGFuZHJvaWQub3MuUGFyY2VsYWJsZTsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0OworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3R3JvdXA7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXdHcm91cC5MYXlvdXRQYXJhbXM7CitpbXBvcnQgYW5kcm9pZC52aWV3LmFuaW1hdGlvbi5BbmltYXRpb247CitpbXBvcnQgYW5kcm9pZC52aWV3LmFuaW1hdGlvbi5BbmltYXRpb25VdGlsczsKKworLyoqCisgKiBCYXNlIGNsYXNzIGZvciBhIHtAbGluayBBZGFwdGVyVmlld30gdGhhdCB3aWxsIHBlcmZvcm0gYW5pbWF0aW9ucworICogd2hlbiBzd2l0Y2hpbmcgYmV0d2VlbiBpdHMgdmlld3MuCisgKgorICogQGF0dHIgcmVmIGFuZHJvaWQuUi5zdHlsZWFibGUjQWRhcHRlclZpZXdBbmltYXRvcl9pbkFuaW1hdGlvbgorICogQGF0dHIgcmVmIGFuZHJvaWQuUi5zdHlsZWFibGUjQWRhcHRlclZpZXdBbmltYXRvcl9vdXRBbmltYXRpb24KKyAqIEBhdHRyIHJlZiBhbmRyb2lkLlIuc3R5bGVhYmxlI0FkYXB0ZXJWaWV3QW5pbWF0b3JfYW5pbWF0ZUZpcnN0VmlldworICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWRhcHRlclZpZXdBbmltYXRvciBleHRlbmRzIEFkYXB0ZXJWaWV3PEFkYXB0ZXI+CisgICAgICAgIGltcGxlbWVudHMgUmVtb3RlVmlld3NBZGFwdGVyLlJlbW90ZUFkYXB0ZXJDb25uZWN0aW9uQ2FsbGJhY2sgeworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiUmVtb3RlVmlld0FuaW1hdG9yIjsKKworICAgIC8qKgorICAgICAqIFRoZSBpbmRleCBvZiB0aGUgY3VycmVudCBjaGlsZCwgd2hpY2ggYXBwZWFycyBhbnl3aGVyZSBmcm9tIHRoZSBiZWdpbm5pbmcKKyAgICAgKiB0byB0aGUgZW5kIG9mIHRoZSBjdXJyZW50IHNldCBvZiBjaGlsZHJlbiwgYXMgc3BlY2lmaWVkIGJ5IHtAbGluayAjbUFjdGl2ZU9mZnNldH0KKyAgICAgKi8KKyAgICBpbnQgbVdoaWNoQ2hpbGQgPSAwOworCisgICAgLyoqCisgICAgICogV2hldGhlciBvciBub3QgdGhlIGZpcnN0IHZpZXcocykgc2hvdWxkIGJlIGFuaW1hdGVkIGluCisgICAgICovCisgICAgYm9vbGVhbiBtQW5pbWF0ZUZpcnN0VGltZSA9IHRydWU7CisKKyAgICAvKioKKyAgICAgKiAgUmVwcmVzZW50cyB3aGVyZSB0aGUgaW4gdGhlIGN1cnJlbnQgd2luZG93IG9mCisgICAgICogIHZpZXdzIHRoZSBjdXJyZW50IDxjb2RlPm1EaXNwbGF5ZWRDaGlsZDwvY29kZT4gc2l0cworICAgICAqLworICAgIGludCBtQWN0aXZlT2Zmc2V0ID0gMDsKKworICAgIC8qKgorICAgICAqIFRoZSBudW1iZXIgb2Ygdmlld3MgdGhhdCB0aGUge0BsaW5rIEFkYXB0ZXJWaWV3QW5pbWF0b3J9IGtlZXBzIGFzIGNoaWxkcmVuIGF0IGFueQorICAgICAqIGdpdmVuIHRpbWUgKG5vdCBjb3VudGluZyB2aWV3cyB0aGF0IGFyZSBwZW5kaW5nIHJlbW92YWwsIHNlZSB7QGxpbmsgI21QcmV2aW91c1ZpZXdzfSkuCisgICAgICovCisgICAgaW50IG1OdW1BY3RpdmVWaWV3cyA9IDE7CisKKyAgICAvKioKKyAgICAgKiBBcnJheSBvZiB0aGUgY2hpbGRyZW4gb2YgdGhlIHtAbGluayBBZGFwdGVyVmlld0FuaW1hdG9yfS4gVGhpcyBhcnJheQorICAgICAqIGlzIGFjY2Vzc2VkIGluIGEgY2lyY3VsYXIgZmFzaGlvbgorICAgICAqLworICAgIFZpZXdbXSBtQWN0aXZlVmlld3M7CisKKyAgICAvKioKKyAgICAgKiBMaXN0IG9mIHZpZXdzIHBlbmRpbmcgcmVtb3ZhbCBmcm9tIHRoZSB7QGxpbmsgQWRhcHRlclZpZXdBbmltYXRvcn0KKyAgICAgKi8KKyAgICBBcnJheUxpc3Q8Vmlldz4gbVByZXZpb3VzVmlld3M7CisKKyAgICAvKioKKyAgICAgKiBUaGUgaW5kZXgsIHJlbGF0aXZlIHRvIHRoZSBhZGFwdGVyLCBvZiB0aGUgYmVnaW5uaW5nIG9mIHRoZSB3aW5kb3cgb2Ygdmlld3MKKyAgICAgKi8KKyAgICBpbnQgbUN1cnJlbnRXaW5kb3dTdGFydCA9IDA7CisKKyAgICAvKioKKyAgICAgKiBUaGUgaW5kZXgsIHJlbGF0aXZlIHRvIHRoZSBhZGFwdGVyLCBvZiB0aGUgZW5kIG9mIHRoZSB3aW5kb3cgb2Ygdmlld3MKKyAgICAgKi8KKyAgICBpbnQgbUN1cnJlbnRXaW5kb3dFbmQgPSAtMTsKKworICAgIC8qKgorICAgICAqIFRoZSBzYW1lIGFzIHtAbGluayAjbUN1cnJlbnRXaW5kb3dTdGFydH0sIGV4Y2VwdCB3aGVuIHRoZSB3ZSBoYXZlIGJvdW5kZWQKKyAgICAgKiB7QGxpbmsgI21DdXJyZW50V2luZG93U3RhcnR9IHRvIGJlIG5vbi1uZWdhdGl2ZQorICAgICAqLworICAgIGludCBtQ3VycmVudFdpbmRvd1N0YXJ0VW5ib3VuZGVkID0gMDsKKworICAgIC8qKgorICAgICAqIEhhbmRsZXIgdG8gcG9zdCBldmVudHMgdG8gdGhlIG1haW4gdGhyZWFkCisgICAgICovCisgICAgSGFuZGxlciBtTWFpblF1ZXVlOworCisgICAgLyoqCisgICAgICogTGlzdGVucyBmb3IgZGF0YSBjaGFuZ2VzIGZyb20gdGhlIGFkYXB0ZXIKKyAgICAgKi8KKyAgICBBZGFwdGVyRGF0YVNldE9ic2VydmVyIG1EYXRhU2V0T2JzZXJ2ZXI7CisKKyAgICAvKioKKyAgICAgKiBUaGUge0BsaW5rIEFkYXB0ZXJ9IGZvciB0aGlzIHtAbGluayBBZGFwdGVyVmlld0FuaW1hdG9yfQorICAgICAqLworICAgIEFkYXB0ZXIgbUFkYXB0ZXI7CisKKyAgICAvKioKKyAgICAgKiBUaGUge0BsaW5rIFJlbW90ZVZpZXdzQWRhcHRlcn0gZm9yIHRoaXMge0BsaW5rIEFkYXB0ZXJWaWV3QW5pbWF0b3J9CisgICAgICovCisgICAgUmVtb3RlVmlld3NBZGFwdGVyIG1SZW1vdGVWaWV3c0FkYXB0ZXI7CisKKyAgICAvKioKKyAgICAgKiBTcGVjaWZpZXMgd2hldGhlciB0aGlzIGlzIHRoZSBmaXJzdCB0aW1lIHRoZSBhbmltYXRvciBpcyBzaG93aW5nIHZpZXdzCisgICAgICovCisgICAgYm9vbGVhbiBtRmlyc3RUaW1lID0gdHJ1ZTsKKworICAgIC8qKgorICAgICAqIFNwZWNpZmllcyBpZiB0aGUgYW5pbWF0b3Igc2hvdWxkIHdyYXAgZnJvbSAwIHRvIHRoZSBlbmQgYW5kIHZpY2UgdmVyc2EKKyAgICAgKiBvciBoYXZlIGhhcmQgYm91bmRhcmllcyBhdCB0aGUgYmVnaW5uaW5nIGFuZCBlbmQKKyAgICAgKi8KKyAgICBib29sZWFuIG1TaG91bGRMb29wID0gdHJ1ZTsKKworICAgIC8qKgorICAgICAqIFRoZSB3aWR0aCBhbmQgaGVpZ2h0IG9mIHNvbWUgY2hpbGQsIHVzZWQgYXMgYSBzaXplIHJlZmVyZW5jZSBpbi1jYXNlIG91cgorICAgICAqIGRpbWVuc2lvbnMgYXJlIHVuc3BlY2lmaWVkIGJ5IHRoZSBwYXJlbnQuCisgICAgICovCisgICAgaW50IG1SZWZlcmVuY2VDaGlsZFdpZHRoID0gLTE7CisgICAgaW50IG1SZWZlcmVuY2VDaGlsZEhlaWdodCA9IC0xOworCisgICAgLyoqCisgICAgICogVE9ETzogQW5pbWF0aW9uIHN0dWZmIGlzIHN0aWxsIGluIGZsdXgsIHdhaXRpbmcgb24gdGhlIG5ldyBmcmFtZXdvcmsgdG8gc2V0dGxlIGEgYml0LgorICAgICAqLworICAgIEFuaW1hdGlvbiBtSW5BbmltYXRpb247CisgICAgQW5pbWF0aW9uIG1PdXRBbmltYXRpb247CisgICAgcHJpdmF0ZSAgQXJyYXlMaXN0PFZpZXc+IG1WaWV3c1RvQnJpbmdUb0Zyb250OworCisgICAgcHVibGljIEFkYXB0ZXJWaWV3QW5pbWF0b3IoQ29udGV4dCBjb250ZXh0KSB7CisgICAgICAgIHN1cGVyKGNvbnRleHQpOworICAgICAgICBpbml0Vmlld0FuaW1hdG9yKCk7CisgICAgfQorCisgICAgcHVibGljIEFkYXB0ZXJWaWV3QW5pbWF0b3IoQ29udGV4dCBjb250ZXh0LCBBdHRyaWJ1dGVTZXQgYXR0cnMpIHsKKyAgICAgICAgc3VwZXIoY29udGV4dCwgYXR0cnMpOworCisgICAgICAgIFR5cGVkQXJyYXkgYSA9IGNvbnRleHQub2J0YWluU3R5bGVkQXR0cmlidXRlcyhhdHRycywKKyAgICAgICAgICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZS5WaWV3QW5pbWF0b3IpOworICAgICAgICBpbnQgcmVzb3VyY2UgPSBhLmdldFJlc291cmNlSWQoCisgICAgICAgICAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZWFibGUuVmlld0FuaW1hdG9yX2luQW5pbWF0aW9uLCAwKTsKKyAgICAgICAgaWYgKHJlc291cmNlID4gMCkgeworICAgICAgICAgICAgc2V0SW5BbmltYXRpb24oY29udGV4dCwgcmVzb3VyY2UpOworICAgICAgICB9CisKKyAgICAgICAgcmVzb3VyY2UgPSBhLmdldFJlc291cmNlSWQoY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZWFibGUuVmlld0FuaW1hdG9yX291dEFuaW1hdGlvbiwgMCk7CisgICAgICAgIGlmIChyZXNvdXJjZSA+IDApIHsKKyAgICAgICAgICAgIHNldE91dEFuaW1hdGlvbihjb250ZXh0LCByZXNvdXJjZSk7CisgICAgICAgIH0KKworICAgICAgICBib29sZWFuIGZsYWcgPSBhLmdldEJvb2xlYW4oCisgICAgICAgICAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZWFibGUuVmlld0FuaW1hdG9yX2FuaW1hdGVGaXJzdFZpZXcsIHRydWUpOworICAgICAgICBzZXRBbmltYXRlRmlyc3RWaWV3KGZsYWcpOworCisgICAgICAgIGEucmVjeWNsZSgpOworCisgICAgICAgIGluaXRWaWV3QW5pbWF0b3IoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJbml0aWFsaXplIHRoaXMge0BsaW5rIEFkYXB0ZXJWaWV3QW5pbWF0b3J9CisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIGluaXRWaWV3QW5pbWF0b3IoKSB7CisgICAgICAgIG1NYWluUXVldWUgPSBuZXcgSGFuZGxlcihMb29wZXIubXlMb29wZXIoKSk7CisgICAgICAgIG1BY3RpdmVWaWV3cyA9IG5ldyBWaWV3W21OdW1BY3RpdmVWaWV3c107CisgICAgICAgIG1QcmV2aW91c1ZpZXdzID0gbmV3IEFycmF5TGlzdDxWaWV3PigpOworICAgICAgICBtVmlld3NUb0JyaW5nVG9Gcm9udCA9IG5ldyBBcnJheUxpc3Q8Vmlldz4oKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGlzIG1ldGhvZCBpcyB1c2VkIGJ5IHN1YmNsYXNzZXMgdG8gY29uZmlndXJlIHRoZSBhbmltYXRvciB0byBkaXNwbGF5IHRoZQorICAgICAqIGRlc2lyZWQgbnVtYmVyIG9mIHZpZXdzLCBhbmQgc3BlY2lmeSB0aGUgb2Zmc2V0CisgICAgICoKKyAgICAgKiBAcGFyYW0gbnVtVmlzaWJsZVZpZXdzIFRoZSBudW1iZXIgb2Ygdmlld3MgdGhlIGFuaW1hdG9yIGtlZXBzIGluIHRoZSB7QGxpbmsgVmlld0dyb3VwfQorICAgICAqIEBwYXJhbSBhY3RpdmVPZmZzZXQgVGhpcyBwYXJhbWV0ZXIgc3BlY2lmaWVzIHdoZXJlIHRoZSBjdXJyZW50IGluZGV4ICh7QGxpbmsgI21XaGljaENoaWxkfSkKKyAgICAgKiAgICAgICAgc2l0cyB3aXRoaW4gdGhlIHdpbmRvdy4gRm9yIGV4YW1wbGUgaWYgYWN0aXZlT2Zmc2V0IGlzIDEsIGFuZCBudW1WaXNpYmxlVmlld3MgaXMgMywKKyAgICAgKiAgICAgICAgYW5kIHtAbGluayAjc2V0RGlzcGxheWVkQ2hpbGQoaW50KX0gaXMgY2FsbGVkIHdpdGggMTAsIHRoZW4gdGhlIGVmZmVjdGl2ZSB3aW5kb3cgd2lsbAorICAgICAqICAgICAgICBiZSB0aGUgaW5kZXhlcyA5LCAxMCwgYW5kIDExLiBJbiB0aGUgc2FtZSBleGFtcGxlLCBpZiBhY3RpdmVPZmZzZXQgd2VyZSAwLCB0aGVuIHRoZQorICAgICAqICAgICAgICB3aW5kb3cgd291bGQgaW5zdGVhZCBjb250YWluIGluZGV4ZXMgMTAsIDExIGFuZCAxMi4KKyAgICAgKiBAcGFyYW0gc2hvdWxkTG9vcCBJZiB0aGUgYW5pbWF0b3IgaXMgc2hvdyB2aWV3IDAsIGFuZCBzZXRQcmV2aW91cygpIGlzIGNhbGxlZCwgZG8gd2UKKyAgICAgKiAgICAgICAgd2UgbG9vcCBiYWNrIHRvIHRoZSBlbmQsIG9yIGRvIHdlIGRvIG5vdGhpbmcKKyAgICAgKi8KKyAgICAgdm9pZCBjb25maWd1cmVWaWV3QW5pbWF0b3IoaW50IG51bVZpc2libGVWaWV3cywgaW50IGFjdGl2ZU9mZnNldCwgYm9vbGVhbiBzaG91bGRMb29wKSB7CisgICAgICAgIGlmIChhY3RpdmVPZmZzZXQgPiBudW1WaXNpYmxlVmlld3MgLSAxKSB7CisgICAgICAgICAgICAvLyBUaHJvdyBhbiBleGNlcHRpb24gaGVyZS4KKyAgICAgICAgfQorICAgICAgICBtTnVtQWN0aXZlVmlld3MgPSBudW1WaXNpYmxlVmlld3M7CisgICAgICAgIG1BY3RpdmVPZmZzZXQgPSBhY3RpdmVPZmZzZXQ7CisgICAgICAgIG1BY3RpdmVWaWV3cyA9IG5ldyBWaWV3W21OdW1BY3RpdmVWaWV3c107CisgICAgICAgIG1QcmV2aW91c1ZpZXdzLmNsZWFyKCk7CisgICAgICAgIHJlbW92ZUFsbFZpZXdzSW5MYXlvdXQoKTsKKyAgICAgICAgbUN1cnJlbnRXaW5kb3dTdGFydCA9IDA7CisgICAgICAgIG1DdXJyZW50V2luZG93RW5kID0gLTE7CisgICAgICAgIG1TaG91bGRMb29wID0gc2hvdWxkTG9vcDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGlzIGNsYXNzIHNob3VsZCBiZSBvdmVycmlkZGVuIGJ5IHN1YmNsYXNzZXMgdG8gY3VzdG9taXplIHZpZXcgdHJhbnNpdGlvbnMgd2l0aGluCisgICAgICogdGhlIHNldCBvZiB2aXNpYmxlIHZpZXdzCisgICAgICoKKyAgICAgKiBAcGFyYW0gZnJvbUluZGV4IFRoZSByZWxhdGl2ZSBpbmRleCB3aXRoaW4gdGhlIHdpbmRvdyB0aGF0IHRoZSB2aWV3IHdhcyBpbiwgLTEgaWYgaXQgd2Fzbid0CisgICAgICogICAgICAgIGluIHRoZSB3aW5kb3cKKyAgICAgKiBAcGFyYW0gdG9JbmRleCBUaGUgcmVsYXRpdmUgaW5kZXggd2l0aGluIHRoZSB3aW5kb3cgdGhhdCB0aGUgdmlldyBpcyBnb2luZyB0bywgLTEgaWYgaXQgaXMKKyAgICAgKiAgICAgICAgYmVpbmcgcmVtb3ZlZAorICAgICAqIEBwYXJhbSB2aWV3IFRoZSB2aWV3IHRoYXQgaXMgYmVpbmcgYW5pbWF0ZWQKKyAgICAgKi8KKyAgICB2b2lkIGFuaW1hdGVWaWV3Rm9yVHJhbnNpdGlvbihpbnQgZnJvbUluZGV4LCBpbnQgdG9JbmRleCwgVmlldyB2aWV3KSB7CisgICAgICAgIE9iamVjdEFuaW1hdG9yIHBhOworICAgICAgICBpZiAoZnJvbUluZGV4ID09IC0xKSB7CisgICAgICAgICAgICB2aWV3LnNldEFscGhhKDAuMGYpOworICAgICAgICAgICAgcGEgPSBuZXcgT2JqZWN0QW5pbWF0b3IoNDAwLCB2aWV3LCAiYWxwaGEiLCAwLjBmLCAxLjBmKTsKKyAgICAgICAgICAgIHBhLnN0YXJ0KCk7CisgICAgICAgIH0gZWxzZSBpZiAodG9JbmRleCA9PSAtMSkgeworICAgICAgICAgICAgcGEgPSBuZXcgT2JqZWN0QW5pbWF0b3IoNDAwLCB2aWV3LCAiYWxwaGEiLCAxLjBmLCAwLjBmKTsKKyAgICAgICAgICAgIHBhLnN0YXJ0KCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHdoaWNoIGNoaWxkIHZpZXcgd2lsbCBiZSBkaXNwbGF5ZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gd2hpY2hDaGlsZCB0aGUgaW5kZXggb2YgdGhlIGNoaWxkIHZpZXcgdG8gZGlzcGxheQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldERpc3BsYXllZENoaWxkKGludCB3aGljaENoaWxkKSB7CisgICAgICAgIGlmIChtQWRhcHRlciAhPSBudWxsKSB7CisgICAgICAgICAgICBtV2hpY2hDaGlsZCA9IHdoaWNoQ2hpbGQ7CisgICAgICAgICAgICBpZiAod2hpY2hDaGlsZCA+PSBtQWRhcHRlci5nZXRDb3VudCgpKSB7CisgICAgICAgICAgICAgICAgbVdoaWNoQ2hpbGQgPSBtU2hvdWxkTG9vcCA/IDAgOiBtQWRhcHRlci5nZXRDb3VudCgpIC0gMTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAod2hpY2hDaGlsZCA8IDApIHsKKyAgICAgICAgICAgICAgICBtV2hpY2hDaGlsZCA9IG1TaG91bGRMb29wID8gbUFkYXB0ZXIuZ2V0Q291bnQoKSAtIDEgOiAwOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBib29sZWFuIGhhc0ZvY3VzID0gZ2V0Rm9jdXNlZENoaWxkKCkgIT0gbnVsbDsKKyAgICAgICAgICAgIC8vIFRoaXMgd2lsbCBjbGVhciBvbGQgZm9jdXMgaWYgd2UgaGFkIGl0CisgICAgICAgICAgICBzaG93T25seShtV2hpY2hDaGlsZCk7CisgICAgICAgICAgICBpZiAoaGFzRm9jdXMpIHsKKyAgICAgICAgICAgICAgICAvLyBUcnkgdG8gcmV0YWtlIGZvY3VzIGlmIHdlIGhhZCBpdAorICAgICAgICAgICAgICAgIHJlcXVlc3RGb2N1cyhGT0NVU19GT1JXQVJEKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiBkZWZhdWx0IGluQW5pbWF0aW9uLiBUbyBiZSBvdmVycmlkZW4gYnkgc3ViY2xhc3Nlcy4KKyAgICAgKi8KKyAgICBBbmltYXRpb24gZ2V0RGVmYXVsdEluQW5pbWF0aW9uKCkgeworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gZGVmYXVsdCBvdXRBbmltYXRpb24uIFRvIGJlIG92ZXJyaWRkZW4gYnkgc3ViY2xhc3Nlcy4KKyAgICAgKi8KKyAgICBBbmltYXRpb24gZ2V0RGVmYXVsdE91dEFuaW1hdGlvbigpIHsKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgLyoqCisgICAgICogVG8gYmUgb3ZlcnJpZGRlbiBieSBzdWJjbGFzc2VzLiBUaGlzIG1ldGhvZCBhcHBsaWVzIGEgdmlldyAvIGluZGV4IHNwZWNpZmljCisgICAgICogdHJhbnNmb3JtIHRvIHRoZSBjaGlsZCB2aWV3LgorICAgICAqCisgICAgICogQHBhcmFtIGNoaWxkCisgICAgICogQHBhcmFtIHJlbGF0aXZlSW5kZXgKKyAgICAgKi8KKyAgICB2b2lkIGFwcGx5VHJhbnNmb3JtRm9yQ2hpbGRBdEluZGV4KFZpZXcgY2hpbGQsIGludCByZWxhdGl2ZUluZGV4KSB7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIGN1cnJlbnRseSBkaXNwbGF5ZWQgY2hpbGQgdmlldy4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldERpc3BsYXllZENoaWxkKCkgeworICAgICAgICByZXR1cm4gbVdoaWNoQ2hpbGQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogTWFudWFsbHkgc2hvd3MgdGhlIG5leHQgY2hpbGQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2hvd05leHQoKSB7CisgICAgICAgIHNldERpc3BsYXllZENoaWxkKG1XaGljaENoaWxkICsgMSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogTWFudWFsbHkgc2hvd3MgdGhlIHByZXZpb3VzIGNoaWxkLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNob3dQcmV2aW91cygpIHsKKyAgICAgICAgc2V0RGlzcGxheWVkQ2hpbGQobVdoaWNoQ2hpbGQgLSAxKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTaG93cyBvbmx5IHRoZSBzcGVjaWZpZWQgY2hpbGQuIFRoZSBvdGhlciBkaXNwbGF5cyBWaWV3cyBleGl0IHRoZSBzY3JlZW4sCisgICAgICogb3B0aW9uYWxseSB3aXRoIHRoZSB3aXRoIHRoZSB7QGxpbmsgI2dldE91dEFuaW1hdGlvbigpIG91dCBhbmltYXRpb259IGFuZAorICAgICAqIHRoZSBzcGVjaWZpZWQgY2hpbGQgZW50ZXJzIHRoZSBzY3JlZW4sIG9wdGlvbmFsbHkgd2l0aCB0aGUKKyAgICAgKiB7QGxpbmsgI2dldEluQW5pbWF0aW9uKCkgaW4gYW5pbWF0aW9ufS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjaGlsZEluZGV4IFRoZSBpbmRleCBvZiB0aGUgY2hpbGQgdG8gYmUgc2hvd24uCisgICAgICogQHBhcmFtIGFuaW1hdGUgV2hldGhlciBvciBub3QgdG8gdXNlIHRoZSBpbiBhbmQgb3V0IGFuaW1hdGlvbnMsIGRlZmF1bHRzCisgICAgICogICAgICAgICAgICB0byB0cnVlLgorICAgICAqLworICAgIHZvaWQgc2hvd09ubHkoaW50IGNoaWxkSW5kZXgsIGJvb2xlYW4gYW5pbWF0ZSkgeworICAgICAgICBzaG93T25seShjaGlsZEluZGV4LCBhbmltYXRlLCBmYWxzZSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBpbnQgbW9kdWxvKGludCBwb3MsIGludCBzaXplKSB7CisgICAgICAgIHJldHVybiAoc2l6ZSArIChwb3MgJSBzaXplKSkgJSBzaXplOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB0aGUgdmlldyBhdCB0aGlzIGluZGV4IHJlbGF0aXZlIHRvIHRoZSBjdXJyZW50IHdpbmRvdydzIHN0YXJ0CisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVsYXRpdmVJbmRleCBQb3NpdGlvbiByZWxhdGl2ZSB0byB0aGUgY3VycmVudCB3aW5kb3cncyBzdGFydAorICAgICAqIEByZXR1cm4gVmlldyBhdCB0aGlzIGluZGV4LCBudWxsIGlmIHRoZSBpbmRleCBpcyBvdXRzaWRlIHRoZSBib3VuZHMKKyAgICAgKi8KKyAgICBWaWV3IGdldFZpZXdBdFJlbGF0aXZlSW5kZXgoaW50IHJlbGF0aXZlSW5kZXgpIHsKKyAgICAgICAgaWYgKHJlbGF0aXZlSW5kZXggPj0gMCAmJiByZWxhdGl2ZUluZGV4IDw9IG1OdW1BY3RpdmVWaWV3cyAtIDEpIHsKKyAgICAgICAgICAgIGludCBpbmRleCA9IG1DdXJyZW50V2luZG93U3RhcnRVbmJvdW5kZWQgKyByZWxhdGl2ZUluZGV4OworICAgICAgICAgICAgcmV0dXJuIG1BY3RpdmVWaWV3c1ttb2R1bG8oaW5kZXgsIG1OdW1BY3RpdmVWaWV3cyldOworICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIExheW91dFBhcmFtcyBjcmVhdGVPclJldXNlTGF5b3V0UGFyYW1zKFZpZXcgdikgeworICAgICAgICBmaW5hbCBWaWV3R3JvdXAuTGF5b3V0UGFyYW1zIGN1cnJlbnRMcCA9IHYuZ2V0TGF5b3V0UGFyYW1zKCk7CisgICAgICAgIGlmIChjdXJyZW50THAgaW5zdGFuY2VvZiBWaWV3R3JvdXAuTGF5b3V0UGFyYW1zKSB7CisgICAgICAgICAgICBMYXlvdXRQYXJhbXMgbHAgPSAoTGF5b3V0UGFyYW1zKSBjdXJyZW50THA7CisgICAgICAgICAgICByZXR1cm4gbHA7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG5ldyBWaWV3R3JvdXAuTGF5b3V0UGFyYW1zKDAsIDApOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCByZWZyZXNoQ2hpbGRyZW4oKSB7CisgICAgICAgIGZvciAoaW50IGkgPSBtQ3VycmVudFdpbmRvd1N0YXJ0OyBpIDw9IG1DdXJyZW50V2luZG93RW5kOyBpKyspIHsKKyAgICAgICAgICAgIGludCBpbmRleCA9IG1vZHVsbyhpLCBtTnVtQWN0aXZlVmlld3MpOworCisgICAgICAgICAgICAvLyBnZXQgdGhlIGZyZXNoIGNoaWxkIGZyb20gdGhlIGFkYXB0ZXIKKyAgICAgICAgICAgIFZpZXcgdXBkYXRlZENoaWxkID0gbUFkYXB0ZXIuZ2V0VmlldyhpLCBudWxsLCB0aGlzKTsKKworICAgICAgICAgICAgaWYgKG1BY3RpdmVWaWV3c1tpbmRleF0gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIEZyYW1lTGF5b3V0IGZsID0gKEZyYW1lTGF5b3V0KSBtQWN0aXZlVmlld3NbaW5kZXhdOworICAgICAgICAgICAgICAgIC8vIGZsdXNoIG91dCB0aGUgb2xkIGNoaWxkCisgICAgICAgICAgICAgICAgZmwucmVtb3ZlQWxsVmlld3NJbkxheW91dCgpOworICAgICAgICAgICAgICAgIC8vIGFkZCB0aGUgbmV3IGNoaWxkIHRvIHRoZSBmcmFtZSwgaWYgaXQgZXhpc3RzCisgICAgICAgICAgICAgICAgaWYgKHVwZGF0ZWRDaGlsZCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGZsLmFkZFZpZXcodXBkYXRlZENoaWxkKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGlzIG1ldGhvZCBjYW4gYmUgb3ZlcnJpZGRlbiBzbyB0aGF0IHN1YmNsYXNzZXMgY2FuIHByb3ZpZGUgYSBjdXN0b20gZnJhbWUgaW4gd2hpY2ggdGhlaXIKKyAgICAgKiBjaGlsZHJlbiBjYW4gbGl2ZS4gRm9yIGV4YW1wbGUsIFN0YWNrVmlldyBhZGRzIHBhZGRpbmcgdG8gaXRzIGNoaWxkcmVucycgZnJhbWVzIHNvIGFzIHRvCisgICAgICogYWNjb21vZGF0ZSBmb3IgdGhlIGhpZ2hsaWdodCBlZmZlY3QuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFRoZSBGcmFtZUxheW91dCBpbnRvIHdoaWNoIGNoaWxkcmVuIGNhbiBiZSBwbGFjZWQuCisgICAgICovCisgICAgRnJhbWVMYXlvdXQgZ2V0RnJhbWVGb3JDaGlsZCgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBGcmFtZUxheW91dChtQ29udGV4dCk7CisgICAgfQorCisgICAgdm9pZCBzaG93T25seShpbnQgY2hpbGRJbmRleCwgYm9vbGVhbiBhbmltYXRlLCBib29sZWFuIG9uTGF5b3V0KSB7CisgICAgICAgIGlmIChtQWRhcHRlciA9PSBudWxsKSByZXR1cm47CisKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtUHJldmlvdXNWaWV3cy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgVmlldyB2aWV3VG9SZW1vdmUgPSBtUHJldmlvdXNWaWV3cy5nZXQoaSk7CisgICAgICAgICAgICB2aWV3VG9SZW1vdmUuY2xlYXJBbmltYXRpb24oKTsKKyAgICAgICAgICAgIGlmICh2aWV3VG9SZW1vdmUgaW5zdGFuY2VvZiBWaWV3R3JvdXApIHsKKyAgICAgICAgICAgICAgICBWaWV3R3JvdXAgdmcgPSAoVmlld0dyb3VwKSB2aWV3VG9SZW1vdmU7CisgICAgICAgICAgICAgICAgdmcucmVtb3ZlQWxsVmlld3NJbkxheW91dCgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gYXBwbHlUcmFuc2Zvcm1Gb3JDaGlsZEF0SW5kZXggaGVyZSBqdXN0IGFsbG93cyBmb3IgYW55IGNsZWFudXAKKyAgICAgICAgICAgIC8vIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHZpZXcgdGhhdCBtYXkgbmVlZCB0byBiZSBkb25lIGJ5IGEgc3ViY2xhc3MKKyAgICAgICAgICAgIGFwcGx5VHJhbnNmb3JtRm9yQ2hpbGRBdEluZGV4KHZpZXdUb1JlbW92ZSwgLTEpOworCisgICAgICAgICAgICByZW1vdmVWaWV3SW5MYXlvdXQodmlld1RvUmVtb3ZlKTsKKyAgICAgICAgfQorICAgICAgICBtUHJldmlvdXNWaWV3cy5jbGVhcigpOworICAgICAgICBpbnQgbmV3V2luZG93U3RhcnRVbmJvdW5kZWQgPSBjaGlsZEluZGV4IC0gbUFjdGl2ZU9mZnNldDsKKyAgICAgICAgaW50IG5ld1dpbmRvd0VuZFVuYm91bmRlZCA9IG5ld1dpbmRvd1N0YXJ0VW5ib3VuZGVkICsgbU51bUFjdGl2ZVZpZXdzIC0gMTsKKyAgICAgICAgaW50IG5ld1dpbmRvd1N0YXJ0ID0gTWF0aC5tYXgoMCwgbmV3V2luZG93U3RhcnRVbmJvdW5kZWQpOworICAgICAgICBpbnQgbmV3V2luZG93RW5kID0gTWF0aC5taW4obUFkYXB0ZXIuZ2V0Q291bnQoKSwgbmV3V2luZG93RW5kVW5ib3VuZGVkKTsKKworICAgICAgICAvLyBUaGlzIHNlY3Rpb24gY2xlYXJzIG91dCBhbnkgaXRlbXMgdGhhdCBhcmUgaW4gb3VyIG1BY3RpdmVWaWV3cyBsaXN0CisgICAgICAgIC8vIGJ1dCBhcmUgb3V0c2lkZSB0aGUgZWZmZWN0aXZlIGJvdW5kcyBvZiBvdXIgd2luZG93ICh0aGlzIGlzIGJlY29tZXMgYW4gaXNzdWUKKyAgICAgICAgLy8gYXQgdGhlIGV4dHJlbWl0aWVzIG9mIHRoZSBsaXN0LCBlZy4gd2hlcmUgbmV3V2luZG93U3RhcnRVbmJvdW5kZWQgPCAwIG9yCisgICAgICAgIC8vIG5ld1dpbmRvd0VuZFVuYm91bmRlZCA+IG1BZGFwdGVyLmdldENvdW50KCkgLSAxCisgICAgICAgIGZvciAoaW50IGkgPSBuZXdXaW5kb3dTdGFydFVuYm91bmRlZDsgaSA8IG5ld1dpbmRvd0VuZFVuYm91bmRlZDsgaSsrKSB7CisgICAgICAgICAgICBpZiAoaSA8IG5ld1dpbmRvd1N0YXJ0IHx8IGkgPiBuZXdXaW5kb3dFbmQpIHsKKyAgICAgICAgICAgICAgICBpbnQgaW5kZXggPSBtb2R1bG8oaSwgbU51bUFjdGl2ZVZpZXdzKTsKKyAgICAgICAgICAgICAgICBpZiAobUFjdGl2ZVZpZXdzW2luZGV4XSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIFZpZXcgcHJldmlvdXNWaWV3ID0gbUFjdGl2ZVZpZXdzW2luZGV4XTsKKyAgICAgICAgICAgICAgICAgICAgbVByZXZpb3VzVmlld3MuYWRkKHByZXZpb3VzVmlldyk7CisgICAgICAgICAgICAgICAgICAgIGludCBwcmV2aW91c1ZpZXdSZWxhdGl2ZUluZGV4ID0gbW9kdWxvKGluZGV4IC0gbUN1cnJlbnRXaW5kb3dTdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTnVtQWN0aXZlVmlld3MpOworICAgICAgICAgICAgICAgICAgICBhbmltYXRlVmlld0ZvclRyYW5zaXRpb24ocHJldmlvdXNWaWV3UmVsYXRpdmVJbmRleCwgLTEsIHByZXZpb3VzVmlldyk7CisgICAgICAgICAgICAgICAgICAgIG1BY3RpdmVWaWV3c1tpbmRleF0gPSBudWxsOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIElmIHRoZSB3aW5kb3cgaGFzIGNoYW5nZWQKKyAgICAgICAgaWYgKCEgKG5ld1dpbmRvd1N0YXJ0ID09IG1DdXJyZW50V2luZG93U3RhcnQgJiYgbmV3V2luZG93RW5kID09IG1DdXJyZW50V2luZG93RW5kKSkgeworICAgICAgICAgICAgLy8gUnVuIHRocm91Z2ggdGhlIGluZGljZXMgaW4gdGhlIG5ldyByYW5nZQorICAgICAgICAgICAgZm9yIChpbnQgaSA9IG5ld1dpbmRvd1N0YXJ0OyBpIDw9IG5ld1dpbmRvd0VuZDsgaSsrKSB7CisKKyAgICAgICAgICAgICAgICBpbnQgb2xkUmVsYXRpdmVJbmRleCA9IGkgLSBtQ3VycmVudFdpbmRvd1N0YXJ0VW5ib3VuZGVkOworICAgICAgICAgICAgICAgIGludCBuZXdSZWxhdGl2ZUluZGV4ID0gaSAtIG5ld1dpbmRvd1N0YXJ0VW5ib3VuZGVkOworICAgICAgICAgICAgICAgIGludCBpbmRleCA9IG1vZHVsbyhpLCBtTnVtQWN0aXZlVmlld3MpOworCisgICAgICAgICAgICAgICAgLy8gSWYgdGhpcyBpdGVtIGlzIGluIHRoZSBjdXJyZW50IHdpbmRvdywgZ3JlYXQsIHdlIGp1c3QgbmVlZCB0byBhcHBseQorICAgICAgICAgICAgICAgIC8vIHRoZSB0cmFuc2Zvcm0gZm9yIGl0J3MgbmV3IHJlbGF0aXZlIHBvc2l0aW9uIGluIHRoZSB3aW5kb3csIGFuZCBhbmltYXRlCisgICAgICAgICAgICAgICAgLy8gYmV0d2VlbiBpdCdzIGN1cnJlbnQgYW5kIG5ldyByZWxhdGl2ZSBwb3NpdGlvbnMKKyAgICAgICAgICAgICAgICBpZiAoaSA+PSBtQ3VycmVudFdpbmRvd1N0YXJ0ICYmIGkgPD0gbUN1cnJlbnRXaW5kb3dFbmQpIHsKKyAgICAgICAgICAgICAgICAgICAgVmlldyB2aWV3ID0gbUFjdGl2ZVZpZXdzW2luZGV4XTsKKyAgICAgICAgICAgICAgICAgICAgYXBwbHlUcmFuc2Zvcm1Gb3JDaGlsZEF0SW5kZXgodmlldywgbmV3UmVsYXRpdmVJbmRleCk7CisgICAgICAgICAgICAgICAgICAgIGFuaW1hdGVWaWV3Rm9yVHJhbnNpdGlvbihvbGRSZWxhdGl2ZUluZGV4LCBuZXdSZWxhdGl2ZUluZGV4LCB2aWV3KTsKKworICAgICAgICAgICAgICAgIC8vIE90aGVyd2lzZSB0aGlzIHZpZXcgaXMgbmV3LCBzbyBmaXJzdCB3ZSBoYXZlIHRvIGRpc3BsYWNlIHRoZSB2aWV3IHRoYXQncworICAgICAgICAgICAgICAgIC8vIHRha2luZyB0aGUgbmV3IHZpZXcncyBwbGFjZSB3aXRoaW4gb3VyIGNhY2hlIChhIGNpcmN1bGFyIGFycmF5KQorICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChtQWN0aXZlVmlld3NbaW5kZXhdICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFZpZXcgcHJldmlvdXNWaWV3ID0gbUFjdGl2ZVZpZXdzW2luZGV4XTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1QcmV2aW91c1ZpZXdzLmFkZChwcmV2aW91c1ZpZXcpOworICAgICAgICAgICAgICAgICAgICAgICAgaW50IHByZXZpb3VzVmlld1JlbGF0aXZlSW5kZXggPSBtb2R1bG8oaW5kZXggLSBtQ3VycmVudFdpbmRvd1N0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTnVtQWN0aXZlVmlld3MpOworICAgICAgICAgICAgICAgICAgICAgICAgYW5pbWF0ZVZpZXdGb3JUcmFuc2l0aW9uKHByZXZpb3VzVmlld1JlbGF0aXZlSW5kZXgsIC0xLCBwcmV2aW91c1ZpZXcpOworCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobUN1cnJlbnRXaW5kb3dTdGFydCA+IG5ld1dpbmRvd1N0YXJ0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVZpZXdzVG9CcmluZ1RvRnJvbnQuYWRkKHByZXZpb3VzVmlldyk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAvLyBXZSd2ZSBjbGVhcmVkIGEgc3BvdCBmb3IgdGhlIG5ldyB2aWV3LiBHZXQgaXQgZnJvbSB0aGUgYWRhcHRlciwgYWRkIGl0CisgICAgICAgICAgICAgICAgICAgIC8vIGFuZCBhcHBseSBhbnkgdHJhbnNmb3JtIC8gYW5pbWF0aW9uCisgICAgICAgICAgICAgICAgICAgIFZpZXcgbmV3VmlldyA9IG1BZGFwdGVyLmdldFZpZXcoaSwgbnVsbCwgdGhpcyk7CisKKyAgICAgICAgICAgICAgICAgICAgLy8gV2Ugd3JhcCB0aGUgbmV3IHZpZXcgaW4gYSBGcmFtZUxheW91dCBzbyBhcyB0byByZXNwZWN0IHRoZSBjb250cmFjdAorICAgICAgICAgICAgICAgICAgICAvLyB3aXRoIHRoZSBhZGFwdGVyLCB0aGF0IGlzLCB0aGF0IHdlIGRvbid0IG1vZGlmeSB0aGlzIHZpZXcgZGlyZWN0bHkKKyAgICAgICAgICAgICAgICAgICAgRnJhbWVMYXlvdXQgZmwgPSBnZXRGcmFtZUZvckNoaWxkKCk7CisKKyAgICAgICAgICAgICAgICAgICAgLy8gSWYgdGhlIHZpZXcgZnJvbSB0aGUgYWRhcHRlciBpcyBudWxsLCB3ZSBzdGlsbCBrZWVwIGFuIGVtcHR5IGZyYW1lIGluIHBsYWNlCisgICAgICAgICAgICAgICAgICAgIGlmIChuZXdWaWV3ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgZmwuYWRkVmlldyhuZXdWaWV3KTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBtQWN0aXZlVmlld3NbaW5kZXhdID0gZmw7CisgICAgICAgICAgICAgICAgICAgIGFkZENoaWxkKGZsKTsKKyAgICAgICAgICAgICAgICAgICAgYXBwbHlUcmFuc2Zvcm1Gb3JDaGlsZEF0SW5kZXgoZmwsIG5ld1JlbGF0aXZlSW5kZXgpOworICAgICAgICAgICAgICAgICAgICBhbmltYXRlVmlld0ZvclRyYW5zaXRpb24oLTEsIG5ld1JlbGF0aXZlSW5kZXgsIGZsKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbUFjdGl2ZVZpZXdzW2luZGV4XS5icmluZ1RvRnJvbnQoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtVmlld3NUb0JyaW5nVG9Gcm9udC5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgICAgIFZpZXcgdiA9IG1WaWV3c1RvQnJpbmdUb0Zyb250LmdldChpKTsKKyAgICAgICAgICAgICAgICB2LmJyaW5nVG9Gcm9udCgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbVZpZXdzVG9CcmluZ1RvRnJvbnQuY2xlYXIoKTsKKworICAgICAgICAgICAgbUN1cnJlbnRXaW5kb3dTdGFydCA9IG5ld1dpbmRvd1N0YXJ0OworICAgICAgICAgICAgbUN1cnJlbnRXaW5kb3dFbmQgPSBuZXdXaW5kb3dFbmQ7CisgICAgICAgICAgICBtQ3VycmVudFdpbmRvd1N0YXJ0VW5ib3VuZGVkID0gbmV3V2luZG93U3RhcnRVbmJvdW5kZWQ7CisgICAgICAgIH0KKworICAgICAgICBtRmlyc3RUaW1lID0gZmFsc2U7CisgICAgICAgIGlmICghb25MYXlvdXQpIHsKKyAgICAgICAgICAgIHJlcXVlc3RMYXlvdXQoKTsKKyAgICAgICAgICAgIGludmFsaWRhdGUoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIElmIHRoZSBBZGFwdGVyIHRyaWVzIHRvIGxheW91dCB0aGUgY3VycmVudCB2aWV3IHdoZW4gd2UgZ2V0IGl0IHVzaW5nIGdldFZpZXcKKyAgICAgICAgICAgIC8vIGFib3ZlIHRoZSBsYXlvdXQgd2lsbCBlbmQgdXAgYmVpbmcgaWdub3JlZCBzaW5jZSB3ZSBhcmUgY3VycmVudGx5IGxheWluZyBvdXQsIHNvCisgICAgICAgICAgICAvLyB3ZSBwb3N0IGEgZGVsYXllZCByZXF1ZXN0TGF5b3V0IGFuZCBpbnZhbGlkYXRlCisgICAgICAgICAgICBtTWFpblF1ZXVlLnBvc3QobmV3IFJ1bm5hYmxlKCkgeworICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICAgICAgcmVxdWVzdExheW91dCgpOworICAgICAgICAgICAgICAgICAgICBpbnZhbGlkYXRlKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgYWRkQ2hpbGQoVmlldyBjaGlsZCkgeworICAgICAgICBhZGRWaWV3SW5MYXlvdXQoY2hpbGQsIC0xLCBjcmVhdGVPclJldXNlTGF5b3V0UGFyYW1zKGNoaWxkKSk7CisKKyAgICAgICAgLy8gVGhpcyBjb2RlIGlzIHVzZWQgdG8gb2J0YWluIGEgcmVmZXJlbmNlIHdpZHRoIGFuZCBoZWlnaHQgb2YgYSBjaGlsZCBpbiBjYXNlIHdlIG5lZWQKKyAgICAgICAgLy8gdG8gZGVjaWRlIG91ciBvd24gc2l6ZS4gVE9ETzogRG8gd2Ugd2FudCB0byB1cGRhdGUgdGhlIHNpemUgb2YgdGhlIGNoaWxkIHRoYXQgd2UncmUKKyAgICAgICAgLy8gdXNpbmcgZm9yIHJlZmVyZW5jZSBzaXplPyBJZiBzbywgd2hlbj8KKyAgICAgICAgaWYgKG1SZWZlcmVuY2VDaGlsZFdpZHRoID09IC0xIHx8IG1SZWZlcmVuY2VDaGlsZEhlaWdodCA9PSAtMSkgeworICAgICAgICAgICAgaW50IG1lYXN1cmVTcGVjID0gTWVhc3VyZVNwZWMubWFrZU1lYXN1cmVTcGVjKDAsIE1lYXN1cmVTcGVjLlVOU1BFQ0lGSUVEKTsKKyAgICAgICAgICAgIGNoaWxkLm1lYXN1cmUobWVhc3VyZVNwZWMsIG1lYXN1cmVTcGVjKTsKKyAgICAgICAgICAgIG1SZWZlcmVuY2VDaGlsZFdpZHRoID0gY2hpbGQuZ2V0TWVhc3VyZWRXaWR0aCgpOworICAgICAgICAgICAgbVJlZmVyZW5jZUNoaWxkSGVpZ2h0ID0gY2hpbGQuZ2V0TWVhc3VyZWRIZWlnaHQoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBtZWFzdXJlQ2hpbGRyZW4oKSB7CisgICAgICAgIGZpbmFsIGludCBjb3VudCA9IGdldENoaWxkQ291bnQoKTsKKyAgICAgICAgZmluYWwgaW50IGNoaWxkV2lkdGggPSBtTWVhc3VyZWRXaWR0aCAtIG1QYWRkaW5nTGVmdCAtIG1QYWRkaW5nUmlnaHQ7CisgICAgICAgIGZpbmFsIGludCBjaGlsZEhlaWdodCA9IG1NZWFzdXJlZEhlaWdodCAtIG1QYWRkaW5nVG9wIC0gbVBhZGRpbmdCb3R0b207CisKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisgICAgICAgICAgICBmaW5hbCBWaWV3IGNoaWxkID0gZ2V0Q2hpbGRBdChpKTsKKyAgICAgICAgICAgIGNoaWxkLm1lYXN1cmUoTWVhc3VyZVNwZWMubWFrZU1lYXN1cmVTcGVjKGNoaWxkV2lkdGgsIE1lYXN1cmVTcGVjLkVYQUNUTFkpLAorICAgICAgICAgICAgICAgICAgICBNZWFzdXJlU3BlYy5tYWtlTWVhc3VyZVNwZWMoY2hpbGRIZWlnaHQsIE1lYXN1cmVTcGVjLkVYQUNUTFkpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG9uTWVhc3VyZShpbnQgd2lkdGhNZWFzdXJlU3BlYywgaW50IGhlaWdodE1lYXN1cmVTcGVjKSB7CisgICAgICAgIGludCB3aWR0aFNwZWNTaXplID0gTWVhc3VyZVNwZWMuZ2V0U2l6ZSh3aWR0aE1lYXN1cmVTcGVjKTsKKyAgICAgICAgaW50IGhlaWdodFNwZWNTaXplID0gTWVhc3VyZVNwZWMuZ2V0U2l6ZShoZWlnaHRNZWFzdXJlU3BlYyk7CisgICAgICAgIGZpbmFsIGludCB3aWR0aFNwZWNNb2RlID0gTWVhc3VyZVNwZWMuZ2V0TW9kZSh3aWR0aE1lYXN1cmVTcGVjKTsKKyAgICAgICAgZmluYWwgaW50IGhlaWdodFNwZWNNb2RlID0gTWVhc3VyZVNwZWMuZ2V0TW9kZShoZWlnaHRNZWFzdXJlU3BlYyk7CisKKyAgICAgICAgYm9vbGVhbiBoYXZlQ2hpbGRSZWZTaXplID0gKG1SZWZlcmVuY2VDaGlsZFdpZHRoICE9IC0xICYmIG1SZWZlcmVuY2VDaGlsZEhlaWdodCAhPSAtMSk7CisKKyAgICAgICAgLy8gV2UgbmVlZCB0byBkZWFsIHdpdGggdGhlIGNhc2Ugd2hlcmUgb3VyIHBhcmVudCBoYXNuJ3QgdG9sZCB1cyBob3cKKyAgICAgICAgLy8gYmlnIHdlIHNob3VsZCBiZS4gSW4gdGhpcyBjYXNlIHdlIHRyeSB0byB1c2UgdGhlIGRlc2lyZWQgc2l6ZSBvZiB0aGUgZmlyc3QKKyAgICAgICAgLy8gY2hpbGQgYWRkZWQuCisgICAgICAgIGlmIChoZWlnaHRTcGVjTW9kZSA9PSBNZWFzdXJlU3BlYy5VTlNQRUNJRklFRCkgeworICAgICAgICAgICAgaGVpZ2h0U3BlY1NpemUgPSBoYXZlQ2hpbGRSZWZTaXplID8gbVJlZmVyZW5jZUNoaWxkSGVpZ2h0ICsgbVBhZGRpbmdUb3AgKworICAgICAgICAgICAgICAgICAgICBtUGFkZGluZ0JvdHRvbSA6IDA7CisgICAgICAgIH0gZWxzZSBpZiAoaGVpZ2h0U3BlY01vZGUgPT0gTWVhc3VyZVNwZWMuQVRfTU9TVCkgeworICAgICAgICAgICAgaGVpZ2h0U3BlY1NpemUgPSBoYXZlQ2hpbGRSZWZTaXplID8gTWF0aC5taW4obVJlZmVyZW5jZUNoaWxkSGVpZ2h0ICsgbVBhZGRpbmdUb3AgKworICAgICAgICAgICAgICAgICAgICBtUGFkZGluZ0JvdHRvbSwgaGVpZ2h0U3BlY1NpemUpIDogMDsKKyAgICAgICAgfQorCisgICAgICAgIGlmICh3aWR0aFNwZWNNb2RlID09IE1lYXN1cmVTcGVjLlVOU1BFQ0lGSUVEKSB7CisgICAgICAgICAgICB3aWR0aFNwZWNTaXplID0gaGF2ZUNoaWxkUmVmU2l6ZSA/IG1SZWZlcmVuY2VDaGlsZFdpZHRoICsgbVBhZGRpbmdMZWZ0ICsKKyAgICAgICAgICAgICAgICAgICAgbVBhZGRpbmdSaWdodCA6IDA7CisgICAgICAgIH0gZWxzZSBpZiAoaGVpZ2h0U3BlY01vZGUgPT0gTWVhc3VyZVNwZWMuQVRfTU9TVCkgeworICAgICAgICAgICAgd2lkdGhTcGVjU2l6ZSA9IGhhdmVDaGlsZFJlZlNpemUgPyBNYXRoLm1pbihtUmVmZXJlbmNlQ2hpbGRXaWR0aCArIG1QYWRkaW5nTGVmdCArCisgICAgICAgICAgICAgICAgICAgIG1QYWRkaW5nUmlnaHQsIHdpZHRoU3BlY1NpemUpIDogMDsKKyAgICAgICAgfQorCisgICAgICAgIHNldE1lYXN1cmVkRGltZW5zaW9uKHdpZHRoU3BlY1NpemUsIGhlaWdodFNwZWNTaXplKTsKKyAgICAgICAgbWVhc3VyZUNoaWxkcmVuKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25MYXlvdXQoYm9vbGVhbiBjaGFuZ2VkLCBpbnQgbGVmdCwgaW50IHRvcCwgaW50IHJpZ2h0LCBpbnQgYm90dG9tKSB7CisgICAgICAgIGJvb2xlYW4gZGF0YUNoYW5nZWQgPSBtRGF0YUNoYW5nZWQ7CisgICAgICAgIGlmIChkYXRhQ2hhbmdlZCkgeworICAgICAgICAgICAgaGFuZGxlRGF0YUNoYW5nZWQoKTsKKworICAgICAgICAgICAgLy8gaWYgdGhlIGRhdGEgY2hhbmdlcywgbVdoaWNoQ2hpbGQgbWlnaHQgYmUgb3V0IG9mIHRoZSBib3VuZHMgb2YgdGhlIGFkYXB0ZXIKKyAgICAgICAgICAgIC8vIGluIHRoaXMgY2FzZSwgd2UgcmVzZXQgbVdoaWNoQ2hpbGQgdG8gdGhlIGJlZ2lubmluZworICAgICAgICAgICAgaWYgKG1XaGljaENoaWxkID49IG1BZGFwdGVyLmdldENvdW50KCkpIHsKKyAgICAgICAgICAgICAgICBtV2hpY2hDaGlsZCA9IDA7CisKKyAgICAgICAgICAgICAgICBzaG93T25seShtV2hpY2hDaGlsZCwgdHJ1ZSwgdHJ1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZWZyZXNoQ2hpbGRyZW4oKTsKKyAgICAgICAgfQorCisgICAgICAgIGZpbmFsIGludCBjaGlsZENvdW50ID0gZ2V0Q2hpbGRDb3VudCgpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkQ291bnQ7IGkrKykgeworICAgICAgICAgICAgZmluYWwgVmlldyBjaGlsZCA9IGdldENoaWxkQXQoaSk7CisKKyAgICAgICAgICAgIGludCBjaGlsZFJpZ2h0ID0gbVBhZGRpbmdMZWZ0ICsgY2hpbGQuZ2V0TWVhc3VyZWRXaWR0aCgpOworICAgICAgICAgICAgaW50IGNoaWxkQm90dG9tID0gbVBhZGRpbmdUb3AgKyBjaGlsZC5nZXRNZWFzdXJlZEhlaWdodCgpOworCisgICAgICAgICAgICBjaGlsZC5sYXlvdXQobVBhZGRpbmdMZWZ0LCBtUGFkZGluZ1RvcCwgY2hpbGRSaWdodCwgY2hpbGRCb3R0b20pOworICAgICAgICB9CisgICAgICAgIG1EYXRhQ2hhbmdlZCA9IGZhbHNlOworICAgIH0KKworICAgIHN0YXRpYyBjbGFzcyBTYXZlZFN0YXRlIGV4dGVuZHMgQmFzZVNhdmVkU3RhdGUgeworICAgICAgICBpbnQgd2hpY2hDaGlsZDsKKworICAgICAgICAvKioKKyAgICAgICAgICogQ29uc3RydWN0b3IgY2FsbGVkIGZyb20ge0BsaW5rIEFkYXB0ZXJWaWV3QW5pbWF0b3Ijb25TYXZlSW5zdGFuY2VTdGF0ZSgpfQorICAgICAgICAgKi8KKyAgICAgICAgU2F2ZWRTdGF0ZShQYXJjZWxhYmxlIHN1cGVyU3RhdGUsIGludCB3aGljaENoaWxkKSB7CisgICAgICAgICAgICBzdXBlcihzdXBlclN0YXRlKTsKKyAgICAgICAgICAgIHRoaXMud2hpY2hDaGlsZCA9IHdoaWNoQ2hpbGQ7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogQ29uc3RydWN0b3IgY2FsbGVkIGZyb20ge0BsaW5rICNDUkVBVE9SfQorICAgICAgICAgKi8KKyAgICAgICAgcHJpdmF0ZSBTYXZlZFN0YXRlKFBhcmNlbCBpbikgeworICAgICAgICAgICAgc3VwZXIoaW4pOworICAgICAgICAgICAgd2hpY2hDaGlsZCA9IGluLnJlYWRJbnQoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCB3cml0ZVRvUGFyY2VsKFBhcmNlbCBvdXQsIGludCBmbGFncykgeworICAgICAgICAgICAgc3VwZXIud3JpdGVUb1BhcmNlbChvdXQsIGZsYWdzKTsKKyAgICAgICAgICAgIG91dC53cml0ZUludCh3aGljaENoaWxkKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICAgICAgcmV0dXJuICJBZGFwdGVyVmlld0FuaW1hdG9yLlNhdmVkU3RhdGV7IHdoaWNoQ2hpbGQgPSAiICsgd2hpY2hDaGlsZCArICIgfSI7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFBhcmNlbGFibGUuQ3JlYXRvcjxTYXZlZFN0YXRlPiBDUkVBVE9SCisgICAgICAgICAgICAgICAgPSBuZXcgUGFyY2VsYWJsZS5DcmVhdG9yPFNhdmVkU3RhdGU+KCkgeworICAgICAgICAgICAgcHVibGljIFNhdmVkU3RhdGUgY3JlYXRlRnJvbVBhcmNlbChQYXJjZWwgaW4pIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFNhdmVkU3RhdGUoaW4pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgU2F2ZWRTdGF0ZVtdIG5ld0FycmF5KGludCBzaXplKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBTYXZlZFN0YXRlW3NpemVdOworICAgICAgICAgICAgfQorICAgICAgICB9OworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBQYXJjZWxhYmxlIG9uU2F2ZUluc3RhbmNlU3RhdGUoKSB7CisgICAgICAgIFBhcmNlbGFibGUgc3VwZXJTdGF0ZSA9IHN1cGVyLm9uU2F2ZUluc3RhbmNlU3RhdGUoKTsKKyAgICAgICAgcmV0dXJuIG5ldyBTYXZlZFN0YXRlKHN1cGVyU3RhdGUsIG1XaGljaENoaWxkKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvblJlc3RvcmVJbnN0YW5jZVN0YXRlKFBhcmNlbGFibGUgc3RhdGUpIHsKKyAgICAgICAgU2F2ZWRTdGF0ZSBzcyA9IChTYXZlZFN0YXRlKSBzdGF0ZTsKKyAgICAgICAgc3VwZXIub25SZXN0b3JlSW5zdGFuY2VTdGF0ZShzcy5nZXRTdXBlclN0YXRlKCkpOworCisgICAgICAgIC8vIEhlcmUgd2Ugc2V0IG1XaGljaENoaWxkIGluIGFkZGl0aW9uIHRvIHNldERpc3BsYXllZENoaWxkCisgICAgICAgIC8vIFdlIGRvIHRoZSBmb3JtZXIgaW4gY2FzZSBtQWRhcHRlciBpcyBudWxsLCBhbmQgaGVuY2Ugc2V0RGlzcGxheWVkQ2hpbGQgd29uJ3QKKyAgICAgICAgLy8gc2V0IG1XaGljaENoaWxkCisgICAgICAgIG1XaGljaENoaWxkID0gc3Mud2hpY2hDaGlsZDsKKyAgICAgICAgc2V0RGlzcGxheWVkQ2hpbGQobVdoaWNoQ2hpbGQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNob3dzIG9ubHkgdGhlIHNwZWNpZmllZCBjaGlsZC4gVGhlIG90aGVyIGRpc3BsYXlzIFZpZXdzIGV4aXQgdGhlIHNjcmVlbgorICAgICAqIHdpdGggdGhlIHtAbGluayAjZ2V0T3V0QW5pbWF0aW9uKCkgb3V0IGFuaW1hdGlvbn0gYW5kIHRoZSBzcGVjaWZpZWQgY2hpbGQKKyAgICAgKiBlbnRlcnMgdGhlIHNjcmVlbiB3aXRoIHRoZSB7QGxpbmsgI2dldEluQW5pbWF0aW9uKCkgaW4gYW5pbWF0aW9ufS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjaGlsZEluZGV4IFRoZSBpbmRleCBvZiB0aGUgY2hpbGQgdG8gYmUgc2hvd24uCisgICAgICovCisgICAgdm9pZCBzaG93T25seShpbnQgY2hpbGRJbmRleCkgeworICAgICAgICBmaW5hbCBib29sZWFuIGFuaW1hdGUgPSAoIW1GaXJzdFRpbWUgfHwgbUFuaW1hdGVGaXJzdFRpbWUpOworICAgICAgICBzaG93T25seShjaGlsZEluZGV4LCBhbmltYXRlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBWaWV3IGNvcnJlc3BvbmRpbmcgdG8gdGhlIGN1cnJlbnRseSBkaXNwbGF5ZWQgY2hpbGQuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFRoZSBWaWV3IGN1cnJlbnRseSBkaXNwbGF5ZWQuCisgICAgICoKKyAgICAgKiBAc2VlICNnZXREaXNwbGF5ZWRDaGlsZCgpCisgICAgICovCisgICAgcHVibGljIFZpZXcgZ2V0Q3VycmVudFZpZXcoKSB7CisgICAgICAgIHJldHVybiBnZXRWaWV3QXRSZWxhdGl2ZUluZGV4KG1BY3RpdmVPZmZzZXQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIGN1cnJlbnQgYW5pbWF0aW9uIHVzZWQgdG8gYW5pbWF0ZSBhIFZpZXcgdGhhdCBlbnRlcnMgdGhlIHNjcmVlbi4KKyAgICAgKgorICAgICAqIEByZXR1cm4gQW4gQW5pbWF0aW9uIG9yIG51bGwgaWYgbm9uZSBpcyBzZXQuCisgICAgICoKKyAgICAgKiBAc2VlICNzZXRJbkFuaW1hdGlvbihhbmRyb2lkLnZpZXcuYW5pbWF0aW9uLkFuaW1hdGlvbikKKyAgICAgKiBAc2VlICNzZXRJbkFuaW1hdGlvbihhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCwgaW50KQorICAgICAqLworICAgIHB1YmxpYyBBbmltYXRpb24gZ2V0SW5BbmltYXRpb24oKSB7CisgICAgICAgIHJldHVybiBtSW5BbmltYXRpb247CisgICAgfQorCisgICAgLyoqCisgICAgICogU3BlY2lmaWVzIHRoZSBhbmltYXRpb24gdXNlZCB0byBhbmltYXRlIGEgVmlldyB0aGF0IGVudGVycyB0aGUgc2NyZWVuLgorICAgICAqCisgICAgICogQHBhcmFtIGluQW5pbWF0aW9uIFRoZSBhbmltYXRpb24gc3RhcnRlZCB3aGVuIGEgVmlldyBlbnRlcnMgdGhlIHNjcmVlbi4KKyAgICAgKgorICAgICAqIEBzZWUgI2dldEluQW5pbWF0aW9uKCkKKyAgICAgKiBAc2VlICNzZXRJbkFuaW1hdGlvbihhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCwgaW50KQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEluQW5pbWF0aW9uKEFuaW1hdGlvbiBpbkFuaW1hdGlvbikgeworICAgICAgICBtSW5BbmltYXRpb24gPSBpbkFuaW1hdGlvbjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBjdXJyZW50IGFuaW1hdGlvbiB1c2VkIHRvIGFuaW1hdGUgYSBWaWV3IHRoYXQgZXhpdHMgdGhlIHNjcmVlbi4KKyAgICAgKgorICAgICAqIEByZXR1cm4gQW4gQW5pbWF0aW9uIG9yIG51bGwgaWYgbm9uZSBpcyBzZXQuCisgICAgICoKKyAgICAgKiBAc2VlICNzZXRPdXRBbmltYXRpb24oYW5kcm9pZC52aWV3LmFuaW1hdGlvbi5BbmltYXRpb24pCisgICAgICogQHNlZSAjc2V0T3V0QW5pbWF0aW9uKGFuZHJvaWQuY29udGVudC5Db250ZXh0LCBpbnQpCisgICAgICovCisgICAgcHVibGljIEFuaW1hdGlvbiBnZXRPdXRBbmltYXRpb24oKSB7CisgICAgICAgIHJldHVybiBtT3V0QW5pbWF0aW9uOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNwZWNpZmllcyB0aGUgYW5pbWF0aW9uIHVzZWQgdG8gYW5pbWF0ZSBhIFZpZXcgdGhhdCBleGl0IHRoZSBzY3JlZW4uCisgICAgICoKKyAgICAgKiBAcGFyYW0gb3V0QW5pbWF0aW9uIFRoZSBhbmltYXRpb24gc3RhcnRlZCB3aGVuIGEgVmlldyBleGl0IHRoZSBzY3JlZW4uCisgICAgICoKKyAgICAgKiBAc2VlICNnZXRPdXRBbmltYXRpb24oKQorICAgICAqIEBzZWUgI3NldE91dEFuaW1hdGlvbihhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCwgaW50KQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldE91dEFuaW1hdGlvbihBbmltYXRpb24gb3V0QW5pbWF0aW9uKSB7CisgICAgICAgIG1PdXRBbmltYXRpb24gPSBvdXRBbmltYXRpb247CisgICAgfQorCisgICAgLyoqCisgICAgICogU3BlY2lmaWVzIHRoZSBhbmltYXRpb24gdXNlZCB0byBhbmltYXRlIGEgVmlldyB0aGF0IGVudGVycyB0aGUgc2NyZWVuLgorICAgICAqCisgICAgICogQHBhcmFtIGNvbnRleHQgVGhlIGFwcGxpY2F0aW9uJ3MgZW52aXJvbm1lbnQuCisgICAgICogQHBhcmFtIHJlc291cmNlSUQgVGhlIHJlc291cmNlIGlkIG9mIHRoZSBhbmltYXRpb24uCisgICAgICoKKyAgICAgKiBAc2VlICNnZXRJbkFuaW1hdGlvbigpCisgICAgICogQHNlZSAjc2V0SW5BbmltYXRpb24oYW5kcm9pZC52aWV3LmFuaW1hdGlvbi5BbmltYXRpb24pCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0SW5BbmltYXRpb24oQ29udGV4dCBjb250ZXh0LCBpbnQgcmVzb3VyY2VJRCkgeworICAgICAgICBzZXRJbkFuaW1hdGlvbihBbmltYXRpb25VdGlscy5sb2FkQW5pbWF0aW9uKGNvbnRleHQsIHJlc291cmNlSUQpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTcGVjaWZpZXMgdGhlIGFuaW1hdGlvbiB1c2VkIHRvIGFuaW1hdGUgYSBWaWV3IHRoYXQgZXhpdCB0aGUgc2NyZWVuLgorICAgICAqCisgICAgICogQHBhcmFtIGNvbnRleHQgVGhlIGFwcGxpY2F0aW9uJ3MgZW52aXJvbm1lbnQuCisgICAgICogQHBhcmFtIHJlc291cmNlSUQgVGhlIHJlc291cmNlIGlkIG9mIHRoZSBhbmltYXRpb24uCisgICAgICoKKyAgICAgKiBAc2VlICNnZXRPdXRBbmltYXRpb24oKQorICAgICAqIEBzZWUgI3NldE91dEFuaW1hdGlvbihhbmRyb2lkLnZpZXcuYW5pbWF0aW9uLkFuaW1hdGlvbikKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRPdXRBbmltYXRpb24oQ29udGV4dCBjb250ZXh0LCBpbnQgcmVzb3VyY2VJRCkgeworICAgICAgICBzZXRPdXRBbmltYXRpb24oQW5pbWF0aW9uVXRpbHMubG9hZEFuaW1hdGlvbihjb250ZXh0LCByZXNvdXJjZUlEKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIGN1cnJlbnQgVmlldyBzaG91bGQgYmUgYW5pbWF0ZWQgdGhlIGZpcnN0IHRpbWUKKyAgICAgKiB0aGUgVmlld0FuaW1hdGlvbiBpcyBkaXNwbGF5ZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYW5pbWF0ZSBUcnVlIHRvIGFuaW1hdGUgdGhlIGN1cnJlbnQgVmlldyB0aGUgZmlyc3QgdGltZSBpdCBpcyBkaXNwbGF5ZWQsCisgICAgICogICAgICAgICAgICAgICAgZmFsc2Ugb3RoZXJ3aXNlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEFuaW1hdGVGaXJzdFZpZXcoYm9vbGVhbiBhbmltYXRlKSB7CisgICAgICAgIG1BbmltYXRlRmlyc3RUaW1lID0gYW5pbWF0ZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgaW50IGdldEJhc2VsaW5lKCkgeworICAgICAgICByZXR1cm4gKGdldEN1cnJlbnRWaWV3KCkgIT0gbnVsbCkgPyBnZXRDdXJyZW50VmlldygpLmdldEJhc2VsaW5lKCkgOiBzdXBlci5nZXRCYXNlbGluZSgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBBZGFwdGVyIGdldEFkYXB0ZXIoKSB7CisgICAgICAgIHJldHVybiBtQWRhcHRlcjsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBzZXRBZGFwdGVyKEFkYXB0ZXIgYWRhcHRlcikgeworICAgICAgICBpZiAobUFkYXB0ZXIgIT0gbnVsbCAmJiBtRGF0YVNldE9ic2VydmVyICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1BZGFwdGVyLnVucmVnaXN0ZXJEYXRhU2V0T2JzZXJ2ZXIobURhdGFTZXRPYnNlcnZlcik7CisgICAgICAgIH0KKworICAgICAgICBtQWRhcHRlciA9IGFkYXB0ZXI7CisgICAgICAgIGNoZWNrRm9jdXMoKTsKKworICAgICAgICBpZiAobUFkYXB0ZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgbURhdGFTZXRPYnNlcnZlciA9IG5ldyBBZGFwdGVyRGF0YVNldE9ic2VydmVyKCk7CisgICAgICAgICAgICBtQWRhcHRlci5yZWdpc3RlckRhdGFTZXRPYnNlcnZlcihtRGF0YVNldE9ic2VydmVyKTsKKyAgICAgICAgfQorICAgICAgICBzZXRGb2N1c2FibGUodHJ1ZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB1cCB0aGlzIEFkYXB0ZXJWaWV3QW5pbWF0b3IgdG8gdXNlIGEgcmVtb3RlIHZpZXdzIGFkYXB0ZXIgd2hpY2ggY29ubmVjdHMgdG8gYQorICAgICAqIFJlbW90ZVZpZXdzU2VydmljZSB0aHJvdWdoIHRoZSBzcGVjaWZpZWQgaW50ZW50LgorICAgICAqCisgICAgICogQHBhcmFtIGludGVudCB0aGUgaW50ZW50IHVzZWQgdG8gaWRlbnRpZnkgdGhlIFJlbW90ZVZpZXdzU2VydmljZSBmb3IgdGhlIGFkYXB0ZXIgdG8KKyAgICAgKiAgICAgICAgY29ubmVjdCB0by4KKyAgICAgKi8KKyAgICBAYW5kcm9pZC52aWV3LlJlbW90YWJsZVZpZXdNZXRob2QKKyAgICBwdWJsaWMgdm9pZCBzZXRSZW1vdGVWaWV3c0FkYXB0ZXIoSW50ZW50IGludGVudCkgeworICAgICAgICBtUmVtb3RlVmlld3NBZGFwdGVyID0gbmV3IFJlbW90ZVZpZXdzQWRhcHRlcihnZXRDb250ZXh0KCksIGludGVudCwgdGhpcyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgc2V0U2VsZWN0aW9uKGludCBwb3NpdGlvbikgeworICAgICAgICBzZXREaXNwbGF5ZWRDaGlsZChwb3NpdGlvbik7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFZpZXcgZ2V0U2VsZWN0ZWRWaWV3KCkgeworICAgICAgICByZXR1cm4gZ2V0Vmlld0F0UmVsYXRpdmVJbmRleChtQWN0aXZlT2Zmc2V0KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDYWxsZWQgYmFjayB3aGVuIHRoZSBhZGFwdGVyIGNvbm5lY3RzIHRvIHRoZSBSZW1vdGVWaWV3c1NlcnZpY2UuCisgICAgICovCisgICAgcHVibGljIHZvaWQgb25SZW1vdGVBZGFwdGVyQ29ubmVjdGVkKCkgeworICAgICAgICBpZiAobVJlbW90ZVZpZXdzQWRhcHRlciAhPSBtQWRhcHRlcikgeworICAgICAgICAgICAgc2V0QWRhcHRlcihtUmVtb3RlVmlld3NBZGFwdGVyKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIENhbGxlZCBiYWNrIHdoZW4gdGhlIGFkYXB0ZXIgZGlzY29ubmVjdHMgZnJvbSB0aGUgUmVtb3RlVmlld3NTZXJ2aWNlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIG9uUmVtb3RlQWRhcHRlckRpc2Nvbm5lY3RlZCgpIHsKKyAgICAgICAgaWYgKG1SZW1vdGVWaWV3c0FkYXB0ZXIgIT0gbUFkYXB0ZXIpIHsKKyAgICAgICAgICAgIG1SZW1vdGVWaWV3c0FkYXB0ZXIgPSBudWxsOworICAgICAgICAgICAgc2V0QWRhcHRlcihtUmVtb3RlVmlld3NBZGFwdGVyKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9BZGFwdGVyVmlld0ZsaXBwZXIuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9BZGFwdGVyVmlld0ZsaXBwZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OTU2ODNkCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L0FkYXB0ZXJWaWV3RmxpcHBlci5qYXZhCkBAIC0wLDAgKzEsMjcwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLndpZGdldDsKKworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Ccm9hZGNhc3RSZWNlaXZlcjsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnRGaWx0ZXI7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5UeXBlZEFycmF5OworaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLk1lc3NhZ2U7CitpbXBvcnQgYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldDsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworaW1wb3J0IGFuZHJvaWQudmlldy5SZW1vdGFibGVWaWV3TWV0aG9kOworaW1wb3J0IGFuZHJvaWQudmlldy5hbmltYXRpb24uQWxwaGFBbmltYXRpb247CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuUmVtb3RlVmlld3MuUmVtb3RlVmlldzsKKworLyoqCisgKiBTaW1wbGUge0BsaW5rIFZpZXdBbmltYXRvcn0gdGhhdCB3aWxsIGFuaW1hdGUgYmV0d2VlbiB0d28gb3IgbW9yZSB2aWV3cworICogdGhhdCBoYXZlIGJlZW4gYWRkZWQgdG8gaXQuICBPbmx5IG9uZSBjaGlsZCBpcyBzaG93biBhdCBhIHRpbWUuICBJZgorICogcmVxdWVzdGVkLCBjYW4gYXV0b21hdGljYWxseSBmbGlwIGJldHdlZW4gZWFjaCBjaGlsZCBhdCBhIHJlZ3VsYXIgaW50ZXJ2YWwuCisgKgorICogQGF0dHIgcmVmIGFuZHJvaWQuUi5zdHlsZWFibGUjQWRhcHRlclZpZXdGbGlwcGVyX2ZsaXBJbnRlcnZhbAorICogQGF0dHIgcmVmIGFuZHJvaWQuUi5zdHlsZWFibGUjQWRhcHRlclZpZXdGbGlwcGVyX2F1dG9TdGFydAorICovCitAUmVtb3RlVmlldworcHVibGljIGNsYXNzIEFkYXB0ZXJWaWV3RmxpcHBlciBleHRlbmRzIEFkYXB0ZXJWaWV3QW5pbWF0b3IgeworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiVmlld0ZsaXBwZXIiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gTE9HRCA9IGZhbHNlOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IERFRkFVTFRfSU5URVJWQUwgPSAxMDAwMDsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgREVGQVVMVF9BTklNQVRJT05fRFVSQVRJT04gPSAyMDA7CisKKyAgICBwcml2YXRlIGludCBtRmxpcEludGVydmFsID0gREVGQVVMVF9JTlRFUlZBTDsKKyAgICBwcml2YXRlIGludCBtQW5pbWF0aW9uRHVyYXRpb24gPSBERUZBVUxUX0FOSU1BVElPTl9EVVJBVElPTjsKKyAgICBwcml2YXRlIGJvb2xlYW4gbUF1dG9TdGFydCA9IGZhbHNlOworCisgICAgcHJpdmF0ZSBib29sZWFuIG1SdW5uaW5nID0gZmFsc2U7CisgICAgcHJpdmF0ZSBib29sZWFuIG1TdGFydGVkID0gZmFsc2U7CisgICAgcHJpdmF0ZSBib29sZWFuIG1WaXNpYmxlID0gZmFsc2U7CisgICAgcHJpdmF0ZSBib29sZWFuIG1Vc2VyUHJlc2VudCA9IHRydWU7CisKKyAgICBwdWJsaWMgQWRhcHRlclZpZXdGbGlwcGVyKENvbnRleHQgY29udGV4dCkgeworICAgICAgICBzdXBlcihjb250ZXh0KTsKKyAgICAgICAgaW5pdERlZmF1bHRBbmltYXRpb25zKCk7CisgICAgfQorCisgICAgcHVibGljIEFkYXB0ZXJWaWV3RmxpcHBlcihDb250ZXh0IGNvbnRleHQsIEF0dHJpYnV0ZVNldCBhdHRycykgeworICAgICAgICBzdXBlcihjb250ZXh0LCBhdHRycyk7CisKKyAgICAgICAgVHlwZWRBcnJheSBhID0gY29udGV4dC5vYnRhaW5TdHlsZWRBdHRyaWJ1dGVzKGF0dHJzLAorICAgICAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLlZpZXdGbGlwcGVyKTsKKyAgICAgICAgbUZsaXBJbnRlcnZhbCA9IGEuZ2V0SW50KAorICAgICAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLlZpZXdGbGlwcGVyX2ZsaXBJbnRlcnZhbCwgREVGQVVMVF9JTlRFUlZBTCk7CisgICAgICAgIG1BdXRvU3RhcnQgPSBhLmdldEJvb2xlYW4oCisgICAgICAgICAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZWFibGUuVmlld0ZsaXBwZXJfYXV0b1N0YXJ0LCBmYWxzZSk7CisgICAgICAgIGEucmVjeWNsZSgpOworICAgICAgICBpbml0RGVmYXVsdEFuaW1hdGlvbnMoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgaW5pdERlZmF1bHRBbmltYXRpb25zKCkgeworICAgICAgICAvLyBTZXQgdGhlIGRlZmF1bHQgYW5pbWF0aW9ucyB0byBiZSBmYWRlIGluL291dAorICAgICAgICBpZiAobUluQW5pbWF0aW9uID09IG51bGwpIHsKKyAgICAgICAgICAgIG1JbkFuaW1hdGlvbiA9IG5ldyBBbHBoYUFuaW1hdGlvbigwLjBmLCAxLjBmKTsKKyAgICAgICAgICAgIG1JbkFuaW1hdGlvbi5zZXREdXJhdGlvbihtQW5pbWF0aW9uRHVyYXRpb24pOworICAgICAgICB9CisgICAgICAgIGlmIChtT3V0QW5pbWF0aW9uID09IG51bGwpIHsKKyAgICAgICAgICAgIG1PdXRBbmltYXRpb24gPSBuZXcgQWxwaGFBbmltYXRpb24oMS4wZiwgMC4wZik7CisgICAgICAgICAgICBtT3V0QW5pbWF0aW9uLnNldER1cmF0aW9uKG1BbmltYXRpb25EdXJhdGlvbik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIGZpbmFsIEJyb2FkY2FzdFJlY2VpdmVyIG1SZWNlaXZlciA9IG5ldyBCcm9hZGNhc3RSZWNlaXZlcigpIHsKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIG9uUmVjZWl2ZShDb250ZXh0IGNvbnRleHQsIEludGVudCBpbnRlbnQpIHsKKyAgICAgICAgICAgIGZpbmFsIFN0cmluZyBhY3Rpb24gPSBpbnRlbnQuZ2V0QWN0aW9uKCk7CisgICAgICAgICAgICBpZiAoSW50ZW50LkFDVElPTl9TQ1JFRU5fT0ZGLmVxdWFscyhhY3Rpb24pKSB7CisgICAgICAgICAgICAgICAgbVVzZXJQcmVzZW50ID0gZmFsc2U7CisgICAgICAgICAgICAgICAgdXBkYXRlUnVubmluZygpOworICAgICAgICAgICAgfSBlbHNlIGlmIChJbnRlbnQuQUNUSU9OX1VTRVJfUFJFU0VOVC5lcXVhbHMoYWN0aW9uKSkgeworICAgICAgICAgICAgICAgIG1Vc2VyUHJlc2VudCA9IHRydWU7CisgICAgICAgICAgICAgICAgdXBkYXRlUnVubmluZyhmYWxzZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9OworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25BdHRhY2hlZFRvV2luZG93KCkgeworICAgICAgICBzdXBlci5vbkF0dGFjaGVkVG9XaW5kb3coKTsKKworICAgICAgICAvLyBMaXN0ZW4gZm9yIGJyb2FkY2FzdHMgcmVsYXRlZCB0byB1c2VyLXByZXNlbmNlCisgICAgICAgIGZpbmFsIEludGVudEZpbHRlciBmaWx0ZXIgPSBuZXcgSW50ZW50RmlsdGVyKCk7CisgICAgICAgIGZpbHRlci5hZGRBY3Rpb24oSW50ZW50LkFDVElPTl9TQ1JFRU5fT0ZGKTsKKyAgICAgICAgZmlsdGVyLmFkZEFjdGlvbihJbnRlbnQuQUNUSU9OX1VTRVJfUFJFU0VOVCk7CisgICAgICAgIGdldENvbnRleHQoKS5yZWdpc3RlclJlY2VpdmVyKG1SZWNlaXZlciwgZmlsdGVyKTsKKworICAgICAgICBpZiAobUF1dG9TdGFydCkgeworICAgICAgICAgICAgLy8gQXV0b21hdGljYWxseSBzdGFydCB3aGVuIHJlcXVlc3RlZAorICAgICAgICAgICAgc3RhcnRGbGlwcGluZygpOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25EZXRhY2hlZEZyb21XaW5kb3coKSB7CisgICAgICAgIHN1cGVyLm9uRGV0YWNoZWRGcm9tV2luZG93KCk7CisgICAgICAgIG1WaXNpYmxlID0gZmFsc2U7CisKKyAgICAgICAgZ2V0Q29udGV4dCgpLnVucmVnaXN0ZXJSZWNlaXZlcihtUmVjZWl2ZXIpOworICAgICAgICB1cGRhdGVSdW5uaW5nKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25XaW5kb3dWaXNpYmlsaXR5Q2hhbmdlZChpbnQgdmlzaWJpbGl0eSkgeworICAgICAgICBzdXBlci5vbldpbmRvd1Zpc2liaWxpdHlDaGFuZ2VkKHZpc2liaWxpdHkpOworICAgICAgICBtVmlzaWJsZSA9ICh2aXNpYmlsaXR5ID09IFZJU0lCTEUpOworICAgICAgICB1cGRhdGVSdW5uaW5nKGZhbHNlKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBzZXRBZGFwdGVyKEFkYXB0ZXIgYWRhcHRlcikgeworICAgICAgICBzdXBlci5zZXRBZGFwdGVyKGFkYXB0ZXIpOworICAgICAgICB1cGRhdGVSdW5uaW5nKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogSG93IGxvbmcgdG8gd2FpdCBiZWZvcmUgZmxpcHBpbmcgdG8gdGhlIG5leHQgdmlldworICAgICAqCisgICAgICogQHBhcmFtIG1pbGxpc2Vjb25kcworICAgICAqICAgICAgICAgICAgdGltZSBpbiBtaWxsaXNlY29uZHMKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRGbGlwSW50ZXJ2YWwoaW50IG1pbGxpc2Vjb25kcykgeworICAgICAgICBtRmxpcEludGVydmFsID0gbWlsbGlzZWNvbmRzOworICAgIH0KKworICAgIC8qKgorICAgICAqIFN0YXJ0IGEgdGltZXIgdG8gY3ljbGUgdGhyb3VnaCBjaGlsZCB2aWV3cworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHN0YXJ0RmxpcHBpbmcoKSB7CisgICAgICAgIG1TdGFydGVkID0gdHJ1ZTsKKyAgICAgICAgdXBkYXRlUnVubmluZygpOworICAgIH0KKworICAgIC8qKgorICAgICAqIE5vIG1vcmUgZmxpcHMKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzdG9wRmxpcHBpbmcoKSB7CisgICAgICAgIG1TdGFydGVkID0gZmFsc2U7CisgICAgICAgIHVwZGF0ZVJ1bm5pbmcoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAqIHtAaW5oZXJpdERvY30KKyAgICAqLworICAgQE92ZXJyaWRlCisgICBAUmVtb3RhYmxlVmlld01ldGhvZAorICAgcHVibGljIHZvaWQgc2hvd05leHQoKSB7CisgICAgICAgLy8gaWYgdGhlIGZsaXBwZXIgaXMgY3VycmVudGx5IGZsaXBwaW5nIGF1dG9tYXRpY2FsbHksIGFuZCBzaG93TmV4dCgpIGlzIGNhbGxlZAorICAgICAgIC8vIHdlIHNob3VsZCB3ZSBzaG91bGQgbWFrZSBzdXJlIHRvIHJlc2V0IHRoZSB0aW1lcgorICAgICAgIGlmIChtUnVubmluZykgeworICAgICAgICAgICBtSGFuZGxlci5yZW1vdmVNZXNzYWdlcyhGTElQX01TRyk7CisgICAgICAgICAgIE1lc3NhZ2UgbXNnID0gbUhhbmRsZXIub2J0YWluTWVzc2FnZShGTElQX01TRyk7CisgICAgICAgICAgIG1IYW5kbGVyLnNlbmRNZXNzYWdlRGVsYXllZChtc2csIG1GbGlwSW50ZXJ2YWwpOworICAgICAgIH0KKyAgICAgICBzdXBlci5zaG93TmV4dCgpOworICAgfQorCisgICAvKioKKyAgICAqIHtAaW5oZXJpdERvY30KKyAgICAqLworICAgQE92ZXJyaWRlCisgICBAUmVtb3RhYmxlVmlld01ldGhvZAorICAgcHVibGljIHZvaWQgc2hvd1ByZXZpb3VzKCkgeworICAgICAgIC8vIGlmIHRoZSBmbGlwcGVyIGlzIGN1cnJlbnRseSBmbGlwcGluZyBhdXRvbWF0aWNhbGx5LCBhbmQgc2hvd1ByZXZpb3VzKCkgaXMgY2FsbGVkCisgICAgICAgLy8gd2Ugc2hvdWxkIHdlIHNob3VsZCBtYWtlIHN1cmUgdG8gcmVzZXQgdGhlIHRpbWVyCisgICAgICAgaWYgKG1SdW5uaW5nKSB7CisgICAgICAgICAgIG1IYW5kbGVyLnJlbW92ZU1lc3NhZ2VzKEZMSVBfTVNHKTsKKyAgICAgICAgICAgTWVzc2FnZSBtc2cgPSBtSGFuZGxlci5vYnRhaW5NZXNzYWdlKEZMSVBfTVNHKTsKKyAgICAgICAgICAgbUhhbmRsZXIuc2VuZE1lc3NhZ2VEZWxheWVkKG1zZywgbUZsaXBJbnRlcnZhbCk7CisgICAgICAgfQorICAgICAgIHN1cGVyLnNob3dQcmV2aW91cygpOworICAgfQorCisgICAvKioKKworICAgIC8qKgorICAgICAqIEludGVybmFsIG1ldGhvZCB0byBzdGFydCBvciBzdG9wIGRpc3BhdGNoaW5nIGZsaXAge0BsaW5rIE1lc3NhZ2V9IGJhc2VkCisgICAgICogb24ge0BsaW5rICNtUnVubmluZ30gYW5kIHtAbGluayAjbVZpc2libGV9IHN0YXRlLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCB1cGRhdGVSdW5uaW5nKCkgeworICAgICAgICAvLyBieSBkZWZhdWx0IHdoZW4gd2UgdXBkYXRlIHJ1bm5pbmcsIHdlIHdhbnQgdGhlCisgICAgICAgIC8vIGN1cnJlbnQgdmlldyB0byBhbmltYXRlIGluCisgICAgICAgIHVwZGF0ZVJ1bm5pbmcodHJ1ZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogSW50ZXJuYWwgbWV0aG9kIHRvIHN0YXJ0IG9yIHN0b3AgZGlzcGF0Y2hpbmcgZmxpcCB7QGxpbmsgTWVzc2FnZX0gYmFzZWQKKyAgICAgKiBvbiB7QGxpbmsgI21SdW5uaW5nfSBhbmQge0BsaW5rICNtVmlzaWJsZX0gc3RhdGUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZmxpcE5vdyBEZXRlcm1pbmVzIHdoZXRoZXIgb3Igbm90IHRvIGV4ZWN1dGUgdGhlIGFuaW1hdGlvbiBub3csIGluCisgICAgICogICAgICAgICAgICBhZGRpdGlvbiB0byBxdWV1aW5nIGZ1dHVyZSBmbGlwcy4gSWYgb21pdHRlZCwgZGVmYXVsdHMgdG8KKyAgICAgKiAgICAgICAgICAgIHRydWUuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIHVwZGF0ZVJ1bm5pbmcoYm9vbGVhbiBmbGlwTm93KSB7CisgICAgICAgIGJvb2xlYW4gcnVubmluZyA9IG1WaXNpYmxlICYmIG1TdGFydGVkICYmIG1Vc2VyUHJlc2VudCAmJiBtQWRhcHRlciAhPSBudWxsOworICAgICAgICBpZiAocnVubmluZyAhPSBtUnVubmluZykgeworICAgICAgICAgICAgaWYgKHJ1bm5pbmcpIHsKKyAgICAgICAgICAgICAgICBzaG93T25seShtV2hpY2hDaGlsZCwgZmxpcE5vdyk7CisgICAgICAgICAgICAgICAgTWVzc2FnZSBtc2cgPSBtSGFuZGxlci5vYnRhaW5NZXNzYWdlKEZMSVBfTVNHKTsKKyAgICAgICAgICAgICAgICBtSGFuZGxlci5zZW5kTWVzc2FnZURlbGF5ZWQobXNnLCBtRmxpcEludGVydmFsKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbUhhbmRsZXIucmVtb3ZlTWVzc2FnZXMoRkxJUF9NU0cpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbVJ1bm5pbmcgPSBydW5uaW5nOworICAgICAgICB9CisgICAgICAgIGlmIChMT0dEKSB7CisgICAgICAgICAgICBMb2cuZChUQUcsICJ1cGRhdGVSdW5uaW5nKCkgbVZpc2libGU9IiArIG1WaXNpYmxlICsgIiwgbVN0YXJ0ZWQ9IiArIG1TdGFydGVkCisgICAgICAgICAgICAgICAgICAgICsgIiwgbVVzZXJQcmVzZW50PSIgKyBtVXNlclByZXNlbnQgKyAiLCBtUnVubmluZz0iICsgbVJ1bm5pbmcpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBjaGlsZCB2aWV3cyBhcmUgZmxpcHBpbmcuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNGbGlwcGluZygpIHsKKyAgICAgICAgcmV0dXJuIG1TdGFydGVkOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCBpZiB0aGlzIHZpZXcgYXV0b21hdGljYWxseSBjYWxscyB7QGxpbmsgI3N0YXJ0RmxpcHBpbmcoKX0gd2hlbiBpdAorICAgICAqIGJlY29tZXMgYXR0YWNoZWQgdG8gYSB3aW5kb3cuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0QXV0b1N0YXJ0KGJvb2xlYW4gYXV0b1N0YXJ0KSB7CisgICAgICAgIG1BdXRvU3RhcnQgPSBhdXRvU3RhcnQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0cnVlIGlmIHRoaXMgdmlldyBhdXRvbWF0aWNhbGx5IGNhbGxzIHtAbGluayAjc3RhcnRGbGlwcGluZygpfQorICAgICAqIHdoZW4gaXQgYmVjb21lcyBhdHRhY2hlZCB0byBhIHdpbmRvdy4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc0F1dG9TdGFydCgpIHsKKyAgICAgICAgcmV0dXJuIG1BdXRvU3RhcnQ7CisgICAgfQorCisgICAgcHJpdmF0ZSBmaW5hbCBpbnQgRkxJUF9NU0cgPSAxOworCisgICAgcHJpdmF0ZSBmaW5hbCBIYW5kbGVyIG1IYW5kbGVyID0gbmV3IEhhbmRsZXIoKSB7CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBoYW5kbGVNZXNzYWdlKE1lc3NhZ2UgbXNnKSB7CisgICAgICAgICAgICBpZiAobXNnLndoYXQgPT0gRkxJUF9NU0cpIHsKKyAgICAgICAgICAgICAgICBpZiAobVJ1bm5pbmcpIHsKKyAgICAgICAgICAgICAgICAgICAgc2hvd05leHQoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9OworfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L0FkYXB0ZXJzLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvQWRhcHRlcnMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZmQ3ZmI1Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L0FkYXB0ZXJzLmphdmEKQEAgLTAsMCArMSwxMjMyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLndpZGdldDsKKworaW1wb3J0IG9yZy54bWxwdWxsLnYxLlhtbFB1bGxQYXJzZXI7CitpbXBvcnQgb3JnLnhtbHB1bGwudjEuWG1sUHVsbFBhcnNlckV4Y2VwdGlvbjsKKworaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuUmVzb3VyY2VzOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuVHlwZWRBcnJheTsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlhtbFJlc291cmNlUGFyc2VyOworaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2UuQ3Vyc29yOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwRmFjdG9yeTsKK2ltcG9ydCBhbmRyb2lkLm5ldC5Vcmk7CitpbXBvcnQgYW5kcm9pZC5vcy5Bc3luY1Rhc2s7CitpbXBvcnQgYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldDsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuWG1sOworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5Db25zdHJ1Y3RvcjsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CisKKy8qKgorICogPHA+VGhpcyBjbGFzcyBjYW4gYmUgdXNlZCB0byBsb2FkIHtAbGluayBhbmRyb2lkLndpZGdldC5BZGFwdGVyIGFkYXB0ZXJzfSBkZWZpbmVkIGluCisgKiBYTUwgcmVzb3VyY2VzLiBYTUwtZGVmaW5lZCBhZGFwdGVycyBjYW4gYmUgdXNlZCB0byBlYXNpbHkgY3JlYXRlIGFkYXB0ZXJzIGluIHlvdXIKKyAqIG93biBhcHBsaWNhdGlvbiBvciB0byBwYXNzIGFkYXB0ZXJzIHRvIG90aGVyIHByb2Nlc3Nlcy48L3A+CisgKiAKKyAqIDxoMj5UeXBlcyBvZiBhZGFwdGVyczwvaDI+CisgKiA8cD5BZGFwdGVycyBkZWZpbmVkIHVzaW5nIFhNTCByZXNvdXJjZXMgY2FuIG9ubHkgYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgc3VwcG9ydGVkCisgKiB0eXBlcy4gQXJiaXRyYXJ5IGFkYXB0ZXJzIGFyZSBub3Qgc3VwcG9ydGVkIHRvIGd1YXJhbnRlZSB0aGUgc2FmZXR5IG9mIHRoZSBsb2FkZWQKKyAqIGNvZGUgd2hlbiBhZGFwdGVycyBhcmUgbG9hZGVkIGFjcm9zcyBwYWNrYWdlcy48L3A+CisgKiA8dWw+CisgKiAgPGxpPjxhIGhyZWY9IiN4bWwtY3Vyc29yLWFkYXB0ZXIiPkN1cnNvciBhZGFwdGVyPC9hPjogYSBjdXJzb3IgYWRhcHRlciBjYW4gYmUgdXNlZAorICogIHRvIGRpc3BsYXkgdGhlIGNvbnRlbnQgb2YgYSBjdXJzb3IsIG1vc3Qgb2Z0ZW4gY29taW5nIGZyb20gYSBjb250ZW50IHByb3ZpZGVyPC9saT4KKyAqIDwvdWw+CisgKiA8cD5UaGUgY29tcGxldGUgWE1MIGZvcm1hdCBkZWZpbml0aW9uIG9mIGVhY2ggYWRhcHRlciB0eXBlIGlzIGF2YWlsYWJsZSBiZWxvdy48L3A+CisgKiAKKyAqIDxhIG5hbWU9InhtbC1jdXJzb3ItYWRhcHRlciIgLz4KKyAqIDxoMj5DdXJzb3IgYWRhcHRlcjwvaDI+CisgKiA8cD5BIGN1cnNvciBhZGFwdGVyIFhNTCBkZWZpbml0aW9uIHN0YXJ0cyB3aXRoIHRoZQorICogPGEgaHJlZj0iI3htbC1jdXJzb3ItYWRhcHRlci10YWciPjxjb2RlPiZsdDtjdXJzb3ItYWRhcHRlciAvJmd0OzwvY29kZT48L2E+CisgKiB0YWcgYW5kIG1heSBjb250YWluIG9uZSBvciBtb3JlIGluc3RhbmNlcyBvZiB0aGUgZm9sbG93aW5nIHRhZ3M6PC9wPgorICogPHVsPgorICogIDxsaT48YSBocmVmPSIjeG1sLWN1cnNvci1hZGFwdGVyLXNlbGVjdC10YWciPjxjb2RlPiZsdDtzZWxlY3QgLyZndDs8L2NvZGU+PC9hPjwvbGk+CisgKiAgPGxpPjxhIGhyZWY9IiN4bWwtY3Vyc29yLWFkYXB0ZXItYmluZC10YWciPjxjb2RlPiZsdDtiaW5kIC8mZ3Q7PC9jb2RlPjwvYT48L2xpPgorICogPC91bD4KKyAqIAorICogPGEgbmFtZT0ieG1sLWN1cnNvci1hZGFwdGVyLXRhZyIgLz4KKyAqIDxoMz4mbHQ7Y3Vyc29yLWFkYXB0ZXIgLyZndDs8L2gzPgorICogPHA+VGhlIDxjb2RlPiZsdDtjdXJzb3ItYWRhcHRlciAvJmd0OzwvY29kZT4gZWxlbWVudCBkZWZpbmVzIHRoZSBiZWdpbm5pbmcgb2YgdGhlCisgKiBkb2N1bWVudCBhbmQgc3VwcG9ydHMgdGhlIGZvbGxvd2luZyBhdHRyaWJ1dGVzOjwvcD4KKyAqIDx1bD4KKyAqICA8bGk+PGNvZGU+YW5kcm9pZDpsYXlvdXQ8L2NvZGU+OiBSZWZlcmVuY2UgdG8gdGhlIFhNTCBsYXlvdXQgdG8gYmUgaW5mbGF0ZWQgZm9yCisgKiAgZWFjaCBpdGVtIG9mIHRoZSBhZGFwdGVyLiBUaGlzIGF0dHJpYnV0ZSBpcyBtYW5kYXRvcnkuPC9saT4KKyAqICA8bGk+PGNvZGU+YW5kcm9pZDpzZWxlY3Rpb248L2NvZGU+OiBTZWxlY3Rpb24gZXhwcmVzc2lvbiwgdXNlZCB3aGVuIHRoZQorICogIDxjb2RlPmFuZHJvaWQ6dXJpPC9jb2RlPiBhdHRyaWJ1dGUgaXMgZGVmaW5lZCBvciB3aGVuIHRoZSBhZGFwdGVyIGlzIGxvYWRlZCB3aXRoCisgKiAge0BsaW5rIGFuZHJvaWQud2lkZ2V0LkFkYXB0ZXJzI2xvYWRDdXJzb3JBZGFwdGVyKGFuZHJvaWQuY29udGVudC5Db250ZXh0LCBpbnQsIFN0cmluZywgT2JqZWN0W10pfS4KKyAqICBUaGlzIGF0dHJpYnV0ZSBpcyBvcHRpb25hbC48L2xpPgorICogIDxsaT48Y29kZT5hbmRyb2lkOnNvcnRPcmRlcjwvY29kZT46IFNvcnQgZXhwcmVzc2lvbiwgdXNlZCB3aGVuIHRoZQorICogIDxjb2RlPmFuZHJvaWQ6dXJpPC9jb2RlPiBhdHRyaWJ1dGUgaXMgZGVmaW5lZCBvciB3aGVuIHRoZSBhZGFwdGVyIGlzIGxvYWRlZCB3aXRoCisgKiAge0BsaW5rIGFuZHJvaWQud2lkZ2V0LkFkYXB0ZXJzI2xvYWRDdXJzb3JBZGFwdGVyKGFuZHJvaWQuY29udGVudC5Db250ZXh0LCBpbnQsIFN0cmluZywgT2JqZWN0W10pfS4KKyAqICBUaGlzIGF0dHJpYnV0ZSBpcyBvcHRpb25hbC48L2xpPgorICogIDxsaT48Y29kZT5hbmRyb2lkOnVyaTwvY29kZT46IFVSSSBvZiB0aGUgY29udGVudCBwcm92aWRlciB0byBxdWVyeSB0byByZXRyaWV2ZSBhIGN1cnNvci4KKyAqICBTcGVjaWZ5aW5nIHRoaXMgYXR0cmlidXRlIGlzIGVxdWl2YWxlbnQgdG8gY2FsbGluZworICogIHtAbGluayBhbmRyb2lkLndpZGdldC5BZGFwdGVycyNsb2FkQ3Vyc29yQWRhcHRlcihhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCwgaW50LCBTdHJpbmcsIE9iamVjdFtdKX0uCisgKiAgSWYgeW91IGNhbGwgdGhpcyBtZXRob2QsIHRoZSB2YWx1ZSBvZiB0aGUgWE1MIGF0dHJpYnV0ZSBpcyBpZ25vcmVkLiBUaGlzIGF0dHJpYnV0ZSBpcworICogIG9wdGlvbmFsLjwvbGk+CisgKiA8L3VsPgorICogPHA+SW4gYWRkaXRpb24sIHlvdSBjYW4gc3BlY2lmeSBvbmUgb3IgbW9yZSBpbnN0YW5jZXMgb2YKKyAqIDxhIGhyZWY9IiN4bWwtY3Vyc29yLWFkYXB0ZXItc2VsZWN0LXRhZyI+PGNvZGU+Jmx0O3NlbGVjdCAvJmd0OzwvY29kZT48L2E+IGFuZAorICogPGEgaHJlZj0iI3htbC1jdXJzb3ItYWRhcHRlci1iaW5kLXRhZyI+PGNvZGU+Jmx0O2JpbmQgLyZndDs8L2NvZGU+PC9hPiB0YWdzIGFzIGNoaWxkcmVuCisgKiBvZiA8Y29kZT4mbHQ7Y3Vyc29yLWFkYXB0ZXIgLyZndDs8L2NvZGU+LjwvcD4KKyAqIAorICogPGEgbmFtZT0ieG1sLWN1cnNvci1hZGFwdGVyLXNlbGVjdC10YWciIC8+CisgKiA8aDM+Jmx0O3NlbGVjdCAvJmd0OzwvaDM+CisgKiA8cD5UaGUgPGNvZGU+Jmx0O3NlbGVjdCAvJmd0OzwvY29kZT4gdGFnIGlzIHVzZWQgdG8gc2VsZWN0IGNvbHVtbnMgZnJvbSB0aGUgY3Vyc29yCisgKiB3aGVuIGRvaW5nIHRoZSBxdWVyeS4gVGhpcyBjYW4gYmUgdmVyeSB1c2VmdWwgd2hlbiB1c2luZyB0cmFuc2Zvcm1hdGlvbnMgaW4gdGhlCisgKiA8Y29kZT4mbHQ7YmluZCAvJmd0OzwvY29kZT4gZWxlbWVudHMuIEl0IGNhbiBhbHNvIGJlIHZlcnkgdXNlZnVsIGlmIHlvdSBhcmUgcHJvdmlkaW5nCisgKiB5b3VyIG93biA8YSBocmVmPSIjeG1sLWN1cnNvci1hZGFwdGVyLWJpbmQtZGF0YS10eXBlcyI+YmluZGVyPC9hPiBvcgorICogPGEgaHJlZj0iI3htbC1jdXJzb3ItYWRhcHRlci1iaW5kLWRhdGEtdHlwZXMiPnRyYW5zZm9ybWF0aW9uPC9hPiBjbGFzc2VzLgorICogPGNvZGU+Jmx0O3NlbGVjdCAvJmd0OzwvY29kZT4gZWxlbWVudHMgYXJlIGlnbm9yZWQgaWYgeW91IHN1cHBseSB0aGUgY3Vyc29yIHlvdXJzZWxmLjwvcD4KKyAqIDxwPlRoZSA8Y29kZT4mbHQ7c2VsZWN0IC8mZ3Q7PC9jb2RlPiBzdXBwb3J0cyB0aGUgZm9sbG93aW5nIGF0dHJpYnV0ZXM6PC9wPgorICogPHVsPgorICogIDxsaT48Y29kZT5hbmRyb2lkOmNvbHVtbjwvY29kZT46IE5hbWUgb2YgdGhlIGNvbHVtbiB0byBzZWxlY3QgaW4gdGhlIGN1cnNvciBkdXJpbmcgdGhlCisgKiAgcXVlcnkgb3BlcmF0aW9uPC9saT4KKyAqIDwvdWw+CisgKiA8cD48c3Ryb25nPk5vdGU6PC9zdHJvbmc+IFRoZSBjb2x1bW4gbmFtZWQgPGNvZGU+X2lkPC9jb2RlPiBpcyBhbHdheXMgaW1wbGljaXRseQorICogc2VsZWN0ZWQuPC9wPgorICogCisgKiA8YSBuYW1lPSJ4bWwtY3Vyc29yLWFkYXB0ZXItYmluZC10YWciIC8+CisgKiA8aDM+Jmx0O2JpbmQgLyZndDs8L2gzPgorICogPHA+VGhlIDxjb2RlPiZsdDtiaW5kIC8mZ3Q7PC9jb2RlPiB0YWcgaXMgdXNlZCB0byBiaW5kIGEgY29sdW1uIGZyb20gdGhlIGN1cnNvciB0bworICogYSB7QGxpbmsgYW5kcm9pZC52aWV3LlZpZXd9LiBBIGNvbHVtbiBib3VuZCB1c2luZyB0aGlzIHRhZyBpcyBhdXRvbWF0aWNhbGx5IHNlbGVjdGVkCisgKiBkdXJpbmcgdGhlIHF1ZXJ5IGFuZCBhIG1hdGNoaW5nCisgKiA8YSBocmVmPSIjeG1sLWN1cnNvci1hZGFwdGVyLXNlbGVjdC10YWciPjxjb2RlPiZsdDtzZWxlY3QgLyZndDs8L2NvZGU+IHRhZyBpcyB0aGVyZWZvcmUKKyAqIG5vdCByZXF1aXJlZC48L3A+CisgKiAKKyAqIDxwPkVhY2ggYmluZGluZyBpcyBkZWNsYXJlZCBhcyBhIG9uZSB0byBvbmUgbWF0Y2hpbmcgYnV0CisgKiBjdXN0b20gYmluZGVyIGNsYXNzZXMgb3Igc3BlY2lhbAorICogPGEgaHJlZj0iI3htbC1jdXJzb3ItYWRhcHRlci1iaW5kLWRhdGEtdHJhbnNmb3JtYXRpb24iPmRhdGEgdHJhbnNmb3JtYXRpb25zPC9hPiBjYW4KKyAqIGFsbG93IHlvdSB0byBiaW5kIHNldmVyYWwgY29sdW1ucyB0byBhIHNpbmdsZSB2aWV3LiBJbiB0aGlzIGNhc2UgeW91IG11c3QgdXNlIHRoZQorICogPGEgaHJlZj0iI3htbC1jdXJzb3ItYWRhcHRlci1zZWxlY3QtdGFnIj48Y29kZT4mbHQ7c2VsZWN0IC8mZ3Q7PC9jb2RlPiB0YWcgdG8gbWFrZQorICogc3VyZSBhbnkgcmVxdWlyZWQgY29sdW1uIGlzIHBhcnQgb2YgdGhlIHF1ZXJ5LjwvcD4KKyAqIAorICogPHA+VGhlIDxjb2RlPiZsdDtiaW5kIC8mZ3Q7PC9jb2RlPiB0YWcgc3VwcG9ydHMgdGhlIGZvbGxvd2luZyBhdHRyaWJ1dGVzOjwvcD4KKyAqIDx1bD4KKyAqICA8bGk+PGNvZGU+YW5kcm9pZDpmcm9tPC9jb2RlPjogVGhlIG5hbWUgb2YgdGhlIGNvbHVtbiB0byBiaW5kIGZyb20uCisgKiAgVGhpcyBhdHRyaWJ1dGUgaXMgbWFuZGF0b3J5LiBOb3RlIHRoYXQgPGNvZGU+QDwvY29kZT4gd2hpY2ggYXJlIG5vdCB1c2VkIHRvIHJlZmVyZW5jZSByZXNvdXJjZXMKKyAqICBzaG91bGQgYmUgYmFja3NsYXNoIHByb3RlY3RlZCBhcyBpbiA8Y29kZT5cQDwvY29kZT4uPC9saT4KKyAqICA8bGk+PGNvZGU+YW5kcm9pZDp0bzwvY29kZT46IFRoZSBpZCBvZiB0aGUgdmlldyB0byBiaW5kIHRvLiBUaGlzIGF0dHJpYnV0ZSBpcyBtYW5kYXRvcnkuPC9saT4KKyAqICA8bGk+PGNvZGU+YW5kcm9pZDphczwvY29kZT46IFRoZSA8YSBocmVmPSIjeG1sLWN1cnNvci1hZGFwdGVyLWJpbmQtZGF0YS10eXBlcyI+ZGF0YSB0eXBlPC9hPgorICogIG9mIHRoZSBiaW5kaW5nLiBUaGlzIGF0dHJpYnV0ZSBpcyBtYW5kYXRvcnkuPC9saT4KKyAqIDwvdWw+CisgKiAKKyAqIDxwPkluIGFkZGl0aW9uLCBhIDxjb2RlPiZsdDtiaW5kIC8mZ3Q7PC9jb2RlPiBjYW4gY29udGFpbiB6ZXJvIG9yIG1vcmUgaW5zdGFuY2VzIG9mCisgKiA8YSBocmVmPSIjeG1sLWN1cnNvci1hZGFwdGVyLWJpbmQtZGF0YS10cmFuc2Zvcm1hdGlvbiI+ZGF0YSB0cmFuc2Zvcm1hdGlvbnM8L2E+IGNoaWxkcmVuCisgKiB0YWdzLjwvcD4KKyAqCisgKiA8YSBuYW1lPSJ4bWwtY3Vyc29yLWFkYXB0ZXItYmluZC1kYXRhLXR5cGVzIiAvPgorICogPGg0PkJpbmRpbmcgZGF0YSB0eXBlczwvaDQ+CisgKiA8cD5Gb3IgYSBiaW5kaW5nIHRvIG9jY3VyIHRoZSBkYXRhIHR5cGUgb2YgdGhlIGJvdW5kIGNvbHVtbi92aWV3IHBhaXIgbXVzdCBiZSBzcGVjaWZpZWQuCisgKiBUaGUgZm9sbG93aW5nIGRhdGEgdHlwZXMgYXJlIGN1cnJlbnRseSBzdXBwb3J0ZWQ6PC9wPgorICogPHVsPgorICogIDxsaT48Y29kZT5zdHJpbmc8L2NvZGU+OiBUaGUgY29udGVudCBvZiB0aGUgY29sdW1uIGlzIGludGVycHJldGVkIGFzIGEgc3RyaW5nIGFuZCBtdXN0IGJlCisgKiAgYm91bmQgdG8gYSB7QGxpbmsgYW5kcm9pZC53aWRnZXQuVGV4dFZpZXd9PC9saT4KKyAqICA8bGk+PGNvZGU+aW1hZ2U8L2NvZGU+OiBUaGUgY29udGVudCBvZiB0aGUgY29sdW1uIGlzIGludGVycHJldGVkIGFzIGEgYmxvYiBkZXNjcmliaW5nIGFuCisgKiAgaW1hZ2UgYW5kIG11c3QgYmUgYm91bmQgdG8gYW4ge0BsaW5rIGFuZHJvaWQud2lkZ2V0LkltYWdlVmlld308L2xpPgorICogIDxsaT48Y29kZT5pbWFnZS11cmk8L2NvZGU+OiBUaGUgY29udGVudCBvZiB0aGUgY29sdW1uIGlzIGludGVycHJldGVkIGFzIGEgVVJJIHRvIGFuIGltYWdlCisgKiAgYW5kIG11c3QgYmUgYm91bmQgdG8gYW4ge0BsaW5rIGFuZHJvaWQud2lkZ2V0LkltYWdlVmlld308L2xpPgorICogIDxsaT48Y29kZT5kcmF3YWJsZTwvY29kZT46IFRoZSBjb250ZW50IG9mIHRoZSBjb2x1bW4gaXMgaW50ZXJwcmV0ZWQgYXMgYSByZXNvdXJjZSBpZCB0byBhCisgKiAgZHJhd2FibGUgYW5kIG11c3QgYmUgYm91bmQgdG8gYW4ge0BsaW5rIGFuZHJvaWQud2lkZ2V0LkltYWdlVmlld308L2xpPgorICogIDxsaT48Y29kZT50YWc8L2NvZGU+OiBUaGUgY29udGVudCBvZiB0aGUgY29sdW1uIGlzIGludGVycHJldGVkIGFzIGEgc3RyaW5nIGFuZCB3aWxsIGJlIHNldCBhcworICogIHRoZSB0YWcgKHVzaW5nIHtAbGluayBWaWV3I3NldFRhZyhPYmplY3QpfSBvZiB0aGUgYXNzb2NpYXRlZCBWaWV3LiBUaGlzIGNhbiBiZSB1c2VkIHRvCisgKiAgYXNzb2NpYXRlIG1ldGEtZGF0YSB0byB5b3VyIHZpZXcsIHRoYXQgY2FuIGJlIHVzZWQgZm9yIGluc3RhbmNlIGJ5IGEgbGlzdGVuZXIuPC9saT4KKyAqICA8bGk+QSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZTogVGhlIG5hbWUgb2YgYSBjbGFzcyBjb3JyZXNwb25kaW5nIHRvIGFuIGltcGxlbWVudGF0aW9uIG9mCisgKiAge0BsaW5rIGFuZHJvaWQud2lkZ2V0LkFkYXB0ZXJzLkN1cnNvckJpbmRlcn0uIEN1cnNvciBiaW5kZXJzIGNhbiBiZSB1c2VkIHRvIHByb3ZpZGUKKyAqICBiaW5kaW5ncyBub3Qgc3VwcG9ydGVkIGJ5IGRlZmF1bHQuIEN1c3RvbSBiaW5kZXJzIGNhbm5vdCBiZSB1c2VkIHdpdGgKKyAqICB7QGxpbmsgYW5kcm9pZC5jb250ZW50LkNvbnRleHQjaXNSZXN0cmljdGVkKCkgcmVzdHJpY3RlZCBjb250ZXh0c30sIGZvciBpbnN0YW5jZSBpbiBhbgorICogIGFwcGxpY2F0aW9uIHdpZGdldDwvbGk+CisgKiA8L3VsPgorICogCisgKiA8YSBuYW1lPSJ4bWwtY3Vyc29yLWFkYXB0ZXItYmluZC10cmFuc2Zvcm1hdGlvbiIgLz4KKyAqIDxoND5CaW5kaW5nIHRyYW5zZm9ybWF0aW9uczwvaDQ+CisgKiA8cD5XaGVuIGRlZmluaW5nIGEgZGF0YSBiaW5kaW5nIHlvdSBjYW4gc3BlY2lmeSBhbiBvcHRpb25hbCB0cmFuc2Zvcm1hdGlvbiBieSB1c2luZyBvbmUKKyAqIG9mIHRoZSBmb2xsb3dpbmcgdGFncyBhcyBhIGNoaWxkIG9mIGEgPGNvZGU+Jmx0O2JpbmQgLyZndDs8L2NvZGU+IGVsZW1lbnRzOjwvcD4KKyAqIDx1bD4KKyAqICA8bGk+PGNvZGU+Jmx0O21hcCAvJmd0OzwvY29kZT46IE1hcHMgYSBjb25zdGFudCBzdHJpbmcgdG8gYSBzdHJpbmcgb3IgYSByZXNvdXJjZS4gVXNlCisgKiAgb25lIGluc3RhbmNlIG9mIHRoaXMgdGFnIHBlciB2YWx1ZSB5b3Ugd2FudCB0byBtYXA8L2xpPgorICogIDxsaT48Y29kZT4mbHQ7dHJhbnNmb3JtIC8mZ3Q7PC9jb2RlPjogVHJhbnNmb3JtcyBhIGNvbHVtbidzIHZhbHVlIHVzaW5nIGFuIGV4cHJlc3Npb24KKyAqICBvciBhbiBpbnN0YW5jZSBvZiB7QGxpbmsgYW5kcm9pZC53aWRnZXQuQWRhcHRlcnMuQ3Vyc29yVHJhbnNmb3JtYXRpb259PC9saT4KKyAqIDwvdWw+CisgKiA8cD5XaGlsZSBzZXZlcmFsIDxjb2RlPiZsdDttYXAgLyZndDs8L2NvZGU+IHRhZ3MgY2FuIGJlIHVzZWQgYXQgdGhlIHNhbWUgdGltZSwgeW91IGNhbm5vdAorICogbWl4IDxjb2RlPiZsdDttYXAgLyZndDs8L2NvZGU+IGFuZCA8Y29kZT4mbHQ7dHJhbnNmb3JtIC8mZ3Q7PC9jb2RlPiB0YWdzLiBJZiBzZXZlcmFsCisgKiA8Y29kZT4mbHQ7dHJhbnNmb3JtIC8mZ3Q7PC9jb2RlPiB0YWdzIGFyZSBzcGVjaWZpZWQsIG9ubHkgdGhlIGxhc3Qgb25lIGlzIHJldGFpbmVkLjwvcD4KKyAqIAorICogPGEgbmFtZT0ieG1sLWN1cnNvci1hZGFwdGVyLWJpbmQtdHJhbnNmb3JtYXRpb24tbWFwIiAvPgorICogPHA+PHN0cm9uZz4mbHQ7bWFwIC8mZ3Q7PC9zdHJvbmc+PC9wPgorICogPHA+QSBtYXAgZWxlbWVudCBzaW1wbHkgc3BlY2lmaWVzIGEgdmFsdWUgdG8gbWF0Y2ggZnJvbSBhbmQgYSB2YWx1ZSB0byBtYXRjaCB0by4gV2hlbgorICogYSBjb2x1bW4ncyB2YWx1ZSBlcXVhbHMgdGhlIHZhbHVlIHRvIG1hdGNoIGZyb20sIGl0IGlzIHJlcGxhY2VkIHdpdGggdGhlIHZhbHVlIHRvIG1hdGNoCisgKiB0by4gVGhlIGZvbGxvd2luZyBhdHRyaWJ1dGVzIGFyZSBzdXBwb3J0ZWQ6PC9wPgorICogPHVsPgorICogIDxsaT48Y29kZT5hbmRyb2lkOmZyb21WYWx1ZTwvY29kZT46IFRoZSB2YWx1ZSB0byBtYXRjaCBmcm9tLiBUaGlzIGF0dHJpYnV0ZSBpcyBtYW5kYXRvcnk8L2xpPgorICogIDxsaT48Y29kZT5hbmRyb2lkOnRvVmFsdWU8L2NvZGU+OiBUaGUgdmFsdWUgdG8gbWF0Y2ggdG8uIFRoaXMgdmFsdWUgY2FuIGJlIGVpdGhlciBhIHN0cmluZworICogIG9yIGEgcmVzb3VyY2UgaWRlbnRpZmllci4gVGhpcyB2YWx1ZSBpcyBpbnRlcnByZXRlZCBhcyBhIHJlc291cmNlIGlkZW50aWZpZXIgd2hlbiB0aGUKKyAqICBkYXRhIGJpbmRpbmcgaXMgb2YgdHlwZSA8Y29kZT5kcmF3YWJsZTwvY29kZT4uIFRoaXMgYXR0cmlidXRlIGlzIG1hbmRhdG9yeTwvbGk+CisgKiA8L3VsPgorICogCisgKiA8YSBuYW1lPSJ4bWwtY3Vyc29yLWFkYXB0ZXItYmluZC10cmFuc2Zvcm1hdGlvbi10cmFuc2Zvcm0iIC8+CisgKiA8cD48c3Ryb25nPiZsdDt0cmFuc2Zvcm0gLyZndDs8L3N0cm9uZz48L3A+CisgKiA8cD5BIHNpbXBsZSB0cmFuc2Zvcm0gdGhhdCBvY2N1cnMgZWl0aGVyIGJ5IGNhbGxpbmcgYSBzcGVjaWZpZWQgY2xhc3Mgb3IgYnkgcGVyZm9ybWluZworICogc2ltcGxlIHRleHQgc3Vic3RpdHV0aW9uLiBUaGUgZm9sbG93aW5nIGF0dHJpYnV0ZXMgYXJlIHN1cHBvcnRlZDo8L3A+CisgKiA8dWw+CisgKiAgPGxpPjxjb2RlPmFuZHJvaWQ6d2l0aEV4cHJlc3Npb248L2NvZGU+OiBUaGUgdHJhbnNmb3JtYXRpb24gZXhwcmVzc2lvbi4gVGhlIGV4cHJlc3Npb24gaXMKKyAqICBhIHN0cmluZyBjb250YWluaW5nIGNvbHVtbiBuYW1lcyBzdXJyb3VuZGVkIHdpdGggY3VybHkgYnJhY2VzIHsgYW5kIH0uIER1cmluZyB0aGUKKyAqICB0cmFuc2Zvcm1hdGlvbiBlYWNoIGNvbHVtbiBuYW1lIGlzIHJlcGxhY2VkIGJ5IGl0cyB2YWx1ZS4gQWxsIGNvbHVtbnMgbXVzdCBoYXZlIGJlZW4KKyAqICBzZWxlY3RlZCBpbiB0aGUgcXVlcnkuIEFuIGV4YW1wbGUgb2YgZXhwcmVzc2lvbiBpcyA8Y29kZT4iRmlyc3QgbmFtZToge2ZpcnN0X25hbWV9LAorICogIGxhc3QgbmFtZToge2xhc3RfbmFtZX0iPC9jb2RlPi4gVGhpcyBhdHRyaWJ1dGUgaXMgbWFuZGF0b3J5CisgKiAgaWYgPGNvZGU+YW5kcm9pZDp3aXRoQ2xhc3M8L2NvZGU+IGlzIG5vdCBzcGVjaWZpZWQgYW5kIGlnbm9yZWQgaWYgPGNvZGU+YW5kcm9pZDp3aXRoQ2xhc3M8L2NvZGU+CisgKiAgaXMgc3BlY2lmaWVkPC9saT4KKyAqICA8bGk+PGNvZGU+YW5kcm9pZDp3aXRoQ2xhc3M8L2NvZGU+OiBBIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lIGNvcnJlc3BvbmRpbmcgdG8gYW4KKyAqICBpbXBsZW1lbnRhdGlvbiBvZiB7QGxpbmsgYW5kcm9pZC53aWRnZXQuQWRhcHRlcnMuQ3Vyc29yVHJhbnNmb3JtYXRpb259LiBDdXN0b20KKyAqICB0cmFuc2Zvcm1hdGlvbnMgY2Fubm90IGJlIHVzZWQgd2l0aAorICogIHtAbGluayBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCNpc1Jlc3RyaWN0ZWQoKSByZXN0cmljdGVkIGNvbnRleHRzfSwgZm9yIGluc3RhbmNlIGluCisgKiAgYW4gYXBwIHdpZGdldCBUaGlzIGF0dHJpYnV0ZSBpcyBtYW5kYXRvcnkgaWYgPGNvZGU+YW5kcm9pZDp3aXRoRXhwcmVzc2lvbjwvY29kZT4gaXMKKyAqICBub3Qgc3BlY2lmaWVkPC9saT4KKyAqIDwvdWw+CisgKiAKKyAqIDxoMz5FeGFtcGxlPC9oMz4KKyAqIDxwPlRoZSBmb2xsb3dpbmcgZXhhbXBsZSBkZWZpbmVzIGEgY3Vyc29yIGFkYXB0ZXIgdGhhdCBxdWVyaWVzIGFsbCB0aGUgY29udGFjdHMgd2l0aAorICogYSBwaG9uZSBudW1iZXIgdXNpbmcgdGhlIGNvbnRhY3RzIGNvbnRlbnQgcHJvdmlkZXIuIEVhY2ggY29udGFjdCBpcyBkaXNwbGF5ZWQgd2l0aAorICogaXRzIGRpc3BsYXkgbmFtZSwgaXRzIGZhdm9yaXRlIHN0YXR1cyBhbmQgaXRzIHBob3RvLiBUbyBkaXNwbGF5IHBob3RvcywgYSBjdXN0b20gZGF0YQorICogYmluZGVyIGlzIGRlY2xhcmVkOjwvcD4KKyAqIAorICogPHByZSBjbGFzcz0icHJldHR5cHJpbnQiPgorICogJmx0O2N1cnNvci1hZGFwdGVyIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAqICAgICBhbmRyb2lkOnVyaT0iY29udGVudDovL2NvbS5hbmRyb2lkLmNvbnRhY3RzL2NvbnRhY3RzIgorICogICAgIGFuZHJvaWQ6c2VsZWN0aW9uPSJoYXNfcGhvbmVfbnVtYmVyPTEiCisgKiAgICAgYW5kcm9pZDpsYXlvdXQ9IkBsYXlvdXQvY29udGFjdF9pdGVtIiZndDsKKyAqCisgKiAgICAgJmx0O2JpbmQgYW5kcm9pZDpmcm9tPSJkaXNwbGF5X25hbWUiIGFuZHJvaWQ6dG89IkBpZC9uYW1lIiBhbmRyb2lkOmFzPSJzdHJpbmciIC8mZ3Q7CisgKiAgICAgJmx0O2JpbmQgYW5kcm9pZDpmcm9tPSJzdGFycmVkIiBhbmRyb2lkOnRvPSJAaWQvc3RhciIgYW5kcm9pZDphcz0iZHJhd2FibGUiJmd0OworICogICAgICAgICAmbHQ7bWFwIGFuZHJvaWQ6ZnJvbVZhbHVlPSIwIiBhbmRyb2lkOnRvVmFsdWU9IkBhbmRyb2lkOmRyYXdhYmxlL3N0YXJfYmlnX29mZiIgLyZndDsKKyAqICAgICAgICAgJmx0O21hcCBhbmRyb2lkOmZyb21WYWx1ZT0iMSIgYW5kcm9pZDp0b1ZhbHVlPSJAYW5kcm9pZDpkcmF3YWJsZS9zdGFyX2JpZ19vbiIgLyZndDsKKyAqICAgICAmbHQ7L2JpbmQmZ3Q7CisgKiAgICAgJmx0O2JpbmQgYW5kcm9pZDpmcm9tPSJfaWQiIGFuZHJvaWQ6dG89IkBpZC9uYW1lIgorICogICAgICAgICAgICAgIGFuZHJvaWQ6YXM9ImNvbS5nb29nbGUuYW5kcm9pZC50ZXN0LmFkYXB0ZXJzLkNvbnRhY3RQaG90b0JpbmRlciIgLyZndDsKKyAqCisgKiAmbHQ7L2N1cnNvci1hZGFwdGVyJmd0OworICogPC9wcmU+CisgKiAKKyAqIDxoMz5SZWxhdGVkIEFQSXM8L2gzPgorICogPHVsPgorICogIDxsaT57QGxpbmsgYW5kcm9pZC53aWRnZXQuQWRhcHRlcnMjbG9hZEFkYXB0ZXIoYW5kcm9pZC5jb250ZW50LkNvbnRleHQsIGludCwgT2JqZWN0W10pfTwvbGk+CisgKiAgPGxpPntAbGluayBhbmRyb2lkLndpZGdldC5BZGFwdGVycyNsb2FkQ3Vyc29yQWRhcHRlcihhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCwgaW50LCBhbmRyb2lkLmRhdGFiYXNlLkN1cnNvciwgT2JqZWN0W10pfTwvbGk+CisgKiAgPGxpPntAbGluayBhbmRyb2lkLndpZGdldC5BZGFwdGVycyNsb2FkQ3Vyc29yQWRhcHRlcihhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCwgaW50LCBTdHJpbmcsIE9iamVjdFtdKX08L2xpPgorICogIDxsaT57QGxpbmsgYW5kcm9pZC53aWRnZXQuQWRhcHRlcnMuQ3Vyc29yQmluZGVyfTwvbGk+CisgKiAgPGxpPntAbGluayBhbmRyb2lkLndpZGdldC5BZGFwdGVycy5DdXJzb3JUcmFuc2Zvcm1hdGlvbn08L2xpPgorICogIDxsaT57QGxpbmsgYW5kcm9pZC53aWRnZXQuQ3Vyc29yQWRhcHRlcn08L2xpPgorICogPC91bD4KKyAqIAorICogQHNlZSBhbmRyb2lkLndpZGdldC5BZGFwdGVyCisgKiBAc2VlIGFuZHJvaWQuY29udGVudC5Db250ZW50UHJvdmlkZXIKKyAqIAorICogQGF0dHIgcmVmIGFuZHJvaWQuUi5zdHlsZWFibGUjQ3Vyc29yQWRhcHRlcl9sYXlvdXQgCisgKiBAYXR0ciByZWYgYW5kcm9pZC5SLnN0eWxlYWJsZSNDdXJzb3JBZGFwdGVyX3NlbGVjdGlvbiAKKyAqIEBhdHRyIHJlZiBhbmRyb2lkLlIuc3R5bGVhYmxlI0N1cnNvckFkYXB0ZXJfc29ydE9yZGVyIAorICogQGF0dHIgcmVmIGFuZHJvaWQuUi5zdHlsZWFibGUjQ3Vyc29yQWRhcHRlcl91cmkgCisgKiBAYXR0ciByZWYgYW5kcm9pZC5SLnN0eWxlYWJsZSNDdXJzb3JBZGFwdGVyX0JpbmRJdGVtX2FzIAorICogQGF0dHIgcmVmIGFuZHJvaWQuUi5zdHlsZWFibGUjQ3Vyc29yQWRhcHRlcl9CaW5kSXRlbV9mcm9tIAorICogQGF0dHIgcmVmIGFuZHJvaWQuUi5zdHlsZWFibGUjQ3Vyc29yQWRhcHRlcl9CaW5kSXRlbV90bworICogQGF0dHIgcmVmIGFuZHJvaWQuUi5zdHlsZWFibGUjQ3Vyc29yQWRhcHRlcl9NYXBJdGVtX2Zyb21WYWx1ZSAKKyAqIEBhdHRyIHJlZiBhbmRyb2lkLlIuc3R5bGVhYmxlI0N1cnNvckFkYXB0ZXJfTWFwSXRlbV90b1ZhbHVlIAorICogQGF0dHIgcmVmIGFuZHJvaWQuUi5zdHlsZWFibGUjQ3Vyc29yQWRhcHRlcl9TZWxlY3RJdGVtX2NvbHVtbiAKKyAqIEBhdHRyIHJlZiBhbmRyb2lkLlIuc3R5bGVhYmxlI0N1cnNvckFkYXB0ZXJfVHJhbnNmb3JtSXRlbV93aXRoQ2xhc3MgCisgKiBAYXR0ciByZWYgYW5kcm9pZC5SLnN0eWxlYWJsZSNDdXJzb3JBZGFwdGVyX1RyYW5zZm9ybUl0ZW1fd2l0aEV4cHJlc3Npb24gCisgKi8KK0BTdXBwcmVzc1dhcm5pbmdzKHsiSmF2YWRvY1JlZmVyZW5jZSJ9KQorcHVibGljIGNsYXNzIEFkYXB0ZXJzIHsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQURBUFRFUl9DVVJTT1IgPSAiY3Vyc29yLWFkYXB0ZXIiOworCisgICAgLyoqCisgICAgICogPHA+SW50ZXJmYWNlIHVzZWQgdG8gYmluZCBhIHtAbGluayBhbmRyb2lkLmRhdGFiYXNlLkN1cnNvcn0gY29sdW1uIHRvIGEgVmlldy4gVGhpcworICAgICAqIGludGVyZmFjZSBjYW4gYmUgdXNlZCB0byBwcm92aWRlIGJpbmRpbmdzIGZvciBkYXRhIHR5cGVzIG5vdCBzdXBwb3J0ZWQgYnkgdGhlCisgICAgICogc3RhbmRhcmQgaW1wbGVtZW50YXRpb24gb2Yge0BsaW5rIGFuZHJvaWQud2lkZ2V0LkFkYXB0ZXJzfS48L3A+CisgICAgICogCisgICAgICogPHA+QSBiaW5kZXIgaXMgcHJvdmlkZWQgd2l0aCBhIGN1cnNvciB0cmFuc2Zvcm1hdGlvbiB3aGljaCBtYXkgb3IgbWF5IG5vdCBiZSB1c2VkCisgICAgICogdG8gdHJhbnNmb3JtIHRoZSB2YWx1ZSByZXRyaWV2ZWQgZnJvbSB0aGUgY3Vyc29yLiBUaGUgdHJhbnNmb3JtYXRpb24gaXMgZ3VhcmFudGVlZAorICAgICAqIHRvIG5ldmVyIGJlIG51bGwgc28gaXQncyBhbHdheXMgc2FmZSB0byBhcHBseSB0aGUgdHJhbnNmb3JtYXRpb24uPC9wPgorICAgICAqIAorICAgICAqIDxwPlRoZSBiaW5kZXIgaXMgYXNzb2NpYXRlZCB3aXRoIGEgQ29udGV4dCBidXQgY2FuIGJlIHJlLXVzZWQgd2l0aCBtdWx0aXBsZSBjdXJzb3JzLgorICAgICAqIEFzIHN1Y2gsIHRoZSBpbXBsZW1lbnRhdGlvbiBzaG91bGQgbWFrZSBubyBhc3N1bXB0aW9uIGFib3V0IHRoZSBDdXJzb3IgaW4gdXNlLjwvcD4KKyAgICAgKgorICAgICAqIEBzZWUgYW5kcm9pZC52aWV3LlZpZXcgCisgICAgICogQHNlZSBhbmRyb2lkLmRhdGFiYXNlLkN1cnNvcgorICAgICAqIEBzZWUgYW5kcm9pZC53aWRnZXQuQWRhcHRlcnMuQ3Vyc29yVHJhbnNmb3JtYXRpb24KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGFic3RyYWN0IGNsYXNzIEN1cnNvckJpbmRlciB7CisgICAgICAgIC8qKgorICAgICAgICAgKiA8cD5UaGUgY29udGV4dCBhc3NvY2lhdGVkIHdpdGggdGhpcyBiaW5kZXIuPC9wPgorICAgICAgICAgKi8KKyAgICAgICAgcHJvdGVjdGVkIGZpbmFsIENvbnRleHQgbUNvbnRleHQ7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIDxwPlRoZSB0cmFuc2Zvcm1hdGlvbiBhc3NvY2lhdGVkIHdpdGggdGhpcyBiaW5kZXIuIFRoaXMgdHJhbnNmb3JtYXRpb24gaXMgbmV2ZXIKKyAgICAgICAgICogbnVsbCBhbmQgbWF5IG9yIG1heSBub3QgYmUgYXBwbGllZCB0byB0aGUgQ3Vyc29yIGRhdGEgZHVyaW5nIHRoZQorICAgICAgICAgKiB7QGxpbmsgI2JpbmQoYW5kcm9pZC52aWV3LlZpZXcsIGFuZHJvaWQuZGF0YWJhc2UuQ3Vyc29yLCBpbnQpfSBvcGVyYXRpb24uPC9wPgorICAgICAgICAgKiAKKyAgICAgICAgICogQHNlZSAjYmluZChhbmRyb2lkLnZpZXcuVmlldywgYW5kcm9pZC5kYXRhYmFzZS5DdXJzb3IsIGludCkgCisgICAgICAgICAqLworICAgICAgICBwcm90ZWN0ZWQgZmluYWwgQ3Vyc29yVHJhbnNmb3JtYXRpb24gbVRyYW5zZm9ybWF0aW9uOworCisgICAgICAgIC8qKgorICAgICAgICAgKiA8cD5DcmVhdGVzIGEgbmV3IEN1cnNvciBiaW5kZXIuPC9wPiAKKyAgICAgICAgICogCisgICAgICAgICAqIEBwYXJhbSBjb250ZXh0IFRoZSBjb250ZXh0IGFzc29jaWF0ZWQgd2l0aCB0aGlzIGJpbmRlci4KKyAgICAgICAgICogQHBhcmFtIHRyYW5zZm9ybWF0aW9uIFRoZSB0cmFuc2Zvcm1hdGlvbiBhc3NvY2lhdGVkIHdpdGggdGhpcyBiaW5kZXIuIFRoaXMKKyAgICAgICAgICogICAgICAgIHRyYW5zZm9ybWF0aW9uIG1heSBvciBtYXkgbm90IGJlIGFwcGxpZWQgYnkgdGhlIGJpbmRlciBhbmQgaXMgZ3VhcmFudGVlZAorICAgICAgICAgKiAgICAgICAgdG8gbm90IGJlIG51bGwuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgQ3Vyc29yQmluZGVyKENvbnRleHQgY29udGV4dCwgQ3Vyc29yVHJhbnNmb3JtYXRpb24gdHJhbnNmb3JtYXRpb24pIHsKKyAgICAgICAgICAgIG1Db250ZXh0ID0gY29udGV4dDsKKyAgICAgICAgICAgIG1UcmFuc2Zvcm1hdGlvbiA9IHRyYW5zZm9ybWF0aW9uOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIDxwPkJpbmRzIHRoZSBzcGVjaWZpZWQgQ3Vyc29yIGNvbHVtbiB0byB0aGUgc3VwcGxpZWQgVmlldy4gVGhlIGJpbmRpbmcgb3BlcmF0aW9uCisgICAgICAgICAqIGNhbiBxdWVyeSBvdGhlciBDdXJzb3IgY29sdW1ucyBhcyBuZWVkZWQuIER1cmluZyB0aGUgYmluZGluZyBvcGVyYXRpb24sIHZhbHVlcworICAgICAgICAgKiByZXRyaWV2ZWQgZnJvbSB0aGUgQ3Vyc29yIG1heSBvciBtYXkgbm90IGJlIHRyYW5zZm9ybWVkIHVzaW5nIHRoaXMgYmluZGVyJ3MKKyAgICAgICAgICogY3Vyc29yIHRyYW5zZm9ybWF0aW9uLjwvcD4KKyAgICAgICAgICogCisgICAgICAgICAqIEBwYXJhbSB2aWV3IFRoZSB2aWV3IHRvIGJpbmQgZGF0YSB0by4KKyAgICAgICAgICogQHBhcmFtIGN1cnNvciBUaGUgY3Vyc29yIHRvIGJpbmQgZGF0YSBmcm9tLgorICAgICAgICAgKiBAcGFyYW0gY29sdW1uSW5kZXggVGhlIGNvbHVtbiBpbmRleCBpbiB0aGUgY3Vyc29yIHdoZXJlIHRoZSBkYXRhIHRvIGJpbmQgcmVzaWRlcy4KKyAgICAgICAgICogCisgICAgICAgICAqIEBzZWUgI21UcmFuc2Zvcm1hdGlvbgorICAgICAgICAgKiAKKyAgICAgICAgICogQHJldHVybiBUcnVlIGlmIHRoZSBjb2x1bW4gd2FzIHN1Y2Nlc3NmdWxseSBib3VuZCB0byB0aGUgVmlldywgZmFsc2Ugb3RoZXJ3aXNlLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIGFic3RyYWN0IGJvb2xlYW4gYmluZChWaWV3IHZpZXcsIEN1cnNvciBjdXJzb3IsIGludCBjb2x1bW5JbmRleCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogPHA+SW50ZXJmYWNlIHVzZWQgdG8gdHJhbnNmb3JtIGRhdGEgY29taW5nIG91dCBvZiBhIHtAbGluayBhbmRyb2lkLmRhdGFiYXNlLkN1cnNvcn0KKyAgICAgKiBiZWZvcmUgaXQgaXMgYm91bmQgdG8gYSB7QGxpbmsgYW5kcm9pZC52aWV3LlZpZXd9LjwvcD4KKyAgICAgKiAKKyAgICAgKiA8cD5UcmFuc2Zvcm1hdGlvbnMgYXJlIHVzZWQgdG8gdHJhbnNmb3JtIHRleHQtYmFzZWQgZGF0YSAoaW4gdGhlIGZvcm0gb2YgYSBTdHJpbmcpLAorICAgICAqIG9yIHRvIHRyYW5zZm9ybSBkYXRhIGludG8gYSByZXNvdXJjZSBpZGVudGlmaWVyLiBBIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gaXMgcHJvdmlkZWQKKyAgICAgKiB0byBnZW5lcmF0ZSByZXNvdXJjZSBpZGVudGlmaWVycy48L3A+CisgICAgICogCisgICAgICogQHNlZSBhbmRyb2lkLmRhdGFiYXNlLkN1cnNvcgorICAgICAqIEBzZWUgYW5kcm9pZC53aWRnZXQuQWRhcHRlcnMuQ3Vyc29yQmluZGVyCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBhYnN0cmFjdCBjbGFzcyBDdXJzb3JUcmFuc2Zvcm1hdGlvbiB7CisgICAgICAgIC8qKgorICAgICAgICAgKiA8cD5UaGUgY29udGV4dCBhc3NvY2lhdGVkIHdpdGggdGhpcyB0cmFuc2Zvcm1hdGlvbi48L3A+CisgICAgICAgICAqLworICAgICAgICBwcm90ZWN0ZWQgZmluYWwgQ29udGV4dCBtQ29udGV4dDsKKworICAgICAgICAvKioKKyAgICAgICAgICogPHA+Q3JlYXRlcyBhIG5ldyBDdXJzb3IgdHJhbnNmb3JtYXRpb24uPC9wPgorICAgICAgICAgKiAKKyAgICAgICAgICogQHBhcmFtIGNvbnRleHQgVGhlIGNvbnRleHQgYXNzb2NpYXRlZCB3aXRoIHRoaXMgdHJhbnNmb3JtYXRpb24uCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgQ3Vyc29yVHJhbnNmb3JtYXRpb24oQ29udGV4dCBjb250ZXh0KSB7CisgICAgICAgICAgICBtQ29udGV4dCA9IGNvbnRleHQ7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogPHA+VHJhbnNmb3JtcyB0aGUgc3BlY2lmaWVkIEN1cnNvciBjb2x1bW4gaW50byBhIFN0cmluZy4gVGhlIHRyYW5zZm9ybWF0aW9uCisgICAgICAgICAqIGNhbiBzaW1wbHkgcmV0dXJuIHRoZSBjb250ZW50IG9mIHRoZSBjb2x1bW4gYXMgYSBTdHJpbmcgKHRoaXMgaXMga25vd24KKyAgICAgICAgICogYXMgdGhlIGlkZW50aXR5IHRyYW5zZm9ybWF0aW9uKSBvciBtYW5pcHVsYXRlIHRoZSBjb250ZW50LiBGb3IgaW5zdGFuY2UsCisgICAgICAgICAqIGEgdHJhbnNmb3JtYXRpb24gY2FuIHBlcmZvcm0gdGV4dCBzdWJzdGl0dXRpb25zIG9yIGNvbmNhdGVuYXRlIG90aGVyCisgICAgICAgICAqIGNvbHVtbnMgd2l0aCB0aGUgc3BlY2lmaWVkIGNvbHVtbi48L3A+CisgICAgICAgICAqIAorICAgICAgICAgKiBAcGFyYW0gY3Vyc29yIFRoZSBjdXJzb3IgdGhhdCBjb250YWlucyB0aGUgZGF0YSB0byB0cmFuc2Zvcm0uIAorICAgICAgICAgKiBAcGFyYW0gY29sdW1uSW5kZXggVGhlIGluZGV4IG9mIHRoZSBjb2x1bW4gdG8gdHJhbnNmb3JtLgorICAgICAgICAgKiAKKyAgICAgICAgICogQHJldHVybiBBIFN0cmluZyBjb250YWluaW5nIHRoZSB0cmFuc2Zvcm1lZCB2YWx1ZSBvZiB0aGUgY29sdW1uLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIGFic3RyYWN0IFN0cmluZyB0cmFuc2Zvcm0oQ3Vyc29yIGN1cnNvciwgaW50IGNvbHVtbkluZGV4KTsKKworICAgICAgICAvKioKKyAgICAgICAgICogPHA+VHJhbnNmb3JtcyB0aGUgc3BlY2lmaWVkIEN1cnNvciBjb2x1bW4gaW50byBhIHJlc291cmNlIGlkZW50aWZpZXIuCisgICAgICAgICAqIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHNpbXBseSBpbnRlcnByZXRzIHRoZSBjb250ZW50IG9mIHRoZSBjb2x1bW4KKyAgICAgICAgICogYXMgYW4gaW50ZWdlci48L3A+CisgICAgICAgICAqIAorICAgICAgICAgKiBAcGFyYW0gY3Vyc29yIFRoZSBjdXJzb3IgdGhhdCBjb250YWlucyB0aGUgZGF0YSB0byB0cmFuc2Zvcm0uIAorICAgICAgICAgKiBAcGFyYW0gY29sdW1uSW5kZXggVGhlIGluZGV4IG9mIHRoZSBjb2x1bW4gdG8gdHJhbnNmb3JtLgorICAgICAgICAgKiAKKyAgICAgICAgICogQHJldHVybiBBIHJlc291cmNlIGlkZW50aWZpZXIuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgaW50IHRyYW5zZm9ybVRvUmVzb3VyY2UoQ3Vyc29yIGN1cnNvciwgaW50IGNvbHVtbkluZGV4KSB7CisgICAgICAgICAgICByZXR1cm4gY3Vyc29yLmdldEludChjb2x1bW5JbmRleCk7CisgICAgICAgIH0gICAgICAgIAorICAgIH0KKworICAgIC8qKgorICAgICAqIDxwPkxvYWRzIHRoZSB7QGxpbmsgYW5kcm9pZC53aWRnZXQuQ3Vyc29yQWRhcHRlcn0gZGVmaW5lZCBpbiB0aGUgc3BlY2lmaWVkCisgICAgICogWE1MIHJlc291cmNlLiBUaGUgY29udGVudCBvZiB0aGUgYWRhcHRlciBpcyBsb2FkZWQgZnJvbSB0aGUgY29udGVudCBwcm92aWRlcgorICAgICAqIGlkZW50aWZpZWQgYnkgdGhlIHN1cHBsaWVkIFVSSS48L3A+CisgICAgICogCisgICAgICogPHA+PHN0cm9uZz5Ob3RlOjwvc3Ryb25nPiBJZiB0aGUgc3VwcGxpZWQge0BsaW5rIGFuZHJvaWQuY29udGVudC5Db250ZXh0fSBpcworICAgICAqIGFuIHtAbGluayBhbmRyb2lkLmFwcC5BY3Rpdml0eX0sIHRoZSBjdXJzb3IgcmV0dXJuZWQgYnkgdGhlIGNvbnRlbnQgcHJvdmlkZXIKKyAgICAgKiB3aWxsIGJlIGF1dG9tYXRpY2FsbHkgbWFuYWdlZC4gT3RoZXJ3aXNlLCB5b3UgYXJlIHJlc3BvbnNpYmxlIGZvciBtYW5hZ2luZyB0aGUKKyAgICAgKiBjdXJzb3IgeW91cnNlbGYuPC9wPgorICAgICAqIAorICAgICAqIDxwPlRoZSBmb3JtYXQgb2YgdGhlIFhNTCBkZWZpbml0aW9uIG9mIHRoZSBjdXJzb3IgYWRhcHRlciBpcyBkb2N1bWVudGVkIGF0CisgICAgICogdGhlIHRvcCBvZiB0aGlzIHBhZ2UuPC9wPgorICAgICAqIAorICAgICAqIEBwYXJhbSBjb250ZXh0IFRoZSBjb250ZXh0IHRvIGxvYWQgdGhlIFhNTCByZXNvdXJjZSBmcm9tLgorICAgICAqIEBwYXJhbSBpZCBUaGUgaWRlbnRpZmllciBvZiB0aGUgWE1MIHJlc291cmNlIGRlY2xhcmluZyB0aGUgYWRhcHRlci4KKyAgICAgKiBAcGFyYW0gdXJpIFRoZSBVUkkgb2YgdGhlIGNvbnRlbnQgcHJvdmlkZXIuCisgICAgICogQHBhcmFtIHBhcmFtZXRlcnMgT3B0aW9uYWwgcGFyYW1ldGVycyB0byBwYXNzIHRvIHRoZSBDdXJzb3JBZGFwdGVyLCB1c2VkCisgICAgICogICAgICAgIHRvIHN1YnN0aXR1dGUgdmFsdWVzIGluIHRoZSBzZWxlY3Rpb24gZXhwcmVzc2lvbi4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIEEge0BsaW5rIGFuZHJvaWQud2lkZ2V0LkN1cnNvckFkYXB0ZXJ9CisgICAgICogCisgICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gSWYgdGhlIFhNTCByZXNvdXJjZSBkb2VzIG5vdCBjb250YWluCisgICAgICogICAgICAgICBhIHZhbGlkICZsdDtjdXJzb3ItYWRhcHRlciAvJmd0OyBkZWZpbml0aW9uLgorICAgICAqIAorICAgICAqIEBzZWUgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRQcm92aWRlcgorICAgICAqIEBzZWUgYW5kcm9pZC53aWRnZXQuQ3Vyc29yQWRhcHRlcgorICAgICAqIEBzZWUgI2xvYWRBZGFwdGVyKGFuZHJvaWQuY29udGVudC5Db250ZXh0LCBpbnQsIE9iamVjdFtdKSAKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIEN1cnNvckFkYXB0ZXIgbG9hZEN1cnNvckFkYXB0ZXIoQ29udGV4dCBjb250ZXh0LCBpbnQgaWQsIFN0cmluZyB1cmksCisgICAgICAgICAgICBPYmplY3QuLi4gcGFyYW1ldGVycykgeworCisgICAgICAgIFhtbEN1cnNvckFkYXB0ZXIgYWRhcHRlciA9IChYbWxDdXJzb3JBZGFwdGVyKSBsb2FkQWRhcHRlcihjb250ZXh0LCBpZCwgQURBUFRFUl9DVVJTT1IsCisgICAgICAgICAgICAgICAgcGFyYW1ldGVycyk7CisKKyAgICAgICAgaWYgKHVyaSAhPSBudWxsKSB7CisgICAgICAgICAgICBhZGFwdGVyLnNldFVyaSh1cmkpOworICAgICAgICB9CisgICAgICAgIGFkYXB0ZXIubG9hZCgpOworCisgICAgICAgIHJldHVybiBhZGFwdGVyOworICAgIH0KKworICAgIC8qKgorICAgICAqIDxwPkxvYWRzIHRoZSB7QGxpbmsgYW5kcm9pZC53aWRnZXQuQ3Vyc29yQWRhcHRlcn0gZGVmaW5lZCBpbiB0aGUgc3BlY2lmaWVkCisgICAgICogWE1MIHJlc291cmNlLiBUaGUgY29udGVudCBvZiB0aGUgYWRhcHRlciBpcyBsb2FkZWQgZnJvbSB0aGUgc3BlY2lmaWVkIGN1cnNvci4KKyAgICAgKiBZb3UgYXJlIHJlc3BvbnNpYmxlIGZvciBtYW5hZ2luZyB0aGUgc3VwcGxpZWQgY3Vyc29yLjwvcD4KKyAgICAgKiAKKyAgICAgKiA8cD5UaGUgZm9ybWF0IG9mIHRoZSBYTUwgZGVmaW5pdGlvbiBvZiB0aGUgY3Vyc29yIGFkYXB0ZXIgaXMgZG9jdW1lbnRlZCBhdAorICAgICAqIHRoZSB0b3Agb2YgdGhpcyBwYWdlLjwvcD4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gY29udGV4dCBUaGUgY29udGV4dCB0byBsb2FkIHRoZSBYTUwgcmVzb3VyY2UgZnJvbS4KKyAgICAgKiBAcGFyYW0gaWQgVGhlIGlkZW50aWZpZXIgb2YgdGhlIFhNTCByZXNvdXJjZSBkZWNsYXJpbmcgdGhlIGFkYXB0ZXIuCisgICAgICogQHBhcmFtIGN1cnNvciBUaGUgY3Vyc29yIGNvbnRhaW5pbmcgdGhlIGRhdGEgZm9yIHRoZSBhZGFwdGVyLgorICAgICAqIEBwYXJhbSBwYXJhbWV0ZXJzIE9wdGlvbmFsIHBhcmFtZXRlcnMgdG8gcGFzcyB0byB0aGUgQ3Vyc29yQWRhcHRlciwgdXNlZAorICAgICAqICAgICAgICB0byBzdWJzdGl0dXRlIHZhbHVlcyBpbiB0aGUgc2VsZWN0aW9uIGV4cHJlc3Npb24uCisgICAgICogCisgICAgICogQHJldHVybiBBIHtAbGluayBhbmRyb2lkLndpZGdldC5DdXJzb3JBZGFwdGVyfQorICAgICAqIAorICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIElmIHRoZSBYTUwgcmVzb3VyY2UgZG9lcyBub3QgY29udGFpbgorICAgICAqICAgICAgICAgYSB2YWxpZCAmbHQ7Y3Vyc29yLWFkYXB0ZXIgLyZndDsgZGVmaW5pdGlvbi4KKyAgICAgKiAKKyAgICAgKiBAc2VlIGFuZHJvaWQuY29udGVudC5Db250ZW50UHJvdmlkZXIKKyAgICAgKiBAc2VlIGFuZHJvaWQud2lkZ2V0LkN1cnNvckFkYXB0ZXIKKyAgICAgKiBAc2VlIGFuZHJvaWQuZGF0YWJhc2UuQ3Vyc29yCisgICAgICogQHNlZSAjbG9hZEFkYXB0ZXIoYW5kcm9pZC5jb250ZW50LkNvbnRleHQsIGludCwgT2JqZWN0W10pIAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgQ3Vyc29yQWRhcHRlciBsb2FkQ3Vyc29yQWRhcHRlcihDb250ZXh0IGNvbnRleHQsIGludCBpZCwgQ3Vyc29yIGN1cnNvciwKKyAgICAgICAgICAgIE9iamVjdC4uLiBwYXJhbWV0ZXJzKSB7CisKKyAgICAgICAgWG1sQ3Vyc29yQWRhcHRlciBhZGFwdGVyID0gKFhtbEN1cnNvckFkYXB0ZXIpIGxvYWRBZGFwdGVyKGNvbnRleHQsIGlkLCBBREFQVEVSX0NVUlNPUiwKKyAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzKTsKKworICAgICAgICBpZiAoY3Vyc29yICE9IG51bGwpIHsKKyAgICAgICAgICAgIGFkYXB0ZXIuY2hhbmdlQ3Vyc29yKGN1cnNvcik7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gYWRhcHRlcjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiA8cD5Mb2FkcyB0aGUgYWRhcHRlciBkZWZpbmVkIGluIHRoZSBzcGVjaWZpZWQgWE1MIHJlc291cmNlLiBUaGUgWE1MIGRlZmluaXRpb24gb2YKKyAgICAgKiB0aGUgYWRhcHRlciBtdXN0IGZvbGxvdyB0aGUgZm9ybWF0IGRlZmluaXRpb24gb2Ygb25lIG9mIHRoZSBzdXBwb3J0ZWQgYWRhcHRlcgorICAgICAqIHR5cGVzIGRlc2NyaWJlZCBhdCB0aGUgdG9wIG9mIHRoaXMgcGFnZS48L3A+CisgICAgICogCisgICAgICogPHA+PHN0cm9uZz5Ob3RlOjwvc3Ryb25nPiBJZiB0aGUgbG9hZGVkIGFkYXB0ZXIgaXMgYSB7QGxpbmsgYW5kcm9pZC53aWRnZXQuQ3Vyc29yQWRhcHRlcn0KKyAgICAgKiBhbmQgdGhlIHN1cHBsaWVkIHtAbGluayBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dH0gaXMgYW4ge0BsaW5rIGFuZHJvaWQuYXBwLkFjdGl2aXR5fSwKKyAgICAgKiB0aGUgY3Vyc29yIHJldHVybmVkIGJ5IHRoZSBjb250ZW50IHByb3ZpZGVyIHdpbGwgYmUgYXV0b21hdGljYWxseSBtYW5hZ2VkLiBPdGhlcndpc2UsCisgICAgICogeW91IGFyZSByZXNwb25zaWJsZSBmb3IgbWFuYWdpbmcgdGhlIGN1cnNvciB5b3Vyc2VsZi48L3A+CisgICAgICogCisgICAgICogQHBhcmFtIGNvbnRleHQgVGhlIGNvbnRleHQgdG8gbG9hZCB0aGUgWE1MIHJlc291cmNlIGZyb20uCisgICAgICogQHBhcmFtIGlkIFRoZSBpZGVudGlmaWVyIG9mIHRoZSBYTUwgcmVzb3VyY2UgZGVjbGFyaW5nIHRoZSBhZGFwdGVyLgorICAgICAqIEBwYXJhbSBwYXJhbWV0ZXJzIE9wdGlvbmFsIHBhcmFtZXRlcnMgdG8gcGFzcyB0byB0aGUgYWRhcHRlci4KKyAgICAgKiAgCisgICAgICogQHJldHVybiBBbiBhZGFwdGVyIGluc3RhbmNlLgorICAgICAqIAorICAgICAqIEBzZWUgI2xvYWRDdXJzb3JBZGFwdGVyKGFuZHJvaWQuY29udGVudC5Db250ZXh0LCBpbnQsIGFuZHJvaWQuZGF0YWJhc2UuQ3Vyc29yLCBPYmplY3RbXSkgCisgICAgICogQHNlZSAjbG9hZEN1cnNvckFkYXB0ZXIoYW5kcm9pZC5jb250ZW50LkNvbnRleHQsIGludCwgU3RyaW5nLCBPYmplY3RbXSkgCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBCYXNlQWRhcHRlciBsb2FkQWRhcHRlcihDb250ZXh0IGNvbnRleHQsIGludCBpZCwgT2JqZWN0Li4uIHBhcmFtZXRlcnMpIHsKKyAgICAgICAgZmluYWwgQmFzZUFkYXB0ZXIgYWRhcHRlciA9IGxvYWRBZGFwdGVyKGNvbnRleHQsIGlkLCBudWxsLCBwYXJhbWV0ZXJzKTsKKyAgICAgICAgaWYgKGFkYXB0ZXIgaW5zdGFuY2VvZiBNYW5hZ2VkQWRhcHRlcikgeworICAgICAgICAgICAgKChNYW5hZ2VkQWRhcHRlcikgYWRhcHRlcikubG9hZCgpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBhZGFwdGVyOworICAgIH0KKworICAgIC8qKgorICAgICAqIExvYWRzIGFuIGFkYXB0ZXIgZnJvbSB0aGUgc3BlY2lmaWVkIFhNTCByZXNvdXJjZS4gVGhlIG9wdGlvbmFsIGFzc2VydE5hbWUgY2FuCisgICAgICogYmUgdXNlZCB0byBleGl0IGVhcmx5IGlmIHRoZSBhZGFwdGVyIGRlZmluZWQgaW4gdGhlIFhNTCByZXNvdXJjZSBpcyBub3Qgb2YgdGhlCisgICAgICogZXhwZWN0ZWQgdHlwZS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gY29udGV4dCBUaGUgY29udGV4dCB0byBhc3NvY2lhdGUgd2l0aCB0aGUgYWRhcHRlci4KKyAgICAgKiBAcGFyYW0gaWQgVGhlIHJlc291cmNlIGlkIG9mIHRoZSBYTUwgZG9jdW1lbnQgZGVmaW5pbmcgdGhlIGFkYXB0ZXIuCisgICAgICogQHBhcmFtIGFzc2VydE5hbWUgVGhlIG1hbmRhdG9yeSBuYW1lIG9mIHRoZSBhZGFwdGVyIGluIHRoZSBYTUwgZG9jdW1lbnQuCisgICAgICogICAgICAgIElnbm9yZWQgaWYgbnVsbC4KKyAgICAgKiBAcGFyYW0gcGFyYW1ldGVycyBPcHRpb25hbCBwYXJhbWV0ZXJzIHBhc3NlZCB0byB0aGUgYWRhcHRlci4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIEFuIGluc3RhbmNlIG9mIHtAbGluayBhbmRyb2lkLndpZGdldC5CYXNlQWRhcHRlcn0uCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgQmFzZUFkYXB0ZXIgbG9hZEFkYXB0ZXIoQ29udGV4dCBjb250ZXh0LCBpbnQgaWQsIFN0cmluZyBhc3NlcnROYW1lLAorICAgICAgICAgICAgT2JqZWN0Li4uIHBhcmFtZXRlcnMpIHsKKworICAgICAgICBYbWxSZXNvdXJjZVBhcnNlciBwYXJzZXIgPSBudWxsOworICAgICAgICB0cnkgeworICAgICAgICAgICAgcGFyc2VyID0gY29udGV4dC5nZXRSZXNvdXJjZXMoKS5nZXRYbWwoaWQpOworICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZUFkYXB0ZXJGcm9tWG1sKGNvbnRleHQsIHBhcnNlciwgWG1sLmFzQXR0cmlidXRlU2V0KHBhcnNlciksCisgICAgICAgICAgICAgICAgICAgIGlkLCBwYXJhbWV0ZXJzLCBhc3NlcnROYW1lKTsKKyAgICAgICAgfSBjYXRjaCAoWG1sUHVsbFBhcnNlckV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgUmVzb3VyY2VzLk5vdEZvdW5kRXhjZXB0aW9uIHJuZiA9IG5ldyBSZXNvdXJjZXMuTm90Rm91bmRFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICJDYW4ndCBsb2FkIGFkYXB0ZXIgcmVzb3VyY2UgSUQgIiArCisgICAgICAgICAgICAgICAgICAgIGNvbnRleHQuZ2V0UmVzb3VyY2VzKCkuZ2V0UmVzb3VyY2VFbnRyeU5hbWUoaWQpKTsKKyAgICAgICAgICAgIHJuZi5pbml0Q2F1c2UoZXgpOworICAgICAgICAgICAgdGhyb3cgcm5mOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgUmVzb3VyY2VzLk5vdEZvdW5kRXhjZXB0aW9uIHJuZiA9IG5ldyBSZXNvdXJjZXMuTm90Rm91bmRFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICJDYW4ndCBsb2FkIGFkYXB0ZXIgcmVzb3VyY2UgSUQgIiArCisgICAgICAgICAgICAgICAgICAgIGNvbnRleHQuZ2V0UmVzb3VyY2VzKCkuZ2V0UmVzb3VyY2VFbnRyeU5hbWUoaWQpKTsKKyAgICAgICAgICAgIHJuZi5pbml0Q2F1c2UoZXgpOworICAgICAgICAgICAgdGhyb3cgcm5mOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgaWYgKHBhcnNlciAhPSBudWxsKSBwYXJzZXIuY2xvc2UoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEdlbmVyYXRlcyBhbiBhZGFwdGVyIHVzaW5nIHRoZSBzcGVjaWZpZWQgWE1MIHBhcnNlci4gVGhpcyBtZXRob2QgaXMgcmVzcG9uc2libGUKKyAgICAgKiBmb3IgY2hvb3NpbmcgdGhlIHR5cGUgb2YgdGhlIGFkYXB0ZXIgdG8gY3JlYXRlIGJhc2VkIG9uIHRoZSBjb250ZW50IG9mIHRoZQorICAgICAqIFhNTCBwYXJzZXIuCisgICAgICogCisgICAgICogVGhpcyBtZXRob2Qgd2lsbCBnZW5lcmF0ZSBhbiB7QGxpbmsgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9ufSBpZgorICAgICAqIDxjb2RlPmFzc2VydE5hbWU8L2NvZGU+IGlzIG5vdCBudWxsIGFuZCBkb2VzIG5vdCBtYXRjaCB0aGUgcm9vdCB0YWcgb2YgdGhlIFhNTAorICAgICAqIGRvY3VtZW50LiAKKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBCYXNlQWRhcHRlciBjcmVhdGVBZGFwdGVyRnJvbVhtbChDb250ZXh0IGMsCisgICAgICAgICAgICBYbWxQdWxsUGFyc2VyIHBhcnNlciwgQXR0cmlidXRlU2V0IGF0dHJzLCBpbnQgaWQsIE9iamVjdFtdIHBhcmFtZXRlcnMsCisgICAgICAgICAgICBTdHJpbmcgYXNzZXJ0TmFtZSkgdGhyb3dzIFhtbFB1bGxQYXJzZXJFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKKworICAgICAgICBCYXNlQWRhcHRlciBhZGFwdGVyID0gbnVsbDsKKworICAgICAgICAvLyBNYWtlIHN1cmUgd2UgYXJlIG9uIGEgc3RhcnQgdGFnLgorICAgICAgICBpbnQgdHlwZTsKKyAgICAgICAgaW50IGRlcHRoID0gcGFyc2VyLmdldERlcHRoKCk7CisKKyAgICAgICAgd2hpbGUgKCgodHlwZSA9IHBhcnNlci5uZXh0KCkpICE9IFhtbFB1bGxQYXJzZXIuRU5EX1RBRyB8fCBwYXJzZXIuZ2V0RGVwdGgoKSA+IGRlcHRoKSAmJgorICAgICAgICAgICAgICAgIHR5cGUgIT0gWG1sUHVsbFBhcnNlci5FTkRfRE9DVU1FTlQpIHsKKworICAgICAgICAgICAgaWYgKHR5cGUgIT0gWG1sUHVsbFBhcnNlci5TVEFSVF9UQUcpIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSBwYXJzZXIuZ2V0TmFtZSgpOworICAgICAgICAgICAgaWYgKGFzc2VydE5hbWUgIT0gbnVsbCAmJiAhYXNzZXJ0TmFtZS5lcXVhbHMobmFtZSkpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgYWRhcHRlciBkZWZpbmVkIGluICIgKworICAgICAgICAgICAgICAgICAgICAgICAgYy5nZXRSZXNvdXJjZXMoKS5nZXRSZXNvdXJjZUVudHJ5TmFtZShpZCkgKyAiIG11c3QgYmUgYSA8IiArIG5hbWUgKyAiIC8+Iik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChBREFQVEVSX0NVUlNPUi5lcXVhbHMobmFtZSkpIHsKKyAgICAgICAgICAgICAgICBhZGFwdGVyID0gY3JlYXRlQ3Vyc29yQWRhcHRlcihjLCBwYXJzZXIsIGF0dHJzLCBpZCwgcGFyYW1ldGVycyk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlVua25vd24gYWRhcHRlciBuYW1lICIgKyBwYXJzZXIuZ2V0TmFtZSgpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICIgaW4gIiArIGMuZ2V0UmVzb3VyY2VzKCkuZ2V0UmVzb3VyY2VFbnRyeU5hbWUoaWQpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBhZGFwdGVyOworCisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhbiBYbWxDdXJzb3JBZGFwdGVyIHVzaW5nIGFuIFhtbEN1cnNvckFkYXB0ZXJQYXJzZXIuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgWG1sQ3Vyc29yQWRhcHRlciBjcmVhdGVDdXJzb3JBZGFwdGVyKENvbnRleHQgYywgWG1sUHVsbFBhcnNlciBwYXJzZXIsCisgICAgICAgICAgICBBdHRyaWJ1dGVTZXQgYXR0cnMsIGludCBpZCwgT2JqZWN0W10gcGFyYW1ldGVycykKKyAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgWG1sUHVsbFBhcnNlckV4Y2VwdGlvbiB7CisKKyAgICAgICAgcmV0dXJuIG5ldyBYbWxDdXJzb3JBZGFwdGVyUGFyc2VyKGMsIHBhcnNlciwgYXR0cnMsIGlkKS5wYXJzZShwYXJhbWV0ZXJzKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQYXJzZXIgdGhhdCBjYW4gZ2VuZXJhdGUgWG1sQ3Vyc29yQWRhcHRlciBpbnN0YW5jZXMuIFRoaXMgcGFyc2VyIGlzIHJlc3BvbnNpYmxlIGZvcgorICAgICAqIGhhbmRsaW5nIGFsbCB0aGUgYXR0cmlidXRlcyBhbmQgY2hpbGQgbm9kZXMgZm9yIGEgJmx0O2N1cnNvci1hZGFwdGVyIC8mZ3Q7LgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIFhtbEN1cnNvckFkYXB0ZXJQYXJzZXIgeworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQURBUFRFUl9DVVJTT1JfQklORCA9ICJiaW5kIjsKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFEQVBURVJfQ1VSU09SX1NFTEVDVCA9ICJzZWxlY3QiOworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQURBUFRFUl9DVVJTT1JfQVNfU1RSSU5HID0gInN0cmluZyI7CisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBREFQVEVSX0NVUlNPUl9BU19JTUFHRSA9ICJpbWFnZSI7CisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBREFQVEVSX0NVUlNPUl9BU19UQUcgPSAidGFnIjsKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFEQVBURVJfQ1VSU09SX0FTX0lNQUdFX1VSSSA9ICJpbWFnZS11cmkiOworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQURBUFRFUl9DVVJTT1JfQVNfRFJBV0FCTEUgPSAiZHJhd2FibGUiOworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQURBUFRFUl9DVVJTT1JfTUFQID0gIm1hcCI7CisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBREFQVEVSX0NVUlNPUl9UUkFOU0ZPUk0gPSAidHJhbnNmb3JtIjsKKworICAgICAgICBwcml2YXRlIGZpbmFsIENvbnRleHQgbUNvbnRleHQ7CisgICAgICAgIHByaXZhdGUgZmluYWwgWG1sUHVsbFBhcnNlciBtUGFyc2VyOworICAgICAgICBwcml2YXRlIGZpbmFsIEF0dHJpYnV0ZVNldCBtQXR0cnM7CisgICAgICAgIHByaXZhdGUgZmluYWwgaW50IG1JZDsKKworICAgICAgICBwcml2YXRlIGZpbmFsIEhhc2hNYXA8U3RyaW5nLCBDdXJzb3JCaW5kZXI+IG1CaW5kZXJzOworICAgICAgICBwcml2YXRlIGZpbmFsIEFycmF5TGlzdDxTdHJpbmc+IG1Gcm9tOworICAgICAgICBwcml2YXRlIGZpbmFsIEFycmF5TGlzdDxJbnRlZ2VyPiBtVG87CisgICAgICAgIHByaXZhdGUgZmluYWwgQ3Vyc29yVHJhbnNmb3JtYXRpb24gbUlkZW50aXR5OworICAgICAgICBwcml2YXRlIGZpbmFsIFJlc291cmNlcyBtUmVzb3VyY2VzOworCisgICAgICAgIHB1YmxpYyBYbWxDdXJzb3JBZGFwdGVyUGFyc2VyKENvbnRleHQgYywgWG1sUHVsbFBhcnNlciBwYXJzZXIsIEF0dHJpYnV0ZVNldCBhdHRycywgaW50IGlkKSB7CisgICAgICAgICAgICBtQ29udGV4dCA9IGM7CisgICAgICAgICAgICBtUGFyc2VyID0gcGFyc2VyOworICAgICAgICAgICAgbUF0dHJzID0gYXR0cnM7CisgICAgICAgICAgICBtSWQgPSBpZDsKKworICAgICAgICAgICAgbVJlc291cmNlcyA9IG1Db250ZXh0LmdldFJlc291cmNlcygpOworICAgICAgICAgICAgbUJpbmRlcnMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIEN1cnNvckJpbmRlcj4oKTsKKyAgICAgICAgICAgIG1Gcm9tID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7CisgICAgICAgICAgICBtVG8gPSBuZXcgQXJyYXlMaXN0PEludGVnZXI+KCk7CisgICAgICAgICAgICBtSWRlbnRpdHkgPSBuZXcgSWRlbnRpdHlUcmFuc2Zvcm1hdGlvbihtQ29udGV4dCk7ICAgICAgICAgICAgCisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgWG1sQ3Vyc29yQWRhcHRlciBwYXJzZShPYmplY3RbXSBwYXJhbWV0ZXJzKQorICAgICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBYbWxQdWxsUGFyc2VyRXhjZXB0aW9uIHsKKworICAgICAgICAgICAgUmVzb3VyY2VzIHJlc291cmNlcyA9IG1SZXNvdXJjZXM7CisgICAgICAgICAgICBUeXBlZEFycmF5IGEgPSByZXNvdXJjZXMub2J0YWluQXR0cmlidXRlcyhtQXR0cnMsIGFuZHJvaWQuUi5zdHlsZWFibGUuQ3Vyc29yQWRhcHRlcik7CisKKyAgICAgICAgICAgIFN0cmluZyB1cmkgPSBhLmdldFN0cmluZyhhbmRyb2lkLlIuc3R5bGVhYmxlLkN1cnNvckFkYXB0ZXJfdXJpKTsKKyAgICAgICAgICAgIFN0cmluZyBzZWxlY3Rpb24gPSBhLmdldFN0cmluZyhhbmRyb2lkLlIuc3R5bGVhYmxlLkN1cnNvckFkYXB0ZXJfc2VsZWN0aW9uKTsKKyAgICAgICAgICAgIFN0cmluZyBzb3J0T3JkZXIgPSBhLmdldFN0cmluZyhhbmRyb2lkLlIuc3R5bGVhYmxlLkN1cnNvckFkYXB0ZXJfc29ydE9yZGVyKTsKKyAgICAgICAgICAgIGludCBsYXlvdXQgPSBhLmdldFJlc291cmNlSWQoYW5kcm9pZC5SLnN0eWxlYWJsZS5DdXJzb3JBZGFwdGVyX2xheW91dCwgMCk7CisgICAgICAgICAgICBpZiAobGF5b3V0ID09IDApIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgbGF5b3V0IHNwZWNpZmllZCBpbiAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlc291cmNlcy5nZXRSZXNvdXJjZUVudHJ5TmFtZShtSWQpICsgIiBkb2VzIG5vdCBleGlzdCIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBhLnJlY3ljbGUoKTsKKworICAgICAgICAgICAgWG1sUHVsbFBhcnNlciBwYXJzZXIgPSBtUGFyc2VyOworICAgICAgICAgICAgaW50IHR5cGU7CisgICAgICAgICAgICBpbnQgZGVwdGggPSBwYXJzZXIuZ2V0RGVwdGgoKTsKKworICAgICAgICAgICAgd2hpbGUgKCgodHlwZSA9IHBhcnNlci5uZXh0KCkpICE9IFhtbFB1bGxQYXJzZXIuRU5EX1RBRyB8fCBwYXJzZXIuZ2V0RGVwdGgoKSA+IGRlcHRoKSAmJgorICAgICAgICAgICAgICAgICAgICB0eXBlICE9IFhtbFB1bGxQYXJzZXIuRU5EX0RPQ1VNRU5UKSB7CisKKyAgICAgICAgICAgICAgICBpZiAodHlwZSAhPSBYbWxQdWxsUGFyc2VyLlNUQVJUX1RBRykgeworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBTdHJpbmcgbmFtZSA9IHBhcnNlci5nZXROYW1lKCk7CisKKyAgICAgICAgICAgICAgICBpZiAoQURBUFRFUl9DVVJTT1JfQklORC5lcXVhbHMobmFtZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgcGFyc2VCaW5kVGFnKCk7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChBREFQVEVSX0NVUlNPUl9TRUxFQ1QuZXF1YWxzKG5hbWUpKSB7CisgICAgICAgICAgICAgICAgICAgIHBhcnNlU2VsZWN0VGFnKCk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIlVua25vd24gdGFnIG5hbWUgIiArIHBhcnNlci5nZXROYW1lKCkgKyAiIGluICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc291cmNlcy5nZXRSZXNvdXJjZUVudHJ5TmFtZShtSWQpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIFN0cmluZ1tdIGZyb21BcnJheSA9IG1Gcm9tLnRvQXJyYXkobmV3IFN0cmluZ1ttRnJvbS5zaXplKCldKTsKKyAgICAgICAgICAgIGludFtdIHRvQXJyYXkgPSBuZXcgaW50W21Uby5zaXplKCldOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0b0FycmF5Lmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgdG9BcnJheVtpXSA9IG1Uby5nZXQoaSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIFN0cmluZ1tdIHNlbGVjdGlvbkFyZ3MgPSBudWxsOworICAgICAgICAgICAgaWYgKHBhcmFtZXRlcnMgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHNlbGVjdGlvbkFyZ3MgPSBuZXcgU3RyaW5nW3BhcmFtZXRlcnMubGVuZ3RoXTsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNlbGVjdGlvbkFyZ3MubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uQXJnc1tpXSA9IChTdHJpbmcpIHBhcmFtZXRlcnNbaV07CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gbmV3IFhtbEN1cnNvckFkYXB0ZXIobUNvbnRleHQsIGxheW91dCwgdXJpLCBmcm9tQXJyYXksIHRvQXJyYXksIHNlbGVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uQXJncywgc29ydE9yZGVyLCBtQmluZGVycyk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHZvaWQgcGFyc2VTZWxlY3RUYWcoKSB7CisgICAgICAgICAgICBUeXBlZEFycmF5IGEgPSBtUmVzb3VyY2VzLm9idGFpbkF0dHJpYnV0ZXMobUF0dHJzLAorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkLlIuc3R5bGVhYmxlLkN1cnNvckFkYXB0ZXJfU2VsZWN0SXRlbSk7CisKKyAgICAgICAgICAgIFN0cmluZyBmcm9tTmFtZSA9IGEuZ2V0U3RyaW5nKGFuZHJvaWQuUi5zdHlsZWFibGUuQ3Vyc29yQWRhcHRlcl9TZWxlY3RJdGVtX2NvbHVtbik7CisgICAgICAgICAgICBpZiAoZnJvbU5hbWUgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkEgc2VsZWN0IGl0ZW0gaW4gIiArCisgICAgICAgICAgICAgICAgICAgICAgICBtUmVzb3VyY2VzLmdldFJlc291cmNlRW50cnlOYW1lKG1JZCkgKworICAgICAgICAgICAgICAgICAgICAgICAgIiBkb2VzIG5vdCBoYXZlIGEgJ2NvbHVtbicgYXR0cmlidXRlIik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGEucmVjeWNsZSgpOworCisgICAgICAgICAgICBtRnJvbS5hZGQoZnJvbU5hbWUpOworICAgICAgICAgICAgbVRvLmFkZChWaWV3Lk5PX0lEKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgdm9pZCBwYXJzZUJpbmRUYWcoKSB0aHJvd3MgSU9FeGNlcHRpb24sIFhtbFB1bGxQYXJzZXJFeGNlcHRpb24geworICAgICAgICAgICAgUmVzb3VyY2VzIHJlc291cmNlcyA9IG1SZXNvdXJjZXM7CisgICAgICAgICAgICBUeXBlZEFycmF5IGEgPSByZXNvdXJjZXMub2J0YWluQXR0cmlidXRlcyhtQXR0cnMsCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQuUi5zdHlsZWFibGUuQ3Vyc29yQWRhcHRlcl9CaW5kSXRlbSk7CisKKyAgICAgICAgICAgIFN0cmluZyBmcm9tTmFtZSA9IGEuZ2V0U3RyaW5nKGFuZHJvaWQuUi5zdHlsZWFibGUuQ3Vyc29yQWRhcHRlcl9CaW5kSXRlbV9mcm9tKTsKKyAgICAgICAgICAgIGlmIChmcm9tTmFtZSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiQSBiaW5kIGl0ZW0gaW4gIiArCisgICAgICAgICAgICAgICAgICAgICAgICByZXNvdXJjZXMuZ2V0UmVzb3VyY2VFbnRyeU5hbWUobUlkKSArICIgZG9lcyBub3QgaGF2ZSBhICdmcm9tJyBhdHRyaWJ1dGUiKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaW50IHRvTmFtZSA9IGEuZ2V0UmVzb3VyY2VJZChhbmRyb2lkLlIuc3R5bGVhYmxlLkN1cnNvckFkYXB0ZXJfQmluZEl0ZW1fdG8sIDApOworICAgICAgICAgICAgaWYgKHRvTmFtZSA9PSAwKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiQSBiaW5kIGl0ZW0gaW4gIiArCisgICAgICAgICAgICAgICAgICAgICAgICByZXNvdXJjZXMuZ2V0UmVzb3VyY2VFbnRyeU5hbWUobUlkKSArICIgZG9lcyBub3QgaGF2ZSBhICd0bycgYXR0cmlidXRlIik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIFN0cmluZyBhc1R5cGUgPSBhLmdldFN0cmluZyhhbmRyb2lkLlIuc3R5bGVhYmxlLkN1cnNvckFkYXB0ZXJfQmluZEl0ZW1fYXMpOworICAgICAgICAgICAgaWYgKGFzVHlwZSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiQSBiaW5kIGl0ZW0gaW4gIiArCisgICAgICAgICAgICAgICAgICAgICAgICByZXNvdXJjZXMuZ2V0UmVzb3VyY2VFbnRyeU5hbWUobUlkKSArICIgZG9lcyBub3QgaGF2ZSBhbiAnYXMnIGF0dHJpYnV0ZSIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBtRnJvbS5hZGQoZnJvbU5hbWUpOworICAgICAgICAgICAgbVRvLmFkZCh0b05hbWUpOworICAgICAgICAgICAgbUJpbmRlcnMucHV0KGZyb21OYW1lLCBmaW5kQmluZGVyKGFzVHlwZSkpOworCisgICAgICAgICAgICBhLnJlY3ljbGUoKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgQ3Vyc29yQmluZGVyIGZpbmRCaW5kZXIoU3RyaW5nIHR5cGUpIHRocm93cyBJT0V4Y2VwdGlvbiwgWG1sUHVsbFBhcnNlckV4Y2VwdGlvbiB7CisgICAgICAgICAgICBmaW5hbCBYbWxQdWxsUGFyc2VyIHBhcnNlciA9IG1QYXJzZXI7CisgICAgICAgICAgICBmaW5hbCBDb250ZXh0IGNvbnRleHQgPSBtQ29udGV4dDsKKyAgICAgICAgICAgIEN1cnNvclRyYW5zZm9ybWF0aW9uIHRyYW5zZm9ybWF0aW9uID0gbUlkZW50aXR5OworCisgICAgICAgICAgICBpbnQgdGFnVHlwZTsKKyAgICAgICAgICAgIGludCBkZXB0aCA9IHBhcnNlci5nZXREZXB0aCgpOworCisgICAgICAgICAgICBmaW5hbCBib29sZWFuIGlzRHJhd2FibGUgPSBBREFQVEVSX0NVUlNPUl9BU19EUkFXQUJMRS5lcXVhbHModHlwZSk7ICAgICAgICAgICAgCisKKyAgICAgICAgICAgIHdoaWxlICgoKHRhZ1R5cGUgPSBwYXJzZXIubmV4dCgpKSAhPSBYbWxQdWxsUGFyc2VyLkVORF9UQUcgfHwgcGFyc2VyLmdldERlcHRoKCkgPiBkZXB0aCkKKyAgICAgICAgICAgICAgICAgICAgJiYgdGFnVHlwZSAhPSBYbWxQdWxsUGFyc2VyLkVORF9ET0NVTUVOVCkgeworCisgICAgICAgICAgICAgICAgaWYgKHRhZ1R5cGUgIT0gWG1sUHVsbFBhcnNlci5TVEFSVF9UQUcpIHsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSBwYXJzZXIuZ2V0TmFtZSgpOworCisgICAgICAgICAgICAgICAgaWYgKEFEQVBURVJfQ1VSU09SX1RSQU5TRk9STS5lcXVhbHMobmFtZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgdHJhbnNmb3JtYXRpb24gPSBmaW5kVHJhbnNmb3JtYXRpb24oKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKEFEQVBURVJfQ1VSU09SX01BUC5lcXVhbHMobmFtZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCEodHJhbnNmb3JtYXRpb24gaW5zdGFuY2VvZiBNYXBUcmFuc2Zvcm1hdGlvbikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zZm9ybWF0aW9uID0gbmV3IE1hcFRyYW5zZm9ybWF0aW9uKGNvbnRleHQpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGZpbmRNYXAoKChNYXBUcmFuc2Zvcm1hdGlvbikgdHJhbnNmb3JtYXRpb24pLCBpc0RyYXdhYmxlKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiVW5rbm93biB0YWcgbmFtZSAiICsgcGFyc2VyLmdldE5hbWUoKSArICIgaW4gIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dC5nZXRSZXNvdXJjZXMoKS5nZXRSZXNvdXJjZUVudHJ5TmFtZShtSWQpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChBREFQVEVSX0NVUlNPUl9BU19TVFJJTkcuZXF1YWxzKHR5cGUpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmdCaW5kZXIoY29udGV4dCwgdHJhbnNmb3JtYXRpb24pOworICAgICAgICAgICAgfSBlbHNlIGlmIChBREFQVEVSX0NVUlNPUl9BU19UQUcuZXF1YWxzKHR5cGUpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBUYWdCaW5kZXIoY29udGV4dCwgdHJhbnNmb3JtYXRpb24pOworICAgICAgICAgICAgfSBlbHNlIGlmIChBREFQVEVSX0NVUlNPUl9BU19JTUFHRS5lcXVhbHModHlwZSkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEltYWdlQmluZGVyKGNvbnRleHQsIHRyYW5zZm9ybWF0aW9uKTsgICAgICAgICAgICAKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoQURBUFRFUl9DVVJTT1JfQVNfSU1BR0VfVVJJLmVxdWFscyh0eXBlKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBuZXcgSW1hZ2VVcmlCaW5kZXIoY29udGV4dCwgdHJhbnNmb3JtYXRpb24pOworICAgICAgICAgICAgfSBlbHNlIGlmIChpc0RyYXdhYmxlKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBEcmF3YWJsZUJpbmRlcihjb250ZXh0LCB0cmFuc2Zvcm1hdGlvbik7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJldHVybiBjcmVhdGVCaW5kZXIodHlwZSwgdHJhbnNmb3JtYXRpb24pOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBDdXJzb3JCaW5kZXIgY3JlYXRlQmluZGVyKFN0cmluZyB0eXBlLCBDdXJzb3JUcmFuc2Zvcm1hdGlvbiB0cmFuc2Zvcm1hdGlvbikgeworICAgICAgICAgICAgaWYgKG1Db250ZXh0LmlzUmVzdHJpY3RlZCgpKSByZXR1cm4gbnVsbDsKKworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBmaW5hbCBDbGFzczw/PiBrbGFzcyA9IENsYXNzLmZvck5hbWUodHlwZSwgdHJ1ZSwgbUNvbnRleHQuZ2V0Q2xhc3NMb2FkZXIoKSk7CisgICAgICAgICAgICAgICAgaWYgKEN1cnNvckJpbmRlci5jbGFzcy5pc0Fzc2lnbmFibGVGcm9tKGtsYXNzKSkgeworICAgICAgICAgICAgICAgICAgICBmaW5hbCBDb25zdHJ1Y3Rvcjw/PiBjID0ga2xhc3MuZ2V0RGVjbGFyZWRDb25zdHJ1Y3RvcigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb250ZXh0LmNsYXNzLCBDdXJzb3JUcmFuc2Zvcm1hdGlvbi5jbGFzcyk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAoQ3Vyc29yQmluZGVyKSBjLm5ld0luc3RhbmNlKG1Db250ZXh0LCB0cmFuc2Zvcm1hdGlvbik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiQ2Fubm90IGluc3RhbmNpYXRlIGJpbmRlciB0eXBlIGluICIgKworICAgICAgICAgICAgICAgICAgICAgICAgbUNvbnRleHQuZ2V0UmVzb3VyY2VzKCkuZ2V0UmVzb3VyY2VFbnRyeU5hbWUobUlkKSArICI6ICIgKyB0eXBlLCBlKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiQ2Fubm90IGluc3RhbmNpYXRlIGJpbmRlciB0eXBlIGluICIgKworICAgICAgICAgICAgICAgICAgICAgICAgbUNvbnRleHQuZ2V0UmVzb3VyY2VzKCkuZ2V0UmVzb3VyY2VFbnRyeU5hbWUobUlkKSArICI6ICIgKyB0eXBlLCBlKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkNhbm5vdCBpbnN0YW5jaWF0ZSBiaW5kZXIgdHlwZSBpbiAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1Db250ZXh0LmdldFJlc291cmNlcygpLmdldFJlc291cmNlRW50cnlOYW1lKG1JZCkgKyAiOiAiICsgdHlwZSwgZSk7CisgICAgICAgICAgICB9IGNhdGNoIChJbnN0YW50aWF0aW9uRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJDYW5ub3QgaW5zdGFuY2lhdGUgYmluZGVyIHR5cGUgaW4gIiArCisgICAgICAgICAgICAgICAgICAgICAgICBtQ29udGV4dC5nZXRSZXNvdXJjZXMoKS5nZXRSZXNvdXJjZUVudHJ5TmFtZShtSWQpICsgIjogIiArIHR5cGUsIGUpOworICAgICAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiQ2Fubm90IGluc3RhbmNpYXRlIGJpbmRlciB0eXBlIGluICIgKworICAgICAgICAgICAgICAgICAgICAgICAgbUNvbnRleHQuZ2V0UmVzb3VyY2VzKCkuZ2V0UmVzb3VyY2VFbnRyeU5hbWUobUlkKSArICI6ICIgKyB0eXBlLCBlKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHZvaWQgZmluZE1hcChNYXBUcmFuc2Zvcm1hdGlvbiB0cmFuc2Zvcm1hdGlvbiwgYm9vbGVhbiBkcmF3YWJsZSkgeworICAgICAgICAgICAgUmVzb3VyY2VzIHJlc291cmNlcyA9IG1SZXNvdXJjZXM7CisKKyAgICAgICAgICAgIFR5cGVkQXJyYXkgYSA9IHJlc291cmNlcy5vYnRhaW5BdHRyaWJ1dGVzKG1BdHRycywKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZC5SLnN0eWxlYWJsZS5DdXJzb3JBZGFwdGVyX01hcEl0ZW0pOworCisgICAgICAgICAgICBTdHJpbmcgZnJvbSA9IGEuZ2V0U3RyaW5nKGFuZHJvaWQuUi5zdHlsZWFibGUuQ3Vyc29yQWRhcHRlcl9NYXBJdGVtX2Zyb21WYWx1ZSk7CisgICAgICAgICAgICBpZiAoZnJvbSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiQSBtYXAgaXRlbSBpbiAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlc291cmNlcy5nZXRSZXNvdXJjZUVudHJ5TmFtZShtSWQpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICIgZG9lcyBub3QgaGF2ZSBhICdmcm9tVmFsdWUnIGF0dHJpYnV0ZSIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIWRyYXdhYmxlKSB7CisgICAgICAgICAgICAgICAgU3RyaW5nIHRvID0gYS5nZXRTdHJpbmcoYW5kcm9pZC5SLnN0eWxlYWJsZS5DdXJzb3JBZGFwdGVyX01hcEl0ZW1fdG9WYWx1ZSk7CisgICAgICAgICAgICAgICAgaWYgKHRvID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiQSBtYXAgaXRlbSBpbiAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvdXJjZXMuZ2V0UmVzb3VyY2VFbnRyeU5hbWUobUlkKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBkb2VzIG5vdCBoYXZlIGEgJ3RvVmFsdWUnIGF0dHJpYnV0ZSIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB0cmFuc2Zvcm1hdGlvbi5hZGRTdHJpbmdNYXBwaW5nKGZyb20sIHRvKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaW50IHRvID0gYS5nZXRSZXNvdXJjZUlkKGFuZHJvaWQuUi5zdHlsZWFibGUuQ3Vyc29yQWRhcHRlcl9NYXBJdGVtX3RvVmFsdWUsIDApOworICAgICAgICAgICAgICAgIGlmICh0byA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkEgbWFwIGl0ZW0gaW4gIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb3VyY2VzLmdldFJlc291cmNlRW50cnlOYW1lKG1JZCkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgZG9lcyBub3QgaGF2ZSBhICd0b1ZhbHVlJyBhdHRyaWJ1dGUiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgdHJhbnNmb3JtYXRpb24uYWRkUmVzb3VyY2VNYXBwaW5nKGZyb20sIHRvKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYS5yZWN5Y2xlKCk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIEN1cnNvclRyYW5zZm9ybWF0aW9uIGZpbmRUcmFuc2Zvcm1hdGlvbigpIHsKKyAgICAgICAgICAgIFJlc291cmNlcyByZXNvdXJjZXMgPSBtUmVzb3VyY2VzOworICAgICAgICAgICAgQ3Vyc29yVHJhbnNmb3JtYXRpb24gdHJhbnNmb3JtYXRpb24gPSBudWxsOworICAgICAgICAgICAgVHlwZWRBcnJheSBhID0gcmVzb3VyY2VzLm9idGFpbkF0dHJpYnV0ZXMobUF0dHJzLAorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkLlIuc3R5bGVhYmxlLkN1cnNvckFkYXB0ZXJfVHJhbnNmb3JtSXRlbSk7CisKKyAgICAgICAgICAgIFN0cmluZyBjbGFzc05hbWUgPSBhLmdldFN0cmluZyhhbmRyb2lkLlIuc3R5bGVhYmxlLkN1cnNvckFkYXB0ZXJfVHJhbnNmb3JtSXRlbV93aXRoQ2xhc3MpOworICAgICAgICAgICAgaWYgKGNsYXNzTmFtZSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgU3RyaW5nIGV4cHJlc3Npb24gPSBhLmdldFN0cmluZygKKyAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQuUi5zdHlsZWFibGUuQ3Vyc29yQWRhcHRlcl9UcmFuc2Zvcm1JdGVtX3dpdGhFeHByZXNzaW9uKTsKKyAgICAgICAgICAgICAgICB0cmFuc2Zvcm1hdGlvbiA9IGNyZWF0ZUV4cHJlc3Npb25UcmFuc2Zvcm1hdGlvbihleHByZXNzaW9uKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoIW1Db250ZXh0LmlzUmVzdHJpY3RlZCgpKSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgZmluYWwgQ2xhc3M8Pz4ga2xhcyA9IENsYXNzLmZvck5hbWUoY2xhc3NOYW1lLCB0cnVlLCBtQ29udGV4dC5nZXRDbGFzc0xvYWRlcigpKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKEN1cnNvclRyYW5zZm9ybWF0aW9uLmNsYXNzLmlzQXNzaWduYWJsZUZyb20oa2xhcykpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIENvbnN0cnVjdG9yPD8+IGMgPSBrbGFzLmdldERlY2xhcmVkQ29uc3RydWN0b3IoQ29udGV4dC5jbGFzcyk7CisgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2Zvcm1hdGlvbiA9IChDdXJzb3JUcmFuc2Zvcm1hdGlvbikgYy5uZXdJbnN0YW5jZShtQ29udGV4dCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiQ2Fubm90IGluc3RhbmNpYXRlIHRyYW5zZm9ybSB0eXBlIGluICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgbUNvbnRleHQuZ2V0UmVzb3VyY2VzKCkuZ2V0UmVzb3VyY2VFbnRyeU5hbWUobUlkKSArICI6ICIgKyBjbGFzc05hbWUsIGUpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkNhbm5vdCBpbnN0YW5jaWF0ZSB0cmFuc2Zvcm0gdHlwZSBpbiAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Db250ZXh0LmdldFJlc291cmNlcygpLmdldFJlc291cmNlRW50cnlOYW1lKG1JZCkgKyAiOiAiICsgY2xhc3NOYW1lLCBlKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiQ2Fubm90IGluc3RhbmNpYXRlIHRyYW5zZm9ybSB0eXBlIGluICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgbUNvbnRleHQuZ2V0UmVzb3VyY2VzKCkuZ2V0UmVzb3VyY2VFbnRyeU5hbWUobUlkKSArICI6ICIgKyBjbGFzc05hbWUsIGUpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEluc3RhbnRpYXRpb25FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJDYW5ub3QgaW5zdGFuY2lhdGUgdHJhbnNmb3JtIHR5cGUgaW4gIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ29udGV4dC5nZXRSZXNvdXJjZXMoKS5nZXRSZXNvdXJjZUVudHJ5TmFtZShtSWQpICsgIjogIiArIGNsYXNzTmFtZSwgZSk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkNhbm5vdCBpbnN0YW5jaWF0ZSB0cmFuc2Zvcm0gdHlwZSBpbiAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Db250ZXh0LmdldFJlc291cmNlcygpLmdldFJlc291cmNlRW50cnlOYW1lKG1JZCkgKyAiOiAiICsgY2xhc3NOYW1lLCBlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGEucmVjeWNsZSgpOworCisgICAgICAgICAgICBpZiAodHJhbnNmb3JtYXRpb24gPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkEgdHJhbnNmb3JtIGl0ZW0gaW4gIiArCisgICAgICAgICAgICAgICAgICAgIHJlc291cmNlcy5nZXRSZXNvdXJjZUVudHJ5TmFtZShtSWQpICsgIiBtdXN0IGhhdmUgYSAnd2l0aENsYXNzJyBvciAiICsKKyAgICAgICAgICAgICAgICAgICAgIid3aXRoRXhwcmVzc2lvbicgYXR0cmlidXRlIik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiB0cmFuc2Zvcm1hdGlvbjsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgQ3Vyc29yVHJhbnNmb3JtYXRpb24gY3JlYXRlRXhwcmVzc2lvblRyYW5zZm9ybWF0aW9uKFN0cmluZyBleHByZXNzaW9uKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IEV4cHJlc3Npb25UcmFuc2Zvcm1hdGlvbihtQ29udGV4dCwgZXhwcmVzc2lvbik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJbnRlcmZhY2UgdXNlZCBieSBhZGFwdGVycyB0aGF0IHJlcXVpcmUgdG8gYmUgbG9hZGVkIGFmdGVyIGNyZWF0aW9uLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGludGVyZmFjZSBNYW5hZ2VkQWRhcHRlciB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBMb2FkcyB0aGUgY29udGVudCBvZiB0aGUgYWRhcHRlciwgYXN5bmNocm9ub3VzbHkuCisgICAgICAgICAqLworICAgICAgICB2b2lkIGxvYWQoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJbXBsZW1lbnRhdGlvbiBvZiBhIEN1cnNvciBhZGFwdGVyIGRlZmluZWQgaW4gWE1MLiBUaGlzIGNsYXNzIGlzIGEgdGhpbiB3cmFwcGVyCisgICAgICogb2YgYSBTaW1wbGVDdXJzb3JBZGFwdGVyLiBUaGUgbWFpbiBkaWZmZXJlbmNlIGlzIHRoZSBhYmlsaXR5IHRvIGhhbmRsZSBDdXJzb3JCaW5kZXJzLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIFhtbEN1cnNvckFkYXB0ZXIgZXh0ZW5kcyBTaW1wbGVDdXJzb3JBZGFwdGVyIGltcGxlbWVudHMgTWFuYWdlZEFkYXB0ZXIgeworICAgICAgICBwcml2YXRlIFN0cmluZyBtVXJpOworICAgICAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBtU2VsZWN0aW9uOworICAgICAgICBwcml2YXRlIGZpbmFsIFN0cmluZ1tdIG1TZWxlY3Rpb25BcmdzOworICAgICAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBtU29ydE9yZGVyOworICAgICAgICBwcml2YXRlIGZpbmFsIFN0cmluZ1tdIG1Db2x1bW5zOworICAgICAgICBwcml2YXRlIGZpbmFsIEN1cnNvckJpbmRlcltdIG1CaW5kZXJzOworICAgICAgICBwcml2YXRlIEFzeW5jVGFzazxWb2lkLFZvaWQsQ3Vyc29yPiBtTG9hZFRhc2s7CisKKyAgICAgICAgWG1sQ3Vyc29yQWRhcHRlcihDb250ZXh0IGNvbnRleHQsIGludCBsYXlvdXQsIFN0cmluZyB1cmksIFN0cmluZ1tdIGZyb20sIGludFtdIHRvLAorICAgICAgICAgICAgICAgIFN0cmluZyBzZWxlY3Rpb24sIFN0cmluZ1tdIHNlbGVjdGlvbkFyZ3MsIFN0cmluZyBzb3J0T3JkZXIsCisgICAgICAgICAgICAgICAgSGFzaE1hcDxTdHJpbmcsIEN1cnNvckJpbmRlcj4gYmluZGVycykgeworCisgICAgICAgICAgICBzdXBlcihjb250ZXh0LCBsYXlvdXQsIG51bGwsIGZyb20sIHRvKTsKKyAgICAgICAgICAgIG1Db250ZXh0ID0gY29udGV4dDsKKyAgICAgICAgICAgIG1VcmkgPSB1cmk7CisgICAgICAgICAgICBtU2VsZWN0aW9uID0gc2VsZWN0aW9uOworICAgICAgICAgICAgbVNlbGVjdGlvbkFyZ3MgPSBzZWxlY3Rpb25BcmdzOworICAgICAgICAgICAgbVNvcnRPcmRlciA9IHNvcnRPcmRlcjsKKyAgICAgICAgICAgIG1Db2x1bW5zID0gbmV3IFN0cmluZ1tmcm9tLmxlbmd0aCArIDFdOworICAgICAgICAgICAgLy8gVGhpcyBpcyBtYW5kYXRvcnkgaW4gQ3Vyc29yQWRhcHRlcgorICAgICAgICAgICAgbUNvbHVtbnNbMF0gPSAiX2lkIjsKKyAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkoZnJvbSwgMCwgbUNvbHVtbnMsIDEsIGZyb20ubGVuZ3RoKTsKKworICAgICAgICAgICAgQ3Vyc29yQmluZGVyIGJhc2ljID0gbmV3IFN0cmluZ0JpbmRlcihjb250ZXh0LCBuZXcgSWRlbnRpdHlUcmFuc2Zvcm1hdGlvbihjb250ZXh0KSk7CisgICAgICAgICAgICBmaW5hbCBpbnQgY291bnQgPSBmcm9tLmxlbmd0aDsKKyAgICAgICAgICAgIG1CaW5kZXJzID0gbmV3IEN1cnNvckJpbmRlcltjb3VudF07CisKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeworICAgICAgICAgICAgICAgIEN1cnNvckJpbmRlciBiaW5kZXIgPSBiaW5kZXJzLmdldChmcm9tW2ldKTsKKyAgICAgICAgICAgICAgICBpZiAoYmluZGVyID09IG51bGwpIGJpbmRlciA9IGJhc2ljOworICAgICAgICAgICAgICAgIG1CaW5kZXJzW2ldID0gYmluZGVyOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIGJpbmRWaWV3KFZpZXcgdmlldywgQ29udGV4dCBjb250ZXh0LCBDdXJzb3IgY3Vyc29yKSB7CisgICAgICAgICAgICBmaW5hbCBpbnQgY291bnQgPSBtVG8ubGVuZ3RoOworICAgICAgICAgICAgZmluYWwgaW50W10gZnJvbSA9IG1Gcm9tOworICAgICAgICAgICAgZmluYWwgaW50W10gdG8gPSBtVG87CisgICAgICAgICAgICBmaW5hbCBDdXJzb3JCaW5kZXJbXSBiaW5kZXJzID0gbUJpbmRlcnM7CisKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeworICAgICAgICAgICAgICAgIGZpbmFsIFZpZXcgdiA9IHZpZXcuZmluZFZpZXdCeUlkKHRvW2ldKTsKKyAgICAgICAgICAgICAgICBpZiAodiAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGJpbmRlcnNbaV0uYmluZCh2LCBjdXJzb3IsIGZyb21baV0pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIGxvYWQoKSB7CisgICAgICAgICAgICBpZiAobVVyaSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgbUxvYWRUYXNrID0gbmV3IFF1ZXJ5VGFzaygpLmV4ZWN1dGUoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHZvaWQgc2V0VXJpKFN0cmluZyB1cmkpIHsKKyAgICAgICAgICAgIG1VcmkgPSB1cmk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgY2hhbmdlQ3Vyc29yKEN1cnNvciBjKSB7CisgICAgICAgICAgICBpZiAobUxvYWRUYXNrICE9IG51bGwgJiYgbUxvYWRUYXNrLmdldFN0YXR1cygpICE9IFF1ZXJ5VGFzay5TdGF0dXMuRklOSVNIRUQpIHsKKyAgICAgICAgICAgICAgICBtTG9hZFRhc2suY2FuY2VsKHRydWUpOworICAgICAgICAgICAgICAgIG1Mb2FkVGFzayA9IG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzdXBlci5jaGFuZ2VDdXJzb3IoYyk7CisgICAgICAgIH0KKworICAgICAgICBjbGFzcyBRdWVyeVRhc2sgZXh0ZW5kcyBBc3luY1Rhc2s8Vm9pZCwgVm9pZCwgQ3Vyc29yPiB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHByb3RlY3RlZCBDdXJzb3IgZG9JbkJhY2tncm91bmQoVm9pZC4uLiBwYXJhbXMpIHsKKyAgICAgICAgICAgICAgICBpZiAobUNvbnRleHQgaW5zdGFuY2VvZiBBY3Rpdml0eSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gKChBY3Rpdml0eSkgbUNvbnRleHQpLm1hbmFnZWRRdWVyeSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBVcmkucGFyc2UobVVyaSksIG1Db2x1bW5zLCBtU2VsZWN0aW9uLCBtU2VsZWN0aW9uQXJncywgbVNvcnRPcmRlcik7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1Db250ZXh0LmdldENvbnRlbnRSZXNvbHZlcigpLnF1ZXJ5KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVyaS5wYXJzZShtVXJpKSwgbUNvbHVtbnMsIG1TZWxlY3Rpb24sIG1TZWxlY3Rpb25BcmdzLCBtU29ydE9yZGVyKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHJvdGVjdGVkIHZvaWQgb25Qb3N0RXhlY3V0ZShDdXJzb3IgY3Vyc29yKSB7CisgICAgICAgICAgICAgICAgaWYgKCFpc0NhbmNlbGxlZCgpKSB7CisgICAgICAgICAgICAgICAgICAgIFhtbEN1cnNvckFkYXB0ZXIuc3VwZXIuY2hhbmdlQ3Vyc29yKGN1cnNvcik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogSWRlbnRpdHkgdHJhbnNmb3JtYXRpb24sIHJldHVybnMgdGhlIGNvbnRlbnQgb2YgdGhlIHNwZWNpZmllZCBjb2x1bW4gYXMgYSBTdHJpbmcsCisgICAgICogd2l0aG91dCBwZXJmb3JtaW5nIGFueSBtYW5pcHVsYXRpb24uIFRoaXMgaXMgdXNlZCB3aGVuIG5vIHRyYW5zZm9ybWF0aW9uIGlzIHNwZWNpZmllZC4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBJZGVudGl0eVRyYW5zZm9ybWF0aW9uIGV4dGVuZHMgQ3Vyc29yVHJhbnNmb3JtYXRpb24geworICAgICAgICBwdWJsaWMgSWRlbnRpdHlUcmFuc2Zvcm1hdGlvbihDb250ZXh0IGNvbnRleHQpIHsKKyAgICAgICAgICAgIHN1cGVyKGNvbnRleHQpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBTdHJpbmcgdHJhbnNmb3JtKEN1cnNvciBjdXJzb3IsIGludCBjb2x1bW5JbmRleCkgeworICAgICAgICAgICAgcmV0dXJuIGN1cnNvci5nZXRTdHJpbmcoY29sdW1uSW5kZXgpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQW4gZXhwcmVzc2lvbiB0cmFuc2Zvcm1hdGlvbiBpcyBhIHNpbXBsZSB0ZW1wbGF0ZSBiYXNlZCByZXBsYWNlbWVudCB1dGlsaXR5LgorICAgICAqIEluIGFuIGV4cHJlc3Npb24sIGVhY2ggc2VnbWVudCBvZiB0aGUgZm9ybSA8Y29kZT57KFtefV0rKX08L2NvZGU+IGlzIHJlcGxhY2VkCisgICAgICogd2l0aCB0aGUgdmFsdWUgb2YgdGhlIGNvbHVtbiBvZiBuYW1lICQxLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIEV4cHJlc3Npb25UcmFuc2Zvcm1hdGlvbiBleHRlbmRzIEN1cnNvclRyYW5zZm9ybWF0aW9uIHsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBFeHByZXNzaW9uTm9kZSBtRmlyc3ROb2RlID0gbmV3IENvbnN0YW50RXhwcmVzc2lvbk5vZGUoIiIpOworICAgICAgICBwcml2YXRlIGZpbmFsIFN0cmluZ0J1aWxkZXIgbUJ1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworCisgICAgICAgIHB1YmxpYyBFeHByZXNzaW9uVHJhbnNmb3JtYXRpb24oQ29udGV4dCBjb250ZXh0LCBTdHJpbmcgZXhwcmVzc2lvbikgeworICAgICAgICAgICAgc3VwZXIoY29udGV4dCk7CisKKyAgICAgICAgICAgIHBhcnNlKGV4cHJlc3Npb24pOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSB2b2lkIHBhcnNlKFN0cmluZyBleHByZXNzaW9uKSB7CisgICAgICAgICAgICBFeHByZXNzaW9uTm9kZSBub2RlID0gbUZpcnN0Tm9kZTsKKyAgICAgICAgICAgIGludCBzZWdtZW50U3RhcnQ7CisgICAgICAgICAgICBpbnQgY291bnQgPSBleHByZXNzaW9uLmxlbmd0aCgpOworCisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKyAgICAgICAgICAgICAgICBjaGFyIGMgPSBleHByZXNzaW9uLmNoYXJBdChpKTsKKyAgICAgICAgICAgICAgICAvLyBTdGFydCBhIGNvbHVtbiBuYW1lIHNlZ21lbnQKKyAgICAgICAgICAgICAgICBzZWdtZW50U3RhcnQgPSBpOworICAgICAgICAgICAgICAgIGlmIChjID09ICd7JykgeworICAgICAgICAgICAgICAgICAgICB3aGlsZSAoaSA8IGNvdW50ICYmIChjID0gZXhwcmVzc2lvbi5jaGFyQXQoaSkpICE9ICd9JykgeworICAgICAgICAgICAgICAgICAgICAgICAgaSsrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIC8vIFdlJ3ZlIHJlYWNoZWQgdGhlIGVuZCwgYnV0IHRoZSBleHByZXNzaW9uIGRpZG4ndCBjbG9zZQorICAgICAgICAgICAgICAgICAgICBpZiAoYyAhPSAnfScpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIlRoZSB0cmFuc2Zvcm0gZXhwcmVzc2lvbiBjb250YWlucyBhICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibm9uLWNsb3NlZCBjb2x1bW4gbmFtZTogIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cHJlc3Npb24uc3Vic3RyaW5nKHNlZ21lbnRTdGFydCArIDEsIGkpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBub2RlLm5leHQgPSBuZXcgQ29sdW1uRXhwcmVzc2lvbk5vZGUoZXhwcmVzc2lvbi5zdWJzdHJpbmcoc2VnbWVudFN0YXJ0ICsgMSwgaSkpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHdoaWxlIChpIDwgY291bnQgJiYgKGMgPSBleHByZXNzaW9uLmNoYXJBdChpKSkgIT0gJ3snKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpKys7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgbm9kZS5uZXh0ID0gbmV3IENvbnN0YW50RXhwcmVzc2lvbk5vZGUoZXhwcmVzc2lvbi5zdWJzdHJpbmcoc2VnbWVudFN0YXJ0LCBpKSk7CisgICAgICAgICAgICAgICAgICAgIC8vIFJld2luZCBpZiB3ZSd2ZSByZWFjaGVkIGEgY29sdW1uIGV4cHJlc3Npb24KKyAgICAgICAgICAgICAgICAgICAgaWYgKGMgPT0gJ3snKSBpLS07CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG5vZGUgPSBub2RlLm5leHQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFN0cmluZyB0cmFuc2Zvcm0oQ3Vyc29yIGN1cnNvciwgaW50IGNvbHVtbkluZGV4KSB7CisgICAgICAgICAgICBmaW5hbCBTdHJpbmdCdWlsZGVyIGJ1aWxkZXIgPSBtQnVpbGRlcjsKKyAgICAgICAgICAgIGJ1aWxkZXIuZGVsZXRlKDAsIGJ1aWxkZXIubGVuZ3RoKCkpOworCisgICAgICAgICAgICBFeHByZXNzaW9uTm9kZSBub2RlID0gbUZpcnN0Tm9kZTsKKyAgICAgICAgICAgIC8vIFNraXAgdGhlIGZpcnN0IG5vZGUKKyAgICAgICAgICAgIHdoaWxlICgobm9kZSA9IG5vZGUubmV4dCkgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKG5vZGUuYXNTdHJpbmcoY3Vyc29yKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiBidWlsZGVyLnRvU3RyaW5nKCk7CisgICAgICAgIH0KKworICAgICAgICBzdGF0aWMgYWJzdHJhY3QgY2xhc3MgRXhwcmVzc2lvbk5vZGUgeworICAgICAgICAgICAgcHVibGljIEV4cHJlc3Npb25Ob2RlIG5leHQ7CisKKyAgICAgICAgICAgIHB1YmxpYyBhYnN0cmFjdCBTdHJpbmcgYXNTdHJpbmcoQ3Vyc29yIGN1cnNvcik7CisgICAgICAgIH0KKworICAgICAgICBzdGF0aWMgY2xhc3MgQ29uc3RhbnRFeHByZXNzaW9uTm9kZSBleHRlbmRzIEV4cHJlc3Npb25Ob2RlIHsKKyAgICAgICAgICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIG1Db25zdGFudDsKKworICAgICAgICAgICAgQ29uc3RhbnRFeHByZXNzaW9uTm9kZShTdHJpbmcgY29uc3RhbnQpIHsKKyAgICAgICAgICAgICAgICBtQ29uc3RhbnQgPSBjb25zdGFudDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgU3RyaW5nIGFzU3RyaW5nKEN1cnNvciBjdXJzb3IpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbUNvbnN0YW50OworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgc3RhdGljIGNsYXNzIENvbHVtbkV4cHJlc3Npb25Ob2RlIGV4dGVuZHMgRXhwcmVzc2lvbk5vZGUgeworICAgICAgICAgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbUNvbHVtbk5hbWU7CisgICAgICAgICAgICBwcml2YXRlIEN1cnNvciBtU2lnbmF0dXJlOworICAgICAgICAgICAgcHJpdmF0ZSBpbnQgbUNvbHVtbkluZGV4ID0gLTE7CisKKyAgICAgICAgICAgIENvbHVtbkV4cHJlc3Npb25Ob2RlKFN0cmluZyBjb2x1bW5OYW1lKSB7CisgICAgICAgICAgICAgICAgbUNvbHVtbk5hbWUgPSBjb2x1bW5OYW1lOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBTdHJpbmcgYXNTdHJpbmcoQ3Vyc29yIGN1cnNvcikgeworICAgICAgICAgICAgICAgIGlmIChjdXJzb3IgIT0gbVNpZ25hdHVyZSB8fCBtQ29sdW1uSW5kZXggPT0gLTEpIHsKKyAgICAgICAgICAgICAgICAgICAgbUNvbHVtbkluZGV4ID0gY3Vyc29yLmdldENvbHVtbkluZGV4KG1Db2x1bW5OYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgbVNpZ25hdHVyZSA9IGN1cnNvcjsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICByZXR1cm4gY3Vyc29yLmdldFN0cmluZyhtQ29sdW1uSW5kZXgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQSBtYXAgdHJhbnNmb3JtYXRpb24gb2ZmZXJzIGEgc2ltcGxlIG1hcHBpbmcgYmV0d2VlbiBzcGVjaWZpZWQgU3RyaW5nIHZhbHVlcworICAgICAqIHRvIFN0cmluZ3Mgb3IgaW50ZWdlcnMuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgTWFwVHJhbnNmb3JtYXRpb24gZXh0ZW5kcyBDdXJzb3JUcmFuc2Zvcm1hdGlvbiB7CisgICAgICAgIHByaXZhdGUgZmluYWwgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4gbVN0cmluZ01hcHBpbmdzOworICAgICAgICBwcml2YXRlIGZpbmFsIEhhc2hNYXA8U3RyaW5nLCBJbnRlZ2VyPiBtUmVzb3VyY2VNYXBwaW5nczsKKworICAgICAgICBwdWJsaWMgTWFwVHJhbnNmb3JtYXRpb24oQ29udGV4dCBjb250ZXh0KSB7CisgICAgICAgICAgICBzdXBlcihjb250ZXh0KTsKKyAgICAgICAgICAgIG1TdHJpbmdNYXBwaW5ncyA9IG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPigpOworICAgICAgICAgICAgbVJlc291cmNlTWFwcGluZ3MgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIEludGVnZXI+KCk7CisgICAgICAgIH0KKworICAgICAgICB2b2lkIGFkZFN0cmluZ01hcHBpbmcoU3RyaW5nIGZyb20sIFN0cmluZyB0bykgeworICAgICAgICAgICAgbVN0cmluZ01hcHBpbmdzLnB1dChmcm9tLCB0byk7CisgICAgICAgIH0KKworICAgICAgICB2b2lkIGFkZFJlc291cmNlTWFwcGluZyhTdHJpbmcgZnJvbSwgaW50IHRvKSB7CisgICAgICAgICAgICBtUmVzb3VyY2VNYXBwaW5ncy5wdXQoZnJvbSwgdG8pOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBTdHJpbmcgdHJhbnNmb3JtKEN1cnNvciBjdXJzb3IsIGludCBjb2x1bW5JbmRleCkgeworICAgICAgICAgICAgZmluYWwgU3RyaW5nIHZhbHVlID0gY3Vyc29yLmdldFN0cmluZyhjb2x1bW5JbmRleCk7CisgICAgICAgICAgICBmaW5hbCBTdHJpbmcgdHJhbnNmb3JtZWQgPSBtU3RyaW5nTWFwcGluZ3MuZ2V0KHZhbHVlKTsKKyAgICAgICAgICAgIHJldHVybiB0cmFuc2Zvcm1lZCA9PSBudWxsID8gdmFsdWUgOiB0cmFuc2Zvcm1lZDsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgaW50IHRyYW5zZm9ybVRvUmVzb3VyY2UoQ3Vyc29yIGN1cnNvciwgaW50IGNvbHVtbkluZGV4KSB7CisgICAgICAgICAgICBmaW5hbCBTdHJpbmcgdmFsdWUgPSBjdXJzb3IuZ2V0U3RyaW5nKGNvbHVtbkluZGV4KTsKKyAgICAgICAgICAgIGZpbmFsIEludGVnZXIgdHJhbnNmb3JtZWQgPSBtUmVzb3VyY2VNYXBwaW5ncy5nZXQodmFsdWUpOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJhbnNmb3JtZWQgPT0gbnVsbCA/IEludGVnZXIucGFyc2VJbnQodmFsdWUpIDogdHJhbnNmb3JtZWQ7CisgICAgICAgICAgICB9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQmluZHMgYSBTdHJpbmcgdG8gYSBUZXh0Vmlldy4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBTdHJpbmdCaW5kZXIgZXh0ZW5kcyBDdXJzb3JCaW5kZXIgeworICAgICAgICBwdWJsaWMgU3RyaW5nQmluZGVyKENvbnRleHQgY29udGV4dCwgQ3Vyc29yVHJhbnNmb3JtYXRpb24gdHJhbnNmb3JtYXRpb24pIHsKKyAgICAgICAgICAgIHN1cGVyKGNvbnRleHQsIHRyYW5zZm9ybWF0aW9uKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBiaW5kKFZpZXcgdmlldywgQ3Vyc29yIGN1cnNvciwgaW50IGNvbHVtbkluZGV4KSB7CisgICAgICAgICAgICBpZiAodmlldyBpbnN0YW5jZW9mIFRleHRWaWV3KSB7CisgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIHRleHQgPSBtVHJhbnNmb3JtYXRpb24udHJhbnNmb3JtKGN1cnNvciwgY29sdW1uSW5kZXgpOworICAgICAgICAgICAgICAgICgoVGV4dFZpZXcpIHZpZXcpLnNldFRleHQodGV4dCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBCaW5kcyBhbiBpbWFnZSBibG9iIHRvIGFuIEltYWdlVmlldy4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBJbWFnZUJpbmRlciBleHRlbmRzIEN1cnNvckJpbmRlciB7CisgICAgICAgIHB1YmxpYyBJbWFnZUJpbmRlcihDb250ZXh0IGNvbnRleHQsIEN1cnNvclRyYW5zZm9ybWF0aW9uIHRyYW5zZm9ybWF0aW9uKSB7CisgICAgICAgICAgICBzdXBlcihjb250ZXh0LCB0cmFuc2Zvcm1hdGlvbik7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gYmluZChWaWV3IHZpZXcsIEN1cnNvciBjdXJzb3IsIGludCBjb2x1bW5JbmRleCkgeworICAgICAgICAgICAgaWYgKHZpZXcgaW5zdGFuY2VvZiBJbWFnZVZpZXcpIHsKKyAgICAgICAgICAgICAgICBmaW5hbCBieXRlW10gZGF0YSA9IGN1cnNvci5nZXRCbG9iKGNvbHVtbkluZGV4KTsKKyAgICAgICAgICAgICAgICAoKEltYWdlVmlldykgdmlldykuc2V0SW1hZ2VCaXRtYXAoQml0bWFwRmFjdG9yeS5kZWNvZGVCeXRlQXJyYXkoZGF0YSwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEubGVuZ3RoKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBUYWdCaW5kZXIgZXh0ZW5kcyBDdXJzb3JCaW5kZXIgeworICAgICAgICBwdWJsaWMgVGFnQmluZGVyKENvbnRleHQgY29udGV4dCwgQ3Vyc29yVHJhbnNmb3JtYXRpb24gdHJhbnNmb3JtYXRpb24pIHsKKyAgICAgICAgICAgIHN1cGVyKGNvbnRleHQsIHRyYW5zZm9ybWF0aW9uKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBiaW5kKFZpZXcgdmlldywgQ3Vyc29yIGN1cnNvciwgaW50IGNvbHVtbkluZGV4KSB7CisgICAgICAgICAgICBmaW5hbCBTdHJpbmcgdGV4dCA9IG1UcmFuc2Zvcm1hdGlvbi50cmFuc2Zvcm0oY3Vyc29yLCBjb2x1bW5JbmRleCk7CisgICAgICAgICAgICB2aWV3LnNldFRhZyh0ZXh0KTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQmluZHMgYW4gaW1hZ2UgVVJJIHRvIGFuIEltYWdlVmlldy4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBJbWFnZVVyaUJpbmRlciBleHRlbmRzIEN1cnNvckJpbmRlciB7CisgICAgICAgIHB1YmxpYyBJbWFnZVVyaUJpbmRlcihDb250ZXh0IGNvbnRleHQsIEN1cnNvclRyYW5zZm9ybWF0aW9uIHRyYW5zZm9ybWF0aW9uKSB7CisgICAgICAgICAgICBzdXBlcihjb250ZXh0LCB0cmFuc2Zvcm1hdGlvbik7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gYmluZChWaWV3IHZpZXcsIEN1cnNvciBjdXJzb3IsIGludCBjb2x1bW5JbmRleCkgeworICAgICAgICAgICAgaWYgKHZpZXcgaW5zdGFuY2VvZiBJbWFnZVZpZXcpIHsKKyAgICAgICAgICAgICAgICAoKEltYWdlVmlldykgdmlldykuc2V0SW1hZ2VVUkkoVXJpLnBhcnNlKAorICAgICAgICAgICAgICAgICAgICAgICAgbVRyYW5zZm9ybWF0aW9uLnRyYW5zZm9ybShjdXJzb3IsIGNvbHVtbkluZGV4KSkpOworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQmluZHMgYSBkcmF3YWJsZSByZXNvdXJjZSBpZGVudGlmaWVyIHRvIGFuIEltYWdlVmlldy4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBEcmF3YWJsZUJpbmRlciBleHRlbmRzIEN1cnNvckJpbmRlciB7CisgICAgICAgIHB1YmxpYyBEcmF3YWJsZUJpbmRlcihDb250ZXh0IGNvbnRleHQsIEN1cnNvclRyYW5zZm9ybWF0aW9uIHRyYW5zZm9ybWF0aW9uKSB7CisgICAgICAgICAgICBzdXBlcihjb250ZXh0LCB0cmFuc2Zvcm1hdGlvbik7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gYmluZChWaWV3IHZpZXcsIEN1cnNvciBjdXJzb3IsIGludCBjb2x1bW5JbmRleCkgeworICAgICAgICAgICAgaWYgKHZpZXcgaW5zdGFuY2VvZiBJbWFnZVZpZXcpIHsKKyAgICAgICAgICAgICAgICBmaW5hbCBpbnQgcmVzb3VyY2UgPSBtVHJhbnNmb3JtYXRpb24udHJhbnNmb3JtVG9SZXNvdXJjZShjdXJzb3IsIGNvbHVtbkluZGV4KTsKKyAgICAgICAgICAgICAgICBpZiAocmVzb3VyY2UgPT0gMCkgcmV0dXJuIGZhbHNlOworCisgICAgICAgICAgICAgICAgKChJbWFnZVZpZXcpIHZpZXcpLnNldEltYWdlUmVzb3VyY2UocmVzb3VyY2UpOworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L0FycmF5QWRhcHRlci5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L0FycmF5QWRhcHRlci5qYXZhCmluZGV4IDAzYWRhOTQuLmI0ZWNlMjQgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9BcnJheUFkYXB0ZXIuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvQXJyYXlBZGFwdGVyLmphdmEKQEAgLTMwLDE3ICszMCwxNyBAQAogaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKIAogLyoqCi0gKiBBIExpc3RBZGFwdGVyIHRoYXQgbWFuYWdlcyBhIExpc3RWaWV3IGJhY2tlZCBieSBhbiBhcnJheSBvZiBhcmJpdHJhcnkKKyAqIEEgY29uY3JldGUgQmFzZUFkYXB0ZXIgdGhhdCBpcyBiYWNrZWQgYnkgYW4gYXJyYXkgb2YgYXJiaXRyYXJ5CiAgKiBvYmplY3RzLiAgQnkgZGVmYXVsdCB0aGlzIGNsYXNzIGV4cGVjdHMgdGhhdCB0aGUgcHJvdmlkZWQgcmVzb3VyY2UgaWQgcmVmZXJlbmNlcwogICogYSBzaW5nbGUgVGV4dFZpZXcuICBJZiB5b3Ugd2FudCB0byB1c2UgYSBtb3JlIGNvbXBsZXggbGF5b3V0LCB1c2UgdGhlIGNvbnN0cnVjdG9ycyB0aGF0CiAgKiBhbHNvIHRha2VzIGEgZmllbGQgaWQuICBUaGF0IGZpZWxkIGlkIHNob3VsZCByZWZlcmVuY2UgYSBUZXh0VmlldyBpbiB0aGUgbGFyZ2VyIGxheW91dAogICogcmVzb3VyY2UuCiAgKgotICogSG93ZXZlciB0aGUgVGV4dFZpZXcgaXMgcmVmZXJlbmNlZCwgaXQgd2lsbCBiZSBmaWxsZWQgd2l0aCB0aGUgdG9TdHJpbmcoKSBvZiBlYWNoIG9iamVjdCBpbgorICogPHA+SG93ZXZlciB0aGUgVGV4dFZpZXcgaXMgcmVmZXJlbmNlZCwgaXQgd2lsbCBiZSBmaWxsZWQgd2l0aCB0aGUgdG9TdHJpbmcoKSBvZiBlYWNoIG9iamVjdCBpbgogICogdGhlIGFycmF5LiBZb3UgY2FuIGFkZCBsaXN0cyBvciBhcnJheXMgb2YgY3VzdG9tIG9iamVjdHMuIE92ZXJyaWRlIHRoZSB0b1N0cmluZygpIG1ldGhvZAogICogb2YgeW91ciBvYmplY3RzIHRvIGRldGVybWluZSB3aGF0IHRleHQgd2lsbCBiZSBkaXNwbGF5ZWQgZm9yIHRoZSBpdGVtIGluIHRoZSBsaXN0LgogICoKLSAqIFRvIHVzZSBzb21ldGhpbmcgb3RoZXIgdGhhbiBUZXh0Vmlld3MgZm9yIHRoZSBhcnJheSBkaXNwbGF5LCBmb3IgaW5zdGFuY2UsIEltYWdlVmlld3MsCisgKiA8cD5UbyB1c2Ugc29tZXRoaW5nIG90aGVyIHRoYW4gVGV4dFZpZXdzIGZvciB0aGUgYXJyYXkgZGlzcGxheSwgZm9yIGluc3RhbmNlLCBJbWFnZVZpZXdzLAogICogb3IgdG8gaGF2ZSBzb21lIG9mIGRhdGEgYmVzaWRlcyB0b1N0cmluZygpIHJlc3VsdHMgZmlsbCB0aGUgdmlld3MsCiAgKiBvdmVycmlkZSB7QGxpbmsgI2dldFZpZXcoaW50LCBWaWV3LCBWaWV3R3JvdXApfSB0byByZXR1cm4gdGhlIHR5cGUgb2YgdmlldyB5b3Ugd2FudC4KICAqLwpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L0F1dG9Db21wbGV0ZVRleHRWaWV3LmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvQXV0b0NvbXBsZXRlVGV4dFZpZXcuamF2YQppbmRleCAzOTcxNDg3Li5lMDdiZWZhIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvQXV0b0NvbXBsZXRlVGV4dFZpZXcuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvQXV0b0NvbXBsZXRlVGV4dFZpZXcuamF2YQpAQCAtMjksMTMgKzI5LDEyIEBACiBpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKIGltcG9ydCBhbmRyb2lkLnZpZXcuS2V5RXZlbnQ7CiBpbXBvcnQgYW5kcm9pZC52aWV3LkxheW91dEluZmxhdGVyOwotaW1wb3J0IGFuZHJvaWQudmlldy5Nb3Rpb25FdmVudDsKIGltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKIGltcG9ydCBhbmRyb2lkLnZpZXcuVmlld0dyb3VwOwogaW1wb3J0IGFuZHJvaWQudmlldy5XaW5kb3dNYW5hZ2VyOwogaW1wb3J0IGFuZHJvaWQudmlldy5pbnB1dG1ldGhvZC5Db21wbGV0aW9uSW5mbzsKLWltcG9ydCBhbmRyb2lkLnZpZXcuaW5wdXRtZXRob2QuSW5wdXRNZXRob2RNYW5hZ2VyOwogaW1wb3J0IGFuZHJvaWQudmlldy5pbnB1dG1ldGhvZC5FZGl0b3JJbmZvOworaW1wb3J0IGFuZHJvaWQudmlldy5pbnB1dG1ldGhvZC5JbnB1dE1ldGhvZE1hbmFnZXI7CiAKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC5SOwogCkBAIC05Myw0NSArOTIsMjEgQEAKICAgICBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVRyA9IGZhbHNlOwogICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIkF1dG9Db21wbGV0ZVRleHRWaWV3IjsKIAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBISU5UX1ZJRVdfSUQgPSAweDE3OwotCi0gICAgLyoqCi0gICAgICogVGhpcyB2YWx1ZSBjb250cm9scyB0aGUgbGVuZ3RoIG9mIHRpbWUgdGhhdCB0aGUgdXNlcgotICAgICAqIG11c3QgbGVhdmUgYSBwb2ludGVyIGRvd24gd2l0aG91dCBzY3JvbGxpbmcgdG8gZXhwYW5kCi0gICAgICogdGhlIGF1dG9jb21wbGV0ZSBkcm9wZG93biBsaXN0IHRvIGNvdmVyIHRoZSBJTUUuCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEVYUEFORF9MSVNUX1RJTUVPVVQgPSAyNTA7Ci0KICAgICBwcml2YXRlIENoYXJTZXF1ZW5jZSBtSGludFRleHQ7CisgICAgcHJpdmF0ZSBUZXh0VmlldyBtSGludFZpZXc7CiAgICAgcHJpdmF0ZSBpbnQgbUhpbnRSZXNvdXJjZTsKIAogICAgIHByaXZhdGUgTGlzdEFkYXB0ZXIgbUFkYXB0ZXI7CiAgICAgcHJpdmF0ZSBGaWx0ZXIgbUZpbHRlcjsKICAgICBwcml2YXRlIGludCBtVGhyZXNob2xkOwogCi0gICAgcHJpdmF0ZSBQb3B1cFdpbmRvdyBtUG9wdXA7Ci0gICAgcHJpdmF0ZSBEcm9wRG93bkxpc3RWaWV3IG1Ecm9wRG93bkxpc3Q7Ci0gICAgcHJpdmF0ZSBpbnQgbURyb3BEb3duVmVydGljYWxPZmZzZXQ7Ci0gICAgcHJpdmF0ZSBpbnQgbURyb3BEb3duSG9yaXpvbnRhbE9mZnNldDsKKyAgICBwcml2YXRlIExpc3RQb3B1cFdpbmRvdyBtUG9wdXA7CiAgICAgcHJpdmF0ZSBpbnQgbURyb3BEb3duQW5jaG9ySWQ7Ci0gICAgcHJpdmF0ZSBWaWV3IG1Ecm9wRG93bkFuY2hvclZpZXc7ICAvLyB2aWV3IGlzIHJldHJpZXZlZCBsYXppbHkgZnJvbSBpZCBvbmNlIG5lZWRlZAotICAgIHByaXZhdGUgaW50IG1Ecm9wRG93bldpZHRoOwotICAgIHByaXZhdGUgaW50IG1Ecm9wRG93bkhlaWdodDsKLSAgICBwcml2YXRlIGZpbmFsIFJlY3QgbVRlbXBSZWN0ID0gbmV3IFJlY3QoKTsKLQotICAgIHByaXZhdGUgRHJhd2FibGUgbURyb3BEb3duTGlzdEhpZ2hsaWdodDsKIAogICAgIHByaXZhdGUgQWRhcHRlclZpZXcuT25JdGVtQ2xpY2tMaXN0ZW5lciBtSXRlbUNsaWNrTGlzdGVuZXI7CiAgICAgcHJpdmF0ZSBBZGFwdGVyVmlldy5Pbkl0ZW1TZWxlY3RlZExpc3RlbmVyIG1JdGVtU2VsZWN0ZWRMaXN0ZW5lcjsKIAotICAgIHByaXZhdGUgZmluYWwgRHJvcERvd25JdGVtQ2xpY2tMaXN0ZW5lciBtRHJvcERvd25JdGVtQ2xpY2tMaXN0ZW5lciA9Ci0gICAgICAgICAgICBuZXcgRHJvcERvd25JdGVtQ2xpY2tMaXN0ZW5lcigpOwotCi0gICAgcHJpdmF0ZSBib29sZWFuIG1Ecm9wRG93bkFsd2F5c1Zpc2libGUgPSBmYWxzZTsKLQogICAgIHByaXZhdGUgYm9vbGVhbiBtRHJvcERvd25EaXNtaXNzZWRPbkNvbXBsZXRpb24gPSB0cnVlOwotICAgIAotICAgIHByaXZhdGUgYm9vbGVhbiBtRm9yY2VJZ25vcmVPdXRzaWRlVG91Y2ggPSBmYWxzZTsKIAogICAgIHByaXZhdGUgaW50IG1MYXN0S2V5Q29kZSA9IEtleUV2ZW50LktFWUNPREVfVU5LTk9XTjsKICAgICBwcml2YXRlIGJvb2xlYW4gbU9wZW5CZWZvcmU7CkBAIC0xNDAsMTAgKzExNSw2IEBACiAKICAgICBwcml2YXRlIGJvb2xlYW4gbUJsb2NrQ29tcGxldGlvbjsKIAotICAgIHByaXZhdGUgTGlzdFNlbGVjdG9ySGlkZXIgbUhpZGVTZWxlY3RvcjsKLSAgICBwcml2YXRlIFJ1bm5hYmxlIG1TaG93RHJvcERvd25SdW5uYWJsZTsKLSAgICBwcml2YXRlIFJ1bm5hYmxlIG1SZXNpemVQb3B1cFJ1bm5hYmxlID0gbmV3IFJlc2l6ZVBvcHVwUnVubmFibGUoKTsKLQogICAgIHByaXZhdGUgUGFzc1Rocm91Z2hDbGlja0xpc3RlbmVyIG1QYXNzVGhyb3VnaENsaWNrTGlzdGVuZXI7CiAgICAgcHJpdmF0ZSBQb3B1cERhdGFTZXRPYnNlcnZlciBtT2JzZXJ2ZXI7CiAKQEAgLTE1OCw5ICsxMjksMTAgQEAKICAgICBwdWJsaWMgQXV0b0NvbXBsZXRlVGV4dFZpZXcoQ29udGV4dCBjb250ZXh0LCBBdHRyaWJ1dGVTZXQgYXR0cnMsIGludCBkZWZTdHlsZSkgewogICAgICAgICBzdXBlcihjb250ZXh0LCBhdHRycywgZGVmU3R5bGUpOwogCi0gICAgICAgIG1Qb3B1cCA9IG5ldyBQb3B1cFdpbmRvdyhjb250ZXh0LCBhdHRycywKKyAgICAgICAgbVBvcHVwID0gbmV3IExpc3RQb3B1cFdpbmRvdyhjb250ZXh0LCBhdHRycywKICAgICAgICAgICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmF0dHIuYXV0b0NvbXBsZXRlVGV4dFZpZXdTdHlsZSk7CiAgICAgICAgIG1Qb3B1cC5zZXRTb2Z0SW5wdXRNb2RlKFdpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zLlNPRlRfSU5QVVRfQURKVVNUX1JFU0laRSk7CisgICAgICAgIG1Qb3B1cC5zZXRQcm9tcHRQb3NpdGlvbihMaXN0UG9wdXBXaW5kb3cuUE9TSVRJT05fUFJPTVBUX0JFTE9XKTsKIAogICAgICAgICBUeXBlZEFycmF5IGEgPQogICAgICAgICAgICAgY29udGV4dC5vYnRhaW5TdHlsZWRBdHRyaWJ1dGVzKApAQCAtMTY5LDE0ICsxNDEsMTEgQEAKICAgICAgICAgbVRocmVzaG9sZCA9IGEuZ2V0SW50KAogICAgICAgICAgICAgICAgIFIuc3R5bGVhYmxlLkF1dG9Db21wbGV0ZVRleHRWaWV3X2NvbXBsZXRpb25UaHJlc2hvbGQsIDIpOwogCi0gICAgICAgIG1IaW50VGV4dCA9IGEuZ2V0VGV4dChSLnN0eWxlYWJsZS5BdXRvQ29tcGxldGVUZXh0Vmlld19jb21wbGV0aW9uSGludCk7Ci0KLSAgICAgICAgbURyb3BEb3duTGlzdEhpZ2hsaWdodCA9IGEuZ2V0RHJhd2FibGUoCi0gICAgICAgICAgICAgICAgUi5zdHlsZWFibGUuQXV0b0NvbXBsZXRlVGV4dFZpZXdfZHJvcERvd25TZWxlY3Rvcik7Ci0gICAgICAgIG1Ecm9wRG93blZlcnRpY2FsT2Zmc2V0ID0gKGludCkKLSAgICAgICAgICAgICAgICBhLmdldERpbWVuc2lvbihSLnN0eWxlYWJsZS5BdXRvQ29tcGxldGVUZXh0Vmlld19kcm9wRG93blZlcnRpY2FsT2Zmc2V0LCAwLjBmKTsKLSAgICAgICAgbURyb3BEb3duSG9yaXpvbnRhbE9mZnNldCA9IChpbnQpCi0gICAgICAgICAgICAgICAgYS5nZXREaW1lbnNpb24oUi5zdHlsZWFibGUuQXV0b0NvbXBsZXRlVGV4dFZpZXdfZHJvcERvd25Ib3Jpem9udGFsT2Zmc2V0LCAwLjBmKTsKKyAgICAgICAgbVBvcHVwLnNldExpc3RTZWxlY3RvcihhLmdldERyYXdhYmxlKFIuc3R5bGVhYmxlLkF1dG9Db21wbGV0ZVRleHRWaWV3X2Ryb3BEb3duU2VsZWN0b3IpKTsKKyAgICAgICAgbVBvcHVwLnNldFZlcnRpY2FsT2Zmc2V0KChpbnQpCisgICAgICAgICAgICAgICAgYS5nZXREaW1lbnNpb24oUi5zdHlsZWFibGUuQXV0b0NvbXBsZXRlVGV4dFZpZXdfZHJvcERvd25WZXJ0aWNhbE9mZnNldCwgMC4wZikpOworICAgICAgICBtUG9wdXAuc2V0SG9yaXpvbnRhbE9mZnNldCgoaW50KQorICAgICAgICAgICAgICAgIGEuZ2V0RGltZW5zaW9uKFIuc3R5bGVhYmxlLkF1dG9Db21wbGV0ZVRleHRWaWV3X2Ryb3BEb3duSG9yaXpvbnRhbE9mZnNldCwgMC4wZikpOwogICAgICAgICAKICAgICAgICAgLy8gR2V0IHRoZSBhbmNob3IncyBpZCBub3csIGJ1dCB0aGUgdmlldyB3b24ndCBiZSByZWFkeSwgc28gd2FpdCB0byBhY3R1YWxseSBnZXQgdGhlCiAgICAgICAgIC8vIHZpZXcgYW5kIHN0b3JlIGl0IGluIG1Ecm9wRG93bkFuY2hvclZpZXcgbGF6aWx5IGluIGdldERyb3BEb3duQW5jaG9yVmlldyBsYXRlci4KQEAgLTE4NywxMyArMTU2LDE4IEBACiAgICAgICAgIAogICAgICAgICAvLyBGb3IgZHJvcGRvd24gd2lkdGgsIHRoZSBkZXZlbG9wZXIgY2FuIHNwZWNpZnkgYSBzcGVjaWZpYyB3aWR0aCwgb3IgTUFUQ0hfUEFSRU5UCiAgICAgICAgIC8vIChmb3IgZnVsbCBzY3JlZW4gd2lkdGgpIG9yIFdSQVBfQ09OVEVOVCAodG8gbWF0Y2ggdGhlIHdpZHRoIG9mIHRoZSBhbmNob3JlZCB2aWV3KS4KLSAgICAgICAgbURyb3BEb3duV2lkdGggPSBhLmdldExheW91dERpbWVuc2lvbihSLnN0eWxlYWJsZS5BdXRvQ29tcGxldGVUZXh0Vmlld19kcm9wRG93bldpZHRoLAotICAgICAgICAgICAgICAgIFZpZXdHcm91cC5MYXlvdXRQYXJhbXMuV1JBUF9DT05URU5UKTsKLSAgICAgICAgbURyb3BEb3duSGVpZ2h0ID0gYS5nZXRMYXlvdXREaW1lbnNpb24oUi5zdHlsZWFibGUuQXV0b0NvbXBsZXRlVGV4dFZpZXdfZHJvcERvd25IZWlnaHQsCi0gICAgICAgICAgICAgICAgVmlld0dyb3VwLkxheW91dFBhcmFtcy5XUkFQX0NPTlRFTlQpOworICAgICAgICBtUG9wdXAuc2V0V2lkdGgoYS5nZXRMYXlvdXREaW1lbnNpb24oCisgICAgICAgICAgICAgICAgUi5zdHlsZWFibGUuQXV0b0NvbXBsZXRlVGV4dFZpZXdfZHJvcERvd25XaWR0aCwKKyAgICAgICAgICAgICAgICBWaWV3R3JvdXAuTGF5b3V0UGFyYW1zLldSQVBfQ09OVEVOVCkpOworICAgICAgICBtUG9wdXAuc2V0SGVpZ2h0KGEuZ2V0TGF5b3V0RGltZW5zaW9uKAorICAgICAgICAgICAgICAgIFIuc3R5bGVhYmxlLkF1dG9Db21wbGV0ZVRleHRWaWV3X2Ryb3BEb3duSGVpZ2h0LAorICAgICAgICAgICAgICAgIFZpZXdHcm91cC5MYXlvdXRQYXJhbXMuV1JBUF9DT05URU5UKSk7CiAKICAgICAgICAgbUhpbnRSZXNvdXJjZSA9IGEuZ2V0UmVzb3VyY2VJZChSLnN0eWxlYWJsZS5BdXRvQ29tcGxldGVUZXh0Vmlld19jb21wbGV0aW9uSGludFZpZXcsCiAgICAgICAgICAgICAgICAgUi5sYXlvdXQuc2ltcGxlX2Ryb3Bkb3duX2hpbnQpOworICAgICAgICAKKyAgICAgICAgbVBvcHVwLnNldE9uSXRlbUNsaWNrTGlzdGVuZXIobmV3IERyb3BEb3duSXRlbUNsaWNrTGlzdGVuZXIoKSk7CisgICAgICAgIHNldENvbXBsZXRpb25IaW50KGEuZ2V0VGV4dChSLnN0eWxlYWJsZS5BdXRvQ29tcGxldGVUZXh0Vmlld19jb21wbGV0aW9uSGludCkpOwogCiAgICAgICAgIC8vIEFsd2F5cyB0dXJuIG9uIHRoZSBhdXRvIGNvbXBsZXRlIGlucHV0IHR5cGUgZmxhZywgc2luY2UgaXQKICAgICAgICAgLy8gbWFrZXMgbm8gc2Vuc2UgdG8gdXNlIHRoaXMgd2lkZ2V0IHdpdGhvdXQgaXQuCkBAIC0yNDEsNiArMjE1LDIwIEBACiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0Q29tcGxldGlvbkhpbnQoQ2hhclNlcXVlbmNlIGhpbnQpIHsKICAgICAgICAgbUhpbnRUZXh0ID0gaGludDsKKyAgICAgICAgaWYgKGhpbnQgIT0gbnVsbCkgeworICAgICAgICAgICAgaWYgKG1IaW50VmlldyA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgZmluYWwgVGV4dFZpZXcgaGludFZpZXcgPSAoVGV4dFZpZXcpIExheW91dEluZmxhdGVyLmZyb20oZ2V0Q29udGV4dCgpKS5pbmZsYXRlKAorICAgICAgICAgICAgICAgICAgICAgICAgbUhpbnRSZXNvdXJjZSwgbnVsbCkuZmluZFZpZXdCeUlkKGNvbS5hbmRyb2lkLmludGVybmFsLlIuaWQudGV4dDEpOworICAgICAgICAgICAgICAgIGhpbnRWaWV3LnNldFRleHQobUhpbnRUZXh0KTsKKyAgICAgICAgICAgICAgICBtSGludFZpZXcgPSBoaW50VmlldzsKKyAgICAgICAgICAgICAgICBtUG9wdXAuc2V0UHJvbXB0VmlldyhoaW50Vmlldyk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG1IaW50Vmlldy5zZXRUZXh0KGhpbnQpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbVBvcHVwLnNldFByb21wdFZpZXcobnVsbCk7CisgICAgICAgICAgICBtSGludFZpZXcgPSBudWxsOworICAgICAgICB9CiAgICAgfQogICAgIAogICAgIC8qKgpAQCAtMjUzLDcgKzI0MSw3IEBACiAgICAgICogQGF0dHIgcmVmIGFuZHJvaWQuUi5zdHlsZWFibGUjQXV0b0NvbXBsZXRlVGV4dFZpZXdfZHJvcERvd25XaWR0aAogICAgICAqLwogICAgIHB1YmxpYyBpbnQgZ2V0RHJvcERvd25XaWR0aCgpIHsKLSAgICAgICAgcmV0dXJuIG1Ecm9wRG93bldpZHRoOworICAgICAgICByZXR1cm4gbVBvcHVwLmdldFdpZHRoKCk7CiAgICAgfQogICAgIAogICAgIC8qKgpAQCAtMjY2LDcgKzI1NCw3IEBACiAgICAgICogQGF0dHIgcmVmIGFuZHJvaWQuUi5zdHlsZWFibGUjQXV0b0NvbXBsZXRlVGV4dFZpZXdfZHJvcERvd25XaWR0aAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldERyb3BEb3duV2lkdGgoaW50IHdpZHRoKSB7Ci0gICAgICAgIG1Ecm9wRG93bldpZHRoID0gd2lkdGg7CisgICAgICAgIG1Qb3B1cC5zZXRXaWR0aCh3aWR0aCk7CiAgICAgfQogCiAgICAgLyoqCkBAIC0yODAsNyArMjY4LDcgQEAKICAgICAgKiBAYXR0ciByZWYgYW5kcm9pZC5SLnN0eWxlYWJsZSNBdXRvQ29tcGxldGVUZXh0Vmlld19kcm9wRG93bkhlaWdodAogICAgICAqLwogICAgIHB1YmxpYyBpbnQgZ2V0RHJvcERvd25IZWlnaHQoKSB7Ci0gICAgICAgIHJldHVybiBtRHJvcERvd25IZWlnaHQ7CisgICAgICAgIHJldHVybiBtUG9wdXAuZ2V0SGVpZ2h0KCk7CiAgICAgfQogCiAgICAgLyoqCkBAIC0yOTQsNyArMjgyLDcgQEAKICAgICAgKiBAYXR0ciByZWYgYW5kcm9pZC5SLnN0eWxlYWJsZSNBdXRvQ29tcGxldGVUZXh0Vmlld19kcm9wRG93bkhlaWdodAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldERyb3BEb3duSGVpZ2h0KGludCBoZWlnaHQpIHsKLSAgICAgICAgbURyb3BEb3duSGVpZ2h0ID0gaGVpZ2h0OworICAgICAgICBtUG9wdXAuc2V0SGVpZ2h0KGhlaWdodCk7CiAgICAgfQogICAgIAogICAgIC8qKgpAQCAtMzE5LDcgKzMwNyw3IEBACiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0RHJvcERvd25BbmNob3IoaW50IGlkKSB7CiAgICAgICAgIG1Ecm9wRG93bkFuY2hvcklkID0gaWQ7Ci0gICAgICAgIG1Ecm9wRG93bkFuY2hvclZpZXcgPSBudWxsOworICAgICAgICBtUG9wdXAuc2V0QW5jaG9yVmlldyhudWxsKTsKICAgICB9CiAgICAgCiAgICAgLyoqCkBAIC0zNjEsNyArMzQ5LDcgQEAKICAgICAgKiBAcGFyYW0gb2Zmc2V0IHRoZSB2ZXJ0aWNhbCBvZmZzZXQKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXREcm9wRG93blZlcnRpY2FsT2Zmc2V0KGludCBvZmZzZXQpIHsKLSAgICAgICAgbURyb3BEb3duVmVydGljYWxPZmZzZXQgPSBvZmZzZXQ7CisgICAgICAgIG1Qb3B1cC5zZXRWZXJ0aWNhbE9mZnNldChvZmZzZXQpOwogICAgIH0KICAgICAKICAgICAvKioKQEAgLTM3MCw3ICszNTgsNyBAQAogICAgICAqIEByZXR1cm4gdGhlIHZlcnRpY2FsIG9mZnNldAogICAgICAqLwogICAgIHB1YmxpYyBpbnQgZ2V0RHJvcERvd25WZXJ0aWNhbE9mZnNldCgpIHsKLSAgICAgICAgcmV0dXJuIG1Ecm9wRG93blZlcnRpY2FsT2Zmc2V0OworICAgICAgICByZXR1cm4gbVBvcHVwLmdldFZlcnRpY2FsT2Zmc2V0KCk7CiAgICAgfQogICAgIAogICAgIC8qKgpAQCAtMzc5LDcgKzM2Nyw3IEBACiAgICAgICogQHBhcmFtIG9mZnNldCB0aGUgaG9yaXpvbnRhbCBvZmZzZXQKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXREcm9wRG93bkhvcml6b250YWxPZmZzZXQoaW50IG9mZnNldCkgewotICAgICAgICBtRHJvcERvd25Ib3Jpem9udGFsT2Zmc2V0ID0gb2Zmc2V0OworICAgICAgICBtUG9wdXAuc2V0SG9yaXpvbnRhbE9mZnNldChvZmZzZXQpOwogICAgIH0KICAgICAKICAgICAvKioKQEAgLTM4OCw3ICszNzYsNyBAQAogICAgICAqIEByZXR1cm4gdGhlIGhvcml6b250YWwgb2Zmc2V0CiAgICAgICovCiAgICAgcHVibGljIGludCBnZXREcm9wRG93bkhvcml6b250YWxPZmZzZXQoKSB7Ci0gICAgICAgIHJldHVybiBtRHJvcERvd25Ib3Jpem9udGFsT2Zmc2V0OworICAgICAgICByZXR1cm4gbVBvcHVwLmdldEhvcml6b250YWxPZmZzZXQoKTsKICAgICB9CiAKICAgICAgLyoqCkBAIC00MjUsNyArNDEzLDcgQEAKICAgICAgKiBAaGlkZSBQZW5kaW5nIEFQSSBjb3VuY2lsIGFwcHJvdmFsCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gaXNEcm9wRG93bkFsd2F5c1Zpc2libGUoKSB7Ci0gICAgICAgIHJldHVybiBtRHJvcERvd25BbHdheXNWaXNpYmxlOworICAgICAgICByZXR1cm4gbVBvcHVwLmlzRHJvcERvd25BbHdheXNWaXNpYmxlKCk7CiAgICAgfQogCiAgICAgLyoqCkBAIC00NDIsNyArNDMwLDcgQEAKICAgICAgKiBAaGlkZSBQZW5kaW5nIEFQSSBjb3VuY2lsIGFwcHJvdmFsCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0RHJvcERvd25BbHdheXNWaXNpYmxlKGJvb2xlYW4gZHJvcERvd25BbHdheXNWaXNpYmxlKSB7Ci0gICAgICAgIG1Ecm9wRG93bkFsd2F5c1Zpc2libGUgPSBkcm9wRG93bkFsd2F5c1Zpc2libGU7CisgICAgICAgIG1Qb3B1cC5zZXREcm9wRG93bkFsd2F5c1Zpc2libGUoZHJvcERvd25BbHdheXNWaXNpYmxlKTsKICAgICB9CiAgICAKICAgICAvKioKQEAgLTYwOSwxNSArNTk3LDEzIEBACiAgICAgICAgICAgICBtRmlsdGVyID0gbnVsbDsKICAgICAgICAgfQogCi0gICAgICAgIGlmIChtRHJvcERvd25MaXN0ICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1Ecm9wRG93bkxpc3Quc2V0QWRhcHRlcihtQWRhcHRlcik7Ci0gICAgICAgIH0KKyAgICAgICAgbVBvcHVwLnNldEFkYXB0ZXIobUFkYXB0ZXIpOwogICAgIH0KIAogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBib29sZWFuIG9uS2V5UHJlSW1lKGludCBrZXlDb2RlLCBLZXlFdmVudCBldmVudCkgewogICAgICAgICBpZiAoa2V5Q29kZSA9PSBLZXlFdmVudC5LRVlDT0RFX0JBQ0sgJiYgaXNQb3B1cFNob3dpbmcoKQotICAgICAgICAgICAgICAgICYmICFtRHJvcERvd25BbHdheXNWaXNpYmxlKSB7CisgICAgICAgICAgICAgICAgJiYgIW1Qb3B1cC5pc0Ryb3BEb3duQWx3YXlzVmlzaWJsZSgpKSB7CiAgICAgICAgICAgICAvLyBzcGVjaWFsIGNhc2UgZm9yIHRoZSBiYWNrIGtleSwgd2UgZG8gbm90IGV2ZW4gdHJ5IHRvIHNlbmQgaXQKICAgICAgICAgICAgIC8vIHRvIHRoZSBkcm9wIGRvd24gbGlzdCBidXQgaW5zdGVhZCwgY29uc3VtZSBpdCBpbW1lZGlhdGVseQogICAgICAgICAgICAgaWYgKGV2ZW50LmdldEFjdGlvbigpID09IEtleUV2ZW50LkFDVElPTl9ET1dOICYmIGV2ZW50LmdldFJlcGVhdENvdW50KCkgPT0gMCkgewpAQCAtNjM2LDE4ICs2MjIsMTYgQEAKIAogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBib29sZWFuIG9uS2V5VXAoaW50IGtleUNvZGUsIEtleUV2ZW50IGV2ZW50KSB7Ci0gICAgICAgIGlmIChpc1BvcHVwU2hvd2luZygpICYmIG1Ecm9wRG93bkxpc3QuZ2V0U2VsZWN0ZWRJdGVtUG9zaXRpb24oKSA+PSAwKSB7Ci0gICAgICAgICAgICBib29sZWFuIGNvbnN1bWVkID0gbURyb3BEb3duTGlzdC5vbktleVVwKGtleUNvZGUsIGV2ZW50KTsKLSAgICAgICAgICAgIGlmIChjb25zdW1lZCkgewotICAgICAgICAgICAgICAgIHN3aXRjaCAoa2V5Q29kZSkgewotICAgICAgICAgICAgICAgICAgICAvLyBpZiB0aGUgbGlzdCBhY2NlcHRzIHRoZSBrZXkgZXZlbnRzIGFuZCB0aGUga2V5IGV2ZW50Ci0gICAgICAgICAgICAgICAgICAgIC8vIHdhcyBhIGNsaWNrLCB0aGUgdGV4dCB2aWV3IGdldHMgdGhlIHNlbGVjdGVkIGl0ZW0KLSAgICAgICAgICAgICAgICAgICAgLy8gZnJvbSB0aGUgZHJvcCBkb3duIGFzIGl0cyBjb250ZW50Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgS2V5RXZlbnQuS0VZQ09ERV9FTlRFUjoKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBLZXlFdmVudC5LRVlDT0RFX0RQQURfQ0VOVEVSOgotICAgICAgICAgICAgICAgICAgICAgICAgcGVyZm9ybUNvbXBsZXRpb24oKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICAgIH0KKyAgICAgICAgYm9vbGVhbiBjb25zdW1lZCA9IG1Qb3B1cC5vbktleVVwKGtleUNvZGUsIGV2ZW50KTsKKyAgICAgICAgaWYgKGNvbnN1bWVkKSB7CisgICAgICAgICAgICBzd2l0Y2ggKGtleUNvZGUpIHsKKyAgICAgICAgICAgIC8vIGlmIHRoZSBsaXN0IGFjY2VwdHMgdGhlIGtleSBldmVudHMgYW5kIHRoZSBrZXkgZXZlbnQKKyAgICAgICAgICAgIC8vIHdhcyBhIGNsaWNrLCB0aGUgdGV4dCB2aWV3IGdldHMgdGhlIHNlbGVjdGVkIGl0ZW0KKyAgICAgICAgICAgIC8vIGZyb20gdGhlIGRyb3AgZG93biBhcyBpdHMgY29udGVudAorICAgICAgICAgICAgY2FzZSBLZXlFdmVudC5LRVlDT0RFX0VOVEVSOgorICAgICAgICAgICAgY2FzZSBLZXlFdmVudC5LRVlDT0RFX0RQQURfQ0VOVEVSOgorICAgICAgICAgICAgICAgIHBlcmZvcm1Db21wbGV0aW9uKCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIHN1cGVyLm9uS2V5VXAoa2V5Q29kZSwgZXZlbnQpOwpAQCAtNjU1LDg3ICs2MzksMTEgQEAKIAogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBib29sZWFuIG9uS2V5RG93bihpbnQga2V5Q29kZSwgS2V5RXZlbnQgZXZlbnQpIHsKLSAgICAgICAgLy8gd2hlbiB0aGUgZHJvcCBkb3duIGlzIHNob3duLCB3ZSBkcml2ZSBpdCBkaXJlY3RseQotICAgICAgICBpZiAoaXNQb3B1cFNob3dpbmcoKSkgewotICAgICAgICAgICAgLy8gdGhlIGtleSBldmVudHMgYXJlIGZvcndhcmRlZCB0byB0aGUgbGlzdCBpbiB0aGUgZHJvcCBkb3duIHZpZXcKLSAgICAgICAgICAgIC8vIG5vdGUgdGhhdCBMaXN0VmlldyBoYW5kbGVzIHNwYWNlIGJ1dCB3ZSBkb24ndCB3YW50IHRoYXQgdG8gaGFwcGVuCi0gICAgICAgICAgICAvLyBhbHNvIGlmIHNlbGVjdGlvbiBpcyBub3QgY3VycmVudGx5IGluIHRoZSBkcm9wIGRvd24sIHRoZW4gZG9uJ3QKLSAgICAgICAgICAgIC8vIGxldCBjZW50ZXIgb3IgZW50ZXIgcHJlc3NlcyBnbyB0aGVyZSBzaW5jZSB0aGF0IHdvdWxkIGNhdXNlIGl0Ci0gICAgICAgICAgICAvLyB0byBzZWxlY3Qgb25lIG9mIGl0cyBpdGVtcwotICAgICAgICAgICAgaWYgKGtleUNvZGUgIT0gS2V5RXZlbnQuS0VZQ09ERV9TUEFDRQotICAgICAgICAgICAgICAgICAgICAmJiAobURyb3BEb3duTGlzdC5nZXRTZWxlY3RlZEl0ZW1Qb3NpdGlvbigpID49IDAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoa2V5Q29kZSAhPSBLZXlFdmVudC5LRVlDT0RFX0VOVEVSCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBrZXlDb2RlICE9IEtleUV2ZW50LktFWUNPREVfRFBBRF9DRU5URVIpKSkgewotICAgICAgICAgICAgICAgIGludCBjdXJJbmRleCA9IG1Ecm9wRG93bkxpc3QuZ2V0U2VsZWN0ZWRJdGVtUG9zaXRpb24oKTsKLSAgICAgICAgICAgICAgICBib29sZWFuIGNvbnN1bWVkOwotCi0gICAgICAgICAgICAgICAgZmluYWwgYm9vbGVhbiBiZWxvdyA9ICFtUG9wdXAuaXNBYm92ZUFuY2hvcigpOwotCi0gICAgICAgICAgICAgICAgZmluYWwgTGlzdEFkYXB0ZXIgYWRhcHRlciA9IG1BZGFwdGVyOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGJvb2xlYW4gYWxsRW5hYmxlZDsKLSAgICAgICAgICAgICAgICBpbnQgZmlyc3RJdGVtID0gSW50ZWdlci5NQVhfVkFMVUU7Ci0gICAgICAgICAgICAgICAgaW50IGxhc3RJdGVtID0gSW50ZWdlci5NSU5fVkFMVUU7Ci0KLSAgICAgICAgICAgICAgICBpZiAoYWRhcHRlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGFsbEVuYWJsZWQgPSBhZGFwdGVyLmFyZUFsbEl0ZW1zRW5hYmxlZCgpOwotICAgICAgICAgICAgICAgICAgICBmaXJzdEl0ZW0gPSBhbGxFbmFibGVkID8gMCA6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbURyb3BEb3duTGlzdC5sb29rRm9yU2VsZWN0YWJsZVBvc2l0aW9uKDAsIHRydWUpOwotICAgICAgICAgICAgICAgICAgICBsYXN0SXRlbSA9IGFsbEVuYWJsZWQgPyBhZGFwdGVyLmdldENvdW50KCkgLSAxIDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtRHJvcERvd25MaXN0Lmxvb2tGb3JTZWxlY3RhYmxlUG9zaXRpb24oYWRhcHRlci5nZXRDb3VudCgpIC0gMSwgZmFsc2UpOyAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGlmICgoYmVsb3cgJiYga2V5Q29kZSA9PSBLZXlFdmVudC5LRVlDT0RFX0RQQURfVVAgJiYgY3VySW5kZXggPD0gZmlyc3RJdGVtKSB8fAotICAgICAgICAgICAgICAgICAgICAgICAgKCFiZWxvdyAmJiBrZXlDb2RlID09IEtleUV2ZW50LktFWUNPREVfRFBBRF9ET1dOICYmIGN1ckluZGV4ID49IGxhc3RJdGVtKSkgewotICAgICAgICAgICAgICAgICAgICAvLyBXaGVuIHRoZSBzZWxlY3Rpb24gaXMgYXQgdGhlIHRvcCwgd2UgYmxvY2sgdGhlIGtleQotICAgICAgICAgICAgICAgICAgICAvLyBldmVudCB0byBwcmV2ZW50IGZvY3VzIGZyb20gbW92aW5nLgotICAgICAgICAgICAgICAgICAgICBjbGVhckxpc3RTZWxlY3Rpb24oKTsKLSAgICAgICAgICAgICAgICAgICAgbVBvcHVwLnNldElucHV0TWV0aG9kTW9kZShQb3B1cFdpbmRvdy5JTlBVVF9NRVRIT0RfTkVFREVEKTsKLSAgICAgICAgICAgICAgICAgICAgc2hvd0Ryb3BEb3duKCk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIFdBUk5JTkc6IFBsZWFzZSByZWFkIHRoZSBjb21tZW50IHdoZXJlIG1MaXN0U2VsZWN0aW9uSGlkZGVuCi0gICAgICAgICAgICAgICAgICAgIC8vICAgICAgICAgIGlzIGRlY2xhcmVkCi0gICAgICAgICAgICAgICAgICAgIG1Ecm9wRG93bkxpc3QubUxpc3RTZWxlY3Rpb25IaWRkZW4gPSBmYWxzZTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBjb25zdW1lZCA9IG1Ecm9wRG93bkxpc3Qub25LZXlEb3duKGtleUNvZGUsIGV2ZW50KTsKLSAgICAgICAgICAgICAgICBpZiAoREVCVUcpIExvZy52KFRBRywgIktleSBkb3duOiBjb2RlPSIgKyBrZXlDb2RlICsgIiBsaXN0IGNvbnN1bWVkPSIgKyBjb25zdW1lZCk7Ci0KLSAgICAgICAgICAgICAgICBpZiAoY29uc3VtZWQpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gSWYgaXQgaGFuZGxlZCB0aGUga2V5IGV2ZW50LCB0aGVuIHRoZSB1c2VyIGlzCi0gICAgICAgICAgICAgICAgICAgIC8vIG5hdmlnYXRpbmcgaW4gdGhlIGxpc3QsIHNvIHdlIHNob3VsZCBwdXQgaXQgaW4gZnJvbnQuCi0gICAgICAgICAgICAgICAgICAgIG1Qb3B1cC5zZXRJbnB1dE1ldGhvZE1vZGUoUG9wdXBXaW5kb3cuSU5QVVRfTUVUSE9EX05PVF9ORUVERUQpOwotICAgICAgICAgICAgICAgICAgICAvLyBIZXJlJ3MgYSBsaXR0bGUgdHJpY2sgd2UgbmVlZCB0byBkbyB0byBtYWtlIHN1cmUgdGhhdAotICAgICAgICAgICAgICAgICAgICAvLyB0aGUgbGlzdCB2aWV3IGlzIGFjdHVhbGx5IHNob3dpbmcgaXRzIGZvY3VzIGluZGljYXRvciwKLSAgICAgICAgICAgICAgICAgICAgLy8gYnkgZW5zdXJpbmcgaXQgaGFzIGZvY3VzIGFuZCBnZXR0aW5nIGl0cyB3aW5kb3cgb3V0Ci0gICAgICAgICAgICAgICAgICAgIC8vIG9mIHRvdWNoIG1vZGUuCi0gICAgICAgICAgICAgICAgICAgIG1Ecm9wRG93bkxpc3QucmVxdWVzdEZvY3VzRnJvbVRvdWNoKCk7Ci0gICAgICAgICAgICAgICAgICAgIHNob3dEcm9wRG93bigpOwotCi0gICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoa2V5Q29kZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gYXZvaWQgcGFzc2luZyB0aGUgZm9jdXMgZnJvbSB0aGUgdGV4dCB2aWV3IHRvIHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgLy8gbmV4dCBjb21wb25lbnQKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgS2V5RXZlbnQuS0VZQ09ERV9FTlRFUjoKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgS2V5RXZlbnQuS0VZQ09ERV9EUEFEX0NFTlRFUjoKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgS2V5RXZlbnQuS0VZQ09ERV9EUEFEX0RPV046Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEtleUV2ZW50LktFWUNPREVfRFBBRF9VUDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChiZWxvdyAmJiBrZXlDb2RlID09IEtleUV2ZW50LktFWUNPREVfRFBBRF9ET1dOKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyB3aGVuIHRoZSBzZWxlY3Rpb24gaXMgYXQgdGhlIGJvdHRvbSwgd2UgYmxvY2sgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBldmVudCB0byBhdm9pZCBnb2luZyB0byB0aGUgbmV4dCBmb2N1c2FibGUgd2lkZ2V0Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY3VySW5kZXggPT0gbGFzdEl0ZW0pIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICghYmVsb3cgJiYga2V5Q29kZSA9PSBLZXlFdmVudC5LRVlDT0RFX0RQQURfVVAgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJJbmRleCA9PSBmaXJzdEl0ZW0pIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgeworICAgICAgICBpZiAobVBvcHVwLm9uS2V5RG93bihrZXlDb2RlLCBldmVudCkpIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBpZiAoIWlzUG9wdXBTaG93aW5nKCkpIHsKICAgICAgICAgICAgIHN3aXRjaChrZXlDb2RlKSB7CiAgICAgICAgICAgICBjYXNlIEtleUV2ZW50LktFWUNPREVfRFBBRF9ET1dOOgogICAgICAgICAgICAgICAgIHBlcmZvcm1WYWxpZGF0aW9uKCk7CkBAIC03NDYsNyArNjU0LDcgQEAKICAgICAgICAgYm9vbGVhbiBoYW5kbGVkID0gc3VwZXIub25LZXlEb3duKGtleUNvZGUsIGV2ZW50KTsKICAgICAgICAgbUxhc3RLZXlDb2RlID0gS2V5RXZlbnQuS0VZQ09ERV9VTktOT1dOOwogCi0gICAgICAgIGlmIChoYW5kbGVkICYmIGlzUG9wdXBTaG93aW5nKCkgJiYgbURyb3BEb3duTGlzdCAhPSBudWxsKSB7CisgICAgICAgIGlmIChoYW5kbGVkICYmIGlzUG9wdXBTaG93aW5nKCkpIHsKICAgICAgICAgICAgIGNsZWFyTGlzdFNlbGVjdGlvbigpOwogICAgICAgICB9CiAKQEAgLTgwNywxMSArNzE1LDEyIEBACiAgICAgICAgIGlmIChlbm91Z2hUb0ZpbHRlcigpKSB7CiAgICAgICAgICAgICBpZiAobUZpbHRlciAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgcGVyZm9ybUZpbHRlcmluZyhnZXRUZXh0KCksIG1MYXN0S2V5Q29kZSk7CisgICAgICAgICAgICAgICAgYnVpbGRJbWVDb21wbGV0aW9ucygpOwogICAgICAgICAgICAgfQogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgLy8gZHJvcCBkb3duIGlzIGF1dG9tYXRpY2FsbHkgZGlzbWlzc2VkIHdoZW4gZW5vdWdoIGNoYXJhY3RlcnMKICAgICAgICAgICAgIC8vIGFyZSBkZWxldGVkIGZyb20gdGhlIHRleHQgdmlldwotICAgICAgICAgICAgaWYgKCFtRHJvcERvd25BbHdheXNWaXNpYmxlKSBkaXNtaXNzRHJvcERvd24oKTsKKyAgICAgICAgICAgIGlmICghbVBvcHVwLmlzRHJvcERvd25BbHdheXNWaXNpYmxlKCkpIGRpc21pc3NEcm9wRG93bigpOwogICAgICAgICAgICAgaWYgKG1GaWx0ZXIgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgIG1GaWx0ZXIuZmlsdGVyKG51bGwpOwogICAgICAgICAgICAgfQpAQCAtODQ0LDEzICs3NTMsNyBAQAogICAgICAqIGl0IGJhY2suCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgY2xlYXJMaXN0U2VsZWN0aW9uKCkgewotICAgICAgICBmaW5hbCBEcm9wRG93bkxpc3RWaWV3IGxpc3QgPSBtRHJvcERvd25MaXN0OwotICAgICAgICBpZiAobGlzdCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAvLyBXQVJOSU5HOiBQbGVhc2UgcmVhZCB0aGUgY29tbWVudCB3aGVyZSBtTGlzdFNlbGVjdGlvbkhpZGRlbiBpcyBkZWNsYXJlZAotICAgICAgICAgICAgbGlzdC5tTGlzdFNlbGVjdGlvbkhpZGRlbiA9IHRydWU7Ci0gICAgICAgICAgICBsaXN0LmhpZGVTZWxlY3RvcigpOwotICAgICAgICAgICAgbGlzdC5yZXF1ZXN0TGF5b3V0KCk7Ci0gICAgICAgIH0KKyAgICAgICAgbVBvcHVwLmNsZWFyTGlzdFNlbGVjdGlvbigpOwogICAgIH0KICAgICAKICAgICAvKioKQEAgLTg1OSwxMSArNzYyLDcgQEAKICAgICAgKiBAcGFyYW0gcG9zaXRpb24gVGhlIHBvc2l0aW9uIHRvIG1vdmUgdGhlIHNlbGVjdG9yIHRvLgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldExpc3RTZWxlY3Rpb24oaW50IHBvc2l0aW9uKSB7Ci0gICAgICAgIGlmIChtUG9wdXAuaXNTaG93aW5nKCkgJiYgKG1Ecm9wRG93bkxpc3QgIT0gbnVsbCkpIHsKLSAgICAgICAgICAgIG1Ecm9wRG93bkxpc3QubUxpc3RTZWxlY3Rpb25IaWRkZW4gPSBmYWxzZTsKLSAgICAgICAgICAgIG1Ecm9wRG93bkxpc3Quc2V0U2VsZWN0aW9uKHBvc2l0aW9uKTsKLSAgICAgICAgICAgIC8vIExpc3RWaWV3LnNldFNlbGVjdGlvbigpIHdpbGwgY2FsbCByZXF1ZXN0TGF5b3V0KCkKLSAgICAgICAgfQorICAgICAgICBtUG9wdXAuc2V0U2VsZWN0aW9uKHBvc2l0aW9uKTsKICAgICB9CiAKICAgICAvKioKQEAgLTg3NywxMCArNzc2LDcgQEAKICAgICAgKiBAc2VlIExpc3RWaWV3I2dldFNlbGVjdGVkSXRlbVBvc2l0aW9uKCkKICAgICAgKi8KICAgICBwdWJsaWMgaW50IGdldExpc3RTZWxlY3Rpb24oKSB7Ci0gICAgICAgIGlmIChtUG9wdXAuaXNTaG93aW5nKCkgJiYgKG1Ecm9wRG93bkxpc3QgIT0gbnVsbCkpIHsKLSAgICAgICAgICAgIHJldHVybiBtRHJvcERvd25MaXN0LmdldFNlbGVjdGVkSXRlbVBvc2l0aW9uKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIExpc3RWaWV3LklOVkFMSURfUE9TSVRJT047CisgICAgICAgIHJldHVybiBtUG9wdXAuZ2V0U2VsZWN0ZWRJdGVtUG9zaXRpb24oKTsKICAgICB9CiAKICAgICAvKioKQEAgLTkxNCwxMyArODEwLDcgQEAKICAgICAgICAgICAgIHJlcGxhY2VUZXh0KGNvbXBsZXRpb24uZ2V0VGV4dCgpKTsKICAgICAgICAgICAgIG1CbG9ja0NvbXBsZXRpb24gPSBmYWxzZTsKIAotICAgICAgICAgICAgaWYgKG1JdGVtQ2xpY2tMaXN0ZW5lciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgZmluYWwgRHJvcERvd25MaXN0VmlldyBsaXN0ID0gbURyb3BEb3duTGlzdDsKLSAgICAgICAgICAgICAgICAvLyBOb3RlIHRoYXQgd2UgZG9uJ3QgaGF2ZSBhIFZpZXcgaGVyZSwgc28gd2Ugd2lsbCBuZWVkIHRvCi0gICAgICAgICAgICAgICAgLy8gc3VwcGx5IG51bGwuICBIb3BlZnVsbHkgbm8gZXhpc3RpbmcgYXBwcyBjcmFzaC4uLgotICAgICAgICAgICAgICAgIG1JdGVtQ2xpY2tMaXN0ZW5lci5vbkl0ZW1DbGljayhsaXN0LCBudWxsLCBjb21wbGV0aW9uLmdldFBvc2l0aW9uKCksCi0gICAgICAgICAgICAgICAgICAgICAgICBjb21wbGV0aW9uLmdldElkKCkpOwotICAgICAgICAgICAgfQorICAgICAgICAgICAgbVBvcHVwLnBlcmZvcm1JdGVtQ2xpY2soY29tcGxldGlvbi5nZXRQb3NpdGlvbigpKTsKICAgICAgICAgfQogICAgIH0KIApAQCAtOTI4LDcgKzgxOCw3IEBACiAgICAgICAgIGlmIChpc1BvcHVwU2hvd2luZygpKSB7CiAgICAgICAgICAgICBPYmplY3Qgc2VsZWN0ZWRJdGVtOwogICAgICAgICAgICAgaWYgKHBvc2l0aW9uIDwgMCkgewotICAgICAgICAgICAgICAgIHNlbGVjdGVkSXRlbSA9IG1Ecm9wRG93bkxpc3QuZ2V0U2VsZWN0ZWRJdGVtKCk7CisgICAgICAgICAgICAgICAgc2VsZWN0ZWRJdGVtID0gbVBvcHVwLmdldFNlbGVjdGVkSXRlbSgpOwogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICBzZWxlY3RlZEl0ZW0gPSBtQWRhcHRlci5nZXRJdGVtKHBvc2l0aW9uKTsKICAgICAgICAgICAgIH0KQEAgLTk0MiwxOCArODMyLDE4IEBACiAgICAgICAgICAgICBtQmxvY2tDb21wbGV0aW9uID0gZmFsc2U7ICAgICAgICAgICAgCiAKICAgICAgICAgICAgIGlmIChtSXRlbUNsaWNrTGlzdGVuZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGZpbmFsIERyb3BEb3duTGlzdFZpZXcgbGlzdCA9IG1Ecm9wRG93bkxpc3Q7CisgICAgICAgICAgICAgICAgZmluYWwgTGlzdFBvcHVwV2luZG93IGxpc3QgPSBtUG9wdXA7CiAKICAgICAgICAgICAgICAgICBpZiAoc2VsZWN0ZWRWaWV3ID09IG51bGwgfHwgcG9zaXRpb24gPCAwKSB7CiAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkVmlldyA9IGxpc3QuZ2V0U2VsZWN0ZWRWaWV3KCk7CiAgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uID0gbGlzdC5nZXRTZWxlY3RlZEl0ZW1Qb3NpdGlvbigpOwogICAgICAgICAgICAgICAgICAgICBpZCA9IGxpc3QuZ2V0U2VsZWN0ZWRJdGVtSWQoKTsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbUl0ZW1DbGlja0xpc3RlbmVyLm9uSXRlbUNsaWNrKGxpc3QsIHNlbGVjdGVkVmlldywgcG9zaXRpb24sIGlkKTsKKyAgICAgICAgICAgICAgICBtSXRlbUNsaWNrTGlzdGVuZXIub25JdGVtQ2xpY2sobGlzdC5nZXRMaXN0VmlldygpLCBzZWxlY3RlZFZpZXcsIHBvc2l0aW9uLCBpZCk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIAotICAgICAgICBpZiAobURyb3BEb3duRGlzbWlzc2VkT25Db21wbGV0aW9uICYmICFtRHJvcERvd25BbHdheXNWaXNpYmxlKSB7CisgICAgICAgIGlmIChtRHJvcERvd25EaXNtaXNzZWRPbkNvbXBsZXRpb24gJiYgIW1Qb3B1cC5pc0Ryb3BEb3duQWx3YXlzVmlzaWJsZSgpKSB7CiAgICAgICAgICAgICBkaXNtaXNzRHJvcERvd24oKTsKICAgICAgICAgfQogICAgIH0KQEAgLTEwMDMsNyArODkzLDYgQEAKICAgICAvKioge0Bpbmhlcml0RG9jfSAqLwogICAgIHB1YmxpYyB2b2lkIG9uRmlsdGVyQ29tcGxldGUoaW50IGNvdW50KSB7CiAgICAgICAgIHVwZGF0ZURyb3BEb3duRm9yRmlsdGVyKGNvdW50KTsKLQogICAgIH0KIAogICAgIHByaXZhdGUgdm9pZCB1cGRhdGVEcm9wRG93bkZvckZpbHRlcihpbnQgY291bnQpIHsKQEAgLTEwMTcsMTEgKzkwNiwxMiBAQAogICAgICAgICAgKiB0byBmaWx0ZXIuCiAgICAgICAgICAqLwogCi0gICAgICAgIGlmICgoY291bnQgPiAwIHx8IG1Ecm9wRG93bkFsd2F5c1Zpc2libGUpICYmIGVub3VnaFRvRmlsdGVyKCkpIHsKKyAgICAgICAgZmluYWwgYm9vbGVhbiBkcm9wRG93bkFsd2F5c1Zpc2libGUgPSBtUG9wdXAuaXNEcm9wRG93bkFsd2F5c1Zpc2libGUoKTsKKyAgICAgICAgaWYgKChjb3VudCA+IDAgfHwgZHJvcERvd25BbHdheXNWaXNpYmxlKSAmJiBlbm91Z2hUb0ZpbHRlcigpKSB7CiAgICAgICAgICAgICBpZiAoaGFzRm9jdXMoKSAmJiBoYXNXaW5kb3dGb2N1cygpKSB7CiAgICAgICAgICAgICAgICAgc2hvd0Ryb3BEb3duKCk7CiAgICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZiAoIW1Ecm9wRG93bkFsd2F5c1Zpc2libGUpIHsKKyAgICAgICAgfSBlbHNlIGlmICghZHJvcERvd25BbHdheXNWaXNpYmxlKSB7CiAgICAgICAgICAgICBkaXNtaXNzRHJvcERvd24oKTsKICAgICAgICAgfQogICAgIH0KQEAgLTEwMjksNyArOTE5LDcgQEAKICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBvbldpbmRvd0ZvY3VzQ2hhbmdlZChib29sZWFuIGhhc1dpbmRvd0ZvY3VzKSB7CiAgICAgICAgIHN1cGVyLm9uV2luZG93Rm9jdXNDaGFuZ2VkKGhhc1dpbmRvd0ZvY3VzKTsKLSAgICAgICAgaWYgKCFoYXNXaW5kb3dGb2N1cyAmJiAhbURyb3BEb3duQWx3YXlzVmlzaWJsZSkgeworICAgICAgICBpZiAoIWhhc1dpbmRvd0ZvY3VzICYmICFtUG9wdXAuaXNEcm9wRG93bkFsd2F5c1Zpc2libGUoKSkgewogICAgICAgICAgICAgZGlzbWlzc0Ryb3BEb3duKCk7CiAgICAgICAgIH0KICAgICB9CkBAIC0xMDM5LDcgKzkyOSw3IEBACiAgICAgICAgIHN1cGVyLm9uRGlzcGxheUhpbnQoaGludCk7CiAgICAgICAgIHN3aXRjaCAoaGludCkgewogICAgICAgICAgICAgY2FzZSBJTlZJU0lCTEU6Ci0gICAgICAgICAgICAgICAgaWYgKCFtRHJvcERvd25BbHdheXNWaXNpYmxlKSB7CisgICAgICAgICAgICAgICAgaWYgKCFtUG9wdXAuaXNEcm9wRG93bkFsd2F5c1Zpc2libGUoKSkgewogICAgICAgICAgICAgICAgICAgICBkaXNtaXNzRHJvcERvd24oKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgYnJlYWs7CkBAIC0xMDUzLDcgKzk0Myw3IEBACiAgICAgICAgIGlmICghZm9jdXNlZCkgewogICAgICAgICAgICAgcGVyZm9ybVZhbGlkYXRpb24oKTsKICAgICAgICAgfQotICAgICAgICBpZiAoIWZvY3VzZWQgJiYgIW1Ecm9wRG93bkFsd2F5c1Zpc2libGUpIHsKKyAgICAgICAgaWYgKCFmb2N1c2VkICYmICFtUG9wdXAuaXNEcm9wRG93bkFsd2F5c1Zpc2libGUoKSkgewogICAgICAgICAgICAgZGlzbWlzc0Ryb3BEb3duKCk7CiAgICAgICAgIH0KICAgICB9CkBAIC0xMDc4LDggKzk2OCw2IEBACiAgICAgICAgICAgICBpbW0uZGlzcGxheUNvbXBsZXRpb25zKHRoaXMsIG51bGwpOwogICAgICAgICB9CiAgICAgICAgIG1Qb3B1cC5kaXNtaXNzKCk7Ci0gICAgICAgIG1Qb3B1cC5zZXRDb250ZW50VmlldyhudWxsKTsKLSAgICAgICAgbURyb3BEb3duTGlzdCA9IG51bGw7CiAgICAgfQogCiAgICAgQE92ZXJyaWRlCkBAIC0xMDkyLDE4ICs5ODAsNiBAQAogCiAgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgfQotICAgIAotICAgIC8qKgotICAgICAqIDxwPlVzZWQgZm9yIGxhenkgaW5zdGFudGlhdGlvbiBvZiB0aGUgYW5jaG9yIHZpZXcgZnJvbSB0aGUgaWQgd2UgaGF2ZS4gSWYgdGhlIHZhbHVlIG9mCi0gICAgICogdGhlIGlkIGlzIE5PX0lEIG9yIHdlIGNhbid0IGZpbmQgYSB2aWV3IGZvciB0aGUgZ2l2ZW4gaWQsIHdlIHJldHVybiB0aGlzIFRleHRWaWV3IGFzCi0gICAgICogdGhlIGRlZmF1bHQgYW5jaG9yaW5nIHBvaW50LjwvcD4KLSAgICAgKi8KLSAgICBwcml2YXRlIFZpZXcgZ2V0RHJvcERvd25BbmNob3JWaWV3KCkgewotICAgICAgICBpZiAobURyb3BEb3duQW5jaG9yVmlldyA9PSBudWxsICYmIG1Ecm9wRG93bkFuY2hvcklkICE9IFZpZXcuTk9fSUQpIHsKLSAgICAgICAgICAgIG1Ecm9wRG93bkFuY2hvclZpZXcgPSBnZXRSb290VmlldygpLmZpbmRWaWV3QnlJZChtRHJvcERvd25BbmNob3JJZCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG1Ecm9wRG93bkFuY2hvclZpZXcgPT0gbnVsbCA/IHRoaXMgOiBtRHJvcERvd25BbmNob3JWaWV3OwotICAgIH0KIAogICAgIC8qKgogICAgICAqIElzc3VlcyBhIHJ1bm5hYmxlIHRvIHNob3cgdGhlIGRyb3Bkb3duIGFzIHNvb24gYXMgcG9zc2libGUuCkBAIC0xMTExLDcgKzk4Nyw3IEBACiAgICAgICogQGhpZGUgaW50ZXJuYWwgdXNlZCBvbmx5IGJ5IFNlYXJjaERpYWxvZwogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNob3dEcm9wRG93bkFmdGVyTGF5b3V0KCkgewotICAgICAgICBwb3N0KG1TaG93RHJvcERvd25SdW5uYWJsZSk7CisgICAgICAgIG1Qb3B1cC5wb3N0U2hvdygpOwogICAgIH0KICAgICAKICAgICAvKioKQEAgLTExMjIsNyArOTk4LDcgQEAKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBlbnN1cmVJbWVWaXNpYmxlKGJvb2xlYW4gdmlzaWJsZSkgewogICAgICAgICBtUG9wdXAuc2V0SW5wdXRNZXRob2RNb2RlKHZpc2libGUKLSAgICAgICAgICAgICAgICA/IFBvcHVwV2luZG93LklOUFVUX01FVEhPRF9ORUVERUQgOiBQb3B1cFdpbmRvdy5JTlBVVF9NRVRIT0RfTk9UX05FRURFRCk7CisgICAgICAgICAgICAgICAgPyBMaXN0UG9wdXBXaW5kb3cuSU5QVVRfTUVUSE9EX05FRURFRCA6IExpc3RQb3B1cFdpbmRvdy5JTlBVVF9NRVRIT0RfTk9UX05FRURFRCk7CiAgICAgICAgIHNob3dEcm9wRG93bigpOwogICAgIH0KIApAQCAtMTEzMCw4OSArMTAwNiwyMSBAQAogICAgICAqIEBoaWRlIGludGVybmFsIHVzZWQgb25seSBoZXJlIGFuZCBTZWFyY2hEaWFsb2cKICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiBpc0lucHV0TWV0aG9kTm90TmVlZGVkKCkgewotICAgICAgICByZXR1cm4gbVBvcHVwLmdldElucHV0TWV0aG9kTW9kZSgpID09IFBvcHVwV2luZG93LklOUFVUX01FVEhPRF9OT1RfTkVFREVEOworICAgICAgICByZXR1cm4gbVBvcHVwLmdldElucHV0TWV0aG9kTW9kZSgpID09IExpc3RQb3B1cFdpbmRvdy5JTlBVVF9NRVRIT0RfTk9UX05FRURFRDsKICAgICB9CiAKICAgICAvKioKICAgICAgKiA8cD5EaXNwbGF5cyB0aGUgZHJvcCBkb3duIG9uIHNjcmVlbi48L3A+CiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2hvd0Ryb3BEb3duKCkgewotICAgICAgICBpbnQgaGVpZ2h0ID0gYnVpbGREcm9wRG93bigpOwotCi0gICAgICAgIGludCB3aWR0aFNwZWMgPSAwOwotICAgICAgICBpbnQgaGVpZ2h0U3BlYyA9IDA7Ci0KLSAgICAgICAgYm9vbGVhbiBub0lucHV0TWV0aG9kID0gaXNJbnB1dE1ldGhvZE5vdE5lZWRlZCgpOwotCi0gICAgICAgIGlmIChtUG9wdXAuaXNTaG93aW5nKCkpIHsKLSAgICAgICAgICAgIGlmIChtRHJvcERvd25XaWR0aCA9PSBWaWV3R3JvdXAuTGF5b3V0UGFyYW1zLk1BVENIX1BBUkVOVCkgewotICAgICAgICAgICAgICAgIC8vIFRoZSBjYWxsIHRvIFBvcHVwV2luZG93J3MgdXBkYXRlIG1ldGhvZCBiZWxvdyBjYW4gYWNjZXB0IC0xIGZvciBhbnkKLSAgICAgICAgICAgICAgICAvLyB2YWx1ZSB5b3UgZG8gbm90IHdhbnQgdG8gdXBkYXRlLgotICAgICAgICAgICAgICAgIHdpZHRoU3BlYyA9IC0xOwotICAgICAgICAgICAgfSBlbHNlIGlmIChtRHJvcERvd25XaWR0aCA9PSBWaWV3R3JvdXAuTGF5b3V0UGFyYW1zLldSQVBfQ09OVEVOVCkgewotICAgICAgICAgICAgICAgIHdpZHRoU3BlYyA9IGdldERyb3BEb3duQW5jaG9yVmlldygpLmdldFdpZHRoKCk7CisgICAgICAgIGlmIChtUG9wdXAuZ2V0QW5jaG9yVmlldygpID09IG51bGwpIHsKKyAgICAgICAgICAgIGlmIChtRHJvcERvd25BbmNob3JJZCAhPSBWaWV3Lk5PX0lEKSB7CisgICAgICAgICAgICAgICAgbVBvcHVwLnNldEFuY2hvclZpZXcoZ2V0Um9vdFZpZXcoKS5maW5kVmlld0J5SWQobURyb3BEb3duQW5jaG9ySWQpKTsKICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgd2lkdGhTcGVjID0gbURyb3BEb3duV2lkdGg7CisgICAgICAgICAgICAgICAgbVBvcHVwLnNldEFuY2hvclZpZXcodGhpcyk7CiAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChtRHJvcERvd25IZWlnaHQgPT0gVmlld0dyb3VwLkxheW91dFBhcmFtcy5NQVRDSF9QQVJFTlQpIHsKLSAgICAgICAgICAgICAgICAvLyBUaGUgY2FsbCB0byBQb3B1cFdpbmRvdydzIHVwZGF0ZSBtZXRob2QgYmVsb3cgY2FuIGFjY2VwdCAtMSBmb3IgYW55Ci0gICAgICAgICAgICAgICAgLy8gdmFsdWUgeW91IGRvIG5vdCB3YW50IHRvIHVwZGF0ZS4KLSAgICAgICAgICAgICAgICBoZWlnaHRTcGVjID0gbm9JbnB1dE1ldGhvZCA/IGhlaWdodCA6IFZpZXdHcm91cC5MYXlvdXRQYXJhbXMuTUFUQ0hfUEFSRU5UOwotICAgICAgICAgICAgICAgIGlmIChub0lucHV0TWV0aG9kKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1Qb3B1cC5zZXRXaW5kb3dMYXlvdXRNb2RlKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Ecm9wRG93bldpZHRoID09IFZpZXdHcm91cC5MYXlvdXRQYXJhbXMuTUFUQ0hfUEFSRU5UID8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZpZXdHcm91cC5MYXlvdXRQYXJhbXMuTUFUQ0hfUEFSRU5UIDogMCwgMCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgbVBvcHVwLnNldFdpbmRvd0xheW91dE1vZGUoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbURyb3BEb3duV2lkdGggPT0gVmlld0dyb3VwLkxheW91dFBhcmFtcy5NQVRDSF9QQVJFTlQgPwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmlld0dyb3VwLkxheW91dFBhcmFtcy5NQVRDSF9QQVJFTlQgOiAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZpZXdHcm91cC5MYXlvdXRQYXJhbXMuTUFUQ0hfUEFSRU5UKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKG1Ecm9wRG93bkhlaWdodCA9PSBWaWV3R3JvdXAuTGF5b3V0UGFyYW1zLldSQVBfQ09OVEVOVCkgewotICAgICAgICAgICAgICAgIGhlaWdodFNwZWMgPSBoZWlnaHQ7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGhlaWdodFNwZWMgPSBtRHJvcERvd25IZWlnaHQ7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIG1Qb3B1cC5zZXRPdXRzaWRlVG91Y2hhYmxlKCFtRm9yY2VJZ25vcmVPdXRzaWRlVG91Y2ggJiYgIW1Ecm9wRG93bkFsd2F5c1Zpc2libGUpOwotCi0gICAgICAgICAgICBtUG9wdXAudXBkYXRlKGdldERyb3BEb3duQW5jaG9yVmlldygpLCBtRHJvcERvd25Ib3Jpem9udGFsT2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICBtRHJvcERvd25WZXJ0aWNhbE9mZnNldCwgd2lkdGhTcGVjLCBoZWlnaHRTcGVjKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGlmIChtRHJvcERvd25XaWR0aCA9PSBWaWV3R3JvdXAuTGF5b3V0UGFyYW1zLk1BVENIX1BBUkVOVCkgewotICAgICAgICAgICAgICAgIHdpZHRoU3BlYyA9IFZpZXdHcm91cC5MYXlvdXRQYXJhbXMuTUFUQ0hfUEFSRU5UOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBpZiAobURyb3BEb3duV2lkdGggPT0gVmlld0dyb3VwLkxheW91dFBhcmFtcy5XUkFQX0NPTlRFTlQpIHsKLSAgICAgICAgICAgICAgICAgICAgbVBvcHVwLnNldFdpZHRoKGdldERyb3BEb3duQW5jaG9yVmlldygpLmdldFdpZHRoKCkpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIG1Qb3B1cC5zZXRXaWR0aChtRHJvcERvd25XaWR0aCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAobURyb3BEb3duSGVpZ2h0ID09IFZpZXdHcm91cC5MYXlvdXRQYXJhbXMuTUFUQ0hfUEFSRU5UKSB7Ci0gICAgICAgICAgICAgICAgaGVpZ2h0U3BlYyA9IFZpZXdHcm91cC5MYXlvdXRQYXJhbXMuTUFUQ0hfUEFSRU5UOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBpZiAobURyb3BEb3duSGVpZ2h0ID09IFZpZXdHcm91cC5MYXlvdXRQYXJhbXMuV1JBUF9DT05URU5UKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1Qb3B1cC5zZXRIZWlnaHQoaGVpZ2h0KTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBtUG9wdXAuc2V0SGVpZ2h0KG1Ecm9wRG93bkhlaWdodCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBtUG9wdXAuc2V0V2luZG93TGF5b3V0TW9kZSh3aWR0aFNwZWMsIGhlaWdodFNwZWMpOwotICAgICAgICAgICAgbVBvcHVwLnNldElucHV0TWV0aG9kTW9kZShQb3B1cFdpbmRvdy5JTlBVVF9NRVRIT0RfTkVFREVEKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgLy8gdXNlIG91dHNpZGUgdG91Y2hhYmxlIHRvIGRpc21pc3MgZHJvcCBkb3duIHdoZW4gdG91Y2hpbmcgb3V0c2lkZSBvZiBpdCwgc28KLSAgICAgICAgICAgIC8vIG9ubHkgc2V0IHRoaXMgaWYgdGhlIGRyb3Bkb3duIGlzIG5vdCBhbHdheXMgdmlzaWJsZQotICAgICAgICAgICAgbVBvcHVwLnNldE91dHNpZGVUb3VjaGFibGUoIW1Gb3JjZUlnbm9yZU91dHNpZGVUb3VjaCAmJiAhbURyb3BEb3duQWx3YXlzVmlzaWJsZSk7Ci0gICAgICAgICAgICBtUG9wdXAuc2V0VG91Y2hJbnRlcmNlcHRvcihuZXcgUG9wdXBUb3VjaEludGVyY2VwdG9yKCkpOwotICAgICAgICAgICAgbVBvcHVwLnNob3dBc0Ryb3BEb3duKGdldERyb3BEb3duQW5jaG9yVmlldygpLAotICAgICAgICAgICAgICAgICAgICBtRHJvcERvd25Ib3Jpem9udGFsT2Zmc2V0LCBtRHJvcERvd25WZXJ0aWNhbE9mZnNldCk7Ci0gICAgICAgICAgICBtRHJvcERvd25MaXN0LnNldFNlbGVjdGlvbihMaXN0Vmlldy5JTlZBTElEX1BPU0lUSU9OKTsKLSAgICAgICAgICAgIGNsZWFyTGlzdFNlbGVjdGlvbigpOwotICAgICAgICAgICAgcG9zdChtSGlkZVNlbGVjdG9yKTsKICAgICAgICAgfQorICAgICAgICBtUG9wdXAuc2hvdygpOwogICAgIH0KICAgICAKICAgICAvKioKQEAgLTEyMjMsMTkgKzEwMzEsMTAgQEAKICAgICAgKiBAaGlkZSB1c2VkIG9ubHkgYnkgU2VhcmNoRGlhbG9nCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0Rm9yY2VJZ25vcmVPdXRzaWRlVG91Y2goYm9vbGVhbiBmb3JjZUlnbm9yZU91dHNpZGVUb3VjaCkgewotICAgICAgICBtRm9yY2VJZ25vcmVPdXRzaWRlVG91Y2ggPSBmb3JjZUlnbm9yZU91dHNpZGVUb3VjaDsKKyAgICAgICAgbVBvcHVwLnNldEZvcmNlSWdub3JlT3V0c2lkZVRvdWNoKGZvcmNlSWdub3JlT3V0c2lkZVRvdWNoKTsKICAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8cD5CdWlsZHMgdGhlIHBvcHVwIHdpbmRvdydzIGNvbnRlbnQgYW5kIHJldHVybnMgdGhlIGhlaWdodCB0aGUgcG9wdXAKLSAgICAgKiBzaG91bGQgaGF2ZS4gUmV0dXJucyAtMSB3aGVuIHRoZSBjb250ZW50IGFscmVhZHkgZXhpc3RzLjwvcD4KLSAgICAgKgotICAgICAqIEByZXR1cm4gdGhlIGNvbnRlbnQncyBoZWlnaHQgb3IgLTEgaWYgY29udGVudCBhbHJlYWR5IGV4aXN0cwotICAgICAqLwotICAgIHByaXZhdGUgaW50IGJ1aWxkRHJvcERvd24oKSB7Ci0gICAgICAgIFZpZXdHcm91cCBkcm9wRG93blZpZXc7Ci0gICAgICAgIGludCBvdGhlckhlaWdodHMgPSAwOwotCisgICAgCisgICAgcHJpdmF0ZSB2b2lkIGJ1aWxkSW1lQ29tcGxldGlvbnMoKSB7CiAgICAgICAgIGZpbmFsIExpc3RBZGFwdGVyIGFkYXB0ZXIgPSBtQWRhcHRlcjsKICAgICAgICAgaWYgKGFkYXB0ZXIgIT0gbnVsbCkgewogICAgICAgICAgICAgSW5wdXRNZXRob2RNYW5hZ2VyIGltbSA9IElucHV0TWV0aG9kTWFuYWdlci5wZWVrSW5zdGFuY2UoKTsKQEAgLTEyNjMsMTM1ICsxMDYyLDYgQEAKICAgICAgICAgICAgICAgICBpbW0uZGlzcGxheUNvbXBsZXRpb25zKHRoaXMsIGNvbXBsZXRpb25zKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQotCi0gICAgICAgIGlmIChtRHJvcERvd25MaXN0ID09IG51bGwpIHsKLSAgICAgICAgICAgIENvbnRleHQgY29udGV4dCA9IGdldENvbnRleHQoKTsKLQotICAgICAgICAgICAgbUhpZGVTZWxlY3RvciA9IG5ldyBMaXN0U2VsZWN0b3JIaWRlcigpOwotCi0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAqIFRoaXMgUnVubmFibGUgZXhpc3RzIGZvciB0aGUgc29sZSBwdXJwb3NlIG9mIGNoZWNraW5nIGlmIHRoZSB2aWV3IGxheW91dCBoYXMgZ290Ci0gICAgICAgICAgICAgKiBjb21wbGV0ZWQgYW5kIGlmIHNvIGNhbGwgc2hvd0Ryb3BEb3duIHRvIGRpc3BsYXkgdGhlIGRyb3AgZG93bi4gVGhpcyBpcyB1c2VkIHRvIHNob3cKLSAgICAgICAgICAgICAqIHRoZSBkcm9wIGRvd24gYXMgc29vbiBhcyBwb3NzaWJsZSBhZnRlciB1c2VyIG9wZW5zIHVwIHRoZSBzZWFyY2ggZGlhbG9nLCB3aXRob3V0Ci0gICAgICAgICAgICAgKiB3YWl0aW5nIGZvciB0aGUgbm9ybWFsIFVJIHBpcGVsaW5lIHRvIGRvIGl0J3Mgam9iIHdoaWNoIGlzIHNsb3dlciB0aGFuIHRoaXMgbWV0aG9kLgotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBtU2hvd0Ryb3BEb3duUnVubmFibGUgPSBuZXcgUnVubmFibGUoKSB7Ci0gICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgewotICAgICAgICAgICAgICAgICAgICAvLyBWaWV3IGxheW91dCBzaG91bGQgYmUgYWxsIGRvbmUgYmVmb3JlIGRpc3BsYXlpbmcgdGhlIGRyb3AgZG93bi4KLSAgICAgICAgICAgICAgICAgICAgVmlldyB2aWV3ID0gZ2V0RHJvcERvd25BbmNob3JWaWV3KCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh2aWV3ICE9IG51bGwgJiYgdmlldy5nZXRXaW5kb3dUb2tlbigpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNob3dEcm9wRG93bigpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfTsKLQotICAgICAgICAgICAgbURyb3BEb3duTGlzdCA9IG5ldyBEcm9wRG93bkxpc3RWaWV3KGNvbnRleHQpOwotICAgICAgICAgICAgbURyb3BEb3duTGlzdC5zZXRTZWxlY3RvcihtRHJvcERvd25MaXN0SGlnaGxpZ2h0KTsKLSAgICAgICAgICAgIG1Ecm9wRG93bkxpc3Quc2V0QWRhcHRlcihhZGFwdGVyKTsKLSAgICAgICAgICAgIG1Ecm9wRG93bkxpc3Quc2V0VmVydGljYWxGYWRpbmdFZGdlRW5hYmxlZCh0cnVlKTsKLSAgICAgICAgICAgIG1Ecm9wRG93bkxpc3Quc2V0T25JdGVtQ2xpY2tMaXN0ZW5lcihtRHJvcERvd25JdGVtQ2xpY2tMaXN0ZW5lcik7Ci0gICAgICAgICAgICBtRHJvcERvd25MaXN0LnNldEZvY3VzYWJsZSh0cnVlKTsKLSAgICAgICAgICAgIG1Ecm9wRG93bkxpc3Quc2V0Rm9jdXNhYmxlSW5Ub3VjaE1vZGUodHJ1ZSk7Ci0gICAgICAgICAgICBtRHJvcERvd25MaXN0LnNldE9uSXRlbVNlbGVjdGVkTGlzdGVuZXIobmV3IEFkYXB0ZXJWaWV3Lk9uSXRlbVNlbGVjdGVkTGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICAgICAgcHVibGljIHZvaWQgb25JdGVtU2VsZWN0ZWQoQWRhcHRlclZpZXc8Pz4gcGFyZW50LCBWaWV3IHZpZXcsCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgcG9zaXRpb24sIGxvbmcgaWQpIHsKLQotICAgICAgICAgICAgICAgICAgICBpZiAocG9zaXRpb24gIT0gLTEpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIERyb3BEb3duTGlzdFZpZXcgZHJvcERvd25MaXN0ID0gbURyb3BEb3duTGlzdDsKLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRyb3BEb3duTGlzdCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZHJvcERvd25MaXN0Lm1MaXN0U2VsZWN0aW9uSGlkZGVuID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbk5vdGhpbmdTZWxlY3RlZChBZGFwdGVyVmlldzw/PiBwYXJlbnQpIHsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9KTsKLSAgICAgICAgICAgIG1Ecm9wRG93bkxpc3Quc2V0T25TY3JvbGxMaXN0ZW5lcihuZXcgUG9wdXBTY3JvbGxMaXN0ZW5lcigpKTsKLQotICAgICAgICAgICAgaWYgKG1JdGVtU2VsZWN0ZWRMaXN0ZW5lciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbURyb3BEb3duTGlzdC5zZXRPbkl0ZW1TZWxlY3RlZExpc3RlbmVyKG1JdGVtU2VsZWN0ZWRMaXN0ZW5lcik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGRyb3BEb3duVmlldyA9IG1Ecm9wRG93bkxpc3Q7Ci0KLSAgICAgICAgICAgIFZpZXcgaGludFZpZXcgPSBnZXRIaW50Vmlldyhjb250ZXh0KTsKLSAgICAgICAgICAgIGlmIChoaW50VmlldyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgLy8gaWYgYW4gaGludCBoYXMgYmVlbiBzcGVjaWZpZWQsIHdlIGFjY29tb2RhdGUgbW9yZSBzcGFjZSBmb3IgaXQgYW5kCi0gICAgICAgICAgICAgICAgLy8gYWRkIGEgdGV4dCB2aWV3IGluIHRoZSBkcm9wIGRvd24gbWVudSwgYXQgdGhlIGJvdHRvbSBvZiB0aGUgbGlzdAotICAgICAgICAgICAgICAgIExpbmVhckxheW91dCBoaW50Q29udGFpbmVyID0gbmV3IExpbmVhckxheW91dChjb250ZXh0KTsKLSAgICAgICAgICAgICAgICBoaW50Q29udGFpbmVyLnNldE9yaWVudGF0aW9uKExpbmVhckxheW91dC5WRVJUSUNBTCk7Ci0KLSAgICAgICAgICAgICAgICBMaW5lYXJMYXlvdXQuTGF5b3V0UGFyYW1zIGhpbnRQYXJhbXMgPSBuZXcgTGluZWFyTGF5b3V0LkxheW91dFBhcmFtcygKLSAgICAgICAgICAgICAgICAgICAgICAgIFZpZXdHcm91cC5MYXlvdXRQYXJhbXMuTUFUQ0hfUEFSRU5ULCAwLCAxLjBmCi0gICAgICAgICAgICAgICAgKTsKLSAgICAgICAgICAgICAgICBoaW50Q29udGFpbmVyLmFkZFZpZXcoZHJvcERvd25WaWV3LCBoaW50UGFyYW1zKTsKLSAgICAgICAgICAgICAgICBoaW50Q29udGFpbmVyLmFkZFZpZXcoaGludFZpZXcpOwotCi0gICAgICAgICAgICAgICAgLy8gbWVhc3VyZSB0aGUgaGludCdzIGhlaWdodCB0byBmaW5kIGhvdyBtdWNoIG1vcmUgdmVydGljYWwgc3BhY2UKLSAgICAgICAgICAgICAgICAvLyB3ZSBuZWVkIHRvIGFkZCB0byB0aGUgZHJvcCBkb3duJ3MgaGVpZ2h0Ci0gICAgICAgICAgICAgICAgaW50IHdpZHRoU3BlYyA9IE1lYXN1cmVTcGVjLm1ha2VNZWFzdXJlU3BlYyhnZXRXaWR0aCgpLCBNZWFzdXJlU3BlYy5BVF9NT1NUKTsKLSAgICAgICAgICAgICAgICBpbnQgaGVpZ2h0U3BlYyA9IE1lYXN1cmVTcGVjLlVOU1BFQ0lGSUVEOwotICAgICAgICAgICAgICAgIGhpbnRWaWV3Lm1lYXN1cmUod2lkdGhTcGVjLCBoZWlnaHRTcGVjKTsKLQotICAgICAgICAgICAgICAgIGhpbnRQYXJhbXMgPSAoTGluZWFyTGF5b3V0LkxheW91dFBhcmFtcykgaGludFZpZXcuZ2V0TGF5b3V0UGFyYW1zKCk7Ci0gICAgICAgICAgICAgICAgb3RoZXJIZWlnaHRzID0gaGludFZpZXcuZ2V0TWVhc3VyZWRIZWlnaHQoKSArIGhpbnRQYXJhbXMudG9wTWFyZ2luCi0gICAgICAgICAgICAgICAgICAgICAgICArIGhpbnRQYXJhbXMuYm90dG9tTWFyZ2luOwotCi0gICAgICAgICAgICAgICAgZHJvcERvd25WaWV3ID0gaGludENvbnRhaW5lcjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgbVBvcHVwLnNldENvbnRlbnRWaWV3KGRyb3BEb3duVmlldyk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBkcm9wRG93blZpZXcgPSAoVmlld0dyb3VwKSBtUG9wdXAuZ2V0Q29udGVudFZpZXcoKTsKLSAgICAgICAgICAgIGZpbmFsIFZpZXcgdmlldyA9IGRyb3BEb3duVmlldy5maW5kVmlld0J5SWQoSElOVF9WSUVXX0lEKTsKLSAgICAgICAgICAgIGlmICh2aWV3ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBMaW5lYXJMYXlvdXQuTGF5b3V0UGFyYW1zIGhpbnRQYXJhbXMgPQotICAgICAgICAgICAgICAgICAgICAgICAgKExpbmVhckxheW91dC5MYXlvdXRQYXJhbXMpIHZpZXcuZ2V0TGF5b3V0UGFyYW1zKCk7Ci0gICAgICAgICAgICAgICAgb3RoZXJIZWlnaHRzID0gdmlldy5nZXRNZWFzdXJlZEhlaWdodCgpICsgaGludFBhcmFtcy50b3BNYXJnaW4KLSAgICAgICAgICAgICAgICAgICAgICAgICsgaGludFBhcmFtcy5ib3R0b21NYXJnaW47Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBNYXggaGVpZ2h0IGF2YWlsYWJsZSBvbiB0aGUgc2NyZWVuIGZvciBhIHBvcHVwLgotICAgICAgICBib29sZWFuIGlnbm9yZUJvdHRvbURlY29yYXRpb25zID0KLSAgICAgICAgICAgICAgICBtUG9wdXAuZ2V0SW5wdXRNZXRob2RNb2RlKCkgPT0gUG9wdXBXaW5kb3cuSU5QVVRfTUVUSE9EX05PVF9ORUVERUQ7Ci0gICAgICAgIGZpbmFsIGludCBtYXhIZWlnaHQgPSBtUG9wdXAuZ2V0TWF4QXZhaWxhYmxlSGVpZ2h0KAotICAgICAgICAgICAgICAgIGdldERyb3BEb3duQW5jaG9yVmlldygpLCBtRHJvcERvd25WZXJ0aWNhbE9mZnNldCwgaWdub3JlQm90dG9tRGVjb3JhdGlvbnMpOwotCi0gICAgICAgIC8vIGdldE1heEF2YWlsYWJsZUhlaWdodCgpIHN1YnRyYWN0cyB0aGUgcGFkZGluZywgc28gd2UgcHV0IGl0IGJhY2ssCi0gICAgICAgIC8vIHRvIGdldCB0aGUgYXZhaWxhYmxlIGhlaWdodCBmb3IgdGhlIHdob2xlIHdpbmRvdwotICAgICAgICBpbnQgcGFkZGluZyA9IDA7Ci0gICAgICAgIERyYXdhYmxlIGJhY2tncm91bmQgPSBtUG9wdXAuZ2V0QmFja2dyb3VuZCgpOwotICAgICAgICBpZiAoYmFja2dyb3VuZCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBiYWNrZ3JvdW5kLmdldFBhZGRpbmcobVRlbXBSZWN0KTsKLSAgICAgICAgICAgIHBhZGRpbmcgPSBtVGVtcFJlY3QudG9wICsgbVRlbXBSZWN0LmJvdHRvbTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtRHJvcERvd25BbHdheXNWaXNpYmxlIHx8IG1Ecm9wRG93bkhlaWdodCA9PSBWaWV3R3JvdXAuTGF5b3V0UGFyYW1zLk1BVENIX1BBUkVOVCkgewotICAgICAgICAgICAgcmV0dXJuIG1heEhlaWdodCArIHBhZGRpbmc7Ci0gICAgICAgIH0KLQotICAgICAgICBmaW5hbCBpbnQgbGlzdENvbnRlbnQgPSBtRHJvcERvd25MaXN0Lm1lYXN1cmVIZWlnaHRPZkNoaWxkcmVuKE1lYXN1cmVTcGVjLlVOU1BFQ0lGSUVELAotICAgICAgICAgICAgICAgIDAsIExpc3RWaWV3Lk5PX1BPU0lUSU9OLCBtYXhIZWlnaHQgLSBvdGhlckhlaWdodHMsIDIpOwotICAgICAgICAvLyBhZGQgcGFkZGluZyBvbmx5IGlmIHRoZSBsaXN0IGhhcyBpdGVtcyBpbiBpdCwgdGhhdCB3YXkgd2UgZG9uJ3Qgc2hvdwotICAgICAgICAvLyB0aGUgcG9wdXAgaWYgaXQgaXMgbm90IG5lZWRlZAotICAgICAgICBpZiAobGlzdENvbnRlbnQgPiAwKSBvdGhlckhlaWdodHMgKz0gcGFkZGluZzsKLQotICAgICAgICByZXR1cm4gbGlzdENvbnRlbnQgKyBvdGhlckhlaWdodHM7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBWaWV3IGdldEhpbnRWaWV3KENvbnRleHQgY29udGV4dCkgewotICAgICAgICBpZiAobUhpbnRUZXh0ICE9IG51bGwgJiYgbUhpbnRUZXh0Lmxlbmd0aCgpID4gMCkgewotICAgICAgICAgICAgZmluYWwgVGV4dFZpZXcgaGludFZpZXcgPSAoVGV4dFZpZXcpIExheW91dEluZmxhdGVyLmZyb20oY29udGV4dCkuaW5mbGF0ZSgKLSAgICAgICAgICAgICAgICAgICAgbUhpbnRSZXNvdXJjZSwgbnVsbCkuZmluZFZpZXdCeUlkKGNvbS5hbmRyb2lkLmludGVybmFsLlIuaWQudGV4dDEpOwotICAgICAgICAgICAgaGludFZpZXcuc2V0VGV4dChtSGludFRleHQpOwotICAgICAgICAgICAgaGludFZpZXcuc2V0SWQoSElOVF9WSUVXX0lEKTsKLSAgICAgICAgICAgIHJldHVybiBoaW50VmlldzsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9CiAgICAgfQogCiAgICAgLyoqCkBAIC0xNDQzLDQ3ICsxMTEzLDYgQEAKICAgICAgICAgcmV0dXJuIG1GaWx0ZXI7CiAgICAgfQogCi0gICAgcHJpdmF0ZSBjbGFzcyBMaXN0U2VsZWN0b3JIaWRlciBpbXBsZW1lbnRzIFJ1bm5hYmxlIHsKLSAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgewotICAgICAgICAgICAgY2xlYXJMaXN0U2VsZWN0aW9uKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIGNsYXNzIFJlc2l6ZVBvcHVwUnVubmFibGUgaW1wbGVtZW50cyBSdW5uYWJsZSB7Ci0gICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgICAgIG1Qb3B1cC5zZXRJbnB1dE1ldGhvZE1vZGUoUG9wdXBXaW5kb3cuSU5QVVRfTUVUSE9EX05PVF9ORUVERUQpOwotICAgICAgICAgICAgc2hvd0Ryb3BEb3duKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIGNsYXNzIFBvcHVwVG91Y2hJbnRlcmNlcHRvciBpbXBsZW1lbnRzIE9uVG91Y2hMaXN0ZW5lciB7Ci0gICAgICAgIHB1YmxpYyBib29sZWFuIG9uVG91Y2goVmlldyB2LCBNb3Rpb25FdmVudCBldmVudCkgewotICAgICAgICAgICAgZmluYWwgaW50IGFjdGlvbiA9IGV2ZW50LmdldEFjdGlvbigpOwotICAgICAgICAgICAgaWYgKGFjdGlvbiA9PSBNb3Rpb25FdmVudC5BQ1RJT05fRE9XTiAmJgotICAgICAgICAgICAgICAgICAgICBtUG9wdXAgIT0gbnVsbCAmJiBtUG9wdXAuaXNTaG93aW5nKCkpIHsKLSAgICAgICAgICAgICAgICBwb3N0RGVsYXllZChtUmVzaXplUG9wdXBSdW5uYWJsZSwgRVhQQU5EX0xJU1RfVElNRU9VVCk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGFjdGlvbiA9PSBNb3Rpb25FdmVudC5BQ1RJT05fVVApIHsKLSAgICAgICAgICAgICAgICByZW1vdmVDYWxsYmFja3MobVJlc2l6ZVBvcHVwUnVubmFibGUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgY2xhc3MgUG9wdXBTY3JvbGxMaXN0ZW5lciBpbXBsZW1lbnRzIExpc3RWaWV3Lk9uU2Nyb2xsTGlzdGVuZXIgewotICAgICAgICBwdWJsaWMgdm9pZCBvblNjcm9sbChBYnNMaXN0VmlldyB2aWV3LCBpbnQgZmlyc3RWaXNpYmxlSXRlbSwgaW50IHZpc2libGVJdGVtQ291bnQsCi0gICAgICAgICAgICAgICAgaW50IHRvdGFsSXRlbUNvdW50KSB7Ci0KLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uU2Nyb2xsU3RhdGVDaGFuZ2VkKEFic0xpc3RWaWV3IHZpZXcsIGludCBzY3JvbGxTdGF0ZSkgewotICAgICAgICAgICAgaWYgKHNjcm9sbFN0YXRlID09IFNDUk9MTF9TVEFURV9UT1VDSF9TQ1JPTEwgJiYKLSAgICAgICAgICAgICAgICAgICAgIWlzSW5wdXRNZXRob2ROb3ROZWVkZWQoKSAmJiBtUG9wdXAuZ2V0Q29udGVudFZpZXcoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcmVtb3ZlQ2FsbGJhY2tzKG1SZXNpemVQb3B1cFJ1bm5hYmxlKTsKLSAgICAgICAgICAgICAgICBtUmVzaXplUG9wdXBSdW5uYWJsZS5ydW4oKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQogICAgIHByaXZhdGUgY2xhc3MgRHJvcERvd25JdGVtQ2xpY2tMaXN0ZW5lciBpbXBsZW1lbnRzIEFkYXB0ZXJWaWV3Lk9uSXRlbUNsaWNrTGlzdGVuZXIgewogICAgICAgICBwdWJsaWMgdm9pZCBvbkl0ZW1DbGljayhBZGFwdGVyVmlldyBwYXJlbnQsIFZpZXcgdiwgaW50IHBvc2l0aW9uLCBsb25nIGlkKSB7CiAgICAgICAgICAgICBwZXJmb3JtQ29tcGxldGlvbih2LCBwb3NpdGlvbiwgaWQpOwpAQCAtMTQ5MSwxMjMgKzExMjAsNiBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIDxwPldyYXBwZXIgY2xhc3MgZm9yIGEgTGlzdFZpZXcuIFRoaXMgd3JhcHBlciBoaWphY2tzIHRoZSBmb2N1cyB0bwotICAgICAqIG1ha2Ugc3VyZSB0aGUgbGlzdCB1c2VzIHRoZSBhcHByb3ByaWF0ZSBkcmF3YWJsZXMgYW5kIHN0YXRlcyB3aGVuCi0gICAgICogZGlzcGxheWVkIG9uIHNjcmVlbiB3aXRoaW4gYSBkcm9wIGRvd24uIFRoZSBmb2N1cyBpcyBuZXZlciBhY3R1YWxseQotICAgICAqIHBhc3NlZCB0byB0aGUgZHJvcCBkb3duOyB0aGUgbGlzdCBvbmx5IGxvb2tzIGZvY3VzZWQuPC9wPgotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIERyb3BEb3duTGlzdFZpZXcgZXh0ZW5kcyBMaXN0VmlldyB7Ci0gICAgICAgIC8qCi0gICAgICAgICAqIFdBUk5JTkc6IFRoaXMgaXMgYSB3b3JrYXJvdW5kIGZvciBhIHRvdWNoIG1vZGUgaXNzdWUuCi0gICAgICAgICAqCi0gICAgICAgICAqIFRvdWNoIG1vZGUgaXMgcHJvcGFnYXRlZCBsYXppbHkgdG8gd2luZG93cy4gVGhpcyBjYXVzZXMgcHJvYmxlbXMgaW4KLSAgICAgICAgICogdGhlIGZvbGxvd2luZyBzY2VuYXJpbzoKLSAgICAgICAgICogLSBUeXBlIHNvbWV0aGluZyBpbiB0aGUgQXV0b0NvbXBsZXRlVGV4dFZpZXcgYW5kIGdldCBzb21lIHJlc3VsdHMKLSAgICAgICAgICogLSBNb3ZlIGRvd24gd2l0aCB0aGUgZC1wYWQgdG8gc2VsZWN0IGFuIGl0ZW0gaW4gdGhlIGxpc3QKLSAgICAgICAgICogLSBNb3ZlIHVwIHdpdGggdGhlIGQtcGFkIHVudGlsIHRoZSBzZWxlY3Rpb24gZGlzYXBwZWFycwotICAgICAgICAgKiAtIFR5cGUgbW9yZSB0ZXh0IGluIHRoZSBBdXRvQ29tcGxldGVUZXh0VmlldyAqdXNpbmcgdGhlIHNvZnQga2V5Ym9hcmQqCi0gICAgICAgICAqICAgYW5kIGdldCBuZXcgcmVzdWx0czsgeW91IGFyZSBub3cgaW4gdG91Y2ggbW9kZQotICAgICAgICAgKiAtIFRoZSBzZWxlY3Rpb24gY29tZXMgYmFjayBvbiB0aGUgZmlyc3QgaXRlbSBpbiB0aGUgbGlzdCwgZXZlbiB0aG91Z2gKLSAgICAgICAgICogICB0aGUgbGlzdCBpcyBzdXBwb3NlZCB0byBiZSBpbiB0b3VjaCBtb2RlCi0gICAgICAgICAqCi0gICAgICAgICAqIFVzaW5nIHRoZSBzb2Z0IGtleWJvYXJkIHRyaWdnZXJzIHRoZSB0b3VjaCBtb2RlIGNoYW5nZSBidXQgdGhhdCBjaGFuZ2UKLSAgICAgICAgICogaXMgcHJvcGFnYXRlZCB0byBvdXIgd2luZG93IG9ubHkgYWZ0ZXIgdGhlIGZpcnN0IGxpc3QgbGF5b3V0LCB0aGVyZWZvcmUKLSAgICAgICAgICogYWZ0ZXIgdGhlIGxpc3QgYXR0ZW1wdHMgdG8gcmVzdXJyZWN0IHRoZSBzZWxlY3Rpb24uCi0gICAgICAgICAqCi0gICAgICAgICAqIFRoZSB0cmljayB0byB3b3JrIGFyb3VuZCB0aGlzIGlzc3VlIGlzIHRvIHByZXRlbmQgdGhlIGxpc3QgaXMgaW4gdG91Y2gKLSAgICAgICAgICogbW9kZSB3aGVuIHdlIGtub3cgdGhhdCB0aGUgc2VsZWN0aW9uIHNob3VsZCBub3QgYXBwZWFyLCB0aGF0IGlzIHdoZW4KLSAgICAgICAgICogd2Uga25vdyB0aGUgdXNlciBtb3ZlZCB0aGUgc2VsZWN0aW9uIGF3YXkgZnJvbSB0aGUgbGlzdC4KLSAgICAgICAgICoKLSAgICAgICAgICogVGhpcyBib29sZWFuIGlzIHNldCB0byB0cnVlIHdoZW5ldmVyIHdlIGV4cGxpY2l0ZWx5IGhpZGUgdGhlIGxpc3QncwotICAgICAgICAgKiBzZWxlY3Rpb24gYW5kIHJlc2V0IHRvIGZhbHNlIHdoZW52ZXIgd2Uga25vdyB0aGUgdXNlciBtb3ZlZCB0aGUKLSAgICAgICAgICogc2VsZWN0aW9uIGJhY2sgdG8gdGhlIGxpc3QuCi0gICAgICAgICAqCi0gICAgICAgICAqIFdoZW4gdGhpcyBib29sZWFuIGlzIHRydWUsIGlzSW5Ub3VjaE1vZGUoKSByZXR1cm5zIHRydWUsIG90aGVyd2lzZSBpdAotICAgICAgICAgKiByZXR1cm5zIHN1cGVyLmlzSW5Ub3VjaE1vZGUoKS4KLSAgICAgICAgICovCi0gICAgICAgIHByaXZhdGUgYm9vbGVhbiBtTGlzdFNlbGVjdGlvbkhpZGRlbjsKLQotICAgICAgICAvKioKLSAgICAgICAgICogPHA+Q3JlYXRlcyBhIG5ldyBsaXN0IHZpZXcgd3JhcHBlci48L3A+Ci0gICAgICAgICAqCi0gICAgICAgICAqIEBwYXJhbSBjb250ZXh0IHRoaXMgdmlldydzIGNvbnRleHQKLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBEcm9wRG93bkxpc3RWaWV3KENvbnRleHQgY29udGV4dCkgewotICAgICAgICAgICAgc3VwZXIoY29udGV4dCwgbnVsbCwgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5hdHRyLmRyb3BEb3duTGlzdFZpZXdTdHlsZSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogPHA+QXZvaWRzIGphcnJpbmcgc2Nyb2xsaW5nIGVmZmVjdCBieSBlbnN1cmluZyB0aGF0IGxpc3QgZWxlbWVudHMKLSAgICAgICAgICogbWFkZSBvZiBhIHRleHQgdmlldyBmaXQgb24gYSBzaW5nbGUgbGluZS48L3A+Ci0gICAgICAgICAqCi0gICAgICAgICAqIEBwYXJhbSBwb3NpdGlvbiB0aGUgaXRlbSBpbmRleCBpbiB0aGUgbGlzdCB0byBnZXQgYSB2aWV3IGZvcgotICAgICAgICAgKiBAcmV0dXJuIHRoZSB2aWV3IGZvciB0aGUgc3BlY2lmaWVkIGl0ZW0KLSAgICAgICAgICovCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBWaWV3IG9idGFpblZpZXcoaW50IHBvc2l0aW9uLCBib29sZWFuW10gaXNTY3JhcCkgewotICAgICAgICAgICAgVmlldyB2aWV3ID0gc3VwZXIub2J0YWluVmlldyhwb3NpdGlvbiwgaXNTY3JhcCk7Ci0KLSAgICAgICAgICAgIGlmICh2aWV3IGluc3RhbmNlb2YgVGV4dFZpZXcpIHsKLSAgICAgICAgICAgICAgICAoKFRleHRWaWV3KSB2aWV3KS5zZXRIb3Jpem9udGFsbHlTY3JvbGxpbmcodHJ1ZSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiB2aWV3OwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGlzSW5Ub3VjaE1vZGUoKSB7Ci0gICAgICAgICAgICAvLyBXQVJOSU5HOiBQbGVhc2UgcmVhZCB0aGUgY29tbWVudCB3aGVyZSBtTGlzdFNlbGVjdGlvbkhpZGRlbiBpcyBkZWNsYXJlZAotICAgICAgICAgICAgcmV0dXJuIG1MaXN0U2VsZWN0aW9uSGlkZGVuIHx8IHN1cGVyLmlzSW5Ub3VjaE1vZGUoKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiA8cD5SZXR1cm5zIHRoZSBmb2N1cyBzdGF0ZSBpbiB0aGUgZHJvcCBkb3duLjwvcD4KLSAgICAgICAgICoKLSAgICAgICAgICogQHJldHVybiB0cnVlIGFsd2F5cwotICAgICAgICAgKi8KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGhhc1dpbmRvd0ZvY3VzKCkgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogPHA+UmV0dXJucyB0aGUgZm9jdXMgc3RhdGUgaW4gdGhlIGRyb3AgZG93bi48L3A+Ci0gICAgICAgICAqCi0gICAgICAgICAqIEByZXR1cm4gdHJ1ZSBhbHdheXMKLSAgICAgICAgICovCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc0ZvY3VzZWQoKSB7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiA8cD5SZXR1cm5zIHRoZSBmb2N1cyBzdGF0ZSBpbiB0aGUgZHJvcCBkb3duLjwvcD4KLSAgICAgICAgICoKLSAgICAgICAgICogQHJldHVybiB0cnVlIGFsd2F5cwotICAgICAgICAgKi8KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGhhc0ZvY3VzKCkgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHByb3RlY3RlZCBpbnRbXSBvbkNyZWF0ZURyYXdhYmxlU3RhdGUoaW50IGV4dHJhU3BhY2UpIHsKLSAgICAgICAgICAgIGludFtdIHJlcyA9IHN1cGVyLm9uQ3JlYXRlRHJhd2FibGVTdGF0ZShleHRyYVNwYWNlKTsKLSAgICAgICAgICAgIC8vbm9pbnNwZWN0aW9uIENvbnN0YW50SWZTdGF0ZW1lbnQKLSAgICAgICAgICAgIGlmIChmYWxzZSkgewotICAgICAgICAgICAgICAgIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigiQ3JlYXRlZCBkcmF3YWJsZSBzdGF0ZTogWyIpOwotICAgICAgICAgICAgICAgIGZvciAoaW50IGk9MDsgaTxyZXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGkgPiAwKSBzYi5hcHBlbmQoIiwgIik7Ci0gICAgICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgiMHgiKTsKLSAgICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKEludGVnZXIudG9IZXhTdHJpbmcocmVzW2ldKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgiXSIpOwotICAgICAgICAgICAgICAgIExvZy5pKFRBRywgc2IudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gcmVzOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCiAgICAgICogVGhpcyBpbnRlcmZhY2UgaXMgdXNlZCB0byBtYWtlIHN1cmUgdGhhdCB0aGUgdGV4dCBlbnRlcmVkIGluIHRoaXMgVGV4dFZpZXcgY29tcGxpZXMgdG8KICAgICAgKiBhIGNlcnRhaW4gZm9ybWF0LiAgU2luY2UgdGhlcmUgaXMgbm8gZm9vbHByb29mIHdheSB0byBwcmV2ZW50IHRoZSB1c2VyIGZyb20gbGVhdmluZwogICAgICAqIHRoaXMgVmlldyB3aXRoIGFuIGluY29ycmVjdCB2YWx1ZSBpbiBpdCwgYWxsIHdlIGNhbiBkbyBpcyB0cnkgdG8gZml4IGl0IG91cnNlbHZlcwpAQCAtMTY1NSwxMCArMTE2Nyw3IEBACiAgICAgcHJpdmF0ZSBjbGFzcyBQb3B1cERhdGFTZXRPYnNlcnZlciBleHRlbmRzIERhdGFTZXRPYnNlcnZlciB7CiAgICAgICAgIEBPdmVycmlkZQogICAgICAgICBwdWJsaWMgdm9pZCBvbkNoYW5nZWQoKSB7Ci0gICAgICAgICAgICBpZiAoaXNQb3B1cFNob3dpbmcoKSkgewotICAgICAgICAgICAgICAgIC8vIFRoaXMgd2lsbCByZXNpemUgdGhlIHBvcHVwIHRvIGZpdCB0aGUgbmV3IGFkYXB0ZXIncyBjb250ZW50Ci0gICAgICAgICAgICAgICAgc2hvd0Ryb3BEb3duKCk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKG1BZGFwdGVyICE9IG51bGwpIHsKKyAgICAgICAgICAgIGlmIChtQWRhcHRlciAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgLy8gSWYgdGhlIHBvcHVwIGlzIG5vdCBzaG93aW5nIGFscmVhZHksIHNob3dpbmcgaXQgd2lsbCBjYXVzZQogICAgICAgICAgICAgICAgIC8vIHRoZSBsaXN0IG9mIGRhdGEgc2V0IG9ic2VydmVycyBhdHRhY2hlZCB0byB0aGUgYWRhcHRlciB0bwogICAgICAgICAgICAgICAgIC8vIGNoYW5nZS4gV2UgY2FuJ3QgZG8gaXQgZnJvbSBoZXJlLCBiZWNhdXNlIHdlIGFyZSBpbiB0aGUgbWlkZGxlCkBAIC0xNjczLDE0ICsxMTgyLDUgQEAKICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvbkludmFsaWRhdGVkKCkgewotICAgICAgICAgICAgaWYgKCFtRHJvcERvd25BbHdheXNWaXNpYmxlKSB7Ci0gICAgICAgICAgICAgICAgLy8gVGhlcmUncyBubyBkYXRhIHRvIGRpc3BsYXkgc28gbWFrZSBzdXJlIHdlJ3JlIG5vdCBzaG93aW5nCi0gICAgICAgICAgICAgICAgLy8gdGhlIGRyb3AgZG93biBhbmQgaXRzIGxpc3QKLSAgICAgICAgICAgICAgICBkaXNtaXNzRHJvcERvd24oKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQogICAgIH0KIH0KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9DdXJzb3JBZGFwdGVyLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvQ3Vyc29yQWRhcHRlci5qYXZhCmluZGV4IGJhYTY4MzMuLjRjZjg3ODUgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9DdXJzb3JBZGFwdGVyLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L0N1cnNvckFkYXB0ZXIuamF2YQpAQCAtODAsNiArODAsMTggQEAKICAgICBwcm90ZWN0ZWQgRmlsdGVyUXVlcnlQcm92aWRlciBtRmlsdGVyUXVlcnlQcm92aWRlcjsKIAogICAgIC8qKgorICAgICAqIElmIHNldCB0aGUgYWRhcHRlciB3aWxsIGNhbGwgcmVxdWVyeSgpIG9uIHRoZSBjdXJzb3Igd2hlbmV2ZXIgYSBjb250ZW50IGNoYW5nZQorICAgICAqIG5vdGlmaWNhdGlvbiBpcyBkZWxpdmVyZWQuIEltcGxpZXMge0BsaW5rICNGTEFHX1JFR0lTVEVSX0NPTlRFTlRfT0JTRVJWRVJ9CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRkxBR19BVVRPX1JFUVVFUlkgPSAweDAxOworCisgICAgLyoqCisgICAgICogSWYgc2V0IHRoZSBhZGFwdGVyIHdpbGwgcmVnaXN0ZXIgYSBjb250ZW50IG9ic2VydmVyIG9uIHRoZSBjdXJzb3IgYW5kIHdpbGwgY2FsbAorICAgICAqIHtAbGluayAjb25Db250ZW50Q2hhbmdlZCgpfSB3aGVuIGEgbm90aWZpY2F0aW9uIGNvbWVzIGluLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZMQUdfUkVHSVNURVJfQ09OVEVOVF9PQlNFUlZFUiA9IDB4MDI7CisKKyAgICAvKioKICAgICAgKiBDb25zdHJ1Y3Rvci4gVGhlIGFkYXB0ZXIgd2lsbCBjYWxsIHJlcXVlcnkoKSBvbiB0aGUgY3Vyc29yIHdoZW5ldmVyCiAgICAgICogaXQgY2hhbmdlcyBzbyB0aGF0IHRoZSBtb3N0IHJlY2VudCBkYXRhIGlzIGFsd2F5cyBkaXNwbGF5ZWQuCiAgICAgICoKQEAgLTg3LDcgKzk5LDcgQEAKICAgICAgKiBAcGFyYW0gY29udGV4dCBUaGUgY29udGV4dAogICAgICAqLwogICAgIHB1YmxpYyBDdXJzb3JBZGFwdGVyKENvbnRleHQgY29udGV4dCwgQ3Vyc29yIGMpIHsKLSAgICAgICAgaW5pdChjb250ZXh0LCBjLCB0cnVlKTsKKyAgICAgICAgaW5pdChjb250ZXh0LCBjLCBGTEFHX0FVVE9fUkVRVUVSWSk7CiAgICAgfQogCiAgICAgLyoqCkBAIC05OSwxOSArMTExLDQzIEBACiAgICAgICogICAgICAgICAgICAgICAgICAgIGRhdGEgaXMgYWx3YXlzIGRpc3BsYXllZC4KICAgICAgKi8KICAgICBwdWJsaWMgQ3Vyc29yQWRhcHRlcihDb250ZXh0IGNvbnRleHQsIEN1cnNvciBjLCBib29sZWFuIGF1dG9SZXF1ZXJ5KSB7Ci0gICAgICAgIGluaXQoY29udGV4dCwgYywgYXV0b1JlcXVlcnkpOworICAgICAgICBpbml0KGNvbnRleHQsIGMsIGF1dG9SZXF1ZXJ5ID8gRkxBR19BVVRPX1JFUVVFUlkgOiBGTEFHX1JFR0lTVEVSX0NPTlRFTlRfT0JTRVJWRVIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdG9yCisgICAgICogQHBhcmFtIGMgVGhlIGN1cnNvciBmcm9tIHdoaWNoIHRvIGdldCB0aGUgZGF0YS4KKyAgICAgKiBAcGFyYW0gY29udGV4dCBUaGUgY29udGV4dAorICAgICAqIEBwYXJhbSBmbGFncyBmbGFncyB1c2VkIHRvIGRldGVybWluZSB0aGUgYmVoYXZpb3Igb2YgdGhlIGFkYXB0ZXIKKyAgICAgKi8KKyAgICBwdWJsaWMgQ3Vyc29yQWRhcHRlcihDb250ZXh0IGNvbnRleHQsIEN1cnNvciBjLCBpbnQgZmxhZ3MpIHsKKyAgICAgICAgaW5pdChjb250ZXh0LCBjLCBmbGFncyk7CiAgICAgfQogCiAgICAgcHJvdGVjdGVkIHZvaWQgaW5pdChDb250ZXh0IGNvbnRleHQsIEN1cnNvciBjLCBib29sZWFuIGF1dG9SZXF1ZXJ5KSB7CisgICAgICAgIGluaXQoY29udGV4dCwgYywgYXV0b1JlcXVlcnkgPyBGTEFHX0FVVE9fUkVRVUVSWSA6IEZMQUdfUkVHSVNURVJfQ09OVEVOVF9PQlNFUlZFUik7CisgICAgfQorCisgICAgcHJvdGVjdGVkIHZvaWQgaW5pdChDb250ZXh0IGNvbnRleHQsIEN1cnNvciBjLCBpbnQgZmxhZ3MpIHsKKyAgICAgICAgaWYgKChmbGFncyAmIEZMQUdfQVVUT19SRVFVRVJZKSA9PSBGTEFHX0FVVE9fUkVRVUVSWSkgeworICAgICAgICAgICAgZmxhZ3MgfD0gRkxBR19SRUdJU1RFUl9DT05URU5UX09CU0VSVkVSOworICAgICAgICAgICAgbUF1dG9SZXF1ZXJ5ID0gdHJ1ZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1BdXRvUmVxdWVyeSA9IGZhbHNlOworICAgICAgICB9CiAgICAgICAgIGJvb2xlYW4gY3Vyc29yUHJlc2VudCA9IGMgIT0gbnVsbDsKLSAgICAgICAgbUF1dG9SZXF1ZXJ5ID0gYXV0b1JlcXVlcnk7CiAgICAgICAgIG1DdXJzb3IgPSBjOwogICAgICAgICBtRGF0YVZhbGlkID0gY3Vyc29yUHJlc2VudDsKICAgICAgICAgbUNvbnRleHQgPSBjb250ZXh0OwogICAgICAgICBtUm93SURDb2x1bW4gPSBjdXJzb3JQcmVzZW50ID8gYy5nZXRDb2x1bW5JbmRleE9yVGhyb3coIl9pZCIpIDogLTE7Ci0gICAgICAgIG1DaGFuZ2VPYnNlcnZlciA9IG5ldyBDaGFuZ2VPYnNlcnZlcigpOworICAgICAgICBpZiAoKGZsYWdzICYgRkxBR19SRUdJU1RFUl9DT05URU5UX09CU0VSVkVSKSA9PSBGTEFHX1JFR0lTVEVSX0NPTlRFTlRfT0JTRVJWRVIpIHsKKyAgICAgICAgICAgIG1DaGFuZ2VPYnNlcnZlciA9IG5ldyBDaGFuZ2VPYnNlcnZlcigpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbUNoYW5nZU9ic2VydmVyID0gbnVsbDsKKyAgICAgICAgfQorCiAgICAgICAgIGlmIChjdXJzb3JQcmVzZW50KSB7Ci0gICAgICAgICAgICBjLnJlZ2lzdGVyQ29udGVudE9ic2VydmVyKG1DaGFuZ2VPYnNlcnZlcik7CisgICAgICAgICAgICBpZiAobUNoYW5nZU9ic2VydmVyICE9IG51bGwpIGMucmVnaXN0ZXJDb250ZW50T2JzZXJ2ZXIobUNoYW5nZU9ic2VydmVyKTsKICAgICAgICAgICAgIGMucmVnaXN0ZXJEYXRhU2V0T2JzZXJ2ZXIobURhdGFTZXRPYnNlcnZlcik7CiAgICAgICAgIH0KICAgICB9CkBAIC0yNDYsMTMgKzI4MiwxMyBAQAogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CiAgICAgICAgIGlmIChtQ3Vyc29yICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1DdXJzb3IudW5yZWdpc3RlckNvbnRlbnRPYnNlcnZlcihtQ2hhbmdlT2JzZXJ2ZXIpOworICAgICAgICAgICAgaWYgKG1DaGFuZ2VPYnNlcnZlciAhPSBudWxsKSBtQ3Vyc29yLnVucmVnaXN0ZXJDb250ZW50T2JzZXJ2ZXIobUNoYW5nZU9ic2VydmVyKTsKICAgICAgICAgICAgIG1DdXJzb3IudW5yZWdpc3RlckRhdGFTZXRPYnNlcnZlcihtRGF0YVNldE9ic2VydmVyKTsKICAgICAgICAgICAgIG1DdXJzb3IuY2xvc2UoKTsKICAgICAgICAgfQogICAgICAgICBtQ3Vyc29yID0gY3Vyc29yOwogICAgICAgICBpZiAoY3Vyc29yICE9IG51bGwpIHsKLSAgICAgICAgICAgIGN1cnNvci5yZWdpc3RlckNvbnRlbnRPYnNlcnZlcihtQ2hhbmdlT2JzZXJ2ZXIpOworICAgICAgICAgICAgaWYgKG1DaGFuZ2VPYnNlcnZlciAhPSBudWxsKSBjdXJzb3IucmVnaXN0ZXJDb250ZW50T2JzZXJ2ZXIobUNoYW5nZU9ic2VydmVyKTsKICAgICAgICAgICAgIGN1cnNvci5yZWdpc3RlckRhdGFTZXRPYnNlcnZlcihtRGF0YVNldE9ic2VydmVyKTsKICAgICAgICAgICAgIG1Sb3dJRENvbHVtbiA9IGN1cnNvci5nZXRDb2x1bW5JbmRleE9yVGhyb3coIl9pZCIpOwogICAgICAgICAgICAgbURhdGFWYWxpZCA9IHRydWU7CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvRWRnZUdsb3cuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9FZGdlR2xvdy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MzIyMmUxLi4wMDAwMDAwCi0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9FZGdlR2xvdy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjgyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGFuZHJvaWQud2lkZ2V0OwotCi1pbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5DYW52YXM7Ci1pbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZTsKLWltcG9ydCBhbmRyb2lkLnZpZXcuYW5pbWF0aW9uLkFuaW1hdGlvblV0aWxzOwotaW1wb3J0IGFuZHJvaWQudmlldy5hbmltYXRpb24uRGVjZWxlcmF0ZUludGVycG9sYXRvcjsKLWltcG9ydCBhbmRyb2lkLnZpZXcuYW5pbWF0aW9uLkludGVycG9sYXRvcjsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIHBlcmZvcm1zIHRoZSBnbG93IGVmZmVjdCB1c2VkIGF0IHRoZSBlZGdlcyBvZiBzY3JvbGxhYmxlIHdpZGdldHMuCi0gKiBAaGlkZQotICovCi1wdWJsaWMgY2xhc3MgRWRnZUdsb3cgewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiRWRnZUdsb3ciOwotCi0gICAgLy8gVGltZSBpdCB3aWxsIHRha2UgdGhlIGVmZmVjdCB0byBmdWxseSByZWNlZGUgaW4gbXMKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUkVDRURFX1RJTUUgPSAxMDAwOwotCi0gICAgLy8gVGltZSBpdCB3aWxsIHRha2UgYmVmb3JlIGEgcHVsbGVkIGdsb3cgYmVnaW5zIHJlY2VkaW5nCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFBVTExfVElNRSA9IDI1MDsKLQotICAgIC8vIFRpbWUgaXQgd2lsbCB0YWtlIGZvciBhIHB1bGxlZCBnbG93IHRvIGRlY2F5IHRvIHBhcnRpYWwgc3RyZW5ndGggYmVmb3JlIHJlbGVhc2UKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUFVMTF9ERUNBWV9USU1FID0gMTAwMDsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGZsb2F0IEhFTERfRURHRV9BTFBIQSA9IDAuN2Y7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgZmxvYXQgSEVMRF9FREdFX1NDQUxFX1kgPSAwLjVmOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGZsb2F0IEhFTERfR0xPV19BTFBIQSA9IDAuNWY7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgZmxvYXQgSEVMRF9HTE9XX1NDQUxFX1kgPSAwLjVmOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgZmxvYXQgTUFYX0dMT1dfSEVJR0hUID0gMC4zM2Y7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBmbG9hdCBQVUxMX0dMT1dfQkVHSU4gPSAwLjVmOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGZsb2F0IFBVTExfRURHRV9CRUdJTiA9IDAuNmY7Ci0KLSAgICAvLyBNaW5pbXVtIHZlbG9jaXR5IHRoYXQgd2lsbCBiZSBhYnNvcmJlZAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNSU5fVkVMT0NJVFkgPSA3NTA7Ci0gICAgCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgZmxvYXQgRVBTSUxPTiA9IDAuMDAxZjsKLQotICAgIHByaXZhdGUgRHJhd2FibGUgbUVkZ2U7Ci0gICAgcHJpdmF0ZSBEcmF3YWJsZSBtR2xvdzsKLSAgICBwcml2YXRlIGludCBtV2lkdGg7Ci0gICAgcHJpdmF0ZSBpbnQgbUhlaWdodDsKLQotICAgIHByaXZhdGUgZmxvYXQgbUVkZ2VBbHBoYTsKLSAgICBwcml2YXRlIGZsb2F0IG1FZGdlU2NhbGVZOwotICAgIHByaXZhdGUgZmxvYXQgbUdsb3dBbHBoYTsKLSAgICBwcml2YXRlIGZsb2F0IG1HbG93U2NhbGVZOwotCi0gICAgcHJpdmF0ZSBmbG9hdCBtRWRnZUFscGhhU3RhcnQ7Ci0gICAgcHJpdmF0ZSBmbG9hdCBtRWRnZUFscGhhRmluaXNoOwotICAgIHByaXZhdGUgZmxvYXQgbUVkZ2VTY2FsZVlTdGFydDsKLSAgICBwcml2YXRlIGZsb2F0IG1FZGdlU2NhbGVZRmluaXNoOwotICAgIHByaXZhdGUgZmxvYXQgbUdsb3dBbHBoYVN0YXJ0OwotICAgIHByaXZhdGUgZmxvYXQgbUdsb3dBbHBoYUZpbmlzaDsKLSAgICBwcml2YXRlIGZsb2F0IG1HbG93U2NhbGVZU3RhcnQ7Ci0gICAgcHJpdmF0ZSBmbG9hdCBtR2xvd1NjYWxlWUZpbmlzaDsKLQotICAgIHByaXZhdGUgbG9uZyBtU3RhcnRUaW1lOwotICAgIHByaXZhdGUgaW50IG1EdXJhdGlvbjsKLQotICAgIHByaXZhdGUgSW50ZXJwb2xhdG9yIG1JbnRlcnBvbGF0b3I7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU1RBVEVfSURMRSA9IDA7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNUQVRFX1BVTEwgPSAxOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTVEFURV9BQlNPUkIgPSAyOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTVEFURV9SRUNFREUgPSAzOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTVEFURV9QVUxMX0RFQ0FZID0gNDsKLQotICAgIHByaXZhdGUgaW50IG1TdGF0ZSA9IFNUQVRFX0lETEU7Ci0KLSAgICBwcml2YXRlIGZsb2F0IG1QdWxsRGlzdGFuY2U7Ci0KLSAgICBwdWJsaWMgRWRnZUdsb3coRHJhd2FibGUgZWRnZSwgRHJhd2FibGUgZ2xvdykgewotICAgICAgICBtRWRnZSA9IGVkZ2U7Ci0gICAgICAgIG1HbG93ID0gZ2xvdzsKLQotICAgICAgICBtSW50ZXJwb2xhdG9yID0gbmV3IERlY2VsZXJhdGVJbnRlcnBvbGF0b3IoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRTaXplKGludCB3aWR0aCwgaW50IGhlaWdodCkgewotICAgICAgICBtV2lkdGggPSB3aWR0aDsKLSAgICAgICAgbUhlaWdodCA9IGhlaWdodDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0ZpbmlzaGVkKCkgewotICAgICAgICByZXR1cm4gbVN0YXRlID09IFNUQVRFX0lETEU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZmluaXNoKCkgewotICAgICAgICBtU3RhdGUgPSBTVEFURV9JRExFOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENhbGwgd2hlbiB0aGUgb2JqZWN0IGlzIHB1bGxlZCBieSB0aGUgdXNlci4KLSAgICAgKiBAcGFyYW0gZGVsdGFEaXN0YW5jZSBDaGFuZ2UgaW4gZGlzdGFuY2Ugc2luY2UgdGhlIGxhc3QgY2FsbAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIG9uUHVsbChmbG9hdCBkZWx0YURpc3RhbmNlKSB7Ci0gICAgICAgIGZpbmFsIGxvbmcgbm93ID0gQW5pbWF0aW9uVXRpbHMuY3VycmVudEFuaW1hdGlvblRpbWVNaWxsaXMoKTsKLSAgICAgICAgaWYgKG1TdGF0ZSA9PSBTVEFURV9QVUxMX0RFQ0FZICYmIG5vdyAtIG1TdGFydFRpbWUgPCBtRHVyYXRpb24pIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBpZiAobVN0YXRlICE9IFNUQVRFX1BVTEwpIHsKLSAgICAgICAgICAgIG1HbG93U2NhbGVZID0gUFVMTF9HTE9XX0JFR0lOOwotICAgICAgICB9Ci0gICAgICAgIG1TdGF0ZSA9IFNUQVRFX1BVTEw7Ci0KLSAgICAgICAgbVN0YXJ0VGltZSA9IG5vdzsKLSAgICAgICAgbUR1cmF0aW9uID0gUFVMTF9USU1FOwotCi0gICAgICAgIG1QdWxsRGlzdGFuY2UgKz0gZGVsdGFEaXN0YW5jZTsKLSAgICAgICAgZmxvYXQgZGlzdGFuY2UgPSBNYXRoLmFicyhtUHVsbERpc3RhbmNlKTsKLQotICAgICAgICBtRWRnZUFscGhhID0gbUVkZ2VBbHBoYVN0YXJ0ID0gTWF0aC5tYXgoUFVMTF9FREdFX0JFR0lOLCBNYXRoLm1pbihkaXN0YW5jZSwgMS5mKSk7Ci0gICAgICAgIG1FZGdlU2NhbGVZID0gbUVkZ2VTY2FsZVlTdGFydCA9IE1hdGgubWF4KEhFTERfRURHRV9TQ0FMRV9ZLCBNYXRoLm1pbihkaXN0YW5jZSwgMi5mKSk7Ci0KLSAgICAgICAgbUdsb3dBbHBoYSA9IG1HbG93QWxwaGFTdGFydCA9IE1hdGgubWF4KDAuNWYsCi0gICAgICAgICAgICAgICAgTWF0aC5taW4obUdsb3dBbHBoYSArIE1hdGguYWJzKGRlbHRhRGlzdGFuY2UpLCAxLmYpKTsKLQotICAgICAgICBmbG9hdCBnbG93Q2hhbmdlID0gTWF0aC5hYnMoZGVsdGFEaXN0YW5jZSk7Ci0gICAgICAgIGlmIChkZWx0YURpc3RhbmNlID4gMCAmJiBtUHVsbERpc3RhbmNlIDwgMCkgewotICAgICAgICAgICAgZ2xvd0NoYW5nZSA9IC1nbG93Q2hhbmdlOwotICAgICAgICB9Ci0gICAgICAgIGlmIChtUHVsbERpc3RhbmNlID09IDApIHsKLSAgICAgICAgICAgIG1HbG93U2NhbGVZID0gMDsKLSAgICAgICAgfQotICAgICAgICBtR2xvd1NjYWxlWSA9IG1HbG93U2NhbGVZU3RhcnQgPSBNYXRoLm1heCgwLCBtR2xvd1NjYWxlWSArIGdsb3dDaGFuZ2UgKiAyKTsKLQotICAgICAgICBtRWRnZUFscGhhRmluaXNoID0gbUVkZ2VBbHBoYTsKLSAgICAgICAgbUVkZ2VTY2FsZVlGaW5pc2ggPSBtRWRnZVNjYWxlWTsKLSAgICAgICAgbUdsb3dBbHBoYUZpbmlzaCA9IG1HbG93QWxwaGE7Ci0gICAgICAgIG1HbG93U2NhbGVZRmluaXNoID0gbUdsb3dTY2FsZVk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2FsbCB3aGVuIHRoZSBvYmplY3QgaXMgcmVsZWFzZWQgYWZ0ZXIgYmVpbmcgcHVsbGVkLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIG9uUmVsZWFzZSgpIHsKLSAgICAgICAgbVB1bGxEaXN0YW5jZSA9IDA7Ci0KLSAgICAgICAgaWYgKG1TdGF0ZSAhPSBTVEFURV9QVUxMICYmIG1TdGF0ZSAhPSBTVEFURV9QVUxMX0RFQ0FZKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBtU3RhdGUgPSBTVEFURV9SRUNFREU7Ci0gICAgICAgIG1FZGdlQWxwaGFTdGFydCA9IG1FZGdlQWxwaGE7Ci0gICAgICAgIG1FZGdlU2NhbGVZU3RhcnQgPSBtRWRnZVNjYWxlWTsKLSAgICAgICAgbUdsb3dBbHBoYVN0YXJ0ID0gbUdsb3dBbHBoYTsKLSAgICAgICAgbUdsb3dTY2FsZVlTdGFydCA9IG1HbG93U2NhbGVZOwotCi0gICAgICAgIG1FZGdlQWxwaGFGaW5pc2ggPSAwLmY7Ci0gICAgICAgIG1FZGdlU2NhbGVZRmluaXNoID0gMC4xZjsKLSAgICAgICAgbUdsb3dBbHBoYUZpbmlzaCA9IDAuZjsKLSAgICAgICAgbUdsb3dTY2FsZVlGaW5pc2ggPSAwLjFmOwotCi0gICAgICAgIG1TdGFydFRpbWUgPSBBbmltYXRpb25VdGlscy5jdXJyZW50QW5pbWF0aW9uVGltZU1pbGxpcygpOwotICAgICAgICBtRHVyYXRpb24gPSBSRUNFREVfVElNRTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDYWxsIHdoZW4gdGhlIGVmZmVjdCBhYnNvcmJzIGFuIGltcGFjdCBhdCB0aGUgZ2l2ZW4gdmVsb2NpdHkuCi0gICAgICogQHBhcmFtIHZlbG9jaXR5IFZlbG9jaXR5IGF0IGltcGFjdCBpbiBwaXhlbHMgcGVyIHNlY29uZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBvbkFic29yYihpbnQgdmVsb2NpdHkpIHsKLSAgICAgICAgbVN0YXRlID0gU1RBVEVfQUJTT1JCOwotICAgICAgICB2ZWxvY2l0eSA9IE1hdGgubWF4KE1JTl9WRUxPQ0lUWSwgTWF0aC5hYnModmVsb2NpdHkpKTsKLQotICAgICAgICBtU3RhcnRUaW1lID0gQW5pbWF0aW9uVXRpbHMuY3VycmVudEFuaW1hdGlvblRpbWVNaWxsaXMoKTsKLSAgICAgICAgbUR1cmF0aW9uID0gKGludCkgKHZlbG9jaXR5ICogMC4wM2YpOwotCi0gICAgICAgIG1FZGdlQWxwaGFTdGFydCA9IDAuNWY7Ci0gICAgICAgIG1FZGdlU2NhbGVZU3RhcnQgPSAwLjJmOwotICAgICAgICBtR2xvd0FscGhhU3RhcnQgPSAwLjVmOwotICAgICAgICBtR2xvd1NjYWxlWVN0YXJ0ID0gMC5mOwotCi0gICAgICAgIG1FZGdlQWxwaGFGaW5pc2ggPSBNYXRoLm1heCgwLCBNYXRoLm1pbih2ZWxvY2l0eSAqIDAuMDFmLCAxKSk7Ci0gICAgICAgIG1FZGdlU2NhbGVZRmluaXNoID0gMS5mOwotICAgICAgICBtR2xvd0FscGhhRmluaXNoID0gMS5mOwotICAgICAgICBtR2xvd1NjYWxlWUZpbmlzaCA9IE1hdGgubWluKHZlbG9jaXR5ICogMC4wMDFmLCAxKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBEcmF3IGludG8gdGhlIHByb3ZpZGVkIGNhbnZhcy4KLSAgICAgKiBBc3N1bWVzIHRoYXQgdGhlIGNhbnZhcyBoYXMgYmVlbiByb3RhdGVkIGFjY29yZGluZ2x5IGFuZCB0aGUgc2l6ZSBoYXMgYmVlbiBzZXQuCi0gICAgICogVGhlIGVmZmVjdCB3aWxsIGJlIGRyYXduIHRoZSBmdWxsIHdpZHRoIG9mIFg9MCB0byBYPXdpZHRoLCBlbWl0dGluZyBmcm9tIFk9MCBhbmQgZXh0ZW5kaW5nCi0gICAgICogdG8gc29tZSBmYWN0b3IgPCAxLmYgb2YgaGVpZ2h0LgotICAgICAqCi0gICAgICogQHBhcmFtIGNhbnZhcyBDYW52YXMgdG8gZHJhdyBpbnRvCi0gICAgICogQHJldHVybiB0cnVlIGlmIGRyYXdpbmcgc2hvdWxkIGNvbnRpbnVlIGJleW9uZCB0aGlzIGZyYW1lIHRvIGNvbnRpbnVlIHRoZSBhbmltYXRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBkcmF3KENhbnZhcyBjYW52YXMpIHsKLSAgICAgICAgdXBkYXRlKCk7Ci0KLSAgICAgICAgZmluYWwgaW50IGVkZ2VIZWlnaHQgPSBtRWRnZS5nZXRJbnRyaW5zaWNIZWlnaHQoKTsKLSAgICAgICAgZmluYWwgaW50IGdsb3dIZWlnaHQgPSBtR2xvdy5nZXRJbnRyaW5zaWNIZWlnaHQoKTsKLQotICAgICAgICBmaW5hbCBmbG9hdCBkaXN0U2NhbGUgPSAoZmxvYXQpIG1IZWlnaHQgLyBtV2lkdGg7Ci0KLSAgICAgICAgbUdsb3cuc2V0QWxwaGEoKGludCkgKE1hdGgubWF4KDAsIE1hdGgubWluKG1HbG93QWxwaGEsIDEpKSAqIDI1NSkpOwotICAgICAgICBtR2xvdy5zZXRCb3VuZHMoMCwgMCwgbVdpZHRoLCAoaW50KSBNYXRoLm1pbihnbG93SGVpZ2h0ICogbUdsb3dTY2FsZVkgKiBkaXN0U2NhbGUgKiAwLjZmLAotICAgICAgICAgICAgICAgIG1IZWlnaHQgKiBNQVhfR0xPV19IRUlHSFQpKTsKLSAgICAgICAgbUdsb3cuZHJhdyhjYW52YXMpOwotCi0gICAgICAgIG1FZGdlLnNldEFscGhhKChpbnQpIChNYXRoLm1heCgwLCBNYXRoLm1pbihtRWRnZUFscGhhLCAxKSkgKiAyNTUpKTsKLSAgICAgICAgbUVkZ2Uuc2V0Qm91bmRzKDAsCi0gICAgICAgICAgICAgICAgMCwKLSAgICAgICAgICAgICAgICBtV2lkdGgsCi0gICAgICAgICAgICAgICAgKGludCkgKGVkZ2VIZWlnaHQgKiBtRWRnZVNjYWxlWSkpOwotICAgICAgICBtRWRnZS5kcmF3KGNhbnZhcyk7Ci0KLSAgICAgICAgcmV0dXJuIG1TdGF0ZSAhPSBTVEFURV9JRExFOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCB1cGRhdGUoKSB7Ci0gICAgICAgIGZpbmFsIGxvbmcgdGltZSA9IEFuaW1hdGlvblV0aWxzLmN1cnJlbnRBbmltYXRpb25UaW1lTWlsbGlzKCk7Ci0gICAgICAgIGZpbmFsIGZsb2F0IHQgPSBNYXRoLm1pbigoZmxvYXQpICh0aW1lIC0gbVN0YXJ0VGltZSkgLyBtRHVyYXRpb24sIDEuZik7Ci0KLSAgICAgICAgZmluYWwgZmxvYXQgaW50ZXJwID0gbUludGVycG9sYXRvci5nZXRJbnRlcnBvbGF0aW9uKHQpOwotCi0gICAgICAgIG1FZGdlQWxwaGEgPSBtRWRnZUFscGhhU3RhcnQgKyAobUVkZ2VBbHBoYUZpbmlzaCAtIG1FZGdlQWxwaGFTdGFydCkgKiBpbnRlcnA7Ci0gICAgICAgIG1FZGdlU2NhbGVZID0gbUVkZ2VTY2FsZVlTdGFydCArIChtRWRnZVNjYWxlWUZpbmlzaCAtIG1FZGdlU2NhbGVZU3RhcnQpICogaW50ZXJwOwotICAgICAgICBtR2xvd0FscGhhID0gbUdsb3dBbHBoYVN0YXJ0ICsgKG1HbG93QWxwaGFGaW5pc2ggLSBtR2xvd0FscGhhU3RhcnQpICogaW50ZXJwOwotICAgICAgICBtR2xvd1NjYWxlWSA9IG1HbG93U2NhbGVZU3RhcnQgKyAobUdsb3dTY2FsZVlGaW5pc2ggLSBtR2xvd1NjYWxlWVN0YXJ0KSAqIGludGVycDsKLQotICAgICAgICBpZiAodCA+PSAxLmYgLSBFUFNJTE9OKSB7Ci0gICAgICAgICAgICBzd2l0Y2ggKG1TdGF0ZSkgewotICAgICAgICAgICAgICAgIGNhc2UgU1RBVEVfQUJTT1JCOgotICAgICAgICAgICAgICAgICAgICBtU3RhdGUgPSBTVEFURV9SRUNFREU7Ci0gICAgICAgICAgICAgICAgICAgIG1TdGFydFRpbWUgPSBBbmltYXRpb25VdGlscy5jdXJyZW50QW5pbWF0aW9uVGltZU1pbGxpcygpOwotICAgICAgICAgICAgICAgICAgICBtRHVyYXRpb24gPSBSRUNFREVfVElNRTsKLQotICAgICAgICAgICAgICAgICAgICBtRWRnZUFscGhhU3RhcnQgPSBtRWRnZUFscGhhOwotICAgICAgICAgICAgICAgICAgICBtRWRnZVNjYWxlWVN0YXJ0ID0gbUVkZ2VTY2FsZVk7Ci0gICAgICAgICAgICAgICAgICAgIG1HbG93QWxwaGFTdGFydCA9IG1HbG93QWxwaGE7Ci0gICAgICAgICAgICAgICAgICAgIG1HbG93U2NhbGVZU3RhcnQgPSBtR2xvd1NjYWxlWTsKLQotICAgICAgICAgICAgICAgICAgICBtRWRnZUFscGhhRmluaXNoID0gMC5mOwotICAgICAgICAgICAgICAgICAgICBtRWRnZVNjYWxlWUZpbmlzaCA9IDAuMWY7Ci0gICAgICAgICAgICAgICAgICAgIG1HbG93QWxwaGFGaW5pc2ggPSAwLmY7Ci0gICAgICAgICAgICAgICAgICAgIG1HbG93U2NhbGVZRmluaXNoID0gbUdsb3dTY2FsZVk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgU1RBVEVfUFVMTDoKLSAgICAgICAgICAgICAgICAgICAgbVN0YXRlID0gU1RBVEVfUFVMTF9ERUNBWTsKLSAgICAgICAgICAgICAgICAgICAgbVN0YXJ0VGltZSA9IEFuaW1hdGlvblV0aWxzLmN1cnJlbnRBbmltYXRpb25UaW1lTWlsbGlzKCk7Ci0gICAgICAgICAgICAgICAgICAgIG1EdXJhdGlvbiA9IFBVTExfREVDQVlfVElNRTsKLQotICAgICAgICAgICAgICAgICAgICBtRWRnZUFscGhhU3RhcnQgPSBtRWRnZUFscGhhOwotICAgICAgICAgICAgICAgICAgICBtRWRnZVNjYWxlWVN0YXJ0ID0gbUVkZ2VTY2FsZVk7Ci0gICAgICAgICAgICAgICAgICAgIG1HbG93QWxwaGFTdGFydCA9IG1HbG93QWxwaGE7Ci0gICAgICAgICAgICAgICAgICAgIG1HbG93U2NhbGVZU3RhcnQgPSBtR2xvd1NjYWxlWTsKLQotICAgICAgICAgICAgICAgICAgICBtRWRnZUFscGhhRmluaXNoID0gTWF0aC5taW4obUVkZ2VBbHBoYVN0YXJ0LCBIRUxEX0VER0VfQUxQSEEpOwotICAgICAgICAgICAgICAgICAgICBtRWRnZVNjYWxlWUZpbmlzaCA9IE1hdGgubWluKG1FZGdlU2NhbGVZU3RhcnQsIEhFTERfRURHRV9TQ0FMRV9ZKTsKLSAgICAgICAgICAgICAgICAgICAgbUdsb3dBbHBoYUZpbmlzaCA9IE1hdGgubWluKG1HbG93QWxwaGFTdGFydCwgSEVMRF9HTE9XX0FMUEhBKTsKLSAgICAgICAgICAgICAgICAgICAgbUdsb3dTY2FsZVlGaW5pc2ggPSBNYXRoLm1pbihtR2xvd1NjYWxlWSwgSEVMRF9HTE9XX1NDQUxFX1kpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIFNUQVRFX1BVTExfREVDQVk6Ci0gICAgICAgICAgICAgICAgICAgIC8vIERvIG5vdGhpbmc7IHdhaXQgZm9yIHJlbGVhc2UKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBTVEFURV9SRUNFREU6Ci0gICAgICAgICAgICAgICAgICAgIG1TdGF0ZSA9IFNUQVRFX0lETEU7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L0ZyYW1lTGF5b3V0LmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvRnJhbWVMYXlvdXQuamF2YQppbmRleCBlNDQ1MTgwLi41NTlhNWZlIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvRnJhbWVMYXlvdXQuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvRnJhbWVMYXlvdXQuamF2YQpAQCAtMzIsOCArMzIsOCBAQAogCiAvKioKICAqIEZyYW1lTGF5b3V0IGlzIGRlc2lnbmVkIHRvIGJsb2NrIG91dCBhbiBhcmVhIG9uIHRoZSBzY3JlZW4gdG8gZGlzcGxheQotICogYSBzaW5nbGUgaXRlbS4gWW91IGNhbiBhZGQgbXVsdGlwbGUgY2hpbGRyZW4gdG8gYSBGcmFtZUxheW91dCwgYnV0IGFsbAotICogY2hpbGRyZW4gYXJlIHBlZ2dlZCB0byB0aGUgdG9wIGxlZnQgb2YgdGhlIHNjcmVlbi4KKyAqIGEgc2luZ2xlIGl0ZW0uIFlvdSBjYW4gYWRkIG11bHRpcGxlIGNoaWxkcmVuIHRvIGEgRnJhbWVMYXlvdXQgYW5kIGNvbnRyb2wgdGhlaXIKKyAqIHBvc2l0aW9uIHdpdGhpbiB0aGUgRnJhbWVMYXlvdXQgdXNpbmcge0BsaW5rIGFuZHJvaWQud2lkZ2V0LkZyYW1lTGF5b3V0LkxheW91dFBhcmFtcyNncmF2aXR5fS4KICAqIENoaWxkcmVuIGFyZSBkcmF3biBpbiBhIHN0YWNrLCB3aXRoIHRoZSBtb3N0IHJlY2VudGx5IGFkZGVkIGNoaWxkIG9uIHRvcC4KICAqIFRoZSBzaXplIG9mIHRoZSBmcmFtZSBsYXlvdXQgaXMgdGhlIHNpemUgb2YgaXRzIGxhcmdlc3QgY2hpbGQgKHBsdXMgcGFkZGluZyksIHZpc2libGUKICAqIG9yIG5vdCAoaWYgdGhlIEZyYW1lTGF5b3V0J3MgcGFyZW50IHBlcm1pdHMpLiBWaWV3cyB0aGF0IGFyZSBHT05FIGFyZSB1c2VkIGZvciBzaXppbmcKQEAgLTQ0MCw2ICs0NDAsOCBAQAogICAgICAqIFBlci1jaGlsZCBsYXlvdXQgaW5mb3JtYXRpb24gZm9yIGxheW91dHMgdGhhdCBzdXBwb3J0IG1hcmdpbnMuCiAgICAgICogU2VlIHtAbGluayBhbmRyb2lkLlIuc3R5bGVhYmxlI0ZyYW1lTGF5b3V0X0xheW91dCBGcmFtZUxheW91dCBMYXlvdXQgQXR0cmlidXRlc30KICAgICAgKiBmb3IgYSBsaXN0IG9mIGFsbCBjaGlsZCB2aWV3IGF0dHJpYnV0ZXMgdGhhdCB0aGlzIGNsYXNzIHN1cHBvcnRzLgorICAgICAqIAorICAgICAqIEBhdHRyIHJlZiBhbmRyb2lkLlIuc3R5bGVhYmxlI0ZyYW1lTGF5b3V0X0xheW91dF9sYXlvdXRfZ3Jhdml0eQogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgTGF5b3V0UGFyYW1zIGV4dGVuZHMgTWFyZ2luTGF5b3V0UGFyYW1zIHsKICAgICAgICAgLyoqCkBAIC00NDcsNiArNDQ5LDggQEAKICAgICAgICAgICogYXJlIGFzc29jaWF0ZWQuCiAgICAgICAgICAqCiAgICAgICAgICAqIEBzZWUgYW5kcm9pZC52aWV3LkdyYXZpdHkKKyAgICAgICAgICogCisgICAgICAgICAqIEBhdHRyIHJlZiBhbmRyb2lkLlIuc3R5bGVhYmxlI0ZyYW1lTGF5b3V0X0xheW91dF9sYXlvdXRfZ3Jhdml0eQogICAgICAgICAgKi8KICAgICAgICAgcHVibGljIGludCBncmF2aXR5ID0gLTE7CiAKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9HYWxsZXJ5LmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvR2FsbGVyeS5qYXZhCmluZGV4IGNjZDM3ZDMuLjk3ODk2NTggMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9HYWxsZXJ5LmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L0dhbGxlcnkuamF2YQpAQCAtMTIxMCw3ICsxMjEwLDcgQEAKIAogICAgICAgICAvLyBXZSB1bmZvY3VzIHRoZSBvbGQgY2hpbGQgZG93biBoZXJlIHNvIHRoZSBhYm92ZSBoYXNGb2N1cyBjaGVjawogICAgICAgICAvLyByZXR1cm5zIHRydWUKLSAgICAgICAgaWYgKG9sZFNlbGVjdGVkQ2hpbGQgIT0gbnVsbCkgeworICAgICAgICBpZiAob2xkU2VsZWN0ZWRDaGlsZCAhPSBudWxsICYmIG9sZFNlbGVjdGVkQ2hpbGQgIT0gY2hpbGQpIHsKIAogICAgICAgICAgICAgLy8gTWFrZSBzdXJlIGl0cyBkcmF3YWJsZSBzdGF0ZSBkb2Vzbid0IGNvbnRhaW4gJ3NlbGVjdGVkJwogICAgICAgICAgICAgb2xkU2VsZWN0ZWRDaGlsZC5zZXRTZWxlY3RlZChmYWxzZSk7CkBAIC0xMjY2LDYgKzEyNjYsNyBAQAogICAgICAgICAgKi8KICAgICAgICAgaWYgKGdhaW5Gb2N1cyAmJiBtU2VsZWN0ZWRDaGlsZCAhPSBudWxsKSB7CiAgICAgICAgICAgICBtU2VsZWN0ZWRDaGlsZC5yZXF1ZXN0Rm9jdXMoZGlyZWN0aW9uKTsKKyAgICAgICAgICAgIG1TZWxlY3RlZENoaWxkLnNldFNlbGVjdGVkKHRydWUpOwogICAgICAgICB9CiAKICAgICB9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvR3JpZFZpZXcuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9HcmlkVmlldy5qYXZhCmluZGV4IGE3MzAwYzIuLjQ2YzdkMzMgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9HcmlkVmlldy5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9HcmlkVmlldy5qYXZhCkBAIC0xNywxNSArMTcsMTggQEAKIHBhY2thZ2UgYW5kcm9pZC53aWRnZXQ7CiAKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuVHlwZWRBcnJheTsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlJlY3Q7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldDsKIGltcG9ydCBhbmRyb2lkLnZpZXcuR3Jhdml0eTsKIGltcG9ydCBhbmRyb2lkLnZpZXcuS2V5RXZlbnQ7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LlZpZXdHcm91cDsKIGltcG9ydCBhbmRyb2lkLnZpZXcuU291bmRFZmZlY3RDb25zdGFudHM7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXdEZWJ1ZzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlld0dyb3VwOwogaW1wb3J0IGFuZHJvaWQudmlldy5hbmltYXRpb24uR3JpZExheW91dEFuaW1hdGlvbkNvbnRyb2xsZXI7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuUmVtb3RlVmlld3MuUmVtb3RlVmlldzsKIAogCiAvKioKQEAgLTM1LDYgKzM4LDcgQEAKICAqIDxwPlNlZSB0aGUgPGEgaHJlZj0ie0Bkb2NSb290fXJlc291cmNlcy90dXRvcmlhbHMvdmlld3MvaGVsbG8tZ3JpZHZpZXcuaHRtbCI+R3JpZAogICogVmlldyB0dXRvcmlhbDwvYT4uPC9wPgogICovCitAUmVtb3RlVmlldwogcHVibGljIGNsYXNzIEdyaWRWaWV3IGV4dGVuZHMgQWJzTGlzdFZpZXcgewogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE5PX1NUUkVUQ0ggPSAwOwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUUkVUQ0hfU1BBQ0lORyA9IDE7CkBAIC0xMDMsMTkgKzEwNyw0OSBAQAogICAgICAgICBhLnJlY3ljbGUoKTsKICAgICB9CiAKKyAgICAvKioKKyAgICAgKiBTZXQgaG93IHRoZSB1c2VyIG1heSBzZWxlY3QgaXRlbXMgZnJvbSB0aGUgZ3JpZC4KKyAgICAgKgorICAgICAqIDxwPkdyaWRWaWV3IG9ubHkgc3VwcG9ydHMge0BsaW5rIEFic0xpc3RWaWV3I0NIT0lDRV9NT0RFX05PTkV9IGFuZAorICAgICAqIHtAbGluayBBYnNMaXN0VmlldyNDSE9JQ0VfTU9ERV9NVUxUSVBMRV9NT0RBTH0uIEF0dGVtcHRpbmcgdG8gc2V0IGFuIHVuc3VwcG9ydGVkIGNob2ljZQorICAgICAqIG1vZGUgd2lsbCB0aHJvdyBhbiBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbi4KKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBzZXRDaG9pY2VNb2RlKGludCBjaG9pY2VNb2RlKSB7CisgICAgICAgIHN3aXRjaCAoY2hvaWNlTW9kZSkgeworICAgICAgICBjYXNlIENIT0lDRV9NT0RFX05PTkU6CisgICAgICAgIGNhc2UgQ0hPSUNFX01PREVfTVVMVElQTEVfTU9EQUw6CisgICAgICAgICAgICBzdXBlci5zZXRDaG9pY2VNb2RlKGNob2ljZU1vZGUpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiVW5zdXBwb3J0ZWQgY2hvaWNlIG1vZGUgIiArIGNob2ljZU1vZGUpOworICAgICAgICB9CisgICAgfQorCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIExpc3RBZGFwdGVyIGdldEFkYXB0ZXIoKSB7CiAgICAgICAgIHJldHVybiBtQWRhcHRlcjsKICAgICB9CiAKICAgICAvKioKKyAgICAgKiBTZXRzIHVwIHRoaXMgQWJzTGlzdFZpZXcgdG8gdXNlIGEgcmVtb3RlIHZpZXdzIGFkYXB0ZXIgd2hpY2ggY29ubmVjdHMgdG8gYSBSZW1vdGVWaWV3c1NlcnZpY2UKKyAgICAgKiB0aHJvdWdoIHRoZSBzcGVjaWZpZWQgaW50ZW50LgorICAgICAqIEBwYXJhbSBpbnRlbnQgdGhlIGludGVudCB1c2VkIHRvIGlkZW50aWZ5IHRoZSBSZW1vdGVWaWV3c1NlcnZpY2UgZm9yIHRoZSBhZGFwdGVyIHRvIGNvbm5lY3QgdG8uCisgICAgICovCisgICAgQGFuZHJvaWQudmlldy5SZW1vdGFibGVWaWV3TWV0aG9kCisgICAgcHVibGljIHZvaWQgc2V0UmVtb3RlVmlld3NBZGFwdGVyKEludGVudCBpbnRlbnQpIHsKKyAgICAgICAgc3VwZXIuc2V0UmVtb3RlVmlld3NBZGFwdGVyKGludGVudCk7CisgICAgfQorCisgICAgLyoqCiAgICAgICogU2V0cyB0aGUgZGF0YSBiZWhpbmQgdGhpcyBHcmlkVmlldy4KICAgICAgKgogICAgICAqIEBwYXJhbSBhZGFwdGVyIHRoZSBhZGFwdGVyIHByb3ZpZGluZyB0aGUgZ3JpZCdzIGRhdGEKICAgICAgKi8KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBzZXRBZGFwdGVyKExpc3RBZGFwdGVyIGFkYXB0ZXIpIHsKLSAgICAgICAgaWYgKG51bGwgIT0gbUFkYXB0ZXIpIHsKKyAgICAgICAgaWYgKG1BZGFwdGVyICE9IG51bGwgJiYgbURhdGFTZXRPYnNlcnZlciAhPSBudWxsKSB7CiAgICAgICAgICAgICBtQWRhcHRlci51bnJlZ2lzdGVyRGF0YVNldE9ic2VydmVyKG1EYXRhU2V0T2JzZXJ2ZXIpOwogICAgICAgICB9CiAKQEAgLTEyNSw3ICsxNTksMTAgQEAKIAogICAgICAgICBtT2xkU2VsZWN0ZWRQb3NpdGlvbiA9IElOVkFMSURfUE9TSVRJT047CiAgICAgICAgIG1PbGRTZWxlY3RlZFJvd0lkID0gSU5WQUxJRF9ST1dfSUQ7Ci0gICAgICAgIAorCisgICAgICAgIC8vIEFic0xpc3RWaWV3I3NldEFkYXB0ZXIgd2lsbCB1cGRhdGUgY2hvaWNlIG1vZGUgc3RhdGVzLgorICAgICAgICBzdXBlci5zZXRBZGFwdGVyKGFkYXB0ZXIpOworCiAgICAgICAgIGlmIChtQWRhcHRlciAhPSBudWxsKSB7CiAgICAgICAgICAgICBtT2xkSXRlbUNvdW50ID0gbUl0ZW1Db3VudDsKICAgICAgICAgICAgIG1JdGVtQ291bnQgPSBtQWRhcHRlci5nZXRDb3VudCgpOwpAQCAtNzQyLDYgKzc3OSwyNiBAQAogICAgIH0KIAogICAgIC8qKgorICAgICAqIFNtb290aGx5IHNjcm9sbCB0byB0aGUgc3BlY2lmaWVkIGFkYXB0ZXIgcG9zaXRpb24uIFRoZSB2aWV3IHdpbGwKKyAgICAgKiBzY3JvbGwgc3VjaCB0aGF0IHRoZSBpbmRpY2F0ZWQgcG9zaXRpb24gaXMgZGlzcGxheWVkLgorICAgICAqIEBwYXJhbSBwb3NpdGlvbiBTY3JvbGwgdG8gdGhpcyBhZGFwdGVyIHBvc2l0aW9uLgorICAgICAqLworICAgIEBhbmRyb2lkLnZpZXcuUmVtb3RhYmxlVmlld01ldGhvZAorICAgIHB1YmxpYyB2b2lkIHNtb290aFNjcm9sbFRvUG9zaXRpb24oaW50IHBvc2l0aW9uKSB7CisgICAgICAgIHN1cGVyLnNtb290aFNjcm9sbFRvUG9zaXRpb24ocG9zaXRpb24pOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNtb290aGx5IHNjcm9sbCB0byB0aGUgc3BlY2lmaWVkIGFkYXB0ZXIgcG9zaXRpb24gb2Zmc2V0LiBUaGUgdmlldyB3aWxsCisgICAgICogc2Nyb2xsIHN1Y2ggdGhhdCB0aGUgaW5kaWNhdGVkIHBvc2l0aW9uIGlzIGRpc3BsYXllZC4KKyAgICAgKiBAcGFyYW0gb2Zmc2V0IFRoZSBhbW91bnQgdG8gb2Zmc2V0IGZyb20gdGhlIGFkYXB0ZXIgcG9zaXRpb24gdG8gc2Nyb2xsIHRvLgorICAgICAqLworICAgIEBhbmRyb2lkLnZpZXcuUmVtb3RhYmxlVmlld01ldGhvZAorICAgIHB1YmxpYyB2b2lkIHNtb290aFNjcm9sbEJ5T2Zmc2V0KGludCBvZmZzZXQpIHsKKyAgICAgICAgc3VwZXIuc21vb3RoU2Nyb2xsQnlPZmZzZXQob2Zmc2V0KTsKKyAgICB9CisKKyAgICAvKioKICAgICAgKiBGaWxscyB0aGUgZ3JpZCBiYXNlZCBvbiBwb3NpdGlvbmluZyB0aGUgbmV3IHNlbGVjdGlvbiByZWxhdGl2ZSB0byB0aGUgb2xkCiAgICAgICogc2VsZWN0aW9uLiBUaGUgbmV3IHNlbGVjdGlvbiB3aWxsIGJlIHBsYWNlZCBhdCwgYWJvdmUsIG9yIGJlbG93IHRoZQogICAgICAqIGxvY2F0aW9uIG9mIHRoZSBuZXcgc2VsZWN0aW9uIGRlcGVuZGluZyBvbiBob3cgdGhlIHNlbGVjdGlvbiBpcyBtb3ZpbmcuCkBAIC0xMjgxLDYgKzEzMzgsMTUgQEAKICAgICAgICAgICAgIGNoaWxkLnNldFByZXNzZWQoaXNQcmVzc2VkKTsKICAgICAgICAgfQogCisgICAgICAgIGlmIChtQ2hvaWNlTW9kZSAhPSBDSE9JQ0VfTU9ERV9OT05FICYmIG1DaGVja1N0YXRlcyAhPSBudWxsKSB7CisgICAgICAgICAgICBpZiAoY2hpbGQgaW5zdGFuY2VvZiBDaGVja2FibGUpIHsKKyAgICAgICAgICAgICAgICAoKENoZWNrYWJsZSkgY2hpbGQpLnNldENoZWNrZWQobUNoZWNrU3RhdGVzLmdldChwb3NpdGlvbikpOworICAgICAgICAgICAgfSBlbHNlIGlmIChnZXRDb250ZXh0KCkuZ2V0QXBwbGljYXRpb25JbmZvKCkudGFyZ2V0U2RrVmVyc2lvbgorICAgICAgICAgICAgICAgICAgICA+PSBhbmRyb2lkLm9zLkJ1aWxkLlZFUlNJT05fQ09ERVMuSE9ORVlDT01CKSB7CisgICAgICAgICAgICAgICAgY2hpbGQuc2V0QWN0aXZhdGVkKG1DaGVja1N0YXRlcy5nZXQocG9zaXRpb24pKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCiAgICAgICAgIGlmIChuZWVkVG9NZWFzdXJlKSB7CiAgICAgICAgICAgICBpbnQgY2hpbGRIZWlnaHRTcGVjID0gVmlld0dyb3VwLmdldENoaWxkTWVhc3VyZVNwZWMoCiAgICAgICAgICAgICAgICAgICAgIE1lYXN1cmVTcGVjLm1ha2VNZWFzdXJlU3BlYygwLCBNZWFzdXJlU3BlYy5VTlNQRUNJRklFRCksIDAsIHAuaGVpZ2h0KTsKQEAgLTE0OTEsOSArMTU1Nyw5IEBACiAgICAgICAgIGludCBuZXh0UGFnZSA9IC0xOwogCiAgICAgICAgIGlmIChkaXJlY3Rpb24gPT0gRk9DVVNfVVApIHsKLSAgICAgICAgICAgIG5leHRQYWdlID0gTWF0aC5tYXgoMCwgbVNlbGVjdGVkUG9zaXRpb24gLSBnZXRDaGlsZENvdW50KCkgLSAxKTsKKyAgICAgICAgICAgIG5leHRQYWdlID0gTWF0aC5tYXgoMCwgbVNlbGVjdGVkUG9zaXRpb24gLSBnZXRDaGlsZENvdW50KCkpOwogICAgICAgICB9IGVsc2UgaWYgKGRpcmVjdGlvbiA9PSBGT0NVU19ET1dOKSB7Ci0gICAgICAgICAgICBuZXh0UGFnZSA9IE1hdGgubWluKG1JdGVtQ291bnQgLSAxLCBtU2VsZWN0ZWRQb3NpdGlvbiArIGdldENoaWxkQ291bnQoKSAtIDEpOworICAgICAgICAgICAgbmV4dFBhZ2UgPSBNYXRoLm1pbihtSXRlbUNvdW50IC0gMSwgbVNlbGVjdGVkUG9zaXRpb24gKyBnZXRDaGlsZENvdW50KCkpOwogICAgICAgICB9CiAKICAgICAgICAgaWYgKG5leHRQYWdlID49IDApIHsKQEAgLTE3NzcsNiArMTg0MywxOSBAQAogICAgICAgICAgICAgcmVxdWVzdExheW91dElmTmVjZXNzYXJ5KCk7CiAgICAgICAgIH0KICAgICB9CisgICAgCisgICAgLyoqCisgICAgICogR2V0IHRoZSBudW1iZXIgb2YgY29sdW1ucyBpbiB0aGUgZ3JpZC4gCisgICAgICogUmV0dXJucyB7QGxpbmsgI0FVVE9fRklUfSBpZiB0aGUgR3JpZCBoYXMgbmV2ZXIgYmVlbiBsYWlkIG91dC4KKyAgICAgKgorICAgICAqIEBhdHRyIHJlZiBhbmRyb2lkLlIuc3R5bGVhYmxlI0dyaWRWaWV3X251bUNvbHVtbnMKKyAgICAgKiAKKyAgICAgKiBAc2VlICNzZXROdW1Db2x1bW5zKGludCkKKyAgICAgKi8KKyAgICBAVmlld0RlYnVnLkV4cG9ydGVkUHJvcGVydHkKKyAgICBwdWJsaWMgaW50IGdldE51bUNvbHVtbnMoKSB7ICAKKyAgICAgICAgcmV0dXJuIG1OdW1Db2x1bW5zOworICAgIH0KIAogICAgIC8qKgogICAgICAqIE1ha2Ugc3VyZSB2aWV3cyBhcmUgdG91Y2hpbmcgdGhlIHRvcCBvciBib3R0b20gZWRnZSwgYXMgYXBwcm9wcmlhdGUgZm9yCkBAIC0xODc2LDEyICsxOTU1LDcgQEAKICAgICAgICAgLy8gVE9ETzogQWNjb3VudCBmb3IgdmVydGljYWwgc3BhY2luZyB0b28KICAgICAgICAgZmluYWwgaW50IG51bUNvbHVtbnMgPSBtTnVtQ29sdW1uczsKICAgICAgICAgZmluYWwgaW50IHJvd0NvdW50ID0gKG1JdGVtQ291bnQgKyBudW1Db2x1bW5zIC0gMSkgLyBudW1Db2x1bW5zOwotICAgICAgICBpbnQgcmVzdWx0ID0gTWF0aC5tYXgocm93Q291bnQgKiAxMDAsIDApOwotICAgICAgICBpZiAobVNjcm9sbFkgIT0gMCkgewotICAgICAgICAgICAgLy8gQ29tcGVuc2F0ZSBmb3Igb3ZlcnNjcm9sbAotICAgICAgICAgICAgcmVzdWx0ICs9IE1hdGguYWJzKChpbnQpICgoZmxvYXQpIG1TY3JvbGxZIC8gZ2V0SGVpZ2h0KCkgKiByb3dDb3VudCAqIDEwMCkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgIHJldHVybiBNYXRoLm1heChyb3dDb3VudCAqIDEwMCwgMCk7CiAgICAgfQogfQogCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvSG9yaXpvbnRhbFNjcm9sbFZpZXcuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9Ib3Jpem9udGFsU2Nyb2xsVmlldy5qYXZhCmluZGV4IDBiYjk3ZGQuLmUzMGQ0YzggMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9Ib3Jpem9udGFsU2Nyb2xsVmlldy5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9Ib3Jpem9udGFsU2Nyb2xsVmlldy5qYXZhCkBAIC0xNiwyNCArMTYsMTkgQEAKIAogcGFja2FnZSBhbmRyb2lkLndpZGdldDsKIAotaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLlI7Ci0KLWltcG9ydCBhbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0OwotaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQ2FudmFzOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuVHlwZWRBcnJheTsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlJlY3Q7Ci1pbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZTsKLWltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0OworaW1wb3J0IGFuZHJvaWQudmlldy5Gb2N1c0ZpbmRlcjsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuS2V5RXZlbnQ7CitpbXBvcnQgYW5kcm9pZC52aWV3Lk1vdGlvbkV2ZW50OwogaW1wb3J0IGFuZHJvaWQudmlldy5WZWxvY2l0eVRyYWNrZXI7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CiBpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXdDb25maWd1cmF0aW9uOwogaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3R3JvdXA7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LktleUV2ZW50OwotaW1wb3J0IGFuZHJvaWQudmlldy5Gb2N1c0ZpbmRlcjsKLWltcG9ydCBhbmRyb2lkLnZpZXcuTW90aW9uRXZlbnQ7CiBpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXdQYXJlbnQ7CiBpbXBvcnQgYW5kcm9pZC52aWV3LmFuaW1hdGlvbi5BbmltYXRpb25VdGlsczsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlJlc291cmNlczsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlR5cGVkQXJyYXk7CiAKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKIApAQCAtNTgsNiArNTMsOCBAQAogICogd2l0aGluIGEgbGFyZ2VyIGNvbnRhaW5lci4KICAqCiAgKiA8cD5Ib3Jpem9udGFsU2Nyb2xsVmlldyBvbmx5IHN1cHBvcnRzIGhvcml6b250YWwgc2Nyb2xsaW5nLgorICogCisgKiBAYXR0ciByZWYgYW5kcm9pZC5SLnN0eWxlYWJsZSNIb3Jpem9udGFsU2Nyb2xsVmlld19maWxsVmlld3BvcnQgCiAgKi8KIHB1YmxpYyBjbGFzcyBIb3Jpem9udGFsU2Nyb2xsVmlldyBleHRlbmRzIEZyYW1lTGF5b3V0IHsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQU5JTUFURURfU0NST0xMX0dBUCA9IFNjcm9sbFZpZXcuQU5JTUFURURfU0NST0xMX0dBUDsKQEAgLTY4LDkgKzY1LDcgQEAKICAgICBwcml2YXRlIGxvbmcgbUxhc3RTY3JvbGw7CiAKICAgICBwcml2YXRlIGZpbmFsIFJlY3QgbVRlbXBSZWN0ID0gbmV3IFJlY3QoKTsKLSAgICBwcml2YXRlIE92ZXJTY3JvbGxlciBtU2Nyb2xsZXI7Ci0gICAgcHJpdmF0ZSBFZGdlR2xvdyBtRWRnZUdsb3dMZWZ0OwotICAgIHByaXZhdGUgRWRnZUdsb3cgbUVkZ2VHbG93UmlnaHQ7CisgICAgcHJpdmF0ZSBTY3JvbGxlciBtU2Nyb2xsZXI7CiAKICAgICAvKioKICAgICAgKiBGbGFnIHRvIGluZGljYXRlIHRoYXQgd2UgYXJlIG1vdmluZyBmb2N1cyBvdXJzZWx2ZXMuIFRoaXMgaXMgc28gdGhlCkBAIC0xMjQsOSArMTE5LDYgQEAKICAgICBwcml2YXRlIGludCBtTWluaW11bVZlbG9jaXR5OwogICAgIHByaXZhdGUgaW50IG1NYXhpbXVtVmVsb2NpdHk7CiAgICAgCi0gICAgcHJpdmF0ZSBpbnQgbU92ZXJzY3JvbGxEaXN0YW5jZTsKLSAgICBwcml2YXRlIGludCBtT3ZlcmZsaW5nRGlzdGFuY2U7Ci0KICAgICAvKioKICAgICAgKiBJRCBvZiB0aGUgYWN0aXZlIHBvaW50ZXIuIFRoaXMgaXMgdXNlZCB0byByZXRhaW4gY29uc2lzdGVuY3kgZHVyaW5nCiAgICAgICogZHJhZ3MvZmxpbmdzIGlmIG11bHRpcGxlIHBvaW50ZXJzIGFyZSB1c2VkLgpAQCAtMTk5LDcgKzE5MSw3IEBACiAKIAogICAgIHByaXZhdGUgdm9pZCBpbml0U2Nyb2xsVmlldygpIHsKLSAgICAgICAgbVNjcm9sbGVyID0gbmV3IE92ZXJTY3JvbGxlcihnZXRDb250ZXh0KCkpOworICAgICAgICBtU2Nyb2xsZXIgPSBuZXcgU2Nyb2xsZXIoZ2V0Q29udGV4dCgpKTsKICAgICAgICAgc2V0Rm9jdXNhYmxlKHRydWUpOwogICAgICAgICBzZXREZXNjZW5kYW50Rm9jdXNhYmlsaXR5KEZPQ1VTX0FGVEVSX0RFU0NFTkRBTlRTKTsKICAgICAgICAgc2V0V2lsbE5vdERyYXcoZmFsc2UpOwpAQCAtMjA3LDggKzE5OSw2IEBACiAgICAgICAgIG1Ub3VjaFNsb3AgPSBjb25maWd1cmF0aW9uLmdldFNjYWxlZFRvdWNoU2xvcCgpOwogICAgICAgICBtTWluaW11bVZlbG9jaXR5ID0gY29uZmlndXJhdGlvbi5nZXRTY2FsZWRNaW5pbXVtRmxpbmdWZWxvY2l0eSgpOwogICAgICAgICBtTWF4aW11bVZlbG9jaXR5ID0gY29uZmlndXJhdGlvbi5nZXRTY2FsZWRNYXhpbXVtRmxpbmdWZWxvY2l0eSgpOwotICAgICAgICBtT3ZlcnNjcm9sbERpc3RhbmNlID0gY29uZmlndXJhdGlvbi5nZXRTY2FsZWRPdmVyc2Nyb2xsRGlzdGFuY2UoKTsKLSAgICAgICAgbU92ZXJmbGluZ0Rpc3RhbmNlID0gY29uZmlndXJhdGlvbi5nZXRTY2FsZWRPdmVyZmxpbmdEaXN0YW5jZSgpOwogICAgIH0KIAogICAgIEBPdmVycmlkZQpAQCAtMjYwLDIwICsyNTAsMjUgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGlzIFNjcm9sbFZpZXcncyBjb250ZW50IGlzIHN0cmV0Y2hlZCB0byBmaWxsIHRoZSB2aWV3cG9ydC4KKyAgICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGlzIEhvcml6b250YWxTY3JvbGxWaWV3J3MgY29udGVudCBpcyBzdHJldGNoZWQgdG8KKyAgICAgKiBmaWxsIHRoZSB2aWV3cG9ydC4KICAgICAgKgogICAgICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgY29udGVudCBmaWxscyB0aGUgdmlld3BvcnQsIGZhbHNlIG90aGVyd2lzZS4KKyAgICAgKgorICAgICAqIEBhdHRyIHJlZiBhbmRyb2lkLlIuc3R5bGVhYmxlI0hvcml6b250YWxTY3JvbGxWaWV3X2ZpbGxWaWV3cG9ydAogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIGlzRmlsbFZpZXdwb3J0KCkgewogICAgICAgICByZXR1cm4gbUZpbGxWaWV3cG9ydDsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBJbmRpY2F0ZXMgdGhpcyBTY3JvbGxWaWV3IHdoZXRoZXIgaXQgc2hvdWxkIHN0cmV0Y2ggaXRzIGNvbnRlbnQgd2lkdGggdG8gZmlsbAotICAgICAqIHRoZSB2aWV3cG9ydCBvciBub3QuCisgICAgICogSW5kaWNhdGVzIHRoaXMgSG9yaXpvbnRhbFNjcm9sbFZpZXcgd2hldGhlciBpdCBzaG91bGQgc3RyZXRjaCBpdHMgY29udGVudCB3aWR0aAorICAgICAqIHRvIGZpbGwgdGhlIHZpZXdwb3J0IG9yIG5vdC4KICAgICAgKgogICAgICAqIEBwYXJhbSBmaWxsVmlld3BvcnQgVHJ1ZSB0byBzdHJldGNoIHRoZSBjb250ZW50J3Mgd2lkdGggdG8gdGhlIHZpZXdwb3J0J3MKICAgICAgKiAgICAgICAgYm91bmRhcmllcywgZmFsc2Ugb3RoZXJ3aXNlLgorICAgICAqIAorICAgICAqIEBhdHRyIHJlZiBhbmRyb2lkLlIuc3R5bGVhYmxlI0hvcml6b250YWxTY3JvbGxWaWV3X2ZpbGxWaWV3cG9ydAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldEZpbGxWaWV3cG9ydChib29sZWFuIGZpbGxWaWV3cG9ydCkgewogICAgICAgICBpZiAoZmlsbFZpZXdwb3J0ICE9IG1GaWxsVmlld3BvcnQpIHsKQEAgLTQ2OCw5ICs0NjMsNiBAQAogICAgICAgICAgICAgICAgIC8qIFJlbGVhc2UgdGhlIGRyYWcgKi8KICAgICAgICAgICAgICAgICBtSXNCZWluZ0RyYWdnZWQgPSBmYWxzZTsKICAgICAgICAgICAgICAgICBtQWN0aXZlUG9pbnRlcklkID0gSU5WQUxJRF9QT0lOVEVSOwotICAgICAgICAgICAgICAgIGlmIChtU2Nyb2xsZXIuc3ByaW5nYmFjayhtU2Nyb2xsWCwgbVNjcm9sbFksIDAsIGdldFNjcm9sbFJhbmdlKCksIDAsIDApKSB7Ci0gICAgICAgICAgICAgICAgICAgIGludmFsaWRhdGUoKTsKLSAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICBjYXNlIE1vdGlvbkV2ZW50LkFDVElPTl9QT0lOVEVSX1VQOgogICAgICAgICAgICAgICAgIG9uU2Vjb25kYXJ5UG9pbnRlclVwKGV2KTsKQEAgLTUyOCwyNiArNTIwLDcgQEAKICAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IGRlbHRhWCA9IChpbnQpIChtTGFzdE1vdGlvblggLSB4KTsKICAgICAgICAgICAgICAgICAgICAgbUxhc3RNb3Rpb25YID0geDsKIAotICAgICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgb2xkWCA9IG1TY3JvbGxYOwotICAgICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgb2xkWSA9IG1TY3JvbGxZOwotICAgICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgcmFuZ2UgPSBnZXRTY3JvbGxSYW5nZSgpOwotICAgICAgICAgICAgICAgICAgICBpZiAob3ZlcnNjcm9sbEJ5KGRlbHRhWCwgMCwgbVNjcm9sbFgsIDAsIHJhbmdlLCAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1PdmVyc2Nyb2xsRGlzdGFuY2UsIDAsIHRydWUpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBCcmVhayBvdXIgdmVsb2NpdHkgaWYgd2UgaGl0IGEgc2Nyb2xsIGJhcnJpZXIuCi0gICAgICAgICAgICAgICAgICAgICAgICBtVmVsb2NpdHlUcmFja2VyLmNsZWFyKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgb25TY3JvbGxDaGFuZ2VkKG1TY3JvbGxYLCBtU2Nyb2xsWSwgb2xkWCwgb2xkWSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IG92ZXJzY3JvbGxNb2RlID0gZ2V0T3ZlcnNjcm9sbE1vZGUoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG92ZXJzY3JvbGxNb2RlID09IE9WRVJTQ1JPTExfQUxXQVlTIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKG92ZXJzY3JvbGxNb2RlID09IE9WRVJTQ1JPTExfSUZfQ09OVEVOVF9TQ1JPTExTICYmIHJhbmdlID4gMCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIGludCBwdWxsZWRUb1ggPSBvbGRYICsgZGVsdGFYOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHB1bGxlZFRvWCA8IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtRWRnZUdsb3dMZWZ0Lm9uUHVsbCgoZmxvYXQpIGRlbHRhWCAvIGdldFdpZHRoKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChwdWxsZWRUb1ggPiByYW5nZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1FZGdlR2xvd1JpZ2h0Lm9uUHVsbCgoZmxvYXQpIGRlbHRhWCAvIGdldFdpZHRoKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHNjcm9sbEJ5KGRlbHRhWCwgMCk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgY2FzZSBNb3Rpb25FdmVudC5BQ1RJT05fVVA6CkBAIC01NTYsMTUgKzUyOSw4IEBACiAgICAgICAgICAgICAgICAgICAgIHZlbG9jaXR5VHJhY2tlci5jb21wdXRlQ3VycmVudFZlbG9jaXR5KDEwMDAsIG1NYXhpbXVtVmVsb2NpdHkpOwogICAgICAgICAgICAgICAgICAgICBpbnQgaW5pdGlhbFZlbG9jaXR5ID0gKGludCkgdmVsb2NpdHlUcmFja2VyLmdldFhWZWxvY2l0eShtQWN0aXZlUG9pbnRlcklkKTsKIAotICAgICAgICAgICAgICAgICAgICBpZiAoZ2V0Q2hpbGRDb3VudCgpID4gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChNYXRoLmFicyhpbml0aWFsVmVsb2NpdHkpID4gbU1pbmltdW1WZWxvY2l0eSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGluZygtaW5pdGlhbFZlbG9jaXR5KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IHJpZ2h0ID0gZ2V0U2Nyb2xsUmFuZ2UoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobVNjcm9sbGVyLnNwcmluZ2JhY2sobVNjcm9sbFgsIG1TY3JvbGxZLCAwLCByaWdodCwgMCwgMCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW52YWxpZGF0ZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKGdldENoaWxkQ291bnQoKSA+IDAgJiYgTWF0aC5hYnMoaW5pdGlhbFZlbG9jaXR5KSA+IG1NaW5pbXVtVmVsb2NpdHkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZsaW5nKC1pbml0aWFsVmVsb2NpdHkpOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICBtQWN0aXZlUG9pbnRlcklkID0gSU5WQUxJRF9QT0lOVEVSOwpAQCAtNTc0LDI3ICs1NDAsMTYgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIG1WZWxvY2l0eVRyYWNrZXIucmVjeWNsZSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgbVZlbG9jaXR5VHJhY2tlciA9IG51bGw7CiAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYgKG1FZGdlR2xvd0xlZnQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgbUVkZ2VHbG93TGVmdC5vblJlbGVhc2UoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1FZGdlR2xvd1JpZ2h0Lm9uUmVsZWFzZSgpOwotICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgY2FzZSBNb3Rpb25FdmVudC5BQ1RJT05fQ0FOQ0VMOgogICAgICAgICAgICAgICAgIGlmIChtSXNCZWluZ0RyYWdnZWQgJiYgZ2V0Q2hpbGRDb3VudCgpID4gMCkgewotICAgICAgICAgICAgICAgICAgICBpZiAobVNjcm9sbGVyLnNwcmluZ2JhY2sobVNjcm9sbFgsIG1TY3JvbGxZLCAwLCBnZXRTY3JvbGxSYW5nZSgpLCAwLCAwKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgaW52YWxpZGF0ZSgpOwotICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIG1BY3RpdmVQb2ludGVySWQgPSBJTlZBTElEX1BPSU5URVI7CiAgICAgICAgICAgICAgICAgICAgIG1Jc0JlaW5nRHJhZ2dlZCA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgICBpZiAobVZlbG9jaXR5VHJhY2tlciAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBtVmVsb2NpdHlUcmFja2VyLnJlY3ljbGUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgIG1WZWxvY2l0eVRyYWNrZXIgPSBudWxsOwogICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtRWRnZUdsb3dMZWZ0ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1FZGdlR2xvd0xlZnQub25SZWxlYXNlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtRWRnZUdsb3dSaWdodC5vblJlbGVhc2UoKTsKLSAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIGNhc2UgTW90aW9uRXZlbnQuQUNUSU9OX1BPSU5URVJfVVA6CkBAIC02MjEsMjIgKzU3Niw2IEBACiAgICAgICAgIH0KICAgICB9CiAgICAgCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgb25PdmVyc2Nyb2xsZWQoaW50IHNjcm9sbFgsIGludCBzY3JvbGxZLAotICAgICAgICAgICAgYm9vbGVhbiBjbGFtcGVkWCwgYm9vbGVhbiBjbGFtcGVkWSkgewotICAgICAgICAvLyBUcmVhdCBhbmltYXRpbmcgc2Nyb2xscyBkaWZmZXJlbnRseTsgc2VlICNjb21wdXRlU2Nyb2xsKCkgZm9yIHdoeS4KLSAgICAgICAgaWYgKCFtU2Nyb2xsZXIuaXNGaW5pc2hlZCgpKSB7Ci0gICAgICAgICAgICBtU2Nyb2xsWCA9IHNjcm9sbFg7Ci0gICAgICAgICAgICBtU2Nyb2xsWSA9IHNjcm9sbFk7Ci0gICAgICAgICAgICBpZiAoY2xhbXBlZFgpIHsKLSAgICAgICAgICAgICAgICBtU2Nyb2xsZXIuc3ByaW5nYmFjayhtU2Nyb2xsWCwgbVNjcm9sbFksIDAsIGdldFNjcm9sbFJhbmdlKCksIDAsIDApOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgc3VwZXIuc2Nyb2xsVG8oc2Nyb2xsWCwgc2Nyb2xsWSk7Ci0gICAgICAgIH0KLSAgICAgICAgYXdha2VuU2Nyb2xsQmFycygpOwotICAgIH0KLQogICAgIHByaXZhdGUgaW50IGdldFNjcm9sbFJhbmdlKCkgewogICAgICAgICBpbnQgc2Nyb2xsUmFuZ2UgPSAwOwogICAgICAgICBpZiAoZ2V0Q2hpbGRDb3VudCgpID4gMCkgewpAQCAtMTAxOSwxNiArOTU4LDcgQEAKICAgICAgICAgICAgIHJldHVybiBjb250ZW50V2lkdGg7CiAgICAgICAgIH0KICAgICAgICAgCi0gICAgICAgIGludCBzY3JvbGxSYW5nZSA9IGdldENoaWxkQXQoMCkuZ2V0UmlnaHQoKTsKLSAgICAgICAgZmluYWwgaW50IHNjcm9sbFggPSBtU2Nyb2xsWDsKLSAgICAgICAgZmluYWwgaW50IG92ZXJzY3JvbGxSaWdodCA9IE1hdGgubWF4KDAsIHNjcm9sbFJhbmdlIC0gY29udGVudFdpZHRoKTsKLSAgICAgICAgaWYgKHNjcm9sbFggPCAwKSB7Ci0gICAgICAgICAgICBzY3JvbGxSYW5nZSAtPSBzY3JvbGxYOwotICAgICAgICB9IGVsc2UgaWYgKHNjcm9sbFggPiBvdmVyc2Nyb2xsUmlnaHQpIHsKLSAgICAgICAgICAgIHNjcm9sbFJhbmdlICs9IHNjcm9sbFggLSBvdmVyc2Nyb2xsUmlnaHQ7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gc2Nyb2xsUmFuZ2U7CisgICAgICAgIHJldHVybiBnZXRDaGlsZEF0KDApLmdldFJpZ2h0KCk7CiAgICAgfQogICAgIAogICAgIEBPdmVycmlkZQpAQCAtMTA4OSwyMCArMTAxOSwxNCBAQAogICAgICAgICAgICAgaW50IHggPSBtU2Nyb2xsZXIuZ2V0Q3VyclgoKTsKICAgICAgICAgICAgIGludCB5ID0gbVNjcm9sbGVyLmdldEN1cnJZKCk7CiAKLSAgICAgICAgICAgIGlmIChvbGRYICE9IHggfHwgb2xkWSAhPSB5KSB7Ci0gICAgICAgICAgICAgICAgb3ZlcnNjcm9sbEJ5KHggLSBvbGRYLCB5IC0gb2xkWSwgb2xkWCwgb2xkWSwgZ2V0U2Nyb2xsUmFuZ2UoKSwgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgIG1PdmVyZmxpbmdEaXN0YW5jZSwgMCwgZmFsc2UpOwotICAgICAgICAgICAgICAgIG9uU2Nyb2xsQ2hhbmdlZChtU2Nyb2xsWCwgbVNjcm9sbFksIG9sZFgsIG9sZFkpOwotCi0gICAgICAgICAgICAgICAgZmluYWwgaW50IHJhbmdlID0gZ2V0U2Nyb2xsUmFuZ2UoKTsKLSAgICAgICAgICAgICAgICBmaW5hbCBpbnQgb3ZlcnNjcm9sbE1vZGUgPSBnZXRPdmVyc2Nyb2xsTW9kZSgpOwotICAgICAgICAgICAgICAgIGlmIChvdmVyc2Nyb2xsTW9kZSA9PSBPVkVSU0NST0xMX0FMV0FZUyB8fAotICAgICAgICAgICAgICAgICAgICAgICAgKG92ZXJzY3JvbGxNb2RlID09IE9WRVJTQ1JPTExfSUZfQ09OVEVOVF9TQ1JPTExTICYmIHJhbmdlID4gMCkpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHggPCAwICYmIG9sZFggPj0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgbUVkZ2VHbG93TGVmdC5vbkFic29yYigoaW50KSBtU2Nyb2xsZXIuZ2V0Q3VyclZlbG9jaXR5KCkpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHggPiByYW5nZSAmJiBvbGRYIDw9IHJhbmdlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtRWRnZUdsb3dSaWdodC5vbkFic29yYigoaW50KSBtU2Nyb2xsZXIuZ2V0Q3VyclZlbG9jaXR5KCkpOwotICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoZ2V0Q2hpbGRDb3VudCgpID4gMCkgeworICAgICAgICAgICAgICAgIFZpZXcgY2hpbGQgPSBnZXRDaGlsZEF0KDApOworICAgICAgICAgICAgICAgIHggPSBjbGFtcCh4LCBnZXRXaWR0aCgpIC0gbVBhZGRpbmdSaWdodCAtIG1QYWRkaW5nTGVmdCwgY2hpbGQuZ2V0V2lkdGgoKSk7CisgICAgICAgICAgICAgICAgeSA9IGNsYW1wKHksIGdldEhlaWdodCgpIC0gbVBhZGRpbmdCb3R0b20gLSBtUGFkZGluZ1RvcCwgY2hpbGQuZ2V0SGVpZ2h0KCkpOworICAgICAgICAgICAgICAgIGlmICh4ICE9IG9sZFggfHwgeSAhPSBvbGRZKSB7CisgICAgICAgICAgICAgICAgICAgIG1TY3JvbGxYID0geDsKKyAgICAgICAgICAgICAgICAgICAgbVNjcm9sbFkgPSB5OworICAgICAgICAgICAgICAgICAgICBvblNjcm9sbENoYW5nZWQoeCwgeSwgb2xkWCwgb2xkWSk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICAgICAgYXdha2VuU2Nyb2xsQmFycygpOwpAQCAtMTMzOSw3ICsxMjYzLDcgQEAKICAgICAgICAgICAgIGludCByaWdodCA9IGdldENoaWxkQXQoMCkuZ2V0V2lkdGgoKTsKICAgICAKICAgICAgICAgICAgIG1TY3JvbGxlci5mbGluZyhtU2Nyb2xsWCwgbVNjcm9sbFksIHZlbG9jaXR5WCwgMCwgMCwgCi0gICAgICAgICAgICAgICAgICAgIE1hdGgubWF4KDAsIHJpZ2h0IC0gd2lkdGgpLCAwLCAwLCB3aWR0aC8yLCAwKTsKKyAgICAgICAgICAgICAgICAgICAgTWF0aC5tYXgoMCwgcmlnaHQgLSB3aWR0aCksIDAsIDApOwogICAgIAogICAgICAgICAgICAgZmluYWwgYm9vbGVhbiBtb3ZpbmdSaWdodCA9IHZlbG9jaXR5WCA+IDA7CiAgICAgCkBAIC0xMzc3LDU2ICsxMzAxLDYgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNldE92ZXJzY3JvbGxNb2RlKGludCBtb2RlKSB7Ci0gICAgICAgIGlmIChtb2RlICE9IE9WRVJTQ1JPTExfTkVWRVIpIHsKLSAgICAgICAgICAgIGlmIChtRWRnZUdsb3dMZWZ0ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBmaW5hbCBSZXNvdXJjZXMgcmVzID0gZ2V0Q29udGV4dCgpLmdldFJlc291cmNlcygpOwotICAgICAgICAgICAgICAgIGZpbmFsIERyYXdhYmxlIGVkZ2UgPSByZXMuZ2V0RHJhd2FibGUoUi5kcmF3YWJsZS5vdmVyc2Nyb2xsX2VkZ2UpOwotICAgICAgICAgICAgICAgIGZpbmFsIERyYXdhYmxlIGdsb3cgPSByZXMuZ2V0RHJhd2FibGUoUi5kcmF3YWJsZS5vdmVyc2Nyb2xsX2dsb3cpOwotICAgICAgICAgICAgICAgIG1FZGdlR2xvd0xlZnQgPSBuZXcgRWRnZUdsb3coZWRnZSwgZ2xvdyk7Ci0gICAgICAgICAgICAgICAgbUVkZ2VHbG93UmlnaHQgPSBuZXcgRWRnZUdsb3coZWRnZSwgZ2xvdyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtRWRnZUdsb3dMZWZ0ID0gbnVsbDsKLSAgICAgICAgICAgIG1FZGdlR2xvd1JpZ2h0ID0gbnVsbDsKLSAgICAgICAgfQotICAgICAgICBzdXBlci5zZXRPdmVyc2Nyb2xsTW9kZShtb2RlKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBkcmF3KENhbnZhcyBjYW52YXMpIHsKLSAgICAgICAgc3VwZXIuZHJhdyhjYW52YXMpOwotICAgICAgICBpZiAobUVkZ2VHbG93TGVmdCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBmaW5hbCBpbnQgc2Nyb2xsWCA9IG1TY3JvbGxYOwotICAgICAgICAgICAgaWYgKCFtRWRnZUdsb3dMZWZ0LmlzRmluaXNoZWQoKSkgewotICAgICAgICAgICAgICAgIGZpbmFsIGludCByZXN0b3JlQ291bnQgPSBjYW52YXMuc2F2ZSgpOwotICAgICAgICAgICAgICAgIGZpbmFsIGludCBoZWlnaHQgPSBnZXRIZWlnaHQoKTsKLQotICAgICAgICAgICAgICAgIGNhbnZhcy5yb3RhdGUoMjcwKTsKLSAgICAgICAgICAgICAgICBjYW52YXMudHJhbnNsYXRlKC1oZWlnaHQgKiAxLjVmLCBNYXRoLm1pbigwLCBzY3JvbGxYKSk7Ci0gICAgICAgICAgICAgICAgbUVkZ2VHbG93TGVmdC5zZXRTaXplKGdldEhlaWdodCgpICogMiwgZ2V0V2lkdGgoKSk7Ci0gICAgICAgICAgICAgICAgaWYgKG1FZGdlR2xvd0xlZnQuZHJhdyhjYW52YXMpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGludmFsaWRhdGUoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY2FudmFzLnJlc3RvcmVUb0NvdW50KHJlc3RvcmVDb3VudCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoIW1FZGdlR2xvd1JpZ2h0LmlzRmluaXNoZWQoKSkgewotICAgICAgICAgICAgICAgIGZpbmFsIGludCByZXN0b3JlQ291bnQgPSBjYW52YXMuc2F2ZSgpOwotICAgICAgICAgICAgICAgIGZpbmFsIGludCB3aWR0aCA9IGdldFdpZHRoKCk7Ci0gICAgICAgICAgICAgICAgZmluYWwgaW50IGhlaWdodCA9IGdldEhlaWdodCgpOwotCi0gICAgICAgICAgICAgICAgY2FudmFzLnJvdGF0ZSg5MCk7Ci0gICAgICAgICAgICAgICAgY2FudmFzLnRyYW5zbGF0ZSgtaGVpZ2h0IC8gMiwgLShNYXRoLm1heChnZXRTY3JvbGxSYW5nZSgpLCBzY3JvbGxYKSArIHdpZHRoKSk7Ci0gICAgICAgICAgICAgICAgbUVkZ2VHbG93UmlnaHQuc2V0U2l6ZShoZWlnaHQgKiAyLCB3aWR0aCk7Ci0gICAgICAgICAgICAgICAgaWYgKG1FZGdlR2xvd1JpZ2h0LmRyYXcoY2FudmFzKSkgewotICAgICAgICAgICAgICAgICAgICBpbnZhbGlkYXRlKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNhbnZhcy5yZXN0b3JlVG9Db3VudChyZXN0b3JlQ291bnQpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCiAgICAgcHJpdmF0ZSBpbnQgY2xhbXAoaW50IG4sIGludCBteSwgaW50IGNoaWxkKSB7CiAgICAgICAgIGlmIChteSA+PSBjaGlsZCB8fCBuIDwgMCkgewogICAgICAgICAgICAgcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvSW1hZ2VCdXR0b24uamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9JbWFnZUJ1dHRvbi5qYXZhCmluZGV4IDEyYTY4ZGIuLmQ2ODBmYWQgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9JbWFnZUJ1dHRvbi5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9JbWFnZUJ1dHRvbi5qYXZhCkBAIC0zMiw3ICszMiw3IEBACiAgKiB7QGxpbmsgYW5kcm9pZC53aWRnZXQuQnV0dG9ufSwgd2l0aCB0aGUgc3RhbmRhcmQgYnV0dG9uIGJhY2tncm91bmQKICAqIHRoYXQgY2hhbmdlcyBjb2xvciBkdXJpbmcgZGlmZmVyZW50IGJ1dHRvbiBzdGF0ZXMuIFRoZSBpbWFnZSBvbiB0aGUgc3VyZmFjZQogICogb2YgdGhlIGJ1dHRvbiBpcyBkZWZpbmVkIGVpdGhlciBieSB0aGUge0Bjb2RlIGFuZHJvaWQ6c3JjfSBhdHRyaWJ1dGUgaW4gdGhlCi0gKiB7QGNvZGUgJmx0O0ltYWdlQnV0dG9uJmd0O30gWE1MIGVsZW1lbnQgb3IgYnkgdGhlIAorICoge0Bjb2RlIDxJbWFnZUJ1dHRvbj59IFhNTCBlbGVtZW50IG9yIGJ5IHRoZQogICoge0BsaW5rICNzZXRJbWFnZVJlc291cmNlKGludCl9IG1ldGhvZC48L3A+CiAgKiAKICAqIDxwPlRvIHJlbW92ZSB0aGUgc3RhbmRhcmQgYnV0dG9uIGJhY2tncm91bmQgaW1hZ2UsIGRlZmluZSB5b3VyIG93biAKQEAgLTU3LDcgKzU3LDcgQEAKICAqIGJhc2VkIG9uIHRoZSBzdGF0ZSBvZiB0aGUgYnV0dG9uIGFuZCB0aGUgY29ycmVzcG9uZGluZyBpbWFnZXMKICAqIGRlZmluZWQgaW4gdGhlIFhNTC48L3A+CiAgKgotICogPHA+VGhlIG9yZGVyIG9mIHRoZSB7QGNvZGUgJmx0O2l0ZW0+fSBlbGVtZW50cyBpcyBpbXBvcnRhbnQgYmVjYXVzZSB0aGV5IGFyZQorICogPHA+VGhlIG9yZGVyIG9mIHRoZSB7QGNvZGUgPGl0ZW0+fSBlbGVtZW50cyBpcyBpbXBvcnRhbnQgYmVjYXVzZSB0aGV5IGFyZQogICogZXZhbHVhdGVkIGluIG9yZGVyLiBUaGlzIGlzIHdoeSB0aGUgIm5vcm1hbCIgYnV0dG9uIGltYWdlIGNvbWVzIGxhc3QsIGJlY2F1c2UKICAqIGl0IHdpbGwgb25seSBiZSBhcHBsaWVkIGFmdGVyIHtAY29kZSBhbmRyb2lkOnN0YXRlX3ByZXNzZWR9IGFuZCB7QGNvZGUKICAqIGFuZHJvaWQ6c3RhdGVfZm9jdXNlZH0gaGF2ZSBib3RoIGV2YWx1YXRlZCBmYWxzZS48L3A+CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvTGluZWFyTGF5b3V0LmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvTGluZWFyTGF5b3V0LmphdmEKaW5kZXggZmFmMDgyZC4uMWU1NDg5YSAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L0xpbmVhckxheW91dC5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9MaW5lYXJMYXlvdXQuamF2YQpAQCAtNDMsNiArNDMsMTMgQEAKICAqIDxwPgogICogQWxzbyBzZWUge0BsaW5rIExpbmVhckxheW91dC5MYXlvdXRQYXJhbXMgYW5kcm9pZC53aWRnZXQuTGluZWFyTGF5b3V0LkxheW91dFBhcmFtc30KICAqIGZvciBsYXlvdXQgYXR0cmlidXRlcyA8L3A+CisgKgorICogQGF0dHIgcmVmIGFuZHJvaWQuUi5zdHlsZWFibGUjTGluZWFyTGF5b3V0X2Jhc2VsaW5lQWxpZ25lZAorICogQGF0dHIgcmVmIGFuZHJvaWQuUi5zdHlsZWFibGUjTGluZWFyTGF5b3V0X2Jhc2VsaW5lQWxpZ25lZENoaWxkSW5kZXgKKyAqIEBhdHRyIHJlZiBhbmRyb2lkLlIuc3R5bGVhYmxlI0xpbmVhckxheW91dF9ncmF2aXR5CisgKiBAYXR0ciByZWYgYW5kcm9pZC5SLnN0eWxlYWJsZSNMaW5lYXJMYXlvdXRfbWVhc3VyZVdpdGhMYXJnZXN0Q2hpbGQKKyAqIEBhdHRyIHJlZiBhbmRyb2lkLlIuc3R5bGVhYmxlI0xpbmVhckxheW91dF9vcmllbnRhdGlvbgorICogQGF0dHIgcmVmIGFuZHJvaWQuUi5zdHlsZWFibGUjTGluZWFyTGF5b3V0X3dlaWdodFN1bQogICovCiBAUmVtb3RlVmlldwogcHVibGljIGNsYXNzIExpbmVhckxheW91dCBleHRlbmRzIFZpZXdHcm91cCB7CkBAIC0xMTcsNyArMTI0LDExIEBACiAgICAgfQogCiAgICAgcHVibGljIExpbmVhckxheW91dChDb250ZXh0IGNvbnRleHQsIEF0dHJpYnV0ZVNldCBhdHRycykgewotICAgICAgICBzdXBlcihjb250ZXh0LCBhdHRycyk7CisgICAgICAgIHRoaXMoY29udGV4dCwgYXR0cnMsIDApOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgTGluZWFyTGF5b3V0KENvbnRleHQgY29udGV4dCwgQXR0cmlidXRlU2V0IGF0dHJzLCBpbnQgZGVmU3R5bGUpIHsKKyAgICAgICAgc3VwZXIoY29udGV4dCwgYXR0cnMsIGRlZlN0eWxlKTsKIAogICAgICAgICBUeXBlZEFycmF5IGEgPSAKICAgICAgICAgICAgIGNvbnRleHQub2J0YWluU3R5bGVkQXR0cmlidXRlcyhhdHRycywgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZWFibGUuTGluZWFyTGF5b3V0KTsKQEAgLTE0Miw4ICsxNTMsNyBAQAogICAgICAgICBtQmFzZWxpbmVBbGlnbmVkQ2hpbGRJbmRleCA9CiAgICAgICAgICAgICAgICAgYS5nZXRJbnQoY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZWFibGUuTGluZWFyTGF5b3V0X2Jhc2VsaW5lQWxpZ25lZENoaWxkSW5kZXgsIC0xKTsKIAotICAgICAgICAvLyBUT0RPOiBCZXR0ZXIgbmFtZSwgYWRkIEphdmEgQVBJcywgbWFrZSBpdCBwdWJsaWMKLSAgICAgICAgbVVzZUxhcmdlc3RDaGlsZCA9IGEuZ2V0Qm9vbGVhbihSLnN0eWxlYWJsZS5MaW5lYXJMYXlvdXRfdXNlTGFyZ2VzdENoaWxkLCBmYWxzZSk7CisgICAgICAgIG1Vc2VMYXJnZXN0Q2hpbGQgPSBhLmdldEJvb2xlYW4oUi5zdHlsZWFibGUuTGluZWFyTGF5b3V0X21lYXN1cmVXaXRoTGFyZ2VzdENoaWxkLCBmYWxzZSk7CiAKICAgICAgICAgYS5yZWN5Y2xlKCk7CiAgICAgfQpAQCAtMTcyLDYgKzE4MiwzMyBAQAogICAgICAgICBtQmFzZWxpbmVBbGlnbmVkID0gYmFzZWxpbmVBbGlnbmVkOwogICAgIH0KIAorICAgIC8qKgorICAgICAqIFdoZW4gdHJ1ZSwgYWxsIGNoaWxkcmVuIHdpdGggYSB3ZWlnaHQgd2lsbCBiZSBjb25zaWRlcmVkIGhhdmluZworICAgICAqIHRoZSBtaW5pbXVtIHNpemUgb2YgdGhlIGxhcmdlc3QgY2hpbGQuIElmIGZhbHNlLCBhbGwgY2hpbGRyZW4gYXJlCisgICAgICogbWVhc3VyZWQgbm9ybWFsbHkuCisgICAgICogCisgICAgICogQHJldHVybiBUcnVlIHRvIG1lYXN1cmUgY2hpbGRyZW4gd2l0aCBhIHdlaWdodCB1c2luZyB0aGUgbWluaW11bQorICAgICAqICAgICAgICAgc2l6ZSBvZiB0aGUgbGFyZ2VzdCBjaGlsZCwgZmFsc2Ugb3RoZXJ3aXNlLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzTWVhc3VyZVdpdGhMYXJnZXN0Q2hpbGRFbmFibGVkKCkgeworICAgICAgICByZXR1cm4gbVVzZUxhcmdlc3RDaGlsZDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXaGVuIHNldCB0byB0cnVlLCBhbGwgY2hpbGRyZW4gd2l0aCBhIHdlaWdodCB3aWxsIGJlIGNvbnNpZGVyZWQgaGF2aW5nCisgICAgICogdGhlIG1pbmltdW0gc2l6ZSBvZiB0aGUgbGFyZ2VzdCBjaGlsZC4gSWYgZmFsc2UsIGFsbCBjaGlsZHJlbiBhcmUKKyAgICAgKiBtZWFzdXJlZCBub3JtYWxseS4KKyAgICAgKiAKKyAgICAgKiBEaXNhYmxlZCBieSBkZWZhdWx0LgorICAgICAqIAorICAgICAqIEBwYXJhbSBlbmFibGVkIFRydWUgdG8gbWVhc3VyZSBjaGlsZHJlbiB3aXRoIGEgd2VpZ2h0IHVzaW5nIHRoZQorICAgICAqICAgICAgICBtaW5pbXVtIHNpemUgb2YgdGhlIGxhcmdlc3QgY2hpbGQsIGZhbHNlIG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICBAYW5kcm9pZC52aWV3LlJlbW90YWJsZVZpZXdNZXRob2QKKyAgICBwdWJsaWMgdm9pZCBzZXRNZWFzdXJlV2l0aExhcmdlc3RDaGlsZEVuYWJsZWQoYm9vbGVhbiBlbmFibGVkKSB7CisgICAgICAgIG1Vc2VMYXJnZXN0Q2hpbGQgPSBlbmFibGVkOworICAgIH0KKwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBpbnQgZ2V0QmFzZWxpbmUoKSB7CiAgICAgICAgIGlmIChtQmFzZWxpbmVBbGlnbmVkQ2hpbGRJbmRleCA8IDApIHsKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9MaXN0UG9wdXBXaW5kb3cuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9MaXN0UG9wdXBXaW5kb3cuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YjIxNjEyCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L0xpc3RQb3B1cFdpbmRvdy5qYXZhCkBAIC0wLDAgKzEsMTIzOCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC53aWRnZXQ7CisKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLkRhdGFTZXRPYnNlcnZlcjsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlJlY3Q7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZTsKK2ltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXI7CitpbXBvcnQgYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldDsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworaW1wb3J0IGFuZHJvaWQudmlldy5LZXlFdmVudDsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuTW90aW9uRXZlbnQ7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXdHcm91cDsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlld1BhcmVudDsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldy5NZWFzdXJlU3BlYzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldy5PblRvdWNoTGlzdGVuZXI7CisKKy8qKgorICogQSBMaXN0UG9wdXBXaW5kb3cgYW5jaG9ycyBpdHNlbGYgdG8gYSBob3N0IHZpZXcgYW5kIGRpc3BsYXlzIGEKKyAqIGxpc3Qgb2YgY2hvaWNlcy4KKyAqIAorICogPHA+TGlzdFBvcHVwV2luZG93IGNvbnRhaW5zIGEgbnVtYmVyIG9mIHRyaWNreSBiZWhhdmlvcnMgc3Vycm91bmRpbmcKKyAqIHBvc2l0aW9uaW5nLCBzY3JvbGxpbmcgcGFyZW50cyB0byBmaXQgdGhlIGRyb3Bkb3duLCBpbnRlcmFjdGluZworICogc2FuZWx5IHdpdGggdGhlIElNRSBpZiBwcmVzZW50LCBhbmQgb3RoZXJzLgorICogCisgKiBAc2VlIGFuZHJvaWQud2lkZ2V0LkF1dG9Db21wbGV0ZVRleHRWaWV3CisgKiBAc2VlIGFuZHJvaWQud2lkZ2V0LlNwaW5uZXIKKyAqLworcHVibGljIGNsYXNzIExpc3RQb3B1cFdpbmRvdyB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJMaXN0UG9wdXBXaW5kb3ciOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUcgPSBmYWxzZTsKKworICAgIC8qKgorICAgICAqIFRoaXMgdmFsdWUgY29udHJvbHMgdGhlIGxlbmd0aCBvZiB0aW1lIHRoYXQgdGhlIHVzZXIKKyAgICAgKiBtdXN0IGxlYXZlIGEgcG9pbnRlciBkb3duIHdpdGhvdXQgc2Nyb2xsaW5nIHRvIGV4cGFuZAorICAgICAqIHRoZSBhdXRvY29tcGxldGUgZHJvcGRvd24gbGlzdCB0byBjb3ZlciB0aGUgSU1FLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBFWFBBTkRfTElTVF9USU1FT1VUID0gMjUwOworCisgICAgcHJpdmF0ZSBDb250ZXh0IG1Db250ZXh0OworICAgIHByaXZhdGUgUG9wdXBXaW5kb3cgbVBvcHVwOworICAgIHByaXZhdGUgTGlzdEFkYXB0ZXIgbUFkYXB0ZXI7CisgICAgcHJpdmF0ZSBEcm9wRG93bkxpc3RWaWV3IG1Ecm9wRG93bkxpc3Q7CisKKyAgICBwcml2YXRlIGludCBtRHJvcERvd25IZWlnaHQgPSBWaWV3R3JvdXAuTGF5b3V0UGFyYW1zLldSQVBfQ09OVEVOVDsKKyAgICBwcml2YXRlIGludCBtRHJvcERvd25XaWR0aCA9IFZpZXdHcm91cC5MYXlvdXRQYXJhbXMuV1JBUF9DT05URU5UOworICAgIHByaXZhdGUgaW50IG1Ecm9wRG93bkhvcml6b250YWxPZmZzZXQ7CisgICAgcHJpdmF0ZSBpbnQgbURyb3BEb3duVmVydGljYWxPZmZzZXQ7CisKKyAgICBwcml2YXRlIGJvb2xlYW4gbURyb3BEb3duQWx3YXlzVmlzaWJsZSA9IGZhbHNlOworICAgIHByaXZhdGUgYm9vbGVhbiBtRm9yY2VJZ25vcmVPdXRzaWRlVG91Y2ggPSBmYWxzZTsKKworICAgIHByaXZhdGUgVmlldyBtUHJvbXB0VmlldzsKKyAgICBwcml2YXRlIGludCBtUHJvbXB0UG9zaXRpb24gPSBQT1NJVElPTl9QUk9NUFRfQUJPVkU7CisKKyAgICBwcml2YXRlIERhdGFTZXRPYnNlcnZlciBtT2JzZXJ2ZXI7CisKKyAgICBwcml2YXRlIFZpZXcgbURyb3BEb3duQW5jaG9yVmlldzsKKworICAgIHByaXZhdGUgRHJhd2FibGUgbURyb3BEb3duTGlzdEhpZ2hsaWdodDsKKworICAgIHByaXZhdGUgQWRhcHRlclZpZXcuT25JdGVtQ2xpY2tMaXN0ZW5lciBtSXRlbUNsaWNrTGlzdGVuZXI7CisgICAgcHJpdmF0ZSBBZGFwdGVyVmlldy5Pbkl0ZW1TZWxlY3RlZExpc3RlbmVyIG1JdGVtU2VsZWN0ZWRMaXN0ZW5lcjsKKworICAgIHByaXZhdGUgZmluYWwgUmVzaXplUG9wdXBSdW5uYWJsZSBtUmVzaXplUG9wdXBSdW5uYWJsZSA9IG5ldyBSZXNpemVQb3B1cFJ1bm5hYmxlKCk7CisgICAgcHJpdmF0ZSBmaW5hbCBQb3B1cFRvdWNoSW50ZXJjZXB0b3IgbVRvdWNoSW50ZXJjZXB0b3IgPSBuZXcgUG9wdXBUb3VjaEludGVyY2VwdG9yKCk7CisgICAgcHJpdmF0ZSBmaW5hbCBQb3B1cFNjcm9sbExpc3RlbmVyIG1TY3JvbGxMaXN0ZW5lciA9IG5ldyBQb3B1cFNjcm9sbExpc3RlbmVyKCk7CisgICAgcHJpdmF0ZSBmaW5hbCBMaXN0U2VsZWN0b3JIaWRlciBtSGlkZVNlbGVjdG9yID0gbmV3IExpc3RTZWxlY3RvckhpZGVyKCk7CisgICAgcHJpdmF0ZSBSdW5uYWJsZSBtU2hvd0Ryb3BEb3duUnVubmFibGU7CisKKyAgICBwcml2YXRlIEhhbmRsZXIgbUhhbmRsZXIgPSBuZXcgSGFuZGxlcigpOworCisgICAgcHJpdmF0ZSBSZWN0IG1UZW1wUmVjdCA9IG5ldyBSZWN0KCk7CisKKyAgICBwcml2YXRlIGJvb2xlYW4gbU1vZGFsOworCisgICAgLyoqCisgICAgICogVGhlIHByb3ZpZGVkIHByb21wdCB2aWV3IHNob3VsZCBhcHBlYXIgYWJvdmUgbGlzdCBjb250ZW50LgorICAgICAqIAorICAgICAqIEBzZWUgI3NldFByb21wdFBvc2l0aW9uKGludCkKKyAgICAgKiBAc2VlICNnZXRQcm9tcHRQb3NpdGlvbigpCisgICAgICogQHNlZSAjc2V0UHJvbXB0VmlldyhWaWV3KQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBPU0lUSU9OX1BST01QVF9BQk9WRSA9IDA7CisKKyAgICAvKioKKyAgICAgKiBUaGUgcHJvdmlkZWQgcHJvbXB0IHZpZXcgc2hvdWxkIGFwcGVhciBiZWxvdyBsaXN0IGNvbnRlbnQuCisgICAgICogCisgICAgICogQHNlZSAjc2V0UHJvbXB0UG9zaXRpb24oaW50KQorICAgICAqIEBzZWUgI2dldFByb21wdFBvc2l0aW9uKCkKKyAgICAgKiBAc2VlICNzZXRQcm9tcHRWaWV3KFZpZXcpCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUE9TSVRJT05fUFJPTVBUX0JFTE9XID0gMTsKKworICAgIC8qKgorICAgICAqIEFsaWFzIGZvciB7QGxpbmsgVmlld0dyb3VwLkxheW91dFBhcmFtcyNNQVRDSF9QQVJFTlR9LgorICAgICAqIElmIHVzZWQgdG8gc3BlY2lmeSBhIHBvcHVwIHdpZHRoLCB0aGUgcG9wdXAgd2lsbCBtYXRjaCB0aGUgd2lkdGggb2YgdGhlIGFuY2hvciB2aWV3LgorICAgICAqIElmIHVzZWQgdG8gc3BlY2lmeSBhIHBvcHVwIGhlaWdodCwgdGhlIHBvcHVwIHdpbGwgZmlsbCBhdmFpbGFibGUgc3BhY2UuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTUFUQ0hfUEFSRU5UID0gVmlld0dyb3VwLkxheW91dFBhcmFtcy5NQVRDSF9QQVJFTlQ7CisgICAgCisgICAgLyoqCisgICAgICogQWxpYXMgZm9yIHtAbGluayBWaWV3R3JvdXAuTGF5b3V0UGFyYW1zI1dSQVBfQ09OVEVOVH0uCisgICAgICogSWYgdXNlZCB0byBzcGVjaWZ5IGEgcG9wdXAgd2lkdGgsIHRoZSBwb3B1cCB3aWxsIHVzZSB0aGUgd2lkdGggb2YgaXRzIGNvbnRlbnQuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV1JBUF9DT05URU5UID0gVmlld0dyb3VwLkxheW91dFBhcmFtcy5XUkFQX0NPTlRFTlQ7CisgICAgCisgICAgLyoqCisgICAgICogTW9kZSBmb3Ige0BsaW5rICNzZXRJbnB1dE1ldGhvZE1vZGUoaW50KX06IHRoZSByZXF1aXJlbWVudHMgZm9yIHRoZQorICAgICAqIGlucHV0IG1ldGhvZCBzaG91bGQgYmUgYmFzZWQgb24gdGhlIGZvY3VzYWJpbGl0eSBvZiB0aGUgcG9wdXAuICBUaGF0IGlzCisgICAgICogaWYgaXQgaXMgZm9jdXNhYmxlIHRoYW4gaXQgbmVlZHMgdG8gd29yayB3aXRoIHRoZSBpbnB1dCBtZXRob2QsIGVsc2UKKyAgICAgKiBpdCBkb2Vzbid0LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElOUFVUX01FVEhPRF9GUk9NX0ZPQ1VTQUJMRSA9IFBvcHVwV2luZG93LklOUFVUX01FVEhPRF9GUk9NX0ZPQ1VTQUJMRTsKKyAgICAKKyAgICAvKioKKyAgICAgKiBNb2RlIGZvciB7QGxpbmsgI3NldElucHV0TWV0aG9kTW9kZShpbnQpfTogdGhpcyBwb3B1cCBhbHdheXMgbmVlZHMgdG8KKyAgICAgKiB3b3JrIHdpdGggYW4gaW5wdXQgbWV0aG9kLCByZWdhcmRsZXNzIG9mIHdoZXRoZXIgaXQgaXMgZm9jdXNhYmxlLiAgVGhpcworICAgICAqIG1lYW5zIHRoYXQgaXQgd2lsbCBhbHdheXMgYmUgZGlzcGxheWVkIHNvIHRoYXQgdGhlIHVzZXIgY2FuIGFsc28gb3BlcmF0ZQorICAgICAqIHRoZSBpbnB1dCBtZXRob2Qgd2hpbGUgaXQgaXMgc2hvd24uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5QVVRfTUVUSE9EX05FRURFRCA9IFBvcHVwV2luZG93LklOUFVUX01FVEhPRF9ORUVERUQ7CisgICAgCisgICAgLyoqCisgICAgICogTW9kZSBmb3Ige0BsaW5rICNzZXRJbnB1dE1ldGhvZE1vZGUoaW50KX06IHRoaXMgcG9wdXAgbmV2ZXIgbmVlZHMgdG8KKyAgICAgKiB3b3JrIHdpdGggYW4gaW5wdXQgbWV0aG9kLCByZWdhcmRsZXNzIG9mIHdoZXRoZXIgaXQgaXMgZm9jdXNhYmxlLiAgVGhpcworICAgICAqIG1lYW5zIHRoYXQgaXQgd2lsbCBhbHdheXMgYmUgZGlzcGxheWVkIHRvIHVzZSBhcyBtdWNoIHNwYWNlIG9uIHRoZQorICAgICAqIHNjcmVlbiBhcyBuZWVkZWQsIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciB0aGlzIGNvdmVycyB0aGUgaW5wdXQgbWV0aG9kLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElOUFVUX01FVEhPRF9OT1RfTkVFREVEID0gUG9wdXBXaW5kb3cuSU5QVVRfTUVUSE9EX05PVF9ORUVERUQ7CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYSBuZXcsIGVtcHR5IHBvcHVwIHdpbmRvdyBjYXBhYmxlIG9mIGRpc3BsYXlpbmcgaXRlbXMgZnJvbSBhIExpc3RBZGFwdGVyLgorICAgICAqIEJhY2tncm91bmRzIHNob3VsZCBiZSBzZXQgdXNpbmcge0BsaW5rICNzZXRCYWNrZ3JvdW5kRHJhd2FibGUoRHJhd2FibGUpfS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gY29udGV4dCBDb250ZXh0IHVzZWQgZm9yIGNvbnRhaW5lZCB2aWV3cy4KKyAgICAgKi8KKyAgICBwdWJsaWMgTGlzdFBvcHVwV2luZG93KENvbnRleHQgY29udGV4dCkgeworICAgICAgICB0aGlzKGNvbnRleHQsIG51bGwsIDAsIDApOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZSBhIG5ldywgZW1wdHkgcG9wdXAgd2luZG93IGNhcGFibGUgb2YgZGlzcGxheWluZyBpdGVtcyBmcm9tIGEgTGlzdEFkYXB0ZXIuCisgICAgICogQmFja2dyb3VuZHMgc2hvdWxkIGJlIHNldCB1c2luZyB7QGxpbmsgI3NldEJhY2tncm91bmREcmF3YWJsZShEcmF3YWJsZSl9LgorICAgICAqIAorICAgICAqIEBwYXJhbSBjb250ZXh0IENvbnRleHQgdXNlZCBmb3IgY29udGFpbmVkIHZpZXdzLgorICAgICAqIEBwYXJhbSBhdHRycyBBdHRyaWJ1dGVzIGZyb20gaW5mbGF0aW5nIHBhcmVudCB2aWV3cyB1c2VkIHRvIHN0eWxlIHRoZSBwb3B1cC4KKyAgICAgKi8KKyAgICBwdWJsaWMgTGlzdFBvcHVwV2luZG93KENvbnRleHQgY29udGV4dCwgQXR0cmlidXRlU2V0IGF0dHJzKSB7CisgICAgICAgIHRoaXMoY29udGV4dCwgYXR0cnMsIGNvbS5hbmRyb2lkLmludGVybmFsLlIuYXR0ci5saXN0UG9wdXBXaW5kb3dTdHlsZSwgMCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlIGEgbmV3LCBlbXB0eSBwb3B1cCB3aW5kb3cgY2FwYWJsZSBvZiBkaXNwbGF5aW5nIGl0ZW1zIGZyb20gYSBMaXN0QWRhcHRlci4KKyAgICAgKiBCYWNrZ3JvdW5kcyBzaG91bGQgYmUgc2V0IHVzaW5nIHtAbGluayAjc2V0QmFja2dyb3VuZERyYXdhYmxlKERyYXdhYmxlKX0uCisgICAgICogCisgICAgICogQHBhcmFtIGNvbnRleHQgQ29udGV4dCB1c2VkIGZvciBjb250YWluZWQgdmlld3MuCisgICAgICogQHBhcmFtIGF0dHJzIEF0dHJpYnV0ZXMgZnJvbSBpbmZsYXRpbmcgcGFyZW50IHZpZXdzIHVzZWQgdG8gc3R5bGUgdGhlIHBvcHVwLgorICAgICAqIEBwYXJhbSBkZWZTdHlsZUF0dHIgRGVmYXVsdCBzdHlsZSBhdHRyaWJ1dGUgdG8gdXNlIGZvciBwb3B1cCBjb250ZW50LgorICAgICAqLworICAgIHB1YmxpYyBMaXN0UG9wdXBXaW5kb3coQ29udGV4dCBjb250ZXh0LCBBdHRyaWJ1dGVTZXQgYXR0cnMsIGludCBkZWZTdHlsZUF0dHIpIHsKKyAgICAgICAgdGhpcyhjb250ZXh0LCBhdHRycywgZGVmU3R5bGVBdHRyLCAwKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYSBuZXcsIGVtcHR5IHBvcHVwIHdpbmRvdyBjYXBhYmxlIG9mIGRpc3BsYXlpbmcgaXRlbXMgZnJvbSBhIExpc3RBZGFwdGVyLgorICAgICAqIEJhY2tncm91bmRzIHNob3VsZCBiZSBzZXQgdXNpbmcge0BsaW5rICNzZXRCYWNrZ3JvdW5kRHJhd2FibGUoRHJhd2FibGUpfS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gY29udGV4dCBDb250ZXh0IHVzZWQgZm9yIGNvbnRhaW5lZCB2aWV3cy4KKyAgICAgKiBAcGFyYW0gYXR0cnMgQXR0cmlidXRlcyBmcm9tIGluZmxhdGluZyBwYXJlbnQgdmlld3MgdXNlZCB0byBzdHlsZSB0aGUgcG9wdXAuCisgICAgICogQHBhcmFtIGRlZlN0eWxlQXR0ciBTdHlsZSBhdHRyaWJ1dGUgdG8gcmVhZCBmb3IgZGVmYXVsdCBzdHlsaW5nIG9mIHBvcHVwIGNvbnRlbnQuCisgICAgICogQHBhcmFtIGRlZlN0eWxlUmVzIFN0eWxlIHJlc291cmNlIElEIHRvIHVzZSBmb3IgZGVmYXVsdCBzdHlsaW5nIG9mIHBvcHVwIGNvbnRlbnQuCisgICAgICovCisgICAgcHVibGljIExpc3RQb3B1cFdpbmRvdyhDb250ZXh0IGNvbnRleHQsIEF0dHJpYnV0ZVNldCBhdHRycywgaW50IGRlZlN0eWxlQXR0ciwgaW50IGRlZlN0eWxlUmVzKSB7CisgICAgICAgIG1Db250ZXh0ID0gY29udGV4dDsKKyAgICAgICAgbVBvcHVwID0gbmV3IFBvcHVwV2luZG93KGNvbnRleHQsIGF0dHJzLCBkZWZTdHlsZUF0dHIsIGRlZlN0eWxlUmVzKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBhZGFwdGVyIHRoYXQgcHJvdmlkZXMgdGhlIGRhdGEgYW5kIHRoZSB2aWV3cyB0byByZXByZXNlbnQgdGhlIGRhdGEKKyAgICAgKiBpbiB0aGlzIHBvcHVwIHdpbmRvdy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBhZGFwdGVyIFRoZSBhZGFwdGVyIHRvIHVzZSB0byBjcmVhdGUgdGhpcyB3aW5kb3cncyBjb250ZW50LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEFkYXB0ZXIoTGlzdEFkYXB0ZXIgYWRhcHRlcikgeworICAgICAgICBpZiAobU9ic2VydmVyID09IG51bGwpIHsKKyAgICAgICAgICAgIG1PYnNlcnZlciA9IG5ldyBQb3B1cERhdGFTZXRPYnNlcnZlcigpOworICAgICAgICB9IGVsc2UgaWYgKG1BZGFwdGVyICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1BZGFwdGVyLnVucmVnaXN0ZXJEYXRhU2V0T2JzZXJ2ZXIobU9ic2VydmVyKTsKKyAgICAgICAgfQorICAgICAgICBtQWRhcHRlciA9IGFkYXB0ZXI7CisgICAgICAgIGlmIChtQWRhcHRlciAhPSBudWxsKSB7CisgICAgICAgICAgICBhZGFwdGVyLnJlZ2lzdGVyRGF0YVNldE9ic2VydmVyKG1PYnNlcnZlcik7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIGlmIChtRHJvcERvd25MaXN0ICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1Ecm9wRG93bkxpc3Quc2V0QWRhcHRlcihtQWRhcHRlcik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgd2hlcmUgdGhlIG9wdGlvbmFsIHByb21wdCB2aWV3IHNob3VsZCBhcHBlYXIuIFRoZSBkZWZhdWx0IGlzCisgICAgICoge0BsaW5rICNQT1NJVElPTl9QUk9NUFRfQUJPVkV9LgorICAgICAqIAorICAgICAqIEBwYXJhbSBwb3NpdGlvbiBBIHBvc2l0aW9uIGNvbnN0YW50IGRlY2xhcmluZyB3aGVyZSB0aGUgcHJvbXB0IHNob3VsZCBiZSBkaXNwbGF5ZWQuCisgICAgICogCisgICAgICogQHNlZSAjUE9TSVRJT05fUFJPTVBUX0FCT1ZFCisgICAgICogQHNlZSAjUE9TSVRJT05fUFJPTVBUX0JFTE9XCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UHJvbXB0UG9zaXRpb24oaW50IHBvc2l0aW9uKSB7CisgICAgICAgIG1Qcm9tcHRQb3NpdGlvbiA9IHBvc2l0aW9uOworICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4gV2hlcmUgdGhlIG9wdGlvbmFsIHByb21wdCB2aWV3IHNob3VsZCBhcHBlYXIuCisgICAgICogCisgICAgICogQHNlZSAjUE9TSVRJT05fUFJPTVBUX0FCT1ZFCisgICAgICogQHNlZSAjUE9TSVRJT05fUFJPTVBUX0JFTE9XCisgICAgICovCisgICAgcHVibGljIGludCBnZXRQcm9tcHRQb3NpdGlvbigpIHsKKyAgICAgICAgcmV0dXJuIG1Qcm9tcHRQb3NpdGlvbjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgd2hldGhlciB0aGlzIHdpbmRvdyBzaG91bGQgYmUgbW9kYWwgd2hlbiBzaG93bi4KKyAgICAgKiAKKyAgICAgKiA8cD5JZiBhIHBvcHVwIHdpbmRvdyBpcyBtb2RhbCwgaXQgd2lsbCByZWNlaXZlIGFsbCB0b3VjaCBhbmQga2V5IGlucHV0LgorICAgICAqIElmIHRoZSB1c2VyIHRvdWNoZXMgb3V0c2lkZSB0aGUgcG9wdXAgd2luZG93J3MgY29udGVudCBhcmVhIHRoZSBwb3B1cCB3aW5kb3cKKyAgICAgKiB3aWxsIGJlIGRpc21pc3NlZC4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gbW9kYWwge0Bjb2RlIHRydWV9IGlmIHRoZSBwb3B1cCB3aW5kb3cgc2hvdWxkIGJlIG1vZGFsLCB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRNb2RhbChib29sZWFuIG1vZGFsKSB7CisgICAgICAgIG1Nb2RhbCA9IHRydWU7CisgICAgICAgIG1Qb3B1cC5zZXRGb2N1c2FibGUobW9kYWwpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgd2hldGhlciB0aGUgcG9wdXAgd2luZG93IHdpbGwgYmUgbW9kYWwgd2hlbiBzaG93bi4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGUgcG9wdXAgd2luZG93IHdpbGwgYmUgbW9kYWwsIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzTW9kYWwoKSB7CisgICAgICAgIHJldHVybiBtTW9kYWw7CisgICAgfQorCisgICAgLyoqCisgICAgICogRm9yY2VzIG91dHNpZGUgdG91Y2hlcyB0byBiZSBpZ25vcmVkLiBOb3JtYWxseSBpZiB7QGxpbmsgI2lzRHJvcERvd25BbHdheXNWaXNpYmxlKCl9IGlzCisgICAgICogZmFsc2UsIHdlIGFsbG93IG91dHNpZGUgdG91Y2ggdG8gZGlzbWlzcyB0aGUgZHJvcGRvd24uIElmIHRoaXMgaXMgc2V0IHRvIHRydWUsIHRoZW4gd2UKKyAgICAgKiBpZ25vcmUgb3V0c2lkZSB0b3VjaCBldmVuIHdoZW4gdGhlIGRyb3AgZG93biBpcyBub3Qgc2V0IHRvIGFsd2F5cyB2aXNpYmxlLgorICAgICAqIAorICAgICAqIEBoaWRlIFVzZWQgb25seSBieSBBdXRvQ29tcGxldGVUZXh0VmlldyB0byBoYW5kbGUgc29tZSBpbnRlcm5hbCBzcGVjaWFsIGNhc2VzLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEZvcmNlSWdub3JlT3V0c2lkZVRvdWNoKGJvb2xlYW4gZm9yY2VJZ25vcmVPdXRzaWRlVG91Y2gpIHsKKyAgICAgICAgbUZvcmNlSWdub3JlT3V0c2lkZVRvdWNoID0gZm9yY2VJZ25vcmVPdXRzaWRlVG91Y2g7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB3aGV0aGVyIHRoZSBkcm9wLWRvd24gc2hvdWxkIHJlbWFpbiB2aXNpYmxlIHVuZGVyIGNlcnRhaW4gY29uZGl0aW9ucy4KKyAgICAgKgorICAgICAqIFRoZSBkcm9wLWRvd24gd2lsbCBvY2N1cHkgdGhlIGVudGlyZSBzY3JlZW4gYmVsb3cge0BsaW5rICNnZXRBbmNob3JWaWV3fSByZWdhcmRsZXNzCisgICAgICogb2YgdGhlIHNpemUgb3IgY29udGVudCBvZiB0aGUgbGlzdC4gIHtAbGluayAjZ2V0QmFja2dyb3VuZCgpfSB3aWxsIGZpbGwgYW55IHNwYWNlCisgICAgICogdGhhdCBpcyBub3QgdXNlZCBieSB0aGUgbGlzdC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBkcm9wRG93bkFsd2F5c1Zpc2libGUgV2hldGhlciB0byBrZWVwIHRoZSBkcm9wLWRvd24gdmlzaWJsZS4KKyAgICAgKgorICAgICAqIEBoaWRlIE9ubHkgdXNlZCBieSBBdXRvQ29tcGxldGVUZXh0VmlldyB1bmRlciBzcGVjaWFsIGNvbmRpdGlvbnMuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RHJvcERvd25BbHdheXNWaXNpYmxlKGJvb2xlYW4gZHJvcERvd25BbHdheXNWaXNpYmxlKSB7CisgICAgICAgIG1Ecm9wRG93bkFsd2F5c1Zpc2libGUgPSBkcm9wRG93bkFsd2F5c1Zpc2libGU7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHJldHVybiBXaGV0aGVyIHRoZSBkcm9wLWRvd24gaXMgdmlzaWJsZSB1bmRlciBzcGVjaWFsIGNvbmRpdGlvbnMuCisgICAgICoKKyAgICAgKiBAaGlkZSBPbmx5IHVzZWQgYnkgQXV0b0NvbXBsZXRlVGV4dFZpZXcgdW5kZXIgc3BlY2lhbCBjb25kaXRpb25zLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzRHJvcERvd25BbHdheXNWaXNpYmxlKCkgeworICAgICAgICByZXR1cm4gbURyb3BEb3duQWx3YXlzVmlzaWJsZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBvcGVyYXRpbmcgbW9kZSBmb3IgdGhlIHNvZnQgaW5wdXQgYXJlYS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBtb2RlIFRoZSBkZXNpcmVkIG1vZGUsIHNlZQorICAgICAqICAgICAgICB7QGxpbmsgYW5kcm9pZC52aWV3LldpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zI3NvZnRJbnB1dE1vZGV9CisgICAgICogICAgICAgIGZvciB0aGUgZnVsbCBsaXN0CisgICAgICoKKyAgICAgKiBAc2VlIGFuZHJvaWQudmlldy5XaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcyNzb2Z0SW5wdXRNb2RlCisgICAgICogQHNlZSAjZ2V0U29mdElucHV0TW9kZSgpCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0U29mdElucHV0TW9kZShpbnQgbW9kZSkgeworICAgICAgICBtUG9wdXAuc2V0U29mdElucHV0TW9kZShtb2RlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBjdXJyZW50IHZhbHVlIGluIHtAbGluayAjc2V0U29mdElucHV0TW9kZShpbnQpfS4KKyAgICAgKgorICAgICAqIEBzZWUgI3NldFNvZnRJbnB1dE1vZGUoaW50KQorICAgICAqIEBzZWUgYW5kcm9pZC52aWV3LldpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zI3NvZnRJbnB1dE1vZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldFNvZnRJbnB1dE1vZGUoKSB7CisgICAgICAgIHJldHVybiBtUG9wdXAuZ2V0U29mdElucHV0TW9kZSgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgYSBkcmF3YWJsZSB0byB1c2UgYXMgdGhlIGxpc3QgaXRlbSBzZWxlY3Rvci4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gc2VsZWN0b3IgTGlzdCBzZWxlY3RvciBkcmF3YWJsZSB0byB1c2UgaW4gdGhlIHBvcHVwLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldExpc3RTZWxlY3RvcihEcmF3YWJsZSBzZWxlY3RvcikgeworICAgICAgICBtRHJvcERvd25MaXN0SGlnaGxpZ2h0ID0gc2VsZWN0b3I7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHJldHVybiBUaGUgYmFja2dyb3VuZCBkcmF3YWJsZSBmb3IgdGhlIHBvcHVwIHdpbmRvdy4KKyAgICAgKi8KKyAgICBwdWJsaWMgRHJhd2FibGUgZ2V0QmFja2dyb3VuZCgpIHsKKyAgICAgICAgcmV0dXJuIG1Qb3B1cC5nZXRCYWNrZ3JvdW5kKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyBhIGRyYXdhYmxlIHRvIGJlIHRoZSBiYWNrZ3JvdW5kIGZvciB0aGUgcG9wdXAgd2luZG93LgorICAgICAqIAorICAgICAqIEBwYXJhbSBkIEEgZHJhd2FibGUgdG8gc2V0IGFzIHRoZSBiYWNrZ3JvdW5kLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEJhY2tncm91bmREcmF3YWJsZShEcmF3YWJsZSBkKSB7CisgICAgICAgIG1Qb3B1cC5zZXRCYWNrZ3JvdW5kRHJhd2FibGUoZCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IGFuIGFuaW1hdGlvbiBzdHlsZSB0byB1c2Ugd2hlbiB0aGUgcG9wdXAgd2luZG93IGlzIHNob3duIG9yIGRpc21pc3NlZC4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gYW5pbWF0aW9uU3R5bGUgQW5pbWF0aW9uIHN0eWxlIHRvIHVzZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRBbmltYXRpb25TdHlsZShpbnQgYW5pbWF0aW9uU3R5bGUpIHsKKyAgICAgICAgbVBvcHVwLnNldEFuaW1hdGlvblN0eWxlKGFuaW1hdGlvblN0eWxlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBhbmltYXRpb24gc3R5bGUgdGhhdCB3aWxsIGJlIHVzZWQgd2hlbiB0aGUgcG9wdXAgd2luZG93IGlzCisgICAgICogc2hvd24gb3IgZGlzbWlzc2VkLgorICAgICAqIAorICAgICAqIEByZXR1cm4gQW5pbWF0aW9uIHN0eWxlIHRoYXQgd2lsbCBiZSB1c2VkLgorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0QW5pbWF0aW9uU3R5bGUoKSB7CisgICAgICAgIHJldHVybiBtUG9wdXAuZ2V0QW5pbWF0aW9uU3R5bGUoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSB2aWV3IHRoYXQgd2lsbCBiZSB1c2VkIHRvIGFuY2hvciB0aGlzIHBvcHVwLgorICAgICAqIAorICAgICAqIEByZXR1cm4gVGhlIHBvcHVwJ3MgYW5jaG9yIHZpZXcKKyAgICAgKi8KKyAgICBwdWJsaWMgVmlldyBnZXRBbmNob3JWaWV3KCkgeworICAgICAgICByZXR1cm4gbURyb3BEb3duQW5jaG9yVmlldzsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBwb3B1cCdzIGFuY2hvciB2aWV3LiBUaGlzIHBvcHVwIHdpbGwgYWx3YXlzIGJlIHBvc2l0aW9uZWQgcmVsYXRpdmUgdG8KKyAgICAgKiB0aGUgYW5jaG9yIHZpZXcgd2hlbiBzaG93bi4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gYW5jaG9yIFRoZSB2aWV3IHRvIHVzZSBhcyBhbiBhbmNob3IuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0QW5jaG9yVmlldyhWaWV3IGFuY2hvcikgeworICAgICAgICBtRHJvcERvd25BbmNob3JWaWV3ID0gYW5jaG9yOworICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4gVGhlIGhvcml6b250YWwgb2Zmc2V0IG9mIHRoZSBwb3B1cCBmcm9tIGl0cyBhbmNob3IgaW4gcGl4ZWxzLgorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0SG9yaXpvbnRhbE9mZnNldCgpIHsKKyAgICAgICAgcmV0dXJuIG1Ecm9wRG93bkhvcml6b250YWxPZmZzZXQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBob3Jpem9udGFsIG9mZnNldCBvZiB0aGlzIHBvcHVwIGZyb20gaXRzIGFuY2hvciB2aWV3IGluIHBpeGVscy4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gb2Zmc2V0IFRoZSBob3Jpem9udGFsIG9mZnNldCBvZiB0aGUgcG9wdXAgZnJvbSBpdHMgYW5jaG9yLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEhvcml6b250YWxPZmZzZXQoaW50IG9mZnNldCkgeworICAgICAgICBtRHJvcERvd25Ib3Jpem9udGFsT2Zmc2V0ID0gb2Zmc2V0OworICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4gVGhlIHZlcnRpY2FsIG9mZnNldCBvZiB0aGUgcG9wdXAgZnJvbSBpdHMgYW5jaG9yIGluIHBpeGVscy4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldFZlcnRpY2FsT2Zmc2V0KCkgeworICAgICAgICByZXR1cm4gbURyb3BEb3duVmVydGljYWxPZmZzZXQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSB2ZXJ0aWNhbCBvZmZzZXQgb2YgdGhpcyBwb3B1cCBmcm9tIGl0cyBhbmNob3IgdmlldyBpbiBwaXhlbHMuCisgICAgICogCisgICAgICogQHBhcmFtIG9mZnNldCBUaGUgdmVydGljYWwgb2Zmc2V0IG9mIHRoZSBwb3B1cCBmcm9tIGl0cyBhbmNob3IuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0VmVydGljYWxPZmZzZXQoaW50IG9mZnNldCkgeworICAgICAgICBtRHJvcERvd25WZXJ0aWNhbE9mZnNldCA9IG9mZnNldDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIFRoZSB3aWR0aCBvZiB0aGUgcG9wdXAgd2luZG93IGluIHBpeGVscy4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldFdpZHRoKCkgeworICAgICAgICByZXR1cm4gbURyb3BEb3duV2lkdGg7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgd2lkdGggb2YgdGhlIHBvcHVwIHdpbmRvdyBpbiBwaXhlbHMuIENhbiBhbHNvIGJlIHtAbGluayAjTUFUQ0hfUEFSRU5UfQorICAgICAqIG9yIHtAbGluayAjV1JBUF9DT05URU5UfS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gd2lkdGggV2lkdGggb2YgdGhlIHBvcHVwIHdpbmRvdy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRXaWR0aChpbnQgd2lkdGgpIHsKKyAgICAgICAgbURyb3BEb3duV2lkdGggPSB3aWR0aDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSB3aWR0aCBvZiB0aGUgcG9wdXAgd2luZG93IGJ5IHRoZSBzaXplIG9mIGl0cyBjb250ZW50LiBUaGUgZmluYWwgd2lkdGggbWF5IGJlCisgICAgICogbGFyZ2VyIHRvIGFjY29tbW9kYXRlIHN0eWxlZCB3aW5kb3cgZHJlc3NpbmcuCisgICAgICoKKyAgICAgKiBAcGFyYW0gd2lkdGggRGVzaXJlZCB3aWR0aCBvZiBjb250ZW50IGluIHBpeGVscy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRDb250ZW50V2lkdGgoaW50IHdpZHRoKSB7CisgICAgICAgIERyYXdhYmxlIHBvcHVwQmFja2dyb3VuZCA9IG1Qb3B1cC5nZXRCYWNrZ3JvdW5kKCk7CisgICAgICAgIGlmIChwb3B1cEJhY2tncm91bmQgIT0gbnVsbCkgeworICAgICAgICAgICAgbURyb3BEb3duV2lkdGggPSBwb3B1cEJhY2tncm91bmQuZ2V0SW50cmluc2ljV2lkdGgoKSArIHdpZHRoOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQHJldHVybiBUaGUgaGVpZ2h0IG9mIHRoZSBwb3B1cCB3aW5kb3cgaW4gcGl4ZWxzLgorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0SGVpZ2h0KCkgeworICAgICAgICByZXR1cm4gbURyb3BEb3duSGVpZ2h0OworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIGhlaWdodCBvZiB0aGUgcG9wdXAgd2luZG93IGluIHBpeGVscy4gQ2FuIGFsc28gYmUge0BsaW5rICNNQVRDSF9QQVJFTlR9LgorICAgICAqIAorICAgICAqIEBwYXJhbSBoZWlnaHQgSGVpZ2h0IG9mIHRoZSBwb3B1cCB3aW5kb3cuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0SGVpZ2h0KGludCBoZWlnaHQpIHsKKyAgICAgICAgbURyb3BEb3duSGVpZ2h0ID0gaGVpZ2h0OworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgYSBsaXN0ZW5lciB0byByZWNlaXZlIGV2ZW50cyB3aGVuIGEgbGlzdCBpdGVtIGlzIGNsaWNrZWQuCisgICAgICogCisgICAgICogQHBhcmFtIGNsaWNrTGlzdGVuZXIgTGlzdGVuZXIgdG8gcmVnaXN0ZXIKKyAgICAgKiAKKyAgICAgKiBAc2VlIExpc3RWaWV3I3NldE9uSXRlbUNsaWNrTGlzdGVuZXIoYW5kcm9pZC53aWRnZXQuQWRhcHRlclZpZXcuT25JdGVtQ2xpY2tMaXN0ZW5lcikKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRPbkl0ZW1DbGlja0xpc3RlbmVyKEFkYXB0ZXJWaWV3Lk9uSXRlbUNsaWNrTGlzdGVuZXIgY2xpY2tMaXN0ZW5lcikgeworICAgICAgICBtSXRlbUNsaWNrTGlzdGVuZXIgPSBjbGlja0xpc3RlbmVyOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgYSBsaXN0ZW5lciB0byByZWNlaXZlIGV2ZW50cyB3aGVuIGEgbGlzdCBpdGVtIGlzIHNlbGVjdGVkLgorICAgICAqIAorICAgICAqIEBwYXJhbSBzZWxlY3RlZExpc3RlbmVyIExpc3RlbmVyIHRvIHJlZ2lzdGVyLgorICAgICAqIAorICAgICAqIEBzZWUgTGlzdFZpZXcjc2V0T25JdGVtU2VsZWN0ZWRMaXN0ZW5lcihhbmRyb2lkLndpZGdldC5BZGFwdGVyVmlldy5Pbkl0ZW1TZWxlY3RlZExpc3RlbmVyKQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldE9uSXRlbVNlbGVjdGVkTGlzdGVuZXIoQWRhcHRlclZpZXcuT25JdGVtU2VsZWN0ZWRMaXN0ZW5lciBzZWxlY3RlZExpc3RlbmVyKSB7CisgICAgICAgIG1JdGVtU2VsZWN0ZWRMaXN0ZW5lciA9IHNlbGVjdGVkTGlzdGVuZXI7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IGEgdmlldyB0byBhY3QgYXMgYSB1c2VyIHByb21wdCBmb3IgdGhpcyBwb3B1cCB3aW5kb3cuIFdoZXJlIHRoZSBwcm9tcHQgdmlldyB3aWxsIGFwcGVhcgorICAgICAqIGlzIGNvbnRyb2xsZWQgYnkge0BsaW5rICNzZXRQcm9tcHRQb3NpdGlvbihpbnQpfS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gcHJvbXB0IFZpZXcgdG8gdXNlIGFzIGFuIGluZm9ybWF0aW9uYWwgcHJvbXB0LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFByb21wdFZpZXcoVmlldyBwcm9tcHQpIHsKKyAgICAgICAgYm9vbGVhbiBzaG93aW5nID0gaXNTaG93aW5nKCk7CisgICAgICAgIGlmIChzaG93aW5nKSB7CisgICAgICAgICAgICByZW1vdmVQcm9tcHRWaWV3KCk7CisgICAgICAgIH0KKyAgICAgICAgbVByb21wdFZpZXcgPSBwcm9tcHQ7CisgICAgICAgIGlmIChzaG93aW5nKSB7CisgICAgICAgICAgICBzaG93KCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQb3N0IGEge0BsaW5rICNzaG93KCl9IGNhbGwgdG8gdGhlIFVJIHRocmVhZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBwb3N0U2hvdygpIHsKKyAgICAgICAgbUhhbmRsZXIucG9zdChtU2hvd0Ryb3BEb3duUnVubmFibGUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNob3cgdGhlIHBvcHVwIGxpc3QuIElmIHRoZSBsaXN0IGlzIGFscmVhZHkgc2hvd2luZywgdGhpcyBtZXRob2QKKyAgICAgKiB3aWxsIHJlY2FsY3VsYXRlIHRoZSBwb3B1cCdzIHNpemUgYW5kIHBvc2l0aW9uLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNob3coKSB7CisgICAgICAgIGludCBoZWlnaHQgPSBidWlsZERyb3BEb3duKCk7CisKKyAgICAgICAgaW50IHdpZHRoU3BlYyA9IDA7CisgICAgICAgIGludCBoZWlnaHRTcGVjID0gMDsKKworICAgICAgICBib29sZWFuIG5vSW5wdXRNZXRob2QgPSBpc0lucHV0TWV0aG9kTm90TmVlZGVkKCk7CisKKyAgICAgICAgaWYgKG1Qb3B1cC5pc1Nob3dpbmcoKSkgeworICAgICAgICAgICAgaWYgKG1Ecm9wRG93bldpZHRoID09IFZpZXdHcm91cC5MYXlvdXRQYXJhbXMuTUFUQ0hfUEFSRU5UKSB7CisgICAgICAgICAgICAgICAgLy8gVGhlIGNhbGwgdG8gUG9wdXBXaW5kb3cncyB1cGRhdGUgbWV0aG9kIGJlbG93IGNhbiBhY2NlcHQgLTEgZm9yIGFueQorICAgICAgICAgICAgICAgIC8vIHZhbHVlIHlvdSBkbyBub3Qgd2FudCB0byB1cGRhdGUuCisgICAgICAgICAgICAgICAgd2lkdGhTcGVjID0gLTE7CisgICAgICAgICAgICB9IGVsc2UgaWYgKG1Ecm9wRG93bldpZHRoID09IFZpZXdHcm91cC5MYXlvdXRQYXJhbXMuV1JBUF9DT05URU5UKSB7CisgICAgICAgICAgICAgICAgd2lkdGhTcGVjID0gZ2V0QW5jaG9yVmlldygpLmdldFdpZHRoKCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHdpZHRoU3BlYyA9IG1Ecm9wRG93bldpZHRoOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAobURyb3BEb3duSGVpZ2h0ID09IFZpZXdHcm91cC5MYXlvdXRQYXJhbXMuTUFUQ0hfUEFSRU5UKSB7CisgICAgICAgICAgICAgICAgLy8gVGhlIGNhbGwgdG8gUG9wdXBXaW5kb3cncyB1cGRhdGUgbWV0aG9kIGJlbG93IGNhbiBhY2NlcHQgLTEgZm9yIGFueQorICAgICAgICAgICAgICAgIC8vIHZhbHVlIHlvdSBkbyBub3Qgd2FudCB0byB1cGRhdGUuCisgICAgICAgICAgICAgICAgaGVpZ2h0U3BlYyA9IG5vSW5wdXRNZXRob2QgPyBoZWlnaHQgOiBWaWV3R3JvdXAuTGF5b3V0UGFyYW1zLk1BVENIX1BBUkVOVDsKKyAgICAgICAgICAgICAgICBpZiAobm9JbnB1dE1ldGhvZCkgeworICAgICAgICAgICAgICAgICAgICBtUG9wdXAuc2V0V2luZG93TGF5b3V0TW9kZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtRHJvcERvd25XaWR0aCA9PSBWaWV3R3JvdXAuTGF5b3V0UGFyYW1zLk1BVENIX1BBUkVOVCA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWaWV3R3JvdXAuTGF5b3V0UGFyYW1zLk1BVENIX1BBUkVOVCA6IDAsIDApOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIG1Qb3B1cC5zZXRXaW5kb3dMYXlvdXRNb2RlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Ecm9wRG93bldpZHRoID09IFZpZXdHcm91cC5MYXlvdXRQYXJhbXMuTUFUQ0hfUEFSRU5UID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZpZXdHcm91cC5MYXlvdXRQYXJhbXMuTUFUQ0hfUEFSRU5UIDogMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBWaWV3R3JvdXAuTGF5b3V0UGFyYW1zLk1BVENIX1BBUkVOVCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIGlmIChtRHJvcERvd25IZWlnaHQgPT0gVmlld0dyb3VwLkxheW91dFBhcmFtcy5XUkFQX0NPTlRFTlQpIHsKKyAgICAgICAgICAgICAgICBoZWlnaHRTcGVjID0gaGVpZ2h0OworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBoZWlnaHRTcGVjID0gbURyb3BEb3duSGVpZ2h0OworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBtUG9wdXAuc2V0T3V0c2lkZVRvdWNoYWJsZSghbUZvcmNlSWdub3JlT3V0c2lkZVRvdWNoICYmICFtRHJvcERvd25BbHdheXNWaXNpYmxlKTsKKworICAgICAgICAgICAgbVBvcHVwLnVwZGF0ZShnZXRBbmNob3JWaWV3KCksIG1Ecm9wRG93bkhvcml6b250YWxPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgIG1Ecm9wRG93blZlcnRpY2FsT2Zmc2V0LCB3aWR0aFNwZWMsIGhlaWdodFNwZWMpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKG1Ecm9wRG93bldpZHRoID09IFZpZXdHcm91cC5MYXlvdXRQYXJhbXMuTUFUQ0hfUEFSRU5UKSB7CisgICAgICAgICAgICAgICAgd2lkdGhTcGVjID0gVmlld0dyb3VwLkxheW91dFBhcmFtcy5NQVRDSF9QQVJFTlQ7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGlmIChtRHJvcERvd25XaWR0aCA9PSBWaWV3R3JvdXAuTGF5b3V0UGFyYW1zLldSQVBfQ09OVEVOVCkgeworICAgICAgICAgICAgICAgICAgICBtUG9wdXAuc2V0V2lkdGgoZ2V0QW5jaG9yVmlldygpLmdldFdpZHRoKCkpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIG1Qb3B1cC5zZXRXaWR0aChtRHJvcERvd25XaWR0aCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAobURyb3BEb3duSGVpZ2h0ID09IFZpZXdHcm91cC5MYXlvdXRQYXJhbXMuTUFUQ0hfUEFSRU5UKSB7CisgICAgICAgICAgICAgICAgaGVpZ2h0U3BlYyA9IFZpZXdHcm91cC5MYXlvdXRQYXJhbXMuTUFUQ0hfUEFSRU5UOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZiAobURyb3BEb3duSGVpZ2h0ID09IFZpZXdHcm91cC5MYXlvdXRQYXJhbXMuV1JBUF9DT05URU5UKSB7CisgICAgICAgICAgICAgICAgICAgIG1Qb3B1cC5zZXRIZWlnaHQoaGVpZ2h0KTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBtUG9wdXAuc2V0SGVpZ2h0KG1Ecm9wRG93bkhlaWdodCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBtUG9wdXAuc2V0V2luZG93TGF5b3V0TW9kZSh3aWR0aFNwZWMsIGhlaWdodFNwZWMpOworICAgICAgICAgICAgbVBvcHVwLnNldElucHV0TWV0aG9kTW9kZShQb3B1cFdpbmRvdy5JTlBVVF9NRVRIT0RfTkVFREVEKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgLy8gdXNlIG91dHNpZGUgdG91Y2hhYmxlIHRvIGRpc21pc3MgZHJvcCBkb3duIHdoZW4gdG91Y2hpbmcgb3V0c2lkZSBvZiBpdCwgc28KKyAgICAgICAgICAgIC8vIG9ubHkgc2V0IHRoaXMgaWYgdGhlIGRyb3Bkb3duIGlzIG5vdCBhbHdheXMgdmlzaWJsZQorICAgICAgICAgICAgbVBvcHVwLnNldE91dHNpZGVUb3VjaGFibGUoIW1Gb3JjZUlnbm9yZU91dHNpZGVUb3VjaCAmJiAhbURyb3BEb3duQWx3YXlzVmlzaWJsZSk7CisgICAgICAgICAgICBtUG9wdXAuc2V0VG91Y2hJbnRlcmNlcHRvcihtVG91Y2hJbnRlcmNlcHRvcik7CisgICAgICAgICAgICBtUG9wdXAuc2hvd0FzRHJvcERvd24oZ2V0QW5jaG9yVmlldygpLAorICAgICAgICAgICAgICAgICAgICBtRHJvcERvd25Ib3Jpem9udGFsT2Zmc2V0LCBtRHJvcERvd25WZXJ0aWNhbE9mZnNldCk7CisgICAgICAgICAgICBtRHJvcERvd25MaXN0LnNldFNlbGVjdGlvbihMaXN0Vmlldy5JTlZBTElEX1BPU0lUSU9OKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgaWYgKCFtTW9kYWwgfHwgbURyb3BEb3duTGlzdC5pc0luVG91Y2hNb2RlKCkpIHsKKyAgICAgICAgICAgICAgICBjbGVhckxpc3RTZWxlY3Rpb24oKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICghbU1vZGFsKSB7CisgICAgICAgICAgICAgICAgbUhhbmRsZXIucG9zdChtSGlkZVNlbGVjdG9yKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIERpc21pc3MgdGhlIHBvcHVwIHdpbmRvdy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBkaXNtaXNzKCkgeworICAgICAgICBtUG9wdXAuZGlzbWlzcygpOworICAgICAgICByZW1vdmVQcm9tcHRWaWV3KCk7CisgICAgICAgIG1Qb3B1cC5zZXRDb250ZW50VmlldyhudWxsKTsKKyAgICAgICAgbURyb3BEb3duTGlzdCA9IG51bGw7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IGEgbGlzdGVuZXIgdG8gcmVjZWl2ZSBhIGNhbGxiYWNrIHdoZW4gdGhlIHBvcHVwIGlzIGRpc21pc3NlZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBsaXN0ZW5lciBMaXN0ZW5lciB0aGF0IHdpbGwgYmUgbm90aWZpZWQgd2hlbiB0aGUgcG9wdXAgaXMgZGlzbWlzc2VkLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldE9uRGlzbWlzc0xpc3RlbmVyKFBvcHVwV2luZG93Lk9uRGlzbWlzc0xpc3RlbmVyIGxpc3RlbmVyKSB7CisgICAgICAgIG1Qb3B1cC5zZXRPbkRpc21pc3NMaXN0ZW5lcihsaXN0ZW5lcik7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHJlbW92ZVByb21wdFZpZXcoKSB7CisgICAgICAgIGlmIChtUHJvbXB0VmlldyAhPSBudWxsKSB7CisgICAgICAgICAgICBmaW5hbCBWaWV3UGFyZW50IHBhcmVudCA9IG1Qcm9tcHRWaWV3LmdldFBhcmVudCgpOworICAgICAgICAgICAgaWYgKHBhcmVudCBpbnN0YW5jZW9mIFZpZXdHcm91cCkgeworICAgICAgICAgICAgICAgIGZpbmFsIFZpZXdHcm91cCBncm91cCA9IChWaWV3R3JvdXApIHBhcmVudDsKKyAgICAgICAgICAgICAgICBncm91cC5yZW1vdmVWaWV3KG1Qcm9tcHRWaWV3KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnRyb2wgaG93IHRoZSBwb3B1cCBvcGVyYXRlcyB3aXRoIGFuIGlucHV0IG1ldGhvZDogb25lIG9mCisgICAgICoge0BsaW5rICNJTlBVVF9NRVRIT0RfRlJPTV9GT0NVU0FCTEV9LCB7QGxpbmsgI0lOUFVUX01FVEhPRF9ORUVERUR9LAorICAgICAqIG9yIHtAbGluayAjSU5QVVRfTUVUSE9EX05PVF9ORUVERUR9LgorICAgICAqIAorICAgICAqIDxwPklmIHRoZSBwb3B1cCBpcyBzaG93aW5nLCBjYWxsaW5nIHRoaXMgbWV0aG9kIHdpbGwgdGFrZSBlZmZlY3Qgb25seQorICAgICAqIHRoZSBuZXh0IHRpbWUgdGhlIHBvcHVwIGlzIHNob3duIG9yIHRocm91Z2ggYSBtYW51YWwgY2FsbCB0byB0aGUge0BsaW5rICNzaG93KCl9CisgICAgICogbWV0aG9kLjwvcD4KKyAgICAgKiAKKyAgICAgKiBAc2VlICNnZXRJbnB1dE1ldGhvZE1vZGUoKQorICAgICAqIEBzZWUgI3Nob3coKQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldElucHV0TWV0aG9kTW9kZShpbnQgbW9kZSkgeworICAgICAgICBtUG9wdXAuc2V0SW5wdXRNZXRob2RNb2RlKG1vZGUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgY3VycmVudCB2YWx1ZSBpbiB7QGxpbmsgI3NldElucHV0TWV0aG9kTW9kZShpbnQpfS4KKyAgICAgKiAKKyAgICAgKiBAc2VlICNzZXRJbnB1dE1ldGhvZE1vZGUoaW50KQorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0SW5wdXRNZXRob2RNb2RlKCkgeworICAgICAgICByZXR1cm4gbVBvcHVwLmdldElucHV0TWV0aG9kTW9kZSgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgc2VsZWN0ZWQgcG9zaXRpb24gb2YgdGhlIGxpc3QuCisgICAgICogT25seSB2YWxpZCB3aGVuIHtAbGluayAjaXNTaG93aW5nKCl9ID09IHtAY29kZSB0cnVlfS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gcG9zaXRpb24gTGlzdCBwb3NpdGlvbiB0byBzZXQgYXMgc2VsZWN0ZWQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0U2VsZWN0aW9uKGludCBwb3NpdGlvbikgeworICAgICAgICBEcm9wRG93bkxpc3RWaWV3IGxpc3QgPSBtRHJvcERvd25MaXN0OworICAgICAgICBpZiAoaXNTaG93aW5nKCkgJiYgbGlzdCAhPSBudWxsKSB7CisgICAgICAgICAgICBsaXN0Lm1MaXN0U2VsZWN0aW9uSGlkZGVuID0gZmFsc2U7CisgICAgICAgICAgICBsaXN0LnNldFNlbGVjdGlvbihwb3NpdGlvbik7CisgICAgICAgICAgICBpZiAobGlzdC5nZXRDaG9pY2VNb2RlKCkgIT0gTGlzdFZpZXcuQ0hPSUNFX01PREVfTk9ORSkgeworICAgICAgICAgICAgICAgIGxpc3Quc2V0SXRlbUNoZWNrZWQocG9zaXRpb24sIHRydWUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2xlYXIgYW55IGN1cnJlbnQgbGlzdCBzZWxlY3Rpb24uCisgICAgICogT25seSB2YWxpZCB3aGVuIHtAbGluayAjaXNTaG93aW5nKCl9ID09IHtAY29kZSB0cnVlfS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBjbGVhckxpc3RTZWxlY3Rpb24oKSB7CisgICAgICAgIGZpbmFsIERyb3BEb3duTGlzdFZpZXcgbGlzdCA9IG1Ecm9wRG93bkxpc3Q7CisgICAgICAgIGlmIChsaXN0ICE9IG51bGwpIHsKKyAgICAgICAgICAgIC8vIFdBUk5JTkc6IFBsZWFzZSByZWFkIHRoZSBjb21tZW50IHdoZXJlIG1MaXN0U2VsZWN0aW9uSGlkZGVuIGlzIGRlY2xhcmVkCisgICAgICAgICAgICBsaXN0Lm1MaXN0U2VsZWN0aW9uSGlkZGVuID0gdHJ1ZTsKKyAgICAgICAgICAgIGxpc3QuaGlkZVNlbGVjdG9yKCk7CisgICAgICAgICAgICBsaXN0LnJlcXVlc3RMYXlvdXQoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoZSBwb3B1cCBpcyBjdXJyZW50bHkgc2hvd2luZywge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNTaG93aW5nKCkgeworICAgICAgICByZXR1cm4gbVBvcHVwLmlzU2hvd2luZygpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoaXMgcG9wdXAgaXMgY29uZmlndXJlZCB0byBhc3N1bWUgdGhlIHVzZXIgZG9lcyBub3QgbmVlZAorICAgICAqIHRvIGludGVyYWN0IHdpdGggdGhlIElNRSB3aGlsZSBpdCBpcyBzaG93aW5nLCB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc0lucHV0TWV0aG9kTm90TmVlZGVkKCkgeworICAgICAgICByZXR1cm4gbVBvcHVwLmdldElucHV0TWV0aG9kTW9kZSgpID09IElOUFVUX01FVEhPRF9OT1RfTkVFREVEOworICAgIH0KKworICAgIC8qKgorICAgICAqIFBlcmZvcm0gYW4gaXRlbSBjbGljayBvcGVyYXRpb24gb24gdGhlIHNwZWNpZmllZCBsaXN0IGFkYXB0ZXIgcG9zaXRpb24uCisgICAgICogCisgICAgICogQHBhcmFtIHBvc2l0aW9uIEFkYXB0ZXIgcG9zaXRpb24gZm9yIHBlcmZvcm1pbmcgdGhlIGNsaWNrCisgICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBjbGljayBhY3Rpb24gY291bGQgYmUgcGVyZm9ybWVkLCBmYWxzZSBpZiBub3QuCisgICAgICogICAgICAgICAoZS5nLiBpZiB0aGUgcG9wdXAgd2FzIG5vdCBzaG93aW5nLCB0aGlzIG1ldGhvZCB3b3VsZCByZXR1cm4gZmFsc2UuKQorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIHBlcmZvcm1JdGVtQ2xpY2soaW50IHBvc2l0aW9uKSB7CisgICAgICAgIGlmIChpc1Nob3dpbmcoKSkgeworICAgICAgICAgICAgaWYgKG1JdGVtQ2xpY2tMaXN0ZW5lciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgZmluYWwgRHJvcERvd25MaXN0VmlldyBsaXN0ID0gbURyb3BEb3duTGlzdDsKKyAgICAgICAgICAgICAgICBmaW5hbCBWaWV3IGNoaWxkID0gbGlzdC5nZXRDaGlsZEF0KHBvc2l0aW9uIC0gbGlzdC5nZXRGaXJzdFZpc2libGVQb3NpdGlvbigpKTsKKyAgICAgICAgICAgICAgICBmaW5hbCBMaXN0QWRhcHRlciBhZGFwdGVyID0gbGlzdC5nZXRBZGFwdGVyKCk7CisgICAgICAgICAgICAgICAgbUl0ZW1DbGlja0xpc3RlbmVyLm9uSXRlbUNsaWNrKGxpc3QsIGNoaWxkLCBwb3NpdGlvbiwgYWRhcHRlci5nZXRJdGVtSWQocG9zaXRpb24pKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIFRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgaXRlbSBvciBudWxsIGlmIHRoZSBwb3B1cCBpcyBub3Qgc2hvd2luZy4KKyAgICAgKi8KKyAgICBwdWJsaWMgT2JqZWN0IGdldFNlbGVjdGVkSXRlbSgpIHsKKyAgICAgICAgaWYgKCFpc1Nob3dpbmcoKSkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG1Ecm9wRG93bkxpc3QuZ2V0U2VsZWN0ZWRJdGVtKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHJldHVybiBUaGUgcG9zaXRpb24gb2YgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCBpdGVtIG9yIHtAbGluayBMaXN0VmlldyNJTlZBTElEX1BPU0lUSU9OfQorICAgICAqIGlmIHtAbGluayAjaXNTaG93aW5nKCl9ID09IHtAY29kZSBmYWxzZX0uCisgICAgICogCisgICAgICogQHNlZSBMaXN0VmlldyNnZXRTZWxlY3RlZEl0ZW1Qb3NpdGlvbigpCisgICAgICovCisgICAgcHVibGljIGludCBnZXRTZWxlY3RlZEl0ZW1Qb3NpdGlvbigpIHsKKyAgICAgICAgaWYgKCFpc1Nob3dpbmcoKSkgeworICAgICAgICAgICAgcmV0dXJuIExpc3RWaWV3LklOVkFMSURfUE9TSVRJT047CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG1Ecm9wRG93bkxpc3QuZ2V0U2VsZWN0ZWRJdGVtUG9zaXRpb24oKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIFRoZSBJRCBvZiB0aGUgY3VycmVudGx5IHNlbGVjdGVkIGl0ZW0gb3Ige0BsaW5rIExpc3RWaWV3I0lOVkFMSURfUk9XX0lEfQorICAgICAqIGlmIHtAbGluayAjaXNTaG93aW5nKCl9ID09IHtAY29kZSBmYWxzZX0uCisgICAgICogCisgICAgICogQHNlZSBMaXN0VmlldyNnZXRTZWxlY3RlZEl0ZW1JZCgpCisgICAgICovCisgICAgcHVibGljIGxvbmcgZ2V0U2VsZWN0ZWRJdGVtSWQoKSB7CisgICAgICAgIGlmICghaXNTaG93aW5nKCkpIHsKKyAgICAgICAgICAgIHJldHVybiBMaXN0Vmlldy5JTlZBTElEX1JPV19JRDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbURyb3BEb3duTGlzdC5nZXRTZWxlY3RlZEl0ZW1JZCgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4gVGhlIFZpZXcgZm9yIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgaXRlbSBvciBudWxsIGlmCisgICAgICoge0BsaW5rICNpc1Nob3dpbmcoKX0gPT0ge0Bjb2RlIGZhbHNlfS4KKyAgICAgKiAKKyAgICAgKiBAc2VlIExpc3RWaWV3I2dldFNlbGVjdGVkVmlldygpCisgICAgICovCisgICAgcHVibGljIFZpZXcgZ2V0U2VsZWN0ZWRWaWV3KCkgeworICAgICAgICBpZiAoIWlzU2hvd2luZygpKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbURyb3BEb3duTGlzdC5nZXRTZWxlY3RlZFZpZXcoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIFRoZSB7QGxpbmsgTGlzdFZpZXd9IGRpc3BsYXllZCB3aXRoaW4gdGhlIHBvcHVwIHdpbmRvdy4KKyAgICAgKiBPbmx5IHZhbGlkIHdoZW4ge0BsaW5rICNpc1Nob3dpbmcoKX0gPT0ge0Bjb2RlIHRydWV9LgorICAgICAqLworICAgIHB1YmxpYyBMaXN0VmlldyBnZXRMaXN0VmlldygpIHsKKyAgICAgICAgcmV0dXJuIG1Ecm9wRG93bkxpc3Q7CisgICAgfQorCisgICAgLyoqCisgICAgICogRmlsdGVyIGtleSBkb3duIGV2ZW50cy4gQnkgZm9yd2FyZGluZyBrZXkgdXAgZXZlbnRzIHRvIHRoaXMgZnVuY3Rpb24sCisgICAgICogdmlld3MgdXNpbmcgbm9uLW1vZGFsIExpc3RQb3B1cFdpbmRvdyBjYW4gaGF2ZSBpdCBoYW5kbGUga2V5IHNlbGVjdGlvbiBvZiBpdGVtcy4KKyAgICAgKiAgCisgICAgICogQHBhcmFtIGtleUNvZGUga2V5Q29kZSBwYXJhbSBwYXNzZWQgdG8gdGhlIGhvc3QgdmlldydzIG9uS2V5RG93bgorICAgICAqIEBwYXJhbSBldmVudCBldmVudCBwYXJhbSBwYXNzZWQgdG8gdGhlIGhvc3QgdmlldydzIG9uS2V5RG93bgorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgZXZlbnQgd2FzIGhhbmRsZWQsIGZhbHNlIGlmIGl0IHdhcyBpZ25vcmVkLgorICAgICAqIAorICAgICAqIEBzZWUgI3NldE1vZGFsKGJvb2xlYW4pCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gb25LZXlEb3duKGludCBrZXlDb2RlLCBLZXlFdmVudCBldmVudCkgeworICAgICAgICAvLyB3aGVuIHRoZSBkcm9wIGRvd24gaXMgc2hvd24sIHdlIGRyaXZlIGl0IGRpcmVjdGx5CisgICAgICAgIGlmIChpc1Nob3dpbmcoKSkgeworICAgICAgICAgICAgLy8gdGhlIGtleSBldmVudHMgYXJlIGZvcndhcmRlZCB0byB0aGUgbGlzdCBpbiB0aGUgZHJvcCBkb3duIHZpZXcKKyAgICAgICAgICAgIC8vIG5vdGUgdGhhdCBMaXN0VmlldyBoYW5kbGVzIHNwYWNlIGJ1dCB3ZSBkb24ndCB3YW50IHRoYXQgdG8gaGFwcGVuCisgICAgICAgICAgICAvLyBhbHNvIGlmIHNlbGVjdGlvbiBpcyBub3QgY3VycmVudGx5IGluIHRoZSBkcm9wIGRvd24sIHRoZW4gZG9uJ3QKKyAgICAgICAgICAgIC8vIGxldCBjZW50ZXIgb3IgZW50ZXIgcHJlc3NlcyBnbyB0aGVyZSBzaW5jZSB0aGF0IHdvdWxkIGNhdXNlIGl0CisgICAgICAgICAgICAvLyB0byBzZWxlY3Qgb25lIG9mIGl0cyBpdGVtcworICAgICAgICAgICAgaWYgKGtleUNvZGUgIT0gS2V5RXZlbnQuS0VZQ09ERV9TUEFDRQorICAgICAgICAgICAgICAgICAgICAmJiAobURyb3BEb3duTGlzdC5nZXRTZWxlY3RlZEl0ZW1Qb3NpdGlvbigpID49IDAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoa2V5Q29kZSAhPSBLZXlFdmVudC5LRVlDT0RFX0VOVEVSCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBrZXlDb2RlICE9IEtleUV2ZW50LktFWUNPREVfRFBBRF9DRU5URVIpKSkgeworICAgICAgICAgICAgICAgIGludCBjdXJJbmRleCA9IG1Ecm9wRG93bkxpc3QuZ2V0U2VsZWN0ZWRJdGVtUG9zaXRpb24oKTsKKyAgICAgICAgICAgICAgICBib29sZWFuIGNvbnN1bWVkOworCisgICAgICAgICAgICAgICAgZmluYWwgYm9vbGVhbiBiZWxvdyA9ICFtUG9wdXAuaXNBYm92ZUFuY2hvcigpOworCisgICAgICAgICAgICAgICAgZmluYWwgTGlzdEFkYXB0ZXIgYWRhcHRlciA9IG1BZGFwdGVyOworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIGJvb2xlYW4gYWxsRW5hYmxlZDsKKyAgICAgICAgICAgICAgICBpbnQgZmlyc3RJdGVtID0gSW50ZWdlci5NQVhfVkFMVUU7CisgICAgICAgICAgICAgICAgaW50IGxhc3RJdGVtID0gSW50ZWdlci5NSU5fVkFMVUU7CisKKyAgICAgICAgICAgICAgICBpZiAoYWRhcHRlciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGFsbEVuYWJsZWQgPSBhZGFwdGVyLmFyZUFsbEl0ZW1zRW5hYmxlZCgpOworICAgICAgICAgICAgICAgICAgICBmaXJzdEl0ZW0gPSBhbGxFbmFibGVkID8gMCA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbURyb3BEb3duTGlzdC5sb29rRm9yU2VsZWN0YWJsZVBvc2l0aW9uKDAsIHRydWUpOworICAgICAgICAgICAgICAgICAgICBsYXN0SXRlbSA9IGFsbEVuYWJsZWQgPyBhZGFwdGVyLmdldENvdW50KCkgLSAxIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtRHJvcERvd25MaXN0Lmxvb2tGb3JTZWxlY3RhYmxlUG9zaXRpb24oYWRhcHRlci5nZXRDb3VudCgpIC0gMSwgZmFsc2UpOyAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIGlmICgoYmVsb3cgJiYga2V5Q29kZSA9PSBLZXlFdmVudC5LRVlDT0RFX0RQQURfVVAgJiYgY3VySW5kZXggPD0gZmlyc3RJdGVtKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgKCFiZWxvdyAmJiBrZXlDb2RlID09IEtleUV2ZW50LktFWUNPREVfRFBBRF9ET1dOICYmIGN1ckluZGV4ID49IGxhc3RJdGVtKSkgeworICAgICAgICAgICAgICAgICAgICAvLyBXaGVuIHRoZSBzZWxlY3Rpb24gaXMgYXQgdGhlIHRvcCwgd2UgYmxvY2sgdGhlIGtleQorICAgICAgICAgICAgICAgICAgICAvLyBldmVudCB0byBwcmV2ZW50IGZvY3VzIGZyb20gbW92aW5nLgorICAgICAgICAgICAgICAgICAgICBjbGVhckxpc3RTZWxlY3Rpb24oKTsKKyAgICAgICAgICAgICAgICAgICAgbVBvcHVwLnNldElucHV0TWV0aG9kTW9kZShQb3B1cFdpbmRvdy5JTlBVVF9NRVRIT0RfTkVFREVEKTsKKyAgICAgICAgICAgICAgICAgICAgc2hvdygpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAvLyBXQVJOSU5HOiBQbGVhc2UgcmVhZCB0aGUgY29tbWVudCB3aGVyZSBtTGlzdFNlbGVjdGlvbkhpZGRlbgorICAgICAgICAgICAgICAgICAgICAvLyAgICAgICAgICBpcyBkZWNsYXJlZAorICAgICAgICAgICAgICAgICAgICBtRHJvcERvd25MaXN0Lm1MaXN0U2VsZWN0aW9uSGlkZGVuID0gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY29uc3VtZWQgPSBtRHJvcERvd25MaXN0Lm9uS2V5RG93bihrZXlDb2RlLCBldmVudCk7CisgICAgICAgICAgICAgICAgaWYgKERFQlVHKSBMb2cudihUQUcsICJLZXkgZG93bjogY29kZT0iICsga2V5Q29kZSArICIgbGlzdCBjb25zdW1lZD0iICsgY29uc3VtZWQpOworCisgICAgICAgICAgICAgICAgaWYgKGNvbnN1bWVkKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIElmIGl0IGhhbmRsZWQgdGhlIGtleSBldmVudCwgdGhlbiB0aGUgdXNlciBpcworICAgICAgICAgICAgICAgICAgICAvLyBuYXZpZ2F0aW5nIGluIHRoZSBsaXN0LCBzbyB3ZSBzaG91bGQgcHV0IGl0IGluIGZyb250LgorICAgICAgICAgICAgICAgICAgICBtUG9wdXAuc2V0SW5wdXRNZXRob2RNb2RlKFBvcHVwV2luZG93LklOUFVUX01FVEhPRF9OT1RfTkVFREVEKTsKKyAgICAgICAgICAgICAgICAgICAgLy8gSGVyZSdzIGEgbGl0dGxlIHRyaWNrIHdlIG5lZWQgdG8gZG8gdG8gbWFrZSBzdXJlIHRoYXQKKyAgICAgICAgICAgICAgICAgICAgLy8gdGhlIGxpc3QgdmlldyBpcyBhY3R1YWxseSBzaG93aW5nIGl0cyBmb2N1cyBpbmRpY2F0b3IsCisgICAgICAgICAgICAgICAgICAgIC8vIGJ5IGVuc3VyaW5nIGl0IGhhcyBmb2N1cyBhbmQgZ2V0dGluZyBpdHMgd2luZG93IG91dAorICAgICAgICAgICAgICAgICAgICAvLyBvZiB0b3VjaCBtb2RlLgorICAgICAgICAgICAgICAgICAgICBtRHJvcERvd25MaXN0LnJlcXVlc3RGb2N1c0Zyb21Ub3VjaCgpOworICAgICAgICAgICAgICAgICAgICBzaG93KCk7CisKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChrZXlDb2RlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBhdm9pZCBwYXNzaW5nIHRoZSBmb2N1cyBmcm9tIHRoZSB0ZXh0IHZpZXcgdG8gdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBuZXh0IGNvbXBvbmVudAorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBLZXlFdmVudC5LRVlDT0RFX0VOVEVSOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBLZXlFdmVudC5LRVlDT0RFX0RQQURfQ0VOVEVSOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBLZXlFdmVudC5LRVlDT0RFX0RQQURfRE9XTjoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgS2V5RXZlbnQuS0VZQ09ERV9EUEFEX1VQOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGJlbG93ICYmIGtleUNvZGUgPT0gS2V5RXZlbnQuS0VZQ09ERV9EUEFEX0RPV04pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdoZW4gdGhlIHNlbGVjdGlvbiBpcyBhdCB0aGUgYm90dG9tLCB3ZSBibG9jayB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGV2ZW50IHRvIGF2b2lkIGdvaW5nIHRvIHRoZSBuZXh0IGZvY3VzYWJsZSB3aWRnZXQKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjdXJJbmRleCA9PSBsYXN0SXRlbSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCFiZWxvdyAmJiBrZXlDb2RlID09IEtleUV2ZW50LktFWUNPREVfRFBBRF9VUCAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1ckluZGV4ID09IGZpcnN0SXRlbSkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLyoqCisgICAgICogRmlsdGVyIGtleSBkb3duIGV2ZW50cy4gQnkgZm9yd2FyZGluZyBrZXkgdXAgZXZlbnRzIHRvIHRoaXMgZnVuY3Rpb24sCisgICAgICogdmlld3MgdXNpbmcgbm9uLW1vZGFsIExpc3RQb3B1cFdpbmRvdyBjYW4gaGF2ZSBpdCBoYW5kbGUga2V5IHNlbGVjdGlvbiBvZiBpdGVtcy4KKyAgICAgKiAgCisgICAgICogQHBhcmFtIGtleUNvZGUga2V5Q29kZSBwYXJhbSBwYXNzZWQgdG8gdGhlIGhvc3QgdmlldydzIG9uS2V5VXAKKyAgICAgKiBAcGFyYW0gZXZlbnQgZXZlbnQgcGFyYW0gcGFzc2VkIHRvIHRoZSBob3N0IHZpZXcncyBvbktleVVwCisgICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBldmVudCB3YXMgaGFuZGxlZCwgZmFsc2UgaWYgaXQgd2FzIGlnbm9yZWQuCisgICAgICogCisgICAgICogQHNlZSAjc2V0TW9kYWwoYm9vbGVhbikKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBvbktleVVwKGludCBrZXlDb2RlLCBLZXlFdmVudCBldmVudCkgeworICAgICAgICBpZiAoaXNTaG93aW5nKCkgJiYgbURyb3BEb3duTGlzdC5nZXRTZWxlY3RlZEl0ZW1Qb3NpdGlvbigpID49IDApIHsKKyAgICAgICAgICAgIGJvb2xlYW4gY29uc3VtZWQgPSBtRHJvcERvd25MaXN0Lm9uS2V5VXAoa2V5Q29kZSwgZXZlbnQpOworICAgICAgICAgICAgaWYgKGNvbnN1bWVkKSB7CisgICAgICAgICAgICAgICAgc3dpdGNoIChrZXlDb2RlKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIGlmIHRoZSBsaXN0IGFjY2VwdHMgdGhlIGtleSBldmVudHMgYW5kIHRoZSBrZXkgZXZlbnQKKyAgICAgICAgICAgICAgICAgICAgLy8gd2FzIGEgY2xpY2ssIHRoZSB0ZXh0IHZpZXcgZ2V0cyB0aGUgc2VsZWN0ZWQgaXRlbQorICAgICAgICAgICAgICAgICAgICAvLyBmcm9tIHRoZSBkcm9wIGRvd24gYXMgaXRzIGNvbnRlbnQKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBLZXlFdmVudC5LRVlDT0RFX0VOVEVSOgorICAgICAgICAgICAgICAgICAgICBjYXNlIEtleUV2ZW50LktFWUNPREVfRFBBRF9DRU5URVI6CisgICAgICAgICAgICAgICAgICAgICAgICBkaXNtaXNzKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gY29uc3VtZWQ7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8qKgorICAgICAqIEZpbHRlciBwcmUtSU1FIGtleSBldmVudHMuIEJ5IGZvcndhcmRpbmcge0BsaW5rIFZpZXcjb25LZXlQcmVJbWUoaW50LCBLZXlFdmVudCl9CisgICAgICogZXZlbnRzIHRvIHRoaXMgZnVuY3Rpb24sIHZpZXdzIHVzaW5nIExpc3RQb3B1cFdpbmRvdyBjYW4gaGF2ZSBpdCBkaXNtaXNzIHRoZSBwb3B1cAorICAgICAqIHdoZW4gdGhlIGJhY2sga2V5IGlzIHByZXNzZWQuCisgICAgICogIAorICAgICAqIEBwYXJhbSBrZXlDb2RlIGtleUNvZGUgcGFyYW0gcGFzc2VkIHRvIHRoZSBob3N0IHZpZXcncyBvbktleVByZUltZQorICAgICAqIEBwYXJhbSBldmVudCBldmVudCBwYXJhbSBwYXNzZWQgdG8gdGhlIGhvc3QgdmlldydzIG9uS2V5UHJlSW1lCisgICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBldmVudCB3YXMgaGFuZGxlZCwgZmFsc2UgaWYgaXQgd2FzIGlnbm9yZWQuCisgICAgICogCisgICAgICogQHNlZSAjc2V0TW9kYWwoYm9vbGVhbikKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBvbktleVByZUltZShpbnQga2V5Q29kZSwgS2V5RXZlbnQgZXZlbnQpIHsKKyAgICAgICAgaWYgKGtleUNvZGUgPT0gS2V5RXZlbnQuS0VZQ09ERV9CQUNLICYmIGlzU2hvd2luZygpKSB7CisgICAgICAgICAgICAvLyBzcGVjaWFsIGNhc2UgZm9yIHRoZSBiYWNrIGtleSwgd2UgZG8gbm90IGV2ZW4gdHJ5IHRvIHNlbmQgaXQKKyAgICAgICAgICAgIC8vIHRvIHRoZSBkcm9wIGRvd24gbGlzdCBidXQgaW5zdGVhZCwgY29uc3VtZSBpdCBpbW1lZGlhdGVseQorICAgICAgICAgICAgZmluYWwgVmlldyBhbmNob3JWaWV3ID0gbURyb3BEb3duQW5jaG9yVmlldzsKKyAgICAgICAgICAgIGlmIChldmVudC5nZXRBY3Rpb24oKSA9PSBLZXlFdmVudC5BQ1RJT05fRE9XTiAmJiBldmVudC5nZXRSZXBlYXRDb3VudCgpID09IDApIHsKKyAgICAgICAgICAgICAgICBhbmNob3JWaWV3LmdldEtleURpc3BhdGNoZXJTdGF0ZSgpLnN0YXJ0VHJhY2tpbmcoZXZlbnQsIHRoaXMpOworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfSBlbHNlIGlmIChldmVudC5nZXRBY3Rpb24oKSA9PSBLZXlFdmVudC5BQ1RJT05fVVApIHsKKyAgICAgICAgICAgICAgICBhbmNob3JWaWV3LmdldEtleURpc3BhdGNoZXJTdGF0ZSgpLmhhbmRsZVVwRXZlbnQoZXZlbnQpOworICAgICAgICAgICAgICAgIGlmIChldmVudC5pc1RyYWNraW5nKCkgJiYgIWV2ZW50LmlzQ2FuY2VsZWQoKSkgeworICAgICAgICAgICAgICAgICAgICBkaXNtaXNzKCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLyoqCisgICAgICogPHA+QnVpbGRzIHRoZSBwb3B1cCB3aW5kb3cncyBjb250ZW50IGFuZCByZXR1cm5zIHRoZSBoZWlnaHQgdGhlIHBvcHVwCisgICAgICogc2hvdWxkIGhhdmUuIFJldHVybnMgLTEgd2hlbiB0aGUgY29udGVudCBhbHJlYWR5IGV4aXN0cy48L3A+CisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSBjb250ZW50J3MgaGVpZ2h0IG9yIC0xIGlmIGNvbnRlbnQgYWxyZWFkeSBleGlzdHMKKyAgICAgKi8KKyAgICBwcml2YXRlIGludCBidWlsZERyb3BEb3duKCkgeworICAgICAgICBWaWV3R3JvdXAgZHJvcERvd25WaWV3OworICAgICAgICBpbnQgb3RoZXJIZWlnaHRzID0gMDsKKworICAgICAgICBpZiAobURyb3BEb3duTGlzdCA9PSBudWxsKSB7CisgICAgICAgICAgICBDb250ZXh0IGNvbnRleHQgPSBtQ29udGV4dDsKKworICAgICAgICAgICAgLyoqCisgICAgICAgICAgICAgKiBUaGlzIFJ1bm5hYmxlIGV4aXN0cyBmb3IgdGhlIHNvbGUgcHVycG9zZSBvZiBjaGVja2luZyBpZiB0aGUgdmlldyBsYXlvdXQgaGFzIGdvdAorICAgICAgICAgICAgICogY29tcGxldGVkIGFuZCBpZiBzbyBjYWxsIHNob3dEcm9wRG93biB0byBkaXNwbGF5IHRoZSBkcm9wIGRvd24uIFRoaXMgaXMgdXNlZCB0byBzaG93CisgICAgICAgICAgICAgKiB0aGUgZHJvcCBkb3duIGFzIHNvb24gYXMgcG9zc2libGUgYWZ0ZXIgdXNlciBvcGVucyB1cCB0aGUgc2VhcmNoIGRpYWxvZywgd2l0aG91dAorICAgICAgICAgICAgICogd2FpdGluZyBmb3IgdGhlIG5vcm1hbCBVSSBwaXBlbGluZSB0byBkbyBpdCdzIGpvYiB3aGljaCBpcyBzbG93ZXIgdGhhbiB0aGlzIG1ldGhvZC4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgbVNob3dEcm9wRG93blJ1bm5hYmxlID0gbmV3IFJ1bm5hYmxlKCkgeworICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gVmlldyBsYXlvdXQgc2hvdWxkIGJlIGFsbCBkb25lIGJlZm9yZSBkaXNwbGF5aW5nIHRoZSBkcm9wIGRvd24uCisgICAgICAgICAgICAgICAgICAgIFZpZXcgdmlldyA9IGdldEFuY2hvclZpZXcoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHZpZXcgIT0gbnVsbCAmJiB2aWV3LmdldFdpbmRvd1Rva2VuKCkgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgc2hvdygpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfTsKKworICAgICAgICAgICAgbURyb3BEb3duTGlzdCA9IG5ldyBEcm9wRG93bkxpc3RWaWV3KGNvbnRleHQsICFtTW9kYWwpOworICAgICAgICAgICAgaWYgKG1Ecm9wRG93bkxpc3RIaWdobGlnaHQgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG1Ecm9wRG93bkxpc3Quc2V0U2VsZWN0b3IobURyb3BEb3duTGlzdEhpZ2hsaWdodCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtRHJvcERvd25MaXN0LnNldEFkYXB0ZXIobUFkYXB0ZXIpOworICAgICAgICAgICAgbURyb3BEb3duTGlzdC5zZXRWZXJ0aWNhbEZhZGluZ0VkZ2VFbmFibGVkKHRydWUpOworICAgICAgICAgICAgbURyb3BEb3duTGlzdC5zZXRPbkl0ZW1DbGlja0xpc3RlbmVyKG1JdGVtQ2xpY2tMaXN0ZW5lcik7CisgICAgICAgICAgICBtRHJvcERvd25MaXN0LnNldEZvY3VzYWJsZSh0cnVlKTsKKyAgICAgICAgICAgIG1Ecm9wRG93bkxpc3Quc2V0Rm9jdXNhYmxlSW5Ub3VjaE1vZGUodHJ1ZSk7CisgICAgICAgICAgICBtRHJvcERvd25MaXN0LnNldE9uSXRlbVNlbGVjdGVkTGlzdGVuZXIobmV3IEFkYXB0ZXJWaWV3Lk9uSXRlbVNlbGVjdGVkTGlzdGVuZXIoKSB7CisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgb25JdGVtU2VsZWN0ZWQoQWRhcHRlclZpZXc8Pz4gcGFyZW50LCBWaWV3IHZpZXcsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcG9zaXRpb24sIGxvbmcgaWQpIHsKKworICAgICAgICAgICAgICAgICAgICBpZiAocG9zaXRpb24gIT0gLTEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIERyb3BEb3duTGlzdFZpZXcgZHJvcERvd25MaXN0ID0gbURyb3BEb3duTGlzdDsKKworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRyb3BEb3duTGlzdCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHJvcERvd25MaXN0Lm1MaXN0U2VsZWN0aW9uSGlkZGVuID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbk5vdGhpbmdTZWxlY3RlZChBZGFwdGVyVmlldzw/PiBwYXJlbnQpIHsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgIG1Ecm9wRG93bkxpc3Quc2V0T25TY3JvbGxMaXN0ZW5lcihtU2Nyb2xsTGlzdGVuZXIpOworCisgICAgICAgICAgICBpZiAobUl0ZW1TZWxlY3RlZExpc3RlbmVyICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBtRHJvcERvd25MaXN0LnNldE9uSXRlbVNlbGVjdGVkTGlzdGVuZXIobUl0ZW1TZWxlY3RlZExpc3RlbmVyKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZHJvcERvd25WaWV3ID0gbURyb3BEb3duTGlzdDsKKworICAgICAgICAgICAgVmlldyBoaW50VmlldyA9IG1Qcm9tcHRWaWV3OworICAgICAgICAgICAgaWYgKGhpbnRWaWV3ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAvLyBpZiBhbiBoaW50IGhhcyBiZWVuIHNwZWNpZmllZCwgd2UgYWNjb21vZGF0ZSBtb3JlIHNwYWNlIGZvciBpdCBhbmQKKyAgICAgICAgICAgICAgICAvLyBhZGQgYSB0ZXh0IHZpZXcgaW4gdGhlIGRyb3AgZG93biBtZW51LCBhdCB0aGUgYm90dG9tIG9mIHRoZSBsaXN0CisgICAgICAgICAgICAgICAgTGluZWFyTGF5b3V0IGhpbnRDb250YWluZXIgPSBuZXcgTGluZWFyTGF5b3V0KGNvbnRleHQpOworICAgICAgICAgICAgICAgIGhpbnRDb250YWluZXIuc2V0T3JpZW50YXRpb24oTGluZWFyTGF5b3V0LlZFUlRJQ0FMKTsKKworICAgICAgICAgICAgICAgIExpbmVhckxheW91dC5MYXlvdXRQYXJhbXMgaGludFBhcmFtcyA9IG5ldyBMaW5lYXJMYXlvdXQuTGF5b3V0UGFyYW1zKAorICAgICAgICAgICAgICAgICAgICAgICAgVmlld0dyb3VwLkxheW91dFBhcmFtcy5NQVRDSF9QQVJFTlQsIDAsIDEuMGYKKyAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIHN3aXRjaCAobVByb21wdFBvc2l0aW9uKSB7CisgICAgICAgICAgICAgICAgY2FzZSBQT1NJVElPTl9QUk9NUFRfQkVMT1c6CisgICAgICAgICAgICAgICAgICAgIGhpbnRDb250YWluZXIuYWRkVmlldyhkcm9wRG93blZpZXcsIGhpbnRQYXJhbXMpOworICAgICAgICAgICAgICAgICAgICBoaW50Q29udGFpbmVyLmFkZFZpZXcoaGludFZpZXcpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgY2FzZSBQT1NJVElPTl9QUk9NUFRfQUJPVkU6CisgICAgICAgICAgICAgICAgICAgIGhpbnRDb250YWluZXIuYWRkVmlldyhoaW50Vmlldyk7CisgICAgICAgICAgICAgICAgICAgIGhpbnRDb250YWluZXIuYWRkVmlldyhkcm9wRG93blZpZXcsIGhpbnRQYXJhbXMpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAiSW52YWxpZCBoaW50IHBvc2l0aW9uICIgKyBtUHJvbXB0UG9zaXRpb24pOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvLyBtZWFzdXJlIHRoZSBoaW50J3MgaGVpZ2h0IHRvIGZpbmQgaG93IG11Y2ggbW9yZSB2ZXJ0aWNhbCBzcGFjZQorICAgICAgICAgICAgICAgIC8vIHdlIG5lZWQgdG8gYWRkIHRvIHRoZSBkcm9wIGRvd24ncyBoZWlnaHQKKyAgICAgICAgICAgICAgICBpbnQgd2lkdGhTcGVjID0gTWVhc3VyZVNwZWMubWFrZU1lYXN1cmVTcGVjKG1Ecm9wRG93bldpZHRoLCBNZWFzdXJlU3BlYy5BVF9NT1NUKTsKKyAgICAgICAgICAgICAgICBpbnQgaGVpZ2h0U3BlYyA9IE1lYXN1cmVTcGVjLlVOU1BFQ0lGSUVEOworICAgICAgICAgICAgICAgIGhpbnRWaWV3Lm1lYXN1cmUod2lkdGhTcGVjLCBoZWlnaHRTcGVjKTsKKworICAgICAgICAgICAgICAgIGhpbnRQYXJhbXMgPSAoTGluZWFyTGF5b3V0LkxheW91dFBhcmFtcykgaGludFZpZXcuZ2V0TGF5b3V0UGFyYW1zKCk7CisgICAgICAgICAgICAgICAgb3RoZXJIZWlnaHRzID0gaGludFZpZXcuZ2V0TWVhc3VyZWRIZWlnaHQoKSArIGhpbnRQYXJhbXMudG9wTWFyZ2luCisgICAgICAgICAgICAgICAgICAgICAgICArIGhpbnRQYXJhbXMuYm90dG9tTWFyZ2luOworCisgICAgICAgICAgICAgICAgZHJvcERvd25WaWV3ID0gaGludENvbnRhaW5lcjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgbVBvcHVwLnNldENvbnRlbnRWaWV3KGRyb3BEb3duVmlldyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBkcm9wRG93blZpZXcgPSAoVmlld0dyb3VwKSBtUG9wdXAuZ2V0Q29udGVudFZpZXcoKTsKKyAgICAgICAgICAgIGZpbmFsIFZpZXcgdmlldyA9IG1Qcm9tcHRWaWV3OworICAgICAgICAgICAgaWYgKHZpZXcgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIExpbmVhckxheW91dC5MYXlvdXRQYXJhbXMgaGludFBhcmFtcyA9CisgICAgICAgICAgICAgICAgICAgICAgICAoTGluZWFyTGF5b3V0LkxheW91dFBhcmFtcykgdmlldy5nZXRMYXlvdXRQYXJhbXMoKTsKKyAgICAgICAgICAgICAgICBvdGhlckhlaWdodHMgPSB2aWV3LmdldE1lYXN1cmVkSGVpZ2h0KCkgKyBoaW50UGFyYW1zLnRvcE1hcmdpbgorICAgICAgICAgICAgICAgICAgICAgICAgKyBoaW50UGFyYW1zLmJvdHRvbU1hcmdpbjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIE1heCBoZWlnaHQgYXZhaWxhYmxlIG9uIHRoZSBzY3JlZW4gZm9yIGEgcG9wdXAuCisgICAgICAgIGJvb2xlYW4gaWdub3JlQm90dG9tRGVjb3JhdGlvbnMgPQorICAgICAgICAgICAgICAgIG1Qb3B1cC5nZXRJbnB1dE1ldGhvZE1vZGUoKSA9PSBQb3B1cFdpbmRvdy5JTlBVVF9NRVRIT0RfTk9UX05FRURFRDsKKyAgICAgICAgZmluYWwgaW50IG1heEhlaWdodCA9IG1Qb3B1cC5nZXRNYXhBdmFpbGFibGVIZWlnaHQoCisgICAgICAgICAgICAgICAgZ2V0QW5jaG9yVmlldygpLCBtRHJvcERvd25WZXJ0aWNhbE9mZnNldCwgaWdub3JlQm90dG9tRGVjb3JhdGlvbnMpOworCisgICAgICAgIC8vIGdldE1heEF2YWlsYWJsZUhlaWdodCgpIHN1YnRyYWN0cyB0aGUgcGFkZGluZywgc28gd2UgcHV0IGl0IGJhY2ssCisgICAgICAgIC8vIHRvIGdldCB0aGUgYXZhaWxhYmxlIGhlaWdodCBmb3IgdGhlIHdob2xlIHdpbmRvdworICAgICAgICBpbnQgcGFkZGluZyA9IDA7CisgICAgICAgIERyYXdhYmxlIGJhY2tncm91bmQgPSBtUG9wdXAuZ2V0QmFja2dyb3VuZCgpOworICAgICAgICBpZiAoYmFja2dyb3VuZCAhPSBudWxsKSB7CisgICAgICAgICAgICBiYWNrZ3JvdW5kLmdldFBhZGRpbmcobVRlbXBSZWN0KTsKKyAgICAgICAgICAgIHBhZGRpbmcgPSBtVGVtcFJlY3QudG9wICsgbVRlbXBSZWN0LmJvdHRvbTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChtRHJvcERvd25BbHdheXNWaXNpYmxlIHx8IG1Ecm9wRG93bkhlaWdodCA9PSBWaWV3R3JvdXAuTGF5b3V0UGFyYW1zLk1BVENIX1BBUkVOVCkgeworICAgICAgICAgICAgcmV0dXJuIG1heEhlaWdodCArIHBhZGRpbmc7CisgICAgICAgIH0KKworICAgICAgICBmaW5hbCBpbnQgbGlzdENvbnRlbnQgPSBtRHJvcERvd25MaXN0Lm1lYXN1cmVIZWlnaHRPZkNoaWxkcmVuKE1lYXN1cmVTcGVjLlVOU1BFQ0lGSUVELAorICAgICAgICAgICAgICAgIDAsIExpc3RWaWV3Lk5PX1BPU0lUSU9OLCBtYXhIZWlnaHQgLSBvdGhlckhlaWdodHMsIDIpOworICAgICAgICAvLyBhZGQgcGFkZGluZyBvbmx5IGlmIHRoZSBsaXN0IGhhcyBpdGVtcyBpbiBpdCwgdGhhdCB3YXkgd2UgZG9uJ3Qgc2hvdworICAgICAgICAvLyB0aGUgcG9wdXAgaWYgaXQgaXMgbm90IG5lZWRlZAorICAgICAgICBpZiAobGlzdENvbnRlbnQgPiAwKSBvdGhlckhlaWdodHMgKz0gcGFkZGluZzsKKworICAgICAgICByZXR1cm4gbGlzdENvbnRlbnQgKyBvdGhlckhlaWdodHM7CisgICAgfQorCisgICAgLyoqCisgICAgICogPHA+V3JhcHBlciBjbGFzcyBmb3IgYSBMaXN0Vmlldy4gVGhpcyB3cmFwcGVyIGNhbiBoaWphY2sgdGhlIGZvY3VzIHRvCisgICAgICogbWFrZSBzdXJlIHRoZSBsaXN0IHVzZXMgdGhlIGFwcHJvcHJpYXRlIGRyYXdhYmxlcyBhbmQgc3RhdGVzIHdoZW4KKyAgICAgKiBkaXNwbGF5ZWQgb24gc2NyZWVuIHdpdGhpbiBhIGRyb3AgZG93bi4gVGhlIGZvY3VzIGlzIG5ldmVyIGFjdHVhbGx5CisgICAgICogcGFzc2VkIHRvIHRoZSBkcm9wIGRvd24gaW4gdGhpcyBtb2RlOyB0aGUgbGlzdCBvbmx5IGxvb2tzIGZvY3VzZWQuPC9wPgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIERyb3BEb3duTGlzdFZpZXcgZXh0ZW5kcyBMaXN0VmlldyB7CisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSBMaXN0UG9wdXBXaW5kb3cuVEFHICsgIi5Ecm9wRG93bkxpc3RWaWV3IjsKKyAgICAgICAgLyoKKyAgICAgICAgICogV0FSTklORzogVGhpcyBpcyBhIHdvcmthcm91bmQgZm9yIGEgdG91Y2ggbW9kZSBpc3N1ZS4KKyAgICAgICAgICoKKyAgICAgICAgICogVG91Y2ggbW9kZSBpcyBwcm9wYWdhdGVkIGxhemlseSB0byB3aW5kb3dzLiBUaGlzIGNhdXNlcyBwcm9ibGVtcyBpbgorICAgICAgICAgKiB0aGUgZm9sbG93aW5nIHNjZW5hcmlvOgorICAgICAgICAgKiAtIFR5cGUgc29tZXRoaW5nIGluIHRoZSBBdXRvQ29tcGxldGVUZXh0VmlldyBhbmQgZ2V0IHNvbWUgcmVzdWx0cworICAgICAgICAgKiAtIE1vdmUgZG93biB3aXRoIHRoZSBkLXBhZCB0byBzZWxlY3QgYW4gaXRlbSBpbiB0aGUgbGlzdAorICAgICAgICAgKiAtIE1vdmUgdXAgd2l0aCB0aGUgZC1wYWQgdW50aWwgdGhlIHNlbGVjdGlvbiBkaXNhcHBlYXJzCisgICAgICAgICAqIC0gVHlwZSBtb3JlIHRleHQgaW4gdGhlIEF1dG9Db21wbGV0ZVRleHRWaWV3ICp1c2luZyB0aGUgc29mdCBrZXlib2FyZCoKKyAgICAgICAgICogICBhbmQgZ2V0IG5ldyByZXN1bHRzOyB5b3UgYXJlIG5vdyBpbiB0b3VjaCBtb2RlCisgICAgICAgICAqIC0gVGhlIHNlbGVjdGlvbiBjb21lcyBiYWNrIG9uIHRoZSBmaXJzdCBpdGVtIGluIHRoZSBsaXN0LCBldmVuIHRob3VnaAorICAgICAgICAgKiAgIHRoZSBsaXN0IGlzIHN1cHBvc2VkIHRvIGJlIGluIHRvdWNoIG1vZGUKKyAgICAgICAgICoKKyAgICAgICAgICogVXNpbmcgdGhlIHNvZnQga2V5Ym9hcmQgdHJpZ2dlcnMgdGhlIHRvdWNoIG1vZGUgY2hhbmdlIGJ1dCB0aGF0IGNoYW5nZQorICAgICAgICAgKiBpcyBwcm9wYWdhdGVkIHRvIG91ciB3aW5kb3cgb25seSBhZnRlciB0aGUgZmlyc3QgbGlzdCBsYXlvdXQsIHRoZXJlZm9yZQorICAgICAgICAgKiBhZnRlciB0aGUgbGlzdCBhdHRlbXB0cyB0byByZXN1cnJlY3QgdGhlIHNlbGVjdGlvbi4KKyAgICAgICAgICoKKyAgICAgICAgICogVGhlIHRyaWNrIHRvIHdvcmsgYXJvdW5kIHRoaXMgaXNzdWUgaXMgdG8gcHJldGVuZCB0aGUgbGlzdCBpcyBpbiB0b3VjaAorICAgICAgICAgKiBtb2RlIHdoZW4gd2Uga25vdyB0aGF0IHRoZSBzZWxlY3Rpb24gc2hvdWxkIG5vdCBhcHBlYXIsIHRoYXQgaXMgd2hlbgorICAgICAgICAgKiB3ZSBrbm93IHRoZSB1c2VyIG1vdmVkIHRoZSBzZWxlY3Rpb24gYXdheSBmcm9tIHRoZSBsaXN0LgorICAgICAgICAgKgorICAgICAgICAgKiBUaGlzIGJvb2xlYW4gaXMgc2V0IHRvIHRydWUgd2hlbmV2ZXIgd2UgZXhwbGljaXRseSBoaWRlIHRoZSBsaXN0J3MKKyAgICAgICAgICogc2VsZWN0aW9uIGFuZCByZXNldCB0byBmYWxzZSB3aGVuZXZlciB3ZSBrbm93IHRoZSB1c2VyIG1vdmVkIHRoZQorICAgICAgICAgKiBzZWxlY3Rpb24gYmFjayB0byB0aGUgbGlzdC4KKyAgICAgICAgICoKKyAgICAgICAgICogV2hlbiB0aGlzIGJvb2xlYW4gaXMgdHJ1ZSwgaXNJblRvdWNoTW9kZSgpIHJldHVybnMgdHJ1ZSwgb3RoZXJ3aXNlIGl0CisgICAgICAgICAqIHJldHVybnMgc3VwZXIuaXNJblRvdWNoTW9kZSgpLgorICAgICAgICAgKi8KKyAgICAgICAgcHJpdmF0ZSBib29sZWFuIG1MaXN0U2VsZWN0aW9uSGlkZGVuOworICAgICAgICAKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRydWUgaWYgdGhpcyB3cmFwcGVyIHNob3VsZCBmYWtlIGZvY3VzLgorICAgICAgICAgKi8KKyAgICAgICAgcHJpdmF0ZSBib29sZWFuIG1IaWphY2tGb2N1czsKKworICAgICAgICAvKioKKyAgICAgICAgICogPHA+Q3JlYXRlcyBhIG5ldyBsaXN0IHZpZXcgd3JhcHBlci48L3A+CisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBjb250ZXh0IHRoaXMgdmlldydzIGNvbnRleHQKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBEcm9wRG93bkxpc3RWaWV3KENvbnRleHQgY29udGV4dCwgYm9vbGVhbiBoaWphY2tGb2N1cykgeworICAgICAgICAgICAgc3VwZXIoY29udGV4dCwgbnVsbCwgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5hdHRyLmRyb3BEb3duTGlzdFZpZXdTdHlsZSk7CisgICAgICAgICAgICBtSGlqYWNrRm9jdXMgPSBoaWphY2tGb2N1czsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiA8cD5Bdm9pZHMgamFycmluZyBzY3JvbGxpbmcgZWZmZWN0IGJ5IGVuc3VyaW5nIHRoYXQgbGlzdCBlbGVtZW50cworICAgICAgICAgKiBtYWRlIG9mIGEgdGV4dCB2aWV3IGZpdCBvbiBhIHNpbmdsZSBsaW5lLjwvcD4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIHBvc2l0aW9uIHRoZSBpdGVtIGluZGV4IGluIHRoZSBsaXN0IHRvIGdldCBhIHZpZXcgZm9yCisgICAgICAgICAqIEByZXR1cm4gdGhlIHZpZXcgZm9yIHRoZSBzcGVjaWZpZWQgaXRlbQorICAgICAgICAgKi8KKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIFZpZXcgb2J0YWluVmlldyhpbnQgcG9zaXRpb24sIGJvb2xlYW5bXSBpc1NjcmFwKSB7CisgICAgICAgICAgICBWaWV3IHZpZXcgPSBzdXBlci5vYnRhaW5WaWV3KHBvc2l0aW9uLCBpc1NjcmFwKTsKKworICAgICAgICAgICAgaWYgKHZpZXcgaW5zdGFuY2VvZiBUZXh0VmlldykgeworICAgICAgICAgICAgICAgICgoVGV4dFZpZXcpIHZpZXcpLnNldEhvcml6b250YWxseVNjcm9sbGluZyh0cnVlKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIHZpZXc7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gaXNJblRvdWNoTW9kZSgpIHsKKyAgICAgICAgICAgIC8vIFdBUk5JTkc6IFBsZWFzZSByZWFkIHRoZSBjb21tZW50IHdoZXJlIG1MaXN0U2VsZWN0aW9uSGlkZGVuIGlzIGRlY2xhcmVkCisgICAgICAgICAgICByZXR1cm4gKG1IaWphY2tGb2N1cyAmJiBtTGlzdFNlbGVjdGlvbkhpZGRlbikgfHwgc3VwZXIuaXNJblRvdWNoTW9kZSgpOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIDxwPlJldHVybnMgdGhlIGZvY3VzIHN0YXRlIGluIHRoZSBkcm9wIGRvd24uPC9wPgorICAgICAgICAgKgorICAgICAgICAgKiBAcmV0dXJuIHRydWUgYWx3YXlzIGlmIGhpamFja2luZyBmb2N1cworICAgICAgICAgKi8KKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIGhhc1dpbmRvd0ZvY3VzKCkgeworICAgICAgICAgICAgcmV0dXJuIG1IaWphY2tGb2N1cyB8fCBzdXBlci5oYXNXaW5kb3dGb2N1cygpOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIDxwPlJldHVybnMgdGhlIGZvY3VzIHN0YXRlIGluIHRoZSBkcm9wIGRvd24uPC9wPgorICAgICAgICAgKgorICAgICAgICAgKiBAcmV0dXJuIHRydWUgYWx3YXlzIGlmIGhpamFja2luZyBmb2N1cworICAgICAgICAgKi8KKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIGlzRm9jdXNlZCgpIHsKKyAgICAgICAgICAgIHJldHVybiBtSGlqYWNrRm9jdXMgfHwgc3VwZXIuaXNGb2N1c2VkKCk7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogPHA+UmV0dXJucyB0aGUgZm9jdXMgc3RhdGUgaW4gdGhlIGRyb3AgZG93bi48L3A+CisgICAgICAgICAqCisgICAgICAgICAqIEByZXR1cm4gdHJ1ZSBhbHdheXMgaWYgaGlqYWNraW5nIGZvY3VzCisgICAgICAgICAqLworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gaGFzRm9jdXMoKSB7CisgICAgICAgICAgICByZXR1cm4gbUhpamFja0ZvY3VzIHx8IHN1cGVyLmhhc0ZvY3VzKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIGNsYXNzIFBvcHVwRGF0YVNldE9ic2VydmVyIGV4dGVuZHMgRGF0YVNldE9ic2VydmVyIHsKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIG9uQ2hhbmdlZCgpIHsKKyAgICAgICAgICAgIGlmIChpc1Nob3dpbmcoKSkgeworICAgICAgICAgICAgICAgIC8vIFJlc2l6ZSB0aGUgcG9wdXAgdG8gZml0IG5ldyBjb250ZW50CisgICAgICAgICAgICAgICAgc2hvdygpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIAorICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgb25JbnZhbGlkYXRlZCgpIHsKKyAgICAgICAgICAgIGRpc21pc3MoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgY2xhc3MgTGlzdFNlbGVjdG9ySGlkZXIgaW1wbGVtZW50cyBSdW5uYWJsZSB7CisgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgIGNsZWFyTGlzdFNlbGVjdGlvbigpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBjbGFzcyBSZXNpemVQb3B1cFJ1bm5hYmxlIGltcGxlbWVudHMgUnVubmFibGUgeworICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICBtUG9wdXAuc2V0SW5wdXRNZXRob2RNb2RlKFBvcHVwV2luZG93LklOUFVUX01FVEhPRF9OT1RfTkVFREVEKTsKKyAgICAgICAgICAgIHNob3coKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgY2xhc3MgUG9wdXBUb3VjaEludGVyY2VwdG9yIGltcGxlbWVudHMgT25Ub3VjaExpc3RlbmVyIHsKKyAgICAgICAgcHVibGljIGJvb2xlYW4gb25Ub3VjaChWaWV3IHYsIE1vdGlvbkV2ZW50IGV2ZW50KSB7CisgICAgICAgICAgICBmaW5hbCBpbnQgYWN0aW9uID0gZXZlbnQuZ2V0QWN0aW9uKCk7CisgICAgICAgICAgICBmaW5hbCBpbnQgeCA9IChpbnQpIGV2ZW50LmdldFgoKTsKKyAgICAgICAgICAgIGZpbmFsIGludCB5ID0gKGludCkgZXZlbnQuZ2V0WSgpOworICAgICAgICAgICAgCisgICAgICAgICAgICBpZiAoYWN0aW9uID09IE1vdGlvbkV2ZW50LkFDVElPTl9ET1dOICYmCisgICAgICAgICAgICAgICAgICAgIG1Qb3B1cCAhPSBudWxsICYmIG1Qb3B1cC5pc1Nob3dpbmcoKSAmJgorICAgICAgICAgICAgICAgICAgICAoeCA+PSAwICYmIHggPCBnZXRXaWR0aCgpICYmIHkgPj0gMCAmJiB5IDwgZ2V0SGVpZ2h0KCkpKSB7CisgICAgICAgICAgICAgICAgbUhhbmRsZXIucG9zdERlbGF5ZWQobVJlc2l6ZVBvcHVwUnVubmFibGUsIEVYUEFORF9MSVNUX1RJTUVPVVQpOworICAgICAgICAgICAgfSBlbHNlIGlmIChhY3Rpb24gPT0gTW90aW9uRXZlbnQuQUNUSU9OX1VQKSB7CisgICAgICAgICAgICAgICAgbUhhbmRsZXIucmVtb3ZlQ2FsbGJhY2tzKG1SZXNpemVQb3B1cFJ1bm5hYmxlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgY2xhc3MgUG9wdXBTY3JvbGxMaXN0ZW5lciBpbXBsZW1lbnRzIExpc3RWaWV3Lk9uU2Nyb2xsTGlzdGVuZXIgeworICAgICAgICBwdWJsaWMgdm9pZCBvblNjcm9sbChBYnNMaXN0VmlldyB2aWV3LCBpbnQgZmlyc3RWaXNpYmxlSXRlbSwgaW50IHZpc2libGVJdGVtQ291bnQsCisgICAgICAgICAgICAgICAgaW50IHRvdGFsSXRlbUNvdW50KSB7CisKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIG9uU2Nyb2xsU3RhdGVDaGFuZ2VkKEFic0xpc3RWaWV3IHZpZXcsIGludCBzY3JvbGxTdGF0ZSkgeworICAgICAgICAgICAgaWYgKHNjcm9sbFN0YXRlID09IFNDUk9MTF9TVEFURV9UT1VDSF9TQ1JPTEwgJiYKKyAgICAgICAgICAgICAgICAgICAgIWlzSW5wdXRNZXRob2ROb3ROZWVkZWQoKSAmJiBtUG9wdXAuZ2V0Q29udGVudFZpZXcoKSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgbUhhbmRsZXIucmVtb3ZlQ2FsbGJhY2tzKG1SZXNpemVQb3B1cFJ1bm5hYmxlKTsKKyAgICAgICAgICAgICAgICBtUmVzaXplUG9wdXBSdW5uYWJsZS5ydW4oKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9MaXN0Vmlldy5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L0xpc3RWaWV3LmphdmEKaW5kZXggNDZjZDQ1YS4uZTVhMzRlOCAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L0xpc3RWaWV3LmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L0xpc3RWaWV3LmphdmEKQEAgLTIwLDYgKzIwLDcgQEAKIGltcG9ydCBjb20uZ29vZ2xlLmFuZHJvaWQuY29sbGVjdC5MaXN0czsKIAogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5UeXBlZEFycmF5OwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQ2FudmFzOwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUGFpbnQ7CkBAIC0yNywxMCArMjgsNyBAQAogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUmVjdDsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkNvbG9yRHJhd2FibGU7CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZTsKLWltcG9ydCBhbmRyb2lkLm9zLlBhcmNlbDsKLWltcG9ydCBhbmRyb2lkLm9zLlBhcmNlbGFibGU7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldDsKLWltcG9ydCBhbmRyb2lkLnV0aWwuTG9uZ1NwYXJzZUFycmF5OwogaW1wb3J0IGFuZHJvaWQudXRpbC5TcGFyc2VCb29sZWFuQXJyYXk7CiBpbXBvcnQgYW5kcm9pZC52aWV3LkZvY3VzRmluZGVyOwogaW1wb3J0IGFuZHJvaWQudmlldy5LZXlFdmVudDsKQEAgLTQxLDYgKzM5LDcgQEAKIGltcG9ydCBhbmRyb2lkLnZpZXcuVmlld0dyb3VwOwogaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3UGFyZW50OwogaW1wb3J0IGFuZHJvaWQudmlldy5hY2Nlc3NpYmlsaXR5LkFjY2Vzc2liaWxpdHlFdmVudDsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5SZW1vdGVWaWV3cy5SZW1vdGVWaWV3OwogCiBpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKIApAQCAtNjQsMTAgKzYzLDEwIEBACiAgKiBAYXR0ciByZWYgYW5kcm9pZC5SLnN0eWxlYWJsZSNMaXN0Vmlld19lbnRyaWVzCiAgKiBAYXR0ciByZWYgYW5kcm9pZC5SLnN0eWxlYWJsZSNMaXN0Vmlld19kaXZpZGVyCiAgKiBAYXR0ciByZWYgYW5kcm9pZC5SLnN0eWxlYWJsZSNMaXN0Vmlld19kaXZpZGVySGVpZ2h0Ci0gKiBAYXR0ciByZWYgYW5kcm9pZC5SLnN0eWxlYWJsZSNMaXN0Vmlld19jaG9pY2VNb2RlCiAgKiBAYXR0ciByZWYgYW5kcm9pZC5SLnN0eWxlYWJsZSNMaXN0Vmlld19oZWFkZXJEaXZpZGVyc0VuYWJsZWQKICAqIEBhdHRyIHJlZiBhbmRyb2lkLlIuc3R5bGVhYmxlI0xpc3RWaWV3X2Zvb3RlckRpdmlkZXJzRW5hYmxlZAogICovCitAUmVtb3RlVmlldwogcHVibGljIGNsYXNzIExpc3RWaWV3IGV4dGVuZHMgQWJzTGlzdFZpZXcgewogICAgIC8qKgogICAgICAqIFVzZWQgdG8gaW5kaWNhdGUgYSBubyBwcmVmZXJlbmNlIGZvciBhIHBvc2l0aW9uIHR5cGUuCkBAIC03NSwyMSArNzQsNiBAQAogICAgIHN0YXRpYyBmaW5hbCBpbnQgTk9fUE9TSVRJT04gPSAtMTsKIAogICAgIC8qKgotICAgICAqIE5vcm1hbCBsaXN0IHRoYXQgZG9lcyBub3QgaW5kaWNhdGUgY2hvaWNlcwotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENIT0lDRV9NT0RFX05PTkUgPSAwOwotCi0gICAgLyoqCi0gICAgICogVGhlIGxpc3QgYWxsb3dzIHVwIHRvIG9uZSBjaG9pY2UKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDSE9JQ0VfTU9ERV9TSU5HTEUgPSAxOwotCi0gICAgLyoqCi0gICAgICogVGhlIGxpc3QgYWxsb3dzIG11bHRpcGxlIGNob2ljZXMKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDSE9JQ0VfTU9ERV9NVUxUSVBMRSA9IDI7Ci0KLSAgICAvKioKICAgICAgKiBXaGVuIGFycm93IHNjcm9sbGluZywgTGlzdFZpZXcgd2lsbCBuZXZlciBzY3JvbGwgbW9yZSB0aGFuIHRoaXMgZmFjdG9yCiAgICAgICogdGltZXMgdGhlIGhlaWdodCBvZiB0aGUgbGlzdC4KICAgICAgKi8KQEAgLTEyMSw5ICsxMDUsNiBAQAogICAgIERyYXdhYmxlIG1EaXZpZGVyOwogICAgIGludCBtRGl2aWRlckhlaWdodDsKICAgICAKLSAgICBEcmF3YWJsZSBtT3ZlcnNjcm9sbEhlYWRlcjsKLSAgICBEcmF3YWJsZSBtT3ZlcnNjcm9sbEZvb3RlcjsKLQogICAgIHByaXZhdGUgYm9vbGVhbiBtSXNDYWNoZUNvbG9yT3BhcXVlOwogICAgIHByaXZhdGUgYm9vbGVhbiBtRGl2aWRlcklzT3BhcXVlOwogICAgIHByaXZhdGUgYm9vbGVhbiBtQ2xpcERpdmlkZXI7CkBAIC0xMzUsMTEgKzExNiw2IEBACiAKICAgICBwcml2YXRlIGJvb2xlYW4gbUl0ZW1zQ2FuRm9jdXMgPSBmYWxzZTsKIAotICAgIHByaXZhdGUgaW50IG1DaG9pY2VNb2RlID0gQ0hPSUNFX01PREVfTk9ORTsKLQotICAgIHByaXZhdGUgU3BhcnNlQm9vbGVhbkFycmF5IG1DaGVja1N0YXRlczsKLSAgICBwcml2YXRlIExvbmdTcGFyc2VBcnJheTxCb29sZWFuPiBtQ2hlY2tlZElkU3RhdGVzOwotCiAgICAgLy8gdXNlZCBmb3IgdGVtcG9yYXJ5IGNhbGN1bGF0aW9ucy4KICAgICBwcml2YXRlIGZpbmFsIFJlY3QgbVRlbXBSZWN0ID0gbmV3IFJlY3QoKTsKICAgICBwcml2YXRlIFBhaW50IG1EaXZpZGVyUGFpbnQ7CkBAIC0xNTAsNyArMTI2LDcgQEAKIAogICAgIC8vIEtlZXBzIGZvY3VzZWQgY2hpbGRyZW4gdmlzaWJsZSB0aHJvdWdoIHJlc2l6ZXMKICAgICBwcml2YXRlIEZvY3VzU2VsZWN0b3IgbUZvY3VzU2VsZWN0b3I7Ci0gICAgCisKICAgICBwdWJsaWMgTGlzdFZpZXcoQ29udGV4dCBjb250ZXh0KSB7CiAgICAgICAgIHRoaXMoY29udGV4dCwgbnVsbCk7CiAgICAgfQpAQCAtMTc4LDE2ICsxNTQsNiBAQAogICAgICAgICAgICAgc2V0RGl2aWRlcihkKTsKICAgICAgICAgfQogICAgICAgICAKLSAgICAgICAgZmluYWwgRHJhd2FibGUgb3NIZWFkZXIgPSBhLmdldERyYXdhYmxlKGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLkxpc3RWaWV3X292ZXJzY3JvbGxIZWFkZXIpOwotICAgICAgICBpZiAob3NIZWFkZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgc2V0T3ZlcnNjcm9sbEhlYWRlcihvc0hlYWRlcik7Ci0gICAgICAgIH0KLQotICAgICAgICBmaW5hbCBEcmF3YWJsZSBvc0Zvb3RlciA9IGEuZ2V0RHJhd2FibGUoY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZWFibGUuTGlzdFZpZXdfb3ZlcnNjcm9sbEZvb3Rlcik7Ci0gICAgICAgIGlmIChvc0Zvb3RlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBzZXRPdmVyc2Nyb2xsRm9vdGVyKG9zRm9vdGVyKTsKLSAgICAgICAgfQotCiAgICAgICAgIC8vIFVzZSB0aGUgaGVpZ2h0IHNwZWNpZmllZCwgemVybyBiZWluZyB0aGUgZGVmYXVsdAogICAgICAgICBmaW5hbCBpbnQgZGl2aWRlckhlaWdodCA9IGEuZ2V0RGltZW5zaW9uUGl4ZWxTaXplKAogICAgICAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLkxpc3RWaWV3X2RpdmlkZXJIZWlnaHQsIDApOwpAQCAtMTk1LDggKzE2MSw2IEBACiAgICAgICAgICAgICBzZXREaXZpZGVySGVpZ2h0KGRpdmlkZXJIZWlnaHQpOwogICAgICAgICB9CiAKLSAgICAgICAgc2V0Q2hvaWNlTW9kZShhLmdldEludChSLnN0eWxlYWJsZS5MaXN0Vmlld19jaG9pY2VNb2RlLCBDSE9JQ0VfTU9ERV9OT05FKSk7Ci0gICAgICAgIAogICAgICAgICBtSGVhZGVyRGl2aWRlcnNFbmFibGVkID0gYS5nZXRCb29sZWFuKFIuc3R5bGVhYmxlLkxpc3RWaWV3X2hlYWRlckRpdmlkZXJzRW5hYmxlZCwgdHJ1ZSk7CiAgICAgICAgIG1Gb290ZXJEaXZpZGVyc0VuYWJsZWQgPSBhLmdldEJvb2xlYW4oUi5zdHlsZWFibGUuTGlzdFZpZXdfZm9vdGVyRGl2aWRlcnNFbmFibGVkLCB0cnVlKTsKIApAQCAtNDE3LDYgKzM4MSwxNiBAQAogICAgIH0KIAogICAgIC8qKgorICAgICAqIFNldHMgdXAgdGhpcyBBYnNMaXN0VmlldyB0byB1c2UgYSByZW1vdGUgdmlld3MgYWRhcHRlciB3aGljaCBjb25uZWN0cyB0byBhIFJlbW90ZVZpZXdzU2VydmljZQorICAgICAqIHRocm91Z2ggdGhlIHNwZWNpZmllZCBpbnRlbnQuCisgICAgICogQHBhcmFtIGludGVudCB0aGUgaW50ZW50IHVzZWQgdG8gaWRlbnRpZnkgdGhlIFJlbW90ZVZpZXdzU2VydmljZSBmb3IgdGhlIGFkYXB0ZXIgdG8gY29ubmVjdCB0by4KKyAgICAgKi8KKyAgICBAYW5kcm9pZC52aWV3LlJlbW90YWJsZVZpZXdNZXRob2QKKyAgICBwdWJsaWMgdm9pZCBzZXRSZW1vdGVWaWV3c0FkYXB0ZXIoSW50ZW50IGludGVudCkgeworICAgICAgICBzdXBlci5zZXRSZW1vdGVWaWV3c0FkYXB0ZXIoaW50ZW50KTsKKyAgICB9CisKKyAgICAvKioKICAgICAgKiBTZXRzIHRoZSBkYXRhIGJlaGluZCB0aGlzIExpc3RWaWV3LgogICAgICAqCiAgICAgICogVGhlIGFkYXB0ZXIgcGFzc2VkIHRvIHRoaXMgbWV0aG9kIG1heSBiZSB3cmFwcGVkIGJ5IGEge0BsaW5rIFdyYXBwZXJMaXN0QWRhcHRlcn0sCkBAIC00MzEsNyArNDA1LDcgQEAKICAgICAgKi8KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBzZXRBZGFwdGVyKExpc3RBZGFwdGVyIGFkYXB0ZXIpIHsKLSAgICAgICAgaWYgKG51bGwgIT0gbUFkYXB0ZXIpIHsKKyAgICAgICAgaWYgKG1BZGFwdGVyICE9IG51bGwgJiYgbURhdGFTZXRPYnNlcnZlciAhPSBudWxsKSB7CiAgICAgICAgICAgICBtQWRhcHRlci51bnJlZ2lzdGVyRGF0YVNldE9ic2VydmVyKG1EYXRhU2V0T2JzZXJ2ZXIpOwogICAgICAgICB9CiAKQEAgLTQ0Niw2ICs0MjAsMTAgQEAKIAogICAgICAgICBtT2xkU2VsZWN0ZWRQb3NpdGlvbiA9IElOVkFMSURfUE9TSVRJT047CiAgICAgICAgIG1PbGRTZWxlY3RlZFJvd0lkID0gSU5WQUxJRF9ST1dfSUQ7CisKKyAgICAgICAgLy8gQWJzTGlzdFZpZXcjc2V0QWRhcHRlciB3aWxsIHVwZGF0ZSBjaG9pY2UgbW9kZSBzdGF0ZXMuCisgICAgICAgIHN1cGVyLnNldEFkYXB0ZXIoYWRhcHRlcik7CisKICAgICAgICAgaWYgKG1BZGFwdGVyICE9IG51bGwpIHsKICAgICAgICAgICAgIG1BcmVBbGxJdGVtc1NlbGVjdGFibGUgPSBtQWRhcHRlci5hcmVBbGxJdGVtc0VuYWJsZWQoKTsKICAgICAgICAgICAgIG1PbGRJdGVtQ291bnQgPSBtSXRlbUNvdW50OwpAQCAtNDcwLDEzICs0NDgsNiBAQAogICAgICAgICAgICAgICAgIC8vIE5vdGhpbmcgc2VsZWN0ZWQKICAgICAgICAgICAgICAgICBjaGVja1NlbGVjdGlvbkNoYW5nZWQoKTsKICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKG1DaG9pY2VNb2RlICE9IENIT0lDRV9NT0RFX05PTkUgJiYKLSAgICAgICAgICAgICAgICAgICAgbUFkYXB0ZXIuaGFzU3RhYmxlSWRzKCkgJiYKLSAgICAgICAgICAgICAgICAgICAgbUNoZWNrZWRJZFN0YXRlcyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbUNoZWNrZWRJZFN0YXRlcyA9IG5ldyBMb25nU3BhcnNlQXJyYXk8Qm9vbGVhbj4oKTsKLSAgICAgICAgICAgIH0KLQogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgbUFyZUFsbEl0ZW1zU2VsZWN0YWJsZSA9IHRydWU7CiAgICAgICAgICAgICBjaGVja0ZvY3VzKCk7CkBAIC00ODQsMTQgKzQ1NSw2IEBACiAgICAgICAgICAgICBjaGVja1NlbGVjdGlvbkNoYW5nZWQoKTsKICAgICAgICAgfQogCi0gICAgICAgIGlmIChtQ2hlY2tTdGF0ZXMgIT0gbnVsbCkgewotICAgICAgICAgICAgbUNoZWNrU3RhdGVzLmNsZWFyKCk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGlmIChtQ2hlY2tlZElkU3RhdGVzICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1DaGVja2VkSWRTdGF0ZXMuY2xlYXIoKTsKLSAgICAgICAgfQotCiAgICAgICAgIHJlcXVlc3RMYXlvdXQoKTsKICAgICB9CiAKQEAgLTg3OSw2ICs4NDIsMjUgQEAKICAgICAgICAgcmV0dXJuIHRvcFNlbGVjdGlvblBpeGVsOwogICAgIH0KIAorICAgIC8qKgorICAgICAqIFNtb290aGx5IHNjcm9sbCB0byB0aGUgc3BlY2lmaWVkIGFkYXB0ZXIgcG9zaXRpb24uIFRoZSB2aWV3IHdpbGwKKyAgICAgKiBzY3JvbGwgc3VjaCB0aGF0IHRoZSBpbmRpY2F0ZWQgcG9zaXRpb24gaXMgZGlzcGxheWVkLgorICAgICAqIEBwYXJhbSBwb3NpdGlvbiBTY3JvbGwgdG8gdGhpcyBhZGFwdGVyIHBvc2l0aW9uLgorICAgICAqLworICAgIEBhbmRyb2lkLnZpZXcuUmVtb3RhYmxlVmlld01ldGhvZAorICAgIHB1YmxpYyB2b2lkIHNtb290aFNjcm9sbFRvUG9zaXRpb24oaW50IHBvc2l0aW9uKSB7CisgICAgICAgIHN1cGVyLnNtb290aFNjcm9sbFRvUG9zaXRpb24ocG9zaXRpb24pOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNtb290aGx5IHNjcm9sbCB0byB0aGUgc3BlY2lmaWVkIGFkYXB0ZXIgcG9zaXRpb24gb2Zmc2V0LiBUaGUgdmlldyB3aWxsCisgICAgICogc2Nyb2xsIHN1Y2ggdGhhdCB0aGUgaW5kaWNhdGVkIHBvc2l0aW9uIGlzIGRpc3BsYXllZC4KKyAgICAgKiBAcGFyYW0gb2Zmc2V0IFRoZSBhbW91bnQgdG8gb2Zmc2V0IGZyb20gdGhlIGFkYXB0ZXIgcG9zaXRpb24gdG8gc2Nyb2xsIHRvLgorICAgICAqLworICAgIEBhbmRyb2lkLnZpZXcuUmVtb3RhYmxlVmlld01ldGhvZAorICAgIHB1YmxpYyB2b2lkIHNtb290aFNjcm9sbEJ5T2Zmc2V0KGludCBvZmZzZXQpIHsKKyAgICAgICAgc3VwZXIuc21vb3RoU2Nyb2xsQnlPZmZzZXQob2Zmc2V0KTsKKyAgICB9CiAKICAgICAvKioKICAgICAgKiBGaWxscyB0aGUgbGlzdCBiYXNlZCBvbiBwb3NpdGlvbmluZyB0aGUgbmV3IHNlbGVjdGlvbiByZWxhdGl2ZSB0byB0aGUgb2xkCkBAIC0xODAzLDYgKzE3ODUsOSBAQAogICAgICAgICBpZiAobUNob2ljZU1vZGUgIT0gQ0hPSUNFX01PREVfTk9ORSAmJiBtQ2hlY2tTdGF0ZXMgIT0gbnVsbCkgewogICAgICAgICAgICAgaWYgKGNoaWxkIGluc3RhbmNlb2YgQ2hlY2thYmxlKSB7CiAgICAgICAgICAgICAgICAgKChDaGVja2FibGUpIGNoaWxkKS5zZXRDaGVja2VkKG1DaGVja1N0YXRlcy5nZXQocG9zaXRpb24pKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoZ2V0Q29udGV4dCgpLmdldEFwcGxpY2F0aW9uSW5mbygpLnRhcmdldFNka1ZlcnNpb24KKyAgICAgICAgICAgICAgICAgICAgPj0gYW5kcm9pZC5vcy5CdWlsZC5WRVJTSU9OX0NPREVTLkhPTkVZQ09NQikgeworICAgICAgICAgICAgICAgIGNoaWxkLnNldEFjdGl2YXRlZChtQ2hlY2tTdGF0ZXMuZ2V0KHBvc2l0aW9uKSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIApAQCAtMjk1OCw1MiArMjk0MywxNCBAQAogICAgICAgICB9CiAgICAgICAgIHN1cGVyLnNldENhY2hlQ29sb3JIaW50KGNvbG9yKTsKICAgICB9Ci0KLSAgICB2b2lkIGRyYXdPdmVyc2Nyb2xsSGVhZGVyKENhbnZhcyBjYW52YXMsIERyYXdhYmxlIGRyYXdhYmxlLCBSZWN0IGJvdW5kcykgewotICAgICAgICBmaW5hbCBpbnQgaGVpZ2h0ID0gZHJhd2FibGUuZ2V0TWluaW11bUhlaWdodCgpOwotCi0gICAgICAgIGNhbnZhcy5zYXZlKCk7Ci0gICAgICAgIGNhbnZhcy5jbGlwUmVjdChib3VuZHMpOwotCi0gICAgICAgIGZpbmFsIGludCBzcGFuID0gYm91bmRzLmJvdHRvbSAtIGJvdW5kcy50b3A7Ci0gICAgICAgIGlmIChzcGFuIDwgaGVpZ2h0KSB7Ci0gICAgICAgICAgICBib3VuZHMudG9wID0gYm91bmRzLmJvdHRvbSAtIGhlaWdodDsKLSAgICAgICAgfQotCi0gICAgICAgIGRyYXdhYmxlLnNldEJvdW5kcyhib3VuZHMpOwotICAgICAgICBkcmF3YWJsZS5kcmF3KGNhbnZhcyk7Ci0KLSAgICAgICAgY2FudmFzLnJlc3RvcmUoKTsKLSAgICB9Ci0KLSAgICB2b2lkIGRyYXdPdmVyc2Nyb2xsRm9vdGVyKENhbnZhcyBjYW52YXMsIERyYXdhYmxlIGRyYXdhYmxlLCBSZWN0IGJvdW5kcykgewotICAgICAgICBmaW5hbCBpbnQgaGVpZ2h0ID0gZHJhd2FibGUuZ2V0TWluaW11bUhlaWdodCgpOwotCi0gICAgICAgIGNhbnZhcy5zYXZlKCk7Ci0gICAgICAgIGNhbnZhcy5jbGlwUmVjdChib3VuZHMpOwotCi0gICAgICAgIGZpbmFsIGludCBzcGFuID0gYm91bmRzLmJvdHRvbSAtIGJvdW5kcy50b3A7Ci0gICAgICAgIGlmIChzcGFuIDwgaGVpZ2h0KSB7Ci0gICAgICAgICAgICBib3VuZHMuYm90dG9tID0gYm91bmRzLnRvcCArIGhlaWdodDsKLSAgICAgICAgfQotCi0gICAgICAgIGRyYXdhYmxlLnNldEJvdW5kcyhib3VuZHMpOwotICAgICAgICBkcmF3YWJsZS5kcmF3KGNhbnZhcyk7Ci0KLSAgICAgICAgY2FudmFzLnJlc3RvcmUoKTsKLSAgICB9Ci0KKyAgICAKICAgICBAT3ZlcnJpZGUKICAgICBwcm90ZWN0ZWQgdm9pZCBkaXNwYXRjaERyYXcoQ2FudmFzIGNhbnZhcykgewogICAgICAgICAvLyBEcmF3IHRoZSBkaXZpZGVycwogICAgICAgICBmaW5hbCBpbnQgZGl2aWRlckhlaWdodCA9IG1EaXZpZGVySGVpZ2h0OwotICAgICAgICBmaW5hbCBEcmF3YWJsZSBvdmVyc2Nyb2xsSGVhZGVyID0gbU92ZXJzY3JvbGxIZWFkZXI7Ci0gICAgICAgIGZpbmFsIERyYXdhYmxlIG92ZXJzY3JvbGxGb290ZXIgPSBtT3ZlcnNjcm9sbEZvb3RlcjsKLSAgICAgICAgZmluYWwgYm9vbGVhbiBkcmF3T3ZlcnNjcm9sbEhlYWRlciA9IG92ZXJzY3JvbGxIZWFkZXIgIT0gbnVsbDsKLSAgICAgICAgZmluYWwgYm9vbGVhbiBkcmF3T3ZlcnNjcm9sbEZvb3RlciA9IG92ZXJzY3JvbGxGb290ZXIgIT0gbnVsbDsKICAgICAgICAgZmluYWwgYm9vbGVhbiBkcmF3RGl2aWRlcnMgPSBkaXZpZGVySGVpZ2h0ID4gMCAmJiBtRGl2aWRlciAhPSBudWxsOwogCi0gICAgICAgIGlmIChkcmF3RGl2aWRlcnMgfHwgZHJhd092ZXJzY3JvbGxIZWFkZXIgfHwgZHJhd092ZXJzY3JvbGxGb290ZXIpIHsKKyAgICAgICAgaWYgKGRyYXdEaXZpZGVycykgewogICAgICAgICAgICAgLy8gT25seSBtb2RpZnkgdGhlIHRvcCBhbmQgYm90dG9tIGluIHRoZSBsb29wLCB3ZSBzZXQgdGhlIGxlZnQgYW5kIHJpZ2h0IGhlcmUKICAgICAgICAgICAgIGZpbmFsIFJlY3QgYm91bmRzID0gbVRlbXBSZWN0OwogICAgICAgICAgICAgYm91bmRzLmxlZnQgPSBtUGFkZGluZ0xlZnQ7CkBAIC0zMDIyLDcgKzI5NjksNyBAQAogICAgICAgICAgICAgLy8gZmlsbCBhIHJlY3Qgd2hlcmUgdGhlIGRpdmlkZXJzIHdvdWxkIGJlIGZvciBub24tc2VsZWN0YWJsZSBpdGVtcwogICAgICAgICAgICAgLy8gSWYgdGhlIGxpc3QgaXMgb3BhcXVlIGFuZCB0aGUgYmFja2dyb3VuZCBpcyBhbHNvIG9wYXF1ZSwgd2UgZG9uJ3QKICAgICAgICAgICAgIC8vIG5lZWQgdG8gZHJhdyBhbnl0aGluZyBzaW5jZSB0aGUgYmFja2dyb3VuZCB3aWxsIGRvIGl0IGZvciB1cwotICAgICAgICAgICAgZmluYWwgYm9vbGVhbiBmaWxsRm9yTWlzc2luZ0RpdmlkZXJzID0gZHJhd0RpdmlkZXJzICYmIGlzT3BhcXVlKCkgJiYgIXN1cGVyLmlzT3BhcXVlKCk7CisgICAgICAgICAgICBmaW5hbCBib29sZWFuIGZpbGxGb3JNaXNzaW5nRGl2aWRlcnMgPSBpc09wYXF1ZSgpICYmICFzdXBlci5pc09wYXF1ZSgpOwogCiAgICAgICAgICAgICBpZiAoZmlsbEZvck1pc3NpbmdEaXZpZGVycyAmJiBtRGl2aWRlclBhaW50ID09IG51bGwgJiYgbUlzQ2FjaGVDb2xvck9wYXF1ZSkgewogICAgICAgICAgICAgICAgIG1EaXZpZGVyUGFpbnQgPSBuZXcgUGFpbnQoKTsKQEAgLTMwMzIsNzIgKzI5NzksNDEgQEAKIAogICAgICAgICAgICAgZmluYWwgaW50IGxpc3RCb3R0b20gPSBtQm90dG9tIC0gbVRvcCAtIG1MaXN0UGFkZGluZy5ib3R0b20gKyBtU2Nyb2xsWTsKICAgICAgICAgICAgIGlmICghbVN0YWNrRnJvbUJvdHRvbSkgewotICAgICAgICAgICAgICAgIGludCBib3R0b20gPSAwOworICAgICAgICAgICAgICAgIGludCBib3R0b207CiAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgLy8gRHJhdyB0b3AgZGl2aWRlciBvciBoZWFkZXIgZm9yIG92ZXJzY3JvbGwKICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgc2Nyb2xsWSA9IG1TY3JvbGxZOwotICAgICAgICAgICAgICAgIGlmIChjb3VudCA+IDAgJiYgc2Nyb2xsWSA8IDApIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGRyYXdPdmVyc2Nyb2xsSGVhZGVyKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBib3VuZHMuYm90dG9tID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJvdW5kcy50b3AgPSBzY3JvbGxZOwotICAgICAgICAgICAgICAgICAgICAgICAgZHJhd092ZXJzY3JvbGxIZWFkZXIoY2FudmFzLCBvdmVyc2Nyb2xsSGVhZGVyLCBib3VuZHMpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGRyYXdEaXZpZGVycykgewotICAgICAgICAgICAgICAgICAgICAgICAgYm91bmRzLmJvdHRvbSA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICBib3VuZHMudG9wID0gLWRpdmlkZXJIZWlnaHQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkcmF3RGl2aWRlcihjYW52YXMsIGJvdW5kcywgLTEpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCiAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgIGlmICgoaGVhZGVyRGl2aWRlcnMgfHwgZmlyc3QgKyBpID49IGhlYWRlckNvdW50KSAmJgogICAgICAgICAgICAgICAgICAgICAgICAgICAgIChmb290ZXJEaXZpZGVycyB8fCBmaXJzdCArIGkgPCBmb290ZXJMaW1pdCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIFZpZXcgY2hpbGQgPSBnZXRDaGlsZEF0KGkpOwogICAgICAgICAgICAgICAgICAgICAgICAgYm90dG9tID0gY2hpbGQuZ2V0Qm90dG9tKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBEb24ndCBkcmF3IGRpdmlkZXJzIG5leHQgdG8gaXRlbXMgdGhhdCBhcmUgbm90IGVuYWJsZWQKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkcmF3RGl2aWRlcnMgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGJvdHRvbSA8IGxpc3RCb3R0b20gJiYgIShkcmF3T3ZlcnNjcm9sbEZvb3RlciAmJiBpID09IGNvdW50IC0gMSkpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChhcmVBbGxJdGVtc1NlbGVjdGFibGUgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChhZGFwdGVyLmlzRW5hYmxlZChmaXJzdCArIGkpICYmIChpID09IGNvdW50IC0gMSB8fAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGFwdGVyLmlzRW5hYmxlZChmaXJzdCArIGkgKyAxKSkpKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib3VuZHMudG9wID0gYm90dG9tOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib3VuZHMuYm90dG9tID0gYm90dG9tICsgZGl2aWRlckhlaWdodDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHJhd0RpdmlkZXIoY2FudmFzLCBib3VuZHMsIGkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZmlsbEZvck1pc3NpbmdEaXZpZGVycykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib3VuZHMudG9wID0gYm90dG9tOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib3VuZHMuYm90dG9tID0gYm90dG9tICsgZGl2aWRlckhlaWdodDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FudmFzLmRyYXdSZWN0KGJvdW5kcywgcGFpbnQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoYXJlQWxsSXRlbXNTZWxlY3RhYmxlIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChhZGFwdGVyLmlzRW5hYmxlZChmaXJzdCArIGkpICYmIChpID09IGNvdW50IC0gMSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkYXB0ZXIuaXNFbmFibGVkKGZpcnN0ICsgaSArIDEpKSkpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm91bmRzLnRvcCA9IGJvdHRvbTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBib3VuZHMuYm90dG9tID0gYm90dG9tICsgZGl2aWRlckhlaWdodDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkcmF3RGl2aWRlcihjYW52YXMsIGJvdW5kcywgaSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGZpbGxGb3JNaXNzaW5nRGl2aWRlcnMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBib3VuZHMudG9wID0gYm90dG9tOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvdW5kcy5ib3R0b20gPSBib3R0b20gKyBkaXZpZGVySGVpZ2h0OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbnZhcy5kcmF3UmVjdChib3VuZHMsIHBhaW50KTsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGZpbmFsIGludCBvdmVyRm9vdGVyQm90dG9tID0gbUJvdHRvbSArIG1TY3JvbGxZOwotICAgICAgICAgICAgICAgIGlmIChkcmF3T3ZlcnNjcm9sbEZvb3RlciAmJiBmaXJzdCArIGNvdW50ID09IGl0ZW1Db3VudCAmJgotICAgICAgICAgICAgICAgICAgICAgICAgb3ZlckZvb3RlckJvdHRvbSA+IGJvdHRvbSkgewotICAgICAgICAgICAgICAgICAgICBib3VuZHMudG9wID0gYm90dG9tOwotICAgICAgICAgICAgICAgICAgICBib3VuZHMuYm90dG9tID0gb3ZlckZvb3RlckJvdHRvbTsKLSAgICAgICAgICAgICAgICAgICAgZHJhd092ZXJzY3JvbGxGb290ZXIoY2FudmFzLCBvdmVyc2Nyb2xsRm9vdGVyLCBib3VuZHMpOwotICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgaW50IHRvcDsKICAgICAgICAgICAgICAgICBpbnQgbGlzdFRvcCA9IG1MaXN0UGFkZGluZy50b3A7CiAKICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgc2Nyb2xsWSA9IG1TY3JvbGxZOwogCi0gICAgICAgICAgICAgICAgaWYgKGNvdW50ID4gMCAmJiBkcmF3T3ZlcnNjcm9sbEhlYWRlcikgewotICAgICAgICAgICAgICAgICAgICBib3VuZHMudG9wID0gc2Nyb2xsWTsKLSAgICAgICAgICAgICAgICAgICAgYm91bmRzLmJvdHRvbSA9IGdldENoaWxkQXQoMCkuZ2V0VG9wKCk7Ci0gICAgICAgICAgICAgICAgICAgIGRyYXdPdmVyc2Nyb2xsSGVhZGVyKGNhbnZhcywgb3ZlcnNjcm9sbEhlYWRlciwgYm91bmRzKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBmaW5hbCBpbnQgc3RhcnQgPSBkcmF3T3ZlcnNjcm9sbEhlYWRlciA/IDEgOiAwOwotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSBzdGFydDsgaSA8IGNvdW50OyBpKyspIHsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKICAgICAgICAgICAgICAgICAgICAgaWYgKChoZWFkZXJEaXZpZGVycyB8fCBmaXJzdCArIGkgPj0gaGVhZGVyQ291bnQpICYmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGZvb3RlckRpdmlkZXJzIHx8IGZpcnN0ICsgaSA8IGZvb3RlckxpbWl0KSkgewogICAgICAgICAgICAgICAgICAgICAgICAgVmlldyBjaGlsZCA9IGdldENoaWxkQXQoaSk7CiAgICAgICAgICAgICAgICAgICAgICAgICB0b3AgPSBjaGlsZC5nZXRUb3AoKTsKICAgICAgICAgICAgICAgICAgICAgICAgIC8vIERvbid0IGRyYXcgZGl2aWRlcnMgbmV4dCB0byBpdGVtcyB0aGF0IGFyZSBub3QgZW5hYmxlZAotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRyYXdEaXZpZGVycyAmJiB0b3AgPiBsaXN0VG9wKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAodG9wID4gbGlzdFRvcCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoYXJlQWxsSXRlbXNTZWxlY3RhYmxlIHx8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYWRhcHRlci5pc0VuYWJsZWQoZmlyc3QgKyBpKSAmJiAoaSA9PSBjb3VudCAtIDEgfHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRhcHRlci5pc0VuYWJsZWQoZmlyc3QgKyBpICsgMSkpKSkpIHsKQEAgLTMxMTgsMTYgKzMwMzQsOSBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICBpZiAoY291bnQgPiAwICYmIHNjcm9sbFkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChkcmF3T3ZlcnNjcm9sbEZvb3RlcikgewotICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IGFic0xpc3RCb3R0b20gPSBtQm90dG9tOwotICAgICAgICAgICAgICAgICAgICAgICAgYm91bmRzLnRvcCA9IGFic0xpc3RCb3R0b207Ci0gICAgICAgICAgICAgICAgICAgICAgICBib3VuZHMuYm90dG9tID0gYWJzTGlzdEJvdHRvbSArIHNjcm9sbFk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkcmF3T3ZlcnNjcm9sbEZvb3RlcihjYW52YXMsIG92ZXJzY3JvbGxGb290ZXIsIGJvdW5kcyk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZHJhd0RpdmlkZXJzKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBib3VuZHMudG9wID0gbGlzdEJvdHRvbTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJvdW5kcy5ib3R0b20gPSBsaXN0Qm90dG9tICsgZGl2aWRlckhlaWdodDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGRyYXdEaXZpZGVyKGNhbnZhcywgYm91bmRzLCAtMSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYm91bmRzLnRvcCA9IGxpc3RCb3R0b207CisgICAgICAgICAgICAgICAgICAgIGJvdW5kcy5ib3R0b20gPSBsaXN0Qm90dG9tICsgZGl2aWRlckhlaWdodDsKKyAgICAgICAgICAgICAgICAgICAgZHJhd0RpdmlkZXIoY2FudmFzLCBib3VuZHMsIC0xKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KQEAgLTMyMzYsNDUgKzMxNDUsNiBAQAogICAgICAgICBpbnZhbGlkYXRlKCk7CiAgICAgfQogICAgIAotICAgIC8qKgotICAgICAqIFNldHMgdGhlIGRyYXdhYmxlIHRoYXQgd2lsbCBiZSBkcmF3biBhYm92ZSBhbGwgb3RoZXIgbGlzdCBjb250ZW50LgotICAgICAqIFRoaXMgYXJlYSBjYW4gYmVjb21lIHZpc2libGUgd2hlbiB0aGUgdXNlciBvdmVyc2Nyb2xscyB0aGUgbGlzdC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBoZWFkZXIgVGhlIGRyYXdhYmxlIHRvIHVzZQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldE92ZXJzY3JvbGxIZWFkZXIoRHJhd2FibGUgaGVhZGVyKSB7Ci0gICAgICAgIG1PdmVyc2Nyb2xsSGVhZGVyID0gaGVhZGVyOwotICAgICAgICBpZiAobVNjcm9sbFkgPCAwKSB7Ci0gICAgICAgICAgICBpbnZhbGlkYXRlKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIFRoZSBkcmF3YWJsZSB0aGF0IHdpbGwgYmUgZHJhd24gYWJvdmUgYWxsIG90aGVyIGxpc3QgY29udGVudAotICAgICAqLwotICAgIHB1YmxpYyBEcmF3YWJsZSBnZXRPdmVyc2Nyb2xsSGVhZGVyKCkgewotICAgICAgICByZXR1cm4gbU92ZXJzY3JvbGxIZWFkZXI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgZHJhd2FibGUgdGhhdCB3aWxsIGJlIGRyYXduIGJlbG93IGFsbCBvdGhlciBsaXN0IGNvbnRlbnQuCi0gICAgICogVGhpcyBhcmVhIGNhbiBiZWNvbWUgdmlzaWJsZSB3aGVuIHRoZSB1c2VyIG92ZXJzY3JvbGxzIHRoZSBsaXN0LAotICAgICAqIG9yIHdoZW4gdGhlIGxpc3QncyBjb250ZW50IGRvZXMgbm90IGZ1bGx5IGZpbGwgdGhlIGNvbnRhaW5lciBhcmVhLgotICAgICAqCi0gICAgICogQHBhcmFtIGZvb3RlciBUaGUgZHJhd2FibGUgdG8gdXNlCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0T3ZlcnNjcm9sbEZvb3RlcihEcmF3YWJsZSBmb290ZXIpIHsKLSAgICAgICAgbU92ZXJzY3JvbGxGb290ZXIgPSBmb290ZXI7Ci0gICAgICAgIGludmFsaWRhdGUoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIFRoZSBkcmF3YWJsZSB0aGF0IHdpbGwgYmUgZHJhd24gYmVsb3cgYWxsIG90aGVyIGxpc3QgY29udGVudAotICAgICAqLwotICAgIHB1YmxpYyBEcmF3YWJsZSBnZXRPdmVyc2Nyb2xsRm9vdGVyKCkgewotICAgICAgICByZXR1cm4gbU92ZXJzY3JvbGxGb290ZXI7Ci0gICAgfQotCiAgICAgQE92ZXJyaWRlCiAgICAgcHJvdGVjdGVkIHZvaWQgb25Gb2N1c0NoYW5nZWQoYm9vbGVhbiBnYWluRm9jdXMsIGludCBkaXJlY3Rpb24sIFJlY3QgcHJldmlvdXNseUZvY3VzZWRSZWN0KSB7CiAgICAgICAgIHN1cGVyLm9uRm9jdXNDaGFuZ2VkKGdhaW5Gb2N1cywgZGlyZWN0aW9uLCBwcmV2aW91c2x5Rm9jdXNlZFJlY3QpOwpAQCAtMzQ0NSwxNzcgKzMzMTUsNiBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEBzZWUgI3NldENob2ljZU1vZGUoaW50KQotICAgICAqCi0gICAgICogQHJldHVybiBUaGUgY3VycmVudCBjaG9pY2UgbW9kZQotICAgICAqLwotICAgIHB1YmxpYyBpbnQgZ2V0Q2hvaWNlTW9kZSgpIHsKLSAgICAgICAgcmV0dXJuIG1DaG9pY2VNb2RlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIERlZmluZXMgdGhlIGNob2ljZSBiZWhhdmlvciBmb3IgdGhlIExpc3QuIEJ5IGRlZmF1bHQsIExpc3RzIGRvIG5vdCBoYXZlIGFueSBjaG9pY2UgYmVoYXZpb3IKLSAgICAgKiAoe0BsaW5rICNDSE9JQ0VfTU9ERV9OT05FfSkuIEJ5IHNldHRpbmcgdGhlIGNob2ljZU1vZGUgdG8ge0BsaW5rICNDSE9JQ0VfTU9ERV9TSU5HTEV9LCB0aGUKLSAgICAgKiBMaXN0IGFsbG93cyB1cCB0byBvbmUgaXRlbSB0byAgYmUgaW4gYSBjaG9zZW4gc3RhdGUuIEJ5IHNldHRpbmcgdGhlIGNob2ljZU1vZGUgdG8KLSAgICAgKiB7QGxpbmsgI0NIT0lDRV9NT0RFX01VTFRJUExFfSwgdGhlIGxpc3QgYWxsb3dzIGFueSBudW1iZXIgb2YgaXRlbXMgdG8gYmUgY2hvc2VuLgotICAgICAqCi0gICAgICogQHBhcmFtIGNob2ljZU1vZGUgT25lIG9mIHtAbGluayAjQ0hPSUNFX01PREVfTk9ORX0sIHtAbGluayAjQ0hPSUNFX01PREVfU0lOR0xFfSwgb3IKLSAgICAgKiB7QGxpbmsgI0NIT0lDRV9NT0RFX01VTFRJUExFfQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldENob2ljZU1vZGUoaW50IGNob2ljZU1vZGUpIHsKLSAgICAgICAgbUNob2ljZU1vZGUgPSBjaG9pY2VNb2RlOwotICAgICAgICBpZiAobUNob2ljZU1vZGUgIT0gQ0hPSUNFX01PREVfTk9ORSkgewotICAgICAgICAgICAgaWYgKG1DaGVja1N0YXRlcyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbUNoZWNrU3RhdGVzID0gbmV3IFNwYXJzZUJvb2xlYW5BcnJheSgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKG1DaGVja2VkSWRTdGF0ZXMgPT0gbnVsbCAmJiBtQWRhcHRlciAhPSBudWxsICYmIG1BZGFwdGVyLmhhc1N0YWJsZUlkcygpKSB7Ci0gICAgICAgICAgICAgICAgbUNoZWNrZWRJZFN0YXRlcyA9IG5ldyBMb25nU3BhcnNlQXJyYXk8Qm9vbGVhbj4oKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIHBlcmZvcm1JdGVtQ2xpY2soVmlldyB2aWV3LCBpbnQgcG9zaXRpb24sIGxvbmcgaWQpIHsKLSAgICAgICAgYm9vbGVhbiBoYW5kbGVkID0gZmFsc2U7Ci0KLSAgICAgICAgaWYgKG1DaG9pY2VNb2RlICE9IENIT0lDRV9NT0RFX05PTkUpIHsKLSAgICAgICAgICAgIGhhbmRsZWQgPSB0cnVlOwotCi0gICAgICAgICAgICBpZiAobUNob2ljZU1vZGUgPT0gQ0hPSUNFX01PREVfTVVMVElQTEUpIHsKLSAgICAgICAgICAgICAgICBib29sZWFuIG5ld1ZhbHVlID0gIW1DaGVja1N0YXRlcy5nZXQocG9zaXRpb24sIGZhbHNlKTsKLSAgICAgICAgICAgICAgICBtQ2hlY2tTdGF0ZXMucHV0KHBvc2l0aW9uLCBuZXdWYWx1ZSk7Ci0gICAgICAgICAgICAgICAgaWYgKG1DaGVja2VkSWRTdGF0ZXMgIT0gbnVsbCAmJiBtQWRhcHRlci5oYXNTdGFibGVJZHMoKSkgewotICAgICAgICAgICAgICAgICAgICBpZiAobmV3VmFsdWUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1DaGVja2VkSWRTdGF0ZXMucHV0KG1BZGFwdGVyLmdldEl0ZW1JZChwb3NpdGlvbiksIEJvb2xlYW4uVFJVRSk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtQ2hlY2tlZElkU3RhdGVzLmRlbGV0ZShtQWRhcHRlci5nZXRJdGVtSWQocG9zaXRpb24pKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgYm9vbGVhbiBuZXdWYWx1ZSA9ICFtQ2hlY2tTdGF0ZXMuZ2V0KHBvc2l0aW9uLCBmYWxzZSk7Ci0gICAgICAgICAgICAgICAgaWYgKG5ld1ZhbHVlKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1DaGVja1N0YXRlcy5jbGVhcigpOwotICAgICAgICAgICAgICAgICAgICBtQ2hlY2tTdGF0ZXMucHV0KHBvc2l0aW9uLCB0cnVlKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1DaGVja2VkSWRTdGF0ZXMgIT0gbnVsbCAmJiBtQWRhcHRlci5oYXNTdGFibGVJZHMoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgbUNoZWNrZWRJZFN0YXRlcy5jbGVhcigpOwotICAgICAgICAgICAgICAgICAgICAgICAgbUNoZWNrZWRJZFN0YXRlcy5wdXQobUFkYXB0ZXIuZ2V0SXRlbUlkKHBvc2l0aW9uKSwgQm9vbGVhbi5UUlVFKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gCi0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIG1EYXRhQ2hhbmdlZCA9IHRydWU7Ci0gICAgICAgICAgICByZW1lbWJlclN5bmNTdGF0ZSgpOwotICAgICAgICAgICAgcmVxdWVzdExheW91dCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgaGFuZGxlZCB8PSBzdXBlci5wZXJmb3JtSXRlbUNsaWNrKHZpZXcsIHBvc2l0aW9uLCBpZCk7Ci0KLSAgICAgICAgcmV0dXJuIGhhbmRsZWQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgY2hlY2tlZCBzdGF0ZSBvZiB0aGUgc3BlY2lmaWVkIHBvc2l0aW9uLiBUaGUgaXMgb25seSB2YWxpZCBpZgotICAgICAqIHRoZSBjaG9pY2UgbW9kZSBoYXMgYmVlbiBzZXQgdG8ge0BsaW5rICNDSE9JQ0VfTU9ERV9TSU5HTEV9IG9yCi0gICAgICoge0BsaW5rICNDSE9JQ0VfTU9ERV9NVUxUSVBMRX0uCi0gICAgICogCi0gICAgICogQHBhcmFtIHBvc2l0aW9uIFRoZSBpdGVtIHdob3NlIGNoZWNrZWQgc3RhdGUgaXMgdG8gYmUgY2hlY2tlZAotICAgICAqIEBwYXJhbSB2YWx1ZSBUaGUgbmV3IGNoZWNrZWQgc3RhdGUgZm9yIHRoZSBpdGVtCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0SXRlbUNoZWNrZWQoaW50IHBvc2l0aW9uLCBib29sZWFuIHZhbHVlKSB7Ci0gICAgICAgIGlmIChtQ2hvaWNlTW9kZSA9PSBDSE9JQ0VfTU9ERV9OT05FKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobUNob2ljZU1vZGUgPT0gQ0hPSUNFX01PREVfTVVMVElQTEUpIHsKLSAgICAgICAgICAgIG1DaGVja1N0YXRlcy5wdXQocG9zaXRpb24sIHZhbHVlKTsKLSAgICAgICAgICAgIGlmIChtQ2hlY2tlZElkU3RhdGVzICE9IG51bGwgJiYgbUFkYXB0ZXIuaGFzU3RhYmxlSWRzKCkpIHsKLSAgICAgICAgICAgICAgICBpZiAodmFsdWUpIHsKLSAgICAgICAgICAgICAgICAgICAgbUNoZWNrZWRJZFN0YXRlcy5wdXQobUFkYXB0ZXIuZ2V0SXRlbUlkKHBvc2l0aW9uKSwgQm9vbGVhbi5UUlVFKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBtQ2hlY2tlZElkU3RhdGVzLmRlbGV0ZShtQWRhcHRlci5nZXRJdGVtSWQocG9zaXRpb24pKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBib29sZWFuIHVwZGF0ZUlkcyA9IG1DaGVja2VkSWRTdGF0ZXMgIT0gbnVsbCAmJiBtQWRhcHRlci5oYXNTdGFibGVJZHMoKTsKLSAgICAgICAgICAgIC8vIENsZWFyIGFsbCB2YWx1ZXMgaWYgd2UncmUgY2hlY2tpbmcgc29tZXRoaW5nLCBvciB1bmNoZWNraW5nIHRoZSBjdXJyZW50bHkKLSAgICAgICAgICAgIC8vIHNlbGVjdGVkIGl0ZW0KLSAgICAgICAgICAgIGlmICh2YWx1ZSB8fCBpc0l0ZW1DaGVja2VkKHBvc2l0aW9uKSkgewotICAgICAgICAgICAgICAgIG1DaGVja1N0YXRlcy5jbGVhcigpOwotICAgICAgICAgICAgICAgIGlmICh1cGRhdGVJZHMpIHsKLSAgICAgICAgICAgICAgICAgICAgbUNoZWNrZWRJZFN0YXRlcy5jbGVhcigpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIHRoaXMgbWF5IGVuZCB1cCBzZWxlY3RpbmcgdGhlIHZhbHVlIHdlIGp1c3QgY2xlYXJlZCBidXQgdGhpcyB3YXkKLSAgICAgICAgICAgIC8vIHdlIGVuc3VyZSBsZW5ndGggb2YgbUNoZWNrU3RhdGVzIGlzIDEsIGEgZmFjdCBnZXRDaGVja2VkSXRlbVBvc2l0aW9uIHJlbGllcyBvbgotICAgICAgICAgICAgaWYgKHZhbHVlKSB7Ci0gICAgICAgICAgICAgICAgbUNoZWNrU3RhdGVzLnB1dChwb3NpdGlvbiwgdHJ1ZSk7Ci0gICAgICAgICAgICAgICAgaWYgKHVwZGF0ZUlkcykgewotICAgICAgICAgICAgICAgICAgICBtQ2hlY2tlZElkU3RhdGVzLnB1dChtQWRhcHRlci5nZXRJdGVtSWQocG9zaXRpb24pLCBCb29sZWFuLlRSVUUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIERvIG5vdCBnZW5lcmF0ZSBhIGRhdGEgY2hhbmdlIHdoaWxlIHdlIGFyZSBpbiB0aGUgbGF5b3V0IHBoYXNlCi0gICAgICAgIGlmICghbUluTGF5b3V0ICYmICFtQmxvY2tMYXlvdXRSZXF1ZXN0cykgewotICAgICAgICAgICAgbURhdGFDaGFuZ2VkID0gdHJ1ZTsKLSAgICAgICAgICAgIHJlbWVtYmVyU3luY1N0YXRlKCk7Ci0gICAgICAgICAgICByZXF1ZXN0TGF5b3V0KCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBjaGVja2VkIHN0YXRlIG9mIHRoZSBzcGVjaWZpZWQgcG9zaXRpb24uIFRoZSByZXN1bHQgaXMgb25seQotICAgICAqIHZhbGlkIGlmIHRoZSBjaG9pY2UgbW9kZSBoYXMgYmVlbiBzZXQgdG8ge0BsaW5rICNDSE9JQ0VfTU9ERV9TSU5HTEV9Ci0gICAgICogb3Ige0BsaW5rICNDSE9JQ0VfTU9ERV9NVUxUSVBMRX0uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcG9zaXRpb24gVGhlIGl0ZW0gd2hvc2UgY2hlY2tlZCBzdGF0ZSB0byByZXR1cm4KLSAgICAgKiBAcmV0dXJuIFRoZSBpdGVtJ3MgY2hlY2tlZCBzdGF0ZSBvciA8Y29kZT5mYWxzZTwvY29kZT4gaWYgY2hvaWNlIG1vZGUKLSAgICAgKiAgICAgICAgIGlzIGludmFsaWQKLSAgICAgKgotICAgICAqIEBzZWUgI3NldENob2ljZU1vZGUoaW50KQotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzSXRlbUNoZWNrZWQoaW50IHBvc2l0aW9uKSB7Ci0gICAgICAgIGlmIChtQ2hvaWNlTW9kZSAhPSBDSE9JQ0VfTU9ERV9OT05FICYmIG1DaGVja1N0YXRlcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gbUNoZWNrU3RhdGVzLmdldChwb3NpdGlvbik7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgY3VycmVudGx5IGNoZWNrZWQgaXRlbS4gVGhlIHJlc3VsdCBpcyBvbmx5IHZhbGlkIGlmIHRoZSBjaG9pY2UKLSAgICAgKiBtb2RlIGhhcyBiZWVuIHNldCB0byB7QGxpbmsgI0NIT0lDRV9NT0RFX1NJTkdMRX0uCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIFRoZSBwb3NpdGlvbiBvZiB0aGUgY3VycmVudGx5IGNoZWNrZWQgaXRlbSBvcgotICAgICAqICAgICAgICAge0BsaW5rICNJTlZBTElEX1BPU0lUSU9OfSBpZiBub3RoaW5nIGlzIHNlbGVjdGVkCi0gICAgICoKLSAgICAgKiBAc2VlICNzZXRDaG9pY2VNb2RlKGludCkKLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IGdldENoZWNrZWRJdGVtUG9zaXRpb24oKSB7Ci0gICAgICAgIGlmIChtQ2hvaWNlTW9kZSA9PSBDSE9JQ0VfTU9ERV9TSU5HTEUgJiYgbUNoZWNrU3RhdGVzICE9IG51bGwgJiYgbUNoZWNrU3RhdGVzLnNpemUoKSA9PSAxKSB7Ci0gICAgICAgICAgICByZXR1cm4gbUNoZWNrU3RhdGVzLmtleUF0KDApOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIElOVkFMSURfUE9TSVRJT047Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgc2V0IG9mIGNoZWNrZWQgaXRlbXMgaW4gdGhlIGxpc3QuIFRoZSByZXN1bHQgaXMgb25seSB2YWxpZCBpZgotICAgICAqIHRoZSBjaG9pY2UgbW9kZSBoYXMgbm90IGJlZW4gc2V0IHRvIHtAbGluayAjQ0hPSUNFX01PREVfTk9ORX0uCi0gICAgICoKLSAgICAgKiBAcmV0dXJuICBBIFNwYXJzZUJvb2xlYW5BcnJheSB3aGljaCB3aWxsIHJldHVybiB0cnVlIGZvciBlYWNoIGNhbGwgdG8KLSAgICAgKiAgICAgICAgICBnZXQoaW50IHBvc2l0aW9uKSB3aGVyZSBwb3NpdGlvbiBpcyBhIHBvc2l0aW9uIGluIHRoZSBsaXN0LAotICAgICAqICAgICAgICAgIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSBjaG9pY2UgbW9kZSBpcyBzZXQgdG8KLSAgICAgKiAgICAgICAgICB7QGxpbmsgI0NIT0lDRV9NT0RFX05PTkV9LgotICAgICAqLwotICAgIHB1YmxpYyBTcGFyc2VCb29sZWFuQXJyYXkgZ2V0Q2hlY2tlZEl0ZW1Qb3NpdGlvbnMoKSB7Ci0gICAgICAgIGlmIChtQ2hvaWNlTW9kZSAhPSBDSE9JQ0VfTU9ERV9OT05FKSB7Ci0gICAgICAgICAgICByZXR1cm4gbUNoZWNrU3RhdGVzOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIC8qKgogICAgICAqIFJldHVybnMgdGhlIHNldCBvZiBjaGVja2VkIGl0ZW1zIGlkcy4gVGhlIHJlc3VsdCBpcyBvbmx5IHZhbGlkIGlmIHRoZQogICAgICAqIGNob2ljZSBtb2RlIGhhcyBub3QgYmVlbiBzZXQgdG8ge0BsaW5rICNDSE9JQ0VfTU9ERV9OT05FfS4KICAgICAgKiAKQEAgLTM2MjQsNiArMzMyMyw3IEBACiAgICAgICogICAgICAgICAKICAgICAgKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rICNnZXRDaGVja2VkSXRlbUlkcygpfSBpbnN0ZWFkLgogICAgICAqLworICAgIEBEZXByZWNhdGVkCiAgICAgcHVibGljIGxvbmdbXSBnZXRDaGVja0l0ZW1JZHMoKSB7CiAgICAgICAgIC8vIFVzZSBuZXcgYmVoYXZpb3IgdGhhdCBjb3JyZWN0bHkgaGFuZGxlcyBzdGFibGUgSUQgbWFwcGluZy4KICAgICAgICAgaWYgKG1BZGFwdGVyICE9IG51bGwgJiYgbUFkYXB0ZXIuaGFzU3RhYmxlSWRzKCkpIHsKQEAgLTM2NTgsMTE1ICszMzU4LDQgQEAKICAgICAgICAgfQogICAgICAgICByZXR1cm4gbmV3IGxvbmdbMF07CiAgICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHNldCBvZiBjaGVja2VkIGl0ZW1zIGlkcy4gVGhlIHJlc3VsdCBpcyBvbmx5IHZhbGlkIGlmIHRoZQotICAgICAqIGNob2ljZSBtb2RlIGhhcyBub3QgYmVlbiBzZXQgdG8ge0BsaW5rICNDSE9JQ0VfTU9ERV9OT05FfSBhbmQgdGhlIGFkYXB0ZXIKLSAgICAgKiBoYXMgc3RhYmxlIElEcy4gKHtAbGluayBMaXN0QWRhcHRlciNoYXNTdGFibGVJZHMoKX0gPT0ge0Bjb2RlIHRydWV9KQotICAgICAqIAotICAgICAqIEByZXR1cm4gQSBuZXcgYXJyYXkgd2hpY2ggY29udGFpbnMgdGhlIGlkIG9mIGVhY2ggY2hlY2tlZCBpdGVtIGluIHRoZQotICAgICAqICAgICAgICAgbGlzdC4KLSAgICAgKi8KLSAgICBwdWJsaWMgbG9uZ1tdIGdldENoZWNrZWRJdGVtSWRzKCkgewotICAgICAgICBpZiAobUNob2ljZU1vZGUgPT0gQ0hPSUNFX01PREVfTk9ORSB8fCBtQ2hlY2tlZElkU3RhdGVzID09IG51bGwgfHwgbUFkYXB0ZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIG5ldyBsb25nWzBdOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBmaW5hbCBMb25nU3BhcnNlQXJyYXk8Qm9vbGVhbj4gaWRTdGF0ZXMgPSBtQ2hlY2tlZElkU3RhdGVzOwotICAgICAgICBmaW5hbCBpbnQgY291bnQgPSBpZFN0YXRlcy5zaXplKCk7Ci0gICAgICAgIGZpbmFsIGxvbmdbXSBpZHMgPSBuZXcgbG9uZ1tjb3VudF07Ci0gICAgICAgIAotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKLSAgICAgICAgICAgIGlkc1tpXSA9IGlkU3RhdGVzLmtleUF0KGkpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gaWRzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENsZWFyIGFueSBjaG9pY2VzIHByZXZpb3VzbHkgc2V0Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgY2xlYXJDaG9pY2VzKCkgewotICAgICAgICBpZiAobUNoZWNrU3RhdGVzICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1DaGVja1N0YXRlcy5jbGVhcigpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChtQ2hlY2tlZElkU3RhdGVzICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1DaGVja2VkSWRTdGF0ZXMuY2xlYXIoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHN0YXRpYyBjbGFzcyBTYXZlZFN0YXRlIGV4dGVuZHMgQmFzZVNhdmVkU3RhdGUgewotICAgICAgICBTcGFyc2VCb29sZWFuQXJyYXkgY2hlY2tTdGF0ZTsKLSAgICAgICAgTG9uZ1NwYXJzZUFycmF5PEJvb2xlYW4+IGNoZWNrSWRTdGF0ZTsKLQotICAgICAgICAvKioKLSAgICAgICAgICogQ29uc3RydWN0b3IgY2FsbGVkIGZyb20ge0BsaW5rIExpc3RWaWV3I29uU2F2ZUluc3RhbmNlU3RhdGUoKX0KLSAgICAgICAgICovCi0gICAgICAgIFNhdmVkU3RhdGUoUGFyY2VsYWJsZSBzdXBlclN0YXRlLCBTcGFyc2VCb29sZWFuQXJyYXkgY2hlY2tTdGF0ZSwKLSAgICAgICAgICAgICAgICBMb25nU3BhcnNlQXJyYXk8Qm9vbGVhbj4gY2hlY2tJZFN0YXRlKSB7Ci0gICAgICAgICAgICBzdXBlcihzdXBlclN0YXRlKTsKLSAgICAgICAgICAgIHRoaXMuY2hlY2tTdGF0ZSA9IGNoZWNrU3RhdGU7Ci0gICAgICAgICAgICB0aGlzLmNoZWNrSWRTdGF0ZSA9IGNoZWNrSWRTdGF0ZTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBDb25zdHJ1Y3RvciBjYWxsZWQgZnJvbSB7QGxpbmsgI0NSRUFUT1J9Ci0gICAgICAgICAqLwotICAgICAgICBwcml2YXRlIFNhdmVkU3RhdGUoUGFyY2VsIGluKSB7Ci0gICAgICAgICAgICBzdXBlcihpbik7Ci0gICAgICAgICAgICBjaGVja1N0YXRlID0gaW4ucmVhZFNwYXJzZUJvb2xlYW5BcnJheSgpOwotICAgICAgICAgICAgbG9uZ1tdIGlkU3RhdGUgPSBpbi5jcmVhdGVMb25nQXJyYXkoKTsKLQotICAgICAgICAgICAgaWYgKGlkU3RhdGUubGVuZ3RoID4gMCkgewotICAgICAgICAgICAgICAgIGNoZWNrSWRTdGF0ZSA9IG5ldyBMb25nU3BhcnNlQXJyYXk8Qm9vbGVhbj4oKTsKLSAgICAgICAgICAgICAgICBjaGVja0lkU3RhdGUuc2V0VmFsdWVzKGlkU3RhdGUsIEJvb2xlYW4uVFJVRSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgd3JpdGVUb1BhcmNlbChQYXJjZWwgb3V0LCBpbnQgZmxhZ3MpIHsKLSAgICAgICAgICAgIHN1cGVyLndyaXRlVG9QYXJjZWwob3V0LCBmbGFncyk7Ci0gICAgICAgICAgICBvdXQud3JpdGVTcGFyc2VCb29sZWFuQXJyYXkoY2hlY2tTdGF0ZSk7Ci0gICAgICAgICAgICBvdXQud3JpdGVMb25nQXJyYXkoY2hlY2tJZFN0YXRlICE9IG51bGwgPyBjaGVja0lkU3RhdGUuZ2V0S2V5cygpIDogbmV3IGxvbmdbMF0pOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgICAgICAgICByZXR1cm4gIkxpc3RWaWV3LlNhdmVkU3RhdGV7IgotICAgICAgICAgICAgICAgICAgICArIEludGVnZXIudG9IZXhTdHJpbmcoU3lzdGVtLmlkZW50aXR5SGFzaENvZGUodGhpcykpCi0gICAgICAgICAgICAgICAgICAgICsgIiBjaGVja1N0YXRlPSIgKyBjaGVja1N0YXRlICsgIn0iOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBQYXJjZWxhYmxlLkNyZWF0b3I8U2F2ZWRTdGF0ZT4gQ1JFQVRPUgotICAgICAgICAgICAgICAgID0gbmV3IFBhcmNlbGFibGUuQ3JlYXRvcjxTYXZlZFN0YXRlPigpIHsKLSAgICAgICAgICAgIHB1YmxpYyBTYXZlZFN0YXRlIGNyZWF0ZUZyb21QYXJjZWwoUGFyY2VsIGluKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBTYXZlZFN0YXRlKGluKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHVibGljIFNhdmVkU3RhdGVbXSBuZXdBcnJheShpbnQgc2l6ZSkgewotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgU2F2ZWRTdGF0ZVtzaXplXTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgUGFyY2VsYWJsZSBvblNhdmVJbnN0YW5jZVN0YXRlKCkgewotICAgICAgICBQYXJjZWxhYmxlIHN1cGVyU3RhdGUgPSBzdXBlci5vblNhdmVJbnN0YW5jZVN0YXRlKCk7Ci0gICAgICAgIHJldHVybiBuZXcgU2F2ZWRTdGF0ZShzdXBlclN0YXRlLCBtQ2hlY2tTdGF0ZXMsIG1DaGVja2VkSWRTdGF0ZXMpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIG9uUmVzdG9yZUluc3RhbmNlU3RhdGUoUGFyY2VsYWJsZSBzdGF0ZSkgewotICAgICAgICBTYXZlZFN0YXRlIHNzID0gKFNhdmVkU3RhdGUpIHN0YXRlOwotCi0gICAgICAgIHN1cGVyLm9uUmVzdG9yZUluc3RhbmNlU3RhdGUoc3MuZ2V0U3VwZXJTdGF0ZSgpKTsKLQotICAgICAgICBpZiAoc3MuY2hlY2tTdGF0ZSAhPSBudWxsKSB7Ci0gICAgICAgICAgIG1DaGVja1N0YXRlcyA9IHNzLmNoZWNrU3RhdGU7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoc3MuY2hlY2tJZFN0YXRlICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1DaGVja2VkSWRTdGF0ZXMgPSBzcy5jaGVja0lkU3RhdGU7Ci0gICAgICAgIH0KLSAgICB9CiB9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvT3ZlclNjcm9sbGVyLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvT3ZlclNjcm9sbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc4OTczYWQuLjAwMDAwMDAKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L092ZXJTY3JvbGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODQ5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGFuZHJvaWQud2lkZ2V0OwotCi1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7Ci1pbXBvcnQgYW5kcm9pZC5oYXJkd2FyZS5TZW5zb3JNYW5hZ2VyOwotaW1wb3J0IGFuZHJvaWQudXRpbC5GbG9hdE1hdGg7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LlZpZXdDb25maWd1cmF0aW9uOwotaW1wb3J0IGFuZHJvaWQudmlldy5hbmltYXRpb24uQW5pbWF0aW9uVXRpbHM7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LmFuaW1hdGlvbi5JbnRlcnBvbGF0b3I7Ci0KLS8qKgotICogVGhpcyBjbGFzcyBlbmNhcHN1bGF0ZXMgc2Nyb2xsaW5nIHdpdGggdGhlIGFiaWxpdHkgdG8gb3ZlcnNob290IHRoZSBib3VuZHMKLSAqIG9mIGEgc2Nyb2xsaW5nIG9wZXJhdGlvbi4gVGhpcyBjbGFzcyBpcyBhIGRyb3AtaW4gcmVwbGFjZW1lbnQgZm9yCi0gKiB7QGxpbmsgYW5kcm9pZC53aWRnZXQuU2Nyb2xsZXJ9IGluIG1vc3QgY2FzZXMuCi0gKi8KLXB1YmxpYyBjbGFzcyBPdmVyU2Nyb2xsZXIgewotICAgIHByaXZhdGUgaW50IG1Nb2RlOwotCi0gICAgcHJpdmF0ZSBNYWduZXRpY092ZXJTY3JvbGxlciBtU2Nyb2xsZXJYOwotICAgIHByaXZhdGUgTWFnbmV0aWNPdmVyU2Nyb2xsZXIgbVNjcm9sbGVyWTsKLQotICAgIHByaXZhdGUgZmluYWwgSW50ZXJwb2xhdG9yIG1JbnRlcnBvbGF0b3I7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgREVGQVVMVF9EVVJBVElPTiA9IDI1MDsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU0NST0xMX01PREUgPSAwOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBGTElOR19NT0RFID0gMTsKLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYW4gT3ZlclNjcm9sbGVyIHdpdGggYSB2aXNjb3VzIGZsdWlkIHNjcm9sbCBpbnRlcnBvbGF0b3IuCi0gICAgICogQHBhcmFtIGNvbnRleHQKLSAgICAgKi8KLSAgICBwdWJsaWMgT3ZlclNjcm9sbGVyKENvbnRleHQgY29udGV4dCkgewotICAgICAgICB0aGlzKGNvbnRleHQsIG51bGwpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYW4gT3ZlclNjcm9sbGVyIHdpdGggZGVmYXVsdCBlZGdlIGJvdW5jZSBjb2VmZmljaWVudHMuCi0gICAgICogQHBhcmFtIGNvbnRleHQgVGhlIGNvbnRleHQgb2YgdGhpcyBhcHBsaWNhdGlvbi4KLSAgICAgKiBAcGFyYW0gaW50ZXJwb2xhdG9yIFRoZSBzY3JvbGwgaW50ZXJwb2xhdG9yLiBJZiBudWxsLCBhIGRlZmF1bHQgKHZpc2NvdXMpIGludGVycG9sYXRvciB3aWxsCi0gICAgICogYmUgdXNlZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgT3ZlclNjcm9sbGVyKENvbnRleHQgY29udGV4dCwgSW50ZXJwb2xhdG9yIGludGVycG9sYXRvcikgewotICAgICAgICB0aGlzKGNvbnRleHQsIGludGVycG9sYXRvciwgTWFnbmV0aWNPdmVyU2Nyb2xsZXIuREVGQVVMVF9CT1VOQ0VfQ09FRkZJQ0lFTlQsCi0gICAgICAgICAgICAgICAgTWFnbmV0aWNPdmVyU2Nyb2xsZXIuREVGQVVMVF9CT1VOQ0VfQ09FRkZJQ0lFTlQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYW4gT3ZlclNjcm9sbGVyLgotICAgICAqIEBwYXJhbSBjb250ZXh0IFRoZSBjb250ZXh0IG9mIHRoaXMgYXBwbGljYXRpb24uCi0gICAgICogQHBhcmFtIGludGVycG9sYXRvciBUaGUgc2Nyb2xsIGludGVycG9sYXRvci4gSWYgbnVsbCwgYSBkZWZhdWx0ICh2aXNjb3VzKSBpbnRlcnBvbGF0b3Igd2lsbAotICAgICAqIGJlIHVzZWQuCi0gICAgICogQHBhcmFtIGJvdW5jZUNvZWZmaWNpZW50WCBBIHZhbHVlIGJldHdlZW4gMCBhbmQgMSB0aGF0IHdpbGwgZGV0ZXJtaW5lIHRoZSBwcm9wb3J0aW9uIG9mIHRoZQotICAgICAqIHZlbG9jaXR5IHdoaWNoIGlzIHByZXNlcnZlZCBpbiB0aGUgYm91bmNlIHdoZW4gdGhlIGhvcml6b250YWwgZWRnZSBpcyByZWFjaGVkLiBBIG51bGwgdmFsdWUKLSAgICAgKiBtZWFucyBubyBib3VuY2UuCi0gICAgICogQHBhcmFtIGJvdW5jZUNvZWZmaWNpZW50WSBTYW1lIGFzIGJvdW5jZUNvZWZmaWNpZW50WCBidXQgZm9yIHRoZSB2ZXJ0aWNhbCBkaXJlY3Rpb24uCi0gICAgICovCi0gICAgcHVibGljIE92ZXJTY3JvbGxlcihDb250ZXh0IGNvbnRleHQsIEludGVycG9sYXRvciBpbnRlcnBvbGF0b3IsCi0gICAgICAgICAgICBmbG9hdCBib3VuY2VDb2VmZmljaWVudFgsIGZsb2F0IGJvdW5jZUNvZWZmaWNpZW50WSkgewotICAgICAgICBtSW50ZXJwb2xhdG9yID0gaW50ZXJwb2xhdG9yOwotICAgICAgICBtU2Nyb2xsZXJYID0gbmV3IE1hZ25ldGljT3ZlclNjcm9sbGVyKCk7Ci0gICAgICAgIG1TY3JvbGxlclkgPSBuZXcgTWFnbmV0aWNPdmVyU2Nyb2xsZXIoKTsKLSAgICAgICAgTWFnbmV0aWNPdmVyU2Nyb2xsZXIuaW5pdGlhbGl6ZUZyb21Db250ZXh0KGNvbnRleHQpOwotCi0gICAgICAgIG1TY3JvbGxlclguc2V0Qm91bmNlQ29lZmZpY2llbnQoYm91bmNlQ29lZmZpY2llbnRYKTsKLSAgICAgICAgbVNjcm9sbGVyWS5zZXRCb3VuY2VDb2VmZmljaWVudChib3VuY2VDb2VmZmljaWVudFkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqCi0gICAgICogUmV0dXJucyB3aGV0aGVyIHRoZSBzY3JvbGxlciBoYXMgZmluaXNoZWQgc2Nyb2xsaW5nLgotICAgICAqCi0gICAgICogQHJldHVybiBUcnVlIGlmIHRoZSBzY3JvbGxlciBoYXMgZmluaXNoZWQgc2Nyb2xsaW5nLCBmYWxzZSBvdGhlcndpc2UuCi0gICAgICovCi0gICAgcHVibGljIGZpbmFsIGJvb2xlYW4gaXNGaW5pc2hlZCgpIHsKLSAgICAgICAgcmV0dXJuIG1TY3JvbGxlclgubUZpbmlzaGVkICYmIG1TY3JvbGxlclkubUZpbmlzaGVkOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEZvcmNlIHRoZSBmaW5pc2hlZCBmaWVsZCB0byBhIHBhcnRpY3VsYXIgdmFsdWUuIENvbnRyYXJ5IHRvCi0gICAgICoge0BsaW5rICNhYm9ydEFuaW1hdGlvbigpfSwgZm9yY2luZyB0aGUgYW5pbWF0aW9uIHRvIGZpbmlzaGVkCi0gICAgICogZG9lcyBOT1QgY2F1c2UgdGhlIHNjcm9sbGVyIHRvIG1vdmUgdG8gdGhlIGZpbmFsIHggYW5kIHkKLSAgICAgKiBwb3NpdGlvbi4KLSAgICAgKgotICAgICAqIEBwYXJhbSBmaW5pc2hlZCBUaGUgbmV3IGZpbmlzaGVkIHZhbHVlLgotICAgICAqLwotICAgIHB1YmxpYyBmaW5hbCB2b2lkIGZvcmNlRmluaXNoZWQoYm9vbGVhbiBmaW5pc2hlZCkgewotICAgICAgICBtU2Nyb2xsZXJYLm1GaW5pc2hlZCA9IG1TY3JvbGxlclkubUZpbmlzaGVkID0gZmluaXNoZWQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgY3VycmVudCBYIG9mZnNldCBpbiB0aGUgc2Nyb2xsLgotICAgICAqCi0gICAgICogQHJldHVybiBUaGUgbmV3IFggb2Zmc2V0IGFzIGFuIGFic29sdXRlIGRpc3RhbmNlIGZyb20gdGhlIG9yaWdpbi4KLSAgICAgKi8KLSAgICBwdWJsaWMgZmluYWwgaW50IGdldEN1cnJYKCkgewotICAgICAgICByZXR1cm4gbVNjcm9sbGVyWC5tQ3VycmVudFBvc2l0aW9uOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGN1cnJlbnQgWSBvZmZzZXQgaW4gdGhlIHNjcm9sbC4KLSAgICAgKgotICAgICAqIEByZXR1cm4gVGhlIG5ldyBZIG9mZnNldCBhcyBhbiBhYnNvbHV0ZSBkaXN0YW5jZSBmcm9tIHRoZSBvcmlnaW4uCi0gICAgICovCi0gICAgcHVibGljIGZpbmFsIGludCBnZXRDdXJyWSgpIHsKLSAgICAgICAgcmV0dXJuIG1TY3JvbGxlclkubUN1cnJlbnRQb3NpdGlvbjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAaGlkZQotICAgICAqIFJldHVybnMgdGhlIGN1cnJlbnQgdmVsb2NpdHkuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIFRoZSBvcmlnaW5hbCB2ZWxvY2l0eSBsZXNzIHRoZSBkZWNlbGVyYXRpb24sIG5vcm0gb2YgdGhlIFggYW5kIFkgdmVsb2NpdHkgdmVjdG9yLgotICAgICAqLwotICAgIHB1YmxpYyBmbG9hdCBnZXRDdXJyVmVsb2NpdHkoKSB7Ci0gICAgICAgIGZsb2F0IHNxdWFyZWROb3JtID0gbVNjcm9sbGVyWC5tQ3VyclZlbG9jaXR5ICogbVNjcm9sbGVyWC5tQ3VyclZlbG9jaXR5OwotICAgICAgICBzcXVhcmVkTm9ybSArPSBtU2Nyb2xsZXJZLm1DdXJyVmVsb2NpdHkgKiBtU2Nyb2xsZXJZLm1DdXJyVmVsb2NpdHk7Ci0gICAgICAgIHJldHVybiBGbG9hdE1hdGguc3FydChzcXVhcmVkTm9ybSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgc3RhcnQgWCBvZmZzZXQgaW4gdGhlIHNjcm9sbC4KLSAgICAgKgotICAgICAqIEByZXR1cm4gVGhlIHN0YXJ0IFggb2Zmc2V0IGFzIGFuIGFic29sdXRlIGRpc3RhbmNlIGZyb20gdGhlIG9yaWdpbi4KLSAgICAgKi8KLSAgICBwdWJsaWMgZmluYWwgaW50IGdldFN0YXJ0WCgpIHsKLSAgICAgICAgcmV0dXJuIG1TY3JvbGxlclgubVN0YXJ0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHN0YXJ0IFkgb2Zmc2V0IGluIHRoZSBzY3JvbGwuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIFRoZSBzdGFydCBZIG9mZnNldCBhcyBhbiBhYnNvbHV0ZSBkaXN0YW5jZSBmcm9tIHRoZSBvcmlnaW4uCi0gICAgICovCi0gICAgcHVibGljIGZpbmFsIGludCBnZXRTdGFydFkoKSB7Ci0gICAgICAgIHJldHVybiBtU2Nyb2xsZXJZLm1TdGFydDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHdoZXJlIHRoZSBzY3JvbGwgd2lsbCBlbmQuIFZhbGlkIG9ubHkgZm9yICJmbGluZyIgc2Nyb2xscy4KLSAgICAgKgotICAgICAqIEByZXR1cm4gVGhlIGZpbmFsIFggb2Zmc2V0IGFzIGFuIGFic29sdXRlIGRpc3RhbmNlIGZyb20gdGhlIG9yaWdpbi4KLSAgICAgKi8KLSAgICBwdWJsaWMgZmluYWwgaW50IGdldEZpbmFsWCgpIHsKLSAgICAgICAgcmV0dXJuIG1TY3JvbGxlclgubUZpbmFsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgd2hlcmUgdGhlIHNjcm9sbCB3aWxsIGVuZC4gVmFsaWQgb25seSBmb3IgImZsaW5nIiBzY3JvbGxzLgotICAgICAqCi0gICAgICogQHJldHVybiBUaGUgZmluYWwgWSBvZmZzZXQgYXMgYW4gYWJzb2x1dGUgZGlzdGFuY2UgZnJvbSB0aGUgb3JpZ2luLgotICAgICAqLwotICAgIHB1YmxpYyBmaW5hbCBpbnQgZ2V0RmluYWxZKCkgewotICAgICAgICByZXR1cm4gbVNjcm9sbGVyWS5tRmluYWw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBob3cgbG9uZyB0aGUgc2Nyb2xsIGV2ZW50IHdpbGwgdGFrZSwgaW4gbWlsbGlzZWNvbmRzLgotICAgICAqCi0gICAgICogQHJldHVybiBUaGUgZHVyYXRpb24gb2YgdGhlIHNjcm9sbCBpbiBtaWxsaXNlY29uZHMuCi0gICAgICoKLSAgICAgKiBAaGlkZSBQZW5kaW5nIHJlbW92YWwgb25jZSBub3RoaW5nIGRlcGVuZHMgb24gaXQKLSAgICAgKiBAZGVwcmVjYXRlZCBPdmVyU2Nyb2xsZXJzIGRvbid0IG5lY2Vzc2FyaWx5IGhhdmUgYSBmaXhlZCBkdXJhdGlvbi4KLSAgICAgKiAgICAgICAgICAgICBUaGlzIGZ1bmN0aW9uIHdpbGwgbGllIHRvIHRoZSBiZXN0IG9mIGl0cyBhYmlsaXR5LgotICAgICAqLwotICAgIHB1YmxpYyBmaW5hbCBpbnQgZ2V0RHVyYXRpb24oKSB7Ci0gICAgICAgIHJldHVybiBNYXRoLm1heChtU2Nyb2xsZXJYLm1EdXJhdGlvbiwgbVNjcm9sbGVyWS5tRHVyYXRpb24pOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEV4dGVuZCB0aGUgc2Nyb2xsIGFuaW1hdGlvbi4gVGhpcyBhbGxvd3MgYSBydW5uaW5nIGFuaW1hdGlvbiB0byBzY3JvbGwKLSAgICAgKiBmdXJ0aGVyIGFuZCBsb25nZXIsIHdoZW4gdXNlZCB3aXRoIHtAbGluayAjc2V0RmluYWxYKGludCl9IG9yIHtAbGluayAjc2V0RmluYWxZKGludCl9LgotICAgICAqCi0gICAgICogQHBhcmFtIGV4dGVuZCBBZGRpdGlvbmFsIHRpbWUgdG8gc2Nyb2xsIGluIG1pbGxpc2Vjb25kcy4KLSAgICAgKiBAc2VlICNzZXRGaW5hbFgoaW50KQotICAgICAqIEBzZWUgI3NldEZpbmFsWShpbnQpCi0gICAgICoKLSAgICAgKiBAaGlkZSBQZW5kaW5nIHJlbW92YWwgb25jZSBub3RoaW5nIGRlcGVuZHMgb24gaXQKLSAgICAgKiBAZGVwcmVjYXRlZCBPdmVyU2Nyb2xsZXJzIGRvbid0IG5lY2Vzc2FyaWx5IGhhdmUgYSBmaXhlZCBkdXJhdGlvbi4KLSAgICAgKiAgICAgICAgICAgICBJbnN0ZWFkIG9mIHNldHRpbmcgYSBuZXcgZmluYWwgcG9zaXRpb24gYW5kIGV4dGVuZGluZwotICAgICAqICAgICAgICAgICAgIHRoZSBkdXJhdGlvbiBvZiBhbiBleGlzdGluZyBzY3JvbGwsIHVzZSBzdGFydFNjcm9sbAotICAgICAqICAgICAgICAgICAgIHRvIGJlZ2luIGEgbmV3IGFuaW1hdGlvbi4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBleHRlbmREdXJhdGlvbihpbnQgZXh0ZW5kKSB7Ci0gICAgICAgIG1TY3JvbGxlclguZXh0ZW5kRHVyYXRpb24oZXh0ZW5kKTsKLSAgICAgICAgbVNjcm9sbGVyWS5leHRlbmREdXJhdGlvbihleHRlbmQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIGZpbmFsIHBvc2l0aW9uIChYKSBmb3IgdGhpcyBzY3JvbGxlci4KLSAgICAgKgotICAgICAqIEBwYXJhbSBuZXdYIFRoZSBuZXcgWCBvZmZzZXQgYXMgYW4gYWJzb2x1dGUgZGlzdGFuY2UgZnJvbSB0aGUgb3JpZ2luLgotICAgICAqIEBzZWUgI2V4dGVuZER1cmF0aW9uKGludCkKLSAgICAgKiBAc2VlICNzZXRGaW5hbFkoaW50KQotICAgICAqCi0gICAgICogQGhpZGUgUGVuZGluZyByZW1vdmFsIG9uY2Ugbm90aGluZyBkZXBlbmRzIG9uIGl0Ci0gICAgICogQGRlcHJlY2F0ZWQgT3ZlclNjcm9sbGVyJ3MgZmluYWwgcG9zaXRpb24gbWF5IGNoYW5nZSBkdXJpbmcgYW4gYW5pbWF0aW9uLgotICAgICAqICAgICAgICAgICAgIEluc3RlYWQgb2Ygc2V0dGluZyBhIG5ldyBmaW5hbCBwb3NpdGlvbiBhbmQgZXh0ZW5kaW5nCi0gICAgICogICAgICAgICAgICAgdGhlIGR1cmF0aW9uIG9mIGFuIGV4aXN0aW5nIHNjcm9sbCwgdXNlIHN0YXJ0U2Nyb2xsCi0gICAgICogICAgICAgICAgICAgdG8gYmVnaW4gYSBuZXcgYW5pbWF0aW9uLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEZpbmFsWChpbnQgbmV3WCkgewotICAgICAgICBtU2Nyb2xsZXJYLnNldEZpbmFsUG9zaXRpb24obmV3WCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgZmluYWwgcG9zaXRpb24gKFkpIGZvciB0aGlzIHNjcm9sbGVyLgotICAgICAqCi0gICAgICogQHBhcmFtIG5ld1kgVGhlIG5ldyBZIG9mZnNldCBhcyBhbiBhYnNvbHV0ZSBkaXN0YW5jZSBmcm9tIHRoZSBvcmlnaW4uCi0gICAgICogQHNlZSAjZXh0ZW5kRHVyYXRpb24oaW50KQotICAgICAqIEBzZWUgI3NldEZpbmFsWChpbnQpCi0gICAgICoKLSAgICAgKiBAaGlkZSBQZW5kaW5nIHJlbW92YWwgb25jZSBub3RoaW5nIGRlcGVuZHMgb24gaXQKLSAgICAgKiBAZGVwcmVjYXRlZCBPdmVyU2Nyb2xsZXIncyBmaW5hbCBwb3NpdGlvbiBtYXkgY2hhbmdlIGR1cmluZyBhbiBhbmltYXRpb24uCi0gICAgICogICAgICAgICAgICAgSW5zdGVhZCBvZiBzZXR0aW5nIGEgbmV3IGZpbmFsIHBvc2l0aW9uIGFuZCBleHRlbmRpbmcKLSAgICAgKiAgICAgICAgICAgICB0aGUgZHVyYXRpb24gb2YgYW4gZXhpc3Rpbmcgc2Nyb2xsLCB1c2Ugc3RhcnRTY3JvbGwKLSAgICAgKiAgICAgICAgICAgICB0byBiZWdpbiBhIG5ldyBhbmltYXRpb24uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0RmluYWxZKGludCBuZXdZKSB7Ci0gICAgICAgIG1TY3JvbGxlclkuc2V0RmluYWxQb3NpdGlvbihuZXdZKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDYWxsIHRoaXMgd2hlbiB5b3Ugd2FudCB0byBrbm93IHRoZSBuZXcgbG9jYXRpb24uIElmIGl0IHJldHVybnMgdHJ1ZSwgdGhlCi0gICAgICogYW5pbWF0aW9uIGlzIG5vdCB5ZXQgZmluaXNoZWQuCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gY29tcHV0ZVNjcm9sbE9mZnNldCgpIHsKLSAgICAgICAgaWYgKGlzRmluaXNoZWQoKSkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgc3dpdGNoIChtTW9kZSkgewotICAgICAgICAgICAgY2FzZSBTQ1JPTExfTU9ERToKLSAgICAgICAgICAgICAgICBsb25nIHRpbWUgPSBBbmltYXRpb25VdGlscy5jdXJyZW50QW5pbWF0aW9uVGltZU1pbGxpcygpOwotICAgICAgICAgICAgICAgIC8vIEFueSBzY3JvbGxlciBjYW4gYmUgdXNlZCBmb3IgdGltZSwgc2luY2UgdGhleSB3ZXJlIHN0YXJ0ZWQKLSAgICAgICAgICAgICAgICAvLyB0b2dldGhlciBpbiBzY3JvbGwgbW9kZS4gV2UgdXNlIFggaGVyZS4KLSAgICAgICAgICAgICAgICBmaW5hbCBsb25nIGVsYXBzZWRUaW1lID0gdGltZSAtIG1TY3JvbGxlclgubVN0YXJ0VGltZTsKLQotICAgICAgICAgICAgICAgIGZpbmFsIGludCBkdXJhdGlvbiA9IG1TY3JvbGxlclgubUR1cmF0aW9uOwotICAgICAgICAgICAgICAgIGlmIChlbGFwc2VkVGltZSA8IGR1cmF0aW9uKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZsb2F0IHEgPSAoZmxvYXQpIChlbGFwc2VkVGltZSkgLyBkdXJhdGlvbjsKLQotICAgICAgICAgICAgICAgICAgICBpZiAobUludGVycG9sYXRvciA9PSBudWxsKQotICAgICAgICAgICAgICAgICAgICAgICAgcSA9IFNjcm9sbGVyLnZpc2NvdXNGbHVpZChxKTsKLSAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgcSA9IG1JbnRlcnBvbGF0b3IuZ2V0SW50ZXJwb2xhdGlvbihxKTsKLQotICAgICAgICAgICAgICAgICAgICBtU2Nyb2xsZXJYLnVwZGF0ZVNjcm9sbChxKTsKLSAgICAgICAgICAgICAgICAgICAgbVNjcm9sbGVyWS51cGRhdGVTY3JvbGwocSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgYWJvcnRBbmltYXRpb24oKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgRkxJTkdfTU9ERToKLSAgICAgICAgICAgICAgICBpZiAoIW1TY3JvbGxlclgubUZpbmlzaGVkKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICghbVNjcm9sbGVyWC51cGRhdGUoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFtU2Nyb2xsZXJYLmNvbnRpbnVlV2hlbkZpbmlzaGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtU2Nyb2xsZXJYLmZpbmlzaCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKCFtU2Nyb2xsZXJZLm1GaW5pc2hlZCkgewotICAgICAgICAgICAgICAgICAgICBpZiAoIW1TY3JvbGxlclkudXBkYXRlKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICghbVNjcm9sbGVyWS5jb250aW51ZVdoZW5GaW5pc2hlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbVNjcm9sbGVyWS5maW5pc2goKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU3RhcnQgc2Nyb2xsaW5nIGJ5IHByb3ZpZGluZyBhIHN0YXJ0aW5nIHBvaW50IGFuZCB0aGUgZGlzdGFuY2UgdG8gdHJhdmVsLgotICAgICAqIFRoZSBzY3JvbGwgd2lsbCB1c2UgdGhlIGRlZmF1bHQgdmFsdWUgb2YgMjUwIG1pbGxpc2Vjb25kcyBmb3IgdGhlCi0gICAgICogZHVyYXRpb24uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gc3RhcnRYIFN0YXJ0aW5nIGhvcml6b250YWwgc2Nyb2xsIG9mZnNldCBpbiBwaXhlbHMuIFBvc2l0aXZlCi0gICAgICogICAgICAgIG51bWJlcnMgd2lsbCBzY3JvbGwgdGhlIGNvbnRlbnQgdG8gdGhlIGxlZnQuCi0gICAgICogQHBhcmFtIHN0YXJ0WSBTdGFydGluZyB2ZXJ0aWNhbCBzY3JvbGwgb2Zmc2V0IGluIHBpeGVscy4gUG9zaXRpdmUgbnVtYmVycwotICAgICAqICAgICAgICB3aWxsIHNjcm9sbCB0aGUgY29udGVudCB1cC4KLSAgICAgKiBAcGFyYW0gZHggSG9yaXpvbnRhbCBkaXN0YW5jZSB0byB0cmF2ZWwuIFBvc2l0aXZlIG51bWJlcnMgd2lsbCBzY3JvbGwgdGhlCi0gICAgICogICAgICAgIGNvbnRlbnQgdG8gdGhlIGxlZnQuCi0gICAgICogQHBhcmFtIGR5IFZlcnRpY2FsIGRpc3RhbmNlIHRvIHRyYXZlbC4gUG9zaXRpdmUgbnVtYmVycyB3aWxsIHNjcm9sbCB0aGUKLSAgICAgKiAgICAgICAgY29udGVudCB1cC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzdGFydFNjcm9sbChpbnQgc3RhcnRYLCBpbnQgc3RhcnRZLCBpbnQgZHgsIGludCBkeSkgewotICAgICAgICBzdGFydFNjcm9sbChzdGFydFgsIHN0YXJ0WSwgZHgsIGR5LCBERUZBVUxUX0RVUkFUSU9OKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTdGFydCBzY3JvbGxpbmcgYnkgcHJvdmlkaW5nIGEgc3RhcnRpbmcgcG9pbnQgYW5kIHRoZSBkaXN0YW5jZSB0byB0cmF2ZWwuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gc3RhcnRYIFN0YXJ0aW5nIGhvcml6b250YWwgc2Nyb2xsIG9mZnNldCBpbiBwaXhlbHMuIFBvc2l0aXZlCi0gICAgICogICAgICAgIG51bWJlcnMgd2lsbCBzY3JvbGwgdGhlIGNvbnRlbnQgdG8gdGhlIGxlZnQuCi0gICAgICogQHBhcmFtIHN0YXJ0WSBTdGFydGluZyB2ZXJ0aWNhbCBzY3JvbGwgb2Zmc2V0IGluIHBpeGVscy4gUG9zaXRpdmUgbnVtYmVycwotICAgICAqICAgICAgICB3aWxsIHNjcm9sbCB0aGUgY29udGVudCB1cC4KLSAgICAgKiBAcGFyYW0gZHggSG9yaXpvbnRhbCBkaXN0YW5jZSB0byB0cmF2ZWwuIFBvc2l0aXZlIG51bWJlcnMgd2lsbCBzY3JvbGwgdGhlCi0gICAgICogICAgICAgIGNvbnRlbnQgdG8gdGhlIGxlZnQuCi0gICAgICogQHBhcmFtIGR5IFZlcnRpY2FsIGRpc3RhbmNlIHRvIHRyYXZlbC4gUG9zaXRpdmUgbnVtYmVycyB3aWxsIHNjcm9sbCB0aGUKLSAgICAgKiAgICAgICAgY29udGVudCB1cC4KLSAgICAgKiBAcGFyYW0gZHVyYXRpb24gRHVyYXRpb24gb2YgdGhlIHNjcm9sbCBpbiBtaWxsaXNlY29uZHMuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc3RhcnRTY3JvbGwoaW50IHN0YXJ0WCwgaW50IHN0YXJ0WSwgaW50IGR4LCBpbnQgZHksIGludCBkdXJhdGlvbikgewotICAgICAgICBtTW9kZSA9IFNDUk9MTF9NT0RFOwotICAgICAgICBtU2Nyb2xsZXJYLnN0YXJ0U2Nyb2xsKHN0YXJ0WCwgZHgsIGR1cmF0aW9uKTsKLSAgICAgICAgbVNjcm9sbGVyWS5zdGFydFNjcm9sbChzdGFydFksIGR5LCBkdXJhdGlvbik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2FsbCB0aGlzIHdoZW4geW91IHdhbnQgdG8gJ3NwcmluZyBiYWNrJyBpbnRvIGEgdmFsaWQgY29vcmRpbmF0ZSByYW5nZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBzdGFydFggU3RhcnRpbmcgWCBjb29yZGluYXRlCi0gICAgICogQHBhcmFtIHN0YXJ0WSBTdGFydGluZyBZIGNvb3JkaW5hdGUKLSAgICAgKiBAcGFyYW0gbWluWCBNaW5pbXVtIHZhbGlkIFggdmFsdWUKLSAgICAgKiBAcGFyYW0gbWF4WCBNYXhpbXVtIHZhbGlkIFggdmFsdWUKLSAgICAgKiBAcGFyYW0gbWluWSBNaW5pbXVtIHZhbGlkIFkgdmFsdWUKLSAgICAgKiBAcGFyYW0gbWF4WSBNaW5pbXVtIHZhbGlkIFkgdmFsdWUKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgYSBzcHJpbmdiYWNrIHdhcyBpbml0aWF0ZWQsIGZhbHNlIGlmIHN0YXJ0WCBhbmQgc3RhcnRZIHdlcmUKLSAgICAgKiAgICAgICAgICBhbHJlYWR5IHdpdGhpbiB0aGUgdmFsaWQgcmFuZ2UuCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gc3ByaW5nYmFjayhpbnQgc3RhcnRYLCBpbnQgc3RhcnRZLCBpbnQgbWluWCwgaW50IG1heFgsIGludCBtaW5ZLCBpbnQgbWF4WSkgewotICAgICAgICBtTW9kZSA9IEZMSU5HX01PREU7Ci0KLSAgICAgICAgLy8gTWFrZSBzdXJlIGJvdGggbWV0aG9kcyBhcmUgY2FsbGVkLgotICAgICAgICBmaW5hbCBib29sZWFuIHNwaW5nYmFja1ggPSBtU2Nyb2xsZXJYLnNwcmluZ2JhY2soc3RhcnRYLCBtaW5YLCBtYXhYKTsKLSAgICAgICAgZmluYWwgYm9vbGVhbiBzcGluZ2JhY2tZID0gbVNjcm9sbGVyWS5zcHJpbmdiYWNrKHN0YXJ0WSwgbWluWSwgbWF4WSk7Ci0gICAgICAgIHJldHVybiBzcGluZ2JhY2tYIHx8IHNwaW5nYmFja1k7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZmxpbmcoaW50IHN0YXJ0WCwgaW50IHN0YXJ0WSwgaW50IHZlbG9jaXR5WCwgaW50IHZlbG9jaXR5WSwKLSAgICAgICAgICAgIGludCBtaW5YLCBpbnQgbWF4WCwgaW50IG1pblksIGludCBtYXhZKSB7Ci0gICAgICAgIGZsaW5nKHN0YXJ0WCwgc3RhcnRZLCB2ZWxvY2l0eVgsIHZlbG9jaXR5WSwgbWluWCwgbWF4WCwgbWluWSwgbWF4WSwgMCwgMCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU3RhcnQgc2Nyb2xsaW5nIGJhc2VkIG9uIGEgZmxpbmcgZ2VzdHVyZS4gVGhlIGRpc3RhbmNlIHRyYXZlbGVkIHdpbGwKLSAgICAgKiBkZXBlbmQgb24gdGhlIGluaXRpYWwgdmVsb2NpdHkgb2YgdGhlIGZsaW5nLgotICAgICAqCi0gICAgICogQHBhcmFtIHN0YXJ0WCBTdGFydGluZyBwb2ludCBvZiB0aGUgc2Nyb2xsIChYKQotICAgICAqIEBwYXJhbSBzdGFydFkgU3RhcnRpbmcgcG9pbnQgb2YgdGhlIHNjcm9sbCAoWSkKLSAgICAgKiBAcGFyYW0gdmVsb2NpdHlYIEluaXRpYWwgdmVsb2NpdHkgb2YgdGhlIGZsaW5nIChYKSBtZWFzdXJlZCBpbiBwaXhlbHMgcGVyCi0gICAgICogICAgICAgICAgICBzZWNvbmQuCi0gICAgICogQHBhcmFtIHZlbG9jaXR5WSBJbml0aWFsIHZlbG9jaXR5IG9mIHRoZSBmbGluZyAoWSkgbWVhc3VyZWQgaW4gcGl4ZWxzIHBlcgotICAgICAqICAgICAgICAgICAgc2Vjb25kCi0gICAgICogQHBhcmFtIG1pblggTWluaW11bSBYIHZhbHVlLiBUaGUgc2Nyb2xsZXIgd2lsbCBub3Qgc2Nyb2xsIHBhc3QgdGhpcyBwb2ludAotICAgICAqICAgICAgICAgICAgdW5sZXNzIG92ZXJYID4gMC4gSWYgb3ZlcmZsaW5nIGlzIGFsbG93ZWQsIGl0IHdpbGwgdXNlIG1pblggYXMKLSAgICAgKiAgICAgICAgICAgIGEgc3ByaW5nYmFjayBib3VuZGFyeS4KLSAgICAgKiBAcGFyYW0gbWF4WCBNYXhpbXVtIFggdmFsdWUuIFRoZSBzY3JvbGxlciB3aWxsIG5vdCBzY3JvbGwgcGFzdCB0aGlzIHBvaW50Ci0gICAgICogICAgICAgICAgICB1bmxlc3Mgb3ZlclggPiAwLiBJZiBvdmVyZmxpbmcgaXMgYWxsb3dlZCwgaXQgd2lsbCB1c2UgbWF4WCBhcwotICAgICAqICAgICAgICAgICAgYSBzcHJpbmdiYWNrIGJvdW5kYXJ5LgotICAgICAqIEBwYXJhbSBtaW5ZIE1pbmltdW0gWSB2YWx1ZS4gVGhlIHNjcm9sbGVyIHdpbGwgbm90IHNjcm9sbCBwYXN0IHRoaXMgcG9pbnQKLSAgICAgKiAgICAgICAgICAgIHVubGVzcyBvdmVyWSA+IDAuIElmIG92ZXJmbGluZyBpcyBhbGxvd2VkLCBpdCB3aWxsIHVzZSBtaW5ZIGFzCi0gICAgICogICAgICAgICAgICBhIHNwcmluZ2JhY2sgYm91bmRhcnkuCi0gICAgICogQHBhcmFtIG1heFkgTWF4aW11bSBZIHZhbHVlLiBUaGUgc2Nyb2xsZXIgd2lsbCBub3Qgc2Nyb2xsIHBhc3QgdGhpcyBwb2ludAotICAgICAqICAgICAgICAgICAgdW5sZXNzIG92ZXJZID4gMC4gSWYgb3ZlcmZsaW5nIGlzIGFsbG93ZWQsIGl0IHdpbGwgdXNlIG1heFkgYXMKLSAgICAgKiAgICAgICAgICAgIGEgc3ByaW5nYmFjayBib3VuZGFyeS4KLSAgICAgKiBAcGFyYW0gb3ZlclggT3ZlcmZsaW5nIHJhbmdlLiBJZiA+IDAsIGhvcml6b250YWwgb3ZlcmZsaW5nIGluIGVpdGhlcgotICAgICAqICAgICAgICAgICAgZGlyZWN0aW9uIHdpbGwgYmUgcG9zc2libGUuCi0gICAgICogQHBhcmFtIG92ZXJZIE92ZXJmbGluZyByYW5nZS4gSWYgPiAwLCB2ZXJ0aWNhbCBvdmVyZmxpbmcgaW4gZWl0aGVyCi0gICAgICogICAgICAgICAgICBkaXJlY3Rpb24gd2lsbCBiZSBwb3NzaWJsZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBmbGluZyhpbnQgc3RhcnRYLCBpbnQgc3RhcnRZLCBpbnQgdmVsb2NpdHlYLCBpbnQgdmVsb2NpdHlZLAotICAgICAgICAgICAgaW50IG1pblgsIGludCBtYXhYLCBpbnQgbWluWSwgaW50IG1heFksIGludCBvdmVyWCwgaW50IG92ZXJZKSB7Ci0gICAgICAgIG1Nb2RlID0gRkxJTkdfTU9ERTsKLSAgICAgICAgbVNjcm9sbGVyWC5mbGluZyhzdGFydFgsIHZlbG9jaXR5WCwgbWluWCwgbWF4WCwgb3ZlclgpOwotICAgICAgICBtU2Nyb2xsZXJZLmZsaW5nKHN0YXJ0WSwgdmVsb2NpdHlZLCBtaW5ZLCBtYXhZLCBvdmVyWSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogTm90aWZ5IHRoZSBzY3JvbGxlciB0aGF0IHdlJ3ZlIHJlYWNoZWQgYSBob3Jpem9udGFsIGJvdW5kYXJ5LgotICAgICAqIE5vcm1hbGx5IHRoZSBpbmZvcm1hdGlvbiB0byBoYW5kbGUgdGhpcyB3aWxsIGFscmVhZHkgYmUga25vd24KLSAgICAgKiB3aGVuIHRoZSBhbmltYXRpb24gaXMgc3RhcnRlZCwgc3VjaCBhcyBpbiBhIGNhbGwgdG8gb25lIG9mIHRoZQotICAgICAqIGZsaW5nIGZ1bmN0aW9ucy4gSG93ZXZlciB0aGVyZSBhcmUgY2FzZXMgd2hlcmUgdGhpcyBjYW5ub3QgYmUga25vd24KLSAgICAgKiBpbiBhZHZhbmNlLiBUaGlzIGZ1bmN0aW9uIHdpbGwgdHJhbnNpdGlvbiB0aGUgY3VycmVudCBtb3Rpb24gYW5kCi0gICAgICogYW5pbWF0ZSBmcm9tIHN0YXJ0WCB0byBmaW5hbFggYXMgYXBwcm9wcmlhdGUuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gc3RhcnRYIFN0YXJ0aW5nL2N1cnJlbnQgWCBwb3NpdGlvbgotICAgICAqIEBwYXJhbSBmaW5hbFggRGVzaXJlZCBmaW5hbCBYIHBvc2l0aW9uCi0gICAgICogQHBhcmFtIG92ZXJYIE1hZ25pdHVkZSBvZiBvdmVyc2Nyb2xsIGFsbG93ZWQuIFRoaXMgc2hvdWxkIGJlIHRoZSBtYXhpbXVtCi0gICAgICogICAgICAgICAgICAgIGRlc2lyZWQgZGlzdGFuY2UgZnJvbSBmaW5hbFguIEFic29sdXRlIHZhbHVlIC0gbXVzdCBiZSBwb3NpdGl2ZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBub3RpZnlIb3Jpem9udGFsRWRnZVJlYWNoZWQoaW50IHN0YXJ0WCwgaW50IGZpbmFsWCwgaW50IG92ZXJYKSB7Ci0gICAgICAgIG1TY3JvbGxlclgubm90aWZ5RWRnZVJlYWNoZWQoc3RhcnRYLCBmaW5hbFgsIG92ZXJYKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBOb3RpZnkgdGhlIHNjcm9sbGVyIHRoYXQgd2UndmUgcmVhY2hlZCBhIHZlcnRpY2FsIGJvdW5kYXJ5LgotICAgICAqIE5vcm1hbGx5IHRoZSBpbmZvcm1hdGlvbiB0byBoYW5kbGUgdGhpcyB3aWxsIGFscmVhZHkgYmUga25vd24KLSAgICAgKiB3aGVuIHRoZSBhbmltYXRpb24gaXMgc3RhcnRlZCwgc3VjaCBhcyBpbiBhIGNhbGwgdG8gb25lIG9mIHRoZQotICAgICAqIGZsaW5nIGZ1bmN0aW9ucy4gSG93ZXZlciB0aGVyZSBhcmUgY2FzZXMgd2hlcmUgdGhpcyBjYW5ub3QgYmUga25vd24KLSAgICAgKiBpbiBhZHZhbmNlLiBUaGlzIGZ1bmN0aW9uIHdpbGwgYW5pbWF0ZSBhIHBhcmFib2xpYyBtb3Rpb24gZnJvbQotICAgICAqIHN0YXJ0WSB0byBmaW5hbFkuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gc3RhcnRZIFN0YXJ0aW5nL2N1cnJlbnQgWSBwb3NpdGlvbgotICAgICAqIEBwYXJhbSBmaW5hbFkgRGVzaXJlZCBmaW5hbCBZIHBvc2l0aW9uCi0gICAgICogQHBhcmFtIG92ZXJZIE1hZ25pdHVkZSBvZiBvdmVyc2Nyb2xsIGFsbG93ZWQuIFRoaXMgc2hvdWxkIGJlIHRoZSBtYXhpbXVtCi0gICAgICogICAgICAgICAgICAgIGRlc2lyZWQgZGlzdGFuY2UgZnJvbSBmaW5hbFkuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgbm90aWZ5VmVydGljYWxFZGdlUmVhY2hlZChpbnQgc3RhcnRZLCBpbnQgZmluYWxZLCBpbnQgb3ZlclkpIHsKLSAgICAgICAgbVNjcm9sbGVyWS5ub3RpZnlFZGdlUmVhY2hlZChzdGFydFksIGZpbmFsWSwgb3ZlclkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgd2hldGhlciB0aGUgY3VycmVudCBTY3JvbGxlciBpcyBjdXJyZW50bHkgcmV0dXJuaW5nIHRvIGEgdmFsaWQgcG9zaXRpb24uCi0gICAgICogVmFsaWQgYm91bmRzIHdlcmUgcHJvdmlkZWQgYnkgdGhlCi0gICAgICoge0BsaW5rICNmbGluZyhpbnQsIGludCwgaW50LCBpbnQsIGludCwgaW50LCBpbnQsIGludCwgaW50LCBpbnQpfSBtZXRob2QuCi0gICAgICoKLSAgICAgKiBPbmUgc2hvdWxkIGNoZWNrIHRoaXMgdmFsdWUgYmVmb3JlIGNhbGxpbmcKLSAgICAgKiB7QGxpbmsgI3N0YXJ0U2Nyb2xsKGludCwgaW50LCBpbnQsIGludCl9IGFzIHRoZSBpbnRlcnBvbGF0aW9uIGN1cnJlbnRseSBpbiBwcm9ncmVzcwotICAgICAqIHRvIHJlc3RvcmUgYSB2YWxpZCBwb3NpdGlvbiB3aWxsIHRoZW4gYmUgc3RvcHBlZC4gVGhlIGNhbGxlciBoYXMgdG8gdGFrZSBpbnRvIGFjY291bnQKLSAgICAgKiB0aGUgZmFjdCB0aGF0IHRoZSBzdGFydGVkIHNjcm9sbCB3aWxsIHN0YXJ0IGZyb20gYW4gb3ZlcnNjcm9sbGVkIHBvc2l0aW9uLgotICAgICAqCi0gICAgICogQHJldHVybiB0cnVlIHdoZW4gdGhlIGN1cnJlbnQgcG9zaXRpb24gaXMgb3ZlcnNjcm9sbGVkIGFuZCBpbiB0aGUgcHJvY2VzcyBvZgotICAgICAqICAgICAgICAgaW50ZXJwb2xhdGluZyBiYWNrIHRvIGEgdmFsaWQgdmFsdWUuCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNPdmVyc2Nyb2xsZWQoKSB7Ci0gICAgICAgIHJldHVybiAoKCFtU2Nyb2xsZXJYLm1GaW5pc2hlZCAmJgotICAgICAgICAgICAgICAgIG1TY3JvbGxlclgubVN0YXRlICE9IE1hZ25ldGljT3ZlclNjcm9sbGVyLlRPX0VER0UpIHx8Ci0gICAgICAgICAgICAgICAgKCFtU2Nyb2xsZXJZLm1GaW5pc2hlZCAmJgotICAgICAgICAgICAgICAgICAgICAgICAgbVNjcm9sbGVyWS5tU3RhdGUgIT0gTWFnbmV0aWNPdmVyU2Nyb2xsZXIuVE9fRURHRSkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFN0b3BzIHRoZSBhbmltYXRpb24uIENvbnRyYXJ5IHRvIHtAbGluayAjZm9yY2VGaW5pc2hlZChib29sZWFuKX0sCi0gICAgICogYWJvcnRpbmcgdGhlIGFuaW1hdGluZyBjYXVzZXMgdGhlIHNjcm9sbGVyIHRvIG1vdmUgdG8gdGhlIGZpbmFsIHggYW5kIHkKLSAgICAgKiBwb3NpdGlvbnMuCi0gICAgICoKLSAgICAgKiBAc2VlICNmb3JjZUZpbmlzaGVkKGJvb2xlYW4pCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgYWJvcnRBbmltYXRpb24oKSB7Ci0gICAgICAgIG1TY3JvbGxlclguZmluaXNoKCk7Ci0gICAgICAgIG1TY3JvbGxlclkuZmluaXNoKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgdGltZSBlbGFwc2VkIHNpbmNlIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHNjcm9sbGluZy4KLSAgICAgKgotICAgICAqIEByZXR1cm4gVGhlIGVsYXBzZWQgdGltZSBpbiBtaWxsaXNlY29uZHMuCi0gICAgICoKLSAgICAgKiBAaGlkZQotICAgICAqLwotICAgIHB1YmxpYyBpbnQgdGltZVBhc3NlZCgpIHsKLSAgICAgICAgZmluYWwgbG9uZyB0aW1lID0gQW5pbWF0aW9uVXRpbHMuY3VycmVudEFuaW1hdGlvblRpbWVNaWxsaXMoKTsKLSAgICAgICAgZmluYWwgbG9uZyBzdGFydFRpbWUgPSBNYXRoLm1pbihtU2Nyb2xsZXJYLm1TdGFydFRpbWUsIG1TY3JvbGxlclkubVN0YXJ0VGltZSk7Ci0gICAgICAgIHJldHVybiAoaW50KSAodGltZSAtIHN0YXJ0VGltZSk7Ci0gICAgfQotCi0gICAgc3RhdGljIGNsYXNzIE1hZ25ldGljT3ZlclNjcm9sbGVyIHsKLSAgICAgICAgLy8gSW5pdGlhbCBwb3NpdGlvbgotICAgICAgICBpbnQgbVN0YXJ0OwotCi0gICAgICAgIC8vIEN1cnJlbnQgcG9zaXRpb24KLSAgICAgICAgaW50IG1DdXJyZW50UG9zaXRpb247Ci0KLSAgICAgICAgLy8gRmluYWwgcG9zaXRpb24KLSAgICAgICAgaW50IG1GaW5hbDsKLQotICAgICAgICAvLyBJbml0aWFsIHZlbG9jaXR5Ci0gICAgICAgIGludCBtVmVsb2NpdHk7Ci0KLSAgICAgICAgLy8gQ3VycmVudCB2ZWxvY2l0eQotICAgICAgICBmbG9hdCBtQ3VyclZlbG9jaXR5OwotCi0gICAgICAgIC8vIENvbnN0YW50IGN1cnJlbnQgZGVjZWxlcmF0aW9uCi0gICAgICAgIGZsb2F0IG1EZWNlbGVyYXRpb247Ci0KLSAgICAgICAgLy8gQW5pbWF0aW9uIHN0YXJ0aW5nIHRpbWUsIGluIHN5c3RlbSBtaWxsaXNlY29uZHMKLSAgICAgICAgbG9uZyBtU3RhcnRUaW1lOwotCi0gICAgICAgIC8vIEFuaW1hdGlvbiBkdXJhdGlvbiwgaW4gbWlsbGlzZWNvbmRzCi0gICAgICAgIGludCBtRHVyYXRpb247Ci0KLSAgICAgICAgLy8gV2hldGhlciB0aGUgYW5pbWF0aW9uIGlzIGN1cnJlbnRseSBpbiBwcm9ncmVzcwotICAgICAgICBib29sZWFuIG1GaW5pc2hlZDsKLQotICAgICAgICAvLyBDb25zdGFudCBncmF2aXR5IHZhbHVlLCB1c2VkIHRvIHNjYWxlIGRlY2VsZXJhdGlvbgotICAgICAgICBzdGF0aWMgZmxvYXQgR1JBVklUWTsKLQotICAgICAgICBzdGF0aWMgdm9pZCBpbml0aWFsaXplRnJvbUNvbnRleHQoQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgICAgICBmaW5hbCBmbG9hdCBwcGkgPSBjb250ZXh0LmdldFJlc291cmNlcygpLmdldERpc3BsYXlNZXRyaWNzKCkuZGVuc2l0eSAqIDE2MC4wZjsKLSAgICAgICAgICAgIEdSQVZJVFkgPSBTZW5zb3JNYW5hZ2VyLkdSQVZJVFlfRUFSVEggLy8gZyAobS9zXjIpCi0gICAgICAgICAgICAgICAgICAgICogMzkuMzdmIC8vIGluY2gvbWV0ZXIKLSAgICAgICAgICAgICAgICAgICAgKiBwcGkgLy8gcGl4ZWxzIHBlciBpbmNoCi0gICAgICAgICAgICAgICAgICAgICogVmlld0NvbmZpZ3VyYXRpb24uZ2V0U2Nyb2xsRnJpY3Rpb24oKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBUT19FREdFID0gMDsKLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFRPX0JPVU5EQVJZID0gMTsKLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFRPX0JPVU5DRSA9IDI7Ci0KLSAgICAgICAgcHJpdmF0ZSBpbnQgbVN0YXRlID0gVE9fRURHRTsKLQotICAgICAgICAvLyBUaGUgYWxsb3dlZCBvdmVyc2hvdCBkaXN0YW5jZSBiZWZvcmUgYm91bmRhcnkgaXMgcmVhY2hlZC4KLSAgICAgICAgcHJpdmF0ZSBpbnQgbU92ZXI7Ci0KLSAgICAgICAgLy8gRHVyYXRpb24gaW4gbWlsbGlzZWNvbmRzIHRvIGdvIGJhY2sgZnJvbSBlZGdlIHRvIGVkZ2UuIFNwcmluZ2JhY2sgaXMgaGFsZiBvZiBpdC4KLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE9WRVJTQ1JPTExfU1BSSU5HQkFDS19EVVJBVElPTiA9IDIwMDsKLQotICAgICAgICAvLyBPc2NpbGxhdGlvbiBwZXJpb2QKLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgZmxvYXQgVElNRV9DT0VGID0KLSAgICAgICAgICAgIDEwMDAuMGYgKiAoZmxvYXQpIE1hdGguUEkgLyBPVkVSU0NST0xMX1NQUklOR0JBQ0tfRFVSQVRJT047Ci0KLSAgICAgICAgLy8gSWYgdGhlIHZlbG9jaXR5IGlzIHNtYWxsZXIgdGhhbiB0aGlzIHZhbHVlLCBubyBib3VuY2UgaXMgdHJpZ2dlcmVkCi0gICAgICAgIC8vIHdoZW4gdGhlIGVkZ2UgbGltaXRzIGFyZSByZWFjaGVkICh3b3VsZCByZXN1bHQgaW4gYSB6ZXJvIHBpeGVscwotICAgICAgICAvLyBkaXNwbGFjZW1lbnQgYW55d2F5KS4KLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgZmxvYXQgTUlOSU1VTV9WRUxPQ0lUWV9GT1JfQk9VTkNFID0gRmxvYXQuTUFYX1ZBTFVFOy8vMTQwLjBmOwotCi0gICAgICAgIC8vIFByb3BvcnRpb24gb2YgdGhlIHZlbG9jaXR5IHRoYXQgaXMgcHJlc2VydmVkIHdoZW4gdGhlIGVkZ2UgaXMgcmVhY2hlZC4KLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgZmxvYXQgREVGQVVMVF9CT1VOQ0VfQ09FRkZJQ0lFTlQgPSAwLjE2ZjsKLQotICAgICAgICBwcml2YXRlIGZsb2F0IG1Cb3VuY2VDb2VmZmljaWVudCA9IERFRkFVTFRfQk9VTkNFX0NPRUZGSUNJRU5UOwotCi0gICAgICAgIE1hZ25ldGljT3ZlclNjcm9sbGVyKCkgewotICAgICAgICAgICAgbUZpbmlzaGVkID0gdHJ1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIHZvaWQgdXBkYXRlU2Nyb2xsKGZsb2F0IHEpIHsKLSAgICAgICAgICAgIG1DdXJyZW50UG9zaXRpb24gPSBtU3RhcnQgKyBNYXRoLnJvdW5kKHEgKiAobUZpbmFsIC0gbVN0YXJ0KSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvKgotICAgICAgICAgKiBHZXQgYSBzaWduZWQgZGVjZWxlcmF0aW9uIHRoYXQgd2lsbCByZWR1Y2UgdGhlIHZlbG9jaXR5LgotICAgICAgICAgKi8KLSAgICAgICAgc3RhdGljIGZsb2F0IGdldERlY2VsZXJhdGlvbihpbnQgdmVsb2NpdHkpIHsKLSAgICAgICAgICAgIHJldHVybiB2ZWxvY2l0eSA+IDAgPyAtR1JBVklUWSA6IEdSQVZJVFk7Ci0gICAgICAgIH0KLQotICAgICAgICAvKgotICAgICAgICAgKiBSZXR1cm5zIHRoZSB0aW1lIChpbiBtaWxsaXNlY29uZHMpIGl0IHdpbGwgdGFrZSB0byBnbyBmcm9tIHN0YXJ0IHRvIGVuZC4KLSAgICAgICAgICovCi0gICAgICAgIHN0YXRpYyBpbnQgY29tcHV0ZUR1cmF0aW9uKGludCBzdGFydCwgaW50IGVuZCwgZmxvYXQgaW5pdGlhbFZlbG9jaXR5LCBmbG9hdCBkZWNlbGVyYXRpb24pIHsKLSAgICAgICAgICAgIGZpbmFsIGludCBkaXN0YW5jZSA9IHN0YXJ0IC0gZW5kOwotICAgICAgICAgICAgZmluYWwgZmxvYXQgZGlzY3JpbWluYW50ID0gaW5pdGlhbFZlbG9jaXR5ICogaW5pdGlhbFZlbG9jaXR5IC0gMi4wZiAqIGRlY2VsZXJhdGlvbgotICAgICAgICAgICAgICAgICAgICAqIGRpc3RhbmNlOwotICAgICAgICAgICAgaWYgKGRpc2NyaW1pbmFudCA+PSAwLjBmKSB7Ci0gICAgICAgICAgICAgICAgZmxvYXQgZGVsdGEgPSAoZmxvYXQpIE1hdGguc3FydChkaXNjcmltaW5hbnQpOwotICAgICAgICAgICAgICAgIGlmIChkZWNlbGVyYXRpb24gPCAwLjBmKSB7Ci0gICAgICAgICAgICAgICAgICAgIGRlbHRhID0gLWRlbHRhOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gKGludCkgKDEwMDAuMGYgKiAoLWluaXRpYWxWZWxvY2l0eSAtIGRlbHRhKSAvIGRlY2VsZXJhdGlvbik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIEVuZCBwb3NpdGlvbiBjYW4gbm90IGJlIHJlYWNoZWQKLSAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICB9Ci0KLSAgICAgICAgdm9pZCBzdGFydFNjcm9sbChpbnQgc3RhcnQsIGludCBkaXN0YW5jZSwgaW50IGR1cmF0aW9uKSB7Ci0gICAgICAgICAgICBtRmluaXNoZWQgPSBmYWxzZTsKLQotICAgICAgICAgICAgbVN0YXJ0ID0gc3RhcnQ7Ci0gICAgICAgICAgICBtRmluYWwgPSBzdGFydCArIGRpc3RhbmNlOwotCi0gICAgICAgICAgICBtU3RhcnRUaW1lID0gQW5pbWF0aW9uVXRpbHMuY3VycmVudEFuaW1hdGlvblRpbWVNaWxsaXMoKTsKLSAgICAgICAgICAgIG1EdXJhdGlvbiA9IGR1cmF0aW9uOwotCi0gICAgICAgICAgICAvLyBVbnVzZWQKLSAgICAgICAgICAgIG1EZWNlbGVyYXRpb24gPSAwLjBmOwotICAgICAgICAgICAgbVZlbG9jaXR5ID0gMDsKLSAgICAgICAgfQotCi0gICAgICAgIHZvaWQgZmxpbmcoaW50IHN0YXJ0LCBpbnQgdmVsb2NpdHksIGludCBtaW4sIGludCBtYXgpIHsKLSAgICAgICAgICAgIG1GaW5pc2hlZCA9IGZhbHNlOwotCi0gICAgICAgICAgICBtU3RhcnQgPSBzdGFydDsKLSAgICAgICAgICAgIG1TdGFydFRpbWUgPSBBbmltYXRpb25VdGlscy5jdXJyZW50QW5pbWF0aW9uVGltZU1pbGxpcygpOwotCi0gICAgICAgICAgICBtVmVsb2NpdHkgPSB2ZWxvY2l0eTsKLQotICAgICAgICAgICAgbURlY2VsZXJhdGlvbiA9IGdldERlY2VsZXJhdGlvbih2ZWxvY2l0eSk7Ci0KLSAgICAgICAgICAgIC8vIEEgc3RhcnQgZnJvbSBhbiBpbnZhbGlkIHBvc2l0aW9uIGltbWVkaWF0ZWx5IGJyaW5ncyBiYWNrIHRvIGEgdmFsaWQgcG9zaXRpb24KLSAgICAgICAgICAgIGlmIChtU3RhcnQgPCBtaW4pIHsKLSAgICAgICAgICAgICAgICBtRHVyYXRpb24gPSAwOwotICAgICAgICAgICAgICAgIG1GaW5hbCA9IG1pbjsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChtU3RhcnQgPiBtYXgpIHsKLSAgICAgICAgICAgICAgICBtRHVyYXRpb24gPSAwOwotICAgICAgICAgICAgICAgIG1GaW5hbCA9IG1heDsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIER1cmF0aW9uIGFyZSBleHByZXNzZWQgaW4gbWlsbGlzZWNvbmRzCi0gICAgICAgICAgICBtRHVyYXRpb24gPSAoaW50KSAoLTEwMDAuMGYgKiB2ZWxvY2l0eSAvIG1EZWNlbGVyYXRpb24pOwotCi0gICAgICAgICAgICBtRmluYWwgPSBzdGFydCAtIE1hdGgucm91bmQoKHZlbG9jaXR5ICogdmVsb2NpdHkpIC8gKDIuMGYgKiBtRGVjZWxlcmF0aW9uKSk7Ci0KLSAgICAgICAgICAgIC8vIENsYW1wIHRvIGEgdmFsaWQgZmluYWwgcG9zaXRpb24KLSAgICAgICAgICAgIGlmIChtRmluYWwgPCBtaW4pIHsKLSAgICAgICAgICAgICAgICBtRmluYWwgPSBtaW47Ci0gICAgICAgICAgICAgICAgbUR1cmF0aW9uID0gY29tcHV0ZUR1cmF0aW9uKG1TdGFydCwgbWluLCBtVmVsb2NpdHksIG1EZWNlbGVyYXRpb24pOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAobUZpbmFsID4gbWF4KSB7Ci0gICAgICAgICAgICAgICAgbUZpbmFsID0gbWF4OwotICAgICAgICAgICAgICAgIG1EdXJhdGlvbiA9IGNvbXB1dGVEdXJhdGlvbihtU3RhcnQsIG1heCwgbVZlbG9jaXR5LCBtRGVjZWxlcmF0aW9uKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHZvaWQgZmluaXNoKCkgewotICAgICAgICAgICAgbUN1cnJlbnRQb3NpdGlvbiA9IG1GaW5hbDsKLSAgICAgICAgICAgIC8vIE5vdCByZXNldCBzaW5jZSBXZWJWaWV3IHJlbGllcyBvbiB0aGlzIHZhbHVlIGZvciBmYXN0IGZsaW5nLgotICAgICAgICAgICAgLy8gbUN1cnJWZWxvY2l0eSA9IDAuMGY7Ci0gICAgICAgICAgICBtRmluaXNoZWQgPSB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgdm9pZCBzZXRGaW5hbFBvc2l0aW9uKGludCBwb3NpdGlvbikgewotICAgICAgICAgICAgbUZpbmFsID0gcG9zaXRpb247Ci0gICAgICAgICAgICBtRmluaXNoZWQgPSBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIHZvaWQgZXh0ZW5kRHVyYXRpb24oaW50IGV4dGVuZCkgewotICAgICAgICAgICAgZmluYWwgbG9uZyB0aW1lID0gQW5pbWF0aW9uVXRpbHMuY3VycmVudEFuaW1hdGlvblRpbWVNaWxsaXMoKTsKLSAgICAgICAgICAgIGZpbmFsIGludCBlbGFwc2VkVGltZSA9IChpbnQpICh0aW1lIC0gbVN0YXJ0VGltZSk7Ci0gICAgICAgICAgICBtRHVyYXRpb24gPSBlbGFwc2VkVGltZSArIGV4dGVuZDsKLSAgICAgICAgICAgIG1GaW5pc2hlZCA9IGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgdm9pZCBzZXRCb3VuY2VDb2VmZmljaWVudChmbG9hdCBjb2VmZmljaWVudCkgewotICAgICAgICAgICAgbUJvdW5jZUNvZWZmaWNpZW50ID0gY29lZmZpY2llbnQ7Ci0gICAgICAgIH0KLQotICAgICAgICBib29sZWFuIHNwcmluZ2JhY2soaW50IHN0YXJ0LCBpbnQgbWluLCBpbnQgbWF4KSB7Ci0gICAgICAgICAgICBtRmluaXNoZWQgPSB0cnVlOwotCi0gICAgICAgICAgICBtU3RhcnQgPSBzdGFydDsKLSAgICAgICAgICAgIG1WZWxvY2l0eSA9IDA7Ci0KLSAgICAgICAgICAgIG1TdGFydFRpbWUgPSBBbmltYXRpb25VdGlscy5jdXJyZW50QW5pbWF0aW9uVGltZU1pbGxpcygpOwotICAgICAgICAgICAgbUR1cmF0aW9uID0gMDsKLQotICAgICAgICAgICAgaWYgKHN0YXJ0IDwgbWluKSB7Ci0gICAgICAgICAgICAgICAgc3RhcnRTcHJpbmdiYWNrKHN0YXJ0LCBtaW4sIGZhbHNlKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoc3RhcnQgPiBtYXgpIHsKLSAgICAgICAgICAgICAgICBzdGFydFNwcmluZ2JhY2soc3RhcnQsIG1heCwgdHJ1ZSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiAhbUZpbmlzaGVkOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIHN0YXJ0U3ByaW5nYmFjayhpbnQgc3RhcnQsIGludCBlbmQsIGJvb2xlYW4gcG9zaXRpdmUpIHsKLSAgICAgICAgICAgIG1GaW5pc2hlZCA9IGZhbHNlOwotICAgICAgICAgICAgbVN0YXRlID0gVE9fQk9VTkNFOwotICAgICAgICAgICAgbVN0YXJ0ID0gbUZpbmFsID0gZW5kOwotICAgICAgICAgICAgbUR1cmF0aW9uID0gT1ZFUlNDUk9MTF9TUFJJTkdCQUNLX0RVUkFUSU9OOwotICAgICAgICAgICAgbVN0YXJ0VGltZSAtPSBPVkVSU0NST0xMX1NQUklOR0JBQ0tfRFVSQVRJT04gLyAyOwotICAgICAgICAgICAgbVZlbG9jaXR5ID0gKGludCkgKE1hdGguYWJzKGVuZCAtIHN0YXJ0KSAqIFRJTUVfQ09FRiAqIChwb3NpdGl2ZSA/IDEuMCA6IC0xLjBmKSk7Ci0gICAgICAgIH0KLQotICAgICAgICB2b2lkIGZsaW5nKGludCBzdGFydCwgaW50IHZlbG9jaXR5LCBpbnQgbWluLCBpbnQgbWF4LCBpbnQgb3ZlcikgewotICAgICAgICAgICAgbVN0YXRlID0gVE9fRURHRTsKLSAgICAgICAgICAgIG1PdmVyID0gb3ZlcjsKLQotICAgICAgICAgICAgbUZpbmlzaGVkID0gZmFsc2U7Ci0KLSAgICAgICAgICAgIG1TdGFydCA9IHN0YXJ0OwotICAgICAgICAgICAgbVN0YXJ0VGltZSA9IEFuaW1hdGlvblV0aWxzLmN1cnJlbnRBbmltYXRpb25UaW1lTWlsbGlzKCk7Ci0KLSAgICAgICAgICAgIG1WZWxvY2l0eSA9IHZlbG9jaXR5OwotCi0gICAgICAgICAgICBtRGVjZWxlcmF0aW9uID0gZ2V0RGVjZWxlcmF0aW9uKHZlbG9jaXR5KTsKLQotICAgICAgICAgICAgLy8gRHVyYXRpb24gYXJlIGV4cHJlc3NlZCBpbiBtaWxsaXNlY29uZHMKLSAgICAgICAgICAgIG1EdXJhdGlvbiA9IChpbnQpICgtMTAwMC4wZiAqIHZlbG9jaXR5IC8gbURlY2VsZXJhdGlvbik7Ci0KLSAgICAgICAgICAgIG1GaW5hbCA9IHN0YXJ0IC0gTWF0aC5yb3VuZCgodmVsb2NpdHkgKiB2ZWxvY2l0eSkgLyAoMi4wZiAqIG1EZWNlbGVyYXRpb24pKTsKLQotICAgICAgICAgICAgLy8gQ2xhbXAgdG8gYSB2YWxpZCBmaW5hbCBwb3NpdGlvbgotICAgICAgICAgICAgaWYgKG1GaW5hbCA8IG1pbikgewotICAgICAgICAgICAgICAgIG1GaW5hbCA9IG1pbjsKLSAgICAgICAgICAgICAgICBtRHVyYXRpb24gPSBjb21wdXRlRHVyYXRpb24obVN0YXJ0LCBtaW4sIG1WZWxvY2l0eSwgbURlY2VsZXJhdGlvbik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChtRmluYWwgPiBtYXgpIHsKLSAgICAgICAgICAgICAgICBtRmluYWwgPSBtYXg7Ci0gICAgICAgICAgICAgICAgbUR1cmF0aW9uID0gY29tcHV0ZUR1cmF0aW9uKG1TdGFydCwgbWF4LCBtVmVsb2NpdHksIG1EZWNlbGVyYXRpb24pOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoc3RhcnQgPiBtYXgpIHsKLSAgICAgICAgICAgICAgICBpZiAoc3RhcnQgPj0gbWF4ICsgb3ZlcikgewotICAgICAgICAgICAgICAgICAgICBzcHJpbmdiYWNrKG1heCArIG92ZXIsIG1pbiwgbWF4KTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBpZiAodmVsb2NpdHkgPD0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgc3ByaW5nYmFjayhzdGFydCwgbWluLCBtYXgpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgbG9uZyB0aW1lID0gQW5pbWF0aW9uVXRpbHMuY3VycmVudEFuaW1hdGlvblRpbWVNaWxsaXMoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIGRvdWJsZSBkdXJhdGlvblNpbmNlRWRnZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTWF0aC5hdGFuKChzdGFydC1tYXgpICogVElNRV9DT0VGIC8gdmVsb2NpdHkpIC8gVElNRV9DT0VGOwotICAgICAgICAgICAgICAgICAgICAgICAgbVN0YXJ0VGltZSA9IChpbnQpICh0aW1lIC0gMTAwMC4wZiAqIGR1cmF0aW9uU2luY2VFZGdlKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2ltdWxhdGUgYSBib3VuY2UgdGhhdCBzdGFydGVkIGZyb20gZWRnZQotICAgICAgICAgICAgICAgICAgICAgICAgbVN0YXJ0ID0gbWF4OwotCi0gICAgICAgICAgICAgICAgICAgICAgICBtVmVsb2NpdHkgPSAoaW50KSAodmVsb2NpdHkgLyBNYXRoLmNvcyhkdXJhdGlvblNpbmNlRWRnZSAqIFRJTUVfQ09FRikpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBvbkVkZ2VSZWFjaGVkKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGlmIChzdGFydCA8IG1pbikgewotICAgICAgICAgICAgICAgICAgICBpZiAoc3RhcnQgPD0gbWluIC0gb3ZlcikgewotICAgICAgICAgICAgICAgICAgICAgICAgc3ByaW5nYmFjayhtaW4gLSBvdmVyLCBtaW4sIG1heCk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAodmVsb2NpdHkgPj0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwcmluZ2JhY2soc3RhcnQsIG1pbiwgbWF4KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9uZyB0aW1lID0gQW5pbWF0aW9uVXRpbHMuY3VycmVudEFuaW1hdGlvblRpbWVNaWxsaXMoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBkb3VibGUgZHVyYXRpb25TaW5jZUVkZ2UgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXRoLmF0YW4oKHN0YXJ0LW1pbikgKiBUSU1FX0NPRUYgLyB2ZWxvY2l0eSkgLyBUSU1FX0NPRUY7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbVN0YXJ0VGltZSA9IChpbnQpICh0aW1lIC0gMTAwMC4wZiAqIGR1cmF0aW9uU2luY2VFZGdlKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNpbXVsYXRlIGEgYm91bmNlIHRoYXQgc3RhcnRlZCBmcm9tIGVkZ2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtU3RhcnQgPSBtaW47Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtVmVsb2NpdHkgPSAoaW50KSAodmVsb2NpdHkgLyBNYXRoLmNvcyhkdXJhdGlvblNpbmNlRWRnZSAqIFRJTUVfQ09FRikpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgb25FZGdlUmVhY2hlZCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICB2b2lkIG5vdGlmeUVkZ2VSZWFjaGVkKGludCBzdGFydCwgaW50IGVuZCwgaW50IG92ZXIpIHsKLSAgICAgICAgICAgIG1EZWNlbGVyYXRpb24gPSBnZXREZWNlbGVyYXRpb24obVZlbG9jaXR5KTsKLQotICAgICAgICAgICAgLy8gTG9jYWwgdGltZSwgdXNlZCB0byBjb21wdXRlIGVkZ2UgY3Jvc3NpbmcgdGltZS4KLSAgICAgICAgICAgIGZsb2F0IHRpbWVDdXJyZW50ID0gbUN1cnJWZWxvY2l0eSAvIG1EZWNlbGVyYXRpb247Ci0gICAgICAgICAgICBmaW5hbCBpbnQgZGlzdGFuY2UgPSBlbmQgLSBzdGFydDsKLSAgICAgICAgICAgIGZsb2F0IHRpbWVFZGdlID0gLShmbG9hdCkgTWF0aC5zcXJ0KCgyLjBmICogZGlzdGFuY2UgLyBtRGVjZWxlcmF0aW9uKQotICAgICAgICAgICAgICAgICAgICArICh0aW1lQ3VycmVudCAqIHRpbWVDdXJyZW50KSk7Ci0KLSAgICAgICAgICAgIG1WZWxvY2l0eSA9IChpbnQpIChtRGVjZWxlcmF0aW9uICogdGltZUVkZ2UpOwotCi0gICAgICAgICAgICAvLyBTaW11bGF0ZSBhIHN5bW1ldHJpYyBib3VuY2UgdGhhdCBzdGFydGVkIGZyb20gZWRnZQotICAgICAgICAgICAgbVN0YXJ0ID0gZW5kOwotCi0gICAgICAgICAgICBtT3ZlciA9IG92ZXI7Ci0KLSAgICAgICAgICAgIGxvbmcgdGltZSA9IEFuaW1hdGlvblV0aWxzLmN1cnJlbnRBbmltYXRpb25UaW1lTWlsbGlzKCk7Ci0gICAgICAgICAgICBtU3RhcnRUaW1lID0gKGludCkgKHRpbWUgLSAxMDAwLjBmICogKHRpbWVDdXJyZW50IC0gdGltZUVkZ2UpKTsKLQotICAgICAgICAgICAgb25FZGdlUmVhY2hlZCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIG9uRWRnZVJlYWNoZWQoKSB7Ci0gICAgICAgICAgICAvLyBtU3RhcnQsIG1WZWxvY2l0eSBhbmQgbVN0YXJ0VGltZSB3ZXJlIGFkanVzdGVkIHRvIHRoZWlyIHZhbHVlcyB3aGVuIGVkZ2Ugd2FzIHJlYWNoZWQuCi0gICAgICAgICAgICBmaW5hbCBmbG9hdCBkaXN0YW5jZSA9IG1WZWxvY2l0eSAvIFRJTUVfQ09FRjsKLQotICAgICAgICAgICAgaWYgKE1hdGguYWJzKGRpc3RhbmNlKSA8IG1PdmVyKSB7Ci0gICAgICAgICAgICAgICAgLy8gU3ByaW5nIGZvcmNlIHdpbGwgYnJpbmcgdXMgYmFjayB0byBmaW5hbCBwb3NpdGlvbgotICAgICAgICAgICAgICAgIG1TdGF0ZSA9IFRPX0JPVU5DRTsKLSAgICAgICAgICAgICAgICBtRmluYWwgPSBtU3RhcnQ7Ci0gICAgICAgICAgICAgICAgbUR1cmF0aW9uID0gT1ZFUlNDUk9MTF9TUFJJTkdCQUNLX0RVUkFUSU9OOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAvLyBWZWxvY2l0eSBpcyB0b28gaGlnaCwgd2Ugd2lsbCBoaXQgdGhlIGJvdW5kYXJ5IGxpbWl0Ci0gICAgICAgICAgICAgICAgbVN0YXRlID0gVE9fQk9VTkRBUlk7Ci0gICAgICAgICAgICAgICAgaW50IG92ZXIgPSBtVmVsb2NpdHkgPiAwID8gbU92ZXIgOiAtbU92ZXI7Ci0gICAgICAgICAgICAgICAgbUZpbmFsID0gbVN0YXJ0ICsgb3ZlcjsKLSAgICAgICAgICAgICAgICBtRHVyYXRpb24gPSAoaW50KSAoMTAwMC4wZiAqIE1hdGguYXNpbihvdmVyIC8gZGlzdGFuY2UpIC8gVElNRV9DT0VGKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGJvb2xlYW4gY29udGludWVXaGVuRmluaXNoZWQoKSB7Ci0gICAgICAgICAgICBzd2l0Y2ggKG1TdGF0ZSkgewotICAgICAgICAgICAgICAgIGNhc2UgVE9fRURHRToKLSAgICAgICAgICAgICAgICAgICAgLy8gRHVyYXRpb24gZnJvbSBzdGFydCB0byBudWxsIHZlbG9jaXR5Ci0gICAgICAgICAgICAgICAgICAgIGludCBkdXJhdGlvbiA9IChpbnQpICgtMTAwMC4wZiAqIG1WZWxvY2l0eSAvIG1EZWNlbGVyYXRpb24pOwotICAgICAgICAgICAgICAgICAgICBpZiAobUR1cmF0aW9uIDwgZHVyYXRpb24pIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIElmIHRoZSBhbmltYXRpb24gd2FzIGNsYW1wZWQsIHdlIHJlYWNoZWQgdGhlIGVkZ2UKLSAgICAgICAgICAgICAgICAgICAgICAgIG1TdGFydCA9IG1GaW5hbDsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNwZWVkIHdoZW4gZWRnZSB3YXMgcmVhY2hlZAotICAgICAgICAgICAgICAgICAgICAgICAgbVZlbG9jaXR5ID0gKGludCkgKG1WZWxvY2l0eSArIG1EZWNlbGVyYXRpb24gKiBtRHVyYXRpb24gLyAxMDAwLjBmKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1TdGFydFRpbWUgKz0gbUR1cmF0aW9uOwotICAgICAgICAgICAgICAgICAgICAgICAgb25FZGdlUmVhY2hlZCgpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gTm9ybWFsIHN0b3AsIG5vIG5lZWQgdG8gY29udGludWUKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIFRPX0JPVU5EQVJZOgotICAgICAgICAgICAgICAgICAgICBtU3RhcnRUaW1lICs9IG1EdXJhdGlvbjsKLSAgICAgICAgICAgICAgICAgICAgc3RhcnRTcHJpbmdiYWNrKG1GaW5hbCwgbUZpbmFsIC0gKG1WZWxvY2l0eSA+IDAgPyBtT3ZlcjotbU92ZXIpLCBtVmVsb2NpdHkgPiAwKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBUT19CT1VOQ0U6Ci0gICAgICAgICAgICAgICAgICAgIC8vbVZlbG9jaXR5ID0gKGludCkgKG1WZWxvY2l0eSAqIEJPVU5DRV9DT0VGRklDSUVOVCk7Ci0gICAgICAgICAgICAgICAgICAgIG1WZWxvY2l0eSA9IChpbnQpIChtVmVsb2NpdHkgKiBtQm91bmNlQ29lZmZpY2llbnQpOwotICAgICAgICAgICAgICAgICAgICBpZiAoTWF0aC5hYnMobVZlbG9jaXR5KSA8IE1JTklNVU1fVkVMT0NJVFlfRk9SX0JPVU5DRSkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIG1TdGFydFRpbWUgKz0gbUR1cmF0aW9uOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgdXBkYXRlKCk7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qCi0gICAgICAgICAqIFVwZGF0ZSB0aGUgY3VycmVudCBwb3NpdGlvbiBhbmQgdmVsb2NpdHkgZm9yIGN1cnJlbnQgdGltZS4gUmV0dXJucwotICAgICAgICAgKiB0cnVlIGlmIHVwZGF0ZSBoYXMgYmVlbiBkb25lIGFuZCBmYWxzZSBpZiBhbmltYXRpb24gZHVyYXRpb24gaGFzIGJlZW4KLSAgICAgICAgICogcmVhY2hlZC4KLSAgICAgICAgICovCi0gICAgICAgIGJvb2xlYW4gdXBkYXRlKCkgewotICAgICAgICAgICAgZmluYWwgbG9uZyB0aW1lID0gQW5pbWF0aW9uVXRpbHMuY3VycmVudEFuaW1hdGlvblRpbWVNaWxsaXMoKTsKLSAgICAgICAgICAgIGZpbmFsIGxvbmcgZHVyYXRpb24gPSB0aW1lIC0gbVN0YXJ0VGltZTsKLQotICAgICAgICAgICAgaWYgKGR1cmF0aW9uID4gbUR1cmF0aW9uKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBkb3VibGUgZGlzdGFuY2U7Ci0gICAgICAgICAgICBmaW5hbCBmbG9hdCB0ID0gZHVyYXRpb24gLyAxMDAwLjBmOwotICAgICAgICAgICAgaWYgKG1TdGF0ZSA9PSBUT19FREdFKSB7Ci0gICAgICAgICAgICAgICAgbUN1cnJWZWxvY2l0eSA9IG1WZWxvY2l0eSArIG1EZWNlbGVyYXRpb24gKiB0OwotICAgICAgICAgICAgICAgIGRpc3RhbmNlID0gbVZlbG9jaXR5ICogdCArIG1EZWNlbGVyYXRpb24gKiB0ICogdCAvIDIuMGY7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGZpbmFsIGZsb2F0IGQgPSB0ICogVElNRV9DT0VGOwotICAgICAgICAgICAgICAgIG1DdXJyVmVsb2NpdHkgPSBtVmVsb2NpdHkgKiAoZmxvYXQpTWF0aC5jb3MoZCk7Ci0gICAgICAgICAgICAgICAgZGlzdGFuY2UgPSBtVmVsb2NpdHkgLyBUSU1FX0NPRUYgKiBNYXRoLnNpbihkKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgbUN1cnJlbnRQb3NpdGlvbiA9IG1TdGFydCArIChpbnQpIGRpc3RhbmNlOwotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvUG9wdXBNZW51LmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvUG9wdXBNZW51LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODI3NzBhZAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9Qb3B1cE1lbnUuamF2YQpAQCAtMCwwICsxLDE1NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC53aWRnZXQ7CisKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC52aWV3Lm1lbnUuTWVudUJ1aWxkZXI7CitpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudmlldy5tZW51Lk1lbnVQb3B1cEhlbHBlcjsKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC52aWV3Lm1lbnUuU3ViTWVudUJ1aWxkZXI7CisKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuTWVudTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuTWVudUluZmxhdGVyOworaW1wb3J0IGFuZHJvaWQudmlldy5NZW51SXRlbTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKKworLyoqCisgKiBBIFBvcHVwTWVudSBkaXNwbGF5cyBhIHtAbGluayBNZW51fSBpbiBhIG1vZGFsIHBvcHVwIHdpbmRvdyBhbmNob3JlZCB0byBhIHtAbGluayBWaWV3fS4KKyAqIFRoZSBwb3B1cCB3aWxsIGFwcGVhciBiZWxvdyB0aGUgYW5jaG9yIHZpZXcgaWYgdGhlcmUgaXMgcm9vbSwgb3IgYWJvdmUgaXQgaWYgdGhlcmUgaXMgbm90LgorICogSWYgdGhlIElNRSBpcyB2aXNpYmxlIHRoZSBwb3B1cCB3aWxsIG5vdCBvdmVybGFwIGl0IHVudGlsIGl0IGlzIHRvdWNoZWQuIFRvdWNoaW5nIG91dHNpZGUKKyAqIG9mIHRoZSBwb3B1cCB3aWxsIGRpc21pc3MgaXQuCisgKi8KK3B1YmxpYyBjbGFzcyBQb3B1cE1lbnUgaW1wbGVtZW50cyBNZW51QnVpbGRlci5DYWxsYmFjayB7CisgICAgcHJpdmF0ZSBDb250ZXh0IG1Db250ZXh0OworICAgIHByaXZhdGUgTWVudUJ1aWxkZXIgbU1lbnU7CisgICAgcHJpdmF0ZSBWaWV3IG1BbmNob3I7CisgICAgcHJpdmF0ZSBNZW51UG9wdXBIZWxwZXIgbVBvcHVwOworICAgIHByaXZhdGUgT25NZW51SXRlbUNsaWNrTGlzdGVuZXIgbU1lbnVJdGVtQ2xpY2tMaXN0ZW5lcjsKKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdCBhIG5ldyBQb3B1cE1lbnUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29udGV4dCBDb250ZXh0IGZvciB0aGUgUG9wdXBNZW51LgorICAgICAqIEBwYXJhbSBhbmNob3IgQW5jaG9yIHZpZXcgZm9yIHRoaXMgcG9wdXAuIFRoZSBwb3B1cCB3aWxsIGFwcGVhciBiZWxvdyB0aGUgYW5jaG9yIGlmIHRoZXJlCisgICAgICogICAgICAgICAgICAgICBpcyByb29tLCBvciBhYm92ZSBpdCBpZiB0aGVyZSBpcyBub3QuCisgICAgICovCisgICAgcHVibGljIFBvcHVwTWVudShDb250ZXh0IGNvbnRleHQsIFZpZXcgYW5jaG9yKSB7CisgICAgICAgIC8vIFRPRE8gVGhlbWU/CisgICAgICAgIG1Db250ZXh0ID0gY29udGV4dDsKKyAgICAgICAgbU1lbnUgPSBuZXcgTWVudUJ1aWxkZXIoY29udGV4dCk7CisgICAgICAgIG1NZW51LnNldENhbGxiYWNrKHRoaXMpOworICAgICAgICBtQW5jaG9yID0gYW5jaG9yOworICAgICAgICBtUG9wdXAgPSBuZXcgTWVudVBvcHVwSGVscGVyKGNvbnRleHQsIG1NZW51LCBhbmNob3IpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4gdGhlIHtAbGluayBNZW51fSBhc3NvY2lhdGVkIHdpdGggdGhpcyBwb3B1cC4gUG9wdWxhdGUgdGhlIHJldHVybmVkIE1lbnUgd2l0aAorICAgICAqIGl0ZW1zIGJlZm9yZSBjYWxsaW5nIHtAbGluayAjc2hvdygpfS4KKyAgICAgKgorICAgICAqIEBzZWUgI3Nob3coKQorICAgICAqIEBzZWUgI2dldE1lbnVJbmZsYXRlcigpCisgICAgICovCisgICAgcHVibGljIE1lbnUgZ2V0TWVudSgpIHsKKyAgICAgICAgcmV0dXJuIG1NZW51OworICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4gYSB7QGxpbmsgTWVudUluZmxhdGVyfSB0aGF0IGNhbiBiZSB1c2VkIHRvIGluZmxhdGUgbWVudSBpdGVtcyBmcm9tIFhNTCBpbnRvIHRoZQorICAgICAqIG1lbnUgcmV0dXJuZWQgYnkge0BsaW5rICNnZXRNZW51KCl9LgorICAgICAqCisgICAgICogQHNlZSAjZ2V0TWVudSgpCisgICAgICovCisgICAgcHVibGljIE1lbnVJbmZsYXRlciBnZXRNZW51SW5mbGF0ZXIoKSB7CisgICAgICAgIHJldHVybiBuZXcgTWVudUluZmxhdGVyKG1Db250ZXh0KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTaG93IHRoZSBtZW51IHBvcHVwIGFuY2hvcmVkIHRvIHRoZSB2aWV3IHNwZWNpZmllZCBkdXJpbmcgY29uc3RydWN0aW9uLgorICAgICAqIEBzZWUgI2Rpc21pc3MoKQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNob3coKSB7CisgICAgICAgIG1Qb3B1cC5zaG93KCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogRGlzbWlzcyB0aGUgbWVudSBwb3B1cC4KKyAgICAgKiBAc2VlICNzaG93KCkKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBkaXNtaXNzKCkgeworICAgICAgICBtUG9wdXAuZGlzbWlzcygpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldE9uTWVudUl0ZW1DbGlja0xpc3RlbmVyKE9uTWVudUl0ZW1DbGlja0xpc3RlbmVyIGxpc3RlbmVyKSB7CisgICAgICAgIG1NZW51SXRlbUNsaWNrTGlzdGVuZXIgPSBsaXN0ZW5lcjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAaGlkZQorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIG9uTWVudUl0ZW1TZWxlY3RlZChNZW51QnVpbGRlciBtZW51LCBNZW51SXRlbSBpdGVtKSB7CisgICAgICAgIGlmIChtTWVudUl0ZW1DbGlja0xpc3RlbmVyICE9IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBtTWVudUl0ZW1DbGlja0xpc3RlbmVyLm9uTWVudUl0ZW1DbGljayhpdGVtKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLyoqCisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBvbkNsb3NlTWVudShNZW51QnVpbGRlciBtZW51LCBib29sZWFuIGFsbE1lbnVzQXJlQ2xvc2luZykgeworICAgIH0KKworICAgIC8qKgorICAgICAqIEBoaWRlCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gb25TdWJNZW51U2VsZWN0ZWQoU3ViTWVudUJ1aWxkZXIgc3ViTWVudSkgeworICAgICAgICBpZiAoIXN1Yk1lbnUuaGFzVmlzaWJsZUl0ZW1zKCkpIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgLy8gQ3VycmVudCBtZW51IHdpbGwgYmUgZGlzbWlzc2VkIGJ5IHRoZSBub3JtYWwgaGVscGVyLCBzdWJtZW51IHdpbGwgYmUgc2hvd24gaW4gaXRzIHBsYWNlLgorICAgICAgICBuZXcgTWVudVBvcHVwSGVscGVyKG1Db250ZXh0LCBzdWJNZW51LCBtQW5jaG9yKS5zaG93KCk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIC8qKgorICAgICAqIEBoaWRlCisgICAgICovCisgICAgcHVibGljIHZvaWQgb25DbG9zZVN1Yk1lbnUoU3ViTWVudUJ1aWxkZXIgbWVudSkgeworICAgIH0KKworICAgIC8qKgorICAgICAqIEBoaWRlCisgICAgICovCisgICAgcHVibGljIHZvaWQgb25NZW51TW9kZUNoYW5nZShNZW51QnVpbGRlciBtZW51KSB7CisgICAgfQorCisgICAgLyoqCisgICAgICogSW50ZXJmYWNlIHJlc3BvbnNpYmxlIGZvciByZWNlaXZpbmcgbWVudSBpdGVtIGNsaWNrIGV2ZW50cyBpZiB0aGUgaXRlbXMgdGhlbXNlbHZlcworICAgICAqIGRvIG5vdCBoYXZlIGluZGl2aWR1YWwgaXRlbSBjbGljayBsaXN0ZW5lcnMuCisgICAgICovCisgICAgcHVibGljIGludGVyZmFjZSBPbk1lbnVJdGVtQ2xpY2tMaXN0ZW5lciB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGlzIG1ldGhvZCB3aWxsIGJlIGludm9rZWQgd2hlbiBhIG1lbnUgaXRlbSBpcyBjbGlja2VkIGlmIHRoZSBpdGVtIGl0c2VsZiBkaWQKKyAgICAgICAgICogbm90IGFscmVhZHkgaGFuZGxlIHRoZSBldmVudC4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIGl0ZW0ge0BsaW5rIE1lbnVJdGVtfSB0aGF0IHdhcyBjbGlja2VkCisgICAgICAgICAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGV2ZW50IHdhcyBoYW5kbGVkLCA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIGJvb2xlYW4gb25NZW51SXRlbUNsaWNrKE1lbnVJdGVtIGl0ZW0pOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9Qb3B1cFdpbmRvdy5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L1BvcHVwV2luZG93LmphdmEKaW5kZXggMDM3ODMyOC4uNGEzZTJhOSAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L1BvcHVwV2luZG93LmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L1BvcHVwV2luZG93LmphdmEKQEAgLTE5LDIyICsxOSwyNCBAQAogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLlI7CiAKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlJlc291cmNlczsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlR5cGVkQXJyYXk7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LktleUV2ZW50OwotaW1wb3J0IGFuZHJvaWQudmlldy5Nb3Rpb25FdmVudDsKLWltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKLWltcG9ydCBhbmRyb2lkLnZpZXcuV2luZG93TWFuYWdlcjsKLWltcG9ydCBhbmRyb2lkLnZpZXcuR3Jhdml0eTsKLWltcG9ydCBhbmRyb2lkLnZpZXcuVmlld0dyb3VwOwotaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3VHJlZU9ic2VydmVyOwotaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3VHJlZU9ic2VydmVyLk9uU2Nyb2xsQ2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3Lk9uVG91Y2hMaXN0ZW5lcjsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlBpeGVsRm9ybWF0OwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUmVjdDsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlOwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuU3RhdGVMaXN0RHJhd2FibGU7CiBpbXBvcnQgYW5kcm9pZC5vcy5JQmluZGVyOwogaW1wb3J0IGFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQ7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuR3Jhdml0eTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuS2V5RXZlbnQ7CitpbXBvcnQgYW5kcm9pZC52aWV3Lk1vdGlvbkV2ZW50OworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3Lk9uVG91Y2hMaXN0ZW5lcjsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlld0dyb3VwOworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3VHJlZU9ic2VydmVyOworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3VHJlZU9ic2VydmVyLk9uU2Nyb2xsQ2hhbmdlZExpc3RlbmVyOworaW1wb3J0IGFuZHJvaWQudmlldy5XaW5kb3dNYW5hZ2VyOwogCiBpbXBvcnQgamF2YS5sYW5nLnJlZi5XZWFrUmVmZXJlbmNlOwogCkBAIC0xMjEsNyArMTIzLDcgQEAKICAgICBwcml2YXRlIE9uU2Nyb2xsQ2hhbmdlZExpc3RlbmVyIG1PblNjcm9sbENoYW5nZWRMaXN0ZW5lciA9CiAgICAgICAgIG5ldyBPblNjcm9sbENoYW5nZWRMaXN0ZW5lcigpIHsKICAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uU2Nyb2xsQ2hhbmdlZCgpIHsKLSAgICAgICAgICAgICAgICBWaWV3IGFuY2hvciA9IG1BbmNob3IuZ2V0KCk7CisgICAgICAgICAgICAgICAgVmlldyBhbmNob3IgPSBtQW5jaG9yICE9IG51bGwgPyBtQW5jaG9yLmdldCgpIDogbnVsbDsKICAgICAgICAgICAgICAgICBpZiAoYW5jaG9yICE9IG51bGwgJiYgbVBvcHVwVmlldyAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgIFdpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zIHAgPSAoV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVBvcHVwVmlldy5nZXRMYXlvdXRQYXJhbXMoKTsKQEAgLTE1NywxMiArMTU5LDIxIEBACiAgICAgICogPHA+VGhlIHBvcHVwIGRvZXMgcHJvdmlkZSBhIGJhY2tncm91bmQuPC9wPgogICAgICAqLwogICAgIHB1YmxpYyBQb3B1cFdpbmRvdyhDb250ZXh0IGNvbnRleHQsIEF0dHJpYnV0ZVNldCBhdHRycywgaW50IGRlZlN0eWxlKSB7CisgICAgICAgIHRoaXMoY29udGV4dCwgYXR0cnMsIGRlZlN0eWxlLCAwKTsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogPHA+Q3JlYXRlIGEgbmV3LCBlbXB0eSwgbm9uIGZvY3VzYWJsZSBwb3B1cCB3aW5kb3cgb2YgZGltZW5zaW9uICgwLDApLjwvcD4KKyAgICAgKiAKKyAgICAgKiA8cD5UaGUgcG9wdXAgZG9lcyBub3QgcHJvdmlkZSBhIGJhY2tncm91bmQuPC9wPgorICAgICAqLworICAgIHB1YmxpYyBQb3B1cFdpbmRvdyhDb250ZXh0IGNvbnRleHQsIEF0dHJpYnV0ZVNldCBhdHRycywgaW50IGRlZlN0eWxlQXR0ciwgaW50IGRlZlN0eWxlUmVzKSB7CiAgICAgICAgIG1Db250ZXh0ID0gY29udGV4dDsKICAgICAgICAgbVdpbmRvd01hbmFnZXIgPSAoV2luZG93TWFuYWdlciljb250ZXh0LmdldFN5c3RlbVNlcnZpY2UoQ29udGV4dC5XSU5ET1dfU0VSVklDRSk7CiAKICAgICAgICAgVHlwZWRBcnJheSBhID0KICAgICAgICAgICAgIGNvbnRleHQub2J0YWluU3R5bGVkQXR0cmlidXRlcygKLSAgICAgICAgICAgICAgICBhdHRycywgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZWFibGUuUG9wdXBXaW5kb3csIGRlZlN0eWxlLCAwKTsKKyAgICAgICAgICAgICAgICBhdHRycywgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZWFibGUuUG9wdXBXaW5kb3csIGRlZlN0eWxlQXR0ciwgZGVmU3R5bGVSZXMpOwogCiAgICAgICAgIG1CYWNrZ3JvdW5kID0gYS5nZXREcmF3YWJsZShSLnN0eWxlYWJsZS5Qb3B1cFdpbmRvd19wb3B1cEJhY2tncm91bmQpOwogCkBAIC0xMDIyLDcgKzEwMzMsOSBAQAogICAgICAgICAKICAgICAgICAgaW50IGJvdHRvbUVkZ2UgPSBkaXNwbGF5RnJhbWUuYm90dG9tOwogICAgICAgICBpZiAoaWdub3JlQm90dG9tRGVjb3JhdGlvbnMpIHsKLSAgICAgICAgICAgIGJvdHRvbUVkZ2UgPSBhbmNob3IuZ2V0Q29udGV4dCgpLmdldFJlc291cmNlcygpLmdldERpc3BsYXlNZXRyaWNzKCkuaGVpZ2h0UGl4ZWxzOworICAgICAgICAgICAgUmVzb3VyY2VzIHJlcyA9IGFuY2hvci5nZXRDb250ZXh0KCkuZ2V0UmVzb3VyY2VzKCk7CisgICAgICAgICAgICBib3R0b21FZGdlID0gcmVzLmdldERpc3BsYXlNZXRyaWNzKCkuaGVpZ2h0UGl4ZWxzIC0KKyAgICAgICAgICAgICAgICAgICAgKGludCkgcmVzLmdldERpbWVuc2lvbihjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmRpbWVuLnNjcmVlbl9tYXJnaW5fYm90dG9tKTsKICAgICAgICAgfQogICAgICAgICBmaW5hbCBpbnQgZGlzdGFuY2VUb0JvdHRvbSA9IGJvdHRvbUVkZ2UgLSAoYW5jaG9yUG9zWzFdICsgYW5jaG9yLmdldEhlaWdodCgpKSAtIHlPZmZzZXQ7CiAgICAgICAgIGZpbmFsIGludCBkaXN0YW5jZVRvVG9wID0gYW5jaG9yUG9zWzFdIC0gZGlzcGxheUZyYW1lLnRvcCArIHlPZmZzZXQ7CkBAIC0xMzE1LDYgKzEzMjgsNyBAQAogICAgIH0KIAogICAgIHByaXZhdGUgY2xhc3MgUG9wdXBWaWV3Q29udGFpbmVyIGV4dGVuZHMgRnJhbWVMYXlvdXQgeworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIlBvcHVwV2luZG93LlBvcHVwVmlld0NvbnRhaW5lciI7CiAKICAgICAgICAgcHVibGljIFBvcHVwVmlld0NvbnRhaW5lcihDb250ZXh0IGNvbnRleHQpIHsKICAgICAgICAgICAgIHN1cGVyKGNvbnRleHQpOwpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L1Byb2dyZXNzQmFyLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvUHJvZ3Jlc3NCYXIuamF2YQppbmRleCBlYzdkOTI3Li4zYTQ0ODdjIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvUHJvZ3Jlc3NCYXIuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvUHJvZ3Jlc3NCYXIuamF2YQpAQCAtNzE2LDggKzcxNiw4IEBACiAgICAgICAgICAgICBtQW5pbWF0aW9uLnNldER1cmF0aW9uKG1EdXJhdGlvbik7CiAgICAgICAgICAgICBtQW5pbWF0aW9uLnNldEludGVycG9sYXRvcihtSW50ZXJwb2xhdG9yKTsKICAgICAgICAgICAgIG1BbmltYXRpb24uc2V0U3RhcnRUaW1lKEFuaW1hdGlvbi5TVEFSVF9PTl9GSVJTVF9GUkFNRSk7Ci0gICAgICAgICAgICBwb3N0SW52YWxpZGF0ZSgpOwogICAgICAgICB9CisgICAgICAgIHBvc3RJbnZhbGlkYXRlKCk7CiAgICAgfQogCiAgICAgLyoqCkBAIC03MzAsNiArNzMwLDcgQEAKICAgICAgICAgICAgICgoQW5pbWF0YWJsZSkgbUluZGV0ZXJtaW5hdGVEcmF3YWJsZSkuc3RvcCgpOwogICAgICAgICAgICAgbVNob3VsZFN0YXJ0QW5pbWF0aW9uRHJhd2FibGUgPSBmYWxzZTsKICAgICAgICAgfQorICAgICAgICBwb3N0SW52YWxpZGF0ZSgpOwogICAgIH0KIAogICAgIC8qKgpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L1F1aWNrQ29udGFjdEJhZGdlLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvUXVpY2tDb250YWN0QmFkZ2UuamF2YQppbmRleCA0YmJiNTQwLi41NTk4YzY1IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvUXVpY2tDb250YWN0QmFkZ2UuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvUXVpY2tDb250YWN0QmFkZ2UuamF2YQpAQCAtNDgsNiArNDgsNyBAQAogICAgIHByaXZhdGUgUXVlcnlIYW5kbGVyIG1RdWVyeUhhbmRsZXI7CiAgICAgcHJpdmF0ZSBEcmF3YWJsZSBtQmFkZ2VCYWNrZ3JvdW5kOwogICAgIHByaXZhdGUgRHJhd2FibGUgbU5vQmFkZ2VCYWNrZ3JvdW5kOworICAgIHByaXZhdGUgRHJhd2FibGUgbURlZmF1bHRBdmF0YXI7CiAKICAgICBwcm90ZWN0ZWQgU3RyaW5nW10gbUV4Y2x1ZGVNaW1lcyA9IG51bGw7CiAKQEAgLTExNyw2ICsxMTgsMTYgQEAKICAgICBwdWJsaWMgdm9pZCBzZXRNb2RlKGludCBzaXplKSB7CiAgICAgICAgIG1Nb2RlID0gc2l6ZTsKICAgICB9CisgICAgCisgICAgLyoqCisgICAgICogUmVzZXRzIHRoZSBjb250YWN0IHBob3RvIHRvIHRoZSBkZWZhdWx0IHN0YXRlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEltYWdlVG9EZWZhdWx0KCkgeworICAgICAgICBpZiAobURlZmF1bHRBdmF0YXIgPT0gbnVsbCkgeworICAgICAgICAgICAgbURlZmF1bHRBdmF0YXIgPSBnZXRSZXNvdXJjZXMoKS5nZXREcmF3YWJsZShSLmRyYXdhYmxlLmljX2NvbnRhY3RfcGljdHVyZSk7CisgICAgICAgIH0KKyAgICAgICAgc2V0SW1hZ2VEcmF3YWJsZShtRGVmYXVsdEF2YXRhcik7CisgICAgfQogCiAgICAgLyoqCiAgICAgICogQXNzaWduIHRoZSBjb250YWN0IHVyaSB0aGF0IHRoaXMgUXVpY2tDb250YWN0QmFkZ2Ugc2hvdWxkIGJlIGFzc29jaWF0ZWQKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9SZW1vdGVWaWV3cy5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L1JlbW90ZVZpZXdzLmphdmEKaW5kZXggN2E3MGM4MC4uMGNhNzFlMSAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L1JlbW90ZVZpZXdzLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L1JlbW90ZVZpZXdzLmphdmEKQEAgLTE3LDYgKzE3LDcgQEAKIHBhY2thZ2UgYW5kcm9pZC53aWRnZXQ7CiAKIGltcG9ydCBhbmRyb2lkLmFwcC5QZW5kaW5nSW50ZW50OworaW1wb3J0IGFuZHJvaWQuYXBwd2lkZ2V0LkFwcFdpZGdldEhvc3RWaWV3OwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudFNlbmRlcjsKQEAgLTYwLDEyICs2MSwxMiBAQAogICAgICAqIFRoZSBwYWNrYWdlIG5hbWUgb2YgdGhlIHBhY2thZ2UgY29udGFpbmluZyB0aGUgbGF5b3V0IAogICAgICAqIHJlc291cmNlLiAoQWRkZWQgdG8gdGhlIHBhcmNlbCkKICAgICAgKi8KLSAgICBwcml2YXRlIFN0cmluZyBtUGFja2FnZTsKKyAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBtUGFja2FnZTsKICAgICAKICAgICAvKioKICAgICAgKiBUaGUgcmVzb3VyY2UgSUQgb2YgdGhlIGxheW91dCBmaWxlLiAoQWRkZWQgdG8gdGhlIHBhcmNlbCkKICAgICAgKi8KLSAgICBwcml2YXRlIGludCBtTGF5b3V0SWQ7CisgICAgcHJpdmF0ZSBmaW5hbCBpbnQgbUxheW91dElkOwogCiAgICAgLyoqCiAgICAgICogQW4gYXJyYXkgb2YgYWN0aW9ucyB0byBwZXJmb3JtIG9uIHRoZSB2aWV3IHRyZWUgb25jZSBpdCBoYXMgYmVlbgpAQCAtMTEwLDYgKzExMSw0MiBAQAogICAgICAgICB9CiAgICAgfQogCisgICAgcHJpdmF0ZSBjbGFzcyBTZXRFbXB0eVZpZXcgZXh0ZW5kcyBBY3Rpb24geworICAgICAgICBpbnQgdmlld0lkOworICAgICAgICBpbnQgZW1wdHlWaWV3SWQ7CisKKyAgICAgICAgcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgVEFHID0gNjsKKworICAgICAgICBTZXRFbXB0eVZpZXcoaW50IHZpZXdJZCwgaW50IGVtcHR5Vmlld0lkKSB7CisgICAgICAgICAgICB0aGlzLnZpZXdJZCA9IHZpZXdJZDsKKyAgICAgICAgICAgIHRoaXMuZW1wdHlWaWV3SWQgPSBlbXB0eVZpZXdJZDsKKyAgICAgICAgfQorCisgICAgICAgIFNldEVtcHR5VmlldyhQYXJjZWwgaW4pIHsKKyAgICAgICAgICAgIHRoaXMudmlld0lkID0gaW4ucmVhZEludCgpOworICAgICAgICAgICAgdGhpcy5lbXB0eVZpZXdJZCA9IGluLnJlYWRJbnQoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHdyaXRlVG9QYXJjZWwoUGFyY2VsIG91dCwgaW50IGZsYWdzKSB7CisgICAgICAgICAgICBvdXQud3JpdGVJbnQoVEFHKTsKKyAgICAgICAgICAgIG91dC53cml0ZUludCh0aGlzLnZpZXdJZCk7CisgICAgICAgICAgICBvdXQud3JpdGVJbnQodGhpcy5lbXB0eVZpZXdJZCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgYXBwbHkoVmlldyByb290KSB7CisgICAgICAgICAgICBmaW5hbCBWaWV3IHZpZXcgPSByb290LmZpbmRWaWV3QnlJZCh2aWV3SWQpOworICAgICAgICAgICAgaWYgKCEodmlldyBpbnN0YW5jZW9mIEFkYXB0ZXJWaWV3PD8+KSkgcmV0dXJuOworCisgICAgICAgICAgICBBZGFwdGVyVmlldzw/PiBhZGFwdGVyVmlldyA9IChBZGFwdGVyVmlldzw/PikgdmlldzsKKworICAgICAgICAgICAgZmluYWwgVmlldyBlbXB0eVZpZXcgPSByb290LmZpbmRWaWV3QnlJZChlbXB0eVZpZXdJZCk7CisgICAgICAgICAgICBpZiAoZW1wdHlWaWV3ID09IG51bGwpIHJldHVybjsKKworICAgICAgICAgICAgYWRhcHRlclZpZXcuc2V0RW1wdHlWaWV3KGVtcHR5Vmlldyk7CisgICAgICAgIH0KKyAgICB9CisKICAgICAvKioKICAgICAgKiBFcXVpdmFsZW50IHRvIGNhbGxpbmcKICAgICAgKiB7QGxpbmsgYW5kcm9pZC52aWV3LlZpZXcjc2V0T25DbGlja0xpc3RlbmVyKGFuZHJvaWQudmlldy5WaWV3Lk9uQ2xpY2tMaXN0ZW5lcil9CkBAIC0yNjYsNiArMzAzLDYzIEBACiAgICAgICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IFRBRyA9IDM7CiAgICAgfQogICAgIAorICAgIHByaXZhdGUgY2xhc3MgUmVmbGVjdGlvbkFjdGlvbldpdGhvdXRQYXJhbXMgZXh0ZW5kcyBBY3Rpb24geworICAgICAgICBpbnQgdmlld0lkOworICAgICAgICBTdHJpbmcgbWV0aG9kTmFtZTsKKworICAgICAgICBwdWJsaWMgZmluYWwgc3RhdGljIGludCBUQUcgPSA1OworCisgICAgICAgIFJlZmxlY3Rpb25BY3Rpb25XaXRob3V0UGFyYW1zKGludCB2aWV3SWQsIFN0cmluZyBtZXRob2ROYW1lKSB7CisgICAgICAgICAgICB0aGlzLnZpZXdJZCA9IHZpZXdJZDsKKyAgICAgICAgICAgIHRoaXMubWV0aG9kTmFtZSA9IG1ldGhvZE5hbWU7CisgICAgICAgIH0KKworICAgICAgICBSZWZsZWN0aW9uQWN0aW9uV2l0aG91dFBhcmFtcyhQYXJjZWwgaW4pIHsKKyAgICAgICAgICAgIHRoaXMudmlld0lkID0gaW4ucmVhZEludCgpOworICAgICAgICAgICAgdGhpcy5tZXRob2ROYW1lID0gaW4ucmVhZFN0cmluZygpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgd3JpdGVUb1BhcmNlbChQYXJjZWwgb3V0LCBpbnQgZmxhZ3MpIHsKKyAgICAgICAgICAgIG91dC53cml0ZUludChUQUcpOworICAgICAgICAgICAgb3V0LndyaXRlSW50KHRoaXMudmlld0lkKTsKKyAgICAgICAgICAgIG91dC53cml0ZVN0cmluZyh0aGlzLm1ldGhvZE5hbWUpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIGFwcGx5KFZpZXcgcm9vdCkgeworICAgICAgICAgICAgZmluYWwgVmlldyB2aWV3ID0gcm9vdC5maW5kVmlld0J5SWQodmlld0lkKTsKKyAgICAgICAgICAgIGlmICh2aWV3ID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQWN0aW9uRXhjZXB0aW9uKCJjYW4ndCBmaW5kIHZpZXc6IDB4IiArIEludGVnZXIudG9IZXhTdHJpbmcodmlld0lkKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIENsYXNzIGtsYXNzID0gdmlldy5nZXRDbGFzcygpOworICAgICAgICAgICAgTWV0aG9kIG1ldGhvZDsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgbWV0aG9kID0ga2xhc3MuZ2V0TWV0aG9kKHRoaXMubWV0aG9kTmFtZSk7CisgICAgICAgICAgICB9IGNhdGNoIChOb1N1Y2hNZXRob2RFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQWN0aW9uRXhjZXB0aW9uKCJ2aWV3OiAiICsga2xhc3MuZ2V0TmFtZSgpICsgIiBkb2Vzbid0IGhhdmUgbWV0aG9kOiAiCisgICAgICAgICAgICAgICAgICAgICAgICArIHRoaXMubWV0aG9kTmFtZSArICIoKSIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIW1ldGhvZC5pc0Fubm90YXRpb25QcmVzZW50KFJlbW90YWJsZVZpZXdNZXRob2QuY2xhc3MpKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFjdGlvbkV4Y2VwdGlvbigidmlldzogIiArIGtsYXNzLmdldE5hbWUoKQorICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGNhbid0IHVzZSBtZXRob2Qgd2l0aCBSZW1vdGVWaWV3czogIgorICAgICAgICAgICAgICAgICAgICAgICAgKyB0aGlzLm1ldGhvZE5hbWUgKyAiKCkiKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAvL25vaW5zcGVjdGlvbiBDb25zdGFudElmU3RhdGVtZW50CisgICAgICAgICAgICAgICAgaWYgKGZhbHNlKSB7CisgICAgICAgICAgICAgICAgICAgIExvZy5kKCJSZW1vdGVWaWV3cyIsICJ2aWV3OiAiICsga2xhc3MuZ2V0TmFtZSgpICsgIiBjYWxsaW5nIG1ldGhvZDogIgorICAgICAgICAgICAgICAgICAgICAgICAgKyB0aGlzLm1ldGhvZE5hbWUgKyAiKCkiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbWV0aG9kLmludm9rZSh2aWV3KTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBBY3Rpb25FeGNlcHRpb24oZXgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCiAgICAgLyoqCiAgICAgICogQmFzZSBjbGFzcyBmb3IgdGhlIHJlZmxlY3Rpb24gYWN0aW9ucy4KICAgICAgKi8KQEAgLTI4NSw2ICszNzksNyBAQAogICAgICAgICBzdGF0aWMgZmluYWwgaW50IFVSSSA9IDExOwogICAgICAgICBzdGF0aWMgZmluYWwgaW50IEJJVE1BUCA9IDEyOwogICAgICAgICBzdGF0aWMgZmluYWwgaW50IEJVTkRMRSA9IDEzOworICAgICAgICBzdGF0aWMgZmluYWwgaW50IElOVEVOVCA9IDE0OwogCiAgICAgICAgIGludCB2aWV3SWQ7CiAgICAgICAgIFN0cmluZyBtZXRob2ROYW1lOwpAQCAtMzQ3LDYgKzQ0Miw5IEBACiAgICAgICAgICAgICAgICAgY2FzZSBCVU5ETEU6CiAgICAgICAgICAgICAgICAgICAgIHRoaXMudmFsdWUgPSBpbi5yZWFkQnVuZGxlKCk7CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgSU5URU5UOgorICAgICAgICAgICAgICAgICAgICB0aGlzLnZhbHVlID0gSW50ZW50LkNSRUFUT1IuY3JlYXRlRnJvbVBhcmNlbChpbik7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQpAQCAtNDAyLDYgKzUwMCw5IEBACiAgICAgICAgICAgICAgICAgY2FzZSBCVU5ETEU6CiAgICAgICAgICAgICAgICAgICAgIG91dC53cml0ZUJ1bmRsZSgoQnVuZGxlKSB0aGlzLnZhbHVlKTsKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBJTlRFTlQ6CisgICAgICAgICAgICAgICAgICAgICgoSW50ZW50KXRoaXMudmFsdWUpLndyaXRlVG9QYXJjZWwob3V0LCBmbGFncyk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQpAQCAtNDM1LDYgKzUzNiw4IEBACiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCaXRtYXAuY2xhc3M7CiAgICAgICAgICAgICAgICAgY2FzZSBCVU5ETEU6CiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCdW5kbGUuY2xhc3M7CisgICAgICAgICAgICAgICAgY2FzZSBJTlRFTlQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBJbnRlbnQuY2xhc3M7CiAgICAgICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICAgICB9CkBAIC01NjIsNiArNjY1LDEyIEBACiAgICAgICAgICAgICAgICAgY2FzZSBWaWV3R3JvdXBBY3Rpb24uVEFHOgogICAgICAgICAgICAgICAgICAgICBtQWN0aW9ucy5hZGQobmV3IFZpZXdHcm91cEFjdGlvbihwYXJjZWwpKTsKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBSZWZsZWN0aW9uQWN0aW9uV2l0aG91dFBhcmFtcy5UQUc6CisgICAgICAgICAgICAgICAgICAgIG1BY3Rpb25zLmFkZChuZXcgUmVmbGVjdGlvbkFjdGlvbldpdGhvdXRQYXJhbXMocGFyY2VsKSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgU2V0RW1wdHlWaWV3LlRBRzoKKyAgICAgICAgICAgICAgICAgICAgbUFjdGlvbnMuYWRkKG5ldyBTZXRFbXB0eVZpZXcocGFyY2VsKSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBBY3Rpb25FeGNlcHRpb24oIlRhZyAiICsgdGFnICsgIiBub3QgZm91bmQiKTsKICAgICAgICAgICAgICAgICB9CkBAIC01NjksNiArNjc4LDcgQEAKICAgICAgICAgfQogICAgIH0KIAorICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBSZW1vdGVWaWV3cyBjbG9uZSgpIHsKICAgICAgICAgZmluYWwgUmVtb3RlVmlld3MgdGhhdCA9IG5ldyBSZW1vdGVWaWV3cyhtUGFja2FnZSwgbUxheW91dElkKTsKICAgICAgICAgaWYgKG1BY3Rpb25zICE9IG51bGwpIHsKQEAgLTYyMiw2ICs3MzIsMjQgQEAKICAgICB9CiAKICAgICAvKioKKyAgICAgKiBFcXVpdmFsZW50IHRvIGNhbGxpbmcge0BsaW5rIEFkYXB0ZXJWaWV3RmxpcHBlciNzaG93TmV4dCgpfQorICAgICAqCisgICAgICogQHBhcmFtIHZpZXdJZCBUaGUgaWQgb2YgdGhlIHZpZXcgb24gd2hpY2ggdG8gY2FsbCB7QGxpbmsgQWRhcHRlclZpZXdGbGlwcGVyI3Nob3dOZXh0KCl9CisgICAgICovCisgICAgcHVibGljIHZvaWQgc2hvd05leHQoaW50IHZpZXdJZCkgeworICAgICAgICBhZGRBY3Rpb24obmV3IFJlZmxlY3Rpb25BY3Rpb25XaXRob3V0UGFyYW1zKHZpZXdJZCwgInNob3dOZXh0IikpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEVxdWl2YWxlbnQgdG8gY2FsbGluZyB7QGxpbmsgQWRhcHRlclZpZXdGbGlwcGVyI3Nob3dQcmV2aW91cygpfQorICAgICAqCisgICAgICogQHBhcmFtIHZpZXdJZCBUaGUgaWQgb2YgdGhlIHZpZXcgb24gd2hpY2ggdG8gY2FsbCB7QGxpbmsgQWRhcHRlclZpZXdGbGlwcGVyI3Nob3dQcmV2aW91cygpfQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNob3dQcmV2aW91cyhpbnQgdmlld0lkKSB7CisgICAgICAgIGFkZEFjdGlvbihuZXcgUmVmbGVjdGlvbkFjdGlvbldpdGhvdXRQYXJhbXModmlld0lkLCAic2hvd1ByZXZpb3VzIikpOworICAgIH0KKworICAgIC8qKgogICAgICAqIEVxdWl2YWxlbnQgdG8gY2FsbGluZyBWaWV3LnNldFZpc2liaWxpdHkKICAgICAgKiAKICAgICAgKiBAcGFyYW0gdmlld0lkIFRoZSBpZCBvZiB0aGUgdmlldyB3aG9zZSB2aXNpYmlsaXR5IHNob3VsZCBjaGFuZ2UKQEAgLTY3Miw2ICs4MDAsMTYgQEAKICAgICB9CiAKICAgICAvKioKKyAgICAgKiBFcXVpdmFsZW50IHRvIGNhbGxpbmcgQWRhcHRlclZpZXcuc2V0RW1wdHlWaWV3CisgICAgICoKKyAgICAgKiBAcGFyYW0gdmlld0lkIFRoZSBpZCBvZiB0aGUgdmlldyBvbiB3aGljaCB0byBzZXQgdGhlIGVtcHR5IHZpZXcKKyAgICAgKiBAcGFyYW0gZW1wdHlWaWV3SWQgVGhlIHZpZXcgaWQgb2YgdGhlIGVtcHR5IHZpZXcKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRFbXB0eVZpZXcoaW50IHZpZXdJZCwgaW50IGVtcHR5Vmlld0lkKSB7CisgICAgICAgIGFkZEFjdGlvbihuZXcgU2V0RW1wdHlWaWV3KHZpZXdJZCwgZW1wdHlWaWV3SWQpKTsKKyAgICB9CisKKyAgICAvKioKICAgICAgKiBFcXVpdmFsZW50IHRvIGNhbGxpbmcge0BsaW5rIENocm9ub21ldGVyI3NldEJhc2UgQ2hyb25vbWV0ZXIuc2V0QmFzZX0sCiAgICAgICoge0BsaW5rIENocm9ub21ldGVyI3NldEZvcm1hdCBDaHJvbm9tZXRlci5zZXRGb3JtYXR9LAogICAgICAqIGFuZCB7QGxpbmsgQ2hyb25vbWV0ZXIjc3RhcnQgQ2hyb25vbWV0ZXIuc3RhcnQoKX0gb3IKQEAgLTc2OSw2ICs5MDcsMzcgQEAKICAgICB9CiAKICAgICAvKioKKyAgICAgKiBFcXVpdmFsZW50IHRvIGNhbGxpbmcge0BsaW5rIGFuZHJvaWQud2lkZ2V0LkFic0xpc3RWaWV3I3NldFJlbW90ZVZpZXdzQWRhcHRlcihJbnRlbnQpfS4KKyAgICAgKgorICAgICAqIEBwYXJhbSB2aWV3SWQgVGhlIGlkIG9mIHRoZSB2aWV3IHdob3NlIHRleHQgc2hvdWxkIGNoYW5nZQorICAgICAqIEBwYXJhbSBpbnRlbnQgVGhlIGludGVudCBvZiB0aGUgc2VydmljZSB3aGljaCB3aWxsIGJlCisgICAgICogICAgICAgICAgICBwcm92aWRpbmcgZGF0YSB0byB0aGUgUmVtb3RlVmlld3NBZGFwdGVyCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UmVtb3RlQWRhcHRlcihpbnQgdmlld0lkLCBJbnRlbnQgaW50ZW50KSB7CisgICAgICAgIHNldEludGVudCh2aWV3SWQsICJzZXRSZW1vdGVWaWV3c0FkYXB0ZXIiLCBpbnRlbnQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEVxdWl2YWxlbnQgdG8gY2FsbGluZyB7QGxpbmsgYW5kcm9pZC53aWRnZXQuQWJzTGlzdFZpZXcjc21vb3RoU2Nyb2xsVG9Qb3NpdGlvbihpbnQsIGludCl9LgorICAgICAqCisgICAgICogQHBhcmFtIHZpZXdJZCBUaGUgaWQgb2YgdGhlIHZpZXcgd2hvc2UgdGV4dCBzaG91bGQgY2hhbmdlCisgICAgICogQHBhcmFtIHBvc2l0aW9uIFNjcm9sbCB0byB0aGlzIGFkYXB0ZXIgcG9zaXRpb24KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRTY3JvbGxQb3NpdGlvbihpbnQgdmlld0lkLCBpbnQgcG9zaXRpb24pIHsKKyAgICAgICAgc2V0SW50KHZpZXdJZCwgInNtb290aFNjcm9sbFRvUG9zaXRpb24iLCBwb3NpdGlvbik7CisgICAgfQorCisgICAgLyoqCisgICAgICogRXF1aXZhbGVudCB0byBjYWxsaW5nIHtAbGluayBhbmRyb2lkLndpZGdldC5BYnNMaXN0VmlldyNzbW9vdGhTY3JvbGxUb1Bvc2l0aW9uKGludCwgaW50KX0uCisgICAgICoKKyAgICAgKiBAcGFyYW0gdmlld0lkIFRoZSBpZCBvZiB0aGUgdmlldyB3aG9zZSB0ZXh0IHNob3VsZCBjaGFuZ2UKKyAgICAgKiBAcGFyYW0gb2Zmc2V0IFNjcm9sbCBieSB0aGlzIGFkYXB0ZXIgcG9zaXRpb24gb2Zmc2V0CisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UmVsYXRpdmVTY3JvbGxQb3NpdGlvbihpbnQgdmlld0lkLCBpbnQgb2Zmc2V0KSB7CisgICAgICAgIHNldEludCh2aWV3SWQsICJzbW9vdGhTY3JvbGxCeU9mZnNldCIsIG9mZnNldCk7CisgICAgfQorCisgICAgLyoqCiAgICAgICogQ2FsbCBhIG1ldGhvZCB0YWtpbmcgb25lIGJvb2xlYW4gb24gYSB2aWV3IGluIHRoZSBsYXlvdXQgZm9yIHRoaXMgUmVtb3RlVmlld3MuCiAgICAgICoKICAgICAgKiBAcGFyYW0gdmlld0lkIFRoZSBpZCBvZiB0aGUgdmlldyB3aG9zZSB0ZXh0IHNob3VsZCBjaGFuZ2UKQEAgLTkxNSw2ICsxMDg0LDE2IEBACiAgICAgfQogCiAgICAgLyoqCisgICAgICoKKyAgICAgKiBAcGFyYW0gdmlld0lkCisgICAgICogQHBhcmFtIG1ldGhvZE5hbWUKKyAgICAgKiBAcGFyYW0gdmFsdWUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRJbnRlbnQoaW50IHZpZXdJZCwgU3RyaW5nIG1ldGhvZE5hbWUsIEludGVudCB2YWx1ZSkgeworICAgICAgICBhZGRBY3Rpb24obmV3IFJlZmxlY3Rpb25BY3Rpb24odmlld0lkLCBtZXRob2ROYW1lLCBSZWZsZWN0aW9uQWN0aW9uLklOVEVOVCwgdmFsdWUpKTsKKyAgICB9CisKKyAgICAvKioKICAgICAgKiBJbmZsYXRlcyB0aGUgdmlldyBoaWVyYXJjaHkgcmVwcmVzZW50ZWQgYnkgdGhpcyBvYmplY3QgYW5kIGFwcGxpZXMKICAgICAgKiBhbGwgb2YgdGhlIGFjdGlvbnMuCiAgICAgICogCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvUmVtb3RlVmlld3NBZGFwdGVyLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvUmVtb3RlVmlld3NBZGFwdGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzBiOWQ1OQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9SZW1vdGVWaWV3c0FkYXB0ZXIuamF2YQpAQCAtMCwwICsxLDc1NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC53aWRnZXQ7CisKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbXBvbmVudE5hbWU7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuU2VydmljZUNvbm5lY3Rpb247CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5Db2xvcjsKK2ltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyVGhyZWFkOworaW1wb3J0IGFuZHJvaWQub3MuSUJpbmRlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLkxvb3BlcjsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworaW1wb3J0IGFuZHJvaWQudmlldy5HcmF2aXR5OworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3R3JvdXA7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXcuTWVhc3VyZVNwZWM7CisKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC53aWRnZXQuSVJlbW90ZVZpZXdzRmFjdG9yeTsKKworLyoqCisgKiBBbiBhZGFwdGVyIHRvIGEgUmVtb3RlVmlld3NTZXJ2aWNlIHdoaWNoIGZldGNoZXMgYW5kIGNhY2hlcyBSZW1vdGVWaWV3cworICogdG8gYmUgbGF0ZXIgaW5mbGF0ZWQgYXMgY2hpbGQgdmlld3MuCisgKi8KKy8qKiBAaGlkZSAqLworcHVibGljIGNsYXNzIFJlbW90ZVZpZXdzQWRhcHRlciBleHRlbmRzIEJhc2VBZGFwdGVyIHsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIlJlbW90ZVZpZXdzQWRhcHRlciI7CisKKyAgICBwcml2YXRlIENvbnRleHQgbUNvbnRleHQ7CisgICAgcHJpdmF0ZSBJbnRlbnQgbUludGVudDsKKyAgICBwcml2YXRlIFJlbW90ZVZpZXdzQWRhcHRlclNlcnZpY2VDb25uZWN0aW9uIG1TZXJ2aWNlQ29ubmVjdGlvbjsKKyAgICBwcml2YXRlIFJlbW90ZVZpZXdzQ2FjaGUgbVZpZXdDYWNoZTsKKworICAgIHByaXZhdGUgSGFuZGxlclRocmVhZCBtV29ya2VyVGhyZWFkOworICAgIC8vIGl0ZW1zIG1heSBiZSBpbnRlcnJ1cHRlZCB3aXRoaW4gdGhlIG5vcm1hbGx5IHByb2Nlc3NlZCBxdWV1ZXMKKyAgICBwcml2YXRlIEhhbmRsZXIgbVdvcmtlclF1ZXVlOworICAgIHByaXZhdGUgSGFuZGxlciBtTWFpblF1ZXVlOworICAgIC8vIGl0ZW1zIGFyZSBuZXZlciBkZXF1ZXVlZCBmcm9tIHRoZSBwcmlvcml0eSBxdWV1ZSBhbmQgbXVzdCBydW4KKyAgICBwcml2YXRlIEhhbmRsZXIgbVdvcmtlclByaW9yaXR5UXVldWU7CisgICAgcHJpdmF0ZSBIYW5kbGVyIG1NYWluUHJpb3JpdHlRdWV1ZTsKKworICAgIC8qKgorICAgICAqIEFuIGludGVyZmFjZSBmb3IgdGhlIFJlbW90ZUFkYXB0ZXIgdG8gbm90aWZ5IG90aGVyIGNsYXNzZXMgd2hlbiBhZGFwdGVycworICAgICAqIGFyZSBhY3R1YWxseSBjb25uZWN0ZWQgdG8vZGlzY29ubmVjdGVkIGZyb20gdGhlaXIgYWN0dWFsIHNlcnZpY2VzLgorICAgICAqLworICAgIHB1YmxpYyBpbnRlcmZhY2UgUmVtb3RlQWRhcHRlckNvbm5lY3Rpb25DYWxsYmFjayB7CisgICAgICAgIHB1YmxpYyB2b2lkIG9uUmVtb3RlQWRhcHRlckNvbm5lY3RlZCgpOworCisgICAgICAgIHB1YmxpYyB2b2lkIG9uUmVtb3RlQWRhcHRlckRpc2Nvbm5lY3RlZCgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSBzZXJ2aWNlIGNvbm5lY3Rpb24gdGhhdCBnZXRzIHBvcHVsYXRlZCB3aGVuIHRoZSBSZW1vdGVWaWV3c1NlcnZpY2UgaXMKKyAgICAgKiBib3VuZC4KKyAgICAgKi8KKyAgICBwcml2YXRlIGNsYXNzIFJlbW90ZVZpZXdzQWRhcHRlclNlcnZpY2VDb25uZWN0aW9uIGltcGxlbWVudHMgU2VydmljZUNvbm5lY3Rpb24geworICAgICAgICBwcml2YXRlIGJvb2xlYW4gbUNvbm5lY3RlZDsKKyAgICAgICAgcHJpdmF0ZSBJUmVtb3RlVmlld3NGYWN0b3J5IG1SZW1vdGVWaWV3c0ZhY3Rvcnk7CisgICAgICAgIHByaXZhdGUgUmVtb3RlQWRhcHRlckNvbm5lY3Rpb25DYWxsYmFjayBtQ2FsbGJhY2s7CisKKyAgICAgICAgcHVibGljIFJlbW90ZVZpZXdzQWRhcHRlclNlcnZpY2VDb25uZWN0aW9uKFJlbW90ZUFkYXB0ZXJDb25uZWN0aW9uQ2FsbGJhY2sgY2FsbGJhY2spIHsKKyAgICAgICAgICAgIG1DYWxsYmFjayA9IGNhbGxiYWNrOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgb25TZXJ2aWNlQ29ubmVjdGVkKENvbXBvbmVudE5hbWUgbmFtZSwgSUJpbmRlciBzZXJ2aWNlKSB7CisgICAgICAgICAgICBtUmVtb3RlVmlld3NGYWN0b3J5ID0gSVJlbW90ZVZpZXdzRmFjdG9yeS5TdHViLmFzSW50ZXJmYWNlKHNlcnZpY2UpOworICAgICAgICAgICAgbUNvbm5lY3RlZCA9IHRydWU7CisKKyAgICAgICAgICAgIC8vIG5vdGlmeURhdGFTZXRDaGFuZ2VkIHNob3VsZCBiZSBjYWxsZWQgZmlyc3QsIHRvIGVuc3VyZSB0aGF0IHRoZQorICAgICAgICAgICAgLy8gdmlld3MgYXJlIG5vdCB1cGRhdGVkIHR3aWNlCisgICAgICAgICAgICBub3RpZnlEYXRhU2V0Q2hhbmdlZCgpOworCisgICAgICAgICAgICAvLyBwb3N0IGEgbmV3IHJ1bm5hYmxlIHRvIGxvYWQgdGhlIGFwcHJvcHJpYXRlIGRhdGEsIHRoZW4gY2FsbGJhY2sKKyAgICAgICAgICAgIG1Xb3JrZXJQcmlvcml0eVF1ZXVlLnBvc3QobmV3IFJ1bm5hYmxlKCkgeworICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gd2UgbmVlZCB0byBnZXQgdGhlIHZpZXdUeXBlQ291bnQgc3BlY2lmaWNhbGx5LCBzbyBqdXN0IGdldCBhbGwgdGhlCisgICAgICAgICAgICAgICAgICAgIC8vIG1ldGFkYXRhCisgICAgICAgICAgICAgICAgICAgIG1WaWV3Q2FjaGUucmVxdWVzdE1ldGFEYXRhKCk7CisKKyAgICAgICAgICAgICAgICAgICAgLy8gcG9zdCBhIHJ1bm5hYmxlIHRvIGNhbGwgdGhlIGNhbGxiYWNrIG9uIHRoZSBtYWluIHRocmVhZAorICAgICAgICAgICAgICAgICAgICBtTWFpblByaW9yaXR5UXVldWUucG9zdChuZXcgUnVubmFibGUoKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobUNhbGxiYWNrICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1DYWxsYmFjay5vblJlbW90ZUFkYXB0ZXJDb25uZWN0ZWQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisKKyAgICAgICAgICAgIC8vIHN0YXJ0IHRoZSBiYWNrZ3JvdW5kIGxvYWRlcgorICAgICAgICAgICAgbVZpZXdDYWNoZS5zdGFydEJhY2tncm91bmRMb2FkZXIoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIG9uU2VydmljZURpc2Nvbm5lY3RlZChDb21wb25lbnROYW1lIG5hbWUpIHsKKyAgICAgICAgICAgIG1SZW1vdGVWaWV3c0ZhY3RvcnkgPSBudWxsOworICAgICAgICAgICAgbUNvbm5lY3RlZCA9IGZhbHNlOworCisgICAgICAgICAgICAvLyBjbGVhciB0aGUgbWFpbi93b3JrZXIgcXVldWVzCisgICAgICAgICAgICBtTWFpblF1ZXVlLnJlbW92ZU1lc3NhZ2VzKDApOworICAgICAgICAgICAgCisgICAgICAgICAgICAvLyBzdG9wIHRoZSBiYWNrZ3JvdW5kIGxvYWRlcgorICAgICAgICAgICAgbVZpZXdDYWNoZS5zdG9wQmFja2dyb3VuZExvYWRlcigpOworCisgICAgICAgICAgICBpZiAobUNhbGxiYWNrICE9IG51bGwpCisgICAgICAgICAgICAgICAgbUNhbGxiYWNrLm9uUmVtb3RlQWRhcHRlckRpc2Nvbm5lY3RlZCgpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIElSZW1vdGVWaWV3c0ZhY3RvcnkgZ2V0UmVtb3RlVmlld3NGYWN0b3J5KCkgeworICAgICAgICAgICAgcmV0dXJuIG1SZW1vdGVWaWV3c0ZhY3Rvcnk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc0Nvbm5lY3RlZCgpIHsKKyAgICAgICAgICAgIHJldHVybiBtQ29ubmVjdGVkOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQW4gaW50ZXJuYWwgY2FjaGUgb2YgcmVtb3RlIHZpZXdzLgorICAgICAqLworICAgIHByaXZhdGUgY2xhc3MgUmVtb3RlVmlld3NDYWNoZSB7CisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiUmVtb3RlVmlld3NDYWNoZSI7CisKKyAgICAgICAgcHJpdmF0ZSBSZW1vdGVWaWV3c0luZm8gbVZpZXdDYWNoZUluZm87CisgICAgICAgIHByaXZhdGUgUmVtb3RlVmlld3NJbmRleEluZm9bXSBtVmlld0NhY2hlOworICAgICAgICBwcml2YXRlIGludFtdIG1UbXBWaWV3Q2FjaGVMb2FkSW5kaWNlczsKKyAgICAgICAgcHJpdmF0ZSBMaW5rZWRMaXN0PEludGVnZXI+IG1WaWV3Q2FjaGVMb2FkSW5kaWNlczsKKyAgICAgICAgcHJpdmF0ZSBib29sZWFuIG1CYWNrZ3JvdW5kTG9hZGVyRW5hYmxlZDsKKworICAgICAgICAvLyBpZiBhIHVzZXIgbG9hZGluZyB2aWV3IGlzIG5vdCBwcm92aWRlZCwgdGhlbiB3ZSBjcmVhdGUgYSB0ZW1wb3Jhcnkgb25lCisgICAgICAgIC8vIGZvciB0aGUgdXNlciB1c2luZyB0aGUgaGVpZ2h0IG9mIHRoZSBmaXJzdCB2aWV3CisgICAgICAgIHByaXZhdGUgUmVtb3RlVmlld3MgbVVzZXJMb2FkaW5nVmlldzsKKyAgICAgICAgcHJpdmF0ZSBSZW1vdGVWaWV3cyBtRmlyc3RWaWV3OworICAgICAgICBwcml2YXRlIGludCBtRmlyc3RWaWV3SGVpZ2h0OworCisgICAgICAgIC8vIGRldGVybWluZXMgd2hlbiB0aGUgY3VycmVudCBjYWNoZSB3aW5kb3cgbmVlZHMgdG8gYmUgdXBkYXRlZCB3aXRoIG5ldworICAgICAgICAvLyBpdGVtcyAoaWUuIHdoZW4gdGhlcmUgaXMgbm90IGVub3VnaCBzbGFjaykKKyAgICAgICAgcHJpdmF0ZSBpbnQgbVZpZXdDYWNoZVN0YXJ0UG9zaXRpb247CisgICAgICAgIHByaXZhdGUgaW50IG1WaWV3Q2FjaGVFbmRQb3NpdGlvbjsKKyAgICAgICAgcHJpdmF0ZSBpbnQgbUhhbGZDYWNoZVNpemU7CisgICAgICAgIHByaXZhdGUgaW50IG1DYWNoZVNsYWNrOworICAgICAgICBwcml2YXRlIGZpbmFsIGZsb2F0IG1DYWNoZVNsYWNrUGVyY2VudGFnZSA9IDAuNzVmOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgZGF0YSBzdHJ1Y3R1cmUgc3RvcmVkIGF0IGVhY2ggaW5kZXggb2YgdGhlIGNhY2hlLiBBbnkgbWVtYmVyIAorICAgICAgICAgKiB0aGF0IGlzIG5vdCBpbnZhbGlkYXRlZCBwZXJzaXN0cyB0aHJvdWdob3V0IHRoZSBsaWZldGltZSBvZiB0aGUgY2FjaGUuCisgICAgICAgICAqLworICAgICAgICBwcml2YXRlIGNsYXNzIFJlbW90ZVZpZXdzSW5kZXhJbmZvIHsKKyAgICAgICAgICAgIEZyYW1lTGF5b3V0IGZsaXBwZXI7CisgICAgICAgICAgICBSZW1vdGVWaWV3cyB2aWV3OworICAgICAgICAgICAgbG9uZyBpdGVtSWQ7CisgICAgICAgICAgICBpbnQgdHlwZUlkOworCisgICAgICAgICAgICBSZW1vdGVWaWV3c0luZGV4SW5mbygpIHsKKyAgICAgICAgICAgICAgICBpbnZhbGlkYXRlKCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHZvaWQgc2V0KFJlbW90ZVZpZXdzIHYsIGxvbmcgaWQpIHsKKyAgICAgICAgICAgICAgICB2aWV3ID0gdjsKKyAgICAgICAgICAgICAgICBpdGVtSWQgPSBpZDsKKyAgICAgICAgICAgICAgICBpZiAodiAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICB0eXBlSWQgPSB2LmdldExheW91dElkKCk7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB0eXBlSWQgPSAwOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB2b2lkIGludmFsaWRhdGUoKSB7CisgICAgICAgICAgICAgICAgdmlldyA9IG51bGw7CisgICAgICAgICAgICAgICAgaXRlbUlkID0gMDsKKyAgICAgICAgICAgICAgICB0eXBlSWQgPSAwOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmaW5hbCBib29sZWFuIGlzVmFsaWQoKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuICh2aWV3ICE9IG51bGwpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFJlbW90ZSBhZGFwdGVyIG1ldGFkYXRhLiBVc2VmdWwgZm9yIHdoZW4gd2UgaGF2ZSB0byBsb2NrIG9uIHNvbWV0aGluZworICAgICAgICAgKiBiZWZvcmUgdXBkYXRpbmcgdGhlIG1ldGFkYXRhLgorICAgICAgICAgKi8KKyAgICAgICAgcHJpdmF0ZSBjbGFzcyBSZW1vdGVWaWV3c0luZm8geworICAgICAgICAgICAgaW50IGNvdW50OworICAgICAgICAgICAgaW50IHZpZXdUeXBlQ291bnQ7CisgICAgICAgICAgICBib29sZWFuIGhhc1N0YWJsZUlkczsKKyAgICAgICAgICAgIGJvb2xlYW4gaXNEYXRhRGlydHk7CisgICAgICAgICAgICBNYXA8SW50ZWdlciwgSW50ZWdlcj4gbVR5cGVJZEluZGV4TWFwOworCisgICAgICAgICAgICBSZW1vdGVWaWV3c0luZm8oKSB7CisgICAgICAgICAgICAgICAgY291bnQgPSAwOworICAgICAgICAgICAgICAgIC8vIGJ5IGRlZmF1bHQgdGhlcmUgaXMgYXQgbGVhc3Qgb25lIGR1bW15IHZpZXcgdHlwZQorICAgICAgICAgICAgICAgIHZpZXdUeXBlQ291bnQgPSAxOworICAgICAgICAgICAgICAgIGhhc1N0YWJsZUlkcyA9IHRydWU7CisgICAgICAgICAgICAgICAgaXNEYXRhRGlydHkgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICBtVHlwZUlkSW5kZXhNYXAgPSBuZXcgSGFzaE1hcDxJbnRlZ2VyLCBJbnRlZ2VyPigpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFJlbW90ZVZpZXdzQ2FjaGUoaW50IGhhbGZDYWNoZVNpemUpIHsKKyAgICAgICAgICAgIG1IYWxmQ2FjaGVTaXplID0gaGFsZkNhY2hlU2l6ZTsKKyAgICAgICAgICAgIG1DYWNoZVNsYWNrID0gTWF0aC5yb3VuZChtQ2FjaGVTbGFja1BlcmNlbnRhZ2UgKiBtSGFsZkNhY2hlU2l6ZSk7CisgICAgICAgICAgICBtVmlld0NhY2hlU3RhcnRQb3NpdGlvbiA9IDA7CisgICAgICAgICAgICBtVmlld0NhY2hlRW5kUG9zaXRpb24gPSAtMTsKKyAgICAgICAgICAgIG1CYWNrZ3JvdW5kTG9hZGVyRW5hYmxlZCA9IGZhbHNlOworCisgICAgICAgICAgICAvLyBpbml0aWFsaXplIHRoZSBjYWNoZQorICAgICAgICAgICAgaW50IGNhY2hlU2l6ZSA9IDIgKiBtSGFsZkNhY2hlU2l6ZSArIDE7CisgICAgICAgICAgICBtVmlld0NhY2hlSW5mbyA9IG5ldyBSZW1vdGVWaWV3c0luZm8oKTsKKyAgICAgICAgICAgIG1WaWV3Q2FjaGUgPSBuZXcgUmVtb3RlVmlld3NJbmRleEluZm9bY2FjaGVTaXplXTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbVZpZXdDYWNoZS5sZW5ndGg7ICsraSkgeworICAgICAgICAgICAgICAgIG1WaWV3Q2FjaGVbaV0gPSBuZXcgUmVtb3RlVmlld3NJbmRleEluZm8oKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1UbXBWaWV3Q2FjaGVMb2FkSW5kaWNlcyA9IG5ldyBpbnRbY2FjaGVTaXplXTsKKyAgICAgICAgICAgIG1WaWV3Q2FjaGVMb2FkSW5kaWNlcyA9IG5ldyBMaW5rZWRMaXN0PEludGVnZXI+KCk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIGZpbmFsIGJvb2xlYW4gY29udGFpbnMoaW50IHBvc2l0aW9uKSB7CisgICAgICAgICAgICByZXR1cm4gKG1WaWV3Q2FjaGVTdGFydFBvc2l0aW9uIDw9IHBvc2l0aW9uKSAmJiAocG9zaXRpb24gPD0gbVZpZXdDYWNoZUVuZFBvc2l0aW9uKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgZmluYWwgYm9vbGVhbiBjb250YWluc0FuZElzVmFsaWQoaW50IHBvc2l0aW9uKSB7CisgICAgICAgICAgICBpZiAoY29udGFpbnMocG9zaXRpb24pKSB7CisgICAgICAgICAgICAgICAgUmVtb3RlVmlld3NJbmRleEluZm8gaW5kZXhJbmZvID0gbVZpZXdDYWNoZVtnZXRDYWNoZUluZGV4KHBvc2l0aW9uKV07CisgICAgICAgICAgICAgICAgaWYgKGluZGV4SW5mby5pc1ZhbGlkKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBpbnQgZ2V0Q2FjaGVJbmRleChpbnQgcG9zaXRpb24pIHsKKyAgICAgICAgICAgIC8vIHRha2UgdGhlIG1vZHVsbyBvZiB0aGUgcG9zaXRpb24KKyAgICAgICAgICAgIGZpbmFsIGludCBjYWNoZVNpemUgPSBtVmlld0NhY2hlLmxlbmd0aDsKKyAgICAgICAgICAgIHJldHVybiAoY2FjaGVTaXplICsgKHBvc2l0aW9uICUgY2FjaGVTaXplKSkgJSBjYWNoZVNpemU7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCByZXF1ZXN0TWV0YURhdGEoKSB7CisgICAgICAgICAgICBpZiAobVNlcnZpY2VDb25uZWN0aW9uLmlzQ29ubmVjdGVkKCkpIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBJUmVtb3RlVmlld3NGYWN0b3J5IGZhY3RvcnkgPSBtU2VydmljZUNvbm5lY3Rpb24uZ2V0UmVtb3RlVmlld3NGYWN0b3J5KCk7CisKKyAgICAgICAgICAgICAgICAgICAgLy8gZ2V0IHRoZSBwcm9wZXJ0aWVzL2ZpcnN0IHZpZXcgKHNvIHRoYXQgd2UgY2FuIHVzZSBpdCB0bworICAgICAgICAgICAgICAgICAgICAvLyBtZWFzdXJlIG91ciBkdW1teSB2aWV3cykKKyAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBoYXNTdGFibGVJZHMgPSBmYWN0b3J5Lmhhc1N0YWJsZUlkcygpOworICAgICAgICAgICAgICAgICAgICBpbnQgdmlld1R5cGVDb3VudCA9IGZhY3RvcnkuZ2V0Vmlld1R5cGVDb3VudCgpOworICAgICAgICAgICAgICAgICAgICBpbnQgY291bnQgPSBmYWN0b3J5LmdldENvdW50KCk7CisgICAgICAgICAgICAgICAgICAgIFJlbW90ZVZpZXdzIGxvYWRpbmdWaWV3ID0gZmFjdG9yeS5nZXRMb2FkaW5nVmlldygpOworICAgICAgICAgICAgICAgICAgICBSZW1vdGVWaWV3cyBmaXJzdFZpZXcgPSBudWxsOworICAgICAgICAgICAgICAgICAgICBpZiAoKGNvdW50ID4gMCkgJiYgKGxvYWRpbmdWaWV3ID09IG51bGwpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdFZpZXcgPSBmYWN0b3J5LmdldFZpZXdBdCgwKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG1WaWV3Q2FjaGVJbmZvKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBSZW1vdGVWaWV3c0luZm8gaW5mbyA9IG1WaWV3Q2FjaGVJbmZvOworICAgICAgICAgICAgICAgICAgICAgICAgaW5mby5oYXNTdGFibGVJZHMgPSBoYXNTdGFibGVJZHM7CisgICAgICAgICAgICAgICAgICAgICAgICBpbmZvLnZpZXdUeXBlQ291bnQgPSB2aWV3VHlwZUNvdW50ICsgMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGluZm8uY291bnQgPSBjb3VudDsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1Vc2VyTG9hZGluZ1ZpZXcgPSBsb2FkaW5nVmlldzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmaXJzdFZpZXcgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1GaXJzdFZpZXcgPSBmaXJzdFZpZXc7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUZpcnN0Vmlld0hlaWdodCA9IC0xOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gcHJpbnQgdGhlIGVycm9yCisgICAgICAgICAgICAgICAgICAgIExvZy5lKFRBRywgIkVycm9yIGluIHJlcXVlc3RNZXRhRGF0YSgpOiAiICsgZS5nZXRNZXNzYWdlKCkpOworCisgICAgICAgICAgICAgICAgICAgIC8vIHJlc2V0IGFueSBtZW1iZXJzIGFmdGVyIHRoZSBmYWlsZWQgY2FsbAorICAgICAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG1WaWV3Q2FjaGVJbmZvKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBSZW1vdGVWaWV3c0luZm8gaW5mbyA9IG1WaWV3Q2FjaGVJbmZvOworICAgICAgICAgICAgICAgICAgICAgICAgaW5mby5oYXNTdGFibGVJZHMgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGluZm8udmlld1R5cGVDb3VudCA9IDE7CisgICAgICAgICAgICAgICAgICAgICAgICBpbmZvLmNvdW50ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1Vc2VyTG9hZGluZ1ZpZXcgPSBudWxsOworICAgICAgICAgICAgICAgICAgICAgICAgbUZpcnN0VmlldyA9IG51bGw7CisgICAgICAgICAgICAgICAgICAgICAgICBtRmlyc3RWaWV3SGVpZ2h0ID0gLTE7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwcm90ZWN0ZWQgdm9pZCBvbk5vdGlmeURhdGFTZXRDaGFuZ2VkKCkgeworICAgICAgICAgICAgLy8gd2UgbWFyayB0aGUgZGF0YSBhcyBkaXJ0eSBzbyB0aGF0IHRoZSBuZXh0IGNhbGwgdG8gZmV0Y2ggdmlld3Mgd2lsbCByZXN1bHQgaW4KKyAgICAgICAgICAgIC8vIGFuIG9uRGF0YVNldERpcnR5KCkgY2FsbCBmcm9tIHRoZSBhZGFwdGVyCisgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG1WaWV3Q2FjaGVJbmZvKSB7CisgICAgICAgICAgICAgICAgbVZpZXdDYWNoZUluZm8uaXNEYXRhRGlydHkgPSB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSB2b2lkIHVwZGF0ZU5vdGlmeURhdGFTZXRDaGFuZ2VkKCkgeworICAgICAgICAgICAgLy8gYWN0dWFsbHkgY2FsbHMgdGhyb3VnaCB0byB0aGUgZmFjdG9yeSB0byBub3RpZnkgaXQgdG8gdXBkYXRlCisgICAgICAgICAgICBpZiAobVNlcnZpY2VDb25uZWN0aW9uLmlzQ29ubmVjdGVkKCkpIHsKKyAgICAgICAgICAgICAgICBJUmVtb3RlVmlld3NGYWN0b3J5IGZhY3RvcnkgPSBtU2VydmljZUNvbm5lY3Rpb24uZ2V0UmVtb3RlVmlld3NGYWN0b3J5KCk7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgLy8gY2FsbCBiYWNrIHRvIHRoZSBmYWN0b3J5CisgICAgICAgICAgICAgICAgICAgIGZhY3Rvcnkub25EYXRhU2V0Q2hhbmdlZCgpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIHByaW50IHRoZSBlcnJvcgorICAgICAgICAgICAgICAgICAgICBMb2cuZShUQUcsICJFcnJvciBpbiB1cGRhdGVOb3RpZnlEYXRhU2V0Q2hhbmdlZCgpOiAiICsgZS5nZXRNZXNzYWdlKCkpOworCisgICAgICAgICAgICAgICAgICAgIC8vIHJldHVybiBlYXJseSB0byBwcmV2ZW50IGNvbnRhaW5lciBmcm9tIGJlaW5nIG5vdGlmaWVkIChub3RoaW5nIGhhcyBjaGFuZ2VkKQorICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyByZS1yZXF1ZXN0IHRoZSBuZXcgbWV0YWRhdGEgKG9ubHkgYWZ0ZXIgdGhlIG5vdGlmaWNhdGlvbiB0byB0aGUgZmFjdG9yeSkKKyAgICAgICAgICAgIHJlcXVlc3RNZXRhRGF0YSgpOworCisgICAgICAgICAgICAvLyBwb3N0IGEgbmV3IHJ1bm5hYmxlIG9uIHRoZSBtYWluIHRocmVhZCB0byBwcm9wYWdhdGUgdGhlIG5vdGlmaWNhdGlvbiBiYWNrCisgICAgICAgICAgICAvLyB0byB0aGUgYmFzZSBhZGFwdGVyCisgICAgICAgICAgICBtTWFpblF1ZXVlLnBvc3QobmV3IFJ1bm5hYmxlKCkgeworICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICAgICBjb21wbGV0ZU5vdGlmeURhdGFTZXRDaGFuZ2VkKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgICAgIH0KKworICAgICAgICBwcm90ZWN0ZWQgdm9pZCB1cGRhdGVSZW1vdGVWaWV3c0luZm8oaW50IHBvc2l0aW9uKSB7CisgICAgICAgICAgICBpZiAobVNlcnZpY2VDb25uZWN0aW9uLmlzQ29ubmVjdGVkKCkpIHsKKyAgICAgICAgICAgICAgICBJUmVtb3RlVmlld3NGYWN0b3J5IGZhY3RvcnkgPSBtU2VydmljZUNvbm5lY3Rpb24uZ2V0UmVtb3RlVmlld3NGYWN0b3J5KCk7CisKKyAgICAgICAgICAgICAgICAvLyBsb2FkIHRoZSBpdGVtIGluZm9ybWF0aW9uCisgICAgICAgICAgICAgICAgUmVtb3RlVmlld3MgcmVtb3RlVmlldyA9IG51bGw7CisgICAgICAgICAgICAgICAgbG9uZyBpdGVtSWQgPSAwOworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIHJlbW90ZVZpZXcgPSBmYWN0b3J5LmdldFZpZXdBdChwb3NpdGlvbik7CisgICAgICAgICAgICAgICAgICAgIGl0ZW1JZCA9IGZhY3RvcnkuZ2V0SXRlbUlkKHBvc2l0aW9uKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICAvLyBwcmludCB0aGUgZXJyb3IKKyAgICAgICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAiRXJyb3IgaW4gdXBkYXRlUmVtb3RlVmlld3NJbmZvKCIgKyBwb3NpdGlvbiArICIpOiAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgICAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisKKyAgICAgICAgICAgICAgICAgICAgLy8gcmV0dXJuIGVhcmx5IHRvIHByZXZlbnQgYWRkaXRpb25hbCB3b3JrIGluIHJlLWNlbnRlcmluZyB0aGUgdmlldyBjYWNoZSwgYW5kCisgICAgICAgICAgICAgICAgICAgIC8vIHN3YXBwaW5nIGZyb20gdGhlIGxvYWRpbmcgdmlldworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgc3luY2hyb25pemVkIChtVmlld0NhY2hlKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIHNraXAgaWYgdGhlIHdpbmRvdyBoYXMgbW92ZWQKKyAgICAgICAgICAgICAgICAgICAgaWYgKHBvc2l0aW9uIDwgbVZpZXdDYWNoZVN0YXJ0UG9zaXRpb24gfHwgcG9zaXRpb24gPiBtVmlld0NhY2hlRW5kUG9zaXRpb24pCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IHBvc2l0aW9uSW5kZXggPSBwb3NpdGlvbjsKKyAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IGNhY2hlSW5kZXggPSBnZXRDYWNoZUluZGV4KHBvc2l0aW9uKTsKKyAgICAgICAgICAgICAgICAgICAgbVZpZXdDYWNoZVtjYWNoZUluZGV4XS5zZXQocmVtb3RlVmlldywgaXRlbUlkKTsKKworICAgICAgICAgICAgICAgICAgICAvLyBub3RpZnkgdGhlIG1haW4gdGhyZWFkIHdoZW4gZG9uZSBsb2FkaW5nCisgICAgICAgICAgICAgICAgICAgIC8vIGZsdXNoIHBlbmRpbmcgdXBkYXRlcworICAgICAgICAgICAgICAgICAgICBtTWFpblF1ZXVlLnBvc3QobmV3IFJ1bm5hYmxlKCkgeworICAgICAgICAgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3dhcCB0aGUgbG9hZGVyIHZpZXcgZm9yIHRoaXMgdmlldworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5bmNocm9uaXplZCAobVZpZXdDYWNoZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29udGFpbnNBbmRJc1ZhbGlkKHBvc2l0aW9uSW5kZXgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZW1vdGVWaWV3c0luZGV4SW5mbyBpbmRleEluZm8gPSBtVmlld0NhY2hlW2NhY2hlSW5kZXhdOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRnJhbWVMYXlvdXQgZmxpcHBlciA9IGluZGV4SW5mby5mbGlwcGVyOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB1cGRhdGUgdGhlIGZsaXBwZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsaXBwZXIuZ2V0Q2hpbGRBdCgwKS5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIGFkZE5ld1ZpZXcgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZsaXBwZXIuZ2V0Q2hpbGRDb3VudCgpID4gMSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZpZXcgdiA9IGZsaXBwZXIuZ2V0Q2hpbGRBdCgxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdHlwZUlkID0gKChJbnRlZ2VyKSB2LmdldFRhZygpKS5pbnRWYWx1ZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlSWQgPT0gaW5kZXhJbmZvLnR5cGVJZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3ZSBjYW4gcmVhcHBseSBzaW5jZSBpdCBpcyB0aGUgc2FtZSB0eXBlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4SW5mby52aWV3LnJlYXBwbHkobUNvbnRleHQsIHYpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2LnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHYuZ2V0QW5pbWF0aW9uKCkgIT0gbnVsbCkgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2LmJ1aWxkRHJhd2luZ0NhY2hlKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZE5ld1ZpZXcgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGlwcGVyLnJlbW92ZVZpZXdBdCgxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYWRkTmV3VmlldykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZpZXcgdiA9IGluZGV4SW5mby52aWV3LmFwcGx5KG1Db250ZXh0LCBmbGlwcGVyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2LnNldFRhZyhuZXcgSW50ZWdlcihpbmRleEluZm8udHlwZUlkKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxpcHBlci5hZGRWaWV3KHYpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIFJlbW90ZVZpZXdzSW5kZXhJbmZvIHJlcXVlc3RDYWNoZWRJbmRleEluZm8oZmluYWwgaW50IHBvc2l0aW9uKSB7CisgICAgICAgICAgICBpbnQgaW5kaWNlc1RvTG9hZENvdW50ID0gMDsKKworICAgICAgICAgICAgc3luY2hyb25pemVkIChtVmlld0NhY2hlKSB7CisgICAgICAgICAgICAgICAgaWYgKGNvbnRhaW5zQW5kSXNWYWxpZChwb3NpdGlvbikpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gcmV0dXJuIHRoZSBpbmZvIGlmIGl0IGV4aXN0cyBpbiB0aGUgd2luZG93IGFuZCBpcyBsb2FkZWQKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1WaWV3Q2FjaGVbZ2V0Q2FjaGVJbmRleChwb3NpdGlvbildOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vIGlmIG5lY2Vzc2FyeSB1cGRhdGUgdGhlIHdpbmRvdyBhbmQgbG9hZCB0aGUgbmV3IGluZm9ybWF0aW9uCisgICAgICAgICAgICAgICAgaW50IGNlbnRlclBvc2l0aW9uID0gKG1WaWV3Q2FjaGVFbmRQb3NpdGlvbiArIG1WaWV3Q2FjaGVTdGFydFBvc2l0aW9uKSAvIDI7CisgICAgICAgICAgICAgICAgaWYgKChtVmlld0NhY2hlRW5kUG9zaXRpb24gPD0gbVZpZXdDYWNoZVN0YXJ0UG9zaXRpb24pIHx8IChNYXRoLmFicyhwb3NpdGlvbiAtIGNlbnRlclBvc2l0aW9uKSA+IG1DYWNoZVNsYWNrKSkgeworICAgICAgICAgICAgICAgICAgICBpbnQgbmV3U3RhcnRQb3NpdGlvbiA9IHBvc2l0aW9uIC0gbUhhbGZDYWNoZVNpemU7CisgICAgICAgICAgICAgICAgICAgIGludCBuZXdFbmRQb3NpdGlvbiA9IHBvc2l0aW9uICsgbUhhbGZDYWNoZVNpemU7CisgICAgICAgICAgICAgICAgICAgIGludCBmcmFtZVNpemUgPSBtSGFsZkNhY2hlU2l6ZSAvIDQ7CisgICAgICAgICAgICAgICAgICAgIGludCBmcmFtZUNvdW50ID0gKGludCkgTWF0aC5jZWlsKG1WaWV3Q2FjaGUubGVuZ3RoIC8gKGZsb2F0KSBmcmFtZVNpemUpOworCisgICAgICAgICAgICAgICAgICAgIC8vIHBydW5lL2FkZCBiZWZvcmUgdGhlIGN1cnJlbnQgc3RhcnQgcG9zaXRpb24KKyAgICAgICAgICAgICAgICAgICAgaW50IGVmZmVjdGl2ZVN0YXJ0ID0gTWF0aC5tYXgobmV3U3RhcnRQb3NpdGlvbiwgMCk7CisgICAgICAgICAgICAgICAgICAgIGludCBlZmZlY3RpdmVFbmQgPSBNYXRoLm1pbihuZXdFbmRQb3NpdGlvbiwgZ2V0Q291bnQoKSAtIDEpOworCisgICAgICAgICAgICAgICAgICAgIC8vIGludmFsaWRhdGUgaXRlbXMgaW4gdGhlIHF1ZXVlCisgICAgICAgICAgICAgICAgICAgIGludCBvdmVybGFwU3RhcnQgPSBNYXRoLm1heChtVmlld0NhY2hlU3RhcnRQb3NpdGlvbiwgZWZmZWN0aXZlU3RhcnQpOworICAgICAgICAgICAgICAgICAgICBpbnQgb3ZlcmxhcEVuZCA9IE1hdGgubWluKE1hdGgubWF4KG1WaWV3Q2FjaGVTdGFydFBvc2l0aW9uLCBtVmlld0NhY2hlRW5kUG9zaXRpb24pLCBlZmZlY3RpdmVFbmQpOworICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IChmcmFtZVNpemUgKiBmcmFtZUNvdW50KTsgKytpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXggPSBuZXdTdGFydFBvc2l0aW9uICsgKChpICUgZnJhbWVTaXplKSAqIGZyYW1lQ291bnQgKyAoaSAvIGZyYW1lU2l6ZSkpOworICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5kZXggPD0gbmV3RW5kUG9zaXRpb24pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKG92ZXJsYXBTdGFydCA8PSBpbmRleCkgJiYgKGluZGV4IDw9IG92ZXJsYXBFbmQpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxvYWQgdGhlIHN0dWZmIGluIHRoZSBtaWRkbGUgdGhhdCBoYXMgbm90IGFscmVhZHkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYmVlbiBsb2FkZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFtVmlld0NhY2hlW2dldENhY2hlSW5kZXgoaW5kZXgpXS5pc1ZhbGlkKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1UbXBWaWV3Q2FjaGVMb2FkSW5kaWNlc1tpbmRpY2VzVG9Mb2FkQ291bnQrK10gPSBpbmRleDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoKGVmZmVjdGl2ZVN0YXJ0IDw9IGluZGV4KSAmJiAoaW5kZXggPD0gZWZmZWN0aXZlRW5kKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpbnZhbGlkYXRlIGFuZCBsb2FkIGFsbCBuZXcgZWZmZWN0aXZlIGl0ZW1zCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1WaWV3Q2FjaGVbZ2V0Q2FjaGVJbmRleChpbmRleCldLmludmFsaWRhdGUoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVRtcFZpZXdDYWNoZUxvYWRJbmRpY2VzW2luZGljZXNUb0xvYWRDb3VudCsrXSA9IGluZGV4OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGludmFsaWRhdGUgYWxsIG90aGVyIGNhY2hlIGluZGljZXMgKG91dHNpZGUgdGhlIGVmZmVjdGl2ZSBzdGFydC9lbmQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJ1dCBkb24ndCBsb2FkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1WaWV3Q2FjaGVbZ2V0Q2FjaGVJbmRleChpbmRleCldLmludmFsaWRhdGUoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBtVmlld0NhY2hlU3RhcnRQb3NpdGlvbiA9IG5ld1N0YXJ0UG9zaXRpb247CisgICAgICAgICAgICAgICAgICAgIG1WaWV3Q2FjaGVFbmRQb3NpdGlvbiA9IG5ld0VuZFBvc2l0aW9uOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gcG9zdCBpdGVtcyB0byBiZSBsb2FkZWQKKyAgICAgICAgICAgIGludCBsZW5ndGggPSAwOworICAgICAgICAgICAgc3luY2hyb25pemVkIChtVmlld0NhY2hlSW5mbykgeworICAgICAgICAgICAgICAgIGxlbmd0aCA9IG1WaWV3Q2FjaGVJbmZvLmNvdW50OworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGluZGljZXNUb0xvYWRDb3VudCA+IDApIHsKKyAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG1WaWV3Q2FjaGVMb2FkSW5kaWNlcykgeworICAgICAgICAgICAgICAgICAgICBtVmlld0NhY2hlTG9hZEluZGljZXMuY2xlYXIoKTsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpbmRpY2VzVG9Mb2FkQ291bnQ7ICsraSkgeworICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IGluZGV4ID0gbVRtcFZpZXdDYWNoZUxvYWRJbmRpY2VzW2ldOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKDAgPD0gaW5kZXggJiYgaW5kZXggPCBsZW5ndGgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtVmlld0NhY2hlTG9hZEluZGljZXMuYWRkTGFzdChpbmRleCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIHJldHVybiBudWxsIHNvIHRoYXQgYSBkdW1teSB2aWV3IGNhbiBiZSByZXRyaWV2ZWQKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFZpZXcgZ2V0VmlldyhpbnQgcG9zaXRpb24sIFZpZXcgY29udmVydFZpZXcsIFZpZXdHcm91cCBwYXJlbnQpIHsKKyAgICAgICAgICAgIGlmIChtU2VydmljZUNvbm5lY3Rpb24uaXNDb25uZWN0ZWQoKSkgeworICAgICAgICAgICAgICAgIC8vIGNyZWF0ZSB0aGUgZmxpcHBlciB2aWV3cyBpZiBuZWNlc3NhcnkgKHdlIGhhdmUgdG8gZG8gdGhpcyBub3cKKyAgICAgICAgICAgICAgICAvLyBmb3IgYWxsIHRoZSBmbGlwcGVycyB3aGlsZSB3ZSBoYXZlIHRoZSByZWZlcmVuY2UgdG8gdGhlIHBhcmVudCkKKyAgICAgICAgICAgICAgICBpbml0aWFsaXplTG9hZGluZ1ZpZXdzKHBhcmVudCk7CisKKyAgICAgICAgICAgICAgICAvLyByZXF1ZXN0IHRoZSBpdGVtIGZyb20gdGhlIGNhY2hlIChxdWV1ZWluZyBpdCB0byBsb2FkIGlmIG5vdAorICAgICAgICAgICAgICAgIC8vIGluIHRoZSBjYWNoZSBhbHJlYWR5KQorICAgICAgICAgICAgICAgIFJlbW90ZVZpZXdzSW5kZXhJbmZvIGluZGV4SW5mbyA9IHJlcXVlc3RDYWNoZWRJbmRleEluZm8ocG9zaXRpb24pOworCisgICAgICAgICAgICAgICAgLy8gdXBkYXRlIHRoZSBmbGlwcGVyIGFwcHJvcHJpYXRlbHkKKyAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG1WaWV3Q2FjaGUpIHsKKyAgICAgICAgICAgICAgICAgICAgaW50IGNhY2hlSW5kZXggPSBnZXRDYWNoZUluZGV4KHBvc2l0aW9uKTsKKyAgICAgICAgICAgICAgICAgICAgRnJhbWVMYXlvdXQgZmxpcHBlciA9IG1WaWV3Q2FjaGVbY2FjaGVJbmRleF0uZmxpcHBlcjsKKyAgICAgICAgICAgICAgICAgICAgZmxpcHBlci5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7CisgICAgICAgICAgICAgICAgICAgIGZsaXBwZXIuc2V0QWxwaGEoMS4wZik7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKGluZGV4SW5mbyA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBoaWRlIHRoZSBpdGVtIHZpZXcgYW5kIHNob3cgdGhlIGxvYWRpbmcgdmlldworICAgICAgICAgICAgICAgICAgICAgICAgZmxpcHBlci5nZXRDaGlsZEF0KDApLnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAxOyBpIDwgZmxpcHBlci5nZXRDaGlsZENvdW50KCk7ICsraSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsaXBwZXIuZ2V0Q2hpbGRBdChpKS5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBoaWRlIHRoZSBsb2FkaW5nIHZpZXcgYW5kIHNob3cgdGhlIGl0ZW0gdmlldworICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmbGlwcGVyLmdldENoaWxkQ291bnQoKSAtIDE7ICsraSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsaXBwZXIuZ2V0Q2hpbGRBdChpKS5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBmbGlwcGVyLmdldENoaWxkQXQoZmxpcHBlci5nZXRDaGlsZENvdW50KCkgLSAxKS5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZsaXBwZXI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIG5ldyBWaWV3KG1Db250ZXh0KTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgdm9pZCBpbml0aWFsaXplTG9hZGluZ1ZpZXdzKFZpZXdHcm91cCBwYXJlbnQpIHsKKyAgICAgICAgICAgIC8vIGVuc3VyZSB0aGF0IHRoZSBjYWNoZSBoYXMgdGhlIGFwcHJvcHJpYXRlIGluaXRpYWwgZmxpcHBlcgorICAgICAgICAgICAgc3luY2hyb25pemVkIChtVmlld0NhY2hlKSB7CisgICAgICAgICAgICAgICAgaWYgKG1WaWV3Q2FjaGVbMF0uZmxpcHBlciA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbVZpZXdDYWNoZS5sZW5ndGg7ICsraSkgeworICAgICAgICAgICAgICAgICAgICAgICAgRnJhbWVMYXlvdXQgZmxpcHBlciA9IG5ldyBGcmFtZUxheW91dChtQ29udGV4dCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobVVzZXJMb2FkaW5nVmlldyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdXNlIHRoZSB1c2VyLXNwZWNpZmllZCBsb2FkaW5nIHZpZXcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGlwcGVyLmFkZFZpZXcobVVzZXJMb2FkaW5nVmlldy5hcHBseShtQ29udGV4dCwgcGFyZW50KSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNhbGN1bGF0ZSB0aGUgb3JpZ2luYWwgc2l6ZSBvZiB0aGUgZmlyc3Qgcm93IGZvciB0aGUgbG9hZGVyIHZpZXcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG1WaWV3Q2FjaGVJbmZvKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtRmlyc3RWaWV3SGVpZ2h0IDwgMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmlldyBmaXJzdFZpZXcgPSBtRmlyc3RWaWV3LmFwcGx5KG1Db250ZXh0LCBwYXJlbnQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3RWaWV3Lm1lYXN1cmUoTWVhc3VyZVNwZWMubWFrZU1lYXN1cmVTcGVjKDAsIE1lYXN1cmVTcGVjLlVOU1BFQ0lGSUVEKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVhc3VyZVNwZWMubWFrZU1lYXN1cmVTcGVjKDAsIE1lYXN1cmVTcGVjLlVOU1BFQ0lGSUVEKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtRmlyc3RWaWV3SGVpZ2h0ID0gZmlyc3RWaWV3LmdldE1lYXN1cmVkSGVpZ2h0KCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zdHJ1Y3QgYSBuZXcgbG9hZGVyIGFuZCBhZGQgaXQgdG8gdGhlIGZsaXBwZXIgYXMgdGhlIGZhbGxiYWNrCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZGVmYXVsdCB2aWV3CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGV4dFZpZXcgdGV4dFZpZXcgPSBuZXcgVGV4dFZpZXcobUNvbnRleHQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHRWaWV3LnNldFRleHQoIkxvYWRpbmcuLi4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0Vmlldy5zZXRIZWlnaHQobUZpcnN0Vmlld0hlaWdodCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dFZpZXcuc2V0R3Jhdml0eShHcmF2aXR5LkNFTlRFUl9IT1JJWk9OVEFMIHwgR3Jhdml0eS5DRU5URVJfVkVSVElDQUwpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHRWaWV3LnNldFRleHRTaXplKDE4LjBmKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0Vmlldy5zZXRUZXh0Q29sb3IoQ29sb3IuYXJnYig5NiwgMjU1LCAyNTUsIDI1NSkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHRWaWV3LnNldFNoYWRvd0xheWVyKDIuMGYsIDAuMGYsIDEuMGYsIENvbG9yLkJMQUNLKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsaXBwZXIuYWRkVmlldyh0ZXh0Vmlldyk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBtVmlld0NhY2hlW2ldLmZsaXBwZXIgPSBmbGlwcGVyOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgc3RhcnRCYWNrZ3JvdW5kTG9hZGVyKCkgeworICAgICAgICAgICAgLy8gaW5pdGlhbGl6ZSB0aGUgd29ya2VyIHJ1bm5hYmxlCisgICAgICAgICAgICBtQmFja2dyb3VuZExvYWRlckVuYWJsZWQgPSB0cnVlOworICAgICAgICAgICAgbVdvcmtlclF1ZXVlLnBvc3QobmV3IFJ1bm5hYmxlKCkgeworICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICAgICAgd2hpbGUgKG1CYWNrZ3JvdW5kTG9hZGVyRW5hYmxlZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gbm90aWZ5IHRoZSBSZW1vdGVWaWV3cyBmYWN0b3J5IGlmIG5lY2Vzc2FyeQorICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBpc0RhdGFEaXJ0eSA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgc3luY2hyb25pemVkIChtVmlld0NhY2hlSW5mbykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzRGF0YURpcnR5ID0gbVZpZXdDYWNoZUluZm8uaXNEYXRhRGlydHk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVZpZXdDYWNoZUluZm8uaXNEYXRhRGlydHkgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpc0RhdGFEaXJ0eSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZU5vdGlmeURhdGFTZXRDaGFuZ2VkKCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleCA9IC0xOworICAgICAgICAgICAgICAgICAgICAgICAgc3luY2hyb25pemVkIChtVmlld0NhY2hlTG9hZEluZGljZXMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIW1WaWV3Q2FjaGVMb2FkSW5kaWNlcy5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXggPSBtVmlld0NhY2hlTG9hZEluZGljZXMucmVtb3ZlRmlyc3QoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5kZXggPCAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlcmUgd2VyZSBubyBpdGVtcyB0byBsb2FkLCBzbyBzbGVlcCBmb3IgYSBiaXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaHJlYWQuc2xlZXAoMTApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG90aGVyd2lzZSwgdHJ5IGFuZCBsb2FkIHRoZSBpdGVtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlUmVtb3RlVmlld3NJbmZvKGluZGV4KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgc3RvcEJhY2tncm91bmRMb2FkZXIoKSB7CisgICAgICAgICAgICAvLyBjbGVhciB0aGUgaXRlbXMgdG8gYmUgbG9hZGVkCisgICAgICAgICAgICBtQmFja2dyb3VuZExvYWRlckVuYWJsZWQgPSBmYWxzZTsKKyAgICAgICAgICAgIHN5bmNocm9uaXplZCAobVZpZXdDYWNoZUxvYWRJbmRpY2VzKSB7CisgICAgICAgICAgICAgICAgbVZpZXdDYWNoZUxvYWRJbmRpY2VzLmNsZWFyKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgbG9uZyBnZXRJdGVtSWQoaW50IHBvc2l0aW9uKSB7CisgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG1WaWV3Q2FjaGUpIHsKKyAgICAgICAgICAgICAgICBpZiAoY29udGFpbnNBbmRJc1ZhbGlkKHBvc2l0aW9uKSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gbVZpZXdDYWNoZVtnZXRDYWNoZUluZGV4KHBvc2l0aW9uKV0uaXRlbUlkOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGludCBnZXRJdGVtVmlld1R5cGUoaW50IHBvc2l0aW9uKSB7CisgICAgICAgICAgICAvLyBzeW5jaHJvbml6ZSB0byBlbnN1cmUgdGhhdCB0aGUgdHlwZSBpZC9pbmRleCBtYXAgaXMgdXBkYXRlZCBzeW5jaHJvbm91c2x5CisgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG1WaWV3Q2FjaGUpIHsKKyAgICAgICAgICAgICAgICBpZiAoY29udGFpbnNBbmRJc1ZhbGlkKHBvc2l0aW9uKSkgeworICAgICAgICAgICAgICAgICAgICBpbnQgdmlld0lkID0gbVZpZXdDYWNoZVtnZXRDYWNoZUluZGV4KHBvc2l0aW9uKV0udHlwZUlkOworICAgICAgICAgICAgICAgICAgICBNYXA8SW50ZWdlciwgSW50ZWdlcj4gdHlwZU1hcCA9IG1WaWV3Q2FjaGVJbmZvLm1UeXBlSWRJbmRleE1hcDsKKyAgICAgICAgICAgICAgICAgICAgLy8gd2UgKzEgYmVjYXVzZSB0aGUgZGVmYXVsdCBkdW1teSB2aWV3IGdldCB2aWV3IHR5cGUgMAorICAgICAgICAgICAgICAgICAgICBpZiAodHlwZU1hcC5jb250YWluc0tleSh2aWV3SWQpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHlwZU1hcC5nZXQodmlld0lkKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBuZXdJbmRleCA9IHR5cGVNYXAuc2l6ZSgpICsgMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVNYXAucHV0KHZpZXdJZCwgbmV3SW5kZXgpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ld0luZGV4OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gcmV0dXJuIHRoZSB0eXBlIG9mIHRoZSBkZWZhdWx0IGl0ZW0KKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGludCBnZXRDb3VudCgpIHsKKyAgICAgICAgICAgIHN5bmNocm9uaXplZCAobVZpZXdDYWNoZUluZm8pIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbVZpZXdDYWNoZUluZm8uY291bnQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgaW50IGdldFZpZXdUeXBlQ291bnQoKSB7CisgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG1WaWV3Q2FjaGVJbmZvKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG1WaWV3Q2FjaGVJbmZvLnZpZXdUeXBlQ291bnQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYm9vbGVhbiBoYXNTdGFibGVJZHMoKSB7CisgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG1WaWV3Q2FjaGVJbmZvKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG1WaWV3Q2FjaGVJbmZvLmhhc1N0YWJsZUlkczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIGZsdXNoQ2FjaGUoKSB7CisgICAgICAgICAgICAvLyBjbGVhciB0aGUgaXRlbXMgdG8gYmUgbG9hZGVkCisgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG1WaWV3Q2FjaGVMb2FkSW5kaWNlcykgeworICAgICAgICAgICAgICAgIG1WaWV3Q2FjaGVMb2FkSW5kaWNlcy5jbGVhcigpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG1WaWV3Q2FjaGUpIHsKKyAgICAgICAgICAgICAgICAvLyBmbHVzaCB0aGUgaW50ZXJuYWwgY2FjaGUgYW5kIGludmFsaWRhdGUgdGhlIGFkYXB0ZXIgZm9yIGZ1dHVyZSBsb2FkcworICAgICAgICAgICAgICAgIG1NYWluUXVldWUucmVtb3ZlTWVzc2FnZXMoMCk7CisKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1WaWV3Q2FjaGUubGVuZ3RoOyArK2kpIHsKKyAgICAgICAgICAgICAgICAgICAgbVZpZXdDYWNoZVtpXS5pbnZhbGlkYXRlKCk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgbVZpZXdDYWNoZVN0YXJ0UG9zaXRpb24gPSAwOworICAgICAgICAgICAgICAgIG1WaWV3Q2FjaGVFbmRQb3NpdGlvbiA9IC0xOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIFJlbW90ZVZpZXdzQWRhcHRlcihDb250ZXh0IGNvbnRleHQsIEludGVudCBpbnRlbnQsIFJlbW90ZUFkYXB0ZXJDb25uZWN0aW9uQ2FsbGJhY2sgY2FsbGJhY2spIHsKKyAgICAgICAgbUNvbnRleHQgPSBjb250ZXh0OworICAgICAgICBtSW50ZW50ID0gaW50ZW50OworCisgICAgICAgIC8vIGluaXRpYWxpemUgdGhlIHdvcmtlciB0aHJlYWQKKyAgICAgICAgbVdvcmtlclRocmVhZCA9IG5ldyBIYW5kbGVyVGhyZWFkKCJSZW1vdGVWaWV3c0NhY2hlLWxvYWRlciIpOworICAgICAgICBtV29ya2VyVGhyZWFkLnN0YXJ0KCk7CisgICAgICAgIG1Xb3JrZXJRdWV1ZSA9IG5ldyBIYW5kbGVyKG1Xb3JrZXJUaHJlYWQuZ2V0TG9vcGVyKCkpOworICAgICAgICBtV29ya2VyUHJpb3JpdHlRdWV1ZSA9IG5ldyBIYW5kbGVyKG1Xb3JrZXJUaHJlYWQuZ2V0TG9vcGVyKCkpOworICAgICAgICBtTWFpblF1ZXVlID0gbmV3IEhhbmRsZXIoTG9vcGVyLm15TG9vcGVyKCkpOworICAgICAgICBtTWFpblByaW9yaXR5UXVldWUgPSBuZXcgSGFuZGxlcihMb29wZXIubXlMb29wZXIoKSk7CisKKyAgICAgICAgLy8gaW5pdGlhbGl6ZSB0aGUgY2FjaGUgYW5kIHRoZSBzZXJ2aWNlIGNvbm5lY3Rpb24gb24gc3RhcnR1cAorICAgICAgICBtVmlld0NhY2hlID0gbmV3IFJlbW90ZVZpZXdzQ2FjaGUoMjUpOworICAgICAgICBtU2VydmljZUNvbm5lY3Rpb24gPSBuZXcgUmVtb3RlVmlld3NBZGFwdGVyU2VydmljZUNvbm5lY3Rpb24oY2FsbGJhY2spOworICAgICAgICByZXF1ZXN0QmluZFNlcnZpY2UoKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgdm9pZCBmaW5hbGl6ZSgpIHRocm93cyBUaHJvd2FibGUgeworICAgICAgICAvLyByZW1lbWJlciB0byB1bmJpbmQgZnJvbSB0aGUgc2VydmljZSB3aGVuIGZpbmFsaXppbmcKKyAgICAgICAgdW5iaW5kU2VydmljZSgpOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgZ2V0Q291bnQoKSB7CisgICAgICAgIHJlcXVlc3RCaW5kU2VydmljZSgpOworICAgICAgICByZXR1cm4gbVZpZXdDYWNoZS5nZXRDb3VudCgpOworICAgIH0KKworICAgIHB1YmxpYyBPYmplY3QgZ2V0SXRlbShpbnQgcG9zaXRpb24pIHsKKyAgICAgICAgLy8gZGlzYWxsb3cgYXJiaXRyYXJ5IG9iamVjdCB0byBiZSBhc3NvY2lhdGVkIHdpdGggYW4gaXRlbSBmb3IgdGhlIHRpbWUgYmVpbmcKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgcHVibGljIGxvbmcgZ2V0SXRlbUlkKGludCBwb3NpdGlvbikgeworICAgICAgICByZXF1ZXN0QmluZFNlcnZpY2UoKTsKKyAgICAgICAgcmV0dXJuIG1WaWV3Q2FjaGUuZ2V0SXRlbUlkKHBvc2l0aW9uKTsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGdldEl0ZW1WaWV3VHlwZShpbnQgcG9zaXRpb24pIHsKKyAgICAgICAgcmVxdWVzdEJpbmRTZXJ2aWNlKCk7CisgICAgICAgIHJldHVybiBtVmlld0NhY2hlLmdldEl0ZW1WaWV3VHlwZShwb3NpdGlvbik7CisgICAgfQorCisgICAgcHVibGljIFZpZXcgZ2V0VmlldyhpbnQgcG9zaXRpb24sIFZpZXcgY29udmVydFZpZXcsIFZpZXdHcm91cCBwYXJlbnQpIHsKKyAgICAgICAgcmVxdWVzdEJpbmRTZXJ2aWNlKCk7CisgICAgICAgIHJldHVybiBtVmlld0NhY2hlLmdldFZpZXcocG9zaXRpb24sIGNvbnZlcnRWaWV3LCBwYXJlbnQpOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgZ2V0Vmlld1R5cGVDb3VudCgpIHsKKyAgICAgICAgcmVxdWVzdEJpbmRTZXJ2aWNlKCk7CisgICAgICAgIHJldHVybiBtVmlld0NhY2hlLmdldFZpZXdUeXBlQ291bnQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBoYXNTdGFibGVJZHMoKSB7CisgICAgICAgIHJlcXVlc3RCaW5kU2VydmljZSgpOworICAgICAgICByZXR1cm4gbVZpZXdDYWNoZS5oYXNTdGFibGVJZHMoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBpc0VtcHR5KCkgeworICAgICAgICByZXR1cm4gZ2V0Q291bnQoKSA8PSAwOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIG5vdGlmeURhdGFTZXRDaGFuZ2VkKCkgeworICAgICAgICAvLyBmbHVzaCB0aGUgY2FjaGUgc28gdGhhdCB3ZSBjYW4gcmVsb2FkIG5ldyBpdGVtcyBmcm9tIHRoZSBzZXJ2aWNlCisgICAgICAgIG1WaWV3Q2FjaGUuZmx1c2hDYWNoZSgpOworCisgICAgICAgIC8vIG5vdGlmeSB0aGUgZmFjdG9yeSB0aGF0IGl0J3MgZGF0YSBtYXkgbm8gbG9uZ2VyIGJlIHZhbGlkCisgICAgICAgIG1WaWV3Q2FjaGUub25Ob3RpZnlEYXRhU2V0Q2hhbmdlZCgpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGNvbXBsZXRlTm90aWZ5RGF0YVNldENoYW5nZWQoKSB7CisgICAgICAgIHN1cGVyLm5vdGlmeURhdGFTZXRDaGFuZ2VkKCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBib29sZWFuIHJlcXVlc3RCaW5kU2VydmljZSgpIHsKKyAgICAgICAgLy8gdHJ5IGJpbmRpbmcgdGhlIHNlcnZpY2UgKHdoaWNoIHdpbGwgc3RhcnQgaXQgaWYgaXQncyBub3QgYWxyZWFkeSBydW5uaW5nKQorICAgICAgICBpZiAoIW1TZXJ2aWNlQ29ubmVjdGlvbi5pc0Nvbm5lY3RlZCgpKSB7CisgICAgICAgICAgICBtQ29udGV4dC5iaW5kU2VydmljZShtSW50ZW50LCBtU2VydmljZUNvbm5lY3Rpb24sIENvbnRleHQuQklORF9BVVRPX0NSRUFURSk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gbVNlcnZpY2VDb25uZWN0aW9uLmlzQ29ubmVjdGVkKCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHVuYmluZFNlcnZpY2UoKSB7CisgICAgICAgIGlmIChtU2VydmljZUNvbm5lY3Rpb24uaXNDb25uZWN0ZWQoKSkgeworICAgICAgICAgICAgbUNvbnRleHQudW5iaW5kU2VydmljZShtU2VydmljZUNvbm5lY3Rpb24pOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L1JlbW90ZVZpZXdzU2VydmljZS5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L1JlbW90ZVZpZXdzU2VydmljZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU4NGZhMjUKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvUmVtb3RlVmlld3NTZXJ2aWNlLmphdmEKQEAgLTAsMCArMSwxNjAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQud2lkZ2V0OworCitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworaW1wb3J0IGFuZHJvaWQuYXBwLlNlcnZpY2U7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKK2ltcG9ydCBhbmRyb2lkLm9zLklCaW5kZXI7CitpbXBvcnQgYW5kcm9pZC51dGlsLlBhaXI7CisKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC53aWRnZXQuSVJlbW90ZVZpZXdzRmFjdG9yeTsKKworLyoqCisgKiBUaGUgc2VydmljZSB0byBiZSBjb25uZWN0ZWQgdG8gZm9yIGEgcmVtb3RlIGFkYXB0ZXIgdG8gcmVxdWVzdCBSZW1vdGVWaWV3cy4gIFVzZXJzIHNob3VsZAorICogZXh0ZW5kIHRoZSBSZW1vdGVWaWV3c1NlcnZpY2UgdG8gcHJvdmlkZSB0aGUgYXBwcm9wcmlhdGUgUmVtb3RlVmlld3NGYWN0b3J5J3MgdXNlZCB0bworICogcG9wdWxhdGUgdGhlIHJlbW90ZSBjb2xsZWN0aW9uIHZpZXcgKExpc3RWaWV3LCBHcmlkVmlldywgZXRjKS4KKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIFJlbW90ZVZpZXdzU2VydmljZSBleHRlbmRzIFNlcnZpY2UgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIExPR19UQUcgPSAiUmVtb3RlVmlld3NTZXJ2aWNlIjsKKworICAgIC8vIG11bHRpbWFwIGltcGxlbWVudGF0aW9uIGZvciByZWZlcmVuY2UgY291bnRpbmcKKyAgICBwcml2YXRlIEhhc2hNYXA8SW50ZW50LCBQYWlyPFJlbW90ZVZpZXdzRmFjdG9yeSwgSW50ZWdlcj4+IG1SZW1vdGVWaWV3RmFjdG9yaWVzOworICAgIHByaXZhdGUgZmluYWwgT2JqZWN0IG1Mb2NrID0gbmV3IE9iamVjdCgpOworCisgICAgLyoqCisgICAgICogQW4gaW50ZXJmYWNlIGZvciBhbiBhZGFwdGVyIGJldHdlZW4gYSByZW1vdGUgY29sbGVjdGlvbiB2aWV3IChMaXN0VmlldywgR3JpZFZpZXcsIGV0YykgYW5kCisgICAgICogdGhlIHVuZGVybHlpbmcgZGF0YSBmb3IgdGhhdCB2aWV3LiAgVGhlIGltcGxlbWVudG9yIGlzIHJlc3BvbnNpYmxlIGZvciBtYWtpbmcgYSBSZW1vdGVWaWV3CisgICAgICogZm9yIGVhY2ggaXRlbSBpbiB0aGUgZGF0YSBzZXQuCisgICAgICogCisgICAgICogQHNlZSBhbmRyb2lkLndpZGdldC5BZGFwdGVyCisgICAgICogQHNlZSBhbmRyb2lkLmFwcHdpZGdldC5BcHBXaWRnZXRNYW5hZ2VyCisgICAgICovCisgICAgcHVibGljIGludGVyZmFjZSBSZW1vdGVWaWV3c0ZhY3RvcnkgeworICAgICAgICAvKioKKyAgICAgICAgICogQ2FsbGVkIHdoZW4geW91ciBmYWN0b3J5IGlzIGZpcnN0IGNvbnN0cnVjdGVkLiBUaGUgc2FtZSBmYWN0b3J5IG1heSBiZSBzaGFyZWQgYWNyb3NzCisgICAgICAgICAqIG11bHRpcGxlIFJlbW90ZVZpZXdBZGFwdGVycyBkZXBlbmRpbmcgb24gdGhlIGludGVudCBwYXNzZWQuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgdm9pZCBvbkNyZWF0ZSgpOworICAgICAgICAvKioKKyAgICAgICAgICogQ2FsbGVkIHdoZW4gbm90aWZ5RGF0YVNldENoYW5nZWQoKSBpcyB0cmlnZ2VyZWQgb24gdGhlIHJlbW90ZSBhZGFwdGVyLiBUaGlzIGFsbG93cyBhCisgICAgICAgICAqIFJlbW90ZVZpZXdzRmFjdG9yeSB0byByZXNwb25kIHRvIGRhdGEgY2hhbmdlcyBieSB1cGRhdGluZyBhbnkgaW50ZXJuYWwgcmVmZXJlbmNlcy4KKyAgICAgICAgICoKKyAgICAgICAgICogQHNlZSBhbmRyb2lkLmFwcHdpZGdldC5BcHBXaWRnZXRNYW5hZ2VyI25vdGlmeUFwcFdpZGdldFZpZXdEYXRhQ2hhbmdlZChpbnRbXSwgaW50KQorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgb25EYXRhU2V0Q2hhbmdlZCgpOworICAgICAgICAvKioKKyAgICAgICAgICogQ2FsbGVkIHdoZW4gdGhlIGxhc3QgUmVtb3RlVmlld3NBZGFwdGVyIHRoYXQgaXMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgZmFjdG9yeSBpcworICAgICAgICAgKiB1bmJvdW5kLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgb25EZXN0cm95KCk7CisKKyAgICAgICAgcHVibGljIGludCBnZXRDb3VudCgpOworICAgICAgICBwdWJsaWMgUmVtb3RlVmlld3MgZ2V0Vmlld0F0KGludCBwb3NpdGlvbik7CisgICAgICAgIHB1YmxpYyBSZW1vdGVWaWV3cyBnZXRMb2FkaW5nVmlldygpOworICAgICAgICBwdWJsaWMgaW50IGdldFZpZXdUeXBlQ291bnQoKTsKKyAgICAgICAgcHVibGljIGxvbmcgZ2V0SXRlbUlkKGludCBwb3NpdGlvbik7CisgICAgICAgIHB1YmxpYyBib29sZWFuIGhhc1N0YWJsZUlkcygpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEEgcHJpdmF0ZSBwcm94eSBjbGFzcyBmb3IgdGhlIHByaXZhdGUgSVJlbW90ZVZpZXdzRmFjdG9yeSBpbnRlcmZhY2UgdGhyb3VnaCB0aGUKKyAgICAgKiBwdWJsaWMgUmVtb3RlVmlld3NGYWN0b3J5IGludGVyZmFjZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIGNsYXNzIFJlbW90ZVZpZXdzRmFjdG9yeUFkYXB0ZXIgZXh0ZW5kcyBJUmVtb3RlVmlld3NGYWN0b3J5LlN0dWIgeworICAgICAgICBwdWJsaWMgUmVtb3RlVmlld3NGYWN0b3J5QWRhcHRlcihSZW1vdGVWaWV3c0ZhY3RvcnkgZmFjdG9yeSkgeworICAgICAgICAgICAgbUZhY3RvcnkgPSBmYWN0b3J5OworICAgICAgICB9CisgICAgICAgIHB1YmxpYyB2b2lkIG9uRGF0YVNldENoYW5nZWQoKSB7CisgICAgICAgICAgICBtRmFjdG9yeS5vbkRhdGFTZXRDaGFuZ2VkKCk7CisgICAgICAgIH0KKyAgICAgICAgcHVibGljIGludCBnZXRDb3VudCgpIHsKKyAgICAgICAgICAgIHJldHVybiBtRmFjdG9yeS5nZXRDb3VudCgpOworICAgICAgICB9CisgICAgICAgIHB1YmxpYyBSZW1vdGVWaWV3cyBnZXRWaWV3QXQoaW50IHBvc2l0aW9uKSB7CisgICAgICAgICAgICByZXR1cm4gbUZhY3RvcnkuZ2V0Vmlld0F0KHBvc2l0aW9uKTsKKyAgICAgICAgfQorICAgICAgICBwdWJsaWMgUmVtb3RlVmlld3MgZ2V0TG9hZGluZ1ZpZXcoKSB7CisgICAgICAgICAgICByZXR1cm4gbUZhY3RvcnkuZ2V0TG9hZGluZ1ZpZXcoKTsKKyAgICAgICAgfQorICAgICAgICBwdWJsaWMgaW50IGdldFZpZXdUeXBlQ291bnQoKSB7CisgICAgICAgICAgICByZXR1cm4gbUZhY3RvcnkuZ2V0Vmlld1R5cGVDb3VudCgpOworICAgICAgICB9CisgICAgICAgIHB1YmxpYyBsb25nIGdldEl0ZW1JZChpbnQgcG9zaXRpb24pIHsKKyAgICAgICAgICAgIHJldHVybiBtRmFjdG9yeS5nZXRJdGVtSWQocG9zaXRpb24pOworICAgICAgICB9CisgICAgICAgIHB1YmxpYyBib29sZWFuIGhhc1N0YWJsZUlkcygpIHsKKyAgICAgICAgICAgIHJldHVybiBtRmFjdG9yeS5oYXNTdGFibGVJZHMoKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgUmVtb3RlVmlld3NGYWN0b3J5IG1GYWN0b3J5OworICAgIH0KKworICAgIHB1YmxpYyBSZW1vdGVWaWV3c1NlcnZpY2UoKSB7CisgICAgICAgIG1SZW1vdGVWaWV3RmFjdG9yaWVzID0gbmV3IEhhc2hNYXA8SW50ZW50LCBQYWlyPFJlbW90ZVZpZXdzRmFjdG9yeSwgSW50ZWdlcj4+KCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIElCaW5kZXIgb25CaW5kKEludGVudCBpbnRlbnQpIHsKKyAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgeworICAgICAgICAgICAgLy8gaW5jcmVtZW50IHRoZSByZWZlcmVuY2UgY291bnQgdG8gdGhlIHBhcnRpY3VsYXIgZmFjdG9yeSBhc3NvY2lhdGVkIHdpdGggdGhpcyBpbnRlbnQKKyAgICAgICAgICAgIFBhaXI8UmVtb3RlVmlld3NGYWN0b3J5LCBJbnRlZ2VyPiBmYWN0b3J5UmVmID0gbnVsbDsKKyAgICAgICAgICAgIFJlbW90ZVZpZXdzRmFjdG9yeSBmYWN0b3J5ID0gbnVsbDsKKyAgICAgICAgICAgIGlmICghbVJlbW90ZVZpZXdGYWN0b3JpZXMuY29udGFpbnNLZXkoaW50ZW50KSkgeworICAgICAgICAgICAgICAgIGZhY3RvcnkgPSBvbkdldFZpZXdGYWN0b3J5KGludGVudCk7CisgICAgICAgICAgICAgICAgZmFjdG9yeVJlZiA9IG5ldyBQYWlyPFJlbW90ZVZpZXdzRmFjdG9yeSwgSW50ZWdlcj4oZmFjdG9yeSwgMSk7CisgICAgICAgICAgICAgICAgbVJlbW90ZVZpZXdGYWN0b3JpZXMucHV0KGludGVudCwgZmFjdG9yeVJlZik7CisgICAgICAgICAgICAgICAgZmFjdG9yeS5vbkNyZWF0ZSgpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBQYWlyPFJlbW90ZVZpZXdzRmFjdG9yeSwgSW50ZWdlcj4gb2xkRmFjdG9yeVJlZiA9IG1SZW1vdGVWaWV3RmFjdG9yaWVzLmdldChpbnRlbnQpOworICAgICAgICAgICAgICAgIGZhY3RvcnkgPSBvbGRGYWN0b3J5UmVmLmZpcnN0OworICAgICAgICAgICAgICAgIGludCBuZXdSZWZDb3VudCA9IG9sZEZhY3RvcnlSZWYuc2Vjb25kLmludFZhbHVlKCkgKyAxOworICAgICAgICAgICAgICAgIGZhY3RvcnlSZWYgPSBuZXcgUGFpcjxSZW1vdGVWaWV3c0ZhY3RvcnksIEludGVnZXI+KG9sZEZhY3RvcnlSZWYuZmlyc3QsIG5ld1JlZkNvdW50KTsKKyAgICAgICAgICAgICAgICBtUmVtb3RlVmlld0ZhY3Rvcmllcy5wdXQoaW50ZW50LCBmYWN0b3J5UmVmKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBuZXcgUmVtb3RlVmlld3NGYWN0b3J5QWRhcHRlcihmYWN0b3J5KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIG9uVW5iaW5kKEludGVudCBpbnRlbnQpIHsKKyAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgeworICAgICAgICAgICAgaWYgKG1SZW1vdGVWaWV3RmFjdG9yaWVzLmNvbnRhaW5zS2V5KGludGVudCkpIHsKKyAgICAgICAgICAgICAgICAvLyB0aGlzIGFsbGV2aWF0ZXMgdGhlIHVzZXIncyByZXNwb25zaWJpbGl0eSBvZiBoYXZpbmcgdG8gY2xlYXIgYWxsIGZhY3RvcmllcworICAgICAgICAgICAgICAgIFBhaXI8UmVtb3RlVmlld3NGYWN0b3J5LCBJbnRlZ2VyPiBvbGRGYWN0b3J5UmVmID0gbVJlbW90ZVZpZXdGYWN0b3JpZXMuZ2V0KGludGVudCk7CisgICAgICAgICAgICAgICAgaW50IG5ld1JlZkNvdW50ID0gb2xkRmFjdG9yeVJlZi5zZWNvbmQuaW50VmFsdWUoKSAtIDE7CisgICAgICAgICAgICAgICAgaWYgKG5ld1JlZkNvdW50IDw9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgb2xkRmFjdG9yeVJlZi5maXJzdC5vbkRlc3Ryb3koKTsKKyAgICAgICAgICAgICAgICAgICAgbVJlbW90ZVZpZXdGYWN0b3JpZXMucmVtb3ZlKGludGVudCk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgUGFpcjxSZW1vdGVWaWV3c0ZhY3RvcnksIEludGVnZXI+IGZhY3RvcnlSZWYgPSBuZXcgUGFpcjxSZW1vdGVWaWV3c0ZhY3RvcnksIEludGVnZXI+KG9sZEZhY3RvcnlSZWYuZmlyc3QsIG5ld1JlZkNvdW50KTsKKyAgICAgICAgICAgICAgICAgICAgbVJlbW90ZVZpZXdGYWN0b3JpZXMucHV0KGludGVudCwgZmFjdG9yeVJlZik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBzdXBlci5vblVuYmluZChpbnRlbnQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRvIGJlIGltcGxlbWVudGVkIGJ5IHRoZSBkZXJpdmVkIHNlcnZpY2UgdG8gZ2VuZXJhdGUgYXBwcm9wcmlhdGUgZmFjdG9yaWVzIGZvcgorICAgICAqIHRoZSBkYXRhLgorICAgICAqLworICAgIHB1YmxpYyBhYnN0cmFjdCBSZW1vdGVWaWV3c0ZhY3Rvcnkgb25HZXRWaWV3RmFjdG9yeShJbnRlbnQgaW50ZW50KTsKK30KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9SZXNvdXJjZUN1cnNvckFkYXB0ZXIuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9SZXNvdXJjZUN1cnNvckFkYXB0ZXIuamF2YQppbmRleCBjOWMyMTdhLi5hZWU0MTFlIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvUmVzb3VyY2VDdXJzb3JBZGFwdGVyLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L1Jlc291cmNlQ3Vyc29yQWRhcHRlci5qYXZhCkBAIC0zNiw5ICszNiw4IEBACiAgICAgCiAgICAgLyoqCiAgICAgICogQ29uc3RydWN0b3IuCi0gICAgICogCi0gICAgICogQHBhcmFtIGNvbnRleHQgVGhlIGNvbnRleHQgd2hlcmUgdGhlIExpc3RWaWV3IGFzc29jaWF0ZWQgd2l0aCB0aGlzCi0gICAgICogICAgICAgICAgICBTaW1wbGVMaXN0SXRlbUZhY3RvcnkgaXMgcnVubmluZworICAgICAqCisgICAgICogQHBhcmFtIGNvbnRleHQgVGhlIGNvbnRleHQgd2hlcmUgdGhlIExpc3RWaWV3IGFzc29jaWF0ZWQgd2l0aCB0aGlzIGFkYXB0ZXIgaXMgcnVubmluZwogICAgICAqIEBwYXJhbSBsYXlvdXQgcmVzb3VyY2UgaWRlbnRpZmllciBvZiBhIGxheW91dCBmaWxlIHRoYXQgZGVmaW5lcyB0aGUgdmlld3MKICAgICAgKiAgICAgICAgICAgIGZvciB0aGlzIGxpc3QgaXRlbS4gIFVubGVzcyB5b3Ugb3ZlcnJpZGUgdGhlbSBsYXRlciwgdGhpcyB3aWxsCiAgICAgICogICAgICAgICAgICBkZWZpbmUgYm90aCB0aGUgaXRlbSB2aWV3cyBhbmQgdGhlIGRyb3AgZG93biB2aWV3cy4KQEAgLTUxLDkgKzUwLDggQEAKICAgICAKICAgICAvKioKICAgICAgKiBDb25zdHJ1Y3Rvci4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gY29udGV4dCBUaGUgY29udGV4dCB3aGVyZSB0aGUgTGlzdFZpZXcgYXNzb2NpYXRlZCB3aXRoIHRoaXMKLSAgICAgKiAgICAgICAgICAgIFNpbXBsZUxpc3RJdGVtRmFjdG9yeSBpcyBydW5uaW5nCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29udGV4dCBUaGUgY29udGV4dCB3aGVyZSB0aGUgTGlzdFZpZXcgYXNzb2NpYXRlZCB3aXRoIHRoaXMgYWRhcHRlciBpcyBydW5uaW5nCiAgICAgICogQHBhcmFtIGxheW91dCByZXNvdXJjZSBpZGVudGlmaWVyIG9mIGEgbGF5b3V0IGZpbGUgdGhhdCBkZWZpbmVzIHRoZSB2aWV3cwogICAgICAqICAgICAgICAgICAgZm9yIHRoaXMgbGlzdCBpdGVtLiAgVW5sZXNzIHlvdSBvdmVycmlkZSB0aGVtIGxhdGVyLCB0aGlzIHdpbGwKICAgICAgKiAgICAgICAgICAgIGRlZmluZSBib3RoIHRoZSBpdGVtIHZpZXdzIGFuZCB0aGUgZHJvcCBkb3duIHZpZXdzLgpAQCAtNjksNiArNjcsMjIgQEAKICAgICB9CiAKICAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3Rvci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb250ZXh0IFRoZSBjb250ZXh0IHdoZXJlIHRoZSBMaXN0VmlldyBhc3NvY2lhdGVkIHdpdGggdGhpcyBhZGFwdGVyIGlzIHJ1bm5pbmcKKyAgICAgKiBAcGFyYW0gbGF5b3V0IHJlc291cmNlIGlkZW50aWZpZXIgb2YgYSBsYXlvdXQgZmlsZSB0aGF0IGRlZmluZXMgdGhlIHZpZXdzCisgICAgICogICAgICAgICAgICBmb3IgdGhpcyBsaXN0IGl0ZW0uICBVbmxlc3MgeW91IG92ZXJyaWRlIHRoZW0gbGF0ZXIsIHRoaXMgd2lsbAorICAgICAqICAgICAgICAgICAgZGVmaW5lIGJvdGggdGhlIGl0ZW0gdmlld3MgYW5kIHRoZSBkcm9wIGRvd24gdmlld3MuCisgICAgICogQHBhcmFtIGMgVGhlIGN1cnNvciBmcm9tIHdoaWNoIHRvIGdldCB0aGUgZGF0YS4KKyAgICAgKiBAcGFyYW0gZmxhZ3MgZmxhZ3MgdXNlZCB0byBkZXRlcm1pbmUgdGhlIGJlaGF2aW9yIG9mIHRoZSBhZGFwdGVyCisgICAgICovCisgICAgcHVibGljIFJlc291cmNlQ3Vyc29yQWRhcHRlcihDb250ZXh0IGNvbnRleHQsIGludCBsYXlvdXQsIEN1cnNvciBjLCBpbnQgZmxhZ3MpIHsKKyAgICAgICAgc3VwZXIoY29udGV4dCwgYywgZmxhZ3MpOworICAgICAgICBtTGF5b3V0ID0gbURyb3BEb3duTGF5b3V0ID0gbGF5b3V0OworICAgICAgICBtSW5mbGF0ZXIgPSAoTGF5b3V0SW5mbGF0ZXIpIGNvbnRleHQuZ2V0U3lzdGVtU2VydmljZShDb250ZXh0LkxBWU9VVF9JTkZMQVRFUl9TRVJWSUNFKTsKKyAgICB9CisKKyAgICAvKioKICAgICAgKiBJbmZsYXRlcyB2aWV3KHMpIGZyb20gdGhlIHNwZWNpZmllZCBYTUwgZmlsZS4KICAgICAgKiAKICAgICAgKiBAc2VlIGFuZHJvaWQud2lkZ2V0LkN1cnNvckFkYXB0ZXIjbmV3VmlldyhhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCwKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9TY3JvbGxCYXJEcmF3YWJsZS5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L1Njcm9sbEJhckRyYXdhYmxlLmphdmEKaW5kZXggM2IxMTNhZS4uOTNhMTE3OSAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L1Njcm9sbEJhckRyYXdhYmxlLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L1Njcm9sbEJhckRyYXdhYmxlLmphdmEKQEAgLTExMSw4ICsxMTEsNyBAQAogICAgICAgICB9CiAKICAgICAgICAgUmVjdCByID0gZ2V0Qm91bmRzKCk7Ci0gICAgICAgIGlmIChjYW52YXMucXVpY2tSZWplY3Qoci5sZWZ0LCByLnRvcCwgci5yaWdodCwgci5ib3R0b20sIAotICAgICAgICAgICAgICAgIENhbnZhcy5FZGdlVHlwZS5BQSkpIHsKKyAgICAgICAgaWYgKGNhbnZhcy5xdWlja1JlamVjdChyLmxlZnQsIHIudG9wLCByLnJpZ2h0LCByLmJvdHRvbSwgQ2FudmFzLkVkZ2VUeXBlLkFBKSkgewogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CiAgICAgICAgIGlmIChkcmF3VHJhY2spIHsKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9TY3JvbGxWaWV3LmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvU2Nyb2xsVmlldy5qYXZhCmluZGV4IDJiYTFjNDcuLmViNTI3ZWIgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9TY3JvbGxWaWV3LmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L1Njcm9sbFZpZXcuamF2YQpAQCAtMTksMTEgKzE5LDggQEAKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC5SOwogCiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5SZXNvdXJjZXM7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5UeXBlZEFycmF5OwotaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQ2FudmFzOwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUmVjdDsKLWltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlOwogaW1wb3J0IGFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQ7CiBpbXBvcnQgYW5kcm9pZC52aWV3LkZvY3VzRmluZGVyOwogaW1wb3J0IGFuZHJvaWQudmlldy5LZXlFdmVudDsKQEAgLTUyLDYgKzQ5LDggQEAKICAqIHdpdGhpbiBhIGxhcmdlciBjb250YWluZXIuCiAgKiAKICAqIDxwPlNjcm9sbFZpZXcgb25seSBzdXBwb3J0cyB2ZXJ0aWNhbCBzY3JvbGxpbmcuCisgKgorICogQGF0dHIgcmVmIGFuZHJvaWQuUi5zdHlsZWFibGUjU2Nyb2xsVmlld19maWxsVmlld3BvcnQKICAqLwogcHVibGljIGNsYXNzIFNjcm9sbFZpZXcgZXh0ZW5kcyBGcmFtZUxheW91dCB7CiAgICAgc3RhdGljIGZpbmFsIGludCBBTklNQVRFRF9TQ1JPTExfR0FQID0gMjUwOwpAQCAtNjIsOSArNjEsNyBAQAogICAgIHByaXZhdGUgbG9uZyBtTGFzdFNjcm9sbDsKIAogICAgIHByaXZhdGUgZmluYWwgUmVjdCBtVGVtcFJlY3QgPSBuZXcgUmVjdCgpOwotICAgIHByaXZhdGUgT3ZlclNjcm9sbGVyIG1TY3JvbGxlcjsKLSAgICBwcml2YXRlIEVkZ2VHbG93IG1FZGdlR2xvd1RvcDsKLSAgICBwcml2YXRlIEVkZ2VHbG93IG1FZGdlR2xvd0JvdHRvbTsKKyAgICBwcml2YXRlIFNjcm9sbGVyIG1TY3JvbGxlcjsKIAogICAgIC8qKgogICAgICAqIEZsYWcgdG8gaW5kaWNhdGUgdGhhdCB3ZSBhcmUgbW92aW5nIGZvY3VzIG91cnNlbHZlcy4gVGhpcyBpcyBzbyB0aGUKQEAgLTExOCw5ICsxMTUsNiBAQAogICAgIHByaXZhdGUgaW50IG1NaW5pbXVtVmVsb2NpdHk7CiAgICAgcHJpdmF0ZSBpbnQgbU1heGltdW1WZWxvY2l0eTsKICAgICAKLSAgICBwcml2YXRlIGludCBtT3ZlcnNjcm9sbERpc3RhbmNlOwotICAgIHByaXZhdGUgaW50IG1PdmVyZmxpbmdEaXN0YW5jZTsKLQogICAgIC8qKgogICAgICAqIElEIG9mIHRoZSBhY3RpdmUgcG9pbnRlci4gVGhpcyBpcyB1c2VkIHRvIHJldGFpbiBjb25zaXN0ZW5jeSBkdXJpbmcKICAgICAgKiBkcmFncy9mbGluZ3MgaWYgbXVsdGlwbGUgcG9pbnRlcnMgYXJlIHVzZWQuCkBAIC0xOTMsNyArMTg3LDcgQEAKIAogCiAgICAgcHJpdmF0ZSB2b2lkIGluaXRTY3JvbGxWaWV3KCkgewotICAgICAgICBtU2Nyb2xsZXIgPSBuZXcgT3ZlclNjcm9sbGVyKGdldENvbnRleHQoKSk7CisgICAgICAgIG1TY3JvbGxlciA9IG5ldyBTY3JvbGxlcihnZXRDb250ZXh0KCkpOwogICAgICAgICBzZXRGb2N1c2FibGUodHJ1ZSk7CiAgICAgICAgIHNldERlc2NlbmRhbnRGb2N1c2FiaWxpdHkoRk9DVVNfQUZURVJfREVTQ0VOREFOVFMpOwogICAgICAgICBzZXRXaWxsTm90RHJhdyhmYWxzZSk7CkBAIC0yMDEsOCArMTk1LDYgQEAKICAgICAgICAgbVRvdWNoU2xvcCA9IGNvbmZpZ3VyYXRpb24uZ2V0U2NhbGVkVG91Y2hTbG9wKCk7CiAgICAgICAgIG1NaW5pbXVtVmVsb2NpdHkgPSBjb25maWd1cmF0aW9uLmdldFNjYWxlZE1pbmltdW1GbGluZ1ZlbG9jaXR5KCk7CiAgICAgICAgIG1NYXhpbXVtVmVsb2NpdHkgPSBjb25maWd1cmF0aW9uLmdldFNjYWxlZE1heGltdW1GbGluZ1ZlbG9jaXR5KCk7Ci0gICAgICAgIG1PdmVyc2Nyb2xsRGlzdGFuY2UgPSBjb25maWd1cmF0aW9uLmdldFNjYWxlZE92ZXJzY3JvbGxEaXN0YW5jZSgpOwotICAgICAgICBtT3ZlcmZsaW5nRGlzdGFuY2UgPSBjb25maWd1cmF0aW9uLmdldFNjYWxlZE92ZXJmbGluZ0Rpc3RhbmNlKCk7CiAgICAgfQogCiAgICAgQE92ZXJyaWRlCkBAIC0yNTcsNiArMjQ5LDggQEAKICAgICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGlzIFNjcm9sbFZpZXcncyBjb250ZW50IGlzIHN0cmV0Y2hlZCB0byBmaWxsIHRoZSB2aWV3cG9ydC4KICAgICAgKgogICAgICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgY29udGVudCBmaWxscyB0aGUgdmlld3BvcnQsIGZhbHNlIG90aGVyd2lzZS4KKyAgICAgKiAKKyAgICAgKiBAYXR0ciByZWYgYW5kcm9pZC5SLnN0eWxlYWJsZSNTY3JvbGxWaWV3X2ZpbGxWaWV3cG9ydAogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIGlzRmlsbFZpZXdwb3J0KCkgewogICAgICAgICByZXR1cm4gbUZpbGxWaWV3cG9ydDsKQEAgLTI2OCw2ICsyNjIsOCBAQAogICAgICAqCiAgICAgICogQHBhcmFtIGZpbGxWaWV3cG9ydCBUcnVlIHRvIHN0cmV0Y2ggdGhlIGNvbnRlbnQncyBoZWlnaHQgdG8gdGhlIHZpZXdwb3J0J3MKICAgICAgKiAgICAgICAgYm91bmRhcmllcywgZmFsc2Ugb3RoZXJ3aXNlLgorICAgICAqIAorICAgICAqIEBhdHRyIHJlZiBhbmRyb2lkLlIuc3R5bGVhYmxlI1Njcm9sbFZpZXdfZmlsbFZpZXdwb3J0CiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0RmlsbFZpZXdwb3J0KGJvb2xlYW4gZmlsbFZpZXdwb3J0KSB7CiAgICAgICAgIGlmIChmaWxsVmlld3BvcnQgIT0gbUZpbGxWaWV3cG9ydCkgewpAQCAtNDYzLDkgKzQ1OSw2IEBACiAgICAgICAgICAgICAgICAgLyogUmVsZWFzZSB0aGUgZHJhZyAqLwogICAgICAgICAgICAgICAgIG1Jc0JlaW5nRHJhZ2dlZCA9IGZhbHNlOwogICAgICAgICAgICAgICAgIG1BY3RpdmVQb2ludGVySWQgPSBJTlZBTElEX1BPSU5URVI7Ci0gICAgICAgICAgICAgICAgaWYgKG1TY3JvbGxlci5zcHJpbmdiYWNrKG1TY3JvbGxYLCBtU2Nyb2xsWSwgMCwgMCwgMCwgZ2V0U2Nyb2xsUmFuZ2UoKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgaW52YWxpZGF0ZSgpOwotICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIGNhc2UgTW90aW9uRXZlbnQuQUNUSU9OX1BPSU5URVJfVVA6CiAgICAgICAgICAgICAgICAgb25TZWNvbmRhcnlQb2ludGVyVXAoZXYpOwpAQCAtNTIzLDI2ICs1MTYsNyBAQAogICAgICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgZGVsdGFZID0gKGludCkgKG1MYXN0TW90aW9uWSAtIHkpOwogICAgICAgICAgICAgICAgICAgICBtTGFzdE1vdGlvblkgPSB5OwogCi0gICAgICAgICAgICAgICAgICAgIGZpbmFsIGludCBvbGRYID0gbVNjcm9sbFg7Ci0gICAgICAgICAgICAgICAgICAgIGZpbmFsIGludCBvbGRZID0gbVNjcm9sbFk7Ci0gICAgICAgICAgICAgICAgICAgIGZpbmFsIGludCByYW5nZSA9IGdldFNjcm9sbFJhbmdlKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChvdmVyc2Nyb2xsQnkoMCwgZGVsdGFZLCAwLCBtU2Nyb2xsWSwgMCwgcmFuZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgbU92ZXJzY3JvbGxEaXN0YW5jZSwgdHJ1ZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIEJyZWFrIG91ciB2ZWxvY2l0eSBpZiB3ZSBoaXQgYSBzY3JvbGwgYmFycmllci4KLSAgICAgICAgICAgICAgICAgICAgICAgIG1WZWxvY2l0eVRyYWNrZXIuY2xlYXIoKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBvblNjcm9sbENoYW5nZWQobVNjcm9sbFgsIG1TY3JvbGxZLCBvbGRYLCBvbGRZKTsKLQotICAgICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgb3ZlcnNjcm9sbE1vZGUgPSBnZXRPdmVyc2Nyb2xsTW9kZSgpOwotICAgICAgICAgICAgICAgICAgICBpZiAob3ZlcnNjcm9sbE1vZGUgPT0gT1ZFUlNDUk9MTF9BTFdBWVMgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAob3ZlcnNjcm9sbE1vZGUgPT0gT1ZFUlNDUk9MTF9JRl9DT05URU5UX1NDUk9MTFMgJiYgcmFuZ2UgPiAwKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IHB1bGxlZFRvWSA9IG9sZFkgKyBkZWx0YVk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAocHVsbGVkVG9ZIDwgMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1FZGdlR2xvd1RvcC5vblB1bGwoKGZsb2F0KSBkZWx0YVkgLyBnZXRIZWlnaHQoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHB1bGxlZFRvWSA+IHJhbmdlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbUVkZ2VHbG93Qm90dG9tLm9uUHVsbCgoZmxvYXQpIGRlbHRhWSAvIGdldEhlaWdodCgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBzY3JvbGxCeSgwLCBkZWx0YVkpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIGNhc2UgTW90aW9uRXZlbnQuQUNUSU9OX1VQOiAKQEAgLTU1MSwxNSArNTI1LDggQEAKICAgICAgICAgICAgICAgICAgICAgdmVsb2NpdHlUcmFja2VyLmNvbXB1dGVDdXJyZW50VmVsb2NpdHkoMTAwMCwgbU1heGltdW1WZWxvY2l0eSk7CiAgICAgICAgICAgICAgICAgICAgIGludCBpbml0aWFsVmVsb2NpdHkgPSAoaW50KSB2ZWxvY2l0eVRyYWNrZXIuZ2V0WVZlbG9jaXR5KG1BY3RpdmVQb2ludGVySWQpOwogCi0gICAgICAgICAgICAgICAgICAgIGlmIChnZXRDaGlsZENvdW50KCkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoKE1hdGguYWJzKGluaXRpYWxWZWxvY2l0eSkgPiBtTWluaW11bVZlbG9jaXR5KSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsaW5nKC1pbml0aWFsVmVsb2NpdHkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgYm90dG9tID0gZ2V0U2Nyb2xsUmFuZ2UoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobVNjcm9sbGVyLnNwcmluZ2JhY2sobVNjcm9sbFgsIG1TY3JvbGxZLCAwLCAwLCAwLCBib3R0b20pKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludmFsaWRhdGUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChnZXRDaGlsZENvdW50KCkgPiAwICYmIE1hdGguYWJzKGluaXRpYWxWZWxvY2l0eSkgPiBtTWluaW11bVZlbG9jaXR5KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmbGluZygtaW5pdGlhbFZlbG9jaXR5KTsKICAgICAgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgICAgIG1BY3RpdmVQb2ludGVySWQgPSBJTlZBTElEX1BPSU5URVI7CkBAIC01NjksMjcgKzUzNiwxNiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgbVZlbG9jaXR5VHJhY2tlci5yZWN5Y2xlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBtVmVsb2NpdHlUcmFja2VyID0gbnVsbDsKICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpZiAobUVkZ2VHbG93VG9wICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1FZGdlR2xvd1RvcC5vblJlbGVhc2UoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1FZGdlR2xvd0JvdHRvbS5vblJlbGVhc2UoKTsKLSAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIGNhc2UgTW90aW9uRXZlbnQuQUNUSU9OX0NBTkNFTDoKICAgICAgICAgICAgICAgICBpZiAobUlzQmVpbmdEcmFnZ2VkICYmIGdldENoaWxkQ291bnQoKSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1TY3JvbGxlci5zcHJpbmdiYWNrKG1TY3JvbGxYLCBtU2Nyb2xsWSwgMCwgMCwgMCwgZ2V0U2Nyb2xsUmFuZ2UoKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGludmFsaWRhdGUoKTsKLSAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBtQWN0aXZlUG9pbnRlcklkID0gSU5WQUxJRF9QT0lOVEVSOwogICAgICAgICAgICAgICAgICAgICBtSXNCZWluZ0RyYWdnZWQgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgaWYgKG1WZWxvY2l0eVRyYWNrZXIgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgICAgICAgbVZlbG9jaXR5VHJhY2tlci5yZWN5Y2xlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBtVmVsb2NpdHlUcmFja2VyID0gbnVsbDsKICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpZiAobUVkZ2VHbG93VG9wICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1FZGdlR2xvd1RvcC5vblJlbGVhc2UoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1FZGdlR2xvd0JvdHRvbS5vblJlbGVhc2UoKTsKLSAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIGNhc2UgTW90aW9uRXZlbnQuQUNUSU9OX1BPSU5URVJfVVA6CkBAIC02MTYsMzIgKzU3Miw2IEBACiAgICAgICAgIH0KICAgICB9CiAgICAgCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgb25PdmVyc2Nyb2xsZWQoaW50IHNjcm9sbFgsIGludCBzY3JvbGxZLAotICAgICAgICAgICAgYm9vbGVhbiBjbGFtcGVkWCwgYm9vbGVhbiBjbGFtcGVkWSkgewotICAgICAgICAvLyBUcmVhdCBhbmltYXRpbmcgc2Nyb2xscyBkaWZmZXJlbnRseTsgc2VlICNjb21wdXRlU2Nyb2xsKCkgZm9yIHdoeS4KLSAgICAgICAgaWYgKCFtU2Nyb2xsZXIuaXNGaW5pc2hlZCgpKSB7Ci0gICAgICAgICAgICBtU2Nyb2xsWCA9IHNjcm9sbFg7Ci0gICAgICAgICAgICBtU2Nyb2xsWSA9IHNjcm9sbFk7Ci0gICAgICAgICAgICBpZiAoY2xhbXBlZFkpIHsKLSAgICAgICAgICAgICAgICBtU2Nyb2xsZXIuc3ByaW5nYmFjayhtU2Nyb2xsWCwgbVNjcm9sbFksIDAsIDAsIDAsIGdldFNjcm9sbFJhbmdlKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgc3VwZXIuc2Nyb2xsVG8oc2Nyb2xsWCwgc2Nyb2xsWSk7Ci0gICAgICAgIH0KLSAgICAgICAgYXdha2VuU2Nyb2xsQmFycygpOwotICAgIH0KLQotICAgIHByaXZhdGUgaW50IGdldFNjcm9sbFJhbmdlKCkgewotICAgICAgICBpbnQgc2Nyb2xsUmFuZ2UgPSAwOwotICAgICAgICBpZiAoZ2V0Q2hpbGRDb3VudCgpID4gMCkgewotICAgICAgICAgICAgVmlldyBjaGlsZCA9IGdldENoaWxkQXQoMCk7Ci0gICAgICAgICAgICBzY3JvbGxSYW5nZSA9IE1hdGgubWF4KDAsCi0gICAgICAgICAgICAgICAgICAgIGNoaWxkLmdldEhlaWdodCgpIC0gZ2V0SGVpZ2h0KCkgLSBtUGFkZGluZ0JvdHRvbSAtIG1QYWRkaW5nVG9wKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gc2Nyb2xsUmFuZ2U7Ci0gICAgfQotCiAgICAgLyoqCiAgICAgICogPHA+CiAgICAgICogRmluZHMgdGhlIG5leHQgZm9jdXNhYmxlIGNvbXBvbmVudCB0aGF0IGZpdHMgaW4gdGhpcyBWaWV3J3MgYm91bmRzCkBAIC0xMDE4LDE2ICs5NDgsNyBAQAogICAgICAgICAgICAgcmV0dXJuIGNvbnRlbnRIZWlnaHQ7CiAgICAgICAgIH0KICAgICAgICAgCi0gICAgICAgIGludCBzY3JvbGxSYW5nZSA9IGdldENoaWxkQXQoMCkuZ2V0Qm90dG9tKCk7Ci0gICAgICAgIGZpbmFsIGludCBzY3JvbGxZID0gbVNjcm9sbFk7Ci0gICAgICAgIGZpbmFsIGludCBvdmVyc2Nyb2xsQm90dG9tID0gTWF0aC5tYXgoMCwgc2Nyb2xsUmFuZ2UgLSBjb250ZW50SGVpZ2h0KTsKLSAgICAgICAgaWYgKHNjcm9sbFkgPCAwKSB7Ci0gICAgICAgICAgICBzY3JvbGxSYW5nZSAtPSBzY3JvbGxZOwotICAgICAgICB9IGVsc2UgaWYgKHNjcm9sbFkgPiBvdmVyc2Nyb2xsQm90dG9tKSB7Ci0gICAgICAgICAgICBzY3JvbGxSYW5nZSArPSBzY3JvbGxZIC0gb3ZlcnNjcm9sbEJvdHRvbTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBzY3JvbGxSYW5nZTsKKyAgICAgICAgcmV0dXJuIGdldENoaWxkQXQoMCkuZ2V0Qm90dG9tKCk7CiAgICAgfQogCiAgICAgQE92ZXJyaWRlCkBAIC0xMDg4LDIwICsxMDA5LDE0IEBACiAgICAgICAgICAgICBpbnQgeCA9IG1TY3JvbGxlci5nZXRDdXJyWCgpOwogICAgICAgICAgICAgaW50IHkgPSBtU2Nyb2xsZXIuZ2V0Q3VyclkoKTsKIAotICAgICAgICAgICAgaWYgKG9sZFggIT0geCB8fCBvbGRZICE9IHkpIHsKLSAgICAgICAgICAgICAgICBvdmVyc2Nyb2xsQnkoeCAtIG9sZFgsIHkgLSBvbGRZLCBvbGRYLCBvbGRZLCAwLCBnZXRTY3JvbGxSYW5nZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgMCwgbU92ZXJmbGluZ0Rpc3RhbmNlLCBmYWxzZSk7Ci0gICAgICAgICAgICAgICAgb25TY3JvbGxDaGFuZ2VkKG1TY3JvbGxYLCBtU2Nyb2xsWSwgb2xkWCwgb2xkWSk7Ci0KLSAgICAgICAgICAgICAgICBmaW5hbCBpbnQgcmFuZ2UgPSBnZXRTY3JvbGxSYW5nZSgpOwotICAgICAgICAgICAgICAgIGZpbmFsIGludCBvdmVyc2Nyb2xsTW9kZSA9IGdldE92ZXJzY3JvbGxNb2RlKCk7Ci0gICAgICAgICAgICAgICAgaWYgKG92ZXJzY3JvbGxNb2RlID09IE9WRVJTQ1JPTExfQUxXQVlTIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAob3ZlcnNjcm9sbE1vZGUgPT0gT1ZFUlNDUk9MTF9JRl9DT05URU5UX1NDUk9MTFMgJiYgcmFuZ2UgPiAwKSkgewotICAgICAgICAgICAgICAgICAgICBpZiAoeSA8IDAgJiYgb2xkWSA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtRWRnZUdsb3dUb3Aub25BYnNvcmIoKGludCkgbVNjcm9sbGVyLmdldEN1cnJWZWxvY2l0eSgpKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh5ID4gcmFuZ2UgJiYgb2xkWSA8PSByYW5nZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgbUVkZ2VHbG93Qm90dG9tLm9uQWJzb3JiKChpbnQpIG1TY3JvbGxlci5nZXRDdXJyVmVsb2NpdHkoKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChnZXRDaGlsZENvdW50KCkgPiAwKSB7CisgICAgICAgICAgICAgICAgVmlldyBjaGlsZCA9IGdldENoaWxkQXQoMCk7CisgICAgICAgICAgICAgICAgeCA9IGNsYW1wKHgsIGdldFdpZHRoKCkgLSBtUGFkZGluZ1JpZ2h0IC0gbVBhZGRpbmdMZWZ0LCBjaGlsZC5nZXRXaWR0aCgpKTsKKyAgICAgICAgICAgICAgICB5ID0gY2xhbXAoeSwgZ2V0SGVpZ2h0KCkgLSBtUGFkZGluZ0JvdHRvbSAtIG1QYWRkaW5nVG9wLCBjaGlsZC5nZXRIZWlnaHQoKSk7CisgICAgICAgICAgICAgICAgaWYgKHggIT0gb2xkWCB8fCB5ICE9IG9sZFkpIHsKKyAgICAgICAgICAgICAgICAgICAgbVNjcm9sbFggPSB4OworICAgICAgICAgICAgICAgICAgICBtU2Nyb2xsWSA9IHk7CisgICAgICAgICAgICAgICAgICAgIG9uU2Nyb2xsQ2hhbmdlZCh4LCB5LCBvbGRYLCBvbGRZKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBhd2FrZW5TY3JvbGxCYXJzKCk7CkBAIC0xMzM5LDcgKzEyNTQsNyBAQAogICAgICAgICAgICAgaW50IGJvdHRvbSA9IGdldENoaWxkQXQoMCkuZ2V0SGVpZ2h0KCk7CiAgICAgCiAgICAgICAgICAgICBtU2Nyb2xsZXIuZmxpbmcobVNjcm9sbFgsIG1TY3JvbGxZLCAwLCB2ZWxvY2l0eVksIDAsIDAsIDAsIAotICAgICAgICAgICAgICAgICAgICBNYXRoLm1heCgwLCBib3R0b20gLSBoZWlnaHQpLCAwLCBoZWlnaHQvMik7CisgICAgICAgICAgICAgICAgICAgIE1hdGgubWF4KDAsIGJvdHRvbSAtIGhlaWdodCkpOwogICAgIAogICAgICAgICAgICAgZmluYWwgYm9vbGVhbiBtb3ZpbmdEb3duID0gdmVsb2NpdHlZID4gMDsKICAgICAKQEAgLTEzNzcsNTUgKzEyOTIsNiBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2V0T3ZlcnNjcm9sbE1vZGUoaW50IG1vZGUpIHsKLSAgICAgICAgaWYgKG1vZGUgIT0gT1ZFUlNDUk9MTF9ORVZFUikgewotICAgICAgICAgICAgaWYgKG1FZGdlR2xvd1RvcCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgZmluYWwgUmVzb3VyY2VzIHJlcyA9IGdldENvbnRleHQoKS5nZXRSZXNvdXJjZXMoKTsKLSAgICAgICAgICAgICAgICBmaW5hbCBEcmF3YWJsZSBlZGdlID0gcmVzLmdldERyYXdhYmxlKFIuZHJhd2FibGUub3ZlcnNjcm9sbF9lZGdlKTsKLSAgICAgICAgICAgICAgICBmaW5hbCBEcmF3YWJsZSBnbG93ID0gcmVzLmdldERyYXdhYmxlKFIuZHJhd2FibGUub3ZlcnNjcm9sbF9nbG93KTsKLSAgICAgICAgICAgICAgICBtRWRnZUdsb3dUb3AgPSBuZXcgRWRnZUdsb3coZWRnZSwgZ2xvdyk7Ci0gICAgICAgICAgICAgICAgbUVkZ2VHbG93Qm90dG9tID0gbmV3IEVkZ2VHbG93KGVkZ2UsIGdsb3cpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbUVkZ2VHbG93VG9wID0gbnVsbDsKLSAgICAgICAgICAgIG1FZGdlR2xvd0JvdHRvbSA9IG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgc3VwZXIuc2V0T3ZlcnNjcm9sbE1vZGUobW9kZSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgZHJhdyhDYW52YXMgY2FudmFzKSB7Ci0gICAgICAgIHN1cGVyLmRyYXcoY2FudmFzKTsKLSAgICAgICAgaWYgKG1FZGdlR2xvd1RvcCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBmaW5hbCBpbnQgc2Nyb2xsWSA9IG1TY3JvbGxZOwotICAgICAgICAgICAgaWYgKCFtRWRnZUdsb3dUb3AuaXNGaW5pc2hlZCgpKSB7Ci0gICAgICAgICAgICAgICAgZmluYWwgaW50IHJlc3RvcmVDb3VudCA9IGNhbnZhcy5zYXZlKCk7Ci0gICAgICAgICAgICAgICAgZmluYWwgaW50IHdpZHRoID0gZ2V0V2lkdGgoKTsKLQotICAgICAgICAgICAgICAgIGNhbnZhcy50cmFuc2xhdGUoLXdpZHRoIC8gMiwgTWF0aC5taW4oMCwgc2Nyb2xsWSkpOwotICAgICAgICAgICAgICAgIG1FZGdlR2xvd1RvcC5zZXRTaXplKHdpZHRoICogMiwgZ2V0SGVpZ2h0KCkpOwotICAgICAgICAgICAgICAgIGlmIChtRWRnZUdsb3dUb3AuZHJhdyhjYW52YXMpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGludmFsaWRhdGUoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY2FudmFzLnJlc3RvcmVUb0NvdW50KHJlc3RvcmVDb3VudCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoIW1FZGdlR2xvd0JvdHRvbS5pc0ZpbmlzaGVkKCkpIHsKLSAgICAgICAgICAgICAgICBmaW5hbCBpbnQgcmVzdG9yZUNvdW50ID0gY2FudmFzLnNhdmUoKTsKLSAgICAgICAgICAgICAgICBmaW5hbCBpbnQgd2lkdGggPSBnZXRXaWR0aCgpOwotICAgICAgICAgICAgICAgIGZpbmFsIGludCBoZWlnaHQgPSBnZXRIZWlnaHQoKTsKLQotICAgICAgICAgICAgICAgIGNhbnZhcy50cmFuc2xhdGUoLXdpZHRoIC8gMiwgTWF0aC5tYXgoZ2V0U2Nyb2xsUmFuZ2UoKSwgc2Nyb2xsWSkgKyBoZWlnaHQpOwotICAgICAgICAgICAgICAgIGNhbnZhcy5yb3RhdGUoMTgwLCB3aWR0aCwgMCk7Ci0gICAgICAgICAgICAgICAgbUVkZ2VHbG93Qm90dG9tLnNldFNpemUod2lkdGggKiAyLCBoZWlnaHQpOwotICAgICAgICAgICAgICAgIGlmIChtRWRnZUdsb3dCb3R0b20uZHJhdyhjYW52YXMpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGludmFsaWRhdGUoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY2FudmFzLnJlc3RvcmVUb0NvdW50KHJlc3RvcmVDb3VudCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KICAgICBwcml2YXRlIGludCBjbGFtcChpbnQgbiwgaW50IG15LCBpbnQgY2hpbGQpIHsKICAgICAgICAgaWYgKG15ID49IGNoaWxkIHx8IG4gPCAwKSB7CiAgICAgICAgICAgICAvKiBteSA+PSBjaGlsZCBpcyB0aGlzIGNhc2U6CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvU2Nyb2xsZXIuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9TY3JvbGxlci5qYXZhCmluZGV4IDIzZjcyYjYuLjRjYjA4MzkgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9TY3JvbGxlci5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9TY3JvbGxlci5qYXZhCkBAIC01MCw2ICs1MCw4IEBACiAgICAgcHJpdmF0ZSBmbG9hdCBtRHVyYXRpb25SZWNpcHJvY2FsOwogICAgIHByaXZhdGUgZmxvYXQgbURlbHRhWDsKICAgICBwcml2YXRlIGZsb2F0IG1EZWx0YVk7CisgICAgcHJpdmF0ZSBmbG9hdCBtVmlzY291c0ZsdWlkU2NhbGU7CisgICAgcHJpdmF0ZSBmbG9hdCBtVmlzY291c0ZsdWlkTm9ybWFsaXplOwogICAgIHByaXZhdGUgYm9vbGVhbiBtRmluaXNoZWQ7CiAgICAgcHJpdmF0ZSBJbnRlcnBvbGF0b3IgbUludGVycG9sYXRvcjsKIApAQCAtNjMsMTcgKzY1LDYgQEAKIAogICAgIHByaXZhdGUgZmluYWwgZmxvYXQgbURlY2VsZXJhdGlvbjsKIAotICAgIHByaXZhdGUgc3RhdGljIGZsb2F0IHNWaXNjb3VzRmx1aWRTY2FsZTsKLSAgICBwcml2YXRlIHN0YXRpYyBmbG9hdCBzVmlzY291c0ZsdWlkTm9ybWFsaXplOwotCi0gICAgc3RhdGljIHsKLSAgICAgICAgLy8gVGhpcyBjb250cm9scyB0aGUgdmlzY291cyBmbHVpZCBlZmZlY3QgKGhvdyBtdWNoIG9mIGl0KQotICAgICAgICBzVmlzY291c0ZsdWlkU2NhbGUgPSA4LjBmOwotICAgICAgICAvLyBtdXN0IGJlIHNldCB0byAxLjAgKHVzZWQgaW4gdmlzY291c0ZsdWlkKCkpCi0gICAgICAgIHNWaXNjb3VzRmx1aWROb3JtYWxpemUgPSAxLjBmOwotICAgICAgICBzVmlzY291c0ZsdWlkTm9ybWFsaXplID0gMS4wZiAvIHZpc2NvdXNGbHVpZCgxLjBmKTsKLSAgICB9Ci0KICAgICAvKioKICAgICAgKiBDcmVhdGUgYSBTY3JvbGxlciB3aXRoIHRoZSBkZWZhdWx0IGR1cmF0aW9uIGFuZCBpbnRlcnBvbGF0b3IuCiAgICAgICovCkBAIC0yODYsNiArMjc3LDExIEBACiAgICAgICAgIG1EZWx0YVggPSBkeDsKICAgICAgICAgbURlbHRhWSA9IGR5OwogICAgICAgICBtRHVyYXRpb25SZWNpcHJvY2FsID0gMS4wZiAvIChmbG9hdCkgbUR1cmF0aW9uOworICAgICAgICAvLyBUaGlzIGNvbnRyb2xzIHRoZSB2aXNjb3VzIGZsdWlkIGVmZmVjdCAoaG93IG11Y2ggb2YgaXQpCisgICAgICAgIG1WaXNjb3VzRmx1aWRTY2FsZSA9IDguMGY7CisgICAgICAgIC8vIG11c3QgYmUgc2V0IHRvIDEuMCAodXNlZCBpbiB2aXNjb3VzRmx1aWQoKSkKKyAgICAgICAgbVZpc2NvdXNGbHVpZE5vcm1hbGl6ZSA9IDEuMGY7CisgICAgICAgIG1WaXNjb3VzRmx1aWROb3JtYWxpemUgPSAxLjBmIC8gdmlzY291c0ZsdWlkKDEuMGYpOwogICAgIH0KIAogICAgIC8qKgpAQCAtMzQzLDkgKzMzOSwxMSBAQAogICAgICAgICBtRmluYWxZID0gTWF0aC5tYXgobUZpbmFsWSwgbU1pblkpOwogICAgIH0KICAgICAKLSAgICBzdGF0aWMgZmxvYXQgdmlzY291c0ZsdWlkKGZsb2F0IHgpCisgICAgCisgICAgCisgICAgcHJpdmF0ZSBmbG9hdCB2aXNjb3VzRmx1aWQoZmxvYXQgeCkKICAgICB7Ci0gICAgICAgIHggKj0gc1Zpc2NvdXNGbHVpZFNjYWxlOworICAgICAgICB4ICo9IG1WaXNjb3VzRmx1aWRTY2FsZTsKICAgICAgICAgaWYgKHggPCAxLjBmKSB7CiAgICAgICAgICAgICB4IC09ICgxLjBmIC0gKGZsb2F0KU1hdGguZXhwKC14KSk7CiAgICAgICAgIH0gZWxzZSB7CkBAIC0zNTMsNyArMzUxLDcgQEAKICAgICAgICAgICAgIHggPSAxLjBmIC0gKGZsb2F0KU1hdGguZXhwKDEuMGYgLSB4KTsKICAgICAgICAgICAgIHggPSBzdGFydCArIHggKiAoMS4wZiAtIHN0YXJ0KTsKICAgICAgICAgfQotICAgICAgICB4ICo9IHNWaXNjb3VzRmx1aWROb3JtYWxpemU7CisgICAgICAgIHggKj0gbVZpc2NvdXNGbHVpZE5vcm1hbGl6ZTsKICAgICAgICAgcmV0dXJuIHg7CiAgICAgfQogICAgIApkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L1NlYXJjaFZpZXcuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9TZWFyY2hWaWV3LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTdkYzcyNQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9TZWFyY2hWaWV3LmphdmEKQEAgLTAsMCArMSw2ODkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQud2lkZ2V0OworCitpbXBvcnQgc3RhdGljIGFuZHJvaWQud2lkZ2V0LlN1Z2dlc3Rpb25zQWRhcHRlci5nZXRDb2x1bW5TdHJpbmc7CisKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC5SOworCitpbXBvcnQgYW5kcm9pZC5hcHAuU2VhcmNoTWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkLmFwcC5TZWFyY2hhYmxlSW5mbzsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuVHlwZWRBcnJheTsKK2ltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLkN1cnNvcjsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlOworaW1wb3J0IGFuZHJvaWQubmV0LlVyaTsKK2ltcG9ydCBhbmRyb2lkLnRleHQuRWRpdGFibGU7CitpbXBvcnQgYW5kcm9pZC50ZXh0LlRleHRVdGlsczsKK2ltcG9ydCBhbmRyb2lkLnRleHQuVGV4dFdhdGNoZXI7CitpbXBvcnQgYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldDsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworaW1wb3J0IGFuZHJvaWQudmlldy5LZXlFdmVudDsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuTGF5b3V0SW5mbGF0ZXI7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CitpbXBvcnQgYW5kcm9pZC52aWV3LmlucHV0bWV0aG9kLklucHV0TWV0aG9kTWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5BZGFwdGVyVmlldy5Pbkl0ZW1DbGlja0xpc3RlbmVyOworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkFkYXB0ZXJWaWV3Lk9uSXRlbVNlbGVjdGVkTGlzdGVuZXI7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuVGV4dFZpZXcuT25FZGl0b3JBY3Rpb25MaXN0ZW5lcjsKKworaW1wb3J0IGphdmEudXRpbC5XZWFrSGFzaE1hcDsKKworLyoqCisgKiBQcm92aWRlcyB0aGUgdXNlciBpbnRlcmZhY2UgZWxlbWVudHMgZm9yIHRoZSB1c2VyIHRvIGVudGVyIGEgc2VhcmNoIHF1ZXJ5IGFuZCBzdWJtaXQgYQorICogcmVxdWVzdCB0byBhIHNlYXJjaCBwcm92aWRlci4gU2hvd3MgYSBsaXN0IG9mIHF1ZXJ5IHN1Z2dlc3Rpb25zIG9yIHJlc3VsdHMsIGlmCisgKiBhdmFpbGFibGUgYW5kIGFsbG93cyB0aGUgdXNlciB0byBwaWNrIGEgc3VnZ2VzdGlvbiBvciByZXN1bHQgdG8gbGF1bmNoIGludG8uCisgKi8KK3B1YmxpYyBjbGFzcyBTZWFyY2hWaWV3IGV4dGVuZHMgTGluZWFyTGF5b3V0IHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gREJHID0gZmFsc2U7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIExPR19UQUcgPSAiU2VhcmNoVmlldyI7CisKKyAgICBwcml2YXRlIE9uUXVlcnlDaGFuZ2VMaXN0ZW5lciBtT25RdWVyeUNoYW5nZUxpc3RlbmVyOworICAgIHByaXZhdGUgT25DbG9zZUxpc3RlbmVyIG1PbkNsb3NlTGlzdGVuZXI7CisKKyAgICBwcml2YXRlIGJvb2xlYW4gbUljb25pZmllZEJ5RGVmYXVsdDsKKyAgICBwcml2YXRlIGJvb2xlYW4gbUljb25pZmllZDsKKyAgICBwcml2YXRlIEN1cnNvckFkYXB0ZXIgbVN1Z2dlc3Rpb25zQWRhcHRlcjsKKyAgICBwcml2YXRlIFZpZXcgbVNlYXJjaEJ1dHRvbjsKKyAgICBwcml2YXRlIFZpZXcgbVN1Ym1pdEJ1dHRvbjsKKyAgICBwcml2YXRlIFZpZXcgbUNsb3NlQnV0dG9uOworICAgIHByaXZhdGUgVmlldyBtU2VhcmNoRWRpdEZyYW1lOworICAgIHByaXZhdGUgQXV0b0NvbXBsZXRlVGV4dFZpZXcgbVF1ZXJ5VGV4dFZpZXc7CisgICAgcHJpdmF0ZSBib29sZWFuIG1TdWJtaXRCdXR0b25FbmFibGVkOworICAgIHByaXZhdGUgQ2hhclNlcXVlbmNlIG1RdWVyeUhpbnQ7CisKKyAgICBwcml2YXRlIFNlYXJjaGFibGVJbmZvIG1TZWFyY2hhYmxlOworCisgICAgLy8gQSB3ZWFrIG1hcCBvZiBkcmF3YWJsZXMgd2UndmUgZ290dGVuIGZyb20gb3RoZXIgcGFja2FnZXMsIHNvIHdlIGRvbid0IGxvYWQgdGhlbQorICAgIC8vIG1vcmUgdGhhbiBvbmNlLgorICAgIHByaXZhdGUgZmluYWwgV2Vha0hhc2hNYXA8U3RyaW5nLCBEcmF3YWJsZS5Db25zdGFudFN0YXRlPiBtT3V0c2lkZURyYXdhYmxlc0NhY2hlID0KKyAgICAgICAgICAgIG5ldyBXZWFrSGFzaE1hcDxTdHJpbmcsIERyYXdhYmxlLkNvbnN0YW50U3RhdGU+KCk7CisKKyAgICAvKioKKyAgICAgKiBDYWxsYmFja3MgZm9yIGNoYW5nZXMgdG8gdGhlIHF1ZXJ5IHRleHQuCisgICAgICovCisgICAgcHVibGljIGludGVyZmFjZSBPblF1ZXJ5Q2hhbmdlTGlzdGVuZXIgeworCisgICAgICAgIC8qKgorICAgICAgICAgKiBDYWxsZWQgd2hlbiB0aGUgdXNlciBzdWJtaXRzIHRoZSBxdWVyeS4gVGhpcyBjb3VsZCBiZSBkdWUgdG8gYSBrZXkgcHJlc3Mgb24gdGhlCisgICAgICAgICAqIGtleWJvYXJkIG9yIGR1ZSB0byBwcmVzc2luZyBhIHN1Ym1pdCBidXR0b24uCisgICAgICAgICAqIFRoZSBsaXN0ZW5lciBjYW4gb3ZlcnJpZGUgdGhlIHN0YW5kYXJkIGJlaGF2aW9yIGJ5IHJldHVybmluZyB0cnVlCisgICAgICAgICAqIHRvIGluZGljYXRlIHRoYXQgaXQgaGFzIGhhbmRsZWQgdGhlIHN1Ym1pdCByZXF1ZXN0LiBPdGhlcndpc2UgcmV0dXJuIGZhbHNlIHRvCisgICAgICAgICAqIGxldCB0aGUgU2VhcmNoVmlldyBoYW5kbGUgdGhlIHN1Ym1pc3Npb24gYnkgbGF1bmNoaW5nIGFueSBhc3NvY2lhdGVkIGludGVudC4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIHF1ZXJ5IHRoZSBxdWVyeSB0ZXh0IHRoYXQgaXMgdG8gYmUgc3VibWl0dGVkCisgICAgICAgICAqCisgICAgICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgcXVlcnkgaGFzIGJlZW4gaGFuZGxlZCBieSB0aGUgbGlzdGVuZXIsIGZhbHNlIHRvIGxldCB0aGUKKyAgICAgICAgICogU2VhcmNoVmlldyBwZXJmb3JtIHRoZSBkZWZhdWx0IGFjdGlvbi4KKyAgICAgICAgICovCisgICAgICAgIGJvb2xlYW4gb25TdWJtaXRRdWVyeShTdHJpbmcgcXVlcnkpOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBDYWxsZWQgd2hlbiB0aGUgcXVlcnkgdGV4dCBpcyBjaGFuZ2VkIGJ5IHRoZSB1c2VyLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gbmV3VGV4dCB0aGUgbmV3IGNvbnRlbnQgb2YgdGhlIHF1ZXJ5IHRleHQgZmllbGQuCisgICAgICAgICAqCisgICAgICAgICAqIEByZXR1cm4gZmFsc2UgaWYgdGhlIFNlYXJjaFZpZXcgc2hvdWxkIHBlcmZvcm0gdGhlIGRlZmF1bHQgYWN0aW9uIG9mIHNob3dpbmcgYW55CisgICAgICAgICAqIHN1Z2dlc3Rpb25zIGlmIGF2YWlsYWJsZSwgdHJ1ZSBpZiB0aGUgYWN0aW9uIHdhcyBoYW5kbGVkIGJ5IHRoZSBsaXN0ZW5lci4KKyAgICAgICAgICovCisgICAgICAgIGJvb2xlYW4gb25RdWVyeVRleHRDaGFuZ2VkKFN0cmluZyBuZXdUZXh0KTsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50ZXJmYWNlIE9uQ2xvc2VMaXN0ZW5lciB7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSB1c2VyIGlzIGF0dGVtcHRpbmcgdG8gY2xvc2UgdGhlIFNlYXJjaFZpZXcuCisgICAgICAgICAqCisgICAgICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgbGlzdGVuZXIgd2FudHMgdG8gb3ZlcnJpZGUgdGhlIGRlZmF1bHQgYmVoYXZpb3Igb2YgY2xlYXJpbmcgdGhlCisgICAgICAgICAqIHRleHQgZmllbGQgYW5kIGRpc21pc3NpbmcgaXQsIGZhbHNlIG90aGVyd2lzZS4KKyAgICAgICAgICovCisgICAgICAgIGJvb2xlYW4gb25DbG9zZSgpOworICAgIH0KKworICAgIHB1YmxpYyBTZWFyY2hWaWV3KENvbnRleHQgY29udGV4dCkgeworICAgICAgICB0aGlzKGNvbnRleHQsIG51bGwpOworICAgIH0KKworICAgIHB1YmxpYyBTZWFyY2hWaWV3KENvbnRleHQgY29udGV4dCwgQXR0cmlidXRlU2V0IGF0dHJzKSB7CisgICAgICAgIHN1cGVyKGNvbnRleHQsIGF0dHJzKTsKKworICAgICAgICBMYXlvdXRJbmZsYXRlciBpbmZsYXRlciA9IChMYXlvdXRJbmZsYXRlcikgY29udGV4dAorICAgICAgICAgICAgICAgIC5nZXRTeXN0ZW1TZXJ2aWNlKENvbnRleHQuTEFZT1VUX0lORkxBVEVSX1NFUlZJQ0UpOworICAgICAgICBpbmZsYXRlci5pbmZsYXRlKFIubGF5b3V0LnNlYXJjaF92aWV3LCB0aGlzLCB0cnVlKTsKKworICAgICAgICBtU2VhcmNoQnV0dG9uID0gZmluZFZpZXdCeUlkKFIuaWQuc2VhcmNoX2J1dHRvbik7CisgICAgICAgIG1RdWVyeVRleHRWaWV3ID0gKEF1dG9Db21wbGV0ZVRleHRWaWV3KSBmaW5kVmlld0J5SWQoUi5pZC5zZWFyY2hfc3JjX3RleHQpOworICAgICAgICBtU2VhcmNoRWRpdEZyYW1lID0gZmluZFZpZXdCeUlkKFIuaWQuc2VhcmNoX2VkaXRfZnJhbWUpOworICAgICAgICBtU3VibWl0QnV0dG9uID0gZmluZFZpZXdCeUlkKFIuaWQuc2VhcmNoX2dvX2J0bik7CisgICAgICAgIG1DbG9zZUJ1dHRvbiA9IGZpbmRWaWV3QnlJZChSLmlkLnNlYXJjaF9jbG9zZV9idG4pOworCisgICAgICAgIG1TZWFyY2hCdXR0b24uc2V0T25DbGlja0xpc3RlbmVyKG1PbkNsaWNrTGlzdGVuZXIpOworICAgICAgICBtQ2xvc2VCdXR0b24uc2V0T25DbGlja0xpc3RlbmVyKG1PbkNsaWNrTGlzdGVuZXIpOworICAgICAgICBtU3VibWl0QnV0dG9uLnNldE9uQ2xpY2tMaXN0ZW5lcihtT25DbGlja0xpc3RlbmVyKTsKKyAgICAgICAgbVF1ZXJ5VGV4dFZpZXcuYWRkVGV4dENoYW5nZWRMaXN0ZW5lcihtVGV4dFdhdGNoZXIpOworICAgICAgICBtUXVlcnlUZXh0Vmlldy5zZXRPbkVkaXRvckFjdGlvbkxpc3RlbmVyKG1PbkVkaXRvckFjdGlvbkxpc3RlbmVyKTsKKyAgICAgICAgbVF1ZXJ5VGV4dFZpZXcuc2V0T25JdGVtQ2xpY2tMaXN0ZW5lcihtT25JdGVtQ2xpY2tMaXN0ZW5lcik7CisgICAgICAgIG1RdWVyeVRleHRWaWV3LnNldE9uSXRlbVNlbGVjdGVkTGlzdGVuZXIobU9uSXRlbVNlbGVjdGVkTGlzdGVuZXIpOworCisgICAgICAgIFR5cGVkQXJyYXkgYSA9IGNvbnRleHQub2J0YWluU3R5bGVkQXR0cmlidXRlcyhhdHRycywgUi5zdHlsZWFibGUuU2VhcmNoVmlldywgMCwgMCk7CisgICAgICAgIHNldEljb25pZmllZEJ5RGVmYXVsdChhLmdldEJvb2xlYW4oUi5zdHlsZWFibGUuU2VhcmNoVmlld19pY29uaWZpZWRCeURlZmF1bHQsIHRydWUpKTsKKyAgICAgICAgYS5yZWN5Y2xlKCk7CisKKyAgICAgICAgdXBkYXRlVmlld3NWaXNpYmlsaXR5KG1JY29uaWZpZWRCeURlZmF1bHQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIFNlYXJjaGFibGVJbmZvIGZvciB0aGlzIFNlYXJjaFZpZXcuIFByb3BlcnRpZXMgaW4gdGhlIFNlYXJjaGFibGVJbmZvIGFyZSB1c2VkCisgICAgICogdG8gZGlzcGxheSBsYWJlbHMsIGhpbnRzLCBzdWdnZXN0aW9ucywgY3JlYXRlIGludGVudHMgZm9yIGxhdW5jaGluZyBzZWFyY2ggcmVzdWx0cyBzY3JlZW5zCisgICAgICogYW5kIGNvbnRyb2xsaW5nIG90aGVyIGFmZm9yZGFuY2VzIHN1Y2ggYXMgYSB2b2ljZSBidXR0b24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gc2VhcmNoYWJsZSBhIFNlYXJjaGFibGVJbmZvIGNhbiBiZSByZXRyaWV2ZWQgZnJvbSB0aGUgU2VhcmNoTWFuYWdlciwgZm9yIGEgc3BlY2lmaWMKKyAgICAgKiBhY3Rpdml0eSBvciBhIGdsb2JhbCBzZWFyY2ggcHJvdmlkZXIuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0U2VhcmNoYWJsZUluZm8oU2VhcmNoYWJsZUluZm8gc2VhcmNoYWJsZSkgeworICAgICAgICBtU2VhcmNoYWJsZSA9IHNlYXJjaGFibGU7CisgICAgICAgIGlmIChtU2VhcmNoYWJsZSAhPSBudWxsKSB7CisgICAgICAgICAgICB1cGRhdGVTZWFyY2hBdXRvQ29tcGxldGUoKTsKKyAgICAgICAgfQorICAgICAgICB1cGRhdGVWaWV3c1Zpc2liaWxpdHkobUljb25pZmllZEJ5RGVmYXVsdCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyBhIGxpc3RlbmVyIGZvciB1c2VyIGFjdGlvbnMgd2l0aGluIHRoZSBTZWFyY2hWaWV3LgorICAgICAqCisgICAgICogQHBhcmFtIGxpc3RlbmVyIHRoZSBsaXN0ZW5lciBvYmplY3QgdGhhdCByZWNlaXZlcyBjYWxsYmFja3Mgd2hlbiB0aGUgdXNlciBwZXJmb3JtcworICAgICAqIGFjdGlvbnMgaW4gdGhlIFNlYXJjaFZpZXcgc3VjaCBhcyBjbGlja2luZyBvbiBidXR0b25zIG9yIHR5cGluZyBhIHF1ZXJ5LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldE9uUXVlcnlDaGFuZ2VMaXN0ZW5lcihPblF1ZXJ5Q2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpIHsKKyAgICAgICAgbU9uUXVlcnlDaGFuZ2VMaXN0ZW5lciA9IGxpc3RlbmVyOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgYSBsaXN0ZW5lciB0byBpbmZvcm0gd2hlbiB0aGUgdXNlciBjbG9zZXMgdGhlIFNlYXJjaFZpZXcuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbGlzdGVuZXIgdGhlIGxpc3RlbmVyIHRvIGNhbGwgd2hlbiB0aGUgdXNlciBjbG9zZXMgdGhlIFNlYXJjaFZpZXcuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0T25DbG9zZUxpc3RlbmVyKE9uQ2xvc2VMaXN0ZW5lciBsaXN0ZW5lcikgeworICAgICAgICBtT25DbG9zZUxpc3RlbmVyID0gbGlzdGVuZXI7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyBhIHF1ZXJ5IHN0cmluZyBpbiB0aGUgdGV4dCBmaWVsZCBhbmQgb3B0aW9uYWxseSBzdWJtaXRzIHRoZSBxdWVyeSBhcyB3ZWxsLgorICAgICAqCisgICAgICogQHBhcmFtIHF1ZXJ5IHRoZSBxdWVyeSBzdHJpbmcuIFRoaXMgcmVwbGFjZXMgYW55IHF1ZXJ5IHRleHQgYWxyZWFkeSBwcmVzZW50IGluIHRoZQorICAgICAqIHRleHQgZmllbGQuCisgICAgICogQHBhcmFtIHN1Ym1pdCB3aGV0aGVyIHRvIHN1Ym1pdCB0aGUgcXVlcnkgcmlnaHQgbm93IG9yIG9ubHkgdXBkYXRlIHRoZSBjb250ZW50cyBvZgorICAgICAqIHRleHQgZmllbGQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UXVlcnkoQ2hhclNlcXVlbmNlIHF1ZXJ5LCBib29sZWFuIHN1Ym1pdCkgeworICAgICAgICBtUXVlcnlUZXh0Vmlldy5zZXRUZXh0KHF1ZXJ5KTsKKyAgICAgICAgLy8gSWYgdGhlIHF1ZXJ5IGlzIG5vdCBlbXB0eSBhbmQgc3VibWl0IGlzIHJlcXVlc3RlZCwgc3VibWl0IHRoZSBxdWVyeQorICAgICAgICBpZiAoc3VibWl0ICYmICFUZXh0VXRpbHMuaXNFbXB0eShxdWVyeSkpIHsKKyAgICAgICAgICAgIG9uU3VibWl0UXVlcnkoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIGhpbnQgdGV4dCB0byBkaXNwbGF5IGluIHRoZSBxdWVyeSB0ZXh0IGZpZWxkLiBUaGlzIG92ZXJyaWRlcyBhbnkgaGludCBzcGVjaWZpZWQKKyAgICAgKiBpbiB0aGUgU2VhcmNoYWJsZUluZm8uCisgICAgICoKKyAgICAgKiBAcGFyYW0gaGludCB0aGUgaGludCB0ZXh0IHRvIGRpc3BsYXkKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRRdWVyeUhpbnQoQ2hhclNlcXVlbmNlIGhpbnQpIHsKKyAgICAgICAgbVF1ZXJ5SGludCA9IGhpbnQ7CisgICAgICAgIHVwZGF0ZVF1ZXJ5SGludCgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIGRlZmF1bHQgb3IgcmVzdGluZyBzdGF0ZSBvZiB0aGUgc2VhcmNoIGZpZWxkLiBJZiB0cnVlLCBhIHNpbmdsZSBzZWFyY2ggaWNvbiBpcworICAgICAqIHNob3duIGJ5IGRlZmF1bHQgYW5kIGV4cGFuZHMgdG8gc2hvdyB0aGUgdGV4dCBmaWVsZCBhbmQgb3RoZXIgYnV0dG9ucyB3aGVuIHByZXNzZWQuIEFsc28sCisgICAgICogaWYgdGhlIGRlZmF1bHQgc3RhdGUgaXMgaWNvbmlmaWVkLCB0aGVuIGl0IGNvbGxhcHNlcyB0byB0aGF0IHN0YXRlIHdoZW4gdGhlIGNsb3NlIGJ1dHRvbgorICAgICAqIGlzIHByZXNzZWQuIENoYW5nZXMgdG8gdGhpcyBwcm9wZXJ0eSB3aWxsIHRha2UgZWZmZWN0IGltbWVkaWF0ZWx5LgorICAgICAqCisgICAgICogPHA+VGhlIGRlZmF1bHQgdmFsdWUgaXMgZmFsc2UuPC9wPgorICAgICAqCisgICAgICogQHBhcmFtIGljb25pZmllZCB3aGV0aGVyIHRoZSBzZWFyY2ggZmllbGQgc2hvdWxkIGJlIGljb25pZmllZCBieSBkZWZhdWx0CisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0SWNvbmlmaWVkQnlEZWZhdWx0KGJvb2xlYW4gaWNvbmlmaWVkKSB7CisgICAgICAgIG1JY29uaWZpZWRCeURlZmF1bHQgPSBpY29uaWZpZWQ7CisgICAgICAgIHVwZGF0ZVZpZXdzVmlzaWJpbGl0eShpY29uaWZpZWQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIGRlZmF1bHQgaWNvbmlmaWVkIHN0YXRlIG9mIHRoZSBzZWFyY2ggZmllbGQuCisgICAgICogQHJldHVybgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzSWNvbmZpZWRCeURlZmF1bHQoKSB7CisgICAgICAgIHJldHVybiBtSWNvbmlmaWVkQnlEZWZhdWx0OworICAgIH0KKworICAgIC8qKgorICAgICAqIEljb25pZmllcyBvciBleHBhbmRzIHRoZSBTZWFyY2hWaWV3LiBBbnkgcXVlcnkgdGV4dCBpcyBjbGVhcmVkIHdoZW4gaWNvbmlmaWVkLiBUaGlzIGlzCisgICAgICogYSB0ZW1wb3Jhcnkgc3RhdGUgYW5kIGRvZXMgbm90IG92ZXJyaWRlIHRoZSBkZWZhdWx0IGljb25pZmllZCBzdGF0ZSBzZXQgYnkKKyAgICAgKiB7QGxpbmsgI3NldEljb25pZmllZEJ5RGVmYXVsdChib29sZWFuKX0uIElmIHRoZSBkZWZhdWx0IHN0YXRlIGlzIGljb25pZmllZCwgdGhlbgorICAgICAqIGEgZmFsc2UgaGVyZSB3aWxsIG9ubHkgYmUgdmFsaWQgdW50aWwgdGhlIHVzZXIgY2xvc2VzIHRoZSBmaWVsZC4gQW5kIGlmIHRoZSBkZWZhdWx0CisgICAgICogc3RhdGUgaXMgZXhwYW5kZWQsIHRoZW4gYSB0cnVlIGhlcmUgd2lsbCBvbmx5IGNsZWFyIHRoZSB0ZXh0IGZpZWxkIGFuZCBub3QgY2xvc2UgaXQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gaWNvbmlmeSBhIHRydWUgdmFsdWUgd2lsbCBjb2xsYXBzZSB0aGUgU2VhcmNoVmlldyB0byBhbiBpY29uLCB3aGlsZSBhIGZhbHNlIHdpbGwKKyAgICAgKiBleHBhbmQgaXQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0SWNvbmlmaWVkKGJvb2xlYW4gaWNvbmlmeSkgeworICAgICAgICBpZiAoaWNvbmlmeSkgeworICAgICAgICAgICAgb25DbG9zZUNsaWNrZWQoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG9uU2VhcmNoQ2xpY2tlZCgpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgY3VycmVudCBpY29uaWZpZWQgc3RhdGUgb2YgdGhlIFNlYXJjaFZpZXcuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIFNlYXJjaFZpZXcgaXMgY3VycmVudGx5IGljb25pZmllZCwgZmFsc2UgaWYgdGhlIHNlYXJjaCBmaWVsZCBpcworICAgICAqIGZ1bGx5IHZpc2libGUuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNJY29uaWZpZWQoKSB7CisgICAgICAgIHJldHVybiBtSWNvbmlmaWVkOworICAgIH0KKworICAgIC8qKgorICAgICAqIEVuYWJsZXMgc2hvd2luZyBhIHN1Ym1pdCBidXR0b24gd2hlbiB0aGUgcXVlcnkgaXMgbm9uLWVtcHR5LiBJbiBjYXNlcyB3aGVyZSB0aGUgU2VhcmNoVmlldworICAgICAqIGlzIGJlaW5nIHVzZWQgdG8gZmlsdGVyIHRoZSBjb250ZW50cyBvZiB0aGUgY3VycmVudCBhY3Rpdml0eSBhbmQgZG9lc24ndCBsYXVuY2ggYSBzZXBhcmF0ZQorICAgICAqIHJlc3VsdHMgYWN0aXZpdHksIHRoZW4gdGhlIHN1Ym1pdCBidXR0b24gc2hvdWxkIGJlIGRpc2FibGVkLgorICAgICAqCisgICAgICogQHBhcmFtIGVuYWJsZWQgdHJ1ZSB0byBzaG93IGEgc3VibWl0IGJ1dHRvbiBmb3Igc3VibWl0dGluZyBxdWVyaWVzLCBmYWxzZSBpZiBhIHN1Ym1pdAorICAgICAqIGJ1dHRvbiBpcyBub3QgcmVxdWlyZWQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0U3VibWl0QnV0dG9uRW5hYmxlZChib29sZWFuIGVuYWJsZWQpIHsKKyAgICAgICAgbVN1Ym1pdEJ1dHRvbi5zZXRWaXNpYmlsaXR5KGVuYWJsZWQgPyBWSVNJQkxFIDogR09ORSk7CisgICAgICAgIG1TdWJtaXRCdXR0b25FbmFibGVkID0gZW5hYmxlZDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHN1Ym1pdCBidXR0b24gaXMgZW5hYmxlZCB3aGVuIG5lY2Vzc2FyeSBvciBuZXZlciBkaXNwbGF5ZWQuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHN1Ym1pdCBidXR0b24gaXMgZW5hYmxlZCBhdXRvbWF0aWNhbGx5IHdoZW4gbmVjZXNzYXJ5CisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNTdWJtaXRCdXR0b25FbmFibGVkKCkgeworICAgICAgICByZXR1cm4gbVN1Ym1pdEJ1dHRvbkVuYWJsZWQ7CisgICAgfQorCisgICAgcHVibGljIGludGVyZmFjZSBGaWx0ZXJhYmxlTGlzdEFkYXB0ZXIgZXh0ZW5kcyBMaXN0QWRhcHRlciwgRmlsdGVyYWJsZSB7CisgICAgfQorCisgICAgLyoqCisgICAgICogWW91IGNhbiBzZXQgYSBjdXN0b20gYWRhcHRlciBpZiB5b3Ugd2lzaC4gT3RoZXJ3aXNlIHRoZSBkZWZhdWx0IGFkYXB0ZXIgaXMgdXNlZCB0bworICAgICAqIGRpc3BsYXkgdGhlIHN1Z2dlc3Rpb25zIGZyb20gdGhlIHN1Z2dlc3Rpb25zIHByb3ZpZGVyIGFzc29jaWF0ZWQgd2l0aCB0aGUgU2VhcmNoYWJsZUluZm8uCisgICAgICoKKyAgICAgKiBAc2VlICNzZXRTZWFyY2hhYmxlSW5mbyhTZWFyY2hhYmxlSW5mbykKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRTdWdnZXN0aW9uc0FkYXB0ZXIoQ3Vyc29yQWRhcHRlciBhZGFwdGVyKSB7CisgICAgICAgIG1TdWdnZXN0aW9uc0FkYXB0ZXIgPSBhZGFwdGVyOworCisgICAgICAgIG1RdWVyeVRleHRWaWV3LnNldEFkYXB0ZXIobVN1Z2dlc3Rpb25zQWRhcHRlcik7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgYWRhcHRlciB1c2VkIGZvciBzdWdnZXN0aW9ucywgaWYgYW55LgorICAgICAqIEByZXR1cm4gdGhlIHN1Z2dlc3Rpb25zIGFkYXB0ZXIKKyAgICAgKi8KKyAgICBwdWJsaWMgQ3Vyc29yQWRhcHRlciBnZXRTdWdnZXN0aW9uc0FkYXB0ZXIoKSB7CisgICAgICAgIHJldHVybiBtU3VnZ2VzdGlvbnNBZGFwdGVyOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCB1cGRhdGVWaWV3c1Zpc2liaWxpdHkoZmluYWwgYm9vbGVhbiBjb2xsYXBzZWQpIHsKKyAgICAgICAgbUljb25pZmllZCA9IGNvbGxhcHNlZDsKKyAgICAgICAgLy8gVmlzaWJpbGl0eSBvZiB2aWV3cyB0aGF0IGFyZSB2aXNpYmxlIHdoZW4gY29sbGFwc2VkCisgICAgICAgIGZpbmFsIGludCB2aXNDb2xsYXBzZWQgPSBjb2xsYXBzZWQgPyBWSVNJQkxFIDogR09ORTsKKyAgICAgICAgLy8gVmlzaWJpbGl0eSBvZiB2aWV3cyB0aGF0IGFyZSB2aXNpYmxlIHdoZW4gZXhwYW5kZWQKKyAgICAgICAgZmluYWwgaW50IHZpc0V4cGFuZGVkID0gY29sbGFwc2VkID8gR09ORSA6IFZJU0lCTEU7CisKKyAgICAgICAgbVNlYXJjaEJ1dHRvbi5zZXRWaXNpYmlsaXR5KHZpc0NvbGxhcHNlZCk7CisgICAgICAgIG1TdWJtaXRCdXR0b24uc2V0VmlzaWJpbGl0eShtU3VibWl0QnV0dG9uRW5hYmxlZCA/IHZpc0V4cGFuZGVkIDogR09ORSk7CisgICAgICAgIG1TZWFyY2hFZGl0RnJhbWUuc2V0VmlzaWJpbGl0eSh2aXNFeHBhbmRlZCk7CisKKyAgICAgICAgc2V0SW1lVmlzaWJpbGl0eSghY29sbGFwc2VkKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgc2V0SW1lVmlzaWJpbGl0eShib29sZWFuIHZpc2libGUpIHsKKyAgICAgICAgLy8gV2UgbWFkZSBzdXJlIHRoZSBJTUUgd2FzIGRpc3BsYXllZCwgc28gYWxzbyBtYWtlIHN1cmUgaXQgaXMgY2xvc2VkCisgICAgICAgIC8vIHdoZW4gd2UgZ28gYXdheS4KKyAgICAgICAgSW5wdXRNZXRob2RNYW5hZ2VyIGltbSA9IChJbnB1dE1ldGhvZE1hbmFnZXIpCisgICAgICAgICAgICAgICAgZ2V0Q29udGV4dCgpLmdldFN5c3RlbVNlcnZpY2UoQ29udGV4dC5JTlBVVF9NRVRIT0RfU0VSVklDRSk7CisgICAgICAgIGlmIChpbW0gIT0gbnVsbCkgeworICAgICAgICAgICAgaWYgKHZpc2libGUpIHsKKyAgICAgICAgICAgICAgICBpbW0uc2hvd1NvZnRJbnB1dFVuY2hlY2tlZCgwLCBudWxsKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaW1tLmhpZGVTb2Z0SW5wdXRGcm9tV2luZG93KGdldFdpbmRvd1Rva2VuKCksIDApOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBmaW5hbCBPbkNsaWNrTGlzdGVuZXIgbU9uQ2xpY2tMaXN0ZW5lciA9IG5ldyBPbkNsaWNrTGlzdGVuZXIoKSB7CisKKyAgICAgICAgcHVibGljIHZvaWQgb25DbGljayhWaWV3IHYpIHsKKyAgICAgICAgICAgIGlmICh2ID09IG1TZWFyY2hCdXR0b24pIHsKKyAgICAgICAgICAgICAgICBvblNlYXJjaENsaWNrZWQoKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAodiA9PSBtQ2xvc2VCdXR0b24pIHsKKyAgICAgICAgICAgICAgICBvbkNsb3NlQ2xpY2tlZCgpOworICAgICAgICAgICAgfSBlbHNlIGlmICh2ID09IG1TdWJtaXRCdXR0b24pIHsKKyAgICAgICAgICAgICAgICBvblN1Ym1pdFF1ZXJ5KCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9OworCisgICAgLyoqCisgICAgICogSGFuZGxlcyB0aGUga2V5IGRvd24gZXZlbnQgZm9yIGRlYWxpbmcgd2l0aCBhY3Rpb24ga2V5cy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBrZXlDb2RlIFRoaXMgaXMgdGhlIGtleWNvZGUgb2YgdGhlIHR5cGVkIGtleSwgYW5kIGlzIHRoZSBzYW1lIHZhbHVlIGFzCisgICAgICogICAgICAgIGZvdW5kIGluIHRoZSBLZXlFdmVudCBwYXJhbWV0ZXIuCisgICAgICogQHBhcmFtIGV2ZW50IFRoZSBjb21wbGV0ZSBldmVudCByZWNvcmQgZm9yIHRoZSB0eXBlZCBrZXkKKyAgICAgKgorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgZXZlbnQgd2FzIGhhbmRsZWQgaGVyZSwgb3IgZmFsc2UgaWYgbm90LgorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIG9uS2V5RG93bihpbnQga2V5Q29kZSwgS2V5RXZlbnQgZXZlbnQpIHsKKyAgICAgICAgaWYgKG1TZWFyY2hhYmxlID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIGlmIGl0J3MgYW4gYWN0aW9uIHNwZWNpZmllZCBieSB0aGUgc2VhcmNoYWJsZSBhY3Rpdml0eSwgbGF1bmNoIHRoZQorICAgICAgICAvLyBlbnRlcmVkIHF1ZXJ5IHdpdGggdGhlIGFjdGlvbiBrZXkKKyAgICAgICAgU2VhcmNoYWJsZUluZm8uQWN0aW9uS2V5SW5mbyBhY3Rpb25LZXkgPSBtU2VhcmNoYWJsZS5maW5kQWN0aW9uS2V5KGtleUNvZGUpOworICAgICAgICBpZiAoKGFjdGlvbktleSAhPSBudWxsKSAmJiAoYWN0aW9uS2V5LmdldFF1ZXJ5QWN0aW9uTXNnKCkgIT0gbnVsbCkpIHsKKyAgICAgICAgICAgIGxhdW5jaFF1ZXJ5U2VhcmNoKGtleUNvZGUsIGFjdGlvbktleS5nZXRRdWVyeUFjdGlvbk1zZygpLCBtUXVlcnlUZXh0Vmlldy5nZXRUZXh0KCkKKyAgICAgICAgICAgICAgICAgICAgLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gc3VwZXIub25LZXlEb3duKGtleUNvZGUsIGV2ZW50KTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgdXBkYXRlUXVlcnlIaW50KCkgeworICAgICAgICBpZiAobVF1ZXJ5SGludCAhPSBudWxsKSB7CisgICAgICAgICAgICBtUXVlcnlUZXh0Vmlldy5zZXRIaW50KG1RdWVyeUhpbnQpOworICAgICAgICB9IGVsc2UgaWYgKG1TZWFyY2hhYmxlICE9IG51bGwpIHsKKyAgICAgICAgICAgIENoYXJTZXF1ZW5jZSBoaW50ID0gbnVsbDsKKyAgICAgICAgICAgIGludCBoaW50SWQgPSBtU2VhcmNoYWJsZS5nZXRIaW50SWQoKTsKKyAgICAgICAgICAgIGlmIChoaW50SWQgIT0gMCkgeworICAgICAgICAgICAgICAgIGhpbnQgPSBnZXRDb250ZXh0KCkuZ2V0U3RyaW5nKGhpbnRJZCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoaGludCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgbVF1ZXJ5VGV4dFZpZXcuc2V0SGludChoaW50KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFVwZGF0ZXMgdGhlIGF1dG8tY29tcGxldGUgdGV4dCB2aWV3LgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCB1cGRhdGVTZWFyY2hBdXRvQ29tcGxldGUoKSB7CisgICAgICAgIC8vIGNsb3NlIGFueSBleGlzdGluZyBzdWdnZXN0aW9ucyBhZGFwdGVyCisgICAgICAgIC8vY2xvc2VTdWdnZXN0aW9uc0FkYXB0ZXIoKTsKKworICAgICAgICBtUXVlcnlUZXh0Vmlldy5zZXREcm9wRG93bkFuaW1hdGlvblN0eWxlKDApOyAvLyBubyBhbmltYXRpb24KKworICAgICAgICAvLyBhdHRhY2ggdGhlIHN1Z2dlc3Rpb25zIGFkYXB0ZXIsIGlmIHN1Z2dlc3Rpb25zIGFyZSBhdmFpbGFibGUKKyAgICAgICAgLy8gVGhlIGV4aXN0ZW5jZSBvZiBhIHN1Z2dlc3Rpb25zIGF1dGhvcml0eSBpcyB0aGUgcHJveHkgZm9yICJzdWdnZXN0aW9ucyBhdmFpbGFibGUgaGVyZSIKKyAgICAgICAgaWYgKG1TZWFyY2hhYmxlLmdldFN1Z2dlc3RBdXRob3JpdHkoKSAhPSBudWxsKSB7CisgICAgICAgICAgICBtU3VnZ2VzdGlvbnNBZGFwdGVyID0gbmV3IFN1Z2dlc3Rpb25zQWRhcHRlcihnZXRDb250ZXh0KCksCisgICAgICAgICAgICAgICAgICAgIHRoaXMsIG1TZWFyY2hhYmxlLCBtT3V0c2lkZURyYXdhYmxlc0NhY2hlKTsKKyAgICAgICAgICAgIG1RdWVyeVRleHRWaWV3LnNldEFkYXB0ZXIobVN1Z2dlc3Rpb25zQWRhcHRlcik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIGZpbmFsIE9uRWRpdG9yQWN0aW9uTGlzdGVuZXIgbU9uRWRpdG9yQWN0aW9uTGlzdGVuZXIgPSBuZXcgT25FZGl0b3JBY3Rpb25MaXN0ZW5lcigpIHsKKworICAgICAgICAvKioKKyAgICAgICAgICogQ2FsbGVkIHdoZW4gdGhlIGlucHV0IG1ldGhvZCBkZWZhdWx0IGFjdGlvbiBrZXkgaXMgcHJlc3NlZC4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBib29sZWFuIG9uRWRpdG9yQWN0aW9uKFRleHRWaWV3IHYsIGludCBhY3Rpb25JZCwgS2V5RXZlbnQgZXZlbnQpIHsKKyAgICAgICAgICAgIG9uU3VibWl0UXVlcnkoKTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgfTsKKworICAgIHByaXZhdGUgdm9pZCBvblRleHRDaGFuZ2VkKENoYXJTZXF1ZW5jZSBuZXdUZXh0KSB7CisgICAgICAgIENoYXJTZXF1ZW5jZSB0ZXh0ID0gbVF1ZXJ5VGV4dFZpZXcuZ2V0VGV4dCgpOworICAgICAgICBib29sZWFuIGhhc1RleHQgPSAhVGV4dFV0aWxzLmlzRW1wdHkodGV4dCk7CisgICAgICAgIGlmIChpc1N1Ym1pdEJ1dHRvbkVuYWJsZWQoKSkgeworICAgICAgICAgICAgbVN1Ym1pdEJ1dHRvbi5zZXRWaXNpYmlsaXR5KGhhc1RleHQgPyBWSVNJQkxFIDogR09ORSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1PblF1ZXJ5Q2hhbmdlTGlzdGVuZXIgIT0gbnVsbCkKKyAgICAgICAgICAgIG1PblF1ZXJ5Q2hhbmdlTGlzdGVuZXIub25RdWVyeVRleHRDaGFuZ2VkKG5ld1RleHQudG9TdHJpbmcoKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIG9uU3VibWl0UXVlcnkoKSB7CisgICAgICAgIENoYXJTZXF1ZW5jZSBxdWVyeSA9IG1RdWVyeVRleHRWaWV3LmdldFRleHQoKTsKKyAgICAgICAgaWYgKCFUZXh0VXRpbHMuaXNFbXB0eShxdWVyeSkpIHsKKyAgICAgICAgICAgIGlmIChtT25RdWVyeUNoYW5nZUxpc3RlbmVyID09IG51bGwKKyAgICAgICAgICAgICAgICAgICAgfHwgIW1PblF1ZXJ5Q2hhbmdlTGlzdGVuZXIub25TdWJtaXRRdWVyeShxdWVyeS50b1N0cmluZygpKSkgeworICAgICAgICAgICAgICAgIGlmIChtU2VhcmNoYWJsZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGxhdW5jaFF1ZXJ5U2VhcmNoKEtleUV2ZW50LktFWUNPREVfVU5LTk9XTiwgbnVsbCwgcXVlcnkudG9TdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIG9uQ2xvc2VDbGlja2VkKCkgeworICAgICAgICBpZiAobU9uQ2xvc2VMaXN0ZW5lciA9PSBudWxsIHx8ICFtT25DbG9zZUxpc3RlbmVyLm9uQ2xvc2UoKSkgeworICAgICAgICAgICAgbVF1ZXJ5VGV4dFZpZXcuc2V0VGV4dCgiIik7CisgICAgICAgICAgICB1cGRhdGVWaWV3c1Zpc2liaWxpdHkobUljb25pZmllZEJ5RGVmYXVsdCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgb25TZWFyY2hDbGlja2VkKCkgeworICAgICAgICBtUXVlcnlUZXh0Vmlldy5yZXF1ZXN0Rm9jdXMoKTsKKyAgICAgICAgdXBkYXRlVmlld3NWaXNpYmlsaXR5KGZhbHNlKTsKKyAgICB9CisKKyAgICBwcml2YXRlIGZpbmFsIE9uSXRlbUNsaWNrTGlzdGVuZXIgbU9uSXRlbUNsaWNrTGlzdGVuZXIgPSBuZXcgT25JdGVtQ2xpY2tMaXN0ZW5lcigpIHsKKworICAgICAgICAvKioKKyAgICAgICAgICogSW1wbGVtZW50cyBPbkl0ZW1DbGlja0xpc3RlbmVyCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgdm9pZCBvbkl0ZW1DbGljayhBZGFwdGVyVmlldzw/PiBwYXJlbnQsIFZpZXcgdmlldywgaW50IHBvc2l0aW9uLCBsb25nIGlkKSB7CisgICAgICAgICAgICBpZiAoREJHKQorICAgICAgICAgICAgICAgIExvZy5kKExPR19UQUcsICJvbkl0ZW1DbGljaygpIHBvc2l0aW9uICIgKyBwb3NpdGlvbik7CisgICAgICAgICAgICBsYXVuY2hTdWdnZXN0aW9uKHBvc2l0aW9uLCBLZXlFdmVudC5LRVlDT0RFX1VOS05PV04sIG51bGwpOworICAgICAgICB9CisgICAgfTsKKworICAgIHByaXZhdGUgZmluYWwgT25JdGVtU2VsZWN0ZWRMaXN0ZW5lciBtT25JdGVtU2VsZWN0ZWRMaXN0ZW5lciA9IG5ldyBPbkl0ZW1TZWxlY3RlZExpc3RlbmVyKCkgeworCisgICAgICAgIC8qKgorICAgICAgICAgKiBJbXBsZW1lbnRzIE9uSXRlbVNlbGVjdGVkTGlzdGVuZXIKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2b2lkIG9uSXRlbVNlbGVjdGVkKEFkYXB0ZXJWaWV3PD8+IHBhcmVudCwgVmlldyB2aWV3LCBpbnQgcG9zaXRpb24sIGxvbmcgaWQpIHsKKyAgICAgICAgICAgIGlmIChEQkcpCisgICAgICAgICAgICAgICAgTG9nLmQoTE9HX1RBRywgIm9uSXRlbVNlbGVjdGVkKCkgcG9zaXRpb24gIiArIHBvc2l0aW9uKTsKKyAgICAgICAgICAgIC8vIEEgc3VnZ2VzdGlvbiBoYXMgYmVlbiBzZWxlY3RlZCwgcmV3cml0ZSB0aGUgcXVlcnkgaWYgcG9zc2libGUsCisgICAgICAgICAgICAvLyBvdGhlcndpc2UgdGhlIHJlc3RvcmUgdGhlIG9yaWdpbmFsIHF1ZXJ5LgorICAgICAgICAgICAgcmV3cml0ZVF1ZXJ5RnJvbVN1Z2dlc3Rpb24ocG9zaXRpb24pOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEltcGxlbWVudHMgT25JdGVtU2VsZWN0ZWRMaXN0ZW5lcgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgb25Ob3RoaW5nU2VsZWN0ZWQoQWRhcHRlclZpZXc8Pz4gcGFyZW50KSB7CisgICAgICAgICAgICBpZiAoREJHKQorICAgICAgICAgICAgICAgIExvZy5kKExPR19UQUcsICJvbk5vdGhpbmdTZWxlY3RlZCgpIik7CisgICAgICAgIH0KKyAgICB9OworCisgICAgLyoqCisgICAgICogUXVlcnkgcmV3cml0aW5nLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCByZXdyaXRlUXVlcnlGcm9tU3VnZ2VzdGlvbihpbnQgcG9zaXRpb24pIHsKKyAgICAgICAgQ2hhclNlcXVlbmNlIG9sZFF1ZXJ5ID0gbVF1ZXJ5VGV4dFZpZXcuZ2V0VGV4dCgpOworICAgICAgICBDdXJzb3IgYyA9IG1TdWdnZXN0aW9uc0FkYXB0ZXIuZ2V0Q3Vyc29yKCk7CisgICAgICAgIGlmIChjID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBpZiAoYy5tb3ZlVG9Qb3NpdGlvbihwb3NpdGlvbikpIHsKKyAgICAgICAgICAgIC8vIEdldCB0aGUgbmV3IHF1ZXJ5IGZyb20gdGhlIHN1Z2dlc3Rpb24uCisgICAgICAgICAgICBDaGFyU2VxdWVuY2UgbmV3UXVlcnkgPSBtU3VnZ2VzdGlvbnNBZGFwdGVyLmNvbnZlcnRUb1N0cmluZyhjKTsKKyAgICAgICAgICAgIGlmIChuZXdRdWVyeSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgLy8gVGhlIHN1Z2dlc3Rpb24gcmV3cml0ZXMgdGhlIHF1ZXJ5LgorICAgICAgICAgICAgICAgIC8vIFVwZGF0ZSB0aGUgdGV4dCBmaWVsZCwgd2l0aG91dCBnZXR0aW5nIG5ldyBzdWdnZXN0aW9ucy4KKyAgICAgICAgICAgICAgICBzZXRRdWVyeShuZXdRdWVyeSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8vIFRoZSBzdWdnZXN0aW9uIGRvZXMgbm90IHJld3JpdGUgdGhlIHF1ZXJ5LCByZXN0b3JlIHRoZSB1c2VyJ3MgcXVlcnkuCisgICAgICAgICAgICAgICAgc2V0UXVlcnkob2xkUXVlcnkpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gV2UgZ290IGEgYmFkIHBvc2l0aW9uLCByZXN0b3JlIHRoZSB1c2VyJ3MgcXVlcnkuCisgICAgICAgICAgICBzZXRRdWVyeShvbGRRdWVyeSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBMYXVuY2hlcyBhbiBpbnRlbnQgYmFzZWQgb24gYSBzdWdnZXN0aW9uLgorICAgICAqCisgICAgICogQHBhcmFtIHBvc2l0aW9uIFRoZSBpbmRleCBvZiB0aGUgc3VnZ2VzdGlvbiB0byBjcmVhdGUgdGhlIGludGVudCBmcm9tLgorICAgICAqIEBwYXJhbSBhY3Rpb25LZXkgVGhlIGtleSBjb2RlIG9mIHRoZSBhY3Rpb24ga2V5IHRoYXQgd2FzIHByZXNzZWQsCisgICAgICogICAgICAgIG9yIHtAbGluayBLZXlFdmVudCNLRVlDT0RFX1VOS05PV059IGlmIG5vbmUuCisgICAgICogQHBhcmFtIGFjdGlvbk1zZyBUaGUgbWVzc2FnZSBmb3IgdGhlIGFjdGlvbiBrZXkgdGhhdCB3YXMgcHJlc3NlZCwKKyAgICAgKiAgICAgICAgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZS4KKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgYSBzdWNjZXNzZnVsIGxhdW5jaCwgZmFsc2UgaWYgY291bGQgbm90IChlLmcuIGJhZCBwb3NpdGlvbikuCisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIGxhdW5jaFN1Z2dlc3Rpb24oaW50IHBvc2l0aW9uLCBpbnQgYWN0aW9uS2V5LCBTdHJpbmcgYWN0aW9uTXNnKSB7CisgICAgICAgIEN1cnNvciBjID0gbVN1Z2dlc3Rpb25zQWRhcHRlci5nZXRDdXJzb3IoKTsKKyAgICAgICAgaWYgKChjICE9IG51bGwpICYmIGMubW92ZVRvUG9zaXRpb24ocG9zaXRpb24pKSB7CisKKyAgICAgICAgICAgIEludGVudCBpbnRlbnQgPSBjcmVhdGVJbnRlbnRGcm9tU3VnZ2VzdGlvbihjLCBhY3Rpb25LZXksIGFjdGlvbk1zZyk7CisKKyAgICAgICAgICAgIC8vIGxhdW5jaCB0aGUgaW50ZW50CisgICAgICAgICAgICBsYXVuY2hJbnRlbnQoaW50ZW50KTsKKworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8qKgorICAgICAqIExhdW5jaGVzIGFuIGludGVudCwgaW5jbHVkaW5nIGFueSBzcGVjaWFsIGludGVudCBoYW5kbGluZy4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgbGF1bmNoSW50ZW50KEludGVudCBpbnRlbnQpIHsKKyAgICAgICAgaWYgKGludGVudCA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIElmIHRoZSBpbnRlbnQgd2FzIGNyZWF0ZWQgZnJvbSBhIHN1Z2dlc3Rpb24sIGl0IHdpbGwgYWx3YXlzIGhhdmUgYW4gZXhwbGljaXQKKyAgICAgICAgICAgIC8vIGNvbXBvbmVudCBoZXJlLgorICAgICAgICAgICAgZ2V0Q29udGV4dCgpLnN0YXJ0QWN0aXZpdHkoaW50ZW50KTsKKyAgICAgICAgfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgTG9nLmUoTE9HX1RBRywgIkZhaWxlZCBsYXVuY2ggYWN0aXZpdHk6ICIgKyBpbnRlbnQsIGV4KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIHRleHQgaW4gdGhlIHF1ZXJ5IGJveCwgd2l0aG91dCB1cGRhdGluZyB0aGUgc3VnZ2VzdGlvbnMuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIHNldFF1ZXJ5KENoYXJTZXF1ZW5jZSBxdWVyeSkgeworICAgICAgICBtUXVlcnlUZXh0Vmlldy5zZXRUZXh0KHF1ZXJ5LCBmYWxzZSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGxhdW5jaFF1ZXJ5U2VhcmNoKGludCBhY3Rpb25LZXksIFN0cmluZyBhY3Rpb25Nc2csIFN0cmluZyBxdWVyeSkgeworICAgICAgICBTdHJpbmcgYWN0aW9uID0gSW50ZW50LkFDVElPTl9TRUFSQ0g7CisgICAgICAgIEludGVudCBpbnRlbnQgPSBjcmVhdGVJbnRlbnQoYWN0aW9uLCBudWxsLCBudWxsLCBxdWVyeSwgbnVsbCwgYWN0aW9uS2V5LCBhY3Rpb25Nc2cpOworICAgICAgICBnZXRDb250ZXh0KCkuc3RhcnRBY3Rpdml0eShpbnRlbnQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdHMgYW4gaW50ZW50IGZyb20gdGhlIGdpdmVuIGluZm9ybWF0aW9uIGFuZCB0aGUgc2VhcmNoIGRpYWxvZyBzdGF0ZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBhY3Rpb24gSW50ZW50IGFjdGlvbi4KKyAgICAgKiBAcGFyYW0gZGF0YSBJbnRlbnQgZGF0YSwgb3IgPGNvZGU+bnVsbDwvY29kZT4uCisgICAgICogQHBhcmFtIGV4dHJhRGF0YSBEYXRhIGZvciB7QGxpbmsgU2VhcmNoTWFuYWdlciNFWFRSQV9EQVRBX0tFWX0gb3IgPGNvZGU+bnVsbDwvY29kZT4uCisgICAgICogQHBhcmFtIHF1ZXJ5IEludGVudCBxdWVyeSwgb3IgPGNvZGU+bnVsbDwvY29kZT4uCisgICAgICogQHBhcmFtIGNvbXBvbmVudE5hbWUgRGF0YSBmb3Ige0BsaW5rIFNlYXJjaE1hbmFnZXIjQ09NUE9ORU5UX05BTUVfS0VZfSBvciA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgKiBAcGFyYW0gYWN0aW9uS2V5IFRoZSBrZXkgY29kZSBvZiB0aGUgYWN0aW9uIGtleSB0aGF0IHdhcyBwcmVzc2VkLAorICAgICAqICAgICAgICBvciB7QGxpbmsgS2V5RXZlbnQjS0VZQ09ERV9VTktOT1dOfSBpZiBub25lLgorICAgICAqIEBwYXJhbSBhY3Rpb25Nc2cgVGhlIG1lc3NhZ2UgZm9yIHRoZSBhY3Rpb24ga2V5IHRoYXQgd2FzIHByZXNzZWQsCisgICAgICogICAgICAgIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUuCisgICAgICogQHBhcmFtIG1vZGUgVGhlIHNlYXJjaCBtb2RlLCBvbmUgb2YgdGhlIGFjY2VwdGFibGUgdmFsdWVzIGZvcgorICAgICAqICAgICAgICAgICAgIHtAbGluayBTZWFyY2hNYW5hZ2VyI1NFQVJDSF9NT0RFfSwgb3Ige0Bjb2RlIG51bGx9LgorICAgICAqIEByZXR1cm4gVGhlIGludGVudC4KKyAgICAgKi8KKyAgICBwcml2YXRlIEludGVudCBjcmVhdGVJbnRlbnQoU3RyaW5nIGFjdGlvbiwgVXJpIGRhdGEsIFN0cmluZyBleHRyYURhdGEsIFN0cmluZyBxdWVyeSwKKyAgICAgICAgICAgIFN0cmluZyBjb21wb25lbnROYW1lLCBpbnQgYWN0aW9uS2V5LCBTdHJpbmcgYWN0aW9uTXNnKSB7CisgICAgICAgIC8vIE5vdyBidWlsZCB0aGUgSW50ZW50CisgICAgICAgIEludGVudCBpbnRlbnQgPSBuZXcgSW50ZW50KGFjdGlvbik7CisgICAgICAgIGludGVudC5hZGRGbGFncyhJbnRlbnQuRkxBR19BQ1RJVklUWV9ORVdfVEFTSyk7CisgICAgICAgIC8vIFdlIG5lZWQgQ0xFQVJfVE9QIHRvIGF2b2lkIHJldXNpbmcgYW4gb2xkIHRhc2sgdGhhdCBoYXMgb3RoZXIgYWN0aXZpdGllcworICAgICAgICAvLyBvbiB0b3Agb2YgdGhlIG9uZSB3ZSB3YW50LiBXZSBkb24ndCB3YW50IHRvIGRvIHRoaXMgaW4gaW4tYXBwIHNlYXJjaCB0aG91Z2gsCisgICAgICAgIC8vIGFzIGl0IGNhbiBiZSBkZXN0cnVjdGl2ZSB0byB0aGUgYWN0aXZpdHkgc3RhY2suCisgICAgICAgIGlmIChkYXRhICE9IG51bGwpIHsKKyAgICAgICAgICAgIGludGVudC5zZXREYXRhKGRhdGEpOworICAgICAgICB9CisgICAgICAgIGludGVudC5wdXRFeHRyYShTZWFyY2hNYW5hZ2VyLlVTRVJfUVVFUlksIHF1ZXJ5KTsKKyAgICAgICAgaWYgKHF1ZXJ5ICE9IG51bGwpIHsKKyAgICAgICAgICAgIGludGVudC5wdXRFeHRyYShTZWFyY2hNYW5hZ2VyLlFVRVJZLCBxdWVyeSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGV4dHJhRGF0YSAhPSBudWxsKSB7CisgICAgICAgICAgICBpbnRlbnQucHV0RXh0cmEoU2VhcmNoTWFuYWdlci5FWFRSQV9EQVRBX0tFWSwgZXh0cmFEYXRhKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoYWN0aW9uS2V5ICE9IEtleUV2ZW50LktFWUNPREVfVU5LTk9XTikgeworICAgICAgICAgICAgaW50ZW50LnB1dEV4dHJhKFNlYXJjaE1hbmFnZXIuQUNUSU9OX0tFWSwgYWN0aW9uS2V5KTsKKyAgICAgICAgICAgIGludGVudC5wdXRFeHRyYShTZWFyY2hNYW5hZ2VyLkFDVElPTl9NU0csIGFjdGlvbk1zZyk7CisgICAgICAgIH0KKyAgICAgICAgaW50ZW50LnNldENvbXBvbmVudChtU2VhcmNoYWJsZS5nZXRTZWFyY2hBY3Rpdml0eSgpKTsKKyAgICAgICAgcmV0dXJuIGludGVudDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXaGVuIGEgcGFydGljdWxhciBzdWdnZXN0aW9uIGhhcyBiZWVuIHNlbGVjdGVkLCBwZXJmb3JtIHRoZSB2YXJpb3VzIGxvb2t1cHMgcmVxdWlyZWQKKyAgICAgKiB0byB1c2UgdGhlIHN1Z2dlc3Rpb24uICBUaGlzIGluY2x1ZGVzIGNoZWNraW5nIHRoZSBjdXJzb3IgZm9yIHN1Z2dlc3Rpb24tc3BlY2lmaWMgZGF0YSwKKyAgICAgKiBhbmQvb3IgZmFsbGluZyBiYWNrIHRvIHRoZSBYTUwgZm9yIGRlZmF1bHRzOyAgSXQgYWxzbyBjcmVhdGVzIFJFU1Qgc3R5bGUgVXJpIGRhdGEgd2hlbgorICAgICAqIHRoZSBzdWdnZXN0aW9uIGluY2x1ZGVzIGEgZGF0YSBpZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjIFRoZSBzdWdnZXN0aW9ucyBjdXJzb3IsIG1vdmVkIHRvIHRoZSByb3cgb2YgdGhlIHVzZXIncyBzZWxlY3Rpb24KKyAgICAgKiBAcGFyYW0gYWN0aW9uS2V5IFRoZSBrZXkgY29kZSBvZiB0aGUgYWN0aW9uIGtleSB0aGF0IHdhcyBwcmVzc2VkLAorICAgICAqICAgICAgICBvciB7QGxpbmsgS2V5RXZlbnQjS0VZQ09ERV9VTktOT1dOfSBpZiBub25lLgorICAgICAqIEBwYXJhbSBhY3Rpb25Nc2cgVGhlIG1lc3NhZ2UgZm9yIHRoZSBhY3Rpb24ga2V5IHRoYXQgd2FzIHByZXNzZWQsCisgICAgICogICAgICAgIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUuCisgICAgICogQHJldHVybiBBbiBpbnRlbnQgZm9yIHRoZSBzdWdnZXN0aW9uIGF0IHRoZSBjdXJzb3IncyBwb3NpdGlvbi4KKyAgICAgKi8KKyAgICBwcml2YXRlIEludGVudCBjcmVhdGVJbnRlbnRGcm9tU3VnZ2VzdGlvbihDdXJzb3IgYywgaW50IGFjdGlvbktleSwgU3RyaW5nIGFjdGlvbk1zZykgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gdXNlIHNwZWNpZmljIGFjdGlvbiBpZiBzdXBwbGllZCwgb3IgZGVmYXVsdCBhY3Rpb24gaWYgc3VwcGxpZWQsIG9yIGZpeGVkIGRlZmF1bHQKKyAgICAgICAgICAgIFN0cmluZyBhY3Rpb24gPSBnZXRDb2x1bW5TdHJpbmcoYywgU2VhcmNoTWFuYWdlci5TVUdHRVNUX0NPTFVNTl9JTlRFTlRfQUNUSU9OKTsKKworICAgICAgICAgICAgLy8gc29tZSBpdGVtcyBhcmUgZGlzcGxheSBvbmx5LCBvciBoYXZlIGVmZmVjdCB2aWEgdGhlIGN1cnNvciByZXNwb25kIGNsaWNrIHJlcG9ydGluZy4KKyAgICAgICAgICAgIGlmIChTZWFyY2hNYW5hZ2VyLklOVEVOVF9BQ1RJT05fTk9ORS5lcXVhbHMoYWN0aW9uKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoYWN0aW9uID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBhY3Rpb24gPSBtU2VhcmNoYWJsZS5nZXRTdWdnZXN0SW50ZW50QWN0aW9uKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoYWN0aW9uID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBhY3Rpb24gPSBJbnRlbnQuQUNUSU9OX1NFQVJDSDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gdXNlIHNwZWNpZmljIGRhdGEgaWYgc3VwcGxpZWQsIG9yIGRlZmF1bHQgZGF0YSBpZiBzdXBwbGllZAorICAgICAgICAgICAgU3RyaW5nIGRhdGEgPSBnZXRDb2x1bW5TdHJpbmcoYywgU2VhcmNoTWFuYWdlci5TVUdHRVNUX0NPTFVNTl9JTlRFTlRfREFUQSk7CisgICAgICAgICAgICBpZiAoZGF0YSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgZGF0YSA9IG1TZWFyY2hhYmxlLmdldFN1Z2dlc3RJbnRlbnREYXRhKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyB0aGVuLCBpZiBhbiBJRCB3YXMgcHJvdmlkZWQsIGFwcGVuZCBpdC4KKyAgICAgICAgICAgIGlmIChkYXRhICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBTdHJpbmcgaWQgPSBnZXRDb2x1bW5TdHJpbmcoYywgU2VhcmNoTWFuYWdlci5TVUdHRVNUX0NPTFVNTl9JTlRFTlRfREFUQV9JRCk7CisgICAgICAgICAgICAgICAgaWYgKGlkICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgZGF0YSA9IGRhdGEgKyAiLyIgKyBVcmkuZW5jb2RlKGlkKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBVcmkgZGF0YVVyaSA9IChkYXRhID09IG51bGwpID8gbnVsbCA6IFVyaS5wYXJzZShkYXRhKTsKKworICAgICAgICAgICAgU3RyaW5nIGNvbXBvbmVudE5hbWUgPSBnZXRDb2x1bW5TdHJpbmcoCisgICAgICAgICAgICAgICAgICAgIGMsIFNlYXJjaE1hbmFnZXIuU1VHR0VTVF9DT0xVTU5fSU5URU5UX0NPTVBPTkVOVF9OQU1FKTsKKworICAgICAgICAgICAgU3RyaW5nIHF1ZXJ5ID0gZ2V0Q29sdW1uU3RyaW5nKGMsIFNlYXJjaE1hbmFnZXIuU1VHR0VTVF9DT0xVTU5fUVVFUlkpOworICAgICAgICAgICAgU3RyaW5nIGV4dHJhRGF0YSA9IGdldENvbHVtblN0cmluZyhjLCBTZWFyY2hNYW5hZ2VyLlNVR0dFU1RfQ09MVU1OX0lOVEVOVF9FWFRSQV9EQVRBKTsKKworICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZUludGVudChhY3Rpb24sIGRhdGFVcmksIGV4dHJhRGF0YSwgcXVlcnksIGNvbXBvbmVudE5hbWUsIGFjdGlvbktleSwKKyAgICAgICAgICAgICAgICAgICAgYWN0aW9uTXNnKTsKKyAgICAgICAgfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlICkgeworICAgICAgICAgICAgaW50IHJvd051bTsKKyAgICAgICAgICAgIHRyeSB7ICAgICAgICAgICAgICAgICAgICAgICAvLyBiZSByZWFsbHkgcGFyYW5vaWQgbm93CisgICAgICAgICAgICAgICAgcm93TnVtID0gYy5nZXRQb3NpdGlvbigpOworICAgICAgICAgICAgfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlMiApIHsKKyAgICAgICAgICAgICAgICByb3dOdW0gPSAtMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIExvZy53KExPR19UQUcsICJTZWFyY2ggU3VnZ2VzdGlvbnMgY3Vyc29yIGF0IHJvdyAiICsgcm93TnVtICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIHJldHVybmVkIGV4Y2VwdGlvbiIgKyBlLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDYWxsYmFjayB0byB3YXRjaCB0aGUgdGV4dCBmaWVsZCBmb3IgZW1wdHkvbm9uLWVtcHR5CisgICAgICovCisgICAgcHJpdmF0ZSBUZXh0V2F0Y2hlciBtVGV4dFdhdGNoZXIgPSBuZXcgVGV4dFdhdGNoZXIoKSB7CisKKyAgICAgICAgcHVibGljIHZvaWQgYmVmb3JlVGV4dENoYW5nZWQoQ2hhclNlcXVlbmNlIHMsIGludCBzdGFydCwgaW50IGJlZm9yZSwgaW50IGFmdGVyKSB7IH0KKworICAgICAgICBwdWJsaWMgdm9pZCBvblRleHRDaGFuZ2VkKENoYXJTZXF1ZW5jZSBzLCBpbnQgc3RhcnQsCisgICAgICAgICAgICAgICAgaW50IGJlZm9yZSwgaW50IGFmdGVyKSB7CisgICAgICAgICAgICBTZWFyY2hWaWV3LnRoaXMub25UZXh0Q2hhbmdlZChzKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIGFmdGVyVGV4dENoYW5nZWQoRWRpdGFibGUgcykgeworICAgICAgICB9CisgICAgfTsKK30KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9TaW1wbGVDdXJzb3JBZGFwdGVyLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvU2ltcGxlQ3Vyc29yQWRhcHRlci5qYXZhCmluZGV4IDdkMzQ1OWUuLmQxYzIyNzAgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9TaW1wbGVDdXJzb3JBZGFwdGVyLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L1NpbXBsZUN1cnNvckFkYXB0ZXIuamF2YQpAQCAtNjIsNyArNjIsOCBAQAogICAgIHByaXZhdGUgaW50IG1TdHJpbmdDb252ZXJzaW9uQ29sdW1uID0gLTE7CiAgICAgcHJpdmF0ZSBDdXJzb3JUb1N0cmluZ0NvbnZlcnRlciBtQ3Vyc29yVG9TdHJpbmdDb252ZXJ0ZXI7CiAgICAgcHJpdmF0ZSBWaWV3QmluZGVyIG1WaWV3QmluZGVyOwotICAgIHByaXZhdGUgU3RyaW5nW10gbU9yaWdpbmFsRnJvbTsKKworICAgIFN0cmluZ1tdIG1PcmlnaW5hbEZyb207CiAKICAgICAvKioKICAgICAgKiBDb25zdHJ1Y3Rvci4KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9TcGlubmVyLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvU3Bpbm5lci5qYXZhCmluZGV4IDhkZGIwNmMuLmMwY2JiMTkgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9TcGlubmVyLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L1NwaW5uZXIuamF2YQpAQCAtMjQsNiArMjQsNyBAQAogaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuVHlwZWRBcnJheTsKIGltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLkRhdGFTZXRPYnNlcnZlcjsKIGltcG9ydCBhbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0OworaW1wb3J0IGFuZHJvaWQudmlldy5MYXlvdXRJbmZsYXRlcjsKIGltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKIGltcG9ydCBhbmRyb2lkLnZpZXcuVmlld0dyb3VwOwogCkBAIC00MCwyNyArNDEsMTUxIEBACiAgKi8KIEBXaWRnZXQKIHB1YmxpYyBjbGFzcyBTcGlubmVyIGV4dGVuZHMgQWJzU3Bpbm5lciBpbXBsZW1lbnRzIE9uQ2xpY2tMaXN0ZW5lciB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJTcGlubmVyIjsKICAgICAKLSAgICBwcml2YXRlIENoYXJTZXF1ZW5jZSBtUHJvbXB0OwotICAgIHByaXZhdGUgQWxlcnREaWFsb2cgbVBvcHVwOworICAgIC8qKgorICAgICAqIFVzZSBhIGRpYWxvZyB3aW5kb3cgZm9yIHNlbGVjdGluZyBzcGlubmVyIG9wdGlvbnMuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTU9ERV9ESUFMT0cgPSAwOworICAgIAorICAgIC8qKgorICAgICAqIFVzZSBhIGRyb3Bkb3duIGFuY2hvcmVkIHRvIHRoZSBTcGlubmVyIGZvciBzZWxlY3Rpbmcgc3Bpbm5lciBvcHRpb25zLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1PREVfRFJPUERPV04gPSAxOworICAgIAorICAgIC8qKgorICAgICAqIFVzZSB0aGUgdGhlbWUtc3VwcGxpZWQgdmFsdWUgdG8gc2VsZWN0IHRoZSBkcm9wZG93biBtb2RlLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNT0RFX1RIRU1FID0gLTE7CisgICAgCisgICAgcHJpdmF0ZSBTcGlubmVyUG9wdXAgbVBvcHVwOworICAgIHByaXZhdGUgRHJvcERvd25BZGFwdGVyIG1UZW1wQWRhcHRlcjsKIAorICAgIC8qKgorICAgICAqIENvbnN0cnVjdCBhIG5ldyBzcGlubmVyIHdpdGggdGhlIGdpdmVuIGNvbnRleHQncyB0aGVtZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb250ZXh0IFRoZSBDb250ZXh0IHRoZSB2aWV3IGlzIHJ1bm5pbmcgaW4sIHRocm91Z2ggd2hpY2ggaXQgY2FuCisgICAgICogICAgICAgIGFjY2VzcyB0aGUgY3VycmVudCB0aGVtZSwgcmVzb3VyY2VzLCBldGMuCisgICAgICovCiAgICAgcHVibGljIFNwaW5uZXIoQ29udGV4dCBjb250ZXh0KSB7CiAgICAgICAgIHRoaXMoY29udGV4dCwgbnVsbCk7CiAgICAgfQogCisgICAgLyoqCisgICAgICogQ29uc3RydWN0IGEgbmV3IHNwaW5uZXIgd2l0aCB0aGUgZ2l2ZW4gY29udGV4dCdzIHRoZW1lIGFuZCB0aGUgc3VwcGxpZWQKKyAgICAgKiBtb2RlIG9mIGRpc3BsYXlpbmcgY2hvaWNlcy4gPGNvZGU+bW9kZTwvY29kZT4gbWF5IGJlIG9uZSBvZgorICAgICAqIHtAbGluayAjTU9ERV9ESUFMT0d9IG9yIHtAbGluayAjTU9ERV9EUk9QRE9XTn0uCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29udGV4dCBUaGUgQ29udGV4dCB0aGUgdmlldyBpcyBydW5uaW5nIGluLCB0aHJvdWdoIHdoaWNoIGl0IGNhbgorICAgICAqICAgICAgICBhY2Nlc3MgdGhlIGN1cnJlbnQgdGhlbWUsIHJlc291cmNlcywgZXRjLgorICAgICAqIEBwYXJhbSBtb2RlIENvbnN0YW50IGRlc2NyaWJpbmcgaG93IHRoZSB1c2VyIHdpbGwgc2VsZWN0IGNob2ljZXMgZnJvbSB0aGUgc3Bpbm5lci4KKyAgICAgKiAKKyAgICAgKiBAc2VlICNNT0RFX0RJQUxPRworICAgICAqIEBzZWUgI01PREVfRFJPUERPV04KKyAgICAgKi8KKyAgICBwdWJsaWMgU3Bpbm5lcihDb250ZXh0IGNvbnRleHQsIGludCBtb2RlKSB7CisgICAgICAgIHRoaXMoY29udGV4dCwgbnVsbCwgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5hdHRyLnNwaW5uZXJTdHlsZSwgbW9kZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29uc3RydWN0IGEgbmV3IHNwaW5uZXIgd2l0aCB0aGUgZ2l2ZW4gY29udGV4dCdzIHRoZW1lIGFuZCB0aGUgc3VwcGxpZWQgYXR0cmlidXRlIHNldC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb250ZXh0IFRoZSBDb250ZXh0IHRoZSB2aWV3IGlzIHJ1bm5pbmcgaW4sIHRocm91Z2ggd2hpY2ggaXQgY2FuCisgICAgICogICAgICAgIGFjY2VzcyB0aGUgY3VycmVudCB0aGVtZSwgcmVzb3VyY2VzLCBldGMuCisgICAgICogQHBhcmFtIGF0dHJzIFRoZSBhdHRyaWJ1dGVzIG9mIHRoZSBYTUwgdGFnIHRoYXQgaXMgaW5mbGF0aW5nIHRoZSB2aWV3LgorICAgICAqLwogICAgIHB1YmxpYyBTcGlubmVyKENvbnRleHQgY29udGV4dCwgQXR0cmlidXRlU2V0IGF0dHJzKSB7CiAgICAgICAgIHRoaXMoY29udGV4dCwgYXR0cnMsIGNvbS5hbmRyb2lkLmludGVybmFsLlIuYXR0ci5zcGlubmVyU3R5bGUpOwogICAgIH0KIAorICAgIC8qKgorICAgICAqIENvbnN0cnVjdCBhIG5ldyBzcGlubmVyIHdpdGggdGhlIGdpdmVuIGNvbnRleHQncyB0aGVtZSwgdGhlIHN1cHBsaWVkIGF0dHJpYnV0ZSBzZXQsCisgICAgICogYW5kIGRlZmF1bHQgc3R5bGUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29udGV4dCBUaGUgQ29udGV4dCB0aGUgdmlldyBpcyBydW5uaW5nIGluLCB0aHJvdWdoIHdoaWNoIGl0IGNhbgorICAgICAqICAgICAgICBhY2Nlc3MgdGhlIGN1cnJlbnQgdGhlbWUsIHJlc291cmNlcywgZXRjLgorICAgICAqIEBwYXJhbSBhdHRycyBUaGUgYXR0cmlidXRlcyBvZiB0aGUgWE1MIHRhZyB0aGF0IGlzIGluZmxhdGluZyB0aGUgdmlldy4KKyAgICAgKiBAcGFyYW0gZGVmU3R5bGUgVGhlIGRlZmF1bHQgc3R5bGUgdG8gYXBwbHkgdG8gdGhpcyB2aWV3LiBJZiAwLCBubyBzdHlsZQorICAgICAqICAgICAgICB3aWxsIGJlIGFwcGxpZWQgKGJleW9uZCB3aGF0IGlzIGluY2x1ZGVkIGluIHRoZSB0aGVtZSkuIFRoaXMgbWF5CisgICAgICogICAgICAgIGVpdGhlciBiZSBhbiBhdHRyaWJ1dGUgcmVzb3VyY2UsIHdob3NlIHZhbHVlIHdpbGwgYmUgcmV0cmlldmVkCisgICAgICogICAgICAgIGZyb20gdGhlIGN1cnJlbnQgdGhlbWUsIG9yIGFuIGV4cGxpY2l0IHN0eWxlIHJlc291cmNlLgorICAgICAqLwogICAgIHB1YmxpYyBTcGlubmVyKENvbnRleHQgY29udGV4dCwgQXR0cmlidXRlU2V0IGF0dHJzLCBpbnQgZGVmU3R5bGUpIHsKKyAgICAgICAgdGhpcyhjb250ZXh0LCBhdHRycywgZGVmU3R5bGUsIE1PREVfVEhFTUUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdCBhIG5ldyBzcGlubmVyIHdpdGggdGhlIGdpdmVuIGNvbnRleHQncyB0aGVtZSwgdGhlIHN1cHBsaWVkIGF0dHJpYnV0ZSBzZXQsCisgICAgICogYW5kIGRlZmF1bHQgc3R5bGUuIDxjb2RlPm1vZGU8L2NvZGU+IG1heSBiZSBvbmUgb2Yge0BsaW5rICNNT0RFX0RJQUxPR30gb3IKKyAgICAgKiB7QGxpbmsgI01PREVfRFJPUERPV059IGFuZCBkZXRlcm1pbmVzIGhvdyB0aGUgdXNlciB3aWxsIHNlbGVjdCBjaG9pY2VzIGZyb20gdGhlIHNwaW5uZXIuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29udGV4dCBUaGUgQ29udGV4dCB0aGUgdmlldyBpcyBydW5uaW5nIGluLCB0aHJvdWdoIHdoaWNoIGl0IGNhbgorICAgICAqICAgICAgICBhY2Nlc3MgdGhlIGN1cnJlbnQgdGhlbWUsIHJlc291cmNlcywgZXRjLgorICAgICAqIEBwYXJhbSBhdHRycyBUaGUgYXR0cmlidXRlcyBvZiB0aGUgWE1MIHRhZyB0aGF0IGlzIGluZmxhdGluZyB0aGUgdmlldy4KKyAgICAgKiBAcGFyYW0gZGVmU3R5bGUgVGhlIGRlZmF1bHQgc3R5bGUgdG8gYXBwbHkgdG8gdGhpcyB2aWV3LiBJZiAwLCBubyBzdHlsZQorICAgICAqICAgICAgICB3aWxsIGJlIGFwcGxpZWQgKGJleW9uZCB3aGF0IGlzIGluY2x1ZGVkIGluIHRoZSB0aGVtZSkuIFRoaXMgbWF5CisgICAgICogICAgICAgIGVpdGhlciBiZSBhbiBhdHRyaWJ1dGUgcmVzb3VyY2UsIHdob3NlIHZhbHVlIHdpbGwgYmUgcmV0cmlldmVkCisgICAgICogICAgICAgIGZyb20gdGhlIGN1cnJlbnQgdGhlbWUsIG9yIGFuIGV4cGxpY2l0IHN0eWxlIHJlc291cmNlLgorICAgICAqIEBwYXJhbSBtb2RlIENvbnN0YW50IGRlc2NyaWJpbmcgaG93IHRoZSB1c2VyIHdpbGwgc2VsZWN0IGNob2ljZXMgZnJvbSB0aGUgc3Bpbm5lci4KKyAgICAgKiAKKyAgICAgKiBAc2VlICNNT0RFX0RJQUxPRworICAgICAqIEBzZWUgI01PREVfRFJPUERPV04KKyAgICAgKi8KKyAgICBwdWJsaWMgU3Bpbm5lcihDb250ZXh0IGNvbnRleHQsIEF0dHJpYnV0ZVNldCBhdHRycywgaW50IGRlZlN0eWxlLCBpbnQgbW9kZSkgewogICAgICAgICBzdXBlcihjb250ZXh0LCBhdHRycywgZGVmU3R5bGUpOwogCiAgICAgICAgIFR5cGVkQXJyYXkgYSA9IGNvbnRleHQub2J0YWluU3R5bGVkQXR0cmlidXRlcyhhdHRycywKICAgICAgICAgICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZS5TcGlubmVyLCBkZWZTdHlsZSwgMCk7CisKKyAgICAgICAgaWYgKG1vZGUgPT0gTU9ERV9USEVNRSkgeworICAgICAgICAgICAgbW9kZSA9IGEuZ2V0SW50KGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLlNwaW5uZXJfc3Bpbm5lck1vZGUsIE1PREVfRElBTE9HKTsKKyAgICAgICAgfQogICAgICAgICAKLSAgICAgICAgbVByb21wdCA9IGEuZ2V0U3RyaW5nKGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLlNwaW5uZXJfcHJvbXB0KTsKKyAgICAgICAgc3dpdGNoIChtb2RlKSB7CisgICAgICAgIGNhc2UgTU9ERV9ESUFMT0c6IHsKKyAgICAgICAgICAgIG1Qb3B1cCA9IG5ldyBEaWFsb2dQb3B1cCgpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIE1PREVfRFJPUERPV046IHsKKyAgICAgICAgICAgIGZpbmFsIGludCBoaW50UmVzb3VyY2UgPSBhLmdldFJlc291cmNlSWQoCisgICAgICAgICAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLlNwaW5uZXJfcG9wdXBQcm9tcHRWaWV3LCAwKTsKKworICAgICAgICAgICAgRHJvcGRvd25Qb3B1cCBwb3B1cCA9IG5ldyBEcm9wZG93blBvcHVwKGNvbnRleHQsIGF0dHJzLCBkZWZTdHlsZSwgaGludFJlc291cmNlKTsKKworICAgICAgICAgICAgcG9wdXAuc2V0QmFja2dyb3VuZERyYXdhYmxlKGEuZ2V0RHJhd2FibGUoCisgICAgICAgICAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLlNwaW5uZXJfcG9wdXBCYWNrZ3JvdW5kKSk7CisgICAgICAgICAgICBwb3B1cC5zZXRWZXJ0aWNhbE9mZnNldChhLmdldERpbWVuc2lvblBpeGVsT2Zmc2V0KAorICAgICAgICAgICAgICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZS5TcGlubmVyX2Ryb3BEb3duVmVydGljYWxPZmZzZXQsIDApKTsKKyAgICAgICAgICAgIHBvcHVwLnNldEhvcml6b250YWxPZmZzZXQoYS5nZXREaW1lbnNpb25QaXhlbE9mZnNldCgKKyAgICAgICAgICAgICAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZWFibGUuU3Bpbm5lcl9kcm9wRG93bkhvcml6b250YWxPZmZzZXQsIDApKTsKKworICAgICAgICAgICAgbVBvcHVwID0gcG9wdXA7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIAorICAgICAgICBtUG9wdXAuc2V0UHJvbXB0VGV4dChhLmdldFN0cmluZyhjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZS5TcGlubmVyX3Byb21wdCkpOwogCiAgICAgICAgIGEucmVjeWNsZSgpOworCisgICAgICAgIC8vIEJhc2UgY29uc3RydWN0b3IgY2FuIGNhbGwgc2V0QWRhcHRlciBiZWZvcmUgd2UgaW5pdGlhbGl6ZSBtUG9wdXAuCisgICAgICAgIC8vIEZpbmlzaCBzZXR0aW5nIHRoaW5ncyB1cCBpZiB0aGlzIGhhcHBlbmVkLgorICAgICAgICBpZiAobVRlbXBBZGFwdGVyICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1Qb3B1cC5zZXRBZGFwdGVyKG1UZW1wQWRhcHRlcik7CisgICAgICAgICAgICBtVGVtcEFkYXB0ZXIgPSBudWxsOworICAgICAgICB9CisgICAgfQorICAgIAorICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHNldEFkYXB0ZXIoU3Bpbm5lckFkYXB0ZXIgYWRhcHRlcikgeworICAgICAgICBzdXBlci5zZXRBZGFwdGVyKGFkYXB0ZXIpOworCisgICAgICAgIGlmIChtUG9wdXAgIT0gbnVsbCkgeworICAgICAgICAgICAgbVBvcHVwLnNldEFkYXB0ZXIobmV3IERyb3BEb3duQWRhcHRlcihhZGFwdGVyKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtVGVtcEFkYXB0ZXIgPSBuZXcgRHJvcERvd25BZGFwdGVyKGFkYXB0ZXIpOworICAgICAgICB9CiAgICAgfQogCiAgICAgQE92ZXJyaWRlCkBAIC04Nyw3ICsyMTIsNiBAQAogICAgICAgICAKICAgICAgICAgaWYgKG1Qb3B1cCAhPSBudWxsICYmIG1Qb3B1cC5pc1Nob3dpbmcoKSkgewogICAgICAgICAgICAgbVBvcHVwLmRpc21pc3MoKTsKLSAgICAgICAgICAgIG1Qb3B1cCA9IG51bGw7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTE5Nyw4ICszMjEsNiBAQAogICAgICAgICByZXR1cm4gY2hpbGQ7CiAgICAgfQogCi0KLQogICAgIC8qKgogICAgICAqIEhlbHBlciBmb3IgbWFrZUFuZEFkZFZpZXcgdG8gc2V0IHRoZSBwb3NpdGlvbiBvZiBhIHZpZXcKICAgICAgKiBhbmQgZmlsbCBvdXQgaXRzIGxheW91dCBwYXJhbXRlcnMuCkBAIC0yNDksMTUgKzM3MSwxMCBAQAogICAgICAgICAKICAgICAgICAgaWYgKCFoYW5kbGVkKSB7CiAgICAgICAgICAgICBoYW5kbGVkID0gdHJ1ZTsKLSAgICAgICAgICAgIENvbnRleHQgY29udGV4dCA9IGdldENvbnRleHQoKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgZmluYWwgRHJvcERvd25BZGFwdGVyIGFkYXB0ZXIgPSBuZXcgRHJvcERvd25BZGFwdGVyKGdldEFkYXB0ZXIoKSk7CiAKLSAgICAgICAgICAgIEFsZXJ0RGlhbG9nLkJ1aWxkZXIgYnVpbGRlciA9IG5ldyBBbGVydERpYWxvZy5CdWlsZGVyKGNvbnRleHQpOwotICAgICAgICAgICAgaWYgKG1Qcm9tcHQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGJ1aWxkZXIuc2V0VGl0bGUobVByb21wdCk7CisgICAgICAgICAgICBpZiAoIW1Qb3B1cC5pc1Nob3dpbmcoKSkgeworICAgICAgICAgICAgICAgIG1Qb3B1cC5zaG93KCk7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBtUG9wdXAgPSBidWlsZGVyLnNldFNpbmdsZUNob2ljZUl0ZW1zKGFkYXB0ZXIsIGdldFNlbGVjdGVkSXRlbVBvc2l0aW9uKCksIHRoaXMpLnNob3coKTsKICAgICAgICAgfQogCiAgICAgICAgIHJldHVybiBoYW5kbGVkOwpAQCAtMjY2LDcgKzM4Myw2IEBACiAgICAgcHVibGljIHZvaWQgb25DbGljayhEaWFsb2dJbnRlcmZhY2UgZGlhbG9nLCBpbnQgd2hpY2gpIHsKICAgICAgICAgc2V0U2VsZWN0aW9uKHdoaWNoKTsKICAgICAgICAgZGlhbG9nLmRpc21pc3MoKTsKLSAgICAgICAgbVBvcHVwID0gbnVsbDsKICAgICB9CiAKICAgICAvKioKQEAgLTI3NCw3ICszOTAsNyBAQAogICAgICAqIEBwYXJhbSBwcm9tcHQgdGhlIHByb21wdCB0byBzZXQKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXRQcm9tcHQoQ2hhclNlcXVlbmNlIHByb21wdCkgewotICAgICAgICBtUHJvbXB0ID0gcHJvbXB0OworICAgICAgICBtUG9wdXAuc2V0UHJvbXB0VGV4dChwcm9tcHQpOwogICAgIH0KIAogICAgIC8qKgpAQCAtMjgyLDE0ICszOTgsMTQgQEAKICAgICAgKiBAcGFyYW0gcHJvbXB0SWQgdGhlIHJlc291cmNlIElEIG9mIHRoZSBwcm9tcHQgdG8gZGlzcGxheSB3aGVuIHRoZSBkaWFsb2cgaXMgc2hvd24KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXRQcm9tcHRJZChpbnQgcHJvbXB0SWQpIHsKLSAgICAgICAgbVByb21wdCA9IGdldENvbnRleHQoKS5nZXRUZXh0KHByb21wdElkKTsKKyAgICAgICAgc2V0UHJvbXB0KGdldENvbnRleHQoKS5nZXRUZXh0KHByb21wdElkKSk7CiAgICAgfQogCiAgICAgLyoqCiAgICAgICogQHJldHVybiBUaGUgcHJvbXB0IHRvIGRpc3BsYXkgd2hlbiB0aGUgZGlhbG9nIGlzIHNob3duCiAgICAgICovCiAgICAgcHVibGljIENoYXJTZXF1ZW5jZSBnZXRQcm9tcHQoKSB7Ci0gICAgICAgIHJldHVybiBtUHJvbXB0OworICAgICAgICByZXR1cm4gbVBvcHVwLmdldEhpbnRUZXh0KCk7CiAgICAgfQogICAgIAogICAgIC8qKgpAQCAtMzg3LDQgKzUwMywxMjQgQEAKICAgICAgICAgICAgIHJldHVybiBnZXRDb3VudCgpID09IDA7CiAgICAgICAgIH0KICAgICB9CisgICAgCisgICAgLyoqCisgICAgICogSW1wbGVtZW50cyBzb21lIHNvcnQgb2YgcG9wdXAgc2VsZWN0aW9uIGludGVyZmFjZSBmb3Igc2VsZWN0aW5nIGEgc3Bpbm5lciBvcHRpb24uCisgICAgICogQWxsb3dzIGZvciBkaWZmZXJlbnQgc3Bpbm5lciBtb2Rlcy4KKyAgICAgKi8KKyAgICBwcml2YXRlIGludGVyZmFjZSBTcGlubmVyUG9wdXAgeworICAgICAgICBwdWJsaWMgdm9pZCBzZXRBZGFwdGVyKExpc3RBZGFwdGVyIGFkYXB0ZXIpOworICAgICAgICAKKyAgICAgICAgLyoqCisgICAgICAgICAqIFNob3cgdGhlIHBvcHVwCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgdm9pZCBzaG93KCk7CisgICAgICAgIAorICAgICAgICAvKioKKyAgICAgICAgICogRGlzbWlzcyB0aGUgcG9wdXAKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2b2lkIGRpc21pc3MoKTsKKyAgICAgICAgCisgICAgICAgIC8qKgorICAgICAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHBvcHVwIGlzIHNob3dpbmcsIGZhbHNlIG90aGVyd2lzZS4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBib29sZWFuIGlzU2hvd2luZygpOworICAgICAgICAKKyAgICAgICAgLyoqCisgICAgICAgICAqIFNldCBoaW50IHRleHQgdG8gYmUgZGlzcGxheWVkIHRvIHRoZSB1c2VyLiBUaGlzIHNob3VsZCBwcm92aWRlCisgICAgICAgICAqIGEgZGVzY3JpcHRpb24gb2YgdGhlIGNob2ljZSBiZWluZyBtYWRlLgorICAgICAgICAgKiBAcGFyYW0gaGludFRleHQgSGludCB0ZXh0IHRvIHNldC4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2b2lkIHNldFByb21wdFRleHQoQ2hhclNlcXVlbmNlIGhpbnRUZXh0KTsKKyAgICAgICAgcHVibGljIENoYXJTZXF1ZW5jZSBnZXRIaW50VGV4dCgpOworICAgIH0KKyAgICAKKyAgICBwcml2YXRlIGNsYXNzIERpYWxvZ1BvcHVwIGltcGxlbWVudHMgU3Bpbm5lclBvcHVwLCBEaWFsb2dJbnRlcmZhY2UuT25DbGlja0xpc3RlbmVyIHsKKyAgICAgICAgcHJpdmF0ZSBBbGVydERpYWxvZyBtUG9wdXA7CisgICAgICAgIHByaXZhdGUgTGlzdEFkYXB0ZXIgbUxpc3RBZGFwdGVyOworICAgICAgICBwcml2YXRlIENoYXJTZXF1ZW5jZSBtUHJvbXB0OworCisgICAgICAgIHB1YmxpYyB2b2lkIGRpc21pc3MoKSB7CisgICAgICAgICAgICBtUG9wdXAuZGlzbWlzcygpOworICAgICAgICAgICAgbVBvcHVwID0gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBib29sZWFuIGlzU2hvd2luZygpIHsKKyAgICAgICAgICAgIHJldHVybiBtUG9wdXAgIT0gbnVsbCA/IG1Qb3B1cC5pc1Nob3dpbmcoKSA6IGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgc2V0QWRhcHRlcihMaXN0QWRhcHRlciBhZGFwdGVyKSB7CisgICAgICAgICAgICBtTGlzdEFkYXB0ZXIgPSBhZGFwdGVyOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgc2V0UHJvbXB0VGV4dChDaGFyU2VxdWVuY2UgaGludFRleHQpIHsKKyAgICAgICAgICAgIG1Qcm9tcHQgPSBoaW50VGV4dDsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgcHVibGljIENoYXJTZXF1ZW5jZSBnZXRIaW50VGV4dCgpIHsKKyAgICAgICAgICAgIHJldHVybiBtUHJvbXB0OworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgc2hvdygpIHsKKyAgICAgICAgICAgIEFsZXJ0RGlhbG9nLkJ1aWxkZXIgYnVpbGRlciA9IG5ldyBBbGVydERpYWxvZy5CdWlsZGVyKGdldENvbnRleHQoKSk7CisgICAgICAgICAgICBpZiAobVByb21wdCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgYnVpbGRlci5zZXRUaXRsZShtUHJvbXB0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1Qb3B1cCA9IGJ1aWxkZXIuc2V0U2luZ2xlQ2hvaWNlSXRlbXMobUxpc3RBZGFwdGVyLAorICAgICAgICAgICAgICAgICAgICBnZXRTZWxlY3RlZEl0ZW1Qb3NpdGlvbigpLCB0aGlzKS5zaG93KCk7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIHB1YmxpYyB2b2lkIG9uQ2xpY2soRGlhbG9nSW50ZXJmYWNlIGRpYWxvZywgaW50IHdoaWNoKSB7CisgICAgICAgICAgICBzZXRTZWxlY3Rpb24od2hpY2gpOworICAgICAgICAgICAgZGlzbWlzcygpOworICAgICAgICB9CisgICAgfQorICAgIAorICAgIHByaXZhdGUgY2xhc3MgRHJvcGRvd25Qb3B1cCBleHRlbmRzIExpc3RQb3B1cFdpbmRvdyBpbXBsZW1lbnRzIFNwaW5uZXJQb3B1cCB7CisgICAgICAgIHByaXZhdGUgQ2hhclNlcXVlbmNlIG1IaW50VGV4dDsKKyAgICAgICAgcHJpdmF0ZSBUZXh0VmlldyBtSGludFZpZXc7CisgICAgICAgIHByaXZhdGUgaW50IG1IaW50UmVzb3VyY2U7CisgICAgICAgIAorICAgICAgICBwdWJsaWMgRHJvcGRvd25Qb3B1cChDb250ZXh0IGNvbnRleHQsIEF0dHJpYnV0ZVNldCBhdHRycywKKyAgICAgICAgICAgICAgICBpbnQgZGVmU3R5bGVSZXMsIGludCBoaW50UmVzb3VyY2UpIHsKKyAgICAgICAgICAgIHN1cGVyKGNvbnRleHQsIGF0dHJzLCAwLCBkZWZTdHlsZVJlcyk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIG1IaW50UmVzb3VyY2UgPSBoaW50UmVzb3VyY2U7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIHNldEFuY2hvclZpZXcoU3Bpbm5lci50aGlzKTsKKyAgICAgICAgICAgIHNldE1vZGFsKHRydWUpOworICAgICAgICAgICAgc2V0UHJvbXB0UG9zaXRpb24oUE9TSVRJT05fUFJPTVBUX0JFTE9XKTsKKyAgICAgICAgICAgIHNldE9uSXRlbUNsaWNrTGlzdGVuZXIobmV3IE9uSXRlbUNsaWNrTGlzdGVuZXIoKSB7CisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgb25JdGVtQ2xpY2soQWRhcHRlclZpZXcgcGFyZW50LCBWaWV3IHYsIGludCBwb3NpdGlvbiwgbG9uZyBpZCkgeworICAgICAgICAgICAgICAgICAgICBTcGlubmVyLnRoaXMuc2V0U2VsZWN0aW9uKHBvc2l0aW9uKTsKKyAgICAgICAgICAgICAgICAgICAgZGlzbWlzcygpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBwdWJsaWMgQ2hhclNlcXVlbmNlIGdldEhpbnRUZXh0KCkgeworICAgICAgICAgICAgcmV0dXJuIG1IaW50VGV4dDsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgcHVibGljIHZvaWQgc2V0UHJvbXB0VGV4dChDaGFyU2VxdWVuY2UgaGludFRleHQpIHsKKyAgICAgICAgICAgIG1IaW50VGV4dCA9IGhpbnRUZXh0OworICAgICAgICAgICAgaWYgKG1IaW50VmlldyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgbUhpbnRWaWV3LnNldFRleHQoaGludFRleHQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIHNob3coKSB7CisgICAgICAgICAgICBpZiAobUhpbnRWaWV3ID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBmaW5hbCBUZXh0VmlldyB0ZXh0VmlldyA9IChUZXh0VmlldykgTGF5b3V0SW5mbGF0ZXIuZnJvbShnZXRDb250ZXh0KCkpLmluZmxhdGUoCisgICAgICAgICAgICAgICAgICAgICAgICBtSGludFJlc291cmNlLCBudWxsKS5maW5kVmlld0J5SWQoY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5pZC50ZXh0MSk7CisgICAgICAgICAgICAgICAgdGV4dFZpZXcuc2V0VGV4dChtSGludFRleHQpOworICAgICAgICAgICAgICAgIHNldFByb21wdFZpZXcodGV4dFZpZXcpOworICAgICAgICAgICAgICAgIG1IaW50VmlldyA9IHRleHRWaWV3OworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3VwZXIuc2hvdygpOworICAgICAgICAgICAgZ2V0TGlzdFZpZXcoKS5zZXRDaG9pY2VNb2RlKExpc3RWaWV3LkNIT0lDRV9NT0RFX1NJTkdMRSk7CisgICAgICAgICAgICBzZXRTZWxlY3Rpb24oU3Bpbm5lci50aGlzLmdldFNlbGVjdGVkSXRlbVBvc2l0aW9uKCkpOworICAgICAgICB9CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L1N0YWNrVmlldy5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L1N0YWNrVmlldy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBmMWFjYmUKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvU3RhY2tWaWV3LmphdmEKQEAgLTAsMCArMSwxMDEyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLndpZGdldDsKKworaW1wb3J0IGFuZHJvaWQuYW5pbWF0aW9uLlByb3BlcnR5VmFsdWVzSG9sZGVyOworaW1wb3J0IGFuZHJvaWQuYW5pbWF0aW9uLk9iamVjdEFuaW1hdG9yOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuUmVzb3VyY2VzOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQmx1ck1hc2tGaWx0ZXI7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5DYW52YXM7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5NYXRyaXg7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5QYWludDsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlBvcnRlckR1ZmY7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5Qb3J0ZXJEdWZmWGZlcm1vZGU7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5SZWN0OworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUmVjdEY7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5UYWJsZU1hc2tGaWx0ZXI7CitpbXBvcnQgYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldDsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuRGlzcGxheU1ldHJpY3M7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuTW90aW9uRXZlbnQ7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZlbG9jaXR5VHJhY2tlcjsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlld0NvbmZpZ3VyYXRpb247CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXdHcm91cDsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldy5NZWFzdXJlU3BlYzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlld0dyb3VwLkxheW91dFBhcmFtczsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuYW5pbWF0aW9uLkxpbmVhckludGVycG9sYXRvcjsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5SZW1vdGVWaWV3cy5SZW1vdGVWaWV3OworCitAUmVtb3RlVmlldworLyoqCisgKiBBIHZpZXcgdGhhdCBkaXNwbGF5cyBpdHMgY2hpbGRyZW4gaW4gYSBzdGFjayBhbmQgYWxsb3dzIHVzZXJzIHRvIGRpc2NyZXRlbHkgc3dpcGUKKyAqIHRocm91Z2ggdGhlIGNoaWxkcmVuLgorICovCitwdWJsaWMgY2xhc3MgU3RhY2tWaWV3IGV4dGVuZHMgQWRhcHRlclZpZXdBbmltYXRvciB7CisgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgVEFHID0gIlN0YWNrVmlldyI7CisKKyAgICAvKioKKyAgICAgKiBEZWZhdWx0IGFuaW1hdGlvbiBwYXJhbWV0ZXJzCisgICAgICovCisgICAgcHJpdmF0ZSBmaW5hbCBpbnQgREVGQVVMVF9BTklNQVRJT05fRFVSQVRJT04gPSA0MDA7CisgICAgcHJpdmF0ZSBmaW5hbCBpbnQgTUlOSU1VTV9BTklNQVRJT05fRFVSQVRJT04gPSA1MDsKKworICAgIC8qKgorICAgICAqIFBhcmFtZXRlcnMgZWZmZWN0aW5nIHRoZSBwZXJzcGVjdGl2ZSB2aXN1YWxzCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmxvYXQgUEVSU1BFQ1RJVkVfU0hJRlRfRkFDVE9SID0gMC4xMmY7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmxvYXQgUEVSU1BFQ1RJVkVfU0NBTEVfRkFDVE9SID0gMC4zNWY7CisKKyAgICAvKioKKyAgICAgKiBSZXByZXNlbnQgdGhlIHR3byBwb3NzaWJsZSBzdGFjayBtb2Rlcywgb25lIHdoZXJlIGl0ZW1zIHNsaWRlIHVwLCBhbmQgdGhlIG90aGVyCisgICAgICogd2hlcmUgaXRlbXMgc2xpZGUgZG93bi4gVGhlIHBlcnNwZWN0aXZlIGlzIGFsc28gaW52ZXJ0ZWQgYmV0d2VlbiB0aGVzZSB0d28gbW9kZXMuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IElURU1TX1NMSURFX1VQID0gMDsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgSVRFTVNfU0xJREVfRE9XTiA9IDE7CisKKyAgICAvKioKKyAgICAgKiBUaGVzZSBzcGVjaWZ5IHRoZSBkaWZmZXJlbnQgZ2VzdHVyZSBzdGF0ZXMKKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgR0VTVFVSRV9OT05FID0gMDsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgR0VTVFVSRV9TTElERV9VUCA9IDE7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEdFU1RVUkVfU0xJREVfRE9XTiA9IDI7CisKKyAgICAvKioKKyAgICAgKiBTcGVjaWZpZXMgaG93IGZhciB5b3UgbmVlZCB0byBzd2lwZSAodXAgb3IgZG93bikgYmVmb3JlIGl0CisgICAgICogd2lsbCBiZSBjb25zaWRlciBhIGNvbXBsZXRlZCBnZXN0dXJlIHdoZW4geW91IGxpZnQgeW91ciBmaW5nZXIKKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBmbG9hdCBTV0lQRV9USFJFU0hPTERfUkFUSU8gPSAwLjM1ZjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBmbG9hdCBTTElERV9VUF9SQVRJTyA9IDAuN2Y7CisKKyAgICAvKioKKyAgICAgKiBTZW50aW5lbCB2YWx1ZSBmb3Igbm8gY3VycmVudCBhY3RpdmUgcG9pbnRlci4KKyAgICAgKiBVc2VkIGJ5IHtAbGluayAjbUFjdGl2ZVBvaW50ZXJJZH0uCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IElOVkFMSURfUE9JTlRFUiA9IC0xOworCisgICAgLyoqCisgICAgICogTnVtYmVyIG9mIGFjdGl2ZSB2aWV3cyBpbiB0aGUgc3RhY2suIE9uZSBmZXdlciB2aWV3IGlzIGFjdHVhbGx5IHZpc2libGUsIGFzIG9uZSBpcyBoaWRkZW4uCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE5VTV9BQ1RJVkVfVklFV1MgPSA1OworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEZSQU1FX1BBRERJTkcgPSA0OworCisgICAgLyoqCisgICAgICogVGhlc2UgdmFyaWFibGVzIGFyZSBhbGwgcmVsYXRlZCB0byB0aGUgY3VycmVudCBzdGF0ZSBvZiB0b3VjaCBpbnRlcmFjdGlvbgorICAgICAqIHdpdGggdGhlIHN0YWNrCisgICAgICovCisgICAgcHJpdmF0ZSBmbG9hdCBtSW5pdGlhbFk7CisgICAgcHJpdmF0ZSBmbG9hdCBtSW5pdGlhbFg7CisgICAgcHJpdmF0ZSBpbnQgbUFjdGl2ZVBvaW50ZXJJZDsKKyAgICBwcml2YXRlIGludCBtWVZlbG9jaXR5ID0gMDsKKyAgICBwcml2YXRlIGludCBtU3dpcGVHZXN0dXJlVHlwZSA9IEdFU1RVUkVfTk9ORTsKKyAgICBwcml2YXRlIGludCBtU2xpZGVBbW91bnQ7CisgICAgcHJpdmF0ZSBpbnQgbVN3aXBlVGhyZXNob2xkOworICAgIHByaXZhdGUgaW50IG1Ub3VjaFNsb3A7CisgICAgcHJpdmF0ZSBpbnQgbU1heGltdW1WZWxvY2l0eTsKKyAgICBwcml2YXRlIFZlbG9jaXR5VHJhY2tlciBtVmVsb2NpdHlUcmFja2VyOworCisgICAgcHJpdmF0ZSBzdGF0aWMgSG9sb2dyYXBoaWNIZWxwZXIgc0hvbG9ncmFwaGljSGVscGVyOworICAgIHByaXZhdGUgSW1hZ2VWaWV3IG1IaWdobGlnaHQ7CisgICAgcHJpdmF0ZSBTdGFja1NsaWRlciBtU3RhY2tTbGlkZXI7CisgICAgcHJpdmF0ZSBib29sZWFuIG1GaXJzdExheW91dEhhcHBlbmVkID0gZmFsc2U7CisgICAgcHJpdmF0ZSBWaWV3R3JvdXAgbUFuY2VzdG9yQ29udGFpbmluZ0FsbENoaWxkcmVuID0gbnVsbDsKKyAgICBwcml2YXRlIGludCBtQW5jZXN0b3JIZWlnaHQgPSAwOworICAgIHByaXZhdGUgaW50IG1TdGFja01vZGU7CisgICAgcHJpdmF0ZSBpbnQgbUZyYW1lUGFkZGluZzsKKworICAgIHB1YmxpYyBTdGFja1ZpZXcoQ29udGV4dCBjb250ZXh0KSB7CisgICAgICAgIHN1cGVyKGNvbnRleHQpOworICAgICAgICBpbml0U3RhY2tWaWV3KCk7CisgICAgfQorCisgICAgcHVibGljIFN0YWNrVmlldyhDb250ZXh0IGNvbnRleHQsIEF0dHJpYnV0ZVNldCBhdHRycykgeworICAgICAgICBzdXBlcihjb250ZXh0LCBhdHRycyk7CisgICAgICAgIGluaXRTdGFja1ZpZXcoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgaW5pdFN0YWNrVmlldygpIHsKKyAgICAgICAgY29uZmlndXJlVmlld0FuaW1hdG9yKE5VTV9BQ1RJVkVfVklFV1MsIE5VTV9BQ1RJVkVfVklFV1MgLSAyLCBmYWxzZSk7CisgICAgICAgIHNldFN0YXRpY1RyYW5zZm9ybWF0aW9uc0VuYWJsZWQodHJ1ZSk7CisgICAgICAgIGZpbmFsIFZpZXdDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24gPSBWaWV3Q29uZmlndXJhdGlvbi5nZXQoZ2V0Q29udGV4dCgpKTsKKyAgICAgICAgbVRvdWNoU2xvcCA9IGNvbmZpZ3VyYXRpb24uZ2V0U2NhbGVkVG91Y2hTbG9wKCk7CisgICAgICAgIG1NYXhpbXVtVmVsb2NpdHkgPSBjb25maWd1cmF0aW9uLmdldFNjYWxlZE1heGltdW1GbGluZ1ZlbG9jaXR5KCk7CisgICAgICAgIG1BY3RpdmVQb2ludGVySWQgPSBJTlZBTElEX1BPSU5URVI7CisKKyAgICAgICAgbUhpZ2hsaWdodCA9IG5ldyBJbWFnZVZpZXcoZ2V0Q29udGV4dCgpKTsKKyAgICAgICAgbUhpZ2hsaWdodC5zZXRMYXlvdXRQYXJhbXMobmV3IExheW91dFBhcmFtcyhtSGlnaGxpZ2h0KSk7CisgICAgICAgIGFkZFZpZXdJbkxheW91dChtSGlnaGxpZ2h0LCAtMSwgbmV3IExheW91dFBhcmFtcyhtSGlnaGxpZ2h0KSk7CisgICAgICAgIG1TdGFja1NsaWRlciA9IG5ldyBTdGFja1NsaWRlcigpOworCisgICAgICAgIGlmIChzSG9sb2dyYXBoaWNIZWxwZXIgPT0gbnVsbCkgeworICAgICAgICAgICAgc0hvbG9ncmFwaGljSGVscGVyID0gbmV3IEhvbG9ncmFwaGljSGVscGVyKG1Db250ZXh0KTsKKyAgICAgICAgfQorICAgICAgICBzZXRDbGlwQ2hpbGRyZW4oZmFsc2UpOworICAgICAgICBzZXRDbGlwVG9QYWRkaW5nKGZhbHNlKTsKKworICAgICAgICAvLyBUaGlzIHNldHMgdGhlIGZvcm0gb2YgdGhlIFN0YWNrVmlldywgd2hpY2ggaXMgY3VycmVudGx5IHRvIGhhdmUgdGhlIHBlcnNwZWN0aXZlLXNoaWZ0ZWQKKyAgICAgICAgLy8gdmlld3MgYWJvdmUgdGhlIGFjdGl2ZSB2aWV3LCBhbmQgaGF2ZSBpdGVtcyBzbGlkZSBkb3duIHdoZW4gc2xpZGluZyBvdXQuIFRoZSBvcHBvc2l0ZSBpcworICAgICAgICAvLyBhdmFpbGFibGUgYnkgdXNpbmcgSVRFTVNfU0xJREVfVVAuCisgICAgICAgIG1TdGFja01vZGUgPSBJVEVNU19TTElERV9ET1dOOworCisgICAgICAgIC8vIFRoaXMgaXMgYSBmbGFnIHRvIGluZGljYXRlIHRoZSB0aGUgc3RhY2sgaXMgbG9hZGluZyBmb3IgdGhlIGZpcnN0IHRpbWUKKyAgICAgICAgbVdoaWNoQ2hpbGQgPSAtMTsKKworICAgICAgICAvLyBBZGp1c3QgdGhlIGZyYW1lIHBhZGRpbmcgYmFzZWQgb24gdGhlIGRlbnNpdHksIHNpbmNlIHRoZSBoaWdobGlnaHQgY2hhbmdlcyBiYXNlZAorICAgICAgICAvLyBvbiB0aGUgZGVuc2l0eQorICAgICAgICBmaW5hbCBmbG9hdCBkZW5zaXR5ID0gbUNvbnRleHQuZ2V0UmVzb3VyY2VzKCkuZ2V0RGlzcGxheU1ldHJpY3MoKS5kZW5zaXR5OworICAgICAgICBtRnJhbWVQYWRkaW5nID0gKGludCkgTWF0aC5jZWlsKGRlbnNpdHkgKiBGUkFNRV9QQURESU5HKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBbmltYXRlIHRoZSB2aWV3cyBiZXR3ZWVuIGRpZmZlcmVudCByZWxhdGl2ZSBpbmRleGVzIHdpdGhpbiB0aGUge0BsaW5rIEFkYXB0ZXJWaWV3QW5pbWF0b3J9CisgICAgICovCisgICAgdm9pZCBhbmltYXRlVmlld0ZvclRyYW5zaXRpb24oaW50IGZyb21JbmRleCwgaW50IHRvSW5kZXgsIFZpZXcgdmlldykgeworICAgICAgICBpZiAoZnJvbUluZGV4ID09IC0xICYmIHRvSW5kZXggPT0gMCkgeworICAgICAgICAgICAgLy8gRmFkZSBpdGVtIGluCisgICAgICAgICAgICBpZiAodmlldy5nZXRBbHBoYSgpID09IDEpIHsKKyAgICAgICAgICAgICAgICB2aWV3LnNldEFscGhhKDApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdmlldy5zZXRWaXNpYmlsaXR5KFZJU0lCTEUpOworCisgICAgICAgICAgICBPYmplY3RBbmltYXRvcjxGbG9hdD4gZmFkZUluID0gbmV3IE9iamVjdEFuaW1hdG9yPEZsb2F0PihERUZBVUxUX0FOSU1BVElPTl9EVVJBVElPTiwKKyAgICAgICAgICAgICAgICAgICAgdmlldywgImFscGhhIiwgdmlldy5nZXRBbHBoYSgpLCAxLjBmKTsKKyAgICAgICAgICAgIGZhZGVJbi5zdGFydCgpOworICAgICAgICB9IGVsc2UgaWYgKGZyb21JbmRleCA9PSBtTnVtQWN0aXZlVmlld3MgLSAxICYmIHRvSW5kZXggPT0gbU51bUFjdGl2ZVZpZXdzIC0gMikgeworICAgICAgICAgICAgLy8gU2xpZGUgaXRlbSBpbgorICAgICAgICAgICAgdmlldy5zZXRWaXNpYmlsaXR5KFZJU0lCTEUpOworCisgICAgICAgICAgICBMYXlvdXRQYXJhbXMgbHAgPSAoTGF5b3V0UGFyYW1zKSB2aWV3LmdldExheW91dFBhcmFtcygpOworICAgICAgICAgICAgaW50IGR1cmF0aW9uID0gTWF0aC5yb3VuZChtU3RhY2tTbGlkZXIuZ2V0RHVyYXRpb25Gb3JOZXV0cmFsUG9zaXRpb24obVlWZWxvY2l0eSkpOworCisgICAgICAgICAgICBTdGFja1NsaWRlciBhbmltYXRpb25TbGlkZXIgPSBuZXcgU3RhY2tTbGlkZXIobVN0YWNrU2xpZGVyKTsKKyAgICAgICAgICAgIFByb3BlcnR5VmFsdWVzSG9sZGVyPEZsb2F0PiBzbGlkZUluWSA9CisgICAgICAgICAgICAgICAgICAgIG5ldyBQcm9wZXJ0eVZhbHVlc0hvbGRlcjxGbG9hdD4oIllQcm9ncmVzcyIsIDAuMGYpOworICAgICAgICAgICAgUHJvcGVydHlWYWx1ZXNIb2xkZXI8RmxvYXQ+IHNsaWRlSW5YID0KKyAgICAgICAgICAgICAgICAgICAgbmV3IFByb3BlcnR5VmFsdWVzSG9sZGVyPEZsb2F0PigiWFByb2dyZXNzIiwgMC4wZik7CisgICAgICAgICAgICBPYmplY3RBbmltYXRvciBwYSA9IG5ldyBPYmplY3RBbmltYXRvcihkdXJhdGlvbiwgYW5pbWF0aW9uU2xpZGVyLAorICAgICAgICAgICAgICAgICAgICBzbGlkZUluWCwgc2xpZGVJblkpOworICAgICAgICAgICAgcGEuc2V0SW50ZXJwb2xhdG9yKG5ldyBMaW5lYXJJbnRlcnBvbGF0b3IoKSk7CisgICAgICAgICAgICBwYS5zdGFydCgpOworICAgICAgICB9IGVsc2UgaWYgKGZyb21JbmRleCA9PSBtTnVtQWN0aXZlVmlld3MgLSAyICYmIHRvSW5kZXggPT0gbU51bUFjdGl2ZVZpZXdzIC0gMSkgeworICAgICAgICAgICAgLy8gU2xpZGUgaXRlbSBvdXQKKyAgICAgICAgICAgIExheW91dFBhcmFtcyBscCA9IChMYXlvdXRQYXJhbXMpIHZpZXcuZ2V0TGF5b3V0UGFyYW1zKCk7CisKKyAgICAgICAgICAgIGludCBkdXJhdGlvbiA9IE1hdGgucm91bmQobVN0YWNrU2xpZGVyLmdldER1cmF0aW9uRm9yT2Zmc2NyZWVuUG9zaXRpb24obVlWZWxvY2l0eSkpOworCisgICAgICAgICAgICBTdGFja1NsaWRlciBhbmltYXRpb25TbGlkZXIgPSBuZXcgU3RhY2tTbGlkZXIobVN0YWNrU2xpZGVyKTsKKyAgICAgICAgICAgIFByb3BlcnR5VmFsdWVzSG9sZGVyPEZsb2F0PiBzbGlkZU91dFkgPQorICAgICAgICAgICAgICAgICAgICBuZXcgUHJvcGVydHlWYWx1ZXNIb2xkZXI8RmxvYXQ+KCJZUHJvZ3Jlc3MiLCAxLjBmKTsKKyAgICAgICAgICAgIFByb3BlcnR5VmFsdWVzSG9sZGVyPEZsb2F0PiBzbGlkZU91dFggPQorICAgICAgICAgICAgICAgICAgICBuZXcgUHJvcGVydHlWYWx1ZXNIb2xkZXI8RmxvYXQ+KCJYUHJvZ3Jlc3MiLCAwLjBmKTsKKyAgICAgICAgICAgIE9iamVjdEFuaW1hdG9yIHBhID0gbmV3IE9iamVjdEFuaW1hdG9yKGR1cmF0aW9uLCBhbmltYXRpb25TbGlkZXIsCisgICAgICAgICAgICAgICAgICAgc2xpZGVPdXRYLCBzbGlkZU91dFkpOworICAgICAgICAgICAgcGEuc2V0SW50ZXJwb2xhdG9yKG5ldyBMaW5lYXJJbnRlcnBvbGF0b3IoKSk7CisgICAgICAgICAgICBwYS5zdGFydCgpOworICAgICAgICB9IGVsc2UgaWYgKGZyb21JbmRleCA9PSAtMSAmJiB0b0luZGV4ID09IG1OdW1BY3RpdmVWaWV3cyAtIDEpIHsKKyAgICAgICAgICAgIC8vIE1ha2Ugc3VyZSB0aGlzIHZpZXcgdGhhdCBpcyAid2FpdGluZyBpbiB0aGUgd2luZ3MiIGlzIGludmlzaWJsZQorICAgICAgICAgICAgdmlldy5zZXRBbHBoYSgwLjBmKTsKKyAgICAgICAgICAgIHZpZXcuc2V0VmlzaWJpbGl0eShJTlZJU0lCTEUpOworICAgICAgICAgICAgTGF5b3V0UGFyYW1zIGxwID0gKExheW91dFBhcmFtcykgdmlldy5nZXRMYXlvdXRQYXJhbXMoKTsKKyAgICAgICAgICAgIGxwLnNldFZlcnRpY2FsT2Zmc2V0KC1tU2xpZGVBbW91bnQpOworICAgICAgICB9IGVsc2UgaWYgKHRvSW5kZXggPT0gLTEpIHsKKyAgICAgICAgICAgIC8vIEZhZGUgaXRlbSBvdXQKKyAgICAgICAgICAgIE9iamVjdEFuaW1hdG9yPEZsb2F0PiBmYWRlT3V0ID0gbmV3IE9iamVjdEFuaW1hdG9yPEZsb2F0PgorICAgICAgICAgICAgICAgICAgICAoREVGQVVMVF9BTklNQVRJT05fRFVSQVRJT04sIHZpZXcsICJhbHBoYSIsIHZpZXcuZ2V0QWxwaGEoKSwgMC4wZik7CisgICAgICAgICAgICBmYWRlT3V0LnN0YXJ0KCk7CisgICAgICAgIH0KKworICAgICAgICAvLyBJbXBsZW1lbnQgdGhlIGZha2VkIHBlcnNwZWN0aXZlCisgICAgICAgIGlmICh0b0luZGV4ICE9IC0xKSB7CisgICAgICAgICAgICB0cmFuc2Zvcm1WaWV3QXRJbmRleCh0b0luZGV4LCB2aWV3KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCB0cmFuc2Zvcm1WaWV3QXRJbmRleChpbnQgaW5kZXgsIFZpZXcgdmlldykgeworICAgICAgICBmbG9hdCBtYXhQZXJwZWN0aXZlU2hpZnQgPSBtTWVhc3VyZWRIZWlnaHQgKiBQRVJTUEVDVElWRV9TSElGVF9GQUNUT1I7CisKKyAgICAgICAgaWYgKGluZGV4ID09IG1OdW1BY3RpdmVWaWV3cyAtMSkgaW5kZXgtLTsKKworICAgICAgICBmbG9hdCByID0gKGluZGV4ICogMS4wZikgLyAobU51bUFjdGl2ZVZpZXdzIC0gMik7CisKKyAgICAgICAgZmxvYXQgc2NhbGUgPSAxIC0gUEVSU1BFQ1RJVkVfU0NBTEVfRkFDVE9SICogKDEgLSByKTsKKyAgICAgICAgUHJvcGVydHlWYWx1ZXNIb2xkZXI8RmxvYXQ+IHNjYWxlWCA9IG5ldyBQcm9wZXJ0eVZhbHVlc0hvbGRlcjxGbG9hdD4oInNjYWxlWCIsIHNjYWxlKTsKKyAgICAgICAgUHJvcGVydHlWYWx1ZXNIb2xkZXI8RmxvYXQ+IHNjYWxlWSA9IG5ldyBQcm9wZXJ0eVZhbHVlc0hvbGRlcjxGbG9hdD4oInNjYWxlWSIsIHNjYWxlKTsKKworICAgICAgICByID0gKGZsb2F0KSBNYXRoLnBvdyhyLCAyKTsKKworICAgICAgICBpbnQgc3RhY2tEaXJlY3Rpb24gPSAobVN0YWNrTW9kZSA9PSBJVEVNU19TTElERV9VUCkgPyAxIDogLTE7CisgICAgICAgIGZsb2F0IHBlcnNwZWN0aXZlVHJhbnNsYXRpb24gPSAtc3RhY2tEaXJlY3Rpb24gKiByICogbWF4UGVycGVjdGl2ZVNoaWZ0OworICAgICAgICBmbG9hdCBzY2FsZVNoaWZ0Q29ycmVjdGlvbiA9IHN0YWNrRGlyZWN0aW9uICogKDEgLSBzY2FsZSkgKgorICAgICAgICAgICAgICAgIChtTWVhc3VyZWRIZWlnaHQgKiAoMSAtIFBFUlNQRUNUSVZFX1NISUZUX0ZBQ1RPUikgLyAyLjBmKTsKKyAgICAgICAgZmxvYXQgdHJhbnNZID0gcGVyc3BlY3RpdmVUcmFuc2xhdGlvbiArIHNjYWxlU2hpZnRDb3JyZWN0aW9uOworCisgICAgICAgIFByb3BlcnR5VmFsdWVzSG9sZGVyPEZsb2F0PiB0cmFuc2xhdGlvblkgPQorICAgICAgICAgICAgICAgIG5ldyBQcm9wZXJ0eVZhbHVlc0hvbGRlcjxGbG9hdD4oInRyYW5zbGF0aW9uWSIsIHRyYW5zWSk7CisgICAgICAgIE9iamVjdEFuaW1hdG9yIHBhID0gbmV3IE9iamVjdEFuaW1hdG9yKDEwMCwgdmlldywgc2NhbGVYLCBzY2FsZVksIHRyYW5zbGF0aW9uWSk7CisgICAgICAgIHBhLnN0YXJ0KCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHVwZGF0ZUNoaWxkVHJhbnNmb3JtcygpIHsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtTnVtQWN0aXZlVmlld3MgLSAxOyBpKyspIHsKKyAgICAgICAgICAgIFZpZXcgdiA9IGdldFZpZXdBdFJlbGF0aXZlSW5kZXgoaSk7CisgICAgICAgICAgICBpZiAodiAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgdHJhbnNmb3JtVmlld0F0SW5kZXgoaSwgdik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBGcmFtZUxheW91dCBnZXRGcmFtZUZvckNoaWxkKCkgeworICAgICAgICBGcmFtZUxheW91dCBmbCA9IG5ldyBGcmFtZUxheW91dChtQ29udGV4dCk7CisgICAgICAgIGZsLnNldFBhZGRpbmcobUZyYW1lUGFkZGluZywgbUZyYW1lUGFkZGluZywgbUZyYW1lUGFkZGluZywgbUZyYW1lUGFkZGluZyk7CisgICAgICAgIHJldHVybiBmbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBcHBseSBhbnkgbmVjZXNzYXJ5IHRyYW5mb3JtcyBmb3IgdGhlIGNoaWxkIHRoYXQgaXMgYmVpbmcgYWRkZWQuCisgICAgICovCisgICAgdm9pZCBhcHBseVRyYW5zZm9ybUZvckNoaWxkQXRJbmRleChWaWV3IGNoaWxkLCBpbnQgcmVsYXRpdmVJbmRleCkgeworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIGRpc3BhdGNoRHJhdyhDYW52YXMgY2FudmFzKSB7CisgICAgICAgIHN1cGVyLmRpc3BhdGNoRHJhdyhjYW52YXMpOworICAgIH0KKworICAgIC8vIFRPRE86IHJpZ2h0IG5vdywgdGhpcyBjb2RlIHdhbGtzIHVwIHRoZSBoaWVyYXJjaHkgYXMgZmFyIGFzIG5lZWRlZCBhbmQgZGlzYWJsZXMgY2xpcHBpbmcKKyAgICAvLyBzbyB0aGF0IHRoZSBzdGFjaydzIGNoaWxkcmVuIGNhbiBkcmF3IG91dHNpZGUgb2YgdGhlIHN0YWNrJ3MgYm91bmRzLiBUaGlzIGlzIGZpbmUgd2l0aGluCisgICAgLy8gdGhlIGNvbnRleHQgb2Ygd2lkZ2V0cyBpbiB0aGUgbGF1bmNoZXIsIGJ1dCBpcyBkZXN0cnVjdGl2ZSBpbiBnZW5lcmFsLCBhcyB0aGUgY2xpcHBpbmcKKyAgICAvLyB2YWx1ZXMgYXJlIG5vdCBiZWluZyByZXNldC4gRm9yIHRoaXMgdG8gYmUgYSBmdWxsIGZyYW1ld29yayBsZXZlbCB3aWRnZXQsIHdlIHdpbGwgbmVlZAorICAgIC8vIGZyYW1ld29yayBsZXZlbCBzdXBwb3J0IGZvciBkcmF3aW5nIG91dHNpZGUgb2YgYSBwYXJlbnQncyBib3VuZHMuCisgICAgcHJpdmF0ZSB2b2lkIGRpc2FibGVQYXJlbnRhbENsaXBwaW5nKCkgeworICAgICAgICBpZiAobUFuY2VzdG9yQ29udGFpbmluZ0FsbENoaWxkcmVuICE9IG51bGwpIHsKKyAgICAgICAgICAgIExvZy52KFRBRywgIkRpc2FibGluZyBwYXJlbnRhbCBjbGlwcGluZy4iKTsKKyAgICAgICAgICAgIFZpZXdHcm91cCB2ZyA9IHRoaXM7CisgICAgICAgICAgICB3aGlsZSAodmcuZ2V0UGFyZW50KCkgIT0gbnVsbCAmJiB2Zy5nZXRQYXJlbnQoKSBpbnN0YW5jZW9mIFZpZXdHcm91cCkgeworICAgICAgICAgICAgICAgIGlmICh2ZyA9PSBtQW5jZXN0b3JDb250YWluaW5nQWxsQ2hpbGRyZW4pIGJyZWFrOworICAgICAgICAgICAgICAgIHZnID0gKFZpZXdHcm91cCkgdmcuZ2V0UGFyZW50KCk7CisgICAgICAgICAgICAgICAgdmcuc2V0Q2xpcENoaWxkcmVuKGZhbHNlKTsKKyAgICAgICAgICAgICAgICB2Zy5zZXRDbGlwVG9QYWRkaW5nKGZhbHNlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBvbkxheW91dCgpIHsKKyAgICAgICAgaWYgKCFtRmlyc3RMYXlvdXRIYXBwZW5lZCkgeworICAgICAgICAgICAgbVNsaWRlQW1vdW50ID0gTWF0aC5yb3VuZChTTElERV9VUF9SQVRJTyAqIGdldE1lYXN1cmVkSGVpZ2h0KCkpOworICAgICAgICAgICAgdXBkYXRlQ2hpbGRUcmFuc2Zvcm1zKCk7CisgICAgICAgICAgICBtU3dpcGVUaHJlc2hvbGQgPSBNYXRoLnJvdW5kKFNXSVBFX1RIUkVTSE9MRF9SQVRJTyAqIG1TbGlkZUFtb3VudCk7CisgICAgICAgICAgICBtRmlyc3RMYXlvdXRIYXBwZW5lZCA9IHRydWU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBvbkludGVyY2VwdFRvdWNoRXZlbnQoTW90aW9uRXZlbnQgZXYpIHsKKyAgICAgICAgaW50IGFjdGlvbiA9IGV2LmdldEFjdGlvbigpOworICAgICAgICBzd2l0Y2goYWN0aW9uICYgTW90aW9uRXZlbnQuQUNUSU9OX01BU0spIHsKKyAgICAgICAgICAgIGNhc2UgTW90aW9uRXZlbnQuQUNUSU9OX0RPV046IHsKKyAgICAgICAgICAgICAgICBpZiAobUFjdGl2ZVBvaW50ZXJJZCA9PSBJTlZBTElEX1BPSU5URVIpIHsKKyAgICAgICAgICAgICAgICAgICAgbUluaXRpYWxYID0gZXYuZ2V0WCgpOworICAgICAgICAgICAgICAgICAgICBtSW5pdGlhbFkgPSBldi5nZXRZKCk7CisgICAgICAgICAgICAgICAgICAgIG1BY3RpdmVQb2ludGVySWQgPSBldi5nZXRQb2ludGVySWQoMCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2FzZSBNb3Rpb25FdmVudC5BQ1RJT05fTU9WRTogeworICAgICAgICAgICAgICAgIGludCBwb2ludGVySW5kZXggPSBldi5maW5kUG9pbnRlckluZGV4KG1BY3RpdmVQb2ludGVySWQpOworICAgICAgICAgICAgICAgIGlmIChwb2ludGVySW5kZXggPT0gSU5WQUxJRF9QT0lOVEVSKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIG5vIGRhdGEgZm9yIG91ciBwcmltYXJ5IHBvaW50ZXIsIHRoaXMgc2hvdWxkbid0IGhhcHBlbiwgbG9nIGl0CisgICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIkVycm9yOiBObyBkYXRhIGZvciBvdXIgcHJpbWFyeSBwb2ludGVyLiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGZsb2F0IG5ld1kgPSBldi5nZXRZKHBvaW50ZXJJbmRleCk7CisgICAgICAgICAgICAgICAgZmxvYXQgZGVsdGFZID0gbmV3WSAtIG1Jbml0aWFsWTsKKworICAgICAgICAgICAgICAgIGJlZ2luR2VzdHVyZUlmTmVlZGVkKGRlbHRhWSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXNlIE1vdGlvbkV2ZW50LkFDVElPTl9QT0lOVEVSX1VQOiB7CisgICAgICAgICAgICAgICAgb25TZWNvbmRhcnlQb2ludGVyVXAoZXYpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2FzZSBNb3Rpb25FdmVudC5BQ1RJT05fVVA6CisgICAgICAgICAgICBjYXNlIE1vdGlvbkV2ZW50LkFDVElPTl9DQU5DRUw6IHsKKyAgICAgICAgICAgICAgICBtQWN0aXZlUG9pbnRlcklkID0gSU5WQUxJRF9QT0lOVEVSOworICAgICAgICAgICAgICAgIG1Td2lwZUdlc3R1cmVUeXBlID0gR0VTVFVSRV9OT05FOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIG1Td2lwZUdlc3R1cmVUeXBlICE9IEdFU1RVUkVfTk9ORTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgYmVnaW5HZXN0dXJlSWZOZWVkZWQoZmxvYXQgZGVsdGFZKSB7CisgICAgICAgIGlmICgoaW50KSBNYXRoLmFicyhkZWx0YVkpID4gbVRvdWNoU2xvcCAmJiBtU3dpcGVHZXN0dXJlVHlwZSA9PSBHRVNUVVJFX05PTkUpIHsKKyAgICAgICAgICAgIGludCBzd2lwZUdlc3R1cmVUeXBlID0gZGVsdGFZIDwgMCA/IEdFU1RVUkVfU0xJREVfVVAgOiBHRVNUVVJFX1NMSURFX0RPV047CisgICAgICAgICAgICBjYW5jZWxMb25nUHJlc3MoKTsKKyAgICAgICAgICAgIHJlcXVlc3REaXNhbGxvd0ludGVyY2VwdFRvdWNoRXZlbnQodHJ1ZSk7CisKKyAgICAgICAgICAgIGludCBhY3RpdmVJbmRleDsKKyAgICAgICAgICAgIGlmIChtU3RhY2tNb2RlID09IElURU1TX1NMSURFX1VQKSB7CisgICAgICAgICAgICAgICAgYWN0aXZlSW5kZXggPSAoc3dpcGVHZXN0dXJlVHlwZSA9PSBHRVNUVVJFX1NMSURFX0RPV04pID8KKyAgICAgICAgICAgICAgICAgICAgICAgIG1OdW1BY3RpdmVWaWV3cyAtIDEgOiBtTnVtQWN0aXZlVmlld3MgLSAyOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBhY3RpdmVJbmRleCA9IChzd2lwZUdlc3R1cmVUeXBlID09IEdFU1RVUkVfU0xJREVfRE9XTikgPworICAgICAgICAgICAgICAgICAgICAgICAgbU51bUFjdGl2ZVZpZXdzIC0gMiA6IG1OdW1BY3RpdmVWaWV3cyAtIDE7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChtQWRhcHRlciA9PSBudWxsKSByZXR1cm47CisKKyAgICAgICAgICAgIGlmIChtQ3VycmVudFdpbmRvd1N0YXJ0VW5ib3VuZGVkICsgYWN0aXZlSW5kZXggPT0gMCkgeworICAgICAgICAgICAgICAgIG1TdGFja1NsaWRlci5zZXRNb2RlKFN0YWNrU2xpZGVyLkJFR0lOTklOR19PRl9TVEFDS19NT0RFKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAobUN1cnJlbnRXaW5kb3dTdGFydFVuYm91bmRlZCArIGFjdGl2ZUluZGV4ID09IG1BZGFwdGVyLmdldENvdW50KCkpIHsKKyAgICAgICAgICAgICAgICBhY3RpdmVJbmRleC0tOworICAgICAgICAgICAgICAgIG1TdGFja1NsaWRlci5zZXRNb2RlKFN0YWNrU2xpZGVyLkVORF9PRl9TVEFDS19NT0RFKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbVN0YWNrU2xpZGVyLnNldE1vZGUoU3RhY2tTbGlkZXIuTk9STUFMX01PREUpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBWaWV3IHYgPSBnZXRWaWV3QXRSZWxhdGl2ZUluZGV4KGFjdGl2ZUluZGV4KTsKKyAgICAgICAgICAgIGlmICh2ID09IG51bGwpIHJldHVybjsKKworICAgICAgICAgICAgbUhpZ2hsaWdodC5zZXRJbWFnZUJpdG1hcChzSG9sb2dyYXBoaWNIZWxwZXIuY3JlYXRlT3V0bGluZSh2KSk7CisgICAgICAgICAgICBtSGlnaGxpZ2h0LnNldFJvdGF0aW9uKHYuZ2V0Um90YXRpb24oKSk7CisgICAgICAgICAgICBtSGlnaGxpZ2h0LnNldFRyYW5zbGF0aW9uWSh2LmdldFRyYW5zbGF0aW9uWSgpKTsKKyAgICAgICAgICAgIG1IaWdobGlnaHQuYnJpbmdUb0Zyb250KCk7CisgICAgICAgICAgICB2LmJyaW5nVG9Gcm9udCgpOworICAgICAgICAgICAgbVN0YWNrU2xpZGVyLnNldFZpZXcodik7CisKKyAgICAgICAgICAgIGlmIChzd2lwZUdlc3R1cmVUeXBlID09IEdFU1RVUkVfU0xJREVfRE9XTikKKyAgICAgICAgICAgICAgICB2LnNldFZpc2liaWxpdHkoVklTSUJMRSk7CisKKyAgICAgICAgICAgIC8vIFdlIG9ubHkgcmVnaXN0ZXIgdGhpcyBnZXN0dXJlIGlmIHdlJ3ZlIG1hZGUgaXQgdGhpcyBmYXIgd2l0aG91dCBhIHByb2JsZW0KKyAgICAgICAgICAgIG1Td2lwZUdlc3R1cmVUeXBlID0gc3dpcGVHZXN0dXJlVHlwZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIG9uVG91Y2hFdmVudChNb3Rpb25FdmVudCBldikgeworICAgICAgICBpbnQgYWN0aW9uID0gZXYuZ2V0QWN0aW9uKCk7CisgICAgICAgIGludCBwb2ludGVySW5kZXggPSBldi5maW5kUG9pbnRlckluZGV4KG1BY3RpdmVQb2ludGVySWQpOworICAgICAgICBpZiAocG9pbnRlckluZGV4ID09IElOVkFMSURfUE9JTlRFUikgeworICAgICAgICAgICAgLy8gbm8gZGF0YSBmb3Igb3VyIHByaW1hcnkgcG9pbnRlciwgdGhpcyBzaG91bGRuJ3QgaGFwcGVuLCBsb2cgaXQKKyAgICAgICAgICAgIExvZy5kKFRBRywgIkVycm9yOiBObyBkYXRhIGZvciBvdXIgcHJpbWFyeSBwb2ludGVyLiIpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgZmxvYXQgbmV3WSA9IGV2LmdldFkocG9pbnRlckluZGV4KTsKKyAgICAgICAgZmxvYXQgbmV3WCA9IGV2LmdldFgocG9pbnRlckluZGV4KTsKKyAgICAgICAgZmxvYXQgZGVsdGFZID0gbmV3WSAtIG1Jbml0aWFsWTsKKyAgICAgICAgZmxvYXQgZGVsdGFYID0gbmV3WCAtIG1Jbml0aWFsWDsKKyAgICAgICAgaWYgKG1WZWxvY2l0eVRyYWNrZXIgPT0gbnVsbCkgeworICAgICAgICAgICAgbVZlbG9jaXR5VHJhY2tlciA9IFZlbG9jaXR5VHJhY2tlci5vYnRhaW4oKTsKKyAgICAgICAgfQorICAgICAgICBtVmVsb2NpdHlUcmFja2VyLmFkZE1vdmVtZW50KGV2KTsKKworICAgICAgICBzd2l0Y2ggKGFjdGlvbiAmIE1vdGlvbkV2ZW50LkFDVElPTl9NQVNLKSB7CisgICAgICAgICAgICBjYXNlIE1vdGlvbkV2ZW50LkFDVElPTl9NT1ZFOiB7CisgICAgICAgICAgICAgICAgYmVnaW5HZXN0dXJlSWZOZWVkZWQoZGVsdGFZKTsKKworICAgICAgICAgICAgICAgIGZsb2F0IHJ4ID0gZGVsdGFYIC8gKG1TbGlkZUFtb3VudCAqIDEuMGYpOworICAgICAgICAgICAgICAgIGlmIChtU3dpcGVHZXN0dXJlVHlwZSA9PSBHRVNUVVJFX1NMSURFX0RPV04pIHsKKyAgICAgICAgICAgICAgICAgICAgZmxvYXQgciA9IChkZWx0YVkgLSBtVG91Y2hTbG9wICogMS4wZikgLyBtU2xpZGVBbW91bnQgKiAxLjBmOworICAgICAgICAgICAgICAgICAgICBpZiAobVN0YWNrTW9kZSA9PSBJVEVNU19TTElERV9ET1dOKSByID0gMSAtIHI7CisgICAgICAgICAgICAgICAgICAgIG1TdGFja1NsaWRlci5zZXRZUHJvZ3Jlc3MoMSAtIHIpOworICAgICAgICAgICAgICAgICAgICBtU3RhY2tTbGlkZXIuc2V0WFByb2dyZXNzKHJ4KTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChtU3dpcGVHZXN0dXJlVHlwZSA9PSBHRVNUVVJFX1NMSURFX1VQKSB7CisgICAgICAgICAgICAgICAgICAgIGZsb2F0IHIgPSAtKGRlbHRhWSArIG1Ub3VjaFNsb3AgKiAxLjBmKSAvIG1TbGlkZUFtb3VudCAqIDEuMGY7CisgICAgICAgICAgICAgICAgICAgIGlmIChtU3RhY2tNb2RlID09IElURU1TX1NMSURFX0RPV04pIHIgPSAxIC0gcjsKKyAgICAgICAgICAgICAgICAgICAgbVN0YWNrU2xpZGVyLnNldFlQcm9ncmVzcyhyKTsKKyAgICAgICAgICAgICAgICAgICAgbVN0YWNrU2xpZGVyLnNldFhQcm9ncmVzcyhyeCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhc2UgTW90aW9uRXZlbnQuQUNUSU9OX1VQOiB7CisgICAgICAgICAgICAgICAgaGFuZGxlUG9pbnRlclVwKGV2KTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhc2UgTW90aW9uRXZlbnQuQUNUSU9OX1BPSU5URVJfVVA6IHsKKyAgICAgICAgICAgICAgICBvblNlY29uZGFyeVBvaW50ZXJVcChldik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXNlIE1vdGlvbkV2ZW50LkFDVElPTl9DQU5DRUw6IHsKKyAgICAgICAgICAgICAgICBtQWN0aXZlUG9pbnRlcklkID0gSU5WQUxJRF9QT0lOVEVSOworICAgICAgICAgICAgICAgIG1Td2lwZUdlc3R1cmVUeXBlID0gR0VTVFVSRV9OT05FOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIHByaXZhdGUgZmluYWwgUmVjdCB0b3VjaFJlY3QgPSBuZXcgUmVjdCgpOworICAgIHByaXZhdGUgdm9pZCBvblNlY29uZGFyeVBvaW50ZXJVcChNb3Rpb25FdmVudCBldikgeworICAgICAgICBmaW5hbCBpbnQgYWN0aXZlUG9pbnRlckluZGV4ID0gZXYuZ2V0QWN0aW9uSW5kZXgoKTsKKyAgICAgICAgZmluYWwgaW50IHBvaW50ZXJJZCA9IGV2LmdldFBvaW50ZXJJZChhY3RpdmVQb2ludGVySW5kZXgpOworICAgICAgICBpZiAocG9pbnRlcklkID09IG1BY3RpdmVQb2ludGVySWQpIHsKKworICAgICAgICAgICAgaW50IGFjdGl2ZVZpZXdJbmRleCA9IChtU3dpcGVHZXN0dXJlVHlwZSA9PSBHRVNUVVJFX1NMSURFX0RPV04pID8gbU51bUFjdGl2ZVZpZXdzIC0gMQorICAgICAgICAgICAgICAgICAgICA6IG1OdW1BY3RpdmVWaWV3cyAtIDI7CisKKyAgICAgICAgICAgIFZpZXcgdiA9IGdldFZpZXdBdFJlbGF0aXZlSW5kZXgoYWN0aXZlVmlld0luZGV4KTsKKyAgICAgICAgICAgIGlmICh2ID09IG51bGwpIHJldHVybjsKKworICAgICAgICAgICAgLy8gT3VyIHByaW1hcnkgcG9pbnRlciBoYXMgZ29uZSB1cCAtLSBsZXQncyBzZWUgaWYgd2UgY2FuIGZpbmQKKyAgICAgICAgICAgIC8vIGFub3RoZXIgcG9pbnRlciBvbiB0aGUgdmlldy4gSWYgc28sIHRoZW4gd2Ugc2hvdWxkIHJlcGxhY2UKKyAgICAgICAgICAgIC8vIG91ciBwcmltYXJ5IHBvaW50ZXIgd2l0aCB0aGlzIG5ldyBwb2ludGVyIGFuZCBhZGp1c3QgdGhpbmdzCisgICAgICAgICAgICAvLyBzbyB0aGF0IHRoZSB2aWV3IGRvZXNuJ3QganVtcAorICAgICAgICAgICAgZm9yIChpbnQgaW5kZXggPSAwOyBpbmRleCA8IGV2LmdldFBvaW50ZXJDb3VudCgpOyBpbmRleCsrKSB7CisgICAgICAgICAgICAgICAgaWYgKGluZGV4ICE9IGFjdGl2ZVBvaW50ZXJJbmRleCkgeworCisgICAgICAgICAgICAgICAgICAgIGZsb2F0IHggPSBldi5nZXRYKGluZGV4KTsKKyAgICAgICAgICAgICAgICAgICAgZmxvYXQgeSA9IGV2LmdldFkoaW5kZXgpOworCisgICAgICAgICAgICAgICAgICAgIHRvdWNoUmVjdC5zZXQodi5nZXRMZWZ0KCksIHYuZ2V0VG9wKCksIHYuZ2V0UmlnaHQoKSwgdi5nZXRCb3R0b20oKSk7CisgICAgICAgICAgICAgICAgICAgIGlmICh0b3VjaFJlY3QuY29udGFpbnMoTWF0aC5yb3VuZCh4KSwgTWF0aC5yb3VuZCh5KSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IG9sZFggPSBldi5nZXRYKGFjdGl2ZVBvaW50ZXJJbmRleCk7CisgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBvbGRZID0gZXYuZ2V0WShhY3RpdmVQb2ludGVySW5kZXgpOworCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBhZGp1c3Qgb3VyIGZyYW1lIG9mIHJlZmVyZW5jZSB0byBhdm9pZCBhIGp1bXAKKyAgICAgICAgICAgICAgICAgICAgICAgIG1Jbml0aWFsWSArPSAoeSAtIG9sZFkpOworICAgICAgICAgICAgICAgICAgICAgICAgbUluaXRpYWxYICs9ICh4IC0gb2xkWCk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIG1BY3RpdmVQb2ludGVySWQgPSBldi5nZXRQb2ludGVySWQoaW5kZXgpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1WZWxvY2l0eVRyYWNrZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1WZWxvY2l0eVRyYWNrZXIuY2xlYXIoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9rLCB3ZSdyZSBnb29kLCB3ZSBmb3VuZCBhIG5ldyBwb2ludGVyIHdoaWNoIGlzIHRvdWNoaW5nIHRoZSBhY3RpdmUgdmlldworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gaWYgd2UgbWFkZSBpdCB0aGlzIGZhciwgaXQgbWVhbnMgd2UgZGlkbid0IGZpbmQgYSBzYXRpc2ZhY3RvcnkgbmV3IHBvaW50ZXIgOigsCisgICAgICAgICAgICAvLyBzbyBlbmQgdGhlIGdlc3R1cmUKKyAgICAgICAgICAgIGhhbmRsZVBvaW50ZXJVcChldik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgaGFuZGxlUG9pbnRlclVwKE1vdGlvbkV2ZW50IGV2KSB7CisgICAgICAgIGludCBwb2ludGVySW5kZXggPSBldi5maW5kUG9pbnRlckluZGV4KG1BY3RpdmVQb2ludGVySWQpOworICAgICAgICBmbG9hdCBuZXdZID0gZXYuZ2V0WShwb2ludGVySW5kZXgpOworICAgICAgICBpbnQgZGVsdGFZID0gKGludCkgKG5ld1kgLSBtSW5pdGlhbFkpOworCisgICAgICAgIGlmIChtVmVsb2NpdHlUcmFja2VyICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1WZWxvY2l0eVRyYWNrZXIuY29tcHV0ZUN1cnJlbnRWZWxvY2l0eSgxMDAwLCBtTWF4aW11bVZlbG9jaXR5KTsKKyAgICAgICAgICAgIG1ZVmVsb2NpdHkgPSAoaW50KSBtVmVsb2NpdHlUcmFja2VyLmdldFlWZWxvY2l0eShtQWN0aXZlUG9pbnRlcklkKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChtVmVsb2NpdHlUcmFja2VyICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1WZWxvY2l0eVRyYWNrZXIucmVjeWNsZSgpOworICAgICAgICAgICAgbVZlbG9jaXR5VHJhY2tlciA9IG51bGw7CisgICAgICAgIH0KKworICAgICAgICBpZiAoZGVsdGFZID4gbVN3aXBlVGhyZXNob2xkICYmIG1Td2lwZUdlc3R1cmVUeXBlID09IEdFU1RVUkVfU0xJREVfRE9XTgorICAgICAgICAgICAgICAgICYmIG1TdGFja1NsaWRlci5tTW9kZSA9PSBTdGFja1NsaWRlci5OT1JNQUxfTU9ERSkgeworICAgICAgICAgICAgLy8gU3dpcGUgdGhyZXNob2xkIGV4Y2VlZGVkLCBzd2lwZSBkb3duCisgICAgICAgICAgICBpZiAobVN0YWNrTW9kZSA9PSBJVEVNU19TTElERV9VUCkgeworICAgICAgICAgICAgICAgIHNob3dOZXh0KCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHNob3dQcmV2aW91cygpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbUhpZ2hsaWdodC5icmluZ1RvRnJvbnQoKTsKKyAgICAgICAgfSBlbHNlIGlmIChkZWx0YVkgPCAtbVN3aXBlVGhyZXNob2xkICYmIG1Td2lwZUdlc3R1cmVUeXBlID09IEdFU1RVUkVfU0xJREVfVVAKKyAgICAgICAgICAgICAgICAmJiBtU3RhY2tTbGlkZXIubU1vZGUgPT0gU3RhY2tTbGlkZXIuTk9STUFMX01PREUpIHsKKyAgICAgICAgICAgIC8vIFN3aXBlIHRocmVzaG9sZCBleGNlZWRlZCwgc3dpcGUgdXAKKyAgICAgICAgICAgIGlmIChtU3RhY2tNb2RlID09IElURU1TX1NMSURFX1VQKSB7CisgICAgICAgICAgICAgICAgc2hvd1ByZXZpb3VzKCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHNob3dOZXh0KCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG1IaWdobGlnaHQuYnJpbmdUb0Zyb250KCk7CisgICAgICAgIH0gZWxzZSBpZiAobVN3aXBlR2VzdHVyZVR5cGUgPT0gR0VTVFVSRV9TTElERV9VUCApIHsKKyAgICAgICAgICAgIC8vIERpZG4ndCBzd2lwZSB1cCBmYXIgZW5vdWdoLCBzbmFwIGJhY2sgZG93bgorICAgICAgICAgICAgaW50IGR1cmF0aW9uOworICAgICAgICAgICAgZmxvYXQgZmluYWxZUHJvZ3Jlc3MgPSAobVN0YWNrTW9kZSA9PSBJVEVNU19TTElERV9ET1dOKSA/IDEgOiAwOworICAgICAgICAgICAgaWYgKG1TdGFja01vZGUgPT0gSVRFTVNfU0xJREVfVVAgfHwgbVN0YWNrU2xpZGVyLm1Nb2RlICE9IFN0YWNrU2xpZGVyLk5PUk1BTF9NT0RFKSB7CisgICAgICAgICAgICAgICAgZHVyYXRpb24gPSBNYXRoLnJvdW5kKG1TdGFja1NsaWRlci5nZXREdXJhdGlvbkZvck5ldXRyYWxQb3NpdGlvbigpKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgZHVyYXRpb24gPSBNYXRoLnJvdW5kKG1TdGFja1NsaWRlci5nZXREdXJhdGlvbkZvck9mZnNjcmVlblBvc2l0aW9uKCkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBTdGFja1NsaWRlciBhbmltYXRpb25TbGlkZXIgPSBuZXcgU3RhY2tTbGlkZXIobVN0YWNrU2xpZGVyKTsKKyAgICAgICAgICAgIFByb3BlcnR5VmFsdWVzSG9sZGVyPEZsb2F0PiBzbmFwQmFja1kgPQorICAgICAgICAgICAgICAgICAgICBuZXcgUHJvcGVydHlWYWx1ZXNIb2xkZXI8RmxvYXQ+KCJZUHJvZ3Jlc3MiLCBmaW5hbFlQcm9ncmVzcyk7CisgICAgICAgICAgICBQcm9wZXJ0eVZhbHVlc0hvbGRlcjxGbG9hdD4gc25hcEJhY2tYID0KKyAgICAgICAgICAgICAgICAgICAgbmV3IFByb3BlcnR5VmFsdWVzSG9sZGVyPEZsb2F0PigiWFByb2dyZXNzIiwgMC4wZik7CisgICAgICAgICAgICBPYmplY3RBbmltYXRvciBwYSA9IG5ldyBPYmplY3RBbmltYXRvcihkdXJhdGlvbiwgYW5pbWF0aW9uU2xpZGVyLAorICAgICAgICAgICAgICAgICAgICBzbmFwQmFja1gsIHNuYXBCYWNrWSk7CisgICAgICAgICAgICBwYS5zZXRJbnRlcnBvbGF0b3IobmV3IExpbmVhckludGVycG9sYXRvcigpKTsKKyAgICAgICAgICAgIHBhLnN0YXJ0KCk7CisgICAgICAgIH0gZWxzZSBpZiAobVN3aXBlR2VzdHVyZVR5cGUgPT0gR0VTVFVSRV9TTElERV9ET1dOKSB7CisgICAgICAgICAgICAvLyBEaWRuJ3Qgc3dpcGUgZG93biBmYXIgZW5vdWdoLCBzbmFwIGJhY2sgdXAKKyAgICAgICAgICAgIGZsb2F0IGZpbmFsWVByb2dyZXNzID0gKG1TdGFja01vZGUgPT0gSVRFTVNfU0xJREVfRE9XTikgPyAwIDogMTsKKyAgICAgICAgICAgIGludCBkdXJhdGlvbjsKKyAgICAgICAgICAgIGlmIChtU3RhY2tNb2RlID09IElURU1TX1NMSURFX0RPV04gfHwgbVN0YWNrU2xpZGVyLm1Nb2RlICE9IFN0YWNrU2xpZGVyLk5PUk1BTF9NT0RFKSB7CisgICAgICAgICAgICAgICAgZHVyYXRpb24gPSBNYXRoLnJvdW5kKG1TdGFja1NsaWRlci5nZXREdXJhdGlvbkZvck5ldXRyYWxQb3NpdGlvbigpKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgZHVyYXRpb24gPSBNYXRoLnJvdW5kKG1TdGFja1NsaWRlci5nZXREdXJhdGlvbkZvck9mZnNjcmVlblBvc2l0aW9uKCkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBTdGFja1NsaWRlciBhbmltYXRpb25TbGlkZXIgPSBuZXcgU3RhY2tTbGlkZXIobVN0YWNrU2xpZGVyKTsKKyAgICAgICAgICAgIFByb3BlcnR5VmFsdWVzSG9sZGVyPEZsb2F0PiBzbmFwQmFja1kgPQorICAgICAgICAgICAgICAgICAgICBuZXcgUHJvcGVydHlWYWx1ZXNIb2xkZXI8RmxvYXQ+KCJZUHJvZ3Jlc3MiLCBmaW5hbFlQcm9ncmVzcyk7CisgICAgICAgICAgICBQcm9wZXJ0eVZhbHVlc0hvbGRlcjxGbG9hdD4gc25hcEJhY2tYID0KKyAgICAgICAgICAgICAgICAgICAgbmV3IFByb3BlcnR5VmFsdWVzSG9sZGVyPEZsb2F0PigiWFByb2dyZXNzIiwgMC4wZik7CisgICAgICAgICAgICBPYmplY3RBbmltYXRvciBwYSA9IG5ldyBPYmplY3RBbmltYXRvcihkdXJhdGlvbiwgYW5pbWF0aW9uU2xpZGVyLAorICAgICAgICAgICAgICAgICAgICBzbmFwQmFja1gsIHNuYXBCYWNrWSk7CisgICAgICAgICAgICBwYS5zdGFydCgpOworICAgICAgICB9CisKKyAgICAgICAgbUFjdGl2ZVBvaW50ZXJJZCA9IElOVkFMSURfUE9JTlRFUjsKKyAgICAgICAgbVN3aXBlR2VzdHVyZVR5cGUgPSBHRVNUVVJFX05PTkU7CisgICAgfQorCisgICAgcHJpdmF0ZSBjbGFzcyBTdGFja1NsaWRlciB7CisgICAgICAgIFZpZXcgbVZpZXc7CisgICAgICAgIGZsb2F0IG1ZUHJvZ3Jlc3M7CisgICAgICAgIGZsb2F0IG1YUHJvZ3Jlc3M7CisKKyAgICAgICAgc3RhdGljIGZpbmFsIGludCBOT1JNQUxfTU9ERSA9IDA7CisgICAgICAgIHN0YXRpYyBmaW5hbCBpbnQgQkVHSU5OSU5HX09GX1NUQUNLX01PREUgPSAxOworICAgICAgICBzdGF0aWMgZmluYWwgaW50IEVORF9PRl9TVEFDS19NT0RFID0gMjsKKworICAgICAgICBpbnQgbU1vZGUgPSBOT1JNQUxfTU9ERTsKKworICAgICAgICBwdWJsaWMgU3RhY2tTbGlkZXIoKSB7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgU3RhY2tTbGlkZXIoU3RhY2tTbGlkZXIgY29weSkgeworICAgICAgICAgICAgbVZpZXcgPSBjb3B5Lm1WaWV3OworICAgICAgICAgICAgbVlQcm9ncmVzcyA9IGNvcHkubVlQcm9ncmVzczsKKyAgICAgICAgICAgIG1YUHJvZ3Jlc3MgPSBjb3B5Lm1YUHJvZ3Jlc3M7CisgICAgICAgICAgICBtTW9kZSA9IGNvcHkubU1vZGU7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIGZsb2F0IGN1YmljKGZsb2F0IHIpIHsKKyAgICAgICAgICAgIHJldHVybiAoZmxvYXQpIChNYXRoLnBvdygyICogciAtIDEsIDMpICsgMSkgLyAyLjBmOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBmbG9hdCBoaWdobGlnaHRBbHBoYUludGVycG9sYXRvcihmbG9hdCByKSB7CisgICAgICAgICAgICBmbG9hdCBwaXZvdCA9IDAuNGY7CisgICAgICAgICAgICBpZiAociA8IHBpdm90KSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIDAuODVmICogY3ViaWMociAvIHBpdm90KTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIDAuODVmICogY3ViaWMoMSAtIChyIC0gcGl2b3QpIC8gKDEgLSBwaXZvdCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBmbG9hdCB2aWV3QWxwaGFJbnRlcnBvbGF0b3IoZmxvYXQgcikgeworICAgICAgICAgICAgZmxvYXQgcGl2b3QgPSAwLjNmOworICAgICAgICAgICAgaWYgKHIgPiBwaXZvdCkgeworICAgICAgICAgICAgICAgIHJldHVybiAociAtIHBpdm90KSAvICgxIC0gcGl2b3QpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgZmxvYXQgcm90YXRpb25JbnRlcnBvbGF0b3IoZmxvYXQgcikgeworICAgICAgICAgICAgZmxvYXQgcGl2b3QgPSAwLjJmOworICAgICAgICAgICAgaWYgKHIgPCBwaXZvdCkgeworICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gKHIgLSBwaXZvdCkgLyAoMSAtIHBpdm90KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHZvaWQgc2V0VmlldyhWaWV3IHYpIHsKKyAgICAgICAgICAgIG1WaWV3ID0gdjsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHNldFlQcm9ncmVzcyhmbG9hdCByKSB7CisgICAgICAgICAgICAvLyBlbmZvcmNlIHIgYmV0d2VlbiAwIGFuZCAxCisgICAgICAgICAgICByID0gTWF0aC5taW4oMS4wZiwgcik7CisgICAgICAgICAgICByID0gTWF0aC5tYXgoMCwgcik7CisKKyAgICAgICAgICAgIG1ZUHJvZ3Jlc3MgPSByOworICAgICAgICAgICAgZmluYWwgTGF5b3V0UGFyYW1zIHZpZXdMcCA9IChMYXlvdXRQYXJhbXMpIG1WaWV3LmdldExheW91dFBhcmFtcygpOworICAgICAgICAgICAgZmluYWwgTGF5b3V0UGFyYW1zIGhpZ2hsaWdodExwID0gKExheW91dFBhcmFtcykgbUhpZ2hsaWdodC5nZXRMYXlvdXRQYXJhbXMoKTsKKworICAgICAgICAgICAgaW50IHN0YWNrRGlyZWN0aW9uID0gKG1TdGFja01vZGUgPT0gSVRFTVNfU0xJREVfVVApID8gMSA6IC0xOworCisgICAgICAgICAgICBzd2l0Y2ggKG1Nb2RlKSB7CisgICAgICAgICAgICAgICAgY2FzZSBOT1JNQUxfTU9ERToKKyAgICAgICAgICAgICAgICAgICAgdmlld0xwLnNldFZlcnRpY2FsT2Zmc2V0KE1hdGgucm91bmQoLXIgKiBzdGFja0RpcmVjdGlvbiAqIG1TbGlkZUFtb3VudCkpOworICAgICAgICAgICAgICAgICAgICBoaWdobGlnaHRMcC5zZXRWZXJ0aWNhbE9mZnNldChNYXRoLnJvdW5kKC1yICogc3RhY2tEaXJlY3Rpb24gKiBtU2xpZGVBbW91bnQpKTsKKyAgICAgICAgICAgICAgICAgICAgbUhpZ2hsaWdodC5zZXRBbHBoYShoaWdobGlnaHRBbHBoYUludGVycG9sYXRvcihyKSk7CisKKyAgICAgICAgICAgICAgICAgICAgZmxvYXQgYWxwaGEgPSB2aWV3QWxwaGFJbnRlcnBvbGF0b3IoMSAtIHIpOworCisgICAgICAgICAgICAgICAgICAgIC8vIFdlIG1ha2Ugc3VyZSB0aGF0IHZpZXdzIHdoaWNoIGNhbid0IGJlIHNlZW4gKGhhdmUgMCBhbHBoYSkgYXJlIGFsc28gaW52aXNpYmxlCisgICAgICAgICAgICAgICAgICAgIC8vIHNvIHRoYXQgdGhleSBkb24ndCBpbnRlcmZlcmUgd2l0aCBjbGljayBldmVudHMuCisgICAgICAgICAgICAgICAgICAgIGlmIChtVmlldy5nZXRBbHBoYSgpID09IDAgJiYgYWxwaGEgIT0gMCAmJiBtVmlldy5nZXRWaXNpYmlsaXR5KCkgIT0gVklTSUJMRSkgeworICAgICAgICAgICAgICAgICAgICAgICAgbVZpZXcuc2V0VmlzaWJpbGl0eShWSVNJQkxFKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChhbHBoYSA9PSAwICYmIG1WaWV3LmdldEFscGhhKCkgIT0gMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIG1WaWV3LmdldFZpc2liaWxpdHkoKSA9PSBWSVNJQkxFKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtVmlldy5zZXRWaXNpYmlsaXR5KElOVklTSUJMRSk7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBtVmlldy5zZXRBbHBoYShhbHBoYSk7CisgICAgICAgICAgICAgICAgICAgIG1WaWV3LnNldFJvdGF0aW9uWChzdGFja0RpcmVjdGlvbiAqIDkwLjBmICogcm90YXRpb25JbnRlcnBvbGF0b3IocikpOworICAgICAgICAgICAgICAgICAgICBtSGlnaGxpZ2h0LnNldFJvdGF0aW9uWChzdGFja0RpcmVjdGlvbiAqIDkwLjBmICogcm90YXRpb25JbnRlcnBvbGF0b3IocikpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEJFR0lOTklOR19PRl9TVEFDS19NT0RFOgorICAgICAgICAgICAgICAgICAgICByID0gciAqIDAuMmY7CisgICAgICAgICAgICAgICAgICAgIHZpZXdMcC5zZXRWZXJ0aWNhbE9mZnNldChNYXRoLnJvdW5kKC1zdGFja0RpcmVjdGlvbiAqIHIgKiBtU2xpZGVBbW91bnQpKTsKKyAgICAgICAgICAgICAgICAgICAgaGlnaGxpZ2h0THAuc2V0VmVydGljYWxPZmZzZXQoTWF0aC5yb3VuZCgtc3RhY2tEaXJlY3Rpb24gKiByICogbVNsaWRlQW1vdW50KSk7CisgICAgICAgICAgICAgICAgICAgIG1IaWdobGlnaHQuc2V0QWxwaGEoaGlnaGxpZ2h0QWxwaGFJbnRlcnBvbGF0b3IocikpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEVORF9PRl9TVEFDS19NT0RFOgorICAgICAgICAgICAgICAgICAgICByID0gKDEtcikgKiAwLjJmOworICAgICAgICAgICAgICAgICAgICB2aWV3THAuc2V0VmVydGljYWxPZmZzZXQoTWF0aC5yb3VuZChzdGFja0RpcmVjdGlvbiAqIHIgKiBtU2xpZGVBbW91bnQpKTsKKyAgICAgICAgICAgICAgICAgICAgaGlnaGxpZ2h0THAuc2V0VmVydGljYWxPZmZzZXQoTWF0aC5yb3VuZChzdGFja0RpcmVjdGlvbiAqIHIgKiBtU2xpZGVBbW91bnQpKTsKKyAgICAgICAgICAgICAgICAgICAgbUhpZ2hsaWdodC5zZXRBbHBoYShoaWdobGlnaHRBbHBoYUludGVycG9sYXRvcihyKSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgc2V0WFByb2dyZXNzKGZsb2F0IHIpIHsKKyAgICAgICAgICAgIC8vIGVuZm9yY2UgciBiZXR3ZWVuIDAgYW5kIDEKKyAgICAgICAgICAgIHIgPSBNYXRoLm1pbigyLjBmLCByKTsKKyAgICAgICAgICAgIHIgPSBNYXRoLm1heCgtMi4wZiwgcik7CisKKyAgICAgICAgICAgIG1YUHJvZ3Jlc3MgPSByOworCisgICAgICAgICAgICBmaW5hbCBMYXlvdXRQYXJhbXMgdmlld0xwID0gKExheW91dFBhcmFtcykgbVZpZXcuZ2V0TGF5b3V0UGFyYW1zKCk7CisgICAgICAgICAgICBmaW5hbCBMYXlvdXRQYXJhbXMgaGlnaGxpZ2h0THAgPSAoTGF5b3V0UGFyYW1zKSBtSGlnaGxpZ2h0LmdldExheW91dFBhcmFtcygpOworCisgICAgICAgICAgICByICo9IDAuMmY7CisgICAgICAgICAgICB2aWV3THAuc2V0SG9yaXpvbnRhbE9mZnNldChNYXRoLnJvdW5kKHIgKiBtU2xpZGVBbW91bnQpKTsKKyAgICAgICAgICAgIGhpZ2hsaWdodExwLnNldEhvcml6b250YWxPZmZzZXQoTWF0aC5yb3VuZChyICogbVNsaWRlQW1vdW50KSk7CisgICAgICAgIH0KKworICAgICAgICB2b2lkIHNldE1vZGUoaW50IG1vZGUpIHsKKyAgICAgICAgICAgIG1Nb2RlID0gbW9kZTsKKyAgICAgICAgfQorCisgICAgICAgIGZsb2F0IGdldER1cmF0aW9uRm9yTmV1dHJhbFBvc2l0aW9uKCkgeworICAgICAgICAgICAgcmV0dXJuIGdldER1cmF0aW9uKGZhbHNlLCAwKTsKKyAgICAgICAgfQorCisgICAgICAgIGZsb2F0IGdldER1cmF0aW9uRm9yT2Zmc2NyZWVuUG9zaXRpb24oKSB7CisgICAgICAgICAgICByZXR1cm4gZ2V0RHVyYXRpb24odHJ1ZSwgMCk7CisgICAgICAgIH0KKworICAgICAgICBmbG9hdCBnZXREdXJhdGlvbkZvck5ldXRyYWxQb3NpdGlvbihmbG9hdCB2ZWxvY2l0eSkgeworICAgICAgICAgICAgcmV0dXJuIGdldER1cmF0aW9uKGZhbHNlLCB2ZWxvY2l0eSk7CisgICAgICAgIH0KKworICAgICAgICBmbG9hdCBnZXREdXJhdGlvbkZvck9mZnNjcmVlblBvc2l0aW9uKGZsb2F0IHZlbG9jaXR5KSB7CisgICAgICAgICAgICByZXR1cm4gZ2V0RHVyYXRpb24odHJ1ZSwgdmVsb2NpdHkpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBmbG9hdCBnZXREdXJhdGlvbihib29sZWFuIGludmVydCwgZmxvYXQgdmVsb2NpdHkpIHsKKyAgICAgICAgICAgIGlmIChtVmlldyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgZmluYWwgTGF5b3V0UGFyYW1zIHZpZXdMcCA9IChMYXlvdXRQYXJhbXMpIG1WaWV3LmdldExheW91dFBhcmFtcygpOworCisgICAgICAgICAgICAgICAgZmxvYXQgZCA9IChmbG9hdCkgTWF0aC5zcXJ0KE1hdGgucG93KHZpZXdMcC5ob3Jpem9udGFsT2Zmc2V0LCAyKSArCisgICAgICAgICAgICAgICAgICAgICAgICBNYXRoLnBvdyh2aWV3THAudmVydGljYWxPZmZzZXQsIDIpKTsKKyAgICAgICAgICAgICAgICBmbG9hdCBtYXhkID0gKGZsb2F0KSBNYXRoLnNxcnQoTWF0aC5wb3cobVNsaWRlQW1vdW50LCAyKSArCisgICAgICAgICAgICAgICAgICAgICAgICBNYXRoLnBvdygwLjRmICogbVNsaWRlQW1vdW50LCAyKSk7CisKKyAgICAgICAgICAgICAgICBpZiAodmVsb2NpdHkgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gKGludmVydCA/ICgxIC0gZCAvIG1heGQpIDogZCAvIG1heGQpICogREVGQVVMVF9BTklNQVRJT05fRFVSQVRJT047CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgZmxvYXQgZHVyYXRpb24gPSBpbnZlcnQgPyBkIC8gTWF0aC5hYnModmVsb2NpdHkpIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAobWF4ZCAtIGQpIC8gTWF0aC5hYnModmVsb2NpdHkpOworICAgICAgICAgICAgICAgICAgICBpZiAoZHVyYXRpb24gPCBNSU5JTVVNX0FOSU1BVElPTl9EVVJBVElPTiB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR1cmF0aW9uID4gREVGQVVMVF9BTklNQVRJT05fRFVSQVRJT04pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBnZXREdXJhdGlvbihpbnZlcnQsIDApOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGR1cmF0aW9uOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgZmxvYXQgZ2V0WVByb2dyZXNzKCkgeworICAgICAgICAgICAgcmV0dXJuIG1ZUHJvZ3Jlc3M7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgZmxvYXQgZ2V0WFByb2dyZXNzKCkgeworICAgICAgICAgICAgcmV0dXJuIG1YUHJvZ3Jlc3M7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvblJlbW90ZUFkYXB0ZXJDb25uZWN0ZWQoKSB7CisgICAgICAgIHN1cGVyLm9uUmVtb3RlQWRhcHRlckNvbm5lY3RlZCgpOworICAgICAgICAvLyBPbiBmaXJzdCBydW4sIHdlIHdhbnQgdG8gc2V0IHRoZSBzdGFjayB0byB0aGUgZW5kLgorICAgICAgICBpZiAobUFkYXB0ZXIgIT0gbnVsbCAmJiBtV2hpY2hDaGlsZCA9PSAtMSkgeworICAgICAgICAgICAgbVdoaWNoQ2hpbGQgPSBtQWRhcHRlci5nZXRDb3VudCgpIC0gMTsKKyAgICAgICAgfQorICAgICAgICBzZXREaXNwbGF5ZWRDaGlsZChtV2hpY2hDaGlsZCk7CisgICAgfQorCisgICAgTGF5b3V0UGFyYW1zIGNyZWF0ZU9yUmV1c2VMYXlvdXRQYXJhbXMoVmlldyB2KSB7CisgICAgICAgIGZpbmFsIFZpZXdHcm91cC5MYXlvdXRQYXJhbXMgY3VycmVudExwID0gdi5nZXRMYXlvdXRQYXJhbXMoKTsKKyAgICAgICAgaWYgKGN1cnJlbnRMcCBpbnN0YW5jZW9mIExheW91dFBhcmFtcykgeworICAgICAgICAgICAgTGF5b3V0UGFyYW1zIGxwID0gKExheW91dFBhcmFtcykgY3VycmVudExwOworICAgICAgICAgICAgbHAuc2V0SG9yaXpvbnRhbE9mZnNldCgwKTsKKyAgICAgICAgICAgIGxwLnNldFZlcnRpY2FsT2Zmc2V0KDApOworICAgICAgICAgICAgbHAud2lkdGggPSAwOworICAgICAgICAgICAgbHAud2lkdGggPSAwOworICAgICAgICAgICAgcmV0dXJuIGxwOworICAgICAgICB9CisgICAgICAgIHJldHVybiBuZXcgTGF5b3V0UGFyYW1zKHYpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG9uTGF5b3V0KGJvb2xlYW4gY2hhbmdlZCwgaW50IGxlZnQsIGludCB0b3AsIGludCByaWdodCwgaW50IGJvdHRvbSkgeworICAgICAgICBib29sZWFuIGRhdGFDaGFuZ2VkID0gbURhdGFDaGFuZ2VkOworICAgICAgICBpZiAoZGF0YUNoYW5nZWQpIHsKKyAgICAgICAgICAgIGhhbmRsZURhdGFDaGFuZ2VkKCk7CisKKyAgICAgICAgICAgIC8vIGlmIHRoZSBkYXRhIGNoYW5nZXMsIG1XaGljaENoaWxkIG1pZ2h0IGJlIG91dCBvZiB0aGUgYm91bmRzIG9mIHRoZSBhZGFwdGVyCisgICAgICAgICAgICAvLyBpbiB0aGlzIGNhc2UsIHdlIHJlc2V0IG1XaGljaENoaWxkIHRvIHRoZSBiZWdpbm5pbmcKKyAgICAgICAgICAgIGlmIChtV2hpY2hDaGlsZCA+PSBtQWRhcHRlci5nZXRDb3VudCgpKQorICAgICAgICAgICAgICAgIG1XaGljaENoaWxkID0gMDsKKworICAgICAgICAgICAgc2hvd09ubHkobVdoaWNoQ2hpbGQsIHRydWUsIHRydWUpOworICAgICAgICB9CisKKyAgICAgICAgZmluYWwgaW50IGNoaWxkQ291bnQgPSBnZXRDaGlsZENvdW50KCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRDb3VudDsgaSsrKSB7CisgICAgICAgICAgICBmaW5hbCBWaWV3IGNoaWxkID0gZ2V0Q2hpbGRBdChpKTsKKworICAgICAgICAgICAgaW50IGNoaWxkUmlnaHQgPSBtUGFkZGluZ0xlZnQgKyBjaGlsZC5nZXRNZWFzdXJlZFdpZHRoKCk7CisgICAgICAgICAgICBpbnQgY2hpbGRCb3R0b20gPSBtUGFkZGluZ1RvcCArIGNoaWxkLmdldE1lYXN1cmVkSGVpZ2h0KCk7CisgICAgICAgICAgICBMYXlvdXRQYXJhbXMgbHAgPSAoTGF5b3V0UGFyYW1zKSBjaGlsZC5nZXRMYXlvdXRQYXJhbXMoKTsKKworICAgICAgICAgICAgY2hpbGQubGF5b3V0KG1QYWRkaW5nTGVmdCArIGxwLmhvcml6b250YWxPZmZzZXQsIG1QYWRkaW5nVG9wICsgbHAudmVydGljYWxPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgIGNoaWxkUmlnaHQgKyBscC5ob3Jpem9udGFsT2Zmc2V0LCBjaGlsZEJvdHRvbSArIGxwLnZlcnRpY2FsT2Zmc2V0KTsKKworICAgICAgICB9CisKKyAgICAgICAgbURhdGFDaGFuZ2VkID0gZmFsc2U7CisgICAgICAgIG9uTGF5b3V0KCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIG1lYXN1cmVDaGlsZHJlbigpIHsKKyAgICAgICAgZmluYWwgaW50IGNvdW50ID0gZ2V0Q2hpbGRDb3VudCgpOworICAgICAgICBmaW5hbCBpbnQgY2hpbGRXaWR0aCA9IG1NZWFzdXJlZFdpZHRoIC0gbVBhZGRpbmdMZWZ0IC0gbVBhZGRpbmdSaWdodDsKKyAgICAgICAgZmluYWwgaW50IGNoaWxkSGVpZ2h0ID0gTWF0aC5yb3VuZChtTWVhc3VyZWRIZWlnaHQqKDEtUEVSU1BFQ1RJVkVfU0hJRlRfRkFDVE9SKSkKKyAgICAgICAgICAgICAgICAtIG1QYWRkaW5nVG9wIC0gbVBhZGRpbmdCb3R0b207CisKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisgICAgICAgICAgICBmaW5hbCBWaWV3IGNoaWxkID0gZ2V0Q2hpbGRBdChpKTsKKyAgICAgICAgICAgIGNoaWxkLm1lYXN1cmUoTWVhc3VyZVNwZWMubWFrZU1lYXN1cmVTcGVjKGNoaWxkV2lkdGgsIE1lYXN1cmVTcGVjLkVYQUNUTFkpLAorICAgICAgICAgICAgICAgICAgICBNZWFzdXJlU3BlYy5tYWtlTWVhc3VyZVNwZWMoY2hpbGRIZWlnaHQsIE1lYXN1cmVTcGVjLkVYQUNUTFkpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG9uTWVhc3VyZShpbnQgd2lkdGhNZWFzdXJlU3BlYywgaW50IGhlaWdodE1lYXN1cmVTcGVjKSB7CisgICAgICAgIGludCB3aWR0aFNwZWNTaXplID0gTWVhc3VyZVNwZWMuZ2V0U2l6ZSh3aWR0aE1lYXN1cmVTcGVjKTsKKyAgICAgICAgaW50IGhlaWdodFNwZWNTaXplID0gTWVhc3VyZVNwZWMuZ2V0U2l6ZShoZWlnaHRNZWFzdXJlU3BlYyk7CisgICAgICAgIGZpbmFsIGludCB3aWR0aFNwZWNNb2RlID0gTWVhc3VyZVNwZWMuZ2V0TW9kZSh3aWR0aE1lYXN1cmVTcGVjKTsKKyAgICAgICAgZmluYWwgaW50IGhlaWdodFNwZWNNb2RlID0gTWVhc3VyZVNwZWMuZ2V0TW9kZShoZWlnaHRNZWFzdXJlU3BlYyk7CisKKyAgICAgICAgYm9vbGVhbiBoYXZlQ2hpbGRSZWZTaXplID0gKG1SZWZlcmVuY2VDaGlsZFdpZHRoICE9IC0xICYmIG1SZWZlcmVuY2VDaGlsZEhlaWdodCAhPSAtMSk7CisKKyAgICAgICAgLy8gV2UgbmVlZCB0byBkZWFsIHdpdGggdGhlIGNhc2Ugd2hlcmUgb3VyIHBhcmVudCBoYXNuJ3QgdG9sZCB1cyBob3cKKyAgICAgICAgLy8gYmlnIHdlIHNob3VsZCBiZS4gSW4gdGhpcyBjYXNlIHdlIHNob3VsZAorICAgICAgICBmbG9hdCBmYWN0b3IgPSAxLygxIC0gUEVSU1BFQ1RJVkVfU0hJRlRfRkFDVE9SKTsKKyAgICAgICAgaWYgKGhlaWdodFNwZWNNb2RlID09IE1lYXN1cmVTcGVjLlVOU1BFQ0lGSUVEKSB7CisgICAgICAgICAgICBoZWlnaHRTcGVjU2l6ZSA9IGhhdmVDaGlsZFJlZlNpemUgPworICAgICAgICAgICAgICAgICAgICBNYXRoLnJvdW5kKG1SZWZlcmVuY2VDaGlsZEhlaWdodCAqICgxICsgZmFjdG9yKSkgKworICAgICAgICAgICAgICAgICAgICBtUGFkZGluZ1RvcCArIG1QYWRkaW5nQm90dG9tIDogMDsKKyAgICAgICAgfSBlbHNlIGlmIChoZWlnaHRTcGVjTW9kZSA9PSBNZWFzdXJlU3BlYy5BVF9NT1NUKSB7CisgICAgICAgICAgICBoZWlnaHRTcGVjU2l6ZSA9IGhhdmVDaGlsZFJlZlNpemUgPyBNYXRoLm1pbigKKyAgICAgICAgICAgICAgICAgICAgTWF0aC5yb3VuZChtUmVmZXJlbmNlQ2hpbGRIZWlnaHQgKiAoMSArIGZhY3RvcikpICsgbVBhZGRpbmdUb3AgKworICAgICAgICAgICAgICAgICAgICBtUGFkZGluZ0JvdHRvbSwgaGVpZ2h0U3BlY1NpemUpIDogMDsKKyAgICAgICAgfQorCisgICAgICAgIGlmICh3aWR0aFNwZWNNb2RlID09IE1lYXN1cmVTcGVjLlVOU1BFQ0lGSUVEKSB7CisgICAgICAgICAgICB3aWR0aFNwZWNTaXplID0gaGF2ZUNoaWxkUmVmU2l6ZSA/IG1SZWZlcmVuY2VDaGlsZFdpZHRoICsgbVBhZGRpbmdMZWZ0ICsKKyAgICAgICAgICAgICAgICAgICAgbVBhZGRpbmdSaWdodCA6IDA7CisgICAgICAgIH0gZWxzZSBpZiAoaGVpZ2h0U3BlY01vZGUgPT0gTWVhc3VyZVNwZWMuQVRfTU9TVCkgeworICAgICAgICAgICAgd2lkdGhTcGVjU2l6ZSA9IGhhdmVDaGlsZFJlZlNpemUgPyBNYXRoLm1pbihtUmVmZXJlbmNlQ2hpbGRXaWR0aCArIG1QYWRkaW5nTGVmdCArCisgICAgICAgICAgICAgICAgICAgIG1QYWRkaW5nUmlnaHQsIHdpZHRoU3BlY1NpemUpIDogMDsKKyAgICAgICAgfQorCisgICAgICAgIHNldE1lYXN1cmVkRGltZW5zaW9uKHdpZHRoU3BlY1NpemUsIGhlaWdodFNwZWNTaXplKTsKKyAgICAgICAgbWVhc3VyZUNoaWxkcmVuKCk7CisgICAgfQorCisgICAgY2xhc3MgTGF5b3V0UGFyYW1zIGV4dGVuZHMgVmlld0dyb3VwLkxheW91dFBhcmFtcyB7CisgICAgICAgIGludCBob3Jpem9udGFsT2Zmc2V0OworICAgICAgICBpbnQgdmVydGljYWxPZmZzZXQ7CisgICAgICAgIFZpZXcgbVZpZXc7CisKKyAgICAgICAgTGF5b3V0UGFyYW1zKFZpZXcgdmlldykgeworICAgICAgICAgICAgc3VwZXIoMCwgMCk7CisgICAgICAgICAgICB3aWR0aCA9IDA7CisgICAgICAgICAgICBoZWlnaHQgPSAwOworICAgICAgICAgICAgaG9yaXpvbnRhbE9mZnNldCA9IDA7CisgICAgICAgICAgICB2ZXJ0aWNhbE9mZnNldCA9IDA7CisgICAgICAgICAgICBtVmlldyA9IHZpZXc7CisgICAgICAgIH0KKworICAgICAgICBMYXlvdXRQYXJhbXMoQ29udGV4dCBjLCBBdHRyaWJ1dGVTZXQgYXR0cnMpIHsKKyAgICAgICAgICAgIHN1cGVyKGMsIGF0dHJzKTsKKyAgICAgICAgICAgIGhvcml6b250YWxPZmZzZXQgPSAwOworICAgICAgICAgICAgdmVydGljYWxPZmZzZXQgPSAwOworICAgICAgICAgICAgd2lkdGggPSAwOworICAgICAgICAgICAgaGVpZ2h0ID0gMDsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgUmVjdCBwYXJlbnRSZWN0ID0gbmV3IFJlY3QoKTsKKyAgICAgICAgdm9pZCBpbnZhbGlkYXRlR2xvYmFsUmVnaW9uKFZpZXcgdiwgUmVjdCByKSB7CisgICAgICAgICAgICBWaWV3IHAgPSB2OworICAgICAgICAgICAgaWYgKCEodi5nZXRQYXJlbnQoKSAhPSBudWxsICYmIHYuZ2V0UGFyZW50KCkgaW5zdGFuY2VvZiBWaWV3KSkgcmV0dXJuOworCisgICAgICAgICAgICBWaWV3IGdwID0gKFZpZXcpIHYuZ2V0UGFyZW50KCk7CisgICAgICAgICAgICBib29sZWFuIGZpcnN0UGFzcyA9IHRydWU7CisgICAgICAgICAgICBwYXJlbnRSZWN0LnNldCgwLCAwLCAwLCAwKTsKKyAgICAgICAgICAgIGludCBkZXB0aCA9IDA7CisgICAgICAgICAgICB3aGlsZSAoZ3AuZ2V0UGFyZW50KCkgIT0gbnVsbCAmJiBncC5nZXRQYXJlbnQoKSBpbnN0YW5jZW9mIFZpZXcKKyAgICAgICAgICAgICAgICAgICAgJiYgIXBhcmVudFJlY3QuY29udGFpbnMocikpIHsKKyAgICAgICAgICAgICAgICBpZiAoIWZpcnN0UGFzcykgeworICAgICAgICAgICAgICAgICAgICByLm9mZnNldChwLmdldExlZnQoKSAtIGdwLmdldFNjcm9sbFgoKSwgcC5nZXRUb3AoKSAtIGdwLmdldFNjcm9sbFkoKSk7CisgICAgICAgICAgICAgICAgICAgIGRlcHRoKys7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGZpcnN0UGFzcyA9IGZhbHNlOworICAgICAgICAgICAgICAgIHAgPSAoVmlldykgcC5nZXRQYXJlbnQoKTsKKyAgICAgICAgICAgICAgICBncCA9IChWaWV3KSBwLmdldFBhcmVudCgpOworICAgICAgICAgICAgICAgIHBhcmVudFJlY3Quc2V0KHAuZ2V0TGVmdCgpIC0gZ3AuZ2V0U2Nyb2xsWCgpLCBwLmdldFRvcCgpIC0gZ3AuZ2V0U2Nyb2xsWSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgcC5nZXRSaWdodCgpIC0gZ3AuZ2V0U2Nyb2xsWCgpLCBwLmdldEJvdHRvbSgpIC0gZ3AuZ2V0U2Nyb2xsWSgpKTsKKworICAgICAgICAgICAgICAgIC8vIFRPRE86IHdlIG5lZWQgdG8gc3RvcCBlYXJseSBoZXJlIGlmIHdlJ3ZlIGhpdCB0aGUgZWRnZSBvZiB0aGUgc2NyZWVuCisgICAgICAgICAgICAgICAgLy8gc28gYXMgdG8gcHJldmVudCB1cyBmcm9tIHdhbGtpbmcgdG9vIGhpZ2ggaW4gdGhlIGhpZXJhcmNoeS4gQSBsb3Qgb2YgdGhpcworICAgICAgICAgICAgICAgIC8vIGNvZGUgbWlnaHQgYmVjb21lIGEgbG90IG1vcmUgc3RyYWlnaHRmb3J3YXJkLgorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoZGVwdGggPiBtQW5jZXN0b3JIZWlnaHQpIHsKKyAgICAgICAgICAgICAgICBtQW5jZXN0b3JDb250YWluaW5nQWxsQ2hpbGRyZW4gPSAoVmlld0dyb3VwKSBwOworICAgICAgICAgICAgICAgIG1BbmNlc3RvckhlaWdodCA9IGRlcHRoOworICAgICAgICAgICAgICAgIGRpc2FibGVQYXJlbnRhbENsaXBwaW5nKCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHAuaW52YWxpZGF0ZShyLmxlZnQsIHIudG9wLCByLnJpZ2h0LCByLmJvdHRvbSk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIFJlY3QgaW52YWxpZGF0ZVJlY3QgPSBuZXcgUmVjdCgpOworICAgICAgICBwcml2YXRlIFJlY3RGIGludmFsaWRhdGVSZWN0ZiA9IG5ldyBSZWN0RigpOworICAgICAgICAvLyBUaGlzIGlzIHB1YmxpYyBzbyB0aGF0IE9iamVjdEFuaW1hdG9yIGNhbiBhY2Nlc3MgaXQKKyAgICAgICAgcHVibGljIHZvaWQgc2V0VmVydGljYWxPZmZzZXQoaW50IG5ld1ZlcnRpY2FsT2Zmc2V0KSB7CisgICAgICAgICAgICBpbnQgb2Zmc2V0RGVsdGEgPSBuZXdWZXJ0aWNhbE9mZnNldCAtIHZlcnRpY2FsT2Zmc2V0OworICAgICAgICAgICAgdmVydGljYWxPZmZzZXQgPSBuZXdWZXJ0aWNhbE9mZnNldDsKKworICAgICAgICAgICAgaWYgKG1WaWV3ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBtVmlldy5yZXF1ZXN0TGF5b3V0KCk7CisgICAgICAgICAgICAgICAgaW50IHRvcCA9IE1hdGgubWluKG1WaWV3LmdldFRvcCgpICsgb2Zmc2V0RGVsdGEsIG1WaWV3LmdldFRvcCgpKTsKKyAgICAgICAgICAgICAgICBpbnQgYm90dG9tID0gTWF0aC5tYXgobVZpZXcuZ2V0Qm90dG9tKCkgKyBvZmZzZXREZWx0YSwgbVZpZXcuZ2V0Qm90dG9tKCkpOworCisgICAgICAgICAgICAgICAgaW52YWxpZGF0ZVJlY3RmLnNldChtVmlldy5nZXRMZWZ0KCksICB0b3AsIG1WaWV3LmdldFJpZ2h0KCksIGJvdHRvbSk7CisKKyAgICAgICAgICAgICAgICBmbG9hdCB4b2Zmc2V0ID0gLWludmFsaWRhdGVSZWN0Zi5sZWZ0OworICAgICAgICAgICAgICAgIGZsb2F0IHlvZmZzZXQgPSAtaW52YWxpZGF0ZVJlY3RmLnRvcDsKKyAgICAgICAgICAgICAgICBpbnZhbGlkYXRlUmVjdGYub2Zmc2V0KHhvZmZzZXQsIHlvZmZzZXQpOworICAgICAgICAgICAgICAgIG1WaWV3LmdldE1hdHJpeCgpLm1hcFJlY3QoaW52YWxpZGF0ZVJlY3RmKTsKKyAgICAgICAgICAgICAgICBpbnZhbGlkYXRlUmVjdGYub2Zmc2V0KC14b2Zmc2V0LCAteW9mZnNldCk7CisgICAgICAgICAgICAgICAgaW52YWxpZGF0ZVJlY3Quc2V0KChpbnQpIE1hdGguZmxvb3IoaW52YWxpZGF0ZVJlY3RmLmxlZnQpLAorICAgICAgICAgICAgICAgICAgICAgICAgKGludCkgTWF0aC5mbG9vcihpbnZhbGlkYXRlUmVjdGYudG9wKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIChpbnQpIE1hdGguY2VpbChpbnZhbGlkYXRlUmVjdGYucmlnaHQpLAorICAgICAgICAgICAgICAgICAgICAgICAgKGludCkgTWF0aC5jZWlsKGludmFsaWRhdGVSZWN0Zi5ib3R0b20pKTsKKworICAgICAgICAgICAgICAgIGludmFsaWRhdGVHbG9iYWxSZWdpb24obVZpZXcsIGludmFsaWRhdGVSZWN0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHNldEhvcml6b250YWxPZmZzZXQoaW50IG5ld0hvcml6b250YWxPZmZzZXQpIHsKKyAgICAgICAgICAgIGludCBvZmZzZXREZWx0YSA9IG5ld0hvcml6b250YWxPZmZzZXQgLSBob3Jpem9udGFsT2Zmc2V0OworICAgICAgICAgICAgaG9yaXpvbnRhbE9mZnNldCA9IG5ld0hvcml6b250YWxPZmZzZXQ7CisKKyAgICAgICAgICAgIGlmIChtVmlldyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgbVZpZXcucmVxdWVzdExheW91dCgpOworICAgICAgICAgICAgICAgIGludCBsZWZ0ID0gTWF0aC5taW4obVZpZXcuZ2V0TGVmdCgpICsgb2Zmc2V0RGVsdGEsIG1WaWV3LmdldExlZnQoKSk7CisgICAgICAgICAgICAgICAgaW50IHJpZ2h0ID0gTWF0aC5tYXgobVZpZXcuZ2V0UmlnaHQoKSArIG9mZnNldERlbHRhLCBtVmlldy5nZXRSaWdodCgpKTsKKyAgICAgICAgICAgICAgICBpbnZhbGlkYXRlUmVjdGYuc2V0KGxlZnQsICBtVmlldy5nZXRUb3AoKSwgcmlnaHQsIG1WaWV3LmdldEJvdHRvbSgpKTsKKworICAgICAgICAgICAgICAgIGZsb2F0IHhvZmZzZXQgPSAtaW52YWxpZGF0ZVJlY3RmLmxlZnQ7CisgICAgICAgICAgICAgICAgZmxvYXQgeW9mZnNldCA9IC1pbnZhbGlkYXRlUmVjdGYudG9wOworICAgICAgICAgICAgICAgIGludmFsaWRhdGVSZWN0Zi5vZmZzZXQoeG9mZnNldCwgeW9mZnNldCk7CisgICAgICAgICAgICAgICAgbVZpZXcuZ2V0TWF0cml4KCkubWFwUmVjdChpbnZhbGlkYXRlUmVjdGYpOworICAgICAgICAgICAgICAgIGludmFsaWRhdGVSZWN0Zi5vZmZzZXQoLXhvZmZzZXQsIC15b2Zmc2V0KTsKKworICAgICAgICAgICAgICAgIGludmFsaWRhdGVSZWN0LnNldCgoaW50KSBNYXRoLmZsb29yKGludmFsaWRhdGVSZWN0Zi5sZWZ0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgIChpbnQpIE1hdGguZmxvb3IoaW52YWxpZGF0ZVJlY3RmLnRvcCksCisgICAgICAgICAgICAgICAgICAgICAgICAoaW50KSBNYXRoLmNlaWwoaW52YWxpZGF0ZVJlY3RmLnJpZ2h0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgIChpbnQpIE1hdGguY2VpbChpbnZhbGlkYXRlUmVjdGYuYm90dG9tKSk7CisKKyAgICAgICAgICAgICAgICBpbnZhbGlkYXRlR2xvYmFsUmVnaW9uKG1WaWV3LCBpbnZhbGlkYXRlUmVjdCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBIb2xvZ3JhcGhpY0hlbHBlciB7CisgICAgICAgIHByaXZhdGUgZmluYWwgUGFpbnQgbUhvbG9ncmFwaGljUGFpbnQgPSBuZXcgUGFpbnQoKTsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBQYWludCBtRXJhc2VQYWludCA9IG5ldyBQYWludCgpOworICAgICAgICBwcml2YXRlIGZpbmFsIFBhaW50IG1CbHVyUGFpbnQgPSBuZXcgUGFpbnQoKTsKKworICAgICAgICBIb2xvZ3JhcGhpY0hlbHBlcihDb250ZXh0IGNvbnRleHQpIHsKKyAgICAgICAgICAgIGluaXRpYWxpemVQYWludHMoY29udGV4dCk7CisgICAgICAgIH0KKworICAgICAgICB2b2lkIGluaXRpYWxpemVQYWludHMoQ29udGV4dCBjb250ZXh0KSB7CisgICAgICAgICAgICBmaW5hbCBmbG9hdCBkZW5zaXR5ID0gY29udGV4dC5nZXRSZXNvdXJjZXMoKS5nZXREaXNwbGF5TWV0cmljcygpLmRlbnNpdHk7CisKKyAgICAgICAgICAgIG1Ib2xvZ3JhcGhpY1BhaW50LnNldENvbG9yKDB4ZmY2Njk5ZmYpOworICAgICAgICAgICAgbUhvbG9ncmFwaGljUGFpbnQuc2V0RmlsdGVyQml0bWFwKHRydWUpOworICAgICAgICAgICAgbUhvbG9ncmFwaGljUGFpbnQuc2V0TWFza0ZpbHRlcihUYWJsZU1hc2tGaWx0ZXIuQ3JlYXRlQ2xpcFRhYmxlKDAsIDMwKSk7CisgICAgICAgICAgICBtRXJhc2VQYWludC5zZXRYZmVybW9kZShuZXcgUG9ydGVyRHVmZlhmZXJtb2RlKFBvcnRlckR1ZmYuTW9kZS5EU1RfT1VUKSk7CisgICAgICAgICAgICBtRXJhc2VQYWludC5zZXRGaWx0ZXJCaXRtYXAodHJ1ZSk7CisgICAgICAgICAgICBtQmx1clBhaW50LnNldE1hc2tGaWx0ZXIobmV3IEJsdXJNYXNrRmlsdGVyKDIqZGVuc2l0eSwgQmx1ck1hc2tGaWx0ZXIuQmx1ci5OT1JNQUwpKTsKKyAgICAgICAgfQorCisgICAgICAgIEJpdG1hcCBjcmVhdGVPdXRsaW5lKFZpZXcgdikgeworICAgICAgICAgICAgaWYgKHYuZ2V0TWVhc3VyZWRXaWR0aCgpID09IDAgfHwgdi5nZXRNZWFzdXJlZEhlaWdodCgpID09IDApIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQml0bWFwIGJpdG1hcCA9IEJpdG1hcC5jcmVhdGVCaXRtYXAodi5nZXRNZWFzdXJlZFdpZHRoKCksIHYuZ2V0TWVhc3VyZWRIZWlnaHQoKSwKKyAgICAgICAgICAgICAgICAgICAgQml0bWFwLkNvbmZpZy5BUkdCXzg4ODgpOworICAgICAgICAgICAgQ2FudmFzIGNhbnZhcyA9IG5ldyBDYW52YXMoYml0bWFwKTsKKworICAgICAgICAgICAgZmxvYXQgcm90YXRpb25YID0gdi5nZXRSb3RhdGlvblgoKTsKKyAgICAgICAgICAgIGZsb2F0IHJvdGF0aW9uID0gdi5nZXRSb3RhdGlvbigpOworICAgICAgICAgICAgZmxvYXQgdHJhbnNsYXRpb25ZID0gdi5nZXRUcmFuc2xhdGlvblkoKTsKKyAgICAgICAgICAgIHYuc2V0Um90YXRpb25YKDApOworICAgICAgICAgICAgdi5zZXRSb3RhdGlvbigwKTsKKyAgICAgICAgICAgIHYuc2V0VHJhbnNsYXRpb25ZKDApOworICAgICAgICAgICAgdi5kcmF3KGNhbnZhcyk7CisgICAgICAgICAgICB2LnNldFJvdGF0aW9uWChyb3RhdGlvblgpOworICAgICAgICAgICAgdi5zZXRSb3RhdGlvbihyb3RhdGlvbik7CisgICAgICAgICAgICB2LnNldFRyYW5zbGF0aW9uWSh0cmFuc2xhdGlvblkpOworCisgICAgICAgICAgICBkcmF3T3V0bGluZShjYW52YXMsIGJpdG1hcCk7CisgICAgICAgICAgICByZXR1cm4gYml0bWFwOworICAgICAgICB9CisKKyAgICAgICAgZmluYWwgTWF0cml4IGlkID0gbmV3IE1hdHJpeCgpOworICAgICAgICB2b2lkIGRyYXdPdXRsaW5lKENhbnZhcyBkZXN0LCBCaXRtYXAgc3JjKSB7CisgICAgICAgICAgICBpbnRbXSB4eSA9IG5ldyBpbnRbMl07CisgICAgICAgICAgICBCaXRtYXAgbWFzayA9IHNyYy5leHRyYWN0QWxwaGEobUJsdXJQYWludCwgeHkpOworICAgICAgICAgICAgQ2FudmFzIG1hc2tDYW52YXMgPSBuZXcgQ2FudmFzKG1hc2spOworICAgICAgICAgICAgbWFza0NhbnZhcy5kcmF3Qml0bWFwKHNyYywgLXh5WzBdLCAteHlbMV0sIG1FcmFzZVBhaW50KTsKKyAgICAgICAgICAgIGRlc3QuZHJhd0NvbG9yKDAsIFBvcnRlckR1ZmYuTW9kZS5DTEVBUik7CisgICAgICAgICAgICBkZXN0LnNldE1hdHJpeChpZCk7CisgICAgICAgICAgICBkZXN0LmRyYXdCaXRtYXAobWFzaywgeHlbMF0sIHh5WzFdLCBtSG9sb2dyYXBoaWNQYWludCk7CisgICAgICAgICAgICBtYXNrLnJlY3ljbGUoKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9TdWdnZXN0aW9uc0FkYXB0ZXIuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9TdWdnZXN0aW9uc0FkYXB0ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYjI0NDllCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L1N1Z2dlc3Rpb25zQWRhcHRlci5qYXZhCkBAIC0wLDAgKzEsNzA1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLndpZGdldDsKKworaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLlI7CisKK2ltcG9ydCBhbmRyb2lkLmFwcC5TZWFyY2hEaWFsb2c7CitpbXBvcnQgYW5kcm9pZC5hcHAuU2VhcmNoTWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkLmFwcC5TZWFyY2hhYmxlSW5mbzsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29tcG9uZW50TmFtZTsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFJlc29sdmVyOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZW50UmVzb2x2ZXIuT3BlblJlc291cmNlSWRSZXN1bHQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLkFjdGl2aXR5SW5mbzsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uUGFja2FnZU1hbmFnZXI7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLlBhY2thZ2VNYW5hZ2VyLk5hbWVOb3RGb3VuZEV4Y2VwdGlvbjsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLkNvbG9yU3RhdGVMaXN0OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuUmVzb3VyY2VzOworaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2UuQ3Vyc29yOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuQ29sb3JEcmF3YWJsZTsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuU3RhdGVMaXN0RHJhd2FibGU7CitpbXBvcnQgYW5kcm9pZC5uZXQuVXJpOworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworaW1wb3J0IGFuZHJvaWQudGV4dC5TcGFubmFibGU7CitpbXBvcnQgYW5kcm9pZC50ZXh0LlNwYW5uYWJsZVN0cmluZzsKK2ltcG9ydCBhbmRyb2lkLnRleHQuVGV4dFV0aWxzOworaW1wb3J0IGFuZHJvaWQudGV4dC5zdHlsZS5UZXh0QXBwZWFyYW5jZVNwYW47CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuU3BhcnNlQXJyYXk7CitpbXBvcnQgYW5kcm9pZC51dGlsLlR5cGVkVmFsdWU7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXdHcm91cDsKKworaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLnV0aWwuV2Vha0hhc2hNYXA7CisKKy8qKgorICogUHJvdmlkZXMgdGhlIGNvbnRlbnRzIGZvciB0aGUgc3VnZ2VzdGlvbiBkcm9wLWRvd24gbGlzdC5pbiB7QGxpbmsgU2VhcmNoRGlhbG9nfS4KKyAqCisgKiBAaGlkZQorICovCitjbGFzcyBTdWdnZXN0aW9uc0FkYXB0ZXIgZXh0ZW5kcyBSZXNvdXJjZUN1cnNvckFkYXB0ZXIgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBEQkcgPSBmYWxzZTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTE9HX1RBRyA9ICJTdWdnZXN0aW9uc0FkYXB0ZXIiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBRVUVSWV9MSU1JVCA9IDUwOworCisgICAgcHJpdmF0ZSBTZWFyY2hNYW5hZ2VyIG1TZWFyY2hNYW5hZ2VyOworICAgIHByaXZhdGUgU2VhcmNoVmlldyBtU2VhcmNoVmlldzsKKyAgICBwcml2YXRlIFNlYXJjaGFibGVJbmZvIG1TZWFyY2hhYmxlOworICAgIHByaXZhdGUgQ29udGV4dCBtUHJvdmlkZXJDb250ZXh0OworICAgIHByaXZhdGUgV2Vha0hhc2hNYXA8U3RyaW5nLCBEcmF3YWJsZS5Db25zdGFudFN0YXRlPiBtT3V0c2lkZURyYXdhYmxlc0NhY2hlOworICAgIHByaXZhdGUgU3BhcnNlQXJyYXk8RHJhd2FibGUuQ29uc3RhbnRTdGF0ZT4gbUJhY2tncm91bmRzQ2FjaGU7CisgICAgcHJpdmF0ZSBib29sZWFuIG1DbG9zZWQgPSBmYWxzZTsKKworICAgIC8vIFVSTCBjb2xvcgorICAgIHByaXZhdGUgQ29sb3JTdGF0ZUxpc3QgbVVybENvbG9yOworCisgICAgLy8gQ2FjaGVkIGNvbHVtbiBpbmRleGVzLCB1cGRhdGVkIHdoZW4gdGhlIGN1cnNvciBjaGFuZ2VzLgorICAgIHByaXZhdGUgaW50IG1UZXh0MUNvbDsKKyAgICBwcml2YXRlIGludCBtVGV4dDJDb2w7CisgICAgcHJpdmF0ZSBpbnQgbVRleHQyVXJsQ29sOworICAgIHByaXZhdGUgaW50IG1JY29uTmFtZTFDb2w7CisgICAgcHJpdmF0ZSBpbnQgbUljb25OYW1lMkNvbDsKKyAgICBwcml2YXRlIGludCBtQmFja2dyb3VuZENvbG9yQ29sOworCisgICAgc3RhdGljIGZpbmFsIGludCBOT05FID0gLTE7CisKKyAgICBwcml2YXRlIGZpbmFsIFJ1bm5hYmxlIG1TdGFydFNwaW5uZXJSdW5uYWJsZTsKKyAgICBwcml2YXRlIGZpbmFsIFJ1bm5hYmxlIG1TdG9wU3Bpbm5lclJ1bm5hYmxlOworCisgICAgLyoqCisgICAgICogVGhlIGFtb3VudCBvZiB0aW1lIHdlIGRlbGF5IGluIHRoZSBmaWx0ZXIgd2hlbiB0aGUgdXNlciBwcmVzc2VzIHRoZSBkZWxldGUga2V5LgorICAgICAqIEBzZWUgRmlsdGVyI3NldERlbGF5ZXIoYW5kcm9pZC53aWRnZXQuRmlsdGVyLkRlbGF5ZXIpLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgREVMRVRFX0tFWV9QT1NUX0RFTEFZID0gNTAwTDsKKworICAgIHB1YmxpYyBTdWdnZXN0aW9uc0FkYXB0ZXIoQ29udGV4dCBjb250ZXh0LCBTZWFyY2hWaWV3IHNlYXJjaFZpZXcsCisgICAgICAgICAgICBTZWFyY2hhYmxlSW5mbyBzZWFyY2hhYmxlLAorICAgICAgICAgICAgV2Vha0hhc2hNYXA8U3RyaW5nLCBEcmF3YWJsZS5Db25zdGFudFN0YXRlPiBvdXRzaWRlRHJhd2FibGVzQ2FjaGUpIHsKKyAgICAgICAgc3VwZXIoY29udGV4dCwKKyAgICAgICAgICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmxheW91dC5zZWFyY2hfZHJvcGRvd25faXRlbV9pY29uc18ybGluZSwKKyAgICAgICAgICAgICAgICBudWxsLCAgIC8vIG5vIGluaXRpYWwgY3Vyc29yCisgICAgICAgICAgICAgICAgdHJ1ZSk7ICAvLyBhdXRvLXJlcXVlcnkKKyAgICAgICAgbVNlYXJjaE1hbmFnZXIgPSAoU2VhcmNoTWFuYWdlcikgbUNvbnRleHQuZ2V0U3lzdGVtU2VydmljZShDb250ZXh0LlNFQVJDSF9TRVJWSUNFKTsKKyAgICAgICAgbVNlYXJjaFZpZXcgPSBzZWFyY2hWaWV3OworICAgICAgICBtU2VhcmNoYWJsZSA9IHNlYXJjaGFibGU7CisKKyAgICAgICAgLy8gc2V0IHVwIHByb3ZpZGVyIHJlc291cmNlcyAoZ2l2ZXMgdXMgaWNvbnMsIGV0Yy4pCisgICAgICAgIENvbnRleHQgYWN0aXZpdHlDb250ZXh0ID0gbVNlYXJjaGFibGUuZ2V0QWN0aXZpdHlDb250ZXh0KG1Db250ZXh0KTsKKyAgICAgICAgbVByb3ZpZGVyQ29udGV4dCA9IG1TZWFyY2hhYmxlLmdldFByb3ZpZGVyQ29udGV4dChtQ29udGV4dCwgYWN0aXZpdHlDb250ZXh0KTsKKworICAgICAgICBtT3V0c2lkZURyYXdhYmxlc0NhY2hlID0gb3V0c2lkZURyYXdhYmxlc0NhY2hlOworICAgICAgICBtQmFja2dyb3VuZHNDYWNoZSA9IG5ldyBTcGFyc2VBcnJheTxEcmF3YWJsZS5Db25zdGFudFN0YXRlPigpOworCisgICAgICAgIG1TdGFydFNwaW5uZXJSdW5uYWJsZSA9IG5ldyBSdW5uYWJsZSgpIHsKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgLy8gbVNlYXJjaFZpZXcuc2V0V29ya2luZyh0cnVlKTsgLy8gVE9ETzoKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9OworCisgICAgICAgIG1TdG9wU3Bpbm5lclJ1bm5hYmxlID0gbmV3IFJ1bm5hYmxlKCkgeworICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgIC8vIG1TZWFyY2hWaWV3LnNldFdvcmtpbmcoZmFsc2UpOyAvLyBUT0RPOgorICAgICAgICAgICAgfQorICAgICAgICB9OworCisgICAgICAgIC8vIGRlbGF5IDUwMG1zIHdoZW4gZGVsZXRpbmcKKyAgICAgICAgZ2V0RmlsdGVyKCkuc2V0RGVsYXllcihuZXcgRmlsdGVyLkRlbGF5ZXIoKSB7CisKKyAgICAgICAgICAgIHByaXZhdGUgaW50IG1QcmV2aW91c0xlbmd0aCA9IDA7CisKKyAgICAgICAgICAgIHB1YmxpYyBsb25nIGdldFBvc3RpbmdEZWxheShDaGFyU2VxdWVuY2UgY29uc3RyYWludCkgeworICAgICAgICAgICAgICAgIGlmIChjb25zdHJhaW50ID09IG51bGwpIHJldHVybiAwOworCisgICAgICAgICAgICAgICAgbG9uZyBkZWxheSA9IGNvbnN0cmFpbnQubGVuZ3RoKCkgPCBtUHJldmlvdXNMZW5ndGggPyBERUxFVEVfS0VZX1BPU1RfREVMQVkgOiAwOworICAgICAgICAgICAgICAgIG1QcmV2aW91c0xlbmd0aCA9IGNvbnN0cmFpbnQubGVuZ3RoKCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIGRlbGF5OworICAgICAgICAgICAgfQorICAgICAgICB9KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBPdmVycmlkZGVuIHRvIGFsd2F5cyByZXR1cm4gPGNvZGU+ZmFsc2U8L2NvZGU+LCBzaW5jZSB3ZSBjYW5ub3QgYmUgc3VyZSB0aGF0CisgICAgICogc3VnZ2VzdGlvbiBzb3VyY2VzIHJldHVybiBzdGFibGUgSURzLgorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGhhc1N0YWJsZUlkcygpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFVzZSB0aGUgc2VhcmNoIHN1Z2dlc3Rpb25zIHByb3ZpZGVyIHRvIG9idGFpbiBhIGxpdmUgY3Vyc29yLiAgVGhpcyB3aWxsIGJlIGNhbGxlZAorICAgICAqIGluIGEgd29ya2VyIHRocmVhZCwgc28gaXQncyBPSyBpZiB0aGUgcXVlcnkgaXMgc2xvdyAoZS5nLiByb3VuZCB0cmlwIGZvciBzdWdnZXN0aW9ucykuCisgICAgICogVGhlIHJlc3VsdHMgd2lsbCBiZSBwcm9jZXNzZWQgaW4gdGhlIFVJIHRocmVhZCBhbmQgY2hhbmdlQ3Vyc29yKCkgd2lsbCBiZSBjYWxsZWQuCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIEN1cnNvciBydW5RdWVyeU9uQmFja2dyb3VuZFRocmVhZChDaGFyU2VxdWVuY2UgY29uc3RyYWludCkgeworICAgICAgICBpZiAoREJHKSBMb2cuZChMT0dfVEFHLCAicnVuUXVlcnlPbkJhY2tncm91bmRUaHJlYWQoIiArIGNvbnN0cmFpbnQgKyAiKSIpOworICAgICAgICBTdHJpbmcgcXVlcnkgPSAoY29uc3RyYWludCA9PSBudWxsKSA/ICIiIDogY29uc3RyYWludC50b1N0cmluZygpOworICAgICAgICAvKioKKyAgICAgICAgICogZm9yIGluIGFwcCBzZWFyY2ggd2Ugc2hvdyB0aGUgcHJvZ3Jlc3Mgc3Bpbm5lciB1bnRpbCB0aGUgY3Vyc29yIGlzIHJldHVybmVkIHdpdGgKKyAgICAgICAgICogdGhlIHJlc3VsdHMuCisgICAgICAgICAqLworICAgICAgICBDdXJzb3IgY3Vyc29yID0gbnVsbDsKKyAgICAgICAgLy9tU2VhcmNoVmlldy5nZXRXaW5kb3coKS5nZXREZWNvclZpZXcoKS5wb3N0KG1TdGFydFNwaW5uZXJSdW5uYWJsZSk7IC8vIFRPRE86CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBjdXJzb3IgPSBtU2VhcmNoTWFuYWdlci5nZXRTdWdnZXN0aW9ucyhtU2VhcmNoYWJsZSwgcXVlcnksIFFVRVJZX0xJTUlUKTsKKyAgICAgICAgICAgIC8vIHRyaWdnZXIgZmlsbCB3aW5kb3cgc28gdGhlIHNwaW5uZXIgc3RheXMgdXAgdW50aWwgdGhlIHJlc3VsdHMgYXJlIGNvcGllZCBvdmVyIGFuZAorICAgICAgICAgICAgLy8gY2xvc2VyIHRvIGJlaW5nIHJlYWR5CisgICAgICAgICAgICBpZiAoY3Vyc29yICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBjdXJzb3IuZ2V0Q291bnQoKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gY3Vyc29yOworICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIExvZy53KExPR19UQUcsICJTZWFyY2ggc3VnZ2VzdGlvbnMgcXVlcnkgdGhyZXcgYW4gZXhjZXB0aW9uLiIsIGUpOworICAgICAgICB9CisgICAgICAgIC8vIElmIGN1cnNvciBpcyBudWxsIG9yIGFuIGV4Y2VwdGlvbiB3YXMgdGhyb3duLCBzdG9wIHRoZSBzcGlubmVyIGFuZCByZXR1cm4gbnVsbC4KKyAgICAgICAgLy8gY2hhbmdlQ3Vyc29yIGRvZXNuJ3QgZ2V0IGNhbGxlZCBpZiBjdXJzb3IgaXMgbnVsbAorICAgICAgICAvLyBtU2VhcmNoVmlldy5nZXRXaW5kb3coKS5nZXREZWNvclZpZXcoKS5wb3N0KG1TdG9wU3Bpbm5lclJ1bm5hYmxlKTsgLy8gVE9ETzoKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgY2xvc2UoKSB7CisgICAgICAgIGlmIChEQkcpIExvZy5kKExPR19UQUcsICJjbG9zZSgpIik7CisgICAgICAgIGNoYW5nZUN1cnNvcihudWxsKTsKKyAgICAgICAgbUNsb3NlZCA9IHRydWU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgbm90aWZ5RGF0YVNldENoYW5nZWQoKSB7CisgICAgICAgIGlmIChEQkcpIExvZy5kKExPR19UQUcsICJub3RpZnlEYXRhU2V0Q2hhbmdlZCIpOworICAgICAgICBzdXBlci5ub3RpZnlEYXRhU2V0Q2hhbmdlZCgpOworCisgICAgICAgIC8vIG1TZWFyY2hWaWV3Lm9uRGF0YVNldENoYW5nZWQoKTsgLy8gVE9ETzoKKworICAgICAgICB1cGRhdGVTcGlubmVyU3RhdGUoZ2V0Q3Vyc29yKCkpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG5vdGlmeURhdGFTZXRJbnZhbGlkYXRlZCgpIHsKKyAgICAgICAgaWYgKERCRykgTG9nLmQoTE9HX1RBRywgIm5vdGlmeURhdGFTZXRJbnZhbGlkYXRlZCIpOworICAgICAgICBzdXBlci5ub3RpZnlEYXRhU2V0SW52YWxpZGF0ZWQoKTsKKworICAgICAgICB1cGRhdGVTcGlubmVyU3RhdGUoZ2V0Q3Vyc29yKCkpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCB1cGRhdGVTcGlubmVyU3RhdGUoQ3Vyc29yIGN1cnNvcikgeworICAgICAgICBCdW5kbGUgZXh0cmFzID0gY3Vyc29yICE9IG51bGwgPyBjdXJzb3IuZ2V0RXh0cmFzKCkgOiBudWxsOworICAgICAgICBpZiAoREJHKSB7CisgICAgICAgICAgICBMb2cuZChMT0dfVEFHLCAidXBkYXRlU3Bpbm5lclN0YXRlIC0gZXh0cmEgPSAiCisgICAgICAgICAgICAgICAgKyAoZXh0cmFzICE9IG51bGwKKyAgICAgICAgICAgICAgICAgICAgICAgID8gZXh0cmFzLmdldEJvb2xlYW4oU2VhcmNoTWFuYWdlci5DVVJTT1JfRVhUUkFfS0VZX0lOX1BST0dSRVNTKQorICAgICAgICAgICAgICAgICAgICAgICAgOiBudWxsKSk7CisgICAgICAgIH0KKyAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIEN1cnNvciBpbmRpY2F0ZXMgdGhhdCB0aGUgcXVlcnkgaXMgbm90IGNvbXBsZXRlIGFuZCBzaG93IHRoZSBzcGlubmVyCisgICAgICAgIGlmIChleHRyYXMgIT0gbnVsbAorICAgICAgICAgICAgICAgICYmIGV4dHJhcy5nZXRCb29sZWFuKFNlYXJjaE1hbmFnZXIuQ1VSU09SX0VYVFJBX0tFWV9JTl9QUk9HUkVTUykpIHsKKyAgICAgICAgICAgIC8vIG1TZWFyY2hWaWV3LmdldFdpbmRvdygpLmdldERlY29yVmlldygpLnBvc3QobVN0YXJ0U3Bpbm5lclJ1bm5hYmxlKTsgLy8gVE9ETzoKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICAvLyBJZiBjdXJzb3IgaXMgbnVsbCBvciBpcyBkb25lLCBzdG9wIHRoZSBzcGlubmVyCisgICAgICAgIC8vIG1TZWFyY2hWaWV3LmdldFdpbmRvdygpLmdldERlY29yVmlldygpLnBvc3QobVN0b3BTcGlubmVyUnVubmFibGUpOyAvLyBUT0RPOgorICAgIH0KKworICAgIC8qKgorICAgICAqIENhY2hlIGNvbHVtbnMuCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgY2hhbmdlQ3Vyc29yKEN1cnNvciBjKSB7CisgICAgICAgIGlmIChEQkcpIExvZy5kKExPR19UQUcsICJjaGFuZ2VDdXJzb3IoIiArIGMgKyAiKSIpOworCisgICAgICAgIGlmIChtQ2xvc2VkKSB7CisgICAgICAgICAgICBMb2cudyhMT0dfVEFHLCAiVHJpZWQgdG8gY2hhbmdlIGN1cnNvciBhZnRlciBhZGFwdGVyIHdhcyBjbG9zZWQuIik7CisgICAgICAgICAgICBpZiAoYyAhPSBudWxsKSBjLmNsb3NlKCk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICB0cnkgeworICAgICAgICAgICAgc3VwZXIuY2hhbmdlQ3Vyc29yKGMpOworCisgICAgICAgICAgICBpZiAoYyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgbVRleHQxQ29sID0gYy5nZXRDb2x1bW5JbmRleChTZWFyY2hNYW5hZ2VyLlNVR0dFU1RfQ09MVU1OX1RFWFRfMSk7CisgICAgICAgICAgICAgICAgbVRleHQyQ29sID0gYy5nZXRDb2x1bW5JbmRleChTZWFyY2hNYW5hZ2VyLlNVR0dFU1RfQ09MVU1OX1RFWFRfMik7CisgICAgICAgICAgICAgICAgbVRleHQyVXJsQ29sID0gYy5nZXRDb2x1bW5JbmRleChTZWFyY2hNYW5hZ2VyLlNVR0dFU1RfQ09MVU1OX1RFWFRfMl9VUkwpOworICAgICAgICAgICAgICAgIG1JY29uTmFtZTFDb2wgPSBjLmdldENvbHVtbkluZGV4KFNlYXJjaE1hbmFnZXIuU1VHR0VTVF9DT0xVTU5fSUNPTl8xKTsKKyAgICAgICAgICAgICAgICBtSWNvbk5hbWUyQ29sID0gYy5nZXRDb2x1bW5JbmRleChTZWFyY2hNYW5hZ2VyLlNVR0dFU1RfQ09MVU1OX0lDT05fMik7CisgICAgICAgICAgICAgICAgbUJhY2tncm91bmRDb2xvckNvbCA9CisgICAgICAgICAgICAgICAgICAgICAgICBjLmdldENvbHVtbkluZGV4KFNlYXJjaE1hbmFnZXIuU1VHR0VTVF9DT0xVTU5fQkFDS0dST1VORF9DT0xPUik7CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBMb2cuZShMT0dfVEFHLCAiZXJyb3IgY2hhbmdpbmcgY3Vyc29yIGFuZCBjYWNoaW5nIGNvbHVtbnMiLCBlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFRhZ3MgdGhlIHZpZXcgd2l0aCBjYWNoZWQgY2hpbGQgdmlldyBsb29rLXVwcy4KKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgVmlldyBuZXdWaWV3KENvbnRleHQgY29udGV4dCwgQ3Vyc29yIGN1cnNvciwgVmlld0dyb3VwIHBhcmVudCkgeworICAgICAgICBWaWV3IHYgPSBzdXBlci5uZXdWaWV3KGNvbnRleHQsIGN1cnNvciwgcGFyZW50KTsKKyAgICAgICAgdi5zZXRUYWcobmV3IENoaWxkVmlld0NhY2hlKHYpKTsKKyAgICAgICAgcmV0dXJuIHY7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2FjaGUgb2YgdGhlIGNoaWxkIHZpZXdzIG9mIGRyb3AtZHJvd24gbGlzdCBpdGVtcywgdG8gYXZvaWQgbG9va2luZyB1cCB0aGUgY2hpbGRyZW4KKyAgICAgKiBlYWNoIHRpbWUgdGhlIGNvbnRlbnRzIG9mIGEgbGlzdCBpdGVtIGFyZSBjaGFuZ2VkLgorICAgICAqLworICAgIHByaXZhdGUgZmluYWwgc3RhdGljIGNsYXNzIENoaWxkVmlld0NhY2hlIHsKKyAgICAgICAgcHVibGljIGZpbmFsIFRleHRWaWV3IG1UZXh0MTsKKyAgICAgICAgcHVibGljIGZpbmFsIFRleHRWaWV3IG1UZXh0MjsKKyAgICAgICAgcHVibGljIGZpbmFsIEltYWdlVmlldyBtSWNvbjE7CisgICAgICAgIHB1YmxpYyBmaW5hbCBJbWFnZVZpZXcgbUljb24yOworCisgICAgICAgIHB1YmxpYyBDaGlsZFZpZXdDYWNoZShWaWV3IHYpIHsKKyAgICAgICAgICAgIG1UZXh0MSA9IChUZXh0Vmlldykgdi5maW5kVmlld0J5SWQoY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5pZC50ZXh0MSk7CisgICAgICAgICAgICBtVGV4dDIgPSAoVGV4dFZpZXcpIHYuZmluZFZpZXdCeUlkKGNvbS5hbmRyb2lkLmludGVybmFsLlIuaWQudGV4dDIpOworICAgICAgICAgICAgbUljb24xID0gKEltYWdlVmlldykgdi5maW5kVmlld0J5SWQoY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5pZC5pY29uMSk7CisgICAgICAgICAgICBtSWNvbjIgPSAoSW1hZ2VWaWV3KSB2LmZpbmRWaWV3QnlJZChjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmlkLmljb24yKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGJpbmRWaWV3KFZpZXcgdmlldywgQ29udGV4dCBjb250ZXh0LCBDdXJzb3IgY3Vyc29yKSB7CisgICAgICAgIENoaWxkVmlld0NhY2hlIHZpZXdzID0gKENoaWxkVmlld0NhY2hlKSB2aWV3LmdldFRhZygpOworCisgICAgICAgIGludCBiYWNrZ3JvdW5kQ29sb3IgPSAwOworICAgICAgICBpZiAobUJhY2tncm91bmRDb2xvckNvbCAhPSAtMSkgeworICAgICAgICAgICAgYmFja2dyb3VuZENvbG9yID0gY3Vyc29yLmdldEludChtQmFja2dyb3VuZENvbG9yQ29sKTsKKyAgICAgICAgfQorICAgICAgICBEcmF3YWJsZSBiYWNrZ3JvdW5kID0gZ2V0SXRlbUJhY2tncm91bmQoYmFja2dyb3VuZENvbG9yKTsKKyAgICAgICAgdmlldy5zZXRCYWNrZ3JvdW5kRHJhd2FibGUoYmFja2dyb3VuZCk7CisKKyAgICAgICAgaWYgKHZpZXdzLm1UZXh0MSAhPSBudWxsKSB7CisgICAgICAgICAgICBTdHJpbmcgdGV4dDEgPSBnZXRTdHJpbmdPck51bGwoY3Vyc29yLCBtVGV4dDFDb2wpOworICAgICAgICAgICAgc2V0Vmlld1RleHQodmlld3MubVRleHQxLCB0ZXh0MSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHZpZXdzLm1UZXh0MiAhPSBudWxsKSB7CisgICAgICAgICAgICAvLyBGaXJzdCBjaGVjayBURVhUXzJfVVJMCisgICAgICAgICAgICBDaGFyU2VxdWVuY2UgdGV4dDIgPSBnZXRTdHJpbmdPck51bGwoY3Vyc29yLCBtVGV4dDJVcmxDb2wpOworICAgICAgICAgICAgaWYgKHRleHQyICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0ZXh0MiA9IGZvcm1hdFVybCh0ZXh0Mik7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHRleHQyID0gZ2V0U3RyaW5nT3JOdWxsKGN1cnNvciwgbVRleHQyQ29sKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIAorICAgICAgICAgICAgLy8gSWYgbm8gc2Vjb25kIGxpbmUgb2YgdGV4dCBpcyBpbmRpY2F0ZWQsIGFsbG93IHRoZSBmaXJzdCBsaW5lIG9mIHRleHQKKyAgICAgICAgICAgIC8vIHRvIGJlIHVwIHRvIHR3byBsaW5lcyBpZiBpdCB3YW50cyB0byBiZS4KKyAgICAgICAgICAgIGlmIChUZXh0VXRpbHMuaXNFbXB0eSh0ZXh0MikpIHsKKyAgICAgICAgICAgICAgICBpZiAodmlld3MubVRleHQxICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgdmlld3MubVRleHQxLnNldFNpbmdsZUxpbmUoZmFsc2UpOworICAgICAgICAgICAgICAgICAgICB2aWV3cy5tVGV4dDEuc2V0TWF4TGluZXMoMik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZiAodmlld3MubVRleHQxICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgdmlld3MubVRleHQxLnNldFNpbmdsZUxpbmUodHJ1ZSk7CisgICAgICAgICAgICAgICAgICAgIHZpZXdzLm1UZXh0MS5zZXRNYXhMaW5lcygxKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzZXRWaWV3VGV4dCh2aWV3cy5tVGV4dDIsIHRleHQyKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICh2aWV3cy5tSWNvbjEgIT0gbnVsbCkgeworICAgICAgICAgICAgc2V0Vmlld0RyYXdhYmxlKHZpZXdzLm1JY29uMSwgZ2V0SWNvbjEoY3Vyc29yKSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHZpZXdzLm1JY29uMiAhPSBudWxsKSB7CisgICAgICAgICAgICBzZXRWaWV3RHJhd2FibGUodmlld3MubUljb24yLCBnZXRJY29uMihjdXJzb3IpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgQ2hhclNlcXVlbmNlIGZvcm1hdFVybChDaGFyU2VxdWVuY2UgdXJsKSB7CisgICAgICAgIGlmIChtVXJsQ29sb3IgPT0gbnVsbCkgeworICAgICAgICAgICAgLy8gTGF6aWx5IGdldCB0aGUgVVJMIGNvbG9yIGZyb20gdGhlIGN1cnJlbnQgdGhlbWUuCisgICAgICAgICAgICBUeXBlZFZhbHVlIGNvbG9yVmFsdWUgPSBuZXcgVHlwZWRWYWx1ZSgpOworICAgICAgICAgICAgbUNvbnRleHQuZ2V0VGhlbWUoKS5yZXNvbHZlQXR0cmlidXRlKFIuYXR0ci50ZXh0Q29sb3JTZWFyY2hVcmwsIGNvbG9yVmFsdWUsIHRydWUpOworICAgICAgICAgICAgbVVybENvbG9yID0gbUNvbnRleHQuZ2V0UmVzb3VyY2VzKCkuZ2V0Q29sb3JTdGF0ZUxpc3QoY29sb3JWYWx1ZS5yZXNvdXJjZUlkKTsKKyAgICAgICAgfQorCisgICAgICAgIFNwYW5uYWJsZVN0cmluZyB0ZXh0ID0gbmV3IFNwYW5uYWJsZVN0cmluZyh1cmwpOworICAgICAgICB0ZXh0LnNldFNwYW4obmV3IFRleHRBcHBlYXJhbmNlU3BhbihudWxsLCAwLCAwLCBtVXJsQ29sb3IsIG51bGwpLAorICAgICAgICAgICAgICAgIDAsIHVybC5sZW5ndGgoKSwKKyAgICAgICAgICAgICAgICBTcGFubmFibGUuU1BBTl9FWENMVVNJVkVfRVhDTFVTSVZFKTsKKyAgICAgICAgcmV0dXJuIHRleHQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0cyBhIGRyYXdhYmxlIHdpdGggbm8gY29sb3Igd2hlbiBzZWxlY3RlZCBvciBwcmVzc2VkLCBhbmQgdGhlIGdpdmVuIGNvbG9yIHdoZW4KKyAgICAgKiBuZWl0aGVyIHNlbGVjdGVkIG5vciBwcmVzc2VkLgorICAgICAqCisgICAgICogQHJldHVybiBBIGRyYXdhYmxlLCBvciB7QGNvZGUgbnVsbH0gaWYgdGhlIGdpdmVuIGNvbG9yIGlzIHRyYW5zcGFyZW50LgorICAgICAqLworICAgIHByaXZhdGUgRHJhd2FibGUgZ2V0SXRlbUJhY2tncm91bmQoaW50IGJhY2tncm91bmRDb2xvcikgeworICAgICAgICBpZiAoYmFja2dyb3VuZENvbG9yID09IDApIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgRHJhd2FibGUuQ29uc3RhbnRTdGF0ZSBjYWNoZWRCZyA9IG1CYWNrZ3JvdW5kc0NhY2hlLmdldChiYWNrZ3JvdW5kQ29sb3IpOworICAgICAgICAgICAgaWYgKGNhY2hlZEJnICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBpZiAoREJHKSBMb2cuZChMT0dfVEFHLCAiQmFja2dyb3VuZCBjYWNoZSBoaXQgZm9yIGNvbG9yICIgKyBiYWNrZ3JvdW5kQ29sb3IpOworICAgICAgICAgICAgICAgIHJldHVybiBjYWNoZWRCZy5uZXdEcmF3YWJsZShtUHJvdmlkZXJDb250ZXh0LmdldFJlc291cmNlcygpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChEQkcpIExvZy5kKExPR19UQUcsICJDcmVhdGluZyBuZXcgYmFja2dyb3VuZCBmb3IgY29sb3IgIiArIGJhY2tncm91bmRDb2xvcik7CisgICAgICAgICAgICBDb2xvckRyYXdhYmxlIHRyYW5zcGFyZW50ID0gbmV3IENvbG9yRHJhd2FibGUoMCk7CisgICAgICAgICAgICBDb2xvckRyYXdhYmxlIGJhY2tncm91bmQgPSBuZXcgQ29sb3JEcmF3YWJsZShiYWNrZ3JvdW5kQ29sb3IpOworICAgICAgICAgICAgU3RhdGVMaXN0RHJhd2FibGUgbmV3QmcgPSBuZXcgU3RhdGVMaXN0RHJhd2FibGUoKTsKKyAgICAgICAgICAgIG5ld0JnLmFkZFN0YXRlKG5ldyBpbnRbXXthbmRyb2lkLlIuYXR0ci5zdGF0ZV9zZWxlY3RlZH0sIHRyYW5zcGFyZW50KTsKKyAgICAgICAgICAgIG5ld0JnLmFkZFN0YXRlKG5ldyBpbnRbXXthbmRyb2lkLlIuYXR0ci5zdGF0ZV9wcmVzc2VkfSwgdHJhbnNwYXJlbnQpOworICAgICAgICAgICAgbmV3QmcuYWRkU3RhdGUobmV3IGludFtde30sIGJhY2tncm91bmQpOworICAgICAgICAgICAgbUJhY2tncm91bmRzQ2FjaGUucHV0KGJhY2tncm91bmRDb2xvciwgbmV3QmcuZ2V0Q29uc3RhbnRTdGF0ZSgpKTsKKyAgICAgICAgICAgIHJldHVybiBuZXdCZzsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBzZXRWaWV3VGV4dChUZXh0VmlldyB2LCBDaGFyU2VxdWVuY2UgdGV4dCkgeworICAgICAgICAvLyBTZXQgdGhlIHRleHQgZXZlbiBpZiBpdCdzIG51bGwsIHNpbmNlIHdlIG5lZWQgdG8gY2xlYXIgYW55IHByZXZpb3VzIHRleHQuCisgICAgICAgIHYuc2V0VGV4dCh0ZXh0KTsKKworICAgICAgICBpZiAoVGV4dFV0aWxzLmlzRW1wdHkodGV4dCkpIHsKKyAgICAgICAgICAgIHYuc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdi5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIERyYXdhYmxlIGdldEljb24xKEN1cnNvciBjdXJzb3IpIHsKKyAgICAgICAgaWYgKG1JY29uTmFtZTFDb2wgPCAwKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgICAgICBTdHJpbmcgdmFsdWUgPSBjdXJzb3IuZ2V0U3RyaW5nKG1JY29uTmFtZTFDb2wpOworICAgICAgICBEcmF3YWJsZSBkcmF3YWJsZSA9IGdldERyYXdhYmxlRnJvbVJlc291cmNlVmFsdWUodmFsdWUpOworICAgICAgICBpZiAoZHJhd2FibGUgIT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIGRyYXdhYmxlOworICAgICAgICB9CisgICAgICAgIHJldHVybiBnZXREZWZhdWx0SWNvbjEoY3Vyc29yKTsKKyAgICB9CisKKyAgICBwcml2YXRlIERyYXdhYmxlIGdldEljb24yKEN1cnNvciBjdXJzb3IpIHsKKyAgICAgICAgaWYgKG1JY29uTmFtZTJDb2wgPCAwKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgICAgICBTdHJpbmcgdmFsdWUgPSBjdXJzb3IuZ2V0U3RyaW5nKG1JY29uTmFtZTJDb2wpOworICAgICAgICByZXR1cm4gZ2V0RHJhd2FibGVGcm9tUmVzb3VyY2VWYWx1ZSh2YWx1ZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgZHJhd2FibGUgaW4gYW4gaW1hZ2UgdmlldywgbWFrZXMgc3VyZSB0aGUgdmlldyBpcyBvbmx5IHZpc2libGUgaWYgdGhlcmUKKyAgICAgKiBpcyBhIGRyYXdhYmxlLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBzZXRWaWV3RHJhd2FibGUoSW1hZ2VWaWV3IHYsIERyYXdhYmxlIGRyYXdhYmxlKSB7CisgICAgICAgIC8vIFNldCB0aGUgaWNvbiBldmVuIGlmIHRoZSBkcmF3YWJsZSBpcyBudWxsLCBzaW5jZSB3ZSBuZWVkIHRvIGNsZWFyIGFueQorICAgICAgICAvLyBwcmV2aW91cyBpY29uLgorICAgICAgICB2LnNldEltYWdlRHJhd2FibGUoZHJhd2FibGUpOworCisgICAgICAgIGlmIChkcmF3YWJsZSA9PSBudWxsKSB7CisgICAgICAgICAgICB2LnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHYuc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOworCisgICAgICAgICAgICAvLyBUaGlzIGlzIGEgaGFjayB0byBnZXQgYW55IGFuaW1hdGVkIGRyYXdhYmxlcyAobGlrZSBhICd3b3JraW5nJyBzcGlubmVyKQorICAgICAgICAgICAgLy8gdG8gYW5pbWF0ZS4gWW91IGhhdmUgdG8gc2V0VmlzaWJsZSB0cnVlIG9uIGFuIEFuaW1hdGlvbkRyYXdhYmxlIHRvIGdldAorICAgICAgICAgICAgLy8gaXQgdG8gc3RhcnQgYW5pbWF0aW5nLCBidXQgaXQgbXVzdCBmaXJzdCBoYXZlIGJlZW4gZmFsc2Ugb3IgZWxzZSB0aGUKKyAgICAgICAgICAgIC8vIGNhbGwgdG8gc2V0VmlzaWJsZSB3aWxsIGJlIGluZWZmZWN0aXZlLiBXZSBuZWVkIHRvIGNsZWFyIHVwIHRoZSBzdG9yeQorICAgICAgICAgICAgLy8gYWJvdXQgYW5pbWF0ZWQgZHJhd2FibGVzIGluIHRoZSBmdXR1cmUsIHNlZSBodHRwOi8vYi8xODc4NDMwLgorICAgICAgICAgICAgZHJhd2FibGUuc2V0VmlzaWJsZShmYWxzZSwgZmFsc2UpOworICAgICAgICAgICAgZHJhd2FibGUuc2V0VmlzaWJsZSh0cnVlLCBmYWxzZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSB0ZXh0IHRvIHNob3cgaW4gdGhlIHF1ZXJ5IGZpZWxkIHdoZW4gYSBzdWdnZXN0aW9uIGlzIHNlbGVjdGVkLgorICAgICAqCisgICAgICogQHBhcmFtIGN1cnNvciBUaGUgQ3Vyc29yIHRvIHJlYWQgdGhlIHN1Z2dlc3Rpb24gZGF0YSBmcm9tLiBUaGUgQ3Vyc29yIHNob3VsZCBhbHJlYWR5CisgICAgICogICAgICAgIGJlIG1vdmVkIHRvIHRoZSBzdWdnZXN0aW9uIHRoYXQgaXMgdG8gYmUgcmVhZCBmcm9tLgorICAgICAqIEByZXR1cm4gVGhlIHRleHQgdG8gc2hvdywgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIHF1ZXJ5IHNob3VsZCBub3QgYmUKKyAgICAgKiAgICAgICAgIGNoYW5nZWQgd2hlbiBzZWxlY3RpbmcgdGhpcyBzdWdnZXN0aW9uLgorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBDaGFyU2VxdWVuY2UgY29udmVydFRvU3RyaW5nKEN1cnNvciBjdXJzb3IpIHsKKyAgICAgICAgaWYgKGN1cnNvciA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIFN0cmluZyBxdWVyeSA9IGdldENvbHVtblN0cmluZyhjdXJzb3IsIFNlYXJjaE1hbmFnZXIuU1VHR0VTVF9DT0xVTU5fUVVFUlkpOworICAgICAgICBpZiAocXVlcnkgIT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIHF1ZXJ5OworICAgICAgICB9CisKKyAgICAgICAgaWYgKG1TZWFyY2hhYmxlLnNob3VsZFJld3JpdGVRdWVyeUZyb21EYXRhKCkpIHsKKyAgICAgICAgICAgIFN0cmluZyBkYXRhID0gZ2V0Q29sdW1uU3RyaW5nKGN1cnNvciwgU2VhcmNoTWFuYWdlci5TVUdHRVNUX0NPTFVNTl9JTlRFTlRfREFUQSk7CisgICAgICAgICAgICBpZiAoZGF0YSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGRhdGE7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAobVNlYXJjaGFibGUuc2hvdWxkUmV3cml0ZVF1ZXJ5RnJvbVRleHQoKSkgeworICAgICAgICAgICAgU3RyaW5nIHRleHQxID0gZ2V0Q29sdW1uU3RyaW5nKGN1cnNvciwgU2VhcmNoTWFuYWdlci5TVUdHRVNUX0NPTFVNTl9URVhUXzEpOworICAgICAgICAgICAgaWYgKHRleHQxICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdGV4dDE7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGlzIG1ldGhvZCBpcyBvdmVycmlkZGVuIHB1cmVseSB0byBwcm92aWRlIGEgYml0IG9mIHByb3RlY3Rpb24gYWdhaW5zdAorICAgICAqIGZsYWt5IGNvbnRlbnQgcHJvdmlkZXJzLgorICAgICAqCisgICAgICogQHNlZSBhbmRyb2lkLndpZGdldC5MaXN0QWRhcHRlciNnZXRWaWV3KGludCwgVmlldywgVmlld0dyb3VwKQorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBWaWV3IGdldFZpZXcoaW50IHBvc2l0aW9uLCBWaWV3IGNvbnZlcnRWaWV3LCBWaWV3R3JvdXAgcGFyZW50KSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXR1cm4gc3VwZXIuZ2V0Vmlldyhwb3NpdGlvbiwgY29udmVydFZpZXcsIHBhcmVudCk7CisgICAgICAgIH0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgTG9nLncoTE9HX1RBRywgIlNlYXJjaCBzdWdnZXN0aW9ucyBjdXJzb3IgdGhyZXcgZXhjZXB0aW9uLiIsIGUpOworICAgICAgICAgICAgLy8gUHV0IGV4Y2VwdGlvbiBzdHJpbmcgaW4gaXRlbSB0aXRsZQorICAgICAgICAgICAgVmlldyB2ID0gbmV3VmlldyhtQ29udGV4dCwgbUN1cnNvciwgcGFyZW50KTsKKyAgICAgICAgICAgIGlmICh2ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBDaGlsZFZpZXdDYWNoZSB2aWV3cyA9IChDaGlsZFZpZXdDYWNoZSkgdi5nZXRUYWcoKTsKKyAgICAgICAgICAgICAgICBUZXh0VmlldyB0diA9IHZpZXdzLm1UZXh0MTsKKyAgICAgICAgICAgICAgICB0di5zZXRUZXh0KGUudG9TdHJpbmcoKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gdjsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgYSBkcmF3YWJsZSBnaXZlbiBhIHZhbHVlIHByb3ZpZGVkIGJ5IGEgc3VnZ2VzdGlvbiBwcm92aWRlci4KKyAgICAgKgorICAgICAqIFRoaXMgdmFsdWUgY291bGQgYmUganVzdCB0aGUgc3RyaW5nIHZhbHVlIG9mIGEgcmVzb3VyY2UgaWQKKyAgICAgKiAoZS5nLiwgIjIxMzA4Mzc1MjQiKSwgaW4gd2hpY2ggY2FzZSB3ZSB3aWxsIHRyeSB0byByZXRyaWV2ZSBhIGRyYXdhYmxlIGZyb20KKyAgICAgKiB0aGUgcHJvdmlkZXIncyByZXNvdXJjZXMuIElmIHRoZSB2YWx1ZSBpcyBub3QgYW4gaW50ZWdlciwgaXQgaXMKKyAgICAgKiB0cmVhdGVkIGFzIGEgVXJpIGFuZCBvcGVuZWQgd2l0aAorICAgICAqIHtAbGluayBDb250ZW50UmVzb2x2ZXIjb3Blbk91dHB1dFN0cmVhbShhbmRyb2lkLm5ldC5VcmksIFN0cmluZyl9LgorICAgICAqCisgICAgICogQWxsIHJlc291cmNlcyBhbmQgVVJJcyBhcmUgcmVhZCB1c2luZyB0aGUgc3VnZ2VzdGlvbiBwcm92aWRlcidzIGNvbnRleHQuCisgICAgICoKKyAgICAgKiBJZiB0aGUgc3RyaW5nIGlzIG5vdCBmb3JtYXR0ZWQgYXMgZXhwZWN0ZWQsIG9yIG5vIGRyYXdhYmxlIGNhbiBiZSBmb3VuZCBmb3IKKyAgICAgKiB0aGUgcHJvdmlkZWQgdmFsdWUsIHRoaXMgbWV0aG9kIHJldHVybnMgbnVsbC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBkcmF3YWJsZUlkIGEgc3RyaW5nIGxpa2UgIjIxMzA4Mzc1MjQiLAorICAgICAqICAgICAgICAiYW5kcm9pZC5yZXNvdXJjZTovL2NvbS5hbmRyb2lkLmFsYXJtY2xvY2svMjEzMDgzNzUyNCIsCisgICAgICogICAgICAgIG9yICJjb250ZW50Oi8vY29udGFjdHMvcGhvdG9zLzI1MyIuCisgICAgICogQHJldHVybiBhIERyYXdhYmxlLCBvciBudWxsIGlmIG5vbmUgZm91bmQKKyAgICAgKi8KKyAgICBwcml2YXRlIERyYXdhYmxlIGdldERyYXdhYmxlRnJvbVJlc291cmNlVmFsdWUoU3RyaW5nIGRyYXdhYmxlSWQpIHsKKyAgICAgICAgaWYgKGRyYXdhYmxlSWQgPT0gbnVsbCB8fCBkcmF3YWJsZUlkLmxlbmd0aCgpID09IDAgfHwgIjAiLmVxdWFscyhkcmF3YWJsZUlkKSkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIEZpcnN0LCBzZWUgaWYgaXQncyBqdXN0IGFuIGludGVnZXIKKyAgICAgICAgICAgIGludCByZXNvdXJjZUlkID0gSW50ZWdlci5wYXJzZUludChkcmF3YWJsZUlkKTsKKyAgICAgICAgICAgIC8vIEl0J3MgYW4gaW50LCBsb29rIGZvciBpdCBpbiB0aGUgY2FjaGUKKyAgICAgICAgICAgIFN0cmluZyBkcmF3YWJsZVVyaSA9IENvbnRlbnRSZXNvbHZlci5TQ0hFTUVfQU5EUk9JRF9SRVNPVVJDRQorICAgICAgICAgICAgICAgICAgICArICI6Ly8iICsgbVByb3ZpZGVyQ29udGV4dC5nZXRQYWNrYWdlTmFtZSgpICsgIi8iICsgcmVzb3VyY2VJZDsKKyAgICAgICAgICAgIC8vIE11c3QgdXNlIFVSSSBhcyBjYWNoZSBrZXksIHNpbmNlIGludHMgYXJlIGFwcC1zcGVjaWZpYworICAgICAgICAgICAgRHJhd2FibGUgZHJhd2FibGUgPSBjaGVja0ljb25DYWNoZShkcmF3YWJsZVVyaSk7CisgICAgICAgICAgICBpZiAoZHJhd2FibGUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHJldHVybiBkcmF3YWJsZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIE5vdCBjYWNoZWQsIGZpbmQgaXQgYnkgcmVzb3VyY2UgSUQKKyAgICAgICAgICAgIGRyYXdhYmxlID0gbVByb3ZpZGVyQ29udGV4dC5nZXRSZXNvdXJjZXMoKS5nZXREcmF3YWJsZShyZXNvdXJjZUlkKTsKKyAgICAgICAgICAgIC8vIFN0aWNrIGl0IGluIHRoZSBjYWNoZSwgdXNpbmcgdGhlIFVSSSBhcyBrZXkKKyAgICAgICAgICAgIHN0b3JlSW5JY29uQ2FjaGUoZHJhd2FibGVVcmksIGRyYXdhYmxlKTsKKyAgICAgICAgICAgIHJldHVybiBkcmF3YWJsZTsKKyAgICAgICAgfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIG5mZSkgeworICAgICAgICAgICAgLy8gSXQncyBub3QgYW4gaW50ZWdlciwgdXNlIGl0IGFzIGEgVVJJCisgICAgICAgICAgICBEcmF3YWJsZSBkcmF3YWJsZSA9IGNoZWNrSWNvbkNhY2hlKGRyYXdhYmxlSWQpOworICAgICAgICAgICAgaWYgKGRyYXdhYmxlICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZHJhd2FibGU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBVcmkgdXJpID0gVXJpLnBhcnNlKGRyYXdhYmxlSWQpOworICAgICAgICAgICAgZHJhd2FibGUgPSBnZXREcmF3YWJsZSh1cmkpOworICAgICAgICAgICAgc3RvcmVJbkljb25DYWNoZShkcmF3YWJsZUlkLCBkcmF3YWJsZSk7CisgICAgICAgICAgICByZXR1cm4gZHJhd2FibGU7CisgICAgICAgIH0gY2F0Y2ggKFJlc291cmNlcy5Ob3RGb3VuZEV4Y2VwdGlvbiBuZmUpIHsKKyAgICAgICAgICAgIC8vIEl0IHdhcyBhbiBpbnRlZ2VyLCBidXQgaXQgY291bGRuJ3QgYmUgZm91bmQsIGJhaWwgb3V0CisgICAgICAgICAgICBMb2cudyhMT0dfVEFHLCAiSWNvbiByZXNvdXJjZSBub3QgZm91bmQ6ICIgKyBkcmF3YWJsZUlkKTsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0cyBhIGRyYXdhYmxlIGJ5IFVSSSwgd2l0aG91dCB1c2luZyB0aGUgY2FjaGUuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIEEgZHJhd2FibGUsIG9yIHtAY29kZSBudWxsfSBpZiB0aGUgZHJhd2FibGUgY291bGQgbm90IGJlIGxvYWRlZC4KKyAgICAgKi8KKyAgICBwcml2YXRlIERyYXdhYmxlIGdldERyYXdhYmxlKFVyaSB1cmkpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIFN0cmluZyBzY2hlbWUgPSB1cmkuZ2V0U2NoZW1lKCk7CisgICAgICAgICAgICBpZiAoQ29udGVudFJlc29sdmVyLlNDSEVNRV9BTkRST0lEX1JFU09VUkNFLmVxdWFscyhzY2hlbWUpKSB7CisgICAgICAgICAgICAgICAgLy8gTG9hZCBkcmF3YWJsZXMgdGhyb3VnaCBSZXNvdXJjZXMsIHRvIGdldCB0aGUgc291cmNlIGRlbnNpdHkgaW5mb3JtYXRpb24KKyAgICAgICAgICAgICAgICBPcGVuUmVzb3VyY2VJZFJlc3VsdCByID0KKyAgICAgICAgICAgICAgICAgICAgbVByb3ZpZGVyQ29udGV4dC5nZXRDb250ZW50UmVzb2x2ZXIoKS5nZXRSZXNvdXJjZUlkKHVyaSk7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHIuci5nZXREcmF3YWJsZShyLmlkKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChSZXNvdXJjZXMuTm90Rm91bmRFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEZpbGVOb3RGb3VuZEV4Y2VwdGlvbigiUmVzb3VyY2UgZG9lcyBub3QgZXhpc3Q6ICIgKyB1cmkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLy8gTGV0IHRoZSBDb250ZW50UmVzb2x2ZXIgaGFuZGxlIGNvbnRlbnQgYW5kIGZpbGUgVVJJcy4KKyAgICAgICAgICAgICAgICBJbnB1dFN0cmVhbSBzdHJlYW0gPSBtUHJvdmlkZXJDb250ZXh0LmdldENvbnRlbnRSZXNvbHZlcigpLm9wZW5JbnB1dFN0cmVhbSh1cmkpOworICAgICAgICAgICAgICAgIGlmIChzdHJlYW0gPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRmlsZU5vdEZvdW5kRXhjZXB0aW9uKCJGYWlsZWQgdG8gb3BlbiAiICsgdXJpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIERyYXdhYmxlLmNyZWF0ZUZyb21TdHJlYW0oc3RyZWFtLCBudWxsKTsKKyAgICAgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtLmNsb3NlKCk7CisgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBMb2cuZShMT0dfVEFHLCAiRXJyb3IgY2xvc2luZyBpY29uIHN0cmVhbSBmb3IgIiArIHVyaSwgZXgpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gZm5mZSkgeworICAgICAgICAgICAgTG9nLncoTE9HX1RBRywgIkljb24gbm90IGZvdW5kOiAiICsgdXJpICsgIiwgIiArIGZuZmUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBEcmF3YWJsZSBjaGVja0ljb25DYWNoZShTdHJpbmcgcmVzb3VyY2VVcmkpIHsKKyAgICAgICAgRHJhd2FibGUuQ29uc3RhbnRTdGF0ZSBjYWNoZWQgPSBtT3V0c2lkZURyYXdhYmxlc0NhY2hlLmdldChyZXNvdXJjZVVyaSk7CisgICAgICAgIGlmIChjYWNoZWQgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICAgICAgaWYgKERCRykgTG9nLmQoTE9HX1RBRywgIkZvdW5kIGljb24gaW4gY2FjaGU6ICIgKyByZXNvdXJjZVVyaSk7CisgICAgICAgIHJldHVybiBjYWNoZWQubmV3RHJhd2FibGUoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgc3RvcmVJbkljb25DYWNoZShTdHJpbmcgcmVzb3VyY2VVcmksIERyYXdhYmxlIGRyYXdhYmxlKSB7CisgICAgICAgIGlmIChkcmF3YWJsZSAhPSBudWxsKSB7CisgICAgICAgICAgICBtT3V0c2lkZURyYXdhYmxlc0NhY2hlLnB1dChyZXNvdXJjZVVyaSwgZHJhd2FibGUuZ2V0Q29uc3RhbnRTdGF0ZSgpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIGxlZnQtaGFuZCBzaWRlIGljb24gdGhhdCB3aWxsIGJlIHVzZWQgZm9yIHRoZSBjdXJyZW50IHN1Z2dlc3Rpb24KKyAgICAgKiBpZiB0aGUgc3VnZ2VzdGlvbiBjb250YWlucyBhbiBpY29uIGNvbHVtbiBidXQgbm8gaWNvbiBvciBhIGJyb2tlbiBpY29uLgorICAgICAqCisgICAgICogQHBhcmFtIGN1cnNvciBBIGN1cnNvciBwb3NpdGlvbmVkIGF0IHRoZSBjdXJyZW50IHN1Z2dlc3Rpb24uCisgICAgICogQHJldHVybiBBIG5vbi1udWxsIGRyYXdhYmxlLgorICAgICAqLworICAgIHByaXZhdGUgRHJhd2FibGUgZ2V0RGVmYXVsdEljb24xKEN1cnNvciBjdXJzb3IpIHsKKyAgICAgICAgLy8gRmlyc3QgY2hlY2sgdGhlIGNvbXBvbmVudCB0aGF0IHRoZSBzdWdnZXN0aW9uIGlzIG9yaWdpbmFsbHkgZnJvbQorICAgICAgICBTdHJpbmcgYyA9IGdldENvbHVtblN0cmluZyhjdXJzb3IsIFNlYXJjaE1hbmFnZXIuU1VHR0VTVF9DT0xVTU5fSU5URU5UX0NPTVBPTkVOVF9OQU1FKTsKKyAgICAgICAgaWYgKGMgIT0gbnVsbCkgeworICAgICAgICAgICAgQ29tcG9uZW50TmFtZSBjb21wb25lbnQgPSBDb21wb25lbnROYW1lLnVuZmxhdHRlbkZyb21TdHJpbmcoYyk7CisgICAgICAgICAgICBpZiAoY29tcG9uZW50ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBEcmF3YWJsZSBkcmF3YWJsZSA9IGdldEFjdGl2aXR5SWNvbldpdGhDYWNoZShjb21wb25lbnQpOworICAgICAgICAgICAgICAgIGlmIChkcmF3YWJsZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBkcmF3YWJsZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIExvZy53KExPR19UQUcsICJCYWQgY29tcG9uZW50IG5hbWU6ICIgKyBjKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIFRoZW4gY2hlY2sgdGhlIGNvbXBvbmVudCB0aGF0IGdhdmUgdXMgdGhlIHN1Z2dlc3Rpb24KKyAgICAgICAgRHJhd2FibGUgZHJhd2FibGUgPSBnZXRBY3Rpdml0eUljb25XaXRoQ2FjaGUobVNlYXJjaGFibGUuZ2V0U2VhcmNoQWN0aXZpdHkoKSk7CisgICAgICAgIGlmIChkcmF3YWJsZSAhPSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gZHJhd2FibGU7CisgICAgICAgIH0KKworICAgICAgICAvLyBGYWxsIGJhY2sgdG8gYSBkZWZhdWx0IGljb24KKyAgICAgICAgcmV0dXJuIG1Db250ZXh0LmdldFBhY2thZ2VNYW5hZ2VyKCkuZ2V0RGVmYXVsdEFjdGl2aXR5SWNvbigpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIGFjdGl2aXR5IG9yIGFwcGxpY2F0aW9uIGljb24gZm9yIGFuIGFjdGl2aXR5LgorICAgICAqIFVzZXMgdGhlIGxvY2FsIGljb24gY2FjaGUgZm9yIGZhc3QgcmVwZWF0ZWQgbG9va3Vwcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb21wb25lbnQgTmFtZSBvZiBhbiBhY3Rpdml0eS4KKyAgICAgKiBAcmV0dXJuIEEgZHJhd2FibGUsIG9yIHtAY29kZSBudWxsfSBpZiBuZWl0aGVyIHRoZSBhY3Rpdml0eSBub3IgdGhlIGFwcGxpY2F0aW9uCisgICAgICogICAgICAgICBoYXMgYW4gaWNvbiBzZXQuCisgICAgICovCisgICAgcHJpdmF0ZSBEcmF3YWJsZSBnZXRBY3Rpdml0eUljb25XaXRoQ2FjaGUoQ29tcG9uZW50TmFtZSBjb21wb25lbnQpIHsKKyAgICAgICAgLy8gRmlyc3QgY2hlY2sgdGhlIGljb24gY2FjaGUKKyAgICAgICAgU3RyaW5nIGNvbXBvbmVudEljb25LZXkgPSBjb21wb25lbnQuZmxhdHRlblRvU2hvcnRTdHJpbmcoKTsKKyAgICAgICAgLy8gVXNpbmcgY29udGFpbnNLZXkoKSBzaW5jZSB3ZSBhbHNvIHN0b3JlIG51bGwgdmFsdWVzLgorICAgICAgICBpZiAobU91dHNpZGVEcmF3YWJsZXNDYWNoZS5jb250YWluc0tleShjb21wb25lbnRJY29uS2V5KSkgeworICAgICAgICAgICAgRHJhd2FibGUuQ29uc3RhbnRTdGF0ZSBjYWNoZWQgPSBtT3V0c2lkZURyYXdhYmxlc0NhY2hlLmdldChjb21wb25lbnRJY29uS2V5KTsKKyAgICAgICAgICAgIHJldHVybiBjYWNoZWQgPT0gbnVsbCA/IG51bGwgOiBjYWNoZWQubmV3RHJhd2FibGUobVByb3ZpZGVyQ29udGV4dC5nZXRSZXNvdXJjZXMoKSk7CisgICAgICAgIH0KKyAgICAgICAgLy8gVGhlbiB0cnkgdGhlIGFjdGl2aXR5IG9yIGFwcGxpY2F0aW9uIGljb24KKyAgICAgICAgRHJhd2FibGUgZHJhd2FibGUgPSBnZXRBY3Rpdml0eUljb24oY29tcG9uZW50KTsKKyAgICAgICAgLy8gU3RpY2sgaXQgaW4gdGhlIGNhY2hlIHNvIHdlIGRvbid0IGRvIHRoaXMgbG9va3VwIGFnYWluLgorICAgICAgICBEcmF3YWJsZS5Db25zdGFudFN0YXRlIHRvQ2FjaGUgPSBkcmF3YWJsZSA9PSBudWxsID8gbnVsbCA6IGRyYXdhYmxlLmdldENvbnN0YW50U3RhdGUoKTsKKyAgICAgICAgbU91dHNpZGVEcmF3YWJsZXNDYWNoZS5wdXQoY29tcG9uZW50SWNvbktleSwgdG9DYWNoZSk7CisgICAgICAgIHJldHVybiBkcmF3YWJsZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSBhY3Rpdml0eSBvciBhcHBsaWNhdGlvbiBpY29uIGZvciBhbiBhY3Rpdml0eS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb21wb25lbnQgTmFtZSBvZiBhbiBhY3Rpdml0eS4KKyAgICAgKiBAcmV0dXJuIEEgZHJhd2FibGUsIG9yIHtAY29kZSBudWxsfSBpZiBuZWl0aGVyIHRoZSBhY2l0aXZ5IG9yIHRoZSBhcHBsaWNhdGlvbgorICAgICAqICAgICAgICAgaGF2ZSBhbiBpY29uIHNldC4KKyAgICAgKi8KKyAgICBwcml2YXRlIERyYXdhYmxlIGdldEFjdGl2aXR5SWNvbihDb21wb25lbnROYW1lIGNvbXBvbmVudCkgeworICAgICAgICBQYWNrYWdlTWFuYWdlciBwbSA9IG1Db250ZXh0LmdldFBhY2thZ2VNYW5hZ2VyKCk7CisgICAgICAgIGZpbmFsIEFjdGl2aXR5SW5mbyBhY3Rpdml0eUluZm87CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBhY3Rpdml0eUluZm8gPSBwbS5nZXRBY3Rpdml0eUluZm8oY29tcG9uZW50LCBQYWNrYWdlTWFuYWdlci5HRVRfTUVUQV9EQVRBKTsKKyAgICAgICAgfSBjYXRjaCAoTmFtZU5vdEZvdW5kRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICBMb2cudyhMT0dfVEFHLCBleC50b1N0cmluZygpKTsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgICAgIGludCBpY29uSWQgPSBhY3Rpdml0eUluZm8uZ2V0SWNvblJlc291cmNlKCk7CisgICAgICAgIGlmIChpY29uSWQgPT0gMCkgcmV0dXJuIG51bGw7CisgICAgICAgIFN0cmluZyBwa2cgPSBjb21wb25lbnQuZ2V0UGFja2FnZU5hbWUoKTsKKyAgICAgICAgRHJhd2FibGUgZHJhd2FibGUgPSBwbS5nZXREcmF3YWJsZShwa2csIGljb25JZCwgYWN0aXZpdHlJbmZvLmFwcGxpY2F0aW9uSW5mbyk7CisgICAgICAgIGlmIChkcmF3YWJsZSA9PSBudWxsKSB7CisgICAgICAgICAgICBMb2cudyhMT0dfVEFHLCAiSW52YWxpZCBpY29uIHJlc291cmNlICIgKyBpY29uSWQgKyAiIGZvciAiCisgICAgICAgICAgICAgICAgICAgICsgY29tcG9uZW50LmZsYXR0ZW5Ub1Nob3J0U3RyaW5nKCkpOworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGRyYXdhYmxlOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIHZhbHVlIG9mIGEgc3RyaW5nIGNvbHVtbiBieSBuYW1lLgorICAgICAqCisgICAgICogQHBhcmFtIGN1cnNvciBDdXJzb3IgdG8gcmVhZCB0aGUgdmFsdWUgZnJvbS4KKyAgICAgKiBAcGFyYW0gY29sdW1uTmFtZSBUaGUgbmFtZSBvZiB0aGUgY29sdW1uIHRvIHJlYWQuCisgICAgICogQHJldHVybiBUaGUgdmFsdWUgb2YgdGhlIGdpdmVuIGNvbHVtbiwgb3IgPGNvZGU+bnVsbDwvbnVsbD4KKyAgICAgKiAgICAgICAgIGlmIHRoZSBjdXJzb3IgZG9lcyBub3QgY29udGFpbiB0aGUgZ2l2ZW4gY29sdW1uLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldENvbHVtblN0cmluZyhDdXJzb3IgY3Vyc29yLCBTdHJpbmcgY29sdW1uTmFtZSkgeworICAgICAgICBpbnQgY29sID0gY3Vyc29yLmdldENvbHVtbkluZGV4KGNvbHVtbk5hbWUpOworICAgICAgICByZXR1cm4gZ2V0U3RyaW5nT3JOdWxsKGN1cnNvciwgY29sKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0U3RyaW5nT3JOdWxsKEN1cnNvciBjdXJzb3IsIGludCBjb2wpIHsKKyAgICAgICAgaWYgKGNvbCA9PSBOT05FKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuIGN1cnNvci5nZXRTdHJpbmcoY29sKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIExvZy5lKExPR19UQUcsCisgICAgICAgICAgICAgICAgICAgICJ1bmV4cGVjdGVkIGVycm9yIHJldHJpZXZpbmcgdmFsaWQgY29sdW1uIGZyb20gY3Vyc29yLCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiZGlkIHRoZSByZW1vdGUgcHJvY2VzcyBkaWU/IiwgZSk7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9UZXh0Vmlldy5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L1RleHRWaWV3LmphdmEKaW5kZXggMjE5YmRmOS4uMmZiMmQ2ZCAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L1RleHRWaWV3LmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L1RleHRWaWV3LmphdmEKQEAgLTIxLDggKzIxLDkgQEAKIAogaW1wb3J0IG9yZy54bWxwdWxsLnYxLlhtbFB1bGxQYXJzZXJFeGNlcHRpb247CiAKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ2xpcERhdGE7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNsaXBib2FyZE1hbmFnZXI7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uUGFja2FnZU1hbmFnZXI7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5Db2xvclN0YXRlTGlzdDsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlJlc291cmNlczsKQEAgLTM2LDYgKzM3LDcgQEAKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlR5cGVmYWNlOwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuRHJhd2FibGU7CiBpbXBvcnQgYW5kcm9pZC5pbnB1dG1ldGhvZHNlcnZpY2UuRXh0cmFjdEVkaXRUZXh0OworaW1wb3J0IGFuZHJvaWQubmV0LlVyaTsKIGltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKIGltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXI7CiBpbXBvcnQgYW5kcm9pZC5vcy5NZXNzYWdlOwpAQCAtNDQsNyArNDYsNiBAQAogaW1wb3J0IGFuZHJvaWQub3MuUmVzdWx0UmVjZWl2ZXI7CiBpbXBvcnQgYW5kcm9pZC5vcy5TeXN0ZW1DbG9jazsKIGltcG9ydCBhbmRyb2lkLnRleHQuQm9yaW5nTGF5b3V0OwotaW1wb3J0IGFuZHJvaWQudGV4dC5DbGlwYm9hcmRNYW5hZ2VyOwogaW1wb3J0IGFuZHJvaWQudGV4dC5EeW5hbWljTGF5b3V0OwogaW1wb3J0IGFuZHJvaWQudGV4dC5FZGl0YWJsZTsKIGltcG9ydCBhbmRyb2lkLnRleHQuR2V0Q2hhcnM7CkBAIC04NSwxMCArODYsMTMgQEAKIGltcG9ydCBhbmRyb2lkLnV0aWwuRmxvYXRNYXRoOwogaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CiBpbXBvcnQgYW5kcm9pZC51dGlsLlR5cGVkVmFsdWU7CitpbXBvcnQgYW5kcm9pZC52aWV3LkFjdGlvbk1vZGU7CiBpbXBvcnQgYW5kcm9pZC52aWV3LkNvbnRleHRNZW51OwogaW1wb3J0IGFuZHJvaWQudmlldy5HcmF2aXR5OworaW1wb3J0IGFuZHJvaWQudmlldy5IYXB0aWNGZWVkYmFja0NvbnN0YW50czsKIGltcG9ydCBhbmRyb2lkLnZpZXcuS2V5RXZlbnQ7CiBpbXBvcnQgYW5kcm9pZC52aWV3LkxheW91dEluZmxhdGVyOworaW1wb3J0IGFuZHJvaWQudmlldy5NZW51OwogaW1wb3J0IGFuZHJvaWQudmlldy5NZW51SXRlbTsKIGltcG9ydCBhbmRyb2lkLnZpZXcuTW90aW9uRXZlbnQ7CiBpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CkBAIC0xOTIsOCArMTk2LDkgQEAKICAgICBzdGF0aWMgZmluYWwgU3RyaW5nIExPR19UQUcgPSAiVGV4dFZpZXciOwogICAgIHN0YXRpYyBmaW5hbCBib29sZWFuIERFQlVHX0VYVFJBQ1QgPSBmYWxzZTsKICAgICAKLSAgICBwcml2YXRlIHN0YXRpYyBpbnQgUFJJT1JJVFkgPSAxMDA7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFBSSU9SSVRZID0gMTAwOwogCisgICAgcHJpdmF0ZSBpbnQgbUN1cnJlbnRBbHBoYSA9IDI1NTsgICAgCiAgICAgcHJpdmF0ZSBDb2xvclN0YXRlTGlzdCBtVGV4dENvbG9yOwogICAgIHByaXZhdGUgaW50IG1DdXJUZXh0Q29sb3I7CiAgICAgcHJpdmF0ZSBDb2xvclN0YXRlTGlzdCBtSGludFRleHRDb2xvcjsKQEAgLTI3OTcsNiArMjgwMiwxNCBAQAogICAgICAgICAgICAgYy5kcmF3VGV4dChtQ2hhcnMsIHN0YXJ0ICsgbVN0YXJ0LCBlbmQgLSBzdGFydCwgeCwgeSwgcCk7CiAgICAgICAgIH0KIAorICAgICAgICBwdWJsaWMgdm9pZCBkcmF3VGV4dFJ1bihDYW52YXMgYywgaW50IHN0YXJ0LCBpbnQgZW5kLAorICAgICAgICAgICAgICAgIGludCBjb250ZXh0U3RhcnQsIGludCBjb250ZXh0RW5kLCBmbG9hdCB4LCBmbG9hdCB5LCBpbnQgZmxhZ3MsIFBhaW50IHApIHsKKyAgICAgICAgICAgIGludCBjb3VudCA9IGVuZCAtIHN0YXJ0OworICAgICAgICAgICAgaW50IGNvbnRleHRDb3VudCA9IGNvbnRleHRFbmQgLSBjb250ZXh0U3RhcnQ7CisgICAgICAgICAgICBjLmRyYXdUZXh0UnVuKG1DaGFycywgc3RhcnQgKyBtU3RhcnQsIGNvdW50LCBjb250ZXh0U3RhcnQgKyBtU3RhcnQsCisgICAgICAgICAgICAgICAgICAgIGNvbnRleHRDb3VudCwgeCwgeSwgZmxhZ3MsIHApOworICAgICAgICB9CisKICAgICAgICAgcHVibGljIGZsb2F0IG1lYXN1cmVUZXh0KGludCBzdGFydCwgaW50IGVuZCwgUGFpbnQgcCkgewogICAgICAgICAgICAgcmV0dXJuIHAubWVhc3VyZVRleHQobUNoYXJzLCBzdGFydCArIG1TdGFydCwgZW5kIC0gc3RhcnQpOwogICAgICAgICB9CkBAIC0yODA0LDYgKzI4MTcsMjMgQEAKICAgICAgICAgcHVibGljIGludCBnZXRUZXh0V2lkdGhzKGludCBzdGFydCwgaW50IGVuZCwgZmxvYXRbXSB3aWR0aHMsIFBhaW50IHApIHsKICAgICAgICAgICAgIHJldHVybiBwLmdldFRleHRXaWR0aHMobUNoYXJzLCBzdGFydCArIG1TdGFydCwgZW5kIC0gc3RhcnQsIHdpZHRocyk7CiAgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgZmxvYXQgZ2V0VGV4dFJ1bkFkdmFuY2VzKGludCBzdGFydCwgaW50IGVuZCwgaW50IGNvbnRleHRTdGFydCwKKyAgICAgICAgICAgICAgICBpbnQgY29udGV4dEVuZCwgaW50IGZsYWdzLCBmbG9hdFtdIGFkdmFuY2VzLCBpbnQgYWR2YW5jZXNJbmRleCwKKyAgICAgICAgICAgICAgICBQYWludCBwKSB7CisgICAgICAgICAgICBpbnQgY291bnQgPSBlbmQgLSBzdGFydDsKKyAgICAgICAgICAgIGludCBjb250ZXh0Q291bnQgPSBjb250ZXh0RW5kIC0gY29udGV4dFN0YXJ0OworICAgICAgICAgICAgcmV0dXJuIHAuZ2V0VGV4dFJ1bkFkdmFuY2VzKG1DaGFycywgc3RhcnQgKyBtU3RhcnQsIGNvdW50LAorICAgICAgICAgICAgICAgICAgICBjb250ZXh0U3RhcnQgKyBtU3RhcnQsIGNvbnRleHRDb3VudCwgZmxhZ3MsIGFkdmFuY2VzLAorICAgICAgICAgICAgICAgICAgICBhZHZhbmNlc0luZGV4KTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBpbnQgZ2V0VGV4dFJ1bkN1cnNvcihpbnQgY29udGV4dFN0YXJ0LCBpbnQgY29udGV4dEVuZCwgaW50IGZsYWdzLAorICAgICAgICAgICAgICAgIGludCBvZmZzZXQsIGludCBjdXJzb3JPcHQsIFBhaW50IHApIHsKKyAgICAgICAgICAgIGludCBjb250ZXh0Q291bnQgPSBjb250ZXh0RW5kIC0gY29udGV4dFN0YXJ0OworICAgICAgICAgICAgcmV0dXJuIHAuZ2V0VGV4dFJ1bkN1cnNvcihtQ2hhcnMsIGNvbnRleHRTdGFydCArIG1TdGFydCwKKyAgICAgICAgICAgICAgICAgICAgY29udGV4dENvdW50LCBmbGFncywgb2Zmc2V0ICsgbVN0YXJ0LCBjdXJzb3JPcHQpOworICAgICAgICB9CiAgICAgfQogCiAgICAgLyoqCkBAIC0zNzE2LDcgKzM3NDYsNyBAQAogICAgICAgICAvLyAgIGFsbG93IHRvIHRlc3QgZm9yIGhhc1NlbGVjdGlvbiBpbiBvbkZvY3VzQ2hhbmdlZCwgd2hpY2ggd291bGQgdHJpZ2dlciBhCiAgICAgICAgIC8vICAgc3RhcnRUZXh0U2VsZWN0aW9uTW9kZSBoZXJlLiBUT0RPCiAgICAgICAgIGlmIChzZWxlY3Rpb25Db250cm9sbGVyICE9IG51bGwgJiYgaGFzU2VsZWN0aW9uKCkpIHsKLSAgICAgICAgICAgIHN0YXJ0VGV4dFNlbGVjdGlvbk1vZGUoKTsKKyAgICAgICAgICAgIHN0YXJ0U2VsZWN0aW9uQWN0aW9uTW9kZSgpOwogICAgICAgICB9CiAKICAgICAgICAgbVByZURyYXdTdGF0ZSA9IFBSRURSQVdfRE9ORTsKQEAgLTM4MzgsNiArMzg2OCwyMiBAQAogICAgIH0KIAogICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBib29sZWFuIG9uU2V0QWxwaGEoaW50IGFscGhhKSB7CisgICAgICAgIGlmIChtTW92ZW1lbnQgPT0gbnVsbCAmJiBnZXRCYWNrZ3JvdW5kKCkgPT0gbnVsbCkgeworICAgICAgICAgICAgbUN1cnJlbnRBbHBoYSA9IGFscGhhOworICAgICAgICAgICAgZmluYWwgRHJhd2FibGVzIGRyID0gbURyYXdhYmxlczsKKyAgICAgICAgICAgIGlmIChkciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgaWYgKGRyLm1EcmF3YWJsZUxlZnQgIT0gbnVsbCkgZHIubURyYXdhYmxlTGVmdC5zZXRBbHBoYShhbHBoYSk7CisgICAgICAgICAgICAgICAgaWYgKGRyLm1EcmF3YWJsZVRvcCAhPSBudWxsKSBkci5tRHJhd2FibGVUb3Auc2V0QWxwaGEoYWxwaGEpOworICAgICAgICAgICAgICAgIGlmIChkci5tRHJhd2FibGVSaWdodCAhPSBudWxsKSBkci5tRHJhd2FibGVSaWdodC5zZXRBbHBoYShhbHBoYSk7CisgICAgICAgICAgICAgICAgaWYgKGRyLm1EcmF3YWJsZUJvdHRvbSAhPSBudWxsKSBkci5tRHJhd2FibGVCb3R0b20uc2V0QWxwaGEoYWxwaGEpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIEBPdmVycmlkZQogICAgIHByb3RlY3RlZCB2b2lkIG9uRHJhdyhDYW52YXMgY2FudmFzKSB7CiAgICAgICAgIHJlc3RhcnRNYXJxdWVlSWZOZWVkZWQoKTsKIApAQCAtMzkzNCw2ICszOTgwLDcgQEAKICAgICAgICAgfQogCiAgICAgICAgIG1UZXh0UGFpbnQuc2V0Q29sb3IoY29sb3IpOworICAgICAgICBtVGV4dFBhaW50LnNldEFscGhhKG1DdXJyZW50QWxwaGEpOwogICAgICAgICBtVGV4dFBhaW50LmRyYXdhYmxlU3RhdGUgPSBnZXREcmF3YWJsZVN0YXRlKCk7CiAKICAgICAgICAgY2FudmFzLnNhdmUoKTsKQEAgLTQzMTcsOCArNDM2NCw4IEBACiAKICAgICAgICAgICAgICAgICAvLyBIYXMgdG8gYmUgZG9uZSBvbiBrZXkgZG93biAoYW5kIG5vdCBvbiBrZXkgdXApIHRvIGNvcnJlY3RseSBiZSBpbnRlcmNlcHRlZC4KICAgICAgICAgICAgIGNhc2UgS2V5RXZlbnQuS0VZQ09ERV9CQUNLOgotICAgICAgICAgICAgICAgIGlmIChtSXNJblRleHRTZWxlY3Rpb25Nb2RlKSB7Ci0gICAgICAgICAgICAgICAgICAgIHN0b3BUZXh0U2VsZWN0aW9uTW9kZSgpOworICAgICAgICAgICAgICAgIGlmIChtU2VsZWN0aW9uQWN0aW9uTW9kZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIHN0b3BTZWxlY3Rpb25BY3Rpb25Nb2RlKCk7CiAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgYnJlYWs7CkBAIC00ODE0LDcgKzQ4NjEsNyBAQAogICAgICAgICAgICAgICAgIG1ha2VCbGluaygpOwogICAgICAgICAgICAgfQogICAgICAgICB9Ci0gICAgICAgIAorCiAgICAgICAgIGNoZWNrRm9yUmVzaXplKCk7CiAgICAgfQogICAgIApAQCAtNDkwNSw2ICs0OTUyLDggQEAKICAgICAgICAgICAgICAgICBicmVhazsKIAogICAgICAgICAgICAgY2FzZSBHcmF2aXR5LlJJR0hUOgorICAgICAgICAgICAgICAgIC8vIE5vdGUsIExheW91dCByZXNvbHZlcyBBTElHTl9PUFBPU0lURSB0byBsZWZ0IG9yCisgICAgICAgICAgICAgICAgLy8gcmlnaHQgYmFzZWQgb24gdGhlIHBhcmFncmFwaCBkaXJlY3Rpb24uCiAgICAgICAgICAgICAgICAgYWxpZ25tZW50ID0gTGF5b3V0LkFsaWdubWVudC5BTElHTl9PUFBPU0lURTsKICAgICAgICAgICAgICAgICBicmVhazsKIApAQCAtNTA2OSw2ICs1MTE4LDggQEAKICAgICB9CiAKICAgICBwcml2YXRlIGJvb2xlYW4gY29tcHJlc3NUZXh0KGZsb2F0IHdpZHRoKSB7CisgICAgICAgIGlmIChpc0hhcmR3YXJlQWNjZWxlcmF0ZWQoKSkgcmV0dXJuIGZhbHNlOworICAgICAgICAKICAgICAgICAgLy8gT25seSBjb21wcmVzcyB0aGUgdGV4dCBpZiBpdCBoYXNuJ3QgYmVlbiBjb21wcmVzc2VkIGJ5IHRoZSBwcmV2aW91cyBwYXNzCiAgICAgICAgIGlmICh3aWR0aCA+IDAuMGYgJiYgbUxheW91dCAhPSBudWxsICYmIGdldExpbmVDb3VudCgpID09IDEgJiYgIW1Vc2VyU2V0VGV4dFNjYWxlWCAmJgogICAgICAgICAgICAgICAgIG1UZXh0UGFpbnQuZ2V0VGV4dFNjYWxlWCgpID09IDEuMGYpIHsKQEAgLTU3MjksMTEgKzU3ODAsMTUgQEAKICAgICAgICAgZmluYWwgaW50IGxlZnRDaGFyID0gbUxheW91dC5nZXRPZmZzZXRGb3JIb3Jpem9udGFsKGxpbmUsIGhzKTsKICAgICAgICAgZmluYWwgaW50IHJpZ2h0Q2hhciA9IG1MYXlvdXQuZ2V0T2Zmc2V0Rm9ySG9yaXpvbnRhbChsaW5lLCBoc3BhY2UraHMpOwogICAgICAgICAKKyAgICAgICAgLy8gbGluZSBtaWdodCBjb250YWluIGJpZGlyZWN0aW9uYWwgdGV4dAorICAgICAgICBmaW5hbCBpbnQgbG93Q2hhciA9IGxlZnRDaGFyIDwgcmlnaHRDaGFyID8gbGVmdENoYXIgOiByaWdodENoYXI7CisgICAgICAgIGZpbmFsIGludCBoaWdoQ2hhciA9IGxlZnRDaGFyID4gcmlnaHRDaGFyID8gbGVmdENoYXIgOiByaWdodENoYXI7CisKICAgICAgICAgaW50IG5ld1N0YXJ0ID0gc3RhcnQ7Ci0gICAgICAgIGlmIChuZXdTdGFydCA8IGxlZnRDaGFyKSB7Ci0gICAgICAgICAgICBuZXdTdGFydCA9IGxlZnRDaGFyOwotICAgICAgICB9IGVsc2UgaWYgKG5ld1N0YXJ0ID4gcmlnaHRDaGFyKSB7Ci0gICAgICAgICAgICBuZXdTdGFydCA9IHJpZ2h0Q2hhcjsKKyAgICAgICAgaWYgKG5ld1N0YXJ0IDwgbG93Q2hhcikgeworICAgICAgICAgICAgbmV3U3RhcnQgPSBsb3dDaGFyOworICAgICAgICB9IGVsc2UgaWYgKG5ld1N0YXJ0ID4gaGlnaENoYXIpIHsKKyAgICAgICAgICAgIG5ld1N0YXJ0ID0gaGlnaENoYXI7CiAgICAgICAgIH0KICAgICAgICAgCiAgICAgICAgIGlmIChuZXdTdGFydCAhPSBzdGFydCkgewpAQCAtNjU2MCwxMSArNjYxNSwxNCBAQAogCiAgICAgICAgICAgICBoaWRlSW5zZXJ0aW9uUG9pbnRDdXJzb3JDb250cm9sbGVyKCk7CiAgICAgICAgICAgICBpZiAodGhpcyBpbnN0YW5jZW9mIEV4dHJhY3RFZGl0VGV4dCkgewotICAgICAgICAgICAgICAgIC8vIHRlcm1pbmF0ZVRleHRTZWxlY3Rpb25Nb2RlIHdvdWxkIHJlbW92ZSBzZWxlY3Rpb24sIHdoaWNoIHdlIHdhbnQgdG8ga2VlcCB3aGVuCisgICAgICAgICAgICAgICAgLy8gdGVybWluYXRlVGV4dFNlbGVjdGlvbk1vZGUgcmVtb3ZlcyBzZWxlY3Rpb24sIHdoaWNoIHdlIHdhbnQgdG8ga2VlcCB3aGVuCiAgICAgICAgICAgICAgICAgLy8gRXh0cmFjdEVkaXRUZXh0IGdvZXMgb3V0IG9mIGZvY3VzLgotICAgICAgICAgICAgICAgIG1Jc0luVGV4dFNlbGVjdGlvbk1vZGUgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICBmaW5hbCBpbnQgc2VsU3RhcnQgPSBnZXRTZWxlY3Rpb25TdGFydCgpOworICAgICAgICAgICAgICAgIGZpbmFsIGludCBzZWxFbmQgPSBnZXRTZWxlY3Rpb25FbmQoKTsKKyAgICAgICAgICAgICAgICB0ZXJtaW5hdGVTZWxlY3Rpb25BY3Rpb25Nb2RlKCk7CisgICAgICAgICAgICAgICAgU2VsZWN0aW9uLnNldFNlbGVjdGlvbigoU3Bhbm5hYmxlKSBtVGV4dCwgc2VsU3RhcnQsIHNlbEVuZCk7CiAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHRlcm1pbmF0ZVRleHRTZWxlY3Rpb25Nb2RlKCk7CisgICAgICAgICAgICAgICAgdGVybWluYXRlU2VsZWN0aW9uQWN0aW9uTW9kZSgpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAKQEAgLTY2NDMsNyArNjcwMSw3IEBACiAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAvLyBUYXBwaW5nIG91dHNpZGUgc3RvcHMgc2VsZWN0aW9uIG1vZGUsIGlmIGFueQotICAgICAgICAgICAgICAgIHN0b3BUZXh0U2VsZWN0aW9uTW9kZSgpOworICAgICAgICAgICAgICAgIHN0b3BTZWxlY3Rpb25BY3Rpb25Nb2RlKCk7CiAKICAgICAgICAgICAgICAgICBpZiAobUluc2VydGlvblBvaW50Q3Vyc29yQ29udHJvbGxlciAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgIG1JbnNlcnRpb25Qb2ludEN1cnNvckNvbnRyb2xsZXIuc2hvdygpOwpAQCAtNjY1NCwxMyArNjcxMiwxMyBAQAogCiAgICAgY2xhc3MgQ29tbWl0U2VsZWN0aW9uUmVjZWl2ZXIgZXh0ZW5kcyBSZXN1bHRSZWNlaXZlciB7CiAgICAgICAgIHByaXZhdGUgZmluYWwgaW50IG1QcmV2U3RhcnQsIG1QcmV2RW5kOwotICAgICAgICAKKwogICAgICAgICBwdWJsaWMgQ29tbWl0U2VsZWN0aW9uUmVjZWl2ZXIoaW50IHByZXZTdGFydCwgaW50IHByZXZFbmQpIHsKICAgICAgICAgICAgIHN1cGVyKGdldEhhbmRsZXIoKSk7CiAgICAgICAgICAgICBtUHJldlN0YXJ0ID0gcHJldlN0YXJ0OwogICAgICAgICAgICAgbVByZXZFbmQgPSBwcmV2RW5kOwogICAgICAgICB9Ci0gICAgICAgIAorCiAgICAgICAgIEBPdmVycmlkZQogICAgICAgICBwcm90ZWN0ZWQgdm9pZCBvblJlY2VpdmVSZXN1bHQoaW50IHJlc3VsdENvZGUsIEJ1bmRsZSByZXN1bHREYXRhKSB7CiAgICAgICAgICAgICAvLyBJZiB0aGlzIHRhcCB3YXMgYWN0dWFsbHkgdXNlZCB0byBzaG93IHRoZSBJTU0sIGxlYXZlIGN1cnNvciBvciBzZWxlY3Rpb24gdW5jaGFuZ2VkCkBAIC02NjcyLDE0ICs2NzMwLDE0IEBACiAgICAgICAgICAgICAgICAgU2VsZWN0aW9uLnNldFNlbGVjdGlvbigoU3Bhbm5hYmxlKW1UZXh0LCBzdGFydCwgZW5kKTsKIAogICAgICAgICAgICAgICAgIGlmIChoYXNTZWxlY3Rpb24oKSkgewotICAgICAgICAgICAgICAgICAgICBzdGFydFRleHRTZWxlY3Rpb25Nb2RlKCk7CisgICAgICAgICAgICAgICAgICAgIHN0YXJ0U2VsZWN0aW9uQWN0aW9uTW9kZSgpOwogICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobUluc2VydGlvblBvaW50Q3Vyc29yQ29udHJvbGxlciAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgIG1JbnNlcnRpb25Qb2ludEN1cnNvckNvbnRyb2xsZXIuc2hvdygpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KLSAgICAKKwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBib29sZWFuIG9uVG91Y2hFdmVudChNb3Rpb25FdmVudCBldmVudCkgewogICAgICAgICBmaW5hbCBpbnQgYWN0aW9uID0gZXZlbnQuZ2V0QWN0aW9uTWFza2VkKCk7CkBAIC02NzE2LDcgKzY3NzQsNyBAQAogICAgICAgICAgICAgLy8gU2F2ZSBwcmV2aW91cyBzZWxlY3Rpb24sIGluIGNhc2UgdGhpcyBldmVudCBpcyB1c2VkIHRvIHNob3cgdGhlIElNRS4KICAgICAgICAgICAgIGludCBvbGRTZWxTdGFydCA9IGdldFNlbGVjdGlvblN0YXJ0KCk7CiAgICAgICAgICAgICBpbnQgb2xkU2VsRW5kID0gZ2V0U2VsZWN0aW9uRW5kKCk7Ci0gICAgICAgICAgICAKKwogICAgICAgICAgICAgaWYgKG1Nb3ZlbWVudCAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgaGFuZGxlZCB8PSBtTW92ZW1lbnQub25Ub3VjaEV2ZW50KHRoaXMsIChTcGFubmFibGUpIG1UZXh0LCBldmVudCk7CiAgICAgICAgICAgICB9CkBAIC02NzY0LDcgKzY4MjIsNyBAQAogICAgICAgICAgICAgfQogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgLy8gU3RvcCBzZWxlY3Rpb24gbW9kZSBpZiB0aGUgY29udHJvbGxlciBiZWNvbWVzIHVuYXZhaWxhYmxlLgotICAgICAgICAgICAgc3RvcFRleHRTZWxlY3Rpb25Nb2RlKCk7CisgICAgICAgICAgICBzdG9wU2VsZWN0aW9uQWN0aW9uTW9kZSgpOwogICAgICAgICAgICAgbVNlbGVjdGlvbk1vZGlmaWVyQ3Vyc29yQ29udHJvbGxlciA9IG51bGw7CiAgICAgICAgIH0KICAgICB9CkBAIC02OTA0LDggKzY5NjIsMTAgQEAKIAogICAgIEBPdmVycmlkZQogICAgIHByb3RlY3RlZCBpbnQgY29tcHV0ZUhvcml6b250YWxTY3JvbGxSYW5nZSgpIHsKLSAgICAgICAgaWYgKG1MYXlvdXQgIT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBtTGF5b3V0LmdldFdpZHRoKCk7CisgICAgICAgIGlmIChtTGF5b3V0ICE9IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBtU2luZ2xlTGluZSAmJiAobUdyYXZpdHkgJiBHcmF2aXR5LkhPUklaT05UQUxfR1JBVklUWV9NQVNLKSA9PSBHcmF2aXR5LkxFRlQgPworICAgICAgICAgICAgICAgICAgICAoaW50KSBtTGF5b3V0LmdldExpbmVXaWR0aCgwKSA6IG1MYXlvdXQuZ2V0V2lkdGgoKTsKKyAgICAgICAgfQogCiAgICAgICAgIHJldHVybiBzdXBlci5jb21wdXRlSG9yaXpvbnRhbFNjcm9sbFJhbmdlKCk7CiAgICAgfQpAQCAtNzA1Miw3ICs3MTEyLDcgQEAKICAgICAgICAgICAgICAgICBnZXRTZWxlY3Rpb25TdGFydCgpID49IDAgJiYKICAgICAgICAgICAgICAgICBnZXRTZWxlY3Rpb25FbmQoKSA+PSAwICYmCiAgICAgICAgICAgICAgICAgKChDbGlwYm9hcmRNYW5hZ2VyKWdldENvbnRleHQoKS5nZXRTeXN0ZW1TZXJ2aWNlKENvbnRleHQuQ0xJUEJPQVJEX1NFUlZJQ0UpKS4KLSAgICAgICAgICAgICAgICBoYXNUZXh0KCkpOworICAgICAgICAgICAgICAgIGhhc1ByaW1hcnlDbGlwKCkpOwogICAgIH0KIAogICAgIC8qKgpAQCAtNzE0NCw3ICs3MjA0LDcgQEAKICAgICAgICAgLy8gVHdvIGludHMgcGFja2VkIGluIGEgbG9uZwogICAgICAgICByZXR1cm4gKCgobG9uZykgc3RhcnQpIDw8IDMyKSB8IGVuZDsKICAgICB9Ci0gICAgCisKICAgICBwcml2YXRlIHZvaWQgc2VsZWN0Q3VycmVudFdvcmQoKSB7CiAgICAgICAgIC8vIEluIGNhc2Ugc2VsZWN0aW9uIG1vZGUgaXMgc3RhcnRlZCBhZnRlciBhbiBvcmllbnRhdGlvbiBjaGFuZ2Ugb3IgYWZ0ZXIgYSBzZWxlY3QgYWxsLAogICAgICAgICAvLyB1c2UgdGhlIGN1cnJlbnQgc2VsZWN0aW9uIGluc3RlYWQgb2YgY3JlYXRpbmcgb25lCkBAIC03MjE5LDIyICs3Mjc5LDcgQEAKIAogICAgICAgICBTZWxlY3Rpb24uc2V0U2VsZWN0aW9uKChTcGFubmFibGUpIG1UZXh0LCBzZWxlY3Rpb25TdGFydCwgc2VsZWN0aW9uRW5kKTsKICAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBTdHJpbmcgZ2V0V29yZEZvckRpY3Rpb25hcnkoKSB7Ci0gICAgICAgIGlmIChtTGFzdFRvdWNoT2Zmc2V0IDwgMCkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KIAotICAgICAgICBsb25nIHdvcmRMaW1pdHMgPSBnZXRXb3JkTGltaXRzQXQobUxhc3RUb3VjaE9mZnNldCk7Ci0gICAgICAgIGlmICh3b3JkTGltaXRzID49IDApIHsKLSAgICAgICAgICAgIGludCBzdGFydCA9IChpbnQpICh3b3JkTGltaXRzID4+PiAzMik7Ci0gICAgICAgICAgICBpbnQgZW5kID0gKGludCkgKHdvcmRMaW1pdHMgJiAweDAwMDAwMDAwRkZGRkZGRkZMKTsKLSAgICAgICAgICAgIHJldHVybiBtVHJhbnNmb3JtZWQuc3ViU2VxdWVuY2Uoc3RhcnQsIGVuZCkudG9TdHJpbmcoKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgfQotICAgIAogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBib29sZWFuIGRpc3BhdGNoUG9wdWxhdGVBY2Nlc3NpYmlsaXR5RXZlbnQoQWNjZXNzaWJpbGl0eUV2ZW50IGV2ZW50KSB7CiAgICAgICAgIGlmICghaXNTaG93bigpKSB7CkBAIC03Mjc2LDk4ICs3MzIxLDM0IEBACiAgICAgICAgIHN1cGVyLm9uQ3JlYXRlQ29udGV4dE1lbnUobWVudSk7CiAgICAgICAgIGJvb2xlYW4gYWRkZWQgPSBmYWxzZTsKIAotICAgICAgICBpZiAobUlzSW5UZXh0U2VsZWN0aW9uTW9kZSkgewotICAgICAgICAgICAgTWVudUhhbmRsZXIgaGFuZGxlciA9IG5ldyBNZW51SGFuZGxlcigpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiAoY2FuQ3V0KCkpIHsKLSAgICAgICAgICAgICAgICBtZW51LmFkZCgwLCBJRF9DVVQsIDAsIGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3RyaW5nLmN1dCkuCi0gICAgICAgICAgICAgICAgICAgICBzZXRPbk1lbnVJdGVtQ2xpY2tMaXN0ZW5lcihoYW5kbGVyKS4KLSAgICAgICAgICAgICAgICAgICAgIHNldEFscGhhYmV0aWNTaG9ydGN1dCgneCcpOworICAgICAgICBNZW51SGFuZGxlciBoYW5kbGVyID0gbmV3IE1lbnVIYW5kbGVyKCk7CisKKyAgICAgICAgaWYgKG1UZXh0IGluc3RhbmNlb2YgU3Bhbm5lZCkgeworICAgICAgICAgICAgaW50IHNlbFN0YXJ0ID0gZ2V0U2VsZWN0aW9uU3RhcnQoKTsKKyAgICAgICAgICAgIGludCBzZWxFbmQgPSBnZXRTZWxlY3Rpb25FbmQoKTsKKworICAgICAgICAgICAgaW50IG1pbiA9IE1hdGgubWluKHNlbFN0YXJ0LCBzZWxFbmQpOworICAgICAgICAgICAgaW50IG1heCA9IE1hdGgubWF4KHNlbFN0YXJ0LCBzZWxFbmQpOworCisgICAgICAgICAgICBVUkxTcGFuW10gdXJscyA9ICgoU3Bhbm5lZCkgbVRleHQpLmdldFNwYW5zKG1pbiwgbWF4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVUkxTcGFuLmNsYXNzKTsKKyAgICAgICAgICAgIGlmICh1cmxzLmxlbmd0aCA9PSAxKSB7CisgICAgICAgICAgICAgICAgbWVudS5hZGQoMCwgSURfQ09QWV9VUkwsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHJpbmcuY29weVVybCkuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0T25NZW51SXRlbUNsaWNrTGlzdGVuZXIoaGFuZGxlcik7CisKICAgICAgICAgICAgICAgICBhZGRlZCA9IHRydWU7CiAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChjYW5Db3B5KCkpIHsKLSAgICAgICAgICAgICAgICBtZW51LmFkZCgwLCBJRF9DT1BZLCAwLCBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0cmluZy5jb3B5KS4KLSAgICAgICAgICAgICAgICAgICAgIHNldE9uTWVudUl0ZW1DbGlja0xpc3RlbmVyKGhhbmRsZXIpLgotICAgICAgICAgICAgICAgICAgICAgc2V0QWxwaGFiZXRpY1Nob3J0Y3V0KCdjJyk7Ci0gICAgICAgICAgICAgICAgYWRkZWQgPSB0cnVlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoY2FuUGFzdGUoKSkgewotICAgICAgICAgICAgICAgIG1lbnUuYWRkKDAsIElEX1BBU1RFLCAwLCBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0cmluZy5wYXN0ZSkuCi0gICAgICAgICAgICAgICAgICAgICBzZXRPbk1lbnVJdGVtQ2xpY2tMaXN0ZW5lcihoYW5kbGVyKS4KLSAgICAgICAgICAgICAgICAgICAgIHNldEFscGhhYmV0aWNTaG9ydGN1dCgndicpOwotICAgICAgICAgICAgICAgIGFkZGVkID0gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8qCi0gICAgICAgICAgICBpZiAoIWlzRm9jdXNlZCgpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGlzRm9jdXNhYmxlKCkgJiYgbUlucHV0ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGNhbkNvcHkoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgTWVudUhhbmRsZXIgaGFuZGxlciA9IG5ldyBNZW51SGFuZGxlcigpOwotICAgICAgICAgICAgICAgICAgICAgICAgbWVudS5hZGQoMCwgSURfQ09QWSwgMCwgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHJpbmcuY29weSkuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldE9uTWVudUl0ZW1DbGlja0xpc3RlbmVyKGhhbmRsZXIpLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRBbHBoYWJldGljU2hvcnRjdXQoJ2MnKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1lbnUuc2V0SGVhZGVyVGl0bGUoY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHJpbmcuZWRpdFRleHRNZW51VGl0bGUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLy9yZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIE1lbnVIYW5kbGVyIGhhbmRsZXIgPSBuZXcgTWVudUhhbmRsZXIoKTsKLQotICAgICAgICAgICAgaWYgKGNhblNlbGVjdFRleHQoKSkgewotICAgICAgICAgICAgICAgIG1lbnUuYWRkKDAsIElEX1NUQVJUX1NFTEVDVElOR19URVhULCAwLCBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0cmluZy5zZWxlY3RUZXh0KS4KLSAgICAgICAgICAgICAgICBzZXRPbk1lbnVJdGVtQ2xpY2tMaXN0ZW5lcihoYW5kbGVyKTsKLSAgICAgICAgICAgICAgICBhZGRlZCA9IHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmIChjYW5TZWxlY3RBbGwoKSkgewotICAgICAgICAgICAgICAgIG1lbnUuYWRkKDAsIElEX1NFTEVDVF9BTEwsIDAsIGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3RyaW5nLnNlbGVjdEFsbCkuCi0gICAgICAgICAgICAgICAgICAgICBzZXRPbk1lbnVJdGVtQ2xpY2tMaXN0ZW5lcihoYW5kbGVyKS4KLSAgICAgICAgICAgICAgICAgICAgIHNldEFscGhhYmV0aWNTaG9ydGN1dCgnYScpOwotICAgICAgICAgICAgICAgIGFkZGVkID0gdHJ1ZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKG1UZXh0IGluc3RhbmNlb2YgU3Bhbm5lZCkgewotICAgICAgICAgICAgICAgIGludCBzZWxTdGFydCA9IGdldFNlbGVjdGlvblN0YXJ0KCk7Ci0gICAgICAgICAgICAgICAgaW50IHNlbEVuZCA9IGdldFNlbGVjdGlvbkVuZCgpOwotCi0gICAgICAgICAgICAgICAgaW50IG1pbiA9IE1hdGgubWluKHNlbFN0YXJ0LCBzZWxFbmQpOwotICAgICAgICAgICAgICAgIGludCBtYXggPSBNYXRoLm1heChzZWxTdGFydCwgc2VsRW5kKTsKLQotICAgICAgICAgICAgICAgIFVSTFNwYW5bXSB1cmxzID0gKChTcGFubmVkKSBtVGV4dCkuZ2V0U3BhbnMobWluLCBtYXgsCi0gICAgICAgICAgICAgICAgICAgICAgICBVUkxTcGFuLmNsYXNzKTsKLSAgICAgICAgICAgICAgICBpZiAodXJscy5sZW5ndGggPT0gMSkgewotICAgICAgICAgICAgICAgICAgICBtZW51LmFkZCgwLCBJRF9DT1BZX1VSTCwgMCwgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHJpbmcuY29weVVybCkuCi0gICAgICAgICAgICAgICAgICAgICAgICAgc2V0T25NZW51SXRlbUNsaWNrTGlzdGVuZXIoaGFuZGxlcik7Ci0gICAgICAgICAgICAgICAgICAgIGFkZGVkID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIC8vIFBhc3RlIGxvY2F0aW9uIGlzIHRvbyBpbXByZWNpc2UuIE9ubHkgYWxsb3cgb24gZW1wdHkgdGV4dCBmaWVsZHMuCi0gICAgICAgICAgICBpZiAoY2FuUGFzdGUoKSAmJiB0ZXh0SXNPbmx5U3BhY2VzKCkpIHsKLSAgICAgICAgICAgICAgICBtZW51LmFkZCgwLCBJRF9QQVNURSwgMCwgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHJpbmcucGFzdGUpLgotICAgICAgICAgICAgICAgICAgICAgc2V0T25NZW51SXRlbUNsaWNrTGlzdGVuZXIoaGFuZGxlcikuCi0gICAgICAgICAgICAgICAgICAgICBzZXRBbHBoYWJldGljU2hvcnRjdXQoJ3YnKTsKLSAgICAgICAgICAgICAgICBhZGRlZCA9IHRydWU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChpc0lucHV0TWV0aG9kVGFyZ2V0KCkpIHsKLSAgICAgICAgICAgICAgICBtZW51LmFkZCgxLCBJRF9TV0lUQ0hfSU5QVVRfTUVUSE9ELCAwLCBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0cmluZy5pbnB1dE1ldGhvZCkuCi0gICAgICAgICAgICAgICAgICAgICBzZXRPbk1lbnVJdGVtQ2xpY2tMaXN0ZW5lcihoYW5kbGVyKTsKLSAgICAgICAgICAgICAgICBhZGRlZCA9IHRydWU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIFN0cmluZyB3b3JkID0gZ2V0V29yZEZvckRpY3Rpb25hcnkoKTsKLSAgICAgICAgICAgIGlmICh3b3JkICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtZW51LmFkZCgxLCBJRF9BRERfVE9fRElDVElPTkFSWSwgMCwKLSAgICAgICAgICAgICAgICAgICAgIGdldENvbnRleHQoKS5nZXRTdHJpbmcoY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHJpbmcuYWRkVG9EaWN0aW9uYXJ5LCB3b3JkKSkuCi0gICAgICAgICAgICAgICAgICAgICBzZXRPbk1lbnVJdGVtQ2xpY2tMaXN0ZW5lcihoYW5kbGVyKTsKLSAgICAgICAgICAgICAgICBhZGRlZCA9IHRydWU7Ci0KLSAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgLy8gVGhlIGNvbnRleHQgbWVudSBpcyBub3QgZW1wdHksIHdoaWNoIHdpbGwgcHJldmVudCB0aGUgc2VsZWN0aW9uIG1vZGUgZnJvbSBzdGFydGluZy4KKyAgICAgICAgLy8gQWRkIGEgZW50cnkgdG8gc3RhcnQgaXQgaW4gdGhlIGNvbnRleHQgbWVudS4KKyAgICAgICAgLy8gVE9ETyBEb2VzIG5vdCBoYW5kbGUgdGhlIGNhc2Ugd2hlcmUgYSBzdWJjbGFzcyBkb2VzIG5vdCBjYWxsIHN1cGVyLnRoaXNNZXRob2Qgb3IKKyAgICAgICAgLy8gcG9wdWxhdGVzIHRoZSBtZW51IEFGVEVSIHRoaXMgY2FsbC4KKyAgICAgICAgaWYgKG1lbnUuc2l6ZSgpID4gMCkgeworICAgICAgICAgICAgbWVudS5hZGQoMCwgSURfU0VMRUNUSU9OX01PREUsIDAsIGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3RyaW5nLnNlbGVjdFRleHRNb2RlKS4KKyAgICAgICAgICAgIHNldE9uTWVudUl0ZW1DbGlja0xpc3RlbmVyKGhhbmRsZXIpOworICAgICAgICAgICAgYWRkZWQgPSB0cnVlOwogICAgICAgICB9CiAKICAgICAgICAgaWYgKGFkZGVkKSB7CkBAIC03Mzc1LDE2ICs3MzU2LDYgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIHByaXZhdGUgYm9vbGVhbiB0ZXh0SXNPbmx5U3BhY2VzKCkgewotICAgICAgICBmaW5hbCBpbnQgbGVuZ3RoID0gbVRyYW5zZm9ybWVkLmxlbmd0aCgpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBpZiAoIUNoYXJhY3Rlci5pc1NwYWNlQ2hhcihtVHJhbnNmb3JtZWQuY2hhckF0KGkpKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KICAgICAvKioKICAgICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyB0ZXh0IHZpZXcgaXMgYSBjdXJyZW50IGlucHV0IG1ldGhvZCB0YXJnZXQuICBUaGUKICAgICAgKiBkZWZhdWx0IGltcGxlbWVudGF0aW9uIGp1c3QgY2hlY2tzIHdpdGgge0BsaW5rIElucHV0TWV0aG9kTWFuYWdlcn0uCkBAIC03Mzk0LDE1ICs3MzY1LDE0IEBACiAgICAgICAgIHJldHVybiBpbW0gIT0gbnVsbCAmJiBpbW0uaXNBY3RpdmUodGhpcyk7CiAgICAgfQogICAgIAotICAgIC8vIENvbnRleHQgbWVudSBlbnRyaWVzCisgICAgLy8gU2VsZWN0aW9uIGNvbnRleHQgbW9kZQogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBJRF9TRUxFQ1RfQUxMID0gYW5kcm9pZC5SLmlkLnNlbGVjdEFsbDsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgSURfU1RBUlRfU0VMRUNUSU5HX1RFWFQgPSBhbmRyb2lkLlIuaWQuc3RhcnRTZWxlY3RpbmdUZXh0OwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBJRF9DVVQgPSBhbmRyb2lkLlIuaWQuY3V0OwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBJRF9DT1BZID0gYW5kcm9pZC5SLmlkLmNvcHk7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IElEX1BBU1RFID0gYW5kcm9pZC5SLmlkLnBhc3RlOworICAgIC8vIENvbnRleHQgbWVudSBlbnRyaWVzCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IElEX0NPUFlfVVJMID0gYW5kcm9pZC5SLmlkLmNvcHlVcmw7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IElEX1NXSVRDSF9JTlBVVF9NRVRIT0QgPSBhbmRyb2lkLlIuaWQuc3dpdGNoSW5wdXRNZXRob2Q7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IElEX0FERF9UT19ESUNUSU9OQVJZID0gYW5kcm9pZC5SLmlkLmFkZFRvRGljdGlvbmFyeTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgSURfU0VMRUNUSU9OX01PREUgPSBhbmRyb2lkLlIuaWQuc2VsZWN0VGV4dE1vZGU7CiAKICAgICBwcml2YXRlIGNsYXNzIE1lbnVIYW5kbGVyIGltcGxlbWVudHMgTWVudUl0ZW0uT25NZW51SXRlbUNsaWNrTGlzdGVuZXIgewogICAgICAgICBwdWJsaWMgYm9vbGVhbiBvbk1lbnVJdGVtQ2xpY2soTWVudUl0ZW0gaXRlbSkgewpAQCAtNzQxMiwxMSArNzM4Miw3IEBACiAKICAgICAvKioKICAgICAgKiBDYWxsZWQgd2hlbiBhIGNvbnRleHQgbWVudSBvcHRpb24gZm9yIHRoZSB0ZXh0IHZpZXcgaXMgc2VsZWN0ZWQuICBDdXJyZW50bHkKLSAgICAgKiB0aGlzIHdpbGwgYmUgb25lIG9mOiB7QGxpbmsgYW5kcm9pZC5SLmlkI3NlbGVjdEFsbH0sCi0gICAgICoge0BsaW5rIGFuZHJvaWQuUi5pZCNzdGFydFNlbGVjdGluZ1RleHR9LAotICAgICAqIHtAbGluayBhbmRyb2lkLlIuaWQjY3V0fSwge0BsaW5rIGFuZHJvaWQuUi5pZCNjb3B5fSwKLSAgICAgKiB7QGxpbmsgYW5kcm9pZC5SLmlkI3Bhc3RlfSwge0BsaW5rIGFuZHJvaWQuUi5pZCNjb3B5VXJsfSwKLSAgICAgKiBvciB7QGxpbmsgYW5kcm9pZC5SLmlkI3N3aXRjaElucHV0TWV0aG9kfS4KKyAgICAgKiB0aGlzIHdpbGwgYmUge0BsaW5rIGFuZHJvaWQuUi5pZCNjb3B5VXJsfSBvciB7QGxpbmsgYW5kcm9pZC5SLmlkI3NlbGVjdFRleHRNb2RlfS4KICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiBvblRleHRDb250ZXh0TWVudUl0ZW0oaW50IGlkKSB7CiAgICAgICAgIGludCBtaW4gPSAwOwpAQCAtNzQzMCw5MyArNzM5NiwzMSBAQAogICAgICAgICAgICAgbWF4ID0gTWF0aC5tYXgoMCwgTWF0aC5tYXgoc2VsU3RhcnQsIHNlbEVuZCkpOwogICAgICAgICB9CiAKLSAgICAgICAgQ2xpcGJvYXJkTWFuYWdlciBjbGlwID0gKENsaXBib2FyZE1hbmFnZXIpZ2V0Q29udGV4dCgpCisgICAgICAgIENsaXBib2FyZE1hbmFnZXIgY2xpcGJvYXJkID0gKENsaXBib2FyZE1hbmFnZXIpZ2V0Q29udGV4dCgpCiAgICAgICAgICAgICAgICAgLmdldFN5c3RlbVNlcnZpY2UoQ29udGV4dC5DTElQQk9BUkRfU0VSVklDRSk7CiAKICAgICAgICAgc3dpdGNoIChpZCkgewotICAgICAgICAgICAgY2FzZSBJRF9TRUxFQ1RfQUxMOgotICAgICAgICAgICAgICAgIFNlbGVjdGlvbi5zZXRTZWxlY3Rpb24oKFNwYW5uYWJsZSkgbVRleHQsIDAsIG1UZXh0Lmxlbmd0aCgpKTsKLSAgICAgICAgICAgICAgICBzdGFydFRleHRTZWxlY3Rpb25Nb2RlKCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0KLSAgICAgICAgICAgIGNhc2UgSURfU1RBUlRfU0VMRUNUSU5HX1RFWFQ6Ci0gICAgICAgICAgICAgICAgc3RhcnRUZXh0U2VsZWN0aW9uTW9kZSgpOwotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotCi0gICAgICAgICAgICBjYXNlIElEX0NVVDogICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgY2xpcC5zZXRUZXh0KG1UcmFuc2Zvcm1lZC5zdWJTZXF1ZW5jZShtaW4sIG1heCkpOwotICAgICAgICAgICAgICAgICgoRWRpdGFibGUpIG1UZXh0KS5kZWxldGUobWluLCBtYXgpOwotICAgICAgICAgICAgICAgIHN0b3BUZXh0U2VsZWN0aW9uTW9kZSgpOwotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotCi0gICAgICAgICAgICBjYXNlIElEX0NPUFk6Ci0gICAgICAgICAgICAgICAgY2xpcC5zZXRUZXh0KG1UcmFuc2Zvcm1lZC5zdWJTZXF1ZW5jZShtaW4sIG1heCkpOwotICAgICAgICAgICAgICAgIHN0b3BUZXh0U2VsZWN0aW9uTW9kZSgpOwotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotCi0gICAgICAgICAgICBjYXNlIElEX1BBU1RFOgotICAgICAgICAgICAgICAgIENoYXJTZXF1ZW5jZSBwYXN0ZSA9IGNsaXAuZ2V0VGV4dCgpOwotCi0gICAgICAgICAgICAgICAgaWYgKHBhc3RlICE9IG51bGwgJiYgcGFzdGUubGVuZ3RoKCkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIFBhc3RlIGFkZHMvcmVtb3ZlcyBzcGFjZXMgYmVmb3JlIG9yIGFmdGVyIGluc2VydGlvbiBhcyBuZWVkZWQuCi0KLSAgICAgICAgICAgICAgICAgICAgaWYgKENoYXJhY3Rlci5pc1NwYWNlQ2hhcihwYXN0ZS5jaGFyQXQoMCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobWluID4gMCAmJiBDaGFyYWN0ZXIuaXNTcGFjZUNoYXIobVRyYW5zZm9ybWVkLmNoYXJBdChtaW4gLSAxKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUd28gc3BhY2VzIGF0IGJlZ2lubmluZyBvZiBwYXN0ZTogcmVtb3ZlIG9uZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoRWRpdGFibGUpIG1UZXh0KS5yZXBsYWNlKG1pbiAtIDEsIG1pbiwgIiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbiA9IG1pbiAtIDE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4ID0gbWF4IC0gMTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtaW4gPiAwICYmICFDaGFyYWN0ZXIuaXNTcGFjZUNoYXIobVRyYW5zZm9ybWVkLmNoYXJBdChtaW4gLSAxKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBObyBzcGFjZSBhdCBiZWdpbm5pbmcgb2YgcGFzdGU6IGFkZCBvbmUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKEVkaXRhYmxlKSBtVGV4dCkucmVwbGFjZShtaW4sIG1pbiwgIiAiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW4gPSBtaW4gKyAxOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heCA9IG1heCArIDE7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBpZiAoQ2hhcmFjdGVyLmlzU3BhY2VDaGFyKHBhc3RlLmNoYXJBdChwYXN0ZS5sZW5ndGgoKSAtIDEpKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1heCA8IG1UZXh0Lmxlbmd0aCgpICYmIENoYXJhY3Rlci5pc1NwYWNlQ2hhcihtVHJhbnNmb3JtZWQuY2hhckF0KG1heCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVHdvIHNwYWNlcyBhdCBlbmQgb2YgcGFzdGU6IHJlbW92ZSBvbmUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKEVkaXRhYmxlKSBtVGV4dCkucmVwbGFjZShtYXgsIG1heCArIDEsICIiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtYXggPCBtVGV4dC5sZW5ndGgoKSAmJiAhQ2hhcmFjdGVyLmlzU3BhY2VDaGFyKG1UcmFuc2Zvcm1lZC5jaGFyQXQobWF4KSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBObyBzcGFjZSBhdCBlbmQgb2YgcGFzdGU6IGFkZCBvbmUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKEVkaXRhYmxlKSBtVGV4dCkucmVwbGFjZShtYXgsIG1heCwgIiAiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIFNlbGVjdGlvbi5zZXRTZWxlY3Rpb24oKFNwYW5uYWJsZSkgbVRleHQsIG1heCk7Ci0gICAgICAgICAgICAgICAgICAgICgoRWRpdGFibGUpIG1UZXh0KS5yZXBsYWNlKG1pbiwgbWF4LCBwYXN0ZSk7Ci0gICAgICAgICAgICAgICAgICAgIHN0b3BUZXh0U2VsZWN0aW9uTW9kZSgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLQogICAgICAgICAgICAgY2FzZSBJRF9DT1BZX1VSTDoKKwogICAgICAgICAgICAgICAgIFVSTFNwYW5bXSB1cmxzID0gKChTcGFubmVkKSBtVGV4dCkuZ2V0U3BhbnMobWluLCBtYXgsIFVSTFNwYW4uY2xhc3MpOwotICAgICAgICAgICAgICAgIGlmICh1cmxzLmxlbmd0aCA9PSAxKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNsaXAuc2V0VGV4dCh1cmxzWzBdLmdldFVSTCgpKTsKKyAgICAgICAgICAgICAgICBpZiAodXJscy5sZW5ndGggPj0gMSkgeworICAgICAgICAgICAgICAgICAgICBDbGlwRGF0YSBjbGlwID0gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaT0wOyBpPHVybHMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFVyaSB1cmkgPSBVcmkucGFyc2UodXJsc1swXS5nZXRVUkwoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2xpcCA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xpcCA9IENsaXBEYXRhLm5ld1Jhd1VyaShudWxsLCBudWxsLCB1cmkpOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGlwLmFkZEl0ZW0obmV3IENsaXBEYXRhLkl0ZW0odXJpKSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKGNsaXAgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgY2xpcGJvYXJkLnNldFByaW1hcnlDbGlwKGNsaXApOworICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogCi0gICAgICAgICAgICBjYXNlIElEX1NXSVRDSF9JTlBVVF9NRVRIT0Q6Ci0gICAgICAgICAgICAgICAgSW5wdXRNZXRob2RNYW5hZ2VyIGltbSA9IElucHV0TWV0aG9kTWFuYWdlci5wZWVrSW5zdGFuY2UoKTsKLSAgICAgICAgICAgICAgICBpZiAoaW1tICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgaW1tLnNob3dJbnB1dE1ldGhvZFBpY2tlcigpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLQotICAgICAgICAgICAgY2FzZSBJRF9BRERfVE9fRElDVElPTkFSWToKLSAgICAgICAgICAgICAgICBTdHJpbmcgd29yZCA9IGdldFdvcmRGb3JEaWN0aW9uYXJ5KCk7Ci0KLSAgICAgICAgICAgICAgICBpZiAod29yZCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIEludGVudCBpID0gbmV3IEludGVudCgiY29tLmFuZHJvaWQuc2V0dGluZ3MuVVNFUl9ESUNUSU9OQVJZX0lOU0VSVCIpOwotICAgICAgICAgICAgICAgICAgICBpLnB1dEV4dHJhKCJ3b3JkIiwgd29yZCk7Ci0gICAgICAgICAgICAgICAgICAgIGkuc2V0RmxhZ3MoaS5nZXRGbGFncygpIHwgSW50ZW50LkZMQUdfQUNUSVZJVFlfTkVXX1RBU0spOwotICAgICAgICAgICAgICAgICAgICBnZXRDb250ZXh0KCkuc3RhcnRBY3Rpdml0eShpKTsKLSAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXNlIElEX1NFTEVDVElPTl9NT0RFOgorICAgICAgICAgICAgICAgIHN0YXJ0U2VsZWN0aW9uQWN0aW9uTW9kZSgpOwogICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICAgfQogCkBAIC03NTI5LDM1ICs3NDMzLDgxIEBACiAgICAgICAgICAgICBtRWF0VG91Y2hSZWxlYXNlID0gdHJ1ZTsKICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICB9CisgICAgICAgIAorICAgICAgICBpZiAoc3RhcnRTZWxlY3Rpb25BY3Rpb25Nb2RlKCkpIHsKKyAgICAgICAgICAgIHBlcmZvcm1IYXB0aWNGZWVkYmFjayhIYXB0aWNGZWVkYmFja0NvbnN0YW50cy5MT05HX1BSRVNTKTsKKyAgICAgICAgICAgIG1FYXRUb3VjaFJlbGVhc2UgPSB0cnVlOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KIAogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogCi0gICAgcHJpdmF0ZSB2b2lkIHN0YXJ0VGV4dFNlbGVjdGlvbk1vZGUoKSB7Ci0gICAgICAgIGlmICghbUlzSW5UZXh0U2VsZWN0aW9uTW9kZSkgewotICAgICAgICAgICAgaWYgKG1TZWxlY3Rpb25Nb2RpZmllckN1cnNvckNvbnRyb2xsZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIExvZy53KExPR19UQUcsICJUZXh0VmlldyBoYXMgbm8gc2VsZWN0aW9uIGNvbnRyb2xsZXIuIEFjdGlvbiBtb2RlIGNhbmNlbGxlZC4iKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9CisgICAgcHJpdmF0ZSBib29sZWFuIHRvdWNoUG9zaXRpb25Jc0luU2VsZWN0aW9uKCkgeworICAgICAgICBpbnQgc2VsZWN0aW9uU3RhcnQgPSBnZXRTZWxlY3Rpb25TdGFydCgpOworICAgICAgICBpbnQgc2VsZWN0aW9uRW5kID0gZ2V0U2VsZWN0aW9uRW5kKCk7CiAKLSAgICAgICAgICAgIGlmICghcmVxdWVzdEZvY3VzKCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHNlbGVjdEN1cnJlbnRXb3JkKCk7Ci0gICAgICAgICAgICBtU2VsZWN0aW9uTW9kaWZpZXJDdXJzb3JDb250cm9sbGVyLnNob3coKTsKLSAgICAgICAgICAgIG1Jc0luVGV4dFNlbGVjdGlvbk1vZGUgPSB0cnVlOworICAgICAgICBpZiAoc2VsZWN0aW9uU3RhcnQgPT0gc2VsZWN0aW9uRW5kKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KKworICAgICAgICBpZiAoc2VsZWN0aW9uU3RhcnQgPiBzZWxlY3Rpb25FbmQpIHsKKyAgICAgICAgICAgIGludCB0bXAgPSBzZWxlY3Rpb25TdGFydDsKKyAgICAgICAgICAgIHNlbGVjdGlvblN0YXJ0ID0gc2VsZWN0aW9uRW5kOworICAgICAgICAgICAgc2VsZWN0aW9uRW5kID0gdG1wOworICAgICAgICAgICAgU2VsZWN0aW9uLnNldFNlbGVjdGlvbigoU3Bhbm5hYmxlKSBtVGV4dCwgc2VsZWN0aW9uU3RhcnQsIHNlbGVjdGlvbkVuZCk7CisgICAgICAgIH0KKworICAgICAgICBTZWxlY3Rpb25Nb2RpZmllckN1cnNvckNvbnRyb2xsZXIgc2VsZWN0aW9uTW9kaWZpZXJDdXJzb3JDb250cm9sbGVyID0KKyAgICAgICAgICAgICgoU2VsZWN0aW9uTW9kaWZpZXJDdXJzb3JDb250cm9sbGVyKSBtU2VsZWN0aW9uTW9kaWZpZXJDdXJzb3JDb250cm9sbGVyKTsKKyAgICAgICAgaW50IG1pbk9mZnNldCA9IHNlbGVjdGlvbk1vZGlmaWVyQ3Vyc29yQ29udHJvbGxlci5nZXRNaW5Ub3VjaE9mZnNldCgpOworICAgICAgICBpbnQgbWF4T2Zmc2V0ID0gc2VsZWN0aW9uTW9kaWZpZXJDdXJzb3JDb250cm9sbGVyLmdldE1heFRvdWNoT2Zmc2V0KCk7CisKKyAgICAgICAgcmV0dXJuICgobWluT2Zmc2V0ID49IHNlbGVjdGlvblN0YXJ0KSAmJiAobWF4T2Zmc2V0IDwgc2VsZWN0aW9uRW5kKSk7CiAgICAgfQotICAgIAorCiAgICAgLyoqCi0gICAgICogU2FtZSBhcyB7QGxpbmsgI3N0b3BUZXh0U2VsZWN0aW9uTW9kZSgpfSwgZXhjZXB0IHRoYXQgdGhlcmUgaXMgbm8gY3Vyc29yIGNvbnRyb2xsZXIKKyAgICAgKiBQcm92aWRlcyB0aGUgY2FsbGJhY2sgdXNlZCB0byBzdGFydCBhIHNlbGVjdGlvbiBhY3Rpb24gbW9kZS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gQSBjYWxsYmFjayBpbnN0YW5jZSB0aGF0IHdpbGwgYmUgdXNlZCB0byBzdGFydCBzZWxlY3Rpb24gbW9kZSwgb3IgbnVsbCBpZiBzZWxlY3Rpb24KKyAgICAgKiBtb2RlIGlzIG5vdCBhdmFpbGFibGUuCisgICAgICovCisgICAgcHJpdmF0ZSBBY3Rpb25Nb2RlLkNhbGxiYWNrIGdldEFjdGlvbk1vZGVDYWxsYmFjaygpIHsKKyAgICAgICAgLy8gTG9uZyBwcmVzcyBpbiB0aGUgY3VycmVudCBzZWxlY3Rpb24uCisgICAgICAgIC8vIFNob3VsZCBpbml0aWF0ZSBhIGRyYWcuIFJldHVybiBmYWxzZSwgdG8gcmVseSBvbiBjb250ZXh0IG1lbnUgZm9yIG5vdy4KKyAgICAgICAgaWYgKGNhblNlbGVjdFRleHQoKSAmJiAhdG91Y2hQb3NpdGlvbklzSW5TZWxlY3Rpb24oKSkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBTZWxlY3Rpb25BY3Rpb25Nb2RlQ2FsbGJhY2soKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKgorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgc2VsZWN0aW9uIG1vZGUgd2FzIGFjdHVhbGx5IHN0YXJ0ZWQuCisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIHN0YXJ0U2VsZWN0aW9uQWN0aW9uTW9kZSgpIHsKKyAgICAgICAgaWYgKG1TZWxlY3Rpb25BY3Rpb25Nb2RlICE9IG51bGwpIHsKKyAgICAgICAgICAgIC8vIFNlbGVjdGlvbiBhY3Rpb24gbW9kZSBpcyBhbHJlYWR5IHN0YXJ0ZWQKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIEFjdGlvbk1vZGUuQ2FsbGJhY2sgYWN0aW9uTW9kZUNhbGxiYWNrID0gZ2V0QWN0aW9uTW9kZUNhbGxiYWNrKCk7CisgICAgICAgIGlmIChhY3Rpb25Nb2RlQ2FsbGJhY2sgIT0gbnVsbCkgeworICAgICAgICAgICAgbVNlbGVjdGlvbkFjdGlvbk1vZGUgPSBzdGFydEFjdGlvbk1vZGUoYWN0aW9uTW9kZUNhbGxiYWNrKTsKKyAgICAgICAgICAgIHJldHVybiBtU2VsZWN0aW9uQWN0aW9uTW9kZSAhPSBudWxsOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNhbWUgYXMge0BsaW5rICNzdG9wU2VsZWN0aW9uQWN0aW9uTW9kZSgpfSwgZXhjZXB0IHRoYXQgdGhlcmUgaXMgbm8gY3Vyc29yIGNvbnRyb2xsZXIKICAgICAgKiBmYWRlIG91dCBhbmltYXRpb24uIE5lZWRlZCBzaW5jZSB0aGUgZHJhd2FibGUgYW5kIHRoZWlyIGFscGhhIHZhbHVlcyBhcmUgc2hhcmVkIGJ5IGFsbAogICAgICAqIFRleHRWaWV3cy4gU3dpdGNoaW5nIGZyb20gb25lIFRleHRWaWV3IHRvIGFub3RoZXIgd291bGQgZmFkZSB0aGUgY3Vyc29yIGNvbnRyb2xsZXJzIGluIHRoZQogICAgICAqIG5ldyBvbmUgb3RoZXJ3aXNlLgogICAgICAqLwotICAgIHByaXZhdGUgdm9pZCB0ZXJtaW5hdGVUZXh0U2VsZWN0aW9uTW9kZSgpIHsKLSAgICAgICAgc3RvcFRleHRTZWxlY3Rpb25Nb2RlKCk7CisgICAgcHJpdmF0ZSB2b2lkIHRlcm1pbmF0ZVNlbGVjdGlvbkFjdGlvbk1vZGUoKSB7CisgICAgICAgIHN0b3BTZWxlY3Rpb25BY3Rpb25Nb2RlKCk7CiAgICAgICAgIGlmIChtU2VsZWN0aW9uTW9kaWZpZXJDdXJzb3JDb250cm9sbGVyICE9IG51bGwpIHsKICAgICAgICAgICAgIFNlbGVjdGlvbk1vZGlmaWVyQ3Vyc29yQ29udHJvbGxlciBzZWxlY3Rpb25Nb2RpZmllckN1cnNvckNvbnRyb2xsZXIgPQogICAgICAgICAgICAgICAgIChTZWxlY3Rpb25Nb2RpZmllckN1cnNvckNvbnRyb2xsZXIpIG1TZWxlY3Rpb25Nb2RpZmllckN1cnNvckNvbnRyb2xsZXI7CkBAIC03NTY1LDE0ICs3NTE1LDE0NiBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgcHJpdmF0ZSB2b2lkIHN0b3BUZXh0U2VsZWN0aW9uTW9kZSgpIHsKLSAgICAgICAgaWYgKG1Jc0luVGV4dFNlbGVjdGlvbk1vZGUpIHsKLSAgICAgICAgICAgIFNlbGVjdGlvbi5zZXRTZWxlY3Rpb24oKFNwYW5uYWJsZSkgbVRleHQsIGdldFNlbGVjdGlvbkVuZCgpKTsKKyAgICBwcml2YXRlIHZvaWQgc3RvcFNlbGVjdGlvbkFjdGlvbk1vZGUoKSB7CisgICAgICAgIGlmIChtU2VsZWN0aW9uQWN0aW9uTW9kZSAhPSBudWxsKSB7CisgICAgICAgICAgICBtU2VsZWN0aW9uQWN0aW9uTW9kZS5maW5pc2goKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgY2xhc3MgU2VsZWN0aW9uQWN0aW9uTW9kZUNhbGxiYWNrIGltcGxlbWVudHMgQWN0aW9uTW9kZS5DYWxsYmFjayB7CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIG9uQ3JlYXRlQWN0aW9uTW9kZShBY3Rpb25Nb2RlIG1vZGUsIE1lbnUgbWVudSkgeworICAgICAgICAgICAgaWYgKG1TZWxlY3Rpb25Nb2RpZmllckN1cnNvckNvbnRyb2xsZXIgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIExvZy53KExPR19UQUcsICJUZXh0VmlldyBoYXMgbm8gc2VsZWN0aW9uIGNvbnRyb2xsZXIuIEFjdGlvbiBtb2RlIGNhbmNlbGxlZC4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICghcmVxdWVzdEZvY3VzKCkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG1vZGUuc2V0VGl0bGUobUNvbnRleHQuZ2V0U3RyaW5nKGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3RyaW5nLnRleHRTZWxlY3Rpb25DQUJUaXRsZSkpOworICAgICAgICAgICAgbW9kZS5zZXRTdWJ0aXRsZShudWxsKTsKKworICAgICAgICAgICAgc2VsZWN0Q3VycmVudFdvcmQoKTsKKworICAgICAgICAgICAgYm9vbGVhbiBhdExlYXN0T25lID0gZmFsc2U7CisKKyAgICAgICAgICAgIGlmIChjYW5TZWxlY3RBbGwoKSkgeworICAgICAgICAgICAgICAgIG1lbnUuYWRkKDAsIElEX1NFTEVDVF9BTEwsIDAsIGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3RyaW5nLnNlbGVjdEFsbCkuCisgICAgICAgICAgICAgICAgICAgIHNldEljb24oY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5kcmF3YWJsZS5pY19tZW51X2NoYXRfZGFzaGJvYXJkKS4KKyAgICAgICAgICAgICAgICAgICAgc2V0QWxwaGFiZXRpY1Nob3J0Y3V0KCdhJyk7CisgICAgICAgICAgICAgICAgYXRMZWFzdE9uZSA9IHRydWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChjYW5DdXQoKSkgeworICAgICAgICAgICAgICAgIG1lbnUuYWRkKDAsIElEX0NVVCwgMCwgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHJpbmcuY3V0KS4KKyAgICAgICAgICAgICAgICAgICAgc2V0SWNvbihjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmRyYXdhYmxlLmljX21lbnVfY29tcG9zZSkuCisgICAgICAgICAgICAgICAgICAgIHNldEFscGhhYmV0aWNTaG9ydGN1dCgneCcpOworICAgICAgICAgICAgICAgIGF0TGVhc3RPbmUgPSB0cnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoY2FuQ29weSgpKSB7CisgICAgICAgICAgICAgICAgbWVudS5hZGQoMCwgSURfQ09QWSwgMCwgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHJpbmcuY29weSkuCisgICAgICAgICAgICAgICAgICAgIHNldEljb24oY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5kcmF3YWJsZS5pY19tZW51X2F0dGFjaG1lbnQpLgorICAgICAgICAgICAgICAgICAgICBzZXRBbHBoYWJldGljU2hvcnRjdXQoJ2MnKTsKKyAgICAgICAgICAgICAgICBhdExlYXN0T25lID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGNhblBhc3RlKCkpIHsKKyAgICAgICAgICAgICAgICBtZW51LmFkZCgwLCBJRF9QQVNURSwgMCwgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHJpbmcucGFzdGUpLgorICAgICAgICAgICAgICAgICAgICAgICAgc2V0SWNvbihjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmRyYXdhYmxlLmljX21lbnVfY2FtZXJhKS4KKyAgICAgICAgICAgICAgICAgICAgICAgIHNldEFscGhhYmV0aWNTaG9ydGN1dCgndicpOworICAgICAgICAgICAgICAgIGF0TGVhc3RPbmUgPSB0cnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoYXRMZWFzdE9uZSkgeworICAgICAgICAgICAgICAgIG1TZWxlY3Rpb25Nb2RpZmllckN1cnNvckNvbnRyb2xsZXIuc2hvdygpOworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gb25QcmVwYXJlQWN0aW9uTW9kZShBY3Rpb25Nb2RlIG1vZGUsIE1lbnUgbWVudSkgeworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gb25BY3Rpb25JdGVtQ2xpY2tlZChBY3Rpb25Nb2RlIG1vZGUsIE1lbnVJdGVtIGl0ZW0pIHsKKyAgICAgICAgICAgIGZpbmFsIGludCBpdGVtSWQgPSBpdGVtLmdldEl0ZW1JZCgpOworCisgICAgICAgICAgICBpZiAoaXRlbUlkID09IElEX1NFTEVDVF9BTEwpIHsKKyAgICAgICAgICAgICAgICBTZWxlY3Rpb24uc2V0U2VsZWN0aW9uKChTcGFubmFibGUpIG1UZXh0LCAwLCBtVGV4dC5sZW5ndGgoKSk7CisgICAgICAgICAgICAgICAgLy8gVXBkYXRlIGNvbnRyb2xsZXIgcG9zaXRpb25zIGFmdGVyIHNlbGVjdGlvbiBjaGFuZ2UuCisgICAgICAgICAgICAgICAgaWYgKG1TZWxlY3Rpb25Nb2RpZmllckN1cnNvckNvbnRyb2xsZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBtU2VsZWN0aW9uTW9kaWZpZXJDdXJzb3JDb250cm9sbGVyLnNob3coKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIENsaXBib2FyZE1hbmFnZXIgY2xpcGJvYXJkID0gKENsaXBib2FyZE1hbmFnZXIpIGdldENvbnRleHQoKS4KKyAgICAgICAgICAgICAgICAgICAgZ2V0U3lzdGVtU2VydmljZShDb250ZXh0LkNMSVBCT0FSRF9TRVJWSUNFKTsKKworICAgICAgICAgICAgaW50IG1pbiA9IDA7CisgICAgICAgICAgICBpbnQgbWF4ID0gbVRleHQubGVuZ3RoKCk7CisKKyAgICAgICAgICAgIGlmIChpc0ZvY3VzZWQoKSkgeworICAgICAgICAgICAgICAgIGZpbmFsIGludCBzZWxTdGFydCA9IGdldFNlbGVjdGlvblN0YXJ0KCk7CisgICAgICAgICAgICAgICAgZmluYWwgaW50IHNlbEVuZCA9IGdldFNlbGVjdGlvbkVuZCgpOworCisgICAgICAgICAgICAgICAgbWluID0gTWF0aC5tYXgoMCwgTWF0aC5taW4oc2VsU3RhcnQsIHNlbEVuZCkpOworICAgICAgICAgICAgICAgIG1heCA9IE1hdGgubWF4KDAsIE1hdGgubWF4KHNlbFN0YXJ0LCBzZWxFbmQpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3dpdGNoIChpdGVtLmdldEl0ZW1JZCgpKSB7CisgICAgICAgICAgICAgICAgY2FzZSBJRF9QQVNURToKKyAgICAgICAgICAgICAgICAgICAgQ2xpcERhdGEgY2xpcCA9IGNsaXBib2FyZC5nZXRQcmltYXJ5Q2xpcCgpOworICAgICAgICAgICAgICAgICAgICBpZiAoY2xpcCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIGRpZGZpcnN0ID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpPTA7IGk8Y2xpcC5nZXRJdGVtQ291bnQoKTsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hhclNlcXVlbmNlIHBhc3RlID0gY2xpcC5nZXRJdGVtKGkpLmNvZXJjZVRvVGV4dChnZXRDb250ZXh0KCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwYXN0ZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZGlkZmlyc3QpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlbGVjdGlvbi5zZXRTZWxlY3Rpb24oKFNwYW5uYWJsZSkgbVRleHQsIG1heCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKEVkaXRhYmxlKSBtVGV4dCkucmVwbGFjZShtaW4sIG1heCwgcGFzdGUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChFZGl0YWJsZSkgbVRleHQpLmluc2VydChnZXRTZWxlY3Rpb25FbmQoKSwgIlxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKEVkaXRhYmxlKSBtVGV4dCkuaW5zZXJ0KGdldFNlbGVjdGlvbkVuZCgpLCBwYXN0ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBzdG9wU2VsZWN0aW9uQWN0aW9uTW9kZSgpOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisKKyAgICAgICAgICAgICAgICBjYXNlIElEX0NVVDoKKyAgICAgICAgICAgICAgICAgICAgY2xpcGJvYXJkLnNldFByaW1hcnlDbGlwKENsaXBEYXRhLm5ld1BsYWluVGV4dChudWxsLCBudWxsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1UcmFuc2Zvcm1lZC5zdWJTZXF1ZW5jZShtaW4sIG1heCkpKTsKKyAgICAgICAgICAgICAgICAgICAgKChFZGl0YWJsZSkgbVRleHQpLmRlbGV0ZShtaW4sIG1heCk7CisgICAgICAgICAgICAgICAgICAgIHN0b3BTZWxlY3Rpb25BY3Rpb25Nb2RlKCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworCisgICAgICAgICAgICAgICAgY2FzZSBJRF9DT1BZOgorICAgICAgICAgICAgICAgICAgICBjbGlwYm9hcmQuc2V0UHJpbWFyeUNsaXAoQ2xpcERhdGEubmV3UGxhaW5UZXh0KG51bGwsIG51bGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVRyYW5zZm9ybWVkLnN1YlNlcXVlbmNlKG1pbiwgbWF4KSkpOworICAgICAgICAgICAgICAgICAgICBzdG9wU2VsZWN0aW9uQWN0aW9uTW9kZSgpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIG9uRGVzdHJveUFjdGlvbk1vZGUoQWN0aW9uTW9kZSBtb2RlKSB7CisgICAgICAgICAgICBTZWxlY3Rpb24uc2V0U2VsZWN0aW9uKChTcGFubmFibGUpIG1UZXh0LCBnZXRTZWxlY3Rpb25TdGFydCgpKTsKICAgICAgICAgICAgIGlmIChtU2VsZWN0aW9uTW9kaWZpZXJDdXJzb3JDb250cm9sbGVyICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICBtU2VsZWN0aW9uTW9kaWZpZXJDdXJzb3JDb250cm9sbGVyLmhpZGUoKTsKICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgbUlzSW5UZXh0U2VsZWN0aW9uTW9kZSA9IGZhbHNlOworICAgICAgICAgICAgbVNlbGVjdGlvbkFjdGlvbk1vZGUgPSBudWxsOwogICAgICAgICB9CiAgICAgfQogCkBAIC03ODUzLDggKzc5MzUsNiBAQAogICAgICAgICBwcml2YXRlIGJvb2xlYW4gbVN0YXJ0SXNEcmFnZ2VkID0gZmFsc2U7CiAgICAgICAgIC8vIFN0YXJ0aW5nIHRpbWUgb2YgdGhlIGZhZGUgdGltZXIKICAgICAgICAgcHJpdmF0ZSBsb25nIG1GYWRlT3V0VGltZXJTdGFydDsKLSAgICAgICAgLy8gVXNlZCB0byBkZXRlY3QgYSB0YXAgKHZzIGRyYWcpIG9uIHRoZSBjb250cm9sbGVyCi0gICAgICAgIHByaXZhdGUgbG9uZyBtT25Eb3duVGltZXJTdGFydDsKICAgICAgICAgLy8gVGhlIGN1cnNvciBjb250cm9sbGVyIGltYWdlcwogICAgICAgICBwcml2YXRlIGZpbmFsIEhhbmRsZSBtU3RhcnRIYW5kbGUsIG1FbmRIYW5kbGU7CiAgICAgICAgIC8vIE9mZnNldCBiZXR3ZWVuIGZpbmdlciBob3QgcG9pbnQgb24gYWN0aXZlIGN1cnNvciBjb250cm9sbGVyIGFuZCBhY3R1YWwgY3Vyc29yCkBAIC03OTY1LDggKzgwNDUsOCBAQAogICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgYm9vbGVhbiBvbmVMaW5lU2VsZWN0aW9uID0gbUxheW91dC5nZXRMaW5lRm9yT2Zmc2V0KHNlbGVjdGlvblN0YXJ0KSA9PQotICAgICAgICAgICAgICAgIG1MYXlvdXQuZ2V0TGluZUZvck9mZnNldChzZWxlY3Rpb25FbmQpOworICAgICAgICAgICAgYm9vbGVhbiBvbmVMaW5lU2VsZWN0aW9uID0KKyAgICAgICAgICAgICAgICBtTGF5b3V0LmdldExpbmVGb3JPZmZzZXQoc2VsZWN0aW9uU3RhcnQpID09IG1MYXlvdXQuZ2V0TGluZUZvck9mZnNldChzZWxlY3Rpb25FbmQpOwogICAgICAgICAgICAgbVN0YXJ0SGFuZGxlLnBvc2l0aW9uQXRDdXJzb3Ioc2VsZWN0aW9uU3RhcnQsIG9uZUxpbmVTZWxlY3Rpb24pOwogICAgICAgICAgICAgbUVuZEhhbmRsZS5wb3NpdGlvbkF0Q3Vyc29yKHNlbGVjdGlvbkVuZCwgdHJ1ZSk7CiAKQEAgLTgwMDcsMjIgKzgwODcsMTIgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1PZmZzZXRYICs9IHZpZXdwb3J0VG9Db250ZW50SG9yaXpvbnRhbE9mZnNldCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbU9mZnNldFkgKz0gdmlld3BvcnRUb0NvbnRlbnRWZXJ0aWNhbE9mZnNldCgpOwogCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtT25Eb3duVGltZXJTdGFydCA9IGV2ZW50LmdldEV2ZW50VGltZSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChBcnJvd0tleU1vdmVtZW50TWV0aG9kKW1Nb3ZlbWVudCkuc2V0Q3Vyc29yQ29udHJvbGxlcih0aGlzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogCi0gICAgICAgICAgICAgICAgICAgIGNhc2UgTW90aW9uRXZlbnQuQUNUSU9OX1VQOgotICAgICAgICAgICAgICAgICAgICAgICAgaW50IHRpbWUgPSAoaW50KSAoZXZlbnQuZ2V0RXZlbnRUaW1lKCkgLSBtT25Eb3duVGltZXJTdGFydCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aW1lIDw9IFZpZXdDb25maWd1cmF0aW9uLmdldFRhcFRpbWVvdXQoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEEgdGFwIG9uIHRoZSBjb250cm9sbGVyIChub3QgYSBkcmFnKSBvcGVucyB0aGUgY29udGV4dHVhbCBDb3B5IG1lbnUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG93Q29udGV4dE1lbnUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCiAgICAgICAgICAgICAgICAgICAgIGNhc2UgTW90aW9uRXZlbnQuQUNUSU9OX1BPSU5URVJfRE9XTjoKICAgICAgICAgICAgICAgICAgICAgY2FzZSBNb3Rpb25FdmVudC5BQ1RJT05fUE9JTlRFUl9VUDoKICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEhhbmRsZSBtdWx0aS1wb2ludCBnZXN0dXJlcy4gS2VlcCBtaW4gYW5kIG1heCBvZmZzZXQgcG9zaXRpb25zLgpAQCAtODA4Miw3ICs4MTUyLDcgQEAKIAogICAgIHByaXZhdGUgdm9pZCBoaWRlQ29udHJvbGxlcnMoKSB7CiAgICAgICAgIGhpZGVJbnNlcnRpb25Qb2ludEN1cnNvckNvbnRyb2xsZXIoKTsKLSAgICAgICAgc3RvcFRleHRTZWxlY3Rpb25Nb2RlKCk7CisgICAgICAgIHN0b3BTZWxlY3Rpb25BY3Rpb25Nb2RlKCk7CiAgICAgfQogCiAgICAgcHJpdmF0ZSBpbnQgZ2V0T2Zmc2V0Rm9ySG9yaXpvbnRhbChpbnQgbGluZSwgaW50IHgpIHsKQEAgLTgxNDUsNyArODIxNSw4IEBACiAgICAgICAgIHJldHVybiBnZXRPZmZzZXRGb3JIb3Jpem9udGFsKGxpbmUsIHgpOwogICAgIH0KIAotICAgIEBWaWV3RGVidWcuRXhwb3J0ZWRQcm9wZXJ0eQorCisgICAgQFZpZXdEZWJ1Zy5FeHBvcnRlZFByb3BlcnR5KGNhdGVnb3J5ID0gInRleHQiKQogICAgIHByaXZhdGUgQ2hhclNlcXVlbmNlICAgICAgICAgICAgbVRleHQ7CiAgICAgcHJpdmF0ZSBDaGFyU2VxdWVuY2UgICAgICAgICAgICBtVHJhbnNmb3JtZWQ7CiAgICAgcHJpdmF0ZSBCdWZmZXJUeXBlICAgICAgICAgICAgICBtQnVmZmVyVHlwZSA9IEJ1ZmZlclR5cGUuTk9STUFMOwpAQCAtODE3Niw3ICs4MjQ3LDcgQEAKICAgICAvLyBDdXJzb3IgQ29udHJvbGxlcnMuIE51bGwgd2hlbiBkaXNhYmxlZC4KICAgICBwcml2YXRlIEN1cnNvckNvbnRyb2xsZXIgICAgICAgIG1JbnNlcnRpb25Qb2ludEN1cnNvckNvbnRyb2xsZXI7CiAgICAgcHJpdmF0ZSBDdXJzb3JDb250cm9sbGVyICAgICAgICBtU2VsZWN0aW9uTW9kaWZpZXJDdXJzb3JDb250cm9sbGVyOwotICAgIHByaXZhdGUgYm9vbGVhbiAgICAgICAgICAgICAgICAgbUlzSW5UZXh0U2VsZWN0aW9uTW9kZSA9IGZhbHNlOworICAgIHByaXZhdGUgQWN0aW9uTW9kZSAgICAgICAgICAgICAgbVNlbGVjdGlvbkFjdGlvbk1vZGU7CiAgICAgcHJpdmF0ZSBpbnQgICAgICAgICAgICAgICAgICAgICBtTGFzdFRvdWNoT2Zmc2V0ID0gLTE7CiAgICAgLy8gQ3JlYXRlZCBvbmNlIGFuZCBzaGFyZWQgYnkgZGlmZmVyZW50IEN1cnNvckNvbnRyb2xsZXIgaGVscGVyIG1ldGhvZHMuCiAgICAgLy8gT25seSBvbmUgY3Vyc29yIGNvbnRyb2xsZXIgaXMgYWN0aXZlIGF0IGFueSB0aW1lIHdoaWNoIHByZXZlbnQgcmFjZSBjb25kaXRpb25zLgpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L1ZpZXdBbmltYXRvci5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L1ZpZXdBbmltYXRvci5qYXZhCmluZGV4IDkwN2NmYjMuLjdiNjY4OTMgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9WaWV3QW5pbWF0b3IuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvVmlld0FuaW1hdG9yLmphdmEKQEAgLTMxLDExICszMSwxMyBAQAogICoKICAqIEBhdHRyIHJlZiBhbmRyb2lkLlIuc3R5bGVhYmxlI1ZpZXdBbmltYXRvcl9pbkFuaW1hdGlvbgogICogQGF0dHIgcmVmIGFuZHJvaWQuUi5zdHlsZWFibGUjVmlld0FuaW1hdG9yX291dEFuaW1hdGlvbgorICogQGF0dHIgcmVmIGFuZHJvaWQuUi5zdHlsZWFibGUjVmlld0FuaW1hdG9yX2FuaW1hdGVGaXJzdFZpZXcKICAqLwogcHVibGljIGNsYXNzIFZpZXdBbmltYXRvciBleHRlbmRzIEZyYW1lTGF5b3V0IHsKIAogICAgIGludCBtV2hpY2hDaGlsZCA9IDA7CiAgICAgYm9vbGVhbiBtRmlyc3RUaW1lID0gdHJ1ZTsKKwogICAgIGJvb2xlYW4gbUFuaW1hdGVGaXJzdFRpbWUgPSB0cnVlOwogCiAgICAgQW5pbWF0aW9uIG1JbkFuaW1hdGlvbjsKQEAgLTU5LDYgKzYxLDEwIEBACiAgICAgICAgIGlmIChyZXNvdXJjZSA+IDApIHsKICAgICAgICAgICAgIHNldE91dEFuaW1hdGlvbihjb250ZXh0LCByZXNvdXJjZSk7CiAgICAgICAgIH0KKworICAgICAgICBib29sZWFuIGZsYWcgPSBhLmdldEJvb2xlYW4oY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZWFibGUuVmlld0FuaW1hdG9yX2FuaW1hdGVGaXJzdFZpZXcsIHRydWUpOworICAgICAgICBzZXRBbmltYXRlRmlyc3RWaWV3KGZsYWcpOworCiAgICAgICAgIGEucmVjeWNsZSgpOwogCiAgICAgICAgIGluaXRWaWV3QW5pbWF0b3IoY29udGV4dCwgYXR0cnMpOwpAQCAtODQsMTAgKzkwLDEwIEBACiAgICAgICAgIHNldE1lYXN1cmVBbGxDaGlsZHJlbihtZWFzdXJlQWxsQ2hpbGRyZW4pOwogICAgICAgICBhLnJlY3ljbGUoKTsKICAgICB9Ci0gICAgCisKICAgICAvKioKICAgICAgKiBTZXRzIHdoaWNoIGNoaWxkIHZpZXcgd2lsbCBiZSBkaXNwbGF5ZWQuCi0gICAgICogCisgICAgICoKICAgICAgKiBAcGFyYW0gd2hpY2hDaGlsZCB0aGUgaW5kZXggb2YgdGhlIGNoaWxkIHZpZXcgdG8gZGlzcGxheQogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldERpc3BsYXllZENoaWxkKGludCB3aGljaENoaWxkKSB7CkBAIC0xMDUsMTQgKzExMSwxNCBAQAogICAgICAgICAgICAgcmVxdWVzdEZvY3VzKEZPQ1VTX0ZPUldBUkQpOwogICAgICAgICB9CiAgICAgfQotICAgIAorCiAgICAgLyoqCiAgICAgICogUmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIGN1cnJlbnRseSBkaXNwbGF5ZWQgY2hpbGQgdmlldy4KICAgICAgKi8KICAgICBwdWJsaWMgaW50IGdldERpc3BsYXllZENoaWxkKCkgewogICAgICAgICByZXR1cm4gbVdoaWNoQ2hpbGQ7CiAgICAgfQotICAgIAorCiAgICAgLyoqCiAgICAgICogTWFudWFsbHkgc2hvd3MgdGhlIG5leHQgY2hpbGQuCiAgICAgICovCkBAIC0xMjgsNiArMTM0LDM1IEBACiAgICAgfQogCiAgICAgLyoqCisgICAgICogU2hvd3Mgb25seSB0aGUgc3BlY2lmaWVkIGNoaWxkLiBUaGUgb3RoZXIgZGlzcGxheXMgVmlld3MgZXhpdCB0aGUgc2NyZWVuLAorICAgICAqIG9wdGlvbmFsbHkgd2l0aCB0aGUgd2l0aCB0aGUge0BsaW5rICNnZXRPdXRBbmltYXRpb24oKSBvdXQgYW5pbWF0aW9ufSBhbmQKKyAgICAgKiB0aGUgc3BlY2lmaWVkIGNoaWxkIGVudGVycyB0aGUgc2NyZWVuLCBvcHRpb25hbGx5IHdpdGggdGhlCisgICAgICoge0BsaW5rICNnZXRJbkFuaW1hdGlvbigpIGluIGFuaW1hdGlvbn0uCisgICAgICoKKyAgICAgKiBAcGFyYW0gY2hpbGRJbmRleCBUaGUgaW5kZXggb2YgdGhlIGNoaWxkIHRvIGJlIHNob3duLgorICAgICAqIEBwYXJhbSBhbmltYXRlIFdoZXRoZXIgb3Igbm90IHRvIHVzZSB0aGUgaW4gYW5kIG91dCBhbmltYXRpb25zLCBkZWZhdWx0cworICAgICAqICAgICAgICAgICAgdG8gdHJ1ZS4KKyAgICAgKi8KKyAgICB2b2lkIHNob3dPbmx5KGludCBjaGlsZEluZGV4LCBib29sZWFuIGFuaW1hdGUpIHsKKyAgICAgICAgZmluYWwgaW50IGNvdW50ID0gZ2V0Q2hpbGRDb3VudCgpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKyAgICAgICAgICAgIGZpbmFsIFZpZXcgY2hpbGQgPSBnZXRDaGlsZEF0KGkpOworICAgICAgICAgICAgaWYgKGkgPT0gY2hpbGRJbmRleCkgeworICAgICAgICAgICAgICAgIGlmIChhbmltYXRlICYmIG1JbkFuaW1hdGlvbiAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGNoaWxkLnN0YXJ0QW5pbWF0aW9uKG1JbkFuaW1hdGlvbik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNoaWxkLnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKKyAgICAgICAgICAgICAgICBtRmlyc3RUaW1lID0gZmFsc2U7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGlmIChhbmltYXRlICYmIG1PdXRBbmltYXRpb24gIT0gbnVsbCAmJiBjaGlsZC5nZXRWaXNpYmlsaXR5KCkgPT0gVmlldy5WSVNJQkxFKSB7CisgICAgICAgICAgICAgICAgICAgIGNoaWxkLnN0YXJ0QW5pbWF0aW9uKG1PdXRBbmltYXRpb24pOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY2hpbGQuZ2V0QW5pbWF0aW9uKCkgPT0gbUluQW5pbWF0aW9uKQorICAgICAgICAgICAgICAgICAgICBjaGlsZC5jbGVhckFuaW1hdGlvbigpOworICAgICAgICAgICAgICAgIGNoaWxkLnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICAvKioKICAgICAgKiBTaG93cyBvbmx5IHRoZSBzcGVjaWZpZWQgY2hpbGQuIFRoZSBvdGhlciBkaXNwbGF5cyBWaWV3cyBleGl0IHRoZSBzY3JlZW4KICAgICAgKiB3aXRoIHRoZSB7QGxpbmsgI2dldE91dEFuaW1hdGlvbigpIG91dCBhbmltYXRpb259IGFuZCB0aGUgc3BlY2lmaWVkIGNoaWxkCiAgICAgICogZW50ZXJzIHRoZSBzY3JlZW4gd2l0aCB0aGUge0BsaW5rICNnZXRJbkFuaW1hdGlvbigpIGluIGFuaW1hdGlvbn0uCkBAIC0xMzUsMjQgKzE3MCw4IEBACiAgICAgICogQHBhcmFtIGNoaWxkSW5kZXggVGhlIGluZGV4IG9mIHRoZSBjaGlsZCB0byBiZSBzaG93bi4KICAgICAgKi8KICAgICB2b2lkIHNob3dPbmx5KGludCBjaGlsZEluZGV4KSB7Ci0gICAgICAgIGZpbmFsIGludCBjb3VudCA9IGdldENoaWxkQ291bnQoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7Ci0gICAgICAgICAgICBmaW5hbCBWaWV3IGNoaWxkID0gZ2V0Q2hpbGRBdChpKTsKLSAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gY2hlY2tGb3JGaXJzdCA9ICghbUZpcnN0VGltZSB8fCBtQW5pbWF0ZUZpcnN0VGltZSk7Ci0gICAgICAgICAgICBpZiAoaSA9PSBjaGlsZEluZGV4KSB7Ci0gICAgICAgICAgICAgICAgaWYgKGNoZWNrRm9yRmlyc3QgJiYgbUluQW5pbWF0aW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgY2hpbGQuc3RhcnRBbmltYXRpb24obUluQW5pbWF0aW9uKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY2hpbGQuc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOwotICAgICAgICAgICAgICAgIG1GaXJzdFRpbWUgPSBmYWxzZTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaWYgKGNoZWNrRm9yRmlyc3QgJiYgbU91dEFuaW1hdGlvbiAhPSBudWxsICYmIGNoaWxkLmdldFZpc2liaWxpdHkoKSA9PSBWaWV3LlZJU0lCTEUpIHsKLSAgICAgICAgICAgICAgICAgICAgY2hpbGQuc3RhcnRBbmltYXRpb24obU91dEFuaW1hdGlvbik7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjaGlsZC5nZXRBbmltYXRpb24oKSA9PSBtSW5BbmltYXRpb24pCi0gICAgICAgICAgICAgICAgICAgIGNoaWxkLmNsZWFyQW5pbWF0aW9uKCk7Ci0gICAgICAgICAgICAgICAgY2hpbGQuc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOwotICAgICAgICAgICAgfQotICAgICAgICB9CisgICAgICAgIGZpbmFsIGJvb2xlYW4gYW5pbWF0ZSA9ICghbUZpcnN0VGltZSB8fCBtQW5pbWF0ZUZpcnN0VGltZSk7CisgICAgICAgIHNob3dPbmx5KGNoaWxkSW5kZXgsIGFuaW1hdGUpOwogICAgIH0KIAogICAgIEBPdmVycmlkZQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L1ZpZXdGbGlwcGVyLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvVmlld0ZsaXBwZXIuamF2YQppbmRleCA4MDM0OTYxLi5jNmY2ZTgxIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvVmlld0ZsaXBwZXIuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvVmlld0ZsaXBwZXIuamF2YQpAQCAtNzUsNyArNzUsNyBAQAogICAgICAgICAgICAgICAgIHVwZGF0ZVJ1bm5pbmcoKTsKICAgICAgICAgICAgIH0gZWxzZSBpZiAoSW50ZW50LkFDVElPTl9VU0VSX1BSRVNFTlQuZXF1YWxzKGFjdGlvbikpIHsKICAgICAgICAgICAgICAgICBtVXNlclByZXNlbnQgPSB0cnVlOwotICAgICAgICAgICAgICAgIHVwZGF0ZVJ1bm5pbmcoKTsKKyAgICAgICAgICAgICAgICB1cGRhdGVSdW5uaW5nKGZhbHNlKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH07CkBAIC0xMDksNyArMTA5LDcgQEAKICAgICBwcm90ZWN0ZWQgdm9pZCBvbldpbmRvd1Zpc2liaWxpdHlDaGFuZ2VkKGludCB2aXNpYmlsaXR5KSB7CiAgICAgICAgIHN1cGVyLm9uV2luZG93VmlzaWJpbGl0eUNoYW5nZWQodmlzaWJpbGl0eSk7CiAgICAgICAgIG1WaXNpYmxlID0gdmlzaWJpbGl0eSA9PSBWSVNJQkxFOwotICAgICAgICB1cGRhdGVSdW5uaW5nKCk7CisgICAgICAgIHVwZGF0ZVJ1bm5pbmcoZmFsc2UpOwogICAgIH0KIAogICAgIC8qKgpAQCAtMTQ0LDEwICsxNDQsMjIgQEAKICAgICAgKiBvbiB7QGxpbmsgI21SdW5uaW5nfSBhbmQge0BsaW5rICNtVmlzaWJsZX0gc3RhdGUuCiAgICAgICovCiAgICAgcHJpdmF0ZSB2b2lkIHVwZGF0ZVJ1bm5pbmcoKSB7CisgICAgICAgIHVwZGF0ZVJ1bm5pbmcodHJ1ZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogSW50ZXJuYWwgbWV0aG9kIHRvIHN0YXJ0IG9yIHN0b3AgZGlzcGF0Y2hpbmcgZmxpcCB7QGxpbmsgTWVzc2FnZX0gYmFzZWQKKyAgICAgKiBvbiB7QGxpbmsgI21SdW5uaW5nfSBhbmQge0BsaW5rICNtVmlzaWJsZX0gc3RhdGUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZmxpcE5vdyBEZXRlcm1pbmVzIHdoZXRoZXIgb3Igbm90IHRvIGV4ZWN1dGUgdGhlIGFuaW1hdGlvbiBub3csIGluCisgICAgICogICAgICAgICAgICBhZGRpdGlvbiB0byBxdWV1aW5nIGZ1dHVyZSBmbGlwcy4gSWYgb21pdHRlZCwgZGVmYXVsdHMgdG8KKyAgICAgKiAgICAgICAgICAgIHRydWUuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIHVwZGF0ZVJ1bm5pbmcoYm9vbGVhbiBmbGlwTm93KSB7CiAgICAgICAgIGJvb2xlYW4gcnVubmluZyA9IG1WaXNpYmxlICYmIG1TdGFydGVkICYmIG1Vc2VyUHJlc2VudDsKICAgICAgICAgaWYgKHJ1bm5pbmcgIT0gbVJ1bm5pbmcpIHsKICAgICAgICAgICAgIGlmIChydW5uaW5nKSB7Ci0gICAgICAgICAgICAgICAgc2hvd09ubHkobVdoaWNoQ2hpbGQpOworICAgICAgICAgICAgICAgIHNob3dPbmx5KG1XaGljaENoaWxkLCBmbGlwTm93KTsKICAgICAgICAgICAgICAgICBNZXNzYWdlIG1zZyA9IG1IYW5kbGVyLm9idGFpbk1lc3NhZ2UoRkxJUF9NU0cpOwogICAgICAgICAgICAgICAgIG1IYW5kbGVyLnNlbmRNZXNzYWdlRGVsYXllZChtc2csIG1GbGlwSW50ZXJ2YWwpOwogICAgICAgICAgICAgfSBlbHNlIHsKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9ab29tQnV0dG9uc0NvbnRyb2xsZXIuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9ab29tQnV0dG9uc0NvbnRyb2xsZXIuamF2YQppbmRleCAzZGY0MTlhLi40NTBjOTY2IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvWm9vbUJ1dHRvbnNDb250cm9sbGVyLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L1pvb21CdXR0b25zQ29udHJvbGxlci5qYXZhCkBAIC02Niw4ICs2Niw5IEBACiAgKiB7QGxpbmsgI3NldFpvb21JbkVuYWJsZWQoYm9vbGVhbil9IGFuZCB7QGxpbmsgI3NldFpvb21PdXRFbmFibGVkKGJvb2xlYW4pfS4KICAqIDxwPgogICogSWYgeW91IGFyZSB1c2luZyB0aGlzIHdpdGggYSBjdXN0b20gVmlldywgcGxlYXNlIGNhbGwKLSAqIHtAbGluayAjc2V0VmlzaWJsZShib29sZWFuKSBzZXRWaXNpYmxlKGZhbHNlKX0gZnJvbSB0aGUKLSAqIHtAbGluayBWaWV3I29uRGV0YWNoZWRGcm9tV2luZG93fS4KKyAqIHtAbGluayAjc2V0VmlzaWJsZShib29sZWFuKSBzZXRWaXNpYmxlKGZhbHNlKX0gZnJvbQorICoge0BsaW5rIFZpZXcjb25EZXRhY2hlZEZyb21XaW5kb3d9IGFuZCBmcm9tIHtAbGluayBWaWV3I29uVmlzaWJpbGl0eUNoYW5nZWR9CisgKiB3aGVuIDxjb2RlPnZpc2liaWxpdHkgIT0gVmlldy5WSVNJQkxFPC9jb2RlPi4KICAqCiAgKi8KIHB1YmxpYyBjbGFzcyBab29tQnV0dG9uc0NvbnRyb2xsZXIgaW1wbGVtZW50cyBWaWV3Lk9uVG91Y2hMaXN0ZW5lciB7CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvYXBwL0FjdGlvbkJhckltcGwuamF2YSBiL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC9hcHAvQWN0aW9uQmFySW1wbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNmMDI5ZDIKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvYXBwL0FjdGlvbkJhckltcGwuamF2YQpAQCAtMCwwICsxLDU2NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQuaW50ZXJuYWwuYXBwOworCitpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudmlldy5tZW51Lk1lbnVCdWlsZGVyOworaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnZpZXcubWVudS5NZW51UG9wdXBIZWxwZXI7CitpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudmlldy5tZW51LlN1Yk1lbnVCdWlsZGVyOworaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLndpZGdldC5BY3Rpb25CYXJDb250ZXh0VmlldzsKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC53aWRnZXQuQWN0aW9uQmFyVmlldzsKKworaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGlvbkJhcjsKK2ltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eTsKK2ltcG9ydCBhbmRyb2lkLmFwcC5EaWFsb2c7CitpbXBvcnQgYW5kcm9pZC5hcHAuRnJhZ21lbnQ7CitpbXBvcnQgYW5kcm9pZC5hcHAuRnJhZ21lbnRUcmFuc2FjdGlvbjsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlOworaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlcjsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuQWN0aW9uTW9kZTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuTWVudTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuTWVudUluZmxhdGVyOworaW1wb3J0IGFuZHJvaWQudmlldy5NZW51SXRlbTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5MaW5lYXJMYXlvdXQ7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuU3Bpbm5lckFkYXB0ZXI7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuVmlld0FuaW1hdG9yOworCitpbXBvcnQgamF2YS5sYW5nLnJlZi5XZWFrUmVmZXJlbmNlOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CisKKy8qKgorICogQWN0aW9uQmFySW1wbCBpcyB0aGUgQWN0aW9uQmFyIGltcGxlbWVudGF0aW9uIHVzZWQKKyAqIGJ5IGRldmljZXMgb2YgYWxsIHNjcmVlbiBzaXplcy4gSWYgaXQgZGV0ZWN0cyBhIGNvbXBhdGlibGUgZGVjb3IsCisgKiBpdCB3aWxsIHNwbGl0IGNvbnRleHR1YWwgbW9kZXMgYWNyb3NzIGJvdGggdGhlIEFjdGlvbkJhclZpZXcgYXQKKyAqIHRoZSB0b3Agb2YgdGhlIHNjcmVlbiBhbmQgYSBob3Jpem9udGFsIExpbmVhckxheW91dCBhdCB0aGUgYm90dG9tCisgKiB3aGljaCBpcyBub3JtYWxseSBoaWRkZW4uCisgKi8KK3B1YmxpYyBjbGFzcyBBY3Rpb25CYXJJbXBsIGV4dGVuZHMgQWN0aW9uQmFyIHsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTk9STUFMX1ZJRVcgPSAwOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDT05URVhUX1ZJRVcgPSAxOworICAgIAorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBUQUJfU1dJVENIX1NIT1dfSElERSA9IDA7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFRBQl9TV0lUQ0hfQUREX1JFTU9WRSA9IDE7CisKKyAgICBwcml2YXRlIENvbnRleHQgbUNvbnRleHQ7CisgICAgcHJpdmF0ZSBBY3Rpdml0eSBtQWN0aXZpdHk7CisgICAgcHJpdmF0ZSBEaWFsb2cgbURpYWxvZzsKKworICAgIHByaXZhdGUgVmlld0FuaW1hdG9yIG1BbmltYXRvclZpZXc7CisgICAgcHJpdmF0ZSBBY3Rpb25CYXJWaWV3IG1BY3Rpb25WaWV3OworICAgIHByaXZhdGUgQWN0aW9uQmFyQ29udGV4dFZpZXcgbVVwcGVyQ29udGV4dFZpZXc7CisgICAgcHJpdmF0ZSBMaW5lYXJMYXlvdXQgbUxvd2VyQ29udGV4dFZpZXc7CisKKyAgICBwcml2YXRlIEFycmF5TGlzdDxUYWJJbXBsPiBtVGFicyA9IG5ldyBBcnJheUxpc3Q8VGFiSW1wbD4oKTsKKworICAgIHByaXZhdGUgaW50IG1UYWJDb250YWluZXJWaWV3SWQgPSBhbmRyb2lkLlIuaWQuY29udGVudDsKKyAgICBwcml2YXRlIFRhYkltcGwgbVNlbGVjdGVkVGFiOworICAgIHByaXZhdGUgaW50IG1UYWJTd2l0Y2hNb2RlID0gVEFCX1NXSVRDSF9BRERfUkVNT1ZFOworICAgIAorICAgIHByaXZhdGUgQWN0aW9uTW9kZSBtQWN0aW9uTW9kZTsKKyAgICAKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQ09OVEVYVF9ESVNQTEFZX05PUk1BTCA9IDA7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IENPTlRFWFRfRElTUExBWV9TUExJVCA9IDE7CisgICAgCisgICAgcHJpdmF0ZSBpbnQgbUNvbnRleHREaXNwbGF5TW9kZTsKKworICAgIHByaXZhdGUgYm9vbGVhbiBtQ2xvc2luZ0NvbnRleHQ7CisKKyAgICBmaW5hbCBIYW5kbGVyIG1IYW5kbGVyID0gbmV3IEhhbmRsZXIoKTsKKyAgICBmaW5hbCBSdW5uYWJsZSBtQ2xvc2VDb250ZXh0ID0gbmV3IFJ1bm5hYmxlKCkgeworICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICBtVXBwZXJDb250ZXh0Vmlldy5jbG9zZU1vZGUoKTsKKyAgICAgICAgICAgIGlmIChtTG93ZXJDb250ZXh0VmlldyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgbUxvd2VyQ29udGV4dFZpZXcucmVtb3ZlQWxsVmlld3MoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1DbG9zaW5nQ29udGV4dCA9IGZhbHNlOworICAgICAgICB9CisgICAgfTsKKworICAgIHB1YmxpYyBBY3Rpb25CYXJJbXBsKEFjdGl2aXR5IGFjdGl2aXR5KSB7CisgICAgICAgIG1BY3Rpdml0eSA9IGFjdGl2aXR5OworICAgICAgICBpbml0KGFjdGl2aXR5LmdldFdpbmRvdygpLmdldERlY29yVmlldygpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgQWN0aW9uQmFySW1wbChEaWFsb2cgZGlhbG9nKSB7CisgICAgICAgIG1EaWFsb2cgPSBkaWFsb2c7CisgICAgICAgIGluaXQoZGlhbG9nLmdldFdpbmRvdygpLmdldERlY29yVmlldygpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgaW5pdChWaWV3IGRlY29yKSB7CisgICAgICAgIG1Db250ZXh0ID0gZGVjb3IuZ2V0Q29udGV4dCgpOworICAgICAgICBtQWN0aW9uVmlldyA9IChBY3Rpb25CYXJWaWV3KSBkZWNvci5maW5kVmlld0J5SWQoY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5pZC5hY3Rpb25fYmFyKTsKKyAgICAgICAgbVVwcGVyQ29udGV4dFZpZXcgPSAoQWN0aW9uQmFyQ29udGV4dFZpZXcpIGRlY29yLmZpbmRWaWV3QnlJZCgKKyAgICAgICAgICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmlkLmFjdGlvbl9jb250ZXh0X2Jhcik7CisgICAgICAgIG1Mb3dlckNvbnRleHRWaWV3ID0gKExpbmVhckxheW91dCkgZGVjb3IuZmluZFZpZXdCeUlkKAorICAgICAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuaWQubG93ZXJfYWN0aW9uX2NvbnRleHRfYmFyKTsKKyAgICAgICAgbUFuaW1hdG9yVmlldyA9IChWaWV3QW5pbWF0b3IpIGRlY29yLmZpbmRWaWV3QnlJZCgKKyAgICAgICAgICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmlkLmFjdGlvbl9iYXJfYW5pbWF0b3IpOworCisgICAgICAgIGlmIChtQWN0aW9uVmlldyA9PSBudWxsIHx8IG1VcHBlckNvbnRleHRWaWV3ID09IG51bGwgfHwgbUFuaW1hdG9yVmlldyA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKGdldENsYXNzKCkuZ2V0U2ltcGxlTmFtZSgpICsgIiBjYW4gb25seSBiZSB1c2VkICIgKworICAgICAgICAgICAgICAgICAgICAid2l0aCBhIGNvbXBhdGlibGUgd2luZG93IGRlY29yIGxheW91dCIpOworICAgICAgICB9CisKKyAgICAgICAgbUFjdGlvblZpZXcuc2V0Q29udGV4dFZpZXcobVVwcGVyQ29udGV4dFZpZXcpOworICAgICAgICBtQ29udGV4dERpc3BsYXlNb2RlID0gbUxvd2VyQ29udGV4dFZpZXcgPT0gbnVsbCA/CisgICAgICAgICAgICAgICAgQ09OVEVYVF9ESVNQTEFZX05PUk1BTCA6IENPTlRFWFRfRElTUExBWV9TUExJVDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBzZXRUaXRsZShpbnQgcmVzSWQpIHsKKyAgICAgICAgc2V0VGl0bGUobUNvbnRleHQuZ2V0U3RyaW5nKHJlc0lkKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgc2V0U3VidGl0bGUoaW50IHJlc0lkKSB7CisgICAgICAgIHNldFN1YnRpdGxlKG1Db250ZXh0LmdldFN0cmluZyhyZXNJZCkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldEN1c3RvbU5hdmlnYXRpb25Nb2RlKFZpZXcgdmlldykgeworICAgICAgICBjbGVhbnVwVGFicygpOworICAgICAgICBtQWN0aW9uVmlldy5zZXRDdXN0b21OYXZpZ2F0aW9uVmlldyh2aWV3KTsKKyAgICAgICAgbUFjdGlvblZpZXcuc2V0Q2FsbGJhY2sobnVsbCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0RHJvcGRvd25OYXZpZ2F0aW9uTW9kZShTcGlubmVyQWRhcHRlciBhZGFwdGVyLCBOYXZpZ2F0aW9uQ2FsbGJhY2sgY2FsbGJhY2spIHsKKyAgICAgICAgc2V0RHJvcGRvd25OYXZpZ2F0aW9uTW9kZShhZGFwdGVyLCBjYWxsYmFjaywgLTEpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldERyb3Bkb3duTmF2aWdhdGlvbk1vZGUoU3Bpbm5lckFkYXB0ZXIgYWRhcHRlciwgTmF2aWdhdGlvbkNhbGxiYWNrIGNhbGxiYWNrLAorICAgICAgICAgICAgaW50IGRlZmF1bHRTZWxlY3RlZFBvc2l0aW9uKSB7CisgICAgICAgIGNsZWFudXBUYWJzKCk7CisgICAgICAgIG1BY3Rpb25WaWV3LnNldE5hdmlnYXRpb25Nb2RlKE5BVklHQVRJT05fTU9ERV9EUk9QRE9XTl9MSVNUKTsKKyAgICAgICAgbUFjdGlvblZpZXcuc2V0RHJvcGRvd25BZGFwdGVyKGFkYXB0ZXIpOworICAgICAgICBpZiAoZGVmYXVsdFNlbGVjdGVkUG9zaXRpb24gPj0gMCkgeworICAgICAgICAgICAgbUFjdGlvblZpZXcuc2V0RHJvcGRvd25TZWxlY3RlZFBvc2l0aW9uKGRlZmF1bHRTZWxlY3RlZFBvc2l0aW9uKTsKKyAgICAgICAgfQorICAgICAgICBtQWN0aW9uVmlldy5zZXRDYWxsYmFjayhjYWxsYmFjayk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0U3RhbmRhcmROYXZpZ2F0aW9uTW9kZSgpIHsKKyAgICAgICAgY2xlYW51cFRhYnMoKTsKKyAgICAgICAgbUFjdGlvblZpZXcuc2V0TmF2aWdhdGlvbk1vZGUoTkFWSUdBVElPTl9NT0RFX1NUQU5EQVJEKTsKKyAgICAgICAgbUFjdGlvblZpZXcuc2V0Q2FsbGJhY2sobnVsbCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0U2VsZWN0ZWROYXZpZ2F0aW9uSXRlbShpbnQgcG9zaXRpb24pIHsKKyAgICAgICAgc3dpdGNoIChtQWN0aW9uVmlldy5nZXROYXZpZ2F0aW9uTW9kZSgpKSB7CisgICAgICAgIGNhc2UgTkFWSUdBVElPTl9NT0RFX1RBQlM6CisgICAgICAgICAgICBzZWxlY3RUYWIobVRhYnMuZ2V0KHBvc2l0aW9uKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBOQVZJR0FUSU9OX01PREVfRFJPUERPV05fTElTVDoKKyAgICAgICAgICAgIG1BY3Rpb25WaWV3LnNldERyb3Bkb3duU2VsZWN0ZWRQb3NpdGlvbihwb3NpdGlvbik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICJzZXRTZWxlY3RlZE5hdmlnYXRpb25JdGVtIG5vdCB2YWxpZCBmb3IgY3VycmVudCBuYXZpZ2F0aW9uIG1vZGUiKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBpbnQgZ2V0U2VsZWN0ZWROYXZpZ2F0aW9uSXRlbSgpIHsKKyAgICAgICAgc3dpdGNoIChtQWN0aW9uVmlldy5nZXROYXZpZ2F0aW9uTW9kZSgpKSB7CisgICAgICAgIGNhc2UgTkFWSUdBVElPTl9NT0RFX1RBQlM6CisgICAgICAgICAgICByZXR1cm4gbVNlbGVjdGVkVGFiLmdldFBvc2l0aW9uKCk7CisgICAgICAgIGNhc2UgTkFWSUdBVElPTl9NT0RFX0RST1BET1dOX0xJU1Q6CisgICAgICAgICAgICByZXR1cm4gbUFjdGlvblZpZXcuZ2V0RHJvcGRvd25TZWxlY3RlZFBvc2l0aW9uKCk7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgY2xlYW51cFRhYnMoKSB7CisgICAgICAgIGlmIChtU2VsZWN0ZWRUYWIgIT0gbnVsbCkgeworICAgICAgICAgICAgc2VsZWN0VGFiKG51bGwpOworICAgICAgICB9CisgICAgICAgIG1UYWJzLmNsZWFyKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0VGl0bGUoQ2hhclNlcXVlbmNlIHRpdGxlKSB7CisgICAgICAgIG1BY3Rpb25WaWV3LnNldFRpdGxlKHRpdGxlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRTdWJ0aXRsZShDaGFyU2VxdWVuY2Ugc3VidGl0bGUpIHsKKyAgICAgICAgbUFjdGlvblZpZXcuc2V0U3VidGl0bGUoc3VidGl0bGUpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldERpc3BsYXlPcHRpb25zKGludCBvcHRpb25zKSB7CisgICAgICAgIG1BY3Rpb25WaWV3LnNldERpc3BsYXlPcHRpb25zKG9wdGlvbnMpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldERpc3BsYXlPcHRpb25zKGludCBvcHRpb25zLCBpbnQgbWFzaykgeworICAgICAgICBmaW5hbCBpbnQgY3VycmVudCA9IG1BY3Rpb25WaWV3LmdldERpc3BsYXlPcHRpb25zKCk7IAorICAgICAgICBtQWN0aW9uVmlldy5zZXREaXNwbGF5T3B0aW9ucygob3B0aW9ucyAmIG1hc2spIHwgKGN1cnJlbnQgJiB+bWFzaykpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldEJhY2tncm91bmREcmF3YWJsZShEcmF3YWJsZSBkKSB7CisgICAgICAgIG1BY3Rpb25WaWV3LnNldEJhY2tncm91bmREcmF3YWJsZShkKTsKKyAgICB9CisKKyAgICBwdWJsaWMgVmlldyBnZXRDdXN0b21OYXZpZ2F0aW9uVmlldygpIHsKKyAgICAgICAgcmV0dXJuIG1BY3Rpb25WaWV3LmdldEN1c3RvbU5hdmlnYXRpb25WaWV3KCk7CisgICAgfQorCisgICAgcHVibGljIENoYXJTZXF1ZW5jZSBnZXRUaXRsZSgpIHsKKyAgICAgICAgcmV0dXJuIG1BY3Rpb25WaWV3LmdldFRpdGxlKCk7CisgICAgfQorCisgICAgcHVibGljIENoYXJTZXF1ZW5jZSBnZXRTdWJ0aXRsZSgpIHsKKyAgICAgICAgcmV0dXJuIG1BY3Rpb25WaWV3LmdldFN1YnRpdGxlKCk7CisgICAgfQorCisgICAgcHVibGljIGludCBnZXROYXZpZ2F0aW9uTW9kZSgpIHsKKyAgICAgICAgcmV0dXJuIG1BY3Rpb25WaWV3LmdldE5hdmlnYXRpb25Nb2RlKCk7CisgICAgfQorCisgICAgcHVibGljIGludCBnZXREaXNwbGF5T3B0aW9ucygpIHsKKyAgICAgICAgcmV0dXJuIG1BY3Rpb25WaWV3LmdldERpc3BsYXlPcHRpb25zKCk7CisgICAgfQorCisgICAgcHVibGljIEFjdGlvbk1vZGUgc3RhcnRBY3Rpb25Nb2RlKEFjdGlvbk1vZGUuQ2FsbGJhY2sgY2FsbGJhY2spIHsKKyAgICAgICAgaWYgKG1BY3Rpb25Nb2RlICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1BY3Rpb25Nb2RlLmZpbmlzaCgpOworICAgICAgICB9CisKKyAgICAgICAgLy8gRG9uJ3Qgd2FpdCBmb3IgdGhlIGNsb3NlIGNvbnRleHQgbW9kZSBhbmltYXRpb24gdG8gZmluaXNoLgorICAgICAgICBpZiAobUNsb3NpbmdDb250ZXh0KSB7CisgICAgICAgICAgICBtQW5pbWF0b3JWaWV3LmNsZWFyQW5pbWF0aW9uKCk7CisgICAgICAgICAgICBtSGFuZGxlci5yZW1vdmVDYWxsYmFja3MobUNsb3NlQ29udGV4dCk7CisgICAgICAgICAgICBtQ2xvc2VDb250ZXh0LnJ1bigpOworICAgICAgICB9CisKKyAgICAgICAgQWN0aW9uTW9kZSBtb2RlID0gbmV3IEFjdGlvbk1vZGVJbXBsKGNhbGxiYWNrKTsKKyAgICAgICAgaWYgKGNhbGxiYWNrLm9uQ3JlYXRlQWN0aW9uTW9kZShtb2RlLCBtb2RlLmdldE1lbnUoKSkpIHsKKyAgICAgICAgICAgIG1vZGUuaW52YWxpZGF0ZSgpOworICAgICAgICAgICAgbVVwcGVyQ29udGV4dFZpZXcuaW5pdEZvck1vZGUobW9kZSk7CisgICAgICAgICAgICBtQW5pbWF0b3JWaWV3LnNldERpc3BsYXllZENoaWxkKENPTlRFWFRfVklFVyk7CisgICAgICAgICAgICBpZiAobUxvd2VyQ29udGV4dFZpZXcgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIC8vIFRPRE8gYW5pbWF0ZSB0aGlzCisgICAgICAgICAgICAgICAgbUxvd2VyQ29udGV4dFZpZXcuc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbUFjdGlvbk1vZGUgPSBtb2RlOworICAgICAgICAgICAgcmV0dXJuIG1vZGU7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGNvbmZpZ3VyZVRhYihUYWIgdGFiLCBpbnQgcG9zaXRpb24pIHsKKyAgICAgICAgZmluYWwgVGFiSW1wbCB0YWJpID0gKFRhYkltcGwpIHRhYjsKKyAgICAgICAgZmluYWwgYm9vbGVhbiBpc0ZpcnN0VGFiID0gbVRhYnMuaXNFbXB0eSgpOworICAgICAgICBmaW5hbCBBY3Rpb25CYXIuVGFiTGlzdGVuZXIgY2FsbGJhY2sgPSB0YWJpLmdldENhbGxiYWNrKCk7CisKKyAgICAgICAgaWYgKGNhbGxiYWNrID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkFjdGlvbiBCYXIgVGFiIG11c3QgaGF2ZSBhIENhbGxiYWNrIik7CisgICAgICAgIH0KKworICAgICAgICB0YWJpLnNldFBvc2l0aW9uKHBvc2l0aW9uKTsKKyAgICAgICAgbVRhYnMuYWRkKHBvc2l0aW9uLCB0YWJpKTsKKworICAgICAgICBpZiAoaXNGaXJzdFRhYikgeworICAgICAgICAgICAgZmluYWwgRnJhZ21lbnRUcmFuc2FjdGlvbiB0cmFucyA9IG1BY3Rpdml0eS5nZXRGcmFnbWVudE1hbmFnZXIoKS5vcGVuVHJhbnNhY3Rpb24oKTsKKyAgICAgICAgICAgIG1TZWxlY3RlZFRhYiA9IHRhYmk7CisgICAgICAgICAgICBjYWxsYmFjay5vblRhYlNlbGVjdGVkKHRhYiwgdHJhbnMpOworICAgICAgICAgICAgaWYgKCF0cmFucy5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICB0cmFucy5jb21taXQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGFkZFRhYihUYWIgdGFiKSB7CisgICAgICAgIG1BY3Rpb25WaWV3LmFkZFRhYih0YWIpOworICAgICAgICBjb25maWd1cmVUYWIodGFiLCBtVGFicy5zaXplKCkpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGFkZFRhYihUYWIgdGFiLCBpbnQgcG9zaXRpb24pIHsKKyAgICAgICAgbUFjdGlvblZpZXcuYWRkVGFiKHRhYiwgcG9zaXRpb24pOworICAgICAgICBjb25maWd1cmVUYWIodGFiLCBwb3NpdGlvbik7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFRhYiBuZXdUYWIoKSB7CisgICAgICAgIHJldHVybiBuZXcgVGFiSW1wbCgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHJlbW92ZVRhYihUYWIgdGFiKSB7CisgICAgICAgIHJlbW92ZVRhYkF0KHRhYi5nZXRQb3NpdGlvbigpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCByZW1vdmVUYWJBdChpbnQgcG9zaXRpb24pIHsKKyAgICAgICAgbUFjdGlvblZpZXcucmVtb3ZlVGFiQXQocG9zaXRpb24pOworICAgICAgICBtVGFicy5yZW1vdmUocG9zaXRpb24pOworCisgICAgICAgIGZpbmFsIGludCBuZXdUYWJDb3VudCA9IG1UYWJzLnNpemUoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IHBvc2l0aW9uOyBpIDwgbmV3VGFiQ291bnQ7IGkrKykgeworICAgICAgICAgICAgbVRhYnMuZ2V0KGkpLnNldFBvc2l0aW9uKGkpOworICAgICAgICB9CisKKyAgICAgICAgc2VsZWN0VGFiKG1UYWJzLmlzRW1wdHkoKSA/IG51bGwgOiBtVGFicy5nZXQoTWF0aC5tYXgoMCwgcG9zaXRpb24gLSAxKSkpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHNldFRhYk5hdmlnYXRpb25Nb2RlKCkgeworICAgICAgICBpZiAobUFjdGl2aXR5ID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICJUYWIgbmF2aWdhdGlvbiBtb2RlIGNhbm5vdCBiZSB1c2VkIG91dHNpZGUgb2YgYW4gQWN0aXZpdHkiKTsKKyAgICAgICAgfQorICAgICAgICBtQWN0aW9uVmlldy5zZXROYXZpZ2F0aW9uTW9kZShOQVZJR0FUSU9OX01PREVfVEFCUyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgc2VsZWN0VGFiKFRhYiB0YWIpIHsKKyAgICAgICAgaWYgKG1TZWxlY3RlZFRhYiA9PSB0YWIpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIG1BY3Rpb25WaWV3LnNldFRhYlNlbGVjdGVkKHRhYiAhPSBudWxsID8gdGFiLmdldFBvc2l0aW9uKCkgOiBUYWIuSU5WQUxJRF9QT1NJVElPTik7CisgICAgICAgIGZpbmFsIEZyYWdtZW50VHJhbnNhY3Rpb24gdHJhbnMgPSBtQWN0aXZpdHkuZ2V0RnJhZ21lbnRNYW5hZ2VyKCkub3BlblRyYW5zYWN0aW9uKCk7CisgICAgICAgIGlmIChtU2VsZWN0ZWRUYWIgIT0gbnVsbCkgeworICAgICAgICAgICAgbVNlbGVjdGVkVGFiLmdldENhbGxiYWNrKCkub25UYWJVbnNlbGVjdGVkKG1TZWxlY3RlZFRhYiwgdHJhbnMpOworICAgICAgICB9CisgICAgICAgIG1TZWxlY3RlZFRhYiA9IChUYWJJbXBsKSB0YWI7CisgICAgICAgIGlmIChtU2VsZWN0ZWRUYWIgIT0gbnVsbCkgeworICAgICAgICAgICAgbVNlbGVjdGVkVGFiLmdldENhbGxiYWNrKCkub25UYWJTZWxlY3RlZChtU2VsZWN0ZWRUYWIsIHRyYW5zKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICghdHJhbnMuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICB0cmFucy5jb21taXQoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBUYWIgZ2V0U2VsZWN0ZWRUYWIoKSB7CisgICAgICAgIHJldHVybiBtU2VsZWN0ZWRUYWI7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGludCBnZXRIZWlnaHQoKSB7CisgICAgICAgIHJldHVybiBtQWN0aW9uVmlldy5nZXRIZWlnaHQoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBzaG93KCkgeworICAgICAgICAvLyBUT0RPIGFuaW1hdGUhCisgICAgICAgIG1BbmltYXRvclZpZXcuc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGhpZGUoKSB7CisgICAgICAgIC8vIFRPRE8gYW5pbWF0ZSEKKyAgICAgICAgbUFuaW1hdG9yVmlldy5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaXNTaG93aW5nKCkgeworICAgICAgICByZXR1cm4gbUFuaW1hdG9yVmlldy5nZXRWaXNpYmlsaXR5KCkgPT0gVmlldy5WSVNJQkxFOworICAgIH0KKworICAgIC8qKgorICAgICAqIEBoaWRlIAorICAgICAqLworICAgIHB1YmxpYyBjbGFzcyBBY3Rpb25Nb2RlSW1wbCBleHRlbmRzIEFjdGlvbk1vZGUgaW1wbGVtZW50cyBNZW51QnVpbGRlci5DYWxsYmFjayB7CisgICAgICAgIHByaXZhdGUgQWN0aW9uTW9kZS5DYWxsYmFjayBtQ2FsbGJhY2s7CisgICAgICAgIHByaXZhdGUgTWVudUJ1aWxkZXIgbU1lbnU7CisgICAgICAgIHByaXZhdGUgV2Vha1JlZmVyZW5jZTxWaWV3PiBtQ3VzdG9tVmlldzsKKyAgICAgICAgCisgICAgICAgIHB1YmxpYyBBY3Rpb25Nb2RlSW1wbChBY3Rpb25Nb2RlLkNhbGxiYWNrIGNhbGxiYWNrKSB7CisgICAgICAgICAgICBtQ2FsbGJhY2sgPSBjYWxsYmFjazsKKyAgICAgICAgICAgIG1NZW51ID0gbmV3IE1lbnVCdWlsZGVyKG1BY3Rpb25WaWV3LmdldENvbnRleHQoKSkKKyAgICAgICAgICAgICAgICAgICAgLnNldERlZmF1bHRTaG93QXNBY3Rpb24oTWVudUl0ZW0uU0hPV19BU19BQ1RJT05fSUZfUk9PTSk7CisgICAgICAgICAgICBtTWVudS5zZXRDYWxsYmFjayh0aGlzKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgTWVudUluZmxhdGVyIGdldE1lbnVJbmZsYXRlcigpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgTWVudUluZmxhdGVyKG1Db250ZXh0KTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgTWVudSBnZXRNZW51KCkgeworICAgICAgICAgICAgcmV0dXJuIG1NZW51OworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIGZpbmlzaCgpIHsKKyAgICAgICAgICAgIGlmIChtQWN0aW9uTW9kZSAhPSB0aGlzKSB7CisgICAgICAgICAgICAgICAgLy8gTm90IHRoZSBhY3RpdmUgYWN0aW9uIG1vZGUgLSBuby1vcAorICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgbUNhbGxiYWNrLm9uRGVzdHJveUFjdGlvbk1vZGUodGhpcyk7CisgICAgICAgICAgICBtQW5pbWF0b3JWaWV3LnNldERpc3BsYXllZENoaWxkKE5PUk1BTF9WSUVXKTsKKworICAgICAgICAgICAgLy8gQ2xlYXIgb3V0IHRoZSBjb250ZXh0IG1vZGUgdmlld3MgYWZ0ZXIgdGhlIGFuaW1hdGlvbiBmaW5pc2hlcworICAgICAgICAgICAgbUNsb3NpbmdDb250ZXh0ID0gdHJ1ZTsKKyAgICAgICAgICAgIG1IYW5kbGVyLnBvc3REZWxheWVkKG1DbG9zZUNvbnRleHQsIG1BbmltYXRvclZpZXcuZ2V0T3V0QW5pbWF0aW9uKCkuZ2V0RHVyYXRpb24oKSk7CisKKyAgICAgICAgICAgIGlmIChtTG93ZXJDb250ZXh0VmlldyAhPSBudWxsICYmIG1Mb3dlckNvbnRleHRWaWV3LmdldFZpc2liaWxpdHkoKSAhPSBWaWV3LkdPTkUpIHsKKyAgICAgICAgICAgICAgICAvLyBUT0RPIEFuaW1hdGUgdGhpcworICAgICAgICAgICAgICAgIG1Mb3dlckNvbnRleHRWaWV3LnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1BY3Rpb25Nb2RlID0gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBpbnZhbGlkYXRlKCkgeworICAgICAgICAgICAgaWYgKG1DYWxsYmFjay5vblByZXBhcmVBY3Rpb25Nb2RlKHRoaXMsIG1NZW51KSkgeworICAgICAgICAgICAgICAgIC8vIFJlZnJlc2ggY29udGVudCBpbiBib3RoIGNvbnRleHQgdmlld3MKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBzZXRDdXN0b21WaWV3KFZpZXcgdmlldykgeworICAgICAgICAgICAgbVVwcGVyQ29udGV4dFZpZXcuc2V0Q3VzdG9tVmlldyh2aWV3KTsKKyAgICAgICAgICAgIG1DdXN0b21WaWV3ID0gbmV3IFdlYWtSZWZlcmVuY2U8Vmlldz4odmlldyk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgc2V0U3VidGl0bGUoQ2hhclNlcXVlbmNlIHN1YnRpdGxlKSB7CisgICAgICAgICAgICBtVXBwZXJDb250ZXh0Vmlldy5zZXRTdWJ0aXRsZShzdWJ0aXRsZSk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgc2V0VGl0bGUoQ2hhclNlcXVlbmNlIHRpdGxlKSB7CisgICAgICAgICAgICBtVXBwZXJDb250ZXh0Vmlldy5zZXRUaXRsZSh0aXRsZSk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgc2V0VGl0bGUoaW50IHJlc0lkKSB7CisgICAgICAgICAgICBzZXRUaXRsZShtQWN0aXZpdHkuZ2V0U3RyaW5nKHJlc0lkKSk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgc2V0U3VidGl0bGUoaW50IHJlc0lkKSB7CisgICAgICAgICAgICBzZXRTdWJ0aXRsZShtQWN0aXZpdHkuZ2V0U3RyaW5nKHJlc0lkKSk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIENoYXJTZXF1ZW5jZSBnZXRUaXRsZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBtVXBwZXJDb250ZXh0Vmlldy5nZXRUaXRsZSgpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBDaGFyU2VxdWVuY2UgZ2V0U3VidGl0bGUoKSB7CisgICAgICAgICAgICByZXR1cm4gbVVwcGVyQ29udGV4dFZpZXcuZ2V0U3VidGl0bGUoKTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBWaWV3IGdldEN1c3RvbVZpZXcoKSB7CisgICAgICAgICAgICByZXR1cm4gbUN1c3RvbVZpZXcgIT0gbnVsbCA/IG1DdXN0b21WaWV3LmdldCgpIDogbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBib29sZWFuIG9uTWVudUl0ZW1TZWxlY3RlZChNZW51QnVpbGRlciBtZW51LCBNZW51SXRlbSBpdGVtKSB7CisgICAgICAgICAgICByZXR1cm4gbUNhbGxiYWNrLm9uQWN0aW9uSXRlbUNsaWNrZWQodGhpcywgaXRlbSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBvbkNsb3NlTWVudShNZW51QnVpbGRlciBtZW51LCBib29sZWFuIGFsbE1lbnVzQXJlQ2xvc2luZykgeworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGJvb2xlYW4gb25TdWJNZW51U2VsZWN0ZWQoU3ViTWVudUJ1aWxkZXIgc3ViTWVudSkgeworICAgICAgICAgICAgaWYgKCFzdWJNZW51Lmhhc1Zpc2libGVJdGVtcygpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG5ldyBNZW51UG9wdXBIZWxwZXIobUNvbnRleHQsIHN1Yk1lbnUpLnNob3coKTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgb25DbG9zZVN1Yk1lbnUoU3ViTWVudUJ1aWxkZXIgbWVudSkgeworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgb25NZW51TW9kZUNoYW5nZShNZW51QnVpbGRlciBtZW51KSB7CisgICAgICAgICAgICBpbnZhbGlkYXRlKCk7CisgICAgICAgICAgICBtVXBwZXJDb250ZXh0Vmlldy5zaG93T3ZlcmZsb3dNZW51KCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAaGlkZQorICAgICAqLworICAgIHB1YmxpYyBjbGFzcyBUYWJJbXBsIGV4dGVuZHMgQWN0aW9uQmFyLlRhYiB7CisgICAgICAgIHByaXZhdGUgQWN0aW9uQmFyLlRhYkxpc3RlbmVyIG1DYWxsYmFjazsKKyAgICAgICAgcHJpdmF0ZSBPYmplY3QgbVRhZzsKKyAgICAgICAgcHJpdmF0ZSBEcmF3YWJsZSBtSWNvbjsKKyAgICAgICAgcHJpdmF0ZSBDaGFyU2VxdWVuY2UgbVRleHQ7CisgICAgICAgIHByaXZhdGUgaW50IG1Qb3NpdGlvbjsKKyAgICAgICAgcHJpdmF0ZSBWaWV3IG1DdXN0b21WaWV3OworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgT2JqZWN0IGdldFRhZygpIHsKKyAgICAgICAgICAgIHJldHVybiBtVGFnOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIHNldFRhZyhPYmplY3QgdGFnKSB7CisgICAgICAgICAgICBtVGFnID0gdGFnOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIEFjdGlvbkJhci5UYWJMaXN0ZW5lciBnZXRDYWxsYmFjaygpIHsKKyAgICAgICAgICAgIHJldHVybiBtQ2FsbGJhY2s7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgc2V0VGFiTGlzdGVuZXIoQWN0aW9uQmFyLlRhYkxpc3RlbmVyIGNhbGxiYWNrKSB7CisgICAgICAgICAgICBtQ2FsbGJhY2sgPSBjYWxsYmFjazsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgVmlldyBnZXRDdXN0b21WaWV3KCkgeworICAgICAgICAgICAgcmV0dXJuIG1DdXN0b21WaWV3OworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIHNldEN1c3RvbVZpZXcoVmlldyB2aWV3KSB7CisgICAgICAgICAgICBtQ3VzdG9tVmlldyA9IHZpZXc7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIERyYXdhYmxlIGdldEljb24oKSB7CisgICAgICAgICAgICByZXR1cm4gbUljb247CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGludCBnZXRQb3NpdGlvbigpIHsKKyAgICAgICAgICAgIHJldHVybiBtUG9zaXRpb247CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBzZXRQb3NpdGlvbihpbnQgcG9zaXRpb24pIHsKKyAgICAgICAgICAgIG1Qb3NpdGlvbiA9IHBvc2l0aW9uOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBDaGFyU2VxdWVuY2UgZ2V0VGV4dCgpIHsKKyAgICAgICAgICAgIHJldHVybiBtVGV4dDsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBzZXRJY29uKERyYXdhYmxlIGljb24pIHsKKyAgICAgICAgICAgIG1JY29uID0gaWNvbjsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBzZXRUZXh0KENoYXJTZXF1ZW5jZSB0ZXh0KSB7CisgICAgICAgICAgICBtVGV4dCA9IHRleHQ7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgc2VsZWN0KCkgeworICAgICAgICAgICAgc2VsZWN0VGFiKHRoaXMpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL2FwcC9Mb2NhbGVQaWNrZXIuamF2YSBiL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC9hcHAvTG9jYWxlUGlja2VyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzhlMzkzNQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC9hcHAvTG9jYWxlUGlja2VyLmphdmEKQEAgLTAsMCArMSwyMTkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLmludGVybmFsLmFwcDsKKworaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLlI7CisKK2ltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eTsKK2ltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eU1hbmFnZXJOYXRpdmU7CitpbXBvcnQgYW5kcm9pZC5hcHAuSUFjdGl2aXR5TWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkLmFwcC5MaXN0RnJhZ21lbnQ7CitpbXBvcnQgYW5kcm9pZC5hcHAuYmFja3VwLkJhY2t1cE1hbmFnZXI7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5Db25maWd1cmF0aW9uOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuUmVzb3VyY2VzOworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworaW1wb3J0IGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uOworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuQXJyYXlBZGFwdGVyOworaW1wb3J0IGFuZHJvaWQud2lkZ2V0Lkxpc3RWaWV3OworCitpbXBvcnQgamF2YS50ZXh0LkNvbGxhdG9yOworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKKworcHVibGljIGNsYXNzIExvY2FsZVBpY2tlciBleHRlbmRzIExpc3RGcmFnbWVudCB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJMb2NhbGVQaWNrZXIiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUcgPSBmYWxzZTsKKworICAgIHB1YmxpYyBzdGF0aWMgaW50ZXJmYWNlIExvY2FsZVNlbGVjdGlvbkxpc3RlbmVyIHsKKyAgICAgICAgLy8gWW91IGNhbiBhZGQgYW55IGFyZ3VtZW50IGlmIHlvdSByZWFsbHkgbmVlZCBpdC4uLgorICAgICAgICBwdWJsaWMgdm9pZCBvbkxvY2FsZVNlbGVjdGVkKExvY2FsZSBsb2NhbGUpOworICAgIH0KKworICAgIExvY1tdIG1Mb2NhbGVzOworICAgIFN0cmluZ1tdIG1TcGVjaWFsTG9jYWxlQ29kZXM7CisgICAgU3RyaW5nW10gbVNwZWNpYWxMb2NhbGVOYW1lczsKKworICAgIHByaXZhdGUgTG9jYWxlIG1OZXdMb2NhbGU7CisKKyAgICBMb2NhbGVTZWxlY3Rpb25MaXN0ZW5lciBtTGlzdGVuZXI7ICAvLyBkZWZhdWx0IHRvIG51bGwKKworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIExvYyBpbXBsZW1lbnRzIENvbXBhcmFibGU8TG9jPiB7CisgICAgICAgIHN0YXRpYyBDb2xsYXRvciBzQ29sbGF0b3IgPSBDb2xsYXRvci5nZXRJbnN0YW5jZSgpOworCisgICAgICAgIFN0cmluZyBsYWJlbDsKKyAgICAgICAgTG9jYWxlIGxvY2FsZTsKKworICAgICAgICBwdWJsaWMgTG9jKFN0cmluZyBsYWJlbCwgTG9jYWxlIGxvY2FsZSkgeworICAgICAgICAgICAgdGhpcy5sYWJlbCA9IGxhYmVsOworICAgICAgICAgICAgdGhpcy5sb2NhbGUgPSBsb2NhbGU7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgICAgIHJldHVybiB0aGlzLmxhYmVsOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBpbnQgY29tcGFyZVRvKExvYyBhbm90aGVyKSB7CisgICAgICAgICAgICByZXR1cm4gc0NvbGxhdG9yLmNvbXBhcmUodGhpcy5sYWJlbCwgYW5vdGhlci5sYWJlbCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgc2V0VXBMb2NhbGVMaXN0KCkgeworICAgICAgICBmaW5hbCBBY3Rpdml0eSBhY3Rpdml0eSA9IGdldEFjdGl2aXR5KCk7CisgICAgICAgIGZpbmFsIFJlc291cmNlcyByZXNvdXJjZXMgPSBhY3Rpdml0eS5nZXRSZXNvdXJjZXMoKTsKKyAgICAgICAgbVNwZWNpYWxMb2NhbGVDb2RlcyA9IHJlc291cmNlcy5nZXRTdHJpbmdBcnJheShSLmFycmF5LnNwZWNpYWxfbG9jYWxlX2NvZGVzKTsKKyAgICAgICAgbVNwZWNpYWxMb2NhbGVOYW1lcyA9IHJlc291cmNlcy5nZXRTdHJpbmdBcnJheShSLmFycmF5LnNwZWNpYWxfbG9jYWxlX25hbWVzKTsKKworICAgICAgICBmaW5hbCBTdHJpbmdbXSBsb2NhbGVzID0gYWN0aXZpdHkuZ2V0QXNzZXRzKCkuZ2V0TG9jYWxlcygpOworICAgICAgICBBcnJheXMuc29ydChsb2NhbGVzKTsKKyAgICAgICAgZmluYWwgaW50IG9yaWdTaXplID0gbG9jYWxlcy5sZW5ndGg7CisgICAgICAgIExvY1tdIHByZXByb2Nlc3MgPSBuZXcgTG9jW29yaWdTaXplXTsKKyAgICAgICAgaW50IGZpbmFsU2l6ZSA9IDA7CisgICAgICAgIGZvciAoaW50IGkgPSAwIDsgaSA8IG9yaWdTaXplOyBpKysgKSB7CisgICAgICAgICAgICBTdHJpbmcgcyA9IGxvY2FsZXNbaV07CisgICAgICAgICAgICBpbnQgbGVuID0gcy5sZW5ndGgoKTsKKyAgICAgICAgICAgIGlmIChsZW4gPT0gNSkgeworICAgICAgICAgICAgICAgIFN0cmluZyBsYW5ndWFnZSA9IHMuc3Vic3RyaW5nKDAsIDIpOworICAgICAgICAgICAgICAgIFN0cmluZyBjb3VudHJ5ID0gcy5zdWJzdHJpbmcoMywgNSk7CisgICAgICAgICAgICAgICAgTG9jYWxlIGwgPSBuZXcgTG9jYWxlKGxhbmd1YWdlLCBjb3VudHJ5KTsKKworICAgICAgICAgICAgICAgIGlmIChmaW5hbFNpemUgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICBpZiAoREVCVUcpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIExvZy52KFRBRywgImFkZGluZyBpbml0aWFsICIrIHRvVGl0bGVDYXNlKGwuZ2V0RGlzcGxheUxhbmd1YWdlKGwpKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgcHJlcHJvY2Vzc1tmaW5hbFNpemUrK10gPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBMb2ModG9UaXRsZUNhc2UobC5nZXREaXNwbGF5TGFuZ3VhZ2UobCkpLCBsKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAvLyBjaGVjayBwcmV2aW91cyBlbnRyeToKKyAgICAgICAgICAgICAgICAgICAgLy8gIHNhbWUgbGFuZyBhbmQgYSBjb3VudHJ5IC0+IHVwZ3JhZGUgdG8gZnVsbCBuYW1lIGFuZAorICAgICAgICAgICAgICAgICAgICAvLyAgICBpbnNlcnQgb3VycyB3aXRoIGZ1bGwgbmFtZQorICAgICAgICAgICAgICAgICAgICAvLyAgZGlmZiBsYW5nIC0+IGluc2VydCBvdXJzIHdpdGggbGFuZy1vbmx5IG5hbWUKKyAgICAgICAgICAgICAgICAgICAgaWYgKHByZXByb2Nlc3NbZmluYWxTaXplLTFdLmxvY2FsZS5nZXRMYW5ndWFnZSgpLmVxdWFscygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYW5ndWFnZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChERUJVRykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvZy52KFRBRywgImJhY2tpbmcgdXAgYW5kIGZpeGluZyAiKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlcHJvY2Vzc1tmaW5hbFNpemUtMV0ubGFiZWwrIiB0byAiKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0RGlzcGxheU5hbWUocHJlcHJvY2Vzc1tmaW5hbFNpemUtMV0ubG9jYWxlKSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBwcmVwcm9jZXNzW2ZpbmFsU2l6ZS0xXS5sYWJlbCA9IHRvVGl0bGVDYXNlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXREaXNwbGF5TmFtZShwcmVwcm9jZXNzW2ZpbmFsU2l6ZS0xXS5sb2NhbGUpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChERUJVRykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvZy52KFRBRywgIiAgYW5kIGFkZGluZyAiKyB0b1RpdGxlQ2FzZShnZXREaXNwbGF5TmFtZShsKSkpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgcHJlcHJvY2Vzc1tmaW5hbFNpemUrK10gPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgTG9jKHRvVGl0bGVDYXNlKGdldERpc3BsYXlOYW1lKGwpKSwgbCk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgZGlzcGxheU5hbWU7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAocy5lcXVhbHMoInp6X1paIikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5TmFtZSA9ICJQc2V1ZG8uLi4iOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5TmFtZSA9IHRvVGl0bGVDYXNlKGwuZ2V0RGlzcGxheUxhbmd1YWdlKGwpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChERUJVRykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvZy52KFRBRywgImFkZGluZyAiK2Rpc3BsYXlOYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIHByZXByb2Nlc3NbZmluYWxTaXplKytdID0gbmV3IExvYyhkaXNwbGF5TmFtZSwgbCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgbUxvY2FsZXMgPSBuZXcgTG9jW2ZpbmFsU2l6ZV07CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZmluYWxTaXplIDsgaSsrKSB7CisgICAgICAgICAgICBtTG9jYWxlc1tpXSA9IHByZXByb2Nlc3NbaV07CisgICAgICAgIH0KKyAgICAgICAgQXJyYXlzLnNvcnQobUxvY2FsZXMpOworICAgICAgICBmaW5hbCBpbnQgbGF5b3V0SWQgPSBSLmxheW91dC5sb2NhbGVfcGlja2VyX2l0ZW07CisgICAgICAgIGZpbmFsIGludCBmaWVsZElkID0gUi5pZC5sb2NhbGU7CisgICAgICAgIGZpbmFsIEFycmF5QWRhcHRlcjxMb2M+IGFkYXB0ZXIgPQorICAgICAgICAgICAgICAgIG5ldyBBcnJheUFkYXB0ZXI8TG9jPihhY3Rpdml0eSwgbGF5b3V0SWQsIGZpZWxkSWQsIG1Mb2NhbGVzKTsKKyAgICAgICAgc2V0TGlzdEFkYXB0ZXIoYWRhcHRlcik7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb25BY3Rpdml0eUNyZWF0ZWQoZmluYWwgQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgeworICAgICAgICBzdXBlci5vbkFjdGl2aXR5Q3JlYXRlZChzYXZlZEluc3RhbmNlU3RhdGUpOworICAgICAgICBzZXRVcExvY2FsZUxpc3QoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRMb2NhbGVTZWxlY3Rpb25MaXN0ZW5lcihMb2NhbGVTZWxlY3Rpb25MaXN0ZW5lciBsaXN0ZW5lcikgeworICAgICAgICBtTGlzdGVuZXIgPSBsaXN0ZW5lcjsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgdG9UaXRsZUNhc2UoU3RyaW5nIHMpIHsKKyAgICAgICAgaWYgKHMubGVuZ3RoKCkgPT0gMCkgeworICAgICAgICAgICAgcmV0dXJuIHM7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gQ2hhcmFjdGVyLnRvVXBwZXJDYXNlKHMuY2hhckF0KDApKSArIHMuc3Vic3RyaW5nKDEpOworICAgIH0KKworICAgIHByaXZhdGUgU3RyaW5nIGdldERpc3BsYXlOYW1lKExvY2FsZSBsKSB7CisgICAgICAgIFN0cmluZyBjb2RlID0gbC50b1N0cmluZygpOworCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbVNwZWNpYWxMb2NhbGVDb2Rlcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgaWYgKG1TcGVjaWFsTG9jYWxlQ29kZXNbaV0uZXF1YWxzKGNvZGUpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG1TcGVjaWFsTG9jYWxlTmFtZXNbaV07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gbC5nZXREaXNwbGF5TmFtZShsKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvblJlc3VtZSgpIHsKKyAgICAgICAgc3VwZXIub25SZXN1bWUoKTsKKyAgICAgICAgZ2V0TGlzdFZpZXcoKS5yZXF1ZXN0Rm9jdXMoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBFYWNoIGxpc3RlbmVyIG5lZWRzIHRvIGNhbGwge0BsaW5rICN1cGRhdGVMb2NhbGUoTG9jYWxlKX0gdG8gYWN0dWFsbHkgY2hhbmdlIHRoZSBsb2NhbGUuCisgICAgICoKKyAgICAgKiBXZSBkb24ndCBjYWxsIHtAbGluayAjdXBkYXRlTG9jYWxlKExvY2FsZSl9IGF1dG9tYXRpY2FsbHksIGFzIGl0IGhhbHQgdGhlIHN5c3RlbSBmb3IKKyAgICAgKiBhIG1vbWVudCBhbmQgc29tZSBjYWxsZXJzIHdvbid0IHdhbnQgaXQuCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb25MaXN0SXRlbUNsaWNrKExpc3RWaWV3IGwsIFZpZXcgdiwgaW50IHBvc2l0aW9uLCBsb25nIGlkKSB7CisgICAgICAgIGlmIChtTGlzdGVuZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgbUxpc3RlbmVyLm9uTG9jYWxlU2VsZWN0ZWQobUxvY2FsZXNbcG9zaXRpb25dLmxvY2FsZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXF1ZXN0cyB0aGUgc3lzdGVtIHRvIHVwZGF0ZSB0aGUgc3lzdGVtIGxvY2FsZS4gTm90ZSB0aGF0IHRoZSBzeXN0ZW0gbG9va3MgaGFsdGVkCisgICAgICogZm9yIGEgd2hpbGUgZHVyaW5nIHRoZSBMb2NhbGUgbWlncmF0aW9uLCBzbyB0aGUgY2FsbGVyIG5lZWQgdG8gdGFrZSBjYXJlIG9mIGl0LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB1cGRhdGVMb2NhbGUoTG9jYWxlIGxvY2FsZSkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgSUFjdGl2aXR5TWFuYWdlciBhbSA9IEFjdGl2aXR5TWFuYWdlck5hdGl2ZS5nZXREZWZhdWx0KCk7CisgICAgICAgICAgICBDb25maWd1cmF0aW9uIGNvbmZpZyA9IGFtLmdldENvbmZpZ3VyYXRpb24oKTsKKworICAgICAgICAgICAgY29uZmlnLmxvY2FsZSA9IGxvY2FsZTsKKworICAgICAgICAgICAgLy8gaW5kaWNhdGUgdGhpcyBpc24ndCBzb21lIHBhc3NpbmcgZGVmYXVsdCAtIHRoZSB1c2VyIHdhbnRzIHRoaXMgcmVtZW1iZXJlZAorICAgICAgICAgICAgY29uZmlnLnVzZXJTZXRMb2NhbGUgPSB0cnVlOworCisgICAgICAgICAgICBhbS51cGRhdGVDb25maWd1cmF0aW9uKGNvbmZpZyk7CisgICAgICAgICAgICAvLyBUcmlnZ2VyIHRoZSBkaXJ0eSBiaXQgZm9yIHRoZSBTZXR0aW5ncyBQcm92aWRlci4KKyAgICAgICAgICAgIEJhY2t1cE1hbmFnZXIuZGF0YUNoYW5nZWQoImNvbS5hbmRyb2lkLnByb3ZpZGVycy5zZXR0aW5ncyIpOworICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgLy8gSW50ZW50aW9uYWxseSBsZWZ0IGJsYW5rCisgICAgICAgIH0KKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL2FwcHdpZGdldC9JQXBwV2lkZ2V0SG9zdC5haWRsIGIvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL2FwcHdpZGdldC9JQXBwV2lkZ2V0SG9zdC5haWRsCmluZGV4IDJlZDQ3NzMuLjIxNmQ5ODUgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC9hcHB3aWRnZXQvSUFwcFdpZGdldEhvc3QuYWlkbAorKysgYi9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvYXBwd2lkZ2V0L0lBcHBXaWRnZXRIb3N0LmFpZGwKQEAgLTI0LDUgKzI0LDYgQEAKIG9uZXdheSBpbnRlcmZhY2UgSUFwcFdpZGdldEhvc3QgewogICAgIHZvaWQgdXBkYXRlQXBwV2lkZ2V0KGludCBhcHBXaWRnZXRJZCwgaW4gUmVtb3RlVmlld3Mgdmlld3MpOwogICAgIHZvaWQgcHJvdmlkZXJDaGFuZ2VkKGludCBhcHBXaWRnZXRJZCwgaW4gQXBwV2lkZ2V0UHJvdmlkZXJJbmZvIGluZm8pOworICAgIHZvaWQgdmlld0RhdGFDaGFuZ2VkKGludCBhcHBXaWRnZXRJZCwgaW50IHZpZXdJZCk7CiB9CiAKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC9hcHB3aWRnZXQvSUFwcFdpZGdldFNlcnZpY2UuYWlkbCBiL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC9hcHB3aWRnZXQvSUFwcFdpZGdldFNlcnZpY2UuYWlkbAppbmRleCA0OTZhYTFhLi40ZDU2NzQ1IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvYXBwd2lkZ2V0L0lBcHBXaWRnZXRTZXJ2aWNlLmFpZGwKKysrIGIvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL2FwcHdpZGdldC9JQXBwV2lkZ2V0U2VydmljZS5haWRsCkBAIC00MCw3ICs0MCw5IEBACiAgICAgLy8gZm9yIEFwcFdpZGdldE1hbmFnZXIKICAgICAvLwogICAgIHZvaWQgdXBkYXRlQXBwV2lkZ2V0SWRzKGluIGludFtdIGFwcFdpZGdldElkcywgaW4gUmVtb3RlVmlld3Mgdmlld3MpOworICAgIHZvaWQgcGFydGlhbGx5VXBkYXRlQXBwV2lkZ2V0SWRzKGluIGludFtdIGFwcFdpZGdldElkcywgaW4gUmVtb3RlVmlld3Mgdmlld3MpOwogICAgIHZvaWQgdXBkYXRlQXBwV2lkZ2V0UHJvdmlkZXIoaW4gQ29tcG9uZW50TmFtZSBwcm92aWRlciwgaW4gUmVtb3RlVmlld3Mgdmlld3MpOworICAgIHZvaWQgbm90aWZ5QXBwV2lkZ2V0Vmlld0RhdGFDaGFuZ2VkKGluIGludFtdIGFwcFdpZGdldElkcywgaW50IHZpZXdJZCk7CiAgICAgTGlzdDxBcHBXaWRnZXRQcm92aWRlckluZm8+IGdldEluc3RhbGxlZFByb3ZpZGVycygpOwogICAgIEFwcFdpZGdldFByb3ZpZGVySW5mbyBnZXRBcHBXaWRnZXRJbmZvKGludCBhcHBXaWRnZXRJZCk7CiAgICAgdm9pZCBiaW5kQXBwV2lkZ2V0SWQoaW50IGFwcFdpZGdldElkLCBpbiBDb21wb25lbnROYW1lIHByb3ZpZGVyKTsKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC9kYXRhYmFzZS9Tb3J0Q3Vyc29yLmphdmEgYi9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvZGF0YWJhc2UvU29ydEN1cnNvci5qYXZhCmluZGV4IDk5NDEwYmMuLjAwMjU1MTIgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC9kYXRhYmFzZS9Tb3J0Q3Vyc29yLmphdmEKKysrIGIvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL2RhdGFiYXNlL1NvcnRDdXJzb3IuamF2YQpAQCAtMTgyLDI0ICsxODIsNiBAQAogICAgIH0KIAogICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIGRlbGV0ZVJvdygpCi0gICAgewotICAgICAgICByZXR1cm4gbUN1cnNvci5kZWxldGVSb3coKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBjb21taXRVcGRhdGVzKCkgewotICAgICAgICBpbnQgbGVuZ3RoID0gbUN1cnNvcnMubGVuZ3RoOwotICAgICAgICBmb3IgKGludCBpID0gMCA7IGkgPCBsZW5ndGggOyBpKyspIHsKLSAgICAgICAgICAgIGlmIChtQ3Vyc29yc1tpXSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbUN1cnNvcnNbaV0uY29tbWl0VXBkYXRlcygpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIG9uQ2hhbmdlKHRydWUpOwotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgU3RyaW5nIGdldFN0cmluZyhpbnQgY29sdW1uKQogICAgIHsKICAgICAgICAgcmV0dXJuIG1DdXJzb3IuZ2V0U3RyaW5nKGNvbHVtbik7CkBAIC0yMzYsNiArMjE4LDExIEBACiAgICAgfQogCiAgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGludCBnZXRUeXBlKGludCBjb2x1bW4pIHsKKyAgICAgICAgcmV0dXJuIG1DdXJzb3IuZ2V0VHlwZShjb2x1bW4pOworICAgIH0KKworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBib29sZWFuIGlzTnVsbChpbnQgY29sdW1uKQogICAgIHsKICAgICAgICAgcmV0dXJuIG1DdXJzb3IuaXNOdWxsKGNvbHVtbik7CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvb3MvUnVudGltZUluaXQuamF2YSBiL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC9vcy9SdW50aW1lSW5pdC5qYXZhCmluZGV4IDU5NjAwZGMuLjU3Njc4MzIgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC9vcy9SdW50aW1lSW5pdC5qYXZhCisrKyBiL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC9vcy9SdW50aW1lSW5pdC5qYXZhCkBAIC0yNCw2ICsyNCw3IEBACiBpbXBvcnQgYW5kcm9pZC5vcy5Qcm9jZXNzOwogaW1wb3J0IGFuZHJvaWQub3MuU3lzdGVtUHJvcGVydGllczsKIGltcG9ydCBhbmRyb2lkLnV0aWwuQ29uZmlnOworaW1wb3J0IGFuZHJvaWQudXRpbC5GaW5hbGl6ZXJzOwogaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CiBpbXBvcnQgYW5kcm9pZC51dGlsLlNsb2c7CiAKQEAgLTE0MSw2ICsxNDIsMTIgQEAKICAgICAgICAgICAgIERlYnVnLmVuYWJsZUVtdWxhdG9yVHJhY2VPdXRwdXQoKTsKICAgICAgICAgfQogCisgICAgICAgIC8qKgorICAgICAgICAgKiBJbml0aWFsaXplIHRoZSB0aHJlYWQgdXNlZCB0byByZWNsYWltIHJlc291cmNlcyB3aXRob3V0CisgICAgICAgICAqIGdvaW5nIHRocm91Z2ggZmluYWxpemVycy4KKyAgICAgICAgICovCisgICAgICAgIEZpbmFsaXplcnMuaW5pdCgpOworCiAgICAgICAgIGluaXRpYWxpemVkID0gdHJ1ZTsKICAgICB9CiAKQEAgLTMzMSw5ICszMzgsNiBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgLyoqIENvdW50ZXIgdXNlZCB0byBwcmV2ZW50IHJlZW50cmFuY3kgaW4ge0BsaW5rICNyZXBvcnRFeGNlcHRpb259LiAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEF0b21pY0ludGVnZXIgc0luUmVwb3J0RXhjZXB0aW9uID0gbmV3IEF0b21pY0ludGVnZXIoKTsKLQogICAgIC8qKgogICAgICAqIFNldCB0aGUgb2JqZWN0IGlkZW50aWZ5aW5nIHRoaXMgYXBwbGljYXRpb24vcHJvY2VzcywgZm9yIHJlcG9ydGluZyBWTQogICAgICAqIGVycm9ycy4KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC9vcy9TYW1wbGluZ1Byb2ZpbGVySW50ZWdyYXRpb24uamF2YSBiL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC9vcy9TYW1wbGluZ1Byb2ZpbGVySW50ZWdyYXRpb24uamF2YQppbmRleCBlYTI3OGE2Li5iODdhYzkwIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvb3MvU2FtcGxpbmdQcm9maWxlckludGVncmF0aW9uLmphdmEKKysrIGIvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL29zL1NhbXBsaW5nUHJvZmlsZXJJbnRlZ3JhdGlvbi5qYXZhCkBAIC0yNiw3ICsyNiw5IEBACiBpbXBvcnQgamF2YS5pby5QcmludFN0cmVhbTsKIGltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5FeGVjdXRvcjsKIGltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5FeGVjdXRvcnM7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuYXRvbWljLkF0b21pY0Jvb2xlYW47CiAKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uUGFja2FnZUluZm87CiBpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKIGltcG9ydCBhbmRyb2lkLm9zLio7CiAKQEAgLTM3LDE1ICszOSwyNyBAQAogCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJTYW1wbGluZ1Byb2ZpbGVySW50ZWdyYXRpb24iOwogCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU05BUFNIT1RfRElSID0gIi9kYXRhL3NuYXBzaG90cyI7CisKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIGVuYWJsZWQ7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgRXhlY3V0b3Igc25hcHNob3RXcml0ZXI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IHNhbXBsaW5nUHJvZmlsZXJIejsKKworICAgIC8qKiBXaGV0aGVyIG9yIG5vdCB3ZSd2ZSBjcmVhdGVkIHRoZSBzbmFwc2hvdHMgZGlyLiAqLworICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gZGlyTWFkZSA9IGZhbHNlOworCisgICAgLyoqIFdoZXRoZXIgb3Igbm90IGEgc25hcHNob3QgaXMgYmVpbmcgcGVyc2lzdGVkLiAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEF0b21pY0Jvb2xlYW4gcGVuZGluZyA9IG5ldyBBdG9taWNCb29sZWFuKGZhbHNlKTsKKwogICAgIHN0YXRpYyB7Ci0gICAgICAgIGVuYWJsZWQgPSAiMSIuZXF1YWxzKFN5c3RlbVByb3BlcnRpZXMuZ2V0KCJwZXJzaXN0LnNhbXBsaW5nX3Byb2ZpbGVyIikpOwotICAgICAgICBpZiAoZW5hYmxlZCkgeworICAgICAgICBzYW1wbGluZ1Byb2ZpbGVySHogPSBTeXN0ZW1Qcm9wZXJ0aWVzLmdldEludCgicGVyc2lzdC5zeXMucHJvZmlsZXJfaHoiLCAwKTsKKyAgICAgICAgaWYgKHNhbXBsaW5nUHJvZmlsZXJIeiA+IDApIHsKICAgICAgICAgICAgIHNuYXBzaG90V3JpdGVyID0gRXhlY3V0b3JzLm5ld1NpbmdsZVRocmVhZEV4ZWN1dG9yKCk7Ci0gICAgICAgICAgICBMb2cuaShUQUcsICJQcm9maWxlciBpcyBlbmFibGVkLiIpOworICAgICAgICAgICAgZW5hYmxlZCA9IHRydWU7CisgICAgICAgICAgICBMb2cuaShUQUcsICJQcm9maWxlciBpcyBlbmFibGVkLiBTYW1wbGluZyBQcm9maWxlciBIejogIiArIHNhbXBsaW5nUHJvZmlsZXJIeik7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBzbmFwc2hvdFdyaXRlciA9IG51bGw7CisgICAgICAgICAgICBlbmFibGVkID0gZmFsc2U7CiAgICAgICAgICAgICBMb2cuaShUQUcsICJQcm9maWxlciBpcyBkaXNhYmxlZC4iKTsKICAgICAgICAgfQogICAgIH0KQEAgLTY5LDQ4ICs4Myw0NyBAQAogICAgICAgICBUaHJlYWRHcm91cCBncm91cCA9IFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0VGhyZWFkR3JvdXAoKTsKICAgICAgICAgU2FtcGxpbmdQcm9maWxlci5UaHJlYWRTZXQgdGhyZWFkU2V0ID0gU2FtcGxpbmdQcm9maWxlci5uZXdUaHJlYWRHcm91cFRoZWFkU2V0KGdyb3VwKTsKICAgICAgICAgSU5TVEFOQ0UgPSBuZXcgU2FtcGxpbmdQcm9maWxlcig0LCB0aHJlYWRTZXQpOwotICAgICAgICBJTlNUQU5DRS5zdGFydCgxMCk7CisgICAgICAgIElOU1RBTkNFLnN0YXJ0KHNhbXBsaW5nUHJvZmlsZXJIeik7CiAgICAgfQogCi0gICAgLyoqIFdoZXRoZXIgb3Igbm90IHdlJ3ZlIGNyZWF0ZWQgdGhlIHNuYXBzaG90cyBkaXIuICovCi0gICAgc3RhdGljIGJvb2xlYW4gZGlyTWFkZSA9IGZhbHNlOwotCi0gICAgLyoqIFdoZXRoZXIgb3Igbm90IGEgc25hcHNob3QgaXMgYmVpbmcgcGVyc2lzdGVkLiAqLwotICAgIHN0YXRpYyB2b2xhdGlsZSBib29sZWFuIHBlbmRpbmc7Ci0KICAgICAvKioKLSAgICAgKiBXcml0ZXMgYSBzbmFwc2hvdCB0byB0aGUgU0QgY2FyZCBpZiBwcm9maWxpbmcgaXMgZW5hYmxlZC4KKyAgICAgKiBXcml0ZXMgYSBzbmFwc2hvdCBpZiBwcm9maWxpbmcgaXMgZW5hYmxlZC4KICAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgd3JpdGVTbmFwc2hvdChmaW5hbCBTdHJpbmcgbmFtZSkgeworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB3cml0ZVNuYXBzaG90KGZpbmFsIFN0cmluZyBwcm9jZXNzTmFtZSwgZmluYWwgUGFja2FnZUluZm8gcGFja2FnZUluZm8pIHsKICAgICAgICAgaWYgKCFlbmFibGVkKSB7CiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KIAogICAgICAgICAvKgotICAgICAgICAgKiBJZiB3ZSdyZSBhbHJlYWR5IHdyaXRpbmcgYSBzbmFwc2hvdCwgZG9uJ3QgYm90aGVyIGVucXVlaW5nIGFub3RoZXIKKyAgICAgICAgICogSWYgd2UncmUgYWxyZWFkeSB3cml0aW5nIGEgc25hcHNob3QsIGRvbid0IGJvdGhlciBlbnF1ZXVlaW5nIGFub3RoZXIKICAgICAgICAgICogcmVxdWVzdCByaWdodCBub3cuIFRoaXMgd2lsbCByZWR1Y2UgdGhlIG51bWJlciBvZiBpbmRpdmlkdWFsCiAgICAgICAgICAqIHNuYXBzaG90cyBhbmQgaW4gdHVybiB0aGUgdG90YWwgYW1vdW50IG9mIG1lbW9yeSBjb25zdW1lZCAob25lIGJpZwogICAgICAgICAgKiBzbmFwc2hvdCBpcyBzbWFsbGVyIHRoYW4gTiBzdWJzZXQgc25hcHNob3RzKS4KICAgICAgICAgICovCi0gICAgICAgIGlmICghcGVuZGluZykgewotICAgICAgICAgICAgcGVuZGluZyA9IHRydWU7CisgICAgICAgIGlmIChwZW5kaW5nLmNvbXBhcmVBbmRTZXQoZmFsc2UsIHRydWUpKSB7CiAgICAgICAgICAgICBzbmFwc2hvdFdyaXRlci5leGVjdXRlKG5ldyBSdW5uYWJsZSgpIHsKICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBkaXIgPQotICAgICAgICAgICAgICAgICAgICAgICAgRW52aXJvbm1lbnQuZ2V0RXh0ZXJuYWxTdG9yYWdlRGlyZWN0b3J5KCkuZ2V0UGF0aCgpICsgIi9zbmFwc2hvdHMiOwogICAgICAgICAgICAgICAgICAgICBpZiAoIWRpck1hZGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBGaWxlKGRpcikubWtkaXJzKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobmV3IEZpbGUoZGlyKS5pc0RpcmVjdG9yeSgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBGaWxlIGRpciA9IG5ldyBGaWxlKFNOQVBTSE9UX0RJUik7CisgICAgICAgICAgICAgICAgICAgICAgICBkaXIubWtkaXJzKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgZGlyZWN0b3J5IG5lZWRzIHRvIGJlIHdyaXRhYmxlIHRvIGFueWJvZHkKKyAgICAgICAgICAgICAgICAgICAgICAgIGRpci5zZXRXcml0YWJsZSh0cnVlLCBmYWxzZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgZGlyZWN0b3J5IG5lZWRzIHRvIGJlIGV4ZWN1dGFibGUgdG8gYW55Ym9keQorICAgICAgICAgICAgICAgICAgICAgICAgLy8gZG9uJ3Qga25vdyB3aHkgeWV0LCBidXQgbW9kZSA3MjMgd291bGQgd29yaywgd2hpbGUKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1vZGUgNzIyIHRocm93cyBGaWxlTm90Rm91bmRFeGVjcHRpb24gYXQgbGluZSAxNTEKKyAgICAgICAgICAgICAgICAgICAgICAgIGRpci5zZXRFeGVjdXRhYmxlKHRydWUsIGZhbHNlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuZXcgRmlsZShTTkFQU0hPVF9ESVIpLmlzRGlyZWN0b3J5KCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXJNYWRlID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiQ3JlYXRpb24gb2YgIiArIGRpciArICIgZmFpbGVkLiIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvZy53KFRBRywgIkNyZWF0aW9uIG9mICIgKyBTTkFQU0hPVF9ESVIgKyAiIGZhaWxlZC4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZW5kaW5nLnNldChmYWxzZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB3cml0ZVNuYXBzaG90KGRpciwgbmFtZSk7CisgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZVNuYXBzaG90KFNOQVBTSE9UX0RJUiwgcHJvY2Vzc05hbWUsIHBhY2thZ2VJbmZvKTsKICAgICAgICAgICAgICAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBlbmRpbmcgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBlbmRpbmcuc2V0KGZhbHNlKTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0pOwpAQCAtMTI0LDE1ICsxMzcsMTUgQEAKICAgICAgICAgaWYgKCFlbmFibGVkKSB7CiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KLQotICAgICAgICBTdHJpbmcgZGlyID0gIi9kYXRhL3p5Z290ZS9zbmFwc2hvdHMiOwotICAgICAgICBuZXcgRmlsZShkaXIpLm1rZGlycygpOwotICAgICAgICB3cml0ZVNuYXBzaG90KGRpciwgInp5Z290ZSIpOworICAgICAgICB3cml0ZVNuYXBzaG90KCJ6eWdvdGUiLCBudWxsKTsKICAgICAgICAgSU5TVEFOQ0Uuc2h1dGRvd24oKTsKICAgICAgICAgSU5TVEFOQ0UgPSBudWxsOwogICAgIH0KIAotICAgIHByaXZhdGUgc3RhdGljIHZvaWQgd3JpdGVTbmFwc2hvdChTdHJpbmcgZGlyLCBTdHJpbmcgbmFtZSkgeworICAgIC8qKgorICAgICAqIHBhc3MgaW4gUGFja2FnZUluZm8gdG8gcmV0cmlldmUgdmFyaW91cyB2YWx1ZXMgZm9yIHNuYXBzaG90IGhlYWRlcgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIHZvaWQgd3JpdGVTbmFwc2hvdChTdHJpbmcgZGlyLCBTdHJpbmcgcHJvY2Vzc05hbWUsIFBhY2thZ2VJbmZvIHBhY2thZ2VJbmZvKSB7CiAgICAgICAgIGlmICghZW5hYmxlZCkgewogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CkBAIC0xNDQsNDAgKzE1Nyw1NSBAQAogICAgICAgICAgKiB3ZSBjYXB0dXJlIHR3byBzbmFwc2hvdHMgaW4gcmFwaWQgc3VjY2Vzc2lvbi4KICAgICAgICAgICovCiAgICAgICAgIGxvbmcgc3RhcnQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLSAgICAgICAgU3RyaW5nIHBhdGggPSBkaXIgKyAiLyIgKyBuYW1lLnJlcGxhY2UoJzonLCAnLicpICsgIi0iCi0gICAgICAgICAgICAgICAgKyBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSArICIuc25hcHNob3QiOwotCi0gICAgICAgIC8vIFRyeSB0byBvcGVuIHRoZSBmaWxlIGEgZmV3IHRpbWVzLiBUaGUgU0QgY2FyZCBtYXkgbm90IGJlIG1vdW50ZWQuCi0gICAgICAgIFByaW50U3RyZWFtIG91dDsKLSAgICAgICAgaW50IGNvdW50ID0gMDsKLSAgICAgICAgd2hpbGUgKHRydWUpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgb3V0ID0gbmV3IFByaW50U3RyZWFtKG5ldyBCdWZmZXJlZE91dHB1dFN0cmVhbShuZXcgRmlsZU91dHB1dFN0cmVhbShwYXRoKSkpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfSBjYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICBpZiAoKytjb3VudCA+IDMpIHsKLSAgICAgICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAiQ291bGQgbm90IG9wZW4gIiArIHBhdGggKyAiLiIpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLy8gU2xlZXAgZm9yIGEgYml0IGFuZCB0aGVuIHRyeSBhZ2Fpbi4KLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBUaHJlYWQuc2xlZXAoMjUwMCk7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZTEpIHsgLyogaWdub3JlICovIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCisgICAgICAgIFN0cmluZyBuYW1lID0gcHJvY2Vzc05hbWUucmVwbGFjZUFsbCgiOiIsICIuIik7CisgICAgICAgIFN0cmluZyBwYXRoID0gZGlyICsgIi8iICsgbmFtZSArICItIiArU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgKyAiLnNuYXBzaG90IjsKKyAgICAgICAgUHJpbnRTdHJlYW0gb3V0ID0gbnVsbDsKICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG91dCA9IG5ldyBQcmludFN0cmVhbShuZXcgQnVmZmVyZWRPdXRwdXRTdHJlYW0obmV3IEZpbGVPdXRwdXRTdHJlYW0ocGF0aCkpKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgTG9nLmUoVEFHLCAiQ291bGQgbm90IG9wZW4gIiArIHBhdGggKyAiOiIgKyBlKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICB0cnkgeworICAgICAgICAgICAgZ2VuZXJhdGVTbmFwc2hvdEhlYWRlcihuYW1lLCBwYWNrYWdlSW5mbywgb3V0KTsKICAgICAgICAgICAgIElOU1RBTkNFLndyaXRlSHByb2ZEYXRhKG91dCk7CiAgICAgICAgIH0gZmluYWxseSB7CiAgICAgICAgICAgICBvdXQuY2xvc2UoKTsKICAgICAgICAgfQogICAgICAgICBpZiAob3V0LmNoZWNrRXJyb3IoKSkgewogICAgICAgICAgICAgTG9nLmUoVEFHLCAiRXJyb3Igd3JpdGluZyBzbmFwc2hvdC4iKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGxvbmcgZWxhcHNlZCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC0gc3RhcnQ7Ci0gICAgICAgICAgICBMb2cuaShUQUcsICJXcm90ZSBzbmFwc2hvdCBmb3IgIiArIG5hbWUKLSAgICAgICAgICAgICAgICAgICsgIiBpbiAiICsgZWxhcHNlZCArICJtcy4iKTsKKyAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQorICAgICAgICAvLyBzZXQgZmlsZSByZWFkYWJsZSB0byB0aGUgd29ybGQgc28gdGhhdCBTYW1wbGluZ1Byb2ZpbGVyU2VydmljZQorICAgICAgICAvLyBjYW4gcHV0IGl0IHRvIGRyb3Bib3gKKyAgICAgICAgbmV3IEZpbGUocGF0aCkuc2V0UmVhZGFibGUodHJ1ZSwgZmFsc2UpOworCisgICAgICAgIGxvbmcgZWxhcHNlZCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC0gc3RhcnQ7CisgICAgICAgIExvZy5pKFRBRywgIldyb3RlIHNuYXBzaG90IGZvciAiICsgbmFtZSArICIgaW4gIiArIGVsYXBzZWQgKyAibXMuIik7CisgICAgfQorCisgICAgLyoqCisgICAgICogZ2VuZXJhdGUgaGVhZGVyIGZvciBzbmFwc2hvdHMsIHdpdGggdGhlIGZvbGxvd2luZyBmb3JtYXQgKGxpa2UgaHR0cCBoZWFkZXIpOgorICAgICAqCisgICAgICogVmVyc2lvbjogPHZlcnNpb24gbnVtYmVyIG9mIHByb2ZpbGVyPlxuCisgICAgICogUHJvY2VzczogPHByb2Nlc3MgbmFtZT5cbgorICAgICAqIFBhY2thZ2U6IDxwYWNrYWdlIG5hbWUsIGlmIGV4aXN0cz5cbgorICAgICAqIFBhY2thZ2UtVmVyc2lvbjogPHZlcnNpb24gbnVtYmVyIG9mIHRoZSBwYWNrYWdlLCBpZiBleGlzdHM+XG4KKyAgICAgKiBCdWlsZDogPGZpbmdlcnByaW50PlxuCisgICAgICogXG4KKyAgICAgKiA8dGhlIGFjdHVhbCBzbmFwc2hvdCBjb250ZW50IGJlZ2lucyBoZXJlLi4uPgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIHZvaWQgZ2VuZXJhdGVTbmFwc2hvdEhlYWRlcihTdHJpbmcgcHJvY2Vzc05hbWUsIFBhY2thZ2VJbmZvIHBhY2thZ2VJbmZvLAorICAgICAgICAgICAgUHJpbnRTdHJlYW0gb3V0KSB7CisgICAgICAgIC8vIHByb2ZpbGVyIHZlcnNpb24KKyAgICAgICAgb3V0LnByaW50bG4oIlZlcnNpb246IDIiKTsKKyAgICAgICAgb3V0LnByaW50bG4oIlByb2Nlc3M6ICIgKyBwcm9jZXNzTmFtZSk7CisgICAgICAgIGlmIChwYWNrYWdlSW5mbyAhPSBudWxsKSB7CisgICAgICAgICAgICBvdXQucHJpbnRsbigiUGFja2FnZTogIiArIHBhY2thZ2VJbmZvLnBhY2thZ2VOYW1lKTsKKyAgICAgICAgICAgIG91dC5wcmludGxuKCJQYWNrYWdlLVZlcnNpb246ICIgKyBwYWNrYWdlSW5mby52ZXJzaW9uQ29kZSk7CisgICAgICAgIH0KKyAgICAgICAgb3V0LnByaW50bG4oIkJ1aWxkOiAiICsgQnVpbGQuRklOR0VSUFJJTlQpOworICAgICAgICAvLyBzaW5nbGUgYmxhbmsgbGluZSBtZWFucyB0aGUgZW5kIG9mIHNuYXBzaG90IGhlYWRlci4KKyAgICAgICAgb3V0LnByaW50bG4oKTsKICAgICB9CiB9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvb3MvWnlnb3RlSW5pdC5qYXZhIGIvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL29zL1p5Z290ZUluaXQuamF2YQppbmRleCBhNDA5ZWM4Li5mMGYzMzg3IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvb3MvWnlnb3RlSW5pdC5qYXZhCisrKyBiL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC9vcy9aeWdvdGVJbml0LmphdmEKQEAgLTIyLDYgKzIyLDcgQEAKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlOwogaW1wb3J0IGFuZHJvaWQubmV0LkxvY2FsU2VydmVyU29ja2V0OwogaW1wb3J0IGFuZHJvaWQub3MuRGVidWc7CitpbXBvcnQgYW5kcm9pZC5vcy5GaWxlVXRpbHM7CiBpbXBvcnQgYW5kcm9pZC5vcy5TeXN0ZW1DbG9jazsKIGltcG9ydCBhbmRyb2lkLm9zLlN5c3RlbVByb3BlcnRpZXM7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkNvbmZpZzsKQEAgLTUwNiw2ICs1MDcsOSBAQAogCiAgICAgICAgIGNsb3NlU2VydmVyU29ja2V0KCk7CiAKKyAgICAgICAgLy8gc2V0IHVtYXNrIHRvIDAwNzcgc28gbmV3IGZpbGVzIGFuZCBkaXJlY3RvcmllcyB3aWxsIGRlZmF1bHQgdG8gb3duZXItb25seSBwZXJtaXNzaW9ucy4KKyAgICAgICAgRmlsZVV0aWxzLnNldFVNYXNrKEZpbGVVdGlscy5TX0lSV1hHIHwgRmlsZVV0aWxzLlNfSVJXWE8pOworCiAgICAgICAgIC8qCiAgICAgICAgICAqIFBhc3MgdGhlIHJlbWFpbmluZyBhcmd1bWVudHMgdG8gU3lzdGVtU2VydmVyLgogICAgICAgICAgKiAiLS1uaWNlLW5hbWU9c3lzdGVtX3NlcnZlciBjb20uYW5kcm9pZC5zZXJ2ZXIuU3lzdGVtU2VydmVyIgpAQCAtNTIzLDcgKzUyNyw3IEBACiAgICAgICAgIFN0cmluZyBhcmdzW10gPSB7CiAgICAgICAgICAgICAiLS1zZXR1aWQ9MTAwMCIsCiAgICAgICAgICAgICAiLS1zZXRnaWQ9MTAwMCIsCi0gICAgICAgICAgICAiLS1zZXRncm91cHM9MTAwMSwxMDAyLDEwMDMsMTAwNCwxMDA1LDEwMDYsMTAwNywxMDA4LDEwMDksMTAxMCwzMDAxLDMwMDIsMzAwMyIsCisgICAgICAgICAgICAiLS1zZXRncm91cHM9MTAwMSwxMDAyLDEwMDMsMTAwNCwxMDA1LDEwMDYsMTAwNywxMDA4LDEwMDksMTAxMCwxMDE4LDMwMDEsMzAwMiwzMDAzIiwKICAgICAgICAgICAgICItLWNhcGFiaWxpdGllcz0xMzAxMDQzNTIsMTMwMTA0MzUyIiwKICAgICAgICAgICAgICItLXJ1bnRpbWUtaW5pdCIsCiAgICAgICAgICAgICAiLS1uaWNlLW5hbWU9c3lzdGVtX3NlcnZlciIsCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvc3RhdHVzYmFyL0lTdGF0dXNCYXIuYWlkbCBiL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC9zdGF0dXNiYXIvSVN0YXR1c0Jhci5haWRsCmluZGV4IDQ1MDFiZDcuLmU4ODRhZjggMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC9zdGF0dXNiYXIvSVN0YXR1c0Jhci5haWRsCisrKyBiL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC9zdGF0dXNiYXIvSVN0YXR1c0Jhci5haWRsCkBAIC0zMCw1ICszMCw2IEBACiAgICAgdm9pZCBkaXNhYmxlKGludCBzdGF0ZSk7CiAgICAgdm9pZCBhbmltYXRlRXhwYW5kKCk7CiAgICAgdm9pZCBhbmltYXRlQ29sbGFwc2UoKTsKKyAgICB2b2lkIHNldExpZ2h0c09uKGJvb2xlYW4gb24pOwogfQogCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvc3RhdHVzYmFyL0lTdGF0dXNCYXJTZXJ2aWNlLmFpZGwgYi9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvc3RhdHVzYmFyL0lTdGF0dXNCYXJTZXJ2aWNlLmFpZGwKaW5kZXggODUyNjMwZC4uMDc2M2Y1ZSAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3N0YXR1c2Jhci9JU3RhdHVzQmFyU2VydmljZS5haWRsCisrKyBiL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC9zdGF0dXNiYXIvSVN0YXR1c0JhclNlcnZpY2UuYWlkbApAQCAtMzAsMTQgKzMwLDE4IEBACiAgICAgdm9pZCBzZXRJY29uKFN0cmluZyBzbG90LCBTdHJpbmcgaWNvblBhY2thZ2UsIGludCBpY29uSWQsIGludCBpY29uTGV2ZWwpOwogICAgIHZvaWQgc2V0SWNvblZpc2liaWxpdHkoU3RyaW5nIHNsb3QsIGJvb2xlYW4gdmlzaWJsZSk7CiAgICAgdm9pZCByZW1vdmVJY29uKFN0cmluZyBzbG90KTsKKyAgICB2b2lkIHNldEFjdGl2ZVdpbmRvd0lzRnVsbHNjcmVlbihib29sZWFuIGZ1bGxzY3JlZW4pOwogCiAgICAgLy8gLS0tLSBNZXRob2RzIGJlbG93IGFyZSBmb3IgdXNlIGJ5IHRoZSBzdGF0dXMgYmFyIHBvbGljeSBzZXJ2aWNlcyAtLS0tCiAgICAgLy8gWW91IG5lZWQgdGhlIFNUQVRVU19CQVJfU0VSVklDRSBwZXJtaXNzaW9uCiAgICAgdm9pZCByZWdpc3RlclN0YXR1c0JhcihJU3RhdHVzQmFyIGNhbGxiYWNrcywgb3V0IFN0YXR1c0Jhckljb25MaXN0IGljb25MaXN0LAotICAgICAgICAgICAgb3V0IExpc3Q8SUJpbmRlcj4gbm90aWZpY2F0aW9uS2V5cywgb3V0IExpc3Q8U3RhdHVzQmFyTm90aWZpY2F0aW9uPiBub3RpZmljYXRpb25zKTsKKyAgICAgICAgICAgIG91dCBMaXN0PElCaW5kZXI+IG5vdGlmaWNhdGlvbktleXMsIG91dCBMaXN0PFN0YXR1c0Jhck5vdGlmaWNhdGlvbj4gbm90aWZpY2F0aW9ucywKKyAgICAgICAgICAgIG91dCBib29sZWFuW10gbGlnaHRzT24pOwogICAgIHZvaWQgb25QYW5lbFJldmVhbGVkKCk7CiAgICAgdm9pZCBvbk5vdGlmaWNhdGlvbkNsaWNrKFN0cmluZyBwa2csIFN0cmluZyB0YWcsIGludCBpZCk7CiAgICAgdm9pZCBvbk5vdGlmaWNhdGlvbkVycm9yKFN0cmluZyBwa2csIFN0cmluZyB0YWcsIGludCBpZCwKICAgICAgICAgICAgIGludCB1aWQsIGludCBpbml0aWFsUGlkLCBTdHJpbmcgbWVzc2FnZSk7CiAgICAgdm9pZCBvbkNsZWFyQWxsTm90aWZpY2F0aW9ucygpOworICAgIHZvaWQgb25Ob3RpZmljYXRpb25DbGVhcihTdHJpbmcgcGtnLCBTdHJpbmcgdGFnLCBpbnQgaWQpOworICAgIHZvaWQgc2V0TGlnaHRzT24oYm9vbGVhbiBvbik7CiB9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdXRpbC9IaWVyYXJjaGljYWxTdGF0ZU1hY2hpbmUuamF2YSBiL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC91dGlsL0hpZXJhcmNoaWNhbFN0YXRlTWFjaGluZS5qYXZhCmluZGV4IGM1OTlkNjguLmQzOGMwM2IgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC91dGlsL0hpZXJhcmNoaWNhbFN0YXRlTWFjaGluZS5qYXZhCisrKyBiL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC91dGlsL0hpZXJhcmNoaWNhbFN0YXRlTWFjaGluZS5qYXZhCkBAIC0xMzcsNyArMTM3LDcgQEAKICAgICB9CiAKICAgICBjbGFzcyBTdGF0ZTEgZXh0ZW5kcyBIaWVyYXJjaGljYWxTdGF0ZSB7Ci0gICAgICAgIEBPdmVycmlkZSBwdWJsaWMgYm9vbGVhbiBwcm9jZXNzTWVzc2FnZShNZXNzYWdlIG1lc3NhZ2UpIHsKKyAgICAgICAgXEBPdmVycmlkZSBwdWJsaWMgYm9vbGVhbiBwcm9jZXNzTWVzc2FnZShNZXNzYWdlIG1lc3NhZ2UpIHsKICAgICAgICAgICAgIExvZy5kKFRBRywgIkhlbGxvIFdvcmxkIik7CiAgICAgICAgICAgICByZXR1cm4gSEFORExFRDsKICAgICAgICAgfQpAQCAtMjU3LDEwICsyNTcsMTAgQEAKICAgICB9CiAKICAgICBjbGFzcyBQMSBleHRlbmRzIEhpZXJhcmNoaWNhbFN0YXRlIHsKLSAgICAgICAgQE92ZXJyaWRlIHB1YmxpYyB2b2lkIGVudGVyKCkgeworICAgICAgICBcQE92ZXJyaWRlIHB1YmxpYyB2b2lkIGVudGVyKCkgewogICAgICAgICAgICAgTG9nLmQoVEFHLCAibVAxLmVudGVyIik7CiAgICAgICAgIH0KLSAgICAgICAgQE92ZXJyaWRlIHB1YmxpYyBib29sZWFuIHByb2Nlc3NNZXNzYWdlKE1lc3NhZ2UgbWVzc2FnZSkgeworICAgICAgICBcQE92ZXJyaWRlIHB1YmxpYyBib29sZWFuIHByb2Nlc3NNZXNzYWdlKE1lc3NhZ2UgbWVzc2FnZSkgewogICAgICAgICAgICAgYm9vbGVhbiByZXRWYWw7CiAgICAgICAgICAgICBMb2cuZChUQUcsICJtUDEucHJvY2Vzc01lc3NhZ2Ugd2hhdD0iICsgbWVzc2FnZS53aGF0KTsKICAgICAgICAgICAgIHN3aXRjaChtZXNzYWdlLndoYXQpIHsKQEAgLTI3OCwxNiArMjc4LDE2IEBACiAgICAgICAgICAgICB9CiAgICAgICAgICAgICByZXR1cm4gcmV0VmFsOwogICAgICAgICB9Ci0gICAgICAgIEBPdmVycmlkZSBwdWJsaWMgdm9pZCBleGl0KCkgeworICAgICAgICBcQE92ZXJyaWRlIHB1YmxpYyB2b2lkIGV4aXQoKSB7CiAgICAgICAgICAgICBMb2cuZChUQUcsICJtUDEuZXhpdCIpOwogICAgICAgICB9CiAgICAgfQogCiAgICAgY2xhc3MgUzEgZXh0ZW5kcyBIaWVyYXJjaGljYWxTdGF0ZSB7Ci0gICAgICAgIEBPdmVycmlkZSBwdWJsaWMgdm9pZCBlbnRlcigpIHsKKyAgICAgICAgXEBPdmVycmlkZSBwdWJsaWMgdm9pZCBlbnRlcigpIHsKICAgICAgICAgICAgIExvZy5kKFRBRywgIm1TMS5lbnRlciIpOwogICAgICAgICB9Ci0gICAgICAgIEBPdmVycmlkZSBwdWJsaWMgYm9vbGVhbiBwcm9jZXNzTWVzc2FnZShNZXNzYWdlIG1lc3NhZ2UpIHsKKyAgICAgICAgXEBPdmVycmlkZSBwdWJsaWMgYm9vbGVhbiBwcm9jZXNzTWVzc2FnZShNZXNzYWdlIG1lc3NhZ2UpIHsKICAgICAgICAgICAgIExvZy5kKFRBRywgIlMxLnByb2Nlc3NNZXNzYWdlIHdoYXQ9IiArIG1lc3NhZ2Uud2hhdCk7CiAgICAgICAgICAgICBpZiAobWVzc2FnZS53aGF0ID09IENNRF8xKSB7CiAgICAgICAgICAgICAgICAgLy8gVHJhbnNpdGlvbiB0byBvdXJzZWxmIHRvIHNob3cgdGhhdCBlbnRlci9leGl0IGlzIGNhbGxlZApAQCAtMjk4LDE2ICsyOTgsMTYgQEAKICAgICAgICAgICAgICAgICByZXR1cm4gTk9UX0hBTkRMRUQ7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KLSAgICAgICAgQE92ZXJyaWRlIHB1YmxpYyB2b2lkIGV4aXQoKSB7CisgICAgICAgIFxAT3ZlcnJpZGUgcHVibGljIHZvaWQgZXhpdCgpIHsKICAgICAgICAgICAgIExvZy5kKFRBRywgIm1TMS5leGl0Iik7CiAgICAgICAgIH0KICAgICB9CiAKICAgICBjbGFzcyBTMiBleHRlbmRzIEhpZXJhcmNoaWNhbFN0YXRlIHsKLSAgICAgICAgQE92ZXJyaWRlIHB1YmxpYyB2b2lkIGVudGVyKCkgeworICAgICAgICBcQE92ZXJyaWRlIHB1YmxpYyB2b2lkIGVudGVyKCkgewogICAgICAgICAgICAgTG9nLmQoVEFHLCAibVMyLmVudGVyIik7CiAgICAgICAgIH0KLSAgICAgICAgQE92ZXJyaWRlIHB1YmxpYyBib29sZWFuIHByb2Nlc3NNZXNzYWdlKE1lc3NhZ2UgbWVzc2FnZSkgeworICAgICAgICBcQE92ZXJyaWRlIHB1YmxpYyBib29sZWFuIHByb2Nlc3NNZXNzYWdlKE1lc3NhZ2UgbWVzc2FnZSkgewogICAgICAgICAgICAgYm9vbGVhbiByZXRWYWw7CiAgICAgICAgICAgICBMb2cuZChUQUcsICJtUzIucHJvY2Vzc01lc3NhZ2Ugd2hhdD0iICsgbWVzc2FnZS53aGF0KTsKICAgICAgICAgICAgIHN3aXRjaChtZXNzYWdlLndoYXQpIHsKQEAgLTMyNiwxNyArMzI2LDE3IEBACiAgICAgICAgICAgICB9CiAgICAgICAgICAgICByZXR1cm4gcmV0VmFsOwogICAgICAgICB9Ci0gICAgICAgIEBPdmVycmlkZSBwdWJsaWMgdm9pZCBleGl0KCkgeworICAgICAgICBcQE92ZXJyaWRlIHB1YmxpYyB2b2lkIGV4aXQoKSB7CiAgICAgICAgICAgICBMb2cuZChUQUcsICJtUzIuZXhpdCIpOwogICAgICAgICB9CiAgICAgfQogCiAgICAgY2xhc3MgUDIgZXh0ZW5kcyBIaWVyYXJjaGljYWxTdGF0ZSB7Ci0gICAgICAgIEBPdmVycmlkZSBwdWJsaWMgdm9pZCBlbnRlcigpIHsKKyAgICAgICAgXEBPdmVycmlkZSBwdWJsaWMgdm9pZCBlbnRlcigpIHsKICAgICAgICAgICAgIExvZy5kKFRBRywgIm1QMi5lbnRlciIpOwogICAgICAgICAgICAgc2VuZE1lc3NhZ2Uob2J0YWluTWVzc2FnZShDTURfNSkpOwogICAgICAgICB9Ci0gICAgICAgIEBPdmVycmlkZSBwdWJsaWMgYm9vbGVhbiBwcm9jZXNzTWVzc2FnZShNZXNzYWdlIG1lc3NhZ2UpIHsKKyAgICAgICAgXEBPdmVycmlkZSBwdWJsaWMgYm9vbGVhbiBwcm9jZXNzTWVzc2FnZShNZXNzYWdlIG1lc3NhZ2UpIHsKICAgICAgICAgICAgIExvZy5kKFRBRywgIlAyLnByb2Nlc3NNZXNzYWdlIHdoYXQ9IiArIG1lc3NhZ2Uud2hhdCk7CiAgICAgICAgICAgICBzd2l0Y2gobWVzc2FnZS53aGF0KSB7CiAgICAgICAgICAgICBjYXNlKENNRF8zKToKQEAgLTM0OSwxMiArMzQ5LDEyIEBACiAgICAgICAgICAgICB9CiAgICAgICAgICAgICByZXR1cm4gSEFORExFRDsKICAgICAgICAgfQotICAgICAgICBAT3ZlcnJpZGUgcHVibGljIHZvaWQgZXhpdCgpIHsKKyAgICAgICAgXEBPdmVycmlkZSBwdWJsaWMgdm9pZCBleGl0KCkgewogICAgICAgICAgICAgTG9nLmQoVEFHLCAibVAyLmV4aXQiKTsKICAgICAgICAgfQogICAgIH0KIAotICAgIEBPdmVycmlkZQorICAgIFxAT3ZlcnJpZGUKICAgICB2b2lkIGhhbHRpbmcoKSB7CiAgICAgICAgIExvZy5kKFRBRywgImhhbHRpbmciKTsKICAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7CkBAIC0xMTk3LDYgKzExOTcsMzUgQEAKICAgICB9CiAKICAgICAvKioKKyAgICAgKiBHZXQgYSBtZXNzYWdlIGFuZCBzZXQgTWVzc2FnZS50YXJnZXQgPSB0aGlzLAorICAgICAqIHdoYXQsIGFyZzEgYW5kIGFyZzIKKyAgICAgKgorICAgICAqIEBwYXJhbSB3aGF0ICBpcyBhc3NpZ25lZCB0byBNZXNzYWdlLndoYXQKKyAgICAgKiBAcGFyYW0gYXJnMSAgaXMgYXNzaWduZWQgdG8gTWVzc2FnZS5hcmcxCisgICAgICogQHBhcmFtIGFyZzIgIGlzIGFzc2lnbmVkIHRvIE1lc3NhZ2UuYXJnMgorICAgICAqIEByZXR1cm4gIEEgTWVzc2FnZSBvYmplY3QgZnJvbSB0aGUgZ2xvYmFsIHBvb2wuCisgICAgICovCisgICAgcHVibGljIGZpbmFsIE1lc3NhZ2Ugb2J0YWluTWVzc2FnZShpbnQgd2hhdCwgaW50IGFyZzEsIGludCBhcmcyKQorICAgIHsKKyAgICAgICAgcmV0dXJuIE1lc3NhZ2Uub2J0YWluKG1Ic21IYW5kbGVyLCB3aGF0LCBhcmcxLCBhcmcyKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgYSBtZXNzYWdlIGFuZCBzZXQgTWVzc2FnZS50YXJnZXQgPSB0aGlzLAorICAgICAqIHdoYXQsIGFyZzEsIGFyZzIgYW5kIG9iagorICAgICAqCisgICAgICogQHBhcmFtIHdoYXQgIGlzIGFzc2lnbmVkIHRvIE1lc3NhZ2Uud2hhdAorICAgICAqIEBwYXJhbSBhcmcxICBpcyBhc3NpZ25lZCB0byBNZXNzYWdlLmFyZzEKKyAgICAgKiBAcGFyYW0gYXJnMiAgaXMgYXNzaWduZWQgdG8gTWVzc2FnZS5hcmcyCisgICAgICogQHBhcmFtIG9iaiBpcyBhc3NpZ25lZCB0byBNZXNzYWdlLm9iagorICAgICAqIEByZXR1cm4gIEEgTWVzc2FnZSBvYmplY3QgZnJvbSB0aGUgZ2xvYmFsIHBvb2wuCisgICAgICovCisgICAgcHVibGljIGZpbmFsIE1lc3NhZ2Ugb2J0YWluTWVzc2FnZShpbnQgd2hhdCwgaW50IGFyZzEsIGludCBhcmcyLCBPYmplY3Qgb2JqKQorICAgIHsKKyAgICAgICAgcmV0dXJuIE1lc3NhZ2Uub2J0YWluKG1Ic21IYW5kbGVyLCB3aGF0LCBhcmcxLCBhcmcyLCBvYmopOworICAgIH0KKworICAgIC8qKgogICAgICAqIEVucXVldWUgYSBtZXNzYWdlIHRvIHRoaXMgc3RhdGUgbWFjaGluZS4KICAgICAgKi8KICAgICBwdWJsaWMgZmluYWwgdm9pZCBzZW5kTWVzc2FnZShpbnQgd2hhdCkgewpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3V0aWwvVHlwZWRQcm9wZXJ0aWVzLmphdmEgYi9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdXRpbC9UeXBlZFByb3BlcnRpZXMuamF2YQppbmRleCBjMmNlMjEwLi41NjEzOTk5IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdXRpbC9UeXBlZFByb3BlcnRpZXMuamF2YQorKysgYi9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdXRpbC9UeXBlZFByb3BlcnRpZXMuamF2YQpAQCAtNDEyLDcgKzQxMiw3IEBACiAgICAgICovCiAKICAgICAvKioKLSAgICAgKiBBbiB1bmNoZWNrZWQgZXhjZXB0aW9uIHRoYXQgaXMgdGhyb3duIGlmIGEge0Bjb2RlIGdldCZsdDtUWVBFJmd0OygpfSBtZXRob2QKKyAgICAgKiBBbiB1bmNoZWNrZWQgZXhjZXB0aW9uIHRoYXQgaXMgdGhyb3duIGlmIGEge0Bjb2RlIGdldDxUWVBFPigpfSBtZXRob2QKICAgICAgKiBpcyB1c2VkIHRvIHJldHJpZXZlIGEgcGFyYW1ldGVyIHdob3NlIHR5cGUgZG9lcyBub3QgbWF0Y2ggdGhlIG1ldGhvZCBuYW1lLgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgVHlwZUV4Y2VwdGlvbiBleHRlbmRzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB7CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdXRpbC9YbWxVdGlscy5qYXZhIGIvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3V0aWwvWG1sVXRpbHMuamF2YQppbmRleCA4ZDhkZjE2Li5lMDBhODUzIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdXRpbC9YbWxVdGlscy5qYXZhCisrKyBiL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC91dGlsL1htbFV0aWxzLmphdmEKQEAgLTI2LDYgKzI2LDcgQEAKIGltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwogaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwogaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuTWFwOwpAQCAtMjg0LDYgKzI4NSwyNiBAQAogCiAgICAgICAgIG91dC5lbmRUYWcobnVsbCwgImxpc3QiKTsKICAgICB9CisgICAgCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCB2b2lkIHdyaXRlU2V0WG1sKFNldCB2YWwsIFN0cmluZyBuYW1lLCBYbWxTZXJpYWxpemVyIG91dCkKKyAgICAgICAgICAgIHRocm93cyBYbWxQdWxsUGFyc2VyRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKHZhbCA9PSBudWxsKSB7CisgICAgICAgICAgICBvdXQuc3RhcnRUYWcobnVsbCwgIm51bGwiKTsKKyAgICAgICAgICAgIG91dC5lbmRUYWcobnVsbCwgIm51bGwiKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgb3V0LnN0YXJ0VGFnKG51bGwsICJzZXQiKTsKKyAgICAgICAgaWYgKG5hbWUgIT0gbnVsbCkgeworICAgICAgICAgICAgb3V0LmF0dHJpYnV0ZShudWxsLCAibmFtZSIsIG5hbWUpOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBmb3IgKE9iamVjdCB2IDogdmFsKSB7CisgICAgICAgICAgICB3cml0ZVZhbHVlWG1sKHYsIG51bGwsIG91dCk7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIG91dC5lbmRUYWcobnVsbCwgInNldCIpOworICAgIH0KIAogICAgIC8qKgogICAgICAqIEZsYXR0ZW4gYSBieXRlW10gaW50byBhbiBYbWxTZXJpYWxpemVyLiAgVGhlIGxpc3QgY2FuIGxhdGVyIGJlIHJlYWQgYmFjawpAQCAtNDI2LDYgKzQ0Nyw5IEBACiAgICAgICAgIH0gZWxzZSBpZiAodiBpbnN0YW5jZW9mIExpc3QpIHsKICAgICAgICAgICAgIHdyaXRlTGlzdFhtbCgoTGlzdCl2LCBuYW1lLCBvdXQpOwogICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9IGVsc2UgaWYgKHYgaW5zdGFuY2VvZiBTZXQpIHsKKyAgICAgICAgICAgIHdyaXRlU2V0WG1sKChTZXQpdiwgbmFtZSwgb3V0KTsKKyAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfSBlbHNlIGlmICh2IGluc3RhbmNlb2YgQ2hhclNlcXVlbmNlKSB7CiAgICAgICAgICAgICAvLyBYWFggVGhpcyBpcyB0byBhbGxvdyB1cyB0byBhdCBsZWFzdCB3cml0ZSBzb21ldGhpbmcgaWYKICAgICAgICAgICAgIC8vIHdlIGVuY291bnRlciBzdHlsZWQgdGV4dC4uLiAgYnV0IGl0IG1lYW5zIHdlIHdpbGwgZHJvcCBhbGwKQEAgLTQ3Niw3ICs1MDAsNyBAQAogICAgICAqCiAgICAgICogQHBhcmFtIGluIFRoZSBJbnB1dFN0cmVhbSBmcm9tIHdoaWNoIHRvIHJlYWQuCiAgICAgICoKLSAgICAgKiBAcmV0dXJuIEhhc2hNYXAgVGhlIHJlc3VsdGluZyBsaXN0LgorICAgICAqIEByZXR1cm4gQXJyYXlMaXN0IFRoZSByZXN1bHRpbmcgbGlzdC4KICAgICAgKgogICAgICAqIEBzZWUgI3JlYWRNYXBYbWwKICAgICAgKiBAc2VlICNyZWFkVmFsdWVYbWwKQEAgLTQ5MCw2ICs1MTQsMjkgQEAKICAgICAgICAgcGFyc2VyLnNldElucHV0KGluLCBudWxsKTsKICAgICAgICAgcmV0dXJuIChBcnJheUxpc3QpcmVhZFZhbHVlWG1sKHBhcnNlciwgbmV3IFN0cmluZ1sxXSk7CiAgICAgfQorICAgIAorICAgIAorICAgIC8qKgorICAgICAqIFJlYWQgYSBIYXNoU2V0IGZyb20gYW4gSW5wdXRTdHJlYW0gY29udGFpbmluZyBYTUwuIFRoZSBzdHJlYW0gY2FuCisgICAgICogcHJldmlvdXNseSBoYXZlIGJlZW4gd3JpdHRlbiBieSB3cml0ZVNldFhtbCgpLgorICAgICAqIAorICAgICAqIEBwYXJhbSBpbiBUaGUgSW5wdXRTdHJlYW0gZnJvbSB3aGljaCB0byByZWFkLgorICAgICAqIAorICAgICAqIEByZXR1cm4gSGFzaFNldCBUaGUgcmVzdWx0aW5nIHNldC4KKyAgICAgKiAKKyAgICAgKiBAdGhyb3dzIFhtbFB1bGxQYXJzZXJFeGNlcHRpb24KKyAgICAgKiBAdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24KKyAgICAgKiAKKyAgICAgKiBAc2VlICNyZWFkVmFsdWVYbWwKKyAgICAgKiBAc2VlICNyZWFkVGhpc1NldFhtbAorICAgICAqIEBzZWUgI3dyaXRlU2V0WG1sCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBIYXNoU2V0IHJlYWRTZXRYbWwoSW5wdXRTdHJlYW0gaW4pCisgICAgICAgICAgICB0aHJvd3MgWG1sUHVsbFBhcnNlckV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7CisgICAgICAgIFhtbFB1bGxQYXJzZXIgcGFyc2VyID0gWG1sLm5ld1B1bGxQYXJzZXIoKTsKKyAgICAgICAgcGFyc2VyLnNldElucHV0KGluLCBudWxsKTsKKyAgICAgICAgcmV0dXJuIChIYXNoU2V0KSByZWFkVmFsdWVYbWwocGFyc2VyLCBuZXcgU3RyaW5nWzFdKTsKKyAgICB9CiAKICAgICAvKioKICAgICAgKiBSZWFkIGEgSGFzaE1hcCBvYmplY3QgZnJvbSBhbiBYbWxQdWxsUGFyc2VyLiAgVGhlIFhNTCBkYXRhIGNvdWxkCkBAIC01NzMsNiArNjIwLDQ3IEBACiAgICAgICAgIHRocm93IG5ldyBYbWxQdWxsUGFyc2VyRXhjZXB0aW9uKAogICAgICAgICAgICAgIkRvY3VtZW50IGVuZGVkIGJlZm9yZSAiICsgZW5kVGFnICsgIiBlbmQgdGFnIik7CiAgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFJlYWQgYSBIYXNoU2V0IG9iamVjdCBmcm9tIGFuIFhtbFB1bGxQYXJzZXIuIFRoZSBYTUwgZGF0YSBjb3VsZCBwcmV2aW91c2x5CisgICAgICogaGF2ZSBiZWVuIGdlbmVyYXRlZCBieSB3cml0ZVNldFhtbCgpLiBUaGUgWG1sUHVsbFBhcnNlciBtdXN0IGJlIHBvc2l0aW9uZWQKKyAgICAgKiA8ZW0+YWZ0ZXI8L2VtPiB0aGUgdGFnIHRoYXQgYmVnaW5zIHRoZSBzZXQuCisgICAgICogCisgICAgICogQHBhcmFtIHBhcnNlciBUaGUgWG1sUHVsbFBhcnNlciBmcm9tIHdoaWNoIHRvIHJlYWQgdGhlIHNldCBkYXRhLgorICAgICAqIEBwYXJhbSBlbmRUYWcgTmFtZSBvZiB0aGUgdGFnIHRoYXQgd2lsbCBlbmQgdGhlIHNldCwgdXN1YWxseSAic2V0Ii4KKyAgICAgKiBAcGFyYW0gbmFtZSBBbiBhcnJheSBvZiBvbmUgc3RyaW5nLCB1c2VkIHRvIHJldHVybiB0aGUgbmFtZSBhdHRyaWJ1dGUKKyAgICAgKiAgICAgICAgICAgICBvZiB0aGUgc2V0J3MgdGFnLgorICAgICAqCisgICAgICogQHJldHVybiBIYXNoU2V0IFRoZSBuZXdseSBnZW5lcmF0ZWQgc2V0LgorICAgICAqIAorICAgICAqIEB0aHJvd3MgWG1sUHVsbFBhcnNlckV4Y2VwdGlvbgorICAgICAqIEB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbgorICAgICAqIAorICAgICAqIEBzZWUgI3JlYWRTZXRYbWwKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEhhc2hTZXQgcmVhZFRoaXNTZXRYbWwoWG1sUHVsbFBhcnNlciBwYXJzZXIsIFN0cmluZyBlbmRUYWcsIFN0cmluZ1tdIG5hbWUpCisgICAgICAgICAgICB0aHJvd3MgWG1sUHVsbFBhcnNlckV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7CisgICAgICAgIEhhc2hTZXQgc2V0ID0gbmV3IEhhc2hTZXQoKTsKKyAgICAgICAgCisgICAgICAgIGludCBldmVudFR5cGUgPSBwYXJzZXIuZ2V0RXZlbnRUeXBlKCk7CisgICAgICAgIGRvIHsKKyAgICAgICAgICAgIGlmIChldmVudFR5cGUgPT0gcGFyc2VyLlNUQVJUX1RBRykgeworICAgICAgICAgICAgICAgIE9iamVjdCB2YWwgPSByZWFkVGhpc1ZhbHVlWG1sKHBhcnNlciwgbmFtZSk7CisgICAgICAgICAgICAgICAgc2V0LmFkZCh2YWwpOworICAgICAgICAgICAgICAgIC8vU3lzdGVtLm91dC5wcmludGxuKCJBZGRpbmcgdG8gc2V0OiAiICsgdmFsKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoZXZlbnRUeXBlID09IHBhcnNlci5FTkRfVEFHKSB7CisgICAgICAgICAgICAgICAgaWYgKHBhcnNlci5nZXROYW1lKCkuZXF1YWxzKGVuZFRhZykpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNldDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFhtbFB1bGxQYXJzZXJFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICAgICAiRXhwZWN0ZWQgIiArIGVuZFRhZyArICIgZW5kIHRhZyBhdDogIiArIHBhcnNlci5nZXROYW1lKCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZXZlbnRUeXBlID0gcGFyc2VyLm5leHQoKTsKKyAgICAgICAgfSB3aGlsZSAoZXZlbnRUeXBlICE9IHBhcnNlci5FTkRfRE9DVU1FTlQpOworICAgICAgICAKKyAgICAgICAgdGhyb3cgbmV3IFhtbFB1bGxQYXJzZXJFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgIkRvY3VtZW50IGVuZGVkIGJlZm9yZSAiICsgZW5kVGFnICsgIiBlbmQgdGFnIik7CisgICAgfQogCiAgICAgLyoqCiAgICAgICogUmVhZCBhbiBpbnRbXSBvYmplY3QgZnJvbSBhbiBYbWxQdWxsUGFyc2VyLiAgVGhlIFhNTCBkYXRhIGNvdWxkCkBAIC03NDAsNiArODI4LDEyIEBACiAgICAgICAgICAgICBuYW1lWzBdID0gdmFsdWVOYW1lOwogICAgICAgICAgICAgLy9TeXN0ZW0ub3V0LnByaW50bG4oIlJldHVybmluZyB2YWx1ZSBmb3IgIiArIHZhbHVlTmFtZSArICI6ICIgKyByZXMpOwogICAgICAgICAgICAgcmV0dXJuIHJlczsKKyAgICAgICAgfSBlbHNlIGlmICh0YWdOYW1lLmVxdWFscygic2V0IikpIHsKKyAgICAgICAgICAgIHBhcnNlci5uZXh0KCk7CisgICAgICAgICAgICByZXMgPSByZWFkVGhpc1NldFhtbChwYXJzZXIsICJzZXQiLCBuYW1lKTsKKyAgICAgICAgICAgIG5hbWVbMF0gPSB2YWx1ZU5hbWU7CisgICAgICAgICAgICAvL1N5c3RlbS5vdXQucHJpbnRsbigiUmV0dXJuaW5nIHZhbHVlIGZvciAiICsgdmFsdWVOYW1lICsgIjogIiArIHJlcyk7CisgICAgICAgICAgICByZXR1cm4gcmVzOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgdGhyb3cgbmV3IFhtbFB1bGxQYXJzZXJFeGNlcHRpb24oCiAgICAgICAgICAgICAgICAgIlVua25vd24gdGFnOiAiICsgdGFnTmFtZSk7CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdmlldy9TdGFuZGFsb25lQWN0aW9uTW9kZS5qYXZhIGIvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3ZpZXcvU3RhbmRhbG9uZUFjdGlvbk1vZGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMzgxOTAxCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3ZpZXcvU3RhbmRhbG9uZUFjdGlvbk1vZGUuamF2YQpAQCAtMCwwICsxLDE0MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIGNvbS5hbmRyb2lkLmludGVybmFsLnZpZXc7CisKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC52aWV3Lm1lbnUuTWVudUJ1aWxkZXI7CitpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudmlldy5tZW51Lk1lbnVQb3B1cEhlbHBlcjsKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC52aWV3Lm1lbnUuU3ViTWVudUJ1aWxkZXI7CitpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwud2lkZ2V0LkFjdGlvbkJhckNvbnRleHRWaWV3OworCitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC52aWV3LkFjdGlvbk1vZGU7CitpbXBvcnQgYW5kcm9pZC52aWV3Lk1lbnU7CitpbXBvcnQgYW5kcm9pZC52aWV3Lk1lbnVJbmZsYXRlcjsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuTWVudUl0ZW07CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CisKK2ltcG9ydCBqYXZhLmxhbmcucmVmLldlYWtSZWZlcmVuY2U7CisKK3B1YmxpYyBjbGFzcyBTdGFuZGFsb25lQWN0aW9uTW9kZSBleHRlbmRzIEFjdGlvbk1vZGUgaW1wbGVtZW50cyBNZW51QnVpbGRlci5DYWxsYmFjayB7CisgICAgcHJpdmF0ZSBDb250ZXh0IG1Db250ZXh0OworICAgIHByaXZhdGUgQWN0aW9uQmFyQ29udGV4dFZpZXcgbUNvbnRleHRWaWV3OworICAgIHByaXZhdGUgQWN0aW9uTW9kZS5DYWxsYmFjayBtQ2FsbGJhY2s7CisgICAgcHJpdmF0ZSBXZWFrUmVmZXJlbmNlPFZpZXc+IG1DdXN0b21WaWV3OworICAgIHByaXZhdGUgYm9vbGVhbiBtRmluaXNoZWQ7CisKKyAgICBwcml2YXRlIE1lbnVCdWlsZGVyIG1NZW51OworCisgICAgcHVibGljIFN0YW5kYWxvbmVBY3Rpb25Nb2RlKENvbnRleHQgY29udGV4dCwgQWN0aW9uQmFyQ29udGV4dFZpZXcgdmlldywKKyAgICAgICAgICAgIEFjdGlvbk1vZGUuQ2FsbGJhY2sgY2FsbGJhY2spIHsKKyAgICAgICAgbUNvbnRleHQgPSBjb250ZXh0OworICAgICAgICBtQ29udGV4dFZpZXcgPSB2aWV3OworICAgICAgICBtQ2FsbGJhY2sgPSBjYWxsYmFjazsKKworICAgICAgICBtTWVudSA9IG5ldyBNZW51QnVpbGRlcihjb250ZXh0KS5zZXREZWZhdWx0U2hvd0FzQWN0aW9uKE1lbnVJdGVtLlNIT1dfQVNfQUNUSU9OX0lGX1JPT00pOworICAgICAgICBtTWVudS5zZXRDYWxsYmFjayh0aGlzKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBzZXRUaXRsZShDaGFyU2VxdWVuY2UgdGl0bGUpIHsKKyAgICAgICAgbUNvbnRleHRWaWV3LnNldFRpdGxlKHRpdGxlKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBzZXRTdWJ0aXRsZShDaGFyU2VxdWVuY2Ugc3VidGl0bGUpIHsKKyAgICAgICAgbUNvbnRleHRWaWV3LnNldFN1YnRpdGxlKHN1YnRpdGxlKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBzZXRUaXRsZShpbnQgcmVzSWQpIHsKKyAgICAgICAgc2V0VGl0bGUobUNvbnRleHQuZ2V0U3RyaW5nKHJlc0lkKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgc2V0U3VidGl0bGUoaW50IHJlc0lkKSB7CisgICAgICAgIHNldFN1YnRpdGxlKG1Db250ZXh0LmdldFN0cmluZyhyZXNJZCkpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHNldEN1c3RvbVZpZXcoVmlldyB2aWV3KSB7CisgICAgICAgIG1Db250ZXh0Vmlldy5zZXRDdXN0b21WaWV3KHZpZXcpOworICAgICAgICBtQ3VzdG9tVmlldyA9IHZpZXcgIT0gbnVsbCA/IG5ldyBXZWFrUmVmZXJlbmNlPFZpZXc+KHZpZXcpIDogbnVsbDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBpbnZhbGlkYXRlKCkgeworICAgICAgICBtQ2FsbGJhY2sub25QcmVwYXJlQWN0aW9uTW9kZSh0aGlzLCBtTWVudSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgZmluaXNoKCkgeworICAgICAgICBpZiAobUZpbmlzaGVkKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgbUZpbmlzaGVkID0gdHJ1ZTsKKworICAgICAgICBtQ2FsbGJhY2sub25EZXN0cm95QWN0aW9uTW9kZSh0aGlzKTsKKyAgICAgICAgbUNvbnRleHRWaWV3LnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgTWVudSBnZXRNZW51KCkgeworICAgICAgICByZXR1cm4gbU1lbnU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIENoYXJTZXF1ZW5jZSBnZXRUaXRsZSgpIHsKKyAgICAgICAgcmV0dXJuIG1Db250ZXh0Vmlldy5nZXRUaXRsZSgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBDaGFyU2VxdWVuY2UgZ2V0U3VidGl0bGUoKSB7CisgICAgICAgIHJldHVybiBtQ29udGV4dFZpZXcuZ2V0U3VidGl0bGUoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgVmlldyBnZXRDdXN0b21WaWV3KCkgeworICAgICAgICByZXR1cm4gbUN1c3RvbVZpZXcgIT0gbnVsbCA/IG1DdXN0b21WaWV3LmdldCgpIDogbnVsbDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgTWVudUluZmxhdGVyIGdldE1lbnVJbmZsYXRlcigpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBNZW51SW5mbGF0ZXIobUNvbnRleHQpOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIG9uTWVudUl0ZW1TZWxlY3RlZChNZW51QnVpbGRlciBtZW51LCBNZW51SXRlbSBpdGVtKSB7CisgICAgICAgIHJldHVybiBtQ2FsbGJhY2sub25BY3Rpb25JdGVtQ2xpY2tlZCh0aGlzLCBpdGVtKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBvbkNsb3NlTWVudShNZW51QnVpbGRlciBtZW51LCBib29sZWFuIGFsbE1lbnVzQXJlQ2xvc2luZykgeworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIG9uU3ViTWVudVNlbGVjdGVkKFN1Yk1lbnVCdWlsZGVyIHN1Yk1lbnUpIHsKKyAgICAgICAgaWYgKCFzdWJNZW51Lmhhc1Zpc2libGVJdGVtcygpKSB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIG5ldyBNZW51UG9wdXBIZWxwZXIobUNvbnRleHQsIHN1Yk1lbnUpLnNob3coKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgb25DbG9zZVN1Yk1lbnUoU3ViTWVudUJ1aWxkZXIgbWVudSkgeworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIG9uTWVudU1vZGVDaGFuZ2UoTWVudUJ1aWxkZXIgbWVudSkgeworICAgICAgICBpbnZhbGlkYXRlKCk7CisgICAgICAgIG1Db250ZXh0Vmlldy5zaG93T3ZlcmZsb3dNZW51KCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3ZpZXcvbWVudS9BY3Rpb25NZW51LmphdmEgYi9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdmlldy9tZW51L0FjdGlvbk1lbnUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZDQ0ZWJjCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3ZpZXcvbWVudS9BY3Rpb25NZW51LmphdmEKQEAgLTAsMCArMSwyNjMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLmludGVybmFsLnZpZXcubWVudTsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29tcG9uZW50TmFtZTsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5QYWNrYWdlTWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uUmVzb2x2ZUluZm87CitpbXBvcnQgYW5kcm9pZC52aWV3LktleUV2ZW50OworaW1wb3J0IGFuZHJvaWQudmlldy5NZW51OworaW1wb3J0IGFuZHJvaWQudmlldy5NZW51SXRlbTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuU3ViTWVudTsKKworLyoqCisgKiBAaGlkZQorICovCitwdWJsaWMgY2xhc3MgQWN0aW9uTWVudSBpbXBsZW1lbnRzIE1lbnUgeworICAgIHByaXZhdGUgQ29udGV4dCBtQ29udGV4dDsKKyAgICAKKyAgICBwcml2YXRlIGJvb2xlYW4gbUlzUXdlcnR5OworICAgIAorICAgIHByaXZhdGUgQXJyYXlMaXN0PEFjdGlvbk1lbnVJdGVtPiBtSXRlbXM7CisgICAgCisgICAgcHVibGljIEFjdGlvbk1lbnUoQ29udGV4dCBjb250ZXh0KSB7CisgICAgICAgIG1Db250ZXh0ID0gY29udGV4dDsKKyAgICAgICAgbUl0ZW1zID0gbmV3IEFycmF5TGlzdDxBY3Rpb25NZW51SXRlbT4oKTsKKyAgICB9CisgICAgCisgICAgcHVibGljIENvbnRleHQgZ2V0Q29udGV4dCgpIHsKKyAgICAgICAgcmV0dXJuIG1Db250ZXh0OworICAgIH0KKworICAgIHB1YmxpYyBNZW51SXRlbSBhZGQoQ2hhclNlcXVlbmNlIHRpdGxlKSB7CisgICAgICAgIHJldHVybiBhZGQoMCwgMCwgMCwgdGl0bGUpOworICAgIH0KKworICAgIHB1YmxpYyBNZW51SXRlbSBhZGQoaW50IHRpdGxlUmVzKSB7CisgICAgICAgIHJldHVybiBhZGQoMCwgMCwgMCwgdGl0bGVSZXMpOworICAgIH0KKworICAgIHB1YmxpYyBNZW51SXRlbSBhZGQoaW50IGdyb3VwSWQsIGludCBpdGVtSWQsIGludCBvcmRlciwgaW50IHRpdGxlUmVzKSB7CisgICAgICAgIHJldHVybiBhZGQoZ3JvdXBJZCwgaXRlbUlkLCBvcmRlciwgbUNvbnRleHQuZ2V0UmVzb3VyY2VzKCkuZ2V0U3RyaW5nKHRpdGxlUmVzKSk7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBNZW51SXRlbSBhZGQoaW50IGdyb3VwSWQsIGludCBpdGVtSWQsIGludCBvcmRlciwgQ2hhclNlcXVlbmNlIHRpdGxlKSB7CisgICAgICAgIEFjdGlvbk1lbnVJdGVtIGl0ZW0gPSBuZXcgQWN0aW9uTWVudUl0ZW0oZ2V0Q29udGV4dCgpLAorICAgICAgICAgICAgICAgIGdyb3VwSWQsIGl0ZW1JZCwgMCwgb3JkZXIsIHRpdGxlKTsKKyAgICAgICAgbUl0ZW1zLmFkZChvcmRlciwgaXRlbSk7CisgICAgICAgIHJldHVybiBpdGVtOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgYWRkSW50ZW50T3B0aW9ucyhpbnQgZ3JvdXBJZCwgaW50IGl0ZW1JZCwgaW50IG9yZGVyLAorICAgICAgICAgICAgQ29tcG9uZW50TmFtZSBjYWxsZXIsIEludGVudFtdIHNwZWNpZmljcywgSW50ZW50IGludGVudCwgaW50IGZsYWdzLAorICAgICAgICAgICAgTWVudUl0ZW1bXSBvdXRTcGVjaWZpY0l0ZW1zKSB7CisgICAgICAgIFBhY2thZ2VNYW5hZ2VyIHBtID0gbUNvbnRleHQuZ2V0UGFja2FnZU1hbmFnZXIoKTsKKyAgICAgICAgZmluYWwgTGlzdDxSZXNvbHZlSW5mbz4gbHJpID0KKyAgICAgICAgICAgICAgICBwbS5xdWVyeUludGVudEFjdGl2aXR5T3B0aW9ucyhjYWxsZXIsIHNwZWNpZmljcywgaW50ZW50LCAwKTsKKyAgICAgICAgZmluYWwgaW50IE4gPSBscmkgIT0gbnVsbCA/IGxyaS5zaXplKCkgOiAwOworCisgICAgICAgIGlmICgoZmxhZ3MgJiBGTEFHX0FQUEVORF9UT19HUk9VUCkgPT0gMCkgeworICAgICAgICAgICAgcmVtb3ZlR3JvdXAoZ3JvdXBJZCk7CisgICAgICAgIH0KKworICAgICAgICBmb3IgKGludCBpPTA7IGk8TjsgaSsrKSB7CisgICAgICAgICAgICBmaW5hbCBSZXNvbHZlSW5mbyByaSA9IGxyaS5nZXQoaSk7CisgICAgICAgICAgICBJbnRlbnQgcmludGVudCA9IG5ldyBJbnRlbnQoCisgICAgICAgICAgICAgICAgcmkuc3BlY2lmaWNJbmRleCA8IDAgPyBpbnRlbnQgOiBzcGVjaWZpY3Nbcmkuc3BlY2lmaWNJbmRleF0pOworICAgICAgICAgICAgcmludGVudC5zZXRDb21wb25lbnQobmV3IENvbXBvbmVudE5hbWUoCisgICAgICAgICAgICAgICAgICAgIHJpLmFjdGl2aXR5SW5mby5hcHBsaWNhdGlvbkluZm8ucGFja2FnZU5hbWUsCisgICAgICAgICAgICAgICAgICAgIHJpLmFjdGl2aXR5SW5mby5uYW1lKSk7CisgICAgICAgICAgICBmaW5hbCBNZW51SXRlbSBpdGVtID0gYWRkKGdyb3VwSWQsIGl0ZW1JZCwgb3JkZXIsIHJpLmxvYWRMYWJlbChwbSkpCisgICAgICAgICAgICAgICAgICAgIC5zZXRJY29uKHJpLmxvYWRJY29uKHBtKSkKKyAgICAgICAgICAgICAgICAgICAgLnNldEludGVudChyaW50ZW50KTsKKyAgICAgICAgICAgIGlmIChvdXRTcGVjaWZpY0l0ZW1zICE9IG51bGwgJiYgcmkuc3BlY2lmaWNJbmRleCA+PSAwKSB7CisgICAgICAgICAgICAgICAgb3V0U3BlY2lmaWNJdGVtc1tyaS5zcGVjaWZpY0luZGV4XSA9IGl0ZW07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gTjsKKyAgICB9CisKKyAgICBwdWJsaWMgU3ViTWVudSBhZGRTdWJNZW51KENoYXJTZXF1ZW5jZSB0aXRsZSkgeworICAgICAgICAvLyBUT0RPIEltcGxlbWVudCBzdWJtZW51cworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBwdWJsaWMgU3ViTWVudSBhZGRTdWJNZW51KGludCB0aXRsZVJlcykgeworICAgICAgICAvLyBUT0RPIEltcGxlbWVudCBzdWJtZW51cworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBwdWJsaWMgU3ViTWVudSBhZGRTdWJNZW51KGludCBncm91cElkLCBpbnQgaXRlbUlkLCBpbnQgb3JkZXIsCisgICAgICAgICAgICBDaGFyU2VxdWVuY2UgdGl0bGUpIHsKKyAgICAgICAgLy8gVE9ETyBJbXBsZW1lbnQgc3VibWVudXMKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgcHVibGljIFN1Yk1lbnUgYWRkU3ViTWVudShpbnQgZ3JvdXBJZCwgaW50IGl0ZW1JZCwgaW50IG9yZGVyLCBpbnQgdGl0bGVSZXMpIHsKKyAgICAgICAgLy8gVE9ETyBJbXBsZW1lbnQgc3VibWVudXMKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgY2xlYXIoKSB7CisgICAgICAgIG1JdGVtcy5jbGVhcigpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGNsb3NlKCkgeworICAgIH0KKyAgICAKKyAgICBwcml2YXRlIGludCBmaW5kSXRlbUluZGV4KGludCBpZCkgeworICAgICAgICBmaW5hbCBBcnJheUxpc3Q8QWN0aW9uTWVudUl0ZW0+IGl0ZW1zID0gbUl0ZW1zOworICAgICAgICBmaW5hbCBpbnQgaXRlbUNvdW50ID0gaXRlbXMuc2l6ZSgpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGl0ZW1Db3VudDsgaSsrKSB7CisgICAgICAgICAgICBpZiAoaXRlbXMuZ2V0KGkpLmdldEl0ZW1JZCgpID09IGlkKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICBwdWJsaWMgTWVudUl0ZW0gZmluZEl0ZW0oaW50IGlkKSB7CisgICAgICAgIHJldHVybiBtSXRlbXMuZ2V0KGZpbmRJdGVtSW5kZXgoaWQpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgTWVudUl0ZW0gZ2V0SXRlbShpbnQgaW5kZXgpIHsKKyAgICAgICAgcmV0dXJuIG1JdGVtcy5nZXQoaW5kZXgpOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGhhc1Zpc2libGVJdGVtcygpIHsKKyAgICAgICAgZmluYWwgQXJyYXlMaXN0PEFjdGlvbk1lbnVJdGVtPiBpdGVtcyA9IG1JdGVtczsKKyAgICAgICAgZmluYWwgaW50IGl0ZW1Db3VudCA9IGl0ZW1zLnNpemUoKTsKKyAgICAgICAgCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaXRlbUNvdW50OyBpKyspIHsKKyAgICAgICAgICAgIGlmIChpdGVtcy5nZXQoaSkuaXNWaXNpYmxlKCkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICAKKyAgICBwcml2YXRlIEFjdGlvbk1lbnVJdGVtIGZpbmRJdGVtV2l0aFNob3J0Y3V0KGludCBrZXlDb2RlLCBLZXlFdmVudCBldmVudCkgeworICAgICAgICAvLyBUT0RPIE1ha2UgdGhpcyBzbWFydGVyLgorICAgICAgICBmaW5hbCBib29sZWFuIHF3ZXJ0eSA9IG1Jc1F3ZXJ0eTsKKyAgICAgICAgZmluYWwgQXJyYXlMaXN0PEFjdGlvbk1lbnVJdGVtPiBpdGVtcyA9IG1JdGVtczsKKyAgICAgICAgZmluYWwgaW50IGl0ZW1Db3VudCA9IGl0ZW1zLnNpemUoKTsKKyAgICAgICAgCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaXRlbUNvdW50OyBpKyspIHsKKyAgICAgICAgICAgIEFjdGlvbk1lbnVJdGVtIGl0ZW0gPSBpdGVtcy5nZXQoaSk7CisgICAgICAgICAgICBmaW5hbCBjaGFyIHNob3J0Y3V0ID0gcXdlcnR5ID8gaXRlbS5nZXRBbHBoYWJldGljU2hvcnRjdXQoKSA6CisgICAgICAgICAgICAgICAgICAgIGl0ZW0uZ2V0TnVtZXJpY1Nob3J0Y3V0KCk7CisgICAgICAgICAgICBpZiAoa2V5Q29kZSA9PSBzaG9ydGN1dCkgeworICAgICAgICAgICAgICAgIHJldHVybiBpdGVtOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGlzU2hvcnRjdXRLZXkoaW50IGtleUNvZGUsIEtleUV2ZW50IGV2ZW50KSB7CisgICAgICAgIHJldHVybiBmaW5kSXRlbVdpdGhTaG9ydGN1dChrZXlDb2RlLCBldmVudCkgIT0gbnVsbDsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBwZXJmb3JtSWRlbnRpZmllckFjdGlvbihpbnQgaWQsIGludCBmbGFncykgeworICAgICAgICBmaW5hbCBpbnQgaW5kZXggPSBmaW5kSXRlbUluZGV4KGlkKTsKKyAgICAgICAgaWYgKGluZGV4IDwgMCkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIG1JdGVtcy5nZXQoaW5kZXgpLmludm9rZSgpOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIHBlcmZvcm1TaG9ydGN1dChpbnQga2V5Q29kZSwgS2V5RXZlbnQgZXZlbnQsIGludCBmbGFncykgeworICAgICAgICBBY3Rpb25NZW51SXRlbSBpdGVtID0gZmluZEl0ZW1XaXRoU2hvcnRjdXQoa2V5Q29kZSwgZXZlbnQpOworICAgICAgICBpZiAoaXRlbSA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIHJldHVybiBpdGVtLmludm9rZSgpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHJlbW92ZUdyb3VwKGludCBncm91cElkKSB7CisgICAgICAgIGZpbmFsIEFycmF5TGlzdDxBY3Rpb25NZW51SXRlbT4gaXRlbXMgPSBtSXRlbXM7CisgICAgICAgIGludCBpdGVtQ291bnQgPSBpdGVtcy5zaXplKCk7CisgICAgICAgIGludCBpID0gMDsKKyAgICAgICAgd2hpbGUgKGkgPCBpdGVtQ291bnQpIHsKKyAgICAgICAgICAgIGlmIChpdGVtcy5nZXQoaSkuZ2V0R3JvdXBJZCgpID09IGdyb3VwSWQpIHsKKyAgICAgICAgICAgICAgICBpdGVtcy5yZW1vdmUoaSk7CisgICAgICAgICAgICAgICAgaXRlbUNvdW50LS07CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGkrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHJlbW92ZUl0ZW0oaW50IGlkKSB7CisgICAgICAgIG1JdGVtcy5yZW1vdmUoZmluZEl0ZW1JbmRleChpZCkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldEdyb3VwQ2hlY2thYmxlKGludCBncm91cCwgYm9vbGVhbiBjaGVja2FibGUsCisgICAgICAgICAgICBib29sZWFuIGV4Y2x1c2l2ZSkgeworICAgICAgICBmaW5hbCBBcnJheUxpc3Q8QWN0aW9uTWVudUl0ZW0+IGl0ZW1zID0gbUl0ZW1zOworICAgICAgICBmaW5hbCBpbnQgaXRlbUNvdW50ID0gaXRlbXMuc2l6ZSgpOworICAgICAgICAKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpdGVtQ291bnQ7IGkrKykgeworICAgICAgICAgICAgQWN0aW9uTWVudUl0ZW0gaXRlbSA9IGl0ZW1zLmdldChpKTsKKyAgICAgICAgICAgIGlmIChpdGVtLmdldEdyb3VwSWQoKSA9PSBncm91cCkgeworICAgICAgICAgICAgICAgIGl0ZW0uc2V0Q2hlY2thYmxlKGNoZWNrYWJsZSk7CisgICAgICAgICAgICAgICAgaXRlbS5zZXRFeGNsdXNpdmVDaGVja2FibGUoZXhjbHVzaXZlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldEdyb3VwRW5hYmxlZChpbnQgZ3JvdXAsIGJvb2xlYW4gZW5hYmxlZCkgeworICAgICAgICBmaW5hbCBBcnJheUxpc3Q8QWN0aW9uTWVudUl0ZW0+IGl0ZW1zID0gbUl0ZW1zOworICAgICAgICBmaW5hbCBpbnQgaXRlbUNvdW50ID0gaXRlbXMuc2l6ZSgpOworICAgICAgICAKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpdGVtQ291bnQ7IGkrKykgeworICAgICAgICAgICAgQWN0aW9uTWVudUl0ZW0gaXRlbSA9IGl0ZW1zLmdldChpKTsKKyAgICAgICAgICAgIGlmIChpdGVtLmdldEdyb3VwSWQoKSA9PSBncm91cCkgeworICAgICAgICAgICAgICAgIGl0ZW0uc2V0RW5hYmxlZChlbmFibGVkKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldEdyb3VwVmlzaWJsZShpbnQgZ3JvdXAsIGJvb2xlYW4gdmlzaWJsZSkgeworICAgICAgICBmaW5hbCBBcnJheUxpc3Q8QWN0aW9uTWVudUl0ZW0+IGl0ZW1zID0gbUl0ZW1zOworICAgICAgICBmaW5hbCBpbnQgaXRlbUNvdW50ID0gaXRlbXMuc2l6ZSgpOworICAgICAgICAKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpdGVtQ291bnQ7IGkrKykgeworICAgICAgICAgICAgQWN0aW9uTWVudUl0ZW0gaXRlbSA9IGl0ZW1zLmdldChpKTsKKyAgICAgICAgICAgIGlmIChpdGVtLmdldEdyb3VwSWQoKSA9PSBncm91cCkgeworICAgICAgICAgICAgICAgIGl0ZW0uc2V0VmlzaWJsZSh2aXNpYmxlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFF3ZXJ0eU1vZGUoYm9vbGVhbiBpc1F3ZXJ0eSkgeworICAgICAgICBtSXNRd2VydHkgPSBpc1F3ZXJ0eTsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IHNpemUoKSB7CisgICAgICAgIHJldHVybiBtSXRlbXMuc2l6ZSgpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC92aWV3L21lbnUvQWN0aW9uTWVudUl0ZW0uamF2YSBiL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC92aWV3L21lbnUvQWN0aW9uTWVudUl0ZW0uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMjg1MWE5Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3ZpZXcvbWVudS9BY3Rpb25NZW51SXRlbS5qYXZhCkBAIC0wLDAgKzEsMjM0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5pbnRlcm5hbC52aWV3Lm1lbnU7CisKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuRHJhd2FibGU7CitpbXBvcnQgYW5kcm9pZC52aWV3LkNvbnRleHRNZW51LkNvbnRleHRNZW51SW5mbzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuTWVudUl0ZW07CitpbXBvcnQgYW5kcm9pZC52aWV3LlN1Yk1lbnU7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CisKKy8qKgorICogQGhpZGUKKyAqLworcHVibGljIGNsYXNzIEFjdGlvbk1lbnVJdGVtIGltcGxlbWVudHMgTWVudUl0ZW0geworICAgIHByaXZhdGUgZmluYWwgaW50IG1JZDsKKyAgICBwcml2YXRlIGZpbmFsIGludCBtR3JvdXA7CisgICAgcHJpdmF0ZSBmaW5hbCBpbnQgbUNhdGVnb3J5T3JkZXI7CisgICAgcHJpdmF0ZSBmaW5hbCBpbnQgbU9yZGVyaW5nOworICAgIAorICAgIHByaXZhdGUgQ2hhclNlcXVlbmNlIG1UaXRsZTsKKyAgICBwcml2YXRlIENoYXJTZXF1ZW5jZSBtVGl0bGVDb25kZW5zZWQ7CisgICAgcHJpdmF0ZSBJbnRlbnQgbUludGVudDsKKyAgICBwcml2YXRlIGNoYXIgbVNob3J0Y3V0TnVtZXJpY0NoYXI7CisgICAgcHJpdmF0ZSBjaGFyIG1TaG9ydGN1dEFscGhhYmV0aWNDaGFyOworICAgIAorICAgIHByaXZhdGUgRHJhd2FibGUgbUljb25EcmF3YWJsZTsKKyAgICBwcml2YXRlIGludCBtSWNvblJlc0lkID0gTk9fSUNPTjsKKyAgICAKKyAgICBwcml2YXRlIENvbnRleHQgbUNvbnRleHQ7CisgICAgCisgICAgcHJpdmF0ZSBNZW51SXRlbS5Pbk1lbnVJdGVtQ2xpY2tMaXN0ZW5lciBtQ2xpY2tMaXN0ZW5lcjsKKyAgICAKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTk9fSUNPTiA9IDA7CisgICAgCisgICAgcHJpdmF0ZSBpbnQgbUZsYWdzID0gRU5BQkxFRDsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQ0hFQ0tBQkxFICAgICAgPSAweDAwMDAwMDAxOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDSEVDS0VEICAgICAgICA9IDB4MDAwMDAwMDI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEVYQ0xVU0lWRSAgICAgID0gMHgwMDAwMDAwNDsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgSElEREVOICAgICAgICAgPSAweDAwMDAwMDA4OworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBFTkFCTEVEICAgICAgICA9IDB4MDAwMDAwMTA7CisgICAgCisgICAgcHVibGljIEFjdGlvbk1lbnVJdGVtKENvbnRleHQgY29udGV4dCwgaW50IGdyb3VwLCBpbnQgaWQsIGludCBjYXRlZ29yeU9yZGVyLCBpbnQgb3JkZXJpbmcsCisgICAgICAgICAgICBDaGFyU2VxdWVuY2UgdGl0bGUpIHsKKyAgICAgICAgbUNvbnRleHQgPSBjb250ZXh0OworICAgICAgICBtSWQgPSBpZDsKKyAgICAgICAgbUdyb3VwID0gZ3JvdXA7CisgICAgICAgIG1DYXRlZ29yeU9yZGVyID0gY2F0ZWdvcnlPcmRlcjsKKyAgICAgICAgbU9yZGVyaW5nID0gb3JkZXJpbmc7CisgICAgICAgIG1UaXRsZSA9IHRpdGxlOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgY2hhciBnZXRBbHBoYWJldGljU2hvcnRjdXQoKSB7CisgICAgICAgIHJldHVybiBtU2hvcnRjdXRBbHBoYWJldGljQ2hhcjsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGdldEdyb3VwSWQoKSB7CisgICAgICAgIHJldHVybiBtR3JvdXA7CisgICAgfQorCisgICAgcHVibGljIERyYXdhYmxlIGdldEljb24oKSB7CisgICAgICAgIHJldHVybiBtSWNvbkRyYXdhYmxlOworICAgIH0KKworICAgIHB1YmxpYyBJbnRlbnQgZ2V0SW50ZW50KCkgeworICAgICAgICByZXR1cm4gbUludGVudDsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGdldEl0ZW1JZCgpIHsKKyAgICAgICAgcmV0dXJuIG1JZDsKKyAgICB9CisKKyAgICBwdWJsaWMgQ29udGV4dE1lbnVJbmZvIGdldE1lbnVJbmZvKCkgeworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBwdWJsaWMgY2hhciBnZXROdW1lcmljU2hvcnRjdXQoKSB7CisgICAgICAgIHJldHVybiBtU2hvcnRjdXROdW1lcmljQ2hhcjsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGdldE9yZGVyKCkgeworICAgICAgICByZXR1cm4gbU9yZGVyaW5nOworICAgIH0KKworICAgIHB1YmxpYyBTdWJNZW51IGdldFN1Yk1lbnUoKSB7CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIHB1YmxpYyBDaGFyU2VxdWVuY2UgZ2V0VGl0bGUoKSB7CisgICAgICAgIHJldHVybiBtVGl0bGU7CisgICAgfQorCisgICAgcHVibGljIENoYXJTZXF1ZW5jZSBnZXRUaXRsZUNvbmRlbnNlZCgpIHsKKyAgICAgICAgcmV0dXJuIG1UaXRsZUNvbmRlbnNlZDsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBoYXNTdWJNZW51KCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaXNDaGVja2FibGUoKSB7CisgICAgICAgIHJldHVybiAobUZsYWdzICYgQ0hFQ0tBQkxFKSAhPSAwOyAKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBpc0NoZWNrZWQoKSB7CisgICAgICAgIHJldHVybiAobUZsYWdzICYgQ0hFQ0tFRCkgIT0gMDsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBpc0VuYWJsZWQoKSB7CisgICAgICAgIHJldHVybiAobUZsYWdzICYgRU5BQkxFRCkgIT0gMDsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBpc1Zpc2libGUoKSB7CisgICAgICAgIHJldHVybiAobUZsYWdzICYgSElEREVOKSA9PSAwOworICAgIH0KKworICAgIHB1YmxpYyBNZW51SXRlbSBzZXRBbHBoYWJldGljU2hvcnRjdXQoY2hhciBhbHBoYUNoYXIpIHsKKyAgICAgICAgbVNob3J0Y3V0QWxwaGFiZXRpY0NoYXIgPSBhbHBoYUNoYXI7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIHB1YmxpYyBNZW51SXRlbSBzZXRDaGVja2FibGUoYm9vbGVhbiBjaGVja2FibGUpIHsKKyAgICAgICAgbUZsYWdzID0gKG1GbGFncyAmIH5DSEVDS0FCTEUpIHwgKGNoZWNrYWJsZSA/IENIRUNLQUJMRSA6IDApOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisgICAgCisgICAgcHVibGljIEFjdGlvbk1lbnVJdGVtIHNldEV4Y2x1c2l2ZUNoZWNrYWJsZShib29sZWFuIGV4Y2x1c2l2ZSkgeworICAgICAgICBtRmxhZ3MgPSAobUZsYWdzICYgfkVYQ0xVU0lWRSkgfCAoZXhjbHVzaXZlID8gRVhDTFVTSVZFIDogMCk7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIHB1YmxpYyBNZW51SXRlbSBzZXRDaGVja2VkKGJvb2xlYW4gY2hlY2tlZCkgeworICAgICAgICBtRmxhZ3MgPSAobUZsYWdzICYgfkNIRUNLRUQpIHwgKGNoZWNrZWQgPyBDSEVDS0VEIDogMCk7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIHB1YmxpYyBNZW51SXRlbSBzZXRFbmFibGVkKGJvb2xlYW4gZW5hYmxlZCkgeworICAgICAgICBtRmxhZ3MgPSAobUZsYWdzICYgfkVOQUJMRUQpIHwgKGVuYWJsZWQgPyBFTkFCTEVEIDogMCk7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIHB1YmxpYyBNZW51SXRlbSBzZXRJY29uKERyYXdhYmxlIGljb24pIHsKKyAgICAgICAgbUljb25EcmF3YWJsZSA9IGljb247CisgICAgICAgIG1JY29uUmVzSWQgPSBOT19JQ09OOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBwdWJsaWMgTWVudUl0ZW0gc2V0SWNvbihpbnQgaWNvblJlcykgeworICAgICAgICBtSWNvblJlc0lkID0gaWNvblJlczsKKyAgICAgICAgbUljb25EcmF3YWJsZSA9IG1Db250ZXh0LmdldFJlc291cmNlcygpLmdldERyYXdhYmxlKGljb25SZXMpOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBwdWJsaWMgTWVudUl0ZW0gc2V0SW50ZW50KEludGVudCBpbnRlbnQpIHsKKyAgICAgICAgbUludGVudCA9IGludGVudDsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgcHVibGljIE1lbnVJdGVtIHNldE51bWVyaWNTaG9ydGN1dChjaGFyIG51bWVyaWNDaGFyKSB7CisgICAgICAgIG1TaG9ydGN1dE51bWVyaWNDaGFyID0gbnVtZXJpY0NoYXI7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIHB1YmxpYyBNZW51SXRlbSBzZXRPbk1lbnVJdGVtQ2xpY2tMaXN0ZW5lcihPbk1lbnVJdGVtQ2xpY2tMaXN0ZW5lciBtZW51SXRlbUNsaWNrTGlzdGVuZXIpIHsKKyAgICAgICAgbUNsaWNrTGlzdGVuZXIgPSBtZW51SXRlbUNsaWNrTGlzdGVuZXI7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIHB1YmxpYyBNZW51SXRlbSBzZXRTaG9ydGN1dChjaGFyIG51bWVyaWNDaGFyLCBjaGFyIGFscGhhQ2hhcikgeworICAgICAgICBtU2hvcnRjdXROdW1lcmljQ2hhciA9IG51bWVyaWNDaGFyOworICAgICAgICBtU2hvcnRjdXRBbHBoYWJldGljQ2hhciA9IGFscGhhQ2hhcjsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgcHVibGljIE1lbnVJdGVtIHNldFRpdGxlKENoYXJTZXF1ZW5jZSB0aXRsZSkgeworICAgICAgICBtVGl0bGUgPSB0aXRsZTsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgcHVibGljIE1lbnVJdGVtIHNldFRpdGxlKGludCB0aXRsZSkgeworICAgICAgICBtVGl0bGUgPSBtQ29udGV4dC5nZXRSZXNvdXJjZXMoKS5nZXRTdHJpbmcodGl0bGUpOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBwdWJsaWMgTWVudUl0ZW0gc2V0VGl0bGVDb25kZW5zZWQoQ2hhclNlcXVlbmNlIHRpdGxlKSB7CisgICAgICAgIG1UaXRsZUNvbmRlbnNlZCA9IHRpdGxlOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBwdWJsaWMgTWVudUl0ZW0gc2V0VmlzaWJsZShib29sZWFuIHZpc2libGUpIHsKKyAgICAgICAgbUZsYWdzID0gKG1GbGFncyAmIEhJRERFTikgfCAodmlzaWJsZSA/IDAgOiBISURERU4pOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBpbnZva2UoKSB7CisgICAgICAgIGlmIChtQ2xpY2tMaXN0ZW5lciAhPSBudWxsICYmIG1DbGlja0xpc3RlbmVyLm9uTWVudUl0ZW1DbGljayh0aGlzKSkgeworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIGlmIChtSW50ZW50ICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1Db250ZXh0LnN0YXJ0QWN0aXZpdHkobUludGVudCk7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgdm9pZCBzZXRTaG93QXNBY3Rpb24oaW50IHNob3cpIHsKKyAgICAgICAgLy8gRG8gbm90aGluZy4gQWN0aW9uTWVudUl0ZW1zIGFsd2F5cyBzaG93IGFzIGFjdGlvbiBidXR0b25zLgorICAgIH0KKworICAgIHB1YmxpYyBNZW51SXRlbSBzZXRBY3Rpb25WaWV3KFZpZXcgYWN0aW9uVmlldykgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBwdWJsaWMgVmlldyBnZXRBY3Rpb25WaWV3KCkgeworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdmlldy9tZW51L0FjdGlvbk1lbnVJdGVtVmlldy5qYXZhIGIvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3ZpZXcvbWVudS9BY3Rpb25NZW51SXRlbVZpZXcuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZjA0MzhjCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3ZpZXcvbWVudS9BY3Rpb25NZW51SXRlbVZpZXcuamF2YQpAQCAtMCwwICsxLDEzNiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQuaW50ZXJuYWwudmlldy5tZW51OworCitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZTsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0OworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkJ1dHRvbjsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5GcmFtZUxheW91dDsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5JbWFnZUJ1dHRvbjsKKworLyoqCisgKiBAaGlkZQorICovCitwdWJsaWMgY2xhc3MgQWN0aW9uTWVudUl0ZW1WaWV3IGV4dGVuZHMgRnJhbWVMYXlvdXQKKyAgICAgICAgaW1wbGVtZW50cyBNZW51Vmlldy5JdGVtVmlldywgVmlldy5PbkNsaWNrTGlzdGVuZXIgeworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiQWN0aW9uTWVudUl0ZW1WaWV3IjsKKworICAgIHByaXZhdGUgTWVudUl0ZW1JbXBsIG1JdGVtRGF0YTsKKyAgICBwcml2YXRlIENoYXJTZXF1ZW5jZSBtVGl0bGU7CisgICAgcHJpdmF0ZSBNZW51QnVpbGRlci5JdGVtSW52b2tlciBtSXRlbUludm9rZXI7CisKKyAgICBwcml2YXRlIEltYWdlQnV0dG9uIG1JbWFnZUJ1dHRvbjsKKyAgICBwcml2YXRlIEJ1dHRvbiBtVGV4dEJ1dHRvbjsKKworICAgIHB1YmxpYyBBY3Rpb25NZW51SXRlbVZpZXcoQ29udGV4dCBjb250ZXh0KSB7CisgICAgICAgIHRoaXMoY29udGV4dCwgbnVsbCk7CisgICAgfQorCisgICAgcHVibGljIEFjdGlvbk1lbnVJdGVtVmlldyhDb250ZXh0IGNvbnRleHQsIEF0dHJpYnV0ZVNldCBhdHRycykgeworICAgICAgICB0aGlzKGNvbnRleHQsIGF0dHJzLCBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmF0dHIuYWN0aW9uQnV0dG9uU3R5bGUpOworICAgIH0KKworICAgIHB1YmxpYyBBY3Rpb25NZW51SXRlbVZpZXcoQ29udGV4dCBjb250ZXh0LCBBdHRyaWJ1dGVTZXQgYXR0cnMsIGludCBkZWZTdHlsZSkgeworICAgICAgICBzdXBlcihjb250ZXh0LCBhdHRycywgZGVmU3R5bGUpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9uRmluaXNoSW5mbGF0ZSgpIHsKKyAgICAgICAgbUltYWdlQnV0dG9uID0gKEltYWdlQnV0dG9uKSBmaW5kVmlld0J5SWQoY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5pZC5pbWFnZUJ1dHRvbik7CisgICAgICAgIG1UZXh0QnV0dG9uID0gKEJ1dHRvbikgZmluZFZpZXdCeUlkKGNvbS5hbmRyb2lkLmludGVybmFsLlIuaWQudGV4dEJ1dHRvbik7CisgICAgICAgIG1JbWFnZUJ1dHRvbi5zZXRPbkNsaWNrTGlzdGVuZXIodGhpcyk7CisgICAgICAgIG1UZXh0QnV0dG9uLnNldE9uQ2xpY2tMaXN0ZW5lcih0aGlzKTsKKyAgICB9CisKKyAgICBwdWJsaWMgTWVudUl0ZW1JbXBsIGdldEl0ZW1EYXRhKCkgeworICAgICAgICByZXR1cm4gbUl0ZW1EYXRhOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGluaXRpYWxpemUoTWVudUl0ZW1JbXBsIGl0ZW1EYXRhLCBpbnQgbWVudVR5cGUpIHsKKyAgICAgICAgbUl0ZW1EYXRhID0gaXRlbURhdGE7CisKKyAgICAgICAgc2V0Q2xpY2thYmxlKHRydWUpOworICAgICAgICBzZXRGb2N1c2FibGUodHJ1ZSk7CisgICAgICAgIHNldEljb24oaXRlbURhdGEuZ2V0SWNvbigpKTsKKyAgICAgICAgc2V0VGl0bGUoaXRlbURhdGEuZ2V0VGl0bGUoKSk7IC8vIFRpdGxlIG9ubHkgdGFrZXMgZWZmZWN0IGlmIHRoZXJlIGlzIG5vIGljb24KKyAgICAgICAgc2V0SWQoaXRlbURhdGEuZ2V0SXRlbUlkKCkpOworCisgICAgICAgIHNldFZpc2liaWxpdHkoaXRlbURhdGEuaXNWaXNpYmxlKCkgPyBWaWV3LlZJU0lCTEUgOiBWaWV3LkdPTkUpOworICAgICAgICBzZXRFbmFibGVkKGl0ZW1EYXRhLmlzRW5hYmxlZCgpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBzZXRFbmFibGVkKGJvb2xlYW4gZW5hYmxlZCkgeworICAgICAgICBzdXBlci5zZXRFbmFibGVkKGVuYWJsZWQpOworICAgICAgICBtSW1hZ2VCdXR0b24uc2V0RW5hYmxlZChlbmFibGVkKTsKKyAgICAgICAgbVRleHRCdXR0b24uc2V0RW5hYmxlZChlbmFibGVkKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBvbkNsaWNrKFZpZXcgdikgeworICAgICAgICBpZiAobUl0ZW1JbnZva2VyICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1JdGVtSW52b2tlci5pbnZva2VJdGVtKG1JdGVtRGF0YSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRJdGVtSW52b2tlcihNZW51QnVpbGRlci5JdGVtSW52b2tlciBpbnZva2VyKSB7CisgICAgICAgIG1JdGVtSW52b2tlciA9IGludm9rZXI7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gcHJlZmVyc0NvbmRlbnNlZFRpdGxlKCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0Q2hlY2thYmxlKGJvb2xlYW4gY2hlY2thYmxlKSB7CisgICAgICAgIC8vIFRPRE8gU3VwcG9ydCBjaGVja2FibGUgYWN0aW9uIGl0ZW1zCisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0Q2hlY2tlZChib29sZWFuIGNoZWNrZWQpIHsKKyAgICAgICAgLy8gVE9ETyBTdXBwb3J0IGNoZWNrYWJsZSBhY3Rpb24gaXRlbXMKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRJY29uKERyYXdhYmxlIGljb24pIHsKKyAgICAgICAgbUltYWdlQnV0dG9uLnNldEltYWdlRHJhd2FibGUoaWNvbik7CisgICAgICAgIGlmIChpY29uICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1JbWFnZUJ1dHRvbi5zZXRWaXNpYmlsaXR5KFZJU0lCTEUpOworICAgICAgICAgICAgbVRleHRCdXR0b24uc2V0VmlzaWJpbGl0eShHT05FKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1JbWFnZUJ1dHRvbi5zZXRWaXNpYmlsaXR5KEdPTkUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0U2hvcnRjdXQoYm9vbGVhbiBzaG93U2hvcnRjdXQsIGNoYXIgc2hvcnRjdXRLZXkpIHsKKyAgICAgICAgLy8gQWN0aW9uIGJ1dHRvbnMgZG9uJ3Qgc2hvdyB0ZXh0IGZvciBzaG9ydGN1dCBrZXlzLgorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFRpdGxlKENoYXJTZXF1ZW5jZSB0aXRsZSkgeworICAgICAgICBtVGl0bGUgPSB0aXRsZTsKKworICAgICAgICAvLyBwb3B1bGF0ZSBhY2Nlc3NpYmlsaXR5IGRlc2NyaXB0aW9uIHdpdGggdGl0bGUKKyAgICAgICAgc2V0Q29udGVudERlc2NyaXB0aW9uKHRpdGxlKTsKKworICAgICAgICBpZiAobUltYWdlQnV0dG9uLmdldERyYXdhYmxlKCkgPT0gbnVsbCkgeworICAgICAgICAgICAgbVRleHRCdXR0b24uc2V0VGV4dChtVGl0bGUpOworICAgICAgICAgICAgbVRleHRCdXR0b24uc2V0VmlzaWJpbGl0eShWSVNJQkxFKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIHNob3dzSWNvbigpIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3ZpZXcvbWVudS9BY3Rpb25NZW51Vmlldy5qYXZhIGIvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3ZpZXcvbWVudS9BY3Rpb25NZW51Vmlldy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIwOTM5YWIKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdmlldy9tZW51L0FjdGlvbk1lbnVWaWV3LmphdmEKQEAgLTAsMCArMSwyNDIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBjb20uYW5kcm9pZC5pbnRlcm5hbC52aWV3Lm1lbnU7CisKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLkNvbmZpZ3VyYXRpb247CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5SZXNvdXJjZXM7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5UeXBlZEFycmF5OworaW1wb3J0IGFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQ7CitpbXBvcnQgYW5kcm9pZC52aWV3LkdyYXZpdHk7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXdHcm91cDsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5JbWFnZUJ1dHRvbjsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5MaW5lYXJMYXlvdXQ7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworCisvKioKKyAqIEBoaWRlCisgKi8KK3B1YmxpYyBjbGFzcyBBY3Rpb25NZW51VmlldyBleHRlbmRzIExpbmVhckxheW91dCBpbXBsZW1lbnRzIE1lbnVCdWlsZGVyLkl0ZW1JbnZva2VyLCBNZW51VmlldyB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJBY3Rpb25NZW51VmlldyI7CisgICAgCisgICAgcHJpdmF0ZSBNZW51QnVpbGRlciBtTWVudTsKKworICAgIHByaXZhdGUgaW50IG1JdGVtUGFkZGluZzsKKyAgICBwcml2YXRlIGludCBtSXRlbU1hcmdpbjsKKyAgICBwcml2YXRlIGludCBtTWF4SXRlbXM7CisgICAgcHJpdmF0ZSBib29sZWFuIG1SZXNlcnZlT3ZlcmZsb3c7CisgICAgcHJpdmF0ZSBPdmVyZmxvd01lbnVCdXR0b24gbU92ZXJmbG93QnV0dG9uOworICAgIHByaXZhdGUgTWVudVBvcHVwSGVscGVyIG1PdmVyZmxvd1BvcHVwOworCisgICAgcHJpdmF0ZSBSdW5uYWJsZSBtU2hvd092ZXJmbG93ID0gbmV3IFJ1bm5hYmxlKCkgeworICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICBzaG93T3ZlcmZsb3dNZW51KCk7CisgICAgICAgIH0KKyAgICB9OworICAgIAorICAgIHB1YmxpYyBBY3Rpb25NZW51VmlldyhDb250ZXh0IGNvbnRleHQpIHsKKyAgICAgICAgdGhpcyhjb250ZXh0LCBudWxsKTsKKyAgICB9CisgICAgCisgICAgcHVibGljIEFjdGlvbk1lbnVWaWV3KENvbnRleHQgY29udGV4dCwgQXR0cmlidXRlU2V0IGF0dHJzKSB7CisgICAgICAgIHN1cGVyKGNvbnRleHQsIGF0dHJzKTsKKyAgICAgICAgCisgICAgICAgIFR5cGVkQXJyYXkgYSA9IGNvbnRleHQub2J0YWluU3R5bGVkQXR0cmlidXRlcyhhdHRycywKKyAgICAgICAgICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZS5UaGVtZSk7CisgICAgICAgIG1JdGVtUGFkZGluZyA9IGEuZ2V0RGltZW5zaW9uUGl4ZWxPZmZzZXQoCisgICAgICAgICAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZWFibGUuVGhlbWVfYWN0aW9uQnV0dG9uUGFkZGluZywgMCk7CisgICAgICAgIG1JdGVtTWFyZ2luID0gbUl0ZW1QYWRkaW5nIC8gMjsKKyAgICAgICAgYS5yZWN5Y2xlKCk7CisKKyAgICAgICAgLy8gTWVhc3VyZSBmb3IgaW5pdGlhbCBjb25maWd1cmF0aW9uCisgICAgICAgIG1NYXhJdGVtcyA9IG1lYXN1cmVNYXhBY3Rpb25CdXR0b25zKCk7CisKKyAgICAgICAgLy8gVE9ETyBUaGVyZSBoYXMgdG8gYmUgYSBiZXR0ZXIgd2F5IHRvIGluZGljYXRlIHRoYXQgd2UgZG9uJ3QgaGF2ZSBhIGhhcmQgbWVudSBrZXkuCisgICAgICAgIGZpbmFsIGludCBzY3JlZW4gPSBnZXRSZXNvdXJjZXMoKS5nZXRDb25maWd1cmF0aW9uKCkuc2NyZWVuTGF5b3V0OworICAgICAgICBtUmVzZXJ2ZU92ZXJmbG93ID0gKHNjcmVlbiAmIENvbmZpZ3VyYXRpb24uU0NSRUVOTEFZT1VUX1NJWkVfTUFTSykgPT0KKyAgICAgICAgICAgICAgICBDb25maWd1cmF0aW9uLlNDUkVFTkxBWU9VVF9TSVpFX1hMQVJHRTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvbkNvbmZpZ3VyYXRpb25DaGFuZ2VkKENvbmZpZ3VyYXRpb24gbmV3Q29uZmlnKSB7CisgICAgICAgIGZpbmFsIGludCBzY3JlZW4gPSBuZXdDb25maWcuc2NyZWVuTGF5b3V0OworICAgICAgICBtUmVzZXJ2ZU92ZXJmbG93ID0gKHNjcmVlbiAmIENvbmZpZ3VyYXRpb24uU0NSRUVOTEFZT1VUX1NJWkVfTUFTSykgPT0KKyAgICAgICAgICAgICAgICBDb25maWd1cmF0aW9uLlNDUkVFTkxBWU9VVF9TSVpFX1hMQVJHRTsKKyAgICAgICAgbU1heEl0ZW1zID0gbWVhc3VyZU1heEFjdGlvbkJ1dHRvbnMoKTsKKyAgICAgICAgaWYgKG1NZW51ICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1NZW51LnNldE1heEFjdGlvbkl0ZW1zKG1NYXhJdGVtcyk7CisgICAgICAgICAgICB1cGRhdGVDaGlsZHJlbihmYWxzZSk7CisgICAgICAgIH0KKworICAgICAgICBpZiAobU92ZXJmbG93UG9wdXAgIT0gbnVsbCAmJiBtT3ZlcmZsb3dQb3B1cC5pc1Nob3dpbmcoKSkgeworICAgICAgICAgICAgbU92ZXJmbG93UG9wdXAuZGlzbWlzcygpOworICAgICAgICAgICAgcG9zdChtU2hvd092ZXJmbG93KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgaW50IG1lYXN1cmVNYXhBY3Rpb25CdXR0b25zKCkgeworICAgICAgICBmaW5hbCBSZXNvdXJjZXMgcmVzID0gZ2V0UmVzb3VyY2VzKCk7CisgICAgICAgIGZpbmFsIGludCBzaXplID0gcmVzLmdldERpbWVuc2lvblBpeGVsU2l6ZShjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmRpbWVuLmFjdGlvbl9pY29uX3NpemUpOworICAgICAgICBmaW5hbCBpbnQgc3BhY2VBdmFpbGFibGUgPSByZXMuZ2V0RGlzcGxheU1ldHJpY3MoKS53aWR0aFBpeGVscyAvIDI7CisgICAgICAgIGZpbmFsIGludCBpdGVtU3BhY2UgPSBzaXplICsgbUl0ZW1QYWRkaW5nOworICAgICAgICAKKyAgICAgICAgcmV0dXJuIHNwYWNlQXZhaWxhYmxlIC8gKGl0ZW1TcGFjZSA+IDAgPyBpdGVtU3BhY2UgOiAxKTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBpc092ZXJmbG93UmVzZXJ2ZWQoKSB7CisgICAgICAgIHJldHVybiBtUmVzZXJ2ZU92ZXJmbG93OworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgdm9pZCBzZXRPdmVyZmxvd1Jlc2VydmVkKGJvb2xlYW4gcmVzZXJ2ZU92ZXJmbG93KSB7CisgICAgICAgIG1SZXNlcnZlT3ZlcmZsb3cgPSByZXNlcnZlT3ZlcmZsb3c7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gY2hlY2tMYXlvdXRQYXJhbXMoVmlld0dyb3VwLkxheW91dFBhcmFtcyBwKSB7CisgICAgICAgIGlmIChwIGluc3RhbmNlb2YgTGF5b3V0UGFyYW1zKSB7CisgICAgICAgICAgICBMYXlvdXRQYXJhbXMgbHAgPSAoTGF5b3V0UGFyYW1zKSBwOworICAgICAgICAgICAgcmV0dXJuIGxwLmxlZnRNYXJnaW4gPT0gbUl0ZW1NYXJnaW4gJiYgbHAucmlnaHRNYXJnaW4gPT0gbUl0ZW1NYXJnaW4gJiYKKyAgICAgICAgICAgICAgICAgICAgbHAuZ3Jhdml0eSA9PSBHcmF2aXR5LkNFTlRFUl9WRVJUSUNBTCAmJgorICAgICAgICAgICAgICAgICAgICBscC53aWR0aCA9PSBMYXlvdXRQYXJhbXMuV1JBUF9DT05URU5UICYmIGxwLmhlaWdodCA9PSBMYXlvdXRQYXJhbXMuV1JBUF9DT05URU5UOworICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIExheW91dFBhcmFtcyBnZW5lcmF0ZURlZmF1bHRMYXlvdXRQYXJhbXMoKSB7CisgICAgICAgIExheW91dFBhcmFtcyBwYXJhbXMgPSBuZXcgTGF5b3V0UGFyYW1zKExheW91dFBhcmFtcy5XUkFQX0NPTlRFTlQsCisgICAgICAgICAgICAgICAgTGF5b3V0UGFyYW1zLldSQVBfQ09OVEVOVCk7CisgICAgICAgIHBhcmFtcy5sZWZ0TWFyZ2luID0gbUl0ZW1NYXJnaW47CisgICAgICAgIHBhcmFtcy5yaWdodE1hcmdpbiA9IG1JdGVtTWFyZ2luOworICAgICAgICBwYXJhbXMuZ3Jhdml0eSA9IEdyYXZpdHkuQ0VOVEVSX1ZFUlRJQ0FMOworICAgICAgICByZXR1cm4gcGFyYW1zOworICAgIH0KKyAgICAKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgTGF5b3V0UGFyYW1zIGdlbmVyYXRlTGF5b3V0UGFyYW1zKFZpZXdHcm91cC5MYXlvdXRQYXJhbXMgcCkgeworICAgICAgICByZXR1cm4gZ2VuZXJhdGVEZWZhdWx0TGF5b3V0UGFyYW1zKCk7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBpbnQgZ2V0SXRlbU1hcmdpbigpIHsKKyAgICAgICAgcmV0dXJuIG1JdGVtTWFyZ2luOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGludm9rZUl0ZW0oTWVudUl0ZW1JbXBsIGl0ZW0pIHsKKyAgICAgICAgcmV0dXJuIG1NZW51LnBlcmZvcm1JdGVtQWN0aW9uKGl0ZW0sIDApOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgZ2V0V2luZG93QW5pbWF0aW9ucygpIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgaW5pdGlhbGl6ZShNZW51QnVpbGRlciBtZW51LCBpbnQgbWVudVR5cGUpIHsKKyAgICAgICAgbWVudS5zZXRNYXhBY3Rpb25JdGVtcyhtTWF4SXRlbXMpOworICAgICAgICBtTWVudSA9IG1lbnU7CisgICAgICAgIHVwZGF0ZUNoaWxkcmVuKHRydWUpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHVwZGF0ZUNoaWxkcmVuKGJvb2xlYW4gY2xlYXJlZCkgeworICAgICAgICBmaW5hbCBib29sZWFuIHJlc2VydmVPdmVyZmxvdyA9IG1SZXNlcnZlT3ZlcmZsb3c7CisgICAgICAgIHJlbW92ZUFsbFZpZXdzKCk7CisgICAgICAgIAorICAgICAgICBmaW5hbCBBcnJheUxpc3Q8TWVudUl0ZW1JbXBsPiBpdGVtc1RvU2hvdyA9IG1NZW51LmdldEFjdGlvbkl0ZW1zKHJlc2VydmVPdmVyZmxvdyk7CisgICAgICAgIGZpbmFsIGludCBpdGVtQ291bnQgPSBpdGVtc1RvU2hvdy5zaXplKCk7CisgICAgICAgIAorICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGl0ZW1Db3VudDsgaSsrKSB7CisgICAgICAgICAgICBmaW5hbCBNZW51SXRlbUltcGwgaXRlbURhdGEgPSBpdGVtc1RvU2hvdy5nZXQoaSk7CisgICAgICAgICAgICBmaW5hbCBWaWV3IGFjdGlvblZpZXcgPSBpdGVtRGF0YS5nZXRBY3Rpb25WaWV3KCk7CisgICAgICAgICAgICBpZiAoYWN0aW9uVmlldyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgYWRkVmlldyhhY3Rpb25WaWV3KTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgYWRkSXRlbVZpZXcoKEFjdGlvbk1lbnVJdGVtVmlldykgaXRlbURhdGEuZ2V0SXRlbVZpZXcoCisgICAgICAgICAgICAgICAgICAgICAgICBNZW51QnVpbGRlci5UWVBFX0FDVElPTl9CVVRUT04sIHRoaXMpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChyZXNlcnZlT3ZlcmZsb3cpIHsKKyAgICAgICAgICAgIGlmIChtTWVudS5nZXROb25BY3Rpb25JdGVtcyh0cnVlKS5zaXplKCkgPiAwKSB7CisgICAgICAgICAgICAgICAgT3ZlcmZsb3dNZW51QnV0dG9uIGJ1dHRvbiA9IG5ldyBPdmVyZmxvd01lbnVCdXR0b24obUNvbnRleHQpOworICAgICAgICAgICAgICAgIGFkZFZpZXcoYnV0dG9uKTsKKyAgICAgICAgICAgICAgICBtT3ZlcmZsb3dCdXR0b24gPSBidXR0b247CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG1PdmVyZmxvd0J1dHRvbiA9IG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBzaG93T3ZlcmZsb3dNZW51KCkgeworICAgICAgICBpZiAobU92ZXJmbG93QnV0dG9uICE9IG51bGwpIHsKKyAgICAgICAgICAgIGZpbmFsIE1lbnVQb3B1cEhlbHBlciBwb3B1cCA9CisgICAgICAgICAgICAgICAgICAgIG5ldyBNZW51UG9wdXBIZWxwZXIoZ2V0Q29udGV4dCgpLCBtTWVudSwgbU92ZXJmbG93QnV0dG9uLCB0cnVlKTsKKyAgICAgICAgICAgIC8vIFBvc3QgdGhpcyBmb3IgbGF0ZXI7IHdlIG1pZ2h0IHN0aWxsIG5lZWQgYSBsYXlvdXQgZm9yIHRoZSBhbmNob3IgdG8gYmUgcmlnaHQuCisgICAgICAgICAgICBwb3N0KG5ldyBSdW5uYWJsZSgpIHsKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgICAgIHBvcHVwLnNob3coKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgIG1PdmVyZmxvd1BvcHVwID0gcG9wdXA7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaXNPdmVyZmxvd01lbnVTaG93aW5nKCkgeworICAgICAgICBNZW51UG9wdXBIZWxwZXIgcG9wdXAgPSBtT3ZlcmZsb3dQb3B1cDsKKyAgICAgICAgaWYgKHBvcHVwICE9IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBwb3B1cC5pc1Nob3dpbmcoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaGlkZU92ZXJmbG93TWVudSgpIHsKKyAgICAgICAgTWVudVBvcHVwSGVscGVyIHBvcHVwID0gbU92ZXJmbG93UG9wdXA7CisgICAgICAgIGlmIChwb3B1cCAhPSBudWxsKSB7CisgICAgICAgICAgICBwb3B1cC5kaXNtaXNzKCk7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGFkZEl0ZW1WaWV3KEFjdGlvbk1lbnVJdGVtVmlldyB2aWV3KSB7CisgICAgICAgIHZpZXcuc2V0SXRlbUludm9rZXIodGhpcyk7CisgICAgICAgIGFkZFZpZXcodmlldyk7CisgICAgfQorCisgICAgcHJpdmF0ZSBjbGFzcyBPdmVyZmxvd01lbnVCdXR0b24gZXh0ZW5kcyBJbWFnZUJ1dHRvbiB7CisgICAgICAgIHB1YmxpYyBPdmVyZmxvd01lbnVCdXR0b24oQ29udGV4dCBjb250ZXh0KSB7CisgICAgICAgICAgICBzdXBlcihjb250ZXh0LCBudWxsLCBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmF0dHIuYWN0aW9uT3ZlcmZsb3dCdXR0b25TdHlsZSk7CisKKyAgICAgICAgICAgIGZpbmFsIFJlc291cmNlcyByZXMgPSBjb250ZXh0LmdldFJlc291cmNlcygpOworICAgICAgICAgICAgc2V0Q2xpY2thYmxlKHRydWUpOworICAgICAgICAgICAgc2V0Rm9jdXNhYmxlKHRydWUpOworICAgICAgICAgICAgc2V0VmlzaWJpbGl0eShWSVNJQkxFKTsKKyAgICAgICAgICAgIHNldEVuYWJsZWQodHJ1ZSk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gcGVyZm9ybUNsaWNrKCkgeworICAgICAgICAgICAgaWYgKHN1cGVyLnBlcmZvcm1DbGljaygpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIENoYW5nZSB0byBvdmVyZmxvdyBtb2RlCisgICAgICAgICAgICBtTWVudS5nZXRDYWxsYmFjaygpLm9uTWVudU1vZGVDaGFuZ2UobU1lbnUpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdmlldy9tZW51L0ljb25NZW51Vmlldy5qYXZhIGIvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3ZpZXcvbWVudS9JY29uTWVudVZpZXcuamF2YQppbmRleCBiZWI1N2JhLi4xNzhkY2RlIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdmlldy9tZW51L0ljb25NZW51Vmlldy5qYXZhCisrKyBiL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC92aWV3L21lbnUvSWNvbk1lbnVWaWV3LmphdmEKQEAgLTMzNyw3ICszMzcsOSBAQAogICAgICAgICAvLyBUaGlzIG1ldGhvZCBkb2VzIGEgY2xlYXIgcmVmcmVzaCBvZiBjaGlsZHJlbgogICAgICAgICByZW1vdmVBbGxWaWV3cygpOwogICAgICAgICAKLSAgICAgICAgZmluYWwgQXJyYXlMaXN0PE1lbnVJdGVtSW1wbD4gaXRlbXNUb1Nob3cgPSBtTWVudS5nZXRWaXNpYmxlSXRlbXMoKTsKKyAgICAgICAgLy8gSWNvbk1lbnVWaWV3IG5ldmVyIHdhbnRzIGNvbnRlbnQgc29ydGVkIGZvciBhbiBvdmVyZmxvdyBhY3Rpb24gYnV0dG9uLCBzaW5jZQorICAgICAgICAvLyBpdCBpcyBuZXZlciB1c2VkIGluIHRoZSBwcmVzZW5jZSBvZiBhbiBvdmVyZmxvdyBidXR0b24uCisgICAgICAgIGZpbmFsIEFycmF5TGlzdDxNZW51SXRlbUltcGw+IGl0ZW1zVG9TaG93ID0gbU1lbnUuZ2V0Tm9uQWN0aW9uSXRlbXMoZmFsc2UpOwogICAgICAgICBmaW5hbCBpbnQgbnVtSXRlbXMgPSBpdGVtc1RvU2hvdy5zaXplKCk7CiAgICAgICAgIGZpbmFsIGludCBudW1JdGVtc1RoYXRDYW5GaXQgPSBtTWF4SXRlbXM7CiAgICAgICAgIC8vIE1pbmltdW0gb2YgdGhlIG51bSB0aGF0IGNhbiBmaXQgYW5kIHRoZSBudW0gdGhhdCB3ZSBoYXZlCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdmlldy9tZW51L01lbnVCdWlsZGVyLmphdmEgYi9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdmlldy9tZW51L01lbnVCdWlsZGVyLmphdmEKaW5kZXggMjI4ZDVkMC4uODMxMWM4MCAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3ZpZXcvbWVudS9NZW51QnVpbGRlci5qYXZhCisrKyBiL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC92aWV3L21lbnUvTWVudUJ1aWxkZXIuamF2YQpAQCAtMjcsMTYgKzI3LDE3IEBACiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZTsKIGltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKIGltcG9ydCBhbmRyb2lkLm9zLlBhcmNlbGFibGU7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKIGltcG9ydCBhbmRyb2lkLnV0aWwuU3BhcnNlQXJyYXk7CiBpbXBvcnQgYW5kcm9pZC52aWV3LkNvbnRleHRUaGVtZVdyYXBwZXI7CiBpbXBvcnQgYW5kcm9pZC52aWV3LktleUNoYXJhY3Rlck1hcDsKIGltcG9ydCBhbmRyb2lkLnZpZXcuS2V5RXZlbnQ7CitpbXBvcnQgYW5kcm9pZC52aWV3LkxheW91dEluZmxhdGVyOwogaW1wb3J0IGFuZHJvaWQudmlldy5NZW51OwogaW1wb3J0IGFuZHJvaWQudmlldy5NZW51SXRlbTsKIGltcG9ydCBhbmRyb2lkLnZpZXcuU3ViTWVudTsKIGltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKIGltcG9ydCBhbmRyb2lkLnZpZXcuVmlld0dyb3VwOwotaW1wb3J0IGFuZHJvaWQudmlldy5MYXlvdXRJbmZsYXRlcjsKIGltcG9ydCBhbmRyb2lkLnZpZXcuQ29udGV4dE1lbnUuQ29udGV4dE1lbnVJbmZvOwogaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkFkYXB0ZXJWaWV3OwogaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkJhc2VBZGFwdGVyOwpAQCAtNTQsNyArNTUsNyBAQAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMT0dUQUcgPSAiTWVudUJ1aWxkZXIiOwogICAgIAogICAgIC8qKiBUaGUgbnVtYmVyIG9mIGRpZmZlcmVudCBtZW51IHR5cGVzICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTlVNX1RZUEVTID0gMzsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBOVU1fVFlQRVMgPSA1OwogICAgIC8qKiBUaGUgbWVudSB0eXBlIHRoYXQgcmVwcmVzZW50cyB0aGUgaWNvbiBtZW51IHZpZXcgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUWVBFX0lDT04gPSAwOwogICAgIC8qKiBUaGUgbWVudSB0eXBlIHRoYXQgcmVwcmVzZW50cyB0aGUgZXhwYW5kZWQgbWVudSB2aWV3ICovCkBAIC02NSwxNCArNjYsMjcgQEAKICAgICAgKiBoYXZlIGFuIEl0ZW1WaWV3LgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRZUEVfRElBTE9HID0gMjsKKyAgICAvKioKKyAgICAgKiBUaGUgbWVudSB0eXBlIHRoYXQgcmVwcmVzZW50cyBhIGJ1dHRvbiBpbiB0aGUgYXBwbGljYXRpb24ncyBhY3Rpb24gYmFyLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRZUEVfQUNUSU9OX0JVVFRPTiA9IDM7CisgICAgLyoqCisgICAgICogVGhlIG1lbnUgdHlwZSB0aGF0IHJlcHJlc2VudHMgYSBtZW51IHBvcHVwLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRZUEVfUE9QVVAgPSA0OwogCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFZJRVdTX1RBRyA9ICJhbmRyb2lkOnZpZXdzIjsKLSAgICAKKwogICAgIC8vIE9yZGVyIG11c3QgYmUgdGhlIHNhbWUgb3JkZXIgYXMgdGhlIFRZUEVfKgorICAgIC8vIFNwZWNpYWwgdmFsdWVzOgorICAgIC8vIDA6IFVzZSB0aGUgc3lzdGVtIGRlZmF1bHQgdGhlbWUKKyAgICAvLyAtMTogVXNlIHRoZSBhcHAncyBvd24gdGhlbWUKICAgICBzdGF0aWMgZmluYWwgaW50IFRIRU1FX1JFU19GT1JfVFlQRVtdID0gbmV3IGludFtdIHsKICAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZS5UaGVtZV9JY29uTWVudSwKICAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZS5UaGVtZV9FeHBhbmRlZE1lbnUsCiAgICAgICAgIDAsCisgICAgICAgIC0xLAorICAgICAgICAtMSwKICAgICB9OwogICAgIAogICAgIC8vIE9yZGVyIG11c3QgYmUgdGhlIHNhbWUgb3JkZXIgYXMgdGhlIFRZUEVfKgpAQCAtODAsNiArOTQsOCBAQAogICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmxheW91dC5pY29uX21lbnVfbGF5b3V0LAogICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmxheW91dC5leHBhbmRlZF9tZW51X2xheW91dCwKICAgICAgICAgMCwKKyAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5sYXlvdXQuYWN0aW9uX21lbnVfbGF5b3V0LAorICAgICAgICAwLAogICAgIH07CiAKICAgICAvLyBPcmRlciBtdXN0IGJlIHRoZSBzYW1lIG9yZGVyIGFzIHRoZSBUWVBFXyoKQEAgLTg3LDYgKzEwMyw4IEBACiAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIubGF5b3V0Lmljb25fbWVudV9pdGVtX2xheW91dCwKICAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5sYXlvdXQubGlzdF9tZW51X2l0ZW1fbGF5b3V0LAogICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmxheW91dC5saXN0X21lbnVfaXRlbV9sYXlvdXQsCisgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIubGF5b3V0LmFjdGlvbl9tZW51X2l0ZW1fbGF5b3V0LAorICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmxheW91dC5wb3B1cF9tZW51X2l0ZW1fbGF5b3V0LAogICAgIH07CiAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnRbXSAgc0NhdGVnb3J5VG9PcmRlciA9IG5ldyBpbnRbXSB7CkBAIC0xMzAsNiArMTQ4LDM1IEBACiAgICAgICogZmV0Y2hlZCBmcm9tIHtAbGluayAjZ2V0VmlzaWJsZUl0ZW1zKCl9CiAgICAgICovIAogICAgIHByaXZhdGUgYm9vbGVhbiBtSXNWaXNpYmxlSXRlbXNTdGFsZTsKKyAgICAKKyAgICAvKioKKyAgICAgKiBDb250YWlucyBvbmx5IHRoZSBpdGVtcyB0aGF0IHNob3VsZCBhcHBlYXIgaW4gdGhlIEFjdGlvbiBCYXIsIGlmIHByZXNlbnQuCisgICAgICovCisgICAgcHJpdmF0ZSBBcnJheUxpc3Q8TWVudUl0ZW1JbXBsPiBtQWN0aW9uSXRlbXM7CisgICAgLyoqCisgICAgICogQ29udGFpbnMgaXRlbXMgdGhhdCBzaG91bGQgTk9UIGFwcGVhciBpbiB0aGUgQWN0aW9uIEJhciwgaWYgcHJlc2VudC4KKyAgICAgKi8KKyAgICBwcml2YXRlIEFycmF5TGlzdDxNZW51SXRlbUltcGw+IG1Ob25BY3Rpb25JdGVtczsKKyAgICAvKioKKyAgICAgKiBUaGUgbnVtYmVyIG9mIHZpc2libGUgYWN0aW9uIGJ1dHRvbnMgcGVybWl0dGVkIGluIHRoaXMgbWVudQorICAgICAqLworICAgIHByaXZhdGUgaW50IG1NYXhBY3Rpb25JdGVtczsKKyAgICAvKioKKyAgICAgKiBXaGV0aGVyIG9yIG5vdCB0aGUgaXRlbXMgKG9yIGFueSBvbmUgaXRlbSdzIGFjdGlvbiBzdGF0ZSkgaGFzIGNoYW5nZWQgc2luY2UgaXQgd2FzCisgICAgICogbGFzdCBmZXRjaGVkLgorICAgICAqLworICAgIHByaXZhdGUgYm9vbGVhbiBtSXNBY3Rpb25JdGVtc1N0YWxlOworCisgICAgLyoqCisgICAgICogV2hldGhlciB0aGUgcHJvY2VzcyBvZiBncmFudGluZyBzcGFjZSBhcyBhY3Rpb24gaXRlbXMgc2hvdWxkIHJlc2VydmUgYSBzcGFjZSBmb3IKKyAgICAgKiBhbiBvdmVyZmxvdyBvcHRpb24gaW4gdGhlIGFjdGlvbiBsaXN0LgorICAgICAqLworICAgIHByaXZhdGUgYm9vbGVhbiBtUmVzZXJ2ZUFjdGlvbk92ZXJmbG93OworCisgICAgLyoqCisgICAgICogRGVmYXVsdCB2YWx1ZSBmb3IgaG93IGFkZGVkIGl0ZW1zIHNob3VsZCBzaG93IGluIHRoZSBhY3Rpb24gbGlzdC4KKyAgICAgKi8KKyAgICBwcml2YXRlIGludCBtRGVmYXVsdFNob3dBc0FjdGlvbiA9IE1lbnVJdGVtLlNIT1dfQVNfQUNUSU9OX05FVkVSOwogCiAgICAgLyoqCiAgICAgICogQ3VycmVudCB1c2UgY2FzZSBpcyBDb250ZXh0IE1lbnVzOiBBcyBWaWV3cyBwb3B1bGF0ZSB0aGUgY29udGV4dCBtZW51LCBlYWNoIG9uZSBoYXMKQEAgLTE3Niw4ICsyMjMsOSBAQAogICAgICAgICBMYXlvdXRJbmZsYXRlciBnZXRJbmZsYXRlcigpIHsKICAgICAgICAgICAgIC8vIENyZWF0ZSBhbiBpbmZsYXRlciB0aGF0IHVzZXMgdGhlIGdpdmVuIHRoZW1lIGZvciB0aGUgVmlld3MgaXQgaW5mbGF0ZXMKICAgICAgICAgICAgIGlmIChtSW5mbGF0ZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIENvbnRleHQgd3JhcHBlZENvbnRleHQgPSBuZXcgQ29udGV4dFRoZW1lV3JhcHBlcihtQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgIFRIRU1FX1JFU19GT1JfVFlQRVttTWVudVR5cGVdKTsgCisgICAgICAgICAgICAgICAgaW50IHRoZW1lUmVzRm9yVHlwZSA9IFRIRU1FX1JFU19GT1JfVFlQRVttTWVudVR5cGVdOworICAgICAgICAgICAgICAgIENvbnRleHQgd3JhcHBlZENvbnRleHQgPSB0aGVtZVJlc0ZvclR5cGUgPCAwID8gbUNvbnRleHQgOgorICAgICAgICAgICAgICAgICAgICAgICAgbmV3IENvbnRleHRUaGVtZVdyYXBwZXIobUNvbnRleHQsIHRoZW1lUmVzRm9yVHlwZSk7CiAgICAgICAgICAgICAgICAgbUluZmxhdGVyID0gKExheW91dEluZmxhdGVyKSB3cmFwcGVkQ29udGV4dAogICAgICAgICAgICAgICAgICAgICAgICAgLmdldFN5c3RlbVNlcnZpY2UoQ29udGV4dC5MQVlPVVRfSU5GTEFURVJfU0VSVklDRSk7CiAgICAgICAgICAgICB9CkBAIC0yODEsMTAgKzMyOSwxOSBAQAogICAgICAgICBtVmlzaWJsZUl0ZW1zID0gbmV3IEFycmF5TGlzdDxNZW51SXRlbUltcGw+KCk7CiAgICAgICAgIG1Jc1Zpc2libGVJdGVtc1N0YWxlID0gdHJ1ZTsKICAgICAgICAgCisgICAgICAgIG1BY3Rpb25JdGVtcyA9IG5ldyBBcnJheUxpc3Q8TWVudUl0ZW1JbXBsPigpOworICAgICAgICBtTm9uQWN0aW9uSXRlbXMgPSBuZXcgQXJyYXlMaXN0PE1lbnVJdGVtSW1wbD4oKTsKKyAgICAgICAgbUlzQWN0aW9uSXRlbXNTdGFsZSA9IHRydWU7CisgICAgICAgIAogICAgICAgICBtU2hvcnRjdXRzVmlzaWJsZSA9CiAgICAgICAgICAgICAgICAgKG1SZXNvdXJjZXMuZ2V0Q29uZmlndXJhdGlvbigpLmtleWJvYXJkICE9IENvbmZpZ3VyYXRpb24uS0VZQk9BUkRfTk9LRVlTKTsKICAgICB9CiAgICAgCisgICAgcHVibGljIE1lbnVCdWlsZGVyIHNldERlZmF1bHRTaG93QXNBY3Rpb24oaW50IGRlZmF1bHRTaG93QXNBY3Rpb24pIHsKKyAgICAgICAgbURlZmF1bHRTaG93QXNBY3Rpb24gPSBkZWZhdWx0U2hvd0FzQWN0aW9uOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisgICAgCiAgICAgcHVibGljIHZvaWQgc2V0Q2FsbGJhY2soQ2FsbGJhY2sgY2FsbGJhY2spIHsKICAgICAgICAgbUNhbGxiYWNrID0gY2FsbGJhY2s7CiAgICAgfQpAQCAtMzY4LDcgKzQyNSw4IEBACiAgICAgcHJpdmF0ZSBNZW51SXRlbSBhZGRJbnRlcm5hbChpbnQgZ3JvdXAsIGludCBpZCwgaW50IGNhdGVnb3J5T3JkZXIsIENoYXJTZXF1ZW5jZSB0aXRsZSkgewogICAgICAgICBmaW5hbCBpbnQgb3JkZXJpbmcgPSBnZXRPcmRlcmluZyhjYXRlZ29yeU9yZGVyKTsKICAgICAgICAgCi0gICAgICAgIGZpbmFsIE1lbnVJdGVtSW1wbCBpdGVtID0gbmV3IE1lbnVJdGVtSW1wbCh0aGlzLCBncm91cCwgaWQsIGNhdGVnb3J5T3JkZXIsIG9yZGVyaW5nLCB0aXRsZSk7CisgICAgICAgIGZpbmFsIE1lbnVJdGVtSW1wbCBpdGVtID0gbmV3IE1lbnVJdGVtSW1wbCh0aGlzLCBncm91cCwgaWQsIGNhdGVnb3J5T3JkZXIsCisgICAgICAgICAgICAgICAgb3JkZXJpbmcsIHRpdGxlLCBtRGVmYXVsdFNob3dBc0FjdGlvbik7CiAKICAgICAgICAgaWYgKG1DdXJyZW50TWVudUluZm8gIT0gbnVsbCkgewogICAgICAgICAgICAgLy8gUGFzcyBhbG9uZyB0aGUgY3VycmVudCBtZW51IGluZm8KQEAgLTYzMyw2ICs2OTEsMTEgQEAKICAgICAgICAgcmV0dXJuIG1JdGVtcy5nZXQoaW5kZXgpOwogICAgIH0KIAorICAgIHB1YmxpYyBNZW51SXRlbSBnZXRPdmVyZmxvd0l0ZW0oaW50IGluZGV4KSB7CisgICAgICAgIGZsYWdBY3Rpb25JdGVtcyh0cnVlKTsKKyAgICAgICAgcmV0dXJuIG1Ob25BY3Rpb25JdGVtcy5nZXQoaW5kZXgpOworICAgIH0KKwogICAgIHB1YmxpYyBib29sZWFuIGlzU2hvcnRjdXRLZXkoaW50IGtleUNvZGUsIEtleUV2ZW50IGV2ZW50KSB7CiAgICAgICAgIHJldHVybiBmaW5kSXRlbVdpdGhTaG9ydGN1dEZvcktleShrZXlDb2RlLCBldmVudCkgIT0gbnVsbDsKICAgICB9CkBAIC05MDAsNiArOTYzLDcgQEAKICAgICBwcml2YXRlIHZvaWQgb25JdGVtc0NoYW5nZWQoYm9vbGVhbiBjbGVhcmVkKSB7CiAgICAgICAgIGlmICghbVByZXZlbnREaXNwYXRjaGluZ0l0ZW1zQ2hhbmdlZCkgewogICAgICAgICAgICAgaWYgKG1Jc1Zpc2libGVJdGVtc1N0YWxlID09IGZhbHNlKSBtSXNWaXNpYmxlSXRlbXNTdGFsZSA9IHRydWU7CisgICAgICAgICAgICBpZiAobUlzQWN0aW9uSXRlbXNTdGFsZSA9PSBmYWxzZSkgbUlzQWN0aW9uSXRlbXNTdGFsZSA9IHRydWU7CiAgICAgICAgICAgICAKICAgICAgICAgICAgIE1lbnVUeXBlW10gbWVudVR5cGVzID0gbU1lbnVUeXBlczsKICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTlVNX1RZUEVTOyBpKyspIHsKQEAgLTkyMCw2ICs5ODQsMTUgQEAKICAgICAgICAgb25JdGVtc0NoYW5nZWQoZmFsc2UpOwogICAgIH0KICAgICAKKyAgICAvKioKKyAgICAgKiBDYWxsZWQgYnkge0BsaW5rIE1lbnVJdGVtSW1wbH0gd2hlbiBpdHMgYWN0aW9uIHJlcXVlc3Qgc3RhdHVzIGlzIGNoYW5nZWQuCisgICAgICogQHBhcmFtIGl0ZW0gVGhlIGl0ZW0gdGhhdCBoYXMgZ29uZSB0aHJvdWdoIGEgY2hhbmdlIGluIGFjdGlvbiByZXF1ZXN0IHN0YXR1cy4KKyAgICAgKi8KKyAgICB2b2lkIG9uSXRlbUFjdGlvblJlcXVlc3RDaGFuZ2VkKE1lbnVJdGVtSW1wbCBpdGVtKSB7CisgICAgICAgIC8vIE5vdGlmeSBvZiBpdGVtcyBiZWluZyBjaGFuZ2VkCisgICAgICAgIG9uSXRlbXNDaGFuZ2VkKGZhbHNlKTsKKyAgICB9CisgICAgCiAgICAgQXJyYXlMaXN0PE1lbnVJdGVtSW1wbD4gZ2V0VmlzaWJsZUl0ZW1zKCkgewogICAgICAgICBpZiAoIW1Jc1Zpc2libGVJdGVtc1N0YWxlKSByZXR1cm4gbVZpc2libGVJdGVtczsKICAgICAgICAgCkBAIC05MzQsOSArMTAwNyw4MyBAQAogICAgICAgICB9CiAgICAgICAgIAogICAgICAgICBtSXNWaXNpYmxlSXRlbXNTdGFsZSA9IGZhbHNlOworICAgICAgICBtSXNBY3Rpb25JdGVtc1N0YWxlID0gdHJ1ZTsKICAgICAgICAgCiAgICAgICAgIHJldHVybiBtVmlzaWJsZUl0ZW1zOwogICAgIH0KKyAgICAKKyAgICBwcml2YXRlIHZvaWQgZmxhZ0FjdGlvbkl0ZW1zKGJvb2xlYW4gcmVzZXJ2ZUFjdGlvbk92ZXJmbG93KSB7CisgICAgICAgIGlmIChyZXNlcnZlQWN0aW9uT3ZlcmZsb3cgIT0gbVJlc2VydmVBY3Rpb25PdmVyZmxvdykgeworICAgICAgICAgICAgbVJlc2VydmVBY3Rpb25PdmVyZmxvdyA9IHJlc2VydmVBY3Rpb25PdmVyZmxvdzsKKyAgICAgICAgICAgIG1Jc0FjdGlvbkl0ZW1zU3RhbGUgPSB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCFtSXNBY3Rpb25JdGVtc1N0YWxlKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBmaW5hbCBBcnJheUxpc3Q8TWVudUl0ZW1JbXBsPiB2aXNpYmxlSXRlbXMgPSBnZXRWaXNpYmxlSXRlbXMoKTsKKyAgICAgICAgZmluYWwgaW50IGl0ZW1zU2l6ZSA9IHZpc2libGVJdGVtcy5zaXplKCk7CisgICAgICAgIGludCBtYXhBY3Rpb25zID0gbU1heEFjdGlvbkl0ZW1zOworCisgICAgICAgIGludCByZXF1aXJlZEl0ZW1zID0gMDsKKyAgICAgICAgaW50IHJlcXVlc3RlZEl0ZW1zID0gMDsKKyAgICAgICAgYm9vbGVhbiBoYXNPdmVyZmxvdyA9IGZhbHNlOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGl0ZW1zU2l6ZTsgaSsrKSB7CisgICAgICAgICAgICBNZW51SXRlbUltcGwgaXRlbSA9IHZpc2libGVJdGVtcy5nZXQoaSk7CisgICAgICAgICAgICBpZiAoaXRlbS5yZXF1aXJlc0FjdGlvbkJ1dHRvbigpKSB7CisgICAgICAgICAgICAgICAgcmVxdWlyZWRJdGVtcysrOworICAgICAgICAgICAgfSBlbHNlIGlmIChpdGVtLnJlcXVlc3RzQWN0aW9uQnV0dG9uKCkpIHsKKyAgICAgICAgICAgICAgICByZXF1ZXN0ZWRJdGVtcysrOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBoYXNPdmVyZmxvdyA9IHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBSZXNlcnZlIGEgc3BvdCBmb3IgdGhlIG92ZXJmbG93IGl0ZW0gaWYgbmVlZGVkLgorICAgICAgICBpZiAocmVzZXJ2ZUFjdGlvbk92ZXJmbG93ICYmCisgICAgICAgICAgICAgICAgKGhhc092ZXJmbG93IHx8IHJlcXVpcmVkSXRlbXMgKyByZXF1ZXN0ZWRJdGVtcyA+IG1heEFjdGlvbnMpKSB7CisgICAgICAgICAgICBtYXhBY3Rpb25zLS07CisgICAgICAgIH0KKyAgICAgICAgbWF4QWN0aW9ucyAtPSByZXF1aXJlZEl0ZW1zOworCisgICAgICAgIC8vIEZsYWcgYXMgbWFueSBtb3JlIHJlcXVlc3RlZCBpdGVtcyBhcyB3aWxsIGZpdC4KKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpdGVtc1NpemU7IGkrKykgeworICAgICAgICAgICAgTWVudUl0ZW1JbXBsIGl0ZW0gPSB2aXNpYmxlSXRlbXMuZ2V0KGkpOworICAgICAgICAgICAgaWYgKGl0ZW0ucmVxdWVzdHNBY3Rpb25CdXR0b24oKSkgeworICAgICAgICAgICAgICAgIGl0ZW0uc2V0SXNBY3Rpb25CdXR0b24obWF4QWN0aW9ucyA+IDApOworICAgICAgICAgICAgICAgIG1heEFjdGlvbnMtLTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIG1BY3Rpb25JdGVtcy5jbGVhcigpOworICAgICAgICBtTm9uQWN0aW9uSXRlbXMuY2xlYXIoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpdGVtc1NpemU7IGkrKykgeworICAgICAgICAgICAgTWVudUl0ZW1JbXBsIGl0ZW0gPSB2aXNpYmxlSXRlbXMuZ2V0KGkpOworICAgICAgICAgICAgaWYgKGl0ZW0uaXNBY3Rpb25CdXR0b24oKSkgeworICAgICAgICAgICAgICAgIG1BY3Rpb25JdGVtcy5hZGQoaXRlbSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG1Ob25BY3Rpb25JdGVtcy5hZGQoaXRlbSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBtSXNBY3Rpb25JdGVtc1N0YWxlID0gZmFsc2U7CisgICAgfQorICAgIAorICAgIEFycmF5TGlzdDxNZW51SXRlbUltcGw+IGdldEFjdGlvbkl0ZW1zKGJvb2xlYW4gcmVzZXJ2ZUFjdGlvbk92ZXJmbG93KSB7CisgICAgICAgIGZsYWdBY3Rpb25JdGVtcyhyZXNlcnZlQWN0aW9uT3ZlcmZsb3cpOworICAgICAgICByZXR1cm4gbUFjdGlvbkl0ZW1zOworICAgIH0KKyAgICAKKyAgICBBcnJheUxpc3Q8TWVudUl0ZW1JbXBsPiBnZXROb25BY3Rpb25JdGVtcyhib29sZWFuIHJlc2VydmVBY3Rpb25PdmVyZmxvdykgeworICAgICAgICBmbGFnQWN0aW9uSXRlbXMocmVzZXJ2ZUFjdGlvbk92ZXJmbG93KTsKKyAgICAgICAgcmV0dXJuIG1Ob25BY3Rpb25JdGVtczsKKyAgICB9CisgICAgCisgICAgdm9pZCBzZXRNYXhBY3Rpb25JdGVtcyhpbnQgbWF4QWN0aW9uSXRlbXMpIHsKKyAgICAgICAgbU1heEFjdGlvbkl0ZW1zID0gbWF4QWN0aW9uSXRlbXM7CisgICAgICAgIG1Jc0FjdGlvbkl0ZW1zU3RhbGUgPSB0cnVlOworICAgIH0KIAogICAgIHB1YmxpYyB2b2lkIGNsZWFySGVhZGVyKCkgewogICAgICAgICBtSGVhZGVySWNvbiA9IG51bGw7CkBAIC0xMDc4LDYgKzEyMjUsMTYgQEAKICAgICAgICAgcmV0dXJuIG5ldyBNZW51QWRhcHRlcihtZW51VHlwZSk7CiAgICAgfQogCisgICAgLyoqCisgICAgICogR2V0cyBhbiBhZGFwdGVyIGZvciBwcm92aWRpbmcgb3ZlcmZsb3cgKG5vbi1hY3Rpb24pIGl0ZW1zIGFuZCB0aGVpciB2aWV3cy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBtZW51VHlwZSBUaGUgdHlwZSBvZiBtZW51IHRvIGdldCBhbiBhZGFwdGVyIGZvci4KKyAgICAgKiBAcmV0dXJuIEEge0BsaW5rIE1lbnVBZGFwdGVyfSBmb3IgdGhpcyBtZW51IHdpdGggdGhlIGdpdmVuIG1lbnUgdHlwZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgTWVudUFkYXB0ZXIgZ2V0T3ZlcmZsb3dNZW51QWRhcHRlcihpbnQgbWVudVR5cGUpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBPdmVyZmxvd01lbnVBZGFwdGVyKG1lbnVUeXBlKTsKKyAgICB9CisKICAgICB2b2lkIHNldE9wdGlvbmFsSWNvbnNWaXNpYmxlKGJvb2xlYW4gdmlzaWJsZSkgewogICAgICAgICBtT3B0aW9uYWxJY29uc1Zpc2libGUgPSB2aXNpYmxlOwogICAgIH0KQEAgLTExNTUsOCArMTMxMiw0MiBAQAogICAgICAgICB9CiAKICAgICAgICAgcHVibGljIFZpZXcgZ2V0VmlldyhpbnQgcG9zaXRpb24sIFZpZXcgY29udmVydFZpZXcsIFZpZXdHcm91cCBwYXJlbnQpIHsKLSAgICAgICAgICAgIHJldHVybiAoKE1lbnVJdGVtSW1wbCkgZ2V0SXRlbShwb3NpdGlvbikpLmdldEl0ZW1WaWV3KG1NZW51VHlwZSwgcGFyZW50KTsKKyAgICAgICAgICAgIGlmIChjb252ZXJ0VmlldyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgTWVudVZpZXcuSXRlbVZpZXcgaXRlbVZpZXcgPSAoTWVudVZpZXcuSXRlbVZpZXcpIGNvbnZlcnRWaWV3OworICAgICAgICAgICAgICAgIGl0ZW1WaWV3LmdldEl0ZW1EYXRhKCkuc2V0SXRlbVZpZXcobU1lbnVUeXBlLCBudWxsKTsKKworICAgICAgICAgICAgICAgIE1lbnVJdGVtSW1wbCBpdGVtID0gKE1lbnVJdGVtSW1wbCkgZ2V0SXRlbShwb3NpdGlvbik7CisgICAgICAgICAgICAgICAgaXRlbVZpZXcuaW5pdGlhbGl6ZShpdGVtLCBtTWVudVR5cGUpOworICAgICAgICAgICAgICAgIGl0ZW0uc2V0SXRlbVZpZXcobU1lbnVUeXBlLCBpdGVtVmlldyk7CisgICAgICAgICAgICAgICAgcmV0dXJuIGNvbnZlcnRWaWV3OworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBNZW51SXRlbUltcGwgaXRlbSA9IChNZW51SXRlbUltcGwpIGdldEl0ZW0ocG9zaXRpb24pOworICAgICAgICAgICAgICAgIGl0ZW0uc2V0SXRlbVZpZXcobU1lbnVUeXBlLCBudWxsKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gaXRlbS5nZXRJdGVtVmlldyhtTWVudVR5cGUsIHBhcmVudCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBbiBhZGFwdGVyIHRoYXQgYWxsb3dzIGFuIHtAbGluayBBZGFwdGVyVmlld30gdG8gdXNlIHRoaXMge0BsaW5rIE1lbnVCdWlsZGVyfSBhcyBhIGRhdGEKKyAgICAgKiBzb3VyY2UgZm9yIG92ZXJmbG93IG1lbnUgaXRlbXMgdGhhdCBkbyBub3QgZml0IGluIHRoZSBsaXN0IG9mIGFjdGlvbiBpdGVtcy4KKyAgICAgKi8KKyAgICBwcml2YXRlIGNsYXNzIE92ZXJmbG93TWVudUFkYXB0ZXIgZXh0ZW5kcyBNZW51QWRhcHRlciB7CisgICAgICAgIHByaXZhdGUgQXJyYXlMaXN0PE1lbnVJdGVtSW1wbD4gbU92ZXJmbG93SXRlbXM7CisKKyAgICAgICAgcHVibGljIE92ZXJmbG93TWVudUFkYXB0ZXIoaW50IG1lbnVUeXBlKSB7CisgICAgICAgICAgICBzdXBlcihtZW51VHlwZSk7CisgICAgICAgICAgICBtT3ZlcmZsb3dJdGVtcyA9IGdldE5vbkFjdGlvbkl0ZW1zKHRydWUpOwogICAgICAgICB9CiAKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBNZW51SXRlbUltcGwgZ2V0SXRlbShpbnQgcG9zaXRpb24pIHsKKyAgICAgICAgICAgIHJldHVybiBtT3ZlcmZsb3dJdGVtcy5nZXQocG9zaXRpb24pOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBpbnQgZ2V0Q291bnQoKSB7CisgICAgICAgICAgICByZXR1cm4gbU92ZXJmbG93SXRlbXMuc2l6ZSgpOworICAgICAgICB9CiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3ZpZXcvbWVudS9NZW51SXRlbUltcGwuamF2YSBiL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC92aWV3L21lbnUvTWVudUl0ZW1JbXBsLmphdmEKaW5kZXggOWI1ODIwNS4uNDJmOTc3MSAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3ZpZXcvbWVudS9NZW51SXRlbUltcGwuamF2YQorKysgYi9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdmlldy9tZW51L01lbnVJdGVtSW1wbC5qYXZhCkBAIC03NCw2ICs3NCwxMSBAQAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBFWENMVVNJVkUgICAgICA9IDB4MDAwMDAwMDQ7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEhJRERFTiAgICAgICAgID0gMHgwMDAwMDAwODsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRU5BQkxFRCAgICAgICAgPSAweDAwMDAwMDEwOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBJU19BQ1RJT04gICAgICA9IDB4MDAwMDAwMjA7CisKKyAgICBwcml2YXRlIGludCBtU2hvd0FzQWN0aW9uID0gU0hPV19BU19BQ1RJT05fTkVWRVI7CisKKyAgICBwcml2YXRlIFZpZXcgbUFjdGlvblZpZXc7CiAKICAgICAvKiogVXNlZCBmb3IgdGhlIGljb24gcmVzb3VyY2UgSUQgaWYgdGhpcyBpdGVtIGRvZXMgbm90IGhhdmUgYW4gaWNvbiAqLwogICAgIHN0YXRpYyBmaW5hbCBpbnQgTk9fSUNPTiA9IDA7CkBAIC0xMDUsNyArMTEwLDcgQEAKICAgICAgKiBAcGFyYW0gdGl0bGUgVGhlIHRleHQgdG8gZGlzcGxheSBmb3IgdGhlIGl0ZW0uCiAgICAgICovCiAgICAgTWVudUl0ZW1JbXBsKE1lbnVCdWlsZGVyIG1lbnUsIGludCBncm91cCwgaW50IGlkLCBpbnQgY2F0ZWdvcnlPcmRlciwgaW50IG9yZGVyaW5nLAotICAgICAgICAgICAgQ2hhclNlcXVlbmNlIHRpdGxlKSB7CisgICAgICAgICAgICBDaGFyU2VxdWVuY2UgdGl0bGUsIGludCBzaG93QXNBY3Rpb24pIHsKIAogICAgICAgICBpZiAoc1ByZXBlbmRTaG9ydGN1dExhYmVsID09IG51bGwpIHsKICAgICAgICAgICAgIC8vIFRoaXMgaXMgaW5zdGFudGlhdGVkIGZyb20gdGhlIFVJIHRocmVhZCwgc28gbm8gY2hhbmNlIG9mIHN5bmMgaXNzdWVzIApAQCAtMTI2LDYgKzEzMSw3IEBACiAgICAgICAgIG1DYXRlZ29yeU9yZGVyID0gY2F0ZWdvcnlPcmRlcjsKICAgICAgICAgbU9yZGVyaW5nID0gb3JkZXJpbmc7CiAgICAgICAgIG1UaXRsZSA9IHRpdGxlOworICAgICAgICBtU2hvd0FzQWN0aW9uID0gc2hvd0FzQWN0aW9uOwogICAgIH0KICAgICAKICAgICAvKioKQEAgLTU4MCw2ICs1ODYsMTAgQEAKICAgICAgICAgcmV0dXJuIChWaWV3KSBtSXRlbVZpZXdzW21lbnVUeXBlXS5nZXQoKTsKICAgICB9CiAKKyAgICB2b2lkIHNldEl0ZW1WaWV3KGludCBtZW51VHlwZSwgSXRlbVZpZXcgdmlldykgeworICAgICAgICBtSXRlbVZpZXdzW21lbnVUeXBlXSA9IG5ldyBXZWFrUmVmZXJlbmNlPEl0ZW1WaWV3Pih2aWV3KTsKKyAgICB9CisKICAgICAvKioKICAgICAgKiBDcmVhdGUgYW5kIGluaXRpYWxpemVzIGEgbWVudSBpdGVtIHZpZXcgdGhhdCBpbXBsZW1lbnRzIHtAbGluayBNZW51Vmlldy5JdGVtVmlld30uCiAgICAgICogQHBhcmFtIG1lbnVUeXBlIFRoZSB0eXBlIG9mIG1lbnUgdG8gZ2V0IGEgVmlldyBmb3IgKG11c3QgYmUgb25lIG9mCkBAIC02MjgsNiArNjM4LDQzIEBACiAgICAgICogQHJldHVybiBXaGV0aGVyIHRoZSBnaXZlbiBtZW51IHR5cGUgc2hvdWxkIHNob3cgaWNvbnMgZm9yIG1lbnUgaXRlbXMuCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gc2hvdWxkU2hvd0ljb24oaW50IG1lbnVUeXBlKSB7Ci0gICAgICAgIHJldHVybiBtZW51VHlwZSA9PSBNZW51QnVpbGRlci5UWVBFX0lDT04gfHwgbU1lbnUuZ2V0T3B0aW9uYWxJY29uc1Zpc2libGUoKTsKKyAgICAgICAgcmV0dXJuIG1lbnVUeXBlID09IE1lbnVCdWlsZGVyLlRZUEVfSUNPTiB8fAorICAgICAgICAgICAgICAgIG1lbnVUeXBlID09IE1lbnVCdWlsZGVyLlRZUEVfQUNUSU9OX0JVVFRPTiB8fAorICAgICAgICAgICAgICAgIG1lbnVUeXBlID09IE1lbnVCdWlsZGVyLlRZUEVfUE9QVVAgfHwKKyAgICAgICAgICAgICAgICBtTWVudS5nZXRPcHRpb25hbEljb25zVmlzaWJsZSgpOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgYm9vbGVhbiBpc0FjdGlvbkJ1dHRvbigpIHsKKyAgICAgICAgcmV0dXJuIChtRmxhZ3MgJiBJU19BQ1RJT04pID09IElTX0FDVElPTiB8fCByZXF1aXJlc0FjdGlvbkJ1dHRvbigpOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgYm9vbGVhbiByZXF1ZXN0c0FjdGlvbkJ1dHRvbigpIHsKKyAgICAgICAgcmV0dXJuIG1TaG93QXNBY3Rpb24gPT0gU0hPV19BU19BQ1RJT05fSUZfUk9PTTsKKyAgICB9CisgICAgCisgICAgcHVibGljIGJvb2xlYW4gcmVxdWlyZXNBY3Rpb25CdXR0b24oKSB7CisgICAgICAgIHJldHVybiBtU2hvd0FzQWN0aW9uID09IFNIT1dfQVNfQUNUSU9OX0FMV0FZUzsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRJc0FjdGlvbkJ1dHRvbihib29sZWFuIGlzQWN0aW9uQnV0dG9uKSB7CisgICAgICAgIGlmIChpc0FjdGlvbkJ1dHRvbikgeworICAgICAgICAgICAgbUZsYWdzIHw9IElTX0FDVElPTjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1GbGFncyAmPSB+SVNfQUNUSU9OOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0U2hvd0FzQWN0aW9uKGludCBhY3Rpb25FbnVtKSB7CisgICAgICAgIG1TaG93QXNBY3Rpb24gPSBhY3Rpb25FbnVtOworICAgICAgICBtTWVudS5vbkl0ZW1BY3Rpb25SZXF1ZXN0Q2hhbmdlZCh0aGlzKTsKKyAgICB9CisKKyAgICBwdWJsaWMgTWVudUl0ZW0gc2V0QWN0aW9uVmlldyhWaWV3IHZpZXcpIHsKKyAgICAgICAgbUFjdGlvblZpZXcgPSB2aWV3OworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBwdWJsaWMgVmlldyBnZXRBY3Rpb25WaWV3KCkgeworICAgICAgICByZXR1cm4gbUFjdGlvblZpZXc7CiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3ZpZXcvbWVudS9NZW51UG9wdXBIZWxwZXIuamF2YSBiL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC92aWV3L21lbnUvTWVudVBvcHVwSGVscGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzk0NzgyNAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC92aWV3L21lbnUvTWVudVBvcHVwSGVscGVyLmphdmEKQEAgLTAsMCArMSwxNDUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLmludGVybmFsLnZpZXcubWVudTsKKworaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnZpZXcubWVudS5NZW51QnVpbGRlci5NZW51QWRhcHRlcjsKKworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQudXRpbC5EaXNwbGF5TWV0cmljczsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuS2V5RXZlbnQ7CitpbXBvcnQgYW5kcm9pZC52aWV3Lk1lbnVJdGVtOworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3Lk1lYXN1cmVTcGVjOworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkFkYXB0ZXJWaWV3OworaW1wb3J0IGFuZHJvaWQud2lkZ2V0Lkxpc3RQb3B1cFdpbmRvdzsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5Qb3B1cFdpbmRvdzsKKworaW1wb3J0IGphdmEubGFuZy5yZWYuV2Vha1JlZmVyZW5jZTsKKworLyoqCisgKiBAaGlkZQorICovCitwdWJsaWMgY2xhc3MgTWVudVBvcHVwSGVscGVyIGltcGxlbWVudHMgQWRhcHRlclZpZXcuT25JdGVtQ2xpY2tMaXN0ZW5lciwgVmlldy5PbktleUxpc3RlbmVyIHsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIk1lbnVQb3B1cEhlbHBlciI7CisKKyAgICBwcml2YXRlIENvbnRleHQgbUNvbnRleHQ7CisgICAgcHJpdmF0ZSBMaXN0UG9wdXBXaW5kb3cgbVBvcHVwOworICAgIHByaXZhdGUgTWVudUJ1aWxkZXIgbU1lbnU7CisgICAgcHJpdmF0ZSBpbnQgbVBvcHVwTWF4V2lkdGg7CisgICAgcHJpdmF0ZSBXZWFrUmVmZXJlbmNlPFZpZXc+IG1BbmNob3JWaWV3OworICAgIHByaXZhdGUgYm9vbGVhbiBtT3ZlcmZsb3dPbmx5OworCisgICAgcHJpdmF0ZSBQb3B1cFdpbmRvdy5PbkRpc21pc3NMaXN0ZW5lciBtRGlzbWlzc0xpc3RlbmVyID0gbmV3IFBvcHVwV2luZG93Lk9uRGlzbWlzc0xpc3RlbmVyKCkgeworICAgICAgICBwdWJsaWMgdm9pZCBvbkRpc21pc3MoKSB7CisgICAgICAgICAgICBtUG9wdXAgPSBudWxsOworICAgICAgICB9CisgICAgfTsKKworICAgIHB1YmxpYyBNZW51UG9wdXBIZWxwZXIoQ29udGV4dCBjb250ZXh0LCBNZW51QnVpbGRlciBtZW51KSB7CisgICAgICAgIHRoaXMoY29udGV4dCwgbWVudSwgbnVsbCwgZmFsc2UpOworICAgIH0KKworICAgIHB1YmxpYyBNZW51UG9wdXBIZWxwZXIoQ29udGV4dCBjb250ZXh0LCBNZW51QnVpbGRlciBtZW51LCBWaWV3IGFuY2hvclZpZXcpIHsKKyAgICAgICAgdGhpcyhjb250ZXh0LCBtZW51LCBhbmNob3JWaWV3LCBmYWxzZSk7CisgICAgfQorCisgICAgcHVibGljIE1lbnVQb3B1cEhlbHBlcihDb250ZXh0IGNvbnRleHQsIE1lbnVCdWlsZGVyIG1lbnUsCisgICAgICAgICAgICBWaWV3IGFuY2hvclZpZXcsIGJvb2xlYW4gb3ZlcmZsb3dPbmx5KSB7CisgICAgICAgIG1Db250ZXh0ID0gY29udGV4dDsKKyAgICAgICAgbU1lbnUgPSBtZW51OworICAgICAgICBtT3ZlcmZsb3dPbmx5ID0gb3ZlcmZsb3dPbmx5OworCisgICAgICAgIGZpbmFsIERpc3BsYXlNZXRyaWNzIG1ldHJpY3MgPSBjb250ZXh0LmdldFJlc291cmNlcygpLmdldERpc3BsYXlNZXRyaWNzKCk7CisgICAgICAgIG1Qb3B1cE1heFdpZHRoID0gbWV0cmljcy53aWR0aFBpeGVscyAvIDI7CisKKyAgICAgICAgaWYgKGFuY2hvclZpZXcgIT0gbnVsbCkgeworICAgICAgICAgICAgbUFuY2hvclZpZXcgPSBuZXcgV2Vha1JlZmVyZW5jZTxWaWV3PihhbmNob3JWaWV3KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNob3coKSB7CisgICAgICAgIG1Qb3B1cCA9IG5ldyBMaXN0UG9wdXBXaW5kb3cobUNvbnRleHQsIG51bGwsIGNvbS5hbmRyb2lkLmludGVybmFsLlIuYXR0ci5wb3B1cE1lbnVTdHlsZSk7CisgICAgICAgIG1Qb3B1cC5zZXRPbkl0ZW1DbGlja0xpc3RlbmVyKHRoaXMpOworICAgICAgICBtUG9wdXAuc2V0T25EaXNtaXNzTGlzdGVuZXIobURpc21pc3NMaXN0ZW5lcik7CisKKyAgICAgICAgZmluYWwgTWVudUFkYXB0ZXIgYWRhcHRlciA9IG1PdmVyZmxvd09ubHkgPworICAgICAgICAgICAgICAgIG1NZW51LmdldE92ZXJmbG93TWVudUFkYXB0ZXIoTWVudUJ1aWxkZXIuVFlQRV9QT1BVUCkgOgorICAgICAgICAgICAgICAgIG1NZW51LmdldE1lbnVBZGFwdGVyKE1lbnVCdWlsZGVyLlRZUEVfUE9QVVApOworICAgICAgICBtUG9wdXAuc2V0QWRhcHRlcihhZGFwdGVyKTsKKyAgICAgICAgbVBvcHVwLnNldE1vZGFsKHRydWUpOworCisgICAgICAgIGlmIChtQW5jaG9yVmlldyAhPSBudWxsKSB7CisgICAgICAgICAgICBtUG9wdXAuc2V0QW5jaG9yVmlldyhtQW5jaG9yVmlldy5nZXQoKSk7CisgICAgICAgIH0gZWxzZSBpZiAobU1lbnUgaW5zdGFuY2VvZiBTdWJNZW51QnVpbGRlcikgeworICAgICAgICAgICAgU3ViTWVudUJ1aWxkZXIgc3ViTWVudSA9IChTdWJNZW51QnVpbGRlcikgbU1lbnU7CisgICAgICAgICAgICBmaW5hbCBNZW51SXRlbUltcGwgaXRlbUltcGwgPSAoTWVudUl0ZW1JbXBsKSBzdWJNZW51LmdldEl0ZW0oKTsKKyAgICAgICAgICAgIG1Qb3B1cC5zZXRBbmNob3JWaWV3KGl0ZW1JbXBsLmdldEl0ZW1WaWV3KE1lbnVCdWlsZGVyLlRZUEVfQUNUSU9OX0JVVFRPTiwgbnVsbCkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiTWVudVBvcHVwSGVscGVyIGNhbm5vdCBiZSB1c2VkIHdpdGhvdXQgYW4gYW5jaG9yIik7CisgICAgICAgIH0KKworICAgICAgICBtUG9wdXAuc2V0Q29udGVudFdpZHRoKE1hdGgubWluKG1lYXN1cmVDb250ZW50V2lkdGgoYWRhcHRlciksIG1Qb3B1cE1heFdpZHRoKSk7CisgICAgICAgIG1Qb3B1cC5zaG93KCk7CisgICAgICAgIG1Qb3B1cC5nZXRMaXN0VmlldygpLnNldE9uS2V5TGlzdGVuZXIodGhpcyk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZGlzbWlzcygpIHsKKyAgICAgICAgaWYgKGlzU2hvd2luZygpKSB7CisgICAgICAgICAgICBtUG9wdXAuZGlzbWlzcygpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaXNTaG93aW5nKCkgeworICAgICAgICByZXR1cm4gbVBvcHVwICE9IG51bGwgJiYgbVBvcHVwLmlzU2hvd2luZygpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIG9uSXRlbUNsaWNrKEFkYXB0ZXJWaWV3PD8+IHBhcmVudCwgVmlldyB2aWV3LCBpbnQgcG9zaXRpb24sIGxvbmcgaWQpIHsKKyAgICAgICAgTWVudUl0ZW0gaXRlbSA9IG51bGw7CisgICAgICAgIGlmIChtT3ZlcmZsb3dPbmx5KSB7CisgICAgICAgICAgICBpdGVtID0gbU1lbnUuZ2V0T3ZlcmZsb3dJdGVtKHBvc2l0aW9uKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGl0ZW0gPSBtTWVudS5nZXRJdGVtKHBvc2l0aW9uKTsKKyAgICAgICAgfQorICAgICAgICBtTWVudS5wZXJmb3JtSXRlbUFjdGlvbihpdGVtLCAwKTsKKyAgICAgICAgbVBvcHVwLmRpc21pc3MoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBvbktleShWaWV3IHYsIGludCBrZXlDb2RlLCBLZXlFdmVudCBldmVudCkgeworICAgICAgICBpZiAoZXZlbnQuZ2V0QWN0aW9uKCkgPT0gS2V5RXZlbnQuQUNUSU9OX1VQICYmIGtleUNvZGUgPT0gS2V5RXZlbnQuS0VZQ09ERV9NRU5VKSB7CisgICAgICAgICAgICBkaXNtaXNzKCk7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcHJpdmF0ZSBpbnQgbWVhc3VyZUNvbnRlbnRXaWR0aChNZW51QWRhcHRlciBhZGFwdGVyKSB7CisgICAgICAgIC8vIE1lbnVzIGRvbid0IHRlbmQgdG8gYmUgbG9uZywgc28gdGhpcyBpcyBtb3JlIHNhbmUgdGhhbiBpdCBsb29rcy4KKyAgICAgICAgaW50IHdpZHRoID0gMDsKKyAgICAgICAgVmlldyBpdGVtVmlldyA9IG51bGw7CisgICAgICAgIGZpbmFsIGludCB3aWR0aE1lYXN1cmVTcGVjID0KKyAgICAgICAgICAgIE1lYXN1cmVTcGVjLm1ha2VNZWFzdXJlU3BlYygwLCBNZWFzdXJlU3BlYy5VTlNQRUNJRklFRCk7CisgICAgICAgIGZpbmFsIGludCBoZWlnaHRNZWFzdXJlU3BlYyA9CisgICAgICAgICAgICBNZWFzdXJlU3BlYy5tYWtlTWVhc3VyZVNwZWMoMCwgTWVhc3VyZVNwZWMuVU5TUEVDSUZJRUQpOworICAgICAgICBmaW5hbCBpbnQgY291bnQgPSBhZGFwdGVyLmdldENvdW50KCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeworICAgICAgICAgICAgaXRlbVZpZXcgPSBhZGFwdGVyLmdldFZpZXcoaSwgaXRlbVZpZXcsIG51bGwpOworICAgICAgICAgICAgaXRlbVZpZXcubWVhc3VyZSh3aWR0aE1lYXN1cmVTcGVjLCBoZWlnaHRNZWFzdXJlU3BlYyk7CisgICAgICAgICAgICB3aWR0aCA9IE1hdGgubWF4KHdpZHRoLCBpdGVtVmlldy5nZXRNZWFzdXJlZFdpZHRoKCkpOworICAgICAgICB9CisgICAgICAgIHJldHVybiB3aWR0aDsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvd2lkZ2V0L0FjdGlvbkJhckNvbnRleHRWaWV3LmphdmEgYi9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvd2lkZ2V0L0FjdGlvbkJhckNvbnRleHRWaWV3LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjVlNTdjMgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC93aWRnZXQvQWN0aW9uQmFyQ29udGV4dFZpZXcuamF2YQpAQCAtMCwwICsxLDMzOCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIGNvbS5hbmRyb2lkLmludGVybmFsLndpZGdldDsKKworaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLlI7CitpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudmlldy5tZW51LkFjdGlvbk1lbnVWaWV3OworaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnZpZXcubWVudS5NZW51QnVpbGRlcjsKKworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuVHlwZWRBcnJheTsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlOworaW1wb3J0IGFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQ7CitpbXBvcnQgYW5kcm9pZC52aWV3LkFjdGlvbk1vZGU7CitpbXBvcnQgYW5kcm9pZC52aWV3LkxheW91dEluZmxhdGVyOworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3R3JvdXA7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXcuTWVhc3VyZVNwZWM7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuSW1hZ2VCdXR0b247CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuTGluZWFyTGF5b3V0OworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlRleHRWaWV3OworCisvKioKKyAqIEBoaWRlCisgKi8KK3B1YmxpYyBjbGFzcyBBY3Rpb25CYXJDb250ZXh0VmlldyBleHRlbmRzIFZpZXdHcm91cCB7CisgICAgcHJpdmF0ZSBpbnQgbUl0ZW1QYWRkaW5nOworICAgIHByaXZhdGUgaW50IG1BY3Rpb25TcGFjaW5nOworICAgIHByaXZhdGUgaW50IG1Db250ZW50SGVpZ2h0OworICAgIAorICAgIHByaXZhdGUgQ2hhclNlcXVlbmNlIG1UaXRsZTsKKyAgICBwcml2YXRlIENoYXJTZXF1ZW5jZSBtU3VidGl0bGU7CisgICAgCisgICAgcHJpdmF0ZSBJbWFnZUJ1dHRvbiBtQ2xvc2VCdXR0b247CisgICAgcHJpdmF0ZSBWaWV3IG1DdXN0b21WaWV3OworICAgIHByaXZhdGUgTGluZWFyTGF5b3V0IG1UaXRsZUxheW91dDsKKyAgICBwcml2YXRlIFRleHRWaWV3IG1UaXRsZVZpZXc7CisgICAgcHJpdmF0ZSBUZXh0VmlldyBtU3VidGl0bGVWaWV3OworICAgIHByaXZhdGUgaW50IG1UaXRsZVN0eWxlUmVzOworICAgIHByaXZhdGUgaW50IG1TdWJ0aXRsZVN0eWxlUmVzOworICAgIHByaXZhdGUgQWN0aW9uTWVudVZpZXcgbU1lbnVWaWV3OworICAgIAorICAgIHB1YmxpYyBBY3Rpb25CYXJDb250ZXh0VmlldyhDb250ZXh0IGNvbnRleHQpIHsKKyAgICAgICAgdGhpcyhjb250ZXh0LCBudWxsKTsKKyAgICB9CisgICAgCisgICAgcHVibGljIEFjdGlvbkJhckNvbnRleHRWaWV3KENvbnRleHQgY29udGV4dCwgQXR0cmlidXRlU2V0IGF0dHJzKSB7CisgICAgICAgIHRoaXMoY29udGV4dCwgYXR0cnMsIGNvbS5hbmRyb2lkLmludGVybmFsLlIuYXR0ci5hY3Rpb25Nb2RlU3R5bGUpOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgQWN0aW9uQmFyQ29udGV4dFZpZXcoQ29udGV4dCBjb250ZXh0LCBBdHRyaWJ1dGVTZXQgYXR0cnMsIGludCBkZWZTdHlsZSkgeworICAgICAgICBzdXBlcihjb250ZXh0LCBhdHRycywgZGVmU3R5bGUpOworICAgICAgICAKKyAgICAgICAgVHlwZWRBcnJheSBhID0gY29udGV4dC5vYnRhaW5TdHlsZWRBdHRyaWJ1dGVzKGF0dHJzLCBSLnN0eWxlYWJsZS5BY3Rpb25Nb2RlLCBkZWZTdHlsZSwgMCk7CisgICAgICAgIG1JdGVtUGFkZGluZyA9IGEuZ2V0RGltZW5zaW9uUGl4ZWxPZmZzZXQoCisgICAgICAgICAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZWFibGUuQWN0aW9uTW9kZV9pdGVtUGFkZGluZywgMCk7CisgICAgICAgIHNldEJhY2tncm91bmREcmF3YWJsZShhLmdldERyYXdhYmxlKAorICAgICAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLkFjdGlvbk1vZGVfYmFja2dyb3VuZCkpOworICAgICAgICBtVGl0bGVTdHlsZVJlcyA9IGEuZ2V0UmVzb3VyY2VJZCgKKyAgICAgICAgICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZS5BY3Rpb25Nb2RlX3RpdGxlVGV4dFN0eWxlLCAwKTsKKyAgICAgICAgbVN1YnRpdGxlU3R5bGVSZXMgPSBhLmdldFJlc291cmNlSWQoCisgICAgICAgICAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZWFibGUuQWN0aW9uTW9kZV9zdWJ0aXRsZVRleHRTdHlsZSwgMCk7CisKKyAgICAgICAgbUNvbnRlbnRIZWlnaHQgPSBhLmdldExheW91dERpbWVuc2lvbigKKyAgICAgICAgICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZS5BY3Rpb25Nb2RlX2hlaWdodCwgMCk7CisgICAgICAgIGEucmVjeWNsZSgpOworICAgIH0KKyAgICAKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgQWN0aW9uTW9kZSBzdGFydEFjdGlvbk1vZGVGb3JDaGlsZChWaWV3IGNoaWxkLCBBY3Rpb25Nb2RlLkNhbGxiYWNrIGNhbGxiYWNrKSB7CisgICAgICAgIC8vIE5vIHN0YXJ0aW5nIGFuIGFjdGlvbiBtb2RlIGZvciBhbiBleGlzdGluZyBhY3Rpb24gbW9kZSBVSSBjaGlsZCEgKFdoZXJlIHdvdWxkIGl0IGdvPykKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0SGVpZ2h0KGludCBoZWlnaHQpIHsKKyAgICAgICAgbUNvbnRlbnRIZWlnaHQgPSBoZWlnaHQ7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0Q3VzdG9tVmlldyhWaWV3IHZpZXcpIHsKKyAgICAgICAgaWYgKG1DdXN0b21WaWV3ICE9IG51bGwpIHsKKyAgICAgICAgICAgIHJlbW92ZVZpZXcobUN1c3RvbVZpZXcpOworICAgICAgICB9CisgICAgICAgIG1DdXN0b21WaWV3ID0gdmlldzsKKyAgICAgICAgaWYgKG1UaXRsZUxheW91dCAhPSBudWxsKSB7CisgICAgICAgICAgICByZW1vdmVWaWV3KG1UaXRsZUxheW91dCk7CisgICAgICAgICAgICBtVGl0bGVMYXlvdXQgPSBudWxsOworICAgICAgICB9CisgICAgICAgIGlmICh2aWV3ICE9IG51bGwpIHsKKyAgICAgICAgICAgIGFkZFZpZXcodmlldyk7CisgICAgICAgIH0KKyAgICAgICAgcmVxdWVzdExheW91dCgpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFRpdGxlKENoYXJTZXF1ZW5jZSB0aXRsZSkgeworICAgICAgICBtVGl0bGUgPSB0aXRsZTsKKyAgICAgICAgaW5pdFRpdGxlKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0U3VidGl0bGUoQ2hhclNlcXVlbmNlIHN1YnRpdGxlKSB7CisgICAgICAgIG1TdWJ0aXRsZSA9IHN1YnRpdGxlOworICAgICAgICBpbml0VGl0bGUoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgQ2hhclNlcXVlbmNlIGdldFRpdGxlKCkgeworICAgICAgICByZXR1cm4gbVRpdGxlOworICAgIH0KKworICAgIHB1YmxpYyBDaGFyU2VxdWVuY2UgZ2V0U3VidGl0bGUoKSB7CisgICAgICAgIHJldHVybiBtU3VidGl0bGU7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGluaXRUaXRsZSgpIHsKKyAgICAgICAgaWYgKG1UaXRsZUxheW91dCA9PSBudWxsKSB7CisgICAgICAgICAgICBMYXlvdXRJbmZsYXRlciBpbmZsYXRlciA9IExheW91dEluZmxhdGVyLmZyb20oZ2V0Q29udGV4dCgpKTsKKyAgICAgICAgICAgIG1UaXRsZUxheW91dCA9IChMaW5lYXJMYXlvdXQpIGluZmxhdGVyLmluZmxhdGUoUi5sYXlvdXQuYWN0aW9uX2Jhcl90aXRsZV9pdGVtLCBudWxsKTsKKyAgICAgICAgICAgIG1UaXRsZVZpZXcgPSAoVGV4dFZpZXcpIG1UaXRsZUxheW91dC5maW5kVmlld0J5SWQoUi5pZC5hY3Rpb25fYmFyX3RpdGxlKTsKKyAgICAgICAgICAgIG1TdWJ0aXRsZVZpZXcgPSAoVGV4dFZpZXcpIG1UaXRsZUxheW91dC5maW5kVmlld0J5SWQoUi5pZC5hY3Rpb25fYmFyX3N1YnRpdGxlKTsKKyAgICAgICAgICAgIGlmIChtVGl0bGUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG1UaXRsZVZpZXcuc2V0VGV4dChtVGl0bGUpOworICAgICAgICAgICAgICAgIGlmIChtVGl0bGVTdHlsZVJlcyAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgIG1UaXRsZVZpZXcuc2V0VGV4dEFwcGVhcmFuY2UobUNvbnRleHQsIG1UaXRsZVN0eWxlUmVzKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobVN1YnRpdGxlICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBtU3VidGl0bGVWaWV3LnNldFRleHQobVN1YnRpdGxlKTsKKyAgICAgICAgICAgICAgICBpZiAobVN1YnRpdGxlU3R5bGVSZXMgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICBtU3VidGl0bGVWaWV3LnNldFRleHRBcHBlYXJhbmNlKG1Db250ZXh0LCBtU3VidGl0bGVTdHlsZVJlcyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG1TdWJ0aXRsZVZpZXcuc2V0VmlzaWJpbGl0eShWSVNJQkxFKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGFkZFZpZXcobVRpdGxlTGF5b3V0KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1UaXRsZVZpZXcuc2V0VGV4dChtVGl0bGUpOworICAgICAgICAgICAgbVN1YnRpdGxlVmlldy5zZXRUZXh0KG1TdWJ0aXRsZSk7CisgICAgICAgICAgICBtU3VidGl0bGVWaWV3LnNldFZpc2liaWxpdHkobVN1YnRpdGxlICE9IG51bGwgPyBWSVNJQkxFIDogR09ORSk7CisgICAgICAgICAgICBpZiAobVRpdGxlTGF5b3V0LmdldFBhcmVudCgpID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBhZGRWaWV3KG1UaXRsZUxheW91dCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBpbml0Rm9yTW9kZShmaW5hbCBBY3Rpb25Nb2RlIG1vZGUpIHsKKyAgICAgICAgaWYgKG1DbG9zZUJ1dHRvbiA9PSBudWxsKSB7CisgICAgICAgICAgICBtQ2xvc2VCdXR0b24gPSBuZXcgSW1hZ2VCdXR0b24oZ2V0Q29udGV4dCgpLCBudWxsLAorICAgICAgICAgICAgICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmF0dHIuYWN0aW9uTW9kZUNsb3NlQnV0dG9uU3R5bGUpOworICAgICAgICB9CisgICAgICAgIG1DbG9zZUJ1dHRvbi5zZXRPbkNsaWNrTGlzdGVuZXIobmV3IE9uQ2xpY2tMaXN0ZW5lcigpIHsKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uQ2xpY2soVmlldyB2KSB7CisgICAgICAgICAgICAgICAgbW9kZS5maW5pc2goKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisgICAgICAgIGFkZFZpZXcobUNsb3NlQnV0dG9uKTsKKworICAgICAgICBmaW5hbCBNZW51QnVpbGRlciBtZW51ID0gKE1lbnVCdWlsZGVyKSBtb2RlLmdldE1lbnUoKTsKKyAgICAgICAgbU1lbnVWaWV3ID0gKEFjdGlvbk1lbnVWaWV3KSBtZW51LmdldE1lbnVWaWV3KE1lbnVCdWlsZGVyLlRZUEVfQUNUSU9OX0JVVFRPTiwgdGhpcyk7CisgICAgICAgIG1NZW51Vmlldy5zZXRPdmVyZmxvd1Jlc2VydmVkKHRydWUpOworICAgICAgICBtTWVudVZpZXcudXBkYXRlQ2hpbGRyZW4oZmFsc2UpOworICAgICAgICBhZGRWaWV3KG1NZW51Vmlldyk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgY2xvc2VNb2RlKCkgeworICAgICAgICByZW1vdmVBbGxWaWV3cygpOworICAgICAgICBtQ3VzdG9tVmlldyA9IG51bGw7CisgICAgICAgIG1NZW51VmlldyA9IG51bGw7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gc2hvd092ZXJmbG93TWVudSgpIHsKKyAgICAgICAgaWYgKG1NZW51VmlldyAhPSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gbU1lbnVWaWV3LnNob3dPdmVyZmxvd01lbnUoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaGlkZU92ZXJmbG93TWVudSgpIHsKKyAgICAgICAgaWYgKG1NZW51VmlldyAhPSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gbU1lbnVWaWV3LmhpZGVPdmVyZmxvd01lbnUoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaXNPdmVyZmxvd01lbnVTaG93aW5nKCkgeworICAgICAgICBpZiAobU1lbnVWaWV3ICE9IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBtTWVudVZpZXcuaXNPdmVyZmxvd01lbnVTaG93aW5nKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBMYXlvdXRQYXJhbXMgZ2VuZXJhdGVEZWZhdWx0TGF5b3V0UGFyYW1zKCkgeworICAgICAgICAvLyBVc2VkIGJ5IGN1c3RvbSB2aWV3cyBpZiB0aGV5IGRvbid0IHN1cHBseSBsYXlvdXQgcGFyYW1zLiBFdmVyeXRoaW5nIGVsc2UKKyAgICAgICAgLy8gYWRkZWQgdG8gYW4gQWN0aW9uQmFyQ29udGV4dFZpZXcgc2hvdWxkIGhhdmUgdGhlbSBhbHJlYWR5LgorICAgICAgICByZXR1cm4gbmV3IExheW91dFBhcmFtcyhMYXlvdXRQYXJhbXMuTUFUQ0hfUEFSRU5ULCBMYXlvdXRQYXJhbXMuV1JBUF9DT05URU5UKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvbk1lYXN1cmUoaW50IHdpZHRoTWVhc3VyZVNwZWMsIGludCBoZWlnaHRNZWFzdXJlU3BlYykgeworICAgICAgICBmaW5hbCBpbnQgd2lkdGhNb2RlID0gTWVhc3VyZVNwZWMuZ2V0TW9kZSh3aWR0aE1lYXN1cmVTcGVjKTsKKyAgICAgICAgaWYgKHdpZHRoTW9kZSAhPSBNZWFzdXJlU3BlYy5FWEFDVExZKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKGdldENsYXNzKCkuZ2V0U2ltcGxlTmFtZSgpICsgIiBjYW4gb25seSBiZSB1c2VkICIgKworICAgICAgICAgICAgICAgICAgICAid2l0aCBhbmRyb2lkOmxheW91dF93aWR0aD1cIm1hdGNoX3BhcmVudFwiIChvciBmaWxsX3BhcmVudCkiKTsKKyAgICAgICAgfQorCisgICAgICAgIGZpbmFsIGludCBoZWlnaHRNb2RlID0gTWVhc3VyZVNwZWMuZ2V0TW9kZShoZWlnaHRNZWFzdXJlU3BlYyk7CisgICAgICAgIGlmIChoZWlnaHRNb2RlICE9IE1lYXN1cmVTcGVjLkFUX01PU1QpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oZ2V0Q2xhc3MoKS5nZXRTaW1wbGVOYW1lKCkgKyAiIGNhbiBvbmx5IGJlIHVzZWQgIiArCisgICAgICAgICAgICAgICAgICAgICJ3aXRoIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD1cIndyYXBfY29udGVudFwiIik7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIGZpbmFsIGludCBjb250ZW50V2lkdGggPSBNZWFzdXJlU3BlYy5nZXRTaXplKHdpZHRoTWVhc3VyZVNwZWMpOworICAgICAgICBmaW5hbCBpbnQgaXRlbU1hcmdpbiA9IG1JdGVtUGFkZGluZzsKKworICAgICAgICBpbnQgbWF4SGVpZ2h0ID0gbUNvbnRlbnRIZWlnaHQgPiAwID8KKyAgICAgICAgICAgICAgICBtQ29udGVudEhlaWdodCA6IE1lYXN1cmVTcGVjLmdldFNpemUoaGVpZ2h0TWVhc3VyZVNwZWMpOworCisgICAgICAgIGZpbmFsIGludCB2ZXJ0aWNhbFBhZGRpbmcgPSBnZXRQYWRkaW5nVG9wKCkgKyBnZXRQYWRkaW5nQm90dG9tKCk7CisgICAgICAgIGludCBhdmFpbGFibGVXaWR0aCA9IGNvbnRlbnRXaWR0aCAtIGdldFBhZGRpbmdMZWZ0KCkgLSBnZXRQYWRkaW5nUmlnaHQoKTsKKyAgICAgICAgZmluYWwgaW50IGhlaWdodCA9IG1heEhlaWdodCAtIHZlcnRpY2FsUGFkZGluZzsKKyAgICAgICAgZmluYWwgaW50IGNoaWxkU3BlY0hlaWdodCA9IE1lYXN1cmVTcGVjLm1ha2VNZWFzdXJlU3BlYyhoZWlnaHQsIE1lYXN1cmVTcGVjLkFUX01PU1QpOworICAgICAgICAKKyAgICAgICAgaWYgKG1DbG9zZUJ1dHRvbiAhPSBudWxsKSB7CisgICAgICAgICAgICBhdmFpbGFibGVXaWR0aCA9IG1lYXN1cmVDaGlsZFZpZXcobUNsb3NlQnV0dG9uLCBhdmFpbGFibGVXaWR0aCwKKyAgICAgICAgICAgICAgICAgICAgY2hpbGRTcGVjSGVpZ2h0LCBpdGVtTWFyZ2luKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChtVGl0bGVMYXlvdXQgIT0gbnVsbCAmJiBtQ3VzdG9tVmlldyA9PSBudWxsKSB7CisgICAgICAgICAgICBhdmFpbGFibGVXaWR0aCA9IG1lYXN1cmVDaGlsZFZpZXcobVRpdGxlTGF5b3V0LCBhdmFpbGFibGVXaWR0aCwKKyAgICAgICAgICAgICAgICAgICAgY2hpbGRTcGVjSGVpZ2h0LCBpdGVtTWFyZ2luKTsKKyAgICAgICAgfQorCisgICAgICAgIGZpbmFsIGludCBjaGlsZENvdW50ID0gZ2V0Q2hpbGRDb3VudCgpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkQ291bnQ7IGkrKykgeworICAgICAgICAgICAgZmluYWwgVmlldyBjaGlsZCA9IGdldENoaWxkQXQoaSk7CisgICAgICAgICAgICBpZiAoY2hpbGQgPT0gbUNsb3NlQnV0dG9uIHx8IGNoaWxkID09IG1UaXRsZUxheW91dCB8fCBjaGlsZCA9PSBtQ3VzdG9tVmlldykgeworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgCisgICAgICAgICAgICBhdmFpbGFibGVXaWR0aCA9IG1lYXN1cmVDaGlsZFZpZXcoY2hpbGQsIGF2YWlsYWJsZVdpZHRoLCBjaGlsZFNwZWNIZWlnaHQsIGl0ZW1NYXJnaW4pOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG1DdXN0b21WaWV3ICE9IG51bGwpIHsKKyAgICAgICAgICAgIExheW91dFBhcmFtcyBscCA9IG1DdXN0b21WaWV3LmdldExheW91dFBhcmFtcygpOworICAgICAgICAgICAgZmluYWwgaW50IGN1c3RvbVdpZHRoTW9kZSA9IGxwLndpZHRoICE9IExheW91dFBhcmFtcy5XUkFQX0NPTlRFTlQgPworICAgICAgICAgICAgICAgICAgICBNZWFzdXJlU3BlYy5FWEFDVExZIDogTWVhc3VyZVNwZWMuQVRfTU9TVDsKKyAgICAgICAgICAgIGZpbmFsIGludCBjdXN0b21XaWR0aCA9IGxwLndpZHRoID49IDAgPworICAgICAgICAgICAgICAgICAgICBNYXRoLm1pbihscC53aWR0aCwgYXZhaWxhYmxlV2lkdGgpIDogYXZhaWxhYmxlV2lkdGg7CisgICAgICAgICAgICBmaW5hbCBpbnQgY3VzdG9tSGVpZ2h0TW9kZSA9IGxwLmhlaWdodCAhPSBMYXlvdXRQYXJhbXMuV1JBUF9DT05URU5UID8KKyAgICAgICAgICAgICAgICAgICAgTWVhc3VyZVNwZWMuRVhBQ1RMWSA6IE1lYXN1cmVTcGVjLkFUX01PU1Q7CisgICAgICAgICAgICBmaW5hbCBpbnQgY3VzdG9tSGVpZ2h0ID0gbHAuaGVpZ2h0ID49IDAgPworICAgICAgICAgICAgICAgICAgICBNYXRoLm1pbihscC5oZWlnaHQsIGhlaWdodCkgOiBoZWlnaHQ7CisgICAgICAgICAgICBtQ3VzdG9tVmlldy5tZWFzdXJlKE1lYXN1cmVTcGVjLm1ha2VNZWFzdXJlU3BlYyhjdXN0b21XaWR0aCwgY3VzdG9tV2lkdGhNb2RlKSwKKyAgICAgICAgICAgICAgICAgICAgTWVhc3VyZVNwZWMubWFrZU1lYXN1cmVTcGVjKGN1c3RvbUhlaWdodCwgY3VzdG9tSGVpZ2h0TW9kZSkpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG1Db250ZW50SGVpZ2h0IDw9IDApIHsKKyAgICAgICAgICAgIGludCBtZWFzdXJlZEhlaWdodCA9IDA7CisgICAgICAgICAgICBmaW5hbCBpbnQgY291bnQgPSBnZXRDaGlsZENvdW50KCk7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKyAgICAgICAgICAgICAgICBWaWV3IHYgPSBnZXRDaGlsZEF0KGkpOworICAgICAgICAgICAgICAgIGludCBwYWRkZWRWaWV3SGVpZ2h0ID0gdi5nZXRNZWFzdXJlZEhlaWdodCgpICsgdmVydGljYWxQYWRkaW5nOworICAgICAgICAgICAgICAgIGlmIChwYWRkZWRWaWV3SGVpZ2h0ID4gbWVhc3VyZWRIZWlnaHQpIHsKKyAgICAgICAgICAgICAgICAgICAgbWVhc3VyZWRIZWlnaHQgPSBwYWRkZWRWaWV3SGVpZ2h0OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNldE1lYXN1cmVkRGltZW5zaW9uKGNvbnRlbnRXaWR0aCwgbWVhc3VyZWRIZWlnaHQpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc2V0TWVhc3VyZWREaW1lbnNpb24oY29udGVudFdpZHRoLCBtYXhIZWlnaHQpOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25MYXlvdXQoYm9vbGVhbiBjaGFuZ2VkLCBpbnQgbCwgaW50IHQsIGludCByLCBpbnQgYikgeworICAgICAgICBpbnQgeCA9IGdldFBhZGRpbmdMZWZ0KCk7CisgICAgICAgIGZpbmFsIGludCB5ID0gZ2V0UGFkZGluZ1RvcCgpOworICAgICAgICBmaW5hbCBpbnQgY29udGVudEhlaWdodCA9IGIgLSB0IC0gZ2V0UGFkZGluZ1RvcCgpIC0gZ2V0UGFkZGluZ0JvdHRvbSgpOworICAgICAgICBmaW5hbCBpbnQgaXRlbU1hcmdpbiA9IG1JdGVtUGFkZGluZzsKKyAgICAgICAgCisgICAgICAgIGlmIChtQ2xvc2VCdXR0b24gIT0gbnVsbCAmJiBtQ2xvc2VCdXR0b24uZ2V0VmlzaWJpbGl0eSgpICE9IEdPTkUpIHsKKyAgICAgICAgICAgIHggKz0gcG9zaXRpb25DaGlsZChtQ2xvc2VCdXR0b24sIHgsIHksIGNvbnRlbnRIZWlnaHQpOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBpZiAobVRpdGxlTGF5b3V0ICE9IG51bGwgJiYgbUN1c3RvbVZpZXcgPT0gbnVsbCkgeworICAgICAgICAgICAgeCArPSBwb3NpdGlvbkNoaWxkKG1UaXRsZUxheW91dCwgeCwgeSwgY29udGVudEhlaWdodCkgKyBpdGVtTWFyZ2luOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBpZiAobUN1c3RvbVZpZXcgIT0gbnVsbCkgeworICAgICAgICAgICAgeCArPSBwb3NpdGlvbkNoaWxkKG1DdXN0b21WaWV3LCB4LCB5LCBjb250ZW50SGVpZ2h0KSArIGl0ZW1NYXJnaW47CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIHggPSByIC0gbCAtIGdldFBhZGRpbmdSaWdodCgpOworCisgICAgICAgIGlmIChtTWVudVZpZXcgIT0gbnVsbCkgeworICAgICAgICAgICAgeCAtPSBwb3NpdGlvbkNoaWxkSW52ZXJzZShtTWVudVZpZXcsIHggKyBtQWN0aW9uU3BhY2luZywgeSwgY29udGVudEhlaWdodCkKKyAgICAgICAgICAgICAgICAgICAgLSBtQWN0aW9uU3BhY2luZzsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgaW50IG1lYXN1cmVDaGlsZFZpZXcoVmlldyBjaGlsZCwgaW50IGF2YWlsYWJsZVdpZHRoLCBpbnQgY2hpbGRTcGVjSGVpZ2h0LCBpbnQgc3BhY2luZykgeworICAgICAgICBjaGlsZC5tZWFzdXJlKE1lYXN1cmVTcGVjLm1ha2VNZWFzdXJlU3BlYyhhdmFpbGFibGVXaWR0aCwgTWVhc3VyZVNwZWMuQVRfTU9TVCksCisgICAgICAgICAgICAgICAgY2hpbGRTcGVjSGVpZ2h0KTsKKworICAgICAgICBhdmFpbGFibGVXaWR0aCAtPSBjaGlsZC5nZXRNZWFzdXJlZFdpZHRoKCk7CisgICAgICAgIGF2YWlsYWJsZVdpZHRoIC09IHNwYWNpbmc7CisKKyAgICAgICAgcmV0dXJuIGF2YWlsYWJsZVdpZHRoOworICAgIH0KKyAgICAKKyAgICBwcml2YXRlIGludCBwb3NpdGlvbkNoaWxkKFZpZXcgY2hpbGQsIGludCB4LCBpbnQgeSwgaW50IGNvbnRlbnRIZWlnaHQpIHsKKyAgICAgICAgaW50IGNoaWxkV2lkdGggPSBjaGlsZC5nZXRNZWFzdXJlZFdpZHRoKCk7CisgICAgICAgIGludCBjaGlsZEhlaWdodCA9IGNoaWxkLmdldE1lYXN1cmVkSGVpZ2h0KCk7CisgICAgICAgIGludCBjaGlsZFRvcCA9IHkgKyAoY29udGVudEhlaWdodCAtIGNoaWxkSGVpZ2h0KSAvIDI7CisKKyAgICAgICAgY2hpbGQubGF5b3V0KHgsIGNoaWxkVG9wLCB4ICsgY2hpbGRXaWR0aCwgY2hpbGRUb3AgKyBjaGlsZEhlaWdodCk7CisKKyAgICAgICAgcmV0dXJuIGNoaWxkV2lkdGg7CisgICAgfQorICAgIAorICAgIHByaXZhdGUgaW50IHBvc2l0aW9uQ2hpbGRJbnZlcnNlKFZpZXcgY2hpbGQsIGludCB4LCBpbnQgeSwgaW50IGNvbnRlbnRIZWlnaHQpIHsKKyAgICAgICAgaW50IGNoaWxkV2lkdGggPSBjaGlsZC5nZXRNZWFzdXJlZFdpZHRoKCk7CisgICAgICAgIGludCBjaGlsZEhlaWdodCA9IGNoaWxkLmdldE1lYXN1cmVkSGVpZ2h0KCk7CisgICAgICAgIGludCBjaGlsZFRvcCA9IHkgKyAoY29udGVudEhlaWdodCAtIGNoaWxkSGVpZ2h0KSAvIDI7CisKKyAgICAgICAgY2hpbGQubGF5b3V0KHggLSBjaGlsZFdpZHRoLCBjaGlsZFRvcCwgeCwgY2hpbGRUb3AgKyBjaGlsZEhlaWdodCk7CisKKyAgICAgICAgcmV0dXJuIGNoaWxkV2lkdGg7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3dpZGdldC9BY3Rpb25CYXJWaWV3LmphdmEgYi9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvd2lkZ2V0L0FjdGlvbkJhclZpZXcuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMDhhNzA5Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3dpZGdldC9BY3Rpb25CYXJWaWV3LmphdmEKQEAgLTAsMCArMSw3NzEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLmludGVybmFsLndpZGdldDsKKworaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLlI7CitpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudmlldy5tZW51LkFjdGlvbk1lbnVJdGVtOworaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnZpZXcubWVudS5BY3Rpb25NZW51VmlldzsKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC52aWV3Lm1lbnUuTWVudUJ1aWxkZXI7CisKK2ltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpb25CYXI7CitpbXBvcnQgYW5kcm9pZC5hcHAuQWN0aW9uQmFyLk5hdmlnYXRpb25DYWxsYmFjazsKK2ltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eTsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uQXBwbGljYXRpb25JbmZvOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5QYWNrYWdlTWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlR5cGVkQXJyYXk7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5Qb3J0ZXJEdWZmOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUG9ydGVyRHVmZkNvbG9yRmlsdGVyOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuRHJhd2FibGU7CitpbXBvcnQgYW5kcm9pZC50ZXh0LlRleHRVdGlscy5UcnVuY2F0ZUF0OworaW1wb3J0IGFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQ7CitpbXBvcnQgYW5kcm9pZC51dGlsLkRpc3BsYXlNZXRyaWNzOworaW1wb3J0IGFuZHJvaWQudmlldy5BY3Rpb25Nb2RlOworaW1wb3J0IGFuZHJvaWQudmlldy5HcmF2aXR5OworaW1wb3J0IGFuZHJvaWQudmlldy5MYXlvdXRJbmZsYXRlcjsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuTWVudTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlld0dyb3VwOworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkFkYXB0ZXJWaWV3OworaW1wb3J0IGFuZHJvaWQud2lkZ2V0Lkhvcml6b250YWxTY3JvbGxWaWV3OworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkltYWdlVmlldzsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5MaW5lYXJMYXlvdXQ7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuU3Bpbm5lcjsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5TcGlubmVyQWRhcHRlcjsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5UZXh0VmlldzsKKworLyoqCisgKiBAaGlkZQorICovCitwdWJsaWMgY2xhc3MgQWN0aW9uQmFyVmlldyBleHRlbmRzIFZpZXdHcm91cCB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJBY3Rpb25CYXJWaWV3IjsKKyAgICAKKyAgICAvLyBUT0RPOiBUaGlzIG11c3QgYmUgZGVmaW5lZCBpbiB0aGUgZGVmYXVsdCB0aGVtZQorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDT05URU5UX1BBRERJTkdfRElQID0gMzsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQ09OVEVOVF9TUEFDSU5HX0RJUCA9IDY7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IENPTlRFTlRfQUNUSU9OX1NQQUNJTkdfRElQID0gMTI7CisgICAgCisgICAgLyoqCisgICAgICogRGlzcGxheSBvcHRpb25zIGFwcGxpZWQgYnkgZGVmYXVsdAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERJU1BMQVlfREVGQVVMVCA9IDA7CisKKyAgICAvKioKKyAgICAgKiBEaXNwbGF5IG9wdGlvbnMgdGhhdCByZXF1aXJlIHJlLWxheW91dCBhcyBvcHBvc2VkIHRvIGEgc2ltcGxlIGludmFsaWRhdGUKKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRElTUExBWV9SRUxBWU9VVF9NQVNLID0KKyAgICAgICAgICAgIEFjdGlvbkJhci5ESVNQTEFZX0hJREVfSE9NRSB8CisgICAgICAgICAgICBBY3Rpb25CYXIuRElTUExBWV9VU0VfTE9HTzsKKyAgICAKKyAgICBwcml2YXRlIGZpbmFsIGludCBtQ29udGVudEhlaWdodDsKKworICAgIHByaXZhdGUgaW50IG1OYXZpZ2F0aW9uTW9kZTsKKyAgICBwcml2YXRlIGludCBtRGlzcGxheU9wdGlvbnM7CisgICAgcHJpdmF0ZSBpbnQgbVNwYWNpbmc7CisgICAgcHJpdmF0ZSBpbnQgbUFjdGlvblNwYWNpbmc7CisgICAgcHJpdmF0ZSBDaGFyU2VxdWVuY2UgbVRpdGxlOworICAgIHByaXZhdGUgQ2hhclNlcXVlbmNlIG1TdWJ0aXRsZTsKKyAgICBwcml2YXRlIERyYXdhYmxlIG1JY29uOworICAgIHByaXZhdGUgRHJhd2FibGUgbUxvZ287CisKKyAgICBwcml2YXRlIEltYWdlVmlldyBtSWNvblZpZXc7CisgICAgcHJpdmF0ZSBJbWFnZVZpZXcgbUxvZ29WaWV3OworICAgIHByaXZhdGUgTGluZWFyTGF5b3V0IG1UaXRsZUxheW91dDsKKyAgICBwcml2YXRlIFRleHRWaWV3IG1UaXRsZVZpZXc7CisgICAgcHJpdmF0ZSBUZXh0VmlldyBtU3VidGl0bGVWaWV3OworICAgIHByaXZhdGUgU3Bpbm5lciBtU3Bpbm5lcjsKKyAgICBwcml2YXRlIEhvcml6b250YWxTY3JvbGxWaWV3IG1UYWJTY3JvbGxWaWV3OworICAgIHByaXZhdGUgTGluZWFyTGF5b3V0IG1UYWJMYXlvdXQ7CisgICAgcHJpdmF0ZSBWaWV3IG1DdXN0b21OYXZWaWV3OworICAgIAorICAgIHByaXZhdGUgaW50IG1UaXRsZVN0eWxlUmVzOworICAgIHByaXZhdGUgaW50IG1TdWJ0aXRsZVN0eWxlUmVzOworCisgICAgcHJpdmF0ZSBib29sZWFuIG1TaG93TWVudTsKKyAgICBwcml2YXRlIGJvb2xlYW4gbVVzZXJUaXRsZTsKKworICAgIHByaXZhdGUgTWVudUJ1aWxkZXIgbU9wdGlvbnNNZW51OworICAgIHByaXZhdGUgQWN0aW9uTWVudVZpZXcgbU1lbnVWaWV3OworICAgIAorICAgIHByaXZhdGUgQWN0aW9uQmFyQ29udGV4dFZpZXcgbUNvbnRleHRWaWV3OworCisgICAgcHJpdmF0ZSBBY3Rpb25NZW51SXRlbSBtTG9nb05hdkl0ZW07CisgICAgCisgICAgcHJpdmF0ZSBOYXZpZ2F0aW9uQ2FsbGJhY2sgbUNhbGxiYWNrOworCisgICAgcHJpdmF0ZSBmaW5hbCBBZGFwdGVyVmlldy5Pbkl0ZW1TZWxlY3RlZExpc3RlbmVyIG1OYXZJdGVtU2VsZWN0ZWRMaXN0ZW5lciA9CisgICAgICAgICAgICBuZXcgQWRhcHRlclZpZXcuT25JdGVtU2VsZWN0ZWRMaXN0ZW5lcigpIHsKKyAgICAgICAgcHVibGljIHZvaWQgb25JdGVtU2VsZWN0ZWQoQWRhcHRlclZpZXcgcGFyZW50LCBWaWV3IHZpZXcsIGludCBwb3NpdGlvbiwgbG9uZyBpZCkgeworICAgICAgICAgICAgaWYgKG1DYWxsYmFjayAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgbUNhbGxiYWNrLm9uTmF2aWdhdGlvbkl0ZW1TZWxlY3RlZChwb3NpdGlvbiwgaWQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHB1YmxpYyB2b2lkIG9uTm90aGluZ1NlbGVjdGVkKEFkYXB0ZXJWaWV3IHBhcmVudCkgeworICAgICAgICAgICAgLy8gRG8gbm90aGluZworICAgICAgICB9CisgICAgfTsKKworICAgIHByaXZhdGUgT25DbGlja0xpc3RlbmVyIG1Ib21lQ2xpY2tMaXN0ZW5lciA9IG51bGw7CisKKyAgICBwcml2YXRlIE9uQ2xpY2tMaXN0ZW5lciBtVGFiQ2xpY2tMaXN0ZW5lciA9IG51bGw7CisKKyAgICBwdWJsaWMgQWN0aW9uQmFyVmlldyhDb250ZXh0IGNvbnRleHQsIEF0dHJpYnV0ZVNldCBhdHRycykgeworICAgICAgICBzdXBlcihjb250ZXh0LCBhdHRycyk7CisKKyAgICAgICAgZmluYWwgRGlzcGxheU1ldHJpY3MgbWV0cmljcyA9IGNvbnRleHQuZ2V0UmVzb3VyY2VzKCkuZ2V0RGlzcGxheU1ldHJpY3MoKTsKKworICAgICAgICBUeXBlZEFycmF5IGEgPSBjb250ZXh0Lm9idGFpblN0eWxlZEF0dHJpYnV0ZXMoYXR0cnMsIFIuc3R5bGVhYmxlLkFjdGlvbkJhcik7CisKKyAgICAgICAgZmluYWwgaW50IGNvbG9yRmlsdGVyID0gYS5nZXRDb2xvcihSLnN0eWxlYWJsZS5BY3Rpb25CYXJfY29sb3JGaWx0ZXIsIDApOworCisgICAgICAgIGlmIChjb2xvckZpbHRlciAhPSAwKSB7CisgICAgICAgICAgICBmaW5hbCBEcmF3YWJsZSBkID0gZ2V0QmFja2dyb3VuZCgpOworICAgICAgICAgICAgZC5zZXREaXRoZXIodHJ1ZSk7CisgICAgICAgICAgICBkLnNldENvbG9yRmlsdGVyKG5ldyBQb3J0ZXJEdWZmQ29sb3JGaWx0ZXIoY29sb3JGaWx0ZXIsIFBvcnRlckR1ZmYuTW9kZS5PVkVSTEFZKSk7CisgICAgICAgIH0KKworICAgICAgICBBcHBsaWNhdGlvbkluZm8gaW5mbyA9IGNvbnRleHQuZ2V0QXBwbGljYXRpb25JbmZvKCk7CisgICAgICAgIFBhY2thZ2VNYW5hZ2VyIHBtID0gY29udGV4dC5nZXRQYWNrYWdlTWFuYWdlcigpOworICAgICAgICBtTmF2aWdhdGlvbk1vZGUgPSBhLmdldEludChSLnN0eWxlYWJsZS5BY3Rpb25CYXJfbmF2aWdhdGlvbk1vZGUsCisgICAgICAgICAgICAgICAgQWN0aW9uQmFyLk5BVklHQVRJT05fTU9ERV9TVEFOREFSRCk7CisgICAgICAgIG1UaXRsZSA9IGEuZ2V0VGV4dChSLnN0eWxlYWJsZS5BY3Rpb25CYXJfdGl0bGUpOworICAgICAgICBtU3VidGl0bGUgPSBhLmdldFRleHQoUi5zdHlsZWFibGUuQWN0aW9uQmFyX3N1YnRpdGxlKTsKKyAgICAgICAgbURpc3BsYXlPcHRpb25zID0gYS5nZXRJbnQoUi5zdHlsZWFibGUuQWN0aW9uQmFyX2Rpc3BsYXlPcHRpb25zLCBESVNQTEFZX0RFRkFVTFQpOworICAgICAgICAKKyAgICAgICAgbUxvZ28gPSBhLmdldERyYXdhYmxlKFIuc3R5bGVhYmxlLkFjdGlvbkJhcl9sb2dvKTsKKyAgICAgICAgaWYgKG1Mb2dvID09IG51bGwpIHsKKyAgICAgICAgICAgIG1Mb2dvID0gaW5mby5sb2FkTG9nbyhwbSk7CisgICAgICAgIH0KKyAgICAgICAgbUljb24gPSBhLmdldERyYXdhYmxlKFIuc3R5bGVhYmxlLkFjdGlvbkJhcl9pY29uKTsKKyAgICAgICAgaWYgKG1JY29uID09IG51bGwpIHsKKyAgICAgICAgICAgIG1JY29uID0gaW5mby5sb2FkSWNvbihwbSk7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIERyYXdhYmxlIGJhY2tncm91bmQgPSBhLmdldERyYXdhYmxlKFIuc3R5bGVhYmxlLkFjdGlvbkJhcl9iYWNrZ3JvdW5kKTsKKyAgICAgICAgaWYgKGJhY2tncm91bmQgIT0gbnVsbCkgeworICAgICAgICAgICAgc2V0QmFja2dyb3VuZERyYXdhYmxlKGJhY2tncm91bmQpOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBtVGl0bGVTdHlsZVJlcyA9IGEuZ2V0UmVzb3VyY2VJZChSLnN0eWxlYWJsZS5BY3Rpb25CYXJfdGl0bGVUZXh0U3R5bGUsIDApOworICAgICAgICBtU3VidGl0bGVTdHlsZVJlcyA9IGEuZ2V0UmVzb3VyY2VJZChSLnN0eWxlYWJsZS5BY3Rpb25CYXJfc3VidGl0bGVUZXh0U3R5bGUsIDApOworCisgICAgICAgIGZpbmFsIGludCBjdXN0b21OYXZJZCA9IGEuZ2V0UmVzb3VyY2VJZChSLnN0eWxlYWJsZS5BY3Rpb25CYXJfY3VzdG9tTmF2aWdhdGlvbkxheW91dCwgMCk7CisgICAgICAgIGlmIChjdXN0b21OYXZJZCAhPSAwKSB7CisgICAgICAgICAgICBMYXlvdXRJbmZsYXRlciBpbmZsYXRlciA9IExheW91dEluZmxhdGVyLmZyb20oY29udGV4dCk7CisgICAgICAgICAgICBtQ3VzdG9tTmF2VmlldyA9IChWaWV3KSBpbmZsYXRlci5pbmZsYXRlKGN1c3RvbU5hdklkLCBudWxsKTsKKyAgICAgICAgICAgIG1OYXZpZ2F0aW9uTW9kZSA9IEFjdGlvbkJhci5OQVZJR0FUSU9OX01PREVfQ1VTVE9NOworICAgICAgICB9CisKKyAgICAgICAgbUNvbnRlbnRIZWlnaHQgPSBhLmdldExheW91dERpbWVuc2lvbihSLnN0eWxlYWJsZS5BY3Rpb25CYXJfaGVpZ2h0LCAwKTsKKworICAgICAgICBhLnJlY3ljbGUoKTsKKworICAgICAgICAvLyBUT0RPOiBTZXQgdGhpcyBpbiB0aGUgdGhlbWUKKyAgICAgICAgbVNwYWNpbmcgPSAoaW50KSAoQ09OVEVOVF9TUEFDSU5HX0RJUCAqIG1ldHJpY3MuZGVuc2l0eSArIDAuNWYpOworICAgICAgICBtQWN0aW9uU3BhY2luZyA9IChpbnQpIChDT05URU5UX0FDVElPTl9TUEFDSU5HX0RJUCAqIG1ldHJpY3MuZGVuc2l0eSArIDAuNWYpOworICAgICAgICAKKyAgICAgICAgaWYgKG1Mb2dvICE9IG51bGwgfHwgbUljb24gIT0gbnVsbCB8fCBtVGl0bGUgIT0gbnVsbCkgeworICAgICAgICAgICAgbUxvZ29OYXZJdGVtID0gbmV3IEFjdGlvbk1lbnVJdGVtKGNvbnRleHQsIDAsIGFuZHJvaWQuUi5pZC5ob21lLCAwLCAwLCBtVGl0bGUpOworICAgICAgICAgICAgbUhvbWVDbGlja0xpc3RlbmVyID0gbmV3IE9uQ2xpY2tMaXN0ZW5lcigpIHsKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkNsaWNrKFZpZXcgdikgeworICAgICAgICAgICAgICAgICAgICBDb250ZXh0IGNvbnRleHQgPSBnZXRDb250ZXh0KCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChjb250ZXh0IGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFjdGl2aXR5IGFjdGl2aXR5ID0gKEFjdGl2aXR5KSBjb250ZXh0OworICAgICAgICAgICAgICAgICAgICAgICAgYWN0aXZpdHkub25PcHRpb25zSXRlbVNlbGVjdGVkKG1Mb2dvTmF2SXRlbSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9OworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIEFjdGlvbk1vZGUgc3RhcnRBY3Rpb25Nb2RlRm9yQ2hpbGQoVmlldyBjaGlsZCwgQWN0aW9uTW9kZS5DYWxsYmFjayBjYWxsYmFjaykgeworICAgICAgICAvLyBObyBzdGFydGluZyBhbiBhY3Rpb24gbW9kZSBmb3IgYW4gYWN0aW9uIGJhciBjaGlsZCEgKFdoZXJlIHdvdWxkIGl0IGdvPykKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0Q2FsbGJhY2soTmF2aWdhdGlvbkNhbGxiYWNrIGNhbGxiYWNrKSB7CisgICAgICAgIG1DYWxsYmFjayA9IGNhbGxiYWNrOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldE1lbnUoTWVudSBtZW51KSB7CisgICAgICAgIE1lbnVCdWlsZGVyIGJ1aWxkZXIgPSAoTWVudUJ1aWxkZXIpIG1lbnU7CisgICAgICAgIG1PcHRpb25zTWVudSA9IGJ1aWxkZXI7CisgICAgICAgIGlmIChtTWVudVZpZXcgIT0gbnVsbCkgeworICAgICAgICAgICAgcmVtb3ZlVmlldyhtTWVudVZpZXcpOworICAgICAgICB9CisgICAgICAgIGZpbmFsIEFjdGlvbk1lbnVWaWV3IG1lbnVWaWV3ID0gKEFjdGlvbk1lbnVWaWV3KSBidWlsZGVyLmdldE1lbnVWaWV3KAorICAgICAgICAgICAgICAgIE1lbnVCdWlsZGVyLlRZUEVfQUNUSU9OX0JVVFRPTiwgbnVsbCk7CisgICAgICAgIG1BY3Rpb25TcGFjaW5nID0gbWVudVZpZXcuZ2V0SXRlbU1hcmdpbigpOworICAgICAgICBmaW5hbCBMYXlvdXRQYXJhbXMgbGF5b3V0UGFyYW1zID0gbmV3IExheW91dFBhcmFtcyhMYXlvdXRQYXJhbXMuV1JBUF9DT05URU5ULAorICAgICAgICAgICAgICAgIExheW91dFBhcmFtcy5NQVRDSF9QQVJFTlQpOworICAgICAgICBtZW51Vmlldy5zZXRMYXlvdXRQYXJhbXMobGF5b3V0UGFyYW1zKTsKKyAgICAgICAgYWRkVmlldyhtZW51Vmlldyk7CisgICAgICAgIG1NZW51VmlldyA9IG1lbnVWaWV3OworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIHNob3dPdmVyZmxvd01lbnUoKSB7CisgICAgICAgIGlmIChtTWVudVZpZXcgIT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIG1NZW51Vmlldy5zaG93T3ZlcmZsb3dNZW51KCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHBvc3RTaG93T3ZlcmZsb3dNZW51KCkgeworICAgICAgICBwb3N0KG5ldyBSdW5uYWJsZSgpIHsKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICBzaG93T3ZlcmZsb3dNZW51KCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGhpZGVPdmVyZmxvd01lbnUoKSB7CisgICAgICAgIGlmIChtTWVudVZpZXcgIT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIG1NZW51Vmlldy5oaWRlT3ZlcmZsb3dNZW51KCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGlzT3ZlcmZsb3dNZW51U2hvd2luZygpIHsKKyAgICAgICAgaWYgKG1NZW51VmlldyAhPSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gbU1lbnVWaWV3LmlzT3ZlcmZsb3dNZW51U2hvd2luZygpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBpc092ZXJmbG93UmVzZXJ2ZWQoKSB7CisgICAgICAgIHJldHVybiBtTWVudVZpZXcgIT0gbnVsbCAmJiBtTWVudVZpZXcuaXNPdmVyZmxvd1Jlc2VydmVkKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0Q3VzdG9tTmF2aWdhdGlvblZpZXcoVmlldyB2aWV3KSB7CisgICAgICAgIG1DdXN0b21OYXZWaWV3ID0gdmlldzsKKyAgICAgICAgaWYgKHZpZXcgIT0gbnVsbCkgeworICAgICAgICAgICAgc2V0TmF2aWdhdGlvbk1vZGUoQWN0aW9uQmFyLk5BVklHQVRJT05fTU9ERV9DVVNUT00pOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIENoYXJTZXF1ZW5jZSBnZXRUaXRsZSgpIHsKKyAgICAgICAgcmV0dXJuIG1UaXRsZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGFjdGlvbiBiYXIgdGl0bGUuIFRoaXMgd2lsbCBhbHdheXMgcmVwbGFjZSBvciBvdmVycmlkZSB3aW5kb3cgdGl0bGVzLgorICAgICAqIEBwYXJhbSB0aXRsZSBUaXRsZSB0byBzZXQKKyAgICAgKgorICAgICAqIEBzZWUgI3NldFdpbmRvd1RpdGxlKENoYXJTZXF1ZW5jZSkKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRUaXRsZShDaGFyU2VxdWVuY2UgdGl0bGUpIHsKKyAgICAgICAgbVVzZXJUaXRsZSA9IHRydWU7CisgICAgICAgIHNldFRpdGxlSW1wbCh0aXRsZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSB3aW5kb3cgdGl0bGUuIEEgd2luZG93IHRpdGxlIHdpbGwgYWx3YXlzIGJlIHJlcGxhY2VkIG9yIG92ZXJyaWRkZW4gYnkgYSB1c2VyIHRpdGxlLgorICAgICAqIEBwYXJhbSB0aXRsZSBUaXRsZSB0byBzZXQKKyAgICAgKgorICAgICAqIEBzZWUgI3NldFRpdGxlKENoYXJTZXF1ZW5jZSkKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRXaW5kb3dUaXRsZShDaGFyU2VxdWVuY2UgdGl0bGUpIHsKKyAgICAgICAgaWYgKCFtVXNlclRpdGxlKSB7CisgICAgICAgICAgICBzZXRUaXRsZUltcGwodGl0bGUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHNldFRpdGxlSW1wbChDaGFyU2VxdWVuY2UgdGl0bGUpIHsKKyAgICAgICAgbVRpdGxlID0gdGl0bGU7CisgICAgICAgIGlmIChtVGl0bGVWaWV3ICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1UaXRsZVZpZXcuc2V0VGV4dCh0aXRsZSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1Mb2dvTmF2SXRlbSAhPSBudWxsKSB7CisgICAgICAgICAgICBtTG9nb05hdkl0ZW0uc2V0VGl0bGUodGl0bGUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIENoYXJTZXF1ZW5jZSBnZXRTdWJ0aXRsZSgpIHsKKyAgICAgICAgcmV0dXJuIG1TdWJ0aXRsZTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRTdWJ0aXRsZShDaGFyU2VxdWVuY2Ugc3VidGl0bGUpIHsKKyAgICAgICAgbVN1YnRpdGxlID0gc3VidGl0bGU7CisgICAgICAgIGlmIChtU3VidGl0bGVWaWV3ICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1TdWJ0aXRsZVZpZXcuc2V0VGV4dChzdWJ0aXRsZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXREaXNwbGF5T3B0aW9ucyhpbnQgb3B0aW9ucykgeworICAgICAgICBmaW5hbCBpbnQgZmxhZ3NDaGFuZ2VkID0gb3B0aW9ucyBeIG1EaXNwbGF5T3B0aW9uczsKKyAgICAgICAgbURpc3BsYXlPcHRpb25zID0gb3B0aW9uczsKKyAgICAgICAgaWYgKChmbGFnc0NoYW5nZWQgJiBESVNQTEFZX1JFTEFZT1VUX01BU0spICE9IDApIHsKKyAgICAgICAgICAgIGZpbmFsIGludCB2aXMgPSAob3B0aW9ucyAmIEFjdGlvbkJhci5ESVNQTEFZX0hJREVfSE9NRSkgIT0gMCA/IEdPTkUgOiBWSVNJQkxFOworICAgICAgICAgICAgaWYgKG1Mb2dvVmlldyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgbUxvZ29WaWV3LnNldFZpc2liaWxpdHkodmlzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChtSWNvblZpZXcgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG1JY29uVmlldy5zZXRWaXNpYmlsaXR5KHZpcyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAKKyAgICAgICAgICAgIHJlcXVlc3RMYXlvdXQoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGludmFsaWRhdGUoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldE5hdmlnYXRpb25Nb2RlKGludCBtb2RlKSB7CisgICAgICAgIGZpbmFsIGludCBvbGRNb2RlID0gbU5hdmlnYXRpb25Nb2RlOworICAgICAgICBpZiAobW9kZSAhPSBvbGRNb2RlKSB7CisgICAgICAgICAgICBzd2l0Y2ggKG9sZE1vZGUpIHsKKyAgICAgICAgICAgIGNhc2UgQWN0aW9uQmFyLk5BVklHQVRJT05fTU9ERV9TVEFOREFSRDoKKyAgICAgICAgICAgICAgICBpZiAobVRpdGxlTGF5b3V0ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgcmVtb3ZlVmlldyhtVGl0bGVMYXlvdXQpOworICAgICAgICAgICAgICAgICAgICBtVGl0bGVMYXlvdXQgPSBudWxsOworICAgICAgICAgICAgICAgICAgICBtVGl0bGVWaWV3ID0gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgbVN1YnRpdGxlVmlldyA9IG51bGw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBBY3Rpb25CYXIuTkFWSUdBVElPTl9NT0RFX0RST1BET1dOX0xJU1Q6CisgICAgICAgICAgICAgICAgaWYgKG1TcGlubmVyICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgcmVtb3ZlVmlldyhtU3Bpbm5lcik7CisgICAgICAgICAgICAgICAgICAgIG1TcGlubmVyID0gbnVsbDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEFjdGlvbkJhci5OQVZJR0FUSU9OX01PREVfQ1VTVE9NOgorICAgICAgICAgICAgICAgIGlmIChtQ3VzdG9tTmF2VmlldyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIHJlbW92ZVZpZXcobUN1c3RvbU5hdlZpZXcpOworICAgICAgICAgICAgICAgICAgICBtQ3VzdG9tTmF2VmlldyA9IG51bGw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBBY3Rpb25CYXIuTkFWSUdBVElPTl9NT0RFX1RBQlM6CisgICAgICAgICAgICAgICAgaWYgKG1UYWJMYXlvdXQgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICByZW1vdmVWaWV3KG1UYWJTY3JvbGxWaWV3KTsKKyAgICAgICAgICAgICAgICAgICAgbVRhYkxheW91dCA9IG51bGw7CisgICAgICAgICAgICAgICAgICAgIG1UYWJTY3JvbGxWaWV3ID0gbnVsbDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICAKKyAgICAgICAgICAgIHN3aXRjaCAobW9kZSkgeworICAgICAgICAgICAgY2FzZSBBY3Rpb25CYXIuTkFWSUdBVElPTl9NT0RFX1NUQU5EQVJEOgorICAgICAgICAgICAgICAgIGluaXRUaXRsZSgpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBBY3Rpb25CYXIuTkFWSUdBVElPTl9NT0RFX0RST1BET1dOX0xJU1Q6CisgICAgICAgICAgICAgICAgbVNwaW5uZXIgPSBuZXcgU3Bpbm5lcihtQ29udGV4dCwgbnVsbCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuYXR0ci5kcm9wRG93blNwaW5uZXJTdHlsZSk7CisgICAgICAgICAgICAgICAgbVNwaW5uZXIuc2V0T25JdGVtU2VsZWN0ZWRMaXN0ZW5lcihtTmF2SXRlbVNlbGVjdGVkTGlzdGVuZXIpOworICAgICAgICAgICAgICAgIGFkZFZpZXcobVNwaW5uZXIpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBBY3Rpb25CYXIuTkFWSUdBVElPTl9NT0RFX0NVU1RPTToKKyAgICAgICAgICAgICAgICBhZGRWaWV3KG1DdXN0b21OYXZWaWV3KTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQWN0aW9uQmFyLk5BVklHQVRJT05fTU9ERV9UQUJTOgorICAgICAgICAgICAgICAgIG1UYWJTY3JvbGxWaWV3ID0gbmV3IEhvcml6b250YWxTY3JvbGxWaWV3KGdldENvbnRleHQoKSk7CisgICAgICAgICAgICAgICAgbVRhYkxheW91dCA9IG5ldyBMaW5lYXJMYXlvdXQoZ2V0Q29udGV4dCgpLCBudWxsLAorICAgICAgICAgICAgICAgICAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5hdHRyLmFjdGlvbkJhclRhYkJhclN0eWxlKTsKKyAgICAgICAgICAgICAgICBtVGFiU2Nyb2xsVmlldy5hZGRWaWV3KG1UYWJMYXlvdXQpOworICAgICAgICAgICAgICAgIGFkZFZpZXcobVRhYlNjcm9sbFZpZXcpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbU5hdmlnYXRpb25Nb2RlID0gbW9kZTsKKyAgICAgICAgICAgIHJlcXVlc3RMYXlvdXQoKTsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICBwdWJsaWMgdm9pZCBzZXREcm9wZG93bkFkYXB0ZXIoU3Bpbm5lckFkYXB0ZXIgYWRhcHRlcikgeworICAgICAgICBtU3Bpbm5lci5zZXRBZGFwdGVyKGFkYXB0ZXIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldERyb3Bkb3duU2VsZWN0ZWRQb3NpdGlvbihpbnQgcG9zaXRpb24pIHsKKyAgICAgICAgbVNwaW5uZXIuc2V0U2VsZWN0aW9uKHBvc2l0aW9uKTsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGdldERyb3Bkb3duU2VsZWN0ZWRQb3NpdGlvbigpIHsKKyAgICAgICAgcmV0dXJuIG1TcGlubmVyLmdldFNlbGVjdGVkSXRlbVBvc2l0aW9uKCk7CisgICAgfQorCisgICAgcHVibGljIFZpZXcgZ2V0Q3VzdG9tTmF2aWdhdGlvblZpZXcoKSB7CisgICAgICAgIHJldHVybiBtQ3VzdG9tTmF2VmlldzsKKyAgICB9CisgICAgCisgICAgcHVibGljIGludCBnZXROYXZpZ2F0aW9uTW9kZSgpIHsKKyAgICAgICAgcmV0dXJuIG1OYXZpZ2F0aW9uTW9kZTsKKyAgICB9CisgICAgCisgICAgcHVibGljIGludCBnZXREaXNwbGF5T3B0aW9ucygpIHsKKyAgICAgICAgcmV0dXJuIG1EaXNwbGF5T3B0aW9uczsKKyAgICB9CisKKyAgICBwcml2YXRlIFRhYlZpZXcgY3JlYXRlVGFiVmlldyhBY3Rpb25CYXIuVGFiIHRhYikgeworICAgICAgICBmaW5hbCBUYWJWaWV3IHRhYlZpZXcgPSBuZXcgVGFiVmlldyhnZXRDb250ZXh0KCksIHRhYik7CisgICAgICAgIHRhYlZpZXcuc2V0Rm9jdXNhYmxlKHRydWUpOworCisgICAgICAgIGlmIChtVGFiQ2xpY2tMaXN0ZW5lciA9PSBudWxsKSB7CisgICAgICAgICAgICBtVGFiQ2xpY2tMaXN0ZW5lciA9IG5ldyBUYWJDbGlja0xpc3RlbmVyKCk7CisgICAgICAgIH0KKyAgICAgICAgdGFiVmlldy5zZXRPbkNsaWNrTGlzdGVuZXIobVRhYkNsaWNrTGlzdGVuZXIpOworICAgICAgICByZXR1cm4gdGFiVmlldzsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBhZGRUYWIoQWN0aW9uQmFyLlRhYiB0YWIpIHsKKyAgICAgICAgZmluYWwgYm9vbGVhbiBpc0ZpcnN0ID0gbVRhYkxheW91dC5nZXRDaGlsZENvdW50KCkgPT0gMDsKKyAgICAgICAgVmlldyB0YWJWaWV3ID0gY3JlYXRlVGFiVmlldyh0YWIpOworICAgICAgICBtVGFiTGF5b3V0LmFkZFZpZXcodGFiVmlldyk7CisgICAgICAgIGlmIChpc0ZpcnN0KSB7CisgICAgICAgICAgICB0YWJWaWV3LnNldFNlbGVjdGVkKHRydWUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgYWRkVGFiKEFjdGlvbkJhci5UYWIgdGFiLCBpbnQgcG9zaXRpb24pIHsKKyAgICAgICAgZmluYWwgYm9vbGVhbiBpc0ZpcnN0ID0gbVRhYkxheW91dC5nZXRDaGlsZENvdW50KCkgPT0gMDsKKyAgICAgICAgZmluYWwgVGFiVmlldyB0YWJWaWV3ID0gY3JlYXRlVGFiVmlldyh0YWIpOworICAgICAgICBtVGFiTGF5b3V0LmFkZFZpZXcodGFiVmlldywgcG9zaXRpb24pOworICAgICAgICBpZiAoaXNGaXJzdCkgeworICAgICAgICAgICAgdGFiVmlldy5zZXRTZWxlY3RlZCh0cnVlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHJlbW92ZVRhYkF0KGludCBwb3NpdGlvbikgeworICAgICAgICBtVGFiTGF5b3V0LnJlbW92ZVZpZXdBdChwb3NpdGlvbik7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIExheW91dFBhcmFtcyBnZW5lcmF0ZURlZmF1bHRMYXlvdXRQYXJhbXMoKSB7CisgICAgICAgIC8vIFVzZWQgYnkgY3VzdG9tIG5hdiB2aWV3cyBpZiB0aGV5IGRvbid0IHN1cHBseSBsYXlvdXQgcGFyYW1zLiBFdmVyeXRoaW5nIGVsc2UKKyAgICAgICAgLy8gYWRkZWQgdG8gYW4gQWN0aW9uQmFyVmlldyBzaG91bGQgaGF2ZSB0aGVtIGFscmVhZHkuCisgICAgICAgIHJldHVybiBuZXcgTGF5b3V0UGFyYW1zKExheW91dFBhcmFtcy5NQVRDSF9QQVJFTlQsIExheW91dFBhcmFtcy5XUkFQX0NPTlRFTlQpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG9uRmluaXNoSW5mbGF0ZSgpIHsKKyAgICAgICAgc3VwZXIub25GaW5pc2hJbmZsYXRlKCk7CisKKyAgICAgICAgaWYgKChtRGlzcGxheU9wdGlvbnMgJiBBY3Rpb25CYXIuRElTUExBWV9ISURFX0hPTUUpID09IDApIHsKKyAgICAgICAgICAgIGlmIChtTG9nbyAhPSBudWxsICYmIChtRGlzcGxheU9wdGlvbnMgJiBBY3Rpb25CYXIuRElTUExBWV9VU0VfTE9HTykgIT0gMCkgeworICAgICAgICAgICAgICAgIG1Mb2dvVmlldyA9IG5ldyBJbWFnZVZpZXcoZ2V0Q29udGV4dCgpKTsKKyAgICAgICAgICAgICAgICBtTG9nb1ZpZXcuc2V0QWRqdXN0Vmlld0JvdW5kcyh0cnVlKTsKKyAgICAgICAgICAgICAgICBtTG9nb1ZpZXcuc2V0TGF5b3V0UGFyYW1zKG5ldyBMYXlvdXRQYXJhbXMoTGF5b3V0UGFyYW1zLldSQVBfQ09OVEVOVCwKKyAgICAgICAgICAgICAgICAgICAgICAgIExheW91dFBhcmFtcy5NQVRDSF9QQVJFTlQpKTsKKyAgICAgICAgICAgICAgICBtTG9nb1ZpZXcuc2V0SW1hZ2VEcmF3YWJsZShtTG9nbyk7CisgICAgICAgICAgICAgICAgbUxvZ29WaWV3LnNldENsaWNrYWJsZSh0cnVlKTsKKyAgICAgICAgICAgICAgICBtTG9nb1ZpZXcuc2V0Rm9jdXNhYmxlKHRydWUpOworICAgICAgICAgICAgICAgIG1Mb2dvVmlldy5zZXRPbkNsaWNrTGlzdGVuZXIobUhvbWVDbGlja0xpc3RlbmVyKTsKKyAgICAgICAgICAgICAgICBhZGRWaWV3KG1Mb2dvVmlldyk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKG1JY29uICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBtSWNvblZpZXcgPSBuZXcgSW1hZ2VWaWV3KGdldENvbnRleHQoKSk7CisgICAgICAgICAgICAgICAgbUljb25WaWV3LnNldEFkanVzdFZpZXdCb3VuZHModHJ1ZSk7CisgICAgICAgICAgICAgICAgbUljb25WaWV3LnNldExheW91dFBhcmFtcyhuZXcgTGF5b3V0UGFyYW1zKExheW91dFBhcmFtcy5XUkFQX0NPTlRFTlQsCisgICAgICAgICAgICAgICAgICAgICAgICBMYXlvdXRQYXJhbXMuTUFUQ0hfUEFSRU5UKSk7CisgICAgICAgICAgICAgICAgbUljb25WaWV3LnNldEltYWdlRHJhd2FibGUobUljb24pOworICAgICAgICAgICAgICAgIG1JY29uVmlldy5zZXRDbGlja2FibGUodHJ1ZSk7CisgICAgICAgICAgICAgICAgbUljb25WaWV3LnNldEZvY3VzYWJsZSh0cnVlKTsKKyAgICAgICAgICAgICAgICBtSWNvblZpZXcuc2V0T25DbGlja0xpc3RlbmVyKG1Ib21lQ2xpY2tMaXN0ZW5lcik7CisgICAgICAgICAgICAgICAgYWRkVmlldyhtSWNvblZpZXcpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgc3dpdGNoIChtTmF2aWdhdGlvbk1vZGUpIHsKKyAgICAgICAgY2FzZSBBY3Rpb25CYXIuTkFWSUdBVElPTl9NT0RFX1NUQU5EQVJEOgorICAgICAgICAgICAgaWYgKG1Mb2dvVmlldyA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgaW5pdFRpdGxlKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIAorICAgICAgICBjYXNlIEFjdGlvbkJhci5OQVZJR0FUSU9OX01PREVfRFJPUERPV05fTElTVDoKKyAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgIkluZmxhdGluZyBkcm9wZG93biBsaXN0IG5hdmlnYXRpb24gaXNuJ3Qgc3VwcG9ydGVkIHlldCEiKTsKKyAgICAgICAgICAgIAorICAgICAgICBjYXNlIEFjdGlvbkJhci5OQVZJR0FUSU9OX01PREVfVEFCUzoKKyAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgIkluZmxhdGluZyB0YWIgbmF2aWdhdGlvbiBpc24ndCBzdXBwb3J0ZWQgeWV0ISIpOworICAgICAgICAgICAgCisgICAgICAgIGNhc2UgQWN0aW9uQmFyLk5BVklHQVRJT05fTU9ERV9DVVNUT006CisgICAgICAgICAgICBpZiAobUN1c3RvbU5hdlZpZXcgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGFkZFZpZXcobUN1c3RvbU5hdlZpZXcpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgcHJpdmF0ZSB2b2lkIGluaXRUaXRsZSgpIHsKKyAgICAgICAgTGF5b3V0SW5mbGF0ZXIgaW5mbGF0ZXIgPSBMYXlvdXRJbmZsYXRlci5mcm9tKGdldENvbnRleHQoKSk7CisgICAgICAgIG1UaXRsZUxheW91dCA9IChMaW5lYXJMYXlvdXQpIGluZmxhdGVyLmluZmxhdGUoUi5sYXlvdXQuYWN0aW9uX2Jhcl90aXRsZV9pdGVtLCBudWxsKTsKKyAgICAgICAgbVRpdGxlVmlldyA9IChUZXh0VmlldykgbVRpdGxlTGF5b3V0LmZpbmRWaWV3QnlJZChSLmlkLmFjdGlvbl9iYXJfdGl0bGUpOworICAgICAgICBtU3VidGl0bGVWaWV3ID0gKFRleHRWaWV3KSBtVGl0bGVMYXlvdXQuZmluZFZpZXdCeUlkKFIuaWQuYWN0aW9uX2Jhcl9zdWJ0aXRsZSk7CisKKyAgICAgICAgaWYgKG1UaXRsZVN0eWxlUmVzICE9IDApIHsKKyAgICAgICAgICAgIG1UaXRsZVZpZXcuc2V0VGV4dEFwcGVhcmFuY2UobUNvbnRleHQsIG1UaXRsZVN0eWxlUmVzKTsKKyAgICAgICAgfQorICAgICAgICBpZiAobVRpdGxlICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1UaXRsZVZpZXcuc2V0VGV4dChtVGl0bGUpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG1TdWJ0aXRsZVN0eWxlUmVzICE9IDApIHsKKyAgICAgICAgICAgIG1TdWJ0aXRsZVZpZXcuc2V0VGV4dEFwcGVhcmFuY2UobUNvbnRleHQsIG1TdWJ0aXRsZVN0eWxlUmVzKTsKKyAgICAgICAgfQorICAgICAgICBpZiAobVN1YnRpdGxlICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1TdWJ0aXRsZVZpZXcuc2V0VGV4dChtU3VidGl0bGUpOworICAgICAgICAgICAgbVN1YnRpdGxlVmlldy5zZXRWaXNpYmlsaXR5KFZJU0lCTEUpOworICAgICAgICB9CisKKyAgICAgICAgYWRkVmlldyhtVGl0bGVMYXlvdXQpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFRhYlNlbGVjdGVkKGludCBwb3NpdGlvbikgeworICAgICAgICBmaW5hbCBpbnQgdGFiQ291bnQgPSBtVGFiTGF5b3V0LmdldENoaWxkQ291bnQoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0YWJDb3VudDsgaSsrKSB7CisgICAgICAgICAgICBmaW5hbCBWaWV3IGNoaWxkID0gbVRhYkxheW91dC5nZXRDaGlsZEF0KGkpOworICAgICAgICAgICAgY2hpbGQuc2V0U2VsZWN0ZWQoaSA9PSBwb3NpdGlvbik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRDb250ZXh0VmlldyhBY3Rpb25CYXJDb250ZXh0VmlldyB2aWV3KSB7CisgICAgICAgIG1Db250ZXh0VmlldyA9IHZpZXc7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25NZWFzdXJlKGludCB3aWR0aE1lYXN1cmVTcGVjLCBpbnQgaGVpZ2h0TWVhc3VyZVNwZWMpIHsKKyAgICAgICAgaW50IHdpZHRoTW9kZSA9IE1lYXN1cmVTcGVjLmdldE1vZGUod2lkdGhNZWFzdXJlU3BlYyk7CisgICAgICAgIGlmICh3aWR0aE1vZGUgIT0gTWVhc3VyZVNwZWMuRVhBQ1RMWSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbihnZXRDbGFzcygpLmdldFNpbXBsZU5hbWUoKSArICIgY2FuIG9ubHkgYmUgdXNlZCAiICsKKyAgICAgICAgICAgICAgICAgICAgIndpdGggYW5kcm9pZDpsYXlvdXRfd2lkdGg9XCJtYXRjaF9wYXJlbnRcIiAob3IgZmlsbF9wYXJlbnQpIik7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIGludCBoZWlnaHRNb2RlID0gTWVhc3VyZVNwZWMuZ2V0TW9kZShoZWlnaHRNZWFzdXJlU3BlYyk7CisgICAgICAgIGlmIChoZWlnaHRNb2RlICE9IE1lYXN1cmVTcGVjLkFUX01PU1QpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oZ2V0Q2xhc3MoKS5nZXRTaW1wbGVOYW1lKCkgKyAiIGNhbiBvbmx5IGJlIHVzZWQgIiArCisgICAgICAgICAgICAgICAgICAgICJ3aXRoIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD1cIndyYXBfY29udGVudFwiIik7CisgICAgICAgIH0KKworICAgICAgICBpbnQgY29udGVudFdpZHRoID0gTWVhc3VyZVNwZWMuZ2V0U2l6ZSh3aWR0aE1lYXN1cmVTcGVjKTsKKworICAgICAgICBpbnQgbWF4SGVpZ2h0ID0gbUNvbnRlbnRIZWlnaHQgPiAwID8KKyAgICAgICAgICAgICAgICBtQ29udGVudEhlaWdodCA6IE1lYXN1cmVTcGVjLmdldFNpemUoaGVpZ2h0TWVhc3VyZVNwZWMpOworICAgICAgICAKKyAgICAgICAgZmluYWwgaW50IHZlcnRpY2FsUGFkZGluZyA9IGdldFBhZGRpbmdUb3AoKSArIGdldFBhZGRpbmdCb3R0b20oKTsKKyAgICAgICAgaW50IGF2YWlsYWJsZVdpZHRoID0gY29udGVudFdpZHRoIC0gZ2V0UGFkZGluZ0xlZnQoKSAtIGdldFBhZGRpbmdSaWdodCgpOworICAgICAgICBmaW5hbCBpbnQgaGVpZ2h0ID0gbWF4SGVpZ2h0IC0gdmVydGljYWxQYWRkaW5nOworICAgICAgICBmaW5hbCBpbnQgY2hpbGRTcGVjSGVpZ2h0ID0gTWVhc3VyZVNwZWMubWFrZU1lYXN1cmVTcGVjKGhlaWdodCwgTWVhc3VyZVNwZWMuQVRfTU9TVCk7CisKKyAgICAgICAgaWYgKG1Mb2dvVmlldyAhPSBudWxsICYmIG1Mb2dvVmlldy5nZXRWaXNpYmlsaXR5KCkgIT0gR09ORSkgeworICAgICAgICAgICAgYXZhaWxhYmxlV2lkdGggPSBtZWFzdXJlQ2hpbGRWaWV3KG1Mb2dvVmlldywgYXZhaWxhYmxlV2lkdGgsIGNoaWxkU3BlY0hlaWdodCwgbVNwYWNpbmcpOworICAgICAgICB9CisgICAgICAgIGlmIChtSWNvblZpZXcgIT0gbnVsbCAmJiBtSWNvblZpZXcuZ2V0VmlzaWJpbGl0eSgpICE9IEdPTkUpIHsKKyAgICAgICAgICAgIGF2YWlsYWJsZVdpZHRoID0gbWVhc3VyZUNoaWxkVmlldyhtSWNvblZpZXcsIGF2YWlsYWJsZVdpZHRoLCBjaGlsZFNwZWNIZWlnaHQsIG1TcGFjaW5nKTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgaWYgKG1NZW51VmlldyAhPSBudWxsKSB7CisgICAgICAgICAgICBhdmFpbGFibGVXaWR0aCA9IG1lYXN1cmVDaGlsZFZpZXcobU1lbnVWaWV3LCBhdmFpbGFibGVXaWR0aCwKKyAgICAgICAgICAgICAgICAgICAgY2hpbGRTcGVjSGVpZ2h0LCAwKTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgc3dpdGNoIChtTmF2aWdhdGlvbk1vZGUpIHsKKyAgICAgICAgY2FzZSBBY3Rpb25CYXIuTkFWSUdBVElPTl9NT0RFX1NUQU5EQVJEOgorICAgICAgICAgICAgaWYgKG1UaXRsZUxheW91dCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgbWVhc3VyZUNoaWxkVmlldyhtVGl0bGVMYXlvdXQsIGF2YWlsYWJsZVdpZHRoLCBjaGlsZFNwZWNIZWlnaHQsIG1TcGFjaW5nKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEFjdGlvbkJhci5OQVZJR0FUSU9OX01PREVfRFJPUERPV05fTElTVDoKKyAgICAgICAgICAgIGlmIChtU3Bpbm5lciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgbVNwaW5uZXIubWVhc3VyZSgKKyAgICAgICAgICAgICAgICAgICAgICAgIE1lYXN1cmVTcGVjLm1ha2VNZWFzdXJlU3BlYyhhdmFpbGFibGVXaWR0aCwgTWVhc3VyZVNwZWMuQVRfTU9TVCksCisgICAgICAgICAgICAgICAgICAgICAgICBNZWFzdXJlU3BlYy5tYWtlTWVhc3VyZVNwZWMoaGVpZ2h0LCBNZWFzdXJlU3BlYy5BVF9NT1NUKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBBY3Rpb25CYXIuTkFWSUdBVElPTl9NT0RFX0NVU1RPTToKKyAgICAgICAgICAgIGlmIChtQ3VzdG9tTmF2VmlldyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgTGF5b3V0UGFyYW1zIGxwID0gbUN1c3RvbU5hdlZpZXcuZ2V0TGF5b3V0UGFyYW1zKCk7CisgICAgICAgICAgICAgICAgZmluYWwgaW50IGN1c3RvbU5hdldpZHRoTW9kZSA9IGxwLndpZHRoICE9IExheW91dFBhcmFtcy5XUkFQX0NPTlRFTlQgPworICAgICAgICAgICAgICAgICAgICAgICAgTWVhc3VyZVNwZWMuRVhBQ1RMWSA6IE1lYXN1cmVTcGVjLkFUX01PU1Q7CisgICAgICAgICAgICAgICAgZmluYWwgaW50IGN1c3RvbU5hdldpZHRoID0gbHAud2lkdGggPj0gMCA/CisgICAgICAgICAgICAgICAgICAgICAgICBNYXRoLm1pbihscC53aWR0aCwgYXZhaWxhYmxlV2lkdGgpIDogYXZhaWxhYmxlV2lkdGg7CisKKyAgICAgICAgICAgICAgICAvLyBJZiB0aGUgYWN0aW9uIGJhciBpcyB3cmFwcGluZyB0byBpdHMgY29udGVudCBoZWlnaHQsIGRvbid0IGFsbG93IGEgY3VzdG9tCisgICAgICAgICAgICAgICAgLy8gdmlldyB0byBNQVRDSF9QQVJFTlQuCisgICAgICAgICAgICAgICAgaW50IGN1c3RvbU5hdkhlaWdodE1vZGU7CisgICAgICAgICAgICAgICAgaWYgKG1Db250ZW50SGVpZ2h0IDw9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgY3VzdG9tTmF2SGVpZ2h0TW9kZSA9IE1lYXN1cmVTcGVjLkFUX01PU1Q7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgY3VzdG9tTmF2SGVpZ2h0TW9kZSA9IGxwLmhlaWdodCAhPSBMYXlvdXRQYXJhbXMuV1JBUF9DT05URU5UID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZWFzdXJlU3BlYy5FWEFDVExZIDogTWVhc3VyZVNwZWMuQVRfTU9TVDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZmluYWwgaW50IGN1c3RvbU5hdkhlaWdodCA9IGxwLmhlaWdodCA+PSAwID8KKyAgICAgICAgICAgICAgICAgICAgICAgIE1hdGgubWluKGxwLmhlaWdodCwgaGVpZ2h0KSA6IGhlaWdodDsKKyAgICAgICAgICAgICAgICBtQ3VzdG9tTmF2Vmlldy5tZWFzdXJlKAorICAgICAgICAgICAgICAgICAgICAgICAgTWVhc3VyZVNwZWMubWFrZU1lYXN1cmVTcGVjKGN1c3RvbU5hdldpZHRoLCBjdXN0b21OYXZXaWR0aE1vZGUpLAorICAgICAgICAgICAgICAgICAgICAgICAgTWVhc3VyZVNwZWMubWFrZU1lYXN1cmVTcGVjKGN1c3RvbU5hdkhlaWdodCwgY3VzdG9tTmF2SGVpZ2h0TW9kZSkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQWN0aW9uQmFyLk5BVklHQVRJT05fTU9ERV9UQUJTOgorICAgICAgICAgICAgaWYgKG1UYWJTY3JvbGxWaWV3ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBtVGFiU2Nyb2xsVmlldy5tZWFzdXJlKAorICAgICAgICAgICAgICAgICAgICAgICAgTWVhc3VyZVNwZWMubWFrZU1lYXN1cmVTcGVjKGF2YWlsYWJsZVdpZHRoLCBNZWFzdXJlU3BlYy5BVF9NT1NUKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIE1lYXN1cmVTcGVjLm1ha2VNZWFzdXJlU3BlYyhoZWlnaHQsIE1lYXN1cmVTcGVjLkVYQUNUTFkpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG1Db250ZW50SGVpZ2h0IDw9IDApIHsKKyAgICAgICAgICAgIGludCBtZWFzdXJlZEhlaWdodCA9IDA7CisgICAgICAgICAgICBmaW5hbCBpbnQgY291bnQgPSBnZXRDaGlsZENvdW50KCk7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKyAgICAgICAgICAgICAgICBWaWV3IHYgPSBnZXRDaGlsZEF0KGkpOworICAgICAgICAgICAgICAgIGludCBwYWRkZWRWaWV3SGVpZ2h0ID0gdi5nZXRNZWFzdXJlZEhlaWdodCgpICsgdmVydGljYWxQYWRkaW5nOworICAgICAgICAgICAgICAgIGlmIChwYWRkZWRWaWV3SGVpZ2h0ID4gbWVhc3VyZWRIZWlnaHQpIHsKKyAgICAgICAgICAgICAgICAgICAgbWVhc3VyZWRIZWlnaHQgPSBwYWRkZWRWaWV3SGVpZ2h0OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNldE1lYXN1cmVkRGltZW5zaW9uKGNvbnRlbnRXaWR0aCwgbWVhc3VyZWRIZWlnaHQpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc2V0TWVhc3VyZWREaW1lbnNpb24oY29udGVudFdpZHRoLCBtYXhIZWlnaHQpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG1Db250ZXh0VmlldyAhPSBudWxsKSB7CisgICAgICAgICAgICBtQ29udGV4dFZpZXcuc2V0SGVpZ2h0KGdldE1lYXN1cmVkSGVpZ2h0KCkpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBpbnQgbWVhc3VyZUNoaWxkVmlldyhWaWV3IGNoaWxkLCBpbnQgYXZhaWxhYmxlV2lkdGgsIGludCBjaGlsZFNwZWNIZWlnaHQsIGludCBzcGFjaW5nKSB7CisgICAgICAgIGNoaWxkLm1lYXN1cmUoTWVhc3VyZVNwZWMubWFrZU1lYXN1cmVTcGVjKGF2YWlsYWJsZVdpZHRoLCBNZWFzdXJlU3BlYy5BVF9NT1NUKSwKKyAgICAgICAgICAgICAgICBjaGlsZFNwZWNIZWlnaHQpOworCisgICAgICAgIGF2YWlsYWJsZVdpZHRoIC09IGNoaWxkLmdldE1lYXN1cmVkV2lkdGgoKTsKKyAgICAgICAgYXZhaWxhYmxlV2lkdGggLT0gc3BhY2luZzsKKworICAgICAgICByZXR1cm4gYXZhaWxhYmxlV2lkdGg7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25MYXlvdXQoYm9vbGVhbiBjaGFuZ2VkLCBpbnQgbCwgaW50IHQsIGludCByLCBpbnQgYikgeworICAgICAgICBpbnQgeCA9IGdldFBhZGRpbmdMZWZ0KCk7CisgICAgICAgIGZpbmFsIGludCB5ID0gZ2V0UGFkZGluZ1RvcCgpOworICAgICAgICBmaW5hbCBpbnQgY29udGVudEhlaWdodCA9IGIgLSB0IC0gZ2V0UGFkZGluZ1RvcCgpIC0gZ2V0UGFkZGluZ0JvdHRvbSgpOworCisgICAgICAgIGlmIChtTG9nb1ZpZXcgIT0gbnVsbCAmJiBtTG9nb1ZpZXcuZ2V0VmlzaWJpbGl0eSgpICE9IEdPTkUpIHsKKyAgICAgICAgICAgIHggKz0gcG9zaXRpb25DaGlsZChtTG9nb1ZpZXcsIHgsIHksIGNvbnRlbnRIZWlnaHQpICsgbVNwYWNpbmc7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1JY29uVmlldyAhPSBudWxsICYmIG1JY29uVmlldy5nZXRWaXNpYmlsaXR5KCkgIT0gR09ORSkgeworICAgICAgICAgICAgeCArPSBwb3NpdGlvbkNoaWxkKG1JY29uVmlldywgeCwgeSwgY29udGVudEhlaWdodCkgKyBtU3BhY2luZzsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgc3dpdGNoIChtTmF2aWdhdGlvbk1vZGUpIHsKKyAgICAgICAgY2FzZSBBY3Rpb25CYXIuTkFWSUdBVElPTl9NT0RFX1NUQU5EQVJEOgorICAgICAgICAgICAgaWYgKG1UaXRsZUxheW91dCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgeCArPSBwb3NpdGlvbkNoaWxkKG1UaXRsZUxheW91dCwgeCwgeSwgY29udGVudEhlaWdodCkgKyBtU3BhY2luZzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEFjdGlvbkJhci5OQVZJR0FUSU9OX01PREVfRFJPUERPV05fTElTVDoKKyAgICAgICAgICAgIGlmIChtU3Bpbm5lciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgeCArPSBwb3NpdGlvbkNoaWxkKG1TcGlubmVyLCB4LCB5LCBjb250ZW50SGVpZ2h0KSArIG1TcGFjaW5nOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQWN0aW9uQmFyLk5BVklHQVRJT05fTU9ERV9DVVNUT006CisgICAgICAgICAgICBpZiAobUN1c3RvbU5hdlZpZXcgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHggKz0gcG9zaXRpb25DaGlsZChtQ3VzdG9tTmF2VmlldywgeCwgeSwgY29udGVudEhlaWdodCkgKyBtU3BhY2luZzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEFjdGlvbkJhci5OQVZJR0FUSU9OX01PREVfVEFCUzoKKyAgICAgICAgICAgIGlmIChtVGFiU2Nyb2xsVmlldyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgeCArPSBwb3NpdGlvbkNoaWxkKG1UYWJTY3JvbGxWaWV3LCB4LCB5LCBjb250ZW50SGVpZ2h0KSArIG1TcGFjaW5nOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgeCA9IHIgLSBsIC0gZ2V0UGFkZGluZ1JpZ2h0KCk7CisKKyAgICAgICAgaWYgKG1NZW51VmlldyAhPSBudWxsKSB7CisgICAgICAgICAgICB4IC09IHBvc2l0aW9uQ2hpbGRJbnZlcnNlKG1NZW51VmlldywgeCArIG1BY3Rpb25TcGFjaW5nLCB5LCBjb250ZW50SGVpZ2h0KQorICAgICAgICAgICAgICAgICAgICAtIG1BY3Rpb25TcGFjaW5nOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBpbnQgcG9zaXRpb25DaGlsZChWaWV3IGNoaWxkLCBpbnQgeCwgaW50IHksIGludCBjb250ZW50SGVpZ2h0KSB7CisgICAgICAgIGludCBjaGlsZFdpZHRoID0gY2hpbGQuZ2V0TWVhc3VyZWRXaWR0aCgpOworICAgICAgICBpbnQgY2hpbGRIZWlnaHQgPSBjaGlsZC5nZXRNZWFzdXJlZEhlaWdodCgpOworICAgICAgICBpbnQgY2hpbGRUb3AgPSB5ICsgKGNvbnRlbnRIZWlnaHQgLSBjaGlsZEhlaWdodCkgLyAyOworCisgICAgICAgIGNoaWxkLmxheW91dCh4LCBjaGlsZFRvcCwgeCArIGNoaWxkV2lkdGgsIGNoaWxkVG9wICsgY2hpbGRIZWlnaHQpOworCisgICAgICAgIHJldHVybiBjaGlsZFdpZHRoOworICAgIH0KKyAgICAKKyAgICBwcml2YXRlIGludCBwb3NpdGlvbkNoaWxkSW52ZXJzZShWaWV3IGNoaWxkLCBpbnQgeCwgaW50IHksIGludCBjb250ZW50SGVpZ2h0KSB7CisgICAgICAgIGludCBjaGlsZFdpZHRoID0gY2hpbGQuZ2V0TWVhc3VyZWRXaWR0aCgpOworICAgICAgICBpbnQgY2hpbGRIZWlnaHQgPSBjaGlsZC5nZXRNZWFzdXJlZEhlaWdodCgpOworICAgICAgICBpbnQgY2hpbGRUb3AgPSB5ICsgKGNvbnRlbnRIZWlnaHQgLSBjaGlsZEhlaWdodCkgLyAyOworCisgICAgICAgIGNoaWxkLmxheW91dCh4IC0gY2hpbGRXaWR0aCwgY2hpbGRUb3AsIHgsIGNoaWxkVG9wICsgY2hpbGRIZWlnaHQpOworCisgICAgICAgIHJldHVybiBjaGlsZFdpZHRoOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIFRhYlZpZXcgZXh0ZW5kcyBMaW5lYXJMYXlvdXQgeworICAgICAgICBwcml2YXRlIEFjdGlvbkJhci5UYWIgbVRhYjsKKworICAgICAgICBwdWJsaWMgVGFiVmlldyhDb250ZXh0IGNvbnRleHQsIEFjdGlvbkJhci5UYWIgdGFiKSB7CisgICAgICAgICAgICBzdXBlcihjb250ZXh0LCBudWxsLCBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmF0dHIuYWN0aW9uQmFyVGFiU3R5bGUpOworICAgICAgICAgICAgbVRhYiA9IHRhYjsKKworICAgICAgICAgICAgZmluYWwgVmlldyBjdXN0b20gPSB0YWIuZ2V0Q3VzdG9tVmlldygpOworICAgICAgICAgICAgaWYgKGN1c3RvbSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgYWRkVmlldyhjdXN0b20pOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvLyBUT0RPIFN0eWxlIHRhYnMgYmFzZWQgb24gdGhlIHRoZW1lCisKKyAgICAgICAgICAgICAgICBmaW5hbCBEcmF3YWJsZSBpY29uID0gdGFiLmdldEljb24oKTsKKyAgICAgICAgICAgICAgICBmaW5hbCBDaGFyU2VxdWVuY2UgdGV4dCA9IHRhYi5nZXRUZXh0KCk7CisKKyAgICAgICAgICAgICAgICBpZiAoaWNvbiAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIEltYWdlVmlldyBpY29uVmlldyA9IG5ldyBJbWFnZVZpZXcoY29udGV4dCk7CisgICAgICAgICAgICAgICAgICAgIGljb25WaWV3LnNldEltYWdlRHJhd2FibGUoaWNvbik7CisgICAgICAgICAgICAgICAgICAgIExheW91dFBhcmFtcyBscCA9IG5ldyBMYXlvdXRQYXJhbXMoTGF5b3V0UGFyYW1zLldSQVBfQ09OVEVOVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBMYXlvdXRQYXJhbXMuV1JBUF9DT05URU5UKTsKKyAgICAgICAgICAgICAgICAgICAgbHAuZ3Jhdml0eSA9IEdyYXZpdHkuQ0VOVEVSX1ZFUlRJQ0FMOworICAgICAgICAgICAgICAgICAgICBpY29uVmlldy5zZXRMYXlvdXRQYXJhbXMobHApOworICAgICAgICAgICAgICAgICAgICBhZGRWaWV3KGljb25WaWV3KTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAodGV4dCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIFRleHRWaWV3IHRleHRWaWV3ID0gbmV3IFRleHRWaWV3KGNvbnRleHQsIG51bGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5hdHRyLmFjdGlvbkJhclRhYlRleHRTdHlsZSk7CisgICAgICAgICAgICAgICAgICAgIHRleHRWaWV3LnNldFRleHQodGV4dCk7CisgICAgICAgICAgICAgICAgICAgIHRleHRWaWV3LnNldFNpbmdsZUxpbmUoKTsKKyAgICAgICAgICAgICAgICAgICAgdGV4dFZpZXcuc2V0RWxsaXBzaXplKFRydW5jYXRlQXQuRU5EKTsKKyAgICAgICAgICAgICAgICAgICAgTGF5b3V0UGFyYW1zIGxwID0gbmV3IExheW91dFBhcmFtcyhMYXlvdXRQYXJhbXMuV1JBUF9DT05URU5ULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIExheW91dFBhcmFtcy5XUkFQX0NPTlRFTlQpOworICAgICAgICAgICAgICAgICAgICBscC5ncmF2aXR5ID0gR3Jhdml0eS5DRU5URVJfVkVSVElDQUw7CisgICAgICAgICAgICAgICAgICAgIHRleHRWaWV3LnNldExheW91dFBhcmFtcyhscCk7CisgICAgICAgICAgICAgICAgICAgIGFkZFZpZXcodGV4dFZpZXcpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc2V0TGF5b3V0UGFyYW1zKG5ldyBMYXlvdXRQYXJhbXMoTGF5b3V0UGFyYW1zLldSQVBfQ09OVEVOVCwKKyAgICAgICAgICAgICAgICAgICAgTGF5b3V0UGFyYW1zLk1BVENIX1BBUkVOVCwgMSkpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIEFjdGlvbkJhci5UYWIgZ2V0VGFiKCkgeworICAgICAgICAgICAgcmV0dXJuIG1UYWI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIGNsYXNzIFRhYkNsaWNrTGlzdGVuZXIgaW1wbGVtZW50cyBPbkNsaWNrTGlzdGVuZXIgeworICAgICAgICBwdWJsaWMgdm9pZCBvbkNsaWNrKFZpZXcgdmlldykgeworICAgICAgICAgICAgVGFiVmlldyB0YWJWaWV3ID0gKFRhYlZpZXcpIHZpZXc7CisgICAgICAgICAgICB0YWJWaWV3LmdldFRhYigpLnNlbGVjdCgpOworICAgICAgICAgICAgZmluYWwgaW50IHRhYkNvdW50ID0gbVRhYkxheW91dC5nZXRDaGlsZENvdW50KCk7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHRhYkNvdW50OyBpKyspIHsKKyAgICAgICAgICAgICAgICBmaW5hbCBWaWV3IGNoaWxkID0gbVRhYkxheW91dC5nZXRDaGlsZEF0KGkpOworICAgICAgICAgICAgICAgIGNoaWxkLnNldFNlbGVjdGVkKGNoaWxkID09IHZpZXcpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3dpZGdldC9Db250YWN0SGVhZGVyV2lkZ2V0LmphdmEgYi9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvd2lkZ2V0L0NvbnRhY3RIZWFkZXJXaWRnZXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjQyMTQ2Ni4uMDAwMDAwMAotLS0gYS9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvd2lkZ2V0L0NvbnRhY3RIZWFkZXJXaWRnZXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY2MSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5pbnRlcm5hbC53aWRnZXQ7Ci0KLWltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC5SOwotCi1pbXBvcnQgYW5kcm9pZC5NYW5pZmVzdDsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQXN5bmNRdWVyeUhhbmRsZXI7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRSZXNvbHZlcjsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFVyaXM7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRWYWx1ZXM7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLlBhY2thZ2VNYW5hZ2VyOwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5QYWNrYWdlTWFuYWdlci5OYW1lTm90Rm91bmRFeGNlcHRpb247Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5SZXNvdXJjZXM7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5SZXNvdXJjZXMuTm90Rm91bmRFeGNlcHRpb247Ci1pbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5DdXJzb3I7Ci1pbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5CaXRtYXA7Ci1pbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5CaXRtYXBGYWN0b3J5OwotaW1wb3J0IGFuZHJvaWQubmV0LlVyaTsKLWltcG9ydCBhbmRyb2lkLm9zLlN5c3RlbUNsb2NrOwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5Db250YWN0czsKLWltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuRGF0YTsKLWltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuUGhvbmVMb29rdXA7Ci1pbXBvcnQgYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0LlJhd0NvbnRhY3RzOwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5TdGF0dXNVcGRhdGVzOwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5Db21tb25EYXRhS2luZHMuRW1haWw7Ci1pbXBvcnQgYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0LkNvbW1vbkRhdGFLaW5kcy5QaG90bzsKLWltcG9ydCBhbmRyb2lkLnRleHQuVGV4dFV0aWxzOwotaW1wb3J0IGFuZHJvaWQudGV4dC5mb3JtYXQuRGF0ZVV0aWxzOwotaW1wb3J0IGFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQ7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKLWltcG9ydCBhbmRyb2lkLnZpZXcuTGF5b3V0SW5mbGF0ZXI7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7Ci1pbXBvcnQgYW5kcm9pZC53aWRnZXQuQ2hlY2tCb3g7Ci1pbXBvcnQgYW5kcm9pZC53aWRnZXQuUXVpY2tDb250YWN0QmFkZ2U7Ci1pbXBvcnQgYW5kcm9pZC53aWRnZXQuRnJhbWVMYXlvdXQ7Ci1pbXBvcnQgYW5kcm9pZC53aWRnZXQuSW1hZ2VWaWV3OwotaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlRleHRWaWV3OwotCi0vKioKLSAqIEhlYWRlciB1c2VkIGFjcm9zcyBzeXN0ZW0gZm9yIGRpc3BsYXlpbmcgYSB0aXRsZSBiYXIgd2l0aCBjb250YWN0IGluZm8uIFlvdQotICogY2FuIGJpbmQgc3BlY2lmaWMgdmFsdWVzIG9uIHRoZSBoZWFkZXIsIG9yIHVzZSBoZWxwZXIgbWV0aG9kcyBsaWtlCi0gKiB7QGxpbmsgI2JpbmRGcm9tQ29udGFjdElkKGxvbmcpfSB0byBwb3B1bGF0ZSBhc3luY2hyb25vdXNseS4KLSAqIDxwPgotICogVGhlIHBhcmVudCBtdXN0IHJlcXVlc3QgdGhlIHtAbGluayBNYW5pZmVzdC5wZXJtaXNzaW9uI1JFQURfQ09OVEFDVFN9Ci0gKiBwZXJtaXNzaW9uIHRvIGFjY2VzcyBjb250YWN0IGRhdGEuCi0gKi8KLXB1YmxpYyBjbGFzcyBDb250YWN0SGVhZGVyV2lkZ2V0IGV4dGVuZHMgRnJhbWVMYXlvdXQgaW1wbGVtZW50cyBWaWV3Lk9uQ2xpY2tMaXN0ZW5lciB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIkNvbnRhY3RIZWFkZXJXaWRnZXQiOwotCi0gICAgcHJpdmF0ZSBUZXh0VmlldyBtRGlzcGxheU5hbWVWaWV3OwotICAgIHByaXZhdGUgVmlldyBtQWdncmVnYXRlQmFkZ2U7Ci0gICAgcHJpdmF0ZSBUZXh0VmlldyBtUGhvbmV0aWNOYW1lVmlldzsKLSAgICBwcml2YXRlIENoZWNrQm94IG1TdGFycmVkVmlldzsKLSAgICBwcml2YXRlIFF1aWNrQ29udGFjdEJhZGdlIG1QaG90b1ZpZXc7Ci0gICAgcHJpdmF0ZSBJbWFnZVZpZXcgbVByZXNlbmNlVmlldzsKLSAgICBwcml2YXRlIFRleHRWaWV3IG1TdGF0dXNWaWV3OwotICAgIHByaXZhdGUgVGV4dFZpZXcgbVN0YXR1c0F0dHJpYnV0aW9uVmlldzsKLSAgICBwcml2YXRlIGludCBtTm9QaG90b1Jlc291cmNlOwotICAgIHByaXZhdGUgUXVlcnlIYW5kbGVyIG1RdWVyeUhhbmRsZXI7Ci0KLSAgICBwcm90ZWN0ZWQgVXJpIG1Db250YWN0VXJpOwotCi0gICAgcHJvdGVjdGVkIFN0cmluZ1tdIG1FeGNsdWRlTWltZXMgPSBudWxsOwotCi0gICAgcHJvdGVjdGVkIENvbnRlbnRSZXNvbHZlciBtQ29udGVudFJlc29sdmVyOwotCi0gICAgLyoqCi0gICAgICogSW50ZXJmYWNlIGZvciBjYWxsYmFja3MgaW52b2tlZCB3aGVuIHRoZSB1c2VyIGludGVyYWN0cyB3aXRoIGEgaGVhZGVyLgotICAgICAqLwotICAgIHB1YmxpYyBpbnRlcmZhY2UgQ29udGFjdEhlYWRlckxpc3RlbmVyIHsKLSAgICAgICAgcHVibGljIHZvaWQgb25QaG90b0NsaWNrKFZpZXcgdmlldyk7Ci0gICAgICAgIHB1YmxpYyB2b2lkIG9uRGlzcGxheU5hbWVDbGljayhWaWV3IHZpZXcpOwotICAgIH0KLQotICAgIHByaXZhdGUgQ29udGFjdEhlYWRlckxpc3RlbmVyIG1MaXN0ZW5lcjsKLQotCi0gICAgcHJpdmF0ZSBpbnRlcmZhY2UgQ29udGFjdFF1ZXJ5IHsKLSAgICAgICAgLy9Qcm9qZWN0aW9uIHVzZWQgZm9yIHRoZSBzdW1tYXJ5IGluZm8gaW4gdGhlIGhlYWRlci4KLSAgICAgICAgU3RyaW5nW10gQ09MVU1OUyA9IG5ldyBTdHJpbmdbXSB7Ci0gICAgICAgICAgICBDb250YWN0cy5fSUQsCi0gICAgICAgICAgICBDb250YWN0cy5MT09LVVBfS0VZLAotICAgICAgICAgICAgQ29udGFjdHMuUEhPVE9fSUQsCi0gICAgICAgICAgICBDb250YWN0cy5ESVNQTEFZX05BTUUsCi0gICAgICAgICAgICBDb250YWN0cy5QSE9ORVRJQ19OQU1FLAotICAgICAgICAgICAgQ29udGFjdHMuU1RBUlJFRCwKLSAgICAgICAgICAgIENvbnRhY3RzLkNPTlRBQ1RfUFJFU0VOQ0UsCi0gICAgICAgICAgICBDb250YWN0cy5DT05UQUNUX1NUQVRVUywKLSAgICAgICAgICAgIENvbnRhY3RzLkNPTlRBQ1RfU1RBVFVTX1RJTUVTVEFNUCwKLSAgICAgICAgICAgIENvbnRhY3RzLkNPTlRBQ1RfU1RBVFVTX1JFU19QQUNLQUdFLAotICAgICAgICAgICAgQ29udGFjdHMuQ09OVEFDVF9TVEFUVVNfTEFCRUwsCi0gICAgICAgIH07Ci0gICAgICAgIGludCBfSUQgPSAwOwotICAgICAgICBpbnQgTE9PS1VQX0tFWSA9IDE7Ci0gICAgICAgIGludCBQSE9UT19JRCA9IDI7Ci0gICAgICAgIGludCBESVNQTEFZX05BTUUgPSAzOwotICAgICAgICBpbnQgUEhPTkVUSUNfTkFNRSA9IDQ7Ci0gICAgICAgIC8vVE9ETzogV2UgbmVlZCB0byBmaWd1cmUgb3V0IGhvdyB3ZSdyZSBnb2luZyB0byBnZXQgdGhlIHBob25ldGljIG5hbWUuCi0gICAgICAgIC8vc3RhdGljIGZpbmFsIGludCBIRUFERVJfUEhPTkVUSUNfTkFNRV9DT0xVTU5fSU5ERVgKLSAgICAgICAgaW50IFNUQVJSRUQgPSA1OwotICAgICAgICBpbnQgQ09OVEFDVF9QUkVTRU5DRV9TVEFUVVMgPSA2OwotICAgICAgICBpbnQgQ09OVEFDVF9TVEFUVVMgPSA3OwotICAgICAgICBpbnQgQ09OVEFDVF9TVEFUVVNfVElNRVNUQU1QID0gODsKLSAgICAgICAgaW50IENPTlRBQ1RfU1RBVFVTX1JFU19QQUNLQUdFID0gOTsKLSAgICAgICAgaW50IENPTlRBQ1RfU1RBVFVTX0xBQkVMID0gMTA7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBpbnRlcmZhY2UgUGhvdG9RdWVyeSB7Ci0gICAgICAgIFN0cmluZ1tdIENPTFVNTlMgPSBuZXcgU3RyaW5nW10gewotICAgICAgICAgICAgUGhvdG8uUEhPVE8KLSAgICAgICAgfTsKLQotICAgICAgICBpbnQgUEhPVE8gPSAwOwotICAgIH0KLQotICAgIC8vUHJvamVjdGlvbiB1c2VkIGZvciBsb29raW5nIHVwIGNvbnRhY3QgaWQgZnJvbSBwaG9uZSBudW1iZXIKLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZ1tdIFBIT05FX0xPT0tVUF9QUk9KRUNUSU9OID0gbmV3IFN0cmluZ1tdIHsKLSAgICAgICAgUGhvbmVMb29rdXAuX0lELAotICAgICAgICBQaG9uZUxvb2t1cC5MT09LVVBfS0VZLAotICAgIH07Ci0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgUEhPTkVfTE9PS1VQX0NPTlRBQ1RfSURfQ09MVU1OX0lOREVYID0gMDsKLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBQSE9ORV9MT09LVVBfQ09OVEFDVF9MT09LVVBfS0VZX0NPTFVNTl9JTkRFWCA9IDE7Ci0KLSAgICAvL1Byb2plY3Rpb24gdXNlZCBmb3IgbG9va2luZyB1cCBjb250YWN0IGlkIGZyb20gZW1haWwgYWRkcmVzcwotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nW10gRU1BSUxfTE9PS1VQX1BST0pFQ1RJT04gPSBuZXcgU3RyaW5nW10gewotICAgICAgICBSYXdDb250YWN0cy5DT05UQUNUX0lELAotICAgICAgICBDb250YWN0cy5MT09LVVBfS0VZLAotICAgIH07Ci0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgRU1BSUxfTE9PS1VQX0NPTlRBQ1RfSURfQ09MVU1OX0lOREVYID0gMDsKLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBFTUFJTF9MT09LVVBfQ09OVEFDVF9MT09LVVBfS0VZX0NPTFVNTl9JTkRFWCA9IDE7Ci0KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZ1tdIENPTlRBQ1RfTE9PS1VQX1BST0pFQ1RJT04gPSBuZXcgU3RyaW5nW10gewotICAgICAgICBDb250YWN0cy5fSUQsCi0gICAgfTsKLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBDT05UQUNUX0xPT0tVUF9JRF9DT0xVTU5fSU5ERVggPSAwOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFRPS0VOX0NPTlRBQ1RfSU5GTyA9IDA7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFRPS0VOX1BIT05FX0xPT0tVUCA9IDE7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFRPS0VOX0VNQUlMX0xPT0tVUCA9IDI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFRPS0VOX1BIT1RPX1FVRVJZID0gMzsKLQotICAgIHB1YmxpYyBDb250YWN0SGVhZGVyV2lkZ2V0KENvbnRleHQgY29udGV4dCkgewotICAgICAgICB0aGlzKGNvbnRleHQsIG51bGwpOwotICAgIH0KLQotICAgIHB1YmxpYyBDb250YWN0SGVhZGVyV2lkZ2V0KENvbnRleHQgY29udGV4dCwgQXR0cmlidXRlU2V0IGF0dHJzKSB7Ci0gICAgICAgIHRoaXMoY29udGV4dCwgYXR0cnMsIDApOwotICAgIH0KLQotICAgIHB1YmxpYyBDb250YWN0SGVhZGVyV2lkZ2V0KENvbnRleHQgY29udGV4dCwgQXR0cmlidXRlU2V0IGF0dHJzLCBpbnQgZGVmU3R5bGUpIHsKLSAgICAgICAgc3VwZXIoY29udGV4dCwgYXR0cnMsIGRlZlN0eWxlKTsKLQotICAgICAgICBtQ29udGVudFJlc29sdmVyID0gbUNvbnRleHQuZ2V0Q29udGVudFJlc29sdmVyKCk7Ci0KLSAgICAgICAgTGF5b3V0SW5mbGF0ZXIgaW5mbGF0ZXIgPQotICAgICAgICAgICAgKExheW91dEluZmxhdGVyKSBtQ29udGV4dC5nZXRTeXN0ZW1TZXJ2aWNlKENvbnRleHQuTEFZT1VUX0lORkxBVEVSX1NFUlZJQ0UpOwotICAgICAgICBpbmZsYXRlci5pbmZsYXRlKFIubGF5b3V0LmNvbnRhY3RfaGVhZGVyLCB0aGlzKTsKLQotICAgICAgICBtRGlzcGxheU5hbWVWaWV3ID0gKFRleHRWaWV3KSBmaW5kVmlld0J5SWQoUi5pZC5uYW1lKTsKLSAgICAgICAgbUFnZ3JlZ2F0ZUJhZGdlID0gZmluZFZpZXdCeUlkKFIuaWQuYWdncmVnYXRlX2JhZGdlKTsKLQotICAgICAgICBtUGhvbmV0aWNOYW1lVmlldyA9IChUZXh0VmlldykgZmluZFZpZXdCeUlkKFIuaWQucGhvbmV0aWNfbmFtZSk7Ci0KLSAgICAgICAgbVN0YXJyZWRWaWV3ID0gKENoZWNrQm94KWZpbmRWaWV3QnlJZChSLmlkLnN0YXIpOwotICAgICAgICBtU3RhcnJlZFZpZXcuc2V0T25DbGlja0xpc3RlbmVyKHRoaXMpOwotCi0gICAgICAgIG1QaG90b1ZpZXcgPSAoUXVpY2tDb250YWN0QmFkZ2UpIGZpbmRWaWV3QnlJZChSLmlkLnBob3RvKTsKLQotICAgICAgICBtUHJlc2VuY2VWaWV3ID0gKEltYWdlVmlldykgZmluZFZpZXdCeUlkKFIuaWQucHJlc2VuY2UpOwotCi0gICAgICAgIG1TdGF0dXNWaWV3ID0gKFRleHRWaWV3KWZpbmRWaWV3QnlJZChSLmlkLnN0YXR1cyk7Ci0gICAgICAgIG1TdGF0dXNBdHRyaWJ1dGlvblZpZXcgPSAoVGV4dFZpZXcpZmluZFZpZXdCeUlkKFIuaWQuc3RhdHVzX2RhdGUpOwotCi0gICAgICAgIC8vIFNldCB0aGUgcGhvdG8gd2l0aCBhIHJhbmRvbSAibm8gY29udGFjdCIgaW1hZ2UKLSAgICAgICAgbG9uZyBub3cgPSBTeXN0ZW1DbG9jay5lbGFwc2VkUmVhbHRpbWUoKTsKLSAgICAgICAgaW50IG51bSA9IChpbnQpIG5vdyAmIDB4ZjsKLSAgICAgICAgaWYgKG51bSA8IDkpIHsKLSAgICAgICAgICAgIC8vIExlYW5pbmcgaW4gZnJvbSByaWdodCwgY29tbW9uCi0gICAgICAgICAgICBtTm9QaG90b1Jlc291cmNlID0gUi5kcmF3YWJsZS5pY19jb250YWN0X3BpY3R1cmU7Ci0gICAgICAgIH0gZWxzZSBpZiAobnVtIDwgMTQpIHsKLSAgICAgICAgICAgIC8vIExlYW5pbmcgaW4gZnJvbSBsZWZ0IHVuY29tbW9uCi0gICAgICAgICAgICBtTm9QaG90b1Jlc291cmNlID0gUi5kcmF3YWJsZS5pY19jb250YWN0X3BpY3R1cmVfMjsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIENvbWluZyBpbiBmcm9tIHRoZSB0b3AsIHJhcmUKLSAgICAgICAgICAgIG1Ob1Bob3RvUmVzb3VyY2UgPSBSLmRyYXdhYmxlLmljX2NvbnRhY3RfcGljdHVyZV8zOwotICAgICAgICB9Ci0KLSAgICAgICAgcmVzZXRBc3luY1F1ZXJ5SGFuZGxlcigpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGVuYWJsZUNsaWNrTGlzdGVuZXJzKCkgewotICAgICAgICBtRGlzcGxheU5hbWVWaWV3LnNldE9uQ2xpY2tMaXN0ZW5lcih0aGlzKTsKLSAgICAgICAgbVBob3RvVmlldy5zZXRPbkNsaWNrTGlzdGVuZXIodGhpcyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0IHRoZSBnaXZlbiB7QGxpbmsgQ29udGFjdEhlYWRlckxpc3RlbmVyfSB0byBoYW5kbGUgaGVhZGVyIGV2ZW50cy4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRDb250YWN0SGVhZGVyTGlzdGVuZXIoQ29udGFjdEhlYWRlckxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0gICAgICAgIG1MaXN0ZW5lciA9IGxpc3RlbmVyOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBwZXJmb3JtUGhvdG9DbGljaygpIHsKLSAgICAgICAgaWYgKG1MaXN0ZW5lciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtTGlzdGVuZXIub25QaG90b0NsaWNrKG1QaG90b1ZpZXcpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHBlcmZvcm1EaXNwbGF5TmFtZUNsaWNrKCkgewotICAgICAgICBpZiAobUxpc3RlbmVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1MaXN0ZW5lci5vbkRpc3BsYXlOYW1lQ2xpY2sobURpc3BsYXlOYW1lVmlldyk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIGNsYXNzIFF1ZXJ5SGFuZGxlciBleHRlbmRzIEFzeW5jUXVlcnlIYW5kbGVyIHsKLQotICAgICAgICBwdWJsaWMgUXVlcnlIYW5kbGVyKENvbnRlbnRSZXNvbHZlciBjcikgewotICAgICAgICAgICAgc3VwZXIoY3IpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHByb3RlY3RlZCB2b2lkIG9uUXVlcnlDb21wbGV0ZShpbnQgdG9rZW4sIE9iamVjdCBjb29raWUsIEN1cnNvciBjdXJzb3IpIHsKLSAgICAgICAgICAgIHRyeXsKLSAgICAgICAgICAgICAgICBpZiAodGhpcyAhPSBtUXVlcnlIYW5kbGVyKSB7Ci0gICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIm9uUXVlcnlDb21wbGV0ZTogZGlzY2FyZCByZXN1bHQsIHRoZSBxdWVyeSBoYW5kbGVyIGlzIHJlc2V0ISIpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgc3dpdGNoICh0b2tlbikgewotICAgICAgICAgICAgICAgICAgICBjYXNlIFRPS0VOX1BIT1RPX1FVRVJZOiB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvL1NldCB0aGUgcGhvdG8KLSAgICAgICAgICAgICAgICAgICAgICAgIEJpdG1hcCBwaG90b0JpdG1hcCA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY3Vyc29yICE9IG51bGwgJiYgY3Vyc29yLm1vdmVUb0ZpcnN0KCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgIWN1cnNvci5pc051bGwoUGhvdG9RdWVyeS5QSE9UTykpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBieXRlW10gcGhvdG9EYXRhID0gY3Vyc29yLmdldEJsb2IoUGhvdG9RdWVyeS5QSE9UTyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGhvdG9CaXRtYXAgPSBCaXRtYXBGYWN0b3J5LmRlY29kZUJ5dGVBcnJheShwaG90b0RhdGEsIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaG90b0RhdGEubGVuZ3RoLCBudWxsKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBob3RvQml0bWFwID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaG90b0JpdG1hcCA9IGxvYWRQbGFjZWhvbGRlclBob3RvKG51bGwpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgbVBob3RvVmlldy5zZXRJbWFnZUJpdG1hcChwaG90b0JpdG1hcCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29va2llICE9IG51bGwgJiYgY29va2llIGluc3RhbmNlb2YgVXJpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbVBob3RvVmlldy5hc3NpZ25Db250YWN0VXJpKChVcmkpIGNvb2tpZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbnZhbGlkYXRlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBjYXNlIFRPS0VOX0NPTlRBQ1RfSU5GTzogewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGN1cnNvciAhPSBudWxsICYmIGN1cnNvci5tb3ZlVG9GaXJzdCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYmluZENvbnRhY3RJbmZvKGN1cnNvcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgVXJpIGxvb2t1cFVyaSA9IENvbnRhY3RzLmdldExvb2t1cFVyaShjdXJzb3IuZ2V0TG9uZyhDb250YWN0UXVlcnkuX0lEKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnNvci5nZXRTdHJpbmcoQ29udGFjdFF1ZXJ5LkxPT0tVUF9LRVkpKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIGxvbmcgcGhvdG9JZCA9IGN1cnNvci5nZXRMb25nKENvbnRhY3RRdWVyeS5QSE9UT19JRCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocGhvdG9JZCA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1QaG90b1ZpZXcuc2V0SW1hZ2VCaXRtYXAobG9hZFBsYWNlaG9sZGVyUGhvdG8obnVsbCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29va2llICE9IG51bGwgJiYgY29va2llIGluc3RhbmNlb2YgVXJpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtUGhvdG9WaWV3LmFzc2lnbkNvbnRhY3RVcmkoKFVyaSkgY29va2llKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnZhbGlkYXRlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRQaG90b1F1ZXJ5KHBob3RvSWQsIGxvb2t1cFVyaSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSAvKiBkb24ndCByZXNldCBxdWVyeSBoYW5kbGVyICovKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNob3VsZG4ndCByZWFsbHkgaGFwcGVuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0RGlzcGxheU5hbWUobnVsbCwgbnVsbCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0U29jaWFsU25pcHBldChudWxsKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRQaG90byhsb2FkUGxhY2Vob2xkZXJQaG90byhudWxsKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBjYXNlIFRPS0VOX1BIT05FX0xPT0tVUDogewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGN1cnNvciAhPSBudWxsICYmIGN1cnNvci5tb3ZlVG9GaXJzdCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9uZyBjb250YWN0SWQgPSBjdXJzb3IuZ2V0TG9uZyhQSE9ORV9MT09LVVBfQ09OVEFDVF9JRF9DT0xVTU5fSU5ERVgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBsb29rdXBLZXkgPSBjdXJzb3IuZ2V0U3RyaW5nKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEhPTkVfTE9PS1VQX0NPTlRBQ1RfTE9PS1VQX0tFWV9DT0xVTU5fSU5ERVgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpbmRGcm9tQ29udGFjdFVyaUludGVybmFsKENvbnRhY3RzLmdldExvb2t1cFVyaShjb250YWN0SWQsIGxvb2t1cEtleSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSAvKiBkb24ndCByZXNldCBxdWVyeSBoYW5kbGVyICovKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHBob25lTnVtYmVyID0gKFN0cmluZykgY29va2llOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldERpc3BsYXlOYW1lKHBob25lTnVtYmVyLCBudWxsKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRTb2NpYWxTbmlwcGV0KG51bGwpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFBob3RvKGxvYWRQbGFjZWhvbGRlclBob3RvKG51bGwpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtUGhvdG9WaWV3LmFzc2lnbkNvbnRhY3RGcm9tUGhvbmUocGhvbmVOdW1iZXIsIHRydWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgY2FzZSBUT0tFTl9FTUFJTF9MT09LVVA6IHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjdXJzb3IgIT0gbnVsbCAmJiBjdXJzb3IubW92ZVRvRmlyc3QoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvbmcgY29udGFjdElkID0gY3Vyc29yLmdldExvbmcoRU1BSUxfTE9PS1VQX0NPTlRBQ1RfSURfQ09MVU1OX0lOREVYKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbG9va3VwS2V5ID0gY3Vyc29yLmdldFN0cmluZygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVNQUlMX0xPT0tVUF9DT05UQUNUX0xPT0tVUF9LRVlfQ09MVU1OX0lOREVYKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaW5kRnJvbUNvbnRhY3RVcmlJbnRlcm5hbChDb250YWN0cy5nZXRMb29rdXBVcmkoY29udGFjdElkLCBsb29rdXBLZXkpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UgLyogZG9uJ3QgcmVzZXQgcXVlcnkgaGFuZGxlciAqLyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBlbWFpbEFkZHJlc3MgPSAoU3RyaW5nKSBjb29raWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0RGlzcGxheU5hbWUoZW1haWxBZGRyZXNzLCBudWxsKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRTb2NpYWxTbmlwcGV0KG51bGwpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFBob3RvKGxvYWRQbGFjZWhvbGRlclBob3RvKG51bGwpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtUGhvdG9WaWV3LmFzc2lnbkNvbnRhY3RGcm9tRW1haWwoZW1haWxBZGRyZXNzLCB0cnVlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgICAgICBpZiAoY3Vyc29yICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgY3Vyc29yLmNsb3NlKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVHVybiBvbi9vZmYgc2hvd2luZyBvZiB0aGUgYWdncmVnYXRlIGJhZGdlIGVsZW1lbnQuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2hvd0FnZ3JlZ2F0ZUJhZGdlKGJvb2xlYW4gc2hvd0JhZ2RlKSB7Ci0gICAgICAgIG1BZ2dyZWdhdGVCYWRnZS5zZXRWaXNpYmlsaXR5KHNob3dCYWdkZSA/IFZpZXcuVklTSUJMRSA6IFZpZXcuR09ORSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVHVybiBvbi9vZmYgc2hvd2luZyBvZiB0aGUgc3RhciBlbGVtZW50LgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNob3dTdGFyKGJvb2xlYW4gc2hvd1N0YXIpIHsKLSAgICAgICAgbVN0YXJyZWRWaWV3LnNldFZpc2liaWxpdHkoc2hvd1N0YXIgPyBWaWV3LlZJU0lCTEUgOiBWaWV3LkdPTkUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIE1hbnVhbGx5IHNldCB0aGUgc3RhcnJlZCBzdGF0ZSBvZiB0aGlzIGhlYWRlciB3aWRnZXQuIFRoaXMgZG9lc24ndCBjaGFuZ2UKLSAgICAgKiB0aGUgdW5kZXJseWluZyB7QGxpbmsgQ29udGFjdHN9IHZhbHVlLCBvbmx5IHRoZSBVSSBzdGF0ZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRTdGFyZWQoYm9vbGVhbiBzdGFycmVkKSB7Ci0gICAgICAgIG1TdGFycmVkVmlldy5zZXRDaGVja2VkKHN0YXJyZWQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIE1hbnVhbGx5IHNldCB0aGUgcHJlc2VuY2UuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0UHJlc2VuY2UoaW50IHByZXNlbmNlKSB7Ci0gICAgICAgIG1QcmVzZW5jZVZpZXcuc2V0SW1hZ2VSZXNvdXJjZShTdGF0dXNVcGRhdGVzLmdldFByZXNlbmNlSWNvblJlc291cmNlSWQocHJlc2VuY2UpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBNYW51YWxseSBzZXQgdGhlIGNvbnRhY3QgdXJpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0Q29udGFjdFVyaShVcmkgdXJpKSB7Ci0gICAgICAgIHNldENvbnRhY3RVcmkodXJpLCB0cnVlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBNYW51YWxseSBzZXQgdGhlIGNvbnRhY3QgdXJpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0Q29udGFjdFVyaShVcmkgdXJpLCBib29sZWFuIHNlbmRUb0Zhc3RyYWNrKSB7Ci0gICAgICAgIG1Db250YWN0VXJpID0gdXJpOwotICAgICAgICBpZiAoc2VuZFRvRmFzdHJhY2spIHsKLSAgICAgICAgICAgIG1QaG90b1ZpZXcuYXNzaWduQ29udGFjdFVyaSh1cmkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogTWFudWFsbHkgc2V0IHRoZSBwaG90byB0byBkaXNwbGF5IGluIHRoZSBoZWFkZXIuIFRoaXMgZG9lc24ndCBjaGFuZ2UgdGhlCi0gICAgICogdW5kZXJseWluZyB7QGxpbmsgQ29udGFjdHN9LCBvbmx5IHRoZSBVSSBzdGF0ZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRQaG90byhCaXRtYXAgYml0bWFwKSB7Ci0gICAgICAgIG1QaG90b1ZpZXcuc2V0SW1hZ2VCaXRtYXAoYml0bWFwKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBNYW51YWxseSBzZXQgdGhlIGRpc3BsYXkgbmFtZSBhbmQgcGhvbmV0aWMgbmFtZSB0byBzaG93IGluIHRoZSBoZWFkZXIuCi0gICAgICogVGhpcyBkb2Vzbid0IGNoYW5nZSB0aGUgdW5kZXJseWluZyB7QGxpbmsgQ29udGFjdHN9LCBvbmx5IHRoZSBVSSBzdGF0ZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXREaXNwbGF5TmFtZShDaGFyU2VxdWVuY2UgZGlzcGxheU5hbWUsIENoYXJTZXF1ZW5jZSBwaG9uZXRpY05hbWUpIHsKLSAgICAgICAgbURpc3BsYXlOYW1lVmlldy5zZXRUZXh0KGRpc3BsYXlOYW1lKTsKLSAgICAgICAgaWYgKCFUZXh0VXRpbHMuaXNFbXB0eShwaG9uZXRpY05hbWUpKSB7Ci0gICAgICAgICAgICBtUGhvbmV0aWNOYW1lVmlldy5zZXRUZXh0KHBob25ldGljTmFtZSk7Ci0gICAgICAgICAgICBtUGhvbmV0aWNOYW1lVmlldy5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtUGhvbmV0aWNOYW1lVmlldy5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBNYW51YWxseSBzZXQgdGhlIHNvY2lhbCBzbmlwcGV0IHRleHQgdG8gZGlzcGxheSBpbiB0aGUgaGVhZGVyLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFNvY2lhbFNuaXBwZXQoQ2hhclNlcXVlbmNlIHNuaXBwZXQpIHsKLSAgICAgICAgaWYgKHNuaXBwZXQgPT0gbnVsbCkgewotICAgICAgICAgICAgbVN0YXR1c1ZpZXcuc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOwotICAgICAgICAgICAgbVN0YXR1c0F0dHJpYnV0aW9uVmlldy5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtU3RhdHVzVmlldy5zZXRUZXh0KHNuaXBwZXQpOwotICAgICAgICAgICAgbVN0YXR1c1ZpZXcuc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0IGEgbGlzdCBvZiBzcGVjaWZpYyBNSU1FLXR5cGVzIHRvIGV4Y2x1ZGUgYW5kIG5vdCBkaXNwbGF5LiBGb3IKLSAgICAgKiBleGFtcGxlLCB0aGlzIGNhbiBiZSB1c2VkIHRvIGhpZGUgdGhlIHtAbGluayBDb250YWN0cyNDT05URU5UX0lURU1fVFlQRX0KLSAgICAgKiBwcm9maWxlIGljb24uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0RXhjbHVkZU1pbWVzKFN0cmluZ1tdIGV4Y2x1ZGVNaW1lcykgewotICAgICAgICBtRXhjbHVkZU1pbWVzID0gZXhjbHVkZU1pbWVzOwotICAgICAgICBtUGhvdG9WaWV3LnNldEV4Y2x1ZGVNaW1lcyhleGNsdWRlTWltZXMpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnZlbmllbmNlIG1ldGhvZCBmb3IgYmluZGluZyBhbGwgYXZhaWxhYmxlIGRhdGEgZnJvbSBhbiBleGlzdGluZwotICAgICAqIGNvbnRhY3QuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gY29udGFjdExvb2t1cFVyaSBhIHtDb250YWN0cy5DT05URU5UX0xPT0tVUF9VUkl9IHN0eWxlIFVSSS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBiaW5kRnJvbUNvbnRhY3RMb29rdXBVcmkoVXJpIGNvbnRhY3RMb29rdXBVcmkpIHsKLSAgICAgICAgYmluZEZyb21Db250YWN0VXJpSW50ZXJuYWwoY29udGFjdExvb2t1cFVyaSwgdHJ1ZSAvKiByZXNldCBxdWVyeSBoYW5kbGVyICovKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb252ZW5pZW5jZSBtZXRob2QgZm9yIGJpbmRpbmcgYWxsIGF2YWlsYWJsZSBkYXRhIGZyb20gYW4gZXhpc3RpbmcKLSAgICAgKiBjb250YWN0LgotICAgICAqCi0gICAgICogQHBhcmFtIGNvbnRhY3RVcmkgYSB7Q29udGFjdHMuQ09OVEVOVF9VUkl9IHN0eWxlIFVSSS4KLSAgICAgKiBAcGFyYW0gcmVzZXRRdWVyeUhhbmRsZXIgd2hldGhlciB0byB1c2UgYSBuZXcgQXN5bmNRdWVyeUhhbmRsZXIgb3Igbm90LgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBiaW5kRnJvbUNvbnRhY3RVcmlJbnRlcm5hbChVcmkgY29udGFjdFVyaSwgYm9vbGVhbiByZXNldFF1ZXJ5SGFuZGxlcikgewotICAgICAgICBtQ29udGFjdFVyaSA9IGNvbnRhY3RVcmk7Ci0gICAgICAgIHN0YXJ0Q29udGFjdFF1ZXJ5KGNvbnRhY3RVcmksIHJlc2V0UXVlcnlIYW5kbGVyKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb252ZW5pZW5jZSBtZXRob2QgZm9yIGJpbmRpbmcgYWxsIGF2YWlsYWJsZSBkYXRhIGZyb20gYW4gZXhpc3RpbmcKLSAgICAgKiBjb250YWN0LgotICAgICAqCi0gICAgICogQHBhcmFtIGVtYWlsQWRkcmVzcyBUaGUgZW1haWwgYWRkcmVzcyB1c2VkIHRvIGRvIGEgcmV2ZXJzZSBsb29rdXAgaW4KLSAgICAgKiB0aGUgY29udGFjdHMgZGF0YWJhc2UuIElmIG1vcmUgdGhhbiBvbmUgY29udGFjdCBjb250YWlucyB0aGlzIGVtYWlsCi0gICAgICogYWRkcmVzcywgb25lIG9mIHRoZW0gd2lsbCBiZSBjaG9zZW4gdG8gYmluZCB0by4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBiaW5kRnJvbUVtYWlsKFN0cmluZyBlbWFpbEFkZHJlc3MpIHsKLSAgICAgICAgcmVzZXRBc3luY1F1ZXJ5SGFuZGxlcigpOwotCi0gICAgICAgIG1RdWVyeUhhbmRsZXIuc3RhcnRRdWVyeShUT0tFTl9FTUFJTF9MT09LVVAsIGVtYWlsQWRkcmVzcywKLSAgICAgICAgICAgICAgICBVcmkud2l0aEFwcGVuZGVkUGF0aChFbWFpbC5DT05URU5UX0xPT0tVUF9VUkksIFVyaS5lbmNvZGUoZW1haWxBZGRyZXNzKSksCi0gICAgICAgICAgICAgICAgRU1BSUxfTE9PS1VQX1BST0pFQ1RJT04sIG51bGwsIG51bGwsIG51bGwpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnZlbmllbmNlIG1ldGhvZCBmb3IgYmluZGluZyBhbGwgYXZhaWxhYmxlIGRhdGEgZnJvbSBhbiBleGlzdGluZwotICAgICAqIGNvbnRhY3QuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbnVtYmVyIFRoZSBwaG9uZSBudW1iZXIgdXNlZCB0byBkbyBhIHJldmVyc2UgbG9va3VwIGluCi0gICAgICogdGhlIGNvbnRhY3RzIGRhdGFiYXNlLiBJZiBtb3JlIHRoYW4gb25lIGNvbnRhY3QgY29udGFpbnMgdGhpcyBwaG9uZQotICAgICAqIG51bWJlciwgb25lIG9mIHRoZW0gd2lsbCBiZSBjaG9zZW4gdG8gYmluZCB0by4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBiaW5kRnJvbVBob25lTnVtYmVyKFN0cmluZyBudW1iZXIpIHsKLSAgICAgICAgcmVzZXRBc3luY1F1ZXJ5SGFuZGxlcigpOwotCi0gICAgICAgIG1RdWVyeUhhbmRsZXIuc3RhcnRRdWVyeShUT0tFTl9QSE9ORV9MT09LVVAsIG51bWJlciwKLSAgICAgICAgICAgICAgICBVcmkud2l0aEFwcGVuZGVkUGF0aChQaG9uZUxvb2t1cC5DT05URU5UX0ZJTFRFUl9VUkksIFVyaS5lbmNvZGUobnVtYmVyKSksCi0gICAgICAgICAgICAgICAgUEhPTkVfTE9PS1VQX1BST0pFQ1RJT04sIG51bGwsIG51bGwsIG51bGwpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIHN0YXJ0Q29udGFjdFF1ZXJ5Ci0gICAgICoKLSAgICAgKiBpbnRlcm5hbCBtZXRob2QgdG8gcXVlcnkgY29udGFjdCBieSBVcmkuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gY29udGFjdFVyaSB0aGUgY29udGFjdCB1cmkKLSAgICAgKiBAcGFyYW0gcmVzZXRRdWVyeUhhbmRsZXIgd2hldGhlciB0byB1c2UgYSBuZXcgQXN5bmNRdWVyeUhhbmRsZXIgb3Igbm90Ci0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHN0YXJ0Q29udGFjdFF1ZXJ5KFVyaSBjb250YWN0VXJpLCBib29sZWFuIHJlc2V0UXVlcnlIYW5kbGVyKSB7Ci0gICAgICAgIGlmIChyZXNldFF1ZXJ5SGFuZGxlcikgewotICAgICAgICAgICAgcmVzZXRBc3luY1F1ZXJ5SGFuZGxlcigpOwotICAgICAgICB9Ci0KLSAgICAgICAgbVF1ZXJ5SGFuZGxlci5zdGFydFF1ZXJ5KFRPS0VOX0NPTlRBQ1RfSU5GTywgY29udGFjdFVyaSwgY29udGFjdFVyaSwgQ29udGFjdFF1ZXJ5LkNPTFVNTlMsCi0gICAgICAgICAgICAgICAgbnVsbCwgbnVsbCwgbnVsbCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogc3RhcnRQaG90b1F1ZXJ5Ci0gICAgICoKLSAgICAgKiBpbnRlcm5hbCBtZXRob2QgdG8gcXVlcnkgY29udGFjdCBwaG90byBieSBwaG90byBpZCBhbmQgdXJpLgotICAgICAqCi0gICAgICogQHBhcmFtIHBob3RvSWQgdGhlIHBob3RvIGlkLgotICAgICAqIEBwYXJhbSBsb29rdXBLZXkgdGhlIGxvb2t1cCB1cmkuCi0gICAgICogQHBhcmFtIHJlc2V0UXVlcnlIYW5kbGVyIHdoZXRoZXIgdG8gdXNlIGEgbmV3IEFzeW5jUXVlcnlIYW5kbGVyIG9yIG5vdC4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBzdGFydFBob3RvUXVlcnkobG9uZyBwaG90b0lkLCBVcmkgbG9va3VwS2V5LCBib29sZWFuIHJlc2V0UXVlcnlIYW5kbGVyKSB7Ci0gICAgICAgIGlmIChyZXNldFF1ZXJ5SGFuZGxlcikgewotICAgICAgICAgICAgcmVzZXRBc3luY1F1ZXJ5SGFuZGxlcigpOwotICAgICAgICB9Ci0KLSAgICAgICAgbVF1ZXJ5SGFuZGxlci5zdGFydFF1ZXJ5KFRPS0VOX1BIT1RPX1FVRVJZLCBsb29rdXBLZXksCi0gICAgICAgICAgICAgICAgQ29udGVudFVyaXMud2l0aEFwcGVuZGVkSWQoRGF0YS5DT05URU5UX1VSSSwgcGhvdG9JZCksIFBob3RvUXVlcnkuQ09MVU1OUywKLSAgICAgICAgICAgICAgICBudWxsLCBudWxsLCBudWxsKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBNZXRob2QgdG8gZm9yY2UgdGhpcyB3aWRnZXQgdG8gZm9yZ2V0IGV2ZXJ5dGhpbmcgaXQga25vd3MgYWJvdXQgdGhlIGNvbnRhY3QuCi0gICAgICogV2UgbmVlZCB0byBzdG9wIGFueSBleGlzdGluZyBhc3luYyBxdWVyaWVzIGZvciBwaG9uZSwgZW1haWwsIGNvbnRhY3QsIGFuZCBwaG90b3MuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgd2lwZUNsZWFuKCkgewotICAgICAgICByZXNldEFzeW5jUXVlcnlIYW5kbGVyKCk7Ci0KLSAgICAgICAgc2V0RGlzcGxheU5hbWUobnVsbCwgbnVsbCk7Ci0gICAgICAgIHNldFBob3RvKGxvYWRQbGFjZWhvbGRlclBob3RvKG51bGwpKTsKLSAgICAgICAgc2V0U29jaWFsU25pcHBldChudWxsKTsKLSAgICAgICAgc2V0UHJlc2VuY2UoMCk7Ci0gICAgICAgIG1Db250YWN0VXJpID0gbnVsbDsKLSAgICAgICAgbUV4Y2x1ZGVNaW1lcyA9IG51bGw7Ci0gICAgfQotCi0KLSAgICBwcml2YXRlIHZvaWQgcmVzZXRBc3luY1F1ZXJ5SGFuZGxlcigpIHsKLSAgICAgICAgLy8gdGhlIGFwaSBBc3luY1F1ZXJ5SGFuZGxlci5jYW5jZWxPcGVyYXRpb24oKSBkb2Vzbid0IHJlYWxseSB3b3JrLiBTaW5jZSB3ZSByZWFsbHkKLSAgICAgICAgLy8gbmVlZCB0aGUgb2xkIGFzeW5jIHF1ZXJpZXMgdG8gYmUgY2FuY2VsbGVkLCBsZXQncyBkbyBpdCB0aGUgaGFyZCB3YXkuCi0gICAgICAgIG1RdWVyeUhhbmRsZXIgPSBuZXcgUXVlcnlIYW5kbGVyKG1Db250ZW50UmVzb2x2ZXIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEJpbmQgdGhlIGNvbnRhY3QgZGV0YWlscyBwcm92aWRlZCBieSB0aGUgZ2l2ZW4ge0BsaW5rIEN1cnNvcn0uCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgYmluZENvbnRhY3RJbmZvKEN1cnNvciBjKSB7Ci0gICAgICAgIGZpbmFsIFN0cmluZyBkaXNwbGF5TmFtZSA9IGMuZ2V0U3RyaW5nKENvbnRhY3RRdWVyeS5ESVNQTEFZX05BTUUpOwotICAgICAgICBmaW5hbCBTdHJpbmcgcGhvbmV0aWNOYW1lID0gYy5nZXRTdHJpbmcoQ29udGFjdFF1ZXJ5LlBIT05FVElDX05BTUUpOwotICAgICAgICB0aGlzLnNldERpc3BsYXlOYW1lKGRpc3BsYXlOYW1lLCBwaG9uZXRpY05hbWUpOwotCi0gICAgICAgIGZpbmFsIGJvb2xlYW4gc3RhcnJlZCA9IGMuZ2V0SW50KENvbnRhY3RRdWVyeS5TVEFSUkVEKSAhPSAwOwotICAgICAgICBtU3RhcnJlZFZpZXcuc2V0Q2hlY2tlZChzdGFycmVkKTsKLQotICAgICAgICAvL1NldCB0aGUgcHJlc2VuY2Ugc3RhdHVzCi0gICAgICAgIGlmICghYy5pc051bGwoQ29udGFjdFF1ZXJ5LkNPTlRBQ1RfUFJFU0VOQ0VfU1RBVFVTKSkgewotICAgICAgICAgICAgaW50IHByZXNlbmNlID0gYy5nZXRJbnQoQ29udGFjdFF1ZXJ5LkNPTlRBQ1RfUFJFU0VOQ0VfU1RBVFVTKTsKLSAgICAgICAgICAgIG1QcmVzZW5jZVZpZXcuc2V0SW1hZ2VSZXNvdXJjZShTdGF0dXNVcGRhdGVzLmdldFByZXNlbmNlSWNvblJlc291cmNlSWQocHJlc2VuY2UpKTsKLSAgICAgICAgICAgIG1QcmVzZW5jZVZpZXcuc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbVByZXNlbmNlVmlldy5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvL1NldCB0aGUgc3RhdHVzIHVwZGF0ZQotICAgICAgICBTdHJpbmcgc3RhdHVzID0gYy5nZXRTdHJpbmcoQ29udGFjdFF1ZXJ5LkNPTlRBQ1RfU1RBVFVTKTsKLSAgICAgICAgaWYgKCFUZXh0VXRpbHMuaXNFbXB0eShzdGF0dXMpKSB7Ci0gICAgICAgICAgICBtU3RhdHVzVmlldy5zZXRUZXh0KHN0YXR1cyk7Ci0gICAgICAgICAgICBtU3RhdHVzVmlldy5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7Ci0KLSAgICAgICAgICAgIENoYXJTZXF1ZW5jZSB0aW1lc3RhbXAgPSBudWxsOwotCi0gICAgICAgICAgICBpZiAoIWMuaXNOdWxsKENvbnRhY3RRdWVyeS5DT05UQUNUX1NUQVRVU19USU1FU1RBTVApKSB7Ci0gICAgICAgICAgICAgICAgbG9uZyBkYXRlID0gYy5nZXRMb25nKENvbnRhY3RRdWVyeS5DT05UQUNUX1NUQVRVU19USU1FU1RBTVApOwotCi0gICAgICAgICAgICAgICAgLy8gU2V0IHRoZSBkYXRlL3RpbWUgZmllbGQgYnkgbWl4aW5nIHJlbGF0aXZlIGFuZCBhYnNvbHV0ZQotICAgICAgICAgICAgICAgIC8vIHRpbWVzLgotICAgICAgICAgICAgICAgIGludCBmbGFncyA9IERhdGVVdGlscy5GT1JNQVRfQUJCUkVWX1JFTEFUSVZFOwotCi0gICAgICAgICAgICAgICAgdGltZXN0YW1wID0gRGF0ZVV0aWxzLmdldFJlbGF0aXZlVGltZVNwYW5TdHJpbmcoZGF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpLCBEYXRlVXRpbHMuTUlOVVRFX0lOX01JTExJUywgZmxhZ3MpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBTdHJpbmcgbGFiZWwgPSBudWxsOwotCi0gICAgICAgICAgICBpZiAoIWMuaXNOdWxsKENvbnRhY3RRdWVyeS5DT05UQUNUX1NUQVRVU19MQUJFTCkpIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgcmVzUGFja2FnZSA9IGMuZ2V0U3RyaW5nKENvbnRhY3RRdWVyeS5DT05UQUNUX1NUQVRVU19SRVNfUEFDS0FHRSk7Ci0gICAgICAgICAgICAgICAgaW50IGxhYmVsUmVzb3VyY2UgPSBjLmdldEludChDb250YWN0UXVlcnkuQ09OVEFDVF9TVEFUVVNfTEFCRUwpOwotICAgICAgICAgICAgICAgIFJlc291cmNlcyByZXNvdXJjZXM7Ci0gICAgICAgICAgICAgICAgaWYgKFRleHRVdGlscy5pc0VtcHR5KHJlc1BhY2thZ2UpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJlc291cmNlcyA9IGdldFJlc291cmNlcygpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIFBhY2thZ2VNYW5hZ2VyIHBtID0gZ2V0Q29udGV4dCgpLmdldFBhY2thZ2VNYW5hZ2VyKCk7Ci0gICAgICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXNvdXJjZXMgPSBwbS5nZXRSZXNvdXJjZXNGb3JBcHBsaWNhdGlvbihyZXNQYWNrYWdlKTsKLSAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoTmFtZU5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIExvZy53KFRBRywgIkNvbnRhY3Qgc3RhdHVzIHVwZGF0ZSByZXNvdXJjZSBwYWNrYWdlIG5vdCBmb3VuZDogIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHJlc1BhY2thZ2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmVzb3VyY2VzID0gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChyZXNvdXJjZXMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWwgPSByZXNvdXJjZXMuZ2V0U3RyaW5nKGxhYmVsUmVzb3VyY2UpOwotICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJDb250YWN0IHN0YXR1cyB1cGRhdGUgcmVzb3VyY2Ugbm90IGZvdW5kOiAiICsgcmVzUGFja2FnZSArICJAIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGxhYmVsUmVzb3VyY2UpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBDaGFyU2VxdWVuY2UgYXR0cmlidXRpb247Ci0gICAgICAgICAgICBpZiAodGltZXN0YW1wICE9IG51bGwgJiYgbGFiZWwgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGF0dHJpYnV0aW9uID0gZ2V0Q29udGV4dCgpLmdldFN0cmluZygKLSAgICAgICAgICAgICAgICAgICAgICAgIFIuc3RyaW5nLmNvbnRhY3Rfc3RhdHVzX3VwZGF0ZV9hdHRyaWJ1dGlvbl93aXRoX2RhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICB0aW1lc3RhbXAsIGxhYmVsKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAodGltZXN0YW1wID09IG51bGwgJiYgbGFiZWwgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGF0dHJpYnV0aW9uID0gZ2V0Q29udGV4dCgpLmdldFN0cmluZygKLSAgICAgICAgICAgICAgICAgICAgICAgIFIuc3RyaW5nLmNvbnRhY3Rfc3RhdHVzX3VwZGF0ZV9hdHRyaWJ1dGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAodGltZXN0YW1wICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBhdHRyaWJ1dGlvbiA9IHRpbWVzdGFtcDsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgYXR0cmlidXRpb24gPSBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGF0dHJpYnV0aW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtU3RhdHVzQXR0cmlidXRpb25WaWV3LnNldFRleHQoYXR0cmlidXRpb24pOwotICAgICAgICAgICAgICAgIG1TdGF0dXNBdHRyaWJ1dGlvblZpZXcuc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBtU3RhdHVzQXR0cmlidXRpb25WaWV3LnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1TdGF0dXNWaWV3LnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKLSAgICAgICAgICAgIG1TdGF0dXNBdHRyaWJ1dGlvblZpZXcuc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgb25DbGljayhWaWV3IHZpZXcpIHsKLSAgICAgICAgc3dpdGNoICh2aWV3LmdldElkKCkpIHsKLSAgICAgICAgICAgIGNhc2UgUi5pZC5zdGFyOiB7Ci0gICAgICAgICAgICAgICAgLy8gVG9nZ2xlICJzdGFycmVkIiBzdGF0ZQotICAgICAgICAgICAgICAgIC8vIE1ha2Ugc3VyZSB0aGVyZSBpcyBhIGNvbnRhY3QKLSAgICAgICAgICAgICAgICBpZiAobUNvbnRhY3RVcmkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBmaW5hbCBDb250ZW50VmFsdWVzIHZhbHVlcyA9IG5ldyBDb250ZW50VmFsdWVzKDEpOwotICAgICAgICAgICAgICAgICAgICB2YWx1ZXMucHV0KENvbnRhY3RzLlNUQVJSRUQsIG1TdGFycmVkVmlldy5pc0NoZWNrZWQoKSk7Ci0gICAgICAgICAgICAgICAgICAgIG1Db250ZW50UmVzb2x2ZXIudXBkYXRlKG1Db250YWN0VXJpLCB2YWx1ZXMsIG51bGwsIG51bGwpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhc2UgUi5pZC5waG90bzogewotICAgICAgICAgICAgICAgIHBlcmZvcm1QaG90b0NsaWNrKCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXNlIFIuaWQubmFtZTogewotICAgICAgICAgICAgICAgIHBlcmZvcm1EaXNwbGF5TmFtZUNsaWNrKCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIEJpdG1hcCBsb2FkUGxhY2Vob2xkZXJQaG90byhCaXRtYXBGYWN0b3J5Lk9wdGlvbnMgb3B0aW9ucykgewotICAgICAgICBpZiAobU5vUGhvdG9SZXNvdXJjZSA9PSAwKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gQml0bWFwRmFjdG9yeS5kZWNvZGVSZXNvdXJjZShtQ29udGV4dC5nZXRSZXNvdXJjZXMoKSwKLSAgICAgICAgICAgICAgICBtTm9QaG90b1Jlc291cmNlLCBvcHRpb25zKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvd2lkZ2V0L0RpZ2l0YWxDbG9jay5qYXZhIGIvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3dpZGdldC9EaWdpdGFsQ2xvY2suamF2YQppbmRleCBmYTQ3ZmY2Li4yM2UyMjc3IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvd2lkZ2V0L0RpZ2l0YWxDbG9jay5qYXZhCisrKyBiL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC93aWRnZXQvRGlnaXRhbENsb2NrLmphdmEKQEAgLTMwLDcgKzMwLDcgQEAKIGltcG9ydCBhbmRyb2lkLnRleHQuZm9ybWF0LkRhdGVGb3JtYXQ7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldDsKIGltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKLWltcG9ydCBhbmRyb2lkLndpZGdldC5MaW5lYXJMYXlvdXQ7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuUmVsYXRpdmVMYXlvdXQ7CiBpbXBvcnQgYW5kcm9pZC53aWRnZXQuVGV4dFZpZXc7CiAKIGltcG9ydCBqYXZhLnRleHQuRGF0ZUZvcm1hdFN5bWJvbHM7CkBAIC0zOSw3ICszOSw3IEBACiAvKioKICAqIERpc3BsYXlzIHRoZSB0aW1lCiAgKi8KLXB1YmxpYyBjbGFzcyBEaWdpdGFsQ2xvY2sgZXh0ZW5kcyBMaW5lYXJMYXlvdXQgeworcHVibGljIGNsYXNzIERpZ2l0YWxDbG9jayBleHRlbmRzIFJlbGF0aXZlTGF5b3V0IHsKIAogICAgIHByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBNMTIgPSAiaDptbSI7CiAgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIE0yNCA9ICJrazptbSI7CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvd2lkZ2V0L0VkaXRTdHlsZWRUZXh0LmphdmEgYi9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvd2lkZ2V0L0VkaXRTdHlsZWRUZXh0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgyMTk3YzAuLjAwMDAwMDAKLS0tIGEvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3dpZGdldC9FZGl0U3R5bGVkVGV4dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY2MyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5pbnRlcm5hbC53aWRnZXQ7Ci0KLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci0KLWltcG9ydCBhbmRyb2lkLmFwcC5BbGVydERpYWxvZy5CdWlsZGVyOwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5EaWFsb2dJbnRlcmZhY2U7Ci1pbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5CaXRtYXA7Ci1pbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5CaXRtYXBGYWN0b3J5OwotaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQ2FudmFzOwotaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuQml0bWFwRHJhd2FibGU7Ci1pbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZTsKLWltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLlNoYXBlRHJhd2FibGU7Ci1pbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5zaGFwZXMuUmVjdFNoYXBlOwotaW1wb3J0IGFuZHJvaWQubmV0LlVyaTsKLWltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKLWltcG9ydCBhbmRyb2lkLnRleHQuRWRpdGFibGU7Ci1pbXBvcnQgYW5kcm9pZC50ZXh0Lkh0bWw7Ci1pbXBvcnQgYW5kcm9pZC50ZXh0LkxheW91dDsKLWltcG9ydCBhbmRyb2lkLnRleHQuU3Bhbm5hYmxlOwotaW1wb3J0IGFuZHJvaWQudGV4dC5TcGFubmVkOwotaW1wb3J0IGFuZHJvaWQudGV4dC5tZXRob2QuQXJyb3dLZXlNb3ZlbWVudE1ldGhvZDsKLWltcG9ydCBhbmRyb2lkLnRleHQuc3R5bGUuQWJzb2x1dGVTaXplU3BhbjsKLWltcG9ydCBhbmRyb2lkLnRleHQuc3R5bGUuQWxpZ25tZW50U3BhbjsKLWltcG9ydCBhbmRyb2lkLnRleHQuc3R5bGUuQ2hhcmFjdGVyU3R5bGU7Ci1pbXBvcnQgYW5kcm9pZC50ZXh0LnN0eWxlLkZvcmVncm91bmRDb2xvclNwYW47Ci1pbXBvcnQgYW5kcm9pZC50ZXh0LnN0eWxlLkltYWdlU3BhbjsKLWltcG9ydCBhbmRyb2lkLnRleHQuc3R5bGUuUGFyYWdyYXBoU3R5bGU7Ci1pbXBvcnQgYW5kcm9pZC50ZXh0LnN0eWxlLlF1b3RlU3BhbjsKLWltcG9ydCBhbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0OwotaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LktleUV2ZW50OwotaW1wb3J0IGFuZHJvaWQudmlldy5Nb3Rpb25FdmVudDsKLWltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKLWltcG9ydCBhbmRyb2lkLnZpZXcuaW5wdXRtZXRob2QuSW5wdXRNZXRob2RNYW5hZ2VyOwotaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkVkaXRUZXh0OwotaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlRleHRWaWV3OwotCi0vKioKLSAqIEVkaXRTdHlsZWRUZXh0IGV4dGVuZHMgRWRpdFRleHQgZm9yIG1hbmFnaW5nIHRoZSBmbG93IGFuZCBzdGF0dXMgdG8gZWRpdAotICogdGhlIHN0eWxlZCB0ZXh0LiBUaGlzIG1hbmFnZXMgdGhlIHN0YXRlcyBhbmQgZmxvd3Mgb2YgZWRpdGluZywgc3VwcG9ydHMKLSAqIGluc2VydGluZyBpbWFnZSwgaW1wb3J0L2V4cG9ydCBIVE1MLgotICovCi1wdWJsaWMgY2xhc3MgRWRpdFN0eWxlZFRleHQgZXh0ZW5kcyBFZGl0VGV4dCB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTE9HX1RBRyA9ICJFZGl0U3R5bGVkVGV4dCI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBEQkcgPSBmYWxzZTsKLQotICAgIC8qKgotICAgICAqIFRoZSBtb2RlcyBvZiBlZGl0aW5nIGFjdGlvbnMuCi0gICAgICovCi0gICAgLyoqIFRoZSBtb2RlIHRoYXQgbm8gZWRpdGluZyBhY3Rpb24gaXMgZG9uZS4gKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNT0RFX05PVEhJTkcgPSAwOwotICAgIC8qKiBUaGUgbW9kZSBvZiBjb3B5LiAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1PREVfQ09QWSA9IDE7Ci0gICAgLyoqIFRoZSBtb2RlIG9mIHBhc3RlLiAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1PREVfUEFTVEUgPSAyOwotICAgIC8qKiBUaGUgbW9kZSBvZiBjaGFuZ2luZyBzaXplLiAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1PREVfU0laRSA9IDM7Ci0gICAgLyoqIFRoZSBtb2RlIG9mIGNoYW5naW5nIGNvbG9yLiAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1PREVfQ09MT1IgPSA0OwotICAgIC8qKiBUaGUgbW9kZSBvZiBzZWxlY3Rpb24uICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTU9ERV9TRUxFQ1QgPSA1OwotICAgIC8qKiBUaGUgbW9kZSBvZiBjaGFuZ2luZyBhbGlnbm1lbnQuICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTU9ERV9BTElHTiA9IDY7Ci0gICAgLyoqIFRoZSBtb2RlIG9mIGNoYW5naW5nIGN1dC4gKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNT0RFX0NVVCA9IDc7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgc3RhdGUgb2Ygc2VsZWN0aW9uLgotICAgICAqLwotICAgIC8qKiBUaGUgc3RhdGUgdGhhdCBzZWxlY3Rpb24gaXNuJ3Qgc3RhcnRlZC4gKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVEFURV9TRUxFQ1RfT0ZGID0gMDsKLSAgICAvKiogVGhlIHN0YXRlIHRoYXQgc2VsZWN0aW9uIGlzIHN0YXJ0ZWQuICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RBVEVfU0VMRUNUX09OID0gMTsKLSAgICAvKiogVGhlIHN0YXRlIHRoYXQgc2VsZWN0aW9uIGlzIGRvbmUsIGJ1dCBub3QgZml4ZWQuICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RBVEVfU0VMRUNURUQgPSAyOwotICAgIC8qKiBUaGUgc3RhdGUgdGhhdCBzZWxlY3Rpb24gaXMgZG9uZSBhbmQgbm90IGZpeGVkLiAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUQVRFX1NFTEVDVF9GSVggPSAzOwotCi0gICAgLyoqCi0gICAgICogVGhlIGhlbHAgbWVzc2FnZSBzdHJpbmdzLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEhJTlRfTVNHX05VTEwgPSAwOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEhJTlRfTVNHX0NPUFlfQlVGX0JMQU5LID0gMTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBISU5UX01TR19TRUxFQ1RfU1RBUlQgPSAyOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEhJTlRfTVNHX1NFTEVDVF9FTkQgPSAzOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEhJTlRfTVNHX1BVU0hfQ09NUEVURSA9IDQ7Ci0KLSAgICAKLSAgICAvKioKLSAgICAgKiBUaGUgaGVscCBtZXNzYWdlIHN0cmluZ3MuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgREVGQVVMVF9CQUNLR1JPVU5EX0NPTE9SID0gMHgwMEZGRkZGRjsKLQotICAgIC8qKgotICAgICAqIEVkaXRTdHlsZWRUZXh0SW50ZXJmYWNlIHByb3ZpZGVzIGZ1bmN0aW9ucyBmb3Igbm90aWZ5aW5nIG1lc3NhZ2VzIHRvCi0gICAgICogY2FsbGluZyBjbGFzcy4KLSAgICAgKi8KLSAgICBwdWJsaWMgaW50ZXJmYWNlIEVkaXRTdHlsZWRUZXh0Tm90aWZpZXIgewotICAgICAgICBwdWJsaWMgdm9pZCBub3RpZnlIaW50TXNnKGludCBtc2dJZCk7Ci0gICAgICAgIHB1YmxpYyB2b2lkIG5vdGlmeVN0YXRlQ2hhbmdlZChpbnQgbW9kZSwgaW50IHN0YXRlKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIEVkaXRTdHlsZWRUZXh0Tm90aWZpZXIgbUVTVEludGVyZmFjZTsKLQotICAgIC8qKgotICAgICAqIEVkaXRTdHlsZWRUZXh0RWRpdG9yTWFuYWdlciBtYW5hZ2VzIHRoZSBmbG93IGFuZCBzdGF0dXMgb2YgZWFjaAotICAgICAqIGZ1bmN0aW9uIGZvciBlZGl0aW5nIHN0eWxlZCB0ZXh0LgotICAgICAqLwotICAgIHByaXZhdGUgRWRpdG9yTWFuYWdlciBtTWFuYWdlcjsKLSAgICBwcml2YXRlIFN0eWxlZFRleHRDb252ZXJ0ZXIgbUNvbnZlcnRlcjsKLSAgICBwcml2YXRlIFN0eWxlZFRleHREaWFsb2cgbURpYWxvZzsKLSAgICBwcml2YXRlIERyYXdhYmxlIG1EZWZhdWx0QmFja2dyb3VuZDsKLSAgICBwcml2YXRlIGludCBtQmFja2dyb3VuZENvbG9yOwotCi0gICAgLyoqCi0gICAgICogRWRpdFN0eWxlZFRleHQgZXh0ZW5kcyBFZGl0VGV4dCBmb3IgbWFuYWdpbmcgZmxvdyBvZiBlYWNoIGVkaXRpbmcKLSAgICAgKiBhY3Rpb24uCi0gICAgICovCi0gICAgcHVibGljIEVkaXRTdHlsZWRUZXh0KENvbnRleHQgY29udGV4dCwgQXR0cmlidXRlU2V0IGF0dHJzLCBpbnQgZGVmU3R5bGUpIHsKLSAgICAgICAgc3VwZXIoY29udGV4dCwgYXR0cnMsIGRlZlN0eWxlKTsKLSAgICAgICAgaW5pdCgpOwotICAgIH0KLQotICAgIHB1YmxpYyBFZGl0U3R5bGVkVGV4dChDb250ZXh0IGNvbnRleHQsIEF0dHJpYnV0ZVNldCBhdHRycykgewotICAgICAgICBzdXBlcihjb250ZXh0LCBhdHRycyk7Ci0gICAgICAgIGluaXQoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgRWRpdFN0eWxlZFRleHQoQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgIHN1cGVyKGNvbnRleHQpOwotICAgICAgICBpbml0KCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0IE5vdGlmaWVyLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldE5vdGlmaWVyKEVkaXRTdHlsZWRUZXh0Tm90aWZpZXIgZXN0SW50ZXJmYWNlKSB7Ci0gICAgICAgIG1FU1RJbnRlcmZhY2UgPSBlc3RJbnRlcmZhY2U7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0IEJ1aWxkZXIgZm9yIEFsZXJ0RGlhbG9nLgotICAgICAqIAotICAgICAqIEBwYXJhbSBidWlsZGVyCi0gICAgICogICAgICAgICAgICBCdWlsZGVyIGZvciBvcGVuaW5nIEFsZXJ0IERpYWxvZy4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRCdWlsZGVyKEJ1aWxkZXIgYnVpbGRlcikgewotICAgICAgICBtRGlhbG9nLnNldEJ1aWxkZXIoYnVpbGRlcik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0IFBhcmFtZXRlcnMgZm9yIENvbG9yQWxlcnREaWFsb2cuCi0gICAgICogCi0gICAgICogQHBhcmFtIGNvbG9ydGl0bGUKLSAgICAgKiAgICAgICAgICAgIFRpdGxlIGZvciBBbGVydCBEaWFsb2cuCi0gICAgICogQHBhcmFtIGNvbG9ybmFtZXMKLSAgICAgKiAgICAgICAgICAgIExpc3Qgb2YgbmFtZSBvZiBzZWxlY3RpbmcgY29sb3IuCi0gICAgICogQHBhcmFtIGNvbG9yaW50cwotICAgICAqICAgICAgICAgICAgTGlzdCBvZiBpbnQgb2YgY29sb3IuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0Q29sb3JBbGVydFBhcmFtcyhDaGFyU2VxdWVuY2UgY29sb3J0aXRsZSwKLSAgICAgICAgICAgIENoYXJTZXF1ZW5jZVtdIGNvbG9ybmFtZXMsIENoYXJTZXF1ZW5jZVtdIGNvbG9yaW50cykgewotICAgICAgICBtRGlhbG9nLnNldENvbG9yQWxlcnRQYXJhbXMoY29sb3J0aXRsZSwgY29sb3JuYW1lcywgY29sb3JpbnRzKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXQgUGFyYW1ldGVycyBmb3IgU2l6ZUFsZXJ0RGlhbG9nLgotICAgICAqIAotICAgICAqIEBwYXJhbSBzaXpldGl0bGUKLSAgICAgKiAgICAgICAgICAgIFRpdGxlIGZvciBBbGVydCBEaWFsb2cuCi0gICAgICogQHBhcmFtIHNpemVuYW1lcwotICAgICAqICAgICAgICAgICAgTGlzdCBvZiBuYW1lIG9mIHNlbGVjdGluZyBzaXplLgotICAgICAqIEBwYXJhbSBzaXplZGlzcGxheWludHMKLSAgICAgKiAgICAgICAgICAgIExpc3Qgb2YgaW50IG9mIHNpemUgZGlzcGxheWVkIGluIFRleHRWaWV3LgotICAgICAqIEBwYXJhbSBzaXplc2VuZGludHMKLSAgICAgKiAgICAgICAgICAgIExpc3Qgb2YgaW50IG9mIHNpemUgZXhwb3J0ZWQgdG8gSFRNTC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRTaXplQWxlcnRQYXJhbXMoQ2hhclNlcXVlbmNlIHNpemV0aXRsZSwKLSAgICAgICAgICAgIENoYXJTZXF1ZW5jZVtdIHNpemVuYW1lcywgQ2hhclNlcXVlbmNlW10gc2l6ZWRpc3BsYXlpbnRzLAotICAgICAgICAgICAgQ2hhclNlcXVlbmNlW10gc2l6ZXNlbmRpbnRzKSB7Ci0gICAgICAgIG1EaWFsb2cuc2V0U2l6ZUFsZXJ0UGFyYW1zKHNpemV0aXRsZSwgc2l6ZW5hbWVzLCBzaXplZGlzcGxheWludHMsCi0gICAgICAgICAgICAgICAgc2l6ZXNlbmRpbnRzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRBbGlnbkFsZXJ0UGFyYW1zKENoYXJTZXF1ZW5jZSBhbGlnbnRpdGxlLAotICAgICAgICAgICAgQ2hhclNlcXVlbmNlW10gYWxpZ25uYW1lcykgewotICAgICAgICBtRGlhbG9nLnNldEFsaWduQWxlcnRQYXJhbXMoYWxpZ250aXRsZSwgYWxpZ25uYW1lcyk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gb25Ub3VjaEV2ZW50KE1vdGlvbkV2ZW50IGV2ZW50KSB7Ci0gICAgICAgIGlmIChtTWFuYWdlci5pc1NvZnRLZXlCbG9ja2VkKCkgJiYKLSAgICAgICAgICAgICAgICBldmVudC5nZXRBY3Rpb24oKSA9PSBNb3Rpb25FdmVudC5BQ1RJT05fVVApIHsKLSAgICAgICAgICAgIGNhbmNlbExvbmdQcmVzcygpOwotICAgICAgICB9Ci0gICAgICAgIGZpbmFsIGJvb2xlYW4gc3VwZXJSZXN1bHQgPSBzdXBlci5vblRvdWNoRXZlbnQoZXZlbnQpOwotICAgICAgICBpZiAoZXZlbnQuZ2V0QWN0aW9uKCkgPT0gTW90aW9uRXZlbnQuQUNUSU9OX1VQKSB7Ci0gICAgICAgICAgICBpZiAoREJHKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQoTE9HX1RBRywgIi0tLSBvblRvdWNoRXZlbnQiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1NYW5hZ2VyLm9uQ3Vyc29yTW92ZWQoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gc3VwZXJSZXN1bHQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU3RhcnQgZWRpdGluZy4gVGhpcyBmdW5jdGlvbiBoYXZlIHRvIGJlIGNhbGxlZCBiZWZvcmUgb3RoZXIgZWRpdGluZwotICAgICAqIGFjdGlvbnMuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgb25TdGFydEVkaXQoKSB7Ci0gICAgICAgIG1NYW5hZ2VyLm9uU3RhcnRFZGl0KCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRW5kIGVkaXRpbmcuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgb25FbmRFZGl0KCkgewotICAgICAgICBtTWFuYWdlci5vbkVuZEVkaXQoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTdGFydCAiQ29weSIgYWN0aW9uLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIG9uU3RhcnRDb3B5KCkgewotICAgICAgICBtTWFuYWdlci5vblN0YXJ0Q29weSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFN0YXJ0ICJDdXQiIGFjdGlvbi4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBvblN0YXJ0Q3V0KCkgewotICAgICAgICBtTWFuYWdlci5vblN0YXJ0Q3V0KCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU3RhcnQgIlBhc3RlIiBhY3Rpb24uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgb25TdGFydFBhc3RlKCkgewotICAgICAgICBtTWFuYWdlci5vblN0YXJ0UGFzdGUoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTdGFydCBjaGFuZ2luZyAiU2l6ZSIgYWN0aW9uLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIG9uU3RhcnRTaXplKCkgewotICAgICAgICBtTWFuYWdlci5vblN0YXJ0U2l6ZSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFN0YXJ0IGNoYW5naW5nICJDb2xvciIgYWN0aW9uLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIG9uU3RhcnRDb2xvcigpIHsKLSAgICAgICAgbU1hbmFnZXIub25TdGFydENvbG9yKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU3RhcnQgY2hhbmdpbmcgIkJhY2tncm91bmRDb2xvciIgYWN0aW9uLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIG9uU3RhcnRCYWNrZ3JvdW5kQ29sb3IoKSB7Ci0gICAgICAgIG1NYW5hZ2VyLm9uU3RhcnRCYWNrZ3JvdW5kQ29sb3IoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTdGFydCBjaGFuZ2luZyAiQWxpZ25tZW50IiBhY3Rpb24uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgb25TdGFydEFsaWduKCkgewotICAgICAgICBtTWFuYWdlci5vblN0YXJ0QWxpZ24oKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTdGFydCAiU2VsZWN0IiBhY3Rpb24uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgb25TdGFydFNlbGVjdCgpIHsKLSAgICAgICAgbU1hbmFnZXIub25TdGFydFNlbGVjdCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFN0YXJ0ICJTZWxlY3RBbGwiIGFjdGlvbi4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBvblN0YXJ0U2VsZWN0QWxsKCkgewotICAgICAgICBtTWFuYWdlci5vblN0YXJ0U2VsZWN0QWxsKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRml4IFNlbGVjdGVkIEl0ZW0uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgb25GaXhTZWxlY3RlZEl0ZW0oKSB7Ci0gICAgICAgIG1NYW5hZ2VyLm9uRml4U2VsZWN0ZWRJdGVtKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSW5zZXJ0SW1hZ2UgdG8gVGV4dFZpZXcgYnkgdXNpbmcgVVJJCi0gICAgICogCi0gICAgICogQHBhcmFtIHVyaQotICAgICAqICAgICAgICAgICAgVVJJIG9mIHRoZSBpYW1nZSBpbnNlcnRlZCB0byBUZXh0Vmlldy4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBvbkluc2VydEltYWdlKFVyaSB1cmkpIHsKLSAgICAgICAgbU1hbmFnZXIub25JbnNlcnRJbWFnZSh1cmkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEluc2VydEltYWdlIHRvIFRleHRWaWV3IGJ5IHVzaW5nIHJlc291cmNlIElECi0gICAgICogCi0gICAgICogQHBhcmFtIHJlc0lkCi0gICAgICogICAgICAgICAgICBSZXNvdXJjZSBJRCBvZiB0aGUgaWFtZ2UgaW5zZXJ0ZWQgdG8gVGV4dFZpZXcuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgb25JbnNlcnRJbWFnZShpbnQgcmVzSWQpIHsKLSAgICAgICAgbU1hbmFnZXIub25JbnNlcnRJbWFnZShyZXNJZCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgb25JbnNlcnRIb3Jpem9udGFsTGluZSgpIHsKLSAgICAgICAgbU1hbmFnZXIub25JbnNlcnRIb3Jpem9udGFsTGluZSgpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIG9uQ2xlYXJTdHlsZXMoKSB7Ci0gICAgICAgIG1NYW5hZ2VyLm9uQ2xlYXJTdHlsZXMoKTsKLSAgICB9Ci0gICAgLyoqCi0gICAgICogU2V0IFNpemUgb2YgdGhlIEl0ZW0uCi0gICAgICogCi0gICAgICogQHBhcmFtIHNpemUKLSAgICAgKiAgICAgICAgICAgIFRoZSBzaXplIG9mIHRoZSBJdGVtLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEl0ZW1TaXplKGludCBzaXplKSB7Ci0gICAgICAgIG1NYW5hZ2VyLnNldEl0ZW1TaXplKHNpemUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldCBDb2xvciBvZiB0aGUgSXRlbS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gY29sb3IKLSAgICAgKiAgICAgICAgICAgIFRoZSBjb2xvciBvZiB0aGUgSXRlbS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRJdGVtQ29sb3IoaW50IGNvbG9yKSB7Ci0gICAgICAgIG1NYW5hZ2VyLnNldEl0ZW1Db2xvcihjb2xvcik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0IEFsaWdubWVudCBvZiB0aGUgSXRlbS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gY29sb3IKLSAgICAgKiAgICAgICAgICAgIFRoZSBjb2xvciBvZiB0aGUgSXRlbS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRBbGlnbm1lbnQoTGF5b3V0LkFsaWdubWVudCBhbGlnbikgewotICAgICAgICBtTWFuYWdlci5zZXRBbGlnbm1lbnQoYWxpZ24pOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldCBCYWNrZ3JvdW5kIGNvbG9yIG9mIFZpZXcuCi0gICAgICogCi0gICAgICogQHBhcmFtIGNvbG9yCi0gICAgICogICAgICAgICAgICBUaGUgYmFja2dyb3VuZCBjb2xvciBvZiB2aWV3LgotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNldEJhY2tncm91bmRDb2xvcihpbnQgY29sb3IpIHsKLSAgICAgICAgc3VwZXIuc2V0QmFja2dyb3VuZENvbG9yKGNvbG9yKTsKLSAgICAgICAgbUJhY2tncm91bmRDb2xvciA9IGNvbG9yOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldCBodG1sIHRvIEVkaXRTdHlsZWRUZXh0LgotICAgICAqIAotICAgICAqIEBwYXJhbSBodG1sCi0gICAgICogICAgICAgICAgICBUaGUgaHRtbCB0byBiZSBzZXQuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0SHRtbChTdHJpbmcgaHRtbCkgewotICAgICAgICBtQ29udmVydGVyLlNldEh0bWwoaHRtbCk7Ci0gICAgfQotICAgIC8qKgotICAgICAqIENoZWNrIHdoZXRoZXIgZWRpdGluZyBpcyBzdGFydGVkIG9yIG5vdC4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIFdoZXRoZXIgZWRpdGluZyBpcyBzdGFydGVkIG9yIG5vdC4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0VkaXR0aW5nKCkgewotICAgICAgICByZXR1cm4gbU1hbmFnZXIuaXNFZGl0dGluZygpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENoZWNrIHdoZXRoZXIgc3R5bGVkIHRleHQgb3Igbm90LgotICAgICAqIAotICAgICAqIEByZXR1cm4gV2hldGhlciBzdHlsZWQgdGV4dCBvciBub3QuCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNTdHlsZWRUZXh0KCkgewotICAgICAgICByZXR1cm4gbU1hbmFnZXIuaXNTdHlsZWRUZXh0KCk7Ci0gICAgfQotICAgIC8qKgotICAgICAqIENoZWNrIHdoZXRoZXIgU29mdEtleSBpcyBCbG9ja2VkIG9yIG5vdC4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHdoZXRoZXIgU29mdEtleSBpcyBCbG9ja2VkIG9yIG5vdC4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1NvZnRLZXlCbG9ja2VkKCkgewotICAgICAgICByZXR1cm4gbU1hbmFnZXIuaXNTb2Z0S2V5QmxvY2tlZCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldCB0aGUgbW9kZSBvZiB0aGUgYWN0aW9uLgotICAgICAqIAotICAgICAqIEByZXR1cm4gVGhlIG1vZGUgb2YgdGhlIGFjdGlvbi4KLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IGdldEVkaXRNb2RlKCkgewotICAgICAgICByZXR1cm4gbU1hbmFnZXIuZ2V0RWRpdE1vZGUoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgdGhlIHN0YXRlIG9mIHRoZSBzZWxlY3Rpb24uCi0gICAgICogCi0gICAgICogQHJldHVybiBUaGUgc3RhdGUgb2YgdGhlIHNlbGVjdGlvbi4KLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IGdldFNlbGVjdFN0YXRlKCkgewotICAgICAgICByZXR1cm4gbU1hbmFnZXIuZ2V0U2VsZWN0U3RhdGUoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgQnVuZGxlIGdldElucHV0RXh0cmFzKGJvb2xlYW4gY3JlYXRlKSB7Ci0gICAgICAgIGlmIChEQkcpIHsKLSAgICAgICAgICAgIExvZy5kKExPR19UQUcsICItLS1nZXRJbnB1dEV4dHJhcyIpOwotICAgICAgICB9Ci0gICAgICAgIEJ1bmRsZSBidW5kbGUgPSBzdXBlci5nZXRJbnB1dEV4dHJhcyhjcmVhdGUpOwotICAgICAgICBpZiAoYnVuZGxlICE9IG51bGwpIHsKLSAgICAgICAgICAgIGJ1bmRsZSA9IG5ldyBCdW5kbGUoKTsKLSAgICAgICAgfQotICAgICAgICBidW5kbGUucHV0Qm9vbGVhbigiYWxsb3dFbW9qaSIsIHRydWUpOwotICAgICAgICByZXR1cm4gYnVuZGxlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldCB0aGUgc3RhdGUgb2YgdGhlIHNlbGVjdGlvbi4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIFRoZSBzdGF0ZSBvZiB0aGUgc2VsZWN0aW9uLgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0SHRtbCgpIHsKLSAgICAgICAgcmV0dXJuIG1Db252ZXJ0ZXIuZ2V0SHRtbCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldCB0aGUgc3RhdGUgb2YgdGhlIHNlbGVjdGlvbi4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gdXJpcwotICAgICAqICAgICAgICAgICAgVGhlIGFycmF5IG9mIHVzZWQgdXJpcy4KLSAgICAgKiBAcmV0dXJuIFRoZSBzdGF0ZSBvZiB0aGUgc2VsZWN0aW9uLgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0SHRtbChBcnJheUxpc3Q8VXJpPiB1cmlzKSB7Ci0gICAgICAgIG1Db252ZXJ0ZXIuZ2V0VXJpQXJyYXkodXJpcywgZ2V0VGV4dCgpKTsKLSAgICAgICAgcmV0dXJuIG1Db252ZXJ0ZXIuZ2V0SHRtbCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldCBCYWNrZ3JvdW5kIGNvbG9yIG9mIFZpZXcuCi0gICAgICogCi0gICAgICogQHJldHVybiBUaGUgYmFja2dyb3VuZCBjb2xvciBvZiBWaWV3LgotICAgICAqLwotICAgIHB1YmxpYyBpbnQgZ2V0QmFja2dyb3VuZENvbG9yKCkgewotICAgICAgICByZXR1cm4gbUJhY2tncm91bmRDb2xvcjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgRm9yZWdyb3VuZCBjb2xvciBvZiBWaWV3LgotICAgICAqIAotICAgICAqIEByZXR1cm4gVGhlIGJhY2tncm91bmQgY29sb3Igb2YgVmlldy4KLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IGdldEZvcmVHcm91bmRDb2xvcihpbnQgcG9zKSB7Ci0gICAgICAgIGlmIChEQkcpIHsKLSAgICAgICAgICAgIExvZy5kKExPR19UQUcsICItLS1nZXRGb3JlR3JvdW5kQ29sb3I6ICIgKyBwb3MpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChwb3MgPCAwIHx8IHBvcyA+IGdldFRleHQoKS5sZW5ndGgoKSkgewotICAgICAgICAgICAgTG9nLmUoTE9HX1RBRywgIi0tLWdldEZvcmVHcm91bmRDb2xvcjogSWxsaWdhbCBwb3NpdGlvbi4iKTsKLSAgICAgICAgICAgIHJldHVybiBERUZBVUxUX0JBQ0tHUk9VTkRfQ09MT1I7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBGb3JlZ3JvdW5kQ29sb3JTcGFuW10gc3BhbnMgPQotICAgICAgICAgICAgICAgIGdldFRleHQoKS5nZXRTcGFucyhwb3MsIHBvcywgRm9yZWdyb3VuZENvbG9yU3Bhbi5jbGFzcyk7Ci0gICAgICAgICAgICBpZiAoc3BhbnMubGVuZ3RoID4gMCkgewotICAgICAgICAgICAgICAgIHJldHVybiBzcGFuc1swXS5nZXRGb3JlZ3JvdW5kQ29sb3IoKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIERFRkFVTFRfQkFDS0dST1VORF9DT0xPUjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEluaXRpYWxpemUgbWVtYmVycy4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgaW5pdCgpIHsKLSAgICAgICAgaWYgKERCRykgewotICAgICAgICAgICAgTG9nLmQoTE9HX1RBRywgIi0tLSBpbml0Iik7Ci0gICAgICAgIH0KLSAgICAgICAgcmVxdWVzdEZvY3VzKCk7Ci0gICAgICAgIG1EZWZhdWx0QmFja2dyb3VuZCA9IGdldEJhY2tncm91bmQoKTsKLSAgICAgICAgbUJhY2tncm91bmRDb2xvciA9IERFRkFVTFRfQkFDS0dST1VORF9DT0xPUjsKLSAgICAgICAgbU1hbmFnZXIgPSBuZXcgRWRpdG9yTWFuYWdlcih0aGlzKTsKLSAgICAgICAgbUNvbnZlcnRlciA9IG5ldyBTdHlsZWRUZXh0Q29udmVydGVyKHRoaXMpOwotICAgICAgICBtRGlhbG9nID0gbmV3IFN0eWxlZFRleHREaWFsb2codGhpcyk7Ci0gICAgICAgIHNldE1vdmVtZW50TWV0aG9kKG5ldyBTdHlsZWRUZXh0QXJyb3dLZXlNZXRob2QobU1hbmFnZXIpKTsKLSAgICAgICAgbU1hbmFnZXIuYmxvY2tTb2Z0S2V5KCk7Ci0gICAgICAgIG1NYW5hZ2VyLnVuYmxvY2tTb2Z0S2V5KCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2hvdyBGb3JlZ3JvdW5kIENvbG9yIFNlbGVjdGluZyBEaWFsb2cuCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIG9uU2hvd0ZvcmVncm91bmRDb2xvckFsZXJ0KCkgewotICAgICAgICBtRGlhbG9nLm9uU2hvd0ZvcmVncm91bmRDb2xvckFsZXJ0RGlhbG9nKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2hvdyBCYWNrZ3JvdW5kIENvbG9yIFNlbGVjdGluZyBEaWFsb2cuCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIG9uU2hvd0JhY2tncm91bmRDb2xvckFsZXJ0KCkgewotICAgICAgICBtRGlhbG9nLm9uU2hvd0JhY2tncm91bmRDb2xvckFsZXJ0RGlhbG9nKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2hvdyBTaXplIFNlbGVjdGluZyBEaWFsb2cuCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIG9uU2hvd1NpemVBbGVydCgpIHsKLSAgICAgICAgbURpYWxvZy5vblNob3dTaXplQWxlcnREaWFsb2coKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTaG93IEFsaWdubWVudCBTZWxlY3RpbmcgRGlhbG9nLgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBvblNob3dBbGlnbkFsZXJ0KCkgewotICAgICAgICBtRGlhbG9nLm9uU2hvd0FsaWduQWxlcnREaWFsb2coKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBOb3RpZnkgaGludCBtZXNzYWdlcyB3aGF0IGFjdGlvbiBpcyBleHBlY3RlZCB0byBjYWxsaW5nIGNsYXNzLgotICAgICAqIAotICAgICAqIEBwYXJhbSBtc2dJZAotICAgICAqICAgICAgICAgICAgSWQgb2YgdGhlIGhpbnQgbWVzc2FnZS4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgc2V0SGludE1lc3NhZ2UoaW50IG1zZ0lkKSB7Ci0gICAgICAgIGlmIChtRVNUSW50ZXJmYWNlICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1FU1RJbnRlcmZhY2Uubm90aWZ5SGludE1zZyhtc2dJZCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBOb3RpZnkgdGhlIGV2ZW50IHRoYXQgdGhlIG1vZGUgYW5kIHN0YXRlIGFyZSBjaGFuZ2VkLgotICAgICAqIAotICAgICAqIEBwYXJhbSBtb2RlCi0gICAgICogICAgICAgICAgICBNb2RlIG9mIHRoZSBlZGl0aW5nIGFjdGlvbi4KLSAgICAgKiBAcGFyYW0gc3RhdGUKLSAgICAgKiAgICAgICAgICAgIE1vZGUgb2YgdGhlIHNlbGVjdGlvbiBzdGF0ZS4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgbm90aWZ5U3RhdGVDaGFuZ2VkKGludCBtb2RlLCBpbnQgc3RhdGUpIHsKLSAgICAgICAgaWYgKG1FU1RJbnRlcmZhY2UgIT0gbnVsbCkgewotICAgICAgICAgICAgbUVTVEludGVyZmFjZS5ub3RpZnlTdGF0ZUNoYW5nZWQobW9kZSwgc3RhdGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRWRpdG9yTWFuYWdlciBtYW5hZ2VzIHRoZSBmbG93IGFuZCBzdGF0dXMgb2YgZWRpdGluZyBhY3Rpb25zLgotICAgICAqLwotICAgIHByaXZhdGUgY2xhc3MgRWRpdG9yTWFuYWdlciB7Ci0gICAgICAgIHByaXZhdGUgYm9vbGVhbiBtRWRpdEZsYWcgPSBmYWxzZTsKLSAgICAgICAgcHJpdmF0ZSBib29sZWFuIG1Tb2Z0S2V5QmxvY2tGbGFnID0gZmFsc2U7Ci0gICAgICAgIHByaXZhdGUgaW50IG1Nb2RlID0gMDsKLSAgICAgICAgcHJpdmF0ZSBpbnQgbVN0YXRlID0gMDsKLSAgICAgICAgcHJpdmF0ZSBpbnQgbUN1clN0YXJ0ID0gMDsKLSAgICAgICAgcHJpdmF0ZSBpbnQgbUN1ckVuZCA9IDA7Ci0gICAgICAgIHByaXZhdGUgRWRpdFN0eWxlZFRleHQgbUVTVDsKLQotICAgICAgICBFZGl0b3JNYW5hZ2VyKEVkaXRTdHlsZWRUZXh0IGVzdCkgewotICAgICAgICAgICAgbUVTVCA9IGVzdDsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uU3RhcnRFZGl0KCkgewotICAgICAgICAgICAgaWYgKERCRykgewotICAgICAgICAgICAgICAgIExvZy5kKExPR19UQUcsICItLS0gb25TdGFydEVkaXQiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIExvZy5kKExPR19UQUcsICItLS0gb25zdGFydGVkaXQ6Iik7Ci0gICAgICAgICAgICBoYW5kbGVSZXNldEVkaXQoKTsKLSAgICAgICAgICAgIG1FU1Qubm90aWZ5U3RhdGVDaGFuZ2VkKG1Nb2RlLCBtU3RhdGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgb25FbmRFZGl0KCkgewotICAgICAgICAgICAgaWYgKERCRykgewotICAgICAgICAgICAgICAgIExvZy5kKExPR19UQUcsICItLS0gb25FbmRFZGl0Iik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBoYW5kbGVDYW5jZWwoKTsKLSAgICAgICAgICAgIG1FU1Qubm90aWZ5U3RhdGVDaGFuZ2VkKG1Nb2RlLCBtU3RhdGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgb25TdGFydENvcHkoKSB7Ci0gICAgICAgICAgICBpZiAoREJHKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQoTE9HX1RBRywgIi0tLSBvblN0YXJ0Q29weSIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaGFuZGxlQ29weSgpOwotICAgICAgICAgICAgbUVTVC5ub3RpZnlTdGF0ZUNoYW5nZWQobU1vZGUsIG1TdGF0ZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBvblN0YXJ0Q3V0KCkgewotICAgICAgICAgICAgaWYgKERCRykgewotICAgICAgICAgICAgICAgIExvZy5kKExPR19UQUcsICItLS0gb25TdGFydEN1dCIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaGFuZGxlQ3V0KCk7Ci0gICAgICAgICAgICBtRVNULm5vdGlmeVN0YXRlQ2hhbmdlZChtTW9kZSwgbVN0YXRlKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uU3RhcnRQYXN0ZSgpIHsKLSAgICAgICAgICAgIGlmIChEQkcpIHsKLSAgICAgICAgICAgICAgICBMb2cuZChMT0dfVEFHLCAiLS0tIG9uU3RhcnRQYXN0ZSIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaGFuZGxlUGFzdGUoKTsKLSAgICAgICAgICAgIG1FU1Qubm90aWZ5U3RhdGVDaGFuZ2VkKG1Nb2RlLCBtU3RhdGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgb25TdGFydFNpemUoKSB7Ci0gICAgICAgICAgICBpZiAoREJHKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQoTE9HX1RBRywgIi0tLSBvblN0YXJ0U2l6ZSIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaGFuZGxlU2l6ZSgpOwotICAgICAgICAgICAgbUVTVC5ub3RpZnlTdGF0ZUNoYW5nZWQobU1vZGUsIG1TdGF0ZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBvblN0YXJ0QWxpZ24oKSB7Ci0gICAgICAgICAgICBpZiAoREJHKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQoTE9HX1RBRywgIi0tLSBvblN0YXJ0QWxpZ25SaWdodCIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaGFuZGxlQWxpZ24oKTsKLSAgICAgICAgICAgIG1FU1Qubm90aWZ5U3RhdGVDaGFuZ2VkKG1Nb2RlLCBtU3RhdGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgb25TdGFydENvbG9yKCkgewotICAgICAgICAgICAgaWYgKERCRykgewotICAgICAgICAgICAgICAgIExvZy5kKExPR19UQUcsICItLS0gb25DbGlja0NvbG9yIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBoYW5kbGVDb2xvcigpOwotICAgICAgICAgICAgbUVTVC5ub3RpZnlTdGF0ZUNoYW5nZWQobU1vZGUsIG1TdGF0ZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBvblN0YXJ0QmFja2dyb3VuZENvbG9yKCkgewotICAgICAgICAgICAgaWYgKERCRykgewotICAgICAgICAgICAgICAgIExvZy5kKExPR19UQUcsICItLS0gb25DbGlja0NvbG9yIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtRVNULm9uU2hvd0JhY2tncm91bmRDb2xvckFsZXJ0KCk7Ci0gICAgICAgICAgICBtRVNULm5vdGlmeVN0YXRlQ2hhbmdlZChtTW9kZSwgbVN0YXRlKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uU3RhcnRTZWxlY3QoKSB7Ci0gICAgICAgICAgICBpZiAoREJHKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQoTE9HX1RBRywgIi0tLSBvbkNsaWNrU2VsZWN0Iik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtTW9kZSA9IE1PREVfU0VMRUNUOwotICAgICAgICAgICAgaWYgKG1TdGF0ZSA9PSBTVEFURV9TRUxFQ1RfT0ZGKSB7Ci0gICAgICAgICAgICAgICAgaGFuZGxlU2VsZWN0KCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHVuc2V0U2VsZWN0KCk7Ci0gICAgICAgICAgICAgICAgaGFuZGxlU2VsZWN0KCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtRVNULm5vdGlmeVN0YXRlQ2hhbmdlZChtTW9kZSwgbVN0YXRlKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uQ3Vyc29yTW92ZWQoKSB7Ci0gICAgICAgICAgICBpZiAoREJHKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQoTE9HX1RBRywgIi0tLSBvbkNsaWNrVmlldyIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKG1TdGF0ZSA9PSBTVEFURV9TRUxFQ1RfT04gfHwgbVN0YXRlID09IFNUQVRFX1NFTEVDVEVEKSB7Ci0gICAgICAgICAgICAgICAgaGFuZGxlU2VsZWN0KCk7Ci0gICAgICAgICAgICAgICAgbUVTVC5ub3RpZnlTdGF0ZUNoYW5nZWQobU1vZGUsIG1TdGF0ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBvblN0YXJ0U2VsZWN0QWxsKCkgewotICAgICAgICAgICAgaWYgKERCRykgewotICAgICAgICAgICAgICAgIExvZy5kKExPR19UQUcsICItLS0gb25DbGlja1NlbGVjdEFsbCIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaGFuZGxlU2VsZWN0QWxsKCk7Ci0gICAgICAgICAgICBtRVNULm5vdGlmeVN0YXRlQ2hhbmdlZChtTW9kZSwgbVN0YXRlKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uRml4U2VsZWN0ZWRJdGVtKCkgewotICAgICAgICAgICAgaWYgKERCRykgewotICAgICAgICAgICAgICAgIExvZy5kKExPR19UQUcsICItLS0gb25DbGlja0NvbXBsZXRlIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBoYW5kbGVDb21wbGV0ZSgpOwotICAgICAgICAgICAgbUVTVC5ub3RpZnlTdGF0ZUNoYW5nZWQobU1vZGUsIG1TdGF0ZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBvbkluc2VydEltYWdlKFVyaSB1cmkpIHsKLSAgICAgICAgICAgIGlmIChEQkcpIHsKLSAgICAgICAgICAgICAgICBMb2cuZChMT0dfVEFHLCAiLS0tIG9uSW5zZXJ0SW1hZ2UgYnkgVVJJOiAiICsgdXJpLmdldFBhdGgoKQotICAgICAgICAgICAgICAgICAgICAgICAgKyAiLCIgKyB1cmkudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpbnNlcnRJbWFnZVNwYW4obmV3IEltYWdlU3BhbihtRVNULmdldENvbnRleHQoKSwgdXJpKSk7Ci0gICAgICAgICAgICBtRVNULm5vdGlmeVN0YXRlQ2hhbmdlZChtTW9kZSwgbVN0YXRlKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uSW5zZXJ0SW1hZ2UoaW50IHJlc0lEKSB7Ci0gICAgICAgICAgICBpZiAoREJHKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQoTE9HX1RBRywgIi0tLSBvbkluc2VydEltYWdlIGJ5IHJlc0lEIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpbnNlcnRJbWFnZVNwYW4obmV3IEltYWdlU3BhbihtRVNULmdldENvbnRleHQoKSwgcmVzSUQpKTsKLSAgICAgICAgICAgIG1FU1Qubm90aWZ5U3RhdGVDaGFuZ2VkKG1Nb2RlLCBtU3RhdGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgb25JbnNlcnRIb3Jpem9udGFsTGluZSgpIHsKLSAgICAgICAgICAgIGlmIChEQkcpIHsKLSAgICAgICAgICAgICAgICBMb2cuZChMT0dfVEFHLCAiLS0tIG9uSW5zZXJ0SG9yaXpvbnRhbExpbmU6Iik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpbnNlcnRJbWFnZVNwYW4obmV3IEhvcml6b250YWxMaW5lU3BhbigweEZGMDAwMDAwLCBtRVNUKSk7Ci0gICAgICAgICAgICBtRVNULm5vdGlmeVN0YXRlQ2hhbmdlZChtTW9kZSwgbVN0YXRlKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uQ2xlYXJTdHlsZXMoKSB7Ci0gICAgICAgICAgICBpZiAoREJHKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQoTE9HX1RBRywgIi0tLSBvbkNsZWFyU3R5bGVzIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBFZGl0YWJsZSB0eHQgPSBtRVNULmdldFRleHQoKTsKLSAgICAgICAgICAgIGludCBsZW4gPSB0eHQubGVuZ3RoKCk7Ci0gICAgICAgICAgICBPYmplY3RbXSBzdHlsZXMgPSB0eHQuZ2V0U3BhbnMoMCwgbGVuLCBPYmplY3QuY2xhc3MpOwotICAgICAgICAgICAgZm9yIChPYmplY3Qgc3R5bGUgOiBzdHlsZXMpIHsKLSAgICAgICAgICAgICAgICBpZiAoc3R5bGUgaW5zdGFuY2VvZiBQYXJhZ3JhcGhTdHlsZSB8fAotICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGUgaW5zdGFuY2VvZiBRdW90ZVNwYW4gfHwKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlIGluc3RhbmNlb2YgQ2hhcmFjdGVyU3R5bGUpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHN0eWxlIGluc3RhbmNlb2YgSW1hZ2VTcGFuKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RhcnQgPSB0eHQuZ2V0U3BhblN0YXJ0KHN0eWxlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBlbmQgPSB0eHQuZ2V0U3BhbkVuZChzdHlsZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0eHQucmVwbGFjZShzdGFydCwgZW5kLCAiIik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgdHh0LnJlbW92ZVNwYW4oc3R5bGUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1FU1Quc2V0QmFja2dyb3VuZERyYXdhYmxlKG1FU1QubURlZmF1bHRCYWNrZ3JvdW5kKTsKLSAgICAgICAgICAgIG1FU1QubUJhY2tncm91bmRDb2xvciA9IERFRkFVTFRfQkFDS0dST1VORF9DT0xPUjsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldEl0ZW1TaXplKGludCBzaXplKSB7Ci0gICAgICAgICAgICBpZiAoREJHKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQoTE9HX1RBRywgIi0tLSBvbkNsaWNrU2l6ZUl0ZW0iKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChtU3RhdGUgPT0gU1RBVEVfU0VMRUNURUQgfHwgbVN0YXRlID09IFNUQVRFX1NFTEVDVF9GSVgpIHsKLSAgICAgICAgICAgICAgICBjaGFuZ2VTaXplU2VsZWN0ZWRUZXh0KHNpemUpOwotICAgICAgICAgICAgICAgIGhhbmRsZVJlc2V0RWRpdCgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgc2V0SXRlbUNvbG9yKGludCBjb2xvcikgewotICAgICAgICAgICAgaWYgKERCRykgewotICAgICAgICAgICAgICAgIExvZy5kKExPR19UQUcsICItLS0gb25DbGlja0NvbG9ySXRlbSIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKG1TdGF0ZSA9PSBTVEFURV9TRUxFQ1RFRCB8fCBtU3RhdGUgPT0gU1RBVEVfU0VMRUNUX0ZJWCkgewotICAgICAgICAgICAgICAgIGNoYW5nZUNvbG9yU2VsZWN0ZWRUZXh0KGNvbG9yKTsKLSAgICAgICAgICAgICAgICBoYW5kbGVSZXNldEVkaXQoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldEFsaWdubWVudChMYXlvdXQuQWxpZ25tZW50IGFsaWduKSB7Ci0gICAgICAgICAgICBpZiAoREJHKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQoTE9HX1RBRywgIi0tLSBvbkNsaWNrQ29sb3JJdGVtIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAobVN0YXRlID09IFNUQVRFX1NFTEVDVEVEIHx8IG1TdGF0ZSA9PSBTVEFURV9TRUxFQ1RfRklYKSB7Ci0gICAgICAgICAgICAgICAgY2hhbmdlQWxpZ24oYWxpZ24pOwotICAgICAgICAgICAgICAgIGhhbmRsZVJlc2V0RWRpdCgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGJvb2xlYW4gaXNFZGl0dGluZygpIHsKLSAgICAgICAgICAgIHJldHVybiBtRWRpdEZsYWc7Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBJZiB0aGUgc3R5bGUgb2YgdGhlIHNwYW4gaXMgYWRkZWQsIGFkZCBjaGVjayBjYXNlIGZvciB0aGF0IHN0eWxlICovCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGlzU3R5bGVkVGV4dCgpIHsKLSAgICAgICAgICAgIEVkaXRhYmxlIHR4dCA9IG1FU1QuZ2V0VGV4dCgpOwotICAgICAgICAgICAgaW50IGxlbiA9IHR4dC5sZW5ndGgoKTsKLSAgICAgICAgICAgIGlmICh0eHQuZ2V0U3BhbnMoMCwgbGVuIC0xLCBQYXJhZ3JhcGhTdHlsZS5jbGFzcykubGVuZ3RoID4gMCB8fAotICAgICAgICAgICAgICAgICAgICB0eHQuZ2V0U3BhbnMoMCwgbGVuIC0xLCBRdW90ZVNwYW4uY2xhc3MpLmxlbmd0aCA+IDAgfHwKLSAgICAgICAgICAgICAgICAgICAgdHh0LmdldFNwYW5zKDAsIGxlbiAtMSwgQ2hhcmFjdGVyU3R5bGUuY2xhc3MpLmxlbmd0aCA+IDAgfHwKLSAgICAgICAgICAgICAgICAgICAgbUVTVC5tQmFja2dyb3VuZENvbG9yICE9IERFRkFVTFRfQkFDS0dST1VORF9DT0xPUikgewotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGJvb2xlYW4gaXNTb2Z0S2V5QmxvY2tlZCgpIHsKLSAgICAgICAgICAgIHJldHVybiBtU29mdEtleUJsb2NrRmxhZzsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBpbnQgZ2V0RWRpdE1vZGUoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbU1vZGU7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgaW50IGdldFNlbGVjdFN0YXRlKCkgewotICAgICAgICAgICAgcmV0dXJuIG1TdGF0ZTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBpbnQgZ2V0U2VsZWN0aW9uU3RhcnQoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbUN1clN0YXJ0OwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGludCBnZXRTZWxlY3Rpb25FbmQoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbUN1ckVuZDsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgdm9pZCBkb05leHRIYW5kbGUoKSB7Ci0gICAgICAgICAgICBpZiAoREJHKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQoTE9HX1RBRywgIi0tLSBkb05leHRIYW5kbGU6ICIgKyBtTW9kZSArICIsIiArIG1TdGF0ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzd2l0Y2ggKG1Nb2RlKSB7Ci0gICAgICAgICAgICBjYXNlIE1PREVfQ09QWToKLSAgICAgICAgICAgICAgICBoYW5kbGVDb3B5KCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIE1PREVfQ1VUOgotICAgICAgICAgICAgICAgIGhhbmRsZUN1dCgpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBNT0RFX1BBU1RFOgotICAgICAgICAgICAgICAgIGhhbmRsZVBhc3RlKCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIE1PREVfU0laRToKLSAgICAgICAgICAgICAgICBoYW5kbGVTaXplKCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIE1PREVfQ09MT1I6Ci0gICAgICAgICAgICAgICAgaGFuZGxlQ29sb3IoKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgTU9ERV9BTElHTjoKLSAgICAgICAgICAgICAgICBoYW5kbGVBbGlnbigpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgdm9pZCBoYW5kbGVDYW5jZWwoKSB7Ci0gICAgICAgICAgICBpZiAoREJHKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQoTE9HX1RBRywgIi0tLSBoYW5kbGVDYW5jZWwiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1Nb2RlID0gTU9ERV9OT1RISU5HOwotICAgICAgICAgICAgbVN0YXRlID0gU1RBVEVfU0VMRUNUX09GRjsKLSAgICAgICAgICAgIG1FZGl0RmxhZyA9IGZhbHNlOwotICAgICAgICAgICAgTG9nLmQoTE9HX1RBRywgIi0tLSBoYW5kbGVDYW5jZWw6IiArIG1FU1QuZ2V0SW5wdXRUeXBlKCkpOwotICAgICAgICAgICAgdW5ibG9ja1NvZnRLZXkoKTsKLSAgICAgICAgICAgIHVuc2V0U2VsZWN0KCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgaGFuZGxlQ29tcGxldGUoKSB7Ci0gICAgICAgICAgICBpZiAoREJHKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQoTE9HX1RBRywgIi0tLSBoYW5kbGVDb21wbGV0ZSIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKCFtRWRpdEZsYWcpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAobVN0YXRlID09IFNUQVRFX1NFTEVDVEVEKSB7Ci0gICAgICAgICAgICAgICAgbVN0YXRlID0gU1RBVEVfU0VMRUNUX0ZJWDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGRvTmV4dEhhbmRsZSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIGhhbmRsZVRleHRWaWV3RnVuYyhpbnQgbW9kZSwgaW50IGlkKSB7Ci0gICAgICAgICAgICBpZiAoREJHKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQoTE9HX1RBRywgIi0tLSBoYW5kbGVUZXh0VmlldzogIiArIG1Nb2RlICsgIiwiICsgbVN0YXRlICsKLSAgICAgICAgICAgICAgICAgICAgICAgICIsIiArIGlkKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICghbUVkaXRGbGFnKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKG1Nb2RlID09IE1PREVfTk9USElORyB8fCBtTW9kZSA9PSBNT0RFX1NFTEVDVCkgewotICAgICAgICAgICAgICAgIG1Nb2RlID0gbW9kZTsKLSAgICAgICAgICAgICAgICBpZiAobVN0YXRlID09IFNUQVRFX1NFTEVDVEVEKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1TdGF0ZSA9IFNUQVRFX1NFTEVDVF9GSVg7Ci0gICAgICAgICAgICAgICAgICAgIGhhbmRsZVRleHRWaWV3RnVuYyhtb2RlLCBpZCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgaGFuZGxlU2VsZWN0KCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIGlmIChtTW9kZSAhPSBtb2RlKSB7Ci0gICAgICAgICAgICAgICAgaGFuZGxlQ2FuY2VsKCk7Ci0gICAgICAgICAgICAgICAgbU1vZGUgPSBtb2RlOwotICAgICAgICAgICAgICAgIGhhbmRsZVRleHRWaWV3RnVuYyhtb2RlLCBpZCk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKG1TdGF0ZSA9PSBTVEFURV9TRUxFQ1RfRklYKSB7Ci0gICAgICAgICAgICAgICAgbUVTVC5vblRleHRDb250ZXh0TWVudUl0ZW0oaWQpOwotICAgICAgICAgICAgICAgIGhhbmRsZVJlc2V0RWRpdCgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIGhhbmRsZUNvcHkoKSB7Ci0gICAgICAgICAgICBpZiAoREJHKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQoTE9HX1RBRywgIi0tLSBoYW5kbGVDb3B5OiAiICsgbU1vZGUgKyAiLCIgKyBtU3RhdGUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaGFuZGxlVGV4dFZpZXdGdW5jKE1PREVfQ09QWSwgYW5kcm9pZC5SLmlkLmNvcHkpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIGhhbmRsZUN1dCgpIHsKLSAgICAgICAgICAgIGlmIChEQkcpIHsKLSAgICAgICAgICAgICAgICBMb2cuZChMT0dfVEFHLCAiLS0tIGhhbmRsZUNvcHk6ICIgKyBtTW9kZSArICIsIiArIG1TdGF0ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBoYW5kbGVUZXh0Vmlld0Z1bmMoTU9ERV9DVVQsIGFuZHJvaWQuUi5pZC5jdXQpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIGhhbmRsZVBhc3RlKCkgewotICAgICAgICAgICAgaWYgKERCRykgewotICAgICAgICAgICAgICAgIExvZy5kKExPR19UQUcsICItLS0gaGFuZGxlUGFzdGUiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICghbUVkaXRGbGFnKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbUVTVC5vblRleHRDb250ZXh0TWVudUl0ZW0oYW5kcm9pZC5SLmlkLnBhc3RlKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgdm9pZCBoYW5kbGVTZXRTcGFuKGludCBtb2RlKSB7Ci0gICAgICAgICAgICBpZiAoREJHKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQoTE9HX1RBRywgIi0tLSBoYW5kbGVTZXRTcGFuOiIgKyBtRWRpdEZsYWcgKyAiLCIKLSAgICAgICAgICAgICAgICAgICAgICAgICsgbVN0YXRlICsgJywnICsgbU1vZGUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKCFtRWRpdEZsYWcpIHsKLSAgICAgICAgICAgICAgICBMb2cuZShMT0dfVEFHLCAiLS0tIGhhbmRsZVNldFNwYW46IEVkaXRpbmcgaXMgbm90IHN0YXJ0ZWQuIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKG1Nb2RlID09IE1PREVfTk9USElORyB8fCBtTW9kZSA9PSBNT0RFX1NFTEVDVCkgewotICAgICAgICAgICAgICAgIG1Nb2RlID0gbW9kZTsKLSAgICAgICAgICAgICAgICBpZiAobVN0YXRlID09IFNUQVRFX1NFTEVDVEVEKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1TdGF0ZSA9IFNUQVRFX1NFTEVDVF9GSVg7Ci0gICAgICAgICAgICAgICAgICAgIGhhbmRsZVNldFNwYW4obW9kZSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgaGFuZGxlU2VsZWN0KCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIGlmIChtTW9kZSAhPSBtb2RlKSB7Ci0gICAgICAgICAgICAgICAgaGFuZGxlQ2FuY2VsKCk7Ci0gICAgICAgICAgICAgICAgbU1vZGUgPSBtb2RlOwotICAgICAgICAgICAgICAgIGhhbmRsZVNldFNwYW4obW9kZSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGlmIChtU3RhdGUgPT0gU1RBVEVfU0VMRUNUX0ZJWCkgewotICAgICAgICAgICAgICAgICAgICBtRVNULnNldEhpbnRNZXNzYWdlKEhJTlRfTVNHX05VTEwpOwotICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKG1vZGUpIHsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBNT0RFX0NPTE9SOgotICAgICAgICAgICAgICAgICAgICAgICAgbUVTVC5vblNob3dGb3JlZ3JvdW5kQ29sb3JBbGVydCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgTU9ERV9TSVpFOgotICAgICAgICAgICAgICAgICAgICAgICAgbUVTVC5vblNob3dTaXplQWxlcnQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBjYXNlIE1PREVfQUxJR046Ci0gICAgICAgICAgICAgICAgICAgICAgICBtRVNULm9uU2hvd0FsaWduQWxlcnQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmUoTE9HX1RBRywgIi0tLSBoYW5kbGVTZXRTcGFuOiBpbnZhbGlkIG1vZGUuIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIExvZy5kKExPR19UQUcsICItLS0gaGFuZGxlU2V0U3BhbjogZG8gbm90aGluZy4iKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgaGFuZGxlU2l6ZSgpIHsKLSAgICAgICAgICAgIGhhbmRsZVNldFNwYW4oTU9ERV9TSVpFKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgdm9pZCBoYW5kbGVDb2xvcigpIHsKLSAgICAgICAgICAgIGhhbmRsZVNldFNwYW4oTU9ERV9DT0xPUik7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgaGFuZGxlQWxpZ24oKSB7Ci0gICAgICAgICAgICBoYW5kbGVTZXRTcGFuKE1PREVfQUxJR04pOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIGhhbmRsZVNlbGVjdCgpIHsKLSAgICAgICAgICAgIGlmIChEQkcpIHsKLSAgICAgICAgICAgICAgICBMb2cuZChMT0dfVEFHLCAiLS0tIGhhbmRsZVNlbGVjdDoiICsgbUVkaXRGbGFnICsgIiwiICsgbVN0YXRlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICghbUVkaXRGbGFnKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKG1TdGF0ZSA9PSBTVEFURV9TRUxFQ1RfT0ZGKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGlzVGV4dFNlbGVjdGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgTG9nLmUoTE9HX1RBRywgIlNlbGVjdGlvbiBpcyBvZmYsIGJ1dCBzZWxlY3RlZCIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBzZXRTZWxlY3RTdGFydFBvcygpOwotICAgICAgICAgICAgICAgIGJsb2NrU29mdEtleSgpOwotICAgICAgICAgICAgICAgIG1FU1Quc2V0SGludE1lc3NhZ2UoSElOVF9NU0dfU0VMRUNUX0VORCk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKG1TdGF0ZSA9PSBTVEFURV9TRUxFQ1RfT04pIHsKLSAgICAgICAgICAgICAgICBpZiAoaXNUZXh0U2VsZWN0ZWQoKSkgewotICAgICAgICAgICAgICAgICAgICBMb2cuZShMT0dfVEFHLCAiU2VsZWN0aW9uIG5vdyBzdGFydCwgYnV0IHNlbGVjdGVkIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHNldFNlbGVjdGVkRW5kUG9zKCk7Ci0gICAgICAgICAgICAgICAgbUVTVC5zZXRIaW50TWVzc2FnZShISU5UX01TR19QVVNIX0NPTVBFVEUpOwotICAgICAgICAgICAgICAgIGRvTmV4dEhhbmRsZSgpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChtU3RhdGUgPT0gU1RBVEVfU0VMRUNURUQpIHsKLSAgICAgICAgICAgICAgICBpZiAoIWlzVGV4dFNlbGVjdGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgTG9nLmUoTE9HX1RBRywgIlNlbGVjdGlvbiBpcyBkb25lLCBidXQgbm90IHNlbGVjdGVkIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHNldFNlbGVjdGVkRW5kUG9zKCk7Ci0gICAgICAgICAgICAgICAgZG9OZXh0SGFuZGxlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgaGFuZGxlU2VsZWN0QWxsKCkgewotICAgICAgICAgICAgaWYgKERCRykgewotICAgICAgICAgICAgICAgIExvZy5kKExPR19UQUcsICItLS0gaGFuZGxlU2VsZWN0QWxsIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoIW1FZGl0RmxhZykgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1FU1Quc2VsZWN0QWxsKCk7Ci0gICAgICAgICAgICBtU3RhdGUgPSBTVEFURV9TRUxFQ1RFRDsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgdm9pZCBoYW5kbGVSZXNldEVkaXQoKSB7Ci0gICAgICAgICAgICBpZiAoREJHKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQoTE9HX1RBRywgIlJlc2V0IEVkaXRvciIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYmxvY2tTb2Z0S2V5KCk7Ci0gICAgICAgICAgICBoYW5kbGVDYW5jZWwoKTsKLSAgICAgICAgICAgIG1FZGl0RmxhZyA9IHRydWU7Ci0gICAgICAgICAgICBtRVNULnNldEhpbnRNZXNzYWdlKEhJTlRfTVNHX1NFTEVDVF9TVEFSVCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgc2V0U2VsZWN0aW9uKCkgewotICAgICAgICAgICAgaWYgKERCRykgewotICAgICAgICAgICAgICAgIExvZy5kKExPR19UQUcsICItLS0gb25TZWxlY3Q6IiArIG1DdXJTdGFydCArICIsIiArIG1DdXJFbmQpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKG1DdXJTdGFydCA+PSAwICYmIG1DdXJTdGFydCA8PSBtRVNULmdldFRleHQoKS5sZW5ndGgoKQotICAgICAgICAgICAgICAgICAgICAmJiBtQ3VyRW5kID49IDAgJiYgbUN1ckVuZCA8PSBtRVNULmdldFRleHQoKS5sZW5ndGgoKSkgewotICAgICAgICAgICAgICAgIGlmIChtQ3VyU3RhcnQgPCBtQ3VyRW5kKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1FU1Quc2V0U2VsZWN0aW9uKG1DdXJTdGFydCwgbUN1ckVuZCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgbUVTVC5zZXRTZWxlY3Rpb24obUN1ckVuZCwgbUN1clN0YXJ0KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbVN0YXRlID0gU1RBVEVfU0VMRUNURUQ7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIExvZy5lKExPR19UQUcsCi0gICAgICAgICAgICAgICAgICAgICAgICAiU2VsZWN0IGlzIG9uLCBidXQgY3Vyc29yIHBvc2l0aW9ucyBhcmUgaWxsaWdhbC46IgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIG1FU1QuZ2V0VGV4dCgpLmxlbmd0aCgpICsgIiwiICsgbUN1clN0YXJ0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiwiICsgbUN1ckVuZCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgdW5zZXRTZWxlY3QoKSB7Ci0gICAgICAgICAgICBpZiAoREJHKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQoTE9HX1RBRywgIi0tLSBvZmZTZWxlY3QiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGludCBjdXJycG9zID0gbUVTVC5nZXRTZWxlY3Rpb25TdGFydCgpOwotICAgICAgICAgICAgbUVTVC5zZXRTZWxlY3Rpb24oY3VycnBvcywgY3VycnBvcyk7Ci0gICAgICAgICAgICBtU3RhdGUgPSBTVEFURV9TRUxFQ1RfT0ZGOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIHNldFNlbGVjdFN0YXJ0UG9zKCkgewotICAgICAgICAgICAgaWYgKERCRykgewotICAgICAgICAgICAgICAgIExvZy5kKExPR19UQUcsICItLS0gc2V0U2VsZWN0U3RhcnRQb3MiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1DdXJTdGFydCA9IG1FU1QuZ2V0U2VsZWN0aW9uU3RhcnQoKTsKLSAgICAgICAgICAgIG1TdGF0ZSA9IFNUQVRFX1NFTEVDVF9PTjsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgdm9pZCBzZXRTZWxlY3RlZEVuZFBvcygpIHsKLSAgICAgICAgICAgIGlmIChEQkcpIHsKLSAgICAgICAgICAgICAgICBMb2cuZChMT0dfVEFHLCAiLS0tIHNldFNlbGVjdEVuZFBvczoiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChtRVNULmdldFNlbGVjdGlvblN0YXJ0KCkgPT0gbUN1clN0YXJ0KSB7Ci0gICAgICAgICAgICAgICAgc2V0U2VsZWN0ZWRFbmRQb3MobUVTVC5nZXRTZWxlY3Rpb25FbmQoKSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHNldFNlbGVjdGVkRW5kUG9zKG1FU1QuZ2V0U2VsZWN0aW9uU3RhcnQoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBzZXRTZWxlY3RlZEVuZFBvcyhpbnQgcG9zKSB7Ci0gICAgICAgICAgICBpZiAoREJHKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQoTE9HX1RBRywgIi0tLSBzZXRTZWxlY3RlZEVuZFBvczoiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1DdXJFbmQgPSBwb3M7Ci0gICAgICAgICAgICBzZXRTZWxlY3Rpb24oKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgYm9vbGVhbiBpc1RleHRTZWxlY3RlZCgpIHsKLSAgICAgICAgICAgIGlmIChEQkcpIHsKLSAgICAgICAgICAgICAgICBMb2cuZChMT0dfVEFHLCAiLS0tIGlzVGV4dFNlbGVjdGVkOiIgKyBtQ3VyU3RhcnQgKyAiLCIKLSAgICAgICAgICAgICAgICAgICAgICAgICsgbUN1ckVuZCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gKG1DdXJTdGFydCAhPSBtQ3VyRW5kKQotICAgICAgICAgICAgICAgICAgICAmJiAobVN0YXRlID09IFNUQVRFX1NFTEVDVEVEIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbVN0YXRlID09IFNUQVRFX1NFTEVDVF9GSVgpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIHNldFN0eWxlZFRleHRTcGFuKE9iamVjdCBzcGFuLCBpbnQgc3RhcnQsIGludCBlbmQpIHsKLSAgICAgICAgICAgIGlmIChEQkcpIHsKLSAgICAgICAgICAgICAgICBMb2cuZChMT0dfVEFHLCAiLS0tIHNldFN0eWxlZFRleHRTcGFuOiIgKyBtTW9kZSArICIsIgotICAgICAgICAgICAgICAgICAgICAgICAgKyBzdGFydCArICIsIiArIGVuZCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoc3RhcnQgPCBlbmQpIHsKLSAgICAgICAgICAgICAgICBtRVNULmdldFRleHQoKS5zZXRTcGFuKHNwYW4sIHN0YXJ0LCBlbmQsCi0gICAgICAgICAgICAgICAgICAgICAgICBTcGFubmFibGUuU1BBTl9FWENMVVNJVkVfRVhDTFVTSVZFKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgbUVTVC5nZXRUZXh0KCkuc2V0U3BhbihzcGFuLCBlbmQsIHN0YXJ0LAotICAgICAgICAgICAgICAgICAgICAgICAgU3Bhbm5hYmxlLlNQQU5fRVhDTFVTSVZFX0VYQ0xVU0lWRSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgY2hhbmdlU2l6ZVNlbGVjdGVkVGV4dChpbnQgc2l6ZSkgewotICAgICAgICAgICAgaWYgKERCRykgewotICAgICAgICAgICAgICAgIExvZy5kKExPR19UQUcsICItLS0gY2hhbmdlU2l6ZToiICsgc2l6ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzZXRTdHlsZWRUZXh0U3BhbihuZXcgQWJzb2x1dGVTaXplU3BhbihzaXplKSwKLSAgICAgICAgICAgICAgICBtQ3VyU3RhcnQsIG1DdXJFbmQpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIGNoYW5nZUNvbG9yU2VsZWN0ZWRUZXh0KGludCBjb2xvcikgewotICAgICAgICAgICAgaWYgKERCRykgewotICAgICAgICAgICAgICAgIExvZy5kKExPR19UQUcsICItLS0gY2hhbmdlQ29sb3I6IiArIGNvbG9yKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNldFN0eWxlZFRleHRTcGFuKG5ldyBGb3JlZ3JvdW5kQ29sb3JTcGFuKGNvbG9yKSwKLSAgICAgICAgICAgICAgICBtQ3VyU3RhcnQsIG1DdXJFbmQpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIGNoYW5nZUFsaWduKExheW91dC5BbGlnbm1lbnQgYWxpZ24pIHsKLSAgICAgICAgICAgIGlmIChEQkcpIHsKLSAgICAgICAgICAgICAgICBMb2cuZChMT0dfVEFHLCAiLS0tIGNoYW5nZUFsaWduOiIgKyBhbGlnbik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzZXRTdHlsZWRUZXh0U3BhbihuZXcgQWxpZ25tZW50U3Bhbi5TdGFuZGFyZChhbGlnbiksCi0gICAgICAgICAgICAgICAgICAgIGZpbmRMaW5lU3RhcnQobUVTVC5nZXRUZXh0KCksIG1DdXJTdGFydCksCi0gICAgICAgICAgICAgICAgICAgIGZpbmRMaW5lRW5kKG1FU1QuZ2V0VGV4dCgpLCBtQ3VyRW5kKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIGludCBmaW5kTGluZVN0YXJ0KEVkaXRhYmxlIHRleHQsIGludCBjdXJyZW50KSB7Ci0gICAgICAgICAgICBpZiAoREJHKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQoTE9HX1RBRywgIi0tLSBmaW5kTGluZVN0YXJ0OiBjdXJyOiIgKyBjdXJyZW50ICsKLSAgICAgICAgICAgICAgICAgICAgICAgICIsIGxlbmd0aDoiICsgdGV4dC5sZW5ndGgoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpbnQgcG9zID0gY3VycmVudDsKLSAgICAgICAgICAgIGZvciAoOyBwb3MgPiAwOyBwb3MtLSkgewotICAgICAgICAgICAgICAgIGlmICh0ZXh0LmNoYXJBdChwb3MgLSAxKSA9PSAnXG4nKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBwb3M7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgaW5zZXJ0SW1hZ2VTcGFuKEltYWdlU3BhbiBzcGFuKSB7Ci0gICAgICAgICAgICBpZiAoREJHKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQoTE9HX1RBRywgIi0tLSBpbnNlcnRJbWFnZVNwYW4iKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChzcGFuICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBMb2cuZChMT0dfVEFHLCAiLS0tIGluc2VydGltYWdlc3BhbjoiICsgc3Bhbi5nZXREcmF3YWJsZSgpLmdldEludHJpbnNpY0hlaWdodCgpICsgIiwiICsgc3Bhbi5nZXREcmF3YWJsZSgpLmdldEludHJpbnNpY1dpZHRoKCkpOwotICAgICAgICAgICAgICAgIExvZy5kKExPR19UQUcsICItLS0gaW5zZXJ0aW1hZ2VzcGFuOiIgKyBzcGFuLmdldERyYXdhYmxlKCkuZ2V0Q2xhc3MoKSk7Ci0gICAgICAgICAgICAgICAgaW50IGN1cnBvcyA9IG1FU1QuZ2V0U2VsZWN0aW9uU3RhcnQoKTsKLSAgICAgICAgICAgICAgICBtRVNULmdldFRleHQoKS5pbnNlcnQoY3VycG9zLCAiXHVGRkZDIik7Ci0gICAgICAgICAgICAgICAgbUVTVC5nZXRUZXh0KCkuc2V0U3BhbihzcGFuLCBjdXJwb3MsIGN1cnBvcyArIDEsCi0gICAgICAgICAgICAgICAgICAgICAgICBTcGFubmFibGUuU1BBTl9FWENMVVNJVkVfRVhDTFVTSVZFKTsKLSAgICAgICAgICAgICAgICBtRVNULm5vdGlmeVN0YXRlQ2hhbmdlZChtTW9kZSwgbVN0YXRlKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgTG9nLmUoTE9HX1RBRywgIi0tLSBpbnNlcnRJbWFnZVNwYW46IG51bGwgc3BhbiB3YXMgaW5zZXJ0ZWQiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgaW50IGZpbmRMaW5lRW5kKEVkaXRhYmxlIHRleHQsIGludCBjdXJyZW50KSB7Ci0gICAgICAgICAgICBpZiAoREJHKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQoTE9HX1RBRywgIi0tLSBmaW5kTGluZUVuZDogY3VycjoiICsgY3VycmVudCArCi0gICAgICAgICAgICAgICAgICAgICAgICAiLCBsZW5ndGg6IiArIHRleHQubGVuZ3RoKCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaW50IHBvcyA9IGN1cnJlbnQ7Ci0gICAgICAgICAgICBmb3IgKDsgcG9zIDwgdGV4dC5sZW5ndGgoKTsgcG9zKyspIHsKLSAgICAgICAgICAgICAgICBpZiAocG9zID4gMCAmJiB0ZXh0LmNoYXJBdChwb3MgLSAxKSA9PSAnXG4nKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBwb3M7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgYmxvY2tTb2Z0S2V5KCkgewotICAgICAgICAgICAgaWYgKERCRykgewotICAgICAgICAgICAgICAgIExvZy5kKExPR19UQUcsICItLS0gYmxvY2tTb2Z0S2V5OiIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgSW5wdXRNZXRob2RNYW5hZ2VyIGltbSA9IChJbnB1dE1ldGhvZE1hbmFnZXIpIG1FU1QuZ2V0Q29udGV4dCgpLgotICAgICAgICAgICAgZ2V0U3lzdGVtU2VydmljZShDb250ZXh0LklOUFVUX01FVEhPRF9TRVJWSUNFKTsKLSAgICAgICAgICAgIGltbS5oaWRlU29mdElucHV0RnJvbVdpbmRvdyhtRVNULmdldFdpbmRvd1Rva2VuKCksIDApOwotICAgICAgICAgICAgbUVTVC5zZXRPbkNsaWNrTGlzdGVuZXIoCi0gICAgICAgICAgICAgICAgICAgIG5ldyBPbkNsaWNrTGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkNsaWNrKFZpZXcgdikgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvZy5kKExPR19UQUcsICItLS0gb250cmFja2JhbGxjbGljazoiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbkZpeFNlbGVjdGVkSXRlbSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSk7Ci0gICAgICAgICAgICBtU29mdEtleUJsb2NrRmxhZyA9IHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgdW5ibG9ja1NvZnRLZXkoKSB7Ci0gICAgICAgICAgICBpZiAoREJHKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQoTE9HX1RBRywgIi0tLSB1bmJsb2NrU29mdEtleToiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1FU1Quc2V0T25DbGlja0xpc3RlbmVyKG51bGwpOwotICAgICAgICAgICAgbVNvZnRLZXlCbG9ja0ZsYWcgPSBmYWxzZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgY2xhc3MgU3R5bGVkVGV4dENvbnZlcnRlciB7Ci0gICAgICAgIHByaXZhdGUgRWRpdFN0eWxlZFRleHQgbUVTVDsKLQotICAgICAgICBwdWJsaWMgU3R5bGVkVGV4dENvbnZlcnRlcihFZGl0U3R5bGVkVGV4dCBlc3QpIHsKLSAgICAgICAgICAgIG1FU1QgPSBlc3Q7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgU3RyaW5nIGdldEh0bWwoKSB7Ci0gICAgICAgICAgICBTdHJpbmcgaHRtbEJvZHkgPSBIdG1sLnRvSHRtbChtRVNULmdldFRleHQoKSk7Ci0gICAgICAgICAgICBpZiAoREJHKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQoTE9HX1RBRywgIi0tLSBnZXRDb252ZXJ0ZWRCb2R5OiIgKyBodG1sQm9keSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gaHRtbEJvZHk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBnZXRVcmlBcnJheShBcnJheUxpc3Q8VXJpPiB1cmlzLCBFZGl0YWJsZSB0ZXh0KSB7Ci0gICAgICAgICAgICB1cmlzLmNsZWFyKCk7Ci0gICAgICAgICAgICBpZiAoREJHKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQoTE9HX1RBRywgIi0tLSBnZXRVcmlBcnJheToiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGludCBsZW4gPSB0ZXh0Lmxlbmd0aCgpOwotICAgICAgICAgICAgaW50IG5leHQ7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHRleHQubGVuZ3RoKCk7IGkgPSBuZXh0KSB7Ci0gICAgICAgICAgICAgICAgbmV4dCA9IHRleHQubmV4dFNwYW5UcmFuc2l0aW9uKGksIGxlbiwgSW1hZ2VTcGFuLmNsYXNzKTsKLSAgICAgICAgICAgICAgICBJbWFnZVNwYW5bXSBpbWFnZXMgPSB0ZXh0LmdldFNwYW5zKGksIG5leHQsIEltYWdlU3Bhbi5jbGFzcyk7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBpbWFnZXMubGVuZ3RoOyBqKyspIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKERCRykgewotICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmQoTE9HX1RBRywgIi0tLSBnZXRVcmlBcnJheTogZm91bmRBcnJheSIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKEltYWdlU3BhbikgaW1hZ2VzW2pdKS5nZXRTb3VyY2UoKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgdXJpcy5hZGQoVXJpLnBhcnNlKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoSW1hZ2VTcGFuKSBpbWFnZXNbal0pLmdldFNvdXJjZSgpKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgU2V0SHRtbCAoU3RyaW5nIGh0bWwpIHsKLSAgICAgICAgICAgIGZpbmFsIFNwYW5uZWQgc3Bhbm5lZCA9IEh0bWwuZnJvbUh0bWwoaHRtbCwgbmV3IEh0bWwuSW1hZ2VHZXR0ZXIoKSB7Ci0gICAgICAgICAgICAgICAgcHVibGljIERyYXdhYmxlIGdldERyYXdhYmxlKFN0cmluZyBzcmMpIHsKLSAgICAgICAgICAgICAgICAgICAgTG9nLmQoTE9HX1RBRywgIi0tLSBzZXRodG1sOiBzcmM9IitzcmMpOwotICAgICAgICAgICAgICAgICAgICBpZiAoc3JjLnN0YXJ0c1dpdGgoImNvbnRlbnQ6Ly8iKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgVXJpIHVyaSA9IFVyaS5wYXJzZShzcmMpOwotICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnB1dFN0cmVhbSBpcyA9IG1FU1QuZ2V0Q29udGV4dCgpLmdldENvbnRlbnRSZXNvbHZlcigpLm9wZW5JbnB1dFN0cmVhbSh1cmkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpdG1hcCBiaXRtYXAgPSBCaXRtYXBGYWN0b3J5LmRlY29kZVN0cmVhbShpcyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRHJhd2FibGUgZHJhd2FibGUgPSBuZXcgQml0bWFwRHJhd2FibGUoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRDb250ZXh0KCkuZ2V0UmVzb3VyY2VzKCksIGJpdG1hcCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZHJhd2FibGUuc2V0Qm91bmRzKDAsIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkcmF3YWJsZS5nZXRJbnRyaW5zaWNXaWR0aCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHJhd2FibGUuZ2V0SW50cmluc2ljSGVpZ2h0KCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzLmNsb3NlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRyYXdhYmxlOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2cuZShMT0dfVEFHLCAiLS0tIHNldCBodG1sOiBGYWlsZWQgdG8gbG9hZGVkIGNvbnRlbnQgIiArIHVyaSwgZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgTG9nLmQoTE9HX1RBRywgIiAgdW5rbm93biBzcmM9IitzcmMpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9LCBudWxsKTsKLSAgICAgICAgICAgIG1FU1Quc2V0VGV4dChzcGFubmVkKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgY2xhc3MgU3R5bGVkVGV4dERpYWxvZyB7Ci0gICAgICAgIEJ1aWxkZXIgbUJ1aWxkZXI7Ci0gICAgICAgIENoYXJTZXF1ZW5jZSBtQ29sb3JUaXRsZTsKLSAgICAgICAgQ2hhclNlcXVlbmNlIG1TaXplVGl0bGU7Ci0gICAgICAgIENoYXJTZXF1ZW5jZSBtQWxpZ25UaXRsZTsKLSAgICAgICAgQ2hhclNlcXVlbmNlW10gbUNvbG9yTmFtZXM7Ci0gICAgICAgIENoYXJTZXF1ZW5jZVtdIG1Db2xvckludHM7Ci0gICAgICAgIENoYXJTZXF1ZW5jZVtdIG1TaXplTmFtZXM7Ci0gICAgICAgIENoYXJTZXF1ZW5jZVtdIG1TaXplRGlzcGxheUludHM7Ci0gICAgICAgIENoYXJTZXF1ZW5jZVtdIG1TaXplU2VuZEludHM7Ci0gICAgICAgIENoYXJTZXF1ZW5jZVtdIG1BbGlnbk5hbWVzOwotICAgICAgICBFZGl0U3R5bGVkVGV4dCBtRVNUOwotCi0gICAgICAgIHB1YmxpYyBTdHlsZWRUZXh0RGlhbG9nKEVkaXRTdHlsZWRUZXh0IGVzdCkgewotICAgICAgICAgICAgbUVTVCA9IGVzdDsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldEJ1aWxkZXIoQnVpbGRlciBidWlsZGVyKSB7Ci0gICAgICAgICAgICBtQnVpbGRlciA9IGJ1aWxkZXI7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBzZXRDb2xvckFsZXJ0UGFyYW1zKENoYXJTZXF1ZW5jZSBjb2xvcnRpdGxlLAotICAgICAgICAgICAgICAgIENoYXJTZXF1ZW5jZVtdIGNvbG9ybmFtZXMsIENoYXJTZXF1ZW5jZVtdIGNvbG9yaW50cykgewotICAgICAgICAgICAgbUNvbG9yVGl0bGUgPSBjb2xvcnRpdGxlOwotICAgICAgICAgICAgbUNvbG9yTmFtZXMgPSBjb2xvcm5hbWVzOwotICAgICAgICAgICAgbUNvbG9ySW50cyA9IGNvbG9yaW50czsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldFNpemVBbGVydFBhcmFtcyhDaGFyU2VxdWVuY2Ugc2l6ZXRpdGxlLAotICAgICAgICAgICAgICAgIENoYXJTZXF1ZW5jZVtdIHNpemVuYW1lcywgQ2hhclNlcXVlbmNlW10gc2l6ZWRpc3BsYXlpbnRzLAotICAgICAgICAgICAgICAgIENoYXJTZXF1ZW5jZVtdIHNpemVzZW5kaW50cykgewotICAgICAgICAgICAgbVNpemVUaXRsZSA9IHNpemV0aXRsZTsKLSAgICAgICAgICAgIG1TaXplTmFtZXMgPSBzaXplbmFtZXM7Ci0gICAgICAgICAgICBtU2l6ZURpc3BsYXlJbnRzID0gc2l6ZWRpc3BsYXlpbnRzOwotICAgICAgICAgICAgbVNpemVTZW5kSW50cyA9IHNpemVzZW5kaW50czsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldEFsaWduQWxlcnRQYXJhbXMoQ2hhclNlcXVlbmNlIGFsaWdudGl0bGUsCi0gICAgICAgICAgICAgICAgQ2hhclNlcXVlbmNlW10gYWxpZ25uYW1lcykgewotICAgICAgICAgICAgbUFsaWduVGl0bGUgPSBhbGlnbnRpdGxlOwotICAgICAgICAgICAgbUFsaWduTmFtZXMgPSBhbGlnbm5hbWVzOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBib29sZWFuIGNoZWNrQ29sb3JBbGVydFBhcmFtcygpIHsKLSAgICAgICAgICAgIGlmIChEQkcpIHsKLSAgICAgICAgICAgICAgICBMb2cuZChMT0dfVEFHLCAiLS0tIGNoZWNrUGFyYW1zIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAobUJ1aWxkZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIExvZy5lKExPR19UQUcsICItLS0gYnVpbGRlciBpcyBudWxsLiIpOwotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAobUNvbG9yVGl0bGUgPT0gbnVsbCB8fCBtQ29sb3JOYW1lcyA9PSBudWxsCi0gICAgICAgICAgICAgICAgICAgIHx8IG1Db2xvckludHMgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIExvZy5lKExPR19UQUcsICItLS0gY29sb3IgYWxlcnQgcGFyYW1zIGFyZSBudWxsLiIpOwotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAobUNvbG9yTmFtZXMubGVuZ3RoICE9IG1Db2xvckludHMubGVuZ3RoKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmUoTE9HX1RBRywgIi0tLSB0aGUgbGVuZ3RoIG9mIGNvbG9yIGFsZXJ0IHBhcmFtcyBhcmUgIgotICAgICAgICAgICAgICAgICAgICAgICAgKyAiZGlmZmVyZW50LiIpOwotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBib29sZWFuIGNoZWNrU2l6ZUFsZXJ0UGFyYW1zKCkgewotICAgICAgICAgICAgaWYgKERCRykgewotICAgICAgICAgICAgICAgIExvZy5kKExPR19UQUcsICItLS0gY2hlY2tQYXJhbXMiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChtQnVpbGRlciA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmUoTE9HX1RBRywgIi0tLSBidWlsZGVyIGlzIG51bGwuIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfSBlbHNlIGlmIChtU2l6ZVRpdGxlID09IG51bGwgfHwgbVNpemVOYW1lcyA9PSBudWxsCi0gICAgICAgICAgICAgICAgICAgIHx8IG1TaXplRGlzcGxheUludHMgPT0gbnVsbCB8fCBtU2l6ZVNlbmRJbnRzID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBMb2cuZShMT0dfVEFHLCAiLS0tIHNpemUgYWxlcnQgcGFyYW1zIGFyZSBudWxsLiIpOwotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAobVNpemVOYW1lcy5sZW5ndGggIT0gbVNpemVEaXNwbGF5SW50cy5sZW5ndGgKLSAgICAgICAgICAgICAgICAgICAgJiYgbVNpemVTZW5kSW50cy5sZW5ndGggIT0gbVNpemVEaXNwbGF5SW50cy5sZW5ndGgpIHsKLSAgICAgICAgICAgICAgICBMb2cuZShMT0dfVEFHLCAiLS0tIHRoZSBsZW5ndGggb2Ygc2l6ZSBhbGVydCBwYXJhbXMgYXJlICIKLSAgICAgICAgICAgICAgICAgICAgICAgICsgImRpZmZlcmVudC4iKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgYm9vbGVhbiBjaGVja0FsaWduQWxlcnRQYXJhbXMoKSB7Ci0gICAgICAgICAgICBpZiAoREJHKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQoTE9HX1RBRywgIi0tLSBjaGVja0FsaWduQWxlcnRQYXJhbXMiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChtQnVpbGRlciA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmUoTE9HX1RBRywgIi0tLSBidWlsZGVyIGlzIG51bGwuIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfSBlbHNlIGlmIChtQWxpZ25UaXRsZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmUoTE9HX1RBRywgIi0tLSBhbGlnbiBhbGVydCBwYXJhbXMgYXJlIG51bGwuIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgb25TaG93Rm9yZWdyb3VuZENvbG9yQWxlcnREaWFsb2coKSB7Ci0gICAgICAgICAgICBpZiAoREJHKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQoTE9HX1RBRywgIi0tLSBvblNob3dGb3JlZ3JvdW5kQ29sb3JBbGVydERpYWxvZyIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKCFjaGVja0NvbG9yQWxlcnRQYXJhbXMoKSkgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1CdWlsZGVyLnNldFRpdGxlKG1Db2xvclRpdGxlKTsKLSAgICAgICAgICAgIG1CdWlsZGVyLnNldEljb24oMCk7Ci0gICAgICAgICAgICBtQnVpbGRlci4KLSAgICAgICAgICAgIHNldEl0ZW1zKG1Db2xvck5hbWVzLAotICAgICAgICAgICAgICAgICAgICBuZXcgRGlhbG9nSW50ZXJmYWNlLk9uQ2xpY2tMaXN0ZW5lcigpIHsKLSAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkNsaWNrKERpYWxvZ0ludGVyZmFjZSBkaWFsb2csIGludCB3aGljaCkgewotICAgICAgICAgICAgICAgICAgICBMb2cuZCgiRUVUVk0iLCAibUJ1aWxkZXIub25jbGljazoiICsgd2hpY2gpOwotICAgICAgICAgICAgICAgICAgICBpbnQgY29sb3IgPSBJbnRlZ2VyLnBhcnNlSW50KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChTdHJpbmcpIG1Db2xvckludHNbd2hpY2hdLCAxNikgLSAweDAxMDAwMDAwOwotICAgICAgICAgICAgICAgICAgICBtRVNULnNldEl0ZW1Db2xvcihjb2xvcik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSk7Ci0gICAgICAgICAgICBtQnVpbGRlci5zaG93KCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgb25TaG93QmFja2dyb3VuZENvbG9yQWxlcnREaWFsb2coKSB7Ci0gICAgICAgICAgICBpZiAoREJHKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQoTE9HX1RBRywgIi0tLSBvblNob3dCYWNrZ3JvdW5kQ29sb3JBbGVydERpYWxvZyIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKCFjaGVja0NvbG9yQWxlcnRQYXJhbXMoKSkgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1CdWlsZGVyLnNldFRpdGxlKG1Db2xvclRpdGxlKTsKLSAgICAgICAgICAgIG1CdWlsZGVyLnNldEljb24oMCk7Ci0gICAgICAgICAgICBtQnVpbGRlci4KLSAgICAgICAgICAgIHNldEl0ZW1zKG1Db2xvck5hbWVzLAotICAgICAgICAgICAgICAgICAgICBuZXcgRGlhbG9nSW50ZXJmYWNlLk9uQ2xpY2tMaXN0ZW5lcigpIHsKLSAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkNsaWNrKERpYWxvZ0ludGVyZmFjZSBkaWFsb2csIGludCB3aGljaCkgewotICAgICAgICAgICAgICAgICAgICBMb2cuZCgiRUVUVk0iLCAibUJ1aWxkZXIub25jbGljazoiICsgd2hpY2gpOwotICAgICAgICAgICAgICAgICAgICBpbnQgY29sb3IgPSBJbnRlZ2VyLnBhcnNlSW50KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChTdHJpbmcpIG1Db2xvckludHNbd2hpY2hdLCAxNikgLSAweDAxMDAwMDAwOwotICAgICAgICAgICAgICAgICAgICBtRVNULnNldEJhY2tncm91bmRDb2xvcihjb2xvcik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSk7Ci0gICAgICAgICAgICBtQnVpbGRlci5zaG93KCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgb25TaG93U2l6ZUFsZXJ0RGlhbG9nKCkgewotICAgICAgICAgICAgaWYgKERCRykgewotICAgICAgICAgICAgICAgIExvZy5kKExPR19UQUcsICItLS0gb25TaG93U2l6ZUFsZXJ0RGlhbG9nIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoIWNoZWNrU2l6ZUFsZXJ0UGFyYW1zKCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtQnVpbGRlci5zZXRUaXRsZShtU2l6ZVRpdGxlKTsKLSAgICAgICAgICAgIG1CdWlsZGVyLnNldEljb24oMCk7Ci0gICAgICAgICAgICBtQnVpbGRlci4KLSAgICAgICAgICAgIHNldEl0ZW1zKG1TaXplTmFtZXMsCi0gICAgICAgICAgICAgICAgICAgIG5ldyBEaWFsb2dJbnRlcmZhY2UuT25DbGlja0xpc3RlbmVyKCkgewotICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uQ2xpY2soRGlhbG9nSW50ZXJmYWNlIGRpYWxvZywgaW50IHdoaWNoKSB7Ci0gICAgICAgICAgICAgICAgICAgIExvZy5kKExPR19UQUcsICJtQnVpbGRlci5vbmNsaWNrOiIgKyB3aGljaCk7Ci0gICAgICAgICAgICAgICAgICAgIGludCBzaXplID0gSW50ZWdlcgotICAgICAgICAgICAgICAgICAgICAucGFyc2VJbnQoKFN0cmluZykgbVNpemVEaXNwbGF5SW50c1t3aGljaF0pOwotICAgICAgICAgICAgICAgICAgICBtRVNULnNldEl0ZW1TaXplKHNpemUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0pOwotICAgICAgICAgICAgbUJ1aWxkZXIuc2hvdygpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIG9uU2hvd0FsaWduQWxlcnREaWFsb2coKSB7Ci0gICAgICAgICAgICBpZiAoREJHKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQoTE9HX1RBRywgIi0tLSBvblNob3dBbGlnbkFsZXJ0RGlhbG9nIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoIWNoZWNrQWxpZ25BbGVydFBhcmFtcygpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbUJ1aWxkZXIuc2V0VGl0bGUobUFsaWduVGl0bGUpOwotICAgICAgICAgICAgbUJ1aWxkZXIuc2V0SWNvbigwKTsKLSAgICAgICAgICAgIG1CdWlsZGVyLgotICAgICAgICAgICAgc2V0SXRlbXMobUFsaWduTmFtZXMsCi0gICAgICAgICAgICAgICAgICAgIG5ldyBEaWFsb2dJbnRlcmZhY2UuT25DbGlja0xpc3RlbmVyKCkgewotICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uQ2xpY2soRGlhbG9nSW50ZXJmYWNlIGRpYWxvZywgaW50IHdoaWNoKSB7Ci0gICAgICAgICAgICAgICAgICAgIExvZy5kKExPR19UQUcsICJtQnVpbGRlci5vbmNsaWNrOiIgKyB3aGljaCk7Ci0gICAgICAgICAgICAgICAgICAgIExheW91dC5BbGlnbm1lbnQgYWxpZ24gPSBMYXlvdXQuQWxpZ25tZW50LkFMSUdOX05PUk1BTDsKLSAgICAgICAgICAgICAgICAgICAgc3dpdGNoICh3aGljaCkgewotICAgICAgICAgICAgICAgICAgICBjYXNlIDA6Ci0gICAgICAgICAgICAgICAgICAgICAgICBhbGlnbiA9IExheW91dC5BbGlnbm1lbnQuQUxJR05fTk9STUFMOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgMToKLSAgICAgICAgICAgICAgICAgICAgICAgIGFsaWduID0gTGF5b3V0LkFsaWdubWVudC5BTElHTl9DRU5URVI7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSAyOgotICAgICAgICAgICAgICAgICAgICAgICAgYWxpZ24gPSBMYXlvdXQuQWxpZ25tZW50LkFMSUdOX09QUE9TSVRFOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBtRVNULnNldEFsaWdubWVudChhbGlnbik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSk7Ci0gICAgICAgICAgICBtQnVpbGRlci5zaG93KCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIGNsYXNzIFN0eWxlZFRleHRBcnJvd0tleU1ldGhvZCBleHRlbmRzIEFycm93S2V5TW92ZW1lbnRNZXRob2QgewotICAgICAgICBFZGl0b3JNYW5hZ2VyIG1NYW5hZ2VyOwotICAgICAgICBTdHlsZWRUZXh0QXJyb3dLZXlNZXRob2QoRWRpdG9yTWFuYWdlciBtYW5hZ2VyKSB7Ci0gICAgICAgICAgICBzdXBlcigpOwotICAgICAgICAgICAgbU1hbmFnZXIgPSBtYW5hZ2VyOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBib29sZWFuIG9uS2V5RG93bihUZXh0VmlldyB3aWRnZXQsIFNwYW5uYWJsZSBidWZmZXIsCi0gICAgICAgICAgICAgICAgaW50IGtleUNvZGUsIEtleUV2ZW50IGV2ZW50KSB7Ci0gICAgICAgICAgICBpZiAoIW1NYW5hZ2VyLmlzU29mdEtleUJsb2NrZWQoKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBzdXBlci5vbktleURvd24od2lkZ2V0LCBidWZmZXIsIGtleUNvZGUsIGV2ZW50KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChleGVjdXRlRG93bih3aWRnZXQsIGJ1ZmZlciwga2V5Q29kZSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgaW50IGdldEVuZFBvcyhUZXh0VmlldyB3aWRnZXQpIHsKLSAgICAgICAgICAgIGludCBlbmQ7Ci0gICAgICAgICAgICBpZiAod2lkZ2V0LmdldFNlbGVjdGlvblN0YXJ0KCkgPT0gbU1hbmFnZXIuZ2V0U2VsZWN0aW9uU3RhcnQoKSkgewotICAgICAgICAgICAgICAgIGVuZCA9IHdpZGdldC5nZXRTZWxlY3Rpb25FbmQoKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgZW5kID0gd2lkZ2V0LmdldFNlbGVjdGlvblN0YXJ0KCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gZW5kOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBib29sZWFuIHVwKFRleHRWaWV3IHdpZGdldCwgU3Bhbm5hYmxlIGJ1ZmZlcikgewotICAgICAgICAgICAgaWYgKERCRykgewotICAgICAgICAgICAgICAgIExvZy5kKExPR19UQUcsICItLS0gdXA6Iik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBMYXlvdXQgbGF5b3V0ID0gd2lkZ2V0LmdldExheW91dCgpOwotICAgICAgICAgICAgaW50IGVuZCA9IGdldEVuZFBvcyh3aWRnZXQpOwotICAgICAgICAgICAgaW50IGxpbmUgPSBsYXlvdXQuZ2V0TGluZUZvck9mZnNldChlbmQpOwotICAgICAgICAgICAgaWYgKGxpbmUgPiAwKSB7Ci0gICAgICAgICAgICAgICAgaW50IHRvOwotICAgICAgICAgICAgICAgIGlmIChsYXlvdXQuZ2V0UGFyYWdyYXBoRGlyZWN0aW9uKGxpbmUpID09Ci0gICAgICAgICAgICAgICAgICAgIGxheW91dC5nZXRQYXJhZ3JhcGhEaXJlY3Rpb24obGluZSAtIDEpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZsb2F0IGggPSBsYXlvdXQuZ2V0UHJpbWFyeUhvcml6b250YWwoZW5kKTsKLSAgICAgICAgICAgICAgICAgICAgdG8gPSBsYXlvdXQuZ2V0T2Zmc2V0Rm9ySG9yaXpvbnRhbChsaW5lIC0gMSwgaCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgdG8gPSBsYXlvdXQuZ2V0TGluZVN0YXJ0KGxpbmUgLSAxKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbU1hbmFnZXIuc2V0U2VsZWN0ZWRFbmRQb3ModG8pOwotICAgICAgICAgICAgICAgIG1NYW5hZ2VyLm9uQ3Vyc29yTW92ZWQoKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgYm9vbGVhbiBkb3duKFRleHRWaWV3IHdpZGdldCwgU3Bhbm5hYmxlIGJ1ZmZlcikgewotICAgICAgICAgICAgaWYgKERCRykgewotICAgICAgICAgICAgICAgIExvZy5kKExPR19UQUcsICItLS0gZG93bjoiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIExheW91dCBsYXlvdXQgPSB3aWRnZXQuZ2V0TGF5b3V0KCk7Ci0gICAgICAgICAgICBpbnQgZW5kID0gZ2V0RW5kUG9zKHdpZGdldCk7Ci0gICAgICAgICAgICBpbnQgbGluZSA9IGxheW91dC5nZXRMaW5lRm9yT2Zmc2V0KGVuZCk7Ci0gICAgICAgICAgICBpZiAobGluZSA8IGxheW91dC5nZXRMaW5lQ291bnQoKSAtIDEpIHsKLSAgICAgICAgICAgICAgICBpbnQgdG87Ci0gICAgICAgICAgICAgICAgaWYgKGxheW91dC5nZXRQYXJhZ3JhcGhEaXJlY3Rpb24obGluZSkgPT0KLSAgICAgICAgICAgICAgICAgICAgbGF5b3V0LmdldFBhcmFncmFwaERpcmVjdGlvbihsaW5lICsgMSkpIHsKLSAgICAgICAgICAgICAgICAgICAgZmxvYXQgaCA9IGxheW91dC5nZXRQcmltYXJ5SG9yaXpvbnRhbChlbmQpOwotICAgICAgICAgICAgICAgICAgICB0byA9IGxheW91dC5nZXRPZmZzZXRGb3JIb3Jpem9udGFsKGxpbmUgKyAxLCBoKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICB0byA9IGxheW91dC5nZXRMaW5lU3RhcnQobGluZSArIDEpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBtTWFuYWdlci5zZXRTZWxlY3RlZEVuZFBvcyh0byk7Ci0gICAgICAgICAgICAgICAgbU1hbmFnZXIub25DdXJzb3JNb3ZlZCgpOwotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBib29sZWFuIGxlZnQoVGV4dFZpZXcgd2lkZ2V0LCBTcGFubmFibGUgYnVmZmVyKSB7Ci0gICAgICAgICAgICBpZiAoREJHKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQoTE9HX1RBRywgIi0tLSBsZWZ0OiIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgTGF5b3V0IGxheW91dCA9IHdpZGdldC5nZXRMYXlvdXQoKTsKLSAgICAgICAgICAgIGludCB0byA9IGxheW91dC5nZXRPZmZzZXRUb0xlZnRPZihnZXRFbmRQb3Mod2lkZ2V0KSk7Ci0gICAgICAgICAgICBtTWFuYWdlci5zZXRTZWxlY3RlZEVuZFBvcyh0byk7Ci0gICAgICAgICAgICBtTWFuYWdlci5vbkN1cnNvck1vdmVkKCk7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgYm9vbGVhbiByaWdodChUZXh0VmlldyB3aWRnZXQsIFNwYW5uYWJsZSBidWZmZXIpIHsKLSAgICAgICAgICAgIGlmIChEQkcpIHsKLSAgICAgICAgICAgICAgICBMb2cuZChMT0dfVEFHLCAiLS0tIHJpZ2h0OiIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgTGF5b3V0IGxheW91dCA9IHdpZGdldC5nZXRMYXlvdXQoKTsKLSAgICAgICAgICAgIGludCB0byA9IGxheW91dC5nZXRPZmZzZXRUb1JpZ2h0T2YoZ2V0RW5kUG9zKHdpZGdldCkpOwotICAgICAgICAgICAgbU1hbmFnZXIuc2V0U2VsZWN0ZWRFbmRQb3ModG8pOwotICAgICAgICAgICAgbU1hbmFnZXIub25DdXJzb3JNb3ZlZCgpOwotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIGJvb2xlYW4gZXhlY3V0ZURvd24oVGV4dFZpZXcgd2lkZ2V0LCBTcGFubmFibGUgYnVmZmVyLAotICAgICAgICAgICAgICAgIGludCBrZXlDb2RlKSB7Ci0gICAgICAgICAgICBpZiAoREJHKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQoTE9HX1RBRywgIi0tLSBleGVjdXRlRG93bjogIiArIGtleUNvZGUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYm9vbGVhbiBoYW5kbGVkID0gZmFsc2U7Ci0KLSAgICAgICAgICAgIHN3aXRjaCAoa2V5Q29kZSkgewotICAgICAgICAgICAgY2FzZSBLZXlFdmVudC5LRVlDT0RFX0RQQURfVVA6Ci0gICAgICAgICAgICAgICAgaGFuZGxlZCB8PSB1cCh3aWRnZXQsIGJ1ZmZlcik7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIEtleUV2ZW50LktFWUNPREVfRFBBRF9ET1dOOgotICAgICAgICAgICAgICAgIGhhbmRsZWQgfD0gZG93bih3aWRnZXQsIGJ1ZmZlcik7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIEtleUV2ZW50LktFWUNPREVfRFBBRF9MRUZUOgotICAgICAgICAgICAgICAgIGhhbmRsZWQgfD0gbGVmdCh3aWRnZXQsIGJ1ZmZlcik7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIEtleUV2ZW50LktFWUNPREVfRFBBRF9SSUdIVDoKLSAgICAgICAgICAgICAgICBoYW5kbGVkIHw9IHJpZ2h0KHdpZGdldCwgYnVmZmVyKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIEtleUV2ZW50LktFWUNPREVfRFBBRF9DRU5URVI6Ci0gICAgICAgICAgICAgICAgICAgIG1NYW5hZ2VyLm9uRml4U2VsZWN0ZWRJdGVtKCk7Ci0gICAgICAgICAgICAgICAgICAgIGhhbmRsZWQgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBoYW5kbGVkOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIGNsYXNzIEhvcml6b250YWxMaW5lU3BhbiBleHRlbmRzIEltYWdlU3BhbiB7Ci0gICAgICAgIHB1YmxpYyBIb3Jpem9udGFsTGluZVNwYW4oaW50IGNvbG9yLCBWaWV3IHZpZXcpIHsKLSAgICAgICAgICAgIHN1cGVyKG5ldyBIb3Jpem9udGFsTGluZURyYXdhYmxlKGNvbG9yLCB2aWV3KSk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcHVibGljIGNsYXNzIEhvcml6b250YWxMaW5lRHJhd2FibGUgZXh0ZW5kcyBTaGFwZURyYXdhYmxlIHsKLSAgICAgICAgcHJpdmF0ZSBWaWV3IG1WaWV3OwotICAgICAgICBwdWJsaWMgSG9yaXpvbnRhbExpbmVEcmF3YWJsZShpbnQgY29sb3IsIFZpZXcgdmlldykgewotICAgICAgICAgICAgc3VwZXIobmV3IFJlY3RTaGFwZSgpKTsKLSAgICAgICAgICAgIG1WaWV3ID0gdmlldzsKLSAgICAgICAgICAgIHJlbmV3Q29sb3IoY29sb3IpOwotICAgICAgICAgICAgcmVuZXdCb3VuZHModmlldyk7Ci0gICAgICAgIH0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIGRyYXcoQ2FudmFzIGNhbnZhcykgewotICAgICAgICAgICAgaWYgKERCRykgewotICAgICAgICAgICAgICAgIExvZy5kKExPR19UQUcsICItLS0gZHJhdzoiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJlbmV3Q29sb3IoKTsKLSAgICAgICAgICAgIHJlbmV3Qm91bmRzKG1WaWV3KTsKLSAgICAgICAgICAgIHN1cGVyLmRyYXcoY2FudmFzKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgdm9pZCByZW5ld0JvdW5kcyhWaWV3IHZpZXcpIHsKLSAgICAgICAgICAgIGlmIChEQkcpIHsKLSAgICAgICAgICAgICAgICBpbnQgd2lkdGggPSBtVmlldy5nZXRCYWNrZ3JvdW5kKCkuZ2V0Qm91bmRzKCkud2lkdGgoKTsKLSAgICAgICAgICAgICAgICBpbnQgaGVpZ2h0ID0gbVZpZXcuZ2V0QmFja2dyb3VuZCgpLmdldEJvdW5kcygpLmhlaWdodCgpOwotICAgICAgICAgICAgICAgIExvZy5kKExPR19UQUcsICItLS0gcmVuZXdCb3VuZHM6IiArIHdpZHRoICsgIiwiICsgaGVpZ2h0KTsKLSAgICAgICAgICAgICAgICBMb2cuZChMT0dfVEFHLCAiLS0tIHJlbmV3Qm91bmRzOiIgKyBtVmlldy5nZXRDbGFzcygpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGludCB3aWR0aCA9IG1WaWV3LmdldFdpZHRoKCk7Ci0gICAgICAgICAgICBpZiAod2lkdGggPiAyMCkgewotICAgICAgICAgICAgICAgIHdpZHRoIC09IDIwOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2V0Qm91bmRzKDAsIDAsIHdpZHRoLCAyKTsKLSAgICAgICAgfQotICAgICAgICBwcml2YXRlIHZvaWQgcmVuZXdDb2xvcihpbnQgY29sb3IpIHsKLSAgICAgICAgICAgIGlmIChEQkcpIHsKLSAgICAgICAgICAgICAgICBMb2cuZChMT0dfVEFHLCAiLS0tIHJlbmV3Q29sb3I6IiArIGNvbG9yKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGdldFBhaW50KCkuc2V0Q29sb3IoY29sb3IpOwotICAgICAgICB9Ci0gICAgICAgIHByaXZhdGUgdm9pZCByZW5ld0NvbG9yKCkgewotICAgICAgICAgICAgaWYgKERCRykgewotICAgICAgICAgICAgICAgIExvZy5kKExPR19UQUcsICItLS0gcmVuZXdDb2xvcjoiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChtVmlldyBpbnN0YW5jZW9mIFZpZXcpIHsKLSAgICAgICAgICAgICAgICBJbWFnZVNwYW4gcGFyZW50ID0gZ2V0UGFyZW50U3BhbigpOwotICAgICAgICAgICAgICAgIEVkaXRhYmxlIHRleHQgPSAoKEVkaXRTdHlsZWRUZXh0KW1WaWV3KS5nZXRUZXh0KCk7Ci0gICAgICAgICAgICAgICAgaW50IHN0YXJ0ID0gdGV4dC5nZXRTcGFuU3RhcnQocGFyZW50KTsKLSAgICAgICAgICAgICAgICBGb3JlZ3JvdW5kQ29sb3JTcGFuW10gc3BhbnMgPSB0ZXh0LmdldFNwYW5zKHN0YXJ0LCBzdGFydCwgRm9yZWdyb3VuZENvbG9yU3Bhbi5jbGFzcyk7Ci0gICAgICAgICAgICAgICAgaWYgKHNwYW5zLmxlbmd0aCA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgcmVuZXdDb2xvcihzcGFuc1tzcGFucy5sZW5ndGggLSAxXS5nZXRGb3JlZ3JvdW5kQ29sb3IoKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHByaXZhdGUgSW1hZ2VTcGFuIGdldFBhcmVudFNwYW4oKSB7Ci0gICAgICAgICAgICBpZiAoREJHKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQoTE9HX1RBRywgIi0tLSBnZXRQYXJlbnRTcGFuOiIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKG1WaWV3IGluc3RhbmNlb2YgRWRpdFN0eWxlZFRleHQpIHsKLSAgICAgICAgICAgICAgICBFZGl0YWJsZSB0ZXh0ID0gKChFZGl0U3R5bGVkVGV4dCltVmlldykuZ2V0VGV4dCgpOwotICAgICAgICAgICAgICAgIEltYWdlU3BhbltdIGltYWdlcyA9IHRleHQuZ2V0U3BhbnMoMCwgdGV4dC5sZW5ndGgoKSwgSW1hZ2VTcGFuLmNsYXNzKTsKLSAgICAgICAgICAgICAgICBpZiAoaW1hZ2VzLmxlbmd0aCA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChJbWFnZVNwYW4gaW1hZ2U6IGltYWdlcykgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGltYWdlLmdldERyYXdhYmxlKCkgPT0gdGhpcykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpbWFnZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIExvZy5lKExPR19UQUcsICItLS1yZW5ld0JvdW5kczogQ291bGRuJ3QgZmluZCIpOwotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvd2lkZ2V0L0lSZW1vdGVWaWV3c0ZhY3RvcnkuYWlkbCBiL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC93aWRnZXQvSVJlbW90ZVZpZXdzRmFjdG9yeS5haWRsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFlOTkwMGMKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvd2lkZ2V0L0lSZW1vdGVWaWV3c0ZhY3RvcnkuYWlkbApAQCAtMCwwICsxLDMxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5pbnRlcm5hbC53aWRnZXQ7CisKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5SZW1vdGVWaWV3czsKKworLyoqIHtAaGlkZX0gKi8KK2ludGVyZmFjZSBJUmVtb3RlVmlld3NGYWN0b3J5IHsKKyAgICB2b2lkIG9uRGF0YVNldENoYW5nZWQoKTsKKyAgICBpbnQgZ2V0Q291bnQoKTsKKyAgICBSZW1vdGVWaWV3cyBnZXRWaWV3QXQoaW50IHBvc2l0aW9uKTsKKyAgICBSZW1vdGVWaWV3cyBnZXRMb2FkaW5nVmlldygpOworICAgIGludCBnZXRWaWV3VHlwZUNvdW50KCk7CisgICAgbG9uZyBnZXRJdGVtSWQoaW50IHBvc2l0aW9uKTsKKyAgICBib29sZWFuIGhhc1N0YWJsZUlkcygpOworfQorCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvd2lkZ2V0L0xvY2tQYXR0ZXJuVXRpbHMuamF2YSBiL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC93aWRnZXQvTG9ja1BhdHRlcm5VdGlscy5qYXZhCmluZGV4IGM3ODg2MDUuLjkwNDIzYmUgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC93aWRnZXQvTG9ja1BhdHRlcm5VdGlscy5qYXZhCisrKyBiL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC93aWRnZXQvTG9ja1BhdHRlcm5VdGlscy5qYXZhCkBAIC05Niw2ICs5Niw4IEBACiAgICAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUEFTU1dPUkRfVFlQRV9LRVkgPSAibG9ja3NjcmVlbi5wYXNzd29yZF90eXBlIjsKICAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgTE9DS19QQVNTV09SRF9TQUxUX0tFWSA9ICJsb2Nrc2NyZWVuLnBhc3N3b3JkX3NhbHQiOwogCisgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIFBBU1NXT1JEX0hJU1RPUllfS0VZID0gImxvY2tzY3JlZW4ucGFzc3dvcmRoaXN0b3J5IjsKKwogICAgIHByaXZhdGUgZmluYWwgQ29udGV4dCBtQ29udGV4dDsKICAgICBwcml2YXRlIGZpbmFsIENvbnRlbnRSZXNvbHZlciBtQ29udGVudFJlc29sdmVyOwogICAgIHByaXZhdGUgRGV2aWNlUG9saWN5TWFuYWdlciBtRGV2aWNlUG9saWN5TWFuYWdlcjsKQEAgLTE2Myw2ICsxNjUsMzMgQEAKICAgICAgICAgcmV0dXJuIGdldERldmljZVBvbGljeU1hbmFnZXIoKS5nZXRQYXNzd29yZFF1YWxpdHkobnVsbCk7CiAgICAgfQogCisgICAgcHVibGljIGludCBnZXRSZXF1ZXN0ZWRQYXNzd29yZEhpc3RvcnlMZW5ndGgoKSB7CisgICAgICAgIHJldHVybiBnZXREZXZpY2VQb2xpY3lNYW5hZ2VyKCkuZ2V0UGFzc3dvcmRIaXN0b3J5TGVuZ3RoKG51bGwpOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgZ2V0UmVxdWVzdGVkUGFzc3dvcmRNaW5pbXVtTGV0dGVycygpIHsKKyAgICAgICAgcmV0dXJuIGdldERldmljZVBvbGljeU1hbmFnZXIoKS5nZXRQYXNzd29yZE1pbmltdW1MZXR0ZXJzKG51bGwpOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgZ2V0UmVxdWVzdGVkUGFzc3dvcmRNaW5pbXVtVXBwZXJDYXNlKCkgeworICAgICAgICByZXR1cm4gZ2V0RGV2aWNlUG9saWN5TWFuYWdlcigpLmdldFBhc3N3b3JkTWluaW11bVVwcGVyQ2FzZShudWxsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGdldFJlcXVlc3RlZFBhc3N3b3JkTWluaW11bUxvd2VyQ2FzZSgpIHsKKyAgICAgICAgcmV0dXJuIGdldERldmljZVBvbGljeU1hbmFnZXIoKS5nZXRQYXNzd29yZE1pbmltdW1Mb3dlckNhc2UobnVsbCk7CisgICAgfQorCisgICAgcHVibGljIGludCBnZXRSZXF1ZXN0ZWRQYXNzd29yZE1pbmltdW1OdW1lcmljKCkgeworICAgICAgICByZXR1cm4gZ2V0RGV2aWNlUG9saWN5TWFuYWdlcigpLmdldFBhc3N3b3JkTWluaW11bU51bWVyaWMobnVsbCk7CisgICAgfQorCisgICAgcHVibGljIGludCBnZXRSZXF1ZXN0ZWRQYXNzd29yZE1pbmltdW1TeW1ib2xzKCkgeworICAgICAgICByZXR1cm4gZ2V0RGV2aWNlUG9saWN5TWFuYWdlcigpLmdldFBhc3N3b3JkTWluaW11bVN5bWJvbHMobnVsbCk7CisgICAgfQorCisgICAgcHVibGljIGludCBnZXRSZXF1ZXN0ZWRQYXNzd29yZE1pbmltdW1Ob25MZXR0ZXIoKSB7CisgICAgICAgIHJldHVybiBnZXREZXZpY2VQb2xpY3lNYW5hZ2VyKCkuZ2V0UGFzc3dvcmRNaW5pbXVtTm9uTGV0dGVyKG51bGwpOworICAgIH0KICAgICAvKioKICAgICAgKiBSZXR1cm5zIHRoZSBhY3R1YWwgcGFzc3dvcmQgbW9kZSwgYXMgc2V0IGJ5IGtleWd1YXJkIGFmdGVyIHVwZGF0aW5nIHRoZSBwYXNzd29yZC4KICAgICAgKgpAQCAtMjI3LDYgKzI1NiwzMyBAQAogICAgIH0KIAogICAgIC8qKgorICAgICAqIENoZWNrIHRvIHNlZSBpZiBhIHBhc3N3b3JkIG1hdGNoZXMgYW55IG9mIHRoZSBwYXNzd29yZHMgc3RvcmVkIGluIHRoZQorICAgICAqIHBhc3N3b3JkIGhpc3RvcnkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcGFzc3dvcmQgVGhlIHBhc3N3b3JkIHRvIGNoZWNrLgorICAgICAqIEByZXR1cm4gV2hldGhlciB0aGUgcGFzc3dvcmQgbWF0Y2hlcyBhbnkgaW4gdGhlIGhpc3RvcnkuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gY2hlY2tQYXNzd29yZEhpc3RvcnkoU3RyaW5nIHBhc3N3b3JkKSB7CisgICAgICAgIFN0cmluZyBwYXNzd29yZEhhc2hTdHJpbmcgPSBuZXcgU3RyaW5nKHBhc3N3b3JkVG9IYXNoKHBhc3N3b3JkKSk7CisgICAgICAgIFN0cmluZyBwYXNzd29yZEhpc3RvcnkgPSBnZXRTdHJpbmcoUEFTU1dPUkRfSElTVE9SWV9LRVkpOworICAgICAgICBpZiAocGFzc3dvcmRIaXN0b3J5ID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICAvLyBQYXNzd29yZCBIaXN0b3J5IG1heSBiZSB0b28gbG9uZy4uLgorICAgICAgICBpbnQgcGFzc3dvcmRIYXNoTGVuZ3RoID0gcGFzc3dvcmRIYXNoU3RyaW5nLmxlbmd0aCgpOworICAgICAgICBpbnQgcGFzc3dvcmRIaXN0b3J5TGVuZ3RoID0gZ2V0UmVxdWVzdGVkUGFzc3dvcmRIaXN0b3J5TGVuZ3RoKCk7CisgICAgICAgIGlmKHBhc3N3b3JkSGlzdG9yeUxlbmd0aCA9PSAwKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgaW50IG5lZWRlZFBhc3N3b3JkSGlzdG9yeUxlbmd0aCA9IHBhc3N3b3JkSGFzaExlbmd0aCAqIHBhc3N3b3JkSGlzdG9yeUxlbmd0aAorICAgICAgICAgICAgICAgICsgcGFzc3dvcmRIaXN0b3J5TGVuZ3RoIC0gMTsKKyAgICAgICAgaWYgKHBhc3N3b3JkSGlzdG9yeS5sZW5ndGgoKSA+IG5lZWRlZFBhc3N3b3JkSGlzdG9yeUxlbmd0aCkgeworICAgICAgICAgICAgcGFzc3dvcmRIaXN0b3J5ID0gcGFzc3dvcmRIaXN0b3J5LnN1YnN0cmluZygwLCBuZWVkZWRQYXNzd29yZEhpc3RvcnlMZW5ndGgpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBwYXNzd29yZEhpc3RvcnkuY29udGFpbnMocGFzc3dvcmRIYXNoU3RyaW5nKTsKKyAgICB9CisKKyAgICAvKioKICAgICAgKiBDaGVjayB0byBzZWUgaWYgdGhlIHVzZXIgaGFzIHN0b3JlZCBhIGxvY2sgcGF0dGVybi4KICAgICAgKiBAcmV0dXJuIFdoZXRoZXIgYSBzYXZlZCBwYXR0ZXJuIGV4aXN0cy4KICAgICAgKi8KQEAgLTI3OSw2ICszMzUsMTEgQEAKICAgICAgICAgICAgICAgICAgICAgYWN0aXZlUGFzc3dvcmRRdWFsaXR5ID0gRGV2aWNlUG9saWN5TWFuYWdlci5QQVNTV09SRF9RVUFMSVRZX0FMUEhBTlVNRVJJQzsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIERldmljZVBvbGljeU1hbmFnZXIuUEFTU1dPUkRfUVVBTElUWV9DT01QTEVYOgorICAgICAgICAgICAgICAgIGlmIChpc0xvY2tQYXNzd29yZEVuYWJsZWQoKSkgeworICAgICAgICAgICAgICAgICAgICBhY3RpdmVQYXNzd29yZFF1YWxpdHkgPSBEZXZpY2VQb2xpY3lNYW5hZ2VyLlBBU1NXT1JEX1FVQUxJVFlfQ09NUExFWDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIGFjdGl2ZVBhc3N3b3JkUXVhbGl0eTsKICAgICB9CkBAIC0yODcsOCArMzQ4LDYgQEAKICAgICAgKiBDbGVhciBhbnkgbG9jayBwYXR0ZXJuIG9yIHBhc3N3b3JkLgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIGNsZWFyTG9jaygpIHsKLSAgICAgICAgZ2V0RGV2aWNlUG9saWN5TWFuYWdlcigpLnNldEFjdGl2ZVBhc3N3b3JkU3RhdGUoCi0gICAgICAgICAgICAgICAgRGV2aWNlUG9saWN5TWFuYWdlci5QQVNTV09SRF9RVUFMSVRZX1VOU1BFQ0lGSUVELCAwKTsKICAgICAgICAgc2F2ZUxvY2tQYXNzd29yZChudWxsLCBEZXZpY2VQb2xpY3lNYW5hZ2VyLlBBU1NXT1JEX1FVQUxJVFlfU09NRVRISU5HKTsKICAgICAgICAgc2V0TG9ja1BhdHRlcm5FbmFibGVkKGZhbHNlKTsKICAgICAgICAgc2F2ZUxvY2tQYXR0ZXJuKG51bGwpOwpAQCAtMzAxLDcgKzM2MCw3IEBACiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2F2ZUxvY2tQYXR0ZXJuKExpc3Q8TG9ja1BhdHRlcm5WaWV3LkNlbGw+IHBhdHRlcm4pIHsKICAgICAgICAgLy8gQ29tcHV0ZSB0aGUgaGFzaAotICAgICAgICBmaW5hbCBieXRlW10gaGFzaCAgPSBMb2NrUGF0dGVyblV0aWxzLnBhdHRlcm5Ub0hhc2gocGF0dGVybik7CisgICAgICAgIGZpbmFsIGJ5dGVbXSBoYXNoID0gTG9ja1BhdHRlcm5VdGlscy5wYXR0ZXJuVG9IYXNoKHBhdHRlcm4pOwogICAgICAgICB0cnkgewogICAgICAgICAgICAgLy8gV3JpdGUgdGhlIGhhc2ggdG8gZmlsZQogICAgICAgICAgICAgUmFuZG9tQWNjZXNzRmlsZSByYWYgPSBuZXcgUmFuZG9tQWNjZXNzRmlsZShzTG9ja1BhdHRlcm5GaWxlbmFtZSwgInJ3Iik7CkBAIC0zMTYsMTQgKzM3NSwxNSBAQAogICAgICAgICAgICAgaWYgKHBhdHRlcm4gIT0gbnVsbCkgewogICAgICAgICAgICAgICAgIHNldEJvb2xlYW4oUEFUVEVSTl9FVkVSX0NIT1NFTl9LRVksIHRydWUpOwogICAgICAgICAgICAgICAgIHNldExvbmcoUEFTU1dPUkRfVFlQRV9LRVksIERldmljZVBvbGljeU1hbmFnZXIuUEFTU1dPUkRfUVVBTElUWV9TT01FVEhJTkcpOwotICAgICAgICAgICAgICAgIGRwbS5zZXRBY3RpdmVQYXNzd29yZFN0YXRlKAotICAgICAgICAgICAgICAgICAgICAgICAgRGV2aWNlUG9saWN5TWFuYWdlci5QQVNTV09SRF9RVUFMSVRZX1NPTUVUSElORywgcGF0dGVybi5zaXplKCkpOworICAgICAgICAgICAgICAgIGRwbS5zZXRBY3RpdmVQYXNzd29yZFN0YXRlKERldmljZVBvbGljeU1hbmFnZXIuUEFTU1dPUkRfUVVBTElUWV9TT01FVEhJTkcsIHBhdHRlcm4KKyAgICAgICAgICAgICAgICAgICAgICAgIC5zaXplKCksIDAsIDAsIDAsIDAsIDAsIDApOwogICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBkcG0uc2V0QWN0aXZlUGFzc3dvcmRTdGF0ZSgKLSAgICAgICAgICAgICAgICAgICAgICAgIERldmljZVBvbGljeU1hbmFnZXIuUEFTU1dPUkRfUVVBTElUWV9VTlNQRUNJRklFRCwgMCk7CisgICAgICAgICAgICAgICAgZHBtLnNldEFjdGl2ZVBhc3N3b3JkU3RhdGUoRGV2aWNlUG9saWN5TWFuYWdlci5QQVNTV09SRF9RVUFMSVRZX1VOU1BFQ0lGSUVELCAwLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgMCwgMCwgMCwgMCwgMCk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0gY2F0Y2ggKEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBmbmZlKSB7Ci0gICAgICAgICAgICAvLyBDYW50IGRvIG11Y2gsIHVubGVzcyB3ZSB3YW50IHRvIGZhaWwgb3ZlciB0byB1c2luZyB0aGUgc2V0dGluZ3MgcHJvdmlkZXIKKyAgICAgICAgICAgIC8vIENhbnQgZG8gbXVjaCwgdW5sZXNzIHdlIHdhbnQgdG8gZmFpbCBvdmVyIHRvIHVzaW5nIHRoZSBzZXR0aW5ncworICAgICAgICAgICAgLy8gcHJvdmlkZXIKICAgICAgICAgICAgIExvZy5lKFRBRywgIlVuYWJsZSB0byBzYXZlIGxvY2sgcGF0dGVybiB0byAiICsgc0xvY2tQYXR0ZXJuRmlsZW5hbWUpOwogICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpIHsKICAgICAgICAgICAgIC8vIENhbnQgZG8gbXVjaApAQCAtMzgxLDE3ICs0NDEsNTkgQEAKICAgICAgICAgICAgIERldmljZVBvbGljeU1hbmFnZXIgZHBtID0gZ2V0RGV2aWNlUG9saWN5TWFuYWdlcigpOwogICAgICAgICAgICAgaWYgKHBhc3N3b3JkICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICBpbnQgY29tcHV0ZWRRdWFsaXR5ID0gY29tcHV0ZVBhc3N3b3JkUXVhbGl0eShwYXNzd29yZCk7Ci0gICAgICAgICAgICAgICAgc2V0TG9uZyhQQVNTV09SRF9UWVBFX0tFWSwgY29tcHV0ZWRRdWFsaXR5KTsKKyAgICAgICAgICAgICAgICBzZXRMb25nKFBBU1NXT1JEX1RZUEVfS0VZLCBNYXRoLm1heChxdWFsaXR5LCBjb21wdXRlZFF1YWxpdHkpKTsKICAgICAgICAgICAgICAgICBpZiAoY29tcHV0ZWRRdWFsaXR5ICE9IERldmljZVBvbGljeU1hbmFnZXIuUEFTU1dPUkRfUVVBTElUWV9VTlNQRUNJRklFRCkgewotICAgICAgICAgICAgICAgICAgICBkcG0uc2V0QWN0aXZlUGFzc3dvcmRTdGF0ZShjb21wdXRlZFF1YWxpdHksIHBhc3N3b3JkLmxlbmd0aCgpKTsKKyAgICAgICAgICAgICAgICAgICAgaW50IGxldHRlcnMgPSAwOworICAgICAgICAgICAgICAgICAgICBpbnQgdXBwZXJjYXNlID0gMDsKKyAgICAgICAgICAgICAgICAgICAgaW50IGxvd2VyY2FzZSA9IDA7CisgICAgICAgICAgICAgICAgICAgIGludCBudW1iZXJzID0gMDsKKyAgICAgICAgICAgICAgICAgICAgaW50IHN5bWJvbHMgPSAwOworICAgICAgICAgICAgICAgICAgICBpbnQgbm9ubGV0dGVyID0gMDsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwYXNzd29yZC5sZW5ndGgoKTsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjaGFyIGMgPSBwYXNzd29yZC5jaGFyQXQoaSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYyA+PSAnQScgJiYgYyA8PSAnWicpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXR0ZXJzKys7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBwZXJjYXNlKys7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGMgPj0gJ2EnICYmIGMgPD0gJ3onKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0dGVycysrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvd2VyY2FzZSsrOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjID49ICcwJyAmJiBjIDw9ICc5JykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bWJlcnMrKzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBub25sZXR0ZXIrKzsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ltYm9scysrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vbmxldHRlcisrOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGRwbS5zZXRBY3RpdmVQYXNzd29yZFN0YXRlKE1hdGgubWF4KHF1YWxpdHksIGNvbXB1dGVkUXVhbGl0eSksIHBhc3N3b3JkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmxlbmd0aCgpLCBsZXR0ZXJzLCB1cHBlcmNhc2UsIGxvd2VyY2FzZSwgbnVtYmVycywgc3ltYm9scywgbm9ubGV0dGVyKTsKICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAvLyBUaGUgcGFzc3dvcmQgaXMgbm90IGFueXRoaW5nLgogICAgICAgICAgICAgICAgICAgICBkcG0uc2V0QWN0aXZlUGFzc3dvcmRTdGF0ZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZXZpY2VQb2xpY3lNYW5hZ2VyLlBBU1NXT1JEX1FVQUxJVFlfVU5TUEVDSUZJRUQsIDApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIERldmljZVBvbGljeU1hbmFnZXIuUEFTU1dPUkRfUVVBTElUWV9VTlNQRUNJRklFRCwgMCwgMCwgMCwgMCwgMCwgMCwgMCk7CiAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8vIEFkZCB0aGUgcGFzc3dvcmQgdG8gdGhlIHBhc3N3b3JkIGhpc3RvcnkuIFdlIGFzc3VtZSBhbGwKKyAgICAgICAgICAgICAgICAvLyBwYXNzd29yZAorICAgICAgICAgICAgICAgIC8vIGhhc2hlcyBoYXZlIHRoZSBzYW1lIGxlbmd0aCBmb3Igc2ltcGxpY2l0eSBvZiBpbXBsZW1lbnRhdGlvbi4KKyAgICAgICAgICAgICAgICBTdHJpbmcgcGFzc3dvcmRIaXN0b3J5ID0gZ2V0U3RyaW5nKFBBU1NXT1JEX0hJU1RPUllfS0VZKTsKKyAgICAgICAgICAgICAgICBpZiAocGFzc3dvcmRIaXN0b3J5ID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgcGFzc3dvcmRIaXN0b3J5ID0gbmV3IFN0cmluZygpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpbnQgcGFzc3dvcmRIaXN0b3J5TGVuZ3RoID0gZ2V0UmVxdWVzdGVkUGFzc3dvcmRIaXN0b3J5TGVuZ3RoKCk7CisgICAgICAgICAgICAgICAgaWYgKHBhc3N3b3JkSGlzdG9yeUxlbmd0aCA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIHBhc3N3b3JkSGlzdG9yeSA9ICIiOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHBhc3N3b3JkSGlzdG9yeSA9IG5ldyBTdHJpbmcoaGFzaCkgKyAiLCIgKyBwYXNzd29yZEhpc3Rvcnk7CisgICAgICAgICAgICAgICAgICAgIC8vIEN1dCBpdCB0byBjb250YWluIHBhc3N3b3JkSGlzdG9yeUxlbmd0aCBoYXNoZXMKKyAgICAgICAgICAgICAgICAgICAgLy8gYW5kIHBhc3N3b3JkSGlzdG9yeUxlbmd0aCAtMSBjb21tYXMuCisgICAgICAgICAgICAgICAgICAgIHBhc3N3b3JkSGlzdG9yeSA9IHBhc3N3b3JkSGlzdG9yeS5zdWJzdHJpbmcoMCwgTWF0aC5taW4oaGFzaC5sZW5ndGgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIHBhc3N3b3JkSGlzdG9yeUxlbmd0aCArIHBhc3N3b3JkSGlzdG9yeUxlbmd0aCAtIDEsIHBhc3N3b3JkSGlzdG9yeQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5sZW5ndGgoKSkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzZXRTdHJpbmcoUEFTU1dPUkRfSElTVE9SWV9LRVksIHBhc3N3b3JkSGlzdG9yeSk7CiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIGRwbS5zZXRBY3RpdmVQYXNzd29yZFN0YXRlKAotICAgICAgICAgICAgICAgICAgICAgICAgRGV2aWNlUG9saWN5TWFuYWdlci5QQVNTV09SRF9RVUFMSVRZX1VOU1BFQ0lGSUVELCAwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIERldmljZVBvbGljeU1hbmFnZXIuUEFTU1dPUkRfUVVBTElUWV9VTlNQRUNJRklFRCwgMCwgMCwgMCwgMCwgMCwgMCwgMCk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0gY2F0Y2ggKEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBmbmZlKSB7CiAgICAgICAgICAgICAvLyBDYW50IGRvIG11Y2gsIHVubGVzcyB3ZSB3YW50IHRvIGZhaWwgb3ZlciB0byB1c2luZyB0aGUgc2V0dGluZ3MgcHJvdmlkZXIKQEAgLTUzMSw3ICs2MzMsOCBAQAogICAgICAgICByZXR1cm4gc2F2ZWRQYXNzd29yZEV4aXN0cygpICYmCiAgICAgICAgICAgICAgICAgKG1vZGUgPT0gRGV2aWNlUG9saWN5TWFuYWdlci5QQVNTV09SRF9RVUFMSVRZX0FMUEhBQkVUSUMKICAgICAgICAgICAgICAgICAgICAgICAgIHx8IG1vZGUgPT0gRGV2aWNlUG9saWN5TWFuYWdlci5QQVNTV09SRF9RVUFMSVRZX05VTUVSSUMKLSAgICAgICAgICAgICAgICAgICAgICAgIHx8IG1vZGUgPT0gRGV2aWNlUG9saWN5TWFuYWdlci5QQVNTV09SRF9RVUFMSVRZX0FMUEhBTlVNRVJJQyk7CisgICAgICAgICAgICAgICAgICAgICAgICB8fCBtb2RlID09IERldmljZVBvbGljeU1hbmFnZXIuUEFTU1dPUkRfUVVBTElUWV9BTFBIQU5VTUVSSUMKKyAgICAgICAgICAgICAgICAgICAgICAgIHx8IG1vZGUgPT0gRGV2aWNlUG9saWN5TWFuYWdlci5QQVNTV09SRF9RVUFMSVRZX0NPTVBMRVgpOwogICAgIH0KIAogICAgIC8qKgpAQCAtNjU1LDEyICs3NTgsMjEgQEAKICAgICAgICAgYW5kcm9pZC5wcm92aWRlci5TZXR0aW5ncy5TZWN1cmUucHV0TG9uZyhtQ29udGVudFJlc29sdmVyLCBzZWN1cmVTZXR0aW5nS2V5LCB2YWx1ZSk7CiAgICAgfQogCisgICAgcHJpdmF0ZSBTdHJpbmcgZ2V0U3RyaW5nKFN0cmluZyBzZWN1cmVTZXR0aW5nS2V5KSB7CisgICAgICAgIHJldHVybiBhbmRyb2lkLnByb3ZpZGVyLlNldHRpbmdzLlNlY3VyZS5nZXRTdHJpbmcobUNvbnRlbnRSZXNvbHZlciwgc2VjdXJlU2V0dGluZ0tleSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHNldFN0cmluZyhTdHJpbmcgc2VjdXJlU2V0dGluZ0tleSwgU3RyaW5nIHZhbHVlKSB7CisgICAgICAgIGFuZHJvaWQucHJvdmlkZXIuU2V0dGluZ3MuU2VjdXJlLnB1dFN0cmluZyhtQ29udGVudFJlc29sdmVyLCBzZWN1cmVTZXR0aW5nS2V5LCB2YWx1ZSk7CisgICAgfQorCiAgICAgcHVibGljIGJvb2xlYW4gaXNTZWN1cmUoKSB7CiAgICAgICAgIGxvbmcgbW9kZSA9IGdldEtleWd1YXJkU3RvcmVkUGFzc3dvcmRRdWFsaXR5KCk7CiAgICAgICAgIGZpbmFsIGJvb2xlYW4gaXNQYXR0ZXJuID0gbW9kZSA9PSBEZXZpY2VQb2xpY3lNYW5hZ2VyLlBBU1NXT1JEX1FVQUxJVFlfU09NRVRISU5HOwogICAgICAgICBmaW5hbCBib29sZWFuIGlzUGFzc3dvcmQgPSBtb2RlID09IERldmljZVBvbGljeU1hbmFnZXIuUEFTU1dPUkRfUVVBTElUWV9OVU1FUklDCiAgICAgICAgICAgICAgICAgfHwgbW9kZSA9PSBEZXZpY2VQb2xpY3lNYW5hZ2VyLlBBU1NXT1JEX1FVQUxJVFlfQUxQSEFCRVRJQwotICAgICAgICAgICAgICAgIHx8IG1vZGUgPT0gRGV2aWNlUG9saWN5TWFuYWdlci5QQVNTV09SRF9RVUFMSVRZX0FMUEhBTlVNRVJJQzsKKyAgICAgICAgICAgICAgICB8fCBtb2RlID09IERldmljZVBvbGljeU1hbmFnZXIuUEFTU1dPUkRfUVVBTElUWV9BTFBIQU5VTUVSSUMKKyAgICAgICAgICAgICAgICB8fCBtb2RlID09IERldmljZVBvbGljeU1hbmFnZXIuUEFTU1dPUkRfUVVBTElUWV9DT01QTEVYOwogICAgICAgICBmaW5hbCBib29sZWFuIHNlY3VyZSA9IGlzUGF0dGVybiAmJiBpc0xvY2tQYXR0ZXJuRW5hYmxlZCgpICYmIHNhdmVkUGF0dGVybkV4aXN0cygpCiAgICAgICAgICAgICAgICAgfHwgaXNQYXNzd29yZCAmJiBzYXZlZFBhc3N3b3JkRXhpc3RzKCk7CiAgICAgICAgIHJldHVybiBzZWN1cmU7CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvd2lkZ2V0L1Bhc3N3b3JkRW50cnlLZXlib2FyZC5qYXZhIGIvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3dpZGdldC9QYXNzd29yZEVudHJ5S2V5Ym9hcmQuamF2YQppbmRleCBlMWE2NzM3Li5mYWNkYTM2IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvd2lkZ2V0L1Bhc3N3b3JkRW50cnlLZXlib2FyZC5qYXZhCisrKyBiL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC93aWRnZXQvUGFzc3dvcmRFbnRyeUtleWJvYXJkLmphdmEKQEAgLTY3LDggKzY3LDIyIEBACiAgICAgICAgIHRoaXMoY29udGV4dCwgeG1sTGF5b3V0UmVzSWQsIDApOwogICAgIH0KIAorICAgIHB1YmxpYyBQYXNzd29yZEVudHJ5S2V5Ym9hcmQoQ29udGV4dCBjb250ZXh0LCBpbnQgeG1sTGF5b3V0UmVzSWQsIGludCB3aWR0aCwgaW50IGhlaWdodCkgeworICAgICAgICB0aGlzKGNvbnRleHQsIHhtbExheW91dFJlc0lkLCAwLCB3aWR0aCwgaGVpZ2h0KTsKKyAgICB9CisKICAgICBwdWJsaWMgUGFzc3dvcmRFbnRyeUtleWJvYXJkKENvbnRleHQgY29udGV4dCwgaW50IHhtbExheW91dFJlc0lkLCBpbnQgbW9kZSkgewogICAgICAgICBzdXBlcihjb250ZXh0LCB4bWxMYXlvdXRSZXNJZCwgbW9kZSk7CisgICAgICAgIGluaXQoY29udGV4dCk7CisgICAgfQorCisgICAgcHVibGljIFBhc3N3b3JkRW50cnlLZXlib2FyZChDb250ZXh0IGNvbnRleHQsIGludCB4bWxMYXlvdXRSZXNJZCwgaW50IG1vZGUsCisgICAgICAgICAgICBpbnQgd2lkdGgsIGludCBoZWlnaHQpIHsKKyAgICAgICAgc3VwZXIoY29udGV4dCwgeG1sTGF5b3V0UmVzSWQsIG1vZGUsIHdpZHRoLCBoZWlnaHQpOworICAgICAgICBpbml0KGNvbnRleHQpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBpbml0KENvbnRleHQgY29udGV4dCkgewogICAgICAgICBmaW5hbCBSZXNvdXJjZXMgcmVzID0gY29udGV4dC5nZXRSZXNvdXJjZXMoKTsKICAgICAgICAgbVJlcyA9IHJlczsKICAgICAgICAgbVNoaWZ0SWNvbiA9IHJlcy5nZXREcmF3YWJsZShSLmRyYXdhYmxlLnN5bV9rZXlib2FyZF9zaGlmdCk7CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvd2lkZ2V0L1Bhc3N3b3JkRW50cnlLZXlib2FyZEhlbHBlci5qYXZhIGIvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3dpZGdldC9QYXNzd29yZEVudHJ5S2V5Ym9hcmRIZWxwZXIuamF2YQppbmRleCA1MzcyMGU0Li4zODRmN2JjIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvd2lkZ2V0L1Bhc3N3b3JkRW50cnlLZXlib2FyZEhlbHBlci5qYXZhCisrKyBiL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC93aWRnZXQvUGFzc3dvcmRFbnRyeUtleWJvYXJkSGVscGVyLmphdmEKQEAgLTU0LDEwICs1NCwyMCBAQAogICAgIHByaXZhdGUgVmlicmF0b3IgbVZpYnJhdG9yOwogCiAgICAgcHVibGljIFBhc3N3b3JkRW50cnlLZXlib2FyZEhlbHBlcihDb250ZXh0IGNvbnRleHQsIEtleWJvYXJkVmlldyBrZXlib2FyZFZpZXcsIFZpZXcgdGFyZ2V0VmlldykgeworICAgICAgICB0aGlzKGNvbnRleHQsIGtleWJvYXJkVmlldywgdGFyZ2V0VmlldywgdHJ1ZSk7CisgICAgfQorCisgICAgcHVibGljIFBhc3N3b3JkRW50cnlLZXlib2FyZEhlbHBlcihDb250ZXh0IGNvbnRleHQsIEtleWJvYXJkVmlldyBrZXlib2FyZFZpZXcsIFZpZXcgdGFyZ2V0VmlldywKKyAgICAgICAgICAgIGJvb2xlYW4gdXNlRnVsbFNjcmVlbldpZHRoKSB7CiAgICAgICAgIG1Db250ZXh0ID0gY29udGV4dDsKICAgICAgICAgbVRhcmdldFZpZXcgPSB0YXJnZXRWaWV3OwogICAgICAgICBtS2V5Ym9hcmRWaWV3ID0ga2V5Ym9hcmRWaWV3OwotICAgICAgICBjcmVhdGVLZXlib2FyZHMoKTsKKyAgICAgICAgaWYgKHVzZUZ1bGxTY3JlZW5XaWR0aCB8fCBtS2V5Ym9hcmRWaWV3LmdldExheW91dFBhcmFtcygpLndpZHRoID09IC0xKSB7CisgICAgICAgICAgICBjcmVhdGVLZXlib2FyZHMoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGNyZWF0ZUtleWJvYXJkc1dpdGhTcGVjaWZpY1NpemUobUtleWJvYXJkVmlldy5nZXRMYXlvdXRQYXJhbXMoKS53aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgbUtleWJvYXJkVmlldy5nZXRMYXlvdXRQYXJhbXMoKS5oZWlnaHQpOworICAgICAgICB9CiAgICAgICAgIG1LZXlib2FyZFZpZXcuc2V0T25LZXlib2FyZEFjdGlvbkxpc3RlbmVyKHRoaXMpOwogICAgICAgICBtVmlicmF0b3IgPSBuZXcgVmlicmF0b3IoKTsKICAgICB9CkBAIC02Niw2ICs3NiwyOSBAQAogICAgICAgICByZXR1cm4gbUtleWJvYXJkTW9kZSA9PSBLRVlCT0FSRF9NT0RFX0FMUEhBOwogICAgIH0KIAorICAgIHByaXZhdGUgdm9pZCBjcmVhdGVLZXlib2FyZHNXaXRoU3BlY2lmaWNTaXplKGludCB2aWV3V2lkdGgsIGludCB2aWV3SGVpZ2h0KSB7CisgICAgICAgIG1OdW1lcmljS2V5Ym9hcmQgPSBuZXcgUGFzc3dvcmRFbnRyeUtleWJvYXJkKG1Db250ZXh0LCBSLnhtbC5wYXNzd29yZF9rYmRfbnVtZXJpYywKKyAgICAgICAgICAgICAgICB2aWV3V2lkdGgsIHZpZXdIZWlnaHQpOworICAgICAgICBtUXdlcnR5S2V5Ym9hcmQgPSBuZXcgUGFzc3dvcmRFbnRyeUtleWJvYXJkKG1Db250ZXh0LAorICAgICAgICAgICAgICAgIFIueG1sLnBhc3N3b3JkX2tiZF9xd2VydHksIFIuaWQubW9kZV9ub3JtYWwsIHZpZXdXaWR0aCwgdmlld0hlaWdodCk7CisgICAgICAgIG1Rd2VydHlLZXlib2FyZC5lbmFibGVTaGlmdExvY2soKTsKKworICAgICAgICBtUXdlcnR5S2V5Ym9hcmRTaGlmdGVkID0gbmV3IFBhc3N3b3JkRW50cnlLZXlib2FyZChtQ29udGV4dCwKKyAgICAgICAgICAgICAgICBSLnhtbC5wYXNzd29yZF9rYmRfcXdlcnR5X3NoaWZ0ZWQsCisgICAgICAgICAgICAgICAgUi5pZC5tb2RlX25vcm1hbCwgdmlld1dpZHRoLCB2aWV3SGVpZ2h0KTsKKyAgICAgICAgbVF3ZXJ0eUtleWJvYXJkU2hpZnRlZC5lbmFibGVTaGlmdExvY2soKTsKKyAgICAgICAgbVF3ZXJ0eUtleWJvYXJkU2hpZnRlZC5zZXRTaGlmdGVkKHRydWUpOyAvLyBhbHdheXMgc2hpZnRlZC4KKworICAgICAgICBtU3ltYm9sc0tleWJvYXJkID0gbmV3IFBhc3N3b3JkRW50cnlLZXlib2FyZChtQ29udGV4dCwgUi54bWwucGFzc3dvcmRfa2JkX3N5bWJvbHMsCisgICAgICAgICAgICAgICAgdmlld1dpZHRoLCB2aWV3SGVpZ2h0KTsKKyAgICAgICAgbVN5bWJvbHNLZXlib2FyZC5lbmFibGVTaGlmdExvY2soKTsKKworICAgICAgICBtU3ltYm9sc0tleWJvYXJkU2hpZnRlZCA9IG5ldyBQYXNzd29yZEVudHJ5S2V5Ym9hcmQobUNvbnRleHQsCisgICAgICAgICAgICAgICAgUi54bWwucGFzc3dvcmRfa2JkX3N5bWJvbHNfc2hpZnQsIHZpZXdXaWR0aCwgdmlld0hlaWdodCk7CisgICAgICAgIG1TeW1ib2xzS2V5Ym9hcmRTaGlmdGVkLmVuYWJsZVNoaWZ0TG9jaygpOworICAgICAgICBtU3ltYm9sc0tleWJvYXJkU2hpZnRlZC5zZXRTaGlmdGVkKHRydWUpOyAvLyBhbHdheXMgc2hpZnRlZAorICAgIH0KKwogICAgIHByaXZhdGUgdm9pZCBjcmVhdGVLZXlib2FyZHMoKSB7CiAgICAgICAgIG1OdW1lcmljS2V5Ym9hcmQgPSBuZXcgUGFzc3dvcmRFbnRyeUtleWJvYXJkKG1Db250ZXh0LCBSLnhtbC5wYXNzd29yZF9rYmRfbnVtZXJpYyk7CiAgICAgICAgIG1Rd2VydHlLZXlib2FyZCA9IG5ldyBQYXNzd29yZEVudHJ5S2V5Ym9hcmQobUNvbnRleHQsCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvd2lkZ2V0L1NsaWRpbmdUYWIuamF2YSBiL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC93aWRnZXQvU2xpZGluZ1RhYi5qYXZhCmluZGV4IDkxNTI3MjkuLjM4NjU1MTAgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC93aWRnZXQvU2xpZGluZ1RhYi5qYXZhCisrKyBiL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC93aWRnZXQvU2xpZGluZ1RhYi5qYXZhCkBAIC0xNywxMCArMTcsOCBAQAogcGFja2FnZSBjb20uYW5kcm9pZC5pbnRlcm5hbC53aWRnZXQ7CiAKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLkNvbmZpZ3VyYXRpb247CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5SZXNvdXJjZXM7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5UeXBlZEFycmF5OwotaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQ2FudmFzOwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUmVjdDsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlOwogaW1wb3J0IGFuZHJvaWQub3MuVmlicmF0b3I7CkBAIC0zOCw2ICszNiw3IEBACiBpbXBvcnQgYW5kcm9pZC53aWRnZXQuSW1hZ2VWaWV3OwogaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlRleHRWaWV3OwogaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkltYWdlVmlldy5TY2FsZVR5cGU7CisKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC5SOwogCiAvKioKQEAgLTY5LDIxICs2OCwyMSBAQAogICAgIHByaXZhdGUgaW50IG1HcmFiYmVkU3RhdGUgPSBPblRyaWdnZXJMaXN0ZW5lci5OT19IQU5ETEU7CiAgICAgcHJpdmF0ZSBib29sZWFuIG1UcmlnZ2VyZWQgPSBmYWxzZTsKICAgICBwcml2YXRlIFZpYnJhdG9yIG1WaWJyYXRvcjsKLSAgICBwcml2YXRlIGZsb2F0IG1EZW5zaXR5OyAvLyB1c2VkIHRvIHNjYWxlIGRpbWVuc2lvbnMgZm9yIGJpdG1hcHMuCisgICAgcHJpdmF0ZSBmaW5hbCBmbG9hdCBtRGVuc2l0eTsgLy8gdXNlZCB0byBzY2FsZSBkaW1lbnNpb25zIGZvciBiaXRtYXBzLgogCiAgICAgLyoqCiAgICAgICogRWl0aGVyIHtAbGluayAjSE9SSVpPTlRBTH0gb3Ige0BsaW5rICNWRVJUSUNBTH0uCiAgICAgICovCi0gICAgcHJpdmF0ZSBpbnQgbU9yaWVudGF0aW9uOworICAgIHByaXZhdGUgZmluYWwgaW50IG1PcmllbnRhdGlvbjsKIAotICAgIHByaXZhdGUgU2xpZGVyIG1MZWZ0U2xpZGVyOwotICAgIHByaXZhdGUgU2xpZGVyIG1SaWdodFNsaWRlcjsKKyAgICBwcml2YXRlIGZpbmFsIFNsaWRlciBtTGVmdFNsaWRlcjsKKyAgICBwcml2YXRlIGZpbmFsIFNsaWRlciBtUmlnaHRTbGlkZXI7CiAgICAgcHJpdmF0ZSBTbGlkZXIgbUN1cnJlbnRTbGlkZXI7CiAgICAgcHJpdmF0ZSBib29sZWFuIG1UcmFja2luZzsKICAgICBwcml2YXRlIGZsb2F0IG1UaHJlc2hvbGQ7CiAgICAgcHJpdmF0ZSBTbGlkZXIgbU90aGVyU2xpZGVyOwogICAgIHByaXZhdGUgYm9vbGVhbiBtQW5pbWF0aW5nOwotICAgIHByaXZhdGUgUmVjdCBtVG1wUmVjdDsKKyAgICBwcml2YXRlIGZpbmFsIFJlY3QgbVRtcFJlY3Q7CiAKICAgICAvKioKICAgICAgKiBMaXN0ZW5lciB1c2VkIHRvIHJlc2V0IHRoZSB2aWV3IHdoZW4gdGhlIGN1cnJlbnQgYW5pbWF0aW9uIGNvbXBsZXRlcy4KQEAgLTQxNyw3ICs0MTYsNyBAQAogICAgICAgICB9CiAKICAgICAgICAgLyoqCi0gICAgICAgICAqIFN0YXJ0IGFuaW1hdGluZyB0aGUgc2xpZGVyLiBOb3RlIHdlIG5lZWQgdHdvIGFuaW1hdGlvbnMgc2luY2UgYW4gQW5pbWF0b3IKKyAgICAgICAgICogU3RhcnQgYW5pbWF0aW5nIHRoZSBzbGlkZXIuIE5vdGUgd2UgbmVlZCB0d28gYW5pbWF0aW9ucyBzaW5jZSBhbiBWYWx1ZUFuaW1hdG9yCiAgICAgICAgICAqIGtlZXBzIGludGVybmFsIHN0YXRlIG9mIHRoZSBpbnZhbGlkYXRpb24gcmVnaW9uIHdoaWNoIGlzIGp1c3QgdGhlIHZpZXcgYmVpbmcgYW5pbWF0ZWQuCiAgICAgICAgICAqCiAgICAgICAgICAqIEBwYXJhbSBhbmltMQpAQCAtNDc1LDEwICs0NzQsMTMgQEAKICAgICAgICAgaW50IGhlaWdodFNwZWNNb2RlID0gTWVhc3VyZVNwZWMuZ2V0TW9kZShoZWlnaHRNZWFzdXJlU3BlYyk7CiAgICAgICAgIGludCBoZWlnaHRTcGVjU2l6ZSA9ICBNZWFzdXJlU3BlYy5nZXRTaXplKGhlaWdodE1lYXN1cmVTcGVjKTsKIAotICAgICAgICBpZiAod2lkdGhTcGVjTW9kZSA9PSBNZWFzdXJlU3BlYy5VTlNQRUNJRklFRCB8fCBoZWlnaHRTcGVjTW9kZSA9PSBNZWFzdXJlU3BlYy5VTlNQRUNJRklFRCkgewotICAgICAgICAgICAgTG9nLmUoIlNsaWRpbmdUYWIiLCAiU2xpZGluZ1RhYiBjYW5ub3QgaGF2ZSBVTlNQRUNJRklFRCBNZWFzdXJlU3BlYyIKLSAgICAgICAgICAgICAgICAgICAgKyIod3NwZWM9IiArIHdpZHRoU3BlY01vZGUgKyAiLCBoc3BlYz0iICsgaGVpZ2h0U3BlY01vZGUgKyAiKSIsCi0gICAgICAgICAgICAgICAgICAgIG5ldyBSdW50aW1lRXhjZXB0aW9uKExPR19UQUcgKyAic3RhY2s6IikpOworICAgICAgICBpZiAoREJHKSB7CisgICAgICAgICAgICBpZiAod2lkdGhTcGVjTW9kZSA9PSBNZWFzdXJlU3BlYy5VTlNQRUNJRklFRCAKKyAgICAgICAgICAgICAgICAgICAgfHwgaGVpZ2h0U3BlY01vZGUgPT0gTWVhc3VyZVNwZWMuVU5TUEVDSUZJRUQpIHsKKyAgICAgICAgICAgICAgICBMb2cuZSgiU2xpZGluZ1RhYiIsICJTbGlkaW5nVGFiIGNhbm5vdCBoYXZlIFVOU1BFQ0lGSUVEIE1lYXN1cmVTcGVjIgorICAgICAgICAgICAgICAgICAgICAgICAgKyIod3NwZWM9IiArIHdpZHRoU3BlY01vZGUgKyAiLCBoc3BlYz0iICsgaGVpZ2h0U3BlY01vZGUgKyAiKSIsCisgICAgICAgICAgICAgICAgICAgICAgICBuZXcgUnVudGltZUV4Y2VwdGlvbihMT0dfVEFHICsgInN0YWNrOiIpKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQogCiAgICAgICAgIG1MZWZ0U2xpZGVyLm1lYXN1cmUoKTsKQEAgLTYwOCwxNCArNjEwLDcgQEAKIAogICAgICAgICAgICAgICAgIGNhc2UgTW90aW9uRXZlbnQuQUNUSU9OX1VQOgogICAgICAgICAgICAgICAgIGNhc2UgTW90aW9uRXZlbnQuQUNUSU9OX0NBTkNFTDoKLSAgICAgICAgICAgICAgICAgICAgbVRyYWNraW5nID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgIG1UcmlnZ2VyZWQgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgbU90aGVyU2xpZGVyLnNob3codHJ1ZSk7Ci0gICAgICAgICAgICAgICAgICAgIG1DdXJyZW50U2xpZGVyLnJlc2V0KGZhbHNlKTsKLSAgICAgICAgICAgICAgICAgICAgbUN1cnJlbnRTbGlkZXIuaGlkZVRhcmdldCgpOwotICAgICAgICAgICAgICAgICAgICBtQ3VycmVudFNsaWRlciA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgIG1PdGhlclNsaWRlciA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgIHNldEdyYWJiZWRTdGF0ZShPblRyaWdnZXJMaXN0ZW5lci5OT19IQU5ETEUpOworICAgICAgICAgICAgICAgICAgICBjYW5jZWxHcmFiKCk7CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQogICAgICAgICB9CkBAIC02MjMsNiArNjE4LDE3IEBACiAgICAgICAgIHJldHVybiBtVHJhY2tpbmcgfHwgc3VwZXIub25Ub3VjaEV2ZW50KGV2ZW50KTsKICAgICB9CiAKKyAgICBwcml2YXRlIHZvaWQgY2FuY2VsR3JhYigpIHsKKyAgICAgICAgbVRyYWNraW5nID0gZmFsc2U7CisgICAgICAgIG1UcmlnZ2VyZWQgPSBmYWxzZTsKKyAgICAgICAgbU90aGVyU2xpZGVyLnNob3codHJ1ZSk7CisgICAgICAgIG1DdXJyZW50U2xpZGVyLnJlc2V0KGZhbHNlKTsKKyAgICAgICAgbUN1cnJlbnRTbGlkZXIuaGlkZVRhcmdldCgpOworICAgICAgICBtQ3VycmVudFNsaWRlciA9IG51bGw7CisgICAgICAgIG1PdGhlclNsaWRlciA9IG51bGw7CisgICAgICAgIHNldEdyYWJiZWRTdGF0ZShPblRyaWdnZXJMaXN0ZW5lci5OT19IQU5ETEUpOworICAgIH0KKwogICAgIHZvaWQgc3RhcnRBbmltYXRpbmcoZmluYWwgYm9vbGVhbiBob2xkQWZ0ZXIpIHsKICAgICAgICAgbUFuaW1hdGluZyA9IHRydWU7CiAgICAgICAgIGZpbmFsIEFuaW1hdGlvbiB0cmFuczE7CkBAIC04MzIsNiArODM4LDE3IEBACiAgICAgICAgIH0KICAgICB9CiAKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvblZpc2liaWxpdHlDaGFuZ2VkKFZpZXcgY2hhbmdlZFZpZXcsIGludCB2aXNpYmlsaXR5KSB7CisgICAgICAgIHN1cGVyLm9uVmlzaWJpbGl0eUNoYW5nZWQoY2hhbmdlZFZpZXcsIHZpc2liaWxpdHkpOworICAgICAgICAvLyBXaGVuIHZpc2liaWxpdHkgY2hhbmdlcyBhbmQgdGhlIHVzZXIgaGFzIGEgdGFiIHNlbGVjdGVkLCB1bnNlbGVjdCBpdCBhbmQKKyAgICAgICAgLy8gbWFrZSBzdXJlIHRoZWlyIGNhbGxiYWNrIGdldHMgY2FsbGVkLgorICAgICAgICBpZiAoY2hhbmdlZFZpZXcgPT0gdGhpcyAmJiB2aXNpYmlsaXR5ICE9IFZJU0lCTEUKKyAgICAgICAgICAgICAgICAmJiBtR3JhYmJlZFN0YXRlICE9IE9uVHJpZ2dlckxpc3RlbmVyLk5PX0hBTkRMRSkgeworICAgICAgICAgICAgY2FuY2VsR3JhYigpOworICAgICAgICB9CisgICAgfQorCiAgICAgLyoqCiAgICAgICogU2V0cyB0aGUgY3VycmVudCBncmFiYmVkIHN0YXRlLCBhbmQgZGlzcGF0Y2hlcyBhIGdyYWJiZWQgc3RhdGUgY2hhbmdlCiAgICAgICogZXZlbnQgdG8gb3VyIGxpc3RlbmVyLgpkaWZmIC0tZ2l0IGEvY29yZS9qbmkvQW5kcm9pZC5tayBiL2NvcmUvam5pL0FuZHJvaWQubWsKaW5kZXggYTAzOGNjNS4uODMxMGU1NiAxMDA2NDQKLS0tIGEvY29yZS9qbmkvQW5kcm9pZC5taworKysgYi9jb3JlL2puaS9BbmRyb2lkLm1rCkBAIC0xOSwxMiArMTksMTUgQEAKICAgTE9DQUxfQ0ZMQUdTICs9IC1EQ1VTVE9NX1JVTlRJTUVfSEVBUF9NQVg9JChVU0VfQ1VTVE9NX1JVTlRJTUVfSEVBUF9NQVgpCiBlbmRpZgogCitpZmVxICgkKFVTRV9PUEVOR0xfUkVOREVSRVIpLHRydWUpCisJTE9DQUxfQ0ZMQUdTICs9IC1EVVNFX09QRU5HTF9SRU5ERVJFUgorZW5kaWYKKwogTE9DQUxfQ0ZMQUdTICs9IC1ER0xfR0xFWFRfUFJPVE9UWVBFUyAtREVHTF9FR0xFWFRfUFJPVE9UWVBFUwogCiBMT0NBTF9TUkNfRklMRVM6PSBcCiAJQWN0aXZpdHlNYW5hZ2VyLmNwcCBcCiAJQW5kcm9pZFJ1bnRpbWUuY3BwIFwKLQlDdXJzb3JXaW5kb3cuY3BwIFwKIAlUaW1lLmNwcCBcCiAJY29tX2dvb2dsZV9hbmRyb2lkX2dsZXNfam5pX0VHTEltcGwuY3BwIFwKIAljb21fZ29vZ2xlX2FuZHJvaWRfZ2xlc19qbmlfR0xJbXBsLmNwcC5hcm0gXApAQCAtNDgsNiArNTEsNyBAQAogCWFuZHJvaWRfdmlld19JbnB1dENoYW5uZWwuY3BwIFwKIAlhbmRyb2lkX3ZpZXdfSW5wdXRRdWV1ZS5jcHAgXAogCWFuZHJvaWRfdmlld19LZXlFdmVudC5jcHAgXAorCWFuZHJvaWRfdmlld19HTEVTMjBDYW52YXMuY3BwIFwKIAlhbmRyb2lkX3ZpZXdfTW90aW9uRXZlbnQuY3BwIFwKIAlhbmRyb2lkX3RleHRfQW5kcm9pZENoYXJhY3Rlci5jcHAgXAogCWFuZHJvaWRfdGV4dF9BbmRyb2lkQmlkaS5jcHAgXApAQCAtMTA1LDYgKzEwOSw3IEBACiAJYW5kcm9pZC9ncmFwaGljcy9SYXN0ZXJpemVyLmNwcCBcCiAJYW5kcm9pZC9ncmFwaGljcy9SZWdpb24uY3BwIFwKIAlhbmRyb2lkL2dyYXBoaWNzL1NoYWRlci5jcHAgXAorCWFuZHJvaWQvZ3JhcGhpY3MvVGV4dExheW91dC5jcHAgXAogCWFuZHJvaWQvZ3JhcGhpY3MvVHlwZWZhY2UuY3BwIFwKIAlhbmRyb2lkL2dyYXBoaWNzL1hmZXJtb2RlLmNwcCBcCiAJYW5kcm9pZC9ncmFwaGljcy9ZdXZUb0pwZWdFbmNvZGVyLmNwcCBcCkBAIC0xMjMsNyArMTI4LDYgQEAKIAlhbmRyb2lkX2JsdWV0b290aF9jb21tb24uY3BwIFwKIAlhbmRyb2lkX2JsdWV0b290aF9CbHVldG9vdGhBdWRpb0dhdGV3YXkuY3BwIFwKIAlhbmRyb2lkX2JsdWV0b290aF9CbHVldG9vdGhTb2NrZXQuY3BwIFwKLQlhbmRyb2lkX2JsdWV0b290aF9TY29Tb2NrZXQuY3BwIFwKIAlhbmRyb2lkX3NlcnZlcl9CbHVldG9vdGhTZXJ2aWNlLmNwcCBcCiAJYW5kcm9pZF9zZXJ2ZXJfQmx1ZXRvb3RoRXZlbnRMb29wLmNwcCBcCiAJYW5kcm9pZF9zZXJ2ZXJfQmx1ZXRvb3RoQTJkcFNlcnZpY2UuY3BwIFwKQEAgLTE0Miw2ICsxNDYsNyBAQAogTE9DQUxfQ19JTkNMVURFUyArPSBcCiAJJChKTklfSF9JTkNMVURFKSBcCiAJJChMT0NBTF9QQVRIKS9hbmRyb2lkL2dyYXBoaWNzIFwKKwkkKExPQ0FMX1BBVEgpLy4uLy4uL2xpYnMvaHd1aSBcCiAJJChjYWxsIGluY2x1ZGUtcGF0aC1mb3IsIGJsdWVkcm9pZCkgXAogCSQoY2FsbCBpbmNsdWRlLXBhdGgtZm9yLCBsaWJoYXJkd2FyZSkvaGFyZHdhcmUgXAogCSQoY2FsbCBpbmNsdWRlLXBhdGgtZm9yLCBsaWJoYXJkd2FyZV9sZWdhY3kpL2hhcmR3YXJlX2xlZ2FjeSBcCkBAIC0xOTIsNiArMTk3LDEwIEBACiAJbGlid3BhX2NsaWVudCBcCiAJbGlianBlZwogCitpZmVxICgkKFVTRV9PUEVOR0xfUkVOREVSRVIpLHRydWUpCisJTE9DQUxfU0hBUkVEX0xJQlJBUklFUyArPSBsaWJod3VpCitlbmRpZgorCiBpZmVxICgkKEJPQVJEX0hBVkVfQkxVRVRPT1RIKSx0cnVlKQogTE9DQUxfQ19JTkNMVURFUyArPSBcCiAJZXh0ZXJuYWwvZGJ1cyBcCmRpZmYgLS1naXQgYS9jb3JlL2puaS9BbmRyb2lkUnVudGltZS5jcHAgYi9jb3JlL2puaS9BbmRyb2lkUnVudGltZS5jcHAKaW5kZXggMjc1MWE4Mi4uYzlkN2U3ZiAxMDA2NDQKLS0tIGEvY29yZS9qbmkvQW5kcm9pZFJ1bnRpbWUuY3BwCisrKyBiL2NvcmUvam5pL0FuZHJvaWRSdW50aW1lLmNwcApAQCAtMTE1LDYgKzExNSw3IEBACiBleHRlcm4gaW50IHJlZ2lzdGVyX2FuZHJvaWRfZ3JhcGhpY3NfUGl4ZWxGb3JtYXQoSk5JRW52KiBlbnYpOwogZXh0ZXJuIGludCByZWdpc3Rlcl9jb21fYW5kcm9pZF9pbnRlcm5hbF9ncmFwaGljc19OYXRpdmVVdGlscyhKTklFbnYgKmVudik7CiBleHRlcm4gaW50IHJlZ2lzdGVyX2FuZHJvaWRfdmlld19EaXNwbGF5KEpOSUVudiogZW52KTsKK2V4dGVybiBpbnQgcmVnaXN0ZXJfYW5kcm9pZF92aWV3X0dMRVMyMENhbnZhcyhKTklFbnYqIGVudik7CiBleHRlcm4gaW50IHJlZ2lzdGVyX2FuZHJvaWRfdmlld19TdXJmYWNlKEpOSUVudiogZW52KTsKIGV4dGVybiBpbnQgcmVnaXN0ZXJfYW5kcm9pZF92aWV3X1ZpZXdSb290KEpOSUVudiogZW52KTsKIGV4dGVybiBpbnQgcmVnaXN0ZXJfYW5kcm9pZF9kYXRhYmFzZV9DdXJzb3JXaW5kb3coSk5JRW52KiBlbnYpOwpAQCAtMTUxLDcgKzE1Miw2IEBACiBleHRlcm4gaW50IHJlZ2lzdGVyX2FuZHJvaWRfYmx1ZXRvb3RoX0hlYWRzZXRCYXNlKEpOSUVudiogZW52KTsKIGV4dGVybiBpbnQgcmVnaXN0ZXJfYW5kcm9pZF9ibHVldG9vdGhfQmx1ZXRvb3RoQXVkaW9HYXRld2F5KEpOSUVudiogZW52KTsKIGV4dGVybiBpbnQgcmVnaXN0ZXJfYW5kcm9pZF9ibHVldG9vdGhfQmx1ZXRvb3RoU29ja2V0KEpOSUVudiAqZW52KTsKLWV4dGVybiBpbnQgcmVnaXN0ZXJfYW5kcm9pZF9ibHVldG9vdGhfU2NvU29ja2V0KEpOSUVudiAqZW52KTsKIGV4dGVybiBpbnQgcmVnaXN0ZXJfYW5kcm9pZF9zZXJ2ZXJfQmx1ZXRvb3RoU2VydmljZShKTklFbnYqIGVudik7CiBleHRlcm4gaW50IHJlZ2lzdGVyX2FuZHJvaWRfc2VydmVyX0JsdWV0b290aEV2ZW50TG9vcChKTklFbnYgKmVudik7CiBleHRlcm4gaW50IHJlZ2lzdGVyX2FuZHJvaWRfc2VydmVyX0JsdWV0b290aEEyZHBTZXJ2aWNlKEpOSUVudiogZW52KTsKQEAgLTEyMzIsNiArMTIzMiw3IEBACiAgICAgUkVHX0pOSShyZWdpc3Rlcl9hbmRyb2lkX25pb191dGlscyksCiAgICAgUkVHX0pOSShyZWdpc3Rlcl9hbmRyb2lkX2dyYXBoaWNzX1BpeGVsRm9ybWF0KSwKICAgICBSRUdfSk5JKHJlZ2lzdGVyX2FuZHJvaWRfZ3JhcGhpY3NfR3JhcGhpY3MpLAorICAgIFJFR19KTkkocmVnaXN0ZXJfYW5kcm9pZF92aWV3X0dMRVMyMENhbnZhcyksCiAgICAgUkVHX0pOSShyZWdpc3Rlcl9hbmRyb2lkX3ZpZXdfU3VyZmFjZSksCiAgICAgUkVHX0pOSShyZWdpc3Rlcl9hbmRyb2lkX3ZpZXdfVmlld1Jvb3QpLAogICAgIFJFR19KTkkocmVnaXN0ZXJfY29tX2dvb2dsZV9hbmRyb2lkX2dsZXNfam5pX0VHTEltcGwpLApAQCAtMTMwMyw3ICsxMzA0LDYgQEAKICAgICBSRUdfSk5JKHJlZ2lzdGVyX2FuZHJvaWRfYmx1ZXRvb3RoX0hlYWRzZXRCYXNlKSwKICAgICBSRUdfSk5JKHJlZ2lzdGVyX2FuZHJvaWRfYmx1ZXRvb3RoX0JsdWV0b290aEF1ZGlvR2F0ZXdheSksCiAgICAgUkVHX0pOSShyZWdpc3Rlcl9hbmRyb2lkX2JsdWV0b290aF9CbHVldG9vdGhTb2NrZXQpLAotICAgIFJFR19KTkkocmVnaXN0ZXJfYW5kcm9pZF9ibHVldG9vdGhfU2NvU29ja2V0KSwKICAgICBSRUdfSk5JKHJlZ2lzdGVyX2FuZHJvaWRfc2VydmVyX0JsdWV0b290aFNlcnZpY2UpLAogICAgIFJFR19KTkkocmVnaXN0ZXJfYW5kcm9pZF9zZXJ2ZXJfQmx1ZXRvb3RoRXZlbnRMb29wKSwKICAgICBSRUdfSk5JKHJlZ2lzdGVyX2FuZHJvaWRfc2VydmVyX0JsdWV0b290aEEyZHBTZXJ2aWNlKSwKZGlmZiAtLWdpdCBhL2NvcmUvam5pL0N1cnNvcldpbmRvdy5jcHAgYi9jb3JlL2puaS9DdXJzb3JXaW5kb3cuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ODc3OTIxLi4wMDAwMDAwCi0tLSBhL2NvcmUvam5pL0N1cnNvcldpbmRvdy5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw0MTMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNi0yMDA3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgCi0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIAotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0IAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUgCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCAKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jdW5kZWYgTE9HX1RBRwotI2RlZmluZSBMT0dfVEFHICJDdXJzb3JXaW5kb3ciCi0KLSNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KLSNpbmNsdWRlIDxiaW5kZXIvTWVtb3J5SGVhcEJhc2UuaD4KLSNpbmNsdWRlIDxiaW5kZXIvTWVtb3J5QmFzZS5oPgotCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0KLSNpbmNsdWRlIDxqbmkuaD4KLSNpbmNsdWRlIDxKTklIZWxwLmg+Ci0KLSNpbmNsdWRlICJDdXJzb3JXaW5kb3cuaCIKLQotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLUN1cnNvcldpbmRvdzo6Q3Vyc29yV2luZG93KHNpemVfdCBtYXhTaXplKSA6Ci0gICAgbU1heFNpemUobWF4U2l6ZSkKLXsKLX0KLQotYm9vbCBDdXJzb3JXaW5kb3c6OnNldE1lbW9yeShjb25zdCBzcDxJTWVtb3J5PiYgbWVtb3J5KQotewotICAgIG1NZW1vcnkgPSBtZW1vcnk7Ci0gICAgbURhdGEgPSAodWludDhfdCAqKSBtZW1vcnktPnBvaW50ZXIoKTsKLSAgICBpZiAobURhdGEgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIG1IZWFkZXIgPSAod2luZG93X2hlYWRlcl90ICopIG1EYXRhOwotCi0gICAgLy8gTWFrZSB0aGUgd2luZG93IHJlYWQtb25seQotICAgIHNzaXplX3Qgc2l6ZSA9IG1lbW9yeS0+c2l6ZSgpOwotICAgIG1TaXplID0gc2l6ZTsKLSAgICBtTWF4U2l6ZSA9IHNpemU7Ci0gICAgbUZyZWVPZmZzZXQgPSBzaXplOwotTE9HX1dJTkRPVygiQ3JlYXRlZCBDdXJzb3JXaW5kb3cgZnJvbSBleGlzdGluZyBJTWVtb3J5OiBtRnJlZU9mZnNldCA9ICVkLCBudW1Sb3dzID0gJWQsIG51bUNvbHVtbnMgPSAlZCwgbVNpemUgPSAlZCwgbU1heFNpemUgPSAlZCwgbURhdGEgPSAlcCIsIG1GcmVlT2Zmc2V0LCBtSGVhZGVyLT5udW1Sb3dzLCBtSGVhZGVyLT5udW1Db2x1bW5zLCBtU2l6ZSwgbU1heFNpemUsIG1EYXRhKTsKLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCBDdXJzb3JXaW5kb3c6OmluaXRCdWZmZXIoYm9vbCBsb2NhbE9ubHkpCi17Ci0gICAgLy9UT0RPIFVzZSBhIG5vbi1tZW1vcnkgZGVhbGVyIG1tYXAgcmVnaW9uIGZvciBsb2NhbE9ubHkKLQotICAgIHNwPE1lbW9yeUhlYXBCYXNlPiBoZWFwOwotICAgIGhlYXAgPSBuZXcgTWVtb3J5SGVhcEJhc2UobU1heFNpemUsIDAsICJDdXJzb3JXaW5kb3ciKTsKLSAgICBpZiAoaGVhcCAhPSBOVUxMKSB7Ci0gICAgICAgIG1NZW1vcnkgPSBuZXcgTWVtb3J5QmFzZShoZWFwLCAwLCBtTWF4U2l6ZSk7Ci0gICAgICAgIGlmIChtTWVtb3J5ICE9IE5VTEwpIHsKLSAgICAgICAgICAgIG1EYXRhID0gKHVpbnQ4X3QgKikgbU1lbW9yeS0+cG9pbnRlcigpOwotICAgICAgICAgICAgaWYgKG1EYXRhKSB7Ci0gICAgICAgICAgICAgICAgbUhlYWRlciA9ICh3aW5kb3dfaGVhZGVyX3QgKikgbURhdGE7Ci0gICAgICAgICAgICAgICAgbVNpemUgPSBtTWF4U2l6ZTsKLQotICAgICAgICAgICAgICAgIC8vIFB1dCB0aGUgd2luZG93IGludG8gYSBjbGVhbiBzdGF0ZQotICAgICAgICAgICAgICAgIGNsZWFyKCk7Ci0gICAgICAgICAgICBMT0dfV0lORE9XKCJDcmVhdGVkIEN1cnNvcldpbmRvdyB3aXRoIG5ldyBNZW1vcnlEZWFsZXI6IG1GcmVlT2Zmc2V0ID0gJWQsIG1TaXplID0gJWQsIG1NYXhTaXplID0gJWQsIG1EYXRhID0gJXAiLCBtRnJlZU9mZnNldCwgbVNpemUsIG1NYXhTaXplLCBtRGF0YSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7ICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgfQotICAgICAgICB9IAotICAgICAgICBMT0dFKCJDdXJzb3JXaW5kb3cgaGVhcCBhbGxvY2F0aW9uIGZhaWxlZCIpOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgTE9HRSgiZmFpbGVkIHRvIGNyZWF0ZSB0aGUgQ3Vyc29yV2luZG93IGhlYXAiKTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLX0KLQotQ3Vyc29yV2luZG93Ojp+Q3Vyc29yV2luZG93KCkKLXsKLSAgICAvLyBFdmVyeXRoaW5nIHRoYXQgbWF0dGVycyBpcyBhIHNtYXJ0IHBvaW50ZXIKLX0KLQotdm9pZCBDdXJzb3JXaW5kb3c6OmNsZWFyKCkKLXsKLSAgICBtSGVhZGVyLT5udW1Sb3dzID0gMDsKLSAgICBtSGVhZGVyLT5udW1Db2x1bW5zID0gMDsKLSAgICBtRnJlZU9mZnNldCA9IHNpemVvZih3aW5kb3dfaGVhZGVyX3QpICsgUk9XX1NMT1RfQ0hVTktfU0laRTsKLSAgICAvLyBNYXJrIHRoZSBmaXJzdCBjaHVuaydzIG5leHQgJ3BvaW50ZXInIGFzIG51bGwKLSAgICAqKCh1aW50MzJfdCAqKShtRGF0YSArIG1GcmVlT2Zmc2V0IC0gc2l6ZW9mKHVpbnQzMl90KSkpID0gMDsKLX0KLQotaW50MzJfdCBDdXJzb3JXaW5kb3c6OmZyZWVTcGFjZSgpCi17Ci0gICAgaW50MzJfdCBmcmVlU3BhY2UgPSBtU2l6ZSAtIG1GcmVlT2Zmc2V0OwotICAgIGlmIChmcmVlU3BhY2UgPCAwKSB7Ci0gICAgICAgIGZyZWVTcGFjZSA9IDA7Ci0gICAgfQotICAgIHJldHVybiBmcmVlU3BhY2U7Ci19Ci0KLWZpZWxkX3Nsb3RfdCAqIEN1cnNvcldpbmRvdzo6YWxsb2NSb3coKQotewotICAgIC8vIEZpbGwgaW4gdGhlIHJvdyBzbG90Ci0gICAgcm93X3Nsb3RfdCAqIHJvd1Nsb3QgPSBhbGxvY1Jvd1Nsb3QoKTsKLSAgICBpZiAocm93U2xvdCA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICAgIC8vIEFsbG9jYXRlIHRoZSBzbG90cyBmb3IgdGhlIGZpZWxkIGRpcmVjdG9yeQotICAgIHNpemVfdCBmaWVsZERpclNpemUgPSBtSGVhZGVyLT5udW1Db2x1bW5zICogc2l6ZW9mKGZpZWxkX3Nsb3RfdCk7Ci0gICAgdWludDMyX3QgZmllbGREaXJPZmZzZXQgPSBhbGxvYyhmaWVsZERpclNpemUpOwotICAgIGlmICghZmllbGREaXJPZmZzZXQpIHsKLSAgICAgICAgbUhlYWRlci0+bnVtUm93cy0tOwotICAgICAgICBMT0dFKCJUaGUgcm93IGZhaWxlZCwgc28gYmFjayBvdXQgdGhlIG5ldyByb3cgYWNjb3VudGluZyBmcm9tIGFsbG9jUm93U2xvdCAlZCIsIG1IZWFkZXItPm51bVJvd3MpOwotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgZmllbGRfc2xvdF90ICogZmllbGREaXIgPSAoZmllbGRfc2xvdF90ICopb2Zmc2V0VG9QdHIoZmllbGREaXJPZmZzZXQpOwotICAgIG1lbXNldChmaWVsZERpciwgMHgwLCBmaWVsZERpclNpemUpOwotCi1MT0dfV0lORE9XKCJBbGxvY2F0ZWQgcm93ICV1LCByb3dTbG90IGlzIGF0IG9mZnNldCAldSwgZmllbGREaXIgaXMgJWQgYnl0ZXMgYXQgb2Zmc2V0ICV1XG4iLCAobUhlYWRlci0+bnVtUm93cyAtIDEpLCAoKHVpbnQ4X3QgKilyb3dTbG90KSAtIG1EYXRhLCBmaWVsZERpclNpemUsIGZpZWxkRGlyT2Zmc2V0KTsKLSAgICByb3dTbG90LT5vZmZzZXQgPSBmaWVsZERpck9mZnNldDsKLQotICAgIHJldHVybiBmaWVsZERpcjsKLX0KLQotdWludDMyX3QgQ3Vyc29yV2luZG93OjphbGxvYyhzaXplX3QgcmVxdWVzdGVkU2l6ZSwgYm9vbCBhbGlnbmVkKQotewotICAgIGludDMyX3Qgc2l6ZTsKLSAgICB1aW50MzJfdCBwYWRkaW5nOwotICAgIGlmIChhbGlnbmVkKSB7Ci0gICAgICAgIC8vIDQgYnl0ZSBhbGlnbm1lbnQKLSAgICAgICAgcGFkZGluZyA9IDQgLSAobUZyZWVPZmZzZXQgJiAweDMpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHBhZGRpbmcgPSAwOwotICAgIH0KLQotICAgIHNpemUgPSByZXF1ZXN0ZWRTaXplICsgcGFkZGluZzsKLQotICAgIGlmIChzaXplID4gZnJlZVNwYWNlKCkpIHsKLSAgICAgICAgTE9HRSgibmVlZCB0byBncm93OiBtU2l6ZSA9ICVkLCBzaXplID0gJWQsIGZyZWVTcGFjZSgpID0gJWQsIG51bVJvd3MgPSAlZCIsIG1TaXplLCBzaXplLCBmcmVlU3BhY2UoKSwgbUhlYWRlci0+bnVtUm93cyk7Ci0gICAgICAgIC8vIE9ubHkgZ3JvdyB0aGUgd2luZG93IGlmIHRoZSBmaXJzdCByb3cgZG9lc24ndCBmaXQKLSAgICAgICAgaWYgKG1IZWFkZXItPm51bVJvd3MgPiAxKSB7Ci1MT0dFKCJub3QgZ3Jvd2luZyBzaW5jZSB0aGVyZSBhcmUgYWxyZWFkeSAlZCByb3cocyksIG1heCBzaXplICVkIiwgbUhlYWRlci0+bnVtUm93cywgbU1heFNpemUpOwotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBGaW5kIGEgbmV3IHNpemUgdGhhdCB3aWxsIGZpdCB0aGUgYWxsb2NhdGlvbgotICAgICAgICBpbnQgYWxsb2NhdGVkID0gbVNpemUgLSBmcmVlU3BhY2UoKTsKLSAgICAgICAgaW50IG5ld1NpemUgPSBtU2l6ZSArIFdJTkRPV19BTExPQ0FUSU9OX1NJWkU7Ci0gICAgICAgIHdoaWxlIChzaXplID4gKG5ld1NpemUgLSBhbGxvY2F0ZWQpKSB7Ci0gICAgICAgICAgICBuZXdTaXplICs9IFdJTkRPV19BTExPQ0FUSU9OX1NJWkU7Ci0gICAgICAgICAgICBpZiAobmV3U2l6ZSA+IG1NYXhTaXplKSB7Ci0gICAgICAgICAgICAgICAgTE9HRSgiQXR0ZW1wdGluZyB0byBncm93IHdpbmRvdyBiZXlvbmQgbWF4IHNpemUgKCVkKSIsIG1NYXhTaXplKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotTE9HX1dJTkRPVygiZm91bmQgc2l6ZSAlZCIsIG5ld1NpemUpOwotICAgICAgICBtU2l6ZSA9IG5ld1NpemU7Ci0gICAgfQotCi0gICAgdWludDMyX3Qgb2Zmc2V0ID0gbUZyZWVPZmZzZXQgKyBwYWRkaW5nOwotICAgIG1GcmVlT2Zmc2V0ICs9IHNpemU7Ci0gICAgcmV0dXJuIG9mZnNldDsKLX0KLQotcm93X3Nsb3RfdCAqIEN1cnNvcldpbmRvdzo6Z2V0Um93U2xvdChpbnQgcm93KQotewotICAgIExPR19XSU5ET1coImVudGVyIGdldFJvd1Nsb3QgY3VycmVudCByb3cgbnVtICVkLCB0aGlzIHJvdyAlZCIsIG1IZWFkZXItPm51bVJvd3MsIHJvdyk7Ci0gICAgaW50IGNodW5rTnVtID0gcm93IC8gUk9XX1NMT1RfQ0hVTktfTlVNX1JPV1M7Ci0gICAgaW50IGNodW5rUG9zID0gcm93ICUgUk9XX1NMT1RfQ0hVTktfTlVNX1JPV1M7Ci0gICAgaW50IGNodW5rUHRyT2Zmc2V0ID0gc2l6ZW9mKHdpbmRvd19oZWFkZXJfdCkgKyBST1dfU0xPVF9DSFVOS19TSVpFIC0gc2l6ZW9mKHVpbnQzMl90KTsKLSAgICB1aW50OF90ICogcm93Q2h1bmsgPSBtRGF0YSArIHNpemVvZih3aW5kb3dfaGVhZGVyX3QpOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2h1bmtOdW07IGkrKykgewotICAgICAgICByb3dDaHVuayA9IG9mZnNldFRvUHRyKCooKHVpbnQzMl90ICopKG1EYXRhICsgY2h1bmtQdHJPZmZzZXQpKSk7Ci0gICAgICAgIGNodW5rUHRyT2Zmc2V0ID0gcm93Q2h1bmsgLSBtRGF0YSArIChST1dfU0xPVF9DSFVOS19OVU1fUk9XUyAqIHNpemVvZihyb3dfc2xvdF90KSk7Ci0gICAgfQotICAgIHJldHVybiAocm93X3Nsb3RfdCAqKShyb3dDaHVuayArIChjaHVua1BvcyAqIHNpemVvZihyb3dfc2xvdF90KSkpOwotICAgIExPR19XSU5ET1coImV4aXQgZ2V0Um93U2xvdCBjdXJyZW50IHJvdyBudW0gJWQsIHRoaXMgcm93ICVkIiwgbUhlYWRlci0+bnVtUm93cywgcm93KTsgICAgCi19Ci0KLXJvd19zbG90X3QgKiBDdXJzb3JXaW5kb3c6OmFsbG9jUm93U2xvdCgpCi17Ci0gICAgaW50IGNodW5rTnVtID0gbUhlYWRlci0+bnVtUm93cyAvIFJPV19TTE9UX0NIVU5LX05VTV9ST1dTOwotICAgIGludCBjaHVua1BvcyA9IG1IZWFkZXItPm51bVJvd3MgJSBST1dfU0xPVF9DSFVOS19OVU1fUk9XUzsKLSAgICBpbnQgY2h1bmtQdHJPZmZzZXQgPSBzaXplb2Yod2luZG93X2hlYWRlcl90KSArIFJPV19TTE9UX0NIVU5LX1NJWkUgLSBzaXplb2YodWludDMyX3QpOwotICAgIHVpbnQ4X3QgKiByb3dDaHVuayA9IG1EYXRhICsgc2l6ZW9mKHdpbmRvd19oZWFkZXJfdCk7Ci1MT0dfV0lORE9XKCJBbGxvY2F0aW5nIHJvdyBzbG90LCBtSGVhZGVyLT5udW1Sb3dzIGlzICVkLCBjaHVua051bSBpcyAlZCwgY2h1bmtQb3MgaXMgJWQiLCBtSGVhZGVyLT5udW1Sb3dzLCBjaHVua051bSwgY2h1bmtQb3MpOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2h1bmtOdW07IGkrKykgewotICAgICAgICB1aW50MzJfdCBuZXh0Q2h1bmtPZmZzZXQgPSAqKCh1aW50MzJfdCAqKShtRGF0YSArIGNodW5rUHRyT2Zmc2V0KSk7Ci1MT0dfV0lORE9XKCJuZXh0Q2h1bmtPZmZzZXQgaXMgJWQiLCBuZXh0Q2h1bmtPZmZzZXQpOwotICAgICAgICBpZiAobmV4dENodW5rT2Zmc2V0ID09IDApIHsKLSAgICAgICAgICAgIC8vIEFsbG9jYXRlIGEgbmV3IHJvdyBjaHVuawotICAgICAgICAgICAgbmV4dENodW5rT2Zmc2V0ID0gYWxsb2MoUk9XX1NMT1RfQ0hVTktfU0laRSwgdHJ1ZSk7Ci0gICAgICAgICAgICBpZiAobmV4dENodW5rT2Zmc2V0ID09IDApIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJvd0NodW5rID0gb2Zmc2V0VG9QdHIobmV4dENodW5rT2Zmc2V0KTsKLUxPR19XSU5ET1coImFsbG9jYXRlZCBuZXcgY2h1bmsgYXQgJWQsIHJvd0NodW5rID0gJXAiLCBuZXh0Q2h1bmtPZmZzZXQsIHJvd0NodW5rKTsKLSAgICAgICAgICAgICooKHVpbnQzMl90ICopKG1EYXRhICsgY2h1bmtQdHJPZmZzZXQpKSA9IHJvd0NodW5rIC0gbURhdGE7Ci0gICAgICAgICAgICAvLyBNYXJrIHRoZSBuZXcgY2h1bmsncyBuZXh0ICdwb2ludGVyJyBhcyBudWxsCi0gICAgICAgICAgICAqKCh1aW50MzJfdCAqKShyb3dDaHVuayArIFJPV19TTE9UX0NIVU5LX1NJWkUgLSBzaXplb2YodWludDMyX3QpKSkgPSAwOwotICAgICAgICB9IGVsc2UgewotTE9HX1dJTkRPVygiZm9sbHdpbmcgJ3BvaW50ZXInIHRvIG5leHQgY2h1bmssIG9mZnNldCBvZiBuZXh0IHBvaW50ZXIgaXMgJWQiLCBjaHVua1B0ck9mZnNldCk7Ci0gICAgICAgICAgICByb3dDaHVuayA9IG9mZnNldFRvUHRyKG5leHRDaHVua09mZnNldCk7Ci0gICAgICAgICAgICBjaHVua1B0ck9mZnNldCA9IHJvd0NodW5rIC0gbURhdGEgKyAoUk9XX1NMT1RfQ0hVTktfTlVNX1JPV1MgKiBzaXplb2Yocm93X3Nsb3RfdCkpOwotICAgICAgICB9Ci0gICAgfQotICAgIG1IZWFkZXItPm51bVJvd3MrKzsKLQotICAgIHJldHVybiAocm93X3Nsb3RfdCAqKShyb3dDaHVuayArIChjaHVua1BvcyAqIHNpemVvZihyb3dfc2xvdF90KSkpOwotfQotCi1maWVsZF9zbG90X3QgKiBDdXJzb3JXaW5kb3c6OmdldEZpZWxkU2xvdFdpdGhDaGVjayhpbnQgcm93LCBpbnQgY29sdW1uKQotewotICBpZiAocm93IDwgMCB8fCByb3cgPj0gbUhlYWRlci0+bnVtUm93cyB8fCBjb2x1bW4gPCAwIHx8IGNvbHVtbiA+PSBtSGVhZGVyLT5udW1Db2x1bW5zKSB7Ci0gICAgICBMT0dFKCJCYWQgcmVxdWVzdCBmb3IgZmllbGQgc2xvdCAlZCwlZC4gbnVtUm93cyA9ICVkLCBudW1Db2x1bW5zID0gJWQiLCByb3csIGNvbHVtbiwgbUhlYWRlci0+bnVtUm93cywgbUhlYWRlci0+bnVtQ29sdW1ucyk7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgfSAgICAgICAgCi0gIHJvd19zbG90X3QgKiByb3dTbG90ID0gZ2V0Um93U2xvdChyb3cpOwotICBpZiAoIXJvd1Nsb3QpIHsKLSAgICAgIExPR0UoIkZhaWxlZCB0byBmaW5kIHJvd1Nsb3QgZm9yIHJvdyAlZCIsIHJvdyk7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgfQotICBpZiAocm93U2xvdC0+b2Zmc2V0ID09IDAgfHwgcm93U2xvdC0+b2Zmc2V0ID49IG1TaXplKSB7Ci0gICAgICBMT0dFKCJJbnZhbGlkIHJvd1Nsb3QsIG9mZnNldCA9ICVkIiwgcm93U2xvdC0+b2Zmc2V0KTsKLSAgICAgIHJldHVybiBOVUxMOwotICB9ICAKLSAgaW50IGZpZWxkRGlyT2Zmc2V0ID0gcm93U2xvdC0+b2Zmc2V0OwotICByZXR1cm4gKChmaWVsZF9zbG90X3QgKilvZmZzZXRUb1B0cihmaWVsZERpck9mZnNldCkpICsgY29sdW1uOyAgCi19Ci0KLXVpbnQzMl90IEN1cnNvcldpbmRvdzo6cmVhZF9maWVsZF9zbG90KGludCByb3csIGludCBjb2x1bW4sIGZpZWxkX3Nsb3RfdCAqIHNsb3RPdXQpCi17Ci0gICAgaWYgKHJvdyA8IDAgfHwgcm93ID49IG1IZWFkZXItPm51bVJvd3MgfHwgY29sdW1uIDwgMCB8fCBjb2x1bW4gPj0gbUhlYWRlci0+bnVtQ29sdW1ucykgewotICAgICAgICBMT0dFKCJCYWQgcmVxdWVzdCBmb3IgZmllbGQgc2xvdCAlZCwlZC4gbnVtUm93cyA9ICVkLCBudW1Db2x1bW5zID0gJWQiLCByb3csIGNvbHVtbiwgbUhlYWRlci0+bnVtUm93cywgbUhlYWRlci0+bnVtQ29sdW1ucyk7Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICB9ICAgICAgICAKLSAgICByb3dfc2xvdF90ICogcm93U2xvdCA9IGdldFJvd1Nsb3Qocm93KTsKLSAgICBpZiAoIXJvd1Nsb3QpIHsKLSAgICAgICAgTE9HRSgiRmFpbGVkIHRvIGZpbmQgcm93U2xvdCBmb3Igcm93ICVkIiwgcm93KTsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLSAgICBpZiAocm93U2xvdC0+b2Zmc2V0ID09IDAgfHwgcm93U2xvdC0+b2Zmc2V0ID49IG1TaXplKSB7Ci0gICAgICAgIExPR0UoIkludmFsaWQgcm93U2xvdCwgb2Zmc2V0ID0gJWQiLCByb3dTbG90LT5vZmZzZXQpOwotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQotTE9HX1dJTkRPVygiRm91bmQgZmllbGQgZGlyZWN0b3J5IGZvciAlZCwlZCBhdCByb3dTbG90ICVkLCBvZmZzZXQgJWQiLCByb3csIGNvbHVtbiwgKHVpbnQ4X3QgKilyb3dTbG90IC0gbURhdGEsIHJvd1Nsb3QtPm9mZnNldCk7Ci0gICAgZmllbGRfc2xvdF90ICogZmllbGREaXIgPSAoZmllbGRfc2xvdF90ICopb2Zmc2V0VG9QdHIocm93U2xvdC0+b2Zmc2V0KTsKLUxPR19XSU5ET1coIlJlYWQgZmllbGRfc2xvdF90ICVkLCVkOiBvZmZzZXQgPSAlZCwgc2l6ZSA9ICVkLCB0eXBlID0gJWQiLCByb3csIGNvbHVtbiwgZmllbGREaXJbY29sdW1uXS5kYXRhLmJ1ZmZlci5vZmZzZXQsIGZpZWxkRGlyW2NvbHVtbl0uZGF0YS5idWZmZXIuc2l6ZSwgZmllbGREaXJbY29sdW1uXS50eXBlKTsKLQotICAgIC8vIENvcHkgdGhlIGRhdGEgdG8gdGhlIG91dCBwYXJhbQotICAgIHNsb3RPdXQtPmRhdGEuYnVmZmVyLm9mZnNldCA9IGZpZWxkRGlyW2NvbHVtbl0uZGF0YS5idWZmZXIub2Zmc2V0OwotICAgIHNsb3RPdXQtPmRhdGEuYnVmZmVyLnNpemUgPSBmaWVsZERpcltjb2x1bW5dLmRhdGEuYnVmZmVyLnNpemU7Ci0gICAgc2xvdE91dC0+dHlwZSA9IGZpZWxkRGlyW2NvbHVtbl0udHlwZTsKLSAgICByZXR1cm4gMDsKLX0KLQotdm9pZCBDdXJzb3JXaW5kb3c6OmNvcHlJbih1aW50MzJfdCBvZmZzZXQsIHVpbnQ4X3QgY29uc3QgKiBkYXRhLCBzaXplX3Qgc2l6ZSkKLXsKLSAgICBhc3NlcnQob2Zmc2V0ICsgc2l6ZSA8PSBtU2l6ZSk7ICAgIAotICAgIG1lbWNweShtRGF0YSArIG9mZnNldCwgZGF0YSwgc2l6ZSk7Ci19Ci0KLXZvaWQgQ3Vyc29yV2luZG93Ojpjb3B5SW4odWludDMyX3Qgb2Zmc2V0LCBpbnQ2NF90IGRhdGEpCi17Ci0gICAgYXNzZXJ0KG9mZnNldCArIHNpemVvZihpbnQ2NF90KSA8PSBtU2l6ZSk7Ci0gICAgbWVtY3B5KG1EYXRhICsgb2Zmc2V0LCAodWludDhfdCAqKSZkYXRhLCBzaXplb2YoaW50NjRfdCkpOwotfQotCi12b2lkIEN1cnNvcldpbmRvdzo6Y29weUluKHVpbnQzMl90IG9mZnNldCwgZG91YmxlIGRhdGEpCi17Ci0gICAgYXNzZXJ0KG9mZnNldCArIHNpemVvZihkb3VibGUpIDw9IG1TaXplKTsKLSAgICBtZW1jcHkobURhdGEgKyBvZmZzZXQsICh1aW50OF90ICopJmRhdGEsIHNpemVvZihkb3VibGUpKTsKLX0KLQotdm9pZCBDdXJzb3JXaW5kb3c6OmNvcHlPdXQodWludDMyX3Qgb2Zmc2V0LCB1aW50OF90ICogZGF0YSwgc2l6ZV90IHNpemUpCi17Ci0gICAgYXNzZXJ0KG9mZnNldCArIHNpemUgPD0gbVNpemUpOwotICAgIG1lbWNweShkYXRhLCBtRGF0YSArIG9mZnNldCwgc2l6ZSk7Ci19Ci0KLWludDY0X3QgQ3Vyc29yV2luZG93Ojpjb3B5T3V0TG9uZyh1aW50MzJfdCBvZmZzZXQpCi17Ci0gICAgaW50NjRfdCB2YWx1ZTsKLSAgICBhc3NlcnQob2Zmc2V0ICsgc2l6ZW9mKGludDY0X3QpIDw9IG1TaXplKTsKLSAgICBtZW1jcHkoJnZhbHVlLCBtRGF0YSArIG9mZnNldCwgc2l6ZW9mKGludDY0X3QpKTsKLSAgICByZXR1cm4gdmFsdWU7Ci19Ci0KLWRvdWJsZSBDdXJzb3JXaW5kb3c6OmNvcHlPdXREb3VibGUodWludDMyX3Qgb2Zmc2V0KQotewotICAgIGRvdWJsZSB2YWx1ZTsKLSAgICBhc3NlcnQob2Zmc2V0ICsgc2l6ZW9mKGRvdWJsZSkgPD0gbVNpemUpOwotICAgIG1lbWNweSgmdmFsdWUsIG1EYXRhICsgb2Zmc2V0LCBzaXplb2YoZG91YmxlKSk7Ci0gICAgcmV0dXJuIHZhbHVlOwotfQotCi1ib29sIEN1cnNvcldpbmRvdzo6cHV0TG9uZyh1bnNpZ25lZCBpbnQgcm93LCB1bnNpZ25lZCBpbnQgY29sLCBpbnQ2NF90IHZhbHVlKQotewotICAgIGZpZWxkX3Nsb3RfdCAqIGZpZWxkU2xvdCA9IGdldEZpZWxkU2xvdFdpdGhDaGVjayhyb3csIGNvbCk7Ci0gICAgaWYgKCFmaWVsZFNsb3QpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotI2lmIFdJTkRPV19TVE9SQUdFX0lOTElORV9OVU1FUklDUwotICAgIGZpZWxkU2xvdC0+ZGF0YS5sID0gdmFsdWU7Ci0jZWxzZQotICAgIGludCBvZmZzZXQgPSBhbGxvYyhzaXplb2YoaW50NjRfdCkpOwotICAgIGlmICghb2Zmc2V0KSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBjb3B5SW4ob2Zmc2V0LCB2YWx1ZSk7Ci0KLSAgICBmaWVsZFNsb3QtPmRhdGEuYnVmZmVyLm9mZnNldCA9IG9mZnNldDsKLSAgICBmaWVsZFNsb3QtPmRhdGEuYnVmZmVyLnNpemUgPSBzaXplb2YoaW50NjRfdCk7Ci0jZW5kaWYKLSAgICBmaWVsZFNsb3QtPnR5cGUgPSBGSUVMRF9UWVBFX0lOVEVHRVI7Ci0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2wgQ3Vyc29yV2luZG93OjpwdXREb3VibGUodW5zaWduZWQgaW50IHJvdywgdW5zaWduZWQgaW50IGNvbCwgZG91YmxlIHZhbHVlKQotewotICAgIGZpZWxkX3Nsb3RfdCAqIGZpZWxkU2xvdCA9IGdldEZpZWxkU2xvdFdpdGhDaGVjayhyb3csIGNvbCk7Ci0gICAgaWYgKCFmaWVsZFNsb3QpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotI2lmIFdJTkRPV19TVE9SQUdFX0lOTElORV9OVU1FUklDUwotICAgIGZpZWxkU2xvdC0+ZGF0YS5kID0gdmFsdWU7Ci0jZWxzZQotICAgIGludCBvZmZzZXQgPSBhbGxvYyhzaXplb2YoaW50NjRfdCkpOwotICAgIGlmICghb2Zmc2V0KSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBjb3B5SW4ob2Zmc2V0LCB2YWx1ZSk7Ci0KLSAgICBmaWVsZFNsb3QtPmRhdGEuYnVmZmVyLm9mZnNldCA9IG9mZnNldDsKLSAgICBmaWVsZFNsb3QtPmRhdGEuYnVmZmVyLnNpemUgPSBzaXplb2YoZG91YmxlKTsKLSNlbmRpZgotICAgIGZpZWxkU2xvdC0+dHlwZSA9IEZJRUxEX1RZUEVfRkxPQVQ7Ci0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2wgQ3Vyc29yV2luZG93OjpwdXROdWxsKHVuc2lnbmVkIGludCByb3csIHVuc2lnbmVkIGludCBjb2wpCi17Ci0gICAgZmllbGRfc2xvdF90ICogZmllbGRTbG90ID0gZ2V0RmllbGRTbG90V2l0aENoZWNrKHJvdywgY29sKTsKLSAgICBpZiAoIWZpZWxkU2xvdCkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgZmllbGRTbG90LT50eXBlID0gRklFTERfVFlQRV9OVUxMOwotICAgIGZpZWxkU2xvdC0+ZGF0YS5idWZmZXIub2Zmc2V0ID0gMDsKLSAgICBmaWVsZFNsb3QtPmRhdGEuYnVmZmVyLnNpemUgPSAwOwotICAgIHJldHVybiB0cnVlOwotfQotCi1ib29sIEN1cnNvcldpbmRvdzo6Z2V0TG9uZyh1bnNpZ25lZCBpbnQgcm93LCB1bnNpZ25lZCBpbnQgY29sLCBpbnQ2NF90ICogdmFsdWVPdXQpCi17Ci0gICAgZmllbGRfc2xvdF90ICogZmllbGRTbG90ID0gZ2V0RmllbGRTbG90V2l0aENoZWNrKHJvdywgY29sKTsKLSAgICBpZiAoIWZpZWxkU2xvdCB8fCBmaWVsZFNsb3QtPnR5cGUgIT0gRklFTERfVFlQRV9JTlRFR0VSKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgCi0jaWYgV0lORE9XX1NUT1JBR0VfSU5MSU5FX05VTUVSSUNTCi0gICAgKnZhbHVlT3V0ID0gZmllbGRTbG90LT5kYXRhLmw7Ci0jZWxzZQotICAgICp2YWx1ZU91dCA9IGNvcHlPdXRMb25nKGZpZWxkU2xvdC0+ZGF0YS5idWZmZXIub2Zmc2V0KTsKLSNlbmRpZgotICAgIHJldHVybiB0cnVlOwotfQotCi1ib29sIEN1cnNvcldpbmRvdzo6Z2V0RG91YmxlKHVuc2lnbmVkIGludCByb3csIHVuc2lnbmVkIGludCBjb2wsIGRvdWJsZSAqIHZhbHVlT3V0KQotewotICAgIGZpZWxkX3Nsb3RfdCAqIGZpZWxkU2xvdCA9IGdldEZpZWxkU2xvdFdpdGhDaGVjayhyb3csIGNvbCk7Ci0gICAgaWYgKCFmaWVsZFNsb3QgfHwgZmllbGRTbG90LT50eXBlICE9IEZJRUxEX1RZUEVfRkxPQVQpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotI2lmIFdJTkRPV19TVE9SQUdFX0lOTElORV9OVU1FUklDUwotICAgICp2YWx1ZU91dCA9IGZpZWxkU2xvdC0+ZGF0YS5kOwotI2Vsc2UKLSAgICAqdmFsdWVPdXQgPSBjb3B5T3V0RG91YmxlKGZpZWxkU2xvdC0+ZGF0YS5idWZmZXIub2Zmc2V0KTsKLSNlbmRpZgotICAgIHJldHVybiB0cnVlOwotfQotCi1ib29sIEN1cnNvcldpbmRvdzo6Z2V0TnVsbCh1bnNpZ25lZCBpbnQgcm93LCB1bnNpZ25lZCBpbnQgY29sLCBib29sICogdmFsdWVPdXQpCi17Ci0gICAgZmllbGRfc2xvdF90ICogZmllbGRTbG90ID0gZ2V0RmllbGRTbG90V2l0aENoZWNrKHJvdywgY29sKTsKLSAgICBpZiAoIWZpZWxkU2xvdCkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIAotICAgIGlmIChmaWVsZFNsb3QtPnR5cGUgIT0gRklFTERfVFlQRV9OVUxMKSB7Ci0gICAgICAgICp2YWx1ZU91dCA9IGZhbHNlOwotICAgIH0gZWxzZSB7Ci0gICAgICAgICp2YWx1ZU91dCA9IHRydWU7Ci0gICAgfQotICAgIHJldHVybiB0cnVlOwotfQotCi19OyAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvY29yZS9qbmkvQ3Vyc29yV2luZG93LmggYi9jb3JlL2puaS9DdXJzb3JXaW5kb3cuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2ZjYjU2MC4uMDAwMDAwMAotLS0gYS9jb3JlL2puaS9DdXJzb3JXaW5kb3cuaAorKysgL2Rldi9udWxsCkBAIC0xLDIwMiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgCi0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIAotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0IAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUgCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCAKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIF9BTkRST0lEX19EQVRBQkFTRV9XSU5ET1dfSAotI2RlZmluZSBfQU5EUk9JRF9fREFUQUJBU0VfV0lORE9XX0gKLQotI2luY2x1ZGUgPGN1dGlscy9sb2cuaD4KLSNpbmNsdWRlIDxzdGRkZWYuaD4KLSNpbmNsdWRlIDxzdGRpbnQuaD4KLQotI2luY2x1ZGUgPGJpbmRlci9JTWVtb3J5Lmg+Ci0jaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgotCi0jaW5jbHVkZSA8am5pLmg+Ci0KLSNkZWZpbmUgREVGQVVMVF9XSU5ET1dfU0laRSA0MDk2Ci0jZGVmaW5lIE1BWF9XSU5ET1dfU0laRSAoMTAyNCAqIDEwMjQpCi0jZGVmaW5lIFdJTkRPV19BTExPQ0FUSU9OX1NJWkUgNDA5NgotCi0jZGVmaW5lIFJPV19TTE9UX0NIVU5LX05VTV9ST1dTIDE2Ci0KLS8vIFJvdyBzbG90cyBhcmUgYWxsb2NhdGVkIGluIGNodW5rcyBvZiBST1dfU0xPVF9DSFVOS19OVU1fUk9XUywKLS8vIHdpdGggYW4gb2Zmc2V0IGFmdGVyIHRoZSByb3dzIHRoYXQgcG9pbnRzIHRvIHRoZSBuZXh0IGNodW5rCi0jZGVmaW5lIFJPV19TTE9UX0NIVU5LX1NJWkUgKChST1dfU0xPVF9DSFVOS19OVU1fUk9XUyAqIHNpemVvZihyb3dfc2xvdF90KSkgKyBzaXplb2YodWludDMyX3QpKQotCi0KLSNpZiBMT0dfTkRFQlVHCi0KLSNkZWZpbmUgSUZfTE9HX1dJTkRPVygpIGlmIChmYWxzZSkKLSNkZWZpbmUgTE9HX1dJTkRPVyguLi4pCi0KLSNlbHNlCi0KLSNkZWZpbmUgSUZfTE9HX1dJTkRPVygpIElGX0xPRyhMT0dfREVCVUcsICJDdXJzb3JXaW5kb3ciKQotI2RlZmluZSBMT0dfV0lORE9XKC4uLikgTE9HKExPR19ERUJVRywgIkN1cnNvcldpbmRvdyIsIF9fVkFfQVJHU19fKQotCi0jZW5kaWYKLQotCi0vLyBXaGVuIGRlZmluZWQgdG8gdHJ1ZSBzdHJpbmdzIGFyZSBzdG9yZWQgYXMgVVRGOCwgb3RoZXJ3aXNlIHRoZXkncmUgVVRGMTYKLSNkZWZpbmUgV0lORE9XX1NUT1JBR0VfVVRGOCAxCi0KLS8vIFdoZW4gZGVmaW5lZCB0byB0cnVlIG51bWJlcmljIHZhbHVlcyBhcmUgc3RvcmVkIGlubGluZSBpbiB0aGUgZmllbGRfc2xvdF90LCBvdGhlcndpc2UgdGhleSdyZSBhbGxvY2F0ZWQgaW4gdGhlIHdpbmRvdwotI2RlZmluZSBXSU5ET1dfU1RPUkFHRV9JTkxJTkVfTlVNRVJJQ1MgMQotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgdWludDMyX3QgbnVtUm93czsKLSAgICB1aW50MzJfdCBudW1Db2x1bW5zOwotfSB3aW5kb3dfaGVhZGVyX3Q7Ci0KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgdWludDMyX3Qgb2Zmc2V0OwotfSByb3dfc2xvdF90OwotCi10eXBlZGVmIHN0cnVjdAotewotICAgIHVpbnQ4X3QgdHlwZTsKLSAgICB1bmlvbiB7Ci0gICAgICAgIGRvdWJsZSBkOwotICAgICAgICBpbnQ2NF90IGw7Ci0gICAgICAgIHN0cnVjdCB7Ci0gICAgICAgICAgICB1aW50MzJfdCBvZmZzZXQ7Ci0gICAgICAgICAgICB1aW50MzJfdCBzaXplOwotICAgICAgICB9IGJ1ZmZlcjsKLSAgICB9IGRhdGE7Ci19IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpIGZpZWxkX3Nsb3RfdDsKLQotI2RlZmluZSBGSUVMRF9UWVBFX0lOVEVHRVIgMQotI2RlZmluZSBGSUVMRF9UWVBFX0ZMT0FUIDIKLSNkZWZpbmUgRklFTERfVFlQRV9TVFJJTkcgMwotI2RlZmluZSBGSUVMRF9UWVBFX0JMT0IgNAotI2RlZmluZSBGSUVMRF9UWVBFX05VTEwgNQotCi0vKioKLSAqIFRoaXMgY2xhc3Mgc3RvcmVzIGEgc2V0IG9mIHJvd3MgZnJvbSBhIGRhdGFiYXNlIGluIGEgYnVmZmVyLiBUaGUgYmVnaW5pbmcgb2YgdGhlCi0gKiB3aW5kb3cgaGFzIGZpcnN0IGNodW5rIG9mIHJvd19zbG90X3RzLCB3aGljaCBhcmUgb2Zmc2V0cyB0byB0aGUgcm93IGRpcmVjdG9yeSwgZm9sbG93ZWQgYnkKLSAqIGFuIG9mZnNldCB0byB0aGUgbmV4dCBjaHVuayBpbiBhIGxpbmtlZC1saXN0IG9mIGFkZGl0aW9uYWwgY2h1bmsgb2Ygcm93X3Nsb3RfdHMgaW4gY2FzZQotICogdGhlIHByZS1hbGxvY2F0ZWQgY2h1bmsgaXNuJ3QgYmlnIGVub3VnaCB0byByZWZlciB0byBhbGwgcm93cy4gRWFjaCByb3cgZGlyZWN0b3J5IGhhcyBhCi0gKiBmaWVsZF9zbG90X3QgcGVyIGNvbHVtbiwgd2hpY2ggaGFzIHRoZSBzaXplLCBvZmZzZXQsIGFuZCB0eXBlIG9mIHRoZSBkYXRhIGZvciB0aGF0IGZpZWxkLgotICogTm90ZSB0aGF0IHRoZSBkYXRhIHR5cGVzIGNvbWUgZnJvbSBzcWxpdGUzLmguCi0gKi8KLWNsYXNzIEN1cnNvcldpbmRvdwotewotcHVibGljOgotICAgICAgICAgICAgICAgICAgICAgICAgQ3Vyc29yV2luZG93KHNpemVfdCBtYXhTaXplKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIEN1cnNvcldpbmRvdygpe30KLSAgICBib29sICAgICAgICAgICAgICAgIHNldE1lbW9yeShjb25zdCBzcDxJTWVtb3J5PiYpOwotICAgICAgICAgICAgICAgICAgICAgICAgfkN1cnNvcldpbmRvdygpOwotCi0gICAgYm9vbCAgICAgICAgICAgICAgICBpbml0QnVmZmVyKGJvb2wgbG9jYWxPbmx5KTsKLSAgICBzcDxJTWVtb3J5PiAgICAgICAgIGdldE1lbW9yeSgpIHtyZXR1cm4gbU1lbW9yeTt9Ci0KLSAgICBzaXplX3QgICAgICAgICAgICAgIHNpemUoKSB7cmV0dXJuIG1TaXplO30KLSAgICB1aW50OF90ICogICAgICAgICAgIGRhdGEoKSB7cmV0dXJuIG1EYXRhO30KLSAgICB1aW50MzJfdCAgICAgICAgICAgIGdldE51bVJvd3MoKSB7cmV0dXJuIG1IZWFkZXItPm51bVJvd3M7fQotICAgIHVpbnQzMl90ICAgICAgICAgICAgZ2V0TnVtQ29sdW1ucygpIHtyZXR1cm4gbUhlYWRlci0+bnVtQ29sdW1uczt9Ci0gICAgdm9pZCAgICAgICAgICAgICAgICBmcmVlTGFzdFJvdygpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobUhlYWRlci0+bnVtUm93cyA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUhlYWRlci0+bnVtUm93cy0tOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICBib29sICAgICAgICAgICAgICAgIHNldE51bUNvbHVtbnModWludDMyX3QgbnVtQ29sdW1ucykKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGN1ciA9IG1IZWFkZXItPm51bUNvbHVtbnM7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjdXIgPiAwICYmIGN1ciAhPSBudW1Db2x1bW5zKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMT0dFKCJUcnlpbmcgdG8gZ28gZnJvbSAlZCBjb2x1bW5zIHRvICVkIiwgY3VyLCBudW1Db2x1bW5zKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtSGVhZGVyLT5udW1Db2x1bW5zID0gbnVtQ29sdW1uczsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgaW50MzJfdCAgICAgICAgICAgICBmcmVlU3BhY2UoKTsKLQotICAgIHZvaWQgICAgICAgICAgICAgICAgY2xlYXIoKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAgICAgKiBBbGxvY2F0ZSBhIHJvdyBzbG90IGFuZCBpdHMgZGlyZWN0b3J5LiBUaGUgcmV0dXJuZWQKLSAgICAgICAgICAgICAgICAgICAgICAgICAqIHBvaW50ZXIgcG9pbnRzIHRvIHRoZSBiZWdpbmluZyBvZiB0aGUgcm93J3MgZGlyZWN0b3J5Ci0gICAgICAgICAgICAgICAgICAgICAgICAgKiBvciBOVUxMIGlmIHRoZXJlIHdhc24ndCByb29tLiBUaGUgZGlyZWN0b3J5IGlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgKiBpbml0aWFsaWVkIHdpdGggTlVMTCBlbnRyaWVzIGZvciBlYWNoIGZpZWxkLgotICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgZmllbGRfc2xvdF90ICogICAgICBhbGxvY1JvdygpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgICAgICAqIEFsbG9jYXRlIGEgcG9ydGlvbiBvZiB0aGUgd2luZG93LiBSZXR1cm5zIHRoZSBvZmZzZXQKLSAgICAgICAgICAgICAgICAgICAgICAgICAqIG9mIHRoZSBhbGxvY2F0aW9uLCBvciAwIGlmIHRoZXJlIGlzbid0IGVub3VnaCBzcGFjZS4KLSAgICAgICAgICAgICAgICAgICAgICAgICAqIElmIGFsaWduZWQgaXMgdHJ1ZSwgdGhlIGFsbG9jYXRpb24gZ2V0cyA0IGJ5dGUgYWxpZ25tZW50LgotICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgdWludDMyX3QgICAgICAgICAgICBhbGxvYyhzaXplX3Qgc2l6ZSwgYm9vbCBhbGlnbmVkID0gZmFsc2UpOwotCi0gICAgdWludDMyX3QgICAgICAgICAgICByZWFkX2ZpZWxkX3Nsb3QoaW50IHJvdywgaW50IGNvbHVtbiwgZmllbGRfc2xvdF90ICogc2xvdCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgICAgICogQ29weSBkYXRhIGludG8gdGhlIHdpbmRvdyBhdCB0aGUgZ2l2ZW4gb2Zmc2V0LgotICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgdm9pZCAgICAgICAgICAgICAgICBjb3B5SW4odWludDMyX3Qgb2Zmc2V0LCB1aW50OF90IGNvbnN0ICogZGF0YSwgc2l6ZV90IHNpemUpOwotICAgIHZvaWQgICAgICAgICAgICAgICAgY29weUluKHVpbnQzMl90IG9mZnNldCwgaW50NjRfdCBkYXRhKTsKLSAgICB2b2lkICAgICAgICAgICAgICAgIGNvcHlJbih1aW50MzJfdCBvZmZzZXQsIGRvdWJsZSBkYXRhKTsKLQotICAgIHZvaWQgICAgICAgICAgICAgICAgY29weU91dCh1aW50MzJfdCBvZmZzZXQsIHVpbnQ4X3QgKiBkYXRhLCBzaXplX3Qgc2l6ZSk7Ci0gICAgaW50NjRfdCAgICAgICAgICAgICBjb3B5T3V0TG9uZyh1aW50MzJfdCBvZmZzZXQpOwotICAgIGRvdWJsZSAgICAgICAgICAgICAgY29weU91dERvdWJsZSh1aW50MzJfdCBvZmZzZXQpOwotCi0gICAgYm9vbCAgICAgICAgICAgICAgICBwdXRMb25nKHVuc2lnbmVkIGludCByb3csIHVuc2lnbmVkIGludCBjb2wsIGludDY0X3QgdmFsdWUpOwotICAgIGJvb2wgICAgICAgICAgICAgICAgcHV0RG91YmxlKHVuc2lnbmVkIGludCByb3csIHVuc2lnbmVkIGludCBjb2wsIGRvdWJsZSB2YWx1ZSk7Ci0gICAgYm9vbCAgICAgICAgICAgICAgICBwdXROdWxsKHVuc2lnbmVkIGludCByb3csIHVuc2lnbmVkIGludCBjb2wpOwotCi0gICAgYm9vbCAgICAgICAgICAgICAgICBnZXRMb25nKHVuc2lnbmVkIGludCByb3csIHVuc2lnbmVkIGludCBjb2wsIGludDY0X3QgKiB2YWx1ZU91dCk7Ci0gICAgYm9vbCAgICAgICAgICAgICAgICBnZXREb3VibGUodW5zaWduZWQgaW50IHJvdywgdW5zaWduZWQgaW50IGNvbCwgZG91YmxlICogdmFsdWVPdXQpOwotICAgIGJvb2wgICAgICAgICAgICAgICAgZ2V0TnVsbCh1bnNpZ25lZCBpbnQgcm93LCB1bnNpZ25lZCBpbnQgY29sLCBib29sICogdmFsdWVPdXQpOwotCi0gICAgdWludDhfdCAqICAgICAgICAgICBvZmZzZXRUb1B0cih1aW50MzJfdCBvZmZzZXQpIHtyZXR1cm4gbURhdGEgKyBvZmZzZXQ7fQotCi0gICAgcm93X3Nsb3RfdCAqICAgICAgICBhbGxvY1Jvd1Nsb3QoKTsKLQotICAgIHJvd19zbG90X3QgKiAgICAgICAgZ2V0Um93U2xvdChpbnQgcm93KTsKLSAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgICAgICogcmV0dXJuIE5VTEwgaWYgRmFpbGVkIHRvIGZpbmQgcm93U2xvdCBvcgotICAgICAgICAgICAgICAgICAgICAgICAgICogSW52YWxpZCByb3dTbG90Ci0gICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICBmaWVsZF9zbG90X3QgKiAgICAgIGdldEZpZWxkU2xvdFdpdGhDaGVjayhpbnQgcm93LCBpbnQgY29sdW1uKTsKLSAgICBmaWVsZF9zbG90X3QgKiAgICAgIGdldEZpZWxkU2xvdChpbnQgcm93LCBpbnQgY29sdW1uKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZpZWxkRGlyT2Zmc2V0ID0gZ2V0Um93U2xvdChyb3cpLT5vZmZzZXQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoKGZpZWxkX3Nsb3RfdCAqKW9mZnNldFRvUHRyKGZpZWxkRGlyT2Zmc2V0KSkgKyBjb2x1bW47Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi1wcml2YXRlOgotICAgIHVpbnQ4X3QgKiBtRGF0YTsKLSAgICBzaXplX3QgbVNpemU7Ci0gICAgc2l6ZV90IG1NYXhTaXplOwotICAgIHdpbmRvd19oZWFkZXJfdCAqIG1IZWFkZXI7Ci0gICAgc3A8SU1lbW9yeT4gbU1lbW9yeTsKLQotICAgIC8qKgotICAgICAqIE9mZnNldCBvZiB0aGUgbG93ZXN0IHVudXNlZCBkYXRhIGJ5dGUgaW4gdGhlIGFycmF5LgotICAgICAqLwotICAgIHVpbnQzMl90IG1GcmVlT2Zmc2V0OwotfTsKLQotfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9jb3JlL2puaS9hbmRyb2lkL2dyYXBoaWNzL0JpdG1hcC5jcHAgYi9jb3JlL2puaS9hbmRyb2lkL2dyYXBoaWNzL0JpdG1hcC5jcHAKaW5kZXggODhiYmFmZC4uODgwZmI2ZSAxMDA2NDQKLS0tIGEvY29yZS9qbmkvYW5kcm9pZC9ncmFwaGljcy9CaXRtYXAuY3BwCisrKyBiL2NvcmUvam5pL2FuZHJvaWQvZ3JhcGhpY3MvQml0bWFwLmNwcApAQCAtMTIsNiArMTIsOCBAQAogDQogI2luY2x1ZGUgPGpuaS5oPg0KIA0KKyNpbmNsdWRlIDxDYWNoZXMuaD4NCisNCiAjaWYgMA0KICAgICAjZGVmaW5lIFRSQUNFX0JJVE1BUChjb2RlKSAgY29kZQ0KICNlbHNlDQpAQCAtMjUxLDYgKzI1MywxMSBAQAogfQ0KIA0KIHN0YXRpYyB2b2lkIEJpdG1hcF9kZXN0cnVjdG9yKEpOSUVudiogZW52LCBqb2JqZWN0LCBTa0JpdG1hcCogYml0bWFwKSB7DQorI2lmZGVmIFVTRV9PUEVOR0xfUkVOREVSRVINCisgICAgaWYgKGFuZHJvaWQ6OnVpcmVuZGVyZXI6OkNhY2hlczo6aGFzSW5zdGFuY2UoKSkgew0KKyAgICAgICAgYW5kcm9pZDo6dWlyZW5kZXJlcjo6Q2FjaGVzOjpnZXRJbnN0YW5jZSgpLnRleHR1cmVDYWNoZS5yZW1vdmUoYml0bWFwKTsNCisgICAgfQ0KKyNlbmRpZg0KICAgICBkZWxldGUgYml0bWFwOw0KIH0NCiANCkBAIC0zMTMsNiArMzIwLDEwIEBACiAgICAgcmV0dXJuIGJpdG1hcC0+Y29uZmlnKCk7DQogfQ0KIA0KK3N0YXRpYyBpbnQgQml0bWFwX2dldEdlbmVyYXRpb25JZChKTklFbnYqIGVudiwgam9iamVjdCwgU2tCaXRtYXAqIGJpdG1hcCkgew0KKyAgICByZXR1cm4gYml0bWFwLT5nZXRHZW5lcmF0aW9uSUQoKTsNCit9DQorDQogc3RhdGljIGpib29sZWFuIEJpdG1hcF9oYXNBbHBoYShKTklFbnYqIGVudiwgam9iamVjdCwgU2tCaXRtYXAqIGJpdG1hcCkgew0KICAgICByZXR1cm4gIWJpdG1hcC0+aXNPcGFxdWUoKTsNCiB9DQpAQCAtNjA2LDYgKzYxNyw3IEBACiAgICAgICAgICh2b2lkKilCaXRtYXBfd3JpdGVUb1BhcmNlbCB9LA0KICAgICB7ICAgIm5hdGl2ZUV4dHJhY3RBbHBoYSIsICAgICAgICIoSUlbSSlMYW5kcm9pZC9ncmFwaGljcy9CaXRtYXA7IiwNCiAgICAgICAgICh2b2lkKilCaXRtYXBfZXh0cmFjdEFscGhhIH0sDQorICAgIHsgICAibmF0aXZlR2VuZXJhdGlvbklkIiwgICAgICAgIihJKUkiLCAodm9pZCopQml0bWFwX2dldEdlbmVyYXRpb25JZCB9LA0KICAgICB7ICAgIm5hdGl2ZUdldFBpeGVsIiwgICAgICAgICAgICIoSUlJKUkiLCAodm9pZCopQml0bWFwX2dldFBpeGVsIH0sDQogICAgIHsgICAibmF0aXZlR2V0UGl4ZWxzIiwgICAgICAgICAgIihJW0lJSUlJSUkpViIsICh2b2lkKilCaXRtYXBfZ2V0UGl4ZWxzIH0sDQogICAgIHsgICAibmF0aXZlU2V0UGl4ZWwiLCAgICAgICAgICAgIihJSUlJKVYiLCAodm9pZCopQml0bWFwX3NldFBpeGVsIH0sDQpkaWZmIC0tZ2l0IGEvY29yZS9qbmkvYW5kcm9pZC9ncmFwaGljcy9DYW52YXMuY3BwIGIvY29yZS9qbmkvYW5kcm9pZC9ncmFwaGljcy9DYW52YXMuY3BwCmluZGV4IGUxZTk1MzYuLmJmMTUwYTkgMTAwNjQ0Ci0tLSBhL2NvcmUvam5pL2FuZHJvaWQvZ3JhcGhpY3MvQ2FudmFzLmNwcAorKysgYi9jb3JlL2puaS9hbmRyb2lkL2dyYXBoaWNzL0NhbnZhcy5jcHAKQEAgLTIwLDcgKzIwLDYgQEAKIAogI2luY2x1ZGUgIlNrQ2FudmFzLmgiCiAjaW5jbHVkZSAiU2tEZXZpY2UuaCIKLSNpbmNsdWRlICJTa0dMQ2FudmFzLmgiCiAjaW5jbHVkZSAiU2tHcmFwaGljcy5oIgogI2luY2x1ZGUgIlNrSW1hZ2VSZWZfR2xvYmFsUG9vbC5oIgogI2luY2x1ZGUgIlNrUG9ydGVyRHVmZi5oIgpAQCAtMzAsNiArMjksMTMgQEAKICNpbmNsdWRlICJTa0JvdW5kYXJ5UGF0Y2guaCIKICNpbmNsdWRlICJTa01lc2hVdGlscy5oIgogCisjaW5jbHVkZSAiVGV4dExheW91dC5oIgorCisjaW5jbHVkZSAidW5pY29kZS91YmlkaS5oIgorI2luY2x1ZGUgInVuaWNvZGUvdXNoYXBlLmgiCisKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKwogI2RlZmluZSBUSU1FX0RSQVd4CiAKIHN0YXRpYyB1aW50MzJfdCBnZXRfdGhyZWFkX21zZWMoKSB7CkBAIC02MCwxMyArNjYsOCBAQAogICAgICAgICByZXR1cm4gYml0bWFwID8gbmV3IFNrQ2FudmFzKCpiaXRtYXApIDogbmV3IFNrQ2FudmFzOwogICAgIH0KICAgICAKLSAgICBzdGF0aWMgU2tDYW52YXMqIGluaXRHTChKTklFbnYqIGVudiwgam9iamVjdCkgewotICAgICAgICByZXR1cm4gbmV3IFNrR0xDYW52YXM7Ci0gICAgfQotICAgIAogICAgIHN0YXRpYyB2b2lkIGZyZWVDYWNoZXMoSk5JRW52KiBlbnYsIGpvYmplY3QpIHsKICAgICAgICAgLy8gdGhlc2UgYXJlIGNhbGxlZCBpbiBubyBwYXJ0aWN1bGFyIG9yZGVyCi0gICAgICAgIFNrR0xDYW52YXM6OkRlbGV0ZUFsbFRleHR1cmVzKCk7CiAgICAgICAgIFNrSW1hZ2VSZWZfR2xvYmFsUG9vbDo6U2V0UkFNVXNlZCgwKTsKICAgICAgICAgU2tHcmFwaGljczo6U2V0Rm9udENhY2hlVXNlZCgwKTsKICAgICB9CkBAIC0xMDMsMTEgKzEwNCw2IEBACiAgICAgICAgIHJldHVybiBjYW52YXMtPmdldERldmljZSgpLT5hY2Nlc3NCaXRtYXAoZmFsc2UpLmhlaWdodCgpOwogICAgIH0KIAotICAgIHN0YXRpYyB2b2lkIHNldFZpZXdwb3J0KEpOSUVudiogZW52LCBqb2JqZWN0LCBTa0NhbnZhcyogY2FudmFzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwgaW50IGhlaWdodCkgewotICAgICAgICBjYW52YXMtPnNldFZpZXdwb3J0KHdpZHRoLCBoZWlnaHQpOwotICAgIH0KLSAgICAKICAgICBzdGF0aWMgdm9pZCBzZXRCaXRtYXAoSk5JRW52KiBlbnYsIGpvYmplY3QsIFNrQ2FudmFzKiBjYW52YXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFNrQml0bWFwKiBiaXRtYXApIHsKICAgICAgICAgY2FudmFzLT5zZXRCaXRtYXBEZXZpY2UoKmJpdG1hcCk7CkBAIC03NDMsNDUgKzczOSw0OSBAQAogICAgICAgICBjYW52YXMtPmRyYXdWZXJ0aWNlcyhtb2RlLCBwdENvdW50LCB2ZXJ0cywgdGV4cywgY29sb3JzLCBOVUxMLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRpY2VzLCBpbmRleENvdW50LCAqcGFpbnQpOwogICAgIH0KLSAgICAKLSAgICBzdGF0aWMgdm9pZCBkcmF3VGV4dF9fX0NJSUZGUGFpbnQoSk5JRW52KiBlbnYsIGpvYmplY3QsIFNrQ2FudmFzKiBjYW52YXMsCisKKworICAgIHN0YXRpYyB2b2lkIGRyYXdUZXh0X19fQ0lJRkZJUGFpbnQoSk5JRW52KiBlbnYsIGpvYmplY3QsIFNrQ2FudmFzKiBjYW52YXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpjaGFyQXJyYXkgdGV4dCwgaW50IGluZGV4LCBpbnQgY291bnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpmbG9hdCB4LCBqZmxvYXQgeSwgU2tQYWludCogcGFpbnQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamZsb2F0IHgsIGpmbG9hdCB5LCBpbnQgZmxhZ3MsIFNrUGFpbnQqIHBhaW50KSB7CiAgICAgICAgIGpjaGFyKiB0ZXh0QXJyYXkgPSBlbnYtPkdldENoYXJBcnJheUVsZW1lbnRzKHRleHQsIE5VTEwpOwotICAgICAgICBqc2l6ZSB0ZXh0Q291bnQgPSBlbnYtPkdldEFycmF5TGVuZ3RoKHRleHQpOwotICAgICAgICBTa1NjYWxhciB4XyA9IFNrRmxvYXRUb1NjYWxhcih4KTsKLSAgICAgICAgU2tTY2FsYXIgeV8gPSBTa0Zsb2F0VG9TY2FsYXIoeSk7Ci0gICAgICAgIGNhbnZhcy0+ZHJhd1RleHQodGV4dEFycmF5ICsgaW5kZXgsIGNvdW50IDw8IDEsIHhfLCB5XywgKnBhaW50KTsKLSAgICAgICAgZW52LT5SZWxlYXNlQ2hhckFycmF5RWxlbWVudHModGV4dCwgdGV4dEFycmF5LCAwKTsKKyAgICAgICAgVGV4dExheW91dDo6ZHJhd1RleHQocGFpbnQsIHRleHRBcnJheSArIGluZGV4LCBjb3VudCwgZmxhZ3MsIHgsIHksIGNhbnZhcyk7CisgICAgICAgIGVudi0+UmVsZWFzZUNoYXJBcnJheUVsZW1lbnRzKHRleHQsIHRleHRBcnJheSwgSk5JX0FCT1JUKTsKICAgICB9Ci0gCi0gICAgc3RhdGljIHZvaWQgZHJhd1RleHRfX1N0cmluZ0lJRkZQYWludChKTklFbnYqIGVudiwgam9iamVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBTa0NhbnZhcyogY2FudmFzLCBqc3RyaW5nIHRleHQsIGludCBzdGFydCwgaW50IGVuZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpmbG9hdCB4LCBqZmxvYXQgeSwgU2tQYWludCogcGFpbnQpIHsKLSAgICAgICAgY29uc3Qgdm9pZCogdGV4dF8gPSBlbnYtPkdldFN0cmluZ0NoYXJzKHRleHQsIE5VTEwpOwotICAgICAgICBTa1NjYWxhciB4XyA9IFNrRmxvYXRUb1NjYWxhcih4KTsKLSAgICAgICAgU2tTY2FsYXIgeV8gPSBTa0Zsb2F0VG9TY2FsYXIoeSk7Ci0gICAgICAgIGNhbnZhcy0+ZHJhd1RleHQoKGNvbnN0IHVpbnQxNl90Kil0ZXh0XyArIHN0YXJ0LCAoZW5kIC0gc3RhcnQpIDw8IDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgeF8sIHlfLCAqcGFpbnQpOwotICAgICAgICBlbnYtPlJlbGVhc2VTdHJpbmdDaGFycyh0ZXh0LCAoY29uc3QgamNoYXIqKSB0ZXh0Xyk7CisKKyAgICBzdGF0aWMgdm9pZCBkcmF3VGV4dF9fU3RyaW5nSUlGRklQYWludChKTklFbnYqIGVudiwgam9iamVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNrQ2FudmFzKiBjYW52YXMsIGpzdHJpbmcgdGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdGFydCwgaW50IGVuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpmbG9hdCB4LCBqZmxvYXQgeSwgaW50IGZsYWdzLCBTa1BhaW50KiBwYWludCkgeworICAgICAgICBjb25zdCBqY2hhciogdGV4dEFycmF5ID0gZW52LT5HZXRTdHJpbmdDaGFycyh0ZXh0LCBOVUxMKTsKKyAgICAgICAgVGV4dExheW91dDo6ZHJhd1RleHQocGFpbnQsIHRleHRBcnJheSArIHN0YXJ0LCBlbmQgLSBzdGFydCwgZmxhZ3MsIHgsIHksIGNhbnZhcyk7CisgICAgICAgIGVudi0+UmVsZWFzZVN0cmluZ0NoYXJzKHRleHQsIHRleHRBcnJheSk7CiAgICAgfQotICAgIAotICAgIHN0YXRpYyB2b2lkIGRyYXdTdHJpbmcoSk5JRW52KiBlbnYsIGpvYmplY3QgY2FudmFzLCBqc3RyaW5nIHRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBqZmxvYXQgeCwgamZsb2F0IHksIGpvYmplY3QgcGFpbnQpIHsKLSAgICAgICAgTlBFX0NIRUNLX1JFVFVSTl9WT0lEKGVudiwgY2FudmFzKTsKLSAgICAgICAgTlBFX0NIRUNLX1JFVFVSTl9WT0lEKGVudiwgcGFpbnQpOwotICAgICAgICBOUEVfQ0hFQ0tfUkVUVVJOX1ZPSUQoZW52LCB0ZXh0KTsKLSAgICAgICAgc2l6ZV90IGNvdW50ID0gZW52LT5HZXRTdHJpbmdMZW5ndGgodGV4dCk7Ci0gICAgICAgIGlmICgwID09IGNvdW50KSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgY29uc3QgamNoYXIqIHRleHRfID0gZW52LT5HZXRTdHJpbmdDaGFycyh0ZXh0LCBOVUxMKTsKLSAgICAgICAgU2tDYW52YXMqIGMgPSBHcmFwaGljc0pOSTo6Z2V0TmF0aXZlQ2FudmFzKGVudiwgY2FudmFzKTsKLSAgICAgICAgYy0+ZHJhd1RleHQodGV4dF8sIGNvdW50IDw8IDEsIFNrRmxvYXRUb1NjYWxhcih4KSwgU2tGbG9hdFRvU2NhbGFyKHkpLAotICAgICAgICAgICAgICAgICAgICAqR3JhcGhpY3NKTkk6OmdldE5hdGl2ZVBhaW50KGVudiwgcGFpbnQpKTsKLSAgICAgICAgZW52LT5SZWxlYXNlU3RyaW5nQ2hhcnModGV4dCwgdGV4dF8pOworCisgICAgc3RhdGljIHZvaWQgZHJhd1RleHRSdW5fX19DSUlJSUZGSVBhaW50KAorICAgICAgICBKTklFbnYqIGVudiwgam9iamVjdCwgU2tDYW52YXMqIGNhbnZhcywgamNoYXJBcnJheSB0ZXh0LCBpbnQgaW5kZXgsCisgICAgICAgIGludCBjb3VudCwgaW50IGNvbnRleHRJbmRleCwgaW50IGNvbnRleHRDb3VudCwKKyAgICAgICAgamZsb2F0IHgsIGpmbG9hdCB5LCBpbnQgZGlyRmxhZ3MsIFNrUGFpbnQqIHBhaW50KSB7CisKKyAgICAgICAgamNoYXIqIGNoYXJzID0gZW52LT5HZXRDaGFyQXJyYXlFbGVtZW50cyh0ZXh0LCBOVUxMKTsKKyAgICAgICAgVGV4dExheW91dDo6ZHJhd1RleHRSdW4ocGFpbnQsIGNoYXJzICsgY29udGV4dEluZGV4LCBpbmRleCAtIGNvbnRleHRJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQsIGNvbnRleHRDb3VudCwgZGlyRmxhZ3MsIHgsIHksIGNhbnZhcyk7CisgICAgICAgIGVudi0+UmVsZWFzZUNoYXJBcnJheUVsZW1lbnRzKHRleHQsIGNoYXJzLCBKTklfQUJPUlQpOwogICAgIH0KLSAgICAKKworICAgIHN0YXRpYyB2b2lkIGRyYXdUZXh0UnVuX19TdHJpbmdJSUlJRkZJUGFpbnQoCisgICAgICAgIEpOSUVudiogZW52LCBqb2JqZWN0IG9iaiwgU2tDYW52YXMqIGNhbnZhcywganN0cmluZyB0ZXh0LCBqaW50IHN0YXJ0LAorICAgICAgICBqaW50IGVuZCwgamludCBjb250ZXh0U3RhcnQsIGppbnQgY29udGV4dEVuZCwKKyAgICAgICAgamZsb2F0IHgsIGpmbG9hdCB5LCBqaW50IGRpckZsYWdzLCBTa1BhaW50KiBwYWludCkgeworCisgICAgICAgIGppbnQgY291bnQgPSBlbmQgLSBzdGFydDsKKyAgICAgICAgamludCBjb250ZXh0Q291bnQgPSBjb250ZXh0RW5kIC0gY29udGV4dFN0YXJ0OworICAgICAgICBjb25zdCBqY2hhciogY2hhcnMgPSBlbnYtPkdldFN0cmluZ0NoYXJzKHRleHQsIE5VTEwpOworICAgICAgICBUZXh0TGF5b3V0OjpkcmF3VGV4dFJ1bihwYWludCwgY2hhcnMgKyBjb250ZXh0U3RhcnQsIHN0YXJ0IC0gY29udGV4dFN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudCwgY29udGV4dENvdW50LCBkaXJGbGFncywgeCwgeSwgY2FudmFzKTsKKyAgICAgICAgZW52LT5SZWxlYXNlU3RyaW5nQ2hhcnModGV4dCwgY2hhcnMpOworICAgIH0KKwogICAgIHN0YXRpYyB2b2lkIGRyYXdQb3NUZXh0X19fQ0lJX0ZQYWludChKTklFbnYqIGVudiwgam9iamVjdCwgU2tDYW52YXMqIGNhbnZhcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamNoYXJBcnJheSB0ZXh0LCBpbnQgaW5kZXgsIGludCBjb3VudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamZsb2F0QXJyYXkgcG9zLCBTa1BhaW50KiBwYWludCkgewpAQCAtODA0LDEwICs4MDQsMTEgQEAKICAgICAgICAgfQogICAgICAgICBkZWxldGVbXSBwb3NQdHI7CiAgICAgfQotIAorCiAgICAgc3RhdGljIHZvaWQgZHJhd1Bvc1RleHRfX1N0cmluZ19GUGFpbnQoSk5JRW52KiBlbnYsIGpvYmplY3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2tDYW52YXMqIGNhbnZhcywganN0cmluZyB0ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpmbG9hdEFycmF5IHBvcywgU2tQYWludCogcGFpbnQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqZmxvYXRBcnJheSBwb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2tQYWludCogcGFpbnQpIHsKICAgICAgICAgY29uc3Qgdm9pZCogdGV4dF8gPSB0ZXh0ID8gZW52LT5HZXRTdHJpbmdDaGFycyh0ZXh0LCBOVUxMKSA6IE5VTEw7CiAgICAgICAgIGludCBieXRlTGVuZ3RoID0gdGV4dCA/IGVudi0+R2V0U3RyaW5nTGVuZ3RoKHRleHQpIDogMDsKICAgICAgICAgZmxvYXQqIHBvc0FycmF5ID0gcG9zID8gZW52LT5HZXRGbG9hdEFycmF5RWxlbWVudHMocG9zLCBOVUxMKSA6IE5VTEw7CkBAIC04MjcsMjcgKzgyOCwyNyBAQAogICAgICAgICB9CiAgICAgICAgIGRlbGV0ZVtdIHBvc1B0cjsKICAgICB9Ci0gCisKICAgICBzdGF0aWMgdm9pZCBkcmF3VGV4dE9uUGF0aF9fX0NJSVBhdGhGRlBhaW50KEpOSUVudiogZW52LCBqb2JqZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgU2tDYW52YXMqIGNhbnZhcywgamNoYXJBcnJheSB0ZXh0LCBpbnQgaW5kZXgsIGludCBjb3VudCwKLSAgICAgICAgICAgICAgICBTa1BhdGgqIHBhdGgsIGpmbG9hdCBoT2Zmc2V0LCBqZmxvYXQgdk9mZnNldCwgU2tQYWludCogcGFpbnQpIHsKKyAgICAgICAgICAgIFNrQ2FudmFzKiBjYW52YXMsIGpjaGFyQXJyYXkgdGV4dCwgaW50IGluZGV4LCBpbnQgY291bnQsCisgICAgICAgICAgICBTa1BhdGgqIHBhdGgsIGpmbG9hdCBoT2Zmc2V0LCBqZmxvYXQgdk9mZnNldCwgamludCBiaWRpRmxhZ3MsIFNrUGFpbnQqIHBhaW50KSB7CiAKICAgICAgICAgamNoYXIqIHRleHRBcnJheSA9IGVudi0+R2V0Q2hhckFycmF5RWxlbWVudHModGV4dCwgTlVMTCk7Ci0gICAgICAgIGNhbnZhcy0+ZHJhd1RleHRPblBhdGhIVih0ZXh0QXJyYXkgKyBpbmRleCwgY291bnQgPDwgMSwgKnBhdGgsCi0gICAgICAgICAgICAgICAgICAgIFNrRmxvYXRUb1NjYWxhcihoT2Zmc2V0KSwgU2tGbG9hdFRvU2NhbGFyKHZPZmZzZXQpLCAqcGFpbnQpOworICAgICAgICBUZXh0TGF5b3V0OjpkcmF3VGV4dE9uUGF0aChwYWludCwgdGV4dEFycmF5LCBjb3VudCwgYmlkaUZsYWdzLCBoT2Zmc2V0LCB2T2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRoLCBjYW52YXMpOwogICAgICAgICBlbnYtPlJlbGVhc2VDaGFyQXJyYXlFbGVtZW50cyh0ZXh0LCB0ZXh0QXJyYXksIDApOwogICAgIH0KLSAKKwogICAgIHN0YXRpYyB2b2lkIGRyYXdUZXh0T25QYXRoX19TdHJpbmdQYXRoRkZQYWludChKTklFbnYqIGVudiwgam9iamVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBTa0NhbnZhcyogY2FudmFzLCBqc3RyaW5nIHRleHQsIFNrUGF0aCogcGF0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBqZmxvYXQgaE9mZnNldCwgamZsb2F0IHZPZmZzZXQsIFNrUGFpbnQqIHBhaW50KSB7CisgICAgICAgICAgICBTa0NhbnZhcyogY2FudmFzLCBqc3RyaW5nIHRleHQsIFNrUGF0aCogcGF0aCwKKyAgICAgICAgICAgIGpmbG9hdCBoT2Zmc2V0LCBqZmxvYXQgdk9mZnNldCwgamludCBiaWRpRmxhZ3MsIFNrUGFpbnQqIHBhaW50KSB7CiAgICAgICAgIGNvbnN0IGpjaGFyKiB0ZXh0XyA9IGVudi0+R2V0U3RyaW5nQ2hhcnModGV4dCwgTlVMTCk7Ci0gICAgICAgIGludCBieXRlTGVuZ3RoID0gZW52LT5HZXRTdHJpbmdMZW5ndGgodGV4dCkgPDwgMTsKLSAgICAgICAgY2FudmFzLT5kcmF3VGV4dE9uUGF0aEhWKHRleHRfLCBieXRlTGVuZ3RoLCAqcGF0aCwKLSAgICAgICAgICAgICAgICAgICAgU2tGbG9hdFRvU2NhbGFyKGhPZmZzZXQpLCBTa0Zsb2F0VG9TY2FsYXIodk9mZnNldCksICpwYWludCk7CisgICAgICAgIGludCBjb3VudCA9IGVudi0+R2V0U3RyaW5nTGVuZ3RoKHRleHQpOworICAgICAgICBUZXh0TGF5b3V0OjpkcmF3VGV4dE9uUGF0aChwYWludCwgdGV4dF8sIGNvdW50LCBiaWRpRmxhZ3MsIGhPZmZzZXQsIHZPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGgsIGNhbnZhcyk7CiAgICAgICAgIGVudi0+UmVsZWFzZVN0cmluZ0NoYXJzKHRleHQsIHRleHRfKTsKICAgICB9Ci0gCisKICAgICBzdGF0aWMgYm9vbCBnZXRDbGlwQm91bmRzKEpOSUVudiogZW52LCBqb2JqZWN0LCBTa0NhbnZhcyogY2FudmFzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgam9iamVjdCBib3VuZHMpIHsKICAgICAgICAgU2tSZWN0ICAgcjsKQEAgLTg2OCwxMiArODY5LDEwIEBACiBzdGF0aWMgSk5JTmF0aXZlTWV0aG9kIGdDYW52YXNNZXRob2RzW10gPSB7CiAgICAgeyJmaW5hbGl6ZXIiLCAiKEkpViIsICh2b2lkKikgU2tDYW52YXNHbHVlOjpmaW5hbGl6ZXJ9LAogICAgIHsiaW5pdFJhc3RlciIsIihJKUkiLCAodm9pZCopIFNrQ2FudmFzR2x1ZTo6aW5pdFJhc3Rlcn0sCi0gICAgeyJpbml0R0wiLCIoKUkiLCAodm9pZCopIFNrQ2FudmFzR2x1ZTo6aW5pdEdMfSwKICAgICB7ImlzT3BhcXVlIiwiKClaIiwgKHZvaWQqKSBTa0NhbnZhc0dsdWU6OmlzT3BhcXVlfSwKICAgICB7ImdldFdpZHRoIiwiKClJIiwgKHZvaWQqKSBTa0NhbnZhc0dsdWU6OmdldFdpZHRofSwKICAgICB7ImdldEhlaWdodCIsIigpSSIsICh2b2lkKikgU2tDYW52YXNHbHVlOjpnZXRIZWlnaHR9LAogICAgIHsibmF0aXZlX3NldEJpdG1hcCIsIihJSSlWIiwgKHZvaWQqKSBTa0NhbnZhc0dsdWU6OnNldEJpdG1hcH0sCi0gICAgeyJuYXRpdmVTZXRWaWV3cG9ydCIsICIoSUlJKVYiLCAodm9pZCopIFNrQ2FudmFzR2x1ZTo6c2V0Vmlld3BvcnR9LAogICAgIHsic2F2ZSIsIigpSSIsICh2b2lkKikgU2tDYW52YXNHbHVlOjpzYXZlQWxsfSwKICAgICB7InNhdmUiLCIoSSlJIiwgKHZvaWQqKSBTa0NhbnZhc0dsdWU6OnNhdmV9LAogICAgIHsibmF0aXZlX3NhdmVMYXllciIsIihJTGFuZHJvaWQvZ3JhcGhpY3MvUmVjdEY7SUkpSSIsCkBAIC05NDAsMjYgKzkzOSwyNyBAQAogICAgICAgICAodm9pZCopIFNrQ2FudmFzR2x1ZTo6ZHJhd0JpdG1hcFJSfSwKICAgICB7Im5hdGl2ZV9kcmF3Qml0bWFwIiwgIihJW0lJSUZGSUlaSSlWIiwKICAgICAodm9pZCopU2tDYW52YXNHbHVlOjpkcmF3Qml0bWFwQXJyYXl9LAotICAgIAogICAgIHsibmF0aXZlRHJhd0JpdG1hcE1hdHJpeCIsICIoSUlJSSlWIiwKICAgICAgICAgKHZvaWQqKVNrQ2FudmFzR2x1ZTo6ZHJhd0JpdG1hcE1hdHJpeH0sCiAgICAgeyJuYXRpdmVEcmF3Qml0bWFwTWVzaCIsICIoSUlJSVtGSVtJSUkpViIsCiAgICAgICAgICh2b2lkKilTa0NhbnZhc0dsdWU6OmRyYXdCaXRtYXBNZXNofSwKICAgICB7Im5hdGl2ZURyYXdWZXJ0aWNlcyIsICIoSUlJW0ZJW0ZJW0lJW1NJSUkpViIsCiAgICAgICAgICh2b2lkKilTa0NhbnZhc0dsdWU6OmRyYXdWZXJ0aWNlc30sCi0gICAgeyJuYXRpdmVfZHJhd1RleHQiLCIoSVtDSUlGRkkpViIsCi0gICAgICAgICh2b2lkKikgU2tDYW52YXNHbHVlOjpkcmF3VGV4dF9fX0NJSUZGUGFpbnR9LAotICAgIHsibmF0aXZlX2RyYXdUZXh0IiwiKElMamF2YS9sYW5nL1N0cmluZztJSUZGSSlWIiwKLSAgICAgICAgKHZvaWQqKSBTa0NhbnZhc0dsdWU6OmRyYXdUZXh0X19TdHJpbmdJSUZGUGFpbnR9LAotICAgIHsiZHJhd1RleHQiLCIoTGphdmEvbGFuZy9TdHJpbmc7RkZMYW5kcm9pZC9ncmFwaGljcy9QYWludDspViIsCi0gICAgICAgICh2b2lkKikgU2tDYW52YXNHbHVlOjpkcmF3U3RyaW5nfSwKKyAgICB7Im5hdGl2ZV9kcmF3VGV4dCIsIihJW0NJSUZGSUkpViIsCisgICAgICAgICh2b2lkKikgU2tDYW52YXNHbHVlOjpkcmF3VGV4dF9fX0NJSUZGSVBhaW50fSwKKyAgICB7Im5hdGl2ZV9kcmF3VGV4dCIsIihJTGphdmEvbGFuZy9TdHJpbmc7SUlGRklJKVYiLAorICAgICAgICAodm9pZCopIFNrQ2FudmFzR2x1ZTo6ZHJhd1RleHRfX1N0cmluZ0lJRkZJUGFpbnR9LAorICAgIHsibmF0aXZlX2RyYXdUZXh0UnVuIiwiKElbQ0lJSUlGRklJKVYiLAorICAgICAgICAodm9pZCopIFNrQ2FudmFzR2x1ZTo6ZHJhd1RleHRSdW5fX19DSUlJSUZGSVBhaW50fSwKKyAgICB7Im5hdGl2ZV9kcmF3VGV4dFJ1biIsIihJTGphdmEvbGFuZy9TdHJpbmc7SUlJSUZGSUkpViIsCisgICAgICAgICh2b2lkKikgU2tDYW52YXNHbHVlOjpkcmF3VGV4dFJ1bl9fU3RyaW5nSUlJSUZGSVBhaW50fSwKICAgICB7Im5hdGl2ZV9kcmF3UG9zVGV4dCIsIihJW0NJSVtGSSlWIiwKICAgICAgICAgKHZvaWQqKSBTa0NhbnZhc0dsdWU6OmRyYXdQb3NUZXh0X19fQ0lJX0ZQYWludH0sCiAgICAgeyJuYXRpdmVfZHJhd1Bvc1RleHQiLCIoSUxqYXZhL2xhbmcvU3RyaW5nO1tGSSlWIiwKICAgICAgICAgKHZvaWQqKSBTa0NhbnZhc0dsdWU6OmRyYXdQb3NUZXh0X19TdHJpbmdfRlBhaW50fSwKLSAgICB7Im5hdGl2ZV9kcmF3VGV4dE9uUGF0aCIsIihJW0NJSUlGRkkpViIsCisgICAgeyJuYXRpdmVfZHJhd1RleHRPblBhdGgiLCIoSVtDSUlJRkZJSSlWIiwKICAgICAgICAgKHZvaWQqKSBTa0NhbnZhc0dsdWU6OmRyYXdUZXh0T25QYXRoX19fQ0lJUGF0aEZGUGFpbnR9LAotICAgIHsibmF0aXZlX2RyYXdUZXh0T25QYXRoIiwiKElMamF2YS9sYW5nL1N0cmluZztJRkZJKVYiLAorICAgIHsibmF0aXZlX2RyYXdUZXh0T25QYXRoIiwiKElMamF2YS9sYW5nL1N0cmluZztJRkZJSSlWIiwKICAgICAgICAgKHZvaWQqKSBTa0NhbnZhc0dsdWU6OmRyYXdUZXh0T25QYXRoX19TdHJpbmdQYXRoRkZQYWludH0sCiAgICAgeyJuYXRpdmVfZHJhd1BpY3R1cmUiLCAiKElJKVYiLCAodm9pZCopIFNrQ2FudmFzR2x1ZTo6ZHJhd1BpY3R1cmV9LAogCmRpZmYgLS1naXQgYS9jb3JlL2puaS9hbmRyb2lkL2dyYXBoaWNzL0NvbG9yRmlsdGVyLmNwcCBiL2NvcmUvam5pL2FuZHJvaWQvZ3JhcGhpY3MvQ29sb3JGaWx0ZXIuY3BwCmluZGV4IGViZmIyMDkuLmYzYmU4YjAgMTAwNjQ0Ci0tLSBhL2NvcmUvam5pL2FuZHJvaWQvZ3JhcGhpY3MvQ29sb3JGaWx0ZXIuY3BwCisrKyBiL2NvcmUvam5pL2FuZHJvaWQvZ3JhcGhpY3MvQ29sb3JGaWx0ZXIuY3BwCkBAIC0yMywyOCArMjMsNjkgQEAKICNpbmNsdWRlICJTa0NvbG9yTWF0cml4RmlsdGVyLmgiCiAjaW5jbHVkZSAiU2tQb3J0ZXJEdWZmLmgiCiAKKyNpbmNsdWRlIDxTa2lhQ29sb3JGaWx0ZXIuaD4KKwogbmFtZXNwYWNlIGFuZHJvaWQgewogCit1c2luZyBuYW1lc3BhY2UgdWlyZW5kZXJlcjsKKwogY2xhc3MgU2tDb2xvckZpbHRlckdsdWUgewogcHVibGljOgotCi0gICAgc3RhdGljIHZvaWQgZmluYWxpemVyKEpOSUVudiogZW52LCBqb2JqZWN0IGNsYXp6LCBTa0NvbG9yRmlsdGVyKiBvYmopIHsKKyAgICBzdGF0aWMgdm9pZCBmaW5hbGl6ZXIoSk5JRW52KiBlbnYsIGpvYmplY3QgY2xhenosIFNrQ29sb3JGaWx0ZXIqIG9iaiwgU2tpYUNvbG9yRmlsdGVyKiBmKSB7CisgICAgICAgIGRlbGV0ZSBmOwogICAgICAgICBvYmotPnNhZmVVbnJlZigpOwogICAgIH0KIAotICAgIHN0YXRpYyBTa0NvbG9yRmlsdGVyKiBDcmVhdGVQb3J0ZXJEdWZmRmlsdGVyKEpOSUVudiogZW52LCBqb2JqZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGppbnQgc3JjQ29sb3IsIFNrUG9ydGVyRHVmZjo6TW9kZSBtb2RlKSB7Ci0gICAgICAgIHJldHVybiBTa0NvbG9yRmlsdGVyOjpDcmVhdGVNb2RlRmlsdGVyKHNyY0NvbG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNrUG9ydGVyRHVmZjo6VG9YZmVybW9kZU1vZGUobW9kZSkpOworICAgIHN0YXRpYyBTa2lhQ29sb3JGaWx0ZXIqIGdsQ3JlYXRlUG9ydGVyRHVmZkZpbHRlcihKTklFbnYqIGVudiwgam9iamVjdCwgamludCBzcmNDb2xvciwKKyAgICAgICAgICAgIFNrUG9ydGVyRHVmZjo6TW9kZSBtb2RlKSB7CisjaWZkZWYgVVNFX09QRU5HTF9SRU5ERVJFUgorICAgICAgICByZXR1cm4gbmV3IFNraWFCbGVuZEZpbHRlcihzcmNDb2xvciwgU2tQb3J0ZXJEdWZmOjpUb1hmZXJtb2RlTW9kZShtb2RlKSk7CisjZWxzZQorICAgICAgICByZXR1cm4gTlVMTDsKKyNlbmRpZgogICAgIH0KLSAKLSAgICBzdGF0aWMgU2tDb2xvckZpbHRlciogQ3JlYXRlTGlnaHRpbmdGaWx0ZXIoSk5JRW52KiBlbnYsIGpvYmplY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGppbnQgbXVsLCBqaW50IGFkZCkgeworCisgICAgc3RhdGljIFNraWFDb2xvckZpbHRlciogZ2xDcmVhdGVMaWdodGluZ0ZpbHRlcihKTklFbnYqIGVudiwgam9iamVjdCwgamludCBtdWwsIGppbnQgYWRkKSB7CisjaWZkZWYgVVNFX09QRU5HTF9SRU5ERVJFUgorICAgICAgICByZXR1cm4gbmV3IFNraWFMaWdodGluZ0ZpbHRlcihtdWwsIGFkZCk7CisjZWxzZQorICAgICAgICByZXR1cm4gTlVMTDsKKyNlbmRpZgorICAgIH0KKworICAgIHN0YXRpYyBTa2lhQ29sb3JGaWx0ZXIqIGdsQ3JlYXRlQ29sb3JNYXRyaXhGaWx0ZXIoSk5JRW52KiBlbnYsIGpvYmplY3QsIGpmbG9hdEFycmF5IGphcnJheSkgeworI2lmZGVmIFVTRV9PUEVOR0xfUkVOREVSRVIKKyAgICAgICAgQXV0b0phdmFGbG9hdEFycmF5IGF1dG9BcnJheShlbnYsIGphcnJheSwgMjApOworICAgICAgICBjb25zdCBmbG9hdCogc3JjID0gYXV0b0FycmF5LnB0cigpOworCisgICAgICAgIGZsb2F0KiBjb2xvck1hdHJpeCA9IG5ldyBmbG9hdFsxNl07CisgICAgICAgIG1lbWNweShjb2xvck1hdHJpeCwgc3JjLCA0ICogc2l6ZW9mKGZsb2F0KSk7CisgICAgICAgIG1lbWNweSgmY29sb3JNYXRyaXhbNF0sICZzcmNbNV0sIDQgKiBzaXplb2YoZmxvYXQpKTsKKyAgICAgICAgbWVtY3B5KCZjb2xvck1hdHJpeFs4XSwgJnNyY1sxMF0sIDQgKiBzaXplb2YoZmxvYXQpKTsKKyAgICAgICAgbWVtY3B5KCZjb2xvck1hdHJpeFsxMl0sICZzcmNbMTVdLCA0ICogc2l6ZW9mKGZsb2F0KSk7CisKKyAgICAgICAgZmxvYXQqIGNvbG9yVmVjdG9yID0gbmV3IGZsb2F0WzRdOworICAgICAgICBjb2xvclZlY3RvclswXSA9IHNyY1s0XTsKKyAgICAgICAgY29sb3JWZWN0b3JbMV0gPSBzcmNbOV07CisgICAgICAgIGNvbG9yVmVjdG9yWzJdID0gc3JjWzE0XTsKKyAgICAgICAgY29sb3JWZWN0b3JbM10gPSBzcmNbMTldOworCisgICAgICAgIHJldHVybiBuZXcgU2tpYUNvbG9yTWF0cml4RmlsdGVyKGNvbG9yTWF0cml4LCBjb2xvclZlY3Rvcik7CisjZWxzZQorICAgICAgICByZXR1cm4gTlVMTDsKKyNlbmRpZgorICAgIH0KKworICAgIHN0YXRpYyBTa0NvbG9yRmlsdGVyKiBDcmVhdGVQb3J0ZXJEdWZmRmlsdGVyKEpOSUVudiogZW52LCBqb2JqZWN0LCBqaW50IHNyY0NvbG9yLAorICAgICAgICAgICAgU2tQb3J0ZXJEdWZmOjpNb2RlIG1vZGUpIHsKKyAgICAgICAgcmV0dXJuIFNrQ29sb3JGaWx0ZXI6OkNyZWF0ZU1vZGVGaWx0ZXIoc3JjQ29sb3IsIFNrUG9ydGVyRHVmZjo6VG9YZmVybW9kZU1vZGUobW9kZSkpOworICAgIH0KKworICAgIHN0YXRpYyBTa0NvbG9yRmlsdGVyKiBDcmVhdGVMaWdodGluZ0ZpbHRlcihKTklFbnYqIGVudiwgam9iamVjdCwgamludCBtdWwsIGppbnQgYWRkKSB7CiAgICAgICAgIHJldHVybiBTa0NvbG9yRmlsdGVyOjpDcmVhdGVMaWdodGluZ0ZpbHRlcihtdWwsIGFkZCk7CiAgICAgfQotICAgIAotICAgIHN0YXRpYyBTa0NvbG9yRmlsdGVyKiBDcmVhdGVDb2xvck1hdHJpeEZpbHRlcihKTklFbnYqIGVudiwgam9iamVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamZsb2F0QXJyYXkgamFycmF5KSB7CisKKyAgICBzdGF0aWMgU2tDb2xvckZpbHRlciogQ3JlYXRlQ29sb3JNYXRyaXhGaWx0ZXIoSk5JRW52KiBlbnYsIGpvYmplY3QsIGpmbG9hdEFycmF5IGphcnJheSkgewogICAgICAgICBBdXRvSmF2YUZsb2F0QXJyYXkgYXV0b0FycmF5KGVudiwgamFycmF5LCAyMCk7CiAgICAgICAgIGNvbnN0IGZsb2F0KiBzcmMgPSBhdXRvQXJyYXkucHRyKCk7CiAKQEAgLTU4LDI2ICs5OSwyNSBAQAogICAgICAgICByZXR1cm4gbmV3IFNrQ29sb3JNYXRyaXhGaWx0ZXIoc3JjKTsKICNlbmRpZgogICAgIH0KLSAKIH07CiAKIHN0YXRpYyBKTklOYXRpdmVNZXRob2QgY29sb3JmaWx0ZXJfbWV0aG9kc1tdID0gewotICAgIHsiZmluYWxpemVyIiwgIihJKVYiLCAodm9pZCopIFNrQ29sb3JGaWx0ZXJHbHVlOjpmaW5hbGl6ZXJ9CisgICAgeyJmaW5hbGl6ZXIiLCAiKElJKVYiLCAodm9pZCopIFNrQ29sb3JGaWx0ZXJHbHVlOjpmaW5hbGl6ZXJ9CiB9OwogCiBzdGF0aWMgSk5JTmF0aXZlTWV0aG9kIHBvcnRlcmR1ZmZfbWV0aG9kc1tdID0gewotICAgIHsibmF0aXZlX0NyZWF0ZVBvcnRlckR1ZmZGaWx0ZXIiLCIoSUkpSSIsCi0gICAgICAgICh2b2lkKikgU2tDb2xvckZpbHRlckdsdWU6OkNyZWF0ZVBvcnRlckR1ZmZGaWx0ZXJ9CisgICAgeyAibmF0aXZlX0NyZWF0ZVBvcnRlckR1ZmZGaWx0ZXIiLCAiKElJKUkiLCAodm9pZCopIFNrQ29sb3JGaWx0ZXJHbHVlOjpDcmVhdGVQb3J0ZXJEdWZmRmlsdGVyICAgfSwKKyAgICB7ICJuQ3JlYXRlUG9ydGVyRHVmZkZpbHRlciIsICAgICAgICIoSUkpSSIsICh2b2lkKikgU2tDb2xvckZpbHRlckdsdWU6OmdsQ3JlYXRlUG9ydGVyRHVmZkZpbHRlciB9CiB9OwogCiBzdGF0aWMgSk5JTmF0aXZlTWV0aG9kIGxpZ2h0aW5nX21ldGhvZHNbXSA9IHsKLSAgICB7Im5hdGl2ZV9DcmVhdGVMaWdodGluZ0ZpbHRlciIsIihJSSlJIiwKLSAgICAgICAgKHZvaWQqKSBTa0NvbG9yRmlsdGVyR2x1ZTo6Q3JlYXRlTGlnaHRpbmdGaWx0ZXJ9CisgICAgeyAibmF0aXZlX0NyZWF0ZUxpZ2h0aW5nRmlsdGVyIiwgIihJSSlJIiwgKHZvaWQqKSBTa0NvbG9yRmlsdGVyR2x1ZTo6Q3JlYXRlTGlnaHRpbmdGaWx0ZXIgICB9LAorICAgIHsgIm5DcmVhdGVMaWdodGluZ0ZpbHRlciIsICAgICAgICIoSUkpSSIsICh2b2lkKikgU2tDb2xvckZpbHRlckdsdWU6OmdsQ3JlYXRlTGlnaHRpbmdGaWx0ZXIgfSwKIH07CiAKIHN0YXRpYyBKTklOYXRpdmVNZXRob2QgY29sb3JtYXRyaXhfbWV0aG9kc1tdID0gewotICAgIHsibmF0aXZlQ29sb3JNYXRyaXhGaWx0ZXIiLCIoW0YpSSIsCi0gICAgICAgICh2b2lkKikgU2tDb2xvckZpbHRlckdsdWU6OkNyZWF0ZUNvbG9yTWF0cml4RmlsdGVyfQorICAgIHsgIm5hdGl2ZUNvbG9yTWF0cml4RmlsdGVyIiwgIihbRilJIiwgKHZvaWQqKSBTa0NvbG9yRmlsdGVyR2x1ZTo6Q3JlYXRlQ29sb3JNYXRyaXhGaWx0ZXIgICB9LAorICAgIHsgIm5Db2xvck1hdHJpeEZpbHRlciIsICAgICAgIihbRilJIiwgKHZvaWQqKSBTa0NvbG9yRmlsdGVyR2x1ZTo6Z2xDcmVhdGVDb2xvck1hdHJpeEZpbHRlciB9CiB9OwogCiAjZGVmaW5lIFJFRyhlbnYsIG5hbWUsIGFycmF5KSBcCkBAIC04NSw3ICsxMjUsNiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNLX0FSUkFZX0NPVU5UKGFycmF5KSk7ICBcCiAgICAgaWYgKHJlc3VsdCA8IDApIHJldHVybiByZXN1bHQKIAotCiBpbnQgcmVnaXN0ZXJfYW5kcm9pZF9ncmFwaGljc19Db2xvckZpbHRlcihKTklFbnYqIGVudikgewogICAgIGludCByZXN1bHQ7CiAgICAgCmRpZmYgLS1naXQgYS9jb3JlL2puaS9hbmRyb2lkL2dyYXBoaWNzL1BhaW50LmNwcCBiL2NvcmUvam5pL2FuZHJvaWQvZ3JhcGhpY3MvUGFpbnQuY3BwCmluZGV4IDc4MGJhZGMuLmNhOWYzNzEgMTAwNjQ0Ci0tLSBhL2NvcmUvam5pL2FuZHJvaWQvZ3JhcGhpY3MvUGFpbnQuY3BwCisrKyBiL2NvcmUvam5pL2FuZHJvaWQvZ3JhcGhpY3MvUGFpbnQuY3BwCkBAIC0zMSw2ICszMSwxMSBAQAogI2luY2x1ZGUgIlNrU2hhZGVyLmgiCiAjaW5jbHVkZSAiU2tUeXBlZmFjZS5oIgogI2luY2x1ZGUgIlNrWGZlcm1vZGUuaCIKKyNpbmNsdWRlICJ1bmljb2RlL3VzaGFwZS5oIgorI2luY2x1ZGUgIlRleHRMYXlvdXQuaCIKKworLy8gdGVtcG9yYXJ5IGZvciBkZWJ1Z2dpbmcKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCkBAIC01Nyw2ICs2Miw5IEBACiAKIGNsYXNzIFNrUGFpbnRHbHVlIHsKIHB1YmxpYzoKKyAgICBlbnVtIE1vdmVPcHQgeworICAgICAgICBBRlRFUiwgQVRfT1JfQUZURVIsIEJFRk9SRSwgQVRfT1JfQkVGT1JFLCBBVAorICAgIH07CiAKICAgICBzdGF0aWMgdm9pZCBmaW5hbGl6ZXIoSk5JRW52KiBlbnYsIGpvYmplY3QgY2xhenosIFNrUGFpbnQqIG9iaikgewogICAgICAgICBkZWxldGUgb2JqOwpAQCAtMzk1LDIwICs0MDMsMTYxIEBACiAgICAgICAgIGVudi0+UmVsZWFzZVN0cmluZ0NoYXJzKHRleHQsIHRleHRBcnJheSk7CiAgICAgICAgIHJldHVybiBjb3VudDsKICAgICB9Ci0gICAgCi0gICAgc3RhdGljIHZvaWQgZ2V0VGV4dFBhdGhfX19DSUlGRlBhdGgoSk5JRW52KiBlbnYsIGpvYmplY3QgY2xhenosIFNrUGFpbnQqIHBhaW50LCBqY2hhckFycmF5IHRleHQsIGludCBpbmRleCwgaW50IGNvdW50LCBqZmxvYXQgeCwgamZsb2F0IHksIFNrUGF0aCogcGF0aCkgewotICAgICAgICBjb25zdCBqY2hhciogdGV4dEFycmF5ID0gZW52LT5HZXRDaGFyQXJyYXlFbGVtZW50cyh0ZXh0LCBOVUxMKTsKLSAgICAgICAgcGFpbnQtPmdldFRleHRQYXRoKHRleHRBcnJheSArIGluZGV4LCBjb3VudCA8PCAxLCBTa0Zsb2F0VG9TY2FsYXIoeCksIFNrRmxvYXRUb1NjYWxhcih5KSwgcGF0aCk7Ci0gICAgICAgIGVudi0+UmVsZWFzZUNoYXJBcnJheUVsZW1lbnRzKHRleHQsIGNvbnN0X2Nhc3Q8amNoYXIqPih0ZXh0QXJyYXkpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKTklfQUJPUlQpOworCisgICAgc3RhdGljIGpmbG9hdCBkb1RleHRSdW5BZHZhbmNlcyhKTklFbnYgKmVudiwgU2tQYWludCAqcGFpbnQsIGNvbnN0IGpjaGFyICp0ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamludCBzdGFydCwgamludCBjb3VudCwgamludCBjb250ZXh0Q291bnQsIGppbnQgZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqZmxvYXRBcnJheSBhZHZhbmNlcywgamludCBhZHZhbmNlc0luZGV4KSB7CisgICAgICAgIGpmbG9hdCBhZHZhbmNlc0FycmF5W2NvdW50XTsKKyAgICAgICAgamZsb2F0IHRvdGFsQWR2YW5jZTsKKworICAgICAgICBUZXh0TGF5b3V0OjpnZXRUZXh0UnVuQWR2YW5jZXMocGFpbnQsIHRleHQsIHN0YXJ0LCBjb3VudCwgY29udGV4dENvdW50LCBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkdmFuY2VzQXJyYXksIHRvdGFsQWR2YW5jZSk7CisKKyAgICAgICAgaWYgKGFkdmFuY2VzICE9IE5VTEwpIHsKKyAgICAgICAgICAgIGVudi0+U2V0RmxvYXRBcnJheVJlZ2lvbihhZHZhbmNlcywgYWR2YW5jZXNJbmRleCwgY291bnQsIGFkdmFuY2VzQXJyYXkpOworICAgICAgICB9CisgICAgICAgIHJldHVybiB0b3RhbEFkdmFuY2U7CiAgICAgfQotIAotICAgIHN0YXRpYyB2b2lkIGdldFRleHRQYXRoX19TdHJpbmdJSUZGUGF0aChKTklFbnYqIGVudiwgam9iamVjdCBjbGF6eiwgU2tQYWludCogcGFpbnQsIGpzdHJpbmcgdGV4dCwgaW50IHN0YXJ0LCBpbnQgZW5kLCBqZmxvYXQgeCwgamZsb2F0IHksIFNrUGF0aCogcGF0aCkgeworCisgICAgc3RhdGljIGZsb2F0IGdldFRleHRSdW5BZHZhbmNlc19fX0NJSUlJSV9GSShKTklFbnYqIGVudiwgam9iamVjdCBjbGF6eiwgU2tQYWludCogcGFpbnQsCisgICAgICAgICAgICBqY2hhckFycmF5IHRleHQsIGppbnQgaW5kZXgsIGppbnQgY291bnQsIGppbnQgY29udGV4dEluZGV4LCBqaW50IGNvbnRleHRDb3VudCwKKyAgICAgICAgICAgIGppbnQgZmxhZ3MsIGpmbG9hdEFycmF5IGFkdmFuY2VzLCBqaW50IGFkdmFuY2VzSW5kZXgpIHsKKyAgICAgICAgamNoYXIqIHRleHRBcnJheSA9IGVudi0+R2V0Q2hhckFycmF5RWxlbWVudHModGV4dCwgTlVMTCk7CisgICAgICAgIGpmbG9hdCByZXN1bHQgPSBkb1RleHRSdW5BZHZhbmNlcyhlbnYsIHBhaW50LCB0ZXh0QXJyYXkgKyBjb250ZXh0SW5kZXgsCisgICAgICAgICAgICBpbmRleCAtIGNvbnRleHRJbmRleCwgY291bnQsIGNvbnRleHRDb3VudCwgZmxhZ3MsIGFkdmFuY2VzLCBhZHZhbmNlc0luZGV4KTsKKyAgICAgICAgZW52LT5SZWxlYXNlQ2hhckFycmF5RWxlbWVudHModGV4dCwgdGV4dEFycmF5LCBKTklfQUJPUlQpOworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIHN0YXRpYyBmbG9hdCBnZXRUZXh0UnVuQWR2YW5jZXNfX1N0cmluZ0lJSUlJX0ZJKEpOSUVudiogZW52LCBqb2JqZWN0IGNsYXp6LCBTa1BhaW50KiBwYWludCwKKyAgICAgICAgICAgIGpzdHJpbmcgdGV4dCwgamludCBzdGFydCwgamludCBlbmQsIGppbnQgY29udGV4dFN0YXJ0LCBqaW50IGNvbnRleHRFbmQsIGppbnQgZmxhZ3MsCisgICAgICAgICAgICBqZmxvYXRBcnJheSBhZHZhbmNlcywgamludCBhZHZhbmNlc0luZGV4KSB7CiAgICAgICAgIGNvbnN0IGpjaGFyKiB0ZXh0QXJyYXkgPSBlbnYtPkdldFN0cmluZ0NoYXJzKHRleHQsIE5VTEwpOwotICAgICAgICBwYWludC0+Z2V0VGV4dFBhdGgodGV4dEFycmF5ICsgc3RhcnQsIChlbmQgLSBzdGFydCkgPDwgMSwgU2tGbG9hdFRvU2NhbGFyKHgpLCBTa0Zsb2F0VG9TY2FsYXIoeSksIHBhdGgpOworICAgICAgICBqZmxvYXQgcmVzdWx0ID0gZG9UZXh0UnVuQWR2YW5jZXMoZW52LCBwYWludCwgdGV4dEFycmF5ICsgY29udGV4dFN0YXJ0LAorICAgICAgICAgICAgc3RhcnQgLSBjb250ZXh0U3RhcnQsIGVuZCAtIHN0YXJ0LCBjb250ZXh0RW5kIC0gY29udGV4dFN0YXJ0LCBmbGFncywgYWR2YW5jZXMsCisgICAgICAgICAgICBhZHZhbmNlc0luZGV4KTsKKyAgICAgICAgZW52LT5SZWxlYXNlU3RyaW5nQ2hhcnModGV4dCwgdGV4dEFycmF5KTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICBzdGF0aWMgamludCBkb1RleHRSdW5DdXJzb3IoSk5JRW52ICplbnYsIFNrUGFpbnQqIHBhaW50LCBjb25zdCBqY2hhciAqdGV4dCwgamludCBzdGFydCwKKyAgICAgICAgICAgIGppbnQgY291bnQsIGppbnQgZmxhZ3MsIGppbnQgb2Zmc2V0LCBqaW50IG9wdCkgeworICAgICAgICBTa1NjYWxhciBzY2FsYXJBcnJheVtjb3VudF07CisgICAgICAgIGpjaGFyIGJ1ZmZlcltjb3VudF07CisKKyAgICAgICAgLy8gdGhpcyBpcyB3aGVyZSB3ZSdkIGNhbGwgaGFyZmJ1enoKKyAgICAgICAgLy8gZm9yIG5vdyB3ZSBqdXN0IHVzZSB1c2hhcGUuYyBhbmQgd2lkdGhzIHJldHVybmVkIGZyb20gc2tpYQorCisgICAgICAgIGludCB3aWR0aHM7CisgICAgICAgIGlmIChmbGFncyAmIDB4MSkgeyAvLyBydGwsIGNhbGwgYXJhYmljIHNoYXBpbmcgaW4gY2FzZQorICAgICAgICAgICAgVUVycm9yQ29kZSBzdGF0dXMgPSBVX1pFUk9fRVJST1I7CisgICAgICAgICAgICAvLyBVc2UgZml4ZWQgbGVuZ3RoIHNpbmNlIHdlIG5lZWQgdG8ga2VlcCBzdGFydCBhbmQgY291bnQgdmFsaWQKKyAgICAgICAgICAgIHVfc2hhcGVBcmFiaWModGV4dCArIHN0YXJ0LCBjb3VudCwgYnVmZmVyLCBjb3VudCwKKyAgICAgICAgICAgICAgICAgICAgVV9TSEFQRV9MRU5HVEhfRklYRURfU1BBQ0VTX05FQVIgfCBVX1NIQVBFX1RFWFRfRElSRUNUSU9OX0xPR0lDQUwgfAorICAgICAgICAgICAgICAgICAgICBVX1NIQVBFX0xFVFRFUlNfU0hBUEUgfCBVX1NIQVBFX1hfTEFNQUxFRl9TVUJfQUxURVJOQVRFLCAmc3RhdHVzKTsKKyAgICAgICAgICAgIC8vIHdlIHNob3VsZG4ndCBmYWlsIHVubGVzcyB0aGVyZSdzIGFuIG91dCBvZiBtZW1vcnkgY29uZGl0aW9uLAorICAgICAgICAgICAgLy8gaW4gd2hpY2ggY2FzZSB3ZSdyZSBob3NlZCBhbnl3YXkKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7ICsraSkgeworICAgICAgICAgICAgICBpZiAoYnVmZmVyW2ldID09IDB4ZmZmZikgeworICAgICAgICAgICAgICAgIGJ1ZmZlcltpXSA9IDB4MjAwYjsgLy8gemVyby13aWR0aC1zcGFjZSBmb3Igc2tpYQorICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICB3aWR0aHMgPSBwYWludC0+Z2V0VGV4dFdpZHRocyhidWZmZXIsIGNvdW50IDw8IDEsIHNjYWxhckFycmF5KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHdpZHRocyA9IHBhaW50LT5nZXRUZXh0V2lkdGhzKHRleHQgKyBzdGFydCwgY291bnQgPDwgMSwgc2NhbGFyQXJyYXkpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHdpZHRocyA8IGNvdW50KSB7CisgICAgICAgICAgICAvLyBTa2lhIG9wZXJhdGVzIG9uIGNvZGUgcG9pbnRzLCBub3QgY29kZSB1bml0cywgc28gc3Vycm9nYXRlIHBhaXJzIHJldHVybiBvbmx5IG9uZQorICAgICAgICAgICAgLy8gdmFsdWUuIEV4cGFuZCB0aGUgcmVzdWx0IHNvIHdlIGhhdmUgb25lIHZhbHVlIHBlciBVVEYtMTYgY29kZSB1bml0LgorCisgICAgICAgICAgICAvLyBOb3RlLCBza2lhJ3MgZ2V0VGV4dFdpZHRoIGdldHMgY29uZnVzZWQgaWYgaXQgZW5jb3VudGVycyBhIHN1cnJvZ2F0ZSBwYWlyLAorICAgICAgICAgICAgLy8gbGVhdmluZyB0aGUgcmVtYWluaW5nIHdpZHRocyB6ZXJvLiAgTm90IG5pY2UuCisgICAgICAgICAgICBjb25zdCBqY2hhciAqY2hhcnMgPSB0ZXh0ICsgc3RhcnQ7CisgICAgICAgICAgICBmb3IgKGludCBpID0gY291bnQsIHAgPSB3aWR0aHMgLSAxOyAtLWkgPiBwOykgeworICAgICAgICAgICAgICAgIGlmIChjaGFyc1tpXSA+PSAweGRjMDAgJiYgY2hhcnNbaV0gPCAweGUwMDAgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgIGNoYXJzW2ktMV0gPj0gMHhkODAwICYmIGNoYXJzW2ktMV0gPCAweGRjMDApIHsKKyAgICAgICAgICAgICAgICAgICAgc2NhbGFyQXJyYXlbaV0gPSAwOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICBzY2FsYXJBcnJheVtpXSA9IHNjYWxhckFycmF5Wy0tcF07CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgamludCBwb3MgPSBvZmZzZXQgLSBzdGFydDsKKyAgICAgICAgc3dpdGNoIChvcHQpIHsKKyAgICAgICAgY2FzZSBBRlRFUjoKKyAgICAgICAgICBpZiAocG9zIDwgY291bnQpIHsKKyAgICAgICAgICAgIHBvcyArPSAxOworICAgICAgICAgIH0KKyAgICAgICAgICAvLyBmYWxsIHRocm91Z2gKKyAgICAgICAgY2FzZSBBVF9PUl9BRlRFUjoKKyAgICAgICAgICB3aGlsZSAocG9zIDwgY291bnQgJiYgc2NhbGFyQXJyYXlbcG9zXSA9PSAwKSB7CisgICAgICAgICAgICArK3BvczsKKyAgICAgICAgICB9CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkVGT1JFOgorICAgICAgICAgIGlmIChwb3MgPiAwKSB7CisgICAgICAgICAgICAtLXBvczsKKyAgICAgICAgICB9CisgICAgICAgICAgLy8gZmFsbCB0aHJvdWdoCisgICAgICAgIGNhc2UgQVRfT1JfQkVGT1JFOgorICAgICAgICAgIHdoaWxlIChwb3MgPiAwICYmIHNjYWxhckFycmF5W3Bvc10gPT0gMCkgeworICAgICAgICAgICAgLS1wb3M7CisgICAgICAgICAgfQorICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEFUOgorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgIGlmIChzY2FsYXJBcnJheVtwb3NdID09IDApIHsKKyAgICAgICAgICAgIHBvcyA9IC0xOworICAgICAgICAgIH0KKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChwb3MgIT0gLTEpIHsKKyAgICAgICAgICBwb3MgKz0gc3RhcnQ7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gcG9zOworICAgIH0KKworICAgIHN0YXRpYyBqaW50IGdldFRleHRSdW5DdXJzb3JfX19DKEpOSUVudiogZW52LCBqb2JqZWN0IGNsYXp6LCBTa1BhaW50KiBwYWludCwgamNoYXJBcnJheSB0ZXh0LAorICAgICAgICAgICAgamludCBjb250ZXh0U3RhcnQsIGppbnQgY29udGV4dENvdW50LCBqaW50IGZsYWdzLCBqaW50IG9mZnNldCwgamludCBjdXJzb3JPcHQpIHsKKyAgICAgICAgamNoYXIqIHRleHRBcnJheSA9IGVudi0+R2V0Q2hhckFycmF5RWxlbWVudHModGV4dCwgTlVMTCk7CisgICAgICAgIGppbnQgcmVzdWx0ID0gZG9UZXh0UnVuQ3Vyc29yKGVudiwgcGFpbnQsIHRleHRBcnJheSwgY29udGV4dFN0YXJ0LCBjb250ZXh0Q291bnQsIGZsYWdzLAorICAgICAgICAgICAgICAgIG9mZnNldCwgY3Vyc29yT3B0KTsKKyAgICAgICAgZW52LT5SZWxlYXNlQ2hhckFycmF5RWxlbWVudHModGV4dCwgdGV4dEFycmF5LCBKTklfQUJPUlQpOworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIHN0YXRpYyBqaW50IGdldFRleHRSdW5DdXJzb3JfX1N0cmluZyhKTklFbnYqIGVudiwgam9iamVjdCBjbGF6eiwgU2tQYWludCogcGFpbnQsIGpzdHJpbmcgdGV4dCwKKyAgICAgICAgICAgIGppbnQgY29udGV4dFN0YXJ0LCBqaW50IGNvbnRleHRFbmQsIGppbnQgZmxhZ3MsIGppbnQgb2Zmc2V0LCBqaW50IGN1cnNvck9wdCkgeworICAgICAgICBjb25zdCBqY2hhciogdGV4dEFycmF5ID0gZW52LT5HZXRTdHJpbmdDaGFycyh0ZXh0LCBOVUxMKTsKKyAgICAgICAgamludCByZXN1bHQgPSBkb1RleHRSdW5DdXJzb3IoZW52LCBwYWludCwgdGV4dEFycmF5LCBjb250ZXh0U3RhcnQsCisgICAgICAgICAgICAgICAgY29udGV4dEVuZCAtIGNvbnRleHRTdGFydCwgZmxhZ3MsIG9mZnNldCwgY3Vyc29yT3B0KTsKKyAgICAgICAgZW52LT5SZWxlYXNlU3RyaW5nQ2hhcnModGV4dCwgdGV4dEFycmF5KTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICBzdGF0aWMgdm9pZCBnZXRUZXh0UGF0aChKTklFbnYqIGVudiwgU2tQYWludCogcGFpbnQsIGNvbnN0IGpjaGFyKiB0ZXh0LCBqaW50IGNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGppbnQgYmlkaUZsYWdzLCBqZmxvYXQgeCwgamZsb2F0IHksIFNrUGF0aCAqcGF0aCkgeworICAgICAgICBUZXh0TGF5b3V0OjpnZXRUZXh0UGF0aChwYWludCwgdGV4dCwgY291bnQsIGJpZGlGbGFncywgeCwgeSwgcGF0aCk7CisgICAgfQorCisgICAgc3RhdGljIHZvaWQgZ2V0VGV4dFBhdGhfX19DKEpOSUVudiogZW52LCBqb2JqZWN0IGNsYXp6LCBTa1BhaW50KiBwYWludCwgamludCBiaWRpRmxhZ3MsCisgICAgICAgICAgICBqY2hhckFycmF5IHRleHQsIGludCBpbmRleCwgaW50IGNvdW50LCBqZmxvYXQgeCwgamZsb2F0IHksIFNrUGF0aCogcGF0aCkgeworICAgICAgICBjb25zdCBqY2hhciogdGV4dEFycmF5ID0gZW52LT5HZXRDaGFyQXJyYXlFbGVtZW50cyh0ZXh0LCBOVUxMKTsKKyAgICAgICAgZ2V0VGV4dFBhdGgoZW52LCBwYWludCwgdGV4dEFycmF5ICsgaW5kZXgsIGNvdW50LCBiaWRpRmxhZ3MsIHgsIHksIHBhdGgpOworICAgICAgICBlbnYtPlJlbGVhc2VDaGFyQXJyYXlFbGVtZW50cyh0ZXh0LCBjb25zdF9jYXN0PGpjaGFyKj4odGV4dEFycmF5KSwgSk5JX0FCT1JUKTsKKyAgICB9CisKKyAgICBzdGF0aWMgdm9pZCBnZXRUZXh0UGF0aF9fU3RyaW5nKEpOSUVudiogZW52LCBqb2JqZWN0IGNsYXp6LCBTa1BhaW50KiBwYWludCwgamludCBiaWRpRmxhZ3MsCisgICAgICAgICAgICBqc3RyaW5nIHRleHQsIGludCBzdGFydCwgaW50IGVuZCwgamZsb2F0IHgsIGpmbG9hdCB5LCBTa1BhdGgqIHBhdGgpIHsKKyAgICAgICAgY29uc3QgamNoYXIqIHRleHRBcnJheSA9IGVudi0+R2V0U3RyaW5nQ2hhcnModGV4dCwgTlVMTCk7CisgICAgICAgIGdldFRleHRQYXRoKGVudiwgcGFpbnQsIHRleHRBcnJheSArIHN0YXJ0LCBlbmQgLSBzdGFydCwgYmlkaUZsYWdzLCB4LCB5LCBwYXRoKTsKICAgICAgICAgZW52LT5SZWxlYXNlU3RyaW5nQ2hhcnModGV4dCwgdGV4dEFycmF5KTsKICAgICB9Ci0gCisKICAgICBzdGF0aWMgdm9pZCBzZXRTaGFkb3dMYXllcihKTklFbnYqIGVudiwgam9iamVjdCBqcGFpbnQsIGpmbG9hdCByYWRpdXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamZsb2F0IGR4LCBqZmxvYXQgZHksIGludCBjb2xvcikgewogICAgICAgICBOUEVfQ0hFQ0tfUkVUVVJOX1ZPSUQoZW52LCBqcGFpbnQpOwpAQCAtNTc2LDEzICs3MjUsMjAgQEAKICAgICB7Im5hdGl2ZV9icmVha1RleHQiLCIoTGphdmEvbGFuZy9TdHJpbmc7WkZbRilJIiwgKHZvaWQqKSBTa1BhaW50R2x1ZTo6YnJlYWtUZXh0U30sCiAgICAgeyJuYXRpdmVfZ2V0VGV4dFdpZHRocyIsIihJW0NJSVtGKUkiLCAodm9pZCopIFNrUGFpbnRHbHVlOjpnZXRUZXh0V2lkdGhzX19fQ0lJX0Z9LAogICAgIHsibmF0aXZlX2dldFRleHRXaWR0aHMiLCIoSUxqYXZhL2xhbmcvU3RyaW5nO0lJW0YpSSIsICh2b2lkKikgU2tQYWludEdsdWU6OmdldFRleHRXaWR0aHNfX1N0cmluZ0lJX0Z9LAotICAgIHsibmF0aXZlX2dldFRleHRQYXRoIiwiKElbQ0lJRkZJKVYiLCAodm9pZCopIFNrUGFpbnRHbHVlOjpnZXRUZXh0UGF0aF9fX0NJSUZGUGF0aH0sCi0gICAgeyJuYXRpdmVfZ2V0VGV4dFBhdGgiLCIoSUxqYXZhL2xhbmcvU3RyaW5nO0lJRkZJKVYiLCAodm9pZCopIFNrUGFpbnRHbHVlOjpnZXRUZXh0UGF0aF9fU3RyaW5nSUlGRlBhdGh9LAorICAgIHsibmF0aXZlX2dldFRleHRSdW5BZHZhbmNlcyIsIihJW0NJSUlJSVtGSSlGIiwgKHZvaWQqKQorICAgICAgICBTa1BhaW50R2x1ZTo6Z2V0VGV4dFJ1bkFkdmFuY2VzX19fQ0lJSUlJX0ZJfSwKKyAgICB7Im5hdGl2ZV9nZXRUZXh0UnVuQWR2YW5jZXMiLCIoSUxqYXZhL2xhbmcvU3RyaW5nO0lJSUlJW0ZJKUYiLAorICAgICAgICAodm9pZCopIFNrUGFpbnRHbHVlOjpnZXRUZXh0UnVuQWR2YW5jZXNfX1N0cmluZ0lJSUlJX0ZJfSwKKyAgICB7Im5hdGl2ZV9nZXRUZXh0UnVuQ3Vyc29yIiwgIihJW0NJSUlJSSlJIiwgKHZvaWQqKSBTa1BhaW50R2x1ZTo6Z2V0VGV4dFJ1bkN1cnNvcl9fX0N9LAorICAgIHsibmF0aXZlX2dldFRleHRSdW5DdXJzb3IiLCAiKElMamF2YS9sYW5nL1N0cmluZztJSUlJSSlJIiwKKyAgICAgICAgKHZvaWQqKSBTa1BhaW50R2x1ZTo6Z2V0VGV4dFJ1bkN1cnNvcl9fU3RyaW5nfSwKKyAgICB7Im5hdGl2ZV9nZXRUZXh0UGF0aCIsIihJSVtDSUlGRkkpViIsICh2b2lkKikgU2tQYWludEdsdWU6OmdldFRleHRQYXRoX19fQ30sCisgICAgeyJuYXRpdmVfZ2V0VGV4dFBhdGgiLCIoSUlMamF2YS9sYW5nL1N0cmluZztJSUZGSSlWIiwgKHZvaWQqKSBTa1BhaW50R2x1ZTo6Z2V0VGV4dFBhdGhfX1N0cmluZ30sCiAgICAgeyJuYXRpdmVHZXRTdHJpbmdCb3VuZHMiLCAiKElMamF2YS9sYW5nL1N0cmluZztJSUxhbmRyb2lkL2dyYXBoaWNzL1JlY3Q7KVYiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKikgU2tQYWludEdsdWU6OmdldFN0cmluZ0JvdW5kcyB9LAogICAgIHsibmF0aXZlR2V0Q2hhckFycmF5Qm91bmRzIiwgIihJW0NJSUxhbmRyb2lkL2dyYXBoaWNzL1JlY3Q7KVYiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKSBTa1BhaW50R2x1ZTo6Z2V0Q2hhckFycmF5Qm91bmRzIH0sCi0gICAgeyJzZXRTaGFkb3dMYXllciIsICIoRkZGSSlWIiwgKHZvaWQqKVNrUGFpbnRHbHVlOjpzZXRTaGFkb3dMYXllcn0KKyAgICB7Im5TZXRTaGFkb3dMYXllciIsICIoRkZGSSlWIiwgKHZvaWQqKVNrUGFpbnRHbHVlOjpzZXRTaGFkb3dMYXllcn0KIH07CiAKIHN0YXRpYyBqZmllbGRJRCByZXFfZmllbGRJRChqZmllbGRJRCBpZCkgewpkaWZmIC0tZ2l0IGEvY29yZS9qbmkvYW5kcm9pZC9ncmFwaGljcy9QYXRoLmNwcCBiL2NvcmUvam5pL2FuZHJvaWQvZ3JhcGhpY3MvUGF0aC5jcHAKaW5kZXggYjhiMmExMC4uYWJlMzNmNCAxMDA2NDQKLS0tIGEvY29yZS9qbmkvYW5kcm9pZC9ncmFwaGljcy9QYXRoLmNwcAorKysgYi9jb3JlL2puaS9hbmRyb2lkL2dyYXBoaWNzL1BhdGguY3BwCkBAIC0yNiwxMiArMjYsMTkgQEAKIAogI2luY2x1ZGUgIlNrUGF0aC5oIgogCisjaW5jbHVkZSA8Q2FjaGVzLmg+CisKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogY2xhc3MgU2tQYXRoR2x1ZSB7CiBwdWJsaWM6CiAKICAgICBzdGF0aWMgdm9pZCBmaW5hbGl6ZXIoSk5JRW52KiBlbnYsIGpvYmplY3QgY2xhenosIFNrUGF0aCogb2JqKSB7CisjaWZkZWYgVVNFX09QRU5HTF9SRU5ERVJFUgorICAgICAgICBpZiAoYW5kcm9pZDo6dWlyZW5kZXJlcjo6Q2FjaGVzOjpoYXNJbnN0YW5jZSgpKSB7CisgICAgICAgICAgICBhbmRyb2lkOjp1aXJlbmRlcmVyOjpDYWNoZXM6OmdldEluc3RhbmNlKCkucGF0aENhY2hlLnJlbW92ZShvYmopOworICAgICAgICB9CisjZW5kaWYKICAgICAgICAgZGVsZXRlIG9iajsKICAgICB9CiAKZGlmZiAtLWdpdCBhL2NvcmUvam5pL2FuZHJvaWQvZ3JhcGhpY3MvU2hhZGVyLmNwcCBiL2NvcmUvam5pL2FuZHJvaWQvZ3JhcGhpY3MvU2hhZGVyLmNwcAppbmRleCBiMDljNjJiLi45MjAyNDI5IDEwMDY0NAotLS0gYS9jb3JlL2puaS9hbmRyb2lkL2dyYXBoaWNzL1NoYWRlci5jcHAKKysrIGIvY29yZS9qbmkvYW5kcm9pZC9ncmFwaGljcy9TaGFkZXIuY3BwCkBAIC04LDYgKzgsMTYgQEAKICNpbmNsdWRlICJTa1RlbXBsYXRlcy5oIgogI2luY2x1ZGUgIlNrWGZlcm1vZGUuaCIKIAorI2luY2x1ZGUgPFNraWFTaGFkZXIuaD4KKyNpbmNsdWRlIDxDYWNoZXMuaD4KKwordXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ6OnVpcmVuZGVyZXI7CisKK3N0YXRpYyBzdHJ1Y3QgeworICAgIGpjbGFzcyBjbGF6ejsKKyAgICBqZmllbGRJRCBzaGFkZXI7Cit9IGdTaGFkZXJDbGFzc0luZm87CisKIHN0YXRpYyB2b2lkIFRocm93SUFFX0lmTnVsbChKTklFbnYqIGVudiwgdm9pZCogcHRyKSB7CiAgICAgaWYgKE5VTEwgPT0gcHRyKSB7CiAgICAgICAgIGRvVGhyb3dJQUUoZW52KTsKQEAgLTQxLDggKzUxLDE0IEBACiAKIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAKLXN0YXRpYyB2b2lkIFNoYWRlcl9kZXN0cnVjdG9yKEpOSUVudiogZW52LCBqb2JqZWN0LCBTa1NoYWRlciogc2hhZGVyKQorc3RhdGljIHZvaWQgU2hhZGVyX2Rlc3RydWN0b3IoSk5JRW52KiBlbnYsIGpvYmplY3QgbywgU2tTaGFkZXIqIHNoYWRlciwgU2tpYVNoYWRlciogc2tpYVNoYWRlcikKIHsKKyNpZmRlZiBVU0VfT1BFTkdMX1JFTkRFUkVSCisgICAgaWYgKGFuZHJvaWQ6OnVpcmVuZGVyZXI6OkNhY2hlczo6aGFzSW5zdGFuY2UoKSkgeworICAgICAgICBhbmRyb2lkOjp1aXJlbmRlcmVyOjpDYWNoZXM6OmdldEluc3RhbmNlKCkuZ3JhZGllbnRDYWNoZS5yZW1vdmUoc2hhZGVyKTsKKyAgICB9CisjZW5kaWYKKyAgICBkZWxldGUgc2tpYVNoYWRlcjsKICAgICBzaGFkZXItPnNhZmVVbnJlZigpOwogfQogCkBAIC01MSw3ICs2Nyw4IEBACiAgICAgcmV0dXJuIHNoYWRlciA/IHNoYWRlci0+Z2V0TG9jYWxNYXRyaXgobWF0cml4KSA6IGZhbHNlOwogfQogIAotc3RhdGljIHZvaWQgU2hhZGVyX3NldExvY2FsTWF0cml4KEpOSUVudiogZW52LCBqb2JqZWN0LCBTa1NoYWRlciogc2hhZGVyLCBjb25zdCBTa01hdHJpeCogbWF0cml4KQorc3RhdGljIHZvaWQgU2hhZGVyX3NldExvY2FsTWF0cml4KEpOSUVudiogZW52LCBqb2JqZWN0IG8sIFNrU2hhZGVyKiBzaGFkZXIsIFNraWFTaGFkZXIqIHNraWFTaGFkZXIsCisgICAgICAgIGNvbnN0IFNrTWF0cml4KiBtYXRyaXgpCiB7CiAgICAgaWYgKHNoYWRlcikgewogICAgICAgICBpZiAoTlVMTCA9PSBtYXRyaXgpIHsKQEAgLTYwLDI0ICs3Nyw0MCBAQAogICAgICAgICBlbHNlIHsKICAgICAgICAgICAgIHNoYWRlci0+c2V0TG9jYWxNYXRyaXgoKm1hdHJpeCk7CiAgICAgICAgIH0KKyNpZmRlZiBVU0VfT1BFTkdMX1JFTkRFUkVSCisgICAgICAgIHNraWFTaGFkZXItPnNldE1hdHJpeChjb25zdF9jYXN0PFNrTWF0cml4Kj4obWF0cml4KSk7CisjZW5kaWYKICAgICB9CiB9CiAKIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAKLXN0YXRpYyBTa1NoYWRlciogQml0bWFwU2hhZGVyX2NvbnN0cnVjdG9yKEpOSUVudiogZW52LCBqb2JqZWN0LCBjb25zdCBTa0JpdG1hcCogYml0bWFwLAorc3RhdGljIFNrU2hhZGVyKiBCaXRtYXBTaGFkZXJfY29uc3RydWN0b3IoSk5JRW52KiBlbnYsIGpvYmplY3QgbywgY29uc3QgU2tCaXRtYXAqIGJpdG1hcCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB0aWxlTW9kZVgsIGludCB0aWxlTW9kZVkpCiB7CiAgICAgU2tTaGFkZXIqIHMgPSBTa1NoYWRlcjo6Q3JlYXRlQml0bWFwU2hhZGVyKCpiaXRtYXAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFNrU2hhZGVyOjpUaWxlTW9kZSl0aWxlTW9kZVgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFNrU2hhZGVyOjpUaWxlTW9kZSl0aWxlTW9kZVkpOworCiAgICAgVGhyb3dJQUVfSWZOdWxsKGVudiwgcyk7CiAgICAgcmV0dXJuIHM7CiB9CisKK3N0YXRpYyBTa2lhU2hhZGVyKiBCaXRtYXBTaGFkZXJfcG9zdENvbnN0cnVjdG9yKEpOSUVudiogZW52LCBqb2JqZWN0IG8sIFNrU2hhZGVyKiBzaGFkZXIsCisgICAgICAgIFNrQml0bWFwKiBiaXRtYXAsIGludCB0aWxlTW9kZVgsIGludCB0aWxlTW9kZVkpIHsKKyNpZmRlZiBVU0VfT1BFTkdMX1JFTkRFUkVSCisgICAgU2tpYVNoYWRlciogc2tpYVNoYWRlciA9IG5ldyBTa2lhQml0bWFwU2hhZGVyKGJpdG1hcCwgc2hhZGVyLAorICAgICAgICAgICAgc3RhdGljX2Nhc3Q8U2tTaGFkZXI6OlRpbGVNb2RlPih0aWxlTW9kZVgpLCBzdGF0aWNfY2FzdDxTa1NoYWRlcjo6VGlsZU1vZGU+KHRpbGVNb2RlWSksCisgICAgICAgICAgICBOVUxMLCAoc2hhZGVyLT5nZXRGbGFncygpICYgU2tTaGFkZXI6OmtPcGFxdWVBbHBoYV9GbGFnKSA9PSAwKTsKKyAgICByZXR1cm4gc2tpYVNoYWRlcjsKKyNlbHNlCisgICAgcmV0dXJuIE5VTEw7CisjZW5kaWYKK30KICAgICAKIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAKLXN0YXRpYyBTa1NoYWRlciogTGluZWFyR3JhZGllbnRfY3JlYXRlMShKTklFbnYqIGVudiwgam9iamVjdCwKK3N0YXRpYyBTa1NoYWRlciogTGluZWFyR3JhZGllbnRfY3JlYXRlMShKTklFbnYqIGVudiwgam9iamVjdCBvLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHgwLCBmbG9hdCB5MCwgZmxvYXQgeDEsIGZsb2F0IHkxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGppbnRBcnJheSBjb2xvckFycmF5LCBqZmxvYXRBcnJheSBwb3NBcnJheSwgaW50IHRpbGVNb2RlKQogewpAQCAtODUsMzEgKzExOCw5NSBAQAogICAgIHB0c1swXS5zZXQoU2tGbG9hdFRvU2NhbGFyKHgwKSwgU2tGbG9hdFRvU2NhbGFyKHkwKSk7CiAgICAgcHRzWzFdLnNldChTa0Zsb2F0VG9TY2FsYXIoeDEpLCBTa0Zsb2F0VG9TY2FsYXIoeTEpKTsKIAotICAgIHNpemVfdCAgICAgIGNvdW50ID0gZW52LT5HZXRBcnJheUxlbmd0aChjb2xvckFycmF5KTsKKyAgICBzaXplX3QgY291bnQgPSBlbnYtPkdldEFycmF5TGVuZ3RoKGNvbG9yQXJyYXkpOwogICAgIGNvbnN0IGppbnQqIGNvbG9yVmFsdWVzID0gZW52LT5HZXRJbnRBcnJheUVsZW1lbnRzKGNvbG9yQXJyYXksIE5VTEwpOwogCiAgICAgU2tBdXRvU1RNYWxsb2M8OCwgU2tTY2FsYXI+IHN0b3JhZ2UocG9zQXJyYXkgPyBjb3VudCA6IDApOwogICAgIFNrU2NhbGFyKiAgICAgICAgICAgICAgICAgICBwb3MgPSBOVUxMOwotICAgIAorCiAgICAgaWYgKHBvc0FycmF5KSB7CiAgICAgICAgIEF1dG9KYXZhRmxvYXRBcnJheSBhdXRvUG9zKGVudiwgcG9zQXJyYXksIGNvdW50KTsKICAgICAgICAgY29uc3QgZmxvYXQqIHBvc1ZhbHVlcyA9IGF1dG9Qb3MucHRyKCk7CiAgICAgICAgIHBvcyA9IChTa1NjYWxhciopc3RvcmFnZS5nZXQoKTsKLSAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBjb3VudDsgaSsrKQorICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKICAgICAgICAgICAgIHBvc1tpXSA9IFNrRmxvYXRUb1NjYWxhcihwb3NWYWx1ZXNbaV0pOworICAgICAgICB9CiAgICAgfQotCisgICAgCiAgICAgU2tTaGFkZXIqIHNoYWRlciA9IFNrR3JhZGllbnRTaGFkZXI6OkNyZWF0ZUxpbmVhcihwdHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgU2tDb2xvcio+KGNvbG9yVmFsdWVzKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zLCBjb3VudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8U2tTaGFkZXI6OlRpbGVNb2RlPih0aWxlTW9kZSkpOwotICAgIGVudi0+UmVsZWFzZUludEFycmF5RWxlbWVudHMoY29sb3JBcnJheSwgY29uc3RfY2FzdDxqaW50Kj4oY29sb3JWYWx1ZXMpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSk5JX0FCT1JUKTsKKworICAgIGVudi0+UmVsZWFzZUludEFycmF5RWxlbWVudHMoY29sb3JBcnJheSwgY29uc3RfY2FzdDxqaW50Kj4oY29sb3JWYWx1ZXMpLCBKTklfQUJPUlQpOwogICAgIFRocm93SUFFX0lmTnVsbChlbnYsIHNoYWRlcik7CiAgICAgcmV0dXJuIHNoYWRlcjsKIH0KIAotc3RhdGljIFNrU2hhZGVyKiBMaW5lYXJHcmFkaWVudF9jcmVhdGUyKEpOSUVudiogZW52LCBqb2JqZWN0LAorc3RhdGljIFNraWFTaGFkZXIqIExpbmVhckdyYWRpZW50X3Bvc3RDcmVhdGUxKEpOSUVudiogZW52LCBqb2JqZWN0IG8sIFNrU2hhZGVyKiBzaGFkZXIsCisgICAgICAgIGZsb2F0IHgwLCBmbG9hdCB5MCwgZmxvYXQgeDEsIGZsb2F0IHkxLCBqaW50QXJyYXkgY29sb3JBcnJheSwKKyAgICAgICAgamZsb2F0QXJyYXkgcG9zQXJyYXksIGludCB0aWxlTW9kZSkgeworI2lmZGVmIFVTRV9PUEVOR0xfUkVOREVSRVIKKyAgICBzaXplX3QgY291bnQgPSBlbnYtPkdldEFycmF5TGVuZ3RoKGNvbG9yQXJyYXkpOworICAgIGNvbnN0IGppbnQqIGNvbG9yVmFsdWVzID0gZW52LT5HZXRJbnRBcnJheUVsZW1lbnRzKGNvbG9yQXJyYXksIE5VTEwpOworCisgICAgamZsb2F0KiBzdG9yZWRCb3VuZHMgPSBuZXcgamZsb2F0WzRdOworICAgIHN0b3JlZEJvdW5kc1swXSA9IHgwOyBzdG9yZWRCb3VuZHNbMV0gPSB5MDsKKyAgICBzdG9yZWRCb3VuZHNbMl0gPSB4MTsgc3RvcmVkQm91bmRzWzNdID0geTE7CisgICAgamZsb2F0KiBzdG9yZWRQb3NpdGlvbnMgPSBuZXcgamZsb2F0W2NvdW50XTsKKyAgICB1aW50MzJfdCogc3RvcmVkQ29sb3JzID0gbmV3IHVpbnQzMl90W2NvdW50XTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKyAgICAgICAgc3RvcmVkQ29sb3JzW2ldID0gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KGNvbG9yVmFsdWVzW2ldKTsKKyAgICB9CisKKyAgICBpZiAocG9zQXJyYXkpIHsKKyAgICAgICAgQXV0b0phdmFGbG9hdEFycmF5IGF1dG9Qb3MoZW52LCBwb3NBcnJheSwgY291bnQpOworICAgICAgICBjb25zdCBmbG9hdCogcG9zVmFsdWVzID0gYXV0b1Bvcy5wdHIoKTsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisgICAgICAgICAgICBzdG9yZWRQb3NpdGlvbnNbaV0gPSBwb3NWYWx1ZXNbaV07CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBzdG9yZWRQb3NpdGlvbnNbMF0gPSAwLjBmOworICAgICAgICBzdG9yZWRQb3NpdGlvbnNbMV0gPSAxLjBmOworICAgIH0KKworICAgIFNraWFTaGFkZXIqIHNraWFTaGFkZXIgPSBuZXcgU2tpYUxpbmVhckdyYWRpZW50U2hhZGVyKHN0b3JlZEJvdW5kcywgc3RvcmVkQ29sb3JzLAorICAgICAgICAgICAgc3RvcmVkUG9zaXRpb25zLCBjb3VudCwgc2hhZGVyLCBzdGF0aWNfY2FzdDxTa1NoYWRlcjo6VGlsZU1vZGU+KHRpbGVNb2RlKSwgTlVMTCwKKyAgICAgICAgICAgIChzaGFkZXItPmdldEZsYWdzKCkgJiBTa1NoYWRlcjo6a09wYXF1ZUFscGhhX0ZsYWcpID09IDApOworCisgICAgZW52LT5SZWxlYXNlSW50QXJyYXlFbGVtZW50cyhjb2xvckFycmF5LCBjb25zdF9jYXN0PGppbnQqPihjb2xvclZhbHVlcyksIEpOSV9BQk9SVCk7CisgICAgcmV0dXJuIHNraWFTaGFkZXI7CisjZWxzZQorICAgIHJldHVybiBOVUxMOworI2VuZGlmCit9CisKK3N0YXRpYyBTa2lhU2hhZGVyKiBMaW5lYXJHcmFkaWVudF9wb3N0Q3JlYXRlMihKTklFbnYqIGVudiwgam9iamVjdCBvLCBTa1NoYWRlciogc2hhZGVyLAorICAgICAgICBmbG9hdCB4MCwgZmxvYXQgeTAsIGZsb2F0IHgxLCBmbG9hdCB5MSwgaW50IGNvbG9yMCwgaW50IGNvbG9yMSwgaW50IHRpbGVNb2RlKSB7CisjaWZkZWYgVVNFX09QRU5HTF9SRU5ERVJFUgorICAgIGZsb2F0KiBzdG9yZWRCb3VuZHMgPSBuZXcgZmxvYXRbNF07CisgICAgc3RvcmVkQm91bmRzWzBdID0geDA7IHN0b3JlZEJvdW5kc1sxXSA9IHkwOworICAgIHN0b3JlZEJvdW5kc1syXSA9IHgxOyBzdG9yZWRCb3VuZHNbM10gPSB5MTsKKworICAgIGZsb2F0KiBzdG9yZWRQb3NpdGlvbnMgPSBuZXcgZmxvYXRbMl07CisgICAgc3RvcmVkUG9zaXRpb25zWzBdID0gMC4wZjsKKyAgICBzdG9yZWRQb3NpdGlvbnNbMV0gPSAxLjBmOworCisgICAgdWludDMyX3QqIHN0b3JlZENvbG9ycyA9IG5ldyB1aW50MzJfdFsyXTsKKyAgICBzdG9yZWRDb2xvcnNbMF0gPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4oY29sb3IwKTsKKyAgICBzdG9yZWRDb2xvcnNbMV0gPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4oY29sb3IxKTsKKworICAgIFNraWFTaGFkZXIqIHNraWFTaGFkZXIgPSBuZXcgU2tpYUxpbmVhckdyYWRpZW50U2hhZGVyKHN0b3JlZEJvdW5kcywgc3RvcmVkQ29sb3JzLAorICAgICAgICAgICAgc3RvcmVkUG9zaXRpb25zLCAyLCBzaGFkZXIsIHN0YXRpY19jYXN0PFNrU2hhZGVyOjpUaWxlTW9kZT4odGlsZU1vZGUpLCBOVUxMLAorICAgICAgICAgICAgKHNoYWRlci0+Z2V0RmxhZ3MoKSAmIFNrU2hhZGVyOjprT3BhcXVlQWxwaGFfRmxhZykgPT0gMCk7CisKKyAgICByZXR1cm4gc2tpYVNoYWRlcjsKKyNlbHNlCisgICAgcmV0dXJuIE5VTEw7CisjZW5kaWYKK30KKworc3RhdGljIFNrU2hhZGVyKiBMaW5lYXJHcmFkaWVudF9jcmVhdGUyKEpOSUVudiogZW52LCBqb2JqZWN0IG8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgeDAsIGZsb2F0IHkwLCBmbG9hdCB4MSwgZmxvYXQgeTEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNvbG9yMCwgaW50IGNvbG9yMSwgaW50IHRpbGVNb2RlKQogewpAQCAtMTIwLDggKzIxNyw5IEBACiAgICAgU2tDb2xvciBjb2xvcnNbMl07CiAgICAgY29sb3JzWzBdID0gY29sb3IwOwogICAgIGNvbG9yc1sxXSA9IGNvbG9yMTsKLQorICAgIAogICAgIFNrU2hhZGVyKiBzID0gU2tHcmFkaWVudFNoYWRlcjo6Q3JlYXRlTGluZWFyKHB0cywgY29sb3JzLCBOVUxMLCAyLCAoU2tTaGFkZXI6OlRpbGVNb2RlKXRpbGVNb2RlKTsKKwogICAgIFRocm93SUFFX0lmTnVsbChlbnYsIHMpOwogICAgIHJldHVybiBzOwogfQpAQCAtMjIyLDE4ICszMjAsNDIgQEAKIAogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KIAotc3RhdGljIFNrU2hhZGVyKiBDb21wb3NlU2hhZGVyX2NyZWF0ZTEoSk5JRW52KiBlbnYsIGpvYmplY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTa1NoYWRlciogc2hhZGVyQSwgU2tTaGFkZXIqIHNoYWRlckIsIFNrWGZlcm1vZGUqIG1vZGUpCitzdGF0aWMgU2tTaGFkZXIqIENvbXBvc2VTaGFkZXJfY3JlYXRlMShKTklFbnYqIGVudiwgam9iamVjdCBvLAorICAgICAgICBTa1NoYWRlciogc2hhZGVyQSwgU2tTaGFkZXIqIHNoYWRlckIsIFNrWGZlcm1vZGUqIG1vZGUpCiB7CiAgICAgcmV0dXJuIG5ldyBTa0NvbXBvc2VTaGFkZXIoc2hhZGVyQSwgc2hhZGVyQiwgbW9kZSk7CiB9CiAKLXN0YXRpYyBTa1NoYWRlciogQ29tcG9zZVNoYWRlcl9jcmVhdGUyKEpOSUVudiogZW52LCBqb2JqZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2tTaGFkZXIqIHNoYWRlckEsIFNrU2hhZGVyKiBzaGFkZXJCLCBTa1BvcnRlckR1ZmY6Ok1vZGUgbW9kZSkKK3N0YXRpYyBTa1NoYWRlciogQ29tcG9zZVNoYWRlcl9jcmVhdGUyKEpOSUVudiogZW52LCBqb2JqZWN0IG8sCisgICAgICAgIFNrU2hhZGVyKiBzaGFkZXJBLCBTa1NoYWRlciogc2hhZGVyQiwgU2tQb3J0ZXJEdWZmOjpNb2RlIHBvcnRlckR1ZmZNb2RlKQogewotICAgIFNrQXV0b1VucmVmIGF1KFNrUG9ydGVyRHVmZjo6Q3JlYXRlWGZlcm1vZGUobW9kZSkpOworICAgIFNrQXV0b1VucmVmIGF1KFNrUG9ydGVyRHVmZjo6Q3JlYXRlWGZlcm1vZGUocG9ydGVyRHVmZk1vZGUpKTsKKyAgICBTa1hmZXJtb2RlKiBtb2RlID0gKFNrWGZlcm1vZGUqKSBhdS5nZXQoKTsKKyAgICByZXR1cm4gbmV3IFNrQ29tcG9zZVNoYWRlcihzaGFkZXJBLCBzaGFkZXJCLCBtb2RlKTsKK30KIAotICAgIHJldHVybiBuZXcgU2tDb21wb3NlU2hhZGVyKHNoYWRlckEsIHNoYWRlckIsIChTa1hmZXJtb2RlKilhdS5nZXQoKSk7CitzdGF0aWMgU2tpYVNoYWRlciogQ29tcG9zZVNoYWRlcl9wb3N0Q3JlYXRlMihKTklFbnYqIGVudiwgam9iamVjdCBvLCBTa1NoYWRlciogc2hhZGVyLAorICAgICAgICBTa2lhU2hhZGVyKiBzaGFkZXJBLCBTa2lhU2hhZGVyKiBzaGFkZXJCLCBTa1BvcnRlckR1ZmY6Ok1vZGUgcG9ydGVyRHVmZk1vZGUpIHsKKyNpZmRlZiBVU0VfT1BFTkdMX1JFTkRFUkVSCisgICAgU2tYZmVybW9kZTo6TW9kZSBtb2RlID0gU2tQb3J0ZXJEdWZmOjpUb1hmZXJtb2RlTW9kZShwb3J0ZXJEdWZmTW9kZSk7CisgICAgcmV0dXJuIG5ldyBTa2lhQ29tcG9zZVNoYWRlcihzaGFkZXJBLCBzaGFkZXJCLCBtb2RlLCBzaGFkZXIpOworI2Vsc2UKKyAgICByZXR1cm4gTlVMTDsKKyNlbmRpZgorfQorCitzdGF0aWMgU2tpYVNoYWRlciogQ29tcG9zZVNoYWRlcl9wb3N0Q3JlYXRlMShKTklFbnYqIGVudiwgam9iamVjdCBvLCBTa1NoYWRlciogc2hhZGVyLAorICAgICAgICBTa2lhU2hhZGVyKiBzaGFkZXJBLCBTa2lhU2hhZGVyKiBzaGFkZXJCLCBTa1hmZXJtb2RlKiBtb2RlKSB7CisjaWZkZWYgVVNFX09QRU5HTF9SRU5ERVJFUgorICAgIFNrWGZlcm1vZGU6Ok1vZGUgc2tpYU1vZGU7CisgICAgaWYgKCFTa1hmZXJtb2RlOjpJc01vZGUobW9kZSwgJnNraWFNb2RlKSkgeworICAgICAgICAvLyBUT0RPOiBTdXBwb3J0IG90aGVyIG1vZGVzCisgICAgICAgIHNraWFNb2RlID0gU2tYZmVybW9kZTo6a1NyY092ZXJfTW9kZTsKKyAgICB9CisgICAgcmV0dXJuIG5ldyBTa2lhQ29tcG9zZVNoYWRlcihzaGFkZXJBLCBzaGFkZXJCLCBza2lhTW9kZSwgc2hhZGVyKTsKKyNlbHNlCisgICAgcmV0dXJuIE5VTEw7CisjZW5kaWYKIH0KIAogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KQEAgLTI0NCwxOCArMzY2LDIxIEBACiB9OwogCiBzdGF0aWMgSk5JTmF0aXZlTWV0aG9kIGdTaGFkZXJNZXRob2RzW10gPSB7Ci0gICAgeyAibmF0aXZlRGVzdHJ1Y3RvciIsICAgICAgICAiKEkpViIsICAgICAodm9pZCopU2hhZGVyX2Rlc3RydWN0b3IgICAgICAgIH0sCisgICAgeyAibmF0aXZlRGVzdHJ1Y3RvciIsICAgICAgICAiKElJKVYiLCAgICAodm9pZCopU2hhZGVyX2Rlc3RydWN0b3IgICAgICAgIH0sCiAgICAgeyAibmF0aXZlR2V0TG9jYWxNYXRyaXgiLCAgICAiKElJKVoiLCAgICAodm9pZCopU2hhZGVyX2dldExvY2FsTWF0cml4ICAgIH0sCi0gICAgeyAibmF0aXZlU2V0TG9jYWxNYXRyaXgiLCAgICAiKElJKVYiLCAgICAodm9pZCopU2hhZGVyX3NldExvY2FsTWF0cml4ICAgIH0KKyAgICB7ICJuYXRpdmVTZXRMb2NhbE1hdHJpeCIsICAgICIoSUlJKVYiLCAgICh2b2lkKilTaGFkZXJfc2V0TG9jYWxNYXRyaXggICAgfQogfTsKIAogc3RhdGljIEpOSU5hdGl2ZU1ldGhvZCBnQml0bWFwU2hhZGVyTWV0aG9kc1tdID0gewotICAgIHsgIm5hdGl2ZUNyZWF0ZSIsICAgIihJSUkpSSIsICAodm9pZCopQml0bWFwU2hhZGVyX2NvbnN0cnVjdG9yIH0KKyAgICB7ICJuYXRpdmVDcmVhdGUiLCAgICAgIihJSUkpSSIsICAodm9pZCopQml0bWFwU2hhZGVyX2NvbnN0cnVjdG9yIH0sCisgICAgeyAibmF0aXZlUG9zdENyZWF0ZSIsICIoSUlJSSlJIiwgKHZvaWQqKUJpdG1hcFNoYWRlcl9wb3N0Q29uc3RydWN0b3IgfQogfTsKIAogc3RhdGljIEpOSU5hdGl2ZU1ldGhvZCBnTGluZWFyR3JhZGllbnRNZXRob2RzW10gPSB7Ci0gICAgeyAibmF0aXZlQ3JlYXRlMSIsICAiKEZGRkZbSVtGSSlJIiwgKHZvaWQqKUxpbmVhckdyYWRpZW50X2NyZWF0ZTEgICB9LAotICAgIHsgIm5hdGl2ZUNyZWF0ZTIiLCAgIihGRkZGSUlJKUkiLCAgICh2b2lkKilMaW5lYXJHcmFkaWVudF9jcmVhdGUyICAgfQorICAgIHsgIm5hdGl2ZUNyZWF0ZTEiLCAgICAgIihGRkZGW0lbRkkpSSIsICAodm9pZCopTGluZWFyR3JhZGllbnRfY3JlYXRlMSAgICAgfSwKKyAgICB7ICJuYXRpdmVDcmVhdGUyIiwgICAgICIoRkZGRklJSSlJIiwgICAgKHZvaWQqKUxpbmVhckdyYWRpZW50X2NyZWF0ZTIgICAgIH0sCisgICAgeyAibmF0aXZlUG9zdENyZWF0ZTEiLCAiKElGRkZGW0lbRkkpSSIsICh2b2lkKilMaW5lYXJHcmFkaWVudF9wb3N0Q3JlYXRlMSB9LAorICAgIHsgIm5hdGl2ZVBvc3RDcmVhdGUyIiwgIihJRkZGRklJSSlJIiwgICAodm9pZCopTGluZWFyR3JhZGllbnRfcG9zdENyZWF0ZTIgfQogfTsKIAogc3RhdGljIEpOSU5hdGl2ZU1ldGhvZCBnUmFkaWFsR3JhZGllbnRNZXRob2RzW10gPSB7CkBAIC0yNjksOCArMzk0LDEwIEBACiB9OwogCiBzdGF0aWMgSk5JTmF0aXZlTWV0aG9kIGdDb21wb3NlU2hhZGVyTWV0aG9kc1tdID0gewotICAgIHsibmF0aXZlQ3JlYXRlMSIsICAiKElJSSlJIiwgICAgKHZvaWQqKUNvbXBvc2VTaGFkZXJfY3JlYXRlMSB9LAotICAgIHsibmF0aXZlQ3JlYXRlMiIsICAiKElJSSlJIiwgICAgKHZvaWQqKUNvbXBvc2VTaGFkZXJfY3JlYXRlMiB9CisgICAgeyJuYXRpdmVDcmVhdGUxIiwgICAgICAiKElJSSlJIiwgICAodm9pZCopQ29tcG9zZVNoYWRlcl9jcmVhdGUxICAgICB9LAorICAgIHsibmF0aXZlQ3JlYXRlMiIsICAgICAgIihJSUkpSSIsICAgKHZvaWQqKUNvbXBvc2VTaGFkZXJfY3JlYXRlMiAgICAgfSwKKyAgICB7Im5hdGl2ZVBvc3RDcmVhdGUxIiwgICIoSUlJSSlJIiwgICh2b2lkKilDb21wb3NlU2hhZGVyX3Bvc3RDcmVhdGUxIH0sCisgICAgeyJuYXRpdmVQb3N0Q3JlYXRlMiIsICAiKElJSUkpSSIsICAodm9pZCopQ29tcG9zZVNoYWRlcl9wb3N0Q3JlYXRlMiB9CiB9OwogCiAjaW5jbHVkZSA8YW5kcm9pZF9ydW50aW1lL0FuZHJvaWRSdW50aW1lLmg+CmRpZmYgLS1naXQgYS9jb3JlL2puaS9hbmRyb2lkL2dyYXBoaWNzL1RleHRMYXlvdXQuY3BwIGIvY29yZS9qbmkvYW5kcm9pZC9ncmFwaGljcy9UZXh0TGF5b3V0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNDdlMWZhCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9qbmkvYW5kcm9pZC9ncmFwaGljcy9UZXh0TGF5b3V0LmNwcApAQCAtMCwwICsxLDM0MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlICJUZXh0TGF5b3V0LmgiCisKKyNpbmNsdWRlIDxhbmRyb2lkX3J1bnRpbWUvQW5kcm9pZFJ1bnRpbWUuaD4KKworI2luY2x1ZGUgIlNrVGVtcGxhdGVzLmgiCisjaW5jbHVkZSAidW5pY29kZS91YmlkaS5oIgorI2luY2x1ZGUgInVuaWNvZGUvdXNoYXBlLmgiCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKworbmFtZXNwYWNlIGFuZHJvaWQgeworLy8gUmV0dXJucyB0cnVlIGlmIHdlIG1pZ2h0IG5lZWQgbGF5b3V0LiAgSWYgYmlkaUZsYWdzIGZvcmNlIExUUiwgYXNzdW1lIG5vIGxheW91dCwgaWYKKy8vIGJpZGlGbGFncyBpbmRpY2F0ZSB0aGVyZSBwcm9iYWJseSBpcyBSVEwsIGFzc3VtZSB3ZSBkbywgb3RoZXJ3aXNlIHNjYW4gdGhlIHRleHQKKy8vIGxvb2tpbmcgZm9yIGEgY2hhcmFjdGVyID49IHRoZSBmaXJzdCBSVEwgY2hhcmFjdGVyIGluIHVuaWNvZGUgYW5kIGFzc3VtZSB3ZSBkbyBpZgorLy8gd2UgZmluZCBvbmUuCitib29sIFRleHRMYXlvdXQ6Om5lZWRzTGF5b3V0KGNvbnN0IGpjaGFyKiB0ZXh0LCBqaW50IGxlbiwgamludCBiaWRpRmxhZ3MpIHsKKyAgICBpZiAoYmlkaUZsYWdzID09IGtCaWRpX0ZvcmNlX0xUUikgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGlmICgoYmlkaUZsYWdzID09IGtCaWRpX1JUTCkgfHwgKGJpZGlGbGFncyA9PSBrQmlkaV9EZWZhdWx0X1JUTCkgfHwKKyAgICAgICAgICAgIGJpZGlGbGFncyA9PSBrQmlkaV9Gb3JjZV9SVEwpIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuOyArK2kpIHsKKyAgICAgICAgaWYgKHRleHRbaV0gPj0gMHgwNTkwKSB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9CisKKy8qKgorICogQ2hhcmFjdGVyLWJhc2VkIEFyYWJpYyBzaGFwaW5nLgorICoKKyAqIFdlJ2xsIHVzZSBoYXJmYnV6eiBhbmQgZ2x5cGgtYmFzZWQgc2hhcGluZyBpbnN0ZWFkIG9uY2Ugd2UncmUgc2V0IHVwIGZvciBpdC4KKyAqCisgKiBAY29udGV4dCB0aGUgdGV4dCBjb250ZXh0CisgKiBAc3RhcnQgdGhlIHN0YXJ0IG9mIHRoZSB0ZXh0IHRvIHJlbmRlcgorICogQGNvdW50IHRoZSBsZW5ndGggb2YgdGhlIHRleHQgdG8gcmVuZGVyLCBzdGFydCArIGNvdW50ICBtdXN0IGJlIDw9IGNvbnRleHRDb3VudAorICogQGNvbnRleHRDb3VudCB0aGUgbGVuZ3RoIG9mIHRoZSBjb250ZXh0CisgKiBAc2hhcGVkIHdoZXJlIHRvIHB1dCB0aGUgc2hhcGVkIHRleHQsIG11c3QgaGF2ZSBjYXBhY2l0eSBmb3IgY291bnQgdWNoYXJzCisgKiBAcmV0dXJuIHRoZSBsZW5ndGggb2YgdGhlIHNoYXBlZCB0ZXh0LCBvciAtMSBpZiBlcnJvcgorICovCitpbnQgVGV4dExheW91dDo6c2hhcGVSdGxUZXh0KGNvbnN0IGpjaGFyKiBjb250ZXh0LCBqc2l6ZSBzdGFydCwganNpemUgY291bnQsIGpzaXplIGNvbnRleHRDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGpjaGFyKiBzaGFwZWQsIFVFcnJvckNvZGUgJnN0YXR1cykgeworICAgIGpjaGFyIGJ1ZmZlcltjb250ZXh0Q291bnRdOworCisgICAgLy8gVXNlIGZpeGVkIGxlbmd0aCBzaW5jZSB3ZSBuZWVkIHRvIGtlZXAgc3RhcnQgYW5kIGNvdW50IHZhbGlkCisgICAgdV9zaGFwZUFyYWJpYyhjb250ZXh0LCBjb250ZXh0Q291bnQsIGJ1ZmZlciwgY29udGV4dENvdW50LAorICAgICAgICAgICAgICAgICAgIFVfU0hBUEVfTEVOR1RIX0ZJWEVEX1NQQUNFU19ORUFSIHwKKyAgICAgICAgICAgICAgICAgICBVX1NIQVBFX1RFWFRfRElSRUNUSU9OX0xPR0lDQUwgfCBVX1NIQVBFX0xFVFRFUlNfU0hBUEUgfAorICAgICAgICAgICAgICAgICAgIFVfU0hBUEVfWF9MQU1BTEVGX1NVQl9BTFRFUk5BVEUsICZzdGF0dXMpOworCisgICAgaWYgKFVfU1VDQ0VTUyhzdGF0dXMpKSB7CisgICAgICAgIC8vIHRyaW0gb3V0IDB4ZmZmZiBmb2xsb3dpbmcgbGlnYXR1cmVzLCBpZiBhbnkKKyAgICAgICAgaW50IGVuZCA9IDA7CisgICAgICAgIGZvciAoaW50IGkgPSBzdGFydCwgZSA9IHN0YXJ0ICsgY291bnQ7IGkgPCBlOyArK2kpIHsKKyAgICAgICAgICAgIGlmIChidWZmZXJbaV0gIT0gMHhmZmZmKSB7CisgICAgICAgICAgICAgICAgYnVmZmVyW2VuZCsrXSA9IGJ1ZmZlcltpXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBjb3VudCA9IGVuZDsKKyAgICAgICAgLy8gTE9HKExPR19JTkZPLCAiQ1NSVEwiLCAic3RhcnQgJWQgY291bnQgJWQgY2NvdW50ICVkXG4iLCBzdGFydCwgY291bnQsIGNvbnRleHRDb3VudCk7CisgICAgICAgIHViaWRpX3dyaXRlUmV2ZXJzZShidWZmZXIsIGNvdW50LCBzaGFwZWQsIGNvdW50LCBVQklESV9ET19NSVJST1JJTkcgfCBVQklESV9PVVRQVVRfUkVWRVJTRQorICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBVQklESV9LRUVQX0JBU0VfQ09NQklOSU5HLCAmc3RhdHVzKTsKKyAgICAgICAgaWYgKFVfU1VDQ0VTUyhzdGF0dXMpKSB7CisgICAgICAgICAgICByZXR1cm4gY291bnQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gLTE7Cit9CisKKy8qKgorICogQmFzaWMgY2hhcmFjdGVyLWJhc2VkIGxheW91dCBzdXBwb3J0aW5nIHJ0bCBhbmQgYXJhYmljIHNoYXBpbmcuCisgKiBSdW5zIGJpZGkgb24gdGhlIHRleHQgYW5kIGdlbmVyYXRlcyBhIHJlb3JkZXJlZCwgc2hhcGVkIGxpbmUgaW4gYnVmZmVyLCByZXR1cm5pbmcKKyAqIHRoZSBsZW5ndGguCisgKiBAdGV4dCB0aGUgdGV4dAorICogQGxlbiB0aGUgbGVuZ3RoIG9mIHRoZSB0ZXh0IGluIHVjaGFycworICogQGRpciByZWNlaXZlcyB0aGUgcmVzb2x2ZWQgcGFyYWdyYXBoIGRpcmVjdGlvbgorICogQGJ1ZmZlciB0aGUgYnVmZmVyIHRvIHJlY2VpdmUgdGhlIHJlb3JkZXJlZCwgc2hhcGVkIGxpbmUuICBNdXN0IGhhdmUgY2FwYWNpdHkgb2YKKyAqIGF0IGxlYXN0IGxlbiBqY2hhcnMuCisgKiBAZmxhZ3MgbGluZSBiaWRpIGZsYWdzCisgKiBAcmV0dXJuIHRoZSBsZW5ndGggb2YgdGhlIHJlb3JkZXJlZCwgc2hhcGVkIGxpbmUsIG9yIC0xIGlmIGVycm9yCisgKi8KK2ppbnQgVGV4dExheW91dDo6bGF5b3V0TGluZShjb25zdCBqY2hhciogdGV4dCwgamludCBsZW4sIGppbnQgZmxhZ3MsIGludCAmZGlyLCBqY2hhciogYnVmZmVyLAorICAgICAgICBVRXJyb3JDb2RlICZzdGF0dXMpIHsKKyAgICBzdGF0aWMgY29uc3QgaW50IFJUTF9PUFRTID0gVUJJRElfRE9fTUlSUk9SSU5HIHwgVUJJRElfS0VFUF9CQVNFX0NPTUJJTklORyB8CisgICAgICAgICAgICBVQklESV9SRU1PVkVfQklESV9DT05UUk9MUyB8IFVCSURJX09VVFBVVF9SRVZFUlNFOworCisgICAgVUJpRGlMZXZlbCBiaWRpUmVxID0gMDsKKyAgICBzd2l0Y2ggKGZsYWdzKSB7CisgICAgY2FzZSBrQmlkaV9MVFI6IGJpZGlSZXEgPSAwOyBicmVhazsgLy8gbm8gSUNVIGNvbnN0YW50LCBjYW5vbmljYWwgTFRSIGxldmVsCisgICAgY2FzZSBrQmlkaV9SVEw6IGJpZGlSZXEgPSAxOyBicmVhazsgLy8gbm8gSUNVIGNvbnN0YW50LCBjYW5vbmljYWwgUlRMIGxldmVsCisgICAgY2FzZSBrQmlkaV9EZWZhdWx0X0xUUjogYmlkaVJlcSA9IFVCSURJX0RFRkFVTFRfTFRSOyBicmVhazsKKyAgICBjYXNlIGtCaWRpX0RlZmF1bHRfUlRMOiBiaWRpUmVxID0gVUJJRElfREVGQVVMVF9SVEw7IGJyZWFrOworICAgIGNhc2Uga0JpZGlfRm9yY2VfTFRSOiBtZW1jcHkoYnVmZmVyLCB0ZXh0LCBsZW4gKiBzaXplb2YoamNoYXIpKTsgcmV0dXJuIGxlbjsKKyAgICBjYXNlIGtCaWRpX0ZvcmNlX1JUTDogcmV0dXJuIHNoYXBlUnRsVGV4dCh0ZXh0LCAwLCBsZW4sIGxlbiwgYnVmZmVyLCBzdGF0dXMpOworICAgIH0KKworICAgIGludDMyX3QgcmVzdWx0ID0gLTE7CisKKyAgICBVQmlEaSogYmlkaSA9IHViaWRpX29wZW4oKTsKKyAgICBpZiAoYmlkaSkgeworICAgICAgICB1YmlkaV9zZXRQYXJhKGJpZGksIHRleHQsIGxlbiwgYmlkaVJlcSwgTlVMTCwgJnN0YXR1cyk7CisgICAgICAgIGlmIChVX1NVQ0NFU1Moc3RhdHVzKSkgeworICAgICAgICAgICAgZGlyID0gdWJpZGlfZ2V0UGFyYUxldmVsKGJpZGkpICYgMHgxOyAvLyAwIGlmIGx0ciwgMSBpZiBydGwKKworICAgICAgICAgICAgaW50IHJjID0gdWJpZGlfY291bnRSdW5zKGJpZGksICZzdGF0dXMpOworICAgICAgICAgICAgaWYgKFVfU1VDQ0VTUyhzdGF0dXMpKSB7CisgICAgICAgICAgICAgICAgLy8gTE9HKExPR19JTkZPLCAiTEFZT1VUIiwgInBhcmEgYmlkaVJlcT0lZCBkaXI9JWQgcmM9JWRcbiIsIGJpZGlSZXEsIGRpciwgcmMpOworCisgICAgICAgICAgICAgICAgaW50MzJfdCBzbGVuID0gMDsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHJjOyArK2kpIHsKKyAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBzdGFydDsKKyAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBsZW5ndGg7CisgICAgICAgICAgICAgICAgICAgIFVCaURpRGlyZWN0aW9uIHJ1bkRpciA9IHViaWRpX2dldFZpc3VhbFJ1bihiaWRpLCBpLCAmc3RhcnQsICZsZW5ndGgpOworCisgICAgICAgICAgICAgICAgICAgIGlmIChydW5EaXIgPT0gVUJJRElfUlRMKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzbGVuICs9IHNoYXBlUnRsVGV4dCh0ZXh0ICsgc3RhcnQsIDAsIGxlbmd0aCwgbGVuZ3RoLCBidWZmZXIgKyBzbGVuLCBzdGF0dXMpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgbWVtY3B5KGJ1ZmZlciArIHNsZW4sIHRleHQgKyBzdGFydCwgbGVuZ3RoICogc2l6ZW9mKGpjaGFyKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBzbGVuICs9IGxlbmd0aDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoVV9TVUNDRVNTKHN0YXR1cykpIHsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gc2xlbjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgdWJpZGlfY2xvc2UoYmlkaSk7CisgICAgfQorCisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworYm9vbCBUZXh0TGF5b3V0OjpwcmVwYXJlVGV4dChTa1BhaW50ICpwYWludCwgY29uc3QgamNoYXIqIHRleHQsIGpzaXplIGxlbiwgamludCBiaWRpRmxhZ3MsCisgICAgICAgIGNvbnN0IGpjaGFyKiogb3V0VGV4dCwgaW50MzJfdCogb3V0Qnl0ZXMsIGpjaGFyKiogb3V0QnVmZmVyKSB7CisgICAgY29uc3QgamNoYXIgKndvcmtUZXh0ID0gdGV4dDsKKyAgICBqY2hhciAqYnVmZmVyID0gTlVMTDsKKyAgICBpbnQgZGlyID0ga0RpcmVjdGlvbl9MVFI7CisgICAgaWYgKG5lZWRzTGF5b3V0KHRleHQsIGxlbiwgYmlkaUZsYWdzKSkgeworICAgICAgICBidWZmZXIgPShqY2hhciAqKSBtYWxsb2MobGVuICogc2l6ZW9mKGpjaGFyKSk7CisgICAgICAgIGlmICghYnVmZmVyKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgVUVycm9yQ29kZSBzdGF0dXMgPSBVX1pFUk9fRVJST1I7CisgICAgICAgIGxlbiA9IGxheW91dExpbmUodGV4dCwgbGVuLCBiaWRpRmxhZ3MsIGRpciwgYnVmZmVyLCBzdGF0dXMpOyAvLyBtaWdodCBjaGFuZ2UgbGVuLCBkaXIKKyAgICAgICAgaWYgKCFVX1NVQ0NFU1Moc3RhdHVzKSkgeworICAgICAgICAgICAgTE9HKExPR19XQVJOLCAiTEFZT1VUIiwgImRyYXdUZXh0IGVycm9yICVkXG4iLCBzdGF0dXMpOworICAgICAgICAgICAgZnJlZShidWZmZXIpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOyAvLyBjYW4ndCByZW5kZXIKKyAgICAgICAgfQorCisgICAgICAgIHdvcmtUZXh0ID0gYnVmZmVyOyAvLyB1c2UgdGhlIHNoYXBlZCB0ZXh0CisgICAgfQorCisgICAgYm9vbCB0cmltTGVmdCA9IGZhbHNlOworICAgIGJvb2wgdHJpbVJpZ2h0ID0gZmFsc2U7CisKKyAgICBTa1BhaW50OjpBbGlnbiBob3JpeiA9IHBhaW50LT5nZXRUZXh0QWxpZ24oKTsKKyAgICBzd2l0Y2ggKGhvcml6KSB7CisgICAgICAgIGNhc2UgU2tQYWludDo6a0xlZnRfQWxpZ246IHRyaW1MZWZ0ID0gZGlyICYga0RpcmVjdGlvbl9NYXNrOyBicmVhazsKKyAgICAgICAgY2FzZSBTa1BhaW50OjprQ2VudGVyX0FsaWduOiB0cmltTGVmdCA9IHRyaW1SaWdodCA9IHRydWU7IGJyZWFrOworICAgICAgICBjYXNlIFNrUGFpbnQ6OmtSaWdodF9BbGlnbjogdHJpbVJpZ2h0ID0gIShkaXIgJiBrRGlyZWN0aW9uX01hc2spOworICAgICAgICBkZWZhdWx0OiBicmVhazsKKyAgICB9CisgICAgY29uc3QgamNoYXIqIHdvcmtMaW1pdCA9IHdvcmtUZXh0ICsgbGVuOworCisgICAgaWYgKHRyaW1MZWZ0KSB7CisgICAgICAgIHdoaWxlICh3b3JrVGV4dCA8IHdvcmtMaW1pdCAmJiAqd29ya1RleHQgPT0gJyAnKSB7CisgICAgICAgICAgICArK3dvcmtUZXh0OworICAgICAgICB9CisgICAgfQorICAgIGlmICh0cmltUmlnaHQpIHsKKyAgICAgICAgd2hpbGUgKHdvcmtMaW1pdCA+IHdvcmtUZXh0ICYmICood29ya0xpbWl0IC0gMSkgPT0gJyAnKSB7CisgICAgICAgICAgICAtLXdvcmtMaW1pdDsKKyAgICAgICAgfQorICAgIH0KKworICAgICpvdXRCeXRlcyA9ICh3b3JrTGltaXQgLSB3b3JrVGV4dCkgPDwgMTsKKyAgICAqb3V0VGV4dCA9IHdvcmtUZXh0OworICAgICpvdXRCdWZmZXIgPSBidWZmZXI7CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworLy8gRHJhd3Mgb3IgZ2V0cyB0aGUgcGF0aCBvZiBhIHBhcmFncmFwaCBvZiB0ZXh0IG9uIGEgc2luZ2xlIGxpbmUsIHJ1bm5pbmcgYmlkaSBhbmQgc2hhcGluZy4KKy8vIFRoaXMgd2lsbCBkcmF3IGlmIGNhbnZhcyBpcyBub3QgbnVsbCwgb3RoZXJ3aXNlIHBhdGggbXVzdCBiZSBub24tbnVsbCBhbmQgaXQgd2lsbCBjcmVhdGUKKy8vIGEgcGF0aCByZXByZXNlbnRpbmcgdGhlIHRleHQgdGhhdCB3b3VsZCBoYXZlIGJlZW4gZHJhd24uCit2b2lkIFRleHRMYXlvdXQ6OmhhbmRsZVRleHQoU2tQYWludCAqcGFpbnQsIGNvbnN0IGpjaGFyKiB0ZXh0LCBqc2l6ZSBsZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgamludCBiaWRpRmxhZ3MsIGpmbG9hdCB4LCBqZmxvYXQgeSxTa0NhbnZhcyAqY2FudmFzLCBTa1BhdGggKnBhdGgpIHsKKyAgICBjb25zdCBqY2hhciAqd29ya1RleHQ7CisgICAgamNoYXIgKmJ1ZmZlciA9IE5VTEw7CisgICAgaW50MzJfdCB3b3JrQnl0ZXM7CisgICAgaWYgKHByZXBhcmVUZXh0KHBhaW50LCB0ZXh0LCBsZW4sIGJpZGlGbGFncywgJndvcmtUZXh0LCAmd29ya0J5dGVzLCAmYnVmZmVyKSkgeworICAgICAgICBTa1NjYWxhciB4XyA9IFNrRmxvYXRUb1NjYWxhcih4KTsKKyAgICAgICAgU2tTY2FsYXIgeV8gPSBTa0Zsb2F0VG9TY2FsYXIoeSk7CisgICAgICAgIGlmIChjYW52YXMpIHsKKyAgICAgICAgICAgIGNhbnZhcy0+ZHJhd1RleHQod29ya1RleHQsIHdvcmtCeXRlcywgeF8sIHlfLCAqcGFpbnQpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcGFpbnQtPmdldFRleHRQYXRoKHdvcmtUZXh0LCB3b3JrQnl0ZXMsIHhfLCB5XywgcGF0aCk7CisgICAgICAgIH0KKyAgICAgICAgZnJlZShidWZmZXIpOworICAgIH0KK30KKworYm9vbCBUZXh0TGF5b3V0OjpwcmVwYXJlUnRsVGV4dFJ1bihjb25zdCBqY2hhciogY29udGV4dCwganNpemUgc3RhcnQsIGpzaXplJiBjb3VudCwKKyAgICAgICAganNpemUgY29udGV4dENvdW50LCBqY2hhciogc2hhcGVkKSB7CisgICAgVUVycm9yQ29kZSBzdGF0dXMgPSBVX1pFUk9fRVJST1I7CisgICAgY291bnQgPSBzaGFwZVJ0bFRleHQoY29udGV4dCwgc3RhcnQsIGNvdW50LCBjb250ZXh0Q291bnQsIHNoYXBlZCwgc3RhdHVzKTsKKyAgICBpZiAoVV9TVUNDRVNTKHN0YXR1cykpIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfSBlbHNlIHsKKyAgICAgICAgTE9HKExPR19XQVJOLCAiTEFZT1VUIiwgImRyYXdUZXh0UnVuIGVycm9yICVkXG4iLCBzdGF0dXMpOworICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK3ZvaWQgVGV4dExheW91dDo6ZHJhd1RleHRSdW4oU2tQYWludCogcGFpbnQsIGNvbnN0IGpjaGFyKiBjaGFycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamludCBzdGFydCwgamludCBjb3VudCwgamludCBjb250ZXh0Q291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkaXJGbGFncywgamZsb2F0IHgsIGpmbG9hdCB5LCBTa0NhbnZhcyogY2FudmFzKSB7CisKKyAgICAgU2tTY2FsYXIgeF8gPSBTa0Zsb2F0VG9TY2FsYXIoeCk7CisgICAgIFNrU2NhbGFyIHlfID0gU2tGbG9hdFRvU2NhbGFyKHkpOworCisgICAgIHVpbnQ4X3QgcnRsID0gZGlyRmxhZ3MgJiAweDE7CisgICAgIGlmIChydGwpIHsKKyAgICAgICAgIFNrQXV0b1NUTWFsbG9jPDgwLCBqY2hhcj4gYnVmZmVyKGNvbnRleHRDb3VudCk7CisgICAgICAgICBpZiAocHJlcGFyZVJ0bFRleHRSdW4oY2hhcnMsIHN0YXJ0LCBjb3VudCwgY29udGV4dENvdW50LCBidWZmZXIuZ2V0KCkpKSB7CisgICAgICAgICAgICAgY2FudmFzLT5kcmF3VGV4dChidWZmZXIuZ2V0KCksIGNvdW50IDw8IDEsIHhfLCB5XywgKnBhaW50KTsKKyAgICAgICAgIH0KKyAgICAgfSBlbHNlIHsKKyAgICAgICAgIGNhbnZhcy0+ZHJhd1RleHQoY2hhcnMgKyBzdGFydCwgY291bnQgPDwgMSwgeF8sIHlfLCAqcGFpbnQpOworICAgICB9CisgfQorCit2b2lkIFRleHRMYXlvdXQ6OmdldFRleHRSdW5BZHZhbmNlcyhTa1BhaW50ICpwYWludCwgY29uc3QgamNoYXIgKmNoYXJzLCBqaW50IHN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamludCBjb3VudCwgamludCBjb250ZXh0Q291bnQsIGppbnQgZGlyRmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqZmxvYXQgKnJlc3VsdEFkdmFuY2VzLCBqZmxvYXQgJnJlc3VsdFRvdGFsQWR2YW5jZSkgeworICAgIGpjaGFyIGJ1ZmZlcltjb250ZXh0Q291bnRdOworCisgICAgU2tTY2FsYXIqIHNjYWxhckFycmF5ID0gKFNrU2NhbGFyICopcmVzdWx0QWR2YW5jZXM7CisgICAgcmVzdWx0VG90YWxBZHZhbmNlID0gMDsKKworICAgIC8vIHRoaXMgaXMgd2hlcmUgd2UnZCBjYWxsIGhhcmZidXp6CisgICAgLy8gZm9yIG5vdyB3ZSBqdXN0IHVzZSB1c2hhcGUuYworCisgICAgaW50IHdpZHRoczsKKyAgICBjb25zdCBqY2hhciogdGV4dDsKKyAgICBpZiAoZGlyRmxhZ3MgJiAweDEpIHsgLy8gcnRsLCBjYWxsIGFyYWJpYyBzaGFwaW5nIGluIGNhc2UKKyAgICAgICAgVUVycm9yQ29kZSBzdGF0dXMgPSBVX1pFUk9fRVJST1I7CisgICAgICAgIC8vIFVzZSBmaXhlZCBsZW5ndGggc2luY2Ugd2UgbmVlZCB0byBrZWVwIHN0YXJ0IGFuZCBjb3VudCB2YWxpZAorICAgICAgICB1X3NoYXBlQXJhYmljKGNoYXJzLCBjb250ZXh0Q291bnQsIGJ1ZmZlciwgY29udGV4dENvdW50LAorICAgICAgICAgICAgICAgICAgICAgIFVfU0hBUEVfTEVOR1RIX0ZJWEVEX1NQQUNFU19ORUFSIHwKKyAgICAgICAgICAgICAgICAgICAgICBVX1NIQVBFX1RFWFRfRElSRUNUSU9OX0xPR0lDQUwgfCBVX1NIQVBFX0xFVFRFUlNfU0hBUEUgfAorICAgICAgICAgICAgICAgICAgICAgIFVfU0hBUEVfWF9MQU1BTEVGX1NVQl9BTFRFUk5BVEUsICZzdGF0dXMpOworICAgICAgICAvLyB3ZSBzaG91bGRuJ3QgZmFpbCB1bmxlc3MgdGhlcmUncyBhbiBvdXQgb2YgbWVtb3J5IGNvbmRpdGlvbiwKKyAgICAgICAgLy8gaW4gd2hpY2ggY2FzZSB3ZSdyZSBob3NlZCBhbnl3YXkKKyAgICAgICAgZm9yIChpbnQgaSA9IHN0YXJ0LCBlID0gaSArIGNvdW50OyBpIDwgZTsgKytpKSB7CisgICAgICAgICAgaWYgKGJ1ZmZlcltpXSA9PSAweGZmZmYpIHsKKyAgICAgICAgICAgIGJ1ZmZlcltpXSA9IDB4MjAwYjsgLy8gemVyby13aWR0aC1zcGFjZSBmb3Igc2tpYQorICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICB0ZXh0ID0gYnVmZmVyICsgc3RhcnQ7CisgICAgICAgIHdpZHRocyA9IHBhaW50LT5nZXRUZXh0V2lkdGhzKHRleHQsIGNvdW50IDw8IDEsIHNjYWxhckFycmF5KTsKKyAgICB9IGVsc2UgeworICAgICAgICB0ZXh0ID0gY2hhcnMgKyBzdGFydDsKKyAgICAgICAgd2lkdGhzID0gcGFpbnQtPmdldFRleHRXaWR0aHModGV4dCwgY291bnQgPDwgMSwgc2NhbGFyQXJyYXkpOworICAgIH0KKworICAgIGlmICh3aWR0aHMgPCBjb3VudCkgeworICAgICAgICAvLyBTa2lhIG9wZXJhdGVzIG9uIGNvZGUgcG9pbnRzLCBub3QgY29kZSB1bml0cywgc28gc3Vycm9nYXRlIHBhaXJzIHJldHVybiBvbmx5CisgICAgICAgIC8vIG9uZSB2YWx1ZS4gRXhwYW5kIHRoZSByZXN1bHQgc28gd2UgaGF2ZSBvbmUgdmFsdWUgcGVyIFVURi0xNiBjb2RlIHVuaXQuCisKKyAgICAgICAgLy8gTm90ZSwgc2tpYSdzIGdldFRleHRXaWR0aCBnZXRzIGNvbmZ1c2VkIGlmIGl0IGVuY291bnRlcnMgYSBzdXJyb2dhdGUgcGFpciwKKyAgICAgICAgLy8gbGVhdmluZyB0aGUgcmVtYWluaW5nIHdpZHRocyB6ZXJvLiAgTm90IG5pY2UuCisgICAgICAgIGZvciAoaW50IGkgPSAwLCBwID0gMDsgaSA8IHdpZHRoczsgKytpKSB7CisgICAgICAgICAgICByZXN1bHRUb3RhbEFkdmFuY2UgKz0gcmVzdWx0QWR2YW5jZXNbcCsrXSA9IFNrU2NhbGFyVG9GbG9hdChzY2FsYXJBcnJheVtpXSk7CisgICAgICAgICAgICBpZiAocCA8IGNvdW50ICYmIHRleHRbcF0gPj0gMHhkYzAwICYmIHRleHRbcF0gPCAweGUwMDAgJiYKKyAgICAgICAgICAgICAgICAgICAgdGV4dFtwLTFdID49IDB4ZDgwMCAmJiB0ZXh0W3AtMV0gPCAweGRjMDApIHsKKyAgICAgICAgICAgICAgICByZXN1bHRBZHZhbmNlc1twKytdID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeworICAgICAgICAgICAgcmVzdWx0VG90YWxBZHZhbmNlICs9IHJlc3VsdEFkdmFuY2VzW2ldID0gU2tTY2FsYXJUb0Zsb2F0KHNjYWxhckFycmF5W2ldKTsKKyAgICAgICAgfQorICAgIH0KK30KKworCisvLyBEcmF3cyBhIHBhcmFncmFwaCBvZiB0ZXh0IG9uIGEgc2luZ2xlIGxpbmUsIHJ1bm5pbmcgYmlkaSBhbmQgc2hhcGluZwordm9pZCBUZXh0TGF5b3V0OjpkcmF3VGV4dChTa1BhaW50KiBwYWludCwgY29uc3QgamNoYXIqIHRleHQsIGpzaXplIGxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJpZGlGbGFncywgamZsb2F0IHgsIGpmbG9hdCB5LCBTa0NhbnZhcyogY2FudmFzKSB7CisKKyAgICBoYW5kbGVUZXh0KHBhaW50LCB0ZXh0LCBsZW4sIGJpZGlGbGFncywgeCwgeSwgY2FudmFzLCBOVUxMKTsKK30KKwordm9pZCBUZXh0TGF5b3V0OjpnZXRUZXh0UGF0aChTa1BhaW50ICpwYWludCwgY29uc3QgamNoYXIgKnRleHQsIGpzaXplIGxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamludCBiaWRpRmxhZ3MsIGpmbG9hdCB4LCBqZmxvYXQgeSwgU2tQYXRoICpwYXRoKSB7CisgICAgaGFuZGxlVGV4dChwYWludCwgdGV4dCwgbGVuLCBiaWRpRmxhZ3MsIHgsIHksIE5VTEwsIHBhdGgpOworfQorCisKK3ZvaWQgVGV4dExheW91dDo6ZHJhd1RleHRPblBhdGgoU2tQYWludCogcGFpbnQsIGNvbnN0IGpjaGFyKiB0ZXh0LCBpbnQgY291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBiaWRpRmxhZ3MsIGpmbG9hdCBoT2Zmc2V0LCBqZmxvYXQgdk9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2tQYXRoKiBwYXRoLCBTa0NhbnZhcyogY2FudmFzKSB7CisKKyAgICBTa1NjYWxhciBoXyA9IFNrRmxvYXRUb1NjYWxhcihoT2Zmc2V0KTsKKyAgICBTa1NjYWxhciB2XyA9IFNrRmxvYXRUb1NjYWxhcih2T2Zmc2V0KTsKKworICAgIGlmICghbmVlZHNMYXlvdXQodGV4dCwgY291bnQsIGJpZGlGbGFncykpIHsKKyAgICAgICAgY2FudmFzLT5kcmF3VGV4dE9uUGF0aEhWKHRleHQsIGNvdW50IDw8IDEsICpwYXRoLCBoXywgdl8sICpwYWludCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBTa0F1dG9TVE1hbGxvYzw4MCwgamNoYXI+IGJ1ZmZlcihjb3VudCk7CisgICAgaW50IGRpciA9IGtEaXJlY3Rpb25fTFRSOworICAgIFVFcnJvckNvZGUgc3RhdHVzID0gVV9aRVJPX0VSUk9SOworICAgIGNvdW50ID0gbGF5b3V0TGluZSh0ZXh0LCBjb3VudCwgYmlkaUZsYWdzLCBkaXIsIGJ1ZmZlci5nZXQoKSwgc3RhdHVzKTsKKyAgICBpZiAoVV9TVUNDRVNTKHN0YXR1cykpIHsKKyAgICAgICAgY2FudmFzLT5kcmF3VGV4dE9uUGF0aEhWKGJ1ZmZlci5nZXQoKSwgY291bnQgPDwgMSwgKnBhdGgsIGhfLCB2XywgKnBhaW50KTsKKyAgICB9Cit9CisKK30KZGlmZiAtLWdpdCBhL2NvcmUvam5pL2FuZHJvaWQvZ3JhcGhpY3MvVGV4dExheW91dC5oIGIvY29yZS9qbmkvYW5kcm9pZC9ncmFwaGljcy9UZXh0TGF5b3V0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGY2NjZjMAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvam5pL2FuZHJvaWQvZ3JhcGhpY3MvVGV4dExheW91dC5oCkBAIC0wLDAgKzEsODMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSAiam5pLmgiCisKKyNpbmNsdWRlICJTa0NhbnZhcy5oIgorI2luY2x1ZGUgIlNrUGFpbnQuaCIKKyNpbmNsdWRlICJ1bmljb2RlL3V0eXBlcy5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NsYXNzIFRleHRMYXlvdXQgeworcHVibGljOgorCisgICAgZW51bSB7CisgICAgICAgIGtEaXJlY3Rpb25fTFRSID0gMCwKKyAgICAgICAga0RpcmVjdGlvbl9SVEwgPSAxLAorCisgICAgICAgIGtEaXJlY3Rpb25fTWFzayA9IDB4MQorICAgIH07CisKKyAgICBlbnVtIHsKKyAgICAgICAga0JpZGlfTFRSID0gMCwKKyAgICAgICAga0JpZGlfUlRMID0gMSwKKyAgICAgICAga0JpZGlfRGVmYXVsdF9MVFIgPSAyLAorICAgICAgICBrQmlkaV9EZWZhdWx0X1JUTCA9IDMsCisgICAgICAgIGtCaWRpX0ZvcmNlX0xUUiA9IDQsCisgICAgICAgIGtCaWRpX0ZvcmNlX1JUTCA9IDUsCisKKyAgICAgICAga0JpZGlfTWFzayA9IDB4NworICAgIH07CisKKyAgICAvKgorICAgICAqIERyYXdzIGEgdW5pZGlyZWN0aW9uYWwgcnVuIG9mIHRleHQuCisgICAgICovCisgICAgc3RhdGljIHZvaWQgZHJhd1RleHRSdW4oU2tQYWludCogcGFpbnQsIGNvbnN0IGpjaGFyKiBjaGFycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBqaW50IHN0YXJ0LCBqaW50IGNvdW50LCBqaW50IGNvbnRleHRDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGlyRmxhZ3MsIGpmbG9hdCB4LCBqZmxvYXQgeSwgU2tDYW52YXMqIGNhbnZhcyk7CisKKyAgICBzdGF0aWMgdm9pZCBnZXRUZXh0UnVuQWR2YW5jZXMoU2tQYWludCAqcGFpbnQsIGNvbnN0IGpjaGFyICpjaGFycywgamludCBzdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamludCBjb3VudCwgamludCBjb250ZXh0Q291bnQsIGppbnQgZGlyRmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpmbG9hdCAqcmVzdWx0QWR2YW5jZXMsIGpmbG9hdCAmcmVzdWx0VG90YWxBZHZhbmNlKTsKKworICAgIHN0YXRpYyB2b2lkIGRyYXdUZXh0KFNrUGFpbnQqIHBhaW50LCBjb25zdCBqY2hhciogdGV4dCwganNpemUgbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgIGppbnQgYmlkaUZsYWdzLCBqZmxvYXQgeCwgamZsb2F0IHksIFNrQ2FudmFzKiBjYW52YXMpOworCisgICAgc3RhdGljIHZvaWQgZ2V0VGV4dFBhdGgoU2tQYWludCAqcGFpbnQsIGNvbnN0IGpjaGFyICp0ZXh0LCBqc2l6ZSBsZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgamludCBiaWRpRmxhZ3MsIGpmbG9hdCB4LCBqZmxvYXQgeSwgU2tQYXRoICpwYXRoKTsKKworICAgIHN0YXRpYyB2b2lkIGRyYXdUZXh0T25QYXRoKFNrUGFpbnQqIHBhaW50LCBjb25zdCBqY2hhciogdGV4dCwganNpemUgbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBiaWRpRmxhZ3MsIGpmbG9hdCBoT2Zmc2V0LCBqZmxvYXQgdk9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTa1BhdGgqIHBhdGgsIFNrQ2FudmFzKiBjYW52YXMpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgc3RhdGljIGJvb2wgcHJlcGFyZVRleHQoU2tQYWludCAqcGFpbnQsIGNvbnN0IGpjaGFyKiB0ZXh0LCBqc2l6ZSBsZW4sIGppbnQgYmlkaUZsYWdzLAorICAgICAgICBjb25zdCBqY2hhcioqIG91dFRleHQsIGludDMyX3QqIG91dEJ5dGVzLCBqY2hhcioqIG91dEJ1ZmZlcik7CisgICAgc3RhdGljIGJvb2wgcHJlcGFyZVJ0bFRleHRSdW4oY29uc3QgamNoYXIqIGNvbnRleHQsIGpzaXplIHN0YXJ0LCBqc2l6ZSYgY291bnQsCisgICAgICAgIGpzaXplIGNvbnRleHRDb3VudCwgamNoYXIqIHNoYXBlZCk7CisgICAgICAgIAorCitwcml2YXRlOgorICAgIHN0YXRpYyBib29sIG5lZWRzTGF5b3V0KGNvbnN0IGpjaGFyKiB0ZXh0LCBqaW50IGxlbiwgamludCBiaWRpRmxhZ3MpOworICAgIHN0YXRpYyBpbnQgc2hhcGVSdGxUZXh0KGNvbnN0IGpjaGFyKiBjb250ZXh0LCBqc2l6ZSBzdGFydCwganNpemUgY291bnQsIGpzaXplIGNvbnRleHRDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBqY2hhciogc2hhcGVkLCBVRXJyb3JDb2RlICZzdGF0dXMpOworICAgIHN0YXRpYyBqaW50IGxheW91dExpbmUoY29uc3QgamNoYXIqIHRleHQsIGppbnQgbGVuLCBqaW50IGZsYWdzLCBpbnQgJmRpciwgamNoYXIqIGJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFVFcnJvckNvZGUgJnN0YXR1cyk7CisgICAgc3RhdGljIHZvaWQgaGFuZGxlVGV4dChTa1BhaW50ICpwYWludCwgY29uc3QgamNoYXIqIHRleHQsIGpzaXplIGxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBiaWRpRmxhZ3MsIGpmbG9hdCB4LCBqZmxvYXQgeSxTa0NhbnZhcyAqY2FudmFzLCBTa1BhdGggKnBhdGgpOworfTsKKworfQpkaWZmIC0tZ2l0IGEvY29yZS9qbmkvYW5kcm9pZC9ncmFwaGljcy9UeXBlZmFjZS5jcHAgYi9jb3JlL2puaS9hbmRyb2lkL2dyYXBoaWNzL1R5cGVmYWNlLmNwcAppbmRleCA3YzdiZmViLi4xZmU3MmU2IDEwMDY0NAotLS0gYS9jb3JlL2puaS9hbmRyb2lkL2dyYXBoaWNzL1R5cGVmYWNlLmNwcAorKysgYi9jb3JlL2puaS9hbmRyb2lkL2dyYXBoaWNzL1R5cGVmYWNlLmNwcApAQCAtMTMwLDcgKzEzMCwxMyBAQAogICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9CiAgICAgCi0gICAgcmV0dXJuIFNrVHlwZWZhY2U6OkNyZWF0ZUZyb21TdHJlYW0obmV3IEFzc2V0U3RyZWFtKGFzc2V0LCB0cnVlKSk7CisgICAgU2tTdHJlYW0qIHN0cmVhbSA9IG5ldyBBc3NldFN0cmVhbShhc3NldCwgdHJ1ZSk7CisgICAgU2tUeXBlZmFjZSogZmFjZSA9IFNrVHlwZWZhY2U6OkNyZWF0ZUZyb21TdHJlYW0oc3RyZWFtKTsKKyAgICAvLyBTa1R5cGVGYWNlOjpDcmVhdGVGcm9tU3RyZWFtIGNhbGxzIHJlZigpIG9uIHRoZSBzdHJlYW0sIHNvIHdlCisgICAgLy8gbmVlZCB0byB1bnJlZiBpdCBoZXJlIG9yIGl0IHdvbid0IGJlIGZyZWVkIGxhdGVyIG9uCisgICAgc3RyZWFtLT51bnJlZigpOworCisgICAgcmV0dXJuIGZhY2U7CiB9CiAKIHN0YXRpYyBTa1R5cGVmYWNlKiBUeXBlZmFjZV9jcmVhdGVGcm9tRmlsZShKTklFbnYqIGVudiwgam9iamVjdCwganN0cmluZyBqcGF0aCkgewpkaWZmIC0tZ2l0IGEvY29yZS9qbmkvYW5kcm9pZF9ibHVldG9vdGhfU2NvU29ja2V0LmNwcCBiL2NvcmUvam5pL2FuZHJvaWRfYmx1ZXRvb3RoX1Njb1NvY2tldC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk0ZTQ0MDkuLjAwMDAwMDAKLS0tIGEvY29yZS9qbmkvYW5kcm9pZF9ibHVldG9vdGhfU2NvU29ja2V0LmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDY4OSArMCwwIEBACi0vKgotKiogQ29weXJpZ2h0IDIwMDgsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSoqCi0qKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotKioKLSoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSoqCi0qKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0qKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0qKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0qKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSovCi0KLSNkZWZpbmUgTE9HX1RBRyAiYmx1ZXRvb3RoX1Njb1NvY2tldC5jcHAiCi0KLSNpbmNsdWRlICJhbmRyb2lkX2JsdWV0b290aF9jb21tb24uaCIKLSNpbmNsdWRlICJhbmRyb2lkX3J1bnRpbWUvQW5kcm9pZFJ1bnRpbWUuaCIKLSNpbmNsdWRlICJKTklIZWxwLmgiCi0jaW5jbHVkZSAiam5pLmgiCi0jaW5jbHVkZSAidXRpbHMvTG9nLmgiCi0jaW5jbHVkZSAidXRpbHMvbWlzYy5oIgotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxlcnJuby5oPgotI2luY2x1ZGUgPHVuaXN0ZC5oPgotI2luY2x1ZGUgPHB0aHJlYWQuaD4KLSNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+Ci0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8c3lzL3Vpby5oPgotI2luY2x1ZGUgPHN5cy9wb2xsLmg+Ci0KLSNpZmRlZiBIQVZFX0JMVUVUT09USAotI2luY2x1ZGUgPGJsdWV0b290aC9ibHVldG9vdGguaD4KLSNpbmNsdWRlIDxibHVldG9vdGgvc2NvLmg+Ci0jaW5jbHVkZSA8Ymx1ZXRvb3RoL2hjaS5oPgotCi0jZGVmaW5lIE1BWF9MSU5FIDI1NQotCi0vKgotICogRGVmaW5lcyB0aGUgbW9kdWxlIHN0cmluZ3MgdXNlZCBpbiB0aGUgYmxhY2tsaXN0IGZpbGUuCi0gKiBUaGVzZSBhcmUgdXNlZCBieSBjb25zdW1lcnMgb2YgdGhlIGJsYWNrbGlzdCBmaWxlIHRvIHNlZSBpZiB0aGUgbGluZSBpcwotICogdXNlZCBieSB0aGF0IG1vZHVsZS4KLSAqLwotI2RlZmluZSBTQ09fQkxBQ0tMSVNUX01PRFVMRV9OQU1FICJzY29Tb2NrZXQiCi0KLQotLyogRGVmaW5lIHRoZSB0eXBlIHN0cmluZ3MgdXNlZCBpbiB0aGUgYmxhY2tsaXN0IGZpbGUuICovCi0jZGVmaW5lIEJMQUNLTElTVF9CWV9OQU1FICJuYW1lIgotI2RlZmluZSBCTEFDS0xJU1RfQllfUEFSVElBTF9OQU1FICJwYXJ0aWFsX25hbWUiCi0jZGVmaW5lIEJMQUNLTElTVF9CWV9PVUkgInZlbmRvcl9vdWkiCi0KLSNlbmRpZgotCi0vKiBJZGVhbGx5LCBibG9ja2luZyBJL08gb24gYSBTQ08gc29ja2V0IHdvdWxkIHJldHVybiB3aGVuIGFub3RoZXIgdGhyZWFkCi0gKiBjYWxscyBjbG9zZSgpLiBIb3dldmVyIGl0IGRvZXMgbm90IHJpZ2h0IG5vdywgaW4gZmFjdCBjbG9zZSgpIG9uIGEgU0NPCi0gKiBzb2NrZXQgaGFzIHN0cmFuZ2UgYmVoYXZpb3IgKHJldHVybnMgYSBib2d1cyB2YWx1ZSkgd2hlbiBvdGhlciB0aHJlYWRzCi0gKiBhcmUgcGVyZm9ybWluZyBibG9ja2luZyBJL08gb24gdGhhdCBzb2NrZXQuIFNvLCB0byB3b3JrYXJvdW5kLCB3ZSBhbHdheXMKLSAqIGNhbGwgY2xvc2UoKSBmcm9tIHRoZSBzYW1lIHRocmVhZCB0aGF0IGRvZXMgYmxvY2tpbmcgSS9PLiBUaGlzIHJlcXVpcmVzIHRoZQotICogdXNlIG9mIGEgc29ja2V0cGFpciB0byBzaWduYWwgdGhlIGJsb2NraW5nIEkvTyB0byBhYm9ydC4KLSAqCi0gKiBVbmZvcnR1bmF0ZWx5IEkgZG9uJ3Qga25vdyBhIHdheSB0byBhYm9ydCBjb25uZWN0KCkgeWV0LCBidXQgYXQgbGVhc3QgdGhpcwotICogdGltZXMgb3V0IGFmdGVyIHRoZSBCVCBwYWdlIHRpbWVvdXQgKDEwIHNlY29uZHMgY3VycmVudGx5KSwgc28gdGhlIHRocmVhZAotICogd2lsbCBkaWUgZXZlbnR1YWxseS4gVGhlIGZhY3QgdGhhdCB0aGUgdGhyZWFkIGNhbiBvdXRsaXZlCi0gKiB0aGUgSmF2YSBvYmplY3QgZm9yY2VzIHVzIHRvIHVzZSBhIG11dGV4IGluIGRlc3RvcnlOYXRpdmUoKS4KLSAqCi0gKiBUaGUgSk5JIEFQSSBpcyBlbnRpcmVseSBhc3luYy4KLSAqCi0gKiBBbHNvIG5vdGUgdGhpcyBjbGFzcyBkZWFscyBvbmx5IHdpdGggU0NPIGNvbm5lY3Rpb25zLCBub3Qgd2l0aCBkYXRhCi0gKiB0cmFuc21pc3Npb24uCi0gKi8KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLSNpZmRlZiBIQVZFX0JMVUVUT09USAotCi1zdGF0aWMgSmF2YVZNICpqdm07Ci1zdGF0aWMgamZpZWxkSUQgZmllbGRfbU5hdGl2ZURhdGE7Ci1zdGF0aWMgam1ldGhvZElEIG1ldGhvZF9vbkFjY2VwdGVkOwotc3RhdGljIGptZXRob2RJRCBtZXRob2Rfb25Db25uZWN0ZWQ7Ci1zdGF0aWMgam1ldGhvZElEIG1ldGhvZF9vbkNsb3NlZDsKLQotc3RydWN0IHRocmVhZF9kYXRhX3Q7Ci1zdGF0aWMgdm9pZCAqd29ya190aHJlYWQodm9pZCAqYXJnKTsKLXN0YXRpYyBpbnQgY29ubmVjdF93b3JrKGNvbnN0IGNoYXIgKmFkZHJlc3MsIHVpbnQxNl90IHNjb19wa3RfdHlwZSk7Ci1zdGF0aWMgaW50IGFjY2VwdF93b3JrKGludCBzaWduYWxfc2spOwotc3RhdGljIHZvaWQgd2FpdF9mb3JfY2xvc2UoaW50IHNrLCBpbnQgc2lnbmFsX3NrKTsKLXN0YXRpYyB2b2lkIGNsb3NlTmF0aXZlKEpOSUVudiAqZW52LCBqb2JqZWN0IG9iamVjdCk7Ci0KLXN0YXRpYyB2b2lkIHBhcnNlQmxhY2tsaXN0KHZvaWQpOwotc3RhdGljIHVpbnQxNl90IGdldFNjb1R5cGUoY2hhciAqYWRkcmVzcywgY29uc3QgY2hhciAqbmFtZSk7Ci0KLSNkZWZpbmUgQ09NUEFSRV9TVFJJTkcoa2V5LCBzKSAoIXN0cm5jbXAoa2V5LCBzLCBzdHJsZW4ocykpKQotCi0vKiBCbGFja2xpc3QgZGF0YSAqLwotdHlwZWRlZiBzdHJ1Y3Qgc2NvQmxhY2tsaXN0IHsKLSAgICBpbnQgZmllbGRUeXBlOwotICAgIGNoYXIgKnZhbHVlOwotICAgIHVpbnQxNl90IHNjb1R5cGU7Ci0gICAgc3RydWN0IHNjb0JsYWNrbGlzdCAqbmV4dDsKLX0gc2NvQmxhY2tsaXN0X3Q7Ci0KLSNkZWZpbmUgQkxfVFlQRV9OQU1FIDEgICAvLyBGaWVsZCB0eXBlIGlzIG5hbWUgc3RyaW5nCi0KLXN0YXRpYyBzY29CbGFja2xpc3RfdCAqYmxhY2tsaXN0ID0gTlVMTDsKLQotLyogc2hhcmVkIG5hdGl2ZSBkYXRhIC0gcHJvdGVjdGVkIGJ5IG11dGV4ICovCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgcHRocmVhZF9tdXRleF90IG11dGV4OwotICAgIGludCBzaWduYWxfc2s7ICAgICAgICAvLyBzb2NrZXQgdG8gc2lnbmFsIGJsb2NrZWQgSS9PIHRvIHVuYmxvY2sKLSAgICBqb2JqZWN0IG9iamVjdDsgICAgICAgLy8gSk5JIGdsb2JhbCByZWYgdG8gdGhlIEphdmEgb2JqZWN0Ci0gICAgdGhyZWFkX2RhdGFfdCAqdGhyZWFkX2RhdGE7ICAvLyBwb2ludGVyIHRvIHRocmVhZCBsb2NhbCBkYXRhCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBtYXggMSB0aHJlYWQgcGVyIHNjbyBzb2NrZXQKLX0gbmF0aXZlX2RhdGFfdDsKLQotLyogdGhyZWFkIGxvY2FsIGRhdGEgKi8KLXN0cnVjdCB0aHJlYWRfZGF0YV90IHsKLSAgICBuYXRpdmVfZGF0YV90ICpuYXQ7Ci0gICAgYm9vbCBpc19hY2NlcHQ7ICAgICAgICAvLyBhY2NlcHQgKGxpc3RlbmluZykgb3IgY29ubmVjdCAob3V0Z29pbmcpIHRocmVhZAotICAgIGludCBzaWduYWxfc2s7ICAgICAgICAgLy8gc29ja2V0IGZvciB0aHJlYWQgdG8gbGlzdGVuIGZvciB1bmJsb2NrIHNpZ25hbAotICAgIGNoYXIgYWRkcmVzc1tCVEFERFJfU0laRV07ICAvLyBCVCBhZGRyZXMgYXMgc3RyaW5nCi0gICAgdWludDE2X3Qgc2NvX3BrdF90eXBlOyAgIC8vIFNDTyBwYWNrZXQgdHlwZXMgc3VwcG9ydGVkCi19OwotCi1zdGF0aWMgaW5saW5lIG5hdGl2ZV9kYXRhX3QgKiBnZXRfbmF0aXZlX2RhdGEoSk5JRW52ICplbnYsIGpvYmplY3Qgb2JqZWN0KSB7Ci0gICAgcmV0dXJuIChuYXRpdmVfZGF0YV90ICopKGVudi0+R2V0SW50RmllbGQob2JqZWN0LCBmaWVsZF9tTmF0aXZlRGF0YSkpOwotfQotCi1zdGF0aWMgdWludDE2X3Qgc3RyMnNjb1R5cGUgKGNoYXIgKmtleSkgewotICAgIExPR1YoIiVzOiBrZXkgPSAlcyIsIF9fRlVOQ1RJT05fXywga2V5KTsKLSAgICBpZiAoQ09NUEFSRV9TVFJJTkcoa2V5LCAiRVNDT19IVjEiKSkKLSAgICAgICAgcmV0dXJuIEVTQ09fSFYxOwotICAgIGlmIChDT01QQVJFX1NUUklORyhrZXksICJFU0NPX0hWMiIpKQotICAgICAgICByZXR1cm4gRVNDT19IVjI7Ci0gICAgaWYgKENPTVBBUkVfU1RSSU5HKGtleSwgIkVTQ09fSFYzIikpCi0gICAgICAgIHJldHVybiBFU0NPX0hWMzsKLSAgICBpZiAoQ09NUEFSRV9TVFJJTkcoa2V5LCAiRVNDT19FVjMiKSkKLSAgICAgICAgcmV0dXJuIEVTQ09fRVYzOwotICAgIGlmIChDT01QQVJFX1NUUklORyhrZXksICJFU0NPX0VWNCIpKQotICAgICAgICByZXR1cm4gRVNDT19FVjQ7Ci0gICAgaWYgKENPTVBBUkVfU1RSSU5HKGtleSwgIkVTQ09fRVY1IikpCi0gICAgICAgIHJldHVybiBFU0NPX0VWNTsKLSAgICBpZiAoQ09NUEFSRV9TVFJJTkcoa2V5LCAiRVNDT18yRVYzIikpCi0gICAgICAgIHJldHVybiBFU0NPXzJFVjM7Ci0gICAgaWYgKENPTVBBUkVfU1RSSU5HKGtleSwgIkVTQ09fM0VWMyIpKQotICAgICAgICByZXR1cm4gRVNDT18zRVYzOwotICAgIGlmIChDT01QQVJFX1NUUklORyhrZXksICJFU0NPXzJFVjUiKSkKLSAgICAgICAgcmV0dXJuIEVTQ09fMkVWNTsKLSAgICBpZiAoQ09NUEFSRV9TVFJJTkcoa2V5LCAiRVNDT18zRVY1IikpCi0gICAgICAgIHJldHVybiBFU0NPXzNFVjU7Ci0gICAgaWYgKENPTVBBUkVfU1RSSU5HKGtleSwgIlNDT19FU0NPX01BU0siKSkKLSAgICAgICAgcmV0dXJuIFNDT19FU0NPX01BU0s7Ci0gICAgaWYgKENPTVBBUkVfU1RSSU5HKGtleSwgIkVEUl9FU0NPX01BU0siKSkKLSAgICAgICAgcmV0dXJuIEVEUl9FU0NPX01BU0s7Ci0gICAgaWYgKENPTVBBUkVfU1RSSU5HKGtleSwgIkFMTF9FU0NPX01BU0siKSkKLSAgICAgICAgcmV0dXJuIEFMTF9FU0NPX01BU0s7Ci0gICAgTE9HRSgiVW5rbm93biBTQ08gVHlwZSAoJXMpIHNraXBwaW5nIixrZXkpOwotICAgIHJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZCBwYXJzZUJsYWNrbGlzdCh2b2lkKSB7Ci0gICAgY29uc3QgY2hhciAqZmlsZW5hbWUgPSAiL2V0Yy9ibHVldG9vdGgvYmxhY2tsaXN0LmNvbmYiOwotICAgIGNoYXIgbGluZVtNQVhfTElORV07Ci0gICAgc2NvQmxhY2tsaXN0X3QgKmxpc3QgPSBOVUxMOwotICAgIHNjb0JsYWNrbGlzdF90ICpuZXdlbGVtOwotCi0gICAgTE9HVihfX0ZVTkNUSU9OX18pOwotCi0gICAgLyogT3BlbiBmaWxlICovCi0gICAgRklMRSAqZnAgPSBmb3BlbihmaWxlbmFtZSwgInIiKTsKLSAgICBpZighZnApIHsKLSAgICAgICAgTE9HRSgiRXJyb3IoJXMpb3BlbmluZyBibGFja2xpc3QgZmlsZSIsIHN0cmVycm9yKGVycm5vKSk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICB3aGlsZSAoZmdldHMobGluZSwgTUFYX0xJTkUsIGZwKSAhPSBOVUxMKSB7Ci0gICAgICAgIGlmICgoQ09NUEFSRV9TVFJJTkcobGluZSwgIi8vIikpIHx8ICghc3RyY21wKGxpbmUsICIiKSkpCi0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgY2hhciAqbW9kdWxlID0gc3RydG9rKGxpbmUsIjoiKTsKLSAgICAgICAgaWYgKENPTVBBUkVfU1RSSU5HKG1vZHVsZSwgU0NPX0JMQUNLTElTVF9NT0RVTEVfTkFNRSkpIHsKLSAgICAgICAgICAgIG5ld2VsZW0gPSAoc2NvQmxhY2tsaXN0X3QgKiljYWxsb2MoMSwgc2l6ZW9mKHNjb0JsYWNrbGlzdF90KSk7Ci0gICAgICAgICAgICBpZiAobmV3ZWxlbSA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgTE9HRSgiJXM6IG91dCBvZiBtZW1vcnkhIiwgX19GVU5DVElPTl9fKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBwYXJzZSBsaW5lCi0gICAgICAgICAgICBjaGFyICp0eXBlID0gc3RydG9rKE5VTEwsICIsIik7Ci0gICAgICAgICAgICBjaGFyICp2YWx1ZUxpc3QgPSBzdHJ0b2soTlVMTCwgIiwiKTsKLSAgICAgICAgICAgIGNoYXIgKnBhcmFtTGlzdCA9IHN0cnRvayhOVUxMLCAiLCIpOwotICAgICAgICAgICAgaWYgKENPTVBBUkVfU1RSSU5HKHR5cGUsIEJMQUNLTElTVF9CWV9OQU1FKSkgewotICAgICAgICAgICAgICAgIC8vIEV4dHJhY3QgTmFtZSBmcm9tIFZhbHVlIGxpc3QKLSAgICAgICAgICAgICAgICBuZXdlbGVtLT5maWVsZFR5cGUgPSBCTF9UWVBFX05BTUU7Ci0gICAgICAgICAgICAgICAgbmV3ZWxlbS0+dmFsdWUgPSAoY2hhciAqKWNhbGxvYygxLCBzdHJsZW4odmFsdWVMaXN0KSk7Ci0gICAgICAgICAgICAgICAgaWYgKG5ld2VsZW0tPnZhbHVlID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAgICAgTE9HRSgiJXM6IG91dCBvZiBtZW1vcnkhIiwgX19GVU5DVElPTl9fKTsKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHZhbHVlTGlzdCsrOyAgLy8gU2tpcCBvcGVuIHF1b3RlCi0gICAgICAgICAgICAgICAgc3RybmNweShuZXdlbGVtLT52YWx1ZSwgdmFsdWVMaXN0LCBzdHJsZW4odmFsdWVMaXN0KSAtIDEpOwotCi0gICAgICAgICAgICAgICAgLy8gR2V0IFNjbyBTZXR0aW5ncyBmcm9tIFBhcmFtZXRlcnMKLSAgICAgICAgICAgICAgICBjaGFyICpwYXJhbSA9IHN0cnRvayhwYXJhbUxpc3QsICI7Iik7Ci0gICAgICAgICAgICAgICAgdWludDE2X3Qgc2NvVHlwZXMgPSAwOwotICAgICAgICAgICAgICAgIHdoaWxlIChwYXJhbSAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IHNjbzsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHBhcmFtWzBdID09ICctJykgewotICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW0rKzsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNjbyA9IHN0cjJzY29UeXBlKHBhcmFtKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzY28gIT0gMCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY29UeXBlcyAmPSB+c2NvOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHBhcmFtWzBdID09ICcrJykgewotICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW0rKzsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNjbyA9IHN0cjJzY29UeXBlKHBhcmFtKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzY28gIT0gMCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY29UeXBlcyB8PSBzY287Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocGFyYW1bMF0gPT0gJz0nKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwYXJhbSsrOwotICAgICAgICAgICAgICAgICAgICAgICAgc2NvID0gc3RyMnNjb1R5cGUocGFyYW0pOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNjbyAhPSAwKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjb1R5cGVzID0gc2NvOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgTE9HRSgiSW52YWxpZCBTQ08gdHlwZSBtdXN0IGJlID0sICsgb3IgLSIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHBhcmFtID0gc3RydG9rKE5VTEwsICI7Iik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG5ld2VsZW0tPnNjb1R5cGUgPSBzY29UeXBlczsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgTE9HRSgiVW5rbm93biBTQ08gdHlwZSBlbnRyeSBpbiBCbGFja2xpc3QgZmlsZSIpOwotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGxpc3QpIHsKLSAgICAgICAgICAgICAgICBsaXN0LT5uZXh0ID0gbmV3ZWxlbTsKLSAgICAgICAgICAgICAgICBsaXN0ID0gbmV3ZWxlbTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgYmxhY2tsaXN0ID0gbGlzdCA9IG5ld2VsZW07Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBMT0dJKCJFbnRyeSBuYW1lID0gJXMgU2NvVHlwZXMgPSAweCV4IiwgbmV3ZWxlbS0+dmFsdWUsCi0gICAgICAgICAgICAgICAgIG5ld2VsZW0tPnNjb1R5cGUpOwotICAgICAgICB9Ci0gICAgfQotICAgIGZjbG9zZShmcCk7Ci0gICAgcmV0dXJuOwotfQotc3RhdGljIHVpbnQxNl90IGdldFNjb1R5cGUoY2hhciAqYWRkcmVzcywgY29uc3QgY2hhciAqbmFtZSkgewotICAgIHVpbnQxNl90IHJldCA9IDA7Ci0gICAgc2NvQmxhY2tsaXN0X3QgKmxpc3QgPSBibGFja2xpc3Q7Ci0KLSAgICB3aGlsZSAobGlzdCAhPSBOVUxMKSB7Ci0gICAgICAgIGlmIChsaXN0LT5maWVsZFR5cGUgPT0gQkxfVFlQRV9OQU1FKSB7Ci0gICAgICAgICAgICBpZiAoQ09NUEFSRV9TVFJJTkcobmFtZSwgbGlzdC0+dmFsdWUpKSB7Ci0gICAgICAgICAgICAgICAgcmV0ID0gbGlzdC0+c2NvVHlwZTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBsaXN0ID0gbGlzdC0+bmV4dDsKLSAgICB9Ci0gICAgTE9HSSgiJXMgJXMgLSAweCV4IiwgIF9fRlVOQ1RJT05fXywgbmFtZSwgcmV0KTsKLSAgICByZXR1cm4gcmV0OwotfQotI2VuZGlmCi0KLXN0YXRpYyB2b2lkIGNsYXNzSW5pdE5hdGl2ZShKTklFbnYqIGVudiwgamNsYXNzIGNsYXp6KSB7Ci0gICAgTE9HVihfX0ZVTkNUSU9OX18pOwotI2lmZGVmIEhBVkVfQkxVRVRPT1RICi0gICAgaWYgKGVudi0+R2V0SmF2YVZNKCZqdm0pIDwgMCkgewotICAgICAgICBMT0dFKCJDb3VsZCBub3QgZ2V0IGhhbmRsZSB0byB0aGUgVk0iKTsKLSAgICB9Ci0gICAgZmllbGRfbU5hdGl2ZURhdGEgPSBnZXRfZmllbGQoZW52LCBjbGF6eiwgIm1OYXRpdmVEYXRhIiwgIkkiKTsKLSAgICBtZXRob2Rfb25BY2NlcHRlZCA9IGVudi0+R2V0TWV0aG9kSUQoY2xhenosICJvbkFjY2VwdGVkIiwgIihJKVYiKTsKLSAgICBtZXRob2Rfb25Db25uZWN0ZWQgPSBlbnYtPkdldE1ldGhvZElEKGNsYXp6LCAib25Db25uZWN0ZWQiLCAiKEkpViIpOwotICAgIG1ldGhvZF9vbkNsb3NlZCA9IGVudi0+R2V0TWV0aG9kSUQoY2xhenosICJvbkNsb3NlZCIsICIoKVYiKTsKLQotICAgIC8qIFJlYWQgdGhlIGJsYWNrbGlzdCBmaWxlIGluIGhlcmUgKi8KLSAgICBwYXJzZUJsYWNrbGlzdCgpOwotI2VuZGlmCi19Ci0KLS8qIFJldHVybnMgZmFsc2UgaWYgYSBzZXJpb3VzIGVycm9yIG9jY3VyZWQgKi8KLXN0YXRpYyBqYm9vbGVhbiBpbml0TmF0aXZlKEpOSUVudiogZW52LCBqb2JqZWN0IG9iamVjdCkgewotICAgIExPR1YoX19GVU5DVElPTl9fKTsKLSNpZmRlZiBIQVZFX0JMVUVUT09USAotCi0gICAgbmF0aXZlX2RhdGFfdCAqbmF0ID0gKG5hdGl2ZV9kYXRhX3QgKikgY2FsbG9jKDEsIHNpemVvZihuYXRpdmVfZGF0YV90KSk7Ci0gICAgaWYgKG5hdCA9PSBOVUxMKSB7Ci0gICAgICAgIExPR0UoIiVzOiBvdXQgb2YgbWVtb3J5ISIsIF9fRlVOQ1RJT05fXyk7Ci0gICAgICAgIHJldHVybiBKTklfRkFMU0U7Ci0gICAgfQotCi0gICAgcHRocmVhZF9tdXRleF9pbml0KCZuYXQtPm11dGV4LCBOVUxMKTsKLSAgICBlbnYtPlNldEludEZpZWxkKG9iamVjdCwgZmllbGRfbU5hdGl2ZURhdGEsIChqaW50KW5hdCk7Ci0gICAgbmF0LT5zaWduYWxfc2sgPSAtMTsKLSAgICBuYXQtPm9iamVjdCA9IE5VTEw7Ci0gICAgbmF0LT50aHJlYWRfZGF0YSA9IE5VTEw7Ci0KLSNlbmRpZgotICAgIHJldHVybiBKTklfVFJVRTsKLX0KLQotc3RhdGljIHZvaWQgZGVzdHJveU5hdGl2ZShKTklFbnYqIGVudiwgam9iamVjdCBvYmplY3QpIHsKLSAgICBMT0dWKF9fRlVOQ1RJT05fXyk7Ci0jaWZkZWYgSEFWRV9CTFVFVE9PVEgKLSAgICBuYXRpdmVfZGF0YV90ICpuYXQgPSBnZXRfbmF0aXZlX2RhdGEoZW52LCBvYmplY3QpOwotICAgIAotICAgIGNsb3NlTmF0aXZlKGVudiwgb2JqZWN0KTsKLSAgICAKLSAgICBwdGhyZWFkX211dGV4X2xvY2soJm5hdC0+bXV0ZXgpOwotICAgIGlmIChuYXQtPnRocmVhZF9kYXRhICE9IE5VTEwpIHsKLSAgICAgICAgbmF0LT50aHJlYWRfZGF0YS0+bmF0ID0gTlVMTDsKLSAgICB9Ci0gICAgcHRocmVhZF9tdXRleF91bmxvY2soJm5hdC0+bXV0ZXgpOwotICAgIHB0aHJlYWRfbXV0ZXhfZGVzdHJveSgmbmF0LT5tdXRleCk7Ci0KLSAgICBmcmVlKG5hdCk7Ci0jZW5kaWYKLX0KLQotc3RhdGljIGpib29sZWFuIGFjY2VwdE5hdGl2ZShKTklFbnYgKmVudiwgam9iamVjdCBvYmplY3QpIHsKLSAgICBMT0dWKF9fRlVOQ1RJT05fXyk7Ci0jaWZkZWYgSEFWRV9CTFVFVE9PVEgKLSAgICBuYXRpdmVfZGF0YV90ICpuYXQgPSBnZXRfbmF0aXZlX2RhdGEoZW52LCBvYmplY3QpOwotICAgIGludCBzaWduYWxfc2tzWzJdOwotICAgIHB0aHJlYWRfdCB0aHJlYWQ7Ci0gICAgc3RydWN0IHRocmVhZF9kYXRhX3QgKmRhdGEgPSBOVUxMOwotCi0gICAgcHRocmVhZF9tdXRleF9sb2NrKCZuYXQtPm11dGV4KTsKLSAgICBpZiAobmF0LT5zaWduYWxfc2sgIT0gLTEpIHsKLSAgICAgICAgcHRocmVhZF9tdXRleF91bmxvY2soJm5hdC0+bXV0ZXgpOwotICAgICAgICByZXR1cm4gSk5JX0ZBTFNFOwotICAgIH0KLQotICAgIC8vIHNldHVwIHNvY2tldHBhaXIgdG8gcGFzcyBtZXNzYWdlcyBiZXR3ZWVuIHRocmVhZHMKLSAgICBpZiAoc29ja2V0cGFpcihBRl9VTklYLCBTT0NLX1NUUkVBTSwgMCwgc2lnbmFsX3NrcykgPCAwKSB7Ci0gICAgICAgIExPR0UoIiVzOiBzb2NrZXRwYWlyKCkgZmFpbGVkOiAlcyIsIF9fRlVOQ1RJT05fXywgc3RyZXJyb3IoZXJybm8pKTsKLSAgICAgICAgcHRocmVhZF9tdXRleF91bmxvY2soJm5hdC0+bXV0ZXgpOwotICAgICAgICByZXR1cm4gSk5JX0ZBTFNFOwotICAgIH0KLSAgICBuYXQtPnNpZ25hbF9zayA9IHNpZ25hbF9za3NbMF07Ci0gICAgbmF0LT5vYmplY3QgPSBlbnYtPk5ld0dsb2JhbFJlZihvYmplY3QpOwotCi0gICAgZGF0YSA9ICh0aHJlYWRfZGF0YV90ICopY2FsbG9jKDEsIHNpemVvZih0aHJlYWRfZGF0YV90KSk7Ci0gICAgaWYgKGRhdGEgPT0gTlVMTCkgewotICAgICAgICBMT0dFKCIlczogb3V0IG9mIG1lbW9yeSIsIF9fRlVOQ1RJT05fXyk7Ci0gICAgICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZuYXQtPm11dGV4KTsKLSAgICAgICAgcmV0dXJuIEpOSV9GQUxTRTsKLSAgICB9Ci0gICAgbmF0LT50aHJlYWRfZGF0YSA9IGRhdGE7Ci0gICAgcHRocmVhZF9tdXRleF91bmxvY2soJm5hdC0+bXV0ZXgpOwotCi0gICAgZGF0YS0+c2lnbmFsX3NrID0gc2lnbmFsX3Nrc1sxXTsKLSAgICBkYXRhLT5uYXQgPSBuYXQ7Ci0gICAgZGF0YS0+aXNfYWNjZXB0ID0gdHJ1ZTsKLQotICAgIGlmIChwdGhyZWFkX2NyZWF0ZSgmdGhyZWFkLCBOVUxMLCAmd29ya190aHJlYWQsICh2b2lkICopZGF0YSkgPCAwKSB7Ci0gICAgICAgIExPR0UoIiVzOiBwdGhyZWFkX2NyZWF0ZSgpIGZhaWxlZDogJXMiLCBfX0ZVTkNUSU9OX18sIHN0cmVycm9yKGVycm5vKSk7Ci0gICAgICAgIHJldHVybiBKTklfRkFMU0U7Ci0gICAgfQotICAgIHJldHVybiBKTklfVFJVRTsKLQotI2VuZGlmCi0gICAgcmV0dXJuIEpOSV9GQUxTRTsKLX0KLQotc3RhdGljIGpib29sZWFuIGNvbm5lY3ROYXRpdmUoSk5JRW52ICplbnYsIGpvYmplY3Qgb2JqZWN0LCBqc3RyaW5nIGFkZHJlc3MsCi0gICAgICAgIGpzdHJpbmcgbmFtZSkgewotCi0gICAgTE9HVihfX0ZVTkNUSU9OX18pOwotI2lmZGVmIEhBVkVfQkxVRVRPT1RICi0gICAgbmF0aXZlX2RhdGFfdCAqbmF0ID0gZ2V0X25hdGl2ZV9kYXRhKGVudiwgb2JqZWN0KTsKLSAgICBpbnQgc2lnbmFsX3Nrc1syXTsKLSAgICBwdGhyZWFkX3QgdGhyZWFkOwotICAgIHN0cnVjdCB0aHJlYWRfZGF0YV90ICpkYXRhOwotICAgIGNvbnN0IGNoYXIgKmNfYWRkcmVzczsKLSAgICBjb25zdCBjaGFyICpjX25hbWU7Ci0KLSAgICBwdGhyZWFkX211dGV4X2xvY2soJm5hdC0+bXV0ZXgpOwotICAgIGlmIChuYXQtPnNpZ25hbF9zayAhPSAtMSkgewotICAgICAgICBwdGhyZWFkX211dGV4X3VubG9jaygmbmF0LT5tdXRleCk7Ci0gICAgICAgIHJldHVybiBKTklfRkFMU0U7Ci0gICAgfQotCi0gICAgLy8gc2V0dXAgc29ja2V0cGFpciB0byBwYXNzIG1lc3NhZ2VzIGJldHdlZW4gdGhyZWFkcwotICAgIGlmIChzb2NrZXRwYWlyKEFGX1VOSVgsIFNPQ0tfU1RSRUFNLCAwLCBzaWduYWxfc2tzKSA8IDApIHsKLSAgICAgICAgTE9HRSgiJXM6IHNvY2tldHBhaXIoKSBmYWlsZWQ6ICVzXG4iLCBfX0ZVTkNUSU9OX18sIHN0cmVycm9yKGVycm5vKSk7Ci0gICAgICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZuYXQtPm11dGV4KTsKLSAgICAgICAgcmV0dXJuIEpOSV9GQUxTRTsKLSAgICB9Ci0gICAgbmF0LT5zaWduYWxfc2sgPSBzaWduYWxfc2tzWzBdOwotICAgIG5hdC0+b2JqZWN0ID0gZW52LT5OZXdHbG9iYWxSZWYob2JqZWN0KTsKLQotICAgIGRhdGEgPSAodGhyZWFkX2RhdGFfdCAqKWNhbGxvYygxLCBzaXplb2YodGhyZWFkX2RhdGFfdCkpOwotICAgIGlmIChkYXRhID09IE5VTEwpIHsKLSAgICAgICAgTE9HRSgiJXM6IG91dCBvZiBtZW1vcnkiLCBfX0ZVTkNUSU9OX18pOwotICAgICAgICBwdGhyZWFkX211dGV4X3VubG9jaygmbmF0LT5tdXRleCk7Ci0gICAgICAgIHJldHVybiBKTklfRkFMU0U7Ci0gICAgfQotICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZuYXQtPm11dGV4KTsKLQotICAgIGRhdGEtPnNpZ25hbF9zayA9IHNpZ25hbF9za3NbMV07Ci0gICAgZGF0YS0+bmF0ID0gbmF0OwotICAgIGNfYWRkcmVzcyA9IGVudi0+R2V0U3RyaW5nVVRGQ2hhcnMoYWRkcmVzcywgTlVMTCk7Ci0gICAgc3RybGNweShkYXRhLT5hZGRyZXNzLCBjX2FkZHJlc3MsIEJUQUREUl9TSVpFKTsKLSAgICBlbnYtPlJlbGVhc2VTdHJpbmdVVEZDaGFycyhhZGRyZXNzLCBjX2FkZHJlc3MpOwotICAgIGRhdGEtPmlzX2FjY2VwdCA9IGZhbHNlOwotCi0gICAgaWYgKG5hbWUgPT0gTlVMTCkgewotICAgICAgICBMT0dFKCIlczogTnVsbCBwb2ludGVyIHBhc3NlZCBpbiBmb3IgZGV2aWNlIG5hbWUiLCBfX0ZVTkNUSU9OX18pOwotICAgICAgICBkYXRhLT5zY29fcGt0X3R5cGUgPSAwOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGNfbmFtZSA9IGVudi0+R2V0U3RyaW5nVVRGQ2hhcnMobmFtZSwgTlVMTCk7Ci0gICAgICAgIC8qIFNlZSBpZiB0aGlzIGRldmljZSBpcyBpbiB0aGUgYmxhY2sgbGlzdCAqLwotICAgICAgICBkYXRhLT5zY29fcGt0X3R5cGUgPSBnZXRTY29UeXBlKGRhdGEtPmFkZHJlc3MsIGNfbmFtZSk7Ci0gICAgICAgIGVudi0+UmVsZWFzZVN0cmluZ1VURkNoYXJzKG5hbWUsIGNfbmFtZSk7Ci0gICAgfQotICAgIGlmIChwdGhyZWFkX2NyZWF0ZSgmdGhyZWFkLCBOVUxMLCAmd29ya190aHJlYWQsICh2b2lkICopZGF0YSkgPCAwKSB7Ci0gICAgICAgIExPR0UoIiVzOiBwdGhyZWFkX2NyZWF0ZSgpIGZhaWxlZDogJXMiLCBfX0ZVTkNUSU9OX18sIHN0cmVycm9yKGVycm5vKSk7Ci0gICAgICAgIHJldHVybiBKTklfRkFMU0U7Ci0gICAgfQotICAgIHJldHVybiBKTklfVFJVRTsKLQotI2VuZGlmCi0gICAgcmV0dXJuIEpOSV9GQUxTRTsKLX0KLQotc3RhdGljIHZvaWQgY2xvc2VOYXRpdmUoSk5JRW52ICplbnYsIGpvYmplY3Qgb2JqZWN0KSB7Ci0gICAgTE9HVihfX0ZVTkNUSU9OX18pOwotI2lmZGVmIEhBVkVfQkxVRVRPT1RICi0gICAgbmF0aXZlX2RhdGFfdCAqbmF0ID0gZ2V0X25hdGl2ZV9kYXRhKGVudiwgb2JqZWN0KTsKLSAgICBpbnQgc2lnbmFsX3NrOwotCi0gICAgcHRocmVhZF9tdXRleF9sb2NrKCZuYXQtPm11dGV4KTsKLSAgICBzaWduYWxfc2sgPSBuYXQtPnNpZ25hbF9zazsKLSAgICBuYXQtPnNpZ25hbF9zayA9IC0xOwotICAgIGVudi0+RGVsZXRlR2xvYmFsUmVmKG5hdC0+b2JqZWN0KTsKLSAgICBuYXQtPm9iamVjdCA9IE5VTEw7Ci0gICAgcHRocmVhZF9tdXRleF91bmxvY2soJm5hdC0+bXV0ZXgpOwotCi0gICAgaWYgKHNpZ25hbF9zayA+PSAwKSB7Ci0gICAgICAgIExPR1YoIiVzOiBzaWduYWxfc2sgPSAlZCIsIF9fRlVOQ1RJT05fXywgc2lnbmFsX3NrKTsKLSAgICAgICAgdW5zaWduZWQgY2hhciBkdW1teTsKLSAgICAgICAgd3JpdGUoc2lnbmFsX3NrLCAmZHVtbXksIHNpemVvZihkdW1teSkpOwotICAgICAgICBjbG9zZShzaWduYWxfc2spOwotICAgIH0KLSNlbmRpZgotfQotCi0jaWZkZWYgSEFWRV9CTFVFVE9PVEgKLS8qIHRocmVhZCBlbnRyeSBwb2ludCAqLwotc3RhdGljIHZvaWQgKndvcmtfdGhyZWFkKHZvaWQgKmFyZykgewotICAgIEpOSUVudiogZW52OwotICAgIHRocmVhZF9kYXRhX3QgKmRhdGEgPSAodGhyZWFkX2RhdGFfdCAqKWFyZzsKLSAgICBpbnQgc2s7Ci0KLSAgICBMT0dWKF9fRlVOQ1RJT05fXyk7Ci0gICAgaWYgKGp2bS0+QXR0YWNoQ3VycmVudFRocmVhZCgmZW52LCBOVUxMKSAhPSBKTklfT0spIHsKLSAgICAgICAgTE9HRSgiJXM6IEF0dGFjaEN1cnJlbnRUaHJlYWQoKSBmYWlsZWQiLCBfX0ZVTkNUSU9OX18pOwotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgICAvKiBjb25uZWN0IHRoZSBTQ08gc29ja2V0ICovCi0gICAgaWYgKGRhdGEtPmlzX2FjY2VwdCkgewotICAgICAgICBMT0dWKCJTQ08gT0JKRUNUICVwIEFDQ0VQVCAjIyMjIyIsIGRhdGEtPm5hdC0+b2JqZWN0KTsKLSAgICAgICAgc2sgPSBhY2NlcHRfd29yayhkYXRhLT5zaWduYWxfc2spOwotICAgICAgICBMT0dWKCJTQ08gT0JKRUNUICVwIEVORCBBQ0NFUFQgKioqKioiLCBkYXRhLT5uYXQtPm9iamVjdCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgc2sgPSBjb25uZWN0X3dvcmsoZGF0YS0+YWRkcmVzcywgZGF0YS0+c2NvX3BrdF90eXBlKTsKLSAgICB9Ci0KLSAgICAvKiBjYWxsYmFjayB3aXRoIGNvbm5lY3Rpb24gcmVzdWx0ICovCi0gICAgaWYgKGRhdGEtPm5hdCA9PSBOVUxMKSB7Ci0gICAgICAgIExPR1YoIiVzOiBvYmplY3QgZGVzdHJveWVkISIsIF9fRlVOQ1RJT05fXyk7Ci0gICAgICAgIGdvdG8gZG9uZTsKLSAgICB9Ci0gICAgcHRocmVhZF9tdXRleF9sb2NrKCZkYXRhLT5uYXQtPm11dGV4KTsKLSAgICBpZiAoZGF0YS0+bmF0LT5vYmplY3QgPT0gTlVMTCkgewotICAgICAgICBwdGhyZWFkX211dGV4X3VubG9jaygmZGF0YS0+bmF0LT5tdXRleCk7Ci0gICAgICAgIExPR1YoIiVzOiBjYWxsYmFjayBjYW5jZWxsZWQiLCBfX0ZVTkNUSU9OX18pOwotICAgICAgICBnb3RvIGRvbmU7Ci0gICAgfQotICAgIGlmIChkYXRhLT5pc19hY2NlcHQpIHsKLSAgICAgICAgZW52LT5DYWxsVm9pZE1ldGhvZChkYXRhLT5uYXQtPm9iamVjdCwgbWV0aG9kX29uQWNjZXB0ZWQsIHNrKTsKLSAgICB9IGVsc2UgewotICAgICAgICBlbnYtPkNhbGxWb2lkTWV0aG9kKGRhdGEtPm5hdC0+b2JqZWN0LCBtZXRob2Rfb25Db25uZWN0ZWQsIHNrKTsKLSAgICB9Ci0gICAgcHRocmVhZF9tdXRleF91bmxvY2soJmRhdGEtPm5hdC0+bXV0ZXgpOwotCi0gICAgaWYgKHNrIDwgMCkgewotICAgICAgICBnb3RvIGRvbmU7Ci0gICAgfQotCi0gICAgTE9HVigiU0NPIE9CSkVDVCAlcCAlZCBDT05ORUNURUQgKysrICglcykiLCBkYXRhLT5uYXQtPm9iamVjdCwgc2ssCi0gICAgICAgICBkYXRhLT5pc19hY2NlcHQgPyAiaW4iIDogIm91dCIpOwotCi0gICAgLyogd2FpdCBmb3IgdGhlIHNvY2tldCB0byBjbG9zZSAqLwotICAgIExPR1YoIndhaXRfZm9yX2Nsb3NlKCkuLi4iKTsKLSAgICB3YWl0X2Zvcl9jbG9zZShzaywgZGF0YS0+c2lnbmFsX3NrKTsKLSAgICBMT0dWKCJ3YWl0X2Zvcl9jbG9zZSgpIHJldHVybmVkIik7Ci0KLSAgICAvKiBjYWxsYmFjayB3aXRoIGNsb3NlIHJlc3VsdCAqLwotICAgIGlmIChkYXRhLT5uYXQgPT0gTlVMTCkgewotICAgICAgICBMT0dWKCIlczogb2JqZWN0IGRlc3Ryb3llZCEiLCBfX0ZVTkNUSU9OX18pOwotICAgICAgICBnb3RvIGRvbmU7Ci0gICAgfQotICAgIHB0aHJlYWRfbXV0ZXhfbG9jaygmZGF0YS0+bmF0LT5tdXRleCk7Ci0gICAgaWYgKGRhdGEtPm5hdC0+b2JqZWN0ID09IE5VTEwpIHsKLSAgICAgICAgTE9HVigiJXM6IGNhbGxiYWNrIGNhbmNlbGxlZCIsIF9fRlVOQ1RJT05fXyk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgZW52LT5DYWxsVm9pZE1ldGhvZChkYXRhLT5uYXQtPm9iamVjdCwgbWV0aG9kX29uQ2xvc2VkKTsKLSAgICB9Ci0gICAgcHRocmVhZF9tdXRleF91bmxvY2soJmRhdGEtPm5hdC0+bXV0ZXgpOwotCi1kb25lOgotICAgIGlmIChzayA+PSAwKSB7Ci0gICAgICAgIGNsb3NlKHNrKTsKLSAgICAgICAgTE9HVigiU0NPIE9CSkVDVCAlcCAlZCBDTE9TRUQgLS0tICglcykiLCBkYXRhLT5uYXQtPm9iamVjdCwgc2ssIGRhdGEtPmlzX2FjY2VwdCA/ICJpbiIgOiAib3V0Iik7Ci0gICAgfQotICAgIGlmIChkYXRhLT5zaWduYWxfc2sgPj0gMCkgewotICAgICAgICBjbG9zZShkYXRhLT5zaWduYWxfc2spOwotICAgIH0KLSAgICBMT0dWKCJTQ08gc29ja2V0IGNsb3NlZCIpOwotCi0gICAgaWYgKGRhdGEtPm5hdCAhPSBOVUxMKSB7Ci0gICAgICAgIHB0aHJlYWRfbXV0ZXhfbG9jaygmZGF0YS0+bmF0LT5tdXRleCk7Ci0gICAgICAgIGVudi0+RGVsZXRlR2xvYmFsUmVmKGRhdGEtPm5hdC0+b2JqZWN0KTsKLSAgICAgICAgZGF0YS0+bmF0LT5vYmplY3QgPSBOVUxMOwotICAgICAgICBkYXRhLT5uYXQtPnRocmVhZF9kYXRhID0gTlVMTDsKLSAgICAgICAgcHRocmVhZF9tdXRleF91bmxvY2soJmRhdGEtPm5hdC0+bXV0ZXgpOwotICAgIH0KLQotICAgIGZyZWUoZGF0YSk7Ci0gICAgaWYgKGp2bS0+RGV0YWNoQ3VycmVudFRocmVhZCgpICE9IEpOSV9PSykgewotICAgICAgICBMT0dFKCIlczogRGV0YWNoQ3VycmVudFRocmVhZCgpIGZhaWxlZCIsIF9fRlVOQ1RJT05fXyk7Ci0gICAgfQotCi0gICAgTE9HVigid29ya190aHJlYWQoKSBkb25lIik7Ci0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLXN0YXRpYyBpbnQgYWNjZXB0X3dvcmsoaW50IHNpZ25hbF9zaykgewotICAgIExPR1YoX19GVU5DVElPTl9fKTsKLSAgICBpbnQgc2s7Ci0gICAgaW50IG5zazsKLSAgICBpbnQgYWRkcl9zejsKLSAgICBpbnQgbWF4X2ZkOwotICAgIGZkX3NldCBmZHM7Ci0gICAgc3RydWN0IHNvY2thZGRyX3NjbyBhZGRyOwotCi0gICAgc2sgPSBzb2NrZXQoUEZfQkxVRVRPT1RILCBTT0NLX1NFUVBBQ0tFVCwgQlRQUk9UT19TQ08pOwotICAgIGlmIChzayA8IDApIHsKLSAgICAgICAgTE9HRSgiJXMgc29ja2V0KCkgZmFpbGVkOiAlcyIsIF9fRlVOQ1RJT05fXywgc3RyZXJyb3IoZXJybm8pKTsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotICAgIG1lbXNldCgmYWRkciwgMCwgc2l6ZW9mKGFkZHIpKTsKLSAgICBhZGRyLnNjb19mYW1pbHkgPSBBRl9CTFVFVE9PVEg7Ci0gICAgbWVtY3B5KCZhZGRyLnNjb19iZGFkZHIsIEJEQUREUl9BTlksIHNpemVvZihiZGFkZHJfdCkpOwotICAgIGlmIChiaW5kKHNrLCAoc3RydWN0IHNvY2thZGRyICopICZhZGRyLCBzaXplb2YoYWRkcikpIDwgMCkgewotICAgICAgICBMT0dFKCIlcyBiaW5kKCkgZmFpbGVkOiAlcyIsIF9fRlVOQ1RJT05fXywgc3RyZXJyb3IoZXJybm8pKTsKLSAgICAgICAgZ290byBlcnJvcjsKLSAgICB9Ci0KLSAgICBpZiAobGlzdGVuKHNrLCAxKSkgewotICAgICAgICBMT0dFKCIlczogbGlzdGVuKCkgZmFpbGVkOiAlcyIsIF9fRlVOQ1RJT05fXywgc3RyZXJyb3IoZXJybm8pKTsKLSAgICAgICAgZ290byBlcnJvcjsKLSAgICB9Ci0KLSAgICBtZW1zZXQoJmFkZHIsIDAsIHNpemVvZihhZGRyKSk7Ci0gICAgYWRkcl9zeiA9IHNpemVvZihhZGRyKTsKLQotICAgIEZEX1pFUk8oJmZkcyk7Ci0gICAgRkRfU0VUKHNrLCAmZmRzKTsKLSAgICBGRF9TRVQoc2lnbmFsX3NrLCAmZmRzKTsKLQotICAgIG1heF9mZCA9IChzayA+IHNpZ25hbF9zaykgPyBzayA6IHNpZ25hbF9zazsKLSAgICBMT0dJKCJMaXN0ZW5pbmcgU0NPIHNvY2tldC4uLiIpOwotICAgIHdoaWxlIChzZWxlY3QobWF4X2ZkICsgMSwgJmZkcywgTlVMTCwgTlVMTCwgTlVMTCkgPCAwKSB7Ci0gICAgICAgIGlmIChlcnJubyAhPSBFSU5UUikgewotICAgICAgICAgICAgTE9HRSgiJXM6IHNlbGVjdCgpIGZhaWxlZDogJXMiLCBfX0ZVTkNUSU9OX18sIHN0cmVycm9yKGVycm5vKSk7Ci0gICAgICAgICAgICBnb3RvIGVycm9yOwotICAgICAgICB9Ci0gICAgICAgIExPR1YoIiVzOiBzZWxlY3QoKSBFSU5UUiwgcmV0cnlpbmciLCBfX0ZVTkNUSU9OX18pOwotICAgIH0KLSAgICBMT0dWKCJzZWxlY3QoKSByZXR1cm5lZCIpOwotICAgIGlmIChGRF9JU1NFVChzaWduYWxfc2ssICZmZHMpKSB7Ci0gICAgICAgIC8vIHNpZ25hbCB0byBjYW5jZWwgbGlzdGVuaW5nCi0gICAgICAgIExPR1YoImNhbmNlbGxlZCBsaXN0ZW5pbmcgc29ja2V0LCBjbG9zaW5nIik7Ci0gICAgICAgIGdvdG8gZXJyb3I7Ci0gICAgfQotICAgIGlmICghRkRfSVNTRVQoc2ssICZmZHMpKSB7Ci0gICAgICAgIExPR0UoImVycm9yOiBzZWxlY3QoKSByZXR1cm5lZCA+PSAwIHdpdGggbm8gZmRzIHNldCIpOwotICAgICAgICBnb3RvIGVycm9yOwotICAgIH0KLQotICAgIG5zayA9IGFjY2VwdChzaywgKHN0cnVjdCBzb2NrYWRkciAqKSZhZGRyLCAmYWRkcl9zeik7Ci0gICAgaWYgKG5zayA8IDApIHsKLSAgICAgICAgTE9HRSgiJXM6IGFjY2VwdCgpIGZhaWxlZDogJXMiLCBfX0ZVTkNUSU9OX18sIHN0cmVycm9yKGVycm5vKSk7Ci0gICAgICAgIGdvdG8gZXJyb3I7Ci0gICAgfQotICAgIExPR0koIkNvbm5lY3RlZCBTQ08gc29ja2V0IChpbmNvbWluZykiKTsKLSAgICBjbG9zZShzayk7ICAvLyBUaGUgbGlzdGVuaW5nIHNvY2tldAotCi0gICAgcmV0dXJuIG5zazsKLQotZXJyb3I6Ci0gICAgY2xvc2Uoc2spOwotCi0gICAgcmV0dXJuIC0xOwotfQotCi1zdGF0aWMgaW50IGNvbm5lY3Rfd29yayhjb25zdCBjaGFyICphZGRyZXNzLCB1aW50MTZfdCBzY29fcGt0X3R5cGUpIHsKLSAgICBMT0dWKF9fRlVOQ1RJT05fXyk7Ci0gICAgc3RydWN0IHNvY2thZGRyX3NjbyBhZGRyOwotICAgIGludCBzayA9IC0xOwotCi0gICAgc2sgPSBzb2NrZXQoUEZfQkxVRVRPT1RILCBTT0NLX1NFUVBBQ0tFVCwgQlRQUk9UT19TQ08pOwotICAgIGlmIChzayA8IDApIHsKLSAgICAgICAgTE9HRSgiJXM6IHNvY2tldCgpIGZhaWxlZDogJXMiLCBfX0ZVTkNUSU9OX18sIHN0cmVycm9yKGVycm5vKSk7Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0KLSAgICAvKiBCaW5kIHRvIGxvY2FsIGFkZHJlc3MgKi8KLSAgICBtZW1zZXQoJmFkZHIsIDAsIHNpemVvZihhZGRyKSk7Ci0gICAgYWRkci5zY29fZmFtaWx5ID0gQUZfQkxVRVRPT1RIOwotICAgIG1lbWNweSgmYWRkci5zY29fYmRhZGRyLCBCREFERFJfQU5ZLCBzaXplb2YoYmRhZGRyX3QpKTsKLSAgICBpZiAoYmluZChzaywgKHN0cnVjdCBzb2NrYWRkciAqKSAmYWRkciwgc2l6ZW9mKGFkZHIpKSA8IDApIHsKLSAgICAgICAgTE9HRSgiJXM6IGJpbmQoKSBmYWlsZWQ6ICVzIiwgX19GVU5DVElPTl9fLCBzdHJlcnJvcihlcnJubykpOwotICAgICAgICBnb3RvIGVycm9yOwotICAgIH0KLQotICAgIG1lbXNldCgmYWRkciwgMCwgc2l6ZW9mKGFkZHIpKTsKLSAgICBhZGRyLnNjb19mYW1pbHkgPSBBRl9CTFVFVE9PVEg7Ci0gICAgZ2V0X2JkYWRkcihhZGRyZXNzLCAmYWRkci5zY29fYmRhZGRyKTsKLSAgICBhZGRyLnNjb19wa3RfdHlwZSA9IHNjb19wa3RfdHlwZTsKLSAgICBMT0dJKCJDb25uZWN0aW5nIHRvIHNvY2tldCIpOwotICAgIHdoaWxlIChjb25uZWN0KHNrLCAoc3RydWN0IHNvY2thZGRyICopJmFkZHIsIHNpemVvZihhZGRyKSkgPCAwKSB7Ci0gICAgICAgIGlmIChlcnJubyAhPSBFSU5UUikgewotICAgICAgICAgICAgTE9HRSgiJXM6IGNvbm5lY3QoKSBmYWlsZWQ6ICVzIiwgX19GVU5DVElPTl9fLCBzdHJlcnJvcihlcnJubykpOwotICAgICAgICAgICAgZ290byBlcnJvcjsKLSAgICAgICAgfQotICAgICAgICBMT0dWKCIlczogY29ubmVjdCgpIEVJTlRSLCByZXRyeWluZyIsIF9fRlVOQ1RJT05fXyk7Ci0gICAgfQotICAgIExPR0koIlNDTyBzb2NrZXQgY29ubmVjdGVkIChvdXRnb2luZykiKTsKLQotICAgIHJldHVybiBzazsKLQotZXJyb3I6Ci0gICAgaWYgKHNrID49IDApIGNsb3NlKHNrKTsKLSAgICByZXR1cm4gLTE7Ci19Ci0KLXN0YXRpYyB2b2lkIHdhaXRfZm9yX2Nsb3NlKGludCBzaywgaW50IHNpZ25hbF9zaykgewotICAgIExPR1YoX19GVU5DVElPTl9fKTsKLSAgICBwb2xsZmQgcFsyXTsKLQotICAgIG1lbXNldChwLCAwLCAyICogc2l6ZW9mKHBvbGxmZCkpOwotICAgIHBbMF0uZmQgPSBzazsKLSAgICBwWzFdLmZkID0gc2lnbmFsX3NrOwotICAgIHBbMV0uZXZlbnRzID0gUE9MTElOIHwgUE9MTFBSSTsKLQotICAgIExPR1YoInBvbGwuLi4iKTsKLQotICAgIHdoaWxlIChwb2xsKHAsIDIsIC0xKSA8IDApIHsgIC8vIGJsb2NrcwotICAgICAgICBpZiAoZXJybm8gIT0gRUlOVFIpIHsKLSAgICAgICAgICAgIExPR0UoIiVzOiBwb2xsKCkgZmFpbGVkOiAlcyIsIF9fRlVOQ1RJT05fXywgc3RyZXJyb3IoZXJybm8pKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIExPR1YoIiVzOiBwb2xsKCkgRUlOVFIsIHJldHJ5aW5nIiwgX19GVU5DVElPTl9fKTsKLSAgICB9Ci0KLSAgICBMT0dWKCJwb2xsKCkgcmV0dXJuZWQiKTsKLX0KLSNlbmRpZgotCi1zdGF0aWMgSk5JTmF0aXZlTWV0aG9kIHNNZXRob2RzW10gPSB7Ci0gICAgeyJjbGFzc0luaXROYXRpdmUiLCAiKClWIiwgKHZvaWQqKWNsYXNzSW5pdE5hdGl2ZX0sCi0gICAgeyJpbml0TmF0aXZlIiwgIigpViIsICh2b2lkICopaW5pdE5hdGl2ZX0sCi0gICAgeyJkZXN0cm95TmF0aXZlIiwgIigpViIsICh2b2lkICopZGVzdHJveU5hdGl2ZX0sCi0gICAgeyJjb25uZWN0TmF0aXZlIiwgIihMamF2YS9sYW5nL1N0cmluZztMamF2YS9sYW5nL1N0cmluZzspWiIsICh2b2lkICopY29ubmVjdE5hdGl2ZX0sCi0gICAgeyJhY2NlcHROYXRpdmUiLCAiKClaIiwgKHZvaWQgKilhY2NlcHROYXRpdmV9LAotICAgIHsiY2xvc2VOYXRpdmUiLCAiKClWIiwgKHZvaWQgKiljbG9zZU5hdGl2ZX0sCi19OwotCi1pbnQgcmVnaXN0ZXJfYW5kcm9pZF9ibHVldG9vdGhfU2NvU29ja2V0KEpOSUVudiAqZW52KSB7Ci0gICAgcmV0dXJuIEFuZHJvaWRSdW50aW1lOjpyZWdpc3Rlck5hdGl2ZU1ldGhvZHMoZW52LAotICAgICAgICAgICAgImFuZHJvaWQvYmx1ZXRvb3RoL1Njb1NvY2tldCIsIHNNZXRob2RzLCBORUxFTShzTWV0aG9kcykpOwotfQotCi19IC8qIG5hbWVzcGFjZSBhbmRyb2lkICovCmRpZmYgLS1naXQgYS9jb3JlL2puaS9hbmRyb2lkX2JsdWV0b290aF9jb21tb24uY3BwIGIvY29yZS9qbmkvYW5kcm9pZF9ibHVldG9vdGhfY29tbW9uLmNwcAppbmRleCA0M2MzYTk1Li5hYWUwZjIxIDEwMDY0NAotLS0gYS9jb3JlL2puaS9hbmRyb2lkX2JsdWV0b290aF9jb21tb24uY3BwCisrKyBiL2NvcmUvam5pL2FuZHJvaWRfYmx1ZXRvb3RoX2NvbW1vbi5jcHAKQEAgLTY5LDYgKzY5LDE2IEBACiAgICAgeyJVVUlEcyIsIERCVVNfVFlQRV9BUlJBWX0sCiB9OwogCitzdGF0aWMgUHJvcGVydGllcyBpbnB1dF9wcm9wZXJ0aWVzW10gPSB7CisgICAgeyJDb25uZWN0ZWQiLCBEQlVTX1RZUEVfQk9PTEVBTn0sCit9OworCitzdGF0aWMgUHJvcGVydGllcyBwYW5fcHJvcGVydGllc1tdID0geworICAgIHsiQ29ubmVjdGVkIiwgREJVU19UWVBFX0JPT0xFQU59LAorICAgIHsiSW50ZXJmYWNlIiwgREJVU19UWVBFX1NUUklOR30sCisgICAgeyJVVUlEIiwgREJVU19UWVBFX1NUUklOR30sCit9OworCiB0eXBlZGVmIHVuaW9uIHsKICAgICBjaGFyICpzdHJfdmFsOwogICAgIGludCBpbnRfdmFsOwpAQCAtMTg3LDYgKzE5Nyw3IEBACiAgICAgZGJ1c19ib29sX3QgcmV0OwogICAgIHZhX2xpc3QgbHN0OwogICAgIHZhX3N0YXJ0KGxzdCwgZmlyc3RfYXJnX3R5cGUpOworCiAgICAgcmV0ID0gZGJ1c19mdW5jX2FyZ3NfYXN5bmNfdmFsaXN0KGVudiwgY29ubiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZW91dF9tcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwbHksIHVzZXIsIG5hdCwKQEAgLTY5OSw2ICs3MTAsMTYgQEAKICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHJlbW90ZV9kZXZpY2VfcHJvcGVydGllcykgLyBzaXplb2YoUHJvcGVydGllcykpOwogfQogCitqb2JqZWN0QXJyYXkgcGFyc2VfaW5wdXRfcHJvcGVydHlfY2hhbmdlKEpOSUVudiAqZW52LCBEQnVzTWVzc2FnZSAqbXNnKSB7CisgICAgcmV0dXJuIHBhcnNlX3Byb3BlcnR5X2NoYW5nZShlbnYsIG1zZywgKFByb3BlcnRpZXMgKikgJmlucHV0X3Byb3BlcnRpZXMsCisgICAgICAgICAgICAgICAgICAgIHNpemVvZihpbnB1dF9wcm9wZXJ0aWVzKSAvIHNpemVvZihQcm9wZXJ0aWVzKSk7Cit9CisKK2pvYmplY3RBcnJheSBwYXJzZV9wYW5fcHJvcGVydHlfY2hhbmdlKEpOSUVudiAqZW52LCBEQnVzTWVzc2FnZSAqbXNnKSB7CisgICAgcmV0dXJuIHBhcnNlX3Byb3BlcnR5X2NoYW5nZShlbnYsIG1zZywgKFByb3BlcnRpZXMgKikgJnBhbl9wcm9wZXJ0aWVzLAorICAgICAgICAgICAgICAgICAgICBzaXplb2YocGFuX3Byb3BlcnRpZXMpIC8gc2l6ZW9mKFByb3BlcnRpZXMpKTsKK30KKwogam9iamVjdEFycmF5IHBhcnNlX2FkYXB0ZXJfcHJvcGVydGllcyhKTklFbnYgKmVudiwgREJ1c01lc3NhZ2VJdGVyICppdGVyKSB7CiAgICAgcmV0dXJuIHBhcnNlX3Byb3BlcnRpZXMoZW52LCBpdGVyLCAoUHJvcGVydGllcyAqKSAmYWRhcHRlcl9wcm9wZXJ0aWVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihhZGFwdGVyX3Byb3BlcnRpZXMpIC8gc2l6ZW9mKFByb3BlcnRpZXMpKTsKQEAgLTcwOSw2ICs3MzAsMTEgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHJlbW90ZV9kZXZpY2VfcHJvcGVydGllcykgLyBzaXplb2YoUHJvcGVydGllcykpOwogfQogCitqb2JqZWN0QXJyYXkgcGFyc2VfaW5wdXRfcHJvcGVydGllcyhKTklFbnYgKmVudiwgREJ1c01lc3NhZ2VJdGVyICppdGVyKSB7CisgICAgcmV0dXJuIHBhcnNlX3Byb3BlcnRpZXMoZW52LCBpdGVyLCAoUHJvcGVydGllcyAqKSAmaW5wdXRfcHJvcGVydGllcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGlucHV0X3Byb3BlcnRpZXMpIC8gc2l6ZW9mKFByb3BlcnRpZXMpKTsKK30KKwogaW50IGdldF9iZGFkZHIoY29uc3QgY2hhciAqc3RyLCBiZGFkZHJfdCAqYmEpIHsKICAgICBjaGFyICpkID0gKChjaGFyICopYmEpICsgNSwgKmVuZHA7CiAgICAgaW50IGk7CmRpZmYgLS1naXQgYS9jb3JlL2puaS9hbmRyb2lkX2JsdWV0b290aF9jb21tb24uaCBiL2NvcmUvam5pL2FuZHJvaWRfYmx1ZXRvb3RoX2NvbW1vbi5oCmluZGV4IDM3OGJiNmYuLjkyMjJlMWEgMTAwNjQ0Ci0tLSBhL2NvcmUvam5pL2FuZHJvaWRfYmx1ZXRvb3RoX2NvbW1vbi5oCisrKyBiL2NvcmUvam5pL2FuZHJvaWRfYmx1ZXRvb3RoX2NvbW1vbi5oCkBAIC0xNjIsNiArMTYyLDkgQEAKIGpvYmplY3RBcnJheSBwYXJzZV9yZW1vdGVfZGV2aWNlX3Byb3BlcnRpZXMoSk5JRW52ICplbnYsIERCdXNNZXNzYWdlSXRlciAqaXRlcik7CiBqb2JqZWN0QXJyYXkgcGFyc2VfcmVtb3RlX2RldmljZV9wcm9wZXJ0eV9jaGFuZ2UoSk5JRW52ICplbnYsIERCdXNNZXNzYWdlICptc2cpOwogam9iamVjdEFycmF5IHBhcnNlX2FkYXB0ZXJfcHJvcGVydHlfY2hhbmdlKEpOSUVudiAqZW52LCBEQnVzTWVzc2FnZSAqbXNnKTsKK2pvYmplY3RBcnJheSBwYXJzZV9pbnB1dF9wcm9wZXJ0aWVzKEpOSUVudiAqZW52LCBEQnVzTWVzc2FnZUl0ZXIgKml0ZXIpOworam9iamVjdEFycmF5IHBhcnNlX2lucHV0X3Byb3BlcnR5X2NoYW5nZShKTklFbnYgKmVudiwgREJ1c01lc3NhZ2UgKm1zZyk7Citqb2JqZWN0QXJyYXkgcGFyc2VfcGFuX3Byb3BlcnR5X2NoYW5nZShKTklFbnYgKmVudiwgREJ1c01lc3NhZ2UgKm1zZyk7CiB2b2lkIGFwcGVuZF92YXJpYW50KERCdXNNZXNzYWdlSXRlciAqaXRlciwgaW50IHR5cGUsIHZvaWQgKnZhbCk7CiBpbnQgZ2V0X2JkYWRkcihjb25zdCBjaGFyICpzdHIsIGJkYWRkcl90ICpiYSk7CiB2b2lkIGdldF9iZGFkZHJfYXNfc3RyaW5nKGNvbnN0IGJkYWRkcl90ICpiYSwgY2hhciAqc3RyKTsKZGlmZiAtLWdpdCBhL2NvcmUvam5pL2FuZHJvaWRfZGF0YWJhc2VfQ3Vyc29yV2luZG93LmNwcCBiL2NvcmUvam5pL2FuZHJvaWRfZGF0YWJhc2VfQ3Vyc29yV2luZG93LmNwcAppbmRleCA5MTQ0OWJjLi4wNDBkYWMzIDEwMDY0NAotLS0gYS9jb3JlL2puaS9hbmRyb2lkX2RhdGFiYXNlX0N1cnNvcldpbmRvdy5jcHAKKysrIGIvY29yZS9qbmkvYW5kcm9pZF9kYXRhYmFzZV9DdXJzb3JXaW5kb3cuY3BwCkBAIC0yOSw3ICsyOSw3IEBACiAjaW5jbHVkZSA8c3RyaW5nLmg+CiAjaW5jbHVkZSA8dW5pc3RkLmg+CiAKLSNpbmNsdWRlICJDdXJzb3JXaW5kb3cuaCIKKyNpbmNsdWRlICJiaW5kZXIvQ3Vyc29yV2luZG93LmgiCiAjaW5jbHVkZSAic3FsaXRlM19leGNlcHRpb24uaCIKICNpbmNsdWRlICJhbmRyb2lkX3V0aWxfQmluZGVyLmgiCiAKQEAgLTIyNSw3MCArMjI1LDYgQEAKICAgICByZXR1cm4gTlVMTDsKIH0KIAotc3RhdGljIGpib29sZWFuIGlzQmxvYl9uYXRpdmUoSk5JRW52KiBlbnYsIGpvYmplY3Qgb2JqZWN0LCBqaW50IHJvdywgamludCBjb2x1bW4pCi17Ci0gICAgaW50MzJfdCBlcnI7Ci0gICAgQ3Vyc29yV2luZG93ICogd2luZG93ID0gR0VUX1dJTkRPVyhlbnYsIG9iamVjdCk7Ci1MT0dfV0lORE9XKCJDaGVja2luZyBpZiBjb2x1bW4gaXMgYSBibG9iIG9yIG51bGwgZm9yICVkLCVkIGZyb20gJXAiLCByb3csIGNvbHVtbiwgd2luZG93KTsKLQotICAgIGZpZWxkX3Nsb3RfdCBmaWVsZDsKLSAgICBlcnIgPSB3aW5kb3ctPnJlYWRfZmllbGRfc2xvdChyb3csIGNvbHVtbiwgJmZpZWxkKTsKLSAgICBpZiAoZXJyICE9IDApIHsKLSAgICAgICAgdGhyb3dFeGNlcHRpb25XaXRoUm93Q29sKGVudiwgcm93LCBjb2x1bW4pOwotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgICByZXR1cm4gZmllbGQudHlwZSA9PSBGSUVMRF9UWVBFX0JMT0IgfHwgZmllbGQudHlwZSA9PSBGSUVMRF9UWVBFX05VTEw7Ci19Ci0KLXN0YXRpYyBqYm9vbGVhbiBpc1N0cmluZ19uYXRpdmUoSk5JRW52KiBlbnYsIGpvYmplY3Qgb2JqZWN0LCBqaW50IHJvdywgamludCBjb2x1bW4pCi17Ci0gICAgaW50MzJfdCBlcnI7Ci0gICAgQ3Vyc29yV2luZG93ICogd2luZG93ID0gR0VUX1dJTkRPVyhlbnYsIG9iamVjdCk7Ci1MT0dfV0lORE9XKCJDaGVja2luZyBpZiBjb2x1bW4gaXMgYSBzdHJpbmcgb3IgbnVsbCBmb3IgJWQsJWQgZnJvbSAlcCIsIHJvdywgY29sdW1uLCB3aW5kb3cpOwotCi0gICAgZmllbGRfc2xvdF90IGZpZWxkOwotICAgIGVyciA9IHdpbmRvdy0+cmVhZF9maWVsZF9zbG90KHJvdywgY29sdW1uLCAmZmllbGQpOwotICAgIGlmIChlcnIgIT0gMCkgewotICAgICAgICB0aHJvd0V4Y2VwdGlvbldpdGhSb3dDb2woZW52LCByb3csIGNvbHVtbik7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICAgIHJldHVybiBmaWVsZC50eXBlID09IEZJRUxEX1RZUEVfU1RSSU5HIHx8IGZpZWxkLnR5cGUgPT0gRklFTERfVFlQRV9OVUxMOwotfQotCi1zdGF0aWMgamJvb2xlYW4gaXNJbnRlZ2VyX25hdGl2ZShKTklFbnYqIGVudiwgam9iamVjdCBvYmplY3QsIGppbnQgcm93LCBqaW50IGNvbHVtbikKLXsKLSAgICBpbnQzMl90IGVycjsKLSAgICBDdXJzb3JXaW5kb3cgKiB3aW5kb3cgPSBHRVRfV0lORE9XKGVudiwgb2JqZWN0KTsKLUxPR19XSU5ET1coIkNoZWNraW5nIGlmIGNvbHVtbiBpcyBhbiBpbnRlZ2VyIGZvciAlZCwlZCBmcm9tICVwIiwgcm93LCBjb2x1bW4sIHdpbmRvdyk7Ci0KLSAgICBmaWVsZF9zbG90X3QgZmllbGQ7Ci0gICAgZXJyID0gd2luZG93LT5yZWFkX2ZpZWxkX3Nsb3Qocm93LCBjb2x1bW4sICZmaWVsZCk7Ci0gICAgaWYgKGVyciAhPSAwKSB7Ci0gICAgICAgIHRocm93RXhjZXB0aW9uV2l0aFJvd0NvbChlbnYsIHJvdywgY29sdW1uKTsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gICAgcmV0dXJuIGZpZWxkLnR5cGUgPT0gRklFTERfVFlQRV9JTlRFR0VSOwotfQotCi1zdGF0aWMgamJvb2xlYW4gaXNGbG9hdF9uYXRpdmUoSk5JRW52KiBlbnYsIGpvYmplY3Qgb2JqZWN0LCBqaW50IHJvdywgamludCBjb2x1bW4pCi17Ci0gICAgaW50MzJfdCBlcnI7Ci0gICAgQ3Vyc29yV2luZG93ICogd2luZG93ID0gR0VUX1dJTkRPVyhlbnYsIG9iamVjdCk7Ci1MT0dfV0lORE9XKCJDaGVja2luZyBpZiBjb2x1bW4gaXMgYSBmbG9hdCBmb3IgJWQsJWQgZnJvbSAlcCIsIHJvdywgY29sdW1uLCB3aW5kb3cpOwotCi0gICAgZmllbGRfc2xvdF90IGZpZWxkOwotICAgIGVyciA9IHdpbmRvdy0+cmVhZF9maWVsZF9zbG90KHJvdywgY29sdW1uLCAmZmllbGQpOwotICAgIGlmIChlcnIgIT0gMCkgewotICAgICAgICB0aHJvd0V4Y2VwdGlvbldpdGhSb3dDb2woZW52LCByb3csIGNvbHVtbik7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICAgIHJldHVybiBmaWVsZC50eXBlID09IEZJRUxEX1RZUEVfRkxPQVQ7Ci19Ci0KIHN0YXRpYyBqc3RyaW5nIGdldFN0cmluZ19uYXRpdmUoSk5JRW52KiBlbnYsIGpvYmplY3Qgb2JqZWN0LCBqaW50IHJvdywgamludCBjb2x1bW4pCiB7CiAgICAgaW50MzJfdCBlcnI7CkBAIC00ODcsMTAgKzQyMyw5IEBACiAgICAgfQogfQogCi1zdGF0aWMgamJvb2xlYW4gaXNOdWxsX25hdGl2ZShKTklFbnYqIGVudiwgam9iamVjdCBvYmplY3QsIGppbnQgcm93LCBqaW50IGNvbHVtbikKK2Jvb2wgaXNOdWxsX25hdGl2ZShDdXJzb3JXaW5kb3cgKndpbmRvdywgamludCByb3csIGppbnQgY29sdW1uKQogewotICAgIEN1cnNvcldpbmRvdyAqIHdpbmRvdyA9IEdFVF9XSU5ET1coZW52LCBvYmplY3QpOwotTE9HX1dJTkRPVygiQ2hlY2tpbmcgZm9yIE5VTEwgYXQgJWQsJWQgZnJvbSAlcCIsIHJvdywgY29sdW1uLCB3aW5kb3cpOworICAgIExPR19XSU5ET1coIkNoZWNraW5nIGZvciBOVUxMIGF0ICVkLCVkIGZyb20gJXAiLCByb3csIGNvbHVtbiwgd2luZG93KTsKIAogICAgIGJvb2wgaXNOdWxsOwogICAgIGlmICh3aW5kb3ctPmdldE51bGwocm93LCBjb2x1bW4sICZpc051bGwpKSB7CkBAIC02NTIsNiArNTg3LDI2IEBACiAgICAgd2luZG93LT5mcmVlTGFzdFJvdygpOwogfQogCitzdGF0aWMgamludCBnZXRUeXBlX25hdGl2ZShKTklFbnYqIGVudiwgam9iamVjdCBvYmplY3QsIGppbnQgcm93LCBqaW50IGNvbHVtbikKK3sKKyAgICBpbnQzMl90IGVycjsKKyAgICBDdXJzb3JXaW5kb3cgKiB3aW5kb3cgPSBHRVRfV0lORE9XKGVudiwgb2JqZWN0KTsKKyAgICBMT0dfV0lORE9XKCJyZXR1cm5pbmcgY29sdW1uIHR5cGUgYWZmaW5pdHkgZm9yICVkLCVkIGZyb20gJXAiLCByb3csIGNvbHVtbiwgd2luZG93KTsKKworICAgIGlmIChpc051bGxfbmF0aXZlKHdpbmRvdywgcm93LCBjb2x1bW4pKSB7CisgICAgICByZXR1cm4gRklFTERfVFlQRV9OVUxMOworICAgIH0KKworICAgIGZpZWxkX3Nsb3RfdCBmaWVsZDsKKyAgICBlcnIgPSB3aW5kb3ctPnJlYWRfZmllbGRfc2xvdChyb3csIGNvbHVtbiwgJmZpZWxkKTsKKyAgICBpZiAoZXJyICE9IDApIHsKKyAgICAgICAgdGhyb3dFeGNlcHRpb25XaXRoUm93Q29sKGVudiwgcm93LCBjb2x1bW4pOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICByZXR1cm4gZmllbGQudHlwZTsKK30KKwogc3RhdGljIEpOSU5hdGl2ZU1ldGhvZCBzTWV0aG9kc1tdID0KIHsKICAgICAgLyogbmFtZSwgc2lnbmF0dXJlLCBmdW5jUHRyICovCkBAIC02NjIsMTEgKzYxNyw5IEBACiAgICAgeyJjbG9zZV9uYXRpdmUiLCAiKClWIiwgKHZvaWQgKiluYXRpdmVfY2xvc2V9LAogICAgIHsiZ2V0TG9uZ19uYXRpdmUiLCAiKElJKUoiLCAodm9pZCAqKWdldExvbmdfbmF0aXZlfSwKICAgICB7ImdldEJsb2JfbmF0aXZlIiwgIihJSSlbQiIsICh2b2lkICopZ2V0QmxvYl9uYXRpdmV9LAotICAgIHsiaXNCbG9iX25hdGl2ZSIsICIoSUkpWiIsICh2b2lkICopaXNCbG9iX25hdGl2ZX0sCiAgICAgeyJnZXRTdHJpbmdfbmF0aXZlIiwgIihJSSlMamF2YS9sYW5nL1N0cmluZzsiLCAodm9pZCAqKWdldFN0cmluZ19uYXRpdmV9LAogICAgIHsiY29weVN0cmluZ1RvQnVmZmVyX25hdGl2ZSIsICIoSUlJTGFuZHJvaWQvZGF0YWJhc2UvQ2hhckFycmF5QnVmZmVyOylbQyIsICh2b2lkICopY29weVN0cmluZ1RvQnVmZmVyX25hdGl2ZX0sCiAgICAgeyJnZXREb3VibGVfbmF0aXZlIiwgIihJSSlEIiwgKHZvaWQgKilnZXREb3VibGVfbmF0aXZlfSwKLSAgICB7ImlzTnVsbF9uYXRpdmUiLCAiKElJKVoiLCAodm9pZCAqKWlzTnVsbF9uYXRpdmV9LAogICAgIHsiZ2V0TnVtUm93c19uYXRpdmUiLCAiKClJIiwgKHZvaWQgKilnZXROdW1Sb3dzfSwKICAgICB7InNldE51bUNvbHVtbnNfbmF0aXZlIiwgIihJKVoiLCAodm9pZCAqKXNldE51bUNvbHVtbnN9LAogICAgIHsiYWxsb2NSb3dfbmF0aXZlIiwgIigpWiIsICh2b2lkICopYWxsb2NSb3d9LApAQCAtNjc2LDkgKzYyOSw3IEBACiAgICAgeyJwdXREb3VibGVfbmF0aXZlIiwgIihESUkpWiIsICh2b2lkICopcHV0RG91YmxlX25hdGl2ZX0sCiAgICAgeyJmcmVlTGFzdFJvd19uYXRpdmUiLCAiKClWIiwgKHZvaWQgKilmcmVlTGFzdFJvd30sCiAgICAgeyJwdXROdWxsX25hdGl2ZSIsICIoSUkpWiIsICh2b2lkICopcHV0TnVsbF9uYXRpdmV9LAotICAgIHsiaXNTdHJpbmdfbmF0aXZlIiwgIihJSSlaIiwgKHZvaWQgKilpc1N0cmluZ19uYXRpdmV9LAotICAgIHsiaXNGbG9hdF9uYXRpdmUiLCAiKElJKVoiLCAodm9pZCAqKWlzRmxvYXRfbmF0aXZlfSwKLSAgICB7ImlzSW50ZWdlcl9uYXRpdmUiLCAiKElJKVoiLCAodm9pZCAqKWlzSW50ZWdlcl9uYXRpdmV9LAorICAgIHsiZ2V0VHlwZV9uYXRpdmUiLCAiKElJKUkiLCAodm9pZCAqKWdldFR5cGVfbmF0aXZlfSwKIH07CiAKIGludCByZWdpc3Rlcl9hbmRyb2lkX2RhdGFiYXNlX0N1cnNvcldpbmRvdyhKTklFbnYgKiBlbnYpCmRpZmYgLS1naXQgYS9jb3JlL2puaS9hbmRyb2lkX2RhdGFiYXNlX1NRTGl0ZUNvbXBpbGVkU3FsLmNwcCBiL2NvcmUvam5pL2FuZHJvaWRfZGF0YWJhc2VfU1FMaXRlQ29tcGlsZWRTcWwuY3BwCmluZGV4IDhkMWMzOWUuLmRlNGM1YzggMTAwNjQ0Ci0tLSBhL2NvcmUvam5pL2FuZHJvaWRfZGF0YWJhc2VfU1FMaXRlQ29tcGlsZWRTcWwuY3BwCisrKyBiL2NvcmUvam5pL2FuZHJvaWRfZGF0YWJhc2VfU1FMaXRlQ29tcGlsZWRTcWwuY3BwCkBAIC05MSwyMiArOTEsMTEgQEAKICAgICBjb21waWxlKGVudiwgb2JqZWN0LCBHRVRfSEFORExFKGVudiwgb2JqZWN0KSwgc3FsU3RyaW5nKTsKIH0KIAotc3RhdGljIHZvaWQgbmF0aXZlX2ZpbmFsaXplKEpOSUVudiogZW52LCBqb2JqZWN0IG9iamVjdCkKLXsKLSAgICBpbnQgZXJyOwotICAgIHNxbGl0ZTNfc3RtdCAqIHN0YXRlbWVudCA9IEdFVF9TVEFURU1FTlQoZW52LCBvYmplY3QpOwotCi0gICAgaWYgKHN0YXRlbWVudCAhPSBOVUxMKSB7Ci0gICAgICAgIHNxbGl0ZTNfZmluYWxpemUoc3RhdGVtZW50KTsKLSAgICAgICAgZW52LT5TZXRJbnRGaWVsZChvYmplY3QsIGdTdGF0ZW1lbnRGaWVsZCwgMCk7Ci0gICAgfQotfQogCiBzdGF0aWMgSk5JTmF0aXZlTWV0aG9kIHNNZXRob2RzW10gPQogewogICAgICAvKiBuYW1lLCBzaWduYXR1cmUsIGZ1bmNQdHIgKi8KICAgICB7Im5hdGl2ZV9jb21waWxlIiwgIihMamF2YS9sYW5nL1N0cmluZzspViIsICh2b2lkICopbmF0aXZlX2NvbXBpbGV9LAotICAgIHsibmF0aXZlX2ZpbmFsaXplIiwgIigpViIsICh2b2lkICopbmF0aXZlX2ZpbmFsaXplfSwKIH07CiAKIGludCByZWdpc3Rlcl9hbmRyb2lkX2RhdGFiYXNlX1NRTGl0ZUNvbXBpbGVkU3FsKEpOSUVudiAqIGVudikKZGlmZiAtLWdpdCBhL2NvcmUvam5pL2FuZHJvaWRfZGF0YWJhc2VfU1FMaXRlRGF0YWJhc2UuY3BwIGIvY29yZS9qbmkvYW5kcm9pZF9kYXRhYmFzZV9TUUxpdGVEYXRhYmFzZS5jcHAKaW5kZXggMzYyMzRhOS4uZDkzMDA2NSAxMDA2NDQKLS0tIGEvY29yZS9qbmkvYW5kcm9pZF9kYXRhYmFzZV9TUUxpdGVEYXRhYmFzZS5jcHAKKysrIGIvY29yZS9qbmkvYW5kcm9pZF9kYXRhYmFzZV9TUUxpdGVEYXRhYmFzZS5jcHAKQEAgLTE1LDcgKzE1LDcgQEAKICAqLwogCiAjdW5kZWYgTE9HX1RBRwotI2RlZmluZSBMT0dfVEFHICJEYXRhYmFzZSIKKyNkZWZpbmUgTE9HX1RBRyAiU3FsaXRlRGF0YWJhc2VDcHAiCiAKICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KICNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+CkBAIC01MSw2ICs1MSw4IEBACiAvKiB1bmNvbW1lbnQgdGhlIG5leHQgbGluZSB0byBmb3JjZS1lbmFibGUgbG9nZ2luZyBvZiBhbGwgc3RhdGVtZW50cyAqLwogLy8gI2RlZmluZSBEQl9MT0dfU1RBVEVNRU5UUwogCisjZGVmaW5lIERFQlVHX0pOSSAwCisKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogZW51bSB7CkBAIC02Miw5ICs2NCwxMSBAQAogfTsKIAogc3RhdGljIGpmaWVsZElEIG9mZnNldF9kYl9oYW5kbGU7CitzdGF0aWMgam1ldGhvZElEIG1ldGhvZF9jdXN0b21fZnVuY3Rpb25fY2FsbGJhY2s7CitzdGF0aWMgamNsYXNzIHN0cmluZ19jbGFzcyA9IE5VTEw7CiAKLXN0YXRpYyBjaGFyICpjcmVhdGVTdHIoY29uc3QgY2hhciAqcGF0aCkgewotICAgIGludCBsZW4gPSBzdHJsZW4ocGF0aCk7CitzdGF0aWMgY2hhciAqY3JlYXRlU3RyKGNvbnN0IGNoYXIgKnBhdGgsIHNob3J0IGV4dHJhKSB7CisgICAgaW50IGxlbiA9IHN0cmxlbihwYXRoKSArIGV4dHJhOwogICAgIGNoYXIgKnN0ciA9IChjaGFyICopbWFsbG9jKGxlbiArIDEpOwogICAgIHN0cm5jcHkoc3RyLCBwYXRoLCBsZW4pOwogICAgIHN0cltsZW5dID0gTlVMTDsKQEAgLTg1LDcgKzg5LDcgQEAKICAgICB9CiAKICAgICBMT0dWKCJSZWdpc3RlcmluZyBzcWxpdGUgbG9nZ2luZyBmdW5jIFxuIik7Ci0gICAgaW50IGVyciA9IHNxbGl0ZTNfY29uZmlnKFNRTElURV9DT05GSUdfTE9HLCAmc3FsTG9nZ2VyLCAodm9pZCAqKWNyZWF0ZVN0cihwYXRoKSk7CisgICAgaW50IGVyciA9IHNxbGl0ZTNfY29uZmlnKFNRTElURV9DT05GSUdfTE9HLCAmc3FsTG9nZ2VyLCAodm9pZCAqKWNyZWF0ZVN0cihwYXRoLCAwKSk7CiAgICAgaWYgKGVyciAhPSBTUUxJVEVfT0spIHsKICAgICAgICAgTE9HRSgic3FsaXRlX2NvbmZpZyBmYWlsZWQgZXJyb3JfY29kZSA9ICVkLiBUSElTIFNIT1VMRCBORVZFUiBvY2N1ci5cbiIsIGVycik7CiAgICAgICAgIHJldHVybjsKQEAgLTE3NiwxMyArMTgwLDE3IEBACiAgICAgaWYgKGhhbmRsZSAhPSBOVUxMKSBzcWxpdGUzX2Nsb3NlKGhhbmRsZSk7CiB9CiAKLXN0YXRpYyBjaGFyICpnZXREYXRhYmFzZU5hbWUoSk5JRW52KiBlbnYsIHNxbGl0ZTMgKiBoYW5kbGUsIGpzdHJpbmcgZGF0YWJhc2VOYW1lKSB7CitzdGF0aWMgY2hhciAqZ2V0RGF0YWJhc2VOYW1lKEpOSUVudiogZW52LCBzcWxpdGUzICogaGFuZGxlLCBqc3RyaW5nIGRhdGFiYXNlTmFtZSwgc2hvcnQgY29ubk51bSkgewogICAgIGNoYXIgY29uc3QgKnBhdGggPSBlbnYtPkdldFN0cmluZ1VURkNoYXJzKGRhdGFiYXNlTmFtZSwgTlVMTCk7CiAgICAgaWYgKHBhdGggPT0gTlVMTCkgewogICAgICAgICBMT0dFKCJGYWlsdXJlIGluIGdldERhdGFiYXNlTmFtZSgpLiBWTSByYW4gb3V0IG9mIG1lbW9yeT9cbiIpOwogICAgICAgICByZXR1cm4gTlVMTDsgLy8gVk0gd291bGQgaGF2ZSB0aHJvd24gT3V0T2ZNZW1vcnlFcnJvcgogICAgIH0KLSAgICBjaGFyICpkYk5hbWVTdHIgPSBjcmVhdGVTdHIocGF0aCk7CisgICAgY2hhciAqZGJOYW1lU3RyID0gY3JlYXRlU3RyKHBhdGgsIDQpOworICAgIGlmIChjb25uTnVtID4gOTk5KSB7IC8vIFRPRE86IGlmIG51bWJlciBvZiBwb29sZWQgY29ubmVjdGlvbnMgPiA5OTksIGZpeCB0aGlzIGxpbmUuCisgICAgICBjb25uTnVtID0gLTE7CisgICAgfQorICAgIHNwcmludGYoZGJOYW1lU3RyICsgc3RybGVuKHBhdGgpLCAifCUwM2QiLCBjb25uTnVtKTsKICAgICBlbnYtPlJlbGVhc2VTdHJpbmdVVEZDaGFycyhkYXRhYmFzZU5hbWUsIHBhdGgpOwogICAgIHJldHVybiBkYk5hbWVTdHI7CiB9CkBAIC0xOTIsMTAgKzIwMCwxMCBAQAogfQogCiAvKiBwdWJsaWMgbmF0aXZlIHZvaWQgZW5hYmxlU3FsVHJhY2luZygpOyAqLwotc3RhdGljIHZvaWQgZW5hYmxlU3FsVHJhY2luZyhKTklFbnYqIGVudiwgam9iamVjdCBvYmplY3QsIGpzdHJpbmcgZGF0YWJhc2VOYW1lKQorc3RhdGljIHZvaWQgZW5hYmxlU3FsVHJhY2luZyhKTklFbnYqIGVudiwgam9iamVjdCBvYmplY3QsIGpzdHJpbmcgZGF0YWJhc2VOYW1lLCBqc2hvcnQgY29ublR5cGUpCiB7CiAgICAgc3FsaXRlMyAqIGhhbmRsZSA9IChzcWxpdGUzICopZW52LT5HZXRJbnRGaWVsZChvYmplY3QsIG9mZnNldF9kYl9oYW5kbGUpOwotICAgIHNxbGl0ZTNfdHJhY2UoaGFuZGxlLCAmc3FsVHJhY2UsICh2b2lkICopZ2V0RGF0YWJhc2VOYW1lKGVudiwgaGFuZGxlLCBkYXRhYmFzZU5hbWUpKTsKKyAgICBzcWxpdGUzX3RyYWNlKGhhbmRsZSwgJnNxbFRyYWNlLCAodm9pZCAqKWdldERhdGFiYXNlTmFtZShlbnYsIGhhbmRsZSwgZGF0YWJhc2VOYW1lLCBjb25uVHlwZSkpOwogfQogCiBzdGF0aWMgdm9pZCBzcWxQcm9maWxlKHZvaWQgKmRhdGFiYXNlTmFtZSwgY29uc3QgY2hhciAqc3FsLCBzcWxpdGUzX3VpbnQ2NCB0bSkgewpAQCAtMjA0LDEzICsyMTIsMTMgQEAKIH0KIAogLyogcHVibGljIG5hdGl2ZSB2b2lkIGVuYWJsZVNxbFByb2ZpbGluZygpOyAqLwotc3RhdGljIHZvaWQgZW5hYmxlU3FsUHJvZmlsaW5nKEpOSUVudiogZW52LCBqb2JqZWN0IG9iamVjdCwganN0cmluZyBkYXRhYmFzZU5hbWUpCitzdGF0aWMgdm9pZCBlbmFibGVTcWxQcm9maWxpbmcoSk5JRW52KiBlbnYsIGpvYmplY3Qgb2JqZWN0LCBqc3RyaW5nIGRhdGFiYXNlTmFtZSwganNob3J0IGNvbm5UeXBlKQogewogICAgIHNxbGl0ZTMgKiBoYW5kbGUgPSAoc3FsaXRlMyAqKWVudi0+R2V0SW50RmllbGQob2JqZWN0LCBvZmZzZXRfZGJfaGFuZGxlKTsKLSAgICBzcWxpdGUzX3Byb2ZpbGUoaGFuZGxlLCAmc3FsUHJvZmlsZSwgKHZvaWQgKilnZXREYXRhYmFzZU5hbWUoZW52LCBoYW5kbGUsIGRhdGFiYXNlTmFtZSkpOworICAgIHNxbGl0ZTNfcHJvZmlsZShoYW5kbGUsICZzcWxQcm9maWxlLCAodm9pZCAqKWdldERhdGFiYXNlTmFtZShlbnYsIGhhbmRsZSwgZGF0YWJhc2VOYW1lLAorICAgICAgICAgICAgY29ublR5cGUpKTsKIH0KIAotCiAvKiBwdWJsaWMgbmF0aXZlIHZvaWQgY2xvc2UoKTsgKi8KIHN0YXRpYyB2b2lkIGRiY2xvc2UoSk5JRW52KiBlbnYsIGpvYmplY3Qgb2JqZWN0KQogewpAQCAtMjQwLDczICsyNDgsNiBAQAogICAgIH0KIH0KIAotLyogcHVibGljIG5hdGl2ZSB2b2lkIG5hdGl2ZV9leGVjU1FMKFN0cmluZyBzcWwpOyAqLwotc3RhdGljIHZvaWQgbmF0aXZlX2V4ZWNTUUwoSk5JRW52KiBlbnYsIGpvYmplY3Qgb2JqZWN0LCBqc3RyaW5nIHNxbFN0cmluZykKLXsKLSAgICBpbnQgZXJyOwotICAgIGludCBzdGVwRXJyOwotICAgIHNxbGl0ZTNfc3RtdCAqIHN0YXRlbWVudCA9IE5VTEw7Ci0gICAgc3FsaXRlMyAqIGhhbmRsZSA9IChzcWxpdGUzICopZW52LT5HZXRJbnRGaWVsZChvYmplY3QsIG9mZnNldF9kYl9oYW5kbGUpOwotICAgIGpjaGFyIGNvbnN0ICogc3FsID0gZW52LT5HZXRTdHJpbmdDaGFycyhzcWxTdHJpbmcsIE5VTEwpOwotICAgIGpzaXplIHNxbExlbiA9IGVudi0+R2V0U3RyaW5nTGVuZ3RoKHNxbFN0cmluZyk7Ci0KLSAgICBpZiAoc3FsID09IE5VTEwgfHwgc3FsTGVuID09IDApIHsKLSAgICAgICAgam5pVGhyb3dFeGNlcHRpb24oZW52LCAiamF2YS9sYW5nL0lsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiIsICJZb3UgbXVzdCBzdXBwbHkgYW4gU1FMIHN0cmluZyIpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgZXJyID0gc3FsaXRlM19wcmVwYXJlMTZfdjIoaGFuZGxlLCBzcWwsIHNxbExlbiAqIDIsICZzdGF0ZW1lbnQsIE5VTEwpOwotCi0gICAgZW52LT5SZWxlYXNlU3RyaW5nQ2hhcnMoc3FsU3RyaW5nLCBzcWwpOwotCi0gICAgaWYgKGVyciAhPSBTUUxJVEVfT0spIHsKLSAgICAgICAgY2hhciBjb25zdCAqIHNxbDggPSBlbnYtPkdldFN0cmluZ1VURkNoYXJzKHNxbFN0cmluZywgTlVMTCk7Ci0gICAgICAgIExPR0UoIkZhaWx1cmUgJWQgKCVzKSBvbiAlcCB3aGVuIHByZXBhcmluZyAnJXMnLlxuIiwgZXJyLCBzcWxpdGUzX2Vycm1zZyhoYW5kbGUpLCBoYW5kbGUsIHNxbDgpOwotICAgICAgICB0aHJvd19zcWxpdGUzX2V4Y2VwdGlvbihlbnYsIGhhbmRsZSwgc3FsOCk7Ci0gICAgICAgIGVudi0+UmVsZWFzZVN0cmluZ1VURkNoYXJzKHNxbFN0cmluZywgc3FsOCk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBzdGVwRXJyID0gc3FsaXRlM19zdGVwKHN0YXRlbWVudCk7Ci0gICAgZXJyID0gc3FsaXRlM19maW5hbGl6ZShzdGF0ZW1lbnQpOwotCi0gICAgaWYgKHN0ZXBFcnIgIT0gU1FMSVRFX0RPTkUpIHsKLSAgICAgICAgaWYgKHN0ZXBFcnIgPT0gU1FMSVRFX1JPVykgewotICAgICAgICAgICAgdGhyb3dfc3FsaXRlM19leGNlcHRpb24oZW52LCAiUXVlcmllcyBjYW5ub3QgYmUgcGVyZm9ybWVkIHVzaW5nIGV4ZWNTUUwoKSwgdXNlIHF1ZXJ5KCkgaW5zdGVhZC4iKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGNoYXIgY29uc3QgKiBzcWw4ID0gZW52LT5HZXRTdHJpbmdVVEZDaGFycyhzcWxTdHJpbmcsIE5VTEwpOwotICAgICAgICAgICAgTE9HRSgiRmFpbHVyZSAlZCAoJXMpIG9uICVwIHdoZW4gZXhlY3V0aW5nICclcydcbiIsIGVyciwgc3FsaXRlM19lcnJtc2coaGFuZGxlKSwgaGFuZGxlLCBzcWw4KTsKLSAgICAgICAgICAgIHRocm93X3NxbGl0ZTNfZXhjZXB0aW9uKGVudiwgaGFuZGxlLCBzcWw4KTsKLSAgICAgICAgICAgIGVudi0+UmVsZWFzZVN0cmluZ1VURkNoYXJzKHNxbFN0cmluZywgc3FsOCk7Ci0KLSAgICAgICAgfQotICAgIH0gZWxzZQotI2lmbmRlZiBEQl9MT0dfU1RBVEVNRU5UUwotICAgIElGX0xPR1YoKQotI2VuZGlmCi0gICAgewotICAgICAgICBjaGFyIGNvbnN0ICogc3FsOCA9IGVudi0+R2V0U3RyaW5nVVRGQ2hhcnMoc3FsU3RyaW5nLCBOVUxMKTsKLSAgICAgICAgTE9HVigiU3VjY2VzcyBvbiAlcCB3aGVuIGV4ZWN1dGluZyAnJXMnXG4iLCBoYW5kbGUsIHNxbDgpOwotICAgICAgICBlbnYtPlJlbGVhc2VTdHJpbmdVVEZDaGFycyhzcWxTdHJpbmcsIHNxbDgpOwotICAgIH0KLX0KLQotLyogbmF0aXZlIGxvbmcgbGFzdEluc2VydFJvdygpOyAqLwotc3RhdGljIGpsb25nIGxhc3RJbnNlcnRSb3coSk5JRW52KiBlbnYsIGpvYmplY3Qgb2JqZWN0KQotewotICAgIHNxbGl0ZTMgKiBoYW5kbGUgPSAoc3FsaXRlMyAqKWVudi0+R2V0SW50RmllbGQob2JqZWN0LCBvZmZzZXRfZGJfaGFuZGxlKTsKLQotICAgIHJldHVybiBzcWxpdGUzX2xhc3RfaW5zZXJ0X3Jvd2lkKGhhbmRsZSk7Ci19Ci0KLS8qIG5hdGl2ZSBpbnQgbGFzdENoYW5nZUNvdW50KCk7ICovCi1zdGF0aWMgamludCBsYXN0Q2hhbmdlQ291bnQoSk5JRW52KiBlbnYsIGpvYmplY3Qgb2JqZWN0KQotewotICAgIHNxbGl0ZTMgKiBoYW5kbGUgPSAoc3FsaXRlMyAqKWVudi0+R2V0SW50RmllbGQob2JqZWN0LCBvZmZzZXRfZGJfaGFuZGxlKTsKLQotICAgIHJldHVybiBzcWxpdGUzX2NoYW5nZXMoaGFuZGxlKTsKLX0KLQogLyogbmF0aXZlIGludCBuYXRpdmVfZ2V0RGJMb29rYXNpZGUoKTsgKi8KIHN0YXRpYyBqaW50IG5hdGl2ZV9nZXREYkxvb2thc2lkZShKTklFbnYqIGVudiwgam9iamVjdCBvYmplY3QpCiB7CkBAIC00NDMsMTkgKzM4NCw5MyBAQAogICAgIHJldHVybiBzcWxpdGUzX3JlbGVhc2VfbWVtb3J5KFNRTElURV9TT0ZUX0hFQVBfTElNSVQpOwogfQogCitzdGF0aWMgdm9pZCBuYXRpdmVfZmluYWxpemUoSk5JRW52KiBlbnYsIGpvYmplY3Qgb2JqZWN0LCBqaW50IHN0YXRlbWVudElkKQoreworICAgIGlmIChzdGF0ZW1lbnRJZCA+IDApIHsKKyAgICAgICAgc3FsaXRlM19maW5hbGl6ZSgoc3FsaXRlM19zdG10ICopc3RhdGVtZW50SWQpOworICAgIH0KK30KKworc3RhdGljIHZvaWQgY3VzdG9tX2Z1bmN0aW9uX2NhbGxiYWNrKHNxbGl0ZTNfY29udGV4dCAqIGNvbnRleHQsIGludCBhcmdjLCBzcWxpdGUzX3ZhbHVlICoqIGFyZ3YpIHsKKyAgICBKTklFbnYqIGVudiA9IEFuZHJvaWRSdW50aW1lOjpnZXRKTklFbnYoKTsKKyAgICBpZiAoIWVudikgeworICAgICAgICBMT0dFKCJjdXN0b21fZnVuY3Rpb25fY2FsbGJhY2sgY2Fubm90IGNhbGwgaW50byBKYXZhIG9uIHRoaXMgdGhyZWFkIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgLy8gZ2V0IGdsb2JhbCByZWYgdG8gQ3VzdG9tRnVuY3Rpb24gb2JqZWN0IGZyb20gb3VyIHVzZXIgZGF0YQorICAgIGpvYmplY3QgZnVuY3Rpb24gPSAoam9iamVjdClzcWxpdGUzX3VzZXJfZGF0YShjb250ZXh0KTsKKworICAgIC8vIHBhY2sgdXAgdGhlIGFyZ3VtZW50cyBpbnRvIGEgc3RyaW5nIGFycmF5CisgICAgaWYgKCFzdHJpbmdfY2xhc3MpCisgICAgICAgIHN0cmluZ19jbGFzcyA9IChqY2xhc3MpZW52LT5OZXdHbG9iYWxSZWYoZW52LT5GaW5kQ2xhc3MoImphdmEvbGFuZy9TdHJpbmciKSk7CisgICAgam9iamVjdEFycmF5IHN0ckFycmF5ID0gZW52LT5OZXdPYmplY3RBcnJheShhcmdjLCBzdHJpbmdfY2xhc3MsIE5VTEwpOworICAgIGlmICghc3RyQXJyYXkpCisgICAgICAgIGdvdG8gZG9uZTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGFyZ2M7IGkrKykgeworICAgICAgICBjaGFyKiBhcmcgPSAoY2hhciAqKXNxbGl0ZTNfdmFsdWVfdGV4dChhcmd2W2ldKTsKKyAgICAgICAgaWYgKCFhcmcpIHsKKyAgICAgICAgICAgIExPR0UoIk5VTEwgYXJndW1lbnQgaW4gY3VzdG9tX2Z1bmN0aW9uX2NhbGxiYWNrLiAgVGhpcyBzaG91bGQgbm90IGhhcHBlbi4iKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBqb2JqZWN0IG9iaiA9IGVudi0+TmV3U3RyaW5nVVRGKGFyZyk7CisgICAgICAgIGlmICghb2JqKQorICAgICAgICAgICAgZ290byBkb25lOworICAgICAgICBlbnYtPlNldE9iamVjdEFycmF5RWxlbWVudChzdHJBcnJheSwgaSwgb2JqKTsKKyAgICAgICAgZW52LT5EZWxldGVMb2NhbFJlZihvYmopOworICAgIH0KKworICAgIGVudi0+Q2FsbFZvaWRNZXRob2QoZnVuY3Rpb24sIG1ldGhvZF9jdXN0b21fZnVuY3Rpb25fY2FsbGJhY2ssIHN0ckFycmF5KTsKKworZG9uZToKKyAgICBpZiAoZW52LT5FeGNlcHRpb25DaGVjaygpKSB7CisgICAgICAgIExPR0UoIkFuIGV4Y2VwdGlvbiB3YXMgdGhyb3duIGJ5IGN1c3RvbSBzcWxpdGUzIGZ1bmN0aW9uLiIpOworICAgICAgICBMT0dFX0VYKGVudik7CisgICAgICAgIGVudi0+RXhjZXB0aW9uQ2xlYXIoKTsKKyAgICB9Cit9CisKK3N0YXRpYyBqaW50IG5hdGl2ZV9hZGRDdXN0b21GdW5jdGlvbihKTklFbnYqIGVudiwgam9iamVjdCBvYmplY3QsCisgICAgICAgIGpzdHJpbmcgbmFtZSwgamludCBudW1BcmdzLCBqb2JqZWN0IGZ1bmN0aW9uKQoreworICAgIHNxbGl0ZTMgKiBoYW5kbGUgPSAoc3FsaXRlMyAqKWVudi0+R2V0SW50RmllbGQob2JqZWN0LCBvZmZzZXRfZGJfaGFuZGxlKTsKKyAgICBjaGFyIGNvbnN0ICpuYW1lU3RyID0gZW52LT5HZXRTdHJpbmdVVEZDaGFycyhuYW1lLCBOVUxMKTsKKyAgICBqb2JqZWN0IHJlZiA9IGVudi0+TmV3R2xvYmFsUmVmKGZ1bmN0aW9uKTsKKyAgICBMT0dEX0lGKERFQlVHX0pOSSwgIm5hdGl2ZV9hZGRDdXN0b21GdW5jdGlvbiAlcyByZWY6ICVwIiwgbmFtZVN0ciwgcmVmKTsKKyAgICBpbnQgZXJyID0gc3FsaXRlM19jcmVhdGVfZnVuY3Rpb24oaGFuZGxlLCBuYW1lU3RyLCBudW1BcmdzLCBTUUxJVEVfVVRGOCwKKyAgICAgICAgICAgICh2b2lkICopcmVmLCBjdXN0b21fZnVuY3Rpb25fY2FsbGJhY2ssIE5VTEwsIE5VTEwpOworICAgIGVudi0+UmVsZWFzZVN0cmluZ1VURkNoYXJzKG5hbWUsIG5hbWVTdHIpOworCisgICAgaWYgKGVyciA9PSBTUUxJVEVfT0spCisgICAgICAgIHJldHVybiAoaW50KXJlZjsKKyAgICBlbHNlIHsKKyAgICAgICAgTE9HRSgic3FsaXRlM19jcmVhdGVfZnVuY3Rpb24gcmV0dXJuZWQgJWQiLCBlcnIpOworICAgICAgICBlbnYtPkRlbGV0ZUdsb2JhbFJlZihyZWYpOworICAgICAgICB0aHJvd19zcWxpdGUzX2V4Y2VwdGlvbihlbnYsIGhhbmRsZSk7CisgICAgICAgIHJldHVybiAwOworICAgICB9Cit9CisKK3N0YXRpYyB2b2lkIG5hdGl2ZV9yZWxlYXNlQ3VzdG9tRnVuY3Rpb24oSk5JRW52KiBlbnYsIGpvYmplY3Qgb2JqZWN0LCBqaW50IHJlZikKK3sKKyAgICBMT0dEX0lGKERFQlVHX0pOSSwgIm5hdGl2ZV9yZWxlYXNlQ3VzdG9tRnVuY3Rpb24gJWQiLCByZWYpOworICAgIGVudi0+RGVsZXRlR2xvYmFsUmVmKChqb2JqZWN0KXJlZik7Cit9CisKIHN0YXRpYyBKTklOYXRpdmVNZXRob2Qgc01ldGhvZHNbXSA9CiB7CiAgICAgLyogbmFtZSwgc2lnbmF0dXJlLCBmdW5jUHRyICovCiAgICAgeyJkYm9wZW4iLCAiKExqYXZhL2xhbmcvU3RyaW5nO0kpViIsICh2b2lkICopZGJvcGVufSwKICAgICB7ImRiY2xvc2UiLCAiKClWIiwgKHZvaWQgKilkYmNsb3NlfSwKLSAgICB7ImVuYWJsZVNxbFRyYWNpbmciLCAiKExqYXZhL2xhbmcvU3RyaW5nOylWIiwgKHZvaWQgKillbmFibGVTcWxUcmFjaW5nfSwKLSAgICB7ImVuYWJsZVNxbFByb2ZpbGluZyIsICIoTGphdmEvbGFuZy9TdHJpbmc7KVYiLCAodm9pZCAqKWVuYWJsZVNxbFByb2ZpbGluZ30sCi0gICAgeyJuYXRpdmVfZXhlY1NRTCIsICIoTGphdmEvbGFuZy9TdHJpbmc7KVYiLCAodm9pZCAqKW5hdGl2ZV9leGVjU1FMfSwKLSAgICB7Imxhc3RJbnNlcnRSb3ciLCAiKClKIiwgKHZvaWQgKilsYXN0SW5zZXJ0Um93fSwKLSAgICB7Imxhc3RDaGFuZ2VDb3VudCIsICIoKUkiLCAodm9pZCAqKWxhc3RDaGFuZ2VDb3VudH0sCisgICAgeyJlbmFibGVTcWxUcmFjaW5nIiwgIihMamF2YS9sYW5nL1N0cmluZztTKVYiLCAodm9pZCAqKWVuYWJsZVNxbFRyYWNpbmd9LAorICAgIHsiZW5hYmxlU3FsUHJvZmlsaW5nIiwgIihMamF2YS9sYW5nL1N0cmluZztTKVYiLCAodm9pZCAqKWVuYWJsZVNxbFByb2ZpbGluZ30sCiAgICAgeyJuYXRpdmVfc2V0TG9jYWxlIiwgIihMamF2YS9sYW5nL1N0cmluZztJKVYiLCAodm9pZCAqKW5hdGl2ZV9zZXRMb2NhbGV9LAogICAgIHsibmF0aXZlX2dldERiTG9va2FzaWRlIiwgIigpSSIsICh2b2lkICopbmF0aXZlX2dldERiTG9va2FzaWRlfSwKICAgICB7InJlbGVhc2VNZW1vcnkiLCAiKClJIiwgKHZvaWQgKiluYXRpdmVfcmVsZWFzZU1lbW9yeX0sCisgICAgeyJuYXRpdmVfZmluYWxpemUiLCAiKEkpViIsICh2b2lkICopbmF0aXZlX2ZpbmFsaXplfSwKKyAgICB7Im5hdGl2ZV9hZGRDdXN0b21GdW5jdGlvbiIsCisgICAgICAgICAgICAgICAgICAgICIoTGphdmEvbGFuZy9TdHJpbmc7SUxhbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9TUUxpdGVEYXRhYmFzZSRDdXN0b21GdW5jdGlvbjspSSIsCisgICAgICAgICAgICAgICAgICAgICh2b2lkICopbmF0aXZlX2FkZEN1c3RvbUZ1bmN0aW9ufSwKKyAgICB7Im5hdGl2ZV9yZWxlYXNlQ3VzdG9tRnVuY3Rpb24iLCAiKEkpViIsICh2b2lkICopbmF0aXZlX3JlbGVhc2VDdXN0b21GdW5jdGlvbn0sCiB9OwogCiBpbnQgcmVnaXN0ZXJfYW5kcm9pZF9kYXRhYmFzZV9TUUxpdGVEYXRhYmFzZShKTklFbnYgKmVudikKQEAgLTQ3NCw3ICs0ODksMTkgQEAKICAgICAgICAgcmV0dXJuIC0xOwogICAgIH0KIAotICAgIHJldHVybiBBbmRyb2lkUnVudGltZTo6cmVnaXN0ZXJOYXRpdmVNZXRob2RzKGVudiwgImFuZHJvaWQvZGF0YWJhc2Uvc3FsaXRlL1NRTGl0ZURhdGFiYXNlIiwgc01ldGhvZHMsIE5FTEVNKHNNZXRob2RzKSk7CisgICAgY2xhenogPSBlbnYtPkZpbmRDbGFzcygiYW5kcm9pZC9kYXRhYmFzZS9zcWxpdGUvU1FMaXRlRGF0YWJhc2UkQ3VzdG9tRnVuY3Rpb24iKTsKKyAgICBpZiAoY2xhenogPT0gTlVMTCkgeworICAgICAgICBMT0dFKCJDYW4ndCBmaW5kIGFuZHJvaWQvZGF0YWJhc2Uvc3FsaXRlL1NRTGl0ZURhdGFiYXNlJEN1c3RvbUZ1bmN0aW9uXG4iKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBtZXRob2RfY3VzdG9tX2Z1bmN0aW9uX2NhbGxiYWNrID0gZW52LT5HZXRNZXRob2RJRChjbGF6eiwgImNhbGxiYWNrIiwgIihbTGphdmEvbGFuZy9TdHJpbmc7KVYiKTsKKyAgICBpZiAobWV0aG9kX2N1c3RvbV9mdW5jdGlvbl9jYWxsYmFjayA9PSBOVUxMKSB7CisgICAgICAgIExPR0UoIkNhbid0IGZpbmQgbWV0aG9kIFNRTGl0ZURhdGFiYXNlLkN1c3RvbUZ1bmN0aW9uLmNhbGxiYWNrXG4iKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIHJldHVybiBBbmRyb2lkUnVudGltZTo6cmVnaXN0ZXJOYXRpdmVNZXRob2RzKGVudiwgImFuZHJvaWQvZGF0YWJhc2Uvc3FsaXRlL1NRTGl0ZURhdGFiYXNlIiwKKyAgICAgICAgICAgIHNNZXRob2RzLCBORUxFTShzTWV0aG9kcykpOwogfQogCiAvKiB0aHJvdyBhIFNRTGl0ZUV4Y2VwdGlvbiB3aXRoIGEgbWVzc2FnZSBhcHByb3ByaWF0ZSBmb3IgdGhlIGVycm9yIGluIGhhbmRsZSAqLwpAQCAtNTIzLDYgKzU1MCw3IEBACiAgICAgICAgICAgICBleGNlcHRpb25DbGFzcyA9ICJhbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9TUUxpdGVEaXNrSU9FeGNlcHRpb24iOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgU1FMSVRFX0NPUlJVUFQ6CisgICAgICAgIGNhc2UgU1FMSVRFX05PVEFEQjogLy8gdHJlYXQgInVuc3VwcG9ydGVkIGZpbGUgZm9ybWF0IiBlcnJvciBhcyBjb3JydXB0aW9uIGFsc28KICAgICAgICAgICAgIGV4Y2VwdGlvbkNsYXNzID0gImFuZHJvaWQvZGF0YWJhc2Uvc3FsaXRlL1NRTGl0ZURhdGFiYXNlQ29ycnVwdEV4Y2VwdGlvbiI7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSBTUUxJVEVfQ09OU1RSQUlOVDoKQEAgLTU0MCw2ICs1NjgsMzYgQEAKICAgICAgICAgY2FzZSBTUUxJVEVfTUlTVVNFOgogICAgICAgICAgICBleGNlcHRpb25DbGFzcyA9ICJhbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9TUUxpdGVNaXN1c2VFeGNlcHRpb24iOwogICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBTUUxJVEVfUEVSTToKKyAgICAgICAgICAgZXhjZXB0aW9uQ2xhc3MgPSAiYW5kcm9pZC9kYXRhYmFzZS9zcWxpdGUvU1FMaXRlQWNjZXNzUGVybUV4Y2VwdGlvbiI7CisgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFNRTElURV9CVVNZOgorICAgICAgICAgICBleGNlcHRpb25DbGFzcyA9ICJhbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9TUUxpdGVEYXRhYmFzZUxvY2tlZEV4Y2VwdGlvbiI7CisgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFNRTElURV9MT0NLRUQ6CisgICAgICAgICAgIGV4Y2VwdGlvbkNsYXNzID0gImFuZHJvaWQvZGF0YWJhc2Uvc3FsaXRlL1NRTGl0ZVRhYmxlTG9ja2VkRXhjZXB0aW9uIjsKKyAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgU1FMSVRFX1JFQURPTkxZOgorICAgICAgICAgICBleGNlcHRpb25DbGFzcyA9ICJhbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9TUUxpdGVSZWFkT25seURhdGFiYXNlRXhjZXB0aW9uIjsKKyAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgU1FMSVRFX0NBTlRPUEVOOgorICAgICAgICAgICBleGNlcHRpb25DbGFzcyA9ICJhbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9TUUxpdGVDYW50T3BlbkRhdGFiYXNlRXhjZXB0aW9uIjsKKyAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgU1FMSVRFX1RPT0JJRzoKKyAgICAgICAgICAgZXhjZXB0aW9uQ2xhc3MgPSAiYW5kcm9pZC9kYXRhYmFzZS9zcWxpdGUvU1FMaXRlQmxvYlRvb0JpZ0V4Y2VwdGlvbiI7CisgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFNRTElURV9SQU5HRToKKyAgICAgICAgICAgZXhjZXB0aW9uQ2xhc3MgPSAiYW5kcm9pZC9kYXRhYmFzZS9zcWxpdGUvU1FMaXRlQmluZE9yQ29sdW1uSW5kZXhPdXRPZlJhbmdlRXhjZXB0aW9uIjsKKyAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgU1FMSVRFX05PTUVNOgorICAgICAgICAgICBleGNlcHRpb25DbGFzcyA9ICJhbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9TUUxpdGVPdXRPZk1lbW9yeUV4Y2VwdGlvbiI7CisgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFNRTElURV9NSVNNQVRDSDoKKyAgICAgICAgICAgZXhjZXB0aW9uQ2xhc3MgPSAiYW5kcm9pZC9kYXRhYmFzZS9zcWxpdGUvU1FMaXRlRGF0YXR5cGVNaXNtYXRjaEV4Y2VwdGlvbiI7CisgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFNRTElURV9VTkNMT1NFRDoKKyAgICAgICAgICAgZXhjZXB0aW9uQ2xhc3MgPSAiYW5kcm9pZC9kYXRhYmFzZS9zcWxpdGUvU1FMaXRlVW5maW5hbGl6ZWRPYmplY3RzRXhjZXB0aW9uIjsKKyAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgIGV4Y2VwdGlvbkNsYXNzID0gImFuZHJvaWQvZGF0YWJhc2Uvc3FsaXRlL1NRTGl0ZUV4Y2VwdGlvbiI7CiAgICAgICAgICAgIGJyZWFrOwpkaWZmIC0tZ2l0IGEvY29yZS9qbmkvYW5kcm9pZF9kYXRhYmFzZV9TUUxpdGVRdWVyeS5jcHAgYi9jb3JlL2puaS9hbmRyb2lkX2RhdGFiYXNlX1NRTGl0ZVF1ZXJ5LmNwcAppbmRleCA0NDI3MTY4My4uOWU0MjE4OSAxMDA2NDQKLS0tIGEvY29yZS9qbmkvYW5kcm9pZF9kYXRhYmFzZV9TUUxpdGVRdWVyeS5jcHAKKysrIGIvY29yZS9qbmkvYW5kcm9pZF9kYXRhYmFzZV9TUUxpdGVRdWVyeS5jcHAKQEAgLTE1LDcgKzE1LDcgQEAKICAqLwogCiAjdW5kZWYgTE9HX1RBRwotI2RlZmluZSBMT0dfVEFHICJDdXJzb3IiCisjZGVmaW5lIExPR19UQUcgIlNxbGl0ZUN1cnNvci5jcHAiCiAKICNpbmNsdWRlIDxqbmkuaD4KICNpbmNsdWRlIDxKTklIZWxwLmg+CkBAIC0yOSw3ICsyOSw3IEBACiAjaW5jbHVkZSA8c3RyaW5nLmg+CiAjaW5jbHVkZSA8dW5pc3RkLmg+CiAKLSNpbmNsdWRlICJDdXJzb3JXaW5kb3cuaCIKKyNpbmNsdWRlICJiaW5kZXIvQ3Vyc29yV2luZG93LmgiCiAjaW5jbHVkZSAic3FsaXRlM19leGNlcHRpb24uaCIKIAogCkBAIC03Myw3ICs3Myw3IEBACiAgICAgICAgICAgICByZXR1cm4gLTE7CiAgICAgICAgIH0KICAgICB9Ci0gICAgTE9HRCgic2tpcF9yb3dzIHJvdyAlZCIsIG1heFJvd3MpOworICAgIExPR19XSU5ET1coInNraXBfcm93cyByb3cgJWQiLCBtYXhSb3dzKTsKICAgICByZXR1cm4gbWF4Um93czsKIH0KIApAQCAtMTAxLDcgKzEwMSw3IEBACiAgICAgICAgIH0KICAgICB9CiAgICAgc3FsaXRlM19yZXNldChzdGF0ZW1lbnQpOwotICAgIExPR0QoImZpbmlzaF9wcm9ncmFtX2FuZF9nZXRfcm93X2NvdW50IHJvdyAlZCIsIG51bVJvd3MpOworICAgIExPR19XSU5ET1coImZpbmlzaF9wcm9ncmFtX2FuZF9nZXRfcm93X2NvdW50IHJvdyAlZCIsIG51bVJvd3MpOwogICAgIHJldHVybiBudW1Sb3dzOwogfQogCkBAIC0xMTYsNiArMTE2LDggQEAKICAgICBpbnQgcmV0cnlDb3VudDsKICAgICBpbnQgYm91bmRQYXJhbXM7CiAgICAgQ3Vyc29yV2luZG93ICogd2luZG93OworICAgIGJvb2wgZ290QWxsUm93cyA9IHRydWU7CisgICAgYm9vbCBnb3RFeGNlcHRpb24gPSBmYWxzZTsKICAgICAKICAgICBpZiAoc3RhdGVtZW50ID09IE5VTEwpIHsKICAgICAgICAgTE9HRSgiSW52YWxpZCBzdGF0ZW1lbnQgaW4gZmlsbFdpbmRvdygpIik7CkBAIC0xMzEsOCArMTMzLDcgQEAKICAgICAgICAgZXJyID0gc3FsaXRlM19iaW5kX2ludChzdGF0ZW1lbnQsIG9mZnNldFBhcmFtLCBzdGFydFBvcyk7CiAgICAgICAgIGlmIChlcnIgIT0gU1FMSVRFX09LKSB7CiAgICAgICAgICAgICBMT0dFKCJVbmFibGUgdG8gYmluZCBvZmZzZXQgcG9zaXRpb24sIG9mZnNldFBhcmFtID0gJWQiLCBvZmZzZXRQYXJhbSk7Ci0gICAgICAgICAgICBqbmlUaHJvd0V4Y2VwdGlvbihlbnYsICJqYXZhL2xhbmcvSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNxbGl0ZTNfZXJybXNnKEdFVF9IQU5ETEUoZW52LCBvYmplY3QpKSk7CisgICAgICAgICAgICB0aHJvd19zcWxpdGUzX2V4Y2VwdGlvbihlbnYsIEdFVF9IQU5ETEUoZW52LCBvYmplY3QpKTsKICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICB9CiAgICAgICAgIExPR19XSU5ET1coIkJvdW5kIHRvIHN0YXJ0UG9zICVkIiwgc3RhcnRQb3MpOwpAQCAtMTY3LDcgKzE2OCw3IEBACiAgICAgICAgICAgICBMT0dFKCJzdGFydFBvcyAlZCA+IGFjdHVhbCByb3dzICVkIiwgc3RhcnRQb3MsIG51bSk7CiAgICAgICAgICAgICByZXR1cm4gbnVtOwogICAgICAgICB9Ci0gICAgfSAKKyAgICB9CiAgICAgCiAgICAgd2hpbGUoc3RhcnRQb3MgIT0gMCB8fCBudW1Sb3dzIDwgbWF4UmVhZCkgewogICAgICAgICBlcnIgPSBzcWxpdGUzX3N0ZXAoc3RhdGVtZW50KTsKQEAgLTE4MSw4ICsxODIsOSBAQAogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIGZpZWxkX3Nsb3RfdCAqIGZpZWxkRGlyID0gd2luZG93LT5hbGxvY1JvdygpOwogICAgICAgICAgICAgICAgIGlmICghZmllbGREaXIpIHsKLSAgICAgICAgICAgICAgICAgICAgTE9HRSgiRmFpbGVkIGFsbG9jYXRpbmcgZmllbGREaXIgYXQgc3RhcnRQb3MgJWQgcm93ICVkIiwgc3RhcnRQb3MsIG51bVJvd3MpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3RhcnRQb3MgKyBudW1Sb3dzICsgZmluaXNoX3Byb2dyYW1fYW5kX2dldF9yb3dfY291bnQoc3RhdGVtZW50KSArIDE7CisgICAgICAgICAgICAgICAgICAgIExPR19XSU5ET1coIkZhaWxlZCBhbGxvY2F0aW5nIGZpZWxkRGlyIGF0IHN0YXJ0UG9zICVkIHJvdyAlZCIsIHN0YXJ0UG9zLCBudW1Sb3dzKTsKKyAgICAgICAgICAgICAgICAgICAgZ290QWxsUm93cyA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICBnb3RvIHJldHVybl9jb3VudDsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAKQEAgLTIwNSw5ICsyMDcsMTAgQEAKICAgICAgICAgICAgICAgICAgICAgaW50IG9mZnNldCA9IHdpbmRvdy0+YWxsb2Moc2l6ZSk7CiAgICAgICAgICAgICAgICAgICAgIGlmICghb2Zmc2V0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3ctPmZyZWVMYXN0Um93KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBMT0dFKCJGYWlsZWQgYWxsb2NhdGluZyAldSBieXRlcyBmb3IgdGV4dC9ibG9iIGF0ICVkLCVkIiwgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIExPR19XSU5ET1coIkZhaWxlZCBhbGxvY2F0aW5nICV1IGJ5dGVzIGZvciB0ZXh0L2Jsb2IgYXQgJWQsJWQiLCBzaXplLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydFBvcyArIG51bVJvd3MsIGkpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHN0YXJ0UG9zICsgbnVtUm93cyArIGZpbmlzaF9wcm9ncmFtX2FuZF9nZXRfcm93X2NvdW50KHN0YXRlbWVudCkgKyAxOworICAgICAgICAgICAgICAgICAgICAgICAgZ290QWxsUm93cyA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgZ290byByZXR1cm5fY291bnQ7CiAgICAgICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAgICAgICB3aW5kb3ctPmNvcHlJbihvZmZzZXQsIHRleHQsIHNpemUpOwpAQCAtMjI1LDggKzIyOCw5IEBACiAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgdmFsdWUgPSBzcWxpdGUzX2NvbHVtbl9pbnQ2NChzdGF0ZW1lbnQsIGkpOwogICAgICAgICAgICAgICAgICAgICBpZiAoIXdpbmRvdy0+cHV0TG9uZyhudW1Sb3dzLCBpLCB2YWx1ZSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdy0+ZnJlZUxhc3RSb3coKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIExPR0UoIkZhaWxlZCBhbGxvY2F0aW5nIHNwYWNlIGZvciBhIGxvbmcgaW4gY29sdW1uICVkIiwgaSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3RhcnRQb3MgKyBudW1Sb3dzICsgZmluaXNoX3Byb2dyYW1fYW5kX2dldF9yb3dfY291bnQoc3RhdGVtZW50KSArIDE7CisgICAgICAgICAgICAgICAgICAgICAgICBMT0dfV0lORE9XKCJGYWlsZWQgYWxsb2NhdGluZyBzcGFjZSBmb3IgYSBsb25nIGluIGNvbHVtbiAlZCIsIGkpOworICAgICAgICAgICAgICAgICAgICAgICAgZ290QWxsUm93cyA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgZ290byByZXR1cm5fY291bnQ7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgTE9HX1dJTkRPVygiJWQsJWQgaXMgSU5URUdFUiAweCUwMTZsbHgiLCBzdGFydFBvcyArIG51bVJvd3MsIGksIHZhbHVlKTsKICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGUgPT0gU1FMSVRFX0ZMT0FUKSB7CkBAIC0yMzQsOCArMjM4LDkgQEAKICAgICAgICAgICAgICAgICAgICAgZG91YmxlIHZhbHVlID0gc3FsaXRlM19jb2x1bW5fZG91YmxlKHN0YXRlbWVudCwgaSk7CiAgICAgICAgICAgICAgICAgICAgIGlmICghd2luZG93LT5wdXREb3VibGUobnVtUm93cywgaSwgdmFsdWUpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3ctPmZyZWVMYXN0Um93KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBMT0dFKCJGYWlsZWQgYWxsb2NhdGluZyBzcGFjZSBmb3IgYSBkb3VibGUgaW4gY29sdW1uICVkIiwgaSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3RhcnRQb3MgKyBudW1Sb3dzICsgZmluaXNoX3Byb2dyYW1fYW5kX2dldF9yb3dfY291bnQoc3RhdGVtZW50KSArIDE7CisgICAgICAgICAgICAgICAgICAgICAgICBMT0dfV0lORE9XKCJGYWlsZWQgYWxsb2NhdGluZyBzcGFjZSBmb3IgYSBkb3VibGUgaW4gY29sdW1uICVkIiwgaSk7CisgICAgICAgICAgICAgICAgICAgICAgICBnb3RBbGxSb3dzID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIHJldHVybl9jb3VudDsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBMT0dfV0lORE9XKCIlZCwlZCBpcyBGTE9BVCAlbGYiLCBzdGFydFBvcyArIG51bVJvd3MsIGksIHZhbHVlKTsKICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGUgPT0gU1FMSVRFX0JMT0IpIHsKQEAgLTI0NSw5ICsyNTAsMTAgQEAKICAgICAgICAgICAgICAgICAgICAgaW50IG9mZnNldCA9IHdpbmRvdy0+YWxsb2Moc2l6ZSk7CiAgICAgICAgICAgICAgICAgICAgIGlmICghb2Zmc2V0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3ctPmZyZWVMYXN0Um93KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBMT0dFKCJGYWlsZWQgYWxsb2NhdGluZyAldSBieXRlcyBmb3IgYmxvYiBhdCAlZCwlZCIsIHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICBMT0dfV0lORE9XKCJGYWlsZWQgYWxsb2NhdGluZyAldSBieXRlcyBmb3IgYmxvYiBhdCAlZCwlZCIsIHNpemUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0UG9zICsgbnVtUm93cywgaSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3RhcnRQb3MgKyBudW1Sb3dzICsgZmluaXNoX3Byb2dyYW1fYW5kX2dldF9yb3dfY291bnQoc3RhdGVtZW50KSArIDE7CisgICAgICAgICAgICAgICAgICAgICAgICBnb3RBbGxSb3dzID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIHJldHVybl9jb3VudDsKICAgICAgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgICAgIHdpbmRvdy0+Y29weUluKG9mZnNldCwgYmxvYiwgc2l6ZSk7CkBAIC0yNjksNiArMjc1LDcgQEAKICAgICAgICAgICAgICAgICAgICAgLy8gVW5rbm93biBkYXRhCiAgICAgICAgICAgICAgICAgICAgIExPR0UoIlVua25vd24gY29sdW1uIHR5cGUgd2hlbiBmaWxsaW5nIGRhdGFiYXNlIHdpbmRvdyIpOwogICAgICAgICAgICAgICAgICAgICB0aHJvd19zcWxpdGUzX2V4Y2VwdGlvbihlbnYsICJVbmtub3duIGNvbHVtbiB0eXBlIHdoZW4gZmlsbGluZyB3aW5kb3ciKTsKKyAgICAgICAgICAgICAgICAgICAgZ290RXhjZXB0aW9uID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQpAQCAtMjkwLDYgKzI5Nyw4IEBACiAgICAgICAgICAgICBMT0dfV0lORE9XKCJEYXRhYmFzZSBsb2NrZWQsIHJldHJ5aW5nIik7CiAgICAgICAgICAgICBpZiAocmV0cnlDb3VudCA+IDUwKSB7CiAgICAgICAgICAgICAgICAgTE9HRSgiQmFpbGluZyBvbiBkYXRhYmFzZSBidXN5IHJldHkiKTsKKyAgICAgICAgICAgICAgICB0aHJvd19zcWxpdGUzX2V4Y2VwdGlvbihlbnYsIEdFVF9IQU5ETEUoZW52LCBvYmplY3QpLCAicmV0cnljb3VudCBleGNlZWRlZCIpOworICAgICAgICAgICAgICAgIGdvdEV4Y2VwdGlvbiA9IHRydWU7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CiAKQEAgLTMwMCwxOCArMzA5LDMzIEBACiAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIHRocm93X3NxbGl0ZTNfZXhjZXB0aW9uKGVudiwgR0VUX0hBTkRMRShlbnYsIG9iamVjdCkpOworICAgICAgICAgICAgZ290RXhjZXB0aW9uID0gdHJ1ZTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAgICAgfQogCiAgICAgTE9HX1dJTkRPVygiUmVzZXR0aW5nIHN0YXRlbWVudCAlcCBhZnRlciBmZXRjaGluZyAlZCByb3dzIGluICVkIGJ5dGVzXG5cblxuXG4iLCBzdGF0ZW1lbnQsCiAgICAgICAgICAgICBudW1Sb3dzLCB3aW5kb3ctPnNpemUoKSAtIHdpbmRvdy0+ZnJlZVNwYWNlKCkpOwotLy8gICAgTE9HSSgiRmlsbGVkIHdpbmRvdyB3aXRoICVkIHJvd3MgaW4gJWQgYnl0ZXMiLCBudW1Sb3dzLCB3aW5kb3ctPnNpemUoKSAtIHdpbmRvdy0+ZnJlZVNwYWNlKCkpOworICAgIExPR19XSU5ET1coIkZpbGxlZCB3aW5kb3cgd2l0aCAlZCByb3dzIGluICVkIGJ5dGVzIiwgbnVtUm93cywKKyAgICAgICAgICAgIHdpbmRvdy0+c2l6ZSgpIC0gd2luZG93LT5mcmVlU3BhY2UoKSk7CiAgICAgaWYgKGVyciA9PSBTUUxJVEVfUk9XKSB7CisgICAgICAgIC8vIHRoZXJlIGlzIG1vcmUgZGF0YSB0byBiZSByZXR1cm5lZC4gbGV0IHRoZSBjYWxsZXIga25vdyBieSByZXR1cm5pbmcgLTEKICAgICAgICAgcmV0dXJuIC0xOwotICAgIH0gZWxzZSB7CisgICAgfQorICByZXR1cm5fY291bnQ6CisgICAgaWYgKHN0YXJ0UG9zKSB7CiAgICAgICAgIHNxbGl0ZTNfcmVzZXQoc3RhdGVtZW50KTsKLSAgICAgICAgcmV0dXJuIHN0YXJ0UG9zICsgbnVtUm93czsKKyAgICAgICAgTE9HX1dJTkRPVygiTm90IGRvaW5nIGNvdW50KCopIGJlY2F1c2Ugc3RhcnRQb3MgJWQgaXMgbm9uLXplcm8iLCBzdGFydFBvcyk7CisgICAgICAgIHJldHVybiAwOworICAgIH0gZWxzZSBpZiAoZ290QWxsUm93cykgeworICAgICAgICBzcWxpdGUzX3Jlc2V0KHN0YXRlbWVudCk7CisgICAgICAgIExPR19XSU5ET1coIk5vdCBkb2luZyBjb3VudCgqKSBiZWNhdXNlIHdlIGFscmVhZHkga25vdyB0aGUgY291bnQoKikiKTsKKyAgICAgICAgcmV0dXJuIG51bVJvd3M7CisgICAgfSBlbHNlIGlmIChnb3RFeGNlcHRpb24pIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gc2luY2Ugc3RhcnRQb3MgPT0gMCwgd2UgbmVlZCB0byBnZXQgdGhlIGNvdW50KCopIG9mIHRoZSByZXN1bHQgc2V0CisgICAgICAgIHJldHVybiBudW1Sb3dzICsgMSArIGZpbmlzaF9wcm9ncmFtX2FuZF9nZXRfcm93X2NvdW50KHN0YXRlbWVudCk7CiAgICAgfQogfQogCkBAIC0zMzYsNyArMzYwLDggQEAKIHN0YXRpYyBKTklOYXRpdmVNZXRob2Qgc01ldGhvZHNbXSA9CiB7CiAgICAgIC8qIG5hbWUsIHNpZ25hdHVyZSwgZnVuY1B0ciAqLwotICAgIHsibmF0aXZlX2ZpbGxfd2luZG93IiwgIihMYW5kcm9pZC9kYXRhYmFzZS9DdXJzb3JXaW5kb3c7SUlJSSlJIiwgKHZvaWQgKiluYXRpdmVfZmlsbF93aW5kb3d9LAorICAgIHsibmF0aXZlX2ZpbGxfd2luZG93IiwgIihMYW5kcm9pZC9kYXRhYmFzZS9DdXJzb3JXaW5kb3c7SUlJSSlJIiwKKyAgICAgICAgICAgICh2b2lkICopbmF0aXZlX2ZpbGxfd2luZG93fSwKICAgICB7Im5hdGl2ZV9jb2x1bW5fY291bnQiLCAiKClJIiwgKHZvaWQqKW5hdGl2ZV9jb2x1bW5fY291bnR9LAogICAgIHsibmF0aXZlX2NvbHVtbl9uYW1lIiwgIihJKUxqYXZhL2xhbmcvU3RyaW5nOyIsICh2b2lkICopbmF0aXZlX2NvbHVtbl9uYW1lfSwKIH07CmRpZmYgLS1naXQgYS9jb3JlL2puaS9hbmRyb2lkX2RhdGFiYXNlX1NRTGl0ZVN0YXRlbWVudC5jcHAgYi9jb3JlL2puaS9hbmRyb2lkX2RhdGFiYXNlX1NRTGl0ZVN0YXRlbWVudC5jcHAKaW5kZXggZmYyZWQ1ZC4uMGYzMTE0YiAxMDA2NDQKLS0tIGEvY29yZS9qbmkvYW5kcm9pZF9kYXRhYmFzZV9TUUxpdGVTdGF0ZW1lbnQuY3BwCisrKyBiL2NvcmUvam5pL2FuZHJvaWRfZGF0YWJhc2VfU1FMaXRlU3RhdGVtZW50LmNwcApAQCAtMTYsNyArMTYsOSBAQAogKi8KIAogI3VuZGVmIExPR19UQUcKLSNkZWZpbmUgTE9HX1RBRyAiQ3Vyc29yIgorI2RlZmluZSBMT0dfVEFHICJTUUxpdGVTdGF0ZW1lbnRDcHAiCisKKyNpbmNsdWRlICJhbmRyb2lkX3V0aWxfQmluZGVyLmgiCiAKICNpbmNsdWRlIDxqbmkuaD4KICNpbmNsdWRlIDxKTklIZWxwLmg+CkBAIC0yNCwxMSArMjYsMTYgQEAKIAogI2luY2x1ZGUgPHNxbGl0ZTMuaD4KIAorI2luY2x1ZGUgPGN1dGlscy9hc2htZW0uaD4KICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KIAorI2luY2x1ZGUgPGZjbnRsLmg+CiAjaW5jbHVkZSA8c3RkaW8uaD4KICNpbmNsdWRlIDxzdHJpbmcuaD4KICNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzeXMvbW1hbi5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CiAKICNpbmNsdWRlICJzcWxpdGUzX2V4Y2VwdGlvbi5oIgogCkBAIC00OCwyMiArNTUsNDAgQEAKICAgICAgICAgKHNxbGl0ZTMgKillbnYtPkdldEludEZpZWxkKG9iamVjdCwgZ0hhbmRsZUZpZWxkKQogCiAKLXN0YXRpYyB2b2lkIG5hdGl2ZV9leGVjdXRlKEpOSUVudiogZW52LCBqb2JqZWN0IG9iamVjdCkKK3N0YXRpYyBqaW50IG5hdGl2ZV9leGVjdXRlKEpOSUVudiogZW52LCBqb2JqZWN0IG9iamVjdCkKIHsKICAgICBpbnQgZXJyOwogICAgIHNxbGl0ZTMgKiBoYW5kbGUgPSBHRVRfSEFORExFKGVudiwgb2JqZWN0KTsKICAgICBzcWxpdGUzX3N0bXQgKiBzdGF0ZW1lbnQgPSBHRVRfU1RBVEVNRU5UKGVudiwgb2JqZWN0KTsKKyAgICBpbnQgbnVtQ2hhbmdlcyA9IC0xOwogCiAgICAgLy8gRXhlY3V0ZSB0aGUgc3RhdGVtZW50CiAgICAgZXJyID0gc3FsaXRlM19zdGVwKHN0YXRlbWVudCk7CiAKLSAgICAvLyBUaHJvdyBhbiBleGNlcHRpb24gaWYgYW4gZXJyb3Igb2NjdXJlZAotICAgIGlmIChlcnIgIT0gU1FMSVRFX0RPTkUpIHsKKyAgICAvLyBUaHJvdyBhbiBleGNlcHRpb24gaWYgYW4gZXJyb3Igb2NjdXJyZWQKKyAgICBpZiAoZXJyID09IFNRTElURV9ST1cpIHsKKyAgICAgICAgdGhyb3dfc3FsaXRlM19leGNlcHRpb24oZW52LAorICAgICAgICAgICAgICAgICJRdWVyaWVzIGNhbiBiZSBwZXJmb3JtZWQgdXNpbmcgU1FMaXRlRGF0YWJhc2UgcXVlcnkgb3IgcmF3UXVlcnkgbWV0aG9kcyBvbmx5LiIpOworICAgIH0gZWxzZSBpZiAoZXJyICE9IFNRTElURV9ET05FKSB7CiAgICAgICAgIHRocm93X3NxbGl0ZTNfZXhjZXB0aW9uX2VycmNvZGUoZW52LCBlcnIsIHNxbGl0ZTNfZXJybXNnKGhhbmRsZSkpOworICAgIH0gZWxzZSB7CisgICAgICAgIG51bUNoYW5nZXMgPSBzcWxpdGUzX2NoYW5nZXMoaGFuZGxlKTsKICAgICB9CiAKLSAgICAvLyBSZXNldCB0aGUgc3RhdG1lbnQgc28gaXQncyByZWFkeSB0byB1c2UgYWdhaW4KKyAgICAvLyBSZXNldCB0aGUgc3RhdGVtZW50IHNvIGl0J3MgcmVhZHkgdG8gdXNlIGFnYWluCiAgICAgc3FsaXRlM19yZXNldChzdGF0ZW1lbnQpOworICAgIHJldHVybiBudW1DaGFuZ2VzOworfQorCitzdGF0aWMgamxvbmcgbmF0aXZlX2V4ZWN1dGVJbnNlcnQoSk5JRW52KiBlbnYsIGpvYmplY3Qgb2JqZWN0KQoreworICAgIHNxbGl0ZTMgKiBoYW5kbGUgPSBHRVRfSEFORExFKGVudiwgb2JqZWN0KTsKKyAgICBqaW50IG51bUNoYW5nZXMgPSBuYXRpdmVfZXhlY3V0ZShlbnYsIG9iamVjdCk7CisgICAgaWYgKG51bUNoYW5nZXMgPiAwKSB7CisgICAgICAgIHJldHVybiBzcWxpdGUzX2xhc3RfaW5zZXJ0X3Jvd2lkKGhhbmRsZSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KIH0KIAogc3RhdGljIGpsb25nIG5hdGl2ZV8xeDFfbG9uZyhKTklFbnYqIGVudiwgam9iamVjdCBvYmplY3QpCkBAIC0xMTUsMTMgKzE0MCwxMTMgQEAKICAgICByZXR1cm4gdmFsdWU7CiB9CiAKK3N0YXRpYyBqb2JqZWN0IGNyZWF0ZVBhcmNlbEZpbGVEZXNjcmlwdG9yKEpOSUVudiAqIGVudiwgaW50IGZkKQoreworICAgIC8vIENyZWF0ZSBGaWxlRGVzY3JpcHRvciBvYmplY3QKKyAgICBqb2JqZWN0IGZpbGVEZXNjID0gbmV3RmlsZURlc2NyaXB0b3IoZW52LCBmZCk7CisgICAgaWYgKGZpbGVEZXNjID09IE5VTEwpIHsKKyAgICAgICAgLy8gRmlsZURlc2NyaXB0b3IgY29uc3RydWN0b3IgaGFzIHRocm93biBhbiBleGNlcHRpb24KKyAgICAgICAgY2xvc2UoZmQpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICAvLyBXcmFwIGl0IGluIGEgUGFyY2VsRmlsZURlc2NyaXB0b3IKKyAgICBqb2JqZWN0IHBhcmNlbEZpbGVEZXNjID0gbmV3UGFyY2VsRmlsZURlc2NyaXB0b3IoZW52LCBmaWxlRGVzYyk7CisgICAgaWYgKHBhcmNlbEZpbGVEZXNjID09IE5VTEwpIHsKKyAgICAgICAgLy8gUGFyY2VsRmlsZURlc2NyaXB0b3IgY29uc3RydWN0b3IgaGFzIHRocm93biBhbiBleGNlcHRpb24KKyAgICAgICAgY2xvc2UoZmQpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICByZXR1cm4gcGFyY2VsRmlsZURlc2M7Cit9CisKKy8vIENyZWF0ZXMgYW4gYXNobWVtIGFyZWEsIGNvcGllcyBzb21lIGRhdGEgaW50byBpdCwgYW5kIHJldHVybnMKKy8vIGEgUGFyY2VsRmlsZURlc2NyaXB0b3IgZm9yIHRoZSBhc2htZW0gYXJlYS4KK3N0YXRpYyBqb2JqZWN0IGNyZWF0ZV9hc2htZW1fcmVnaW9uX3dpdGhfZGF0YShKTklFbnYgKiBlbnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCAqIGRhdGEsIGludCBsZW5ndGgpCit7CisgICAgLy8gQ3JlYXRlIGFzaG1lbSBhcmVhCisgICAgaW50IGZkID0gYXNobWVtX2NyZWF0ZV9yZWdpb24oTlVMTCwgbGVuZ3RoKTsKKyAgICBpZiAoZmQgPCAwKSB7CisgICAgICAgIExPR0UoImFzaG1lbV9jcmVhdGVfcmVnaW9uIGZhaWxlZDogJXMiLCBzdHJlcnJvcihlcnJubykpOworICAgICAgICBqbmlUaHJvd0lPRXhjZXB0aW9uKGVudiwgZXJybm8pOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBpZiAobGVuZ3RoID4gMCkgeworICAgICAgICAvLyBtbWFwIHRoZSBhc2htZW0gYXJlYQorICAgICAgICB2b2lkICogYXNobWVtX3B0ciA9CisgICAgICAgICAgICAgICAgbW1hcChOVUxMLCBsZW5ndGgsIFBST1RfUkVBRCB8IFBST1RfV1JJVEUsIE1BUF9TSEFSRUQsIGZkLCAwKTsKKyAgICAgICAgaWYgKGFzaG1lbV9wdHIgPT0gTUFQX0ZBSUxFRCkgeworICAgICAgICAgICAgTE9HRSgibW1hcCBmYWlsZWQ6ICVzIiwgc3RyZXJyb3IoZXJybm8pKTsKKyAgICAgICAgICAgIGpuaVRocm93SU9FeGNlcHRpb24oZW52LCBlcnJubyk7CisgICAgICAgICAgICBjbG9zZShmZCk7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorCisgICAgICAgIC8vIENvcHkgZGF0YSB0byBhc2htZW0gYXJlYQorICAgICAgICBtZW1jcHkoYXNobWVtX3B0ciwgZGF0YSwgbGVuZ3RoKTsKKworICAgICAgICAvLyBtdW5tYXAgYXNobWVtIGFyZWEKKyAgICAgICAgaWYgKG11bm1hcChhc2htZW1fcHRyLCBsZW5ndGgpIDwgMCkgeworICAgICAgICAgICAgTE9HRSgibXVubWFwIGZhaWxlZDogJXMiLCBzdHJlcnJvcihlcnJubykpOworICAgICAgICAgICAgam5pVGhyb3dJT0V4Y2VwdGlvbihlbnYsIGVycm5vKTsKKyAgICAgICAgICAgIGNsb3NlKGZkKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gTWFrZSBhc2htZW0gYXJlYSByZWFkLW9ubHkKKyAgICBpZiAoYXNobWVtX3NldF9wcm90X3JlZ2lvbihmZCwgUFJPVF9SRUFEKSA8IDApIHsKKyAgICAgICAgTE9HRSgiYXNobWVtX3NldF9wcm90X3JlZ2lvbiBmYWlsZWQ6ICVzIiwgc3RyZXJyb3IoZXJybm8pKTsKKyAgICAgICAgam5pVGhyb3dJT0V4Y2VwdGlvbihlbnYsIGVycm5vKTsKKyAgICAgICAgY2xvc2UoZmQpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICAvLyBXcmFwIGl0IGluIGEgUGFyY2VsRmlsZURlc2NyaXB0b3IKKyAgICByZXR1cm4gY3JlYXRlUGFyY2VsRmlsZURlc2NyaXB0b3IoZW52LCBmZCk7Cit9CisKK3N0YXRpYyBqb2JqZWN0IG5hdGl2ZV8xeDFfYmxvYl9hc2htZW0oSk5JRW52KiBlbnYsIGpvYmplY3Qgb2JqZWN0KQoreworICAgIGludCBlcnI7CisgICAgc3FsaXRlMyAqIGhhbmRsZSA9IEdFVF9IQU5ETEUoZW52LCBvYmplY3QpOworICAgIHNxbGl0ZTNfc3RtdCAqIHN0YXRlbWVudCA9IEdFVF9TVEFURU1FTlQoZW52LCBvYmplY3QpOworICAgIGpvYmplY3QgdmFsdWUgPSBOVUxMOworCisgICAgLy8gRXhlY3V0ZSB0aGUgc3RhdGVtZW50CisgICAgZXJyID0gc3FsaXRlM19zdGVwKHN0YXRlbWVudCk7CisKKyAgICAvLyBIYW5kbGUgdGhlIHJlc3VsdAorICAgIGlmIChlcnIgPT0gU1FMSVRFX1JPVykgeworICAgICAgICAvLyBObyBlcnJvcnMsIHJlYWQgdGhlIGRhdGEgYW5kIHJldHVybiBpdAorICAgICAgICBjb25zdCB2b2lkICogYmxvYiA9IHNxbGl0ZTNfY29sdW1uX2Jsb2Ioc3RhdGVtZW50LCAwKTsKKyAgICAgICAgaWYgKGJsb2IgIT0gTlVMTCkgeworICAgICAgICAgICAgaW50IGxlbiA9IHNxbGl0ZTNfY29sdW1uX2J5dGVzKHN0YXRlbWVudCwgMCk7CisgICAgICAgICAgICBpZiAobGVuID49IDApIHsKKyAgICAgICAgICAgICAgICB2YWx1ZSA9IGNyZWF0ZV9hc2htZW1fcmVnaW9uX3dpdGhfZGF0YShlbnYsIGJsb2IsIGxlbik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICB0aHJvd19zcWxpdGUzX2V4Y2VwdGlvbl9lcnJjb2RlKGVudiwgZXJyLCBzcWxpdGUzX2Vycm1zZyhoYW5kbGUpKTsKKyAgICB9CisKKyAgICAvLyBSZXNldCB0aGUgc3RhdG1lbnQgc28gaXQncyByZWFkeSB0byB1c2UgYWdhaW4KKyAgICBzcWxpdGUzX3Jlc2V0KHN0YXRlbWVudCk7CisKKyAgICByZXR1cm4gdmFsdWU7Cit9CiAKIHN0YXRpYyBKTklOYXRpdmVNZXRob2Qgc01ldGhvZHNbXSA9CiB7CiAgICAgIC8qIG5hbWUsIHNpZ25hdHVyZSwgZnVuY1B0ciAqLwotICAgIHsibmF0aXZlX2V4ZWN1dGUiLCAiKClWIiwgKHZvaWQgKiluYXRpdmVfZXhlY3V0ZX0sCisgICAgeyJuYXRpdmVfZXhlY3V0ZSIsICIoKUkiLCAodm9pZCAqKW5hdGl2ZV9leGVjdXRlfSwKKyAgICB7Im5hdGl2ZV9leGVjdXRlSW5zZXJ0IiwgIigpSiIsICh2b2lkICopbmF0aXZlX2V4ZWN1dGVJbnNlcnR9LAogICAgIHsibmF0aXZlXzF4MV9sb25nIiwgIigpSiIsICh2b2lkICopbmF0aXZlXzF4MV9sb25nfSwKICAgICB7Im5hdGl2ZV8xeDFfc3RyaW5nIiwgIigpTGphdmEvbGFuZy9TdHJpbmc7IiwgKHZvaWQgKiluYXRpdmVfMXgxX3N0cmluZ30sCisgICAgeyJuYXRpdmVfMXgxX2Jsb2JfYXNobWVtIiwgIigpTGFuZHJvaWQvb3MvUGFyY2VsRmlsZURlc2NyaXB0b3I7IiwgKHZvaWQgKiluYXRpdmVfMXgxX2Jsb2JfYXNobWVtfSwKIH07CiAKIGludCByZWdpc3Rlcl9hbmRyb2lkX2RhdGFiYXNlX1NRTGl0ZVN0YXRlbWVudChKTklFbnYgKiBlbnYpCmRpZmYgLS1naXQgYS9jb3JlL2puaS9hbmRyb2lkX25ldF9OZXRVdGlscy5jcHAgYi9jb3JlL2puaS9hbmRyb2lkX25ldF9OZXRVdGlscy5jcHAKaW5kZXggNjU3NWI5YS4uMzUxZjI2NCAxMDA2NDQKLS0tIGEvY29yZS9qbmkvYW5kcm9pZF9uZXRfTmV0VXRpbHMuY3BwCisrKyBiL2NvcmUvam5pL2FuZHJvaWRfbmV0X05ldFV0aWxzLmNwcApAQCAtMjI0LDcgKzIyNCw4IEBACiAgICAgeyAiYWRkUm91dGUiLCAiKExqYXZhL2xhbmcvU3RyaW5nO0xqYXZhL2xhbmcvU3RyaW5nO0lMamF2YS9sYW5nL1N0cmluZzspSSIsCiAgICAgICAgKHZvaWQgKilhbmRyb2lkX25ldF91dGlsc19hZGRSb3V0ZSB9LAogICAgIHsgInJlbW92ZUhvc3RSb3V0ZXMiLCAiKExqYXZhL2xhbmcvU3RyaW5nOylJIiwgICh2b2lkICopYW5kcm9pZF9uZXRfdXRpbHNfcmVtb3ZlSG9zdFJvdXRlcyB9LAotICAgIHsgImdldERlZmF1bHRSb3V0ZSIsICIoTGphdmEvbGFuZy9TdHJpbmc7KUkiLCAgKHZvaWQgKilhbmRyb2lkX25ldF91dGlsc19nZXREZWZhdWx0Um91dGUgfSwKKyAgICB7ICJnZXREZWZhdWx0Um91dGVOYXRpdmUiLCAiKExqYXZhL2xhbmcvU3RyaW5nOylJIiwKKyAgICAgICAodm9pZCAqKWFuZHJvaWRfbmV0X3V0aWxzX2dldERlZmF1bHRSb3V0ZSB9LAogICAgIHsgInJlbW92ZURlZmF1bHRSb3V0ZSIsICIoTGphdmEvbGFuZy9TdHJpbmc7KUkiLCAgKHZvaWQgKilhbmRyb2lkX25ldF91dGlsc19yZW1vdmVEZWZhdWx0Um91dGUgfSwKICAgICB7ICJyZXNldENvbm5lY3Rpb25zIiwgIihMamF2YS9sYW5nL1N0cmluZzspSSIsICAodm9pZCAqKWFuZHJvaWRfbmV0X3V0aWxzX3Jlc2V0Q29ubmVjdGlvbnMgfSwKICAgICB7ICJydW5EaGNwIiwgIihMamF2YS9sYW5nL1N0cmluZztMYW5kcm9pZC9uZXQvRGhjcEluZm87KVoiLCAgKHZvaWQgKilhbmRyb2lkX25ldF91dGlsc19ydW5EaGNwIH0sCmRpZmYgLS1naXQgYS9jb3JlL2puaS9hbmRyb2lkX25ldF93aWZpX1dpZmkuY3BwIGIvY29yZS9qbmkvYW5kcm9pZF9uZXRfd2lmaV9XaWZpLmNwcAppbmRleCBmYjAyOWU2Li5jNWNjYzQzIDEwMDY0NAotLS0gYS9jb3JlL2puaS9hbmRyb2lkX25ldF93aWZpX1dpZmkuY3BwCisrKyBiL2NvcmUvam5pL2FuZHJvaWRfbmV0X3dpZmlfV2lmaS5jcHAKQEAgLTk4LDYgKzk4LDExIEBACiAgICAgfQogfQogCitzdGF0aWMgamJvb2xlYW4gYW5kcm9pZF9uZXRfd2lmaV9pc0RyaXZlckxvYWRlZChKTklFbnYqIGVudiwgam9iamVjdCBjbGF6eikKK3sKKyAgICByZXR1cm4gKGpib29sZWFuKSg6OmlzX3dpZmlfZHJpdmVyX2xvYWRlZCgpID09IDEpOworfQorCiBzdGF0aWMgamJvb2xlYW4gYW5kcm9pZF9uZXRfd2lmaV9sb2FkRHJpdmVyKEpOSUVudiogZW52LCBqb2JqZWN0IGNsYXp6KQogewogICAgIHJldHVybiAoamJvb2xlYW4pKDo6d2lmaV9sb2FkX2RyaXZlcigpID09IDApOwpAQCAtNDA2LDYgKzQxMSwzMCBAQAogICAgIHJldHVybiAoamludClwb3dlcjsKIH0KIAorc3RhdGljIGpib29sZWFuIGFuZHJvaWRfbmV0X3dpZmlfc2V0QmFuZENvbW1hbmQoSk5JRW52KiBlbnYsIGpvYmplY3QgY2xhenosIGppbnQgYmFuZCkKK3sKKyAgICBjaGFyIGNtZHN0clsyNV07CisKKyAgICBpbnQgbnVtV3JpdHRlbiA9IHNucHJpbnRmKGNtZHN0ciwgc2l6ZW9mKGNtZHN0ciksICJEUklWRVIgU0VUQkFORCAlZCIsIGJhbmQpOworICAgIGludCBjbWRUb29Mb25nID0gbnVtV3JpdHRlbiA+PSAoaW50KXNpemVvZihjbWRzdHIpOworCisgICAgcmV0dXJuIChqYm9vbGVhbikhY21kVG9vTG9uZyAmJiBkb0Jvb2xlYW5Db21tYW5kKGNtZHN0ciwgIk9LIik7Cit9CisKK3N0YXRpYyBqaW50IGFuZHJvaWRfbmV0X3dpZmlfZ2V0QmFuZENvbW1hbmQoSk5JRW52KiBlbnYsIGpvYmplY3QgY2xhenopCit7CisgICAgY2hhciByZXBseVsyNV07CisgICAgaW50IGJhbmQ7CisKKyAgICBpZiAoZG9Db21tYW5kKCJEUklWRVIgR0VUQkFORCIsIHJlcGx5LCBzaXplb2YocmVwbHkpKSAhPSAwKSB7CisgICAgICAgIHJldHVybiAoamludCktMTsKKyAgICB9CisgICAgLy8gcmVwbHkgY29tZXMgYmFjayBpbiB0aGUgZm9ybSAiQmFuZCBYIiB3aGVyZSBYIGlzIHRoZQorICAgIC8vIG51bWJlciB3ZSdyZSBpbnRlcmVzdGVkIGluLgorICAgIHNzY2FuZihyZXBseSwgIiUqcyAldSIsICZiYW5kKTsKKyAgICByZXR1cm4gKGppbnQpYmFuZDsKK30KKwogc3RhdGljIGpib29sZWFuIGFuZHJvaWRfbmV0X3dpZmlfc2V0TnVtQWxsb3dlZENoYW5uZWxzQ29tbWFuZChKTklFbnYqIGVudiwgam9iamVjdCBjbGF6eiwgamludCBudW1DaGFubmVscykKIHsKICAgICBjaGFyIGNtZHN0clsyNTZdOwpAQCAtNDkzLDE1ICs1MjIsNiBAQAogICAgIHJldHVybiBkb0Jvb2xlYW5Db21tYW5kKCJCTEFDS0xJU1QgY2xlYXIiLCAiT0siKTsKIH0KIAotc3RhdGljIGpib29sZWFuIGFuZHJvaWRfbmV0X3dpZmlfc2V0U3VzcGVuZE9wdGltaXphdGlvbnNDb21tYW5kKEpOSUVudiogZW52LCBqb2JqZWN0IGNsYXp6LCBqYm9vbGVhbiBlbmFibGVkKQotewotICAgIGNoYXIgY21kc3RyWzI1XTsKLQotICAgIHNucHJpbnRmKGNtZHN0ciwgc2l6ZW9mKGNtZHN0ciksICJEUklWRVIgU0VUU1VTUEVORE9QVCAlZCIsIGVuYWJsZWQgPyAwIDogMSk7Ci0gICAgcmV0dXJuIGRvQm9vbGVhbkNvbW1hbmQoY21kc3RyLCAiT0siKTsKLX0KLQotCiBzdGF0aWMgamJvb2xlYW4gYW5kcm9pZF9uZXRfd2lmaV9kb0RoY3BSZXF1ZXN0KEpOSUVudiogZW52LCBqb2JqZWN0IGNsYXp6LCBqb2JqZWN0IGluZm8pCiB7CiAgICAgamludCBpcGFkZHIsIGdhdGV3YXksIG1hc2ssIGRuczEsIGRuczIsIHNlcnZlciwgbGVhc2U7CkBAIC01MzMsNiArNTUzLDcgQEAKICAgICAvKiBuYW1lLCBzaWduYXR1cmUsIGZ1bmNQdHIgKi8KIAogICAgIHsgImxvYWREcml2ZXIiLCAiKClaIiwgICh2b2lkICopYW5kcm9pZF9uZXRfd2lmaV9sb2FkRHJpdmVyIH0sCisgICAgeyAiaXNEcml2ZXJMb2FkZWQiLCAiKClaIiwgICh2b2lkICopYW5kcm9pZF9uZXRfd2lmaV9pc0RyaXZlckxvYWRlZH0sCiAgICAgeyAidW5sb2FkRHJpdmVyIiwgIigpWiIsICAodm9pZCAqKWFuZHJvaWRfbmV0X3dpZmlfdW5sb2FkRHJpdmVyIH0sCiAgICAgeyAic3RhcnRTdXBwbGljYW50IiwgIigpWiIsICAodm9pZCAqKWFuZHJvaWRfbmV0X3dpZmlfc3RhcnRTdXBwbGljYW50IH0sCiAgICAgeyAic3RvcFN1cHBsaWNhbnQiLCAiKClaIiwgICh2b2lkICopYW5kcm9pZF9uZXRfd2lmaV9zdG9wU3VwcGxpY2FudCB9LApAQCAtNTY0LDYgKzU4NSw4IEBACiAgICAgeyAic3RvcFBhY2tldEZpbHRlcmluZyIsICIoKVoiLCAodm9pZCopIGFuZHJvaWRfbmV0X3dpZmlfc3RvcFBhY2tldEZpbHRlcmluZyB9LAogICAgIHsgInNldFBvd2VyTW9kZUNvbW1hbmQiLCAiKEkpWiIsICh2b2lkKikgYW5kcm9pZF9uZXRfd2lmaV9zZXRQb3dlck1vZGVDb21tYW5kIH0sCiAgICAgeyAiZ2V0UG93ZXJNb2RlQ29tbWFuZCIsICIoKUkiLCAodm9pZCopIGFuZHJvaWRfbmV0X3dpZmlfZ2V0UG93ZXJNb2RlQ29tbWFuZCB9LAorICAgIHsgInNldEJhbmRDb21tYW5kIiwgIihJKVoiLCAodm9pZCopIGFuZHJvaWRfbmV0X3dpZmlfc2V0QmFuZENvbW1hbmR9LAorICAgIHsgImdldEJhbmRDb21tYW5kIiwgIigpSSIsICh2b2lkKikgYW5kcm9pZF9uZXRfd2lmaV9nZXRCYW5kQ29tbWFuZH0sCiAgICAgeyAic2V0TnVtQWxsb3dlZENoYW5uZWxzQ29tbWFuZCIsICIoSSlaIiwgKHZvaWQqKSBhbmRyb2lkX25ldF93aWZpX3NldE51bUFsbG93ZWRDaGFubmVsc0NvbW1hbmQgfSwKICAgICB7ICJnZXROdW1BbGxvd2VkQ2hhbm5lbHNDb21tYW5kIiwgIigpSSIsICh2b2lkKikgYW5kcm9pZF9uZXRfd2lmaV9nZXROdW1BbGxvd2VkQ2hhbm5lbHNDb21tYW5kIH0sCiAgICAgeyAic2V0Qmx1ZXRvb3RoQ29leGlzdGVuY2VNb2RlQ29tbWFuZCIsICIoSSlaIiwKQEAgLTU4MCw3ICs2MDMsNiBAQAogICAgIHsgInNldFNjYW5SZXN1bHRIYW5kbGluZ0NvbW1hbmQiLCAiKEkpWiIsICh2b2lkKikgYW5kcm9pZF9uZXRfd2lmaV9zZXRTY2FuUmVzdWx0SGFuZGxpbmdDb21tYW5kIH0sCiAgICAgeyAiYWRkVG9CbGFja2xpc3RDb21tYW5kIiwgIihMamF2YS9sYW5nL1N0cmluZzspWiIsICh2b2lkKikgYW5kcm9pZF9uZXRfd2lmaV9hZGRUb0JsYWNrbGlzdENvbW1hbmQgfSwKICAgICB7ICJjbGVhckJsYWNrbGlzdENvbW1hbmQiLCAiKClaIiwgKHZvaWQqKSBhbmRyb2lkX25ldF93aWZpX2NsZWFyQmxhY2tsaXN0Q29tbWFuZCB9LAotICAgIHsgInNldFN1c3BlbmRPcHRpbWl6YXRpb25zQ29tbWFuZCIsICIoWilaIiwgKHZvaWQqKSBhbmRyb2lkX25ldF93aWZpX3NldFN1c3BlbmRPcHRpbWl6YXRpb25zQ29tbWFuZH0sCiAKICAgICB7ICJkb0RoY3BSZXF1ZXN0IiwgIihMYW5kcm9pZC9uZXQvRGhjcEluZm87KVoiLCAodm9pZCopIGFuZHJvaWRfbmV0X3dpZmlfZG9EaGNwUmVxdWVzdCB9LAogICAgIHsgImdldERoY3BFcnJvciIsICIoKUxqYXZhL2xhbmcvU3RyaW5nOyIsICh2b2lkKikgYW5kcm9pZF9uZXRfd2lmaV9nZXREaGNwRXJyb3IgfSwKZGlmZiAtLWdpdCBhL2NvcmUvam5pL2FuZHJvaWRfb3NfRGVidWcuY3BwIGIvY29yZS9qbmkvYW5kcm9pZF9vc19EZWJ1Zy5jcHAKaW5kZXggM2VlNDA0YS4uNGE4NzdkMiAxMDA2NDQKLS0tIGEvY29yZS9qbmkvYW5kcm9pZF9vc19EZWJ1Zy5jcHAKKysrIGIvY29yZS9qbmkvYW5kcm9pZF9vc19EZWJ1Zy5jcHAKQEAgLTE0LDYgKzE0LDcgQEAKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKKyNkZWZpbmUgTE9HX1RBRyAiYW5kcm9pZC5vcy5EZWJ1ZyIKICNpbmNsdWRlICJKTklIZWxwLmgiCiAjaW5jbHVkZSAiam5pLmgiCiAjaW5jbHVkZSAidXRpbHMvbWlzYy5oIgpAQCAtMjQsNiArMjUsOCBAQAogI2luY2x1ZGUgPHVuaXN0ZC5oPgogI2luY2x1ZGUgPHRpbWUuaD4KICNpbmNsdWRlIDxzeXMvdGltZS5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8YXNzZXJ0Lmg+CiAKICNpZmRlZiBIQVZFX01BTExPQ19ICiAjaW5jbHVkZSA8bWFsbG9jLmg+CkBAIC0yNzQsNiArMjc3LDE3NiBAQAogamludCBhbmRyb2lkX29zX0RlYnVnX2dldFByb3h5T2JqZWN0Q291bnQoSk5JRW52KiBlbnYsIGpvYmplY3QgY2xhenopOwogamludCBhbmRyb2lkX29zX0RlYnVnX2dldERlYXRoT2JqZWN0Q291bnQoSk5JRW52KiBlbnYsIGpvYmplY3QgY2xhenopOwogCisKKyNpZmRlZiBIQVZFX0FORFJPSURfT1MKKy8qIHB1bGxlZCBvdXQgb2YgYmlvbmljICovCitleHRlcm4gIkMiIHZvaWQgZ2V0X21hbGxvY19sZWFrX2luZm8odWludDhfdCoqIGluZm8sIHNpemVfdCogb3ZlcmFsbFNpemUsCisgICAgc2l6ZV90KiBpbmZvU2l6ZSwgc2l6ZV90KiB0b3RhbE1lbW9yeSwgc2l6ZV90KiBiYWNrdHJhY2VTaXplKTsKK2V4dGVybiAiQyIgdm9pZCBmcmVlX21hbGxvY19sZWFrX2luZm8odWludDhfdCogaW5mbyk7CisjZGVmaW5lIFNJWkVfRkxBR19aWUdPVEVfQ0hJTEQgICgxPDwzMSkKKyNkZWZpbmUgQkFDS1RSQUNFX1NJWkUgICAgICAgICAgMzIKKworLyoKKyAqIFRoaXMgaXMgYSBxc29ydCgpIGNhbGxiYWNrLgorICoKKyAqIFNlZSBkdW1wTmF0aXZlSGVhcCgpIGZvciBjb21tZW50cyBhYm91dCB0aGUgZGF0YSBmb3JtYXQgYW5kIHNvcnQgb3JkZXIuCisgKi8KK3N0YXRpYyBpbnQgY29tcGFyZUhlYXBSZWNvcmRzKGNvbnN0IHZvaWQqIHZyZWMxLCBjb25zdCB2b2lkKiB2cmVjMikKK3sKKyAgICBjb25zdCBzaXplX3QqIHJlYzEgPSAoY29uc3Qgc2l6ZV90KikgdnJlYzE7CisgICAgY29uc3Qgc2l6ZV90KiByZWMyID0gKGNvbnN0IHNpemVfdCopIHZyZWMyOworICAgIHNpemVfdCBzaXplMSA9ICpyZWMxOworICAgIHNpemVfdCBzaXplMiA9ICpyZWMyOworCisgICAgaWYgKHNpemUxIDwgc2l6ZTIpIHsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfSBlbHNlIGlmIChzaXplMSA+IHNpemUyKSB7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICBpbnRwdHJfdCogYnQxID0gKGludHB0cl90KikocmVjMSArIDIpOworICAgIGludHB0cl90KiBidDIgPSAoaW50cHRyX3QqKShyZWMyICsgMik7CisgICAgZm9yIChzaXplX3QgaWR4ID0gMDsgaWR4IDwgQkFDS1RSQUNFX1NJWkU7IGlkeCsrKSB7CisgICAgICAgIGludHB0cl90IGFkZHIxID0gYnQxW2lkeF07CisgICAgICAgIGludHB0cl90IGFkZHIyID0gYnQyW2lkeF07CisgICAgICAgIGlmIChhZGRyMSA9PSBhZGRyMikgeworICAgICAgICAgICAgaWYgKGFkZHIxID09IDApCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoYWRkcjEgPCBhZGRyMikgeworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9IGVsc2UgaWYgKGFkZHIxID4gYWRkcjIpIHsKKyAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKKy8qCisgKiBUaGUgZ2V0X21hbGxvY19sZWFrX2luZm8oKSBjYWxsIHJldHVybnMgYW4gYXJyYXkgb2Ygc3RydWN0cyB0aGF0CisgKiBsb29rIGxpa2UgdGhpczoKKyAqCisgKiAgIHNpemVfdCBzaXplCisgKiAgIHNpemVfdCBhbGxvY2F0aW9ucworICogICBpbnRwdHJfdCBiYWNrdHJhY2VbMzJdCisgKgorICogInNpemUiIGlzIHRoZSBzaXplIG9mIHRoZSBhbGxvY2F0aW9uLCAiYmFja3RyYWNlIiBpcyBhIGZpeGVkLXNpemUKKyAqIGFycmF5IG9mIGZ1bmN0aW9uIHBvaW50ZXJzLCBhbmQgImFsbG9jYXRpb25zIiBpcyB0aGUgbnVtYmVyIG9mCisgKiBhbGxvY2F0aW9ucyB3aXRoIHRoZSBleGFjdCBzYW1lIHNpemUgYW5kIGJhY2t0cmFjZS4KKyAqCisgKiBUaGUgZW50cmllcyBhcmUgc29ydGVkIGJ5IGRlc2NlbmRpbmcgdG90YWwgc2l6ZSAoaS5lLiBzaXplKmFsbG9jYXRpb25zKQorICogdGhlbiBhbGxvY2F0aW9uIGNvdW50LiAgRm9yIGJlc3QgcmVzdWx0cyB3aXRoICJkaWZmIiB3ZSdkIGxpa2UgdG8gc29ydAorICogcHJpbWFyaWx5IGJ5IGluZGl2aWR1YWwgc2l6ZSB0aGVuIHN0YWNrIHRyYWNlLiAgU2luY2UgdGhlIGVudHJpZXMgYXJlCisgKiBmaXhlZC1zaXplLCBhbmQgd2UncmUgYWxsb3dlZCAoYnkgdGhlIGN1cnJlbnQgaW1wbGVtZW50YXRpb24pIHRvIG1hbmdsZQorICogdGhlbSwgd2UgY2FuIGRvIHRoaXMgaW4gcGxhY2UuCisgKi8KK3N0YXRpYyB2b2lkIGR1bXBOYXRpdmVIZWFwKEZJTEUqIGZwKQoreworICAgIHVpbnQ4X3QqIGluZm8gPSBOVUxMOworICAgIHNpemVfdCBvdmVyYWxsU2l6ZSwgaW5mb1NpemUsIHRvdGFsTWVtb3J5LCBiYWNrdHJhY2VTaXplOworCisgICAgZ2V0X21hbGxvY19sZWFrX2luZm8oJmluZm8sICZvdmVyYWxsU2l6ZSwgJmluZm9TaXplLCAmdG90YWxNZW1vcnksCisgICAgICAgICZiYWNrdHJhY2VTaXplKTsKKyAgICBpZiAoaW5mbyA9PSBOVUxMKSB7CisgICAgICAgIGZwcmludGYoZnAsICJOYXRpdmUgaGVhcCBkdW1wIG5vdCBhdmFpbGFibGUuIFRvIGVuYWJsZSwgcnVuIHRoZXNlIgorICAgICAgICAgICAgICAgICAgICAiIGNvbW1hbmRzIChyZXF1aXJlcyByb290KTpcbiIpOworICAgICAgICBmcHJpbnRmKGZwLCAiJCBhZGIgc2hlbGwgc2V0cHJvcCBsaWJjLmRlYnVnLm1hbGxvYyAxXG4iKTsKKyAgICAgICAgZnByaW50ZihmcCwgIiQgYWRiIHNoZWxsIHN0b3BcbiIpOworICAgICAgICBmcHJpbnRmKGZwLCAiJCBhZGIgc2hlbGwgc3RhcnRcbiIpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGFzc2VydChpbmZvU2l6ZSAhPSAwKTsKKyAgICBhc3NlcnQob3ZlcmFsbFNpemUgJSBpbmZvU2l6ZSA9PSAwKTsKKworICAgIGZwcmludGYoZnAsICJBbmRyb2lkIE5hdGl2ZSBIZWFwIER1bXAgdjEuMFxuXG4iKTsKKworICAgIHNpemVfdCByZWNvcmRDb3VudCA9IG92ZXJhbGxTaXplIC8gaW5mb1NpemU7CisgICAgZnByaW50ZihmcCwgIlRvdGFsIG1lbW9yeTogJXp1XG4iLCB0b3RhbE1lbW9yeSk7CisgICAgZnByaW50ZihmcCwgIkFsbG9jYXRpb24gcmVjb3JkczogJXpkXG4iLCByZWNvcmRDb3VudCk7CisgICAgaWYgKGJhY2t0cmFjZVNpemUgIT0gQkFDS1RSQUNFX1NJWkUpIHsKKyAgICAgICAgZnByaW50ZihmcCwgIldBUk5JTkc6IG1pc21hdGNoZWQgYmFja3RyYWNlIHNpemVzICglZCB2cy4gJWQpXG4iLAorICAgICAgICAgICAgYmFja3RyYWNlU2l6ZSwgQkFDS1RSQUNFX1NJWkUpOworICAgIH0KKyAgICBmcHJpbnRmKGZwLCAiXG4iKTsKKworICAgIC8qIHJlLXNvcnQgdGhlIGVudHJpZXMgKi8KKyAgICBxc29ydChpbmZvLCByZWNvcmRDb3VudCwgaW5mb1NpemUsIGNvbXBhcmVIZWFwUmVjb3Jkcyk7CisKKyAgICAvKiBkdW1wIHRoZSBlbnRyaWVzIHRvIHRoZSBmaWxlICovCisgICAgY29uc3QgdWludDhfdCogcHRyID0gaW5mbzsKKyAgICBmb3IgKHNpemVfdCBpZHggPSAwOyBpZHggPCByZWNvcmRDb3VudDsgaWR4KyspIHsKKyAgICAgICAgc2l6ZV90IHNpemUgPSAqKHNpemVfdCopIHB0cjsKKyAgICAgICAgc2l6ZV90IGFsbG9jYXRpb25zID0gKihzaXplX3QqKSAocHRyICsgc2l6ZW9mKHNpemVfdCkpOworICAgICAgICBpbnRwdHJfdCogYmFja3RyYWNlID0gKGludHB0cl90KikgKHB0ciArIHNpemVvZihzaXplX3QpICogMik7CisKKyAgICAgICAgZnByaW50ZihmcCwgInogJWQgIHN6ICU4enUgIG51bSAlNHp1ICBidCIsCisgICAgICAgICAgICAgICAgKHNpemUgJiBTSVpFX0ZMQUdfWllHT1RFX0NISUxEKSAhPSAwLAorICAgICAgICAgICAgICAgIHNpemUgJiB+U0laRV9GTEFHX1pZR09URV9DSElMRCwKKyAgICAgICAgICAgICAgICBhbGxvY2F0aW9ucyk7CisgICAgICAgIGZvciAoc2l6ZV90IGJ0ID0gMDsgYnQgPCBiYWNrdHJhY2VTaXplOyBidCsrKSB7CisgICAgICAgICAgICBpZiAoYmFja3RyYWNlW2J0XSA9PSAwKSB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGZwcmludGYoZnAsICIgJTA4eCIsIGJhY2t0cmFjZVtidF0pOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGZwcmludGYoZnAsICJcbiIpOworCisgICAgICAgIHB0ciArPSBpbmZvU2l6ZTsKKyAgICB9CisKKyAgICBmcHJpbnRmKGZwLCAiRU5EXG4iKTsKKyAgICBmcmVlX21hbGxvY19sZWFrX2luZm8oaW5mbyk7Cit9CisjZW5kaWYgLypIQVZFX0FORFJPSURfT1MqLworCisvKgorICogRHVtcCB0aGUgbmF0aXZlIGhlYXAsIHdyaXRpbmcgaHVtYW4tcmVhZGFibGUgb3V0cHV0IHRvIHRoZSBzcGVjaWZpZWQKKyAqIGZpbGUgZGVzY3JpcHRvci4KKyAqLworc3RhdGljIHZvaWQgYW5kcm9pZF9vc19EZWJ1Z19kdW1wTmF0aXZlSGVhcChKTklFbnYqIGVudiwgam9iamVjdCBjbGF6eiwKKyAgICBqb2JqZWN0IGZpbGVEZXNjcmlwdG9yKQoreworICAgIGlmIChmaWxlRGVzY3JpcHRvciA9PSBOVUxMKSB7CisgICAgICAgIGpuaVRocm93TnVsbFBvaW50ZXJFeGNlcHRpb24oZW52LCBOVUxMKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBpbnQgb3JpZ0ZkID0gam5pR2V0RkRGcm9tRmlsZURlc2NyaXB0b3IoZW52LCBmaWxlRGVzY3JpcHRvcik7CisgICAgaWYgKG9yaWdGZCA8IDApIHsKKyAgICAgICAgam5pVGhyb3dSdW50aW1lRXhjZXB0aW9uKGVudiwgIkludmFsaWQgZmlsZSBkZXNjcmlwdG9yIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvKiBkdXAoKSB0aGUgZGVzY3JpcHRvciBzbyB3ZSBkb24ndCBjbG9zZSB0aGUgb3JpZ2luYWwgd2l0aCBmY2xvc2UoKSAqLworICAgIGludCBmZCA9IGR1cChvcmlnRmQpOworICAgIGlmIChmZCA8IDApIHsKKyAgICAgICAgTE9HVygiZHVwKCVkKSBmYWlsZWQ6ICVzXG4iLCBvcmlnRmQsIHN0cmVycm9yKGVycm5vKSk7CisgICAgICAgIGpuaVRocm93UnVudGltZUV4Y2VwdGlvbihlbnYsICJkdXAoKSBmYWlsZWQiKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIEZJTEUqIGZwID0gZmRvcGVuKGZkLCAidyIpOworICAgIGlmIChmcCA9PSBOVUxMKSB7CisgICAgICAgIExPR1coImZkb3BlbiglZCkgZmFpbGVkOiAlc1xuIiwgZmQsIHN0cmVycm9yKGVycm5vKSk7CisgICAgICAgIGNsb3NlKGZkKTsKKyAgICAgICAgam5pVGhyb3dSdW50aW1lRXhjZXB0aW9uKGVudiwgImZkb3BlbigpIGZhaWxlZCIpOworICAgICAgICByZXR1cm47CisgICAgfQorCisjaWZkZWYgSEFWRV9BTkRST0lEX09TCisgICAgTE9HRCgiTmF0aXZlIGhlYXAgZHVtcCBzdGFydGluZy4uLlxuIik7CisgICAgZHVtcE5hdGl2ZUhlYXAoZnApOworICAgIExPR0QoIk5hdGl2ZSBoZWFwIGR1bXAgY29tcGxldGUuXG4iKTsKKyNlbHNlCisgICAgZnByaW50ZihmcCwgIk5hdGl2ZSBoZWFwIGR1bXAgbm90IGF2YWlsYWJsZSBvbiB0aGlzIHBsYXRmb3JtXG4iKTsKKyNlbmRpZgorCisgICAgZmNsb3NlKGZwKTsKK30KKworCiAvKgogICogSk5JIHJlZ2lzdHJhdGlvbi4KICAqLwpAQCAtMjg5LDYgKzQ2Miw4IEBACiAgICAgICAgICAgICAodm9pZCopIGFuZHJvaWRfb3NfRGVidWdfZ2V0RGlydHlQYWdlcyB9LAogICAgIHsgImdldE1lbW9yeUluZm8iLCAgICAgICAgICAiKElMYW5kcm9pZC9vcy9EZWJ1ZyRNZW1vcnlJbmZvOylWIiwKICAgICAgICAgICAgICh2b2lkKikgYW5kcm9pZF9vc19EZWJ1Z19nZXREaXJ0eVBhZ2VzUGlkIH0sCisgICAgeyAiZHVtcE5hdGl2ZUhlYXAiLCAgICAgICAgICIoTGphdmEvaW8vRmlsZURlc2NyaXB0b3I7KVYiLAorICAgICAgICAgICAgKHZvaWQqKSBhbmRyb2lkX29zX0RlYnVnX2R1bXBOYXRpdmVIZWFwIH0sCiAgICAgeyAiZ2V0QmluZGVyU2VudFRyYW5zYWN0aW9ucyIsICIoKUkiLAogICAgICAgICAgICAgKHZvaWQqKSBhbmRyb2lkX29zX0RlYnVnX2dldEJpbmRlclNlbnRUcmFuc2FjdGlvbnMgfSwKICAgICB7ICJnZXRCaW5kZXJSZWNlaXZlZFRyYW5zYWN0aW9ucyIsICIoKUkiLApAQCAtMzIwLDQgKzQ5NSw0IEBACiAgICAgcmV0dXJuIGpuaVJlZ2lzdGVyTmF0aXZlTWV0aG9kcyhlbnYsICJhbmRyb2lkL29zL0RlYnVnIiwgZ01ldGhvZHMsIE5FTEVNKGdNZXRob2RzKSk7CiB9CiAKLX07Cit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvY29yZS9qbmkvYW5kcm9pZF9vc19GaWxlVXRpbHMuY3BwIGIvY29yZS9qbmkvYW5kcm9pZF9vc19GaWxlVXRpbHMuY3BwCmluZGV4IDIxY2I5MTkuLmQzZmFhMmYgMTAwNjQ0Ci0tLSBhL2NvcmUvam5pL2FuZHJvaWRfb3NfRmlsZVV0aWxzLmNwcAorKysgYi9jb3JlL2puaS9hbmRyb2lkX29zX0ZpbGVVdGlscy5jcHAKQEAgLTExMyw2ICsxMTMsMTEgQEAKICAgICAjZW5kaWYKIH0KIAoramludCBhbmRyb2lkX29zX0ZpbGVVdGlsc19zZXRVTWFzayhKTklFbnYqIGVudiwgam9iamVjdCBjbGF6eiwgamludCBtYXNrKQoreworICAgIHJldHVybiB1bWFzayhtYXNrKTsKK30KKwogamludCBhbmRyb2lkX29zX0ZpbGVVdGlsc19nZXRGYXRWb2x1bWVJZChKTklFbnYqIGVudiwgam9iamVjdCBjbGF6eiwganN0cmluZyBwYXRoKQogewogICAgICNpZiBIQVZFX0FORFJPSURfT1MKQEAgLTE3MCw2ICsxNzUsNyBAQAogc3RhdGljIGNvbnN0IEpOSU5hdGl2ZU1ldGhvZCBtZXRob2RzW10gPSB7CiAgICAgeyJzZXRQZXJtaXNzaW9ucyIsICAiKExqYXZhL2xhbmcvU3RyaW5nO0lJSSlJIiwgKHZvaWQqKWFuZHJvaWRfb3NfRmlsZVV0aWxzX3NldFBlcm1pc3Npb25zfSwKICAgICB7ImdldFBlcm1pc3Npb25zIiwgICIoTGphdmEvbGFuZy9TdHJpbmc7W0kpSSIsICh2b2lkKilhbmRyb2lkX29zX0ZpbGVVdGlsc19nZXRQZXJtaXNzaW9uc30sCisgICAgeyJzZXRVTWFzayIsICAgICAgICAiKEkpSSIsICAgICAgICAgICAgICAgICAgICAodm9pZCopYW5kcm9pZF9vc19GaWxlVXRpbHNfc2V0VU1hc2t9LAogICAgIHsiZ2V0RmF0Vm9sdW1lSWQiLCAgIihMamF2YS9sYW5nL1N0cmluZzspSSIsICh2b2lkKilhbmRyb2lkX29zX0ZpbGVVdGlsc19nZXRGYXRWb2x1bWVJZH0sCiAgICAgeyJnZXRGaWxlU3RhdHVzIiwgICIoTGphdmEvbGFuZy9TdHJpbmc7TGFuZHJvaWQvb3MvRmlsZVV0aWxzJEZpbGVTdGF0dXM7KVoiLCAodm9pZCopYW5kcm9pZF9vc19GaWxlVXRpbHNfZ2V0RmlsZVN0YXR1c30sCiB9OwpkaWZmIC0tZ2l0IGEvY29yZS9qbmkvYW5kcm9pZF9vc19QYXJjZWxGaWxlRGVzY3JpcHRvci5jcHAgYi9jb3JlL2puaS9hbmRyb2lkX29zX1BhcmNlbEZpbGVEZXNjcmlwdG9yLmNwcAppbmRleCA4NDhhNTdhLi5lY2VlZjFjIDEwMDY0NAotLS0gYS9jb3JlL2puaS9hbmRyb2lkX29zX1BhcmNlbEZpbGVEZXNjcmlwdG9yLmNwcAorKysgYi9jb3JlL2puaS9hbmRyb2lkX29zX1BhcmNlbEZpbGVEZXNjcmlwdG9yLmNwcApAQCAtNjYsNiArNjYsMjYgQEAKICAgICByZXR1cm4gZmlsZURlc2NyaXB0b3JDbG9uZTsKIH0KIAorc3RhdGljIGludCBhbmRyb2lkX29zX1BhcmNlbEZpbGVEZXNjcmlwdG9yX2NyZWF0ZVBpcGVOYXRpdmUoSk5JRW52KiBlbnYsCisgICAgam9iamVjdCBjbGF6eiwgam9iamVjdEFycmF5IG91dEZkcykKK3sKKyAgICBpbnQgZmRzWzJdOworICAgIGlmIChwaXBlKGZkcykgPCAwKSB7CisgICAgICAgIHJldHVybiAtZXJybm87CisgICAgfQorCisgICAgZm9yIChpbnQgaT0wOyBpPDI7IGkrKykgeworICAgICAgICBqb2JqZWN0IGZkT2JqID0gZW52LT5OZXdPYmplY3QoZ0ZpbGVEZXNjcmlwdG9yT2Zmc2V0cy5tQ2xhc3MsCisgICAgICAgICAgICAgICAgZ0ZpbGVEZXNjcmlwdG9yT2Zmc2V0cy5tQ29uc3RydWN0b3IpOworICAgICAgICBpZiAoZmRPYmogIT0gTlVMTCkgeworICAgICAgICAgICAgZW52LT5TZXRJbnRGaWVsZChmZE9iaiwgZ0ZpbGVEZXNjcmlwdG9yT2Zmc2V0cy5tRGVzY3JpcHRvciwgZmRzW2ldKTsKKyAgICAgICAgfQorICAgICAgICBlbnYtPlNldE9iamVjdEFycmF5RWxlbWVudChvdXRGZHMsIGksIGZkT2JqKTsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKwogc3RhdGljIGppbnQgZ2V0RmQoSk5JRW52KiBlbnYsIGpvYmplY3QgY2xhenopCiB7CiAgICAgam9iamVjdCBkZXNjcmlwdG9yID0gZW52LT5HZXRPYmplY3RGaWVsZChjbGF6eiwgZ1BhcmNlbEZpbGVEZXNjcmlwdG9yT2Zmc2V0cy5tRmlsZURlc2NyaXB0b3IpOwpAQCAtMTA5LDYgKzEyOSw4IEBACiBzdGF0aWMgY29uc3QgSk5JTmF0aXZlTWV0aG9kIGdQYXJjZWxGaWxlRGVzY3JpcHRvck1ldGhvZHNbXSA9IHsKICAgICB7ImdldEZpbGVEZXNjcmlwdG9yRnJvbVNvY2tldCIsICIoTGphdmEvbmV0L1NvY2tldDspTGphdmEvaW8vRmlsZURlc2NyaXB0b3I7IiwKICAgICAgICAgKHZvaWQqKWFuZHJvaWRfb3NfUGFyY2VsRmlsZURlc2NyaXB0b3JfZ2V0RmlsZURlc2NyaXB0b3JGcm9tU29ja2V0fSwKKyAgICB7ImNyZWF0ZVBpcGVOYXRpdmUiLCAiKFtMamF2YS9pby9GaWxlRGVzY3JpcHRvcjspSSIsCisgICAgICAgICh2b2lkKilhbmRyb2lkX29zX1BhcmNlbEZpbGVEZXNjcmlwdG9yX2NyZWF0ZVBpcGVOYXRpdmV9LAogICAgIHsiZ2V0U3RhdFNpemUiLCAiKClKIiwKICAgICAgICAgKHZvaWQqKWFuZHJvaWRfb3NfUGFyY2VsRmlsZURlc2NyaXB0b3JfZ2V0U3RhdFNpemV9LAogICAgIHsic2Vla1RvIiwgIihKKUoiLApkaWZmIC0tZ2l0IGEvY29yZS9qbmkvYW5kcm9pZF9zZXJ2ZXJfQmx1ZXRvb3RoRXZlbnRMb29wLmNwcCBiL2NvcmUvam5pL2FuZHJvaWRfc2VydmVyX0JsdWV0b290aEV2ZW50TG9vcC5jcHAKaW5kZXggZDhlMDQ5ZC4uYTliOTFiMDQgMTAwNjQ0Ci0tLSBhL2NvcmUvam5pL2FuZHJvaWRfc2VydmVyX0JsdWV0b290aEV2ZW50TG9vcC5jcHAKKysrIGIvY29yZS9qbmkvYW5kcm9pZF9zZXJ2ZXJfQmx1ZXRvb3RoRXZlbnRMb29wLmNwcApAQCAtNTAsNiArNTAsOCBAQAogc3RhdGljIGptZXRob2RJRCBtZXRob2Rfb25EZXZpY2VDcmVhdGVkOwogc3RhdGljIGptZXRob2RJRCBtZXRob2Rfb25EZXZpY2VSZW1vdmVkOwogc3RhdGljIGptZXRob2RJRCBtZXRob2Rfb25EZXZpY2VEaXNjb25uZWN0UmVxdWVzdGVkOworc3RhdGljIGptZXRob2RJRCBtZXRob2Rfb25OZXR3b3JrRGV2aWNlRGlzY29ubmVjdGVkOworc3RhdGljIGptZXRob2RJRCBtZXRob2Rfb25OZXR3b3JrRGV2aWNlQ29ubmVjdGVkOwogCiBzdGF0aWMgam1ldGhvZElEIG1ldGhvZF9vbkNyZWF0ZVBhaXJlZERldmljZVJlc3VsdDsKIHN0YXRpYyBqbWV0aG9kSUQgbWV0aG9kX29uQ3JlYXRlRGV2aWNlUmVzdWx0OwpAQCAtNjYsNiArNjgsMTEgQEAKIHN0YXRpYyBqbWV0aG9kSUQgbWV0aG9kX29uQWdlbnRBdXRob3JpemU7CiBzdGF0aWMgam1ldGhvZElEIG1ldGhvZF9vbkFnZW50Q2FuY2VsOwogCitzdGF0aWMgam1ldGhvZElEIG1ldGhvZF9vbklucHV0RGV2aWNlUHJvcGVydHlDaGFuZ2VkOworc3RhdGljIGptZXRob2RJRCBtZXRob2Rfb25JbnB1dERldmljZUNvbm5lY3Rpb25SZXN1bHQ7CitzdGF0aWMgam1ldGhvZElEIG1ldGhvZF9vblBhbkRldmljZVByb3BlcnR5Q2hhbmdlZDsKK3N0YXRpYyBqbWV0aG9kSUQgbWV0aG9kX29uUGFuRGV2aWNlQ29ubmVjdGlvblJlc3VsdDsKKwogdHlwZWRlZiBldmVudF9sb29wX25hdGl2ZV9kYXRhX3QgbmF0aXZlX2RhdGFfdDsKIAogI2RlZmluZSBFVkVOVF9MT09QX1JFRlMgMTAKQEAgLTk3LDYgKzEwNCwxMCBAQAogICAgIG1ldGhvZF9vbkRldmljZVJlbW92ZWQgPSBlbnYtPkdldE1ldGhvZElEKGNsYXp6LCAib25EZXZpY2VSZW1vdmVkIiwgIihMamF2YS9sYW5nL1N0cmluZzspViIpOwogICAgIG1ldGhvZF9vbkRldmljZURpc2Nvbm5lY3RSZXF1ZXN0ZWQgPSBlbnYtPkdldE1ldGhvZElEKGNsYXp6LCAib25EZXZpY2VEaXNjb25uZWN0UmVxdWVzdGVkIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIihMamF2YS9sYW5nL1N0cmluZzspViIpOworICAgIG1ldGhvZF9vbk5ldHdvcmtEZXZpY2VDb25uZWN0ZWQgPSBlbnYtPkdldE1ldGhvZElEKGNsYXp6LCAib25OZXR3b3JrRGV2aWNlQ29ubmVjdGVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIihMamF2YS9sYW5nL1N0cmluZztMamF2YS9sYW5nL1N0cmluZztJKVYiKTsKKyAgICBtZXRob2Rfb25OZXR3b3JrRGV2aWNlRGlzY29ubmVjdGVkID0gZW52LT5HZXRNZXRob2RJRChjbGF6eiwgIm9uTmV0d29ya0RldmljZURpc2Nvbm5lY3RlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIoTGphdmEvbGFuZy9TdHJpbmc7KVYiKTsKIAogICAgIG1ldGhvZF9vbkNyZWF0ZVBhaXJlZERldmljZVJlc3VsdCA9IGVudi0+R2V0TWV0aG9kSUQoY2xhenosICJvbkNyZWF0ZVBhaXJlZERldmljZVJlc3VsdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKExqYXZhL2xhbmcvU3RyaW5nO0kpViIpOwpAQCAtMTIwLDYgKzEzMSwxNCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKExqYXZhL2xhbmcvU3RyaW5nO0kpViIpOwogICAgIG1ldGhvZF9vbkRpc3BsYXlQYXNza2V5ID0gZW52LT5HZXRNZXRob2RJRChjbGF6eiwgIm9uRGlzcGxheVBhc3NrZXkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKExqYXZhL2xhbmcvU3RyaW5nO0lJKVYiKTsKKyAgICBtZXRob2Rfb25JbnB1dERldmljZVByb3BlcnR5Q2hhbmdlZCA9IGVudi0+R2V0TWV0aG9kSUQoY2xhenosICJvbklucHV0RGV2aWNlUHJvcGVydHlDaGFuZ2VkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIihMamF2YS9sYW5nL1N0cmluZztbTGphdmEvbGFuZy9TdHJpbmc7KVYiKTsKKyAgICBtZXRob2Rfb25JbnB1dERldmljZUNvbm5lY3Rpb25SZXN1bHQgPSBlbnYtPkdldE1ldGhvZElEKGNsYXp6LCAib25JbnB1dERldmljZUNvbm5lY3Rpb25SZXN1bHQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKExqYXZhL2xhbmcvU3RyaW5nO1opViIpOworICAgIG1ldGhvZF9vblBhbkRldmljZVByb3BlcnR5Q2hhbmdlZCA9IGVudi0+R2V0TWV0aG9kSUQoY2xhenosICJvblBhbkRldmljZVByb3BlcnR5Q2hhbmdlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIoTGphdmEvbGFuZy9TdHJpbmc7W0xqYXZhL2xhbmcvU3RyaW5nOylWIik7CisgICAgbWV0aG9kX29uUGFuRGV2aWNlQ29ubmVjdGlvblJlc3VsdCA9IGVudi0+R2V0TWV0aG9kSUQoY2xhenosICJvblBhbkRldmljZUNvbm5lY3Rpb25SZXN1bHQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKExqYXZhL2xhbmcvU3RyaW5nO1opViIpOwogICAgIG1ldGhvZF9vblJlcXVlc3RPb2JEYXRhID0gZW52LT5HZXRNZXRob2RJRChjbGF6eiwgIm9uUmVxdWVzdE9vYkRhdGEiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKExqYXZhL2xhbmcvU3RyaW5nO0kpViIpOwogCkBAIC0yMzIsNiArMjUxLDI3IEBACiAgICAgICAgICAgICByZXR1cm4gSk5JX0ZBTFNFOwogICAgICAgICB9CiAgICAgICAgIGRidXNfYnVzX2FkZF9tYXRjaChuYXQtPmNvbm4sCisgICAgICAgICAgICAgICAgInR5cGU9J3NpZ25hbCcsaW50ZXJmYWNlPSciQkxVRVpfREJVU19CQVNFX0lGQyIuSW5wdXQnIiwKKyAgICAgICAgICAgICAgICAmZXJyKTsKKyAgICAgICAgaWYgKGRidXNfZXJyb3JfaXNfc2V0KCZlcnIpKSB7CisgICAgICAgICAgICBMT0dfQU5EX0ZSRUVfREJVU19FUlJPUigmZXJyKTsKKyAgICAgICAgICAgIHJldHVybiBKTklfRkFMU0U7CisgICAgICAgIH0KKyAgICAgICAgZGJ1c19idXNfYWRkX21hdGNoKG5hdC0+Y29ubiwKKyAgICAgICAgICAgICAgICAidHlwZT0nc2lnbmFsJyxpbnRlcmZhY2U9JyJCTFVFWl9EQlVTX0JBU0VfSUZDIi5OZXR3b3JrJyIsCisgICAgICAgICAgICAgICAgJmVycik7CisgICAgICAgIGlmIChkYnVzX2Vycm9yX2lzX3NldCgmZXJyKSkgeworICAgICAgICAgICAgTE9HX0FORF9GUkVFX0RCVVNfRVJST1IoJmVycik7CisgICAgICAgICAgICByZXR1cm4gSk5JX0ZBTFNFOworICAgICAgICB9CisgICAgICAgIGRidXNfYnVzX2FkZF9tYXRjaChuYXQtPmNvbm4sCisgICAgICAgICAgICAgICAgInR5cGU9J3NpZ25hbCcsaW50ZXJmYWNlPSciQkxVRVpfREJVU19CQVNFX0lGQyIuTmV0d29ya1NlcnZlciciLAorICAgICAgICAgICAgICAgICZlcnIpOworICAgICAgICBpZiAoZGJ1c19lcnJvcl9pc19zZXQoJmVycikpIHsKKyAgICAgICAgICAgIExPR19BTkRfRlJFRV9EQlVTX0VSUk9SKCZlcnIpOworICAgICAgICAgICAgcmV0dXJuIEpOSV9GQUxTRTsKKyAgICAgICAgfQorICAgICAgICBkYnVzX2J1c19hZGRfbWF0Y2gobmF0LT5jb25uLAogICAgICAgICAgICAgICAgICJ0eXBlPSdzaWduYWwnLGludGVyZmFjZT0nb3JnLmJsdWV6LkF1ZGlvU2luayciLAogICAgICAgICAgICAgICAgICZlcnIpOwogICAgICAgICBpZiAoZGJ1c19lcnJvcl9pc19zZXQoJmVycikpIHsKQEAgLTM5MCwxMyArNDMwLDMxIEBACiAgICAgICAgIGRidXNfY29ubmVjdGlvbl91bnJlZ2lzdGVyX29iamVjdF9wYXRoKG5hdC0+Y29ubiwgYWdlbnRfcGF0aCk7CiAKICAgICAgICAgZGJ1c19idXNfcmVtb3ZlX21hdGNoKG5hdC0+Y29ubiwKLSAgICAgICAgICAgICAgICAidHlwZT0nc2lnbmFsJyxpbnRlcmZhY2U9J29yZy5ibHVlei5BdWRpb1NpbmsnIiwKKyAgICAgICAgICAgICAgICAidHlwZT0nc2lnbmFsJyxpbnRlcmZhY2U9JyJCTFVFWl9EQlVTX0JBU0VfSUZDIi5BdWRpb1NpbmsnIiwKICAgICAgICAgICAgICAgICAmZXJyKTsKICAgICAgICAgaWYgKGRidXNfZXJyb3JfaXNfc2V0KCZlcnIpKSB7CiAgICAgICAgICAgICBMT0dfQU5EX0ZSRUVfREJVU19FUlJPUigmZXJyKTsKICAgICAgICAgfQogICAgICAgICBkYnVzX2J1c19yZW1vdmVfbWF0Y2gobmF0LT5jb25uLAotICAgICAgICAgICAgICAgICJ0eXBlPSdzaWduYWwnLGludGVyZmFjZT0nb3JnLmJsdWV6LkRldmljZSciLAorICAgICAgICAgICAgICAgICJ0eXBlPSdzaWduYWwnLGludGVyZmFjZT0nIkJMVUVaX0RCVVNfQkFTRV9JRkMiLkRldmljZSciLAorICAgICAgICAgICAgICAgICZlcnIpOworICAgICAgICBpZiAoZGJ1c19lcnJvcl9pc19zZXQoJmVycikpIHsKKyAgICAgICAgICAgIExPR19BTkRfRlJFRV9EQlVTX0VSUk9SKCZlcnIpOworICAgICAgICB9CisgICAgICAgIGRidXNfYnVzX3JlbW92ZV9tYXRjaChuYXQtPmNvbm4sCisgICAgICAgICAgICAgICAgInR5cGU9J3NpZ25hbCcsaW50ZXJmYWNlPSciQkxVRVpfREJVU19CQVNFX0lGQyIuSW5wdXQnIiwKKyAgICAgICAgICAgICAgICAmZXJyKTsKKyAgICAgICAgaWYgKGRidXNfZXJyb3JfaXNfc2V0KCZlcnIpKSB7CisgICAgICAgICAgICBMT0dfQU5EX0ZSRUVfREJVU19FUlJPUigmZXJyKTsKKyAgICAgICAgfQorICAgICAgICBkYnVzX2J1c19yZW1vdmVfbWF0Y2gobmF0LT5jb25uLAorICAgICAgICAgICAgICAgICJ0eXBlPSdzaWduYWwnLGludGVyZmFjZT0nIkJMVUVaX0RCVVNfQkFTRV9JRkMiLk5ldHdvcmsnIiwKKyAgICAgICAgICAgICAgICAmZXJyKTsKKyAgICAgICAgaWYgKGRidXNfZXJyb3JfaXNfc2V0KCZlcnIpKSB7CisgICAgICAgICAgICBMT0dfQU5EX0ZSRUVfREJVU19FUlJPUigmZXJyKTsKKyAgICAgICAgfQorICAgICAgICBkYnVzX2J1c19yZW1vdmVfbWF0Y2gobmF0LT5jb25uLAorICAgICAgICAgICAgICAgICJ0eXBlPSdzaWduYWwnLGludGVyZmFjZT0nIkJMVUVaX0RCVVNfQkFTRV9JRkMiLk5ldHdvcmtTZXJ2ZXInIiwKICAgICAgICAgICAgICAgICAmZXJyKTsKICAgICAgICAgaWYgKGRidXNfZXJyb3JfaXNfc2V0KCZlcnIpKSB7CiAgICAgICAgICAgICBMT0dfQU5EX0ZSRUVfREJVU19FUlJPUigmZXJyKTsKQEAgLTg2MSw2ICs5MTksNzMgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2Rfb25EZXZpY2VEaXNjb25uZWN0UmVxdWVzdGVkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudi0+TmV3U3RyaW5nVVRGKHJlbW90ZV9kZXZpY2VfcGF0aCkpOwogICAgICAgICBnb3RvIHN1Y2Nlc3M7CisgICAgfSBlbHNlIGlmIChkYnVzX21lc3NhZ2VfaXNfc2lnbmFsKG1zZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9yZy5ibHVlei5JbnB1dCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJQcm9wZXJ0eUNoYW5nZWQiKSkgeworCisgICAgICAgIGpvYmplY3RBcnJheSBzdHJfYXJyYXkgPQorICAgICAgICAgICAgICAgICAgICBwYXJzZV9pbnB1dF9wcm9wZXJ0eV9jaGFuZ2UoZW52LCBtc2cpOworICAgICAgICBpZiAoc3RyX2FycmF5ICE9IE5VTEwpIHsKKyAgICAgICAgICAgIGNvbnN0IGNoYXIgKmNfcGF0aCA9IGRidXNfbWVzc2FnZV9nZXRfcGF0aChtc2cpOworICAgICAgICAgICAgZW52LT5DYWxsVm9pZE1ldGhvZChuYXQtPm1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2Rfb25JbnB1dERldmljZVByb3BlcnR5Q2hhbmdlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW52LT5OZXdTdHJpbmdVVEYoY19wYXRoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyX2FycmF5KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIExPR19BTkRfRlJFRV9EQlVTX0VSUk9SX1dJVEhfTVNHKCZlcnIsIG1zZyk7CisgICAgICAgIH0KKyAgICAgICAgZ290byBzdWNjZXNzOworICAgIH0gZWxzZSBpZiAoZGJ1c19tZXNzYWdlX2lzX3NpZ25hbChtc2csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9yZy5ibHVlei5OZXR3b3JrIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUHJvcGVydHlDaGFuZ2VkIikpIHsKKworICAgICAgIGpvYmplY3RBcnJheSBzdHJfYXJyYXkgPQorICAgICAgICAgICAgICAgICAgIHBhcnNlX3Bhbl9wcm9wZXJ0eV9jaGFuZ2UoZW52LCBtc2cpOworICAgICAgIGlmIChzdHJfYXJyYXkgIT0gTlVMTCkgeworICAgICAgICAgICBjb25zdCBjaGFyICpjX3BhdGggPSBkYnVzX21lc3NhZ2VfZ2V0X3BhdGgobXNnKTsKKyAgICAgICAgICAgZW52LT5DYWxsVm9pZE1ldGhvZChuYXQtPm1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZF9vblBhbkRldmljZVByb3BlcnR5Q2hhbmdlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnYtPk5ld1N0cmluZ1VURihjX3BhdGgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cl9hcnJheSk7CisgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgTE9HX0FORF9GUkVFX0RCVVNfRVJST1JfV0lUSF9NU0coJmVyciwgbXNnKTsKKyAgICAgICB9CisgICAgICAgZ290byBzdWNjZXNzOworICAgIH0gZWxzZSBpZiAoZGJ1c19tZXNzYWdlX2lzX3NpZ25hbChtc2csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9yZy5ibHVlei5OZXR3b3JrU2VydmVyIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRGV2aWNlRGlzY29ubmVjdGVkIikpIHsKKyAgICAgICBjaGFyICpjX2FkZHJlc3M7CisgICAgICAgaWYgKGRidXNfbWVzc2FnZV9nZXRfYXJncyhtc2csICZlcnIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX1NUUklORywgJmNfYWRkcmVzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfSU5WQUxJRCkpIHsKKyAgICAgICAgICAgZW52LT5DYWxsVm9pZE1ldGhvZChuYXQtPm1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZF9vbk5ldHdvcmtEZXZpY2VEaXNjb25uZWN0ZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW52LT5OZXdTdHJpbmdVVEYoY19hZGRyZXNzKSk7CisgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgTE9HX0FORF9GUkVFX0RCVVNfRVJST1JfV0lUSF9NU0coJmVyciwgbXNnKTsKKyAgICAgICB9CisgICAgICAgZ290byBzdWNjZXNzOworICAgIH0gZWxzZSBpZiAoZGJ1c19tZXNzYWdlX2lzX3NpZ25hbChtc2csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9yZy5ibHVlei5OZXR3b3JrU2VydmVyIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRGV2aWNlQ29ubmVjdGVkIikpIHsKKyAgICAgICBjaGFyICpjX2FkZHJlc3M7CisgICAgICAgY2hhciAqY19pZmFjZTsKKyAgICAgICB1aW50MTZfdCB1dWlkOworCisgICAgICAgaWYgKGRidXNfbWVzc2FnZV9nZXRfYXJncyhtc2csICZlcnIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX1NUUklORywgJmNfYWRkcmVzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfU1RSSU5HLCAmY19pZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfVUlOVDE2LCAmdXVpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfSU5WQUxJRCkpIHsKKyAgICAgICAgICAgZW52LT5DYWxsVm9pZE1ldGhvZChuYXQtPm1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZF9vbk5ldHdvcmtEZXZpY2VDb25uZWN0ZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW52LT5OZXdTdHJpbmdVVEYoY19hZGRyZXNzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnYtPk5ld1N0cmluZ1VURihjX2lmYWNlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1dWlkKTsKKyAgICAgICB9IGVsc2UgeworICAgICAgICAgICBMT0dfQU5EX0ZSRUVfREJVU19FUlJPUl9XSVRIX01TRygmZXJyLCBtc2cpOworICAgICAgIH0KKyAgICAgICBnb3RvIHN1Y2Nlc3M7CiAgICAgfQogCiAgICAgcmV0ID0gYTJkcF9ldmVudF9maWx0ZXIobXNnLCBlbnYpOwpAQCAtMTI3MCw2ICsxMzk1LDU3IEBACiAgICAgZW52LT5EZWxldGVMb2NhbFJlZihhZGRyKTsKICAgICBmcmVlKHVzZXIpOwogfQorCit2b2lkIG9uSW5wdXREZXZpY2VDb25uZWN0aW9uUmVzdWx0KERCdXNNZXNzYWdlICptc2csIHZvaWQgKnVzZXIsIHZvaWQgKm4pIHsKKyAgICBMT0dWKF9fRlVOQ1RJT05fXyk7CisKKyAgICBuYXRpdmVfZGF0YV90ICpuYXQgPSAobmF0aXZlX2RhdGFfdCAqKW47CisgICAgY29uc3QgY2hhciAqcGF0aCA9IChjb25zdCBjaGFyICopdXNlcjsKKyAgICBEQnVzRXJyb3IgZXJyOworICAgIGRidXNfZXJyb3JfaW5pdCgmZXJyKTsKKyAgICBKTklFbnYgKmVudjsKKyAgICBuYXQtPnZtLT5HZXRFbnYoKHZvaWQqKikmZW52LCBuYXQtPmVudlZlcik7CisKKyAgICBib29sIHJlc3VsdCA9IEpOSV9UUlVFOworICAgIGlmIChkYnVzX3NldF9lcnJvcl9mcm9tX21lc3NhZ2UoJmVyciwgbXNnKSkgeworICAgICAgICBMT0dfQU5EX0ZSRUVfREJVU19FUlJPUigmZXJyKTsKKyAgICAgICAgcmVzdWx0ID0gSk5JX0ZBTFNFOworICAgIH0KKyAgICBMT0dWKCIuLi4gRGV2aWNlIFBhdGggPSAlcywgcmVzdWx0ID0gJWQiLCBwYXRoLCByZXN1bHQpOworICAgIGpzdHJpbmcgalBhdGggPSBlbnYtPk5ld1N0cmluZ1VURihwYXRoKTsKKyAgICBlbnYtPkNhbGxWb2lkTWV0aG9kKG5hdC0+bWUsCisgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2Rfb25JbnB1dERldmljZUNvbm5lY3Rpb25SZXN1bHQsCisgICAgICAgICAgICAgICAgICAgICAgICBqUGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCk7CisgICAgZW52LT5EZWxldGVMb2NhbFJlZihqUGF0aCk7CisgICAgZnJlZSh1c2VyKTsKK30KKwordm9pZCBvblBhbkRldmljZUNvbm5lY3Rpb25SZXN1bHQoREJ1c01lc3NhZ2UgKm1zZywgdm9pZCAqdXNlciwgdm9pZCAqbikgeworICAgIExPR1YoX19GVU5DVElPTl9fKTsKKworICAgIG5hdGl2ZV9kYXRhX3QgKm5hdCA9IChuYXRpdmVfZGF0YV90ICopbjsKKyAgICBjb25zdCBjaGFyICpwYXRoID0gKGNvbnN0IGNoYXIgKil1c2VyOworICAgIERCdXNFcnJvciBlcnI7CisgICAgZGJ1c19lcnJvcl9pbml0KCZlcnIpOworICAgIEpOSUVudiAqZW52OworICAgIG5hdC0+dm0tPkdldEVudigodm9pZCoqKSZlbnYsIG5hdC0+ZW52VmVyKTsKKworICAgIGJvb2wgcmVzdWx0ID0gSk5JX1RSVUU7CisgICAgaWYgKGRidXNfc2V0X2Vycm9yX2Zyb21fbWVzc2FnZSgmZXJyLCBtc2cpKSB7CisgICAgICAgIExPR19BTkRfRlJFRV9EQlVTX0VSUk9SKCZlcnIpOworICAgICAgICByZXN1bHQgPSBKTklfRkFMU0U7CisgICAgfQorICAgIExPR1YoIi4uLiBQYW4gRGV2aWNlIFBhdGggPSAlcywgcmVzdWx0ID0gJWQiLCBwYXRoLCByZXN1bHQpOworICAgIGpzdHJpbmcgalBhdGggPSBlbnYtPk5ld1N0cmluZ1VURihwYXRoKTsKKyAgICBlbnYtPkNhbGxWb2lkTWV0aG9kKG5hdC0+bWUsCisgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2Rfb25QYW5EZXZpY2VDb25uZWN0aW9uUmVzdWx0LAorICAgICAgICAgICAgICAgICAgICAgICAgalBhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQpOworICAgIGVudi0+RGVsZXRlTG9jYWxSZWYoalBhdGgpOworICAgIGZyZWUodXNlcik7Cit9CisKICNlbmRpZgogCiBzdGF0aWMgSk5JTmF0aXZlTWV0aG9kIHNNZXRob2RzW10gPSB7CmRpZmYgLS1naXQgYS9jb3JlL2puaS9hbmRyb2lkX3NlcnZlcl9CbHVldG9vdGhTZXJ2aWNlLmNwcCBiL2NvcmUvam5pL2FuZHJvaWRfc2VydmVyX0JsdWV0b290aFNlcnZpY2UuY3BwCmluZGV4IGRhYTU5YTYuLjMzN2RjY2MgMTAwNjQ0Ci0tLSBhL2NvcmUvam5pL2FuZHJvaWRfc2VydmVyX0JsdWV0b290aFNlcnZpY2UuY3BwCisrKyBiL2NvcmUvam5pL2FuZHJvaWRfc2VydmVyX0JsdWV0b290aFNlcnZpY2UuY3BwCkBAIC0xNiw2ICsxNiwxMSBAQAogCiAjZGVmaW5lIERCVVNfQURBUFRFUl9JRkFDRSBCTFVFWl9EQlVTX0JBU0VfSUZDICIuQWRhcHRlciIKICNkZWZpbmUgREJVU19ERVZJQ0VfSUZBQ0UgQkxVRVpfREJVU19CQVNFX0lGQyAiLkRldmljZSIKKyNkZWZpbmUgREJVU19JTlBVVF9JRkFDRSBCTFVFWl9EQlVTX0JBU0VfSUZDICIuSW5wdXQiCisjZGVmaW5lIERCVVNfTkVUV09SS19JRkFDRSBCTFVFWl9EQlVTX0JBU0VfSUZDICIuTmV0d29yayIKKyNkZWZpbmUgREJVU19ORVRXT1JLU0VSVkVSX0lGQUNFIEJMVUVaX0RCVVNfQkFTRV9JRkMgIi5OZXR3b3JrU2VydmVyIgorCisKICNkZWZpbmUgTE9HX1RBRyAiQmx1ZXRvb3RoU2VydmljZS5jcHAiCiAKICNpbmNsdWRlICJhbmRyb2lkX2JsdWV0b290aF9jb21tb24uaCIKQEAgLTY4LDYgKzczLDkgQEAKIHZvaWQgb25DcmVhdGVQYWlyZWREZXZpY2VSZXN1bHQoREJ1c01lc3NhZ2UgKm1zZywgdm9pZCAqdXNlciwgdm9pZCAqbmF0KTsKIHZvaWQgb25EaXNjb3ZlclNlcnZpY2VzUmVzdWx0KERCdXNNZXNzYWdlICptc2csIHZvaWQgKnVzZXIsIHZvaWQgKm5hdCk7CiB2b2lkIG9uQ3JlYXRlRGV2aWNlUmVzdWx0KERCdXNNZXNzYWdlICptc2csIHZvaWQgKnVzZXIsIHZvaWQgKm5hdCk7Cit2b2lkIG9uSW5wdXREZXZpY2VDb25uZWN0aW9uUmVzdWx0KERCdXNNZXNzYWdlICptc2csIHZvaWQgKnVzZXIsIHZvaWQgKm5hdCk7Cit2b2lkIG9uQ29ubmVjdFBhblJlc3VsdChEQnVzTWVzc2FnZSAqbXNnLCB2b2lkICp1c2VyLCB2b2lkICpuKTsKK3ZvaWQgb25QYW5EZXZpY2VDb25uZWN0aW9uUmVzdWx0KERCdXNNZXNzYWdlICptc2csIHZvaWQgKnVzZXIsIHZvaWQgKm5hdCk7CiAKIAogLyoqIEdldCBuYXRpdmUgZGF0YSBzdG9yZWQgaW4gdGhlIG9wYXF1ZSAoSmF2YSBjb2RlIG1haW50YWluZWQpIHBvaW50ZXIgbU5hdGl2ZURhdGEKQEAgLTk5MCw2ICs5OTgsMTYwIEBACiAgICAgcmV0dXJuIEpOSV9GQUxTRTsKIH0KIAorc3RhdGljIGpib29sZWFuIGNvbm5lY3RJbnB1dERldmljZU5hdGl2ZShKTklFbnYgKmVudiwgam9iamVjdCBvYmplY3QsIGpzdHJpbmcgcGF0aCkgeworICAgIExPR1YoX19GVU5DVElPTl9fKTsKKyNpZmRlZiBIQVZFX0JMVUVUT09USAorICAgIG5hdGl2ZV9kYXRhX3QgKm5hdCA9IGdldF9uYXRpdmVfZGF0YShlbnYsIG9iamVjdCk7CisgICAgam9iamVjdCBldmVudExvb3AgPSBlbnYtPkdldE9iamVjdEZpZWxkKG9iamVjdCwgZmllbGRfbUV2ZW50TG9vcCk7CisgICAgc3RydWN0IGV2ZW50X2xvb3BfbmF0aXZlX2RhdGFfdCAqZXZlbnRMb29wTmF0ID0KKyAgICAgICAgICAgIGdldF9FdmVudExvb3BfbmF0aXZlX2RhdGEoZW52LCBldmVudExvb3ApOworCisgICAgaWYgKG5hdCAmJiBldmVudExvb3BOYXQpIHsKKyAgICAgICAgY29uc3QgY2hhciAqY19wYXRoID0gZW52LT5HZXRTdHJpbmdVVEZDaGFycyhwYXRoLCBOVUxMKTsKKworICAgICAgICBpbnQgbGVuID0gZW52LT5HZXRTdHJpbmdMZW5ndGgocGF0aCkgKyAxOworICAgICAgICBjaGFyICpjb250ZXh0X3BhdGggPSAoY2hhciAqKWNhbGxvYyhsZW4sIHNpemVvZihjaGFyKSk7CisgICAgICAgIHN0cmxjcHkoY29udGV4dF9wYXRoLCBjX3BhdGgsIGxlbik7ICAvLyBmb3IgY2FsbGJhY2sKKworICAgICAgICBib29sIHJldCA9IGRidXNfZnVuY19hcmdzX2FzeW5jKGVudiwgbmF0LT5jb25uLCAtMSwgb25JbnB1dERldmljZUNvbm5lY3Rpb25SZXN1bHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dF9wYXRoLCBldmVudExvb3BOYXQsIGNfcGF0aCwgREJVU19JTlBVVF9JRkFDRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ29ubmVjdCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX0lOVkFMSUQpOworCisgICAgICAgIGVudi0+UmVsZWFzZVN0cmluZ1VURkNoYXJzKHBhdGgsIGNfcGF0aCk7CisgICAgICAgIHJldHVybiByZXQgPyBKTklfVFJVRSA6IEpOSV9GQUxTRTsKKyAgICB9CisjZW5kaWYKKyAgICByZXR1cm4gSk5JX0ZBTFNFOworfQorCitzdGF0aWMgamJvb2xlYW4gZGlzY29ubmVjdElucHV0RGV2aWNlTmF0aXZlKEpOSUVudiAqZW52LCBqb2JqZWN0IG9iamVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqc3RyaW5nIHBhdGgpIHsKKyAgICBMT0dWKF9fRlVOQ1RJT05fXyk7CisjaWZkZWYgSEFWRV9CTFVFVE9PVEgKKyAgICBuYXRpdmVfZGF0YV90ICpuYXQgPSBnZXRfbmF0aXZlX2RhdGEoZW52LCBvYmplY3QpOworICAgIGpvYmplY3QgZXZlbnRMb29wID0gZW52LT5HZXRPYmplY3RGaWVsZChvYmplY3QsIGZpZWxkX21FdmVudExvb3ApOworICAgIHN0cnVjdCBldmVudF9sb29wX25hdGl2ZV9kYXRhX3QgKmV2ZW50TG9vcE5hdCA9CisgICAgICAgICAgICBnZXRfRXZlbnRMb29wX25hdGl2ZV9kYXRhKGVudiwgZXZlbnRMb29wKTsKKworICAgIGlmIChuYXQgJiYgZXZlbnRMb29wTmF0KSB7CisgICAgICAgIGNvbnN0IGNoYXIgKmNfcGF0aCA9IGVudi0+R2V0U3RyaW5nVVRGQ2hhcnMocGF0aCwgTlVMTCk7CisKKyAgICAgICAgaW50IGxlbiA9IGVudi0+R2V0U3RyaW5nTGVuZ3RoKHBhdGgpICsgMTsKKyAgICAgICAgY2hhciAqY29udGV4dF9wYXRoID0gKGNoYXIgKiljYWxsb2MobGVuLCBzaXplb2YoY2hhcikpOworICAgICAgICBzdHJsY3B5KGNvbnRleHRfcGF0aCwgY19wYXRoLCBsZW4pOyAgLy8gZm9yIGNhbGxiYWNrCisKKyAgICAgICAgYm9vbCByZXQgPSBkYnVzX2Z1bmNfYXJnc19hc3luYyhlbnYsIG5hdC0+Y29ubiwgLTEsIG9uSW5wdXREZXZpY2VDb25uZWN0aW9uUmVzdWx0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHRfcGF0aCwgZXZlbnRMb29wTmF0LCBjX3BhdGgsIERCVVNfSU5QVVRfSUZBQ0UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkRpc2Nvbm5lY3QiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9JTlZBTElEKTsKKworICAgICAgICBlbnYtPlJlbGVhc2VTdHJpbmdVVEZDaGFycyhwYXRoLCBjX3BhdGgpOworICAgICAgICByZXR1cm4gcmV0ID8gSk5JX1RSVUUgOiBKTklfRkFMU0U7CisgICAgfQorI2VuZGlmCisgICAgcmV0dXJuIEpOSV9GQUxTRTsKK30KKworc3RhdGljIGpib29sZWFuIHNldEJsdWV0b290aFRldGhlcmluZ05hdGl2ZShKTklFbnYgKmVudiwgam9iamVjdCBvYmplY3QsIGpib29sZWFuIHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqc3RyaW5nIHNyY19yb2xlLCBqc3RyaW5nIGJyaWRnZSkgeworICAgIExPR1YoX19GVU5DVElPTl9fKTsKKyNpZmRlZiBIQVZFX0JMVUVUT09USAorICAgIG5hdGl2ZV9kYXRhX3QgKm5hdCA9IGdldF9uYXRpdmVfZGF0YShlbnYsIG9iamVjdCk7CisgICAgaWYgKG5hdCkgeworICAgICAgICBEQnVzTWVzc2FnZSAqcmVwbHk7CisgICAgICAgIGNvbnN0IGNoYXIgKmNfcm9sZSA9IGVudi0+R2V0U3RyaW5nVVRGQ2hhcnMoc3JjX3JvbGUsIE5VTEwpOworICAgICAgICBjb25zdCBjaGFyICpjX2JyaWRnZSA9IGVudi0+R2V0U3RyaW5nVVRGQ2hhcnMoYnJpZGdlLCBOVUxMKTsKKyAgICAgICAgaWYgKHZhbHVlKSB7CisgICAgICAgICAgICBMT0dFKCJzZXRCbHVldG9vdGhUZXRoZXJpbmdOYXRpdmUgdHJ1ZSIpOworICAgICAgICAgICAgcmVwbHkgPSBkYnVzX2Z1bmNfYXJncyhlbnYsIG5hdC0+Y29ubiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRfYWRhcHRlcl9wYXRoKGVudiwgb2JqZWN0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX05FVFdPUktTRVJWRVJfSUZBQ0UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlJlZ2lzdGVyIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfU1RSSU5HLCAmY19yb2xlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9TVFJJTkcsICZjX2JyaWRnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfSU5WQUxJRCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBMT0dFKCJzZXRCbHVldG9vdGhUZXRoZXJpbmdOYXRpdmUgZmFsc2UiKTsKKyAgICAgICAgICAgIHJlcGx5ID0gZGJ1c19mdW5jX2FyZ3MoZW52LCBuYXQtPmNvbm4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0X2FkYXB0ZXJfcGF0aChlbnYsIG9iamVjdCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19ORVRXT1JLU0VSVkVSX0lGQUNFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJVbnJlZ2lzdGVyIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfU1RSSU5HLCAmY19yb2xlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9JTlZBTElEKTsKKyAgICAgICAgfQorICAgICAgICBlbnYtPlJlbGVhc2VTdHJpbmdVVEZDaGFycyhzcmNfcm9sZSwgY19yb2xlKTsKKyAgICAgICAgZW52LT5SZWxlYXNlU3RyaW5nVVRGQ2hhcnMoYnJpZGdlLCBjX2JyaWRnZSk7CisgICAgICAgIHJldHVybiByZXBseSA/IEpOSV9UUlVFIDogSk5JX0ZBTFNFOworICAgIH0KKyNlbmRpZgorICAgIHJldHVybiBKTklfRkFMU0U7Cit9CisKK3N0YXRpYyBqYm9vbGVhbiBjb25uZWN0UGFuRGV2aWNlTmF0aXZlKEpOSUVudiAqZW52LCBqb2JqZWN0IG9iamVjdCwganN0cmluZyBwYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAganN0cmluZyBzcmNSb2xlLCBqc3RyaW5nIGRzdFJvbGUpIHsKKyAgICBMT0dWKF9fRlVOQ1RJT05fXyk7CisjaWZkZWYgSEFWRV9CTFVFVE9PVEgKKyAgICBMT0dFKCJjb25uZWN0UGFuRGV2aWNlTmF0aXZlIik7CisgICAgbmF0aXZlX2RhdGFfdCAqbmF0ID0gZ2V0X25hdGl2ZV9kYXRhKGVudiwgb2JqZWN0KTsKKyAgICBqb2JqZWN0IGV2ZW50TG9vcCA9IGVudi0+R2V0T2JqZWN0RmllbGQob2JqZWN0LCBmaWVsZF9tRXZlbnRMb29wKTsKKyAgICBzdHJ1Y3QgZXZlbnRfbG9vcF9uYXRpdmVfZGF0YV90ICpldmVudExvb3BOYXQgPQorICAgICAgICAgICAgZ2V0X0V2ZW50TG9vcF9uYXRpdmVfZGF0YShlbnYsIGV2ZW50TG9vcCk7CisKKyAgICBpZiAobmF0ICYmIGV2ZW50TG9vcE5hdCkgeworICAgICAgICBjb25zdCBjaGFyICpjX3BhdGggPSBlbnYtPkdldFN0cmluZ1VURkNoYXJzKHBhdGgsIE5VTEwpOworICAgICAgICBjb25zdCBjaGFyICpzcmMgPSBlbnYtPkdldFN0cmluZ1VURkNoYXJzKHNyY1JvbGUsIE5VTEwpOworICAgICAgICBjb25zdCBjaGFyICpkc3QgPSBlbnYtPkdldFN0cmluZ1VURkNoYXJzKGRzdFJvbGUsIE5VTEwpOworCisgICAgICAgIGludCBsZW4gPSBlbnYtPkdldFN0cmluZ0xlbmd0aChwYXRoKSArIDE7CisgICAgICAgIGNoYXIgKmNvbnRleHRfcGF0aCA9IChjaGFyICopY2FsbG9jKGxlbiwgc2l6ZW9mKGNoYXIpKTsKKyAgICAgICAgc3RybGNweShjb250ZXh0X3BhdGgsIGNfcGF0aCwgbGVuKTsgIC8vIGZvciBjYWxsYmFjaworCisgICAgICAgIGJvb2wgcmV0ID0gZGJ1c19mdW5jX2FyZ3NfYXN5bmMoZW52LCBuYXQtPmNvbm4sIC0xLG9uUGFuRGV2aWNlQ29ubmVjdGlvblJlc3VsdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHRfcGF0aCwgZXZlbnRMb29wTmF0LCBjX3BhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX05FVFdPUktfSUZBQ0UsICJDb25uZWN0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9TVFJJTkcsICZzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfU1RSSU5HLCAmZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX0lOVkFMSUQpOworCisgICAgICAgIGVudi0+UmVsZWFzZVN0cmluZ1VURkNoYXJzKHBhdGgsIGNfcGF0aCk7CisgICAgICAgIGVudi0+UmVsZWFzZVN0cmluZ1VURkNoYXJzKHNyY1JvbGUsIHNyYyk7CisgICAgICAgIGVudi0+UmVsZWFzZVN0cmluZ1VURkNoYXJzKGRzdFJvbGUsIGRzdCk7CisgICAgICAgIHJldHVybiByZXQgPyBKTklfVFJVRSA6IEpOSV9GQUxTRTsKKyAgICB9CisjZW5kaWYKKyAgICByZXR1cm4gSk5JX0ZBTFNFOworfQorCitzdGF0aWMgamJvb2xlYW4gZGlzY29ubmVjdFBhbkRldmljZU5hdGl2ZShKTklFbnYgKmVudiwgam9iamVjdCBvYmplY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAganN0cmluZyBwYXRoKSB7CisgICAgTE9HVihfX0ZVTkNUSU9OX18pOworI2lmZGVmIEhBVkVfQkxVRVRPT1RICisgICAgTE9HRSgiZGlzY29ubmVjdFBhbkRldmljZU5hdGl2ZSIpOworICAgIG5hdGl2ZV9kYXRhX3QgKm5hdCA9IGdldF9uYXRpdmVfZGF0YShlbnYsIG9iamVjdCk7CisgICAgam9iamVjdCBldmVudExvb3AgPSBlbnYtPkdldE9iamVjdEZpZWxkKG9iamVjdCwgZmllbGRfbUV2ZW50TG9vcCk7CisgICAgc3RydWN0IGV2ZW50X2xvb3BfbmF0aXZlX2RhdGFfdCAqZXZlbnRMb29wTmF0ID0KKyAgICAgICAgICAgIGdldF9FdmVudExvb3BfbmF0aXZlX2RhdGEoZW52LCBldmVudExvb3ApOworCisgICAgaWYgKG5hdCAmJiBldmVudExvb3BOYXQpIHsKKyAgICAgICAgY29uc3QgY2hhciAqY19wYXRoID0gZW52LT5HZXRTdHJpbmdVVEZDaGFycyhwYXRoLCBOVUxMKTsKKworICAgICAgICBpbnQgbGVuID0gZW52LT5HZXRTdHJpbmdMZW5ndGgocGF0aCkgKyAxOworICAgICAgICBjaGFyICpjb250ZXh0X3BhdGggPSAoY2hhciAqKWNhbGxvYyhsZW4sIHNpemVvZihjaGFyKSk7CisgICAgICAgIHN0cmxjcHkoY29udGV4dF9wYXRoLCBjX3BhdGgsIGxlbik7ICAvLyBmb3IgY2FsbGJhY2sKKworICAgICAgICBib29sIHJldCA9IGRidXNfZnVuY19hcmdzX2FzeW5jKGVudiwgbmF0LT5jb25uLCAtMSxvblBhbkRldmljZUNvbm5lY3Rpb25SZXN1bHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dF9wYXRoLCBldmVudExvb3BOYXQsIGNfcGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX05FVFdPUktfSUZBQ0UsICJEaXNjb25uZWN0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfSU5WQUxJRCk7CisKKyAgICAgICAgZW52LT5SZWxlYXNlU3RyaW5nVVRGQ2hhcnMocGF0aCwgY19wYXRoKTsKKyAgICAgICAgcmV0dXJuIHJldCA/IEpOSV9UUlVFIDogSk5JX0ZBTFNFOworICAgIH0KKyNlbmRpZgorICAgIHJldHVybiBKTklfRkFMU0U7Cit9CisKIHN0YXRpYyBKTklOYXRpdmVNZXRob2Qgc01ldGhvZHNbXSA9IHsKICAgICAgLyogbmFtZSwgc2lnbmF0dXJlLCBmdW5jUHRyICovCiAgICAgeyJjbGFzc0luaXROYXRpdmUiLCAiKClWIiwgKHZvaWQqKWNsYXNzSW5pdE5hdGl2ZX0sCkBAIC0xMDM5LDggKzEyMDEsMTggQEAKICAgICB7ImFkZFJmY29tbVNlcnZpY2VSZWNvcmROYXRpdmUiLCAiKExqYXZhL2xhbmcvU3RyaW5nO0pKUylJIiwgKHZvaWQgKilhZGRSZmNvbW1TZXJ2aWNlUmVjb3JkTmF0aXZlfSwKICAgICB7InJlbW92ZVNlcnZpY2VSZWNvcmROYXRpdmUiLCAiKEkpWiIsICh2b2lkICopcmVtb3ZlU2VydmljZVJlY29yZE5hdGl2ZX0sCiAgICAgeyJzZXRMaW5rVGltZW91dE5hdGl2ZSIsICIoTGphdmEvbGFuZy9TdHJpbmc7SSlaIiwgKHZvaWQgKilzZXRMaW5rVGltZW91dE5hdGl2ZX0sCisgICAgLy8gSElEIGZ1bmN0aW9ucworICAgIHsiY29ubmVjdElucHV0RGV2aWNlTmF0aXZlIiwgIihMamF2YS9sYW5nL1N0cmluZzspWiIsICh2b2lkICopY29ubmVjdElucHV0RGV2aWNlTmF0aXZlfSwKKyAgICB7ImRpc2Nvbm5lY3RJbnB1dERldmljZU5hdGl2ZSIsICIoTGphdmEvbGFuZy9TdHJpbmc7KVoiLCAodm9pZCAqKWRpc2Nvbm5lY3RJbnB1dERldmljZU5hdGl2ZX0sCisKKyAgICB7InNldEJsdWV0b290aFRldGhlcmluZ05hdGl2ZSIsICIoWkxqYXZhL2xhbmcvU3RyaW5nO0xqYXZhL2xhbmcvU3RyaW5nOylaIiwKKyAgICAgICAgICAgICAgKHZvaWQgKilzZXRCbHVldG9vdGhUZXRoZXJpbmdOYXRpdmV9LAorICAgIHsiY29ubmVjdFBhbkRldmljZU5hdGl2ZSIsICIoTGphdmEvbGFuZy9TdHJpbmc7TGphdmEvbGFuZy9TdHJpbmc7TGphdmEvbGFuZy9TdHJpbmc7KVoiLAorICAgICAgICAgICAgICAodm9pZCAqKWNvbm5lY3RQYW5EZXZpY2VOYXRpdmV9LAorICAgIHsiZGlzY29ubmVjdFBhbkRldmljZU5hdGl2ZSIsICIoTGphdmEvbGFuZy9TdHJpbmc7KVoiLCAodm9pZCAqKWRpc2Nvbm5lY3RQYW5EZXZpY2VOYXRpdmV9LAogfTsKIAorCiBpbnQgcmVnaXN0ZXJfYW5kcm9pZF9zZXJ2ZXJfQmx1ZXRvb3RoU2VydmljZShKTklFbnYgKmVudikgewogICAgIHJldHVybiBBbmRyb2lkUnVudGltZTo6cmVnaXN0ZXJOYXRpdmVNZXRob2RzKGVudiwKICAgICAgICAgICAgICAgICAiYW5kcm9pZC9zZXJ2ZXIvQmx1ZXRvb3RoU2VydmljZSIsIHNNZXRob2RzLCBORUxFTShzTWV0aG9kcykpOwpkaWZmIC0tZ2l0IGEvY29yZS9qbmkvYW5kcm9pZF92aWV3X0dMRVMyMENhbnZhcy5jcHAgYi9jb3JlL2puaS9hbmRyb2lkX3ZpZXdfR0xFUzIwQ2FudmFzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYTcxNzQ2Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9qbmkvYW5kcm9pZF92aWV3X0dMRVMyMENhbnZhcy5jcHAKQEAgLTAsMCArMSw0NTggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIk9wZW5HTFJlbmRlcmVyIgorCisjaW5jbHVkZSAiam5pLmgiCisjaW5jbHVkZSA8bmF0aXZlaGVscGVyL0pOSUhlbHAuaD4KKyNpbmNsdWRlIDxhbmRyb2lkX3J1bnRpbWUvQW5kcm9pZFJ1bnRpbWUuaD4KKyNpbmNsdWRlIDx1dGlscy9SZXNvdXJjZVR5cGVzLmg+CisKKyNpbmNsdWRlIDxTa0JpdG1hcC5oPgorI2luY2x1ZGUgPFNrQ2FudmFzLmg+CisjaW5jbHVkZSA8U2tNYXRyaXguaD4KKyNpbmNsdWRlIDxTa1BhaW50Lmg+CisjaW5jbHVkZSA8U2tSZWdpb24uaD4KKyNpbmNsdWRlIDxTa1NjYWxlckNvbnRleHQuaD4KKyNpbmNsdWRlIDxTa1RlbXBsYXRlcy5oPgorI2luY2x1ZGUgPFNrWGZlcm1vZGUuaD4KKworI2luY2x1ZGUgPE9wZW5HTFJlbmRlcmVyLmg+CisjaW5jbHVkZSA8U2tpYVNoYWRlci5oPgorI2luY2x1ZGUgPFNraWFDb2xvckZpbHRlci5oPgorI2luY2x1ZGUgPFJlY3QuaD4KKworI2luY2x1ZGUgIlRleHRMYXlvdXQuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCit1c2luZyBuYW1lc3BhY2UgdWlyZW5kZXJlcjsKKworLyoqCisgKiBOb3RlOiBPcGVuR0xSZW5kZXJlciBKTkkgbGF5ZXIgaXMgZ2VuZXJhdGVkIGFuZCBjb21waWxlZCBvbmx5IG9uIHN1cHBvcnRlZAorICogICAgICAgZGV2aWNlcy4gVGhpcyBtZWFucyBhbGwgdGhlIGxvZ2ljIG11c3QgYmUgY29tcGlsZWQgb25seSB3aGVuIHRoZQorICogICAgICAgcHJlcHJvY2Vzc29yIHZhcmlhYmxlIFVTRV9PUEVOR0xfUkVOREVSRVIgaXMgZGVmaW5lZC4KKyAqLworI2lmZGVmIFVTRV9PUEVOR0xfUkVOREVSRVIKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gSmF2YSBBUElzCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyBzdHJ1Y3QgeworICAgIGpjbGFzcyBjbGF6ejsKKyAgICBqbWV0aG9kSUQgc2V0OworfSBnUmVjdENsYXNzSW5mbzsKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gQ29uc3RydWN0b3JzCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyBPcGVuR0xSZW5kZXJlciogYW5kcm9pZF92aWV3X0dMRVMyMENhbnZhc19jcmVhdGVSZW5kZXJlcihKTklFbnYqIGVudiwgam9iamVjdCBjYW52YXMpIHsKKyAgICByZXR1cm4gbmV3IE9wZW5HTFJlbmRlcmVyOworfQorCitzdGF0aWMgdm9pZCBhbmRyb2lkX3ZpZXdfR0xFUzIwQ2FudmFzX2Rlc3Ryb3lSZW5kZXJlcihKTklFbnYqIGVudiwgam9iamVjdCBjYW52YXMsCisgICAgICAgIE9wZW5HTFJlbmRlcmVyKiByZW5kZXJlcikgeworICAgIGRlbGV0ZSByZW5kZXJlcjsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gU2V0dXAKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIHZvaWQgYW5kcm9pZF92aWV3X0dMRVMyMENhbnZhc19zZXRWaWV3cG9ydChKTklFbnYqIGVudiwgam9iamVjdCBjYW52YXMsCisgICAgICAgIE9wZW5HTFJlbmRlcmVyKiByZW5kZXJlciwgamludCB3aWR0aCwgamludCBoZWlnaHQpIHsKKyAgICByZW5kZXJlci0+c2V0Vmlld3BvcnQod2lkdGgsIGhlaWdodCk7Cit9CisKK3N0YXRpYyB2b2lkIGFuZHJvaWRfdmlld19HTEVTMjBDYW52YXNfcHJlcGFyZShKTklFbnYqIGVudiwgam9iamVjdCBjYW52YXMsCisgICAgICAgIE9wZW5HTFJlbmRlcmVyKiByZW5kZXJlcikgeworICAgIHJlbmRlcmVyLT5wcmVwYXJlKCk7Cit9CisKK3N0YXRpYyB2b2lkIGFuZHJvaWRfdmlld19HTEVTMjBDYW52YXNfYWNxdWlyZUNvbnRleHQoSk5JRW52KiBlbnYsIGpvYmplY3QgY2FudmFzLAorICAgICAgICBPcGVuR0xSZW5kZXJlciogcmVuZGVyZXIpIHsKKyAgICByZW5kZXJlci0+YWNxdWlyZUNvbnRleHQoKTsKK30KKworc3RhdGljIHZvaWQgYW5kcm9pZF92aWV3X0dMRVMyMENhbnZhc19yZWxlYXNlQ29udGV4dChKTklFbnYqIGVudiwgam9iamVjdCBjYW52YXMsCisgICAgICAgIE9wZW5HTFJlbmRlcmVyKiByZW5kZXJlcikgeworICAgIHJlbmRlcmVyLT5yZWxlYXNlQ29udGV4dCgpOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBTdGF0ZQorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgamludCBhbmRyb2lkX3ZpZXdfR0xFUzIwQ2FudmFzX3NhdmUoSk5JRW52KiBlbnYsIGpvYmplY3QgY2FudmFzLCBPcGVuR0xSZW5kZXJlciogcmVuZGVyZXIsCisgICAgICAgIGppbnQgZmxhZ3MpIHsKKyAgICByZXR1cm4gcmVuZGVyZXItPnNhdmUoZmxhZ3MpOworfQorCitzdGF0aWMgamludCBhbmRyb2lkX3ZpZXdfR0xFUzIwQ2FudmFzX2dldFNhdmVDb3VudChKTklFbnYqIGVudiwgam9iamVjdCBjYW52YXMsCisgICAgICAgIE9wZW5HTFJlbmRlcmVyKiByZW5kZXJlcikgeworICAgIHJldHVybiByZW5kZXJlci0+Z2V0U2F2ZUNvdW50KCk7Cit9CisKK3N0YXRpYyB2b2lkIGFuZHJvaWRfdmlld19HTEVTMjBDYW52YXNfcmVzdG9yZShKTklFbnYqIGVudiwgam9iamVjdCBjYW52YXMsCisgICAgICAgIE9wZW5HTFJlbmRlcmVyKiByZW5kZXJlcikgeworICAgIHJlbmRlcmVyLT5yZXN0b3JlKCk7Cit9CisKK3N0YXRpYyB2b2lkIGFuZHJvaWRfdmlld19HTEVTMjBDYW52YXNfcmVzdG9yZVRvQ291bnQoSk5JRW52KiBlbnYsIGpvYmplY3QgY2FudmFzLAorICAgICAgICBPcGVuR0xSZW5kZXJlciogcmVuZGVyZXIsIGppbnQgc2F2ZUNvdW50KSB7CisgICAgcmVuZGVyZXItPnJlc3RvcmVUb0NvdW50KHNhdmVDb3VudCk7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIExheWVycworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgamludCBhbmRyb2lkX3ZpZXdfR0xFUzIwQ2FudmFzX3NhdmVMYXllcihKTklFbnYqIGVudiwgam9iamVjdCBjYW52YXMsCisgICAgICAgIE9wZW5HTFJlbmRlcmVyKiByZW5kZXJlciwgamZsb2F0IGxlZnQsIGpmbG9hdCB0b3AsIGpmbG9hdCByaWdodCwgamZsb2F0IGJvdHRvbSwKKyAgICAgICAgU2tQYWludCogcGFpbnQsIGppbnQgc2F2ZUZsYWdzKSB7CisgICAgcmV0dXJuIHJlbmRlcmVyLT5zYXZlTGF5ZXIobGVmdCwgdG9wLCByaWdodCwgYm90dG9tLCBwYWludCwgc2F2ZUZsYWdzKTsKK30KKworc3RhdGljIGppbnQgYW5kcm9pZF92aWV3X0dMRVMyMENhbnZhc19zYXZlTGF5ZXJBbHBoYShKTklFbnYqIGVudiwgam9iamVjdCBjYW52YXMsCisgICAgICAgIE9wZW5HTFJlbmRlcmVyKiByZW5kZXJlciwgamZsb2F0IGxlZnQsIGpmbG9hdCB0b3AsIGpmbG9hdCByaWdodCwgamZsb2F0IGJvdHRvbSwKKyAgICAgICAgamludCBhbHBoYSwgamludCBzYXZlRmxhZ3MpIHsKKyAgICByZXR1cm4gcmVuZGVyZXItPnNhdmVMYXllckFscGhhKGxlZnQsIHRvcCwgcmlnaHQsIGJvdHRvbSwgYWxwaGEsIHNhdmVGbGFncyk7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIENsaXBwaW5nCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyBib29sIGFuZHJvaWRfdmlld19HTEVTMjBDYW52YXNfcXVpY2tSZWplY3QoSk5JRW52KiBlbnYsIGpvYmplY3QgY2FudmFzLAorICAgICAgICBPcGVuR0xSZW5kZXJlciogcmVuZGVyZXIsIGpmbG9hdCBsZWZ0LCBqZmxvYXQgdG9wLCBqZmxvYXQgcmlnaHQsIGpmbG9hdCBib3R0b20sCisgICAgICAgIFNrQ2FudmFzOjpFZGdlVHlwZSBlZGdlKSB7CisgICAgcmV0dXJuIHJlbmRlcmVyLT5xdWlja1JlamVjdChsZWZ0LCB0b3AsIHJpZ2h0LCBib3R0b20pOworfQorCitzdGF0aWMgYm9vbCBhbmRyb2lkX3ZpZXdfR0xFUzIwQ2FudmFzX2NsaXBSZWN0RihKTklFbnYqIGVudiwgam9iamVjdCBjYW52YXMsCisgICAgICAgIE9wZW5HTFJlbmRlcmVyKiByZW5kZXJlciwgamZsb2F0IGxlZnQsIGpmbG9hdCB0b3AsIGpmbG9hdCByaWdodCwgamZsb2F0IGJvdHRvbSwKKyAgICAgICAgU2tSZWdpb246Ok9wIG9wKSB7CisgICAgcmV0dXJuIHJlbmRlcmVyLT5jbGlwUmVjdChsZWZ0LCB0b3AsIHJpZ2h0LCBib3R0b20sIG9wKTsKK30KKworc3RhdGljIGJvb2wgYW5kcm9pZF92aWV3X0dMRVMyMENhbnZhc19jbGlwUmVjdChKTklFbnYqIGVudiwgam9iamVjdCBjYW52YXMsCisgICAgICAgIE9wZW5HTFJlbmRlcmVyKiByZW5kZXJlciwgamludCBsZWZ0LCBqaW50IHRvcCwgamludCByaWdodCwgamludCBib3R0b20sCisgICAgICAgIFNrUmVnaW9uOjpPcCBvcCkgeworICAgIHJldHVybiByZW5kZXJlci0+Y2xpcFJlY3QoZmxvYXQobGVmdCksIGZsb2F0KHRvcCksIGZsb2F0KHJpZ2h0KSwgZmxvYXQoYm90dG9tKSwgb3ApOworfQorCitzdGF0aWMgYm9vbCBhbmRyb2lkX3ZpZXdfR0xFUzIwQ2FudmFzX2dldENsaXBCb3VuZHMoSk5JRW52KiBlbnYsIGpvYmplY3QgY2FudmFzLAorICAgICAgICBPcGVuR0xSZW5kZXJlciogcmVuZGVyZXIsIGpvYmplY3QgcmVjdCkgeworICAgIGNvbnN0IGFuZHJvaWQ6OnVpcmVuZGVyZXI6OlJlY3QmIGJvdW5kcyhyZW5kZXJlci0+Z2V0Q2xpcEJvdW5kcygpKTsKKworICAgIGVudi0+Q2FsbFZvaWRNZXRob2QocmVjdCwgZ1JlY3RDbGFzc0luZm8uc2V0LAorICAgICAgICAgICAgaW50KGJvdW5kcy5sZWZ0KSwgaW50KGJvdW5kcy50b3ApLCBpbnQoYm91bmRzLnJpZ2h0KSwgaW50KGJvdW5kcy5ib3R0b20pKTsKKworICAgIHJldHVybiAhYm91bmRzLmlzRW1wdHkoKTsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gVHJhbnNmb3JtcworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgdm9pZCBhbmRyb2lkX3ZpZXdfR0xFUzIwQ2FudmFzX3RyYW5zbGF0ZShKTklFbnYqIGVudiwgam9iamVjdCBjYW52YXMsCisgICAgICAgIE9wZW5HTFJlbmRlcmVyKiByZW5kZXJlciwgamZsb2F0IGR4LCBqZmxvYXQgZHkpIHsKKyAgICByZW5kZXJlci0+dHJhbnNsYXRlKGR4LCBkeSk7Cit9CisKK3N0YXRpYyB2b2lkIGFuZHJvaWRfdmlld19HTEVTMjBDYW52YXNfcm90YXRlKEpOSUVudiogZW52LCBqb2JqZWN0IGNhbnZhcywKKyAgICAgICAgT3BlbkdMUmVuZGVyZXIqIHJlbmRlcmVyLCBqZmxvYXQgZGVncmVlcykgeworICAgIHJlbmRlcmVyLT5yb3RhdGUoZGVncmVlcyk7Cit9CisKK3N0YXRpYyB2b2lkIGFuZHJvaWRfdmlld19HTEVTMjBDYW52YXNfc2NhbGUoSk5JRW52KiBlbnYsIGpvYmplY3QgY2FudmFzLAorICAgICAgICBPcGVuR0xSZW5kZXJlciogcmVuZGVyZXIsIGpmbG9hdCBzeCwgamZsb2F0IHN5KSB7CisgICAgcmVuZGVyZXItPnNjYWxlKHN4LCBzeSk7Cit9CisKK3N0YXRpYyB2b2lkIGFuZHJvaWRfdmlld19HTEVTMjBDYW52YXNfc2V0TWF0cml4KEpOSUVudiogZW52LCBqb2JqZWN0IGNhbnZhcywKKyAgICAgICAgT3BlbkdMUmVuZGVyZXIqIHJlbmRlcmVyLCBTa01hdHJpeCogbWF0cml4KSB7CisgICAgcmVuZGVyZXItPnNldE1hdHJpeChtYXRyaXgpOworfQorCitzdGF0aWMgdm9pZCBhbmRyb2lkX3ZpZXdfR0xFUzIwQ2FudmFzX2dldE1hdHJpeChKTklFbnYqIGVudiwgam9iamVjdCBjYW52YXMsCisgICAgICAgIE9wZW5HTFJlbmRlcmVyKiByZW5kZXJlciwgU2tNYXRyaXgqIG1hdHJpeCkgeworICAgIHJlbmRlcmVyLT5nZXRNYXRyaXgobWF0cml4KTsKK30KKworc3RhdGljIHZvaWQgYW5kcm9pZF92aWV3X0dMRVMyMENhbnZhc19jb25jYXRNYXRyaXgoSk5JRW52KiBlbnYsIGpvYmplY3QgY2FudmFzLAorICAgICAgICBPcGVuR0xSZW5kZXJlciogcmVuZGVyZXIsIFNrTWF0cml4KiBtYXRyaXgpIHsKKyAgICByZW5kZXJlci0+Y29uY2F0TWF0cml4KG1hdHJpeCk7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIERyYXdpbmcKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIHZvaWQgYW5kcm9pZF92aWV3X0dMRVMyMENhbnZhc19kcmF3Qml0bWFwKEpOSUVudiogZW52LCBqb2JqZWN0IGNhbnZhcywKKyAgICAgICAgT3BlbkdMUmVuZGVyZXIqIHJlbmRlcmVyLCBTa0JpdG1hcCogYml0bWFwLCBmbG9hdCBsZWZ0LCBmbG9hdCB0b3AsIFNrUGFpbnQqIHBhaW50KSB7CisgICAgcmVuZGVyZXItPmRyYXdCaXRtYXAoYml0bWFwLCBsZWZ0LCB0b3AsIHBhaW50KTsKK30KKworc3RhdGljIHZvaWQgYW5kcm9pZF92aWV3X0dMRVMyMENhbnZhc19kcmF3Qml0bWFwUmVjdChKTklFbnYqIGVudiwgam9iamVjdCBjYW52YXMsCisgICAgICAgIE9wZW5HTFJlbmRlcmVyKiByZW5kZXJlciwgU2tCaXRtYXAqIGJpdG1hcCwKKyAgICAgICAgZmxvYXQgc3JjTGVmdCwgZmxvYXQgc3JjVG9wLCBmbG9hdCBzcmNSaWdodCwgZmxvYXQgc3JjQm90dG9tLAorICAgICAgICBmbG9hdCBkc3RMZWZ0LCBmbG9hdCBkc3RUb3AsIGZsb2F0IGRzdFJpZ2h0LCBmbG9hdCBkc3RCb3R0b20sIFNrUGFpbnQqIHBhaW50KSB7CisgICAgcmVuZGVyZXItPmRyYXdCaXRtYXAoYml0bWFwLCBzcmNMZWZ0LCBzcmNUb3AsIHNyY1JpZ2h0LCBzcmNCb3R0b20sCisgICAgICAgICAgICBkc3RMZWZ0LCBkc3RUb3AsIGRzdFJpZ2h0LCBkc3RCb3R0b20sIHBhaW50KTsKK30KKworc3RhdGljIHZvaWQgYW5kcm9pZF92aWV3X0dMRVMyMENhbnZhc19kcmF3Qml0bWFwTWF0cml4KEpOSUVudiogZW52LCBqb2JqZWN0IGNhbnZhcywKKyAgICAgICAgT3BlbkdMUmVuZGVyZXIqIHJlbmRlcmVyLCBTa0JpdG1hcCogYml0bWFwLCBTa01hdHJpeCogbWF0cml4LCBTa1BhaW50KiBwYWludCkgeworICAgIHJlbmRlcmVyLT5kcmF3Qml0bWFwKGJpdG1hcCwgbWF0cml4LCBwYWludCk7Cit9CisKK3N0YXRpYyB2b2lkIGFuZHJvaWRfdmlld19HTEVTMjBDYW52YXNfZHJhd1BhdGNoKEpOSUVudiogZW52LCBqb2JqZWN0IGNhbnZhcywKKyAgICAgICAgT3BlbkdMUmVuZGVyZXIqIHJlbmRlcmVyLCBTa0JpdG1hcCogYml0bWFwLCBqYnl0ZUFycmF5IGNodW5rcywKKyAgICAgICAgZmxvYXQgbGVmdCwgZmxvYXQgdG9wLCBmbG9hdCByaWdodCwgZmxvYXQgYm90dG9tLCBTa1BhaW50KiBwYWludCkgeworICAgIGpieXRlKiBzdG9yYWdlID0gZW52LT5HZXRCeXRlQXJyYXlFbGVtZW50cyhjaHVua3MsIE5VTEwpOworICAgIFJlc19wbmdfOXBhdGNoKiBwYXRjaCA9IHJlaW50ZXJwcmV0X2Nhc3Q8UmVzX3BuZ185cGF0Y2gqPihzdG9yYWdlKTsKKyAgICBSZXNfcG5nXzlwYXRjaDo6ZGVzZXJpYWxpemUocGF0Y2gpOworCisgICAgcmVuZGVyZXItPmRyYXdQYXRjaChiaXRtYXAsIHBhdGNoLCBsZWZ0LCB0b3AsIHJpZ2h0LCBib3R0b20sIHBhaW50KTsKKworICAgIGVudi0+UmVsZWFzZUJ5dGVBcnJheUVsZW1lbnRzKGNodW5rcywgc3RvcmFnZSwgMCk7Cit9CisKK3N0YXRpYyB2b2lkIGFuZHJvaWRfdmlld19HTEVTMjBDYW52YXNfZHJhd0NvbG9yKEpOSUVudiogZW52LCBqb2JqZWN0IGNhbnZhcywKKyAgICAgICAgT3BlbkdMUmVuZGVyZXIqIHJlbmRlcmVyLCBqaW50IGNvbG9yLCBTa1hmZXJtb2RlOjpNb2RlIG1vZGUpIHsKKyAgICByZW5kZXJlci0+ZHJhd0NvbG9yKGNvbG9yLCBtb2RlKTsKK30KKworc3RhdGljIHZvaWQgYW5kcm9pZF92aWV3X0dMRVMyMENhbnZhc19kcmF3UmVjdChKTklFbnYqIGVudiwgam9iamVjdCBjYW52YXMsCisgICAgICAgIE9wZW5HTFJlbmRlcmVyKiByZW5kZXJlciwgamZsb2F0IGxlZnQsIGpmbG9hdCB0b3AsIGpmbG9hdCByaWdodCwgamZsb2F0IGJvdHRvbSwKKyAgICAgICAgU2tQYWludCogcGFpbnQpIHsKKyAgICByZW5kZXJlci0+ZHJhd1JlY3QobGVmdCwgdG9wLCByaWdodCwgYm90dG9tLCBwYWludCk7Cit9CisKK3N0YXRpYyB2b2lkIGFuZHJvaWRfdmlld19HTEVTMjBDYW52YXNfZHJhd1JlY3RzKEpOSUVudiogZW52LCBqb2JqZWN0IGNhbnZhcywKKyAgICAgICAgT3BlbkdMUmVuZGVyZXIqIHJlbmRlcmVyLCBTa1JlZ2lvbiogcmVnaW9uLCBTa1BhaW50KiBwYWludCkgeworICAgIFNrUmVnaW9uOjpJdGVyYXRvciBpdCgqcmVnaW9uKTsKKyAgICB3aGlsZSAoIWl0LmRvbmUoKSkgeworICAgICAgICBjb25zdCBTa0lSZWN0JiByID0gaXQucmVjdCgpOworICAgICAgICByZW5kZXJlci0+ZHJhd1JlY3Qoci5mTGVmdCwgci5mVG9wLCByLmZSaWdodCwgci5mQm90dG9tLCBwYWludCk7CisgICAgICAgIGl0Lm5leHQoKTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIGFuZHJvaWRfdmlld19HTEVTMjBDYW52YXNfZHJhd1BhdGgoSk5JRW52KiBlbnYsIGpvYmplY3QgY2FudmFzLAorICAgICAgICBPcGVuR0xSZW5kZXJlciogcmVuZGVyZXIsIFNrUGF0aCogcGF0aCwgU2tQYWludCogcGFpbnQpIHsKKyAgICByZW5kZXJlci0+ZHJhd1BhdGgocGF0aCwgcGFpbnQpOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBTaGFkZXJzIGFuZCBjb2xvciBmaWx0ZXJzCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyB2b2lkIGFuZHJvaWRfdmlld19HTEVTMjBDYW52YXNfcmVzZXRNb2RpZmllcnMoSk5JRW52KiBlbnYsIGpvYmplY3QgY2FudmFzLAorICAgICAgICBPcGVuR0xSZW5kZXJlciogcmVuZGVyZXIpIHsKKyAgICByZW5kZXJlci0+cmVzZXRTaGFkZXIoKTsKKyAgICByZW5kZXJlci0+cmVzZXRDb2xvckZpbHRlcigpOworICAgIHJlbmRlcmVyLT5yZXNldFNoYWRvdygpOworfQorCitzdGF0aWMgdm9pZCBhbmRyb2lkX3ZpZXdfR0xFUzIwQ2FudmFzX3NldHVwU2hhZGVyKEpOSUVudiogZW52LCBqb2JqZWN0IGNhbnZhcywKKyAgICAgICAgT3BlbkdMUmVuZGVyZXIqIHJlbmRlcmVyLCBTa2lhU2hhZGVyKiBzaGFkZXIpIHsKKyAgICByZW5kZXJlci0+c2V0dXBTaGFkZXIoc2hhZGVyKTsKK30KKworc3RhdGljIHZvaWQgYW5kcm9pZF92aWV3X0dMRVMyMENhbnZhc19zZXR1cENvbG9yRmlsdGVyKEpOSUVudiogZW52LCBqb2JqZWN0IGNhbnZhcywKKyAgICAgICAgT3BlbkdMUmVuZGVyZXIqIHJlbmRlcmVyLCBTa2lhQ29sb3JGaWx0ZXIqIGZpbHRlcikgeworICAgIHJlbmRlcmVyLT5zZXR1cENvbG9yRmlsdGVyKGZpbHRlcik7Cit9CisKK3N0YXRpYyB2b2lkIGFuZHJvaWRfdmlld19HTEVTMjBDYW52YXNfc2V0dXBTaGFkb3coSk5JRW52KiBlbnYsIGpvYmplY3QgY2FudmFzLAorICAgICAgICBPcGVuR0xSZW5kZXJlciogcmVuZGVyZXIsIGpmbG9hdCByYWRpdXMsIGpmbG9hdCBkeCwgamZsb2F0IGR5LCBqaW50IGNvbG9yKSB7CisgICAgcmVuZGVyZXItPnNldHVwU2hhZG93KHJhZGl1cywgZHgsIGR5LCBjb2xvcik7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFRleHQKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIHZvaWQgcmVuZGVyVGV4dChPcGVuR0xSZW5kZXJlciogcmVuZGVyZXIsIGNvbnN0IGpjaGFyKiB0ZXh0LCBpbnQgY291bnQsCisgICAgICAgIGpmbG9hdCB4LCBqZmxvYXQgeSwgaW50IGZsYWdzLCBTa1BhaW50KiBwYWludCkgeworICAgIGNvbnN0IGpjaGFyICp3b3JrVGV4dDsKKyAgICBqY2hhciogYnVmZmVyID0gTlVMTDsKKyAgICBpbnQzMl90IHdvcmtCeXRlczsKKyAgICBpZiAoVGV4dExheW91dDo6cHJlcGFyZVRleHQocGFpbnQsIHRleHQsIGNvdW50LCBmbGFncywgJndvcmtUZXh0LCAmd29ya0J5dGVzLCAmYnVmZmVyKSkgeworICAgICAgICByZW5kZXJlci0+ZHJhd1RleHQoKGNvbnN0IGNoYXIqKSB3b3JrVGV4dCwgd29ya0J5dGVzLCBjb3VudCwgeCwgeSwgcGFpbnQpOworICAgICAgICBmcmVlKGJ1ZmZlcik7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCByZW5kZXJUZXh0UnVuKE9wZW5HTFJlbmRlcmVyKiByZW5kZXJlciwgY29uc3QgamNoYXIqIHRleHQsCisgICAgICAgIGppbnQgc3RhcnQsIGppbnQgY291bnQsIGppbnQgY29udGV4dENvdW50LCBqZmxvYXQgeCwgamZsb2F0IHksCisgICAgICAgIGludCBmbGFncywgU2tQYWludCogcGFpbnQpIHsKKyAgICB1aW50OF90IHJ0bCA9IGZsYWdzICYgMHgxOworICAgIGlmIChydGwpIHsKKyAgICAgICAgU2tBdXRvU1RNYWxsb2M8ODAsIGpjaGFyPiBidWZmZXIoY29udGV4dENvdW50KTsKKyAgICAgICAgamNoYXIqIHNoYXBlZCA9IGJ1ZmZlci5nZXQoKTsKKyAgICAgICAgaWYgKFRleHRMYXlvdXQ6OnByZXBhcmVSdGxUZXh0UnVuKHRleHQsIHN0YXJ0LCBjb3VudCwgY29udGV4dENvdW50LCBzaGFwZWQpKSB7CisgICAgICAgICAgICByZW5kZXJlci0+ZHJhd1RleHQoKGNvbnN0IGNoYXIqKSBzaGFwZWQsIGNvdW50IDw8IDEsIGNvdW50LCB4LCB5LCBwYWludCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBMT0dXKCJkcmF3VGV4dFJ1biBlcnJvciIpOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmVuZGVyZXItPmRyYXdUZXh0KChjb25zdCBjaGFyKikgKHRleHQgKyBzdGFydCksIGNvdW50IDw8IDEsIGNvdW50LCB4LCB5LCBwYWludCk7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBhbmRyb2lkX3ZpZXdfR0xFUzIwQ2FudmFzX2RyYXdUZXh0QXJyYXkoSk5JRW52KiBlbnYsIGpvYmplY3QgY2FudmFzLAorICAgICAgICBPcGVuR0xSZW5kZXJlciogcmVuZGVyZXIsIGpjaGFyQXJyYXkgdGV4dCwgaW50IGluZGV4LCBpbnQgY291bnQsCisgICAgICAgIGpmbG9hdCB4LCBqZmxvYXQgeSwgaW50IGZsYWdzLCBTa1BhaW50KiBwYWludCkgeworICAgIGpjaGFyKiB0ZXh0QXJyYXkgPSBlbnYtPkdldENoYXJBcnJheUVsZW1lbnRzKHRleHQsIE5VTEwpOworICAgIHJlbmRlclRleHQocmVuZGVyZXIsIHRleHRBcnJheSArIGluZGV4LCBjb3VudCwgeCwgeSwgZmxhZ3MsIHBhaW50KTsKKyAgICBlbnYtPlJlbGVhc2VDaGFyQXJyYXlFbGVtZW50cyh0ZXh0LCB0ZXh0QXJyYXksIEpOSV9BQk9SVCk7Cit9CisKK3N0YXRpYyB2b2lkIGFuZHJvaWRfdmlld19HTEVTMjBDYW52YXNfZHJhd1RleHQoSk5JRW52KiBlbnYsIGpvYmplY3QgY2FudmFzLAorICAgICAgICBPcGVuR0xSZW5kZXJlciogcmVuZGVyZXIsIGpzdHJpbmcgdGV4dCwgaW50IHN0YXJ0LCBpbnQgZW5kLAorICAgICAgICBqZmxvYXQgeCwgamZsb2F0IHksIGludCBmbGFncywgU2tQYWludCogcGFpbnQpIHsKKyAgICBjb25zdCBqY2hhciogdGV4dEFycmF5ID0gZW52LT5HZXRTdHJpbmdDaGFycyh0ZXh0LCBOVUxMKTsKKyAgICByZW5kZXJUZXh0KHJlbmRlcmVyLCB0ZXh0QXJyYXkgKyBzdGFydCwgZW5kIC0gc3RhcnQsIHgsIHksIGZsYWdzLCBwYWludCk7CisgICAgZW52LT5SZWxlYXNlU3RyaW5nQ2hhcnModGV4dCwgdGV4dEFycmF5KTsKK30KKworc3RhdGljIHZvaWQgYW5kcm9pZF92aWV3X0dMRVMyMENhbnZhc19kcmF3VGV4dFJ1bkFycmF5KEpOSUVudiogZW52LCBqb2JqZWN0IGNhbnZhcywKKyAgICAgICAgT3BlbkdMUmVuZGVyZXIqIHJlbmRlcmVyLCBqY2hhckFycmF5IHRleHQsIGludCBpbmRleCwgaW50IGNvdW50LAorICAgICAgICBpbnQgY29udGV4dEluZGV4LCBpbnQgY29udGV4dENvdW50LCBqZmxvYXQgeCwgamZsb2F0IHksIGludCBkaXJGbGFncywKKyAgICAgICAgU2tQYWludCogcGFpbnQpIHsKKyAgICBqY2hhciogdGV4dEFycmF5ID0gZW52LT5HZXRDaGFyQXJyYXlFbGVtZW50cyh0ZXh0LCBOVUxMKTsKKyAgICByZW5kZXJUZXh0UnVuKHJlbmRlcmVyLCB0ZXh0QXJyYXkgKyBjb250ZXh0SW5kZXgsIGluZGV4IC0gY29udGV4dEluZGV4LAorICAgICAgICAgICAgY291bnQsIGNvbnRleHRDb3VudCwgeCwgeSwgZGlyRmxhZ3MsIHBhaW50KTsKKyAgICBlbnYtPlJlbGVhc2VDaGFyQXJyYXlFbGVtZW50cyh0ZXh0LCB0ZXh0QXJyYXksIEpOSV9BQk9SVCk7CisgfQorCitzdGF0aWMgdm9pZCBhbmRyb2lkX3ZpZXdfR0xFUzIwQ2FudmFzX2RyYXdUZXh0UnVuKEpOSUVudiogZW52LCBqb2JqZWN0IGNhbnZhcywKKyAgICAgICAgT3BlbkdMUmVuZGVyZXIqIHJlbmRlcmVyLCBqc3RyaW5nIHRleHQsIGludCBzdGFydCwgaW50IGVuZCwKKyAgICAgICAgaW50IGNvbnRleHRTdGFydCwgaW50IGNvbnRleHRFbmQsIGpmbG9hdCB4LCBqZmxvYXQgeSwgaW50IGRpckZsYWdzLAorICAgICAgICBTa1BhaW50KiBwYWludCkgeworICAgIGNvbnN0IGpjaGFyKiB0ZXh0QXJyYXkgPSBlbnYtPkdldFN0cmluZ0NoYXJzKHRleHQsIE5VTEwpOworICAgIGppbnQgY291bnQgPSBlbmQgLSBzdGFydDsKKyAgICBqaW50IGNvbnRleHRDb3VudCA9IGNvbnRleHRFbmQgLSBjb250ZXh0U3RhcnQ7CisgICAgcmVuZGVyVGV4dFJ1bihyZW5kZXJlciwgdGV4dEFycmF5ICsgY29udGV4dFN0YXJ0LCBzdGFydCAtIGNvbnRleHRTdGFydCwKKyAgICAgICAgICAgIGNvdW50LCBjb250ZXh0Q291bnQsIHgsIHksIGRpckZsYWdzLCBwYWludCk7CisgICAgZW52LT5SZWxlYXNlU3RyaW5nQ2hhcnModGV4dCwgdGV4dEFycmF5KTsKK30KKworI2VuZGlmIC8vIFVTRV9PUEVOR0xfUkVOREVSRVIKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gQ29tbW9uCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyBqYm9vbGVhbiBhbmRyb2lkX3ZpZXdfR0xFUzIwQ2FudmFzX2lzQXZhaWxhYmxlKEpOSUVudiogZW52LCBqb2JqZWN0IGNsYXp6KSB7CisjaWZkZWYgVVNFX09QRU5HTF9SRU5ERVJFUgorICAgIHJldHVybiBKTklfVFJVRTsKKyNlbHNlCisgICAgcmV0dXJuIEpOSV9GQUxTRTsKKyNlbmRpZgorfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBKTkkgR2x1ZQorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitjb25zdCBjaGFyKiBjb25zdCBrQ2xhc3NQYXRoTmFtZSA9ICJhbmRyb2lkL3ZpZXcvR0xFUzIwQ2FudmFzIjsKKworc3RhdGljIEpOSU5hdGl2ZU1ldGhvZCBnTWV0aG9kc1tdID0geworICAgIHsgIm5Jc0F2YWlsYWJsZSIsICAgICAgICIoKVoiLCAgICAgICAgICAgICAodm9pZCopIGFuZHJvaWRfdmlld19HTEVTMjBDYW52YXNfaXNBdmFpbGFibGUgfSwKKworI2lmZGVmIFVTRV9PUEVOR0xfUkVOREVSRVIKKyAgICB7ICJuQ3JlYXRlUmVuZGVyZXIiLCAgICAiKClJIiwgICAgICAgICAgICAgKHZvaWQqKSBhbmRyb2lkX3ZpZXdfR0xFUzIwQ2FudmFzX2NyZWF0ZVJlbmRlcmVyIH0sCisgICAgeyAibkRlc3Ryb3lSZW5kZXJlciIsICAgIihJKVYiLCAgICAgICAgICAgICh2b2lkKikgYW5kcm9pZF92aWV3X0dMRVMyMENhbnZhc19kZXN0cm95UmVuZGVyZXIgfSwKKyAgICB7ICJuU2V0Vmlld3BvcnQiLCAgICAgICAiKElJSSlWIiwgICAgICAgICAgKHZvaWQqKSBhbmRyb2lkX3ZpZXdfR0xFUzIwQ2FudmFzX3NldFZpZXdwb3J0IH0sCisgICAgeyAiblByZXBhcmUiLCAgICAgICAgICAgIihJKVYiLCAgICAgICAgICAgICh2b2lkKikgYW5kcm9pZF92aWV3X0dMRVMyMENhbnZhc19wcmVwYXJlIH0sCisgICAgeyAibkFjcXVpcmVDb250ZXh0IiwgICAgIihJKVYiLCAgICAgICAgICAgICh2b2lkKikgYW5kcm9pZF92aWV3X0dMRVMyMENhbnZhc19hY3F1aXJlQ29udGV4dCB9LAorICAgIHsgIm5SZWxlYXNlQ29udGV4dCIsICAgICIoSSlWIiwgICAgICAgICAgICAodm9pZCopIGFuZHJvaWRfdmlld19HTEVTMjBDYW52YXNfcmVsZWFzZUNvbnRleHQgfSwKKworICAgIHsgIm5TYXZlIiwgICAgICAgICAgICAgICIoSUkpSSIsICAgICAgICAgICAodm9pZCopIGFuZHJvaWRfdmlld19HTEVTMjBDYW52YXNfc2F2ZSB9LAorICAgIHsgIm5SZXN0b3JlIiwgICAgICAgICAgICIoSSlWIiwgICAgICAgICAgICAodm9pZCopIGFuZHJvaWRfdmlld19HTEVTMjBDYW52YXNfcmVzdG9yZSB9LAorICAgIHsgIm5SZXN0b3JlVG9Db3VudCIsICAgICIoSUkpViIsICAgICAgICAgICAodm9pZCopIGFuZHJvaWRfdmlld19HTEVTMjBDYW52YXNfcmVzdG9yZVRvQ291bnQgfSwKKyAgICB7ICJuR2V0U2F2ZUNvdW50IiwgICAgICAiKEkpSSIsICAgICAgICAgICAgKHZvaWQqKSBhbmRyb2lkX3ZpZXdfR0xFUzIwQ2FudmFzX2dldFNhdmVDb3VudCB9LAorCisgICAgeyAiblNhdmVMYXllciIsICAgICAgICAgIihJRkZGRklJKUkiLCAgICAgICh2b2lkKikgYW5kcm9pZF92aWV3X0dMRVMyMENhbnZhc19zYXZlTGF5ZXIgfSwKKyAgICB7ICJuU2F2ZUxheWVyQWxwaGEiLCAgICAiKElGRkZGSUkpSSIsICAgICAgKHZvaWQqKSBhbmRyb2lkX3ZpZXdfR0xFUzIwQ2FudmFzX3NhdmVMYXllckFscGhhIH0sCisKKyAgICB7ICJuUXVpY2tSZWplY3QiLCAgICAgICAiKElGRkZGSSlaIiwgICAgICAgKHZvaWQqKSBhbmRyb2lkX3ZpZXdfR0xFUzIwQ2FudmFzX3F1aWNrUmVqZWN0IH0sCisgICAgeyAibkNsaXBSZWN0IiwgICAgICAgICAgIihJRkZGRkkpWiIsICAgICAgICh2b2lkKikgYW5kcm9pZF92aWV3X0dMRVMyMENhbnZhc19jbGlwUmVjdEYgfSwKKyAgICB7ICJuQ2xpcFJlY3QiLCAgICAgICAgICAiKElJSUlJSSlaIiwgICAgICAgKHZvaWQqKSBhbmRyb2lkX3ZpZXdfR0xFUzIwQ2FudmFzX2NsaXBSZWN0IH0sCisKKyAgICB7ICJuVHJhbnNsYXRlIiwgICAgICAgICAiKElGRilWIiwgICAgICAgICAgKHZvaWQqKSBhbmRyb2lkX3ZpZXdfR0xFUzIwQ2FudmFzX3RyYW5zbGF0ZSB9LAorICAgIHsgIm5Sb3RhdGUiLCAgICAgICAgICAgICIoSUYpViIsICAgICAgICAgICAodm9pZCopIGFuZHJvaWRfdmlld19HTEVTMjBDYW52YXNfcm90YXRlIH0sCisgICAgeyAiblNjYWxlIiwgICAgICAgICAgICAgIihJRkYpViIsICAgICAgICAgICh2b2lkKikgYW5kcm9pZF92aWV3X0dMRVMyMENhbnZhc19zY2FsZSB9LAorCisgICAgeyAiblNldE1hdHJpeCIsICAgICAgICAgIihJSSlWIiwgICAgICAgICAgICh2b2lkKikgYW5kcm9pZF92aWV3X0dMRVMyMENhbnZhc19zZXRNYXRyaXggfSwKKyAgICB7ICJuR2V0TWF0cml4IiwgICAgICAgICAiKElJKVYiLCAgICAgICAgICAgKHZvaWQqKSBhbmRyb2lkX3ZpZXdfR0xFUzIwQ2FudmFzX2dldE1hdHJpeCB9LAorICAgIHsgIm5Db25jYXRNYXRyaXgiLCAgICAgICIoSUkpViIsICAgICAgICAgICAodm9pZCopIGFuZHJvaWRfdmlld19HTEVTMjBDYW52YXNfY29uY2F0TWF0cml4IH0sCisKKyAgICB7ICJuRHJhd0JpdG1hcCIsICAgICAgICAiKElJRkZJKVYiLCAgICAgICAgKHZvaWQqKSBhbmRyb2lkX3ZpZXdfR0xFUzIwQ2FudmFzX2RyYXdCaXRtYXAgfSwKKyAgICB7ICJuRHJhd0JpdG1hcCIsICAgICAgICAiKElJRkZGRkZGRkZJKVYiLCAgKHZvaWQqKSBhbmRyb2lkX3ZpZXdfR0xFUzIwQ2FudmFzX2RyYXdCaXRtYXBSZWN0IH0sCisgICAgeyAibkRyYXdCaXRtYXAiLCAgICAgICAgIihJSUlJKVYiLCAgICAgICAgICh2b2lkKikgYW5kcm9pZF92aWV3X0dMRVMyMENhbnZhc19kcmF3Qml0bWFwTWF0cml4IH0sCisgICAgeyAibkRyYXdQYXRjaCIsICAgICAgICAgIihJSVtCRkZGRkkpViIsICAgICh2b2lkKikgYW5kcm9pZF92aWV3X0dMRVMyMENhbnZhc19kcmF3UGF0Y2ggfSwKKyAgICB7ICJuRHJhd0NvbG9yIiwgICAgICAgICAiKElJSSlWIiwgICAgICAgICAgKHZvaWQqKSBhbmRyb2lkX3ZpZXdfR0xFUzIwQ2FudmFzX2RyYXdDb2xvciB9LAorICAgIHsgIm5EcmF3UmVjdCIsICAgICAgICAgICIoSUZGRkZJKVYiLCAgICAgICAodm9pZCopIGFuZHJvaWRfdmlld19HTEVTMjBDYW52YXNfZHJhd1JlY3QgfSwKKyAgICB7ICJuRHJhd1JlY3RzIiwgICAgICAgICAiKElJSSlWIiwgICAgICAgICAgKHZvaWQqKSBhbmRyb2lkX3ZpZXdfR0xFUzIwQ2FudmFzX2RyYXdSZWN0cyB9LAorICAgIHsgIm5EcmF3UGF0aCIsICAgICAgICAgICIoSUlJKVYiLCAgICAgICAgICAodm9pZCopIGFuZHJvaWRfdmlld19HTEVTMjBDYW52YXNfZHJhd1BhdGggfSwKKworICAgIHsgIm5SZXNldE1vZGlmaWVycyIsICAgICIoSSlWIiwgICAgICAgICAgICAodm9pZCopIGFuZHJvaWRfdmlld19HTEVTMjBDYW52YXNfcmVzZXRNb2RpZmllcnMgfSwKKyAgICB7ICJuU2V0dXBTaGFkZXIiLCAgICAgICAiKElJKVYiLCAgICAgICAgICAgKHZvaWQqKSBhbmRyb2lkX3ZpZXdfR0xFUzIwQ2FudmFzX3NldHVwU2hhZGVyIH0sCisgICAgeyAiblNldHVwQ29sb3JGaWx0ZXIiLCAgIihJSSlWIiwgICAgICAgICAgICh2b2lkKikgYW5kcm9pZF92aWV3X0dMRVMyMENhbnZhc19zZXR1cENvbG9yRmlsdGVyIH0sCisgICAgeyAiblNldHVwU2hhZG93IiwgICAgICAgIihJRkZGSSlWIiwgICAgICAgICh2b2lkKikgYW5kcm9pZF92aWV3X0dMRVMyMENhbnZhc19zZXR1cFNoYWRvdyB9LAorCisgICAgeyAibkRyYXdUZXh0IiwgICAgICAgICAgIihJW0NJSUZGSUkpViIsICAgICh2b2lkKikgYW5kcm9pZF92aWV3X0dMRVMyMENhbnZhc19kcmF3VGV4dEFycmF5IH0sCisgICAgeyAibkRyYXdUZXh0IiwgICAgICAgICAgIihJTGphdmEvbGFuZy9TdHJpbmc7SUlGRklJKVYiLAorICAgICAgICAgICAgKHZvaWQqKSBhbmRyb2lkX3ZpZXdfR0xFUzIwQ2FudmFzX2RyYXdUZXh0IH0sCisKKyAgICB7ICJuRHJhd1RleHRSdW4iLCAgICAgICAiKElbQ0lJSUlGRklJKVYiLCAgKHZvaWQqKSBhbmRyb2lkX3ZpZXdfR0xFUzIwQ2FudmFzX2RyYXdUZXh0UnVuQXJyYXkgfSwKKyAgICB7ICJuRHJhd1RleHRSdW4iLCAgICAgICAiKElMamF2YS9sYW5nL1N0cmluZztJSUlJRkZJSSlWIiwKKyAgICAgICAgICAgICh2b2lkKikgYW5kcm9pZF92aWV3X0dMRVMyMENhbnZhc19kcmF3VGV4dFJ1biB9LAorCisgICAgeyAibkdldENsaXBCb3VuZHMiLCAgICAgIihJTGFuZHJvaWQvZ3JhcGhpY3MvUmVjdDspWiIsCisgICAgICAgICAgICAodm9pZCopIGFuZHJvaWRfdmlld19HTEVTMjBDYW52YXNfZ2V0Q2xpcEJvdW5kcyB9LAorI2VuZGlmCit9OworCisjaWZkZWYgVVNFX09QRU5HTF9SRU5ERVJFUgorICAgICNkZWZpbmUgRklORF9DTEFTUyh2YXIsIGNsYXNzTmFtZSkgXAorICAgICAgICAgICAgdmFyID0gZW52LT5GaW5kQ2xhc3MoY2xhc3NOYW1lKTsgXAorICAgICAgICAgICAgTE9HX0ZBVEFMX0lGKCEgdmFyLCAiVW5hYmxlIHRvIGZpbmQgY2xhc3MgIiBjbGFzc05hbWUpOyBcCisgICAgICAgICAgICB2YXIgPSBqY2xhc3MoZW52LT5OZXdHbG9iYWxSZWYodmFyKSk7CisgICAgCisgICAgI2RlZmluZSBHRVRfTUVUSE9EX0lEKHZhciwgY2xhenosIG1ldGhvZE5hbWUsIG1ldGhvZERlc2NyaXB0b3IpIFwKKyAgICAgICAgICAgIHZhciA9IGVudi0+R2V0TWV0aG9kSUQoY2xhenosIG1ldGhvZE5hbWUsIG1ldGhvZERlc2NyaXB0b3IpOyBcCisgICAgICAgICAgICBMT0dfRkFUQUxfSUYoISB2YXIsICJVbmFibGUgdG8gZmluZCBtZXRob2QgIiBtZXRob2ROYW1lKTsKKyNlbHNlCisgICAgI2RlZmluZSBGSU5EX0NMQVNTKHZhciwgY2xhc3NOYW1lKQorICAgICNkZWZpbmUgR0VUX01FVEhPRF9JRCh2YXIsIGNsYXp6LCBtZXRob2ROYW1lLCBtZXRob2REZXNjcmlwdG9yKQorI2VuZGlmCisKK2ludCByZWdpc3Rlcl9hbmRyb2lkX3ZpZXdfR0xFUzIwQ2FudmFzKEpOSUVudiogZW52KSB7CisgICAgRklORF9DTEFTUyhnUmVjdENsYXNzSW5mby5jbGF6eiwgImFuZHJvaWQvZ3JhcGhpY3MvUmVjdCIpOworICAgIEdFVF9NRVRIT0RfSUQoZ1JlY3RDbGFzc0luZm8uc2V0LCBnUmVjdENsYXNzSW5mby5jbGF6eiwgInNldCIsICIoSUlJSSlWIik7CisKKyAgICByZXR1cm4gQW5kcm9pZFJ1bnRpbWU6OnJlZ2lzdGVyTmF0aXZlTWV0aG9kcyhlbnYsIGtDbGFzc1BhdGhOYW1lLCBnTWV0aG9kcywgTkVMRU0oZ01ldGhvZHMpKTsKK30KKworfTsKZGlmZiAtLWdpdCBhL2NvcmUvam5pL2FuZHJvaWRfdmlld19WaWV3Um9vdC5jcHAgYi9jb3JlL2puaS9hbmRyb2lkX3ZpZXdfVmlld1Jvb3QuY3BwCmluZGV4IDUxNzNiYjguLjI5ODhhZTggMTAwNjQ0Ci0tLSBhL2NvcmUvam5pL2FuZHJvaWRfdmlld19WaWV3Um9vdC5jcHAKKysrIGIvY29yZS9qbmkvYW5kcm9pZF92aWV3X1ZpZXdSb290LmNwcApAQCAtNzYsMTAgKzc2LDYgQEAKICAgICBjYW52YXMtPnJlc3RvcmUoKTsKIH0KIAotc3RhdGljIHZvaWQgYW5kcm9pZF92aWV3X1ZpZXdSb290X2FiYW5kb25HbENhY2hlcyhKTklFbnYqIGVudiwgam9iamVjdCkgewotICAgIFNrR0xDYW52YXM6OkFiYW5kb25BbGxUZXh0dXJlcygpOwotfQotCiAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIApAQCAtODcsOSArODMsNyBAQAogCiBzdGF0aWMgSk5JTmF0aXZlTWV0aG9kIGdNZXRob2RzW10gPSB7CiAgICAgeyAgICJuYXRpdmVTaG93RlBTIiwgIihMYW5kcm9pZC9ncmFwaGljcy9DYW52YXM7SSlWIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopYW5kcm9pZF92aWV3X1ZpZXdSb290X3Nob3dGUFMgfSwKLSAgICB7ICAgIm5hdGl2ZUFiYW5kb25HbENhY2hlcyIsICIoKVYiLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKWFuZHJvaWRfdmlld19WaWV3Um9vdF9hYmFuZG9uR2xDYWNoZXMgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKilhbmRyb2lkX3ZpZXdfVmlld1Jvb3Rfc2hvd0ZQUyB9CiB9OwogCiBpbnQgcmVnaXN0ZXJfYW5kcm9pZF92aWV3X1ZpZXdSb290KEpOSUVudiogZW52KSB7CmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9BbmRyb2lkLm1rIGIvY29yZS9yZXMvQW5kcm9pZC5tawppbmRleCA3ZDExMTQ4Li4yMmY0ZmRjIDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9BbmRyb2lkLm1rCisrKyBiL2NvcmUvcmVzL0FuZHJvaWQubWsKQEAgLTMzLDggKzMzLDE2IEBACiAjIFBST0RVQ1QtYWdub3N0aWMgcmVzb3VyY2UgZGF0YSBsaWtlIElEcyBhbmQgdHlwZSBkZWZpbml0aW9ucy4KIExPQ0FMX0VYUE9SVF9QQUNLQUdFX1JFU09VUkNFUyA6PSB0cnVlCiAKKyMgSW5jbHVkZSByZXNvdXJjZXMgZ2VuZXJhdGVkIGJ5IHN5c3RlbSBSZW5kZXJTY3JpcHQgZmlsZXMuCitmcmFtZXdvcmtfR0VORVJBVEVEX1NPVVJDRV9ESVIgOj0gJChjYWxsIGludGVybWVkaWF0ZXMtZGlyLWZvcixKQVZBX0xJQlJBUklFUyxmcmFtZXdvcmssLENPTU1PTikvc3JjCitmcmFtZXdvcmtfUmVuZGVyU2NyaXB0X1NUQU1QX0ZJTEUgOj0gJChmcmFtZXdvcmtfR0VORVJBVEVEX1NPVVJDRV9ESVIpL1JlbmRlclNjcmlwdC5zdGFtcAorI0xPQ0FMX1JFU09VUkNFX0RJUiA6PSAkKGZyYW1ld29ya19HRU5FUkFURURfU09VUkNFX0RJUikvcmVuZGVyc2NyaXB0L3JlcyAkKExPQ0FMX1BBVEgpL3JlcworCiBpbmNsdWRlICQoQlVJTERfUEFDS0FHRSkKIAorIyBNYWtlIHN1cmUgdGhlIHN5c3RlbSAucnMgZmlsZXMgZ2V0IGNvbXBpbGVkIGJlZm9yZSBidWlsZGluZyB0aGUgcGFja2FnZS1leHBvcnQuYXBrLgorIyAkKHJlc291cmNlX2V4cG9ydF9wYWNrYWdlKTogJChmcmFtZXdvcmtfUmVuZGVyU2NyaXB0X1NUQU1QX0ZJTEUpCisKICMgZGVmaW5lIGEgZ2xvYmFsIGludGVybWVkaWF0ZSB0YXJnZXQgdGhhdCBvdGhlciBtb2R1bGUgbWF5IGRlcGVuZCBvbi4KIC5QSE9OWTogZnJhbWV3b3JrLXJlcy1wYWNrYWdlLXRhcmdldAogZnJhbWV3b3JrLXJlcy1wYWNrYWdlLXRhcmdldDogJChMT0NBTF9CVUlMVF9NT0RVTEUpCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9BbmRyb2lkTWFuaWZlc3QueG1sIGIvY29yZS9yZXMvQW5kcm9pZE1hbmlmZXN0LnhtbAppbmRleCA5YjliNGJlLi40ZDAyYjYwIDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9BbmRyb2lkTWFuaWZlc3QueG1sCisrKyBiL2NvcmUvcmVzL0FuZHJvaWRNYW5pZmVzdC54bWwKQEAgLTg1LDYgKzg1LDggQEAKICAgICA8cHJvdGVjdGVkLWJyb2FkY2FzdCBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaGFyZHdhcmUuYWN0aW9uLlVTQl9DT05ORUNURUQiIC8+CiAgICAgPHByb3RlY3RlZC1icm9hZGNhc3QgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmhhcmR3YXJlLmFjdGlvbi5VU0JfRElTQ09OTkVDVEVEIiAvPgogICAgIDxwcm90ZWN0ZWQtYnJvYWRjYXN0IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5oYXJkd2FyZS5hY3Rpb24uVVNCX1NUQVRFIiAvPgorICAgIDxwcm90ZWN0ZWQtYnJvYWRjYXN0IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5oYXJkd2FyZS5hY3Rpb24uVVNCX0NBTUVSQV9BVFRBQ0hFRCIgLz4KKyAgICA8cHJvdGVjdGVkLWJyb2FkY2FzdCBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaGFyZHdhcmUuYWN0aW9uLlVTQl9DQU1FUkFfREVUQUNIRUQiIC8+CiAKICAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgogICAgIDwhLS0gUGVybWlzc2lvbnMgZm9yIHRoaW5ncyB0aGF0IGNvc3QgbW9uZXkgLS0+CkBAIC0zMzYsNiArMzM4LDEzIEBACiAgICAgICAgIGFuZHJvaWQ6ZGVzY3JpcHRpb249IkBzdHJpbmcvcGVybWRlc2NfYWNjb3VudE1hbmFnZXJTZXJ2aWNlIgogICAgICAgICBhbmRyb2lkOmxhYmVsPSJAc3RyaW5nL3Blcm1sYWJfYWNjb3VudE1hbmFnZXJTZXJ2aWNlIiAvPgogCisgICAgPCEtLSBBbGxvd3MgYW4gaW50ZXJuYWwgdXNlciB0byB1c2UgcHJpdmFsZWRnZWQgQ29ubmVjdGl2aXR5TWFuYWdlcgorICAgIEFQSXMuCisgICAgICAgIEBoaWRlIC0tPgorICAgIDxwZXJtaXNzaW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5wZXJtaXNzaW9uLkNPTk5FQ1RJVklUWV9JTlRFUk5BTCIKKyAgICAgICAgYW5kcm9pZDpwZXJtaXNzaW9uR3JvdXA9ImFuZHJvaWQucGVybWlzc2lvbi1ncm91cC5ORVRXT1JLIgorICAgICAgICBhbmRyb2lkOnByb3RlY3Rpb25MZXZlbD0ic2lnbmF0dXJlT3JTeXN0ZW0iIC8+CisKICAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+CiAgICAgPCEtLSBQZXJtaXNzaW9ucyBmb3IgYWNjZXNzaW5nIGFjY291bnRzIC0tPgogICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KQEAgLTEyNjcsNyArMTI3Niw3IEBACiAgICAgICAgICAgICAgICAgYW5kcm9pZDpleGNsdWRlRnJvbVJlY2VudHM9InRydWUiPgogICAgICAgICA8L2FjdGl2aXR5PgogICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSJjb20uYW5kcm9pZC5pbnRlcm5hbC5hcHAuUGxhdExvZ29BY3Rpdml0eSIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOnRoZW1lPSJAc3R5bGUvVGhlbWUuTm9UaXRsZUJhci5GdWxsc2NyZWVuIj4KKyAgICAgICAgICAgICAgICBhbmRyb2lkOnRoZW1lPSJAc3R5bGUvVGhlbWUuV2FsbHBhcGVyLk5vVGl0bGVCYXIuRnVsbHNjcmVlbiI+CiAgICAgICAgIDwvYWN0aXZpdHk+CiAgICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9ImNvbS5hbmRyb2lkLmludGVybmFsLmFwcC5EaXNhYmxlQ2FyTW9kZUFjdGl2aXR5IgogICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGhlbWU9IkBzdHlsZS9UaGVtZS5Ob0Rpc3BsYXkiCkBAIC0xMzA0LDYgKzEzMTMsMTAgQEAKICAgICAgICAgICAgICAgICA8YWN0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuYWN0aW9uLkFDVElPTl9SRVFVRVNUX1NIVVRET1dOIiAvPgogICAgICAgICAgICAgICAgIDxjYXRlZ29yeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmNhdGVnb3J5LkRFRkFVTFQiIC8+CiAgICAgICAgICAgICA8L2ludGVudC1maWx0ZXI+CisgICAgICAgICAgICA8aW50ZW50LWZpbHRlcj4KKyAgICAgICAgICAgICAgICA8YWN0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuYWN0aW9uLlJFQk9PVCIgLz4KKyAgICAgICAgICAgICAgICA8Y2F0ZWdvcnkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5jYXRlZ29yeS5ERUZBVUxUIiAvPgorICAgICAgICAgICAgPC9pbnRlbnQtZmlsdGVyPgogICAgICAgICA8L2FjdGl2aXR5PgogICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSJjb20uYW5kcm9pZC5pbnRlcm5hbC5hcHAuTmV0SW5pdGlhdGVkQWN0aXZpdHkiCiAgICAgICAgICAgICAgICAgYW5kcm9pZDp0aGVtZT0iQHN0eWxlL1RoZW1lLkRpYWxvZy5BbGVydCIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL2Fzc2V0cy9pbWFnZXMvY29tYm9ib3gtZGlzYWJsZWQucG5nIGIvY29yZS9yZXMvYXNzZXRzL2ltYWdlcy9jb21ib2JveC1kaXNhYmxlZC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZlMjIwZTQuLjAwMDAwMDAKLS0tIGEvY29yZS9yZXMvYXNzZXRzL2ltYWdlcy9jb21ib2JveC1kaXNhYmxlZC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9hc3NldHMvaW1hZ2VzL2NvbWJvYm94LW5vSGlnaGxpZ2h0LnBuZyBiL2NvcmUvcmVzL2Fzc2V0cy9pbWFnZXMvY29tYm9ib3gtbm9IaWdobGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYmNkZjcyLi4wMDAwMDAwCi0tLSBhL2NvcmUvcmVzL2Fzc2V0cy9pbWFnZXMvY29tYm9ib3gtbm9IaWdobGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvYXNzZXRzL3dlYmtpdC9oeXBoX2VuX1VTLmRpYyBiL2NvcmUvcmVzL2Fzc2V0cy93ZWJraXQvaHlwaF9lbl9VUy5kaWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDkxMjA0YgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL2Fzc2V0cy93ZWJraXQvaHlwaF9lbl9VUy5kaWMKQEAgLTAsMCArMSw5Nzg0IEBACitJU084ODU5LTEKK0xFRlRIWVBIRU5NSU4gMgorUklHSFRIWVBIRU5NSU4gMworLmEyY2g0CisuYWQ0ZGVyCisuYTJkCisuYWQxZDQKKy5hMmYxdAorLmEyZgorLmE0bDN0CisuYW01YXQKKy40YTFtYQorLmFuNWMKKy5hMm4KKy4yYW5nNAorLmFuMWk1bQorLmFuMXQ0CisuYW4zdGUKKy5hbnRpNXMKKy5hbnQyaQorLmE0cjVzMgorLjJhMnIKKy5hcjR0MmllNAorLmFyMXRpCisuYXI0dHkKKy5hczNjCisuYXMxcAorLmEyczFzCisuYXN0ZXI1CisuYTJ0b201CisuYTF0bworLmF1MWQKKy5hdjRpCisuYXduNAorLmJhNGcKKy5iYTVuYQorLmJhMm4KKy5iYXM0ZQorLmJlcjQKKy5iZTVyMWEKKy5iZTNzMW0KKy40YmVzNAorLmI0ZTVzMnRvCisuYnJpMgorLmJ1dDR0aQorLmJ1NHQzdDIKKy5jYW00cGUKKy4xY2EKKy5jYTRtMXAKKy5jYW41YworLmNhMm4KKy5jYXBhNWIKKy5jYTFwYQorLmNhcjVvbAorLmMyYTJyCisuY2E0dAorLmNlNGxhCisuMmNoNAorLmNoaWxsNWkKKy5jaDRpbDIKKy5jaGlsMWwKKy4xY2kyCisuY2l0NXIKKy4yYzFpdAorLmNvM2UyCisuMWNvCisuY280cgorLmNvcjVuMWVyCisuY29ybjJlCisuZGU0bW9pMgorLmQ0ZW0KKy5kZTFtbworLmRlM28KKy5kZTNyMWEKKy5kZTNyMWkKKy5kZTFzNGMKKy5kZXMyCisuZGljMXQyaW81CisuM2RpMmMxdAorLmRvNHQKKy4xZG8KKy5kdTRjCisuMWR1CisuZHU0bTFiNQorLmVhcnRoNQorLmVhcjJ0CisuZTJhMnIKKy5lYXMzaQorLjJlMWI0CisuZWVyNAorLmVnMgorLmUybDVkCisuZWwzZW0KKy5lbmFtMworLmUxbmEKKy5lbjNnCisuZTJuM3MyCisuZXE1dWk1dAorLmUxcQorLmVxdTIKKy5lcTJ1aTIKKy5lcjRyaQorLmVyMXI0CisuZXMzCisuNGV1MworLmV5ZTUKKy5mZXMzCisuZm9yNW1lcgorLjFmbworLmZvMnIKKy5mb3IxbQorLmZvcjJtZQorLjFnYTIKKy5nZTIKKy5nZW4zdDQKKy4xZ2VuCisuZ2U1bzJnCisuMWdlbworLjFnMmk1YQorLmdpNGIKKy5nbzRyCisuMWdvCisuaGFuZDVpCisuaGEybgorLmg0YW5kCisuaGE0bjVrMgorLmhlMgorLmhlcm81aTIKKy5oMmVybworLmgxZXMzCisuaGU0dDMKKy5oaTNiCisuaGkzZXIKKy5oMmllNAorLmhvbjVleQorLmhvMm4KKy5ob24zbworLmhvdjUKKy5pZDRsCisuMmlkCisuaWRvbDMKKy5pMWRvCisuaW0zbQorLmltNXAxaTJuCisuaTRtMXAKKy5pbTJwaQorLmluMQorLmluM2NpCisuMmluZTIKKy40aTRuMmsyCisuMmkybjNzMgorLmlyNXI0CisuNGlyCisuaXM0aQorLmp1M3IKKy5sYTRjeQorLmxhNG0KKy5sYXQ1ZXIKKy5sNGF0aDUKKy5sZTIKKy5sZWc1ZQorLmxlbjQKKy5sZXA1CisubGV2MQorLmwyaTRnCisubGkxZzVhCisubGkybgorLmwyaTNvCisubDFpNHQKKy5tYTFnNWE1CisuMW1hCisubWFsNW8KKy5tYTFuNWEKKy5tYTJuCisubWFyNXRpCisubTJhMnIKKy5tZTIKKy5tZXIzYworLm1lNXRlcgorLm1lMXRlCisubTJpczEKKy5taXM0dDVpCisubW9uM2UKKy4xbW8KKy5tbzJuCisubW8zcm8KKy5tbzJyCisubXU1dGEKKy4xbXUKKy5tdTJ0YTViCisubmk0YworLm9kMgorLm9kMWQ1Cisub2Y1dGUKKy5vMmZ0Cisub3I1YTF0bworLm8xcmEKKy5vcjNjCisub3IxZAorLm9yM3QKKy5vczMKKy5vczR0bAorLjRvdGgzCisub3V0MworLm91MgorLnBlZDVhbAorLjJwMmVkCisucDJlMmQyYQorLnBlNXRlCisucGUydAorLnBlNXRpdAorLnAyaTRlNAorLnBpbzVuNAorLjNwMmkxbworLnBpMnQKKy5wcmUzbQorLnByMgorLnJhNGMKKy5yYW40dAorLnJhMm4KKy5yYXRpbzVuMWEKKy5yYXRpbzJuNAorLnJhMXQyaW8KKy5yZWUyCisucmU1bWl0CisucmVzMgorLnJlNXN0YXQKKy5yZXMydAorLnJlczF0YQorLnIyaTRnCisucmkydDV1Cisucm80cQorLnJvczV0Cisucm93NWQKKy5ydTRkCisuM3M0YzJpM2U0CisuczFjaQorLjVzZTJsMmY1Cisuc2VsMWw1Cisuc2UybgorLnNlNXIyaWU0Cisuc2VyMWkKKy5zMmgyCisuc2kyCisuczNpbmc0CisuMnMxaW4KKy5zdDQKKy5zdGE1YjJsMgorLnMxdGEKKy5zMnRhYgorLnM0eTIKKy4xdGE0CisudGU0CisuM3RlbjVhMm4KKy50ZTFuYQorLnRoMgorLnRpMgorLnRpbDQKKy50aTFtNW81CisuMXRpbQorLnRpbmc0CisuMnQxaW4KKy50NGk0bjVrMgorLnRvMW40YQorLjF0bworLnRvMm4KKy50bzRwCisudG9wNWkKKy50bzJ1NXMKKy50b3UyCisudHJpYjV1dAorLnRyNGliCisudTFuMWEKKy51bjNjZQorLnVuZGVyNQorLnVuMWRlCisudTJuMWUKKy51NG41azIKKy51bjVvCisudW4zdTQKKy51cDMKKy51cmUzCisudXM1YTIKKy4ydXMKKy52ZW40ZGUKKy52ZTVyMWEKKy53aWw1aQorLndpMgorLndpbDIKKy55ZTQKKzRhYi4KK2E1YmFsCithNWJhMm4KK2FiZTIKK2FiNWVyZAorYWIyaTVhCithYjVpMnQ1YWIKK2FiaTJ0CithYmkxdGEKK2FiNWxhdAorYWIybDIKK2FiNW81bDFpegorYWJvbDJpCis0YWJyCithYjVyb2cKK2FiM3VsCithNGMyYTJyCithMWNhCithYzVhcmQKK2FjNWFybworYTVjZW91MgorYWMxZXIKK2E1Y2hlNHQKK2EyY2gKK2FjaGUyCis0YTJjaQorYTNjMmllNAorYTJjMWluCithM2MyaW8KK2FjNXJvYgorYWN0NWlmMgorYTJjMXQKK2FjM3VsCithYzR1bQorYTJkCithZDRkMWluCithZDFkNAorYWQ1ZXIuCisyYWRpCithM2Q0aTNhCithZDNpMWNhCithZGk0ZXIKK2FkMmllNAorYTNkMmlvCithM2RpdAorYTVkaTF1CithZDRsZQorYWQzb3cKK2ExZG8KK2FkNXJhMm4KK2ExZHIKK2FkNHN1CithMmQxczIKKzRhMWR1CithM2R1MmMKK2FkNXVtCithZTRyCithZXIyaTRlNAorYWVyMWkKK2EyZgorYTRmMWY0CithNGdhYgorYTFnYQorYWdhNG4KK2FnNWVsMWwKK2ExZ2U0bworNGFnNGV1CithZzFpCis0YWc0bDIKK2FnMW4KK2EyZ28KKzNhM2c0bzRnCithZzNvM25pCithZ28ybjIKK2E1Z3VlcgorYTJndWUKK2FnNXVsCithNGd5CithM2hhCithM2hlCithNGg0bDQKK2EzaG8KK2FpMgorYTVpMWEKK2EzaWMuCithaTVseQorYTRpNG4KK2FpbjVpbgorYTJpbmkKK2EyaTFuNW8KK2FpdDVlbgorYTJpdGUKK2ExagorYWsxZW4KK2FsNWFiCithbDNhMmQKK2E0bDJhMnIKKzRhbGRpNAorYTJsZAorMmFsZQorYWwzZW5kCithNGxlbnQyaQorYTFsZW4xdAorYTVsZTVvCithbDFpCithbDRpYS4KK2FsMmkxYQorYWwyaTRlNAorYWw1bGV2CithbDFsCithbDJsZQorNGFsbGljCithbGwyaQorNGEybG0KK2E1bG9nLgorYTRseS4KK2ExbHkKKzRhMmx5czQKKzVhNWx5czF0Cis1YWx5dAorM2FseXoKKzRhMW1hCithMm01YWIKK2FtM2FnCithbWE1cmEKK2FtMmEycgorYW01YXNjCithNG1hM3RpcworYTRtNWExdG8KK2FtNWVyMWEKK2FtM2ljCithbTVpZgorYW01aTFseQorYW0xaW4KK2FtMmk0bm8KK2EybW8KK2E1bW8ybgorYW1vcjVpCithbW8ycgorYW1wNWVuCithNG0xcAorYTJuCithbjNhZ2UKK2ExbmEKKzNhbmExbHkKK2EzbjJhMnIKK2FuM2FyM2MKK2FuYXI0aQorYTNuYXRpCithbjJhdAorNGFuZAorYW5kZTRzMgorYW4xZGUKK2FuM2RpczEKK2FuMWRsCithbjRkb3cKK2FuMWRvCithNW5lZQorYTNuZW4KK2FuNWUyc3QuCithMW5lcworYTJuZXN0CithM240ZXUKKzJhbmcKK2FuZzVpZTQKK2FuMWdsMgorYTRuMWljCithM25pZXMKK2FuMmllNAorYW4zaTNmCithbjRpbWUKK2FuMWltCithNW5pbTFpCithNW4yaW5lCithbjFpbgorYW4zaTRvCithM24yaXAKK2FuM2lzMmgKK2FuM2l0CithM25pMXUKK2FuNGtsaQorYTRuazIKK2FuMWsxbAorNWFubml6CithNG4xbjIKK2FubzQKK2FuNW90CithbjRvdGg1CithbjJzYTIKK2EybjFzMgorYW40czFjbworYW5zNGMKK2FuNHMxbjQKK2FuMnNwCithbnMzcG8KK2FuNHN0CithbjRzdTJyCithbjFzdQorYW50YTJsNAorYW4xdAorYW4xdGEKK2FuNHQyaWU0CithbnQyaQorNGFuMXRvCithbjJ0cgorYW40dHc0CithbjN1MWEKK2FuM3VsCithNW51cgorNGFvCithcDJhMnI0CithMXBhCithcDVhdAorYXA1ZXIzbworYTNwaDRlcgorNGFwaGkKK2E0cGlsbGEKK2FwaWwxbAorYXA1aWxsMmEycgorYXAzaTJuCithcDNpMXRhCithM3BpMnR1CithMnAybDIKK2FwbzRjNQorYXA1bzFsYQorYXBvcjVpCithMXA0b3IKK2Fwb3MzdAorYTFwb3MKK2FwczVlNHMKK2EycDFzMgorYXAyc2UKK2EzcHUKK2FxdWU1CithcXUyCisyYTJyCithcjNhMmMxdAorYTVyYWRlCithcmEyZAorYXI1YWRpczEKK2FyMmFkaQorYXIzYWwKK2E1cmFtZTF0ZQorYXJhbTNldAorYXIyYW40ZworYXJhMm4KK2FyYTNwCithcjRhdAorYTVyYTF0MmlvCithcjVhMXQyaXYKK2E1cmF1CithcjVhdjQKK2FyYXc0CithcmJhbDQKK2FyMWIKK2FyNGNoYTJuCithcjFjCithcjNjaGEKK2FyMmNoCithcjVkMmluZQorYXJkMmkKK2FyZDFpbjQKK2FyNGRyCithcjVlYXMKK2EzcmVlCithcjNlbjF0CithNXIyZTJzcworYXI0ZmkKK2FyMWYKK2FyNGY0bDIKK2FyMWkKK2FyNWkyYWwKK2FyMmkzYQorYXIzaTJhMm4KK2Ezcmk1ZXQKK2FyMmllNAorYXI0aW0KK2FyNWluMmF0CithcjJpMW5hCithcjNpMW8KK2FyMml6CithcjJtaQorYXIxbQorYXI1bzVkCithNXJvbmkKK2FybzJuCithM3JvbzIKK2FyMnAKK2FyM3EKK2FycmU0CithcjFyNAorYXI0c2EyCithNHJzMgorYXIyczJoCis0YXMuCithMnM0YWIKK2FzYTIKK2FzM2FuMXQKK2FzYTJuCithc2hpNAorYXMyaAorYTVzaWEuCithczJpMWEKK2Ezc2kxYgorYTNzaWMKKzVhNXNpNHQKK2FzazNpCithc2syCithczRsMgorYTRzb2MKK2Exc28KK2FzNXBoCithczRzMmgKK2Eyc3MKK2FzM3RlbgorYXMxdDRyCithc3UxcjVhCithMXN1Cithc3UycgorYTJ0YQorYXQzYWIybDIKK2EydGFiCithdDVhYworYXQzYWxvCithdGEybAorYXQ1YXAKK2F0ZTVjCithdDVlMmNoCithdDNlMWdvCithdGVnNAorYXQzZW4uCithdDNlcjFhCithdGVyNW4KK2E1dGVyMW5hCithdDNlc3QKK2F0NWV2Cis0YXRoCithdGg1ZW0KK2F0aDJlCithNXRoZTJuCithdDRobworYXRoNW9tCis0YXRpLgorYTV0MmkxYQorYTJ0NWk1YgorYXQxaWMKK2F0M2lmMgorYXRpb241YTJyCithMXQyaW8KK2F0aW8ybgorYXRpbzFuMWEKK2F0M2kxdHUKK2E0dG9nCithMXRvCithMnRvbQorYXQ1b20yaXoKK2E0dG9wCithNHRvczIKK2ExdHIKK2F0NXJvcAorYXQ0c2syCithNHQxczIKK2F0NHRhZworYTR0M3QyCithdDF0YQorYXQ1dGUKK2F0NHRoCithMnR1CithdDV1MWEKK2E0dDV1ZQorYXQzdWwKK2F0M3UxcmEKK2EydHkKK2F1NGIKK2F1Z2gzCithdTNndQorYXU0bDIKK2F1bjVkCithdTNyCithdTVzaTFiCithMnVzCithNHV0NWVuCithdTF0aAorYTJ2YQorYXYzYWc0CithNXZhMm4KK2F2NGU0bm8KK2F2M2VyMWEKK2F2NWVybgorYXY1ZXJ5CithdjFpCithdmk0ZXIKK2F2MmllNAorYXYzaWcKK2F2NW9jCithMXZvcgorM2F3YXkKK2F3M2kyCithdzRseQorYXdzNAorYXg0aTVjCitheDNpCitheDRpZAorYXk1YWwKK2F5ZTQKK2F5czQKK2F6aTRlcgorYTJ6MWkKK2F6MmllNAorYXoyejVpCithNHoxejIKKzViYS4KK2JhZDVnZXIKK2JhMmQKK2JhNGdlCitiYWwxYQorYmFuNWRhZworYmEybgorYjRhbmQKK2JhbjFkMmEKK2JhbjRlCitiYW4zaQorYmFyYmk1CitiMmEycgorYmFyMWIKK2JhcjJpNGEKK2JhcjFpCitiYXM0c2kKK2JhMnNzCisxYmF0CitiYTR6CisyYjFiCitiMmJlCitiM2JlcgorYmJpNG5hCis0YjFkCis0YmUuCitiZWFrNAorYmVhMnQzCis0YmUyZAorYjJlM2QyYQorYmUzZGUKK2I0ZTNkaQorYmUzZ2kKK2JlNWd1CisxYmVsCitiZTFsMmkKK2JlM2xvCis0YmU1bQorYmU1bjJpZworYmU1bnUKKzRiZXM0CitiZTNzcAorYjJlNXN0NHIKKzNiZXQKK2JlMXQ1aXoKK2JlNXRyCitiZTN0dzQKK2JlM3cKK2JlNXkxbzQKKzJiZgorNGIzaAorYmkyYgorYjJpNGQKKzNiMmllNAorYmk1ZW4KK2JpNGVyCisyYjNpZgorMWJpbAorYmkzbDJpegorYmlsMWkKK2JpbjJhNXI0CitiaTFuYQorYjRpbjRkCitiaTVuZXQKK2IyaW5lCitiaTNvMmdyCitiMmlvCitiaTVvdTIKK2JpMnQKKzNiMmkzdDJpbworYmkxdGkKK2JpM3RyCiszYml0NXUxYQorYmkxdHUKK2I1aTR0egorYjFqCitiazQKK2IybDIKK2JsNGF0aDUKK2I0bGUuCitibGVuNAorNWJsZTFzcAorYmxlczIKK2IzbGlzCitiNGxvCitibHVuNHQKKzRiMW0KKzRiM24KK2JuZTVnCiszYm9kCitib2QzaQorYm80ZQorYm9sM2ljCitib2wyaQorYm9tNGJpCitibzRtMWIKK2JvMW40YQorYm8ybgorYm9uNWF0CiszYm9vMgorNWJvci4KKzRiMW8xcmEKK2JvcjVkCis1Ym9yZQorNWJvcmkKKzVib3M0CitiNW8xdGEKK2I0b3RoNQorYm80dG8KK2JvdW4yZDMKK2JvdTIKKzRicAorNGJyaXQKK2JyNG90aDMKKzJiNXMyCitic29yNAorYjFzbworMmJ0CitiMnQ0bAorYjR0bworYjN0cgorYnVmNGZlcjEKK2J1NGYxZgorYnU0Z2EKK2J1M2wyaQorYnUxbWk0CitidTRuCitidW50NGkKK2J1bjF0CitidTNyZQorYnVzNWllNAorYjJ1cworYnVzczRlCitidTJzcworNWJ1c3QKKzRidTF0YQorM2J1MXQyaW8KK2I0dTF0MmkKK2I1dTF0bworYjF2Cis0YjV3Cis1YnkuCitieXM0CisxY2EKK2NhYjNpbgorY2ExYjJsMgorY2EyY2g0CitjYTVkZW4KK2NhMmQKKzRjYWc0CisyYzVhaAorY2EzbGF0CitjYWw0bGEKK2NhbDFsCitjYWwybDVpbjQKK2NhbGwyaQorNGNhbG8KK2M0YW41ZAorY2EybgorY2FuNGUKK2NhNG40aWMKK2NhbjVpcworY2FuM2l6CitjYW40dHkKK2NhbjF0CitjYW55NAorY2E1cGVyCitjYXI1b20KK2MyYTJyCitjYXN0NWVyCitjYXM1dDJpZworY2FzdDJpCis0Y2FzNHkKK2M0YTR0aAorNGNhMXQyaXYKK2NhdjVhbAorY2EydmEKK2MzYworY2NoYTUKK2MyY2gKK2MzYzJpNGEKK2MxY2kKK2Njb20xcGE1CitjMWNvCitjY280bTFwCitjY28ybjQKK2Njb3UzdAorY2NvdTIKKzJjZS4KKzRjZWQuCis0Y2UxZGVuCiszY2VpMgorNWNlbC4KKzNjZWwxbAorMWNlbgorM2NlbmMKKzJjZW40ZQorNGNlbmkKKzNjZW4xdAorM2NlcAorY2U1cmFtCitjZXIxYQorNGNlMXM0YTIKKzNjZXMxc2kKK2MyZTJzcworY2VzNXNpNWIKK2NlczV0CitjZXQ0CitjNWU0dGEKK2NldzQKKzJjaAorNGNoLgorNGNoM2FiCis1Y2hhNG4xaWMKK2NoYTJuCitjaDVhNW5pcworY2hlMgorY2hlYXAzCis0Y2g0ZWQKK2NoNWU1bG8KKzNjaGVtaQorY2g1ZW5lCitjaGUybgorY2gzZXIuCitjaDNlNHIxczIKKzRjaDFpbgorNWNoaTJuZS4KK2NoMmluZQorY2g1aTVuMmUyc3MKK2NoaTFuZXMKKzVjaDJpbmkKKzVjaDJpbworM2NoaXQKK2NoaTJ6CiszY2hvMgorY2g0dGkKKzFjaQorM2MyaTFhCitjaTJhNWIKK2NpMmE1cgorY2k1YworNGNpZXIKK2MyaWU0Cis1YzRpMmYzaWMuCitjaTFmaQorNGM0aTVpNAorY2k0bGEKKzNjaWwxaQorMmNpbQorMmNpbgorYzRpMW5hCiszY2luMmF0CitjaW4zZW0KK2MyaW5lCitjMWluZworYzVpbmcuCis1YzJpMW5vCitjaW8ybjQKK2MyaW8KKzRjaXBlNAorYzJpcAorY2kzcGgKKzRjaXA0aWMKK2NpcDNpCis0Y2lzMXRhCis0Y2lzMXQyaQorMmMxaXQKK2NpMXQzaXoKK2NpMXRpCis1Y2l6CitjazEKK2NrM2kKKzFjNGw0Cis0Y2wyYTJyCitjNWxhNXJhMXQyaW8KK2NsYXI0YXQKKzVjbGFyZQorY2xlNG0KKzRjbGljCitjbGltNAorYzFseTQKK2M1bgorMWNvCitjbzVhZworYzRvYQorY29lMgorMmNvZworY280Z3IKK2NvaTQKK2NvM2luYworY29sNWkKKzVjb2xvCitjb2wzbzRyCitjb201ZXIKK2NvMm1lCitjbzFuNGEKK2NvMm4KK2M0b25lCitjb24zZworY29uNXQKK2NvM3BhCitjb3AzaWMKK2NvNHAybDIKKzRjb3IxYgorY29ybzNuCitjb3M0ZQorY292MQorY292ZTQKK2NvdzVhCitjbzJ6NWUKK2NvNXoxaQorYzFxCitjcmFzNXQKK2NyMmFzCis1Y3JhdC4KKzVjcmF0MWljCitjcmUzYTJ0Cis1YzJyMmVkCis0YzNyZTF0YQorY3JlNHYyCitjcmkyCitjcmk1ZgorYzRyaW4KK2NyMmlzNAorNWNyaTF0aQorY3JvNHAybDIKK2Nyb3A1bworY3JvczRlCitjcnU0ZAorNGMzczIKKzJjMXQKK2MydGE0YgorYzF0YQorY3Q1YW5nCitjdGEybgorYzV0YW4xdAorYzJ0ZQorYzN0ZXIKK2M0dDRpYzF1CitjdGltM2kKK2MxdGltCitjdHU0cgorYzF0dQorYzR0dzQKK2N1ZDUKK2M0dWYKK2M0dWkyCitjdTVpMXR5Cis1Y3VsMmkKK2N1bDR0aXM0CitjdWwxdGkKK2N1NGx0CiszYzR1bDF0dTIKK2N1Mm1hCitjM3VtZQorY3U0bWkKKzNjdW4KK2N1M3BpCitjdTVweQorY3UycjVhNGIKK2N1MXJhCitjdTVyMmkzYQorMWMydXMKK2N1czFzNGkKK2N1MnNzCiszYzR1dAorY3U0dDJpZTQKK2M0dTF0MmkKKzRjNXUxdDJpdgorNGN1dHIKKzFjeQorYzJ6ZTQKKzFkMmEKKzVkYS4KKzJkM2E0YgorZGEyY2g0Cis0ZGEyZgorMmRhZworZGEybTIKK2QyYW4zZworZGEybgorZGFyZDUKK2QyYTJyCitkYXJrNQorNGRhcnkKKzNkYXQKKzRkYTF0Mml2Cis0ZGExdG8KKzVkYXY0CitkYXY1ZQorNWRheQorZDFiCitkNWMKK2QxZDQKKzJkZS4KK2RlYTJmNQorZGU0YjVpMnQKK2QyZTFiCitkZTRibzJuCitkZWNhMm40CitkZTFjYQorZGU0Y2lsCitkZTFjMmkKK2RlNWNvbQorZGUxY28KKzJkMWVkCis0ZGVlLgorZGU1aWYKK2RlaTIKK2RlbDJpNGU0CitkZWwyaQorZGU0bDVpNXEKK2RlNWxvCitkNGVtCis1ZGVtLgorM2RlbWljCitkZW01aWMuCitkZTVtaWwKK2RlNG1vMm4zczIKK2RlMW1vCitkZW1vMm4KK2RlbW8ycjUKKzFkZW4KK2RlNG4yYTJyCitkZTFuYQorZDRlM25vCitkZW50aTVmMgorZGVuMXQKK2RlbnQyaQorZGUzbnUKK2RlMXAKK2RlM3BhCitkZXBpNAorZGUycHUKK2QzZTFxCitkNGVyMWg0Cis1ZGVyM200CitkNWVybjVpegorZGU0cjVzMgorZGVzMgorZDJlcy4KK2RlMXMyYworZGUyczVvCitkZXMzdDJpCitkMmUzc3Q0cgorZGU0c3UKK2RlMXQKK2RlMnRvCitkZTF2CitkZTJ2M2k0bAorZGUxdmkKKzRkZXkKKzRkMWYKK2Q0Z2EKK2QzZ2U0dAorZGcxaQorZDJneQorZDFoMgorNWRpLgorMWQ0aTNhCitkaWE1YgorZDRpNGNhbQorZGkxY2EKK2Q0aWNlCiszZGkyYzF0CiszZDJpZAorNWRpM2VuCitkMmllNAorZDFpZgorZGkzZ2UKK2QyaWcKK2RpNGxhMXRvCitkaTFsYQorZDFpbgorMWRpMW5hCiszZGkybmUuCitkMmluZQorNWQyaW5pCitkaTVuaXoKKzFkMmlvCitkaW81ZworZGk0cDJsMgorZDJpcAorZDRpcjIKK2RpMXJlCitkaXIxdDVpCitkaXMxCis1ZGlzaQorZDRpczN0CitkMmkxdGkKKzFkMmkxdgorZDFqCitkNWsyCis0ZDVsYQorM2RsZS4KKzNkbGVkCiszZGxlcy4KK2RsZXMyCis0ZDNsMmUyc3MKKzJkM2xvCis0ZDVsdQorMmQxbHkKK2QxbQorNGQxbjQKKzFkbworM2RvLgorZG81ZGUKKzVkb2UKKzJkNW9mCitkNG9nCitkbzRsYQorZG9sMmk0CitkbzVsbzRyCitkb201aXoKK2RvM24yYXQKK2RvMm4KK2RvMW4xYQorZG9uaTQKK2RvbzNkCitkb28yCitkbzRwNHAKK2Q0b3IKKzNkb3MKKzRkNW91dAorZG91MgorZG80dgorM2RveAorZDFwCisxZHIKK2RyYWc1bzJuMgorZHJhMmdvCis0ZHIyYWkyCitkcmU0CitkcmUyYTVyCis1ZHJlbgorZHI0aTRiCitkcmlsNAorZHJvNHAKKzRkcm93Cis1ZHJ1cGxpCitkcnUzcDJsMgorNGRyeQorMmQxczIKK2RzNHAKK2Q0c3cyCitkNHM0eQorZDJ0aAorMWR1CitkMXUxYQorZHUyYworZDF1M2NhCitkdWM1ZXIKKzRkdWN0LgorZHUyYzF0Cis0ZHVjNHQxczIKK2R1NWVsCitkdTRnCitkM3VsNGUKK2R1bTRiZQorZHU0bTFiCitkdTRuCis0ZHVwCitkdTRwZQorZDF2CitkMXcKK2QyeQorNWR5bgorZHk0czJlCitkeXM1cAorZTFhNGIKK2UzYTJjMXQKK2VhMmQxCitlYWQ1aWU0CitlMmFkaQorZWE0Z2UKK2VhNWdlcgorZWE0bAorZWFsNWVyCitlMmFsZQorZWFsM291MgorZWFtM2VyCitlNWFuZAorZWEybgorZWFyM2EKK2UyYTJyCitlYXI0YworZWFyNWVzCitlYXI0aWMKK2VhcjFpCitlYXI0aWwKK2VhcjVrCitlYXIydAorZWFydDNlCitlYTVzcAorZTNhMnNzCitlYXN0MworZWEydAorZWF0NWVuCitlYXRoM2kKK2U0YXRoCitlNWF0M2lmMgorZTRhM3R1CitlYTJ2CitlYXYzZW4KK2VhdjVpCitlYXY1bworMmUxYgorZTRiZWwuCitlMWJlbAorZTRiZTJsMXMyCitlNGJlbgorZTRiaTJ0CitlM2JyCitlNGNhMmQKK2UxY2EKK2VjYW41YworZWNhMm4KK2VjMWNhNQorZWMzYworZTFjZQorZWM1ZXMxc2EyCitlYzJlMnNzCitlMWMyaQorZTRjaWIKK2VjNWlmaWNhdAorZWNpMWZpCitlY2lmaTFjYQorZWM1aTNmMmllNAorZWM1aTFmeQorZTJjM2ltCitlMmMxaTR0CitlNWMyaXRlCitlNGNsYW0KK2UxYzRsNAorZTRjbDJ1cworZTJjb2wKK2UxY28KK2U0Y29tMW0KK2U0Y29tcGUKK2VjbzRtMXAKK2U0Y29uMWMKK2VjbzJuCitlMmNvcgorZWMzbzFyYQorZWNvNXJvCitlMWNyCitlNGNyZW0KK2VjNHRhMm4KK2UyYzF0CitlYzF0YQorZWM0dGUKK2UxY3UKK2U0Y3VsCitlYzN1MWxhCisyZTJkMmEKKzRlZDNkNAorZTRkMWVyCitlZGU0czIKKzRlZGkKK2UzZDRpM2EKK2VkM2liCitlZDNpMWNhCitlZDNpbQorZWQxaXQKK2VkaTV6Cis0ZTFkbworZTRkb2wKK2VkbzJuMgorZTRkcmkKK2UxZHIKK2U0ZHVsCitlMWR1CitlZDV1MWw0bworZWUyYworZTRlZDNpCitlZTJmCitlZWwzaQorZWU0bHkKK2VlMm0KK2VlNG5hCitlZTRwMQorZWUyczQKK2Vlc3Q0CitlZTR0eQorZTVleAorZTFmCitlNGYzZXJlCitlZmVyMQorMWU0ZjFmCitlNGZpYworZTFmaQorNWVmMmkxYzRpCitlZmlsNAorZTNmMmkybmUKK2UyZmluCitlZjVpNW4yaXRlCitlZjJpbmkKK2VmaW4yaXQKKzNlZml0CitlZm9yNWVzCitlMWZvCitlZm8ycgorZTRmdTRzZS4KK2UzZnUKK2VmMnVzCis0ZWdhbAorZTFnYQorZWdlcjQKK2VnNWliCitlZzRpYworZWc1aW5nCitlNWdpdDUKK2VnNW4KK2U0Z28uCitlMWdvCitlNGdvcworZWcxdWwKK2U1Z3VyCis1ZTFneQorZTFoNAorZWhlcjQKK2VpMgorZTVpYworZTJpNWQKK2UyaWcyCitlaTVnNGwyCitlM2k0bTFiCitlM2luM2YKK2UxaW5nCitlNWluc3QKK2UyaTJuMXMyCitlaXI0ZAorZTRpcgorZTJpdDNlCitlMmkzdGgKK2U1aTF0eQorZTFqCitlNGp1ZAorZWo1dWRpCitla2k0bgorZWsxaQorZWs0bGEKK2VrMWwKK2UxbGEKK2U0bGEuCitlNGxhYworZTNsNGFuNGQKK2VsYTJuCitlNGw1YTF0Mml2CitlNGxhdworZWxheDFhNAorZTNsZTJhCitlbDVlYnJhCitlbDJlMWIKK2VsZTNicgorNWVsZWMKK2U0bGVkCitlbDNlMWdhCitlNWxlbgorZTRsMWVyCitlMWxlczIKK2UybDJmCitlbDJpCitlM2xpYmU0CitlNGw1aWMuCitlbDNpMWNhCitlM2xpZXIKK2VsMmllNAorZWw1aTNnaWIKK2VsMmlnCitlbDRpZ2kKK2U1bGltCitlNGwzaW5nCitlM2wyaW8KK2UybGlzCitlbDVpczJoCitlM2wyaXYzCis0ZWxsYQorZWwxbAorZWw0bGFiCitlbGw0bzQKK2U1bG9jCitlbDVvZworZWwzb3AuCitlbDJzMmgKK2UybDFzMgorZWw0dGEKK2U0bHQKK2U1bHVkCitlbDV1ZworZTRtYWMKK2UxbWEKK2U0bWFnCitlNW1hMm4KK2VtNWExbmEKK2U0bTViCitlMW1lCitlMm1lbAorZTRtZXQKK2VtM2kxY2EKK2VtMmk0ZTQKK2VtNWlncmEKK2VtMmlnNAorZW1pMWdyCitlbTFpbjIKK2VtNWluZQorZW0zaTNuaQorZTRtMmlzCitlbTVpczJoCitlNW00aTJzMXMKK2VtM2l6Cis1ZW1uaXoKK2U0bTFuCitlbW80ZworZTFtbworZW1vM24yaTVvCitlbW8ybgorZW0zcGkKK2U0bTFwCitlNG11bAorZTFtdQorZW01dTFsYQorZW11M24yCitlM215CitlbjVhMm1vCitlMW5hCitlNG5hbjF0CitlbjJhMm4KK2VuY2g0ZXIKK2VuMmNoCitlbmNoZTIKK2VuM2RpYworZTVuZWEKK2U1bmVlCitlbjNlbQorZW41ZXJvCitlbjFlcgorZW41ZTFzaQorZTFuZXMKK2UybjVlc3QKK2VuM2V0cgorZTNuZTR3CitlbjVpNGMzczIKK2U1bjJpZTQKK2U1bmlsCitlM24yaTRvCitlbjNpczJoCitlbjNpdAorZTVuaTF1Cis1ZW5pegorNGU0bjFuMgorNGVubworZTRubzRnCitlNG5vcworZW4zb3YKK2VuNHN3MgorZTJuMXMyCitlbnQ1YWdlCitlbjF0CitlbjF0YQorNGVudGgxZXMKK2VudGgyZQorZW4zdTFhCitlbjV1ZgorZTNueS4KKzRlNG4zegorZTVvZgorZW8yZworZTRvaTQKK2Uzb2wKK2VvcDNhMnIKK2VvMnBhCitlMW9yCitlbzNyZQorZW81cm9sCitlb3M0CitlNG90CitlbzR0bworZTVvdXQKK2VvdTIKK2U1b3cKK2UycGEKK2UzcDRhaTIKK2VwNWFuYworZXBhMm4KK2U1cGVsCitlM3BlbjF0CitlcDVlNXQyaTF0MmlvCitlcGUydAorZXBldGkxdGkKK2VwaGU0CitlNHBsaQorZTFwMmwyCitlMXBvCitlNHByZWMKK2VwcjIKK2VwNXJlMWNhCitlNHAycjJlZAorZXAzcmUxaDQKK2UzcHJvCitlNHByb2IKK2VwNHM0aAorZTJwMXMyCitlcDV0aTViCitlMnAxdAorZTRwdTJ0CitlcDV1MXRhCitlMXEKK2VxdWkzbAorZXF1MgorZXEydWkyCitlNHEzdWkzcworZXIxYQorZTJyYTRiCis0ZXI0YW5kCitlcmEybgorZXIzYTJyCis0ZXI0YXRpLgorMmVyMWIKK2VyNGIybDIKK2VyM2NoCitlcjFjCitlcjRjaGUyCisyZTJyZS4KK2UzcmUxYTRsCitlcmU1Y28KK2VyZTNpbgorZXJlaTIKK2VyNWVsLgorZXIzZTFtbworZXI1ZTFuYQorZXI1ZW5jZQorNGVyZW5lCitlcjNlbjF0CitlcmU0cQorZXI1ZTJzcworZXIzZXMydAorZXJldDQKK2VyMWg0CitlcjFpCitlMXIyaTNhNAorNWVyaWNrMQorZTNyaWVuCitlcjJpZTQKK2VyaTRlcgorZXIzaW40ZQorZTFyMmkxbworNGVyaXQKK2VyNGkxdQorZXIyaTR2CitlNHJpMXZhCitlcjNtNAorZXI0bmlzNAorNGVyM24yaXQKKzVlcm5pegorZXIzbm80CisyZXJvCitlcjVvYgorZTVyMm9jCitlcm80cgorZXIxb3UyCitlNHIxczIKK2VyM3NldAorZXIyc2UKK2VydDNlcgorNGVyMnRsCitlcjN0dzQKKzRlcnUKK2VydTR0Cis1ZXJ3YXUKK2VyMXcKK2UxczRhMgorZTRzYTJnZS4KK2U0c2FnZXMKK2VzMmMKK2UyczFjYQorZXM1Y2EybgorZTNzY3IKK2VzNWN1CitlMXMyZQorZTJzZWMKK2VzNWUxY3IKK2U0czVlbmMKK2U0c2VydC4KK2U0c2VyNHQxczIKK2U0c2VyMXZhCis0ZXMyaAorZTNzaGEKK2VzaDVlMm4KK2Uxc2kKK2Uyc2ljCitlMnMyaWQKK2VzNWkxZGVuCitlNHM1aWcxbjRhCitlczJpZworZTJzNWltCitlMnM0aTRuCitlc2lzNHRlCitlMXNpcworZTVzaTR1CitlNXNraW4KK2VzazIKK2VzazFpCitlczRtaQorZTJzMW0KK2Uyc29sCitlMXNvCitlczNvbHUKK2Uyc28ybgorZXM1bzFuMWE0CitlMXNwCitlMnMzcGVyCitlczVwaTFyYQorZXNwNGlyCitlczRwcmUKK2VzcHIyCisyZTJzcworZXM0c2k0YgorZXMxc2kKK2VzdGEybjQKK2VzMXRhCitlczN0MmlnCitlc3QyaQorZXM1dGltCis0ZXMydG8KK2Uzc3RvMm4KKzJlc3Q0cgorZTVzdHJvCitlc3RydWM1CitlMnN1MnIKK2Uxc3UKK2VzNXVyMXI0CitlczR3MgorZTJ0YTRiCitlMXRhCitlM3RlbjRkCitlM3RlbworZXRob2QzCitldDFpYworZTV0aWRlCitldDJpZAorZTJ0MWluNAorZXQyaTRubworZTV0NGlyCitlNXQyaTF0MmlvCitldGkxdGkKK2V0NWkxdDJpdgorNGUydDFuMgorZXQ1bzFuMWEKK2UxdG8KK2V0bzJuCitlM3RyYQorZTN0cmUKK2V0M3JpYworZXQ1cmlmCitldDNyb2cKK2V0NXJvcworZXQzdTFhCitlMXR1CitldDV5bQorZTF0eQorZTR0NXoKKzRldQorZTV1bgorZTN1cAorZXUzcm8KK2UydXM0CitldXRlNAorZXV0aTVsCitlNHUxdDJpCitldTV0cgorZXZhMnA1CitlMXZhCitlMnZhcworZXY1YXN0CitlNXZlYQorZXYzZWwxbAorZXZlNGwzbworZTV2ZW5nCitldmVuNGkKK2V2MWVyCitlNXYyZXIxYgorZTF2aQorZXYzaWQKK2Uydmk0bAorZTR2MWluCitlM3YyaTR2CitlNXZvYworZTV2dQorZTF3YQorZTR3YWcKK2U1d2VlCitlM3doCitld2lsNQorZXdpMgorZXczaW40ZworZTN3aXQKKzFleDNwCis1ZXkxYworNWV5ZS4KK2V5czQKKzFmYQorZmEzYjJsMgorZjRhYjNyCitmYTRjZQorNGZhZworZmE0aTRuNAorZmFpMgorZmFsMmw1ZQorZmFsMWwKKzRmNGE0bWEKK2ZhbTVpcworNWYyYTJyCitmYXI1dGgKK2ZhM3RhCitmYTN0aDJlCitmNGF0aAorNGZhMXRvCitmYXU0bHQ1CitmYXU0bDIKKzRmNWIKKzRmZAorNGZlLgorZmVhczQKK2ZlNGF0aDMKK2ZlYTJ0CitmMmU0YgorNGZlMWNhCis1ZmUyYzF0CisyZmVkCitmZTNsMmkKK2ZlNG1vCitmZW4yZAorZmVuMWQ1ZQorZmVyMQorNWZlcjFyNAorZmV2NAorNGYxZgorZjRmZXMKK2Y0ZjJpZTQKK2YxZmkKK2Y1ZjJpbi4KK2YyZmluCitmMmY1aXMKK2Y0ZjJseTUKK2ZmNGwyCitmMmZ5Cis0ZmgKKzFmaQorZjJpM2EKKzJmM2ljLgorNGYzaWNhbAorZmkxY2EKK2YzaWNhMm4KKzRmaWNhdGUKK2YzaTFjZW4KK2ZpM2NlcgorZjJpMWM0aQorNWZpM2MyaTFhCis1ZmljMmllNAorNGZpNGMzczIKK2ZpM2N1CitmaTVkZWwKK2YyaWQKK2ZpZ2h0NQorZjJpZworZmlsNWkKK2ZpbDJsNWluNAorZmlsMWwKK2ZpbGwyaQorNGZpMWx5CisyZmluCis1ZmkxbmEKK2Y0aW4yZDUKK2YyaTJuZQorZjFpbjNnCitmMmk0bjRuMgorZmlzNHQyaQorZjRsMgorZjVsMmUyc3MKK2ZsZXMyCitmbGluNAorZmxvM3JlCitmMmx5NQorNGZtCis0Zm4KKzFmbworNWZvMm4KK2ZvbjRkZQorZjJvbmQKK2ZvbjR0CitmbzJyCitmbzVyYXQKK2ZvMXJhCitmb3I1YXkKK2ZvcmU1dAorZm9yNGkKK2ZvcjF0NWEKK2ZvczUKKzRmNXAKK2ZyYTR0CitmNXJlYQorZnJlczVjCitmcmkyCitmcmlsNAorZnJvbDUKKzJmM3MKKzJmdAorZjR0bworZjJ0eQorM2Z1CitmdTVlbAorNGZ1ZworZnU0bWluCitmdTFtaQorZnU1bmUKK2Z1M3JpCitmdXNpNAorZjJ1cworZnUyczRzCis0ZnUxdGEKKzFmeQorMWdhCitnYTJmNAorNWdhbC4KKzNnYWwxaQorZ2EzbG8KKzJnYW0KK2dhNW1ldAorZzVhMm1vCitnYW41aXMKK2dhMm4KK2dhM25pegorZ2FuaTV6YTEKKzRnYW5vNAorZ2FyNW40CitnMmEycgorZ2Eyc3M0CitnNGF0aDMKKzRnYTF0Mml2Cis0Z2F6CitnM2IKK2dkNAorMmdlLgorMmdlZAorZ2VlejQKK2dlbDRpbgorZ2VsMmkKK2dlNWxpcworZ2U1bDFpegorNGdlMWx5CisxZ2VuCitnZTRuMmF0CitnZTFuYQorZzVlNW5pegorNGc0ZW5vCis0Z2VueQorMWdlbworZ2Uzb20KK2c0ZXJ5Cis1Z2Uxc2kKK2dldGg1Cis0Z2UxdG8KK2dlNHR5CitnZTR2Cis0ZzFnMgorZzJnZQorZzNnZXIKK2dnbHU1CitnZ2wyCitnMWdvNAorZ2gzaW4KK2doNW91dAorZ2hvdTIKK2doNHRvCis1Z2kuCisxZzJpNGEKK2dpMmE1cgorZzFpYworNWdpM2MyaTFhCitnMmkxY2kKK2c0aTFjbworZ2llbjUKK2cyaWU0Cis1Z2llcy4KK2dpbDQKK2czaTFtZW4KKzNnNGluLgorZzRpbjVnZQorNWc0aTJuMXMyCis1ZzJpbworM2c0aXIKK2dpcjRsCitnM2lzMWwyCitnaTR1Cis1ZzJpdgorM2dpegorZ2wyCitnbGE0CitnbDJhZDVpCitnbGEyZAorNWdsYXMKKzFnbGUKK2dsaTRiCitnM2wyaWcKKzNnbG8KK2dsbzNyCitnMW0KK2c0bXkKK2cxbjRhCitnNG5hLgorZ25lNHQ0dDIKK2cxbmkKK2cybjFpbgorZzRuMmk0bworZzFubworZzRubzRuCisxZ28KKzNnby4KK2dvYjUKKzVnb2UKKzNnNG80ZworZ28zaXMKK2dvaTIKK2dvMm4yCis0ZzNvM24xYQorZ29uNWRvNQorZzJvbmQKK2dvM25pCis1Z29vMgorZ281cml6Citnb3I1b3UyCis1Z29zLgorZ292MQorZzNwCisxZ3IKKzRncmExZDJhCitncmEyZAorZzRyMmFpMgorZ3JhMm4yCis1Z3JhNHBoLgorZzVyYTNwaDRlcgorNWdyYXBoMWljCitncjRhcGhpCis0ZzNyYTFwaHkKKzRncmF5CitncmU0bgorNGdyZXNzLgorZ3IyZTJzcworNGdyaXQKK2c0cm8KK2dydWY0CitnczIKK2c1c3RlCitndGgzCitndTRhCiszZ3VhcjJkCitndTJhMnIKKzJndWUKKzVndWk1dAorZzJ1aTIKKzNndW4KKzNnMnVzCis0Z3U0dAorZzN3CisxZ3kKKzJnNXkzbgorZ3k1cmEKK2gzYWI0bDIKK2hhMmNoNAoraGFlNG0KK2hhZTR0CitoNWFndQoraGEzbGEKK2hhbGEzbQoraGE0bQoraGFuNGNpCitoYTJuCitoYW40Y3kKKzVoYW5kLgoraDRhbmQKK2gyYW40ZworaGFuZzVlcgoraGFuMWc1bworaDVhNW5pegoraGE0bjRrMgoraGFuNHRlCitoYW4xdAoraGEycDNsMgoraGEycDV0CitoYTNyYTJuCitoMmEycgoraGE1cjJhcworaGFyMmQKK2hhcmQzZQoraGFyNGxlNAoraGFyMWwKK2hhcnA1ZW4KK2hhcjJwCitoYXI1dGVyCitoYTJzNXMKK2hhdW40Cis1aGF6CitoYXozYTEKK2gxYgorMWhlYTJkMQorM2hlMmEycgoraGU0Y2EybgoraGUxY2EKK2g1ZWNhdAoraDRlZAoraDRlNWRvNQoraGUzbDRpCitoZWw0bGlzCitoZWwxbAoraGVsbDJpCitoZWw0bHkKK2g1ZWxvCitoZTRtNHAKK2hlMm4KK2hlMW5hNAoraGVuNWF0CitoZTFvNXIKK2hlcDUKK2g0ZXIxYQoraGVyYTNwCitoZXI0YmEKK2gyZXIxYgoraGVyZTVhCitoM2VybgoraDVlcjFvdTIKK2gyZXJvCitoM2VyeQoraDFlcworaGUyczVwCitoZTR0CitoZTJ0NGVkCitoNGV1NAoraDFmCitoMWgKK2hpNWEybgoraDJpMWEKK2hpNGNvCitoaWdoNQoraDJpZworaDRpbDIKK2hpbWVyNAoraDRpMW5hCitoaW9uNGUKK2gyaW8KK2hpbzJuCitoMmk0cAoraGlyNGwKK2g0aXIKK2hpM3JvCitoaXI0cAoraGlyNHI0CitoaXMzZWwKK2g0aXNlCitoNGkyczRzCitoaXRoNWVyCitoMml0aAoraGl0aDJlCitoMmkydgorNGhrCis0aDFsNAoraGxhMm40CitoMmxvCitobG8zcmkKKzRoMW0KK2htZXQ0CisyaDFuCitoNW9kaXoKK2g1bzJkMXMyCitobzRnCitobzFnZTQKK2hvbDVhMnIKK2hvMWxhCiszaG9sNGUKK2hvNG1hCitobzJtZTMKK2hvMW40YQoraG8ybgoraG81bnkKKzNob29kCitob28yCitob28ybjQKK2hvcjVhdAoraG8xcmEKK2hvNXIyaXMKK2hvcnQzZQoraG81cnUKK2hvczRlCitobzVzZW4KK2hvczFwCisxaG8ydXMKK2hvdTIKK2hvdXNlMworaG92NWVsCis0aDVwCis0aHI0CitocmVlNQoraHJvNW5pegoraHJvMm4KK2hybzNwbworNGgxczIKK2g0czJoCitoNHQyYTJyCitoMXRhCitodDFlbgoraHQ1ZXMKK2g0dHkKK2h1NGcKK2h1NG1pbgoraHUxbWkKK2h1bjVrZQoraHU0bmsyCitodW40dAoraHVzM3Q0CitoMnVzCitodTR0CitoMXcKK2g0d2FyNHQKK2h3MmEycgoraHkzcGUKK2h5M3BoCitoeTJzCisyaTFhCitpMmFsCitpYW00CitpYW01ZTF0ZQoraTJhMm4KKzRpYW5jCitpYW4zaQorNGlhbjR0CitpYTVwZQoraWEyc3M0CitpNGExdDJpdgoraWE0dHJpYworaWExdHIKK2k0YTJ0dQoraWJlNAoraWIzZXIxYQoraWI1ZXJ0CitpYjVpMWEKK2liM2luCitpYjVpdC4KK2liaTJ0CitpYjVpdGUKK2kxYjJsMgoraWIzbGkKK2k1Ym8KK2kxYnIKK2kyYjVyaQoraTVidTRuCis0aWNhbQoraTFjYQorNWljYXAKKzRpYzJhMnIKK2k0Y2FyLgoraTRjYXJhCitpY2FzNQoraTRjYXkKK2ljY3U0CitpYzNjCis0aWNlbworNGkyY2gKKzJpMWNpCitpNWMyaWQKK2ljNWkxbmEKK2kyY2luCitpMmMyaXAKK2ljM2kxcGEKK2k0YzFseTQKK2kxYzRsNAoraTJjNW9jCitpMWNvCis0aTFjcgorNWljcmEKK2k0Y3J5CitpYzR0ZQoraTJjMXQKK2ljMXR1MgoraWM0dDN1MWEKK2ljM3UxbGEKK2ljNHVtCitpYzV1bworaTNjdXIKKzJpZAoraTRkYWkyCitpMWQyYQoraWQ1YW5jCitpZGEybgoraWQ1ZDQKK2lkZTNhNGwKK2lkZTRzMgoraTJkaQoraWQ1aTJhMm4KK2kxZDRpM2EKK2lkaTRhMnIKK2k1ZDJpZTQKK2kxZDNpbworaWRpNW91MgoraWQxaXQKK2lkNWkxdQoraTNkbGUKK2k0ZG9tCitpMWRvCitpZDNvdworaTRkcgoraTJkdQoraWQ1dW8KKzJpZTQKK2llZDRlCis1aWU1Z2EKK2llMmxkMworaWUxbjVhNAoraWVuNGUKK2k1ZTRuMW4yCitpM2VudDJpCitpZW4xdAoraTFlci4KK2kzZXMyYworaTFlc3QKK2kzZXQKKzRpZi4KK2lmNWVybworaWZlcjEKK2lmZjVlbgoraTRmMWYKK2lmNGZyCis0aTJmM2ljLgoraTFmaQoraTNmMmllNAoraTNmNGwyCis0aTJmdAorMmlnCitpZ2E1YgoraTFnYQoraWczZXIxYQoraWdodDNpCis0aWdpCitpM2dpYgoraWczaWw0CitpZzNpbgoraWczaXQKK2k0ZzRsMgoraTJnbworaWczb3IKK2lnNW90CitpNWdyZQoraTFncgoraWcydTVpMgoraWcxdXIKK2kzaAorNGk1aTQKK2kzagorNGlrCitpMWxhCitpbDNhNGIKK2k0bDRhZGUKK2lsYTJkCitpMmw1YW0KK2lsYTVyYQoraWwyYTJyCitpM2xlZworaWwxZXIKK2lsZXY0CitpMmw1ZgoraWwxaQoraWwzaTFhCitpbDJpYgoraWwzaW8KK2lsNGlzdAorMmlsMWl0CitpbDJpegoraWxsNWFiCitpbDFsCis0aTJsMW4yCitpbDNvMXEKK2lsNHR5CitpNGx0CitpbDV1cgoraWwzdgoraTRtYWcKK2kxbWEKK2ltM2FnZQoraW1hNXJ5CitpbTJhMnIKK2ltZW50MmE1cgoraTFtZW4KK2kzbWVuMXQKK2ltZW4xdGEKKzRpbWV0CitpbTFpCitpbTVpMWQ0YQoraW0yaWQKK2ltaTVsZQoraTVtMmluaQorNGltaXQKK2ltNG5pCitpNG0xbgoraTNtbzJuCitpMW1vCitpMm11CitpbTN1MWxhCisyaW4uCitpNG4zYXUKK2kxbmEKKzRpbmF2CitpbmNlbDQKK2luM2NlcgorNGluZAoraW41ZGxpbmcKKzJpbmUKK2kzbmVlCitpbjRlcjRhMnIKK2luMWVyCitpbmVyMWEKK2k1bjJlMnNzCitpMW5lcworNGluMWdhCis0aW5nZQoraW41Z2VuCis0aW5naQoraW41Z2xpbmcKK2luZ2wyCis0aW4xZ28KKzRpbjFndQorMmluaQoraTVuaS4KK2k0bjRpMWEKK2luM2k0bworaW4xaXMKK2k1bmk0dGUuCitpbjJpdAoraW4yaXRlCis1aTNuMmkxdDJpbworaW5pMXRpCitpbjNpMXR5Cis0aTRuazIKKzRpNG4xbAorMmk0bjFuMgorMmkxbm8KK2k0bm80YworaW5vNHMKK2k0bm90CisyaTJuMXMyCitpbjNzZQoraW5zdTFyNWEKK2luMXN1CitpbnN1MnIKKzJpbnQuCitpbjF0CisyaW40dGgKK2luMXUKK2k1bjJ1cworNGlueQorMmlvCis0aW8uCitpbzFnZTQKK2lvMmdyCitpMW9sCitpbzRtCitpb24zYXQKK2lvMm4KK2lvMW4xYQoraW9uNGVyeQoraW9uMWVyCitpb24zaQoraTJvNXBoCitpb3IzaQoraTRvcworaTRvNXRoCitpNW90aQoraW80dG8KK2k0b3VyCitpb3UyCisyaXAKK2lwZTQKK2lwaHIyYXM0CitpcDRocjQKK2lwM2kKK2lwNGljCitpcDRyZTQKK2lwcjIKK2lwM3VsCitpM3F1YQoraXF1MgoraXE1dWUxZgoraXEzdTJpZAoraXEydWkyCitpcTN1aTN0Cis0aXIKK2kxcmEKK2kycmE0YgoraTRyYWMKK2lyZDVlCitpcmU0ZGUKK2kycjJlZAoraTRyZTFmCitpNHJlbDQKK2k0cmVzCitpcjVnaQoraXJnMgoraXIxaQoraXJpNWRlCitpcjJpZAoraXI0aXMKK2lyaTN0dQorNWk1cjJpegoraXI0bWluCitpcjFtCitpcm80ZworNWlyb24uCitpcm8ybgoraXI1dWwKKzJpcy4KK2lzNWFnCitpc2EyCitpczNhMnIKK2lzYXM1CisyaXMxYworaXMzY2gyCis0aXNlCitpczNlcgorM2k0czNmCitpczVoYTJuCitpczJoCitpczNobzJuMworaXNobzQKK2lzaDVvcAoraXMzaTFiCitpczJpNGQKK2k1c2lzCitpczVpMXQyaXYKK2lzaTF0aQorNGlzNGsyCitpc2xhMm40CitpczFsMgorNGlzNG0xczIKK2kyczFtCitpMnNvCitpc281bWVyCitpM3NvbQoraXNvMm1lCitpczFwCitpczJwaQoraXM0cHkKKzRpMnMxcworaXM0c2FsCitpczFzYTIKK2lzc2VuNAoraXM0czFlNHMKK2lzNHRhLgoraXMxdGEKK2lzMXRlCitpczF0MmkKK2lzdDRseQoraXMydGwKKzRpc3RyYWwKK2lzdDRyCitpczF0cmEKK2kyc3UKK2lzNXVzCis0aTN0YS4KK2kxdGEKK2l0YTRiaQoraTJ0YWIKK2k0dGFnCis0aXRhNW0KK2kzdGEybgoraTN0YXQKKzJpdGUKK2l0M2VyMWEKK2k1dGVyMWkKK2l0NGVzCisyaXRoCitpMXRpCis0aTF0MmkxYQorNGkydGljCitpdDNpMWNhCis1aTV0aWNrMQoraTJ0M2lnCitpdDVpbDFsCitpMnRpbQorMmkxdDJpbworNGl0aXMKK2k0dGkyczRtCitpMnQ1bzVtCitpMXRvCis0aXRvMm4KK2k0dHJhbQoraTF0cmEKK2l0NXJ5Cis0aTR0M3QyCitpdDN1MWF0CitpMXR1CitpdHUxYQoraTV0dWQyCitpdDN1bAorNGl0ei4KK2k0dHoKK2kxdQorMml2CitpdjNlbDFsCitpdjNlbi4KK2k0djNlci4KK2k0dmVycy4KK2l2ZTRyMXMyCitpdjVpbC4KK2kydmlsCitpdjVpbworaXYxaXQKK2k1dm9yZQoraXYzbzNybworaTR2M290Cis0aTV3CitpeDRvCis0aXkKKzRpejJhMnIyCitpemExCitpMnoxaTQKKzVpem9uMXQKK2kxem8KK2l6bzJuCis1amEKK2phYzRxCitqYTRwCisxamUKK2plNHI1czIKKzRqZXM0dDJpZTQKK2plc3QyaQorNGplczJ0eQoramV3Mworam80cAorNWp1ZGcKKzNrYS4KK2szYWIKK2s1YWcKK2thaXM0CitrYWkyCitrYWw0CitrMWIKK2syZWQKKzFrZWUKK2tlNGcKK2tlNWwyaQorazNlbjRkCitrMWVyCitrZXM0CitrM2Uyc3QuCitrZTR0eQorazNmCitraDQKK2sxaQorNWtpLgorNWsyaWMKK2s0aWwxbAora2lsbzUKK2s0aW0KK2s0aW4uCitraW40ZGUKK2s0aW5kCitrNWk1bjJlMnNzCitrMmluZQora2kxbmVzCitraW40ZworazJpNHAKK2tpczQKK2s1aXMyaAora2s0CitrMWwKKzRrM2xleQorNGsxbHkKK2sxbQorazVuZXMKKzFrMm5vCitrbzVyCitrb3MyaDQKK2szb3UyCitrcm81bgorNGsxczIKK2s0c2MKK2tzNGwyCitrNHM0eQorazV0CitrMXcKK2xhYjNpYworbDRhYm8KK2w0YTJjaTQKK2w0YWRlCitsYTJkCitsYTNkMnkKK2xhZzRuCitsYTJtM28KKzNsNGFuZAorbGEybgorbGFuNGRsCitsYW41ZXQKK2xhbjR0ZQorbGFuMXQKK2xhcjRnMgorbDJhMnIKK2xhcjNpCitsYXM0ZQorbGE1dGEybgorbGEydGEKKzRsYXRlbDJpNAorNGxhMXQyaXYKKzRsYXYKK2xhNHY0YQorMmwxYgorbGJpbjQKKzRsMWMyCitsY2U0CitsM2NpCisybGQKK2wyZGUKK2xkNGVyZQorbGQ0ZXIxaQorbGRpNAorbGQ1aXMxCitsM2RyCitsNGRyaQorbGUyYQorbGU0YmkKK2wyZTFiCitsZTJmdDUKK2xlMWYKKzVsZWcuCis1bGU0ZzFnMgorbGU0bWF0CitsZTFtYQorbGVtNWF0MWljCis0bGVuLgorM2xlbmMKKzVsZTJuZS4KKzFsZW4xdAorbGUzcGgKK2xlNHByMgorbGUycmE1YgorbGVyMWEKK2xlcjRlCiszbGVyZzIKKzNsNGVyMWkKK2w0ZXJvCitsZXMyCitsZTVzMWNvCitsZXMyYworNWxlc3EKKzNsMmUyc3MKKzVsZXNzLgorbDNlMXZhCitsZXY0ZXIuCitsZXYxZXIKK2xldjRlcjFhCitsZXY0ZTRyMXMyCiszbGV5Cis0bGV5ZQorMmxmCitsNWZyCis0bDFnNAorbDVnYQorbGcyYTJyMworbDRnZXMKK2wxZ28zCisybDNoCitsaTRhZworbDJpMWEKK2xpMmFtNAorbGlhcjVpegorbGkyYTJyCitsaWFyMWkKK2xpNGFzCitsaTRhMXRvCitsaTViaQorNWxpYzJpbworbDJpMWNpCitsaTRjb3IKK2xpMWNvCis0bGk0YzNzMgorNGxpY3QuCitsaTJjMXQKK2w0aWN1CitsM2kxY3kKK2wzaTFkMmEKK2wyaWQKK2xpZDVlcgorM2xpMmRpCitsaWYzZXIxCitsNGk0ZjFmCitsaTRmNGwyCis1bGlnYXRlCitsMmlnCitsaTFnYQorM2xpZ2gKK2xpNGdyYQorbGkxZ3IKKzNsNGlrCis0bDRpNGwKK2xpbTRiMmwyCitsaTRtMWIKK2xpbTNpCitsaTRtbworbDRpNG00cAorbDRpMW5hCisxbDRpbmUKK2xpbjNlYQorbDJpbjNpCitsaW5rNWVyCitsNGk0bmsyCitsaTVvZworbDJpbworNGw0aXEKK2xpczRwCitsMWl0CitsMml0LgorNWxpdDNpMWNhCitsaTF0aQorbDRpMnRpYworbDVpNXRpNGMzczIKK2xpdjNlcgorbDJpdgorbDFpegorNGxqCitsa2EzCitsM2thbDQKK2xrYTR0CitsMWwKK2w0bGF3CitsMmxlCitsNWxlMmEKK2wzbGVjCitsM2xlZworbDNsZWwKK2wzbGU0bgorbDNsZTR0CitsbDJpCitsMmxpbjQKK2w1bDRpMW5hCitsbDRvCitsbG9xMnVpNQorbGxvMXEKK2xsb3F1MgorbDJsNW91dAorbGxvdTIKK2w1bG93CisybG0KK2w1bWV0CitsbTNpbmcKK2w0bW8yZDEKK2wxbW8KK2xtbzJuNAorMmwxbjIKKzNsby4KK2xvYjVhbAorbG80Y2kKKzRsb2YKKzNsb2cxaWMKK2w1bzFnbworM2xvZ3UKK2xvbTNlcgorbG8ybWUKKzVsb25nCitsbzJuCitsb240aQorbDNvM25pegorbG9vZDUKK2xvbzIKKzVsbzRwZS4KK2xvcDNpCitsM280cDFtCitsbzFyYTQKK2xvNHJhMXRvCitsbzVyMmllNAorbG9yNW91MgorNWxvcy4KK2xvczVldAorNWxvczVvM3BoaXoKK2xvMnNvCitsb3M0b3AKK2xvczJvcGgKKzVsb3M1bzFwaHkKK2xvczR0CitsbzR0YQorbG91bjVkCitsb3UyCisybG91dAorNGxvdgorMmxwCitscGE1YgorbDFwYQorbDNwaGEKK2w1cGhpCitscDVpbmcKK2xwaTJuCitsM3BpdAorbDRwMmwyCitsNXByMgorNGwxcgorMmwxczIKK2w0c2MKK2wyc2UKK2w0czJpZTQKKzRsdAorbHQ1YWcKK2wxdGEKK2x0YW5lNQorbHRhMm4KK2wxdGUKK2x0ZW40CitsdGVyMWE0CitsdGgzaQorbDV0aWVzLgorbHQyaWU0CitsdGlzNAorbDF0cgorbDF0dTIKK2x0dTFyM2EKK2x1NWEKK2x1M2JyCitsdTJjaDQKK2x1M2NpCitsdTNlbgorbHVmNAorbHU1aWQKK2wydWkyCitsdTRtYQorNWx1MW1pCitsNXVtbi4KK2x1NG0xbgorNWx1bTNuNGkxYQorbHUzbworbHVvM3IKKzRsdXAKK2x1MnNzNAorbDJ1cworbHVzM3RlCisxbHV0CitsNXZlbgorbDV2ZXQ0CisybDF3CisxbHkKKzRseWEKKzRseTFiCitseTVtZTQKK2x5M25vCisybHlzNAorbDV5M3MyZQorMW1hCisybWFiCittYTJjYQorbWE1Y2gyaW5lCittYTJjaAorbWE0Y2gxaW4KK21hNGM0bDQKK21hZzVpbgorbWFnMWkKKzVtYWcxbgorMm1haAorbWEyaWQ1CittYWkyCis0bWEybGQKK21hM2wyaWcKK21hbDFpCittYTVsaW4KK21hbDRsMmkKK21hbDFsCittYWw0dHkKK21hNGx0Cis1bWEzbjRpMWEKK21hMm4KK21hbjVpcworbWFuM2l6Cis0bWFwCittYTVyaTJuZS4KK20yYTJyCittYXIxaQorbWFyMmluNGUKK21hNXIyaXoKK21hcjRseQorbWFyMWwKK21hcjN2CittYTVzY2UKK21hczRlCittYXMxdAorNW1hdGUKK200YXRoMworbWEzdGlzCis0bWF0aTN6YTEKK21hMXRpegorNG0xYgorbTFiYTR0NQorbTViaWwKK200YjNpbmcKK21iMmk0dgorNG01YworNG1lLgorMm1lZAorNG1lZC4KKzVtZTNkNGkzYQorbTRlZGkKK21lM2QyaWU0CittNWU1ZDJ5CittZTJnCittZWw1bzJuCittZTRsNHQKK21lMm0KK21lMW0xbzMKKzFtZW4KK21lMW40YQorbWVuNWFjCittZW40ZGUKKzRtZW5lCittZW40aQorbWUybjFzNAorbWVuMXN1NQorM21lbjF0CittZW40dGUKK21lNW8ybgorbTVlcjFzYTIKK21lNHIxczIKKzJtZXMKKzNtZXN0MmkKK21lNHRhCittZXQzYTJsCittZTF0ZQorbWU1dGhpCittNGV0cgorNW1ldDNyaWMKK21lNXRyMmllNAorbWUzdHJ5CittZTR2Cis0bTFmCisybWgKKzVtaS4KK20yaTNhCittaTFkNGEKK20yaWQKK21pZDRnCittMmlnNAorM21pbDNpMWEKK21pbDFpCittNWk1bDJpZTQKK200aWwxbAorbWkxbjRhCiszbTRpbmQKK201aTNuZWUKK20yaW5lCittNGluZ2wyCittaW41Z2xpCittNWluZzFseQorbWluNHQKK200aW4xdQorbWlvdDQKK20yaW8KK20yaXMKK21pNHM0ZXIuCittNGlzZQorbWlzM2VyCittaXM1bDIKK21pczR0MmkKK201aTRzdHJ5CittaXN0NHIKKzRtMml0aAorbTJpegorNG1rCis0bTFsCittMW0KK21tYTVyeQorbTFtYQorbW0yYTJyCis0bTFuCittMW40YQorbTRuMWluCittbjRvCisxbW8KKzRtb2NyCis1bW9jNXJhMXRpegorbW8yZDEKK21vNGdvCittb2lzMgorbW9pMgorbW80aTVzZQorNG0yb2sKK21vNWxlc3QKK21vbGVzMgorbW8zbWUKK21vbjVldAorbW8ybgorbW9uNWdlCittbzNuNGkzYQorbW9uNGkyczFtCittb24xaXMKK21vbjRpc3QKK21vM25pegorbW9ub2w0CittbzNueS4KK21vMnIKKzRtbzVyYS4KK21vMXJhCittb3MyCittbzVzZXkKK21vM3NwCittNG90aDMKK201b3VmCittb3UyCiszbW8ydXMKK21vMnYKKzRtMXAKK21wYXJhNQorbTFwYQorbXAyYTJyCittcGE1cmFiCittcDRhNHI1aQorbTNwZTJ0CittcGhhczQKK20ycGkKK21wMmk0YQorbXA1aWVzCittcDJpZTQKK200cDFpMm4KK201cDRpcgorbXA1aXMKK21wbzNyaQorbTFwNG9yCittcG9zNWl0ZQorbTFwb3MKK200cG8ydXMKK21wb3UyCittcG92NQorbXA0dHIKK20ycDF0CittMnB5Cis0bTNyCis0bTFzMgorbTRzMmgKK201c2kKKzRtdAorMW11CittdWwyYTVyNAorbXUxbGEKKzVtdTRsdAorbXVsMXRpMworM211bQorbXVuMgorNG11cAorbXU0dQorNG13CisxbmEKKzJuMWEyYgorbjRhYnUKKzRuYWMuCituYTRjYQorbjVhMmMxdAorbmFnNWVyLgorbmFrNAorbmE0bDFpCituYTVsMmkxYQorNG5hNGx0CituYTVtaXQKK24yYTJuCituYW4xY2k0CituYW40aXQKK25hNG5rNAorbmFyM2MKK24yYTJyCis0bmFyZQorbmFyM2kKK25hcjRsCituNWFyMW0KK240YXMKK25hczRjCituYXM1dDJpCituMmF0CituYTN0YTJsCituYTJ0YQorbmF0NW81bTJpegorbmEydG9tCituYTF0bworbjJhdQorbmF1M3NlCituYTJ1cworM25hdXQKK25hdjRlCis0bjFiNAorbmMyYTJyNQorbjFjYQorbjRjZXMuCituM2NoYQorbjJjaAorbjVjaGVvCituY2hlMgorbjVjaDRpbDIKK24zY2hpcworbjJjMWluCituMWNpCituMmM0aXQKK25jb3UxcjVhCituMWNvCituY291MgorbjFjcgorbjFjdQorbjRkYWkyCituMWQyYQorbjVkYTJuCituMWRlCituZDVlMnN0LgorbmRlczIKK25kaTRiCituNWQyaWYKK24xZGl0CituM2RpegorbjVkdTJjCituMWR1CituZHU0cgorbmQyd2UKK25kMXcKKzJuZS4KK24zZTJhMnIKK24yZTJiCituZWIzdQorbmUyYworNW5lY2sxCisybmVkCituZTRnYXQKK25lMWdhCituZTRnNWExdDJpdgorNW5lZ2UKK25lNGxhCituZWw1aXoKK25lbDJpCituZTVtaQorbmU0bW8KKzFuZW4KKzRuZW5lCiszbmVvCituZTRwbworbmUycQorbjFlcgorbmUycmE1YgorbmVyMWEKK240ZXIzYTJyCituMmVyZQorbjRlcjVpCituZXI0cjQKKzFuZXMKKzJuZXMuCis0bmUxc3AKKzJuZXN0Cis0bmVzNHcyCiszbmV0MWljCituZTR2CituNWV2ZQorbmU0dworbjNmCituNGdhYgorbjFnYQorbjNnZWwKK25nZTRuNGUKK24xZ2VuCituNWdlcmUKK24zZ2VyMWkKK25nNWhhCituM2dpYgorbmcxaW4KK241Z2l0CituNGdsYTQKK25nbDIKK25nb3Y0CituMWdvCituZzVzMmgKK25nczIKK24xZ3UKK240Z3VtCituMmd5Cis0bjFoNAorbmhhNAorbmhhYjMKK25oZTQKKzNuNGkxYQorbmkzYTJuCituaTRhcAorbmkzYmEKK25pNGIybDIKK24yaTRkCituaTVkaQorbmk0ZXIKK24yaWU0CituaTJmaQorbmk1ZmljYXQKK25pZmkxY2EKK241aTFncgorbjJpZworbjRpazQKK24xaW0KK25pM20yaXoKK25pbTFpCituMWluCis1bmkybmUuCituMmluZQorbmluNGcKK24yaTRvCis1bjJpcy4KK25pczR0YQorbjJpdAorbjRpdGgKKzNuMmkxdDJpbworbmkxdGkKK24zaXRvcgorbmkxdG8KK25pM3RyCituMWoKKzRuazIKK241azJlcm8KK25rMWVyCituM2tldAorbmszaW4KK25rMWkKK24xazFsCis0bjFsCituNW0KK25tZTQKK25tZXQ0Cis0bjFuMgorbm5lNAorbm5pM2FsCituM240aTFhCitubjJpNHYKK25vYjRsMgorbm8zYmxlCituNW8xYzRsNAorNG4zbzJkCiszbm9lCis0bm9nCitubzFnZTQKK25vaXM1aQorbm9pMgorbm81bDRpCis1bm9sMW8xZ2lzCiszbm9taWMKK241bzVtMml6CitubzRtbworbm8zbXkKK25vNG4KK25vbjRhZworbm8xbjFhCitub241aQorbjVvbml6Cis0bm9wCis1bm9wNW81bDJpCitubzJyNWFiCitubzFyYQorbm80cmFyeQorbm9yMmEycgorNG5vczJjCitub3M0ZQorbm9zNXQKK25vNXRhCisxbm91MgorM25vdW4KK25vdjNlbDMKK25vd2wzCituMXA0CitucGk0CitucHJlNGMKK25wcjIKK24xcQorbjFyCitucnU0CisybjFzMgorbjJzNWFiCituc2EyCituc2F0aTQKK25zNGMKK24yc2UKK240czNlNHMKK25zMmlkMQorbnMyaWc0CituMnMxbDIKK24yczNtCituNHNvYworbjFzbworbnM0cGUKK241c3BpCituc3RhNWIybDIKK25zMXRhCituczJ0YWIKK24xdAorbjJ0YTRiCituMXRhCitudGU0cjNzMgorbnQyaQorbjV0aTJiCitudGk0ZXIKK250MmllNAorbnRpMmYyCituM3QyaW5lCituMnQxaW4KK240dDNpbmcKK250Mmk0cAorbnRyb2w1bDJpCitudHJvbDFsCituNHQ0czIKK250dTNtZQorbjF0dQorbjN0dW0KK251MWEKK251NGQKK251NWVuCitudWY0ZmUKK251NGYxZgorbjN1aTRuCituMnVpMgorM251M2l0CituNHVtCitudTFtZQorbjV1MW1pCiszbnU0bgorbjN1bworbnUzdHIKK24xdjIKK24xdzQKK255bTQKK255cDQKKzRuegorbjN6YTEKKzRvYQorb2EyZDMKK281YTVsZXMyCitvMmFsZQorb2FyZDMKK28yYTJyCitvYXM0ZQorb2FzdDVlCitvYXQ1aQorb2IzYTNiCitvNWIyYTJyCitvMWJlNGwKK28xYmkKK28yYmluCitvYjVpbmcKK28zYnIKK29iM3VsCitvMWNlCitvMmNoNAorbzNjaGU0dAorb2NoZTIKK29jaWYzCitvMWNpCitvNGNpbAorbzRjbGFtCitvMWM0bDQKK280Y29kCitvMWNvCitvYzNyYWMKK29jNXJhMXRpegorb2NyZTMKKzVvY3JpdAorb2NyaTIKK29jdG8ycjVhCitvMmMxdAorb2MxdG8KK29jM3UxbGEKK281Y3VyZQorb2Q1ZDFlZAorb2QxZDQKK29kM2ljCitvMWQyaTNvCitvMmRvNAorb2Q0b3IzCitvNGQ1dWN0LgorbzFkdQorb2R1MmMKK29kdTJjMXQKK280ZDV1YzR0MXMyCitvNGVsCitvNWVuZworbzNlcgorb2U0dGEKK28zZXYKK28yZmkKK29mNWl0ZQorb2Y0aTR0NHQyCitvMmc1YTVyCitvMWdhCitvNGc1YTF0Mml2CitvNGdhMXRvCitvMWdlCitvNWdlbmUKK28xZ2VuCitvNWdlbworbzRnZXIKK28zZzJpZTQKKzFvMWdpcworb2czaXQKK280Z2wyCitvNWcybHkKKzNvZ25pegorb2cxbmkKK280ZzRybworbzFncgorb2cydTVpMgorMW8xZ3kKKzJvMmc1eTNuCitvMWgyCitvaGFiNQorb2kyCitvaWMzZXMKK29pM2RlcgorbzJpZAorb2k0ZjFmNAorbzJpZzQKK29pNWxldAorbzNpbmcKK29pbnQ1ZXIKK29pbjF0CitvNWkyczFtCitvaTVzbzJuCitvaTJzbworb2lzdDVlbgorb2lzMXRlCitvaTN0ZXIKK28yaXRlCitvNWoKKzJvaworbzNrZW4KK29rNWllNAorb2sxaQorbzFsYQorbzRsYTJuCitvbGEyc3M0CitvMmwyZAorb2wyZDFlCitvbDNlcgorbzNsZXMyYworb2xlczIKK28zbGV0CitvbDRmaQorbzJsZgorb2wyaQorbzNsMmkxYQorbzNsaWNlCitvbDVpZC4KK29sMmlkCitvM2xpNGYKK281bDRpNGwKK29sM2luZworbzVsMmlvCitvNWwyaXMuCitvbDNpczJoCitvNWwyaXRlCitvbDFpdAorbzVsMmkxdDJpbworb2xpMXRpCitvNWwyaXYKK29sbDJpNGU0CitvbDFsCitvbGwyaQorb2w1bzNnaXoKK29sbzRyCitvbDVwMmwyCitvMmxwCitvNGwydAorb2wzdWIKK29sM3VtZQorb2wzdW4KK281bDJ1cworb2wydgorbzJseQorbzJtNWFoCitvMW1hCitvbWE1bAorb201YTF0aXoKK29tMmJlCitvNG0xYgorb200YjJsMgorbzJtZQorb20zZTFuNGEKK28xbWVuCitvbTVlcjJzZQorb21lNHIxczIKK280bWV0CitvbTVlM3RyeQorb200ZXRyCitvM20yaTNhCitvbTNpYy4KK29tM2kxY2EKK281bTJpZAorb20xaW4KK281bTJpbmkKKzVvbW1lbmQKK29tMW0KK29tMW1lbgorb21vNGdlCitvMW1vCitvNG1vMm4KK29tM3BpCitvNG0xcAorb21wcm81CitvbXByMgorbzJuCitvMW4xYQorb240YWMKK28zbjJhMm4KK29uMWMKKzNvbmNpbAorb24xY2kKKzJvbmQKK29uNWRvCitvM25lbgorbzJuNWVzdAorbzFuZXMKK29uNGd1CitvbjFpYworbzNuMmk0bworb24xaXMKK281bmkxdQorb24za2V5CitvNG5rMgorb240b2RpCitvNG4zbzJkCitvbjNvM215CitvMm4zczIKK29uNXNwaTQKK29uc3BpMXI1YQorb25zcDRpcgorb24xc3U0CitvbnRlbjQKK29uMXQKK29uM3Q0aQorb250aTJmNQorb241dW0KK29uMXZhNQorb24xdjIKK29vMgorb29kNWUKK29vZDVpCitvMm80aworb29wM2kKK28zb3JkCitvb3N0NQorbzJwYQorbzJwMmU1ZAorb3AxZXIKKzNvcGVyMWEKKzRvcDRlcmFnCisyb3BoCitvNXBoYTJuCitvNXBoNGVyCitvcDNpbmcKK29waTJuCitvM3BpdAorbzVwbzJuCitvNHBvc2kKK28xcG9zCitvMXByMgorb3AxdQorb3B5NQorbzFxCitvMXJhCitvNXJhLgorbzRyM2FnCitvcjVhbDFpegorb3JhbDFpCitvcjVhbjRnZQorb3JhMm4KK29yMmFuZworb3JlNWEKK281cmUxYTRsCitvcjNlaTIKK29yNGU1czJoCitvcjVlMnN0Lgorb3JlczJ0CitvcmV3NAorb3I0Z3UKK29yZzIKKzRvNXIyaTNhCitvcjNpMWNhCitvNXJpbAorb3IxaW4KK28xcjJpMW8KK29yM2kxdHkKK28zcmkxdQorb3IybWkKK29yMW0KK29ybjJlCitvNXJvZgorb3Izb3VnCitvcm91Mgorb3I1cGUKK29yMXAKKzNvcnJoNAorb3IxcjQKK29yNHNlCitvNHJzMgorb3JzNWVuCitvcnN0NAorb3IzdGhpCitvcjN0aHkKK29yNHR5CitvNXJ1bQorbzFyeQorb3MzYWwKK29zYTIKK29zMmMKK29zNGNlCitvM3Njb3AKK29zMWNvCis0b3Njb3BpCitvNXNjcgorb3M0aTRlNAorb3M1aTF0Mml2Citvc2kxdGkKK29zM2kxdG8KK29zM2kxdHkKK281c2k0dQorb3M0bDIKK28yc28KK28yczRwYQorb3M0cG8KK29zMnRhCitvNXN0YXRpCitvczV0aWwKK29zdDJpCitvczV0aXQKK280dGEybgorbzF0YQorb3RlbGU0Zworb3QzZXIuCitvdDVlNHIxczIKK280dGVzCis0b3RoCitvdGg1ZTFzaQorb3RoMmUKK290aDFlcworb3RoM2k0CitvdDNpYy4KK290NWkxY2EKK28zdGljZQorbzN0aWYyCitvM3Rpcworb3RvNXMyCitvMXRvCitvdTIKK291M2IybDIKK291Y2g1aQorb3UyY2gKK291NWV0CitvdTRsCitvdW5jNWVyCitvdW4yZAorb3U1djIKK292NGVuCitvdmVyNG5lCitvdmU0cjNzMgorb3Y0ZXJ0CitvM3ZpcworbzR2aTF0aTQKK281djRvbAorb3czZGVyCitvdzNlbAorb3c1ZXN0Mworb3cxaTIKK293bjVpCitvNHdvMgorb3kxYQorMXBhCitwYTRjYQorcGE0Y2UKK3BhMmM0dAorcDRhMmQKKzVwYWdhNG4KK3BhMWdhCitwM2FnYXQKK3A0YWkyCitwYTRpNG40CitwNGFsCitwYTFuNGEKK3BhMm4KK3BhbjNlbAorcGFuNHR5CitwYW4xdAorcGEzbnkKK3BhMXAKK3BhNHB1CitwYXJhNWIybDIKK3AyYTJyCitwYTJyYWIKK3BhcjVhZ2UKK3BhcjVkMmkKKzNwYXJlCitwYXI1ZWwKK3A0YTRyMWkKK3BhcjRpcworcGEydGUKK3BhNXRlcgorNXBhdGhpYworcDRhdGgKK3BhNXRoeQorcGE0dHJpYworcGExdHIKK3BhdjQKKzNwYXkKKzRwMWIKK3BkNAorNHBlLgorM3BlNGEKK3BlYXI0bAorcGUyYTJyCitwZTJjCisycDJlZAorM3BlZGUKKzNwNGVkaQorcGUzZDRpM2E0CitwZWQ0aWMKK3A0ZWUKK3BlZTRkCitwZWs0CitwZTRsYQorcGVsMmk0ZTQKK3BlbDJpCitwZTRuMmEybgorcGUxbmEKK3A0ZW5jCitwZW40dGgKK3BlbjF0CitwZTVvMm4KK3A0ZXJhLgorcGVyMWEKK3BlcmE1YjJsMgorcGUycmE0YgorcDRlcmFnCitwNGVyMWkKK3Blcmk1c3QKK3BlcjJpcworcGVyNG1hbAorcGVyM200CitwZXIxbWEKK3BlcjJtZTUKK3A0ZXJuCitwMmVyM28KK3BlcjN0aQorcDRlNXJ1CitwZXIxdgorcGUydAorcGU1dGVuCitwZTV0aXoKKzRwZgorNHBnCis0cGguCitwaGFyNWkKK3BoMmEycgorcGg0ZTNubworcGhlMm4KK3BoNGVyCitwaDRlcy4KK3BoMWVzCitwaDFpYworNXBoMmllNAorcGg1aW5nCis1cGhpczF0MmkKKzNwaGl6CitwNGgybDQKKzNwaG9iCiszcGhvbmUKK3BobzJuCis1cGhvbmkKK3BobzRyCis0cDRoMXMyCitwaDN0Cis1cGh1CisxcGh5CitwMmkzYQorcGkyYTJuNAorcGk0YzJpZTQKK3AyaTFjaQorcGk0Y3kKK3A0aWQKK3A1aTFkMmEKK3BpM2RlCis1cGkyZGkKKzNwaWVjCitwMmllNAorcGkzZW4KK3BpNGdyYXAKK3AyaWcKK3BpMWdyCitwaTNsbworcGkybgorcDRpbi4KK3A0aW5kNAorcDRpMW5vCiszcDJpMW8KK3BpbzJuNAorcDNpdGgKK3BpNXRoYQorcGkydHUKKzJwM2syCisxcDJsMgorM3BsYTJuCitwbGFzNXQKK3BsMmkzYQorcGxpNWVyCitwbDJpZTQKKzRwbDJpZworcGxpNG4KK3Bsb2k0CitwbHU0bQorcGx1NG00YgorNHAxbQorMnAzbgorcG80YworNXBvZC4KK3BvNWVtCitwbzNldDUKKzVwbzRnCitwb2luMgorcG9pMgorNXBvaW4xdAorcG9seTV0CitwbzJseQorcG80bmkKK3BvMm4KK3BvNHAKKzFwNG9yCitwbzRyeQorMXBvcworcG8yczFzCitwNG90CitwbzR0YQorNXBvdW4KK3BvdTIKKzRwMXAKK3BwYTVyYQorcDFwYQorcHAyYTJyCitwMnBlCitwNHAyZWQKK3A1cGVsCitwM3BlbgorcDNwZXIKK3AzcGUydAorcHBvNXMyaXRlCitwMXBvcworcHIyCitwcmF5NGU0Cis1cHJlMWMyaQorcHJlNWNvCitwcmUzZTJtCitwcmU0ZjVhYworcHJlMWYKK3ByZTFmYQorcHJlNGxhCitwcjFlM3I0CitwM3JlMXMyZQorM3ByMmUyc3MKK3ByZTV0ZW4KK3ByZTN2MgorNXByMmk0ZTQKK3ByaW40dDMKK3ByMmk0cworcHJpMnMzbworcDNybzFjYQorcHIyb2MKK3Byb2Y1aXQKK3BybzJmaQorcHJvM2wKK3Byb3MzZQorcHJvMXQKKzJwMXMyCitwMnNlCitwczRoCitwNHNpMWIKKzJwMXQKK3AydDVhNGIKK3AxdGEKK3AydGUKK3AydGgKK3AxdGkzbQorcHR1NHIKK3AxdHUKK3A0dHc0CitwdWIzCitwdWU0CitwdWY0CitwdTRsM2MyCitwdTRtCitwdTJuCitwdXI0cjQKKzVwMnVzCitwdTJ0Cis1cHV0ZQorcHV0M2VyCitwdTN0cgorcHV0NHQxZWQKK3B1NHQzdDIKK3B1dDR0MWluCitwM3cKK3F1MgorcXVhNXY0CisycXVlLgorM3F1ZXIKKzNxdWV0CisycmFiCityYTNiaQorcmFjaDRlMgorcmEyY2gKK3I1YTFjNGw0CityYWY1ZmkKK3JhMmYKK3JhNGYxZjQKK3JhMmY0dAorcjJhaTIKK3JhNGxvCityYW0zZXQKK3IyYW1pCityYTNuZTVvCityYTJuCityYW40Z2UKK3IyYW5nCityNGFuaQorcmE1bm80CityYXAzZXIKKzNyYTFwaHkKK3JhcjVjCityMmEycgorcmFyZTQKK3JhcjVlMWYKKzRyYXJpbAorcmFyMWkKK3IyYXMKK3JhdGlvMm40CityYTF0MmlvCityYXU0dAorcmE1dmFpMgorcmEydmEKK3JhdjNlbAorcmE1ejJpZTQKK3JhMnoxaQorcjFiCityNGJhYgorcjRiYWcKK3JiaTIKK3IyYjNpNGYKK3IyYmluCityNWIyaW5lCityYjVpbmcuCityYjRvCityMWMKK3IyY2UKK3IxY2VuNAorcjNjaGEKK3IyY2gKK3JjaDRlcgorcmNoZTIKK3I0Y2k0YgorcjFjaQorcjJjNGl0CityY3VtMworcjRkYWwKK3IxZDJhCityZDJpCityMWQ0aTRhCityZGk0ZXIKK3JkMmllNAorcmQxaW40CityZDNpbmcKKzJyZS4KK3JlMWE0bAorcmUzYTJuCityZTVhcjFyNAorcmUyYTJyCis1cmVhMnYKK3JlNGF3CityNWVicmF0CityMmUxYgorcmUzYnIKK3JlYzVvbDFsCityZTJjb2wKK3JlMWNvCityZTRjNW9tcGUKK3JlY280bTFwCityZTRjcmUKK3JlMWNyCisycjJlZAorcmUxZGUKK3JlM2RpczEKK3I0ZWRpCityZWQ1aXQKK3JlNGZhYworcmUxZgorcmUxZmEKK3JlMmZlCityZTVmZXIuCityZWZlcjEKK3JlM2ZpCityZTRmeQorcmVnM2lzCityZTVpdAorcmVpMgorcmUxbDJpCityZTVsdQorcjRlbjR0YQorcmVuMXQKK3JlbjR0ZQorcmUxbworcmU1cGkybgorcmU0cG9zaQorcmUxcG8KK3JlMXBvcworcmUxcHUKK3IxZXI0CityNGVyMWkKK3IyZXJvNAorcjRlNXJ1CityNGVzLgorcmU0c3BpCityZTFzcAorcmVzNHM1aTRiCityMmUyc3MKK3JlczFzaQorcmVzMnQKK3JlNXMydGEybAorcmVzMXRhCityMmUzc3Q0cgorcmU0dGVyCityZTR0aTR6CityZTN0cmkKK3I0ZXUyCityZTV1MXQyaQorcmV2MgorcmU0dmFsCityZTF2YQorcmV2M2VsCityNWV2NWVyLgorcmV2MWVyCityZTV2ZTRyMXMyCityZTV2ZXJ0CityZTV2aTRsCityZTF2aQorcmV2NW9sdQorcmU0d2gKK3IxZgorcjNmdTQKK3I0ZnkKK3JnMgorcmczZXIKK3IzZ2V0CityM2cxaWMKK3JnaTRuCityZzNpbmcKK3I1Z2lzCityNWdpdAorcjFnbDIKK3JnbzRuMgorcjFnbworcjNndQorcmg0Cis0cmguCis0cmhhbAorcjJpM2EKK3JpYTRiCityaTRhZworcjRpYgorcmliM2EKK3JpYzVhczUKK3JpMWNhCityNGljZQorNHIyaTFjaQorNXJpNWMyaWQKK3JpNGMyaWU0CityNGkxY28KK3JpZDVlcgorcjJpZAorcmkzZW5jCityMmllNAorcmkzZW4xdAorcmkxZXIKK3JpNWV0CityaWc1YTJuCityMmlnCityaTFnYQorNXI0aWdpCityaWwzaXoKK3JpbDFpCis1cmltYTJuCityaTFtYQorcmltNWkKKzNyaTFtbworcmltNHBlCityaTRtMXAKK3IyaTFuYQorNXJpbmEuCityNGluNGQKK3IyaW40ZQorcmluNGcKK3IyaTFvCis1cmlwaAorcjJpcAorcmlwaDVlCityaTJwMmwyCityaXA1bGljCityNGlxCityMmlzCityNGlzLgorcjJpczRjCityM2lzMmgKK3JpczRwCityaTN0YTNiCityaTF0YQorcjVpdGVkLgorcjJpdGUKK3JpMnQxZWQKK3JpdDVlci4KK3JpdDVlNHIxczIKK3I0aTJ0M2ljCityaTF0aQorcmkydHUKK3JpdDV1cgorcml2NWVsCityMml2CityaXYzZXQKK3JpdjNpCityM2oKK3Iza2V0CityazRsZQorcmsxbAorcms0bGluCityMWwKK3JsZTQKK3IybGVkCityNGwyaWcKK3I0bGlzCitybDVpczJoCityM2xvNAorcjFtCitybWE1YworcjFtYQorcjJtZQorcjNtZW4KK3JtNWU0cjFzMgorcm0zaW5nCityNG1pbmcuCityNG0yaW8KK3IzbWl0CityNG15CityNG4yYTJyCityMW5hCityM25lbAorcjRuMWVyCityNW5ldAorcjNuZXkKK3I1bmljCityMW5pczQKK3IzbjJpdAorcjNuMml2Citybm80CityNG5vdTIKK3IzbnUKK3JvYjNsMgorcjJvYworcm8zY3IKK3JvNGUKK3JvMWZlCitybzVmaWwKK3JvMmZpCityMm9rMgorcm81azFlcgorNXJvbGUuCityb201ZTF0ZQorcm8ybWUKK3JvNG1ldAorcm9tNGkKK3JvNG00cAorcm9uNGFsCitybzJuCitybzFuMWEKK3JvbjRlCitybzVuNGlzCityb240dGEKK3JvbjF0Cisxcm9vbQorcm9vMgorNXJvb3QKK3JvM3BlbAorcm9wM2ljCityb3IzaQorcm81cm8KK3JvMnM1cGVyCitybzJzNHMKK3JvNHRoMmUKK3I0b3RoCitybzR0eQorcm80dmEKK3JvdjVlbAorcm94NQorcjFwCityNHBlNGEKK3I1cGVuMXQKK3JwNWVyLgorcjNwZTJ0CitycDRoNAorcnAzaW5nCitycGkybgorcjNwbworcjFyNAorcnJlNGMKK3JyZTRmCityNHJlMW8KK3JyZTRzMnQKK3JyMmk0bworcnIyaTR2Citycm8ybjQKK3Jyb3M0CitycnlzNAorNHJzMgorcjFzYTIKK3JzYTV0aQorcnM0YworcjJzZQorcjNzZWMKK3JzZTRjcgorcjRzNWVyLgorcnMzZTRzCityNXNlNXYyCityMXMyaAorcjVzaGEKK3Ixc2kKK3I0c2k0YgorcnNvMm4zCityMXNvCityMXNwCityNXN3MgorcnRhMmNoNAorcjF0YQorcjR0YWcKK3IzdDJlMWIKK3IzdGVuNGQKK3IxdGU1bworcjF0aQorcjJ0NWkyYgorcnQyaTRkCityNHRpZXIKK3J0MmllNAorcjN0MmlnCitydGlsM2kKK3J0aWw0bAorcjR0aTFseQorcjR0aXN0CityNHQyaXYKK3IzdHJpCitydHIyb3BoNAorcnQ0czJoNAorcjR0MXMyCitydTNhCitydTNlNGwKK3J1M2VuCitydTRnbDIKK3J1M2k0bgorcjJ1aTIKK3J1bTNwMmwyCitydTRtMnAKK3J1Mm4KK3J1NG5rNQorcnVuNHR5CitydW4xdAorcjV1c2MyCityMnVzCitydTJ0MWk1bgorcjR1MXQyaQorcnY0ZQorcnZlbDRpCityM3ZlbgorcnY1ZXIuCityNXZlc3QKK3J2NGUycworcjN2ZXkKK3IzdmljCityM3YyaTR2CityM3ZvCityMXcKK3J5NGMKKzVyeW5nZQorcnluNWcKK3J5M3QKK3NhMgorMnMxYWIKKzVzYWNrMQorc2FjM3JpMgorczNhMmMxdAorNXNhaTIKK3NhNGwyYTJyNAorczRhMmw0bQorc2E1bG8KK3NhNGw0dAorM3NhbmMKK3NhMm4KK3NhbjRkZQorczRhbmQKK3MxYXAKK3NhNXRhCis1c2EzdDJpbworc2EydDN1CitzYXU0CitzYTV2b3IKKzVzYXcKKzRzNWIKK3NjYW40dDUKK3MxY2EKK3NjYTJuCitzY2E0cAorc2NhdjUKK3M0Y2VkCis0czNjZWkyCitzNGNlcworczJjaDIKK3M0Y2hvMgorM3M0YzJpZTQKK3MxY2kKKzVzYzRpbjRkCitzMmNpbgorc2NsZTUKK3MxYzRsNAorczRjbGkKK3Njb2Y0CitzMWNvCis0c2NvcHk1CitzY291MXI1YQorc2NvdTIKK3MxY3UKKzRzNWQKKzRzZS4KK3NlNGEKK3NlYXM0CitzZWE1dworc2UyYzNvCiszc2UyYzF0Cis0czRlZAorc2U0ZDRlCitzNWVkbAorc2UyZworc2UxZzNyCis1c2VpMgorc2UxbGUKKzVzZTJsMmYKKzVzZWx2Cis0c2UxbWUKK3NlNG1vbAorc2UxbW8KK3NlbjVhdAorc2UxbmEKKzRzZW5jCitzZW40ZAorczVlMm5lZAorc2VuNWcKK3M1ZW4xaW4KKzRzZW40dDFkCitzZW4xdAorNHNlbjJ0bAorc2UycDNhMworNHMxZXIuCitzNGVyMWwKK3MyZXI0bworNHNlcjN2bworczFlNHMKK3M0ZTVzMmgKK3NlczV0Cis1c2U1dW0KK3M0ZXUKKzVzZXYKK3NldjNlbgorc2V3NGkyCis1c2V4Cis0czNmCisyczNnCitzMmgKKzJzaC4KK3NoMWVyCis1c2hldgorc2gxaW4KK3NoM2lvCiszc2gyaTRwCitzaDJpMnY1CitzaG80CitzaDVvMmwyZAorc2hvMm4zCitzaG9yNAorc2hvcnQ1Cis0c2gxdworc2kxYgorczVpYzNjCiszc2kyZGUuCitzMmlkCis1c2lkZTRzMgorNXNpMmRpCitzaTVkaXoKKzRzaWcxbjRhCitzMmlnCitzaWw0ZQorNHNpMWx5CisyczFpbgorczJpMW5hCis1c2kybmUuCitzMmluZQorczNpbmcKKzFzMmlvCis1c2lvMm4KK3NpbzFuNWEKK3M0aTJyCitzaTFyNWEKKzFzaXMKKzNzMmkxdDJpbworc2kxdGkKKzVzaTF1CisxczJpdgorNXNpegorc2syCis0c2tlCitzM2tldAorc2s1aW5lCitzazFpCitzazVpbjRnCitzMWwyCitzM2xhdAorczJsZQorc2wyaXRoNQorc2wxaXQKKzJzMW0KK3MzbWEKK3NtYWwxbDMKK3NtYTJuMworc21lbDQKK3M1bWVuCis1czRtMml0aAorc21vMmw1ZDQKK3MxbW8KK3MxbjQKKzFzbworc280Y2UKK3NvMmZ0Mworc280bGFiCitzbzFsYQorc28ybDNkMgorc28zbGljCitzb2wyaQorNXNvbDJ2Ciszc29tCiszczRvbi4KK3NvMm4KK3NvMW4xYTQKK3NvbjRnCitzNG9wCis1c29waDFpYworczJvcGgKK3M1bzNwaGl6CitzNW8xcGh5Citzb3I1Yworc29yNWQKKzRzb3YKK3NvNXZpCisyczFwYQorNXNwNGFpMgorc3BhNG4KK3NwZW40ZAorMnM1cGVvCisyc3BlcgorczJwaGUKKzNzcGg0ZXIKK3NwaG81CitzcGlsNAorc3A1aW5nCitzcGkybgorNHMzcDJpMW8KK3M0cDFseQorczFwMmwyCitzNHBvMm4KK3MxcDRvcjQKKzRzcDRvdAorc3F1YWw0bAorc3F1MgorczFyCisyc3MKK3Mxc2EyCitzc2FzMworczJzNWMKK3Mzc2VsCitzNXNlbjVnCitzNHNlcy4KK3NzMWU0cworczVzZXQKK3Mxc2kKK3M0czJpZTQKK3NzaTRlcgorczRzNWkxbHkKK3M0czFsMgorc3M0bGkKK3M0czFuNAorc3NwZW40ZDQKK3NzMnQKK3NzdTFyNWEKK3Mxc3UKK3NzdTJyCitzczV3MgorMnN0LgorczJ0YWcKK3MxdGEKK3MydGEybAorc3RhbTRpCis1c3Q0YW5kCitzdGEybgorczR0YTRwCis1c3RhdC4KK3M0dDFlZAorc3Rlcm41aQorczV0MmVybworc3RlMncKK3N0ZTF3NWEKK3MzdGgyZQorc3QyaQorczR0aS4KK3M1dDJpMWEKK3MxdGljCis1czR0aWNrMQorczR0MmllNAorczN0aWYyCitzdDNpbmcKK3MydDFpbgorNXN0NGlyCitzMXRsZQorczJ0bAorNXN0b2NrMQorczF0bworc3RvMm0zYQorNXN0b25lCitzdG8ybgorczR0b3AKKzNzdG9yZQorc3Q0cgorczR0cmEyZAorczF0cmEKKzVzdHJhMnR1CitzNHRyYXkKK3M0dHIyaWQKKzRzdHJ5Cis0c3QzdzQKK3MydHkKKzFzdQorc3UxYWwKK3N1NGIzCitzdTJnMworc3U1aXMKK3MydWkyCitzdWl0MworczR1bAorc3UybQorc3UxbTNpCitzdTJuCitzdTJyCis0c3YKK3N3MgorNHMxd28yCitzNHkKKzRzeTFjCiszc3lsCitzeW41bworc3k1cmluCisxdGEKKzN0YS4KKzJ0YWIKK3RhNWJsZXMyCit0YWIybDIKKzV0YWI1bzVsMWl6Cit0YWJvbDJpCis0dDRhMmNpCit0YTVkbwordGEyZAorNHRhMmY0Cit0YWk1bG8KK3RhaTIKK3RhMmwKK3RhNWxhCit0YWw1ZW4KK3QyYWxlCit0YWwzaQorNHRhbGsKK3RhbDRsaXMKK3RhbDFsCit0YWxsMmkKK3RhNWxvZwordGE1bW8KK3RhbjRkZQordGEybgordDRhbmQKKzF0YW4xdGEzCit0YW4xdAordGE1cGVyCit0YTVwMmwyCit0YXI0YQordDJhMnIKKzR0YXIxYworNHRhcmUKK3RhM3IyaXoKK3RhcjFpCit0YXM0ZQordGE1czR5Cis0dGF0MWljCit0YTR0dXIKK3RhMnR1Cit0YXVuNAordGF2NAorMnRhdwordGF4NGlzCit0YXgzaQorMnQxYgorNHRjCit0NGNoCit0Y2g1ZTR0Cit0Y2hlMgorNHQxZAorNHRlLgordGUyYWQ0aQordGVhMmQxCis0dGVhMnQKK3RlMWNlNAorNXRlMmMxdAorMnQxZWQKK3Q0ZTVkaQorMXRlZQordGVnNAordGU1Z2VyNAordGU1Z2kKKzN0ZWwuCit0ZWwyaTQKKzV0ZTJsMXMyCit0ZTJtYTIKK3RlbTNhdAorM3RlbjJhMm4KK3RlMW5hCiszdGVuYworM3RlbmQKKzR0ZTFuZXMKKzF0ZW4xdAordGVuNHRhZwordGVuMXRhCisxdGVvCit0ZTRwCit0ZTVwZQordGVyM2MKKzV0ZXIzZAorMXRlcjFpCit0ZXI1aWVzCit0ZXIyaWU0Cit0ZXIzaXMKK3Rlcmk1emExCis1dDRlcjNuMml0Cit0ZXI1dgorNHRlcy4KKzR0MmUyc3MKK3QzZXNzLgordGV0aDVlCiszdDRldQorM3RleAorNHRleQorMnQxZgorNHQxZworMnRoLgordGhhMm40Cit0aDJlCis0dGhlYQordGgzZWFzCit0aGU1YTJ0Cit0aGUzaXMKK3RoZWkyCiszdGhlNHQKK3RoNWljLgordGg1aTFjYQorNHRoNGlsMgorNXRoNGk0bmsyCis0dDRoMWw0Cit0aDVvZGUKKzV0aG9kM2ljCis0dGhvbzIKK3Rob3I1aXQKK3RobzVyaXoKKzJ0NGgxczIKKzF0MmkxYQordGk0YWIKK3RpNGExdG8KKzJ0aTJiCis0dGljazEKK3Q0aTFjbwordDRpYzF1Cis1dGkyZGkKK3QyaWQKKzN0aWVuCit0MmllNAordGlmMgordGk1ZnkKKzJ0MmlnCis1dGlndQordGlsMmw1aW40Cit0aWwxbAordGlsbDJpCisxdGltCis0dGk0bTFwCit0aW01dWwKK3RpMm11CisydDFpbgordDJpMW5hCiszdGkybmUuCit0MmluZQorM3QyaW5pCisxdDJpbwordGk1b2MKK3Rpb241ZWUKK3RpbzJuCis1dGlxCit0aTNzYTIKKzN0NGlzZQordGkyczRtCit0aTVzbwordGlzNHAKKzV0aXN0aTFjYQordGlzMXQyaQordGlzMXRpYwordGkzdGwKK3RpNHUKKzF0Mml2Cit0aTF2NGEKKzF0aXoKK3RpM3phMQordGkzemU0bgordGkyemUKKzJ0bAordDVsYQordGxhMm40CiszdGxlLgorM3RsZWQKKzN0bGVzLgordGxlczIKK3Q1bGV0LgordDVsbworNHQxbQordG1lNAorMnQxbjIKKzF0bwordG8zYgordG81Y3JhdAorNHRvMmRvNAorMnRvZgordG8yZ3IKK3RvNWljCit0b2kyCit0bzJtYQordG80bTRiCit0bzNteQordG9uNGE0bDFpCit0bzJuCit0bzFuMWEKK3RvM24yYXQKKzR0b25vCis0dG9ueQordG8ycmEKK3RvM3IyaWU0Cit0b3I1aXoKK3RvczIKKzV0b3VyCit0b3UyCis0dG91dAordG8zdzJhMnIKKzR0MXAKKzF0cmEKK3QycmEzYgordHJhNWNoCit0cjRhMmNpNAordHJhMmM0aXQKK3RyYWM0dGUKK3RyYTJjMXQKK3RyMmFzNAordHJhNXZlbgordHJhdjVlMnM1Cit0cmU1ZgordHJlNG0KK3RyZW01aQorNXRyMmkzYQordHJpNWNlcwordHI0aWNlCis1dHJpM2MyaTFhCit0NHIyaTFjaQorNHRyaTRjM3MyCisydHJpbQordHIyaTR2Cit0cm81bTRpCit0cm9uNWkKK3RybzJuCis0dHJvbnkKK3RybzVwaGUKK3RyMm9waAordHJvM3NwCit0cm8zdgordHIydTVpMgordHIydXM0Cis0dDFzMgordDRzYwordHMyaDQKK3Q0c3cyCis0dDN0MgordDR0ZXMKK3Q1dG8KK3QxdHU0CisxdHUKK3R1MWEKK3R1M2EycgordHU0YjRpCit0dWQyCis0dHVlCis0dHVmNAorNXQydTNpMgorM3R1bQordHU0bmlzCit0dTFuaQorMnQzdXAuCiszdHVyZQorNXR1cmkKK3R1cjNpcwordHVyNW8KK3R1NXJ5CiszdDJ1cworNHR2Cit0dzQKKzR0MXdhCit0d2lzNAordHdpMgorNHQxd28yCisxdHkKKzR0eWEKKzJ0eWwKK3R5cGUzCit0eTVwaAorNHR6Cit0Mno0ZQorNHVhYgordWFjNAordWE1bmEKK3VhMm4KK3VhbjRpCit1YXI1YW4xdAordTJhMnIKK3VhcmEybgordWFyMmQKK3VhcjNpCit1YXIzdAordTFhdAordWF2NAordWI0ZQordTRiZWwKK3UzYmVyCit1NGIyZXJvCit1MWI0aQordTRiNWluZwordTNiNGxlLgordWIybDIKK3UzY2EKK3VjaTRiCit1MWNpCit1MmM0aXQKK3VjbGUzCit1MWM0bDQKK3UzY3IKK3UzY3UKK3U0Y3kKK3VkNWQ0Cit1ZDNlcgordWQ1ZXN0Cit1ZGVzMgordWRlMXY0Cit1MWRpYwordWQzaWVkCit1ZDJpZTQKK3VkM2llcwordWQ1aXMxCit1NWRpdAordTRkbzJuCit1MWRvCit1ZDRzaQordTJkMXMyCit1NGR1Cit1NGVuZQordWUybjFzNAordWVuNHRlCit1ZW4xdAordWVyNGlsCit1ZXIxaQorM3UxZmEKK3UzZjRsMgordWdoM2UybgordWc1aW4KKzJ1aTIKK3VpbDVpegordWlsMWkKK3VpNG4KK3UxaW5nCit1aXI0bQordTRpcgordWkxdGE0Cit1Mml2MwordWk0djRlci4KK3U1agorNHVrCit1MWxhCit1bGE1YgordTVsYXRpCit1bDJjaDQKK3U0bDFjMgorNXVsY2hlMgordWwzZGVyCit1MmxkCit1bDJkZQordWw0ZQordTFsZW4KK3VsNGdpCit1NGwxZzQKK3VsMmkKK3U1bDJpMWEKK3VsM2luZwordWw1aXMyaAordWw0bDJhMnIKK3VsMWwKK3VsNGxpNGIKK3VsbDJpCit1bDRsaXMKKzR1MmwzbQordTFsNG8KKzR1MmwxczIKK3VsczVlNHMKK3VsMnNlCit1bDF0aQordTRsdAordWwxdHJhMwordWwxdHIKKzR1bDF0dTIKK3UzbHUKK3VsNXVsCit1bDV2Cit1Mm01YWIKK3UxbWEKK3VtNGJpCit1NG0xYgordW00YjFseQordW1iMmwyCit1MW1pCit1NG0zaW5nCit1bW9yNW8KK3UxbW8KK3VtbzJyCit1NG0ycAordW4yYXQ0Cit1MW5hCit1Mm5lCit1bjRlcgordTFuaQordW40aW0KK3UybjFpbgordW41aXMyaAordW4yaTN2Cit1Mm4zczQKK3VuNHN3MgordW4ydDNhNGIKK3VuMXQKK3VuMXRhCit1bjR0ZXIuCit1bjR0ZXMKK3VudTQKK3VuNXkKK3U0bjV6Cit1NG80cnMyCit1NW9zCit1MW91MgordTFwZQordXBlNHI1czIKK3U1cDJpM2EKK3VwM2luZwordXBpMm4KK3UzcDJsMgordTRwM3AKK3VwcG9ydDUKK3VwMXA0b3IKK3VwMnQ1aTJiCit1MnAxdAordXAxdHU0Cit1MXJhCis0dXJhLgordTRyYWcKK3U0cjJhcwordXI0YmUKK3VyMWIKK3VyMWM0Cit1cjFkCit1cmU1YTJ0Cit1cjRmZXIxCit1cjFmCit1cjRmcgordTNyaWYKK3VyaTRmaWMKK3VyaTFmaQordXIxaW4KK3UzcjJpMW8KK3Uxcml0Cit1cjNpegordXIybAordXJsNWluZy4KK3VyNG5vNAordXJvczQKK3VyNHBlCit1cjFwCit1cjRwaQordXJzNWVyCit1NHJzMgordXIyc2UKK3VyNXRlcwordXIzdGgyZQordXIxdGk0Cit1cjR0MmllNAordTNydQorMnVzCit1NXNhMmQKK3VzYTIKK3U1c2EybgordXM0YXAKK3VzYzIKK3VzM2NpCit1c2U1YQordTVzMmkxYQordTNzaWMKK3VzNGxpbgordXMxbDIKK3VzMXAKK3VzNXMxbDIKK3Uyc3MKK3VzNXRlcmUKK3VzMXQ0cgordTJzdQordXN1MnI0Cit1MnRhNGIKK3UxdGEKK3UzdGF0Cis0dTR0ZS4KKzR1dGVsCis0dXRlbgordXRlbjRpCis0dTF0MmkKK3V0aTVsMml6Cit1dGlsMWkKK3UzdDJpbmUKK3UydDFpbgordXQzaW5nCit1dGlvMW41YQordTF0MmlvCit1dGlvMm4KK3U0dGlzCis1dTV0aXoKK3U0dDFsCit1MnQ1b2YKK3UxdG8KK3V0bzVnCit1dG81bWF0MWljCit1dG8ybWEKK3U1dG8ybgordTR0b3UyCit1NHQxczQKK3UzdQordXU0bQordTF2MgordXgxdTMKK3UyejRlCisxdmEKKzV2YS4KKzJ2MWE0YgordmFjNWlsCit2NGEyY2kKK3ZhYzN1Cit2YWc0Cit2YTRnZQordmE1bDJpNGU0Cit2YWwxaQordmFsNW8KK3ZhbDF1Cit2YTVtbwordmE1bml6Cit2YTJuCit2YTVwaQordmFyNWllZAordjJhMnIKK3ZhcjFpCit2YXIyaWU0CiszdmF0Cis0dmUuCis0dmVkCit2ZWczCit2M2VsLgordmVsM2wyaQordmVsMWwKK3ZlNGxvCit2NGUxbHkKK3ZlbjNvbQordjRlbm8KK3Y1ZW51ZQordjRlcmQKKzV2MmUycmUuCit2NGVyZWwKK3YzZXJlbgordmVyNWVuYwordjRlcmVzCit2ZXIzaWU0Cit2ZXIxaQordmVybWk0bgordmVyM200CiszdmVyMnNlCit2ZTRyMXMyCit2ZXIzdGgKK3Y0ZTJzCis0dmVzLgordmVzNHRlCit2ZTR0ZQordmV0M2VyCit2ZTR0eQordmk1YWwxaQordjJpMWEKK3ZpMmFsCis1dmkyYTJuCis1dmkyZGUuCit2MmlkCis1dmkyZDFlZAorNHYzaTFkZW4KKzV2aWRlNHMyCis1dmkyZGkKK3YzaWYKK3ZpNWduCit2MmlnCit2NGlrNAorMnZpbAorNXYyaWwxaXQKK3ZpbDFpCit2M2kzbDJpegordjFpbgorNHZpNG5hCit2MmluYwordjRpbjVkCis0dmluZwordmkxbzNsCit2MmlvCit2M2lvNHIKK3ZpMW91MgordjJpNHAKK3ZpNXJvCit2NGlyCit2aXMzaXQKK3ZpM3NvCit2aTNzdQorNHZpMXRpCit2aXQzcgorNHZpMXR5CiszdjJpdgorNXZvLgordm9pNAorM3Yyb2sKK3ZvNGxhCit2NW9sZQorNXZvNGwydAorM3ZvbDJ2Cit2b201aQordm8ycjVhYgordm8xcmEKK3Zvcmk0Cit2bzRyeQordm80dGEKKzR2bzF0ZWUKKzR2djQKK3Y0eQordzVhYjJsMgorMndhYword2E1Z2VyCit3YTJnNW8KK3dhaXQ1Cit3YWkyCit3NWFsLgord2FtNAord2FyNHQKK3cyYTJyCit3YXM0dAord2ExdGUKK3dhNXZlcgordzFiCit3ZWE1cjJpZTQKK3dlMmEycgord2VhcjFpCit3ZTRhdGgzCit3ZWEydAord2U0ZDRuNAord2VldDMKK3dlZTV2Cit3ZWw0bAordzFlcgord2VzdDMKK3czZXYKK3doaTQKK3dpMgord2lsMgord2lsMmw1aW40Cit3aWwxbAord2lsbDJpCit3aW40ZGUKK3c0aW5kCit3aW40ZwordzRpcjQKKzN3NGlzZQordzJpdGgzCit3aXo1Cit3NGsKK3dsNGVzMgord2wzaW4KK3c0bm8KKzF3bzIKK3dvbTEKK3dvNXY0ZW4KK3c1cAord3JhNAord3JpNAord3JpMXRhNAordzNzMmgKK3dzNGwyCit3czRwZQordzVzNHQKKzR3dAord3k0Cit4MWEKK3hhYzVlCit4NGEyZ28KK3hhbTMKK3g0YXAKK3hhczUKK3gzYzIKK3gxZQoreGU0Y3UxdG8KK3hlMWN1Cit4ZTNjNHV0Cit4MmVkCit4ZXI0aQoreDJlNXJvCit4MWgKK3hoaTIKK3hoNGlsNQoreGh1NAoreDNpCit4Mmk1YQoreGk1YworeGk1ZGkKK3gyaWQKK3g0aW1lCit4aTVtMml6Cit4aW0xaQoreDNvCit4NG9iCit4M3AKK3hwNGFuNGQKK3gxcGEKK3hwYTJuCit4cGVjMXRvNQoreHBlMmMKK3hwZTJjMXQKK3gycDJlM2QKK3gxdDIKK3gzdGkKK3gxdQoreHUzYQoreHg0Cit5NWFjCiszeTJhMnI0Cit5NWF0Cit5MWIKK3kxYworeTJjZQoreWM1ZXIKK3kzY2gKK3ljaDRlMgoreWNvbTQKK3kxY28KK3ljb3Q0Cit5MWQKK3k1ZWUKK3kxZXIKK3k0ZXIxZgoreWVzNAoreWU0dAoreTVnaQorNHkzaAoreTFpCit5M2xhCit5bGxhNWIybDIKK3lsMWwKK3kzbG8KK3k1bHUKK3ltYm9sNQoreTRtMWIKK3ltZTQKK3ltMXBhMworeTRtMXAKK3luM2M0aHI0Cit5bjJjaAoreW41ZAoreW41ZworeW41aWMKKzV5bngKK3kxbzQKK3lvNWQKK3k0bzVnCit5b200Cit5bzVuZXQKK3lvMm4KK3k0bzJuM3MyCit5NG9zCit5NHAyZWQKK3lwZXI1Cit5cDNpCit5M3BvCit5NHBvNGMKK3lwMnRhCit5MnAxdAoreTVwdQoreXJhNW0KK3lyNWkzYQoreTNybworeXI0cjQKK3lzNGMKK3kzczJlCit5czNpMWNhCit5MXMzaW8KKzN5MXNpcworeTRzbworeTJzczQKK3lzMXQKK3lzM3RhCit5c3UycjQKK3kxc3UKK3kzdGhpbgoreXQzaWMKK3kxdworemExCit6NWEyYgorejJhMnIyCis0emIKKzJ6ZQoremU0bgoremU0cAorejFlcgorejJlM3JvCit6ZXQ0CisyejFpCit6NGlsCit6NGlzCis1emwKKzR6bQorMXpvCit6bzRtCit6bzVvbAorem9vMgorenRlNAorNHoxejIKK3o0enkKKy5hczlzOG85YzhpOGE4dGUuCisuYXMxc28KKy5hc3NvMWNpCisuYXNzbzNjMmkxYQorLmFzOXM4bzljOGk4YTh0OGVzLgorLmRlOGM5bDhpOW44YTl0OGk4b24uCisuZGUxYzRsNAorLmRlY2w0aTFuYQorLmRlY2xpbjJhdAorLmRlY2xpbmExdDJpbworLmRlY2xpbmF0aW8ybgorLm9iOGw4aThnOWE5dDhvOHJ5LgorLm9iMmwyCisub2JsMmlnCisub2JsaTFnYQorLm9ibGlnYTF0bworLm9ibGlnYXRvMXJ5CisucGg4aThsOWE4bjl0OGg4cjhvOHA4aWMuCisucGg0aWwyCisucGhpMWxhCisucGhpbGEybgorLnBoaWxhbjF0CisucGhpbGFudDRocjQKKy5waGlsYW50aHJvcDNpYworLnByOGU4czhlOG50LgorLnAzcmUxczJlCisucHJlc2VuMXQKKy5wcjhlOHM4ZThuOHRzLgorLnByZXNlbjR0NHMyCisucHI4bzhqOGU4Y3QuCisucHJvNWoKKy5wcm8xamUKKy5wcm9qZTJjMXQKKy5wcjhvOGo4ZThjOHRzLgorLnByb2plYzR0MXMyCisucmU4YzlpOXA4cjhvOGM5aTl0OHkuCisucmUxYzJpCisucmVjMmlwCisucmVjaXByMgorLnJlY2lwcjJvYworLnJlMWNpcHJvMWNpCisucmVjaXBybzJjMWl0CisucmVjaXByb2NpMXR5CisucmU5YzhvOGc5bjhpOXo4YThuOGNlLgorLnJlMWNvCisucmUyY29nCisucmVjM29nbml6CisucmVjb2cxbmkKKy5yZWNvZ25pemExCisucmVjb2duaXphMm4KKy5yZThmOW84cjltOGE5dDhpOG9uLgorLnJlMWYKKy5yZTFmbworLnJlZm8ycgorLnJlZm9yMW0KKy5yZWZvcjFtYQorLnJlZm9ybWExdDJpbworLnJlZm9ybWF0aW8ybgorLnJlOHQ5cjhpOWI4dTl0OGk4b24uCisucmUzdHJpCisucmV0cjRpYgorLnJldHJpM2J1MXQyaW8KKy5yZXRyaWI0dTF0MmkKKy5yZXRyaWJ1dGlvMm4KKy50YTliOGxlLgorLjJ0YWIKKy50YWIybDIKKy5hYzhhOGQ5ZTltOHkuCisuYTFjYQorLmFjYTJkCisuYWNhZDRlbQorLmFjYWRlM215CisuYWM4YThkOWU5bThpOGU4cy4KKy5hY2FkZW0yaTRlNAorLmFjOWM4dTlzOGE5dDhpOHY4ZS4KKy5hYzNjCisuYWMxYzJ1cworLmFjY3VzYTIKKy5hY2N1c2ExdDJpdgorLmFjOHI4bzluOHk4bS4KKy5hY3JvMm4KKy5hY3JvbnltNAorLmFjOHI4eThsOWE4bThpOGQ4ZS4KKy5hY3J5M2xhCisuYWNyeWxhbTJpZAorLmFjOHI4eThsOWE4bThpOGQ4ZThzLgorLmFjcnlsYW1pZGU0czIKKy5hYzhyOHk4bDlhOGw4ZDhlOWg4eThkOGUuCisuYWNyeWxhMmxkCisuYWNyeWxhbDJkZQorLmFjcnlsYWxkZTFoNAorLmFjcnlsYWxkZWh5MWQKKy5hZDhkOWE5YjhsOGUuCisuYWQxZDJhCisuYWQyZDNhNGIKKy5hZGRhYjJsMgorLmFkOGQ5aTliOGw4ZS4KKy5hZGRpMWIybDIKKy5hZDhyOGU4bjlhOWw4aThuOGUuCisuYTFkcgorLmFkcmU0CisuYTVkcmVuCisuYWRyZTFuYQorLmFkcmVuYTRsMWkKKy5hZHJlbmExbDRpbmUKKy5hZThyOG85czhwOGE4YzhlLgorLmFlNHIKKy5hMmVybworLmFlcm8yczRwYQorLmFlcm9zcGE0Y2UKKy5hZjl0OGU4cjl0OGg4bzh1OGc4aDh0LgorLmFmdGVydGhvdTIKKy5hZjl0OGU4cjl0OGg4bzh1OGc4aDh0OHMuCisuYWZ0ZXJ0aG91Z2g0dDFzMgorLmFnOHI4bzhuOW85bThpOHM4dC4KKy5hMWdyCisuYWc0cm8KKy5hZ3JvMm4KKy5hZ3Jvbm9tMmlzCisuYWc4cjhvOG45bzltOGk4czh0OHMuCisuYWdyb25vbWlzNHQxczIKKy5hbDlnOGU5YjhyOGE5aTljOGE4bDlsOHkuCisuYTRsMWc0CisuYWxnMmUxYgorLmFsZ2UzYnIKKy5hbGdlYnIyYWkyCisuYWxnZWJyYWkxY2EKKy5hbGdlYnJhaWNhbDFsCisuYWxnZWJyYWljYWwxbHkKKy5hbTlwOGg4ZTh0OWE5bThpOG44ZS4KKy5hNG0xcAorLmFtcGhlNHQKKy5hbXBoZTF0YQorLmFtcGhldGFtMWluCisuYW1waGV0YW0yaW5lCisuYW05cDhoOGU4dDlhOW04aThuOGU4cy4KKy5hbXBoZXRhbWkxbmVzCisuYW45YTlsOHk4czhlLgorLjNhbmExbHkKKy5hMW5hCisuYW40YTJseXM0CisuYW5hbDV5M3MyZQorLmFuOWE5bDh5OHM4ZThkLgorLmFuYWx5NHM0ZWQKKy5hbjhhOGw4eTlzOGU4cy4KKy5hbmFseXMxZTRzCisuYW45aThzOG85dDhyOG84cDlpOGMuCisuYW5pMnNvCisuYW5pc290cm9wM2ljCisuYW45aThzOG85dDhyOG84cDlpOWM4YThsOWw4eS4KKy5hbmlzb3Ryb3BpMWNhCisuYW5pc290cm9waWNhbDFsCisuYW5pc290cm9waWNhbDFseQorLmFuOWk4czhvOHQ5cjhvOXA4aThzOG0uCisuYW5pc290cm9waTJzMW0KKy5hbjlpOHM4bzh0OXI4bzhwOHkuCisuYW5pc290cm9weTUKKy5hbjhvOG05YThsOHkuCisuYW5vNAorLmFub21hNWwKKy5hbm8xbWEKKy5hbm9tYTFseQorLmFuOG84bTlhOGw4aThlOHMuCisuYW5vbWFsMWkKKy5hbm9tYWwyaTRlNAorLmFuOHQ4aTlkOGU4cjhpOHY5YTl0OGk4djhlLgorLmFudDJpZAorLmFudGlkZXIxaQorLmFudGlkZXIyaTR2CisuYW50aWRlNHJpMXZhCisuYW50aWRlcmkzdmF0CisuYW50aWRlcjJpdmExdDJpdgorLmFuOHQ4aTlkOGU4cjhpOHY5YTl0OGk4djhlOHMuCisuYW50aWRlcml2YXRpdjRlMnMKKy5hbjh0OGk5aDhvOGw4bzltOG84cjlwOGg4aThjLgorLmFudGkzaAorLmFudGlob2xvMW1vCisuYW50aWhvbG9tbzJyCisuYW50aWhvbG9tb3IxcAorLmFudGlob2xvbW9ycDRoNAorLmFudGlob2xvbW9ycGgxaWMKKy5hbjl0OGk4bjlvOW04eS4KKy5hbjJ0MWluCisuYW50Mmkxbm8KKy5hbnRpbm8zbXkKKy5hbjl0OGk4bjlvOW04aThlOHMuCisuYW50aW5vbTJpZTQKKy5hbjl0OGk5bjh1OWM4bDhlOGE4ci4KKy5hbnRpbjF1CisuYW50aW51Y2xlMworLmFudGludTFjNGw0CisuYW50aW51Y2xlMmEKKy5hbnRpbnVjbGUyYTJyCisuYW45dDhpOW44dTljOGw4ZTlvOG4uCisuYW50aW51Y2xlbzJuCisuYW45dDhpOXI4ZTh2OW85bDh1OXQ4aThvOG45YThyOHkuCisuYW50NGlyCisuYW50aXJldjIKKy5hbnRpcmV2NW9sdQorLmFudGlyZXZvMWx1dAorLmFudGlyZXZvbDR1MXQyaQorLmFudGlyZXZvbHV0aW8xbjVhCisuYW50aXJldm9sdTF0MmlvCisuYW50aXJldm9sdXRpbzJuCisuYW50aXJldm9sdXRpb24yYTJyCisuYXA4bzh0OGg5ZTlvOXM4ZThzLgorLmFwNG90CisuYXA0b3RoCisuYXBvdGgyZQorLmFwb3RoZW9zNAorLmFwb3RoZW9zMWU0cworLmFwOG84dDhoOWU5bzlzOGk4cy4KKy5hcG90aGVvMXNpcworLmFwOXA4ZThuOWQ4aTh4LgorLmE0cDFwCisuYXAycGUKKy5hcDNwZW4KKy5hcjljOGg4aTltOGU5ZDhlOGE4bi4KKy5hcjFjCisuYXIyY2gKKy5hcmNoaTJtZWQKKy5hcmNoaW1lZGVhMm4KKy5hcjljOGg4aTlwOGU4bDlhOGc4by4KKy5hcmNoMmk0cAorLmFyY2hpcGU0CisuYXJjaGlwZTRsYQorLmFyY2hpcGVsYTJnbworLmFyOWM4aDhpOXA4ZThsOWE5ZzhvOHMuCisuYXI5YzhoOGk4djhlLgorLmFyY2gyaTJ2CisuYXI5YzhoOGk4djhlOHMuCisuYXJjaGl2NGUycworLmFyOWM4aDhpOHY5aThuOGcuCisuYXJjaGl2MWluCisuYXJjaGk0dmluZworLmFyOWM4aDhpOHY5aThzOHQuCisuYXI5YzhoOGk4djlpOHM4dDhzLgorLmFyY2hpdmlzNHQxczIKKy5hcjljOGg4ZTl0OHk4cDlhOGwuCisuYXJjaGUyCisuYXJjaGU0dAorLmFyY2hlMXR5CisuYXJjaGV0eTFwYQorLmFyY2hldHlwNGFsCisuYXI5YzhoOGU5dDh5OHA5aTljOGE4bC4KKy5hcmNoZXR5cDNpCisuYXJjaGV0eXBpMWNhCisuYXI4Yzl0OGE4bjlnOGU4bjh0LgorLmFyMmMxdAorLmFyY3Q1YW5nCisuYXJjMXRhCisuYXJjdGEybgorLmFyY3RhbjFnZW4KKy5hcmN0YW5nZW4xdAorLmFyOGM5dDhhOG45ZzhlOG44dDhzLgorLmFyY3RhbmdlbjR0NHMyCisuYXM5czhpOGc4bjlhOWI4bDhlLgorLmFzMXNpCisuYXM0c2lnMW40YQorLmFzczJpZworLmFzc2lnMm4xYTJiCisuYXNzaWduYWIybDIKKy5hczlzOGk4ZzhuOW84ci4KKy5hc3NpZzFubworLmFzOXM4aThnOG45bzhyOHMuCisuYXNzaWdubzRyczIKKy5hczlzOGk4czh0OWE4bjh0OXM4aDhpOHAuCisuYXMxc2lzCisuYXNzaXMxdGEKKy5hc3Npc3RhMm4KKy5hc3Npc3RhbjF0CisuYXNzaXN0YW40dDRzMgorLmFzc2lzdGFudHMyaDQKKy5hc3Npc3RhbnQzc2gyaTRwCisuYXM5czhpOHM4dDlhOG44dDlzOGg4aThwOHMuCisuYXNzaXN0YW50c2hpMnAxczIKKy5hczh5OG04cDl0OG85bThhOHQ4aThjLgorLmFzNHkKKy5hc3k0bTFwCisuYXN5bTJwMXQKKy5hc3ltcDF0bworLmFzeW1wdG8ybWEKKy5hc3ltcHRvbWF0MWljCisuYXM5eThtOHA5dDhvOHQ5aThjLgorLmFzOHk4bjljOGg4cjhvOW44bzh1OHMuCisuYXN5bjNjNGhyNAorLmFzeW4yY2gKKy5hc3luY2hybzJuCisuYXN5bmNocm8xbm91MgorLmFzeW5jaHJvbm8ydXMKKy5hdDhoOWU4cjlvOXM4YzhsOGU5cjhvOXM4aThzLgorLjRhdGgKKy5hdGgyZQorLmF0aDJlcm8KKy5hdGhlcm9zMmMKKy5hdGhlcm9zY2xlNQorLmF0aGVyb3MxYzRsNAorLmF0aDJlcm9zY2w0ZXJvCisuYXRoZXJvc2NsZXJvMXNpcworLmF0OW04bzhzOXA4aDhlOHI4ZS4KKy5hNHQxbQorLmF0MW1vCisuYXRtb3MyCisuYXRtbzNzcAorLmF0bW9zMnBoZQorLmF0bW8zc3BoNGVyCisuYXQ5bThvOHM5cDhoOGU4cjhlOHMuCisuYXQ5dDhyOGk4Yjl1OHQ4ZThkLgorLmE0dDN0MgorLmF0dHI0aWIKKy5hdHRyaWJ1MnQxZWQKKy5hdDl0OHI4aThiOXU4dDlhOGI4bDhlLgorLmF0dHJpNGJ1MXRhCisuYXR0cmlidTJ0YTRiCisuYXR0cmlidXRhYjJsMgorLmF1OXQ4bzltOGE5dDhpOG84bi4KKy5hdTF0bworLmF1dG8ybWEKKy5hdXRvbWExdDJpbworLmF1dG9tYXRpbzJuCisuYXU5dDhvOG05YTl0OG84bi4KKy5hdXRvbWExdG8KKy5hdXRvbWF0bzJuCisuYXU5dDhvOG05YTl0OGEuCisuYXV0b21hMnRhCisuYXU5dDhvOW44dThtOWI4ZThyOWk4bjhnLgorLmF1NXRvMm4KKy5hdXRvbjV1bQorLmF1dG9udTRtMWIKKy5hdXRvbnVtYmVyMWkKKy5hdXRvbnVtYmVyaW40ZworLmF1OXQ4bzhuOW85bThvOHU4cy4KKy5hdTR0b25vCisuYXV0b25vNG1vCisuYXV0b25vM21vMnVzCisuYXV0b25vbW91MgorLmF1OHQ4bzlyOG84dThuOGQ5aThuOGcuCisuYXV0b3JvdTIKKy5hdXRvcm91bjJkCisuYXV0b3JvdW5kMWluCisuYXY5bzhpOHI5ZDh1OXA4bzhpOHMuCisuYXZvaTQKKy5hdm80aXIKKy5hdm9pcjFkdQorLmF2b2lyNGR1cAorLmF2b2lyZHVwb2kyCisuYmE4bjhkOWw4ZThhOGQ4ZThyLgorLmI0YW5kCisuYmFuMWRsCisuYmFuZGxlMmEKKy5iYW5kbGVhMmQxCisuYmE4bjhkOWw4ZThhOGQ4ZThyOHMuCisuYmFuZGxlYWRlNHI1czIKKy5iYThuOGs5cjh1OHA4dC4KKy5iYTRuazIKKy5iYW5rcnUycDF0CisuYmE4bjhrOXI4dThwOHQ5Yzh5LgorLmJhbmtydXA0dGMKKy5iYW5rcnVwdDFjeQorLmJhOG44azlyOHU4cDh0OWM4aThlOHMuCisuYmFua3J1cHQxY2kKKy5iYW5rcnVwdGMyaWU0CisuYmE4cjlvOG44aThlOHMuCisuYjJhMnIKKy5iYTVyb25pCisuYmFybzJuCisuYmFyb24yaWU0CisuYmE4czhlOWw4aThuOGU5czhrOGk4cC4KKy5iYXNlbDJpCisuYmFzZTFsNGluZQorLmJhc2VsaTFuZXMKKy5iYXNlbGluZXNrMgorLmJhc2VsaW5lc2sxaQorLmJhc2VsaW5lc2syaTRwCisuYmE5dDhoOHk4bTllOXQ4cjh5LgorLjFiYXQKKy5iNGF0aAorLmJhdGh5bWU0CisuYmF0aHltNGV0cgorLmJhdGh5bWUzdHJ5CisuYmE4dDhoOHk5czhjOGE4cDhoOGUuCisuYmF0aHkycworLmJhdGh5czRjCisuYmF0aHlzY2E0cAorLmJhdGh5czFjYQorLmJlOGE4bjlpOGU4cy4KKy5iZWEybgorLmJlYTNuaWVzCisuYmVhbjJpZTQKKy5iZTloOGE4djlpOG84dThyLgorLmJlMWg0CisuYmVoYXYxaQorLmJlaGF2aTFvdTIKKy5iZWhhdjJpbworLmJlaGF2aTRvdXIKKy5iZTloOGE4djlpOG84dThyOHMuCisuYmVoYXZpb3U0cnMyCisuYmU4djhpOGU4cy4KKy5iZTF2aQorLmJldjJpZTQKKy5iaThiOWw4aTlvOGc5cjhhOXA4aDh5OXM4dDh5OGw4ZS4KKy5iaTJiCisuYmkxYjJsMgorLmJpYjNsaQorLmJpYmxpNW9nCisuYmlibDJpbworLmJpYmxpbzJncgorLmJpYmxpbzRnM3JhMXBoeQorLmJpYmxpb2dyYXBoeTJzCisuYmlibGlvZ3JhcGh5czF0CisuYmlibGlvZ3JhcGh5czJ0eQorLmJpYmxpb2dyYXBoeXMydHlsCisuYmk5ZDhpOGY5ZjhlOHI5ZThuOXQ4aThhOGwuCisuYjJpNGQKKy5iaTJkaQorLmJpZDFpZgorLmJpZGk0ZjFmCisuYmlkaWZmZXIxCisuYmlkaWZmZXIzZW4xdAorLmJpZGlmZmVyZW50MmkKKy5iaWRpZmZlcmVuMXQyaTFhCisuYmlkaWZmZXJlbnRpMmFsCisuYmk4ZzlnOGU4czh0LgorLmIyaWcKKy5iaTRnMWcyCisuYmlnMmdlCisuYmk4bDhsOWE4YjhsOGUuCisuMWJpbAorLmJpbGw1YWIKKy5iaWwxbAorLmJpbGxhYjJsMgorLmJpOG85bThhOHQ4aDllOW04YTh0OWk4YzhzLgorLmIyaW8KKy5iaW80bQorLmJpbzFtYQorLmJpb200YXRoMworLmJpb21hdGg1ZW0KKy5iaW9tYXRoMmUKKy5iaW9tYXRoZTFtYQorLmJpb21hdGhlbWF0MWljCisuYmlvbWF0aGVtYXRpNGMzczIKKy5iaThvOW04ZThkOWk5YzhhOGwuCisuYmlvMm1lCisuYmlvMm1lZAorLmJpb200ZWRpCisuYmlvbWVkM2kxY2EKKy5iaThvOW04ZThkOWk5YzhpOG44ZS4KKy5iaW9tZWQyaTFjaQorLmJpb21lZGkyY2luCisuYmlvbWVkaWMyaW5lCisuYmk4bzlyOGg4eTh0OGg4bThzLgorLmJpb3JoNAorLmJpb3JoeXQ0aDFtCisuYmlvcmh5dGg0bTFzMgorLmJpOHQ5bThhOHAuCisuYmkydAorLmJpNHQxbQorLmJpdDFtYQorLmJpdDRtYXAKKy5iaTh0OW04YThwOHMuCisuYml0bWEycDFzMgorLmJsOGE4bjhkOWU4ci4KKy5iMmwyCisuYjNsNGFuZAorLmJsYTJuCisuYmxhbjFkZQorLmJsOGE4bjhkOWU4czh0LgorLmJsYW5kZTRzMgorLmJsOGk4bjhkOWU4ci4KKy5ibDRpbmQKKy5ibGluMWRlCisuYmw4bzhuOGQ4ZThzLgorLmI0bG8KKy5ibG8ybgorLmJsMm9uZAorLmJsb24xZGUKKy5ibG9uZGVzMgorLmJsOHU4ZTlwOHI4aThuOHQuCisuYmx1ZXByMgorLmJsdWVwcmluNHQzCisuYmw4dThlOXA4cjhpOG44dDhzLgorLmJsdWVwcmluNHQ0czIKKy5ibzlsOG84bTllOXQ4ZThyLgorLmJvbG8ybWUKKy5ib2xvNG1ldAorLmJvbG9tZTF0ZQorLmJvOG84azlzOGU4bDhsOWU4ci4KKy4zYm9vMgorLmJvMm80aworLmJvbzRrMXMyCisuYm9va3NlbDFsCisuYm9va3NlbDJsZQorLmJvOG84azlzOGU4bDhsOWU4cjhzLgorLmJvb2tzZWxsZTRyMXMyCisuYm84bzhsOWU4YThuLgorLmJvb2xlMmEKKy5ib29sZWEybgorLmJvOG84bDllOGE4bjhzLgorLmJvb2xlYTJuMXMyCisuYm84cjluOG85bDhvOGc5aTljOGE4bC4KKy5ib3JubzQKKy5ib3JubzNsb2cxaWMKKy5ib3Jub2xvZ2kxY2EKKy5ibzh0OXU5bDhpOHM4bS4KKy5ibzF0dQorLmJvdHVsMmkKKy5ib3R1bGkyczFtCisuYnI4dThzOHE4dThlOHIuCisuYnIydXMKKy5icnVzcXUyCisuYnJ1czNxdWVyCisuYnU4ZjlmOGU4ci4KKy5idWY0ZmVyMQorLmJ1NGYxZgorLmJ1OGY5ZjhlOHI4cy4KKy5idWZmZTRyMXMyCisuYnU4czhpOGU4ci4KKy5idXM1aWU0CisuYjJ1cworLmJ1OHM4aThlOHM4dC4KKy5idXNpMWVzdAorLmJ1OHM4czhpOG44Zy4KKy5idTJzcworLmJ1czFzaQorLmJ1czJzMWluCisuYnVzczNpbmcKKy5idTh0OHQ4ZThkLgorLmJ1dDJ0MWVkCisuYnU4ejh6OXc4bzhyOGQuCisuYnU0ejF6MgorLmJ1enoxd28yCisuYnU4ejh6OXc4bzhyOGQ4cy4KKy5idXp6d29yMmQxczIKKy5jYTljOG84cDhoOW85bjh5LgorLmNhMWNvCisuY2FjMm9waAorLmNhY29waG81bnkKKy5jYWNvcGhvMm4KKy5jYTljOG84cDhoOW85bjhpOGU4cy4KKy5jYWNvNXBob25pCisuY2Fjb3Bob24yaWU0CisuY2E4bDhsOWU4ci4KKy5jYWwxbAorLmNhbDJsZQorLmNhOGw4bDllOHI4cy4KKy5jYWxsZTRyMXMyCisuY2E4bTllOHI4YTltOGU4bi4KKy5jYW01ZXIxYQorLmNhbWVyYTFtZW4KKy5jYThyOHQ5dzhoOGU4ZThsLgorLmNhcnR3NAorLmNhOHI4dDl3OGg4ZThlOGw4cy4KKy5jYXJ0d2hlZTJsMXMyCisuY2E5dDhhOHI4cjhoOHMuCisuY2EydGEKKy5jYXQyYTJyCisuY2F0YXIxcjQKKy5jYXRhcnJoNAorLmNhdGFycjRoMXMyCisuY2E4dDlhOXM4dDhyOG84cDhoOWk4Yy4KKy5jYXRhczF0NHIKKy5jYXRhc3RyMm9waAorLmNhdGFzdHJvcGgxaWMKKy5jYTh0OWE5czh0OHI4bzhwOGg5aTljOGE4bDhsOHkuCisuY2F0YXN0cm9waGkxY2EKKy5jYXRhc3Ryb3BoaWNhbDFsCisuY2F0YXN0cm9waGljYWwxbHkKKy5jYTh0OWU5bjhvOGk4ZC4KKy5jYXQ0ZW5vCisuY2F0ZW5vaTIKKy5jYXRlbm8yaWQKKy5jYTh0OWU5bjhvOGk4ZDhzLgorLmNhdGVub2kyZDFzMgorLmNhOHU5bDhpOWY4bDhvOHc5ZThyLgorLmNhdTRsMgorLmNhdWwyaQorLmNhdWxpNGY0bDIKKy5jYXVsaWZsb3cxZXIKKy5jaDhhOHA5YThyOXI4YThsLgorLmNoYXAyYTJyNAorLmNoYTFwYQorLmNoYXBhcjFyNAorLmNoOGE4cjl0OHI4ZTh1OHM4ZS4KKy5jaDJhMnIKKy5jaGFydHI0ZXUyCisuY2hhcnRyZTJ1czQKKy5jaDhlOG04bzl0OGg4ZThyOWE4cDh5LgorLmNoZTIKKy5jaGUxbW8KKy5jaGVtNG90aDMKKy5jaGVtb3RoMmUKKy5jaGVtb3RoNGVyMWEKKy5jaGVtb3RoZXJhM3AKKy5jaDhlOG04bzl0OGg4ZThyOWE5cDhpOGU4cy4KKy5jaGVtb3RoZXJhcDJpZTQKKy5jaDhsOG84cjhvOW04ZTh0OGg5YThuOGUuCisuYzRoMWw0CisuY2gybG8KKy5jaGxvcm8ybWUKKy5jaGxvcm80bWV0CisuY2hsb3JvbWV0aGEybjQKKy5jaDhsOG84cjhvOW04ZTh0OGg5YThuOGU4cy4KKy5jaGxvcm9tZXRoYTFuZXMKKy5jaDhvOWw4ZThzOXQ4ZThyOGk4Yy4KKy4zY2hvMgorLmMzaG9sNGUKKy5jaG9sZXMyCisuY2hvbGVzMXRlcjFpCisuY2k4ZzlhOXI4ZTh0OHQ4ZS4KKy5jMmlnCisuY2kxZ2EKKy5jaWcyYTJyCisuY2lnYXJlNHQzdDIKKy5jaThnOWE5cjhlOHQ4dDhlOHMuCisuY2lnYXJldDR0ZXMKKy5jaThuOHE4dThlOWY4bzhpOGwuCisuMmNpbgorLmNpbjFxCisuY2lucXUyCisuY2lucXVlMWYKKy5jaW5xdWUxZm8KKy5jaW5xdWVmb2kyCisuY285YThzOHM4bzljOGk4YTl0OGk4djhlLgorLmM0b2EKKy5jb2Eyc3MKKy5jb2FzMXNvCisuY29hc3NvMWNpCisuY29hc3NvM2MyaTFhCisuY29hc3NvY2k0YTF0Mml2CisuY285ZzhuOGE4Yy4KKy4yY29nCisuY29nMW40YQorLmNvOWc4bjhhOGM4cy4KKy5jb2duYTRjM3MyCisuY285azhlOHI5bjhlOGwuCisuYzJvaworLmNvazFlcgorLmNva2VyM25lbAorLmNvOWs4ZThyOW44ZThsOHMuCisuY29rZXJuZTJsMXMyCisuY284bDlsOGk4bjllOGE5dDhpOG84bi4KKy5jb2wxbAorLmNvbGwyaQorLmNvbDJsaW40CisuY29sMWw0aW5lCisuY29sbGluM2VhCisuY29sbGluZWEydAorLmNvbGxpbmVhMXQyaW8KKy5jb2xsaW5lYXRpbzJuCisuY284bDl1OG04bjhzLgorLmNvbHU0bTFuCisuY29sdW0ybjFzMgorLmNvOG05cDhhOHI5YThuOGQuCisuY280bTFwCisuY29tcGFyYTUKKy5jb20xcGEKKy5jb21wMmEycgorLmNvbXBhcmEybgorLmNvbXBhcjRhbmQKKy5jbzhtOXA4YThyOWE4bjhkOHMuCisuY29tcGFyYW4yZDFzMgorLmNvOG05cDhlOG45ZDhpOHU4bS4KKy5jb21wZW5kaTF1CisuY284bTlwOG85bjhlOG44dDl3OGk4czhlLgorLmNvbXBvMm4KKy5jb21wbzNuZW4KKy5jb21wb25lbjF0CisuY29tcG9uZW50dzQKKy5jb21wb25lbnR3aXM0CisuY29tcG9uZW50d2kyCisuY29tcG9uZW50M3c0aXNlCisuY284bThwOXQ4cjhvOGw5bDhlOHIuCisuY29tcDR0cgorLmNvbTJwMXQKKy5jb21wdHJvbDFsCisuY29tcHRyb2wybGUKKy5jbzhtOHA5dDhyOG84bDlsOGU4cjhzLgorLmNvbXB0cm9sbGU0cjFzMgorLmNvOG45ZjhvOHI4bTlhOGI4bDhlLgorLmNvMm4KKy5jb24zZgorLmNvbjFmbworLmNvbmZvMnIKKy5jb25mb3IxbQorLmNvbmZvcjFtYQorLmNvbmZvcjJtYWIKKy5jb25mb3JtYWIybDIKKy5jbzhuOWY4bzhyOG05aThzOHQuCisuY29uZm9yMm1pCisuY29uZm9ybTJpcworLmNvOG45ZjhvOHI4bTlpOHM4dDhzLgorLmNvbmZvcm1pczR0MXMyCisuY284bjlmOG84cjhtOWk4dDh5LgorLmNvbmZvcjNtaXQKKy5jb25mb3JtaTF0eQorLmNvOG45ZzhyOGU4czhzLgorLmNvbjNnCisuY29uMWdyCisuY29uZ3IyZTJzcworLmNvOG45ZzhyOGU4czhzOGU4cy4KKy5jb25ncmVzczFlNHMKKy5jbzhuOXQ4cjhpOGI5dTh0OGUuCisuY29uNXQKKy5jb250cjRpYgorLmNvOG45dDhyOGk4Yjl1OHQ4ZThzLgorLmNvOG45dDhyOGk4Yjl1OHQ4ZThkLgorLmNvbnRyaWJ1MnQxZWQKKy5jbzlyOGU5bDhhOXQ4aThvOG4uCisuY29yZTFsYQorLmNvcmVsYTF0MmlvCisuY29yZWxhdGlvMm4KKy5jbzlyOGU5bDhhOXQ4aThvOG44cy4KKy5jb3JlbGF0aW8ybjNzMgorLmNvOXI4ZTlsOGk5ZzhpOG84bjlpOHM4dC4KKy5jb3JlMWwyaQorLmNvcmVsMmlnCisuY29yZWw0aWdpCisuY29yZWxpNWcyaW8KKy5jb3JlbGlnaW9uM2kKKy5jb3JlbGlnaW8ybgorLmNvcmVsaWdpb24xaXMKKy5jbzlyOGU5bDhpOWc4aThvOG45aThzOHQ4cy4KKy5jb3JlbGlnaW9uaXM0dDFzMgorLmNvOXI4ZTlvOHA5czhpOHMuCisuY29yZTFvCisuY29yZW8ycDFzMgorLmNvcmVvcDFzaXMKKy5jbzlyOGU5czhwOG84bjlkOGU4bjh0LgorLmNvcmUxc3AKKy5jb3JlczRwbzJuCisuY29yZXNwMm9uZAorLmNvcmVzcG9uMWRlCisuY29yZXNwb24xZGVuCisuY29yZXNwb25kZW4xdAorLmNvOXI4ZTlzOHA4bzhuOWQ4ZThuOHQ4cy4KKy5jb3Jlc3BvbmRlbjR0NHMyCisuY285czhlOWM4YThuOHQuCisuY29zNGUKKy5jb3NlMWNhCisuY29zZWNhMm4KKy5jb3NlY2FuMXQKKy5jbzl0OGE4bjlnOGU4bjh0LgorLmNvNHRhMm4KKy5jbzF0YQorLmNvdDJhbmcKKy5jb3RhbjFnZW4KKy5jb3RhbmdlbjF0CisuY284dThyOXM4ZThzLgorLmNvdTIKKy5jb3U0cnMyCisuY291cjJzZQorLmNvdXJzM2U0cworLmNvOXc4bzhyOGs5ZThyLgorLmNvNHdvMgorLmNvd29yazFlcgorLmNvOXc4bzhyOGs5ZThyOHMuCisuY293b3JrZTRyMXMyCisuY3I4YThuOGs5YzhhOHM4ZS4KKy5jcmEybgorLmNyYTRuazIKKy5jcmFuazFjYQorLmNyOGE4bjhrOXM4aDhhOGY4dC4KKy5jcmFuNGsxczIKKy5jcmFua3MyaAorLmNyYW5rc2hhMmYKKy5jcmFua3NoYTJmdAorLmNyOG84YzlvOWQ4aThsOGUuCisuY3Iyb2MKKy5jcm80Y29kCisuY3JvMWNvCisuY3I4bzhjOW85ZDhpOGw4ZThzLgorLmNyb2NvZGlsZXMyCisuY3I4bzhzOHM5aDhhOHQ4YzhoLgorLmNybzJzNHMKKy5jcm9zczJoCisuY3Jvc3NoYTR0YworLmNyb3NzaGF0NGNoCisuY3I4bzhzOHM5aDhhOHQ4YzhoOGU4ZC4KKy5jcm9zc2hhdGNoZTIKKy5jcm9zc2hhdDRjaDRlZAorLmNyOG84czhzOW84djhlOHIuCisuY3JvczFzbworLmNyb3M0c292CisuY3I4eThwOXQ4bzlnOHI4YThtLgorLmNyeTJwMXQKKy5jcnlwMXRvCisuY3J5cHRvMmdyCisuY3I4eThwOXQ4bzlnOHI4YThtOHMuCisuY3J5cHRvZ3JhNG0xczIKKy5jdThmOGY5bDhpOG44ay4KKy5jNHVmCisuY3U0ZjFmCisuY3VmZjRsMgorLmN1ZmZsaW40CisuY3VmZmw0aTRuazIKKy5jdThmOGY5bDhpOG44azhzLgorLmN1ZmZsaW40azFzMgorLmN1OW44ZThpOWY4bzhyOG0uCisuM2N1bgorLmN1Mm5lCisuY3VuZWkyCisuY3VuZWkxZm8KKy5jdW5laWZvMnIKKy5jdW5laWZvcjFtCisuY3U4czl0OG84bTlpOHo5YTliOGw4ZS4KKy4xYzJ1cworLmN1czF0bworLmN1c3RvbTJpegorLmN1c3RvbWl6YTEKKy5jdXN0b21pejVhMmIKKy5jdXN0b21pemFiMmwyCisuY3U4czl0OG84bTlpOHo4ZS4KKy5jdXN0b21pMnplCisuY3U4czl0OG84bTlpOHo4ZThzLgorLmN1OHM5dDhvOG05aTh6OGU4ZC4KKy5kYThjOGg4czloOHU4bjhkLgorLjFkMmEKKy5kYTJjaDQKKy5kYWM0aDFzMgorLmRhY2g0czJoCisuZGE4bTlzOGU4bDlmOGw4eS4KKy5kYTJtMgorLmRhNG0xczIKKy5kYW01c2UybDJmCisuZGFtc2VsZjRsMgorLmRhbXNlbGYybHk1CisuZGE4bTlzOGU4bDlmOGw4aThlOHMuCisuZGFtc2VsZmwyaWU0CisuZGE4Yzh0OHk4bDlvOWc4cjhhOG0uCisuZGEyYzF0CisuZGFjMXR5CisuZGFjMnR5bAorLmRhY3R5M2xvCisuZGFjdHlsbzFncgorLmRhOGM4dDh5OGw5bzlnOHI4YThwOGguCisuZGE4dDhhOWI4YThzOGUuCisuM2RhdAorLmRhMnRhCisuZGEydGFiCisuZGE4dDhhOWI4YThzOGU4cy4KKy5kYXRhYmFzMWU0cworLmRhOHQ4YTlwOGE4dDhoLgorLmRhdDVhcAorLmRhdGFwNWF0CisuZGF0YTFwYQorLmRhdGFwNGF0aAorLmRhOHQ4YTlwOGE4dDhoOHMuCisuZGF0YXBhMnQ0aDFzMgorLmRhOHQ4ZTlzOHQ4YThtOHAuCisuZGF0M2VzdAorLmRhdGVzMXRhCisuZGF0ZXN0YTRtMXAKKy5kYTh0OGU5czh0OGE4bThwOHMuCisuZGF0ZXN0YW0ycDFzMgorLmRlOWM4bDhhOHI5YThiOGw4ZS4KKy5kZTRjbDJhMnIKKy5kZWNsYTJyYWIKKy5kZWNsYXJhYjJsMgorLmRlOWY4aThuOWk5dDhpOHY4ZS4KKy5kZTFmCisuZGUxZmkKKy5kZTJmaW4KKy5kZWYyaW5pCisuZGVmaW4yaXQKKy5kZWZpbmkxdGkKKy5kZWZpbmkxdDJpdgorLmRlOWw4ZThjOXQ4YTliOGw4ZS4KKy5kNWVsZWMKKy5kZWxlMmMxdAorLmRlbGVjMnRhNGIKKy5kZWxlYzF0YQorLmRlbGVjdGFiMmwyCisuZGU4bThpOXM4ZThtOGk5cTh1OGE5djhlOHIuCisuZGU0bTJpcworLmRlbTRpc2UKKy5kZW1pc2VtaTNxdWEKKy5kZW1pc2VtaXF1MgorLmRlbWlzZW1pcXVhNXY0CisuZGU4bThpOXM4ZThtOGk5cTh1OGE5djhlOHI4cy4KKy5kZW1pc2VtaXF1YXZlNHIxczIKKy5kZTltOG84YzlyOGE5dDhpOHM4bS4KKy5kZTRtb2NyCisuZGVtb2NyYXRpMnM0bQorLmRlOG04bzhzLgorLmRlbW9zMgorLmRlOXI4aTh2OWE5dDhpOHY4ZS4KKy5kZXIyaTR2CisuZGU0cmkxdmEKKy5kZXJpM3ZhdAorLmRlcjJpdmExdDJpdgorLmRlOXI4aTh2OWE5dDhpOHY4ZThzLgorLmRlcml2YXRpdjRlMnMKKy5kaThhOWw4ZThjOXQ4aThjLgorLjFkNGkzYQorLmRpMmFsCisuZGkyYWxlCisuZGlhbGUyYzF0CisuZGk4YTlsOGU4Yzl0OGk4YzhzLgorLmRpYWxlY3RpNGMzczIKKy5kaThhOWw4ZThjOXQ4aTljOGk4YThuLgorLmRpYWxlY3QyaTFjaQorLmQyaTFhbGVjdGkzYzJpMWEKKy5kaWFsZWN0aWNpMmEybgorLmRpOGE5bDhlOGM5dDhpOWM4aThhOG44cy4KKy5kaWFsZWN0aWNpYTJuMXMyCisuZGk5YzhoOGw4bzhyOG85bThlOHQ4aDlhOG44ZS4KKy5kNGkyY2gKKy5kaWM0aDFsNAorLmRpY2gybG8KKy5kaWNobG9ybzJtZQorLmRpY2hsb3JvNG1ldAorLmRpY2hsb3JvbWV0aGEybjQKKy5kaThmOWY4cjhhOGM4dC4KKy5kMWlmCisuZGlmNGZyCisuZGk0ZjFmCisuZGlmZnJhMmMxdAorLmRpOGY5ZjhyOGE4Yzh0OHMuCisuZGlmZnJhYzR0MXMyCisuZGk4ZjlmOHI4YThjOXQ4aThvOG4uCisuZGlmZnJhYzF0MmlvCisuZGlmZnJhY3RpbzJuCisuZGk4ZjlmOHI4YThjOXQ4aThvOG44cy4KKy5kaWZmcmFjdGlvMm4zczIKKy5kaThyOGU4ci4KKy5kNGlyMgorLmRpMXJlCisuZGlyMWVyNAorLmRpOHI4ZTluOGU4czhzLgorLmRpcmUxbmVzCisuZGlyZW4yZTJzcworLmRpOHM5cDhhOHI5YThuOGQuCisuZGlzMQorLmRpczFwCisuZGkyczFwYQorLmRpc3AyYTJyCisuZGlzcGFyYTJuCisuZGlzcGFyNGFuZAorLmRpOHM5cDhhOHI5YThuOGQ4cy4KKy5kaXNwYXJhbjJkMXMyCisuZGk4czl0OHI4YTh1OGc4aDh0OWw4eS4KKy5kNGlzM3QKKy5kaXN0NHIKKy5kaXMxdHJhCisuZGlzdHJhdWdoMworLmRpc3RyYXVnaDJ0bAorLmRpc3RyYXVnaHQxbHkKKy5kaThzOXQ4cjhpOGI5dTh0OGUuCisuZGlzdHI0aWIKKy5kaThzOXQ4cjhpOGI5dTh0OGU4cy4KKy5kaThzOXQ4cjhpOGI5dTh0OGU4ZC4KKy5kaXN0cmlidTJ0MWVkCisuZG84dTliOGw4ZTlzOHA4YThjOGUuCisuZG91MgorLmRvdTNiMmwyCisuZG91NWJsZTFzcAorLmRvdWJsZXMyCisuZG91YmxlMnMxcGEKKy5kb3VibGVzcGE0Y2UKKy5kbzh1OWI4bDhlOXM4cDhhOGM5aThuOGcuCisuZG91Ymxlc3A0YTJjaQorLmRvdWJsZXNwYTJjMWluCisuZG91Ymxlc3BhYzFpbmcKKy5kbzhsOGw5aThzOGguCisuZG9sMWwKKy5kb2xsMmkKKy5kb2xsaXMyaAorLmRyOGk4Zjh0OWE4ZzhlLgorLjFkcgorLmRyNGkyZnQKKy5kcmlmMXRhCisuZHI4aTh2OWU4cjhzLgorLmRyMml2CisuZHJpdmU0cjFzMgorLmRyOG84bTllOWQ4YThyOHkuCisuZHJvMm1lCisuZHJvMm1lZAorLmRyb20yZTJkMmEKKy5kcm9tZTRkYXJ5CisuZHJvbWVkMmEycgorLmRyOG84bTllOWQ4YThyOGk4ZThzLgorLmRyb21lZGFyMWkKKy5kcm9tZWRhcjJpZTQKKy5kdTlvOHA5bzlsOGk4czh0LgorLmR1b3BvbDJpCisuZHU5bzhwOW85bDhpOHM4dDhzLgorLmR1b3BvbGlzNHQxczIKKy5kdTlvOHA5bzhsOHkuCisuZHVvcG8ybHkKKy5keThzOWw4ZTh4OGk4YS4KKy5kMnkKKy5keXMxbDIKKy5keXMybGUKKy5keXNsZXgzaQorLmR5c2xleDJpNWEKKy5keThzOWw4ZThjOXQ4aThjLgorLmR5c2xlMmMxdAorLmVhOHM4dDllOG44ZDllOHI4cy4KKy5lYXN0MworLmVhczN0ZW4KKy5lYXMzdGVuZAorLmVhc3RlbjFkZQorLmVhc3RlbmRlNHI1czIKKy5lYzhvOW44bzhtOWk4YzhzLgorLmUxY28KKy5lY28ybgorLmVjbzNub21pYworLmVjb25vbWk0YzNzMgorLmVjOG84bjlvOW04aThzOHQuCisuZWNvbm9tMmlzCisuZWM4bzhuOW85bThpOHM4dDhzLgorLmVjb25vbWlzNHQxczIKKy5laTlnOGU4bjljOGw4YThzOHMuCisuZWkyCisuZTJpZzIKKy5laTFnZW4KKy5laWdlbjFjNGw0CisuZWlnZW5jbGEyc3MKKy5laTlnOGU4bjljOGw4YThzOHM4ZThzLgorLmVpZ2VuY2xhc3MxZTRzCisuZWk5ZzhlOG45djhhOGw5dThlLgorLmVpZ2VuMXYyCisuZWlnZW4xdmEKKy5laWdlbnZhbDF1CisuZWk5ZzhlOG45djhhOGw5dThlOHMuCisuZWw4ZThjOHQ4cjhvOW04ZThjOGg4YThuOWk5YzhhOGwuCisuNWVsZWMKKy5lbGUyYzF0CisuZWxlY3RybzJtZQorLmVsZWN0cm9tZTJjaAorLmVsZWN0cm9tZTVjaGE0bjFpYworLmVsZWN0cm9tZWNoYTJuCisuZWxlY3Ryb21lY2hhbmkxY2EKKy5lbDhlOGM4dDhyOG85bThlOGM4aDhhOG44bzlhOGM4bzh1OHM4dDhpOGMuCisuZWxlY3Ryb21lY2hhbm80CisuZWxlY3Ryb21lY2hhbjRvYQorLmVsZWN0cm9tZWNoYW5vYTFjbworLmVsZWN0cm9tZWNoYW5vYWNvdTIKKy5lbGVjdHJvbWVjaGFub2FjbzJ1cworLmVsZWN0cm9tZWNoYW5vYWNvdXN0MmkKKy5lbGVjdHJvbWVjaGFub2Fjb3VzMXRpYworLmVsOGk4dDlpOHM4dC4KKy5lbDJpCisuZWwxaXQKKy5lbGkxdGkKKy5lbDRpdGlzCisuZWw4aTh0OWk4czh0OHMuCisuZWxpdGlzNHQxczIKKy5lbjl0OHI4ZTlwOHI4ZTluOGU4dThyLgorLmVuMXQKKy5lbnRyZXByMgorLmVudHJlcHJlbjRldQorLmVuOXQ4cjhlOXA4cjhlOW44ZTh1OHI5aThhOGwuCisuZW50cmVwcmVuZXVyMmkzYQorLmVudHJlcHJlbmV1cmkyYWwKKy5lcDlpOW44ZThwOGg5cjhpOG44ZS4KKy5lcGkybgorLmVwMmluZQorLmVwaW5lcDRocjQKKy5lcDJpbmVwaHIyaW40ZQorLmVxOHU4aTl2OGE4cjhpOWE4bjh0LgorLmVxdTJpdjMKKy5lcXVpMXZhCisuZXF1aXYyYTJyCisuZXF1aXZhcjFpCisuZXF1aXZhcjNpMmEybgorLmVxdWl2YXIyaTNhCisuZXF1aXZhcjRpYW40dAorLmVxOHU4aTl2OGE4cjhpOWE4bjhjOGUuCisuZXF1aXZhcjRpYW5jCisuZXQ4aDlhOG44ZS4KKy5ldGhhMm40CisuZXQ4aDl5OGw5ZThuOGUuCisuZXY4ZThyOXM4aTliOGw4ZS4KKy5ldjFlcgorLmV2ZTRyMXMyCisuZXZlcjFzaQorLmV2ZXI0c2k0YgorLmV2ZXJzaTFiMmwyCisuZXY4ZThyOHQuCisuZXY4ZThyOHQ4cy4KKy5ldmVyNHQxczIKKy5ldjhlOHI4dDllOGQuCisuZXZlcjJ0MWVkCisuZXY4ZThyOHQ5aThuOGcuCisuZXZlcjF0aQorLmV2ZXIydDFpbgorLmV4OXE4dThpOHM5aTh0OGUuCisuZXhxdTIKKy5leHEydWkyCisuZXhxdWlzMml0ZQorLmV4OXQ4cjhhOW84cjlkOGk5bjhhOHI4eS4KKy5leDF0MgorLmV4MXRyYQorLmV4dHI0YW8KKy5leHRyYW9yZDJpCisuZXh0cmFvcmQxaW40CisuZXh0cmFvcjFkaTFuYQorLmV4dHJhb3JkaW4yYTJyCisuZmE4bDhsOWk4bjhnLgorLjFmYQorLmZhbDFsCisuZmFsbDJpCisuZmFsMmxpbjQKKy5mZThyOG04aTlvOG44cy4KKy5mZXIxCisuZmVyM200CisuZmVyNG0yaW8KKy5mZXJtaW8ybgorLmZlcm1pbzJuM3MyCisuZmk5bjhpOHQ4ZTlsOHkuCisuMWZpCisuMmZpbgorLmYyaW5pCisuZmluMml0CisuZmluMml0ZQorLmZpbml0ZTFseQorLmZsOGE5ZzhlOGw5bDh1OG0uCisuZjRsMgorLmZsYWc1ZWwxbAorLmZsOGE5ZzhlOGw5bDhhLgorLmZsYWc0ZWxsYQorLmZsOGE4bTltOGE5YjhsOGU4cy4KKy5mbGFtMW0KKy5mbGFtMW1hCisuZmxhbTJtYWIKKy5mbGFtbWFiMmwyCisuZmxhbW1hYmxlczIKKy5mbDhlOGQ4ZzlsOGk4bjhnLgorLmZsZWRnbDIKKy5mbDhvOHc5YzhoOGE4cjh0LgorLmZsb3cyY2gKKy5mbG93Y2gyYTJyCisuZmw4bzh3OWM4aDhhOHI4dDhzLgorLmZsb3djaGFyNHQxczIKKy5mbDh1OG84cjhvOWM4YThyOWI4bzhuLgorLmZsdTNvCisuZmx1bzNyCisuZmx1b3Iyb2MKKy5mbHVvcm8xY2EKKy5mbHVvcm9jMmEycgorLmZsdW9yb2NhcjFiCisuZmx1b3JvY2FyYjRvCisuZmx1b3JvY2FyYm8ybgorLmZvOHI5bThpOWQ4YTliOGw4ZS4KKy5mb3IybWkKKy5mb3JtaTFkNGEKKy5mb3JtMmlkCisuZm9ybWkyZDNhNGIKKy5mb3JtaWRhYjJsMgorLmZvOHI5bThpOWQ4YTliOGw4eS4KKy5mb3JtaWRhYjFseQorLmZvOHI5czh5OHQ4aDlpOGEuCisuZm80cnMyCisuZm9yczR5CisuZm9yc3l0aDJpMWEKKy5mbzhyOHQ4aDlyOGk4ZzhoOHQuCisuZm9ydDRocjQKKy5mb3J0aHIyaWcKKy5mcjhlOGU5bDhvOGE4ZDhlOHIuCisuZnJlZWw0b2EKKy5mcmVlbG9hMmQzCisuZnI4ZThlOWw4bzhhOGQ4ZThyOHMuCisuZnJlZWxvYWRlNHI1czIKKy5mcjhpOGU4bjhkOWw4aThlOHIuCisuZnJpMgorLmZyMmllNAorLmZyaWVuZGwyaWU0CisuZnI4aTl2OG84bDlpOHQ4eS4KKy5mcjJpdgorLmZyaXZvbDJpCisuZnJpdm9sMWl0CisuZnJpdm9saTF0eQorLmZyOGk5djhvOGw5aTl0OGk4ZThzLgorLmZyaXZvbGkxdGkKKy5mcml2b2xpdDJpZTQKKy5mcjhpOHY5bzlsOG84dThzLgorLmZyaXZvbG91MgorLmZyaXZvbG8ydXMKKy5nYTlsOGE4Yzl0OGk4Yy4KKy5nYWxhMmMxdAorLmdhOGw5YTh4OHkuCisuZ2E4bDlhOHg5aThlOHMuCisuZ2FsYXgzaQorLmdhbGF4MmllNAorLmdhOHM5bzhtOWU5dDhlOHIuCisuZ2Exc28KKy5nYTNzb20KKy5nYXNvMm1lCisuZ2FzbzRtZXQKKy5nYXNvbWUxdGUKKy5nZTlvOWQ4ZThzOWk4Yy4KKy5nZW9kZXMyCisuZ2VvZGUxc2kKKy5nZW9kZTJzaWMKKy5nZTlvOWQ4ZTh0OWk4Yy4KKy5nZW9kZTF0CisuZ2VvZGV0MWljCisuZ2U4bzltOGU4dDlyOGk4Yy4KKy5nZTNvbQorLmdlbzJtZQorLmdlbzRtZXQKKy5nZW9tNGV0cgorLmdlbzVtZXQzcmljCisuZ2U4bzltOGU4dDlyOGk4YzhzLgorLmdlb21lNHRyaTRjM3MyCisuZ2U5bzlzOHQ4cjhvOHA4aDhpOGMuCisuZ2VvczQKKy5nZW9zdDRyCisuZ2Vvc3RyMm9waAorLmdlb3N0cm9waDFpYworLmdlOG85dDhoOGU4cjltOGE4bC4KKy5nZTRvdAorLmdlNG90aAorLmdlb3RoMmUKKy5nZW90aGVyM200CisuZ2VvdGhlcjFtYQorLmdlOW84dDlyOG85cDhpOHM4bS4KKy5nZW90cm9waTJzMW0KKy5nbjhvOW04bzhuLgorLmcxbm8KKy5nbm80bW8KKy5nbm80bW8ybgorLmduOG85bThvOG44cy4KKy5nbm9tbzJuM3MyCisuZ3I4YThuOGQ5dThuOGM4bDhlLgorLjFncgorLmdyYTJuMgorLmdyNGFuZAorLmdyYW4xZHUKKy5ncmFuZHU0bgorLmdyYW5kdW4xYzRsNAorLmdyOGE4bjhkOXU4bjhjOGw4ZThzLgorLmdyYW5kdW5jbGVzMgorLmdyOGk4ZTh2OWE4bjhjOGUuCisuZ3IyaWU0CisuZ3JpZTF2YQorLmdyaWV2YTJuCisuZ3I4aThlOHY5YThuOGM4ZThzLgorLmdyOGk4ZTh2OW84dThzLgorLmdyaWV2b3UyCisuZ3JpZXZvMnVzCisuZ3I4aThlOHY5bzh1OHM5bDh5LgorLmdyaWV2b3VzMWwyCisuZ3JpZXZvdXMxbHkKKy5oYThpOHI5czh0OHk4bDhlLgorLmhhaTIKKy5oYTRpcgorLmhhaTRyczIKKy5oYWlyczJ0eQorLmhhaXJzMnR5bAorLmhhOGk4cjlzOHQ4eThsOGU4cy4KKy5oYWlyc3R5bGVzMgorLmhhOGk4cjlzOHQ4eThsOWk4czh0LgorLmhhOGk4cjlzOHQ4eThsOWk4czh0OHMuCisuaGFpcnN0eWxpczR0MXMyCisuaGE4bDhmOXM4cDhhOGM4ZS4KKy5oYTJsZgorLmhhbDJmM3MKKy5oYWxmMnMxcGEKKy5oYWxmc3BhNGNlCisuaGE4bDhmOXM4cDhhOGM4ZThzLgorLmhhOGw4Zjl3OGE4eS4KKy5oYThyOWI4aThuOWc4ZThyLgorLmgyYTJyCisuaGFyMWIKKy5oYXJiaTIKKy5oYXIyYmluCisuaGFyYjRpbmdlCisuaGE4cjliOGk4bjlnOGU4cjhzLgorLmhhcmJpbmdlNHIxczIKKy5oYThyOWw4ZTlxOHU4aThuLgorLmhhcjRsZTQKKy5oYXIxbAorLmhhcmxlMXEKKy5oYXJsZXF1MgorLmhhcmxlcTJ1aTIKKy5oYXJsZXF1aTRuCisuaGE4cjlsOGU5cTh1OGk4bjhzLgorLmhhcmxlcXUyaTJuMXMyCisuaGE4dDhjOGg5ZThyOGk4ZThzLgorLmhhNHRjCisuaGF0NGNoCisuaGF0Y2hlMgorLmhhdGNoZXIxaQorLmhhdGNoZXIyaWU0CisuaGU4bThpOWQ4ZThtOGk5czhlOG04aTlxOHU4YTl2OGU4ci4KKy5oZW0yaWQKKy5oZW1pZDRlbQorLmhlbWlkZTRtMmlzCisuaGVtaWRlbTRpc2UKKy5oZW1pZGVtaXNlbWkzcXVhCisuaGVtaWRlbWlzZW1pcXUyCisuaGVtaWRlbWlzZW1pcXVhNXY0CisuaGU4bThpOWQ4ZThtOGk5czhlOG04aTlxOHU4YTl2OGU4cjhzLgorLmhlbWlkZW1pc2VtaXF1YXZlNHIxczIKKy5oZTltOG85ZzhsOG85YjhpOG4uCisuaGVtbzRnCisuaGUxbW8KKy5oZW1vNGdsMgorLmhlbW8zZ2xvCisuaGVtb2dsbzFiaQorLmhlbW9nbG8yYmluCisuaGU5bThvOXA4aDhpOGw5aThhLgorLmhlbTJvcGgKKy5oZW1vcGg0aWwyCisuaGVtb3BoaWwxaQorLmhlbW9waGlsM2kxYQorLmhlOW04bzlwOGg4aThsOWk4YThjLgorLmhlOW04bzlwOGg4aThsOWk4YThjOHMuCisuaGVtb3BoaWxpYTRjM3MyCisuaGU4bThvOXI4aDhlOW84bDlvOGc4eS4KKy5oZW1vMnIKKy5oZW1vcmg0CisuaGVtb3JoZTNvbAorLmhlbW9yaGVvbDFvMWd5CisuaGU5cDhhOHQ5aThjLgorLmhlcDUKKy5oZTJwYQorLmhlcGF0MWljCisuaGU4cjltOGE4cDhoOXI4bzlkOGk4dDhlLgorLmhlcjNtNAorLmhlcjFtYQorLmhlcjRtYXAKKy5oZXJtYXA0aHI0CisuaGVybWFwaHJvZDJpdGUKKy5oZThyOW04YThwOGg5cjhvOWQ4aTh0OWk4Yy4KKy5oZXJtYXBocm9kMmkxdGkKKy5oZXJtYXBocm9kNGkydGljCisuaGU5cjhvOGU4cy4KKy5oZXJvNGUKKy5oZTh4OGE5ZDhlOGM5aTltOGE4bC4KKy5oZXgxYQorLmhleGEyZAorLmhleGFkZTFjMmkKKy5oZXhhZGUyYzNpbQorLmhleGFkZWNpMW1hCisuaG85bDhvOW44bzltOHkuCisuaG9sbzJuCisuaG9sb24zbzNteQorLmhvOW04ZThvOW04bzhyOXA4aDhpOGMuCisuaG8ybWUzCisuaG9tZW8xbW8KKy5ob21lb21vMnIKKy5ob21lb21vcjFwCisuaG9tZW9tb3JwNGg0CisuaG9tZW9tb3JwaDFpYworLmhvOW04ZThvOW04bzhyOXA4aDhpOHM4bS4KKy5ob21lb21vcnBoaTJzMW0KKy5obzltOG85dDhoOGU4dDhpOGMuCisuaG8xbW8KKy5ob200b3RoMworLmhvbW90aDJlCisuaG9tbzN0aGU0dAorLmhvbW90aGV0MWljCisuaG84cjhzOGU5cjhhOGQ5aThzOGguCisuaG9yNHNlCisuaG80cnMyCisuaG9yc2VyMWEKKy5ob3JzZXJhMmQKKy5ob3JzZXIyYWRpCisuaG9yc2VyYWRpczEKKy5ob3JzZXJhZGlzMmgKKy5obzh0OWI4ZThkLgorLmhvMnQxYgorLmhvdDRiZTJkCisuaG84dDliOGU4ZDhzLgorLmhvdGJlMmQxczIKKy5oeTlkOHI4bzl0OGg4ZThyOW04YThsLgorLmh5MWQKKy5oeTFkcgorLmh5ZHJvNHRoMmUKKy5oeWRyNG90aAorLmh5ZHJvdGhlcjNtNAorLmh5ZHJvdGhlcjFtYQorLmh5OXA4bzl0OGg4YThsOWE5bTh1OHMuCisuaHkzcG8KKy5oeXA0b3QKKy5oeXA0b3RoCisuaHlwb3RoYTNsYQorLmh5cG90aGFsYTNtCisuaHlwb3RoYWxhMW11CisuaHlwb3RoYWxhbTJ1cworLmlkOGU4YThsOHMuCisuaWRlM2E0bAorLmlkZWEybDFzMgorLmlkOGU4bzlnOHI4YThwOGg4cy4KKy5pZGVvMmcKKy5pZGVvMWdyCisuaWRlb2dyYTRwNGgxczIKKy5pZDhpOG85czh5OG45YzhyOGE4czh5LgorLmkyZGkKKy5pMWQzaW8KKy5pZGk0b3MKKy5pZGlvczR5CisuaWRpb3N5bjFjcgorLmlkaW9zeW5jcjJhcworLmlkaW9zeW5jcmFzNHkKKy5pZDhpOG85czh5OG45YzhyOGE5czhpOGU4cy4KKy5pZGlvc3luY3JhczJpZTQKKy5pZDhpOG85czh5OG45YzhyOGE4dDhpOGMuCisuaWRpb3N5bjVjcmF0MWljCisuaWQ4aThvOXM4eThuOWM4cjhhOHQ5aTljOGE4bDlsOHkuCisuaWRpb3N5bmNyYXRpMWNhCisuaWRpb3N5bmNyYXRpY2FsMWwKKy5pZGlvc3luY3JhdGljYWwxbHkKKy5pZzluOGk4dDllOHIuCisuMmlnCisuaWcxbmkKKy5pZ24yaXQKKy5pZ24yaXRlCisuaWc5bjhpOHQ5ZThyOHMuCisuaWduaXRlNHIxczIKKy5pZzluOGk5dDhvOHIuCisuaWduM2l0b3IKKy5pZ25pMXRvCisuaWc4bjhvOHI4ZTlzOHA4YThjOGU4cy4KKy5pZzFubworLmlnbm9yZTFzcAorLmlnbm9yZTJzMXBhCisuaWdub3Jlc3BhNGNlCisuaW05cDhlOGQ5YThuOGM4ZS4KKy5pbTJwMmVkCisuaW1wMmUyZDJhCisuaW1wZWRhMm4KKy5pbTlwOGU4ZDlhOG44YzhlOHMuCisuaW45ZDh1OWI4aTl0OGE5YjhsOGUuCisuNGluZAorLmluMWR1CisuaW5kdTFiNGkKKy5pbmR1YmkydAorLmluZHViaTF0YQorLmluZHViaTJ0YWIKKy5pbmR1Yml0YWIybDIKKy5pbjlmOGk4bjlpOHQ4ZTlsOHkuCisuaW4zZgorLmluMWZpCisuaW4yZmluCisuaW5mMmluaQorLmluZmluMml0CisuaW5maW4yaXRlCisuaW5maW5pdGUxbHkKKy5pbjlmOGk4bjlpOXQ4ZThzOWk5bThhOGwuCisuaW5maW5pdDRlcworLmluZmluaXRlMXNpCisuaW5maW5pdGUyczVpbQorLmluZmluaXRlc2kxbWEKKy5pbjlmOHI4YTlzOHQ4cjh1OGM5dDh1OHI4ZS4KKy5pbmZyMmFzCisuaW5mcmFzMXQ0cgorLmluZnJhc3RydTJjMXQKKy5pbmZyYXN0cnVjdHU0cgorLmluZnJhc3RydWMxdHUKKy5pbmZyYXN0cnVjM3R1cmUKKy5pbjlmOHI4YTlzOHQ4cjh1OGM5dDh1OHI4ZThzLgorLmluOXM4dDhhOGw4bDllOHIuCisuaW5zMnRhMmwKKy5pbnMxdGEKKy5pbnN0YWwxbAorLmluc3RhbDJsZQorLmluOXM4dDhhOGw4bDllOHI4cy4KKy5pbnN0YWxsZTRyMXMyCisuaW45dDhlOHI5ZDhpOHM5YzhpOXA4bDhpOW44YThyOHkuCisuaW4xdAorLmluNXRlcjNkCisuaW50ZXJkMmkKKy5pbnRlcmRpczEKKy5pbnRlcmQyaXMxYworLmludGVyZGlzMWNpCisuaW50ZXJkaXNjMmlwCisuaW50ZXJkaXNjaTFwMmwyCisuaW50ZXJkaXNjaXBsaTRuCisuaW50ZXJkaXNjaXBsNGkxbmEKKy5pbnRlcmRpc2NpcGxpbjJhMnIKKy5pbjl0OGU4cjlnOGE5bDhhOGM5dDhpOGMuCisuaW50ZXJnMgorLmludGVyMWdhCisuaW50ZXJnYWxhMmMxdAorLmluOXU4dDhpOGw4ZS4KKy5pbjF1CisuaW40dTF0MmkKKy5pbjl1OHQ4aThsOWk5dDh5LgorLmludXRpbDFpCisuaW51dDJpbDFpdAorLmludXRpbGkxdHkKKy5pcjlyOGU5ZDh1OGM5aThiOGw4ZS4KKy5pcjJyMmVkCisuaXJyZTFkdQorLmlycmVkdTJjCisuaXJyZWR1Y2k0YgorLmlycmVkdTFjaQorLmlycmVkdWNpMWIybDIKKy5pcjlyOGU5ZDh1OGM5aThiOGw4eS4KKy5pcnJlZHVjaWIxbHkKKy5pcjlyOGU4djlvOWM4YTliOGw4ZS4KKy5pcnJldjIKKy5pcnJlNXZvYworLmlycmV2bzFjYQorLmlycmV2b2NhMWIybDIKKy5pczhvOHQ5cjhvOHA4eS4KKy5pMnNvCisuaXNvdHJvcHk1CisuaXM4bzl0OHI4bzhwOWk4Yy4KKy5pc290cm9wM2ljCisuaXQ4aThuOWU4cjlhOHI4eS4KKy5pMXRpCisuaTJ0MWluCisuaXQyaW5lCisuaXRpbjRlcjRhMnIKKy5pdGluMWVyCisuaXRpbmVyMWEKKy5pdDhpOG45ZThyOWE4cjlpOGU4cy4KKy5pdGluZXJhcjFpCisuaXRpbmVyYXIyaWU0CisuamU5cjhlOW04aTlhOGQ4cy4KKy4xamUKKy5qZXJlbTJpM2EKKy5qZXJlbWlhMmQKKy5qZXJlbWlhMmQxczIKKy5rZTh5OW44bzh0OGUuCisua2U4eTluOG84dDhlOHMuCisua2V5bm80dGVzCisua2U4eTlzOHQ4cjhvOGs4ZS4KKy5rZXlzNAorLmtleXMxdAorLmtleXN0NHIKKy5rZXlzdHIyb2syCisua2U4eTlzOHQ4cjhvOGs4ZThzLgorLmtleXN0cm9rZXM0Cisua2k4bDhuOWk4bjhnLgorLmsxaQorLms0aTJsMW4yCisua2lsbjFpbgorLmtpbG5pbjRnCisubGE4YzlpOWU4czh0LgorLmw0YTJjaTQKKy5sYTNjMmllNAorLmxhY2kxZXN0CisubGE4bTllOG45dDhhOWI4bDhlLgorLmxhMW1lbgorLmxhM21lbjF0CisubGFtZW4ydGE0YgorLmxhbWVuMXRhCisubGFtZW50YWIybDIKKy5sYThuOGQ5czhjOGE4cDllOHIuCisuM2w0YW5kCisubGEybgorLmxhbjJkMXMyCisubGFuZHNjYTRwCisubGFuZHMxY2EKKy5sYW5kc2NhNXBlcgorLmxhOG44ZDlzOGM4YThwOWU4cjhzLgorLmxhbmRzY2FwZTRyMXMyCisubGE4cjljOGU5bjh5LgorLmwyYTJyCisubGFyMWMKKy5sYXIyY2UKKy5sYXIxY2VuNAorLmxhOHI5YzhlOW45aThzOHQuCisubGFyNGNlbmkKKy5sZThhOGY5aDhvOHA5cDhlOHIuCisubGUyYQorLmxlYTJmCisubGVhNGZoCisubGVhZmhvNHAxcAorLmxlYWZob3AycGUKKy5sZWFmaG9wM3BlcgorLmxlOGE4ZjloOG84cDlwOGU4cjhzLgorLmxlYWZob3BwZTRyMXMyCisubGU4dDl0OGU4cjlzOHA4YThjOWk4bjhnLgorLmxlNHQzdDIKKy5sZXR0ZTRyMXMyCisubGV0dGVyMXNwCisubGV0dGVyMnMxcGEKKy5sZXR0ZXJzcDRhMmNpCisubGV0dGVyc3BhMmMxaW4KKy5sZXR0ZXJzcGFjMWluZworLmxpOGY4ZTlzOHA4YThuLgorLmxpZmUxc3AKKy5saWZlMnMxcGEKKy5saWZlc3BhNG4KKy5saThmOGU5czhwOGE4bjhzLgorLmxpZmVzcGEybjFzMgorLmxpOGY4ZTlzOHQ4eThsOGUuCisubGlmZXMydHkKKy5saWZlczJ0eWwKKy5saThmOGU5czh0OHk4bDhlOHMuCisubGlmZXN0eWxlczIKKy5saThnOGg4dDl3OGU4aThnOGg4dC4KKy4zbGlnaAorLmxpZ2h0dzQKKy5saWdodHdlaTIKKy5sMmlnaHR3ZTJpZzIKKy5saThtOW84dTlzOGk4bjhlOHMuCisubGk0bW8KKy5saTNtbzJ1cworLmxpbW91MgorLmxpbW91MnMxaW4KKy5saW1vdXMyaW5lCisubGltb3VzaTFuZXMKKy5saThuOGU5YjhhOGM4azhlOHIuCisuMWw0aW5lCisubGluMmUyYgorLmxpbmViYWNrMQorLmxpbmViYWNrMWVyCisubGk4bjhlOXM4cDhhOGM4aThuOGcuCisubGkxbmVzCisubGk0bmUxc3AKKy5saW5lMnMxcGEKKy5saW5lc3A0YTJjaQorLmxpbmVzcGEyYzFpbgorLmxpbmVzcGFjMWluZworLmxpOW84bjllOHM4cy4KKy5saW8ybgorLmxpbzFuZXMKKy5saW9uMmUyc3MKKy5saTh0OGg5bzlnOHI4YThwOGg4ZThkLgorLmwyaXRoCisubGl0aG80ZworLmxpdGhvMWdyCisubGl0aG9ncmFwaDRlZAorLmxpOHQ4aDlvOWc4cjhhOHA4aDhzLgorLmxpdGhvZ3JhNHA0aDFzMgorLmxvOWI4bzh0OW84bTh5LgorLmxvYm80dG8KKy5sb2JvdG8zbXkKKy5sbzliOG84dDlvOG05aTh6OGUuCisubG9ib3RvbTJpegorLmxvYm90b21pMnplCisubG84ZzhlOHMuCisubG8xZ2UKKy5sbzhuOGc5ZThzOHQuCisuNWxvbmcKKy5sbzJuCisubG85cTh1OGE4YzlpOHQ4eS4KKy5sbzFxCisubG9xdTIKKy5sb3F1YWM0CisubG9xdTRhMmNpCisubG9xdWEyYzFpdAorLmxvcXVhY2kxdHkKKy5sbzh2OGU5czh0OHI4dThjOGsuCisuNGxvdgorLmxvdjRlMnMKKy5sb3YyZXN0NHIKKy5sb3Zlc3RydWM1CisubG92ZXN0cnVjazEKKy5tYThjOHI4bzllOGM4bzluOG84bThpOGM4cy4KKy5tYWNybzRlCisubWFjcm9lMWNvCisubWFjcm9lY28ybgorLm1hY3JvZWNvM25vbWljCisubWFjcm9lY29ub21pNGMzczIKKy5tYThsOWE5cDhyOG84cDlpOHM4bS4KKy5tYWxhcHIyCisubWFsYXByb3BpMnMxbQorLm1hOGw5YTlwOHI4bzhwOWk4czhtOHMuCisubWFsYXByb3A0aXM0bTFzMgorLm1hOG45czhsOGE4dThnOGg5dDhlOHIuCisubWEybjFzMgorLm1hbjJzMWwyCisubWFuc2xhdWdoMworLm1hOG45dTlzOGM4cjhpOHA4dC4KKy5tYW4ydXMKKy5tYW51c2MyCisubWFudXNjcmkyCisubWFudXNjcjJpcAorLm1hbnVzY3JpMnAxdAorLm1hOHI5ZzhpOG45YThsLgorLm1hcmcyCisubWFyZ2k0bgorLm1hcmdpMW5hCisubWE4dDhoOWU5bThhOXQ4aTljOGk4YThuLgorLm00YXRoMworLm1hdGg1ZW0KKy5tYXRoMmUKKy4xbWF0aGUxbWEKKy5tYXRoZW1hdDFpYworLm1hdGhlbWF0MmkxY2kKKy5tYXRoZW1hdGkzYzJpMWEKKy5tYXRoZW1hdGljaTJhMm4KKy5tYTh0OGg5ZTltOGE5dDhpOWM4aThhOG44cy4KKy5tYXRoZW1hdGljaWEybjFzMgorLm1hOHQ4dDhlOHMuCisubWF0NXRlCisubWE0dDN0MgorLm1hdDR0ZXMKKy5tZThkOWk4YzlhOGk4ZC4KKy4ybWVkCisubTRlZGkKKy5tZWQzaTFjYQorLm1lZGljYWkyCisubWVkaWNhMmlkCisubWU4ZDhpOW84YzhyOGUuCisubWUxZDJpbworLm1lZGlvY3JlMworLm1lOGQ4aTlvOGM5cjhpOXQ4aThlOHMuCisubWVkaTVvY3JpdAorLm1lZGlvY3JpMgorLm1lZGlvNWNyaTF0aQorLm1lZGlvY3JpdDJpZTQKKy5tZThnOGE5bDhpOHQ4aC4KKy5tZTJnCisubTRlZ2FsCisubWUxZ2EKKy5tZTNnYWwxaQorLm1lZ2FsMWl0CisubWVnYWwyaXRoCisubWU4ZzhhOWw4aTh0OGg4cy4KKy5tZWdhbGkydDRoMXMyCisubWU4dDhhOWI4bzhsOWk4Yy4KKy5tZTR0YQorLm1lMnRhNGIKKy5tZXRhYm9sM2ljCisubWV0YWJvbDJpCisubWU5dDhhOGI5bzlsOGk4czhtLgorLm1ldGFib2xpMnMxbQorLm1lOXQ4YThiOW85bDhpOHM4bThzLgorLm1ldGFib2w0aXM0bTFzMgorLm1lOXQ4YThiOW85bDhpOHQ4ZS4KKy5tZXRhYm81bDJpdGUKKy5tZXRhYm9sMWl0CisubWU5dDhhOGI5bzlsOGk4dDhlOHMuCisubWV0YWJvbGl0NGVzCisubWU4dDhhOWw4YThuOWc4dThhOGc4ZS4KKy5tZXQzYTJsCisubWV0YTVsYQorLm1ldGFsYTJuCisubWV0YWwyYW5nCisubWV0YWxhbjFndQorLm1ldGFsYW5ndTRhCisubWU4dDhhOWw4YThuOWc4dThhOGc4ZThzLgorLm1lOHQ4YTlwOGg4bzhyOWk4Yy4KKy5tZXRhcGhvNHIKKy5tZTh0OGg5YThuOGUuCisubWV0aGEybjQKKy5tZTl0OHI4bzhwOW85bDhpOHMuCisubTRldHIKKy5tZXRyb3BvbDJpCisubWU5dDhyOG84cDlvOWw4aThzOGU4cy4KKy5tZXRyb3BvbDRpc2UKKy5tZXRyb3BvbGlzMWU0cworLm1lOHQ5cjhvOXA4bzhsOWk5dDhhOG4uCisubWV0cm9wb2wxaXQKKy5tZXRyb3BvbGkzdGEybgorLm1ldHJvcG9saTF0YQorLm1lOHQ5cjhvOXA4bzhsOWk5dDhhOG44cy4KKy5tZXRyb3BvbGl0YTJuMXMyCisubWk4YzhyOG85ZThjOG85bjhvOG04aThjOHMuCisubTRpMWNyCisubWljcm80ZQorLm1pY3JvZTFjbworLm1pY3JvZWNvMm4KKy5taWNyb2VjbzNub21pYworLm1pY3JvZWNvbm9taTRjM3MyCisubWk5YzhyOG85ZjhpOGM4aDhlLgorLm1pY3JvMmZpCisubWljcm9mNGkyY2gKKy5taWNyb2ZpY2hlMgorLm1pOWM4cjhvOWY4aThjOGg4ZThzLgorLm1pY3JvZmljaDFlcworLm1pOGM4cjhvOW84cjhnOGE4bjlpOHM4bS4KKy5taWNyb28yCisubWljcm9vcmcyCisubWljcm9vcjFnYQorLm1pY3Jvb3JnYW41aXMKKy5taWNyb29yZ2EybgorLm1pY3Jvb3JnYW5pMnMxbQorLm1pOGM4cjhvOW84cjhnOGE4bjlpOHM4bThzLgorLm1pY3Jvb3JnYW40aXM0bTFzMgorLm1pOGw4bDlhOGc4ZS4KKy5tNGlsMWwKKy5taThsOWw4aTlsOGk4dDhlOHIuCisubWlsbDJpCisubWlsNGw0aTRsCisubWlsbGlsMWkKKy5taWxsMmlsMWl0CisubWlsbGlsMml0ZQorLm1pOG04ZThvOWc4cjhhOHA4aDhlOGQuCisubWltZW8yZworLm1pbWVvMWdyCisubWltZW9ncmFwaDRlZAorLm1pOG04ZThvOWc4cjhhOHA4aDhzLgorLm1pbWVvZ3JhNHA0aDFzMgorLm1pOG05aThjOXI4aThlOHMuCisubWltMWkKKy5taW00aTFjcgorLm1pbWljcmkyCisubWltaWNyMmllNAorLm1pOG45aThzLgorLm0yaW5pCisubWluMWlzCisubWk4bjhpOXM4eThtOXA4bzlzOGk4dThtLgorLm1pbmlzNHkKKy5taW5pc3k0bTFwCisubWluaXN5bTFwb3MKKy5taW5pc3ltcG81c2k0dQorLm1pOG44aTlzOHk4bTlwOG85czhpOGEuCisubWluaXN5bXBvczJpMWEKKy5taTluOHU4dDllOHIuCisubTRpbjF1CisubWk5bjh1OHQ5ZThzOHQuCisubWk4czljOGg4aThlOXY4bzh1OHM5bDh5LgorLm0yaXMxYworLm1pczNjaDIKKy5taXNjaDJpZTQKKy5taXNjaGlldm91MgorLm1pc2NoaWV2bzJ1cworLm1pc2NoaWV2b3VzMWwyCisubWlzY2hpZXZvdXMxbHkKKy5taTlzOGU4cjhzLgorLm00aXNlCisubWlzM2VyCisubWlzZTRyMXMyCisubWk5czhvOGc5YTltOHkuCisubWkyc28KKy5taXNvMWdhCisubWlzbzJnYW0KKy5tbzhkOWU4bDlsOGk4bjhnLgorLm1vMmQxCisubW9kZWwxbAorLm1vZGVsbDJpCisubW9kZWwybGluNAorLm1vOGw5ZTljOHU4bDhlLgorLm1vbGUxY3UKKy5tb2xlNGN1bAorLm1vbGVjdWw0ZQorLm1vOGw5ZTljOHU4bDhlOHMuCisubW9sZWN1bGVzMgorLm1vOG45YThyOGM4aDhzLgorLm1vMW4xYQorLm1vbmFyM2MKKy5tb24yYTJyCisubW9uYXIyY2gKKy5tb25hcmM0aDFzMgorLm1vOG44ZTh5OWw4ZThuOWQ4ZThyLgorLm1vbmV5bGVuMWRlCisubW84bjhlOHk5bDhlOG45ZDhlOHI4cy4KKy5tb25leWxlbmRlNHI1czIKKy5tbzhuOG85YzhoOHI4bzhtOGUuCisubW9ubzJjaDQKKy5tb25vYzRocjQKKy5tb25vY2hybzJtZQorLm1vOG44bzllOG45ZThyOWc4ZTh0OGk4Yy4KKy5tbzNub2UKKy5tb25vZW4xZXIKKy5tb25vZW5lcmcyCisubW9ub2VuZXIzZ2V0CisubW9ub2VuZXJnZXQxaWMKKy5tbzhuOW84aThkLgorLm1vbm9pMgorLm1vbm8yaWQKKy5tbzhuOG85cDhvOGw4ZS4KKy5tbzRub3AKKy5tbzhuOG85cDhvOGw4ZThzLgorLm1vbm9wb2xlczIKKy5tbzluOG84cDlvOGw4eS4KKy5tb25vcG8ybHkKKy5tbzhuOG85czhwOGw4aThuOGUuCisubW9ub3MxcDJsMgorLm1vbm9zcGxpNG4KKy5tb25vc3AxbDRpbmUKKy5tbzhuOG85czhwOGw4aThuOGU4cy4KKy5tb25vc3BsaTFuZXMKKy5tbzhuOG85czh0OHI4bzhmOGk4Yy4KKy5tb25vczV0CisubW9ub3N0NHIKKy5tb25vc3RybzJmaQorLm1vOW44bzh0OW85bjhpOGU4cy4KKy5tb25vMXRvCisubW8ybm90bzJuCisubW9ub3RvbjJpZTQKKy5tbzluOG84dDlvOW44bzh1OHMuCisubW9ubzR0b25vCisubW9ub3RvMW5vdTIKKy5tb25vdG9ubzJ1cworLm1vOXI4bzhuOWk4czhtLgorLm1vcm81bjRpcworLm1vcm8ybgorLm1vcm9uaTJzMW0KKy5tbzhzOXE4dThpOXQ4by4KKy5tb3MyCisubW9zcXUyCisubW9zcTJ1aTIKKy5tb3NxdWkxdG8KKy5tbzhzOXE4dThpOXQ4bzhzLgorLm1vc3F1aXRvczIKKy5tbzhzOXE4dThpOXQ4bzhlOHMuCisubXU4ZDlyOG84bzhtLgorLm11MWRyCisubXVkMXJvb20KKy5tdWRyb28yCisubXU4ZDlyOG84bzhtOHMuCisubXVkcm9vNG0xczIKKy5tdThsOXQ4aTlmOGE4YzllOHQ4ZThkLgorLjVtdTRsdAorLm11bDF0aTMKKy5tdWx0aWYyCisubXVsdGkxZmEKKy5tdWx0aWZhNGNlCisubXVsdGlmYWNldDQKKy5tdWx0aWZhY2UydDFlZAorLm11OGw5dDhpOXA4bDhpOGM5YThiOGw4ZS4KKy5tdWx0MmlwCisubXVsdGkxcDJsMgorLm11bHRpcGxpMWNhCisubXVsdGlwbGljYTFiMmwyCisubXU4bDh0OGk5dThzOGU4ci4KKy5tdWx0aTR1CisubXVsdGkydXMKKy5uZThvOWY4aThlOGw4ZDhzLgorLjNuZW8KKy5uZTVvZgorLm5lbzJmaQorLm5lb2YyaWU0CisubmVvZmllMmxkMworLm5lb2ZpZWwyZDFzMgorLm5lOG85bjhhOHo4aS4KKy5uZW8ybgorLm5lbzFuMWEKKy5uZW9uYTJ6MWkKKy5uZThvOW44YTh6OGk4cy4KKy5uZW9uYXo0aXMKKy5uZThwOGg5ZTh3OHMuCisubmVwaGU0CisubmU4cDhoOXI4aTh0OGUuCisubmVwNGhyNAorLm5lcGhyMml0ZQorLm5lOHA4aDlyOGk4dDhpOGMuCisubmVwaHI0aTJ0M2ljCisubmVwaHJpMXRpCisubmU4dzllOHM4dC4KKy5uZTR3CisubmV3ZXN0MworLm5lOHc4czlsOGU4dDl0OGU4ci4KKy5uZXdzNGwyCisubmV3czJsZQorLm5ld3NsZTR0M3QyCisubmU4dzhzOWw4ZTh0OXQ4ZThyOHMuCisubmV3c2xldHRlNHIxczIKKy5uaTh0OHI4bzltOGU4dDhoOWE4bjhlLgorLm4yaXQKKy5uaTN0cgorLm5pdHJvMm1lCisubml0cm80bWV0Cisubml0cm9tZXRoYTJuNAorLm5vOW44YThtOGUuCisubm80bgorLm5vMW4xYQorLm5vOG45YThyOWk4dDhoOW04ZTh0OWk4Yy4KKy5ub25hcjNpCisubm9uMmEycgorLm5vbmFyMml0aAorLm5vbmFyaXQ0aDFtCisubm9uYXJpdGhtZXQ0Cisubm9uYXJpdGhtZXQxaWMKKy5ubzhuOWU4bThlOHI5ZzhlOG44Yzh5LgorLm5vbmUxbWUKKy5ub25lbWVyZzIKKy5ub25lbWVyMWdlbgorLm5vbmVtZXJnZW4xY3kKKy5ubzhuOWU4cTh1OGk5djhhOHI4aTlhOG44YzhlLgorLm5vbmUycQorLm5vbmVxdTIKKy5ub25lcTJ1aTIKKy5ub25lcXUyaXYzCisubm9uZXF1aTF2YQorLm5vbmVxdWl2MmEycgorLm5vbmVxdWl2YXIxaQorLm5vbmVxdWl2YXIzaTJhMm4KKy5ub25lcXVpdmFyMmkzYQorLm5vbmVxdWl2YXI0aWFuYworLm5vOG44ZTl0OGg4ZTlsOGU4czhzLgorLm5vbmV0aDJlCisubm9uZXRoZTFsZXMyCisubm9uZXRoZTNsMmUyc3MKKy5ubzhuOWU4dThjOGw4aThkOWU4YThuLgorLm5vbjRldQorLm5vbmV1MWM0bDQKKy5ub25ldWNsMmlkCisubm9uZXVjbGlkZWEybgorLm5vOG45aThzOG85bThvOHI5cDhoOGk4Yy4KKy5ub241aQorLm5vbjFpcworLm5vbmkyc28KKy5ub25pM3NvbQorLm5vbmlzbzFtbworLm5vbmlzb21vMnIKKy5ub25pc29tb3IxcAorLm5vbmlzb21vcnA0aDQKKy5ub25pc29tb3JwaDFpYworLm5vOG45cDhzOGU4dThkOG85YzhvOG05cDhhOGM4dC4KKy5ub24xcDQKKy5ub24ycDFzMgorLm5vbnAyc2UKKy5ub25wczRldQorLm5vbnBzZXUxZG8KKy5ub25wc2V1ZG8xY28KKy5ub25wc2V1ZG9jbzRtMXAKKy5ub25wc2V1ZG9jb20xcGEKKy5ub25wc2V1ZG9jb21wYTJjNHQKKy5ubzhuOXM4bThvOG84dDhoLgorLm5vMm4zczIKKy5ub24yczNtCisubm9uczFtbworLm5vbnNtb28yCisubm9uc21vNG90aAorLm5vOG45dThuOGk5ZjhvOHI4bS4KKy5ubzNudTRuCisubm9udTFuaQorLm5vbnVuaTFmbworLm5vbnVuaWZvMnIKKy5ub251bmlmb3IxbQorLm5vOG45dThuOGk5ZjhvOHI4bTlsOHkuCisubm9udW5pZm9yNG0xbAorLm5vbnVuaWZvcm0xbHkKKy5ubzhyOWU4cDlpOW44ZThwOGg5cjhpOG44ZS4KKy5ub3JlNXBpMm4KKy5ub3JlcDJpbmUKKy5ub3JlcGluZXA0aHI0Cisubm9yZXAyaW5lcGhyMmluNGUKKy5ubzh0OXc4aTh0OGg5czh0OGE4bjhkOWk4bjhnLgorLm5vdHc0Cisubm90d2kyCisubm90dzJpdGgzCisubm90d2kydDRoMXMyCisubm90d2l0aDVzdDRhbmQKKy5ub3R3aXRoczF0YQorLm5vdHdpdGhzdGEybgorLm5vdHdpdGhzdGFuZDFpbgorLm51OWM4bDhlOG85dDhpOGQ4ZS4KKy5udWNsZTMKKy5udTFjNGw0CisubnVjbGU0b3QKKy5udWNsZW90MmlkCisubnU5YzhsOGU4bzl0OGk4ZDhlOHMuCisubnVjbGVvdGlkZTRzMgorLm51OHQ5YzhyOGE4YzhrOWU4ci4KKy5udTR0YworLm51dGNyYWNrMQorLm51dGNyYWNrMWVyCisubnU4dDljOHI4YThjOGs5ZThyOHMuCisubnV0Y3JhY2tlNHIxczIKKy5vZThyOXM4dDhlOGQ4cy4KKy5vM2VyCisub2U0cjFzMgorLm9lcnM0dDFlZAorLm9lcnN0ZTJkMXMyCisub2Y4ZjlsOGk4bjhlLgorLm80ZjFmCisub2ZmNGwyCisub2ZmbGluNAorLm9mZjFsNGluZQorLm9mOGY5bDhvOGE4ZC4KKy5vZmZsNG9hCisub2ZmbG9hMmQzCisub2Y4ZjlsOG84YThkOHMuCisub2ZmbG9hMmQxczIKKy5vZjhmOWw4bzhhOGQ4ZThkLgorLm9mZmxvYTJkMWVkCisub2w4aTlnOG84cDlvOWw4aThzOHQuCisub2wyaQorLm9sMmlnCisub2xpMmdvCisub2wyaWdvcG9sMmkKKy5vbDhpOWc4bzhwOW85bDhpOHM4dDhzLgorLm9saWdvcG9saXM0dDFzMgorLm9sOGk5ZzhvOHA5bzhsOHkuCisub2xpZ29wbzJseQorLm9sOGk5ZzhvOHA5bzhsOWk4ZThzLgorLm9saWdvcG9sMmllNAorLm9wOWU4cjlhOG44ZC4KKy5vcDFlcgorLjNvcGVyMWEKKy5vcDRlcjRhbmQKKy5vcGVyYTJuCisub3A5ZThyOWE4bjhkOHMuCisub3BlcmFuMmQxczIKKy5vcjhhOG44Zzl1OHQ4YThuLgorLm9yYTJuCisub3IyYW5nCisub3JhbjFndQorLm9yYW40Z3U0dAorLm9yYW5ndTF0YQorLm9yYTJuZ3V0YTJuCisub3I4YThuOGc5dTh0OGE4bjhzLgorLm9yYW5ndXRhMm4xczIKKy5vcjl0OGg4bzlkOG84bjl0OGk4czh0LgorLm9ydGhvMmRvNAorLm9ydGhvZG8ybgorLm9ydGhvZG9uM3Q0aQorLm9ydGhvZG9uMXQKKy5vcjl0OGg4bzlkOG84bjl0OGk4czh0OHMuCisub3J0aG9kb250aXM0dDFzMgorLm9yOXQ4aDhvOWs4ZThyOWE5dDhvOGw5bzhnOHkuCisub3J0aDJvaworLm9ydGhvazFlcgorLm9ydGhva2VyMWEKKy5vcnRob2tlcmExdG8KKy5vcnRob2tlcmF0b2wxbzFneQorLm9yOHQ4aDhvOW44aTh0OHI4bzl0OG84bDh1OGU4bjhlLgorLm9ydGhvMm4KKy5vcnRob24yaXQKKy5vcnRob25pM3RyCisub3J0aG9uaXRybzF0bworLm9ydGhvbml0cm90b2x1M2VuCisub3J0aG9uaXRyb3RvbHU0ZW5lCisub3Y4ZThyOXY4aThlOHcuCisub3ZlcnYyaWU0Cisub3Y4ZThyOXY4aThlOHc4cy4KKy5veDlpOGQ5aThjLgorLm94M2kKKy5veGk1ZGkKKy5veDJpZAorLnBhOGQ5ZDhpOG44Zy4KKy4xcGEKKy5wNGEyZAorLnBhZDRkMWluCisucGFkMWQ0CisucGE4aThuOWw4ZThzOHM5bDh5LgorLnA0YWkyCisucGE0aTRuNAorLnBhNGk0bjFsCisucGFpbmxlczIKKy5wYWluM2wyZTJzcworLnBhaW5sZXM0czFsMgorLnBhaW5sZXNzMWx5CisucGE4bDllOHQ4dDhlLgorLnA0YWwKKy5wMmFsZQorLnBhbGU0dDN0MgorLnBhOGw5ZTh0OHQ4ZThzLgorLnBhbGV0NHRlcworLnBhOHI5YTliOG84bDhhLgorLnAyYTJyCisucGEycmFiCisucGFyYWJvMWxhCisucGE4cjlhOWI4bzhsOWk4Yy4KKy5wYXJhYm9sM2ljCisucGFyYWJvbDJpCisucGE5cjhhOGI5bzlsOG84aThkLgorLnBhcmFib2xvaTIKKy5wYXJhYm9sbzJpZAorLnBhOHI5YTlkOGk4ZzhtLgorLnBhcmEyZAorLnBhcjJhZGkKKy5wYXJhZDJpZworLnBhcmFkaWcxbQorLnBhOHI5YTlkOGk4ZzhtOHMuCisucGFyYWRpZzRtMXMyCisucGE4cjhhOWM4aDh1OHQ4ZS4KKy5wYXJhMmNoCisucGFyYWNodTR0CisucGE4cjhhOWM4aDh1OHQ4ZThzLgorLnBhOHI4YTlkOGk5bThlOHQ4aDh5OGw5YjhlOG44ejhlOG44ZS4KKy5wYXJhZDRpbWV0CisucGFyYWRpbWV0aHkybDFiCisucGFyYWRpbWV0aHlsYjRlNG4zegorLnBhcmFkaW1ldGh5bGJlbjJ6ZQorLnBhcmFkaW1ldGh5bGJlbnplNG4KKy5wYThyOGE5ZjhsOHU4bzhyOG85dDhvOGw4dThlOG44ZS4KKy5wYXJhMmYKKy5wYXJhZjRsMgorLnBhcmFmbHUzbworLnBhcmFmbHVvM3IKKy5wYXJhZmx1b3JvMXRvCisucGFyYWZsdW9yb3RvbHUzZW4KKy5wYXJhZmx1b3JvdG9sdTRlbmUKKy5wYThyOGE5ZzhyOGE4cDhoOWU4ci4KKy5wYXJhMWdyCisucGFyYWc1cmEzcGg0ZXIKKy5wYThyOGE5bDhlOWc4YThsLgorLnBhcjNhbAorLnBhcjJhbGUKKy5wYXJhbDRlZ2FsCisucGFyYWxlMWdhCisucGE4cjlhOGw5bDhlOGw5aThzOG0uCisucGFyYWwxbAorLnBhcmFsMmxlCisucGFyYWwzbGVsCisucGFyYWxsZWwyaQorLnBhcmFsbGUybGlzCisucGFyYWxsZWxpMnMxbQorLnBhOHI4YTltOGE4ZzluOGU4dDlpOHM4bS4KKy5wYXI0YTFtYQorLnBhcmFtM2FnCisucGFyYTVtYWcxbgorLnBhcmFtYWduZXRpMnM0bQorLnBhOHI4YTltOGU4ZDhpOGMuCisucGFyYTJtZWQKKy5wYXJhbTRlZGkKKy5wYThyOGE5bThlOHQ4aDh5OGw5YThuOGk4czhvOGw4ZS4KKy5wYXJhbTNldAorLnBhcmFtZXRoeTNsYQorLnBhcmFtZXRoeWxhMm4KKy5wYXJhbWV0aHlsYW5pMnNvCisucGE5cjhhOG05ZTl0OHI4aTh6OGUuCisucGFyYW00ZXRyCisucGFyYW1ldHJpMnplCisucGE4cjhhOW04aThsOWk5dDhhOHI4eS4KKy5wYXIyYW1pCisucGFyYW1pbDFpCisucGFyYW0yaWwxaXQKKy5wYXJhbWlsaTF0YQorLnBhcmFtaWxpdDJhMnIKKy5wYThyOGE5bThvOHU4bjh0LgorLnBhcmEybW8KKy5wYXJhbW91MgorLnBhcmFtb3VuMXQKKy5wYTh0OGg5bzlnOGU4bjlpOGMuCisucDRhdGgKKy5wYXQ0aG8KKy5wYXRobzRnCisucGF0aG8xZ2U0CisucGF0aG8xZ2VuCisucGU4ZTh2OWk4czhoLgorLnA0ZWUKKy5wZWUxdmkKKy5wZWV2aXMyaAorLnBlOGU4djlpOHM4aDluOGU4czhzLgorLnBlZXZpczJoMW4KKy5wZWV2aXNoMW5lcworLnBlZXZpc2huMmUyc3MKKy5wZThuOXQ4YTlnOG84bi4KKy5wZW4xdAorLnBlbjF0YQorLnBlbnRhMmdvCisucGVudGFnbzJuMgorLnBlOG45dDhhOWc4bzhuOHMuCisucGVudGFnbzJuM3MyCisucGU5dDhyOG85bDhlOXU4bS4KKy5wZXRyb2w0ZXUKKy5waDhlOW44bzhtOWU5bjhvOG4uCisucGg0ZTNubworLnBoZTJuCisucGhlbm8ybWUKKy5waGVubzFtZW4KKy5waGVub200ZW5vCisucGhlbm9tZW5vNG4KKy5waDhlOG44eThsOWE4bDhhOW44aThuOGUuCisucGhlbnkzbGEKKy5waGVueWxhbGEybgorLnBoZW55bGFsYTVuMmluZQorLnBoZW55bGFsYW4xaW4KKy5waDhpOWw4YTh0OWU5bDhpOHM4dC4KKy5waGk0bGF0ZWwyaTQKKy5waGlsYXRlMmxpcworLnBoOGk5bDhhOHQ5ZTlsOGk4czh0OHMuCisucGhpbGF0ZWxpczR0MXMyCisucGg4bzluOGU4bThlLgorLjNwaG9uZQorLnBobzJuCisucGhvbmUxbWUKKy5waDhvOW44ZThtOGU4cy4KKy5waG9uZTJtZXMKKy5waDhvOW44ZTltOGk4Yy4KKy5waG9uZTVtaQorLnBoOG84czlwOGg4bzhyOWk4Yy4KKy5waG9zMXAKKy5waG9zcGhvNQorLnBob3NwaG80cgorLnBoOG85dDhvOWc4cjhhOHA4aDhzLgorLnBobzF0bworLnBob3RvMmdyCisucGhvdG9ncmE0cDRoMXMyCisucGg4bzl0OG85bzhmOGY5czhlOHQuCisucGhvdG9vMgorLnBob3RvbzRmMWYKKy5waG90b29mMmYzcworLnBpOGM5YTlkOG84ci4KKy5waTFjYQorLnBpY2EyZAorLnBpY2ExZG8KKy5waWNhZDRvcgorLnBpOGM5YTlkOG84cjhzLgorLnBpY2FkbzRyczIKKy5waThwOGU5bDhpOG44ZS4KKy5wMmlwCisucGlwZTQKKy5waXBlbDJpCisucGlwZTFsNGluZQorLnBpOHA4ZTlsOGk4bjhlOHMuCisucGlwZWxpMW5lcworLnBpOHA4ZTlsOGk4bjlpOG44Zy4KKy5waXBlbDJpbjNpCisucGlwZWxpbjFpbgorLnBpcGVsaW5pbjRnCisucGk5cjhhOW44aDhhOHMuCisucDRpcgorLnBpMXJhCisucGlyYTJuCisucGlyYTRuMWg0CisucGlyYW5oYTQKKy5wbDhhOGM4YTliOGw4ZS4KKy4xcDJsMgorLnBsYTFjYQorLnBsYWNhMWIybDIKKy5wbDhhOG44dDloOG84cDlwOGU4ci4KKy4zcGxhMm4KKy5wbGFuMXQKKy5wbGFudGhvNHAxcAorLnBsYW50aG9wMnBlCisucGxhbnRob3AzcGVyCisucGw4YThuOHQ5aDhvOHA5cDhlOHI4cy4KKy5wbGFudGhvcHBlNHIxczIKKy5wbDhlOGE4czlhOG44YzhlLgorLnBsZTJhCisucGxlYXNhMgorLnBsZWEzc2FuYworLnBsZWFzYTJuCisucGw4dThnOWk4bi4KKy5wbHVnNWluCisucGw4dThnOWk4bjhzLgorLnBsdTVnNGkybjFzMgorLnBvOGw5dDhlOHI5ZzhlOGk4czh0LgorLnBvNGwydAorLnBvbDF0ZQorLnBvbHRlcmcyCisucG9sdGVyZ2VpMgorLnBvOGw4eTllOG44ZS4KKy5wbzJseQorLnBvOGw4eTllOHQ4aDl5OGw5ZThuOGUuCisucG9seWU0dAorLnBvOWw4eThnOWE5bThpOHM4dC4KKy5wb2x5MWdhCisucG9seTJnYW0KKy5wb2x5Z2FtMmlzCisucG85bDh5OGc5YTltOGk4czh0OHMuCisucG9seWdhbWlzNHQxczIKKy5wbzhsOHk4ZzlvOG45aTl6OGE5dDhpOG84bi4KKy5wb2x5MWdvCisucG9seWdvMm4yCisucG9seWdvM25pCisucG9seWdvbml6YTEKKy5wb2x5Z29uaXphMXQyaW8KKy5wb2x5Z29uaXphdGlvMm4KKy5wbzlsOHk4cDhoOW85bjhvOHU4cy4KKy5wb2x5cGhvMm4KKy5wb2x5cGhvMW5vdTIKKy5wb2x5cGhvbm8ydXMKKy5wbzhsOHk5czh0OHk4cjhlOG44ZS4KKy5wbzJseXM0CisucG9seXMxdAorLnBvbHlzMnR5CisucG84bThlOWc4cjhhOG45YTh0OGUuCisucG8ybWUKKy5wb21lMmcKKy5wb21lMWdyCisucG9tZWdyYTJuMgorLnBvbWVncmExbmEKKy5wb21lZ3JhbjJhdAorLnBvOHI4bzllOGw4YThzOXQ4aThjLgorLjFwNG9yCisucG9ybzRlCisucG9ybzRlbAorLnBvcm9lMWxhCisucG9yb2VsYXN0MmkKKy5wb3JvZWxhczF0aWMKKy5wbzhyOW84dThzLgorLnBvcm91MgorLnBvcm8ydXMKKy5wbzhyOXQ4YTliOGw4ZS4KKy5wb3IxdGEKKy5wb3IydGFiCisucG9ydGFiMmwyCisucG84czh0OWE4bTliOGw4ZS4KKy4xcG9zCisucG9zMnRhCisucG9zdGE0bTFiCisucG9zdGFtYjJsMgorLnBvOHM4dDlhOG05YjhsOGU4cy4KKy5wb3N0YW1ibGVzMgorLnBvOHM4dDloOHU5bThvOHU4cy4KKy5wb3N0aHUxbW8KKy5wb3N0aHUzbW8ydXMKKy5wb3N0aHVtb3UyCisucG84czh0OXM4YzhyOGk4cDh0LgorLnBvczR0MXMyCisucG9zdDRzYworLnBvc3RzY3JpMgorLnBvc3RzY3IyaXAKKy5wb3N0c2NyaTJwMXQKKy5wbzhzOHQ5czhjOHI4aThwOHQ4cy4KKy5wb3N0c2NyaXA0dDFzMgorLnBvOHM5dDh1OHI5YThsLgorLnBvczF0dQorLnBvc3R1MXJhCisucHI4ZTlhOG05YjhsOGUuCisucHJlYTRtMWIKKy5wcmVhbWIybDIKKy5wcjhlOWE4bTliOGw4ZThzLgorLnByZWFtYmxlczIKKy5wcjhlOWw4bzhhOGQ4ZThkLgorLnByZWw0b2EKKy5wcmVsb2EyZDMKKy5wcmVsb2EyZDFlZAorLnByOGU5cDhhOHI5aThuOGcuCisucHJlMnBhCisucHJlcDRhNHIxaQorLnByZXAyYTJyCisucHJlcGFyaW40ZworLnByOGU5cDhyOGk4bjh0LgorLnByMmVwcjIKKy5wcmVwcmluNHQzCisucHI4ZTlwOHI4aThuOHQ4cy4KKy5wcmVwcmluNHQ0czIKKy5wcjhlOXA4cjhvOGM4ZThzOXM4bzhyLgorLnByZTNwcm8KKy5wcmVwcjJvYworLnByZXBybzFjZQorLnByZXByb2MyZTJzcworLnByZXByb2NlczFzbworLnByOGU5cDhyOG84YzhlOHM5czhvOHI4cy4KKy5wcmVwcm9jZXNzbzRyczIKKy5wcjhlOXM4cDhsOGk4dDl0OGk4bjhnLgorLnByZTFzcAorLnByZXMxcDJsMgorLnByZXNwbDFpdAorLnByZXNwbDRpNHQzdDIKKy5wcmVzcGxpdDJ0MWluCisucHI4ZTl3OHI4YThwLgorLnByZXdyYTQKKy5wcjhlOXc4cjhhOHA4cDhlOGQuCisucHJld3JhNHAxcAorLnByZXdyYXAycGUKKy5wcmV3cmFwNHAyZWQKKy5wcjhpOGU4czh0OWU4czhzOGU4cy4KKy41cHIyaTRlNAorLnByaTFlc3QKKy5wcmllczR0MmUyc3MKKy5wcmllc3Rlc3MxZTRzCisucHI4ZTh0OXQ4eTlwOHI4aThuOXQ4ZThyLgorLnByZTR0M3QyCisucHJldDF0eQorLnByMmV0dHlwcjIKKy5wcmV0dHlwcmluNHQzCisucHI4ZTh0OXQ4eTlwOHI4aThuOXQ4aThuOGcuCisucHJldHR5cHJpbnQyaQorLnByZXR0eXByaW40dDNpbmcKKy5wcmV0dHlwcmluMnQxaW4KKy5wcjhvOWM4ZTlkOHU4cjlhOGwuCisucHIyb2MKKy5wcm8xY2UKKy5wcm9jZTFkdQorLnByb2NlZHUxcmEKKy5wcjhvOGM4ZThzOHMuCisucHJvYzJlMnNzCisucHI4bzljOHU4cjlhOG44YzhlLgorLnByb2N1MXJhCisucHJvY3VyYTJuCisucHI4bzhnOWU5bjhpOGU4cy4KKy5wcm8xZ2UKKy5wcm8xZ2VuCisucHJvZ2U1bjJpZTQKKy5wcjhvOGc5ZTluOHkuCisucHJvNGdlbnkKKy5wcjhvOWc4cjhhOG05bThhOGI4bDhlLgorLnBybzFncgorLnByb2dyYW0xbQorLnByb2dyYW0xbWEKKy5wcm9ncmFtMm1hYgorLnByb2dyYW1tYWIybDIKKy5wcjhvOG05aTluOGU4bjh0LgorLnByb200aQorLnByb20xaW4KKy5wcm9tMmluZQorLnByb21pMW5lbgorLnByb21pbmVuMXQKKy5wcjhvOW04aThzOWM4dTlvOHU4cy4KKy5wcm9tMmlzCisucHJvbTJpczFjCisucHJvbWlzMWN1CisucHJvbWlzY3Uxb3UyCisucHJvbWlzY3VvMnVzCisucHI4bzhtOWk4czlzOG84cjh5LgorLnByb200aTJzMXMKKy5wcm9taXMxc28KKy5wcm9taXNzbzFyeQorLnByOG84bTlpOHM4ZS4KKy5wcm9tNGlzZQorLnByOG84bTlpOHM4ZThzLgorLnByb21pczFlNHMKKy5wcjhvOXA4ZThsOWw4ZThyLgorLnBybzNwZWwKKy5wcm9wZWwxbAorLnByb3BlbDJsZQorLnByOG85cDhlOGw5bDhlOHI4cy4KKy5wcm9wZWxsZTRyMXMyCisucHI4bzlwOGU4bDlsOGk4bjhnLgorLnByb3BlbGwyaQorLnByb3BlbDJsaW40CisucHI4bzloOGk4YjlpOXQ4aTh2OGUuCisucHJvMWgyCisucHJvaGliaTJ0CisucHJvaGliaTF0aQorLnByb2hpYmkxdDJpdgorLnByOG85aDhpOGI5aTl0OGk4djhlOWw4eS4KKy5wcm9oaWJpdGl2NGUxbHkKKy5wcjhvOXM4YzhpOHU4dDl0OG8uCisucHJvczJjCisucHJvczFjaQorLnByb3NjaTF1CisucHJvc2NpdTR0M3QyCisucHJvc2NpdXQ1dG8KKy5wcjhvOXQ4ZThzOHQ5ZThyLgorLnBybzF0CisucHJvNHRlcworLnByOG85dDhlOHM4dDllOHI4cy4KKy5wcm90ZXN0ZTRyMXMyCisucHI4bzl0OGU4czl0OG84ci4KKy5wcm90NGVzMnRvCisucHI4bzl0OGU4czl0OG84cjhzLgorLnByb3Rlc3RvNHJzMgorLnByOG85dDhvOWw4YThuOWc4dThhOGc4ZS4KKy5wcm8xdG8KKy5wcm90bzFsYQorLnByb3RvNGxhMm4KKy5wcm90b2wyYW5nCisucHJvdG9sYW4xZ3UKKy5wcm90b2xhbmd1NGEKKy5wcjhvOXQ4bzl0OHk4cDlhOGwuCisucHJvdG8xdHkKKy5wcm90b3R5MXBhCisucHJvdG90eXA0YWwKKy5wcjhvOHY5aThuOGM4ZS4KKy5wcm92MWluCisucHJvdjJpbmMKKy5wcjhvOHY5aThuOGM4ZThzLgorLnByOG85djhpOG45YzhpOGE4bC4KKy5wcm92aW4xY2kKKy5wcm92aW4zYzJpMWEKKy5wcm92aW5jaTJhbAorLnByOG84dzllOHM4cy4KKy5wcm93MmUyc3MKKy5wczhlOHU5ZDhvOWQ4aThmOWY4ZThyOWU4bjl0OGk4YThsLgorLjJwMXMyCisucDJzZQorLnBzNGV1CisucHNldTFkbworLnBzZXVkb2QxaWYKKy5wc2V1ZG9kaTRmMWYKKy5wc2V1ZG9kaWZmZXIxCisucHNldWRvZGlmZmVyM2VuMXQKKy5wc2V1ZG9kaWZmZXJlbnQyaQorLnBzZXVkb2RpZmZlcmVuMXQyaTFhCisucHNldWRvZGlmZmVyZW50aTJhbAorLnBzOGU4dTlkOG85ZjhpOW44aTh0OGUuCisucHNldTJkNW9mCisucHNldWRvMmZpCisucHNldWRvMmZpbgorLnBzZXVkb2YyaW5pCisucHNldWRvZmluMml0CisucHNldWRvZmluMml0ZQorLnBzOGU4dTlkOG85ZjhpOW44aTh0OGU5bDh5LgorLnBzZXVkb2Zpbml0ZTFseQorLnBzOGU4dTlkOG85ZjhvOHI4YzhlOHMuCisucHNldWRvMWZvCisucHNldWRvZm8ycgorLnBzZXVkb2ZvcjFjCisucHNldWRvZm9yMmNlCisucHM4ZTh1OWQ4bzhnOXI4YTlwOGg4ZThyLgorLnBzZXVkNG9nCisucHNldWRvMWdyCisucHNldWRvZzVyYTNwaDRlcgorLnBzOGU4dTlkOG85ZzhyOG84dThwLgorLnBzZXVkbzRnNHJvCisucHNldWRvZ3JvdTIKKy5wczhlOHU5ZDhvOWc4cjhvOHU4cDhzLgorLnBzZXVkb2dyb3UycDFzMgorLnBzOGU4dTlkOG85bjh5OG0uCisucHNldTRkbzJuCisucHNldWRvbnltNAorLnBzOGU4dTlkOG85bjh5OG04cy4KKy5wc2V1ZG9ueTRtMXMyCisucHM4ZTh1OWQ4bzl3OG84cjhkLgorLnBzZXVkbzR3bzIKKy5wczhlOHU5ZDhvOXc4bzhyOGQ4cy4KKy5wc2V1ZG93b3IyZDFzMgorLnBzOHk5YzhoOGU5ZDhlOGw5aThjLgorLnBzNHkKKy5wNHN5MWMKKy5wc3kzY2gKKy5wc3ljaDRlMgorLnBzeTRjaDRlZAorLnBzeWNoZWRlbDJpCisucHM4eThjOGg4cy4KKy5wc3ljNGgxczIKKy5wdTliOGU4czljOGU4bjhjOGUuCisucHViMworLnB1YjRlCisucHU0YmVzNAorLnB1YmVzMmMKKy5wdWJlczFjZW4KKy5wdWJlczNjZW5jCisucXU4YThkOWQ4aThuOGcuCisucXUyCisucXVhMmQKKy5xdWFkNGQxaW4KKy5xdWFkMWQ0CisucXU4YTlkOHI4YTh0OWk4Yy4KKy5xdWExZHIKKy5xdWFkcmF0MWljCisucXU4YTlkOHI4YTh0OWk4YzhzLgorLnF1YWRyYXRpNGMzczIKKy5xdThhOGQ5cjhhOXQ4dThyOGUuCisucXVhZHJhMnR1CisucXVhZHJhM3R1cmUKKy5xdThhOGQ5cjhpOXA4bDhlOGc5aThjLgorLnF1YWRyaTJwMmwyCisucXVhZHIyaXAKKy5xdWFkcmlwbGVnNGljCisucXU4YThpOG44dDllOHIuCisucXVhaTIKKy5xdWE0aTRuCisucXVhaW4xdAorLnF1OGE4aThuOHQ5ZThzOHQuCisucXU4YTlzOGk5ZThxOHU4aTh2OWE5bDhlOG44YzhlLgorLnF1YXMyaWU0CisucXVhc2llMXEKKy5xdTJhc2llcXUyCisucXVhc2llcTJ1aTIKKy5xdWFzaWVxdTJpdjMKKy5xdWFzaWVxdWkxdmEKKy5xdWFzaWVxdWl2MmFsZQorLnF1YXNpZXF1aXZhM2xlbmMKKy5xdThhOXM4aTllOHE4dThpOHY5YTlsOGU4bjhjOGU4cy4KKy5xdThhOXM4aTllOHE4dThpOHY5YTlsOGU4bjh0LgorLnF1YXNpZXF1aXZhMWxlbjF0CisucXU4YTlzOGk5aDh5OXA4bzluOG84cjltOGE4bC4KKy5xdWFzaTNoCisucXVhc2loeTNwbworLnF1YXNpaHlwbzJuCisucXVhc2loeXBvbm9yMW0KKy5xdWFzaWh5cG9ub3IxbWEKKy5xdThhOXM4aTlyOGE4ZDlpOWM4YThsLgorLnF1YXM0aTJyCisucXVhc2kxcjVhCisucXVhc2lyYTJkCisucXVhc2lyMmFkaQorLnF1YXNpcmFkM2kxY2EKKy5xdThhOXM4aTlyOGU4czhpOGQ5dThhOGwuCisucXVhc2k0cmVzCisucXVhc2lyZTFzaQorLnF1YXNpcmUyczJpZAorLnF1YXNpcmVzaTJkdQorLnF1YXNpcmVzaWQxdTFhCisucXU4YTlzOGk5czhtOG84bzh0OGguCisucXVhMXNpcworLnF1YXNpMnMxbQorLnF1YXNpczFtbworLnF1YXNpc21vbzIKKy5xdWFzaXNtbzRvdGgKKy5xdThhOXM4aTlzOHQ4YTl0OGk4bzhuOWE4cjh5LgorLnF1YXNpczF0YQorLnF1YXNpc3RhdGlvbjVhMnIKKy5xdWFzaXN0YTF0MmlvCisucXVhc2lzdGF0aW8ybgorLnF1YXNpc3RhdGlvMW4xYQorLnF1OGE5czhpOXQ4bzhwOG84cy4KKy5xdTVhNXNpNHQKKy5xdWFzaTF0bworLnF1YXNpdG8xcG9zCisucXU4YTlzOGk5dDhyOGk5YThuOWc4dTlsOGE4ci4KKy5xdWFzaTV0cjJpM2EKKy5xdWFzaXRyaTJhMm4KKy5xdWFzaXRyaTJhbmcKKy5xdWFzaXRyaWFuMWd1CisucXVhc2l0cmlhbmd1MWxhCisucXVhc2l0cmlhbmd1bDJhMnIKKy5xdThhOXM4aTl0OHI4aTh2OWk4YThsLgorLnF1YXNpdHIyaTR2CisucXVhc2l0cml2M2kKKy5xdWFzaXRyaXYyaTFhCisucXVhc2l0cml2aTJhbAorLnF1OGk4bjl0OGU4czlzOGU4bjhjOGUuCisucTJ1aTIKKy5xdWk0bgorLnF1aW4xdAorLnF1aW40dDJlMnNzCisucXVpbnRlczRzZW5jCisucXU4aThuOXQ4ZThzOXM4ZThuOGM4ZThzLgorLnF1OGk4bjl0OGU4czlzOGU4bjl0OGk4YThsLgorLnF1aW50ZXNzZW4xdAorLnF1aW50ZXNzZW50MmkKKy5xdWludGVzc2VuMXQyaTFhCisucXVpbnRlc3NlbnRpMmFsCisucmE4YjliOGk4dDlyOHkuCisuMnJhYgorLnJhMmIxYgorLnJhYmJpMnQKKy5yYWJiaTN0cgorLnJhYmJpdDVyeQorLnJhOWQ4aTlvOGc5cjhhOXA4aDh5LgorLnJhMmQKKy5yMmFkaQorLnJhM2QyaW8KKy5yYWRpbzVnCisucmFkaW8yZ3IKKy5yYWRpbzRnM3JhMXBoeQorLnJhOGY4ZjlpOHM4aC4KKy5yYWY1ZmkKKy5yYTJmCisucmE0ZjFmNAorLnJhZjJmNWlzCisucmFmZmlzMmgKKy5yYThmOGY5aThzOGg5bDh5LgorLnJhZmZpczRoMWw0CisucmFmZmlzaDFseQorLnJhOG05czhoOGE4YzhrOGw4ZS4KKy5yYTRtMXMyCisucmFtNHMyaAorLnJhbXNoYWNrMQorLnJhbXNoYWNrMWwKKy5yYTh2OWU4bjlvOHU4cy4KKy5yYXY0ZTRubworLnJhdmUxbm91MgorLnJhdmVubzJ1cworLnJlOWE4cjhyOGE4bjhnOGU5bThlOG44dC4KKy5yZTVhcjFyNAorLnJlMmEycgorLnJlYXJyYW40Z2UKKy5yZWFycmEybgorLnJlYXJyMmFuZworLnJlYXJyYW5nZTFtZQorLnJlYXJyYW5nZTFtZW4KKy5yZWFycmFuZ2UzbWVuMXQKKy5yZTlhOHI4cjhhOG44ZzhlOW04ZThuOHQ4cy4KKy5yZWFycmFuZ2VtZW40dDRzMgorLnJlOGM5aTlwOHI4bzhjOWk5dDhpOGU4cy4KKy5yZWNpcHJvY2kxdGkKKy5yZWNpcHJvY2l0MmllNAorLnJlOGM5dDhhOG45ZzhsOGUuCisucmVjNHRhMm4KKy5yZTJjMXQKKy5yZWN0NWFuZworLnJlYzF0YQorLnJlY3RhbjFnbDIKKy5yZWN0YW4xZ2xlCisucmU4Yzl0OGE4bjlnOGw4ZThzLgorLnJlY3RhbmdsZXMyCisucmU4Yzl0OGE4bjlnOHU5bDhhOHIuCisucmVjdGFuMWd1CisucmVjdGFuZ3UxbGEKKy5yZWN0YW5ndWwyYTJyCisucmU5ZDhpOXI4ZThjOHQuCisuMnIyZWQKKy5yNGVkaQorLnJlZDRpcjIKKy5yZWRpMXJlCisucmVkaXJlMmMxdAorLnJlOWQ4aTlyOGU4Yzh0OWk4bzhuLgorLnJlZGlyZWMxdDJpbworLnJlZGlyZWN0aW8ybgorLnJlOWQ4dThjOWk4YjhsOGUuCisucmUxZHUKKy5yZWR1MmMKKy5yZWR1Y2k0YgorLnJlZHUxY2kKKy5yZWR1Y2kxYjJsMgorLnJlOWU4YzhoOG8uCisucmVlMmMKKy5yZWUyY2gKKy5yZWUzY2hvMgorLnJlOXA4aDhyOGE4czhlLgorLnJlcDRocjQKKy5yZXBocjJhcworLnJlOXA4aDhyOGE4czhlOHMuCisucmVwaHJhczFlNHMKKy5yZTlwOGg4cjhhOHM4ZThkLgorLnJlcGhyYTRzNGVkCisucmU5cDhvOXM4aTl0OGk4bzhuLgorLnJlNHBvc2kKKy5yZTFwbworLnJlMXBvcworLnJlcG8zczJpMXQyaW8KKy5yZXBvc2kxdGkKKy5yZXBvc2l0aW8ybgorLnJlOXA4bzlzOGk5dDhpOG84bjhzLgorLnJlcG9zaXRpbzJuM3MyCisucmU5cDhyOGk4bjh0LgorLnJlcHIyCisucmVwcmluNHQzCisucmU5cDhyOGk4bjh0OHMuCisucmVwcmluNHQ0czIKKy5yZTlzOHQ4bzhyOWE4YjhsOGUuCisucjRlczJ0bworLnJlc3RvMnJhCisucmVzdG8ycmFiCisucmVzdG9yYWIybDIKKy5yZTh0OHI4bzlmOGk4dC4KKy5yZXRybzJmaQorLnJlOHQ4cjhvOWY4aTh0OXQ4ZThkLgorLnJldHJvZjRpNHQ0dDIKKy5yZXRyb2ZpdDJ0MWVkCisucmU5dThzOWE4YjhsOGUuCisucjRldTIKKy5yZTJ1czQKKy5yZXVzYTIKKy5yZXUyczFhYgorLnJldXNhYjJsMgorLnJlOXU4czhlLgorLnJlOXc4aThyOGUuCisucmV3aTIKKy5yZXc0aXI0CisucmU5dzhyOGE4cC4KKy5yZXdyYTQKKy5yZTl3OHI4YThwOHA4ZThkLgorLnJld3JhNHAxcAorLnJld3JhcDJwZQorLnJld3JhcDRwMmVkCisucmU5dzhyOGk4dDhlLgorLnJld3JpNAorLnJld3IyaXRlCisucmg4aTluOG84YzllOHI5bzhzLgorLnJoNAorLnJoMmkxbm8KKy5yaGk0bm80YworLnJoaW5vMWNlCisucmhpbm9jMmVybworLnJpOGc4aDh0OWU4bzh1OHMuCisucmlnaDF0ZW8KKy5yaWdodGVvdTIKKy5yaWdodGVvMnVzCisucmk4ZzhoOHQ5ZThvOHU4czluOGU4czhzLgorLnJpZ2h0ZW91czFuNAorLnJpZ2h0ZW91czFuZXMKKy5yaWdodGVvdXNuMmUyc3MKKy5yaThuOGc5bDhlOGE4ZDhlOHIuCisucmluNGcKKy5yaW5nbDIKKy5yaW4xZ2xlCisucmluZ2xlMmEKKy5yaW5nbGVhMmQxCisucmk4bjhnOWw4ZThhOGQ4ZThyOHMuCisucmluZ2xlYWRlNHI1czIKKy5ybzliOG84dC4KKy5ybzliOG84dDhzLgorLnJvYm80dDFzMgorLnJvOWI4bzh0OGk4Yy4KKy5ybzliOG84dDlpOGM4cy4KKy5yb2JvdGk0YzNzMgorLnJvOHU4bjhkOXQ4YThiOGw4ZS4KKy5yb3UyCisucm91bjJkCisucm91bmQxdGEKKy5yb3VuZDJ0YWIKKy5yb3VuZHRhYjJsMgorLnJvOHU4bjhkOXQ4YThiOGw4ZThzLgorLnJvdW5kdGE1YmxlczIKKy5zYThsOGU4czljOGw4ZThyOGsuCisuc2EyCisuczJhbGUKKy5zYWxlczIKKy5zYWxlczJjCisuc2FsZXNjbGU1Cisuc2FsZXMxYzRsNAorLnNhOGw4ZThzOWM4bDhlOHI4azhzLgorLnNhbGVzY2xlcjRrMXMyCisuc2E4bDhlOHM5dzhvOG04YThuLgorLnNhbGVzNHcyCisuc2FsZTRzMXdvMgorLnNhbGVzd29tMQorLnNhbGVzd28xbWEKKy5zYWxlc3dvbWEybgorLnNhOGw4ZThzOXc4bzhtOGU4bi4KKy5zYWxlc3dvMm1lCisuc2FsZXN3bzFtZW4KKy5zYThsOW04bzluOGU4bDlsOGEuCisuczRhMmw0bQorLnNhbG1vMm40Cisuc2FsMW1vCisuc2FsbW9uNGVsbGEKKy5zYWxtb25lbDFsCisuc2E4bDl0OGE5dDhpOG84bi4KKy5zYTRsNHQKKy5zYWwxdGEKKy5zYWx0YTF0MmlvCisuc2FsdGF0aW8ybgorLnNhOHI5czhhOXA4YThyOWk4bDlsOGEuCisuczJhMnIKKy5zYTJyNHNhMgorLnNhNHJzMgorLnNhcnMxYXAKKy5zMmEycnNhcDJhMnI0Cisuc2Fyc2ExcGEKKy5zYXJzYXA0YTRyMWkKKy5zYXJzYXBhcmlsMWwKKy5zYTh1OGU4cjlrOHI4YTh1OHQuCisuc2F1NAorLnNhdWVya3JhdTR0Cisuc2M4YTh0OW85bDhvOGc5aTljOGE4bC4KKy5zMWNhCisuc2NhMXRvCisuc2NhdG8zbG9nMWljCisuc2NhdG9sb2dpMWNhCisuc2M4aDhlOGQ5dThsOWk4bjhnLgorLnMyY2gyCisuc2NoZTIKKy5zNGNoNGVkCisuc2NoZTRkdWwKKy5zY2hlMWR1Cisuc2NoZWR1bDJpCisuc2NoZWR1bDNpbmcKKy5zYzhoOGk4ejlvOXA4aDhyOGU4bjhpOGMuCisuc2NoaTJ6Cisuc2NoaTF6bworLnNjaGl6Mm9waAorLnNjaGl6b3A0aHI0Cisuc2M4aDhuOGE4dTl6OGU4ci4KKy5zYzJoMW4KKy5zY2gxbmEKKy5zY2huMmF1Cisuc2NobmF1Mno0ZQorLnNjaG5hdXoxZXIKKy5zYzhoOG84bzhsOWM4aDhpOGw4ZC4KKy5zNGNobzIKKy5zY2hvbzIKKy5zY2hvbzRsMWMyCisuczJjaG9vbDJjaAorLnNjaG9vbGNoNGlsMgorLnNjaG9vbGNoaTJsZAorLnNjOGg4bzhvOGw5YzhoOGk4bDhkOXI4ZThuLgorLnNjaG9vbGNoaWwzZHIKKy5zY2hvb2xjaGlsZHJlNAorLnNjaG9vbGNoaWw1ZHJlbgorLnNjOGg4bzhvOGw5dDhlOGE4YzhoOGU4ci4KKy5zY2hvbzRsMnQKKy5zY2hvb2wxdGUKKy5zMmNob29sdGVhMmNoCisuc2Nob29sdGVhY2hlMgorLnNjOGg4bzhvOGw5dDhlOGE4YzhoOWU4cjhzLgorLnNjaG9vbHRlYWNoM2U0cjFzMgorLnNjOHI4dTl0OGk5bjh5LgorLnNjcnUydDFpNW4KKy5zY3I0dTF0MmkKKy5zY3J1dDRpbnkKKy5zYzh5OHQ4aDlpOG44Zy4KKy5zMWN5Cisuc2N5M3RoaW4KKy5zZThsOGw5ZThyLgorLnNlbDJsZQorLnNlOGw4bDllOHI4cy4KKy5zZWxsZTRyMXMyCisuc2U4YzlyOGU5dDhhOHI5aThhOHQuCisuc2UxY3IKKy5zZTRjM3JlMXRhCisuc2VjcmV0MmEycgorLnNlY3JldGFyMWkKKy5zZWNyZXRhcjJpM2EKKy5zZThjOXI4ZTl0OGE4cjlpOGE4dDhzLgorLnNlY3JldGFyaWE0dDFzMgorLnNlOG05YTlwOGg4bzhyOGUuCisuc2UxbWEKKy5zZTRtYXAKKy5zZW1hcGhvNHIKKy5zZThtOWE5cDhoOG84cjhlOHMuCisuc2U5bThlOHM5dDhlOHIuCisuNHNlMW1lCisuc2UybWVzCisuc2U4bThpOWQ4ZThmOWk5bjhpOHQ4ZS4KKy5zZW0yaWQKKy5zZW1pZGUxZgorLnNlbWlkZWY1aTVuMml0ZQorLnNlbWlkZTFmaQorLnNlbWlkZTJmaW4KKy5zZW1pZGVmMmluaQorLnNlbWlkZWZpbjJpdAorLnNlOG04aTlkOGk5cjhlOGM4dC4KKy5zZW1pMmRpCisuc2VtaWQ0aXIyCisuc2VtaWRpMXJlCisuc2VtaWRpcmUyYzF0Cisuc2U4bThpOWg4bzltOG85dDhoOGU4dDlpOGMuCisuc2VtaTNoCisuc2VtaWhvMW1vCisuc2VtaWhvbTRvdGgzCisuc2VtaWhvbW90aDJlCisuc2VtaWhvbW8zdGhlNHQKKy5zZW1paG9tb3RoZXQxaWMKKy5zZThtOGk5cjhpOG44Zy4KKy5zZW00aXIKKy5zZW1pcjFpCisuc2VtaXJpbjRnCisuc2U4bThpOXI4aThuOGc4cy4KKy5zZW1pcmluZ3MyCisuc2U4bThpOXM4aThtOXA4bDhlLgorLnNlNG0yaXMKKy5zZW1pc2k0bTFwCisuc2VtaXNpbTFwMmwyCisuc2U4bThpOXM4azhpOGw4bDhlOGQuCisuc2VtNGlzNGsyCisuc2VtaXNrMWkKKy5zZW1pc2s0aWwxbAorLnNlbWlza2lsMmxlCisuc2U4cjhvOWU4cDhpOWQ4ZTltOGk5bzlsOG84ZzlpOWM4YThsLgorLnMyZXI0bworLnNlcm80ZQorLnNlcm9lcDRpZAorLnNlcm9lcGkzZGUKKy5zZXJvZXBpZDRlbQorLnNlcm9lcGlkZW0yaW8KKy5zZXJvZXBpZGVtaTFvbAorLnNlcm9lcGlkZW1pbzNsb2cxaWMKKy5zZXJvZXBpZGVtaW9sb2dpMWNhCisuc2U4cjl2OG85bThlOGM4aDlhOG44aThzOG0uCisuNHNlcjN2bworLnNlcnZvMm1lCisuc2Vydm9tZTJjaAorLnNlcnZvbWVjaDVhNW5pcworLnNlcnZvbWVjaGEybgorLnNlcnZvbWVjaGFuaTJzMW0KKy5zZThyOXY4bzltOGU4YzhoOWE4bjhpOHM4bThzLgorLnNlcnZvbWVjaGFuNGlzNG0xczIKKy5zZThzOXE4dThpOXA4ZTlkOGE5bDhpOGE4bi4KKy5zMWU0cworLnNlc3F1MgorLnNlc3EydWkyCisuc2VzcXUyaXAKKy5zZXNxdWlwZTQKKy5zZXNxdWkycDJlZAorLnNlc3F1aXAyZTJkMmEKKy5zZXNxdWlwZWRhbDFpCisuc2VzcXVpcGVkYWwyaTFhCisuc2VzcXVpcGVkYWxpMmEybgorLnNlOHQ5dThwLgorLnNlMXR1Cisuc2U4dDl1OHA4cy4KKy5zZXR1MnAxczIKKy5zZTl2OGU4cjhlOWw4eS4KKy41c2V2Cisuc2V2MWVyCisuc2V2NGVyZWwKKy5zZXZlcmUxbHkKKy5zaDhhOHA4ZTlhOGI4bDhlLgorLnNoYTNwZTRhCisuc2hhcGUxYTRiCisuc2hhcGVhYjJsMgorLnNoOG84ZTlzOHQ4cjhpOG44Zy4KKy5zaG80Cisuc2hvMmVzdDRyCisuc2hvZXN0cmluNGcKKy5zaDhvOGU5czh0OHI4aThuOGc4cy4KKy5zaG9lc3RyaW5nczIKKy5zaThkOGU5czh0OGU4cC4KKy41c2lkZTRzMgorLnMyaWQKKy5zaWRlc3RlNHAKKy5zaThkOGU5czh0OGU4cDhzLgorLnNpZGVzdGUycDFzMgorLnNpOGQ4ZTlzOHc4aThwOGUuCisuc2lkZXM0dzIKKy5zaWRlc3dpMgorLnNpZGVzdzJpcAorLnNpZGVzd2lwZTQKKy5zazh5OXM4YzhyOGE4cDhlOHIuCisuc2syCisuc2t5czRjCisuc2t5c2NyYXAzZXIKKy5zazh5OXM4YzhyOGE4cDhlOHI4cy4KKy5za3lzY3JhcGU0cjFzMgorLnNtOG84azhlOXM4dDhhOGM4ay4KKy4yczFtCisuczFtbworLnM0bTJvaworLnNtb2tlczQKKy5zbW9rZXMxdGEKKy5zbW9rZXN0YWNrMQorLnNtOG84azhlOXM4dDhhOGM4azhzLgorLnNtb2tlc3RhYzRrMXMyCisuc244bzhyOWs4ZThsOWk4bjhnLgorLnMxbjQKKy5zbm9ya2U1bDJpCisuc25vcmtlNGwzaW5nCisuc285bDhlOW44bzhpOGQuCisuMXNvCisuc29sNGVubworLnNvbGVub2kyCisuc29sZW5vMmlkCisuc285bDhlOW44bzhpOGQ4cy4KKy5zb2xlbm9pMmQxczIKKy5zbzhsOHU4dDhlLgorLnNvMWx1dAorLnNvOGw4dTh0OGU4cy4KKy5zbzh2OWU4cjllOGk4ZzhuLgorLjRzb3YKKy5zb3ZlcmVpMgorLnNvdmVyZTJpZzIKKy5zbzh2OWU4cjllOGk4ZzhuOHMuCisuc292ZXJlaWcybjFzMgorLnNwOGE5YzhlOHMuCisuMnMxcGEKKy5zcGE0Y2UKKy5zcDhlOWM4aThvOHU4cy4KKy5zcGUyYworLnNwZTFjMmkKKy5zcGVjMmlvCisuc3BlY2lvdTIKKy5zcGVjaW8ydXMKKy5zcDhlOGw4bDllOHIuCisuc3BlbDFsCisuc3BlbDJsZQorLnNwOGU4bDhsOWU4cjhzLgorLnNwZWxsZTRyMXMyCisuc3A4ZThsOGw5aThuOGcuCisuc3BlbGwyaQorLnNwZWwybGluNAorLnNwOGU5bDh1OG44azllOHIuCisuc3BlbHU0bmsyCisuc3BlbHVuazFlcgorLnNwOGU4bjhkOXQ4aDhyOGk4Zjh0LgorLnNwZW40ZAorLnNwZW5kMnRoCisuc3BlbmR0NGhyNAorLnNwZW5kdGhyNGkyZnQKKy5zcDhoOGU4cjlvOGk4ZC4KKy5zMnBoZQorLjNzcGg0ZXIKKy5zcGgyZXJvCisuc3BoZXJvaTIKKy5zcGhlcm8yaWQKKy5zcDhoOGU4cjlvOGk4ZDlhOGwuCisuc3BoZXJvaTFkMmEKKy5zcDhoOGk4bjlnOGU4cy4KKy5zcGg1aW5nCisuc3BoNGluZ2UKKy5zcDhpOGM5aTlsOHkuCisuc3AyaTFjaQorLnNwaWNpMWx5Cisuc3A4aThuOW84cjhzLgorLnNwaTJuCisuc3A0aTFubworLnNwaW5vNHJzMgorLnNwOG84azhlOHM5dzhvOG04YThuLgorLnNwMm9rCisuc3Bva2VzNAorLnNwb2tlczR3MgorLnNwb2tlNHMxd28yCisuc3Bva2Vzd29tMQorLnNwb2tlc3dvMW1hCisuc3Bva2Vzd29tYTJuCisuc3A4bzhrOGU4czl3OG84bThlOG4uCisuc3Bva2Vzd28ybWUKKy5zcG9rZXN3bzFtZW4KKy5zcDhvOHI4dDhzOWM4YThzOHQuCisuczFwNG9yNAorLnNwb3I0dDFzMgorLnNwb3J0NHNjCisuc3BvcnRzMWNhCisuc3A4bzhyOHQ4czljOGE4czh0OWU4ci4KKy5zcG9ydHNjYXN0NWVyCisuc3A4bzhyOXQ4aTh2OGU5bDh5LgorLnNwb3IxdGkKKy5zcG9yNHQyaXYKKy5zcG9ydGl2NGUxbHkKKy5zcDhvOHI4dDhzOXc4ZThhOHIuCisuc3BvcnQ0c3cyCisuc3BvcnRzd2UyYTJyCisuc3A4bzhyOHQ4czl3OHI4aTh0OGU4ci4KKy5zcG9ydHN3cmk0Cisuc3BvcnRzd3IyaXRlCisuc3A4bzhyOHQ4czl3OHI4aTh0OGU4cjhzLgorLnNwb3J0c3dyaXQ1ZTRyMXMyCisuc3A4cjhpOGc4aDh0OWw4aThlOHIuCisuc3ByMgorLnNwcjJpZworLnNwcmlnaDJ0bAorLnNwcmlnaHRsMmllNAorLnNxOHU4ZThhOW04aThzOGguCisuc3F1MgorLnNxdWVhbTJpcworLnNxdWVhbWlzMmgKKy5zdDhhOG44ZDlhOGw4bzhuOGUuCisuNXN0NGFuZAorLnN0YTJuCisuc3RhbjFkMmEKKy5zdGFuZGFsbzJuCisuc3Q4YThyOXQ4bDhpOG44Zy4KKy5zdDJhMnIKKy5zdGFyMnRsCisuc3Q4YThyOXQ4bDhpOG44ZzlsOHkuCisuc3RhcnRsaW5nbDIKKy5zdGFydGxpbmcxbHkKKy5zdDhhOXQ4aThzOXQ4aThjOHMuCisuc3RhdGlzMXQyaQorLnN0YXRpczF0aWMKKy5zdGF0aXN0aTRjM3MyCisuc3Q4ZThhOGw4dDhoOWk4bDh5LgorLnN0ZWE0bAorLnN0ZWE0bHQKKy5zdGVhbHRoM2kKKy5zdGVhbDR0aDRpbDIKKy5zdGVhbHRoaTFseQorLnN0OGU4ZThwOGw4ZTljOGg4YThzOGUuCisuczF0ZWUKKy5zdGVlNHAxCisuc3RlZTFwMmwyCisuc3RlZXBsZTJjaAorLnN0OGU4cjhlOG85ZzhyOGE4cDhoOWk4Yy4KKy5zdGVyZTFvCisuc3RlcmVvMmcKKy5zdGVyZW8xZ3IKKy5zdGVyZW81Z3JhcGgxaWMKKy5zdGVyZW9ncjRhcGhpCisuc3Q4bzljOGg4YThzOXQ4aThjLgorLnMxdG8KKy5zdG8yY2g0Cisuc3RvY2hhc3QyaQorLnN0b2NoYXMxdGljCisuc3Q4cjhhOG44ZzhlOW44ZThzOHMuCisuc3Q0cgorLnMxdHJhCisuc3RyYW40Z2UKKy5zdHJhMm4KKy5zdHIyYW5nCisuc3RyYW5nZTRuNGUKKy5zdHJhbjFnZW4KKy5zdHJhbmdlMW5lcworLnN0cmFuZ2VuMmUyc3MKKy5zdDhyOGE4cDloOGE4bjhnOGU4ci4KKy5zdHJhcGgyYW40ZworLnN0cmFwaGFuZzVlcgorLnN0cmFwaGEybgorLnN0OHI4YTh0OWE5ZzhlOG0uCisuc3RyYTJ0YQorLnN0OHI4YTh0OWE5ZzhlOG04cy4KKy5zdHJhdGFnZTRtMXMyCisuc3Q4cjhlOHQ4YzhoOWk5ZThyLgorLnN0cmU0dGMKKy5zdHJldDRjaAorLnN0cmV0Y2gyaWU0Cisuc3Q4cjhpOHA5dDhlOGE4czhlLgorLnN0cjJpcAorLnN0cmkycDF0Cisuc3RyaXAydGUKKy5zdDhyOG84bjhnOWg4bzhsOGQuCisuc3RybzJuCisuc3Ryb25naG8ybDJkCisuc3Q4cjhvOG44ZzllOHM4dC4KKy5zdDh1OXA4aThkOWU4ci4KKy5zMXR1Cisuc3R1cDRpZAorLnN0dXBpM2RlCisuc3Q4dTlwOGk4ZDllOHM4dC4KKy5zdHVwaWRlNHMyCisuc3U4YjlkOGk4ZjlmOGU4cjllOG45dDhpOGE4bC4KKy4xc3UKKy5zdTRiMworLnN1NGIxZAorLnN1YmQxaWYKKy5zdWJkaTRmMWYKKy5zdWJkaWZmZXIxCisuc3ViZGlmZmVyM2VuMXQKKy5zdWJkaWZmZXJlbnQyaQorLnN1YmRpZmZlcmVuMXQyaTFhCisuc3ViZGlmZmVyZW50aTJhbAorLnN1OGI5ZTh4OXA4cjhlOHM5czhpOG84bi4KKy5zdWI0ZQorLnN1YjFleDNwCisuc3ViZXhwcjIKKy5zdWJleDNwcjJlMnNzCisuc3ViZXhwcmVzMXNpCisuc3ViZXhwcmVzMXMyaW8KKy5zdWJleHByZXM1c2lvMm4KKy5zdThiOWU4eDlwOHI4ZThzOXM4aThvOG44cy4KKy5zdWJleHByZXNzaW8ybjNzMgorLnN1OG05bThhOWI4bDhlLgorLnN1Mm0KKy5zdW0xbQorLnN1bTFtYQorLnN1bTJtYWIKKy5zdW1tYWIybDIKKy5zdThwOGU4cjllOGc4by4KKy5zdTFwZQorLnN1cGVyZTFnbworLnN1OHA4ZThyOWU4ZzhvOHMuCisuc3VwZXJlNGdvcworLnN1OXA4cjhlOG05YTljOGk4czh0LgorLnN1cHIyCisuc3VwcmU0bWFjCisuc3VwcmUxbWEKKy5zdXByZW00YTJjaQorLnN1OXA4cjhlOG05YTljOGk4czh0OHMuCisuc3VwcmVtYWNpczR0MXMyCisuc3U4cjl2OGU4aThsOWw4YThuOGM4ZS4KKy5zdTJyCisuc3VydjRlCisuc3VydmVpMgorLnN1cnZlaWwxbAorLnN1cnZlaWxsYTJuCisuc3c4aThtOW04aThuOGc5bDh5LgorLnN3MgorLnN3aTIKKy5zd2ltMW0KKy5zd2ltbTRpbmdsMgorLnN3aW1tNWluZzFseQorLnN5OG04cDl0OG85bThhOHQ4aThjLgorLnN5NG0xcAorLnN5bTJwMXQKKy5zeW1wMXRvCisuc3ltcHRvMm1hCisuc3ltcHRvbWF0MWljCisuc3k4bjljOGg4cjhvOW04ZThzOGguCisuc3luM2M0aHI0Cisuc3luMmNoCisuc3luY2hybzJtZQorLnN5bmNocm8ybWVzCisuc3luY2hyb200ZXMyaAorLnN5OG45YzhoOHI4bzluOG84dThzLgorLnN5bmNocm8ybgorLnN5bmNocm8xbm91MgorLnN5bmNocm9ubzJ1cworLnN5OG45YzhoOHI4bzl0OHI4bzhuLgorLnN5bmNocm90cm8ybgorLnRhOGY4ZjlyOGE4aThsLgorLjR0YTJmNAorLnRhNGYxZjQKKy50YWZmcjJhaTIKKy50YThsOGs5YTl0OGk4djhlLgorLnRhMmwKKy40dGFsaworLnRhbGthMworLnRhbGthNHQKKy50YWxrYTF0Mml2CisudGE5cDhlOHM5dDhyOHkuCisudGFwMmVzdDRyCisudGFwZTRzdHJ5CisudGE5cDhlOHM5dDhyOGk4ZThzLgorLnRhcGVzdHIyaWU0CisudGE4cjlwOGE4dTlsOGk4bi4KKy50MmEycgorLnRhcjJwCisudGFyMXBhCisudGFycGF1NGwyCisudGFycGF1bDJpCisudGE4cjlwOGE4dTlsOGk4bjhzLgorLnRhcnBhdWwyaTJuMXMyCisudGU5bDhlOGc5cjhhOXA4aDhlOHIuCisudGVsZTFncgorLnRlbGVnNXJhM3BoNGVyCisudGU5bDhlOGc5cjhhOXA4aDhlOHI4cy4KKy50ZWxlZ3JhcGhlNHIxczIKKy50ZThsOGU5azhpOW44ZTh0OWk4Yy4KKy50ZWxla2k0bgorLnRlbGVrMWkKKy50ZWxlazJpbmUKKy50ZWxla2kzbmV0MWljCisudGU4bDhlOWs4aTluOGU4dDlpOGM4cy4KKy50ZWxla2luZXRpNGMzczIKKy50ZThsOGU5cjhvOWI4bzh0OWk4YzhzLgorLnRlNGwxZXIKKy50ZWw0ZXJvCisudGVsZXI1b2IKKy50ZWxlcm9ib3RpNGMzczIKKy50ZThsOGw5ZThyLgorLnRlbDFsCisudGVsMmxlCisudGU4bDhsOWU4cjhzLgorLnRlbGxlNHIxczIKKy50ZThtOXA4bzlyOGE4cjlpOGw4eS4KKy50ZTRtMXAKKy50ZW0xcDRvcgorLnRlbXBvMXJhCisudGVtcG80cmFyaWwKKy50ZW1wb3IyYTJyCisudGVtcG9yYXIxaQorLnRlbXBvcmFyaTFseQorLnRlOG45dThyOGUuCisudGU4czh0OWI4ZThkLgorLnRlczJ0MWIKKy50ZXN0NGJlMmQKKy50ZTh4OHQ5dzhpOGQ4dDhoLgorLjN0ZXgKKy50ZXgxdDIKKy50ZXh0dzQKKy50ZXh0d2kyCisudGV4dHcyaWQKKy50ZXh0d2lkMnRoCisudGg4YThsOWE5bTh1OHMuCisudGhhM2xhCisudGhhbGEzbQorLnRoYWxhMW11CisudGhhbGFtMnVzCisudGg4ZThyOW04bzllOGw4YThzOXQ4aThjLgorLnRoMmUKKy50aGVyM200CisudGhlcjFtbworLnRoZXJtbzRlbAorLnRoZXJtb2UxbGEKKy50aGVybW9lbGFzdDJpCisudGhlcm1vZWxhczF0aWMKKy50aThtOGU5czh0OGE4bThwLgorLnRpMm1lcworLnRpbWVzMXRhCisudGltZXN0YTRtMXAKKy50aThtOGU5czh0OGE4bThwOHMuCisudGltZXN0YW0ycDFzMgorLnRvOG84bDlrOGk4dC4KKy50b28yCisudG9vbGsxaQorLnRvOG84bDlrOGk4dDhzLgorLnRvb2xraTR0MXMyCisudG84cDhvOWc4cjhhOHA4aDlpOWM4YThsLgorLnRvNXBvNGcKKy50b3BvMWdyCisudG9wbzVncmFwaDFpYworLnRvcG9ncjRhcGhpCisudG9wb2dyYXBoaTFjYQorLnRvOHE4dThlOHMuCisudG8xcQorLnRvcXUyCisudHI4YThpOXQ4bzhyOW84dThzLgorLjF0cmEKKy50cjJhaTIKKy50cmFpMXRvCisudHJhaXRvcm91MgorLnRyYWl0b3JvMnVzCisudHI4YThuOHM5YzhlOGk4djhlOHIuCisudHJhMm4KKy50cmEybjFzMgorLnRyYW5zNGMKKy50cmFuNHMzY2VpMgorLnRyYW5zY2UyaXYKKy50cjhhOG44czljOGU4aTh2OGU4cjhzLgorLnRyYW5zY2VpdmU0cjFzMgorLnRyOGE4bjhzOWc4cjhlOHM4cy4KKy50cmFuMnMzZworLnRyYW5zMWdyCisudHJhbnNncjJlMnNzCisudHI4YThuOHM5djhlOHI5czhhOGwuCisudHJhbjRzdgorLnRyYW5zdmU0cjFzMgorLnRyYW5zdmVyMXNhMgorLnRyOGE4bjhzOXY4ZThyOXM4YThsOHMuCisudHJhbnN2ZXJzYTJsMXMyCisudHI4YThuOHM5djhlOHM5dDhpOHQ4ZS4KKy50cmFuc3Y0ZTJzCisudHJhbnN2ZXN0MmkKKy50cmFuc3Zlc3QyaXRlCisudHI4YThuOHM5djhlOHM5dDhpOHQ4ZThzLgorLnRyYW5zdmVzdGl0NGVzCisudHI4YTl2OGU4cjhzOWE5YjhsOGUuCisudHJhdmU0cjFzMgorLnRyYXZlcjFzYTIKKy50cmF2ZXIyczFhYgorLnRyYXZlcnNhYjJsMgorLnRyOGE5djhlOHI5czhhOGwuCisudHI4YTl2OGU4cjlzOGE4bDhzLgorLnRyYXZlcnNhMmwxczIKKy50cjhpOWU4dDhoOHk4bDlhOG04aThuOGUuCisudHJpNWV0CisudHIyaWU0CisudHJpZXRoeTNsYQorLnRyaWV0aHlsYW0xaW4KKy50cmlldGh5bGFtMmluZQorLnRyOGU4YThjOGg5ZThyOGk4ZThzLgorLnRyZWEyY2gKKy50cmVhY2hlMgorLnRyZWFjaGVyMWkKKy50cmVhY2hlcjJpZTQKKy50cjhvOHU5YjhhOWQ4bzh1OHIuCisudHJvdTIKKy50cm91YmEyZAorLnRyb3ViYTFkbworLnRyb3ViYWRvdTIKKy50dThyOWs4ZTh5LgorLjF0dQorLnR1OHI5azhlOHk4cy4KKy50dXJrZXlzNAorLnR1OHI4bjlhOHI4bzh1OG44ZC4KKy50dXI0bjJhMnIKKy50dXIxbmEKKy50dXJuYXJvdTIKKy50dXJuYXJvdW4yZAorLnR1OHI4bjlhOHI4bzh1OG44ZDhzLgorLnR1cm5hcm91bjJkMXMyCisudHk4cDlhOGwuCisuMXR5CisudHkxcGEKKy50eXA0YWwKKy51bjlhOHQ5dDhhOGM4aDhlOGQuCisudW4yYXQ0CisudW5hNHQzdDIKKy51bmF0MXRhCisudW5hdHRhMmNoCisudW5hdHRhY2hlMgorLnVuYXR0YTRjaDRlZAorLnVuOWU4cjhyOWk4bjhnOWw4eS4KKy51bjRlcgorLnVuZXI0cjQKKy51bmVycmluNGcKKy51bmVycmluZ2wyCisudW5lcnJpbmcxbHkKKy51bjlmOHI4aThlOG44ZDlsOHkuCisudW4zZgorLnVuZnJpMgorLnVuZnIyaWU0CisudW5mcmllbjJkMWx5CisudW45ZjhyOGk4ZThuOGQ5bDhpOWU4ci4KKy51bmZyaWVuZGwyaWU0CisudmE4Zzh1OGU4ci4KKy4xdmEKKy52YWc0CisudmE1Z3VlcgorLnZhMmd1ZQorLnZhOHU4ZDhlOXY4aThsOGw4ZS4KKy52YXVkZTF2NAorLnZhdWRlMnYzaTRsCisudmF1ZGUxdmkKKy52YXVkZXZpbDFsCisudmF1ZGV2aWwybGUKKy52aThjOWE4cjhzLgorLnY0aWMyYTJyCisudmkxY2EKKy52aWNhNHJzMgorLnZpOGw5bDhhOGk4bjllOHM4cy4KKy4ydmlsCisudmlsMWwKKy52aWxsYWkyCisudmlsbGE0aTRuCisudmlsbGEyaW5lCisudmlsbGFpNW4yZTJzcworLnZpbGxhaTFuZXMKKy52aThzOXU4YThsLgorLnZpM3N1CisudmlzdTFhbAorLnZpOHM5dThhOGw5bDh5LgorLnZpc3VhbDFsCisudmlzdWFsMWx5Cisudmk5djhpOHA5YTlyOG84dThzLgorLjN2Mml2Cisudml2Mmk0cAorLnZpdmkxcGEKKy52aXZpcDJhMnIKKy52aXZpcGFyb3UyCisudml2aXBhcm8ydXMKKy52bzhpOGM4ZTlwOHI4aThuOHQuCisudm9pNAorLnZvaTNjZXAKKy52b2ljZXByMgorLnZvaWNlcHJpbjR0MworLnZzOHA4YThjOGUuCisudjJzMXBhCisudnNwYTRjZQorLndhOGQ5ZDhpOG44Zy4KKy53YTJkCisud2FkNGQxaW4KKy53YWQxZDQKKy53YThsOGw5ZjhsOG84dzhlOHIuCisud2FsMWwKKy53YWwybGYKKy53YWxsZjRsMgorLndhbGxmbG93MWVyCisud2E4bDhsOWY4bDhvOHc5ZThyOHMuCisud2FsbGZsb3dlNHIxczIKKy53YThyOG05ZThzOHQuCisudzJhMnIKKy53YXIxbQorLndhcjJtZQorLndhcjJtZXMKKy53YThzOHQ4ZTl3OGE4dDhlOHIuCisud2FzNHQKKy53YXN0ZTJ3Cisud2FzdGUxdzVhCisud2FzdGV3YTF0ZQorLndhOHY4ZTlnOHU4aThkOGUuCisud2F2ZWczCisud2F2ZWcydWkyCisud2F2ZWd1MmlkCisud2E4djhlOWc4dThpOGQ4ZThzLgorLndhdmVndWlkZTRzMgorLndhOHY4ZTlsOGU4dC4KKy53YTh2OGU5bDhlOHQ4cy4KKy53YXZlbGU0dDFzMgorLndlOGI5bDhpOGs4ZS4KKy53MmUxYgorLndlYjJsMgorLndlYjNsNGlrCisud2U4ZThrOW44aThnOGg4dC4KKy53ZWVrbjJpZworLndlOGU4azluOGk4ZzhoOHQ4cy4KKy53ZWVrbmlnaDR0MXMyCisud2g4ZThlOGw5YzhoOGE4aThyLgorLndoZWU0bDFjMgorLndoZWVsMmNoCisud2hlZWxjaGFpMgorLndoZWVsY2hhNGlyCisud2g4ZThlOGw5YzhoOGE4aThyOHMuCisud2hlZWxjaGFpNHJzMgorLndoOGk4YzhoOWU4djhlOHIuCisud2hpNAorLndoNGkyY2gKKy53aGljaGUyCisud2hpY2hldjFlcgorLndoOGk4dDhlOXM4aThkOGU4ZC4KKy53aDJpdGUKKy53aGl0NGVzCisud2hpdGUxc2kKKy53aGl0ZTJzMmlkCisud2hpdGVzaTJkMWVkCisud2g4aTh0OGU5czhwOGE4YzhlLgorLndoaXRlMXNwCisud2hpdGUyczFwYQorLndoaXRlc3BhNGNlCisud2g4aTh0OGU5czhwOGE4YzhlOHMuCisud2k4ZDhlOXM4cDhyOGU4YThkLgorLncyaWQKKy53aWRlNHMyCisud2lkZTFzcAorLndpZGVzNHByZQorLndpZGVzcHIyCisud2lkZXNwcmVhMmQxCisud2k4bjhnOXM4cDhhOG4uCisud2luNGcKKy53aW5nczIKKy53aW5nMnMxcGEKKy53aW5nc3BhNG4KKy53aThuOGc5czhwOGE4bjhzLgorLndpbmdzcGEybjFzMgorLndpOG44ZzlzOHA4cjhlOGE4ZC4KKy53aW5nc3ByMgorLndpbmdzcHJlYTJkMQorLndpOHQ4YzhoOWM4cjhhOGY4dC4KKy53aTR0YworLndpdDRjaAorLndpdGNoY3JhMmY0dAorLndpdGNoY3JhMmYKKy53bzhyOGQ5czhwOGE4YzlpOG44Zy4KKy4xd28yCisud29yMmQxczIKKy53b3JkczRwCisud29yZDJzMXBhCisud29yZHNwNGEyY2kKKy53b3Jkc3BhMmMxaW4KKy53b3Jkc3BhYzFpbmcKKy53bzhyOGs5YThyOG84dThuOGQuCisud29yazJhMnIKKy53b3JrYXJvdTIKKy53b3JrYXJvdW4yZAorLndvOHI4azlhOHI4bzh1OG44ZDhzLgorLndvcmthcm91bjJkMXMyCisud284cjhrOWg4bzhyOHM4ZS4KKy53b3JraDQKKy53b3JraG9yNHNlCisud29ya2hvNHJzMgorLndvOHI4azloOG84cjhzOGU4cy4KKy53b3JraG9yczNlNHMKKy53cjhhOHA5YThyOG84dThuOGQuCisud3JhNAorLndyYXAyYTJyNAorLndyYTFwYQorLndyYXBhcm91MgorLndyYXBhcm91bjJkCisud3I4ZTh0OGM4aDllOGQuCisud3JlNHRjCisud3JldDRjaAorLndyZXRjaGUyCisud3JldDRjaDRlZAorLndyOGU4dDhjOGg5ZThkOWw4eS4KKy53cmV0Y2hlMmQxbHkKKy55ZThzOXQ4ZThyOXk4ZThhOHIuCisueWVzNAorLnllc3RlcnllMmEycgorLmFsOWc4ZTliOHI4YThpOXM4YzhoOGUuCisuYWxnZWJyYTJpczFjCisuYWxnZWJyYWlzM2NoMgorLmFsZ2VicmFpc2NoZTIKKy5hbDlsOGU5ZzhoOGU5bjh5LgorLmFsMWwKKy5hbDJsZQorLmFsM2xlZworLmFsbGVnaGUybgorLmFyOWs4YThuOXM4YThzLgorLmFya2EybgorLmFya2FuMnNhMgorLmFya2EybjFzMgorLmF0OHA5YThzOGUuCisuYTR0MXAKKy5hdDFwYQorLmF0OHA5YThzOGU4cy4KKy5hdHBhczFlNHMKKy5hdThzOXQ4cjhhOGw5YThzOGk4YThuLgorLmEydXMKKy5hdXMxdDRyCisuYXVzMXRyYQorLmF1c3RyYWxhczJpMWEKKy5hdXN0cmFsYXNpMmEybgorLmF1OHQ4bzltOGE4dDhpOXM4aThlOHI5dDhlOHIuCisuYXV0b21hM3RpcworLmF1dG9tYXRpczJpZTQKKy5hdXRvbWF0aXNpZXJ0M2VyCisuYmU5ZDhpOGU5bjh1OG44Zy4KKy40YmUyZAorLmI0ZTNkaQorLmJlNWRpM2VuCisuYmVkMmllNAorLmJlZGllM251NG4KKy5iZThtOGI4by4KKy40YmU1bQorLmJlNG01YgorLmJpOGI5bDhpOW85ZzhyOGE5cDhoOGk5czhjOGg4ZS4KKy5iaWJsaW9ncjRhcGhpCisuYmlibGlvZ3JhcGgyaXMxYworLmJpYmxpb2dyYXBoaXMzY2gyCisuYmlibGlvZ3JhcGhpc2NoZTIKKy5ibzhzOXQ4bzhuLgorLjVib3M0CisuYm9zMXRvCisuYm9zdG8ybgorLmJyOG84dzhuOWk4YThuLgorLmJyb3duNWkKKy5icm93M240aTFhCisuYnJvd25pM2EybgorLmJyOHU4bjhzOXc4aThjOGsuCisuYnJ1Mm4KKy5icnUybjNzNAorLmJydW40c3cyCisuYnJ1bnN3aTIKKy5icnVuc3dpY2sxCisuYnU5ZDhhOXA4ZThzOHQuCisuYnUxZDJhCisuY2E4cjlpOGI5YjhlOGE4bi4KKy5jYXIxaQorLmNhcjRpYgorLmNhcmkyYjFiCisuY2FyaWIyYmUKKy5jYXJpYmJlYTJuCisuY2g4YThyOGw4ZThzOXQ4bzhuLgorLmNoYXI0bGU0CisuY2hhcjFsCisuY2hhcmxlczIKKy5jaGFybDRlczJ0bworLmNoYXJsZTNzdG8ybgorLmNoOGE4cjlsOG84dDh0OGU4czl2OGk4bDhsOGUuCisuY2hhcjNsbzQKKy5jaGFybG80dDN0MgorLmNoYXJsb3Q0dGVzCisuY2hhcmxvdHRlNHN2CisuY2hhcmxvdHRlczJ2aWwKKy5jaGFybG90dGVzdmlsMWwKKy5jaGFybG90dGVzdmlsMmxlCisuY285bDh1OG05YjhpOGEuCisuY29sdW00YmkKKy5jb2x1NG0xYgorLmNvbHVtYjJpMWEKKy5jejhlOGM4aDhvOXM4bDhvOXY4YTlrOGk4YS4KKy5jMnplNAorLmN6ZTJjaAorLmN6ZTNjaG8yCisuY3plY2hvczRsMgorLmN6ZWNob3M0bG92CisuY3plY2hvc2xvMXZhCisuY3plY2hvc2xvdmFrMWkKKy5jemVjaG9zbG92YWsyaTFhCisuZGU4bDlhOXc4YThyOGUuCisuZGUxbGEKKy5kZTRsYXcKKy5kZWxhdzJhMnIKKy5kaThqOGs5czh0OHI4YS4KKy5kaTNqCisuZGlqNGsxczIKKy5kaWprc3Q0cgorLmRpamtzMXRyYQorLmR1OGE4bjhlLgorLmQxdTFhCisuZHVhMm4KKy5keTluOGE5bThpOXM4YzhoOGUuCisuNWR5bgorLmR5MW5hCisuZHluYW0yaXMKKy5keW5hbTJpczFjCisuZHluYW1pczNjaDIKKy5keW5hbWlzY2hlMgorLmVuOGc5bDhpOHM4aC4KKy5lbmdsMgorLmVuZ2xpczJoCisuZXU4bDhlOHI5aThhOG4uCisuZXVsNGUKKy5ldTNsNGVyMWkKKy5ldWxlMXIyaTNhNAorLmV1bGVyaTJhMm4KKy5ldjhhOG45czh0OG84bi4KKy5lMXZhCisuZXZhMm4KKy5ldmFuNHN0CisuZXZhMm4xczIKKy5ldmFuczF0bworLmV2YW5zdG8ybgorLmZlOGI5cjh1OWE4cjh5LgorLmYyZTRiCisuZmUzYnIKKy5mZWJydTNhCisuZmVicnUyYTJyCisuZmU4czh0OXM4YzhoOHI4aThmOHQuCisuZmVzNHQxczIKKy5mZXN0NHNjCisuZmVzdHMyY2gyCisuZmVzdHNjNGhyNAorLmZlc3RzY2hyNGkyZnQKKy5mbDhvOHI5aTlkOGEuCisuZmxvcjJpZAorLmZsb3JpMWQyYQorLmZsOG84cjlpOWQ5aThhOG4uCisuZmxvcmkyZGkKKy5mbG9yaWQ1aTJhMm4KKy5mbG9yaTFkNGkzYQorLmZvOHI5czhjOGg4dThuOGc4czlpOG45czh0OGk5dDh1OHQuCisuZm9yczRjCisuZm9yczJjaDIKKy5mb3JzY2h1bmdzMgorLmZvcnNjaHVuZzJzMWluCisuZm9yc2NodW5nczJpMm4xczIKKy5mb3JzY2h1bmdzaW5zdDJpCisuZm9yc2NodW5nc2luc3RpMXR1CisuZnI4ZThlOWI4czhkLgorLmZyZTJlMWIKKy5mcmVlMmI1czIKKy5mcmVlYjRzNWQKKy5mdThuOGs5dDhzOGk4bzhuOGE4bC4KKy4zZnUKKy5mdTRuazIKKy5mdW5rNXQKKy5mdW5rNHQxczIKKy5mdW5rdDFzMmlvCisuZnVua3Q1c2lvMm4KKy5mdW5rdHNpbzFuNWEKKy5nYTh1OHM4czlpOGE4bi4KKy5nYTJ1cworLmdhdTJzcworLmdhdXMxc2kKKy5nYXVzczJpMWEKKy5nYXVzc2kyYTJuCisuZ2g4bzhzOHQ5czhjOHI4aThwOHQuCisuZ2hvczR0MXMyCisuZ2hvc3Q0c2MKKy5naG9zdHNjcmkyCisuZ2hvc3RzY3IyaXAKKy5naG9zdHNjcmkycDF0CisuZ2g4bzhzOHQ5djhpOGU4dy4KKy5naG9zNHR2CisuZ2hvc3R2MmllNAorLmdyOGE4czhzOW04YThuOG45aThhOG4uCisuZ3IyYXMKKy5ncmEyc3MKKy5ncmFzMnMxbQorLmdyYXNzM21hCisuZ3Jhc3NtYTJuMworLmdyYXNzbWE0bjFuMgorLmdyYXNzbWFuM240aTFhCisuZ3Jhc3NtYTJubmkzYTJuCisuZ3I4ZThpOGY4czl3OGE4bDhkLgorLmdyZWkyCisuZ3JlaTJmM3MKKy5ncmVpZnN3MgorLmdyZWlmc3dhMmxkCisuZ3I4bzh0OGg4ZThuOWQ4aThlOGM4ay4KKy5nNHJvCisuZ3JvNHRoMmUKKy5ncjRvdGgKKy5ncm90aGUybgorLmdyb3RoZW5kMmllNAorLmdyb3RoZW5kaWVjazEKKy5ncjh1OG44ZDlsOGU4aDlyOGU4bi4KKy5ncnUybgorLmdydW5kbGUxaDQKKy5ncnVuZGxlNGhyNAorLmhhOWQ4YTltOGE4cjhkLgorLmhhMmQKKy5oYTFkMmEKKy5oYWRhMm0yCisuaGFkNGExbWEKKy5oYWRhbTJhMnIKKy5oYThpOWY4YS4KKy5oYWkxZmEKKy5oYThtOGk4bDl0OG84bjlpOGE4bi4KKy5oYTRtCisuaGFtaTRsdAorLmhhbWlsMXRvCisuaGFtaWx0bzJuCisuaGFtaWx0bzNuNGkxYQorLmhhbWlsdG9uaTNhMm4KKy5oZThsOXM4aThuOGs4aS4KKy5oZTJsMXMyCisuaGVsMnMxaW4KKy5oZWxzNGk0bmsyCisuaGVsc2luazFpCisuaGU4cjltOGk4dDlpOGE4bi4KKy5oZXIzbWl0CisuaGVybWkxdGkKKy5oZXJtNGkxdDJpMWEKKy5oZXJtaXRpMmEybgorLmhpOGI4YjhzLgorLmhpMmIxYgorLmhpYjJiNXMyCisuaG84azlrOGE4aTlkOG8uCisuaDJvaworLmhva2s0CisuaG9ra2FpMgorLmhva2thMmlkCisuaG9ra2FpMWRvCisuamE4YzlrOG84dzlzOGs4aS4KKy41amEKKy5qYWNrMQorLmphY2tvd3NrMgorLmphY2tvd3NrMWkKKy5qYThuOXU5YThyOHkuCisuamEybgorLmphbjN1MWEKKy5qYW51MmEycgorLmphOXA4YTluOGU4czhlLgorLmphNHAKKy5qYTFwYQorLmphcGEybgorLmphcGExbmVzCisuamFwYW5lMXMyZQorLmthOGQ5bzhtOXQ4czhlOHYuCisua2EyZAorLmthMWRvCisua2FkbzRtdAorLmthZG9tNHQxczIKKy5rYWRvbXQ1c2V2Cisua2E4bjlzOGE4cy4KKy5rYTJuCisua2FuMnNhMgorLmthMm4xczIKKy5rYThyOGw4czlyOHU4aDhlLgorLmsyYTJyCisua2FyMWwKKy5rYXIybDFzMgorLmthcmxzMXIKKy5rbzhyOXQ4ZTl3OGU4Zy4KKy5rbzVyCisua3I4aThzOGg4bjhhLgorLmtyMmlzCisua3IzaXMyaAorLmtyaXMyaDFuCisua3Jpc2gxbmEKKy5rcjhpOHM4aDluOGE5aThzOG0uCisua3Jpc2huYWkyCisua3Jpc2huYWkyczFtCisua3I4aThzOGg5bjhhOG4uCisua3Jpc2huMmEybgorLmxhOG45YzhhOHM5dDhlOHIuCisubGFuMWNhCisubGFuY2FzdDVlcgorLmxlOWc4ZThuOGQ4cjhlLgorLmxlMWdlbgorLmxlZ2VuMWRyCisubGVnZW5kcmU0CisubGU4aThjOGU4czl0OGU4ci4KKy5sZWkyCisubGU1aWMKKy5sZWljZXM1dAorLmxpOHA5czhjOGg4aTh0OHouCisubDJpcAorLmxpMnAxczIKKy5saXBzMmNoMgorLmxpcHMzY2hpdAorLmxpcHNjaGk0dHoKKy5saThwOXM4YzhoOGk4dDh6OWk4YThuLgorLmxpcHNjaGl0MnoxaQorLmxpcHNjaGl0ejJpMWEKKy5saXBzY2hpdHppMmEybgorLmxvOGo5YjhhOG4uCisubG81agorLmxvamJhMm4KKy5sbzh1OWk5czhpOWE4bjhhLgorLmxvdTIKKy5sbzJ1aTIKKy5sb3VpczJpMWEKKy5sb3Vpc2kyYTJuCisubG91aXNpYTFuYQorLm1hOGM5bzhzLgorLm1hMWNvCisubWE4bjljOGg4ZThzOXQ4ZThyLgorLm1hbjJjaAorLm1hbmNoZTIKKy5tYW5jaDFlcworLm1hOHI5azhvOHY5aThhOG4uCisubWFya281dmkyYTJuCisubWFya292MmkxYQorLm1hOHI4azh0OW84YjhlOHI5ZDhvOHI4Zi4KKy5tYXJrNXQKKy5tYXJrMXRvCisubWFya3RvM2IKKy5tYXJrdG9iZXIxZG8KKy5tYXJrdG9iZXJkNG9yCisubWFya3RvYmVyZG9yMWYKKy5tYThzOHM5YTljOGg4dTlzOGU4dDh0OHMuCisubWEyc3MKKy5tYXMxc2EyCisubWFzc2EyY2gKKy5tYXNzYWNoMnVzCisubWFzc2FjaHVzZTR0M3QyCisubWFzc2FjaHVzZXQ0dDFzMgorLm1hOHg5dzhlOGw4bC4KKy5tYXh3ZWw0bAorLm1pOWM4cjhvOXM4bzhmOHQuCisubWljcm8yc28KKy5taWNyb3NvMmZ0MworLm1pOG45bjhlOWE4cDlvOWw4aThzLgorLm0yaTRuMW4yCisubWlubmU0CisubWlubmVhcG9sMmkKKy5taThuOW44ZTlzOG84dDhhLgorLm1pbjFuZXMKKy5taW5uZTFzbworLm1pbm5lc28xdGEKKy5tbzhzOWM4bzh3LgorLm1vczJjCisubW9zMWNvCisubmE4YzhoOXI4aThjOGg4dDhlOG4uCisuMW5hCisubmEyY2gKKy5uYWM0aHI0CisubmEyY2hyNGkyY2gKKy5uYWNocmljaHQxZW4KKy5uYThzOGg5djhpOGw4bDhlLgorLm40YXMKKy5uYXMyaAorLm5hc2gydmlsCisubmFzaHZpbDFsCisubmFzaHZpbDJsZQorLm5lOHQ5YjhzOGQuCisubmUydDFiCisubmV0MmI1czIKKy5uZXRiNHM1ZAorLm5lOHQ5czhjOGE4cDhlLgorLm5lNHQxczIKKy5uZXQ0c2MKKy5uZXRzY2E0cAorLm5ldHMxY2EKKy5uaThqOW04ZTlnOGU4bi4KKy5uaTNqCisubmlqbWUyZworLm5pam1lMWdlbgorLm5vOGU5dDhoOGU4cjlpOGE4bi4KKy4zbm9lCisubm9ldGgyZQorLm5vZXRoZXIxaQorLm5vZXRoZTFyMmkzYTQKKy5ub2V0aGVyaTJhMm4KKy5ubzhvOHI4ZDl3OGk4ajhrOGU4cjloOG84dTh0LgorLm5vbzIKKy5ubzNvcmQKKy5ub29yZDF3Cisubm9vcmR3aTIKKy5ub29yZHdpM2oKKy5ub29yZHdpamsxZXIKKy5ub29yZHdpamtlcjFoNAorLm5vb3Jkd2lqa2VyaG91MgorLm5vOXY4ZThtOWI4ZThyLgorLm5vdmU0bTViCisub3A4ZThuOWI4czhkLgorLm9wZTRuMWI0Cisub3BlbjJiNXMyCisub3BlbmI0czVkCisub3A4ZThuOW84ZjhmOGk4YzhlLgorLm9wNGVubworLm9wZW5vNGYxZgorLm9wZW5vZjFmaQorLnBhOGw4YTl0OGk4bjhvLgorLnBhbGEydDFpbgorLnBhbGF0Mmkxbm8KKy5wYTlsOGU4cjltOG8uCisucGFsZXIzbTQKKy5wYWxlcjFtbworLnBlOXQ4cjhvOHY5czhrOGkuCisucGV0cm8zdgorLnBldHJvdnNrMgorLnBldHJvdnNrMWkKKy5wZjhhOGY4ZjlpOGE4bi4KKy40cGYKKy5wMWZhCisucGZhMmYKKy5wZmE0ZjFmNAorLnBmYWYxZmkKKy5wZmFmZjJpM2EKKy5wZmFmZmkyYTJuCisucGg4aThsOWE5ZDhlOGw5cDhoOGk4YS4KKy5waGk0bDRhZGUKKy5waGlsYTJkCisucGhpbGFkZTJscAorLnBoaWxhZGVsNXBoaQorLnBoaWxhZGVscGgyaTFhCisucGg4aThsOW85czhvOHA4aDlpOXM4YzhoOGUuCisucGhpbG8yc28KKy5waGlsb3M0b3AKKy5waGlsb3Myb3BoCisucGhpbG9zb3BoMmlzMWMKKy5waGlsb3NvcGhpczNjaDIKKy5waGlsb3NvcGhpc2NoZTIKKy5wbzhpOG45YzhhOHI4ZS4KKy5wb2luMgorLnBvaTIKKy5wb2luYzJhMnI1CisucG9pbjFjYQorLnBvOXQ4ZThuOXQ4aThhOGw5ZzhsOGU4aTljOGg4dThuOGcuCisucDRvdAorLnBvMXRlbjF0CisucG90ZW50MmkKKy5wb3RlbjF0MmkxYQorLnBvdGVudGkyYWwKKy5wb3RlbnRpYTRsMWc0CisucG90ZW50aWFsZ2wyCisucG90ZW50aWFsMWdsZQorLnBvdGVudGlhbGdsZWkyCisucG90ZW50aWFsZ2xlNWljCisucG90ZW50aWFsZ2xlNGkyY2gKKy5yYTlkOGg4YTlrOHI4aThzOGg5bjhhOG4uCisucmFkMWgyCisucmFkaGFrcjJpcworLnJhZGhha3IzaXMyaAorLnJhZGhha3JpczJoMW4KKy5yYWRoYWtyaXNoMW5hCisucmFkaGFrcmlzaG4yYTJuCisucmE4dDhoOHM5azhlOGw5bDhlOHIuCisucjRhdGgKKy5yYTJ0NGgxczIKKy5yYXRoc2syCisucmF0aDRza2UKKy5yYXRoc2tlbDFsCisucmF0aHNrZWwybGUKKy5yaThlOW04YThuOG45aThhOG4uCisucjJpZTQKKy5yaWU1bWEybgorLnJpZTFtYQorLnJpZW1hNG4xbjIKKy5yaWVtYW4zbjRpMWEKKy5yaWVtYTJubmkzYTJuCisucnk4ZDliOGU4cjhnLgorLnJ5MWQKKy5yeWQxYgorLnJ5ZGJlcmcyCisuc2M4aDhvOHQ5dDhpOHM4YzhoOGUuCisuc2NobzR0M3QyCisuc2Nob3R0MmlzMWMKKy5zMmNoMm90dGlzM2NoMgorLnNjaG90dGlzY2hlMgorLnNjOGg4cjhvOWQ4aThuOGc5ZThyLgorLnNjNGhyNAorLnNjaHJvZDFpbgorLnNjaHJvZDRpbmdlCisuc2M4aDh3OGE5YjhhOWM4aDhlOHIuCisuc2NoMXcKKy5zY2h3YWJhMmNoCisuc2Nod2FiYWNoZTIKKy5zYzhoOHc4YThyOHo5czhjOGg4aThsOGQuCisuc2NodzJhMnIKKy5zMmNod2FyenMyY2gyCisuc2Nod2FyenNjaDRpbDIKKy5zY2h3YXJ6c2NoaTJsZAorLnNlOHA5dDhlOG05YjhlOHIuCisuc2UycDF0Cisuc2VwMnRlCisuc2VwdGU0bTViCisuc3Q4bzhrOGU4czlzOGM4aDhlLgorLnN0Mm9rCisuc3Rva2VzNAorLnN0b2syZTJzcworLnN0b2tlczJzNWMKKy5zdG9rZXNzMmNoMgorLnN0b2tlc3NjaGUyCisuc3Q4dTh0OHQ5ZzhhOHI4dC4KKy5zdHU0dDN0MgorLnN0dXQ0dDFnCisuc3R1dHQxZ2EKKy5zdHV0dGcyYTJyCisuc3U4czlxOHU4ZTloOGE4bjluOGEuCisuczJ1cworLnN1c3F1MgorLnN1c3F1ZTFoNAorLnN1c3F1ZWhhMm4KKy5zdXNxdWVoYTRuMW4yCisuc3VzcXVlaGFuMW5hCisudGE4dTliOGU4cjlpOGE4bi4KKy50YXU0YgorLnRhdWI0ZQorLnRhdTNiZXIKKy50YXViZXIxaQorLnRhdWJlMXIyaTNhNAorLnRhdWJlcmkyYTJuCisudGU4YzhoOW44aTlzOGM4aDhlLgorLnRlMmNoCisudGVjMmgxbgorLnRlY2huMmlzMWMKKy50ZTJjaG5pczNjaDIKKy50ZWNobmlzY2hlMgorLnRlOG45bjhlOHM5czhlOGUuCisudDRlNG4xbjIKKy50ZW5uZTQKKy50ZW4xbmVzCisudGVubjJlMnNzCisudG85bThhOXM4ejhlOHc5czhrOGkuCisudG8ybWEKKy50b21hczJ6ZQorLnRvbWFzemV3c2syCisudG9tYXN6ZXdzazFpCisudHk5cDhvOWc4cjhhOHA4aDhpOHE4dThlLgorLnR5M3BvCisudHk1cG80ZworLnR5cG8xZ3IKKy50eXBvZ3I0YXBoaQorLnR5cG9ncmFwaGlxdTIKKy51azhyOGE4aThuOWk4YThuLgorLjR1aworLnVrcjJhaTIKKy51a3JhNGk0bgorLnVrcmEyaW5pCisudWtyYWk0bjRpMWEKKy51a3JhaW5pM2EybgorLnZlOHI5YThsOGw5ZzhlOW04ZThpOG45ZThyOHQ4ZS4KKy52ZXJhbDFsCisudmVyYWw0bDFnNAorLnZlcmFsbGdlMW1lCisudmVyYWxsZ2VtZWkyCisudmVyYWxsZ2VtZTJpbmUKKy52ZXJhbGxnZW1laW4xZXIKKy52ZThyOWU4aThuOWk5Zzh1OG44Zy4KKy52ZXJlM2luCisudmVyZWkyCisudmVyZTJpbmkKKy52ZXJlaW4yaWcKKy52ZXJlaW5pM2d1bgorLnZlOHI5dDhlOGk5bDh1OG45ZzhlOG4uCisudmVydGVpMgorLnZlcnRlaWx1bjFnZW4KKy52aThpOGk4dDhoLgorLnY0aTVpNAorLnZpNGk1aTQKKy52aWkyaXRoCisudmk4aTh0OGguCisudmkyaXRoCisud2E4aDhyOXM4YzhoOGU4aThuOWw4aThjOGg5azhlOGk4dDhzOXQ4aDhlOG85cjhpOGUuCisud2E0aHI0Cisud2FoNHJzMgorLndhaHJzNGMKKy53YWhyczJjaDIKKy53YWhyc2NoZTIKKy53YWhyc2NoZWkyCisud2FocnNjaGU0aTRuMWwKKy53YWhyczJjaGVpbmw0aTJjaAorLndhaHJzY2hlaW5saWM0aGsKKy53YWhyc2NoZWlubGljaGtlaTIKKy53YWhyc2NoZWlubGljaGtlaTR0MXMyCisud2FocnNjaGVpbmxpY2hrZWl0czN0aDJlCisud2FocnNjaGVpbmxpY2hrZWl0c3RoZTFvNXIKKy53YWhyc2NoZWlubGljaGtlaXRzdGhlb3IyaWU0Cisud2U4cjluOGU4ci4KKy53MWVyCisud2VyNG4xZXIKKy53ZThyOXQ4aDhlOHI5aThhOG4uCisud2VydGgyZQorLndlcnRoZXIxaQorLndlcnRoZTFyMmkzYTQKKy53ZXJ0aGVyaTJhMm4KKy53aThuOWM4aDhlOHM5dDhlOHIuCisud2luMmNoCisud2luY2hlMgorLndpbmNoMWVzCisud2k4cjh0OXM4YzhoOGE4Zjh0LgorLnc0aXI0Cisud2lyNHQxczIKKy53aXJ0NHNjCisud2lydHMyY2gyCisud2lydHNjaGEyZgorLndpcnRzY2hhMmZ0Cisud2k4czlzOGU4bjlzOGM4aDhhOGY4dDlsOGk4YzhoLgorLnc0aTJzMXMKKy53aXNzZW40Cisud2lzc2UybjFzMgorLndpc3NlbnM0YworLndpc3NlbnMyY2gyCisud2lzc2Vuc2NoYTJmCisud2lzc2Vuc2NoYTJmdAorLndpc3NlbnNjaGFmMnRsCisud2lzc2VuczJjaGFmdGw0aTJjaAorLnh2OGk4aThpOHQ4aC4KKy54djRpNWk0CisueHZpNGk1aTQKKy54dmlpMml0aAorLnh2OGk4aTh0OGguCisueHZpMml0aAorLnh4OGk4aThpOHI4ZC4KKy54eDQKKy54eDNpCisueHg0aTVpNAorLnh4aTRpNWk0CisueHhpaTRpcgorLnh4OGk4aThuOGQuCisueHhpNGluZAorLnlpOG44Zzl5OG84bjhnLgorLnkxaQorLnlpbjJneQorLnlpbmd5MW80CisueWluZ3lvMm4KKy5zaDh1OXg4dThlLgorLnNodXgxdTMKKy5qaTlzOHU4YThuLgorLmppMnN1CisuamlzdWEybgorLnplOGE5bDhhOG44ZC4KKy4yemUKKy56ZWE0bAorLnplYTNsNGFuZAorLnplYWxhMm4KKy56ZThpOHQ5czhjOGg4cjhpOGY4dC4KKy56ZWkyCisuemVpNHQxczIKKy56ZWl0NHNjCisuemVpdHMyY2gyCisuemVpdHNjNGhyNAorLnplaXRzY2hyNGkyZnQKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL2Fzc2V0cy93ZWJraXQvaW5jb2duaXRvX21vZGVfc3RhcnRfcGFnZS5odG1sIGIvY29yZS9yZXMvYXNzZXRzL3dlYmtpdC9pbmNvZ25pdG9fbW9kZV9zdGFydF9wYWdlLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjA3MGM2ZAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL2Fzc2V0cy93ZWJraXQvaW5jb2duaXRvX21vZGVfc3RhcnRfcGFnZS5odG1sCkBAIC0wLDAgKzEsMjQgQEAKKzxodG1sPgorICA8aGVhZD4KKyAgICA8bWV0YSBuYW1lPSJ2aWV3cG9ydCIgY29udGVudD0id2lkdGg9ZGV2aWNlLXdpZHRoLCBpbml0aWFsLXNjYWxlPTEuMCwgdXNlci1zY2FsYWJsZT1ubyIvPgorICAgIDx0aXRsZT5OZXcgaW5jb2duaXRvIHdpbmRvdzwvdGl0bGU+CisgIDwvaGVhZD4KKyAgPGJvZHk+CisgICAgPHA+PHN0cm9uZz5Zb3UndmUgZ29uZSBpbmNvZ25pdG88L3N0cm9uZz4uIFBhZ2VzIHlvdSB2aWV3IGluIHRoaXMgd2luZG93CisgICAgICB3b24ndCBhcHBlYXIgaW4geW91ciBicm93c2VyIGhpc3Rvcnkgb3Igc2VhcmNoIGhpc3RvcnksIGFuZCB0aGV5IHdvbid0CisgICAgICBsZWF2ZSBvdGhlciB0cmFjZXMsIGxpa2UgY29va2llcywgb24geW91ciBjb21wdXRlciBhZnRlciB5b3UgY2xvc2UgdGhlCisgICAgICBpbmNvZ25pdG8gd2luZG93LiBBbnkgZmlsZXMgeW91IGRvd25sb2FkIG9yIGJvb2ttYXJrcyB5b3UgY3JlYXRlIHdpbGwgYmUKKyAgICAgIHByZXNlcnZlZCwgaG93ZXZlci48L3A+CisKKyAgICA8cD48c3Ryb25nPkdvaW5nIGluY29nbml0byBkb2Vzbid0IGFmZmVjdCB0aGUgYmVoYXZpb3Igb2Ygb3RoZXIgcGVvcGxlLAorCXNlcnZlcnMsIG9yIHNvZnR3YXJlLiBCZSB3YXJ5IG9mOjwvc3Ryb25nPjwvcD4KKworICAgIDx1bD4KKyAgICAgIDxsaT5XZWJzaXRlcyB0aGF0IGNvbGxlY3Qgb3Igc2hhcmUgaW5mb3JtYXRpb24gYWJvdXQgeW91PC9saT4KKyAgICAgIDxsaT5JbnRlcm5ldCBzZXJ2aWNlIHByb3ZpZGVycyBvciBlbXBsb3llcnMgdGhhdCB0cmFjayB0aGUgcGFnZXMgeW91IHZpc2l0PC9saT4KKyAgICAgIDxsaT5NYWxpY2lvdXMgc29mdHdhcmUgdGhhdCB0cmFja3MgeW91ciBrZXlzdHJva2VzIGluIGV4Y2hhbmdlIGZvciBmcmVlIHNtaWxleXM8L2xpPgorICAgICAgPGxpPlN1cnZlaWxsYW5jZSBieSBzZWNyZXQgYWdlbnRzPC9saT4KKyAgICAgIDxsaT5QZW9wbGUgc3RhbmRpbmcgYmVoaW5kIHlvdTwvbGk+CisgICAgPC91bD4KKyAgPC9ib2R5PgorPC9odG1sPgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2FuaW0vYW5pbWF0b3JfZmFkZV9pbi54bWwgYi9jb3JlL3Jlcy9yZXMvYW5pbS9hbmltYXRvcl9mYWRlX2luLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYTI4YjRkCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2FuaW0vYW5pbWF0b3JfZmFkZV9pbi54bWwKQEAgLTAsMCArMSwyNiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0KKy8qCisqKiBDb3B5cmlnaHQgMjAxMCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKioKKyoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqKgorKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKioKKyoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKy0tPgorCis8b2JqZWN0QW5pbWF0b3IgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgIGFuZHJvaWQ6aW50ZXJwb2xhdG9yPSJAYW5pbS9hY2NlbGVyYXRlX2ludGVycG9sYXRvciIKKyAgICBhbmRyb2lkOnZhbHVlRnJvbT0iMCIKKyAgICBhbmRyb2lkOnZhbHVlVG89IjEiCisgICAgYW5kcm9pZDpwcm9wZXJ0eU5hbWU9ImFscGhhIgorICAgIGFuZHJvaWQ6ZHVyYXRpb249IkBhbmRyb2lkOmludGVnZXIvY29uZmlnX21lZGl1bUFuaW1UaW1lIgorLz4KZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9hbmltL2FuaW1hdG9yX2ZhZGVfb3V0LnhtbCBiL2NvcmUvcmVzL3Jlcy9hbmltL2FuaW1hdG9yX2ZhZGVfb3V0LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZGI2NTkxCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2FuaW0vYW5pbWF0b3JfZmFkZV9vdXQueG1sCkBAIC0wLDAgKzEsMjYgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tCisvKgorKiogQ29weXJpZ2h0IDIwMTAsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoqCisqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKioKKyoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoqCisqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCistLT4KKworPG9iamVjdEFuaW1hdG9yIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICBhbmRyb2lkOmludGVycG9sYXRvcj0iQGFuaW0vYWNjZWxlcmF0ZV9pbnRlcnBvbGF0b3IiCisgICAgYW5kcm9pZDp2YWx1ZUZyb209IjEuMCIKKyAgICBhbmRyb2lkOnZhbHVlVG89IjAuMCIKKyAgICBhbmRyb2lkOnByb3BlcnR5TmFtZT0iYWxwaGEiCisgICAgYW5kcm9pZDpkdXJhdGlvbj0iQGFuZHJvaWQ6aW50ZWdlci9jb25maWdfbWVkaXVtQW5pbVRpbWUiCisvPgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2FuaW0vZnJhZ21lbnRfY2xvc2VfZW50ZXIueG1sIGIvY29yZS9yZXMvcmVzL2FuaW0vZnJhZ21lbnRfY2xvc2VfZW50ZXIueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUzYWZhMmEKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvYW5pbS9mcmFnbWVudF9jbG9zZV9lbnRlci54bWwKQEAgLTAsMCArMSw0OCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0KKy8qCisqKiBDb3B5cmlnaHQgMjAxMCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKioKKyoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqKgorKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKioKKyoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKy0tPgorPHNldCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiPgorICAgIDxvYmplY3RBbmltYXRvcgorICAgICAgICBhbmRyb2lkOmludGVycG9sYXRvcj0iQGFuaW0vZGVjZWxlcmF0ZV9pbnRlcnBvbGF0b3IiCisgICAgICAgIGFuZHJvaWQ6dmFsdWVGcm9tPSIyIgorICAgICAgICBhbmRyb2lkOnZhbHVlVG89IjEiCisgICAgICAgIGFuZHJvaWQ6dmFsdWVUeXBlPSJmbG9hdFR5cGUiCisgICAgICAgIGFuZHJvaWQ6cHJvcGVydHlOYW1lPSJzY2FsZVgiCisgICAgICAgIGFuZHJvaWQ6ZHVyYXRpb249IkBhbmRyb2lkOmludGVnZXIvY29uZmlnX21lZGl1bUFuaW1UaW1lIi8+CisgICAgPG9iamVjdEFuaW1hdG9yCisgICAgICAgIGFuZHJvaWQ6aW50ZXJwb2xhdG9yPSJAYW5pbS9kZWNlbGVyYXRlX2ludGVycG9sYXRvciIKKyAgICAgICAgYW5kcm9pZDp2YWx1ZUZyb209IjIiCisgICAgICAgIGFuZHJvaWQ6dmFsdWVUbz0iMSIKKyAgICAgICAgYW5kcm9pZDp2YWx1ZVR5cGU9ImZsb2F0VHlwZSIKKyAgICAgICAgYW5kcm9pZDpwcm9wZXJ0eU5hbWU9InNjYWxlWSIKKyAgICAgICAgYW5kcm9pZDpkdXJhdGlvbj0iQGFuZHJvaWQ6aW50ZWdlci9jb25maWdfbWVkaXVtQW5pbVRpbWUiLz4KKyAgICA8b2JqZWN0QW5pbWF0b3IKKyAgICAgICAgYW5kcm9pZDppbnRlcnBvbGF0b3I9IkBhbmltL2RlY2VsZXJhdGVfaW50ZXJwb2xhdG9yIgorICAgICAgICBhbmRyb2lkOnZhbHVlRnJvbT0iMCIKKyAgICAgICAgYW5kcm9pZDp2YWx1ZVRvPSIxIgorICAgICAgICBhbmRyb2lkOnZhbHVlVHlwZT0iZmxvYXRUeXBlIgorICAgICAgICBhbmRyb2lkOnByb3BlcnR5TmFtZT0iYWxwaGEiCisgICAgICAgIGFuZHJvaWQ6ZHVyYXRpb249IkBhbmRyb2lkOmludGVnZXIvY29uZmlnX21lZGl1bUFuaW1UaW1lIi8+CisgICAgPG9iamVjdEFuaW1hdG9yCisgICAgICAgIGFuZHJvaWQ6aW50ZXJwb2xhdG9yPSJAYW5pbS9kZWNlbGVyYXRlX2ludGVycG9sYXRvciIKKyAgICAgICAgYW5kcm9pZDp2YWx1ZUZyb209Ii00MDAiCisgICAgICAgIGFuZHJvaWQ6dmFsdWVUbz0iMCIKKyAgICAgICAgYW5kcm9pZDp2YWx1ZVR5cGU9ImZsb2F0VHlwZSIKKyAgICAgICAgYW5kcm9pZDpwcm9wZXJ0eU5hbWU9InRyYW5zbGF0aW9uWCIKKyAgICAgICAgYW5kcm9pZDpkdXJhdGlvbj0iQGFuZHJvaWQ6aW50ZWdlci9jb25maWdfbWVkaXVtQW5pbVRpbWUiLz4KKzwvc2V0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9hbmltL2ZyYWdtZW50X2Nsb3NlX2V4aXQueG1sIGIvY29yZS9yZXMvcmVzL2FuaW0vZnJhZ21lbnRfY2xvc2VfZXhpdC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTU1NGE0ZQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9hbmltL2ZyYWdtZW50X2Nsb3NlX2V4aXQueG1sCkBAIC0wLDAgKzEsNDggQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tCisvKgorKiogQ29weXJpZ2h0IDIwMTAsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoqCisqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKioKKyoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoqCisqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCistLT4KKzxzZXQgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIj4KKyAgICA8b2JqZWN0QW5pbWF0b3IKKyAgICAgICAgYW5kcm9pZDppbnRlcnBvbGF0b3I9IkBhbmltL2FjY2VsZXJhdGVfaW50ZXJwb2xhdG9yIgorICAgICAgICBhbmRyb2lkOnZhbHVlRnJvbT0iMSIKKyAgICAgICAgYW5kcm9pZDp2YWx1ZVRvPSIuNSIKKyAgICAgICAgYW5kcm9pZDp2YWx1ZVR5cGU9ImZsb2F0VHlwZSIKKyAgICAgICAgYW5kcm9pZDpwcm9wZXJ0eU5hbWU9InNjYWxlWCIKKyAgICAgICAgYW5kcm9pZDpkdXJhdGlvbj0iQGFuZHJvaWQ6aW50ZWdlci9jb25maWdfbWVkaXVtQW5pbVRpbWUiLz4KKyAgICA8b2JqZWN0QW5pbWF0b3IKKyAgICAgICAgYW5kcm9pZDppbnRlcnBvbGF0b3I9IkBhbmltL2FjY2VsZXJhdGVfaW50ZXJwb2xhdG9yIgorICAgICAgICBhbmRyb2lkOnZhbHVlRnJvbT0iMSIKKyAgICAgICAgYW5kcm9pZDp2YWx1ZVRvPSIuNSIKKyAgICAgICAgYW5kcm9pZDp2YWx1ZVR5cGU9ImZsb2F0VHlwZSIKKyAgICAgICAgYW5kcm9pZDpwcm9wZXJ0eU5hbWU9InNjYWxlWSIKKyAgICAgICAgYW5kcm9pZDpkdXJhdGlvbj0iQGFuZHJvaWQ6aW50ZWdlci9jb25maWdfbWVkaXVtQW5pbVRpbWUiLz4KKyAgICA8b2JqZWN0QW5pbWF0b3IKKyAgICAgICAgYW5kcm9pZDppbnRlcnBvbGF0b3I9IkBhbmltL2FjY2VsZXJhdGVfaW50ZXJwb2xhdG9yIgorICAgICAgICBhbmRyb2lkOnZhbHVlRnJvbT0iMSIKKyAgICAgICAgYW5kcm9pZDp2YWx1ZVRvPSIwIgorICAgICAgICBhbmRyb2lkOnZhbHVlVHlwZT0iZmxvYXRUeXBlIgorICAgICAgICBhbmRyb2lkOnByb3BlcnR5TmFtZT0iYWxwaGEiCisgICAgICAgIGFuZHJvaWQ6ZHVyYXRpb249IkBhbmRyb2lkOmludGVnZXIvY29uZmlnX21lZGl1bUFuaW1UaW1lIi8+CisgICAgPG9iamVjdEFuaW1hdG9yCisgICAgICAgIGFuZHJvaWQ6aW50ZXJwb2xhdG9yPSJAYW5pbS9hY2NlbGVyYXRlX2ludGVycG9sYXRvciIKKyAgICAgICAgYW5kcm9pZDp2YWx1ZUZyb209IjAiCisgICAgICAgIGFuZHJvaWQ6dmFsdWVUbz0iNDAwIgorICAgICAgICBhbmRyb2lkOnZhbHVlVHlwZT0iZmxvYXRUeXBlIgorICAgICAgICBhbmRyb2lkOnByb3BlcnR5TmFtZT0idHJhbnNsYXRpb25YIgorICAgICAgICBhbmRyb2lkOmR1cmF0aW9uPSJAYW5kcm9pZDppbnRlZ2VyL2NvbmZpZ19tZWRpdW1BbmltVGltZSIvPgorPC9zZXQ+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2FuaW0vZnJhZ21lbnRfb3Blbl9lbnRlci54bWwgYi9jb3JlL3Jlcy9yZXMvYW5pbS9mcmFnbWVudF9vcGVuX2VudGVyLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNDJmNjBjCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2FuaW0vZnJhZ21lbnRfb3Blbl9lbnRlci54bWwKQEAgLTAsMCArMSw0NiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0KKy8qCisqKiBDb3B5cmlnaHQgMjAxMCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKioKKyoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqKgorKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKioKKyoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKy0tPgorPHNldCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiPgorICAgIDxvYmplY3RBbmltYXRvcgorICAgICAgICBhbmRyb2lkOmludGVycG9sYXRvcj0iQGFuaW0vZGVjZWxlcmF0ZV9pbnRlcnBvbGF0b3IiCisgICAgICAgIGFuZHJvaWQ6dmFsdWVGcm9tPSIyIgorICAgICAgICBhbmRyb2lkOnZhbHVlVG89IjEiCisgICAgICAgIGFuZHJvaWQ6dmFsdWVUeXBlPSJmbG9hdFR5cGUiCisgICAgICAgIGFuZHJvaWQ6cHJvcGVydHlOYW1lPSJzY2FsZVgiCisgICAgICAgIGFuZHJvaWQ6ZHVyYXRpb249IkBhbmRyb2lkOmludGVnZXIvY29uZmlnX21lZGl1bUFuaW1UaW1lIi8+CisgICAgPG9iamVjdEFuaW1hdG9yCisgICAgICAgIGFuZHJvaWQ6aW50ZXJwb2xhdG9yPSJAYW5pbS9kZWNlbGVyYXRlX2ludGVycG9sYXRvciIKKyAgICAgICAgYW5kcm9pZDp2YWx1ZUZyb209IjIiCisgICAgICAgIGFuZHJvaWQ6dmFsdWVUbz0iMSIKKyAgICAgICAgYW5kcm9pZDp2YWx1ZVR5cGU9ImZsb2F0VHlwZSIKKyAgICAgICAgYW5kcm9pZDpwcm9wZXJ0eU5hbWU9InNjYWxlWSIKKyAgICAgICAgYW5kcm9pZDpkdXJhdGlvbj0iQGFuZHJvaWQ6aW50ZWdlci9jb25maWdfbWVkaXVtQW5pbVRpbWUiLz4KKyAgICA8b2JqZWN0QW5pbWF0b3IKKyAgICAgICAgYW5kcm9pZDp2YWx1ZUZyb209IjAiCisgICAgICAgIGFuZHJvaWQ6dmFsdWVUbz0iMSIKKyAgICAgICAgYW5kcm9pZDp2YWx1ZVR5cGU9ImZsb2F0VHlwZSIKKyAgICAgICAgYW5kcm9pZDpwcm9wZXJ0eU5hbWU9ImFscGhhIgorICAgICAgICBhbmRyb2lkOmR1cmF0aW9uPSJAYW5kcm9pZDppbnRlZ2VyL2NvbmZpZ19tZWRpdW1BbmltVGltZSIvPgorICAgIDxvYmplY3RBbmltYXRvcgorICAgICAgICBhbmRyb2lkOnZhbHVlRnJvbT0iNDAwIgorICAgICAgICBhbmRyb2lkOnZhbHVlVG89IjAiCisgICAgICAgIGFuZHJvaWQ6dmFsdWVUeXBlPSJmbG9hdFR5cGUiCisgICAgICAgIGFuZHJvaWQ6cHJvcGVydHlOYW1lPSJ0cmFuc2xhdGlvblgiCisgICAgICAgIGFuZHJvaWQ6ZHVyYXRpb249IkBhbmRyb2lkOmludGVnZXIvY29uZmlnX21lZGl1bUFuaW1UaW1lIi8+Cis8L3NldD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvYW5pbS9mcmFnbWVudF9vcGVuX2V4aXQueG1sIGIvY29yZS9yZXMvcmVzL2FuaW0vZnJhZ21lbnRfb3Blbl9leGl0LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMTI2MGI5Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2FuaW0vZnJhZ21lbnRfb3Blbl9leGl0LnhtbApAQCAtMCwwICsxLDQ2IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLQorLyoKKyoqIENvcHlyaWdodCAyMDEwLCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqKgorKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoqCisqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqKgorKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworLS0+Cis8c2V0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCI+CisgICAgPG9iamVjdEFuaW1hdG9yCisgICAgICAgIGFuZHJvaWQ6aW50ZXJwb2xhdG9yPSJAYW5pbS9hY2NlbGVyYXRlX2ludGVycG9sYXRvciIKKyAgICAgICAgYW5kcm9pZDp2YWx1ZUZyb209IjEiCisgICAgICAgIGFuZHJvaWQ6dmFsdWVUbz0iMiIKKyAgICAgICAgYW5kcm9pZDp2YWx1ZVR5cGU9ImZsb2F0VHlwZSIKKyAgICAgICAgYW5kcm9pZDpwcm9wZXJ0eU5hbWU9InNjYWxlWCIKKyAgICAgICAgYW5kcm9pZDpkdXJhdGlvbj0iQGFuZHJvaWQ6aW50ZWdlci9jb25maWdfbWVkaXVtQW5pbVRpbWUiLz4KKyAgICA8b2JqZWN0QW5pbWF0b3IKKyAgICAgICAgYW5kcm9pZDppbnRlcnBvbGF0b3I9IkBhbmltL2FjY2VsZXJhdGVfaW50ZXJwb2xhdG9yIgorICAgICAgICBhbmRyb2lkOnZhbHVlRnJvbT0iMSIKKyAgICAgICAgYW5kcm9pZDp2YWx1ZVRvPSIyIgorICAgICAgICBhbmRyb2lkOnZhbHVlVHlwZT0iZmxvYXRUeXBlIgorICAgICAgICBhbmRyb2lkOnByb3BlcnR5TmFtZT0ic2NhbGVZIgorICAgICAgICBhbmRyb2lkOmR1cmF0aW9uPSJAYW5kcm9pZDppbnRlZ2VyL2NvbmZpZ19tZWRpdW1BbmltVGltZSIvPgorICAgIDxvYmplY3RBbmltYXRvcgorICAgICAgICBhbmRyb2lkOnZhbHVlRnJvbT0iMSIKKyAgICAgICAgYW5kcm9pZDp2YWx1ZVRvPSIwIgorICAgICAgICBhbmRyb2lkOnZhbHVlVHlwZT0iZmxvYXRUeXBlIgorICAgICAgICBhbmRyb2lkOnByb3BlcnR5TmFtZT0iYWxwaGEiCisgICAgICAgIGFuZHJvaWQ6ZHVyYXRpb249IkBhbmRyb2lkOmludGVnZXIvY29uZmlnX21lZGl1bUFuaW1UaW1lIi8+CisgICAgPG9iamVjdEFuaW1hdG9yCisgICAgICAgIGFuZHJvaWQ6dmFsdWVGcm9tPSIwIgorICAgICAgICBhbmRyb2lkOnZhbHVlVG89Ii00MDAiCisgICAgICAgIGFuZHJvaWQ6dmFsdWVUeXBlPSJmbG9hdFR5cGUiCisgICAgICAgIGFuZHJvaWQ6cHJvcGVydHlOYW1lPSJ0cmFuc2xhdGlvblgiCisgICAgICAgIGFuZHJvaWQ6ZHVyYXRpb249IkBhbmRyb2lkOmludGVnZXIvY29uZmlnX21lZGl1bUFuaW1UaW1lIi8+Cis8L3NldD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvYW5pbS9wdXNoX2Rvd25faW5fbm9fYWxwaGEueG1sIGIvY29yZS9yZXMvcmVzL2FuaW0vcHVzaF9kb3duX2luX25vX2FscGhhLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNDVkNjkxCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2FuaW0vcHVzaF9kb3duX2luX25vX2FscGhhLnhtbApAQCAtMCwwICsxLDIwIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8c2V0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCI+CisJPHRyYW5zbGF0ZSBhbmRyb2lkOmZyb21ZRGVsdGE9Ii0xMDAlcCIgYW5kcm9pZDp0b1lEZWx0YT0iMCIKKyAgICAgICAgICAgIGFuZHJvaWQ6ZHVyYXRpb249IkBhbmRyb2lkOmludGVnZXIvY29uZmlnX2xvbmdBbmltVGltZSIvPgorPC9zZXQ+CmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvYW5pbS9wdXNoX2Rvd25fb3V0X25vX2FscGhhLnhtbCBiL2NvcmUvcmVzL3Jlcy9hbmltL3B1c2hfZG93bl9vdXRfbm9fYWxwaGEueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNjMjQ3NGEKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvYW5pbS9wdXNoX2Rvd25fb3V0X25vX2FscGhhLnhtbApAQCAtMCwwICsxLDIwIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8c2V0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCI+CisJPHRyYW5zbGF0ZSBhbmRyb2lkOmZyb21ZRGVsdGE9IjAiIGFuZHJvaWQ6dG9ZRGVsdGE9IjEwMCVwIgorICAgICAgICAgICAgYW5kcm9pZDpkdXJhdGlvbj0iQGFuZHJvaWQ6aW50ZWdlci9jb25maWdfbG9uZ0FuaW1UaW1lIi8+Cis8L3NldD4KZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1lbi1oZHBpL3N5bV9rZXlib2FyZF9mZWVkYmFja19kZWxldGUucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWVuLWhkcGkvc3ltX2tleWJvYXJkX2ZlZWRiYWNrX2RlbGV0ZS5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGNhNzYzNzUuLjAwMDAwMDAKLS0tIGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWVuLWhkcGkvc3ltX2tleWJvYXJkX2ZlZWRiYWNrX2RlbGV0ZS5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fY2hlY2tfb2ZmX2Rpc2FibGVfZm9jdXNlZF9ob2xvX2RhcmsucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX2NoZWNrX29mZl9kaXNhYmxlX2ZvY3VzZWRfaG9sb19kYXJrLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNzJlMmI5Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX2NoZWNrX29mZl9kaXNhYmxlX2ZvY3VzZWRfaG9sb19kYXJrLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fY2hlY2tfb2ZmX2Rpc2FibGVfZm9jdXNlZF9ob2xvX2xpZ2h0LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9jaGVja19vZmZfZGlzYWJsZV9mb2N1c2VkX2hvbG9fbGlnaHQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI0MGEwNDQKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fY2hlY2tfb2ZmX2Rpc2FibGVfZm9jdXNlZF9ob2xvX2xpZ2h0LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fY2hlY2tfb2ZmX2Rpc2FibGVfaG9sb19kYXJrLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9jaGVja19vZmZfZGlzYWJsZV9ob2xvX2RhcmsucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ3MmUyYjkKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fY2hlY2tfb2ZmX2Rpc2FibGVfaG9sb19kYXJrLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fY2hlY2tfb2ZmX2Rpc2FibGVfaG9sb19saWdodC5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fY2hlY2tfb2ZmX2Rpc2FibGVfaG9sb19saWdodC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjQwYTA0NAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9jaGVja19vZmZfZGlzYWJsZV9ob2xvX2xpZ2h0LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fY2hlY2tfb2ZmX2hvbG9fZGFyay5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fY2hlY2tfb2ZmX2hvbG9fZGFyay5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTExZTFhYQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9jaGVja19vZmZfaG9sb19kYXJrLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fY2hlY2tfb2ZmX2hvbG9fbGlnaHQucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX2NoZWNrX29mZl9ob2xvX2xpZ2h0LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40Y2EzYzU2Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX2NoZWNrX29mZl9ob2xvX2xpZ2h0LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fY2hlY2tfb2ZmX3ByZXNzZWRfaG9sb19kYXJrLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9jaGVja19vZmZfcHJlc3NlZF9ob2xvX2RhcmsucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA4ZjQxODEKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fY2hlY2tfb2ZmX3ByZXNzZWRfaG9sb19kYXJrLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fY2hlY2tfb2ZmX3ByZXNzZWRfaG9sb19saWdodC5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fY2hlY2tfb2ZmX3ByZXNzZWRfaG9sb19saWdodC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDM3NTRkZAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9jaGVja19vZmZfcHJlc3NlZF9ob2xvX2xpZ2h0LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fY2hlY2tfb2ZmX3NlbGVjdGVkX2hvbG9fZGFyay5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fY2hlY2tfb2ZmX3NlbGVjdGVkX2hvbG9fZGFyay5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjY0ZjEwMgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9jaGVja19vZmZfc2VsZWN0ZWRfaG9sb19kYXJrLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fY2hlY2tfb2ZmX3NlbGVjdGVkX2hvbG9fbGlnaHQucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX2NoZWNrX29mZl9zZWxlY3RlZF9ob2xvX2xpZ2h0LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ODUwNmJmCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX2NoZWNrX29mZl9zZWxlY3RlZF9ob2xvX2xpZ2h0LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fY2hlY2tfb25fZGlzYWJsZV9mb2N1c2VkX2hvbG9fZGFyay5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fY2hlY2tfb25fZGlzYWJsZV9mb2N1c2VkX2hvbG9fZGFyay5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzgwNTQ1OAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9jaGVja19vbl9kaXNhYmxlX2ZvY3VzZWRfaG9sb19kYXJrLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fY2hlY2tfb25fZGlzYWJsZV9mb2N1c2VkX2hvbG9fbGlnaHQucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX2NoZWNrX29uX2Rpc2FibGVfZm9jdXNlZF9ob2xvX2xpZ2h0LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZTI2OGQ1Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX2NoZWNrX29uX2Rpc2FibGVfZm9jdXNlZF9ob2xvX2xpZ2h0LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fY2hlY2tfb25fZGlzYWJsZV9ob2xvX2RhcmsucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX2NoZWNrX29uX2Rpc2FibGVfaG9sb19kYXJrLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ODA1NDU4Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX2NoZWNrX29uX2Rpc2FibGVfaG9sb19kYXJrLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fY2hlY2tfb25fZGlzYWJsZV9ob2xvX2xpZ2h0LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9jaGVja19vbl9kaXNhYmxlX2hvbG9fbGlnaHQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRlMjY4ZDUKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fY2hlY2tfb25fZGlzYWJsZV9ob2xvX2xpZ2h0LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fY2hlY2tfb25faG9sb19kYXJrLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9jaGVja19vbl9ob2xvX2RhcmsucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU1NDFjNjcKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fY2hlY2tfb25faG9sb19kYXJrLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fY2hlY2tfb25faG9sb19saWdodC5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fY2hlY2tfb25faG9sb19saWdodC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzY4YzRhZgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9jaGVja19vbl9ob2xvX2xpZ2h0LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fY2hlY2tfb25fcHJlc3NlZF9ob2xvX2RhcmsucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX2NoZWNrX29uX3ByZXNzZWRfaG9sb19kYXJrLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zN2UzOTUzCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX2NoZWNrX29uX3ByZXNzZWRfaG9sb19kYXJrLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fY2hlY2tfb25fcHJlc3NlZF9ob2xvX2xpZ2h0LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9jaGVja19vbl9wcmVzc2VkX2hvbG9fbGlnaHQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZjMjllNDYKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fY2hlY2tfb25fcHJlc3NlZF9ob2xvX2xpZ2h0LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fY2hlY2tfb25fc2VsZWN0ZWRfaG9sb19kYXJrLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9jaGVja19vbl9zZWxlY3RlZF9ob2xvX2RhcmsucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEwYmVhYzQKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fY2hlY2tfb25fc2VsZWN0ZWRfaG9sb19kYXJrLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fY2hlY2tfb25fc2VsZWN0ZWRfaG9sb19saWdodC5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fY2hlY2tfb25fc2VsZWN0ZWRfaG9sb19saWdodC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWRmNDVjNwotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9jaGVja19vbl9zZWxlY3RlZF9ob2xvX2xpZ2h0LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fcmFkaW9fb2ZmX2hvbG9fZGFyay5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fcmFkaW9fb2ZmX2hvbG9fZGFyay5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzAxYzk3ZAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9yYWRpb19vZmZfaG9sb19kYXJrLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fcmFkaW9fb2ZmX2hvbG9fbGlnaHQucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX3JhZGlvX29mZl9ob2xvX2xpZ2h0LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NTdjOGU1Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX3JhZGlvX29mZl9ob2xvX2xpZ2h0LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fcmFkaW9fb2ZmX3ByZXNzZWRfaG9sb19kYXJrLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9yYWRpb19vZmZfcHJlc3NlZF9ob2xvX2RhcmsucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVlNmVmMmIKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fcmFkaW9fb2ZmX3ByZXNzZWRfaG9sb19kYXJrLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fcmFkaW9fb2ZmX3ByZXNzZWRfaG9sb19saWdodC5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fcmFkaW9fb2ZmX3ByZXNzZWRfaG9sb19saWdodC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzQyYmYxMQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9yYWRpb19vZmZfcHJlc3NlZF9ob2xvX2xpZ2h0LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fcmFkaW9fb2ZmX3NlbGVjdGVkX2hvbG9fZGFyay5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fcmFkaW9fb2ZmX3NlbGVjdGVkX2hvbG9fZGFyay5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDExYWU4NQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9yYWRpb19vZmZfc2VsZWN0ZWRfaG9sb19kYXJrLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fcmFkaW9fb2ZmX3NlbGVjdGVkX2hvbG9fbGlnaHQucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX3JhZGlvX29mZl9zZWxlY3RlZF9ob2xvX2xpZ2h0LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OGJkMWRmCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX3JhZGlvX29mZl9zZWxlY3RlZF9ob2xvX2xpZ2h0LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fcmFkaW9fb25faG9sb19kYXJrLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9yYWRpb19vbl9ob2xvX2RhcmsucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjViMGRiZTgKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fcmFkaW9fb25faG9sb19kYXJrLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fcmFkaW9fb25faG9sb19saWdodC5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fcmFkaW9fb25faG9sb19saWdodC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDVhZTM2YgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9yYWRpb19vbl9ob2xvX2xpZ2h0LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fcmFkaW9fb25fcHJlc3NlZF9ob2xvX2RhcmsucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX3JhZGlvX29uX3ByZXNzZWRfaG9sb19kYXJrLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jM2EwZDQ4Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX3JhZGlvX29uX3ByZXNzZWRfaG9sb19kYXJrLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fcmFkaW9fb25fcHJlc3NlZF9ob2xvX2xpZ2h0LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9yYWRpb19vbl9wcmVzc2VkX2hvbG9fbGlnaHQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNhMjIzNTgKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fcmFkaW9fb25fcHJlc3NlZF9ob2xvX2xpZ2h0LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fcmFkaW9fb25fc2VsZWN0ZWRfaG9sb19kYXJrLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9yYWRpb19vbl9zZWxlY3RlZF9ob2xvX2RhcmsucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZjMDVmNDcKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fcmFkaW9fb25fc2VsZWN0ZWRfaG9sb19kYXJrLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fcmFkaW9fb25fc2VsZWN0ZWRfaG9sb19saWdodC5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fcmFkaW9fb25fc2VsZWN0ZWRfaG9sb19saWdodC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTE3ZmExZQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9yYWRpb19vbl9zZWxlY3RlZF9ob2xvX2xpZ2h0LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9jb21ib2JveF9kaXNhYmxlZC5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9jb21ib2JveF9kaXNhYmxlZC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTBlYjQ1ZQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2NvbWJvYm94X2Rpc2FibGVkLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9jb21ib2JveF9ub2hpZ2hsaWdodC5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9jb21ib2JveF9ub2hpZ2hsaWdodC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWQ2MDMwMQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2NvbWJvYm94X25vaGlnaGxpZ2h0LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9kaXZpZGVyX2hvcml6b250YWxfYnJpZ2h0LjkucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvZGl2aWRlcl9ob3Jpem9udGFsX2JyaWdodC45LnBuZwppbmRleCA5OWE2N2I5Li40MWI3NzZiIDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9kaXZpZGVyX2hvcml6b250YWxfYnJpZ2h0LjkucG5nCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2RpdmlkZXJfaG9yaXpvbnRhbF9icmlnaHQuOS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvZGl2aWRlcl9ob3Jpem9udGFsX2JyaWdodF9vcGFxdWUuOS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9kaXZpZGVyX2hvcml6b250YWxfYnJpZ2h0X29wYXF1ZS45LnBuZwppbmRleCBjZmUyNThiLi5lYjc1YTIyIDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9kaXZpZGVyX2hvcml6b250YWxfYnJpZ2h0X29wYXF1ZS45LnBuZworKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9kaXZpZGVyX2hvcml6b250YWxfYnJpZ2h0X29wYXF1ZS45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9kaXZpZGVyX2hvcml6b250YWxfZGFyay45LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2RpdmlkZXJfaG9yaXpvbnRhbF9kYXJrLjkucG5nCmluZGV4IDMzOGQ4NDAuLjU1YTVlNTMgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2RpdmlkZXJfaG9yaXpvbnRhbF9kYXJrLjkucG5nCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2RpdmlkZXJfaG9yaXpvbnRhbF9kYXJrLjkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2RpdmlkZXJfaG9yaXpvbnRhbF9kYXJrX29wYXF1ZS45LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2RpdmlkZXJfaG9yaXpvbnRhbF9kYXJrX29wYXF1ZS45LnBuZwppbmRleCBkMjFhYWQyLi42MGUyY2IyIDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9kaXZpZGVyX2hvcml6b250YWxfZGFya19vcGFxdWUuOS5wbmcKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvZGl2aWRlcl9ob3Jpem9udGFsX2Rhcmtfb3BhcXVlLjkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2RpdmlkZXJfaG9yaXpvbnRhbF9kaW1fZGFyay45LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2RpdmlkZXJfaG9yaXpvbnRhbF9kaW1fZGFyay45LnBuZwppbmRleCA2Mzg1OWY3Li5jZjM0NjEzIDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9kaXZpZGVyX2hvcml6b250YWxfZGltX2RhcmsuOS5wbmcKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvZGl2aWRlcl9ob3Jpem9udGFsX2RpbV9kYXJrLjkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2RpdmlkZXJfdmVydGljYWxfYnJpZ2h0LjkucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvZGl2aWRlcl92ZXJ0aWNhbF9icmlnaHQuOS5wbmcKaW5kZXggOTlhNjdiOS4uNDFiNzc2YiAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvZGl2aWRlcl92ZXJ0aWNhbF9icmlnaHQuOS5wbmcKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvZGl2aWRlcl92ZXJ0aWNhbF9icmlnaHQuOS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvZGl2aWRlcl92ZXJ0aWNhbF9icmlnaHRfb3BhcXVlLjkucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvZGl2aWRlcl92ZXJ0aWNhbF9icmlnaHRfb3BhcXVlLjkucG5nCmluZGV4IDVjNTM3ZWUuLmViNzVhMjIgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2RpdmlkZXJfdmVydGljYWxfYnJpZ2h0X29wYXF1ZS45LnBuZworKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9kaXZpZGVyX3ZlcnRpY2FsX2JyaWdodF9vcGFxdWUuOS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvZGl2aWRlcl92ZXJ0aWNhbF9kYXJrLjkucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvZGl2aWRlcl92ZXJ0aWNhbF9kYXJrLjkucG5nCmluZGV4IDcwMmI4NzguLjU1YTVlNTMgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2RpdmlkZXJfdmVydGljYWxfZGFyay45LnBuZworKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9kaXZpZGVyX3ZlcnRpY2FsX2RhcmsuOS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvZGl2aWRlcl92ZXJ0aWNhbF9kYXJrX29wYXF1ZS45LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2RpdmlkZXJfdmVydGljYWxfZGFya19vcGFxdWUuOS5wbmcKaW5kZXggOGYzNTMxNS4uNjBlMmNiMiAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvZGl2aWRlcl92ZXJ0aWNhbF9kYXJrX29wYXF1ZS45LnBuZworKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9kaXZpZGVyX3ZlcnRpY2FsX2Rhcmtfb3BhcXVlLjkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2Vtb19pbV9lbWJhcnJhc3NlZC5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9lbW9faW1fZW1iYXJyYXNzZWQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNmN2RhZjcKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9lbW9faW1fZW1iYXJyYXNzZWQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX2FnZ3JlZ2F0ZWQucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfYWdncmVnYXRlZC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdjYTE1YjEuLjAwMDAwMDAKLS0tIGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfYWdncmVnYXRlZC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9pY19idG5fYmFjay5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9pY19idG5fYmFjay5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjhiMzI4NQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX2J0bl9iYWNrLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9pY19idG5fZmluZF9uZXh0LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX2J0bl9maW5kX25leHQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI2OTZhNmIKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9pY19idG5fZmluZF9uZXh0LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9pY19idG5fZmluZF9wcmV2LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX2J0bl9maW5kX3ByZXYucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU1NTBjNWEKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9pY19idG5fZmluZF9wcmV2LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9pY19idG5fbmV4dC5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9pY19idG5fbmV4dC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjJjNmUxYgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX2J0bl9uZXh0LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9pY19tZW51X2ZpbmQucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbWVudV9maW5kLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xN2FjNjk0Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbWVudV9maW5kLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9saXN0X3NlbGVjdG9yX2JhY2tncm91bmRfZGVmYXVsdC45LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2xpc3Rfc2VsZWN0b3JfYmFja2dyb3VuZF9kZWZhdWx0LjkucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI1YzYyNDEKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9saXN0X3NlbGVjdG9yX2JhY2tncm91bmRfZGVmYXVsdC45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9saXN0X3NlbGVjdG9yX2JhY2tncm91bmRfZGVmYXVsdF9saWdodC45LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2xpc3Rfc2VsZWN0b3JfYmFja2dyb3VuZF9kZWZhdWx0X2xpZ2h0LjkucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMzZTY5ZjAKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9saXN0X3NlbGVjdG9yX2JhY2tncm91bmRfZGVmYXVsdF9saWdodC45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9saXN0X3NlbGVjdG9yX2JhY2tncm91bmRfZGlzYWJsZWQuOS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9saXN0X3NlbGVjdG9yX2JhY2tncm91bmRfZGlzYWJsZWQuOS5wbmcKaW5kZXggYzQwMjMzZS4uYWIzNzdkOCAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvbGlzdF9zZWxlY3Rvcl9iYWNrZ3JvdW5kX2Rpc2FibGVkLjkucG5nCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2xpc3Rfc2VsZWN0b3JfYmFja2dyb3VuZF9kaXNhYmxlZC45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9saXN0X3NlbGVjdG9yX2JhY2tncm91bmRfZGlzYWJsZWRfbGlnaHQuOS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9saXN0X3NlbGVjdG9yX2JhY2tncm91bmRfZGlzYWJsZWRfbGlnaHQuOS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGVkYzljZAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2xpc3Rfc2VsZWN0b3JfYmFja2dyb3VuZF9kaXNhYmxlZF9saWdodC45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9saXN0X3NlbGVjdG9yX2JhY2tncm91bmRfZm9jdXMuOS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9saXN0X3NlbGVjdG9yX2JhY2tncm91bmRfZm9jdXMuOS5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ4ZTE2YjkuLjAwMDAwMDAKLS0tIGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvbGlzdF9zZWxlY3Rvcl9iYWNrZ3JvdW5kX2ZvY3VzLjkucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvbGlzdF9zZWxlY3Rvcl9iYWNrZ3JvdW5kX2ZvY3VzZWQuOS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9saXN0X3NlbGVjdG9yX2JhY2tncm91bmRfZm9jdXNlZC45LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MGJiNDU0Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvbGlzdF9zZWxlY3Rvcl9iYWNrZ3JvdW5kX2ZvY3VzZWQuOS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvbGlzdF9zZWxlY3Rvcl9iYWNrZ3JvdW5kX2ZvY3VzZWRfbGlnaHQuOS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9saXN0X3NlbGVjdG9yX2JhY2tncm91bmRfZm9jdXNlZF9saWdodC45LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MGJiNDU0Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvbGlzdF9zZWxlY3Rvcl9iYWNrZ3JvdW5kX2ZvY3VzZWRfbGlnaHQuOS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvbGlzdF9zZWxlY3Rvcl9iYWNrZ3JvdW5kX2ZvY3VzZWRfc2VsZWN0ZWQuOS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9saXN0X3NlbGVjdG9yX2JhY2tncm91bmRfZm9jdXNlZF9zZWxlY3RlZC45LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNTI3ZGExCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvbGlzdF9zZWxlY3Rvcl9iYWNrZ3JvdW5kX2ZvY3VzZWRfc2VsZWN0ZWQuOS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvbGlzdF9zZWxlY3Rvcl9iYWNrZ3JvdW5kX2xvbmdwcmVzcy45LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2xpc3Rfc2VsZWN0b3JfYmFja2dyb3VuZF9sb25ncHJlc3MuOS5wbmcKaW5kZXggMTY3NmNhNy4uYmQ3NDQyNiAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvbGlzdF9zZWxlY3Rvcl9iYWNrZ3JvdW5kX2xvbmdwcmVzcy45LnBuZworKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9saXN0X3NlbGVjdG9yX2JhY2tncm91bmRfbG9uZ3ByZXNzLjkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2xpc3Rfc2VsZWN0b3JfYmFja2dyb3VuZF9sb25ncHJlc3NfbGlnaHQuOS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9saXN0X3NlbGVjdG9yX2JhY2tncm91bmRfbG9uZ3ByZXNzX2xpZ2h0LjkucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZjMmJhMmUKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9saXN0X3NlbGVjdG9yX2JhY2tncm91bmRfbG9uZ3ByZXNzX2xpZ2h0LjkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2xpc3Rfc2VsZWN0b3JfYmFja2dyb3VuZF9wcmVzc2VkLjkucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvbGlzdF9zZWxlY3Rvcl9iYWNrZ3JvdW5kX3ByZXNzZWQuOS5wbmcKaW5kZXggYmE3OWNmNy4uZDE4ZDZmNyAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvbGlzdF9zZWxlY3Rvcl9iYWNrZ3JvdW5kX3ByZXNzZWQuOS5wbmcKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvbGlzdF9zZWxlY3Rvcl9iYWNrZ3JvdW5kX3ByZXNzZWQuOS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvbGlzdF9zZWxlY3Rvcl9iYWNrZ3JvdW5kX3ByZXNzZWRfbGlnaHQuOS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9saXN0X3NlbGVjdG9yX2JhY2tncm91bmRfcHJlc3NlZF9saWdodC45LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMDc4NmU1Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvbGlzdF9zZWxlY3Rvcl9iYWNrZ3JvdW5kX3ByZXNzZWRfbGlnaHQuOS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvbGlzdF9zZWxlY3Rvcl9iYWNrZ3JvdW5kX3NlbGVjdGVkLjkucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvbGlzdF9zZWxlY3Rvcl9iYWNrZ3JvdW5kX3NlbGVjdGVkLjkucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNiZjUwYjMKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9saXN0X3NlbGVjdG9yX2JhY2tncm91bmRfc2VsZWN0ZWQuOS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvbGlzdF9zZWxlY3Rvcl9iYWNrZ3JvdW5kX3NlbGVjdGVkX2xpZ2h0LjkucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvbGlzdF9zZWxlY3Rvcl9iYWNrZ3JvdW5kX3NlbGVjdGVkX2xpZ2h0LjkucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM0ZWE4NmUKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9saXN0X3NlbGVjdG9yX2JhY2tncm91bmRfc2VsZWN0ZWRfbGlnaHQuOS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvcXVpY2tjb250YWN0X25vYmFkZ2UuOS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9xdWlja2NvbnRhY3Rfbm9iYWRnZS45LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OGQ0M2M0Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvcXVpY2tjb250YWN0X25vYmFkZ2UuOS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdHVzX2Jhcl9pdGVtX2FwcF9iYWNrZ3JvdW5kX25vcm1hbC45LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXR1c19iYXJfaXRlbV9hcHBfYmFja2dyb3VuZF9ub3JtYWwuOS5wbmcKaW5kZXggYmRjYjM3OC4uNGZiZmE0ZiAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdHVzX2Jhcl9pdGVtX2FwcF9iYWNrZ3JvdW5kX25vcm1hbC45LnBuZworKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9zdGF0dXNfYmFyX2l0ZW1fYXBwX2JhY2tncm91bmRfbm9ybWFsLjkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXR1c19iYXJfaXRlbV9iYWNrZ3JvdW5kX25vcm1hbC45LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXR1c19iYXJfaXRlbV9iYWNrZ3JvdW5kX25vcm1hbC45LnBuZwppbmRleCBmYTI3ZWU0Li44MTBjOTUwIDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9zdGF0dXNfYmFyX2l0ZW1fYmFja2dyb3VuZF9ub3JtYWwuOS5wbmcKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdHVzX2Jhcl9pdGVtX2JhY2tncm91bmRfbm9ybWFsLjkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3N5bV9hY3Rpb25fY2FsbC5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9zeW1fYWN0aW9uX2NhbGwucG5nCmluZGV4IDEwNWY3ZDAuLmRhOGFmZWUgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3N5bV9hY3Rpb25fY2FsbC5wbmcKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvc3ltX2FjdGlvbl9jYWxsLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS90ZXh0X3NlbGVjdF9oYW5kbGUucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvdGV4dF9zZWxlY3RfaGFuZGxlLnBuZwppbmRleCA4MGQ0OGFiLi45M2E1YTE1IDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS90ZXh0X3NlbGVjdF9oYW5kbGUucG5nCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3RleHRfc2VsZWN0X2hhbmRsZS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvdGV4dGZpZWxkX2RlZmF1bHRfaG9sb19kYXJrLjkucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvdGV4dGZpZWxkX2RlZmF1bHRfaG9sb19kYXJrLjkucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM2N2QwNGQKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS90ZXh0ZmllbGRfZGVmYXVsdF9ob2xvX2RhcmsuOS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvdGV4dGZpZWxkX2RlZmF1bHRfaG9sb19saWdodC45LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3RleHRmaWVsZF9kZWZhdWx0X2hvbG9fbGlnaHQuOS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTI5MmViZgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3RleHRmaWVsZF9kZWZhdWx0X2hvbG9fbGlnaHQuOS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvdGV4dGZpZWxkX2Rpc2FibGVkX2hvbG9fZGFyay45LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3RleHRmaWVsZF9kaXNhYmxlZF9ob2xvX2RhcmsuOS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTM5OTgyYQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3RleHRmaWVsZF9kaXNhYmxlZF9ob2xvX2RhcmsuOS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvdGV4dGZpZWxkX2Rpc2FibGVkX2hvbG9fbGlnaHQuOS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS90ZXh0ZmllbGRfZGlzYWJsZWRfaG9sb19saWdodC45LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZjIyNGI5Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvdGV4dGZpZWxkX2Rpc2FibGVkX2hvbG9fbGlnaHQuOS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvdGV4dGZpZWxkX2Rpc2FibGVkX3NlbGVjdGVkX2hvbG9fZGFyay45LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3RleHRmaWVsZF9kaXNhYmxlZF9zZWxlY3RlZF9ob2xvX2RhcmsuOS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjZmMThjYwotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3RleHRmaWVsZF9kaXNhYmxlZF9zZWxlY3RlZF9ob2xvX2RhcmsuOS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvdGV4dGZpZWxkX2Rpc2FibGVkX3NlbGVjdGVkX2hvbG9fbGlnaHQuOS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS90ZXh0ZmllbGRfZGlzYWJsZWRfc2VsZWN0ZWRfaG9sb19saWdodC45LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNjY0Mzg0Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvdGV4dGZpZWxkX2Rpc2FibGVkX3NlbGVjdGVkX2hvbG9fbGlnaHQuOS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvdGV4dGZpZWxkX3ByZXNzZWRfaG9sb19kYXJrLjkucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvdGV4dGZpZWxkX3ByZXNzZWRfaG9sb19kYXJrLjkucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJiZjUzYzUKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS90ZXh0ZmllbGRfcHJlc3NlZF9ob2xvX2RhcmsuOS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvdGV4dGZpZWxkX3ByZXNzZWRfaG9sb19saWdodC45LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3RleHRmaWVsZF9wcmVzc2VkX2hvbG9fbGlnaHQuOS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2U0OWI4ZAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3RleHRmaWVsZF9wcmVzc2VkX2hvbG9fbGlnaHQuOS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvdGV4dGZpZWxkX3NlbGVjdGVkX2hvbG9fZGFyay45LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3RleHRmaWVsZF9zZWxlY3RlZF9ob2xvX2RhcmsuOS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmJmNTNjNQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3RleHRmaWVsZF9zZWxlY3RlZF9ob2xvX2RhcmsuOS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvdGV4dGZpZWxkX3NlbGVjdGVkX2hvbG9fbGlnaHQuOS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS90ZXh0ZmllbGRfc2VsZWN0ZWRfaG9sb19saWdodC45LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZTQ5YjhkCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvdGV4dGZpZWxkX3NlbGVjdGVkX2hvbG9fbGlnaHQuOS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWxhbmQtaGRwaS9pY19qb2dfZGlhbF9zb3VuZF9vZmYucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWxhbmQtaGRwaS9pY19qb2dfZGlhbF9zb3VuZF9vZmYucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBkNzNkYjQ4Li4wMDAwMDAwCi0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1sYW5kLWhkcGkvaWNfam9nX2RpYWxfc291bmRfb2ZmLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1sYW5kLWhkcGkvaWNfam9nX2RpYWxfc291bmRfb24ucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWxhbmQtaGRwaS9pY19qb2dfZGlhbF9zb3VuZF9vbi5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDkwZGE2ZTMuLjAwMDAwMDAKLS0tIGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWxhbmQtaGRwaS9pY19qb2dfZGlhbF9zb3VuZF9vbi5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbGFuZC1oZHBpL2ljX2pvZ19kaWFsX3VubG9jay5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbGFuZC1oZHBpL2ljX2pvZ19kaWFsX3VubG9jay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGE5YWYxYWYuLjAwMDAwMDAKLS0tIGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWxhbmQtaGRwaS9pY19qb2dfZGlhbF91bmxvY2sucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX2NoZWNrX29mZl9kaXNhYmxlX2ZvY3VzZWRfaG9sb19kYXJrLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl9jaGVja19vZmZfZGlzYWJsZV9mb2N1c2VkX2hvbG9fZGFyay5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTYwM2ZiMQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl9jaGVja19vZmZfZGlzYWJsZV9mb2N1c2VkX2hvbG9fZGFyay5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX2NoZWNrX29mZl9kaXNhYmxlX2ZvY3VzZWRfaG9sb19saWdodC5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9idG5fY2hlY2tfb2ZmX2Rpc2FibGVfZm9jdXNlZF9ob2xvX2xpZ2h0LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OWU5ZmY5Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX2NoZWNrX29mZl9kaXNhYmxlX2ZvY3VzZWRfaG9sb19saWdodC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX2NoZWNrX29mZl9kaXNhYmxlX2hvbG9fZGFyay5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9idG5fY2hlY2tfb2ZmX2Rpc2FibGVfaG9sb19kYXJrLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNjAzZmIxCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX2NoZWNrX29mZl9kaXNhYmxlX2hvbG9fZGFyay5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX2NoZWNrX29mZl9kaXNhYmxlX2hvbG9fbGlnaHQucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX2NoZWNrX29mZl9kaXNhYmxlX2hvbG9fbGlnaHQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY5ZTlmZjkKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9idG5fY2hlY2tfb2ZmX2Rpc2FibGVfaG9sb19saWdodC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX2NoZWNrX29mZl9ob2xvX2RhcmsucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX2NoZWNrX29mZl9ob2xvX2RhcmsucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVlNDRjMjkKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9idG5fY2hlY2tfb2ZmX2hvbG9fZGFyay5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX2NoZWNrX29mZl9ob2xvX2xpZ2h0LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl9jaGVja19vZmZfaG9sb19saWdodC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWIyZWM5MgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl9jaGVja19vZmZfaG9sb19saWdodC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX2NoZWNrX29mZl9wcmVzc2VkX2hvbG9fZGFyay5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9idG5fY2hlY2tfb2ZmX3ByZXNzZWRfaG9sb19kYXJrLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MTFiYjFkCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX2NoZWNrX29mZl9wcmVzc2VkX2hvbG9fZGFyay5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX2NoZWNrX29mZl9wcmVzc2VkX2hvbG9fbGlnaHQucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX2NoZWNrX29mZl9wcmVzc2VkX2hvbG9fbGlnaHQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVhMGVhNDQxCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX2NoZWNrX29mZl9wcmVzc2VkX2hvbG9fbGlnaHQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl9jaGVja19vZmZfc2VsZWN0ZWRfaG9sb19kYXJrLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl9jaGVja19vZmZfc2VsZWN0ZWRfaG9sb19kYXJrLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYTI4ZGYyCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX2NoZWNrX29mZl9zZWxlY3RlZF9ob2xvX2RhcmsucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl9jaGVja19vZmZfc2VsZWN0ZWRfaG9sb19saWdodC5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9idG5fY2hlY2tfb2ZmX3NlbGVjdGVkX2hvbG9fbGlnaHQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFkZTExMzYKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9idG5fY2hlY2tfb2ZmX3NlbGVjdGVkX2hvbG9fbGlnaHQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl9jaGVja19vbl9kaXNhYmxlX2ZvY3VzZWRfaG9sb19kYXJrLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl9jaGVja19vbl9kaXNhYmxlX2ZvY3VzZWRfaG9sb19kYXJrLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMTk5NzJhCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX2NoZWNrX29uX2Rpc2FibGVfZm9jdXNlZF9ob2xvX2RhcmsucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl9jaGVja19vbl9kaXNhYmxlX2ZvY3VzZWRfaG9sb19saWdodC5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9idG5fY2hlY2tfb25fZGlzYWJsZV9mb2N1c2VkX2hvbG9fbGlnaHQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEzZWY0NmUKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9idG5fY2hlY2tfb25fZGlzYWJsZV9mb2N1c2VkX2hvbG9fbGlnaHQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl9jaGVja19vbl9kaXNhYmxlX2hvbG9fZGFyay5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9idG5fY2hlY2tfb25fZGlzYWJsZV9ob2xvX2RhcmsucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYxOTk3MmEKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9idG5fY2hlY2tfb25fZGlzYWJsZV9ob2xvX2RhcmsucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl9jaGVja19vbl9kaXNhYmxlX2hvbG9fbGlnaHQucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX2NoZWNrX29uX2Rpc2FibGVfaG9sb19saWdodC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTNlZjQ2ZQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl9jaGVja19vbl9kaXNhYmxlX2hvbG9fbGlnaHQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl9jaGVja19vbl9ob2xvX2RhcmsucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX2NoZWNrX29uX2hvbG9fZGFyay5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTMwZDU2MgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl9jaGVja19vbl9ob2xvX2RhcmsucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl9jaGVja19vbl9ob2xvX2xpZ2h0LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl9jaGVja19vbl9ob2xvX2xpZ2h0LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42Yjc4MDhiCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX2NoZWNrX29uX2hvbG9fbGlnaHQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl9jaGVja19vbl9wcmVzc2VkX2hvbG9fZGFyay5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9idG5fY2hlY2tfb25fcHJlc3NlZF9ob2xvX2RhcmsucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRmNzUzZjUKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9idG5fY2hlY2tfb25fcHJlc3NlZF9ob2xvX2RhcmsucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl9jaGVja19vbl9wcmVzc2VkX2hvbG9fbGlnaHQucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX2NoZWNrX29uX3ByZXNzZWRfaG9sb19saWdodC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmE0ZGQyYwotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl9jaGVja19vbl9wcmVzc2VkX2hvbG9fbGlnaHQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl9jaGVja19vbl9zZWxlY3RlZF9ob2xvX2RhcmsucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX2NoZWNrX29uX3NlbGVjdGVkX2hvbG9fZGFyay5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzU4Njg4MQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl9jaGVja19vbl9zZWxlY3RlZF9ob2xvX2RhcmsucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl9jaGVja19vbl9zZWxlY3RlZF9ob2xvX2xpZ2h0LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl9jaGVja19vbl9zZWxlY3RlZF9ob2xvX2xpZ2h0LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNDcwMWNlCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX2NoZWNrX29uX3NlbGVjdGVkX2hvbG9fbGlnaHQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl9yYWRpb19vZmZfaG9sb19kYXJrLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl9yYWRpb19vZmZfaG9sb19kYXJrLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNmMxYzZiCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX3JhZGlvX29mZl9ob2xvX2RhcmsucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl9yYWRpb19vZmZfaG9sb19saWdodC5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9idG5fcmFkaW9fb2ZmX2hvbG9fbGlnaHQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4Mjg3ZjMKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9idG5fcmFkaW9fb2ZmX2hvbG9fbGlnaHQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl9yYWRpb19vZmZfcHJlc3NlZF9ob2xvX2RhcmsucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX3JhZGlvX29mZl9wcmVzc2VkX2hvbG9fZGFyay5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjI1MjE3YgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl9yYWRpb19vZmZfcHJlc3NlZF9ob2xvX2RhcmsucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl9yYWRpb19vZmZfcHJlc3NlZF9ob2xvX2xpZ2h0LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl9yYWRpb19vZmZfcHJlc3NlZF9ob2xvX2xpZ2h0LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNjNiOWIwCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX3JhZGlvX29mZl9wcmVzc2VkX2hvbG9fbGlnaHQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl9yYWRpb19vZmZfc2VsZWN0ZWRfaG9sb19kYXJrLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl9yYWRpb19vZmZfc2VsZWN0ZWRfaG9sb19kYXJrLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZWY3NTcyCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX3JhZGlvX29mZl9zZWxlY3RlZF9ob2xvX2RhcmsucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl9yYWRpb19vZmZfc2VsZWN0ZWRfaG9sb19saWdodC5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9idG5fcmFkaW9fb2ZmX3NlbGVjdGVkX2hvbG9fbGlnaHQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFmNzU0ZTEKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9idG5fcmFkaW9fb2ZmX3NlbGVjdGVkX2hvbG9fbGlnaHQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl9yYWRpb19vbl9ob2xvX2RhcmsucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX3JhZGlvX29uX2hvbG9fZGFyay5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGVkNzQ3MQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl9yYWRpb19vbl9ob2xvX2RhcmsucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl9yYWRpb19vbl9ob2xvX2xpZ2h0LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl9yYWRpb19vbl9ob2xvX2xpZ2h0LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MmFhYTQxCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX3JhZGlvX29uX2hvbG9fbGlnaHQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl9yYWRpb19vbl9wcmVzc2VkX2hvbG9fZGFyay5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9idG5fcmFkaW9fb25fcHJlc3NlZF9ob2xvX2RhcmsucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdjZjkxYzYKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9idG5fcmFkaW9fb25fcHJlc3NlZF9ob2xvX2RhcmsucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl9yYWRpb19vbl9wcmVzc2VkX2hvbG9fbGlnaHQucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX3JhZGlvX29uX3ByZXNzZWRfaG9sb19saWdodC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGQ5MzUwNwotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl9yYWRpb19vbl9wcmVzc2VkX2hvbG9fbGlnaHQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl9yYWRpb19vbl9zZWxlY3RlZF9ob2xvX2RhcmsucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX3JhZGlvX29uX3NlbGVjdGVkX2hvbG9fZGFyay5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTZmNmY1YgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl9yYWRpb19vbl9zZWxlY3RlZF9ob2xvX2RhcmsucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl9yYWRpb19vbl9zZWxlY3RlZF9ob2xvX2xpZ2h0LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl9yYWRpb19vbl9zZWxlY3RlZF9ob2xvX2xpZ2h0LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OGRkOGU5Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX3JhZGlvX29uX3NlbGVjdGVkX2hvbG9fbGlnaHQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2NvbWJvYm94X2Rpc2FibGVkLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2NvbWJvYm94X2Rpc2FibGVkLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMzJkYjdlCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvY29tYm9ib3hfZGlzYWJsZWQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2NvbWJvYm94X25vaGlnaGxpZ2h0LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2NvbWJvYm94X25vaGlnaGxpZ2h0LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOTYzMzE2Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvY29tYm9ib3hfbm9oaWdobGlnaHQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2RpdmlkZXJfaG9yaXpvbnRhbF9icmlnaHQuOS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9kaXZpZGVyX2hvcml6b250YWxfYnJpZ2h0LjkucG5nCmluZGV4IDM5NTIyN2EuLjQxYjc3NmIgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2RpdmlkZXJfaG9yaXpvbnRhbF9icmlnaHQuOS5wbmcKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvZGl2aWRlcl9ob3Jpem9udGFsX2JyaWdodC45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9kaXZpZGVyX2hvcml6b250YWxfYnJpZ2h0X29wYXF1ZS45LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2RpdmlkZXJfaG9yaXpvbnRhbF9icmlnaHRfb3BhcXVlLjkucG5nCmluZGV4IDVjNTM3ZWUuLmViNzVhMjIgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2RpdmlkZXJfaG9yaXpvbnRhbF9icmlnaHRfb3BhcXVlLjkucG5nCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2RpdmlkZXJfaG9yaXpvbnRhbF9icmlnaHRfb3BhcXVlLjkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2RpdmlkZXJfaG9yaXpvbnRhbF9kYXJrLjkucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvZGl2aWRlcl9ob3Jpem9udGFsX2RhcmsuOS5wbmcKaW5kZXggYmY0NWUzOC4uNTVhNWU1MyAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvZGl2aWRlcl9ob3Jpem9udGFsX2RhcmsuOS5wbmcKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvZGl2aWRlcl9ob3Jpem9udGFsX2RhcmsuOS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvZGl2aWRlcl9ob3Jpem9udGFsX2Rhcmtfb3BhcXVlLjkucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvZGl2aWRlcl9ob3Jpem9udGFsX2Rhcmtfb3BhcXVlLjkucG5nCmluZGV4IDk0NDRmMGQuLjYwZTJjYjIgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2RpdmlkZXJfaG9yaXpvbnRhbF9kYXJrX29wYXF1ZS45LnBuZworKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9kaXZpZGVyX2hvcml6b250YWxfZGFya19vcGFxdWUuOS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvZGl2aWRlcl9ob3Jpem9udGFsX2RpbV9kYXJrLjkucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvZGl2aWRlcl9ob3Jpem9udGFsX2RpbV9kYXJrLjkucG5nCmluZGV4IDA4ODM4Y2EuLmNmMzQ2MTMgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2RpdmlkZXJfaG9yaXpvbnRhbF9kaW1fZGFyay45LnBuZworKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9kaXZpZGVyX2hvcml6b250YWxfZGltX2RhcmsuOS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvZGl2aWRlcl92ZXJ0aWNhbF9icmlnaHQuOS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9kaXZpZGVyX3ZlcnRpY2FsX2JyaWdodC45LnBuZwppbmRleCAzOTUyMjdhLi40MWI3NzZiIDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9kaXZpZGVyX3ZlcnRpY2FsX2JyaWdodC45LnBuZworKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9kaXZpZGVyX3ZlcnRpY2FsX2JyaWdodC45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9kaXZpZGVyX3ZlcnRpY2FsX2JyaWdodF9vcGFxdWUuOS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9kaXZpZGVyX3ZlcnRpY2FsX2JyaWdodF9vcGFxdWUuOS5wbmcKaW5kZXggNWM1MzdlZS4uZWI3NWEyMiAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvZGl2aWRlcl92ZXJ0aWNhbF9icmlnaHRfb3BhcXVlLjkucG5nCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2RpdmlkZXJfdmVydGljYWxfYnJpZ2h0X29wYXF1ZS45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9kaXZpZGVyX3ZlcnRpY2FsX2RhcmsuOS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9kaXZpZGVyX3ZlcnRpY2FsX2RhcmsuOS5wbmcKaW5kZXggNzAyYjg3OC4uNTVhNWU1MyAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvZGl2aWRlcl92ZXJ0aWNhbF9kYXJrLjkucG5nCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2RpdmlkZXJfdmVydGljYWxfZGFyay45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9kaXZpZGVyX3ZlcnRpY2FsX2Rhcmtfb3BhcXVlLjkucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvZGl2aWRlcl92ZXJ0aWNhbF9kYXJrX29wYXF1ZS45LnBuZwppbmRleCA4ZjM1MzE1Li42MGUyY2IyIDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9kaXZpZGVyX3ZlcnRpY2FsX2Rhcmtfb3BhcXVlLjkucG5nCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2RpdmlkZXJfdmVydGljYWxfZGFya19vcGFxdWUuOS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlL2Vtb19pbV9lbWJhcnJhc3NlZC5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9lbW9faW1fZW1iYXJyYXNzZWQucG5nCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBjb3JlL3Jlcy9yZXMvZHJhd2FibGUvZW1vX2ltX2VtYmFycmFzc2VkLnBuZwpyZW5hbWUgdG8gY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvZW1vX2ltX2VtYmFycmFzc2VkLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9pY19hZ2dyZWdhdGVkLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX2FnZ3JlZ2F0ZWQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YzJlMmIwLi4wMDAwMDAwCi0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX2FnZ3JlZ2F0ZWQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfYnRuX2JhY2sucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfYnRuX2JhY2sucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM5YmZmNGMKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9pY19idG5fYmFjay5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfYnRuX2ZpbmRfbmV4dC5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9pY19idG5fZmluZF9uZXh0LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYmRjMjQ3Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfYnRuX2ZpbmRfbmV4dC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfYnRuX2ZpbmRfcHJldi5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9pY19idG5fZmluZF9wcmV2LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZTNkYTFkCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfYnRuX2ZpbmRfcHJldi5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfYnRuX25leHQucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfYnRuX25leHQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmM2Y2Y0MzYKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9pY19idG5fbmV4dC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbWVudV9maW5kLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21lbnVfZmluZC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGQ5NjM0OAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21lbnVfZmluZC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvbGlzdF9zZWxlY3Rvcl9iYWNrZ3JvdW5kX2RlZmF1bHQuOS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9saXN0X3NlbGVjdG9yX2JhY2tncm91bmRfZGVmYXVsdC45LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYWM3MWIwCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvbGlzdF9zZWxlY3Rvcl9iYWNrZ3JvdW5kX2RlZmF1bHQuOS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvbGlzdF9zZWxlY3Rvcl9iYWNrZ3JvdW5kX2RlZmF1bHRfbGlnaHQuOS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9saXN0X3NlbGVjdG9yX2JhY2tncm91bmRfZGVmYXVsdF9saWdodC45LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZGVkZmZkCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvbGlzdF9zZWxlY3Rvcl9iYWNrZ3JvdW5kX2RlZmF1bHRfbGlnaHQuOS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvbGlzdF9zZWxlY3Rvcl9iYWNrZ3JvdW5kX2Rpc2FibGVkLjkucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvbGlzdF9zZWxlY3Rvcl9iYWNrZ3JvdW5kX2Rpc2FibGVkLjkucG5nCmluZGV4IGJmOTcwYjAuLjYwZjE5ZmUgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2xpc3Rfc2VsZWN0b3JfYmFja2dyb3VuZF9kaXNhYmxlZC45LnBuZworKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9saXN0X3NlbGVjdG9yX2JhY2tncm91bmRfZGlzYWJsZWQuOS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvbGlzdF9zZWxlY3Rvcl9iYWNrZ3JvdW5kX2Rpc2FibGVkX2xpZ2h0LjkucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvbGlzdF9zZWxlY3Rvcl9iYWNrZ3JvdW5kX2Rpc2FibGVkX2xpZ2h0LjkucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJjOTkyNjEyCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvbGlzdF9zZWxlY3Rvcl9iYWNrZ3JvdW5kX2Rpc2FibGVkX2xpZ2h0LjkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2xpc3Rfc2VsZWN0b3JfYmFja2dyb3VuZF9mb2N1cy45LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2xpc3Rfc2VsZWN0b3JfYmFja2dyb3VuZF9mb2N1cy45LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzNlMjQxNTguLjAwMDAwMDAKLS0tIGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvbGlzdF9zZWxlY3Rvcl9iYWNrZ3JvdW5kX2ZvY3VzLjkucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvbGlzdF9zZWxlY3Rvcl9iYWNrZ3JvdW5kX2ZvY3VzZWQuOS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9saXN0X3NlbGVjdG9yX2JhY2tncm91bmRfZm9jdXNlZC45LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YjFmMTk1Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvbGlzdF9zZWxlY3Rvcl9iYWNrZ3JvdW5kX2ZvY3VzZWQuOS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvbGlzdF9zZWxlY3Rvcl9iYWNrZ3JvdW5kX2ZvY3VzZWRfbGlnaHQuOS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9saXN0X3NlbGVjdG9yX2JhY2tncm91bmRfZm9jdXNlZF9saWdodC45LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YjFmMTk1Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvbGlzdF9zZWxlY3Rvcl9iYWNrZ3JvdW5kX2ZvY3VzZWRfbGlnaHQuOS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvbGlzdF9zZWxlY3Rvcl9iYWNrZ3JvdW5kX2ZvY3VzZWRfc2VsZWN0ZWQuOS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9saXN0X3NlbGVjdG9yX2JhY2tncm91bmRfZm9jdXNlZF9zZWxlY3RlZC45LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNWIwYzFkCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvbGlzdF9zZWxlY3Rvcl9iYWNrZ3JvdW5kX2ZvY3VzZWRfc2VsZWN0ZWQuOS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvbGlzdF9zZWxlY3Rvcl9iYWNrZ3JvdW5kX2xvbmdwcmVzcy45LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2xpc3Rfc2VsZWN0b3JfYmFja2dyb3VuZF9sb25ncHJlc3MuOS5wbmcKaW5kZXggNWNiYjI1MS4uNzgxNzY2NyAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvbGlzdF9zZWxlY3Rvcl9iYWNrZ3JvdW5kX2xvbmdwcmVzcy45LnBuZworKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9saXN0X3NlbGVjdG9yX2JhY2tncm91bmRfbG9uZ3ByZXNzLjkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2xpc3Rfc2VsZWN0b3JfYmFja2dyb3VuZF9sb25ncHJlc3NfbGlnaHQuOS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9saXN0X3NlbGVjdG9yX2JhY2tncm91bmRfbG9uZ3ByZXNzX2xpZ2h0LjkucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY0NmZjNjkKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9saXN0X3NlbGVjdG9yX2JhY2tncm91bmRfbG9uZ3ByZXNzX2xpZ2h0LjkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2xpc3Rfc2VsZWN0b3JfYmFja2dyb3VuZF9wcmVzc2VkLjkucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvbGlzdF9zZWxlY3Rvcl9iYWNrZ3JvdW5kX3ByZXNzZWQuOS5wbmcKaW5kZXggMDJiNGU5YS4uMTUzMWQ5ZCAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvbGlzdF9zZWxlY3Rvcl9iYWNrZ3JvdW5kX3ByZXNzZWQuOS5wbmcKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvbGlzdF9zZWxlY3Rvcl9iYWNrZ3JvdW5kX3ByZXNzZWQuOS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvbGlzdF9zZWxlY3Rvcl9iYWNrZ3JvdW5kX3ByZXNzZWRfbGlnaHQuOS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9saXN0X3NlbGVjdG9yX2JhY2tncm91bmRfcHJlc3NlZF9saWdodC45LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZGY2ZjQ5Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvbGlzdF9zZWxlY3Rvcl9iYWNrZ3JvdW5kX3ByZXNzZWRfbGlnaHQuOS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvbGlzdF9zZWxlY3Rvcl9iYWNrZ3JvdW5kX3NlbGVjdGVkLjkucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvbGlzdF9zZWxlY3Rvcl9iYWNrZ3JvdW5kX3NlbGVjdGVkLjkucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE0YWMxZTMKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9saXN0X3NlbGVjdG9yX2JhY2tncm91bmRfc2VsZWN0ZWQuOS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvbGlzdF9zZWxlY3Rvcl9iYWNrZ3JvdW5kX3NlbGVjdGVkX2xpZ2h0LjkucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvbGlzdF9zZWxlY3Rvcl9iYWNrZ3JvdW5kX3NlbGVjdGVkX2xpZ2h0LjkucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQwODYxOTQKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9saXN0X3NlbGVjdG9yX2JhY2tncm91bmRfc2VsZWN0ZWRfbGlnaHQuOS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvbWluaXRhYl9sdF9mb2N1cy45LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL21pbml0YWJfbHRfZm9jdXMuOS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDE1YzU3MQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL21pbml0YWJfbHRfZm9jdXMuOS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvbWluaXRhYl9sdF9wcmVzcy45LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL21pbml0YWJfbHRfcHJlc3MuOS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDE2NjU0MwotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL21pbml0YWJfbHRfcHJlc3MuOS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvbWluaXRhYl9sdF9zZWxlY3RlZC45LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL21pbml0YWJfbHRfc2VsZWN0ZWQuOS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmVmYTI3ZQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL21pbml0YWJfbHRfc2VsZWN0ZWQuOS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvbWluaXRhYl9sdF91bnNlbGVjdGVkLjkucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvbWluaXRhYl9sdF91bnNlbGVjdGVkLjkucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAwNTFjZDUKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9taW5pdGFiX2x0X3Vuc2VsZWN0ZWQuOS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvbWluaXRhYl9sdF91bnNlbGVjdGVkX3ByZXNzLjkucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvbWluaXRhYl9sdF91bnNlbGVjdGVkX3ByZXNzLjkucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY5NDQ0ZGQKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9taW5pdGFiX2x0X3Vuc2VsZWN0ZWRfcHJlc3MuOS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvcXVpY2tjb250YWN0X25vYmFkZ2UuOS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9xdWlja2NvbnRhY3Rfbm9iYWRnZS45LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYmU3NDdiCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvcXVpY2tjb250YWN0X25vYmFkZ2UuOS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvc3RhdHVzX2Jhcl9pdGVtX2FwcF9iYWNrZ3JvdW5kX25vcm1hbC45LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL3N0YXR1c19iYXJfaXRlbV9hcHBfYmFja2dyb3VuZF9ub3JtYWwuOS5wbmcKaW5kZXggYmRjYjM3OC4uYzA3OTYxNSAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvc3RhdHVzX2Jhcl9pdGVtX2FwcF9iYWNrZ3JvdW5kX25vcm1hbC45LnBuZworKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9zdGF0dXNfYmFyX2l0ZW1fYXBwX2JhY2tncm91bmRfbm9ybWFsLjkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL3RleHRmaWVsZF9kZWZhdWx0X2hvbG9fZGFyay45LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL3RleHRmaWVsZF9kZWZhdWx0X2hvbG9fZGFyay45LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOWEyY2M2Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvdGV4dGZpZWxkX2RlZmF1bHRfaG9sb19kYXJrLjkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL3RleHRmaWVsZF9kZWZhdWx0X2hvbG9fbGlnaHQuOS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS90ZXh0ZmllbGRfZGVmYXVsdF9ob2xvX2xpZ2h0LjkucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM2MDAzY2YKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS90ZXh0ZmllbGRfZGVmYXVsdF9ob2xvX2xpZ2h0LjkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL3RleHRmaWVsZF9kaXNhYmxlZF9ob2xvX2RhcmsuOS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS90ZXh0ZmllbGRfZGlzYWJsZWRfaG9sb19kYXJrLjkucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNlYzgyZGQKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS90ZXh0ZmllbGRfZGlzYWJsZWRfaG9sb19kYXJrLjkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL3RleHRmaWVsZF9kaXNhYmxlZF9ob2xvX2xpZ2h0LjkucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvdGV4dGZpZWxkX2Rpc2FibGVkX2hvbG9fbGlnaHQuOS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGE5YjExZgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL3RleHRmaWVsZF9kaXNhYmxlZF9ob2xvX2xpZ2h0LjkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL3RleHRmaWVsZF9kaXNhYmxlZF9zZWxlY3RlZF9ob2xvX2RhcmsuOS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS90ZXh0ZmllbGRfZGlzYWJsZWRfc2VsZWN0ZWRfaG9sb19kYXJrLjkucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU0NTkyNGMKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS90ZXh0ZmllbGRfZGlzYWJsZWRfc2VsZWN0ZWRfaG9sb19kYXJrLjkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL3RleHRmaWVsZF9kaXNhYmxlZF9zZWxlY3RlZF9ob2xvX2xpZ2h0LjkucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvdGV4dGZpZWxkX2Rpc2FibGVkX3NlbGVjdGVkX2hvbG9fbGlnaHQuOS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTNlZTI2YwotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL3RleHRmaWVsZF9kaXNhYmxlZF9zZWxlY3RlZF9ob2xvX2xpZ2h0LjkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL3RleHRmaWVsZF9wcmVzc2VkX2hvbG9fZGFyay45LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL3RleHRmaWVsZF9wcmVzc2VkX2hvbG9fZGFyay45LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZTdjMjRkCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvdGV4dGZpZWxkX3ByZXNzZWRfaG9sb19kYXJrLjkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL3RleHRmaWVsZF9wcmVzc2VkX2hvbG9fbGlnaHQuOS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS90ZXh0ZmllbGRfcHJlc3NlZF9ob2xvX2xpZ2h0LjkucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZlZTA5YTYKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS90ZXh0ZmllbGRfcHJlc3NlZF9ob2xvX2xpZ2h0LjkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL3RleHRmaWVsZF9zZWxlY3RlZF9ob2xvX2RhcmsuOS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS90ZXh0ZmllbGRfc2VsZWN0ZWRfaG9sb19kYXJrLjkucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBlN2MyNGQKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS90ZXh0ZmllbGRfc2VsZWN0ZWRfaG9sb19kYXJrLjkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL3RleHRmaWVsZF9zZWxlY3RlZF9ob2xvX2xpZ2h0LjkucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvdGV4dGZpZWxkX3NlbGVjdGVkX2hvbG9fbGlnaHQuOS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmVlMDlhNgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL3RleHRmaWVsZF9zZWxlY3RlZF9ob2xvX2xpZ2h0LjkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1ub2RwaS9wbGF0bG9nby5qcGcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbm9kcGkvcGxhdGxvZ28uanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZTc3ODBjLi4wMDAwMDAwCi0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1ub2RwaS9wbGF0bG9nby5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbm9kcGkvcGxhdGxvZ28ucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW5vZHBpL3BsYXRsb2dvLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNWFmMzU2Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW5vZHBpL3BsYXRsb2dvLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUteGxhcmdlL2RlZmF1bHRfd2FsbHBhcGVyLmpwZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS14bGFyZ2UvZGVmYXVsdF93YWxscGFwZXIuanBnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVhY2FkOTQKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUteGxhcmdlL2RlZmF1bHRfd2FsbHBhcGVyLmpwZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUteGxhcmdlL2ljX2xvY2tfaWRsZV9hbGFybS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUteGxhcmdlL2ljX2xvY2tfaWRsZV9hbGFybS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzM2YTgyMAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS14bGFyZ2UvaWNfbG9ja19pZGxlX2FsYXJtLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUteGxhcmdlL2ljX2xvY2tfaWRsZV9jaGFyZ2luZy5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUteGxhcmdlL2ljX2xvY2tfaWRsZV9jaGFyZ2luZy5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWJlZjUzMQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS14bGFyZ2UvaWNfbG9ja19pZGxlX2NoYXJnaW5nLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUteGxhcmdlL2ljX2xvY2tfaWRsZV9sb2NrLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS14bGFyZ2UvaWNfbG9ja19pZGxlX2xvY2sucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQwNWUyMTgKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUteGxhcmdlL2ljX2xvY2tfaWRsZV9sb2NrLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUteGxhcmdlL2ljX2xvY2tfaWRsZV9sb3dfYmF0dGVyeS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUteGxhcmdlL2ljX2xvY2tfaWRsZV9sb3dfYmF0dGVyeS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjM0OWI2MwotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS14bGFyZ2UvaWNfbG9ja19pZGxlX2xvd19iYXR0ZXJ5LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUvYWN0aW9uX2Jhcl9iYWNrZ3JvdW5kLnhtbCBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS9hY3Rpb25fYmFyX2JhY2tncm91bmQueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5MjlkN2YKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUvYWN0aW9uX2Jhcl9iYWNrZ3JvdW5kLnhtbApAQCAtMCwwICsxLDIyIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8c2hhcGUgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIj4KKyAgICA8Z3JhZGllbnQKKyAgICAgICAgYW5kcm9pZDpzdGFydENvbG9yPSIjZmZkMWQyZDQiCisgICAgICAgIGFuZHJvaWQ6ZW5kQ29sb3I9IiNmZjg1ODc4YSIKKyAgICAgICAgYW5kcm9pZDphbmdsZT0iMjcwIiAvPgorPC9zaGFwZT4KZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS9hY3Rpb25fYmFyX2NvbnRleHRfYmFja2dyb3VuZC54bWwgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUvYWN0aW9uX2Jhcl9jb250ZXh0X2JhY2tncm91bmQueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg3ODk4OTgKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUvYWN0aW9uX2Jhcl9jb250ZXh0X2JhY2tncm91bmQueG1sCkBAIC0wLDAgKzEsMjMgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzxzaGFwZSB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiPgorICAgIDxncmFkaWVudAorICAgICAgICBhbmRyb2lkOnN0YXJ0Q29sb3I9IiNmZjAwMDAwMCIKKyAgICAgICAgYW5kcm9pZDpjZW50ZXJDb2xvcj0iI2ZmZDFkMmQ0IgorICAgICAgICBhbmRyb2lkOmVuZENvbG9yPSIjZmY4NTg3OGEiCisgICAgICAgIGFuZHJvaWQ6YW5nbGU9IjI3MCIgLz4KKzwvc2hhcGU+CmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUvYWN0aW9uX2Jhcl9kaXZpZGVyLnhtbCBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS9hY3Rpb25fYmFyX2RpdmlkZXIueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQxNDMwOWYKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUvYWN0aW9uX2Jhcl9kaXZpZGVyLnhtbApAQCAtMCwwICsxLDIyIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8c2hhcGUgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIj4KKyAgICA8Z3JhZGllbnQKKyAgICAgICAgYW5kcm9pZDpzdGFydENvbG9yPSIjZmZlMWUyZTQiCisgICAgICAgIGFuZHJvaWQ6ZW5kQ29sb3I9IiNmZjk1OTc5YSIKKyAgICAgICAgYW5kcm9pZDphbmdsZT0iMjcwIiAvPgorPC9zaGFwZT4KZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS9hY3RpdmF0ZWRfYmFja2dyb3VuZC54bWwgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUvYWN0aXZhdGVkX2JhY2tncm91bmQueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ5MmZiYTEKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUvYWN0aXZhdGVkX2JhY2tncm91bmQueG1sCkBAIC0wLDAgKzEsMjAgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzxzZWxlY3RvciB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiPgorICAgIDxpdGVtIGFuZHJvaWQ6c3RhdGVfYWN0aXZhdGVkPSJ0cnVlIiBhbmRyb2lkOmRyYXdhYmxlPSJAYW5kcm9pZDpkcmF3YWJsZS9saXN0X3NlbGVjdG9yX2JhY2tncm91bmRfc2VsZWN0ZWQiIC8+CisgICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGNvbG9yL3RyYW5zcGFyZW50IiAvPgorPC9zZWxlY3Rvcj4KZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS9hY3RpdmF0ZWRfYmFja2dyb3VuZF9saWdodC54bWwgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUvYWN0aXZhdGVkX2JhY2tncm91bmRfbGlnaHQueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVkNTY4MWQKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUvYWN0aXZhdGVkX2JhY2tncm91bmRfbGlnaHQueG1sCkBAIC0wLDAgKzEsMjAgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzxzZWxlY3RvciB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiPgorICAgIDxpdGVtIGFuZHJvaWQ6c3RhdGVfYWN0aXZhdGVkPSJ0cnVlIiBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvbGlzdF9zZWxlY3Rvcl9iYWNrZ3JvdW5kX3NlbGVjdGVkX2xpZ2h0IiAvPgorICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBjb2xvci90cmFuc3BhcmVudCIgLz4KKzwvc2VsZWN0b3I+CmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUvYnRuX2NoZWNrX2hvbG9fZGFyay54bWwgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUvYnRuX2NoZWNrX2hvbG9fZGFyay54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmQ4NWQ3MgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS9idG5fY2hlY2tfaG9sb19kYXJrLnhtbApAQCAtMCwwICsxLDY1IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8c2VsZWN0b3IgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIj4KKworICAgIDwhLS0gRW5hYmxlZCBzdGF0ZXMgLS0+CisgICAgICAgIAorICAgIDxpdGVtIGFuZHJvaWQ6c3RhdGVfY2hlY2tlZD0idHJ1ZSIgYW5kcm9pZDpzdGF0ZV93aW5kb3dfZm9jdXNlZD0iZmFsc2UiCisgICAgICAgICAgYW5kcm9pZDpzdGF0ZV9lbmFibGVkPSJ0cnVlIgorICAgICAgICAgIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9idG5fY2hlY2tfb25faG9sb19kYXJrIiAvPgorICAgIDxpdGVtIGFuZHJvaWQ6c3RhdGVfY2hlY2tlZD0iZmFsc2UiIGFuZHJvaWQ6c3RhdGVfd2luZG93X2ZvY3VzZWQ9ImZhbHNlIgorICAgICAgICAgIGFuZHJvaWQ6c3RhdGVfZW5hYmxlZD0idHJ1ZSIKKyAgICAgICAgICBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvYnRuX2NoZWNrX29mZl9ob2xvX2RhcmsiIC8+CisKKyAgICA8aXRlbSBhbmRyb2lkOnN0YXRlX2NoZWNrZWQ9InRydWUiIGFuZHJvaWQ6c3RhdGVfcHJlc3NlZD0idHJ1ZSIKKyAgICAgICAgICBhbmRyb2lkOnN0YXRlX2VuYWJsZWQ9InRydWUiCisgICAgICAgICAgYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2J0bl9jaGVja19vbl9wcmVzc2VkX2hvbG9fZGFyayIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOnN0YXRlX2NoZWNrZWQ9ImZhbHNlIiBhbmRyb2lkOnN0YXRlX3ByZXNzZWQ9InRydWUiCisgICAgICAgICAgYW5kcm9pZDpzdGF0ZV9lbmFibGVkPSJ0cnVlIgorICAgICAgICAgIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9idG5fY2hlY2tfb2ZmX3ByZXNzZWRfaG9sb19kYXJrIiAvPgorCisgICAgPGl0ZW0gYW5kcm9pZDpzdGF0ZV9jaGVja2VkPSJ0cnVlIiBhbmRyb2lkOnN0YXRlX2ZvY3VzZWQ9InRydWUiCisgICAgICAgICAgYW5kcm9pZDpzdGF0ZV9lbmFibGVkPSJ0cnVlIgorICAgICAgICAgIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9idG5fY2hlY2tfb25fc2VsZWN0ZWRfaG9sb19kYXJrIiAvPgorICAgIDxpdGVtIGFuZHJvaWQ6c3RhdGVfY2hlY2tlZD0iZmFsc2UiIGFuZHJvaWQ6c3RhdGVfZm9jdXNlZD0idHJ1ZSIKKyAgICAgICAgICBhbmRyb2lkOnN0YXRlX2VuYWJsZWQ9InRydWUiCisgICAgICAgICAgYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2J0bl9jaGVja19vZmZfc2VsZWN0ZWRfaG9sb19kYXJrIiAvPgorCisgICAgPGl0ZW0gYW5kcm9pZDpzdGF0ZV9jaGVja2VkPSJmYWxzZSIKKyAgICAgICAgICBhbmRyb2lkOnN0YXRlX2VuYWJsZWQ9InRydWUiCisgICAgICAgICAgYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2J0bl9jaGVja19vZmZfaG9sb19kYXJrIiAvPgorICAgIDxpdGVtIGFuZHJvaWQ6c3RhdGVfY2hlY2tlZD0idHJ1ZSIKKyAgICAgICAgICBhbmRyb2lkOnN0YXRlX2VuYWJsZWQ9InRydWUiCisgICAgICAgICAgYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2J0bl9jaGVja19vbl9ob2xvX2RhcmsiIC8+CisKKworICAgIDwhLS0gRGlzYWJsZWQgc3RhdGVzIC0tPgorCisgICAgPGl0ZW0gYW5kcm9pZDpzdGF0ZV9jaGVja2VkPSJ0cnVlIiBhbmRyb2lkOnN0YXRlX3dpbmRvd19mb2N1c2VkPSJmYWxzZSIKKyAgICAgICAgICBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvYnRuX2NoZWNrX29uX2Rpc2FibGVfaG9sb19kYXJrIiAvPgorICAgIDxpdGVtIGFuZHJvaWQ6c3RhdGVfY2hlY2tlZD0iZmFsc2UiIGFuZHJvaWQ6c3RhdGVfd2luZG93X2ZvY3VzZWQ9ImZhbHNlIgorICAgICAgICAgIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9idG5fY2hlY2tfb2ZmX2Rpc2FibGVfaG9sb19kYXJrIiAvPgorCisgICAgPGl0ZW0gYW5kcm9pZDpzdGF0ZV9jaGVja2VkPSJ0cnVlIiBhbmRyb2lkOnN0YXRlX2ZvY3VzZWQ9InRydWUiCisgICAgICAgICAgYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2J0bl9jaGVja19vbl9kaXNhYmxlX2ZvY3VzZWRfaG9sb19kYXJrIiAvPgorICAgIDxpdGVtIGFuZHJvaWQ6c3RhdGVfY2hlY2tlZD0iZmFsc2UiIGFuZHJvaWQ6c3RhdGVfZm9jdXNlZD0idHJ1ZSIKKyAgICAgICAgICBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvYnRuX2NoZWNrX29mZl9kaXNhYmxlX2ZvY3VzZWRfaG9sb19kYXJrIiAvPgorCisgICAgPGl0ZW0gYW5kcm9pZDpzdGF0ZV9jaGVja2VkPSJmYWxzZSIgYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2J0bl9jaGVja19vZmZfZGlzYWJsZV9ob2xvX2RhcmsiIC8+CisgICAgPGl0ZW0gYW5kcm9pZDpzdGF0ZV9jaGVja2VkPSJ0cnVlIiBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvYnRuX2NoZWNrX29uX2Rpc2FibGVfaG9sb19kYXJrIiAvPgorCis8L3NlbGVjdG9yPgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlL2J0bl9jaGVja19ob2xvX2xpZ2h0LnhtbCBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS9idG5fY2hlY2tfaG9sb19saWdodC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGZiMTZmYQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS9idG5fY2hlY2tfaG9sb19saWdodC54bWwKQEAgLTAsMCArMSw2NSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPHNlbGVjdG9yIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCI+CisKKyAgICA8IS0tIEVuYWJsZWQgc3RhdGVzIC0tPgorICAgICAgICAKKyAgICA8aXRlbSBhbmRyb2lkOnN0YXRlX2NoZWNrZWQ9InRydWUiIGFuZHJvaWQ6c3RhdGVfd2luZG93X2ZvY3VzZWQ9ImZhbHNlIgorICAgICAgICAgIGFuZHJvaWQ6c3RhdGVfZW5hYmxlZD0idHJ1ZSIKKyAgICAgICAgICBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvYnRuX2NoZWNrX29uX2hvbG9fbGlnaHQiIC8+CisgICAgPGl0ZW0gYW5kcm9pZDpzdGF0ZV9jaGVja2VkPSJmYWxzZSIgYW5kcm9pZDpzdGF0ZV93aW5kb3dfZm9jdXNlZD0iZmFsc2UiCisgICAgICAgICAgYW5kcm9pZDpzdGF0ZV9lbmFibGVkPSJ0cnVlIgorICAgICAgICAgIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9idG5fY2hlY2tfb2ZmX2hvbG9fbGlnaHQiIC8+CisKKyAgICA8aXRlbSBhbmRyb2lkOnN0YXRlX2NoZWNrZWQ9InRydWUiIGFuZHJvaWQ6c3RhdGVfcHJlc3NlZD0idHJ1ZSIKKyAgICAgICAgICBhbmRyb2lkOnN0YXRlX2VuYWJsZWQ9InRydWUiCisgICAgICAgICAgYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2J0bl9jaGVja19vbl9wcmVzc2VkX2hvbG9fbGlnaHQiIC8+CisgICAgPGl0ZW0gYW5kcm9pZDpzdGF0ZV9jaGVja2VkPSJmYWxzZSIgYW5kcm9pZDpzdGF0ZV9wcmVzc2VkPSJ0cnVlIgorICAgICAgICAgIGFuZHJvaWQ6c3RhdGVfZW5hYmxlZD0idHJ1ZSIKKyAgICAgICAgICBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvYnRuX2NoZWNrX29mZl9wcmVzc2VkX2hvbG9fbGlnaHQiIC8+CisKKyAgICA8aXRlbSBhbmRyb2lkOnN0YXRlX2NoZWNrZWQ9InRydWUiIGFuZHJvaWQ6c3RhdGVfZm9jdXNlZD0idHJ1ZSIKKyAgICAgICAgICBhbmRyb2lkOnN0YXRlX2VuYWJsZWQ9InRydWUiCisgICAgICAgICAgYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2J0bl9jaGVja19vbl9zZWxlY3RlZF9ob2xvX2xpZ2h0IiAvPgorICAgIDxpdGVtIGFuZHJvaWQ6c3RhdGVfY2hlY2tlZD0iZmFsc2UiIGFuZHJvaWQ6c3RhdGVfZm9jdXNlZD0idHJ1ZSIKKyAgICAgICAgICBhbmRyb2lkOnN0YXRlX2VuYWJsZWQ9InRydWUiCisgICAgICAgICAgYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2J0bl9jaGVja19vZmZfc2VsZWN0ZWRfaG9sb19saWdodCIgLz4KKworICAgIDxpdGVtIGFuZHJvaWQ6c3RhdGVfY2hlY2tlZD0iZmFsc2UiCisgICAgICAgICAgYW5kcm9pZDpzdGF0ZV9lbmFibGVkPSJ0cnVlIgorICAgICAgICAgIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9idG5fY2hlY2tfb2ZmX2hvbG9fbGlnaHQiIC8+CisgICAgPGl0ZW0gYW5kcm9pZDpzdGF0ZV9jaGVja2VkPSJ0cnVlIgorICAgICAgICAgIGFuZHJvaWQ6c3RhdGVfZW5hYmxlZD0idHJ1ZSIKKyAgICAgICAgICBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvYnRuX2NoZWNrX29uX2hvbG9fbGlnaHQiIC8+CisKKworICAgIDwhLS0gRGlzYWJsZWQgc3RhdGVzIC0tPgorCisgICAgPGl0ZW0gYW5kcm9pZDpzdGF0ZV9jaGVja2VkPSJ0cnVlIiBhbmRyb2lkOnN0YXRlX3dpbmRvd19mb2N1c2VkPSJmYWxzZSIKKyAgICAgICAgICBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvYnRuX2NoZWNrX29uX2Rpc2FibGVfaG9sb19saWdodCIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOnN0YXRlX2NoZWNrZWQ9ImZhbHNlIiBhbmRyb2lkOnN0YXRlX3dpbmRvd19mb2N1c2VkPSJmYWxzZSIKKyAgICAgICAgICBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvYnRuX2NoZWNrX29mZl9kaXNhYmxlX2hvbG9fbGlnaHQiIC8+CisKKyAgICA8aXRlbSBhbmRyb2lkOnN0YXRlX2NoZWNrZWQ9InRydWUiIGFuZHJvaWQ6c3RhdGVfZm9jdXNlZD0idHJ1ZSIKKyAgICAgICAgICBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvYnRuX2NoZWNrX29uX2Rpc2FibGVfZm9jdXNlZF9ob2xvX2xpZ2h0IiAvPgorICAgIDxpdGVtIGFuZHJvaWQ6c3RhdGVfY2hlY2tlZD0iZmFsc2UiIGFuZHJvaWQ6c3RhdGVfZm9jdXNlZD0idHJ1ZSIKKyAgICAgICAgICBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvYnRuX2NoZWNrX29mZl9kaXNhYmxlX2ZvY3VzZWRfaG9sb19saWdodCIgLz4KKworICAgIDxpdGVtIGFuZHJvaWQ6c3RhdGVfY2hlY2tlZD0iZmFsc2UiIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9idG5fY2hlY2tfb2ZmX2Rpc2FibGVfaG9sb19saWdodCIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOnN0YXRlX2NoZWNrZWQ9InRydWUiIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9idG5fY2hlY2tfb25fZGlzYWJsZV9ob2xvX2xpZ2h0IiAvPgorCis8L3NlbGVjdG9yPgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlL2J0bl9yYWRpb19ob2xvX2RhcmsueG1sIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlL2J0bl9yYWRpb19ob2xvX2RhcmsueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg5ODRmNmQKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUvYnRuX3JhZGlvX2hvbG9fZGFyay54bWwKQEAgLTAsMCArMSwzNSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPHNlbGVjdG9yIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCI+CisgICAgPGl0ZW0gYW5kcm9pZDpzdGF0ZV9jaGVja2VkPSJ0cnVlIiBhbmRyb2lkOnN0YXRlX3dpbmRvd19mb2N1c2VkPSJmYWxzZSIKKyAgICAgICAgICBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvYnRuX3JhZGlvX29uX2hvbG9fZGFyayIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOnN0YXRlX2NoZWNrZWQ9ImZhbHNlIiBhbmRyb2lkOnN0YXRlX3dpbmRvd19mb2N1c2VkPSJmYWxzZSIKKyAgICAgICAgICBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvYnRuX3JhZGlvX29mZl9ob2xvX2RhcmsiIC8+CisgICAgICAgICAgCisgICAgPGl0ZW0gYW5kcm9pZDpzdGF0ZV9jaGVja2VkPSJ0cnVlIiBhbmRyb2lkOnN0YXRlX3ByZXNzZWQ9InRydWUiCisgICAgICAgICAgYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2J0bl9yYWRpb19vbl9wcmVzc2VkX2hvbG9fZGFyayIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOnN0YXRlX2NoZWNrZWQ9ImZhbHNlIiBhbmRyb2lkOnN0YXRlX3ByZXNzZWQ9InRydWUiCisgICAgICAgICAgYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2J0bl9yYWRpb19vZmZfcHJlc3NlZF9ob2xvX2RhcmsiIC8+CisKKyAgICA8aXRlbSBhbmRyb2lkOnN0YXRlX2NoZWNrZWQ9InRydWUiIGFuZHJvaWQ6c3RhdGVfZm9jdXNlZD0idHJ1ZSIKKyAgICAgICAgICBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvYnRuX3JhZGlvX29uX3NlbGVjdGVkX2hvbG9fZGFyayIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOnN0YXRlX2NoZWNrZWQ9ImZhbHNlIiBhbmRyb2lkOnN0YXRlX2ZvY3VzZWQ9InRydWUiCisgICAgICAgICAgYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2J0bl9yYWRpb19vZmZfc2VsZWN0ZWRfaG9sb19kYXJrIiAvPgorCisgICAgPGl0ZW0gYW5kcm9pZDpzdGF0ZV9jaGVja2VkPSJmYWxzZSIgYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2J0bl9yYWRpb19vZmZfaG9sb19kYXJrIiAvPgorICAgIDxpdGVtIGFuZHJvaWQ6c3RhdGVfY2hlY2tlZD0idHJ1ZSIgYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2J0bl9yYWRpb19vbl9ob2xvX2RhcmsiIC8+Cis8L3NlbGVjdG9yPgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlL2J0bl9yYWRpb19ob2xvX2xpZ2h0LnhtbCBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS9idG5fcmFkaW9faG9sb19saWdodC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDAxNTA4YwotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS9idG5fcmFkaW9faG9sb19saWdodC54bWwKQEAgLTAsMCArMSwzNSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPHNlbGVjdG9yIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCI+CisgICAgPGl0ZW0gYW5kcm9pZDpzdGF0ZV9jaGVja2VkPSJ0cnVlIiBhbmRyb2lkOnN0YXRlX3dpbmRvd19mb2N1c2VkPSJmYWxzZSIKKyAgICAgICAgICBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvYnRuX3JhZGlvX29uX2hvbG9fbGlnaHQiIC8+CisgICAgPGl0ZW0gYW5kcm9pZDpzdGF0ZV9jaGVja2VkPSJmYWxzZSIgYW5kcm9pZDpzdGF0ZV93aW5kb3dfZm9jdXNlZD0iZmFsc2UiCisgICAgICAgICAgYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2J0bl9yYWRpb19vZmZfaG9sb19saWdodCIgLz4KKyAgICAgICAgICAKKyAgICA8aXRlbSBhbmRyb2lkOnN0YXRlX2NoZWNrZWQ9InRydWUiIGFuZHJvaWQ6c3RhdGVfcHJlc3NlZD0idHJ1ZSIKKyAgICAgICAgICBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvYnRuX3JhZGlvX29uX3ByZXNzZWRfaG9sb19saWdodCIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOnN0YXRlX2NoZWNrZWQ9ImZhbHNlIiBhbmRyb2lkOnN0YXRlX3ByZXNzZWQ9InRydWUiCisgICAgICAgICAgYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2J0bl9yYWRpb19vZmZfcHJlc3NlZF9ob2xvX2xpZ2h0IiAvPgorCisgICAgPGl0ZW0gYW5kcm9pZDpzdGF0ZV9jaGVja2VkPSJ0cnVlIiBhbmRyb2lkOnN0YXRlX2ZvY3VzZWQ9InRydWUiCisgICAgICAgICAgYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2J0bl9yYWRpb19vbl9zZWxlY3RlZF9ob2xvX2xpZ2h0IiAvPgorICAgIDxpdGVtIGFuZHJvaWQ6c3RhdGVfY2hlY2tlZD0iZmFsc2UiIGFuZHJvaWQ6c3RhdGVfZm9jdXNlZD0idHJ1ZSIKKyAgICAgICAgICBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvYnRuX3JhZGlvX29mZl9zZWxlY3RlZF9ob2xvX2xpZ2h0IiAvPgorCisgICAgPGl0ZW0gYW5kcm9pZDpzdGF0ZV9jaGVja2VkPSJmYWxzZSIgYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2J0bl9yYWRpb19vZmZfaG9sb19saWdodCIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOnN0YXRlX2NoZWNrZWQ9InRydWUiIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9idG5fcmFkaW9fb25faG9sb19saWdodCIgLz4KKzwvc2VsZWN0b3I+CmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUvZWRpdF90ZXh0X2hvbG9fZGFyay54bWwgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUvZWRpdF90ZXh0X2hvbG9fZGFyay54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjdkMjRmZgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS9lZGl0X3RleHRfaG9sb19kYXJrLnhtbApAQCAtMCwwICsxLDI4IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICAKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPHNlbGVjdG9yIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCI+CisgICAgPGl0ZW0gYW5kcm9pZDpzdGF0ZV93aW5kb3dfZm9jdXNlZD0iZmFsc2UiIGFuZHJvaWQ6c3RhdGVfZW5hYmxlZD0idHJ1ZSIKKyAgICAgICAgYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL3RleHRmaWVsZF9kZWZhdWx0X2hvbG9fZGFyayIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOnN0YXRlX3dpbmRvd19mb2N1c2VkPSJmYWxzZSIgYW5kcm9pZDpzdGF0ZV9lbmFibGVkPSJmYWxzZSIKKyAgICAgICAgYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL3RleHRmaWVsZF9kaXNhYmxlZF9ob2xvX2RhcmsiIC8+CisgICAgPGl0ZW0gYW5kcm9pZDpzdGF0ZV9wcmVzc2VkPSJ0cnVlIiBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvdGV4dGZpZWxkX3ByZXNzZWRfaG9sb19kYXJrIiAvPgorICAgIDxpdGVtIGFuZHJvaWQ6c3RhdGVfZW5hYmxlZD0idHJ1ZSIgYW5kcm9pZDpzdGF0ZV9mb2N1c2VkPSJ0cnVlIiBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvdGV4dGZpZWxkX3NlbGVjdGVkX2hvbG9fZGFyayIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOnN0YXRlX2VuYWJsZWQ9InRydWUiIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS90ZXh0ZmllbGRfZGVmYXVsdF9ob2xvX2RhcmsiIC8+CisgICAgPGl0ZW0gYW5kcm9pZDpzdGF0ZV9mb2N1c2VkPSJ0cnVlIiBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvdGV4dGZpZWxkX2Rpc2FibGVkX3NlbGVjdGVkX2hvbG9fZGFyayIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvdGV4dGZpZWxkX2Rpc2FibGVkX2hvbG9fZGFyayIgLz4KKzwvc2VsZWN0b3I+CisKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS9lZGl0X3RleHRfaG9sb19saWdodC54bWwgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUvZWRpdF90ZXh0X2hvbG9fbGlnaHQueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRhZTM5ZTMKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUvZWRpdF90ZXh0X2hvbG9fbGlnaHQueG1sCkBAIC0wLDAgKzEsMjggQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgIAorICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8c2VsZWN0b3IgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIj4KKyAgICA8aXRlbSBhbmRyb2lkOnN0YXRlX3dpbmRvd19mb2N1c2VkPSJmYWxzZSIgYW5kcm9pZDpzdGF0ZV9lbmFibGVkPSJ0cnVlIgorICAgICAgICBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvdGV4dGZpZWxkX2RlZmF1bHRfaG9sb19saWdodCIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOnN0YXRlX3dpbmRvd19mb2N1c2VkPSJmYWxzZSIgYW5kcm9pZDpzdGF0ZV9lbmFibGVkPSJmYWxzZSIKKyAgICAgICAgYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL3RleHRmaWVsZF9kaXNhYmxlZF9ob2xvX2xpZ2h0IiAvPgorICAgIDxpdGVtIGFuZHJvaWQ6c3RhdGVfcHJlc3NlZD0idHJ1ZSIgYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL3RleHRmaWVsZF9wcmVzc2VkX2hvbG9fbGlnaHQiIC8+CisgICAgPGl0ZW0gYW5kcm9pZDpzdGF0ZV9lbmFibGVkPSJ0cnVlIiBhbmRyb2lkOnN0YXRlX2ZvY3VzZWQ9InRydWUiIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS90ZXh0ZmllbGRfc2VsZWN0ZWRfaG9sb19saWdodCIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOnN0YXRlX2VuYWJsZWQ9InRydWUiIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS90ZXh0ZmllbGRfZGVmYXVsdF9ob2xvX2xpZ2h0IiAvPgorICAgIDxpdGVtIGFuZHJvaWQ6c3RhdGVfZm9jdXNlZD0idHJ1ZSIgYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL3RleHRmaWVsZF9kaXNhYmxlZF9zZWxlY3RlZF9ob2xvX2xpZ2h0IiAvPgorICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS90ZXh0ZmllbGRfZGlzYWJsZWRfaG9sb19saWdodCIgLz4KKzwvc2VsZWN0b3I+CisKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS9saXN0X3NlbGVjdGVkX2JhY2tncm91bmQueG1sIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlL2xpc3Rfc2VsZWN0ZWRfYmFja2dyb3VuZC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmJiNjU5NAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS9saXN0X3NlbGVjdGVkX2JhY2tncm91bmQueG1sCkBAIC0wLDAgKzEsMjIgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgIAorICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8c2VsZWN0b3IgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIj4KKworICAgIDxpdGVtIGFuZHJvaWQ6c3RhdGVfZm9jdXNlZD0idHJ1ZSIgICBhbmRyb2lkOnN0YXRlX2NoZWNrZWQ9InRydWUiIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9saXN0X3NlbGVjdG9yX2JhY2tncm91bmRfZm9jdXNlZF9zZWxlY3RlZCIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOnN0YXRlX2ZvY3VzZWQ9ImZhbHNlIiAgYW5kcm9pZDpzdGF0ZV9jaGVja2VkPSJ0cnVlIiBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvbGlzdF9zZWxlY3Rvcl9iYWNrZ3JvdW5kX3NlbGVjdGVkIiAvPgorCis8L3NlbGVjdG9yPgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlL2xpc3Rfc2VsZWN0ZWRfYmFja2dyb3VuZF9saWdodC54bWwgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUvbGlzdF9zZWxlY3RlZF9iYWNrZ3JvdW5kX2xpZ2h0LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNWZjMWNiCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlL2xpc3Rfc2VsZWN0ZWRfYmFja2dyb3VuZF9saWdodC54bWwKQEAgLTAsMCArMSwyMiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAgCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgIAorICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzxzZWxlY3RvciB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiPgorCisgICAgPGl0ZW0gYW5kcm9pZDpzdGF0ZV9mb2N1c2VkPSJ0cnVlIiAgIGFuZHJvaWQ6c3RhdGVfY2hlY2tlZD0idHJ1ZSIgYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2xpc3Rfc2VsZWN0b3JfYmFja2dyb3VuZF9mb2N1c2VkX3NlbGVjdGVkIiAvPgorICAgIDxpdGVtIGFuZHJvaWQ6c3RhdGVfZm9jdXNlZD0iZmFsc2UiICBhbmRyb2lkOnN0YXRlX2NoZWNrZWQ9InRydWUiIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9saXN0X3NlbGVjdG9yX2JhY2tncm91bmRfc2VsZWN0ZWRfbGlnaHQiIC8+CisKKzwvc2VsZWN0b3I+CmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUvbGlzdF9zZWxlY3Rvcl9iYWNrZ3JvdW5kLnhtbCBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS9saXN0X3NlbGVjdG9yX2JhY2tncm91bmQueG1sCmluZGV4IGJjYTk5NmMuLjBhNTExNTIgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS9saXN0X3NlbGVjdG9yX2JhY2tncm91bmQueG1sCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS9saXN0X3NlbGVjdG9yX2JhY2tncm91bmQueG1sCkBAIC0xNiwyMiArMTYsMTQgQEAKIAogPHNlbGVjdG9yIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCI+CiAKLSAgICA8aXRlbSBhbmRyb2lkOnN0YXRlX3dpbmRvd19mb2N1c2VkPSJmYWxzZSIKLSAgICAgICAgYW5kcm9pZDpkcmF3YWJsZT0iQGNvbG9yL3RyYW5zcGFyZW50IiAvPgorICAgIDxpdGVtIGFuZHJvaWQ6c3RhdGVfd2luZG93X2ZvY3VzZWQ9ImZhbHNlIiBhbmRyb2lkOmRyYXdhYmxlPSJAY29sb3IvdHJhbnNwYXJlbnQiIC8+CiAKICAgICA8IS0tIEV2ZW4gdGhvdWdoIHRoZXNlIHR3byBwb2ludCB0byB0aGUgc2FtZSByZXNvdXJjZSwgaGF2ZSB0d28gc3RhdGVzIHNvIHRoZSBkcmF3YWJsZSB3aWxsIGludmFsaWRhdGUgaXRzZWxmIHdoZW4gY29taW5nIG91dCBvZiBwcmVzc2VkIHN0YXRlLiAtLT4KLSAgICA8aXRlbSBhbmRyb2lkOnN0YXRlX2ZvY3VzZWQ9InRydWUiIGFuZHJvaWQ6c3RhdGVfZW5hYmxlZD0iZmFsc2UiCi0gICAgICAgIGFuZHJvaWQ6c3RhdGVfcHJlc3NlZD0idHJ1ZSIKLSAgICAgICAgYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2xpc3Rfc2VsZWN0b3JfYmFja2dyb3VuZF9kaXNhYmxlZCIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOnN0YXRlX2ZvY3VzZWQ9InRydWUiIGFuZHJvaWQ6c3RhdGVfZW5hYmxlZD0iZmFsc2UiCi0gICAgICAgIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9saXN0X3NlbGVjdG9yX2JhY2tncm91bmRfZGlzYWJsZWQiIC8+Ci0KLSAgICA8aXRlbSBhbmRyb2lkOnN0YXRlX2ZvY3VzZWQ9InRydWUiIGFuZHJvaWQ6c3RhdGVfcHJlc3NlZD0idHJ1ZSIKLSAgICAgICAgYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2xpc3Rfc2VsZWN0b3JfYmFja2dyb3VuZF90cmFuc2l0aW9uIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6c3RhdGVfZm9jdXNlZD0iZmFsc2UiIGFuZHJvaWQ6c3RhdGVfcHJlc3NlZD0idHJ1ZSIKLSAgICAgICAgYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2xpc3Rfc2VsZWN0b3JfYmFja2dyb3VuZF90cmFuc2l0aW9uIiAvPgotCi0gICAgPGl0ZW0gYW5kcm9pZDpzdGF0ZV9mb2N1c2VkPSJ0cnVlIgotICAgICAgICBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvbGlzdF9zZWxlY3Rvcl9iYWNrZ3JvdW5kX2ZvY3VzIiAvPgotCisgICAgPGl0ZW0gYW5kcm9pZDpzdGF0ZV9mb2N1c2VkPSJ0cnVlIiAgYW5kcm9pZDpzdGF0ZV9lbmFibGVkPSJmYWxzZSIgYW5kcm9pZDpzdGF0ZV9wcmVzc2VkPSJ0cnVlIiBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvbGlzdF9zZWxlY3Rvcl9iYWNrZ3JvdW5kX2Rpc2FibGVkIiAvPgorICAgIDxpdGVtIGFuZHJvaWQ6c3RhdGVfZm9jdXNlZD0idHJ1ZSIgIGFuZHJvaWQ6c3RhdGVfZW5hYmxlZD0iZmFsc2UiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2xpc3Rfc2VsZWN0b3JfYmFja2dyb3VuZF9kaXNhYmxlZCIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOnN0YXRlX2ZvY3VzZWQ9InRydWUiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnN0YXRlX3ByZXNzZWQ9InRydWUiIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9saXN0X3NlbGVjdG9yX2JhY2tncm91bmRfdHJhbnNpdGlvbiIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOnN0YXRlX2ZvY3VzZWQ9ImZhbHNlIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnN0YXRlX3ByZXNzZWQ9InRydWUiIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9saXN0X3NlbGVjdG9yX2JhY2tncm91bmRfdHJhbnNpdGlvbiIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOnN0YXRlX2ZvY3VzZWQ9InRydWUiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9saXN0X3NlbGVjdG9yX2JhY2tncm91bmRfZm9jdXNlZCIgLz4KKyAgICA8aXRlbSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9saXN0X3NlbGVjdG9yX2JhY2tncm91bmRfZGVmYXVsdCIgLz4KKyAgICAKIDwvc2VsZWN0b3I+CmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUvbGlzdF9zZWxlY3Rvcl9iYWNrZ3JvdW5kX2xpZ2h0LnhtbCBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS9saXN0X3NlbGVjdG9yX2JhY2tncm91bmRfbGlnaHQueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjliNzk4MGMKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUvbGlzdF9zZWxlY3Rvcl9iYWNrZ3JvdW5kX2xpZ2h0LnhtbApAQCAtMCwwICsxLDI5IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICAKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPHNlbGVjdG9yIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCI+CisKKyAgICA8aXRlbSBhbmRyb2lkOnN0YXRlX3dpbmRvd19mb2N1c2VkPSJmYWxzZSIgYW5kcm9pZDpkcmF3YWJsZT0iQGNvbG9yL3RyYW5zcGFyZW50IiAvPgorCisgICAgPCEtLSBFdmVuIHRob3VnaCB0aGVzZSB0d28gcG9pbnQgdG8gdGhlIHNhbWUgcmVzb3VyY2UsIGhhdmUgdHdvIHN0YXRlcyBzbyB0aGUgZHJhd2FibGUgd2lsbCBpbnZhbGlkYXRlIGl0c2VsZiB3aGVuIGNvbWluZyBvdXQgb2YgcHJlc3NlZCBzdGF0ZS4gLS0+CisgICAgPGl0ZW0gYW5kcm9pZDpzdGF0ZV9mb2N1c2VkPSJ0cnVlIiAgYW5kcm9pZDpzdGF0ZV9lbmFibGVkPSJmYWxzZSIgYW5kcm9pZDpzdGF0ZV9wcmVzc2VkPSJ0cnVlIiBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvbGlzdF9zZWxlY3Rvcl9iYWNrZ3JvdW5kX2Rpc2FibGVkX2xpZ2h0IiAvPgorICAgIDxpdGVtIGFuZHJvaWQ6c3RhdGVfZm9jdXNlZD0idHJ1ZSIgIGFuZHJvaWQ6c3RhdGVfZW5hYmxlZD0iZmFsc2UiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2xpc3Rfc2VsZWN0b3JfYmFja2dyb3VuZF9kaXNhYmxlZF9saWdodCIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOnN0YXRlX2ZvY3VzZWQ9InRydWUiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnN0YXRlX3ByZXNzZWQ9InRydWUiIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9saXN0X3NlbGVjdG9yX2JhY2tncm91bmRfdHJhbnNpdGlvbl9saWdodCIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOnN0YXRlX2ZvY3VzZWQ9ImZhbHNlIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnN0YXRlX3ByZXNzZWQ9InRydWUiIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9saXN0X3NlbGVjdG9yX2JhY2tncm91bmRfdHJhbnNpdGlvbl9saWdodCIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOnN0YXRlX2ZvY3VzZWQ9InRydWUiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9saXN0X3NlbGVjdG9yX2JhY2tncm91bmRfZm9jdXNlZF9saWdodCIgLz4KKyAgICA8aXRlbSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9saXN0X3NlbGVjdG9yX2JhY2tncm91bmRfZGVmYXVsdF9saWdodCIgLz4KKworPC9zZWxlY3Rvcj4KZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS9saXN0X3NlbGVjdG9yX2JhY2tncm91bmRfdHJhbnNpdGlvbl9saWdodC54bWwgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUvbGlzdF9zZWxlY3Rvcl9iYWNrZ3JvdW5kX3RyYW5zaXRpb25fbGlnaHQueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYzNGY4OTUKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUvbGlzdF9zZWxlY3Rvcl9iYWNrZ3JvdW5kX3RyYW5zaXRpb25fbGlnaHQueG1sCkBAIC0wLDAgKzEsMjAgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgIAorICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8dHJhbnNpdGlvbiB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiPgorICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBhbmRyb2lkOmRyYXdhYmxlL2xpc3Rfc2VsZWN0b3JfYmFja2dyb3VuZF9wcmVzc2VkX2xpZ2h0IiAgLz4KKyAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAYW5kcm9pZDpkcmF3YWJsZS9saXN0X3NlbGVjdG9yX2JhY2tncm91bmRfbG9uZ3ByZXNzX2xpZ2h0IiAgLz4KKzwvdHJhbnNpdGlvbj4KZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS9taW5pdGFiX2x0LnhtbCBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS9taW5pdGFiX2x0LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZWVhOTdjCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlL21pbml0YWJfbHQueG1sCkBAIC0wLDAgKzEsMjUgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzxzZWxlY3RvciB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiPgorICAgIDxpdGVtIGFuZHJvaWQ6c3RhdGVfcHJlc3NlZD0idHJ1ZSIgYW5kcm9pZDpzdGF0ZV9zZWxlY3RlZD0idHJ1ZSIKKyAgICAgICAgICBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvbWluaXRhYl9sdF9wcmVzcyIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOnN0YXRlX3NlbGVjdGVkPSJ0cnVlIgorICAgICAgICAgIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9taW5pdGFiX2x0X3NlbGVjdGVkIiAvPgorICAgIDxpdGVtIGFuZHJvaWQ6c3RhdGVfcHJlc3NlZD0idHJ1ZSIKKyAgICAgICAgICBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvbWluaXRhYl9sdF91bnNlbGVjdGVkX3ByZXNzIiAvPgorICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9taW5pdGFiX2x0X3Vuc2VsZWN0ZWQiIC8+Cis8L3NlbGVjdG9yPgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlL292ZXJzY3JvbGxfZWRnZS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUvb3ZlcnNjcm9sbF9lZGdlLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjUwYzgyNy4uMDAwMDAwMAotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUvb3ZlcnNjcm9sbF9lZGdlLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS9vdmVyc2Nyb2xsX2dsb3cucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlL292ZXJzY3JvbGxfZ2xvdy5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY5YjQ1NmQuLjAwMDAwMDAKLS0tIGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlL292ZXJzY3JvbGxfZ2xvdy5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUvcXVpY2tjb250YWN0X25vYmFkZ2UueG1sIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlL3F1aWNrY29udGFjdF9ub2JhZGdlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTIyZmEwZS4uMDAwMDAwMAotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUvcXVpY2tjb250YWN0X25vYmFkZ2UueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTwhLS0KLS8qIGJ1YmJsZV93aXRoX2NoYXRzLnhtbAotKioKLSoqIENvcHlyaWdodCAyMDA5LCBHb29nbGUgSW5jLgotKioKLSoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0qKgotKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotKioKLSoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0qKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotKi8KLS0tPgotPHNlbGVjdG9yIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCI+Ci0gICAgPGl0ZW0gYW5kcm9pZDpzdGF0ZV9wcmVzc2VkPSJ0cnVlIiBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvcXVpY2tjb250YWN0X25vYmFkZ2VfcHJlc3NlZCIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOnN0YXRlX3NlbGVjdGVkPSJ0cnVlIiBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvcXVpY2tjb250YWN0X25vYmFkZ2VfaGlnaGxpZ2h0IiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6c3RhdGVfZm9jdXNlZD0idHJ1ZSIgYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL3F1aWNrY29udGFjdF9ub2JhZGdlX2hpZ2hsaWdodCIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOnN0YXRlX2VuYWJsZWQ9ImZhbHNlIiBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvcXVpY2tjb250YWN0X25vYmFkZ2Vfbm9ybWFsIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9xdWlja2NvbnRhY3Rfbm9iYWRnZV9ub3JtYWwiIC8+Ci08L3NlbGVjdG9yPgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlL3F1aWNrY29udGFjdF9ub2JhZGdlX2hpZ2hsaWdodC45LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS9xdWlja2NvbnRhY3Rfbm9iYWRnZV9oaWdobGlnaHQuOS5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYwZjUwYjMuLjAwMDAwMDAKLS0tIGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlL3F1aWNrY29udGFjdF9ub2JhZGdlX2hpZ2hsaWdodC45LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS9xdWlja2NvbnRhY3Rfbm9iYWRnZV9ub3JtYWwuOS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUvcXVpY2tjb250YWN0X25vYmFkZ2Vfbm9ybWFsLjkucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMWNjOWRjLi4wMDAwMDAwCi0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS9xdWlja2NvbnRhY3Rfbm9iYWRnZV9ub3JtYWwuOS5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUvcXVpY2tjb250YWN0X25vYmFkZ2VfcHJlc3NlZC45LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS9xdWlja2NvbnRhY3Rfbm9iYWRnZV9wcmVzc2VkLjkucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZTIyYzg3Li4wMDAwMDAwCi0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS9xdWlja2NvbnRhY3Rfbm9iYWRnZV9wcmVzc2VkLjkucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2xheW91dC14bGFyZ2Uva2V5Z3VhcmQueG1sIGIvY29yZS9yZXMvcmVzL2xheW91dC14bGFyZ2Uva2V5Z3VhcmQueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNhNjI5ZjgKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvbGF5b3V0LXhsYXJnZS9rZXlndWFyZC54bWwKQEAgLTAsMCArMSw0MCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0KKy8qIC8vZGV2aWNlL2FwcHMvY29tbW9uL3Jlcy9sYXlvdXQva2V5Z3VhcmQueG1sCisqKgorKiogQ29weXJpZ2h0IDIwMDcsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoqCisqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgCisqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIAorKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0IAorKioKKyoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgCisqKgorKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZSAKKyoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIAorKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCAKKyoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKy0tPgorCis8TGluZWFyTGF5b3V0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIgCisgICAgYW5kcm9pZDpwYWRkaW5nTGVmdD0iMjBkaXAiCisgICAgYW5kcm9pZDpwYWRkaW5nVG9wPSIyMGRpcCIKKyAgICBhbmRyb2lkOnBhZGRpbmdSaWdodD0iMjBkaXAiCisgICAgYW5kcm9pZDpwYWRkaW5nQm90dG9tPSIyMGRpcCIKKyAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJ2ZXJ0aWNhbCIgCisgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICBhbmRyb2lkOmJhY2tncm91bmQ9IiNmZjAwMDAwMCI+CisKKyAgICA8VGV4dFZpZXcKKyAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9sYWJlbCIKKyAgICAgICAgYW5kcm9pZDp0ZXh0U2l6ZT0iMTZzcCIgCisgICAgICAgIGFuZHJvaWQ6dGV4dFN0eWxlPSJib2xkIiAKKyAgICAgICAgYW5kcm9pZDp0ZXh0Q29sb3I9IiNGRkZGRkZGRiIgCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IiAKKyAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL2tleWd1YXJkX2xhYmVsX3RleHQiIC8+Cis8L0xpbmVhckxheW91dD4KKwpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2xheW91dC14bGFyZ2Uva2V5Z3VhcmRfc2NyZWVuX2dsb2dpbl91bmxvY2sueG1sIGIvY29yZS9yZXMvcmVzL2xheW91dC14bGFyZ2Uva2V5Z3VhcmRfc2NyZWVuX2dsb2dpbl91bmxvY2sueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhhNDY1NDYKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvbGF5b3V0LXhsYXJnZS9rZXlndWFyZF9zY3JlZW5fZ2xvZ2luX3VubG9jay54bWwKQEAgLTAsMCArMSwxMjYgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tCisqKgorKiogQ29weXJpZ2h0IDIwMDgsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoqCisqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKQorKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqKgorKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKioKKyoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKy0tPgorPExpbmVhckxheW91dCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9Im1hdGNoX3BhcmVudCIKKyAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJ2ZXJ0aWNhbCIKKyAgICBhbmRyb2lkOmJhY2tncm91bmQ9IkBhbmRyb2lkOmNvbG9yL2JhY2tncm91bmRfZGFyayIKKyAgICAgICAgPgorICAgIDxTY3JvbGxWaWV3CisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iMHB4IgorICAgICAgICBhbmRyb2lkOmxheW91dF93ZWlnaHQ9IjEiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2Fib3ZlPSJAK2lkL2VtZXJnZW5jeUNhbGwiPgorICAgICAgICA8UmVsYXRpdmVMYXlvdXQgCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJtYXRjaF9wYXJlbnQiCisgICAgICAgICAgICAgICAgPgorICAgICAgICAKKyAgICAgICAgICAgIDxUZXh0VmlldyAKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL3RvcEhlYWRlciIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iNjRkaXAiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfYWxpZ25QYXJlbnRUb3A9InRydWUiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luTGVmdD0iNGRpcCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHRBcHBlYXJhbmNlPSI/YW5kcm9pZDphdHRyL3RleHRBcHBlYXJhbmNlTWVkaXVtIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6Z3Jhdml0eT0iY2VudGVyX3ZlcnRpY2FsIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6ZHJhd2FibGVMZWZ0PSJAZHJhd2FibGUvaWNfbG9ja19pZGxlX2xvY2siCisgICAgICAgICAgICAgICAgYW5kcm9pZDpkcmF3YWJsZVBhZGRpbmc9IjVkaXAiCisgICAgICAgICAgICAgICAgLz4KKyAgICAgICAgCisgICAgICAgICAgICA8IS0tIHNwYWNlciBiZWxvdyBoZWFkZXIgLS0+CisgICAgICAgICAgICA8VmlldworICAgICAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvc3BhY2VyVG9wIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSIxZGlwIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2JlbG93PSJAaWQvdG9wSGVhZGVyIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6YmFja2dyb3VuZD0iQGRyYXdhYmxlL2RpdmlkZXJfaG9yaXpvbnRhbF9kYXJrIi8+CisgICAgICAgIAorICAgICAgICAgICAgPFRleHRWaWV3CisgICAgICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9pbnN0cnVjdGlvbnMiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9iZWxvdz0iQCtpZC9zcGFjZXJUb3AiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luVG9wPSI4ZGlwIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpbkxlZnQ9IjlkaXAiCisgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0QXBwZWFyYW5jZT0iP2FuZHJvaWQ6YXR0ci90ZXh0QXBwZWFyYW5jZVNtYWxsIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iQGFuZHJvaWQ6c3RyaW5nL2xvY2tzY3JlZW5fZ2xvZ2luX2luc3RydWN0aW9ucyIKKyAgICAgICAgICAgICAgICAvPgorICAgICAgICAKKyAgICAgICAgICAgIDxFZGl0VGV4dAorICAgICAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvbG9naW4iCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9iZWxvdz0iQGlkL2luc3RydWN0aW9ucyIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5Ub3A9IjhkaXAiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luTGVmdD0iN2RpcCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5SaWdodD0iN2RpcCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmhpbnQ9IkBhbmRyb2lkOnN0cmluZy9sb2Nrc2NyZWVuX2dsb2dpbl91c2VybmFtZV9oaW50IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6aW5wdXRUeXBlPSJ0ZXh0RW1haWxBZGRyZXNzIgorICAgICAgICAgICAgICAgIC8+CisgICAgICAgIAorICAgICAgICAgICAgPEVkaXRUZXh0CisgICAgICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9wYXNzd29yZCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2JlbG93PSJAaWQvbG9naW4iCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luVG9wPSIxNWRpcCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5MZWZ0PSI3ZGlwIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpblJpZ2h0PSI3ZGlwIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6aW5wdXRUeXBlPSJ0ZXh0UGFzc3dvcmQiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpoaW50PSJAYW5kcm9pZDpzdHJpbmcvbG9ja3NjcmVlbl9nbG9naW5fcGFzc3dvcmRfaGludCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOm5leHRGb2N1c1JpZ2h0PSJAK2lkL29rIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bmV4dEZvY3VzRG93bj0iQCtpZC9vayIKKyAgICAgICAgICAgICAgICAvPgorICAgICAgICAKKyAgICAgICAgICAgIDwhLS0gb2sgYmVsb3cgcGFzc3dvcmQsIGFsaWduZWQgdG8gcmlnaHQgb2Ygc2NyZWVuIC0tPgorICAgICAgICAgICAgPEJ1dHRvbgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvb2siCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Ijg1ZGlwIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2JlbG93PSJAaWQvcGFzc3dvcmQiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luVG9wPSI3ZGlwIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpblJpZ2h0PSI3ZGlwIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2FsaWduUGFyZW50UmlnaHQ9InRydWUiCisgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJAYW5kcm9pZDpzdHJpbmcvbG9ja3NjcmVlbl9nbG9naW5fc3VibWl0X2J1dHRvbiIKKyAgICAgICAgICAgICAgICAvPgorICAgICAgICAKKyAgICAgICAgPC9SZWxhdGl2ZUxheW91dD4KKyAgICA8L1Njcm9sbFZpZXc+CisgICAgCisgICAgPCEtLSBzcGFjZXIgYWJvdmUgZW1lcmdlbmN5IGNhbGwgLS0+CisgICAgPFZpZXcKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSIxZGlwIgorICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5Cb3R0b209IjRkaXAiCisKKyAgICAgICAgYW5kcm9pZDpiYWNrZ3JvdW5kPSJAZHJhd2FibGUvZGl2aWRlcl9ob3Jpem9udGFsX2RhcmsiLz4KKworICAgIDwhLS0gZW1lcmdlbmN5IGNhbGwgYnV0dG9uIGF0IGJvdHRvbSBjZW50ZXIgLS0+CisgICAgPEJ1dHRvbgorICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL2VtZXJnZW5jeUNhbGwiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9ncmF2aXR5PSJjZW50ZXIiCisgICAgICAgIGFuZHJvaWQ6ZHJhd2FibGVMZWZ0PSJAZHJhd2FibGUvaWNfZW1lcmdlbmN5IgorICAgICAgICBhbmRyb2lkOmRyYXdhYmxlUGFkZGluZz0iOGRpcCIKKyAgICAgICAgYW5kcm9pZDp0ZXh0PSJAYW5kcm9pZDpzdHJpbmcvbG9ja3NjcmVlbl9lbWVyZ2VuY3lfY2FsbCIKKyAgICAgICAgLz4KKworPC9MaW5lYXJMYXlvdXQ+CmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvbGF5b3V0LXhsYXJnZS9rZXlndWFyZF9zY3JlZW5fbG9jay54bWwgYi9jb3JlL3Jlcy9yZXMvbGF5b3V0LXhsYXJnZS9rZXlndWFyZF9zY3JlZW5fbG9jay54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzMzYTM1MAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9sYXlvdXQteGxhcmdlL2tleWd1YXJkX3NjcmVlbl9sb2NrLnhtbApAQCAtMCwwICsxLDIyMCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0KKyoqCisqKiBDb3B5cmlnaHQgMjAwOCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKioKKyoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpCisqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoqCisqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqKgorKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworLS0+CisgICAgICAgIAorPCEtLSBUaGlzIGlzIHRoZSBnZW5lcmFsIGxvY2sgc2NyZWVuIHdoaWNoIHNob3dzIGluZm9ybWF0aW9uIGFib3V0IHRoZQorICBzdGF0ZSBvZiB0aGUgZGV2aWNlLCBhcyB3ZWxsIGFzIGluc3RydWN0aW9ucyBvbiBob3cgdG8gZ2V0IHBhc3QgaXQKKyAgZGVwZW5kaW5nIG9uIHRoZSBzdGF0ZSBvZiB0aGUgZGV2aWNlLiAgSXQgaXMgdGhlIHNhbWUgZm9yIGxhbmRzY2FwZQorICBhbmQgcG9ydHJhaXQuLS0+Cis8TGluZWFyTGF5b3V0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJ2ZXJ0aWNhbCIKKyAgICBhbmRyb2lkOmdyYXZpdHk9ImJvdHRvbSIKKyAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0ibWF0Y2hfcGFyZW50IgorICAgIGFuZHJvaWQ6YmFja2dyb3VuZD0iI2ZmODAwMDAwIgorICAgICAgICA+CisKKyAgICA8TGluZWFyTGF5b3V0CisgICAgICAgIGFuZHJvaWQ6b3JpZW50YXRpb249InZlcnRpY2FsIgorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfZ3Jhdml0eT0iY2VudGVyIgorICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5Cb3R0b209IjE1ZGlwIgorICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5MZWZ0PSIxNWRpcCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luUmlnaHQ9IjE1ZGlwIgorICAgICAgICBhbmRyb2lkOnBhZGRpbmdUb3A9IjIwZGlwIgorICAgICAgICBhbmRyb2lkOnBhZGRpbmdCb3R0b209IjIwZGlwIgorICAgICAgICBhbmRyb2lkOmJhY2tncm91bmQ9IkBhbmRyb2lkOmRyYXdhYmxlL3BvcHVwX2Z1bGxfZGFyayIKKyAgICAgICAgPgorCisgICAgICAgIDwhLS0gd2hlbiBzaW0gaXMgcHJlc2VudCAtLT4KKyAgICAgICAgPFRleHRWaWV3IGFuZHJvaWQ6aWQ9IkAraWQvaGVhZGVyU2ltT2sxIgorICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJjZW50ZXIiCisgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHRTaXplPSIzNHNwIi8+CisgICAgICAgIDxUZXh0VmlldyBhbmRyb2lkOmlkPSJAK2lkL2hlYWRlclNpbU9rMiIKKyAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6Z3Jhdml0eT0iY2VudGVyIgorICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0U2l6ZT0iMzRzcCIvPgorCisgICAgICAgIDwhLS0gd2hlbiBzaW0gaXMgbWlzc2luZyAvIGxvY2tlZCAtLT4KKyAgICAgICAgPFRleHRWaWV3IGFuZHJvaWQ6aWQ9IkAraWQvaGVhZGVyU2ltQmFkMSIKKyAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6Z3Jhdml0eT0iY2VudGVyIgorICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJAYW5kcm9pZDpzdHJpbmcvbG9ja3NjcmVlbl9taXNzaW5nX3NpbV9tZXNzYWdlIgorICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0QXBwZWFyYW5jZT0iP2FuZHJvaWQ6YXR0ci90ZXh0QXBwZWFyYW5jZUxhcmdlIi8+CisgICAgICAgIDxUZXh0VmlldyBhbmRyb2lkOmlkPSJAK2lkL2hlYWRlclNpbUJhZDIiCisgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5Ub3A9IjdkaXAiCisgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5Cb3R0b209IjdkaXAiCisgICAgICAgICAgICAgICAgICBhbmRyb2lkOmdyYXZpdHk9ImNlbnRlciIKKyAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iQGFuZHJvaWQ6c3RyaW5nL2xvY2tzY3JlZW5fbWlzc2luZ19zaW1faW5zdHJ1Y3Rpb25zIgorICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0QXBwZWFyYW5jZT0iP2FuZHJvaWQ6YXR0ci90ZXh0QXBwZWFyYW5jZVNtYWxsIi8+CisKKyAgICAgICAgPCEtLSBzcGFjZXIgYWZ0ZXIgY2FycmllciBpbmZvIC8gc2ltIG1lc3NhZ2VzIC0tPgorICAgICAgICA8VmlldworICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iMWRpcCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpblRvcD0iOGRpcCIKKyAgICAgICAgICAgIGFuZHJvaWQ6YmFja2dyb3VuZD0iQGFuZHJvaWQ6ZHJhd2FibGUvZGl2aWRlcl9ob3Jpem9udGFsX2RhcmsiLz4KKworICAgICAgICA8IS0tIHRpbWUgYW5kIGRhdGUgLS0+CisgICAgICAgIDxUZXh0VmlldyBhbmRyb2lkOmlkPSJAK2lkL3RpbWUiCisgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgICBhbmRyb2lkOmdyYXZpdHk9ImNlbnRlciIKKyAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dFNpemU9IjM0c3AiLz4KKworICAgICAgICA8VGV4dFZpZXcgYW5kcm9pZDppZD0iQCtpZC9kYXRlIgorICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJjZW50ZXIiCisgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHRTaXplPSIxOHNwIi8+CisKKyAgICAgICAgPCEtLSBzcGFjZXIgYWZ0ZXIgdGltZSBhbmQgZGF0ZSAtLT4KKyAgICAgICAgPFZpZXcKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IjFkaXAiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5Cb3R0b209IjhkaXAiCisgICAgICAgICAgICBhbmRyb2lkOmJhY2tncm91bmQ9IkBhbmRyb2lkOmRyYXdhYmxlL2RpdmlkZXJfaG9yaXpvbnRhbF9kYXJrIgorICAgICAgICAgICAgICAgIC8+CisKKyAgICAgICAgPCEtLSBiYXR0ZXJ5IGluZm8gLS0+CisgICAgICAgIDxMaW5lYXJMYXlvdXQgYW5kcm9pZDppZD0iQCtpZC9iYXR0ZXJ5SW5mbyIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJob3Jpem9udGFsIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJjZW50ZXIiCisgICAgICAgICAgICAgID4KKworICAgICAgICAgICAgPEltYWdlVmlldyBhbmRyb2lkOmlkPSJAK2lkL2JhdHRlcnlJbmZvSWNvbiIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpblJpZ2h0PSI2ZGlwIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6YmFzZWxpbmVBbGlnbmVkPSJ0cnVlIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6Z3Jhdml0eT0iY2VudGVyIgorICAgICAgICAgICAgLz4KKworICAgICAgICAgICAgPFRleHRWaWV3IGFuZHJvaWQ6aWQ9IkAraWQvYmF0dGVyeUluZm9UZXh0IgorICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0U2l6ZT0iMThzcCIKKyAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmdyYXZpdHk9ImNlbnRlciIKKyAgICAgICAgICAgIC8+CisKKyAgICAgICAgPC9MaW5lYXJMYXlvdXQ+CisKKyAgICAgICAgPCEtLSBzcGFjZXIgYWZ0ZXIgYmF0dGVyeSBpbmZvIC0tPgorICAgICAgICA8VmlldyBhbmRyb2lkOmlkPSJAK2lkL2JhdHRlcnlJbmZvU3BhY2VyIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iMWRpcCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpblRvcD0iOGRpcCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpbkJvdHRvbT0iOGRpcCIKKyAgICAgICAgICAgIGFuZHJvaWQ6YmFja2dyb3VuZD0iQGFuZHJvaWQ6ZHJhd2FibGUvZGl2aWRlcl9ob3Jpem9udGFsX2RhcmsiCisgICAgICAgICAgICAgICAgLz4KKworICAgICAgICA8IS0tIG5leHQgYWxhcm0gaW5mbyAtLT4KKworICAgICAgICA8TGluZWFyTGF5b3V0IGFuZHJvaWQ6aWQ9IkAraWQvbmV4dEFsYXJtSW5mbyIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJob3Jpem9udGFsIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJjZW50ZXIiCisgICAgICAgICAgICAgID4KKworICAgICAgICAgICAgPEltYWdlVmlldworICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luUmlnaHQ9IjZkaXAiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpiYXNlbGluZUFsaWduZWQ9InRydWUiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpzcmM9IkBhbmRyb2lkOmRyYXdhYmxlL2ljX2xvY2tfaWRsZV9hbGFybSIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmdyYXZpdHk9ImNlbnRlciIKKyAgICAgICAgICAgIC8+CisKKyAgICAgICAgICAgIDxUZXh0VmlldyBhbmRyb2lkOmlkPSJAK2lkL25leHRBbGFybVRleHQiCisgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHRTaXplPSIxOHNwIgorICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6Z3Jhdml0eT0iY2VudGVyIgorICAgICAgICAgICAgLz4KKyAgICAgICAgPC9MaW5lYXJMYXlvdXQ+CisKKyAgICAgICAgPCEtLSBzcGFjZXIgYWZ0ZXIgYWxhcm0gaW5mbyAtLT4KKyAgICAgICAgPFZpZXcgYW5kcm9pZDppZD0iQCtpZC9uZXh0QWxhcm1TcGFjZXIiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSIxZGlwIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luVG9wPSI4ZGlwIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luQm90dG9tPSI4ZGlwIgorICAgICAgICAgICAgYW5kcm9pZDpiYWNrZ3JvdW5kPSJAYW5kcm9pZDpkcmF3YWJsZS9kaXZpZGVyX2hvcml6b250YWxfZGFyayIvPgorCisgICAgICAgIDwhLS0gbG9jayBpY29uIHdpdGggJ3NjcmVlbiBsb2NrZWQnIG1lc3NhZ2UKKyAgICAgICAgICAgICAoc2hvd24gd2hlbiBTSU0gY2FyZCBpcyBwcmVzZW50KSAtLT4KKyAgICAgICAgPExpbmVhckxheW91dCBhbmRyb2lkOmlkPSJAK2lkL3NjcmVlbkxvY2tlZEluZm8iCisgICAgICAgICAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJob3Jpem9udGFsIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJjZW50ZXIiCisgICAgICAgICAgICA+CisKKyAgICAgICAgICAgIDxJbWFnZVZpZXcKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpblJpZ2h0PSI2ZGlwIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6YmFzZWxpbmVBbGlnbmVkPSJ0cnVlIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6c3JjPSJAYW5kcm9pZDpkcmF3YWJsZS9pY19sb2NrX2lkbGVfbG9jayIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmdyYXZpdHk9ImNlbnRlciIKKyAgICAgICAgICAgIC8+CisKKyAgICAgICAgICAgIDxUZXh0VmlldworICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0U2l6ZT0iMThzcCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IkBhbmRyb2lkOnN0cmluZy9sb2Nrc2NyZWVuX3NjcmVlbl9sb2NrZWQiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJjZW50ZXIiCisgICAgICAgICAgICAgICAgICAgIC8+CisgICAgICAgIDwvTGluZWFyTGF5b3V0PgorCisgICAgICAgIDwhLS0gbWVzc2FnZSBhYm91dCBob3cgdG8gdW5sb2NrCisgICAgICAgICAgICAgKHNob3duIHdoZW4gU0lNIGNhcmQgaXMgcHJlc2VudCkgLS0+CisgICAgICAgIDxUZXh0VmlldyBhbmRyb2lkOmlkPSJAK2lkL2xvY2tJbnN0cnVjdGlvbnMiCisgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5Cb3R0b209IjVkaXAiCisgICAgICAgICAgICAgICAgICBhbmRyb2lkOmdyYXZpdHk9ImNlbnRlciIKKyAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dFNpemU9IjE0c3AiLz4KKworCisgICAgICAgIDwhLS0gZW1lcmdlbmN5IGNhbGwgYnV0dG9uIHNob3duIHdoZW4gc2ltIGlzIG1pc3Npbmcgb3IgUFVLZCAtLT4KKyAgICAgICAgPEJ1dHRvbgorICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9lbWVyZ2VuY3lDYWxsQnV0dG9uIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luQm90dG9tPSI1ZGlwIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luVG9wPSI1ZGlwIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfZ3Jhdml0eT0iY2VudGVyX2hvcml6b250YWwiCisgICAgICAgICAgICBhbmRyb2lkOmRyYXdhYmxlTGVmdD0iQGRyYXdhYmxlL2ljX2VtZXJnZW5jeSIKKyAgICAgICAgICAgIGFuZHJvaWQ6ZHJhd2FibGVQYWRkaW5nPSI4ZGlwIgorICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJAYW5kcm9pZDpzdHJpbmcvbG9ja3NjcmVlbl9lbWVyZ2VuY3lfY2FsbCIKKyAgICAgICAgICAgLz4KKworICAgIDwvTGluZWFyTGF5b3V0PgorPC9MaW5lYXJMYXlvdXQ+CmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvbGF5b3V0LXhsYXJnZS9rZXlndWFyZF9zY3JlZW5fcGFzc3dvcmRfbGFuZHNjYXBlLnhtbCBiL2NvcmUvcmVzL3Jlcy9sYXlvdXQteGxhcmdlL2tleWd1YXJkX3NjcmVlbl9wYXNzd29yZF9sYW5kc2NhcGUueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMyZDg3YTIKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvbGF5b3V0LXhsYXJnZS9rZXlndWFyZF9zY3JlZW5fcGFzc3dvcmRfbGFuZHNjYXBlLnhtbApAQCAtMCwwICsxLDkwIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLQorKioKKyoqIENvcHlyaWdodCAyMDA4LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqKgorKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIikKKyoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKioKKyoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoqCisqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCistLT4KKworPExpbmVhckxheW91dCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9Im1hdGNoX3BhcmVudCIKKyAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJob3Jpem9udGFsIgorICAgICAgICA+CisgICAgCisgICAgPCEtLSBsZWZ0IHNpZGU6IHN0YXR1cyBhbmQgZW1lcmdlbmN5IGNhbGwgYnV0dG9uIC0tPgorICAgIDxMaW5lYXJMYXlvdXQKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0ibWF0Y2hfcGFyZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2VpZ2h0PSIxIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IjBkaXAiCisgICAgICAgICAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJ2ZXJ0aWNhbCIKKyAgICAgICAgICAgIGFuZHJvaWQ6Z3Jhdml0eT0iY2VudGVyX3ZlcnRpY2FsIgorICAgICAgICAgICAgICAgID4KKyAgICAgICAgPGluY2x1ZGUgbGF5b3V0PSJAbGF5b3V0L2tleWd1YXJkX3NjcmVlbl9zdGF0dXNfbGFuZCIgLz4KKyAgICA8L0xpbmVhckxheW91dD4KKyAgICAKKyAgICA8IS0tIHJpZ2h0IHNpZGU6IHBhc3N3b3JkIC0tPgorICAgIDxMaW5lYXJMYXlvdXQKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IjBkaXAiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0ibWF0Y2hfcGFyZW50IgorICAgICAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJ2ZXJ0aWNhbCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2VpZ2h0PSIxIgorICAgICAgICBhbmRyb2lkOmdyYXZpdHk9ImNlbnRlciI+CisKKyAgICAgICAgPCEtLSBQYXNzd29yZCBlbnRyeSBmaWVsZCAtLT4KKyAgICAgICAgPEVkaXRUZXh0IGFuZHJvaWQ6aWQ9IkAraWQvcGFzc3dvcmRFbnRyeSIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IjMzMGRpcCIKKyAgICAgICAgICAgIGFuZHJvaWQ6c2luZ2xlTGluZT0idHJ1ZSIKKyAgICAgICAgICAgIGFuZHJvaWQ6dGV4dFN0eWxlPSJub3JtYWwiCisgICAgICAgICAgICBhbmRyb2lkOmlucHV0VHlwZT0idGV4dFBhc3N3b3JkIgorICAgICAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJjZW50ZXIiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9ncmF2aXR5PSJjZW50ZXIiCisgICAgICAgICAgICBhbmRyb2lkOnRleHRTaXplPSIyNHNwIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luVG9wPSIxMjBkaXAiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5Cb3R0b209IjVkaXAiCisgICAgICAgICAgICBhbmRyb2lkOnRleHRBcHBlYXJhbmNlPSI/YW5kcm9pZDphdHRyL3RleHRBcHBlYXJhbmNlTWVkaXVtIgorICAgICAgICAgICAgYW5kcm9pZDpiYWNrZ3JvdW5kPSJAZHJhd2FibGUvcGFzc3dvcmRfZmllbGRfZGVmYXVsdCIKKyAgICAgICAgICAgIGFuZHJvaWQ6dGV4dENvbG9yPSIjZmZmZmZmZmYiCisgICAgICAgICAgICAvPgorCisgICAgICAgIDwhLS0gTnVtZXJpYyBrZXlib2FyZCAtLT4KKyAgICAgICAgPGNvbS5hbmRyb2lkLmludGVybmFsLndpZGdldC5QYXNzd29yZEVudHJ5S2V5Ym9hcmRWaWV3IGFuZHJvaWQ6aWQ9IkAraWQva2V5Ym9hcmQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iMzMwZGlwIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSIyNjBkaXAiCisgICAgICAgICAgICBhbmRyb2lkOmJhY2tncm91bmQ9IiMwMDAwMDAwMCIKKyAgICAgICAgICAgIGFuZHJvaWQ6a2V5QmFja2dyb3VuZD0iQGRyYXdhYmxlL2J0bl9rZXlib2FyZF9rZXlfZnVsbHRyYW5zIgorICAgICAgICAvPgorICAgICAgICA8IS0tIEFscGhhbnVtZXJpYyBrZXlib2FyZCAtLT4KKyAgICAgICAgPGNvbS5hbmRyb2lkLmludGVybmFsLndpZGdldC5QYXNzd29yZEVudHJ5S2V5Ym9hcmRWaWV3IGFuZHJvaWQ6aWQ9IkAraWQva2V5Ym9hcmRBbHBoYSIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSI0NTBkaXAiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IjIzMGRpcCIKKyAgICAgICAgICAgIGFuZHJvaWQ6YmFja2dyb3VuZD0iIzAwMDAwMDAwIgorICAgICAgICAgICAgYW5kcm9pZDprZXlCYWNrZ3JvdW5kPSJAZHJhd2FibGUvYnRuX2tleWJvYXJkX2tleV9mdWxsdHJhbnMiCisgICAgICAgIC8+CisKKyAgICAgICAgPCEtLSBlbWVyZ2VuY3kgY2FsbCBidXR0b24gLS0+CisgICAgICAgIDxCdXR0b24KKyAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvZW1lcmdlbmN5Q2FsbCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6ZHJhd2FibGVMZWZ0PSJAZHJhd2FibGUvaWNfZW1lcmdlbmN5IgorICAgICAgICAgICAgYW5kcm9pZDpkcmF3YWJsZVBhZGRpbmc9IjhkaXAiCisgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvbG9ja3NjcmVlbl9lbWVyZ2VuY3lfY2FsbCIKKyAgICAgICAgICAgIGFuZHJvaWQ6dmlzaWJpbGl0eT0iZ29uZSIKKyAgICAgICAgICAgIHN0eWxlPSJAc3R5bGUvV2lkZ2V0LkJ1dHRvbi5UcmFuc3BhcmVudCIKKyAgICAgICAgLz4KKworICAgIDwvTGluZWFyTGF5b3V0PgorPC9MaW5lYXJMYXlvdXQ+CmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvbGF5b3V0LXhsYXJnZS9rZXlndWFyZF9zY3JlZW5fcGFzc3dvcmRfcG9ydHJhaXQueG1sIGIvY29yZS9yZXMvcmVzL2xheW91dC14bGFyZ2Uva2V5Z3VhcmRfc2NyZWVuX3Bhc3N3b3JkX3BvcnRyYWl0LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOTI3ZTU5Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2xheW91dC14bGFyZ2Uva2V5Z3VhcmRfc2NyZWVuX3Bhc3N3b3JkX3BvcnRyYWl0LnhtbApAQCAtMCwwICsxLDg5IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLQorKioKKyoqIENvcHlyaWdodCAyMDA4LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqKgorKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIikKKyoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKioKKyoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoqCisqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCistLT4KKzxMaW5lYXJMYXlvdXQgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJtYXRjaF9wYXJlbnQiCisgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0idmVydGljYWwiCisgICAgICAgID4KKyAgICAKKyAgICA8IS0tIGxlZnQgc2lkZTogc3RhdHVzIGFuZCBlbWVyZ2VuY3kgY2FsbCBidXR0b24gLS0+CisgICAgPExpbmVhckxheW91dAorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iMGRpcCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dlaWdodD0iMSIKKyAgICAgICAgICAgIGFuZHJvaWQ6b3JpZW50YXRpb249InZlcnRpY2FsIgorICAgICAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJjZW50ZXJfdmVydGljYWwiCisgICAgICAgICAgICAgICAgPgorICAgICAgICA8aW5jbHVkZSBsYXlvdXQ9IkBsYXlvdXQva2V5Z3VhcmRfc2NyZWVuX3N0YXR1c19sYW5kIiAvPgorICAgIDwvTGluZWFyTGF5b3V0PgorICAgIAorICAgIDwhLS0gcmlnaHQgc2lkZTogcGFzc3dvcmQgLS0+CisgICAgPExpbmVhckxheW91dAorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IjBkaXAiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dlaWdodD0iMSIKKyAgICAgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0idmVydGljYWwiCisgICAgICAgIGFuZHJvaWQ6Z3Jhdml0eT0iY2VudGVyIj4KKworICAgICAgICA8IS0tIFBhc3N3b3JkIGVudHJ5IGZpZWxkIC0tPgorICAgICAgICA8RWRpdFRleHQgYW5kcm9pZDppZD0iQCtpZC9wYXNzd29yZEVudHJ5IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iMzMwZGlwIgorICAgICAgICAgICAgYW5kcm9pZDpzaW5nbGVMaW5lPSJ0cnVlIgorICAgICAgICAgICAgYW5kcm9pZDp0ZXh0U3R5bGU9Im5vcm1hbCIKKyAgICAgICAgICAgIGFuZHJvaWQ6aW5wdXRUeXBlPSJ0ZXh0UGFzc3dvcmQiCisgICAgICAgICAgICBhbmRyb2lkOmdyYXZpdHk9ImNlbnRlciIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2dyYXZpdHk9ImNlbnRlciIKKyAgICAgICAgICAgIGFuZHJvaWQ6dGV4dFNpemU9IjI0c3AiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5Ub3A9IjEyMGRpcCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpbkJvdHRvbT0iNWRpcCIKKyAgICAgICAgICAgIGFuZHJvaWQ6dGV4dEFwcGVhcmFuY2U9Ij9hbmRyb2lkOmF0dHIvdGV4dEFwcGVhcmFuY2VNZWRpdW0iCisgICAgICAgICAgICBhbmRyb2lkOmJhY2tncm91bmQ9IkBkcmF3YWJsZS9wYXNzd29yZF9maWVsZF9kZWZhdWx0IgorICAgICAgICAgICAgYW5kcm9pZDp0ZXh0Q29sb3I9IiNmZmZmZmZmZiIKKyAgICAgICAgICAgIC8+CisKKyAgICAgICAgPCEtLSBOdW1lcmljIGtleWJvYXJkIC0tPgorICAgICAgICA8Y29tLmFuZHJvaWQuaW50ZXJuYWwud2lkZ2V0LlBhc3N3b3JkRW50cnlLZXlib2FyZFZpZXcgYW5kcm9pZDppZD0iQCtpZC9rZXlib2FyZCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSIzMzBkaXAiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IjI2MGRpcCIKKyAgICAgICAgICAgIGFuZHJvaWQ6YmFja2dyb3VuZD0iIzAwMDAwMDAwIgorICAgICAgICAgICAgYW5kcm9pZDprZXlCYWNrZ3JvdW5kPSJAZHJhd2FibGUvYnRuX2tleWJvYXJkX2tleV9mdWxsdHJhbnMiCisgICAgICAgIC8+CisgICAgICAgIDwhLS0gQWxwaGFudW1lcmljIGtleWJvYXJkIC0tPgorICAgICAgICA8Y29tLmFuZHJvaWQuaW50ZXJuYWwud2lkZ2V0LlBhc3N3b3JkRW50cnlLZXlib2FyZFZpZXcgYW5kcm9pZDppZD0iQCtpZC9rZXlib2FyZEFscGhhIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IjQ1MGRpcCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iMjMwZGlwIgorICAgICAgICAgICAgYW5kcm9pZDpiYWNrZ3JvdW5kPSIjMDAwMDAwMDAiCisgICAgICAgICAgICBhbmRyb2lkOmtleUJhY2tncm91bmQ9IkBkcmF3YWJsZS9idG5fa2V5Ym9hcmRfa2V5X2Z1bGx0cmFucyIKKyAgICAgICAgLz4KKworICAgICAgICA8IS0tIGVtZXJnZW5jeSBjYWxsIGJ1dHRvbiAtLT4KKyAgICAgICAgPEJ1dHRvbgorICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9lbWVyZ2VuY3lDYWxsIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDpkcmF3YWJsZUxlZnQ9IkBkcmF3YWJsZS9pY19lbWVyZ2VuY3kiCisgICAgICAgICAgICBhbmRyb2lkOmRyYXdhYmxlUGFkZGluZz0iOGRpcCIKKyAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy9sb2Nrc2NyZWVuX2VtZXJnZW5jeV9jYWxsIgorICAgICAgICAgICAgYW5kcm9pZDp2aXNpYmlsaXR5PSJnb25lIgorICAgICAgICAgICAgc3R5bGU9IkBzdHlsZS9XaWRnZXQuQnV0dG9uLlRyYW5zcGFyZW50IgorICAgICAgICAvPgorCisgICAgPC9MaW5lYXJMYXlvdXQ+Cis8L0xpbmVhckxheW91dD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvbGF5b3V0LXhsYXJnZS9rZXlndWFyZF9zY3JlZW5fc2ltX3Bpbl9sYW5kc2NhcGUueG1sIGIvY29yZS9yZXMvcmVzL2xheW91dC14bGFyZ2Uva2V5Z3VhcmRfc2NyZWVuX3NpbV9waW5fbGFuZHNjYXBlLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOGNiZTUxCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2xheW91dC14bGFyZ2Uva2V5Z3VhcmRfc2NyZWVuX3NpbV9waW5fbGFuZHNjYXBlLnhtbApAQCAtMCwwICsxLDEyMiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0KKyoqCisqKiBDb3B5cmlnaHQgMjAwOCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKioKKyoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpCisqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoqCisqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqKgorKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworLS0+Cis8UmVsYXRpdmVMYXlvdXQgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgIGFuZHJvaWQ6b3JpZW50YXRpb249InZlcnRpY2FsIgorICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJtYXRjaF9wYXJlbnQiCisgICAgYW5kcm9pZDpiYWNrZ3JvdW5kPSJAYW5kcm9pZDpjb2xvci9iYWNrZ3JvdW5kX2RhcmsiCisgICAgICAgID4KKworICAKKyAgICA8IS0tIHJpZ2h0IHNpZGUgLS0+CisgICAgPCEtLSBoZWFkZXIgdGV4dCAoJ0VudGVyIFBpbiBDb2RlJykgLS0+CisgICAgPFRleHRWaWV3IGFuZHJvaWQ6aWQ9IkAraWQvaGVhZGVyVGV4dCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfYWJvdmU9IkAraWQvY2FycmllciIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfY2VudGVySG9yaXpvbnRhbD0idHJ1ZSIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luQm90dG9tPSIzMGRpcCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6dGV4dFNpemU9IjI0c3AiCisgICAgICAgICAgICAvPgorCisgICAgPCEtLSBDYXJyaWVyIGluZm8gLS0+CisgICAgPFRleHRWaWV3IGFuZHJvaWQ6aWQ9IkAraWQvY2FycmllciIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9ImZpbGxfcGFyZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfYWJvdmU9IkAraWQvcGluRGlzcGxheUdyb3VwIgorICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5Ub3A9IjlkaXAiCisgICAgICAgIGFuZHJvaWQ6Z3Jhdml0eT0ibGVmdHxib3R0b20iCisgICAgICAgIGFuZHJvaWQ6c2luZ2xlTGluZT0idHJ1ZSIKKyAgICAgICAgYW5kcm9pZDplbGxpcHNpemU9Im1hcnF1ZWUiCisgICAgICAgIGFuZHJvaWQ6dGV4dEFwcGVhcmFuY2U9Ij9hbmRyb2lkOmF0dHIvdGV4dEFwcGVhcmFuY2VNZWRpdW0iCisgICAgLz4KKworICAgIDwhLS0gZGlzcGxheXMgZG90cyBhcyB1c2VyIGVudGVycyBwaW4gLS0+CisgICAgPExpbmVhckxheW91dCBhbmRyb2lkOmlkPSJAK2lkL3BpbkRpc3BsYXlHcm91cCIKKyAgICAgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0iaG9yaXpvbnRhbCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfY2VudGVySW5QYXJlbnQ9InRydWUiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICBhbmRyb2lkOmFkZFN0YXRlc0Zyb21DaGlsZHJlbj0idHJ1ZSIKKyAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJjZW50ZXJfdmVydGljYWwiCisgICAgICAgIGFuZHJvaWQ6YmFzZWxpbmVBbGlnbmVkPSJmYWxzZSIKKyAgICAgICAgYW5kcm9pZDpwYWRkaW5nUmlnaHQ9IjBkaXAiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpblJpZ2h0PSIzMGRpcCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luTGVmdD0iMzBkaXAiCisgICAgICAgIGFuZHJvaWQ6YmFja2dyb3VuZD0iQGFuZHJvaWQ6ZHJhd2FibGUvZWRpdF90ZXh0IgorICAgID4KKworICAgICAgICA8RWRpdFRleHQgYW5kcm9pZDppZD0iQCtpZC9waW5EaXNwbGF5IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IjBkaXAiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93ZWlnaHQ9IjEiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bWF4TGluZXM9IjEiCisgICAgICAgICAgICBhbmRyb2lkOmJhY2tncm91bmQ9IkBudWxsIgorICAgICAgICAgICAgYW5kcm9pZDp0ZXh0U2l6ZT0iMzJzcCIKKyAgICAgICAgICAgIGFuZHJvaWQ6aW5wdXRUeXBlPSJ0ZXh0UGFzc3dvcmQiCisgICAgICAgICAgICAvPgorCisgICAgICAgIDxJbWFnZUJ1dHRvbiBhbmRyb2lkOmlkPSJAK2lkL2JhY2tzcGFjZSIKKyAgICAgICAgICAgICBhbmRyb2lkOnNyYz0iQGFuZHJvaWQ6ZHJhd2FibGUvaWNfaW5wdXRfZGVsZXRlIgorICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJtYXRjaF9wYXJlbnQiCisgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luVG9wPSIyZGlwIgorICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpblJpZ2h0PSIyZGlwIgorICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpbkJvdHRvbT0iMmRpcCIKKyAgICAgICAgICAgICBhbmRyb2lkOmdyYXZpdHk9ImNlbnRlciIKKyAgICAgICAgICAgIC8+CisKKyAgICA8L0xpbmVhckxheW91dD4KKyAgICAgICAgCisgICAgPExpbmVhckxheW91dAorICAgICAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJob3Jpem9udGFsIgorICAgICAgICBhbmRyb2lkOmxheW91dF9hbGlnblBhcmVudEJvdHRvbT0idHJ1ZSIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpbkJvdHRvbT0iOGRpcCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luTGVmdD0iOGRpcCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luUmlnaHQ9IjhkaXAiPgorCisgICAgICAgIDxCdXR0b24gYW5kcm9pZDppZD0iQCtpZC9vayIKKyAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iQGFuZHJvaWQ6c3RyaW5nL29rIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfYWxpZ25QYXJlbnRCb3R0b209InRydWUiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iMGRpcCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2VpZ2h0PSIxLjAiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5Cb3R0b209IjhkaXAiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5SaWdodD0iOGRpcCIKKyAgICAgICAgICAgIGFuZHJvaWQ6dGV4dFNpemU9IjE4c3AiCisgICAgICAgICAgICAvPgorCisgICAgICAgIDxCdXR0b24gYW5kcm9pZDppZD0iQCtpZC9lbWVyZ2VuY3lDYWxsIgorICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJAYW5kcm9pZDpzdHJpbmcvbG9ja3NjcmVlbl9lbWVyZ2VuY3lfY2FsbCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2FsaWduUGFyZW50Qm90dG9tPSJ0cnVlIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfY2VudGVySG9yaXpvbnRhbD0idHJ1ZSIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSIwZGlwIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93ZWlnaHQ9IjEuMCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpbkJvdHRvbT0iOGRpcCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpbkxlZnQ9IjhkaXAiCisgICAgICAgICAgICBhbmRyb2lkOnRleHRTaXplPSIxOHNwIgorICAgICAgICAgICAgYW5kcm9pZDpkcmF3YWJsZUxlZnQ9IkBkcmF3YWJsZS9pY19lbWVyZ2VuY3kiCisgICAgICAgICAgICBhbmRyb2lkOmRyYXdhYmxlUGFkZGluZz0iOGRpcCIKKyAgICAgICAgLz4KKyAgICA8L0xpbmVhckxheW91dD4KKworPC9SZWxhdGl2ZUxheW91dD4KZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9sYXlvdXQteGxhcmdlL2tleWd1YXJkX3NjcmVlbl9zaW1fcGluX3BvcnRyYWl0LnhtbCBiL2NvcmUvcmVzL3Jlcy9sYXlvdXQteGxhcmdlL2tleWd1YXJkX3NjcmVlbl9zaW1fcGluX3BvcnRyYWl0LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMDkxNDhmCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2xheW91dC14bGFyZ2Uva2V5Z3VhcmRfc2NyZWVuX3NpbV9waW5fcG9ydHJhaXQueG1sCkBAIC0wLDAgKzEsMTE5IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLQorKioKKyoqIENvcHlyaWdodCAyMDA4LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqKgorKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIikKKyoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKioKKyoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoqCisqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCistLT4KKzxMaW5lYXJMYXlvdXQgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJtYXRjaF9wYXJlbnQiCisgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0idmVydGljYWwiCisgICAgYW5kcm9pZDpiYWNrZ3JvdW5kPSJAYW5kcm9pZDpjb2xvci9iYWNrZ3JvdW5kX2RhcmsiCisgICAgYW5kcm9pZDpncmF2aXR5PSJjZW50ZXJfaG9yaXpvbnRhbCI+CisKKyAgICA8TGluZWFyTGF5b3V0IGFuZHJvaWQ6aWQ9IkAraWQvdG9wRGlzcGxheUdyb3VwIgorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0idmVydGljYWwiPgorCisgICAgICAgIDwhLS0gaGVhZGVyIHRleHQgKCdFbnRlciBQaW4gQ29kZScpIC0tPgorICAgICAgICA8VGV4dFZpZXcgYW5kcm9pZDppZD0iQCtpZC9oZWFkZXJUZXh0IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJjZW50ZXIiCisgICAgICAgICAgICBhbmRyb2lkOnNpbmdsZUxpbmU9InRydWUiCisgICAgICAgICAgICBhbmRyb2lkOnRleHRBcHBlYXJhbmNlPSI/YW5kcm9pZDphdHRyL3RleHRBcHBlYXJhbmNlTGFyZ2UiLz4KKworICAgICAgICA8IS0tIENhcnJpZXIgaW5mbyAtLT4KKyAgICAgICAgPFRleHRWaWV3IGFuZHJvaWQ6aWQ9IkAraWQvY2FycmllciIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJmaWxsX3BhcmVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luVG9wPSI5ZGlwIgorICAgICAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJjZW50ZXIiCisgICAgICAgICAgICBhbmRyb2lkOnNpbmdsZUxpbmU9InRydWUiCisgICAgICAgICAgICBhbmRyb2lkOmVsbGlwc2l6ZT0ibWFycXVlZSIKKyAgICAgICAgICAgIGFuZHJvaWQ6dGV4dEFwcGVhcmFuY2U9Ij9hbmRyb2lkOmF0dHIvdGV4dEFwcGVhcmFuY2VNZWRpdW0iLz4KKworICAgICAgICA8IS0tIHBhc3N3b3JkIGVudHJ5IC0tPgorICAgICAgICA8TGluZWFyTGF5b3V0CisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJob3Jpem9udGFsIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luUmlnaHQ9IjZkaXAiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5MZWZ0PSI2ZGlwIgorICAgICAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJjZW50ZXJfdmVydGljYWwiCisgICAgICAgICAgICBhbmRyb2lkOmJhY2tncm91bmQ9IkBhbmRyb2lkOmRyYXdhYmxlL2VkaXRfdGV4dCI+CisKKyAgICAgICAgICAgIDwhLS0gZGlzcGxheXMgZG90cyBhcyB1c2VyIGVudGVycyBwaW4gLS0+CisgICAgICAgICAgICA8VGV4dFZpZXcgYW5kcm9pZDppZD0iQCtpZC9waW5EaXNwbGF5IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSIwZGlwIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dlaWdodD0iMSIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOm1heExpbmVzPSIxIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dEFwcGVhcmFuY2U9Ij9hbmRyb2lkOmF0dHIvdGV4dEFwcGVhcmFuY2VMYXJnZUludmVyc2UiCisgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0U3R5bGU9ImJvbGQiCisgICAgICAgICAgICAgICAgYW5kcm9pZDppbnB1dFR5cGU9InRleHRQYXNzd29yZCIKKyAgICAgICAgICAgIC8+CisKKyAgICAgICAgICAgIDxJbWFnZUJ1dHRvbiBhbmRyb2lkOmlkPSJAK2lkL2JhY2tzcGFjZSIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOnNyYz0iQGFuZHJvaWQ6ZHJhd2FibGUvaWNfaW5wdXRfZGVsZXRlIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luUmlnaHQ9Ii0zZGlwIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpbkJvdHRvbT0iLTNkaXAiCisgICAgICAgICAgICAvPgorICAgICAgICA8L0xpbmVhckxheW91dD4KKworICAgIDwvTGluZWFyTGF5b3V0PgorCisgICAgPGluY2x1ZGUKKyAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9rZXlQYWQiCisgICAgICAgIGxheW91dD0iQGFuZHJvaWQ6bGF5b3V0L3R3ZWx2ZV9rZXlfZW50cnkiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJmaWxsX3BhcmVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2JlbG93PSJAaWQvdG9wRGlzcGxheUdyb3VwIgorICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5Ub3A9IjEwZGlwIgorICAgIC8+CisKKyAgICA8IS0tIHNwYWNlciBiZWxvdyBrZXlwYWQgLS0+CisgICAgPFZpZXcKKyAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9zcGFjZXJCb3R0b20iCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iMWRpcCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luVG9wPSI2ZGlwIgorICAgICAgICBhbmRyb2lkOmxheW91dF9hYm92ZT0iQGlkL2VtZXJnZW5jeUNhbGwiCisgICAgICAgIGFuZHJvaWQ6YmFja2dyb3VuZD0iQGFuZHJvaWQ6ZHJhd2FibGUvZGl2aWRlcl9ob3Jpem9udGFsX2RhcmsiCisgICAgLz4KKworICAgIDwhLS0gVGhlIGVtZXJnZW5jeSBidXR0b24gc2hvdWxkIHRha2UgdGhlIHJlc3Qgb2YgdGhlIHNwYWNlIGFuZCBiZSBjZW50ZXJlZCB2ZXJ0aWNhbGx5IC0tPgorICAgIDxMaW5lYXJMYXlvdXQKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSIwZGlwIgorICAgICAgICBhbmRyb2lkOmxheW91dF93ZWlnaHQ9IjEiCisgICAgICAgIGFuZHJvaWQ6Z3Jhdml0eT0iY2VudGVyIgorICAgICAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJ2ZXJ0aWNhbCI+CisKKyAgICAgICAgPCEtLSBlbWVyZ2VuY3kgY2FsbCBidXR0b24gLS0+CisgICAgICAgIDxCdXR0b24KKyAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvZW1lcmdlbmN5Q2FsbCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6ZHJhd2FibGVMZWZ0PSJAYW5kcm9pZDpkcmF3YWJsZS9pY19lbWVyZ2VuY3kiCisgICAgICAgICAgICBhbmRyb2lkOmRyYXdhYmxlUGFkZGluZz0iOGRpcCIKKyAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iQGFuZHJvaWQ6c3RyaW5nL2xvY2tzY3JlZW5fZW1lcmdlbmN5X2NhbGwiCisgICAgICAgIC8+CisgICAgPC9MaW5lYXJMYXlvdXQ+CisKKzwvTGluZWFyTGF5b3V0PgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2xheW91dC14bGFyZ2Uva2V5Z3VhcmRfc2NyZWVuX3N0YXR1c19sYW5kLnhtbCBiL2NvcmUvcmVzL3Jlcy9sYXlvdXQteGxhcmdlL2tleWd1YXJkX3NjcmVlbl9zdGF0dXNfbGFuZC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODU4OTg2MgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9sYXlvdXQteGxhcmdlL2tleWd1YXJkX3NjcmVlbl9zdGF0dXNfbGFuZC54bWwKQEAgLTAsMCArMSwxMjcgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tCisqKgorKiogQ29weXJpZ2h0IDIwMTAsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoqCisqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKQorKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqKgorKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKioKKyoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKy0tPgorCis8IS0tIFN0YXR1cyB0byBzaG93IG9uIHRoZSBsZWZ0IHNpZGUgb2YgbG9jayBzY3JlZW4gLS0+Cis8TGluZWFyTGF5b3V0CisgICAgICAgIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICAgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0idmVydGljYWwiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5MZWZ0PSIxNDBkaXAiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpblRvcD0iMjBkaXAiCisgICAgICAgIGFuZHJvaWQ6Z3Jhdml0eT0ibGVmdCIKKyAgICAgICAgPgorCisgICAgPFRleHRWaWV3CisgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvY2FycmllciIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6dGV4dEFwcGVhcmFuY2U9Ij9hbmRyb2lkOmF0dHIvdGV4dEFwcGVhcmFuY2VNZWRpdW0iCisgICAgICAgIGFuZHJvaWQ6dGV4dFNpemU9IjE3c3AiCisgICAgICAgIGFuZHJvaWQ6ZHJhd2FibGVQYWRkaW5nPSI0ZGlwIgorICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5Ub3A9IjMyZGlwIgorICAgICAgICBhbmRyb2lkOnNpbmdsZUxpbmU9InRydWUiCisgICAgICAgIGFuZHJvaWQ6ZWxsaXBzaXplPSJtYXJxdWVlIgorICAgICAgICAvPgorCisgICAgPGNvbS5hbmRyb2lkLmludGVybmFsLndpZGdldC5EaWdpdGFsQ2xvY2sgYW5kcm9pZDppZD0iQCtpZC90aW1lIgorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfYWxpZ25QYXJlbnRUb3A9InRydWUiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2FsaWduUGFyZW50TGVmdD0idHJ1ZSIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luVG9wPSI4ZGlwIgorICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5Cb3R0b209IjhkaXAiCisgICAgICAgID4KKworICAgICAgICA8VGV4dFZpZXcgYW5kcm9pZDppZD0iQCtpZC90aW1lRGlzcGxheSIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6c2luZ2xlTGluZT0idHJ1ZSIKKyAgICAgICAgICAgIGFuZHJvaWQ6ZWxsaXBzaXplPSJub25lIgorICAgICAgICAgICAgYW5kcm9pZDp0ZXh0U2l6ZT0iMTIwc3AiCisgICAgICAgICAgICBhbmRyb2lkOnRleHRBcHBlYXJhbmNlPSI/YW5kcm9pZDphdHRyL3RleHRBcHBlYXJhbmNlTWVkaXVtIgorICAgICAgICAgICAgYW5kcm9pZDpzaGFkb3dDb2xvcj0iI0MwMDAwMDAwIgorICAgICAgICAgICAgYW5kcm9pZDpzaGFkb3dEeD0iMCIKKyAgICAgICAgICAgIGFuZHJvaWQ6c2hhZG93RHk9IjAiCisgICAgICAgICAgICBhbmRyb2lkOnNoYWRvd1JhZGl1cz0iMy4wIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luQm90dG9tPSI2ZGlwIgorICAgICAgICAgICAgLz4KKworCisgICAgICAgIDxUZXh0VmlldyBhbmRyb2lkOmlkPSJAK2lkL2FtX3BtIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfdG9SaWdodE9mPSJAaWQvdGltZURpc3BsYXkiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9hbGlnbkJhc2VsaW5lPSJAaWQvdGltZURpc3BsYXkiCisgICAgICAgICAgICBhbmRyb2lkOnNpbmdsZUxpbmU9InRydWUiCisgICAgICAgICAgICBhbmRyb2lkOmVsbGlwc2l6ZT0ibm9uZSIKKyAgICAgICAgICAgIGFuZHJvaWQ6dGV4dFNpemU9IjMwc3AiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5MZWZ0PSI4ZGlwIgorICAgICAgICAgICAgYW5kcm9pZDp0ZXh0QXBwZWFyYW5jZT0iP2FuZHJvaWQ6YXR0ci90ZXh0QXBwZWFyYW5jZU1lZGl1bSIKKyAgICAgICAgICAgIGFuZHJvaWQ6c2hhZG93Q29sb3I9IiNDMDAwMDAwMCIKKyAgICAgICAgICAgIGFuZHJvaWQ6c2hhZG93RHg9IjAiCisgICAgICAgICAgICBhbmRyb2lkOnNoYWRvd0R5PSIwIgorICAgICAgICAgICAgYW5kcm9pZDpzaGFkb3dSYWRpdXM9IjMuMCIKKyAgICAgICAgICAgIC8+CisKKyAgICA8L2NvbS5hbmRyb2lkLmludGVybmFsLndpZGdldC5EaWdpdGFsQ2xvY2s+CisKKyAgICA8VGV4dFZpZXcKKyAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9kYXRlIgorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfYmVsb3c9IkBpZC90aW1lIgorICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5Ub3A9IjVkaXAiCisgICAgICAgIGFuZHJvaWQ6dGV4dEFwcGVhcmFuY2U9Ij9hbmRyb2lkOmF0dHIvdGV4dEFwcGVhcmFuY2VNZWRpdW0iCisgICAgICAgIGFuZHJvaWQ6dGV4dFNpemU9IjMyc3AiCisgICAgICAgIC8+CisKKyAgICA8IS0tIHVzZWQgZm9yIGluc3RydWN0aW9ucyBzdWNoIGFzICJkcmF3IHBhdHRlcm4gdG8gdW5sb2NrIiwgdGhlIG5leHQgYWxhcm0sIGFuZCBjaGFyZ2luZworICAgICAgICAgc3RhdHVzLiAgLS0+CisgICAgPFRleHRWaWV3CisgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvc3RhdHVzMiIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2FsaWduUGFyZW50VG9wPSJ0cnVlIgorICAgICAgICBhbmRyb2lkOnRleHRBcHBlYXJhbmNlPSI/YW5kcm9pZDphdHRyL3RleHRBcHBlYXJhbmNlTWVkaXVtIgorICAgICAgICBhbmRyb2lkOnRleHRTaXplPSIzMnNwIgorICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5Ub3A9IjUwZGlwIgorICAgICAgICBhbmRyb2lkOmRyYXdhYmxlUGFkZGluZz0iNGRpcCIKKyAgICAgICAgLz4KKyAgICA8VGV4dFZpZXcKKyAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9zdGF0dXMxIgorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luVG9wPSIxNWRpcCIKKyAgICAgICAgYW5kcm9pZDp0ZXh0U2l6ZT0iMzJzcCIKKyAgICAgICAgYW5kcm9pZDp0ZXh0QXBwZWFyYW5jZT0iP2FuZHJvaWQ6YXR0ci90ZXh0QXBwZWFyYW5jZU1lZGl1bSIKKyAgICAgICAgLz4KKyAgICAgICAgCisgICAgPFRleHRWaWV3CisgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvcHJvcGVydHlPZiIKKyAgICAgICAgYW5kcm9pZDpsaW5lU3BhY2luZ0V4dHJhPSI4ZGlwIgorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgYW5kcm9pZDp0ZXh0QXBwZWFyYW5jZT0iP2FuZHJvaWQ6YXR0ci90ZXh0QXBwZWFyYW5jZU1lZGl1bSIKKyAgICAgICAgYW5kcm9pZDp0ZXh0U2l6ZT0iMjJzcCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luVG9wPSI1MGRpcCIKKyAgICAgICAgYW5kcm9pZDpzaW5nbGVMaW5lPSJmYWxzZSIKKyAgICAgICAgYW5kcm9pZDp2aXNpYmlsaXR5PSJpbnZpc2libGUiCisgICAgICAgIC8+Cis8L0xpbmVhckxheW91dD4KZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9sYXlvdXQteGxhcmdlL2tleWd1YXJkX3NjcmVlbl9zdGF0dXNfcG9ydC54bWwgYi9jb3JlL3Jlcy9yZXMvbGF5b3V0LXhsYXJnZS9rZXlndWFyZF9zY3JlZW5fc3RhdHVzX3BvcnQueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg1ODk4NjIKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvbGF5b3V0LXhsYXJnZS9rZXlndWFyZF9zY3JlZW5fc3RhdHVzX3BvcnQueG1sCkBAIC0wLDAgKzEsMTI3IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLQorKioKKyoqIENvcHlyaWdodCAyMDEwLCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqKgorKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIikKKyoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKioKKyoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoqCisqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCistLT4KKworPCEtLSBTdGF0dXMgdG8gc2hvdyBvbiB0aGUgbGVmdCBzaWRlIG9mIGxvY2sgc2NyZWVuIC0tPgorPExpbmVhckxheW91dAorICAgICAgICB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgICAgIGFuZHJvaWQ6b3JpZW50YXRpb249InZlcnRpY2FsIgorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luTGVmdD0iMTQwZGlwIgorICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5Ub3A9IjIwZGlwIgorICAgICAgICBhbmRyb2lkOmdyYXZpdHk9ImxlZnQiCisgICAgICAgID4KKworICAgIDxUZXh0VmlldworICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL2NhcnJpZXIiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICBhbmRyb2lkOnRleHRBcHBlYXJhbmNlPSI/YW5kcm9pZDphdHRyL3RleHRBcHBlYXJhbmNlTWVkaXVtIgorICAgICAgICBhbmRyb2lkOnRleHRTaXplPSIxN3NwIgorICAgICAgICBhbmRyb2lkOmRyYXdhYmxlUGFkZGluZz0iNGRpcCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luVG9wPSIzMmRpcCIKKyAgICAgICAgYW5kcm9pZDpzaW5nbGVMaW5lPSJ0cnVlIgorICAgICAgICBhbmRyb2lkOmVsbGlwc2l6ZT0ibWFycXVlZSIKKyAgICAgICAgLz4KKworICAgIDxjb20uYW5kcm9pZC5pbnRlcm5hbC53aWRnZXQuRGlnaXRhbENsb2NrIGFuZHJvaWQ6aWQ9IkAraWQvdGltZSIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2FsaWduUGFyZW50VG9wPSJ0cnVlIgorICAgICAgICBhbmRyb2lkOmxheW91dF9hbGlnblBhcmVudExlZnQ9InRydWUiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpblRvcD0iOGRpcCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luQm90dG9tPSI4ZGlwIgorICAgICAgICA+CisKKyAgICAgICAgPFRleHRWaWV3IGFuZHJvaWQ6aWQ9IkAraWQvdGltZURpc3BsYXkiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOnNpbmdsZUxpbmU9InRydWUiCisgICAgICAgICAgICBhbmRyb2lkOmVsbGlwc2l6ZT0ibm9uZSIKKyAgICAgICAgICAgIGFuZHJvaWQ6dGV4dFNpemU9IjEyMHNwIgorICAgICAgICAgICAgYW5kcm9pZDp0ZXh0QXBwZWFyYW5jZT0iP2FuZHJvaWQ6YXR0ci90ZXh0QXBwZWFyYW5jZU1lZGl1bSIKKyAgICAgICAgICAgIGFuZHJvaWQ6c2hhZG93Q29sb3I9IiNDMDAwMDAwMCIKKyAgICAgICAgICAgIGFuZHJvaWQ6c2hhZG93RHg9IjAiCisgICAgICAgICAgICBhbmRyb2lkOnNoYWRvd0R5PSIwIgorICAgICAgICAgICAgYW5kcm9pZDpzaGFkb3dSYWRpdXM9IjMuMCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpbkJvdHRvbT0iNmRpcCIKKyAgICAgICAgICAgIC8+CisKKworICAgICAgICA8VGV4dFZpZXcgYW5kcm9pZDppZD0iQCtpZC9hbV9wbSIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3RvUmlnaHRPZj0iQGlkL3RpbWVEaXNwbGF5IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfYWxpZ25CYXNlbGluZT0iQGlkL3RpbWVEaXNwbGF5IgorICAgICAgICAgICAgYW5kcm9pZDpzaW5nbGVMaW5lPSJ0cnVlIgorICAgICAgICAgICAgYW5kcm9pZDplbGxpcHNpemU9Im5vbmUiCisgICAgICAgICAgICBhbmRyb2lkOnRleHRTaXplPSIzMHNwIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luTGVmdD0iOGRpcCIKKyAgICAgICAgICAgIGFuZHJvaWQ6dGV4dEFwcGVhcmFuY2U9Ij9hbmRyb2lkOmF0dHIvdGV4dEFwcGVhcmFuY2VNZWRpdW0iCisgICAgICAgICAgICBhbmRyb2lkOnNoYWRvd0NvbG9yPSIjQzAwMDAwMDAiCisgICAgICAgICAgICBhbmRyb2lkOnNoYWRvd0R4PSIwIgorICAgICAgICAgICAgYW5kcm9pZDpzaGFkb3dEeT0iMCIKKyAgICAgICAgICAgIGFuZHJvaWQ6c2hhZG93UmFkaXVzPSIzLjAiCisgICAgICAgICAgICAvPgorCisgICAgPC9jb20uYW5kcm9pZC5pbnRlcm5hbC53aWRnZXQuRGlnaXRhbENsb2NrPgorCisgICAgPFRleHRWaWV3CisgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvZGF0ZSIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2JlbG93PSJAaWQvdGltZSIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luVG9wPSI1ZGlwIgorICAgICAgICBhbmRyb2lkOnRleHRBcHBlYXJhbmNlPSI/YW5kcm9pZDphdHRyL3RleHRBcHBlYXJhbmNlTWVkaXVtIgorICAgICAgICBhbmRyb2lkOnRleHRTaXplPSIzMnNwIgorICAgICAgICAvPgorCisgICAgPCEtLSB1c2VkIGZvciBpbnN0cnVjdGlvbnMgc3VjaCBhcyAiZHJhdyBwYXR0ZXJuIHRvIHVubG9jayIsIHRoZSBuZXh0IGFsYXJtLCBhbmQgY2hhcmdpbmcKKyAgICAgICAgIHN0YXR1cy4gIC0tPgorICAgIDxUZXh0VmlldworICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL3N0YXR1czIiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9hbGlnblBhcmVudFRvcD0idHJ1ZSIKKyAgICAgICAgYW5kcm9pZDp0ZXh0QXBwZWFyYW5jZT0iP2FuZHJvaWQ6YXR0ci90ZXh0QXBwZWFyYW5jZU1lZGl1bSIKKyAgICAgICAgYW5kcm9pZDp0ZXh0U2l6ZT0iMzJzcCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luVG9wPSI1MGRpcCIKKyAgICAgICAgYW5kcm9pZDpkcmF3YWJsZVBhZGRpbmc9IjRkaXAiCisgICAgICAgIC8+CisgICAgPFRleHRWaWV3CisgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvc3RhdHVzMSIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpblRvcD0iMTVkaXAiCisgICAgICAgIGFuZHJvaWQ6dGV4dFNpemU9IjMyc3AiCisgICAgICAgIGFuZHJvaWQ6dGV4dEFwcGVhcmFuY2U9Ij9hbmRyb2lkOmF0dHIvdGV4dEFwcGVhcmFuY2VNZWRpdW0iCisgICAgICAgIC8+CisgICAgICAgIAorICAgIDxUZXh0VmlldworICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL3Byb3BlcnR5T2YiCisgICAgICAgIGFuZHJvaWQ6bGluZVNwYWNpbmdFeHRyYT0iOGRpcCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6dGV4dEFwcGVhcmFuY2U9Ij9hbmRyb2lkOmF0dHIvdGV4dEFwcGVhcmFuY2VNZWRpdW0iCisgICAgICAgIGFuZHJvaWQ6dGV4dFNpemU9IjIyc3AiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpblRvcD0iNTBkaXAiCisgICAgICAgIGFuZHJvaWQ6c2luZ2xlTGluZT0iZmFsc2UiCisgICAgICAgIGFuZHJvaWQ6dmlzaWJpbGl0eT0iaW52aXNpYmxlIgorICAgICAgICAvPgorPC9MaW5lYXJMYXlvdXQ+CmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvbGF5b3V0LXhsYXJnZS9rZXlndWFyZF9zY3JlZW5fdGFiX3VubG9jay54bWwgYi9jb3JlL3Jlcy9yZXMvbGF5b3V0LXhsYXJnZS9rZXlndWFyZF9zY3JlZW5fdGFiX3VubG9jay54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDc2MTgwMAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9sYXlvdXQteGxhcmdlL2tleWd1YXJkX3NjcmVlbl90YWJfdW5sb2NrLnhtbApAQCAtMCwwICsxLDEwMCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0KKyoqCisqKiBDb3B5cmlnaHQgMjAwOSwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKioKKyoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpCisqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoqCisqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqKgorKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworLS0+CisKKzwhLS0gVGhpcyBpcyB0aGUgZ2VuZXJhbCBsb2NrIHNjcmVlbiB3aGljaCBzaG93cyBpbmZvcm1hdGlvbiBhYm91dCB0aGUKKyAgc3RhdGUgb2YgdGhlIGRldmljZSwgYXMgd2VsbCBhcyBpbnN0cnVjdGlvbnMgb24gaG93IHRvIGdldCBwYXN0IGl0CisgIGRlcGVuZGluZyBvbiB0aGUgc3RhdGUgb2YgdGhlIGRldmljZS4gIEl0IGlzIHRoZSBzYW1lIGZvciBsYW5kc2NhcGUKKyAgYW5kIHBvcnRyYWl0Li0tPgorPFJlbGF0aXZlTGF5b3V0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICB4bWxuczp0YWJ1bmxvY2s9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvY29tLmFuZHJvaWQudGFidW5sb2NrIgorICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJtYXRjaF9wYXJlbnQiCisgICAgYW5kcm9pZDpiYWNrZ3JvdW5kPSIjNzAwMDAwMDAiCisgICAgYW5kcm9pZDpncmF2aXR5PSJjZW50ZXJfaG9yaXpvbnRhbCIKKyAgICBhbmRyb2lkOmlkPSJAK2lkL3Jvb3QiPgorCisgICAgPCEtLSBsZWZ0IHNpZGU6IHN0YXR1cyBhbmQgZW1lcmdlbmN5IGNhbGwgYnV0dG9uIC0tPgorICAgIDxMaW5lYXJMYXlvdXQKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IjBkaXAiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93ZWlnaHQ9IjEiCisgICAgICAgICAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJ2ZXJ0aWNhbCIKKyAgICAgICAgICAgIGFuZHJvaWQ6Z3Jhdml0eT0iY2VudGVyX3ZlcnRpY2FsIgorICAgICAgICAgICAgICAgID4KKyAgICAgICAgPGluY2x1ZGUgbGF5b3V0PSJAbGF5b3V0L2tleWd1YXJkX3NjcmVlbl9zdGF0dXNfbGFuZCIgLz4KKyAgICA8L0xpbmVhckxheW91dD4KKworICAgIDxMaW5lYXJMYXlvdXQKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IjBkaXAiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93ZWlnaHQ9IjEiCisgICAgICAgICAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJ2ZXJ0aWNhbCIKKyAgICAgICAgICAgICAgICA+CisgICAgICAgIDxUZXh0VmlldworICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9zY3JlZW5Mb2NrZWQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9iZWxvdz0iQGlkL3N0YXR1czIiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5MZWZ0PSIyNGRpcCIKKyAgICAgICAgICAgIGFuZHJvaWQ6dGV4dEFwcGVhcmFuY2U9Ij9hbmRyb2lkOmF0dHIvdGV4dEFwcGVhcmFuY2VNZWRpdW0iCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5Ub3A9IjEyZGlwIgorICAgICAgICAgICAgYW5kcm9pZDpkcmF3YWJsZVBhZGRpbmc9IjRkaXAiCisgICAgICAgICAgICAvPgorCisgICAgICAgIDxjb20uYW5kcm9pZC5pbnRlcm5hbC53aWRnZXQuU2xpZGluZ1RhYgorICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC90YWJfc2VsZWN0b3IiCisgICAgICAgICAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJob3Jpem9udGFsIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfYWxpZ25QYXJlbnRCb3R0b209InRydWUiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5Cb3R0b209IjgwZGlwIgorICAgICAgICAgICAgLz4KKworICAgICAgICA8IS0tICJlbWVyZ2VuY3kgY2FsbHMgb25seSIgc2hvd24gd2hlbiBzaW0gaXMgbWlzc2luZyBvciBQVUtkIC0tPgorICAgICAgICA8VGV4dFZpZXcKKyAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvZW1lcmdlbmN5Q2FsbFRleHQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9iZWxvdz0iQGlkL2NhcnJpZXIiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9hbGlnblBhcmVudFJpZ2h0PSJ0cnVlIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luVG9wPSIwZGlwIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luUmlnaHQ9IjhkaXAiCisgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvZW1lcmdlbmN5X2NhbGxzX29ubHkiCisgICAgICAgICAgICBhbmRyb2lkOnRleHRBcHBlYXJhbmNlPSI/YW5kcm9pZDphdHRyL3RleHRBcHBlYXJhbmNlU21hbGwiCisgICAgICAgICAgICBhbmRyb2lkOnRleHRDb2xvcj0iQGNvbG9yL3doaXRlIgorICAgICAgICAgICAvPgorCisgICAgICAgIDwhLS0gZW1lcmdlbmN5IGNhbGwgYnV0dG9uIHNob3duIHdoZW4gc2ltIGlzIFBVS2QgYW5kIHRhYl9zZWxlY3RvciBpcworICAgICAgICAgICAgIGhpZGRlbiAtLT4KKyAgICAgICAgPEJ1dHRvbgorICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9lbWVyZ2VuY3lDYWxsQnV0dG9uIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDpkcmF3YWJsZUxlZnQ9IkBkcmF3YWJsZS9pY19lbWVyZ2VuY3kiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9jZW50ZXJJblBhcmVudD0idHJ1ZSIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2FsaWduUGFyZW50Qm90dG9tPSJ0cnVlIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luQm90dG9tPSI4MGRpcCIKKyAgICAgICAgICAgIHN0eWxlPSJAc3R5bGUvV2lkZ2V0LkJ1dHRvbi5UcmFuc3BhcmVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6ZHJhd2FibGVQYWRkaW5nPSI4ZGlwIgorICAgICAgICAgICAgYW5kcm9pZDp2aXNpYmlsaXR5PSJnb25lIgorICAgICAgICAgICAgLz4KKyAgICA8L0xpbmVhckxheW91dD4KKworPC9SZWxhdGl2ZUxheW91dD4KKwpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2xheW91dC14bGFyZ2Uva2V5Z3VhcmRfc2NyZWVuX3RhYl91bmxvY2tfbGFuZC54bWwgYi9jb3JlL3Jlcy9yZXMvbGF5b3V0LXhsYXJnZS9rZXlndWFyZF9zY3JlZW5fdGFiX3VubG9ja19sYW5kLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYjM5OGY2Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2xheW91dC14bGFyZ2Uva2V5Z3VhcmRfc2NyZWVuX3RhYl91bmxvY2tfbGFuZC54bWwKQEAgLTAsMCArMSw5NiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0KKyoqCisqKiBDb3B5cmlnaHQgMjAwOSwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKioKKyoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpCisqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoqCisqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqKgorKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworLS0+CisKKzwhLS0gVGhpcyBpcyB0aGUgZ2VuZXJhbCBsb2NrIHNjcmVlbiB3aGljaCBzaG93cyBpbmZvcm1hdGlvbiBhYm91dCB0aGUKKyAgc3RhdGUgb2YgdGhlIGRldmljZSwgYXMgd2VsbCBhcyBpbnN0cnVjdGlvbnMgb24gaG93IHRvIGdldCBwYXN0IGl0CisgIGRlcGVuZGluZyBvbiB0aGUgc3RhdGUgb2YgdGhlIGRldmljZS4tLT4KKzxMaW5lYXJMYXlvdXQgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgIHhtbG5zOnRhYnVubG9jaz0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9jb20uYW5kcm9pZC50YWJ1bmxvY2siCisgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9Im1hdGNoX3BhcmVudCIKKyAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJob3Jpem9udGFsIgorICAgIGFuZHJvaWQ6YmFja2dyb3VuZD0iIzcwMDAwMDAwIgorICAgIGFuZHJvaWQ6aWQ9IkAraWQvcm9vdCI+CisKKyAgICA8IS0tIGxlZnQgc2lkZTogc3RhdHVzIGFuZCBlbWVyZ2VuY3kgY2FsbCBidXR0b24gLS0+CisgICAgPExpbmVhckxheW91dAorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJtYXRjaF9wYXJlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93ZWlnaHQ9IjEiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iMGRpcCIKKyAgICAgICAgICAgIGFuZHJvaWQ6b3JpZW50YXRpb249InZlcnRpY2FsIgorICAgICAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJjZW50ZXJfdmVydGljYWwiCisgICAgICAgICAgICAgICAgPgorICAgICAgICA8aW5jbHVkZSBsYXlvdXQ9IkBsYXlvdXQva2V5Z3VhcmRfc2NyZWVuX3N0YXR1c19sYW5kIiAvPgorICAgIDwvTGluZWFyTGF5b3V0PgorCisgICAgPCEtLSByaWdodCBzaWRlIC0tPgorICAgIDxMaW5lYXJMYXlvdXQKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0ibWF0Y2hfcGFyZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2VpZ2h0PSIxIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IjBkaXAiCisgICAgICAgICAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJob3Jpem9udGFsIgorICAgICAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJjZW50ZXJfaG9yaXpvbnRhbCIKKyAgICAgICAgICAgICAgICA+CisgICAgICAgIDxUZXh0VmlldworICAgICAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvc2NyZWVuTG9ja2VkIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfYmVsb3c9IkBpZC9zdGF0dXMyIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dEFwcGVhcmFuY2U9Ij9hbmRyb2lkOmF0dHIvdGV4dEFwcGVhcmFuY2VNZWRpdW0iCisgICAgICAgICAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJjZW50ZXIiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luVG9wPSIxMmRpcCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmRyYXdhYmxlUGFkZGluZz0iNGRpcCIKKyAgICAgICAgICAgICAgICAvPgorCisgICAgICAgIDxjb20uYW5kcm9pZC5pbnRlcm5hbC53aWRnZXQuU2xpZGluZ1RhYgorICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC90YWJfc2VsZWN0b3IiCisgICAgICAgICAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJ2ZXJ0aWNhbCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpblJpZ2h0PSIwZGlwIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2VpZ2h0PSIxLjAiCisgICAgICAgICAgICAvPgorICAgICAgICAgICAgCisgICAgICAgIDwhLS0gImVtZXJnZW5jeSBjYWxscyBvbmx5IiBzaG93biB3aGVuIHNpbSBpcyBtaXNzaW5nIG9yIFBVS2QgLS0+CisgICAgICAgIDxUZXh0VmlldworICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9lbWVyZ2VuY3lDYWxsVGV4dCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2FsaWduUGFyZW50VG9wPSJ0cnVlIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luVG9wPSIyMGRpcCIKKyAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy9lbWVyZ2VuY3lfY2FsbHNfb25seSIKKyAgICAgICAgICAgIGFuZHJvaWQ6dGV4dEFwcGVhcmFuY2U9Ij9hbmRyb2lkOmF0dHIvdGV4dEFwcGVhcmFuY2VTbWFsbCIKKyAgICAgICAgICAgIGFuZHJvaWQ6dGV4dENvbG9yPSJAY29sb3Ivd2hpdGUiCisgICAgICAgICAgICAgICAvPgorCisgICAgICAgIDwhLS0gZW1lcmdlbmN5IGNhbGwgYnV0dG9uIHNob3duIHdoZW4gc2ltIGlzIFBVS2QgYW5kIHRhYl9zZWxlY3RvciBpcworICAgICAgICAgICAgIGhpZGRlbiAtLT4KKyAgICAgICAgPEJ1dHRvbgorICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9lbWVyZ2VuY3lDYWxsQnV0dG9uIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDpkcmF3YWJsZUxlZnQ9IkBkcmF3YWJsZS9pY19lbWVyZ2VuY3kiCisgICAgICAgICAgICBzdHlsZT0iQHN0eWxlL1dpZGdldC5CdXR0b24uVHJhbnNwYXJlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmRyYXdhYmxlUGFkZGluZz0iOGRpcCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpblJpZ2h0PSI4MGRpcCIKKyAgICAgICAgICAgIGFuZHJvaWQ6dmlzaWJpbGl0eT0iZ29uZSIKKyAgICAgICAgICAgIC8+CisKKyAgICA8L0xpbmVhckxheW91dD4KKzwvTGluZWFyTGF5b3V0PgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2xheW91dC14bGFyZ2Uva2V5Z3VhcmRfc2NyZWVuX3VubG9ja19sYW5kc2NhcGUueG1sIGIvY29yZS9yZXMvcmVzL2xheW91dC14bGFyZ2Uva2V5Z3VhcmRfc2NyZWVuX3VubG9ja19sYW5kc2NhcGUueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQyNjM2YWQKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvbGF5b3V0LXhsYXJnZS9rZXlndWFyZF9zY3JlZW5fdW5sb2NrX2xhbmRzY2FwZS54bWwKQEAgLTAsMCArMSwxMDYgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tCisqKgorKiogQ29weXJpZ2h0IDIwMDgsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoqCisqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKQorKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqKgorKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKioKKyoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKy0tPgorCis8IS0tIFRoaXMgaXMgdGhlIHNjcmVlbiB0aGF0IHNob3dzIHRoZSA5IGNpcmNsZSB1bmxvY2sgd2lkZ2V0IGFuZCBpbnN0cnVjdHMKKyAgICAgdGhlIHVzZXIgaG93IHRvIHVubG9jayB0aGVpciBkZXZpY2UsIG9yIG1ha2UgYW4gZW1lcmdlbmN5IGNhbGwuICBUaGlzCisgICAgIGlzIHRoZSBwb3J0cmFpdCBsYXlvdXQuICAtLT4KKworPGNvbS5hbmRyb2lkLmludGVybmFsLndpZGdldC5MaW5lYXJMYXlvdXRXaXRoRGVmYXVsdFRvdWNoUmVjZXBpZW50CisgICAgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgIGFuZHJvaWQ6b3JpZW50YXRpb249Imhvcml6b250YWwiCisgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgPgorCisgICAgPCEtLSBsZWZ0IHNpZGU6IHN0YXR1cyBhbmQgZW1lcmdlbmN5IGNhbGwgYnV0dG9uIC0tPgorICAgIDxMaW5lYXJMYXlvdXQKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0ibWF0Y2hfcGFyZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2VpZ2h0PSIxIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IjBkaXAiCisgICAgICAgICAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJ2ZXJ0aWNhbCIKKyAgICAgICAgICAgIGFuZHJvaWQ6Z3Jhdml0eT0iY2VudGVyX3ZlcnRpY2FsIgorICAgICAgICAgICAgICAgID4KKyAgICAgICAgCisgICAgICAgIDxpbmNsdWRlIGxheW91dD0iQGxheW91dC9rZXlndWFyZF9zY3JlZW5fc3RhdHVzX2xhbmQiIC8+CisKKyAgICAgICAgPCEtLSBmb290ZXIgLS0+CisgICAgICAgIDxGcmFtZUxheW91dAorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luTGVmdD0iMTQwZGlwIgorICAgICAgICAgICAgPgorCisgICAgICAgICAgICA8IS0tIG9wdGlvbiAxOiBhIHNpbmdsZSBlbWVyZ2VuY3kgY2FsbCBidXR0b24gLS0+CisgICAgICAgICAgICA8UmVsYXRpdmVMYXlvdXQgYW5kcm9pZDppZD0iQCtpZC9mb290ZXJOb3JtYWwiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmdyYXZpdHk9ImxlZnQiCisgICAgICAgICAgICAgICAgPgorICAgICAgICAgICAgICAgIDxCdXR0b24gYW5kcm9pZDppZD0iQCtpZC9lbWVyZ2VuY3lDYWxsQWxvbmUiCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvbG9ja3NjcmVlbl9lbWVyZ2VuY3lfY2FsbCIKKyAgICAgICAgICAgICAgICAgICAgc3R5bGU9IkBzdHlsZS9XaWRnZXQuQnV0dG9uLlRyYW5zcGFyZW50IgorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmRyYXdhYmxlTGVmdD0iQGRyYXdhYmxlL2ljX2VtZXJnZW5jeSIKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpkcmF3YWJsZVBhZGRpbmc9IjhkaXAiCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dmlzaWJpbGl0eT0iZ29uZSIKKyAgICAgICAgICAgICAgICAgICAgLz4KKyAgICAgICAgICAgIDwvUmVsYXRpdmVMYXlvdXQ+CisKKyAgICAgICAgICAgIDwhLS0gb3B0aW9uIDI6IGFuIGVtZXJnZW5jeSBjYWxsIGJ1dHRvbiwgYW5kIGEgJ2ZvcmdvdCBwYXR0ZXJuPycgYnV0dG9uIC0tPgorICAgICAgICAgICAgPExpbmVhckxheW91dCBhbmRyb2lkOmlkPSJAK2lkL2Zvb3RlckZvcmdvdFBhdHRlcm4iCisgICAgICAgICAgICAgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0idmVydGljYWwiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmdyYXZpdHk9ImxlZnQiCisgICAgICAgICAgICAgICAgPgorICAgICAgICAgICAgICAgIDxCdXR0b24gYW5kcm9pZDppZD0iQCtpZC9mb3Jnb3RQYXR0ZXJuIgorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICAgICAgc3R5bGU9IkBzdHlsZS9XaWRnZXQuQnV0dG9uLlRyYW5zcGFyZW50IgorICAgICAgICAgICAgICAgICAgICAvPgorICAgICAgICAgICAgICAgIDxCdXR0b24gYW5kcm9pZDppZD0iQCtpZC9lbWVyZ2VuY3lDYWxsVG9nZXRoZXIiCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvbG9ja3NjcmVlbl9lbWVyZ2VuY3lfY2FsbCIKKyAgICAgICAgICAgICAgICAgICAgc3R5bGU9IkBzdHlsZS9XaWRnZXQuQnV0dG9uLlRyYW5zcGFyZW50IgorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmRyYXdhYmxlTGVmdD0iQGRyYXdhYmxlL2ljX2VtZXJnZW5jeSIKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpkcmF3YWJsZVBhZGRpbmc9IjhkaXAiCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dmlzaWJpbGl0eT0iZ29uZSIKKyAgICAgICAgICAgICAgICAgICAgLz4KKyAgICAgICAgICAgIDwvTGluZWFyTGF5b3V0PgorICAgICAgICA8L0ZyYW1lTGF5b3V0PgorICAgIDwvTGluZWFyTGF5b3V0PgorCisgICAgPCEtLSByaWdodCBzaWRlOiBsb2NrIHBhdHRlcm4gLS0+CisgICAgPExpbmVhckxheW91dAorICAgICAgICBhbmRyb2lkOmxheW91dF93ZWlnaHQ9IjEiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSIwZGlwIgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJjZW50ZXIiCisgICAgICAgID4KKyAgICAgICAgPGNvbS5hbmRyb2lkLmludGVybmFsLndpZGdldC5Mb2NrUGF0dGVyblZpZXcgYW5kcm9pZDppZD0iQCtpZC9sb2NrUGF0dGVybiIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSIzNTBkaXAiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IjM1MGRpcCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpblRvcD0iOTBkaXAiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5SaWdodD0iOTBkaXAiCisgICAgICAgICAgLz4KKyAgICA8L0xpbmVhckxheW91dD4KKworPC9jb20uYW5kcm9pZC5pbnRlcm5hbC53aWRnZXQuTGluZWFyTGF5b3V0V2l0aERlZmF1bHRUb3VjaFJlY2VwaWVudD4KZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9sYXlvdXQteGxhcmdlL2tleWd1YXJkX3NjcmVlbl91bmxvY2tfcG9ydHJhaXQueG1sIGIvY29yZS9yZXMvcmVzL2xheW91dC14bGFyZ2Uva2V5Z3VhcmRfc2NyZWVuX3VubG9ja19wb3J0cmFpdC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWVlZDc5YgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9sYXlvdXQteGxhcmdlL2tleWd1YXJkX3NjcmVlbl91bmxvY2tfcG9ydHJhaXQueG1sCkBAIC0wLDAgKzEsMTAyIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLQorKioKKyoqIENvcHlyaWdodCAyMDA4LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqKgorKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIikKKyoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKioKKyoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoqCisqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCistLT4KKworPGNvbS5hbmRyb2lkLmludGVybmFsLndpZGdldC5MaW5lYXJMYXlvdXRXaXRoRGVmYXVsdFRvdWNoUmVjZXBpZW50CisgICAgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgIGFuZHJvaWQ6b3JpZW50YXRpb249InZlcnRpY2FsIgorICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJtYXRjaF9wYXJlbnQiCisgICAgICAgID4KKworICAgIDwhLS0gbGVmdCBzaWRlOiBzdGF0dXMgYW5kIGVtZXJnZW5jeSBjYWxsIGJ1dHRvbiAtLT4KKyAgICA8TGluZWFyTGF5b3V0CisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IjBkaXAiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93ZWlnaHQ9IjEiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICAgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0idmVydGljYWwiCisgICAgICAgICAgICBhbmRyb2lkOmdyYXZpdHk9ImNlbnRlcl92ZXJ0aWNhbCIKKyAgICAgICAgICAgICAgICA+CisgICAgICAgIAorICAgICAgICA8aW5jbHVkZSBsYXlvdXQ9IkBsYXlvdXQva2V5Z3VhcmRfc2NyZWVuX3N0YXR1c19wb3J0IiAvPgorCisgICAgICAgIDwhLS0gZm9vdGVyIC0tPgorICAgICAgICA8RnJhbWVMYXlvdXQKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpbkxlZnQ9IjE0MGRpcCIKKyAgICAgICAgICAgID4KKworICAgICAgICAgICAgPCEtLSBvcHRpb24gMTogYSBzaW5nbGUgZW1lcmdlbmN5IGNhbGwgYnV0dG9uIC0tPgorICAgICAgICAgICAgPFJlbGF0aXZlTGF5b3V0IGFuZHJvaWQ6aWQ9IkAraWQvZm9vdGVyTm9ybWFsIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJsZWZ0IgorICAgICAgICAgICAgICAgID4KKyAgICAgICAgICAgICAgICA8QnV0dG9uIGFuZHJvaWQ6aWQ9IkAraWQvZW1lcmdlbmN5Q2FsbEFsb25lIgorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL2xvY2tzY3JlZW5fZW1lcmdlbmN5X2NhbGwiCisgICAgICAgICAgICAgICAgICAgIHN0eWxlPSJAc3R5bGUvV2lkZ2V0LkJ1dHRvbi5UcmFuc3BhcmVudCIKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpkcmF3YWJsZUxlZnQ9IkBkcmF3YWJsZS9pY19lbWVyZ2VuY3kiCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6ZHJhd2FibGVQYWRkaW5nPSI4ZGlwIgorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnZpc2liaWxpdHk9ImdvbmUiCisgICAgICAgICAgICAgICAgICAgIC8+CisgICAgICAgICAgICA8L1JlbGF0aXZlTGF5b3V0PgorCisgICAgICAgICAgICA8IS0tIG9wdGlvbiAyOiBhbiBlbWVyZ2VuY3kgY2FsbCBidXR0b24sIGFuZCBhICdmb3Jnb3QgcGF0dGVybj8nIGJ1dHRvbiAtLT4KKyAgICAgICAgICAgIDxMaW5lYXJMYXlvdXQgYW5kcm9pZDppZD0iQCtpZC9mb290ZXJGb3Jnb3RQYXR0ZXJuIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6b3JpZW50YXRpb249InZlcnRpY2FsIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJsZWZ0IgorICAgICAgICAgICAgICAgID4KKyAgICAgICAgICAgICAgICA8QnV0dG9uIGFuZHJvaWQ6aWQ9IkAraWQvZm9yZ290UGF0dGVybiIKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgICAgIHN0eWxlPSJAc3R5bGUvV2lkZ2V0LkJ1dHRvbi5UcmFuc3BhcmVudCIKKyAgICAgICAgICAgICAgICAgICAgLz4KKyAgICAgICAgICAgICAgICA8QnV0dG9uIGFuZHJvaWQ6aWQ9IkAraWQvZW1lcmdlbmN5Q2FsbFRvZ2V0aGVyIgorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL2xvY2tzY3JlZW5fZW1lcmdlbmN5X2NhbGwiCisgICAgICAgICAgICAgICAgICAgIHN0eWxlPSJAc3R5bGUvV2lkZ2V0LkJ1dHRvbi5UcmFuc3BhcmVudCIKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpkcmF3YWJsZUxlZnQ9IkBkcmF3YWJsZS9pY19lbWVyZ2VuY3kiCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6ZHJhd2FibGVQYWRkaW5nPSI4ZGlwIgorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnZpc2liaWxpdHk9ImdvbmUiCisgICAgICAgICAgICAgICAgICAgIC8+CisgICAgICAgICAgICA8L0xpbmVhckxheW91dD4KKyAgICAgICAgPC9GcmFtZUxheW91dD4KKyAgICA8L0xpbmVhckxheW91dD4KKworICAgIDwhLS0gcmlnaHQgc2lkZTogbG9jayBwYXR0ZXJuIC0tPgorICAgIDxMaW5lYXJMYXlvdXQKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2VpZ2h0PSIxIgorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IjBkaXAiCisgICAgICAgIGFuZHJvaWQ6Z3Jhdml0eT0iY2VudGVyIgorICAgICAgICA+CisgICAgICAgIDxjb20uYW5kcm9pZC5pbnRlcm5hbC53aWRnZXQuTG9ja1BhdHRlcm5WaWV3IGFuZHJvaWQ6aWQ9IkAraWQvbG9ja1BhdHRlcm4iCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iMzUwZGlwIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSIzNTBkaXAiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5Ub3A9IjUwZGlwIgorICAgICAgICAgIC8+CisgICAgPC9MaW5lYXJMYXlvdXQ+CisKKzwvY29tLmFuZHJvaWQuaW50ZXJuYWwud2lkZ2V0LkxpbmVhckxheW91dFdpdGhEZWZhdWx0VG91Y2hSZWNlcGllbnQ+CisKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9sYXlvdXQteGxhcmdlL3NjcmVlbl9hY3Rpb25fYmFyLnhtbCBiL2NvcmUvcmVzL3Jlcy9sYXlvdXQteGxhcmdlL3NjcmVlbl9hY3Rpb25fYmFyLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNDAyNTU2Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2xheW91dC14bGFyZ2Uvc2NyZWVuX2FjdGlvbl9iYXIueG1sCkBAIC0wLDAgKzEsNDYgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzwhLS0KK1RoaXMgaXMgYW4gb3B0aW1pemVkIGxheW91dCBmb3IgYSBzY3JlZW4gd2l0aCB0aGUgQWN0aW9uIEJhciBlbmFibGVkLgorLS0+CisKKzxMaW5lYXJMYXlvdXQgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgIGFuZHJvaWQ6b3JpZW50YXRpb249InZlcnRpY2FsIgorICAgIGFuZHJvaWQ6Zml0c1N5c3RlbVdpbmRvd3M9InRydWUiPgorICAgIDxWaWV3QW5pbWF0b3IgYW5kcm9pZDppZD0iQCtpZC9hY3Rpb25fYmFyX2FuaW1hdG9yIgorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgYW5kcm9pZDppbkFuaW1hdGlvbj0iQGFuaW0vcHVzaF9kb3duX2luX25vX2FscGhhIgorICAgICAgICBhbmRyb2lkOm91dEFuaW1hdGlvbj0iQGFuaW0vcHVzaF9kb3duX291dF9ub19hbHBoYSI+CisgICAgICAgIDxjb20uYW5kcm9pZC5pbnRlcm5hbC53aWRnZXQuQWN0aW9uQmFyVmlldworICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9hY3Rpb25fYmFyIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgc3R5bGU9Ij9hbmRyb2lkOmF0dHIvYWN0aW9uQmFyU3R5bGUiIC8+CisgICAgICAgIDxjb20uYW5kcm9pZC5pbnRlcm5hbC53aWRnZXQuQWN0aW9uQmFyQ29udGV4dFZpZXcKKyAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvYWN0aW9uX2NvbnRleHRfYmFyIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgc3R5bGU9Ij9hbmRyb2lkOmF0dHIvYWN0aW9uTW9kZVN0eWxlIiAvPgorICAgIDwvVmlld0FuaW1hdG9yPgorICAgIDxGcmFtZUxheW91dCBhbmRyb2lkOmlkPSJAYW5kcm9pZDppZC9jb250ZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IjBkaXAiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dlaWdodD0iMSIKKyAgICAgICAgYW5kcm9pZDpmb3JlZ3JvdW5kR3Jhdml0eT0iZmlsbF9ob3Jpem9udGFsfHRvcCIKKyAgICAgICAgYW5kcm9pZDpmb3JlZ3JvdW5kPSI/YW5kcm9pZDphdHRyL3dpbmRvd0NvbnRlbnRPdmVybGF5IiAvPgorPC9MaW5lYXJMYXlvdXQ+CmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvbGF5b3V0LXhsYXJnZS9zY3JlZW5fYWN0aW9uX2Jhcl9vdmVybGF5LnhtbCBiL2NvcmUvcmVzL3Jlcy9sYXlvdXQteGxhcmdlL3NjcmVlbl9hY3Rpb25fYmFyX292ZXJsYXkueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFmMDUxYWUKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvbGF5b3V0LXhsYXJnZS9zY3JlZW5fYWN0aW9uX2Jhcl9vdmVybGF5LnhtbApAQCAtMCwwICsxLDQ5IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8IS0tCitUaGlzIGlzIGFuIG9wdGltaXplZCBsYXlvdXQgZm9yIGEgc2NyZWVuIHdpdGgKK3RoZSBBY3Rpb24gQmFyIGVuYWJsZWQgb3ZlcmxheWluZyBhcHBsaWNhdGlvbiBjb250ZW50LgorLS0+CisKKzxSZWxhdGl2ZUxheW91dCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgYW5kcm9pZDpmaXRzU3lzdGVtV2luZG93cz0idHJ1ZSI+CisgICAgPEZyYW1lTGF5b3V0IGFuZHJvaWQ6aWQ9IkBhbmRyb2lkOmlkL2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0ibWF0Y2hfcGFyZW50IiAvPgorICAgIDxWaWV3QW5pbWF0b3IgYW5kcm9pZDppZD0iQCtpZC9hY3Rpb25fYmFyX2FuaW1hdG9yIgorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJ0b3AiCisgICAgICAgIGFuZHJvaWQ6aW5BbmltYXRpb249IkBhbmltL3B1c2hfZG93bl9pbl9ub19hbHBoYSIKKyAgICAgICAgYW5kcm9pZDpvdXRBbmltYXRpb249IkBhbmltL3B1c2hfZG93bl9vdXRfbm9fYWxwaGEiPgorICAgICAgICA8Y29tLmFuZHJvaWQuaW50ZXJuYWwud2lkZ2V0LkFjdGlvbkJhclZpZXcKKyAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvYWN0aW9uX2JhciIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIHN0eWxlPSI/YW5kcm9pZDphdHRyL2FjdGlvbkJhclN0eWxlIiAvPgorICAgICAgICA8Y29tLmFuZHJvaWQuaW50ZXJuYWwud2lkZ2V0LkFjdGlvbkJhckNvbnRleHRWaWV3CisgICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL2FjdGlvbl9jb250ZXh0X2JhciIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIHN0eWxlPSI/YW5kcm9pZDphdHRyL2FjdGlvbk1vZGVTdHlsZSIgLz4KKyAgICA8L1ZpZXdBbmltYXRvcj4KKyAgICA8SW1hZ2VWaWV3IGFuZHJvaWQ6c3JjPSI/YW5kcm9pZDphdHRyL3dpbmRvd0NvbnRlbnRPdmVybGF5IgorICAgICAgICAgICAgICAgYW5kcm9pZDpzY2FsZVR5cGU9ImZpdFhZIgorICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfYmVsb3c9IkBpZC9hY3Rpb25fYmFyX2FuaW1hdG9yIiAvPgorPC9SZWxhdGl2ZUxheW91dD4KZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9sYXlvdXQteGxhcmdlL3N0YXR1c19iYXJfbGF0ZXN0X2V2ZW50X2NvbnRlbnQueG1sIGIvY29yZS9yZXMvcmVzL2xheW91dC14bGFyZ2Uvc3RhdHVzX2Jhcl9sYXRlc3RfZXZlbnRfY29udGVudC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzY0YjkwZQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9sYXlvdXQteGxhcmdlL3N0YXR1c19iYXJfbGF0ZXN0X2V2ZW50X2NvbnRlbnQueG1sCkBAIC0wLDAgKzEsNTYgQEAKKzxMaW5lYXJMYXlvdXQgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0idmVydGljYWwiCisgICAgICAgIGFuZHJvaWQ6cGFkZGluZ1RvcD0iN2RwIgorICAgICAgICBhbmRyb2lkOnBhZGRpbmdMZWZ0PSI1ZHAiCisgICAgICAgID4KKworICAgIDxMaW5lYXJMYXlvdXQKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6b3JpZW50YXRpb249Imhvcml6b250YWwiCisgICAgICAgIGFuZHJvaWQ6cGFkZGluZ1RvcD0iM2RwIgorICAgICAgICA+CisgICAgICAgIDwhLS1jb20uYW5kcm9pZC5zZXJ2ZXIuc3RhdHVzLkFuaW1hdGVkSW1hZ2VWaWV3IGFuZHJvaWQ6aWQ9IkAraWQvaWNvbiIgLS0+CisgICAgICAgIDxJbWFnZVZpZXcgYW5kcm9pZDppZD0iQCtpZC9pY29uIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IjI1ZHAiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IjI1ZHAiCisgICAgICAgICAgICBhbmRyb2lkOnNjYWxlVHlwZT0iZml0Q2VudGVyIgorICAgICAgICAgICAgYW5kcm9pZDpzcmM9IkBkcmF3YWJsZS9hcnJvd19kb3duX2Zsb2F0Ii8+CisgICAgICAgIDxUZXh0VmlldyBhbmRyb2lkOmlkPSJAK2lkL3RpdGxlIgorICAgICAgICAgICAgYW5kcm9pZDp0ZXh0QXBwZWFyYW5jZT0iQHN0eWxlL1RleHRBcHBlYXJhbmNlLlN0YXR1c0Jhci5FdmVudENvbnRlbnQuVGl0bGUiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93ZWlnaHQ9IjEiCisgICAgICAgICAgICBhbmRyb2lkOnNpbmdsZUxpbmU9InRydWUiCisgICAgICAgICAgICBhbmRyb2lkOmVsbGlwc2l6ZT0ibWFycXVlZSIKKyAgICAgICAgICAgIGFuZHJvaWQ6ZmFkaW5nRWRnZT0iaG9yaXpvbnRhbCIKKyAgICAgICAgICAgIGFuZHJvaWQ6cGFkZGluZ0xlZnQ9IjRkcCIKKyAgICAgICAgICAgIC8+CisgICAgPC9MaW5lYXJMYXlvdXQ+CisgICAgPExpbmVhckxheW91dAorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0iaG9yaXpvbnRhbCIKKyAgICAgICAgPgorICAgICAgICA8VGV4dFZpZXcgYW5kcm9pZDppZD0iQCtpZC90ZXh0IgorICAgICAgICAgICAgYW5kcm9pZDp0ZXh0QXBwZWFyYW5jZT0iQHN0eWxlL1RleHRBcHBlYXJhbmNlLlN0YXR1c0Jhci5FdmVudENvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93ZWlnaHQ9IjEiCisgICAgICAgICAgICBhbmRyb2lkOnNpbmdsZUxpbmU9InRydWUiCisgICAgICAgICAgICBhbmRyb2lkOmVsbGlwc2l6ZT0ibWFycXVlZSIKKyAgICAgICAgICAgIGFuZHJvaWQ6ZmFkaW5nRWRnZT0iaG9yaXpvbnRhbCIKKyAgICAgICAgICAgIGFuZHJvaWQ6cGFkZGluZ0xlZnQ9IjRkcCIKKyAgICAgICAgICAgIC8+CisgICAgICAgIDxhbmRyb2lkLndpZGdldC5EYXRlVGltZVZpZXcgYW5kcm9pZDppZD0iQCtpZC90aW1lIgorICAgICAgICAgICAgYW5kcm9pZDp0ZXh0QXBwZWFyYW5jZT0iQHN0eWxlL1RleHRBcHBlYXJhbmNlLlN0YXR1c0Jhci5FdmVudENvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5MZWZ0PSI0ZHAiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOnNpbmdsZUxpbmU9InRydWUiCisgICAgICAgICAgICBhbmRyb2lkOnBhZGRpbmdSaWdodD0iNWRwIgorICAgICAgICAgICAgLz4KKyAgICA8L0xpbmVhckxheW91dD4KKzwvTGluZWFyTGF5b3V0PgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2xheW91dC9hY3Rpb25fYmFyX3RpdGxlX2l0ZW0ueG1sIGIvY29yZS9yZXMvcmVzL2xheW91dC9hY3Rpb25fYmFyX3RpdGxlX2l0ZW0ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM4NjQ5ODEKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvbGF5b3V0L2FjdGlvbl9iYXJfdGl0bGVfaXRlbS54bWwKQEAgLTAsMCArMSwzMSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAgCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgIAorICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzxMaW5lYXJMYXlvdXQgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0idmVydGljYWwiID4KKyAgICA8VGV4dFZpZXcgYW5kcm9pZDppZD0iQCtpZC9hY3Rpb25fYmFyX3RpdGxlIgorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgYW5kcm9pZDpzaW5nbGVMaW5lPSJ0cnVlIgorICAgICAgICBhbmRyb2lkOmVsbGlwc2l6ZT0iZW5kIiAvPgorICAgIDxUZXh0VmlldyBhbmRyb2lkOmlkPSJAK2lkL2FjdGlvbl9iYXJfc3VidGl0bGUiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICBhbmRyb2lkOnNpbmdsZUxpbmU9InRydWUiCisgICAgICAgIGFuZHJvaWQ6ZWxsaXBzaXplPSJlbmQiIC8+Cis8L0xpbmVhckxheW91dD4KZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9sYXlvdXQvYWN0aW9uX21lbnVfaXRlbV9sYXlvdXQueG1sIGIvY29yZS9yZXMvcmVzL2xheW91dC9hY3Rpb25fbWVudV9pdGVtX2xheW91dC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGQzY2NlNQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9sYXlvdXQvYWN0aW9uX21lbnVfaXRlbV9sYXlvdXQueG1sCkBAIC0wLDAgKzEsMjkgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgIAorICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8Y29tLmFuZHJvaWQuaW50ZXJuYWwudmlldy5tZW51LkFjdGlvbk1lbnVJdGVtVmlldyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIgPgorICAgIDxJbWFnZUJ1dHRvbiBhbmRyb2lkOmlkPSJAK2lkL2ltYWdlQnV0dG9uIgorICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICAgYW5kcm9pZDp2aXNpYmlsaXR5PSJnb25lIgorICAgICAgICAgICAgICAgICBzdHlsZT0iP2F0dHIvYWN0aW9uQnV0dG9uU3R5bGUiIC8+CisgICAgPEJ1dHRvbiBhbmRyb2lkOmlkPSJAK2lkL3RleHRCdXR0b24iCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOnZpc2liaWxpdHk9ImdvbmUiIC8+Cis8L2NvbS5hbmRyb2lkLmludGVybmFsLnZpZXcubWVudS5BY3Rpb25NZW51SXRlbVZpZXc+CmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvbGF5b3V0L2FjdGlvbl9tZW51X2xheW91dC54bWwgYi9jb3JlL3Jlcy9yZXMvbGF5b3V0L2FjdGlvbl9tZW51X2xheW91dC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMThkNTUzMQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9sYXlvdXQvYWN0aW9uX21lbnVfbGF5b3V0LnhtbApAQCAtMCwwICsxLDIwIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICAKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPGNvbS5hbmRyb2lkLmludGVybmFsLnZpZXcubWVudS5BY3Rpb25NZW51VmlldworICAgICB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IiAvPgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2xheW91dC9hY3Rpb25fbW9kZV9iYXIueG1sIGIvY29yZS9yZXMvcmVzL2xheW91dC9hY3Rpb25fbW9kZV9iYXIueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRjMDlmZGMKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvbGF5b3V0L2FjdGlvbl9tb2RlX2Jhci54bWwKQEAgLTAsMCArMSwyNCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0KKy8qCisqKiBDb3B5cmlnaHQgMjAxMCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKioKKyoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqKgorKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKioKKyoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKy0tPgorPGNvbS5hbmRyb2lkLmludGVybmFsLndpZGdldC5BY3Rpb25CYXJDb250ZXh0VmlldworICAgICB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICBhbmRyb2lkOnZpc2liaWxpdHk9ImdvbmUiCisgICAgIHN0eWxlPSI/YW5kcm9pZDphdHRyL2FjdGlvbk1vZGVTdHlsZSIgLz4KZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9sYXlvdXQvYWxlcnRfZGlhbG9nLnhtbCBiL2NvcmUvcmVzL3Jlcy9sYXlvdXQvYWxlcnRfZGlhbG9nLnhtbAppbmRleCAyNWE0MWY4Li5iNzQ2ZDI4IDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvbGF5b3V0L2FsZXJ0X2RpYWxvZy54bWwKKysrIGIvY29yZS9yZXMvcmVzL2xheW91dC9hbGVydF9kaWFsb2cueG1sCkBAIC04MCw4ICs4MCw3IEBACiAgICAgICAgICAgICBhbmRyb2lkOnBhZGRpbmdUb3A9IjJkaXAiCiAgICAgICAgICAgICBhbmRyb2lkOnBhZGRpbmdCb3R0b209IjEyZGlwIgogICAgICAgICAgICAgYW5kcm9pZDpwYWRkaW5nTGVmdD0iMTRkaXAiCi0gICAgICAgICAgICBhbmRyb2lkOnBhZGRpbmdSaWdodD0iMTBkaXAiCi0gICAgICAgICAgICBhbmRyb2lkOm92ZXJzY3JvbGxNb2RlPSJpZkNvbnRlbnRTY3JvbGxzIj4KKyAgICAgICAgICAgIGFuZHJvaWQ6cGFkZGluZ1JpZ2h0PSIxMGRpcCI+CiAgICAgICAgICAgICA8VGV4dFZpZXcgYW5kcm9pZDppZD0iQCtpZC9tZXNzYWdlIgogICAgICAgICAgICAgICAgIHN0eWxlPSI/YW5kcm9pZDphdHRyL3RleHRBcHBlYXJhbmNlTWVkaXVtIgogICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCkBAIC0xMTMsNyArMTEyLDcgQEAKICAgICAgICAgICAgIGFuZHJvaWQ6cGFkZGluZ1RvcD0iNGRpcCIKICAgICAgICAgICAgIGFuZHJvaWQ6cGFkZGluZ0xlZnQ9IjJkaXAiCiAgICAgICAgICAgICBhbmRyb2lkOnBhZGRpbmdSaWdodD0iMmRpcCIKLSAgICAgICAgICAgIGFuZHJvaWQ6dXNlTGFyZ2VzdENoaWxkPSJ0cnVlIj4KKyAgICAgICAgICAgIGFuZHJvaWQ6bWVhc3VyZVdpdGhMYXJnZXN0Q2hpbGQ9InRydWUiPgogICAgICAgICAgICAgPExpbmVhckxheW91dCBhbmRyb2lkOmlkPSJAK2lkL2xlZnRTcGFjZXIiCiAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2VpZ2h0PSIwLjI1IgogICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSIwZGlwIgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2xheW91dC9jb250YWN0X2hlYWRlci54bWwgYi9jb3JlL3Jlcy9yZXMvbGF5b3V0L2NvbnRhY3RfaGVhZGVyLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmY0NjdkMy4uMDAwMDAwMAotLS0gYS9jb3JlL3Jlcy9yZXMvbGF5b3V0L2NvbnRhY3RfaGVhZGVyLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDExNiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPCEtLSBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08TGluZWFyTGF5b3V0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICBhbmRyb2lkOmlkPSJAK2lkL2Jhbm5lciIKLSAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgotICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0ibWF0Y2hfcGFyZW50IgotICAgIGFuZHJvaWQ6b3JpZW50YXRpb249Imhvcml6b250YWwiCi0gICAgYW5kcm9pZDpiYWNrZ3JvdW5kPSJAZHJhd2FibGUvdGl0bGVfYmFyX21lZGl1bSIKLSAgICBhbmRyb2lkOnBhZGRpbmdSaWdodD0iNWRpcCI+Ci0KLSAgICA8YW5kcm9pZC53aWRnZXQuUXVpY2tDb250YWN0QmFkZ2UgYW5kcm9pZDppZD0iQCtpZC9waG90byIKLSAgICAgICAgYW5kcm9pZDpsYXlvdXRfZ3Jhdml0eT0iY2VudGVyX3ZlcnRpY2FsIgotICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5SaWdodD0iOGRpcCIKLSAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luTGVmdD0iLTFkaXAiCi0gICAgICAgIHN0eWxlPSJAKmFuZHJvaWQ6c3R5bGUvV2lkZ2V0LlF1aWNrQ29udGFjdEJhZGdlLldpbmRvd1NtYWxsIiAvPgotICAgIC8+Ci0KLSAgICA8TGluZWFyTGF5b3V0Ci0gICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSIwZGlwIgotICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKLSAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2VpZ2h0PSIxIgotICAgICAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJ2ZXJ0aWNhbCIKLSAgICAgICAgYW5kcm9pZDpsYXlvdXRfZ3Jhdml0eT0iY2VudGVyX3ZlcnRpY2FsIiA+Ci0KLSAgICAgICAgPExpbmVhckxheW91dAotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0iaG9yaXpvbnRhbCI+Ci0KLSAgICAgICAgICAgIDxJbWFnZVZpZXcKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL2FnZ3JlZ2F0ZV9iYWRnZSIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6cGFkZGluZ1JpZ2h0PSIzZGlwIgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6cGFkZGluZ1RvcD0iM2RpcCIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOnNyYz0iQGRyYXdhYmxlL2ljX2FnZ3JlZ2F0ZWQiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDp2aXNpYmlsaXR5PSJnb25lIgotICAgICAgICAgICAgLz4KLQotICAgICAgICAgICAgPFRleHRWaWV3IGFuZHJvaWQ6aWQ9IkAraWQvbmFtZSIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6c2luZ2xlTGluZT0idHJ1ZSIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmVsbGlwc2l6ZT0iZW5kIgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dEFwcGVhcmFuY2U9Ij9hbmRyb2lkOmF0dHIvdGV4dEFwcGVhcmFuY2VNZWRpdW0iCi0gICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0U3R5bGU9ImJvbGQiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpzaGFkb3dDb2xvcj0iI0JCMDAwMDAwIgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6c2hhZG93UmFkaXVzPSIyLjc1IgotICAgICAgICAgICAgICAgIC8+Ci0gICAgICAgIDwvTGluZWFyTGF5b3V0PgotCi0gICAgICAgIDxUZXh0VmlldyBhbmRyb2lkOmlkPSJAK2lkL3Bob25ldGljX25hbWUiCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICBhbmRyb2lkOnRleHRBcHBlYXJhbmNlPSI/YW5kcm9pZDphdHRyL3RleHRBcHBlYXJhbmNlU21hbGwiCi0gICAgICAgICAgICBhbmRyb2lkOnNpbmdsZUxpbmU9InRydWUiCi0gICAgICAgICAgICBhbmRyb2lkOmVsbGlwc2l6ZT0iZW5kIgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luVG9wPSItMmRpcCIKLSAgICAgICAgICAgIGFuZHJvaWQ6dmlzaWJpbGl0eT0iZ29uZSIKLSAgICAgICAgLz4KLQotICAgICAgICA8VGV4dFZpZXcgYW5kcm9pZDppZD0iQCtpZC9zdGF0dXMiCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICBhbmRyb2lkOnRleHRBcHBlYXJhbmNlPSI/YW5kcm9pZDphdHRyL3RleHRBcHBlYXJhbmNlU21hbGwiCi0gICAgICAgICAgICBhbmRyb2lkOnNpbmdsZUxpbmU9InRydWUiCi0gICAgICAgICAgICBhbmRyb2lkOmVsbGlwc2l6ZT0iZW5kIgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luVG9wPSItMmRpcCIKLSAgICAgICAgICAgIGFuZHJvaWQ6dmlzaWJpbGl0eT0iZ29uZSIKLSAgICAgICAgLz4KLQotICAgICAgICA8VGV4dFZpZXcgYW5kcm9pZDppZD0iQCtpZC9zdGF0dXNfZGF0ZSIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IjBkaXAiCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF93ZWlnaHQ9IjEiCi0gICAgICAgICAgICBhbmRyb2lkOnRleHRBcHBlYXJhbmNlPSI/YW5kcm9pZDphdHRyL3RleHRBcHBlYXJhbmNlU21hbGwiCi0gICAgICAgICAgICBhbmRyb2lkOnRleHRTaXplPSIxMnNwIgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luVG9wPSItMmRpcCIKLSAgICAgICAgICAgIGFuZHJvaWQ6dmlzaWJpbGl0eT0iZ29uZSIKLSAgICAgICAgLz4KLSAgICA8L0xpbmVhckxheW91dD4KLQotICAgIDxJbWFnZVZpZXcKLSAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9wcmVzZW5jZSIKLSAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKLSAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgIGFuZHJvaWQ6bGF5b3V0X2dyYXZpdHk9ImNlbnRlcl92ZXJ0aWNhbCIKLSAgICAgICAgYW5kcm9pZDpwYWRkaW5nTGVmdD0iM2RpcCIKLSAgICAgICAgYW5kcm9pZDpwYWRkaW5nUmlnaHQ9IjZkaXAiCi0gICAgICAgIGFuZHJvaWQ6dmlzaWJpbGl0eT0iZ29uZSIKLSAgICAvPgotCi0gICAgPENoZWNrQm94Ci0gICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvc3RhciIKLSAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKLSAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgIGFuZHJvaWQ6bGF5b3V0X2dyYXZpdHk9ImNlbnRlcl92ZXJ0aWNhbCIKLSAgICAgICAgYW5kcm9pZDp2aXNpYmlsaXR5PSJnb25lIgotICAgICAgICBhbmRyb2lkOmNvbnRlbnREZXNjcmlwdGlvbj0iQHN0cmluZy9kZXNjcmlwdGlvbl9zdGFyIgotICAgICAgICBzdHlsZT0iP2FuZHJvaWQ6YXR0ci9zdGFyU3R5bGUiIC8+Ci0KLTwvTGluZWFyTGF5b3V0PgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2xheW91dC9rZXlndWFyZF9zY3JlZW5fcGFzc3dvcmRfbGFuZHNjYXBlLnhtbCBiL2NvcmUvcmVzL3Jlcy9sYXlvdXQva2V5Z3VhcmRfc2NyZWVuX3Bhc3N3b3JkX2xhbmRzY2FwZS54bWwKaW5kZXggYWI2NzVjNy4uM2Q1MmY3MSAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL2xheW91dC9rZXlndWFyZF9zY3JlZW5fcGFzc3dvcmRfbGFuZHNjYXBlLnhtbAorKysgYi9jb3JlL3Jlcy9yZXMvbGF5b3V0L2tleWd1YXJkX3NjcmVlbl9wYXNzd29yZF9sYW5kc2NhcGUueG1sCkBAIC0yOCw3ICsyOCw3IEBACiAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgogICAgICAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJob3Jpem9udGFsIj4KICAgICAgICAgPCEtLSAiRW50ZXIgUElOKFBhc3N3b3JkKSB0byB1bmxvY2siIC0tPgotICAgICAgICA8VGV4dFZpZXcgYW5kcm9pZDppZD0iQCtpZC9lbnRlcl9wYXNzd29yZF9sYWJlbCIKKyAgICAgICAgPFRleHRWaWV3IGFuZHJvaWQ6aWQ9IkAraWQvc3RhdHVzMSIKICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSIwZGlwIgogICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCiAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93ZWlnaHQ9IjEiCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvbGF5b3V0L2tleWd1YXJkX3NjcmVlbl9wYXNzd29yZF9wb3J0cmFpdC54bWwgYi9jb3JlL3Jlcy9yZXMvbGF5b3V0L2tleWd1YXJkX3NjcmVlbl9wYXNzd29yZF9wb3J0cmFpdC54bWwKaW5kZXggOWVlODc4MS4uYWY4YTNlZiAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL2xheW91dC9rZXlndWFyZF9zY3JlZW5fcGFzc3dvcmRfcG9ydHJhaXQueG1sCisrKyBiL2NvcmUvcmVzL3Jlcy9sYXlvdXQva2V5Z3VhcmRfc2NyZWVuX3Bhc3N3b3JkX3BvcnRyYWl0LnhtbApAQCAtMjQsNyArMjQsNyBAQAogICAgIGFuZHJvaWQ6Z3Jhdml0eT0iY2VudGVyX2hvcml6b250YWwiPgogCiAgICAgPCEtLSAiRW50ZXIgUElOKFBhc3N3b3JkKSB0byB1bmxvY2siIC0tPgotICAgIDxUZXh0VmlldyBhbmRyb2lkOmlkPSJAK2lkL2VudGVyX3Bhc3N3b3JkX2xhYmVsIgorICAgIDxUZXh0VmlldyBhbmRyb2lkOmlkPSJAK2lkL3N0YXR1czEiCiAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCiAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgogICAgICAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJob3Jpem9udGFsIgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2xheW91dC9rZXlndWFyZF9zY3JlZW5fdW5sb2NrX2xhbmRzY2FwZS54bWwgYi9jb3JlL3Jlcy9yZXMvbGF5b3V0L2tleWd1YXJkX3NjcmVlbl91bmxvY2tfbGFuZHNjYXBlLnhtbAppbmRleCBjMWI0MDZmLi44MzM4MWExIDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvbGF5b3V0L2tleWd1YXJkX3NjcmVlbl91bmxvY2tfbGFuZHNjYXBlLnhtbAorKysgYi9jb3JlL3Jlcy9yZXMvbGF5b3V0L2tleWd1YXJkX3NjcmVlbl91bmxvY2tfbGFuZHNjYXBlLnhtbApAQCAtNTgsMTggKzU4LDE5IEBACiAgICAgICAgICAgICBhbmRyb2lkOmVsbGlwc2l6ZT0ibWFycXVlZSIKICAgICAgICAgICAgIGFuZHJvaWQ6Z3Jhdml0eT0icmlnaHR8Ym90dG9tIgogICAgICAgICAgICAgLz4KKwogICAgICAgICA8Y29tLmFuZHJvaWQuaW50ZXJuYWwud2lkZ2V0LkRpZ2l0YWxDbG9jayBhbmRyb2lkOmlkPSJAK2lkL3RpbWUiCiAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgogICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCiAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9hbGlnblBhcmVudFRvcD0idHJ1ZSIKICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2FsaWduUGFyZW50TGVmdD0idHJ1ZSIKICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpblRvcD0iOGRpcCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpbkJvdHRvbT0iOGRpcCIKICAgICAgICAgICAgID4KIAogICAgICAgICAgICAgPFRleHRWaWV3IGFuZHJvaWQ6aWQ9IkAraWQvdGltZURpc3BsYXkiCiAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmdyYXZpdHk9ImJvdHRvbSIKICAgICAgICAgICAgICAgICBhbmRyb2lkOnNpbmdsZUxpbmU9InRydWUiCiAgICAgICAgICAgICAgICAgYW5kcm9pZDplbGxpcHNpemU9Im5vbmUiCiAgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0U2l6ZT0iNzJzcCIKQEAgLTg0LDggKzg1LDkgQEAKIAogICAgICAgICAgICAgPFRleHRWaWV3IGFuZHJvaWQ6aWQ9IkAraWQvYW1fcG0iCiAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9Im1hdGNoX3BhcmVudCIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmdyYXZpdHk9ImJvdHRvbSIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF90b1JpZ2h0T2Y9IkBpZC90aW1lRGlzcGxheSIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9hbGlnbkJhc2VsaW5lPSJAaWQvdGltZURpc3BsYXkiCiAgICAgICAgICAgICAgICAgYW5kcm9pZDpzaW5nbGVMaW5lPSJ0cnVlIgogICAgICAgICAgICAgICAgIGFuZHJvaWQ6ZWxsaXBzaXplPSJub25lIgogICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dFNpemU9IjIyc3AiCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvbGF5b3V0L2tleWd1YXJkX3NjcmVlbl91bmxvY2tfcG9ydHJhaXQueG1sIGIvY29yZS9yZXMvcmVzL2xheW91dC9rZXlndWFyZF9zY3JlZW5fdW5sb2NrX3BvcnRyYWl0LnhtbAppbmRleCA3NGEwZWVlLi44ZGFjZmFmIDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvbGF5b3V0L2tleWd1YXJkX3NjcmVlbl91bmxvY2tfcG9ydHJhaXQueG1sCisrKyBiL2NvcmUvcmVzL3Jlcy9sYXlvdXQva2V5Z3VhcmRfc2NyZWVuX3VubG9ja19wb3J0cmFpdC54bWwKQEAgLTU1LDEyICs1NSwxMiBAQAogICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfYWxpZ25QYXJlbnRUb3A9InRydWUiCiAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5Ub3A9IjE1ZGlwIgogICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luTGVmdD0iMjBkaXAiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5Cb3R0b209IjhkaXAiCiAgICAgICAgICAgICA+CiAKICAgICAgICAgICAgIDxUZXh0VmlldyBhbmRyb2lkOmlkPSJAK2lkL3RpbWVEaXNwbGF5IgogICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCiAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJib3R0b20iCiAgICAgICAgICAgICAgICAgYW5kcm9pZDpzaW5nbGVMaW5lPSJ0cnVlIgogICAgICAgICAgICAgICAgIGFuZHJvaWQ6ZWxsaXBzaXplPSJub25lIgogICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dFNpemU9IjU2c3AiCkBAIC03NCw4ICs3NCw5IEBACiAKICAgICAgICAgICAgIDxUZXh0VmlldyBhbmRyb2lkOmlkPSJAK2lkL2FtX3BtIgogICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJtYXRjaF9wYXJlbnQiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJib3R0b20iCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfdG9SaWdodE9mPSJAaWQvdGltZURpc3BsYXkiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfYWxpZ25CYXNlbGluZT0iQGlkL3RpbWVEaXNwbGF5IgogICAgICAgICAgICAgICAgIGFuZHJvaWQ6c2luZ2xlTGluZT0idHJ1ZSIKICAgICAgICAgICAgICAgICBhbmRyb2lkOmVsbGlwc2l6ZT0ibm9uZSIKICAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHRTaXplPSIxOHNwIgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2xheW91dC9saXN0X2NvbnRlbnQueG1sIGIvY29yZS9yZXMvcmVzL2xheW91dC9saXN0X2NvbnRlbnQueG1sCmluZGV4IDZmOWYxZTAuLjE0MTQwMzIgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy9sYXlvdXQvbGlzdF9jb250ZW50LnhtbAorKysgYi9jb3JlL3Jlcy9yZXMvbGF5b3V0L2xpc3RfY29udGVudC54bWwKQEAgLTEsOCArMSw2IEBACiA8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgogPCEtLQotLyogLy9kZXZpY2UvYXBwcy9jb21tb24vYXNzZXRzL3Jlcy9sYXlvdXQvbGlzdF9jb250ZW50LnhtbAotKioKLSoqIENvcHlyaWdodCAyMDA2LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvKiBDb3B5cmlnaHQgMjAxMCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAogKioKICoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyAKICoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gCkBAIC0xNyw4ICsxNSw0MiBAQAogKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAqLwogLS0+Ci08TGlzdFZpZXcgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIiBhbmRyb2lkOmlkPSJAYW5kcm9pZDppZC9saXN0IgotICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiIAotICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0ibWF0Y2hfcGFyZW50IgotICAgIGFuZHJvaWQ6ZHJhd1NlbGVjdG9yT25Ub3A9ImZhbHNlIgotICAgIC8+Cis8RnJhbWVMYXlvdXQgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9Im1hdGNoX3BhcmVudCI+CisgICAgCisgICAgPExpbmVhckxheW91dCBhbmRyb2lkOmlkPSJAK2lkL3Byb2dyZXNzQ29udGFpbmVyIgorICAgICAgICAgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0idmVydGljYWwiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IiAKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0ibWF0Y2hfcGFyZW50IgorICAgICAgICAgICAgYW5kcm9pZDp2aXNpYmlsaXR5PSJnb25lIgorICAgICAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJjZW50ZXIiPgorICAgICAgICAKKyAgICAgICAgPFByb2dyZXNzQmFyIHN0eWxlPSI/YW5kcm9pZDphdHRyL3Byb2dyZXNzQmFyU3R5bGVMYXJnZSIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IiAvPgorICAgICAgICA8VGV4dFZpZXcgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHRBcHBlYXJhbmNlPSI/YW5kcm9pZDphdHRyL3RleHRBcHBlYXJhbmNlU21hbGwiCisgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL2xvYWRpbmciCisgICAgICAgICAgICAgICAgYW5kcm9pZDpwYWRkaW5nVG9wPSI0ZGlwIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6c2luZ2xlTGluZT0idHJ1ZSIgLz4KKyAgICAgICAgICAgIAorICAgIDwvTGluZWFyTGF5b3V0PgorICAgICAgICAKKyAgICA8RnJhbWVMYXlvdXQgYW5kcm9pZDppZD0iQCtpZC9saXN0Q29udGFpbmVyIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIgCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9Im1hdGNoX3BhcmVudCI+CisgICAgICAgICAgICAKKyAgICAgICAgPExpc3RWaWV3IGFuZHJvaWQ6aWQ9IkBhbmRyb2lkOmlkL2xpc3QiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIgCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJtYXRjaF9wYXJlbnQiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpkcmF3U2VsZWN0b3JPblRvcD0iZmFsc2UiIC8+CisgICAgICAgIDxUZXh0VmlldyBhbmRyb2lkOmlkPSJAK2FuZHJvaWQ6aWQvaW50ZXJuYWxFbXB0eSIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0ibWF0Y2hfcGFyZW50IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6Z3Jhdml0eT0iY2VudGVyIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dEFwcGVhcmFuY2U9Ij9hbmRyb2lkOmF0dHIvdGV4dEFwcGVhcmFuY2VMYXJnZSIgLz4KKyAgICA8L0ZyYW1lTGF5b3V0PgorICAgICAgICAKKzwvRnJhbWVMYXlvdXQ+CmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvbGF5b3V0L2xpc3RfY29udGVudF9zaW1wbGUueG1sIGIvY29yZS9yZXMvcmVzL2xheW91dC9saXN0X2NvbnRlbnRfc2ltcGxlLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZjlmMWUwCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2xheW91dC9saXN0X2NvbnRlbnRfc2ltcGxlLnhtbApAQCAtMCwwICsxLDI0IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLQorLyogLy9kZXZpY2UvYXBwcy9jb21tb24vYXNzZXRzL3Jlcy9sYXlvdXQvbGlzdF9jb250ZW50LnhtbAorKioKKyoqIENvcHlyaWdodCAyMDA2LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqKgorKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IAorKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAKKyoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAKKyoqCisqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIAorKioKKyoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUgCisqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCAKKyoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgCisqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCistLT4KKzxMaXN0VmlldyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiIGFuZHJvaWQ6aWQ9IkBhbmRyb2lkOmlkL2xpc3QiCisgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIgCisgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJtYXRjaF9wYXJlbnQiCisgICAgYW5kcm9pZDpkcmF3U2VsZWN0b3JPblRvcD0iZmFsc2UiCisgICAgLz4KZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9sYXlvdXQvbG9jYWxlX3BpY2tlcl9pdGVtLnhtbCBiL2NvcmUvcmVzL3Jlcy9sYXlvdXQvbG9jYWxlX3BpY2tlcl9pdGVtLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNjNmNWFiCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2xheW91dC9sb2NhbGVfcGlja2VyX2l0ZW0ueG1sCkBAIC0wLDAgKzEsMzAgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzxMaW5lYXJMYXlvdXQgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgIGFuZHJvaWQ6b3JpZW50YXRpb249Imhvcml6b250YWwiCisgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICBhbmRyb2lkOmdyYXZpdHk9ImNlbnRlcl92ZXJ0aWNhbCIKKyAgICBhbmRyb2lkOm1pbkhlaWdodD0iP2FuZHJvaWQ6YXR0ci9saXN0UHJlZmVycmVkSXRlbUhlaWdodCIKKyAgICBhbmRyb2lkOnBhZGRpbmc9IjVkaXAiPgorCisgICAgPFRleHRWaWV3IGFuZHJvaWQ6aWQ9IkAraWQvbG9jYWxlIgorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgYW5kcm9pZDp0ZXh0QXBwZWFyYW5jZT0iP2FuZHJvaWQ6YXR0ci90ZXh0QXBwZWFyYW5jZUxhcmdlIgorICAgIC8+Cis8L0xpbmVhckxheW91dCA+CmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvbGF5b3V0L3BvcHVwX21lbnVfaXRlbV9sYXlvdXQueG1sIGIvY29yZS9yZXMvcmVzL2xheW91dC9wb3B1cF9tZW51X2l0ZW1fbGF5b3V0LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMzBjNGYyCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2xheW91dC9wb3B1cF9tZW51X2l0ZW1fbGF5b3V0LnhtbApAQCAtMCwwICsxLDU5IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICAKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPGNvbS5hbmRyb2lkLmludGVybmFsLnZpZXcubWVudS5MaXN0TWVudUl0ZW1WaWV3IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iP2FuZHJvaWQ6YXR0ci9saXN0UHJlZmVycmVkSXRlbUhlaWdodCI+CisgICAgCisgICAgPCEtLSBJY29uIHdpbGwgYmUgaW5zZXJ0ZWQgaGVyZS4gLS0+CisgICAgCisgICAgPCEtLSBUaGUgdGl0bGUgYW5kIHN1bW1hcnkgaGF2ZSBzb21lIGdhcCBiZXR3ZWVuIHRoZW0sIGFuZCB0aGlzICdncm91cCcgc2hvdWxkIGJlIGNlbnRlcmVkIHZlcnRpY2FsbHkuIC0tPgorICAgIDxSZWxhdGl2ZUxheW91dAorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iMGRpcCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2VpZ2h0PSIxIgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfZ3Jhdml0eT0iY2VudGVyX3ZlcnRpY2FsIgorICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5MZWZ0PSI2ZGlwIgorICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5SaWdodD0iNmRpcCIKKyAgICAgICAgYW5kcm9pZDpkdXBsaWNhdGVQYXJlbnRTdGF0ZT0idHJ1ZSI+CisgICAgICAgIAorICAgICAgICA8VGV4dFZpZXcgCisgICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL3RpdGxlIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfYWxpZ25QYXJlbnRUb3A9InRydWUiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9hbGlnblBhcmVudExlZnQ9InRydWUiCisgICAgICAgICAgICBhbmRyb2lkOnRleHRBcHBlYXJhbmNlPSI/YW5kcm9pZDphdHRyL3RleHRBcHBlYXJhbmNlTGFyZ2VQb3B1cE1lbnUiCisgICAgICAgICAgICBhbmRyb2lkOnNpbmdsZUxpbmU9InRydWUiCisgICAgICAgICAgICBhbmRyb2lkOmR1cGxpY2F0ZVBhcmVudFN0YXRlPSJ0cnVlIgorICAgICAgICAgICAgYW5kcm9pZDplbGxpcHNpemU9Im1hcnF1ZWUiCisgICAgICAgICAgICBhbmRyb2lkOmZhZGluZ0VkZ2U9Imhvcml6b250YWwiIC8+CisKKyAgICAgICAgPFRleHRWaWV3CisgICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL3Nob3J0Y3V0IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfYmVsb3c9IkBpZC90aXRsZSIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2FsaWduUGFyZW50TGVmdD0idHJ1ZSIKKyAgICAgICAgICAgIGFuZHJvaWQ6dGV4dEFwcGVhcmFuY2U9Ij9hbmRyb2lkOmF0dHIvdGV4dEFwcGVhcmFuY2VTbWFsbFBvcHVwTWVudSIKKyAgICAgICAgICAgIGFuZHJvaWQ6c2luZ2xlTGluZT0idHJ1ZSIKKyAgICAgICAgICAgIGFuZHJvaWQ6ZHVwbGljYXRlUGFyZW50U3RhdGU9InRydWUiIC8+CisKKyAgICA8L1JlbGF0aXZlTGF5b3V0PgorCisgICAgPCEtLSBDaGVja2JveCwgYW5kL29yIHJhZGlvIGJ1dHRvbiB3aWxsIGJlIGluc2VydGVkIGhlcmUuIC0tPgorICAgIAorPC9jb20uYW5kcm9pZC5pbnRlcm5hbC52aWV3Lm1lbnUuTGlzdE1lbnVJdGVtVmlldz4KZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9sYXlvdXQvcHJlZmVyZW5jZV9kaWFsb2dfZWRpdHRleHQueG1sIGIvY29yZS9yZXMvcmVzL2xheW91dC9wcmVmZXJlbmNlX2RpYWxvZ19lZGl0dGV4dC54bWwKaW5kZXggYjQxZTc3NC4uNWJlNTc3MyAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL2xheW91dC9wcmVmZXJlbmNlX2RpYWxvZ19lZGl0dGV4dC54bWwKKysrIGIvY29yZS9yZXMvcmVzL2xheW91dC9wcmVmZXJlbmNlX2RpYWxvZ19lZGl0dGV4dC54bWwKQEAgLTE3LDggKzE3LDcgQEAKIDwhLS0gTGF5b3V0IHVzZWQgYXMgdGhlIGRpYWxvZydzIGNvbnRlbnQgVmlldyBmb3IgRWRpdFRleHRQcmVmZXJlbmNlLiAtLT4KIDxTY3JvbGxWaWV3IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgotICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0ibWF0Y2hfcGFyZW50IgotICAgIGFuZHJvaWQ6b3ZlcnNjcm9sbE1vZGU9ImlmQ29udGVudFNjcm9sbHMiPgorICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0ibWF0Y2hfcGFyZW50Ij4KIAogICAgIDxMaW5lYXJMYXlvdXQKICAgICAgICAgYW5kcm9pZDppZD0iQCthbmRyb2lkOmlkL2VkaXR0ZXh0X2NvbnRhaW5lciIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9sYXlvdXQvcHJlZmVyZW5jZV9oZWFkZXJfaXRlbS54bWwgYi9jb3JlL3Jlcy9yZXMvbGF5b3V0L3ByZWZlcmVuY2VfaGVhZGVyX2l0ZW0ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgwYTNhYzIKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvbGF5b3V0L3ByZWZlcmVuY2VfaGVhZGVyX2l0ZW0ueG1sCkBAIC0wLDAgKzEsNjEgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAwNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzwhLS0gTGF5b3V0IG9mIGEgaGVhZGVyIGl0ZW0gaW4gUHJlZmVyZW5jZUFjdGl2aXR5LiAtLT4KKzxMaW5lYXJMYXlvdXQgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgYW5kcm9pZDptaW5IZWlnaHQ9Ij9hbmRyb2lkOmF0dHIvbGlzdFByZWZlcnJlZEl0ZW1IZWlnaHQiCisgICAgYW5kcm9pZDpiYWNrZ3JvdW5kPSI/YW5kcm9pZDphdHRyL2FjdGl2YXRlZEJhY2tncm91bmRJbmRpY2F0b3IiCisgICAgYW5kcm9pZDpncmF2aXR5PSJjZW50ZXJfdmVydGljYWwiCisgICAgYW5kcm9pZDpwYWRkaW5nUmlnaHQ9Ij9hbmRyb2lkOmF0dHIvc2Nyb2xsYmFyU2l6ZSI+CisKKyAgICA8SW1hZ2VWaWV3CisgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvaWNvbiIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpbkxlZnQ9IjZkaXAiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpblJpZ2h0PSI2ZGlwIgorICAgICAgICBhbmRyb2lkOmxheW91dF9ncmF2aXR5PSJjZW50ZXIiIC8+CisKKyAgICA8UmVsYXRpdmVMYXlvdXQKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpbkxlZnQ9IjJkaXAiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpblJpZ2h0PSI2ZGlwIgorICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5Ub3A9IjZkaXAiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpbkJvdHRvbT0iNmRpcCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2VpZ2h0PSIxIj4KKworICAgICAgICA8VGV4dFZpZXcgYW5kcm9pZDppZD0iQCthbmRyb2lkOmlkL3RpdGxlIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDpzaW5nbGVMaW5lPSJ0cnVlIgorICAgICAgICAgICAgYW5kcm9pZDp0ZXh0QXBwZWFyYW5jZT0iP2FuZHJvaWQ6YXR0ci90ZXh0QXBwZWFyYW5jZUxhcmdlIgorICAgICAgICAgICAgYW5kcm9pZDplbGxpcHNpemU9Im1hcnF1ZWUiCisgICAgICAgICAgICBhbmRyb2lkOmZhZGluZ0VkZ2U9Imhvcml6b250YWwiIC8+CisKKyAgICAgICAgPFRleHRWaWV3IGFuZHJvaWQ6aWQ9IkArYW5kcm9pZDppZC9zdW1tYXJ5IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfYmVsb3c9IkBhbmRyb2lkOmlkL3RpdGxlIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfYWxpZ25MZWZ0PSJAYW5kcm9pZDppZC90aXRsZSIKKyAgICAgICAgICAgIGFuZHJvaWQ6dGV4dEFwcGVhcmFuY2U9Ij9hbmRyb2lkOmF0dHIvdGV4dEFwcGVhcmFuY2VTbWFsbCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bWF4TGluZXM9IjIiIC8+CisKKyAgICA8L1JlbGF0aXZlTGF5b3V0PgorCis8L0xpbmVhckxheW91dD4KZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9sYXlvdXQvcHJlZmVyZW5jZV9saXN0X2NvbnRlbnQueG1sIGIvY29yZS9yZXMvcmVzL2xheW91dC9wcmVmZXJlbmNlX2xpc3RfY29udGVudC54bWwKaW5kZXggOGY4Njk4MS4uZmU5NTBiMiAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL2xheW91dC9wcmVmZXJlbmNlX2xpc3RfY29udGVudC54bWwKKysrIGIvY29yZS9yZXMvcmVzL2xheW91dC9wcmVmZXJlbmNlX2xpc3RfY29udGVudC54bWwKQEAgLTQsMjIgKzQsOTYgQEAKICoqCiAqKiBDb3B5cmlnaHQgMjAwNiwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAogKioKLSoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyAKLSoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gCi0qKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgCisqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogKioKLSoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgCisqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAqKgotKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZSAKLSoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIAotKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAotKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCAKKyoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogKi8KIC0tPgotPExpc3RWaWV3IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIgYW5kcm9pZDppZD0iQGFuZHJvaWQ6aWQvbGlzdCIKLSAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IiAKKworPExpbmVhckxheW91dCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0idmVydGljYWwiCiAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJtYXRjaF9wYXJlbnQiCi0gICAgYW5kcm9pZDpkcmF3U2VsZWN0b3JPblRvcD0iZmFsc2UiCi0gICAgYW5kcm9pZDpzY3JvbGxiYXJBbHdheXNEcmF3VmVydGljYWxUcmFjaz0idHJ1ZSIKLSAgICAvPgorICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiPgorCisgICAgPExpbmVhckxheW91dAorICAgICAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJob3Jpem9udGFsIgorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IjBweCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2VpZ2h0PSIxIj4KKworICAgICAgICA8TGluZWFyTGF5b3V0CisgICAgICAgICAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJ2ZXJ0aWNhbCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSIwcHgiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dlaWdodD0iMSI+CisKKyAgICAgICAgICAgIDxMaXN0VmlldyBhbmRyb2lkOmlkPSJAYW5kcm9pZDppZC9saXN0IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSIwcHgiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2VpZ2h0PSIxIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6ZHJhd1NlbGVjdG9yT25Ub3A9ImZhbHNlIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6c2Nyb2xsYmFyQWx3YXlzRHJhd1ZlcnRpY2FsVHJhY2s9InRydWUiIC8+CisKKyAgICAgICAgICAgIDxGcmFtZUxheW91dCBhbmRyb2lkOmlkPSJAK2lkL2xpc3RfZm9vdGVyIgorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2VpZ2h0PSIwIiAvPgorCisgICAgICAgIDwvTGluZWFyTGF5b3V0PgorCisgICAgICAgIDxGcmFtZUxheW91dCBhbmRyb2lkOmlkPSJAK2lkL3ByZWZzIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSIwcHgiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJtYXRjaF9wYXJlbnQiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2VpZ2h0PSIzIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6dmlzaWJpbGl0eT0iZ29uZSIgLz4KKyAgICA8L0xpbmVhckxheW91dD4KKworICAgIDxSZWxhdGl2ZUxheW91dCBhbmRyb2lkOmlkPSJAK2lkL2J1dHRvbl9iYXIiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF93ZWlnaHQ9IjAiCisgICAgICAgIGFuZHJvaWQ6YmFja2dyb3VuZD0iQGFuZHJvaWQ6ZHJhd2FibGUvYm90dG9tX2JhciIKKyAgICAgICAgYW5kcm9pZDp2aXNpYmlsaXR5PSJnb25lIj4KKworICAgICAgICA8QnV0dG9uIGFuZHJvaWQ6aWQ9IkAraWQvYmFja19idXR0b24iCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iMTUwZGlwIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW49IjVkaXAiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9hbGlnblBhcmVudExlZnQ9InRydWUiCisgICAgICAgICAgICBhbmRyb2lkOmRyYXdhYmxlTGVmdD0iQGRyYXdhYmxlL2ljX2J0bl9iYWNrIgorICAgICAgICAgICAgYW5kcm9pZDpkcmF3YWJsZVBhZGRpbmc9IjNkaXAiCisgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvYmFja19idXR0b25fbGFiZWwiCisgICAgICAgIC8+CisgICAgICAgIDxMaW5lYXJMYXlvdXQKKyAgICAgICAgICAgIGFuZHJvaWQ6b3JpZW50YXRpb249Imhvcml6b250YWwiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9hbGlnblBhcmVudFJpZ2h0PSJ0cnVlIj4KKworICAgICAgICAgICAgPEJ1dHRvbiBhbmRyb2lkOmlkPSJAK2lkL3NraXBfYnV0dG9uIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSIxNTBkaXAiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luPSI1ZGlwIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy9za2lwX2J1dHRvbl9sYWJlbCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOnZpc2liaWxpdHk9ImdvbmUiCisgICAgICAgICAgICAvPgorCisgICAgICAgICAgICA8QnV0dG9uIGFuZHJvaWQ6aWQ9IkAraWQvbmV4dF9idXR0b24iCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IjE1MGRpcCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW49IjVkaXAiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpkcmF3YWJsZVJpZ2h0PSJAZHJhd2FibGUvaWNfYnRuX25leHQiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpkcmF3YWJsZVBhZGRpbmc9IjNkaXAiCisgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL25leHRfYnV0dG9uX2xhYmVsIgorICAgICAgICAgICAgLz4KKyAgICAgICAgPC9MaW5lYXJMYXlvdXQ+CisgICAgPC9SZWxhdGl2ZUxheW91dD4KKzwvTGluZWFyTGF5b3V0PgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2xheW91dC9zY3JlZW4ueG1sIGIvY29yZS9yZXMvcmVzL2xheW91dC9zY3JlZW4ueG1sCmluZGV4IGRmYTk3MzEuLjcyZjczOTIgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy9sYXlvdXQvc2NyZWVuLnhtbAorKysgYi9jb3JlL3Jlcy9yZXMvbGF5b3V0L3NjcmVlbi54bWwKQEAgLTI1LDYgKzI1LDEzIEBACiAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9Im1hdGNoX3BhcmVudCIKID4KKyAgICA8IS0tIFBvcG91dCBiYXIgZm9yIGFjdGlvbiBtb2RlcyAtLT4KKyAgICA8Vmlld1N0dWIgYW5kcm9pZDppZD0iQCtpZC9hY3Rpb25fbW9kZV9iYXJfc3R1YiIKKyAgICAgICAgICAgICAgYW5kcm9pZDppbmZsYXRlZElkPSJAK2lkL2FjdGlvbl9tb2RlX2JhciIKKyAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXQ9IkBsYXlvdXQvYWN0aW9uX21vZGVfYmFyIgorICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIgLz4KKwogICAgIDwhLS0gVGl0bGUgYmFyIC0tPgogICAgIDxSZWxhdGl2ZUxheW91dCBhbmRyb2lkOmlkPSJAYW5kcm9pZDppZC90aXRsZV9jb250YWluZXIiCiAgICAgICAgIHN0eWxlPSI/YW5kcm9pZDphdHRyL3dpbmRvd1RpdGxlQmFja2dyb3VuZFN0eWxlIgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2xheW91dC9zY3JlZW5fYWN0aW9uX2Jhci54bWwgYi9jb3JlL3Jlcy9yZXMvbGF5b3V0L3NjcmVlbl9hY3Rpb25fYmFyLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMTU4NDE0Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2xheW91dC9zY3JlZW5fYWN0aW9uX2Jhci54bWwKQEAgLTAsMCArMSw1MSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAgCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgIAorICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzwhLS0KK1RoaXMgaXMgYW4gb3B0aW1pemVkIGxheW91dCBmb3IgYSBzY3JlZW4gd2l0aCB0aGUgQWN0aW9uIEJhciBlbmFibGVkLgorLS0+CisKKzxMaW5lYXJMYXlvdXQgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgIGFuZHJvaWQ6b3JpZW50YXRpb249InZlcnRpY2FsIgorICAgIGFuZHJvaWQ6Zml0c1N5c3RlbVdpbmRvd3M9InRydWUiPgorICAgIDxWaWV3QW5pbWF0b3IgYW5kcm9pZDppZD0iQCtpZC9hY3Rpb25fYmFyX2FuaW1hdG9yIgorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgYW5kcm9pZDppbkFuaW1hdGlvbj0iQGFuaW0vcHVzaF9kb3duX2luX25vX2FscGhhIgorICAgICAgICBhbmRyb2lkOm91dEFuaW1hdGlvbj0iQGFuaW0vcHVzaF9kb3duX291dF9ub19hbHBoYSI+CisgICAgICAgIDxjb20uYW5kcm9pZC5pbnRlcm5hbC53aWRnZXQuQWN0aW9uQmFyVmlldworICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9hY3Rpb25fYmFyIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgc3R5bGU9Ij9hbmRyb2lkOmF0dHIvYWN0aW9uQmFyU3R5bGUiIC8+CisgICAgICAgIDxjb20uYW5kcm9pZC5pbnRlcm5hbC53aWRnZXQuQWN0aW9uQmFyQ29udGV4dFZpZXcKKyAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvYWN0aW9uX2NvbnRleHRfYmFyIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgc3R5bGU9Ij9hbmRyb2lkOmF0dHIvYWN0aW9uTW9kZVN0eWxlIiAvPgorICAgIDwvVmlld0FuaW1hdG9yPgorICAgIDxGcmFtZUxheW91dCBhbmRyb2lkOmlkPSJAYW5kcm9pZDppZC9jb250ZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IiAKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSIwZGlwIgorICAgICAgICBhbmRyb2lkOmxheW91dF93ZWlnaHQ9IjEiCisgICAgICAgIGFuZHJvaWQ6Zm9yZWdyb3VuZEdyYXZpdHk9ImZpbGxfaG9yaXpvbnRhbHx0b3AiCisgICAgICAgIGFuZHJvaWQ6Zm9yZWdyb3VuZD0iP2FuZHJvaWQ6YXR0ci93aW5kb3dDb250ZW50T3ZlcmxheSIgLz4KKyAgICA8TGluZWFyTGF5b3V0IGFuZHJvaWQ6aWQ9IkAraWQvbG93ZXJfYWN0aW9uX2NvbnRleHRfYmFyIgorICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgICAgc3R5bGU9Ij9hbmRyb2lkOmF0dHIvYWN0aW9uQmFyU3R5bGUiCisgICAgICAgICAgICAgICAgICBhbmRyb2lkOnZpc2liaWxpdHk9ImdvbmUiIC8+Cis8L0xpbmVhckxheW91dD4KZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9sYXlvdXQvc2NyZWVuX2FjdGlvbl9iYXJfb3ZlcmxheS54bWwgYi9jb3JlL3Jlcy9yZXMvbGF5b3V0L3NjcmVlbl9hY3Rpb25fYmFyX292ZXJsYXkueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkyYTFlZTAKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvbGF5b3V0L3NjcmVlbl9hY3Rpb25fYmFyX292ZXJsYXkueG1sCkBAIC0wLDAgKzEsNTUgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzwhLS0KK1RoaXMgaXMgYW4gb3B0aW1pemVkIGxheW91dCBmb3IgYSBzY3JlZW4gd2l0aAordGhlIEFjdGlvbiBCYXIgZW5hYmxlZCBvdmVybGF5aW5nIGFwcGxpY2F0aW9uIGNvbnRlbnQuCistLT4KKworPFJlbGF0aXZlTGF5b3V0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICBhbmRyb2lkOmZpdHNTeXN0ZW1XaW5kb3dzPSJ0cnVlIj4KKyAgICA8RnJhbWVMYXlvdXQgYW5kcm9pZDppZD0iQGFuZHJvaWQ6aWQvY29udGVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJtYXRjaF9wYXJlbnQiIC8+CisgICAgPFZpZXdBbmltYXRvciBhbmRyb2lkOmlkPSJAK2lkL2FjdGlvbl9iYXJfYW5pbWF0b3IiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICBhbmRyb2lkOmdyYXZpdHk9InRvcCIKKyAgICAgICAgYW5kcm9pZDppbkFuaW1hdGlvbj0iQGFuaW0vcHVzaF9kb3duX2luX25vX2FscGhhIgorICAgICAgICBhbmRyb2lkOm91dEFuaW1hdGlvbj0iQGFuaW0vcHVzaF9kb3duX291dF9ub19hbHBoYSI+CisgICAgICAgIDxjb20uYW5kcm9pZC5pbnRlcm5hbC53aWRnZXQuQWN0aW9uQmFyVmlldworICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9hY3Rpb25fYmFyIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgc3R5bGU9Ij9hbmRyb2lkOmF0dHIvYWN0aW9uQmFyU3R5bGUiIC8+CisgICAgICAgIDxjb20uYW5kcm9pZC5pbnRlcm5hbC53aWRnZXQuQWN0aW9uQmFyQ29udGV4dFZpZXcKKyAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvYWN0aW9uX2NvbnRleHRfYmFyIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgc3R5bGU9Ij9hbmRyb2lkOmF0dHIvYWN0aW9uTW9kZVN0eWxlIiAvPgorICAgIDwvVmlld0FuaW1hdG9yPgorICAgIDxJbWFnZVZpZXcgYW5kcm9pZDpzcmM9Ij9hbmRyb2lkOmF0dHIvd2luZG93Q29udGVudE92ZXJsYXkiCisgICAgICAgICAgICAgICBhbmRyb2lkOnNjYWxlVHlwZT0iZml0WFkiCisgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9iZWxvdz0iQGlkL2FjdGlvbl9iYXJfYW5pbWF0b3IiIC8+CisgICAgPExpbmVhckxheW91dCBhbmRyb2lkOmlkPSJAK2lkL2xvd2VyX2FjdGlvbl9jb250ZXh0X2JhciIKKyAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2dyYXZpdHk9ImJvdHRvbSIKKyAgICAgICAgICAgICAgICAgIHN0eWxlPSI/YW5kcm9pZDphdHRyL2FjdGlvbkJhclN0eWxlIgorICAgICAgICAgICAgICAgICAgYW5kcm9pZDp2aXNpYmlsaXR5PSJnb25lIiAvPgorPC9SZWxhdGl2ZUxheW91dD4KZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9sYXlvdXQvc2NyZWVuX2N1c3RvbV90aXRsZS54bWwgYi9jb3JlL3Jlcy9yZXMvbGF5b3V0L3NjcmVlbl9jdXN0b21fdGl0bGUueG1sCmluZGV4IDM0YzlkZTAuLmM2MmEwNmEgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy9sYXlvdXQvc2NyZWVuX2N1c3RvbV90aXRsZS54bWwKKysrIGIvY29yZS9yZXMvcmVzL2xheW91dC9zY3JlZW5fY3VzdG9tX3RpdGxlLnhtbApAQCAtMjEsNiArMjEsMTMgQEAKIDxMaW5lYXJMYXlvdXQgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgogICAgIGFuZHJvaWQ6b3JpZW50YXRpb249InZlcnRpY2FsIgogICAgIGFuZHJvaWQ6Zml0c1N5c3RlbVdpbmRvd3M9InRydWUiPgorICAgIDwhLS0gUG9wb3V0IGJhciBmb3IgYWN0aW9uIG1vZGVzIC0tPgorICAgIDxWaWV3U3R1YiBhbmRyb2lkOmlkPSJAK2lkL2FjdGlvbl9tb2RlX2Jhcl9zdHViIgorICAgICAgICAgICAgICBhbmRyb2lkOmluZmxhdGVkSWQ9IkAraWQvYWN0aW9uX21vZGVfYmFyIgorICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dD0iQGxheW91dC9hY3Rpb25fbW9kZV9iYXIiCisgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IiAvPgorCiAgICAgPEZyYW1lTGF5b3V0IGFuZHJvaWQ6aWQ9IkBhbmRyb2lkOmlkL3RpdGxlX2NvbnRhaW5lciIgCiAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiIAogICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9Ij9hbmRyb2lkOmF0dHIvd2luZG93VGl0bGVTaXplIgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2xheW91dC9zY3JlZW5fcHJvZ3Jlc3MueG1sIGIvY29yZS9yZXMvcmVzL2xheW91dC9zY3JlZW5fcHJvZ3Jlc3MueG1sCmluZGV4IDZlNjk0YzEuLmMzZjQxZmEgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy9sYXlvdXQvc2NyZWVuX3Byb2dyZXNzLnhtbAorKysgYi9jb3JlL3Jlcy9yZXMvbGF5b3V0L3NjcmVlbl9wcm9ncmVzcy54bWwKQEAgLTI2LDYgKzI2LDEzIEBACiAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9Im1hdGNoX3BhcmVudCIKID4KKyAgICA8IS0tIFBvcG91dCBiYXIgZm9yIGFjdGlvbiBtb2RlcyAtLT4KKyAgICA8Vmlld1N0dWIgYW5kcm9pZDppZD0iQCtpZC9hY3Rpb25fbW9kZV9iYXJfc3R1YiIKKyAgICAgICAgICAgICAgYW5kcm9pZDppbmZsYXRlZElkPSJAK2lkL2FjdGlvbl9tb2RlX2JhciIKKyAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXQ9IkBsYXlvdXQvYWN0aW9uX21vZGVfYmFyIgorICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIgLz4KKwogICAgIDxSZWxhdGl2ZUxheW91dCBhbmRyb2lkOmlkPSJAYW5kcm9pZDppZC90aXRsZV9jb250YWluZXIiIAogICAgICAgICBzdHlsZT0iP2FuZHJvaWQ6YXR0ci93aW5kb3dUaXRsZUJhY2tncm91bmRTdHlsZSIKICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIgCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvbGF5b3V0L3NjcmVlbl9zaW1wbGUueG1sIGIvY29yZS9yZXMvcmVzL2xheW91dC9zY3JlZW5fc2ltcGxlLnhtbAppbmRleCBkZjUxMWM2Li44N2MyOWY2IDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvbGF5b3V0L3NjcmVlbl9zaW1wbGUueG1sCisrKyBiL2NvcmUvcmVzL3Jlcy9sYXlvdXQvc2NyZWVuX3NpbXBsZS54bWwKQEAgLTIxLDkgKzIxLDE5IEBACiBlbmFibGVkLgogLS0+CiAKLTxGcmFtZUxheW91dCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgYW5kcm9pZDppZD0iQGFuZHJvaWQ6aWQvY29udGVudCIKKzxMaW5lYXJMYXlvdXQgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgogICAgIGFuZHJvaWQ6Zml0c1N5c3RlbVdpbmRvd3M9InRydWUiCi0gICAgYW5kcm9pZDpmb3JlZ3JvdW5kSW5zaWRlUGFkZGluZz0iZmFsc2UiCi0gICAgYW5kcm9pZDpmb3JlZ3JvdW5kR3Jhdml0eT0iZmlsbF9ob3Jpem9udGFsfHRvcCIKLSAgICBhbmRyb2lkOmZvcmVncm91bmQ9Ij9hbmRyb2lkOmF0dHIvd2luZG93Q29udGVudE92ZXJsYXkiIC8+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorICAgIGFuZHJvaWQ6b3JpZW50YXRpb249InZlcnRpY2FsIj4KKyAgICA8Vmlld1N0dWIgYW5kcm9pZDppZD0iQCtpZC9hY3Rpb25fbW9kZV9iYXJfc3R1YiIKKyAgICAgICAgICAgICAgYW5kcm9pZDppbmZsYXRlZElkPSJAK2lkL2FjdGlvbl9tb2RlX2JhciIKKyAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXQ9IkBsYXlvdXQvYWN0aW9uX21vZGVfYmFyIgorICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIgLz4KKyAgICA8RnJhbWVMYXlvdXQKKyAgICAgICAgIGFuZHJvaWQ6aWQ9IkBhbmRyb2lkOmlkL2NvbnRlbnQiCisgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJtYXRjaF9wYXJlbnQiCisgICAgICAgICBhbmRyb2lkOmZvcmVncm91bmRJbnNpZGVQYWRkaW5nPSJmYWxzZSIKKyAgICAgICAgIGFuZHJvaWQ6Zm9yZWdyb3VuZEdyYXZpdHk9ImZpbGxfaG9yaXpvbnRhbHx0b3AiCisgICAgICAgICBhbmRyb2lkOmZvcmVncm91bmQ9Ij9hbmRyb2lkOmF0dHIvd2luZG93Q29udGVudE92ZXJsYXkiIC8+Cis8L0xpbmVhckxheW91dD4KZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9sYXlvdXQvc2NyZWVuX3RpdGxlLnhtbCBiL2NvcmUvcmVzL3Jlcy9sYXlvdXQvc2NyZWVuX3RpdGxlLnhtbAppbmRleCAzOWVhMTMxLi5mNTEzNGY5IDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvbGF5b3V0L3NjcmVlbl90aXRsZS54bWwKKysrIGIvY29yZS9yZXMvcmVzL2xheW91dC9zY3JlZW5fdGl0bGUueG1sCkBAIC0yMiw2ICsyMiwxMiBAQAogPExpbmVhckxheW91dCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCiAgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0idmVydGljYWwiCiAgICAgYW5kcm9pZDpmaXRzU3lzdGVtV2luZG93cz0idHJ1ZSI+CisgICAgPCEtLSBQb3BvdXQgYmFyIGZvciBhY3Rpb24gbW9kZXMgLS0+CisgICAgPFZpZXdTdHViIGFuZHJvaWQ6aWQ9IkAraWQvYWN0aW9uX21vZGVfYmFyX3N0dWIiCisgICAgICAgICAgICAgIGFuZHJvaWQ6aW5mbGF0ZWRJZD0iQCtpZC9hY3Rpb25fbW9kZV9iYXIiCisgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0PSJAbGF5b3V0L2FjdGlvbl9tb2RlX2JhciIKKyAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiIC8+CiAgICAgPEZyYW1lTGF5b3V0CiAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiIAogICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9Ij9hbmRyb2lkOmF0dHIvd2luZG93VGl0bGVTaXplIgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2xheW91dC9zY3JlZW5fdGl0bGVfaWNvbnMueG1sIGIvY29yZS9yZXMvcmVzL2xheW91dC9zY3JlZW5fdGl0bGVfaWNvbnMueG1sCmluZGV4IDYyYTAyMjguLjUxZDZhMTUgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy9sYXlvdXQvc2NyZWVuX3RpdGxlX2ljb25zLnhtbAorKysgYi9jb3JlL3Jlcy9yZXMvbGF5b3V0L3NjcmVlbl90aXRsZV9pY29ucy54bWwKQEAgLTIzLDYgKzIzLDEyIEBACiAgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0idmVydGljYWwiCiAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9Im1hdGNoX3BhcmVudCI+CisgICAgPCEtLSBQb3BvdXQgYmFyIGZvciBhY3Rpb24gbW9kZXMgLS0+CisgICAgPFZpZXdTdHViIGFuZHJvaWQ6aWQ9IkAraWQvYWN0aW9uX21vZGVfYmFyX3N0dWIiCisgICAgICAgICAgICAgIGFuZHJvaWQ6aW5mbGF0ZWRJZD0iQCtpZC9hY3Rpb25fbW9kZV9iYXIiCisgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0PSJAbGF5b3V0L2FjdGlvbl9tb2RlX2JhciIKKyAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiIC8+CiAgICAgPFJlbGF0aXZlTGF5b3V0IGFuZHJvaWQ6aWQ9IkBhbmRyb2lkOmlkL3RpdGxlX2NvbnRhaW5lciIKICAgICAgICAgc3R5bGU9Ij9hbmRyb2lkOmF0dHIvd2luZG93VGl0bGVCYWNrZ3JvdW5kU3R5bGUiCiAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvbGF5b3V0L3NlYXJjaF92aWV3LnhtbCBiL2NvcmUvcmVzL3Jlcy9sYXlvdXQvc2VhcmNoX3ZpZXcueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMyMjliNTkKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvbGF5b3V0L3NlYXJjaF92aWV3LnhtbApAQCAtMCwwICsxLDExOSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0KKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCistLT4KKzxMaW5lYXJMYXlvdXQKKyAgICB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgYW5kcm9pZDppZD0iQCtpZC9zZWFyY2hfYmFyIgorICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0iaG9yaXpvbnRhbCIKKyAgICBhbmRyb2lkOmZvY3VzYWJsZT0idHJ1ZSIKKyAgICBhbmRyb2lkOmRlc2NlbmRhbnRGb2N1c2FiaWxpdHk9ImFmdGVyRGVzY2VuZGFudHMiPgorCisgICAgPCEtLSBUaGlzIGlzIGFjdHVhbGx5IHVzZWQgZm9yIHRoZSBiYWRnZSBpY29uICpvciogdGhlIGJhZGdlIGxhYmVsIChvciBuZWl0aGVyKSAtLT4KKyAgICA8VGV4dFZpZXcKKyAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9zZWFyY2hfYmFkZ2UiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5Cb3R0b209IjJkaXAiCisgICAgICAgIGFuZHJvaWQ6ZHJhd2FibGVQYWRkaW5nPSIwZGlwIgorICAgICAgICBhbmRyb2lkOnRleHRBcHBlYXJhbmNlPSI/YW5kcm9pZDphdHRyL3RleHRBcHBlYXJhbmNlU21hbGwiCisgICAgICAgIGFuZHJvaWQ6dGV4dENvbG9yPSI/YW5kcm9pZDphdHRyL3RleHRDb2xvclByaW1hcnlJbnZlcnNlIgorICAgICAgICBhbmRyb2lkOnZpc2liaWxpdHk9ImdvbmUiCisgICAgLz4KKworICAgIDxJbWFnZVZpZXcKKyAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9zZWFyY2hfYnV0dG9uIgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IjM2ZGlwIgorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iMzZkaXAiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpblJpZ2h0PSI3ZGlwIgorICAgICAgICBhbmRyb2lkOmxheW91dF9ncmF2aXR5PSJjZW50ZXJfdmVydGljYWwiCisgICAgICAgIGFuZHJvaWQ6c3JjPSJAYW5kcm9pZDpkcmF3YWJsZS9pY19idG5fc2VhcmNoIgorICAgIC8+CisKKyAgICA8IS0tIElubmVyIGxheW91dCBjb250YWlucyB0aGUgYXBwIGljb24sIGJ1dHRvbihzKSBhbmQgRWRpdFRleHQgLS0+CisgICAgPExpbmVhckxheW91dAorICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL3NlYXJjaF9lZGl0X2ZyYW1lIgorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iMzAwZHAiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICBhbmRyb2lkOnZpc2liaWxpdHk9ImdvbmUiCisgICAgICAgIGFuZHJvaWQ6b3JpZW50YXRpb249Imhvcml6b250YWwiCisgICAgICAgIGFuZHJvaWQ6YmFja2dyb3VuZD0iP2FuZHJvaWQ6YXR0ci9lZGl0VGV4dEJhY2tncm91bmQiPgorCisgICAgICAgIDxJbWFnZVZpZXcKKyAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvc2VhcmNoX2FwcF9pY29uIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSIyNGRpcCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSIyNGRpcCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpblJpZ2h0PSI3ZGlwIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfZ3Jhdml0eT0iYm90dG9tIgorICAgICAgICAgICAgYW5kcm9pZDpzcmM9IkBhbmRyb2lkOmRyYXdhYmxlL2ljX2J0bl9zZWFyY2giCisgICAgICAgIC8+CisKKyAgICAgICAgPEF1dG9Db21wbGV0ZVRleHRWaWV3CisgICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL3NlYXJjaF9zcmNfdGV4dCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dlaWdodD0iMSIKKyAgICAgICAgICAgIGFuZHJvaWQ6cGFkZGluZ0xlZnQ9IjhkaXAiCisgICAgICAgICAgICBhbmRyb2lkOnBhZGRpbmdSaWdodD0iNmRpcCIKKyAgICAgICAgICAgIGFuZHJvaWQ6ZHJhd2FibGVQYWRkaW5nPSIyZGlwIgorICAgICAgICAgICAgYW5kcm9pZDpzaW5nbGVMaW5lPSJ0cnVlIgorICAgICAgICAgICAgYW5kcm9pZDplbGxpcHNpemU9ImVuZCIKKyAgICAgICAgICAgIGFuZHJvaWQ6YmFja2dyb3VuZD0iQG51bGwiCisgICAgICAgICAgICBhbmRyb2lkOmlucHV0VHlwZT0idGV4dHx0ZXh0QXV0b0NvbXBsZXRlIgorICAgICAgICAgICAgYW5kcm9pZDppbWVPcHRpb25zPSJhY3Rpb25TZWFyY2giCisgICAgICAgICAgICBhbmRyb2lkOmRyb3BEb3duV2lkdGg9IjMwMGRwIgorICAgICAgICAgICAgYW5kcm9pZDpkcm9wRG93bkhlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDpkcm9wRG93bkFuY2hvcj0iQGlkL3NlYXJjaF9lZGl0X2ZyYW1lIgorICAgICAgICAgICAgYW5kcm9pZDpkcm9wRG93blZlcnRpY2FsT2Zmc2V0PSIwZGlwIgorICAgICAgICAgICAgYW5kcm9pZDpkcm9wRG93bkhvcml6b250YWxPZmZzZXQ9IjBkaXAiCisgICAgICAgICAgICBhbmRyb2lkOnBvcHVwQmFja2dyb3VuZD0iQGFuZHJvaWQ6ZHJhd2FibGUvc2VhcmNoX2Ryb3Bkb3duX2JhY2tncm91bmQiCisgICAgICAgIC8+CisKKyAgICAgICAgPEltYWdlVmlldworICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9zZWFyY2hfY2xvc2VfYnRuIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IjI0ZHAiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IjI0ZHAiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9ncmF2aXR5PSJib3R0b20iCisgICAgICAgICAgICBhbmRyb2lkOnNyYz0iQGFuZHJvaWQ6ZHJhd2FibGUvYnRuX2Nsb3NlIgorICAgICAgICAvPgorICAgIDwvTGluZWFyTGF5b3V0PgorCisgICAgPEltYWdlVmlldworICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL3NlYXJjaF9nb19idG4iCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0ibWF0Y2hfcGFyZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5MZWZ0PSI0ZGlwIgorICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5SaWdodD0iNGRpcCIKKyAgICAgICAgYW5kcm9pZDpzcmM9IkBhbmRyb2lkOmRyYXdhYmxlL2ljX2J0bl9maW5kX25leHQiCisgICAgLz4KKworICAgIDxJbWFnZUJ1dHRvbgorICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL3NlYXJjaF92b2ljZV9idG4iCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0ibWF0Y2hfcGFyZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5MZWZ0PSIwZGlwIgorICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5Ub3A9Ii02LjVkaXAiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpbkJvdHRvbT0iLTdkaXAiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpblJpZ2h0PSItNWRpcCIKKyAgICAgICAgYW5kcm9pZDpiYWNrZ3JvdW5kPSJAZHJhd2FibGUvYnRuX3NlYXJjaF9kaWFsb2dfdm9pY2UiCisgICAgICAgIGFuZHJvaWQ6c3JjPSJAYW5kcm9pZDpkcmF3YWJsZS9pY19idG5fc3BlYWtfbm93IgorICAgICAgICBhbmRyb2lkOnZpc2liaWxpdHk9ImdvbmUiCisgICAgLz4KKzwvTGluZWFyTGF5b3V0PgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2xheW91dC9zZWxlY3RfZGlhbG9nLnhtbCBiL2NvcmUvcmVzL3Jlcy9sYXlvdXQvc2VsZWN0X2RpYWxvZy54bWwKaW5kZXggNmU0ZTVlMS4uYzY2NWY3YSAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL2xheW91dC9zZWxlY3RfZGlhbG9nLnhtbAorKysgYi9jb3JlL3Jlcy9yZXMvbGF5b3V0L3NlbGVjdF9kaWFsb2cueG1sCkBAIC0zMSw1ICszMSw0IEBACiAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luVG9wPSI1cHgiCiAgICAgYW5kcm9pZDpjYWNoZUNvbG9ySGludD0iQG51bGwiCiAgICAgYW5kcm9pZDpkaXZpZGVyPSJAYW5kcm9pZDpkcmF3YWJsZS9kaXZpZGVyX2hvcml6b250YWxfYnJpZ2h0IgotICAgIGFuZHJvaWQ6c2Nyb2xsYmFycz0idmVydGljYWwiCi0gICAgYW5kcm9pZDpvdmVyc2Nyb2xsTW9kZT0iaWZDb250ZW50U2Nyb2xscyIgLz4KKyAgICBhbmRyb2lkOnNjcm9sbGJhcnM9InZlcnRpY2FsIiAvPgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2xheW91dC9zZWxlY3RfZGlhbG9nX211bHRpY2hvaWNlLnhtbCBiL2NvcmUvcmVzL3Jlcy9sYXlvdXQvc2VsZWN0X2RpYWxvZ19tdWx0aWNob2ljZS54bWwKaW5kZXggNTc4NWQzYi4uYjY0NmE0YyAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL2xheW91dC9zZWxlY3RfZGlhbG9nX211bHRpY2hvaWNlLnhtbAorKysgYi9jb3JlL3Jlcy9yZXMvbGF5b3V0L3NlbGVjdF9kaWFsb2dfbXVsdGljaG9pY2UueG1sCkBAIC0yNCw3ICsyNCw3IEBACiAgICAgYW5kcm9pZDpncmF2aXR5PSJjZW50ZXJfdmVydGljYWwiCiAgICAgYW5kcm9pZDpwYWRkaW5nTGVmdD0iMTJkaXAiCiAgICAgYW5kcm9pZDpwYWRkaW5nUmlnaHQ9IjdkaXAiCi0gICAgYW5kcm9pZDpjaGVja01hcms9IkBhbmRyb2lkOmRyYXdhYmxlL2J0bl9jaGVjayIKKyAgICBhbmRyb2lkOmNoZWNrTWFyaz0iP2FuZHJvaWQ6YXR0ci9saXN0Q2hvaWNlSW5kaWNhdG9yTXVsdGlwbGUiCiAgICAgYW5kcm9pZDplbGxpcHNpemU9Im1hcnF1ZWUiCiAvPgogCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvbGF5b3V0L3NlbGVjdF9kaWFsb2dfc2luZ2xlY2hvaWNlLnhtbCBiL2NvcmUvcmVzL3Jlcy9sYXlvdXQvc2VsZWN0X2RpYWxvZ19zaW5nbGVjaG9pY2UueG1sCmluZGV4IDM1NjBmZWUuLmMzYzIwNzMgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy9sYXlvdXQvc2VsZWN0X2RpYWxvZ19zaW5nbGVjaG9pY2UueG1sCisrKyBiL2NvcmUvcmVzL3Jlcy9sYXlvdXQvc2VsZWN0X2RpYWxvZ19zaW5nbGVjaG9pY2UueG1sCkBAIC0yNCw2ICsyNCw2IEBACiAgICAgYW5kcm9pZDpncmF2aXR5PSJjZW50ZXJfdmVydGljYWwiCiAgICAgYW5kcm9pZDpwYWRkaW5nTGVmdD0iMTJkaXAiCiAgICAgYW5kcm9pZDpwYWRkaW5nUmlnaHQ9IjdkaXAiCi0gICAgYW5kcm9pZDpjaGVja01hcms9IkBhbmRyb2lkOmRyYXdhYmxlL2J0bl9yYWRpbyIKKyAgICBhbmRyb2lkOmNoZWNrTWFyaz0iP2FuZHJvaWQ6YXR0ci9saXN0Q2hvaWNlSW5kaWNhdG9yU2luZ2xlIgogICAgIGFuZHJvaWQ6ZWxsaXBzaXplPSJtYXJxdWVlIgogLz4KZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9sYXlvdXQvc2ltcGxlX3NlbGVjdGFibGVfbGlzdF9pdGVtLnhtbCBiL2NvcmUvcmVzL3Jlcy9sYXlvdXQvc2ltcGxlX3NlbGVjdGFibGVfbGlzdF9pdGVtLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MThiY2QwCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2xheW91dC9zaW1wbGVfc2VsZWN0YWJsZV9saXN0X2l0ZW0ueG1sCkBAIC0wLDAgKzEsMjYgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgIAorICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8Q2hlY2tlZFRleHRWaWV3IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICBhbmRyb2lkOmlkPSJAYW5kcm9pZDppZC90ZXh0MSIKKyAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iP2FuZHJvaWQ6YXR0ci9saXN0UHJlZmVycmVkSXRlbUhlaWdodCIKKyAgICBhbmRyb2lkOnRleHRBcHBlYXJhbmNlPSI/YW5kcm9pZDphdHRyL3RleHRBcHBlYXJhbmNlTGFyZ2UiCisgICAgYW5kcm9pZDpncmF2aXR5PSJjZW50ZXJfdmVydGljYWwiCisgICAgYW5kcm9pZDpiYWNrZ3JvdW5kPSI/YW5kcm9pZDphdHRyL2xpc3RDaG9pY2VCYWNrZ3JvdW5kSW5kaWNhdG9yIgorICAgIGFuZHJvaWQ6cGFkZGluZ0xlZnQ9IjZkaXAiCisgICAgYW5kcm9pZDpwYWRkaW5nUmlnaHQ9IjlkaXAiCisvPgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2xheW91dC93ZWJfcnVudGltZS54bWwgYi9jb3JlL3Jlcy9yZXMvbGF5b3V0L3dlYl9ydW50aW1lLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZWMwOTY0Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2xheW91dC93ZWJfcnVudGltZS54bWwKQEAgLTAsMCArMSwzNiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPEZyYW1lTGF5b3V0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJ2ZXJ0aWNhbCIKKyAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iZmlsbF9wYXJlbnQiCisgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJmaWxsX3BhcmVudCIKKyAgICA+CisgICAgPFdlYlZpZXcKKyAgICAgICAgYW5kcm9pZDppZD0iQCtpZC93ZWJ2aWV3IgorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iZmlsbF9wYXJlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iZmlsbF9wYXJlbnQiCisgICAgLz4KKworICAgIDxJbWFnZVZpZXcKKyAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9zcGxhc2hzY3JlZW4iCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJmaWxsX3BhcmVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJmaWxsX3BhcmVudCIKKyAgICAgICAgYW5kcm9pZDpzY2FsZVR5cGU9ImZpdFN0YXJ0IgorICAgIC8+CisKKzwvRnJhbWVMYXlvdXQ+CisKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9sYXlvdXQvd2Vidmlld19maW5kLnhtbCBiL2NvcmUvcmVzL3Jlcy9sYXlvdXQvd2Vidmlld19maW5kLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMmVkYjJiCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2xheW91dC93ZWJ2aWV3X2ZpbmQueG1sCkBAIC0wLDAgKzEsMzkgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAwNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzxMaW5lYXJMYXlvdXQgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0iaG9yaXpvbnRhbCIKKyAgICA+CisgICAgPEVkaXRUZXh0IGFuZHJvaWQ6aWQ9IkAraWQvZWRpdCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IjBkaXAiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dlaWdodD0iMSIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6c2Nyb2xsSG9yaXpvbnRhbGx5PSJ0cnVlIgorICAgICAgICBhbmRyb2lkOmlucHV0VHlwZT0idGV4dCIKKyAgICAgICAgYW5kcm9pZDpoaW50PSJAc3RyaW5nL2ZpbmRfb25fcGFnZSIKKyAgICAgICAgYW5kcm9pZDppbWVPcHRpb25zPSJhY3Rpb25Eb25lIgorICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5SaWdodD0iMTBkaXAiCisgICAgICAgIC8+CisgICAgPFRleHRWaWV3IGFuZHJvaWQ6aWQ9IkAraWQvbWF0Y2hlcyIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2dyYXZpdHk9ImNlbnRlcl92ZXJ0aWNhbCIKKyAgICAgICAgYW5kcm9pZDp0ZXh0QXBwZWFyYW5jZT0iP2FuZHJvaWQ6YXR0ci90ZXh0QXBwZWFyYW5jZVNtYWxsIgorICAgICAgICBhbmRyb2lkOnRleHRDb2xvcj0iP2FuZHJvaWQ6YXR0ci90ZXh0Q29sb3JTZWNvbmRhcnlJbnZlcnNlIgorICAgICAgICAvPgorPC9MaW5lYXJMYXlvdXQ+CmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvbWVudS93ZWJ2aWV3X2NvcHkueG1sIGIvY29yZS9yZXMvcmVzL21lbnUvd2Vidmlld19jb3B5LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMjRmNTRmCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL21lbnUvd2Vidmlld19jb3B5LnhtbApAQCAtMCwwICsxLDM1IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8bWVudSB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiPgorICAgIDxpdGVtIGFuZHJvaWQ6aWQ9IkAraWQvY29weSIKKyAgICAgICAgYW5kcm9pZDppY29uPSJAZHJhd2FibGUvaWNfbWVudV9hdHRhY2htZW50IgorICAgICAgICBhbmRyb2lkOnNob3dBc0FjdGlvbj0iYWx3YXlzIgorICAgICAgICAvPgorICAgIDxpdGVtIGFuZHJvaWQ6aWQ9IkAraWQvc2hhcmUiCisgICAgICAgIGFuZHJvaWQ6aWNvbj0iQGRyYXdhYmxlL2ljX21lbnVfc2hhcmUiCisgICAgICAgIGFuZHJvaWQ6c2hvd0FzQWN0aW9uPSJhbHdheXMiCisgICAgICAgIC8+CisgICAgPGl0ZW0gYW5kcm9pZDppZD0iQCtpZC9zZWxlY3RfYWxsIgorICAgICAgICBhbmRyb2lkOmljb249IkBkcmF3YWJsZS9pY19tZW51X2NoYXRfZGFzaGJvYXJkIgorICAgICAgICBhbmRyb2lkOnNob3dBc0FjdGlvbj0iYWx3YXlzIgorICAgICAgICAvPgorICAgIDxpdGVtIGFuZHJvaWQ6aWQ9IkAraWQvZmluZCIKKyAgICAgICAgYW5kcm9pZDppY29uPSJAZHJhd2FibGUvaWNfbWVudV9maW5kIgorICAgICAgICBhbmRyb2lkOnNob3dBc0FjdGlvbj0iYWx3YXlzIgorICAgICAgICAvPgorPC9tZW51PgorCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvbWVudS93ZWJ2aWV3X2ZpbmQueG1sIGIvY29yZS9yZXMvcmVzL21lbnUvd2Vidmlld19maW5kLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NGE0MGFhCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL21lbnUvd2Vidmlld19maW5kLnhtbApAQCAtMCwwICsxLDI2IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8bWVudSB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiPgorICAgIDxpdGVtIGFuZHJvaWQ6aWQ9IkAraWQvZmluZF9wcmV2IgorICAgICAgICBhbmRyb2lkOmljb249IkBkcmF3YWJsZS9pY19idG5fZmluZF9wcmV2IgorICAgICAgICBhbmRyb2lkOnNob3dBc0FjdGlvbj0iYWx3YXlzIgorICAgICAgICAvPgorICAgIDxpdGVtIGFuZHJvaWQ6aWQ9IkAraWQvZmluZF9uZXh0IgorICAgICAgICBhbmRyb2lkOmljb249IkBkcmF3YWJsZS9pY19idG5fZmluZF9uZXh0IgorICAgICAgICBhbmRyb2lkOnNob3dBc0FjdGlvbj0iYWx3YXlzIgorICAgICAgICAvPgorPC9tZW51PgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL3Jhdy1ybS9sb2FkZXJyb3IuaHRtbCBiL2NvcmUvcmVzL3Jlcy9yYXctcm0vbG9hZGVycm9yLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGU0YTNmZQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9yYXctcm0vbG9hZGVycm9yLmh0bWwKQEAgLTAsMCArMSwxOCBAQAorPGh0bWw+CisgICAgPGhlYWQ+CisgICAgICAgIDx0aXRsZT5QYWdpbmEgZCdpbnRlcm5ldCBiZXRnIGRpc3BvbmlibGE8L3RpdGxlPgorICAgICAgICA8c3R5bGUgdHlwZT0idGV4dC9jc3MiPgorICAgICAgICAgICAgYm9keSB7IG1hcmdpbi10b3A6IDBweDsgcGFkZGluZy10b3A6IDBweDsgfQorICAgICAgICAgICAgaDIgICB7IG1hcmdpbi10b3A6IDVweDsgcGFkZGluZy10b3A6IDBweDsgfQorICAgICAgICA8L3N0eWxlPgorCisgICAgICAgIDxib2R5PgorCisgICAgICAgICAgICA8aW1nIHNyYz0iZmlsZTovLy9hbmRyb2lkX2Fzc2V0L3dlYmtpdC9hbmRyb2lkLXdlYmVycm9yLnBuZyIgYWxpZ249InRvcCIgLz4KKyAgICAgICAgICAgIDxoMj5QYWdpbmEgZCdpbnRlcm5ldCBiZXRnIGRpc3BvbmlibGE8L2gyPgorICAgICAgICAgICAgPHA+SW1wdXNzaWJlbCBkYSBjaGFyZ2lhciBsYSBwYWdpbmEgZCdpbnRlcm5ldCBzdXQgPGEgaHJlZj0iJXMiPiVzPC9hPi4gRXJydXI6PC9wPgorICAgICAgICAgICAgPCEtLSBUaGUgJWUgaXMgcmVwbGFjZWQgYnkgYSBsb2NhbGl6ZWQgZXJyb3Igc3RyaW5nIC0tPgorICAgICAgICAgICAgPHA+JWU8L3A+CisgICAgICAgIDwvYm9keT4KKyAgICA8L2hlYWQ+Cis8L2h0bWw+CmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvcmF3LXJtL25vZG9tYWluLmh0bWwgYi9jb3JlL3Jlcy9yZXMvcmF3LXJtL25vZG9tYWluLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWUyODMzYgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9yYXctcm0vbm9kb21haW4uaHRtbApAQCAtMCwwICsxLDIzIEBACis8aHRtbD4KKyAgICA8aGVhZD4KKyAgICAgICAgPHRpdGxlPlBhZ2luYSBkJ2ludGVybmV0IGJldGcgZGlzcG9uaWJsYTwvdGl0bGU+CisgICAgICAgIDxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+CisgICAgICAgICAgICBib2R5IHsgbWFyZ2luLXRvcDogMHB4OyBwYWRkaW5nLXRvcDogMHB4OyB9CisgICAgICAgICAgICBoMiAgIHsgbWFyZ2luLXRvcDogNXB4OyBwYWRkaW5nLXRvcDogMHB4OyB9CisgICAgICAgIDwvc3R5bGU+CisKKyAgICAgICAgPGJvZHk+CisKKyAgICAgICAgICAgIDxpbWcgc3JjPSJmaWxlOi8vL2FuZHJvaWRfYXNzZXQvd2Via2l0L2FuZHJvaWQtd2ViZXJyb3IucG5nIiBhbGlnbj0idG9wIiAvPgorICAgICAgICAgICAgPGgyPlBhZ2luYSBkJ2ludGVybmV0IGJldGcgZGlzcG9uaWJsYTwvaDI+CisgICAgICAgICAgICA8cD5MYSBwYWdpbmEgZCdpbnRlcm5ldCBzdXQgPGEgaHJlZj0iJXMiPiVzPC9hPiAmZWdyYXZlOyBldmVudHVhbG1haW4gZGVhY3RpdmFkYSB0ZW1wb3Jhcm1haW4gdSBzcHVzdGFkYSBkZWZpbml0aXZhbWFpbiBhZCBpbmEgbm92YSBhZHJlc3NhIGRhIHdlYi48L3A+CisKKyAgICAgICAgICAgIDxwPjxiPlF1YSBpbiBwJmVncmF2ZTtyIHByb3Bvc3Rhczo8L2I+PC9wPgorICAgICAgICAgICAgPHVsPgorICAgICAgICAgICAgICAgIDxsaT5Db250cm9sbGFpIGNoZSBWb3NzIGFwcGFyYXQgcmVjZXBlc2NoYSBpbiBzaWduYWwgZSBkaXNwb25hIGQnaW5hIGNvbm5leGl1biBkYSBkYXRhcy48L2xpPgorICAgICAgICAgICAgICAgIDxsaT5DaGFyZ2lhaSBwbGkgdGFyZCBkYW5vdmFtYWluIGxhIHBhZ2luYSBkJ2ludGVybmV0LjwvbGk+CisgICAgICAgICAgICAgICAgPGxpPkNoYXJnaWFpIGluYSBjb3BpYSBkYSBsYSBwYWdpbmEgZGEgd2ViIG1lbW9yaXNhZGEgZW4gaWwgY2FjaGUgZGEgR29vZ2xlLjwvbGk+CisgICAgICAgICAgICA8L3VsPgorICAgICAgICA8L2JvZHk+CisgICAgPC9oZWFkPgorPC9odG1sPgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL3ZhbHVlcy1jcy9zdHJpbmdzLnhtbCBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMtY3Mvc3RyaW5ncy54bWwKaW5kZXggZGRhMWZjNS4uOTRjYzM5MyAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL3ZhbHVlcy1jcy9zdHJpbmdzLnhtbAorKysgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzLWNzL3N0cmluZ3MueG1sCkBAIC00MzIsNiArNDMyLDEwIEBACiAgICAgPHN0cmluZyBuYW1lPSJwb2xpY3lkZXNjX2ZvcmNlTG9jayIgbXNnaWQ9IjI4MTk4Njg2NjQ5NDYwODk3NDAiPiJVcsSNdWplLCBrZHkgZG9qZGUgayB1emFtxI1lbsOtIHphxZnDrXplbsOtIGEgYnVkZSBwb8W+YWRvdsOhbm8gb3DEm3Rvdm7DqSB6YWTDoW7DrSBoZXNsYS4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwb2xpY3lsYWJfd2lwZURhdGEiIG1zZ2lkPSIzOTEwNTQ1NDQ2NzU4NjM5NzEzIj4iVnltYXrDoW7DrSB2xaFlY2ggZGF0Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icG9saWN5ZGVzY193aXBlRGF0YSIgbXNnaWQ9IjIzMTQwNjA5MzM3OTYzOTYyMDUiPiJCZXogZGFsxaHDrWhvIHBvdHZyemVuw60gb2Jub3bDrSB2w71jaG96w60gbmFzdGF2ZW7DrSB6IHbDvXJvYnkgYSBzbWHFvmUgdsWhZWNobmEgZGF0YS4iPC9zdHJpbmc+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcG9saWN5bGFiX3NldEdsb2JhbFByb3h5ICgyNzg0ODI4MjkzNzQ3NzkxNDQ2KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBvbGljeWRlc2Nfc2V0R2xvYmFsUHJveHkgKDYzODc0OTc0NjY2NjAxNTQ5MzEpIC0tPgorICAgIDxza2lwIC8+CiAgIDxzdHJpbmctYXJyYXkgbmFtZT0icGhvbmVUeXBlcyI+CiAgICAgPGl0ZW0gbXNnaWQ9Ijg5MDEwOTgzMzY2NTg3MTAzNTkiPiJEb23FryI8L2l0ZW0+CiAgICAgPGl0ZW0gbXNnaWQ9Ijg2OTkyMzY1MDUyNzEzNjYxNSI+Ik1vYmlsIjwvaXRlbT4KQEAgLTUyNSwxMCArNTI5LDkgQEAKICAgICA8c3RyaW5nIG5hbWU9Im9yZ1R5cGVXb3JrIiBtc2dpZD0iMjkyNjg4NzA1MDUzNjM4NzIiPiJQcsOhY2UiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJvcmdUeXBlT3RoZXIiIG1zZ2lkPSIzOTUxNzgxMTMxNTcwMTI0MDgyIj4iSmluw6kiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJvcmdUeXBlQ3VzdG9tIiBtc2dpZD0iMjI1NTIzNDE1MzcyMDg4MzIyIj4iVmxhc3Ruw60iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJjb250YWN0X3N0YXR1c191cGRhdGVfYXR0cmlidXRpb24iIG1zZ2lkPSI1MTEyNTg5ODg2MDk0NDAyNzk1Ij4icG9tb2PDrSA8eGxpZmY6ZyBpZD0iU09VUkNFIj4lMSRzPC94bGlmZjpnPiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImNvbnRhY3Rfc3RhdHVzX3VwZGF0ZV9hdHRyaWJ1dGlvbl93aXRoX2RhdGUiIG1zZ2lkPSI1OTQ1Mzg2Mzc2MzY5OTc5OTA5Ij4iPHhsaWZmOmcgaWQ9IkRBVEUiPiUxJHM8L3hsaWZmOmc+IHBvbW9jw60gPHhsaWZmOmcgaWQ9IlNPVVJDRSI+JTIkczwveGxpZmY6Zz4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJrZXlndWFyZF9wYXNzd29yZF9lbnRlcl9waW5fY29kZSIgbXNnaWQ9IjM3MzE0ODg4MjcyMTg4NzYxMTUiPiJaYWRlanRlIGvDs2QgUElOIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ia2V5Z3VhcmRfcGFzc3dvcmRfZW50ZXJfcGFzc3dvcmRfY29kZSIgbXNnaWQ9IjkxMzgxNTgzNDQ4MTMyMTM3NTQiPiJaYWRlanRlIGhlc2xvIHBybyBvZGJsb2tvdsOhbsOtIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ia2V5Z3VhcmRfcGFzc3dvcmRfZW50ZXJfcGluX3Bhc3N3b3JkX2NvZGUiIG1zZ2lkPSI2MzgzNDcwNzU2MjU0OTE1MTQiPiJaYWRlanRlIGvDs2QgUElOIHBybyBvZGJsb2tvdsOhbsOtIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ia2V5Z3VhcmRfcGFzc3dvcmRfd3JvbmdfcGluX2NvZGUiIG1zZ2lkPSIxMjk1OTg0MTE0MzM4MTA3NzE4Ij4iTmVzcHLDoXZuw70ga8OzZCBQSU4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJrZXlndWFyZF9sYWJlbF90ZXh0IiBtc2dpZD0iODYxNzk2NDYxMDI4Mjk4NDI0Ij4iQ2hjZXRlLWxpIHRlbGVmb24gb2RlbWtub3V0LCBzdGlza27Em3RlIE1lbnUgYSBwb3TDqSAwLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImVtZXJnZW5jeV9jYWxsX2RpYWxvZ19udW1iZXJfZm9yX2Rpc3BsYXkiIG1zZ2lkPSI2OTYxOTIxMDMxOTUwOTA5NzAiPiLEjMOtc2xvIHTDrXPFiG92w6kgbGlua3kiPC9zdHJpbmc+CkBAIC01NDEsNiArNTQ0LDcgQEAKICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fcmV0dXJuX3RvX2NhbGwiIG1zZ2lkPSI1MjQ0MjU5Nzg1NTAwMDQwMDIxIj4iWmF2b2xhdCB6cMSbdCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fcGF0dGVybl9jb3JyZWN0IiBtc2dpZD0iOTAzOTAwODY1MDM2MjI2MTIzNyI+IlNwcsOhdm7EmyEiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3BhdHRlcm5fd3JvbmciIG1zZ2lkPSI0ODE3NTgzMjc5MDUzMTEyMzEyIj4iWmt1c3RlIHRvIHByb3PDrW0gem5vdnUiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3Bhc3N3b3JkX3dyb25nIiBtc2dpZD0iNjIzNzQ0MzY1NzM1ODE2ODgxOSI+IlprdXN0ZSB0byBwcm9zw61tIHpub3Z1Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9wbHVnZ2VkX2luIiBtc2dpZD0iNjEzMzQzODUyODQyOTQ0NDM1Ij4iTmFiw61qZW7DrSAoPHhsaWZmOmcgaWQ9Ik5VTUJFUiI+JWQ8L3hsaWZmOmc+PHhsaWZmOmcgaWQ9IlBFUkNFTlQiPiUlPC94bGlmZjpnPikiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX2NoYXJnZWQiIG1zZ2lkPSI0OTM4OTMwNDU5NjIwOTg5OTcyIj4iTmFiaXRvLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fYmF0dGVyeV9zaG9ydCIgbXNnaWQ9IjM2MTc1NDkxNzg2MDMzNTQ2NTYiPiI8eGxpZmY6ZyBpZD0iTlVNQkVSIj4lZDwveGxpZmY6Zz4gPHhsaWZmOmcgaWQ9IlBFUkNFTlQiPiUlPC94bGlmZjpnPiI8L3N0cmluZz4KQEAgLTU1NSw2ICs1NTksOCBAQAogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9zaW1fbG9ja2VkX21lc3NhZ2UiIG1zZ2lkPSI4MDY2NjYwMTI5MjA2MDAxMDM5Ij4iS2FydGEgU0lNIGplIHphYmxva292w6FuYS4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3NpbV91bmxvY2tfcHJvZ3Jlc3NfZGlhbG9nX21lc3NhZ2UiIG1zZ2lkPSI1OTUzMjMyMTQwNTI4ODEyNjQiPiJPZGJsb2tvdsOhbsOtIGthcnR5IFNJTS4uLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fdG9vX21hbnlfZmFpbGVkX2F0dGVtcHRzX2RpYWxvZ19tZXNzYWdlIiBtc2dpZD0iMzUxNDc0MjEwNjA2Njg3NzQ3NiI+Ijx4bGlmZjpnIGlkPSJOVU1CRVJfMCI+JWQ8L3hsaWZmOmc+a3LDoXQganN0ZSBuYWtyZXNsaWxpIG5lc3Byw6F2bsOpIGJlenBlxI1ub3N0bsOtIGdlc3RvLiAiXG5cbiJPcGFrdWp0ZSBwcm9zw61tIGFrY2kgemEgPHhsaWZmOmcgaWQ9Ik5VTUJFUl8xIj4lZDwveGxpZmY6Zz4gcy4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3Rvb19tYW55X2ZhaWxlZF9wYXNzd29yZF9hdHRlbXB0c19kaWFsb2dfbWVzc2FnZSIgbXNnaWQ9IjQ5MDYwMzQzNzY0MjUxNzUzODEiPiJWw61jZWtyw6F0ICg8eGxpZmY6ZyBpZD0iTlVNQkVSXzAiPiVkPC94bGlmZjpnPikganN0ZSBuZXNwcsOhdm7EmyB6YWRhbGkgaGVzbG8uICJcblxuIlprdXN0ZSB0byB6bm92dSB6YSA8eGxpZmY6ZyBpZD0iTlVNQkVSXzEiPiVkPC94bGlmZjpnPiBzLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fdG9vX21hbnlfZmFpbGVkX3Bpbl9hdHRlbXB0c19kaWFsb2dfbWVzc2FnZSIgbXNnaWQ9IjY4Mjc3NDkyMzE0NjUxNDU1OTAiPiJWw61jZWtyw6F0ICg8eGxpZmY6ZyBpZD0iTlVNQkVSXzAiPiVkPC94bGlmZjpnPikganN0ZSBuZXNwcsOhdm7EmyB6YWRhbGkga8OzZCBQSU4uICJcblxuIlprdXN0ZSB0byB6bm92dSB6YSA8eGxpZmY6ZyBpZD0iTlVNQkVSXzEiPiVkPC94bGlmZjpnPiBzLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fZmFpbGVkX2F0dGVtcHRzX2FsbW9zdF9nbG9naW4iIG1zZ2lkPSIzMzUxMDEzODQyMzIwMTI3ODI3Ij4iPHhsaWZmOmcgaWQ9Ik5VTUJFUl8wIj4lZDwveGxpZmY6Zz5rcsOhdCBqc3RlIG5lc3Byw6F2bsSbIG5ha3Jlc2xpbGkgc3bDqSBiZXpwZcSNbm9zdG7DrSBnZXN0by4gUG8gZGFsxaHDrWNoIG5lw7pzcMSbxaFuw71jaCBwb2t1c2VjaCAoPHhsaWZmOmcgaWQ9Ik5VTUJFUl8xIj4lZDwveGxpZmY6Zz4pIGJ1ZGV0ZSBwb8W+w6Fkw6FuaSBvIG9kZW3EjWVuw60gdGVsZWZvbnUgcG9tb2PDrSBwxZlpaGzDocWhZW7DrSBkbyDDusSNdHUgR29vZ2xlLiJcblxuIiBBa2NpIHByb3PDrW0gb3Bha3VqdGUgemEgbsSba29saWsgc2VrdW5kICg8eGxpZmY6ZyBpZD0iTlVNQkVSXzIiPiVkPC94bGlmZjpnPikuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl90b29fbWFueV9mYWlsZWRfYXR0ZW1wdHNfY291bnRkb3duIiBtc2dpZD0iNjI1MTQ4MDM0MzM5NDM4OTY2NSI+IlNla3VuZHkgemLDvXZhasOtY8OtIGRvIGRhbMWhw61obyBwb2t1c3U6IDx4bGlmZjpnIGlkPSJOVU1CRVIiPiVkPC94bGlmZjpnPi4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX2ZvcmdvdF9wYXR0ZXJuX2J1dHRvbl90ZXh0IiBtc2dpZD0iMjYyNjk5OTQ0OTYxMDY5NTkzMCI+IlphcG9tbsSbbGkganN0ZSBnZXN0bz8iPC9zdHJpbmc+CkBAIC02OTksMTQgKzcwNSwxNCBAQAogICAgIDxzdHJpbmcgbmFtZT0iZWxhcHNlZF90aW1lX3Nob3J0X2Zvcm1hdF9tbV9zcyIgbXNnaWQ9IjQ0MzE1NTU5NDM4Mjg3MTE0NzMiPiI8eGxpZmY6ZyBpZD0iTUlOVVRFUyI+JTEkMDJkPC94bGlmZjpnPjo8eGxpZmY6ZyBpZD0iU0VDT05EUyI+JTIkMDJkPC94bGlmZjpnPiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImVsYXBzZWRfdGltZV9zaG9ydF9mb3JtYXRfaF9tbV9zcyIgbXNnaWQ9IjE4NDYwNzE5OTc2MTY2NTQxMjQiPiI8eGxpZmY6ZyBpZD0iSE9VUlMiPiUxJGQ8L3hsaWZmOmc+Ojx4bGlmZjpnIGlkPSJNSU5VVEVTIj4lMiQwMmQ8L3hsaWZmOmc+Ojx4bGlmZjpnIGlkPSJTRUNPTkRTIj4lMyQwMmQ8L3hsaWZmOmc+Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ic2VsZWN0QWxsIiBtc2dpZD0iNjg3NjUxODkyNTg0NDEyOTMzMSI+IlZ5YnJhdCB2xaFlIjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gMzg4OTE0OTEyMzYyNjg4ODYzNyAtLT4gICAgIDxzdHJpbmcgbmFtZT0ic2VsZWN0VGV4dCIgbXNnaWQ9IjQ4NjIzNTkzMTEwODg4OTg4NzgiPiJPem5hxI1pdCB0ZXh0Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iY3V0IiBtc2dpZD0iMzA5MjU2OTQwODQzODYyNjI2MSI+IlZ5am1vdXQiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJjb3B5IiBtc2dpZD0iMjY4MTk0NjIyOTUzMzUxMTk4NyI+IktvcMOtcm92YXQiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwYXN0ZSIgbXNnaWQ9IjU2Mjk4ODA4MzY4MDUwMzY0MzMiPiJWbG/Fvml0Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iY29weVVybCIgbXNnaWQ9IjI1MzgyMTE1Nzk1OTYwNjc0MDIiPiJLb3DDrXJvdmF0IGFkcmVzdSBVUkwiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJzZWxlY3RUZXh0TW9kZSIgbXNnaWQ9IjY3Mzg1NTYzNDg4NjEzNDcyNDAiPiJWeWJyYXQgdGV4dC4uLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InRleHRTZWxlY3Rpb25DQUJUaXRsZSIgbXNnaWQ9IjUyMzY4NTAzOTQzNzA4MjAzNTciPiJWw71ixJtyIHRleHR1Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iaW5wdXRNZXRob2QiIG1zZ2lkPSIxNjUzNjMwMDYyMzA0NTY3ODc5Ij4iTWV0b2RhIHphZMOhdsOhbsOtIGRhdCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImFkZFRvRGljdGlvbmFyeSIgbXNnaWQ9Ijg3OTM2MjQ5OTE2ODY5NDg3MDkiPiJQxZlpZGF0IHNsb3ZvIOKAnjx4bGlmZjpnIGlkPSJXT1JEIj4lczwveGxpZmY6Zz7igJwgZG8gc2xvdm7DrWt1Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iZWRpdFRleHRNZW51VGl0bGUiIG1zZ2lkPSIxNjcyOTg5MTc2OTU4NTgxNDUyIj4iw5pwcmF2eSB0ZXh0dSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImVkaXRUZXh0TWVudVRpdGxlIiBtc2dpZD0iNDkwOTEzNTU2NDk0MTgxNTQ5NCI+Ik9wZXJhY2UgcyB0ZXh0ZW0iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb3dfaW50ZXJuYWxfc3RvcmFnZV92aWV3X3RpdGxlIiBtc2dpZD0iMTM5OTczMjQwODcwMTY5NzU0NiI+Ik3DoWxvIHBhbcSbdGkiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb3dfaW50ZXJuYWxfc3RvcmFnZV92aWV3X3RleHQiIG1zZ2lkPSI2MzUxMDY1NDQ2MTYzNzg4MzYiPiJWIHRlbGVmb251IHpiw712w6EgbcOhbG8gbcOtc3RhIHBybyB1a2zDoWTDoW7DrSBkYXQuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ib2siIG1zZ2lkPSI1OTcwMDYwNDMwNTYyNTI0OTEwIj4iT0siPC9zdHJpbmc+CkBAIC03MTQsNiArNzIwLDcgQEAKICAgICA8c3RyaW5nIG5hbWU9InllcyIgbXNnaWQ9IjUzNjI5ODIzMDMzMzc5NjkzMTIiPiJPSyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9Im5vIiBtc2dpZD0iNTE0MTUzMTA0NDkzNTU0MTQ5NyI+IlpydcWhaXQiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJkaWFsb2dfYWxlcnRfdGl0bGUiIG1zZ2lkPSIyMDQ5NjU4NzA4NjA5MDQzMTAzIj4iVXBvem9ybsSbbsOtIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibG9hZGluZyIgbXNnaWQ9IjE3NjA3MjQ5OTg5MjgyNTUyNTAiPiJOYcSNw610w6Fuw60uLi4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJjYXBpdGFsX29uIiBtc2dpZD0iMTU0NDY4Mjc1NTUxNDQ5NDI5OCI+IlpBUE5VVE8iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJjYXBpdGFsX29mZiIgbXNnaWQ9IjY4MTU4NzAzODY5NzI4MDU4MzIiPiJWWVBOT1VUIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0id2hpY2hBcHBsaWNhdGlvbiIgbXNnaWQ9IjQ1MzMxODU5NDcwNjQ3NzMzODYiPiJEb2tvbsSNaXQgYWtjaSBwb21vY8OtIGFwbGlrYWNlIjwvc3RyaW5nPgpAQCAtODU0LDE1ICs4NjEsMjQgQEAKICAgICA8c3RyaW5nIG5hbWU9ImwydHBfaXBzZWNfcHNrX3Zwbl9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM5NDUwNDM1NjQwMDgzMDMyMzkiPiJTw63FpSBWUE4gTDJUUC9JUFNlYyBzIHDFmWVkc2TDrWxlbsO9bSBrbMOtxI1lbSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImwydHBfaXBzZWNfY3J0X3Zwbl9kZXNjcmlwdGlvbiIgbXNnaWQ9IjUzODI3MTQwNzMxMDM2NTM1NzciPiJTw63FpSBWUE4gTDJUUC9JUFNlYyBzIGNlcnRpZmlrw6F0ZW0iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ1cGxvYWRfZmlsZSIgbXNnaWQ9IjI4OTc5NTcxNzIzNjY3MzA0MTYiPiJadm9saXQgc291Ym9yIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibm9fZmlsZV9jaG9zZW4iIG1zZ2lkPSI2MzYzNjQ4NTYyMTcwNzU5NDY1Ij4iTmVuw60gdnlicsOhbiDFvsOhZG7DvSBzb3Vib3IiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJyZXNldCIgbXNnaWQ9IjI0NDgxNjgwODA5NjQyMDk5MDgiPiJSZXNldG92YXQiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJzdWJtaXQiIG1zZ2lkPSIxNjAyMzM1NTcyMDg5OTExOTQxIj4iT2Rlc2xhdCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImRlc2NyaXB0aW9uX3N0YXIiIG1zZ2lkPSIyNjU0MzE5ODc0OTA4NTc2MTMzIj4ib2Jsw61iZW7DqSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImNhcl9tb2RlX2Rpc2FibGVfbm90aWZpY2F0aW9uX3RpdGxlIiBtc2dpZD0iMzE2NDc2ODIxMjAwMzg2NDMxNiI+IkFrdGl2b3bDoW4gcmXFvmltIFYgYXV0xJsiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJjYXJfbW9kZV9kaXNhYmxlX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBtc2dpZD0iNjY4NjYzNjI2NzIxNjc1NjE0Ij4iVnliZXJ0ZSwgY2hjZXRlLWxpIHVrb27EjWl0IHJlxb5pbSBOYSBjZXN0xJsuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idGV0aGVyZWRfbm90aWZpY2F0aW9uX3RpdGxlIiBtc2dpZD0iMzE0NjY5NDIzNDM5ODIwMjYwMSI+IkplIGFrdGl2bsOtIHRldGhlcmluZyBuZWJvIGhvdHNwb3QiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ0ZXRoZXJlZF9ub3RpZmljYXRpb25fbWVzc2FnZSIgbXNnaWQ9IjMwNjcxMDgzMjM5MDMwNDg5MjciPiJEb3R5a2VtIHphaMOhasOtdGUga29uZmlndXJhY2kiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJiYWNrX2J1dHRvbl9sYWJlbCIgbXNnaWQ9IjIzMDA0NzAwMDQ1MDMzNDM0MzkiPiJacMSbdCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im5leHRfYnV0dG9uX2xhYmVsIiBtc2dpZD0iMTA4MDU1NTEwNDY3Nzk5MjQwOCI+IkRhbMWhw60iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJza2lwX2J1dHRvbl9sYWJlbCIgbXNnaWQ9IjEyNzUzNjIyOTk0NzE2MzE4MTkiPiJQxZllc2tvxI1pdCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InRocm90dGxlX3dhcm5pbmdfbm90aWZpY2F0aW9uX3RpdGxlIiBtc2dpZD0iNDg5MDg5NDI2NzQ1NDg2NzI3NiI+IlZ5c29rw6kgdnl1xb5pdMOtIG1vYmlsbsOtY2ggZGF0Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idGhyb3R0bGVfd2FybmluZ19ub3RpZmljYXRpb25fbWVzc2FnZSIgbXNnaWQ9IjI2MDk3MzQ3NjM4NDU3MDU3MDgiPiJEb3R5a2VtIHpvYnJhesOtdGUgZGFsxaHDrSBpbmZvcm1hY2UgbyB2eXXFvml0w60gbW9iaWxuw61jaCBkYXQiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ0aHJvdHRsZWRfbm90aWZpY2F0aW9uX3RpdGxlIiBtc2dpZD0iNjI2OTU0MTg5NzcyOTc4MTMzMiI+IkJ5bCBwxZlla3JvxI1lbiBsaW1pdCBtb2JpbG7DrWNoIGRhdCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InRocm90dGxlZF9ub3RpZmljYXRpb25fbWVzc2FnZSIgbXNnaWQ9IjQ3MTIzNjk4NTY2MDEyNzUxNDYiPiJEb3R5a2VtIHpvYnJhesOtdGUgZGFsxaHDrSBpbmZvcm1hY2UgbyB2eXXFvml0w60gbW9iaWxuw61jaCBkYXQiPC9zdHJpbmc+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3Igbm9fbWF0Y2hlcyAoODEyOTQyMTkwODkxNTg0MDczNykgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBmaW5kX29uX3BhZ2UgKDE5NDY3OTkyMzM4MjI4MjAzODQpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgbWF0Y2hlc19mb3VuZDpvbmUgKDgxNjcxNDcwODExMzY1Nzk0MzkpIC0tPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIG1hdGNoZXNfZm91bmQ6b3RoZXIgKDQ2NDE4NzI3OTcwNjc2MDkxNzcpIC0tPgogPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvdmFsdWVzLWRhL3N0cmluZ3MueG1sIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy1kYS9zdHJpbmdzLnhtbAppbmRleCA3YjNlODJjLi5kNjRiNTQ4IDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvdmFsdWVzLWRhL3N0cmluZ3MueG1sCisrKyBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMtZGEvc3RyaW5ncy54bWwKQEAgLTQzMiw2ICs0MzIsMTAgQEAKICAgICA8c3RyaW5nIG5hbWU9InBvbGljeWRlc2NfZm9yY2VMb2NrIiBtc2dpZD0iMjgxOTg2ODY2NDk0NjA4OTc0MCI+IktvbnRyb2wgbsOlciBlbmhlZGVuIGzDpXNlcywgc8OlIGR1IHNrYWwgaW5kdGFzdGUgYWRnYW5nc2tvZGVuIGlnZW4uIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icG9saWN5bGFiX3dpcGVEYXRhIiBtc2dpZD0iMzkxMDU0NTQ0Njc1ODYzOTcxMyI+IlNsZXQgYWxsZSBkYXRhIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icG9saWN5ZGVzY193aXBlRGF0YSIgbXNnaWQ9IjIzMTQwNjA5MzM3OTYzOTYyMDUiPiJGb3JldGFnIGVuIGZhYnJpa3NudWxzdGlsbGluZywgZGVyIHNsZXR0ZXIgYWxsZSBkaW5lIGRhdGEgdWRlbiBiZWtyw6ZmdGVsc2UuIjwvc3RyaW5nPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBvbGljeWxhYl9zZXRHbG9iYWxQcm94eSAoMjc4NDgyODI5Mzc0Nzc5MTQ0NikgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwb2xpY3lkZXNjX3NldEdsb2JhbFByb3h5ICg2Mzg3NDk3NDY2NjYwMTU0OTMxKSAtLT4KKyAgICA8c2tpcCAvPgogICA8c3RyaW5nLWFycmF5IG5hbWU9InBob25lVHlwZXMiPgogICAgIDxpdGVtIG1zZ2lkPSI4OTAxMDk4MzM2NjU4NzEwMzU5Ij4iSGplbSI8L2l0ZW0+CiAgICAgPGl0ZW0gbXNnaWQ9Ijg2OTkyMzY1MDUyNzEzNjYxNSI+Ik1vYmlsIjwvaXRlbT4KQEAgLTUyNSwxMCArNTI5LDkgQEAKICAgICA8c3RyaW5nIG5hbWU9Im9yZ1R5cGVXb3JrIiBtc2dpZD0iMjkyNjg4NzA1MDUzNjM4NzIiPiJBcmJlamRlIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ib3JnVHlwZU90aGVyIiBtc2dpZD0iMzk1MTc4MTEzMTU3MDEyNDA4MiI+IkFuZHJlIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ib3JnVHlwZUN1c3RvbSIgbXNnaWQ9IjIyNTUyMzQxNTM3MjA4ODMyMiI+IlRpbHBhc3NldCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImNvbnRhY3Rfc3RhdHVzX3VwZGF0ZV9hdHRyaWJ1dGlvbiIgbXNnaWQ9IjUxMTI1ODk4ODYwOTQ0MDI3OTUiPiJ2aWEgPHhsaWZmOmcgaWQ9IlNPVVJDRSI+JTEkczwveGxpZmY6Zz4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJjb250YWN0X3N0YXR1c191cGRhdGVfYXR0cmlidXRpb25fd2l0aF9kYXRlIiBtc2dpZD0iNTk0NTM4NjM3NjM2OTk3OTkwOSI+Ijx4bGlmZjpnIGlkPSJEQVRFIj4lMSRzPC94bGlmZjpnPiB2aWEgPHhsaWZmOmcgaWQ9IlNPVVJDRSI+JTIkczwveGxpZmY6Zz4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJrZXlndWFyZF9wYXNzd29yZF9lbnRlcl9waW5fY29kZSIgbXNnaWQ9IjM3MzE0ODg4MjcyMTg4NzYxMTUiPiJJbmR0YXN0IFBJTi1rb2RlIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ia2V5Z3VhcmRfcGFzc3dvcmRfZW50ZXJfcGFzc3dvcmRfY29kZSIgbXNnaWQ9IjkxMzgxNTgzNDQ4MTMyMTM3NTQiPiJJbmR0YXN0IGFkZ2FuZ3Nrb2RlIGZvciBhdCBsw6VzZSBvcCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImtleWd1YXJkX3Bhc3N3b3JkX2VudGVyX3Bpbl9wYXNzd29yZF9jb2RlIiBtc2dpZD0iNjM4MzQ3MDc1NjI1NDkxNTE0Ij4iSW5kdGFzdCBwaW5rb2RlIGZvciBhdCBsw6VzZSBvcCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImtleWd1YXJkX3Bhc3N3b3JkX3dyb25nX3Bpbl9jb2RlIiBtc2dpZD0iMTI5NTk4NDExNDMzODEwNzcxOCI+IkZvcmtlcnQgUElOLWtvZGUhIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ia2V5Z3VhcmRfbGFiZWxfdGV4dCIgbXNnaWQ9Ijg2MTc5NjQ2MTAyODI5ODQyNCI+IlRyeWsgcMOlIE1lbnUgb2cgZGVybsOmc3QgcMOlIDAgZm9yIGF0IGzDpXNlIG9wLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImVtZXJnZW5jeV9jYWxsX2RpYWxvZ19udW1iZXJfZm9yX2Rpc3BsYXkiIG1zZ2lkPSI2OTYxOTIxMDMxOTUwOTA5NzAiPiJOw7hkbnVtbWVyIjwvc3RyaW5nPgpAQCAtNTQxLDYgKzU0NCw3IEBACiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3JldHVybl90b19jYWxsIiBtc2dpZD0iNTI0NDI1OTc4NTUwMDA0MDAyMSI+IlRpbGJhZ2UgdGlsIG9wa2FsZCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fcGF0dGVybl9jb3JyZWN0IiBtc2dpZD0iOTAzOTAwODY1MDM2MjI2MTIzNyI+IlJpZ3RpZ3QhIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9wYXR0ZXJuX3dyb25nIiBtc2dpZD0iNDgxNzU4MzI3OTA1MzExMjMxMiI+IkJla2xhZ2VyISBQcsO4diBpZ2VuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9wYXNzd29yZF93cm9uZyIgbXNnaWQ9IjYyMzc0NDM2NTczNTgxNjg4MTkiPiJCZWtsYWdlciEgUHLDuHYgaWdlbiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fcGx1Z2dlZF9pbiIgbXNnaWQ9IjYxMzM0Mzg1Mjg0Mjk0NDQzNSI+Ik9wbGFkZXIgKDx4bGlmZjpnIGlkPSJOVU1CRVIiPiVkPC94bGlmZjpnPjx4bGlmZjpnIGlkPSJQRVJDRU5UIj4lJTwveGxpZmY6Zz4pIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9jaGFyZ2VkIiBtc2dpZD0iNDkzODkzMDQ1OTYyMDk4OTk3MiI+Ik9wbGFkdC4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX2JhdHRlcnlfc2hvcnQiIG1zZ2lkPSIzNjE3NTQ5MTc4NjAzMzU0NjU2Ij4iPHhsaWZmOmcgaWQ9Ik5VTUJFUiI+JWQ8L3hsaWZmOmc+IDx4bGlmZjpnIGlkPSJQRVJDRU5UIj4lJTwveGxpZmY6Zz4iPC9zdHJpbmc+CkBAIC01NTUsNiArNTU5LDggQEAKICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fc2ltX2xvY2tlZF9tZXNzYWdlIiBtc2dpZD0iODA2NjY2MDEyOTIwNjAwMTAzOSI+IlNJTS1rb3J0ZXQgZXIgbMOlc3QuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9zaW1fdW5sb2NrX3Byb2dyZXNzX2RpYWxvZ19tZXNzYWdlIiBtc2dpZD0iNTk1MzIzMjE0MDUyODgxMjY0Ij4iTMOlc2VyIFNJTS1rb3J0ZXQgb3AgLi4uIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl90b29fbWFueV9mYWlsZWRfYXR0ZW1wdHNfZGlhbG9nX21lc3NhZ2UiIG1zZ2lkPSIzNTE0NzQyMTA2MDY2ODc3NDc2Ij4iRHUgaGFyIHRlZ25ldCBkaXQgb3Bsw6VzbmluZ3Ntw7huc3RlciBmb3JrZXJ0IDx4bGlmZjpnIGlkPSJOVU1CRVJfMCI+JWQ8L3hsaWZmOmc+IGdhbmdlLiAiXG5cbiJQcsO4diBpZ2VuIG9tIDx4bGlmZjpnIGlkPSJOVU1CRVJfMSI+JWQ8L3hsaWZmOmc+IHNla3VuZGVyLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fdG9vX21hbnlfZmFpbGVkX3Bhc3N3b3JkX2F0dGVtcHRzX2RpYWxvZ19tZXNzYWdlIiBtc2dpZD0iNDkwNjAzNDM3NjQyNTE3NTM4MSI+IkR1IGhhciBpbmR0YXN0ZXQgZGluIGFkZ2FuZ3Nrb2RlIGZvcmtlcnQgPHhsaWZmOmcgaWQ9Ik5VTUJFUl8wIj4lZDwveGxpZmY6Zz4gZ2FuZ2UuICJcblxuIlByw7h2IGlnZW4gb20gPHhsaWZmOmcgaWQ9Ik5VTUJFUl8xIj4lZDwveGxpZmY6Zz4gc2VrdW5kZXIuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl90b29fbWFueV9mYWlsZWRfcGluX2F0dGVtcHRzX2RpYWxvZ19tZXNzYWdlIiBtc2dpZD0iNjgyNzc0OTIzMTQ2NTE0NTU5MCI+IkR1IGhhciBpbmR0YXN0ZXQgZGluIHBpbmtvZGUgZm9ya2VydCA8eGxpZmY6ZyBpZD0iTlVNQkVSXzAiPiVkPC94bGlmZjpnPiBnYW5nZS4gIlxuXG4iUHLDuHYgaWdlbiBvbSA8eGxpZmY6ZyBpZD0iTlVNQkVSXzEiPiVkPC94bGlmZjpnPiBzZWt1bmRlci4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX2ZhaWxlZF9hdHRlbXB0c19hbG1vc3RfZ2xvZ2luIiBtc2dpZD0iMzM1MTAxMzg0MjMyMDEyNzgyNyI+IkR1IGhhciB0ZWduZXQgZGl0IG9wbMOlc25pbmdzbcO4bnN0ZXIgZm9ya2VydCA8eGxpZmY6ZyBpZD0iTlVNQkVSXzAiPiVkPC94bGlmZjpnPiBnYW5nZS4gRWZ0ZXIgPHhsaWZmOmcgaWQ9Ik5VTUJFUl8xIj4lZDwveGxpZmY6Zz4gZm9yc8O4ZyBtZXJlIHZpbCBkdSBibGl2ZSBiZWR0IG9tIGF0IGzDpXNlIGRpbiB0ZWxlZm9uIG9wIHZlZCBoasOmbHAgYWYgZGl0IEdvb2dsZS1sb2dpbiJcblxuIiBQcsO4diBpZ2VuIG9tIDx4bGlmZjpnIGlkPSJOVU1CRVJfMiI+JWQ8L3hsaWZmOmc+IHNla3VuZGVyLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fdG9vX21hbnlfZmFpbGVkX2F0dGVtcHRzX2NvdW50ZG93biIgbXNnaWQ9IjYyNTE0ODAzNDMzOTQzODk2NjUiPiJQcsO4diBpZ2VuIG9tIDx4bGlmZjpnIGlkPSJOVU1CRVIiPiVkPC94bGlmZjpnPiBzZWt1bmRlci4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX2ZvcmdvdF9wYXR0ZXJuX2J1dHRvbl90ZXh0IiBtc2dpZD0iMjYyNjk5OTQ0OTYxMDY5NTkzMCI+IkhhciBkdSBnbGVtdCBtw7huc3RyZXQ/Ijwvc3RyaW5nPgpAQCAtNjk5LDE0ICs3MDUsMTQgQEAKICAgICA8c3RyaW5nIG5hbWU9ImVsYXBzZWRfdGltZV9zaG9ydF9mb3JtYXRfbW1fc3MiIG1zZ2lkPSI0NDMxNTU1OTQzODI4NzExNDczIj4iPHhsaWZmOmcgaWQ9Ik1JTlVURVMiPiUxJDAyZDwveGxpZmY6Zz46PHhsaWZmOmcgaWQ9IlNFQ09ORFMiPiUyJDAyZDwveGxpZmY6Zz4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJlbGFwc2VkX3RpbWVfc2hvcnRfZm9ybWF0X2hfbW1fc3MiIG1zZ2lkPSIxODQ2MDcxOTk3NjE2NjU0MTI0Ij4iPHhsaWZmOmcgaWQ9IkhPVVJTIj4lMSRkPC94bGlmZjpnPjo8eGxpZmY6ZyBpZD0iTUlOVVRFUyI+JTIkMDJkPC94bGlmZjpnPjo8eGxpZmY6ZyBpZD0iU0VDT05EUyI+JTMkMDJkPC94bGlmZjpnPiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InNlbGVjdEFsbCIgbXNnaWQ9IjY4NzY1MTg5MjU4NDQxMjkzMzEiPiJWw6ZsZyBhbGxlIjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gMzg4OTE0OTEyMzYyNjg4ODYzNyAtLT4gICAgIDxzdHJpbmcgbmFtZT0ic2VsZWN0VGV4dCIgbXNnaWQ9IjQ4NjIzNTkzMTEwODg4OTg4NzgiPiJNYXJrZXIgdGVrc3QiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJjdXQiIG1zZ2lkPSIzMDkyNTY5NDA4NDM4NjI2MjYxIj4iS2xpcCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImNvcHkiIG1zZ2lkPSIyNjgxOTQ2MjI5NTMzNTExOTg3Ij4iS29waWVyIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGFzdGUiIG1zZ2lkPSI1NjI5ODgwODM2ODA1MDM2NDMzIj4iSW5kc8OmdCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImNvcHlVcmwiIG1zZ2lkPSIyNTM4MjExNTc5NTk2MDY3NDAyIj4iS29waWVyIHdlYmFkcmVzc2UiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJzZWxlY3RUZXh0TW9kZSIgbXNnaWQ9IjY3Mzg1NTYzNDg4NjEzNDcyNDAiPiJNYXJrZXIgdGVrc3QuLi4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJ0ZXh0U2VsZWN0aW9uQ0FCVGl0bGUiIG1zZ2lkPSI1MjM2ODUwMzk0MzcwODIwMzU3Ij4iVGVrc3RtYXJrZXJpbmciPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJpbnB1dE1ldGhvZCIgbXNnaWQ9IjE2NTM2MzAwNjIzMDQ1Njc4NzkiPiJJbnB1dG1ldG9kZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImFkZFRvRGljdGlvbmFyeSIgbXNnaWQ9Ijg3OTM2MjQ5OTE2ODY5NDg3MDkiPiJGw7hqIFwiPHhsaWZmOmcgaWQ9IldPUkQiPiVzPC94bGlmZjpnPlwiIHRpbCBvcmRib2ciPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJlZGl0VGV4dE1lbnVUaXRsZSIgbXNnaWQ9IjE2NzI5ODkxNzY5NTg1ODE0NTIiPiJSZWRpZ2VyIHRla3N0Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZWRpdFRleHRNZW51VGl0bGUiIG1zZ2lkPSI0OTA5MTM1NTY0OTQxODE1NDk0Ij4iVGVrc3RoYW5kbGluZ2VyIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG93X2ludGVybmFsX3N0b3JhZ2Vfdmlld190aXRsZSIgbXNnaWQ9IjEzOTk3MzI0MDg3MDE2OTc1NDYiPiJEZXIgZXIgaWtrZSBzw6UgbWVnZXQgcGxhZHMgdGlsYmFnZSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9Imxvd19pbnRlcm5hbF9zdG9yYWdlX3ZpZXdfdGV4dCIgbXNnaWQ9IjYzNTEwNjU0NDYxNjM3ODgzNiI+IkRlciBlciBuw6ZzdGVuIGlra2UgbWVyZSBwbGFkcyBww6UgdGVsZWZvbmVuLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9Im9rIiBtc2dpZD0iNTk3MDA2MDQzMDU2MjUyNDkxMCI+Ik9LIjwvc3RyaW5nPgpAQCAtNzE0LDYgKzcyMCw3IEBACiAgICAgPHN0cmluZyBuYW1lPSJ5ZXMiIG1zZ2lkPSI1MzYyOTgyMzAzMzM3OTY5MzEyIj4iT0siPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJubyIgbXNnaWQ9IjUxNDE1MzEwNDQ5MzU1NDE0OTciPiJBbm51bGxlciI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImRpYWxvZ19hbGVydF90aXRsZSIgbXNnaWQ9IjIwNDk2NTg3MDg2MDkwNDMxMDMiPiJCZW3DpnJrIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibG9hZGluZyIgbXNnaWQ9IjE3NjA3MjQ5OTg5MjgyNTUyNTAiPiJJbmRsw6ZzZXIuLi4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJjYXBpdGFsX29uIiBtc2dpZD0iMTU0NDY4Mjc1NTUxNDQ5NDI5OCI+IlRJTCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImNhcGl0YWxfb2ZmIiBtc2dpZD0iNjgxNTg3MDM4Njk3MjgwNTgzMiI+IkZSQSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9IndoaWNoQXBwbGljYXRpb24iIG1zZ2lkPSI0NTMzMTg1OTQ3MDY0NzczMzg2Ij4iRnVsZGbDuHIgaGFuZGxpbmcgdmVkIGhqw6ZscCBhZiI8L3N0cmluZz4KQEAgLTg1NCwxNSArODYxLDI0IEBACiAgICAgPHN0cmluZyBuYW1lPSJsMnRwX2lwc2VjX3Bza192cG5fZGVzY3JpcHRpb24iIG1zZ2lkPSIzOTQ1MDQzNTY0MDA4MzAzMjM5Ij4iTDJUUC9JUFNlYyBWUE4gYmFzZXJldCBww6UgZm9yaMOlbmRzZGVsdCBuw7hnbGVrb2RuaW5nIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibDJ0cF9pcHNlY19jcnRfdnBuX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNTM4MjcxNDA3MzEwMzY1MzU3NyI+IkNlcnRpZmlrYXRiYXNlcmV0IEwyVFAvSVBTZWMgVlBOIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idXBsb2FkX2ZpbGUiIG1zZ2lkPSIyODk3OTU3MTcyMzY2NzMwNDE2Ij4iVsOmbGcgZmlsIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibm9fZmlsZV9jaG9zZW4iIG1zZ2lkPSI2MzYzNjQ4NTYyMTcwNzU5NDY1Ij4iSW5nZW4gZmlsIGVyIHZhbGd0Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icmVzZXQiIG1zZ2lkPSIyNDQ4MTY4MDgwOTY0MjA5OTA4Ij4iTnVsc3RpbCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InN1Ym1pdCIgbXNnaWQ9IjE2MDIzMzU1NzIwODk5MTE5NDEiPiJTZW5kIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iZGVzY3JpcHRpb25fc3RhciIgbXNnaWQ9IjI2NTQzMTk4NzQ5MDg1NzYxMzMiPiJmYXZvcml0Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iY2FyX21vZGVfZGlzYWJsZV9ub3RpZmljYXRpb25fdGl0bGUiIG1zZ2lkPSIzMTY0NzY4MjEyMDAzODY0MzE2Ij4iQmlsdGlsc3RhbmQgZXIgYWt0aXZlcmV0Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iY2FyX21vZGVfZGlzYWJsZV9ub3RpZmljYXRpb25fbWVzc2FnZSIgbXNnaWQ9IjY2ODY2MzYyNjcyMTY3NTYxNCI+IlbDpmxnIGZvciBhdCBhZnNsdXR0ZSBiaWx0aWxzdGFuZC4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ0ZXRoZXJlZF9ub3RpZmljYXRpb25fdGl0bGUiIG1zZ2lkPSIzMTQ2Njk0MjM0Mzk4MjAyNjAxIj4iVGV0aGVyaW5nIGVsbGVyIGhvdHNwb3QgZXIgYWt0aXZ0Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idGV0aGVyZWRfbm90aWZpY2F0aW9uX21lc3NhZ2UiIG1zZ2lkPSIzMDY3MTA4MzIzOTAzMDQ4OTI3Ij4iVHJ5ayBmb3IgYXQga29uZmlndXJlcmUiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJiYWNrX2J1dHRvbl9sYWJlbCIgbXNnaWQ9IjIzMDA0NzAwMDQ1MDMzNDM0MzkiPiJUaWxiYWdlIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibmV4dF9idXR0b25fbGFiZWwiIG1zZ2lkPSIxMDgwNTU1MTA0Njc3OTkyNDA4Ij4iTsOmc3RlIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ic2tpcF9idXR0b25fbGFiZWwiIG1zZ2lkPSIxMjc1MzYyMjk5NDcxNjMxODE5Ij4iU3ByaW5nIG92ZXIiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ0aHJvdHRsZV93YXJuaW5nX25vdGlmaWNhdGlvbl90aXRsZSIgbXNnaWQ9IjQ4OTA4OTQyNjc0NTQ4NjcyNzYiPiJIw7hqdCBtb2JpbGRhdGFmb3JicnVnIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idGhyb3R0bGVfd2FybmluZ19ub3RpZmljYXRpb25fbWVzc2FnZSIgbXNnaWQ9IjI2MDk3MzQ3NjM4NDU3MDU3MDgiPiJUcnlrIGZvciBvcGx5c25pbmdlciBvbSBicnVnIGFmIG1vYmlsZGF0YSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InRocm90dGxlZF9ub3RpZmljYXRpb25fdGl0bGUiIG1zZ2lkPSI2MjY5NTQxODk3NzI5NzgxMzMyIj4iR3LDpm5zZW4gZm9yIG1vYmlsZGF0YSBlciBvdmVyc2tyZWRldCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InRocm90dGxlZF9ub3RpZmljYXRpb25fbWVzc2FnZSIgbXNnaWQ9IjQ3MTIzNjk4NTY2MDEyNzUxNDYiPiJUcnlrIGZvciBvcGx5c25pbmdlciBvbSBicnVnIGFmIG1vYmlsZGF0YSI8L3N0cmluZz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBub19tYXRjaGVzICg4MTI5NDIxOTA4OTE1ODQwNzM3KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGZpbmRfb25fcGFnZSAoMTk0Njc5OTIzMzgyMjgyMDM4NCkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBtYXRjaGVzX2ZvdW5kOm9uZSAoODE2NzE0NzA4MTEzNjU3OTQzOSkgLS0+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgbWF0Y2hlc19mb3VuZDpvdGhlciAoNDY0MTg3Mjc5NzA2NzYwOTE3NykgLS0+CiA8L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy92YWx1ZXMtZGUvc3RyaW5ncy54bWwgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzLWRlL3N0cmluZ3MueG1sCmluZGV4IDRjNWNjOGMuLjFmZTA4NGMgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy92YWx1ZXMtZGUvc3RyaW5ncy54bWwKKysrIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy1kZS9zdHJpbmdzLnhtbApAQCAtNDMyLDYgKzQzMiwxMCBAQAogICAgIDxzdHJpbmcgbmFtZT0icG9saWN5ZGVzY19mb3JjZUxvY2siIG1zZ2lkPSIyODE5ODY4NjY0OTQ2MDg5NzQwIj4iU3RldWVydW5nIGRlciBHZXLDpHRlc3BlcnJlOyBlcmZvcmRlcnQgZGllIGVybmV1dGUgUGFzc3dvcnRlaW5nYWJlIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icG9saWN5bGFiX3dpcGVEYXRhIiBtc2dpZD0iMzkxMDU0NTQ0Njc1ODYzOTcxMyI+IkFsbGUgRGF0ZW4gbMO2c2NoZW4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwb2xpY3lkZXNjX3dpcGVEYXRhIiBtc2dpZD0iMjMxNDA2MDkzMzc5NjM5NjIwNSI+Ilp1csO8Y2tzZXR6ZW4gYXVmIGRpZSBXZXJrc2VpbnN0ZWxsdW5nZW4uIERhYmVpIHdlcmRlbiBhbGxlIElocmUgRGF0ZW4gb2huZSBOYWNoZnJhZ2UgZ2Vsw7ZzY2h0LiI8L3N0cmluZz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwb2xpY3lsYWJfc2V0R2xvYmFsUHJveHkgKDI3ODQ4MjgyOTM3NDc3OTE0NDYpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcG9saWN5ZGVzY19zZXRHbG9iYWxQcm94eSAoNjM4NzQ5NzQ2NjY2MDE1NDkzMSkgLS0+CisgICAgPHNraXAgLz4KICAgPHN0cmluZy1hcnJheSBuYW1lPSJwaG9uZVR5cGVzIj4KICAgICA8aXRlbSBtc2dpZD0iODkwMTA5ODMzNjY1ODcxMDM1OSI+IlByaXZhdCI8L2l0ZW0+CiAgICAgPGl0ZW0gbXNnaWQ9Ijg2OTkyMzY1MDUyNzEzNjYxNSI+Ik1vYmlsIjwvaXRlbT4KQEAgLTUyNSwxMCArNTI5LDkgQEAKICAgICA8c3RyaW5nIG5hbWU9Im9yZ1R5cGVXb3JrIiBtc2dpZD0iMjkyNjg4NzA1MDUzNjM4NzIiPiJCZXJ1ZmxpY2giPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJvcmdUeXBlT3RoZXIiIG1zZ2lkPSIzOTUxNzgxMTMxNTcwMTI0MDgyIj4iQW5kZXJlIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ib3JnVHlwZUN1c3RvbSIgbXNnaWQ9IjIyNTUyMzQxNTM3MjA4ODMyMiI+IkJlbnV0emVyZGVmaW5pZXJ0Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iY29udGFjdF9zdGF0dXNfdXBkYXRlX2F0dHJpYnV0aW9uIiBtc2dpZD0iNTExMjU4OTg4NjA5NDQwMjc5NSI+IsO8YmVyIDx4bGlmZjpnIGlkPSJTT1VSQ0UiPiUxJHM8L3hsaWZmOmc+Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iY29udGFjdF9zdGF0dXNfdXBkYXRlX2F0dHJpYnV0aW9uX3dpdGhfZGF0ZSIgbXNnaWQ9IjU5NDUzODYzNzYzNjk5Nzk5MDkiPiI8eGxpZmY6ZyBpZD0iREFURSI+JTEkczwveGxpZmY6Zz4gw7xiZXIgPHhsaWZmOmcgaWQ9IlNPVVJDRSI+JTIkczwveGxpZmY6Zz4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJrZXlndWFyZF9wYXNzd29yZF9lbnRlcl9waW5fY29kZSIgbXNnaWQ9IjM3MzE0ODg4MjcyMTg4NzYxMTUiPiJQSU4tQ29kZSBlaW5nZWJlbiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImtleWd1YXJkX3Bhc3N3b3JkX2VudGVyX3Bhc3N3b3JkX2NvZGUiIG1zZ2lkPSI5MTM4MTU4MzQ0ODEzMjEzNzU0Ij4iUGFzc3dvcnQgenVtIEVudHNwZXJyZW4gZWluZ2ViZW4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJrZXlndWFyZF9wYXNzd29yZF9lbnRlcl9waW5fcGFzc3dvcmRfY29kZSIgbXNnaWQ9IjYzODM0NzA3NTYyNTQ5MTUxNCI+IlBJTiB6dW0gRW50c3BlcnJlbiBlaW5nZWJlbiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImtleWd1YXJkX3Bhc3N3b3JkX3dyb25nX3Bpbl9jb2RlIiBtc2dpZD0iMTI5NTk4NDExNDMzODEwNzcxOCI+IkZhbHNjaGVyIFBJTi1Db2RlISI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImtleWd1YXJkX2xhYmVsX3RleHQiIG1zZ2lkPSI4NjE3OTY0NjEwMjgyOTg0MjQiPiJEcsO8Y2tlbiBTaWUgenVtIEVudHNwZXJyZW4gZGllIE1lbsO8dGFzdGUgdW5kIGRhbm4gYXVmIFwiMFwiLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImVtZXJnZW5jeV9jYWxsX2RpYWxvZ19udW1iZXJfZm9yX2Rpc3BsYXkiIG1zZ2lkPSI2OTYxOTIxMDMxOTUwOTA5NzAiPiJOb3RydWZudW1tZXIiPC9zdHJpbmc+CkBAIC01NDEsNiArNTQ0LDcgQEAKICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fcmV0dXJuX3RvX2NhbGwiIG1zZ2lkPSI1MjQ0MjU5Nzg1NTAwMDQwMDIxIj4iWnVyw7xjayB6dW0gQW5ydWYiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3BhdHRlcm5fY29ycmVjdCIgbXNnaWQ9IjkwMzkwMDg2NTAzNjIyNjEyMzciPiJLb3JyZWt0ISI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fcGF0dGVybl93cm9uZyIgbXNnaWQ9IjQ4MTc1ODMyNzkwNTMxMTIzMTIiPiJUdXQgdW5zIGxlaWQuIFZlcnN1Y2hlbiBTaWUgZXMgbm9jaCBlaW5tYWwuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9wYXNzd29yZF93cm9uZyIgbXNnaWQ9IjYyMzc0NDM2NTczNTgxNjg4MTkiPiJUdXQgdW5zIGxlaWQuIFZlcnN1Y2hlbiBTaWUgZXMgbm9jaCBlaW5tYWwuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9wbHVnZ2VkX2luIiBtc2dpZD0iNjEzMzQzODUyODQyOTQ0NDM1Ij4iV2lyZCBnZWxhZGVuICg8eGxpZmY6ZyBpZD0iTlVNQkVSIj4lZDwveGxpZmY6Zz48eGxpZmY6ZyBpZD0iUEVSQ0VOVCI+JSU8L3hsaWZmOmc+KSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fY2hhcmdlZCIgbXNnaWQ9IjQ5Mzg5MzA0NTk2MjA5ODk5NzIiPiJBdWZnZWxhZGVuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9iYXR0ZXJ5X3Nob3J0IiBtc2dpZD0iMzYxNzU0OTE3ODYwMzM1NDY1NiI+Ijx4bGlmZjpnIGlkPSJOVU1CRVIiPiVkPC94bGlmZjpnPiA8eGxpZmY6ZyBpZD0iUEVSQ0VOVCI+JSU8L3hsaWZmOmc+Ijwvc3RyaW5nPgpAQCAtNTU1LDYgKzU1OSw4IEBACiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3NpbV9sb2NrZWRfbWVzc2FnZSIgbXNnaWQ9IjgwNjY2NjAxMjkyMDYwMDEwMzkiPiJCaXR0ZSBQSU4tQ29kZSBlaW5nZWJlbiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fc2ltX3VubG9ja19wcm9ncmVzc19kaWFsb2dfbWVzc2FnZSIgbXNnaWQ9IjU5NTMyMzIxNDA1Mjg4MTI2NCI+IlNJTS1LYXJ0ZSB3aXJkIGVudHNwZXJydC4uLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fdG9vX21hbnlfZmFpbGVkX2F0dGVtcHRzX2RpYWxvZ19tZXNzYWdlIiBtc2dpZD0iMzUxNDc0MjEwNjA2Njg3NzQ3NiI+IlNpZSBoYWJlbiBJaHIgRW50c3BlcnJ1bmdzbXVzdGVyIDx4bGlmZjpnIGlkPSJOVU1CRVJfMCI+JWQ8L3hsaWZmOmc+LW1hbCBmYWxzY2ggZ2V6ZWljaG5ldC4gIlxuXG4iVmVyc3VjaGVuIFNpZSBlcyBpbiA8eGxpZmY6ZyBpZD0iTlVNQkVSXzEiPiVkPC94bGlmZjpnPiBTZWt1bmRlbiBlcm5ldXQuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl90b29fbWFueV9mYWlsZWRfcGFzc3dvcmRfYXR0ZW1wdHNfZGlhbG9nX21lc3NhZ2UiIG1zZ2lkPSI0OTA2MDM0Mzc2NDI1MTc1MzgxIj4iU2llIGhhYmVuIElociBQYXNzd29ydCA8eGxpZmY6ZyBpZD0iTlVNQkVSXzAiPiVkPC94bGlmZjpnPiBNYWwgZmFsc2NoIGVpbmdlZ2ViZW4uICJcblxuIlZlcnN1Y2hlbiBTaWUgZXMgaW4gPHhsaWZmOmcgaWQ9Ik5VTUJFUl8xIj4lZDwveGxpZmY6Zz4gU2VrdW5kZW4gZXJuZXV0LiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fdG9vX21hbnlfZmFpbGVkX3Bpbl9hdHRlbXB0c19kaWFsb2dfbWVzc2FnZSIgbXNnaWQ9IjY4Mjc3NDkyMzE0NjUxNDU1OTAiPiJTaWUgaGFiZW4gSWhyZSBQSU4gPHhsaWZmOmcgaWQ9Ik5VTUJFUl8wIj4lZDwveGxpZmY6Zz4gTWFsIGZhbHNjaCBlaW5nZWdlYmVuLiAiXG5cbiJWZXJzdWNoZW4gU2llIGVzIGluIDx4bGlmZjpnIGlkPSJOVU1CRVJfMSI+JWQ8L3hsaWZmOmc+IFNla3VuZGVuIGVybmV1dC4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX2ZhaWxlZF9hdHRlbXB0c19hbG1vc3RfZ2xvZ2luIiBtc2dpZD0iMzM1MTAxMzg0MjMyMDEyNzgyNyI+IlNpZSBoYWJlbiBJaHIgRW50c3BlcnJ1bmdzbXVzdGVyIDx4bGlmZjpnIGlkPSJOVU1CRVJfMCI+JWQ8L3hsaWZmOmc+LW1hbCBmYWxzY2ggZ2V6ZWljaG5ldC4gTmFjaCA8eGxpZmY6ZyBpZD0iTlVNQkVSXzEiPiVkPC94bGlmZjpnPiB3ZWl0ZXJlbiBlcmZvbGdsb3NlbiBWZXJzdWNoZW4gd2VyZGVuIFNpZSBhdWZnZWZvcmRlcnQsIElociBUZWxlZm9uIG1pdGhpbGZlIElocmVyIEdvb2dsZS1Bbm1lbGRlaW5mb3JtYXRpb25lbiB6dSBlbnRzcGVycmVuLiAiXG5cbiJWZXJzdWNoZW4gU2llIGVzIGluIDx4bGlmZjpnIGlkPSJOVU1CRVJfMiI+JWQ8L3hsaWZmOmc+IFNla3VuZGVuIGVybmV1dC4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3Rvb19tYW55X2ZhaWxlZF9hdHRlbXB0c19jb3VudGRvd24iIG1zZ2lkPSI2MjUxNDgwMzQzMzk0Mzg5NjY1Ij4iVmVyc3VjaGVuIFNpZSBlcyBpbiA8eGxpZmY6ZyBpZD0iTlVNQkVSIj4lZDwveGxpZmY6Zz4gU2VrdW5kZW4gZXJuZXV0LiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fZm9yZ290X3BhdHRlcm5fYnV0dG9uX3RleHQiIG1zZ2lkPSIyNjI2OTk5NDQ5NjEwNjk1OTMwIj4iTXVzdGVyIHZlcmdlc3Nlbj8iPC9zdHJpbmc+CkBAIC02OTksMTQgKzcwNSwxNCBAQAogICAgIDxzdHJpbmcgbmFtZT0iZWxhcHNlZF90aW1lX3Nob3J0X2Zvcm1hdF9tbV9zcyIgbXNnaWQ9IjQ0MzE1NTU5NDM4Mjg3MTE0NzMiPiI8eGxpZmY6ZyBpZD0iTUlOVVRFUyI+JTEkMDJkPC94bGlmZjpnPjo8eGxpZmY6ZyBpZD0iU0VDT05EUyI+JTIkMDJkPC94bGlmZjpnPiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImVsYXBzZWRfdGltZV9zaG9ydF9mb3JtYXRfaF9tbV9zcyIgbXNnaWQ9IjE4NDYwNzE5OTc2MTY2NTQxMjQiPiI8eGxpZmY6ZyBpZD0iSE9VUlMiPiUxJGQ8L3hsaWZmOmc+Ojx4bGlmZjpnIGlkPSJNSU5VVEVTIj4lMiQwMmQ8L3hsaWZmOmc+Ojx4bGlmZjpnIGlkPSJTRUNPTkRTIj4lMyQwMmQ8L3hsaWZmOmc+Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ic2VsZWN0QWxsIiBtc2dpZD0iNjg3NjUxODkyNTg0NDEyOTMzMSI+IkFsbGVzIGF1c3fDpGhsZW4iPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiAzODg5MTQ5MTIzNjI2ODg4NjM3IC0tPiAgICAgPHN0cmluZyBuYW1lPSJzZWxlY3RUZXh0IiBtc2dpZD0iNDg2MjM1OTMxMTA4ODg5ODg3OCI+IlRleHQgYXVzd8OkaGxlbiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImN1dCIgbXNnaWQ9IjMwOTI1Njk0MDg0Mzg2MjYyNjEiPiJBdXNzY2huZWlkZW4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJjb3B5IiBtc2dpZD0iMjY4MTk0NjIyOTUzMzUxMTk4NyI+IktvcGllcmVuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGFzdGUiIG1zZ2lkPSI1NjI5ODgwODM2ODA1MDM2NDMzIj4iRWluZsO8Z2VuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iY29weVVybCIgbXNnaWQ9IjI1MzgyMTE1Nzk1OTYwNjc0MDIiPiJVUkwga29waWVyZW4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJzZWxlY3RUZXh0TW9kZSIgbXNnaWQ9IjY3Mzg1NTYzNDg4NjEzNDcyNDAiPiJUZXh0IGF1c3fDpGhsZW4uLi4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJ0ZXh0U2VsZWN0aW9uQ0FCVGl0bGUiIG1zZ2lkPSI1MjM2ODUwMzk0MzcwODIwMzU3Ij4iVGV4dGF1c3dhaGwiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJpbnB1dE1ldGhvZCIgbXNnaWQ9IjE2NTM2MzAwNjIzMDQ1Njc4NzkiPiJFaW5nYWJlbWV0aG9kZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImFkZFRvRGljdGlvbmFyeSIgbXNnaWQ9Ijg3OTM2MjQ5OTE2ODY5NDg3MDkiPiJcIjx4bGlmZjpnIGlkPSJXT1JEIj4lczwveGxpZmY6Zz5cIiB6dW0gV8O2cnRlcmJ1Y2ggaGluenVmw7xnZW4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJlZGl0VGV4dE1lbnVUaXRsZSIgbXNnaWQ9IjE2NzI5ODkxNzY5NTg1ODE0NTIiPiJUZXh0IGJlYXJiZWl0ZW4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJlZGl0VGV4dE1lbnVUaXRsZSIgbXNnaWQ9IjQ5MDkxMzU1NjQ5NDE4MTU0OTQiPiJUZXh0YWt0aW9uZW4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb3dfaW50ZXJuYWxfc3RvcmFnZV92aWV3X3RpdGxlIiBtc2dpZD0iMTM5OTczMjQwODcwMTY5NzU0NiI+IkdlcmluZ2VyIFNwZWljaGVyIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG93X2ludGVybmFsX3N0b3JhZ2Vfdmlld190ZXh0IiBtc2dpZD0iNjM1MTA2NTQ0NjE2Mzc4ODM2Ij4iS2F1bSBub2NoIGZyZWllciBUZWxlZm9uc3BlaWNoZXIgdmVyZsO8Z2Jhci4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJvayIgbXNnaWQ9IjU5NzAwNjA0MzA1NjI1MjQ5MTAiPiJPSyI8L3N0cmluZz4KQEAgLTcxNCw2ICs3MjAsNyBAQAogICAgIDxzdHJpbmcgbmFtZT0ieWVzIiBtc2dpZD0iNTM2Mjk4MjMwMzMzNzk2OTMxMiI+Ik9LIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibm8iIG1zZ2lkPSI1MTQxNTMxMDQ0OTM1NTQxNDk3Ij4iQWJicmVjaGVuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iZGlhbG9nX2FsZXJ0X3RpdGxlIiBtc2dpZD0iMjA0OTY1ODcwODYwOTA0MzEwMyI+IkFjaHR1bmciPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJsb2FkaW5nIiBtc2dpZD0iMTc2MDcyNDk5ODkyODI1NTI1MCI+IldpcmQgZ2VsYWRlbi4uLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImNhcGl0YWxfb24iIG1zZ2lkPSIxNTQ0NjgyNzU1NTE0NDk0Mjk4Ij4iRUlOIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iY2FwaXRhbF9vZmYiIG1zZ2lkPSI2ODE1ODcwMzg2OTcyODA1ODMyIj4iQVVTIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0id2hpY2hBcHBsaWNhdGlvbiIgbXNnaWQ9IjQ1MzMxODU5NDcwNjQ3NzMzODYiPiJBa3Rpb24gZHVyY2hmw7xocmVuIG1pdCI8L3N0cmluZz4KQEAgLTg1NCwxNSArODYxLDI0IEBACiAgICAgPHN0cmluZyBuYW1lPSJsMnRwX2lwc2VjX3Bza192cG5fZGVzY3JpcHRpb24iIG1zZ2lkPSIzOTQ1MDQzNTY0MDA4MzAzMjM5Ij4iTDJUUC9JUFNlYy1WUE4gbWl0IHZvcmluc3RhbGxpZXJ0ZW0gU2NobMO8c3NlbCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImwydHBfaXBzZWNfY3J0X3Zwbl9kZXNjcmlwdGlvbiIgbXNnaWQ9IjUzODI3MTQwNzMxMDM2NTM1NzciPiJaZXJ0aWZpa2F0IG1pdCB2b3JpbnN0YWxsaWVydGVtIFNjaGzDvHNzZWwiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ1cGxvYWRfZmlsZSIgbXNnaWQ9IjI4OTc5NTcxNzIzNjY3MzA0MTYiPiJEYXRlaSBhdXN3w6RobGVuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibm9fZmlsZV9jaG9zZW4iIG1zZ2lkPSI2MzYzNjQ4NTYyMTcwNzU5NDY1Ij4iS2VpbmUgRGF0ZWkgYXVzZ2V3w6RobHQiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJyZXNldCIgbXNnaWQ9IjI0NDgxNjgwODA5NjQyMDk5MDgiPiJadXLDvGNrc2V0emVuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ic3VibWl0IiBtc2dpZD0iMTYwMjMzNTU3MjA4OTkxMTk0MSI+IlNlbmRlbiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImRlc2NyaXB0aW9uX3N0YXIiIG1zZ2lkPSIyNjU0MzE5ODc0OTA4NTc2MTMzIj4iRmF2b3JpdCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImNhcl9tb2RlX2Rpc2FibGVfbm90aWZpY2F0aW9uX3RpdGxlIiBtc2dpZD0iMzE2NDc2ODIxMjAwMzg2NDMxNiI+IkF1dG9tb2R1cyBha3RpdmllcnQiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJjYXJfbW9kZV9kaXNhYmxlX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBtc2dpZD0iNjY4NjYzNjI2NzIxNjc1NjE0Ij4iWnVtIEJlZW5kZW4gZGVzIEF1dG9tb2R1cyBhdXN3w6RobGVuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idGV0aGVyZWRfbm90aWZpY2F0aW9uX3RpdGxlIiBtc2dpZD0iMzE0NjY5NDIzNDM5ODIwMjYwMSI+IlRldGhlcmluZyBvZGVyIEhvdHNwb3QgYWt0aXYiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ0ZXRoZXJlZF9ub3RpZmljYXRpb25fbWVzc2FnZSIgbXNnaWQ9IjMwNjcxMDgzMjM5MDMwNDg5MjciPiJadW0gS29uZmlndXJpZXJlbiBiZXLDvGhyZW4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJiYWNrX2J1dHRvbl9sYWJlbCIgbXNnaWQ9IjIzMDA0NzAwMDQ1MDMzNDM0MzkiPiJadXLDvGNrIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibmV4dF9idXR0b25fbGFiZWwiIG1zZ2lkPSIxMDgwNTU1MTA0Njc3OTkyNDA4Ij4iV2VpdGVyIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ic2tpcF9idXR0b25fbGFiZWwiIG1zZ2lkPSIxMjc1MzYyMjk5NDcxNjMxODE5Ij4iw5xiZXJzcHJpbmdlbiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InRocm90dGxlX3dhcm5pbmdfbm90aWZpY2F0aW9uX3RpdGxlIiBtc2dpZD0iNDg5MDg5NDI2NzQ1NDg2NzI3NiI+IkhvaGUgTW9iaWxkYXRlbm51dHp1bmciPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ0aHJvdHRsZV93YXJuaW5nX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBtc2dpZD0iMjYwOTczNDc2Mzg0NTcwNTcwOCI+IldlaXRlcmUgSW5mb3JtYXRpb25lbiDDvGJlciBkaWUgTW9iaWxkYXRlbm51dHp1bmcgZHVyY2ggQmVyw7xocmVuIGF1ZnJ1ZmVuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idGhyb3R0bGVkX25vdGlmaWNhdGlvbl90aXRsZSIgbXNnaWQ9IjYyNjk1NDE4OTc3Mjk3ODEzMzIiPiJNb2JpbGRhdGVubGltaXQgw7xiZXJzY2hyaXR0ZW4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ0aHJvdHRsZWRfbm90aWZpY2F0aW9uX21lc3NhZ2UiIG1zZ2lkPSI0NzEyMzY5ODU2NjAxMjc1MTQ2Ij4iV2VpdGVyZSBJbmZvcm1hdGlvbmVuIMO8YmVyIGRpZSBNb2JpbGRhdGVubnV0enVuZyBkdXJjaCBCZXLDvGhyZW4gYXVmcnVmZW4iPC9zdHJpbmc+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3Igbm9fbWF0Y2hlcyAoODEyOTQyMTkwODkxNTg0MDczNykgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBmaW5kX29uX3BhZ2UgKDE5NDY3OTkyMzM4MjI4MjAzODQpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgbWF0Y2hlc19mb3VuZDpvbmUgKDgxNjcxNDcwODExMzY1Nzk0MzkpIC0tPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIG1hdGNoZXNfZm91bmQ6b3RoZXIgKDQ2NDE4NzI3OTcwNjc2MDkxNzcpIC0tPgogPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvdmFsdWVzLWVsL3N0cmluZ3MueG1sIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy1lbC9zdHJpbmdzLnhtbAppbmRleCA0NTg2M2U3Li4yZDU0ZjQ0IDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvdmFsdWVzLWVsL3N0cmluZ3MueG1sCisrKyBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMtZWwvc3RyaW5ncy54bWwKQEAgLTQzMiw2ICs0MzIsMTAgQEAKICAgICA8c3RyaW5nIG5hbWU9InBvbGljeWRlc2NfZm9yY2VMb2NrIiBtc2dpZD0iMjgxOTg2ODY2NDk0NjA4OTc0MCI+Is6VzrvOrc6zz4fOtc65IM+Az4zPhM61IM66zrvOtc65zrTPjs69zrXOuSDOtyDPg8+Fz4POus61z4XOriwgzrHPgM6xzrnPhM+Ozr3PhM6xz4IgzrrPic60zrnOus+MIM+Az4HPjM+DzrLOsc+DzrfPgiDOs865zrEgzrXPgM6xzr3Otc6vz4POv860zr8uIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icG9saWN5bGFiX3dpcGVEYXRhIiBtc2dpZD0iMzkxMDU0NTQ0Njc1ODYzOTcxMyI+Is6UzrnOsc6zz4HOsc+Gzq4gz4zOu8+Jzr0gz4TPic69IM60zrXOtM6/zrzOrc69z4nOvSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBvbGljeWRlc2Nfd2lwZURhdGEiIG1zZ2lkPSIyMzE0MDYwOTMzNzk2Mzk2MjA1Ij4izqDPgc6xzrPOvM6xz4TOv8+Azr/Ouc61zq/PhM6xzrkgzrXPgM6xzr3Osc+Gzr/Pgc6sIM61z4HOs86/z4PPhM6xz4POuc6xzrrPjs69IM+Bz4XOuM68zq/Pg861z4nOvSwgzrzOtSDPhM63IM60zrnOsc6zz4HOsc+Gzq4gz4zOu8+Jzr0gz4TPic69IM60zrXOtM6/zrzOrc69z4nOvSDPg86xz4Igz4fPic+Bzq/PgiDOtc+AzrnOss61zrLOsc6vz4nPg863LiI8L3N0cmluZz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwb2xpY3lsYWJfc2V0R2xvYmFsUHJveHkgKDI3ODQ4MjgyOTM3NDc3OTE0NDYpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcG9saWN5ZGVzY19zZXRHbG9iYWxQcm94eSAoNjM4NzQ5NzQ2NjY2MDE1NDkzMSkgLS0+CisgICAgPHNraXAgLz4KICAgPHN0cmluZy1hcnJheSBuYW1lPSJwaG9uZVR5cGVzIj4KICAgICA8aXRlbSBtc2dpZD0iODkwMTA5ODMzNjY1ODcxMDM1OSI+Is6fzrnOus6vzrEiPC9pdGVtPgogICAgIDxpdGVtIG1zZ2lkPSI4Njk5MjM2NTA1MjcxMzY2MTUiPiLOms65zr3Ot8+Ez4wiPC9pdGVtPgpAQCAtNTI1LDEwICs1MjksOSBAQAogICAgIDxzdHJpbmcgbmFtZT0ib3JnVHlwZVdvcmsiIG1zZ2lkPSIyOTI2ODg3MDUwNTM2Mzg3MiI+Is6Vz4HOs86xz4POr86xIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ib3JnVHlwZU90aGVyIiBtc2dpZD0iMzk1MTc4MTEzMTU3MDEyNDA4MiI+Is6GzrvOu86/Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ib3JnVHlwZUN1c3RvbSIgbXNnaWQ9IjIyNTUyMzQxNTM3MjA4ODMyMiI+Is6gz4HOv8+DzrHPgc68zr/Pg868zq3Ovc6/Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iY29udGFjdF9zdGF0dXNfdXBkYXRlX2F0dHJpYnV0aW9uIiBtc2dpZD0iNTExMjU4OTg4NjA5NDQwMjc5NSI+Is68zq3Pg8+JIDx4bGlmZjpnIGlkPSJTT1VSQ0UiPiUxJHM8L3hsaWZmOmc+Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iY29udGFjdF9zdGF0dXNfdXBkYXRlX2F0dHJpYnV0aW9uX3dpdGhfZGF0ZSIgbXNnaWQ9IjU5NDUzODYzNzYzNjk5Nzk5MDkiPiI8eGxpZmY6ZyBpZD0iREFURSI+JTEkczwveGxpZmY6Zz4gzrzOrc+Dz4kgPHhsaWZmOmcgaWQ9IlNPVVJDRSI+JTIkczwveGxpZmY6Zz4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJrZXlndWFyZF9wYXNzd29yZF9lbnRlcl9waW5fY29kZSIgbXNnaWQ9IjM3MzE0ODg4MjcyMTg4NzYxMTUiPiLOoM67zrfOus+Ez4HOv867zr/Os86uz4PPhM61IM+Ezr/OvSDOus+JzrTOuc66z4wgzrHPgc65zrjOvM+MIFBJTiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImtleWd1YXJkX3Bhc3N3b3JkX2VudGVyX3Bhc3N3b3JkX2NvZGUiIG1zZ2lkPSI5MTM4MTU4MzQ0ODEzMjEzNzU0Ij4izpXOuc+DzrHOs86szrPOtc+EzrUgz4TOv869IM66z4nOtM65zrrPjCDPgM+Bz4zPg86yzrHPg863z4IgzrPOuc6xIM6+zrXOus67zrXOr860z4nOvM6xIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ia2V5Z3VhcmRfcGFzc3dvcmRfZW50ZXJfcGluX3Bhc3N3b3JkX2NvZGUiIG1zZ2lkPSI2MzgzNDcwNzU2MjU0OTE1MTQiPiLOlc65z4POsc6zzqzOs861z4TOtSDPhM6/IFBJTiDOs865zrEgzr7Otc66zrvOtc6vzrTPic68zrEiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJrZXlndWFyZF9wYXNzd29yZF93cm9uZ19waW5fY29kZSIgbXNnaWQ9IjEyOTU5ODQxMTQzMzgxMDc3MTgiPiLOlc+Dz4bOsc67zrzOrc69zr/PgiDOus+JzrTOuc66z4zPgiDOsc+BzrnOuM68z4zPgiBQSU4hIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ia2V5Z3VhcmRfbGFiZWxfdGV4dCIgbXNnaWQ9Ijg2MTc5NjQ2MTAyODI5ODQyNCI+Is6TzrnOsSDOvs61zrrOu861zq/OtM+JzrzOsSwgz4DOsc+Ezq7Pg8+EzrUgz4TOvyDPgM67zq7Ous+Ez4HOvyBNZW51IM66zrHOuSwgz4PPhM63IM+Dz4XOvc6tz4fOtc65zrEsIM+Ezr8gz4DOu86uzrrPhM+Bzr8gMC4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJlbWVyZ2VuY3lfY2FsbF9kaWFsb2dfbnVtYmVyX2Zvcl9kaXNwbGF5IiBtc2dpZD0iNjk2MTkyMTAzMTk1MDkwOTcwIj4izpHPgc65zrjOvM+Mz4Igzq3Ous+EzrHOus+EzrfPgiDOsc69zqzOs866zrfPgiI8L3N0cmluZz4KQEAgLTU0MSw2ICs1NDQsNyBAQAogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9yZXR1cm5fdG9fY2FsbCIgbXNnaWQ9IjUyNDQyNTk3ODU1MDAwNDAwMjEiPiLOlc+AzrnPg8+Ez4HOv8+Gzq4gz4PPhM63zr0gzrrOu86uz4POtyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fcGF0dGVybl9jb3JyZWN0IiBtc2dpZD0iOTAzOTAwODY1MDM2MjI2MTIzNyI+Is6jz4nPg8+Ez4whIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9wYXR0ZXJuX3dyb25nIiBtc2dpZD0iNDgxNzU4MzI3OTA1MzExMjMxMiI+Is6gz4HOv8+Dz4DOsc64zq7Pg8+EzrUgzrHPgc6zz4zPhM61z4HOsSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fcGFzc3dvcmRfd3JvbmciIG1zZ2lkPSI2MjM3NDQzNjU3MzU4MTY4ODE5Ij4izqDPgc6/z4PPgM6xzrjOrs+Dz4TOtSDOsc+BzrPPjM+EzrXPgc6xIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9wbHVnZ2VkX2luIiBtc2dpZD0iNjEzMzQzODUyODQyOTQ0NDM1Ij4izqbPjM+Bz4TOuc+DzrcgKDx4bGlmZjpnIGlkPSJOVU1CRVIiPiVkPC94bGlmZjpnPjx4bGlmZjpnIGlkPSJQRVJDRU5UIj4lJTwveGxpZmY6Zz4pIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9jaGFyZ2VkIiBtc2dpZD0iNDkzODkzMDQ1OTYyMDk4OTk3MiI+Is6mzr/Pgc+Ezq/Pg8+EzrfOus61LiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fYmF0dGVyeV9zaG9ydCIgbXNnaWQ9IjM2MTc1NDkxNzg2MDMzNTQ2NTYiPiI8eGxpZmY6ZyBpZD0iTlVNQkVSIj4lZDwveGxpZmY6Zz48eGxpZmY6ZyBpZD0iUEVSQ0VOVCI+JSU8L3hsaWZmOmc+Ijwvc3RyaW5nPgpAQCAtNTU1LDYgKzU1OSw4IEBACiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3NpbV9sb2NrZWRfbWVzc2FnZSIgbXNnaWQ9IjgwNjY2NjAxMjkyMDYwMDEwMzkiPiLOlyDOus6sz4HPhM6xIFNJTSDOtc6vzr3Osc65IM66zrvOtc65zrTPic68zq3Ovc63LiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fc2ltX3VubG9ja19wcm9ncmVzc19kaWFsb2dfbWVzc2FnZSIgbXNnaWQ9IjU5NTMyMzIxNDA1Mjg4MTI2NCI+Is6ezrXOus67zrXOr860z4nOvM6xIM66zqzPgc+EzrHPgiBTSU0uLi4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3Rvb19tYW55X2ZhaWxlZF9hdHRlbXB0c19kaWFsb2dfbWVzc2FnZSIgbXNnaWQ9IjM1MTQ3NDIxMDYwNjY4Nzc0NzYiPiLOo8+HzrXOtM65zqzPg86xz4TOtSDOtc+Dz4bOsc67zrzOrc69zrEgz4TOvyDOvM6/z4TOr86yzr8gzr7Otc66zrvOtc65zrTPjs68zrHPhM6/z4I8eGxpZmY6ZyBpZD0iTlVNQkVSXzAiPiVkPC94bGlmZjpnPiDPhs6/z4HOrc+CLiAiXG5cbiLOoM+Bzr/Pg8+AzrHOuM6uz4PPhM61IM6+zrHOvc6sIM+DzrUgPHhsaWZmOmcgaWQ9Ik5VTUJFUl8xIj4lZDwveGxpZmY6Zz4gzrTOtc+Fz4TOtc+Bz4zOu861z4DPhM6xLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fdG9vX21hbnlfZmFpbGVkX3Bhc3N3b3JkX2F0dGVtcHRzX2RpYWxvZ19tZXNzYWdlIiBtc2dpZD0iNDkwNjAzNDM3NjQyNTE3NTM4MSI+Is6azrHPhM6xz4fPic+Bzq/Pg86xz4TOtSDOtc+Dz4bOsc67zrzOrc69zrEgz4TOv869IM66z4nOtM65zrrPjCDPgM+Bz4zPg86yzrHPg863z4IgPHhsaWZmOmcgaWQ9Ik5VTUJFUl8wIj4lZDwveGxpZmY6Zz4gz4bOv8+Bzq3Pgi4gIlxuXG4izqDPgc6/z4PPgM6xzrjOrs+Dz4TOtSDOvs6xzr3OrCDPg861IDx4bGlmZjpnIGlkPSJOVU1CRVJfMSI+JWQ8L3hsaWZmOmc+IM60zrXPhc+EzrXPgc+MzrvOtc+Az4TOsS4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3Rvb19tYW55X2ZhaWxlZF9waW5fYXR0ZW1wdHNfZGlhbG9nX21lc3NhZ2UiIG1zZ2lkPSI2ODI3NzQ5MjMxNDY1MTQ1NTkwIj4izprOsc+EzrHPh8+Jz4HOr8+DzrHPhM61IM61z4PPhs6xzrvOvM6tzr3OsSDPhM6/IFBJTiDPg86xz4I8eGxpZmY6ZyBpZD0iTlVNQkVSXzAiPiVkPC94bGlmZjpnPiDPhs6/z4HOrc+CLiAiXG5cbiLOoM+Bzr/Pg8+AzrHOuM6uz4PPhM61IM6+zrHOvc6sIM+DzrUgPHhsaWZmOmcgaWQ9Ik5VTUJFUl8xIj4lZDwveGxpZmY6Zz4gzrTOtc+Fz4TOtc+Bz4zOu861z4DPhM6xLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fZmFpbGVkX2F0dGVtcHRzX2FsbW9zdF9nbG9naW4iIG1zZ2lkPSIzMzUxMDEzODQyMzIwMTI3ODI3Ij4izqPPh861zrTOuc6sz4POsc+EzrUgz4TOvyDOvM6/z4TOr86yzr8gzr7Otc66zrvOtc65zrTPjs68zrHPhM6/z4IgzrXPg8+GzrHOu868zq3Ovc6xIDx4bGlmZjpnIGlkPSJOVU1CRVJfMCI+JWQ8L3hsaWZmOmc+IM+Gzr/Pgc6tz4IuIM6czrXPhM6sIM6xz4DPjCA8eGxpZmY6ZyBpZD0iTlVNQkVSXzEiPiVkPC94bGlmZjpnPiDOsc69zrXPgM65z4TPhc+HzrXOr8+CIM+Az4HOv8+Dz4DOrM64zrXOuc61z4IgzrHOus+MzrzOtywgzrjOsSDPg86xz4IgzrbOt8+EzrfOuM61zq8gzr3OsSDOvs61zrrOu861zrnOtM+Oz4POtc+EzrUgz4TOvyDPhM63zrvOrc+Gz4nOvc+MIM+DzrHPgiDOvM61IM+Ezrcgz4fPgc6uz4POtyDPhM63z4Igz4PPjc69zrTOtc+Dzq7PgiDPg86xz4IgR29vZ2xlLiJcblxuIiDOoM+Bzr/Pg8+AzrHOuM6uz4PPhM61IM6+zrHOvc6sIM+DzrUgPHhsaWZmOmcgaWQ9Ik5VTUJFUl8yIj4lZDwveGxpZmY6Zz4gXG7OtM61z4XPhM61z4HPjM67zrXPgM+EzrEuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl90b29fbWFueV9mYWlsZWRfYXR0ZW1wdHNfY291bnRkb3duIiBtc2dpZD0iNjI1MTQ4MDM0MzM5NDM4OTY2NSI+Is6gz4HOv8+Dz4DOsc64zq7Pg8+EzrUgzr7Osc69zqwgz4POtSA8eGxpZmY6ZyBpZD0iTlVNQkVSIj4lZDwveGxpZmY6Zz4gzrTOtc+Fz4TOtc+Bz4zOu861z4DPhM6xLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fZm9yZ290X3BhdHRlcm5fYnV0dG9uX3RleHQiIG1zZ2lkPSIyNjI2OTk5NDQ5NjEwNjk1OTMwIj4izp7Otc+HzqzPg86xz4TOtSDPhM6/IM68zr/PhM6vzrLOvzsiPC9zdHJpbmc+CkBAIC02OTksMTQgKzcwNSwxNCBAQAogICAgIDxzdHJpbmcgbmFtZT0iZWxhcHNlZF90aW1lX3Nob3J0X2Zvcm1hdF9tbV9zcyIgbXNnaWQ9IjQ0MzE1NTU5NDM4Mjg3MTE0NzMiPiI8eGxpZmY6ZyBpZD0iTUlOVVRFUyI+JTEkMDJkPC94bGlmZjpnPjo8eGxpZmY6ZyBpZD0iU0VDT05EUyI+JTIkMDJkPC94bGlmZjpnPiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImVsYXBzZWRfdGltZV9zaG9ydF9mb3JtYXRfaF9tbV9zcyIgbXNnaWQ9IjE4NDYwNzE5OTc2MTY2NTQxMjQiPiI8eGxpZmY6ZyBpZD0iSE9VUlMiPiUxJGQ8L3hsaWZmOmc+Ojx4bGlmZjpnIGlkPSJNSU5VVEVTIj4lMiQwMmQ8L3hsaWZmOmc+Ojx4bGlmZjpnIGlkPSJTRUNPTkRTIj4lMyQwMmQ8L3hsaWZmOmc+Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ic2VsZWN0QWxsIiBtc2dpZD0iNjg3NjUxODkyNTg0NDEyOTMzMSI+Is6Vz4DOuc67zr/Os86uIM+MzrvPic69Ijwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gMzg4OTE0OTEyMzYyNjg4ODYzNyAtLT4gICAgIDxzdHJpbmcgbmFtZT0ic2VsZWN0VGV4dCIgbXNnaWQ9IjQ4NjIzNTkzMTEwODg4OTg4NzgiPiLOlc+AzrnOu86/zrPOriDOus61zrnOvM6tzr3Ov8+FIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iY3V0IiBtc2dpZD0iMzA5MjU2OTQwODQzODYyNjI2MSI+Is6Rz4DOv866zr/PgM6uIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iY29weSIgbXNnaWQ9IjI2ODE5NDYyMjk1MzM1MTE5ODciPiLOkc69z4TOuc6zz4HOsc+Gzq4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwYXN0ZSIgbXNnaWQ9IjU2Mjk4ODA4MzY4MDUwMzY0MzMiPiLOlc+AzrnOus+MzrvOu863z4POtyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImNvcHlVcmwiIG1zZ2lkPSIyNTM4MjExNTc5NTk2MDY3NDAyIj4izpHOvc+EzrnOs8+BzrHPhs6uIM60zrnOtc+NzrjPhc69z4POt8+CIFVSTCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InNlbGVjdFRleHRNb2RlIiBtc2dpZD0iNjczODU1NjM0ODg2MTM0NzI0MCI+Is6Vz4DOuc67zr/Os86uIM66zrXOuc68zq3Ovc6/z4UuLi4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJ0ZXh0U2VsZWN0aW9uQ0FCVGl0bGUiIG1zZ2lkPSI1MjM2ODUwMzk0MzcwODIwMzU3Ij4izpXPgM65zrvOv86zzq4gzrrOtc65zrzOrc69zr/PhSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImlucHV0TWV0aG9kIiBtc2dpZD0iMTY1MzYzMDA2MjMwNDU2Nzg3OSI+Is6czq3OuM6/zrTOv8+CIM61zrnPg8+MzrTOv8+FIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iYWRkVG9EaWN0aW9uYXJ5IiBtc2dpZD0iODc5MzYyNDk5MTY4Njk0ODcwOSI+Is6gz4HOv8+DzrjOrs66zrcgz4TOt8+CIM67zq3Ovs63z4IgXCI8eGxpZmY6ZyBpZD0iV09SRCI+JXM8L3hsaWZmOmc+XCIgz4PPhM6/IM67zrXOvs65zrrPjCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImVkaXRUZXh0TWVudVRpdGxlIiBtc2dpZD0iMTY3Mjk4OTE3Njk1ODU4MTQ1MiI+Is6Vz4DOtc6+zrXPgc6zzrHPg86vzrEgzrrOtc65zrzOrc69zr/PhSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImVkaXRUZXh0TWVudVRpdGxlIiBtc2dpZD0iNDkwOTEzNTU2NDk0MTgxNTQ5NCI+Is6Vzr3Orc+BzrPOtc65zrXPgiDOus61zrnOvM6tzr3Ov8+FIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG93X2ludGVybmFsX3N0b3JhZ2Vfdmlld190aXRsZSIgbXNnaWQ9IjEzOTk3MzI0MDg3MDE2OTc1NDYiPiLOkc+Azr/OvM6tzr3Otc65IM67zq/Os86/z4IgzrXOu861z43OuM61z4HOv8+CIM+Hz47Pgc6/z4IiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb3dfaW50ZXJuYWxfc3RvcmFnZV92aWV3X3RleHQiIG1zZ2lkPSI2MzUxMDY1NDQ2MTYzNzg4MzYiPiLOiM+HzrXOuSDOsc+Azr/OvM61zq/Ovc61zrkgzrvOr86zzr/PgiDOtc67zrXPjc64zrXPgc6/z4IgzrHPgM6/zrjOt866zrXPhc+EzrnOus+Mz4Igz4fPjs+Bzr/PgiDPg8+Ezr8gz4TOt867zq3Phs+Jzr3Ovy4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJvayIgbXNnaWQ9IjU5NzAwNjA0MzA1NjI1MjQ5MTAiPiJPSyI8L3N0cmluZz4KQEAgLTcxNCw2ICs3MjAsNyBAQAogICAgIDxzdHJpbmcgbmFtZT0ieWVzIiBtc2dpZD0iNTM2Mjk4MjMwMzMzNzk2OTMxMiI+Ik9LIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibm8iIG1zZ2lkPSI1MTQxNTMxMDQ0OTM1NTQxNDk3Ij4izpHOus+Nz4HPic+DzrciPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJkaWFsb2dfYWxlcnRfdGl0bGUiIG1zZ2lkPSIyMDQ5NjU4NzA4NjA5MDQzMTAzIj4izqDPgc6/z4POv8+Hzq4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJsb2FkaW5nIiBtc2dpZD0iMTc2MDcyNDk5ODkyODI1NTI1MCI+Is6mz4zPgc+Ez4nPg863Li4uIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iY2FwaXRhbF9vbiIgbXNnaWQ9IjE1NDQ2ODI3NTU1MTQ0OTQyOTgiPiLOlc69zrXPgc6zzr/PgM6/zrnOt868zq3Ovc6/Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iY2FwaXRhbF9vZmYiIG1zZ2lkPSI2ODE1ODcwMzg2OTcyODA1ODMyIj4izpHPgM61zr3Otc+BzrPOv8+Azr/Or863z4POtyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9IndoaWNoQXBwbGljYXRpb24iIG1zZ2lkPSI0NTMzMTg1OTQ3MDY0NzczMzg2Ij4izp/Ou86/zrrOu86uz4HPic+DzrcgzrXOvc6tz4HOs861zrnOsc+CIM68zrUgz4TOtyDPh8+Bzq7Pg863Ijwvc3RyaW5nPgpAQCAtODU0LDE1ICs4NjEsMjQgQEAKICAgICA8c3RyaW5nIG5hbWU9ImwydHBfaXBzZWNfcHNrX3Zwbl9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM5NDUwNDM1NjQwMDgzMDMyMzkiPiLOms67zrXOuc60zq8gcHJlLXNoYXJlZCDOss6sz4POtc65IEwyVFAvSVBTZWMgVlBOIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibDJ0cF9pcHNlY19jcnRfdnBuX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNTM4MjcxNDA3MzEwMzY1MzU3NyI+Is6gzrnPg8+Ezr/PgM6/zrnOt8+EzrnOus+MIM6yzqzPg861zrkgTDJUUC9JUFNlYyBWUE4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ1cGxvYWRfZmlsZSIgbXNnaWQ9IjI4OTc5NTcxNzIzNjY3MzA0MTYiPiLOlc+AzrnOu86/zrPOriDOsc+Bz4fOtc6vzr/PhSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im5vX2ZpbGVfY2hvc2VuIiBtc2dpZD0iNjM2MzY0ODU2MjE3MDc1OTQ2NSI+Is6UzrXOvSDOrc+HzrXOuSDOtc+AzrnOu861zrPOtc6vIM6xz4HPh861zq/OvyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InJlc2V0IiBtc2dpZD0iMjQ0ODE2ODA4MDk2NDIwOTkwOCI+Is6Vz4DOsc69zrHPhs6/z4HOrCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InN1Ym1pdCIgbXNnaWQ9IjE2MDIzMzU1NzIwODk5MTE5NDEiPiLOpc+Azr/Oss6/zrvOriI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImRlc2NyaXB0aW9uX3N0YXIiIG1zZ2lkPSIyNjU0MzE5ODc0OTA4NTc2MTMzIj4izrHOs86xz4DOt868zq3Ovc6/Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iY2FyX21vZGVfZGlzYWJsZV9ub3RpZmljYXRpb25fdGl0bGUiIG1zZ2lkPSIzMTY0NzY4MjEyMDAzODY0MzE2Ij4izpcgzrvOtc65z4TOv8+Fz4HOs86vzrEgzrHPhc+Ezr/Ous65zr3Ors+Ezr/PhSDOtc6vzr3Osc65IM61zr3Otc+BzrPOv8+Azr/Ouc63zrzOrc69zrciPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJjYXJfbW9kZV9kaXNhYmxlX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBtc2dpZD0iNjY4NjYzNjI2NzIxNjc1NjE0Ij4izpXPgM65zrvOrc6+z4TOtSDOs865zrEgzq3Ovs6/zrTOvyDOsc+Az4wgz4TOtyDOu861zrnPhM6/z4XPgc6zzq/OsSDOsc+Fz4TOv866zrnOvc6uz4TOv8+FLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InRldGhlcmVkX25vdGlmaWNhdGlvbl90aXRsZSIgbXNnaWQ9IjMxNDY2OTQyMzQzOTgyMDI2MDEiPiLOo8+Nzr3OtM61z4POtyDOvM6tz4PPiSDOus65zr3Ot8+Ezq7PgiDPg8+Fz4POus61z4XOrs+CIM6uIM+DzrfOvM61zq/Ov8+FIM+Az4HPjM+DzrLOsc+DzrfPgiDOtc69zrXPgc6zzq4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ0ZXRoZXJlZF9ub3RpZmljYXRpb25fbWVzc2FnZSIgbXNnaWQ9IjMwNjcxMDgzMjM5MDMwNDg5MjciPiLOkc6zzrPOr86+z4TOtSDOs865zrEgzr3OsSDOs86vzr3Otc65IM60zrnOsc68z4zPgc+Gz4nPg863Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iYmFja19idXR0b25fbGFiZWwiIG1zZ2lkPSIyMzAwNDcwMDA0NTAzMzQzNDM5Ij4izqDOr8+Dz4kiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJuZXh0X2J1dHRvbl9sYWJlbCIgbXNnaWQ9IjEwODA1NTUxMDQ2Nzc5OTI0MDgiPiLOlc+Az4zOvM61zr3OvyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InNraXBfYnV0dG9uX2xhYmVsIiBtc2dpZD0iMTI3NTM2MjI5OTQ3MTYzMTgxOSI+Is6gzrHPgc6szrLOu861z4jOtyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InRocm90dGxlX3dhcm5pbmdfbm90aWZpY2F0aW9uX3RpdGxlIiBtc2dpZD0iNDg5MDg5NDI2NzQ1NDg2NzI3NiI+Is6lz4jOt867zq4gz4fPgc6uz4POtyDOtM61zrTOv868zq3Ovc+Jzr0gzrrOuc69zrfPhM6uz4Igz4TOt867zrXPhs+Jzr3Or86xz4IiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ0aHJvdHRsZV93YXJuaW5nX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBtc2dpZD0iMjYwOTczNDc2Mzg0NTcwNTcwOCI+Is6RzrPOs86vzr7PhM61IM6zzrnOsSDOvc6xIM68zqzOuM61z4TOtSDPgM61z4HOuc+Dz4PPjM+EzrXPgc6xIM+Dz4fOtc+EzrnOus6sIM68zrUgz4TOtyDPh8+Bzq7Pg863IM60zrXOtM6/zrzOrc69z4nOvSDOus65zr3Ot8+Ezq7PgiDPhM63zrvOtc+Gz4nOvc6vzrHPgiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InRocm90dGxlZF9ub3RpZmljYXRpb25fdGl0bGUiIG1zZ2lkPSI2MjY5NTQxODk3NzI5NzgxMzMyIj4izp7Otc+AzrXPgc6sz4PPhM63zrrOtSDPhM6/IM+Mz4HOuc6/IM60zrXOtM6/zrzOrc69z4nOvSDOus65zr3Ot8+Ezq7PgiDPhM63zrvOtc+Gz4nOvc6vzrHPgiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InRocm90dGxlZF9ub3RpZmljYXRpb25fbWVzc2FnZSIgbXNnaWQ9IjQ3MTIzNjk4NTY2MDEyNzUxNDYiPiLOkc6zzrPOr86+z4TOtSDOs865zrEgzr3OsSDOvM6szrjOtc+EzrUgz4DOtc+BzrnPg8+Dz4zPhM61z4HOsSDPg8+HzrXPhM65zrrOrCDOvM61IM+Ezrcgz4fPgc6uz4POtyDOtM61zrTOv868zq3Ovc+Jzr0gzrrOuc69zrfPhM6uz4Igz4TOt867zrXPhs+Jzr3Or86xz4IiPC9zdHJpbmc+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3Igbm9fbWF0Y2hlcyAoODEyOTQyMTkwODkxNTg0MDczNykgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBmaW5kX29uX3BhZ2UgKDE5NDY3OTkyMzM4MjI4MjAzODQpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgbWF0Y2hlc19mb3VuZDpvbmUgKDgxNjcxNDcwODExMzY1Nzk0MzkpIC0tPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIG1hdGNoZXNfZm91bmQ6b3RoZXIgKDQ2NDE4NzI3OTcwNjc2MDkxNzcpIC0tPgogPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvdmFsdWVzLWVzLXJVUy9zdHJpbmdzLnhtbCBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMtZXMtclVTL3N0cmluZ3MueG1sCmluZGV4IDI3NjVlOTYuLmVmZDI4ODUgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy92YWx1ZXMtZXMtclVTL3N0cmluZ3MueG1sCisrKyBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMtZXMtclVTL3N0cmluZ3MueG1sCkBAIC00MzIsNiArNDMyLDEwIEBACiAgICAgPHN0cmluZyBuYW1lPSJwb2xpY3lkZXNjX2ZvcmNlTG9jayIgbXNnaWQ9IjI4MTk4Njg2NjQ5NDYwODk3NDAiPiJDb250cm9sYXIgY3VhbmRvIHNlIGJsb3F1ZWUgZWwgZGlzcG9zaXRpdm8sIHJlcXVpZXJlIHF1ZSB2dWVsdmFzIGEgaW5ncmVzYXIgdHUgY29udHJhc2XDsWEuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icG9saWN5bGFiX3dpcGVEYXRhIiBtc2dpZD0iMzkxMDU0NTQ0Njc1ODYzOTcxMyI+IkJvcnJhciB0b2RvcyBsb3MgZGF0b3MiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwb2xpY3lkZXNjX3dpcGVEYXRhIiBtc2dpZD0iMjMxNDA2MDkzMzc5NjM5NjIwNSI+IlJlYWxpemFyIHVuIHJlZXN0YWJsZWNpbWllbnRvIGRlIGbDoWJyaWNhIHkgYm9ycmFyIHRvZG9zIHR1cyBkYXRvcyBzaW4gbmluZ3VuYSBjb25maXJtYWNpw7NuLiI8L3N0cmluZz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwb2xpY3lsYWJfc2V0R2xvYmFsUHJveHkgKDI3ODQ4MjgyOTM3NDc3OTE0NDYpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcG9saWN5ZGVzY19zZXRHbG9iYWxQcm94eSAoNjM4NzQ5NzQ2NjY2MDE1NDkzMSkgLS0+CisgICAgPHNraXAgLz4KICAgPHN0cmluZy1hcnJheSBuYW1lPSJwaG9uZVR5cGVzIj4KICAgICA8aXRlbSBtc2dpZD0iODkwMTA5ODMzNjY1ODcxMDM1OSI+IkNhc2EiPC9pdGVtPgogICAgIDxpdGVtIG1zZ2lkPSI4Njk5MjM2NTA1MjcxMzY2MTUiPiJDZWx1bGFyIjwvaXRlbT4KQEAgLTUyNSwxMCArNTI5LDkgQEAKICAgICA8c3RyaW5nIG5hbWU9Im9yZ1R5cGVXb3JrIiBtc2dpZD0iMjkyNjg4NzA1MDUzNjM4NzIiPiJUcmFiYWpvIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ib3JnVHlwZU90aGVyIiBtc2dpZD0iMzk1MTc4MTEzMTU3MDEyNDA4MiI+Ik90cm8iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJvcmdUeXBlQ3VzdG9tIiBtc2dpZD0iMjI1NTIzNDE1MzcyMDg4MzIyIj4iUGVyc29uYWxpemFkbyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImNvbnRhY3Rfc3RhdHVzX3VwZGF0ZV9hdHRyaWJ1dGlvbiIgbXNnaWQ9IjUxMTI1ODk4ODYwOTQ0MDI3OTUiPiJhIHRyYXbDqXMgZGUgPHhsaWZmOmcgaWQ9IlNPVVJDRSI+JTEkczwveGxpZmY6Zz4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJjb250YWN0X3N0YXR1c191cGRhdGVfYXR0cmlidXRpb25fd2l0aF9kYXRlIiBtc2dpZD0iNTk0NTM4NjM3NjM2OTk3OTkwOSI+Ijx4bGlmZjpnIGlkPSJEQVRFIj4lMSRzPC94bGlmZjpnPiBhIHRyYXbDqXMgZGUgPHhsaWZmOmcgaWQ9IlNPVVJDRSI+JTIkczwveGxpZmY6Zz4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJrZXlndWFyZF9wYXNzd29yZF9lbnRlcl9waW5fY29kZSIgbXNnaWQ9IjM3MzE0ODg4MjcyMTg4NzYxMTUiPiJJbmdyZXNhciBlbCBjw7NkaWdvIGRlIFBJTiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImtleWd1YXJkX3Bhc3N3b3JkX2VudGVyX3Bhc3N3b3JkX2NvZGUiIG1zZ2lkPSI5MTM4MTU4MzQ0ODEzMjEzNzU0Ij4iSW5ncmVzYXIgbGEgY29udHJhc2XDsWEgcGFyYSBkZXNibG9xdWVhciI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImtleWd1YXJkX3Bhc3N3b3JkX2VudGVyX3Bpbl9wYXNzd29yZF9jb2RlIiBtc2dpZD0iNjM4MzQ3MDc1NjI1NDkxNTE0Ij4iSW5ncmVzYSBlbCBQSU4gcGFyYSBkZXNibG9xdWVhciI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImtleWd1YXJkX3Bhc3N3b3JkX3dyb25nX3Bpbl9jb2RlIiBtc2dpZD0iMTI5NTk4NDExNDMzODEwNzcxOCI+IsKhQ8OzZGlnbyBkZSBQSU4gaW5jb3JyZWN0byEiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJrZXlndWFyZF9sYWJlbF90ZXh0IiBtc2dpZD0iODYxNzk2NDYxMDI4Mjk4NDI0Ij4iUGFyYSBkZXNibG9xdWVhciwgcHJlc2lvbmEgZWwgbWVuw7ogeSBsdWVnbyAwLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImVtZXJnZW5jeV9jYWxsX2RpYWxvZ19udW1iZXJfZm9yX2Rpc3BsYXkiIG1zZ2lkPSI2OTYxOTIxMDMxOTUwOTA5NzAiPiJOw7ptZXJvIGRlIGVtZXJnZW5jaWEiPC9zdHJpbmc+CkBAIC01NDEsNiArNTQ0LDcgQEAKICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fcmV0dXJuX3RvX2NhbGwiIG1zZ2lkPSI1MjQ0MjU5Nzg1NTAwMDQwMDIxIj4iUmVncmVzYXIgYSBsbGFtYWRhIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9wYXR0ZXJuX2NvcnJlY3QiIG1zZ2lkPSI5MDM5MDA4NjUwMzYyMjYxMjM3Ij4iQ29ycmVjdG8iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3BhdHRlcm5fd3JvbmciIG1zZ2lkPSI0ODE3NTgzMjc5MDUzMTEyMzEyIj4iTG8gc2VudGltb3MsIHZ1ZWx2ZSBhIGludGVudGFybG8iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3Bhc3N3b3JkX3dyb25nIiBtc2dpZD0iNjIzNzQ0MzY1NzM1ODE2ODgxOSI+IkxvIHNlbnRpbW9zLCB2dWVsdmUgYSBpbnRlbnRhcmxvIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9wbHVnZ2VkX2luIiBtc2dpZD0iNjEzMzQzODUyODQyOTQ0NDM1Ij4iQ2FyZ2FuZG8gKDx4bGlmZjpnIGlkPSJOVU1CRVIiPiVkPC94bGlmZjpnPjx4bGlmZjpnIGlkPSJQRVJDRU5UIj4lJTwveGxpZmY6Zz4pIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9jaGFyZ2VkIiBtc2dpZD0iNDkzODkzMDQ1OTYyMDk4OTk3MiI+IkNhcmdhZGEuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9iYXR0ZXJ5X3Nob3J0IiBtc2dpZD0iMzYxNzU0OTE3ODYwMzM1NDY1NiI+IlNlZ21lbnRvIDx4bGlmZjpnIGlkPSJOVU1CRVIiPiVkPC94bGlmZjpnPjx4bGlmZjpnIGlkPSJQRVJDRU5UIj4lJTwveGxpZmY6Zz4iPC9zdHJpbmc+CkBAIC01NTUsNiArNTU5LDggQEAKICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fc2ltX2xvY2tlZF9tZXNzYWdlIiBtc2dpZD0iODA2NjY2MDEyOTIwNjAwMTAzOSI+IkxhIHRhcmpldGEgU0lNIGVzdMOhIGJsb3F1ZWFkYS4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3NpbV91bmxvY2tfcHJvZ3Jlc3NfZGlhbG9nX21lc3NhZ2UiIG1zZ2lkPSI1OTUzMjMyMTQwNTI4ODEyNjQiPiJEZXNibG9xdWVhbmRvIHRhcmpldGEgU0lN4oCmIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl90b29fbWFueV9mYWlsZWRfYXR0ZW1wdHNfZGlhbG9nX21lc3NhZ2UiIG1zZ2lkPSIzNTE0NzQyMTA2MDY2ODc3NDc2Ij4iSGFzIGV4dHJhw61kbyBpbmNvcnJlY3RhbWVudGUgdHUgcGF0csOzbiBkZSBkZXNibG9xdWVvIDx4bGlmZjpnIGlkPSJOVU1CRVJfMCI+JWQ8L3hsaWZmOmc+IHZlY2VzLiAiXG5cbiJWdWVsdmUgYSBpbnRlbnRhcmxvIGVuIDx4bGlmZjpnIGlkPSJOVU1CRVJfMSI+JWQ8L3hsaWZmOmc+IHNlZ3VuZG9zLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fdG9vX21hbnlfZmFpbGVkX3Bhc3N3b3JkX2F0dGVtcHRzX2RpYWxvZ19tZXNzYWdlIiBtc2dpZD0iNDkwNjAzNDM3NjQyNTE3NTM4MSI+IkhhcyBpbmdyZXNhZG8gdHUgY29udHJhc2XDsWEgZGUgbWFuZXJhIGluY29ycmVjdGEgPHhsaWZmOmcgaWQ9Ik5VTUJFUl8wIj4lZDwveGxpZmY6Zz4gdmVjZXMuICJcblxuIlZ1ZWx2ZSBhIGludGVudGFybG8gZW4gPHhsaWZmOmcgaWQ9Ik5VTUJFUl8xIj4lZDwveGxpZmY6Zz4gc2VndW5kb3MuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl90b29fbWFueV9mYWlsZWRfcGluX2F0dGVtcHRzX2RpYWxvZ19tZXNzYWdlIiBtc2dpZD0iNjgyNzc0OTIzMTQ2NTE0NTU5MCI+IkhhcyBpbmdyZXNhZG8gdHUgUElOIGRlIG1hbmVyYSBpbmNvcnJlY3RhIDx4bGlmZjpnIGlkPSJOVU1CRVJfMCI+JWQ8L3hsaWZmOmc+IHZlY2VzLiAiXG5cbiJWdWVsdmUgYSBpbnRlbnRhcmxvIGVuIDx4bGlmZjpnIGlkPSJOVU1CRVJfMSI+JWQ8L3hsaWZmOmc+IHNlZ3VuZG9zLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fZmFpbGVkX2F0dGVtcHRzX2FsbW9zdF9nbG9naW4iIG1zZ2lkPSIzMzUxMDEzODQyMzIwMTI3ODI3Ij4iSGFzIGV4dHJhw61kbyBpbmNvcnJlY3RhbWVudGUgdHUgcGF0csOzbiBkZSBkZXNibG9xdWVvIDx4bGlmZjpnIGlkPSJOVU1CRVJfMCI+JWQ8L3hsaWZmOmc+IHZlY2VzLiBMdWVnbyBkZSA8eGxpZmY6ZyBpZD0iTlVNQkVSXzEiPiVkPC94bGlmZjpnPiBpbnRlbnRvcyBpbmNvcnJlY3Rvcywgc2UgdGUgc29saWNpdGFyw6EgcXVlIGRlc2Jsb3F1ZWVzIHR1IHRlbMOpZm9ubyBhbCBpbmljaWFyIHNlc2nDs24gZW4gR29vZ2xlLiAiXG5cbiIgVnVlbHZlIGEgaW50ZW50YXJsbyBlbiA8eGxpZmY6ZyBpZD0iTlVNQkVSXzIiPiVkPC94bGlmZjpnPiBzZWd1bmRvcy4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3Rvb19tYW55X2ZhaWxlZF9hdHRlbXB0c19jb3VudGRvd24iIG1zZ2lkPSI2MjUxNDgwMzQzMzk0Mzg5NjY1Ij4iVnVlbHZlIGEgaW50ZW50YXJsbyBlbiA8eGxpZmY6ZyBpZD0iTlVNQkVSIj4lZDwveGxpZmY6Zz4gc2VndW5kb3MuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9mb3Jnb3RfcGF0dGVybl9idXR0b25fdGV4dCIgbXNnaWQ9IjI2MjY5OTk0NDk2MTA2OTU5MzAiPiLCv09sdmlkYXN0ZSBlbCBwYXRyw7NuPyI8L3N0cmluZz4KQEAgLTY5OSwxNCArNzA1LDE0IEBACiAgICAgPHN0cmluZyBuYW1lPSJlbGFwc2VkX3RpbWVfc2hvcnRfZm9ybWF0X21tX3NzIiBtc2dpZD0iNDQzMTU1NTk0MzgyODcxMTQ3MyI+Ijx4bGlmZjpnIGlkPSJNSU5VVEVTIj4lMSQwMmQ8L3hsaWZmOmc+Ojx4bGlmZjpnIGlkPSJTRUNPTkRTIj4lMiQwMmQ8L3hsaWZmOmc+Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iZWxhcHNlZF90aW1lX3Nob3J0X2Zvcm1hdF9oX21tX3NzIiBtc2dpZD0iMTg0NjA3MTk5NzYxNjY1NDEyNCI+Ijx4bGlmZjpnIGlkPSJIT1VSUyI+JTEkZDwveGxpZmY6Zz46PHhsaWZmOmcgaWQ9Ik1JTlVURVMiPiUyJDAyZDwveGxpZmY6Zz46PHhsaWZmOmcgaWQ9IlNFQ09ORFMiPiUzJDAyZDwveGxpZmY6Zz4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJzZWxlY3RBbGwiIG1zZ2lkPSI2ODc2NTE4OTI1ODQ0MTI5MzMxIj4iU2VsZWNjaW9uYXIgdG9kb3MiPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiAzODg5MTQ5MTIzNjI2ODg4NjM3IC0tPiAgICAgPHN0cmluZyBuYW1lPSJzZWxlY3RUZXh0IiBtc2dpZD0iNDg2MjM1OTMxMTA4ODg5ODg3OCI+IlNlbGVjY2lvbmFyIHRleHRvIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iY3V0IiBtc2dpZD0iMzA5MjU2OTQwODQzODYyNjI2MSI+IkNvcnRhciI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImNvcHkiIG1zZ2lkPSIyNjgxOTQ2MjI5NTMzNTExOTg3Ij4iQ29waWFyIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGFzdGUiIG1zZ2lkPSI1NjI5ODgwODM2ODA1MDM2NDMzIj4iUGVnYXIiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJjb3B5VXJsIiBtc2dpZD0iMjUzODIxMTU3OTU5NjA2NzQwMiI+IkNvcGlhciBVUkwiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJzZWxlY3RUZXh0TW9kZSIgbXNnaWQ9IjY3Mzg1NTYzNDg4NjEzNDcyNDAiPiJTZWxlY2Npb25hciB0ZXh0by4uLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InRleHRTZWxlY3Rpb25DQUJUaXRsZSIgbXNnaWQ9IjUyMzY4NTAzOTQzNzA4MjAzNTciPiJTZWxlY2Npw7NuIGRlIHRleHRvICI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImlucHV0TWV0aG9kIiBtc2dpZD0iMTY1MzYzMDA2MjMwNDU2Nzg3OSI+Ik3DqXRvZG8gZGUgZW50cmFkYSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImFkZFRvRGljdGlvbmFyeSIgbXNnaWQ9Ijg3OTM2MjQ5OTE2ODY5NDg3MDkiPiJBZ3JlZ2FyIFwiPHhsaWZmOmcgaWQ9IldPUkQiPiVzPC94bGlmZjpnPlwiIGFsIGRpY2Npb25hcmlvIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iZWRpdFRleHRNZW51VGl0bGUiIG1zZ2lkPSIxNjcyOTg5MTc2OTU4NTgxNDUyIj4iRWRpdGFyIHRleHRvIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZWRpdFRleHRNZW51VGl0bGUiIG1zZ2lkPSI0OTA5MTM1NTY0OTQxODE1NDk0Ij4iQWNjaW9uZXMgZGUgdGV4dG8iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb3dfaW50ZXJuYWxfc3RvcmFnZV92aWV3X3RpdGxlIiBtc2dpZD0iMTM5OTczMjQwODcwMTY5NzU0NiI+IlBvY28gZXNwYWNpbyBkZSBhbG1hY2VuYW1pZW50byI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9Imxvd19pbnRlcm5hbF9zdG9yYWdlX3ZpZXdfdGV4dCIgbXNnaWQ9IjYzNTEwNjU0NDYxNjM3ODgzNiI+IkhheSBwb2NvIGVzcGFjaW8gZGUgYWxtYWNlbmFtaWVudG8gZW4gZWwgdGVsw6lmb25vLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9Im9rIiBtc2dpZD0iNTk3MDA2MDQzMDU2MjUyNDkxMCI+IkFjZXB0YXIiPC9zdHJpbmc+CkBAIC03MTQsNiArNzIwLDcgQEAKICAgICA8c3RyaW5nIG5hbWU9InllcyIgbXNnaWQ9IjUzNjI5ODIzMDMzMzc5NjkzMTIiPiJBY2VwdGFyIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibm8iIG1zZ2lkPSI1MTQxNTMxMDQ0OTM1NTQxNDk3Ij4iQ2FuY2VsYXIiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJkaWFsb2dfYWxlcnRfdGl0bGUiIG1zZ2lkPSIyMDQ5NjU4NzA4NjA5MDQzMTAzIj4iQXRlbmNpw7NuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibG9hZGluZyIgbXNnaWQ9IjE3NjA3MjQ5OTg5MjgyNTUyNTAiPiJDYXJnYW5kby4uLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImNhcGl0YWxfb24iIG1zZ2lkPSIxNTQ0NjgyNzU1NTE0NDk0Mjk4Ij4iRW5jZW5kaWRvIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iY2FwaXRhbF9vZmYiIG1zZ2lkPSI2ODE1ODcwMzg2OTcyODA1ODMyIj4iQVBBR0FETyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9IndoaWNoQXBwbGljYXRpb24iIG1zZ2lkPSI0NTMzMTg1OTQ3MDY0NzczMzg2Ij4iQ29tcGxldGFyIGxhIGFjY2nDs24gbWVkaWFudGUiPC9zdHJpbmc+CkBAIC04NTQsMTUgKzg2MSwyNCBAQAogICAgIDxzdHJpbmcgbmFtZT0ibDJ0cF9pcHNlY19wc2tfdnBuX2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzk0NTA0MzU2NDAwODMwMzIzOSI+IkNsYXZlIHByZXZpYW1lbnRlIGNvbXBhcnRpZGEgc2Vnw7puIEwyVFAvSVBTZWMgVlBOIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibDJ0cF9pcHNlY19jcnRfdnBuX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNTM4MjcxNDA3MzEwMzY1MzU3NyI+IkNlcnRpZmljYWRvIHNlZ8O6biBMMlRQL0lQU2VjIFZQTiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InVwbG9hZF9maWxlIiBtc2dpZD0iMjg5Nzk1NzE3MjM2NjczMDQxNiI+IkVsZWdpciBhcmNoaXZvIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibm9fZmlsZV9jaG9zZW4iIG1zZ2lkPSI2MzYzNjQ4NTYyMTcwNzU5NDY1Ij4iTm8gc2Ugc2VsZWNjaW9uw7MgdW4gYXJjaGl2by4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJyZXNldCIgbXNnaWQ9IjI0NDgxNjgwODA5NjQyMDk5MDgiPiJSZXN0YWJsZWNlciI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InN1Ym1pdCIgbXNnaWQ9IjE2MDIzMzU1NzIwODk5MTE5NDEiPiJFbnZpYXIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJkZXNjcmlwdGlvbl9zdGFyIiBtc2dpZD0iMjY1NDMxOTg3NDkwODU3NjEzMyI+ImZhdm9yaXRvIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iY2FyX21vZGVfZGlzYWJsZV9ub3RpZmljYXRpb25fdGl0bGUiIG1zZ2lkPSIzMTY0NzY4MjEyMDAzODY0MzE2Ij4iTW9kbyBhdXRvIGhhYmlsaXRhZG8iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJjYXJfbW9kZV9kaXNhYmxlX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBtc2dpZD0iNjY4NjYzNjI2NzIxNjc1NjE0Ij4iU2VsZWNjaW9uYXIgcGFyYSBzYWxpciBkZWwgbW9kbyBhdXRvIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idGV0aGVyZWRfbm90aWZpY2F0aW9uX3RpdGxlIiBtc2dpZD0iMzE0NjY5NDIzNDM5ODIwMjYwMSI+IkFuY2xhamUgYSByZWQgbyB6b25hIGFjdGl2YSBjb25lY3RhZG9zIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idGV0aGVyZWRfbm90aWZpY2F0aW9uX21lc3NhZ2UiIG1zZ2lkPSIzMDY3MTA4MzIzOTAzMDQ4OTI3Ij4iVG9jYXIgcGFyYSBjb25maWd1cmFyIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iYmFja19idXR0b25fbGFiZWwiIG1zZ2lkPSIyMzAwNDcwMDA0NTAzMzQzNDM5Ij4iQXRyw6FzIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibmV4dF9idXR0b25fbGFiZWwiIG1zZ2lkPSIxMDgwNTU1MTA0Njc3OTkyNDA4Ij4iU2lndWllbnRlIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ic2tpcF9idXR0b25fbGFiZWwiIG1zZ2lkPSIxMjc1MzYyMjk5NDcxNjMxODE5Ij4iT21pdGlyIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idGhyb3R0bGVfd2FybmluZ19ub3RpZmljYXRpb25fdGl0bGUiIG1zZ2lkPSI0ODkwODk0MjY3NDU0ODY3Mjc2Ij4iQW1wbGlhIHV0aWxpemFjacOzbiBkZSBkYXRvcyBtw7N2aWxlcyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InRocm90dGxlX3dhcm5pbmdfbm90aWZpY2F0aW9uX21lc3NhZ2UiIG1zZ2lkPSIyNjA5NzM0NzYzODQ1NzA1NzA4Ij4iVG9jYSBwYXJhIG9idGVuZXIgbcOhcyBpbmZvcm1hY2nDs24gYWNlcmNhIGRlIGxhIHV0aWxpemFjacOzbiBkZSBkYXRvcyBtw7N2aWxlcy4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ0aHJvdHRsZWRfbm90aWZpY2F0aW9uX3RpdGxlIiBtc2dpZD0iNjI2OTU0MTg5NzcyOTc4MTMzMiI+IkzDrW1pdGUgZGUgZGF0b3MgbcOzdmlsZXMgZXhjZWRpZG8gIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idGhyb3R0bGVkX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBtc2dpZD0iNDcxMjM2OTg1NjYwMTI3NTE0NiI+IlRvY2EgcGFyYSBvYnRlbmVyIG3DoXMgaW5mb3JtYWNpw7NuIGFjZXJjYSBkZSBsYSB1dGlsaXphY2nDs24gZGUgZGF0b3MgbcOzdmlsZXMuIjwvc3RyaW5nPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIG5vX21hdGNoZXMgKDgxMjk0MjE5MDg5MTU4NDA3MzcpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgZmluZF9vbl9wYWdlICgxOTQ2Nzk5MjMzODIyODIwMzg0KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIG1hdGNoZXNfZm91bmQ6b25lICg4MTY3MTQ3MDgxMTM2NTc5NDM5KSAtLT4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBtYXRjaGVzX2ZvdW5kOm90aGVyICg0NjQxODcyNzk3MDY3NjA5MTc3KSAtLT4KIDwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL3ZhbHVlcy1lcy9zdHJpbmdzLnhtbCBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMtZXMvc3RyaW5ncy54bWwKaW5kZXggMGQyZjkzMi4uYjEyZjhiZSAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL3ZhbHVlcy1lcy9zdHJpbmdzLnhtbAorKysgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzLWVzL3N0cmluZ3MueG1sCkBAIC00MzIsNiArNDMyLDEwIEBACiAgICAgPHN0cmluZyBuYW1lPSJwb2xpY3lkZXNjX2ZvcmNlTG9jayIgbXNnaWQ9IjI4MTk4Njg2NjQ5NDYwODk3NDAiPiJQZXJtaXRlIGNvbnRyb2xhciBlbCBtb21lbnRvIGRlIGJsb3F1ZW8gZGVsIGRpc3Bvc2l0aXZvIHNvbGljaXRhbmRvIGFsIHVzdWFyaW8gcXVlIHZ1ZWx2YSBhIGludHJvZHVjaXIgbGEgY29udHJhc2XDsWEuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icG9saWN5bGFiX3dpcGVEYXRhIiBtc2dpZD0iMzkxMDU0NTQ0Njc1ODYzOTcxMyI+IkJvcnJhciB0b2RvcyBsb3MgZGF0b3MiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwb2xpY3lkZXNjX3dpcGVEYXRhIiBtc2dpZD0iMjMxNDA2MDkzMzc5NjM5NjIwNSI+IlBlcm1pdGUgcmVhbGl6YXIgdW4gcmVzdGFibGVjaW1pZW50byBkZSBmw6FicmljYSBlbGltaW5hbmRvIHRvZG9zIGxvcyBkYXRvcyBzaW4gY29uZmlybWFjacOzbi4iPC9zdHJpbmc+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcG9saWN5bGFiX3NldEdsb2JhbFByb3h5ICgyNzg0ODI4MjkzNzQ3NzkxNDQ2KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBvbGljeWRlc2Nfc2V0R2xvYmFsUHJveHkgKDYzODc0OTc0NjY2NjAxNTQ5MzEpIC0tPgorICAgIDxza2lwIC8+CiAgIDxzdHJpbmctYXJyYXkgbmFtZT0icGhvbmVUeXBlcyI+CiAgICAgPGl0ZW0gbXNnaWQ9Ijg5MDEwOTgzMzY2NTg3MTAzNTkiPiJDYXNhIjwvaXRlbT4KICAgICA8aXRlbSBtc2dpZD0iODY5OTIzNjUwNTI3MTM2NjE1Ij4iTcOzdmlsIjwvaXRlbT4KQEAgLTUyNSwxMCArNTI5LDkgQEAKICAgICA8c3RyaW5nIG5hbWU9Im9yZ1R5cGVXb3JrIiBtc2dpZD0iMjkyNjg4NzA1MDUzNjM4NzIiPiJUcmFiYWpvIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ib3JnVHlwZU90aGVyIiBtc2dpZD0iMzk1MTc4MTEzMTU3MDEyNDA4MiI+Ik90cmEiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJvcmdUeXBlQ3VzdG9tIiBtc2dpZD0iMjI1NTIzNDE1MzcyMDg4MzIyIj4iUGVyc29uYWxpemFkYSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImNvbnRhY3Rfc3RhdHVzX3VwZGF0ZV9hdHRyaWJ1dGlvbiIgbXNnaWQ9IjUxMTI1ODk4ODYwOTQ0MDI3OTUiPiJhIHRyYXbDqXMgZGUgPHhsaWZmOmcgaWQ9IlNPVVJDRSI+JTEkczwveGxpZmY6Zz4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJjb250YWN0X3N0YXR1c191cGRhdGVfYXR0cmlidXRpb25fd2l0aF9kYXRlIiBtc2dpZD0iNTk0NTM4NjM3NjM2OTk3OTkwOSI+Ijx4bGlmZjpnIGlkPSJEQVRFIj4lMSRzPC94bGlmZjpnPiBhIHRyYXbDqXMgZGUgPHhsaWZmOmcgaWQ9IlNPVVJDRSI+JTIkczwveGxpZmY6Zz4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJrZXlndWFyZF9wYXNzd29yZF9lbnRlcl9waW5fY29kZSIgbXNnaWQ9IjM3MzE0ODg4MjcyMTg4NzYxMTUiPiJJbnRyb2R1Y2UgZWwgY8OzZGlnbyBQSU4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJrZXlndWFyZF9wYXNzd29yZF9lbnRlcl9wYXNzd29yZF9jb2RlIiBtc2dpZD0iOTEzODE1ODM0NDgxMzIxMzc1NCI+IkludHJvZHVjaXIgY29udHJhc2XDsWEgcGFyYSBkZXNibG9xdWVhciI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImtleWd1YXJkX3Bhc3N3b3JkX2VudGVyX3Bpbl9wYXNzd29yZF9jb2RlIiBtc2dpZD0iNjM4MzQ3MDc1NjI1NDkxNTE0Ij4iSW50cm9kdWNpciBQSU4gcGFyYSBkZXNibG9xdWVhciI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImtleWd1YXJkX3Bhc3N3b3JkX3dyb25nX3Bpbl9jb2RlIiBtc2dpZD0iMTI5NTk4NDExNDMzODEwNzcxOCI+IkVsIGPDs2RpZ28gUElOIGVzIGluY29ycmVjdG8uIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ia2V5Z3VhcmRfbGFiZWxfdGV4dCIgbXNnaWQ9Ijg2MTc5NjQ2MTAyODI5ODQyNCI+IlBhcmEgZGVzYmxvcXVlYXIgZWwgdGVsw6lmb25vLCBwdWxzYSBsYSB0ZWNsYSBkZSBtZW7DuiB5LCBhIGNvbnRpbnVhY2nDs24sIHB1bHNhIDAuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iZW1lcmdlbmN5X2NhbGxfZGlhbG9nX251bWJlcl9mb3JfZGlzcGxheSIgbXNnaWQ9IjY5NjE5MjEwMzE5NTA5MDk3MCI+Ik7Dum1lcm8gZGUgZW1lcmdlbmNpYSI8L3N0cmluZz4KQEAgLTU0MSw2ICs1NDQsNyBAQAogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9yZXR1cm5fdG9fY2FsbCIgbXNnaWQ9IjUyNDQyNTk3ODU1MDAwNDAwMjEiPiJWb2x2ZXIgYSBsbGFtYWRhIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9wYXR0ZXJuX2NvcnJlY3QiIG1zZ2lkPSI5MDM5MDA4NjUwMzYyMjYxMjM3Ij4iQ29ycmVjdG8iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3BhdHRlcm5fd3JvbmciIG1zZ2lkPSI0ODE3NTgzMjc5MDUzMTEyMzEyIj4iSW50w6ludGFsbyBkZSBudWV2byI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fcGFzc3dvcmRfd3JvbmciIG1zZ2lkPSI2MjM3NDQzNjU3MzU4MTY4ODE5Ij4iSW50w6ludGFsbyBkZSBudWV2byI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fcGx1Z2dlZF9pbiIgbXNnaWQ9IjYxMzM0Mzg1Mjg0Mjk0NDQzNSI+IkNhcmdhbmRvICg8eGxpZmY6ZyBpZD0iTlVNQkVSIj4lZDwveGxpZmY6Zz48eGxpZmY6ZyBpZD0iUEVSQ0VOVCI+JSU8L3hsaWZmOmc+KSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fY2hhcmdlZCIgbXNnaWQ9IjQ5Mzg5MzA0NTk2MjA5ODk5NzIiPiJDYXJnYWRvIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9iYXR0ZXJ5X3Nob3J0IiBtc2dpZD0iMzYxNzU0OTE3ODYwMzM1NDY1NiI+Ijx4bGlmZjpnIGlkPSJOVU1CRVIiPiVkPC94bGlmZjpnPiA8eGxpZmY6ZyBpZD0iUEVSQ0VOVCI+JSU8L3hsaWZmOmc+Ijwvc3RyaW5nPgpAQCAtNTU1LDYgKzU1OSw4IEBACiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3NpbV9sb2NrZWRfbWVzc2FnZSIgbXNnaWQ9IjgwNjY2NjAxMjkyMDYwMDEwMzkiPiJJbnRyb2R1Y2UgZWwgY8OzZGlnbyBQSU4uIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9zaW1fdW5sb2NrX3Byb2dyZXNzX2RpYWxvZ19tZXNzYWdlIiBtc2dpZD0iNTk1MzIzMjE0MDUyODgxMjY0Ij4iRGVzYmxvcXVlYW5kbyB0YXJqZXRhIFNJTS4uLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fdG9vX21hbnlfZmFpbGVkX2F0dGVtcHRzX2RpYWxvZ19tZXNzYWdlIiBtc2dpZD0iMzUxNDc0MjEwNjA2Njg3NzQ3NiI+IkhhcyByZWFsaXphZG8gPHhsaWZmOmcgaWQ9Ik5VTUJFUl8wIj4lZDwveGxpZmY6Zz4gaW50ZW50b3MgZmFsbGlkb3MgZGUgY3JlYWNpw7NuIGRlIHVuIHBhdHLDs24gZGUgZGVzYmxvcXVlby4gIlxuXG4iSW50w6ludGFsbyBkZSBudWV2byBkZW50cm8gZGUgPHhsaWZmOmcgaWQ9Ik5VTUJFUl8xIj4lZDwveGxpZmY6Zz4gc2VndW5kb3MuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl90b29fbWFueV9mYWlsZWRfcGFzc3dvcmRfYXR0ZW1wdHNfZGlhbG9nX21lc3NhZ2UiIG1zZ2lkPSI0OTA2MDM0Mzc2NDI1MTc1MzgxIj4iSGFzIGludHJvZHVjaWRvIHVuYSBjb250cmFzZcOxYSBpbmNvcnJlY3RhIDx4bGlmZjpnIGlkPSJOVU1CRVJfMCI+JWQ8L3hsaWZmOmc+IHZlY2VzLiAiXG5cbiJJbnTDqW50YWxvIGRlIG51ZXZvIGRlbnRybyBkZSA8eGxpZmY6ZyBpZD0iTlVNQkVSXzEiPiVkPC94bGlmZjpnPiBzZWd1bmRvcy4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3Rvb19tYW55X2ZhaWxlZF9waW5fYXR0ZW1wdHNfZGlhbG9nX21lc3NhZ2UiIG1zZ2lkPSI2ODI3NzQ5MjMxNDY1MTQ1NTkwIj4iSGFzIGludHJvZHVjaWRvIHVuIFBJTiBpbmNvcnJlY3RvIDx4bGlmZjpnIGlkPSJOVU1CRVJfMCI+JWQ8L3hsaWZmOmc+IHZlY2VzLiAiXG5cbiJJbnTDqW50YWxvIGRlIG51ZXZvIGRlbnRybyBkZSA8eGxpZmY6ZyBpZD0iTlVNQkVSXzEiPiVkPC94bGlmZjpnPiBzZWd1bmRvcy4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX2ZhaWxlZF9hdHRlbXB0c19hbG1vc3RfZ2xvZ2luIiBtc2dpZD0iMzM1MTAxMzg0MjMyMDEyNzgyNyI+IkhhcyByZWFsaXphZG8gPHhsaWZmOmcgaWQ9Ik5VTUJFUl8wIj4lZDwveGxpZmY6Zz4gaW50ZW50b3MgZmFsbGlkb3MgZGUgY3JlYWNpw7NuIGRlbCBwYXRyw7NuIGRlIGRlc2Jsb3F1ZW8uIFNpIHJlYWxpemFzIDx4bGlmZjpnIGlkPSJOVU1CRVJfMSI+JWQ8L3hsaWZmOmc+IGludGVudG9zIGZhbGxpZG9zIG3DoXMsIHNlIHRlIHBlZGlyw6EgcXVlIGRlc2Jsb3F1ZWVzIGVsIHRlbMOpZm9ubyBjb24gdHVzIGNyZWRlbmNpYWxlcyBkZSBhY2Nlc28gZGUgR29vZ2xlLiJcblxuIiBFc3BlcmEgPHhsaWZmOmcgaWQ9Ik5VTUJFUl8yIj4lZDwveGxpZmY6Zz4gc2VndW5kb3MgZSBpbnTDqW50YWxvIGRlIG51ZXZvLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fdG9vX21hbnlfZmFpbGVkX2F0dGVtcHRzX2NvdW50ZG93biIgbXNnaWQ9IjYyNTE0ODAzNDMzOTQzODk2NjUiPiJFc3BlcmEgPHhsaWZmOmcgaWQ9Ik5VTUJFUiI+JWQ8L3hsaWZmOmc+IHNlZ3VuZG9zIHkgdnVlbHZlIGEgaW50ZW50YXJsby4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX2ZvcmdvdF9wYXR0ZXJuX2J1dHRvbl90ZXh0IiBtc2dpZD0iMjYyNjk5OTQ0OTYxMDY5NTkzMCI+IsK/SGFzIG9sdmlkYWRvIGVsIHBhdHLDs24/Ijwvc3RyaW5nPgpAQCAtNjk5LDE0ICs3MDUsMTQgQEAKICAgICA8c3RyaW5nIG5hbWU9ImVsYXBzZWRfdGltZV9zaG9ydF9mb3JtYXRfbW1fc3MiIG1zZ2lkPSI0NDMxNTU1OTQzODI4NzExNDczIj4iPHhsaWZmOmcgaWQ9Ik1JTlVURVMiPiUxJDAyZDwveGxpZmY6Zz46PHhsaWZmOmcgaWQ9IlNFQ09ORFMiPiUyJDAyZDwveGxpZmY6Zz4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJlbGFwc2VkX3RpbWVfc2hvcnRfZm9ybWF0X2hfbW1fc3MiIG1zZ2lkPSIxODQ2MDcxOTk3NjE2NjU0MTI0Ij4iPHhsaWZmOmcgaWQ9IkhPVVJTIj4lMSRkPC94bGlmZjpnPjo8eGxpZmY6ZyBpZD0iTUlOVVRFUyI+JTIkMDJkPC94bGlmZjpnPjo8eGxpZmY6ZyBpZD0iU0VDT05EUyI+JTMkMDJkPC94bGlmZjpnPiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InNlbGVjdEFsbCIgbXNnaWQ9IjY4NzY1MTg5MjU4NDQxMjkzMzEiPiJTZWxlY2Npb25hciB0b2RvIjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gMzg4OTE0OTEyMzYyNjg4ODYzNyAtLT4gICAgIDxzdHJpbmcgbmFtZT0ic2VsZWN0VGV4dCIgbXNnaWQ9IjQ4NjIzNTkzMTEwODg4OTg4NzgiPiJTZWxlY2Npb25hciB0ZXh0byI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImN1dCIgbXNnaWQ9IjMwOTI1Njk0MDg0Mzg2MjYyNjEiPiJDb3J0YXIiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJjb3B5IiBtc2dpZD0iMjY4MTk0NjIyOTUzMzUxMTk4NyI+IkNvcGlhciI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBhc3RlIiBtc2dpZD0iNTYyOTg4MDgzNjgwNTAzNjQzMyI+IlBlZ2FyIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iY29weVVybCIgbXNnaWQ9IjI1MzgyMTE1Nzk1OTYwNjc0MDIiPiJDb3BpYXIgVVJMIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ic2VsZWN0VGV4dE1vZGUiIG1zZ2lkPSI2NzM4NTU2MzQ4ODYxMzQ3MjQwIj4iU2VsZWNjaW9uYXIgdGV4dG8uLi4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJ0ZXh0U2VsZWN0aW9uQ0FCVGl0bGUiIG1zZ2lkPSI1MjM2ODUwMzk0MzcwODIwMzU3Ij4iU2VsZWNjacOzbiBkZSB0ZXh0byI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImlucHV0TWV0aG9kIiBtc2dpZD0iMTY1MzYzMDA2MjMwNDU2Nzg3OSI+Ik3DqXRvZG8gZGUgaW50cm9kdWNjacOzbiBkZSB0ZXh0byI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImFkZFRvRGljdGlvbmFyeSIgbXNnaWQ9Ijg3OTM2MjQ5OTE2ODY5NDg3MDkiPiJBw7FhZGlyIFwiPHhsaWZmOmcgaWQ9IldPUkQiPiVzPC94bGlmZjpnPlwiIGFsIGRpY2Npb25hcmlvIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iZWRpdFRleHRNZW51VGl0bGUiIG1zZ2lkPSIxNjcyOTg5MTc2OTU4NTgxNDUyIj4iRWRpdGFyIHRleHRvIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZWRpdFRleHRNZW51VGl0bGUiIG1zZ2lkPSI0OTA5MTM1NTY0OTQxODE1NDk0Ij4iQWNjaW9uZXMgZGUgdGV4dG8iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb3dfaW50ZXJuYWxfc3RvcmFnZV92aWV3X3RpdGxlIiBtc2dpZD0iMTM5OTczMjQwODcwMTY5NzU0NiI+IlBvY28gZXNwYWNpbyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9Imxvd19pbnRlcm5hbF9zdG9yYWdlX3ZpZXdfdGV4dCIgbXNnaWQ9IjYzNTEwNjU0NDYxNjM3ODgzNiI+IlNlIGVzdMOhIGFnb3RhbmRvIGVsIGVzcGFjaW8gZGUgYWxtYWNlbmFtaWVudG8gZGVsIHRlbMOpZm9uby4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJvayIgbXNnaWQ9IjU5NzAwNjA0MzA1NjI1MjQ5MTAiPiJBY2VwdGFyIjwvc3RyaW5nPgpAQCAtNzE0LDYgKzcyMCw3IEBACiAgICAgPHN0cmluZyBuYW1lPSJ5ZXMiIG1zZ2lkPSI1MzYyOTgyMzAzMzM3OTY5MzEyIj4iQWNlcHRhciI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9Im5vIiBtc2dpZD0iNTE0MTUzMTA0NDkzNTU0MTQ5NyI+IkNhbmNlbGFyIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iZGlhbG9nX2FsZXJ0X3RpdGxlIiBtc2dpZD0iMjA0OTY1ODcwODYwOTA0MzEwMyI+IkF0ZW5jacOzbiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImxvYWRpbmciIG1zZ2lkPSIxNzYwNzI0OTk4OTI4MjU1MjUwIj4iQ2FyZ2FuZG/igKYiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJjYXBpdGFsX29uIiBtc2dpZD0iMTU0NDY4Mjc1NTUxNDQ5NDI5OCI+IkFjdGl2YWRvIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iY2FwaXRhbF9vZmYiIG1zZ2lkPSI2ODE1ODcwMzg2OTcyODA1ODMyIj4iRGVzY29uZWN0YWRvIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0id2hpY2hBcHBsaWNhdGlvbiIgbXNnaWQ9IjQ1MzMxODU5NDcwNjQ3NzMzODYiPiJDb21wbGV0YXIgYWNjacOzbiB1dGlsaXphbmRvIjwvc3RyaW5nPgpAQCAtODU0LDE1ICs4NjEsMjQgQEAKICAgICA8c3RyaW5nIG5hbWU9ImwydHBfaXBzZWNfcHNrX3Zwbl9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM5NDUwNDM1NjQwMDgzMDMyMzkiPiJSZWQgcHJpdmFkYSB2aXJ0dWFsIEwyVFAvSVBTZWMgYmFzYWRhIGVuIGNsYXZlIGNvbXBhcnRpZGEgcHJldmlhbWVudGUiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsMnRwX2lwc2VjX2NydF92cG5fZGVzY3JpcHRpb24iIG1zZ2lkPSI1MzgyNzE0MDczMTAzNjUzNTc3Ij4iUmVkIHByaXZhZGEgdmlydHVhbCBMMlRQL0lQU2VjIGJhc2FkYSBlbiBjZXJ0aWZpY2FkbyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InVwbG9hZF9maWxlIiBtc2dpZD0iMjg5Nzk1NzE3MjM2NjczMDQxNiI+IlNlbGVjY2lvbmFyIGFyY2hpdm8iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJub19maWxlX2Nob3NlbiIgbXNnaWQ9IjYzNjM2NDg1NjIxNzA3NTk0NjUiPiJBcmNoaXZvIG5vIHNlbGVjY2lvbmFkbyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InJlc2V0IiBtc2dpZD0iMjQ0ODE2ODA4MDk2NDIwOTkwOCI+IlJlc3RhYmxlY2VyIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ic3VibWl0IiBtc2dpZD0iMTYwMjMzNTU3MjA4OTkxMTk0MSI+IkVudmlhciI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImRlc2NyaXB0aW9uX3N0YXIiIG1zZ2lkPSIyNjU0MzE5ODc0OTA4NTc2MTMzIj4iZmF2b3JpdG9zIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iY2FyX21vZGVfZGlzYWJsZV9ub3RpZmljYXRpb25fdGl0bGUiIG1zZ2lkPSIzMTY0NzY4MjEyMDAzODY0MzE2Ij4iU2UgaGEgaGFiaWxpdGFkbyBlbCBtb2RvIGNvY2hlLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImNhcl9tb2RlX2Rpc2FibGVfbm90aWZpY2F0aW9uX21lc3NhZ2UiIG1zZ2lkPSI2Njg2NjM2MjY3MjE2NzU2MTQiPiJTZWxlY2Npb25hIGVzdGEgb3BjacOzbiBwYXJhIHNhbGlyIGRlbCBtb2RvIGNvY2hlLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InRldGhlcmVkX25vdGlmaWNhdGlvbl90aXRsZSIgbXNnaWQ9IjMxNDY2OTQyMzQzOTgyMDI2MDEiPiJBbmNsYWplIGEgcmVkIGFjdGl2byBvIHpvbmEgV2ktRmkiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ0ZXRoZXJlZF9ub3RpZmljYXRpb25fbWVzc2FnZSIgbXNnaWQ9IjMwNjcxMDgzMjM5MDMwNDg5MjciPiJUb2NhIHBhcmEgaW5pY2lhciBsYSBjb25maWd1cmFjacOzbi4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJiYWNrX2J1dHRvbl9sYWJlbCIgbXNnaWQ9IjIzMDA0NzAwMDQ1MDMzNDM0MzkiPiJBdHLDoXMiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJuZXh0X2J1dHRvbl9sYWJlbCIgbXNnaWQ9IjEwODA1NTUxMDQ2Nzc5OTI0MDgiPiJTaWd1aWVudGUiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJza2lwX2J1dHRvbl9sYWJlbCIgbXNnaWQ9IjEyNzUzNjIyOTk0NzE2MzE4MTkiPiJPbWl0aXIiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ0aHJvdHRsZV93YXJuaW5nX25vdGlmaWNhdGlvbl90aXRsZSIgbXNnaWQ9IjQ4OTA4OTQyNjc0NTQ4NjcyNzYiPiJVc28gZWxldmFkbyBkYXRvcyBtw7N2aWxlcyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InRocm90dGxlX3dhcm5pbmdfbm90aWZpY2F0aW9uX21lc3NhZ2UiIG1zZ2lkPSIyNjA5NzM0NzYzODQ1NzA1NzA4Ij4iTcOhcyBpbmZvcm1hY2nDs24gc29icmUgdXNvIGRlIGRhdG9zIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idGhyb3R0bGVkX25vdGlmaWNhdGlvbl90aXRsZSIgbXNnaWQ9IjYyNjk1NDE4OTc3Mjk3ODEzMzIiPiJMw61taXRlIGRhdG9zIHN1cGVyYWRvIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idGhyb3R0bGVkX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBtc2dpZD0iNDcxMjM2OTg1NjYwMTI3NTE0NiI+Ik3DoXMgaW5mb3JtYWNpw7NuIHNvYnJlIHVzbyBkZSBkYXRvcyI8L3N0cmluZz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBub19tYXRjaGVzICg4MTI5NDIxOTA4OTE1ODQwNzM3KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGZpbmRfb25fcGFnZSAoMTk0Njc5OTIzMzgyMjgyMDM4NCkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBtYXRjaGVzX2ZvdW5kOm9uZSAoODE2NzE0NzA4MTEzNjU3OTQzOSkgLS0+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgbWF0Y2hlc19mb3VuZDpvdGhlciAoNDY0MTg3Mjc5NzA2NzYwOTE3NykgLS0+CiA8L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy92YWx1ZXMtZnIvc3RyaW5ncy54bWwgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzLWZyL3N0cmluZ3MueG1sCmluZGV4IGI0ZjgwNDYuLjUzNDdhNDUgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy92YWx1ZXMtZnIvc3RyaW5ncy54bWwKKysrIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy1mci9zdHJpbmdzLnhtbApAQCAtNDMyLDYgKzQzMiwxMCBAQAogICAgIDxzdHJpbmcgbmFtZT0icG9saWN5ZGVzY19mb3JjZUxvY2siIG1zZ2lkPSIyODE5ODY4NjY0OTQ2MDg5NzQwIj4iQ29udHLDtGxlIGxlIHZlcnJvdWlsbGFnZSBkdSBww6lyaXBow6lyaXF1ZSwgYXZlYyBvYmxpZ2F0aW9uIGRlIHNhaXNpciDDoCBub3V2ZWF1IGxlIG1vdCBkZSBwYXNzZS4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwb2xpY3lsYWJfd2lwZURhdGEiIG1zZ2lkPSIzOTEwNTQ1NDQ2NzU4NjM5NzEzIj4iRWZmYWNlciB0b3V0ZXMgbGVzIGRvbm7DqWVzIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icG9saWN5ZGVzY193aXBlRGF0YSIgbXNnaWQ9IjIzMTQwNjA5MzM3OTYzOTYyMDUiPiJSw6l0YWJsaXQgbGVzIHBhcmFtw6h0cmVzIGRcJ3VzaW5lLCBzdXBwcmltYW50IHRvdXRlcyB2b3MgZG9ubsOpZXMgc2FucyBkZW1hbmRlIGRlIGNvbmZpcm1hdGlvbi4iPC9zdHJpbmc+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcG9saWN5bGFiX3NldEdsb2JhbFByb3h5ICgyNzg0ODI4MjkzNzQ3NzkxNDQ2KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBvbGljeWRlc2Nfc2V0R2xvYmFsUHJveHkgKDYzODc0OTc0NjY2NjAxNTQ5MzEpIC0tPgorICAgIDxza2lwIC8+CiAgIDxzdHJpbmctYXJyYXkgbmFtZT0icGhvbmVUeXBlcyI+CiAgICAgPGl0ZW0gbXNnaWQ9Ijg5MDEwOTgzMzY2NTg3MTAzNTkiPiJEb21pY2lsZSI8L2l0ZW0+CiAgICAgPGl0ZW0gbXNnaWQ9Ijg2OTkyMzY1MDUyNzEzNjYxNSI+IlBvcnRhYmxlIjwvaXRlbT4KQEAgLTUyNSwxMCArNTI5LDkgQEAKICAgICA8c3RyaW5nIG5hbWU9Im9yZ1R5cGVXb3JrIiBtc2dpZD0iMjkyNjg4NzA1MDUzNjM4NzIiPiJCdXJlYXUiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJvcmdUeXBlT3RoZXIiIG1zZ2lkPSIzOTUxNzgxMTMxNTcwMTI0MDgyIj4iQXV0cmUiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJvcmdUeXBlQ3VzdG9tIiBtc2dpZD0iMjI1NTIzNDE1MzcyMDg4MzIyIj4iUGVyc29ubmFsaXPDqSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImNvbnRhY3Rfc3RhdHVzX3VwZGF0ZV9hdHRyaWJ1dGlvbiIgbXNnaWQ9IjUxMTI1ODk4ODYwOTQ0MDI3OTUiPiJ2aWEgPHhsaWZmOmcgaWQ9IlNPVVJDRSI+JTEkczwveGxpZmY6Zz4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJjb250YWN0X3N0YXR1c191cGRhdGVfYXR0cmlidXRpb25fd2l0aF9kYXRlIiBtc2dpZD0iNTk0NTM4NjM3NjM2OTk3OTkwOSI+Ijx4bGlmZjpnIGlkPSJEQVRFIj4lMSRzPC94bGlmZjpnPiB2aWEgPHhsaWZmOmcgaWQ9IlNPVVJDRSI+JTIkczwveGxpZmY6Zz4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJrZXlndWFyZF9wYXNzd29yZF9lbnRlcl9waW5fY29kZSIgbXNnaWQ9IjM3MzE0ODg4MjcyMTg4NzYxMTUiPiJTYWlzaXNzZXogbGUgY29kZSBQSU4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJrZXlndWFyZF9wYXNzd29yZF9lbnRlcl9wYXNzd29yZF9jb2RlIiBtc2dpZD0iOTEzODE1ODM0NDgxMzIxMzc1NCI+IlNhaXNpc3NleiBsZSBtb3QgZGUgcGFzc2UgcG91ciBwcm9jw6lkZXIgYXUgZMOpdmVycm91aWxsYWdlLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImtleWd1YXJkX3Bhc3N3b3JkX2VudGVyX3Bpbl9wYXNzd29yZF9jb2RlIiBtc2dpZD0iNjM4MzQ3MDc1NjI1NDkxNTE0Ij4iU2Fpc2lzc2V6IGxlIGNvZGUgUElOIHBvdXIgcHJvY8OpZGVyIGF1IGTDqXZlcnJvdWlsbGFnZS4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJrZXlndWFyZF9wYXNzd29yZF93cm9uZ19waW5fY29kZSIgbXNnaWQ9IjEyOTU5ODQxMTQzMzgxMDc3MTgiPiJMZSBjb2RlIFBJTiBlc3QgaW5jb3JyZWN0wqAhIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ia2V5Z3VhcmRfbGFiZWxfdGV4dCIgbXNnaWQ9Ijg2MTc5NjQ2MTAyODI5ODQyNCI+IlBvdXIgZMOpYmxvcXVlciBsZSBjbGF2aWVyLCBhcHB1eWV6IHN1ciBcIk1lbnVcIiBwdWlzIHN1ciAwLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImVtZXJnZW5jeV9jYWxsX2RpYWxvZ19udW1iZXJfZm9yX2Rpc3BsYXkiIG1zZ2lkPSI2OTYxOTIxMDMxOTUwOTA5NzAiPiJOdW3DqXJvIGRcJ3VyZ2VuY2UiPC9zdHJpbmc+CkBAIC01NDEsNiArNTQ0LDcgQEAKICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fcmV0dXJuX3RvX2NhbGwiIG1zZ2lkPSI1MjQ0MjU5Nzg1NTAwMDQwMDIxIj4iUmV0b3VyIMOgIGxcJ2FwcGVsIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9wYXR0ZXJuX2NvcnJlY3QiIG1zZ2lkPSI5MDM5MDA4NjUwMzYyMjYxMjM3Ij4iQ29tYmluYWlzb24gY29ycmVjdGXCoCEiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3BhdHRlcm5fd3JvbmciIG1zZ2lkPSI0ODE3NTgzMjc5MDUzMTEyMzEyIj4iSW5jb3JyZWN0LiBNZXJjaSBkZSByw6llc3NheWVyLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fcGFzc3dvcmRfd3JvbmciIG1zZ2lkPSI2MjM3NDQzNjU3MzU4MTY4ODE5Ij4iSW5jb3JyZWN0LiBNZXJjaSBkZSByw6llc3NheWVyLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fcGx1Z2dlZF9pbiIgbXNnaWQ9IjYxMzM0Mzg1Mjg0Mjk0NDQzNSI+IkNoYXJnZW1lbnQgKDx4bGlmZjpnIGlkPSJOVU1CRVIiPiVkPC94bGlmZjpnPsKgPHhsaWZmOmcgaWQ9IlBFUkNFTlQiPiUlPC94bGlmZjpnPikiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX2NoYXJnZWQiIG1zZ2lkPSI0OTM4OTMwNDU5NjIwOTg5OTcyIj4iQ2hhcmfDqSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fYmF0dGVyeV9zaG9ydCIgbXNnaWQ9IjM2MTc1NDkxNzg2MDMzNTQ2NTYiPiI8eGxpZmY6ZyBpZD0iTlVNQkVSIj4lZDwveGxpZmY6Zz7CoDx4bGlmZjpnIGlkPSJQRVJDRU5UIj4lJTwveGxpZmY6Zz4iPC9zdHJpbmc+CkBAIC01NTUsNiArNTU5LDggQEAKICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fc2ltX2xvY2tlZF9tZXNzYWdlIiBtc2dpZD0iODA2NjY2MDEyOTIwNjAwMTAzOSI+IkxhIGNhcnRlIFNJTSBlc3QgdmVycm91aWxsw6llLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fc2ltX3VubG9ja19wcm9ncmVzc19kaWFsb2dfbWVzc2FnZSIgbXNnaWQ9IjU5NTMyMzIxNDA1Mjg4MTI2NCI+IkTDqWJsb2NhZ2UgZGUgbGEgY2FydGUgU0lNLi4uIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl90b29fbWFueV9mYWlsZWRfYXR0ZW1wdHNfZGlhbG9nX21lc3NhZ2UiIG1zZ2lkPSIzNTE0NzQyMTA2MDY2ODc3NDc2Ij4iVm91cyBhdmV6IG1hbCByZXByb2R1aXQgbGUgc2Now6ltYSBkZSBkw6l2ZXJyb3VpbGxhZ2UgPHhsaWZmOmcgaWQ9Ik5VTUJFUl8wIj4lZDwveGxpZmY6Zz4gZm9pcy4gIlxuXG4iVmV1aWxsZXogcsOpZXNzYXllciBkYW5zIDx4bGlmZjpnIGlkPSJOVU1CRVJfMSI+JWQ8L3hsaWZmOmc+IHNlY29uZGVzLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fdG9vX21hbnlfZmFpbGVkX3Bhc3N3b3JkX2F0dGVtcHRzX2RpYWxvZ19tZXNzYWdlIiBtc2dpZD0iNDkwNjAzNDM3NjQyNTE3NTM4MSI+IlZvdXMgYXZleiBzYWlzaSB1biBtb3QgZGUgcGFzc2UgaW5jb3JyZWN0IMOgIDx4bGlmZjpnIGlkPSJOVU1CRVJfMCI+JWQ8L3hsaWZmOmc+wqByZXByaXNlcy4gIlxuXG4iVmV1aWxsZXogcsOpZXNzYXllciBkYW5zIDx4bGlmZjpnIGlkPSJOVU1CRVJfMSI+JWQ8L3hsaWZmOmc+wqBzZWNvbmRlcy4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3Rvb19tYW55X2ZhaWxlZF9waW5fYXR0ZW1wdHNfZGlhbG9nX21lc3NhZ2UiIG1zZ2lkPSI2ODI3NzQ5MjMxNDY1MTQ1NTkwIj4iVm91cyBhdmV6IHNhaXNpIHVuIGNvZGUgUElOIGluY29ycmVjdCDDoCA8eGxpZmY6ZyBpZD0iTlVNQkVSXzAiPiVkPC94bGlmZjpnPsKgcmVwcmlzZXMuICJcblxuIlZldWlsbGV6IHLDqWVzc2F5ZXIgZGFucyA8eGxpZmY6ZyBpZD0iTlVNQkVSXzEiPiVkPC94bGlmZjpnPsKgc2Vjb25kZXMuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9mYWlsZWRfYXR0ZW1wdHNfYWxtb3N0X2dsb2dpbiIgbXNnaWQ9IjMzNTEwMTM4NDIzMjAxMjc4MjciPiJWb3VzIGF2ZXogbWFsIHNhaXNpIGxlIHNjaMOpbWEgZGUgZMOpdmVycm91aWxsYWdlIDx4bGlmZjpnIGlkPSJOVU1CRVJfMCI+JWQ8L3hsaWZmOmc+IGZvaXMuIEF1IGJvdXQgZGUgPHhsaWZmOmcgaWQ9Ik5VTUJFUl8xIj4lZDwveGxpZmY6Zz4gdGVudGF0aXZlcyBzdXBwbMOpbWVudGFpcmVzLCB2b3VzIGRldnJleiBkw6libG9xdWVyIHZvdHJlIHTDqWzDqXBob25lIMOgIGxcJ2FpZGUgZGUgdm90cmUgaWRlbnRpZmlhbnQgR29vZ2xlLiJcblxuIk1lcmNpIGRlIHLDqWVzc2F5ZXIgZGFucyA8eGxpZmY6ZyBpZD0iTlVNQkVSXzIiPiVkPC94bGlmZjpnPiBzZWNvbmRlcy4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3Rvb19tYW55X2ZhaWxlZF9hdHRlbXB0c19jb3VudGRvd24iIG1zZ2lkPSI2MjUxNDgwMzQzMzk0Mzg5NjY1Ij4iUsOpZXNzYXlleiBkYW5zIDx4bGlmZjpnIGlkPSJOVU1CRVIiPiVkPC94bGlmZjpnPsKgc2Vjb25kZXMuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9mb3Jnb3RfcGF0dGVybl9idXR0b25fdGV4dCIgbXNnaWQ9IjI2MjY5OTk0NDk2MTA2OTU5MzAiPiJTY2jDqW1hIG91Ymxpw6kgPyI8L3N0cmluZz4KQEAgLTY5OSwxNCArNzA1LDE0IEBACiAgICAgPHN0cmluZyBuYW1lPSJlbGFwc2VkX3RpbWVfc2hvcnRfZm9ybWF0X21tX3NzIiBtc2dpZD0iNDQzMTU1NTk0MzgyODcxMTQ3MyI+Ijx4bGlmZjpnIGlkPSJNSU5VVEVTIj4lMSQwMmQ8L3hsaWZmOmc+Ojx4bGlmZjpnIGlkPSJTRUNPTkRTIj4lMiQwMmQ8L3hsaWZmOmc+Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iZWxhcHNlZF90aW1lX3Nob3J0X2Zvcm1hdF9oX21tX3NzIiBtc2dpZD0iMTg0NjA3MTk5NzYxNjY1NDEyNCI+Ijx4bGlmZjpnIGlkPSJIT1VSUyI+JTEkZDwveGxpZmY6Zz46PHhsaWZmOmcgaWQ9Ik1JTlVURVMiPiUyJDAyZDwveGxpZmY6Zz46PHhsaWZmOmcgaWQ9IlNFQ09ORFMiPiUzJDAyZDwveGxpZmY6Zz4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJzZWxlY3RBbGwiIG1zZ2lkPSI2ODc2NTE4OTI1ODQ0MTI5MzMxIj4iVG91dCBzw6lsZWN0aW9ubmVyIjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gMzg4OTE0OTEyMzYyNjg4ODYzNyAtLT4gICAgIDxzdHJpbmcgbmFtZT0ic2VsZWN0VGV4dCIgbXNnaWQ9IjQ4NjIzNTkzMTEwODg4OTg4NzgiPiJTw6lsZWN0aW9ubmVyIGxlIHRleHRlIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iY3V0IiBtc2dpZD0iMzA5MjU2OTQwODQzODYyNjI2MSI+IkNvdXBlciI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImNvcHkiIG1zZ2lkPSIyNjgxOTQ2MjI5NTMzNTExOTg3Ij4iQ29waWVyIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGFzdGUiIG1zZ2lkPSI1NjI5ODgwODM2ODA1MDM2NDMzIj4iQ29sbGVyIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iY29weVVybCIgbXNnaWQ9IjI1MzgyMTE1Nzk1OTYwNjc0MDIiPiJDb3BpZXIgbFwnVVJMIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ic2VsZWN0VGV4dE1vZGUiIG1zZ2lkPSI2NzM4NTU2MzQ4ODYxMzQ3MjQwIj4iU8OpbGVjdC4gbGUgdGV4dGUuLi4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJ0ZXh0U2VsZWN0aW9uQ0FCVGl0bGUiIG1zZ2lkPSI1MjM2ODUwMzk0MzcwODIwMzU3Ij4iU8OpbGVjdGlvbiBkZSB0ZXh0ZSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImlucHV0TWV0aG9kIiBtc2dpZD0iMTY1MzYzMDA2MjMwNDU2Nzg3OSI+Ik1vZGUgZGUgc2Fpc2llIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iYWRkVG9EaWN0aW9uYXJ5IiBtc2dpZD0iODc5MzYyNDk5MTY4Njk0ODcwOSI+IkFqb3V0ZXIgXCI8eGxpZmY6ZyBpZD0iV09SRCI+JXM8L3hsaWZmOmc+XCIgYXUgZGljdGlvbm5haXJlIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iZWRpdFRleHRNZW51VGl0bGUiIG1zZ2lkPSIxNjcyOTg5MTc2OTU4NTgxNDUyIj4iTW9kaWZpZXIgbGUgdGV4dGUiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJlZGl0VGV4dE1lbnVUaXRsZSIgbXNnaWQ9IjQ5MDkxMzU1NjQ5NDE4MTU0OTQiPiJBY3Rpb25zIHN1ciBsZSB0ZXh0ZSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9Imxvd19pbnRlcm5hbF9zdG9yYWdlX3ZpZXdfdGl0bGUiIG1zZ2lkPSIxMzk5NzMyNDA4NzAxNjk3NTQ2Ij4iRXNwYWNlIGRpc3BvbmlibGUgZmFpYmxlIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG93X2ludGVybmFsX3N0b3JhZ2Vfdmlld190ZXh0IiBtc2dpZD0iNjM1MTA2NTQ0NjE2Mzc4ODM2Ij4iTGEgbcOpbW9pcmUgZHUgdMOpbMOpcGhvbmUgY29tbWVuY2Ugw6Agw6p0cmUgcGxlaW5lLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9Im9rIiBtc2dpZD0iNTk3MDA2MDQzMDU2MjUyNDkxMCI+Ik9LIjwvc3RyaW5nPgpAQCAtNzE0LDYgKzcyMCw3IEBACiAgICAgPHN0cmluZyBuYW1lPSJ5ZXMiIG1zZ2lkPSI1MzYyOTgyMzAzMzM3OTY5MzEyIj4iT0siPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJubyIgbXNnaWQ9IjUxNDE1MzEwNDQ5MzU1NDE0OTciPiJBbm51bGVyIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iZGlhbG9nX2FsZXJ0X3RpdGxlIiBtc2dpZD0iMjA0OTY1ODcwODYwOTA0MzEwMyI+IkF0dGVudGlvbiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImxvYWRpbmciIG1zZ2lkPSIxNzYwNzI0OTk4OTI4MjU1MjUwIj4iQ2hhcmdlbWVudCBlbiBjb3Vycy4uLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImNhcGl0YWxfb24iIG1zZ2lkPSIxNTQ0NjgyNzU1NTE0NDk0Mjk4Ij4iT04iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJjYXBpdGFsX29mZiIgbXNnaWQ9IjY4MTU4NzAzODY5NzI4MDU4MzIiPiJPRkYiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ3aGljaEFwcGxpY2F0aW9uIiBtc2dpZD0iNDUzMzE4NTk0NzA2NDc3MzM4NiI+IkNvbnRpbnVlciBhdmVjIjwvc3RyaW5nPgpAQCAtODU0LDE1ICs4NjEsMjQgQEAKICAgICA8c3RyaW5nIG5hbWU9ImwydHBfaXBzZWNfcHNrX3Zwbl9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM5NDUwNDM1NjQwMDgzMDMyMzkiPiJWUE4gTDJUUC9JUFNlYyBiYXPDqSBzdXIgdW5lIGNsw6kgcHLDqS1wYXJ0YWfDqWUiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsMnRwX2lwc2VjX2NydF92cG5fZGVzY3JpcHRpb24iIG1zZ2lkPSI1MzgyNzE0MDczMTAzNjUzNTc3Ij4iVlBOIEwyVFAvSVBTZWMgYmFzw6kgc3VyIHVuIGNlcnRpZmljYXQiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ1cGxvYWRfZmlsZSIgbXNnaWQ9IjI4OTc5NTcxNzIzNjY3MzA0MTYiPiJTw6lsZWN0aW9ubmVyIHVuIGZpY2hpZXIiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJub19maWxlX2Nob3NlbiIgbXNnaWQ9IjYzNjM2NDg1NjIxNzA3NTk0NjUiPiJBdWN1biBmaWNoaWVyIHPDqWxlY3Rpb25uw6kiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJyZXNldCIgbXNnaWQ9IjI0NDgxNjgwODA5NjQyMDk5MDgiPiJSw6lpbml0aWFsaXNlciI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InN1Ym1pdCIgbXNnaWQ9IjE2MDIzMzU1NzIwODk5MTE5NDEiPiJFbnZveWVyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iZGVzY3JpcHRpb25fc3RhciIgbXNnaWQ9IjI2NTQzMTk4NzQ5MDg1NzYxMzMiPiJmYXZvcmkiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJjYXJfbW9kZV9kaXNhYmxlX25vdGlmaWNhdGlvbl90aXRsZSIgbXNnaWQ9IjMxNjQ3NjgyMTIwMDM4NjQzMTYiPiJNb2RlIFZvaXR1cmUgYWN0aXbDqSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImNhcl9tb2RlX2Rpc2FibGVfbm90aWZpY2F0aW9uX21lc3NhZ2UiIG1zZ2lkPSI2Njg2NjM2MjY3MjE2NzU2MTQiPiJTw6lsZWN0aW9ubmV6IGNldHRlIG9wdGlvbiBwb3VyIHF1aXR0ZXIgbGUgbW9kZSBWb2l0dXJlLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InRldGhlcmVkX25vdGlmaWNhdGlvbl90aXRsZSIgbXNnaWQ9IjMxNDY2OTQyMzQzOTgyMDI2MDEiPiJQYXJ0YWdlIGRlIGNvbm5leGlvbiBvdSBwb2ludCBkXCdhY2PDqHMgc2FucyBmaWwgYWN0aXbDqSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InRldGhlcmVkX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBtc2dpZD0iMzA2NzEwODMyMzkwMzA0ODkyNyI+IlRvdWNoZXIgcG91ciBjb25maWd1cmVyIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iYmFja19idXR0b25fbGFiZWwiIG1zZ2lkPSIyMzAwNDcwMDA0NTAzMzQzNDM5Ij4iUmV0b3VyIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibmV4dF9idXR0b25fbGFiZWwiIG1zZ2lkPSIxMDgwNTU1MTA0Njc3OTkyNDA4Ij4iU3VpdmFudCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InNraXBfYnV0dG9uX2xhYmVsIiBtc2dpZD0iMTI3NTM2MjI5OTQ3MTYzMTgxOSI+Iklnbm9yZXIiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ0aHJvdHRsZV93YXJuaW5nX25vdGlmaWNhdGlvbl90aXRsZSIgbXNnaWQ9IjQ4OTA4OTQyNjc0NTQ4NjcyNzYiPiJVdGlsaXNhdGlvbiDDqWxldsOpZSBkZXMgZG9ubsOpZXMgbW9iaWxlcyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InRocm90dGxlX3dhcm5pbmdfbm90aWZpY2F0aW9uX21lc3NhZ2UiIG1zZ2lkPSIyNjA5NzM0NzYzODQ1NzA1NzA4Ij4iVG91Y2hleiBwb3VyIGVuIHNhdm9pciBwbHVzIHN1ciBsXCd1dGlsaXNhdGlvbiBkZXMgZG9ubsOpZXMgbW9iaWxlcyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InRocm90dGxlZF9ub3RpZmljYXRpb25fdGl0bGUiIG1zZ2lkPSI2MjY5NTQxODk3NzI5NzgxMzMyIj4iUXVvdGEgZFwndXRpbGlzYXRpb24gZGVzIGRvbm7DqWVzIG1vYmlsZXMgZMOpcGFzc8OpIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idGhyb3R0bGVkX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBtc2dpZD0iNDcxMjM2OTg1NjYwMTI3NTE0NiI+IlRvdWNoZXogcG91ciBlbiBzYXZvaXIgcGx1cyBzdXIgbFwndXRpbGlzYXRpb24gZGVzIGRvbm7DqWVzIG1vYmlsZXMiPC9zdHJpbmc+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3Igbm9fbWF0Y2hlcyAoODEyOTQyMTkwODkxNTg0MDczNykgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBmaW5kX29uX3BhZ2UgKDE5NDY3OTkyMzM4MjI4MjAzODQpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgbWF0Y2hlc19mb3VuZDpvbmUgKDgxNjcxNDcwODExMzY1Nzk0MzkpIC0tPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIG1hdGNoZXNfZm91bmQ6b3RoZXIgKDQ2NDE4NzI3OTcwNjc2MDkxNzcpIC0tPgogPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvdmFsdWVzLWl0L3N0cmluZ3MueG1sIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy1pdC9zdHJpbmdzLnhtbAppbmRleCBkNDAxOWI2Li43MTNjOTgzIDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvdmFsdWVzLWl0L3N0cmluZ3MueG1sCisrKyBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMtaXQvc3RyaW5ncy54bWwKQEAgLTQzMiw2ICs0MzIsMTAgQEAKICAgICA8c3RyaW5nIG5hbWU9InBvbGljeWRlc2NfZm9yY2VMb2NrIiBtc2dpZD0iMjgxOTg2ODY2NDk0NjA4OTc0MCI+IkNvbnRyb2xsYSBxdWFuZG8gaWwgZGlzcG9zaXRpdm8gc2kgYmxvY2NhLCBjaGllZGVuZG90aSBkaSByZWluc2VyaXJlIGxhIHBhc3N3b3JkLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBvbGljeWxhYl93aXBlRGF0YSIgbXNnaWQ9IjM5MTA1NDU0NDY3NTg2Mzk3MTMiPiJDYW5jZWxsYSB0dXR0aSBpIGRhdGkiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwb2xpY3lkZXNjX3dpcGVEYXRhIiBtc2dpZD0iMjMxNDA2MDkzMzc5NjM5NjIwNSI+IkVzZWd1aSB1biByaXByaXN0aW5vIGRpIGZhYmJyaWNhLCBlbGltaW5hbmRvIHR1dHRpIGkgdHVvaSBkYXRpIHNlbnphIGNvbmZlcm1hLiI8L3N0cmluZz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwb2xpY3lsYWJfc2V0R2xvYmFsUHJveHkgKDI3ODQ4MjgyOTM3NDc3OTE0NDYpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcG9saWN5ZGVzY19zZXRHbG9iYWxQcm94eSAoNjM4NzQ5NzQ2NjY2MDE1NDkzMSkgLS0+CisgICAgPHNraXAgLz4KICAgPHN0cmluZy1hcnJheSBuYW1lPSJwaG9uZVR5cGVzIj4KICAgICA8aXRlbSBtc2dpZD0iODkwMTA5ODMzNjY1ODcxMDM1OSI+IkNhc2EiPC9pdGVtPgogICAgIDxpdGVtIG1zZ2lkPSI4Njk5MjM2NTA1MjcxMzY2MTUiPiJDZWxsdWxhcmUiPC9pdGVtPgpAQCAtNTI1LDEwICs1MjksOSBAQAogICAgIDxzdHJpbmcgbmFtZT0ib3JnVHlwZVdvcmsiIG1zZ2lkPSIyOTI2ODg3MDUwNTM2Mzg3MiI+Ikxhdm9ybyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9Im9yZ1R5cGVPdGhlciIgbXNnaWQ9IjM5NTE3ODExMzE1NzAxMjQwODIiPiJBbHRybyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9Im9yZ1R5cGVDdXN0b20iIG1zZ2lkPSIyMjU1MjM0MTUzNzIwODgzMjIiPiJQZXJzb25hbGl6emF0byI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImNvbnRhY3Rfc3RhdHVzX3VwZGF0ZV9hdHRyaWJ1dGlvbiIgbXNnaWQ9IjUxMTI1ODk4ODYwOTQ0MDI3OTUiPiJ0cmFtaXRlIDx4bGlmZjpnIGlkPSJTT1VSQ0UiPiUxJHM8L3hsaWZmOmc+Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iY29udGFjdF9zdGF0dXNfdXBkYXRlX2F0dHJpYnV0aW9uX3dpdGhfZGF0ZSIgbXNnaWQ9IjU5NDUzODYzNzYzNjk5Nzk5MDkiPiI8eGxpZmY6ZyBpZD0iREFURSI+JTEkczwveGxpZmY6Zz4gdHJhbWl0ZSA8eGxpZmY6ZyBpZD0iU09VUkNFIj4lMiRzPC94bGlmZjpnPiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImtleWd1YXJkX3Bhc3N3b3JkX2VudGVyX3Bpbl9jb2RlIiBtc2dpZD0iMzczMTQ4ODgyNzIxODg3NjExNSI+Ikluc2VyaXNjaSBpbCBQSU4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJrZXlndWFyZF9wYXNzd29yZF9lbnRlcl9wYXNzd29yZF9jb2RlIiBtc2dpZD0iOTEzODE1ODM0NDgxMzIxMzc1NCI+Ikluc2VyaXNjaSBwYXNzd29yZCBwZXIgc2Jsb2NjYXJlIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ia2V5Z3VhcmRfcGFzc3dvcmRfZW50ZXJfcGluX3Bhc3N3b3JkX2NvZGUiIG1zZ2lkPSI2MzgzNDcwNzU2MjU0OTE1MTQiPiJJbnNlcmlzY2kgUElOIHBlciBzYmxvY2NhcmUiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJrZXlndWFyZF9wYXNzd29yZF93cm9uZ19waW5fY29kZSIgbXNnaWQ9IjEyOTU5ODQxMTQzMzgxMDc3MTgiPiJDb2RpY2UgUElOIGVycmF0by4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJrZXlndWFyZF9sYWJlbF90ZXh0IiBtc2dpZD0iODYxNzk2NDYxMDI4Mjk4NDI0Ij4iUGVyIHNibG9jY2FyZSwgcHJlbWkgTWVudSwgcG9pIDAuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iZW1lcmdlbmN5X2NhbGxfZGlhbG9nX251bWJlcl9mb3JfZGlzcGxheSIgbXNnaWQ9IjY5NjE5MjEwMzE5NTA5MDk3MCI+Ik51bWVybyBkaSBlbWVyZ2VuemEiPC9zdHJpbmc+CkBAIC01NDEsNiArNTQ0LDcgQEAKICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fcmV0dXJuX3RvX2NhbGwiIG1zZ2lkPSI1MjQ0MjU5Nzg1NTAwMDQwMDIxIj4iVG9ybmEgYSBjaGlhbWF0YSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fcGF0dGVybl9jb3JyZWN0IiBtc2dpZD0iOTAzOTAwODY1MDM2MjI2MTIzNyI+IkNvcnJldHRhLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fcGF0dGVybl93cm9uZyIgbXNnaWQ9IjQ4MTc1ODMyNzkwNTMxMTIzMTIiPiJSaXByb3ZhIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9wYXNzd29yZF93cm9uZyIgbXNnaWQ9IjYyMzc0NDM2NTczNTgxNjg4MTkiPiJSaXByb3ZhIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9wbHVnZ2VkX2luIiBtc2dpZD0iNjEzMzQzODUyODQyOTQ0NDM1Ij4iSW4gY2FyaWNhICg8eGxpZmY6ZyBpZD0iTlVNQkVSIj4lZDwveGxpZmY6Zz48eGxpZmY6ZyBpZD0iUEVSQ0VOVCI+JSU8L3hsaWZmOmc+KSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fY2hhcmdlZCIgbXNnaWQ9IjQ5Mzg5MzA0NTk2MjA5ODk5NzIiPiJDYXJpY28uIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9iYXR0ZXJ5X3Nob3J0IiBtc2dpZD0iMzYxNzU0OTE3ODYwMzM1NDY1NiI+Ijx4bGlmZjpnIGlkPSJOVU1CRVIiPiVkPC94bGlmZjpnPjx4bGlmZjpnIGlkPSJQRVJDRU5UIj4lJTwveGxpZmY6Zz4iPC9zdHJpbmc+CkBAIC01NTUsNiArNTU5LDggQEAKICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fc2ltX2xvY2tlZF9tZXNzYWdlIiBtc2dpZD0iODA2NjY2MDEyOTIwNjAwMTAzOSI+IkxhIFNJTSDDqCBibG9jY2F0YS4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3NpbV91bmxvY2tfcHJvZ3Jlc3NfZGlhbG9nX21lc3NhZ2UiIG1zZ2lkPSI1OTUzMjMyMTQwNTI4ODEyNjQiPiJTYmxvY2NvIFNJTS4uLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fdG9vX21hbnlfZmFpbGVkX2F0dGVtcHRzX2RpYWxvZ19tZXNzYWdlIiBtc2dpZD0iMzUxNDc0MjEwNjA2Njg3NzQ3NiI+Ijx4bGlmZjpnIGlkPSJOVU1CRVJfMCI+JWQ8L3hsaWZmOmc+IHRlbnRhdGl2aSBkaSBpbnNlcmltZW50byBkZWxsYSBzZXF1ZW56YSBkaSBzYmxvY2NvLiAiXG5cbiJSaXByb3ZhIGZyYSA8eGxpZmY6ZyBpZD0iTlVNQkVSXzEiPiVkPC94bGlmZjpnPiBzZWNvbmRpLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fdG9vX21hbnlfZmFpbGVkX3Bhc3N3b3JkX2F0dGVtcHRzX2RpYWxvZ19tZXNzYWdlIiBtc2dpZD0iNDkwNjAzNDM3NjQyNTE3NTM4MSI+Ijx4bGlmZjpnIGlkPSJOVU1CRVJfMCI+JWQ8L3hsaWZmOmc+IHRlbnRhdGl2aSBlcnJhdGkgZGkgaW5zZXJpbWVudG8gZGVsbGEgcGFzc3dvcmQuICJcblxuIlJpcHJvdmEgdHJhIDx4bGlmZjpnIGlkPSJOVU1CRVJfMSI+JWQ8L3hsaWZmOmc+IHNlY29uZGkuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl90b29fbWFueV9mYWlsZWRfcGluX2F0dGVtcHRzX2RpYWxvZ19tZXNzYWdlIiBtc2dpZD0iNjgyNzc0OTIzMTQ2NTE0NTU5MCI+Ijx4bGlmZjpnIGlkPSJOVU1CRVJfMCI+JWQ8L3hsaWZmOmc+IHRlbnRhdGl2aSBlcnJhdGkgZGkgaW5zZXJpbWVudG8gZGVsIFBJTi4gIlxuXG4iUmlwcm92YSB0cmEgPHhsaWZmOmcgaWQ9Ik5VTUJFUl8xIj4lZDwveGxpZmY6Zz4gc2Vjb25kaS4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX2ZhaWxlZF9hdHRlbXB0c19hbG1vc3RfZ2xvZ2luIiBtc2dpZD0iMzM1MTAxMzg0MjMyMDEyNzgyNyI+Ijx4bGlmZjpnIGlkPSJOVU1CRVJfMCI+JWQ8L3hsaWZmOmc+IHRlbnRhdGl2aSBkaSBpbnNlcmltZW50byBkZWxsYSBzZXF1ZW56YSBkaSBzYmxvY2NvLiBEb3BvIGFsdHJpIDx4bGlmZjpnIGlkPSJOVU1CRVJfMSI+JWQ8L3hsaWZmOmc+IHRlbnRhdGl2aSBmYWxsaXRpLCB0aSB2ZXJyw6AgY2hpZXN0byBkaSBzYmxvY2NhcmUgaWwgdGVsZWZvbm8gdHJhbWl0ZSBpIGRhdGkgZGkgYWNjZXNzbyBkaSBHb29nbGUuIlxuXG4iUmlwcm92YSBmcmEgPHhsaWZmOmcgaWQ9Ik5VTUJFUl8yIj4lZDwveGxpZmY6Zz4gc2Vjb25kaS4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3Rvb19tYW55X2ZhaWxlZF9hdHRlbXB0c19jb3VudGRvd24iIG1zZ2lkPSI2MjUxNDgwMzQzMzk0Mzg5NjY1Ij4iUmlwcm92YSBmcmEgPHhsaWZmOmcgaWQ9Ik5VTUJFUiI+JWQ8L3hsaWZmOmc+IHNlY29uZGkuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9mb3Jnb3RfcGF0dGVybl9idXR0b25fdGV4dCIgbXNnaWQ9IjI2MjY5OTk0NDk2MTA2OTU5MzAiPiJIYWkgZGltZW50aWNhdG8gbGEgc2VxdWVuemE/Ijwvc3RyaW5nPgpAQCAtNjk5LDE0ICs3MDUsMTQgQEAKICAgICA8c3RyaW5nIG5hbWU9ImVsYXBzZWRfdGltZV9zaG9ydF9mb3JtYXRfbW1fc3MiIG1zZ2lkPSI0NDMxNTU1OTQzODI4NzExNDczIj4iPHhsaWZmOmcgaWQ9Ik1JTlVURVMiPiUxJDAyZDwveGxpZmY6Zz46PHhsaWZmOmcgaWQ9IlNFQ09ORFMiPiUyJDAyZDwveGxpZmY6Zz4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJlbGFwc2VkX3RpbWVfc2hvcnRfZm9ybWF0X2hfbW1fc3MiIG1zZ2lkPSIxODQ2MDcxOTk3NjE2NjU0MTI0Ij4iPHhsaWZmOmcgaWQ9IkhPVVJTIj4lMSRkPC94bGlmZjpnPjo8eGxpZmY6ZyBpZD0iTUlOVVRFUyI+JTIkMDJkPC94bGlmZjpnPjo8eGxpZmY6ZyBpZD0iU0VDT05EUyI+JTMkMDJkPC94bGlmZjpnPiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InNlbGVjdEFsbCIgbXNnaWQ9IjY4NzY1MTg5MjU4NDQxMjkzMzEiPiJTZWxlemlvbmEgdHV0dG8iPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiAzODg5MTQ5MTIzNjI2ODg4NjM3IC0tPiAgICAgPHN0cmluZyBuYW1lPSJzZWxlY3RUZXh0IiBtc2dpZD0iNDg2MjM1OTMxMTA4ODg5ODg3OCI+IlNlbGV6aW9uYSB0ZXN0byI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImN1dCIgbXNnaWQ9IjMwOTI1Njk0MDg0Mzg2MjYyNjEiPiJUYWdsaWEiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJjb3B5IiBtc2dpZD0iMjY4MTk0NjIyOTUzMzUxMTk4NyI+IkNvcGlhIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGFzdGUiIG1zZ2lkPSI1NjI5ODgwODM2ODA1MDM2NDMzIj4iSW5jb2xsYSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImNvcHlVcmwiIG1zZ2lkPSIyNTM4MjExNTc5NTk2MDY3NDAyIj4iQ29waWEgVVJMIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ic2VsZWN0VGV4dE1vZGUiIG1zZ2lkPSI2NzM4NTU2MzQ4ODYxMzQ3MjQwIj4iU2VsZXppb25hIHRlc3RvLi4uIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0idGV4dFNlbGVjdGlvbkNBQlRpdGxlIiBtc2dpZD0iNTIzNjg1MDM5NDM3MDgyMDM1NyI+IlNlbGV6aW9uZSB0ZXN0byI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImlucHV0TWV0aG9kIiBtc2dpZD0iMTY1MzYzMDA2MjMwNDU2Nzg3OSI+Ik1ldG9kbyBpbnNlcmltZW50byI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImFkZFRvRGljdGlvbmFyeSIgbXNnaWQ9Ijg3OTM2MjQ5OTE2ODY5NDg3MDkiPiJBZ2dpdW5naSBcIjx4bGlmZjpnIGlkPSJXT1JEIj4lczwveGxpZmY6Zz5cIiBhbCBkaXppb25hcmlvIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iZWRpdFRleHRNZW51VGl0bGUiIG1zZ2lkPSIxNjcyOTg5MTc2OTU4NTgxNDUyIj4iTW9kaWZpY2EgdGVzdG8iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJlZGl0VGV4dE1lbnVUaXRsZSIgbXNnaWQ9IjQ5MDkxMzU1NjQ5NDE4MTU0OTQiPiJBemlvbmkgdGVzdG8iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb3dfaW50ZXJuYWxfc3RvcmFnZV92aWV3X3RpdGxlIiBtc2dpZD0iMTM5OTczMjQwODcwMTY5NzU0NiI+IlNwYXppbyBpbiBlc2F1cmltZW50byI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9Imxvd19pbnRlcm5hbF9zdG9yYWdlX3ZpZXdfdGV4dCIgbXNnaWQ9IjYzNTEwNjU0NDYxNjM3ODgzNiI+IlNwYXppbyBkaSBhcmNoaXZpYXppb25lIGRlbCB0ZWxlZm9ubyBpbiBlc2F1cmltZW50by4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJvayIgbXNnaWQ9IjU5NzAwNjA0MzA1NjI1MjQ5MTAiPiJPSyI8L3N0cmluZz4KQEAgLTcxNCw2ICs3MjAsNyBAQAogICAgIDxzdHJpbmcgbmFtZT0ieWVzIiBtc2dpZD0iNTM2Mjk4MjMwMzMzNzk2OTMxMiI+Ik9LIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibm8iIG1zZ2lkPSI1MTQxNTMxMDQ0OTM1NTQxNDk3Ij4iQW5udWxsYSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImRpYWxvZ19hbGVydF90aXRsZSIgbXNnaWQ9IjIwNDk2NTg3MDg2MDkwNDMxMDMiPiJBdHRlbnppb25lIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibG9hZGluZyIgbXNnaWQ9IjE3NjA3MjQ5OTg5MjgyNTUyNTAiPiJDYXJpY2FtZW50byBpbiBjb3Jzby4uLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImNhcGl0YWxfb24iIG1zZ2lkPSIxNTQ0NjgyNzU1NTE0NDk0Mjk4Ij4iT04iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJjYXBpdGFsX29mZiIgbXNnaWQ9IjY4MTU4NzAzODY5NzI4MDU4MzIiPiJPRkYiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ3aGljaEFwcGxpY2F0aW9uIiBtc2dpZD0iNDUzMzE4NTk0NzA2NDc3MzM4NiI+IkNvbXBsZXRhIGxcJ2F6aW9uZSBjb24iPC9zdHJpbmc+CkBAIC04NTQsMTUgKzg2MSwyNCBAQAogICAgIDxzdHJpbmcgbmFtZT0ibDJ0cF9pcHNlY19wc2tfdnBuX2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzk0NTA0MzU2NDAwODMwMzIzOSI+IlZQTiBMMlRQL0lQU2VjIGJhc2F0YSBzdSBjaGlhdmUgcHJlY29uZGl2aXNhIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibDJ0cF9pcHNlY19jcnRfdnBuX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNTM4MjcxNDA3MzEwMzY1MzU3NyI+IlZQTiBMMlRQL0lQU2VjIGJhc2F0YSBzdSBjZXJ0aWZpY2F0byI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InVwbG9hZF9maWxlIiBtc2dpZD0iMjg5Nzk1NzE3MjM2NjczMDQxNiI+IlNjZWdsaSBmaWxlIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibm9fZmlsZV9jaG9zZW4iIG1zZ2lkPSI2MzYzNjQ4NTYyMTcwNzU5NDY1Ij4iTmVzc3VuIGZpbGUgw6ggc3RhdG8gc2NlbHRvIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icmVzZXQiIG1zZ2lkPSIyNDQ4MTY4MDgwOTY0MjA5OTA4Ij4iUmVpbXBvc3RhIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ic3VibWl0IiBtc2dpZD0iMTYwMjMzNTU3MjA4OTkxMTk0MSI+IkludmlhIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iZGVzY3JpcHRpb25fc3RhciIgbXNnaWQ9IjI2NTQzMTk4NzQ5MDg1NzYxMzMiPiJwcmVmZXJpdGkiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJjYXJfbW9kZV9kaXNhYmxlX25vdGlmaWNhdGlvbl90aXRsZSIgbXNnaWQ9IjMxNjQ3NjgyMTIwMDM4NjQzMTYiPiJNb2RhbGl0w6AgYXV0b21vYmlsZSBhdHRpdmF0YSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImNhcl9tb2RlX2Rpc2FibGVfbm90aWZpY2F0aW9uX21lc3NhZ2UiIG1zZ2lkPSI2Njg2NjM2MjY3MjE2NzU2MTQiPiJTZWxlemlvbmEgcGVyIHVzY2lyZSBkYWxsYSBtb2RhbGl0w6AgYXV0b21vYmlsZS4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ0ZXRoZXJlZF9ub3RpZmljYXRpb25fdGl0bGUiIG1zZ2lkPSIzMTQ2Njk0MjM0Mzk4MjAyNjAxIj4iVGV0aGVyaW5nIG9wcHVyZSBob3RzcG90IGF0dGl2byI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InRldGhlcmVkX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBtc2dpZD0iMzA2NzEwODMyMzkwMzA0ODkyNyI+IlRvY2NhIHBlciBjb25maWd1cmFyZSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImJhY2tfYnV0dG9uX2xhYmVsIiBtc2dpZD0iMjMwMDQ3MDAwNDUwMzM0MzQzOSI+IkluZGlldHJvIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibmV4dF9idXR0b25fbGFiZWwiIG1zZ2lkPSIxMDgwNTU1MTA0Njc3OTkyNDA4Ij4iQXZhbnRpIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ic2tpcF9idXR0b25fbGFiZWwiIG1zZ2lkPSIxMjc1MzYyMjk5NDcxNjMxODE5Ij4iU2FsdGEiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ0aHJvdHRsZV93YXJuaW5nX25vdGlmaWNhdGlvbl90aXRsZSIgbXNnaWQ9IjQ4OTA4OTQyNjc0NTQ4NjcyNzYiPiJVdGlsaXp6byBkYXRpIGNlbGwuIGVsZXZhdG8iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ0aHJvdHRsZV93YXJuaW5nX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBtc2dpZD0iMjYwOTczNDc2Mzg0NTcwNTcwOCI+IlRvY2NhIHBlciBpbmZvcm1hemlvbmkgc3VsbFwndXRpbGl6em8gZGF0aSBjZWxsLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InRocm90dGxlZF9ub3RpZmljYXRpb25fdGl0bGUiIG1zZ2lkPSI2MjY5NTQxODk3NzI5NzgxMzMyIj4iTGltaXRlIGRhdGkgY2VsbC4gc3VwZXJhdG8iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ0aHJvdHRsZWRfbm90aWZpY2F0aW9uX21lc3NhZ2UiIG1zZ2lkPSI0NzEyMzY5ODU2NjAxMjc1MTQ2Ij4iVG9jY2EgcGVyIGluZm9ybWF6aW9uaSBzdWxsXCd1dGlsaXp6byBkYXRpIGNlbGwuIjwvc3RyaW5nPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIG5vX21hdGNoZXMgKDgxMjk0MjE5MDg5MTU4NDA3MzcpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgZmluZF9vbl9wYWdlICgxOTQ2Nzk5MjMzODIyODIwMzg0KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIG1hdGNoZXNfZm91bmQ6b25lICg4MTY3MTQ3MDgxMTM2NTc5NDM5KSAtLT4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBtYXRjaGVzX2ZvdW5kOm90aGVyICg0NjQxODcyNzk3MDY3NjA5MTc3KSAtLT4KIDwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL3ZhbHVlcy1qYS9zdHJpbmdzLnhtbCBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMtamEvc3RyaW5ncy54bWwKaW5kZXggYWU0NGJiMi4uZWE5YmY5ZiAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL3ZhbHVlcy1qYS9zdHJpbmdzLnhtbAorKysgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzLWphL3N0cmluZ3MueG1sCkBAIC00MzIsNiArNDMyLDEwIEBACiAgICAgPHN0cmluZyBuYW1lPSJwb2xpY3lkZXNjX2ZvcmNlTG9jayIgbXNnaWQ9IjI4MTk4Njg2NjQ5NDYwODk3NDAiPiLmkLrluK/pm7voqbHjga7jg63jg4Pjgq/mmYLjgpLnrqHnkIbjgZfjgb7jgZnjgILjg5Hjgrnjg6/jg7zjg4njga7lho3lhaXlipvjgYzlv4XopoHjgajjgarjgorjgb7jgZnjgIIiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwb2xpY3lsYWJfd2lwZURhdGEiIG1zZ2lkPSIzOTEwNTQ1NDQ2NzU4NjM5NzEzIj4i44GZ44G544Gm44Gu44OH44O844K/44KS5raI5Y67Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icG9saWN5ZGVzY193aXBlRGF0YSIgbXNnaWQ9IjIzMTQwNjA5MzM3OTYzOTYyMDUiPiLlh7rojbfmmYLoqK3lrprjgavjg6rjgrvjg4Pjg4jjgZfjgb7jgZnjgILnorroqo3jgarjgZfjgafjg4fjg7zjgr/jgYzjgZnjgbnjgabliYrpmaTjgZXjgozjgb7jgZnjgIIiPC9zdHJpbmc+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcG9saWN5bGFiX3NldEdsb2JhbFByb3h5ICgyNzg0ODI4MjkzNzQ3NzkxNDQ2KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBvbGljeWRlc2Nfc2V0R2xvYmFsUHJveHkgKDYzODc0OTc0NjY2NjAxNTQ5MzEpIC0tPgorICAgIDxza2lwIC8+CiAgIDxzdHJpbmctYXJyYXkgbmFtZT0icGhvbmVUeXBlcyI+CiAgICAgPGl0ZW0gbXNnaWQ9Ijg5MDEwOTgzMzY2NTg3MTAzNTkiPiLoh6rlroUiPC9pdGVtPgogICAgIDxpdGVtIG1zZ2lkPSI4Njk5MjM2NTA1MjcxMzY2MTUiPiLmkLrluK8iPC9pdGVtPgpAQCAtNTI1LDEwICs1MjksOSBAQAogICAgIDxzdHJpbmcgbmFtZT0ib3JnVHlwZVdvcmsiIG1zZ2lkPSIyOTI2ODg3MDUwNTM2Mzg3MiI+IuWLpOWLmeWFiCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9Im9yZ1R5cGVPdGhlciIgbXNnaWQ9IjM5NTE3ODExMzE1NzAxMjQwODIiPiLjgZ3jga7ku5YiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJvcmdUeXBlQ3VzdG9tIiBtc2dpZD0iMjI1NTIzNDE1MzcyMDg4MzIyIj4i44Kr44K544K/44OgIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iY29udGFjdF9zdGF0dXNfdXBkYXRlX2F0dHJpYnV0aW9uIiBtc2dpZD0iNTExMjU4OTg4NjA5NDQwMjc5NSI+Ijx4bGlmZjpnIGlkPSJTT1VSQ0UiPiUxJHM8L3hsaWZmOmc+57WM55SxIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iY29udGFjdF9zdGF0dXNfdXBkYXRlX2F0dHJpYnV0aW9uX3dpdGhfZGF0ZSIgbXNnaWQ9IjU5NDUzODYzNzYzNjk5Nzk5MDkiPiI8eGxpZmY6ZyBpZD0iREFURSI+JTEkczwveGxpZmY6Zz7jgIHmm7TmlrDlhYM6IDx4bGlmZjpnIGlkPSJTT1VSQ0UiPiUyJHM8L3hsaWZmOmc+Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ia2V5Z3VhcmRfcGFzc3dvcmRfZW50ZXJfcGluX2NvZGUiIG1zZ2lkPSIzNzMxNDg4ODI3MjE4ODc2MTE1Ij4iUElO44Kz44O844OJ44KS5YWl5YqbIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ia2V5Z3VhcmRfcGFzc3dvcmRfZW50ZXJfcGFzc3dvcmRfY29kZSIgbXNnaWQ9IjkxMzgxNTgzNDQ4MTMyMTM3NTQiPiLjg63jg4Pjgq/jgpLop6PpmaTjgZnjgovjgavjga/jg5Hjgrnjg6/jg7zjg4njgpLlhaXlipsiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJrZXlndWFyZF9wYXNzd29yZF9lbnRlcl9waW5fcGFzc3dvcmRfY29kZSIgbXNnaWQ9IjYzODM0NzA3NTYyNTQ5MTUxNCI+IuODreODg+OCr+OCkuino+mZpOOBmeOCi+OBq+OBr1BJTuOCkuWFpeWKmyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImtleWd1YXJkX3Bhc3N3b3JkX3dyb25nX3Bpbl9jb2RlIiBtc2dpZD0iMTI5NTk4NDExNDMzODEwNzcxOCI+IlBJTuOCs+ODvOODieOBjOato+OBl+OBj+OBguOCiuOBvuOBm+OCk+OAgiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImtleWd1YXJkX2xhYmVsX3RleHQiIG1zZ2lkPSI4NjE3OTY0NjEwMjgyOTg0MjQiPiJNRU5V44CBMOOCreODvOOBp+ODreODg+OCr+ino+mZpCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImVtZXJnZW5jeV9jYWxsX2RpYWxvZ19udW1iZXJfZm9yX2Rpc3BsYXkiIG1zZ2lkPSI2OTYxOTIxMDMxOTUwOTA5NzAiPiLnt4rmgKXpgJrloLHnlarlj7ciPC9zdHJpbmc+CkBAIC01NDEsNiArNTQ0LDcgQEAKICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fcmV0dXJuX3RvX2NhbGwiIG1zZ2lkPSI1MjQ0MjU5Nzg1NTAwMDQwMDIxIj4i6YCa6Kmx44Gr5oi744KLIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9wYXR0ZXJuX2NvcnJlY3QiIG1zZ2lkPSI5MDM5MDA4NjUwMzYyMjYxMjM3Ij4i5LiA6Ie044GX44G+44GX44GfIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9wYXR0ZXJuX3dyb25nIiBtc2dpZD0iNDgxNzU4MzI3OTA1MzExMjMxMiI+IuOChOOCiuebtOOBl+OBpuOBj+OBoOOBleOBhCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fcGFzc3dvcmRfd3JvbmciIG1zZ2lkPSI2MjM3NDQzNjU3MzU4MTY4ODE5Ij4i44KE44KK55u044GX44Gm44GP44Gg44GV44GEIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9wbHVnZ2VkX2luIiBtc2dpZD0iNjEzMzQzODUyODQyOTQ0NDM1Ij4i5YWF6Zu75Lit77yIPHhsaWZmOmcgaWQ9Ik5VTUJFUiI+JWQ8L3hsaWZmOmc+PHhsaWZmOmcgaWQ9IlBFUkNFTlQiPiUlPC94bGlmZjpnPu+8iSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fY2hhcmdlZCIgbXNnaWQ9IjQ5Mzg5MzA0NTk2MjA5ODk5NzIiPiLlhYXpm7vlrozkuobjgIIiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX2JhdHRlcnlfc2hvcnQiIG1zZ2lkPSIzNjE3NTQ5MTc4NjAzMzU0NjU2Ij4iPHhsaWZmOmcgaWQ9Ik5VTUJFUiI+JWQ8L3hsaWZmOmc+PHhsaWZmOmcgaWQ9IlBFUkNFTlQiPiUlPC94bGlmZjpnPiI8L3N0cmluZz4KQEAgLTU1NSw2ICs1NTksOCBAQAogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9zaW1fbG9ja2VkX21lc3NhZ2UiIG1zZ2lkPSI4MDY2NjYwMTI5MjA2MDAxMDM5Ij4iU0lN44Kr44O844OJ44Gv44Ot44OD44Kv44GV44KM44Gm44GE44G+44GZ44CCIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9zaW1fdW5sb2NrX3Byb2dyZXNzX2RpYWxvZ19tZXNzYWdlIiBtc2dpZD0iNTk1MzIzMjE0MDUyODgxMjY0Ij4iU0lN44Kr44O844OJ44Gu44Ot44OD44Kv6Kej6Zmk5LitLi4uIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl90b29fbWFueV9mYWlsZWRfYXR0ZW1wdHNfZGlhbG9nX21lc3NhZ2UiIG1zZ2lkPSIzNTE0NzQyMTA2MDY2ODc3NDc2Ij4i44Ot44OD44Kv6Kej6Zmk44Gu44OR44K/44O844Oz44GvPHhsaWZmOmcgaWQ9Ik5VTUJFUl8wIj4lZDwveGxpZmY6Zz7lm57jgajjgoLmraPjgZfjgY/mjIflrprjgZXjgozjgabjgYTjgb7jgZvjgpPjgIIiXG5cbiI8eGxpZmY6ZyBpZD0iTlVNQkVSXzEiPiVkPC94bGlmZjpnPuenkuW+jOOBq+OCguOBhuS4gOW6puaMh+WumuOBl+OBpuOBj+OBoOOBleOBhOOAgiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fdG9vX21hbnlfZmFpbGVkX3Bhc3N3b3JkX2F0dGVtcHRzX2RpYWxvZ19tZXNzYWdlIiBtc2dpZD0iNDkwNjAzNDM3NjQyNTE3NTM4MSI+IuWFpeWKm+OBl+OBn+ODkeOCueODr+ODvOODieOBrzx4bGlmZjpnIGlkPSJOVU1CRVJfMCI+JWQ8L3hsaWZmOmc+5Zue44Go44KC5q2j44GX44GP44GC44KK44G+44Gb44KT44Gn44GX44Gf44CCIlxuXG4iPHhsaWZmOmcgaWQ9Ik5VTUJFUl8xIj4lZDwveGxpZmY6Zz7np5LlvozjgavjgoLjgYbkuIDluqblhaXlipvjgZfjgabjgY/jgaDjgZXjgYTjgIIiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3Rvb19tYW55X2ZhaWxlZF9waW5fYXR0ZW1wdHNfZGlhbG9nX21lc3NhZ2UiIG1zZ2lkPSI2ODI3NzQ5MjMxNDY1MTQ1NTkwIj4i5YWl5Yqb44GX44GfUElO44GvPHhsaWZmOmcgaWQ9Ik5VTUJFUl8wIj4lZDwveGxpZmY6Zz7lm57jgajjgoLmraPjgZfjgY/jgYLjgorjgb7jgZvjgpPjgafjgZfjgZ/jgIIiXG5cbiI8eGxpZmY6ZyBpZD0iTlVNQkVSXzEiPiVkPC94bGlmZjpnPuenkuW+jOOBq+OCguOBhuS4gOW6puWFpeWKm+OBl+OBpuOBj+OBoOOBleOBhOOAgiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fZmFpbGVkX2F0dGVtcHRzX2FsbW9zdF9nbG9naW4iIG1zZ2lkPSIzMzUxMDEzODQyMzIwMTI3ODI3Ij4i5oyH5a6a44GX44Gf44OR44K/44O844Oz44GvPHhsaWZmOmcgaWQ9Ik5VTUJFUl8wIj4lZDwveGxpZmY6Zz7lm57jgajjgoLmraPjgZfjgY/jgYLjgorjgb7jgZvjgpPjgILjgYLjgag8eGxpZmY6ZyBpZD0iTlVNQkVSXzEiPiVkPC94bGlmZjpnPuWbnuaMh+WumuOBq+WkseaVl+OBmeOCi+OBqOOAgeaQuuW4r+mbu+ipseOBruODreODg+OCr+OBruino+mZpOOBq0dvb2dsZeOBuOOBruODreOCsOOCpOODs+OBjOW/heimgeOBq+OBquOCiuOBvuOBmeOAgiJcblxuIjx4bGlmZjpnIGlkPSJOVU1CRVJfMiI+JWQ8L3hsaWZmOmc+56eS5b6M44Gr44KC44GG5LiA5bqm5oyH5a6a44GX44Gm44GP44Gg44GV44GE44CCIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl90b29fbWFueV9mYWlsZWRfYXR0ZW1wdHNfY291bnRkb3duIiBtc2dpZD0iNjI1MTQ4MDM0MzM5NDM4OTY2NSI+Ijx4bGlmZjpnIGlkPSJOVU1CRVIiPiVkPC94bGlmZjpnPuenkuW+jOOBq+OChOOCiuebtOOBl+OBpuOBj+OBoOOBleOBhOOAgiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fZm9yZ290X3BhdHRlcm5fYnV0dG9uX3RleHQiIG1zZ2lkPSIyNjI2OTk5NDQ5NjEwNjk1OTMwIj4i44OR44K/44O844Oz44KS5b+Y44KM44Gf5aC05ZCIIjwvc3RyaW5nPgpAQCAtNjk5LDE0ICs3MDUsMTQgQEAKICAgICA8c3RyaW5nIG5hbWU9ImVsYXBzZWRfdGltZV9zaG9ydF9mb3JtYXRfbW1fc3MiIG1zZ2lkPSI0NDMxNTU1OTQzODI4NzExNDczIj4iPHhsaWZmOmcgaWQ9Ik1JTlVURVMiPiUxJDAyZDwveGxpZmY6Zz46PHhsaWZmOmcgaWQ9IlNFQ09ORFMiPiUyJDAyZDwveGxpZmY6Zz4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJlbGFwc2VkX3RpbWVfc2hvcnRfZm9ybWF0X2hfbW1fc3MiIG1zZ2lkPSIxODQ2MDcxOTk3NjE2NjU0MTI0Ij4iPHhsaWZmOmcgaWQ9IkhPVVJTIj4lMSRkPC94bGlmZjpnPjo8eGxpZmY6ZyBpZD0iTUlOVVRFUyI+JTIkMDJkPC94bGlmZjpnPjo8eGxpZmY6ZyBpZD0iU0VDT05EUyI+JTMkMDJkPC94bGlmZjpnPiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InNlbGVjdEFsbCIgbXNnaWQ9IjY4NzY1MTg5MjU4NDQxMjkzMzEiPiLjgZnjgbnjgabpgbjmip4iPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiAzODg5MTQ5MTIzNjI2ODg4NjM3IC0tPiAgICAgPHN0cmluZyBuYW1lPSJzZWxlY3RUZXh0IiBtc2dpZD0iNDg2MjM1OTMxMTA4ODg5ODg3OCI+IuODhuOCreOCueODiOOCkumBuOaKniI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImN1dCIgbXNnaWQ9IjMwOTI1Njk0MDg0Mzg2MjYyNjEiPiLliIfjgorlj5bjgooiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJjb3B5IiBtc2dpZD0iMjY4MTk0NjIyOTUzMzUxMTk4NyI+IuOCs+ODlOODvCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBhc3RlIiBtc2dpZD0iNTYyOTg4MDgzNjgwNTAzNjQzMyI+IuiyvOOCiuS7mOOBkSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImNvcHlVcmwiIG1zZ2lkPSIyNTM4MjExNTc5NTk2MDY3NDAyIj4iVVJM44KS44Kz44OU44O8Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ic2VsZWN0VGV4dE1vZGUiIG1zZ2lkPSI2NzM4NTU2MzQ4ODYxMzQ3MjQwIj4i44OG44Kt44K544OI44KS6YG45oqeLi4uIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0idGV4dFNlbGVjdGlvbkNBQlRpdGxlIiBtc2dpZD0iNTIzNjg1MDM5NDM3MDgyMDM1NyI+IuODhuOCreOCueODiOmBuOaKniI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImlucHV0TWV0aG9kIiBtc2dpZD0iMTY1MzYzMDA2MjMwNDU2Nzg3OSI+IuWFpeWKm+aWueazlSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImFkZFRvRGljdGlvbmFyeSIgbXNnaWQ9Ijg3OTM2MjQ5OTE2ODY5NDg3MDkiPiLovp7mm7jjgavjgIw8eGxpZmY6ZyBpZD0iV09SRCI+JXM8L3hsaWZmOmc+44CN44KS6L+95YqgIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iZWRpdFRleHRNZW51VGl0bGUiIG1zZ2lkPSIxNjcyOTg5MTc2OTU4NTgxNDUyIj4i44OG44Kt44K544OI44KS57eo6ZuGIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZWRpdFRleHRNZW51VGl0bGUiIG1zZ2lkPSI0OTA5MTM1NTY0OTQxODE1NDk0Ij4i44OG44Kt44K544OI5pON5L2cIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG93X2ludGVybmFsX3N0b3JhZ2Vfdmlld190aXRsZSIgbXNnaWQ9IjEzOTk3MzI0MDg3MDE2OTc1NDYiPiLnqbrjgY3lrrnph4/kvY7kuIsiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb3dfaW50ZXJuYWxfc3RvcmFnZV92aWV3X3RleHQiIG1zZ2lkPSI2MzUxMDY1NDQ2MTYzNzg4MzYiPiLmkLrluK/pm7voqbHjga7nqbrjgY3lrrnph4/jgYzlsJHjgarjgY/jgarjgaPjgabjgYTjgb7jgZnjgIIiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJvayIgbXNnaWQ9IjU5NzAwNjA0MzA1NjI1MjQ5MTAiPiJPSyI8L3N0cmluZz4KQEAgLTcxNCw2ICs3MjAsNyBAQAogICAgIDxzdHJpbmcgbmFtZT0ieWVzIiBtc2dpZD0iNTM2Mjk4MjMwMzMzNzk2OTMxMiI+Ik9LIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibm8iIG1zZ2lkPSI1MTQxNTMxMDQ0OTM1NTQxNDk3Ij4i44Kt44Oj44Oz44K744OrIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iZGlhbG9nX2FsZXJ0X3RpdGxlIiBtc2dpZD0iMjA0OTY1ODcwODYwOTA0MzEwMyI+IuazqOaEjyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImxvYWRpbmciIG1zZ2lkPSIxNzYwNzI0OTk4OTI4MjU1MjUwIj4i6Kqt44G/6L6844G/5LitLi4uIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iY2FwaXRhbF9vbiIgbXNnaWQ9IjE1NDQ2ODI3NTU1MTQ0OTQyOTgiPiJPTiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImNhcGl0YWxfb2ZmIiBtc2dpZD0iNjgxNTg3MDM4Njk3MjgwNTgzMiI+Ik9GRiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9IndoaWNoQXBwbGljYXRpb24iIG1zZ2lkPSI0NTMzMTg1OTQ3MDY0NzczMzg2Ij4i44Ki44OX44Oq44Kx44O844K344On44Oz44KS6YG45oqeIjwvc3RyaW5nPgpAQCAtODU0LDE1ICs4NjEsMjQgQEAKICAgICA8c3RyaW5nIG5hbWU9ImwydHBfaXBzZWNfcHNrX3Zwbl9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM5NDUwNDM1NjQwMDgzMDMyMzkiPiJMMlRQL0lQU2VjIFZQTuODmeODvOOCueOBruS6i+WJjeWFseaciemNtSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImwydHBfaXBzZWNfY3J0X3Zwbl9kZXNjcmlwdGlvbiIgbXNnaWQ9IjUzODI3MTQwNzMxMDM2NTM1NzciPiJMMlRQL0lQU2VjIFZQTuODmeODvOOCueOBruiovOaYjuabuCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InVwbG9hZF9maWxlIiBtc2dpZD0iMjg5Nzk1NzE3MjM2NjczMDQxNiI+IuODleOCoeOCpOODq+OCkumBuOaKniI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im5vX2ZpbGVfY2hvc2VuIiBtc2dpZD0iNjM2MzY0ODU2MjE3MDc1OTQ2NSI+IuODleOCoeOCpOODq+OBjOmBuOaKnuOBleOCjOOBpuOBhOOBvuOBm+OCkyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InJlc2V0IiBtc2dpZD0iMjQ0ODE2ODA4MDk2NDIwOTkwOCI+IuODquOCu+ODg+ODiCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InN1Ym1pdCIgbXNnaWQ9IjE2MDIzMzU1NzIwODk5MTE5NDEiPiLpgIHkv6EiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJkZXNjcmlwdGlvbl9zdGFyIiBtc2dpZD0iMjY1NDMxOTg3NDkwODU3NjEzMyI+IuOBiuawl+OBq+WFpeOCiiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImNhcl9tb2RlX2Rpc2FibGVfbm90aWZpY2F0aW9uX3RpdGxlIiBtc2dpZD0iMzE2NDc2ODIxMjAwMzg2NDMxNiI+IumBi+i7ouODouODvOODieOCkuacieWKueOBq+OBmeOCiyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImNhcl9tb2RlX2Rpc2FibGVfbm90aWZpY2F0aW9uX21lc3NhZ2UiIG1zZ2lkPSI2Njg2NjM2MjY3MjE2NzU2MTQiPiLpgYvou6Ljg6Ljg7zjg4njgpLntYLkuobjgZnjgovjgavjga/pgbjmip7jgZfjgabjgY/jgaDjgZXjgYTjgIIiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ0ZXRoZXJlZF9ub3RpZmljYXRpb25fdGl0bGUiIG1zZ2lkPSIzMTQ2Njk0MjM0Mzk4MjAyNjAxIj4i44OG44K244Oq44Oz44Kw44G+44Gf44Gv44Ki44Kv44K744K544Od44Kk44Oz44OI44GM5pyJ5Yq544Gn44GZIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idGV0aGVyZWRfbm90aWZpY2F0aW9uX21lc3NhZ2UiIG1zZ2lkPSIzMDY3MTA4MzIzOTAzMDQ4OTI3Ij4i44K/44OD44OX44GX44Gm6Kit5a6a44GZ44KLIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iYmFja19idXR0b25fbGFiZWwiIG1zZ2lkPSIyMzAwNDcwMDA0NTAzMzQzNDM5Ij4i5oi744KLIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibmV4dF9idXR0b25fbGFiZWwiIG1zZ2lkPSIxMDgwNTU1MTA0Njc3OTkyNDA4Ij4i5qyh44G4Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ic2tpcF9idXR0b25fbGFiZWwiIG1zZ2lkPSIxMjc1MzYyMjk5NDcxNjMxODE5Ij4i44K544Kt44OD44OXIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idGhyb3R0bGVfd2FybmluZ19ub3RpZmljYXRpb25fdGl0bGUiIG1zZ2lkPSI0ODkwODk0MjY3NDU0ODY3Mjc2Ij4i44Oi44OQ44Kk44Or44OH44O844K/44Gu5L2/55So6YeP44GM5aKX44GI44Gm44GE44G+44GZIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idGhyb3R0bGVfd2FybmluZ19ub3RpZmljYXRpb25fbWVzc2FnZSIgbXNnaWQ9IjI2MDk3MzQ3NjM4NDU3MDU3MDgiPiLjgr/jg4Pjg5fjgZfjgabjg6Ljg5DjgqTjg6vjg4fjg7zjgr/liKnnlKjjga7oqbPntLDjgpLooajnpLrjgZfjgb7jgZkiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ0aHJvdHRsZWRfbm90aWZpY2F0aW9uX3RpdGxlIiBtc2dpZD0iNjI2OTU0MTg5NzcyOTc4MTMzMiI+IuODouODkOOCpOODq+ODh+ODvOOCv+OBruWItumZkOOCkui2heOBiOOBvuOBl+OBnyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InRocm90dGxlZF9ub3RpZmljYXRpb25fbWVzc2FnZSIgbXNnaWQ9IjQ3MTIzNjk4NTY2MDEyNzUxNDYiPiLjgr/jg4Pjg5fjgZfjgabjg6Ljg5DjgqTjg6vjg4fjg7zjgr/liKnnlKjjga7oqbPntLDjgpLooajnpLrjgZfjgb7jgZkiPC9zdHJpbmc+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3Igbm9fbWF0Y2hlcyAoODEyOTQyMTkwODkxNTg0MDczNykgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBmaW5kX29uX3BhZ2UgKDE5NDY3OTkyMzM4MjI4MjAzODQpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgbWF0Y2hlc19mb3VuZDpvbmUgKDgxNjcxNDcwODExMzY1Nzk0MzkpIC0tPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIG1hdGNoZXNfZm91bmQ6b3RoZXIgKDQ2NDE4NzI3OTcwNjc2MDkxNzcpIC0tPgogPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvdmFsdWVzLWtvL3N0cmluZ3MueG1sIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy1rby9zdHJpbmdzLnhtbAppbmRleCAwNDBmOWU4Li5hMjMwOWRhIDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvdmFsdWVzLWtvL3N0cmluZ3MueG1sCisrKyBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMta28vc3RyaW5ncy54bWwKQEAgLTQzMiw2ICs0MzIsMTAgQEAKICAgICA8c3RyaW5nIG5hbWU9InBvbGljeWRlc2NfZm9yY2VMb2NrIiBtc2dpZD0iMjgxOTg2ODY2NDk0NjA4OTc0MCI+Iuq4sOq4sOqwgCDsnqDqsqgg7J6I7J2EIOuVjCDsnpHrj5ntlZjroKTrqbQg67mE67CA67KI7Zi466W8IOuLpOyLnCDsnoXroKXtlbTslbwg7ZWp64uI64ukLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBvbGljeWxhYl93aXBlRGF0YSIgbXNnaWQ9IjM5MTA1NDU0NDY3NTg2Mzk3MTMiPiLrqqjrk6Ag642w7J207YSwIOyCreygnCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBvbGljeWRlc2Nfd2lwZURhdGEiIG1zZ2lkPSIyMzE0MDYwOTMzNzk2Mzk2MjA1Ij4i7LSI6riw7ZmU66W8IOyImO2Wie2VmOyXrCDrqqjrk6Ag642w7J207YSw66W8IO2ZleyduO2VmOyngCDslYrqs6Ag7IKt7KCc7ZWp64uI64ukLiI8L3N0cmluZz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwb2xpY3lsYWJfc2V0R2xvYmFsUHJveHkgKDI3ODQ4MjgyOTM3NDc3OTE0NDYpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcG9saWN5ZGVzY19zZXRHbG9iYWxQcm94eSAoNjM4NzQ5NzQ2NjY2MDE1NDkzMSkgLS0+CisgICAgPHNraXAgLz4KICAgPHN0cmluZy1hcnJheSBuYW1lPSJwaG9uZVR5cGVzIj4KICAgICA8aXRlbSBtc2dpZD0iODkwMTA5ODMzNjY1ODcxMDM1OSI+IuynkSI8L2l0ZW0+CiAgICAgPGl0ZW0gbXNnaWQ9Ijg2OTkyMzY1MDUyNzEzNjYxNSI+IuuqqOuwlOydvCI8L2l0ZW0+CkBAIC01MjUsMTAgKzUyOSw5IEBACiAgICAgPHN0cmluZyBuYW1lPSJvcmdUeXBlV29yayIgbXNnaWQ9IjI5MjY4ODcwNTA1MzYzODcyIj4i7KeB7J6lIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ib3JnVHlwZU90aGVyIiBtc2dpZD0iMzk1MTc4MTEzMTU3MDEyNDA4MiI+Iuq4sO2DgCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9Im9yZ1R5cGVDdXN0b20iIG1zZ2lkPSIyMjU1MjM0MTUzNzIwODgzMjIiPiLrp57stqTshKTsoJUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJjb250YWN0X3N0YXR1c191cGRhdGVfYXR0cmlidXRpb24iIG1zZ2lkPSI1MTEyNTg5ODg2MDk0NDAyNzk1Ij4iPHhsaWZmOmcgaWQ9IlNPVVJDRSI+JTEkczwveGxpZmY6Zz7snYQo66W8KSDthrXtlbQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJjb250YWN0X3N0YXR1c191cGRhdGVfYXR0cmlidXRpb25fd2l0aF9kYXRlIiBtc2dpZD0iNTk0NTM4NjM3NjM2OTk3OTkwOSI+Ijx4bGlmZjpnIGlkPSJEQVRFIj4lMSRzPC94bGlmZjpnPig8eGxpZmY6ZyBpZD0iU09VUkNFIj4lMiRzPC94bGlmZjpnPiDsgqzsmqkpIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ia2V5Z3VhcmRfcGFzc3dvcmRfZW50ZXJfcGluX2NvZGUiIG1zZ2lkPSIzNzMxNDg4ODI3MjE4ODc2MTE1Ij4iUElOIOy9lOuTnCDsnoXroKUiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJrZXlndWFyZF9wYXNzd29yZF9lbnRlcl9wYXNzd29yZF9jb2RlIiBtc2dpZD0iOTEzODE1ODM0NDgxMzIxMzc1NCI+IuyeoOq4iOydhCDtlbTsoJztlZjroKTrqbQg67mE67CA67KI7Zi4IOyeheugpSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImtleWd1YXJkX3Bhc3N3b3JkX2VudGVyX3Bpbl9wYXNzd29yZF9jb2RlIiBtc2dpZD0iNjM4MzQ3MDc1NjI1NDkxNTE0Ij4i7J6g6riI7J2EIO2VtOygnO2VmOugpOuptCBQSU4g7J6F66ClIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ia2V5Z3VhcmRfcGFzc3dvcmRfd3JvbmdfcGluX2NvZGUiIG1zZ2lkPSIxMjk1OTg0MTE0MzM4MTA3NzE4Ij4iUElOIOy9lOuTnOqwgCDsnpjrqrvrkJjsl4jsirXri4jri6QuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ia2V5Z3VhcmRfbGFiZWxfdGV4dCIgbXNnaWQ9Ijg2MTc5NjQ2MTAyODI5ODQyNCI+IuyeoOq4iO2VtOygnO2VmOugpOuptCDrqZTribTrpbwg64iE66W4IOuLpOydjCAw7J2EIOuIhOumheuLiOuLpC4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJlbWVyZ2VuY3lfY2FsbF9kaWFsb2dfbnVtYmVyX2Zvcl9kaXNwbGF5IiBtc2dpZD0iNjk2MTkyMTAzMTk1MDkwOTcwIj4i67mE7IOBIOyghO2ZlOuyiO2YuCI8L3N0cmluZz4KQEAgLTU0MSw2ICs1NDQsNyBAQAogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9yZXR1cm5fdG9fY2FsbCIgbXNnaWQ9IjUyNDQyNTk3ODU1MDAwNDAwMjEiPiLthrXtmZTroZwg64+M7JWE6rCA6riwIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9wYXR0ZXJuX2NvcnJlY3QiIG1zZ2lkPSI5MDM5MDA4NjUwMzYyMjYxMjM3Ij4i66ee7Iq164uI64ukLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fcGF0dGVybl93cm9uZyIgbXNnaWQ9IjQ4MTc1ODMyNzkwNTMxMTIzMTIiPiLso4TshqHtlanri4jri6QuIOuLpOyLnCDsi5zrj4TtlZjshLjsmpQuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9wYXNzd29yZF93cm9uZyIgbXNnaWQ9IjYyMzc0NDM2NTczNTgxNjg4MTkiPiLso4TshqHtlanri4jri6QuIOuLpOyLnCDsi5zrj4TtlbQg7KO87IS47JqULiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fcGx1Z2dlZF9pbiIgbXNnaWQ9IjYxMzM0Mzg1Mjg0Mjk0NDQzNSI+Iuy2qeyghCDspJEoPHhsaWZmOmcgaWQ9Ik5VTUJFUiI+JWQ8L3hsaWZmOmc+PHhsaWZmOmcgaWQ9IlBFUkNFTlQiPiUlPC94bGlmZjpnPikiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX2NoYXJnZWQiIG1zZ2lkPSI0OTM4OTMwNDU5NjIwOTg5OTcyIj4i7Lap7KCE65CY7JeI7Iq164uI64ukLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fYmF0dGVyeV9zaG9ydCIgbXNnaWQ9IjM2MTc1NDkxNzg2MDMzNTQ2NTYiPiI8eGxpZmY6ZyBpZD0iTlVNQkVSIj4lZDwveGxpZmY6Zz4gPHhsaWZmOmcgaWQ9IlBFUkNFTlQiPiUlPC94bGlmZjpnPiI8L3N0cmluZz4KQEAgLTU1NSw2ICs1NTksOCBAQAogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9zaW1fbG9ja2VkX21lc3NhZ2UiIG1zZ2lkPSI4MDY2NjYwMTI5MjA2MDAxMDM5Ij4iU0lNIOy5tOuTnOqwgCDsnqDqsqgg7J6I7Iq164uI64ukLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fc2ltX3VubG9ja19wcm9ncmVzc19kaWFsb2dfbWVzc2FnZSIgbXNnaWQ9IjU5NTMyMzIxNDA1Mjg4MTI2NCI+IlNJTSDsubTrk5wg7J6g6riI7ZW07KCcIOykkS4uLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fdG9vX21hbnlfZmFpbGVkX2F0dGVtcHRzX2RpYWxvZ19tZXNzYWdlIiBtc2dpZD0iMzUxNDc0MjEwNjA2Njg3NzQ3NiI+IuyeoOq4iO2VtOygnCDtjKjthLTsnYQgPHhsaWZmOmcgaWQ9Ik5VTUJFUl8wIj4lZDwveGxpZmY6Zz7tmowg7J6Y66q7IOq3uOuguOyKteuLiOuLpC4gIlxuXG4iPHhsaWZmOmcgaWQ9Ik5VTUJFUl8xIj4lZDwveGxpZmY6Zz7stIgg7ZuE7JeQIOuLpOyLnCDsi5zrj4TtlZjshLjsmpQuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl90b29fbWFueV9mYWlsZWRfcGFzc3dvcmRfYXR0ZW1wdHNfZGlhbG9nX21lc3NhZ2UiIG1zZ2lkPSI0OTA2MDM0Mzc2NDI1MTc1MzgxIj4i67mE67CA67KI7Zi466W8IDx4bGlmZjpnIGlkPSJOVU1CRVJfMCI+JWQ8L3hsaWZmOmc+7ZqMIOyemOuquyDsnoXroKXtlojsirXri4jri6QuICJcblxuIjx4bGlmZjpnIGlkPSJOVU1CRVJfMSI+JWQ8L3hsaWZmOmc+7LSIIO2bhOyXkCDri6Tsi5wg7Iuc64+E7ZW0IOyjvOyEuOyalC4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3Rvb19tYW55X2ZhaWxlZF9waW5fYXR0ZW1wdHNfZGlhbG9nX21lc3NhZ2UiIG1zZ2lkPSI2ODI3NzQ5MjMxNDY1MTQ1NTkwIj4iUElO7J2EIDx4bGlmZjpnIGlkPSJOVU1CRVJfMCI+JWQ8L3hsaWZmOmc+7ZqMIOyemOuquyDsnoXroKXtlojsirXri4jri6QuICJcblxuIjx4bGlmZjpnIGlkPSJOVU1CRVJfMSI+JWQ8L3hsaWZmOmc+7LSIIO2bhOyXkCDri6Tsi5wg7Iuc64+E7ZW0IOyjvOyEuOyalC4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX2ZhaWxlZF9hdHRlbXB0c19hbG1vc3RfZ2xvZ2luIiBtc2dpZD0iMzM1MTAxMzg0MjMyMDEyNzgyNyI+IuyeoOq4iO2VtOygnCDtjKjthLTsnYQgPHhsaWZmOmcgaWQ9Ik5VTUJFUl8wIj4lZDwveGxpZmY6Zz7tmowg7J6Y66q7IOq3uOuguOyKteuLiOuLpC4gPHhsaWZmOmcgaWQ9Ik5VTUJFUl8xIj4lZDwveGxpZmY6Zz7tmowg642UIOyLpO2MqO2VmOuptCBHb29nbGUg66Gc6re47J247J2EIO2Gte2VtCDtnLTrjIDsoITtmZTrpbwg7J6g6riI7ZW07KCc7ZWY64+E66GdIOyalOyyreuQqeuLiOuLpC4gIlxuXG4iIDx4bGlmZjpnIGlkPSJOVU1CRVJfMiI+JWQ8L3hsaWZmOmc+7LSIIO2bhOyXkCDri6Tsi5wg7Iuc64+E7ZWY7IS47JqULiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fdG9vX21hbnlfZmFpbGVkX2F0dGVtcHRzX2NvdW50ZG93biIgbXNnaWQ9IjYyNTE0ODAzNDMzOTQzODk2NjUiPiI8eGxpZmY6ZyBpZD0iTlVNQkVSIj4lZDwveGxpZmY6Zz7stIgg7ZuE7JeQIOuLpOyLnCDsi5zrj4TtlZjshLjsmpQuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9mb3Jnb3RfcGF0dGVybl9idXR0b25fdGV4dCIgbXNnaWQ9IjI2MjY5OTk0NDk2MTA2OTU5MzAiPiLtjKjthLTsnYQg7J6K7Jy87IWo64KY7JqUPyI8L3N0cmluZz4KQEAgLTY5OSwxNCArNzA1LDE0IEBACiAgICAgPHN0cmluZyBuYW1lPSJlbGFwc2VkX3RpbWVfc2hvcnRfZm9ybWF0X21tX3NzIiBtc2dpZD0iNDQzMTU1NTk0MzgyODcxMTQ3MyI+Ijx4bGlmZjpnIGlkPSJNSU5VVEVTIj4lMSQwMmQ8L3hsaWZmOmc+Ojx4bGlmZjpnIGlkPSJTRUNPTkRTIj4lMiQwMmQ8L3hsaWZmOmc+Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iZWxhcHNlZF90aW1lX3Nob3J0X2Zvcm1hdF9oX21tX3NzIiBtc2dpZD0iMTg0NjA3MTk5NzYxNjY1NDEyNCI+Ijx4bGlmZjpnIGlkPSJIT1VSUyI+JTEkZDwveGxpZmY6Zz46PHhsaWZmOmcgaWQ9Ik1JTlVURVMiPiUyJDAyZDwveGxpZmY6Zz46PHhsaWZmOmcgaWQ9IlNFQ09ORFMiPiUzJDAyZDwveGxpZmY6Zz4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJzZWxlY3RBbGwiIG1zZ2lkPSI2ODc2NTE4OTI1ODQ0MTI5MzMxIj4i66qo65GQIOyEoO2DnSI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDM4ODkxNDkxMjM2MjY4ODg2MzcgLS0+ICAgICA8c3RyaW5nIG5hbWU9InNlbGVjdFRleHQiIG1zZ2lkPSI0ODYyMzU5MzExMDg4ODk4ODc4Ij4i7YWN7Iqk7Yq4IOyEoO2DnSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImN1dCIgbXNnaWQ9IjMwOTI1Njk0MDg0Mzg2MjYyNjEiPiLsnpjrnbzrgrTquLAiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJjb3B5IiBtc2dpZD0iMjY4MTk0NjIyOTUzMzUxMTk4NyI+IuuzteyCrCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBhc3RlIiBtc2dpZD0iNTYyOTg4MDgzNjgwNTAzNjQzMyI+Iuu2meyXrOuEo+q4sCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImNvcHlVcmwiIG1zZ2lkPSIyNTM4MjExNTc5NTk2MDY3NDAyIj4iVVJMIOuzteyCrCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InNlbGVjdFRleHRNb2RlIiBtc2dpZD0iNjczODU1NjM0ODg2MTM0NzI0MCI+Iu2FjeyKpO2KuCDshKDtg50uLi4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJ0ZXh0U2VsZWN0aW9uQ0FCVGl0bGUiIG1zZ2lkPSI1MjM2ODUwMzk0MzcwODIwMzU3Ij4i7YWN7Iqk7Yq4IOyEoO2DnSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImlucHV0TWV0aG9kIiBtc2dpZD0iMTY1MzYzMDA2MjMwNDU2Nzg3OSI+IuyeheugpSDrsKnrspUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJhZGRUb0RpY3Rpb25hcnkiIG1zZ2lkPSI4NzkzNjI0OTkxNjg2OTQ4NzA5Ij4i7IKs7KCE7JeQIFwnPHhsaWZmOmcgaWQ9IldPUkQiPiVzPC94bGlmZjpnPlwnIOy2lOqwgCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImVkaXRUZXh0TWVudVRpdGxlIiBtc2dpZD0iMTY3Mjk4OTE3Njk1ODU4MTQ1MiI+Iu2FjeyKpO2KuCDsiJjsoJUiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJlZGl0VGV4dE1lbnVUaXRsZSIgbXNnaWQ9IjQ5MDkxMzU1NjQ5NDE4MTU0OTQiPiLthY3siqTtirgg7J6R7JeFIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG93X2ludGVybmFsX3N0b3JhZ2Vfdmlld190aXRsZSIgbXNnaWQ9IjEzOTk3MzI0MDg3MDE2OTc1NDYiPiLsoIDsnqXqs7XqsIQg67aA7KGxIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG93X2ludGVybmFsX3N0b3JhZ2Vfdmlld190ZXh0IiBtc2dpZD0iNjM1MTA2NTQ0NjE2Mzc4ODM2Ij4i7Zy064yA7KCE7ZmUIOyggOyepeqzteqwhOydtCDrtoDsobHtlanri4jri6QuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ib2siIG1zZ2lkPSI1OTcwMDYwNDMwNTYyNTI0OTEwIj4i7ZmV7J24Ijwvc3RyaW5nPgpAQCAtNzE0LDYgKzcyMCw3IEBACiAgICAgPHN0cmluZyBuYW1lPSJ5ZXMiIG1zZ2lkPSI1MzYyOTgyMzAzMzM3OTY5MzEyIj4i7ZmV7J24Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibm8iIG1zZ2lkPSI1MTQxNTMxMDQ0OTM1NTQxNDk3Ij4i7Leo7IaMIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iZGlhbG9nX2FsZXJ0X3RpdGxlIiBtc2dpZD0iMjA0OTY1ODcwODYwOTA0MzEwMyI+IuyjvOydmCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImxvYWRpbmciIG1zZ2lkPSIxNzYwNzI0OTk4OTI4MjU1MjUwIj4i66Gc65OcIOykkS4uLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImNhcGl0YWxfb24iIG1zZ2lkPSIxNTQ0NjgyNzU1NTE0NDk0Mjk4Ij4i7IKs7JqpIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iY2FwaXRhbF9vZmYiIG1zZ2lkPSI2ODE1ODcwMzg2OTcyODA1ODMyIj4i7IKs7JqpIOyViO2VqCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9IndoaWNoQXBwbGljYXRpb24iIG1zZ2lkPSI0NTMzMTg1OTQ3MDY0NzczMzg2Ij4i7J6R7JeF7J2EIOyImO2Wie2VoCDrlYwg7IKs7Jqp7ZWY64qUIOyVoO2UjOumrOy8gOydtOyFmCI8L3N0cmluZz4KQEAgLTg1NCwxNSArODYxLDI0IEBACiAgICAgPHN0cmluZyBuYW1lPSJsMnRwX2lwc2VjX3Bza192cG5fZGVzY3JpcHRpb24iIG1zZ2lkPSIzOTQ1MDQzNTY0MDA4MzAzMjM5Ij4i7IKs7KCEIOqzteycoCDtgqQg6riw67CYIEwyVFAvSVBTZWMgVlBOIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibDJ0cF9pcHNlY19jcnRfdnBuX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNTM4MjcxNDA3MzEwMzY1MzU3NyI+IuyduOymneyEnCDquLDrsJggTDJUUC9JUFNlYyBWUE4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ1cGxvYWRfZmlsZSIgbXNnaWQ9IjI4OTc5NTcxNzIzNjY3MzA0MTYiPiLtjIzsnbwg7ISg7YOdIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibm9fZmlsZV9jaG9zZW4iIG1zZ2lkPSI2MzYzNjQ4NTYyMTcwNzU5NDY1Ij4i7YyM7J287J2EIOyEoO2Dne2VmOyngCDslYrslZjsirXri4jri6QuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icmVzZXQiIG1zZ2lkPSIyNDQ4MTY4MDgwOTY0MjA5OTA4Ij4i7J6s7ISk7KCVIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ic3VibWl0IiBtc2dpZD0iMTYwMjMzNTU3MjA4OTkxMTk0MSI+IuygnOy2nCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImRlc2NyaXB0aW9uX3N0YXIiIG1zZ2lkPSIyNjU0MzE5ODc0OTA4NTc2MTMzIj4i7KaQ6rKo7LC+6riwIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iY2FyX21vZGVfZGlzYWJsZV9ub3RpZmljYXRpb25fdGl0bGUiIG1zZ2lkPSIzMTY0NzY4MjEyMDAzODY0MzE2Ij4i7Jq07KCE66qo65OcIOyCrOyaqSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImNhcl9tb2RlX2Rpc2FibGVfbm90aWZpY2F0aW9uX21lc3NhZ2UiIG1zZ2lkPSI2Njg2NjM2MjY3MjE2NzU2MTQiPiLsmrTsoITrqqjrk5zrpbwg7KKF66OM7ZWY66Ck66m0IOyEoO2Dne2VmOyEuOyalC4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ0ZXRoZXJlZF9ub3RpZmljYXRpb25fdGl0bGUiIG1zZ2lkPSIzMTQ2Njk0MjM0Mzk4MjAyNjAxIj4i7YWM642U66eBIOuYkOuKlCDtlavsiqTtjJ8g7IKs7JqpIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idGV0aGVyZWRfbm90aWZpY2F0aW9uX21lc3NhZ2UiIG1zZ2lkPSIzMDY3MTA4MzIzOTAzMDQ4OTI3Ij4i6rWs7ISx7ZWY66Ck66m0IO2EsOy5mO2VmOyEuOyalC4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJiYWNrX2J1dHRvbl9sYWJlbCIgbXNnaWQ9IjIzMDA0NzAwMDQ1MDMzNDM0MzkiPiLrkqTroZwiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJuZXh0X2J1dHRvbl9sYWJlbCIgbXNnaWQ9IjEwODA1NTUxMDQ2Nzc5OTI0MDgiPiLri6TsnYwiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJza2lwX2J1dHRvbl9sYWJlbCIgbXNnaWQ9IjEyNzUzNjIyOTk0NzE2MzE4MTkiPiLqsbTrhIjrm7DquLAiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ0aHJvdHRsZV93YXJuaW5nX25vdGlmaWNhdGlvbl90aXRsZSIgbXNnaWQ9IjQ4OTA4OTQyNjc0NTQ4NjcyNzYiPiLrhpLsnYAg66qo67CU7J28IOuNsOydtO2EsCDsgqzsmqnrn4kiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ0aHJvdHRsZV93YXJuaW5nX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBtc2dpZD0iMjYwOTczNDc2Mzg0NTcwNTcwOCI+IuuqqOuwlOydvCDrjbDsnbTthLAg7IKs7Jqp7JeQIOuMgO2VtCDsnpDshLjtnogg7JWM7JWE67O066Ck66m0IO2EsOy5mO2VmOyEuOyalC4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ0aHJvdHRsZWRfbm90aWZpY2F0aW9uX3RpdGxlIiBtc2dpZD0iNjI2OTU0MTg5NzcyOTc4MTMzMiI+IuuqqOuwlOydvCDrjbDsnbTthLAg7KCc7ZWc7J2EIOy0iOqzvO2WiOyKteuLiOuLpC4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ0aHJvdHRsZWRfbm90aWZpY2F0aW9uX21lc3NhZ2UiIG1zZ2lkPSI0NzEyMzY5ODU2NjAxMjc1MTQ2Ij4i66qo67CU7J28IOuNsOydtO2EsCDsgqzsmqnsl5Ag64yA7ZW0IOyekOyEuO2eiCDslYzslYTrs7TroKTrqbQg7YSw7LmY7ZWY7IS47JqULiI8L3N0cmluZz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBub19tYXRjaGVzICg4MTI5NDIxOTA4OTE1ODQwNzM3KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGZpbmRfb25fcGFnZSAoMTk0Njc5OTIzMzgyMjgyMDM4NCkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBtYXRjaGVzX2ZvdW5kOm9uZSAoODE2NzE0NzA4MTEzNjU3OTQzOSkgLS0+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgbWF0Y2hlc19mb3VuZDpvdGhlciAoNDY0MTg3Mjc5NzA2NzYwOTE3NykgLS0+CiA8L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy92YWx1ZXMtbWNjNDUwLWtvL2NvbmZpZy54bWwgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzLW1jYzQ1MC1rby9jb25maWcueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMzNWI5NjcKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzLW1jYzQ1MC1rby9jb25maWcueG1sCkBAIC0wLDAgKzEsMjEgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tCisvKgorKiogQ29weXJpZ2h0IDIwMTAsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoqCisqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKioKKyoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoqCisqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCistLT4KKzxyZXNvdXJjZXM+CisgICAgPHN0cmluZyBuYW1lPSJnc21fYWxwaGFiZXRfZGVmYXVsdF9jaGFyc2V0Ij5ldWMta3I8L3N0cmluZz4KKzwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL3ZhbHVlcy1uYi9zdHJpbmdzLnhtbCBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMtbmIvc3RyaW5ncy54bWwKaW5kZXggNGNhODRlZC4uNDNlNTU5NyAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL3ZhbHVlcy1uYi9zdHJpbmdzLnhtbAorKysgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzLW5iL3N0cmluZ3MueG1sCkBAIC00MzIsNiArNDMyLDEwIEBACiAgICAgPHN0cmluZyBuYW1lPSJwb2xpY3lkZXNjX2ZvcmNlTG9jayIgbXNnaWQ9IjI4MTk4Njg2NjQ5NDYwODk3NDAiPiJLb250cm9sbGVyZXIgbsOlciBlbmhldGVuIGzDpXNlcy4gRHUgbcOlIHNrcml2ZSBpbm4gcGFzc29yZGV0IHDDpSBueXR0IGZvciDDpSBsw6VzZSBkZW4gb3BwLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBvbGljeWxhYl93aXBlRGF0YSIgbXNnaWQ9IjM5MTA1NDU0NDY3NTg2Mzk3MTMiPiJTbGV0dCBhbGxlIGRhdGEiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwb2xpY3lkZXNjX3dpcGVEYXRhIiBtc2dpZD0iMjMxNDA2MDkzMzc5NjM5NjIwNSI+IlV0ZsO4cmVyIHRpbGJha2VzdGlsbGluZyB0aWwgZmFicmlra3N0YW5kYXJkLiBBbGxlIGRhdGEgc2xldHRlcyB1dGVuIHZhcnNlbC4iPC9zdHJpbmc+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcG9saWN5bGFiX3NldEdsb2JhbFByb3h5ICgyNzg0ODI4MjkzNzQ3NzkxNDQ2KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBvbGljeWRlc2Nfc2V0R2xvYmFsUHJveHkgKDYzODc0OTc0NjY2NjAxNTQ5MzEpIC0tPgorICAgIDxza2lwIC8+CiAgIDxzdHJpbmctYXJyYXkgbmFtZT0icGhvbmVUeXBlcyI+CiAgICAgPGl0ZW0gbXNnaWQ9Ijg5MDEwOTgzMzY2NTg3MTAzNTkiPiJIamVtbWVudW1tZXIiPC9pdGVtPgogICAgIDxpdGVtIG1zZ2lkPSI4Njk5MjM2NTA1MjcxMzY2MTUiPiJNb2JpbCI8L2l0ZW0+CkBAIC01MjUsMTAgKzUyOSw5IEBACiAgICAgPHN0cmluZyBuYW1lPSJvcmdUeXBlV29yayIgbXNnaWQ9IjI5MjY4ODcwNTA1MzYzODcyIj4iQXJiZWlkIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ib3JnVHlwZU90aGVyIiBtc2dpZD0iMzk1MTc4MTEzMTU3MDEyNDA4MiI+IkFubmVuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ib3JnVHlwZUN1c3RvbSIgbXNnaWQ9IjIyNTUyMzQxNTM3MjA4ODMyMiI+IkVnZW5kZWZpbmVydCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImNvbnRhY3Rfc3RhdHVzX3VwZGF0ZV9hdHRyaWJ1dGlvbiIgbXNnaWQ9IjUxMTI1ODk4ODYwOTQ0MDI3OTUiPiJ2aWEgPHhsaWZmOmcgaWQ9IlNPVVJDRSI+JTEkczwveGxpZmY6Zz4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJjb250YWN0X3N0YXR1c191cGRhdGVfYXR0cmlidXRpb25fd2l0aF9kYXRlIiBtc2dpZD0iNTk0NTM4NjM3NjM2OTk3OTkwOSI+Ijx4bGlmZjpnIGlkPSJEQVRFIj4lMSRzPC94bGlmZjpnPiB2aWEgPHhsaWZmOmcgaWQ9IlNPVVJDRSI+JTIkczwveGxpZmY6Zz4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJrZXlndWFyZF9wYXNzd29yZF9lbnRlcl9waW5fY29kZSIgbXNnaWQ9IjM3MzE0ODg4MjcyMTg4NzYxMTUiPiJTa3JpdiBpbm4gUElOLWtvZGU6Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ia2V5Z3VhcmRfcGFzc3dvcmRfZW50ZXJfcGFzc3dvcmRfY29kZSIgbXNnaWQ9IjkxMzgxNTgzNDQ4MTMyMTM3NTQiPiJTa3JpdiBpbm4gcGFzc29yZCBmb3Igw6UgbMOlc2Ugb3BwIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ia2V5Z3VhcmRfcGFzc3dvcmRfZW50ZXJfcGluX3Bhc3N3b3JkX2NvZGUiIG1zZ2lkPSI2MzgzNDcwNzU2MjU0OTE1MTQiPiJTa3JpdiBpbm4gcGVyc29ubGlnIGtvZGUgZm9yIMOlIGzDpXNlIG9wcCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImtleWd1YXJkX3Bhc3N3b3JkX3dyb25nX3Bpbl9jb2RlIiBtc2dpZD0iMTI5NTk4NDExNDMzODEwNzcxOCI+IkdhbCBQSU4ta29kZSEiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJrZXlndWFyZF9sYWJlbF90ZXh0IiBtc2dpZD0iODYxNzk2NDYxMDI4Mjk4NDI0Ij4iRm9yIMOlIGzDpXNlIG9wcCwgdHJ5a2sgcMOlIG1lbnlrbmFwcGVuIG9nIGRlcmV0dGVyIDAuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iZW1lcmdlbmN5X2NhbGxfZGlhbG9nX251bWJlcl9mb3JfZGlzcGxheSIgbXNnaWQ9IjY5NjE5MjEwMzE5NTA5MDk3MCI+Ik7DuGRudW1tZXIiPC9zdHJpbmc+CkBAIC01NDEsNiArNTQ0LDcgQEAKICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fcmV0dXJuX3RvX2NhbGwiIG1zZ2lkPSI1MjQ0MjU5Nzg1NTAwMDQwMDIxIj4iVGlsYmFrZSB0aWwgc2FtdGFsZSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fcGF0dGVybl9jb3JyZWN0IiBtc2dpZD0iOTAzOTAwODY1MDM2MjI2MTIzNyI+IlJpa3RpZyEiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3BhdHRlcm5fd3JvbmciIG1zZ2lkPSI0ODE3NTgzMjc5MDUzMTEyMzEyIj4iQmVrbGFnZXIsIHByw7h2IGlnamVuOiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fcGFzc3dvcmRfd3JvbmciIG1zZ2lkPSI2MjM3NDQzNjU3MzU4MTY4ODE5Ij4iUHLDuHYgaWdqZW4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3BsdWdnZWRfaW4iIG1zZ2lkPSI2MTMzNDM4NTI4NDI5NDQ0MzUiPiJMYWRlciAoPHhsaWZmOmcgaWQ9Ik5VTUJFUiI+JWQ8L3hsaWZmOmc+PHhsaWZmOmcgaWQ9IlBFUkNFTlQiPiUlPC94bGlmZjpnPikiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX2NoYXJnZWQiIG1zZ2lkPSI0OTM4OTMwNDU5NjIwOTg5OTcyIj4iRnVsbHQgbGFkZXQiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX2JhdHRlcnlfc2hvcnQiIG1zZ2lkPSIzNjE3NTQ5MTc4NjAzMzU0NjU2Ij4iPHhsaWZmOmcgaWQ9Ik5VTUJFUiI+JWQ8L3hsaWZmOmc+PHhsaWZmOmcgaWQ9IlBFUkNFTlQiPiUlPC94bGlmZjpnPiI8L3N0cmluZz4KQEAgLTU1NSw2ICs1NTksOCBAQAogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9zaW1fbG9ja2VkX21lc3NhZ2UiIG1zZ2lkPSI4MDY2NjYwMTI5MjA2MDAxMDM5Ij4iU0lNLWtvcnRldCBlciBsw6VzdC4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3NpbV91bmxvY2tfcHJvZ3Jlc3NfZGlhbG9nX21lc3NhZ2UiIG1zZ2lkPSI1OTUzMjMyMTQwNTI4ODEyNjQiPiJMw6VzZXIgb3BwIFNJTS1rb3J04oCmIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl90b29fbWFueV9mYWlsZWRfYXR0ZW1wdHNfZGlhbG9nX21lc3NhZ2UiIG1zZ2lkPSIzNTE0NzQyMTA2MDY2ODc3NDc2Ij4iWW91IGhhdmUgaW5jb3JyZWN0bHkgZHJhd24geW91ciB1bmxvY2sgcGF0dGVybiA8eGxpZmY6ZyBpZD0iTlVNQkVSXzAiPiVkPC94bGlmZjpnPiB0aW1lcy4gIlxuXG4iUGxlYXNlIHRyeSBhZ2FpbiBpbiA8eGxpZmY6ZyBpZD0iTlVNQkVSXzEiPiVkPC94bGlmZjpnPiBzZWNvbmRzLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fdG9vX21hbnlfZmFpbGVkX3Bhc3N3b3JkX2F0dGVtcHRzX2RpYWxvZ19tZXNzYWdlIiBtc2dpZD0iNDkwNjAzNDM3NjQyNTE3NTM4MSI+IkR1IGhhciBvcHBnaXR0IGZlaWwgcGFzc29yZCA8eGxpZmY6ZyBpZD0iTlVNQkVSXzAiPiVkPC94bGlmZjpnPiBnYW5nZXIuICJcblxuIlByw7h2IGlnamVuIG9tIDx4bGlmZjpnIGlkPSJOVU1CRVJfMSI+JWQ8L3hsaWZmOmc+IHNla3VuZGVyLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fdG9vX21hbnlfZmFpbGVkX3Bpbl9hdHRlbXB0c19kaWFsb2dfbWVzc2FnZSIgbXNnaWQ9IjY4Mjc3NDkyMzE0NjUxNDU1OTAiPiJEdSBoYXIgb3BwZ2l0dCBmZWlsIHBlcnNvbmxpZyBrb2RlIDx4bGlmZjpnIGlkPSJOVU1CRVJfMCI+JWQ8L3hsaWZmOmc+IGdhbmdlci4gIlxuXG4iUHLDuHYgaWdqZW4gb20gPHhsaWZmOmcgaWQ9Ik5VTUJFUl8xIj4lZDwveGxpZmY6Zz4gc2VrdW5kZXIuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9mYWlsZWRfYXR0ZW1wdHNfYWxtb3N0X2dsb2dpbiIgbXNnaWQ9IjMzNTEwMTM4NDIzMjAxMjc4MjciPiJZb3UgaGF2ZSBpbmNvcnJlY3RseSBkcmF3biB5b3VyIHVubG9jayBwYXR0ZXJuIDx4bGlmZjpnIGlkPSJOVU1CRVJfMCI+JWQ8L3hsaWZmOmc+IHRpbWVzLiBBZnRlciA8eGxpZmY6ZyBpZD0iTlVNQkVSXzEiPiVkPC94bGlmZjpnPiBtb3JlIHVuc3VjY2Vzc2Z1bCBhdHRlbXB0cywgeW91IHdpbGwgYmUgYXNrZWQgdG8gdW5sb2NrIHlvdXIgcGhvbmUgdXNpbmcgeW91ciBHb29nbGUgc2lnbi1pbi4iXG5cbiIgUGxlYXNlIHRyeSBhZ2FpbiBpbiA8eGxpZmY6ZyBpZD0iTlVNQkVSXzIiPiVkPC94bGlmZjpnPiBzZWNvbmRzLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fdG9vX21hbnlfZmFpbGVkX2F0dGVtcHRzX2NvdW50ZG93biIgbXNnaWQ9IjYyNTE0ODAzNDMzOTQzODk2NjUiPiJQcsO4diBpZ2plbiBvbSA8eGxpZmY6ZyBpZD0iTlVNQkVSIj4lZDwveGxpZmY6Zz4gc2VrdW5kZXIuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9mb3Jnb3RfcGF0dGVybl9idXR0b25fdGV4dCIgbXNnaWQ9IjI2MjY5OTk0NDk2MTA2OTU5MzAiPiJHbGVtdCBtw7huc3RlcmV0PyI8L3N0cmluZz4KQEAgLTY5OSwxNCArNzA1LDE0IEBACiAgICAgPHN0cmluZyBuYW1lPSJlbGFwc2VkX3RpbWVfc2hvcnRfZm9ybWF0X21tX3NzIiBtc2dpZD0iNDQzMTU1NTk0MzgyODcxMTQ3MyI+Ijx4bGlmZjpnIGlkPSJNSU5VVEVTIj4lMSQwMmQ8L3hsaWZmOmc+Ojx4bGlmZjpnIGlkPSJTRUNPTkRTIj4lMiQwMmQ8L3hsaWZmOmc+Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iZWxhcHNlZF90aW1lX3Nob3J0X2Zvcm1hdF9oX21tX3NzIiBtc2dpZD0iMTg0NjA3MTk5NzYxNjY1NDEyNCI+Ijx4bGlmZjpnIGlkPSJIT1VSUyI+JTEkZDwveGxpZmY6Zz46PHhsaWZmOmcgaWQ9Ik1JTlVURVMiPiUyJDAyZDwveGxpZmY6Zz46PHhsaWZmOmcgaWQ9IlNFQ09ORFMiPiUzJDAyZDwveGxpZmY6Zz4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJzZWxlY3RBbGwiIG1zZ2lkPSI2ODc2NTE4OTI1ODQ0MTI5MzMxIj4iTWVyayBhbHQiPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiAzODg5MTQ5MTIzNjI2ODg4NjM3IC0tPiAgICAgPHN0cmluZyBuYW1lPSJzZWxlY3RUZXh0IiBtc2dpZD0iNDg2MjM1OTMxMTA4ODg5ODg3OCI+Ik1lcmsgdGVrc3QiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJjdXQiIG1zZ2lkPSIzMDkyNTY5NDA4NDM4NjI2MjYxIj4iS2xpcHAgdXQiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJjb3B5IiBtc2dpZD0iMjY4MTk0NjIyOTUzMzUxMTk4NyI+IktvcGllciI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBhc3RlIiBtc2dpZD0iNTYyOTg4MDgzNjgwNTAzNjQzMyI+IkxpbSBpbm4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJjb3B5VXJsIiBtc2dpZD0iMjUzODIxMTU3OTU5NjA2NzQwMiI+IktvcGllciBVUkwiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJzZWxlY3RUZXh0TW9kZSIgbXNnaWQ9IjY3Mzg1NTYzNDg4NjEzNDcyNDAiPiJNYXJrZXIgdGVrc3QiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJ0ZXh0U2VsZWN0aW9uQ0FCVGl0bGUiIG1zZ2lkPSI1MjM2ODUwMzk0MzcwODIwMzU3Ij4iTWVya2V0IHRla3N0Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iaW5wdXRNZXRob2QiIG1zZ2lkPSIxNjUzNjMwMDYyMzA0NTY3ODc5Ij4iSW5uZGF0YW1ldG9kZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImFkZFRvRGljdGlvbmFyeSIgbXNnaWQ9Ijg3OTM2MjQ5OTE2ODY5NDg3MDkiPiJMZWdnIMKrPHhsaWZmOmcgaWQ9IldPUkQiPiVzPC94bGlmZjpnPsK7IHRpbCBvcmRsaXN0ZW4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJlZGl0VGV4dE1lbnVUaXRsZSIgbXNnaWQ9IjE2NzI5ODkxNzY5NTg1ODE0NTIiPiJSZWRpZ2VyIHRla3N0Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZWRpdFRleHRNZW51VGl0bGUiIG1zZ2lkPSI0OTA5MTM1NTY0OTQxODE1NDk0Ij4iVGVrc3RoYW5kbGluZ2VyIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG93X2ludGVybmFsX3N0b3JhZ2Vfdmlld190aXRsZSIgbXNnaWQ9IjEzOTk3MzI0MDg3MDE2OTc1NDYiPiJMaXRlIHBsYXNzIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG93X2ludGVybmFsX3N0b3JhZ2Vfdmlld190ZXh0IiBtc2dpZD0iNjM1MTA2NTQ0NjE2Mzc4ODM2Ij4iRGV0IGJlZ3lubmVyIMOlIGJsaSBsaXRlIGxhZ3JpbmdzcGxhc3MgcMOlIHRlbGVmb25lbi4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJvayIgbXNnaWQ9IjU5NzAwNjA0MzA1NjI1MjQ5MTAiPiJPSyI8L3N0cmluZz4KQEAgLTcxNCw2ICs3MjAsNyBAQAogICAgIDxzdHJpbmcgbmFtZT0ieWVzIiBtc2dpZD0iNTM2Mjk4MjMwMzMzNzk2OTMxMiI+Ik9LIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibm8iIG1zZ2lkPSI1MTQxNTMxMDQ0OTM1NTQxNDk3Ij4iQXZicnl0Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iZGlhbG9nX2FsZXJ0X3RpdGxlIiBtc2dpZD0iMjA0OTY1ODcwODYwOTA0MzEwMyI+Ik1lcmsiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJsb2FkaW5nIiBtc2dpZD0iMTc2MDcyNDk5ODkyODI1NTI1MCI+Ikxhc3RlciBpbm4gLi4uIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iY2FwaXRhbF9vbiIgbXNnaWQ9IjE1NDQ2ODI3NTU1MTQ0OTQyOTgiPiJQw6UiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJjYXBpdGFsX29mZiIgbXNnaWQ9IjY4MTU4NzAzODY5NzI4MDU4MzIiPiJBdiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9IndoaWNoQXBwbGljYXRpb24iIG1zZ2lkPSI0NTMzMTg1OTQ3MDY0NzczMzg2Ij4iRnVsbGbDuHIgbWVkIjwvc3RyaW5nPgpAQCAtODU0LDE1ICs4NjEsMjQgQEAKICAgICA8c3RyaW5nIG5hbWU9ImwydHBfaXBzZWNfcHNrX3Zwbl9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM5NDUwNDM1NjQwMDgzMDMyMzkiPiJQYXNzb3JkYmFzZXJ0IEwyVFAvSVBTZWMtVlBOIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibDJ0cF9pcHNlY19jcnRfdnBuX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNTM4MjcxNDA3MzEwMzY1MzU3NyI+IlNlcnRpZmlrYXRiYXNlcnQgTDJUUC9JUFNlYy1WUE4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ1cGxvYWRfZmlsZSIgbXNnaWQ9IjI4OTc5NTcxNzIzNjY3MzA0MTYiPiJWZWxnIGZpbCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im5vX2ZpbGVfY2hvc2VuIiBtc2dpZD0iNjM2MzY0ODU2MjE3MDc1OTQ2NSI+IkluZ2VuIGZpbCBlciB2YWxndCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InJlc2V0IiBtc2dpZD0iMjQ0ODE2ODA4MDk2NDIwOTkwOCI+IlRpbGJha2VzdGlsbCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InN1Ym1pdCIgbXNnaWQ9IjE2MDIzMzU1NzIwODk5MTE5NDEiPiJTZW5kIGlubiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImRlc2NyaXB0aW9uX3N0YXIiIG1zZ2lkPSIyNjU0MzE5ODc0OTA4NTc2MTMzIj4iZmF2b3JpdHQiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJjYXJfbW9kZV9kaXNhYmxlX25vdGlmaWNhdGlvbl90aXRsZSIgbXNnaWQ9IjMxNjQ3NjgyMTIwMDM4NjQzMTYiPiJCaWxtb2R1cyBlciBha3RpdmVydCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImNhcl9tb2RlX2Rpc2FibGVfbm90aWZpY2F0aW9uX21lc3NhZ2UiIG1zZ2lkPSI2Njg2NjM2MjY3MjE2NzU2MTQiPiJWZWxnIGZvciDDpSBhdnNsdXR0ZSBiaWxtb2R1cyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InRldGhlcmVkX25vdGlmaWNhdGlvbl90aXRsZSIgbXNnaWQ9IjMxNDY2OTQyMzQzOTgyMDI2MDEiPiJUaWxrbnl0bmluZyBlbGxlciB0csOlZGzDuHMgc29uZSBlciBha3RpdiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InRldGhlcmVkX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBtc2dpZD0iMzA2NzEwODMyMzkwMzA0ODkyNyI+IlRyeWtrIGZvciDDpSBrb25maWd1cmVyZSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImJhY2tfYnV0dG9uX2xhYmVsIiBtc2dpZD0iMjMwMDQ3MDAwNDUwMzM0MzQzOSI+IlRpbGJha2UiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJuZXh0X2J1dHRvbl9sYWJlbCIgbXNnaWQ9IjEwODA1NTUxMDQ2Nzc5OTI0MDgiPiJOZXN0ZSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InNraXBfYnV0dG9uX2xhYmVsIiBtc2dpZD0iMTI3NTM2MjI5OTQ3MTYzMTgxOSI+IkhvcHAgb3ZlciI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InRocm90dGxlX3dhcm5pbmdfbm90aWZpY2F0aW9uX3RpdGxlIiBtc2dpZD0iNDg5MDg5NDI2NzQ1NDg2NzI3NiI+IkjDuHkgbW9iaWxkYXRhYnJ1ayI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InRocm90dGxlX3dhcm5pbmdfbm90aWZpY2F0aW9uX21lc3NhZ2UiIG1zZ2lkPSIyNjA5NzM0NzYzODQ1NzA1NzA4Ij4iQmVyw7hyIGZvciDDpSBsZXNlIG1lciBvbSBicnVrIGF2IG1vYmlsZGF0YSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InRocm90dGxlZF9ub3RpZmljYXRpb25fdGl0bGUiIG1zZ2lkPSI2MjY5NTQxODk3NzI5NzgxMzMyIj4iR3JlbnNlbiBmb3IgbW9iaWxkYXRhYnJ1ayBlciBvdmVyc2tyZWRldCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InRocm90dGxlZF9ub3RpZmljYXRpb25fbWVzc2FnZSIgbXNnaWQ9IjQ3MTIzNjk4NTY2MDEyNzUxNDYiPiJCZXLDuHIgZm9yIMOlIGxlc2UgbWVyIG9tIGJydWsgYXYgbW9iaWxkYXRhIjwvc3RyaW5nPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIG5vX21hdGNoZXMgKDgxMjk0MjE5MDg5MTU4NDA3MzcpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgZmluZF9vbl9wYWdlICgxOTQ2Nzk5MjMzODIyODIwMzg0KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIG1hdGNoZXNfZm91bmQ6b25lICg4MTY3MTQ3MDgxMTM2NTc5NDM5KSAtLT4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBtYXRjaGVzX2ZvdW5kOm90aGVyICg0NjQxODcyNzk3MDY3NjA5MTc3KSAtLT4KIDwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL3ZhbHVlcy1ubC9zdHJpbmdzLnhtbCBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMtbmwvc3RyaW5ncy54bWwKaW5kZXggYzhmMDA2OC4uN2FkZWQ5NiAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL3ZhbHVlcy1ubC9zdHJpbmdzLnhtbAorKysgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzLW5sL3N0cmluZ3MueG1sCkBAIC00MzIsNiArNDMyLDEwIEBACiAgICAgPHN0cmluZyBuYW1lPSJwb2xpY3lkZXNjX2ZvcmNlTG9jayIgbXNnaWQ9IjI4MTk4Njg2NjQ5NDYwODk3NDAiPiJCZWhlcmVuIHdhbm5lZXIgaGV0IGFwcGFyYWF0IHdvcmR0IHZlcmdyZW5kZWxkLCB3YXQgdmVyZWlzdCBkYXQgdSBoZXQgd2FjaHR3b29yZCBvcG5pZXV3IGludm9lcnQuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icG9saWN5bGFiX3dpcGVEYXRhIiBtc2dpZD0iMzkxMDU0NTQ0Njc1ODYzOTcxMyI+IkFsbGUgZ2VnZXZlbnMgd2lzc2VuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icG9saWN5ZGVzY193aXBlRGF0YSIgbXNnaWQ9IjIzMTQwNjA5MzM3OTYzOTYyMDUiPiJEZSBmYWJyaWVrc2luc3RlbGxpbmdlbiBoZXJzdGVsbGVuLCB3YWFyYmlqIGFsbGUgZ2VnZXZlbnMgd29yZGVuIHZlcndpamRlcmQgem9uZGVyIGJldmVzdGlnaW5nLiI8L3N0cmluZz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwb2xpY3lsYWJfc2V0R2xvYmFsUHJveHkgKDI3ODQ4MjgyOTM3NDc3OTE0NDYpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcG9saWN5ZGVzY19zZXRHbG9iYWxQcm94eSAoNjM4NzQ5NzQ2NjY2MDE1NDkzMSkgLS0+CisgICAgPHNraXAgLz4KICAgPHN0cmluZy1hcnJheSBuYW1lPSJwaG9uZVR5cGVzIj4KICAgICA8aXRlbSBtc2dpZD0iODkwMTA5ODMzNjY1ODcxMDM1OSI+IlRodWlzIjwvaXRlbT4KICAgICA8aXRlbSBtc2dpZD0iODY5OTIzNjUwNTI3MTM2NjE1Ij4iTW9iaWVsIjwvaXRlbT4KQEAgLTUyNSwxMCArNTI5LDkgQEAKICAgICA8c3RyaW5nIG5hbWU9Im9yZ1R5cGVXb3JrIiBtc2dpZD0iMjkyNjg4NzA1MDUzNjM4NzIiPiJXZXJrIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ib3JnVHlwZU90aGVyIiBtc2dpZD0iMzk1MTc4MTEzMTU3MDEyNDA4MiI+Ik92ZXJpZyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9Im9yZ1R5cGVDdXN0b20iIG1zZ2lkPSIyMjU1MjM0MTUzNzIwODgzMjIiPiJBYW5nZXBhc3QiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJjb250YWN0X3N0YXR1c191cGRhdGVfYXR0cmlidXRpb24iIG1zZ2lkPSI1MTEyNTg5ODg2MDk0NDAyNzk1Ij4idmlhIDx4bGlmZjpnIGlkPSJTT1VSQ0UiPiUxJHM8L3hsaWZmOmc+Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iY29udGFjdF9zdGF0dXNfdXBkYXRlX2F0dHJpYnV0aW9uX3dpdGhfZGF0ZSIgbXNnaWQ9IjU5NDUzODYzNzYzNjk5Nzk5MDkiPiI8eGxpZmY6ZyBpZD0iREFURSI+JTEkczwveGxpZmY6Zz4gdmlhIDx4bGlmZjpnIGlkPSJTT1VSQ0UiPiUyJHM8L3hsaWZmOmc+Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ia2V5Z3VhcmRfcGFzc3dvcmRfZW50ZXJfcGluX2NvZGUiIG1zZ2lkPSIzNzMxNDg4ODI3MjE4ODc2MTE1Ij4iUElOLWNvZGUgaW52b2VyZW4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJrZXlndWFyZF9wYXNzd29yZF9lbnRlcl9wYXNzd29yZF9jb2RlIiBtc2dpZD0iOTEzODE1ODM0NDgxMzIxMzc1NCI+IlZvZXIgaGV0IHdhY2h0d29vcmQgaW4gb20gdGUgb250Z3JlbmRlbGVuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ia2V5Z3VhcmRfcGFzc3dvcmRfZW50ZXJfcGluX3Bhc3N3b3JkX2NvZGUiIG1zZ2lkPSI2MzgzNDcwNzU2MjU0OTE1MTQiPiJWb2VyIGRlIFBJTi1jb2RlIGluIG9tIHRlIG9udGdyZW5kZWxlbiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImtleWd1YXJkX3Bhc3N3b3JkX3dyb25nX3Bpbl9jb2RlIiBtc2dpZD0iMTI5NTk4NDExNDMzODEwNzcxOCI+Ik9uanVpc3RlIFBJTi1jb2RlISI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImtleWd1YXJkX2xhYmVsX3RleHQiIG1zZ2lkPSI4NjE3OTY0NjEwMjgyOTg0MjQiPiJEcnVrIG9wIFwnTWVudVwnIGVuIHZlcnZvbGdlbnMgb3AgMCBvbSB0ZSBvbnRncmVuZGVsZW4uIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iZW1lcmdlbmN5X2NhbGxfZGlhbG9nX251bWJlcl9mb3JfZGlzcGxheSIgbXNnaWQ9IjY5NjE5MjEwMzE5NTA5MDk3MCI+IkFsYXJtbnVtbWVyIjwvc3RyaW5nPgpAQCAtNTQxLDYgKzU0NCw3IEBACiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3JldHVybl90b19jYWxsIiBtc2dpZD0iNTI0NDI1OTc4NTUwMDA0MDAyMSI+IlRlcnVnIG5hYXIgZ2VzcHJlayI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fcGF0dGVybl9jb3JyZWN0IiBtc2dpZD0iOTAzOTAwODY1MDM2MjI2MTIzNyI+Ikp1aXN0ISI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fcGF0dGVybl93cm9uZyIgbXNnaWQ9IjQ4MTc1ODMyNzkwNTMxMTIzMTIiPiJQcm9iZWVyIGhldCBvcG5pZXV3Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9wYXNzd29yZF93cm9uZyIgbXNnaWQ9IjYyMzc0NDM2NTczNTgxNjg4MTkiPiJQcm9iZWVyIGhldCBvcG5pZXV3Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9wbHVnZ2VkX2luIiBtc2dpZD0iNjEzMzQzODUyODQyOTQ0NDM1Ij4iT3BsYWRlbiAoPHhsaWZmOmcgaWQ9Ik5VTUJFUiI+JWQ8L3hsaWZmOmc+PHhsaWZmOmcgaWQ9IlBFUkNFTlQiPiUlPC94bGlmZjpnPikiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX2NoYXJnZWQiIG1zZ2lkPSI0OTM4OTMwNDU5NjIwOTg5OTcyIj4iT3BnZWxhZGVuLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fYmF0dGVyeV9zaG9ydCIgbXNnaWQ9IjM2MTc1NDkxNzg2MDMzNTQ2NTYiPiI8eGxpZmY6ZyBpZD0iTlVNQkVSIj4lZDwveGxpZmY6Zz48eGxpZmY6ZyBpZD0iUEVSQ0VOVCI+JSU8L3hsaWZmOmc+Ijwvc3RyaW5nPgpAQCAtNTU1LDYgKzU1OSw4IEBACiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3NpbV9sb2NrZWRfbWVzc2FnZSIgbXNnaWQ9IjgwNjY2NjAxMjkyMDYwMDEwMzkiPiJTSU0ta2FhcnQgaXMgdmVyZ3JlbmRlbGQuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9zaW1fdW5sb2NrX3Byb2dyZXNzX2RpYWxvZ19tZXNzYWdlIiBtc2dpZD0iNTk1MzIzMjE0MDUyODgxMjY0Ij4iU0lNLWthYXJ0IG9udGdyZW5kZWxlbi4uLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fdG9vX21hbnlfZmFpbGVkX2F0dGVtcHRzX2RpYWxvZ19tZXNzYWdlIiBtc2dpZD0iMzUxNDc0MjEwNjA2Njg3NzQ3NiI+IlUgaGVlZnQgdXcgb250Z3JlbmRlbGluZ3NwYXRyb29uIDx4bGlmZjpnIGlkPSJOVU1CRVJfMCI+JWQ8L3hsaWZmOmc+IGtlZXIgb25qdWlzdCBnZXRla2VuZC4gIlxuXG4iUHJvYmVlciBoZXQgb3ZlciA8eGxpZmY6ZyBpZD0iTlVNQkVSXzEiPiVkPC94bGlmZjpnPiBzZWNvbmRlbiBvcG5pZXV3LiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fdG9vX21hbnlfZmFpbGVkX3Bhc3N3b3JkX2F0dGVtcHRzX2RpYWxvZ19tZXNzYWdlIiBtc2dpZD0iNDkwNjAzNDM3NjQyNTE3NTM4MSI+IlUgaGVlZnQgdXcgd2FjaHR3b29yZCA8eGxpZmY6ZyBpZD0iTlVNQkVSXzAiPiVkPC94bGlmZjpnPiBrZWVyIG9uanVpc3QgaW5nZXZvZXJkLiAiXG5cbiJQcm9iZWVyIGhldCBvdmVyIDx4bGlmZjpnIGlkPSJOVU1CRVJfMSI+JWQ8L3hsaWZmOmc+IHNlY29uZGVuIG9wbmlldXcuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl90b29fbWFueV9mYWlsZWRfcGluX2F0dGVtcHRzX2RpYWxvZ19tZXNzYWdlIiBtc2dpZD0iNjgyNzc0OTIzMTQ2NTE0NTU5MCI+IlUgaGVlZnQgdXcgUElOLWNvZGUgPHhsaWZmOmcgaWQ9Ik5VTUJFUl8wIj4lZDwveGxpZmY6Zz4ga2VlciBvbmp1aXN0IGluZ2V2b2VyZC4gIlxuXG4iUHJvYmVlciBoZXQgb3ZlciA8eGxpZmY6ZyBpZD0iTlVNQkVSXzEiPiVkPC94bGlmZjpnPiBzZWNvbmRlbiBvcG5pZXV3LiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fZmFpbGVkX2F0dGVtcHRzX2FsbW9zdF9nbG9naW4iIG1zZ2lkPSIzMzUxMDEzODQyMzIwMTI3ODI3Ij4iVSBoZWVmdCB1dyBvbnRncmVuZGVsaW5nc3BhdHJvb24gPHhsaWZmOmcgaWQ9Ik5VTUJFUl8wIj4lZDwveGxpZmY6Zz4ga2VlciBvbmp1aXN0IGdldGVrZW5kLiBOYSBub2cgZWVucyA8eGxpZmY6ZyBpZD0iTlVNQkVSXzEiPiVkPC94bGlmZjpnPiBtaXNsdWt0ZSBwb2dpbmdlbiwgd29yZHQgdSBnZXZyYWFnZCBvbSB1dyB0ZWxlZm9vbiB0ZSBvbnRncmVuZGVsZW4gbWV0IHV3IEdvb2dsZSBhYW5tZWxkaW5nLiJcblxuIiBQcm9iZWVyIGhldCBvdmVyIDx4bGlmZjpnIGlkPSJOVU1CRVJfMiI+JWQ8L3hsaWZmOmc+IHNlY29uZGVuIG9wbmlldXcuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl90b29fbWFueV9mYWlsZWRfYXR0ZW1wdHNfY291bnRkb3duIiBtc2dpZD0iNjI1MTQ4MDM0MzM5NDM4OTY2NSI+IlByb2JlZXIgaGV0IG92ZXIgPHhsaWZmOmcgaWQ9Ik5VTUJFUiI+JWQ8L3hsaWZmOmc+IHNlY29uZGVuIG9wbmlldXcuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9mb3Jnb3RfcGF0dGVybl9idXR0b25fdGV4dCIgbXNnaWQ9IjI2MjY5OTk0NDk2MTA2OTU5MzAiPiJQYXRyb29uIHZlcmdldGVuPyI8L3N0cmluZz4KQEAgLTY5OSwxNCArNzA1LDE0IEBACiAgICAgPHN0cmluZyBuYW1lPSJlbGFwc2VkX3RpbWVfc2hvcnRfZm9ybWF0X21tX3NzIiBtc2dpZD0iNDQzMTU1NTk0MzgyODcxMTQ3MyI+Ijx4bGlmZjpnIGlkPSJNSU5VVEVTIj4lMSQwMmQ8L3hsaWZmOmc+Ojx4bGlmZjpnIGlkPSJTRUNPTkRTIj4lMiQwMmQ8L3hsaWZmOmc+Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iZWxhcHNlZF90aW1lX3Nob3J0X2Zvcm1hdF9oX21tX3NzIiBtc2dpZD0iMTg0NjA3MTk5NzYxNjY1NDEyNCI+Ijx4bGlmZjpnIGlkPSJIT1VSUyI+JTEkZDwveGxpZmY6Zz46PHhsaWZmOmcgaWQ9Ik1JTlVURVMiPiUyJDAyZDwveGxpZmY6Zz46PHhsaWZmOmcgaWQ9IlNFQ09ORFMiPiUzJDAyZDwveGxpZmY6Zz4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJzZWxlY3RBbGwiIG1zZ2lkPSI2ODc2NTE4OTI1ODQ0MTI5MzMxIj4iQWxsZXMgc2VsZWN0ZXJlbiI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDM4ODkxNDkxMjM2MjY4ODg2MzcgLS0+ICAgICA8c3RyaW5nIG5hbWU9InNlbGVjdFRleHQiIG1zZ2lkPSI0ODYyMzU5MzExMDg4ODk4ODc4Ij4iVGVrc3Qgc2VsZWN0ZXJlbiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImN1dCIgbXNnaWQ9IjMwOTI1Njk0MDg0Mzg2MjYyNjEiPiJLbmlwcGVuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iY29weSIgbXNnaWQ9IjI2ODE5NDYyMjk1MzM1MTE5ODciPiJLb3Bpw6tyZW4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwYXN0ZSIgbXNnaWQ9IjU2Mjk4ODA4MzY4MDUwMzY0MzMiPiJQbGFra2VuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iY29weVVybCIgbXNnaWQ9IjI1MzgyMTE1Nzk1OTYwNjc0MDIiPiJVUkwga29wacOrcmVuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ic2VsZWN0VGV4dE1vZGUiIG1zZ2lkPSI2NzM4NTU2MzQ4ODYxMzQ3MjQwIj4iVGVrc3Qgc2VsZWN0ZXJlbi4uLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InRleHRTZWxlY3Rpb25DQUJUaXRsZSIgbXNnaWQ9IjUyMzY4NTAzOTQzNzA4MjAzNTciPiJUZWtzdHNlbGVjdGllIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iaW5wdXRNZXRob2QiIG1zZ2lkPSIxNjUzNjMwMDYyMzA0NTY3ODc5Ij4iSW52b2VybWV0aG9kZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImFkZFRvRGljdGlvbmFyeSIgbXNnaWQ9Ijg3OTM2MjQ5OTE2ODY5NDg3MDkiPiJcJzx4bGlmZjpnIGlkPSJXT1JEIj4lczwveGxpZmY6Zz5cJyB0b2V2b2VnZW4gYWFuIHdvb3JkZW5ib2VrIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iZWRpdFRleHRNZW51VGl0bGUiIG1zZ2lkPSIxNjcyOTg5MTc2OTU4NTgxNDUyIj4iVGVrc3QgYmV3ZXJrZW4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJlZGl0VGV4dE1lbnVUaXRsZSIgbXNnaWQ9IjQ5MDkxMzU1NjQ5NDE4MTU0OTQiPiJUZWtzdGFjdGllcyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9Imxvd19pbnRlcm5hbF9zdG9yYWdlX3ZpZXdfdGl0bGUiIG1zZ2lkPSIxMzk5NzMyNDA4NzAxNjk3NTQ2Ij4iV2VpbmlnIHJ1aW10ZSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9Imxvd19pbnRlcm5hbF9zdG9yYWdlX3ZpZXdfdGV4dCIgbXNnaWQ9IjYzNTEwNjU0NDYxNjM3ODgzNiI+Ik9wc2xhZ3J1aW10ZSB2YW4gdGVsZWZvb24gcmFha3Qgb3AuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ib2siIG1zZ2lkPSI1OTcwMDYwNDMwNTYyNTI0OTEwIj4iT0siPC9zdHJpbmc+CkBAIC03MTQsNiArNzIwLDcgQEAKICAgICA8c3RyaW5nIG5hbWU9InllcyIgbXNnaWQ9IjUzNjI5ODIzMDMzMzc5NjkzMTIiPiJPSyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9Im5vIiBtc2dpZD0iNTE0MTUzMTA0NDkzNTU0MTQ5NyI+IkFubnVsZXJlbiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImRpYWxvZ19hbGVydF90aXRsZSIgbXNnaWQ9IjIwNDk2NTg3MDg2MDkwNDMxMDMiPiJMZXQgb3AiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJsb2FkaW5nIiBtc2dpZD0iMTc2MDcyNDk5ODkyODI1NTI1MCI+IkxhZGVuLi4uIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iY2FwaXRhbF9vbiIgbXNnaWQ9IjE1NDQ2ODI3NTU1MTQ0OTQyOTgiPiJBQU4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJjYXBpdGFsX29mZiIgbXNnaWQ9IjY4MTU4NzAzODY5NzI4MDU4MzIiPiJVSVQiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ3aGljaEFwcGxpY2F0aW9uIiBtc2dpZD0iNDUzMzE4NTk0NzA2NDc3MzM4NiI+IkFjdGllIHZvbHRvb2llbiBtZXQiPC9zdHJpbmc+CkBAIC04NTQsMTUgKzg2MSwyNCBAQAogICAgIDxzdHJpbmcgbmFtZT0ibDJ0cF9pcHNlY19wc2tfdnBuX2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzk0NTA0MzU2NDAwODMwMzIzOSI+IlZvb3JhZiBnZWRlZWxkZSBzbGV1dGVsIG9wIGJhc2lzIHZhbiBMMlRQL0lQU2VjIFZQTiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImwydHBfaXBzZWNfY3J0X3Zwbl9kZXNjcmlwdGlvbiIgbXNnaWQ9IjUzODI3MTQwNzMxMDM2NTM1NzciPiJDZXJ0aWZpY2FhdCBvcCBiYXNpcyB2YW4gTDJUUC9JUFNlYyBWUE4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ1cGxvYWRfZmlsZSIgbXNnaWQ9IjI4OTc5NTcxNzIzNjY3MzA0MTYiPiJCZXN0YW5kIGtpZXplbiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im5vX2ZpbGVfY2hvc2VuIiBtc2dpZD0iNjM2MzY0ODU2MjE3MDc1OTQ2NSI+IkdlZW4gYmVzdGFuZCBnZXNlbGVjdGVlcmQiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJyZXNldCIgbXNnaWQ9IjI0NDgxNjgwODA5NjQyMDk5MDgiPiJPcG5pZXV3IGluc3RlbGxlbiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InN1Ym1pdCIgbXNnaWQ9IjE2MDIzMzU1NzIwODk5MTE5NDEiPiJWZXJ6ZW5kZW4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJkZXNjcmlwdGlvbl9zdGFyIiBtc2dpZD0iMjY1NDMxOTg3NDkwODU3NjEzMyI+ImZhdm9yaWV0Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iY2FyX21vZGVfZGlzYWJsZV9ub3RpZmljYXRpb25fdGl0bGUiIG1zZ2lkPSIzMTY0NzY4MjEyMDAzODY0MzE2Ij4iQXV0b21vZHVzIGluZ2VzY2hha2VsZCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImNhcl9tb2RlX2Rpc2FibGVfbm90aWZpY2F0aW9uX21lc3NhZ2UiIG1zZ2lkPSI2Njg2NjM2MjY3MjE2NzU2MTQiPiJTZWxlY3RlZXIgZGl0IG9tIGRlIGF1dG9tb2R1cyBhZiB0ZSBzbHVpdGVuLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InRldGhlcmVkX25vdGlmaWNhdGlvbl90aXRsZSIgbXNnaWQ9IjMxNDY2OTQyMzQzOTgyMDI2MDEiPiJUZXRoZXJpbmcgb2YgaG90c3BvdCBhY3RpZWYiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ0ZXRoZXJlZF9ub3RpZmljYXRpb25fbWVzc2FnZSIgbXNnaWQ9IjMwNjcxMDgzMjM5MDMwNDg5MjciPiJBYW5yYWtlbiBvbSB0ZSBjb25maWd1cmVyZW4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJiYWNrX2J1dHRvbl9sYWJlbCIgbXNnaWQ9IjIzMDA0NzAwMDQ1MDMzNDM0MzkiPiJWb3JpZ2UiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJuZXh0X2J1dHRvbl9sYWJlbCIgbXNnaWQ9IjEwODA1NTUxMDQ2Nzc5OTI0MDgiPiJWb2xnZW5kZSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InNraXBfYnV0dG9uX2xhYmVsIiBtc2dpZD0iMTI3NTM2MjI5OTQ3MTYzMTgxOSI+Ik92ZXJzbGFhbiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InRocm90dGxlX3dhcm5pbmdfbm90aWZpY2F0aW9uX3RpdGxlIiBtc2dpZD0iNDg5MDg5NDI2NzQ1NDg2NzI3NiI+Ikhvb2cgbW9iaWVsIGdlZ2V2ZW5zZ2VicnVpayI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InRocm90dGxlX3dhcm5pbmdfbm90aWZpY2F0aW9uX21lc3NhZ2UiIG1zZ2lkPSIyNjA5NzM0NzYzODQ1NzA1NzA4Ij4iUmFhayBhYW4gdm9vciBtZWVyIGluZm9ybWF0aWUgb3ZlciBtb2JpZWwgZ2VnZXZlbnNnZWJydWlrIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idGhyb3R0bGVkX25vdGlmaWNhdGlvbl90aXRsZSIgbXNnaWQ9IjYyNjk1NDE4OTc3Mjk3ODEzMzIiPiJNb2JpZWxlIGdlZ2V2ZW5zbGltaWV0IG92ZXJzY2hyZWRlbiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InRocm90dGxlZF9ub3RpZmljYXRpb25fbWVzc2FnZSIgbXNnaWQ9IjQ3MTIzNjk4NTY2MDEyNzUxNDYiPiJSYWFrIGFhbiB2b29yIG1lZXIgaW5mb3JtYXRpZSBvdmVyIG1vYmllbCBnZWdldmVuc2dlYnJ1aWsiPC9zdHJpbmc+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3Igbm9fbWF0Y2hlcyAoODEyOTQyMTkwODkxNTg0MDczNykgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBmaW5kX29uX3BhZ2UgKDE5NDY3OTkyMzM4MjI4MjAzODQpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgbWF0Y2hlc19mb3VuZDpvbmUgKDgxNjcxNDcwODExMzY1Nzk0MzkpIC0tPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIG1hdGNoZXNfZm91bmQ6b3RoZXIgKDQ2NDE4NzI3OTcwNjc2MDkxNzcpIC0tPgogPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvdmFsdWVzLXBsL3N0cmluZ3MueG1sIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy1wbC9zdHJpbmdzLnhtbAppbmRleCBhZTg5N2E4Li5jNmEwZDljIDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvdmFsdWVzLXBsL3N0cmluZ3MueG1sCisrKyBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMtcGwvc3RyaW5ncy54bWwKQEAgLTQzMiw2ICs0MzIsMTAgQEAKICAgICA8c3RyaW5nIG5hbWU9InBvbGljeWRlc2NfZm9yY2VMb2NrIiBtc2dpZD0iMjgxOTg2ODY2NDk0NjA4OTc0MCI+IktvbnRyb2x1amUsIGtpZWR5IHVyesSFZHplbmllIGplc3QgYmxva293YW5lLCB3eW1hZ2FqxIVjIHBvbm93bmVnbyB3cHJvd2FkemVuaWEgaGFzxYJhLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBvbGljeWxhYl93aXBlRGF0YSIgbXNnaWQ9IjM5MTA1NDU0NDY3NTg2Mzk3MTMiPiJVc3XFhCB3c3p5c3RraWUgZGFuZSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBvbGljeWRlc2Nfd2lwZURhdGEiIG1zZ2lkPSIyMzE0MDYwOTMzNzk2Mzk2MjA1Ij4iV3lrb251amUgcmVzZXQgZmFicnljem55LCB1c3V3YWrEhWMgd3N6eXN0a2llIGRhbmUgdcW8eXRrb3duaWthIGJleiDFvGFkbmVnbyBwb3R3aWVyZHplbmlhLiI8L3N0cmluZz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwb2xpY3lsYWJfc2V0R2xvYmFsUHJveHkgKDI3ODQ4MjgyOTM3NDc3OTE0NDYpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcG9saWN5ZGVzY19zZXRHbG9iYWxQcm94eSAoNjM4NzQ5NzQ2NjY2MDE1NDkzMSkgLS0+CisgICAgPHNraXAgLz4KICAgPHN0cmluZy1hcnJheSBuYW1lPSJwaG9uZVR5cGVzIj4KICAgICA8aXRlbSBtc2dpZD0iODkwMTA5ODMzNjY1ODcxMDM1OSI+IkRvbSI8L2l0ZW0+CiAgICAgPGl0ZW0gbXNnaWQ9Ijg2OTkyMzY1MDUyNzEzNjYxNSI+IktvbcOzcmthIjwvaXRlbT4KQEAgLTUyNSwxMCArNTI5LDkgQEAKICAgICA8c3RyaW5nIG5hbWU9Im9yZ1R5cGVXb3JrIiBtc2dpZD0iMjkyNjg4NzA1MDUzNjM4NzIiPiJTxYJ1xbxib3d5Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ib3JnVHlwZU90aGVyIiBtc2dpZD0iMzk1MTc4MTEzMTU3MDEyNDA4MiI+IklubnkiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJvcmdUeXBlQ3VzdG9tIiBtc2dpZD0iMjI1NTIzNDE1MzcyMDg4MzIyIj4iTmllc3RhbmRhcmRvd3kiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJjb250YWN0X3N0YXR1c191cGRhdGVfYXR0cmlidXRpb24iIG1zZ2lkPSI1MTEyNTg5ODg2MDk0NDAyNzk1Ij4icHJ6ZXogPHhsaWZmOmcgaWQ9IlNPVVJDRSI+JTEkczwveGxpZmY6Zz4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJjb250YWN0X3N0YXR1c191cGRhdGVfYXR0cmlidXRpb25fd2l0aF9kYXRlIiBtc2dpZD0iNTk0NTM4NjM3NjM2OTk3OTkwOSI+Ijx4bGlmZjpnIGlkPSJEQVRFIj4lMSRzPC94bGlmZjpnPiBwcnpleiA8eGxpZmY6ZyBpZD0iU09VUkNFIj4lMiRzPC94bGlmZjpnPiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImtleWd1YXJkX3Bhc3N3b3JkX2VudGVyX3Bpbl9jb2RlIiBtc2dpZD0iMzczMTQ4ODgyNzIxODg3NjExNSI+Ildwcm93YWTFuiBrb2QgUElOIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ia2V5Z3VhcmRfcGFzc3dvcmRfZW50ZXJfcGFzc3dvcmRfY29kZSIgbXNnaWQ9IjkxMzgxNTgzNDQ4MTMyMTM3NTQiPiJXcHJvd2FkxbogaGFzxYJvLCBhYnkgb2RibG9rb3dhxIciPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJrZXlndWFyZF9wYXNzd29yZF9lbnRlcl9waW5fcGFzc3dvcmRfY29kZSIgbXNnaWQ9IjYzODM0NzA3NTYyNTQ5MTUxNCI+Ildwcm93YWTFuiBrb2QgUElOLCBhYnkgb2RibG9rb3dhxIciPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJrZXlndWFyZF9wYXNzd29yZF93cm9uZ19waW5fY29kZSIgbXNnaWQ9IjEyOTU5ODQxMTQzMzgxMDc3MTgiPiJCxYLEmWRueSBrb2QgUElOISI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImtleWd1YXJkX2xhYmVsX3RleHQiIG1zZ2lkPSI4NjE3OTY0NjEwMjgyOTg0MjQiPiJBYnkgb2RibG9rb3dhxIcsIG5hY2nFm25paiBNZW51LCBhIG5hc3TEmXBuaWUgMC4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJlbWVyZ2VuY3lfY2FsbF9kaWFsb2dfbnVtYmVyX2Zvcl9kaXNwbGF5IiBtc2dpZD0iNjk2MTkyMTAzMTk1MDkwOTcwIj4iTnVtZXIgYWxhcm1vd3kiPC9zdHJpbmc+CkBAIC01NDEsNiArNTQ0LDcgQEAKICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fcmV0dXJuX3RvX2NhbGwiIG1zZ2lkPSI1MjQ0MjU5Nzg1NTAwMDQwMDIxIj4iUG93csOzdCBkbyBwb8WCxIVjemVuaWEiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3BhdHRlcm5fY29ycmVjdCIgbXNnaWQ9IjkwMzkwMDg2NTAzNjIyNjEyMzciPiJQb3ByYXduaWUhIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9wYXR0ZXJuX3dyb25nIiBtc2dpZD0iNDgxNzU4MzI3OTA1MzExMjMxMiI+Ik5pZXN0ZXR5LCBzcHLDs2J1aiBwb25vd25pZSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fcGFzc3dvcmRfd3JvbmciIG1zZ2lkPSI2MjM3NDQzNjU3MzU4MTY4ODE5Ij4iU3Byw7NidWogcG9ub3duaWUiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3BsdWdnZWRfaW4iIG1zZ2lkPSI2MTMzNDM4NTI4NDI5NDQ0MzUiPiLFgWFkb3dhbmllICg8eGxpZmY6ZyBpZD0iTlVNQkVSIj4lZDwveGxpZmY6Zz48eGxpZmY6ZyBpZD0iUEVSQ0VOVCI+JSU8L3hsaWZmOmc+KSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fY2hhcmdlZCIgbXNnaWQ9IjQ5Mzg5MzA0NTk2MjA5ODk5NzIiPiJOYcWCYWRvd2FueS4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX2JhdHRlcnlfc2hvcnQiIG1zZ2lkPSIzNjE3NTQ5MTc4NjAzMzU0NjU2Ij4iPHhsaWZmOmcgaWQ9Ik5VTUJFUiI+JWQ8L3hsaWZmOmc+PHhsaWZmOmcgaWQ9IlBFUkNFTlQiPiUlPC94bGlmZjpnPiI8L3N0cmluZz4KQEAgLTU1NSw2ICs1NTksOCBAQAogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9zaW1fbG9ja2VkX21lc3NhZ2UiIG1zZ2lkPSI4MDY2NjYwMTI5MjA2MDAxMDM5Ij4iS2FydGEgU0lNIGplc3QgemFibG9rb3dhbmEuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9zaW1fdW5sb2NrX3Byb2dyZXNzX2RpYWxvZ19tZXNzYWdlIiBtc2dpZD0iNTk1MzIzMjE0MDUyODgxMjY0Ij4iT2RibG9rb3d5d2FuaWUga2FydHkgU0lNLi4uIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl90b29fbWFueV9mYWlsZWRfYXR0ZW1wdHNfZGlhbG9nX21lc3NhZ2UiIG1zZ2lkPSIzNTE0NzQyMTA2MDY2ODc3NDc2Ij4iV3rDs3Igb2RibG9rb3dhbmlhIHpvc3RhxYIgbmllcHJhd2lkxYJvd28gbmFyeXNvd2FueSA8eGxpZmY6ZyBpZD0iTlVNQkVSXzAiPiVkPC94bGlmZjpnPiByYXp5LiAiXG5cbiJTcHLDs2J1aiBwb25vd25pZSB6YSA8eGxpZmY6ZyBpZD0iTlVNQkVSXzEiPiVkPC94bGlmZjpnPiBzZWt1bmQuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl90b29fbWFueV9mYWlsZWRfcGFzc3dvcmRfYXR0ZW1wdHNfZGlhbG9nX21lc3NhZ2UiIG1zZ2lkPSI0OTA2MDM0Mzc2NDI1MTc1MzgxIj4iSGFzxYJvIHpvc3RhxYJvIG5pZXByYXdpZMWCb3dvIHdwcm93YWR6b25lIDx4bGlmZjpnIGlkPSJOVU1CRVJfMCI+JWQ8L3hsaWZmOmc+IHJhenkuICJcblxuIlNwcsOzYnVqIHBvbm93bmllIHphIDx4bGlmZjpnIGlkPSJOVU1CRVJfMSI+JWQ8L3hsaWZmOmc+IHMuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl90b29fbWFueV9mYWlsZWRfcGluX2F0dGVtcHRzX2RpYWxvZ19tZXNzYWdlIiBtc2dpZD0iNjgyNzc0OTIzMTQ2NTE0NTU5MCI+Ik5pZXBvcHJhd25pZSB3cHJvd2Fkem9ubyBrb2QgUElOIDx4bGlmZjpnIGlkPSJOVU1CRVJfMCI+JWQ8L3hsaWZmOmc+IHJhenkuICJcblxuIlNwcsOzYnVqIHBvbm93bmllIHphIDx4bGlmZjpnIGlkPSJOVU1CRVJfMSI+JWQ8L3hsaWZmOmc+IHMuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9mYWlsZWRfYXR0ZW1wdHNfYWxtb3N0X2dsb2dpbiIgbXNnaWQ9IjMzNTEwMTM4NDIzMjAxMjc4MjciPiJXesOzciBvZGJsb2tvd2FuaWEgem9zdGHFgiBuYXJ5c293YW55IG5pZXByYXdpZMWCb3dvIDx4bGlmZjpnIGlkPSJOVU1CRVJfMCI+JWQ8L3hsaWZmOmc+IHJhenkuIFBvIGtvbGVqbnljaCA8eGxpZmY6ZyBpZD0iTlVNQkVSXzEiPiVkPC94bGlmZjpnPiBuaWV1ZGFueWNoIHByw7NiYWNoIHRlbGVmb24gdHJ6ZWJhIGLEmWR6aWUgb2RibG9rb3dhxIcgcHJ6ZXogemFsb2dvd2FuaWUgbmEga29uY2llIEdvb2dsZS4iXG5cbiIgU3Byw7NidWogcG9ub3duaWUgemEgPHhsaWZmOmcgaWQ9Ik5VTUJFUl8yIj4lZDwveGxpZmY6Zz4gc2VrdW5kLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fdG9vX21hbnlfZmFpbGVkX2F0dGVtcHRzX2NvdW50ZG93biIgbXNnaWQ9IjYyNTE0ODAzNDMzOTQzODk2NjUiPiJTcHLDs2J1aiBwb25vd25pZSB6YSA8eGxpZmY6ZyBpZD0iTlVNQkVSIj4lZDwveGxpZmY6Zz4gc2VrdW5kLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fZm9yZ290X3BhdHRlcm5fYnV0dG9uX3RleHQiIG1zZ2lkPSIyNjI2OTk5NDQ5NjEwNjk1OTMwIj4iWmFwb21uaWHFgmXFmyB3em9ydT8iPC9zdHJpbmc+CkBAIC02OTksMTQgKzcwNSwxNCBAQAogICAgIDxzdHJpbmcgbmFtZT0iZWxhcHNlZF90aW1lX3Nob3J0X2Zvcm1hdF9tbV9zcyIgbXNnaWQ9IjQ0MzE1NTU5NDM4Mjg3MTE0NzMiPiI8eGxpZmY6ZyBpZD0iTUlOVVRFUyI+JTEkMDJkPC94bGlmZjpnPjo8eGxpZmY6ZyBpZD0iU0VDT05EUyI+JTIkMDJkPC94bGlmZjpnPiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImVsYXBzZWRfdGltZV9zaG9ydF9mb3JtYXRfaF9tbV9zcyIgbXNnaWQ9IjE4NDYwNzE5OTc2MTY2NTQxMjQiPiI8eGxpZmY6ZyBpZD0iSE9VUlMiPiUxJGQ8L3hsaWZmOmc+Ojx4bGlmZjpnIGlkPSJNSU5VVEVTIj4lMiQwMmQ8L3hsaWZmOmc+Ojx4bGlmZjpnIGlkPSJTRUNPTkRTIj4lMyQwMmQ8L3hsaWZmOmc+Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ic2VsZWN0QWxsIiBtc2dpZD0iNjg3NjUxODkyNTg0NDEyOTMzMSI+Ilphem5hY3ogd3N6eXN0a28iPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiAzODg5MTQ5MTIzNjI2ODg4NjM3IC0tPiAgICAgPHN0cmluZyBuYW1lPSJzZWxlY3RUZXh0IiBtc2dpZD0iNDg2MjM1OTMxMTA4ODg5ODg3OCI+Ilphem5hY3ogdGVrc3QiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJjdXQiIG1zZ2lkPSIzMDkyNTY5NDA4NDM4NjI2MjYxIj4iV3l0bmlqIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iY29weSIgbXNnaWQ9IjI2ODE5NDYyMjk1MzM1MTE5ODciPiJLb3BpdWoiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwYXN0ZSIgbXNnaWQ9IjU2Mjk4ODA4MzY4MDUwMzY0MzMiPiJXa2xlaiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImNvcHlVcmwiIG1zZ2lkPSIyNTM4MjExNTc5NTk2MDY3NDAyIj4iS29waXVqIGFkcmVzIFVSTCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InNlbGVjdFRleHRNb2RlIiBtc2dpZD0iNjczODU1NjM0ODg2MTM0NzI0MCI+Ilphem5hY3ogdGVrc3QiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJ0ZXh0U2VsZWN0aW9uQ0FCVGl0bGUiIG1zZ2lkPSI1MjM2ODUwMzk0MzcwODIwMzU3Ij4iWmF6bmFjemFuaWUgdGVrc3R1Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iaW5wdXRNZXRob2QiIG1zZ2lkPSIxNjUzNjMwMDYyMzA0NTY3ODc5Ij4iTWV0b2RhIHdwcm93YWR6YW5pYSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImFkZFRvRGljdGlvbmFyeSIgbXNnaWQ9Ijg3OTM2MjQ5OTE2ODY5NDg3MDkiPiJEb2RhaiB0ZXJtaW4g4oCePHhsaWZmOmcgaWQ9IldPUkQiPiVzPC94bGlmZjpnPuKAnSBkbyBzxYJvd25pa2EiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJlZGl0VGV4dE1lbnVUaXRsZSIgbXNnaWQ9IjE2NzI5ODkxNzY5NTg1ODE0NTIiPiJFZHl0dWogdGVrc3QiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJlZGl0VGV4dE1lbnVUaXRsZSIgbXNnaWQ9IjQ5MDkxMzU1NjQ5NDE4MTU0OTQiPiJEemlhxYJhbmlhIG5hIHRla8WbY2llIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG93X2ludGVybmFsX3N0b3JhZ2Vfdmlld190aXRsZSIgbXNnaWQ9IjEzOTk3MzI0MDg3MDE2OTc1NDYiPiJNYcWCbyBtaWVqc2NhIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG93X2ludGVybmFsX3N0b3JhZ2Vfdmlld190ZXh0IiBtc2dpZD0iNjM1MTA2NTQ0NjE2Mzc4ODM2Ij4iTWFsZWplIGlsb8WbxIcgZG9zdMSZcG5laiBwYW1pxJljaSB0ZWxlZm9udS4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJvayIgbXNnaWQ9IjU5NzAwNjA0MzA1NjI1MjQ5MTAiPiJPSyI8L3N0cmluZz4KQEAgLTcxNCw2ICs3MjAsNyBAQAogICAgIDxzdHJpbmcgbmFtZT0ieWVzIiBtc2dpZD0iNTM2Mjk4MjMwMzMzNzk2OTMxMiI+Ik9LIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibm8iIG1zZ2lkPSI1MTQxNTMxMDQ0OTM1NTQxNDk3Ij4iQW51bHVqIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iZGlhbG9nX2FsZXJ0X3RpdGxlIiBtc2dpZD0iMjA0OTY1ODcwODYwOTA0MzEwMyI+IlV3YWdhIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibG9hZGluZyIgbXNnaWQ9IjE3NjA3MjQ5OTg5MjgyNTUyNTAiPiJXY3p5dHl3YW5pZS4uLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImNhcGl0YWxfb24iIG1zZ2lkPSIxNTQ0NjgyNzU1NTE0NDk0Mjk4Ij4iV8WCxIVjeiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImNhcGl0YWxfb2ZmIiBtc2dpZD0iNjgxNTg3MDM4Njk3MjgwNTgzMiI+Ild5xYLEhWN6Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0id2hpY2hBcHBsaWNhdGlvbiIgbXNnaWQ9IjQ1MzMxODU5NDcwNjQ3NzMzODYiPiJaYWtvxYRjeiBjenlubm/Fm8SHIGtvcnp5c3RhasSFYyB6Ijwvc3RyaW5nPgpAQCAtODU0LDE1ICs4NjEsMjQgQEAKICAgICA8c3RyaW5nIG5hbWU9ImwydHBfaXBzZWNfcHNrX3Zwbl9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM5NDUwNDM1NjQwMDgzMDMyMzkiPiJTaWXEhyBWUE4gTDJUUC9JUFNlYyB6IGtsdWN6ZW0gUFNLIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibDJ0cF9pcHNlY19jcnRfdnBuX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNTM4MjcxNDA3MzEwMzY1MzU3NyI+IlNpZcSHIFZQTiBMMlRQL0lQU2VjIHogY2VydHlmaWthdGVtIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idXBsb2FkX2ZpbGUiIG1zZ2lkPSIyODk3OTU3MTcyMzY2NzMwNDE2Ij4iV3liaWVyeiBwbGlrIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibm9fZmlsZV9jaG9zZW4iIG1zZ2lkPSI2MzYzNjQ4NTYyMTcwNzU5NDY1Ij4iTmllIHd5YnJhbm8gcGxpa3UiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJyZXNldCIgbXNnaWQ9IjI0NDgxNjgwODA5NjQyMDk5MDgiPiJSZXNldHVqIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ic3VibWl0IiBtc2dpZD0iMTYwMjMzNTU3MjA4OTkxMTk0MSI+IlByemXFm2xpaiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImRlc2NyaXB0aW9uX3N0YXIiIG1zZ2lkPSIyNjU0MzE5ODc0OTA4NTc2MTMzIj4idWx1YmlvbmUiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJjYXJfbW9kZV9kaXNhYmxlX25vdGlmaWNhdGlvbl90aXRsZSIgbXNnaWQ9IjMxNjQ3NjgyMTIwMDM4NjQzMTYiPiJUcnliIHNhbW9jaG9kb3d5IHfFgsSFY3pvbnkiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJjYXJfbW9kZV9kaXNhYmxlX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBtc2dpZD0iNjY4NjYzNjI2NzIxNjc1NjE0Ij4iV3liaWVyeiwgYWJ5IHpha2/FhGN6ecSHIHRyeWIgc2Ftb2Nob2Rvd3kuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idGV0aGVyZWRfbm90aWZpY2F0aW9uX3RpdGxlIiBtc2dpZD0iMzE0NjY5NDIzNDM5ODIwMjYwMSI+Ikplc3QgYWt0eXduZSBwb3dpxIV6YW5pZSBsdWIgcHVua3QgZG9zdMSZcHUiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ0ZXRoZXJlZF9ub3RpZmljYXRpb25fbWVzc2FnZSIgbXNnaWQ9IjMwNjcxMDgzMjM5MDMwNDg5MjciPiJEb3RrbmlqLCBhYnkgc2tvbmZpZ3Vyb3dhxIciPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJiYWNrX2J1dHRvbl9sYWJlbCIgbXNnaWQ9IjIzMDA0NzAwMDQ1MDMzNDM0MzkiPiJXcsOzxIciPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJuZXh0X2J1dHRvbl9sYWJlbCIgbXNnaWQ9IjEwODA1NTUxMDQ2Nzc5OTI0MDgiPiJEYWxlaiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InNraXBfYnV0dG9uX2xhYmVsIiBtc2dpZD0iMTI3NTM2MjI5OTQ3MTYzMTgxOSI+IlBvbWnFhCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InRocm90dGxlX3dhcm5pbmdfbm90aWZpY2F0aW9uX3RpdGxlIiBtc2dpZD0iNDg5MDg5NDI2NzQ1NDg2NzI3NiI+Ild5c29raSBwb3ppb20gdcW8eWNpYSBkYW55Y2giPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ0aHJvdHRsZV93YXJuaW5nX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBtc2dpZD0iMjYwOTczNDc2Mzg0NTcwNTcwOCI+IkRvdGtuaWosIGFieSB6b2JhY3p5xIcgc3RhdHlzdHlraSBwcnplc3nFgnUgZGFueWNoIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idGhyb3R0bGVkX25vdGlmaWNhdGlvbl90aXRsZSIgbXNnaWQ9IjYyNjk1NDE4OTc3Mjk3ODEzMzIiPiJQcnpla3JvY3pvbm8gbGltaXQgZGFueWNoIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idGhyb3R0bGVkX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBtc2dpZD0iNDcxMjM2OTg1NjYwMTI3NTE0NiI+IkRvdGtuaWosIGFieSB6b2JhY3p5xIcgc3RhdHlzdHlraSBwcnplc3nFgnUgZGFueWNoIjwvc3RyaW5nPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIG5vX21hdGNoZXMgKDgxMjk0MjE5MDg5MTU4NDA3MzcpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgZmluZF9vbl9wYWdlICgxOTQ2Nzk5MjMzODIyODIwMzg0KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIG1hdGNoZXNfZm91bmQ6b25lICg4MTY3MTQ3MDgxMTM2NTc5NDM5KSAtLT4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBtYXRjaGVzX2ZvdW5kOm90aGVyICg0NjQxODcyNzk3MDY3NjA5MTc3KSAtLT4KIDwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL3ZhbHVlcy1wdC1yUFQvc3RyaW5ncy54bWwgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzLXB0LXJQVC9zdHJpbmdzLnhtbAppbmRleCBiOWY5YmUyLi42MzhkYTM0IDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvdmFsdWVzLXB0LXJQVC9zdHJpbmdzLnhtbAorKysgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzLXB0LXJQVC9zdHJpbmdzLnhtbApAQCAtNDMyLDYgKzQzMiwxMCBAQAogICAgIDxzdHJpbmcgbmFtZT0icG9saWN5ZGVzY19mb3JjZUxvY2siIG1zZ2lkPSIyODE5ODY4NjY0OTQ2MDg5NzQwIj4iQ29udHJvbGUgcXVhbmRvIG8gZGlzcG9zaXRpdm8gw6kgYmxvcXVlYWRvLCBzZW5kbyBuZWNlc3PDoXJpbyByZWludHJvZHV6aXIgYSByZXNwZWN0aXZhIHBhbGF2cmEtcGFzc2UuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icG9saWN5bGFiX3dpcGVEYXRhIiBtc2dpZD0iMzkxMDU0NTQ0Njc1ODYzOTcxMyI+IkFwYWdhciB0b2RvcyBvcyBkYWRvcyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBvbGljeWRlc2Nfd2lwZURhdGEiIG1zZ2lkPSIyMzE0MDYwOTMzNzk2Mzk2MjA1Ij4iRWZlY3R1ZSB1bWEgcmVwb3Npw6fDo28gZGUgZsOhYnJpY2EsIGVsaW1pbmFuZG8gdG9kb3Mgb3MgZGFkb3Mgc2VtIHF1YWxxdWVyIGNvbmZpcm1hw6fDo28uIjwvc3RyaW5nPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBvbGljeWxhYl9zZXRHbG9iYWxQcm94eSAoMjc4NDgyODI5Mzc0Nzc5MTQ0NikgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwb2xpY3lkZXNjX3NldEdsb2JhbFByb3h5ICg2Mzg3NDk3NDY2NjYwMTU0OTMxKSAtLT4KKyAgICA8c2tpcCAvPgogICA8c3RyaW5nLWFycmF5IG5hbWU9InBob25lVHlwZXMiPgogICAgIDxpdGVtIG1zZ2lkPSI4OTAxMDk4MzM2NjU4NzEwMzU5Ij4iUmVzaWTDqm5jaWEiPC9pdGVtPgogICAgIDxpdGVtIG1zZ2lkPSI4Njk5MjM2NTA1MjcxMzY2MTUiPiJNw7N2ZWwiPC9pdGVtPgpAQCAtNTI1LDEwICs1MjksOSBAQAogICAgIDxzdHJpbmcgbmFtZT0ib3JnVHlwZVdvcmsiIG1zZ2lkPSIyOTI2ODg3MDUwNTM2Mzg3MiI+IkVtcHJlZ28iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJvcmdUeXBlT3RoZXIiIG1zZ2lkPSIzOTUxNzgxMTMxNTcwMTI0MDgyIj4iT3V0cm8iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJvcmdUeXBlQ3VzdG9tIiBtc2dpZD0iMjI1NTIzNDE1MzcyMDg4MzIyIj4iUGVyc29uYWxpemFkbyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImNvbnRhY3Rfc3RhdHVzX3VwZGF0ZV9hdHRyaWJ1dGlvbiIgbXNnaWQ9IjUxMTI1ODk4ODYwOTQ0MDI3OTUiPiJhdHJhdsOpcyBkbyA8eGxpZmY6ZyBpZD0iU09VUkNFIj4lMSRzPC94bGlmZjpnPiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImNvbnRhY3Rfc3RhdHVzX3VwZGF0ZV9hdHRyaWJ1dGlvbl93aXRoX2RhdGUiIG1zZ2lkPSI1OTQ1Mzg2Mzc2MzY5OTc5OTA5Ij4iPHhsaWZmOmcgaWQ9IkRBVEUiPiUxJHM8L3hsaWZmOmc+IGF0cmF2w6lzIGRlIDx4bGlmZjpnIGlkPSJTT1VSQ0UiPiUyJHM8L3hsaWZmOmc+Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ia2V5Z3VhcmRfcGFzc3dvcmRfZW50ZXJfcGluX2NvZGUiIG1zZ2lkPSIzNzMxNDg4ODI3MjE4ODc2MTE1Ij4iSW50cm9kdXppciBjw7NkaWdvIFBJTiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImtleWd1YXJkX3Bhc3N3b3JkX2VudGVyX3Bhc3N3b3JkX2NvZGUiIG1zZ2lkPSI5MTM4MTU4MzQ0ODEzMjEzNzU0Ij4iSW50cm9kdXphIGEgcGFsYXZyYS1wYXNzZSBwYXJhIGRlc2Jsb3F1ZWFyIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ia2V5Z3VhcmRfcGFzc3dvcmRfZW50ZXJfcGluX3Bhc3N3b3JkX2NvZGUiIG1zZ2lkPSI2MzgzNDcwNzU2MjU0OTE1MTQiPiJJbnRyb2R1emEgbyBQSU4gcGFyYSBkZXNibG9xdWVhciI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImtleWd1YXJkX3Bhc3N3b3JkX3dyb25nX3Bpbl9jb2RlIiBtc2dpZD0iMTI5NTk4NDExNDMzODEwNzcxOCI+IkPDs2RpZ28gUElOIGluY29ycmVjdG8hIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ia2V5Z3VhcmRfbGFiZWxfdGV4dCIgbXNnaWQ9Ijg2MTc5NjQ2MTAyODI5ODQyNCI+IlBhcmEgZGVzYmxvcXVlYXIsIHByaW1hIE1lbnUgZSwgZW0gc2VndWlkYSwgMC4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJlbWVyZ2VuY3lfY2FsbF9kaWFsb2dfbnVtYmVyX2Zvcl9kaXNwbGF5IiBtc2dpZD0iNjk2MTkyMTAzMTk1MDkwOTcwIj4iTsO6bWVybyBkZSBlbWVyZ8OqbmNpYSI8L3N0cmluZz4KQEAgLTU0MSw2ICs1NDQsNyBAQAogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9yZXR1cm5fdG9fY2FsbCIgbXNnaWQ9IjUyNDQyNTk3ODU1MDAwNDAwMjEiPiJSZWdyZXNzYXIgw6AgY2hhbWFkYSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fcGF0dGVybl9jb3JyZWN0IiBtc2dpZD0iOTAzOTAwODY1MDM2MjI2MTIzNyI+IkNvcnJlY3RvISI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fcGF0dGVybl93cm9uZyIgbXNnaWQ9IjQ4MTc1ODMyNzkwNTMxMTIzMTIiPiJMYW1lbnRhbW9zLCB0ZW50ZSBub3ZhbWVudGUiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3Bhc3N3b3JkX3dyb25nIiBtc2dpZD0iNjIzNzQ0MzY1NzM1ODE2ODgxOSI+IkxhbWVudGFtb3MsIHRlbnRlIG5vdmFtZW50ZSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fcGx1Z2dlZF9pbiIgbXNnaWQ9IjYxMzM0Mzg1Mjg0Mjk0NDQzNSI+IkEgY2FycmVnYXIgKDx4bGlmZjpnIGlkPSJOVU1CRVIiPiVkPC94bGlmZjpnPjx4bGlmZjpnIGlkPSJQRVJDRU5UIj4lJTwveGxpZmY6Zz4pIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9jaGFyZ2VkIiBtc2dpZD0iNDkzODkzMDQ1OTYyMDk4OTk3MiI+IkNhcnJlZ2Fkby4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX2JhdHRlcnlfc2hvcnQiIG1zZ2lkPSIzNjE3NTQ5MTc4NjAzMzU0NjU2Ij4iPHhsaWZmOmcgaWQ9Ik5VTUJFUiI+JWQ8L3hsaWZmOmc+PHhsaWZmOmcgaWQ9IlBFUkNFTlQiPiUlPC94bGlmZjpnPiI8L3N0cmluZz4KQEAgLTU1NSw2ICs1NTksOCBAQAogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9zaW1fbG9ja2VkX21lc3NhZ2UiIG1zZ2lkPSI4MDY2NjYwMTI5MjA2MDAxMDM5Ij4iTyBjYXJ0w6NvIFNJTSBlc3TDoSBibG9xdWVhZG8uIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9zaW1fdW5sb2NrX3Byb2dyZXNzX2RpYWxvZ19tZXNzYWdlIiBtc2dpZD0iNTk1MzIzMjE0MDUyODgxMjY0Ij4iQSBkZXNibG9xdWVhciBjYXJ0w6NvIFNJTS4uLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fdG9vX21hbnlfZmFpbGVkX2F0dGVtcHRzX2RpYWxvZ19tZXNzYWdlIiBtc2dpZD0iMzUxNDc0MjEwNjA2Njg3NzQ3NiI+IkVmZWN0dW91IGluY29ycmVjdGFtZW50ZSBvIHNldSBwYWRyw6NvIGRlIGRlc2Jsb3F1ZWlvIDx4bGlmZjpnIGlkPSJOVU1CRVJfMCI+JWQ8L3hsaWZmOmc+IHZlemVzLiAiXG5cbiJUZW50ZSBub3ZhbWVudGUgZGVudHJvIGRlIDx4bGlmZjpnIGlkPSJOVU1CRVJfMSI+JWQ8L3hsaWZmOmc+IHNlZ3VuZG9zLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fdG9vX21hbnlfZmFpbGVkX3Bhc3N3b3JkX2F0dGVtcHRzX2RpYWxvZ19tZXNzYWdlIiBtc2dpZD0iNDkwNjAzNDM3NjQyNTE3NTM4MSI+IkludHJvZHV6aXUgaW5jb3JyZWN0YW1lbnRlIGEgcGFsYXZyYS1wYXNzZSA8eGxpZmY6ZyBpZD0iTlVNQkVSXzAiPiVkPC94bGlmZjpnPiB2ZXplcy4gIlxuXG4iVGVudGUgbm92YW1lbnRlIGRlbnRybyBkZSA8eGxpZmY6ZyBpZD0iTlVNQkVSXzEiPiVkPC94bGlmZjpnPiBzZWd1bmRvcy4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3Rvb19tYW55X2ZhaWxlZF9waW5fYXR0ZW1wdHNfZGlhbG9nX21lc3NhZ2UiIG1zZ2lkPSI2ODI3NzQ5MjMxNDY1MTQ1NTkwIj4iSW50cm9kdXppdSBpbmNvcnJlY3RhbWVudGUgbyBQSU4gPHhsaWZmOmcgaWQ9Ik5VTUJFUl8wIj4lZDwveGxpZmY6Zz4gdmV6ZXMuICJcblxuIlRlbnRlIG5vdmFtZW50ZSBkZW50cm8gZGUgPHhsaWZmOmcgaWQ9Ik5VTUJFUl8xIj4lZDwveGxpZmY6Zz4gc2VndW5kb3MuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9mYWlsZWRfYXR0ZW1wdHNfYWxtb3N0X2dsb2dpbiIgbXNnaWQ9IjMzNTEwMTM4NDIzMjAxMjc4MjciPiJFZmVjdHVvdSBpbmNvcnJlY3RhbWVudGUgbyBzZXUgcGFkcsOjbyBkZSBkZXNibG9xdWVpbyA8eGxpZmY6ZyBpZD0iTlVNQkVSXzAiPiVkPC94bGlmZjpnPiB2ZXplcy4gQXDDs3Mgb3V0cmFzIDx4bGlmZjpnIGlkPSJOVU1CRVJfMSI+JWQ8L3hsaWZmOmc+IHRlbnRhdGl2YXMgc2VtIHN1Y2Vzc28sIHNlci1saGUtw6EgcGVkaWRvIHBhcmEgZGVzYmxvcXVlYXIgbyB0ZWxlZm9uZSB1dGlsaXphbmRvIG8gc2V1IGluw61jaW8gZGUgc2Vzc8OjbyBubyBHb29nbGUuIlxuXG4iIFRlbnRlIG5vdmFtZW50ZSBkZW50cm8gZGUgPHhsaWZmOmcgaWQ9Ik5VTUJFUl8yIj4lZDwveGxpZmY6Zz4gc2VndW5kb3MuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl90b29fbWFueV9mYWlsZWRfYXR0ZW1wdHNfY291bnRkb3duIiBtc2dpZD0iNjI1MTQ4MDM0MzM5NDM4OTY2NSI+IlRlbnRlIG5vdmFtZW50ZSBkZW50cm8gZGUgPHhsaWZmOmcgaWQ9Ik5VTUJFUiI+JWQ8L3hsaWZmOmc+IHNlZ3VuZG9zLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fZm9yZ290X3BhdHRlcm5fYnV0dG9uX3RleHQiIG1zZ2lkPSIyNjI2OTk5NDQ5NjEwNjk1OTMwIj4iRXNxdWVjZXUtc2UgZG8gcGFkcsOjbz8iPC9zdHJpbmc+CkBAIC02OTksMTQgKzcwNSwxNCBAQAogICAgIDxzdHJpbmcgbmFtZT0iZWxhcHNlZF90aW1lX3Nob3J0X2Zvcm1hdF9tbV9zcyIgbXNnaWQ9IjQ0MzE1NTU5NDM4Mjg3MTE0NzMiPiI8eGxpZmY6ZyBpZD0iTUlOVVRFUyI+JTEkMDJkPC94bGlmZjpnPjo8eGxpZmY6ZyBpZD0iU0VDT05EUyI+JTIkMDJkPC94bGlmZjpnPiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImVsYXBzZWRfdGltZV9zaG9ydF9mb3JtYXRfaF9tbV9zcyIgbXNnaWQ9IjE4NDYwNzE5OTc2MTY2NTQxMjQiPiI8eGxpZmY6ZyBpZD0iSE9VUlMiPiUxJGQ8L3hsaWZmOmc+Ojx4bGlmZjpnIGlkPSJNSU5VVEVTIj4lMiQwMmQ8L3hsaWZmOmc+Ojx4bGlmZjpnIGlkPSJTRUNPTkRTIj4lMyQwMmQ8L3hsaWZmOmc+Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ic2VsZWN0QWxsIiBtc2dpZD0iNjg3NjUxODkyNTg0NDEyOTMzMSI+IlNlbGVjY2lvbmFyIHR1ZG8iPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiAzODg5MTQ5MTIzNjI2ODg4NjM3IC0tPiAgICAgPHN0cmluZyBuYW1lPSJzZWxlY3RUZXh0IiBtc2dpZD0iNDg2MjM1OTMxMTA4ODg5ODg3OCI+IlNlbGVjY2lvbmFyIHRleHRvIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iY3V0IiBtc2dpZD0iMzA5MjU2OTQwODQzODYyNjI2MSI+IkNvcnRhciI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImNvcHkiIG1zZ2lkPSIyNjgxOTQ2MjI5NTMzNTExOTg3Ij4iQ29waWFyIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGFzdGUiIG1zZ2lkPSI1NjI5ODgwODM2ODA1MDM2NDMzIj4iQ29sYXIiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJjb3B5VXJsIiBtc2dpZD0iMjUzODIxMTU3OTU5NjA2NzQwMiI+IkNvcGlhciBVUkwiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJzZWxlY3RUZXh0TW9kZSIgbXNnaWQ9IjY3Mzg1NTYzNDg4NjEzNDcyNDAiPiJTZWxlY2Npb25hciB0ZXh0by4uLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InRleHRTZWxlY3Rpb25DQUJUaXRsZSIgbXNnaWQ9IjUyMzY4NTAzOTQzNzA4MjAzNTciPiJTZWxlY8Onw6NvIGRlIHRleHRvIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iaW5wdXRNZXRob2QiIG1zZ2lkPSIxNjUzNjMwMDYyMzA0NTY3ODc5Ij4iTcOpdG9kbyBkZSBlbnRyYWRhIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iYWRkVG9EaWN0aW9uYXJ5IiBtc2dpZD0iODc5MzYyNDk5MTY4Njk0ODcwOSI+IkFkaWNpb25hciBcIjx4bGlmZjpnIGlkPSJXT1JEIj4lczwveGxpZmY6Zz5cIiBhbyBkaWNpb27DoXJpbyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImVkaXRUZXh0TWVudVRpdGxlIiBtc2dpZD0iMTY3Mjk4OTE3Njk1ODU4MTQ1MiI+IkVkaXRhciB0ZXh0byI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImVkaXRUZXh0TWVudVRpdGxlIiBtc2dpZD0iNDkwOTEzNTU2NDk0MTgxNTQ5NCI+IkFjw6fDtWVzIGRlIHRleHRvIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG93X2ludGVybmFsX3N0b3JhZ2Vfdmlld190aXRsZSIgbXNnaWQ9IjEzOTk3MzI0MDg3MDE2OTc1NDYiPiJQb3VjbyBlc3Bhw6dvIGxpdnJlIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG93X2ludGVybmFsX3N0b3JhZ2Vfdmlld190ZXh0IiBtc2dpZD0iNjM1MTA2NTQ0NjE2Mzc4ODM2Ij4iTyBlc3Bhw6dvIGRlIGFybWF6ZW5hbWVudG8gZG8gdGVsZWZvbmUgZXN0w6EgYSBmaWNhciByZWR1emlkby4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJvayIgbXNnaWQ9IjU5NzAwNjA0MzA1NjI1MjQ5MTAiPiJPSyI8L3N0cmluZz4KQEAgLTcxNCw2ICs3MjAsNyBAQAogICAgIDxzdHJpbmcgbmFtZT0ieWVzIiBtc2dpZD0iNTM2Mjk4MjMwMzMzNzk2OTMxMiI+Ik9LIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibm8iIG1zZ2lkPSI1MTQxNTMxMDQ0OTM1NTQxNDk3Ij4iQ2FuY2VsYXIiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJkaWFsb2dfYWxlcnRfdGl0bGUiIG1zZ2lkPSIyMDQ5NjU4NzA4NjA5MDQzMTAzIj4iQXRlbsOnw6NvIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibG9hZGluZyIgbXNnaWQ9IjE3NjA3MjQ5OTg5MjgyNTUyNTAiPiJBIGNhcnJlZ2FyLi4uIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iY2FwaXRhbF9vbiIgbXNnaWQ9IjE1NDQ2ODI3NTU1MTQ0OTQyOTgiPiJBY3RpdmFkbyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImNhcGl0YWxfb2ZmIiBtc2dpZD0iNjgxNTg3MDM4Njk3MjgwNTgzMiI+IkRlc2FjdGl2YXIiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ3aGljaEFwcGxpY2F0aW9uIiBtc2dpZD0iNDUzMzE4NTk0NzA2NDc3MzM4NiI+IkNvbmNsdWlyIGFjw6fDo28gdXRpbGl6YW5kbyI8L3N0cmluZz4KQEAgLTg1NCwxNSArODYxLDI0IEBACiAgICAgPHN0cmluZyBuYW1lPSJsMnRwX2lwc2VjX3Bza192cG5fZGVzY3JpcHRpb24iIG1zZ2lkPSIzOTQ1MDQzNTY0MDA4MzAzMjM5Ij4iVlBOIEwyVFAvSVBTZWMgYmFzZWFkYSBlbSBjaGF2ZSBwcsOpLSBwYXJ0aWxoYWRhIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibDJ0cF9pcHNlY19jcnRfdnBuX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNTM4MjcxNDA3MzEwMzY1MzU3NyI+IlZQTiBMMlRQL0lQU2VjIGJhc2VhZGEgZW0gY2VydGlmaWNhZG8iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ1cGxvYWRfZmlsZSIgbXNnaWQ9IjI4OTc5NTcxNzIzNjY3MzA0MTYiPiJFc2NvbGhlciBmaWNoZWlybyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im5vX2ZpbGVfY2hvc2VuIiBtc2dpZD0iNjM2MzY0ODU2MjE3MDc1OTQ2NSI+Ik7Do28gZm9pIHNlbGVjY2lvbmFkbyBuZW5odW0gZmljaGVpcm8iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJyZXNldCIgbXNnaWQ9IjI0NDgxNjgwODA5NjQyMDk5MDgiPiJSZXBvciI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InN1Ym1pdCIgbXNnaWQ9IjE2MDIzMzU1NzIwODk5MTE5NDEiPiJFbnZpYXIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJkZXNjcmlwdGlvbl9zdGFyIiBtc2dpZD0iMjY1NDMxOTg3NDkwODU3NjEzMyI+ImZhdm9yaXRvIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iY2FyX21vZGVfZGlzYWJsZV9ub3RpZmljYXRpb25fdGl0bGUiIG1zZ2lkPSIzMTY0NzY4MjEyMDAzODY0MzE2Ij4iTW9kbyBhdXRvbcOzdmVsIGFjdGl2YWRvIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iY2FyX21vZGVfZGlzYWJsZV9ub3RpZmljYXRpb25fbWVzc2FnZSIgbXNnaWQ9IjY2ODY2MzYyNjcyMTY3NTYxNCI+IlNlbGVjY2lvbmFyIHBhcmEgc2FpciBkbyBtb2RvIGF1dG9tw7N2ZWwuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idGV0aGVyZWRfbm90aWZpY2F0aW9uX3RpdGxlIiBtc2dpZD0iMzE0NjY5NDIzNDM5ODIwMjYwMSI+IkxpZ2HDp8OjbyBwb250byBhIHBvbnRvIG91IGhvdHNwb3QgYWN0aXZvcyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InRldGhlcmVkX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBtc2dpZD0iMzA2NzEwODMyMzkwMzA0ODkyNyI+IlRvY2FyIHBhcmEgY29uZmlndXJhciI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImJhY2tfYnV0dG9uX2xhYmVsIiBtc2dpZD0iMjMwMDQ3MDAwNDUwMzM0MzQzOSI+IkFudGVyaW9yIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibmV4dF9idXR0b25fbGFiZWwiIG1zZ2lkPSIxMDgwNTU1MTA0Njc3OTkyNDA4Ij4iU2VndWludGUiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJza2lwX2J1dHRvbl9sYWJlbCIgbXNnaWQ9IjEyNzUzNjIyOTk0NzE2MzE4MTkiPiJJZ25vcmFyIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idGhyb3R0bGVfd2FybmluZ19ub3RpZmljYXRpb25fdGl0bGUiIG1zZ2lkPSI0ODkwODk0MjY3NDU0ODY3Mjc2Ij4iVXRpbGl6YcOnw6NvIGVsZXZhZGEgZGUgZGFkb3MgbcOzdmVpcyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InRocm90dGxlX3dhcm5pbmdfbm90aWZpY2F0aW9uX21lc3NhZ2UiIG1zZ2lkPSIyNjA5NzM0NzYzODQ1NzA1NzA4Ij4iVG9xdWUgcGFyYSBzYWJlciBtYWlzIHNvYnJlIGEgdXRpbGl6YcOnw6NvIGRlIGRhZG9zIG3Ds3ZlaXMiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ0aHJvdHRsZWRfbm90aWZpY2F0aW9uX3RpdGxlIiBtc2dpZD0iNjI2OTU0MTg5NzcyOTc4MTMzMiI+IkxpbWl0ZSBkZSBkYWRvcyBtw7N2ZWlzIGV4Y2VkaWRvIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idGhyb3R0bGVkX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBtc2dpZD0iNDcxMjM2OTg1NjYwMTI3NTE0NiI+IlRvcXVlIHBhcmEgc2FiZXIgbWFpcyBzb2JyZSBhIHV0aWxpemHDp8OjbyBkZSBkYWRvcyBtw7N2ZWlzIjwvc3RyaW5nPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIG5vX21hdGNoZXMgKDgxMjk0MjE5MDg5MTU4NDA3MzcpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgZmluZF9vbl9wYWdlICgxOTQ2Nzk5MjMzODIyODIwMzg0KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIG1hdGNoZXNfZm91bmQ6b25lICg4MTY3MTQ3MDgxMTM2NTc5NDM5KSAtLT4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBtYXRjaGVzX2ZvdW5kOm90aGVyICg0NjQxODcyNzk3MDY3NjA5MTc3KSAtLT4KIDwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL3ZhbHVlcy1wdC9zdHJpbmdzLnhtbCBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMtcHQvc3RyaW5ncy54bWwKaW5kZXggN2NjMjY2YS4uMWVjMTM0NiAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL3ZhbHVlcy1wdC9zdHJpbmdzLnhtbAorKysgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzLXB0L3N0cmluZ3MueG1sCkBAIC00MzIsNiArNDMyLDEwIEBACiAgICAgPHN0cmluZyBuYW1lPSJwb2xpY3lkZXNjX2ZvcmNlTG9jayIgbXNnaWQ9IjI4MTk4Njg2NjQ5NDYwODk3NDAiPiJDb250cm9sYSBvIGJsb3F1ZWlvIGRvIGFwYXJlbGhvLCBleGlnaW5kbyBxdWUgYSBzZW5oYSBzZWphIGRpZ2l0YWRhIG5vdmFtZW50ZS4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwb2xpY3lsYWJfd2lwZURhdGEiIG1zZ2lkPSIzOTEwNTQ1NDQ2NzU4NjM5NzEzIj4iQXBhZ2FyIHRvZG9zIG9zIGRhZG9zIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icG9saWN5ZGVzY193aXBlRGF0YSIgbXNnaWQ9IjIzMTQwNjA5MzM3OTYzOTYyMDUiPiJFeGVjdXRlIHVtYSByZWRlZmluacOnw6NvIGRlIGbDoWJyaWNhLCBleGNsdWluZG8gdG9kb3Mgb3Mgc2V1cyBkYWRvcyBzZW0gcXVhbHF1ZXIgY29uZmlybWHDp8Ojby4iPC9zdHJpbmc+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcG9saWN5bGFiX3NldEdsb2JhbFByb3h5ICgyNzg0ODI4MjkzNzQ3NzkxNDQ2KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBvbGljeWRlc2Nfc2V0R2xvYmFsUHJveHkgKDYzODc0OTc0NjY2NjAxNTQ5MzEpIC0tPgorICAgIDxza2lwIC8+CiAgIDxzdHJpbmctYXJyYXkgbmFtZT0icGhvbmVUeXBlcyI+CiAgICAgPGl0ZW0gbXNnaWQ9Ijg5MDEwOTgzMzY2NTg3MTAzNTkiPiJSZXNpZGVuY2lhbCI8L2l0ZW0+CiAgICAgPGl0ZW0gbXNnaWQ9Ijg2OTkyMzY1MDUyNzEzNjYxNSI+IkNlbHVsYXIiPC9pdGVtPgpAQCAtNTI1LDEwICs1MjksOSBAQAogICAgIDxzdHJpbmcgbmFtZT0ib3JnVHlwZVdvcmsiIG1zZ2lkPSIyOTI2ODg3MDUwNTM2Mzg3MiI+IkNvbWVyY2lhbCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9Im9yZ1R5cGVPdGhlciIgbXNnaWQ9IjM5NTE3ODExMzE1NzAxMjQwODIiPiJPdXRyb3MiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJvcmdUeXBlQ3VzdG9tIiBtc2dpZD0iMjI1NTIzNDE1MzcyMDg4MzIyIj4iUGVyc29uYWxpemFkbyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImNvbnRhY3Rfc3RhdHVzX3VwZGF0ZV9hdHRyaWJ1dGlvbiIgbXNnaWQ9IjUxMTI1ODk4ODYwOTQ0MDI3OTUiPiJwb3IgbWVpbyBkZSA8eGxpZmY6ZyBpZD0iU09VUkNFIj4lMSRzPC94bGlmZjpnPiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImNvbnRhY3Rfc3RhdHVzX3VwZGF0ZV9hdHRyaWJ1dGlvbl93aXRoX2RhdGUiIG1zZ2lkPSI1OTQ1Mzg2Mzc2MzY5OTc5OTA5Ij4iPHhsaWZmOmcgaWQ9IkRBVEUiPiUxJHM8L3hsaWZmOmc+IHZpYSA8eGxpZmY6ZyBpZD0iU09VUkNFIj4lMiRzPC94bGlmZjpnPiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImtleWd1YXJkX3Bhc3N3b3JkX2VudGVyX3Bpbl9jb2RlIiBtc2dpZD0iMzczMTQ4ODgyNzIxODg3NjExNSI+IkRpZ2l0ZSBvIGPDs2RpZ28gUElOIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ia2V5Z3VhcmRfcGFzc3dvcmRfZW50ZXJfcGFzc3dvcmRfY29kZSIgbXNnaWQ9IjkxMzgxNTgzNDQ4MTMyMTM3NTQiPiJEaWdpdGUgYSBzZW5oYSBwYXJhIGRlc2Jsb3F1ZWFyIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ia2V5Z3VhcmRfcGFzc3dvcmRfZW50ZXJfcGluX3Bhc3N3b3JkX2NvZGUiIG1zZ2lkPSI2MzgzNDcwNzU2MjU0OTE1MTQiPiJEaWdpdGUgbyBQSU4gcGFyYSBkZXNibG9xdWVhciI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImtleWd1YXJkX3Bhc3N3b3JkX3dyb25nX3Bpbl9jb2RlIiBtc2dpZD0iMTI5NTk4NDExNDMzODEwNzcxOCI+IkPDs2RpZ28gUElOIGluY29ycmV0byEiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJrZXlndWFyZF9sYWJlbF90ZXh0IiBtc2dpZD0iODYxNzk2NDYxMDI4Mjk4NDI0Ij4iUGFyYSBkZXNibG9xdWVhciwgcHJlc3Npb25lIE1lbnUgZSwgZW0gc2VndWlkYSwgMC4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJlbWVyZ2VuY3lfY2FsbF9kaWFsb2dfbnVtYmVyX2Zvcl9kaXNwbGF5IiBtc2dpZD0iNjk2MTkyMTAzMTk1MDkwOTcwIj4iTsO6bWVybyBkZSBlbWVyZ8OqbmNpYSI8L3N0cmluZz4KQEAgLTU0MSw2ICs1NDQsNyBAQAogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9yZXR1cm5fdG9fY2FsbCIgbXNnaWQ9IjUyNDQyNTk3ODU1MDAwNDAwMjEiPiJSZXRvcm5hciDDoCBjaGFtYWRhIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9wYXR0ZXJuX2NvcnJlY3QiIG1zZ2lkPSI5MDM5MDA4NjUwMzYyMjYxMjM3Ij4iQ29ycmV0byEiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3BhdHRlcm5fd3JvbmciIG1zZ2lkPSI0ODE3NTgzMjc5MDUzMTEyMzEyIj4iVGVudGUgbm92YW1lbnRlIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9wYXNzd29yZF93cm9uZyIgbXNnaWQ9IjYyMzc0NDM2NTczNTgxNjg4MTkiPiJUZW50ZSBub3ZhbWVudGUiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3BsdWdnZWRfaW4iIG1zZ2lkPSI2MTMzNDM4NTI4NDI5NDQ0MzUiPiJDYXJyZWdhbmRvICg8eGxpZmY6ZyBpZD0iTlVNQkVSIj4lZDwveGxpZmY6Zz48eGxpZmY6ZyBpZD0iUEVSQ0VOVCI+JSU8L3hsaWZmOmc+KSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fY2hhcmdlZCIgbXNnaWQ9IjQ5Mzg5MzA0NTk2MjA5ODk5NzIiPiJDYXJyZWdhZG8uIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9iYXR0ZXJ5X3Nob3J0IiBtc2dpZD0iMzYxNzU0OTE3ODYwMzM1NDY1NiI+Ijx4bGlmZjpnIGlkPSJOVU1CRVIiPiVkPC94bGlmZjpnPjx4bGlmZjpnIGlkPSJQRVJDRU5UIj4lJTwveGxpZmY6Zz4iPC9zdHJpbmc+CkBAIC01NTUsNiArNTU5LDggQEAKICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fc2ltX2xvY2tlZF9tZXNzYWdlIiBtc2dpZD0iODA2NjY2MDEyOTIwNjAwMTAzOSI+Ik8gY2FydMOjbyBTSU0gZXN0w6EgYmxvcXVlYWRvLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fc2ltX3VubG9ja19wcm9ncmVzc19kaWFsb2dfbWVzc2FnZSIgbXNnaWQ9IjU5NTMyMzIxNDA1Mjg4MTI2NCI+IkRlc2Jsb3F1ZWFuZG8gbyBjYXJ0w6NvIFNJTeKApiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fdG9vX21hbnlfZmFpbGVkX2F0dGVtcHRzX2RpYWxvZ19tZXNzYWdlIiBtc2dpZD0iMzUxNDc0MjEwNjA2Njg3NzQ3NiI+IlZvY8OqIGRlc2VuaG91IGluY29ycmV0YW1lbnRlIG8gc2V1IHBhZHLDo28gZGUgZGVzYmxvcXVlaW8gPHhsaWZmOmcgaWQ9Ik5VTUJFUl8wIj4lZDwveGxpZmY6Zz4gdmV6ZXMuICJcblxuIlRlbnRlIG5vdmFtZW50ZSBlbSA8eGxpZmY6ZyBpZD0iTlVNQkVSXzEiPiVkPC94bGlmZjpnPiBzZWd1bmRvcy4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3Rvb19tYW55X2ZhaWxlZF9wYXNzd29yZF9hdHRlbXB0c19kaWFsb2dfbWVzc2FnZSIgbXNnaWQ9IjQ5MDYwMzQzNzY0MjUxNzUzODEiPiJWb2PDqiBpbnNlcml1IGluY29ycmV0YW1lbnRlIGEgc3VhIHNlbmhhIDx4bGlmZjpnIGlkPSJOVU1CRVJfMCI+JWQ8L3hsaWZmOmc+IHZlemVzLiAiXG5cbiJUZW50ZSBub3ZhbWVudGUgZW0gPHhsaWZmOmcgaWQ9Ik5VTUJFUl8xIj4lZDwveGxpZmY6Zz4gc2VndW5kb3MuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl90b29fbWFueV9mYWlsZWRfcGluX2F0dGVtcHRzX2RpYWxvZ19tZXNzYWdlIiBtc2dpZD0iNjgyNzc0OTIzMTQ2NTE0NTU5MCI+IlZvY8OqIGRpZ2l0b3UgaW5jb3JyZXRhbWVudGUgbyBzZXUgUElOIDx4bGlmZjpnIGlkPSJOVU1CRVJfMCI+JWQ8L3hsaWZmOmc+IHZlemVzLiAiXG5cbiJUZW50ZSBub3ZhbWVudGUgZW0gPHhsaWZmOmcgaWQ9Ik5VTUJFUl8xIj4lZDwveGxpZmY6Zz4gc2VndW5kb3MuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9mYWlsZWRfYXR0ZW1wdHNfYWxtb3N0X2dsb2dpbiIgbXNnaWQ9IjMzNTEwMTM4NDIzMjAxMjc4MjciPiJWb2PDqiBkZXNlbmhvdSBvIHNldSBwYWRyw6NvIGRlIGRlc2Jsb3F1ZWlvIGluY29ycmV0YW1lbnRlIDx4bGlmZjpnIGlkPSJOVU1CRVJfMCI+JWQ8L3hsaWZmOmc+IHZlemVzLiBNYWlzIDx4bGlmZjpnIGlkPSJOVU1CRVJfMSI+JWQ8L3hsaWZmOmc+IHRlbnRhdGl2YXMgaW5jb3JyZXRhcyBlIHZvY8OqIHJlY2ViZXLDoSB1bWEgc29saWNpdGHDp8OjbyBwYXJhIGRlc2Jsb3F1ZWFyIG8gc2V1IHRlbGVmb25lIHVzYW5kbyBvIHNldSBsb2dpbiBkbyBHb29nbGUuIlxuXG4iIFRlbnRlIG5vdmFtZW50ZSBlbSA8eGxpZmY6ZyBpZD0iTlVNQkVSXzIiPiVkPC94bGlmZjpnPiBzZWd1bmRvcy4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3Rvb19tYW55X2ZhaWxlZF9hdHRlbXB0c19jb3VudGRvd24iIG1zZ2lkPSI2MjUxNDgwMzQzMzk0Mzg5NjY1Ij4iVGVudGUgbm92YW1lbnRlIGVtIDx4bGlmZjpnIGlkPSJOVU1CRVIiPiVkPC94bGlmZjpnPiBzZWd1bmRvcy4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX2ZvcmdvdF9wYXR0ZXJuX2J1dHRvbl90ZXh0IiBtc2dpZD0iMjYyNjk5OTQ0OTYxMDY5NTkzMCI+IkVzcXVlY2V1IG8gcGFkcsOjbz8iPC9zdHJpbmc+CkBAIC02OTksMTQgKzcwNSwxNCBAQAogICAgIDxzdHJpbmcgbmFtZT0iZWxhcHNlZF90aW1lX3Nob3J0X2Zvcm1hdF9tbV9zcyIgbXNnaWQ9IjQ0MzE1NTU5NDM4Mjg3MTE0NzMiPiI8eGxpZmY6ZyBpZD0iTUlOVVRFUyI+JTEkMDJkPC94bGlmZjpnPjo8eGxpZmY6ZyBpZD0iU0VDT05EUyI+JTIkMDJkPC94bGlmZjpnPiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImVsYXBzZWRfdGltZV9zaG9ydF9mb3JtYXRfaF9tbV9zcyIgbXNnaWQ9IjE4NDYwNzE5OTc2MTY2NTQxMjQiPiI8eGxpZmY6ZyBpZD0iSE9VUlMiPiUxJGQ8L3hsaWZmOmc+Ojx4bGlmZjpnIGlkPSJNSU5VVEVTIj4lMiQwMmQ8L3hsaWZmOmc+Ojx4bGlmZjpnIGlkPSJTRUNPTkRTIj4lMyQwMmQ8L3hsaWZmOmc+Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ic2VsZWN0QWxsIiBtc2dpZD0iNjg3NjUxODkyNTg0NDEyOTMzMSI+IlNlbGVjaW9uYXIgdHVkbyI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDM4ODkxNDkxMjM2MjY4ODg2MzcgLS0+ICAgICA8c3RyaW5nIG5hbWU9InNlbGVjdFRleHQiIG1zZ2lkPSI0ODYyMzU5MzExMDg4ODk4ODc4Ij4iU2VsZWNpb25hciB0ZXh0byI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImN1dCIgbXNnaWQ9IjMwOTI1Njk0MDg0Mzg2MjYyNjEiPiJSZWNvcnRhciI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImNvcHkiIG1zZ2lkPSIyNjgxOTQ2MjI5NTMzNTExOTg3Ij4iQ29waWFyIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGFzdGUiIG1zZ2lkPSI1NjI5ODgwODM2ODA1MDM2NDMzIj4iQ29sYXIiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJjb3B5VXJsIiBtc2dpZD0iMjUzODIxMTU3OTU5NjA2NzQwMiI+IkNvcGlhciBVUkwiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJzZWxlY3RUZXh0TW9kZSIgbXNnaWQ9IjY3Mzg1NTYzNDg4NjEzNDcyNDAiPiJTZWxlY2lvbmFyIHRleHRvLi4uIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0idGV4dFNlbGVjdGlvbkNBQlRpdGxlIiBtc2dpZD0iNTIzNjg1MDM5NDM3MDgyMDM1NyI+IlNlbGXDp8OjbyBkZSB0ZXh0byI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImlucHV0TWV0aG9kIiBtc2dpZD0iMTY1MzYzMDA2MjMwNDU2Nzg3OSI+Ik3DqXRvZG8gZGUgZW50cmFkYSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImFkZFRvRGljdGlvbmFyeSIgbXNnaWQ9Ijg3OTM2MjQ5OTE2ODY5NDg3MDkiPiJBZGljaW9uYXIgXCI8eGxpZmY6ZyBpZD0iV09SRCI+JXM8L3hsaWZmOmc+XCIgYW8gZGljaW9uw6FyaW8iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJlZGl0VGV4dE1lbnVUaXRsZSIgbXNnaWQ9IjE2NzI5ODkxNzY5NTg1ODE0NTIiPiJFZGl0YXIgdGV4dG8iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJlZGl0VGV4dE1lbnVUaXRsZSIgbXNnaWQ9IjQ5MDkxMzU1NjQ5NDE4MTU0OTQiPiJBw6fDtWVzIGRlIHRleHRvIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG93X2ludGVybmFsX3N0b3JhZ2Vfdmlld190aXRsZSIgbXNnaWQ9IjEzOTk3MzI0MDg3MDE2OTc1NDYiPiJQb3VjbyBlc3Bhw6dvIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG93X2ludGVybmFsX3N0b3JhZ2Vfdmlld190ZXh0IiBtc2dpZD0iNjM1MTA2NTQ0NjE2Mzc4ODM2Ij4iTyBlc3Bhw6dvIGRlIGFybWF6ZW5hbWVudG8gZG8gdGVsZWZvbmUgZXN0w6EgZmljYW5kbyBiYWl4by4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJvayIgbXNnaWQ9IjU5NzAwNjA0MzA1NjI1MjQ5MTAiPiJPSyI8L3N0cmluZz4KQEAgLTcxNCw2ICs3MjAsNyBAQAogICAgIDxzdHJpbmcgbmFtZT0ieWVzIiBtc2dpZD0iNTM2Mjk4MjMwMzMzNzk2OTMxMiI+Ik9LIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibm8iIG1zZ2lkPSI1MTQxNTMxMDQ0OTM1NTQxNDk3Ij4iQ2FuY2VsYXIiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJkaWFsb2dfYWxlcnRfdGl0bGUiIG1zZ2lkPSIyMDQ5NjU4NzA4NjA5MDQzMTAzIj4iQXRlbsOnw6NvIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibG9hZGluZyIgbXNnaWQ9IjE3NjA3MjQ5OTg5MjgyNTUyNTAiPiJDYXJyZWdhbmRvLi4uIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iY2FwaXRhbF9vbiIgbXNnaWQ9IjE1NDQ2ODI3NTU1MTQ0OTQyOTgiPiJBVElWQURPIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iY2FwaXRhbF9vZmYiIG1zZ2lkPSI2ODE1ODcwMzg2OTcyODA1ODMyIj4iREVTQVRJVkFETyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9IndoaWNoQXBwbGljYXRpb24iIG1zZ2lkPSI0NTMzMTg1OTQ3MDY0NzczMzg2Ij4iQ29tcGxldGUgYSBhw6fDo28gdXNhbmRvIjwvc3RyaW5nPgpAQCAtODU0LDE1ICs4NjEsMjQgQEAKICAgICA8c3RyaW5nIG5hbWU9ImwydHBfaXBzZWNfcHNrX3Zwbl9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM5NDUwNDM1NjQwMDgzMDMyMzkiPiJWUE4gTDJUUC9JUFNlYyBjb20gYmFzZSBlbSBjaGF2ZSBwcsOpLWNvbXBhcnRpbGhhZGEiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsMnRwX2lwc2VjX2NydF92cG5fZGVzY3JpcHRpb24iIG1zZ2lkPSI1MzgyNzE0MDczMTAzNjUzNTc3Ij4iVlBOIEwyVFAvSVBTZWMgY29tIGJhc2UgZW0gY2VydGlmaWNhZG8iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ1cGxvYWRfZmlsZSIgbXNnaWQ9IjI4OTc5NTcxNzIzNjY3MzA0MTYiPiJFc2NvbGhlciBhcnF1aXZvIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibm9fZmlsZV9jaG9zZW4iIG1zZ2lkPSI2MzYzNjQ4NTYyMTcwNzU5NDY1Ij4iTmVuaHVtIGFycXVpdm8gZXNjb2xoaWRvIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icmVzZXQiIG1zZ2lkPSIyNDQ4MTY4MDgwOTY0MjA5OTA4Ij4iUmVkZWZpbmlyIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ic3VibWl0IiBtc2dpZD0iMTYwMjMzNTU3MjA4OTkxMTk0MSI+IkVudmlhciI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImRlc2NyaXB0aW9uX3N0YXIiIG1zZ2lkPSIyNjU0MzE5ODc0OTA4NTc2MTMzIj4iZmF2b3JpdG8iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJjYXJfbW9kZV9kaXNhYmxlX25vdGlmaWNhdGlvbl90aXRsZSIgbXNnaWQ9IjMxNjQ3NjgyMTIwMDM4NjQzMTYiPiJNb2RvIGRlIGNhcnJvIGF0aXZhZG8iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJjYXJfbW9kZV9kaXNhYmxlX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBtc2dpZD0iNjY4NjYzNjI2NzIxNjc1NjE0Ij4iU2VsZWNpb25lIHBhcmEgc2FpciBkbyBtb2RvIGRlIGNhcnJvLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InRldGhlcmVkX25vdGlmaWNhdGlvbl90aXRsZSIgbXNnaWQ9IjMxNDY2OTQyMzQzOTgyMDI2MDEiPiJWw61uY3VsbyBvdSBwb250byBkZSBhY2Vzc28gYXRpdm8iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ0ZXRoZXJlZF9ub3RpZmljYXRpb25fbWVzc2FnZSIgbXNnaWQ9IjMwNjcxMDgzMjM5MDMwNDg5MjciPiJUb3F1ZSBwYXJhIGNvbmZpZ3VyYXIiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJiYWNrX2J1dHRvbl9sYWJlbCIgbXNnaWQ9IjIzMDA0NzAwMDQ1MDMzNDM0MzkiPiJWb2x0YXIiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJuZXh0X2J1dHRvbl9sYWJlbCIgbXNnaWQ9IjEwODA1NTUxMDQ2Nzc5OTI0MDgiPiJBdmFuw6dhciI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InNraXBfYnV0dG9uX2xhYmVsIiBtc2dpZD0iMTI3NTM2MjI5OTQ3MTYzMTgxOSI+Iklnbm9yYXIiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ0aHJvdHRsZV93YXJuaW5nX25vdGlmaWNhdGlvbl90aXRsZSIgbXNnaWQ9IjQ4OTA4OTQyNjc0NTQ4NjcyNzYiPiJBbHRvIHVzbyBkZSBkYWRvcyBkbyBjZWx1bGFyIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idGhyb3R0bGVfd2FybmluZ19ub3RpZmljYXRpb25fbWVzc2FnZSIgbXNnaWQ9IjI2MDk3MzQ3NjM4NDU3MDU3MDgiPiJUb3F1ZSBwYXJhIHNhYmVyIG1haXMgc29icmUgdXNvIGRlIGRhZG9zIGRvIGNlbHVsYXIiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ0aHJvdHRsZWRfbm90aWZpY2F0aW9uX3RpdGxlIiBtc2dpZD0iNjI2OTU0MTg5NzcyOTc4MTMzMiI+IkxpbWl0ZSBkZSBkYWRvcyBkbyBjZWx1bGFyIGV4Y2VkaWRvIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idGhyb3R0bGVkX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBtc2dpZD0iNDcxMjM2OTg1NjYwMTI3NTE0NiI+IlRvcXVlIHBhcmEgc2FiZXIgbWFpcyBzb2JyZSBvIHVzbyBkZSBkYWRvcyBkbyBjZWx1bGFyIjwvc3RyaW5nPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIG5vX21hdGNoZXMgKDgxMjk0MjE5MDg5MTU4NDA3MzcpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgZmluZF9vbl9wYWdlICgxOTQ2Nzk5MjMzODIyODIwMzg0KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIG1hdGNoZXNfZm91bmQ6b25lICg4MTY3MTQ3MDgxMTM2NTc5NDM5KSAtLT4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBtYXRjaGVzX2ZvdW5kOm90aGVyICg0NjQxODcyNzk3MDY3NjA5MTc3KSAtLT4KIDwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL3ZhbHVlcy1ybS1yQ0gvYXJyYXlzLnhtbCBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMtcm0tckNIL2FycmF5cy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDhlODYxMwotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMtcm0tckNIL2FycmF5cy54bWwKQEAgLTAsMCArMSwzMiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0KKy8qIC8vZGV2aWNlL2FwcHMvY29tbW9uL2Fzc2V0cy9yZXMvYW55L2NvbG9ycy54bWwKKyoqCisqKiBDb3B5cmlnaHQgMjAxMCwgR29vZ2xlIEluYy4KKyoqCisqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgCisqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIAorKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0IAorKioKKyoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgCisqKgorKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZSAKKyoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIAorKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCAKKyoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKy0tPgorPHJlc291cmNlcz4KKworICAgIDwhLS0gRG8gbm90IHRyYW5zbGF0ZS4gLS0+CisgICAgPGludGVnZXItYXJyYXkgbmFtZT0ibWFwc19zdGFydGluZ19sYXRfbG5nIj4KKyAgICAgICAgPGl0ZW0+NDY5NDgwMjA8L2l0ZW0+CisgICAgICAgIDxpdGVtPjc0NDgyMDY8L2l0ZW0+CisgICAgPC9pbnRlZ2VyLWFycmF5PgorICAgIDwhLS0gRG8gbm90IHRyYW5zbGF0ZS4gLS0+CisgICAgPGludGVnZXItYXJyYXkgbmFtZT0ibWFwc19zdGFydGluZ196b29tIj4KKyAgICAgICAgPGl0ZW0+NDwvaXRlbT4KKyAgICA8L2ludGVnZXItYXJyYXk+CisKKzwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL3ZhbHVlcy1ybS9kb25vdHRyYW5zbGF0ZS1jbGRyLnhtbCBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMtcm0vZG9ub3R0cmFuc2xhdGUtY2xkci54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGI5ZjlkYgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMtcm0vZG9ub3R0cmFuc2xhdGUtY2xkci54bWwKQEAgLTAsMCArMSwxNjYgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+CisgICAgPHN0cmluZyBuYW1lPSJtb250aF9sb25nX3N0YW5kYWxvbmVfamFudWFyeSI+c2NoYW5lcjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibW9udGhfbG9uZ19zdGFuZGFsb25lX2ZlYnJ1YXJ5Ij5mYXZyZXI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1vbnRoX2xvbmdfc3RhbmRhbG9uZV9tYXJjaCI+bWFyczwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibW9udGhfbG9uZ19zdGFuZGFsb25lX2FwcmlsIj5hdnJpZ2w8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1vbnRoX2xvbmdfc3RhbmRhbG9uZV9tYXkiPm1hdGc8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1vbnRoX2xvbmdfc3RhbmRhbG9uZV9qdW5lIj56ZXJjbGFkdXI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1vbnRoX2xvbmdfc3RhbmRhbG9uZV9qdWx5Ij5mYW5hZHVyPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtb250aF9sb25nX3N0YW5kYWxvbmVfYXVndXN0Ij5hdnVzdDwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibW9udGhfbG9uZ19zdGFuZGFsb25lX3NlcHRlbWJlciI+c2V0dGVtYmVyPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtb250aF9sb25nX3N0YW5kYWxvbmVfb2N0b2JlciI+b2N0b2Jlcjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibW9udGhfbG9uZ19zdGFuZGFsb25lX25vdmVtYmVyIj5ub3ZlbWJlcjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibW9udGhfbG9uZ19zdGFuZGFsb25lX2RlY2VtYmVyIj5kZWNlbWJlcjwvc3RyaW5nPgorCisgICAgPHN0cmluZyBuYW1lPSJtb250aF9sb25nX2phbnVhcnkiPnNjaGFuZXI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1vbnRoX2xvbmdfZmVicnVhcnkiPmZhdnJlcjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibW9udGhfbG9uZ19tYXJjaCI+bWFyczwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibW9udGhfbG9uZ19hcHJpbCI+YXZyaWdsPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtb250aF9sb25nX21heSI+bWF0Zzwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibW9udGhfbG9uZ19qdW5lIj56ZXJjbGFkdXI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1vbnRoX2xvbmdfanVseSI+ZmFuYWR1cjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibW9udGhfbG9uZ19hdWd1c3QiPmF2dXN0PC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtb250aF9sb25nX3NlcHRlbWJlciI+c2V0dGVtYmVyPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtb250aF9sb25nX29jdG9iZXIiPm9jdG9iZXI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1vbnRoX2xvbmdfbm92ZW1iZXIiPm5vdmVtYmVyPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtb250aF9sb25nX2RlY2VtYmVyIj5kZWNlbWJlcjwvc3RyaW5nPgorCisgICAgPHN0cmluZyBuYW1lPSJtb250aF9tZWRpdW1famFudWFyeSI+c2NoYW4uPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtb250aF9tZWRpdW1fZmVicnVhcnkiPmZhdnIuPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtb250aF9tZWRpdW1fbWFyY2giPm1hcnM8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1vbnRoX21lZGl1bV9hcHJpbCI+YXZyLjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibW9udGhfbWVkaXVtX21heSI+bWF0Zzwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibW9udGhfbWVkaXVtX2p1bmUiPnplcmNsLjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibW9udGhfbWVkaXVtX2p1bHkiPmZhbi48L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1vbnRoX21lZGl1bV9hdWd1c3QiPmF2dXN0PC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtb250aF9tZWRpdW1fc2VwdGVtYmVyIj5zZXR0Ljwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibW9udGhfbWVkaXVtX29jdG9iZXIiPm9jdC48L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1vbnRoX21lZGl1bV9ub3ZlbWJlciI+bm92Ljwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibW9udGhfbWVkaXVtX2RlY2VtYmVyIj5kZWMuPC9zdHJpbmc+CisKKyAgICA8c3RyaW5nIG5hbWU9Im1vbnRoX3Nob3J0ZXN0X2phbnVhcnkiPlM8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1vbnRoX3Nob3J0ZXN0X2ZlYnJ1YXJ5Ij5GPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtb250aF9zaG9ydGVzdF9tYXJjaCI+TTwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibW9udGhfc2hvcnRlc3RfYXByaWwiPkE8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1vbnRoX3Nob3J0ZXN0X21heSI+TTwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibW9udGhfc2hvcnRlc3RfanVuZSI+Wjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibW9udGhfc2hvcnRlc3RfanVseSI+Rjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibW9udGhfc2hvcnRlc3RfYXVndXN0Ij5BPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtb250aF9zaG9ydGVzdF9zZXB0ZW1iZXIiPlM8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1vbnRoX3Nob3J0ZXN0X29jdG9iZXIiPk88L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1vbnRoX3Nob3J0ZXN0X25vdmVtYmVyIj5OPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtb250aF9zaG9ydGVzdF9kZWNlbWJlciI+RDwvc3RyaW5nPgorCisgICAgPHN0cmluZyBuYW1lPSJzdW5kYXkiPmR1bWVuZ2lhPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtb25kYXkiPmdsaW5kZXNkaTwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0idHVlc2RheSI+bWFyZGk8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9IndlZG5lc2RheSI+bWVzZW1uYTwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0idGh1cnNkYXkiPmdpZXZnaWE8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImZyaWRheSI+dmVuZGVyZGk8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InNhdHVyZGF5Ij5zb25kYTwvc3RyaW5nPgorCisgICAgPHN0cmluZyBuYW1lPSJkYXlfb2Zfd2Vla19sb25nX3N1bmRheSI+ZHVtZW5naWE8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRheV9vZl93ZWVrX2xvbmdfbW9uZGF5Ij5nbGluZGVzZGk8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRheV9vZl93ZWVrX2xvbmdfdHVlc2RheSI+bWFyZGk8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRheV9vZl93ZWVrX2xvbmdfd2VkbmVzZGF5Ij5tZXNlbW5hPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkYXlfb2Zfd2Vla19sb25nX3RodXJzZGF5Ij5naWV2Z2lhPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkYXlfb2Zfd2Vla19sb25nX2ZyaWRheSI+dmVuZGVyZGk8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRheV9vZl93ZWVrX2xvbmdfc2F0dXJkYXkiPnNvbmRhPC9zdHJpbmc+CisKKyAgICA8c3RyaW5nIG5hbWU9ImRheV9vZl93ZWVrX21lZGl1bV9zdW5kYXkiPmR1PC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkYXlfb2Zfd2Vla19tZWRpdW1fbW9uZGF5Ij5nbGk8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRheV9vZl93ZWVrX21lZGl1bV90dWVzZGF5Ij5tYTwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGF5X29mX3dlZWtfbWVkaXVtX3dlZG5lc2RheSI+bWU8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRheV9vZl93ZWVrX21lZGl1bV90aHVyc2RheSI+Z2llPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkYXlfb2Zfd2Vla19tZWRpdW1fZnJpZGF5Ij52ZTwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGF5X29mX3dlZWtfbWVkaXVtX3NhdHVyZGF5Ij5zbzwvc3RyaW5nPgorCisgICAgPHN0cmluZyBuYW1lPSJkYXlfb2Zfd2Vla19zaG9ydF9zdW5kYXkiPmR1PC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkYXlfb2Zfd2Vla19zaG9ydF9tb25kYXkiPmdsaTwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGF5X29mX3dlZWtfc2hvcnRfdHVlc2RheSI+bWE8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRheV9vZl93ZWVrX3Nob3J0X3dlZG5lc2RheSI+bWU8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRheV9vZl93ZWVrX3Nob3J0X3RodXJzZGF5Ij5naWU8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRheV9vZl93ZWVrX3Nob3J0X2ZyaWRheSI+dmU8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRheV9vZl93ZWVrX3Nob3J0X3NhdHVyZGF5Ij5zbzwvc3RyaW5nPgorCisgICAgPHN0cmluZyBuYW1lPSJkYXlfb2Zfd2Vla19zaG9ydGVyX3N1bmRheSI+RDwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGF5X29mX3dlZWtfc2hvcnRlcl9tb25kYXkiPkc8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRheV9vZl93ZWVrX3Nob3J0ZXJfdHVlc2RheSI+TTwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGF5X29mX3dlZWtfc2hvcnRlcl93ZWRuZXNkYXkiPk08L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRheV9vZl93ZWVrX3Nob3J0ZXJfdGh1cnNkYXkiPkc8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRheV9vZl93ZWVrX3Nob3J0ZXJfZnJpZGF5Ij5WPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkYXlfb2Zfd2Vla19zaG9ydGVyX3NhdHVyZGF5Ij5TPC9zdHJpbmc+CisKKyAgICA8c3RyaW5nIG5hbWU9ImRheV9vZl93ZWVrX3Nob3J0ZXN0X3N1bmRheSI+RDwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGF5X29mX3dlZWtfc2hvcnRlc3RfbW9uZGF5Ij5HPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkYXlfb2Zfd2Vla19zaG9ydGVzdF90dWVzZGF5Ij5NPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkYXlfb2Zfd2Vla19zaG9ydGVzdF93ZWRuZXNkYXkiPk08L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRheV9vZl93ZWVrX3Nob3J0ZXN0X3RodXJzZGF5Ij5HPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkYXlfb2Zfd2Vla19zaG9ydGVzdF9mcmlkYXkiPlY8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRheV9vZl93ZWVrX3Nob3J0ZXN0X3NhdHVyZGF5Ij5TPC9zdHJpbmc+CisKKyAgICA8c3RyaW5nIG5hbWU9Inllc3RlcmRheSI+aWVyPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJ0b2RheSI+b3o8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InRvbW9ycm93Ij5kYW1hdW48L3N0cmluZz4KKworICAgIDxzdHJpbmcgbmFtZT0iaG91cl9taW51dGVfMjQiPiUtazolTTwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iaG91cl9taW51dGVfYW1wbSI+JS1sOiVNICVwPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJob3VyX21pbnV0ZV9jYXBfYW1wbSI+JS1sOiVNICVecDwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0idHdlbHZlX2hvdXJfdGltZV9mb3JtYXQiPmg6bW0gYTwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0idHdlbnR5X2ZvdXJfaG91cl90aW1lX2Zvcm1hdCI+SDptbTwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibnVtZXJpY19kYXRlIj4lZC4lbS4lWTwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibnVtZXJpY19kYXRlX2Zvcm1hdCI+ZGQuTU0ueXl5eTwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibnVtZXJpY19kYXRlX3RlbXBsYXRlIj4iJXMuJXMuJXMiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtb250aF9kYXlfeWVhciI+JS1lLiAlQiAlWTwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZnVsbF9kYXRlX21vbnRoX2ZpcnN0Ij5kLiBNTU1NIHk8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImZ1bGxfZGF0ZV9kYXlfZmlyc3QiPmQuIE1NTU0geTwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibWVkaXVtX2RhdGVfbW9udGhfZmlyc3QiPmQuIE1NTSB5PC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtZWRpdW1fZGF0ZV9kYXlfZmlyc3QiPmQuIE1NTSB5PC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJ0aW1lX29mX2RheSI+JUg6JU06JVM8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InN0YXR1c19iYXJfdGltZV9mb3JtYXQiPkhIOm1tPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkYXRlX2FuZF90aW1lIj4lSDolTTolUyAlZC4lbS4lWTwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGF0ZV90aW1lIj4lMSRzLCAlMiRzPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJ0aW1lX2RhdGUiPiUzJHMsICUxJHM8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImFiYnJldl9tb250aF9kYXlfeWVhciI+JWQuJW0uJVk8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1vbnRoX2RheSI+JS1lLiAlQjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibW9udGgiPiUtQjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibW9udGhfeWVhciI+JUIgJVk8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImFiYnJldl9tb250aF9kYXkiPiUtZS4gJWI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImFiYnJldl9tb250aCI+JS1iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJhYmJyZXZfbW9udGhfeWVhciI+JWIgJVk8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InRpbWUxX3RpbWUyIj4lMSRzIC0gJTIkczwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGF0ZTFfZGF0ZTIiPiUyJHMgLSAlNSRzPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJudW1lcmljX21kMV9tZDIiPiUzJHMuJTIkcy4gLSAlOCRzLiU3JHMuPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJudW1lcmljX3dkYXkxX21kMV93ZGF5Ml9tZDIiPiUxJHMsICUzJHMuJTIkcy4gLSAlNiRzLCAlOCRzLiU3JHMuPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJudW1lcmljX21keTFfbWR5MiI+JTMkcy4lMiRzLiU0JHMgLSAlOCRzLiU3JHMuJTkkczwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibnVtZXJpY193ZGF5MV9tZHkxX3dkYXkyX21keTIiPiUxJHMsICUzJHMuJTIkcy4lNCRzIC0gJTYkcywgJTgkcy4lNyRzLiU5JHM8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im51bWVyaWNfd2RheTFfbWR5MV90aW1lMV93ZGF5Ml9tZHkyX3RpbWUyIj4lNSRzICUxJHMsICU0JHMtJTIkcy0lMyRzIC0gJTEwJHMgJTYkcywgJTkkcy0lNyRzLSU4JHM8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im51bWVyaWNfbWQxX3RpbWUxX21kMl90aW1lMiI+JTUkcyAlMyRzLiUyJHMuIC0gJTEwJHMgJTgkcy4lNyRzLjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibnVtZXJpY193ZGF5MV9tZDFfdGltZTFfd2RheTJfbWQyX3RpbWUyIj4lNSRzICUxJHMsICUzJHMuJTIkcy4gLSAlMTAkcyAlNiRzLCAlOCRzLiU3JHMuPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJudW1lcmljX21keTFfdGltZTFfbWR5Ml90aW1lMiI+JTUkcyAlMyRzLiUyJHMuJTQkcyAtICUxMCRzICU4JHMuJTckcy4lOSRzPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJ3ZGF5MV9kYXRlMV90aW1lMV93ZGF5Ml9kYXRlMl90aW1lMiI+JTMkcyAlMSRzICUyJHMgLSAlNiRzICU0JHMgJTUkczwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0id2RheTFfZGF0ZTFfd2RheTJfZGF0ZTIiPiUxJHMgJTIkcyAtICU0JHMgJTUkczwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGF0ZTFfdGltZTFfZGF0ZTJfdGltZTIiPiUzJHMgJTIkcyAtICU2JHMgJTUkczwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0idGltZV93ZGF5X2RhdGUiPiUxJHMgJTIkcyAlMyRzPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJ3ZGF5X2RhdGUiPiUyJHMgJTMkczwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0idGltZV93ZGF5Ij4lMSRzICUyJHM8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InNhbWVfeWVhcl9tZDFfbWQyIj4lMyRzLiAlMiRzIC0gJTgkcy4gJTckczwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ic2FtZV95ZWFyX3dkYXkxX21kMV93ZGF5Ml9tZDIiPiUxJHMgJTMkcy4gJTIkcyAtICU2JHMgJTgkcy4gJTckczwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ic2FtZV95ZWFyX21kMV90aW1lMV9tZDJfdGltZTIiPiU1JHMgJTMkcy4gJTIkcyAtICUxMCRzICU4JHMuICU3JHM8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InNhbWVfbW9udGhfbWQxX3RpbWUxX21kMl90aW1lMiI+JTUkcyAlMyRzLiAlMiRzIC0gJTEwJHMgJTgkcy4gJTckczwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ic2FtZV95ZWFyX3dkYXkxX21kMV90aW1lMV93ZGF5Ml9tZDJfdGltZTIiPiU1JHMgJTEkcyAlMyRzLiAlMiRzIC0gJTEwJHMgJTYkcyAlOCRzLiAlNyRzPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJzYW1lX21vbnRoX3dkYXkxX21kMV90aW1lMV93ZGF5Ml9tZDJfdGltZTIiPiU1JHMgJTEkcyAlMyRzLiAlMiRzIC0gJTEwJHMgJTYkcyAlOCRzLiAlNyRzPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJzYW1lX3llYXJfbWR5MV90aW1lMV9tZHkyX3RpbWUyIj4lNSRzICUzJHMuICUyJHMgJTQkcyAtICUxMCRzICU4JHMuICU3JHMgJTkkczwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ic2FtZV9tb250aF9tZHkxX3RpbWUxX21keTJfdGltZTIiPiU1JHMgJTMkcy4gJTIkcyAlNCRzIC0gJTEwJHMgJTgkcy4gJTckcyAlOSRzPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJzYW1lX3llYXJfd2RheTFfbWR5MV90aW1lMV93ZGF5Ml9tZHkyX3RpbWUyIj4lNSRzICUxJHMsICUzJHMuICUyJHMgJTQkcyAtICUxMCRzICU2JHMsICU4JHMuICU3JHMgJTkkczwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ic2FtZV9tb250aF93ZGF5MV9tZHkxX3RpbWUxX3dkYXkyX21keTJfdGltZTIiPiU1JHMgJTEkcywgJTMkcy4gJTIkcyAlNCRzIC0gJTEwJHMgJTYkcywgJTgkcy4gJTckcyAlOSRzPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJzYW1lX21vbnRoX3dkYXkxX21keTFfd2RheTJfbWR5MiI+JTEkcywgJTMkcy4gJTIkcyAlNCRzIC0gJTYkcywgJTgkcy4gJTckcyAlOSRzPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJzYW1lX21vbnRoX21kMV9tZDIiPiUzJHMuLSU4JHMuICUyJHM8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InNhbWVfbW9udGhfd2RheTFfbWQxX3dkYXkyX21kMiI+JTEkcyAlMyRzLiAlMiRzIC0gJTYkcyAlOCRzLiAlNyRzPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJzYW1lX3llYXJfbWR5MV9tZHkyIj4lMyRzLiAlMiRzIC0gJTgkcy4gJTckcyAlOSRzPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJzYW1lX21vbnRoX21keTFfbWR5MiI+JTMkcy4tJTgkcy4gJTIkcyAlOSRzPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJzYW1lX3llYXJfd2RheTFfbWR5MV93ZGF5Ml9tZHkyIj4lMSRzLCAlMyRzLiAlMiRzIC0gJTYkcywgJTgkcy4gJTckcyAlOSRzPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJzaG9ydF9mb3JtYXRfbW9udGgiPiViPC9zdHJpbmc+Cis8L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy92YWx1ZXMtcnUvc3RyaW5ncy54bWwgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzLXJ1L3N0cmluZ3MueG1sCmluZGV4IDI5YjdlNDYuLmRmMjQ1NmMgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy92YWx1ZXMtcnUvc3RyaW5ncy54bWwKKysrIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy1ydS9zdHJpbmdzLnhtbApAQCAtNDMyLDYgKzQzMiwxMCBAQAogICAgIDxzdHJpbmcgbmFtZT0icG9saWN5ZGVzY19mb3JjZUxvY2siIG1zZ2lkPSIyODE5ODY4NjY0OTQ2MDg5NzQwIj4i0KPQv9GA0LDQstC70LXQvdC40LUg0LHQu9C+0LrQuNGA0L7QstC60L7QuSDRg9GB0YLRgNC+0LnRgdGC0LLQsCwg0YLRgNC10LHRg9GO0YnQtdC5INCy0LLQvtC00LAg0L/QsNGA0L7Qu9GPLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBvbGljeWxhYl93aXBlRGF0YSIgbXNnaWQ9IjM5MTA1NDU0NDY3NTg2Mzk3MTMiPiLQo9C00LDQu9C40YLRjCDQstGB0LUg0LTQsNC90L3Ri9C1Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icG9saWN5ZGVzY193aXBlRGF0YSIgbXNnaWQ9IjIzMTQwNjA5MzM3OTYzOTYyMDUiPiLQktGL0L/QvtC70L3QuNGC0Ywg0YHQsdGA0L7RgSDQuiDQvdCw0YfQsNC70YzQvdGL0Lwg0L3QsNGB0YLRgNC+0LnQutCw0Lwg0YEg0YPQtNCw0LvQtdC90LjQtdC8INCy0YHQtdGFINC00LDQvdC90YvRhSDQsdC10Lcg0LfQsNC/0YDQvtGB0LAg0L/QvtC00YLQstC10YDQttC00LXQvdC40Y8uIjwvc3RyaW5nPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBvbGljeWxhYl9zZXRHbG9iYWxQcm94eSAoMjc4NDgyODI5Mzc0Nzc5MTQ0NikgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwb2xpY3lkZXNjX3NldEdsb2JhbFByb3h5ICg2Mzg3NDk3NDY2NjYwMTU0OTMxKSAtLT4KKyAgICA8c2tpcCAvPgogICA8c3RyaW5nLWFycmF5IG5hbWU9InBob25lVHlwZXMiPgogICAgIDxpdGVtIG1zZ2lkPSI4OTAxMDk4MzM2NjU4NzEwMzU5Ij4i0JTQvtC80LDRiNC90LjQuSI8L2l0ZW0+CiAgICAgPGl0ZW0gbXNnaWQ9Ijg2OTkyMzY1MDUyNzEzNjYxNSI+ItCc0L7QsdC40LvRjNC90YvQuSI8L2l0ZW0+CkBAIC01MjUsMTAgKzUyOSw5IEBACiAgICAgPHN0cmluZyBuYW1lPSJvcmdUeXBlV29yayIgbXNnaWQ9IjI5MjY4ODcwNTA1MzYzODcyIj4i0KDQsNCx0L7RgtCwIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ib3JnVHlwZU90aGVyIiBtc2dpZD0iMzk1MTc4MTEzMTU3MDEyNDA4MiI+ItCU0YDRg9Cz0L7QtSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9Im9yZ1R5cGVDdXN0b20iIG1zZ2lkPSIyMjU1MjM0MTUzNzIwODgzMjIiPiLQodC+0LfQtNCw0YLRjCDRgdCy0L7QuSDRj9GA0LvRi9C6Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iY29udGFjdF9zdGF0dXNfdXBkYXRlX2F0dHJpYnV0aW9uIiBtc2dpZD0iNTExMjU4OTg4NjA5NDQwMjc5NSI+ItGBINC/0L7QvNC+0YnRjNGOIDx4bGlmZjpnIGlkPSJTT1VSQ0UiPiUxJHM8L3hsaWZmOmc+Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iY29udGFjdF9zdGF0dXNfdXBkYXRlX2F0dHJpYnV0aW9uX3dpdGhfZGF0ZSIgbXNnaWQ9IjU5NDUzODYzNzYzNjk5Nzk5MDkiPiI8eGxpZmY6ZyBpZD0iREFURSI+JTEkczwveGxpZmY6Zz4g0YEg0L/QvtC80L7RidGM0Y4gPHhsaWZmOmcgaWQ9IlNPVVJDRSI+JTIkczwveGxpZmY6Zz4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJrZXlndWFyZF9wYXNzd29yZF9lbnRlcl9waW5fY29kZSIgbXNnaWQ9IjM3MzE0ODg4MjcyMTg4NzYxMTUiPiLQktCy0LXQtNC40YLQtSBQSU4t0LrQvtC0Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ia2V5Z3VhcmRfcGFzc3dvcmRfZW50ZXJfcGFzc3dvcmRfY29kZSIgbXNnaWQ9IjkxMzgxNTgzNDQ4MTMyMTM3NTQiPiLQktCy0LXQtNC40YLQtSDQv9Cw0YDQvtC70Ywg0LTQu9GPINGA0LDQt9Cx0LvQvtC60LjRgNC+0LLQutC4Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ia2V5Z3VhcmRfcGFzc3dvcmRfZW50ZXJfcGluX3Bhc3N3b3JkX2NvZGUiIG1zZ2lkPSI2MzgzNDcwNzU2MjU0OTE1MTQiPiLQktCy0LXQtNC40YLQtSBQSU4t0LrQvtC0INC00LvRjyDRgNCw0LfQsdC70L7QutC40YDQvtCy0LrQuCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImtleWd1YXJkX3Bhc3N3b3JkX3dyb25nX3Bpbl9jb2RlIiBtc2dpZD0iMTI5NTk4NDExNDMzODEwNzcxOCI+ItCd0LXQstC10YDQvdGL0LkgUElOLdC60L7QtCEiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJrZXlndWFyZF9sYWJlbF90ZXh0IiBtc2dpZD0iODYxNzk2NDYxMDI4Mjk4NDI0Ij4i0JTQu9GPINGA0LDQt9Cx0LvQvtC60LjRgNC+0LLQutC4INC90LDQttC80LjRgtC1IFwi0JzQtdC90Y5cIiwg0LAg0LfQsNGC0LXQvCAwLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImVtZXJnZW5jeV9jYWxsX2RpYWxvZ19udW1iZXJfZm9yX2Rpc3BsYXkiIG1zZ2lkPSI2OTYxOTIxMDMxOTUwOTA5NzAiPiLQrdC60YHRgtGA0LXQvdC90LDRjyDRgdC70YPQttCx0LAiPC9zdHJpbmc+CkBAIC01NDEsNiArNTQ0LDcgQEAKICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fcmV0dXJuX3RvX2NhbGwiIG1zZ2lkPSI1MjQ0MjU5Nzg1NTAwMDQwMDIxIj4i0JLQtdGA0L3Rg9GC0YzRgdGPINC6INCy0YvQt9C+0LLRgyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fcGF0dGVybl9jb3JyZWN0IiBtc2dpZD0iOTAzOTAwODY1MDM2MjI2MTIzNyI+ItCf0YDQsNCy0LjQu9GM0L3QviEiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3BhdHRlcm5fd3JvbmciIG1zZ2lkPSI0ODE3NTgzMjc5MDUzMTEyMzEyIj4i0J/QvtCy0YLQvtGA0LjRgtC1INC/0L7Qv9GL0YLQutGDIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9wYXNzd29yZF93cm9uZyIgbXNnaWQ9IjYyMzc0NDM2NTczNTgxNjg4MTkiPiLQn9C+0LLRgtC+0YDQuNGC0LUg0L/QvtC/0YvRgtC60YMiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3BsdWdnZWRfaW4iIG1zZ2lkPSI2MTMzNDM4NTI4NDI5NDQ0MzUiPiLQmNC00LXRgiDQt9Cw0YDRj9C00LrQsCAoPHhsaWZmOmcgaWQ9Ik5VTUJFUiI+JWQ8L3hsaWZmOmc+PHhsaWZmOmcgaWQ9IlBFUkNFTlQiPiUlPC94bGlmZjpnPikiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX2NoYXJnZWQiIG1zZ2lkPSI0OTM4OTMwNDU5NjIwOTg5OTcyIj4i0JfQsNGA0Y/QttC10L3QsC4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX2JhdHRlcnlfc2hvcnQiIG1zZ2lkPSIzNjE3NTQ5MTc4NjAzMzU0NjU2Ij4iPHhsaWZmOmcgaWQ9Ik5VTUJFUiI+JWQ8L3hsaWZmOmc+PHhsaWZmOmcgaWQ9IlBFUkNFTlQiPiUlPC94bGlmZjpnPiI8L3N0cmluZz4KQEAgLTU1NSw2ICs1NTksOCBAQAogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9zaW1fbG9ja2VkX21lc3NhZ2UiIG1zZ2lkPSI4MDY2NjYwMTI5MjA2MDAxMDM5Ij4iU0lNLdC60LDRgNGC0LAg0LfQsNCx0LvQvtC60LjRgNC+0LLQsNC90LAuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9zaW1fdW5sb2NrX3Byb2dyZXNzX2RpYWxvZ19tZXNzYWdlIiBtc2dpZD0iNTk1MzIzMjE0MDUyODgxMjY0Ij4i0KDQsNC30LHQu9C+0LrQuNGA0L7QstC60LAgU0lNLdC60LDRgNGC0YvigKYiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3Rvb19tYW55X2ZhaWxlZF9hdHRlbXB0c19kaWFsb2dfbWVzc2FnZSIgbXNnaWQ9IjM1MTQ3NDIxMDYwNjY4Nzc0NzYiPiLQmtC+0LvQuNGH0LXRgdGC0LLQviDQvdC10YPQtNCw0YfQvdGL0YUg0L/QvtC/0YvRgtC+0Log0LLQstC+0LTQsCDQs9GA0LDRhNC40YfQtdGB0LrQvtCz0L4g0LrQu9GO0YfQsCDRgNCw0LfQsdC70L7QutC40YDQvtCy0LrQuDogPHhsaWZmOmcgaWQ9Ik5VTUJFUl8wIj4lZDwveGxpZmY6Zz4uICJcblxuItCf0L7QstGC0L7RgNC40YLQtSDQv9C+0L/Ri9GC0LrRgyDRh9C10YDQtdC3IDx4bGlmZjpnIGlkPSJOVU1CRVJfMSI+JWQ8L3hsaWZmOmc+INGBLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fdG9vX21hbnlfZmFpbGVkX3Bhc3N3b3JkX2F0dGVtcHRzX2RpYWxvZ19tZXNzYWdlIiBtc2dpZD0iNDkwNjAzNDM3NjQyNTE3NTM4MSI+ItCa0L7Qu9C40YfQtdGB0YLQstC+INC90LXRg9C00LDRh9C90YvRhSDQv9C+0L/Ri9GC0L7QuiDQstCy0L7QtNCwINC/0LDRgNC+0LvRjzogPHhsaWZmOmcgaWQ9Ik5VTUJFUl8wIj4lZDwveGxpZmY6Zz4uICJcblxuItCf0L7QstGC0L7RgNC40YLQtSDQv9C+0L/Ri9GC0LrRgyDRh9C10YDQtdC3IDx4bGlmZjpnIGlkPSJOVU1CRVJfMSI+JWQ8L3hsaWZmOmc+INGBLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fdG9vX21hbnlfZmFpbGVkX3Bpbl9hdHRlbXB0c19kaWFsb2dfbWVzc2FnZSIgbXNnaWQ9IjY4Mjc3NDkyMzE0NjUxNDU1OTAiPiLQmtC+0LvQuNGH0LXRgdGC0LLQviDQvdC10YPQtNCw0YfQvdGL0YUg0L/QvtC/0YvRgtC+0Log0LLQstC+0LTQsCBQSU4t0LrQvtC00LA6IDx4bGlmZjpnIGlkPSJOVU1CRVJfMCI+JWQ8L3hsaWZmOmc+LiAiXG5cbiLQn9C+0LLRgtC+0YDQuNGC0LUg0L/QvtC/0YvRgtC60YMg0YfQtdGA0LXQtyA8eGxpZmY6ZyBpZD0iTlVNQkVSXzEiPiVkPC94bGlmZjpnPiDRgS4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX2ZhaWxlZF9hdHRlbXB0c19hbG1vc3RfZ2xvZ2luIiBtc2dpZD0iMzM1MTAxMzg0MjMyMDEyNzgyNyI+ItCa0L7Qu9C40YfQtdGB0YLQstC+INC90LXRg9C00LDRh9C90YvRhSDQv9C+0L/Ri9GC0L7QuiDQstCy0L7QtNCwINCz0YDQsNGE0LjRh9C10YHQutC+0LPQviDQutC70Y7Rh9CwINGA0LDQt9Cx0LvQvtC60LjRgNC+0LLQutC4OiA8eGxpZmY6ZyBpZD0iTlVNQkVSXzAiPiVkPC94bGlmZjpnPi4g0J/QvtGB0LvQtSA8eGxpZmY6ZyBpZD0iTlVNQkVSXzEiPiVkPC94bGlmZjpnPiDQvdC10YPQtNCw0YfQvdGL0YUg0L/QvtC/0YvRgtC+0Log0LLQsNC8INCx0YPQtNC10YIg0L/RgNC10LTQu9C+0LbQtdC90L4g0YDQsNC30LHQu9C+0LrQuNGA0L7QstCw0YLRjCDRgtC10LvQtdGE0L7QvSDRgSDQv9C+0LzQvtGJ0YzRjiDRg9GH0LXRgtC90YvRhSDQtNCw0L3QvdGL0YUgR29vZ2xlLlxuICJcblxuIiDQn9C+0LLRgtC+0YDQuNGC0LUg0L/QvtC/0YvRgtC60YMg0YfQtdGA0LXQtyA8eGxpZmY6ZyBpZD0iTlVNQkVSXzIiPiVkPC94bGlmZjpnPiDRgS4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3Rvb19tYW55X2ZhaWxlZF9hdHRlbXB0c19jb3VudGRvd24iIG1zZ2lkPSI2MjUxNDgwMzQzMzk0Mzg5NjY1Ij4i0J/QvtCy0YLQvtGA0LjRgtC1INC/0L7Qv9GL0YLQutGDINGH0LXRgNC10LcgPHhsaWZmOmcgaWQ9Ik5VTUJFUiI+JWQ8L3hsaWZmOmc+INGBLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fZm9yZ290X3BhdHRlcm5fYnV0dG9uX3RleHQiIG1zZ2lkPSIyNjI2OTk5NDQ5NjEwNjk1OTMwIj4i0JfQsNCx0YvQu9C4INCz0YDQsNGE0LjRh9C10YHQutC40Lkg0LrQu9GO0Yc/Ijwvc3RyaW5nPgpAQCAtNjk5LDE0ICs3MDUsMTQgQEAKICAgICA8c3RyaW5nIG5hbWU9ImVsYXBzZWRfdGltZV9zaG9ydF9mb3JtYXRfbW1fc3MiIG1zZ2lkPSI0NDMxNTU1OTQzODI4NzExNDczIj4iPHhsaWZmOmcgaWQ9Ik1JTlVURVMiPiUxJDAyZDwveGxpZmY6Zz46PHhsaWZmOmcgaWQ9IlNFQ09ORFMiPiUyJDAyZDwveGxpZmY6Zz4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJlbGFwc2VkX3RpbWVfc2hvcnRfZm9ybWF0X2hfbW1fc3MiIG1zZ2lkPSIxODQ2MDcxOTk3NjE2NjU0MTI0Ij4iPHhsaWZmOmcgaWQ9IkhPVVJTIj4lMSRkPC94bGlmZjpnPjo8eGxpZmY6ZyBpZD0iTUlOVVRFUyI+JTIkMDJkPC94bGlmZjpnPjo8eGxpZmY6ZyBpZD0iU0VDT05EUyI+JTMkMDJkPC94bGlmZjpnPiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InNlbGVjdEFsbCIgbXNnaWQ9IjY4NzY1MTg5MjU4NDQxMjkzMzEiPiLQktGL0LHRgNCw0YLRjCDQstGB0LUiPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiAzODg5MTQ5MTIzNjI2ODg4NjM3IC0tPiAgICAgPHN0cmluZyBuYW1lPSJzZWxlY3RUZXh0IiBtc2dpZD0iNDg2MjM1OTMxMTA4ODg5ODg3OCI+ItCS0YvQsdGA0LDRgtGMINGC0LXQutGB0YIiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJjdXQiIG1zZ2lkPSIzMDkyNTY5NDA4NDM4NjI2MjYxIj4i0JLRi9GA0LXQt9Cw0YLRjCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImNvcHkiIG1zZ2lkPSIyNjgxOTQ2MjI5NTMzNTExOTg3Ij4i0JrQvtC/0LjRgNC+0LLQsNGC0YwiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwYXN0ZSIgbXNnaWQ9IjU2Mjk4ODA4MzY4MDUwMzY0MzMiPiLQktGB0YLQsNCy0LjRgtGMIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iY29weVVybCIgbXNnaWQ9IjI1MzgyMTE1Nzk1OTYwNjc0MDIiPiLQmtC+0L/QuNGA0L7QstCw0YLRjCBVUkwiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJzZWxlY3RUZXh0TW9kZSIgbXNnaWQ9IjY3Mzg1NTYzNDg4NjEzNDcyNDAiPiLQktGL0LHRgNCw0YLRjCDRgtC10LrRgdGCLi4uIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0idGV4dFNlbGVjdGlvbkNBQlRpdGxlIiBtc2dpZD0iNTIzNjg1MDM5NDM3MDgyMDM1NyI+ItCS0YvQsdC+0YAg0YLQtdC60YHRgtCwIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iaW5wdXRNZXRob2QiIG1zZ2lkPSIxNjUzNjMwMDYyMzA0NTY3ODc5Ij4i0KHQv9C+0YHQvtCxINCy0LLQvtC00LAiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJhZGRUb0RpY3Rpb25hcnkiIG1zZ2lkPSI4NzkzNjI0OTkxNjg2OTQ4NzA5Ij4i0JTQvtCx0LDQstC40YLRjCBcIjx4bGlmZjpnIGlkPSJXT1JEIj4lczwveGxpZmY6Zz5cIiDQsiDRgdC70L7QstCw0YDRjCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImVkaXRUZXh0TWVudVRpdGxlIiBtc2dpZD0iMTY3Mjk4OTE3Njk1ODU4MTQ1MiI+ItCY0LfQvNC10L3QuNGC0Ywg0YLQtdC60YHRgiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImVkaXRUZXh0TWVudVRpdGxlIiBtc2dpZD0iNDkwOTEzNTU2NDk0MTgxNTQ5NCI+ItCe0L/QtdGA0LDRhtC40Lgg0YEg0YLQtdC60YHRgtC+0LwiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb3dfaW50ZXJuYWxfc3RvcmFnZV92aWV3X3RpdGxlIiBtc2dpZD0iMTM5OTczMjQwODcwMTY5NzU0NiI+ItCd0LXQtNC+0YHRgtCw0YLQvtGH0L3QviDQvNC10YHRgtCwIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG93X2ludGVybmFsX3N0b3JhZ2Vfdmlld190ZXh0IiBtc2dpZD0iNjM1MTA2NTQ0NjE2Mzc4ODM2Ij4i0JfQsNC60LDQvdGH0LjQstCw0LXRgtGB0Y8g0LzQtdGB0YLQviDQsiDQv9Cw0LzRj9GC0Lgg0YLQtdC70LXRhNC+0L3QsC4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJvayIgbXNnaWQ9IjU5NzAwNjA0MzA1NjI1MjQ5MTAiPiLQntCaIjwvc3RyaW5nPgpAQCAtNzE0LDYgKzcyMCw3IEBACiAgICAgPHN0cmluZyBuYW1lPSJ5ZXMiIG1zZ2lkPSI1MzYyOTgyMzAzMzM3OTY5MzEyIj4i0J7QmiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9Im5vIiBtc2dpZD0iNTE0MTUzMTA0NDkzNTU0MTQ5NyI+ItCe0YLQvNC10L3QsCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImRpYWxvZ19hbGVydF90aXRsZSIgbXNnaWQ9IjIwNDk2NTg3MDg2MDkwNDMxMDMiPiLQktC90LjQvNCw0L3QuNC1Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibG9hZGluZyIgbXNnaWQ9IjE3NjA3MjQ5OTg5MjgyNTUyNTAiPiLQl9Cw0LPRgNGD0LfQutCwLi4uIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iY2FwaXRhbF9vbiIgbXNnaWQ9IjE1NDQ2ODI3NTU1MTQ0OTQyOTgiPiLQktCa0JsiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJjYXBpdGFsX29mZiIgbXNnaWQ9IjY4MTU4NzAzODY5NzI4MDU4MzIiPiLQktCr0JrQmyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9IndoaWNoQXBwbGljYXRpb24iIG1zZ2lkPSI0NTMzMTg1OTQ3MDY0NzczMzg2Ij4i0KfRgtC+INC40YHQv9C+0LvRjNC30L7QstCw0YLRjD8iPC9zdHJpbmc+CkBAIC04NTQsMTUgKzg2MSwyNCBAQAogICAgIDxzdHJpbmcgbmFtZT0ibDJ0cF9pcHNlY19wc2tfdnBuX2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzk0NTA0MzU2NDAwODMwMzIzOSI+IkwyVFAvSVBTZWMgVlBOICjQvdCwINC+0YHQvdC+0LLQtSDQv9GA0LXQtNCyLiDQvtCx0YkuINC60LvRjtGH0LApIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibDJ0cF9pcHNlY19jcnRfdnBuX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNTM4MjcxNDA3MzEwMzY1MzU3NyI+IkwyVFAvSVBTZWMgVlBOICjQvdCwINC+0YHQvdC+0LLQtSDRgdC10YDRgtC40YTQuNC60LDRgtCwKSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InVwbG9hZF9maWxlIiBtc2dpZD0iMjg5Nzk1NzE3MjM2NjczMDQxNiI+ItCS0YvQsdGA0LDRgtGMINGE0LDQudC7Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibm9fZmlsZV9jaG9zZW4iIG1zZ2lkPSI2MzYzNjQ4NTYyMTcwNzU5NDY1Ij4i0J3QtSDQstGL0LHRgNCw0L0g0YTQsNC50LsiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJyZXNldCIgbXNnaWQ9IjI0NDgxNjgwODA5NjQyMDk5MDgiPiLQodCx0YDQvtGB0LjRgtGMIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ic3VibWl0IiBtc2dpZD0iMTYwMjMzNTU3MjA4OTkxMTk0MSI+ItCe0YLQv9GA0LDQstC40YLRjCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImRlc2NyaXB0aW9uX3N0YXIiIG1zZ2lkPSIyNjU0MzE5ODc0OTA4NTc2MTMzIj4i0LjQt9Cx0YDQsNC90L3QvtC1Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iY2FyX21vZGVfZGlzYWJsZV9ub3RpZmljYXRpb25fdGl0bGUiIG1zZ2lkPSIzMTY0NzY4MjEyMDAzODY0MzE2Ij4i0KDQtdC20LjQvCDQs9GA0L7QvNC60L7QuSDRgdCy0Y/Qt9C4INCy0LrQu9GO0YfQtdC9Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iY2FyX21vZGVfZGlzYWJsZV9ub3RpZmljYXRpb25fbWVzc2FnZSIgbXNnaWQ9IjY2ODY2MzYyNjcyMTY3NTYxNCI+ItCS0YvQsdC10YDQuNGC0LUg0LTQu9GPINCy0YvRhdC+0LTQsCDQuNC3INGA0LXQttC40LzQsCDQs9GA0L7QvNC60L7QuSDRgdCy0Y/Qt9C4LiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InRldGhlcmVkX25vdGlmaWNhdGlvbl90aXRsZSIgbXNnaWQ9IjMxNDY2OTQyMzQzOTgyMDI2MDEiPiJVU0It0LzQvtC00LXQvCDQuNC70Lgg0YLQvtGH0LrQsCDQtNC+0YHRgtGD0L/QsCBXaS1GaSDQsNC60YLQuNCy0L3RiyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InRldGhlcmVkX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBtc2dpZD0iMzA2NzEwODMyMzkwMzA0ODkyNyI+ItCd0LDQttC80LjRgtC1INC00LvRjyDQvdCw0YHRgtGA0L7QudC60LgiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJiYWNrX2J1dHRvbl9sYWJlbCIgbXNnaWQ9IjIzMDA0NzAwMDQ1MDMzNDM0MzkiPiLQndCw0LfQsNC0Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibmV4dF9idXR0b25fbGFiZWwiIG1zZ2lkPSIxMDgwNTU1MTA0Njc3OTkyNDA4Ij4i0JTQsNC70LXQtSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InNraXBfYnV0dG9uX2xhYmVsIiBtc2dpZD0iMTI3NTM2MjI5OTQ3MTYzMTgxOSI+ItCf0YDQvtC/0YPRgdGC0LjRgtGMIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idGhyb3R0bGVfd2FybmluZ19ub3RpZmljYXRpb25fdGl0bGUiIG1zZ2lkPSI0ODkwODk0MjY3NDU0ODY3Mjc2Ij4i0JDQutGC0LjQstC90LDRjyDQv9C10YDQtdC00LDRh9CwINC00LDQvdC90YvRhSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InRocm90dGxlX3dhcm5pbmdfbm90aWZpY2F0aW9uX21lc3NhZ2UiIG1zZ2lkPSIyNjA5NzM0NzYzODQ1NzA1NzA4Ij4i0J3QsNC20LzQuNGC0LUsINGH0YLQvtCx0Ysg0YPQt9C90LDRgtGMINCx0L7Qu9GM0YjQtSDQviDQvNC+0LHQuNC70YzQvdC+0Lkg0L/QtdGA0LXQtNCw0YfQtSDQtNCw0L3QvdGL0YUiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ0aHJvdHRsZWRfbm90aWZpY2F0aW9uX3RpdGxlIiBtc2dpZD0iNjI2OTU0MTg5NzcyOTc4MTMzMiI+ItCf0YDQtdCy0YvRiNC10L0g0LvQuNC80LjRgiDQvdCwINC80L7QsdC40LvRjNC90YvQtSDQtNCw0L3QvdGL0LUiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ0aHJvdHRsZWRfbm90aWZpY2F0aW9uX21lc3NhZ2UiIG1zZ2lkPSI0NzEyMzY5ODU2NjAxMjc1MTQ2Ij4i0J3QsNC20LzQuNGC0LUsINGH0YLQvtCx0Ysg0YPQt9C90LDRgtGMINCx0L7Qu9GM0YjQtSDQviDQvNC+0LHQuNC70YzQvdC+0Lkg0L/QtdGA0LXQtNCw0YfQtSDQtNCw0L3QvdGL0YUiPC9zdHJpbmc+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3Igbm9fbWF0Y2hlcyAoODEyOTQyMTkwODkxNTg0MDczNykgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBmaW5kX29uX3BhZ2UgKDE5NDY3OTkyMzM4MjI4MjAzODQpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgbWF0Y2hlc19mb3VuZDpvbmUgKDgxNjcxNDcwODExMzY1Nzk0MzkpIC0tPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIG1hdGNoZXNfZm91bmQ6b3RoZXIgKDQ2NDE4NzI3OTcwNjc2MDkxNzcpIC0tPgogPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvdmFsdWVzLXN2L3N0cmluZ3MueG1sIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy1zdi9zdHJpbmdzLnhtbAppbmRleCBiNTNmMjE5Li40YmEwZTkxIDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvdmFsdWVzLXN2L3N0cmluZ3MueG1sCisrKyBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMtc3Yvc3RyaW5ncy54bWwKQEAgLTQzMiw2ICs0MzIsMTAgQEAKICAgICA8c3RyaW5nIG5hbWU9InBvbGljeWRlc2NfZm9yY2VMb2NrIiBtc2dpZD0iMjgxOTg2ODY2NDk0NjA4OTc0MCI+IktvbnRyb2xsZXJhIG7DpHIgZW5oZXRlbiBsw6VzZXMsIHZpbGtldCBrcsOkdmVyIGF0dCBkdSBhbmdlciBsw7ZzZW5vcmRldCBpZ2VuLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBvbGljeWxhYl93aXBlRGF0YSIgbXNnaWQ9IjM5MTA1NDU0NDY3NTg2Mzk3MTMiPiJSYWRlcmEgYWxsYSBkYXRhIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icG9saWN5ZGVzY193aXBlRGF0YSIgbXNnaWQ9IjIzMTQwNjA5MzM3OTYzOTYyMDUiPiLDhXRlcnN0w6RsbCBmYWJyaWtzaW5zdMOkbGxuaW5nYXJuYSBvY2ggdGEgYm9ydCBhbGxhIGRhdGEgdXRhbiBuw6Vnb24gYmVrcsOkZnRlbHNlLiI8L3N0cmluZz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwb2xpY3lsYWJfc2V0R2xvYmFsUHJveHkgKDI3ODQ4MjgyOTM3NDc3OTE0NDYpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcG9saWN5ZGVzY19zZXRHbG9iYWxQcm94eSAoNjM4NzQ5NzQ2NjY2MDE1NDkzMSkgLS0+CisgICAgPHNraXAgLz4KICAgPHN0cmluZy1hcnJheSBuYW1lPSJwaG9uZVR5cGVzIj4KICAgICA8aXRlbSBtc2dpZD0iODkwMTA5ODMzNjY1ODcxMDM1OSI+IkhlbSI8L2l0ZW0+CiAgICAgPGl0ZW0gbXNnaWQ9Ijg2OTkyMzY1MDUyNzEzNjYxNSI+Ik1vYmlsIjwvaXRlbT4KQEAgLTUyNSwxMCArNTI5LDkgQEAKICAgICA8c3RyaW5nIG5hbWU9Im9yZ1R5cGVXb3JrIiBtc2dpZD0iMjkyNjg4NzA1MDUzNjM4NzIiPiJBcmJldGUiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJvcmdUeXBlT3RoZXIiIG1zZ2lkPSIzOTUxNzgxMTMxNTcwMTI0MDgyIj4iw5Z2cmlndCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9Im9yZ1R5cGVDdXN0b20iIG1zZ2lkPSIyMjU1MjM0MTUzNzIwODgzMjIiPiJBbnBhc3NhZCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImNvbnRhY3Rfc3RhdHVzX3VwZGF0ZV9hdHRyaWJ1dGlvbiIgbXNnaWQ9IjUxMTI1ODk4ODYwOTQ0MDI3OTUiPiJ2aWEgPHhsaWZmOmcgaWQ9IlNPVVJDRSI+JTEkczwveGxpZmY6Zz4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJjb250YWN0X3N0YXR1c191cGRhdGVfYXR0cmlidXRpb25fd2l0aF9kYXRlIiBtc2dpZD0iNTk0NTM4NjM3NjM2OTk3OTkwOSI+Ijx4bGlmZjpnIGlkPSJEQVRFIj4lMSRzPC94bGlmZjpnPiB2aWEgPHhsaWZmOmcgaWQ9IlNPVVJDRSI+JTIkczwveGxpZmY6Zz4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJrZXlndWFyZF9wYXNzd29yZF9lbnRlcl9waW5fY29kZSIgbXNnaWQ9IjM3MzE0ODg4MjcyMTg4NzYxMTUiPiJBbmdlIFBJTi1rb2QiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJrZXlndWFyZF9wYXNzd29yZF9lbnRlcl9wYXNzd29yZF9jb2RlIiBtc2dpZD0iOTEzODE1ODM0NDgxMzIxMzc1NCI+IkFuZ2UgbMO2c2Vub3JkIGbDtnIgYXR0IGzDpXNhIHVwcCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImtleWd1YXJkX3Bhc3N3b3JkX2VudGVyX3Bpbl9wYXNzd29yZF9jb2RlIiBtc2dpZD0iNjM4MzQ3MDc1NjI1NDkxNTE0Ij4iQW5nZSBQSU4ta29kIGbDtnIgYXR0IGzDpXNhIHVwcCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImtleWd1YXJkX3Bhc3N3b3JkX3dyb25nX3Bpbl9jb2RlIiBtc2dpZD0iMTI5NTk4NDExNDMzODEwNzcxOCI+IkZlbCBQSU4ta29kISI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImtleWd1YXJkX2xhYmVsX3RleHQiIG1zZ2lkPSI4NjE3OTY0NjEwMjgyOTg0MjQiPiJUcnljayBww6UgTWVudSBvY2ggc2VkYW4gcMOlIDAgb20gZHUgdmlsbCBsw6VzYSB1cHAuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iZW1lcmdlbmN5X2NhbGxfZGlhbG9nX251bWJlcl9mb3JfZGlzcGxheSIgbXNnaWQ9IjY5NjE5MjEwMzE5NTA5MDk3MCI+Ik7DtmRzYW10YWxzbnVtbWVyIjwvc3RyaW5nPgpAQCAtNTQxLDYgKzU0NCw3IEBACiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3JldHVybl90b19jYWxsIiBtc2dpZD0iNTI0NDI1OTc4NTUwMDA0MDAyMSI+IsOFdGVyZ8OlIHRpbGwgc2FtdGFsZXQiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3BhdHRlcm5fY29ycmVjdCIgbXNnaWQ9IjkwMzkwMDg2NTAzNjIyNjEyMzciPiJLb3JyZWt0ISI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fcGF0dGVybl93cm9uZyIgbXNnaWQ9IjQ4MTc1ODMyNzkwNTMxMTIzMTIiPiJGw7Zyc8O2ayBpZ2VuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9wYXNzd29yZF93cm9uZyIgbXNnaWQ9IjYyMzc0NDM2NTczNTgxNjg4MTkiPiJGw7Zyc8O2ayBpZ2VuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9wbHVnZ2VkX2luIiBtc2dpZD0iNjEzMzQzODUyODQyOTQ0NDM1Ij4iTGFkZGFyICg8eGxpZmY6ZyBpZD0iTlVNQkVSIj4lZDwveGxpZmY6Zz48eGxpZmY6ZyBpZD0iUEVSQ0VOVCI+JSU8L3hsaWZmOmc+KSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fY2hhcmdlZCIgbXNnaWQ9IjQ5Mzg5MzA0NTk2MjA5ODk5NzIiPiJMYWRkYWQuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9iYXR0ZXJ5X3Nob3J0IiBtc2dpZD0iMzYxNzU0OTE3ODYwMzM1NDY1NiI+Ijx4bGlmZjpnIGlkPSJOVU1CRVIiPiVkPC94bGlmZjpnPjx4bGlmZjpnIGlkPSJQRVJDRU5UIj4lJTwveGxpZmY6Zz4iPC9zdHJpbmc+CkBAIC01NTUsNiArNTU5LDggQEAKICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fc2ltX2xvY2tlZF9tZXNzYWdlIiBtc2dpZD0iODA2NjY2MDEyOTIwNjAwMTAzOSI+IlNJTS1rb3J0ZXQgw6RyIGzDpXN0LiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fc2ltX3VubG9ja19wcm9ncmVzc19kaWFsb2dfbWVzc2FnZSIgbXNnaWQ9IjU5NTMyMzIxNDA1Mjg4MTI2NCI+IkzDpXNlciB1cHAgU0lNLWtvcnTigKYiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3Rvb19tYW55X2ZhaWxlZF9hdHRlbXB0c19kaWFsb2dfbWVzc2FnZSIgbXNnaWQ9IjM1MTQ3NDIxMDYwNjY4Nzc0NzYiPiJEdSBoYXIgcml0YXQgZGl0dCBncmFmaXNrYSBsw7ZzZW5vcmQgZmVsIDx4bGlmZjpnIGlkPSJOVU1CRVJfMCI+JWQ8L3hsaWZmOmc+IGfDpW5nZXIuICJcblxuIkbDtnJzw7ZrIGlnZW4gb20gPHhsaWZmOmcgaWQ9Ik5VTUJFUl8xIj4lZDwveGxpZmY6Zz4gc2VrdW5kZXIuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl90b29fbWFueV9mYWlsZWRfcGFzc3dvcmRfYXR0ZW1wdHNfZGlhbG9nX21lc3NhZ2UiIG1zZ2lkPSI0OTA2MDM0Mzc2NDI1MTc1MzgxIj4iRHUgaGFyIGFuZ2V0dCBmZWwgbMO2c2Vub3JkIDx4bGlmZjpnIGlkPSJOVU1CRVJfMCI+JWQ8L3hsaWZmOmc+IGfDpW5nZXIuICJcblxuIkbDtnJzw7ZrIGlnZW4gb20gPHhsaWZmOmcgaWQ9Ik5VTUJFUl8xIj4lZDwveGxpZmY6Zz4gc2VrdW5kZXIuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl90b29fbWFueV9mYWlsZWRfcGluX2F0dGVtcHRzX2RpYWxvZ19tZXNzYWdlIiBtc2dpZD0iNjgyNzc0OTIzMTQ2NTE0NTU5MCI+IkR1IGhhciBhbmdldHQgZGluIFBJTi1rb2QgZmVsIDx4bGlmZjpnIGlkPSJOVU1CRVJfMCI+JWQ8L3hsaWZmOmc+IGfDpW5nZXIuICJcblxuIkbDtnJzw7ZrIGlnZW4gb20gPHhsaWZmOmcgaWQ9Ik5VTUJFUl8xIj4lZDwveGxpZmY6Zz4gc2VrdW5kZXIuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9mYWlsZWRfYXR0ZW1wdHNfYWxtb3N0X2dsb2dpbiIgbXNnaWQ9IjMzNTEwMTM4NDIzMjAxMjc4MjciPiJEdSBoYXIgcml0YXQgZGl0dCBncmFmaXNrYSBsw7ZzZW5vcmQgZmVsIDx4bGlmZjpnIGlkPSJOVU1CRVJfMCI+JWQ8L3hsaWZmOmc+IGfDpW5nZXIuIEVmdGVyIDx4bGlmZjpnIGlkPSJOVU1CRVJfMSI+JWQ8L3hsaWZmOmc+IGbDtnJzw7ZrIHRpbGwga29tbWVyIGR1IGF0dCB1cHBtYW5hcyBhdHQgbMOlc2EgdXBwIHRlbGVmb25lbiBtZWQgZGluIEdvb2dsZS1pbmxvZ2duaW5nLiJcblxuIiBGw7Zyc8O2ayBpZ2VuIG9tIDx4bGlmZjpnIGlkPSJOVU1CRVJfMiI+JWQ8L3hsaWZmOmc+IHNla3VuZGVyLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fdG9vX21hbnlfZmFpbGVkX2F0dGVtcHRzX2NvdW50ZG93biIgbXNnaWQ9IjYyNTE0ODAzNDMzOTQzODk2NjUiPiJGw7Zyc8O2ayBpZ2VuIG9tIDx4bGlmZjpnIGlkPSJOVU1CRVIiPiVkPC94bGlmZjpnPiBzZWt1bmRlci4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX2ZvcmdvdF9wYXR0ZXJuX2J1dHRvbl90ZXh0IiBtc2dpZD0iMjYyNjk5OTQ0OTYxMDY5NTkzMCI+Ikdsw7ZtdCBkaXR0IGdyYWZpc2thIGzDtnNlbm9yZD8iPC9zdHJpbmc+CkBAIC02OTksMTQgKzcwNSwxNCBAQAogICAgIDxzdHJpbmcgbmFtZT0iZWxhcHNlZF90aW1lX3Nob3J0X2Zvcm1hdF9tbV9zcyIgbXNnaWQ9IjQ0MzE1NTU5NDM4Mjg3MTE0NzMiPiI8eGxpZmY6ZyBpZD0iTUlOVVRFUyI+JTEkMDJkPC94bGlmZjpnPjo8eGxpZmY6ZyBpZD0iU0VDT05EUyI+JTIkMDJkPC94bGlmZjpnPiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImVsYXBzZWRfdGltZV9zaG9ydF9mb3JtYXRfaF9tbV9zcyIgbXNnaWQ9IjE4NDYwNzE5OTc2MTY2NTQxMjQiPiI8eGxpZmY6ZyBpZD0iSE9VUlMiPiUxJGQ8L3hsaWZmOmc+Ojx4bGlmZjpnIGlkPSJNSU5VVEVTIj4lMiQwMmQ8L3hsaWZmOmc+Ojx4bGlmZjpnIGlkPSJTRUNPTkRTIj4lMyQwMmQ8L3hsaWZmOmc+Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ic2VsZWN0QWxsIiBtc2dpZD0iNjg3NjUxODkyNTg0NDEyOTMzMSI+IlbDpGxqIGFsbGEiPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiAzODg5MTQ5MTIzNjI2ODg4NjM3IC0tPiAgICAgPHN0cmluZyBuYW1lPSJzZWxlY3RUZXh0IiBtc2dpZD0iNDg2MjM1OTMxMTA4ODg5ODg3OCI+Ik1hcmtlcmEgdGV4dCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImN1dCIgbXNnaWQ9IjMwOTI1Njk0MDg0Mzg2MjYyNjEiPiJLbGlwcCB1dCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImNvcHkiIG1zZ2lkPSIyNjgxOTQ2MjI5NTMzNTExOTg3Ij4iS29waWVyYSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBhc3RlIiBtc2dpZD0iNTYyOTg4MDgzNjgwNTAzNjQzMyI+IktsaXN0cmEgaW4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJjb3B5VXJsIiBtc2dpZD0iMjUzODIxMTU3OTU5NjA2NzQwMiI+IktvcGllcmEgd2ViYmFkcmVzcyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InNlbGVjdFRleHRNb2RlIiBtc2dpZD0iNjczODU1NjM0ODg2MTM0NzI0MCI+Ik1hcmtlcmEgdGV4dC4uLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InRleHRTZWxlY3Rpb25DQUJUaXRsZSIgbXNnaWQ9IjUyMzY4NTAzOTQzNzA4MjAzNTciPiJUZXh0bWFya2VyaW5nIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iaW5wdXRNZXRob2QiIG1zZ2lkPSIxNjUzNjMwMDYyMzA0NTY3ODc5Ij4iSW5kYXRhbWV0b2QiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJhZGRUb0RpY3Rpb25hcnkiIG1zZ2lkPSI4NzkzNjI0OTkxNjg2OTQ4NzA5Ij4iTMOkZ2cgdGlsbCBcIjx4bGlmZjpnIGlkPSJXT1JEIj4lczwveGxpZmY6Zz5cIiBpIG9yZGxpc3RhbiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImVkaXRUZXh0TWVudVRpdGxlIiBtc2dpZD0iMTY3Mjk4OTE3Njk1ODU4MTQ1MiI+IlJlZGlnZXJhIHRleHQiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJlZGl0VGV4dE1lbnVUaXRsZSIgbXNnaWQ9IjQ5MDkxMzU1NjQ5NDE4MTU0OTQiPiJUZXh0w6V0Z8OkcmRlciI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9Imxvd19pbnRlcm5hbF9zdG9yYWdlX3ZpZXdfdGl0bGUiIG1zZ2lkPSIxMzk5NzMyNDA4NzAxNjk3NTQ2Ij4iRMOlbGlndCBtZWQgdXRyeW1tZSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9Imxvd19pbnRlcm5hbF9zdG9yYWdlX3ZpZXdfdGV4dCIgbXNnaWQ9IjYzNTEwNjU0NDYxNjM3ODgzNiI+IlRlbGVmb25lbnMgbGFncmluZ3N1dHJ5bW1lIGjDpWxsZXIgcMOlIGF0dCB0YSBzbHV0LiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9Im9rIiBtc2dpZD0iNTk3MDA2MDQzMDU2MjUyNDkxMCI+Ik9LIjwvc3RyaW5nPgpAQCAtNzE0LDYgKzcyMCw3IEBACiAgICAgPHN0cmluZyBuYW1lPSJ5ZXMiIG1zZ2lkPSI1MzYyOTgyMzAzMzM3OTY5MzEyIj4iT0siPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJubyIgbXNnaWQ9IjUxNDE1MzEwNDQ5MzU1NDE0OTciPiJBdmJyeXQiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJkaWFsb2dfYWxlcnRfdGl0bGUiIG1zZ2lkPSIyMDQ5NjU4NzA4NjA5MDQzMTAzIj4iT2JzISI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImxvYWRpbmciIG1zZ2lkPSIxNzYwNzI0OTk4OTI4MjU1MjUwIj4iTMOkc2VyIGluLi4uIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iY2FwaXRhbF9vbiIgbXNnaWQ9IjE1NDQ2ODI3NTU1MTQ0OTQyOTgiPiJQw4UiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJjYXBpdGFsX29mZiIgbXNnaWQ9IjY4MTU4NzAzODY5NzI4MDU4MzIiPiJBViI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9IndoaWNoQXBwbGljYXRpb24iIG1zZ2lkPSI0NTMzMTg1OTQ3MDY0NzczMzg2Ij4iU2x1dGbDtnIgw6V0Z8OkcmQgZ2Vub20gYXR0IGFudsOkbmRhIjwvc3RyaW5nPgpAQCAtODU0LDE1ICs4NjEsMjQgQEAKICAgICA8c3RyaW5nIG5hbWU9ImwydHBfaXBzZWNfcHNrX3Zwbl9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM5NDUwNDM1NjQwMDgzMDMyMzkiPiJJIGbDtnJ2w6RnIGRlbGFkIEwyVFAvSVBTZWMgVlBOLW55Y2tlbCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImwydHBfaXBzZWNfY3J0X3Zwbl9kZXNjcmlwdGlvbiIgbXNnaWQ9IjUzODI3MTQwNzMxMDM2NTM1NzciPiJDZXJ0aWZpa2F0c2Jhc2VyYWQgTDJUUC9JUFNlYyBWUE4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ1cGxvYWRfZmlsZSIgbXNnaWQ9IjI4OTc5NTcxNzIzNjY3MzA0MTYiPiJWw6RsaiBmaWwiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJub19maWxlX2Nob3NlbiIgbXNnaWQ9IjYzNjM2NDg1NjIxNzA3NTk0NjUiPiJJbmdlbiBmaWwgaGFyIHZhbHRzIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icmVzZXQiIG1zZ2lkPSIyNDQ4MTY4MDgwOTY0MjA5OTA4Ij4iw4V0ZXJzdMOkbGwiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJzdWJtaXQiIG1zZ2lkPSIxNjAyMzM1NTcyMDg5OTExOTQxIj4iU2tpY2thIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iZGVzY3JpcHRpb25fc3RhciIgbXNnaWQ9IjI2NTQzMTk4NzQ5MDg1NzYxMzMiPiJmYXZvcml0Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iY2FyX21vZGVfZGlzYWJsZV9ub3RpZmljYXRpb25fdGl0bGUiIG1zZ2lkPSIzMTY0NzY4MjEyMDAzODY0MzE2Ij4iQmlsbMOkZ2UgYWt0aXZlcmF0Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iY2FyX21vZGVfZGlzYWJsZV9ub3RpZmljYXRpb25fbWVzc2FnZSIgbXNnaWQ9IjY2ODY2MzYyNjcyMTY3NTYxNCI+IlbDpGxqIG9tIGR1IHZpbGwgYXZzbHV0YSBiaWxsw6RnZS4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ0ZXRoZXJlZF9ub3RpZmljYXRpb25fdGl0bGUiIG1zZ2lkPSIzMTQ2Njk0MjM0Mzk4MjAyNjAxIj4iSW50ZXJuZXRkZWxuaW5nIGVsbGVyIHN1cmZwdW5rdCBha3RpdmVyYWQiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ0ZXRoZXJlZF9ub3RpZmljYXRpb25fbWVzc2FnZSIgbXNnaWQ9IjMwNjcxMDgzMjM5MDMwNDg5MjciPiJUcnljayBvbSBkdSB2aWxsIGtvbmZpZ3VyZXJhIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iYmFja19idXR0b25fbGFiZWwiIG1zZ2lkPSIyMzAwNDcwMDA0NTAzMzQzNDM5Ij4iVGlsbGJha2EiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJuZXh0X2J1dHRvbl9sYWJlbCIgbXNnaWQ9IjEwODA1NTUxMDQ2Nzc5OTI0MDgiPiJOw6RzdGEiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJza2lwX2J1dHRvbl9sYWJlbCIgbXNnaWQ9IjEyNzUzNjIyOTk0NzE2MzE4MTkiPiJIb3BwYSDDtnZlciI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InRocm90dGxlX3dhcm5pbmdfbm90aWZpY2F0aW9uX3RpdGxlIiBtc2dpZD0iNDg5MDg5NDI2NzQ1NDg2NzI3NiI+IkjDtmcgbW9iaWxkYXRhYW52w6RuZG5pbmciPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ0aHJvdHRsZV93YXJuaW5nX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBtc2dpZD0iMjYwOTczNDc2Mzg0NTcwNTcwOCI+IlRyeWNrIG9tIGR1IHZpbGwgdmV0YSBtZXIgb20gbW9iaWxkYXRhYW52w6RuZG5pbmciPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ0aHJvdHRsZWRfbm90aWZpY2F0aW9uX3RpdGxlIiBtc2dpZD0iNjI2OTU0MTg5NzcyOTc4MTMzMiI+Ikdyw6Ruc2VuIGbDtnIgbW9iaWxkYXRhIGhhciDDtnZlcnNrcmlkaXRzIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idGhyb3R0bGVkX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBtc2dpZD0iNDcxMjM2OTg1NjYwMTI3NTE0NiI+IlRyeWNrIG9tIGR1IHZpbGwgdmV0YSBtZXIgb20gbW9iaWxkYXRhYW52w6RuZG5pbmciPC9zdHJpbmc+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3Igbm9fbWF0Y2hlcyAoODEyOTQyMTkwODkxNTg0MDczNykgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBmaW5kX29uX3BhZ2UgKDE5NDY3OTkyMzM4MjI4MjAzODQpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgbWF0Y2hlc19mb3VuZDpvbmUgKDgxNjcxNDcwODExMzY1Nzk0MzkpIC0tPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIG1hdGNoZXNfZm91bmQ6b3RoZXIgKDQ2NDE4NzI3OTcwNjc2MDkxNzcpIC0tPgogPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvdmFsdWVzLXRyL3N0cmluZ3MueG1sIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy10ci9zdHJpbmdzLnhtbAppbmRleCBlYTQ2ZGIwLi43OGExYTNlIDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvdmFsdWVzLXRyL3N0cmluZ3MueG1sCisrKyBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMtdHIvc3RyaW5ncy54bWwKQEAgLTQzMiw2ICs0MzIsMTAgQEAKICAgICA8c3RyaW5nIG5hbWU9InBvbGljeWRlc2NfZm9yY2VMb2NrIiBtc2dpZD0iMjgxOTg2ODY2NDk0NjA4OTc0MCI+IkNpaGF6IGtpbGl0bGVuZGnEn2luZGUsIMWfaWZyZXNpbmkgeWVuaWRlbiBnaXJtZW5pemkgZ2VyZWt0aXJlbiBkZW5ldGltLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBvbGljeWxhYl93aXBlRGF0YSIgbXNnaWQ9IjM5MTA1NDU0NDY3NTg2Mzk3MTMiPiJUw7xtIHZlcmlsZXJpIHNpbCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBvbGljeWRlc2Nfd2lwZURhdGEiIG1zZ2lkPSIyMzE0MDYwOTMzNzk2Mzk2MjA1Ij4iVMO8bSB2ZXJpbGVyaW5pemkgb25heSBvbG1hZGFuIHNpbG1layBpw6dpbiBmYWJyaWthIGF5YXJsYXLEsW5hIHPEsWbEsXJsYXnEsW4uIjwvc3RyaW5nPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBvbGljeWxhYl9zZXRHbG9iYWxQcm94eSAoMjc4NDgyODI5Mzc0Nzc5MTQ0NikgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwb2xpY3lkZXNjX3NldEdsb2JhbFByb3h5ICg2Mzg3NDk3NDY2NjYwMTU0OTMxKSAtLT4KKyAgICA8c2tpcCAvPgogICA8c3RyaW5nLWFycmF5IG5hbWU9InBob25lVHlwZXMiPgogICAgIDxpdGVtIG1zZ2lkPSI4OTAxMDk4MzM2NjU4NzEwMzU5Ij4iRXYiPC9pdGVtPgogICAgIDxpdGVtIG1zZ2lkPSI4Njk5MjM2NTA1MjcxMzY2MTUiPiJNb2JpbCI8L2l0ZW0+CkBAIC01MjUsMTAgKzUyOSw5IEBACiAgICAgPHN0cmluZyBuYW1lPSJvcmdUeXBlV29yayIgbXNnaWQ9IjI5MjY4ODcwNTA1MzYzODcyIj4ixLDFnyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9Im9yZ1R5cGVPdGhlciIgbXNnaWQ9IjM5NTE3ODExMzE1NzAxMjQwODIiPiJEacSfZXIiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJvcmdUeXBlQ3VzdG9tIiBtc2dpZD0iMjI1NTIzNDE1MzcyMDg4MzIyIj4iw5Z6ZWwiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJjb250YWN0X3N0YXR1c191cGRhdGVfYXR0cmlidXRpb24iIG1zZ2lkPSI1MTEyNTg5ODg2MDk0NDAyNzk1Ij4iPHhsaWZmOmcgaWQ9IlNPVVJDRSI+JTEkczwveGxpZmY6Zz4gYXJhY8SxbMSxxJ/EsXlsYSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImNvbnRhY3Rfc3RhdHVzX3VwZGF0ZV9hdHRyaWJ1dGlvbl93aXRoX2RhdGUiIG1zZ2lkPSI1OTQ1Mzg2Mzc2MzY5OTc5OTA5Ij4iPHhsaWZmOmcgaWQ9IlNPVVJDRSI+JTIkczwveGxpZmY6Zz4gaWxlIDx4bGlmZjpnIGlkPSJEQVRFIj4lMSRzPC94bGlmZjpnPiB0YXJpaGluZGUiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJrZXlndWFyZF9wYXNzd29yZF9lbnRlcl9waW5fY29kZSIgbXNnaWQ9IjM3MzE0ODg4MjcyMTg4NzYxMTUiPiJQSU4ga29kdW51IGdpciI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImtleWd1YXJkX3Bhc3N3b3JkX2VudGVyX3Bhc3N3b3JkX2NvZGUiIG1zZ2lkPSI5MTM4MTU4MzQ0ODEzMjEzNzU0Ij4iS2lsaWRpIGHDp21hayBpw6dpbiDFn2lmcmV5aSBnaXJpbiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImtleWd1YXJkX3Bhc3N3b3JkX2VudGVyX3Bpbl9wYXNzd29yZF9jb2RlIiBtc2dpZD0iNjM4MzQ3MDc1NjI1NDkxNTE0Ij4iS2lsaWRpIGHDp21hayBpw6dpbiBQSU5cJ2kgZ2lyaW4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJrZXlndWFyZF9wYXNzd29yZF93cm9uZ19waW5fY29kZSIgbXNnaWQ9IjEyOTU5ODQxMTQzMzgxMDc3MTgiPiJZYW5sxLHFnyBQSU4ga29kdSEiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJrZXlndWFyZF9sYWJlbF90ZXh0IiBtc2dpZD0iODYxNzk2NDYxMDI4Mjk4NDI0Ij4iS2lsaWRpIGHDp21hayBpw6dpbiDDtm5jZSBNZW7DvFwneWUsIHNvbnJhIDBcJ2EgYmFzxLFuLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImVtZXJnZW5jeV9jYWxsX2RpYWxvZ19udW1iZXJfZm9yX2Rpc3BsYXkiIG1zZ2lkPSI2OTYxOTIxMDMxOTUwOTA5NzAiPiJBY2lsIGR1cnVtIG51bWFyYXPEsSI8L3N0cmluZz4KQEAgLTU0MSw2ICs1NDQsNyBAQAogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9yZXR1cm5fdG9fY2FsbCIgbXNnaWQ9IjUyNDQyNTk3ODU1MDAwNDAwMjEiPiLDh2HEn3LEsXlhIGTDtm4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3BhdHRlcm5fY29ycmVjdCIgbXNnaWQ9IjkwMzkwMDg2NTAzNjIyNjEyMzciPiJEb8SfcnUhIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9wYXR0ZXJuX3dyb25nIiBtc2dpZD0iNDgxNzU4MzI3OTA1MzExMjMxMiI+IsOcemfDvG7DvHosIGzDvHRmZW4geWVuaWRlbiBkZW5leWluIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9wYXNzd29yZF93cm9uZyIgbXNnaWQ9IjYyMzc0NDM2NTczNTgxNjg4MTkiPiJNYWFsZXNlZiwgdGVrcmFyIGRlbmV5aW4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3BsdWdnZWRfaW4iIG1zZ2lkPSI2MTMzNDM4NTI4NDI5NDQ0MzUiPiLFnmFyaiBvbHV5b3IgKDx4bGlmZjpnIGlkPSJQRVJDRU5UIj4lJTwveGxpZmY6Zz48eGxpZmY6ZyBpZD0iTlVNQkVSIj4lZDwveGxpZmY6Zz4pIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9jaGFyZ2VkIiBtc2dpZD0iNDkzODkzMDQ1OTYyMDk4OTk3MiI+IsWeYXJqIG9sZHUuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9iYXR0ZXJ5X3Nob3J0IiBtc2dpZD0iMzYxNzU0OTE3ODYwMzM1NDY1NiI+Ijx4bGlmZjpnIGlkPSJOVU1CRVIiPiVkPC94bGlmZjpnPiA8eGxpZmY6ZyBpZD0iUEVSQ0VOVCI+JSU8L3hsaWZmOmc+Ijwvc3RyaW5nPgpAQCAtNTU1LDYgKzU1OSw4IEBACiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3NpbV9sb2NrZWRfbWVzc2FnZSIgbXNnaWQ9IjgwNjY2NjAxMjkyMDYwMDEwMzkiPiJTSU0ga2FydCBraWxpdGxpLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fc2ltX3VubG9ja19wcm9ncmVzc19kaWFsb2dfbWVzc2FnZSIgbXNnaWQ9IjU5NTMyMzIxNDA1Mjg4MTI2NCI+IlNJTSBrYXJ0IGtpbGlkaSBhw6fEsWzEsXlvcuKApiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fdG9vX21hbnlfZmFpbGVkX2F0dGVtcHRzX2RpYWxvZ19tZXNzYWdlIiBtc2dpZD0iMzUxNDc0MjEwNjA2Njg3NzQ3NiI+IktpbGl0IGHDp21hIGRlc2VuaW5pemkgPHhsaWZmOmcgaWQ9Ik5VTUJFUl8wIj4lZDwveGxpZmY6Zz4ga2V6IHlhbmzEscWfIMOnaXpkaW5pei4gIlxuXG4iTMO8dGZlbiA8eGxpZmY6ZyBpZD0iTlVNQkVSXzEiPiVkPC94bGlmZjpnPiBzYW5peWUgacOnaW5kZSB5ZW5pZGVuIGRlbmV5aW4uIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl90b29fbWFueV9mYWlsZWRfcGFzc3dvcmRfYXR0ZW1wdHNfZGlhbG9nX21lc3NhZ2UiIG1zZ2lkPSI0OTA2MDM0Mzc2NDI1MTc1MzgxIj4ixZ5pZnJlbml6aSA8eGxpZmY6ZyBpZD0iTlVNQkVSXzAiPiVkPC94bGlmZjpnPiBrZXogeWFubMSxxZ8gZ2lyZGluaXouICJcblxuIkzDvHRmZW4gPHhsaWZmOmcgaWQ9Ik5VTUJFUl8xIj4lZDwveGxpZmY6Zz4gc2FuaXllIGnDp2luZGUgeWVuaWRlbiBkZW5leWluLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fdG9vX21hbnlfZmFpbGVkX3Bpbl9hdHRlbXB0c19kaWFsb2dfbWVzc2FnZSIgbXNnaWQ9IjY4Mjc3NDkyMzE0NjUxNDU1OTAiPiJQSU5cJ2luaXppIDx4bGlmZjpnIGlkPSJOVU1CRVJfMCI+JWQ8L3hsaWZmOmc+IGtleiB5YW5sxLHFnyBnaXJkaW5pei4gIlxuXG4iTMO8dGZlbiA8eGxpZmY6ZyBpZD0iTlVNQkVSXzEiPiVkPC94bGlmZjpnPiBzYW5peWUgacOnaW5kZSB5ZW5pZGVuIGRlbmV5aW4uIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9mYWlsZWRfYXR0ZW1wdHNfYWxtb3N0X2dsb2dpbiIgbXNnaWQ9IjMzNTEwMTM4NDIzMjAxMjc4MjciPiJLaWxpdCBhw6dtYSBkZXNlbmluaXppIDx4bGlmZjpnIGlkPSJOVU1CRVJfMCI+JWQ8L3hsaWZmOmc+IGtleiB5YW5sxLHFnyDDp2l6ZGluaXouIDx4bGlmZjpnIGlkPSJOVU1CRVJfMSI+JWQ8L3hsaWZmOmc+IGJhxZ9hcsSxc8SxeiBkZW5lbWVkZW4gc29ucmEgdGVsZWZvbnVudXp1IEdvb2dsZSBvdHVydW0gYcOnbWEgYmlsZ2lsZXJpbml6aSBrdWxsYW5hcmFrIGHDp21hbsSxeiBpc3RlbmlyLiJcblxuIiBMw7x0ZmVuIDx4bGlmZjpnIGlkPSJOVU1CRVJfMiI+JWQ8L3hsaWZmOmc+IHNhbml5ZSBpw6dpbmRlIHllbmlkZW4gZGVuZXlpbi4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3Rvb19tYW55X2ZhaWxlZF9hdHRlbXB0c19jb3VudGRvd24iIG1zZ2lkPSI2MjUxNDgwMzQzMzk0Mzg5NjY1Ij4iPHhsaWZmOmcgaWQ9Ik5VTUJFUiI+JWQ8L3hsaWZmOmc+IHNhbml5ZSBpw6dpbmRlIHllbmlkZW4gZGVuZXlpbi4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX2ZvcmdvdF9wYXR0ZXJuX2J1dHRvbl90ZXh0IiBtc2dpZD0iMjYyNjk5OTQ0OTYxMDY5NTkzMCI+IkRlc2VuaSB1bnV0dHVudXogbXU/Ijwvc3RyaW5nPgpAQCAtNjk5LDE0ICs3MDUsMTQgQEAKICAgICA8c3RyaW5nIG5hbWU9ImVsYXBzZWRfdGltZV9zaG9ydF9mb3JtYXRfbW1fc3MiIG1zZ2lkPSI0NDMxNTU1OTQzODI4NzExNDczIj4iPHhsaWZmOmcgaWQ9Ik1JTlVURVMiPiUxJDAyZDwveGxpZmY6Zz46PHhsaWZmOmcgaWQ9IlNFQ09ORFMiPiUyJDAyZDwveGxpZmY6Zz4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJlbGFwc2VkX3RpbWVfc2hvcnRfZm9ybWF0X2hfbW1fc3MiIG1zZ2lkPSIxODQ2MDcxOTk3NjE2NjU0MTI0Ij4iPHhsaWZmOmcgaWQ9IkhPVVJTIj4lMSRkPC94bGlmZjpnPjo8eGxpZmY6ZyBpZD0iTUlOVVRFUyI+JTIkMDJkPC94bGlmZjpnPjo8eGxpZmY6ZyBpZD0iU0VDT05EUyI+JTMkMDJkPC94bGlmZjpnPiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InNlbGVjdEFsbCIgbXNnaWQ9IjY4NzY1MTg5MjU4NDQxMjkzMzEiPiJUw7xtw7xuw7wgc2XDpyI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDM4ODkxNDkxMjM2MjY4ODg2MzcgLS0+ICAgICA8c3RyaW5nIG5hbWU9InNlbGVjdFRleHQiIG1zZ2lkPSI0ODYyMzU5MzExMDg4ODk4ODc4Ij4iTWV0aW4gc2XDpyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImN1dCIgbXNnaWQ9IjMwOTI1Njk0MDg0Mzg2MjYyNjEiPiJLZXMiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJjb3B5IiBtc2dpZD0iMjY4MTk0NjIyOTUzMzUxMTk4NyI+IktvcHlhbGEiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwYXN0ZSIgbXNnaWQ9IjU2Mjk4ODA4MzY4MDUwMzY0MzMiPiJZYXDEscWfdMSxciI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImNvcHlVcmwiIG1zZ2lkPSIyNTM4MjExNTc5NTk2MDY3NDAyIj4iVVJMXCd5aSBrb3B5YWxhIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ic2VsZWN0VGV4dE1vZGUiIG1zZ2lkPSI2NzM4NTU2MzQ4ODYxMzQ3MjQwIj4iTWV0aW4gc2XDpy4uLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InRleHRTZWxlY3Rpb25DQUJUaXRsZSIgbXNnaWQ9IjUyMzY4NTAzOTQzNzA4MjAzNTciPiJNZXRpbiBzZcOnaW1pIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iaW5wdXRNZXRob2QiIG1zZ2lkPSIxNjUzNjMwMDYyMzA0NTY3ODc5Ij4iR2lyacWfIHnDtm50ZW1pIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iYWRkVG9EaWN0aW9uYXJ5IiBtc2dpZD0iODc5MzYyNDk5MTY4Njk0ODcwOSI+IlwiPHhsaWZmOmcgaWQ9IldPUkQiPiVzPC94bGlmZjpnPlwiIGtlbGltZXNpbmkgc8O2emzDvMSfZSBla2xlIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iZWRpdFRleHRNZW51VGl0bGUiIG1zZ2lkPSIxNjcyOTg5MTc2OTU4NTgxNDUyIj4iTWV0aW4gZMO8emVubGUiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJlZGl0VGV4dE1lbnVUaXRsZSIgbXNnaWQ9IjQ5MDkxMzU1NjQ5NDE4MTU0OTQiPiJNZXRpbiBleWxlbWxlcmkiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb3dfaW50ZXJuYWxfc3RvcmFnZV92aWV3X3RpdGxlIiBtc2dpZD0iMTM5OTczMjQwODcwMTY5NzU0NiI+IlllciBheiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9Imxvd19pbnRlcm5hbF9zdG9yYWdlX3ZpZXdfdGV4dCIgbXNnaWQ9IjYzNTEwNjU0NDYxNjM3ODgzNiI+IlRlbGVmb251biBkZXBvbGFtYSBhbGFuxLEgYXphbMSxeW9yLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9Im9rIiBtc2dpZD0iNTk3MDA2MDQzMDU2MjUyNDkxMCI+IlRhbWFtIjwvc3RyaW5nPgpAQCAtNzE0LDYgKzcyMCw3IEBACiAgICAgPHN0cmluZyBuYW1lPSJ5ZXMiIG1zZ2lkPSI1MzYyOTgyMzAzMzM3OTY5MzEyIj4iVGFtYW0iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJubyIgbXNnaWQ9IjUxNDE1MzEwNDQ5MzU1NDE0OTciPiLEsHB0YWwiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJkaWFsb2dfYWxlcnRfdGl0bGUiIG1zZ2lkPSIyMDQ5NjU4NzA4NjA5MDQzMTAzIj4iRGlra2F0Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibG9hZGluZyIgbXNnaWQ9IjE3NjA3MjQ5OTg5MjgyNTUyNTAiPiJZw7xrbGVuaXlvci4uLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImNhcGl0YWxfb24iIG1zZ2lkPSIxNTQ0NjgyNzU1NTE0NDk0Mjk4Ij4iQcOHSUsiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJjYXBpdGFsX29mZiIgbXNnaWQ9IjY4MTU4NzAzODY5NzI4MDU4MzIiPiJLQVBBTEkiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ3aGljaEFwcGxpY2F0aW9uIiBtc2dpZD0iNDUzMzE4NTk0NzA2NDc3MzM4NiI+IsSwxZ9sZW1pIMWfdW51IGt1bGxhbmFyYWsgdGFtYW1sYSI8L3N0cmluZz4KQEAgLTg1NCwxNSArODYxLDI0IEBACiAgICAgPHN0cmluZyBuYW1lPSJsMnRwX2lwc2VjX3Bza192cG5fZGVzY3JpcHRpb24iIG1zZ2lkPSIzOTQ1MDQzNTY0MDA4MzAzMjM5Ij4iTDJUUC9JUFNlYyBWUE4gdGVtZWxsaSDDtm5jZWRlbiBwYXlsYcWfxLFsbcSxxZ8gYW5haHRhciI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImwydHBfaXBzZWNfY3J0X3Zwbl9kZXNjcmlwdGlvbiIgbXNnaWQ9IjUzODI3MTQwNzMxMDM2NTM1NzciPiJMMlRQL0lQU2VjIFZQTiB0ZW1lbGxpIHNlcnRpZmlrYSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InVwbG9hZF9maWxlIiBtc2dpZD0iMjg5Nzk1NzE3MjM2NjczMDQxNiI+IkRvc3lhIHNlw6ciPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJub19maWxlX2Nob3NlbiIgbXNnaWQ9IjYzNjM2NDg1NjIxNzA3NTk0NjUiPiJTZcOnaWxpIGRvc3lhIHlvayI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InJlc2V0IiBtc2dpZD0iMjQ0ODE2ODA4MDk2NDIwOTkwOCI+IlPEsWbEsXJsYSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InN1Ym1pdCIgbXNnaWQ9IjE2MDIzMzU1NzIwODk5MTE5NDEiPiJHw7ZuZGVyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iZGVzY3JpcHRpb25fc3RhciIgbXNnaWQ9IjI2NTQzMTk4NzQ5MDg1NzYxMzMiPiJmYXZvcmkiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJjYXJfbW9kZV9kaXNhYmxlX25vdGlmaWNhdGlvbl90aXRsZSIgbXNnaWQ9IjMxNjQ3NjgyMTIwMDM4NjQzMTYiPiJBcmFiYSBtb2R1IGV0a2luIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iY2FyX21vZGVfZGlzYWJsZV9ub3RpZmljYXRpb25fbWVzc2FnZSIgbXNnaWQ9IjY2ODY2MzYyNjcyMTY3NTYxNCI+IkFyYWJhIG1vZHVuZGFuIMOnxLFrbWFrIGnDp2luIHNlw6dpbi4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ0ZXRoZXJlZF9ub3RpZmljYXRpb25fdGl0bGUiIG1zZ2lkPSIzMTQ2Njk0MjM0Mzk4MjAyNjAxIj4iRG/En3J1ZGFuIGJhxJ9sYW50xLEgdmV5YSBvcnRhayBlcmnFn2ltIG5va3Rhc8SxIGV0a2luIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idGV0aGVyZWRfbm90aWZpY2F0aW9uX21lc3NhZ2UiIG1zZ2lkPSIzMDY3MTA4MzIzOTAzMDQ4OTI3Ij4iWWFwxLFsYW5kxLFybWFrIGnDp2luIGRva3VudW4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJiYWNrX2J1dHRvbl9sYWJlbCIgbXNnaWQ9IjIzMDA0NzAwMDQ1MDMzNDM0MzkiPiJHZXJpIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibmV4dF9idXR0b25fbGFiZWwiIG1zZ2lkPSIxMDgwNTU1MTA0Njc3OTkyNDA4Ij4ixLBsZXJpIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ic2tpcF9idXR0b25fbGFiZWwiIG1zZ2lkPSIxMjc1MzYyMjk5NDcxNjMxODE5Ij4iQXRsYSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InRocm90dGxlX3dhcm5pbmdfbm90aWZpY2F0aW9uX3RpdGxlIiBtc2dpZD0iNDg5MDg5NDI2NzQ1NDg2NzI3NiI+IlnDvGtzZWsgZMO8emV5ZGUgbW9iaWwgdmVyaSBrdWxsYW7EsW3EsSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InRocm90dGxlX3dhcm5pbmdfbm90aWZpY2F0aW9uX21lc3NhZ2UiIG1zZ2lkPSIyNjA5NzM0NzYzODQ1NzA1NzA4Ij4iTW9iaWwgdmVyaSBrdWxsYW7EsW3EsSBoYWtrxLFuZGEgZGFoYSBmYXpsYSBiaWxnaSBlZGlubWVrIGnDp2luIGRva3VudW4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ0aHJvdHRsZWRfbm90aWZpY2F0aW9uX3RpdGxlIiBtc2dpZD0iNjI2OTU0MTg5NzcyOTc4MTMzMiI+Ik1vYmlsIHZlcmkgbGltaXRpIGHFn8SxbGTEsSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InRocm90dGxlZF9ub3RpZmljYXRpb25fbWVzc2FnZSIgbXNnaWQ9IjQ3MTIzNjk4NTY2MDEyNzUxNDYiPiJNb2JpbCB2ZXJpIGt1bGxhbsSxbcSxIGhha2vEsW5kYSBkYWhhIGZhemxhIGJpbGdpIGVkaW5tZWsgacOnaW4gZG9rdW51biI8L3N0cmluZz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBub19tYXRjaGVzICg4MTI5NDIxOTA4OTE1ODQwNzM3KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGZpbmRfb25fcGFnZSAoMTk0Njc5OTIzMzgyMjgyMDM4NCkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBtYXRjaGVzX2ZvdW5kOm9uZSAoODE2NzE0NzA4MTEzNjU3OTQzOSkgLS0+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgbWF0Y2hlc19mb3VuZDpvdGhlciAoNDY0MTg3Mjc5NzA2NzYwOTE3NykgLS0+CiA8L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy92YWx1ZXMteGxhcmdlL2NvbmZpZy54bWwgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzLXhsYXJnZS9jb25maWcueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdlNWEyN2IKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzLXhsYXJnZS9jb25maWcueG1sCkBAIC0wLDAgKzEsMzcgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tCisvKgorKiogQ29weXJpZ2h0IDIwMDksIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoqCisqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgCisqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIAorKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0IAorKioKKyoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgCisqKgorKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZSAKKyoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIAorKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCAKKyoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKy0tPgorCis8IS0tIFRoZXNlIHJlc291cmNlcyBhcmUgYXJvdW5kIGp1c3QgdG8gYWxsb3cgdGhlaXIgdmFsdWVzIHRvIGJlIGN1c3RvbWl6ZWQKKyAgICAgZm9yIGRpZmZlcmVudCBoYXJkd2FyZSBhbmQgcHJvZHVjdCBidWlsZHMuIC0tPgorPHJlc291cmNlcyB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+CisgICAgPCEtLSBDb21wb25lbnQgdG8gYmUgdXNlZCBhcyB0aGUgc3RhdHVzIGJhciBzZXJ2aWNlLiAgTXVzdCBpbXBsZW1lbnQgdGhlIElTdGF0dXNCYXIKKyAgICAgICAgIGludGVyZmFjZS4gIFRoaXMgbmFtZSBpcyBpbiB0aGUgQ29tcG9uZW50TmFtZSBmbGF0dGVuZWQgZm9ybWF0IChwYWNrYWdlL2NsYXNzKSAgLS0+CisgICAgPHN0cmluZyBuYW1lPSJjb25maWdfc3RhdHVzQmFyQ29tcG9uZW50Ij5jb20uYW5kcm9pZC5zeXN0ZW11aS9jb20uYW5kcm9pZC5zeXN0ZW11aS5zdGF0dXNiYXIudGFibGV0LlRhYmxldFN0YXR1c0JhclNlcnZpY2U8L3N0cmluZz4KKyAgICA8Ym9vbCBuYW1lPSJjb25maWdfc3RhdHVzQmFyQ2FuSGlkZSI+ZmFsc2U8L2Jvb2w+CisKKyAgICA8IS0tIFNob3cgc2xpZGluZyB0YWIgYmVmb3JlIGxvY2tzY3JlZW4gLS0+CisgICAgPGJvb2wgbmFtZT0iY29uZmlnX2VuYWJsZVNsaWRpbmdUYWJGaXJzdCI+ZmFsc2U8L2Jvb2w+CisgICAgPCEtLSBFbmFibGUgbG9ja3NjcmVlbiByb3RhdGlvbiAtLT4KKyAgICA8Ym9vbCBuYW1lPSJjb25maWdfZW5hYmxlTG9ja1NjcmVlblJvdGF0aW9uIj50cnVlPC9ib29sPgorCisgICAgPCEtLSBFbmFibGVzIDNkIHRhc2sgc3dpdGNoZXIgb24geGxhcmdlIGRldmljZSAtLT4KKyAgICA8Ym9vbCBuYW1lPSJjb25maWdfZW5hYmxlUmVjZW50QXBwczNEIj50cnVlPC9ib29sPgorCis8L3Jlc291cmNlcz4KKwpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL3ZhbHVlcy14bGFyZ2UvZGltZW5zLnhtbCBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMteGxhcmdlL2RpbWVucy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTE1Y2IzMAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMteGxhcmdlL2RpbWVucy54bWwKQEAgLTAsMCArMSwzNyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0KKy8qIC8vZGV2aWNlL2FwcHMvY29tbW9uL2Fzc2V0cy9yZXMvYW55L2RpbWVucy54bWwKKyoqCisqKiBDb3B5cmlnaHQgMjAwNiwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKioKKyoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqKgorKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKioKKyoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKy0tPgorPHJlc291cmNlcz4KKyAgICA8ZGltZW4gbmFtZT0ic3RhdHVzX2Jhcl9oZWlnaHQiPjQ4ZGlwPC9kaW1lbj4KKyAgICA8IS0tIEhlaWdodCBvZiB0aGUgc3RhdHVzIGJhciAtLT4KKyAgICA8ZGltZW4gbmFtZT0ic3RhdHVzX2Jhcl9pY29uX3NpemUiPjQ4ZGlwPC9kaW1lbj4KKyAgICA8IS0tIE1hcmdpbiBhdCB0aGUgZWRnZSBvZiB0aGUgc2NyZWVuIHRvIGlnbm9yZSB0b3VjaCBldmVudHMgZm9yIGluIHRoZSB3aW5kb3dzaGFkZS4gLS0+CisgICAgPCEtLSBNYXJnaW4gZm9yIHBlcm1hbmVudCBzY3JlZW4gZGVjb3JhdGlvbnMgYXQgdGhlIGJvdHRvbS4gLS0+CisgICAgPGRpbWVuIG5hbWU9InNjcmVlbl9tYXJnaW5fYm90dG9tIj40OGRpcDwvZGltZW4+CisgICAgCisgICAgPCEtLSBEZWZhdWx0IGhlaWdodCBvZiBhIGtleSBpbiB0aGUgcGFzc3dvcmQga2V5Ym9hcmQgZm9yIGFscGhhIC0tPgorICAgIDxkaW1lbiBuYW1lPSJwYXNzd29yZF9rZXlib2FyZF9rZXlfaGVpZ2h0X2FscGhhIj4wLjM1aW48L2RpbWVuPgorICAgIDwhLS0gRGVmYXVsdCBoZWlnaHQgb2YgYSBrZXkgaW4gdGhlIHBhc3N3b3JkIGtleWJvYXJkIGZvciBudW1lcmljIC0tPgorICAgIDxkaW1lbiBuYW1lPSJwYXNzd29yZF9rZXlib2FyZF9rZXlfaGVpZ2h0X251bWVyaWMiPjAuNDdpbjwvZGltZW4+CisKKyAgICA8IS0tIFRoZSB3aWR0aCB0aGF0IGlzIHVzZWQgd2hlbiBjcmVhdGluZyB0aHVtYm5haWxzIG9mIGFwcGxpY2F0aW9ucy4gLS0+CisgICAgPGRpbWVuIG5hbWU9InRodW1ibmFpbF93aWR0aCI+MjU2ZHA8L2RpbWVuPgorICAgIDwhLS0gVGhlIGhlaWdodCB0aGF0IGlzIHVzZWQgd2hlbiBjcmVhdGluZyB0aHVtYm5haWxzIG9mIGFwcGxpY2F0aW9ucy4gLS0+CisgICAgPGRpbWVuIG5hbWU9InRodW1ibmFpbF9oZWlnaHQiPjI1NWRwPC9kaW1lbj4KKzwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL3ZhbHVlcy14bGFyZ2Uvc3RyaW5ncy54bWwgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzLXhsYXJnZS9zdHJpbmdzLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYzIwYmU2Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy14bGFyZ2Uvc3RyaW5ncy54bWwKQEAgLTAsMCArMSwyNSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0KKy8qIC8vZGV2aWNlL2FwcHMvY29tbW9uL2Fzc2V0cy9yZXMvYW55L3N0cmluZ3MueG1sCisqKgorKiogQ29weXJpZ2h0IDIwMTAsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoqCisqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKioKKyoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoqCisqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCistLT4KKzxyZXNvdXJjZXMgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgorCisgICAgPCEtLSBEbyBub3QgdHJhbnNsYXRlLiAgV2ViVmlldyBVc2VyIEFnZW50IHRhcmdldGVkIGNvbnRlbnQgLS0+CisgICAgPHN0cmluZyBuYW1lPSJ3ZWJfdXNlcl9hZ2VudF90YXJnZXRfY29udGVudCIgdHJhbnNsYXRhYmxlPSJmYWxzZSI+PC9zdHJpbmc+CisKKzwvcmVzb3VyY2VzPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy92YWx1ZXMteGxhcmdlL3N0eWxlcy54bWwgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzLXhsYXJnZS9zdHlsZXMueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ2OTI2NTYKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzLXhsYXJnZS9zdHlsZXMueG1sCkBAIC0wLDAgKzEsMzggQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgIAorICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8cmVzb3VyY2VzPgorICAgIDwhLS0gU3RhdHVzIEJhciBTdHlsZXMgLS0+CisKKyAgICA8c3R5bGUgbmFtZT0iVGV4dEFwcGVhcmFuY2UuU3RhdHVzQmFyIj4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp0ZXh0QXBwZWFyYW5jZSI+P2FuZHJvaWQ6YXR0ci90ZXh0QXBwZWFyYW5jZVNtYWxsPC9pdGVtPgorICAgIDwvc3R5bGU+CisgICAgPHN0eWxlIG5hbWU9IlRleHRBcHBlYXJhbmNlLlN0YXR1c0Jhci5UaWNrZXIiPgorICAgIDwvc3R5bGU+CisgICAgPHN0eWxlIG5hbWU9IlRleHRBcHBlYXJhbmNlLlN0YXR1c0Jhci5UaXRsZSI+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6dGV4dFN0eWxlIj5ib2xkPC9pdGVtPgorICAgIDwvc3R5bGU+CisKKyAgICA8c3R5bGUgbmFtZT0iVGV4dEFwcGVhcmFuY2UuU3RhdHVzQmFyLkljb24iPgorICAgIDwvc3R5bGU+CisgICAgPHN0eWxlIG5hbWU9IlRleHRBcHBlYXJhbmNlLlN0YXR1c0Jhci5FdmVudENvbnRlbnQiPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnRleHRDb2xvciI+P2FuZHJvaWQ6YXR0ci90ZXh0Q29sb3JQcmltYXJ5PC9pdGVtPgorICAgIDwvc3R5bGU+CisgICAgPHN0eWxlIG5hbWU9IlRleHRBcHBlYXJhbmNlLlN0YXR1c0Jhci5FdmVudENvbnRlbnQuVGl0bGUiPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnRleHRTaXplIj4xOHNwPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnRleHRTdHlsZSI+Ym9sZDwvaXRlbT4KKyAgICA8L3N0eWxlPgorPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvdmFsdWVzLXpoLXJDTi9zdHJpbmdzLnhtbCBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMtemgtckNOL3N0cmluZ3MueG1sCmluZGV4IGI5NjM2MTIuLjlhZDhjM2UgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy92YWx1ZXMtemgtckNOL3N0cmluZ3MueG1sCisrKyBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMtemgtckNOL3N0cmluZ3MueG1sCkBAIC00MzIsNiArNDMyLDEwIEBACiAgICAgPHN0cmluZyBuYW1lPSJwb2xpY3lkZXNjX2ZvcmNlTG9jayIgbXNnaWQ9IjI4MTk4Njg2NjQ5NDYwODk3NDAiPiLmjqfliLbkvZXml7bplIHlrprorr7lpIfvvIzov5npnIDopoHmgqjph43mlrDovpPlhaXlr4bnoIHjgIIiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwb2xpY3lsYWJfd2lwZURhdGEiIG1zZ2lkPSIzOTEwNTQ1NDQ2NzU4NjM5NzEzIj4i5riF6Zmk5omA5pyJ5pWw5o2uIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icG9saWN5ZGVzY193aXBlRGF0YSIgbXNnaWQ9IjIzMTQwNjA5MzM3OTYzOTYyMDUiPiLmgaLlpI3lh7rljoLorr7nva7vvIzov5nkvJrlnKjkuI3mj5DnpLrnoa7orqTnmoTmg4XlhrXkuIvliKDpmaTmgqjnmoTmiYDmnInmlbDmja7jgIIiPC9zdHJpbmc+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcG9saWN5bGFiX3NldEdsb2JhbFByb3h5ICgyNzg0ODI4MjkzNzQ3NzkxNDQ2KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBvbGljeWRlc2Nfc2V0R2xvYmFsUHJveHkgKDYzODc0OTc0NjY2NjAxNTQ5MzEpIC0tPgorICAgIDxza2lwIC8+CiAgIDxzdHJpbmctYXJyYXkgbmFtZT0icGhvbmVUeXBlcyI+CiAgICAgPGl0ZW0gbXNnaWQ9Ijg5MDEwOTgzMzY2NTg3MTAzNTkiPiLkvY/lroUiPC9pdGVtPgogICAgIDxpdGVtIG1zZ2lkPSI4Njk5MjM2NTA1MjcxMzY2MTUiPiLmiYvmnLoiPC9pdGVtPgpAQCAtNTI1LDEwICs1MjksOSBAQAogICAgIDxzdHJpbmcgbmFtZT0ib3JnVHlwZVdvcmsiIG1zZ2lkPSIyOTI2ODg3MDUwNTM2Mzg3MiI+IuWFrOWPuCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9Im9yZ1R5cGVPdGhlciIgbXNnaWQ9IjM5NTE3ODExMzE1NzAxMjQwODIiPiLlhbbku5YiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJvcmdUeXBlQ3VzdG9tIiBtc2dpZD0iMjI1NTIzNDE1MzcyMDg4MzIyIj4i6Ieq5a6a5LmJIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iY29udGFjdF9zdGF0dXNfdXBkYXRlX2F0dHJpYnV0aW9uIiBtc2dpZD0iNTExMjU4OTg4NjA5NDQwMjc5NSI+IumAmui/hyA8eGxpZmY6ZyBpZD0iU09VUkNFIj4lMSRzPC94bGlmZjpnPiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImNvbnRhY3Rfc3RhdHVzX3VwZGF0ZV9hdHRyaWJ1dGlvbl93aXRoX2RhdGUiIG1zZ2lkPSI1OTQ1Mzg2Mzc2MzY5OTc5OTA5Ij4i5pe26Ze077yaPHhsaWZmOmcgaWQ9IkRBVEUiPiUxJHM8L3hsaWZmOmc+77yM5pa55byP77yaPHhsaWZmOmcgaWQ9IlNPVVJDRSI+JTIkczwveGxpZmY6Zz4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJrZXlndWFyZF9wYXNzd29yZF9lbnRlcl9waW5fY29kZSIgbXNnaWQ9IjM3MzE0ODg4MjcyMTg4NzYxMTUiPiLovpPlhaUgUElOIOeggSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImtleWd1YXJkX3Bhc3N3b3JkX2VudGVyX3Bhc3N3b3JkX2NvZGUiIG1zZ2lkPSI5MTM4MTU4MzQ0ODEzMjEzNzU0Ij4i6L6T5YWl5a+G56CB6L+b6KGM6Kej6ZSBIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ia2V5Z3VhcmRfcGFzc3dvcmRfZW50ZXJfcGluX3Bhc3N3b3JkX2NvZGUiIG1zZ2lkPSI2MzgzNDcwNzU2MjU0OTE1MTQiPiLovpPlhaUgUElOIOi/m+ihjOino+mUgSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImtleWd1YXJkX3Bhc3N3b3JkX3dyb25nX3Bpbl9jb2RlIiBtc2dpZD0iMTI5NTk4NDExNDMzODEwNzcxOCI+IlBJTiDnoIHkuI3mraPnoa7vvIEiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJrZXlndWFyZF9sYWJlbF90ZXh0IiBtc2dpZD0iODYxNzk2NDYxMDI4Mjk4NDI0Ij4i6KaB6Kej6ZSB77yM6K+35YWI5oyJIE1FTlUg5YaN5oyJIDDjgIIiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJlbWVyZ2VuY3lfY2FsbF9kaWFsb2dfbnVtYmVyX2Zvcl9kaXNwbGF5IiBtc2dpZD0iNjk2MTkyMTAzMTk1MDkwOTcwIj4i5oCl5pWR5oiW5oql6K2m55S16K+dIjwvc3RyaW5nPgpAQCAtNTQxLDYgKzU0NCw3IEBACiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3JldHVybl90b19jYWxsIiBtc2dpZD0iNTI0NDI1OTc4NTUwMDA0MDAyMSI+Iui/lOWbnumAmuivnSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fcGF0dGVybl9jb3JyZWN0IiBtc2dpZD0iOTAzOTAwODY1MDM2MjI2MTIzNyI+Iuato+ehru+8gSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fcGF0dGVybl93cm9uZyIgbXNnaWQ9IjQ4MTc1ODMyNzkwNTMxMTIzMTIiPiLlvojmirHmrYnvvIzor7fph43or5UiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3Bhc3N3b3JkX3dyb25nIiBtc2dpZD0iNjIzNzQ0MzY1NzM1ODE2ODgxOSI+IuW+iOaKseatie+8jOivt+mHjeivlSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fcGx1Z2dlZF9pbiIgbXNnaWQ9IjYxMzM0Mzg1Mjg0Mjk0NDQzNSI+Iuato+WcqOWFheeUtSAoPHhsaWZmOmcgaWQ9Ik5VTUJFUiI+JWQ8L3hsaWZmOmc+PHhsaWZmOmcgaWQ9IlBFUkNFTlQiPiUlPC94bGlmZjpnPikiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX2NoYXJnZWQiIG1zZ2lkPSI0OTM4OTMwNDU5NjIwOTg5OTcyIj4i5bey5YWF5ruh44CCIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9iYXR0ZXJ5X3Nob3J0IiBtc2dpZD0iMzYxNzU0OTE3ODYwMzM1NDY1NiI+Ijx4bGlmZjpnIGlkPSJOVU1CRVIiPiVkPC94bGlmZjpnPjx4bGlmZjpnIGlkPSJQRVJDRU5UIj4lJTwveGxpZmY6Zz4iPC9zdHJpbmc+CkBAIC01NTUsNiArNTU5LDggQEAKICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fc2ltX2xvY2tlZF9tZXNzYWdlIiBtc2dpZD0iODA2NjY2MDEyOTIwNjAwMTAzOSI+IlNJTSDljaHooqvplIHlrpoiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3NpbV91bmxvY2tfcHJvZ3Jlc3NfZGlhbG9nX21lc3NhZ2UiIG1zZ2lkPSI1OTUzMjMyMTQwNTI4ODEyNjQiPiLmraPlnKjop6PplIEgU0lNIOWNoS4uLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fdG9vX21hbnlfZmFpbGVkX2F0dGVtcHRzX2RpYWxvZ19tZXNzYWdlIiBtc2dpZD0iMzUxNDc0MjEwNjA2Njg3NzQ3NiI+IuaCqOW3sue7jyA8eGxpZmY6ZyBpZD0iTlVNQkVSXzAiPiVkPC94bGlmZjpnPiDmrKHnu5jplJnkuoboh6rlt7HnmoTop6PplIHlm77moYjjgIIiXG5cbiLor7flnKggPHhsaWZmOmcgaWQ9Ik5VTUJFUl8xIj4lZDwveGxpZmY6Zz4g56eS5ZCO6YeN6K+V44CCIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl90b29fbWFueV9mYWlsZWRfcGFzc3dvcmRfYXR0ZW1wdHNfZGlhbG9nX21lc3NhZ2UiIG1zZ2lkPSI0OTA2MDM0Mzc2NDI1MTc1MzgxIj4i5oKo5bey57uPIDx4bGlmZjpnIGlkPSJOVU1CRVJfMCI+JWQ8L3hsaWZmOmc+IOasoemUmeivr+WcsOi+k+WFpeS6huWvhueggeOAgiJcblxuIuivt+WcqCA8eGxpZmY6ZyBpZD0iTlVNQkVSXzEiPiVkPC94bGlmZjpnPiDnp5LlkI7ph43or5XjgIIiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3Rvb19tYW55X2ZhaWxlZF9waW5fYXR0ZW1wdHNfZGlhbG9nX21lc3NhZ2UiIG1zZ2lkPSI2ODI3NzQ5MjMxNDY1MTQ1NTkwIj4i5oKo5bey57uPIDx4bGlmZjpnIGlkPSJOVU1CRVJfMCI+JWQ8L3hsaWZmOmc+IOasoemUmeivr+WcsOi+k+WFpeS6hiBQSU7jgIIiXG5cbiLor7flnKggPHhsaWZmOmcgaWQ9Ik5VTUJFUl8xIj4lZDwveGxpZmY6Zz4g56eS5ZCO6YeN6K+V44CCIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9mYWlsZWRfYXR0ZW1wdHNfYWxtb3N0X2dsb2dpbiIgbXNnaWQ9IjMzNTEwMTM4NDIzMjAxMjc4MjciPiLmgqjlt7Lnu48gPHhsaWZmOmcgaWQ9Ik5VTUJFUl8wIj4lZDwveGxpZmY6Zz4g5qyh57uY6ZSZ5LqG6Ieq5bex55qE6Kej6ZSB5Zu+5qGI44CC5aaC5p6c5YaN5bCd6K+VIDx4bGlmZjpnIGlkPSJOVU1CRVJfMSI+JWQ8L3hsaWZmOmc+IOasoeWQjuS7jeS4jeaIkOWKn++8jOezu+e7n+S8muimgeaxguaCqOS9v+eUqOiHquW3seeahCBHb29nbGUg55m75b2V5L+h5oGv6Kej6ZSB5omL5py644CCIlxuXG4i6K+35ZyoIDx4bGlmZjpnIGlkPSJOVU1CRVJfMiI+JWQ8L3hsaWZmOmc+IOenkuWQjumHjeivleOAgiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fdG9vX21hbnlfZmFpbGVkX2F0dGVtcHRzX2NvdW50ZG93biIgbXNnaWQ9IjYyNTE0ODAzNDMzOTQzODk2NjUiPiI8eGxpZmY6ZyBpZD0iTlVNQkVSIj4lZDwveGxpZmY6Zz4g56eS5ZCO6YeN6K+V44CCIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9mb3Jnb3RfcGF0dGVybl9idXR0b25fdGV4dCIgbXNnaWQ9IjI2MjY5OTk0NDk2MTA2OTU5MzAiPiLlv5jorrDkuoblm77moYjvvJ8iPC9zdHJpbmc+CkBAIC02OTksMTQgKzcwNSwxNCBAQAogICAgIDxzdHJpbmcgbmFtZT0iZWxhcHNlZF90aW1lX3Nob3J0X2Zvcm1hdF9tbV9zcyIgbXNnaWQ9IjQ0MzE1NTU5NDM4Mjg3MTE0NzMiPiI8eGxpZmY6ZyBpZD0iTUlOVVRFUyI+JTEkMDJkPC94bGlmZjpnPjo8eGxpZmY6ZyBpZD0iU0VDT05EUyI+JTIkMDJkPC94bGlmZjpnPiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImVsYXBzZWRfdGltZV9zaG9ydF9mb3JtYXRfaF9tbV9zcyIgbXNnaWQ9IjE4NDYwNzE5OTc2MTY2NTQxMjQiPiI8eGxpZmY6ZyBpZD0iSE9VUlMiPiUxJGQ8L3hsaWZmOmc+Ojx4bGlmZjpnIGlkPSJNSU5VVEVTIj4lMiQwMmQ8L3hsaWZmOmc+Ojx4bGlmZjpnIGlkPSJTRUNPTkRTIj4lMyQwMmQ8L3hsaWZmOmc+Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ic2VsZWN0QWxsIiBtc2dpZD0iNjg3NjUxODkyNTg0NDEyOTMzMSI+IuWFqOmAiSI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDM4ODkxNDkxMjM2MjY4ODg2MzcgLS0+ICAgICA8c3RyaW5nIG5hbWU9InNlbGVjdFRleHQiIG1zZ2lkPSI0ODYyMzU5MzExMDg4ODk4ODc4Ij4i6YCJ5oup5paH5a2XIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iY3V0IiBtc2dpZD0iMzA5MjU2OTQwODQzODYyNjI2MSI+IuWJquWIhyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImNvcHkiIG1zZ2lkPSIyNjgxOTQ2MjI5NTMzNTExOTg3Ij4i5aSN5Yi2Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGFzdGUiIG1zZ2lkPSI1NjI5ODgwODM2ODA1MDM2NDMzIj4i57KY6LS0Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iY29weVVybCIgbXNnaWQ9IjI1MzgyMTE1Nzk1OTYwNjc0MDIiPiLlpI3liLbnvZHlnYAiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJzZWxlY3RUZXh0TW9kZSIgbXNnaWQ9IjY3Mzg1NTYzNDg4NjEzNDcyNDAiPiLpgInmi6nmloflrZcuLi4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJ0ZXh0U2VsZWN0aW9uQ0FCVGl0bGUiIG1zZ2lkPSI1MjM2ODUwMzk0MzcwODIwMzU3Ij4i5paH5a2X6YCJ5oupIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iaW5wdXRNZXRob2QiIG1zZ2lkPSIxNjUzNjMwMDYyMzA0NTY3ODc5Ij4i6L6T5YWl5rOVIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iYWRkVG9EaWN0aW9uYXJ5IiBtc2dpZD0iODc5MzYyNDk5MTY4Njk0ODcwOSI+IuWwhuKAnDx4bGlmZjpnIGlkPSJXT1JEIj4lczwveGxpZmY6Zz7igJ3mt7vliqDliLDor43lhbgiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJlZGl0VGV4dE1lbnVUaXRsZSIgbXNnaWQ9IjE2NzI5ODkxNzY5NTg1ODE0NTIiPiLnvJbovpHmloflrZciPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJlZGl0VGV4dE1lbnVUaXRsZSIgbXNnaWQ9IjQ5MDkxMzU1NjQ5NDE4MTU0OTQiPiLmloflrZfmk43kvZwiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb3dfaW50ZXJuYWxfc3RvcmFnZV92aWV3X3RpdGxlIiBtc2dpZD0iMTM5OTczMjQwODcwMTY5NzU0NiI+IuWtmOWCqOepuumXtOS4jei2syI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9Imxvd19pbnRlcm5hbF9zdG9yYWdlX3ZpZXdfdGV4dCIgbXNnaWQ9IjYzNTEwNjU0NDYxNjM3ODgzNiI+IuaJi+acuuWGheWtmOepuumXtOaJgOWJqeS4jeWkmuS6huOAgiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9Im9rIiBtc2dpZD0iNTk3MDA2MDQzMDU2MjUyNDkxMCI+IuehruWumiI8L3N0cmluZz4KQEAgLTcxNCw2ICs3MjAsNyBAQAogICAgIDxzdHJpbmcgbmFtZT0ieWVzIiBtc2dpZD0iNTM2Mjk4MjMwMzMzNzk2OTMxMiI+IuehruWumiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9Im5vIiBtc2dpZD0iNTE0MTUzMTA0NDkzNTU0MTQ5NyI+IuWPlua2iCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImRpYWxvZ19hbGVydF90aXRsZSIgbXNnaWQ9IjIwNDk2NTg3MDg2MDkwNDMxMDMiPiLms6jmhI8iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJsb2FkaW5nIiBtc2dpZD0iMTc2MDcyNDk5ODkyODI1NTI1MCI+Iuato+WcqOi9veWFpS4uLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImNhcGl0YWxfb24iIG1zZ2lkPSIxNTQ0NjgyNzU1NTE0NDk0Mjk4Ij4i5omT5byAIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iY2FwaXRhbF9vZmYiIG1zZ2lkPSI2ODE1ODcwMzg2OTcyODA1ODMyIj4i5YWz6ZetIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0id2hpY2hBcHBsaWNhdGlvbiIgbXNnaWQ9IjQ1MzMxODU5NDcwNjQ3NzMzODYiPiLkvb/nlKjku6XkuIvmlrnlvI/lj5HpgIEiPC9zdHJpbmc+CkBAIC04NTQsMTUgKzg2MSwyNCBAQAogICAgIDxzdHJpbmcgbmFtZT0ibDJ0cF9pcHNlY19wc2tfdnBuX2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzk0NTA0MzU2NDAwODMwMzIzOSI+IuWfuuS6jumihOWFseS6q+WvhumSpeeahCBMMlRQL0lQU2VjIFZQTiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImwydHBfaXBzZWNfY3J0X3Zwbl9kZXNjcmlwdGlvbiIgbXNnaWQ9IjUzODI3MTQwNzMxMDM2NTM1NzciPiLln7rkuo7or4HkuabnmoQgTDJUUC9JUFNlYyBWUE4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ1cGxvYWRfZmlsZSIgbXNnaWQ9IjI4OTc5NTcxNzIzNjY3MzA0MTYiPiLpgInmi6nmlofku7YiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJub19maWxlX2Nob3NlbiIgbXNnaWQ9IjYzNjM2NDg1NjIxNzA3NTk0NjUiPiLmnKrpgInlrprku7vkvZXmlofku7YiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJyZXNldCIgbXNnaWQ9IjI0NDgxNjgwODA5NjQyMDk5MDgiPiLph43nva4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJzdWJtaXQiIG1zZ2lkPSIxNjAyMzM1NTcyMDg5OTExOTQxIj4i5o+Q5LqkIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iZGVzY3JpcHRpb25fc3RhciIgbXNnaWQ9IjI2NTQzMTk4NzQ5MDg1NzYxMzMiPiLmlLbol48iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJjYXJfbW9kZV9kaXNhYmxlX25vdGlmaWNhdGlvbl90aXRsZSIgbXNnaWQ9IjMxNjQ3NjgyMTIwMDM4NjQzMTYiPiLlt7LlkK/nlKjovabovb3mqKHlvI8iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJjYXJfbW9kZV9kaXNhYmxlX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBtc2dpZD0iNjY4NjYzNjI2NzIxNjc1NjE0Ij4i6YCJ5oup6YCA5Ye66L2m6L295qih5byPIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idGV0aGVyZWRfbm90aWZpY2F0aW9uX3RpdGxlIiBtc2dpZD0iMzE0NjY5NDIzNDM5ODIwMjYwMSI+IlVTQiDnu5HlrprmiJbng63ngrnlt7LlkK/nlKgiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ0ZXRoZXJlZF9ub3RpZmljYXRpb25fbWVzc2FnZSIgbXNnaWQ9IjMwNjcxMDgzMjM5MDMwNDg5MjciPiLop6bmkbjlj6/ov5vooYzphY3nva4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJiYWNrX2J1dHRvbl9sYWJlbCIgbXNnaWQ9IjIzMDA0NzAwMDQ1MDMzNDM0MzkiPiLkuIrkuIDmraUiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJuZXh0X2J1dHRvbl9sYWJlbCIgbXNnaWQ9IjEwODA1NTUxMDQ2Nzc5OTI0MDgiPiLkuIvkuIDmraUiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJza2lwX2J1dHRvbl9sYWJlbCIgbXNnaWQ9IjEyNzUzNjIyOTk0NzE2MzE4MTkiPiLot7Pov4ciPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ0aHJvdHRsZV93YXJuaW5nX25vdGlmaWNhdGlvbl90aXRsZSIgbXNnaWQ9IjQ4OTA4OTQyNjc0NTQ4NjcyNzYiPiLmiYvmnLrmtYHph4/ov4flpJoiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ0aHJvdHRsZV93YXJuaW5nX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBtc2dpZD0iMjYwOTczNDc2Mzg0NTcwNTcwOCI+Iui9u+inpuS7peS6huino+acieWFs+aJi+acuua1gemHj+ivpuaDhSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InRocm90dGxlZF9ub3RpZmljYXRpb25fdGl0bGUiIG1zZ2lkPSI2MjY5NTQxODk3NzI5NzgxMzMyIj4i5bey6LaF5Ye65omL5py65pWw5o2u5LiK6ZmQIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idGhyb3R0bGVkX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBtc2dpZD0iNDcxMjM2OTg1NjYwMTI3NTE0NiI+Iui9u+inpuS7peS6huino+acieWFs+aJi+acuua1gemHj+ivpuaDhSI8L3N0cmluZz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBub19tYXRjaGVzICg4MTI5NDIxOTA4OTE1ODQwNzM3KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGZpbmRfb25fcGFnZSAoMTk0Njc5OTIzMzgyMjgyMDM4NCkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBtYXRjaGVzX2ZvdW5kOm9uZSAoODE2NzE0NzA4MTEzNjU3OTQzOSkgLS0+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgbWF0Y2hlc19mb3VuZDpvdGhlciAoNDY0MTg3Mjc5NzA2NzYwOTE3NykgLS0+CiA8L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy92YWx1ZXMtemgtclRXL3N0cmluZ3MueG1sIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy16aC1yVFcvc3RyaW5ncy54bWwKaW5kZXggOTM5NTEwYy4uZWFkNDlhNyAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL3ZhbHVlcy16aC1yVFcvc3RyaW5ncy54bWwKKysrIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy16aC1yVFcvc3RyaW5ncy54bWwKQEAgLTQzMiw2ICs0MzIsMTAgQEAKICAgICA8c3RyaW5nIG5hbWU9InBvbGljeWRlc2NfZm9yY2VMb2NrIiBtc2dpZD0iMjgxOTg2ODY2NDk0NjA4OTc0MCI+Iuijnee9rumOluWumuaZguWPr+WPluW+l+aOp+WItu+8jOS9huW/hemgiOmHjeaWsOi8uOWFpeWvhueivOOAgiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBvbGljeWxhYl93aXBlRGF0YSIgbXNnaWQ9IjM5MTA1NDU0NDY3NTg2Mzk3MTMiPiLmuIXpmaTmiYDmnInos4fmlpkiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwb2xpY3lkZXNjX3dpcGVEYXRhIiBtc2dpZD0iMjMxNDA2MDkzMzc5NjM5NjIwNSI+IumHjeioreeCuuWOn+W7oOioreWumiAo57O757Wx5pyD5Yiq6Zmk5omA5pyJ6LOH5paZ77yM5LiU5LiN5pyD5ZCR5oKo6YCy6KGM56K66KqNKeOAgiI8L3N0cmluZz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwb2xpY3lsYWJfc2V0R2xvYmFsUHJveHkgKDI3ODQ4MjgyOTM3NDc3OTE0NDYpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcG9saWN5ZGVzY19zZXRHbG9iYWxQcm94eSAoNjM4NzQ5NzQ2NjY2MDE1NDkzMSkgLS0+CisgICAgPHNraXAgLz4KICAgPHN0cmluZy1hcnJheSBuYW1lPSJwaG9uZVR5cGVzIj4KICAgICA8aXRlbSBtc2dpZD0iODkwMTA5ODMzNjY1ODcxMDM1OSI+IuS9j+Wutumbu+ipsSI8L2l0ZW0+CiAgICAgPGl0ZW0gbXNnaWQ9Ijg2OTkyMzY1MDUyNzEzNjYxNSI+IuihjOWLlembu+ipsSI8L2l0ZW0+CkBAIC01MjUsMTAgKzUyOSw5IEBACiAgICAgPHN0cmluZyBuYW1lPSJvcmdUeXBlV29yayIgbXNnaWQ9IjI5MjY4ODcwNTA1MzYzODcyIj4i5YWs5Y+4Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ib3JnVHlwZU90aGVyIiBtc2dpZD0iMzk1MTc4MTEzMTU3MDEyNDA4MiI+IuWFtuS7liI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9Im9yZ1R5cGVDdXN0b20iIG1zZ2lkPSIyMjU1MjM0MTUzNzIwODgzMjIiPiLoh6roqIIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJjb250YWN0X3N0YXR1c191cGRhdGVfYXR0cmlidXRpb24iIG1zZ2lkPSI1MTEyNTg5ODg2MDk0NDAyNzk1Ij4i6YCP6YGOIDx4bGlmZjpnIGlkPSJTT1VSQ0UiPiUxJHM8L3hsaWZmOmc+Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iY29udGFjdF9zdGF0dXNfdXBkYXRlX2F0dHJpYnV0aW9uX3dpdGhfZGF0ZSIgbXNnaWQ9IjU5NDUzODYzNzYzNjk5Nzk5MDkiPiI8eGxpZmY6ZyBpZD0iREFURSI+JTEkczwveGxpZmY6Zz7pgI/pgY7jgIw8eGxpZmY6ZyBpZD0iU09VUkNFIj4lMiRzPC94bGlmZjpnPuOAjSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImtleWd1YXJkX3Bhc3N3b3JkX2VudGVyX3Bpbl9jb2RlIiBtc2dpZD0iMzczMTQ4ODgyNzIxODg3NjExNSI+Iui8uOWFpSBQSU4g56K8Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ia2V5Z3VhcmRfcGFzc3dvcmRfZW50ZXJfcGFzc3dvcmRfY29kZSIgbXNnaWQ9IjkxMzgxNTgzNDQ4MTMyMTM3NTQiPiLovLjlhaXlr4bnorzljbPlj6/op6PpjpYiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJrZXlndWFyZF9wYXNzd29yZF9lbnRlcl9waW5fcGFzc3dvcmRfY29kZSIgbXNnaWQ9IjYzODM0NzA3NTYyNTQ5MTUxNCI+Iui8uOWFpSBQSU4g6YCy6KGM6Kej6Y6WIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ia2V5Z3VhcmRfcGFzc3dvcmRfd3JvbmdfcGluX2NvZGUiIG1zZ2lkPSIxMjk1OTg0MTE0MzM4MTA3NzE4Ij4iUElOIOeivOmMr+iqpO+8gSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImtleWd1YXJkX2xhYmVsX3RleHQiIG1zZ2lkPSI4NjE3OTY0NjEwMjgyOTg0MjQiPiLlpoLopoHop6PpjpbvvIzoq4vmjIkgTWVudSDpjbXvvIznhLblvozmjIkgMOOAgiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImVtZXJnZW5jeV9jYWxsX2RpYWxvZ19udW1iZXJfZm9yX2Rpc3BsYXkiIG1zZ2lkPSI2OTYxOTIxMDMxOTUwOTA5NzAiPiLnt4rmgKXpm7voqbHomZ/norwiPC9zdHJpbmc+CkBAIC01NDEsNiArNTQ0LDcgQEAKICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fcmV0dXJuX3RvX2NhbGwiIG1zZ2lkPSI1MjQ0MjU5Nzg1NTAwMDQwMDIxIj4i6L+U5Zue6YCa6KmxIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9wYXR0ZXJuX2NvcnJlY3QiIG1zZ2lkPSI5MDM5MDA4NjUwMzYyMjYxMjM3Ij4i5q2j56K677yBIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9wYXR0ZXJuX3dyb25nIiBtc2dpZD0iNDgxNzU4MzI3OTA1MzExMjMxMiI+IuW+iOaKseatie+8jOiri+WGjeippuS4gOasoSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fcGFzc3dvcmRfd3JvbmciIG1zZ2lkPSI2MjM3NDQzNjU3MzU4MTY4ODE5Ij4i5b6I5oqx5q2J77yM6KuL5YaN6Kmm5LiA5qyhIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9wbHVnZ2VkX2luIiBtc2dpZD0iNjEzMzQzODUyODQyOTQ0NDM1Ij4i5q2j5Zyo5YWF6Zu7ICg8eGxpZmY6ZyBpZD0iTlVNQkVSIj4lZDwveGxpZmY6Zz48eGxpZmY6ZyBpZD0iUEVSQ0VOVCI+JSU8L3hsaWZmOmc+KSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fY2hhcmdlZCIgbXNnaWQ9IjQ5Mzg5MzA0NTk2MjA5ODk5NzIiPiLlhYXpm7vlrozmiJDjgIIiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX2JhdHRlcnlfc2hvcnQiIG1zZ2lkPSIzNjE3NTQ5MTc4NjAzMzU0NjU2Ij4iPHhsaWZmOmcgaWQ9Ik5VTUJFUiI+JWQ8L3hsaWZmOmc+PHhsaWZmOmcgaWQ9IlBFUkNFTlQiPiUlPC94bGlmZjpnPiI8L3N0cmluZz4KQEAgLTU1NSw2ICs1NTksOCBAQAogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9zaW1fbG9ja2VkX21lc3NhZ2UiIG1zZ2lkPSI4MDY2NjYwMTI5MjA2MDAxMDM5Ij4iU0lNIOWNoeW3sumOluWumuOAgiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fc2ltX3VubG9ja19wcm9ncmVzc19kaWFsb2dfbWVzc2FnZSIgbXNnaWQ9IjU5NTMyMzIxNDA1Mjg4MTI2NCI+Iuino+mOliBTSU0g5Y2h5LitLi4uIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl90b29fbWFueV9mYWlsZWRfYXR0ZW1wdHNfZGlhbG9nX21lc3NhZ2UiIG1zZ2lkPSIzNTE0NzQyMTA2MDY2ODc3NDc2Ij4i55Wr5Ye66Kej6Y6W5ZyW5b2i5bey6Yyv6KqkIDx4bGlmZjpnIGlkPSJOVU1CRVJfMCI+JWQ8L3hsaWZmOmc+IOasoeOAgiJcblxuIiDoq4vlnKggPHhsaWZmOmcgaWQ9Ik5VTUJFUl8xIj4lZDwveGxpZmY6Zz4g56eS5b6M5YaN5ZiX6Kmm44CCIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl90b29fbWFueV9mYWlsZWRfcGFzc3dvcmRfYXR0ZW1wdHNfZGlhbG9nX21lc3NhZ2UiIG1zZ2lkPSI0OTA2MDM0Mzc2NDI1MTc1MzgxIj4i5oKo5beyIDx4bGlmZjpnIGlkPSJOVU1CRVJfMCI+JWQ8L3hsaWZmOmc+IOasoei8uOWFpeS4jeato+eiuueahOWvhueivOOAgiJcblxuIuiri+aWvCA8eGxpZmY6ZyBpZD0iTlVNQkVSXzEiPiVkPC94bGlmZjpnPiDnp5Llvozlho3oqabkuIDmrKHjgIIiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3Rvb19tYW55X2ZhaWxlZF9waW5fYXR0ZW1wdHNfZGlhbG9nX21lc3NhZ2UiIG1zZ2lkPSI2ODI3NzQ5MjMxNDY1MTQ1NTkwIj4i5oKo5beyIDx4bGlmZjpnIGlkPSJOVU1CRVJfMCI+JWQ8L3hsaWZmOmc+IOasoei8uOWFpeS4jeato+eiuueahCBQSU7jgIIiXG5cbiLoq4vmlrwgPHhsaWZmOmcgaWQ9Ik5VTUJFUl8xIj4lZDwveGxpZmY6Zz4g56eS5b6M5YaN6Kmm5LiA5qyh44CCIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9mYWlsZWRfYXR0ZW1wdHNfYWxtb3N0X2dsb2dpbiIgbXNnaWQ9IjMzNTEwMTM4NDIzMjAxMjc4MjciPiLnlavlh7rop6PpjpblnJblvaLlt7LpjK/oqqQgPHhsaWZmOmcgaWQ9Ik5VTUJFUl8wIj4lZDwveGxpZmY6Zz4g5qyh44CC5YaN6Yyv6KqkIDx4bGlmZjpnIGlkPSJOVU1CRVJfMSI+JWQ8L3hsaWZmOmc+IOasoeW+jO+8jOezu+e1seacg+imgeaxguS9v+eUqCBHb29nbGUg55m75YWl5L6G6Kej6Y6W44CCIlxuXG4iIOiri+WcqCA8eGxpZmY6ZyBpZD0iTlVNQkVSXzIiPiVkPC94bGlmZjpnPiDnp5Llvozlho3oqabkuIDmrKHjgIIiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3Rvb19tYW55X2ZhaWxlZF9hdHRlbXB0c19jb3VudGRvd24iIG1zZ2lkPSI2MjUxNDgwMzQzMzk0Mzg5NjY1Ij4iPHhsaWZmOmcgaWQ9Ik5VTUJFUiI+JWQ8L3hsaWZmOmc+IOenkuW+jOWGjeippuS4gOasoeOAgiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fZm9yZ290X3BhdHRlcm5fYnV0dG9uX3RleHQiIG1zZ2lkPSIyNjI2OTk5NDQ5NjEwNjk1OTMwIj4i5b+Y6KiY6Kej6Y6W5ZyW5b2i77yfIjwvc3RyaW5nPgpAQCAtNjk5LDE0ICs3MDUsMTQgQEAKICAgICA8c3RyaW5nIG5hbWU9ImVsYXBzZWRfdGltZV9zaG9ydF9mb3JtYXRfbW1fc3MiIG1zZ2lkPSI0NDMxNTU1OTQzODI4NzExNDczIj4iPHhsaWZmOmcgaWQ9Ik1JTlVURVMiPiUxJDAyZDwveGxpZmY6Zz46PHhsaWZmOmcgaWQ9IlNFQ09ORFMiPiUyJDAyZDwveGxpZmY6Zz4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJlbGFwc2VkX3RpbWVfc2hvcnRfZm9ybWF0X2hfbW1fc3MiIG1zZ2lkPSIxODQ2MDcxOTk3NjE2NjU0MTI0Ij4iPHhsaWZmOmcgaWQ9IkhPVVJTIj4lMSRkPC94bGlmZjpnPjo8eGxpZmY6ZyBpZD0iTUlOVVRFUyI+JTIkMDJkPC94bGlmZjpnPjo8eGxpZmY6ZyBpZD0iU0VDT05EUyI+JTMkMDJkPC94bGlmZjpnPiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InNlbGVjdEFsbCIgbXNnaWQ9IjY4NzY1MTg5MjU4NDQxMjkzMzEiPiLlhajpg6jpgbjlj5YiPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiAzODg5MTQ5MTIzNjI2ODg4NjM3IC0tPiAgICAgPHN0cmluZyBuYW1lPSJzZWxlY3RUZXh0IiBtc2dpZD0iNDg2MjM1OTMxMTA4ODg5ODg3OCI+IumBuOWPluaWh+WtlyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImN1dCIgbXNnaWQ9IjMwOTI1Njk0MDg0Mzg2MjYyNjEiPiLliarkuIsiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJjb3B5IiBtc2dpZD0iMjY4MTk0NjIyOTUzMzUxMTk4NyI+Iuikh+ijvSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBhc3RlIiBtc2dpZD0iNTYyOTg4MDgzNjgwNTAzNjQzMyI+IuiyvOS4iiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImNvcHlVcmwiIG1zZ2lkPSIyNTM4MjExNTc5NTk2MDY3NDAyIj4i6KSH6KO957ay5Z2AIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ic2VsZWN0VGV4dE1vZGUiIG1zZ2lkPSI2NzM4NTU2MzQ4ODYxMzQ3MjQwIj4i6YG45Y+W5paH5a2XLi4uIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0idGV4dFNlbGVjdGlvbkNBQlRpdGxlIiBtc2dpZD0iNTIzNjg1MDM5NDM3MDgyMDM1NyI+IumBuOWPluaWh+WtlyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImlucHV0TWV0aG9kIiBtc2dpZD0iMTY1MzYzMDA2MjMwNDU2Nzg3OSI+Iui8uOWFpeaWueW8jyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImFkZFRvRGljdGlvbmFyeSIgbXNnaWQ9Ijg3OTM2MjQ5OTE2ODY5NDg3MDkiPiLlsIfjgIw8eGxpZmY6ZyBpZD0iV09SRCI+JXM8L3hsaWZmOmc+44CN5paw5aKe6Iez5a2X5YW4Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iZWRpdFRleHRNZW51VGl0bGUiIG1zZ2lkPSIxNjcyOTg5MTc2OTU4NTgxNDUyIj4i57eo6Lyv5paH5a2XIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZWRpdFRleHRNZW51VGl0bGUiIG1zZ2lkPSI0OTA5MTM1NTY0OTQxODE1NDk0Ij4i5paH5a2X5YuV5L2cIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG93X2ludGVybmFsX3N0b3JhZ2Vfdmlld190aXRsZSIgbXNnaWQ9IjEzOTk3MzI0MDg3MDE2OTc1NDYiPiLlhLLlrZjnqbrplpPljbPlsIfkuI3otrMiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb3dfaW50ZXJuYWxfc3RvcmFnZV92aWV3X3RleHQiIG1zZ2lkPSI2MzUxMDY1NDQ2MTYzNzg4MzYiPiLmiYvmqZ/lhLLlrZjnqbrplpPljbPlsIfkuI3otrPjgIIiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJvayIgbXNnaWQ9IjU5NzAwNjA0MzA1NjI1MjQ5MTAiPiLnorrlrpoiPC9zdHJpbmc+CkBAIC03MTQsNiArNzIwLDcgQEAKICAgICA8c3RyaW5nIG5hbWU9InllcyIgbXNnaWQ9IjUzNjI5ODIzMDMzMzc5NjkzMTIiPiLnorrlrpoiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJubyIgbXNnaWQ9IjUxNDE1MzEwNDQ5MzU1NDE0OTciPiLlj5bmtogiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJkaWFsb2dfYWxlcnRfdGl0bGUiIG1zZ2lkPSIyMDQ5NjU4NzA4NjA5MDQzMTAzIj4i5rOo5oSPIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibG9hZGluZyIgbXNnaWQ9IjE3NjA3MjQ5OTg5MjgyNTUyNTAiPiLovInlhaXkuK0uLi4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJjYXBpdGFsX29uIiBtc2dpZD0iMTU0NDY4Mjc1NTUxNDQ5NDI5OCI+IumWi+WVnyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImNhcGl0YWxfb2ZmIiBtc2dpZD0iNjgxNTg3MDM4Njk3MjgwNTgzMiI+IumXnOmWiSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9IndoaWNoQXBwbGljYXRpb24iIG1zZ2lkPSI0NTMzMTg1OTQ3MDY0NzczMzg2Ij4i5a6M5oiQ5pON5L2c6ZyA5L2/55SoIjwvc3RyaW5nPgpAQCAtODU0LDE1ICs4NjEsMjQgQEAKICAgICA8c3RyaW5nIG5hbWU9ImwydHBfaXBzZWNfcHNrX3Zwbl9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM5NDUwNDM1NjQwMDgzMDMyMzkiPiLmjqHnlKjpoJDlhYjlhbHnlKjph5HpkbDnmoQgTDJUUC9JUFNlYyBWUE4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsMnRwX2lwc2VjX2NydF92cG5fZGVzY3JpcHRpb24iIG1zZ2lkPSI1MzgyNzE0MDczMTAzNjUzNTc3Ij4i5o6h55So5oaR6K2J55qEIEwyVFAvSVBTZWMgVlBOIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idXBsb2FkX2ZpbGUiIG1zZ2lkPSIyODk3OTU3MTcyMzY2NzMwNDE2Ij4i6YG45pOH5qqU5qGIIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibm9fZmlsZV9jaG9zZW4iIG1zZ2lkPSI2MzYzNjQ4NTYyMTcwNzU5NDY1Ij4i5pyq6YG45pOH5Lu75L2V5qqU5qGIIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icmVzZXQiIG1zZ2lkPSIyNDQ4MTY4MDgwOTY0MjA5OTA4Ij4i6YeN6KitIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ic3VibWl0IiBtc2dpZD0iMTYwMjMzNTU3MjA4OTkxMTk0MSI+IuaPkOS6pCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImRlc2NyaXB0aW9uX3N0YXIiIG1zZ2lkPSIyNjU0MzE5ODc0OTA4NTc2MTMzIj4i5oiR55qE5pyA5oSbIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iY2FyX21vZGVfZGlzYWJsZV9ub3RpZmljYXRpb25fdGl0bGUiIG1zZ2lkPSIzMTY0NzY4MjEyMDAzODY0MzE2Ij4i5bey5ZWf55So6LuK55So5qih5byPIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iY2FyX21vZGVfZGlzYWJsZV9ub3RpZmljYXRpb25fbWVzc2FnZSIgbXNnaWQ9IjY2ODY2MzYyNjcyMTY3NTYxNCI+IumBuOWPlue1kOadn+i7iueUqOaooeW8j+OAgiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InRldGhlcmVkX25vdGlmaWNhdGlvbl90aXRsZSIgbXNnaWQ9IjMxNDY2OTQyMzQzOTgyMDI2MDEiPiLmlbjmk5rpgKPnt5rmiJbnhKHnt5rln7rlnLDlj7Dlt7LllZ/nlKgiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ0ZXRoZXJlZF9ub3RpZmljYXRpb25fbWVzc2FnZSIgbXNnaWQ9IjMwNjcxMDgzMjM5MDMwNDg5MjciPiLovJXop7jku6XoqK3lrpoiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJiYWNrX2J1dHRvbl9sYWJlbCIgbXNnaWQ9IjIzMDA0NzAwMDQ1MDMzNDM0MzkiPiLov5Tlm54iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJuZXh0X2J1dHRvbl9sYWJlbCIgbXNnaWQ9IjEwODA1NTUxMDQ2Nzc5OTI0MDgiPiLnubznuowiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJza2lwX2J1dHRvbl9sYWJlbCIgbXNnaWQ9IjEyNzUzNjIyOTk0NzE2MzE4MTkiPiLnlaXpgY4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ0aHJvdHRsZV93YXJuaW5nX25vdGlmaWNhdGlvbl90aXRsZSIgbXNnaWQ9IjQ4OTA4OTQyNjc0NTQ4NjcyNzYiPiLpq5jooYzli5Xos4fmlpnnlKjph48iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ0aHJvdHRsZV93YXJuaW5nX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBtc2dpZD0iMjYwOTczNDc2Mzg0NTcwNTcwOCI+Iui8leinuOWNs+WPr+eereino+abtOWkmuaciemXnOihjOWLleizh+aWmeeUqOmHj+eahOips+e0sOizh+ioiiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InRocm90dGxlZF9ub3RpZmljYXRpb25fdGl0bGUiIG1zZ2lkPSI2MjY5NTQxODk3NzI5NzgxMzMyIj4i5bey6YGU6KGM5YuV6LOH5paZ5LiK6ZmQIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idGhyb3R0bGVkX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBtc2dpZD0iNDcxMjM2OTg1NjYwMTI3NTE0NiI+Iui8leinuOWNs+WPr+eereino+abtOWkmuaciemXnOihjOWLleizh+aWmeeUqOmHj+eahOips+e0sOizh+ioiiI8L3N0cmluZz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBub19tYXRjaGVzICg4MTI5NDIxOTA4OTE1ODQwNzM3KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGZpbmRfb25fcGFnZSAoMTk0Njc5OTIzMzgyMjgyMDM4NCkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBtYXRjaGVzX2ZvdW5kOm9uZSAoODE2NzE0NzA4MTEzNjU3OTQzOSkgLS0+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgbWF0Y2hlc19mb3VuZDpvdGhlciAoNDY0MTg3Mjc5NzA2NzYwOTE3NykgLS0+CiA8L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy92YWx1ZXMvYXJyYXlzLnhtbCBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMvYXJyYXlzLnhtbAppbmRleCBhZWVlOGFmLi5iNjE4NzU2IDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvdmFsdWVzL2FycmF5cy54bWwKKysrIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy9hcnJheXMueG1sCkBAIC0xMTcsNCArMTE3LDE2IEBACiAgICAgICAgIDxpdGVtPjM8L2l0ZW0+CiAgICAgPC9pbnRlZ2VyLWFycmF5PgogCisgICAgPCEtLSBVc2VkIGluIExvY2FsZVBpY2tlciAtLT4KKyAgICA8c3RyaW5nLWFycmF5IHRyYW5zbGF0YWJsZT0iZmFsc2UiIG5hbWU9InNwZWNpYWxfbG9jYWxlX2NvZGVzIj4KKyAgICAgICAgPGl0ZW0+emhfQ048L2l0ZW0+CisgICAgICAgIDxpdGVtPnpoX1RXPC9pdGVtPgorICAgIDwvc3RyaW5nLWFycmF5PgorCisgICAgPCEtLSBVc2VkIGluIExvY2FsZVBpY2tlciAtLT4KKyAgICA8c3RyaW5nLWFycmF5IHRyYW5zbGF0YWJsZT0iZmFsc2UiIG5hbWU9InNwZWNpYWxfbG9jYWxlX25hbWVzIj4KKyAgICAgICAgPGl0ZW0+5Lit5paHICjnroDkvZMpPC9pdGVtPgorICAgICAgICA8aXRlbT7kuK3mlocgKOe5gemrlCk8L2l0ZW0+CisgICAgPC9zdHJpbmctYXJyYXk+CisKIDwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL3ZhbHVlcy9hdHRycy54bWwgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzL2F0dHJzLnhtbAppbmRleCAxM2MzZTdlLi5iM2QzOWYzIDEwMDc1NQotLS0gYS9jb3JlL3Jlcy9yZXMvdmFsdWVzL2F0dHJzLnhtbAorKysgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzL2F0dHJzLnhtbApAQCAtMTQsOCArMTQsOCBAQAogICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIC0tPgogCi08IS0tIEZvcm1hdHRpbmcgbm90ZTogdGVybWluYXRlIGFsbCBjb21tZW50cyB3aXRoIGEgcGVyaW9kLCB0byBhdm9pZCBicmVha2luZyAKLSAgICAgdGhlIGRvY3VtZW50YXRpb24gb3V0cHV0LiBUbyBzdXBwcmVzcyBjb21tZW50IGxpbmVzIGZyb20gdGhlIGRvY3VtZW50YXRpb24gCis8IS0tIEZvcm1hdHRpbmcgbm90ZTogdGVybWluYXRlIGFsbCBjb21tZW50cyB3aXRoIGEgcGVyaW9kLCB0byBhdm9pZCBicmVha2luZworICAgICB0aGUgZG9jdW1lbnRhdGlvbiBvdXRwdXQuIFRvIHN1cHByZXNzIGNvbW1lbnQgbGluZXMgZnJvbSB0aGUgZG9jdW1lbnRhdGlvbgogICAgICBvdXRwdXQsIGluc2VydCBhbiBlYXQtY29tbWVudCBlbGVtZW50IGFmdGVyIHRoZSBjb21tZW50IGxpbmVzLgogLS0+CiAKQEAgLTQ2LDYgKzQ2LDcgQEAKICAgICAgICAgICAgICB0aGVtZSBkb2VzIG5vdCBzZXQgdGhpcyB2YWx1ZSwgbWVhbmluZyBpdCBpcyBiYXNlZCBvbiB3aGV0aGVyIHRoZQogICAgICAgICAgICAgIHdpbmRvdyBpcyBmbG9hdGluZy4gLS0+CiAgICAgICAgIDxhdHRyIG5hbWU9ImJhY2tncm91bmREaW1FbmFibGVkIiBmb3JtYXQ9ImJvb2xlYW4iIC8+CisgICAgICAgIAogCiAgICAgICAgIDwhLS0gPT09PT09PT09PT0gLS0+CiAgICAgICAgIDwhLS0gVGV4dCBzdHlsZXMgLS0+CkBAIC05NSw2ICs5NiwxMiBAQAogCiAgICAgICAgIDwhLS0gVGV4dCBjb2xvciBmb3IgdXJscyBpbiBzZWFyY2ggc3VnZ2VzdGlvbnMsIHVzZWQgYnkgdGhpbmdzIGxpa2UgZ2xvYmFsIHNlYXJjaCBhbmQgdGhlIGJyb3dzZXIuIEBoaWRlIC0tPgogICAgICAgICA8YXR0ciBuYW1lPSJ0ZXh0Q29sb3JTZWFyY2hVcmwiIGZvcm1hdD0icmVmZXJlbmNlfGNvbG9yIiAvPgorCisgICAgICAgIDwhLS0gQ29sb3Igb2YgaGlnaGxpZ2h0ZWQgdGV4dCwgd2hlbiB1c2VkIGluIGEgbGlnaHQgdGhlbWUuIEBoaWRlIC0tPgorICAgICAgICA8YXR0ciBuYW1lPSJ0ZXh0Q29sb3JIaWdobGlnaHRJbnZlcnNlIiBmb3JtYXQ9InJlZmVyZW5jZXxjb2xvciIgLz4KKyAgICAgICAgPCEtLSBDb2xvciBvZiBsaW5rIHRleHQgKFVSTHMpLCB3aGVuIHVzZWQgaW4gYSBsaWdodCB0aGVtZS4gQGhpZGUgLS0+CisgICAgICAgIDxhdHRyIG5hbWU9InRleHRDb2xvckxpbmtJbnZlcnNlIiBmb3JtYXQ9InJlZmVyZW5jZXxjb2xvciIgLz4KKyAgICAgICAgCiAgICAgICAgIDwhLS0gU2VhcmNoIHdpZGdldCBtb3JlIGNvcnB1cyByZXN1bHQgaXRlbSBiYWNrZ3JvdW5kLiAtLT4KICAgICAgICAgPGF0dHIgbmFtZT0ic2VhcmNoV2lkZ2V0Q29ycHVzSXRlbUJhY2tncm91bmQiIGZvcm1hdD0icmVmZXJlbmNlfGNvbG9yIiAvPgogCkBAIC0xMTcsMTAgKzEyNCwyMCBAQAogICAgICAgICA8IS0tIFRleHQgY29sb3IsIHR5cGVmYWNlLCBzaXplLCBhbmQgc3R5bGUgZm9yIHN5c3RlbSBzZWFyY2ggcmVzdWx0IHN1YnRpdGxlLiBEZWZhdWx0cyB0byBwcmltYXJ5IGludmVyc2UgdGV4dCBjb2xvci4gLS0+CiAgICAgICAgIDxhdHRyIG5hbWU9InRleHRBcHBlYXJhbmNlU2VhcmNoUmVzdWx0U3VidGl0bGUiIGZvcm1hdD0icmVmZXJlbmNlIiAvPgogCi0KICAgICAgICAgPCEtLSBUZXh0IGNvbG9yLCB0eXBlZmFjZSwgc2l6ZSwgYW5kIHN0eWxlIGZvciB0aGUgdGV4dCBpbnNpZGUgb2YgYSBidXR0b24uIC0tPgogICAgICAgICA8YXR0ciBuYW1lPSJ0ZXh0QXBwZWFyYW5jZUJ1dHRvbiIgZm9ybWF0PSJyZWZlcmVuY2UiIC8+CiAKKyAgICAgICAgPCEtLSBUZXh0IGNvbG9yLCB0eXBlZmFjZSwgc2l6ZSwgYW5kIHN0eWxlIGZvciB0aGUgdGV4dCBpbnNpZGUgb2YgYSBwb3B1cCBtZW51LiAtLT4KKyAgICAgICAgPGF0dHIgbmFtZT0idGV4dEFwcGVhcmFuY2VMYXJnZVBvcHVwTWVudSIgZm9ybWF0PSJyZWZlcmVuY2UiIC8+CisKKyAgICAgICAgPCEtLSBUZXh0IGNvbG9yLCB0eXBlZmFjZSwgc2l6ZSwgYW5kIHN0eWxlIGZvciBzbWFsbCB0ZXh0IGluc2lkZSBvZiBhIHBvcHVwIG1lbnUuIC0tPgorICAgICAgICA8YXR0ciBuYW1lPSJ0ZXh0QXBwZWFyYW5jZVNtYWxsUG9wdXBNZW51IiBmb3JtYXQ9InJlZmVyZW5jZSIgLz4KKworICAgICAgICA8IS0tIEVkaXRUZXh0IHRleHQgZm9yZWdyb3VuZCBjb2xvci4gLS0+CisgICAgICAgIDxhdHRyIG5hbWU9ImVkaXRUZXh0Q29sb3IiIGZvcm1hdD0icmVmZXJlbmNlfGNvbG9yIiAvPgorICAgICAgICA8IS0tIEVkaXRUZXh0IGJhY2tncm91bmQgZHJhd2FibGUuIC0tPgorICAgICAgICA8YXR0ciBuYW1lPSJlZGl0VGV4dEJhY2tncm91bmQiIGZvcm1hdD0icmVmZXJlbmNlIiAvPgorCiAgICAgICAgIDwhLS0gQSBzdHlsZWQgc3RyaW5nLCBzcGVjaWZ5aW5nIHRoZSBzdHlsZSB0byBiZSB1c2VkIGZvciBzaG93aW5nCiAgICAgICAgICAgICAgaW5saW5lIGNhbmRpZGF0ZSB0ZXh0IHdoZW4gY29tcG9zaW5nIHdpdGggYW4gaW5wdXQgbWV0aG9kLiAgVGhlCiAgICAgICAgICAgICAgdGV4dCBpdHNlbGYgd2lsbCBiZSBpZ25vcmVkLCBidXQgdGhlIHN0eWxlIHNwYW5zIHdpbGwgYmUgYXBwbGllZApAQCAtMTM3LDYgKzE1NCwxMiBAQAogICAgICAgICA8IS0tIERyYXdhYmxlIHRvIHVzZSBmb3Igc2luZ2xlIGNob2ljZSBpbmRpY2F0b3JzLiAtLT4KICAgICAgICAgPGF0dHIgbmFtZT0ibGlzdENob2ljZUluZGljYXRvclNpbmdsZSIgZm9ybWF0PSJyZWZlcmVuY2UiIC8+CiAKKyAgICAgICAgPCEtLSBEcmF3YWJsZSB1c2VkIGFzIGEgYmFja2dyb3VuZCBmb3Igc2VsZWN0ZWQgbGlzdCBpdGVtcy4gLS0+CisgICAgICAgIDxhdHRyIG5hbWU9Imxpc3RDaG9pY2VCYWNrZ3JvdW5kSW5kaWNhdG9yIiBmb3JtYXQ9InJlZmVyZW5jZSIgLz4KKworICAgICAgICA8IS0tIERyYXdhYmxlIHVzZWQgYXMgYSBiYWNrZ3JvdW5kIGZvciBhY3RpdmF0ZWQgaXRlbXMuIC0tPgorICAgICAgICA8YXR0ciBuYW1lPSJhY3RpdmF0ZWRCYWNrZ3JvdW5kSW5kaWNhdG9yIiBmb3JtYXQ9InJlZmVyZW5jZSIgLz4KKwogICAgICAgICA8IS0tID09PT09PT09PT09PT0gLS0+CiAgICAgICAgIDwhLS0gQnV0dG9uIHN0eWxlcyAtLT4KICAgICAgICAgPCEtLSA9PT09PT09PT09PT09IC0tPgpAQCAtMjQ0LDYgKzI2NywxOSBAQAogICAgICAgICAgICAgIHtAbGluayBhbmRyb2lkLlIuc3R5bGVhYmxlI1dpbmRvd0FuaW1hdGlvbn0uIC0tPgogICAgICAgICA8YXR0ciBuYW1lPSJ3aW5kb3dBbmltYXRpb25TdHlsZSIgZm9ybWF0PSJyZWZlcmVuY2UiIC8+CiAKKyAgICAgICAgPCEtLSBGbGFnIGluZGljYXRpbmcgd2hldGhlciB0aGlzIHdpbmRvdyBzaG91bGQgaGF2ZSBhbiBBY3Rpb24gQmFyCisgICAgICAgICAgICAgaW4gcGxhY2Ugb2YgdGhlIHVzdWFsIHRpdGxlIGJhci4gLS0+CisgICAgICAgIDxhdHRyIG5hbWU9IndpbmRvd0FjdGlvbkJhciIgZm9ybWF0PSJib29sZWFuIiAvPgorCisgICAgICAgIDwhLS0gRmxhZyBpbmRpY2F0aW5nIHdoZXRoZXIgdGhpcyB3aW5kb3cncyBBY3Rpb24gQmFyIHNob3VsZCBvdmVybGF5CisgICAgICAgICAgICAgYXBwbGljYXRpb24gY29udGVudC4gRG9lcyBub3RoaW5nIGlmIHRoZSB3aW5kb3cgd291bGQgbm90CisgICAgICAgICAgICAgaGF2ZSBhbiBBY3Rpb24gQmFyLiAtLT4KKyAgICAgICAgPGF0dHIgbmFtZT0id2luZG93QWN0aW9uQmFyT3ZlcmxheSIgZm9ybWF0PSJib29sZWFuIiAvPgorCisgICAgICAgIDwhLS0gRmxhZyBpbmRpY2F0aW5nIHdoZXRoZXIgYWN0aW9uIG1vZGVzIHNob3VsZCBvdmVybGF5IHdpbmRvdyBjb250ZW50CisgICAgICAgICAgICAgd2hlbiB0aGVyZSBpcyBub3QgcmVzZXJ2ZWQgc3BhY2UgZm9yIHRoZWlyIFVJIChzdWNoIGFzIGFuIEFjdGlvbiBCYXIpLiAtLT4KKyAgICAgICAgPGF0dHIgbmFtZT0id2luZG93QWN0aW9uTW9kZU92ZXJsYXkiIGZvcm1hdD0iYm9vbGVhbiIgLz4KKwogICAgICAgICA8IS0tIERlZmluZXMgdGhlIGRlZmF1bHQgc29mdCBpbnB1dCBzdGF0ZSB0aGF0IHRoaXMgd2luZG93IHdvdWxkCiAgICAgICAgICAgICAgbGlrZSB3aGVuIGl0IGlzIGRpc3BsYXllZC4gLS0+CiAgICAgICAgIDxhdHRyIG5hbWU9IndpbmRvd1NvZnRJbnB1dE1vZGUiPgpAQCAtMzkwLDYgKzQyNiwxMiBAQAogICAgICAgICA8YXR0ciBuYW1lPSJob3Jpem9udGFsU2Nyb2xsVmlld1N0eWxlIiBmb3JtYXQ9InJlZmVyZW5jZSIgLz4KICAgICAgICAgPCEtLSBEZWZhdWx0IFNwaW5uZXIgc3R5bGUuIC0tPgogICAgICAgICA8YXR0ciBuYW1lPSJzcGlubmVyU3R5bGUiIGZvcm1hdD0icmVmZXJlbmNlIiAvPgorICAgICAgICA8IS0tIERlZmF1bHQgZHJvcGRvd24gU3Bpbm5lciBzdHlsZS4gLS0+CisgICAgICAgIDxhdHRyIG5hbWU9ImRyb3BEb3duU3Bpbm5lclN0eWxlIiBmb3JtYXQ9InJlZmVyZW5jZSIgLz4KKyAgICAgICAgPCEtLSBEZWZhdWx0IEFjdGlvbkJhciBkcm9wZG93biBzdHlsZS4gLS0+CisgICAgICAgIDxhdHRyIG5hbWU9ImFjdGlvbkRyb3BEb3duU3R5bGUiIGZvcm1hdD0icmVmZXJlbmNlIiAvPgorICAgICAgICA8IS0tIERlZmF1bHQgYWN0aW9uIGJ1dHRvbiBzdHlsZS4gLS0+CisgICAgICAgIDxhdHRyIG5hbWU9ImFjdGlvbkJ1dHRvblN0eWxlIiBmb3JtYXQ9InJlZmVyZW5jZSIgLz4KICAgICAgICAgPCEtLSBEZWZhdWx0IFN0YXIgc3R5bGUuIC0tPgogICAgICAgICA8YXR0ciBuYW1lPSJzdGFyU3R5bGUiIGZvcm1hdD0icmVmZXJlbmNlIiAvPgogICAgICAgICA8IS0tIERlZmF1bHQgVGFiV2lkZ2V0IHN0eWxlLiAtLT4KQEAgLTQyNCw2ICs0NjYsNDEgQEAKICAgICAgICAgPGF0dHIgbmFtZT0icXVpY2tDb250YWN0QmFkZ2VTdHlsZVNtYWxsV2luZG93TWVkaXVtIiBmb3JtYXQ9InJlZmVyZW5jZSIgLz4KICAgICAgICAgPCEtLSBEZWZhdWx0IHF1aWNrY29udGFjdCBiYWRnZSBzdHlsZSB3aXRoIGxhcmdlIHF1aWNrY29udGFjdCB3aW5kb3cuIC0tPgogICAgICAgICA8YXR0ciBuYW1lPSJxdWlja0NvbnRhY3RCYWRnZVN0eWxlU21hbGxXaW5kb3dMYXJnZSIgZm9ybWF0PSJyZWZlcmVuY2UiIC8+CisgICAgICAgIDwhLS0gRGVmYXVsdCBMaXN0UG9wdXBXaW5kb3cgc3R5bGUuIC0tPgorICAgICAgICA8YXR0ciBuYW1lPSJsaXN0UG9wdXBXaW5kb3dTdHlsZSIgZm9ybWF0PSJyZWZlcmVuY2UiIC8+CisgICAgICAgIDwhLS0gRGVmYXVsdCBQb3B1cE1lbnUgc3R5bGUuIC0tPgorICAgICAgICA8YXR0ciBuYW1lPSJwb3B1cE1lbnVTdHlsZSIgZm9ybWF0PSJyZWZlcmVuY2UiIC8+CisKKyAgICAgICAgPCEtLSA9PT09PT09PT09PT09PT09PT09IC0tPgorICAgICAgICA8IS0tIEFjdGlvbiBiYXIgc3R5bGVzICAgLS0+CisgICAgICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PSAtLT4KKyAgICAgICAgPGVhdC1jb21tZW50IC8+CisgICAgICAgIDwhLS0gRGVmYXVsdCBhbW91bnQgb2YgcGFkZGluZyB0byB1c2UgYmV0d2VlbiBhY3Rpb24gYnV0dG9ucy4gLS0+CisgICAgICAgIDxhdHRyIG5hbWU9ImFjdGlvbkJ1dHRvblBhZGRpbmciIGZvcm1hdD0iZGltZW5zaW9uIiAvPgorICAgICAgICA8IS0tIERlZmF1bHQgc3R5bGUgZm9yIHRhYnMgd2l0aGluIGFuIGFjdGlvbiBiYXIgLS0+CisgICAgICAgIDxhdHRyIG5hbWU9ImFjdGlvbkJhclRhYlN0eWxlIiBmb3JtYXQ9InJlZmVyZW5jZSIgLz4KKyAgICAgICAgPGF0dHIgbmFtZT0iYWN0aW9uQmFyVGFiQmFyU3R5bGUiIGZvcm1hdD0icmVmZXJlbmNlIiAvPgorICAgICAgICA8YXR0ciBuYW1lPSJhY3Rpb25CYXJUYWJUZXh0U3R5bGUiIGZvcm1hdD0icmVmZXJlbmNlIiAvPgorICAgICAgICA8YXR0ciBuYW1lPSJhY3Rpb25PdmVyZmxvd0J1dHRvblN0eWxlIiBmb3JtYXQ9InJlZmVyZW5jZSIgLz4KKyAgICAgICAgPCEtLSBSZWZlcmVuY2UgdG8gYSBzdHlsZSBmb3IgdGhlIEFjdGlvbiBCYXIgLS0+CisgICAgICAgIDxhdHRyIG5hbWU9ImFjdGlvbkJhclN0eWxlIiBmb3JtYXQ9InJlZmVyZW5jZSIgLz4KKyAgICAgICAgPCEtLSBTaXplIG9mIHRoZSBBY3Rpb24gQmFyLCBpbmNsdWRpbmcgdGhlIGNvbnRleHR1YWwKKyAgICAgICAgICAgICBiYXIgdXNlZCB0byBwcmVzZW50IEFjdGlvbiBNb2Rlcy4gLS0+CisgICAgICAgIDxhdHRyIG5hbWU9ImFjdGlvbkJhclNpemUiIGZvcm1hdD0iZGltZW5zaW9uIiA+CisgICAgICAgICAgICA8ZW51bSBuYW1lPSJ3cmFwX2NvbnRlbnQiIHZhbHVlPSIwIiAvPgorICAgICAgICA8L2F0dHI+CisKKworICAgICAgICA8IS0tID09PT09PT09PT09PT09PT09PT0gLS0+CisgICAgICAgIDwhLS0gQWN0aW9uIG1vZGUgc3R5bGVzICAtLT4KKyAgICAgICAgPCEtLSA9PT09PT09PT09PT09PT09PT09IC0tPgorICAgICAgICA8ZWF0LWNvbW1lbnQgLz4KKyAgICAgICAgPGF0dHIgbmFtZT0iYWN0aW9uTW9kZVN0eWxlIiBmb3JtYXQ9InJlZmVyZW5jZSIgLz4KKyAgICAgICAgPGF0dHIgbmFtZT0iYWN0aW9uTW9kZUNsb3NlQnV0dG9uU3R5bGUiIGZvcm1hdD0icmVmZXJlbmNlIiAvPgorICAgICAgICA8IS0tIEJhY2tncm91bmQgZHJhd2FibGUgdG8gdXNlIGZvciBhY3Rpb24gbW9kZSBVSSAtLT4KKyAgICAgICAgPGF0dHIgbmFtZT0iYWN0aW9uTW9kZUJhY2tncm91bmQiIGZvcm1hdD0icmVmZXJlbmNlIiAvPgorICAgICAgICA8IS0tIERyYXdhYmxlIHRvIHVzZSBmb3IgdGhlIGNsb3NlIGFjdGlvbiBtb2RlIGJ1dHRvbiAtLT4KKyAgICAgICAgPGF0dHIgbmFtZT0iYWN0aW9uTW9kZUNsb3NlRHJhd2FibGUiIGZvcm1hdD0icmVmZXJlbmNlIiAvPgogCiAgICAgICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PSAtLT4KICAgICAgICAgPCEtLSBQcmVmZXJlbmNlIHN0eWxlcyAgIC0tPgpAQCAtOTYzLDYgKzEwNDAsOSBAQAogICAgICAgICA8YXR0ciBuYW1lPSJ0ZXh0Q29sb3IiIC8+CiAgICAgICAgIDxhdHRyIG5hbWU9ImJhY2tncm91bmREaW1FbmFibGVkIiAvPgogICAgICAgICA8YXR0ciBuYW1lPSJiYWNrZ3JvdW5kRGltQW1vdW50IiAvPgorICAgICAgICA8YXR0ciBuYW1lPSJ3aW5kb3dBY3Rpb25CYXIiIC8+CisgICAgICAgIDxhdHRyIG5hbWU9IndpbmRvd0FjdGlvbk1vZGVPdmVybGF5IiAvPgorICAgICAgICA8YXR0ciBuYW1lPSJ3aW5kb3dBY3Rpb25CYXJPdmVybGF5IiAvPgogICAgIDwvZGVjbGFyZS1zdHlsZWFibGU+CiAKICAgICA8IS0tIFRoZSBzZXQgb2YgYXR0cmlidXRlcyB0aGF0IGRlc2NyaWJlIGEgQWxlcnREaWFsb2cncyB0aGVtZS4gLS0+CkBAIC05NzksNiArMTA1OSwxNCBAQAogICAgICAgICA8YXR0ciBuYW1lPSJjZW50ZXJNZWRpdW0iIGZvcm1hdD0icmVmZXJlbmNlfGNvbG9yIiAvPgogICAgIDwvZGVjbGFyZS1zdHlsZWFibGU+CiAKKyAgICA8IS0tIEZyYWdtZW50IGFuaW1hdGlvbiBjbGFzcyBhdHRyaWJ1dGVzLiAtLT4KKyAgICA8ZGVjbGFyZS1zdHlsZWFibGUgbmFtZT0iRnJhZ21lbnRBbmltYXRpb24iPgorICAgICAgICA8YXR0ciBuYW1lPSJmcmFnbWVudE9wZW5FbnRlckFuaW1hdGlvbiIgZm9ybWF0PSJyZWZlcmVuY2UiIC8+CisgICAgICAgIDxhdHRyIG5hbWU9ImZyYWdtZW50T3BlbkV4aXRBbmltYXRpb24iIGZvcm1hdD0icmVmZXJlbmNlIiAvPgorICAgICAgICA8YXR0ciBuYW1lPSJmcmFnbWVudENsb3NlRW50ZXJBbmltYXRpb24iIGZvcm1hdD0icmVmZXJlbmNlIiAvPgorICAgICAgICA8YXR0ciBuYW1lPSJmcmFnbWVudENsb3NlRXhpdEFuaW1hdGlvbiIgZm9ybWF0PSJyZWZlcmVuY2UiIC8+CisgICAgPC9kZWNsYXJlLXN0eWxlYWJsZT4KKwogICAgIDwhLS0gV2luZG93IGFuaW1hdGlvbiBjbGFzcyBhdHRyaWJ1dGVzLiAtLT4KICAgICA8ZGVjbGFyZS1zdHlsZWFibGUgbmFtZT0iV2luZG93QW5pbWF0aW9uIj4KICAgICAgICAgPCEtLSBUaGUgYW5pbWF0aW9uIHVzZWQgd2hlbiBhIHdpbmRvdyBpcyBiZWluZyBhZGRlZC4gLS0+CkBAIC05ODksNyArMTA3Nyw3IEBACiAgICAgICAgIDxhdHRyIG5hbWU9IndpbmRvd1Nob3dBbmltYXRpb24iIGZvcm1hdD0icmVmZXJlbmNlIiAvPgogICAgICAgICA8IS0tIFRoZSBhbmltYXRpb24gdXNlZCB3aGVuIGEgd2luZG93IGlzIGdvaW5nIGZyb20gVklTSUJMRSB0byBJTlZJU0lCTEUuIC0tPgogICAgICAgICA8YXR0ciBuYW1lPSJ3aW5kb3dIaWRlQW5pbWF0aW9uIiBmb3JtYXQ9InJlZmVyZW5jZSIgLz4KLSAgICAgICAgCisKICAgICAgICAgPCEtLSAgV2hlbiBvcGVuaW5nIGEgbmV3IGFjdGl2aXR5LCB0aGlzIGlzIHRoZSBhbmltYXRpb24gdGhhdCBpcwogICAgICAgICAgICAgICBydW4gb24gdGhlIG5leHQgYWN0aXZpdHkgKHdoaWNoIGlzIGVudGVyaW5nIHRoZSBzY3JlZW4pLiAtLT4KICAgICAgICAgPGF0dHIgbmFtZT0iYWN0aXZpdHlPcGVuRW50ZXJBbmltYXRpb24iIGZvcm1hdD0icmVmZXJlbmNlIiAvPgpAQCAtMTAzMCw3ICsxMTE4LDcgQEAKICAgICAgICAgICAgICAgYW5pbWF0aW9uIHRoYXQgaXMgcnVuIG9uIHRoZSB0b3AgYWN0aXZpdHkgb2YgdGhlIGN1cnJlbnQgdGFzawogICAgICAgICAgICAgICAod2hpY2ggaXMgZXhpdGluZyB0aGUgc2NyZWVuKS4gLS0+CiAgICAgICAgIDxhdHRyIG5hbWU9InRhc2tUb0JhY2tFeGl0QW5pbWF0aW9uIiBmb3JtYXQ9InJlZmVyZW5jZSIgLz4KLSAgICAgICAgCisKICAgICAgICAgPCEtLSAgV2hlbiBvcGVuaW5nIGEgbmV3IGFjdGl2aXR5IHRoYXQgc2hvd3MgdGhlIHdhbGxwYXBlciwgd2hpbGUKICAgICAgICAgICAgICAgY3VycmVudGx5IG5vdCBzaG93aW5nIHRoZSB3YWxscGFwZXIsIHRoaXMgaXMgdGhlIGFuaW1hdGlvbiB0aGF0CiAgICAgICAgICAgICAgIGlzIHJ1biBvbiB0aGUgbmV3IHdhbGxwYXBlciBhY3Rpdml0eSAod2hpY2ggaXMgZW50ZXJpbmcgdGhlIHNjcmVlbikuIC0tPgpAQCAtMTA0Nyw3ICsxMTM1LDcgQEAKICAgICAgICAgICAgICAgY3VycmVudGx5IHNob3dpbmcgdGhlIHdhbGxwYXBlciwgdGhpcyBpcyB0aGUgYW5pbWF0aW9uIHRoYXQKICAgICAgICAgICAgICAgaXMgcnVuIG9uIHRoZSBvbGQgd2FsbHBhcGVyIGFjdGl2aXR5ICh3aGljaCBpcyBleGl0aW5nIHRoZSBzY3JlZW4pLiAtLT4KICAgICAgICAgPGF0dHIgbmFtZT0id2FsbHBhcGVyQ2xvc2VFeGl0QW5pbWF0aW9uIiBmb3JtYXQ9InJlZmVyZW5jZSIgLz4KLSAgICAgICAgCisKICAgICAgICAgPCEtLSAgV2hlbiBvcGVuaW5nIGEgbmV3IGFjdGl2aXR5IHRoYXQgaXMgb24gdG9wIG9mIHRoZSB3YWxscGFwZXIKICAgICAgICAgICAgICAgd2hlbiB0aGUgY3VycmVudCBhY3Rpdml0eSBpcyBhbHNvIG9uIHRvcCBvZiB0aGUgd2FsbHBhcGVyLAogICAgICAgICAgICAgICB0aGlzIGlzIHRoZSBhbmltYXRpb24gdGhhdCBpcyBydW4gb24gdGhlIG5ldyBhY3Rpdml0eQpAQCAtMTMzMiwyNSArMTQyMCwxNyBAQAogICAgICAgICAgICAgIDxjb2RlPnB1YmxpYyB2b2lkIHNheUhlbGxvKFZpZXcgdik8L2NvZGU+IG1ldGhvZCBvZiB5b3VyIGNvbnRleHQKICAgICAgICAgICAgICAodHlwaWNhbGx5LCB5b3VyIEFjdGl2aXR5KS4gLS0+CiAgICAgICAgIDxhdHRyIG5hbWU9Im9uQ2xpY2siIGZvcm1hdD0ic3RyaW5nIiAvPgotCi0gICAgICAgIDwhLS0gRGVmaW5lcyBvdmVyc2Nyb2xsaW5nIGJlaGF2aW9yLiBUaGlzIHByb3BlcnR5IGlzIHVzZWQgb25seSBpZiB0aGUKLSAgICAgICAgICAgICBWaWV3IGlzIHNjcm9sbGFibGUuIE92ZXJzY3JvbGxpbmcgaXMgdGhlIGFiaWxpdHkgZm9yIHRoZSB1c2VyIHRvCi0gICAgICAgICAgICAgc2Nyb2xsIGEgVmlldyBiZXlvbmQgaXRzIGNvbnRlbnQgYm91bmRhcmllcyBpbnRvIGVtcHR5IHNwYWNlLiAtLT4KLSAgICAgICAgPGF0dHIgbmFtZT0ib3ZlcnNjcm9sbE1vZGUiPgotICAgICAgICAgICAgPCEtLSBBbHdheXMgYWxsb3cgdGhlIHVzZXIgdG8gb3ZlcnNjcm9sbCB0aGUgY29udGVudC4gLS0+Ci0gICAgICAgICAgICA8ZW51bSBuYW1lPSJhbHdheXMiIHZhbHVlPSIwIiAvPgotICAgICAgICAgICAgPCEtLSBPbmx5IGFsbG93IHRoZSB1c2VyIHRvIG92ZXJzY3JvbGwgY29udGVudCBpZiB0aGUgY29udGVudCBpcyBsYXJnZQotICAgICAgICAgICAgICAgICBlbm91Z2ggdG8gbWVhbmluZ2Z1bGx5IHNjcm9sbC4gLS0+Ci0gICAgICAgICAgICA8ZW51bSBuYW1lPSJpZkNvbnRlbnRTY3JvbGxzIiB2YWx1ZT0iMSIgLz4KLSAgICAgICAgICAgIDwhLS0gTmV2ZXIgb3ZlcnNjcm9sbC4gLS0+Ci0gICAgICAgICAgICA8ZW51bSBuYW1lPSJuZXZlciIgdmFsdWU9IjIiIC8+Ci0gICAgICAgIDwvYXR0cj4KICAgICA8L2RlY2xhcmUtc3R5bGVhYmxlPgogCiAgICAgPCEtLSBBdHRyaWJ1dGVzIHRoYXQgY2FuIGJlIHVzZWQgd2l0aCBhIHtAbGluayBhbmRyb2lkLnZpZXcuVmlld0dyb3VwfSBvciBhbnkKICAgICAgICAgIG9mIGl0cyBzdWJjbGFzc2VzLiAgQWxzbyBzZWUge0BsaW5rICNWaWV3R3JvdXBfTGF5b3V0fSBmb3IKICAgICAgICAgIGF0dHJpYnV0ZXMgdGhhdCB0aGlzIGNsYXNzIHByb2Nlc3NlcyBpbiBpdHMgY2hpbGRyZW4uIC0tPgogICAgIDxkZWNsYXJlLXN0eWxlYWJsZSBuYW1lPSJWaWV3R3JvdXAiPgorICAgICAgICA8IS0tIERlZmluZXMgd2hldGhlciBjaGFuZ2VzIGluIGxheW91dCAoY2F1c2VkIGJ5IGFkZGluZyBhbmQgcmVtb3ZpbmcgaXRlbXMpIHNob3VsZAorICAgICAgICAgICAgIGNhdXNlIGEgTGF5b3V0VHJhbnNpdGlvbiB0byBydW4uIFdoZW4gdGhpcyBmbGFnIGlzIHNldCB0byB0cnVlLCBhIGRlZmF1bHQKKyAgICAgICAgICAgICBMYXlvdXRUcmFuc2l0aW9uIG9iamVjdCB3aWxsIGJlIHNldCBvbiB0aGUgVmlld0dyb3VwIGNvbnRhaW5lciBhbmQgZGVmYXVsdAorICAgICAgICAgICAgIGFuaW1hdGlvbnMgd2lsbCBydW4gd2hlbiB0aGVzZSBsYXlvdXQgY2hhbmdlcyBvY2N1ci4tLT4KKyAgICAgICAgPGF0dHIgbmFtZT0iYW5pbWF0ZUxheW91dENoYW5nZXMiIGZvcm1hdD0iYm9vbGVhbiIgLz4KICAgICAgICAgPCEtLSBEZWZpbmVzIHdoZXRoZXIgYSBjaGlsZCBpcyBsaW1pdGVkIHRvIGRyYXcgaW5zaWRlIG9mIGl0cyBib3VuZHMgb3Igbm90LgogICAgICAgICAgICAgIFRoaXMgaXMgdXNlZnVsIHdpdGggYW5pbWF0aW9ucyB0aGF0IHNjYWxlIHRoZSBzaXplIG9mIHRoZSBjaGlsZHJlbiB0byBtb3JlCiAgICAgICAgICAgICAgdGhhbiAxMDAlIGZvciBpbnN0YW5jZS4gSW4gc3VjaCBhIGNhc2UsIHRoaXMgcHJvcGVydHkgc2hvdWxkIGJlIHNldCB0byBmYWxzZQpAQCAtMTQwNCw2ICsxNDg0LDE3IEBACiAgICAgICAgICAgICA8ZW51bSBuYW1lPSJibG9ja3NEZXNjZW5kYW50cyIgdmFsdWU9IjIiIC8+CiAgICAgICAgIDwvYXR0cj4KIAorICAgICAgICA8IS0tIFNldHMgd2hldGhlciB0aGlzIFZpZXdHcm91cCBzaG91bGQgc3BsaXQgTW90aW9uRXZlbnRzCisgICAgICAgICAgICAgdG8gc2VwYXJhdGUgY2hpbGQgdmlld3MgZHVyaW5nIHRvdWNoIGV2ZW50IGRpc3BhdGNoLgorICAgICAgICAgICAgIElmIGZhbHNlIChkZWZhdWx0KSwgdG91Y2ggZXZlbnRzIHdpbGwgYmUgZGlzcGF0Y2hlZCB0bworICAgICAgICAgICAgIHRoZSBjaGlsZCB2aWV3IHdoZXJlIHRoZSBmaXJzdCBwb2ludGVyIHdlbnQgZG93biB1bnRpbAorICAgICAgICAgICAgIHRoZSBsYXN0IHBvaW50ZXIgZ29lcyB1cC4KKyAgICAgICAgICAgICBJZiB0cnVlLCB0b3VjaCBldmVudHMgbWF5IGJlIGRpc3BhdGNoZWQgdG8gbXVsdGlwbGUgY2hpbGRyZW4uCisgICAgICAgICAgICAgTW90aW9uRXZlbnRzIGZvciBlYWNoIHBvaW50ZXIgd2lsbCBiZSBkaXNwYXRjaGVkIHRvIHRoZSBjaGlsZAorICAgICAgICAgICAgIHZpZXcgd2hlcmUgdGhlIGluaXRpYWwgQUNUSU9OX0RPV04gZXZlbnQgaGFwcGVuZWQuCisgICAgICAgICAgICAgU2VlIHtAbGluayBhbmRyb2lkLnZpZXcuVmlld0dyb3VwI3NldE1vdGlvbkV2ZW50U3BsaXR0aW5nRW5hYmxlZChib29sZWFuKX0KKyAgICAgICAgICAgICBmb3IgbW9yZSBpbmZvcm1hdGlvbi4gLS0+CisgICAgICAgIDxhdHRyIG5hbWU9InNwbGl0TW90aW9uRXZlbnRzIiBmb3JtYXQ9ImJvb2xlYW4iIC8+CiAgICAgPC9kZWNsYXJlLXN0eWxlYWJsZT4KIAogICAgIDwhLS0gQSB7QGxpbmsgYW5kcm9pZC52aWV3LlZpZXdTdHVifSBsZXRzIHlvdSBsYXppbHkgaW5jbHVkZSBvdGhlciBYTUwgbGF5b3V0cwpAQCAtMTUwNSw2ICsxNTk2LDI4IEBACiAgICAgICAgIDxhdHRyIG5hbWU9ImlzRGVmYXVsdCIgZm9ybWF0PSJib29sZWFuIiAvPgogICAgIDwvZGVjbGFyZS1zdHlsZWFibGU+CiAKKyAgICA8IS0tIFRoaXMgaXMgdGhlIHN1YnR5cGUgb2YgSW5wdXRNZXRob2QuIFN1YnR5cGUgY2FuIGRlc2NyaWJlIGxvY2FsZXMgKGUuZy4gZW5fVVMsIGZyX0ZSLi4uKQorICAgICAgICAgYW5kIG1vZGVzIChlLmcuIHZvaWNlLCBrZXlib2FyZC4uLiksIGFuZCBpcyB1c2VkIGZvciBJTUUgc3dpdGNoLiBUaGlzIHN1YnR5cGUgYWxsb3dzCisgICAgICAgICB0aGUgc3lzdGVtIHRvIGNhbGwgdGhlIHNwZWNpZmllZCBzdWJ0eXBlIG9mIHRoZSBJTUUgZGlyZWN0bHkuIC0tPgorICAgIDxkZWNsYXJlLXN0eWxlYWJsZSBuYW1lPSJJbnB1dE1ldGhvZF9TdWJ0eXBlIj4KKyAgICAgICAgPCEtLSBUaGUgbmFtZSBvZiB0aGUgc3VidHlwZS4gLS0+CisgICAgICAgIDxhdHRyIG5hbWU9ImxhYmVsIiAvPgorICAgICAgICA8IS0tIFRoZSBpY29uIG9mIHRoZSBzdWJ0eXBlLiAtLT4KKyAgICAgICAgPGF0dHIgbmFtZT0iaWNvbiIgLz4KKyAgICAgICAgPCEtLSBUaGUgbG9jYWxlIG9mIHRoZSBzdWJ0eXBlLiBUaGlzIHN0cmluZyBzaG91bGQgYmUgYSBsb2NhbGUgKGUuZy4gZW5fVVMsIGZyX0ZSLi4uKQorICAgICAgICAgICAgIGFuZCB3aWxsIGJlIHBhc3NlZCB0byB0aGUgSU1FIHdoZW4gdGhlIGZyYW1ld29yayBjYWxscyB0aGUgSU1FCisgICAgICAgICAgICAgd2l0aCB0aGUgc3VidHlwZS4gVGhpcyBpcyBhbHNvIHVzZWQgYnkgdGhlIGZyYW1ld29yayB0byBrbm93IHRoZSBzdXBwb3J0ZWQgbG9jYWxlcworICAgICAgICAgICAgIG9mIHRoZSBJTUUuICAtLT4KKyAgICAgICAgPGF0dHIgbmFtZT0iaW1lU3VidHlwZUxvY2FsZSIgZm9ybWF0PSJzdHJpbmciIC8+CisgICAgICAgIDwhLS0gVGhlIG1vZGUgb2YgdGhlIHN1YnR5cGUuIFRoaXMgc3RyaW5nIGNhbiBiZSBhIG1vZGUgKGUuZy4gdm9pY2UsIGtleWJvYXJkLi4uKSBhbmQgdGhpcworICAgICAgICAgICAgIHN0cmluZyB3aWxsIGJlIHBhc3NlZCB0byB0aGUgSU1FIHdoZW4gdGhlIGZyYW1ld29yayBjYWxscyB0aGUgSU1FIHdpdGggdGhlCisgICAgICAgICAgICAgc3VidHlwZS4gIC0tPgorICAgICAgICA8YXR0ciBuYW1lPSJpbWVTdWJ0eXBlTW9kZSIgZm9ybWF0PSJzdHJpbmciIC8+CisgICAgICAgIDwhLS0gVGhlIGV4dHJhIHZhbHVlIG9mIHRoZSBzdWJ0eXBlLiBUaGlzIHN0cmluZyBjYW4gYmUgYW55IHN0cmluZyBhbmQgd2lsbCBiZSBwYXNzZWQgdG8KKyAgICAgICAgICAgICB0aGUgSU1FIHdoZW4gdGhlIGZyYW1ld29yayBjYWxscyB0aGUgSU1FIHdpdGggdGhlIHN1YnR5cGUuICAtLT4KKyAgICAgICAgPGF0dHIgbmFtZT0iaW1lU3VidHlwZUV4dHJhVmFsdWUiIGZvcm1hdD0ic3RyaW5nIiAvPgorICAgIDwvZGVjbGFyZS1zdHlsZWFibGU+CisKICAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+CiAgICAgPCEtLSBXaWRnZXQgcGFja2FnZSBjbGFzcyBhdHRyaWJ1dGVzIC0tPgogICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KQEAgLTE1NTQsNiArMTY2NywyOCBAQAogICAgICAgICAgICAgIHdpbGwgdXNlIG9ubHkgdGhlIG51bWJlciBvZiBpdGVtcyBpbiB0aGUgYWRhcHRlciBhbmQgdGhlIG51bWJlciBvZiBpdGVtcyB2aXNpYmxlCiAgICAgICAgICAgICAgb24gc2NyZWVuIHRvIGRldGVybWluZSB0aGUgc2Nyb2xsYmFyJ3MgcHJvcGVydGllcy4gLS0+CiAgICAgICAgIDxhdHRyIG5hbWU9InNtb290aFNjcm9sbGJhciIgZm9ybWF0PSJib29sZWFuIiAvPgorICAgICAgICA8IS0tIEEgcmVmZXJlbmNlIHRvIGFuIFhNTCBkZXNjcmlwdGlvbiBvZiB0aGUgYWRhcHRlciB0byBhdHRhY2ggdG8gdGhlIGxpc3QuIC0tPgorICAgICAgICA8YXR0ciBuYW1lPSJhZGFwdGVyIiBmb3JtYXQ9InJlZmVyZW5jZSIgLz4KKyAgICAgICAgPCEtLSBEZWZpbmVzIHRoZSBjaG9pY2UgYmVoYXZpb3IgZm9yIHRoZSB2aWV3LiBCeSBkZWZhdWx0LCBsaXN0cyBkbyBub3QgaGF2ZQorICAgICAgICAgICAgIGFueSBjaG9pY2UgYmVoYXZpb3IuIEJ5IHNldHRpbmcgdGhlIGNob2ljZU1vZGUgdG8gc2luZ2xlQ2hvaWNlLCB0aGUgbGlzdAorICAgICAgICAgICAgIGFsbG93cyB1cCB0byBvbmUgaXRlbSB0byBiZSBpbiBhIGNob3NlbiBzdGF0ZS4gQnkgc2V0dGluZyB0aGUgY2hvaWNlTW9kZSB0bworICAgICAgICAgICAgIG11bHRpcGxlQ2hvaWNlLCB0aGUgbGlzdCBhbGxvd3MgYW55IG51bWJlciBvZiBpdGVtcyB0byBiZSBjaG9zZW4uCisgICAgICAgICAgICAgRmluYWxseSwgYnkgc2V0dGluZyB0aGUgY2hvaWNlTW9kZSB0byBtdWx0aXBsZUNob2ljZU1vZGFsIHRoZSBsaXN0IGFsbG93cworICAgICAgICAgICAgIGFueSBudW1iZXIgb2YgaXRlbXMgdG8gYmUgY2hvc2VuIGluIGEgc3BlY2lhbCBzZWxlY3Rpb24gbW9kZS4KKyAgICAgICAgICAgICBUaGUgYXBwbGljYXRpb24gd2lsbCBzdXBwbHkgYQorICAgICAgICAgICAgIHtAbGluayBhbmRyb2lkLndpZGdldC5BYnNMaXN0Vmlldy5NdWx0aUNob2ljZU1vZGVMaXN0ZW5lcn0gdXNpbmcKKyAgICAgICAgICAgICB7QGxpbmsgYW5kcm9pZC53aWRnZXQuQWJzTGlzdFZpZXcjc2V0TXVsdGlDaG9pY2VNb2RlTGlzdGVuZXJ9IHRvIGNvbnRyb2wgdGhlCisgICAgICAgICAgICAgc2VsZWN0aW9uIG1vZGUuIFRoaXMgdXNlcyB0aGUge0BsaW5rIGFuZHJvaWQudmlldy5BY3Rpb25Nb2RlfSBBUEkuIC0tPgorICAgICAgICA8YXR0ciBuYW1lPSJjaG9pY2VNb2RlIj4KKyAgICAgICAgICAgIDwhLS0gTm9ybWFsIGxpc3QgdGhhdCBkb2VzIG5vdCBpbmRpY2F0ZSBjaG9pY2VzLiAtLT4KKyAgICAgICAgICAgIDxlbnVtIG5hbWU9Im5vbmUiIHZhbHVlPSIwIiAvPgorICAgICAgICAgICAgPCEtLSBUaGUgbGlzdCBhbGxvd3MgdXAgdG8gb25lIGNob2ljZS4gLS0+CisgICAgICAgICAgICA8ZW51bSBuYW1lPSJzaW5nbGVDaG9pY2UiIHZhbHVlPSIxIiAvPgorICAgICAgICAgICAgPCEtLSBUaGUgbGlzdCBhbGxvd3MgbXVsdGlwbGUgY2hvaWNlcy4gLS0+CisgICAgICAgICAgICA8ZW51bSBuYW1lPSJtdWx0aXBsZUNob2ljZSIgdmFsdWU9IjIiIC8+CisgICAgICAgICAgICA8IS0tIFRoZSBsaXN0IGFsbG93cyBtdWx0aXBsZSBjaG9pY2VzIGluIGEgY3VzdG9tIHNlbGVjdGlvbiBtb2RlLiAtLT4KKyAgICAgICAgICAgIDxlbnVtIG5hbWU9Im11bHRpcGxlQ2hvaWNlTW9kYWwiIHZhbHVlPSIzIiAvPgorICAgICAgICA8L2F0dHI+CiAgICAgPC9kZWNsYXJlLXN0eWxlYWJsZT4KICAgICA8ZGVjbGFyZS1zdHlsZWFibGUgbmFtZT0iQWJzU3Bpbm5lciI+CiAgICAgICAgIDwhLS0gUmVmZXJlbmNlIHRvIGFuIGFycmF5IHJlc291cmNlIHRoYXQgd2lsbCBwb3B1bGF0ZSB0aGUgU3Bpbm5lci4gIEZvciBzdGF0aWMgY29udGVudCwKQEAgLTE3NDksNyArMTg4NCw3IEBACiAgICAgICAgIDwhLS0gV2hlbiBzZXQgdG8gdHJ1ZSwgYWxsIGNoaWxkcmVuIHdpdGggYSB3ZWlnaHQgd2lsbCBiZSBjb25zaWRlcmVkIGhhdmluZwogICAgICAgICAgICAgIHRoZSBtaW5pbXVtIHNpemUgb2YgdGhlIGxhcmdlc3QgY2hpbGQuIElmIGZhbHNlLCBhbGwgY2hpbGRyZW4gYXJlCiAgICAgICAgICAgICAgbWVhc3VyZWQgbm9ybWFsbHkuIC0tPgotICAgICAgICA8YXR0ciBuYW1lPSJ1c2VMYXJnZXN0Q2hpbGQiIGZvcm1hdD0iYm9vbGVhbiIgLz4KKyAgICAgICAgPGF0dHIgbmFtZT0ibWVhc3VyZVdpdGhMYXJnZXN0Q2hpbGQiIGZvcm1hdD0iYm9vbGVhbiIgLz4KICAgICA8L2RlY2xhcmUtc3R5bGVhYmxlPgogICAgIDxkZWNsYXJlLXN0eWxlYWJsZSBuYW1lPSJMaXN0VmlldyI+CiAgICAgICAgIDwhLS0gUmVmZXJlbmNlIHRvIGFuIGFycmF5IHJlc291cmNlIHRoYXQgd2lsbCBwb3B1bGF0ZSB0aGUgTGlzdFZpZXcuICBGb3Igc3RhdGljIGNvbnRlbnQsCkBAIC0xNzYwLDI4ICsxODk1LDEyIEBACiAgICAgICAgIDwhLS0gSGVpZ2h0IG9mIHRoZSBkaXZpZGVyLiBXaWxsIHVzZSB0aGUgaW50cmluc2ljIGhlaWdodCBvZiB0aGUgZGl2aWRlciBpZiB0aGlzCiAgICAgICAgICAgICAgaXMgbm90IHNwZWNpZmllZC4gLS0+CiAgICAgICAgIDxhdHRyIG5hbWU9ImRpdmlkZXJIZWlnaHQiIGZvcm1hdD0iZGltZW5zaW9uIiAvPgotICAgICAgICA8IS0tIERlZmluZXMgdGhlIGNob2ljZSBiZWhhdmlvciBmb3IgdGhlIExpc3RWaWV3LiBCeSBkZWZhdWx0LCBsaXN0cyBkbyBub3QgaGF2ZQotICAgICAgICAgICAgIGFueSBjaG9pY2UgYmVoYXZpb3IuIEJ5IHNldHRpbmcgdGhlIGNob2ljZU1vZGUgdG8gc2luZ2xlQ2hvaWNlLCB0aGUgTGlzdAotICAgICAgICAgICAgIGFsbG93cyB1cCB0byBvbmUgaXRlbSB0byBiZSBpbiBhIGNob3NlbiBzdGF0ZS4gQnkgc2V0dGluZyB0aGUgY2hvaWNlTW9kZSB0bwotICAgICAgICAgICAgIG11bHRpcGxlQ2hvaWNlLCB0aGUgbGlzdCBhbGxvd3MgYW55IG51bWJlciBvZiBpdGVtcyB0byBiZSBjaG9zZW4uIC0tPgotICAgICAgICA8YXR0ciBuYW1lPSJjaG9pY2VNb2RlIj4KLSAgICAgICAgICAgIDwhLS0gTm9ybWFsIGxpc3QgdGhhdCBkb2VzIG5vdCBpbmRpY2F0ZSBjaG9pY2VzLiAtLT4KLSAgICAgICAgICAgIDxlbnVtIG5hbWU9Im5vbmUiIHZhbHVlPSIwIiAvPgotICAgICAgICAgICAgPCEtLSBUaGUgbGlzdCBhbGxvd3MgdXAgdG8gb25lIGNob2ljZS4gLS0+Ci0gICAgICAgICAgICA8ZW51bSBuYW1lPSJzaW5nbGVDaG9pY2UiIHZhbHVlPSIxIiAvPgotICAgICAgICAgICAgPCEtLSBUaGUgbGlzdCBhbGxvd3MgbXVsdGlwbGUgY2hvaWNlcy4gLS0+Ci0gICAgICAgICAgICA8ZW51bSBuYW1lPSJtdWx0aXBsZUNob2ljZSIgdmFsdWU9IjIiIC8+Ci0gICAgICAgIDwvYXR0cj4KICAgICAgICAgPCEtLSBXaGVuIHNldCB0byBmYWxzZSwgdGhlIExpc3RWaWV3IHdpbGwgbm90IGRyYXcgdGhlIGRpdmlkZXIgYWZ0ZXIgZWFjaCBoZWFkZXIgdmlldy4KICAgICAgICAgICAgICBUaGUgZGVmYXVsdCB2YWx1ZSBpcyB0cnVlLiAtLT4KICAgICAgICAgPGF0dHIgbmFtZT0iaGVhZGVyRGl2aWRlcnNFbmFibGVkIiBmb3JtYXQ9ImJvb2xlYW4iIC8+CiAgICAgICAgIDwhLS0gV2hlbiBzZXQgdG8gZmFsc2UsIHRoZSBMaXN0VmlldyB3aWxsIG5vdCBkcmF3IHRoZSBkaXZpZGVyIGJlZm9yZSBlYWNoIGZvb3RlciB2aWV3LgogICAgICAgICAgICAgIFRoZSBkZWZhdWx0IHZhbHVlIGlzIHRydWUuIC0tPgogICAgICAgICA8YXR0ciBuYW1lPSJmb290ZXJEaXZpZGVyc0VuYWJsZWQiIGZvcm1hdD0iYm9vbGVhbiIgLz4KLSAgICAgICAgPCEtLSBEcmF3YWJsZSB0byBkcmF3IGFib3ZlIGxpc3QgY29udGVudC4gLS0+Ci0gICAgICAgIDxhdHRyIG5hbWU9Im92ZXJzY3JvbGxIZWFkZXIiIGZvcm1hdD0icmVmZXJlbmNlfGNvbG9yIiAvPgotICAgICAgICA8IS0tIERyYXdhYmxlIHRvIGRyYXcgYmVsb3cgbGlzdCBjb250ZW50LiAtLT4KLSAgICAgICAgPGF0dHIgbmFtZT0ib3ZlcnNjcm9sbEZvb3RlciIgZm9ybWF0PSJyZWZlcmVuY2V8Y29sb3IiIC8+CiAgICAgPC9kZWNsYXJlLXN0eWxlYWJsZT4KICAgICA8ZGVjbGFyZS1zdHlsZWFibGUgbmFtZT0iTWVudVZpZXciPgogICAgICAgICA8IS0tIERlZmF1bHQgYXBwZWFyYW5jZSBvZiBtZW51IGl0ZW0gdGV4dC4gLS0+CkBAIC0yMTc3LDcgKzIyOTYsNyBAQAogICAgICAgICA8YXR0ciBuYW1lPSJkcm9wRG93bkFuY2hvciIgZm9ybWF0PSJyZWZlcmVuY2UiIC8+CiAgICAgICAgIDwhLS0gU3BlY2lmaWVzIHRoZSBiYXNpYyB3aWR0aCBvZiB0aGUgZHJvcGRvd24uIEl0cyB2YWx1ZSBtYXkKICAgICAgICAgICAgICBiZSBhIGRpbWVuc2lvbiAoc3VjaCBhcyAiMTJkaXAiKSBmb3IgYSBjb25zdGFudCB3aWR0aCwKLSAgICAgICAgICAgICBmaWxsX3BhcmVudCBvciBtYXRjaF9wYXJlbnQgdG8gbWF0Y2ggdGhlIHdpZHRoIG9mIHRoZSAKKyAgICAgICAgICAgICBmaWxsX3BhcmVudCBvciBtYXRjaF9wYXJlbnQgdG8gbWF0Y2ggdGhlIHdpZHRoIG9mIHRoZQogICAgICAgICAgICAgIHNjcmVlbiwgb3Igd3JhcF9jb250ZW50IHRvIG1hdGNoIHRoZSB3aWR0aCBvZgogICAgICAgICAgICAgIHRoZSBhbmNob3JlZCB2aWV3LiAtLT4KICAgICAgICAgPGF0dHIgbmFtZT0iZHJvcERvd25XaWR0aCIgZm9ybWF0PSJkaW1lbnNpb24iPgpAQCAtMjIxMywxNCArMjMzMiwzMyBAQAogICAgICAgICA8YXR0ciBuYW1lPSJwb3B1cEJhY2tncm91bmQiIGZvcm1hdD0icmVmZXJlbmNlfGNvbG9yIiAvPgogICAgIDwvZGVjbGFyZS1zdHlsZWFibGU+CiAgICAgPGRlY2xhcmUtc3R5bGVhYmxlIG5hbWU9IlZpZXdBbmltYXRvciI+CisgICAgICAgIDwhLS0gSWRlbnRpZmllciBmb3IgdGhlIGFuaW1hdGlvbiB0byB1c2Ugd2hlbiBhIHZpZXcgaXMgc2hvd24uIC0tPgogICAgICAgICA8YXR0ciBuYW1lPSJpbkFuaW1hdGlvbiIgZm9ybWF0PSJyZWZlcmVuY2UiIC8+CisgICAgICAgIDwhLS0gSWRlbnRpZmllciBmb3IgdGhlIGFuaW1hdGlvbiB0byB1c2Ugd2hlbiBhIHZpZXcgaXMgaGlkZGVuLiAtLT4KICAgICAgICAgPGF0dHIgbmFtZT0ib3V0QW5pbWF0aW9uIiBmb3JtYXQ9InJlZmVyZW5jZSIgLz4KKyAgICAgICAgPCEtLSBEZWZpbmVzIHdoZXRoZXIgdG8gYW5pbWF0ZSB0aGUgY3VycmVudCBWaWV3IHdoZW4gdGhlIFZpZXdBbmltYXRpb24KKyAgICAgICAgICAgICBpcyBmaXJzdCBkaXNwbGF5ZWQuIC0tPgorICAgICAgICA8YXR0ciBuYW1lPSJhbmltYXRlRmlyc3RWaWV3IiBmb3JtYXQ9ImJvb2xlYW4iIC8+CiAgICAgPC9kZWNsYXJlLXN0eWxlYWJsZT4KICAgICA8ZGVjbGFyZS1zdHlsZWFibGUgbmFtZT0iVmlld0ZsaXBwZXIiPgogICAgICAgICA8YXR0ciBuYW1lPSJmbGlwSW50ZXJ2YWwiIGZvcm1hdD0iaW50ZWdlciIgbWluPSIwIiAvPgogICAgICAgICA8IS0tIFdoZW4gdHJ1ZSwgYXV0b21hdGljYWxseSBzdGFydCBhbmltYXRpbmcgLS0+CiAgICAgICAgIDxhdHRyIG5hbWU9ImF1dG9TdGFydCIgZm9ybWF0PSJib29sZWFuIiAvPgogICAgIDwvZGVjbGFyZS1zdHlsZWFibGU+CisgICAgPGRlY2xhcmUtc3R5bGVhYmxlIG5hbWU9IkFkYXB0ZXJWaWV3QW5pbWF0b3IiPgorICAgICAgICA8IS0tIElkZW50aWZpZXIgZm9yIHRoZSBhbmltYXRpb24gdG8gdXNlIHdoZW4gYSB2aWV3IGlzIHNob3duLiAtLT4KKyAgICAgICAgPGF0dHIgbmFtZT0iaW5BbmltYXRpb24iIC8+CisgICAgICAgIDwhLS0gSWRlbnRpZmllciBmb3IgdGhlIGFuaW1hdGlvbiB0byB1c2Ugd2hlbiBhIHZpZXcgaXMgaGlkZGVuLiAtLT4KKyAgICAgICAgPGF0dHIgbmFtZT0ib3V0QW5pbWF0aW9uIiAvPgorICAgICAgICA8IS0tIERlZmluZXMgd2hldGhlciB0byBhbmltYXRlIHRoZSBjdXJyZW50IFZpZXcgd2hlbiB0aGUgVmlld0FuaW1hdGlvbgorICAgICAgICAgICAgIGlzIGZpcnN0IGRpc3BsYXllZC4gLS0+CisgICAgICAgIDxhdHRyIG5hbWU9ImFuaW1hdGVGaXJzdFZpZXciIC8+CisgICAgPC9kZWNsYXJlLXN0eWxlYWJsZT4KKyAgICA8ZGVjbGFyZS1zdHlsZWFibGUgbmFtZT0iQWRhcHRlclZpZXdGbGlwcGVyIj4KKyAgICAgICAgPGF0dHIgbmFtZT0iZmxpcEludGVydmFsIiAvPgorICAgICAgICA8IS0tIFdoZW4gdHJ1ZSwgYXV0b21hdGljYWxseSBzdGFydCBhbmltYXRpbmcgLS0+CisgICAgICAgIDxhdHRyIG5hbWU9ImF1dG9TdGFydCIgLz4KKyAgICA8L2RlY2xhcmUtc3R5bGVhYmxlPgogICAgIDxkZWNsYXJlLXN0eWxlYWJsZSBuYW1lPSJWaWV3U3dpdGNoZXIiPgogICAgIDwvZGVjbGFyZS1zdHlsZWFibGU+CiAgICAgPGRlY2xhcmUtc3R5bGVhYmxlIG5hbWU9IlNjcm9sbFZpZXciPgpAQCAtMjIzNCw2ICsyMzcyLDMwIEBACiAgICAgPGRlY2xhcmUtc3R5bGVhYmxlIG5hbWU9IlNwaW5uZXIiPgogICAgICAgICA8IS0tIFRoZSBwcm9tcHQgdG8gZGlzcGxheSB3aGVuIHRoZSBzcGlubmVyJ3MgZGlhbG9nIGlzIHNob3duLiAtLT4KICAgICAgICAgPGF0dHIgbmFtZT0icHJvbXB0IiBmb3JtYXQ9InJlZmVyZW5jZSIgLz4KKyAgICAgICAgPCEtLSBEaXNwbGF5IG1vZGUgZm9yIHNwaW5uZXIgb3B0aW9ucy4gLS0+CisgICAgICAgIDxhdHRyIG5hbWU9InNwaW5uZXJNb2RlIiBmb3JtYXQ9ImVudW0iPgorICAgICAgICAgICAgPCEtLSBTcGlubmVyIG9wdGlvbnMgd2lsbCBiZSBwcmVzZW50ZWQgdG8gdGhlIHVzZXIgYXMgYSBkaWFsb2cgd2luZG93LiAtLT4KKyAgICAgICAgICAgIDxlbnVtIG5hbWU9ImRpYWxvZyIgdmFsdWU9IjAiIC8+CisgICAgICAgICAgICA8IS0tIFNwaW5uZXIgb3B0aW9ucyB3aWxsIGJlIHByZXNlbnRlZCB0byB0aGUgdXNlciBhcyBhbiBpbmxpbmUgZHJvcGRvd24KKyAgICAgICAgICAgICAgICAgYW5jaG9yZWQgdG8gdGhlIHNwaW5uZXIgd2lkZ2V0IGl0c2VsZi4gLS0+CisgICAgICAgICAgICA8ZW51bSBuYW1lPSJkcm9wZG93biIgdmFsdWU9IjEiIC8+CisgICAgICAgIDwvYXR0cj4KKyAgICAgICAgPCEtLSBMaXN0IHNlbGVjdG9yIHRvIHVzZSBmb3Igc3Bpbm5lck1vZGU9ImRyb3Bkb3duIiBkaXNwbGF5LiAtLT4KKyAgICAgICAgPGF0dHIgbmFtZT0iZHJvcERvd25TZWxlY3RvciIgLz4KKyAgICAgICAgPCEtLSBCYWNrZ3JvdW5kIGRyYXdhYmxlIHRvIHVzZSBmb3IgdGhlIGRyb3Bkb3duIGluIHNwaW5uZXJNb2RlPSJkcm9wZG93biIuIC0tPgorICAgICAgICA8YXR0ciBuYW1lPSJwb3B1cEJhY2tncm91bmQiIC8+CisgICAgICAgIDwhLS0gVmVydGljYWwgb2Zmc2V0IGZyb20gdGhlIHNwaW5uZXIgd2lkZ2V0IGZvciBwb3NpdGlvbmluZyB0aGUgZHJvcGRvd24gaW4KKyAgICAgICAgICAgICBzcGlubmVyTW9kZT0iZHJvcGRvd24iLiAtLT4KKyAgICAgICAgPGF0dHIgbmFtZT0iZHJvcERvd25WZXJ0aWNhbE9mZnNldCIgLz4KKyAgICAgICAgPCEtLSBIb3Jpem9udGFsIG9mZnNldCBmcm9tIHRoZSBzcGlubmVyIHdpZGdldCBmb3IgcG9zaXRpb25pbmcgdGhlIGRyb3Bkb3duCisgICAgICAgICAgICAgaW4gc3Bpbm5lck1vZGU9ImRyb3Bkb3duIi4gLS0+CisgICAgICAgIDxhdHRyIG5hbWU9ImRyb3BEb3duSG9yaXpvbnRhbE9mZnNldCIgLz4KKyAgICAgICAgPCEtLSBXaWR0aCBvZiB0aGUgZHJvcGRvd24gaW4gc3Bpbm5lck1vZGU9ImRyb3Bkb3duIi4gLS0+CisgICAgICAgIDxhdHRyIG5hbWU9ImRyb3BEb3duV2lkdGgiIC8+CisgICAgICAgIDwhLS0gUmVmZXJlbmNlIHRvIGEgbGF5b3V0IHRvIHVzZSBmb3IgZGlzcGxheWluZyBhIHByb21wdCBpbiB0aGUgZHJvcGRvd24gZm9yCisgICAgICAgICAgICAgc3Bpbm5lck1vZGU9ImRyb3Bkb3duIi4gVGhpcyBsYXlvdXQgbXVzdCBjb250YWluIGEgVGV4dFZpZXcgd2l0aCB0aGUgaWQKKyAgICAgICAgICAgICBAYW5kcm9pZDppZC90ZXh0MSB0byBiZSBwb3B1bGF0ZWQgd2l0aCB0aGUgcHJvbXB0IHRleHQuIC0tPgorICAgICAgICA8YXR0ciBuYW1lPSJwb3B1cFByb21wdFZpZXciIGZvcm1hdD0icmVmZXJlbmNlIiAvPgogICAgIDwvZGVjbGFyZS1zdHlsZWFibGU+CiAgICAgPGRlY2xhcmUtc3R5bGVhYmxlIG5hbWU9IkRhdGVQaWNrZXIiPgogICAgICAgICA8IS0tIFRoZSBmaXJzdCB5ZWFyIChpbmNsdXNpdmUpLCBmb3IgZXhhbXBsZSAiMTk0MCIuIC0tPgpAQCAtMjU0NCw2ICsyNzA2LDEwIEBACiAgICAgICAgIDxhdHRyIG5hbWU9ImRyYXdhYmxlIiAvPgogICAgIDwvZGVjbGFyZS1zdHlsZWFibGU+CiAKKyAgICA8ZGVjbGFyZS1zdHlsZWFibGUgbmFtZT0iTWlwbWFwRHJhd2FibGVJdGVtIj4KKyAgICAgICAgPGF0dHIgbmFtZT0iZHJhd2FibGUiIC8+CisgICAgPC9kZWNsYXJlLXN0eWxlYWJsZT4KKwogICAgIDxkZWNsYXJlLXN0eWxlYWJsZSBuYW1lPSJSb3RhdGVEcmF3YWJsZSI+CiAgICAgICAgIDxhdHRyIG5hbWU9InZpc2libGUiIC8+CiAgICAgICAgIDxhdHRyIG5hbWU9ImZyb21EZWdyZWVzIiBmb3JtYXQ9ImZsb2F0IiAvPgpAQCAtMjg2Nyw2ICszMDMzLDY5IEBACiAgICAgPC9kZWNsYXJlLXN0eWxlYWJsZT4KIAogICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+CisgICAgPCEtLSBWYWx1ZUFuaW1hdG9yIGNsYXNzIGF0dHJpYnV0ZXMgLS0+CisgICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KKyAgICA8ZWF0LWNvbW1lbnQgLz4KKworICAgIDxkZWNsYXJlLXN0eWxlYWJsZSBuYW1lPSJBbmltYXRvciI+CisgICAgICAgIDwhLS0gRGVmaW5lcyB0aGUgaW50ZXJwb2xhdG9yIHVzZWQgdG8gc21vb3RoIHRoZSBhbmltYXRpb24gbW92ZW1lbnQgaW4gdGltZS4gLS0+CisgICAgICAgIDxhdHRyIG5hbWU9ImludGVycG9sYXRvciIgLz4KKyAgICAgICAgPCEtLSBXaGVuIHNldCB0byB0cnVlLCBmaWxsQWZ0ZXIgaXMgdGFrZW4gaW50byBhY2NvdW50LiAtLT4KKyAgICAgICAgPCEtLSBBbW91bnQgb2YgdGltZSAoaW4gbWlsbGlzZWNvbmRzKSBmb3IgdGhlIGFuaW1hdGlvbiB0byBydW4uIC0tPgorICAgICAgICA8YXR0ciBuYW1lPSJkdXJhdGlvbiIgLz4KKyAgICAgICAgPCEtLSBEZWxheSBpbiBtaWxsaXNlY29uZHMgYmVmb3JlIHRoZSBhbmltYXRpb24gcnVucywgb25jZSBzdGFydCB0aW1lIGlzIHJlYWNoZWQuIC0tPgorICAgICAgICA8YXR0ciBuYW1lPSJzdGFydE9mZnNldCIvPgorICAgICAgICA8IS0tIERlZmluZXMgaG93IG1hbnkgdGltZXMgdGhlIGFuaW1hdGlvbiBzaG91bGQgcmVwZWF0LiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyAwLiAtLT4KKyAgICAgICAgPGF0dHIgbmFtZT0icmVwZWF0Q291bnQiLz4KKyAgICAgICAgPCEtLSBEZWZpbmVzIHRoZSBhbmltYXRpb24gYmVoYXZpb3Igd2hlbiBpdCByZWFjaGVzIHRoZSBlbmQgYW5kIHRoZSByZXBlYXQgY291bnQgaXMKKyAgICAgICAgICAgICBncmVhdGVyIHRoYW4gMCBvciBpbmZpbml0ZS4gVGhlIGRlZmF1bHQgdmFsdWUgaXMgcmVzdGFydC4gLS0+CisgICAgICAgIDxhdHRyIG5hbWU9InJlcGVhdE1vZGUiLz4KKyAgICAgICAgPCEtLSBWYWx1ZSB0aGUgYW5pbWF0aW9uIHN0YXJ0cyBmcm9tLiAtLT4KKyAgICAgICAgPGF0dHIgbmFtZT0idmFsdWVGcm9tIiBmb3JtYXQ9ImZsb2F0fGludGVnZXIiLz4KKyAgICAgICAgPCEtLSBWYWx1ZSB0aGUgYW5pbWF0aW9uIGFuaW1hdGVzIHRvLiAtLT4KKyAgICAgICAgPGF0dHIgbmFtZT0idmFsdWVUbyIgZm9ybWF0PSJmbG9hdHxpbnRlZ2VyIi8+CisgICAgICAgIDwhLS0gVGhlIHR5cGUgb2YgdmFsdWVGcm9tIGFuZCB2YWx1ZVRvLiAtLT4KKyAgICAgICAgPGF0dHIgbmFtZT0idmFsdWVUeXBlIj4KKyAgICAgICAgICAgIDwhLS0gdmFsdWVGcm9tIGFuZCB2YWx1ZVRvIGFyZSBmbG9hdHMuIC0tPgorICAgICAgICAgICAgPGVudW0gbmFtZT0iZmxvYXRUeXBlIiB2YWx1ZT0iMCIgLz4KKyAgICAgICAgICAgIDwhLS0gdmFsdWVGcm9tIGFuZCB2YWx1ZVRvIGFyZSBpbnRlZ2Vycy4gLS0+CisgICAgICAgICAgICA8ZW51bSBuYW1lPSJpbnRUeXBlIiAgIHZhbHVlPSIxIiAvPgorICAgICAgICAgICAgPCEtLSB2YWx1ZUZyb20gYW5kIHZhbHVlVG8gYXJlIGRvdWJsZXMuIC0tPgorICAgICAgICAgICAgPGVudW0gbmFtZT0iZG91YmxlVHlwZSIgdmFsdWU9IjIiIC8+CisgICAgICAgICAgICA8IS0tIHZhbHVlRnJvbSBhbmQgdmFsdWVUbyBhcmUgY29sb3JzLiAtLT4KKyAgICAgICAgICAgIDxlbnVtIG5hbWU9ImNvbG9yVHlwZSIgdmFsdWU9IjMiIC8+CisgICAgICAgICAgICA8IS0tIHZhbHVlRnJvbSBhbmQgdmFsdWVUbyBhcmUgYSBjdXN0b20gdHlwZS4gLS0+CisgICAgICAgICAgICA8ZW51bSBuYW1lPSJjdXN0b21UeXBlIiB2YWx1ZT0iNCIgLz4KKyAgICAgICAgPC9hdHRyPgorICAgIDwvZGVjbGFyZS1zdHlsZWFibGU+CisKKyAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgorICAgIDwhLS0gT2JqZWN0QW5pbWF0b3IgY2xhc3MgYXR0cmlidXRlcyAtLT4KKyAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgorICAgIDxlYXQtY29tbWVudCAvPgorCisgICAgPGRlY2xhcmUtc3R5bGVhYmxlIG5hbWU9IlByb3BlcnR5QW5pbWF0b3IiPgorICAgICAgICA8IS0tIE5hbWUgb2YgdGhlIHByb3BlcnR5IGJlaW5nIGFuaW1hdGVkLiAtLT4KKyAgICAgICAgPGF0dHIgbmFtZT0icHJvcGVydHlOYW1lIiBmb3JtYXQ9InN0cmluZyIvPgorICAgIDwvZGVjbGFyZS1zdHlsZWFibGU+CisKKworICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+CisgICAgPCEtLSBBbmltYXRvclNldCBjbGFzcyBhdHRyaWJ1dGVzIC0tPgorICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+CisgICAgPGVhdC1jb21tZW50IC8+CisKKyAgICA8ZGVjbGFyZS1zdHlsZWFibGUgbmFtZT0iQW5pbWF0b3JTZXQiPgorICAgICAgICA8IS0tIE5hbWUgb2YgdGhlIHByb3BlcnR5IGJlaW5nIGFuaW1hdGVkLiAtLT4KKyAgICAgICAgPGF0dHIgbmFtZT0ib3JkZXJpbmciPgorICAgICAgICAgICAgPCEtLSBjaGlsZCBhbmltYXRpb25zIHNob3VsZCBiZSBwbGF5ZWQgdG9nZXRoZXIuIC0tPgorICAgICAgICAgICAgPGVudW0gbmFtZT0idG9nZXRoZXIiIHZhbHVlPSIwIiAvPgorICAgICAgICAgICAgPCEtLSBjaGlsZCBhbmltYXRpb25zIHNob3VsZCBiZSBwbGF5ZWQgc2VxdWVudGlhbGx5LCBpbiB0aGUgc2FtZSBvcmRlciBhcyB0aGUgeG1sLiAtLT4KKyAgICAgICAgICAgIDxlbnVtIG5hbWU9InNlcXVlbnRpYWxseSIgdmFsdWU9IjEiIC8+CisgICAgICAgIDwvYXR0cj4KKyAgICA8L2RlY2xhcmUtc3R5bGVhYmxlPgorCisgICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KICAgICA8IS0tIFN0YXRlIGF0dHJpYnV0ZXMgICAgICAgICAgIC0tPgogICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+CiAgICAgPGVhdC1jb21tZW50IC8+CkBAIC0yODg4LDYgKzMxMTcsNyBAQAogICAgICAgICAgPGxpPiJzdGF0ZV9sYXN0IgogICAgICAgICAgPGxpPiJzdGF0ZV9vbmx5IgogICAgICAgICAgPGxpPiJzdGF0ZV9wcmVzc2VkIgorICAgICAgICAgPGxpPiJzdGF0ZV9hY3RpdmF0ZWQiCiAgICAgICAgICA8bGk+InN0YXRlX2Vycm9yIgogICAgICAgICAgPGxpPiJzdGF0ZV9jaXJjbGUiCiAgICAgICAgICA8bGk+InN0YXRlX3JlY3QiCkBAIC0yODk1LDIzICszMTI1LDM1IEBACiAgICAgICAgICA8bGk+InN0YXRlX21vdmUiCiAgICAgICAgICA8L3VsPiAgLS0+CiAgICAgPGRlY2xhcmUtc3R5bGVhYmxlIG5hbWU9IkRyYXdhYmxlU3RhdGVzIj4KLSAgICAgICAgPCEtLSAgU3RhdGUgdmFsdWUgZm9yIHtAbGluayBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLlN0YXRlTGlzdERyYXdhYmxlIFN0YXRlTGlzdERyYXdhYmxlfS4tLT4KKyAgICAgICAgPCEtLSBTdGF0ZSB2YWx1ZSBmb3Ige0BsaW5rIGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuU3RhdGVMaXN0RHJhd2FibGUgU3RhdGVMaXN0RHJhd2FibGV9LAorICAgICAgICAgICAgIHNldCB3aGVuIGEgdmlldyBoYXMgaW5wdXQgZm9jdXMuIC0tPgogICAgICAgICA8YXR0ciBuYW1lPSJzdGF0ZV9mb2N1c2VkIiBmb3JtYXQ9ImJvb2xlYW4iIC8+Ci0gICAgICAgIDwhLS0gIFN0YXRlIHZhbHVlIGZvciB7QGxpbmsgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5TdGF0ZUxpc3REcmF3YWJsZSBTdGF0ZUxpc3REcmF3YWJsZX0uLS0+CisgICAgICAgIDwhLS0gU3RhdGUgdmFsdWUgZm9yIHtAbGluayBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLlN0YXRlTGlzdERyYXdhYmxlIFN0YXRlTGlzdERyYXdhYmxlfSwKKyAgICAgICAgICAgICBzZXQgd2hlbiBhIHZpZXcncyB3aW5kb3cgaGFzIGlucHV0IGZvY3VzLiAtLT4KICAgICAgICAgPGF0dHIgbmFtZT0ic3RhdGVfd2luZG93X2ZvY3VzZWQiIGZvcm1hdD0iYm9vbGVhbiIgLz4KLSAgICAgICAgPCEtLSAgU3RhdGUgdmFsdWUgZm9yIHtAbGluayBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLlN0YXRlTGlzdERyYXdhYmxlIFN0YXRlTGlzdERyYXdhYmxlfS4tLT4KKyAgICAgICAgPCEtLSBTdGF0ZSB2YWx1ZSBmb3Ige0BsaW5rIGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuU3RhdGVMaXN0RHJhd2FibGUgU3RhdGVMaXN0RHJhd2FibGV9LAorICAgICAgICAgICAgIHNldCB3aGVuIGEgdmlldyBpcyBlbmFibGVkLiAtLT4KICAgICAgICAgPGF0dHIgbmFtZT0ic3RhdGVfZW5hYmxlZCIgZm9ybWF0PSJib29sZWFuIiAvPgotICAgICAgICA8IS0tICBTdGF0ZSBpZGVudGlmaWVyIGluZGljYXRpbmcgdGhhdCB0aGUgb2JqZWN0IDx2YXI+bWF5PC92YXI+IGRpc3BsYXkgYSBjaGVjayBtYXJrLgotICAgICAgICAgICAgICBTZWUge0BsaW5rIFIuYXR0ciNzdGF0ZV9jaGVja2VkfSBmb3IgdGhlIGlkZW50aWZpZXIgdGhhdCBpbmRpY2F0ZXMgd2hldGhlciBpdCBpcwotICAgICAgICAgICAgICBhY3R1YWxseSBjaGVja2VkLiAtLT4KKyAgICAgICAgPCEtLSBTdGF0ZSBpZGVudGlmaWVyIGluZGljYXRpbmcgdGhhdCB0aGUgb2JqZWN0IDx2YXI+bWF5PC92YXI+IGRpc3BsYXkgYSBjaGVjayBtYXJrLgorICAgICAgICAgICAgIFNlZSB7QGxpbmsgUi5hdHRyI3N0YXRlX2NoZWNrZWR9IGZvciB0aGUgaWRlbnRpZmllciB0aGF0IGluZGljYXRlcyB3aGV0aGVyIGl0IGlzCisgICAgICAgICAgICAgYWN0dWFsbHkgY2hlY2tlZC4gLS0+CiAgICAgICAgIDxhdHRyIG5hbWU9InN0YXRlX2NoZWNrYWJsZSIgZm9ybWF0PSJib29sZWFuIi8+Ci0gICAgICAgIDwhLS0gIFN0YXRlIGlkZW50aWZpZXIgaW5kaWNhdGluZyB0aGF0IHRoZSBvYmplY3QgaXMgY3VycmVudGx5IGNoZWNrZWQuICBTZWUKLSAgICAgICAgICAgICAge0BsaW5rIFIuYXR0ciNzdGF0ZV9jaGVja2FibGV9IGZvciBhbiBhZGRpdGlvbmFsIGlkZW50aWZpZXIgdGhhdCBjYW4gaW5kaWNhdGUgaWYKLSAgICAgICAgICAgICAgYW55IG9iamVjdCBtYXkgZXZlciBkaXNwbGF5IGEgY2hlY2ssIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciBzdGF0ZV9jaGVja2VkIGlzCi0gICAgICAgICAgICAgIGN1cnJlbnRseSBzZXQuIC0tPgorICAgICAgICA8IS0tIFN0YXRlIGlkZW50aWZpZXIgaW5kaWNhdGluZyB0aGF0IHRoZSBvYmplY3QgaXMgY3VycmVudGx5IGNoZWNrZWQuICBTZWUKKyAgICAgICAgICAgICB7QGxpbmsgUi5hdHRyI3N0YXRlX2NoZWNrYWJsZX0gZm9yIGFuIGFkZGl0aW9uYWwgaWRlbnRpZmllciB0aGF0IGNhbiBpbmRpY2F0ZSBpZgorICAgICAgICAgICAgIGFueSBvYmplY3QgbWF5IGV2ZXIgZGlzcGxheSBhIGNoZWNrLCByZWdhcmRsZXNzIG9mIHdoZXRoZXIgc3RhdGVfY2hlY2tlZCBpcworICAgICAgICAgICAgIGN1cnJlbnRseSBzZXQuIC0tPgogICAgICAgICA8YXR0ciBuYW1lPSJzdGF0ZV9jaGVja2VkIiBmb3JtYXQ9ImJvb2xlYW4iLz4KLSAgICAgICAgPCEtLSAgU3RhdGUgdmFsdWUgZm9yIHtAbGluayBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLlN0YXRlTGlzdERyYXdhYmxlIFN0YXRlTGlzdERyYXdhYmxlfS4tLT4KKyAgICAgICAgPCEtLSBTdGF0ZSB2YWx1ZSBmb3Ige0BsaW5rIGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuU3RhdGVMaXN0RHJhd2FibGUgU3RhdGVMaXN0RHJhd2FibGV9LAorICAgICAgICAgICAgIHNldCB3aGVuIGEgdmlldyAob3Igb25lIG9mIGl0cyBwYXJlbnRzKSBpcyBjdXJyZW50bHkgc2VsZWN0ZWQuIC0tPgogICAgICAgICA8YXR0ciBuYW1lPSJzdGF0ZV9zZWxlY3RlZCIgZm9ybWF0PSJib29sZWFuIiAvPgorICAgICAgICA8IS0tIFN0YXRlIHZhbHVlIGZvciB7QGxpbmsgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5TdGF0ZUxpc3REcmF3YWJsZSBTdGF0ZUxpc3REcmF3YWJsZX0sCisgICAgICAgICAgICAgc2V0IHdoZW4gdGhlIHVzZXIgaXMgcHJlc3NpbmcgZG93biBpbiBhIHZpZXcuIC0tPgorICAgICAgICA8YXR0ciBuYW1lPSJzdGF0ZV9wcmVzc2VkIiBmb3JtYXQ9ImJvb2xlYW4iIC8+CisgICAgICAgIDwhLS0gU3RhdGUgdmFsdWUgZm9yIHtAbGluayBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLlN0YXRlTGlzdERyYXdhYmxlIFN0YXRlTGlzdERyYXdhYmxlfSwKKyAgICAgICAgICAgICBzZXQgd2hlbiBhIHZpZXcgb3IgaXRzIHBhcmVudCBoYXMgYmVlbiAiYWN0aXZhdGVkIiBtZWFuaW5nIHRoZSB1c2VyIGhhcyBjdXJyZW50bHkKKyAgICAgICAgICAgICBtYXJrZWQgaXQgYXMgYmVpbmcgb2YgaW50ZXJlc3QuICBUaGlzIGlzIGFuIGFsdGVybmF0aXZlIHJlcHJlc2VudGF0aW9uIG9mCisgICAgICAgICAgICAgc3RhdGVfY2hlY2tlZCBmb3Igd2hlbiB0aGUgc3RhdGUgc2hvdWxkIGJlIHByb3BhZ2F0ZWQgZG93biB0aGUgdmlldyBoaWVyYXJjaHkuIC0tPgorICAgICAgICA8YXR0ciBuYW1lPSJzdGF0ZV9hY3RpdmF0ZWQiIGZvcm1hdD0iYm9vbGVhbiIgLz4KICAgICAgICAgPCEtLSAgU3RhdGUgdmFsdWUgZm9yIHtAbGluayBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLlN0YXRlTGlzdERyYXdhYmxlIFN0YXRlTGlzdERyYXdhYmxlfS4tLT4KICAgICAgICAgPGF0dHIgbmFtZT0ic3RhdGVfYWN0aXZlIiBmb3JtYXQ9ImJvb2xlYW4iIC8+CiAgICAgICAgIDwhLS0gIFN0YXRlIHZhbHVlIGZvciB7QGxpbmsgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5TdGF0ZUxpc3REcmF3YWJsZSBTdGF0ZUxpc3REcmF3YWJsZX0uLS0+CkBAIC0yOTIyLDggKzMxNjQsNiBAQAogICAgICAgICA8YXR0ciBuYW1lPSJzdGF0ZV9taWRkbGUiIGZvcm1hdD0iYm9vbGVhbiIgLz4KICAgICAgICAgPCEtLSAgU3RhdGUgdmFsdWUgZm9yIHtAbGluayBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLlN0YXRlTGlzdERyYXdhYmxlIFN0YXRlTGlzdERyYXdhYmxlfS4tLT4KICAgICAgICAgPGF0dHIgbmFtZT0ic3RhdGVfbGFzdCIgZm9ybWF0PSJib29sZWFuIiAvPgotICAgICAgICA8IS0tICBTdGF0ZSB2YWx1ZSBmb3Ige0BsaW5rIGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuU3RhdGVMaXN0RHJhd2FibGUgU3RhdGVMaXN0RHJhd2FibGV9Li0tPgotICAgICAgICA8YXR0ciBuYW1lPSJzdGF0ZV9wcmVzc2VkIiBmb3JtYXQ9ImJvb2xlYW4iIC8+CiAgICAgPC9kZWNsYXJlLXN0eWxlYWJsZT4KICAgICA8ZGVjbGFyZS1zdHlsZWFibGUgbmFtZT0iVmlld0RyYXdhYmxlU3RhdGVzIj4KICAgICAgICAgPGF0dHIgbmFtZT0ic3RhdGVfcHJlc3NlZCIgLz4KQEAgLTI5MzEsNiArMzE3MSw3IEBACiAgICAgICAgIDxhdHRyIG5hbWU9InN0YXRlX3NlbGVjdGVkIiAvPgogICAgICAgICA8YXR0ciBuYW1lPSJzdGF0ZV93aW5kb3dfZm9jdXNlZCIgLz4KICAgICAgICAgPGF0dHIgbmFtZT0ic3RhdGVfZW5hYmxlZCIgLz4KKyAgICAgICAgPGF0dHIgbmFtZT0ic3RhdGVfYWN0aXZhdGVkIiAvPgogICAgIDwvZGVjbGFyZS1zdHlsZWFibGU+CiAgICAgPCEtLSBTdGF0ZSBhcnJheSByZXByZXNlbnRpbmcgYSBtZW51IGl0ZW0gdGhhdCBpcyBjdXJyZW50bHkgY2hlY2tlZC4gLS0+CiAgICAgPGRlY2xhcmUtc3R5bGVhYmxlIG5hbWU9Ik1lbnVJdGVtQ2hlY2tlZFN0YXRlIj4KQEAgLTMyNzUsNiArMzUxNiwyNyBAQAogICAgICAgICA8IS0tIFdoZXRoZXIgdGhlIGl0ZW0gaXMgZW5hYmxlZC4gLS0+CiAgICAgICAgIDxhdHRyIG5hbWU9ImVuYWJsZWQiIC8+CiAKKyAgICAgICAgPCEtLSBOYW1lIG9mIGEgbWV0aG9kIG9uIHRoZSBDb250ZXh0IHVzZWQgdG8gaW5mbGF0ZSB0aGUgbWVudSB0aGF0IHdpbGwgYmUKKyAgICAgICAgICAgICBjYWxsZWQgd2hlbiB0aGUgaXRlbSBpcyBjbGlja2VkLiAtLT4KKyAgICAgICAgPGF0dHIgbmFtZT0ib25DbGljayIgLz4KKworICAgICAgICA8IS0tIEhvdyB0aGlzIGl0ZW0gc2hvdWxkIGRpc3BsYXkgaW4gdGhlIEFjdGlvbiBCYXIsIGlmIHByZXNlbnQuIC0tPgorICAgICAgICA8YXR0ciBuYW1lPSJzaG93QXNBY3Rpb24iIGZvcm1hdD0iZW51bSI+CisgICAgICAgICAgICA8ZW51bSBuYW1lPSJuZXZlciIgdmFsdWU9IjAiIC8+CisgICAgICAgICAgICA8ZW51bSBuYW1lPSJpZlJvb20iIHZhbHVlPSIxIiAvPgorICAgICAgICAgICAgPGVudW0gbmFtZT0iYWx3YXlzIiB2YWx1ZT0iMiIgLz4KKyAgICAgICAgPC9hdHRyPgorCisgICAgICAgIDwhLS0gQW4gb3B0aW9uYWwgbGF5b3V0IHRvIGJlIHVzZWQgYXMgYW4gYWN0aW9uIHZpZXcuCisgICAgICAgICAgICAgU2VlIHtAbGluayBhbmRyb2lkLnZpZXcuTWVudUl0ZW0jc2V0QWN0aW9uVmlldyhhbmRyb2lkLnZpZXcuVmlldyl9CisgICAgICAgICAgICAgZm9yIG1vcmUgaW5mby4gLS0+CisgICAgICAgIDxhdHRyIG5hbWU9ImFjdGlvbkxheW91dCIgZm9ybWF0PSJyZWZlcmVuY2UiIC8+CisKKyAgICAgICAgPCEtLSBUaGUgbmFtZSBvZiBhbiBvcHRpb25hbCBWaWV3IGNsYXNzIHRvIGluc3RhbnRpYXRlIGFuZCB1c2UgYXMgYW4KKyAgICAgICAgICAgICBhY3Rpb24gdmlldy4gU2VlIHtAbGluayBhbmRyb2lkLnZpZXcuTWVudUl0ZW0jc2V0QWN0aW9uVmlldyhhbmRyb2lkLnZpZXcuVmlldyl9CisgICAgICAgICAgICAgZm9yIG1vcmUgaW5mby4gLS0+CisgICAgICAgIDxhdHRyIG5hbWU9ImFjdGlvblZpZXdDbGFzcyIgZm9ybWF0PSJzdHJpbmciIC8+CisKICAgICA8L2RlY2xhcmUtc3R5bGVhYmxlPgogCiAgICAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgpAQCAtMzI5MCw2ICszNTUyLDIxIEBACiAgICAgICAgIDxhdHRyIG5hbWU9Im9yZGVyaW5nRnJvbVhtbCIgZm9ybWF0PSJib29sZWFuIiAvPgogICAgIDwvZGVjbGFyZS1zdHlsZWFibGU+CiAKKyAgICA8IS0tIEF0dHJpYnV0ZSBmb3IgYSBoZWFkZXIgZGVzY3JpYmluZyB0aGUgaXRlbSBzaG93biBpbiB0aGUgdG9wLWxldmVsIGxpc3QKKyAgICAgICAgIGZyb20gd2hpY2ggdGhlIHNlbGVjdHMgdGhlIHNldCBvZiBwcmVmZXJlbmNlIHRvIGRpZyBpbiB0by4gLS0+CisgICAgPGRlY2xhcmUtc3R5bGVhYmxlIG5hbWU9IlByZWZlcmVuY2VIZWFkZXIiPgorICAgICAgICA8IS0tIElkZW50aWZpZXIgdmFsdWUgZm9yIHRoZSBoZWFkZXIuIC0tPgorICAgICAgICA8YXR0ciBuYW1lPSJpZCIgLz4KKyAgICAgICAgPCEtLSBUaGUgdGl0bGUgb2YgdGhlIGl0ZW0gdGhhdCBpcyBzaG93biB0byB0aGUgdXNlci4gLS0+CisgICAgICAgIDxhdHRyIG5hbWU9InRpdGxlIiAvPgorICAgICAgICA8IS0tIFRoZSBzdW1tYXJ5IGZvciB0aGUgaXRlbS4gLS0+CisgICAgICAgIDxhdHRyIG5hbWU9InN1bW1hcnkiIGZvcm1hdD0ic3RyaW5nIiAvPgorICAgICAgICA8IS0tIEFuIGljb24gZm9yIHRoZSBpdGVtLiAtLT4KKyAgICAgICAgPGF0dHIgbmFtZT0iaWNvbiIgLz4KKyAgICAgICAgPCEtLSBUaGUgZnJhZ21lbnQgdGhhdCBpcyBkaXNwbGF5ZWQgd2hlbiB0aGUgdXNlciBzZWxlY3RzIHRoaXMgaXRlbS4gLS0+CisgICAgICAgIDxhdHRyIG5hbWU9ImZyYWdtZW50IiBmb3JtYXQ9InN0cmluZyIgLz4KKyAgICA8L2RlY2xhcmUtc3R5bGVhYmxlPgorCiAgICAgPCEtLSBXQVJOSU5HOiAgSWYgYWRkaW5nIGF0dHJpYnV0ZXMgdG8gUHJlZmVyZW5jZSwgbWFrZSBzdXJlIGl0IGRvZXMgbm90IGNvbmZsaWN0CiAgICAgICAgICAgICAgICAgICAgd2l0aCBhIFZpZXcncyBhdHRyaWJ1dGVzLiAgU29tZSBzdWJjbGFzc2VzIChlLmcuLCBFZGl0VGV4dFByZWZlcmVuY2UpCiAgICAgICAgICAgICAgICAgICAgcHJveHkgYWxsIGF0dHJpYnV0ZXMgdG8gaXRzIEVkaXRUZXh0IHdpZGdldC4gLS0+CkBAIC0zMzAyLDEwICszNTc5LDEzIEBACiAgICAgICAgIDwhLS0gVGhlIHRpdGxlIGZvciB0aGUgUHJlZmVyZW5jZSBpbiBhIFByZWZlcmVuY2VBY3Rpdml0eSBzY3JlZW4uIC0tPgogICAgICAgICA8YXR0ciBuYW1lPSJ0aXRsZSIgLz4KICAgICAgICAgPCEtLSBUaGUgc3VtbWFyeSBmb3IgdGhlIFByZWZlcmVuY2UgaW4gYSBQcmVmZXJlbmNlQWN0aXZpdHkgc2NyZWVuLiAtLT4KLSAgICAgICAgPGF0dHIgbmFtZT0ic3VtbWFyeSIgZm9ybWF0PSJzdHJpbmciIC8+CisgICAgICAgIDxhdHRyIG5hbWU9InN1bW1hcnkiIC8+CiAgICAgICAgIDwhLS0gVGhlIG9yZGVyIGZvciB0aGUgUHJlZmVyZW5jZSAobG93ZXIgdmFsdWVzIGFyZSB0byBiZSBvcmRlcmVkIGZpcnN0KS4gSWYgdGhpcyBpcyBub3QKICAgICAgICAgICAgICBzcGVjaWZpZWQsIHRoZSBkZWZhdWx0IG9yZGVyaW4gd2lsbCBiZSBhbHBoYWJldGljLiAtLT4KICAgICAgICAgPGF0dHIgbmFtZT0ib3JkZXIiIGZvcm1hdD0iaW50ZWdlciIgLz4KKyAgICAgICAgPCEtLSBXaGVuIHVzZWQgaW5zaWRlIG9mIGEgbW9kZXJuIFByZWZlcmVuY2VBY3Rpdml0eSwgdGhpcyBkZWNsYXJlcworICAgICAgICAgICAgIGEgbmV3IFByZWZlcmVuY2VGcmFnbWVudCB0byBiZSBzaG93biB3aGVuIHRoZSB1c2VyIHNlbGVjdHMgdGhpcyBpdGVtLiAtLT4KKyAgICAgICAgPGF0dHIgbmFtZT0iZnJhZ21lbnQiIC8+CiAgICAgICAgIDwhLS0gVGhlIGxheW91dCBmb3IgdGhlIFByZWZlcmVuY2UgaW4gYSBQcmVmZXJlbmNlQWN0aXZpdHkgc2NyZWVuLiBUaGlzIHNob3VsZAogICAgICAgICAgICAgIHJhcmVseSBuZWVkIHRvIGJlIGNoYW5nZWQsIGxvb2sgYXQgd2lkZ2V0TGF5b3V0IGluc3RlYWQuIC0tPgogICAgICAgICA8YXR0ciBuYW1lPSJsYXlvdXQiIC8+CkBAIC0zMzc3LDYgKzM2NTcsMTYgQEAKICAgICAgICAgPGF0dHIgbmFtZT0iZW50cnlWYWx1ZXMiIGZvcm1hdD0icmVmZXJlbmNlIiAvPgogICAgIDwvZGVjbGFyZS1zdHlsZWFibGU+CiAKKyAgICA8ZGVjbGFyZS1zdHlsZWFibGUgbmFtZT0iTXVsdGlTZWxlY3RMaXN0UHJlZmVyZW5jZSI+CisgICAgICAgIDwhLS0gVGhlIGh1bWFuLXJlYWRhYmxlIGFycmF5IHRvIHByZXNlbnQgYXMgYSBsaXN0LiBFYWNoIGVudHJ5IG11c3QgaGF2ZSBhIGNvcnJlc3BvbmRpbmcKKyAgICAgICAgICAgICBpbmRleCBpbiBlbnRyeVZhbHVlcy4gLS0+CisgICAgICAgIDxhdHRyIG5hbWU9ImVudHJpZXMiIC8+CisgICAgICAgIDwhLS0gVGhlIGFycmF5IHRvIGZpbmQgdGhlIHZhbHVlIHRvIHNhdmUgZm9yIGEgcHJlZmVyZW5jZSB3aGVuIGFuIGVudHJ5IGZyb20KKyAgICAgICAgICAgICBlbnRyaWVzIGlzIHNlbGVjdGVkLiBJZiBhIHVzZXIgY2xpY2tzIHRoZSBzZWNvbmQgaXRlbSBpbiBlbnRyaWVzLCB0aGUKKyAgICAgICAgICAgICBzZWNvbmQgaXRlbSBpbiB0aGlzIGFycmF5IHdpbGwgYmUgc2F2ZWQgdG8gdGhlIHByZWZlcmVuY2UuIC0tPgorICAgICAgICA8YXR0ciBuYW1lPSJlbnRyeVZhbHVlcyIgLz4KKyAgICA8L2RlY2xhcmUtc3R5bGVhYmxlPgorCiAgICAgPCEtLSBCYXNlIGF0dHJpYnV0ZXMgYXZhaWxhYmxlIHRvIFJpbmd0b25lUHJlZmVyZW5jZS4gLS0+CiAgICAgPGRlY2xhcmUtc3R5bGVhYmxlIG5hbWU9IlJpbmd0b25lUHJlZmVyZW5jZSI+CiAgICAgICAgIDwhLS0gV2hpY2ggcmluZ3RvbmUgdHlwZShzKSB0byBzaG93IGluIHRoZSBwaWNrZXIuIC0tPgpAQCAtMzUyOCw3ICszODE4LDcgQEAKICAgICA8IS0tIEFwcFdpZGdldCBwYWNrYWdlIGNsYXNzIGF0dHJpYnV0ZXMgLS0+CiAgICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgogICAgIDxlYXQtY29tbWVudCAvPgotICAgIAorCiAgICAgPCEtLSBVc2UgPGNvZGU+YXBwd2lkZ2V0LXByb3ZpZGVyPC9jb2RlPiBhcyB0aGUgcm9vdCB0YWcgb2YgdGhlIFhNTCByZXNvdXJjZSB0aGF0CiAgICAgICAgICBkZXNjcmliZXMgYW4gQXBwV2lkZ2V0IHByb3ZpZGVyLiAgU2VlIHtAbGluayBhbmRyb2lkLmFwcHdpZGdldCBhbmRyb2lkLmFwcHdpZGdldH0KICAgICAgICAgIHBhY2thZ2UgZm9yIG1vcmUgaW5mby4KQEAgLTM1NDUsMTMgKzM4MzUsNDkgQEAKICAgICAgICAgPCEtLSBBIGNsYXNzIG5hbWUgaW4gdGhlIEFwcFdpZGdldCdzIHBhY2thZ2UgdG8gYmUgbGF1bmNoZWQgdG8gY29uZmlndXJlLgogICAgICAgICAgICAgIElmIG5vdCBzdXBwbGllZCwgdGhlbiBubyBhY3Rpdml0eSB3aWxsIGJlIGxhdW5jaGVkLiAtLT4KICAgICAgICAgPGF0dHIgbmFtZT0iY29uZmlndXJlIiBmb3JtYXQ9InN0cmluZyIgLz4KKyAgICAgICAgPCEtLSBBIHByZXZpZXcgb2Ygd2hhdCB0aGUgQXBwV2lkZ2V0IHdpbGwgbG9vayBsaWtlIGFmdGVyIGl0J3MgY29uZmlndXJlZC4KKyAgICAgICAJICAgICBJZiBub3Qgc3VwcGxpZWQsIHRoZSBBcHBXaWRnZXQncyBpY29uIHdpbGwgYmUgdXNlZC4gLS0+CisgICAgICAgIDxhdHRyIG5hbWU9InByZXZpZXdJbWFnZSIgZm9ybWF0PSJyZWZlcmVuY2UiIC8+CiAgICAgPC9kZWNsYXJlLXN0eWxlYWJsZT4KIAogICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KICAgICA8IS0tIEFwcCBwYWNrYWdlIGNsYXNzIGF0dHJpYnV0ZXMgLS0+CiAgICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgogICAgIDxlYXQtY29tbWVudCAvPgotICAgIAorCisgICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KKyAgICA8IS0tIFZpZXcgcGFja2FnZSBjbGFzcyBhdHRyaWJ1dGVzIC0tPgorICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+CisgICAgPGVhdC1jb21tZW50IC8+CisKKyAgICA8IS0tIEF0dHJpYnV0ZXMgdGhhdCBjYW4gYmUgdXNlZCB3aXRoIDxjb2RlPiZsdDtmcmFnbWVudCZndDs8L2NvZGU+CisgICAgICAgICB0YWdzIGluc2lkZSBvZiB0aGUgbGF5b3V0IG9mIGFuIEFjdGl2aXR5LiAgVGhpcyBpbnN0YW50aWF0ZXMKKyAgICAgICAgIHRoZSBnaXZlbiB7QGxpbmsgYW5kcm9pZC5hcHAuRnJhZ21lbnR9IGFuZCBpbnNlcnRzIGl0cyBjb250ZW50CisgICAgICAgICB2aWV3IGludG8gdGhlIGN1cnJlbnQgbG9jYXRpb24gaW4gdGhlIGxheW91dC4gLS0+CisgICAgPGRlY2xhcmUtc3R5bGVhYmxlIG5hbWU9IkZyYWdtZW50Ij4KKyAgICAgICAgPCEtLSBTdXBwbHkgdGhlIG5hbWUgb2YgdGhlIGZyYWdtZW50IGNsYXNzIHRvIGluc3RhbnRpYXRlLiAtLT4KKyAgICAgICAgPGF0dHIgbmFtZT0ibmFtZSIgLz4KKworICAgICAgICA8IS0tIFN1cHBseSBhbiBpZGVudGlmaWVyIG5hbWUgZm9yIHRoZSB0b3AtbGV2ZWwgdmlldywgdG8gbGF0ZXIgcmV0cmlldmUgaXQKKyAgICAgICAgICAgICB3aXRoIHtAbGluayBhbmRyb2lkLnZpZXcuVmlldyNmaW5kVmlld0J5SWQgVmlldy5maW5kVmlld0J5SWQoKX0gb3IKKyAgICAgICAgICAgICB7QGxpbmsgYW5kcm9pZC5hcHAuQWN0aXZpdHkjZmluZFZpZXdCeUlkIEFjdGl2aXR5LmZpbmRWaWV3QnlJZCgpfS4KKyAgICAgICAgICAgICBUaGlzIG11c3QgYmUgYQorICAgICAgICAgICAgIHJlc291cmNlIHJlZmVyZW5jZTsgdHlwaWNhbGx5IHlvdSBzZXQgdGhpcyB1c2luZyB0aGUKKyAgICAgICAgICAgICA8Y29kZT5AKzwvY29kZT4gc3ludGF4IHRvIGNyZWF0ZSBhIG5ldyBJRCByZXNvdXJjZXMuCisgICAgICAgICAgICAgRm9yIGV4YW1wbGU6IDxjb2RlPmFuZHJvaWQ6aWQ9IkAraWQvbXlfaWQiPC9jb2RlPiB3aGljaAorICAgICAgICAgICAgIGFsbG93cyB5b3UgdG8gbGF0ZXIgcmV0cmlldmUgdGhlIHZpZXcKKyAgICAgICAgICAgICB3aXRoIDxjb2RlPmZpbmRWaWV3QnlJZChSLmlkLm15X2lkKTwvY29kZT4uIC0tPgorICAgICAgICA8YXR0ciBuYW1lPSJpZCIgLz4KKworICAgICAgICA8IS0tIFN1cHBseSBhIHRhZyBmb3IgdGhlIHRvcC1sZXZlbCB2aWV3IGNvbnRhaW5pbmcgYSBTdHJpbmcsIHRvIGJlIHJldHJpZXZlZAorICAgICAgICAgICAgIGxhdGVyIHdpdGgge0BsaW5rIGFuZHJvaWQudmlldy5WaWV3I2dldFRhZyBWaWV3LmdldFRhZygpfSBvcgorICAgICAgICAgICAgIHNlYXJjaGVkIGZvciB3aXRoIHtAbGluayBhbmRyb2lkLnZpZXcuVmlldyNmaW5kVmlld1dpdGhUYWcKKyAgICAgICAgICAgICBWaWV3LmZpbmRWaWV3V2l0aFRhZygpfS4gIEl0IGlzIGdlbmVyYWxseSBwcmVmZXJhYmxlIHRvIHVzZQorICAgICAgICAgICAgIElEcyAodGhyb3VnaCB0aGUgYW5kcm9pZDppZCBhdHRyaWJ1dGUpIGluc3RlYWQgb2YgdGFncyBiZWNhdXNlCisgICAgICAgICAgICAgdGhleSBhcmUgZmFzdGVyIGFuZCBhbGxvdyBmb3IgY29tcGlsZS10aW1lIHR5cGUgY2hlY2tpbmcuIC0tPgorICAgICAgICA8YXR0ciBuYW1lPSJ0YWciIC8+CisgICAgPC9kZWNsYXJlLXN0eWxlYWJsZT4KKwogICAgIDwhLS0gVXNlIDxjb2RlPmRldmljZS1hZG1pbjwvY29kZT4gYXMgdGhlIHJvb3QgdGFnIG9mIHRoZSBYTUwgcmVzb3VyY2UgdGhhdAogICAgICAgICAgZGVzY3JpYmVzIGEKICAgICAgICAgIHtAbGluayBhbmRyb2lkLmFwcC5hZG1pbi5EZXZpY2VBZG1pblJlY2VpdmVyfSwgd2hpY2ggaXMKQEAgLTM1OTEsNyArMzkxNyw3IEBACiAgICAgPCEtLSBBY2NvdW50cyBwYWNrYWdlIGNsYXNzIGF0dHJpYnV0ZXMgLS0+CiAgICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgogICAgIDxlYXQtY29tbWVudCAvPgotICAgIAorCiAgICAgPCEtLSBVc2UgPGNvZGU+YWNjb3VudC1hdXRoZW50aWNhdG9yPC9jb2RlPiBhcyB0aGUgcm9vdCB0YWcgb2YgdGhlIFhNTCByZXNvdXJjZSB0aGF0CiAgICAgICAgICBkZXNjcmliZXMgYW4gYWNjb3VudCBhdXRoZW50aWNhdG9yLgogICAgICAtLT4KQEAgLTM2MTIsNyArMzkzOCw3IEBACiAgICAgPCEtLSBBY2NvdW50cyBwYWNrYWdlIGNsYXNzIGF0dHJpYnV0ZXMgLS0+CiAgICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgogICAgIDxlYXQtY29tbWVudCAvPgotICAgIAorCiAgICAgPCEtLSBVc2UgPGNvZGU+YWNjb3VudC1hdXRoZW50aWNhdG9yPC9jb2RlPiBhcyB0aGUgcm9vdCB0YWcgb2YgdGhlIFhNTCByZXNvdXJjZSB0aGF0CiAgICAgICAgICBkZXNjcmliZXMgYW4gYWNjb3VudCBhdXRoZW50aWNhdG9yLgogICAgICAtLT4KQEAgLTM2MjgsNyArMzk1NCw3IEBACiAgICAgPCEtLSBDb250YWN0cyBtZXRhLWRhdGEgYXR0cmlidXRlcyAtLT4KICAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+CiAgICAgPGVhdC1jb21tZW50IC8+Ci0gICAgCisKICAgICA8IS0tIFRPRE86IHJlbW92ZSB0aGlzIGRlcHJlY2F0ZWQgc3R5bGVhYmxlLiAtLT4KICAgICA8ZWF0LWNvbW1lbnQgLz4KICAgICA8ZGVjbGFyZS1zdHlsZWFibGUgbmFtZT0iSWNvbiI+CkBAIC0zNjU0LDYgKzM5ODAsOSBAQAogICAgICAgICA8YXR0ciBuYW1lPSJkZXRhaWxDb2x1bW4iIGZvcm1hdD0ic3RyaW5nIiAvPgogICAgICAgICA8IS0tIEZsYWcgaW5kaWNhdGluZyB0aGF0IGRldGFpbCBzaG91bGQgYmUgYnVpbHQgZnJvbSBTb2NpYWxQcm92aWRlci4gLS0+CiAgICAgICAgIDxhdHRyIG5hbWU9ImRldGFpbFNvY2lhbFN1bW1hcnkiIGZvcm1hdD0iYm9vbGVhbiIgLz4KKyAgICAgICAgPCEtLSBSZXNvdXJjZSByZXByZXNlbnRpbmcgdGhlIHRlcm0gIkFsbCBDb250YWN0cyIgKGUuZy4gIkFsbCBGcmllbmRzIiBvcgorICAgICAgICAiQWxsIGNvbm5lY3Rpb25zIikuIE9wdGlvbmFsIChEZWZhdWx0IGlzICJBbGwgQ29udGFjdHMiKS4gLS0+CisgICAgICAgIDxhdHRyIG5hbWU9ImFsbENvbnRhY3RzTmFtZSIgZm9ybWF0PSJzdHJpbmciIC8+CiAgICAgPC9kZWNsYXJlLXN0eWxlYWJsZT4KIAogICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KQEAgLTM2ODUsNCArNDAxNCwxMjUgQEAKICAgICAgICAgPGF0dHIgbmFtZT0ic2V0dGluZ3NBY3Rpdml0eSIgLz4KICAgICA8L2RlY2xhcmUtc3R5bGVhYmxlPgogCisgICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgorICAgIDwhLS0gQWRhcHRlcnMgYXR0cmlidXRlcyAgICAgICAgICAgICAtLT4KKyAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+CisgICAgPGVhdC1jb21tZW50IC8+CisKKyAgICA8IS0tIEFkYXB0ZXIgdXNlZCB0byBiaW5kIGN1cnNvcnMuIC0tPgorICAgIDxkZWNsYXJlLXN0eWxlYWJsZSBuYW1lPSJDdXJzb3JBZGFwdGVyIj4KKyAgICAgICAgPCEtLSBVUkkgdG8gZ2V0IHRoZSBjdXJzb3IgZnJvbS4gT3B0aW9uYWwuIC0tPgorICAgICAgICA8YXR0ciBuYW1lPSJ1cmkiIGZvcm1hdD0ic3RyaW5nIiAvPgorICAgICAgICA8IS0tIFNlbGVjdGlvbiBzdGF0ZW1lbnQgZm9yIHRoZSBxdWVyeS4gT3B0aW9uYWwuIC0tPgorICAgICAgICA8YXR0ciBuYW1lPSJzZWxlY3Rpb24iIGZvcm1hdD0ic3RyaW5nIiAvPgorICAgICAgICA8IS0tIFNvcnQgb3JkZXIgc3RhdGVtZW50IGZvciB0aGUgcXVlcnkuIE9wdGlvbmFsLiAtLT4KKyAgICAgICAgPGF0dHIgbmFtZT0ic29ydE9yZGVyIiBmb3JtYXQ9InN0cmluZyIgLz4KKyAgICAgICAgPCEtLSBMYXlvdXQgcmVzb3VyY2UgdXNlZCB0byBkaXNwbGF5IGVhY2ggcm93IGZyb20gdGhlIGN1cnNvci4gTWFuZGF0b3J5LiAtLT4KKyAgICAgICAgPGF0dHIgbmFtZT0ibGF5b3V0IiAvPgorICAgIDwvZGVjbGFyZS1zdHlsZWFibGU+CisKKyAgICA8IS0tIEF0dHJpYnV0ZXMgdXNlZCBpbiBiaW5kIGl0ZW1zIGZvciBYTUwgY3Vyc29yIGFkYXB0ZXJzLiAtLT4KKyAgICA8ZGVjbGFyZS1zdHlsZWFibGUgbmFtZT0iQ3Vyc29yQWRhcHRlcl9CaW5kSXRlbSI+CisgICAgICAgIDwhLS0gVGhlIG5hbWUgb2YgdGhlIGNvbHVtbiB0byBiaW5kIGZyb20uIE1hbmRhdG9yeS4gLS0+CisgICAgICAgIDxhdHRyIG5hbWU9ImZyb20iIGZvcm1hdD0ic3RyaW5nIiAvPgorICAgICAgICA8IS0tIFRoZSByZXNvdXJjZSBpZCBvZiB0aGUgdmlldyB0byBiaW5kIHRvLiBNYW5kYXRvcnkuIC0tPgorICAgICAgICA8YXR0ciBuYW1lPSJ0byIgZm9ybWF0PSJyZWZlcmVuY2UiIC8+CisgICAgICAgIDwhLS0gVGhlIHR5cGUgb2YgYmluZGluZy4gSWYgdGhpcyB2YWx1ZSBpcyBub3Qgc3BlY2lmaWVkLCB0aGUgdHlwZSB3aWxsIGJlCisgICAgICAgICAgICAgaW5mZXJyZWQgZnJvbSB0aGUgdHlwZSBvZiB0aGUgInRvIiB0YXJnZXQgdmlldy4gTWFuZGF0b3J5LgorCisgICAgICAgICAgICAgVGhlIHR5cGUgY2FuIGJlIG9uZSBvZjoKKyAgICAgICAgICAgICA8dWw+CisgICAgICAgICAgICAgPGxpPnN0cmluZywgVGhlIGNvbnRlbnQgb2YgdGhlIGNvbHVtbiBpcyBpbnRlcnByZXRlZCBhcyBhIHN0cmluZy48L2xpPgorICAgICAgICAgICAgIDxsaT5pbWFnZSwgVGhlIGNvbnRlbnQgb2YgdGhlIGNvbHVtbiBpcyBpbnRlcnByZXRlZCBhcyBhIGJsb2IgZGVzY3JpYmluZyBhbiBpbWFnZS48L2xpPgorICAgICAgICAgICAgIDxsaT5pbWFnZS11cmksIFRoZSBjb250ZW50IG9mIHRoZSBjb2x1bW4gaXMgaW50ZXJwcmV0ZWQgYXMgYSBVUkkgdG8gYW4gaW1hZ2UuPC9saT4KKyAgICAgICAgICAgICA8bGk+ZHJhd2FibGUsIFRoZSBjb250ZW50IG9mIHRoZSBjb2x1bW4gaXMgaW50ZXJwcmV0ZWQgYXMgYSByZXNvdXJjZSBpZCB0byBhIGRyYXdhYmxlLjwvbGk+CisgICAgICAgICAgICAgPGxpPkEgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUsIGNvcnJlc3BvbmRpbmcgdG8gYW4gaW1wbGVtZW50YXRpb24gb2YKKyAgICAgICAgICAgICAgICAgYW5kcm9pZC53aWRnZXQuQWRhcHRlcnMuQ3Vyc29yQmluZGVyLjwvbGk+CisgICAgICAgICAgICAgPC91bD4KKyAgICAgICAgIC0tPgorICAgICAgICA8YXR0ciBuYW1lPSJhcyIgZm9ybWF0PSJzdHJpbmciIC8+CisgICAgPC9kZWNsYXJlLXN0eWxlYWJsZT4KKworICAgIDwhLS0gQXR0cmlidXRlcyB1c2VkIGluIHNlbGVjdCBpdGVtcyBmb3IgWE1MIGN1cnNvciBhZGFwdGVycy4gLS0+CisgICAgPGRlY2xhcmUtc3R5bGVhYmxlIG5hbWU9IkN1cnNvckFkYXB0ZXJfU2VsZWN0SXRlbSI+CisgICAgICAgIDwhLS0gVGhlIG5hbWUgb2YgdGhlIGNvbHVtbiB0byBzZWxlY3QuIE1hbmRhdG9yeS4gLS0+CisgICAgICAgIDxhdHRyIG5hbWU9ImNvbHVtbiIgZm9ybWF0PSJzdHJpbmciIC8+CisgICAgPC9kZWNsYXJlLXN0eWxlYWJsZT4KKworICAgIDwhLS0gQXR0cmlidXRlcyB1c2VkIHRvIG1hcCB2YWx1ZXMgdG8gbmV3IHZhbHVlcyBpbiBYTUwgY3Vyc29yIGFkYXB0ZXJzJyBiaW5kIGl0ZW1zLiAtLT4KKyAgICA8ZGVjbGFyZS1zdHlsZWFibGUgbmFtZT0iQ3Vyc29yQWRhcHRlcl9NYXBJdGVtIj4KKyAgICAgICAgPCEtLSBUaGUgb3JpZ2luYWwgdmFsdWUgZnJvbSB0aGUgY29sdW1uLiBNYW5kYXRvcnkuIC0tPgorICAgICAgICA8YXR0ciBuYW1lPSJmcm9tVmFsdWUiIGZvcm1hdD0ic3RyaW5nIiAvPgorICAgICAgICA8IS0tIFRoZSBuZXcgdmFsdWUgZnJvbSB0aGUgY29sdW1uLiBNYW5kYXRvcnkuIC0tPgorICAgICAgICA8YXR0ciBuYW1lPSJ0b1ZhbHVlIiBmb3JtYXQ9InN0cmluZyIgLz4KKyAgICA8L2RlY2xhcmUtc3R5bGVhYmxlPgorCisgICAgPCEtLSBBdHRyaWJ1dGVzIHVzZWQgdG8gbWFwIHZhbHVlcyB0byBuZXcgdmFsdWVzIGluIFhNTCBjdXJzb3IgYWRhcHRlcnMnIGJpbmQgaXRlbXMuIC0tPgorICAgIDxkZWNsYXJlLXN0eWxlYWJsZSBuYW1lPSJDdXJzb3JBZGFwdGVyX1RyYW5zZm9ybUl0ZW0iPgorICAgICAgICA8IS0tIFRoZSB0cmFuc2Zvcm1hdGlvbiBleHByZXNzaW9uLiBNYW5kYXRvcnkgaWYgIndpdGhDbGFzcyIgaXMgbm90IHNwZWNpZmllZC4gLS0+CisgICAgICAgIDxhdHRyIG5hbWU9IndpdGhFeHByZXNzaW9uIiBmb3JtYXQ9InN0cmluZyIgLz4KKyAgICAgICAgPCEtLSBUaGUgdHJhbnNmb3JtYXRpb24gY2xhc3MsIGFuIGltcGxlbWVudGF0aW9uIG9mCisgICAgICAgICAgICAgYW5kcm9pZC53aWRnZXQuQWRhcHRlcnMuQ3Vyc29yVHJhbnNmb3JtYXRpb24uIE1hbmRhdG9yeSBpZiAid2l0aEV4cHJlc3Npb24iCisgICAgICAgICAgICAgaXMgbm90IHNwZWNpZmllZC4gLS0+CisgICAgICAgIDxhdHRyIG5hbWU9IndpdGhDbGFzcyIgZm9ybWF0PSJzdHJpbmciIC8+CisgICAgPC9kZWNsYXJlLXN0eWxlYWJsZT4KKworICAgIDwhLS0gQXR0cmlidXRlcyB1c2VkIHRvIHN0eWxlIHRoZSBBY3Rpb24gQmFyLiAtLT4KKyAgICA8ZGVjbGFyZS1zdHlsZWFibGUgbmFtZT0iQWN0aW9uQmFyIj4KKyAgICAgICAgPCEtLSBUaGUgdHlwZSBvZiBuYXZpZ2F0aW9uIHRvIHVzZS4gLS0+CisgICAgICAgIDxhdHRyIG5hbWU9Im5hdmlnYXRpb25Nb2RlIj4KKyAgICAgICAgICAgIDwhLS0gTm9ybWFsIHN0YXRpYyB0aXRsZSB0ZXh0IC0tPgorICAgICAgICAgICAgPGVudW0gbmFtZT0ibm9ybWFsIiB2YWx1ZT0iMCIgLz4KKyAgICAgICAgICAgIDwhLS0gVGhlIGFjdGlvbiBiYXIgd2lsbCB1c2UgYSBkcm9wLWRvd24gc2VsZWN0aW9uIGluIHBsYWNlIG9mIHRpdGxlIHRleHQuIC0tPgorICAgICAgICAgICAgPGVudW0gbmFtZT0iZHJvcGRvd25MaXN0IiB2YWx1ZT0iMSIgLz4KKyAgICAgICAgICAgIDwhLS0gVGhlIGFjdGlvbiBiYXIgd2lsbCB1c2UgYSBzZXJpZXMgb2YgaG9yaXpvbnRhbCB0YWJzIGluIHBsYWNlIG9mIHRpdGxlIHRleHQuIC0tPgorICAgICAgICAgICAgPGVudW0gbmFtZT0idGFiQmFyIiB2YWx1ZT0iMiIgLz4KKyAgICAgICAgPC9hdHRyPgorICAgICAgICA8IS0tIE9wdGlvbnMgYWZmZWN0aW5nIGhvdyB0aGUgYWN0aW9uIGJhciBpcyBkaXNwbGF5ZWQuIC0tPgorICAgICAgICA8YXR0ciBuYW1lPSJkaXNwbGF5T3B0aW9ucyI+CisgICAgICAgICAgICA8ZmxhZyBuYW1lPSJ1c2VMb2dvIiB2YWx1ZT0iMSIgLz4KKyAgICAgICAgICAgIDxmbGFnIG5hbWU9ImhpZGVIb21lIiB2YWx1ZT0iMiIgLz4KKyAgICAgICAgPC9hdHRyPgorICAgICAgICA8IS0tIFNwZWNpZmllcyB0aGUgY29sb3IgdXNlZCB0byBzdHlsZSB0aGUgYWN0aW9uIGJhci4gLS0+CisgICAgICAgIDxhdHRyIG5hbWU9ImNvbG9yRmlsdGVyIiBmb3JtYXQ9ImNvbG9yIiAvPgorICAgICAgICA8IS0tIFNwZWNpZmllcyB0aXRsZSB0ZXh0IHVzZWQgZm9yIG5hdmlnYXRpb25Nb2RlPSJub3JtYWwiIC0tPgorICAgICAgICA8YXR0ciBuYW1lPSJ0aXRsZSIgLz4KKyAgICAgICAgPCEtLSBTcGVjaWZpZXMgc3VidGl0bGUgdGV4dCB1c2VkIGZvciBuYXZpZ2F0aW9uTW9kZT0ibm9ybWFsIiAtLT4KKyAgICAgICAgPGF0dHIgbmFtZT0ic3VidGl0bGUiIGZvcm1hdD0ic3RyaW5nIiAvPgorICAgICAgICA8IS0tIFNwZWNpZmllcyBhIHN0eWxlIHRvIHVzZSBmb3IgdGl0bGUgdGV4dC4gLS0+CisgICAgICAgIDxhdHRyIG5hbWU9InRpdGxlVGV4dFN0eWxlIiBmb3JtYXQ9InJlZmVyZW5jZSIgLz4KKyAgICAgICAgPCEtLSBTcGVjaWZpZXMgYSBzdHlsZSB0byB1c2UgZm9yIHN1YnRpdGxlIHRleHQuIC0tPgorICAgICAgICA8YXR0ciBuYW1lPSJzdWJ0aXRsZVRleHRTdHlsZSIgZm9ybWF0PSJyZWZlcmVuY2UiIC8+CisgICAgICAgIDwhLS0gU3BlY2lmaWVzIHRoZSBkcmF3YWJsZSB1c2VkIGZvciB0aGUgYXBwbGljYXRpb24gaWNvbi4gLS0+CisgICAgICAgIDxhdHRyIG5hbWU9Imljb24iIC8+CisgICAgICAgIDwhLS0gU3BlY2lmaWVzIHRoZSBkcmF3YWJsZSB1c2VkIGZvciB0aGUgYXBwbGljYXRpb24gbG9nby4gLS0+CisgICAgICAgIDxhdHRyIG5hbWU9ImxvZ28iIC8+CisgICAgICAgIDwhLS0gU3BlY2lmaWVzIHRoZSBkcmF3YWJsZSB1c2VkIGZvciBpdGVtIGRpdmlkZXJzLiAtLT4KKyAgICAgICAgPGF0dHIgbmFtZT0iZGl2aWRlciIgLz4KKyAgICAgICAgPCEtLSBTcGVjaWZpZXMgYSBiYWNrZ3JvdW5kIGRyYXdhYmxlIGZvciB0aGUgYWN0aW9uIGJhci4gLS0+CisgICAgICAgIDxhdHRyIG5hbWU9ImJhY2tncm91bmQiIC8+CisgICAgICAgIDwhLS0gU3BlY2lmaWVzIGEgbGF5b3V0IGZvciBjdXN0b20gbmF2aWdhdGlvbi4gT3ZlcnJpZGVzIG5hdmlnYXRpb25Nb2RlLiAtLT4KKyAgICAgICAgPGF0dHIgbmFtZT0iY3VzdG9tTmF2aWdhdGlvbkxheW91dCIgZm9ybWF0PSJyZWZlcmVuY2UiIC8+CisgICAgICAgIDwhLS0gU3BlY2lmaWVzIGEgZml4ZWQgaGVpZ2h0LiAtLT4KKyAgICAgICAgPGF0dHIgbmFtZT0iaGVpZ2h0IiAvPgorICAgIDwvZGVjbGFyZS1zdHlsZWFibGU+CisKKyAgICA8ZGVjbGFyZS1zdHlsZWFibGUgbmFtZT0iQWN0aW9uTW9kZSI+CisgICAgICAgIDwhLS0gU3BlY2lmaWVzIGEgc3R5bGUgdG8gdXNlIGZvciB0aXRsZSB0ZXh0LiAtLT4KKyAgICAgICAgPGF0dHIgbmFtZT0idGl0bGVUZXh0U3R5bGUiIC8+CisgICAgICAgIDwhLS0gU3BlY2lmaWVzIGEgc3R5bGUgdG8gdXNlIGZvciBzdWJ0aXRsZSB0ZXh0LiAtLT4KKyAgICAgICAgPGF0dHIgbmFtZT0ic3VidGl0bGVUZXh0U3R5bGUiIC8+CisgICAgICAgIDwhLS0gU3BlY2lmaWVzIGEgYmFja2dyb3VuZCBmb3IgdGhlIGFjdGlvbiBtb2RlIGJhci4gLS0+CisgICAgICAgIDxhdHRyIG5hbWU9ImJhY2tncm91bmQiIC8+CisgICAgICAgIDwhLS0gU3BlY2lmaWVzIGEgZml4ZWQgaGVpZ2h0IGZvciB0aGUgYWN0aW9uIG1vZGUgYmFyLiAtLT4KKyAgICAgICAgPGF0dHIgbmFtZT0iaGVpZ2h0IiAvPgorICAgICAgICA8IS0tIFNwZWNpZmllcyBhIHBhZGRpbmcgdG8gdXNlIGJldHdlZW4gZWxlbWVudHMgb24gdGhlIGJhci4gLS0+CisgICAgICAgIDxhdHRyIG5hbWU9Iml0ZW1QYWRkaW5nIiBmb3JtYXQ9ImRpbWVuc2lvbiIgLz4KKyAgICA8L2RlY2xhcmUtc3R5bGVhYmxlPgorCisgICAgPGRlY2xhcmUtc3R5bGVhYmxlIG5hbWU9IlNlYXJjaFZpZXciPgorICAgICAgICA8IS0tIFRoZSBkZWZhdWx0IHN0YXRlIG9mIHRoZSBTZWFyY2hWaWV3LiBJZiB0cnVlLCBpdCB3aWxsIGJlIGljb25pZmllZCB3aGVuIG5vdCBpbgorICAgICAgICAgICAgIHVzZSBhbmQgZXhwYW5kZWQgd2hlbiBjbGlja2VkLiAtLT4KKyAgICAgICAgPGF0dHIgbmFtZT0iaWNvbmlmaWVkQnlEZWZhdWx0IiBmb3JtYXQ9ImJvb2xlYW4iLz4KKyAgICA8L2RlY2xhcmUtc3R5bGVhYmxlPgogPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvdmFsdWVzL2F0dHJzX21hbmlmZXN0LnhtbCBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMvYXR0cnNfbWFuaWZlc3QueG1sCmluZGV4IGZiNDkxMjAuLjhjZjY1YWUgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy92YWx1ZXMvYXR0cnNfbWFuaWZlc3QueG1sCisrKyBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMvYXR0cnNfbWFuaWZlc3QueG1sCkBAIC0yMzUsNiArMjM1LDEwIEBACiAgICAgICAgICB0aGUgc2FmZSBtb2RlLiAgLS0+CiAgICAgPGF0dHIgbmFtZT0idm1TYWZlTW9kZSIgZm9ybWF0PSJib29sZWFuIiAvPgogCisgICAgPCEtLSBGbGFnIGluZGljYXRpbmcgd2hldGhlciB0aGUgYXBwbGljYXRpb24ncyByZW5kZXJpbmcgc2hvdWxkIGJlIGhhcmR3YXJlCisgICAgICAgICBhY2NlbGVyYXRlZCBpZiBwb3NzaWJsZS4gIC0tPgorICAgIDxhdHRyIG5hbWU9ImhhcmR3YXJlQWNjZWxlcmF0ZWQiIGZvcm1hdD0iYm9vbGVhbiIgLz4KKwogICAgIDwhLS0gRmxhZyBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIGdpdmVuIGFwcGxpY2F0aW9uIGNvbXBvbmVudCBpcyBhdmFpbGFibGUKICAgICAgICAgIHRvIG90aGVyIGFwcGxpY2F0aW9ucy4gIElmIGZhbHNlLCBpdCBjYW4gb25seSBiZSBhY2Nlc3NlZCBieQogICAgICAgICAgYXBwbGljYXRpb25zIHdpdGggaXRzIHNhbWUgdXNlciBpZCAod2hpY2ggdXN1YWxseSBtZWFucyBvbmx5IGJ5CkBAIC03MzQsNiArNzM4LDcgQEAKICAgICAgICAgPGF0dHIgbmFtZT0iZW5hYmxlZCIgLz4KICAgICAgICAgPGF0dHIgbmFtZT0iZGVidWdnYWJsZSIgLz4KICAgICAgICAgPGF0dHIgbmFtZT0idm1TYWZlTW9kZSIgLz4KKyAgICAgICAgPGF0dHIgbmFtZT0iaGFyZHdhcmVBY2NlbGVyYXRlZCIgLz4KICAgICAgICAgPCEtLSBOYW1lIG9mIGFjdGl2aXR5IHRvIGJlIGxhdW5jaGVkIGZvciBtYW5hZ2luZyB0aGUgYXBwbGljYXRpb24ncyBzcGFjZSBvbiB0aGUgZGV2aWNlLiAtLT4KICAgICAgICAgPGF0dHIgbmFtZT0ibWFuYWdlU3BhY2VBY3Rpdml0eSIgLz4KICAgICAgICAgPGF0dHIgbmFtZT0iYWxsb3dDbGVhclVzZXJEYXRhIiAvPgpAQCAtMTIwNyw2ICsxMjEyLDcgQEAKICAgICAgICAgICAgICBhbnkgdmFsdWUgaW4gdGhlIHRoZW1lLiAtLT4KICAgICAgICAgPGF0dHIgbmFtZT0id2luZG93U29mdElucHV0TW9kZSIgLz4KICAgICAgICAgPGF0dHIgbmFtZT0iaW1tZXJzaXZlIiAvPgorICAgICAgICA8YXR0ciBuYW1lPSJoYXJkd2FyZUFjY2VsZXJhdGVkIiAvPgogICAgIDwvZGVjbGFyZS1zdHlsZWFibGU+CiAgICAgCiAgICAgPCEtLSBUaGUgPGNvZGU+YWN0aXZpdHktYWxpYXM8L2NvZGU+IHRhZyBkZWNsYXJlcyBhIG5ldwpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL3ZhbHVlcy9jb2xvcnMueG1sIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy9jb2xvcnMueG1sCmluZGV4IGI2YWY2YjIuLmU5YTRjYTMgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy92YWx1ZXMvY29sb3JzLnhtbAorKysgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzL2NvbG9ycy54bWwKQEAgLTE4LDggKzE4LDggQEAKICovCiAtLT4KIDxyZXNvdXJjZXM+Ci0JPGRyYXdhYmxlIG5hbWU9InNjcmVlbl9iYWNrZ3JvdW5kX2xpZ2h0Ij4jZmZmZmZmZmY8L2RyYXdhYmxlPgotCTxkcmF3YWJsZSBuYW1lPSJzY3JlZW5fYmFja2dyb3VuZF9kYXJrIj4jZmYwMDAwMDA8L2RyYXdhYmxlPgorCTxkcmF3YWJsZSBuYW1lPSJzY3JlZW5fYmFja2dyb3VuZF9saWdodCI+I2ZmZWZlZmVmPC9kcmF3YWJsZT4KKwk8ZHJhd2FibGUgbmFtZT0ic2NyZWVuX2JhY2tncm91bmRfZGFyayI+I2ZmMTAxMDEwPC9kcmF3YWJsZT4KICAgICA8ZHJhd2FibGUgbmFtZT0ic3RhdHVzX2Jhcl9jbG9zZWRfZGVmYXVsdF9iYWNrZ3JvdW5kIj4jZmYwMDAwMDA8L2RyYXdhYmxlPgogICAgIDxkcmF3YWJsZSBuYW1lPSJzdGF0dXNfYmFyX29wZW5lZF9kZWZhdWx0X2JhY2tncm91bmQiPiNmZjAwMDAwMDwvZHJhd2FibGU+CiAgICAgPGRyYXdhYmxlIG5hbWU9InNlYXJjaF9iYXJfZGVmYXVsdF9jb2xvciI+I2ZmMDAwMDAwPC9kcmF3YWJsZT4KQEAgLTM2LDI0ICszNiwzMCBAQAogICAgIDxjb2xvciBuYW1lPSJ3aGl0ZSI+I2ZmZmZmZmZmPC9jb2xvcj4KICAgICA8Y29sb3IgbmFtZT0iYmxhY2siPiNmZjAwMDAwMDwvY29sb3I+CiAgICAgPGNvbG9yIG5hbWU9InRyYW5zcGFyZW50Ij4jMDAwMDAwMDA8L2NvbG9yPgotICAgIDxjb2xvciBuYW1lPSJiYWNrZ3JvdW5kX2RhcmsiPiNmZjAwMDAwMDwvY29sb3I+Ci0gICAgPGNvbG9yIG5hbWU9ImJyaWdodF9mb3JlZ3JvdW5kX2RhcmsiPiNmZmZmZmZmZjwvY29sb3I+CisgICAgPGNvbG9yIG5hbWU9ImJhY2tncm91bmRfZGFyayI+I2ZmMTAxMDEwPC9jb2xvcj4KKyAgICA8Y29sb3IgbmFtZT0iYmFja2dyb3VuZF9saWdodCI+I2ZmZWZlZmVmPC9jb2xvcj4KKyAgICA8Y29sb3IgbmFtZT0iYnJpZ2h0X2ZvcmVncm91bmRfZGFyayI+QGFuZHJvaWQ6Y29sb3IvYmFja2dyb3VuZF9saWdodDwvY29sb3I+CisgICAgPGNvbG9yIG5hbWU9ImJyaWdodF9mb3JlZ3JvdW5kX2xpZ2h0Ij5AYW5kcm9pZDpjb2xvci9iYWNrZ3JvdW5kX2Rhcms8L2NvbG9yPgogICAgIDxjb2xvciBuYW1lPSJicmlnaHRfZm9yZWdyb3VuZF9kYXJrX2Rpc2FibGVkIj4jODBmZmZmZmY8L2NvbG9yPgotICAgIDxjb2xvciBuYW1lPSJicmlnaHRfZm9yZWdyb3VuZF9kYXJrX2ludmVyc2UiPiNmZjAwMDAwMDwvY29sb3I+CisgICAgPGNvbG9yIG5hbWU9ImJyaWdodF9mb3JlZ3JvdW5kX2xpZ2h0X2Rpc2FibGVkIj4jODAwMDAwMDA8L2NvbG9yPgorICAgIDxjb2xvciBuYW1lPSJicmlnaHRfZm9yZWdyb3VuZF9kYXJrX2ludmVyc2UiPkBhbmRyb2lkOmNvbG9yL2JyaWdodF9mb3JlZ3JvdW5kX2xpZ2h0PC9jb2xvcj4KKyAgICA8Y29sb3IgbmFtZT0iYnJpZ2h0X2ZvcmVncm91bmRfbGlnaHRfaW52ZXJzZSI+QGFuZHJvaWQ6Y29sb3IvYnJpZ2h0X2ZvcmVncm91bmRfZGFyazwvY29sb3I+CiAgICAgPGNvbG9yIG5hbWU9ImRpbV9mb3JlZ3JvdW5kX2RhcmsiPiNiZWJlYmU8L2NvbG9yPgogICAgIDxjb2xvciBuYW1lPSJkaW1fZm9yZWdyb3VuZF9kYXJrX2Rpc2FibGVkIj4jODBiZWJlYmU8L2NvbG9yPgogICAgIDxjb2xvciBuYW1lPSJkaW1fZm9yZWdyb3VuZF9kYXJrX2ludmVyc2UiPiMzMjMyMzI8L2NvbG9yPgogICAgIDxjb2xvciBuYW1lPSJkaW1fZm9yZWdyb3VuZF9kYXJrX2ludmVyc2VfZGlzYWJsZWQiPiM4MDMyMzIzMjwvY29sb3I+CiAgICAgPGNvbG9yIG5hbWU9ImhpbnRfZm9yZWdyb3VuZF9kYXJrIj4jODA4MDgwPC9jb2xvcj4KLSAgICA8Y29sb3IgbmFtZT0iYmFja2dyb3VuZF9saWdodCI+I2ZmZmZmZmZmPC9jb2xvcj4KLSAgICA8Y29sb3IgbmFtZT0iYnJpZ2h0X2ZvcmVncm91bmRfbGlnaHQiPiNmZjAwMDAwMDwvY29sb3I+Ci0gICAgPGNvbG9yIG5hbWU9ImJyaWdodF9mb3JlZ3JvdW5kX2xpZ2h0X2ludmVyc2UiPiNmZmZmZmZmZjwvY29sb3I+Ci0gICAgPGNvbG9yIG5hbWU9ImJyaWdodF9mb3JlZ3JvdW5kX2xpZ2h0X2Rpc2FibGVkIj4jODAwMDAwMDA8L2NvbG9yPgogICAgIDxjb2xvciBuYW1lPSJkaW1fZm9yZWdyb3VuZF9saWdodCI+IzMyMzIzMjwvY29sb3I+CiAgICAgPGNvbG9yIG5hbWU9ImRpbV9mb3JlZ3JvdW5kX2xpZ2h0X2Rpc2FibGVkIj4jODAzMjMyMzI8L2NvbG9yPgogICAgIDxjb2xvciBuYW1lPSJkaW1fZm9yZWdyb3VuZF9saWdodF9pbnZlcnNlIj4jYmViZWJlPC9jb2xvcj4KICAgICA8Y29sb3IgbmFtZT0iZGltX2ZvcmVncm91bmRfbGlnaHRfaW52ZXJzZV9kaXNhYmxlZCI+IzgwYmViZWJlPC9jb2xvcj4KICAgICA8Y29sb3IgbmFtZT0iaGludF9mb3JlZ3JvdW5kX2xpZ2h0Ij4jODA4MDgwPC9jb2xvcj4KKyAgICA8Y29sb3IgbmFtZT0iaGlnaGxpZ2h0X2JhY2tncm91bmQiPiNjYzQ3NTkyNTwvY29sb3I+CisgICAgPGNvbG9yIG5hbWU9ImhpZ2hsaWdodF9iYWNrZ3JvdW5kX2ludmVyc2UiPiNjY2QyZTQ2MTwvY29sb3I+CisgICAgPGNvbG9yIG5hbWU9ImhpZ2hsaWdodGVkX3RleHRfZGFyayI+I2NjNDc1OTI1PC9jb2xvcj4KKyAgICA8Y29sb3IgbmFtZT0iaGlnaGxpZ2h0ZWRfdGV4dF9saWdodCI+I2NjZDJlNDYxPC9jb2xvcj4KKyAgICA8Y29sb3IgbmFtZT0ibGlua190ZXh0X2RhcmsiPiM1YzVjZmY8L2NvbG9yPgorICAgIDxjb2xvciBuYW1lPSJsaW5rX3RleHRfbGlnaHQiPiMwMDAwZWU8L2NvbG9yPgogCiAgICAgPGRyYXdhYmxlIG5hbWU9InN0YXRfbm90aWZ5X3N5bmNfbm9hbmltIj5AZHJhd2FibGUvc3RhdF9ub3RpZnlfc3luY19hbmltMDwvZHJhd2FibGU+CiAgICAgPGRyYXdhYmxlIG5hbWU9InN0YXRfc3lzX2Rvd25sb2FkX2RvbmUiPkBkcmF3YWJsZS9zdGF0X3N5c19kb3dubG9hZF9hbmltMDwvZHJhd2FibGU+CmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvdmFsdWVzL2NvbmZpZy54bWwgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzL2NvbmZpZy54bWwKaW5kZXggODAwZWQxMy4uYzU0ODZlMyAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL3ZhbHVlcy9jb25maWcueG1sCisrKyBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMvY29uZmlnLnhtbApAQCAtMjIsNyArMjIsOCBAQAogPHJlc291cmNlcyB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+CiAgICAgPCEtLSBDb21wb25lbnQgdG8gYmUgdXNlZCBhcyB0aGUgc3RhdHVzIGJhciBzZXJ2aWNlLiAgTXVzdCBpbXBsZW1lbnQgdGhlIElTdGF0dXNCYXIKICAgICAgICAgIGludGVyZmFjZS4gIFRoaXMgbmFtZSBpcyBpbiB0aGUgQ29tcG9uZW50TmFtZSBmbGF0dGVuZWQgZm9ybWF0IChwYWNrYWdlL2NsYXNzKSAgLS0+Ci0gICAgPHN0cmluZyBuYW1lPSJjb25maWdfc3RhdHVzQmFyQ29tcG9uZW50Ij5jb20uYW5kcm9pZC5zeXN0ZW11aS9jb20uYW5kcm9pZC5zeXN0ZW11aS5zdGF0dXNiYXIuU3RhdHVzQmFyU2VydmljZTwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iY29uZmlnX3N0YXR1c0JhckNvbXBvbmVudCI+Y29tLmFuZHJvaWQuc3lzdGVtdWkvY29tLmFuZHJvaWQuc3lzdGVtdWkuc3RhdHVzYmFyLlBob25lU3RhdHVzQmFyU2VydmljZTwvc3RyaW5nPgorICAgIDxib29sIG5hbWU9ImNvbmZpZ19zdGF0dXNCYXJDYW5IaWRlIj50cnVlPC9ib29sPgogCiAgICAgPCEtLSBEbyBub3QgdHJhbnNsYXRlLiBEZWZpbmVzIHRoZSBzbG90cyBmb3IgdGhlIHJpZ2h0LWhhbmQgc2lkZSBpY29ucy4gIFRoYXQgaXMgdG8gc2F5LCB0aGUKICAgICAgICAgIGljb25zIGluIHRoZSBzdGF0dXMgYmFyIHRoYXQgYXJlIG5vdCBub3RpZmljYXRpb25zLiAtLT4KQEAgLTcyLDYgKzczLDE3IEBACiAgICAgICAgICB3aGVuIHRoZXJlJ3Mgbm8gbmV0d29yayBjb25uZWN0aW9uLiBJZiB0aGUgc2NhbiBkb2Vzbid0IHRpbWVvdXQsIHVzZSB6ZXJvIC0tPgogICAgIDxpbnRlZ2VyIG5hbWU9ImNvbmZpZ19yYWRpb1NjYW5uaW5nVGltZW91dCI+MDwvaW50ZWdlcj4KIAorICAgIDwhLS0gU2V0IHRvIHRydWUgaWYgdGhlIGxvY2F0aW9uIHJldHVybmVkIEVudmlyb25tZW50LmdldEV4dGVybmFsU3RvcmFnZURpcmVjdG9yeSgpCisgICAgICAgICBpcyBhY3R1YWxseSBhIHN1YmRpcmVjdG9yeSBvZiB0aGUgaW50ZXJuYWwgc3RvcmFnZS4KKyAgICAgICAgIElmIHRoaXMgaXMgc2V0IHRoZW4gRW52aXJvbm1lbnQuZ2V0RXh0ZXJuYWxTdG9yYWdlU3RhdGUoKSB3aWxsIGFsd2F5cyByZXR1cm4KKyAgICAgICAgIE1FRElBX01PVU5URUQgYW5kIEludGVudC5BQ1RJT05fTUVESUFfTU9VTlRFRCB3aWxsIGJlIGJyb2FkY2FzdCBhdCBib290IHRpbWUKKyAgICAgICAgIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5IHdpdGggYXBwcyB0aGF0IHJlcXVpcmUgZXh0ZXJuYWwgc3RvcmFnZS4gLS0+CisgICAgPGJvb2wgbmFtZT0iY29uZmlnX2VtdWxhdGVFeHRlcm5hbFN0b3JhZ2UiPmZhbHNlPC9ib29sPgorCisgICAgPCEtLSBTZXQgdG8gdHJ1ZSBpZiBleHRlcm5hbCBzdG9yYWdlIGlzIGNhc2Ugc2Vuc2l0aXZlLgorICAgICAgICAgVHlwaWNhbGx5IGV4dGVybmFsIHN0b3JhZ2UgaXMgRkFULCB3aGljaCBpcyBjYXNlIGluc2Vuc2l0aXZlLiAtLT4KKyAgICA8Ym9vbCBuYW1lPSJjb25maWdfY2FzZVNlbnNpdGl2ZUV4dGVybmFsU3RvcmFnZSI+ZmFsc2U8L2Jvb2w+CisKICAgICA8IS0tIFhYWFhYIE5PVEUgVEhFIEZPTExPV0lORyBSRVNPVVJDRVMgVVNFIFRIRSBXUk9ORyBOQU1JTkcgQ09OVkVOVElPTi4KICAgICAgICAgIFBsZWFzZSBkb24ndCBjb3B5IHRoZW0sIGNvcHkgYW55dGhpbmcgZWxzZS4gLS0+CiAKQEAgLTk4LDYgKzExMCw5IEBACiAgICAgICAgIDxpdGVtPiIwLDEiPC9pdGVtPgogICAgIDwvc3RyaW5nLWFycmF5PgogCisgICAgPCEtLSBUaGUgbWF4aW11bSBkdXJhdGlvbiAoaW4gbWlsbGlzZWNvbmRzKSB3ZSBleHBlY3QgYSBuZXR3b3JrIHRyYW5zaXRpb24gdG8gdGFrZSAtLT4KKyAgICA8aW50ZWdlciBuYW1lPSJjb25maWdfbmV0d29ya1RyYW5zaXRpb25UaW1lb3V0Ij42MDAwMDwvaW50ZWdlcj4KKwogICAgIDwhLS0gTGlzdCBvZiByZWdleHByZXNzaW9ucyBkZXNjcmliaW5nIHRoZSBpbnRlcmZhY2UgKGlmIGFueSkgdGhhdCByZXByZXNlbnQgdGV0aGVyYWJsZQogICAgICAgICAgVVNCIGludGVyZmFjZXMuICBJZiB0aGUgZGV2aWNlIGRvZXNuJ3Qgd2FudCB0byBzdXBwb3J0IHRldGhpbmcgb3ZlciBVU0IgdGhpcyBzaG91bGQKICAgICAgICAgIGJlIGVtcHR5LiAgQW4gZXhhbXBsZSB3b3VsZCBiZSAidXNiLioiIC0tPgpAQCAtMTEwLDYgKzEyNSwxNiBAQAogICAgIDxzdHJpbmctYXJyYXkgdHJhbnNsYXRhYmxlPSJmYWxzZSIgbmFtZT0iY29uZmlnX3RldGhlcl93aWZpX3JlZ2V4cyI+CiAgICAgPC9zdHJpbmctYXJyYXk+CiAKKyAgICA8IS0tIExpc3Qgb2YgcmVnZXhwcmVzc2lvbnMgZGVzY3JpYmluZyB0aGUgaW50ZXJmYWNlIChpZiBhbnkpIHRoYXQgcmVwcmVzZW50IHRldGhlcmFibGUKKyAgICAgICAgIGJsdWV0b290aCBpbnRlcmZhY2VzLiAgSWYgdGhlIGRldmljZSBkb2Vzbid0IHdhbnQgdG8gc3VwcG9ydCB0ZXRoZXJpbmcgb3ZlciBibHVldG9vdGggdGhpcworICAgICAgICAgc2hvdWxkIGJlIGVtcHR5LiAtLT4KKyAgICA8c3RyaW5nLWFycmF5IHRyYW5zbGF0YWJsZT0iZmFsc2UiIG5hbWU9ImNvbmZpZ190ZXRoZXJfYmx1ZXRvb3RoX3JlZ2V4cyI+CisgICAgPC9zdHJpbmctYXJyYXk+CisKKyAgICA8IS0tIE1heCBudW1iZXIgb2YgQmx1ZXRvb3RoIHRldGhlcmluZyBjb25uZWN0aW9ucyBhbGxvd2VkLiBJZiB0aGlzIGlzCisgICAgICAgICB1cGRhdGVkIGNvbmZpZ190ZXRoZXJfZGhjcF9yYW5nZSBoYXMgdG8gYmUgdXBkYXRlZCBhcHByb3ByaWF0ZWx5LiAtLT4KKyAgICA8aW50ZWdlciB0cmFuc2xhdGVhYmxlPSJmYWxzZSIgbmFtZT0iY29uZmlnX21heF9wYW5fZGV2aWNlcyI+NTwvaW50ZWdlcj4KKwogICAgIDwhLS0gRGhjcCByYW5nZSAobWluLCBtYXgpIHRvIHVzZSBmb3IgdGV0aGVyaW5nIHB1cnBvc2VzIC0tPgogICAgIDxzdHJpbmctYXJyYXkgdHJhbnNsYXRhYmxlPSJmYWxzZSIgbmFtZT0iY29uZmlnX3RldGhlcl9kaGNwX3JhbmdlIj4KICAgICA8L3N0cmluZy1hcnJheT4KQEAgLTE5MSw2ICsyMTYsOSBAQAogICAgIDwhLS0gSW5kaWNhdGUgd2hldGhlciB0aGUgU0QgY2FyZCBpcyBhY2Nlc3NpYmxlIHdpdGhvdXQgcmVtb3ZpbmcgdGhlIGJhdHRlcnkuIC0tPgogICAgIDxib29sIG5hbWU9ImNvbmZpZ19iYXR0ZXJ5U2RDYXJkQWNjZXNzaWJpbGl0eSI+ZmFsc2U8L2Jvb2w+CiAKKyAgICA8IS0tIEluZGljYXRlIHdoZXRoZXIgdGhlIGRldmljZSBoYXMgVVNCIGhvc3Qgc3VwcG9ydC4gLS0+CisgICAgPGJvb2wgbmFtZT0iY29uZmlnX2hhc1VzYkhvc3RTdXBwb3J0Ij5mYWxzZTwvYm9vbD4KKwogICAgIDwhLS0gVmlicmF0b3IgcGF0dGVybiBmb3IgZmVlZGJhY2sgYWJvdXQgYSBsb25nIHNjcmVlbi9rZXkgcHJlc3MgLS0+CiAgICAgPGludGVnZXItYXJyYXkgbmFtZT0iY29uZmlnX2xvbmdQcmVzc1ZpYmVQYXR0ZXJuIj4KICAgICAgICAgPGl0ZW0+MDwvaXRlbT4KQEAgLTI3Myw2ICszMDEsMTUgQEAKICAgICA8IS0tIEFsbG93IHRoZSBtZW51IGhhcmQga2V5IHRvIGJlIGRpc2FibGVkIGluIExvY2tTY3JlZW4gb24gc29tZSBkZXZpY2VzIC0tPgogICAgIDxib29sIG5hbWU9ImNvbmZpZ19kaXNhYmxlTWVudUtleUluTG9ja1NjcmVlbiI+ZmFsc2U8L2Jvb2w+CiAKKyAgICA8IS0tIFNob3cgc2xpZGluZyB0YWIgYmVmb3JlIGxvY2tzY3JlZW4gLS0+CisgICAgPGJvb2wgbmFtZT0iY29uZmlnX2VuYWJsZVNsaWRpbmdUYWJGaXJzdCI+dHJ1ZTwvYm9vbD4KKworICAgIDwhLS0gRGlhYmxlIGxvY2tzY3JlZW4gcm90YXRpb24gYnkgZGVmYXVsdCAtLT4KKyAgICA8Ym9vbCBuYW1lPSJjb25maWdfZW5hYmxlTG9ja1NjcmVlblJvdGF0aW9uIj5mYWxzZTwvYm9vbD4KKworICAgIDwhLS0gRW5hYmxlIDNEIFJlY2VudEFwcGxpY2F0aW9ucyB2aWV3IC0tPgorICAgIDxib29sIG5hbWU9ImNvbmZpZ19lbmFibGVSZWNlbnRBcHBzM0QiPmZhbHNlPC9ib29sPgorCiAgICAgPCEtLSBBcnJheSBvZiBsaWdodCBzZW5zb3IgTFVYIHZhbHVlcyB0byBkZWZpbmUgb3VyIGxldmVscyBmb3IgYXV0byBiYWNrbGlnaHQgYnJpZ2h0bmVzcyBzdXBwb3J0LgogICAgICAgICAgVGhlIE4gZW50cmllcyBvZiB0aGlzIGFycmF5IGRlZmluZSBOICsgMSB6b25lcyBhcyBmb2xsb3dzOgogCkBAIC0zNTcsNCArMzk0LDIzIEBACiAgICAgPCEtLSAyIG1lYW5zIGdpdmUgd2FybmluZyAtLT4KICAgICA8aW50ZWdlciBuYW1lPSJjb25maWdfZGF0YXVzZV9ub3RpZmljYXRpb25fdHlwZSI+MjwvaW50ZWdlcj4KIAorICAgIDwhLS0gRmxhZyBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIGN1cnJlbnQgZGV2aWNlIGlzICJ2b2ljZSBjYXBhYmxlIi4KKyAgICAgICAgIElmIHRydWUsIHRoaXMgbWVhbnMgdGhhdCB0aGUgZGV2aWNlIHN1cHBvcnRzIGNpcmN1aXQtc3dpdGNoZWQKKyAgICAgICAgIChpLmUuIHZvaWNlKSBwaG9uZSBjYWxscyBvdmVyIHRoZSB0ZWxlcGhvbnkgbmV0d29yaywgYW5kIGlzCisgICAgICAgICBhbGxvd2VkIHRvIGRpc3BsYXkgdGhlIGluLWNhbGwgVUkgd2hpbGUgYSBjZWxsdWxhciB2b2ljZSBjYWxsIGlzCisgICAgICAgICBhY3RpdmUuICBUaGlzIGNhbiBiZSBvdmVycmlkZGVuIHRvIGZhbHNlIGZvciAiZGF0YSBvbmx5IiBkZXZpY2VzCisgICAgICAgICB3aGljaCBjYW4ndCBtYWtlIHZvaWNlIGNhbGxzIGFuZCBkb24ndCBzdXBwb3J0IGFueSBpbi1jYWxsIFVJLgorCisgICAgICAgICBOb3RlOiB0aGlzIGZsYWcgaXMgc3VidGx5IGRpZmZlcmVudCBmcm9tIHRoZQorICAgICAgICAgUGFja2FnZU1hbmFnZXIuRkVBVFVSRV9URUxFUEhPTlkgc3lzdGVtIGZlYXR1cmUsIHdoaWNoIGlzCisgICAgICAgICBhdmFpbGFibGUgb24gKmFueSogZGV2aWNlIHdpdGggYSB0ZWxlcGhvbnkgcmFkaW8sIGV2ZW4gaWYgdGhlCisgICAgICAgICBkZXZpY2UgaXMgZGF0YS1vbmx5LiAtLT4KKyAgICA8Ym9vbCBuYW1lPSJjb25maWdfdm9pY2VfY2FwYWJsZSI+dHJ1ZTwvYm9vbD4KKworICAgIDwhLS0gSVAgYWRkcmVzcyBvZiB0aGUgZG5zIHNlcnZlciB0byB1c2UgaWYgbm9ib2R5IGVsc2Ugc3VnZ2VzdHMgb25lIC0tPgorICAgIDxzdHJpbmcgbmFtZT0iY29uZmlnX2RlZmF1bHRfZG5zX3NlcnZlciI+OC44LjguODwvc3RyaW5nPgorCisgICAgPCEtLSBUaGUgZGVmYXVsdCBjaGFyYWN0ZXIgc2V0IGZvciBHc21BbHBoYWJldCAtLT4KKyAgICA8IS0tIEVtcHR5IHN0cmluZyBtZWFucyBNQkNTIGlzIG5vdCBjb25zaWRlcmVkIC0tPgorICAgIDxzdHJpbmcgbmFtZT0iZ3NtX2FscGhhYmV0X2RlZmF1bHRfY2hhcnNldCI+PC9zdHJpbmc+CiA8L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy92YWx1ZXMvZGltZW5zLnhtbCBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMvZGltZW5zLnhtbAppbmRleCAxMWYzZTUwLi5kM2FhMmQ0IDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvdmFsdWVzL2RpbWVucy54bWwKKysrIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy9kaW1lbnMueG1sCkBAIC0yNSw2ICsyNSw5IEBACiAgICAgPCEtLSBUaGUgc3RhbmRhcmQgc2l6ZSAoYm90aCB3aWR0aCBhbmQgaGVpZ2h0KSBvZiBhbiBhcHBsaWNhdGlvbiBpY29uIHRoYXQKICAgICAgICAgIHdpbGwgYmUgZGlzcGxheWVkIGluIHRoZSBhcHAgbGF1bmNoZXIgYW5kIGVsc2V3aGVyZS4gLS0+CiAgICAgPGRpbWVuIG5hbWU9ImFwcF9pY29uX3NpemUiPjQ4ZGlwPC9kaW1lbj4KKyAgICA8IS0tIFRoZSBzdGFuZGFyZCBzaXplIChib3RoIHdpZHRoIGFuZCBoZWlnaHQpIG9mIGFuIGFjdGlvbiBpY29uIHRoYXQgd2lsbAorICAgICAgICAgYmUgZGlzcGxheWVkIGluIGFwcGxpY2F0aW9uIGFjdGlvbiBiYXJzLiAtLT4KKyAgICA8ZGltZW4gbmFtZT0iYWN0aW9uX2ljb25fc2l6ZSI+NDhkaXA8L2RpbWVuPgogICAgIDxkaW1lbiBuYW1lPSJ0b2FzdF95X29mZnNldCI+NjRkaXA8L2RpbWVuPgogICAgIDwhLS0gSGVpZ2h0IG9mIHRoZSBzdGF0dXMgYmFyIC0tPgogICAgIDxkaW1lbiBuYW1lPSJzdGF0dXNfYmFyX2hlaWdodCI+MjVkaXA8L2RpbWVuPgpAQCAtMzIsMTQgKzM1LDE4IEBACiAgICAgPGRpbWVuIG5hbWU9InN0YXR1c19iYXJfaWNvbl9zaXplIj4yNWRpcDwvZGltZW4+CiAgICAgPCEtLSBNYXJnaW4gYXQgdGhlIGVkZ2Ugb2YgdGhlIHNjcmVlbiB0byBpZ25vcmUgdG91Y2ggZXZlbnRzIGZvciBpbiB0aGUgd2luZG93c2hhZGUuIC0tPgogICAgIDxkaW1lbiBuYW1lPSJzdGF0dXNfYmFyX2VkZ2VfaWdub3JlIj41ZHA8L2RpbWVuPgorICAgIDwhLS0gTWFyZ2luIGZvciBwZXJtYW5lbnQgc2NyZWVuIGRlY29yYXRpb25zIGF0IHRoZSBib3R0b20uIC0tPgorICAgIDxkaW1lbiBuYW1lPSJzY3JlZW5fbWFyZ2luX2JvdHRvbSI+MGRpcDwvZGltZW4+CiAgICAgPCEtLSBTaXplIG9mIHRoZSBmYXN0c2Nyb2xsIGhpbnQgbGV0dGVyIC0tPgogICAgIDxkaW1lbiBuYW1lPSJmYXN0c2Nyb2xsX292ZXJsYXlfc2l6ZSI+MTA0ZHA8L2RpbWVuPgogICAgIDwhLS0gV2lkdGggb2YgdGhlIGZhc3RzY3JvbGwgdGh1bWIgLS0+CiAgICAgPGRpbWVuIG5hbWU9ImZhc3RzY3JvbGxfdGh1bWJfd2lkdGgiPjY0ZHA8L2RpbWVuPgogICAgIDwhLS0gSGVpZ2h0IG9mIHRoZSBmYXN0c2Nyb2xsIHRodW1iIC0tPgogICAgIDxkaW1lbiBuYW1lPSJmYXN0c2Nyb2xsX3RodW1iX2hlaWdodCI+NTJkcDwvZGltZW4+Ci0gICAgPCEtLSBEZWZhdWx0IGhlaWdodCBvZiBhIGtleSBpbiB0aGUgcGFzc3dvcmQga2V5Ym9hcmQgLS0+Ci0gICAgPGRpbWVuIG5hbWU9InBhc3N3b3JkX2tleWJvYXJkX2tleV9oZWlnaHQiPjU2ZGlwPC9kaW1lbj4KKyAgICA8IS0tIERlZmF1bHQgaGVpZ2h0IG9mIGEga2V5IGluIHRoZSBwYXNzd29yZCBrZXlib2FyZCBmb3IgYWxwaGEgLS0+CisgICAgPGRpbWVuIG5hbWU9InBhc3N3b3JkX2tleWJvYXJkX2tleV9oZWlnaHRfYWxwaGEiPjU2ZGlwPC9kaW1lbj4KKyAgICA8IS0tIERlZmF1bHQgaGVpZ2h0IG9mIGEga2V5IGluIHRoZSBwYXNzd29yZCBrZXlib2FyZCBmb3IgbnVtZXJpYyAtLT4KKyAgICA8ZGltZW4gbmFtZT0icGFzc3dvcmRfa2V5Ym9hcmRfa2V5X2hlaWdodF9udW1lcmljIj41NmRpcDwvZGltZW4+CiAgICAgPCEtLSBEZWZhdWx0IGNvcnJlY3Rpb24gZm9yIHRoZSBzcGFjZSBrZXkgaW4gdGhlIHBhc3N3b3JkIGtleWJvYXJkIC0tPgogICAgIDxkaW1lbiBuYW1lPSJwYXNzd29yZF9rZXlib2FyZF9zcGFjZWJhcl92ZXJ0aWNhbF9jb3JyZWN0aW9uIj40ZGlwPC9kaW1lbj4KIDwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL3ZhbHVlcy9pZHMueG1sIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy9pZHMueG1sCmluZGV4IDhiNmFmNzEuLjMzY2QxMDAgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy92YWx1ZXMvaWRzLnhtbAorKysgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzL2lkcy54bWwKQEAgLTU5LDYgKzU5LDcgQEAKICAgPGl0ZW0gdHlwZT0iaWQiIG5hbWU9ImNvcHkiIC8+CiAgIDxpdGVtIHR5cGU9ImlkIiBuYW1lPSJwYXN0ZSIgLz4KICAgPGl0ZW0gdHlwZT0iaWQiIG5hbWU9ImNvcHlVcmwiIC8+CisgIDxpdGVtIHR5cGU9ImlkIiBuYW1lPSJzZWxlY3RUZXh0TW9kZSIgLz4KICAgPGl0ZW0gdHlwZT0iaWQiIG5hbWU9InN3aXRjaElucHV0TWV0aG9kIiAvPgogICA8aXRlbSB0eXBlPSJpZCIgbmFtZT0ia2V5Ym9hcmRWaWV3IiAvPgogICA8aXRlbSB0eXBlPSJpZCIgbmFtZT0iY2xvc2VCdXR0b24iIC8+CkBAIC02OCw0ICs2OSw1IEBACiAgIDxpdGVtIHR5cGU9ImlkIiBuYW1lPSJhY2NvdW50UHJlZmVyZW5jZXMiIC8+CiAgIDxpdGVtIHR5cGU9ImlkIiBuYW1lPSJzbWFsbEljb24iIC8+CiAgIDxpdGVtIHR5cGU9ImlkIiBuYW1lPSJjdXN0b20iIC8+CisgIDxpdGVtIHR5cGU9ImlkIiBuYW1lPSJob21lIiAvPgogPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvdmFsdWVzL3B1YmxpYy54bWwgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzL3B1YmxpYy54bWwKaW5kZXggMjhhN2NjYS4uM2I2OWFjYjkgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy92YWx1ZXMvcHVibGljLnhtbAorKysgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzL3B1YmxpYy54bWwKQEAgLTExODMsNyArMTE4Myw3IEBACiAgIDxwdWJsaWMgdHlwZT0iYXR0ciIgbmFtZT0iY29sb3JCYWNrZ3JvdW5kQ2FjaGVIaW50IiBpZD0iMHgwMTAxMDJhYiIgLz4KICAgPHB1YmxpYyB0eXBlPSJhdHRyIiBuYW1lPSJkcm9wRG93bkhvcml6b250YWxPZmZzZXQiIGlkPSIweDAxMDEwMmFjIiAvPgogICA8cHVibGljIHR5cGU9ImF0dHIiIG5hbWU9ImRyb3BEb3duVmVydGljYWxPZmZzZXQiIGlkPSIweDAxMDEwMmFkIiAvPgotICAKKwogICA8cHVibGljIHR5cGU9InN0eWxlIiBuYW1lPSJUaGVtZS5XYWxscGFwZXIiIGlkPSIweDAxMDMwMDVlIiAvPgogICA8cHVibGljIHR5cGU9InN0eWxlIiBuYW1lPSJUaGVtZS5XYWxscGFwZXIuTm9UaXRsZUJhciIgaWQ9IjB4MDEwMzAwNWYiIC8+CiAgIDxwdWJsaWMgdHlwZT0ic3R5bGUiIG5hbWU9IlRoZW1lLldhbGxwYXBlci5Ob1RpdGxlQmFyLkZ1bGxzY3JlZW4iIGlkPSIweDAxMDMwMDYwIiAvPgpAQCAtMTE5MSw3ICsxMTkxLDcgQEAKICAgPHB1YmxpYyB0eXBlPSJzdHlsZSIgbmFtZT0iVGhlbWUuTGlnaHQuV2FsbHBhcGVyU2V0dGluZ3MiIGlkPSIweDAxMDMwMDYyIiAvPgogICA8cHVibGljIHR5cGU9InN0eWxlIiBuYW1lPSJUZXh0QXBwZWFyYW5jZS5TZWFyY2hSZXN1bHQuVGl0bGUiIGlkPSIweDAxMDMwMDYzIiAvPgogICA8cHVibGljIHR5cGU9InN0eWxlIiBuYW1lPSJUZXh0QXBwZWFyYW5jZS5TZWFyY2hSZXN1bHQuU3VidGl0bGUiIGlkPSIweDAxMDMwMDY0IiAvPgotICAKKwogICA8IS0tIFNlbWktdHJhbnNwYXJlbnQgYmFja2dyb3VuZCB0aGF0IGNhbiBiZSB1c2VkIHdoZW4gcGxhY2luZyBhIGRhcmsKICAgICAgICB0aGVtZWQgVUkgb24gdG9wIG9mIHNvbWUgYXJiaXRyYXJ5IGJhY2tncm91bmQgKHN1Y2ggYXMgdGhlCiAgICAgICAgd2FsbHBhcGVyKS4gIFRoaXMgZGFya2VucyB0aGUgYmFja2dyb3VuZCBzdWZmaWNpZW50bHkgdGhhdCB0aGUgVUkKQEAgLTExOTksNyArMTE5OSw3IEBACiAgIDxwdWJsaWMgdHlwZT0iZHJhd2FibGUiIG5hbWU9InNjcmVlbl9iYWNrZ3JvdW5kX2RhcmtfdHJhbnNwYXJlbnQiIGlkPSIweDAxMDgwMGE5IiAvPgogICA8cHVibGljIHR5cGU9ImRyYXdhYmxlIiBuYW1lPSJzY3JlZW5fYmFja2dyb3VuZF9saWdodF90cmFuc3BhcmVudCIgaWQ9IjB4MDEwODAwYWEiIC8+CiAgIDxwdWJsaWMgdHlwZT0iZHJhd2FibGUiIG5hbWU9InN0YXRfbm90aWZ5X3NkY2FyZF9wcmVwYXJlIiBpZD0iMHgwMTA4MDBhYiIgLz4KLSAgCisKIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICAgIFJlc291cmNlcyBhZGRlZCBpbiB2ZXJzaW9uIDYgb2YgdGhlIHBsYXRmb3JtIChFY2xhaXIgMi4wLjEpLgogICAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+CkBAIC0xMjExLDcgKzEyMTEsNyBAQAogICA8cHVibGljIHR5cGU9ImF0dHIiIG5hbWU9InF1aWNrQ29udGFjdEJhZGdlU3R5bGVTbWFsbFdpbmRvd1NtYWxsIiBpZD0iMHgwMTAxMDJiMSIgLz4KICAgPHB1YmxpYyB0eXBlPSJhdHRyIiBuYW1lPSJxdWlja0NvbnRhY3RCYWRnZVN0eWxlU21hbGxXaW5kb3dNZWRpdW0iIGlkPSIweDAxMDEwMmIyIiAvPgogICA8cHVibGljIHR5cGU9ImF0dHIiIG5hbWU9InF1aWNrQ29udGFjdEJhZGdlU3R5bGVTbWFsbFdpbmRvd0xhcmdlIiBpZD0iMHgwMTAxMDJiMyIgLz4KLSAgCisKIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICAgIFJlc291cmNlcyBhZGRlZCBpbiB2ZXJzaW9uIDcgb2YgdGhlIHBsYXRmb3JtIChFY2xhaXIgTVIxKS4KICAgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgpAQCAtMTIyMCw3ICsxMjIwLDcgQEAKICAgPHB1YmxpYyB0eXBlPSJhdHRyIiBuYW1lPSJhdXRob3IiIGlkPSIweDAxMDEwMmI0IiAvPgogICA8cHVibGljIHR5cGU9ImF0dHIiIG5hbWU9ImF1dG9TdGFydCIgaWQ9IjB4MDEwMTAyYjUiIC8+CiAKLSAgICAKKwogPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgICAgUmVzb3VyY2VzIGFkZGVkIGluIHZlcnNpb24gOCBvZiB0aGUgcGxhdGZvcm0gKEVjbGFpciBNUjIpLgogICAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+CkBAIC0xMjQxLDIzICsxMjQxLDIwIEBACiAgIDxwdWJsaWMgdHlwZT0iYXR0ciIgbmFtZT0idGFiU3RyaXBFbmFibGVkIiBpZD0iMHgwMTAxMDJiZCIgLz4KIAogICA8cHVibGljIHR5cGU9ImlkIiBuYW1lPSJjdXN0b20iIGlkPSIweDAxMDIwMDJiIiAvPgotICAgIAorCiAgIDxwdWJsaWMgdHlwZT0iYW5pbSIgbmFtZT0iY3ljbGVfaW50ZXJwb2xhdG9yIiBpZD0iMHgwMTBhMDAwYyIgLz4KIAogPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgICAgUmVzb3VyY2VzIGludHJvZHVjZWQgaW4gR2luZ2VyYnJlYWQuCiAgICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLSAgICAgCisgIDxlYXQtY29tbWVudCAvPgogICA8cHVibGljIHR5cGU9ImF0dHIiIG5hbWU9ImxvZ28iIGlkPSIweDAxMDEwMmJlIiAvPgogICA8cHVibGljIHR5cGU9ImF0dHIiIG5hbWU9InhsYXJnZVNjcmVlbnMiIGlkPSIweDAxMDEwMmJmIiAvPgogICA8cHVibGljIHR5cGU9ImF0dHIiIG5hbWU9ImltbWVyc2l2ZSIgaWQ9IjB4MDEwMTAyYzAiIC8+Ci0gIDxwdWJsaWMgdHlwZT0iYXR0ciIgbmFtZT0ib3ZlcnNjcm9sbE1vZGUiIGlkPSIweDAxMDEwMmMxIiAvPgotICA8cHVibGljIHR5cGU9ImF0dHIiIG5hbWU9Im92ZXJzY3JvbGxIZWFkZXIiIGlkPSIweDAxMDEwMmMyIiAvPgotICA8cHVibGljIHR5cGU9ImF0dHIiIG5hbWU9Im92ZXJzY3JvbGxGb290ZXIiIGlkPSIweDAxMDEwMmMzIiAvPgogICA8cHVibGljIHR5cGU9ImF0dHIiIG5hbWU9ImZpbHRlclRvdWNoZXNXaGVuT2JzY3VyZWQiIGlkPSIweDAxMDEwMmM0IiAvPgogCiAgIDxwdWJsaWMtcGFkZGluZyB0eXBlPSJhdHRyIiBuYW1lPSJrcmFrZW5fcmVzb3VyY2VfcGFkIiBlbmQ9IjB4MDEwMTAzMDAiIC8+Ci0gIAorCiAgIDxwdWJsaWMtcGFkZGluZyB0eXBlPSJpZCIgbmFtZT0ia3Jha2VuX3Jlc291cmNlX3BhZCIgZW5kPSIweDAxMDIwMDQwIiAvPgogICA8cHVibGljLXBhZGRpbmcgdHlwZT0iYW5pbSIgbmFtZT0ia3Jha2VuX3Jlc291cmNlX3BhZCIgZW5kPSIweDAxMGEwMDIwIiAvPgogCkBAIC0xMjY4LDkgKzEyNjUsOCBAQAogICA8cHVibGljIHR5cGU9ImRyYXdhYmxlIiBuYW1lPSJwcmVzZW5jZV9hdWRpb19hd2F5IiBpZD0iMHgwMTA4MDBhZiIgLz4KICAgPHB1YmxpYyB0eXBlPSJkcmF3YWJsZSIgbmFtZT0icHJlc2VuY2VfYXVkaW9fYnVzeSIgaWQ9IjB4MDEwODAwYjAiIC8+CiAgIDxwdWJsaWMgdHlwZT0iZHJhd2FibGUiIG5hbWU9InByZXNlbmNlX2F1ZGlvX29ubGluZSIgaWQ9IjB4MDEwODAwYjEiIC8+Ci0KICAgPHB1YmxpYy1wYWRkaW5nIHR5cGU9ImRyYXdhYmxlIiBuYW1lPSJrcmFrZW5fcmVzb3VyY2VfcGFkIiBlbmQ9IjB4MDEwODAxMDAiIC8+Ci0gIAorCiAgIDxwdWJsaWMgdHlwZT0ic3R5bGUiIG5hbWU9IlRleHRBcHBlYXJhbmNlLlN0YXR1c0Jhci5UaXRsZSIgaWQ9IjB4MDEwMzAwNjUiIC8+CiAgIDxwdWJsaWMgdHlwZT0ic3R5bGUiIG5hbWU9IlRleHRBcHBlYXJhbmNlLlN0YXR1c0Jhci5JY29uIiBpZD0iMHgwMTAzMDA2NiIgLz4KICAgPHB1YmxpYyB0eXBlPSJzdHlsZSIgbmFtZT0iVGV4dEFwcGVhcmFuY2UuU3RhdHVzQmFyLkV2ZW50Q29udGVudCIgaWQ9IjB4MDEwMzAwNjciIC8+CkBAIC0xMjg0LDQgKzEyODAsMTE3IEBACiAgIDxwdWJsaWMtcGFkZGluZyB0eXBlPSJkaW1lbiIgbmFtZT0ia3Jha2VuX3Jlc291cmNlX3BhZCIgZW5kPSIweDAxMDUwMDEwIiAvPgogICA8cHVibGljLXBhZGRpbmcgdHlwZT0iY29sb3IiIG5hbWU9ImtyYWtlbl9yZXNvdXJjZV9wYWQiIGVuZD0iMHgwMTA2MDAyMCIgLz4KICAgPHB1YmxpYy1wYWRkaW5nIHR5cGU9ImFycmF5IiBuYW1lPSJrcmFrZW5fcmVzb3VyY2VfcGFkIiBlbmQ9IjB4MDEwNzAwMTAiIC8+CisKKzwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgIFJlc291cmNlcyBwcm9wb3NlZCBmb3IgSG9uZXljb21iLgorICAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+CisgIDxlYXQtY29tbWVudCAvPgorICA8cHVibGljIHR5cGU9ImF0dHIiIG5hbWU9ImFkYXB0ZXIiIC8+CisgIDxwdWJsaWMgdHlwZT0iYXR0ciIgbmFtZT0ic2VsZWN0aW9uIiAvPgorICA8cHVibGljIHR5cGU9ImF0dHIiIG5hbWU9InNvcnRPcmRlciIgLz4KKyAgPHB1YmxpYyB0eXBlPSJhdHRyIiBuYW1lPSJ1cmkiIC8+CisgIDxwdWJsaWMgdHlwZT0iYXR0ciIgbmFtZT0iZnJvbSIgLz4KKyAgPHB1YmxpYyB0eXBlPSJhdHRyIiBuYW1lPSJ0byIgLz4KKyAgPHB1YmxpYyB0eXBlPSJhdHRyIiBuYW1lPSJhcyIgLz4KKyAgPHB1YmxpYyB0eXBlPSJhdHRyIiBuYW1lPSJmcm9tVmFsdWUiIC8+CisgIDxwdWJsaWMgdHlwZT0iYXR0ciIgbmFtZT0idG9WYWx1ZSIgLz4KKyAgPHB1YmxpYyB0eXBlPSJhdHRyIiBuYW1lPSJjb2x1bW4iIC8+CisgIDxwdWJsaWMgdHlwZT0iYXR0ciIgbmFtZT0id2l0aEV4cHJlc3Npb24iIC8+CisgIDxwdWJsaWMgdHlwZT0iYXR0ciIgbmFtZT0id2l0aENsYXNzIiAvPgorICA8cHVibGljIHR5cGU9ImF0dHIiIG5hbWU9ImFsbENvbnRhY3RzTmFtZSIgLz4KKyAgPHB1YmxpYyB0eXBlPSJhdHRyIiBuYW1lPSJ3aW5kb3dBY3Rpb25CYXIiIC8+CisgIDxwdWJsaWMgdHlwZT0iYXR0ciIgbmFtZT0iYWN0aW9uQmFyU3R5bGUiIC8+CisgIDxwdWJsaWMgdHlwZT0iYXR0ciIgbmFtZT0ibmF2aWdhdGlvbk1vZGUiIC8+CisgIDxwdWJsaWMgdHlwZT0iYXR0ciIgbmFtZT0iZGlzcGxheU9wdGlvbnMiIC8+CisgIDxwdWJsaWMgdHlwZT0iYXR0ciIgbmFtZT0ic3VidGl0bGUiIC8+CisgIDxwdWJsaWMgdHlwZT0iYXR0ciIgbmFtZT0iY3VzdG9tTmF2aWdhdGlvbkxheW91dCIgLz4KKyAgPHB1YmxpYyB0eXBlPSJhdHRyIiBuYW1lPSJoYXJkd2FyZUFjY2VsZXJhdGVkIiAvPgorICA8cHVibGljIHR5cGU9ImF0dHIiIG5hbWU9Im1lYXN1cmVXaXRoTGFyZ2VzdENoaWxkIiAvPgorICA8cHVibGljIHR5cGU9ImF0dHIiIG5hbWU9ImFuaW1hdGVGaXJzdFZpZXciIC8+CisgIDxwdWJsaWMgdHlwZT0iYXR0ciIgbmFtZT0iZHJvcERvd25TcGlubmVyU3R5bGUiIC8+CisgIDxwdWJsaWMgdHlwZT0iYXR0ciIgbmFtZT0iYWN0aW9uRHJvcERvd25TdHlsZSIgLz4KKyAgPHB1YmxpYyB0eXBlPSJhdHRyIiBuYW1lPSJhY3Rpb25CdXR0b25TdHlsZSIgLz4KKyAgPHB1YmxpYyB0eXBlPSJhdHRyIiBuYW1lPSJzaG93QXNBY3Rpb24iIC8+CisgIDxwdWJsaWMgdHlwZT0iYXR0ciIgbmFtZT0iYWN0aW9uQnV0dG9uUGFkZGluZyIgLz4KKyAgPHB1YmxpYyB0eXBlPSJhdHRyIiBuYW1lPSJwcmV2aWV3SW1hZ2UiIC8+CisgIDxwdWJsaWMgdHlwZT0iYXR0ciIgbmFtZT0iYWN0aW9uTW9kZUJhY2tncm91bmQiIC8+CisgIDxwdWJsaWMgdHlwZT0iYXR0ciIgbmFtZT0iYWN0aW9uTW9kZUNsb3NlRHJhd2FibGUiIC8+CisgIDxwdWJsaWMgdHlwZT0iYXR0ciIgbmFtZT0id2luZG93QWN0aW9uTW9kZU92ZXJsYXkiIC8+CisgIDxwdWJsaWMgdHlwZT0iYXR0ciIgbmFtZT0idmFsdWVGcm9tIiAvPgorICA8cHVibGljIHR5cGU9ImF0dHIiIG5hbWU9InZhbHVlVG8iIC8+CisgIDxwdWJsaWMgdHlwZT0iYXR0ciIgbmFtZT0idmFsdWVUeXBlIiAvPgorICA8cHVibGljIHR5cGU9ImF0dHIiIG5hbWU9InByb3BlcnR5TmFtZSIgLz4KKyAgPHB1YmxpYyB0eXBlPSJhdHRyIiBuYW1lPSJvcmRlcmluZyIgLz4KKyAgPHB1YmxpYyB0eXBlPSJhdHRyIiBuYW1lPSJmcmFnbWVudCIgLz4KKyAgPHB1YmxpYyB0eXBlPSJhdHRyIiBuYW1lPSJ3aW5kb3dBY3Rpb25CYXJPdmVybGF5IiAvPgorICA8cHVibGljIHR5cGU9ImF0dHIiIG5hbWU9ImZyYWdtZW50T3BlbkVudGVyQW5pbWF0aW9uIiAvPgorICA8cHVibGljIHR5cGU9ImF0dHIiIG5hbWU9ImZyYWdtZW50T3BlbkV4aXRBbmltYXRpb24iIC8+CisgIDxwdWJsaWMgdHlwZT0iYXR0ciIgbmFtZT0iZnJhZ21lbnRDbG9zZUVudGVyQW5pbWF0aW9uIiAvPgorICA8cHVibGljIHR5cGU9ImF0dHIiIG5hbWU9ImZyYWdtZW50Q2xvc2VFeGl0QW5pbWF0aW9uIiAvPgorICA8cHVibGljIHR5cGU9ImF0dHIiIG5hbWU9ImFjdGlvbkJhclNpemUiIC8+CisgIDxwdWJsaWMgdHlwZT0iYXR0ciIgbmFtZT0iaW1lU3VidHlwZUxvY2FsZSIgLz4KKyAgPHB1YmxpYyB0eXBlPSJhdHRyIiBuYW1lPSJpbWVTdWJ0eXBlTW9kZSIgLz4KKyAgPHB1YmxpYyB0eXBlPSJhdHRyIiBuYW1lPSJpbWVTdWJ0eXBlRXh0cmFWYWx1ZSIgLz4KKyAgPHB1YmxpYyB0eXBlPSJhdHRyIiBuYW1lPSJzcGxpdE1vdGlvbkV2ZW50cyIgLz4KKyAgPHB1YmxpYyB0eXBlPSJhdHRyIiBuYW1lPSJsaXN0Q2hvaWNlQmFja2dyb3VuZEluZGljYXRvciIgLz4KKyAgPHB1YmxpYyB0eXBlPSJhdHRyIiBuYW1lPSJzcGlubmVyTW9kZSIgLz4KKyAgPHB1YmxpYyB0eXBlPSJhdHRyIiBuYW1lPSJhbmltYXRlTGF5b3V0Q2hhbmdlcyIgLz4KKyAgPHB1YmxpYyB0eXBlPSJhdHRyIiBuYW1lPSJhY3Rpb25CYXJUYWJTdHlsZSIgLz4KKyAgPHB1YmxpYyB0eXBlPSJhdHRyIiBuYW1lPSJhY3Rpb25CYXJUYWJCYXJTdHlsZSIgLz4KKyAgPHB1YmxpYyB0eXBlPSJhdHRyIiBuYW1lPSJhY3Rpb25CYXJUYWJUZXh0U3R5bGUiIC8+CisgIDxwdWJsaWMgdHlwZT0iYXR0ciIgbmFtZT0iYWN0aW9uT3ZlcmZsb3dCdXR0b25TdHlsZSIgLz4KKyAgPHB1YmxpYyB0eXBlPSJhdHRyIiBuYW1lPSJpdGVtUGFkZGluZyIgLz4KKyAgPHB1YmxpYyB0eXBlPSJhdHRyIiBuYW1lPSJhY3Rpb25Nb2RlQ2xvc2VCdXR0b25TdHlsZSIgLz4KKyAgPHB1YmxpYyB0eXBlPSJhdHRyIiBuYW1lPSJ0aXRsZVRleHRTdHlsZSIgLz4KKyAgPHB1YmxpYyB0eXBlPSJhdHRyIiBuYW1lPSJzdWJ0aXRsZVRleHRTdHlsZSIgLz4KKyAgPHB1YmxpYyB0eXBlPSJhdHRyIiBuYW1lPSJpY29uaWZpZWRCeURlZmF1bHQiIC8+CisgIDxwdWJsaWMgdHlwZT0iYXR0ciIgbmFtZT0iYWN0aW9uTGF5b3V0IiAvPgorICA8cHVibGljIHR5cGU9ImF0dHIiIG5hbWU9ImFjdGlvblZpZXdDbGFzcyIgLz4KKyAgPHB1YmxpYyB0eXBlPSJhdHRyIiBuYW1lPSJhY3RpdmF0ZWRCYWNrZ3JvdW5kSW5kaWNhdG9yIiAvPgorICA8cHVibGljIHR5cGU9ImF0dHIiIG5hbWU9InN0YXRlX2FjdGl2YXRlZCIgLz4KKyAgPHB1YmxpYyB0eXBlPSJhdHRyIiBuYW1lPSJsaXN0UG9wdXBXaW5kb3dTdHlsZSIgLz4KKyAgPHB1YmxpYyB0eXBlPSJhdHRyIiBuYW1lPSJwb3B1cE1lbnVTdHlsZSIgLz4KKyAgPHB1YmxpYyB0eXBlPSJhdHRyIiBuYW1lPSJ0ZXh0QXBwZWFyYW5jZUxhcmdlUG9wdXBNZW51IiAvPgorICA8cHVibGljIHR5cGU9ImF0dHIiIG5hbWU9InRleHRBcHBlYXJhbmNlU21hbGxQb3B1cE1lbnUiIC8+CisKKyAgPHB1YmxpYyB0eXBlPSJhbmltIiBuYW1lPSJhbmltYXRvcl9mYWRlX2luIiAvPgorICA8cHVibGljIHR5cGU9ImFuaW0iIG5hbWU9ImFuaW1hdG9yX2ZhZGVfb3V0IiAvPgorCisgIDxwdWJsaWMgdHlwZT0iaWQiIG5hbWU9ImhvbWUiIC8+CisgIDwhLS0gQ29udGV4dCBtZW51IElEIGZvciB0aGUgIlNlbGVjdCB0ZXh0Li4uIiBtZW51IGl0ZW0gdG8gc3dpdGNoIHRvIHRleHQKKyAgICAgICBzZWxlY3Rpb24gY29udGV4dCBtb2RlIGluIHRleHQgdmlld3MuIC0tPgorICA8cHVibGljIHR5cGU9ImlkIiBuYW1lPSJzZWxlY3RUZXh0TW9kZSIgLz4KKworICA8IS0tIFN0YW5kYXJkIGNvbnRlbnQgdmlldyBmb3IgYSB7QGxpbmsgYW5kcm9pZC5hcHAuTGlzdEZyYWdtZW50fS4KKyAgICAgICBJZiB5b3UgYXJlIGltcGxlbWVudGluZyBhIHN1YmNsYXNzIG9mIExpc3RGcmFnbWVudCB3aXRoIHlvdXIKKyAgICAgICBvd24gY3VzdG9taXplZCBjb250ZW50LCB5b3UgY2FuIGluY2x1ZGUgdGhpcyBsYXlvdXQgaW4gdGhhdAorICAgICAgIGNvbnRlbnQgdG8gc3RpbGwgcmV0YWluIGFsbCBvZiB0aGUgc3RhbmRhcmQgZnVuY3Rpb25hbGl0eSBvZgorICAgICAgIHRoZSBiYXNlIGNsYXNzLiAtLT4KKyAgPHB1YmxpYyB0eXBlPSJsYXlvdXQiIG5hbWU9Imxpc3RfY29udGVudCIgLz4KKworICA8IS0tIEEgc2ltcGxlIExpc3RWaWV3IGl0ZW0gbGF5b3V0IHdoaWNoIGNhbiBjb250YWluIHRleHQgYW5kIHN1cHBvcnQgKHNpbmdsZSBvciBtdWx0aXBsZSkgaXRlbSBzZWxlY3Rpb24uIC0tPgorICA8cHVibGljIHR5cGU9ImxheW91dCIgbmFtZT0ic2ltcGxlX3NlbGVjdGFibGVfbGlzdF9pdGVtIiAvPgorCisgIDxwdWJsaWMgdHlwZT0ic3R5bGUiIG5hbWU9IlRoZW1lLldpdGhBY3Rpb25CYXIiIC8+CisgIDxwdWJsaWMgdHlwZT0ic3R5bGUiIG5hbWU9IldpZGdldC5TcGlubmVyLkRyb3BEb3duIiAvPgorICA8cHVibGljIHR5cGU9InN0eWxlIiBuYW1lPSJXaWRnZXQuQWN0aW9uQnV0dG9uIiAvPgorICA8cHVibGljIHR5cGU9InN0eWxlIiBuYW1lPSJUaGVtZS5EaWFsb2cuTm9GcmFtZSIgLz4KKyAgPHB1YmxpYyB0eXBlPSJzdHlsZSIgbmFtZT0iVGhlbWUuTm9UaXRsZUJhci5PdmVybGF5QWN0aW9uTW9kZXMiIC8+CisKKyAgPHB1YmxpYyB0eXBlPSJzdHlsZSIgbmFtZT0iVGhlbWUuSG9sbyIgLz4KKyAgPHB1YmxpYyB0eXBlPSJzdHlsZSIgbmFtZT0iVGhlbWUuTGlnaHQuSG9sbyIgLz4KKyAgPHB1YmxpYyB0eXBlPSJzdHlsZSIgbmFtZT0iVGhlbWUuSG9sby5Ob0FjdGlvbkJhciIgLz4KKyAgPHB1YmxpYyB0eXBlPSJzdHlsZSIgbmFtZT0iVGhlbWUuSG9sby5Ob0FjdGlvbkJhci5GdWxsc2NyZWVuIiAvPgorICA8cHVibGljIHR5cGU9InN0eWxlIiBuYW1lPSJUaGVtZS5MaWdodC5Ib2xvLk5vQWN0aW9uQmFyIiAvPgorICA8cHVibGljIHR5cGU9InN0eWxlIiBuYW1lPSJUaGVtZS5MaWdodC5Ib2xvLk5vQWN0aW9uQmFyLkZ1bGxzY3JlZW4iIC8+CisKKyAgPHB1YmxpYyB0eXBlPSJzdHlsZSIgbmFtZT0iV2lkZ2V0Lkxpc3RQb3B1cFdpbmRvdyIgLz4KKyAgPHB1YmxpYyB0eXBlPSJzdHlsZSIgbmFtZT0iV2lkZ2V0LlBvcHVwTWVudSIgLz4KKyAgPHB1YmxpYyB0eXBlPSJzdHlsZSIgbmFtZT0iV2lkZ2V0LkFjdGlvbkJ1dHRvbi5PdmVyZmxvdyIgLz4KKyAgPHB1YmxpYyB0eXBlPSJzdHlsZSIgbmFtZT0iV2lkZ2V0LkFjdGlvbkJ1dHRvbi5DbG9zZU1vZGUiIC8+CisgIDxwdWJsaWMgdHlwZT0ic3R5bGUiIG5hbWU9IlRleHRBcHBlYXJhbmNlLldpZGdldC5Qb3B1cE1lbnUuTGFyZ2UiIC8+CisgIDxwdWJsaWMgdHlwZT0ic3R5bGUiIG5hbWU9IlRleHRBcHBlYXJhbmNlLldpZGdldC5Qb3B1cE1lbnUuU21hbGwiIC8+CisKKyAgPHB1YmxpYyB0eXBlPSJzdHJpbmciIG5hbWU9InNlbGVjdFRleHRNb2RlIiAvPgorCiA8L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy92YWx1ZXMvc3RyaW5ncy54bWwgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzL3N0cmluZ3MueG1sCmluZGV4IDU5MTM2MzkuLjQzM2MwMDUgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy92YWx1ZXMvc3RyaW5ncy54bWwKKysrIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy9zdHJpbmdzLnhtbApAQCAtMjgzLDkgKzI4MywxNSBAQAogICAgIDwhLS0gU2h1dGRvd24gQ29uZmlybWF0aW9uIERpYWxvZy4gIFdoZW4gdGhlIHVzZXIgY2hvb3NlcyB0byBwb3dlciBvZmYgdGhlIHBob25lLCB0aGVyZSB3aWxsIGJlIGEgY29uZmlybWF0aW9uIGRpYWxvZy4gIFRoaXMgaXMgdGhlIG1lc3NhZ2UuIC0tPgogICAgIDxzdHJpbmcgbmFtZT0ic2h1dGRvd25fY29uZmlybSI+WW91ciBwaG9uZSB3aWxsIHNodXQgZG93bi48L3N0cmluZz4KIAotICAgIDwhLS0gUmVjZW50IFRhc2tzIGRpYWxvZzogdGl0bGUgLS0+CisgICAgPCEtLSBSZWNlbnQgVGFza3MgZGlhbG9nOiB0aXRsZQorICAgICBUT0RPOiB0aGlzIHNob3VsZCBtb3ZlIHRvIFN5c3RlbVVJLmFwaywgYnV0IHRoZSBjb2RlIGZvciB0aGUgb2xkIAorICAgICAgICAgICAgcmVjZW50IGRpYWxvZyBpcyBzdGlsbCBpbiB0aGUgZnJhbWV3b3JrCisgICAgIC0tPgogICAgIDxzdHJpbmcgbmFtZT0icmVjZW50X3Rhc2tzX3RpdGxlIj5SZWNlbnQ8L3N0cmluZz4KLSAgICA8IS0tIFJlY2VudCBUYXNrcyBkaWFsb2c6IG1lc3NhZ2Ugd2hlbiB0aGVyZSBhcmUgbm8gcmVjZW50IGFwcGxpY2F0aW9ucyAtLT4KKyAgICA8IS0tIFJlY2VudCBUYXNrcyBkaWFsb2c6IG1lc3NhZ2Ugd2hlbiB0aGVyZSBhcmUgbm8gcmVjZW50IGFwcGxpY2F0aW9ucworICAgICBUT0RPOiB0aGlzIHNob3VsZCBtb3ZlIHRvIFN5c3RlbVVJLmFwaywgYnV0IHRoZSBjb2RlIGZvciB0aGUgb2xkIAorICAgICAgICAgICAgcmVjZW50IGRpYWxvZyBpcyBzdGlsbCBpbiB0aGUgZnJhbWV3b3JrCisgICAgIC0tPgogICAgIDxzdHJpbmcgbmFtZT0ibm9fcmVjZW50X3Rhc2tzIj5ObyByZWNlbnQgYXBwbGljYXRpb25zLjwvc3RyaW5nPgogCiAgICAgPCEtLSBUaXRsZSBvZiB0aGUgR2xvYmFsIEFjdGlvbnMgRGlhbG9nIC0tPgpAQCAtNzkzLDggKzc5OSw4IEBACiAgICAgPCEtLSBUaXRsZSBvZiBhbiBhcHBsaWNhdGlvbiBwZXJtaXNzaW9uLCBsaXN0ZWQgc28gdGhlIHVzZXIgY2FuIGNob29zZSB3aGV0aGVyIHRoZXkgd2FudCB0byBhbGxvdyB0aGUgYXBwbGljYXRpb24gdG8gZG8gdGhpcy4gLS0+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3dyaXRlQ2FsZW5kYXIiPmFkZCBvciBtb2RpZnkgY2FsZW5kYXIgZXZlbnRzIGFuZCBzZW5kIGVtYWlsIHRvIGd1ZXN0czwvc3RyaW5nPgogICAgIDwhLS0gRGVzY3JpcHRpb24gb2YgYW4gYXBwbGljYXRpb24gcGVybWlzc2lvbiwgbGlzdGVkIHNvIHRoZSB1c2VyIGNhbiBjaG9vc2Ugd2hldGhlciB0aGV5IHdhbnQgdG8gYWxsb3cgdGhlIGFwcGxpY2F0aW9uIHRvIGRvIHRoaXMuIC0tPgotICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2Nfd3JpdGVDYWxlbmRhciI+QWxsb3dzIGFuIGFwcGxpY2F0aW9uIHRvIGFkZCBvciBjaGFuZ2UgdGhlIAotICAgICAgICBldmVudHMgb24geW91ciBjYWxlbmRhciwgd2hpY2ggbWF5IHNlbmQgZW1haWwgdG8gZ3Vlc3RzLiBNYWxpY2lvdXMgYXBwbGljYXRpb25zIGNhbiB1c2UgdGhpcyAKKyAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3dyaXRlQ2FsZW5kYXIiPkFsbG93cyBhbiBhcHBsaWNhdGlvbiB0byBhZGQgb3IgY2hhbmdlIHRoZQorICAgICAgICBldmVudHMgb24geW91ciBjYWxlbmRhciwgd2hpY2ggbWF5IHNlbmQgZW1haWwgdG8gZ3Vlc3RzLiBNYWxpY2lvdXMgYXBwbGljYXRpb25zIGNhbiB1c2UgdGhpcwogICAgICAgICB0byBlcmFzZSBvciBtb2RpZnkgeW91ciBjYWxlbmRhciBldmVudHMgb3IgdG8gc2VuZCBlbWFpbCB0byBndWVzdHMuPC9zdHJpbmc+CiAKICAgICA8IS0tIFRpdGxlIG9mIGFuIGFwcGxpY2F0aW9uIHBlcm1pc3Npb24sIGxpc3RlZCBzbyB0aGUgdXNlciBjYW4gY2hvb3NlIHdoZXRoZXIgdGhleSB3YW50IHRvIGFsbG93IHRoZSBhcHBsaWNhdGlvbiB0byBkbyB0aGlzLiAtLT4KQEAgLTEyMzgsNiArMTI0NCwxMSBAQAogICAgIDwhLS0gRGVzY3JpcHRpb24gb2YgcG9saWN5IGFjY2VzcyB0byB3aXBlIHRoZSB1c2VyJ3MgZGF0YSAtLT4KICAgICA8c3RyaW5nIG5hbWU9InBvbGljeWRlc2Nfd2lwZURhdGEiPlBlcmZvcm0gYSBmYWN0b3J5IHJlc2V0LCBkZWxldGluZwogICAgICAgICBhbGwgb2YgeW91ciBkYXRhIHdpdGhvdXQgYW55IGNvbmZpcm1hdGlvbi48L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InBvbGljeWxhYl9zZXRHbG9iYWxQcm94eSI+U2V0IHRoZSBkZXZpY2UgZ2xvYmFsIHByb3h5PC9zdHJpbmc+CisgICAgPCEtLSBEZXNjcmlwdGlvbiBvZiBwb2xpY3kgYWNjZXNzIHRvIHdpcGUgdGhlIHVzZXIncyBkYXRhIC0tPgorICAgIDxzdHJpbmcgbmFtZT0icG9saWN5ZGVzY19zZXRHbG9iYWxQcm94eSI+U2V0IHRoZSBkZXZpY2UgZ2xvYmFsIHByb3h5CisgICAgICAgIHRvIGJlIHVzZWQgd2hpbGUgcG9saWN5IGlzIGVuYWJsZWQuIE9ubHkgdGhlIGZpcnN0IGRldmljZSBhZG1pbgorICAgICAgICBzZXRzIHRoZSBlZmZlY3RpdmUgZ2xvYmFsIHByb3h5Ljwvc3RyaW5nPgogCiAgICAgPCEtLSBUaGUgb3JkZXIgb2YgdGhlc2UgaXMgaW1wb3J0YW50LCBkb24ndCByZW9yZGVyIHdpdGhvdXQgY2hhbmdpbmcgQ29udGFjdHMuamF2YSAtLT4gPHNraXAgLz4KICAgICA8IS0tIFBob25lIG51bWJlciB0eXBlcyBmcm9tIGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHMuIFRoaXMgY291bGQgYmUgdXNlZCB3aGVuIGFkZGluZyBhIG5ldyBwaG9uZSBudW1iZXIgZm9yIGEgY29udGFjdCwgZm9yIGV4YW1wbGUuIC0tPgpAQCAtMTQwNywyMCArMTQxOCwxOCBAQAogICAgIDwhLS0gQ3VzdG9tIG9yZ2FuaXphdGlvbiB0eXBlIC0tPgogICAgIDxzdHJpbmcgbmFtZT0ib3JnVHlwZUN1c3RvbSI+Q3VzdG9tPC9zdHJpbmc+CiAKLSAgICA8IS0tIEF0dGJ1dGlvbiBvZiBhIGNvbnRhY3Qgc3RhdHVzIHVwZGF0ZSwgd2hlbiB0aGUgdGltZSBvZiB1cGRhdGUgaXMgdW5rbm93biAtLT4KLSAgICA8c3RyaW5nIG5hbWU9ImNvbnRhY3Rfc3RhdHVzX3VwZGF0ZV9hdHRyaWJ1dGlvbiI+dmlhIDx4bGlmZjpnIGlkPSJzb3VyY2UiIGV4YW1wbGU9Ikdvb2dsZSBUYWxrIj4lMSRzPC94bGlmZjpnPjwvc3RyaW5nPgotCi0gICAgPCEtLSBBdHRidXRpb24gb2YgYSBjb250YWN0IHN0YXR1cyB1cGRhdGUsIHdoZW4gdGhlIHRpbWUgb2YgdXBkYXRlIGlzIGtub3duIC0tPgotICAgIDxzdHJpbmcgbmFtZT0iY29udGFjdF9zdGF0dXNfdXBkYXRlX2F0dHJpYnV0aW9uX3dpdGhfZGF0ZSI+PHhsaWZmOmcgaWQ9ImRhdGUiIGV4YW1wbGU9IjMgaG91cnMgYWdvIj4lMSRzPC94bGlmZjpnPiB2aWEgPHhsaWZmOmcgaWQ9InNvdXJjZSIgZXhhbXBsZT0iR29vZ2xlIFRhbGsiPiUyJHM8L3hsaWZmOmc+PC9zdHJpbmc+Ci0KICAgICA8IS0tIEluc3RydWN0aW9ucyB0ZWxsaW5nIHRoZSB1c2VyIHRvIGVudGVyIHRoZWlyIFNJTSBQSU4gdG8gdW5sb2NrIHRoZSBrZXlndWFyZC4KICAgICAgICAgIERpc3BsYXllZCBpbiBvbmUgbGluZSBpbiBhIGxhcmdlIGZvbnQuICAtLT4KICAgICA8c3RyaW5nIG5hbWU9ImtleWd1YXJkX3Bhc3N3b3JkX2VudGVyX3Bpbl9jb2RlIj5FbnRlciBQSU4gY29kZTwvc3RyaW5nPgogCi0gICAgPCEtLSBJbnN0cnVjdGlvbnMgdGVsbGluZyB0aGUgdXNlciB0byBlbnRlciB0aGVpciBQSU4gcGFzc3dvcmQgdG8gdW5sb2NrIHRoZSBrZXlndWFyZC4KKyAgICA8IS0tIEluc3RydWN0aW9ucyB0ZWxsaW5nIHRoZSB1c2VyIHRvIGVudGVyIHRoZWlyIHRleHQgcGFzc3dvcmQgdG8gdW5sb2NrIHRoZSBrZXlndWFyZC4KICAgICAgICAgIERpc3BsYXllZCBpbiBvbmUgbGluZSBpbiBhIGxhcmdlIGZvbnQuICAtLT4KICAgICA8c3RyaW5nIG5hbWU9ImtleWd1YXJkX3Bhc3N3b3JkX2VudGVyX3Bhc3N3b3JkX2NvZGUiPkVudGVyIHBhc3N3b3JkIHRvIHVubG9jazwvc3RyaW5nPgogCisgICAgPCEtLSBJbnN0cnVjdGlvbnMgdGVsbGluZyB0aGUgdXNlciB0byBlbnRlciB0aGVpciBQSU4gcGFzc3dvcmQgdG8gdW5sb2NrIHRoZSBrZXlndWFyZC4KKyAgICAgICAgIERpc3BsYXllZCBpbiBvbmUgbGluZSBpbiBhIGxhcmdlIGZvbnQuICAtLT4KKyAgICA8c3RyaW5nIG5hbWU9ImtleWd1YXJkX3Bhc3N3b3JkX2VudGVyX3Bpbl9wYXNzd29yZF9jb2RlIj5FbnRlciBQSU4gdG8gdW5sb2NrPC9zdHJpbmc+CisKICAgICA8IS0tIEluc3RydWN0aW9ucyB0ZWxsaW5nIHRoZSB1c2VyIHRoYXQgdGhleSBlbnRlcmVkIHRoZSB3cm9uZyBwaW4gd2hpbGUgdHJ5aW5nCiAgICAgICAgICB0byB1bmxvY2sgdGhlIGtleWd1YXJkLiAgRGlzcGxheWVkIGluIG9uZSBsaW5lIGluIGEgbGFyZ2UgZm9udC4gIC0tPgogICAgIDxzdHJpbmcgbmFtZT0ia2V5Z3VhcmRfcGFzc3dvcmRfd3JvbmdfcGluX2NvZGUiPkluY29ycmVjdCBQSU4gY29kZSE8L3N0cmluZz4KQEAgLTE0NTcsNiArMTQ2Niw4IEBACiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3BhdHRlcm5fY29ycmVjdCI+Q29ycmVjdCE8L3N0cmluZz4KICAgICA8IS0tIE9uIHRoZSB1bmxvY2sgcGF0dGVybiBzY3JlZW4sIHNob3duIHdoZW4gdGhlIHVzZXIgZW50ZXJzIHRoZSB3cm9uZyBsb2NrIHBhdHRlcm4gYW5kIG11c3QgdHJ5IGFnYWluLiAtLT4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fcGF0dGVybl93cm9uZyI+U29ycnksIHRyeSBhZ2Fpbjwvc3RyaW5nPgorICAgIDwhLS0gT24gdGhlIHVubG9jayBwYXNzd29yZCBzY3JlZW4sIHNob3duIHdoZW4gdGhlIHVzZXIgZW50ZXJzIHRoZSB3cm9uZyBsb2NrIHBhc3N3b3JkIGFuZCBtdXN0IHRyeSBhZ2Fpbi4gLS0+CisgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3Bhc3N3b3JkX3dyb25nIj5Tb3JyeSwgdHJ5IGFnYWluPC9zdHJpbmc+CiAKICAgICA8IS0tIFdoZW4gdGhlIGxvY2sgc2NyZWVuIGlzIHNob3dpbmcgYW5kIHRoZSBwaG9uZSBwbHVnZ2VkIGluLCBhbmQgdGhlIGJhdHRlcnkKICAgICAgICAgIGlzIG5vdCBmdWxseSBjaGFyZ2VkLCBzaG93IHRoZSBjdXJyZW50IGNoYXJnZSAlLiAgLS0+CkBAIC0xNTAwLDEyICsxNTExLDI3IEBACiAgICAgICAgICBwcm9ncmVzcyBkaWFsb2cgaW4gdGhlIG1lYW50aW1lLiAgdGhpcyBpcyB0aGUgZW1zc2FnZS4gLS0+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3NpbV91bmxvY2tfcHJvZ3Jlc3NfZGlhbG9nX21lc3NhZ2UiPlVubG9ja2luZyBTSU0gY2FyZFx1MjAyNjwvc3RyaW5nPgogCi0gICAgPCEtLSBGb3IgdGhlIHVubG9jayBzY3JlZW4sIEluZm9ybWF0aW9uIG1lc3NhZ2Ugc2hvd24gaW4gZGlhbG9nIHdoZW4gdXNlciBoYXMgdG9vIG1hbnkgZmFpbGVkIGF0dGVtcHRzIC0tPgorICAgIDwhLS0gRm9yIHRoZSB1bmxvY2sgc2NyZWVuLCBJbmZvcm1hdGlvbiBtZXNzYWdlIHNob3duIGluIGRpYWxvZyB3aGVuIHVzZXIgaGFzIHRvbyBtYW55IGZhaWxlZCBhdHRlbXB0cyBhdAorICAgICAgICAgZHJhd2luZyB0aGUgdW5sb2NrIHBhdHRlcm4gLS0+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3Rvb19tYW55X2ZhaWxlZF9hdHRlbXB0c19kaWFsb2dfbWVzc2FnZSI+CiAgICAgICAgIFlvdSBoYXZlIGluY29ycmVjdGx5IGRyYXduIHlvdXIgdW5sb2NrIHBhdHRlcm4gPHhsaWZmOmcgaWQ9Im51bWJlciI+JWQ8L3hsaWZmOmc+IHRpbWVzLgogICAgICAgICBcblxuUGxlYXNlIHRyeSBhZ2FpbiBpbiA8eGxpZmY6ZyBpZD0ibnVtYmVyIj4lZDwveGxpZmY6Zz4gc2Vjb25kcy4KICAgICA8L3N0cmluZz4KIAorICAgIDwhLS0gRm9yIHRoZSB1bmxvY2sgc2NyZWVuLCBJbmZvcm1hdGlvbiBtZXNzYWdlIHNob3duIGluIGRpYWxvZyB3aGVuIHVzZXIgaGFzIHRvbyBtYW55IGZhaWxlZCBhdHRlbXB0cyBhdAorICAgICAgICAgZW50ZXJpbmcgdGhlIHBhc3N3b3JkIC0tPgorICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl90b29fbWFueV9mYWlsZWRfcGFzc3dvcmRfYXR0ZW1wdHNfZGlhbG9nX21lc3NhZ2UiPgorICAgICAgICBZb3UgaGF2ZSBpbmNvcnJlY3RseSBlbnRlcmVkIHlvdXIgcGFzc3dvcmQgPHhsaWZmOmcgaWQ9Im51bWJlciI+JWQ8L3hsaWZmOmc+IHRpbWVzLgorICAgICAgICBcblxuUGxlYXNlIHRyeSBhZ2FpbiBpbiA8eGxpZmY6ZyBpZD0ibnVtYmVyIj4lZDwveGxpZmY6Zz4gc2Vjb25kcy4KKyAgICA8L3N0cmluZz4KKworICAgIDwhLS0gRm9yIHRoZSB1bmxvY2sgc2NyZWVuLCBJbmZvcm1hdGlvbiBtZXNzYWdlIHNob3duIGluIGRpYWxvZyB3aGVuIHVzZXIgaGFzIHRvbyBtYW55IGZhaWxlZCBhdHRlbXB0cyBhdAorICAgICAgICAgZW50ZXJpbmcgdGhlIFBJTiAtLT4KKyAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fdG9vX21hbnlfZmFpbGVkX3Bpbl9hdHRlbXB0c19kaWFsb2dfbWVzc2FnZSI+CisgICAgICAgIFlvdSBoYXZlIGluY29ycmVjdGx5IGVudGVyZWQgeW91ciBQSU4gPHhsaWZmOmcgaWQ9Im51bWJlciI+JWQ8L3hsaWZmOmc+IHRpbWVzLgorICAgICAgICBcblxuUGxlYXNlIHRyeSBhZ2FpbiBpbiA8eGxpZmY6ZyBpZD0ibnVtYmVyIj4lZDwveGxpZmY6Zz4gc2Vjb25kcy4KKyAgICA8L3N0cmluZz4KKwogICAgIDwhLS0gRm9yIHRoZSB1bmxvY2sgc2NyZWVuLCBJbmZvcm1hdGlvbiBtZXNzYWdlIHNob3duIGluIGRpYWxvZyB3aGVuIHVzZXIgaXMgYWxtb3N0IGF0IHRoZSBsaW1pdAogICAgICAgICAgd2hlcmUgdGhleSB3aWxsIGJlIGxvY2tlZCBvdXQgYW5kIG1heSBoYXZlIHRvIGVudGVyIGFuIGFsdGVybmF0ZSB1c2VybmFtZS9wYXNzd29yZCB0byB1bmxvY2sgdGhlIHBob25lIC0tPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9mYWlsZWRfYXR0ZW1wdHNfYWxtb3N0X2dsb2dpbiI+CkBAIC0xNTc1LDggKzE2MDEsMTAgQEAKICAgICA8c3RyaW5nIG5hbWU9ImZhY3Rvcnl0ZXN0X3JlYm9vdCI+UmVib290PC9zdHJpbmc+CiAKICAgICA8IS0tIERvIG5vdCB0cmFuc2xhdGUuICBXZWJWaWV3IFVzZXIgQWdlbnQgc3RyaW5nIC0tPgotICAgIDxzdHJpbmcgbmFtZT0id2ViX3VzZXJfYWdlbnQiIHRyYW5zbGF0YWJsZT0iZmFsc2UiPjx4bGlmZjpnIGlkPSJ4Ij5Nb3ppbGxhLzUuMCAoTGludXg7IFU7IEFuZHJvaWQgJXMpCi0gICAgICAgIEFwcGxlV2ViS2l0LzUzMy4xIChLSFRNTCwgbGlrZSBHZWNrbykgVmVyc2lvbi80LjAgTW9iaWxlIFNhZmFyaS81MzMuMTwveGxpZmY6Zz48L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9IndlYl91c2VyX2FnZW50IiB0cmFuc2xhdGFibGU9ImZhbHNlIj5Nb3ppbGxhLzUuMCAoTGludXg7IFU7IDx4bGlmZjpnIGlkPSJ4Ij5BbmRyb2lkICVzPC94bGlmZjpnPikKKyAgICAgICAgQXBwbGVXZWJLaXQvNTM0LjcgKEtIVE1MLCBsaWtlIEdlY2tvKSBWZXJzaW9uLzQuMCA8eGxpZmY6ZyBpZD0ibW9iaWxlIj4lczwveGxpZmY6Zz5TYWZhcmkvNTM0Ljc8L3N0cmluZz4KKyAgICA8IS0tIERvIG5vdCB0cmFuc2xhdGUuICBXZWJWaWV3IFVzZXIgQWdlbnQgdGFyZ2V0ZWQgY29udGVudCAtLT4KKyAgICA8c3RyaW5nIG5hbWU9IndlYl91c2VyX2FnZW50X3RhcmdldF9jb250ZW50IiB0cmFuc2xhdGFibGU9ImZhbHNlIj4iTW9iaWxlICI8L3N0cmluZz4KIAogICAgIDwhLS0gVGl0bGUgZm9yIGEgSmF2YVNjcmlwdCBkaWFsb2cuICJUaGUgcGFnZSBhdCA8dXJsIG9mIGN1cnJlbnQgcGFnZT4gc2F5czoiIC0tPgogICAgIDxzdHJpbmcgbmFtZT0ianNfZGlhbG9nX3RpdGxlIj5UaGUgcGFnZSBhdCBcJzx4bGlmZjpnIGlkPSJ0aXRsZSI+JXM8L3hsaWZmOmc+XCcgc2F5czo8L3N0cmluZz4KQEAgLTE4MzksOSArMTg2Nyw2IEBACiAgICAgPCEtLSBJdGVtIG9uIEVkaXRUZXh0IGNvbnRleHQgbWVudS4gVGhpcyBhY3Rpb24gaXMgdXNlZCB0byBzZWxlY3QgYWxsIHRleHQgaW4gdGhlIGVkaXQgZmllbGQuIC0tPgogICAgIDxzdHJpbmcgbmFtZT0ic2VsZWN0QWxsIj5TZWxlY3QgYWxsPC9zdHJpbmc+CiAKLSAgICA8IS0tIEl0ZW0gb24gRWRpdFRleHQgY29udGV4dCBtZW51LiBUaGlzIGFjdGlvbiBpcyB1c2VkIHRvIHN0YXJ0IHNlbGVjdGluZyB0ZXh0IGluIHRoZSBlZGl0IGZpZWxkLiBbQ0hBUiBMSU1JVD0yMF0gLS0+Ci0gICAgPHN0cmluZyBuYW1lPSJzZWxlY3RUZXh0Ij5TZWxlY3Qgd29yZDwvc3RyaW5nPgotCiAgICAgPCEtLSBJdGVtIG9uIEVkaXRUZXh0IGNvbnRleHQgbWVudS4gIFRoaXMgYWN0aW9uIGlzIHVzZWQgdG8gY3V0IHNlbGVjdGVkIHRoZSB0ZXh0IGludG8gdGhlIGNsaXBib2FyZC4gIC0tPgogICAgIDxzdHJpbmcgbmFtZT0iY3V0Ij5DdXQ8L3N0cmluZz4KIApAQCAtMTg1NCwxNSArMTg3OSwxNyBAQAogICAgIDwhLS0gSXRlbSBvbiBFZGl0VGV4dCBjb250ZXh0IG1lbnUuIFRoaXMgYWN0aW9uIGlzIHVzZWQgdG8gY29weSBhIFVSTCBmcm9tIHRoZSBlZGl0IGZpZWxkIGludG8gdGhlIGNsaXBib2FyZC4gLS0+CiAgICAgPHN0cmluZyBuYW1lPSJjb3B5VXJsIj5Db3B5IFVSTDwvc3RyaW5nPgogCisgICAgPCEtLSBJdGVtIG9uIEVkaXRUZXh0IGNvbnRleHQgbWVudS4gQWRkZWQgb25seSB3aGVuIHRoZSBjb250ZXh0IG1lbnUgaXMgbm90IGVtcHR5LCBpdCBlbmFibGUgc2VsZWN0aW9uIGNvbnRleHQgbW9kZS4gW0NIQVIgTElNSVQ9MjBdIC0tPgorICAgIDxzdHJpbmcgbmFtZT0ic2VsZWN0VGV4dE1vZGUiPlNlbGVjdCB0ZXh0Li4uPC9zdHJpbmc+CisKKyAgICA8IS0tIFRleHQgc2VsZWN0aW9uIGNvbnRleHR1YWwgbW9kZSB0aXRsZSwgZGlzcGxheWVkIGluIHRoZSBDQUIuIFtDSEFSIExJTUlUPTIwXSAtLT4KKyAgICA8c3RyaW5nIG5hbWU9InRleHRTZWxlY3Rpb25DQUJUaXRsZSI+VGV4dCBzZWxlY3Rpb248L3N0cmluZz4KKwogICAgIDwhLS0gRWRpdFRleHQgY29udGV4dCBtZW51IC0tPgogICAgIDxzdHJpbmcgbmFtZT0iaW5wdXRNZXRob2QiPklucHV0IG1ldGhvZDwvc3RyaW5nPgogCi0gICAgPCEtLSBJdGVtIG9uIEVkaXRUZXh0IGNvbnRleHQgbWVudSwgdXNlZCB0byBhZGQgYSB3b3JkIHRvIHRoZQotICAgICAgICAgaW5wdXQgbWV0aG9kIGRpY3Rpb25hcnkuIC0tPgotICAgIDxzdHJpbmcgbmFtZT0iYWRkVG9EaWN0aW9uYXJ5Ij4iQWRkIFwiPHhsaWZmOmcgaWQ9IndvcmQiIGV4YW1wbGU9InJpY2tyb2xsIj4lczwveGxpZmY6Zz5cIiB0byBkaWN0aW9uYXJ5PC9zdHJpbmc+Ci0KLSAgICA8IS0tIFRpdGxlIGZvciBFZGl0VGV4dCBjb250ZXh0IG1lbnUgLS0+Ci0gICAgPHN0cmluZyBuYW1lPSJlZGl0VGV4dE1lbnVUaXRsZSI+RWRpdCB0ZXh0PC9zdHJpbmc+CisgICAgPCEtLSBUaXRsZSBmb3IgRWRpdFRleHQgY29udGV4dCBtZW51IFtDSEFSIExJTUlUPTIwXSAtLT4KKyAgICA8c3RyaW5nIG5hbWU9ImVkaXRUZXh0TWVudVRpdGxlIj5UZXh0IGFjdGlvbnM8L3N0cmluZz4KIAogICAgIDwhLS0gSWYgdGhlIGRldmljZSBpcyBnZXR0aW5nIGxvdyBvbiBpbnRlcm5hbCBzdG9yYWdlLCBhIG5vdGlmaWNhdGlvbiBpcyBzaG93biB0byB0aGUgdXNlci4gIFRoaXMgaXMgdGhlIHRpdGxlIG9mIHRoYXQgbm90aWZpY2F0aW9uLiAtLT4KICAgICA8c3RyaW5nIG5hbWU9Imxvd19pbnRlcm5hbF9zdG9yYWdlX3ZpZXdfdGl0bGUiPkxvdyBvbiBzcGFjZTwvc3RyaW5nPgpAQCAtMTg4MSw2ICsxOTA4LDkgQEAKICAgICAgICAgIGNvbWJpbmVkIHdpdGggc2V0SWNvbihhbmRyb2lkLlIuZHJhd2FibGUuaWNfZGlhbG9nX2FsZXJ0KSAtLT4KICAgICA8c3RyaW5nIG5hbWU9ImRpYWxvZ19hbGVydF90aXRsZSI+QXR0ZW50aW9uPC9zdHJpbmc+CiAKKyAgICA8IS0tIFRleHQgc2hvd24gYnkgbGlzdCBmcmFnbWVudCB3aGVuIHdhaXRpbmcgZm9yIGRhdGEgdG8gZGlzcGxheS4gLS0+CisgICAgPHN0cmluZyBuYW1lPSJsb2FkaW5nIj5Mb2FkaW5nLi4uPC9zdHJpbmc+CisKICAgICA8IS0tIERlZmF1bHQgdGV4dCBmb3IgYSBidXR0b24gdGhhdCBjYW4gYmUgdG9nZ2xlZCBvbiBhbmQgb2ZmLiAtLT4KICAgICA8c3RyaW5nIG5hbWU9ImNhcGl0YWxfb24iPk9OPC9zdHJpbmc+CiAgICAgPCEtLSBEZWZhdWx0IHRleHQgZm9yIGEgYnV0dG9uIHRoYXQgY2FuIGJlIHRvZ2dsZWQgb24gYW5kIG9mZi4gLS0+CkBAIC0xOTM3LDIzICsxOTY3LDIzIEBACiAKICAgICA8IS0tIE5vdGlmaWNhdGlvbiB0ZXh0IHRvIHRlbGwgdGhlIHVzZXIgdGhhdCBhIGhlYXZ5LXdlaWdodCBhcHBsaWNhdGlvbiBpcyBydW5uaW5nLiAtLT4KICAgICA8c3RyaW5nIG5hbWU9ImhlYXZ5X3dlaWdodF9ub3RpZmljYXRpb24iPjx4bGlmZjpnIGlkPSJhcHAiPiUxJHM8L3hsaWZmOmc+IHJ1bm5pbmc8L3N0cmluZz4KLSAgICAKKwogICAgIDwhLS0gTm90aWZpY2F0aW9uIGRldGFpbHMgdG8gdGVsbCB0aGUgdXNlciB0aGF0IGEgaGVhdnktd2VpZ2h0IGFwcGxpY2F0aW9uIGlzIHJ1bm5pbmcuIC0tPgogICAgIDxzdHJpbmcgbmFtZT0iaGVhdnlfd2VpZ2h0X25vdGlmaWNhdGlvbl9kZXRhaWwiPlNlbGVjdCB0byBzd2l0Y2ggdG8gYXBwbGljYXRpb248L3N0cmluZz4KLSAgICAKKwogICAgIDwhLS0gVGl0bGUgb2YgZGlhbG9nIHByb21wdGluZyB3aGV0aGVyIHVzZXIgd2FudHMgdG8gc3dpdGNoIGJldHdlZW4gaGVhdnktd2VpZ2h0IGFwcHMuIC0tPgogICAgIDxzdHJpbmcgbmFtZT0iaGVhdnlfd2VpZ2h0X3N3aXRjaGVyX3RpdGxlIj5Td2l0Y2ggYXBwbGljYXRpb25zPzwvc3RyaW5nPgotICAgIAorCiAgICAgPCEtLSBEZXNjcmlwdGl2ZSB0ZXh0IGZvciBzd2l0Y2hpbmcgdG8gYSBuZXcgaGVhdnktd2VpZ2h0IGFwcGxpY2F0aW9uLiAtLT4KICAgICA8c3RyaW5nIG5hbWU9ImhlYXZ5X3dlaWdodF9zd2l0Y2hlcl90ZXh0Ij5Bbm90aGVyIGFwcGxpY2F0aW9uIGlzIGFscmVhZHkgcnVubmluZwogICAgIHRoYXQgbXVzdCBiZSBzdG9wcGVkIGJlZm9yZSB5b3UgY2FuIHN0YXJ0IGEgbmV3IG9uZS48L3N0cmluZz4KLSAgICAKKwogICAgIDxzdHJpbmcgbmFtZT0ib2xkX2FwcF9hY3Rpb24iPlJldHVybiB0byA8eGxpZmY6ZyBpZD0ib2xkX2FwcCI+JTEkczwveGxpZmY6Zz48L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9Im9sZF9hcHBfZGVzY3JpcHRpb24iPkRvblwndCBzdGFydCB0aGUgbmV3IGFwcGxpY2F0aW9uLjwvc3RyaW5nPgotICAgIAorCiAgICAgPHN0cmluZyBuYW1lPSJuZXdfYXBwX2FjdGlvbiI+U3RhcnQgPHhsaWZmOmcgaWQ9Im9sZF9hcHAiPiUxJHM8L3hsaWZmOmc+PC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJuZXdfYXBwX2Rlc2NyaXB0aW9uIj5TdG9wIHRoZSBvbGQgYXBwbGljYXRpb24gd2l0aG91dCBzYXZpbmcuPC9zdHJpbmc+Ci0gICAgCisKICAgICA8IS0tIERpc3BsYXllZCBpbiB0aGUgdGl0bGUgb2YgdGhlIGNob29zZXIgZm9yIHRoaW5ncyB0byBkbyB3aXRoIHRleHQgdGhhdAogICAgICAgICAgaXMgdG8gYmUgc2VudCB0byBhbm90aGVyIGFwcGxpY2F0aW9uLiBGb3IgZXhhbXBsZSwgSSBjYW4gc2VuZAogICAgICAgICAgdGV4dCB0aHJvdWdoIFNNUyBvciBJTS4gIEEgZGlhbG9nIHdpdGggdGhvc2UgY2hvaWNlcyB3b3VsZCBiZSBzaG93biwKQEAgLTIyMjUsMTcgKzIyNTUsMTMgQEAKICAgICA8IS0tIExvY2FsaXplZCBzdHJpbmdzIGZvciBXZWJWaWV3IC0tPgogICAgIDwhLS0gTGFiZWwgZm9yIGJ1dHRvbiBpbiBhIFdlYlZpZXcgdGhhdCB3aWxsIG9wZW4gYSBjaG9vc2VyIHRvIGNob29zZSBhIGZpbGUgdG8gdXBsb2FkIC0tPgogICAgIDxzdHJpbmcgbmFtZT0idXBsb2FkX2ZpbGUiPkNob29zZSBmaWxlPC9zdHJpbmc+CisgICAgPCEtLSBMYWJlbCBmb3IgdGhlIGZpbGUgdXBsb2FkIGNvbnRyb2wgd2hlbiBubyBmaWxlIGhhcyBiZWVuIGNob3NlbiB5ZXQgLS0+CisgICAgPHN0cmluZyBuYW1lPSJub19maWxlX2Nob3NlbiI+Tm8gZmlsZSBjaG9zZW48L3N0cmluZz4KICAgICA8IS0tIExhYmVsIGZvciA8aW5wdXQgdHlwZT0icmVzZXQiPiBidXR0b24gaW4gaHRtbCAtLT4KICAgICA8c3RyaW5nIG5hbWU9InJlc2V0Ij5SZXNldDwvc3RyaW5nPgogICAgIDwhLS0gTGFiZWwgZm9yIDxpbnB1dCB0eXBlPSJzdWJtaXQiPiBidXR0b24gaW4gaHRtbCAtLT4KICAgICA8c3RyaW5nIG5hbWU9InN1Ym1pdCI+U3VibWl0PC9zdHJpbmc+CiAKLSAgICA8IS0tIFN0cmluZyBkZXNjcmliaW5nIHRoZSBTdGFyL0Zhdm9yaXRlIGNoZWNrYm94Ci0KLSAgICAgICAgIFVzZWQgYnkgQWNjZXNzaWJpbGl0eVNlcnZpY2UgdG8gYW5ub3VuY2UgdGhlIHB1cnBvc2Ugb2YgdGhlIHZpZXcuCi0gICAgLS0+Ci0gICAgPHN0cmluZyBuYW1lPSJkZXNjcmlwdGlvbl9zdGFyIj5mYXZvcml0ZTwvc3RyaW5nPgotCiAgICAgPCEtLSBTdHJpbmdzIGZvciBjYXIgbW9kZSBub3RpZmljYXRpb24gLS0+CiAgICAgPCEtLSBTaG93biB3aGVuIGNhciBtb2RlIGlzIGVuYWJsZWQgLS0+CiAgICAgPHN0cmluZyBuYW1lPSJjYXJfbW9kZV9kaXNhYmxlX25vdGlmaWNhdGlvbl90aXRsZSI+Q2FyIG1vZGUgZW5hYmxlZDwvc3RyaW5nPgpAQCAtMjI0Niw2ICsyMjcyLDEzIEBACiAgICAgPHN0cmluZyBuYW1lPSJ0ZXRoZXJlZF9ub3RpZmljYXRpb25fdGl0bGUiPlRldGhlcmluZyBvciBob3RzcG90IGFjdGl2ZTwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idGV0aGVyZWRfbm90aWZpY2F0aW9uX21lc3NhZ2UiPlRvdWNoIHRvIGNvbmZpZ3VyZTwvc3RyaW5nPgogCisgICAgPCEtLSAgU3RyaW5ncyBmb3IgcG9zc2libGUgUHJlZmVyZW5jZUFjdGl2aXR5IEJhY2svTmV4dCBidXR0b25zIC0tPgorICAgIDxzdHJpbmcgbmFtZT0iYmFja19idXR0b25fbGFiZWwiPkJhY2s8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im5leHRfYnV0dG9uX2xhYmVsIj5OZXh0PC9zdHJpbmc+CisKKyAgICA8IS0tIE9wdGlvbmFsIGJ1dHRvbiB0byBTa2lwIGEgUHJlZmVyZW5jZUFjdGl2aXR5IFtDSEFSIExJTUlUPTIwXSAtLT4KKyAgICA8c3RyaW5nIG5hbWU9InNraXBfYnV0dG9uX2xhYmVsIj5Ta2lwPC9zdHJpbmc+CisKICAgICA8IS0tIFN0cmluZ3MgZm9yIHRocm90dGxpbmcgbm90aWZpY2F0aW9uIC0tPgogICAgIDwhLS0gU2hvd24gd2hlbiB0aGUgdXNlciBpcyBpbiBkYW5nZXIgb2YgYmVpbmcgdGhyb3R0bGVkIC0tPgogICAgIDxzdHJpbmcgbmFtZT0idGhyb3R0bGVfd2FybmluZ19ub3RpZmljYXRpb25fdGl0bGUiPkhpZ2ggbW9iaWxlIGRhdGEgdXNlPC9zdHJpbmc+CkBAIC0yMjU1LDQgKzIyODgsMjEgQEAKICAgICA8IS0tIFNob3duIHdoZW4gdGhlIHVzZXJzIGJhbmR3aWR0aCBpcyByZWR1Y2VkIGJlY2F1c2Ugb2YgZXhjZXNzaXZlIGRhdGEgdXNlIC0tPgogICAgIDxzdHJpbmcgbmFtZT0idGhyb3R0bGVkX25vdGlmaWNhdGlvbl90aXRsZSI+TW9iaWxlIGRhdGEgbGltaXQgZXhjZWVkZWQ8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InRocm90dGxlZF9ub3RpZmljYXRpb25fbWVzc2FnZSI+VG91Y2ggdG8gbGVhcm4gbW9yZSBhYm91dCBtb2JpbGUgZGF0YSB1c2U8L3N0cmluZz4KKworICAgIDwhLS0gRGlzcGxheWVkIG9uIHRoZSBGaW5kIGRpYWxvZyB3aGVuIHRoZXJlIGFyZSBubyBtYXRjaGVzIFtDSEFSIExJTUlUPU5PTkVdLS0+CisgICAgPHN0cmluZyBuYW1lPSJub19tYXRjaGVzIj5ObyBtYXRjaGVzPC9zdHJpbmc+CisKKyAgICA8IS0tIEZpbmQgZGlhbG9nIGhpbnQgdGV4dC4gIEFsc28gdXNlZCBpbiB0aGUgbWVudSBpdGVtIHRvIG9wZW4gZmluZCBvbiBwYWdlIFtDSEFSIExJTUlUPU5PTkVdIC0tPgorICAgIDxzdHJpbmcgbmFtZT0iZmluZF9vbl9wYWdlIj5GaW5kIG9uIHBhZ2U8L3N0cmluZz4KKworICAgIDwhLS0gRGlzcGxheWVkIG9uIHRoZSBGaW5kIGRpYWxvZyB0byBkaXNwbGF5IHRoZSBpbmRleCBvZiB0aGUgaGlnaGxpZ2h0ZWQKKyAgICAgICAgIG1hdGNoIGFuZCB0b3RhbCBudW1iZXIgb2YgbWF0Y2hlcyBmb3VuZCBpbiB0aGUgY3VycmVudCBwYWdlLiBbQ0hBUiBMSU1JVD1OT05FXSAtLT4KKyAgICA8cGx1cmFscyBuYW1lPSJtYXRjaGVzX2ZvdW5kIj4KKyAgICAgICAgPCEtLSBDYXNlIG9mIG9uZSBtYXRjaCAtLT4KKyAgICAgICAgPGl0ZW0gcXVhbnRpdHk9Im9uZSI+MSBtYXRjaDwvaXRlbT4KKyAgICAgICAgPCEtLSBDYXNlIG9mIG11bHRpcGxlIHRvdGFsIG1hdGNoZXMgLS0+CisgICAgICAgIDxpdGVtIHF1YW50aXR5PSJvdGhlciI+PHhsaWZmOmcgaWQ9ImluZGV4IiBleGFtcGxlPSIyIj4lZDwveGxpZmY6Zz4gb2YgPHhsaWZmOmcgaWQ9InRvdGFsIiBleGFtcGxlPSIxMzciPiVkPC94bGlmZjpnPjwvaXRlbT4KKyAgICA8L3BsdXJhbHM+CisKKwogPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvdmFsdWVzL3N0eWxlcy54bWwgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzL3N0eWxlcy54bWwKaW5kZXggMWM2MGJhMC4uOWJhMDEzMSAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL3ZhbHVlcy9zdHlsZXMueG1sCisrKyBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMvc3R5bGVzLnhtbApAQCAtNzQsNiArNzQsMTAgQEAKICAgICAgICAgPGl0ZW0gbmFtZT0id2FsbHBhcGVySW50cmFPcGVuRXhpdEFuaW1hdGlvbiI+QGFuaW0vd2FsbHBhcGVyX2ludHJhX29wZW5fZXhpdDwvaXRlbT4KICAgICAgICAgPGl0ZW0gbmFtZT0id2FsbHBhcGVySW50cmFDbG9zZUVudGVyQW5pbWF0aW9uIj5AYW5pbS93YWxscGFwZXJfaW50cmFfY2xvc2VfZW50ZXI8L2l0ZW0+CiAgICAgICAgIDxpdGVtIG5hbWU9IndhbGxwYXBlckludHJhQ2xvc2VFeGl0QW5pbWF0aW9uIj5AYW5pbS93YWxscGFwZXJfaW50cmFfY2xvc2VfZXhpdDwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iZnJhZ21lbnRPcGVuRW50ZXJBbmltYXRpb24iPkBhbmltL2ZyYWdtZW50X29wZW5fZW50ZXI8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImZyYWdtZW50T3BlbkV4aXRBbmltYXRpb24iPkBhbmltL2ZyYWdtZW50X29wZW5fZXhpdDwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iZnJhZ21lbnRDbG9zZUVudGVyQW5pbWF0aW9uIj5AYW5pbS9mcmFnbWVudF9jbG9zZV9lbnRlcjwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iZnJhZ21lbnRDbG9zZUV4aXRBbmltYXRpb24iPkBhbmltL2ZyYWdtZW50X2Nsb3NlX2V4aXQ8L2l0ZW0+CiAgICAgPC9zdHlsZT4KIAogICAgIDwhLS0gU3RhbmRhcmQgYW5pbWF0aW9ucyBmb3IgYSBub24tZnVsbC1zY3JlZW4gd2luZG93IG9yIGFjdGl2aXR5LiAtLT4KQEAgLTg4LDYgKzkyLDEzIEBACiAgICAgICAgIDxpdGVtIG5hbWU9IndpbmRvd0V4aXRBbmltYXRpb24iPkBhbmltL3N0YXR1c19iYXJfZXhpdDwvaXRlbT4KICAgICA8L3N0eWxlPgogCisgICAgPCEtLSB7QGhpZGV9IC0tPgorICAgIDxzdHlsZSBuYW1lPSJBbmltYXRpb24uU3RhdHVzQmFyLkludHJ1ZGVyQWxlcnQiCisgICAgICAgIHBhcmVudD0iQGFuZHJvaWQ6c3R5bGUvQW5pbWF0aW9uLlN0YXR1c0JhciI+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6d2luZG93RW50ZXJBbmltYXRpb24iPkBhbmltL3ByaW9yaXR5X2FsZXJ0X2VudGVyPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOndpbmRvd0V4aXRBbmltYXRpb24iPkBhbmltL3ByaW9yaXR5X2FsZXJ0X2V4aXQ8L2l0ZW0+CisgICAgPC9zdHlsZT4KKwogICAgIDwhLS0gU3RhbmRhcmQgYW5pbWF0aW9ucyBmb3IgYSB0cmFuc2x1Y2VudCB3aW5kb3cgb3IgYWN0aXZpdHkuICBUaGlzCiAgICAgICAgICBzdHlsZSBpcyA8ZW0+bm90PGVtPiB1c2VkIGJ5IGRlZmF1bHQgZm9yIHRoZSB0cmFuc2x1Y2VudCB0aGVtZQogICAgICAgICAgKHNpbmNlIHRyYW5zbHVjZW50IGFjdGl2aXRpZXMgYXJlIGEgc3BlY2lhbCBjYXNlIHRoYXQgaGF2ZSBubwpAQCAtMTg4LDggKzE5OSw3IEBACiAgICAgPCEtLSBTdGF0dXMgQmFyIFN0eWxlcyAtLT4KIAogICAgIDxzdHlsZSBuYW1lPSJUZXh0QXBwZWFyYW5jZS5TdGF0dXNCYXIiPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnRleHRTaXplIj4xNHNwPC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnRleHRTdHlsZSI+bm9ybWFsPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnRleHRBcHBlYXJhbmNlIj4/YW5kcm9pZDphdHRyL3RleHRBcHBlYXJhbmNlU21hbGw8L2l0ZW0+CiAgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6dGV4dENvbG9yIj4/YW5kcm9pZDphdHRyL3RleHRDb2xvclByaW1hcnk8L2l0ZW0+CiAgICAgPC9zdHlsZT4KICAgICA8c3R5bGUgbmFtZT0iVGV4dEFwcGVhcmFuY2UuU3RhdHVzQmFyLlRpY2tlciI+CkBAIC0yMDIsOSArMjEyLDEwIEBACiAgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6dGV4dFN0eWxlIj5ib2xkPC9pdGVtPgogICAgIDwvc3R5bGU+CiAgICAgPHN0eWxlIG5hbWU9IlRleHRBcHBlYXJhbmNlLlN0YXR1c0Jhci5FdmVudENvbnRlbnQiPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnRleHRDb2xvciI+P2FuZHJvaWQ6YXR0ci90ZXh0Q29sb3JQcmltYXJ5SW52ZXJzZTwvaXRlbT4KICAgICA8L3N0eWxlPgogICAgIDxzdHlsZSBuYW1lPSJUZXh0QXBwZWFyYW5jZS5TdGF0dXNCYXIuRXZlbnRDb250ZW50LlRpdGxlIj4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp0ZXh0U2l6ZSI+MTZzcDwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp0ZXh0U2l6ZSI+MThzcDwvaXRlbT4KICAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp0ZXh0U3R5bGUiPmJvbGQ8L2l0ZW0+CiAgICAgPC9zdHlsZT4KIApAQCAtMjY5LDEyICsyODAsMTIgQEAKIAogICAgIDxzdHlsZSBuYW1lPSJXaWRnZXQuQ29tcG91bmRCdXR0b24uQ2hlY2tCb3giPgogICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmJhY2tncm91bmQiPkBhbmRyb2lkOmRyYXdhYmxlL2J0bl9jaGVja19sYWJlbF9iYWNrZ3JvdW5kPC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmJ1dHRvbiI+QGFuZHJvaWQ6ZHJhd2FibGUvYnRuX2NoZWNrPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmJ1dHRvbiI+P2FuZHJvaWQ6YXR0ci9saXN0Q2hvaWNlSW5kaWNhdG9yTXVsdGlwbGU8L2l0ZW0+CiAgICAgPC9zdHlsZT4KIAogICAgIDxzdHlsZSBuYW1lPSJXaWRnZXQuQ29tcG91bmRCdXR0b24uUmFkaW9CdXR0b24iPgogICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmJhY2tncm91bmQiPkBhbmRyb2lkOmRyYXdhYmxlL2J0bl9yYWRpb19sYWJlbF9iYWNrZ3JvdW5kPC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmJ1dHRvbiI+QGFuZHJvaWQ6ZHJhd2FibGUvYnRuX3JhZGlvPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmJ1dHRvbiI+P2FuZHJvaWQ6YXR0ci9saXN0Q2hvaWNlSW5kaWNhdG9yU2luZ2xlPC9pdGVtPgogICAgIDwvc3R5bGU+CiAKICAgICA8c3R5bGUgbmFtZT0iV2lkZ2V0LkNvbXBvdW5kQnV0dG9uLlN0YXIiPgpAQCAtNDA0LDkgKzQxNSw5IEBACiAgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6Zm9jdXNhYmxlIj50cnVlPC9pdGVtPgogICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmZvY3VzYWJsZUluVG91Y2hNb2RlIj50cnVlPC9pdGVtPgogICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmNsaWNrYWJsZSI+dHJ1ZTwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpiYWNrZ3JvdW5kIj5AYW5kcm9pZDpkcmF3YWJsZS9lZGl0X3RleHQ8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6YmFja2dyb3VuZCI+P2FuZHJvaWQ6YXR0ci9lZGl0VGV4dEJhY2tncm91bmQ8L2l0ZW0+CiAgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6dGV4dEFwcGVhcmFuY2UiPj9hbmRyb2lkOmF0dHIvdGV4dEFwcGVhcmFuY2VNZWRpdW1JbnZlcnNlPC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnRleHRDb2xvciI+QGFuZHJvaWQ6Y29sb3IvcHJpbWFyeV90ZXh0X2xpZ2h0PC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnRleHRDb2xvciI+P2FuZHJvaWQ6YXR0ci9lZGl0VGV4dENvbG9yPC9pdGVtPgogICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmdyYXZpdHkiPmNlbnRlcl92ZXJ0aWNhbDwvaXRlbT4KICAgICA8L3N0eWxlPgogICAgIApAQCAtNDMyLDE0ICs0NDMsOCBAQAogICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmJhY2tncm91bmQiPkBhbmRyb2lkOmRyYXdhYmxlL2J0bl9kZWZhdWx0PC9pdGVtPgogICAgIDwvc3R5bGU+CiAKLSAgICA8c3R5bGUgbmFtZT0iV2lkZ2V0LkF1dG9Db21wbGV0ZVRleHRWaWV3Ij4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpmb2N1c2FibGUiPnRydWU8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6Zm9jdXNhYmxlSW5Ub3VjaE1vZGUiPnRydWU8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6Y2xpY2thYmxlIj50cnVlPC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmJhY2tncm91bmQiPkBhbmRyb2lkOmRyYXdhYmxlL2VkaXRfdGV4dDwvaXRlbT4KKyAgICA8c3R5bGUgbmFtZT0iV2lkZ2V0LkF1dG9Db21wbGV0ZVRleHRWaWV3IiBwYXJlbnQ9IldpZGdldC5FZGl0VGV4dCI+CiAgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6Y29tcGxldGlvbkhpbnRWaWV3Ij5AYW5kcm9pZDpsYXlvdXQvc2ltcGxlX2Ryb3Bkb3duX2hpbnQ8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6dGV4dEFwcGVhcmFuY2UiPj9hbmRyb2lkOmF0dHIvdGV4dEFwcGVhcmFuY2VNZWRpdW1JbnZlcnNlPC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmdyYXZpdHkiPmNlbnRlcl92ZXJ0aWNhbDwvaXRlbT4KICAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpjb21wbGV0aW9uVGhyZXNob2xkIj4yPC9pdGVtPgogICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmRyb3BEb3duU2VsZWN0b3IiPkBhbmRyb2lkOmRyYXdhYmxlL2xpc3Rfc2VsZWN0b3JfYmFja2dyb3VuZDwvaXRlbT4KICAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpwb3B1cEJhY2tncm91bmQiPkBhbmRyb2lkOmRyYXdhYmxlL3NwaW5uZXJfZHJvcGRvd25fYmFja2dyb3VuZDwvaXRlbT4KQEAgLTQ1MSw2ICs0NTYsMTggQEAKICAgICA8c3R5bGUgbmFtZT0iV2lkZ2V0LlNwaW5uZXIiPgogICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmJhY2tncm91bmQiPkBhbmRyb2lkOmRyYXdhYmxlL2J0bl9kcm9wZG93bjwvaXRlbT4KICAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpjbGlja2FibGUiPnRydWU8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6c3Bpbm5lck1vZGUiPmRpYWxvZzwvaXRlbT4KKworICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmRyb3BEb3duU2VsZWN0b3IiPkBhbmRyb2lkOmRyYXdhYmxlL2xpc3Rfc2VsZWN0b3JfYmFja2dyb3VuZDwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpwb3B1cEJhY2tncm91bmQiPkBhbmRyb2lkOmRyYXdhYmxlL3NwaW5uZXJfZHJvcGRvd25fYmFja2dyb3VuZDwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpkcm9wRG93blZlcnRpY2FsT2Zmc2V0Ij4tMTBkaXA8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6ZHJvcERvd25Ib3Jpem9udGFsT2Zmc2V0Ij4wZGlwPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmRyb3BEb3duV2lkdGgiPndyYXBfY29udGVudDwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpwb3B1cFByb21wdFZpZXciPkBhbmRyb2lkOmxheW91dC9zaW1wbGVfZHJvcGRvd25faGludDwvaXRlbT4KKyAgICA8L3N0eWxlPgorCisgICAgPHN0eWxlIG5hbWU9IldpZGdldC5TcGlubmVyLkRyb3BEb3duIj4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpzcGlubmVyTW9kZSI+ZHJvcGRvd248L2l0ZW0+CiAgICAgPC9zdHlsZT4KIAogICAgIDxzdHlsZSBuYW1lPSJXaWRnZXQuVGV4dFZpZXcuUG9wdXBNZW51Ij4KQEAgLTQ3MCw3ICs0ODcsNyBAQAogICAgIDwvc3R5bGU+CiAgICAgCiAgICAgPHN0eWxlIG5hbWU9IldpZGdldC5Ecm9wRG93bkl0ZW0uU3Bpbm5lciI+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6Y2hlY2tNYXJrIj5AYW5kcm9pZDpkcmF3YWJsZS9idG5fcmFkaW88L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6Y2hlY2tNYXJrIj4/YW5kcm9pZDphdHRyL2xpc3RDaG9pY2VJbmRpY2F0b3JTaW5nbGU8L2l0ZW0+CiAgICAgPC9zdHlsZT4KIAogICAgIDxzdHlsZSBuYW1lPSJXaWRnZXQuU2Nyb2xsVmlldyI+CkBAIC00OTAsNyArNTA3LDcgQEAKICAgICA8L3N0eWxlPgogICAgIAogICAgIDxzdHlsZSBuYW1lPSJXaWRnZXQuTGlzdFZpZXcuV2hpdGUiIHBhcmVudD0iV2lkZ2V0LkFic0xpc3RWaWV3Ij4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpsaXN0U2VsZWN0b3IiPkBhbmRyb2lkOmRyYXdhYmxlL2xpc3Rfc2VsZWN0b3JfYmFja2dyb3VuZDwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpsaXN0U2VsZWN0b3IiPkBhbmRyb2lkOmRyYXdhYmxlL2xpc3Rfc2VsZWN0b3JfYmFja2dyb3VuZF9saWdodDwvaXRlbT4KICAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpjYWNoZUNvbG9ySGludCI+P2FuZHJvaWQ6YXR0ci9jb2xvckJhY2tncm91bmRDYWNoZUhpbnQ8L2l0ZW0+CiAgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6ZGl2aWRlciI+QGFuZHJvaWQ6ZHJhd2FibGUvZGl2aWRlcl9ob3Jpem9udGFsX2JyaWdodF9vcGFxdWU8L2l0ZW0+CiAgICAgPC9zdHlsZT4gICAgCkBAIC01NjcsNiArNTg0LDcgQEAKICAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpiYWNrZ3JvdW5kIj5AYW5kcm9pZDpkcmF3YWJsZS9xdWlja2NvbnRhY3RfYmFkZ2U8L2l0ZW0+CiAgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6Y2xpY2thYmxlIj50cnVlPC9pdGVtPgogICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnNjYWxlVHlwZSI+Zml0Q2VudGVyPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnNyYyI+QGFuZHJvaWQ6ZHJhd2FibGUvaWNfY29udGFjdF9waWN0dXJlPC9pdGVtPgogICAgIDwvc3R5bGU+CiAgICAgCiAgICAgPHN0eWxlIG5hbWU9IldpZGdldC5RdWlja0NvbnRhY3RCYWRnZVNtYWxsIj4KQEAgLTYwNiw5ICs2MjQsOSBAQAogCiAgICAgPHN0eWxlIG5hbWU9IlRleHRBcHBlYXJhbmNlIj4KICAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp0ZXh0Q29sb3IiPj90ZXh0Q29sb3JQcmltYXJ5PC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnRleHRDb2xvckhpZ2hsaWdodCI+I0ZGRkY5MjAwPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnRleHRDb2xvckhpZ2hsaWdodCI+P3RleHRDb2xvckhpZ2hsaWdodDwvaXRlbT4KICAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp0ZXh0Q29sb3JIaW50Ij4/dGV4dENvbG9ySGludDwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp0ZXh0Q29sb3JMaW5rIj4jNUM1Q0ZGPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnRleHRDb2xvckxpbmsiPj90ZXh0Q29sb3JMaW5rPC9pdGVtPgogICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnRleHRTaXplIj4xNnNwPC9pdGVtPgogICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnRleHRTdHlsZSI+bm9ybWFsPC9pdGVtPgogICAgIDwvc3R5bGU+CkBAIC02MTYsNyArNjM0LDggQEAKICAgICA8c3R5bGUgbmFtZT0iVGV4dEFwcGVhcmFuY2UuSW52ZXJzZSI+CiAgICAgICAgIDxpdGVtIG5hbWU9InRleHRDb2xvciI+P3RleHRDb2xvclByaW1hcnlJbnZlcnNlPC9pdGVtPgogICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnRleHRDb2xvckhpbnQiPj90ZXh0Q29sb3JIaW50SW52ZXJzZTwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp0ZXh0Q29sb3JMaW5rIj4jMDAwMEVFPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnRleHRDb2xvckhpZ2hsaWdodCI+P3RleHRDb2xvckhpZ2hsaWdodEludmVyc2U8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6dGV4dENvbG9yTGluayI+P3RleHRDb2xvckxpbmtJbnZlcnNlPC9pdGVtPgogICAgIDwvc3R5bGU+CiAKICAgICA8c3R5bGUgbmFtZT0iVGV4dEFwcGVhcmFuY2UuVGhlbWUiPgpAQCAtNjI0LDQxICs2NDMsNDAgQEAKIAogICAgIDxzdHlsZSBuYW1lPSJUZXh0QXBwZWFyYW5jZS5EaWFsb2dXaW5kb3dUaXRsZSI+CiAgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6dGV4dFNpemUiPjE4c3A8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6dGV4dFN0eWxlIj5ub3JtYWw8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6dGV4dENvbG9yIj4/dGV4dENvbG9yUHJpbWFyeTwvaXRlbT4KICAgICA8L3N0eWxlPgogCiAgICAgPHN0eWxlIG5hbWU9IlRleHRBcHBlYXJhbmNlLkxhcmdlIj4KICAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp0ZXh0U2l6ZSI+MjJzcDwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp0ZXh0U3R5bGUiPm5vcm1hbDwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp0ZXh0Q29sb3IiPj90ZXh0Q29sb3JQcmltYXJ5PC9pdGVtPgogICAgIDwvc3R5bGU+CiAKICAgICA8c3R5bGUgbmFtZT0iVGV4dEFwcGVhcmFuY2UuTGFyZ2UuSW52ZXJzZSI+CiAgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6dGV4dENvbG9yIj4/dGV4dENvbG9yUHJpbWFyeUludmVyc2U8L2l0ZW0+CiAgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6dGV4dENvbG9ySGludCI+P3RleHRDb2xvckhpbnRJbnZlcnNlPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnRleHRDb2xvckhpZ2hsaWdodCI+P3RleHRDb2xvckhpZ2hsaWdodEludmVyc2U8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6dGV4dENvbG9yTGluayI+P3RleHRDb2xvckxpbmtJbnZlcnNlPC9pdGVtPgogICAgIDwvc3R5bGU+CiAKICAgICA8c3R5bGUgbmFtZT0iVGV4dEFwcGVhcmFuY2UuTWVkaXVtIj4KICAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp0ZXh0U2l6ZSI+MThzcDwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp0ZXh0U3R5bGUiPm5vcm1hbDwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp0ZXh0Q29sb3IiPj90ZXh0Q29sb3JQcmltYXJ5PC9pdGVtPgogICAgIDwvc3R5bGU+CiAKICAgICA8c3R5bGUgbmFtZT0iVGV4dEFwcGVhcmFuY2UuTWVkaXVtLkludmVyc2UiPgogICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnRleHRDb2xvciI+P3RleHRDb2xvclByaW1hcnlJbnZlcnNlPC9pdGVtPgogICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnRleHRDb2xvckhpbnQiPj90ZXh0Q29sb3JIaW50SW52ZXJzZTwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp0ZXh0Q29sb3JIaWdobGlnaHQiPj90ZXh0Q29sb3JIaWdobGlnaHRJbnZlcnNlPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnRleHRDb2xvckxpbmsiPj90ZXh0Q29sb3JMaW5rSW52ZXJzZTwvaXRlbT4KICAgICA8L3N0eWxlPgogCiAgICAgPHN0eWxlIG5hbWU9IlRleHRBcHBlYXJhbmNlLlNtYWxsIj4KICAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp0ZXh0U2l6ZSI+MTRzcDwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp0ZXh0U3R5bGUiPm5vcm1hbDwvaXRlbT4KICAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp0ZXh0Q29sb3IiPj90ZXh0Q29sb3JTZWNvbmRhcnk8L2l0ZW0+CiAgICAgPC9zdHlsZT4KIAogICAgIDxzdHlsZSBuYW1lPSJUZXh0QXBwZWFyYW5jZS5TbWFsbC5JbnZlcnNlIj4KICAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp0ZXh0Q29sb3IiPj90ZXh0Q29sb3JTZWNvbmRhcnlJbnZlcnNlPC9pdGVtPgogICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnRleHRDb2xvckhpbnQiPj90ZXh0Q29sb3JIaW50SW52ZXJzZTwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp0ZXh0Q29sb3JIaWdobGlnaHQiPj90ZXh0Q29sb3JIaWdobGlnaHRJbnZlcnNlPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnRleHRDb2xvckxpbmsiPj90ZXh0Q29sb3JMaW5rSW52ZXJzZTwvaXRlbT4KICAgICA8L3N0eWxlPgogCiAgICAgPHN0eWxlIG5hbWU9IlRleHRBcHBlYXJhbmNlLlRoZW1lLkRpYWxvZyIgcGFyZW50PSJUZXh0QXBwZWFyYW5jZS5UaGVtZSI+CkBAIC04NTQsNCArODcyLDk3IEBACiAgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6cGFkZGluZ0JvdHRvbSI+MWRpcDwvaXRlbT4KICAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpiYWNrZ3JvdW5kIj5AYW5kcm9pZDpkcmF3YWJsZS9ib3R0b21fYmFyPC9pdGVtPgogICAgIDwvc3R5bGU+CisKKyAgICA8c3R5bGUgbmFtZT0iV2lkZ2V0LkFjdGlvbkJhciI+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6YmFja2dyb3VuZCI+QGFuZHJvaWQ6ZHJhd2FibGUvYWN0aW9uX2Jhcl9iYWNrZ3JvdW5kPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmRpc3BsYXlPcHRpb25zIj51c2VMb2dvPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmRpdmlkZXIiPkBhbmRyb2lkOmRyYXdhYmxlL2FjdGlvbl9iYXJfZGl2aWRlcjwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpoZWlnaHQiPj9hbmRyb2lkOmF0dHIvYWN0aW9uQmFyU2l6ZTwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpwYWRkaW5nTGVmdCI+M2RpcDwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpwYWRkaW5nVG9wIj4wZGlwPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnBhZGRpbmdSaWdodCI+M2RpcDwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpwYWRkaW5nQm90dG9tIj4wZGlwPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnRpdGxlVGV4dFN0eWxlIj5AYW5kcm9pZDpzdHlsZS9UZXh0QXBwZWFyYW5jZS5XaWRnZXQuQWN0aW9uQmFyLlRpdGxlPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnN1YnRpdGxlVGV4dFN0eWxlIj5AYW5kcm9pZDpzdHlsZS9UZXh0QXBwZWFyYW5jZS5XaWRnZXQuQWN0aW9uQmFyLlN1YnRpdGxlPC9pdGVtPgorICAgIDwvc3R5bGU+CisKKyAgICA8c3R5bGUgbmFtZT0iV2lkZ2V0LkFjdGlvbk1vZGUiPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmJhY2tncm91bmQiPj9hbmRyb2lkOmF0dHIvYWN0aW9uTW9kZUJhY2tncm91bmQ8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6aGVpZ2h0Ij4/YW5kcm9pZDphdHRyL2FjdGlvbkJhclNpemU8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6aXRlbVBhZGRpbmciPj9hbmRyb2lkOmF0dHIvYWN0aW9uQnV0dG9uUGFkZGluZzwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp0aXRsZVRleHRTdHlsZSI+QGFuZHJvaWQ6c3R5bGUvVGV4dEFwcGVhcmFuY2UuV2lkZ2V0LkFjdGlvbk1vZGUuVGl0bGU8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6c3VidGl0bGVUZXh0U3R5bGUiPkBhbmRyb2lkOnN0eWxlL1RleHRBcHBlYXJhbmNlLldpZGdldC5BY3Rpb25Nb2RlLlN1YnRpdGxlPC9pdGVtPgorICAgIDwvc3R5bGU+CisKKyAgICA8c3R5bGUgbmFtZT0iVGV4dEFwcGVhcmFuY2UuV2lkZ2V0LkFjdGlvbkJhci5UaXRsZSIKKyAgICAgICAgICAgcGFyZW50PSJAYW5kcm9pZDpzdHlsZS9UZXh0QXBwZWFyYW5jZS5NZWRpdW0uSW52ZXJzZSI+CisgICAgPC9zdHlsZT4KKworICAgIDxzdHlsZSBuYW1lPSJUZXh0QXBwZWFyYW5jZS5XaWRnZXQuQWN0aW9uQmFyLlN1YnRpdGxlIgorICAgICAgICAgICBwYXJlbnQ9IkBhbmRyb2lkOnN0eWxlL1RleHRBcHBlYXJhbmNlLlNtYWxsLkludmVyc2UiPgorICAgIDwvc3R5bGU+CisKKyAgICA8c3R5bGUgbmFtZT0iVGV4dEFwcGVhcmFuY2UuV2lkZ2V0LkFjdGlvbk1vZGUuVGl0bGUiCisgICAgICAgICAgIHBhcmVudD0iQGFuZHJvaWQ6c3R5bGUvVGV4dEFwcGVhcmFuY2UuTWVkaXVtLkludmVyc2UiPgorICAgIDwvc3R5bGU+CisKKyAgICA8c3R5bGUgbmFtZT0iVGV4dEFwcGVhcmFuY2UuV2lkZ2V0LkFjdGlvbk1vZGUuU3VidGl0bGUiCisgICAgICAgICAgIHBhcmVudD0iQGFuZHJvaWQ6c3R5bGUvVGV4dEFwcGVhcmFuY2UuU21hbGwuSW52ZXJzZSI+CisgICAgPC9zdHlsZT4KKworICAgIDxzdHlsZSBuYW1lPSJXaWRnZXQuQWN0aW9uQnV0dG9uIj4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpiYWNrZ3JvdW5kIj5AbnVsbDwvaXRlbT4KKyAgICA8L3N0eWxlPgorCisgICAgPHN0eWxlIG5hbWU9IldpZGdldC5BY3Rpb25CdXR0b24uT3ZlcmZsb3ciPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnNyYyI+QGRyYXdhYmxlL2ljX21lbnVfbW9yZTwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpjb250ZW50RGVzY3JpcHRpb24iPkBzdHJpbmcvbW9yZV9pdGVtX2xhYmVsPC9pdGVtPgorICAgIDwvc3R5bGU+CisKKyAgICA8c3R5bGUgbmFtZT0iV2lkZ2V0LkFjdGlvbkJ1dHRvbi5DbG9zZU1vZGUiPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnNyYyI+P2FuZHJvaWQ6YXR0ci9hY3Rpb25Nb2RlQ2xvc2VEcmF3YWJsZTwvaXRlbT4KKyAgICA8L3N0eWxlPgorCisgICAgPHN0eWxlIG5hbWU9IldpZGdldC5BY3Rpb25CYXJWaWV3X1RhYlZpZXciPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmJhY2tncm91bmQiPkBkcmF3YWJsZS9taW5pdGFiX2x0PC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnBhZGRpbmdMZWZ0Ij40ZGlwPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnBhZGRpbmdSaWdodCI+NGRpcDwvaXRlbT4KKyAgICA8L3N0eWxlPgorCisgICAgPHN0eWxlIG5hbWU9IldpZGdldC5BY3Rpb25CYXJWaWV3X1RhYkJhciI+CisgICAgPC9zdHlsZT4KKworICAgIDxzdHlsZSBuYW1lPSJXaWRnZXQuQWN0aW9uQmFyVmlld19UYWJUZXh0Ij4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp0ZXh0QXBwZWFyYW5jZSI+QHN0eWxlL1RleHRBcHBlYXJhbmNlLldpZGdldC5UZXh0Vmlldy5Qb3B1cE1lbnU8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6dGV4dENvbG9yIj4/YW5kcm9pZDphdHRyL3RleHRDb2xvclByaW1hcnlJbnZlcnNlPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnRleHRTaXplIj4xOHNwPC9pdGVtPgorICAgIDwvc3R5bGU+CisKKyAgICA8c3R5bGUgbmFtZT0iV2lkZ2V0Lkxpc3RQb3B1cFdpbmRvdyI+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6ZHJvcERvd25TZWxlY3RvciI+QGFuZHJvaWQ6ZHJhd2FibGUvbGlzdF9zZWxlY3Rvcl9iYWNrZ3JvdW5kPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnBvcHVwQmFja2dyb3VuZCI+QGFuZHJvaWQ6ZHJhd2FibGUvc3Bpbm5lcl9kcm9wZG93bl9iYWNrZ3JvdW5kPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmRyb3BEb3duVmVydGljYWxPZmZzZXQiPi0xMGRpcDwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpkcm9wRG93bkhvcml6b250YWxPZmZzZXQiPjBkaXA8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6ZHJvcERvd25XaWR0aCI+d3JhcF9jb250ZW50PC9pdGVtPiAgICAgICAgCisgICAgPC9zdHlsZT4KKworICAgIDxzdHlsZSBuYW1lPSJXaWRnZXQuUG9wdXBNZW51IiBwYXJlbnQ9IldpZGdldC5MaXN0UG9wdXBXaW5kb3ciPgorICAgIDwvc3R5bGU+CisKKyAgICA8c3R5bGUgbmFtZT0iVGV4dEFwcGVhcmFuY2UuV2lkZ2V0LlBvcHVwTWVudSI+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6dGV4dENvbG9yIj5AYW5kcm9pZDpjb2xvci9wcmltYXJ5X3RleHRfbGlnaHQ8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6dGV4dENvbG9ySGludCI+QGFuZHJvaWQ6Y29sb3IvaGludF9mb3JlZ3JvdW5kX2xpZ2h0PC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnRleHRDb2xvckhpZ2hsaWdodCI+QGFuZHJvaWQ6Y29sb3IvaGlnaGxpZ2h0ZWRfdGV4dF9saWdodDwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp0ZXh0Q29sb3JMaW5rIj5AYW5kcm9pZDpjb2xvci9saW5rX3RleHRfbGlnaHQ8L2l0ZW0+CisgICAgPC9zdHlsZT4KKworICAgIDxzdHlsZSBuYW1lPSJUZXh0QXBwZWFyYW5jZS5XaWRnZXQuUG9wdXBNZW51LkxhcmdlIj4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp0ZXh0U2l6ZSI+MjJzcDwvaXRlbT4KKyAgICA8L3N0eWxlPgorCisgICAgPHN0eWxlIG5hbWU9IlRleHRBcHBlYXJhbmNlLldpZGdldC5Qb3B1cE1lbnUuU21hbGwiPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnRleHRTaXplIj4xNHNwPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnRleHRDb2xvciI+QGFuZHJvaWQ6Y29sb3Ivc2Vjb25kYXJ5X3RleHRfbGlnaHQ8L2l0ZW0+CisgICAgPC9zdHlsZT4KKwogPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvdmFsdWVzL3RoZW1lcy54bWwgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzL3RoZW1lcy54bWwKaW5kZXggMjMxMWJkZC4uYmE0Y2Y5YiAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL3ZhbHVlcy90aGVtZXMueG1sCisrKyBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMvdGhlbWVzLnhtbApAQCAtNTMsNiArNTMsMTAgQEAKICAgICAgICAgPGl0ZW0gbmFtZT0idGV4dENvbG9ySGludCI+QGFuZHJvaWQ6Y29sb3IvaGludF9mb3JlZ3JvdW5kX2Rhcms8L2l0ZW0+CiAgICAgICAgIDxpdGVtIG5hbWU9InRleHRDb2xvckhpbnRJbnZlcnNlIj5AYW5kcm9pZDpjb2xvci9oaW50X2ZvcmVncm91bmRfbGlnaHQ8L2l0ZW0+CiAgICAgICAgIDxpdGVtIG5hbWU9InRleHRDb2xvclNlYXJjaFVybCI+QGFuZHJvaWQ6Y29sb3Ivc2VhcmNoX3VybF90ZXh0PC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJ0ZXh0Q29sb3JIaWdobGlnaHQiPkBhbmRyb2lkOmNvbG9yL2hpZ2hsaWdodGVkX3RleHRfZGFyazwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0idGV4dENvbG9ySGlnaGxpZ2h0SW52ZXJzZSI+QGFuZHJvaWQ6Y29sb3IvaGlnaGxpZ2h0ZWRfdGV4dF9saWdodDwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0idGV4dENvbG9yTGluayI+QGFuZHJvaWQ6Y29sb3IvbGlua190ZXh0X2Rhcms8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9InRleHRDb2xvckxpbmtJbnZlcnNlIj5AYW5kcm9pZDpjb2xvci9saW5rX3RleHRfbGlnaHQ8L2l0ZW0+CiAKICAgICAgICAgPGl0ZW0gbmFtZT0idGV4dEFwcGVhcmFuY2VMYXJnZSI+QGFuZHJvaWQ6c3R5bGUvVGV4dEFwcGVhcmFuY2UuTGFyZ2U8L2l0ZW0+CiAgICAgICAgIDxpdGVtIG5hbWU9InRleHRBcHBlYXJhbmNlTWVkaXVtIj5AYW5kcm9pZDpzdHlsZS9UZXh0QXBwZWFyYW5jZS5NZWRpdW08L2l0ZW0+CkBAIC02NSwxMSArNjksMTcgQEAKICAgICAgICAgCiAgICAgICAgIDxpdGVtIG5hbWU9InRleHRBcHBlYXJhbmNlQnV0dG9uIj5AYW5kcm9pZDpzdHlsZS9UZXh0QXBwZWFyYW5jZS5XaWRnZXQuQnV0dG9uPC9pdGVtPgogICAgICAgICAKKyAgICAgICAgPGl0ZW0gbmFtZT0iZWRpdFRleHRDb2xvciI+P2FuZHJvaWQ6YXR0ci90ZXh0Q29sb3JQcmltYXJ5SW52ZXJzZTwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iZWRpdFRleHRCYWNrZ3JvdW5kIj5AYW5kcm9pZDpkcmF3YWJsZS9lZGl0X3RleHQ8L2l0ZW0+CisgICAgICAgIAogICAgICAgICA8aXRlbSBuYW1lPSJjYW5kaWRhdGVzVGV4dFN0eWxlU3BhbnMiPkBhbmRyb2lkOnN0cmluZy9jYW5kaWRhdGVzX3N0eWxlPC9pdGVtPgogICAgICAgICAKICAgICAgICAgPGl0ZW0gbmFtZT0idGV4dENoZWNrTWFyayI+QGFuZHJvaWQ6ZHJhd2FibGUvaW5kaWNhdG9yX2NoZWNrX21hcmtfZGFyazwvaXRlbT4KICAgICAgICAgPGl0ZW0gbmFtZT0idGV4dENoZWNrTWFya0ludmVyc2UiPkBhbmRyb2lkOmRyYXdhYmxlL2luZGljYXRvcl9jaGVja19tYXJrX2xpZ2h0PC9pdGVtPgogCisgICAgICAgIDxpdGVtIG5hbWU9InRleHRBcHBlYXJhbmNlTGFyZ2VQb3B1cE1lbnUiPkBhbmRyb2lkOnN0eWxlL1RleHRBcHBlYXJhbmNlLldpZGdldC5Qb3B1cE1lbnUuTGFyZ2U8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9InRleHRBcHBlYXJhbmNlU21hbGxQb3B1cE1lbnUiPkBhbmRyb2lkOnN0eWxlL1RleHRBcHBlYXJhbmNlLldpZGdldC5Qb3B1cE1lbnUuU21hbGw8L2l0ZW0+CisKICAgICAgICAgPCEtLSBCdXR0b24gc3R5bGVzIC0tPgogICAgICAgICA8aXRlbSBuYW1lPSJidXR0b25TdHlsZSI+QGFuZHJvaWQ6c3R5bGUvV2lkZ2V0LkJ1dHRvbjwvaXRlbT4KIApAQCAtODQsOSArOTQsMTMgQEAKICAgICAgICAgPGl0ZW0gbmFtZT0ic2VhcmNoUmVzdWx0TGlzdEl0ZW1IZWlnaHQiPjU4ZGlwPC9pdGVtPgogICAgICAgICA8aXRlbSBuYW1lPSJsaXN0RGl2aWRlciI+QGRyYXdhYmxlL2RpdmlkZXJfaG9yaXpvbnRhbF9kYXJrPC9pdGVtPgogICAgICAgICA8aXRlbSBuYW1lPSJsaXN0U2VwYXJhdG9yVGV4dFZpZXdTdHlsZSI+QGFuZHJvaWQ6c3R5bGUvV2lkZ2V0LlRleHRWaWV3Lkxpc3RTZXBhcmF0b3I8L2l0ZW0+ICAgCi0gICAgICAgIAotCQk8aXRlbSBuYW1lPSJsaXN0Q2hvaWNlSW5kaWNhdG9yU2luZ2xlIj5AYW5kcm9pZDpkcmF3YWJsZS9idG5fcmFkaW88L2l0ZW0+Ci0gICAgCTxpdGVtIG5hbWU9Imxpc3RDaG9pY2VJbmRpY2F0b3JNdWx0aXBsZSI+QGFuZHJvaWQ6ZHJhd2FibGUvYnRuX2NoZWNrPC9pdGVtPiAgICAKKworICAgICAgICA8aXRlbSBuYW1lPSJsaXN0Q2hvaWNlSW5kaWNhdG9yU2luZ2xlIj5AYW5kcm9pZDpkcmF3YWJsZS9idG5fcmFkaW88L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9Imxpc3RDaG9pY2VJbmRpY2F0b3JNdWx0aXBsZSI+QGFuZHJvaWQ6ZHJhd2FibGUvYnRuX2NoZWNrPC9pdGVtPgorCisgICAgICAgIDxpdGVtIG5hbWU9Imxpc3RDaG9pY2VCYWNrZ3JvdW5kSW5kaWNhdG9yIj5AYW5kcm9pZDpkcmF3YWJsZS9saXN0X3NlbGVjdGVkX2JhY2tncm91bmQ8L2l0ZW0+CisKKyAgICAgICAgPGl0ZW0gbmFtZT0iYWN0aXZhdGVkQmFja2dyb3VuZEluZGljYXRvciI+QGFuZHJvaWQ6ZHJhd2FibGUvYWN0aXZhdGVkX2JhY2tncm91bmQ8L2l0ZW0+CiAKICAgICAgICAgPGl0ZW0gbmFtZT0iZXhwYW5kYWJsZUxpc3RQcmVmZXJyZWRJdGVtUGFkZGluZ0xlZnQiPjQwZGlwPC9pdGVtPgogICAgICAgICA8aXRlbSBuYW1lPSJleHBhbmRhYmxlTGlzdFByZWZlcnJlZENoaWxkUGFkZGluZ0xlZnQiPgpAQCAtMTE1LDYgKzEyOSw4IEBACiAgICAgICAgIDxpdGVtIG5hbWU9IndpbmRvd1RpdGxlQmFja2dyb3VuZFN0eWxlIj5AYW5kcm9pZDpzdHlsZS9XaW5kb3dUaXRsZUJhY2tncm91bmQ8L2l0ZW0+CiAgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6d2luZG93QW5pbWF0aW9uU3R5bGUiPkBhbmRyb2lkOnN0eWxlL0FuaW1hdGlvbi5BY3Rpdml0eTwvaXRlbT4KICAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp3aW5kb3dTb2Z0SW5wdXRNb2RlIj5zdGF0ZVVuc3BlY2lmaWVkfGFkanVzdFVuc3BlY2lmaWVkPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJ3aW5kb3dBY3Rpb25CYXIiPmZhbHNlPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJ3aW5kb3dBY3Rpb25Nb2RlT3ZlcmxheSI+ZmFsc2U8L2l0ZW0+CiAKICAgICAgICAgPCEtLSBEaWFsb2cgYXR0cmlidXRlcyAtLT4KICAgICAgICAgPGl0ZW0gbmFtZT0iYWxlcnREaWFsb2dTdHlsZSI+QGFuZHJvaWQ6c3R5bGUvQWxlcnREaWFsb2c8L2l0ZW0+CkBAIC0xNTgsOCArMTc0LDggQEAKICAgICAgICAgPGl0ZW0gbmFtZT0icHJvZ3Jlc3NCYXJTdHlsZVNtYWxsVGl0bGUiPkBhbmRyb2lkOnN0eWxlL1dpZGdldC5Qcm9ncmVzc0Jhci5TbWFsbC5UaXRsZTwvaXRlbT4KICAgICAgICAgPGl0ZW0gbmFtZT0icHJvZ3Jlc3NCYXJTdHlsZUxhcmdlIj5AYW5kcm9pZDpzdHlsZS9XaWRnZXQuUHJvZ3Jlc3NCYXIuTGFyZ2U8L2l0ZW0+CiAgICAgICAgIDxpdGVtIG5hbWU9InByb2dyZXNzQmFyU3R5bGVJbnZlcnNlIj5AYW5kcm9pZDpzdHlsZS9XaWRnZXQuUHJvZ3Jlc3NCYXIuSW52ZXJzZTwvaXRlbT4KLQkJPGl0ZW0gbmFtZT0icHJvZ3Jlc3NCYXJTdHlsZVNtYWxsSW52ZXJzZSI+QGFuZHJvaWQ6c3R5bGUvV2lkZ2V0LlByb2dyZXNzQmFyLlNtYWxsLkludmVyc2U8L2l0ZW0+Ci0JICAgIDxpdGVtIG5hbWU9InByb2dyZXNzQmFyU3R5bGVMYXJnZUludmVyc2UiPkBhbmRyb2lkOnN0eWxlL1dpZGdldC5Qcm9ncmVzc0Jhci5MYXJnZS5JbnZlcnNlPC9pdGVtPiAKKyAgICAgICAgPGl0ZW0gbmFtZT0icHJvZ3Jlc3NCYXJTdHlsZVNtYWxsSW52ZXJzZSI+QGFuZHJvaWQ6c3R5bGUvV2lkZ2V0LlByb2dyZXNzQmFyLlNtYWxsLkludmVyc2U8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9InByb2dyZXNzQmFyU3R5bGVMYXJnZUludmVyc2UiPkBhbmRyb2lkOnN0eWxlL1dpZGdldC5Qcm9ncmVzc0Jhci5MYXJnZS5JbnZlcnNlPC9pdGVtPgogICAgICAgICA8aXRlbSBuYW1lPSJzZWVrQmFyU3R5bGUiPkBhbmRyb2lkOnN0eWxlL1dpZGdldC5TZWVrQmFyPC9pdGVtPgogICAgICAgICA8aXRlbSBuYW1lPSJyYXRpbmdCYXJTdHlsZSI+QGFuZHJvaWQ6c3R5bGUvV2lkZ2V0LlJhdGluZ0JhcjwvaXRlbT4KICAgICAgICAgPGl0ZW0gbmFtZT0icmF0aW5nQmFyU3R5bGVJbmRpY2F0b3IiPkBhbmRyb2lkOnN0eWxlL1dpZGdldC5SYXRpbmdCYXIuSW5kaWNhdG9yPC9pdGVtPgpAQCAtMTY4LDYgKzE4NCw3IEBACiAgICAgICAgIDxpdGVtIG5hbWU9InNjcm9sbFZpZXdTdHlsZSI+QGFuZHJvaWQ6c3R5bGUvV2lkZ2V0LlNjcm9sbFZpZXc8L2l0ZW0+CiAgICAgICAgIDxpdGVtIG5hbWU9Imhvcml6b250YWxTY3JvbGxWaWV3U3R5bGUiPkBhbmRyb2lkOnN0eWxlL1dpZGdldC5Ib3Jpem9udGFsU2Nyb2xsVmlldzwvaXRlbT4KICAgICAgICAgPGl0ZW0gbmFtZT0ic3Bpbm5lclN0eWxlIj5AYW5kcm9pZDpzdHlsZS9XaWRnZXQuU3Bpbm5lcjwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iZHJvcERvd25TcGlubmVyU3R5bGUiPkBhbmRyb2lkOnN0eWxlL1dpZGdldC5TcGlubmVyLkRyb3BEb3duPC9pdGVtPgogICAgICAgICA8aXRlbSBuYW1lPSJzdGFyU3R5bGUiPkBhbmRyb2lkOnN0eWxlL1dpZGdldC5Db21wb3VuZEJ1dHRvbi5TdGFyPC9pdGVtPgogICAgICAgICA8aXRlbSBuYW1lPSJ0YWJXaWRnZXRTdHlsZSI+QGFuZHJvaWQ6c3R5bGUvV2lkZ2V0LlRhYldpZGdldDwvaXRlbT4KICAgICAgICAgPGl0ZW0gbmFtZT0idGV4dFZpZXdTdHlsZSI+QGFuZHJvaWQ6c3R5bGUvV2lkZ2V0LlRleHRWaWV3PC9pdGVtPgpAQCAtMTg0LDYgKzIwMSw4IEBACiAgICAgICAgIDxpdGVtIG5hbWU9InF1aWNrQ29udGFjdEJhZGdlU3R5bGVTbWFsbFdpbmRvd1NtYWxsIj5AYW5kcm9pZDpzdHlsZS9XaWRnZXQuUXVpY2tDb250YWN0QmFkZ2VTbWFsbC5XaW5kb3dTbWFsbDwvaXRlbT4KICAgICAgICAgPGl0ZW0gbmFtZT0icXVpY2tDb250YWN0QmFkZ2VTdHlsZVNtYWxsV2luZG93TWVkaXVtIj5AYW5kcm9pZDpzdHlsZS9XaWRnZXQuUXVpY2tDb250YWN0QmFkZ2VTbWFsbC5XaW5kb3dNZWRpdW08L2l0ZW0+CiAgICAgICAgIDxpdGVtIG5hbWU9InF1aWNrQ29udGFjdEJhZGdlU3R5bGVTbWFsbFdpbmRvd0xhcmdlIj5AYW5kcm9pZDpzdHlsZS9XaWRnZXQuUXVpY2tDb250YWN0QmFkZ2VTbWFsbC5XaW5kb3dMYXJnZTwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0ibGlzdFBvcHVwV2luZG93U3R5bGUiPkBhbmRyb2lkOnN0eWxlL1dpZGdldC5MaXN0UG9wdXBXaW5kb3c8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9InBvcHVwTWVudVN0eWxlIj5AYW5kcm9pZDpzdHlsZS9XaWRnZXQuUG9wdXBNZW51PC9pdGVtPgogICAgICAgICAKICAgICAgICAgPCEtLSBQcmVmZXJlbmNlIHN0eWxlcyAtLT4KICAgICAgICAgPGl0ZW0gbmFtZT0icHJlZmVyZW5jZVNjcmVlblN0eWxlIj5AYW5kcm9pZDpzdHlsZS9QcmVmZXJlbmNlLlByZWZlcmVuY2VTY3JlZW48L2l0ZW0+CkBAIC0xOTksNiArMjE4LDIxIEBACiAKICAgICAgICAgPCEtLSBTZWFyY2ggd2lkZ2V0IHN0eWxlcyAtLT4KICAgICAgICAgPGl0ZW0gbmFtZT0ic2VhcmNoV2lkZ2V0Q29ycHVzSXRlbUJhY2tncm91bmQiPkBhbmRyb2lkOmNvbG9yL3NlYXJjaF93aWRnZXRfY29ycHVzX2l0ZW1fYmFja2dyb3VuZDwvaXRlbT4KKworICAgICAgICA8IS0tIEFjdGlvbiBiYXIgc3R5bGVzIC0tPgorICAgICAgICA8aXRlbSBuYW1lPSJhY3Rpb25Ecm9wRG93blN0eWxlIj5AYW5kcm9pZDpzdHlsZS9XaWRnZXQuU3Bpbm5lci5Ecm9wRG93bjwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYWN0aW9uQnV0dG9uU3R5bGUiPkBhbmRyb2lkOnN0eWxlL1dpZGdldC5BY3Rpb25CdXR0b248L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFjdGlvbk92ZXJmbG93QnV0dG9uU3R5bGUiPkBhbmRyb2lkOnN0eWxlL1dpZGdldC5BY3Rpb25CdXR0b24uT3ZlcmZsb3c8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFjdGlvbkJ1dHRvblBhZGRpbmciPjEyZGlwPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhY3Rpb25Nb2RlQmFja2dyb3VuZCI+QGFuZHJvaWQ6ZHJhd2FibGUvYWN0aW9uX2Jhcl9jb250ZXh0X2JhY2tncm91bmQ8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFjdGlvbk1vZGVDbG9zZURyYXdhYmxlIj5AYW5kcm9pZDpkcmF3YWJsZS9pY19tZW51X2Nsb3NlX2NsZWFyX2NhbmNlbDwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYWN0aW9uQmFyVGFiU3R5bGUiPkBzdHlsZS9XaWRnZXQuQWN0aW9uQmFyVmlld19UYWJWaWV3PC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhY3Rpb25CYXJUYWJCYXJTdHlsZSI+QHN0eWxlL1dpZGdldC5BY3Rpb25CYXJWaWV3X1RhYkJhcjwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYWN0aW9uQmFyVGFiVGV4dFN0eWxlIj5Ac3R5bGUvV2lkZ2V0LkFjdGlvbkJhclZpZXdfVGFiVGV4dDwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYWN0aW9uTW9kZVN0eWxlIj5Ac3R5bGUvV2lkZ2V0LkFjdGlvbk1vZGU8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFjdGlvbk1vZGVDbG9zZUJ1dHRvblN0eWxlIj5Ac3R5bGUvV2lkZ2V0LkFjdGlvbkJ1dHRvbi5DbG9zZU1vZGU8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFjdGlvbkJhclN0eWxlIj5AYW5kcm9pZDpzdHlsZS9XaWRnZXQuQWN0aW9uQmFyPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhY3Rpb25CYXJTaXplIj41MGRpcDwvaXRlbT4KICAgICA8L3N0eWxlPgogICAgIAogICAgIDwhLS0gVmFyaWFudCBvZiB0aGUgZGVmYXVsdCAoZGFyaykgdGhlbWUgd2l0aCBubyB0aXRsZSBiYXIgLS0+CkBAIC0yMjIsNyArMjU2LDcgQEAKICAgICAgICAgPGl0ZW0gbmFtZT0iY29sb3JCYWNrZ3JvdW5kIj5AYW5kcm9pZDpjb2xvci9iYWNrZ3JvdW5kX2xpZ2h0PC9pdGVtPgogICAgICAgICA8aXRlbSBuYW1lPSJjb2xvckZvcmVncm91bmQiPkBjb2xvci9icmlnaHRfZm9yZWdyb3VuZF9saWdodDwvaXRlbT4KICAgICAgICAgPGl0ZW0gbmFtZT0iY29sb3JGb3JlZ3JvdW5kSW52ZXJzZSI+QGFuZHJvaWQ6Y29sb3IvYnJpZ2h0X2ZvcmVncm91bmRfbGlnaHRfaW52ZXJzZTwvaXRlbT4KLQorICAgICAgICAKICAgICAgICAgPGl0ZW0gbmFtZT0idGV4dENvbG9yUHJpbWFyeSI+QGFuZHJvaWQ6Y29sb3IvcHJpbWFyeV90ZXh0X2xpZ2h0PC9pdGVtPgogICAgICAgICA8aXRlbSBuYW1lPSJ0ZXh0Q29sb3JTZWNvbmRhcnkiPkBhbmRyb2lkOmNvbG9yL3NlY29uZGFyeV90ZXh0X2xpZ2h0PC9pdGVtPgogICAgICAgICA8aXRlbSBuYW1lPSJ0ZXh0Q29sb3JUZXJ0aWFyeSI+QGFuZHJvaWQ6Y29sb3IvdGVydGlhcnlfdGV4dF9saWdodDwvaXRlbT4KQEAgLTIzNiw4ICsyNzAsMTcgQEAKICAgICAgICAgPGl0ZW0gbmFtZT0idGV4dENvbG9yUHJpbWFyeUludmVyc2VOb0Rpc2FibGUiPkBhbmRyb2lkOmNvbG9yL3ByaW1hcnlfdGV4dF9kYXJrX25vZGlzYWJsZTwvaXRlbT4KICAgICAgICAgPGl0ZW0gbmFtZT0idGV4dENvbG9yU2Vjb25kYXJ5SW52ZXJzZU5vRGlzYWJsZSI+QGFuZHJvaWQ6Y29sb3Ivc2Vjb25kYXJ5X3RleHRfZGFya19ub2Rpc2FibGU8L2l0ZW0+CiAgICAgICAgIDxpdGVtIG5hbWU9InRleHRDb2xvckhpbnQiPkBhbmRyb2lkOmNvbG9yL2hpbnRfZm9yZWdyb3VuZF9saWdodDwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0idGV4dENvbG9ySGludEludmVyc2UiPkBhbmRyb2lkOmNvbG9yL2hpbnRfZm9yZWdyb3VuZF9kYXJrPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJ0ZXh0Q29sb3JIaW50SW52ZXJzZSI+QGFuZHJvaWQ6Y29sb3IvaGludF9mb3JlZ3JvdW5kX2Rhcms8L2l0ZW0+ICAgICAgICAKKyAgICAgICAgPGl0ZW0gbmFtZT0idGV4dENvbG9ySGlnaGxpZ2h0Ij5AYW5kcm9pZDpjb2xvci9oaWdobGlnaHRlZF90ZXh0X2xpZ2h0PC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJ0ZXh0Q29sb3JIaWdobGlnaHRJbnZlcnNlIj5AYW5kcm9pZDpjb2xvci9oaWdobGlnaHRlZF90ZXh0X2Rhcms8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9InRleHRDb2xvckxpbmsiPkBhbmRyb2lkOmNvbG9yL2xpbmtfdGV4dF9saWdodDwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0idGV4dENvbG9yTGlua0ludmVyc2UiPkBhbmRyb2lkOmNvbG9yL2xpbmtfdGV4dF9kYXJrPC9pdGVtPgogICAgICAgICAKKyAgICAgICAgPGl0ZW0gbmFtZT0iZWRpdFRleHRDb2xvciI+P2FuZHJvaWQ6YXR0ci90ZXh0Q29sb3JQcmltYXJ5PC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJsaXN0Q2hvaWNlQmFja2dyb3VuZEluZGljYXRvciI+QGFuZHJvaWQ6ZHJhd2FibGUvbGlzdF9zZWxlY3RlZF9iYWNrZ3JvdW5kX2xpZ2h0PC9pdGVtPgorCisgICAgICAgIDxpdGVtIG5hbWU9ImFjdGl2YXRlZEJhY2tncm91bmRJbmRpY2F0b3IiPkBhbmRyb2lkOmRyYXdhYmxlL2FjdGl2YXRlZF9iYWNrZ3JvdW5kX2xpZ2h0PC9pdGVtPgorCiAgICAgICAgIDxpdGVtIG5hbWU9InBvcHVwV2luZG93U3R5bGUiPkBhbmRyb2lkOnN0eWxlL1dpZGdldC5Qb3B1cFdpbmRvdzwvaXRlbT4KICAgICAgICAgCiAgICAgICAgIDxpdGVtIG5hbWU9InRleHRDaGVja01hcmsiPkBhbmRyb2lkOmRyYXdhYmxlL2luZGljYXRvcl9jaGVja19tYXJrX2xpZ2h0PC9pdGVtPgpAQCAtMjQ4LDEzICsyOTEsMTMgQEAKICAgICAgICAgPGl0ZW0gbmFtZT0ibGlzdFZpZXdTdHlsZSI+QGFuZHJvaWQ6c3R5bGUvV2lkZ2V0Lkxpc3RWaWV3LldoaXRlPC9pdGVtPgogICAgICAgICA8aXRlbSBuYW1lPSJsaXN0RGl2aWRlciI+QGRyYXdhYmxlL2RpdmlkZXJfaG9yaXpvbnRhbF9icmlnaHQ8L2l0ZW0+CiAgICAgICAgIDxpdGVtIG5hbWU9Imxpc3RTZXBhcmF0b3JUZXh0Vmlld1N0eWxlIj5AYW5kcm9pZDpzdHlsZS9XaWRnZXQuVGV4dFZpZXcuTGlzdFNlcGFyYXRvci5XaGl0ZTwvaXRlbT4KLSAgICAgICAgCisKICAgICAgICAgPGl0ZW0gbmFtZT0icHJvZ3Jlc3NCYXJTdHlsZSI+QGFuZHJvaWQ6c3R5bGUvV2lkZ2V0LlByb2dyZXNzQmFyLkludmVyc2U8L2l0ZW0+Ci0JCTxpdGVtIG5hbWU9InByb2dyZXNzQmFyU3R5bGVTbWFsbCI+QGFuZHJvaWQ6c3R5bGUvV2lkZ2V0LlByb2dyZXNzQmFyLlNtYWxsLkludmVyc2U8L2l0ZW0+Ci0JCTxpdGVtIG5hbWU9InByb2dyZXNzQmFyU3R5bGVMYXJnZSI+QGFuZHJvaWQ6c3R5bGUvV2lkZ2V0LlByb2dyZXNzQmFyLkxhcmdlLkludmVyc2U8L2l0ZW0+Ci0JCTxpdGVtIG5hbWU9InByb2dyZXNzQmFyU3R5bGVJbnZlcnNlIj5AYW5kcm9pZDpzdHlsZS9XaWRnZXQuUHJvZ3Jlc3NCYXI8L2l0ZW0+Ci0JCTxpdGVtIG5hbWU9InByb2dyZXNzQmFyU3R5bGVTbWFsbEludmVyc2UiPkBhbmRyb2lkOnN0eWxlL1dpZGdldC5Qcm9ncmVzc0Jhci5TbWFsbDwvaXRlbT4KLQkJPGl0ZW0gbmFtZT0icHJvZ3Jlc3NCYXJTdHlsZUxhcmdlSW52ZXJzZSI+QGFuZHJvaWQ6c3R5bGUvV2lkZ2V0LlByb2dyZXNzQmFyLkxhcmdlPC9pdGVtPiAKKyAgICAgICAgPGl0ZW0gbmFtZT0icHJvZ3Jlc3NCYXJTdHlsZVNtYWxsIj5AYW5kcm9pZDpzdHlsZS9XaWRnZXQuUHJvZ3Jlc3NCYXIuU21hbGwuSW52ZXJzZTwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0icHJvZ3Jlc3NCYXJTdHlsZUxhcmdlIj5AYW5kcm9pZDpzdHlsZS9XaWRnZXQuUHJvZ3Jlc3NCYXIuTGFyZ2UuSW52ZXJzZTwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0icHJvZ3Jlc3NCYXJTdHlsZUludmVyc2UiPkBhbmRyb2lkOnN0eWxlL1dpZGdldC5Qcm9ncmVzc0JhcjwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0icHJvZ3Jlc3NCYXJTdHlsZVNtYWxsSW52ZXJzZSI+QGFuZHJvaWQ6c3R5bGUvV2lkZ2V0LlByb2dyZXNzQmFyLlNtYWxsPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJwcm9ncmVzc0JhclN0eWxlTGFyZ2VJbnZlcnNlIj5AYW5kcm9pZDpzdHlsZS9XaWRnZXQuUHJvZ3Jlc3NCYXIuTGFyZ2U8L2l0ZW0+CiAgICAgPC9zdHlsZT4KICAgICAKICAgICA8IS0tIFZhcmlhbnQgb2YgdGhlIGxpZ2h0IHRoZW1lIHdpdGggbm8gdGl0bGUgYmFyIC0tPgpAQCAtNDE3LDEzICs0NjAsMjUgQEAKICAgICAgICAgPGl0ZW0gbmFtZT0idGV4dEFwcGVhcmFuY2VTbWFsbEludmVyc2UiPkBhbmRyb2lkOnN0eWxlL1RleHRBcHBlYXJhbmNlLlNtYWxsLkludmVyc2U8L2l0ZW0+CiAgICAgPC9zdHlsZT4KIAorICAgIDwhLS0gVmFyaWF0aW9uIG9mIFRoZW1lLkRpYWxvZyB0aGF0IGRvZXMgbm90IGluY2x1ZGUgYSBmcmFtZSAob3IgYmFja2dyb3VuZCkuCisgICAgICAgICBUaGUgdmlldyBoaWVyYXJjaHkgb2YgdGhlIGRpYWxvZyBpcyByZXNwb25zaWJsZSBmb3IgZHJhd2luZyBhbGwgb2YKKyAgICAgICAgIGl0cyBwaXhlbHMuIC0tPgorICAgIDxzdHlsZSBuYW1lPSJUaGVtZS5EaWFsb2cuTm9GcmFtZSI+CisgICAgICAgIDxpdGVtIG5hbWU9IndpbmRvd0JhY2tncm91bmQiPkBhbmRyb2lkOmNvbG9yL3RyYW5zcGFyZW50PC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOndpbmRvd0ZyYW1lIj5AbnVsbDwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0id2luZG93Q29udGVudE92ZXJsYXkiPkBudWxsPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOndpbmRvd0FuaW1hdGlvblN0eWxlIj5AbnVsbDwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpiYWNrZ3JvdW5kRGltRW5hYmxlZCI+ZmFsc2U8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6d2luZG93SXNUcmFuc2x1Y2VudCI+dHJ1ZTwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp3aW5kb3dOb1RpdGxlIj50cnVlPC9pdGVtPgorICAgIDwvc3R5bGU+CisKICAgICA8IS0tIERlZmF1bHQgdGhlbWUgZm9yIGFsZXJ0IGRpYWxvZyB3aW5kb3dzLCB3aGljaCBpcyB1c2VkIGJ5IHRoZQogICAgICAgICAge0BsaW5rIGFuZHJvaWQuYXBwLkFsZXJ0RGlhbG9nfSBjbGFzcy4gIFRoaXMgaXMgYmFzaWNhbGx5IGEgZGlhbG9nCiAgICAgICAgICBidXQgc2V0cyB0aGUgYmFja2dyb3VuZCB0byBlbXB0eSBzbyBpdCBjYW4gZG8gdHdvLXRvbmUgYmFja2dyb3VuZHMuIC0tPgogICAgIDxzdHlsZSBuYW1lPSJUaGVtZS5EaWFsb2cuQWxlcnQiPgogICAgICAgICA8aXRlbSBuYW1lPSJ3aW5kb3dCYWNrZ3JvdW5kIj5AYW5kcm9pZDpjb2xvci90cmFuc3BhcmVudDwvaXRlbT4KICAgICAgICAgPGl0ZW0gbmFtZT0id2luZG93VGl0bGVTdHlsZSI+QGFuZHJvaWQ6c3R5bGUvRGlhbG9nV2luZG93VGl0bGU8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9IndpbmRvd0lzRmxvYXRpbmciPnRydWU8L2l0ZW0+CiAgICAgICAgIDxpdGVtIG5hbWU9IndpbmRvd0NvbnRlbnRPdmVybGF5Ij5AbnVsbDwvaXRlbT4KICAgICA8L3N0eWxlPgogICAgIApAQCAtNTI5LDUgKzU4NCw2OSBAQAogICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOndpbmRvd0FuaW1hdGlvblN0eWxlIj5AYW5kcm9pZDpzdHlsZS9BbmltYXRpb24uVG9hc3Q8L2l0ZW0+CiAgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6YmFja2dyb3VuZERpbUVuYWJsZWQiPmZhbHNlPC9pdGVtPgogICAgIDwvc3R5bGU+CisKKyAgICA8IS0tIERlZmF1bHQgdGhlbWUgd2l0aCBhbiBBY3Rpb24gQmFyLiAtLT4KKyAgICA8c3R5bGUgbmFtZT0iVGhlbWUuV2l0aEFjdGlvbkJhciI+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6d2luZG93QWN0aW9uQmFyIj50cnVlPC9pdGVtPgorICAgIDwvc3R5bGU+CisKKyAgICA8IS0tIE5vIHRpdGxlIGJhciwgYnV0IEFjdGlvbiBNb2RlIGJhcnMgd2lsbCBvdmVybGF5IGFwcGxpY2F0aW9uIGNvbnRlbnQKKyAgICAgICAgIGluc3RlYWQgb2YgcHVzaGluZyBpdCBkb3duIHRvIG1ha2Ugcm9vbS4gLS0+CisgICAgPHN0eWxlIG5hbWU9IlRoZW1lLk5vVGl0bGVCYXIuT3ZlcmxheUFjdGlvbk1vZGVzIj4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp3aW5kb3dBY3Rpb25Nb2RlT3ZlcmxheSI+dHJ1ZTwvaXRlbT4KKyAgICA8L3N0eWxlPgogICAgIAorICAgIDwhLS0gTmV3IEhvbmV5Y29tYiBob2xvZ3JhcGhpYyB0aGVtZS4gRGFyayB2ZXJzaW9uLiAgVGhlIHdpZGdldHMgaW4gdGhlCisgICAgICAgICBob2xvZ3JhcGhpYyB0aGVtZSBhcmUgdHJhbnNsdWNlbnQgb24gdGhlaXIgYnJhY2tncm91bmQsIHNvIGFwcGxpY2F0aW9ucworICAgICAgICAgbXVzdCBlbnN1cmUgdGhhdCBhbnkgYmFja2dyb3VuZCB0aGV5IHVzZSB3aXRoIHRoaXMgdGhlbWUgaXMgaXRzZWxmCisgICAgICAgICBkYXJrOyBvdGhlcndpc2UsIGl0IHdpbGwgYmUgZGlmZmljdWx0IHRvIHNlZSB0aGUgd2lkZ2V0cy4gIFRoZSBuZXcKKyAgICAgICAgIFVJIHN0eWxlIGFsc28gaW5jbHVkZXMgYSBmdWxsIGFjdGlvbiBiYXIgYnkgZGVmYXVsdC4gLS0+CisgICAgPHN0eWxlIG5hbWU9IlRoZW1lLkhvbG8iPgorICAgICAgICA8aXRlbSBuYW1lPSJlZGl0VGV4dEJhY2tncm91bmQiPkBhbmRyb2lkOmRyYXdhYmxlL2VkaXRfdGV4dF9ob2xvX2Rhcms8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImVkaXRUZXh0Q29sb3IiPj9hbmRyb2lkOmF0dHIvdGV4dENvbG9yUHJpbWFyeTwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp3aW5kb3dBY3Rpb25CYXIiPnRydWU8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6c3Bpbm5lclN0eWxlIj4/YW5kcm9pZDphdHRyL2Ryb3BEb3duU3Bpbm5lclN0eWxlPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJsaXN0Q2hvaWNlSW5kaWNhdG9yU2luZ2xlIj5AYW5kcm9pZDpkcmF3YWJsZS9idG5fcmFkaW9faG9sb19kYXJrPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJsaXN0Q2hvaWNlSW5kaWNhdG9yTXVsdGlwbGUiPkBhbmRyb2lkOmRyYXdhYmxlL2J0bl9jaGVja19ob2xvX2Rhcms8L2l0ZW0+CisgICAgPC9zdHlsZT4KKworICAgIDwhLS0gTmV3IEhvbmV5Y29tYiBob2xvZ3JhcGhpYyB0aGVtZS4gTGlnaHQgdmVyc2lvbi4gIFRoZSB3aWRnZXRzIGluIHRoZQorICAgICAgICAgaG9sb2dyYXBoaWMgdGhlbWUgYXJlIHRyYW5zbHVjZW50IG9uIHRoZWlyIGJyYWNrZ3JvdW5kLCBzbyBhcHBsaWNhdGlvbnMKKyAgICAgICAgIG11c3QgZW5zdXJlIHRoYXQgYW55IGJhY2tncm91bmQgdGhleSB1c2Ugd2l0aCB0aGlzIHRoZW1lIGlzIGl0c2VsZgorICAgICAgICAgbGlnaHQ7IG90aGVyd2lzZSwgaXQgd2lsbCBiZSBkaWZmaWN1bHQgdG8gc2VlIHRoZSB3aWRnZXRzLiAgVGhlIG5ldworICAgICAgICAgVUkgc3R5bGUgYWxzbyBpbmNsdWRlcyBhIGZ1bGwgYWN0aW9uIGJhciBieSBkZWZhdWx0LiAtLT4KKyAgICA8c3R5bGUgbmFtZT0iVGhlbWUuTGlnaHQuSG9sbyI+CisgICAgICAgIDxpdGVtIG5hbWU9ImVkaXRUZXh0QmFja2dyb3VuZCI+QGFuZHJvaWQ6ZHJhd2FibGUvZWRpdF90ZXh0X2hvbG9fbGlnaHQ8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6d2luZG93QWN0aW9uQmFyIj50cnVlPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnNwaW5uZXJTdHlsZSI+P2FuZHJvaWQ6YXR0ci9kcm9wRG93blNwaW5uZXJTdHlsZTwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0ibGlzdENob2ljZUluZGljYXRvclNpbmdsZSI+QGFuZHJvaWQ6ZHJhd2FibGUvYnRuX3JhZGlvX2hvbG9fbGlnaHQ8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9Imxpc3RDaG9pY2VJbmRpY2F0b3JNdWx0aXBsZSI+QGFuZHJvaWQ6ZHJhd2FibGUvYnRuX2NoZWNrX2hvbG9fbGlnaHQ8L2l0ZW0+CisgICAgPC9zdHlsZT4KKyAgICAgICAgCisgICAgPCEtLSBWYXJpYW50IG9mIHRoZSBob2xvZ3JhcGhpYyAoZGFyaykgdGhlbWUgd2l0aCBubyBhY3Rpb24gYmFyLiAtLT4KKyAgICA8c3R5bGUgbmFtZT0iVGhlbWUuSG9sby5Ob0FjdGlvbkJhciI+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6d2luZG93QWN0aW9uQmFyIj5mYWxzZTwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp3aW5kb3dOb1RpdGxlIj50cnVlPC9pdGVtPgorICAgIDwvc3R5bGU+CisgICAgCisgICAgPCEtLSBWYXJpYW50IG9mIHRoZSBob2xvZ3JhcGhpYyAoZGFyaykgdGhlbWUgdGhhdCBoYXMgbm8gdGl0bGUgYmFyIGFuZCBmaWxscworICAgICAgICAgdGhlIGVudGlyZSBzY3JlZW4gLS0+CisgICAgPHN0eWxlIG5hbWU9IlRoZW1lLkhvbG8uTm9BY3Rpb25CYXIuRnVsbHNjcmVlbiI+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6d2luZG93RnVsbHNjcmVlbiI+dHJ1ZTwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp3aW5kb3dDb250ZW50T3ZlcmxheSI+QG51bGw8L2l0ZW0+CisgICAgPC9zdHlsZT4KKworICAgIDwhLS0gVmFyaWFudCBvZiB0aGUgaG9sb2dyYXBoaWMgbGlnaHQgdGhlbWUgd2l0aCBubyBhY3Rpb24gYmFyIC0tPgorICAgIDxzdHlsZSBuYW1lPSJUaGVtZS5MaWdodC5Ib2xvLk5vQWN0aW9uQmFyIj4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp3aW5kb3dBY3Rpb25CYXIiPmZhbHNlPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOndpbmRvd05vVGl0bGUiPnRydWU8L2l0ZW0+CisgICAgPC9zdHlsZT4KKworICAgIDwhLS0gVmFyaWFudCBvZiB0aGUgaG9sb2dyYXBoaWMgbGlnaHQgdGhlbWUgdGhhdCBoYXMgbm8gdGl0bGUgYmFyIGFuZCBmaWxscworICAgICAgICAgdGhlIGVudGlyZSBzY3JlZW4gLS0+CisgICAgPHN0eWxlIG5hbWU9IlRoZW1lLkxpZ2h0LkhvbG8uTm9BY3Rpb25CYXIuRnVsbHNjcmVlbiI+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6d2luZG93RnVsbHNjcmVlbiI+dHJ1ZTwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp3aW5kb3dDb250ZW50T3ZlcmxheSI+QG51bGw8L2l0ZW0+CisgICAgPC9zdHlsZT4KKyAKIDwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL3htbC1sYW5kL3Bhc3N3b3JkX2tiZF9xd2VydHkueG1sIGIvY29yZS9yZXMvcmVzL3htbC1sYW5kL3Bhc3N3b3JkX2tiZF9xd2VydHkueG1sCmluZGV4IDcwMGM1MjcuLmZkOGJkNDkgMTAwNzU1Ci0tLSBhL2NvcmUvcmVzL3Jlcy94bWwtbGFuZC9wYXNzd29yZF9rYmRfcXdlcnR5LnhtbAorKysgYi9jb3JlL3Jlcy9yZXMveG1sLWxhbmQvcGFzc3dvcmRfa2JkX3F3ZXJ0eS54bWwKQEAgLTIyLDcgKzIyLDcgQEAKICAgICBhbmRyb2lkOmtleVdpZHRoPSIxMCVwIgogICAgIGFuZHJvaWQ6aG9yaXpvbnRhbEdhcD0iMHB4IgogICAgIGFuZHJvaWQ6dmVydGljYWxHYXA9IjBweCIKLSAgICBhbmRyb2lkOmtleUhlaWdodD0iQGRpbWVuL3Bhc3N3b3JkX2tleWJvYXJkX2tleV9oZWlnaHQiCisgICAgYW5kcm9pZDprZXlIZWlnaHQ9IkBkaW1lbi9wYXNzd29yZF9rZXlib2FyZF9rZXlfaGVpZ2h0X2FscGhhIgogICAgID4KIAogICAgIDxSb3c+CmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMveG1sLWxhbmQvcGFzc3dvcmRfa2JkX3F3ZXJ0eV9zaGlmdGVkLnhtbCBiL2NvcmUvcmVzL3Jlcy94bWwtbGFuZC9wYXNzd29yZF9rYmRfcXdlcnR5X3NoaWZ0ZWQueG1sCmluZGV4IDFlMzdiNmMuLjlmZjZmZDcgMTAwNzU1Ci0tLSBhL2NvcmUvcmVzL3Jlcy94bWwtbGFuZC9wYXNzd29yZF9rYmRfcXdlcnR5X3NoaWZ0ZWQueG1sCisrKyBiL2NvcmUvcmVzL3Jlcy94bWwtbGFuZC9wYXNzd29yZF9rYmRfcXdlcnR5X3NoaWZ0ZWQueG1sCkBAIC0yMiw3ICsyMiw3IEBACiAgICAgYW5kcm9pZDprZXlXaWR0aD0iMTAlcCIKICAgICBhbmRyb2lkOmhvcml6b250YWxHYXA9IjBweCIKICAgICBhbmRyb2lkOnZlcnRpY2FsR2FwPSIwcHgiCi0gICAgYW5kcm9pZDprZXlIZWlnaHQ9IkBkaW1lbi9wYXNzd29yZF9rZXlib2FyZF9rZXlfaGVpZ2h0IgorICAgIGFuZHJvaWQ6a2V5SGVpZ2h0PSJAZGltZW4vcGFzc3dvcmRfa2V5Ym9hcmRfa2V5X2hlaWdodF9hbHBoYSIKICAgICA+CiAKICAgICA8Um93PgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL3htbC1tZHBpL3Bhc3N3b3JkX2tiZF9xd2VydHkueG1sIGIvY29yZS9yZXMvcmVzL3htbC1tZHBpL3Bhc3N3b3JkX2tiZF9xd2VydHkueG1sCmluZGV4IGJhZTFiNDIuLjgyYTdjNzUgMTAwNzU1Ci0tLSBhL2NvcmUvcmVzL3Jlcy94bWwtbWRwaS9wYXNzd29yZF9rYmRfcXdlcnR5LnhtbAorKysgYi9jb3JlL3Jlcy9yZXMveG1sLW1kcGkvcGFzc3dvcmRfa2JkX3F3ZXJ0eS54bWwKQEAgLTIyLDcgKzIyLDcgQEAKICAgICBhbmRyb2lkOmtleVdpZHRoPSIxMCVwIgogICAgIGFuZHJvaWQ6aG9yaXpvbnRhbEdhcD0iMHB4IgogICAgIGFuZHJvaWQ6dmVydGljYWxHYXA9IjBweCIKLSAgICBhbmRyb2lkOmtleUhlaWdodD0iQGRpbWVuL3Bhc3N3b3JkX2tleWJvYXJkX2tleV9oZWlnaHQiCisgICAgYW5kcm9pZDprZXlIZWlnaHQ9IkBkaW1lbi9wYXNzd29yZF9rZXlib2FyZF9rZXlfaGVpZ2h0X2FscGhhIgogICAgID4KIAogICAgIDxSb3c+CmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMveG1sLW1kcGkvcGFzc3dvcmRfa2JkX3F3ZXJ0eV9zaGlmdGVkLnhtbCBiL2NvcmUvcmVzL3Jlcy94bWwtbWRwaS9wYXNzd29yZF9rYmRfcXdlcnR5X3NoaWZ0ZWQueG1sCmluZGV4IDYxMmRmOWMuLjlmZmYzY2MgMTAwNzU1Ci0tLSBhL2NvcmUvcmVzL3Jlcy94bWwtbWRwaS9wYXNzd29yZF9rYmRfcXdlcnR5X3NoaWZ0ZWQueG1sCisrKyBiL2NvcmUvcmVzL3Jlcy94bWwtbWRwaS9wYXNzd29yZF9rYmRfcXdlcnR5X3NoaWZ0ZWQueG1sCkBAIC0yMiw3ICsyMiw3IEBACiAgICAgYW5kcm9pZDprZXlXaWR0aD0iMTAlcCIKICAgICBhbmRyb2lkOmhvcml6b250YWxHYXA9IjBweCIKICAgICBhbmRyb2lkOnZlcnRpY2FsR2FwPSIwcHgiCi0gICAgYW5kcm9pZDprZXlIZWlnaHQ9IkBkaW1lbi9wYXNzd29yZF9rZXlib2FyZF9rZXlfaGVpZ2h0IgorICAgIGFuZHJvaWQ6a2V5SGVpZ2h0PSJAZGltZW4vcGFzc3dvcmRfa2V5Ym9hcmRfa2V5X2hlaWdodF9hbHBoYSIKICAgICA+CiAKICAgICA8Um93PgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL3htbC14bGFyZ2UvcGFzc3dvcmRfa2JkX3F3ZXJ0eS54bWwgYi9jb3JlL3Jlcy9yZXMveG1sLXhsYXJnZS9wYXNzd29yZF9rYmRfcXdlcnR5LnhtbApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4wYTM1MDQwCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL3htbC14bGFyZ2UvcGFzc3dvcmRfa2JkX3F3ZXJ0eS54bWwKQEAgLTAsMCArMSwxMDIgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tCisvKgorKioKKyoqIENvcHlyaWdodCAyMDA4LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqKgorKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoqCisqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqKgorKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworLS0+CisKKzxLZXlib2FyZCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgYW5kcm9pZDprZXlXaWR0aD0iMTAlcCIKKyAgICBhbmRyb2lkOmhvcml6b250YWxHYXA9IjBweCIKKyAgICBhbmRyb2lkOnZlcnRpY2FsR2FwPSIwcHgiCisgICAgYW5kcm9pZDprZXlIZWlnaHQ9IkBkaW1lbi9wYXNzd29yZF9rZXlib2FyZF9rZXlfaGVpZ2h0X2FscGhhIgorICAgID4KKworICAgIDxSb3cgYW5kcm9pZDpyb3dFZGdlRmxhZ3M9InRvcCI+CisgICAgICAgIDxLZXkgYW5kcm9pZDprZXlMYWJlbD0iMSIgYW5kcm9pZDprZXlFZGdlRmxhZ3M9ImxlZnQiLz4KKyAgICAgICAgPEtleSBhbmRyb2lkOmtleUxhYmVsPSIyIi8+CisgICAgICAgIDxLZXkgYW5kcm9pZDprZXlMYWJlbD0iMyIvPgorICAgICAgICA8S2V5IGFuZHJvaWQ6a2V5TGFiZWw9IjQiLz4KKyAgICAgICAgPEtleSBhbmRyb2lkOmtleUxhYmVsPSI1Ii8+CisgICAgICAgIDxLZXkgYW5kcm9pZDprZXlMYWJlbD0iNiIvPgorICAgICAgICA8S2V5IGFuZHJvaWQ6a2V5TGFiZWw9IjciLz4KKyAgICAgICAgPEtleSBhbmRyb2lkOmtleUxhYmVsPSI4Ii8+CisgICAgICAgIDxLZXkgYW5kcm9pZDprZXlMYWJlbD0iOSIvPgorICAgICAgICA8S2V5IGFuZHJvaWQ6a2V5TGFiZWw9IjAiIGFuZHJvaWQ6a2V5RWRnZUZsYWdzPSJyaWdodCIvPgorICAgIDwvUm93PgorCisgICAgPFJvdz4KKyAgICAgICAgPEtleSBhbmRyb2lkOmtleUxhYmVsPSJxIiBhbmRyb2lkOmtleUVkZ2VGbGFncz0ibGVmdCIvPgorICAgICAgICA8S2V5IGFuZHJvaWQ6a2V5TGFiZWw9InciLz4KKyAgICAgICAgPEtleSBhbmRyb2lkOmtleUxhYmVsPSJlIi8+CisgICAgICAgIDxLZXkgYW5kcm9pZDprZXlMYWJlbD0iciIvPgorICAgICAgICA8S2V5IGFuZHJvaWQ6a2V5TGFiZWw9InQiLz4KKyAgICAgICAgPEtleSBhbmRyb2lkOmtleUxhYmVsPSJ5Ii8+CisgICAgICAgIDxLZXkgYW5kcm9pZDprZXlMYWJlbD0idSIvPgorICAgICAgICA8S2V5IGFuZHJvaWQ6a2V5TGFiZWw9ImkiLz4KKyAgICAgICAgPEtleSBhbmRyb2lkOmtleUxhYmVsPSJvIi8+CisgICAgICAgIDxLZXkgYW5kcm9pZDprZXlMYWJlbD0icCIgYW5kcm9pZDprZXlFZGdlRmxhZ3M9InJpZ2h0Ii8+CisgICAgPC9Sb3c+CisKKyAgICA8Um93PgorICAgICAgICA8S2V5IGFuZHJvaWQ6a2V5TGFiZWw9ImEiIGFuZHJvaWQ6aG9yaXpvbnRhbEdhcD0iNSVwIgorICAgICAgICAgICAgYW5kcm9pZDprZXlFZGdlRmxhZ3M9ImxlZnQiLz4KKyAgICAgICAgPEtleSBhbmRyb2lkOmtleUxhYmVsPSJzIi8+CisgICAgICAgIDxLZXkgYW5kcm9pZDprZXlMYWJlbD0iZCIvPgorICAgICAgICA8S2V5IGFuZHJvaWQ6a2V5TGFiZWw9ImYiLz4KKyAgICAgICAgPEtleSBhbmRyb2lkOmtleUxhYmVsPSJnIi8+CisgICAgICAgIDxLZXkgYW5kcm9pZDprZXlMYWJlbD0iaCIvPgorICAgICAgICA8S2V5IGFuZHJvaWQ6a2V5TGFiZWw9ImoiLz4KKyAgICAgICAgPEtleSBhbmRyb2lkOmtleUxhYmVsPSJrIi8+CisgICAgICAgIDxLZXkgYW5kcm9pZDprZXlMYWJlbD0ibCIgYW5kcm9pZDprZXlFZGdlRmxhZ3M9InJpZ2h0Ii8+CisgICAgPC9Sb3c+CisKKyAgICA8Um93PgorICAgICAgICA8S2V5IGFuZHJvaWQ6Y29kZXM9Ii0xIiBhbmRyb2lkOmtleUljb249IkBkcmF3YWJsZS9zeW1fa2V5Ym9hcmRfc2hpZnQiCisgICAgICAgICAgICBhbmRyb2lkOmtleVdpZHRoPSIxNSVwIiBhbmRyb2lkOmlzTW9kaWZpZXI9InRydWUiCisgICAgICAgICAgICBhbmRyb2lkOmljb25QcmV2aWV3PSJAZHJhd2FibGUvc3ltX2tleWJvYXJkX2ZlZWRiYWNrX3NoaWZ0IgorICAgICAgICAgICAgYW5kcm9pZDppc1N0aWNreT0idHJ1ZSIgYW5kcm9pZDprZXlFZGdlRmxhZ3M9ImxlZnQiLz4KKyAgICAgICAgPEtleSBhbmRyb2lkOmtleUxhYmVsPSJ6Ii8+CisgICAgICAgIDxLZXkgYW5kcm9pZDprZXlMYWJlbD0ieCIvPgorICAgICAgICA8S2V5IGFuZHJvaWQ6a2V5TGFiZWw9ImMiLz4KKyAgICAgICAgPEtleSBhbmRyb2lkOmtleUxhYmVsPSJ2Ii8+CisgICAgICAgIDxLZXkgYW5kcm9pZDprZXlMYWJlbD0iYiIvPgorICAgICAgICA8S2V5IGFuZHJvaWQ6a2V5TGFiZWw9Im4iLz4KKyAgICAgICAgPEtleSBhbmRyb2lkOmtleUxhYmVsPSJtIi8+CisgICAgICAgIDxLZXkgYW5kcm9pZDpjb2Rlcz0iLTUiIGFuZHJvaWQ6a2V5SWNvbj0iQGRyYXdhYmxlL3N5bV9rZXlib2FyZF9kZWxldGUiCisgICAgICAgICAgICBhbmRyb2lkOmtleVdpZHRoPSIxNSVwIiBhbmRyb2lkOmtleUVkZ2VGbGFncz0icmlnaHQiCisgICAgICAgICAgICBhbmRyb2lkOmljb25QcmV2aWV3PSJAZHJhd2FibGUvc3ltX2tleWJvYXJkX2ZlZWRiYWNrX2RlbGV0ZSIKKyAgICAgICAgICAgIGFuZHJvaWQ6aXNSZXBlYXRhYmxlPSJ0cnVlIi8+CisgICAgPC9Sb3c+CisKKyAgICA8Um93IGFuZHJvaWQ6a2V5Ym9hcmRNb2RlPSJAK2lkL21vZGVfbm9ybWFsIiBhbmRyb2lkOnJvd0VkZ2VGbGFncz0iYm90dG9tIj4KKyAgICAgICAgPEtleSBhbmRyb2lkOmNvZGVzPSItMiIgYW5kcm9pZDprZXlMYWJlbD0iQHN0cmluZy9wYXNzd29yZF9rZXlib2FyZF9sYWJlbF9zeW1ib2xfa2V5IgorICAgICAgICAgICAgYW5kcm9pZDprZXlXaWR0aD0iMjAlcCIgYW5kcm9pZDprZXlFZGdlRmxhZ3M9ImxlZnQiLz4KKyAgICAgICAgPEtleSBhbmRyb2lkOmtleUxhYmVsPSIsIiAvPgorICAgICAgICA8S2V5IGFuZHJvaWQ6a2V5TGFiZWw9Ii0iIC8+CisgICAgICAgIDxLZXkgYW5kcm9pZDpjb2Rlcz0iMzIiIGFuZHJvaWQ6a2V5SWNvbj0iQGRyYXdhYmxlL3N5bV9rZXlib2FyZF9zcGFjZSIKKyAgICAgICAgICAgIGFuZHJvaWQ6aWNvblByZXZpZXc9IkBkcmF3YWJsZS9zeW1fa2V5Ym9hcmRfZmVlZGJhY2tfc3BhY2UiCisgICAgICAgICAgICBhbmRyb2lkOmtleVdpZHRoPSIyMCVwIi8+CisgICAgICAgIDxLZXkgYW5kcm9pZDprZXlMYWJlbD0iPSIgLz4KKyAgICAgICAgPEtleSBhbmRyb2lkOmtleUxhYmVsPSIuIgorICAgICAgICAgICAgYW5kcm9pZDprZXlXaWR0aD0iMTAlcCIvPgorICAgICAgICA8S2V5IGFuZHJvaWQ6Y29kZXM9IjEwIiBhbmRyb2lkOmtleUljb249IkBkcmF3YWJsZS9zeW1fa2V5Ym9hcmRfb2siCisgICAgICAgICAgICBhbmRyb2lkOmljb25QcmV2aWV3PSJAZHJhd2FibGUvc3ltX2tleWJvYXJkX2ZlZWRiYWNrX29rIgorICAgICAgICAgICAgYW5kcm9pZDprZXlXaWR0aD0iMjAlcCIgYW5kcm9pZDprZXlFZGdlRmxhZ3M9InJpZ2h0Ii8+CisgICAgPC9Sb3c+CisKKzwvS2V5Ym9hcmQ+CisKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy94bWwteGxhcmdlL3Bhc3N3b3JkX2tiZF9xd2VydHlfc2hpZnRlZC54bWwgYi9jb3JlL3Jlcy9yZXMveG1sLXhsYXJnZS9wYXNzd29yZF9rYmRfcXdlcnR5X3NoaWZ0ZWQueG1sCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjllOWRiODEKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMveG1sLXhsYXJnZS9wYXNzd29yZF9rYmRfcXdlcnR5X3NoaWZ0ZWQueG1sCkBAIC0wLDAgKzEsMTAxIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLQorLyoKKyoqCisqKiBDb3B5cmlnaHQgMjAwOCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKioKKyoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqKgorKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKioKKyoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKy0tPgorCis8S2V5Ym9hcmQgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgIGFuZHJvaWQ6a2V5V2lkdGg9IjEwJXAiCisgICAgYW5kcm9pZDpob3Jpem9udGFsR2FwPSIwcHgiCisgICAgYW5kcm9pZDp2ZXJ0aWNhbEdhcD0iMHB4IgorICAgIGFuZHJvaWQ6a2V5SGVpZ2h0PSJAZGltZW4vcGFzc3dvcmRfa2V5Ym9hcmRfa2V5X2hlaWdodF9hbHBoYSIKKyAgICA+CisKKyAgICA8Um93IGFuZHJvaWQ6cm93RWRnZUZsYWdzPSJ0b3AiPgorICAgICAgICA8S2V5IGFuZHJvaWQ6a2V5TGFiZWw9IlxAIiBhbmRyb2lkOmtleUVkZ2VGbGFncz0ibGVmdCIvPgorICAgICAgICA8S2V5IGFuZHJvaWQ6a2V5TGFiZWw9IlwjIi8+CisgICAgICAgIDxLZXkgYW5kcm9pZDprZXlMYWJlbD0iJCIvPgorICAgICAgICA8S2V5IGFuZHJvaWQ6a2V5TGFiZWw9IiUiLz4KKyAgICAgICAgPEtleSBhbmRyb2lkOmtleUxhYmVsPSImYW1wOyIvPgorICAgICAgICA8S2V5IGFuZHJvaWQ6a2V5TGFiZWw9IioiLz4KKyAgICAgICAgPEtleSBhbmRyb2lkOmtleUxhYmVsPSItIi8+CisgICAgICAgIDxLZXkgYW5kcm9pZDprZXlMYWJlbD0iKyIvPgorICAgICAgICA8S2V5IGFuZHJvaWQ6a2V5TGFiZWw9IigiLz4KKyAgICAgICAgPEtleSBhbmRyb2lkOmtleUxhYmVsPSIpIiBhbmRyb2lkOmtleUVkZ2VGbGFncz0icmlnaHQiLz4KKyAgICA8L1Jvdz4KKworICAgIDxSb3c+CisgICAgICAgIDxLZXkgYW5kcm9pZDprZXlMYWJlbD0icSIgYW5kcm9pZDprZXlFZGdlRmxhZ3M9ImxlZnQiLz4KKyAgICAgICAgPEtleSBhbmRyb2lkOmtleUxhYmVsPSJ3Ii8+CisgICAgICAgIDxLZXkgYW5kcm9pZDprZXlMYWJlbD0iZSIvPgorICAgICAgICA8S2V5IGFuZHJvaWQ6a2V5TGFiZWw9InIiLz4KKyAgICAgICAgPEtleSBhbmRyb2lkOmtleUxhYmVsPSJ0Ii8+CisgICAgICAgIDxLZXkgYW5kcm9pZDprZXlMYWJlbD0ieSIvPgorICAgICAgICA8S2V5IGFuZHJvaWQ6a2V5TGFiZWw9InUiLz4KKyAgICAgICAgPEtleSBhbmRyb2lkOmtleUxhYmVsPSJpIi8+CisgICAgICAgIDxLZXkgYW5kcm9pZDprZXlMYWJlbD0ibyIvPgorICAgICAgICA8S2V5IGFuZHJvaWQ6a2V5TGFiZWw9InAiIGFuZHJvaWQ6a2V5RWRnZUZsYWdzPSJyaWdodCIvPgorICAgIDwvUm93PgorCisgICAgPFJvdz4KKyAgICAgICAgPEtleSBhbmRyb2lkOmtleUxhYmVsPSJhIiBhbmRyb2lkOmhvcml6b250YWxHYXA9IjUlcCIKKyAgICAgICAgICAgIGFuZHJvaWQ6a2V5RWRnZUZsYWdzPSJsZWZ0Ii8+CisgICAgICAgIDxLZXkgYW5kcm9pZDprZXlMYWJlbD0icyIvPgorICAgICAgICA8S2V5IGFuZHJvaWQ6a2V5TGFiZWw9ImQiLz4KKyAgICAgICAgPEtleSBhbmRyb2lkOmtleUxhYmVsPSJmIi8+CisgICAgICAgIDxLZXkgYW5kcm9pZDprZXlMYWJlbD0iZyIvPgorICAgICAgICA8S2V5IGFuZHJvaWQ6a2V5TGFiZWw9ImgiLz4KKyAgICAgICAgPEtleSBhbmRyb2lkOmtleUxhYmVsPSJqIi8+CisgICAgICAgIDxLZXkgYW5kcm9pZDprZXlMYWJlbD0iayIvPgorICAgICAgICA8S2V5IGFuZHJvaWQ6a2V5TGFiZWw9ImwiIGFuZHJvaWQ6a2V5RWRnZUZsYWdzPSJyaWdodCIvPgorICAgIDwvUm93PgorCisgICAgPFJvdz4KKyAgICAgICAgPEtleSBhbmRyb2lkOmNvZGVzPSItMSIgYW5kcm9pZDprZXlJY29uPSJAZHJhd2FibGUvc3ltX2tleWJvYXJkX3NoaWZ0IgorICAgICAgICAgICAgYW5kcm9pZDprZXlXaWR0aD0iMTUlcCIgYW5kcm9pZDppc01vZGlmaWVyPSJ0cnVlIgorICAgICAgICAgICAgYW5kcm9pZDppY29uUHJldmlldz0iQGRyYXdhYmxlL3N5bV9rZXlib2FyZF9mZWVkYmFja19zaGlmdCIKKyAgICAgICAgICAgIGFuZHJvaWQ6aXNTdGlja3k9InRydWUiIGFuZHJvaWQ6a2V5RWRnZUZsYWdzPSJsZWZ0Ii8+CisgICAgICAgIDxLZXkgYW5kcm9pZDprZXlMYWJlbD0ieiIvPgorICAgICAgICA8S2V5IGFuZHJvaWQ6a2V5TGFiZWw9IngiLz4KKyAgICAgICAgPEtleSBhbmRyb2lkOmtleUxhYmVsPSJjIi8+CisgICAgICAgIDxLZXkgYW5kcm9pZDprZXlMYWJlbD0idiIvPgorICAgICAgICA8S2V5IGFuZHJvaWQ6a2V5TGFiZWw9ImIiLz4KKyAgICAgICAgPEtleSBhbmRyb2lkOmtleUxhYmVsPSJuIi8+CisgICAgICAgIDxLZXkgYW5kcm9pZDprZXlMYWJlbD0ibSIvPgorICAgICAgICA8S2V5IGFuZHJvaWQ6Y29kZXM9Ii01IiBhbmRyb2lkOmtleUljb249IkBkcmF3YWJsZS9zeW1fa2V5Ym9hcmRfZGVsZXRlIgorICAgICAgICAgICAgYW5kcm9pZDprZXlXaWR0aD0iMTUlcCIgYW5kcm9pZDprZXlFZGdlRmxhZ3M9InJpZ2h0IgorICAgICAgICAgICAgYW5kcm9pZDppY29uUHJldmlldz0iQGRyYXdhYmxlL3N5bV9rZXlib2FyZF9mZWVkYmFja19kZWxldGUiCisgICAgICAgICAgICBhbmRyb2lkOmlzUmVwZWF0YWJsZT0idHJ1ZSIvPgorICAgIDwvUm93PgorCisgICAgPFJvdyBhbmRyb2lkOmtleWJvYXJkTW9kZT0iQCtpZC9tb2RlX25vcm1hbCIgYW5kcm9pZDpyb3dFZGdlRmxhZ3M9ImJvdHRvbSI+CisgICAgICAgIDxLZXkgYW5kcm9pZDpjb2Rlcz0iLTIiIGFuZHJvaWQ6a2V5TGFiZWw9IkBzdHJpbmcvcGFzc3dvcmRfa2V5Ym9hcmRfbGFiZWxfc3ltYm9sX2tleSIKKyAgICAgICAgICAgIGFuZHJvaWQ6a2V5V2lkdGg9IjIwJXAiIGFuZHJvaWQ6a2V5RWRnZUZsYWdzPSJsZWZ0Ii8+CisgICAgICAgIDxLZXkgYW5kcm9pZDprZXlMYWJlbD0iLCIgLz4KKyAgICAgICAgPEtleSBhbmRyb2lkOmtleUxhYmVsPSJfIiAvPgorICAgICAgICA8S2V5IGFuZHJvaWQ6Y29kZXM9IjMyIiBhbmRyb2lkOmtleUljb249IkBkcmF3YWJsZS9zeW1fa2V5Ym9hcmRfc3BhY2UiCisgICAgICAgICAgICBhbmRyb2lkOmljb25QcmV2aWV3PSJAZHJhd2FibGUvc3ltX2tleWJvYXJkX2ZlZWRiYWNrX3NwYWNlIgorICAgICAgICAgICAgYW5kcm9pZDprZXlXaWR0aD0iMjAlcCIvPgorICAgICAgICA8S2V5IGFuZHJvaWQ6a2V5TGFiZWw9IisiIC8+CisgICAgICAgIDxLZXkgYW5kcm9pZDprZXlMYWJlbD0iLiIvPgorICAgICAgICA8S2V5IGFuZHJvaWQ6Y29kZXM9IjEwIiBhbmRyb2lkOmtleUljb249IkBkcmF3YWJsZS9zeW1fa2V5Ym9hcmRfb2siCisgICAgICAgICAgICBhbmRyb2lkOmljb25QcmV2aWV3PSJAZHJhd2FibGUvc3ltX2tleWJvYXJkX2ZlZWRiYWNrX29rIgorICAgICAgICAgICAgYW5kcm9pZDprZXlXaWR0aD0iMjAlcCIgYW5kcm9pZDprZXlFZGdlRmxhZ3M9InJpZ2h0Ii8+CisgICAgPC9Sb3c+CisKKzwvS2V5Ym9hcmQ+CisKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy94bWwvcGFzc3dvcmRfa2JkX2V4dGVuc2lvbi54bWwgYi9jb3JlL3Jlcy9yZXMveG1sL3Bhc3N3b3JkX2tiZF9leHRlbnNpb24ueG1sCmluZGV4IDI4YjdlZmUuLmYzZmE1N2IgMTAwNzU1Ci0tLSBhL2NvcmUvcmVzL3Jlcy94bWwvcGFzc3dvcmRfa2JkX2V4dGVuc2lvbi54bWwKKysrIGIvY29yZS9yZXMvcmVzL3htbC9wYXNzd29yZF9rYmRfZXh0ZW5zaW9uLnhtbApAQCAtMjIsNyArMjIsNyBAQAogICAgIGFuZHJvaWQ6a2V5V2lkdGg9IjEwJXAiCiAgICAgYW5kcm9pZDpob3Jpem9udGFsR2FwPSIwcHgiCiAgICAgYW5kcm9pZDp2ZXJ0aWNhbEdhcD0iMHB4IgotICAgIGFuZHJvaWQ6a2V5SGVpZ2h0PSJAZGltZW4vcGFzc3dvcmRfa2V5Ym9hcmRfa2V5X2hlaWdodCIKKyAgICBhbmRyb2lkOmtleUhlaWdodD0iQGRpbWVuL3Bhc3N3b3JkX2tleWJvYXJkX2tleV9oZWlnaHRfYWxwaGEiCiAgICAgPgogCiAgICAgPFJvdyBhbmRyb2lkOnJvd0VkZ2VGbGFncz0idG9wIj4KZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy94bWwvcGFzc3dvcmRfa2JkX251bWVyaWMueG1sIGIvY29yZS9yZXMvcmVzL3htbC9wYXNzd29yZF9rYmRfbnVtZXJpYy54bWwKaW5kZXggZTNmMTYxMi4uMjI3MGI4YSAxMDA3NTUKLS0tIGEvY29yZS9yZXMvcmVzL3htbC9wYXNzd29yZF9rYmRfbnVtZXJpYy54bWwKKysrIGIvY29yZS9yZXMvcmVzL3htbC9wYXNzd29yZF9rYmRfbnVtZXJpYy54bWwKQEAgLTE5LDM1ICsxOSw0MSBAQAogLS0+CiA8S2V5Ym9hcmQgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgogICAgIGFuZHJvaWQ6a2V5V2lkdGg9IjMzLjMzJXAiCi0gICAgYW5kcm9pZDpob3Jpem9udGFsR2FwPSIycHgiCiAgICAgYW5kcm9pZDp2ZXJ0aWNhbEdhcD0iMHB4IgotICAgIGFuZHJvaWQ6a2V5SGVpZ2h0PSJAZGltZW4vcGFzc3dvcmRfa2V5Ym9hcmRfa2V5X2hlaWdodCIKKyAgICBhbmRyb2lkOmtleUhlaWdodD0iQGRpbWVuL3Bhc3N3b3JkX2tleWJvYXJkX2tleV9oZWlnaHRfbnVtZXJpYyIKICAgICA+CiAKLSAgICA8Um93PgotICAgICAgICA8S2V5IGFuZHJvaWQ6Y29kZXM9IjQ5IiBhbmRyb2lkOmtleUljb249IkBkcmF3YWJsZS9zeW1fa2V5Ym9hcmRfbnVtMSIgYW5kcm9pZDprZXlFZGdlRmxhZ3M9ImxlZnQiLz4KKyAgICA8Um93IGFuZHJvaWQ6cm93RWRnZUZsYWdzPSJ0b3AiPgorICAgICAgICA8S2V5IGFuZHJvaWQ6Y29kZXM9IjQ5IiBhbmRyb2lkOmtleUljb249IkBkcmF3YWJsZS9zeW1fa2V5Ym9hcmRfbnVtMSIKKyAgICAgICAgICAgICBhbmRyb2lkOmtleUVkZ2VGbGFncz0ibGVmdCIvPgogICAgICAgICA8S2V5IGFuZHJvaWQ6Y29kZXM9IjUwIiBhbmRyb2lkOmtleUljb249IkBkcmF3YWJsZS9zeW1fa2V5Ym9hcmRfbnVtMiIvPgotICAgICAgICA8S2V5IGFuZHJvaWQ6Y29kZXM9IjUxIiBhbmRyb2lkOmtleUljb249IkBkcmF3YWJsZS9zeW1fa2V5Ym9hcmRfbnVtMyIvPgorICAgICAgICA8S2V5IGFuZHJvaWQ6Y29kZXM9IjUxIiBhbmRyb2lkOmtleUljb249IkBkcmF3YWJsZS9zeW1fa2V5Ym9hcmRfbnVtMyIKKyAgICAgICAgICAgICBhbmRyb2lkOmtleUVkZ2VGbGFncz0icmlnaHQiLz4KICAgICA8L1Jvdz4KIAogICAgIDxSb3c+Ci0gICAgICAgIDxLZXkgYW5kcm9pZDpjb2Rlcz0iNTIiIGFuZHJvaWQ6a2V5SWNvbj0iQGRyYXdhYmxlL3N5bV9rZXlib2FyZF9udW00IiBhbmRyb2lkOmtleUVkZ2VGbGFncz0ibGVmdCIvPgorICAgICAgICA8S2V5IGFuZHJvaWQ6Y29kZXM9IjUyIiBhbmRyb2lkOmtleUljb249IkBkcmF3YWJsZS9zeW1fa2V5Ym9hcmRfbnVtNCIKKyAgICAgICAgICAgICBhbmRyb2lkOmtleUVkZ2VGbGFncz0ibGVmdCIvPgogICAgICAgICA8S2V5IGFuZHJvaWQ6Y29kZXM9IjUzIiBhbmRyb2lkOmtleUljb249IkBkcmF3YWJsZS9zeW1fa2V5Ym9hcmRfbnVtNSIvPgotICAgICAgICA8S2V5IGFuZHJvaWQ6Y29kZXM9IjU0IiBhbmRyb2lkOmtleUljb249IkBkcmF3YWJsZS9zeW1fa2V5Ym9hcmRfbnVtNiIvPgorICAgICAgICA8S2V5IGFuZHJvaWQ6Y29kZXM9IjU0IiBhbmRyb2lkOmtleUljb249IkBkcmF3YWJsZS9zeW1fa2V5Ym9hcmRfbnVtNiIKKyAgICAgICAgICAgICBhbmRyb2lkOmtleUVkZ2VGbGFncz0icmlnaHQiLz4KICAgICA8L1Jvdz4KIAogICAgIDxSb3c+Ci0gICAgICAgIDxLZXkgYW5kcm9pZDpjb2Rlcz0iNTUiIGFuZHJvaWQ6a2V5SWNvbj0iQGRyYXdhYmxlL3N5bV9rZXlib2FyZF9udW03IiBhbmRyb2lkOmtleUVkZ2VGbGFncz0ibGVmdCIvPgorICAgICAgICA8S2V5IGFuZHJvaWQ6Y29kZXM9IjU1IiBhbmRyb2lkOmtleUljb249IkBkcmF3YWJsZS9zeW1fa2V5Ym9hcmRfbnVtNyIKKyAgICAgICAgICAgICBhbmRyb2lkOmtleUVkZ2VGbGFncz0ibGVmdCIvPgogICAgICAgICA8S2V5IGFuZHJvaWQ6Y29kZXM9IjU2IiBhbmRyb2lkOmtleUljb249IkBkcmF3YWJsZS9zeW1fa2V5Ym9hcmRfbnVtOCIvPgotICAgICAgICA8S2V5IGFuZHJvaWQ6Y29kZXM9IjU3IiBhbmRyb2lkOmtleUljb249IkBkcmF3YWJsZS9zeW1fa2V5Ym9hcmRfbnVtOSIvPgorICAgICAgICA8S2V5IGFuZHJvaWQ6Y29kZXM9IjU3IiBhbmRyb2lkOmtleUljb249IkBkcmF3YWJsZS9zeW1fa2V5Ym9hcmRfbnVtOSIKKyAgICAgICAgICAgICBhbmRyb2lkOmtleUVkZ2VGbGFncz0icmlnaHQiLz4KICAgICA8L1Jvdz4KIAogICAgIDxSb3cgYW5kcm9pZDpyb3dFZGdlRmxhZ3M9ImJvdHRvbSI+Ci0gICAgICAgIDxLZXkgYW5kcm9pZDpjb2Rlcz0iMTAiIGFuZHJvaWQ6a2V5SWNvbj0iQGRyYXdhYmxlL3N5bV9rZXlib2FyZF9vayIvPgorICAgICAgICA8S2V5IGFuZHJvaWQ6Y29kZXM9IjEwIiBhbmRyb2lkOmtleUljb249IkBkcmF3YWJsZS9zeW1fa2V5Ym9hcmRfb2siCisgICAgICAgICAgICAgYW5kcm9pZDprZXlFZGdlRmxhZ3M9ImxlZnQiLz4KICAgICAgICAgPEtleSBhbmRyb2lkOmNvZGVzPSI0OCIgYW5kcm9pZDprZXlJY29uPSJAZHJhd2FibGUvc3ltX2tleWJvYXJkX251bTBfbm9fcGx1cyIvPgogICAgICAgICA8S2V5IGFuZHJvaWQ6Y29kZXM9Ii01IiBhbmRyb2lkOmtleUljb249IkBkcmF3YWJsZS9zeW1fa2V5Ym9hcmRfZGVsZXRlIgotICAgICAgICAgICAgYW5kcm9pZDppY29uUHJldmlldz0iQGRyYXdhYmxlL3N5bV9rZXlib2FyZF9mZWVkYmFja19kZWxldGUiCi0gICAgICAgICAgICBhbmRyb2lkOmlzUmVwZWF0YWJsZT0idHJ1ZSIgYW5kcm9pZDprZXlFZGdlRmxhZ3M9InJpZ2h0Ii8+CisgICAgICAgICAgICAgYW5kcm9pZDppY29uUHJldmlldz0iQGRyYXdhYmxlL3N5bV9rZXlib2FyZF9mZWVkYmFja19kZWxldGUiCisgICAgICAgICAgICAgYW5kcm9pZDppc1JlcGVhdGFibGU9InRydWUiIGFuZHJvaWQ6a2V5RWRnZUZsYWdzPSJyaWdodCIvPgogICAgIDwvUm93PgogCiA8L0tleWJvYXJkPgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL3htbC9wYXNzd29yZF9rYmRfcG9wdXBfdGVtcGxhdGUueG1sIGIvY29yZS9yZXMvcmVzL3htbC9wYXNzd29yZF9rYmRfcG9wdXBfdGVtcGxhdGUueG1sCmluZGV4IDVkZGZkM2UuLjliODUzZTIgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy94bWwvcGFzc3dvcmRfa2JkX3BvcHVwX3RlbXBsYXRlLnhtbAorKysgYi9jb3JlL3Jlcy9yZXMveG1sL3Bhc3N3b3JkX2tiZF9wb3B1cF90ZW1wbGF0ZS54bWwKQEAgLTIyLDYgKzIyLDYgQEAKICAgICBhbmRyb2lkOmtleVdpZHRoPSIxMCVwIgogICAgIGFuZHJvaWQ6aG9yaXpvbnRhbEdhcD0iMHB4IgogICAgIGFuZHJvaWQ6dmVydGljYWxHYXA9IjBweCIKLSAgICBhbmRyb2lkOmtleUhlaWdodD0iQGRpbWVuL3Bhc3N3b3JkX2tleWJvYXJkX2tleV9oZWlnaHQiCisgICAgYW5kcm9pZDprZXlIZWlnaHQ9IkBkaW1lbi9wYXNzd29yZF9rZXlib2FyZF9rZXlfaGVpZ2h0X2FscGhhIgogICAgID4KIDwvS2V5Ym9hcmQ+CmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMveG1sL3Bhc3N3b3JkX2tiZF9xd2VydHkueG1sIGIvY29yZS9yZXMvcmVzL3htbC9wYXNzd29yZF9rYmRfcXdlcnR5LnhtbAppbmRleCA1ZmE5YjhhLi4wYTM1MDQwIDEwMDc1NQotLS0gYS9jb3JlL3Jlcy9yZXMveG1sL3Bhc3N3b3JkX2tiZF9xd2VydHkueG1sCisrKyBiL2NvcmUvcmVzL3Jlcy94bWwvcGFzc3dvcmRfa2JkX3F3ZXJ0eS54bWwKQEAgLTIyLDcgKzIyLDcgQEAKICAgICBhbmRyb2lkOmtleVdpZHRoPSIxMCVwIgogICAgIGFuZHJvaWQ6aG9yaXpvbnRhbEdhcD0iMHB4IgogICAgIGFuZHJvaWQ6dmVydGljYWxHYXA9IjBweCIKLSAgICBhbmRyb2lkOmtleUhlaWdodD0iQGRpbWVuL3Bhc3N3b3JkX2tleWJvYXJkX2tleV9oZWlnaHQiCisgICAgYW5kcm9pZDprZXlIZWlnaHQ9IkBkaW1lbi9wYXNzd29yZF9rZXlib2FyZF9rZXlfaGVpZ2h0X2FscGhhIgogICAgID4KIAogICAgIDxSb3cgYW5kcm9pZDpyb3dFZGdlRmxhZ3M9InRvcCI+CmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMveG1sL3Bhc3N3b3JkX2tiZF9xd2VydHlfc2hpZnRlZC54bWwgYi9jb3JlL3Jlcy9yZXMveG1sL3Bhc3N3b3JkX2tiZF9xd2VydHlfc2hpZnRlZC54bWwKaW5kZXggZTQ5MWFmZi4uOWU5ZGI4MSAxMDA3NTUKLS0tIGEvY29yZS9yZXMvcmVzL3htbC9wYXNzd29yZF9rYmRfcXdlcnR5X3NoaWZ0ZWQueG1sCisrKyBiL2NvcmUvcmVzL3Jlcy94bWwvcGFzc3dvcmRfa2JkX3F3ZXJ0eV9zaGlmdGVkLnhtbApAQCAtMjIsNyArMjIsNyBAQAogICAgIGFuZHJvaWQ6a2V5V2lkdGg9IjEwJXAiCiAgICAgYW5kcm9pZDpob3Jpem9udGFsR2FwPSIwcHgiCiAgICAgYW5kcm9pZDp2ZXJ0aWNhbEdhcD0iMHB4IgotICAgIGFuZHJvaWQ6a2V5SGVpZ2h0PSJAZGltZW4vcGFzc3dvcmRfa2V5Ym9hcmRfa2V5X2hlaWdodCIKKyAgICBhbmRyb2lkOmtleUhlaWdodD0iQGRpbWVuL3Bhc3N3b3JkX2tleWJvYXJkX2tleV9oZWlnaHRfYWxwaGEiCiAgICAgPgogCiAgICAgPFJvdyBhbmRyb2lkOnJvd0VkZ2VGbGFncz0idG9wIj4KZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy94bWwvcGFzc3dvcmRfa2JkX3N5bWJvbHMueG1sIGIvY29yZS9yZXMvcmVzL3htbC9wYXNzd29yZF9rYmRfc3ltYm9scy54bWwKaW5kZXggMTRhN2VjOC4uOWE5NDkzMCAxMDA3NTUKLS0tIGEvY29yZS9yZXMvcmVzL3htbC9wYXNzd29yZF9rYmRfc3ltYm9scy54bWwKKysrIGIvY29yZS9yZXMvcmVzL3htbC9wYXNzd29yZF9rYmRfc3ltYm9scy54bWwKQEAgLTIyLDEwICsyMiwxMCBAQAogICAgIGFuZHJvaWQ6a2V5V2lkdGg9IjEwJXAiCiAgICAgYW5kcm9pZDpob3Jpem9udGFsR2FwPSIwcHgiCiAgICAgYW5kcm9pZDp2ZXJ0aWNhbEdhcD0iMHB4IgotICAgIGFuZHJvaWQ6a2V5SGVpZ2h0PSJAZGltZW4vcGFzc3dvcmRfa2V5Ym9hcmRfa2V5X2hlaWdodCIKKyAgICBhbmRyb2lkOmtleUhlaWdodD0iQGRpbWVuL3Bhc3N3b3JkX2tleWJvYXJkX2tleV9oZWlnaHRfYWxwaGEiCiAgICAgPgogCi0gICAgPFJvdz4KKyAgICA8Um93IGFuZHJvaWQ6cm93RWRnZUZsYWdzPSJ0b3AiPgogICAgICAgICA8S2V5IGFuZHJvaWQ6a2V5TGFiZWw9IjEiIGFuZHJvaWQ6a2V5RWRnZUZsYWdzPSJsZWZ0Ii8+CiAgICAgICAgIDxLZXkgYW5kcm9pZDprZXlMYWJlbD0iMiIvPgogICAgICAgICA8S2V5IGFuZHJvaWQ6a2V5TGFiZWw9IjMiLz4KZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy94bWwvcGFzc3dvcmRfa2JkX3N5bWJvbHNfc2hpZnQueG1sIGIvY29yZS9yZXMvcmVzL3htbC9wYXNzd29yZF9rYmRfc3ltYm9sc19zaGlmdC54bWwKaW5kZXggNGI4NGY0Yi4uYTk3MmViMiAxMDA3NTUKLS0tIGEvY29yZS9yZXMvcmVzL3htbC9wYXNzd29yZF9rYmRfc3ltYm9sc19zaGlmdC54bWwKKysrIGIvY29yZS9yZXMvcmVzL3htbC9wYXNzd29yZF9rYmRfc3ltYm9sc19zaGlmdC54bWwKQEAgLTIyLDEwICsyMiwxMCBAQAogICAgIGFuZHJvaWQ6a2V5V2lkdGg9IjEwJXAiCiAgICAgYW5kcm9pZDpob3Jpem9udGFsR2FwPSIwcHgiCiAgICAgYW5kcm9pZDp2ZXJ0aWNhbEdhcD0iMHB4IgotICAgIGFuZHJvaWQ6a2V5SGVpZ2h0PSJAZGltZW4vcGFzc3dvcmRfa2V5Ym9hcmRfa2V5X2hlaWdodCIKKyAgICBhbmRyb2lkOmtleUhlaWdodD0iQGRpbWVuL3Bhc3N3b3JkX2tleWJvYXJkX2tleV9oZWlnaHRfYWxwaGEiCiAgICAgPgogCi0gICAgPFJvdz4KKyAgICA8Um93IGFuZHJvaWQ6cm93RWRnZUZsYWdzPSJ0b3AiPgogICAgICAgICA8S2V5IGFuZHJvaWQ6a2V5TGFiZWw9In4iIGFuZHJvaWQ6a2V5RWRnZUZsYWdzPSJsZWZ0Ii8+CiAgICAgICAgIDxLZXkgYW5kcm9pZDprZXlMYWJlbD0iYCIvPgogICAgICAgICA8S2V5IGFuZHJvaWQ6a2V5TGFiZWw9InwiLz4KZGlmZiAtLWdpdCBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL0FuZHJvaWRNYW5pZmVzdC54bWwgYi9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9BbmRyb2lkTWFuaWZlc3QueG1sCmluZGV4IGYwOTQyMWIuLmU0NDlkZGIgMTAwNjQ0Ci0tLSBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL0FuZHJvaWRNYW5pZmVzdC54bWwKKysrIGIvY29yZS90ZXN0cy9jb3JldGVzdHMvQW5kcm9pZE1hbmlmZXN0LnhtbApAQCAtMTAyMiw3ICsxMDIyLDEzIEBACiAgICAgICAgICAgICAgICAgPGFjdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuYWNjZXNzaWJpbGl0eXNlcnZpY2UuQWNjZXNzaWJpbGl0eVNlcnZpY2UiIC8+CiAgICAgICAgICAgICA8L2ludGVudC1maWx0ZXI+CiAgICAgICAgIDwvc2VydmljZT4KLSAgICAgICAgCisKKyAgICAgICAgPHNlcnZpY2UgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLndlYmtpdC5BY2Nlc3NpYmlsaXR5SW5qZWN0b3JUZXN0JE1vY2tBY2Nlc3NpYmlsaXR5U2VydmljZSI+CisgICAgICAgICAgICA8aW50ZW50LWZpbHRlcj4KKyAgICAgICAgICAgICAgICA8YWN0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5hY2Nlc3NpYmlsaXR5c2VydmljZS5BY2Nlc3NpYmlsaXR5U2VydmljZSIgLz4KKyAgICAgICAgICAgIDwvaW50ZW50LWZpbHRlcj4KKyAgICAgICAgPC9zZXJ2aWNlPgorCiAgICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQud2lkZ2V0LlJhZGlvR3JvdXBBY3Rpdml0eSIgYW5kcm9pZDpsYWJlbD0iUmFkaW9Hcm91cEFjdGl2aXR5Ij4KICAgICAgICAgICAgIDxpbnRlbnQtZmlsdGVyPgogICAgICAgICAgICAgICAgIDxhY3Rpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5hY3Rpb24uTUFJTiIgLz4KZGlmZiAtLWdpdCBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3Jlcy9yYXcvdjIxX2JhY2tzbGFzaC52Y2YgYi9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9yZXMvcmF3L3YyMV9iYWNrc2xhc2gudmNmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZDMwMDJiLi4wMDAwMDAwCi0tLSBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3Jlcy9yYXcvdjIxX2JhY2tzbGFzaC52Y2YKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLUJFR0lOOlZDQVJEDQotVkVSU0lPTjoyLjENCi1OOjtBXDtCXFw7Q1xcXDs7RDtcOkU7XFxcXDsNCi1GTjpBO0JcQ1w7RDpFXFwNCi1FTkQ6VkNBUkQNCmRpZmYgLS1naXQgYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9yZXMvcmF3L3YyMV9jb21wbGljYXRlZC52Y2YgYi9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9yZXMvcmF3L3YyMV9jb21wbGljYXRlZC52Y2YKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRlMzRlMTYuLjAwMDAwMDAKLS0tIGEvY29yZS90ZXN0cy9jb3JldGVzdHMvcmVzL3Jhdy92MjFfY29tcGxpY2F0ZWQudmNmCisrKyAvZGV2L251bGwKQEAgLTEsMTA2ICswLDAgQEAKLUJFR0lOOlZDQVJEDQotVkVSU0lPTjoyLjENCi1OOkd1bXA7Rm9ycmVzdDtIb2dlO1BvcztUYW8NCi1GTjpKb2UgRHVlDQotT1JHOkd1bXAgU2hyaW1wIENvLjtTYWxlcyBEZXB0Llw7TWFuYWdlcjtGaXNoIGtlZXBlcg0KLVJPTEU6RmlzaCBDYWtlIEtlZXBlciENCi1YLUNMQVNTOlBVQkxJQw0KLVRJVExFOlNocmltcCBNYW4NCi1URUw7V09SSztWT0lDRTooMTExKSA1NTUtMTIxMg0KLVRFTDtIT01FO1ZPSUNFOig0MDQpIDU1NS0xMjEyDQotVEVMO0NFTEw6MDMxMTExMTExMQ0KLVRFTDtWSURFTzowMzIyMjIyMjIyDQotVEVMO1ZPSUNFOjAzMzMzMzMzMzMNCi1BRFI7V09SSzo7OzEwMCBXYXRlcnMgRWRnZTtCYXl0b3duO0xBOzMwMzE0O1VuaXRlZCBTdGF0ZXMgb2YgQW1lcmljYQ0KLUxBQkVMO1dPUks7RU5DT0RJTkc9UVVPVEVELVBSSU5UQUJMRToxMDAgV2F0ZXJzIEVkZ2U9MEQ9MEFCYXl0b3duLCBMQSAzMDMxND0wRD0wQVVuaXRlZCAgU3RhdGVzIG9mIEFtZXJpY2ENCi1BRFI7SE9NRTo7OzQyIFBsYW50YXRpb24gU3QuO0JheXRvd247TEE7MzAzMTQ7VW5pdGVkIFN0YXRlcyBvZiBBbWVyaWNhDQotTEFCRUw7SE9NRTtFTkNPRElORz1RVU9URUQtUFJJTlRBQkxFOjQyIFBsYW50YXRpb24gU3QuPTBEPTBBPQ0KLUJheXRvd24sIExBIDMwMzE0PTBEPTBBPQ0KLVVuaXRlZCAgU3RhdGVzIG9mIEFtZXJpY2ENCi1FTUFJTDtQUkVGO0lOVEVSTkVUOmZvcnJlc3RndW1wQHdhbGxhZGFsbGEuY29tDQotRU1BSUw7Q0VMTDpjZWxsQGV4YW1wbGUuY29tDQotTk9URTpUaGUgZm9sbG93aW5nIG5vdGUgaXMgdGhlIGV4YW1wbGUgZnJvbSBSRkMgMjA0NS4NCi1OT1RFO0VOQ09ESU5HPVFVT1RFRC1QUklOVEFCTEU6Tm93J3MgdGhlIHRpbWUgPQ0KLWZvciBhbGwgZm9sayB0byBjb21lPQ0KLSB0byB0aGUgYWlkIG9mIHRoZWlyIGNvdW50cnkuDQotDQotUEhPVE87RU5DT0RJTkc9QkFTRTY0O1RZUEU9SlBFRzoNCi0gLzlqLzRRb1BSWGhwWmdBQVRVMEFLZ0FBQUFnQURRRU9BQUlBQUFBUEFBQUFxZ0VQQUFJQUFBQUhBQUFBdWdFUUFBSUFBQUFHDQotIEFBQUF3Z0VTQUFNQUFBQUJBQUVBQUFFYUFBVUFBQUFCQUFBQXlBRWJBQVVBQUFBQkFBQUEwQUVvQUFNQUFBQUJBQUlBQUFFeA0KLSBBQUlBQUFBT0FBQUEyQUV5QUFJQUFBQVVBQUFBNWdJVEFBTUFBQUFCQUFFQUFJS1lBQUlBQUFBT0FBQUErb2RwQUFRQUFBQUINCi0gQUFBQmhNU2xBQWNBQUFCOEFBQUJDQUFBQkI0eU1EQTRNVEF5T1RFek5UVXpNUUFBUkc5RGIwMXZBQUJFT1RBMWFRQUFBQUJJDQotIEFBQUFBUUFBQUVnQUFBQUJSRGt3TldrZ1ZtVnlNUzR3TUFBeU1EQTRPakV3T2pJNUlERXpPalUxT2pRM0FDQWdJQ0FnSUNBZw0KLSBJQ0FnSUNBQVVISnBiblJKVFFBd016QXdBQUFBQmdBQkFCUUFGQUFDQVFBQUFBQURBQUFBTkFFQUJRQUFBQUVCQVFBQUFBRVENCi0gZ0FBQUFBQUFFUWtBQUNjUUFBQVBDd0FBSnhBQUFBV1hBQUFuRUFBQUNMQUFBQ2NRQUFBY0FRQUFKeEFBQUFKZUFBQW5FQUFBDQotIEFJc0FBQ2NRQUFBRHl3QUFKeEFBQUJ2bEFBQW5FQUFvZ3BvQUJRQUFBQUVBQUFOcWdwMEFCUUFBQUFFQUFBTnlpQ0lBQXdBQQ0KLSBBQUVBQWdBQWtBQUFCd0FBQUFRd01qSXdrQU1BQWdBQUFCUUFBQU42a0FRQUFnQUFBQlFBQUFPT2tRRUFCd0FBQUFRQkFnTUENCi0ga1FJQUJRQUFBQUVBQUFPaWtnRUFDZ0FBQUFFQUFBT3FrZ0lBQlFBQUFBRUFBQU95a2dRQUNnQUFBQUVBQUFPNmtnVUFCUUFBDQotIEFBRUFBQVBDa2djQUF3QUFBQUVBQWdBQWtnZ0FBd0FBQUFFQUFBQUFrZ2tBQXdBQUFBRUFBQUFBa2dvQUJRQUFBQUVBQUFQSw0KLSBrbndBQndBQUFBRUFBQUFBa29ZQUJ3QUFBQllBQUFQU29BQUFCd0FBQUFRd01UQXdvQUVBQXdBQUFBRUFBUUFBb0FJQUF3QUENCi0gQUFFQVlBQUFvQU1BQXdBQUFBRUFTQUFBb0FVQUJBQUFBQUVBQUFRQW9nNEFCUUFBQUFFQUFBUG9vZzhBQlFBQUFBRUFBQVB3DQotIG9oQUFBd0FBQUFFQUFnQUFvaGNBQXdBQUFBRUFBZ0FBb3dBQUJ3QUFBQUVEQUFBQW93RUFCd0FBQUFFQkFBQUFwQUVBQXdBQQ0KLSBBQUVBQUFBQXBBSUFBd0FBQUFFQUFBQUFwQU1BQXdBQUFBRUFBQUFBcEFRQUJRQUFBQUVBQUFQNHBBVUFBd0FBQUFFQUhRQUENCi0gcEFZQUF3QUFBQUVBQUFBQXBBY0FBd0FBQUFFQUFBQUFwQWdBQXdBQUFBRUFBQUFBcEFrQUF3QUFBQUVBQUFBQXBBb0FBd0FBDQotIEFBRUFBQUFBcEF3QUF3QUFBQUVBQWdBQUFBQUFBQUFBQUZNQUFDY1FBQUFCWGdBQUFHUXlNREE0T2pFd09qSTVJREV6T2pVMQ0KLSBPak14QURJd01EZzZNVEE2TWprZ01UTTZOVFU2TkRjQUFBQXBpQUFBR3dBQUFBS3lBQUFBWkFBQUFWNEFBQUJrQUFBQUFBQUENCi0gQUdRQUFBQWxBQUFBQ2dBQURwSUFBQVBvQUFBQUFBQUFBQUF5TURBNE1UQXlPVEV6TlRVek1RQUFJQ29BQUFBS0FBQXE0Z0FBDQotIEFBb0FBQUFBQUFBQUFRQUNBQUVBQWdBQUFBUlNPVGdBQUFJQUJ3QUFBQVF3TVRBd0FBQUFBQUFHQVFNQUF3QUFBQUVBQmdBQQ0KLSBBUm9BQlFBQUFBRUFBQVJzQVJzQUJRQUFBQUVBQUFSMEFTZ0FBd0FBQUFFQUFnQUFBZ0VBQkFBQUFBRUFBQVI4QWdJQUJBQUENCi0gQUFFQUFBV0xBQUFBQUFBQUFFZ0FBQUFCQUFBQVNBQUFBQUgvMlAvYkFJUUFJQllZSEJnVUlCd2FIQ1FpSUNZd1VEUXdMQ3d3DQotIFlrWktPbEIwWm5wNGNtWndib0NRdUp5QWlLNktibkNnMnFLdXZzVE8wTTU4bXVMeTRNand1TXJPeGdFaUpDUXdLakJlTkRSZQ0KLSB4b1J3aE1iR3hzYkd4c2JHeHNiR3hzYkd4c2JHeHNiR3hzYkd4c2JHeHNiR3hzYkd4c2JHeHNiR3hzYkd4c2JHeHNiR3hzYkcNCi0gLzhBQUVRZ0FlQUNnQXdFaEFBSVJBUU1SQWYvRUFhSUFBQUVGQVFFQkFRRUJBQUFBQUFBQUFBQUJBZ01FQlFZSENBa0tDeEFBDQotIEFnRURBd0lFQXdVRkJBUUFBQUY5QVFJREFBUVJCUkloTVVFR0UxRmhCeUp4RkRLQmthRUlJMEt4d1JWUzBmQWtNMkp5Z2drSw0KLSBGaGNZR1JvbEppY29LU28wTlRZM09EazZRMFJGUmtkSVNVcFRWRlZXVjFoWldtTmtaV1puYUdscWMzUjFkbmQ0ZVhxRGhJV0cNCi0gaDRpSmlwS1RsSldXbDVpWm1xS2pwS1dtcDZpcHFyS3p0TFcydDdpNXVzTER4TVhHeDhqSnl0TFQxTlhXMTlqWjJ1SGk0K1RsDQotIDV1Zm82ZXJ4OHZQMDlmYjMrUG42QVFBREFRRUJBUUVCQVFFQkFBQUFBQUFBQVFJREJBVUdCd2dKQ2dzUkFBSUJBZ1FFQXdRSA0KLSBCUVFFQUFFQ2R3QUJBZ01SQkFVaE1RWVNRVkVIWVhFVElqS0JDQlJDa2FHeHdRa2pNMUx3RldKeTBRb1dKRFRoSmZFWEdCa2ENCi0gSmljb0tTbzFOamM0T1RwRFJFVkdSMGhKU2xOVVZWWlhXRmxhWTJSbFptZG9hV3B6ZEhWMmQzaDVlb0tEaElXR2g0aUppcEtUDQotIGxKV1dsNWlabXFLanBLV21wNmlwcXJLenRMVzJ0N2k1dXNMRHhNWEd4OGpKeXRMVDFOWFcxOWpaMnVMajVPWG01K2pwNnZMeg0KLSA5UFgyOS9qNSt2L2FBQXdEQVFBQ0VRTVJBRDhBRkZTcUtrWklvcVJWcGdTS0tlQlRFT0Fwd0ZBRHNVWXBnSVJTRVVBTklwcEYNCi0gSUNOaFVUQ2dDTWlvMkZJQ0poVUxDZ0Mwb3FWYUFKRkZTcUtCa2dGT0FwaUhDbkNnQjJLTVVDRU5KUUEwaW1FVURHTUtpWVVBDQotIFJ0VWJVZ0lXcUpoUUJaU3BGb0FsV3BWb0dQRlBGTVE3dFNLMk9EUUE0eUtPOUhtS2U5RnhBekRIRklPbEFBYVlhQUdOVVRVRA0KLSBJbXFOcVFFVFZFMUFFNlZLS0FKRk5TcWFBSGcwOEdtQU5JRkZRTTVZNXFKTUJ1VDYwWk5RSWNya1ZZU1FNS3VMR0thYWFzUXgNCi0gcWlhZ1pFMVJ0U0FqYW9tb0FrUTFLcG9BbFUxSXBvQWtVMDdPQlRBck8rNXFrVjEyWTcxbGZVQm1hS2tDUlN1em5yVEZiYTJhDQotIG9Dd0d5TTBFMXFJalkxR3hvR1JOVVpOSUNOcWlhZ0J5R3BsTkFFaW1wRk5NQjRZRHZTdWNweFNZRUlVMDRLYXpzQXUxcUFyVQ0KLSBXRUx0UHBUU3Bvc0JORVR0NXB4TmFvQ05qVWJHZ0NOalVab0dSdFVUVWdGVTFLcG9Ba0JxUUhpZ0NGbk83clVxT2RsWnA2Z0ENCi0gYyt0T0RuMXBYQVh6RDYwZVlmV25jUXZtTlNHUTA3Z09NaENWRUpHejFwdGdTNXlLWXhxd0dFMUd4b0FpYW1Ha01hcHFWVFFCDQotIEtwcCtlS0FJQ2ZtcVdNL0thejZnQU5PQnFRRnpSbW1BdWFUTkFDc2ZrcU1IbW05d0pzOFUwbXRSREdOUnNhQUkycGhwREkxTg0KLSBTcWFBSkZOU0E4VUNJU2ZtcVNNL0thejZqQUhtbkExSUNnMHVhQUZ6U1pwZ0t4K1NtRHJUZTRFMmVLYVRXb2lNbW1NYUFJelQNCi0gRFNHUktha1UwQVNLYWVEVEVSc2Vha2pQeW1zK294QWFjRFVnT0JwYzBnRnpTWnBnT1kvS0tZdjNxcnFJbHBwclFCakdveWFBDQotIEdHbW1rTWdVMUlwcGdQQnFRR2dRdTBHbjR3dkZLd0VRcHdOWkRIWnBjMEFMbWlnUktCbGVhUUtCV3RnQTAwMVFER3FNMGdHbQ0KLSBtR2tNcnFha0JvQWVwcDROTVJJRFR3YUFFMkEwMDhHb2tnSHhqZDFwektGcFcwdUFnNU5TQkJUaXJnT3BEV2dEVFRUUUF3MHcNCi0gMGdHR21tZ1pXQnA0cEFTS2FlRFRFT0JwNE5BRHdhamJyVXlCRWtYV25TVWRBR3IxcWVpQU1Ta05XQWhwaG9BYWFZYVFERFRUDQotIFNHVlJUd2FZRHhUd2FCRHdhZURRQTRHbEs1b2F1SWVvMjBwR2FMYUFLcWdVNmhLd0JTR21BaHBob0FhYVlhUXhocHBwREtnTg0KLSBQRk1CNHA0b0VQRk9CcGdQQnA0TkFod3B3b0FXbG9BS1NnQkRUVFFNWWFZYVFEVFRUU0dBLzluLzJ3Q0VBQW9IQndnSEJnb0kNCi0gQ0FnTENnb0xEaGdRRGcwTkRoMFZGaEVZSXg4bEpDSWZJaUVtS3pjdkppazBLU0VpTUVFeE5EazdQajQrSlM1RVNVTThTRGM5DQotIFBqc0JDZ3NMRGcwT0hCQVFIRHNvSWlnN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzNw0KLSBPenM3T3pzN096czdPenM3Ty8vQUFCRUlBRWdBWUFNQklRQUNFUUVERVFIL3hBR2lBQUFCQlFFQkFRRUJBUUFBQUFBQUFBQUENCi0gQVFJREJBVUdCd2dKQ2dzUUFBSUJBd01DQkFNRkJRUUVBQUFCZlFFQ0F3QUVFUVVTSVRGQkJoTlJZUWNpY1JReWdaR2hDQ05DDQotIHNjRVZVdEh3SkROaWNvSUpDaFlYR0JrYUpTWW5LQ2txTkRVMk56ZzVPa05FUlVaSFNFbEtVMVJWVmxkWVdWcGpaR1ZtWjJocA0KLSBhbk4wZFhaM2VIbDZnNFNGaG9lSWlZcVNrNVNWbHBlWW1acWlvNlNscHFlb3FhcXlzN1MxdHJlNHVickN3OFRGeHNmSXljclMNCi0gMDlUVjF0ZlkyZHJoNHVQazVlYm42T25xOGZMejlQWDI5L2o1K2dFQUF3RUJBUUVCQVFFQkFRQUFBQUFBQUFFQ0F3UUZCZ2NJDQotIENRb0xFUUFDQVFJRUJBTUVCd1VFQkFBQkFuY0FBUUlERVFRRklURUdFa0ZSQjJGeEV5SXlnUWdVUXBHaHNjRUpJek5TOEJWaQ0KLSBjdEVLRmlRMDRTWHhGeGdaR2lZbktDa3FOVFkzT0RrNlEwUkZSa2RJU1VwVFZGVldWMWhaV21Oa1pXWm5hR2xxYzNSMWRuZDQNCi0gZVhxQ2c0U0Zob2VJaVlxU2s1U1ZscGVZbVpxaW82U2xwcWVvcWFxeXM3UzF0cmU0dWJyQ3c4VEZ4c2ZJeWNyUzA5VFYxdGZZDQotIDJkcmk0K1RsNXVmbzZlcnk4L1QxOXZmNCtmci8yZ0FNQXdFQUFoRURFUUEvQUo3U0xnY1ZyMjBJNHJORkd2YlFBQUhGYUVVWA0KLSBTclFpNUhDTWRLazhvWTZWU0pZeDRoanBWYVdNZWxBRkM0aUdEeFdQZFI4bWt4bVJkeGpCckV2SSt0WmpOMjB4dEhOYk5xQWMNCi0gVUlEWGc2Q3IwV0t0Q1k4WEtRT3l6T0IzRktOV3N5Y2VaK2xTNnNZNk5ranZQU2R3SW1CSFVtbXk0cTA3Nm9Dak9PRFdQZGdjDQotIDBNcEdQZEFZTllsNG81ck5qTkt6a3lvclp0WHhpaEFhMXZJRGlwN205RnJiNy80andLY255eGJFek4zaWVKcHBac3laNFUxSA0KLSB1cnpaYXU0bVdWbE5yR2swVXVXUFZhMVlyb1hFSWtIZnJYWmg1VzkwUlduY0FIbXNpNmJKTmRRMFpOdzNCckd1aU1HczJNa3MNCi0gcHVCeld6YnpkT2FFQmVPcFIyb1V0a2s5aFRydTdpdW80bTh3Z2VtS3lxVGkwNHNCc2ZrRWY2OGo4S2xVUVp6OW8vU3VaUmozDQotIEpZcmlBamk0L1NwN1c2aHRiVjJhWGN1NzByYW1veGxlNGdON0hjSVhqYmlzKzRrNU5kYWFhdWhtVmN2MXJIdVc2MURHaUcxbQ0KLSA2YzFzMjAvVG1nQXY1dm1qNTdWS2szK2l4blBjMXhWVjcwaDlDVkp1T3RTckw3MWhGZ3h6U2NVa2tuK2lZLzJxMWk5eERyR1QNCi0gOXkzMXBKNU90ZDFMK0doTXk3bVRyV1hPMlNhcGpSbjI4dlRtdGEzbnhqbWdHT3ZKZDJ3MUtrditpcHovQUJHdU9vdmVZZENlDQotIE9ianJVNnk1cmxzQTh5Y1Vrc24raWovZU5hdzZpSkxOc1c1OXpUSm42ODE2RlA0RUptYk8rU2F6NW02MDJVaklnazRITmFkdg0KLSBMd0thQmwrTXBJTU9NaXBwNDkwU0NKZUY3Q29xUXZGMkp1UnFXUTRZRUdyU2lRSnVLbkhyWEJ5TXBraTczR0ZCTlhJb2g5bjINCi0gU3Jubk9LNk1QVGJkM3NTd0lWRjJxTUNxa3pIbXV5MWxZUm5USHJWR1dwWmFNS0IrQldsYnljWW9RTTBJWkR4elYrR1U4YzFhDQotIElZeTVZK2RuSGF0QXNmc0FIZkFybVMxbVBvaDFnVDh4OXF0azFyUVg3dENlNURJYXB6R3RHQlFtNzFTbHFHV2puSUg2Vm93dA0KLSB6bWhBeS9FM3ZWNkY2dEVNdXhsV0l5QWZyVnhDQ0FPMVZaRUV5WUE0QUFweE5Hd3lKK2xWSlJVc2FLTXc2MVNsRlF6UkFQL1oNCi0NCi1YLUFUVFJJQlVURTpTb21lIFN0cmluZw0KLUJEQVk6MTk4MDAxMDENCi1HRU86MzUuNjU2Mzg1NCwxMzkuNjk5NDIzMw0KLVVSTDpodHRwOi8vd3d3LmV4YW1wbGUuY29tLw0KLVJFVjoyMDA4MDQyNFQxOTUyNDNaDQotRU5EOlZDQVJEClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY29yZS90ZXN0cy9jb3JldGVzdHMvcmVzL3Jhdy92MjFfaW0udmNmIGIvY29yZS90ZXN0cy9jb3JldGVzdHMvcmVzL3Jhdy92MjFfaW0udmNmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYzFhYWJiLi4wMDAwMDAwCi0tLSBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3Jlcy9yYXcvdjIxX2ltLnZjZgorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotQkVHSU46VkNBUkQKLVZFUlNJT046Mi4xCi1YLUFORFJPSUQtQ1VTVE9NOnZuZC5hbmRyb2lkLmN1cnNvci5pdGVtL25pY2tuYW1lO05pY2s7MTs7Ozs7Ozs7Ozs7OzsKLVgtR09PR0xFLVRBTEs6aGhoQGdtYWlsLmNvbQotRU5EOlZDQVJECmRpZmYgLS1naXQgYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9yZXMvcmF3L3YyMV9pbnZhbGlkX2NvbW1lbnRfbGluZS52Y2YgYi9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9yZXMvcmF3L3YyMV9pbnZhbGlkX2NvbW1lbnRfbGluZS52Y2YKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY5MTA3MTAuLjAwMDAwMDAKLS0tIGEvY29yZS90ZXN0cy9jb3JldGVzdHMvcmVzL3Jhdy92MjFfaW52YWxpZF9jb21tZW50X2xpbmUudmNmCisrKyAvZGV2L251bGwKQEAgLTEsMTAgKzAsMCBAQAotQkVHSU46dkNhcmQNCi1WRVJTSU9OOjIuMQ0KLVVJRDozNTcNCi1OOjtDb25mZXJlbmNlIENhbGwNCi1GTjpDb25mZXJlbmNlIENhbGwNCi0jIFRoaXMgbGluZSBtdXN0IGJlIGlnbm9yZWQuDQotTk9URTtFTkNPRElORz1RVU9URUQtUFJJTlRBQkxFOlRoaXMgaXMgYW4gKHNoYXJwIC0+PQ0KLSM8LSBzaGFycCkgZXhhbXBsZS4gVGhpcyBtZXNzYWdlIG11c3QgTk9UIGJlIGlnbm9yZWQuDQotIyBUaGlzIGxpbmUgbXVzdCBiZSBpZ25vcmVkIHRvby4NCi1FTkQ6dkNhcmQNCmRpZmYgLS1naXQgYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9yZXMvcmF3L3YyMV9pbnZhbGlkX211bHRpcGxlX2xpbmUudmNmIGIvY29yZS90ZXN0cy9jb3JldGVzdHMvcmVzL3Jhdy92MjFfaW52YWxpZF9tdWx0aXBsZV9saW5lLnZjZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWM4MWZkNS4uMDAwMDAwMAotLS0gYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9yZXMvcmF3L3YyMV9pbnZhbGlkX211bHRpcGxlX2xpbmUudmNmCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi1CRUdJTjpWQ0FSRAotVkVSU0lPTjoyLjEKLU46O09tZWdhOzs7Ci1FTUFJTDtJTlRFUk5FVDoiT21lZ2EiCi0gIDxvbWVnYUBleGFtcGxlLmNvbT4KLUZOOk9tZWdhCi1FTkQ6VkNBUkQKZGlmZiAtLWdpdCBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3Jlcy9yYXcvdjIxX2phcGFuZXNlXzEudmNmIGIvY29yZS90ZXN0cy9jb3JldGVzdHMvcmVzL3Jhdy92MjFfamFwYW5lc2VfMS52Y2YKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQwNWUyZmYuLjAwMDAwMDAKLS0tIGEvY29yZS90ZXN0cy9jb3JldGVzdHMvcmVzL3Jhdy92MjFfamFwYW5lc2VfMS52Y2YKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLUJFR0lOOlZDQVJEDQotVkVSU0lPTjoyLjENCi1OO0NIQVJTRVQ9U0hJRlRfSklTOojAk6GDjYNDg2g7Ozs7DQotU09VTkQ7WC1JUk1DLU47Q0hBUlNFVD1TSElGVF9KSVM6sd3E3rPbssTeOzs7Ow0KLVRFTDtQUkVGO1ZPSUNFOjAzMDAwMDAwMDANCi1FTkQ6VkNBUkQNCmRpZmYgLS1naXQgYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9yZXMvcmF3L3YyMV9qYXBhbmVzZV8yLnZjZiBiL2NvcmUvdGVzdHMvY29yZXRlc3RzL3Jlcy9yYXcvdjIxX2phcGFuZXNlXzIudmNmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYTU0YWNiLi4wMDAwMDAwCi0tLSBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3Jlcy9yYXcvdjIxX2phcGFuZXNlXzIudmNmCisrKyAvZGV2L251bGwKQEAgLTEsMTAgKzAsMCBAQAotQkVHSU46VkNBUkQNCi1WRVJTSU9OOjIuMQ0KLUZOO0NIQVJTRVQ9U0hJRlRfSklTOojAk6Egg42DQ4NoIDENCi1OO0NIQVJTRVQ9U0hJRlRfSklTOojAk6E7g42DQ4NoMTs7Ow0KLVNPVU5EO1gtSVJNQy1OO0NIQVJTRVQ9U0hJRlRfSklTOrHdxN6zO9uyxN4xOzs7DQotQURSO0hPTUU7Q0hBUlNFVD1TSElGVF9KSVM7RU5DT0RJTkc9UVVPVEVELVBSSU5UQUJMRTo7PTkzPThDPThCPTlFPTkzPTczPQ0KLT04Rj02MT05Mj00QT04Qj1FNj04RD1GNz04Qj03NT05Mj1BQzI2LTE9ODM9NUE9ODM9OEI9ODM9OEE9ODM9NDE9ODM9OTM9DQotPTgzPTVFPTgzPThGPTgxPTVCNj04QT00Qjs7OzsxNTAtODUxMjsNCi1OT1RFO0NIQVJTRVQ9U0hJRlRfSklTO0VOQ09ESU5HPVFVT1RFRC1QUklOVEFCTEU6PTgzPTgxPTgzPTgyDQotRU5EOlZDQVJEDQpkaWZmIC0tZ2l0IGEvY29yZS90ZXN0cy9jb3JldGVzdHMvcmVzL3Jhdy92MjFfbXVsdGlwbGVfZW50cnkudmNmIGIvY29yZS90ZXN0cy9jb3JldGVzdHMvcmVzL3Jhdy92MjFfbXVsdGlwbGVfZW50cnkudmNmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYmJiMTlhLi4wMDAwMDAwCi0tLSBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3Jlcy9yYXcvdjIxX211bHRpcGxlX2VudHJ5LnZjZgorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLUJFR0lOOlZDQVJEDQotVkVSU0lPTjoyLjENCi1OO0NIQVJTRVQ9U0hJRlRfSklTOojAk6GDjYNDg2gzOzs7Ow0KLVNPVU5EO1gtSVJNQy1OO0NIQVJTRVQ9U0hJRlRfSklTOrHdxN6z27LE3jM7Ozs7DQotVEVMO1gtTkVDLVNFQ1JFVDo5DQotVEVMO1gtTkVDLUhPVEVMOjEwDQotVEVMO1gtTkVDLVNDSE9PTDoxMQ0KLVRFTDtIT01FO0ZBWDoxMg0KLUVORDpWQ0FSRA0KLQ0KLQ0KLUJFR0lOOlZDQVJEDQotVkVSU0lPTjoyLjENCi1OO0NIQVJTRVQ9U0hJRlRfSklTOojAk6GDjYNDg2g0Ozs7Ow0KLVNPVU5EO1gtSVJNQy1OO0NIQVJTRVQ9U0hJRlRfSklTOrHdxN6z27LE3jQ7Ozs7DQotVEVMO01PREVNOjEzDQotVEVMO1BBR0VSOjE0DQotVEVMO1gtTkVDLUZBTUlMWToxNQ0KLVRFTDtYLU5FQy1HSVJMOjE2DQotRU5EOlZDQVJEDQotDQotDQotQkVHSU46VkNBUkQNCi1WRVJTSU9OOjIuMQ0KLU47Q0hBUlNFVD1TSElGVF9KSVM6iMCToYONg0ODaDU7Ozs7DQotU09VTkQ7WC1JUk1DLU47Q0hBUlNFVD1TSElGVF9KSVM6sd3E3rPbssTeNTs7OzsNCi1URUw7WC1ORUMtQk9ZOjE3DQotVEVMO1gtTkVDLUZSSUVORDoxOA0KLVRFTDtYLU5FQy1QSFM6MTkNCi1URUw7WC1ORUMtUkVTVEFVUkFOVDoyMA0KLUVORDpWQ0FSRA0KLQ0KLQ0KZGlmZiAtLWdpdCBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3Jlcy9yYXcvdjIxX29yZ19iZWZvcmVfdGl0bGUudmNmIGIvY29yZS90ZXN0cy9jb3JldGVzdHMvcmVzL3Jhdy92MjFfb3JnX2JlZm9yZV90aXRsZS52Y2YKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhmZjExOTAuLjAwMDAwMDAKLS0tIGEvY29yZS90ZXN0cy9jb3JldGVzdHMvcmVzL3Jhdy92MjFfb3JnX2JlZm9yZV90aXRsZS52Y2YKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLUJFR0lOOlZDQVJEDQotVkVSU0lPTjoyLjENCi1GTjpOb3JtYWwgR3V5DQotT1JHOkNvbXBhbnk7T3JnYW5pemF0aW9uO0RldmlzaW9uO1Jvb207U2hlZXQgTm8uDQotVElUTEU6RXhjZWxsZW50IEphbml0b3INCi1FTkQ6VkNBUkQNCmRpZmYgLS1naXQgYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9yZXMvcmF3L3YyMV9wcmVmX2hhbmRsaW5nLnZjZiBiL2NvcmUvdGVzdHMvY29yZXRlc3RzL3Jlcy9yYXcvdjIxX3ByZWZfaGFuZGxpbmcudmNmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MTA1MzEwLi4wMDAwMDAwCi0tLSBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3Jlcy9yYXcvdjIxX3ByZWZfaGFuZGxpbmcudmNmCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotQkVHSU46VkNBUkQKLVZFUlNJT046Mi4xCi1GTjpTbWl0aAotVEVMO0hPTUU6MQotVEVMO1dPUks7UFJFRjoyCi1URUw7SVNETjozCi1FTUFJTDtQUkVGO0hPTUU6dGVzdEBleGFtcGxlLmNvbQotRU1BSUw7Q0VMTDtQUkVGOnRlc3QyQGV4YW1pbmF0aW9uLmNvbQotT1JHOkNvbXBhbnkKLVRJVExFOkVuZ2luZWVyCi1PUkc6TXlzdGVyeQotVElUTEU6QmxvZ2dlcgotT1JHOlBvZXRyeQotVElUTEU6UG9ldAotRU5EOlZDQVJECmRpZmYgLS1naXQgYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9yZXMvcmF3L3YyMV9zaW1wbGVfMS52Y2YgYi9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9yZXMvcmF3L3YyMV9zaW1wbGVfMS52Y2YKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZhYWJiNGMuLjAwMDAwMDAKLS0tIGEvY29yZS90ZXN0cy9jb3JldGVzdHMvcmVzL3Jhdy92MjFfc2ltcGxlXzEudmNmCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi1CRUdJTjpWQ0FSRA0KLU46QW5kbztSb2lkOw0KLUVORDpWQ0FSRA0KZGlmZiAtLWdpdCBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3Jlcy9yYXcvdjIxX3NpbXBsZV8yLnZjZiBiL2NvcmUvdGVzdHMvY29yZXRlc3RzL3Jlcy9yYXcvdjIxX3NpbXBsZV8yLnZjZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjBkNWFiNS4uMDAwMDAwMAotLS0gYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9yZXMvcmF3L3YyMV9zaW1wbGVfMi52Y2YKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLUJFR0lOOlZDQVJEDQotRk46QW5kbyBSb2lkDQotRU5EOlZDQVJEDQpkaWZmIC0tZ2l0IGEvY29yZS90ZXN0cy9jb3JldGVzdHMvcmVzL3Jhdy92MjFfc2ltcGxlXzMudmNmIGIvY29yZS90ZXN0cy9jb3JldGVzdHMvcmVzL3Jhdy92MjFfc2ltcGxlXzMudmNmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZWRkYWJiLi4wMDAwMDAwCi0tLSBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3Jlcy9yYXcvdjIxX3NpbXBsZV8zLnZjZgorKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotQkVHSU46VkNBUkQNCi1OOkFuZG87Um9pZDsNCi1GTjpBbmRvIFJvaWQNCi1FTkQ6VkNBUkQNCmRpZmYgLS1naXQgYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9yZXMvcmF3L3YyMV90aXRsZV9iZWZvcmVfb3JnLnZjZiBiL2NvcmUvdGVzdHMvY29yZXRlc3RzL3Jlcy9yYXcvdjIxX3RpdGxlX2JlZm9yZV9vcmcudmNmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZmRjNzM4Li4wMDAwMDAwCi0tLSBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3Jlcy9yYXcvdjIxX3RpdGxlX2JlZm9yZV9vcmcudmNmCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi1CRUdJTjpWQ0FSRA0KLVZFUlNJT046Mi4xDQotRk46TmljZSBHdXkNCi1USVRMRTpDb29sIFRpdGxlDQotT1JHOk1hcnZlcm91cztQZXJmZWN0O0dyZWF0O0dvb2Q7QmFkO1Bvb3INCi1FTkQ6VkNBUkQNCmRpZmYgLS1naXQgYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9yZXMvcmF3L3YyMV93aW5tb182NS52Y2YgYi9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9yZXMvcmF3L3YyMV93aW5tb182NS52Y2YKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYzODBkMGQuLjAwMDAwMDAKLS0tIGEvY29yZS90ZXN0cy9jb3JldGVzdHMvcmVzL3Jhdy92MjFfd2lubW9fNjUudmNmCisrKyAvZGV2L251bGwKQEAgLTEsMTAgKzAsMCBAQAotQkVHSU46VkNBUkQNCi1WRVJTSU9OOjIuMQ0KLU46RXhhbXBsZTs7OzsNCi1GTjpFeGFtcGxlDQotQU5OSVZFUlNBUlk7VkFMVUU9REFURToyMDA5MTAxMA0KLUFHRU5UOkludmFsaWQgbGluZSB3aGljaCBtdXN0IGJlIGhhbmRsZWQgY29ycmVjdGx5Lg0KLVgtQ0xBU1M6UFVCTElDDQotWC1SRURVQ1RJT046DQotWC1OTzoNCi1FTkQ6VkNBUkQNCmRpZmYgLS1naXQgYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9yZXMvcmF3L3YzMF9jb21tYV9zZXBhcmF0ZWQudmNmIGIvY29yZS90ZXN0cy9jb3JldGVzdHMvcmVzL3Jhdy92MzBfY29tbWFfc2VwYXJhdGVkLnZjZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjFiYWY4OC4uMDAwMDAwMAotLS0gYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9yZXMvcmF3L3YzMF9jb21tYV9zZXBhcmF0ZWQudmNmCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi1CRUdJTjpWQ0FSRA0KLVZFUlNJT046My4wDQotTjtUWVBFPVBSRUYsSE9NRTpGO0c7TTs7DQotVEVMO1RZUEU9IkNPTU1BLFNFUEFSQVRFRDpJTlNJREUuRFFVT1RFIixQUkVGOjENCi1FTkQ6VkNBUkQNCmRpZmYgLS1naXQgYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9yZXMvcmF3L3YzMF9tdWx0aWJ5dGVfcGFyYW0udmNmIGIvY29yZS90ZXN0cy9jb3JldGVzdHMvcmVzL3Jhdy92MzBfbXVsdGlieXRlX3BhcmFtLnZjZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2QyMDBlNS4uMDAwMDAwMAotLS0gYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9yZXMvcmF3L3YzMF9tdWx0aWJ5dGVfcGFyYW0udmNmCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi1CRUdJTjpWQ0FSRA0KLVZFUlNJT046My4wDQotTjpGO0c7TTs7DQotVEVMO1RZUEU9Iui0uSI6MQ0KLUVORDpWQ0FSRA0KZGlmZiAtLWdpdCBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3Jlcy9yYXcvdjMwX3BhZ2VyLnZjZiBiL2NvcmUvdGVzdHMvY29yZXRlc3RzL3Jlcy9yYXcvdjMwX3BhZ2VyLnZjZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOThhN2YyMC4uMDAwMDAwMAotLS0gYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9yZXMvcmF3L3YzMF9wYWdlci52Y2YKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLUJFR0lOOlZDQVJEDQotVkVSU0lPTjozLjANCi1OOkY7RztNOzsNCi1URUw7VFlQRT1QQUdFUixXT1JLLE1TRzo2MTAxMjMxMjM0QHBhZ2Vyc2FtcGxlLmNvbQ0KLUVORDpWQ0FSRA0KZGlmZiAtLWdpdCBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3Jlcy9yYXcvdjMwX3NpbXBsZS52Y2YgYi9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9yZXMvcmF3L3YzMF9zaW1wbGUudmNmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MTg2NjFmLi4wMDAwMDAwCi0tLSBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3Jlcy9yYXcvdjMwX3NpbXBsZS52Y2YKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi1CRUdJTjpWQ0FSRA0KLVZFUlNJT046My4wDQotRk46QW5kIFJvaWQNCi1OOkFuZDtSb2lkOzs7DQotT1JHOk9wZW47SGFuZHNldDsgQWxsaWFuY2UNCi1TT1JULVNUUklORzphbmRyb2lkDQotVEVMO1RZUEU9UFJFRjtUWVBFPVZPSUNFOjAzMDAwMDAwMDANCi1DTEFTUzpQVUJMSUMNCi1YLUdOTzowDQotWC1HTjpncm91cDANCi1YLVJFRFVDVElPTjowDQotUkVWOjIwMDgxMDMxVDA2NTg1NFoNCi1FTkQ6VkNBUkQNCmRpZmYgLS1naXQgYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9yZXMvcmF3L3Y0MF9zb3J0X2FzLnZjZiBiL2NvcmUvdGVzdHMvY29yZXRlc3RzL3Jlcy9yYXcvdjQwX3NvcnRfYXMudmNmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZjZiYzNiLi4wMDAwMDAwCi0tLSBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3Jlcy9yYXcvdjQwX3NvcnRfYXMudmNmCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi1CRUdJTjpWQ0FSRA0KLVZFUlNJT046NC4wDQotRk465a6J6JekIOODreOCpOODiQ0KLU47U09SVC1BUz0i44GC44KT44Gp44GGO+OCjeOBhOOBqSI65a6J6JekO+ODreOCpOODiTs7Ow0KLU9SRztUWVBFPVdPUks7U09SVC1BUz0i44GQ44O844GQ44KLO+OBkeOCk+OBleOBj+OBtuOCguOCkyI644Kw44O844Kw44OrO+aknOe0oumDqOmWgA0KLUVORDpWQ0FSRA0KZGlmZiAtLWdpdCBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL2FjY2Vzc2liaWxpdHlzZXJ2aWNlL0FjY2Vzc2liaWxpdHlUZXN0U2VydmljZS5qYXZhIGIvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvYWNjZXNzaWJpbGl0eXNlcnZpY2UvQWNjZXNzaWJpbGl0eVRlc3RTZXJ2aWNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJhNTFlZWEuLjAwMDAwMDAKLS0tIGEvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvYWNjZXNzaWJpbGl0eXNlcnZpY2UvQWNjZXNzaWJpbGl0eVRlc3RTZXJ2aWNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgYW5kcm9pZC5hY2Nlc3NpYmlsaXR5c2VydmljZTsKLQotaW1wb3J0IGFuZHJvaWQuYWNjZXNzaWJpbGl0eXNlcnZpY2UuQWNjZXNzaWJpbGl0eVNlcnZpY2U7Ci1pbXBvcnQgYW5kcm9pZC5hY2Nlc3NpYmlsaXR5c2VydmljZS5BY2Nlc3NpYmlsaXR5U2VydmljZUluZm87Ci1pbXBvcnQgYW5kcm9pZC5hcHAuTm90aWZpY2F0aW9uOwotaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LmFjY2Vzc2liaWxpdHkuQWNjZXNzaWJpbGl0eUV2ZW50OwotaW1wb3J0IGFuZHJvaWQudmlldy5hY2Nlc3NpYmlsaXR5LkFjY2Vzc2liaWxpdHlNYW5hZ2VyOwotCi1pbXBvcnQgamF2YS51dGlsLlRpbWVyOwotaW1wb3J0IGphdmEudXRpbC5UaW1lclRhc2s7Ci0KLS8qKgotICogVGhpcyBjbGFzcyB0ZXh0IHRoZSBhY2Nlc3NpYmlsaXR5IGZyYW1ld29yayBlbmQgdG8gZW5kLgotICogPHA+Ci0gKiBOb3RlOiBTaW5jZSBhY2Nlc3NpYmlsaXR5IGlzIHByb3ZpZGVkIGJ5IHtAbGluayBBY2Nlc3NpYmlsaXR5U2VydmljZX1zIHdlIGNyZWF0ZSBvbmUsCi0gKiBhbmQgaXQgZ2VuZXJhdGVzIGFuIGV2ZW50IGFuZCBhbiBpbnRlcnJ1cHRpb24gZGlzcGF0Y2hpbmcgdGhlbSB0aHJvdWdoIHRoZQotICoge0BsaW5rIEFjY2Vzc2liaWxpdHlNYW5hZ2VyfS4gV2UgdmVyaWZ5IHRoZSByZWNlaXZlZCByZXN1bHQuIFRvIHRyaWdnZXIgdGhlIHRlc3QKLSAqIGdvIHRvIFNldHRpbmdzLT5BY2Nlc3NpYmlsaXR5IGFuZCBzZWxlY3QgdGhlIGVuYWJsZSBhY2Nlc3NpYmlsaXR5IGNoZWNrIGFuZCB0aGVuCi0gKiBzZWxlY3QgdGhlIGNoZWNrIGZvciB0aGlzIHNlcnZpY2UgKHNhbWUgbmFtZSBhcyB0aGUgY2xhc3MpLgotICovCi1wdWJsaWMgY2xhc3MgQWNjZXNzaWJpbGl0eVRlc3RTZXJ2aWNlIGV4dGVuZHMgQWNjZXNzaWJpbGl0eVNlcnZpY2UgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIExPR19UQUcgPSAiQWNjZXNzaWJpbGl0eVRlc3RTZXJ2aWNlIjsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDTEFTU19OQU1FID0gImZvby5iYXIuYmF6LlRlc3QiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQQUNLQUdFX05BTUUgPSAiZm9vLmJhci5iYXoiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBURVhUID0gIlNvbWUgc3R1ZmYiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCRUZPUkVfVEVYVCA9ICJTb21lIG90aGVyIHN0dWZmIjsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDT05URU5UX0RFU0NSSVBUSU9OID0gIkNvbnRlbnQgZGVzY3JpcHRpb24iOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IElURU1fQ09VTlQgPSAxMDsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQ1VSUkVOVF9JVEVNX0lOREVYID0gMTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgSU5URVJSVVBUX0lOVk9DQVRJT05fVFlQRSA9IDB4MDAwMDAyMDA7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRlJPTV9JTkRFWCA9IDE7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEFEREVEX0NPVU5UID0gMjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUkVNT1ZFRF9DT1VOVCA9IDE7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTk9USUZJQ0FUSU9OX1RJTUVPVVRfTUlMTElTID0gODA7Ci0KLSAgICBwcml2YXRlIGludCBtUmVjZWl2ZWRSZXN1bHQ7Ci0KLSAgICBwcml2YXRlIFRpbWVyIG1UaW1lciA9IG5ldyBUaW1lcigpOwotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgb25TZXJ2aWNlQ29ubmVjdGVkKCkgewotICAgICAgICBBY2Nlc3NpYmlsaXR5U2VydmljZUluZm8gaW5mbyA9IG5ldyBBY2Nlc3NpYmlsaXR5U2VydmljZUluZm8oKTsKLSAgICAgICAgaW5mby5ldmVudFR5cGVzID0gQWNjZXNzaWJpbGl0eUV2ZW50LlRZUEVTX0FMTF9NQVNLOwotICAgICAgICBpbmZvLmZlZWRiYWNrVHlwZSA9IEFjY2Vzc2liaWxpdHlTZXJ2aWNlSW5mby5GRUVEQkFDS19BVURJQkxFOwotICAgICAgICBpbmZvLm5vdGlmaWNhdGlvblRpbWVvdXQgPSBOT1RJRklDQVRJT05fVElNRU9VVF9NSUxMSVM7Ci0gICAgICAgIGluZm8uZmxhZ3MgJj0gQWNjZXNzaWJpbGl0eVNlcnZpY2VJbmZvLkRFRkFVTFQ7Ci0gICAgICAgIHNldFNlcnZpY2VJbmZvKGluZm8pOwotCi0gICAgICAgIC8vIHdlIG5lZWQgdG8gd2FpdCB1bnRpbCB0aGUgc3lzdGVtIHBpY2tzIG91ciBjb25maWd1cmF0aW9uCi0gICAgICAgIC8vIG90aGVyd2lzZSBpdCB3aWxsIG5vdCBub3RpZnkgdXMKLSAgICAgICAgbVRpbWVyLnNjaGVkdWxlKG5ldyBUaW1lclRhc2soKSB7Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICB0ZXN0QWNjZXNzaWJpbGl0eUV2ZW50RGlzcGF0Y2hpbmcoKTsKLSAgICAgICAgICAgICAgICAgICAgdGVzdEludGVycnVwdCgpOwotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIExvZy5lKExPR19UQUcsICJFcnJvciBpbiB0ZXN0aW5nIEFjY2Vzc2liaWxpdHkgZmVhdHVyZSIsIGUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSwgMTAwMCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2hlY2sgaGVyZSBpZiB0aGUgZXZlbnQgd2UgcmVjZWl2ZWQgaXMgYWN0dWFsbHkgdGhlIG9uZSB3ZSBzZW50LgotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIG9uQWNjZXNzaWJpbGl0eUV2ZW50KEFjY2Vzc2liaWxpdHlFdmVudCBldmVudCkgewotICAgICAgICBhc3NlcnQoQWNjZXNzaWJpbGl0eUV2ZW50LlRZUEVfTk9USUZJQ0FUSU9OX1NUQVRFX0NIQU5HRUQgPT0gZXZlbnQuZ2V0RXZlbnRUeXBlKCkpOwotICAgICAgICBhc3NlcnQoZXZlbnQgIT0gbnVsbCk7Ci0gICAgICAgIGFzc2VydChldmVudC5nZXRFdmVudFRpbWUoKSA+IDApOwotICAgICAgICBhc3NlcnQoQ0xBU1NfTkFNRS5lcXVhbHMoZXZlbnQuZ2V0Q2xhc3NOYW1lKCkpKTsKLSAgICAgICAgYXNzZXJ0KFBBQ0tBR0VfTkFNRS5lcXVhbHMoZXZlbnQuZ2V0UGFja2FnZU5hbWUoKSkpOwotICAgICAgICBhc3NlcnQoMSA9PSBldmVudC5nZXRUZXh0KCkuc2l6ZSgpKTsKLSAgICAgICAgYXNzZXJ0KFRFWFQuZXF1YWxzKGV2ZW50LmdldFRleHQoKS5nZXQoMCkpKTsKLSAgICAgICAgYXNzZXJ0KEJFRk9SRV9URVhULmVxdWFscyhldmVudC5nZXRCZWZvcmVUZXh0KCkpKTsKLSAgICAgICAgYXNzZXJ0KGV2ZW50LmlzQ2hlY2tlZCgpKTsKLSAgICAgICAgYXNzZXJ0KENPTlRFTlRfREVTQ1JJUFRJT04uZXF1YWxzKGV2ZW50LmdldENvbnRlbnREZXNjcmlwdGlvbigpKSk7Ci0gICAgICAgIGFzc2VydChJVEVNX0NPVU5UID09IGV2ZW50LmdldEl0ZW1Db3VudCgpKTsKLSAgICAgICAgYXNzZXJ0KENVUlJFTlRfSVRFTV9JTkRFWCA9PSBldmVudC5nZXRDdXJyZW50SXRlbUluZGV4KCkpOwotICAgICAgICBhc3NlcnQoZXZlbnQuaXNFbmFibGVkKCkpOwotICAgICAgICBhc3NlcnQoZXZlbnQuaXNQYXNzd29yZCgpKTsKLSAgICAgICAgYXNzZXJ0KEZST01fSU5ERVggPT0gZXZlbnQuZ2V0RnJvbUluZGV4KCkpOwotICAgICAgICBhc3NlcnQoQURERURfQ09VTlQgPT0gZXZlbnQuZ2V0QWRkZWRDb3VudCgpKTsKLSAgICAgICAgYXNzZXJ0KFJFTU9WRURfQ09VTlQgPT0gZXZlbnQuZ2V0UmVtb3ZlZENvdW50KCkpOwotICAgICAgICBhc3NlcnQoZXZlbnQuZ2V0UGFyY2VsYWJsZURhdGEoKSAhPSBudWxsKTsKLSAgICAgICAgYXNzZXJ0KDEgPT0gKChOb3RpZmljYXRpb24pIGV2ZW50LmdldFBhcmNlbGFibGVEYXRhKCkpLmljb24pOwotCi0gICAgICAgIC8vIHNldCB0aGUgdHlwZSBvZiB0aGUgcmVjZXZlZCByZXF1ZXN0Ci0gICAgICAgIG1SZWNlaXZlZFJlc3VsdCA9IEFjY2Vzc2liaWxpdHlFdmVudC5UWVBFX05PVElGSUNBVElPTl9TVEFURV9DSEFOR0VEOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldCBhIGZsYWcgdGhhdCB3ZSByZWNlaXZlZCB0aGUgaW50ZXJydXB0IHJlcXVlc3QuCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgb25JbnRlcnJ1cHQoKSB7Ci0KLSAgICAgICAgLy8gc2V0IHRoZSB0eXBlIG9mIHRoZSByZWNldmVkIHJlcXVlc3QKLSAgICAgICAgbVJlY2VpdmVkUmVzdWx0ID0gSU5URVJSVVBUX0lOVk9DQVRJT05fVFlQRTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBJZiBhbiB7QGxpbmsgQWNjZXNzaWJpbGl0eUV2ZW50fSBpcyBzZW50IGFuZCByZWNlaXZlZCBjb3JyZWN0bHkuCi0gICAgICovCi0gICBwdWJsaWMgdm9pZCB0ZXN0QWNjZXNzaWJpbGl0eUV2ZW50RGlzcGF0Y2hpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICBBY2Nlc3NpYmlsaXR5RXZlbnQgZXZlbnQgPQotICAgICAgICAgICBBY2Nlc3NpYmlsaXR5RXZlbnQub2J0YWluKEFjY2Vzc2liaWxpdHlFdmVudC5UWVBFX05PVElGSUNBVElPTl9TVEFURV9DSEFOR0VEKTsKLQotICAgICAgIGFzc2VydChldmVudCAhPSBudWxsKTsKLSAgICAgICBldmVudC5zZXRDbGFzc05hbWUoQ0xBU1NfTkFNRSk7Ci0gICAgICAgZXZlbnQuc2V0UGFja2FnZU5hbWUoUEFDS0FHRV9OQU1FKTsKLSAgICAgICBldmVudC5nZXRUZXh0KCkuYWRkKFRFWFQpOwotICAgICAgIGV2ZW50LnNldEJlZm9yZVRleHQoQkVGT1JFX1RFWFQpOwotICAgICAgIGV2ZW50LnNldENoZWNrZWQodHJ1ZSk7Ci0gICAgICAgZXZlbnQuc2V0Q29udGVudERlc2NyaXB0aW9uKENPTlRFTlRfREVTQ1JJUFRJT04pOwotICAgICAgIGV2ZW50LnNldEl0ZW1Db3VudChJVEVNX0NPVU5UKTsKLSAgICAgICBldmVudC5zZXRDdXJyZW50SXRlbUluZGV4KENVUlJFTlRfSVRFTV9JTkRFWCk7Ci0gICAgICAgZXZlbnQuc2V0RW5hYmxlZCh0cnVlKTsKLSAgICAgICBldmVudC5zZXRQYXNzd29yZCh0cnVlKTsKLSAgICAgICBldmVudC5zZXRGcm9tSW5kZXgoRlJPTV9JTkRFWCk7Ci0gICAgICAgZXZlbnQuc2V0QWRkZWRDb3VudChBRERFRF9DT1VOVCk7Ci0gICAgICAgZXZlbnQuc2V0UmVtb3ZlZENvdW50KFJFTU9WRURfQ09VTlQpOwotICAgICAgIGV2ZW50LnNldFBhcmNlbGFibGVEYXRhKG5ldyBOb3RpZmljYXRpb24oMSwgIkZvbyIsIDEyMzQpKTsKLQotICAgICAgIEFjY2Vzc2liaWxpdHlNYW5hZ2VyLmdldEluc3RhbmNlKHRoaXMpLnNlbmRBY2Nlc3NpYmlsaXR5RXZlbnQoZXZlbnQpOwotCi0gICAgICAgYXNzZXJ0KG1SZWNlaXZlZFJlc3VsdCA9PSBldmVudC5nZXRFdmVudFR5cGUoKSk7Ci0KLSAgICAgICBMb2cuaShMT0dfVEFHLCAiQWNjZXNzaWJpbGl0eVRlc3RTZXJ2aWNlI3Rlc3RBY2Nlc3NpYmlsaXR5RXZlbnREaXNwYXRjaGluZzogU3VjY2VzcyIpOwotICAgfQotCi0gICAvKioKLSAgICAqIElmIGFjY2Vzc2liaWxpdHkgZmVlZGJhY2sgaW50ZXJydXB0aW9uIGlzIHRyaWdnZXJlZCBhbmQgcmVjZWl2ZWQgY29ycmVjdGx5LgotICAgICovCi0gICBwdWJsaWMgdm9pZCB0ZXN0SW50ZXJydXB0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgQWNjZXNzaWJpbGl0eU1hbmFnZXIuZ2V0SW5zdGFuY2UodGhpcykuaW50ZXJydXB0KCk7Ci0KLSAgICAgICBhc3NlcnQoSU5URVJSVVBUX0lOVk9DQVRJT05fVFlQRSA9PSBtUmVjZWl2ZWRSZXN1bHQpOwotCi0gICAgICAgTG9nLmkoTE9HX1RBRywgIkFjY2Vzc2liaWxpdHlUZXN0U2VydmljZSN0ZXN0SW50ZXJydXB0OiBTdWNjZXNzIik7Ci0gICB9Ci19Ci0KZGlmZiAtLWdpdCBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL2JsdWV0b290aC9CbHVldG9vdGhTdHJlc3NUZXN0LmphdmEgYi9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9ibHVldG9vdGgvQmx1ZXRvb3RoU3RyZXNzVGVzdC5qYXZhCmluZGV4IDE0OTY4NWMuLmQ4ZDllYmEgMTAwNjQ0Ci0tLSBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL2JsdWV0b290aC9CbHVldG9vdGhTdHJlc3NUZXN0LmphdmEKKysrIGIvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvYmx1ZXRvb3RoL0JsdWV0b290aFN0cmVzc1Rlc3QuamF2YQpAQCAtNzgsNTAgKzc4LDQgQEAKIAogICAgICAgICBtVGVzdFV0aWxzLmRpc2FibGUoYWRhcHRlcik7CiAgICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFBhaXIoKSB7Ci0gICAgICAgIEJsdWV0b290aEFkYXB0ZXIgYWRhcHRlciA9IEJsdWV0b290aEFkYXB0ZXIuZ2V0RGVmYXVsdEFkYXB0ZXIoKTsKLSAgICAgICAgQmx1ZXRvb3RoRGV2aWNlIGRldmljZSA9IGFkYXB0ZXIuZ2V0UmVtb3RlRGV2aWNlKEJsdWV0b290aFRlc3RSdW5uZXIuc0hlYWRzZXRBZGRyZXNzKTsKLQotICAgICAgICBtVGVzdFV0aWxzLmVuYWJsZShhZGFwdGVyKTsKLSAgICAgICAgbVRlc3RVdGlscy5wYWlyKGFkYXB0ZXIsIGRldmljZSk7Ci0gICAgICAgIG1UZXN0VXRpbHMudW5wYWlyKGFkYXB0ZXIsIGRldmljZSk7Ci0gICAgICAgIG1UZXN0VXRpbHMuZGlzYWJsZShhZGFwdGVyKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q29ubmVjdEEyZHAoKSB7Ci0gICAgICAgIGludCBpdGVyYXRpb25zID0gQmx1ZXRvb3RoVGVzdFJ1bm5lci5zQ29ubmVjdEEyZHBJdGVyYXRpb25zOwotICAgICAgICBCbHVldG9vdGhBZGFwdGVyIGFkYXB0ZXIgPSBCbHVldG9vdGhBZGFwdGVyLmdldERlZmF1bHRBZGFwdGVyKCk7Ci0gICAgICAgIEJsdWV0b290aERldmljZSBkZXZpY2UgPSBhZGFwdGVyLmdldFJlbW90ZURldmljZShCbHVldG9vdGhUZXN0UnVubmVyLnNBMmRwQWRkcmVzcyk7Ci0KLSAgICAgICAgbVRlc3RVdGlscy5lbmFibGUoYWRhcHRlcik7Ci0gICAgICAgIG1UZXN0VXRpbHMucGFpcihhZGFwdGVyLCBkZXZpY2UpOwotCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaXRlcmF0aW9uczsgaSsrKSB7Ci0gICAgICAgICAgICBtVGVzdFV0aWxzLndyaXRlT3V0cHV0KCJjb25uZWN0QTJkcCBpdGVyYXRpb24gIiArIChpICsgMSkgKyAiIG9mICIgKyBpdGVyYXRpb25zKTsKLSAgICAgICAgICAgIG1UZXN0VXRpbHMuY29ubmVjdEEyZHAoYWRhcHRlciwgZGV2aWNlKTsKLSAgICAgICAgICAgIG1UZXN0VXRpbHMuZGlzY29ubmVjdEEyZHAoYWRhcHRlciwgZGV2aWNlKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIFRPRE86IFVucGFpciBmcm9tIGRldmljZSBpZiBkZXZpY2UgY2FuIGFjY2VwdCBwYWlyaW5nIGFmdGVyIHVucGFpcmluZwotICAgICAgICBtVGVzdFV0aWxzLmRpc2FibGUoYWRhcHRlcik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdENvbm5lY3RIZWFkc2V0KCkgewotICAgICAgICBpbnQgaXRlcmF0aW9ucyA9IEJsdWV0b290aFRlc3RSdW5uZXIuc0Nvbm5lY3RIZWFkc2V0SXRlcmF0aW9uczsKLSAgICAgICAgQmx1ZXRvb3RoQWRhcHRlciBhZGFwdGVyID0gQmx1ZXRvb3RoQWRhcHRlci5nZXREZWZhdWx0QWRhcHRlcigpOwotICAgICAgICBCbHVldG9vdGhEZXZpY2UgZGV2aWNlID0gYWRhcHRlci5nZXRSZW1vdGVEZXZpY2UoQmx1ZXRvb3RoVGVzdFJ1bm5lci5zSGVhZHNldEFkZHJlc3MpOwotCi0gICAgICAgIG1UZXN0VXRpbHMuZW5hYmxlKGFkYXB0ZXIpOwotICAgICAgICBtVGVzdFV0aWxzLnBhaXIoYWRhcHRlciwgZGV2aWNlKTsKLQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGl0ZXJhdGlvbnM7IGkrKykgewotICAgICAgICAgICAgbVRlc3RVdGlscy53cml0ZU91dHB1dCgiY29ubmVjdEhlYWRzZXQgaXRlcmF0aW9uICIgKyAoaSArIDEpICsgIiBvZiAiICsgaXRlcmF0aW9ucyk7Ci0gICAgICAgICAgICBtVGVzdFV0aWxzLmNvbm5lY3RIZWFkc2V0KGFkYXB0ZXIsIGRldmljZSk7Ci0gICAgICAgICAgICBtVGVzdFV0aWxzLmRpc2Nvbm5lY3RIZWFkc2V0KGFkYXB0ZXIsIGRldmljZSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBUT0RPOiBVbnBhaXIgZnJvbSBkZXZpY2UgaWYgZGV2aWNlIGNhbiBhY2NlcHQgcGFpcmluZyBhZnRlciB1bnBhaXJpbmcKLSAgICAgICAgbVRlc3RVdGlscy5kaXNhYmxlKGFkYXB0ZXIpOwotICAgIH0KIH0KZGlmZiAtLWdpdCBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL2JsdWV0b290aC9CbHVldG9vdGhUZXN0UnVubmVyLmphdmEgYi9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9ibHVldG9vdGgvQmx1ZXRvb3RoVGVzdFJ1bm5lci5qYXZhCmluZGV4IDJlNmRhYTMuLmNmMGZmOTkgMTAwNjQ0Ci0tLSBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL2JsdWV0b290aC9CbHVldG9vdGhUZXN0UnVubmVyLmphdmEKKysrIGIvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvYmx1ZXRvb3RoL0JsdWV0b290aFRlc3RSdW5uZXIuamF2YQpAQCAtMjYsMTEgKzI2LDYgQEAKICAgICBwdWJsaWMgc3RhdGljIGludCBzRW5hYmxlSXRlcmF0aW9ucyA9IDEwMDsKICAgICBwdWJsaWMgc3RhdGljIGludCBzRGlzY292ZXJhYmxlSXRlcmF0aW9ucyA9IDEwMDA7CiAgICAgcHVibGljIHN0YXRpYyBpbnQgc1NjYW5JdGVyYXRpb25zID0gMTAwMDsKLSAgICBwdWJsaWMgc3RhdGljIGludCBzQ29ubmVjdEhlYWRzZXRJdGVyYXRpb25zID0gMTAwOwotICAgIHB1YmxpYyBzdGF0aWMgaW50IHNDb25uZWN0QTJkcEl0ZXJhdGlvbnMgPSAxMDA7Ci0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBzSGVhZHNldEFkZHJlc3MgPSAiIjsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBzQTJkcEFkZHJlc3MgPSAiIjsKIAogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBUZXN0U3VpdGUgZ2V0QWxsVGVzdHMoKSB7CkBAIC03NCwzMyArNjksNSBAQAogICAgICAgICAgICAgICAgIC8vIEludmFsaWQgYXJndW1lbnQsIGZhbGwgYmFjayB0byBkZWZhdWx0IHZhbHVlCiAgICAgICAgICAgICB9CiAgICAgICAgIH0KLQotICAgICAgICB2YWwgPSBhcmd1bWVudHMuZ2V0U3RyaW5nKCJjb25uZWN0X2EyZHBfaXRlcmF0aW9ucyIpOwotICAgICAgICBpZiAodmFsICE9IG51bGwpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgc0Nvbm5lY3RBMmRwSXRlcmF0aW9ucyA9IEludGVnZXIucGFyc2VJbnQodmFsKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgLy8gSW52YWxpZCBhcmd1bWVudCwgZmFsbCBiYWNrIHRvIGRlZmF1bHQgdmFsdWUKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHZhbCA9IGFyZ3VtZW50cy5nZXRTdHJpbmcoImNvbm5lY3RfaGVhZHNldF9pdGVyYXRpb25zIik7Ci0gICAgICAgIGlmICh2YWwgIT0gbnVsbCkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBzQ29ubmVjdEhlYWRzZXRJdGVyYXRpb25zID0gSW50ZWdlci5wYXJzZUludCh2YWwpOwotICAgICAgICAgICAgfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAvLyBJbnZhbGlkIGFyZ3VtZW50LCBmYWxsIGJhY2sgdG8gZGVmYXVsdCB2YWx1ZQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgdmFsID0gYXJndW1lbnRzLmdldFN0cmluZygiaGVhZHNldF9hZGRyZXNzIik7Ci0gICAgICAgIGlmICh2YWwgIT0gbnVsbCkgewotICAgICAgICAgICAgc0hlYWRzZXRBZGRyZXNzID0gdmFsOwotICAgICAgICB9Ci0KLSAgICAgICAgdmFsID0gYXJndW1lbnRzLmdldFN0cmluZygiYTJkcF9hZGRyZXNzIik7Ci0gICAgICAgIGlmICh2YWwgIT0gbnVsbCkgewotICAgICAgICAgICAgc0EyZHBBZGRyZXNzID0gdmFsOwotICAgICAgICB9CiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvYmx1ZXRvb3RoL0JsdWV0b290aFRlc3RVdGlscy5qYXZhIGIvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvYmx1ZXRvb3RoL0JsdWV0b290aFRlc3RVdGlscy5qYXZhCmluZGV4IGU5MzExZTAuLjgyZGU1MDkgMTAwNjQ0Ci0tLSBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL2JsdWV0b290aC9CbHVldG9vdGhUZXN0VXRpbHMuamF2YQorKysgYi9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9ibHVldG9vdGgvQmx1ZXRvb3RoVGVzdFV0aWxzLmphdmEKQEAgLTE2LDcgKzE2LDYgQEAKIAogcGFja2FnZSBhbmRyb2lkLmJsdWV0b290aDsKIAotaW1wb3J0IGFuZHJvaWQuYmx1ZXRvb3RoLkJsdWV0b290aEhlYWRzZXQuU2VydmljZUxpc3RlbmVyOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Ccm9hZGNhc3RSZWNlaXZlcjsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OwpAQCAtNTgsMzYgKzU3LDYgQEAKICAgICAgKi8KICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQ0FOQ0VMX0RJU0NPVkVSWV9USU1FT1VUID0gNTAwMDsKIAotICAgIC8qKgotICAgICAqIFRpbWVvdXQgZm9yIHtAbGluayBCbHVldG9vdGhEZXZpY2UjY3JlYXRlQm9uZCgpfSBpbiBtcy4KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUEFJUl9USU1FT1VUID0gMjAwMDA7Ci0KLSAgICAvKioKLSAgICAgKiBUaW1lb3V0IGZvciB7QGxpbmsgQmx1ZXRvb3RoRGV2aWNlI3JlbW92ZUJvbmQoKX0gaW4gbXMuCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFVOUEFJUl9USU1FT1VUID0gMjAwMDA7Ci0KLSAgICAvKioKLSAgICAgKiBUaW1lb3V0IGZvciB7QGxpbmsgQmx1ZXRvb3RoQTJkcCNjb25uZWN0U2luayhCbHVldG9vdGhEZXZpY2UpfSBpbiBtcy4KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQ09OTkVDVF9BMkRQX1RJTUVPVVQgPSAyMDAwMDsKLQotICAgIC8qKgotICAgICAqIFRpbWVvdXQgZm9yIHtAbGluayBCbHVldG9vdGhBMmRwI2Rpc2Nvbm5lY3RTaW5rKEJsdWV0b290aERldmljZSl9IGluIG1zLgotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBESVNDT05ORUNUX0EyRFBfVElNRU9VVCA9IDIwMDAwOwotCi0gICAgLyoqCi0gICAgICogVGltZW91dCBmb3Ige0BsaW5rIEJsdWV0b290aEhlYWRzZXQjY29ubmVjdEhlYWRzZXQoQmx1ZXRvb3RoRGV2aWNlKX0gaW4gbXMuCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IENPTk5FQ1RfSEVBRFNFVF9USU1FT1VUID0gMjAwMDA7Ci0KLSAgICAvKioKLSAgICAgKiBUaW1lb3V0IGZvciB7QGxpbmsgQmx1ZXRvb3RoSGVhZHNldCNkaXNjb25uZWN0SGVhZHNldChCbHVldG9vdGhEZXZpY2UpfSBpbiBtcy4KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRElTQ09OTkVDVF9IRUFEU0VUX1RJTUVPVVQgPSAyMDAwMDsKLQogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBESVNDT1ZFUllfU1RBUlRFRF9GTEFHID0gMTsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRElTQ09WRVJZX0ZJTklTSEVEX0ZMQUcgPSAxIDw8IDE7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNDQU5fTU9ERV9OT05FX0ZMQUcgPSAxIDw8IDI7CkBAIC05NywyMyArNjYsNiBAQAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTVEFURV9UVVJOSU5HX09OX0ZMQUcgPSAxIDw8IDY7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNUQVRFX09OX0ZMQUcgPSAxIDw8IDc7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNUQVRFX1RVUk5JTkdfT0ZGX0ZMQUcgPSAxIDw8IDg7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFBBSVJfU1RBVEVfRkxBRyA9IDEgPDwgOTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUFJPRklMRV9BMkRQX0ZMQUcgPSAxIDw8IDEwOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBQUk9GSUxFX0hFQURTRVRfRkxBRyA9IDEgPDwgMTE7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUEFJUl9TVEFURV9CT05ERUQgPSAxOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBQQUlSX1NUQVRFX0JPTkRJTkcgPSAxIDw8IDE7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFBBSVJfU1RBVEVfTk9ORSA9IDEgPDwgMjsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBBMkRQX1NUQVRFX0RJU0NPTk5FQ1RFRCA9IDE7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEEyRFBfU1RBVEVfQ09OTkVDVElORyA9IDEgPDwgMTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQTJEUF9TVEFURV9DT05ORUNURUQgPSAxIDw8IDI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEEyRFBfU1RBVEVfRElTQ09OTkVDVElORyA9IDEgPDwgMzsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQTJEUF9TVEFURV9QTEFZSU5HID0gMSA8PCA0OwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEhFQURTRVRfU1RBVEVfRElTQ09OTkVDVEVEID0gMTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgSEVBRFNFVF9TVEFURV9DT05ORUNUSU5HID0gMSA8PCAxOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBIRUFEU0VUX1NUQVRFX0NPTk5FQ1RFRCA9IDEgPDwgMjsKIAogICAgIC8qKgogICAgICAqIFRpbWUgYmV0d2VlbiBwb2xscyBpbiBtcy4KQEAgLTEyNCw0MyArNzYsMTEgQEAKIAogICAgIHByaXZhdGUgQnVmZmVyZWRXcml0ZXIgbU91dHB1dFdyaXRlcjsKIAotICAgIHByaXZhdGUgQmx1ZXRvb3RoQTJkcCBtQTJkcDsKLQotICAgIHByaXZhdGUgQmx1ZXRvb3RoSGVhZHNldCBtSGVhZHNldDsKLQogICAgIHByaXZhdGUgU3RyaW5nIG1PdXRwdXRGaWxlOwogICAgIHByaXZhdGUgU3RyaW5nIG1UYWc7Ci0gICAgcHJpdmF0ZSBjbGFzcyBIZWFkc2V0U2VydmljZUxpc3RlbmVyIGltcGxlbWVudHMgU2VydmljZUxpc3RlbmVyIHsKLSAgICAgICAgcHJpdmF0ZSBib29sZWFuIG1Db25uZWN0ZWQgPSBmYWxzZTsKLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25TZXJ2aWNlQ29ubmVjdGVkKCkgewotICAgICAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7Ci0gICAgICAgICAgICAgICAgbUNvbm5lY3RlZCA9IHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25TZXJ2aWNlRGlzY29ubmVjdGVkKCkgewotICAgICAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7Ci0gICAgICAgICAgICAgICAgbUNvbm5lY3RlZCA9IGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGJvb2xlYW4gaXNDb25uZWN0ZWQoKSB7Ci0gICAgICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbUNvbm5lY3RlZDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgSGVhZHNldFNlcnZpY2VMaXN0ZW5lciBtSGVhZHNldFNlcnZpY2VMaXN0ZW5lciA9IG5ldyBIZWFkc2V0U2VydmljZUxpc3RlbmVyKCk7CiAKICAgICBwcml2YXRlIGNsYXNzIEJsdWV0b290aFJlY2VpdmVyIGV4dGVuZHMgQnJvYWRjYXN0UmVjZWl2ZXIgewogICAgICAgICBwcml2YXRlIGludCBtRmlyZWRGbGFncyA9IDA7Ci0gICAgICAgIHByaXZhdGUgaW50IG1QYWlyRmlyZWRGbGFncyA9IDA7Ci0gICAgICAgIHByaXZhdGUgaW50IG1BMmRwRmlyZWRGbGFncyA9IDA7Ci0gICAgICAgIHByaXZhdGUgaW50IG1IZWFkc2V0RmlyZWRGbGFncyA9IDA7CiAKICAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgIHB1YmxpYyB2b2lkIG9uUmVjZWl2ZShDb250ZXh0IGNvbnRleHQsIEludGVudCBpbnRlbnQpIHsKQEAgLTIwMiw1OCArMTIyLDYgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtRmlyZWRGbGFncyB8PSBTVEFURV9UVVJOSU5HX09GRl9GTEFHOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChCbHVldG9vdGhEZXZpY2UuQUNUSU9OX0JPTkRfU1RBVEVfQ0hBTkdFRC5lcXVhbHMoaW50ZW50LmdldEFjdGlvbigpKSkgewotICAgICAgICAgICAgICAgICAgICBtRmlyZWRGbGFncyB8PSBQQUlSX1NUQVRFX0ZMQUc7Ci0gICAgICAgICAgICAgICAgICAgIGludCBzdGF0ZSA9IGludGVudC5nZXRJbnRFeHRyYShCbHVldG9vdGhEZXZpY2UuRVhUUkFfQk9ORF9TVEFURSwgLTEpOwotICAgICAgICAgICAgICAgICAgICBhc3NlcnROb3RTYW1lKHN0YXRlLCAtMSk7Ci0gICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3RhdGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQmx1ZXRvb3RoRGV2aWNlLkJPTkRfQk9OREVEOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1QYWlyRmlyZWRGbGFncyB8PSBQQUlSX1NUQVRFX0JPTkRFRDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQmx1ZXRvb3RoRGV2aWNlLkJPTkRfQk9ORElORzoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtUGFpckZpcmVkRmxhZ3MgfD0gUEFJUl9TVEFURV9CT05ESU5HOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCbHVldG9vdGhEZXZpY2UuQk9ORF9OT05FOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1QYWlyRmlyZWRGbGFncyB8PSBQQUlSX1NUQVRFX05PTkU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKEJsdWV0b290aEEyZHAuQUNUSU9OX1NJTktfU1RBVEVfQ0hBTkdFRC5lcXVhbHMoaW50ZW50LmdldEFjdGlvbigpKSkgewotICAgICAgICAgICAgICAgICAgICBtRmlyZWRGbGFncyB8PSBQUk9GSUxFX0EyRFBfRkxBRzsKLSAgICAgICAgICAgICAgICAgICAgaW50IHN0YXRlID0gaW50ZW50LmdldEludEV4dHJhKEJsdWV0b290aEEyZHAuRVhUUkFfU0lOS19TVEFURSwgLTEpOwotICAgICAgICAgICAgICAgICAgICBhc3NlcnROb3RTYW1lKHN0YXRlLCAtMSk7Ci0gICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3RhdGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQmx1ZXRvb3RoQTJkcC5TVEFURV9ESVNDT05ORUNURUQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbUEyZHBGaXJlZEZsYWdzIHw9IEEyRFBfU1RBVEVfRElTQ09OTkVDVEVEOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCbHVldG9vdGhBMmRwLlNUQVRFX0NPTk5FQ1RJTkc6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbUEyZHBGaXJlZEZsYWdzIHw9IEEyRFBfU1RBVEVfQ09OTkVDVElORzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQmx1ZXRvb3RoQTJkcC5TVEFURV9DT05ORUNURUQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbUEyZHBGaXJlZEZsYWdzIHw9IEEyRFBfU1RBVEVfQ09OTkVDVEVEOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCbHVldG9vdGhBMmRwLlNUQVRFX0RJU0NPTk5FQ1RJTkc6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbUEyZHBGaXJlZEZsYWdzIHw9IEEyRFBfU1RBVEVfRElTQ09OTkVDVElORzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQmx1ZXRvb3RoQTJkcC5TVEFURV9QTEFZSU5HOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1BMmRwRmlyZWRGbGFncyB8PSBBMkRQX1NUQVRFX1BMQVlJTkc7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKEJsdWV0b290aEhlYWRzZXQuQUNUSU9OX1NUQVRFX0NIQU5HRUQuZXF1YWxzKGludGVudC5nZXRBY3Rpb24oKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgbUZpcmVkRmxhZ3MgfD0gUFJPRklMRV9IRUFEU0VUX0ZMQUc7Ci0gICAgICAgICAgICAgICAgICAgIGludCBzdGF0ZSA9IGludGVudC5nZXRJbnRFeHRyYShCbHVldG9vdGhIZWFkc2V0LkVYVFJBX1NUQVRFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJsdWV0b290aEhlYWRzZXQuU1RBVEVfRVJST1IpOwotICAgICAgICAgICAgICAgICAgICBhc3NlcnROb3RTYW1lKHN0YXRlLCBCbHVldG9vdGhIZWFkc2V0LlNUQVRFX0VSUk9SKTsKLSAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdGF0ZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCbHVldG9vdGhIZWFkc2V0LlNUQVRFX0RJU0NPTk5FQ1RFRDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtSGVhZHNldEZpcmVkRmxhZ3MgfD0gSEVBRFNFVF9TVEFURV9ESVNDT05ORUNURUQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJsdWV0b290aEhlYWRzZXQuU1RBVEVfQ09OTkVDVElORzoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtSGVhZHNldEZpcmVkRmxhZ3MgfD0gSEVBRFNFVF9TVEFURV9DT05ORUNUSU5HOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCbHVldG9vdGhIZWFkc2V0LlNUQVRFX0NPTk5FQ1RFRDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtSGVhZHNldEZpcmVkRmxhZ3MgfD0gSEVBRFNFVF9TVEFURV9DT05ORUNURUQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KQEAgLTI2NCwzMCArMTMyLDkgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCi0gICAgICAgIHB1YmxpYyBpbnQgZ2V0UGFpckZpcmVkRmxhZ3MoKSB7Ci0gICAgICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbVBhaXJGaXJlZEZsYWdzOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGludCBnZXRBMmRwRmlyZWRGbGFncygpIHsKLSAgICAgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgewotICAgICAgICAgICAgICAgIHJldHVybiBtQTJkcEZpcmVkRmxhZ3M7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgaW50IGdldEhlYWRzZXRGaXJlZEZsYWdzKCkgewotICAgICAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG1IZWFkc2V0RmlyZWRGbGFnczsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCiAgICAgICAgIHB1YmxpYyB2b2lkIHJlc2V0RmlyZWRGbGFncygpIHsKICAgICAgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgewogICAgICAgICAgICAgICAgIG1GaXJlZEZsYWdzID0gMDsKLSAgICAgICAgICAgICAgICBtUGFpckZpcmVkRmxhZ3MgPSAwOwotICAgICAgICAgICAgICAgIG1BMmRwRmlyZWRGbGFncyA9IDA7Ci0gICAgICAgICAgICAgICAgbUhlYWRzZXRGaXJlZEZsYWdzID0gMDsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KQEAgLTU3MiwzNTEgKzQxOSw2IEBACiAKICAgICB9CiAKLSAgICBwdWJsaWMgdm9pZCBwYWlyKEJsdWV0b290aEFkYXB0ZXIgYWRhcHRlciwgQmx1ZXRvb3RoRGV2aWNlIGRldmljZSkgewotICAgICAgICBpbnQgbWFzayA9IFBBSVJfU1RBVEVfRkxBRzsKLSAgICAgICAgaW50IHBhaXJNYXNrID0gUEFJUl9TVEFURV9CT05ESU5HIHwgUEFJUl9TVEFURV9CT05ERUQ7Ci0gICAgICAgIG1SZWNlaXZlci5yZXNldEZpcmVkRmxhZ3MoKTsKLQotICAgICAgICBpZiAoIWFkYXB0ZXIuaXNFbmFibGVkKCkpIHsKLSAgICAgICAgICAgIGZhaWwoInBhaXIoKSBibHVldG9vdGggbm90IGVuYWJsZWQiKTsKLSAgICAgICAgfQotCi0gICAgICAgIGludCBzdGF0ZSA9IGRldmljZS5nZXRCb25kU3RhdGUoKTsKLSAgICAgICAgc3dpdGNoIChzdGF0ZSkgewotICAgICAgICAgICAgY2FzZSBCbHVldG9vdGhEZXZpY2UuQk9ORF9CT05ERUQ6Ci0gICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZShhZGFwdGVyLmdldEJvbmRlZERldmljZXMoKS5jb250YWlucyhkZXZpY2UpKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICBjYXNlIEJsdWV0b290aERldmljZS5CT05EX0JPTkRJTkc6Ci0gICAgICAgICAgICAgICAgLy8gRG9uJ3QgY2hlY2sgZm9yIHJlY2VpdmVkIGludGVudHMgc2luY2Ugd2UgbWlnaHQgaGF2ZSBtaXNzZWQgdGhlbS4KLSAgICAgICAgICAgICAgICBtYXNrID0gcGFpck1hc2sgPSAwOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBCbHVldG9vdGhEZXZpY2UuQk9ORF9OT05FOgotICAgICAgICAgICAgICAgIGFzc2VydEZhbHNlKGFkYXB0ZXIuZ2V0Qm9uZGVkRGV2aWNlcygpLmNvbnRhaW5zKGRldmljZSkpOwotICAgICAgICAgICAgICAgIGFzc2VydFRydWUoZGV2aWNlLmNyZWF0ZUJvbmQoKSk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIGZhaWwoInBhaXIoKSBpbnZhbGlkZSBzdGF0ZTogc3RhdGU9IiArIHN0YXRlKTsKLSAgICAgICAgfQotCi0gICAgICAgIGxvbmcgcyA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotICAgICAgICB3aGlsZSAoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLSBzIDwgUEFJUl9USU1FT1VUKSB7Ci0gICAgICAgICAgICBzdGF0ZSA9IGRldmljZS5nZXRCb25kU3RhdGUoKTsKLSAgICAgICAgICAgIGlmIChzdGF0ZSA9PSBCbHVldG9vdGhEZXZpY2UuQk9ORF9CT05ERUQpIHsKLSAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKGFkYXB0ZXIuZ2V0Qm9uZGVkRGV2aWNlcygpLmNvbnRhaW5zKGRldmljZSkpOwotICAgICAgICAgICAgICAgIGlmICgobVJlY2VpdmVyLmdldEZpcmVkRmxhZ3MoKSAmIG1hc2spID09IG1hc2sKLSAgICAgICAgICAgICAgICAgICAgICAgICYmIChtUmVjZWl2ZXIuZ2V0UGFpckZpcmVkRmxhZ3MoKSAmIHBhaXJNYXNrKSA9PSBwYWlyTWFzaykgewotICAgICAgICAgICAgICAgICAgICB3cml0ZU91dHB1dChTdHJpbmcuZm9ybWF0KCJwYWlyKCkgY29tcGxldGVkIGluICVkIG1zOiBkZXZpY2U9JXMiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAtIHMpLCBkZXZpY2UpKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNsZWVwKFBPTExfVElNRSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpbnQgZmlyZWRGbGFncyA9IG1SZWNlaXZlci5nZXRGaXJlZEZsYWdzKCk7Ci0gICAgICAgIGludCBwYWlyRmlyZWRGbGFncyA9IG1SZWNlaXZlci5nZXRQYWlyRmlyZWRGbGFncygpOwotICAgICAgICBtUmVjZWl2ZXIucmVzZXRGaXJlZEZsYWdzKCk7Ci0gICAgICAgIGZhaWwoU3RyaW5nLmZvcm1hdCgicGFpcigpIHRpbWVvdXQ6IHN0YXRlPSVkIChleHBlY3RlZCAlZCksIGZsYWdzPTB4JXggKGV4cGVjdGVkIDB4JXgpLCAiCi0gICAgICAgICAgICAgICAgKyAicGFpckZsYWdzPTB4JXggKGV4cGVjdGVkIDB4JXgpIiwgc3RhdGUsIEJsdWV0b290aERldmljZS5CT05EX0JPTkRFRCwgZmlyZWRGbGFncywKLSAgICAgICAgICAgICAgICBtYXNrLCBwYWlyRmlyZWRGbGFncywgcGFpck1hc2spKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB1bnBhaXIoQmx1ZXRvb3RoQWRhcHRlciBhZGFwdGVyLCBCbHVldG9vdGhEZXZpY2UgZGV2aWNlKSB7Ci0gICAgICAgIGludCBtYXNrID0gUEFJUl9TVEFURV9GTEFHOwotICAgICAgICBpbnQgcGFpck1hc2sgPSBQQUlSX1NUQVRFX05PTkU7Ci0gICAgICAgIG1SZWNlaXZlci5yZXNldEZpcmVkRmxhZ3MoKTsKLQotICAgICAgICBpZiAoIWFkYXB0ZXIuaXNFbmFibGVkKCkpIHsKLSAgICAgICAgICAgIGZhaWwoInVucGFpcigpIGJsdWV0b290aCBub3QgZW5hYmxlZCIpOwotICAgICAgICB9Ci0KLSAgICAgICAgaW50IHN0YXRlID0gZGV2aWNlLmdldEJvbmRTdGF0ZSgpOwotICAgICAgICBzd2l0Y2ggKHN0YXRlKSB7Ci0gICAgICAgICAgICBjYXNlIEJsdWV0b290aERldmljZS5CT05EX0JPTkRFRDoKLSAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKGFkYXB0ZXIuZ2V0Qm9uZGVkRGV2aWNlcygpLmNvbnRhaW5zKGRldmljZSkpOwotICAgICAgICAgICAgICAgIGFzc2VydFRydWUoZGV2aWNlLnJlbW92ZUJvbmQoKSk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIEJsdWV0b290aERldmljZS5CT05EX0JPTkRJTkc6Ci0gICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZShkZXZpY2UucmVtb3ZlQm9uZCgpKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgQmx1ZXRvb3RoRGV2aWNlLkJPTkRfTk9ORToKLSAgICAgICAgICAgICAgICBhc3NlcnRGYWxzZShhZGFwdGVyLmdldEJvbmRlZERldmljZXMoKS5jb250YWlucyhkZXZpY2UpKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIGZhaWwoInVucGFpcigpIGludmFsaWQgc3RhdGU6IHN0YXRlPSIgKyBzdGF0ZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBhc3NlcnRUcnVlKGRldmljZS5yZW1vdmVCb25kKCkpOwotCi0gICAgICAgIGxvbmcgcyA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotICAgICAgICB3aGlsZSAoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLSBzIDwgVU5QQUlSX1RJTUVPVVQpIHsKLSAgICAgICAgICAgIGlmIChkZXZpY2UuZ2V0Qm9uZFN0YXRlKCkgPT0gQmx1ZXRvb3RoRGV2aWNlLkJPTkRfTk9ORSkgewotICAgICAgICAgICAgICAgIGFzc2VydEZhbHNlKGFkYXB0ZXIuZ2V0Qm9uZGVkRGV2aWNlcygpLmNvbnRhaW5zKGRldmljZSkpOwotICAgICAgICAgICAgICAgIGlmICgobVJlY2VpdmVyLmdldEZpcmVkRmxhZ3MoKSAmIG1hc2spID09IG1hc2sKLSAgICAgICAgICAgICAgICAgICAgICAgICYmIChtUmVjZWl2ZXIuZ2V0UGFpckZpcmVkRmxhZ3MoKSAmIHBhaXJNYXNrKSA9PSBwYWlyTWFzaykgewotICAgICAgICAgICAgICAgICAgICB3cml0ZU91dHB1dChTdHJpbmcuZm9ybWF0KCJ1bnBhaXIoKSBjb21wbGV0ZWQgaW4gJWQgbXM6IGRldmljZT0lcyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC0gcyksIGRldmljZSkpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaW50IGZpcmVkRmxhZ3MgPSBtUmVjZWl2ZXIuZ2V0RmlyZWRGbGFncygpOwotICAgICAgICBpbnQgcGFpckZpcmVkRmxhZ3MgPSBtUmVjZWl2ZXIuZ2V0UGFpckZpcmVkRmxhZ3MoKTsKLSAgICAgICAgbVJlY2VpdmVyLnJlc2V0RmlyZWRGbGFncygpOwotICAgICAgICBmYWlsKFN0cmluZy5mb3JtYXQoInVucGFpcigpIHRpbWVvdXQ6IHN0YXRlPSVkIChleHBlY3RlZCAlZCksIGZsYWdzPTB4JXggKGV4cGVjdGVkIDB4JXgpLCAiCi0gICAgICAgICAgICAgICAgKyAicGFpckZsYWdzPTB4JXggKGV4cGVjdGVkIDB4JXgpIiwgc3RhdGUsIEJsdWV0b290aERldmljZS5CT05EX0JPTkRFRCwgZmlyZWRGbGFncywKLSAgICAgICAgICAgICAgICBtYXNrLCBwYWlyRmlyZWRGbGFncywgcGFpck1hc2spKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBjb25uZWN0QTJkcChCbHVldG9vdGhBZGFwdGVyIGFkYXB0ZXIsIEJsdWV0b290aERldmljZSBkZXZpY2UpIHsKLSAgICAgICAgaW50IG1hc2sgPSBQUk9GSUxFX0EyRFBfRkxBRzsKLSAgICAgICAgaW50IGEyZHBNYXNrMSA9IEEyRFBfU1RBVEVfQ09OTkVDVElORyB8IEEyRFBfU1RBVEVfQ09OTkVDVEVEIHwgQTJEUF9TVEFURV9QTEFZSU5HOwotICAgICAgICBpbnQgYTJkcE1hc2syID0gYTJkcE1hc2sxIF4gQTJEUF9TVEFURV9DT05ORUNURUQ7Ci0gICAgICAgIGludCBhMmRwTWFzazMgPSBhMmRwTWFzazEgXiBBMkRQX1NUQVRFX1BMQVlJTkc7Ci0gICAgICAgIG1SZWNlaXZlci5yZXNldEZpcmVkRmxhZ3MoKTsKLQotICAgICAgICBpZiAoIWFkYXB0ZXIuaXNFbmFibGVkKCkpIHsKLSAgICAgICAgICAgIGZhaWwoImNvbm5lY3RBMmRwKCkgYmx1ZXRvb3RoIG5vdCBlbmFibGVkIik7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoIWFkYXB0ZXIuZ2V0Qm9uZGVkRGV2aWNlcygpLmNvbnRhaW5zKGRldmljZSkpIHsKLSAgICAgICAgICAgIGZhaWwoImNvbm5lY3RBMmRwKCkgZGV2aWNlIG5vdCBwYWlyZWQ6IGRldmljZT0iICsgZGV2aWNlKTsKLSAgICAgICAgfQotCi0gICAgICAgIGludCBzdGF0ZSA9IG1BMmRwLmdldFNpbmtTdGF0ZShkZXZpY2UpOwotICAgICAgICBzd2l0Y2ggKHN0YXRlKSB7Ci0gICAgICAgICAgICBjYXNlIEJsdWV0b290aEEyZHAuU1RBVEVfQ09OTkVDVEVEOgotICAgICAgICAgICAgY2FzZSBCbHVldG9vdGhBMmRwLlNUQVRFX1BMQVlJTkc6Ci0gICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZShtQTJkcC5pc1NpbmtDb25uZWN0ZWQoZGV2aWNlKSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgY2FzZSBCbHVldG9vdGhBMmRwLlNUQVRFX0RJU0NPTk5FQ1RJTkc6Ci0gICAgICAgICAgICBjYXNlIEJsdWV0b290aEEyZHAuU1RBVEVfRElTQ09OTkVDVEVEOgotICAgICAgICAgICAgICAgIGFzc2VydEZhbHNlKG1BMmRwLmlzU2lua0Nvbm5lY3RlZChkZXZpY2UpKTsKLSAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKG1BMmRwLmNvbm5lY3RTaW5rKGRldmljZSkpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBCbHVldG9vdGhBMmRwLlNUQVRFX0NPTk5FQ1RJTkc6Ci0gICAgICAgICAgICAgICAgYXNzZXJ0RmFsc2UobUEyZHAuaXNTaW5rQ29ubmVjdGVkKGRldmljZSkpOwotICAgICAgICAgICAgICAgIC8vIERvbid0IGNoZWNrIGZvciByZWNlaXZlZCBpbnRlbnRzIHNpbmNlIHdlIG1pZ2h0IGhhdmUgbWlzc2VkIHRoZW0uCi0gICAgICAgICAgICAgICAgbWFzayA9IGEyZHBNYXNrMSA9IGEyZHBNYXNrMiA9IGEyZHBNYXNrMyA9IDA7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIGZhaWwoImNvbm5lY3RBMmRwKCkgaW52YWxpZCBzdGF0ZTogc3RhdGU9IiArIHN0YXRlKTsKLSAgICAgICAgfQotCi0gICAgICAgIGxvbmcgcyA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotICAgICAgICB3aGlsZSAoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLSBzIDwgQ09OTkVDVF9BMkRQX1RJTUVPVVQpIHsKLSAgICAgICAgICAgIHN0YXRlID0gbUEyZHAuZ2V0U2lua1N0YXRlKGRldmljZSk7Ci0gICAgICAgICAgICBpZiAoc3RhdGUgPT0gQmx1ZXRvb3RoQTJkcC5TVEFURV9DT05ORUNURUQgfHwgc3RhdGUgPT0gQmx1ZXRvb3RoQTJkcC5TVEFURV9QTEFZSU5HKSB7Ci0gICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZShtQTJkcC5pc1NpbmtDb25uZWN0ZWQoZGV2aWNlKSk7Ci0gICAgICAgICAgICAgICAgLy8gQ2hlY2sgd2hldGhlciBTVEFURV9DT05ORUNUSU5HIGFuZCAoU1RBVEVfQ09OTkVDVEVEIG9yIFNUQVRFX1BMQVlJTkcpIGludGVudHMKLSAgICAgICAgICAgICAgICAvLyBoYXZlIGZpcmVkIGlmIHdlIGFyZSBjaGVja2luZyBpZiBpbnRlbnRzIHNob3VsZCBiZSBmaXJlZC4KLSAgICAgICAgICAgICAgICBpbnQgZmlyZWRGbGFncyA9IG1SZWNlaXZlci5nZXRGaXJlZEZsYWdzKCk7Ci0gICAgICAgICAgICAgICAgaW50IGEyZHBGaXJlZEZsYWdzID0gbVJlY2VpdmVyLmdldEEyZHBGaXJlZEZsYWdzKCk7Ci0gICAgICAgICAgICAgICAgaWYgKChtUmVjZWl2ZXIuZ2V0RmlyZWRGbGFncygpICYgbWFzaykgPT0gbWFzawotICAgICAgICAgICAgICAgICAgICAgICAgJiYgKChhMmRwRmlyZWRGbGFncyAmIGEyZHBNYXNrMSkgPT0gYTJkcE1hc2sxCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IChhMmRwRmlyZWRGbGFncyAmIGEyZHBNYXNrMikgPT0gYTJkcE1hc2syCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IChhMmRwRmlyZWRGbGFncyAmIGEyZHBNYXNrMykgPT0gYTJkcE1hc2szKSkgewotICAgICAgICAgICAgICAgICAgICBtUmVjZWl2ZXIucmVzZXRGaXJlZEZsYWdzKCk7Ci0gICAgICAgICAgICAgICAgICAgIHdyaXRlT3V0cHV0KFN0cmluZy5mb3JtYXQoImNvbm5lY3RBMmRwKCkgY29tcGxldGVkIGluICVkIG1zOiBkZXZpY2U9JXMiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAtIHMpLCBkZXZpY2UpKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNsZWVwKFBPTExfVElNRSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpbnQgZmlyZWRGbGFncyA9IG1SZWNlaXZlci5nZXRGaXJlZEZsYWdzKCk7Ci0gICAgICAgIGludCBhMmRwRmlyZWRGbGFncyA9IG1SZWNlaXZlci5nZXRBMmRwRmlyZWRGbGFncygpOwotICAgICAgICBtUmVjZWl2ZXIucmVzZXRGaXJlZEZsYWdzKCk7Ci0gICAgICAgIGZhaWwoU3RyaW5nLmZvcm1hdCgiY29ubmVjdEEyZHAoKSB0aW1lb3V0OiBzdGF0ZT0lZCAoZXhwZWN0ZWQgJWQgb3IgJWQpLCAiCi0gICAgICAgICAgICAgICAgKyAiZmxhZ3M9MHgleCAoZXhwZWN0ZWQgMHgleCksIGEyZHBGbGFncz0weCV4IChleHBlY3RlZCAweCV4IG9yIDB4JXggb3IgMHgleCkiLAotICAgICAgICAgICAgICAgIHN0YXRlLCBCbHVldG9vdGhIZWFkc2V0LlNUQVRFX0NPTk5FQ1RFRCwgQmx1ZXRvb3RoQTJkcC5TVEFURV9QTEFZSU5HLCBmaXJlZEZsYWdzLAotICAgICAgICAgICAgICAgIG1hc2ssIGEyZHBGaXJlZEZsYWdzLCBhMmRwTWFzazEsIGEyZHBNYXNrMiwgYTJkcE1hc2szKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZGlzY29ubmVjdEEyZHAoQmx1ZXRvb3RoQWRhcHRlciBhZGFwdGVyLCBCbHVldG9vdGhEZXZpY2UgZGV2aWNlKSB7Ci0gICAgICAgIGludCBtYXNrID0gUFJPRklMRV9BMkRQX0ZMQUc7Ci0gICAgICAgIGludCBhMmRwTWFzayA9IEEyRFBfU1RBVEVfRElTQ09OTkVDVElORyB8IEEyRFBfU1RBVEVfRElTQ09OTkVDVEVEOwotICAgICAgICBtUmVjZWl2ZXIucmVzZXRGaXJlZEZsYWdzKCk7Ci0KLSAgICAgICAgaWYgKCFhZGFwdGVyLmlzRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICBmYWlsKCJkaXNjb25uZWN0QTJkcCgpIGJsdWV0b290aCBub3QgZW5hYmxlZCIpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCFhZGFwdGVyLmdldEJvbmRlZERldmljZXMoKS5jb250YWlucyhkZXZpY2UpKSB7Ci0gICAgICAgICAgICBmYWlsKCJkaXNjb25uZWN0QTJkcCgpIGRldmljZSBub3QgcGFpcmVkOiBkZXZpY2U9IiArIGRldmljZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpbnQgc3RhdGUgPSBtQTJkcC5nZXRTaW5rU3RhdGUoZGV2aWNlKTsKLSAgICAgICAgc3dpdGNoIChzdGF0ZSkgewotICAgICAgICAgICAgY2FzZSBCbHVldG9vdGhBMmRwLlNUQVRFX0RJU0NPTk5FQ1RFRDoKLSAgICAgICAgICAgICAgICBhc3NlcnRGYWxzZShtQTJkcC5pc1NpbmtDb25uZWN0ZWQoZGV2aWNlKSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgY2FzZSBCbHVldG9vdGhBMmRwLlNUQVRFX0NPTk5FQ1RFRDoKLSAgICAgICAgICAgIGNhc2UgQmx1ZXRvb3RoQTJkcC5TVEFURV9QTEFZSU5HOgotICAgICAgICAgICAgICAgIGFzc2VydFRydWUobUEyZHAuaXNTaW5rQ29ubmVjdGVkKGRldmljZSkpOwotICAgICAgICAgICAgICAgIGFzc2VydFRydWUobUEyZHAuZGlzY29ubmVjdFNpbmsoZGV2aWNlKSk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIEJsdWV0b290aEEyZHAuU1RBVEVfQ09OTkVDVElORzoKLSAgICAgICAgICAgICAgICBhc3NlcnRGYWxzZShtQTJkcC5pc1NpbmtDb25uZWN0ZWQoZGV2aWNlKSk7Ci0gICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZShtQTJkcC5kaXNjb25uZWN0U2luayhkZXZpY2UpKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgQmx1ZXRvb3RoQTJkcC5TVEFURV9ESVNDT05ORUNUSU5HOgotICAgICAgICAgICAgICAgIGFzc2VydEZhbHNlKG1BMmRwLmlzU2lua0Nvbm5lY3RlZChkZXZpY2UpKTsKLSAgICAgICAgICAgICAgICAvLyBEb24ndCBjaGVjayBmb3IgcmVjZWl2ZWQgaW50ZW50cyBzaW5jZSB3ZSBtaWdodCBoYXZlIG1pc3NlZCB0aGVtLgotICAgICAgICAgICAgICAgIG1hc2sgPSBhMmRwTWFzayA9IDA7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIGZhaWwoImRpc2Nvbm5lY3RBMmRwKCkgaW52YWxpZCBzdGF0ZTogc3RhdGU9IiArIHN0YXRlKTsKLSAgICAgICAgfQotCi0gICAgICAgIGxvbmcgcyA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotICAgICAgICB3aGlsZSAoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLSBzIDwgRElTQ09OTkVDVF9BMkRQX1RJTUVPVVQpIHsKLSAgICAgICAgICAgIHN0YXRlID0gbUEyZHAuZ2V0U2lua1N0YXRlKGRldmljZSk7Ci0gICAgICAgICAgICBpZiAoc3RhdGUgPT0gQmx1ZXRvb3RoQTJkcC5TVEFURV9ESVNDT05ORUNURUQpIHsKLSAgICAgICAgICAgICAgICBhc3NlcnRGYWxzZShtQTJkcC5pc1NpbmtDb25uZWN0ZWQoZGV2aWNlKSk7Ci0gICAgICAgICAgICAgICAgaWYgKChtUmVjZWl2ZXIuZ2V0RmlyZWRGbGFncygpICYgbWFzaykgPT0gbWFzawotICAgICAgICAgICAgICAgICAgICAgICAgJiYgKG1SZWNlaXZlci5nZXRBMmRwRmlyZWRGbGFncygpICYgYTJkcE1hc2spID09IGEyZHBNYXNrKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1SZWNlaXZlci5yZXNldEZpcmVkRmxhZ3MoKTsKLSAgICAgICAgICAgICAgICAgICAgd3JpdGVPdXRwdXQoU3RyaW5nLmZvcm1hdCgiZGlzY29ubmVjdEEyZHAoKSBjb21wbGV0ZWQgaW4gJWQgbXM6IGRldmljZT0lcyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC0gcyksIGRldmljZSkpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2xlZXAoUE9MTF9USU1FKTsKLSAgICAgICAgfQotCi0gICAgICAgIGludCBmaXJlZEZsYWdzID0gbVJlY2VpdmVyLmdldEZpcmVkRmxhZ3MoKTsKLSAgICAgICAgaW50IGEyZHBGaXJlZEZsYWdzID0gbVJlY2VpdmVyLmdldEEyZHBGaXJlZEZsYWdzKCk7Ci0gICAgICAgIG1SZWNlaXZlci5yZXNldEZpcmVkRmxhZ3MoKTsKLSAgICAgICAgZmFpbChTdHJpbmcuZm9ybWF0KCJkaXNjb25uZWN0QTJkcCgpIHRpbWVvdXQ6IHN0YXRlPSVkIChleHBlY3RlZCAlZCksICIKLSAgICAgICAgICAgICAgICArICJmbGFncz0weCV4IChleHBlY3RlZCAweCV4KSwgYTJkcEZsYWdzPTB4JXggKGV4cGVjdGVkIDB4JXgpIiwgc3RhdGUsCi0gICAgICAgICAgICAgICAgQmx1ZXRvb3RoQTJkcC5TVEFURV9ESVNDT05ORUNURUQsIGZpcmVkRmxhZ3MsIG1hc2ssIGEyZHBGaXJlZEZsYWdzLCBhMmRwTWFzaykpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGNvbm5lY3RIZWFkc2V0KEJsdWV0b290aEFkYXB0ZXIgYWRhcHRlciwgQmx1ZXRvb3RoRGV2aWNlIGRldmljZSkgewotICAgICAgICBpbnQgbWFzayA9IFBST0ZJTEVfSEVBRFNFVF9GTEFHOwotICAgICAgICBpbnQgaGVhZHNldE1hc2sgPSBIRUFEU0VUX1NUQVRFX0NPTk5FQ1RJTkcgfCBIRUFEU0VUX1NUQVRFX0NPTk5FQ1RFRDsKLSAgICAgICAgbVJlY2VpdmVyLnJlc2V0RmlyZWRGbGFncygpOwotCi0gICAgICAgIGlmICghYWRhcHRlci5pc0VuYWJsZWQoKSkgewotICAgICAgICAgICAgZmFpbCgiY29ubmVjdEhlYWRzZXQoKSBibHVldG9vdGggbm90IGVuYWJsZWQiKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICghYWRhcHRlci5nZXRCb25kZWREZXZpY2VzKCkuY29udGFpbnMoZGV2aWNlKSkgewotICAgICAgICAgICAgZmFpbCgiY29ubmVjdEhlYWRzZXQoKSBkZXZpY2Ugbm90IHBhaXJlZDogZGV2aWNlPSIgKyBkZXZpY2UpOwotICAgICAgICB9Ci0KLSAgICAgICAgd2hpbGUgKCFtSGVhZHNldFNlcnZpY2VMaXN0ZW5lci5pc0Nvbm5lY3RlZCgpKSB7Ci0gICAgICAgICAgICBzbGVlcChQT0xMX1RJTUUpOwotICAgICAgICB9Ci0KLSAgICAgICAgaW50IHN0YXRlID0gbUhlYWRzZXQuZ2V0U3RhdGUoZGV2aWNlKTsKLSAgICAgICAgc3dpdGNoIChzdGF0ZSkgewotICAgICAgICAgICAgY2FzZSBCbHVldG9vdGhIZWFkc2V0LlNUQVRFX0NPTk5FQ1RFRDoKLSAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKG1IZWFkc2V0LmlzQ29ubmVjdGVkKGRldmljZSkpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIGNhc2UgQmx1ZXRvb3RoSGVhZHNldC5TVEFURV9ESVNDT05ORUNURUQ6Ci0gICAgICAgICAgICAgICAgYXNzZXJ0RmFsc2UobUhlYWRzZXQuaXNDb25uZWN0ZWQoZGV2aWNlKSk7Ci0gICAgICAgICAgICAgICAgbUhlYWRzZXQuY29ubmVjdEhlYWRzZXQoZGV2aWNlKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgQmx1ZXRvb3RoSGVhZHNldC5TVEFURV9DT05ORUNUSU5HOgotICAgICAgICAgICAgICAgIGFzc2VydEZhbHNlKG1IZWFkc2V0LmlzQ29ubmVjdGVkKGRldmljZSkpOwotICAgICAgICAgICAgICAgIC8vIERvbid0IGNoZWNrIGZvciByZWNlaXZlZCBpbnRlbnRzIHNpbmNlIHdlIG1pZ2h0IGhhdmUgbWlzc2VkIHRoZW0uCi0gICAgICAgICAgICAgICAgbWFzayA9IGhlYWRzZXRNYXNrID0gMDsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgQmx1ZXRvb3RoSGVhZHNldC5TVEFURV9FUlJPUjoKLSAgICAgICAgICAgICAgICBmYWlsKCJjb25uZWN0SGVhZHNldCgpIGVycm9yIHN0YXRlIik7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIGZhaWwoImNvbm5lY3RIZWFkc2V0KCkgaW52YWxpZCBzdGF0ZTogc3RhdGU9IiArIHN0YXRlKTsKLSAgICAgICAgfQotCi0gICAgICAgIGxvbmcgcyA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotICAgICAgICB3aGlsZSAoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLSBzIDwgQ09OTkVDVF9IRUFEU0VUX1RJTUVPVVQpIHsKLSAgICAgICAgICAgIHN0YXRlID0gbUhlYWRzZXQuZ2V0U3RhdGUoZGV2aWNlKTsKLSAgICAgICAgICAgIGlmIChzdGF0ZSA9PSBCbHVldG9vdGhIZWFkc2V0LlNUQVRFX0NPTk5FQ1RFRCkgewotICAgICAgICAgICAgICAgIGFzc2VydFRydWUobUhlYWRzZXQuaXNDb25uZWN0ZWQoZGV2aWNlKSk7Ci0gICAgICAgICAgICAgICAgaWYgKChtUmVjZWl2ZXIuZ2V0RmlyZWRGbGFncygpICYgbWFzaykgPT0gbWFzawotICAgICAgICAgICAgICAgICAgICAgICAgJiYgKG1SZWNlaXZlci5nZXRIZWFkc2V0RmlyZWRGbGFncygpICYgaGVhZHNldE1hc2spID09IGhlYWRzZXRNYXNrKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1SZWNlaXZlci5yZXNldEZpcmVkRmxhZ3MoKTsKLSAgICAgICAgICAgICAgICAgICAgd3JpdGVPdXRwdXQoU3RyaW5nLmZvcm1hdCgiY29ubmVjdEhlYWRzZXQoKSBjb21wbGV0ZWQgaW4gJWQgbXM6IGRldmljZT0lcyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC0gcyksIGRldmljZSkpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2xlZXAoUE9MTF9USU1FKTsKLSAgICAgICAgfQotCi0gICAgICAgIGludCBmaXJlZEZsYWdzID0gbVJlY2VpdmVyLmdldEZpcmVkRmxhZ3MoKTsKLSAgICAgICAgaW50IGhlYWRzZXRGaXJlZEZsYWdzID0gbVJlY2VpdmVyLmdldEhlYWRzZXRGaXJlZEZsYWdzKCk7Ci0gICAgICAgIG1SZWNlaXZlci5yZXNldEZpcmVkRmxhZ3MoKTsKLSAgICAgICAgZmFpbChTdHJpbmcuZm9ybWF0KCJjb25uZWN0SGVhZHNldCgpIHRpbWVvdXQ6IHN0YXRlPSVkIChleHBlY3RlZCAlZCksICIKLSAgICAgICAgICAgICAgICArICJmbGFncz0weCV4IChleHBlY3RlZCAweCV4KSwgaGVhZHNldEZsYWdzPTB4JXMgKGV4cGVjdGVkIDB4JXgpIiwgc3RhdGUsCi0gICAgICAgICAgICAgICAgQmx1ZXRvb3RoSGVhZHNldC5TVEFURV9DT05ORUNURUQsIGZpcmVkRmxhZ3MsIG1hc2ssIGhlYWRzZXRGaXJlZEZsYWdzLAotICAgICAgICAgICAgICAgIGhlYWRzZXRNYXNrKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZGlzY29ubmVjdEhlYWRzZXQoQmx1ZXRvb3RoQWRhcHRlciBhZGFwdGVyLCBCbHVldG9vdGhEZXZpY2UgZGV2aWNlKSB7Ci0gICAgICAgIGludCBtYXNrID0gUFJPRklMRV9IRUFEU0VUX0ZMQUc7Ci0gICAgICAgIGludCBoZWFkc2V0TWFzayA9IEhFQURTRVRfU1RBVEVfRElTQ09OTkVDVEVEOwotICAgICAgICBtUmVjZWl2ZXIucmVzZXRGaXJlZEZsYWdzKCk7Ci0KLSAgICAgICAgaWYgKCFhZGFwdGVyLmlzRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICBmYWlsKCJkaXNjb25uZWN0SGVhZHNldCgpIGJsdWV0b290aCBub3QgZW5hYmxlZCIpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCFhZGFwdGVyLmdldEJvbmRlZERldmljZXMoKS5jb250YWlucyhkZXZpY2UpKSB7Ci0gICAgICAgICAgICBmYWlsKCJkaXNjb25uZWN0SGVhZHNldCgpIGRldmljZSBub3QgcGFpcmVkOiBkZXZpY2U9IiArIGRldmljZSk7Ci0gICAgICAgIH0KLQotICAgICAgICB3aGlsZSAoIW1IZWFkc2V0U2VydmljZUxpc3RlbmVyLmlzQ29ubmVjdGVkKCkpIHsKLSAgICAgICAgICAgIHNsZWVwKFBPTExfVElNRSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpbnQgc3RhdGUgPSBtSGVhZHNldC5nZXRTdGF0ZShkZXZpY2UpOwotICAgICAgICBzd2l0Y2ggKHN0YXRlKSB7Ci0gICAgICAgICAgICBjYXNlIEJsdWV0b290aEhlYWRzZXQuU1RBVEVfQ09OTkVDVEVEOgotICAgICAgICAgICAgICAgIG1IZWFkc2V0LmRpc2Nvbm5lY3RIZWFkc2V0KGRldmljZSk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIEJsdWV0b290aEhlYWRzZXQuU1RBVEVfQ09OTkVDVElORzoKLSAgICAgICAgICAgICAgICBtSGVhZHNldC5kaXNjb25uZWN0SGVhZHNldChkZXZpY2UpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBCbHVldG9vdGhIZWFkc2V0LlNUQVRFX0RJU0NPTk5FQ1RFRDoKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICBjYXNlIEJsdWV0b290aEhlYWRzZXQuU1RBVEVfRVJST1I6Ci0gICAgICAgICAgICAgICAgZmFpbCgiZGlzY29ubmVjdEhlYWRzZXQoKSBlcnJvciBzdGF0ZSIpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICBmYWlsKCJkaXNjb25uZWN0SGVhZHNldCgpIGludmFsaWQgc3RhdGU6IHN0YXRlPSIgKyBzdGF0ZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBsb25nIHMgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLSAgICAgICAgd2hpbGUgKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC0gcyA8IERJU0NPTk5FQ1RfSEVBRFNFVF9USU1FT1VUKSB7Ci0gICAgICAgICAgICBzdGF0ZSA9IG1IZWFkc2V0LmdldFN0YXRlKGRldmljZSk7Ci0gICAgICAgICAgICBpZiAoc3RhdGUgPT0gQmx1ZXRvb3RoSGVhZHNldC5TVEFURV9ESVNDT05ORUNURUQpIHsKLSAgICAgICAgICAgICAgICBhc3NlcnRGYWxzZShtSGVhZHNldC5pc0Nvbm5lY3RlZChkZXZpY2UpKTsKLSAgICAgICAgICAgICAgICBpZiAoKG1SZWNlaXZlci5nZXRGaXJlZEZsYWdzKCkgJiBtYXNrKSA9PSBtYXNrCi0gICAgICAgICAgICAgICAgICAgICAgICAmJiAobVJlY2VpdmVyLmdldEhlYWRzZXRGaXJlZEZsYWdzKCkgJiBoZWFkc2V0TWFzaykgPT0gaGVhZHNldE1hc2spIHsKLSAgICAgICAgICAgICAgICAgICAgbVJlY2VpdmVyLnJlc2V0RmlyZWRGbGFncygpOwotICAgICAgICAgICAgICAgICAgICB3cml0ZU91dHB1dChTdHJpbmcuZm9ybWF0KCJkaXNjb25uZWN0SGVhZHNldCgpIGNvbXBsZXRlZCBpbiAlZCBtczogZGV2aWNlPSVzIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLSBzKSwgZGV2aWNlKSk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzbGVlcChQT0xMX1RJTUUpOwotICAgICAgICB9Ci0KLSAgICAgICAgaW50IGZpcmVkRmxhZ3MgPSBtUmVjZWl2ZXIuZ2V0RmlyZWRGbGFncygpOwotICAgICAgICBpbnQgaGVhZHNldEZpcmVkRmxhZ3MgPSBtUmVjZWl2ZXIuZ2V0SGVhZHNldEZpcmVkRmxhZ3MoKTsKLSAgICAgICAgbVJlY2VpdmVyLnJlc2V0RmlyZWRGbGFncygpOwotICAgICAgICBmYWlsKFN0cmluZy5mb3JtYXQoImRpc2Nvbm5lY3RIZWFkc2V0KCkgdGltZW91dDogc3RhdGU9JWQgKGV4cGVjdGVkICVkKSwgIgotICAgICAgICAgICAgICAgICsgImZsYWdzPTB4JXggKGV4cGVjdGVkIDB4JXgpLCBoZWFkc2V0RmxhZ3M9MHglcyAoZXhwZWN0ZWQgMHgleCkiLCBzdGF0ZSwKLSAgICAgICAgICAgICAgICBCbHVldG9vdGhIZWFkc2V0LlNUQVRFX0RJU0NPTk5FQ1RFRCwgZmlyZWRGbGFncywgbWFzaywgaGVhZHNldEZpcmVkRmxhZ3MsCi0gICAgICAgICAgICAgICAgaGVhZHNldE1hc2spKTsKLSAgICB9Ci0KICAgICBwdWJsaWMgdm9pZCB3cml0ZU91dHB1dChTdHJpbmcgcykgewogICAgICAgICBMb2cuaShtVGFnLCBzKTsKICAgICAgICAgaWYgKG1PdXRwdXRXcml0ZXIgPT0gbnVsbCkgewpkaWZmIC0tZ2l0IGEvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvY29udGVudC9NZW1vcnlGaWxlUHJvdmlkZXIuamF2YSBiL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL2NvbnRlbnQvTWVtb3J5RmlsZVByb3ZpZGVyLmphdmEKaW5kZXggYzRiYzc2Ny4uNzM1MzBkNyAxMDA2NDQKLS0tIGEvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvY29udGVudC9NZW1vcnlGaWxlUHJvdmlkZXIuamF2YQorKysgYi9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9jb250ZW50L01lbW9yeUZpbGVQcm92aWRlci5qYXZhCkBAIC0xNiwxNiArMTYsMTEgQEAKIAogcGFja2FnZSBhbmRyb2lkLmNvbnRlbnQ7CiAKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZW50VmFsdWVzOwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5VcmlNYXRjaGVyOwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuQXNzZXRGaWxlRGVzY3JpcHRvcjsKIGltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLkN1cnNvcjsKK2ltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLkRhdGFiYXNlVXRpbHM7CiBpbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGUuU1FMaXRlRGF0YWJhc2U7CiBpbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGUuU1FMaXRlT3BlbkhlbHBlcjsKIGltcG9ydCBhbmRyb2lkLm5ldC5Vcmk7Ci1pbXBvcnQgYW5kcm9pZC5vcy5NZW1vcnlGaWxlOwogaW1wb3J0IGFuZHJvaWQub3MuUGFyY2VsRmlsZURlc2NyaXB0b3I7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKIApAQCAtMTM0LDY0ICsxMjksMzQgQEAKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgQXNzZXRGaWxlRGVzY3JpcHRvciBvcGVuQXNzZXRGaWxlKFVyaSB1cmwsIFN0cmluZyBtb2RlKSB0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uIHsKKyAgICBwdWJsaWMgUGFyY2VsRmlsZURlc2NyaXB0b3Igb3BlbkZpbGUoVXJpIHVybCwgU3RyaW5nIG1vZGUpIHRocm93cyBGaWxlTm90Rm91bmRFeGNlcHRpb24gewogICAgICAgICBpbnQgbWF0Y2ggPSBzVVJMTWF0Y2hlci5tYXRjaCh1cmwpOwogICAgICAgICBzd2l0Y2ggKG1hdGNoKSB7CiAgICAgICAgICAgICBjYXNlIERBVEFfSURfQkxPQjoKICAgICAgICAgICAgICAgICBTdHJpbmcgc3FsID0gIlNFTEVDVCBfYmxvYiBGUk9NIGRhdGEgV0hFUkUgX2lkPSIgKyB1cmwuZ2V0UGF0aFNlZ21lbnRzKCkuZ2V0KDEpOwotICAgICAgICAgICAgICAgIHJldHVybiBnZXRCbG9iQ29sdW1uQXNBc3NldEZpbGUodXJsLCBtb2RlLCBzcWwpOworICAgICAgICAgICAgICAgIHJldHVybiBnZXRCbG9iQ29sdW1uQXNGaWxlKHVybCwgbW9kZSwgc3FsKTsKICAgICAgICAgICAgIGNhc2UgSFVHRToKICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBNZW1vcnlGaWxlIG1lbW9yeUZpbGUgPSBuZXcgTWVtb3J5RmlsZShudWxsLCA1MDAwMDAwKTsKLSAgICAgICAgICAgICAgICAgICAgbWVtb3J5RmlsZS53cml0ZUJ5dGVzKFRFU1RfQkxPQiwgMCwgMTAwMDAwMCwgVEVTVF9CTE9CLmxlbmd0aCk7Ci0gICAgICAgICAgICAgICAgICAgIG1lbW9yeUZpbGUuZGVhY3RpdmF0ZSgpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gQXNzZXRGaWxlRGVzY3JpcHRvci5mcm9tTWVtb3J5RmlsZShtZW1vcnlGaWxlKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFBhcmNlbEZpbGVEZXNjcmlwdG9yLmZyb21EYXRhKFRFU1RfQkxPQiwgbnVsbCk7CiAgICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZXgpIHsKICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEZpbGVOb3RGb3VuZEV4Y2VwdGlvbigiRXJyb3IgcmVhZGluZyAiICsgdXJsICsgIjoiICsgZXgudG9TdHJpbmcoKSk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgY2FzZSBGSUxFOgogICAgICAgICAgICAgICAgIEZpbGUgZmlsZSA9IGdldENvbnRleHQoKS5nZXRGaWxlU3RyZWFtUGF0aChEQVRBX0ZJTEUpOwotICAgICAgICAgICAgICAgIFBhcmNlbEZpbGVEZXNjcmlwdG9yIGZkID0KLSAgICAgICAgICAgICAgICAgICAgICAgIFBhcmNlbEZpbGVEZXNjcmlwdG9yLm9wZW4oZmlsZSwgUGFyY2VsRmlsZURlc2NyaXB0b3IuTU9ERV9SRUFEX09OTFkpOwotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQXNzZXRGaWxlRGVzY3JpcHRvcihmZCwgMCwgQXNzZXRGaWxlRGVzY3JpcHRvci5VTktOT1dOX0xFTkdUSCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIFBhcmNlbEZpbGVEZXNjcmlwdG9yLm9wZW4oZmlsZSwgUGFyY2VsRmlsZURlc2NyaXB0b3IuTU9ERV9SRUFEX09OTFkpOwogICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRmlsZU5vdEZvdW5kRXhjZXB0aW9uKCJObyBmaWxlcyBzdXBwb3J0ZWQgYnkgcHJvdmlkZXIgYXQgIiArIHVybCk7CiAgICAgICAgIH0KICAgICB9CiAKLSAgICBwcml2YXRlIEFzc2V0RmlsZURlc2NyaXB0b3IgZ2V0QmxvYkNvbHVtbkFzQXNzZXRGaWxlKFVyaSB1cmwsIFN0cmluZyBtb2RlLCBTdHJpbmcgc3FsKQorICAgIHByaXZhdGUgUGFyY2VsRmlsZURlc2NyaXB0b3IgZ2V0QmxvYkNvbHVtbkFzRmlsZShVcmkgdXJsLCBTdHJpbmcgbW9kZSwgU3RyaW5nIHNxbCkKICAgICAgICAgICAgIHRocm93cyBGaWxlTm90Rm91bmRFeGNlcHRpb24gewogICAgICAgICBpZiAoISJyIi5lcXVhbHMobW9kZSkpIHsKICAgICAgICAgICAgIHRocm93IG5ldyBGaWxlTm90Rm91bmRFeGNlcHRpb24oIk1vZGUgIiArIG1vZGUgKyAiIG5vdCBzdXBwb3J0ZWQgZm9yICIgKyB1cmwpOwogICAgICAgICB9Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBTUUxpdGVEYXRhYmFzZSBkYiA9IG1PcGVuSGVscGVyLmdldFJlYWRhYmxlRGF0YWJhc2UoKTsKLSAgICAgICAgICAgIE1lbW9yeUZpbGUgZmlsZSA9IHNpbXBsZVF1ZXJ5Rm9yQmxvYk1lbW9yeUZpbGUoZGIsIHNxbCk7Ci0gICAgICAgICAgICBpZiAoZmlsZSA9PSBudWxsKSB0aHJvdyBuZXcgRmlsZU5vdEZvdW5kRXhjZXB0aW9uKCJObyBzdWNoIGVudHJ5OiAiICsgdXJsKTsKLSAgICAgICAgICAgIEFzc2V0RmlsZURlc2NyaXB0b3IgYWZkID0gQXNzZXRGaWxlRGVzY3JpcHRvci5mcm9tTWVtb3J5RmlsZShmaWxlKTsKLSAgICAgICAgICAgIGZpbGUuZGVhY3RpdmF0ZSgpOwotICAgICAgICAgICAgLy8gbmVlZCB0byBkdXAgYW5kIHRoZW4gY2xvc2U/IG9wZW5GaWxlSGVscGVyKCkgZG9lc24ndCBkbyB0aGF0IHRob3VnaAotICAgICAgICAgICAgcmV0dXJuIGFmZDsKLSAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBGaWxlTm90Rm91bmRFeGNlcHRpb24oIkVycm9yIHJlYWRpbmcgIiArIHVybCArICI6IiArIGV4LnRvU3RyaW5nKCkpOwotICAgICAgICB9Ci0gICAgfQogCi0gICAgcHJpdmF0ZSBNZW1vcnlGaWxlIHNpbXBsZVF1ZXJ5Rm9yQmxvYk1lbW9yeUZpbGUoU1FMaXRlRGF0YWJhc2UgZGIsIFN0cmluZyBzcWwpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIEN1cnNvciBjdXJzb3IgPSBkYi5yYXdRdWVyeShzcWwsIG51bGwpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgaWYgKCFjdXJzb3IubW92ZVRvRmlyc3QoKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnl0ZVtdIGJ5dGVzID0gY3Vyc29yLmdldEJsb2IoMCk7Ci0gICAgICAgICAgICBNZW1vcnlGaWxlIGZpbGUgPSBuZXcgTWVtb3J5RmlsZShudWxsLCBieXRlcy5sZW5ndGgpOwotICAgICAgICAgICAgZmlsZS53cml0ZUJ5dGVzKGJ5dGVzLCAwLCAwLCBieXRlcy5sZW5ndGgpOwotICAgICAgICAgICAgcmV0dXJuIGZpbGU7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBpZiAoY3Vyc29yICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBjdXJzb3IuY2xvc2UoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQorICAgICAgICBTUUxpdGVEYXRhYmFzZSBkYiA9IG1PcGVuSGVscGVyLmdldFJlYWRhYmxlRGF0YWJhc2UoKTsKKyAgICAgICAgcmV0dXJuIERhdGFiYXNlVXRpbHMuYmxvYkZpbGVEZXNjcmlwdG9yRm9yUXVlcnkoZGIsIHNxbCwgbnVsbCk7CiAgICAgfQogCiAgICAgQE92ZXJyaWRlCmRpZmYgLS1naXQgYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9jb250ZW50L01lbW9yeUZpbGVQcm92aWRlclRlc3QuamF2YSBiL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL2NvbnRlbnQvTWVtb3J5RmlsZVByb3ZpZGVyVGVzdC5qYXZhCmluZGV4IDYyYjRlN2UuLmJiZTdjMTAgMTAwNjQ0Ci0tLSBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL2NvbnRlbnQvTWVtb3J5RmlsZVByb3ZpZGVyVGVzdC5qYXZhCisrKyBiL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL2NvbnRlbnQvTWVtb3J5RmlsZVByb3ZpZGVyVGVzdC5qYXZhCkBAIC01Niw3ICs1Niw2IEBACiAgICAgICAgICAgICBVcmkgdXJpID0gVXJpLnBhcnNlKCJjb250ZW50Oi8vYW5kcm9pZC5jb250ZW50Lk1lbW9yeUZpbGVQcm92aWRlci9odWdlIik7CiAgICAgICAgICAgICBJbnB1dFN0cmVhbSBpbiA9IHJlc29sdmVyLm9wZW5JbnB1dFN0cmVhbSh1cmkpOwogICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbCgiRmFpbGVkIHRvIG9wZW4gc3RyZWFtIG51bWJlciAiICsgaSwgaW4pOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDEwMDAwMDAsIGluLnNraXAoMTAwMDAwMCkpOwogICAgICAgICAgICAgYnl0ZVtdIGJ1ZiA9IG5ldyBieXRlW01lbW9yeUZpbGVQcm92aWRlci5URVNUX0JMT0IubGVuZ3RoXTsKICAgICAgICAgICAgIGludCBjb3VudCA9IGluLnJlYWQoYnVmKTsKICAgICAgICAgICAgIGFzc2VydEVxdWFscyhidWYubGVuZ3RoLCBjb3VudCk7CmRpZmYgLS1naXQgYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9kYXRhYmFzZS9EYXRhYmFzZUN1cnNvclRlc3QuamF2YSBiL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL2RhdGFiYXNlL0RhdGFiYXNlQ3Vyc29yVGVzdC5qYXZhCmluZGV4IGZiNWEzNmYuLjA3MzMyMjkgMTAwNjQ0Ci0tLSBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL2RhdGFiYXNlL0RhdGFiYXNlQ3Vyc29yVGVzdC5qYXZhCisrKyBiL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL2RhdGFiYXNlL0RhdGFiYXNlQ3Vyc29yVGVzdC5qYXZhCkBAIC0zMyw3ICszMyw2IEBACiBpbXBvcnQgYW5kcm9pZC50ZXN0LlBlcmZvcm1hbmNlVGVzdENhc2U7CiBpbXBvcnQgYW5kcm9pZC50ZXN0LnN1aXRlYnVpbGRlci5hbm5vdGF0aW9uLkxhcmdlVGVzdDsKIGltcG9ydCBhbmRyb2lkLnRlc3Quc3VpdGVidWlsZGVyLmFubm90YXRpb24uTWVkaXVtVGVzdDsKLWltcG9ydCBhbmRyb2lkLnRlc3Quc3VpdGVidWlsZGVyLmFubm90YXRpb24uU21hbGxUZXN0OwogaW1wb3J0IGFuZHJvaWQudGVzdC5zdWl0ZWJ1aWxkZXIuYW5ub3RhdGlvbi5TdXBwcmVzczsKIGltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwogCkBAIC00MSw4ICs0MCw2IEBACiBpbXBvcnQgamF2YS51dGlsLkFycmF5czsKIGltcG9ydCBqYXZhLnV0aWwuUmFuZG9tOwogCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCiBwdWJsaWMgY2xhc3MgRGF0YWJhc2VDdXJzb3JUZXN0IGV4dGVuZHMgQW5kcm9pZFRlc3RDYXNlIGltcGxlbWVudHMgUGVyZm9ybWFuY2VUZXN0Q2FzZSB7CiAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgc1N0cmluZzEgPSAidGhpcyBpcyBhIHRlc3QiOwpAQCAtOTIsNDMgKzg5LDYgQEAKICAgICB9CiAKICAgICBATWVkaXVtVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RDdXJzb3JVcGRhdGUoKSB7Ci0gICAgICAgIG1EYXRhYmFzZS5leGVjU1FMKAotICAgICAgICAgICAgIkNSRUFURSBUQUJMRSB0ZXN0IChfaWQgSU5URUdFUiBQUklNQVJZIEtFWSwgZCBJTlRFR0VSLCBzIElOVEVHRVIpOyIpOwotICAgICAgICBmb3IoaW50IGkgPSAwOyBpIDwgMjA7IGkrKykgewotICAgICAgICAgICAgbURhdGFiYXNlLmV4ZWNTUUwoIklOU0VSVCBJTlRPIHRlc3QgKGQsIHMpIFZBTFVFUyAoIiArIGkgKyAKLSAgICAgICAgICAgICAgICAiLCIgKyBpJTIgKyAiKTsiKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgQ3Vyc29yIGMgPSBtRGF0YWJhc2UucXVlcnkoInRlc3QiLCBudWxsLCAicyA9IDAiLCBudWxsLCBudWxsLCBudWxsLCBudWxsKTsKLSAgICAgICAgaW50IGRDb2wgPSBjLmdldENvbHVtbkluZGV4T3JUaHJvdygiZCIpOwotICAgICAgICBpbnQgc0NvbCA9IGMuZ2V0Q29sdW1uSW5kZXhPclRocm93KCJzIik7Ci0gICAgICAgIAotICAgICAgICBpbnQgY291bnQgPSAwOwotICAgICAgICB3aGlsZSAoYy5tb3ZlVG9OZXh0KCkpIHsKLSAgICAgICAgICAgIGFzc2VydFRydWUoYy51cGRhdGVJbnQoZENvbCwgMykpOwotICAgICAgICAgICAgY291bnQrKzsKLSAgICAgICAgfQotICAgICAgICBhc3NlcnRFcXVhbHMoMTAsIGNvdW50KTsKLSAgICAgICAgCi0gICAgICAgIGFzc2VydFRydWUoYy5jb21taXRVcGRhdGVzKCkpOwotICAgICAgICAKLSAgICAgICAgYXNzZXJ0VHJ1ZShjLnJlcXVlcnkoKSk7Ci0gICAgICAgIAotICAgICAgICBjb3VudCA9IDA7Ci0gICAgICAgIHdoaWxlIChjLm1vdmVUb05leHQoKSkgewotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDMsIGMuZ2V0SW50KGRDb2wpKTsKLSAgICAgICAgICAgIGNvdW50Kys7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGFzc2VydEVxdWFscygxMCwgY291bnQpOwotICAgICAgICBhc3NlcnRUcnVlKGMubW92ZVRvRmlyc3QoKSk7Ci0gICAgICAgIGFzc2VydFRydWUoYy5kZWxldGVSb3coKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyg5LCBjLmdldENvdW50KCkpOwotICAgICAgICBjLmNsb3NlKCk7Ci0gICAgfQotICAgIAotICAgIEBNZWRpdW1UZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdEJsb2IoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgLy8gY3JlYXRlIHRhYmxlCiAgICAgICAgIG1EYXRhYmFzZS5leGVjU1FMKApAQCAtMTY0LDI0ICsxMjQsNyBAQAogICAgICAgICBhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoYmxvYiwgY0Jsb2IpKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKHMsIGMuZ2V0U3RyaW5nKHNDb2wpKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKChkb3VibGUpZCwgYy5nZXREb3VibGUoZENvbCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoKGxvbmcpbCwgYy5nZXRMb25nKGxDb2wpKTsKLSAgICAgICAgCi0gICAgICAgIC8vIG5ldyBieXRlW10KLSAgICAgICAgYnl0ZVtdIG5ld2Jsb2IgPSBuZXcgYnl0ZVsxMDAwXTsKLSAgICAgICAgdmFsdWUgPSA5ODsKLSAgICAgICAgQXJyYXlzLmZpbGwoYmxvYiwgdmFsdWUpOyAgICAgICAgCi0gICAgICAgIAotICAgICAgICBjLnVwZGF0ZUJsb2IoYkNvbCwgbmV3YmxvYik7Ci0gICAgICAgIGNCbG9iID0gIGMuZ2V0QmxvYihiQ29sKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ld2Jsb2IsIGNCbG9iKSk7Ci0gICAgICAgIAotICAgICAgICAvLyBjb21taXQKLSAgICAgICAgYXNzZXJ0VHJ1ZShjLmNvbW1pdFVwZGF0ZXMoKSk7Ci0gICAgICAgIGFzc2VydFRydWUoYy5yZXF1ZXJ5KCkpOwotICAgICAgICBjLm1vdmVUb05leHQoKTsKLSAgICAgICAgY0Jsb2IgPSAgYy5nZXRCbG9iKGJDb2wpOwotICAgICAgICBhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3YmxvYiwgY0Jsb2IpKTsgICAgICAgIAotICAgICAgICBjLmNsb3NlKCk7CisgICAgICAgIGFzc2VydEVxdWFscygobG9uZylsLCBjLmdldExvbmcobENvbCkpOyAgICAgICAgCiAgICAgfQogICAgIAogICAgIEBNZWRpdW1UZXN0CmRpZmYgLS1naXQgYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9kYXRhYmFzZS9EYXRhYmFzZUVycm9ySGFuZGxlclRlc3QuamF2YSBiL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL2RhdGFiYXNlL0RhdGFiYXNlRXJyb3JIYW5kbGVyVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ4ZDI1YjkKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9kYXRhYmFzZS9EYXRhYmFzZUVycm9ySGFuZGxlclRlc3QuamF2YQpAQCAtMCwwICsxLDExMSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5kYXRhYmFzZTsKKworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlLlNRTGl0ZURhdGFiYXNlOworaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlLlNRTGl0ZUV4Y2VwdGlvbjsKK2ltcG9ydCBhbmRyb2lkLnRlc3QuQW5kcm9pZFRlc3RDYXNlOworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CisKK2ltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkV3JpdGVyOworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVXcml0ZXI7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKKworcHVibGljIGNsYXNzIERhdGFiYXNlRXJyb3JIYW5kbGVyVGVzdCBleHRlbmRzIEFuZHJvaWRUZXN0Q2FzZSB7CisKKyAgICBwcml2YXRlIFNRTGl0ZURhdGFiYXNlIG1EYXRhYmFzZTsKKyAgICBwcml2YXRlIEZpbGUgbURhdGFiYXNlRmlsZTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREJfTkFNRSA9ICJkYXRhYmFzZV90ZXN0LmRiIjsKKyAgICBwcml2YXRlIEZpbGUgZGJEaXI7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBzdXBlci5zZXRVcCgpOworICAgICAgICBkYkRpciA9IGdldENvbnRleHQoKS5nZXREaXIodGhpcy5nZXRDbGFzcygpLmdldE5hbWUoKSwgQ29udGV4dC5NT0RFX1BSSVZBVEUpOworICAgICAgICBtRGF0YWJhc2VGaWxlID0gbmV3IEZpbGUoZGJEaXIsIERCX05BTUUpOworICAgICAgICBpZiAobURhdGFiYXNlRmlsZS5leGlzdHMoKSkgeworICAgICAgICAgICAgbURhdGFiYXNlRmlsZS5kZWxldGUoKTsKKyAgICAgICAgfQorICAgICAgICBtRGF0YWJhc2UgPSBTUUxpdGVEYXRhYmFzZS5vcGVuT3JDcmVhdGVEYXRhYmFzZShtRGF0YWJhc2VGaWxlLmdldFBhdGgoKSwgbnVsbCwKKyAgICAgICAgICAgICAgICBuZXcgTXlEYXRhYmFzZUNvcnJ1cHRpb25IYW5kbGVyKCkpOworICAgICAgICBhc3NlcnROb3ROdWxsKG1EYXRhYmFzZSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgbURhdGFiYXNlLmNsb3NlKCk7CisgICAgICAgIG1EYXRhYmFzZUZpbGUuZGVsZXRlKCk7CisgICAgICAgIHN1cGVyLnRlYXJEb3duKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdE5vQ29ycnVwdGlvbkNhc2UoKSB7CisgICAgICAgIG5ldyBNeURhdGFiYXNlQ29ycnVwdGlvbkhhbmRsZXIoKS5vbkNvcnJ1cHRpb24obURhdGFiYXNlKTsKKyAgICAgICAgLy8gZGF0YWJhc2UgZmlsZSBzaG91bGQgc3RpbGwgZXhpc3QKKyAgICAgICAgYXNzZXJ0VHJ1ZShtRGF0YWJhc2VGaWxlLmV4aXN0cygpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RGF0YWJhc2VJc0NvcnJ1cHQoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBtRGF0YWJhc2UuZXhlY1NRTCgiY3JlYXRlIHRhYmxlIHQgKGkgaW50KTsiKTsKKyAgICAgICAgLy8gd3JpdGUganVuayBpbnRvIHRoZSBkYXRhYmFzZSBmaWxlCisgICAgICAgIEJ1ZmZlcmVkV3JpdGVyIHdyaXRlciA9IG5ldyBCdWZmZXJlZFdyaXRlcihuZXcgRmlsZVdyaXRlcihtRGF0YWJhc2VGaWxlLmdldFBhdGgoKSkpOworICAgICAgICB3cml0ZXIud3JpdGUoImJsYWgiKTsKKyAgICAgICAgd3JpdGVyLmNsb3NlKCk7CisgICAgICAgIGFzc2VydFRydWUobURhdGFiYXNlRmlsZS5leGlzdHMoKSk7CisgICAgICAgIC8vIHNpbmNlIHRoZSBkYXRhYmFzZSBmaWxlIGlzIG5vdyBjb3JydXB0LCBkb2luZyBhbnkgc3FsIG9uIHRoaXMgZGF0YWJhc2UgY29ubmVjdGlvbgorICAgICAgICAvLyBzaG91bGQgdHJpZ2dlciBjYWxsIHRvIE15RGF0YWJhc2VDb3JydXB0aW9uSGFuZGxlci5vbkNvcnJ1cHRpb24KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG1EYXRhYmFzZS5leGVjU1FMKCJzZWxlY3QgKiBmcm9tIHQ7Iik7CisgICAgICAgICAgICBmYWlsKCJleHBlY3RlZCBleGNlcHRpb24iKTsKKyAgICAgICAgfSBjYXRjaCAoU1FMaXRlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIC8vIGV4cGVjdGVkCisgICAgICAgIH0KKyAgICAgICAgLy8gYWZ0ZXIgY29ycnVwdGlvbiBoYW5kbGVyIGlzIGNhbGxlZCwgdGhlIGRhdGFiYXNlIGZpbGUgc2hvdWxkIGJlIGZyZWUgb2YKKyAgICAgICAgLy8gZGF0YWJhc2UgY29ycnVwdGlvbgorICAgICAgICBTUUxpdGVEYXRhYmFzZSBkYiA9IFNRTGl0ZURhdGFiYXNlLm9wZW5PckNyZWF0ZURhdGFiYXNlKG1EYXRhYmFzZUZpbGUuZ2V0UGF0aCgpLCBudWxsLAorICAgICAgICAgICAgICAgIG5ldyBNeURhdGFiYXNlQ29ycnVwdGlvbkhhbmRsZXIoKSk7CisgICAgICAgIGFzc2VydFRydWUoZGIuaXNEYXRhYmFzZUludGVncml0eU9rKCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFuIGV4YW1wbGUgaW1wbGVtZW50YXRpb24gb2Yge0BsaW5rIERhdGFiYXNlRXJyb3JIYW5kbGVyfSB0byBkZW1vbnN0cmF0ZQorICAgICAqIGRhdGFiYXNlIGNvcnJ1cHRpb24gaGFuZGxlciB3aGljaCBjaGVja3MgdG8gbWFrZSBzdXJlIGRhdGFiYXNlIGlzIGluZGVlZAorICAgICAqIGNvcnJ1cHQgYmVmb3JlIGRlbGV0aW5nIHRoZSBmaWxlLgorICAgICAqLworICAgIHB1YmxpYyBjbGFzcyBNeURhdGFiYXNlQ29ycnVwdGlvbkhhbmRsZXIgaW1wbGVtZW50cyBEYXRhYmFzZUVycm9ySGFuZGxlciB7CisgICAgICAgIHB1YmxpYyB2b2lkIG9uQ29ycnVwdGlvbihTUUxpdGVEYXRhYmFzZSBkYk9iaikgeworICAgICAgICAgICAgYm9vbGVhbiBkYXRhYmFzZU9rID0gZGJPYmouaXNEYXRhYmFzZUludGVncml0eU9rKCk7CisgICAgICAgICAgICAvLyBjbG9zZSB0aGUgZGF0YWJhc2UKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgZGJPYmouY2xvc2UoKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFNRTGl0ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgLyogaWdub3JlICovCisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoZGF0YWJhc2VPaykgeworICAgICAgICAgICAgICAgIC8vIGRhdGFiYXNlIGlzIGp1c3QgZmluZS4gbm8gbmVlZCB0byBkZWxldGUgdGhlIGRhdGFiYXNlIGZpbGUKKyAgICAgICAgICAgICAgICBMb2cuZSgiTXlEYXRhYmFzZUNvcnJ1cHRpb25IYW5kbGVyIiwgIm5vIGNvcnJ1cHRpb24gaW4gdGhlIGRhdGFiYXNlOiAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1EYXRhYmFzZUZpbGUuZ2V0UGF0aCgpKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLy8gZGF0YWJhc2UgaXMgY29ycnVwdC4gZGVsZXRlIHRoZSBkYXRhYmFzZSBmaWxlCisgICAgICAgICAgICAgICAgTG9nLmUoIk15RGF0YWJhc2VDb3JydXB0aW9uSGFuZGxlciIsICJkZWxldGluZyB0aGUgZGF0YWJhc2UgZmlsZTogIiArCisgICAgICAgICAgICAgICAgICAgICAgICBtRGF0YWJhc2VGaWxlLmdldFBhdGgoKSk7CisgICAgICAgICAgICAgICAgbmV3IEZpbGUoZGJEaXIsIERCX05BTUUpLmRlbGV0ZSgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL2RhdGFiYXNlL0RhdGFiYXNlR2VuZXJhbFRlc3QuamF2YSBiL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL2RhdGFiYXNlL0RhdGFiYXNlR2VuZXJhbFRlc3QuamF2YQppbmRleCA2NTYwMjlkLi5jZDM4YmYwNyAxMDA2NDQKLS0tIGEvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvZGF0YWJhc2UvRGF0YWJhc2VHZW5lcmFsVGVzdC5qYXZhCisrKyBiL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL2RhdGFiYXNlL0RhdGFiYXNlR2VuZXJhbFRlc3QuamF2YQpAQCAtMjEsMTggKzIxLDIxIEBACiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRWYWx1ZXM7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CiBpbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGUuU1FMaXRlRGF0YWJhc2U7Ci1pbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGUuU1FMaXRlU3RhdGVtZW50OworaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlLlNRTGl0ZUV4Y2VwdGlvbjsKIGltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXI7CiBpbXBvcnQgYW5kcm9pZC5vcy5QYXJjZWw7CiBpbXBvcnQgYW5kcm9pZC50ZXN0LkFuZHJvaWRUZXN0Q2FzZTsKIGltcG9ydCBhbmRyb2lkLnRlc3QuUGVyZm9ybWFuY2VUZXN0Q2FzZTsKK2ltcG9ydCBhbmRyb2lkLnRlc3Quc3VpdGVidWlsZGVyLmFubm90YXRpb24uTGFyZ2VUZXN0OwogaW1wb3J0IGFuZHJvaWQudGVzdC5zdWl0ZWJ1aWxkZXIuYW5ub3RhdGlvbi5NZWRpdW1UZXN0OwogaW1wb3J0IGFuZHJvaWQudGVzdC5zdWl0ZWJ1aWxkZXIuYW5ub3RhdGlvbi5TbWFsbFRlc3Q7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuUGFpcjsKIAogaW1wb3J0IGp1bml0LmZyYW1ld29yay5Bc3NlcnQ7CiAKIGltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwogaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7CiAKQEAgLTM4Miw1NCArMzg1LDI4IEBACiAKICAgICBATWVkaXVtVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3RTY2hlbWFDaGFuZ2UyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIFNRTGl0ZURhdGFiYXNlIGRiMSA9IG1EYXRhYmFzZTsKLSAgICAgICAgU1FMaXRlRGF0YWJhc2UgZGIyID0gU1FMaXRlRGF0YWJhc2Uub3Blbk9yQ3JlYXRlRGF0YWJhc2UobURhdGFiYXNlRmlsZSwgbnVsbCk7Ci0gICAgICAgIEN1cnNvciBjdXJzb3I7Ci0KLSAgICAgICAgZGIxLmV4ZWNTUUwoIkNSRUFURSBUQUJMRSBkYjEgKF9pZCBJTlRFR0VSIFBSSU1BUlkgS0VZLCBkYXRhIFRFWFQpOyIpOwotCi0gICAgICAgIGN1cnNvciA9IGRiMS5xdWVyeSgiZGIxIiwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoIkN1cnNvciBpcyBudWxsIiwgY3Vyc29yKTsKKyAgICAgICAgbURhdGFiYXNlLmV4ZWNTUUwoIkNSRUFURSBUQUJMRSBkYjEgKF9pZCBJTlRFR0VSIFBSSU1BUlkgS0VZLCBkYXRhIFRFWFQpOyIpOworICAgICAgICBDdXJzb3IgY3Vyc29yID0gbURhdGFiYXNlLnF1ZXJ5KCJkYjEiLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChjdXJzb3IpOwogICAgICAgICBhc3NlcnRFcXVhbHMoMCwgY3Vyc29yLmdldENvdW50KCkpOwotICAgICAgICBjdXJzb3IuZGVhY3RpdmF0ZSgpOwotICAgICAgICAvLyB0aGlzIGNhdXNlIGV4Y2VwdGlvbiBiZWNhdXNlIHdlJ3JlIHN0aWxsIHVzaW5nIHNxbGl0ZV9wcmVwYXRlMTYgYW5kIG5vdAotICAgICAgICAvLyBzcWxpdGVfcHJlcGFyZTE2X3YyLiBUaGUgdjIgdmFyaWFudCBhZGRlZCB0aGUgYWJpbGl0eSB0byBjaGVjayB0aGUKLSAgICAgICAgLy8gc2NoZW1hIHZlcnNpb24gYW5kIGhhbmRsZSB0aGUgY2FzZSB3aGVuIHRoZSBzY2hlbWEgaGFzIGNoYW5nZWQKLSAgICAgICAgLy8gTWFyY28gTmVsaXNzZW4gY2xhaW0gaXQgd2FzIDJ4IHNsb3dlciB0byBjb21waWxlIFNRTCBzdGF0ZW1lbnRzIHNvCi0gICAgICAgIC8vIEkgcmV2ZXJ0ZWQgYmFjayB0byB0aGUgdjEgdmFyaWFudC4KLSAgICAgICAgLyogZGIyLmV4ZWNTUUwoIkNSRUFURSBUQUJMRSBkYjIgKF9pZCBJTlRFR0VSIFBSSU1BUlkgS0VZLCBkYXRhIFRFWFQpOyIpOwotCi0gICAgICAgIGN1cnNvciA9IGRiMS5xdWVyeSgiZGIxIiwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoIkN1cnNvciBpcyBudWxsIiwgY3Vyc29yKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIGN1cnNvci5jb3VudCgpKTsKLSAgICAgICAgY3Vyc29yLmRlYWN0aXZhdGUoKTsKLSAgICAgICAgKi8KKyAgICAgICAgY3Vyc29yLmNsb3NlKCk7CiAgICAgfQogCiAgICAgQE1lZGl1bVRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0U2NoZW1hQ2hhbmdlMygpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBTUUxpdGVEYXRhYmFzZSBkYjEgPSBtRGF0YWJhc2U7Ci0gICAgICAgIFNRTGl0ZURhdGFiYXNlIGRiMiA9IFNRTGl0ZURhdGFiYXNlLm9wZW5PckNyZWF0ZURhdGFiYXNlKG1EYXRhYmFzZUZpbGUsIG51bGwpOwotICAgICAgICBDdXJzb3IgY3Vyc29yOwotCi0KLSAgICAgICAgZGIxLmV4ZWNTUUwoIkNSRUFURSBUQUJMRSBkYjEgKF9pZCBJTlRFR0VSIFBSSU1BUlkgS0VZLCBkYXRhIFRFWFQpOyIpOwotICAgICAgICBkYjEuZXhlY1NRTCgiSU5TRVJUIElOVE8gZGIxIChkYXRhKSBWQUxVRVMgKCd0ZXN0Jyk7Iik7Ci0KLSAgICAgICAgY3Vyc29yID0gZGIxLnF1ZXJ5KCJkYjEiLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsKTsKLSAgICAgICAgLy8gdGhpcyBjYXVzZSBleGNlcHRpb24gYmVjYXVzZSB3ZSdyZSBzdGlsbCB1c2luZyBzcWxpdGVfcHJlcGF0ZTE2IGFuZCBub3QKLSAgICAgICAgLy8gc3FsaXRlX3ByZXBhcmUxNl92Mi4gVGhlIHYyIHZhcmlhbnQgYWRkZWQgdGhlIGFiaWxpdHkgdG8gY2hlY2sgdGhlCi0gICAgICAgIC8vIHNjaGVtYSB2ZXJzaW9uIGFuZCBoYW5kbGUgdGhlIGNhc2Ugd2hlbiB0aGUgc2NoZW1hIGhhcyBjaGFuZ2VkCi0gICAgICAgIC8vIE1hcmNvIE5lbGlzc2VuIGNsYWltIGl0IHdhcyAyeCBzbG93ZXIgdG8gY29tcGlsZSBTUUwgc3RhdGVtZW50cyBzbwotICAgICAgICAvLyBJIHJldmVydGVkIGJhY2sgdG8gdGhlIHYxIHZhcmlhbnQuCi0gICAgICAgIC8qIGRiMi5leGVjU1FMKCJDUkVBVEUgVEFCTEUgZGIyIChfaWQgSU5URUdFUiBQUklNQVJZIEtFWSwgZGF0YSBURVhUKTsiKTsKLQotICAgICAgICBhc3NlcnROb3ROdWxsKCJDdXJzb3IgaXMgbnVsbCIsIGN1cnNvcik7Ci0gICAgICAgIGFzc2VydEVxdWFscygxLCBjdXJzb3IuY291bnQoKSk7Ci0gICAgICAgIGFzc2VydFRydWUoY3Vyc29yLmZpcnN0KCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoInRlc3QiLCBjdXJzb3IuZ2V0U3RyaW5nKGN1cnNvci5nZXRDb2x1bW5JbmRleE9yVGhyb3coImRhdGEiKSkpOwotICAgICAgICBjdXJzb3IuZGVhY3RpdmF0ZSgpOwotICAgICAgICAqLworICAgICAgICBtRGF0YWJhc2UuZXhlY1NRTCgiQ1JFQVRFIFRBQkxFIGRiMSAoX2lkIElOVEVHRVIgUFJJTUFSWSBLRVksIGRhdGEgVEVYVCk7Iik7CisgICAgICAgIG1EYXRhYmFzZS5leGVjU1FMKCJJTlNFUlQgSU5UTyBkYjEgKGRhdGEpIFZBTFVFUyAoJ3Rlc3QnKTsiKTsKKyAgICAgICAgbURhdGFiYXNlLmV4ZWNTUUwoIkFMVEVSIFRBQkxFIGRiMSBBREQgQ09MVU1OIGJsYWggaW50OyIpOworICAgICAgICBDdXJzb3IgYyA9IG51bGw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBjID0gbURhdGFiYXNlLnJhd1F1ZXJ5KCJzZWxlY3QgYmxhaCBmcm9tIGRiMSIsIG51bGwpOworICAgICAgICB9IGNhdGNoIChTUUxpdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbCgidW5leHBlY3RlZCBleGNlcHRpb246ICIgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBpZiAoYyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgYy5jbG9zZSgpOworICAgICAgICAgICAgfQorICAgICAgICB9CiAgICAgfQogCiAgICAgcHJpdmF0ZSBjbGFzcyBDaGFuZ2VPYnNlcnZlciBleHRlbmRzIENvbnRlbnRPYnNlcnZlciB7CkBAIC00NjcsNDUgKzQ0NCw2IEBACiAgICAgfQogCiAgICAgQE1lZGl1bVRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0Tm90aWZpY2F0aW9uVGVzdDEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgLyoKLSAgICAgICAgQ3Vyc29yIGMgPSBtQ29udGVudFJlc29sdmVyLnF1ZXJ5KE5vdGVzLkNPTlRFTlRfVVJJLAotICAgICAgICAgICAgICAgIG5ldyBTdHJpbmdbXSB7Tm90ZXMuX0lELCBOb3Rlcy5OT1RFfSwKLSAgICAgICAgICAgICAgICBudWxsLCBudWxsKTsKLSAgICAgICAgYy5yZWdpc3RlckNvbnRlbnRPYnNlcnZlcihuZXcgTXlDb250ZW50T2JzZXJ2ZXIodHJ1ZSkpOwotICAgICAgICBpbnQgY291bnQgPSBjLmNvdW50KCk7Ci0KLSAgICAgICAgTXlDb250ZW50T2JzZXJ2ZXIgb2JzZXJ2ZXIgPSBuZXcgTXlDb250ZW50T2JzZXJ2ZXIoZmFsc2UpOwotICAgICAgICBtQ29udGVudFJlc29sdmVyLnJlZ2lzdGVyQ29udGVudE9ic2VydmVyKE5vdGVzLkNPTlRFTlRfVVJJLCB0cnVlLCBvYnNlcnZlcik7Ci0KLSAgICAgICAgVXJpIHVyaTsKLQotICAgICAgICBIYXNoTWFwPFN0cmluZywgU3RyaW5nPiB2YWx1ZXMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKTsKLSAgICAgICAgdmFsdWVzLnB1dChOb3Rlcy5OT1RFLCAidGVzdCBub3RlMSIpOwotICAgICAgICB1cmkgPSBtQ29udGVudFJlc29sdmVyLmluc2VydChOb3Rlcy5DT05URU5UX1VSSSwgdmFsdWVzKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIG1DdXJzb3JOb3RpZmljYXRpb25Db3VudCk7Ci0gICAgICAgIGFzc2VydEVxdWFscygxLCBtTm90aWZpY2F0aW9uQ291bnQpOwotCi0gICAgICAgIGMucmVxdWVyeSgpOwotICAgICAgICBhc3NlcnRFcXVhbHMoY291bnQgKyAxLCBjLmNvdW50KCkpOwotICAgICAgICBjLmZpcnN0KCk7Ci0gICAgICAgIGFzc2VydEVxdWFscygidGVzdCBub3RlMSIsIGMuZ2V0U3RyaW5nKGMuZ2V0Q29sdW1uSW5kZXgoTm90ZXMuTk9URSkpKTsKLSAgICAgICAgYy51cGRhdGVTdHJpbmcoYy5nZXRDb2x1bW5JbmRleChOb3Rlcy5OT1RFKSwgInRlc3Qgbm90ZTIiKTsKLSAgICAgICAgYy5jb21taXRVcGRhdGVzKCk7Ci0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIG1DdXJzb3JOb3RpZmljYXRpb25Db3VudCk7Ci0gICAgICAgIGFzc2VydEVxdWFscygyLCBtTm90aWZpY2F0aW9uQ291bnQpOwotCi0gICAgICAgIG1Db250ZW50UmVzb2x2ZXIuZGVsZXRlKHVyaSwgbnVsbCk7Ci0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKDMsIG1DdXJzb3JOb3RpZmljYXRpb25Db3VudCk7Ci0gICAgICAgIGFzc2VydEVxdWFscygzLCBtTm90aWZpY2F0aW9uQ291bnQpOwotCi0gICAgICAgIG1Db250ZW50UmVzb2x2ZXIudW5yZWdpc3RlckNvbnRlbnRPYnNlcnZlcihvYnNlcnZlcik7Ci0gICAgICAgICovCi0gICAgfQotCi0gICAgQE1lZGl1bVRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0U2VsZWN0aW9uQXJncygpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBtRGF0YWJhc2UuZXhlY1NRTCgiQ1JFQVRFIFRBQkxFIHRlc3QgKF9pZCBJTlRFR0VSIFBSSU1BUlkgS0VZLCBkYXRhIFRFWFQpOyIpOwogICAgICAgICBDb250ZW50VmFsdWVzIHZhbHVlcyA9IG5ldyBDb250ZW50VmFsdWVzKDEpOwpAQCAtOTg5LDIxICs5MjcsNiBAQAogICAgIH0KIAogICAgIEBNZWRpdW1UZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdERiQ2xvc2VSZWxlYXNpbmdBbGxDYWNoZWRTcWwoKSB7Ci0gICAgICAgIG1EYXRhYmFzZS5leGVjU1FMKCJDUkVBVEUgVEFCTEUgdGVzdCAoX2lkIElOVEVHRVIgUFJJTUFSWSBLRVksIHRleHQxIFRFWFQsIHRleHQyIFRFWFQsICIgKwotICAgICAgICAgICAgICAgICJudW0xIElOVEVHRVIsIG51bTIgSU5URUdFUiwgaW1hZ2UgQkxPQik7Iik7Ci0gICAgICAgIGZpbmFsIFN0cmluZyBzdGF0ZW1lbnQgPSAiREVMRVRFIEZST00gdGVzdCBXSEVSRSBfaWQ9PzsiOwotICAgICAgICBTUUxpdGVTdGF0ZW1lbnQgc3RhdGVtZW50RG9Ob3RDbG9zZSA9IG1EYXRhYmFzZS5jb21waWxlU3RhdGVtZW50KHN0YXRlbWVudCk7Ci0gICAgICAgIGFzc2VydFRydWUoc3RhdGVtZW50RG9Ob3RDbG9zZS5nZXRVbmlxdWVJZCgpID4gMCk7Ci0gICAgICAgIGludCBuU3RhdGVtZW50ID0gc3RhdGVtZW50RG9Ob3RDbG9zZS5nZXRVbmlxdWVJZCgpOwotICAgICAgICBhc3NlcnRUcnVlKHN0YXRlbWVudERvTm90Q2xvc2UuZ2V0VW5pcXVlSWQoKSA9PSBuU3RhdGVtZW50KTsKLSAgICAgICAgLyogZG8gbm90IGNsb3NlIHN0YXRlbWVudERvTm90Q2xvc2Ugb2JqZWN0LiAKLSAgICAgICAgICogVGhhdCBzaG91bGQgbGVhdmUgaXQgaW4gU1FMaXRlRGF0YWJhc2UubVByb2dyYW1zLgotICAgICAgICAgKiBtRGF0YWJhc2UuY2xvc2UoKSBpbiB0ZWFyRG93bigpIHNob3VsZCByZWxlYXNlIGl0LgotICAgICAgICAgKi8KLSAgICB9Ci0KLSAgICBATWVkaXVtVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3RTZW1pY29sb25zSW5TdGF0ZW1lbnRzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIG1EYXRhYmFzZS5leGVjU1FMKCJDUkVBVEUgVEFCTEUgcHJhZ21hX3Rlc3QgKCIgKwogICAgICAgICAgICAgICAgICJpIElOVEVHRVIgREVGQVVMVCAxMjM0LCAiICsKQEAgLTEwMjMsNiArOTQ2LDM0IEBACiAgICAgICAgIH0KICAgICB9CiAKKyAgICBATWVkaXVtVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RVbmlvbnNXaXRoQmluZEFyZ3MoKSB7CisgICAgICAgIC8qIG1ha2Ugc3VyZSB1bmlvbnMgd2l0aCBiaW5kYXJncyB3b3JrIGh0dHA6Ly9iL2lzc3VlP2lkPTEwNjEyOTEgKi8KKyAgICAgICAgbURhdGFiYXNlLmV4ZWNTUUwoIkNSRUFURSBUQUJMRSBBIChpIGludCk7Iik7CisgICAgICAgIG1EYXRhYmFzZS5leGVjU1FMKCJjcmVhdGUgdGFibGUgQiAoayBpbnQpOyIpOworICAgICAgICBtRGF0YWJhc2UuZXhlY1NRTCgiY3JlYXRlIHRhYmxlIEMgKG4gaW50KTsiKTsKKyAgICAgICAgbURhdGFiYXNlLmV4ZWNTUUwoImluc2VydCBpbnRvIEEgdmFsdWVzKDEpOyIpOworICAgICAgICBtRGF0YWJhc2UuZXhlY1NRTCgiaW5zZXJ0IGludG8gQSB2YWx1ZXMoMik7Iik7CisgICAgICAgIG1EYXRhYmFzZS5leGVjU1FMKCJpbnNlcnQgaW50byBBIHZhbHVlcygzKTsiKTsKKyAgICAgICAgbURhdGFiYXNlLmV4ZWNTUUwoImluc2VydCBpbnRvIEIgdmFsdWVzKDIwMSk7Iik7CisgICAgICAgIG1EYXRhYmFzZS5leGVjU1FMKCJpbnNlcnQgaW50byBCIHZhbHVlcygyMDIpOyIpOworICAgICAgICBtRGF0YWJhc2UuZXhlY1NRTCgiaW5zZXJ0IGludG8gQiB2YWx1ZXMoMjAzKTsiKTsKKyAgICAgICAgbURhdGFiYXNlLmV4ZWNTUUwoImluc2VydCBpbnRvIEMgdmFsdWVzKDkwMSk7Iik7CisgICAgICAgIG1EYXRhYmFzZS5leGVjU1FMKCJpbnNlcnQgaW50byBDIHZhbHVlcyg5MDIpOyIpOworICAgICAgICBTdHJpbmcgcyA9ICJzZWxlY3QgaSBmcm9tIEEgd2hlcmUgaSA+IDIgIiArCisgICAgICAgICAgICAgICAgIlVOSU9OIHNlbGVjdCBrIGZyb20gQiB3aGVyZSBrID4gMjAxICIgKworICAgICAgICAgICAgICAgICJVTklPTiBzZWxlY3QgbiBmcm9tIEMgd2hlcmUgbiAhPTkwMDsiOworICAgICAgICBDdXJzb3IgYyA9IG1EYXRhYmFzZS5yYXdRdWVyeShzLCBudWxsKTsKKyAgICAgICAgaW50IG4gPSBjLmdldENvdW50KCk7CisgICAgICAgIGMuY2xvc2UoKTsKKyAgICAgICAgU3RyaW5nIHMxID0gInNlbGVjdCBpIGZyb20gQSB3aGVyZSBpID4gPyAiICsKKyAgICAgICAgICAgICAgICAiVU5JT04gc2VsZWN0IGsgZnJvbSBCIHdoZXJlIGsgPiA/ICIgKworICAgICAgICAgICAgICAgICJVTklPTiBzZWxlY3QgbiBmcm9tIEMgd2hlcmUgbiAhPSA/OyI7CisgICAgICAgIEN1cnNvciBjMSA9IG1EYXRhYmFzZS5yYXdRdWVyeShzMSwgbmV3IFN0cmluZ1tdeyIyIiwgIjIwMSIsICI5MDAifSk7CisgICAgICAgIGFzc2VydEVxdWFscyhuLCBjMS5nZXRDb3VudCgpKTsKKyAgICAgICAgYzEuY2xvc2UoKTsKKyAgICB9CisKICAgICAvKioKICAgICAgKiBUaGlzIHRlc3QgaXMgYXZhaWxhYmxlIG9ubHkgd2hlbiB0aGUgcGxhdGZvcm0gaGFzIGEgbG9jYWxlIHdpdGggdGhlIGxhbmd1YWdlICJqYSIuCiAgICAgICogSXQgZmluaXNoZXMgd2l0aG91dCBmYWlsdXJlIHdoZW4gaXQgaXMgbm90IGF2YWlsYWJsZS4gIApAQCAtMTEwOCw1ICsxMDU5LDExMyBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgfQotICAgIH0gICAgCisgICAgfQorCisgICAgQFNtYWxsVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTZXRNYXhDYWhlc2l6ZSgpIHsKKyAgICAgICAgbURhdGFiYXNlLmV4ZWNTUUwoIkNSRUFURSBUQUJMRSB0ZXN0IChpIGludCwgaiBpbnQpOyIpOworICAgICAgICBtRGF0YWJhc2UuZXhlY1NRTCgiaW5zZXJ0IGludG8gdGVzdCB2YWx1ZXMoMSwxKTsiKTsKKyAgICAgICAgLy8gc2V0IGNhY2hlIHNpemUKKyAgICAgICAgaW50IE4gPSBTUUxpdGVEYXRhYmFzZS5NQVhfU1FMX0NBQ0hFX1NJWkU7CisgICAgICAgIG1EYXRhYmFzZS5zZXRNYXhTcWxDYWNoZVNpemUoTik7CisKKyAgICAgICAgLy8gdHJ5IHJlZHVjZSBjYWNoZXNpemUKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG1EYXRhYmFzZS5zZXRNYXhTcWxDYWNoZVNpemUoMSk7CisgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBhc3NlcnRUcnVlKGUuZ2V0TWVzc2FnZSgpLmNvbnRhaW5zKCJjYW5ub3Qgc2V0IGNhY2hlU2l6ZSB0byBhIHZhbHVlIGxlc3MgdGhhbiIpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBMYXJnZVRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RGVmYXVsdERhdGFiYXNlRXJyb3JIYW5kbGVyKCkgeworICAgICAgICBEZWZhdWx0RGF0YWJhc2VFcnJvckhhbmRsZXIgZXJyb3JIYW5kbGVyID0gbmV3IERlZmF1bHREYXRhYmFzZUVycm9ySGFuZGxlcigpOworCisgICAgICAgIC8vIGNsb3NlIHRoZSBkYXRhYmFzZS4gYW5kIGNhbGwgY29ycnVwdGlvbiBoYW5kbGVyLgorICAgICAgICAvLyBpdCBzaG91bGQgZGVsZXRlIHRoZSBkYXRhYmFzZSBmaWxlLgorICAgICAgICBGaWxlIGRiZmlsZSA9IG5ldyBGaWxlKG1EYXRhYmFzZS5nZXRQYXRoKCkpOworICAgICAgICBtRGF0YWJhc2UuY2xvc2UoKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UobURhdGFiYXNlLmlzT3BlbigpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShkYmZpbGUuZXhpc3RzKCkpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgZXJyb3JIYW5kbGVyLm9uQ29ycnVwdGlvbihtRGF0YWJhc2UpOworICAgICAgICAgICAgYXNzZXJ0RmFsc2UoZGJmaWxlLmV4aXN0cygpKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoInVuZXhwZWN0ZWQiKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIGNyZWF0ZSBhbiBpbi1tZW1vcnkgZGF0YWJhc2UuIGFuZCBjb3JydXB0aW9uIGhhbmRsZXIgc2hvdWxkbid0IHRyeSB0byBkZWxldGUgaXQKKyAgICAgICAgU1FMaXRlRGF0YWJhc2UgbWVtb3J5RGIgPSBTUUxpdGVEYXRhYmFzZS5vcGVuT3JDcmVhdGVEYXRhYmFzZSgiOm1lbW9yeToiLCBudWxsKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChtZW1vcnlEYik7CisgICAgICAgIG1lbW9yeURiLmNsb3NlKCk7CisgICAgICAgIGFzc2VydEZhbHNlKG1lbW9yeURiLmlzT3BlbigpKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGVycm9ySGFuZGxlci5vbkNvcnJ1cHRpb24obWVtb3J5RGIpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbCgidW5leHBlY3RlZCIpOworICAgICAgICB9CisKKyAgICAgICAgLy8gY3JlYXRlIGEgZGF0YWJhc2UsIGtlZXAgaXQgb3BlbiwgY2FsbCBjb3JydXB0aW9uIGhhbmRsZXIuIGRhdGFiYXNlIGZpbGUgc2hvdWxkIGJlIGRlbGV0ZWQKKyAgICAgICAgU1FMaXRlRGF0YWJhc2UgZGJPYmogPSBTUUxpdGVEYXRhYmFzZS5vcGVuT3JDcmVhdGVEYXRhYmFzZShtRGF0YWJhc2UuZ2V0UGF0aCgpLCBudWxsKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShkYmZpbGUuZXhpc3RzKCkpOworICAgICAgICBhc3NlcnROb3ROdWxsKGRiT2JqKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShkYk9iai5pc09wZW4oKSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBlcnJvckhhbmRsZXIub25Db3JydXB0aW9uKGRiT2JqKTsKKyAgICAgICAgICAgIGFzc2VydEZhbHNlKGRiZmlsZS5leGlzdHMoKSk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKCJ1bmV4cGVjdGVkIik7CisgICAgICAgIH0KKworICAgICAgICAvLyBjcmVhdGUgYSBkYXRhYmFzZSwgYXR0YWNoIDIgbW9yZSBkYXRhYmFzZXMgdG8gaXQKKyAgICAgICAgLy8gICAgYXR0YWNoZWQgZGF0YWJhc2UgIyAxOiAiOm1lbW9yeToiCisgICAgICAgIC8vICAgIGF0dGFjaGVkIGRhdGFiYXNlICMgMjogbURhdGFiYXNlLmdldFBhdGgoKSArICIxIjsKKyAgICAgICAgLy8gY2FsbCBjb3JydXB0aW9uIGhhbmRsZXIuIGRhdGFiYXNlIGZpbGVzIGluY2x1ZGluZyB0aGUgb25lIGZvciBhdHRhY2hlZCBkYXRhYmFzZSAjIDIKKyAgICAgICAgLy8gc2hvdWxkIGJlIGRlbGV0ZWQKKyAgICAgICAgU3RyaW5nIGF0dGFjaGVkRGIxRmlsZSA9IG1EYXRhYmFzZS5nZXRQYXRoKCkgKyAiMSI7CisgICAgICAgIGRiT2JqID0gU1FMaXRlRGF0YWJhc2Uub3Blbk9yQ3JlYXRlRGF0YWJhc2UobURhdGFiYXNlLmdldFBhdGgoKSwgbnVsbCk7CisgICAgICAgIGRiT2JqLmV4ZWNTUUwoIkFUVEFDSCBEQVRBQkFTRSAnOm1lbW9yeTonIGFzIG1lbW9yeURiIik7CisgICAgICAgIGRiT2JqLmV4ZWNTUUwoIkFUVEFDSCBEQVRBQkFTRSAnIiArICBhdHRhY2hlZERiMUZpbGUgKyAiJyBhcyBhdHRhY2hlZERiMSIpOworICAgICAgICBhc3NlcnRUcnVlKGRiZmlsZS5leGlzdHMoKSk7CisgICAgICAgIGFzc2VydFRydWUobmV3IEZpbGUoYXR0YWNoZWREYjFGaWxlKS5leGlzdHMoKSk7CisgICAgICAgIGFzc2VydE5vdE51bGwoZGJPYmopOworICAgICAgICBhc3NlcnRUcnVlKGRiT2JqLmlzT3BlbigpKTsKKyAgICAgICAgQXJyYXlMaXN0PFBhaXI8U3RyaW5nLCBTdHJpbmc+PiBhdHRhY2hlZERicyA9IGRiT2JqLmdldEF0dGFjaGVkRGJzKCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBlcnJvckhhbmRsZXIub25Db3JydXB0aW9uKGRiT2JqKTsKKyAgICAgICAgICAgIGFzc2VydEZhbHNlKGRiZmlsZS5leGlzdHMoKSk7CisgICAgICAgICAgICBhc3NlcnRGYWxzZShuZXcgRmlsZShhdHRhY2hlZERiMUZpbGUpLmV4aXN0cygpKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoInVuZXhwZWN0ZWQiKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIHNhbWUgYXMgYWJvdmUsIGV4Y2VwdCB0aGlzIGlzIGEgYml0IG9mIHN0cmVzcyB0ZXN0aW5nLiBhdHRhY2ggNSBkYXRhYmFzZSBmaWxlcworICAgICAgICAvLyBhbmQgbWFrZSBzdXJlIHRoZXkgYXJlIGFsbCByZW1vdmVkLgorICAgICAgICBpbnQgTiA9IDU7CisgICAgICAgIEFycmF5TGlzdDxTdHJpbmc+IGF0dGFjaGVkRGJGaWxlcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPihOKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBOOyBpKyspIHsKKyAgICAgICAgICAgIGF0dGFjaGVkRGJGaWxlcy5hZGQobURhdGFiYXNlLmdldFBhdGgoKSArIGkpOworICAgICAgICB9CisgICAgICAgIGRiT2JqID0gU1FMaXRlRGF0YWJhc2Uub3Blbk9yQ3JlYXRlRGF0YWJhc2UobURhdGFiYXNlLmdldFBhdGgoKSwgbnVsbCk7CisgICAgICAgIGRiT2JqLmV4ZWNTUUwoIkFUVEFDSCBEQVRBQkFTRSAnOm1lbW9yeTonIGFzIG1lbW9yeURiIik7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTjsgaSsrKSB7CisgICAgICAgICAgICBkYk9iai5leGVjU1FMKCJBVFRBQ0ggREFUQUJBU0UgJyIgKyAgYXR0YWNoZWREYkZpbGVzLmdldChpKSArICInIGFzIGF0dGFjaGVkRGIiICsgaSk7CisgICAgICAgIH0KKyAgICAgICAgYXNzZXJ0VHJ1ZShkYmZpbGUuZXhpc3RzKCkpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IE47IGkrKykgeworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShuZXcgRmlsZShhdHRhY2hlZERiRmlsZXMuZ2V0KGkpKS5leGlzdHMoKSk7CisgICAgICAgIH0KKyAgICAgICAgYXNzZXJ0Tm90TnVsbChkYk9iaik7CisgICAgICAgIGFzc2VydFRydWUoZGJPYmouaXNPcGVuKCkpOworICAgICAgICBhdHRhY2hlZERicyA9IGRiT2JqLmdldEF0dGFjaGVkRGJzKCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBlcnJvckhhbmRsZXIub25Db3JydXB0aW9uKGRiT2JqKTsKKyAgICAgICAgICAgIGFzc2VydEZhbHNlKGRiZmlsZS5leGlzdHMoKSk7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IE47IGkrKykgeworICAgICAgICAgICAgICAgIGFzc2VydEZhbHNlKG5ldyBGaWxlKGF0dGFjaGVkRGJGaWxlcy5nZXQoaSkpLmV4aXN0cygpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoInVuZXhwZWN0ZWQiKTsKKyAgICAgICAgfQorICAgIH0KIH0KZGlmZiAtLWdpdCBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9EYXRhYmFzZUNvbm5lY3Rpb25Qb29sVGVzdC5qYXZhIGIvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvZGF0YWJhc2Uvc3FsaXRlL0RhdGFiYXNlQ29ubmVjdGlvblBvb2xUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTI1ZGQyZAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9EYXRhYmFzZUNvbm5lY3Rpb25Qb29sVGVzdC5qYXZhCkBAIC0wLDAgKzEsMzY4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZTsKKworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlLlNRTGl0ZURhdGFiYXNlVGVzdC5DbGFzc1RvVGVzdFNxbENvbXBpbGF0aW9uQW5kQ2FjaGluZzsKK2ltcG9ydCBhbmRyb2lkLnRlc3QuQW5kcm9pZFRlc3RDYXNlOworaW1wb3J0IGFuZHJvaWQudGVzdC5zdWl0ZWJ1aWxkZXIuYW5ub3RhdGlvbi5TbWFsbFRlc3Q7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworCitwdWJsaWMgY2xhc3MgRGF0YWJhc2VDb25uZWN0aW9uUG9vbFRlc3QgZXh0ZW5kcyBBbmRyb2lkVGVzdENhc2UgeworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiRGF0YWJhc2VDb25uZWN0aW9uUG9vbFRlc3QiOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1BWF9DT05OID0gNTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVTVF9TUUwgPSAic2VsZWN0ICogZnJvbSB0ZXN0IHdoZXJlIGkgPSA/IEFORCBqID0gMSI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gVEVTVF9TUUxTID0gbmV3IFN0cmluZ1tdIHsKKyAgICAgICAgVEVTVF9TUUwsIFRFU1RfU1FMICsgMSwgVEVTVF9TUUwgKyAyLCBURVNUX1NRTCArIDMsIFRFU1RfU1FMICsgNAorICAgIH07CisKKyAgICBwcml2YXRlIFNRTGl0ZURhdGFiYXNlIG1EYXRhYmFzZTsKKyAgICBwcml2YXRlIEZpbGUgbURhdGFiYXNlRmlsZTsKKyAgICBwcml2YXRlIERhdGFiYXNlQ29ubmVjdGlvblBvb2wgbVRlc3RQb29sOworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgc3VwZXIuc2V0VXAoKTsKKworICAgICAgICBGaWxlIGRiRGlyID0gZ2V0Q29udGV4dCgpLmdldERpcih0aGlzLmdldENsYXNzKCkuZ2V0TmFtZSgpLCBDb250ZXh0Lk1PREVfUFJJVkFURSk7CisgICAgICAgIG1EYXRhYmFzZUZpbGUgPSBuZXcgRmlsZShkYkRpciwgImRhdGFiYXNlX3Rlc3QuZGIiKTsKKyAgICAgICAgaWYgKG1EYXRhYmFzZUZpbGUuZXhpc3RzKCkpIHsKKyAgICAgICAgICAgIG1EYXRhYmFzZUZpbGUuZGVsZXRlKCk7CisgICAgICAgIH0KKyAgICAgICAgbURhdGFiYXNlID0gU1FMaXRlRGF0YWJhc2Uub3Blbk9yQ3JlYXRlRGF0YWJhc2UobURhdGFiYXNlRmlsZS5nZXRQYXRoKCksIG51bGwpOworICAgICAgICBhc3NlcnROb3ROdWxsKG1EYXRhYmFzZSk7CisgICAgICAgIG1EYXRhYmFzZS5leGVjU1FMKCJjcmVhdGUgdGFibGUgdGVzdCAoaSBpbnQsIGogaW50KTsiKTsKKyAgICAgICAgbVRlc3RQb29sID0gbmV3IERhdGFiYXNlQ29ubmVjdGlvblBvb2wobURhdGFiYXNlKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChtVGVzdFBvb2wpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIG1UZXN0UG9vbC5jbG9zZSgpOworICAgICAgICBtRGF0YWJhc2UuY2xvc2UoKTsKKyAgICAgICAgbURhdGFiYXNlRmlsZS5kZWxldGUoKTsKKyAgICAgICAgc3VwZXIudGVhckRvd24oKTsKKyAgICB9CisKKyAgICBAU21hbGxUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEdldEFuZFJlbGVhc2UoKSB7CisgICAgICAgIG1UZXN0UG9vbC5zZXRNYXhQb29sU2l6ZShNQVhfQ09OTik7CisgICAgICAgIC8vIGNvbm5lY3Rpb25zIHNob3VsZCBiZSBsYXppbHkgY3JlYXRlZC4KKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIG1UZXN0UG9vbC5nZXRTaXplKCkpOworICAgICAgICAvLyBNQVggcG9vbCBzaXplIHNob3VsZCBiZSBzZXQgdG8gTUFYX0NPTk4KKyAgICAgICAgYXNzZXJ0RXF1YWxzKE1BWF9DT05OLCBtVGVzdFBvb2wuZ2V0TWF4UG9vbFNpemUoKSk7CisgICAgICAgIC8vIGdldCBhIGNvbm5lY3Rpb24KKyAgICAgICAgU1FMaXRlRGF0YWJhc2UgZGIgPSBtVGVzdFBvb2wuZ2V0KFRFU1RfU1FMKTsKKyAgICAgICAgLy8gcG9vbCBzaXplIHNob3VsZCBiZSBvbmUgLSBzaW5jZSBvbmx5IG9uZSBzaG91bGQgYmUgYWxsb2NhdGVkIGZvciB0aGUgYWJvdmUgZ2V0KCkKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIG1UZXN0UG9vbC5nZXRTaXplKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMobURhdGFiYXNlLCBkYi5tUGFyZW50Q29ubk9iaik7CisgICAgICAgIC8vIG5vIGZyZWUgY29ubmVjdGlvbnMgc2hvdWxkIGJlIGF2YWlsYWJsZQorICAgICAgICBhc3NlcnRFcXVhbHMoMCwgbVRlc3RQb29sLmdldEZyZWVQb29sU2l6ZSgpKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UobVRlc3RQb29sLmlzRGF0YWJhc2VPYmpGcmVlKGRiKSk7CisgICAgICAgIC8vIHJlbGVhc2UgdGhlIGNvbm5lY3Rpb24KKyAgICAgICAgbVRlc3RQb29sLnJlbGVhc2UoZGIpOworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgbVRlc3RQb29sLmdldEZyZWVQb29sU2l6ZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIG1UZXN0UG9vbC5nZXRTaXplKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoTUFYX0NPTk4sIG1UZXN0UG9vbC5nZXRNYXhQb29sU2l6ZSgpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShtVGVzdFBvb2wuaXNEYXRhYmFzZU9iakZyZWUoZGIpKTsKKyAgICAgICAgLy8gcmVsZWFzZSB0aGUgc2FtZSBvYmplY3QgYWdhaW4gYW5kIGV4cGVjdCBJbGxlZ2FsU3RhdGVFeGNlcHRpb24KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG1UZXN0UG9vbC5yZWxlYXNlKGRiKTsKKyAgICAgICAgICAgIGZhaWwoImlsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBleHBlY3RlZCIpOworICAgICAgICB9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZSApIHsKKyAgICAgICAgICAgIC8vIGV4cGVjdGVkLgorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogZ2V0IGFsbCBjb25uZWN0aW9ucyBmcm9tIHRoZSBwb29sIGFuZCBhc2sgZm9yIG9uZSBtb3JlLgorICAgICAqIHNob3VsZCBnZXQgb25lIG9mIHRoZSBjb25uZWN0aW9ucyBhbHJlYWR5IGdvdCBzbyBmYXIuIAorICAgICAqLworICAgIEBTbWFsbFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0QWxsQ29ubkFuZE9uZU1vcmUoKSB7CisgICAgICAgIG1UZXN0UG9vbC5zZXRNYXhQb29sU2l6ZShNQVhfQ09OTik7CisgICAgICAgIGFzc2VydEVxdWFscyhNQVhfQ09OTiwgbVRlc3RQb29sLmdldE1heFBvb2xTaXplKCkpOworICAgICAgICBBcnJheUxpc3Q8U1FMaXRlRGF0YWJhc2U+IGRiT2JqcyA9IG5ldyBBcnJheUxpc3Q8U1FMaXRlRGF0YWJhc2U+KCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTUFYX0NPTk47IGkrKykgeworICAgICAgICAgICAgU1FMaXRlRGF0YWJhc2UgZGIgPSBtVGVzdFBvb2wuZ2V0KFRFU1RfU1FMKTsKKyAgICAgICAgICAgIGFzc2VydEZhbHNlKGRiT2Jqcy5jb250YWlucyhkYikpOworICAgICAgICAgICAgZGJPYmpzLmFkZChkYik7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMobURhdGFiYXNlLCBkYi5tUGFyZW50Q29ubk9iaik7CisgICAgICAgIH0KKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIG1UZXN0UG9vbC5nZXRGcmVlUG9vbFNpemUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhNQVhfQ09OTiwgbVRlc3RQb29sLmdldFNpemUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhNQVhfQ09OTiwgbVRlc3RQb29sLmdldE1heFBvb2xTaXplKCkpOworICAgICAgICAvLyBwb29sIGlzIG1heGVkIG91dCBhbmQgbm8gZnJlZSBjb25uZWN0aW9ucy4gYXNrIGZvciBvbmUgbW9yZSBjb25uZWN0aW9uCisgICAgICAgIFNRTGl0ZURhdGFiYXNlIGRiMSA9IG1UZXN0UG9vbC5nZXQoVEVTVF9TUUwpOworICAgICAgICAvLyBtYWtlIHN1cmUgZGIxIGlzIG9uZSBvZiB0aGUgZXhpc3Rpbmcgb25lcworICAgICAgICBhc3NlcnRUcnVlKGRiT2Jqcy5jb250YWlucyhkYjEpKTsKKyAgICAgICAgLy8gcG9vbCBzaXplIHNob3VsZCByZW1haW4gYXQgTUFYX0NPTk4KKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIG1UZXN0UG9vbC5nZXRGcmVlUG9vbFNpemUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhNQVhfQ09OTiwgbVRlc3RQb29sLmdldFNpemUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhNQVhfQ09OTiwgbVRlc3RQb29sLmdldE1heFBvb2xTaXplKCkpOworICAgICAgICAvLyByZWxlYXNlIGRiMSBidXQgc2luY2UgaXQgaXMgYWxsb2NhdGVkIDIgdGltZXMsIGl0IHNob3VsZCBzdGlsbCByZW1haW4gJ2J1c3knCisgICAgICAgIG1UZXN0UG9vbC5yZWxlYXNlKGRiMSk7CisgICAgICAgIGFzc2VydEZhbHNlKG1UZXN0UG9vbC5pc0RhdGFiYXNlT2JqRnJlZShkYjEpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIG1UZXN0UG9vbC5nZXRGcmVlUG9vbFNpemUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhNQVhfQ09OTiwgbVRlc3RQb29sLmdldFNpemUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhNQVhfQ09OTiwgbVRlc3RQb29sLmdldE1heFBvb2xTaXplKCkpOworICAgICAgICAvLyByZWxlYXNlIGFsbCBjb25uZWN0aW9ucworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IE1BWF9DT05OOyBpKyspIHsKKyAgICAgICAgICAgIG1UZXN0UG9vbC5yZWxlYXNlKGRiT2Jqcy5nZXQoaSkpOworICAgICAgICB9CisgICAgICAgIC8vIGFsbCBvYmplY3RzIGluIHRoZSBwb29sIHNob3VsZCBiZSBmcmVlZCBub3cKKyAgICAgICAgYXNzZXJ0RXF1YWxzKE1BWF9DT05OLCBtVGVzdFBvb2wuZ2V0RnJlZVBvb2xTaXplKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoTUFYX0NPTk4sIG1UZXN0UG9vbC5nZXRTaXplKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoTUFYX0NPTk4sIG1UZXN0UG9vbC5nZXRNYXhQb29sU2l6ZSgpKTsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogc2FtZSBhcyBhYm92ZSBleGNlcHQgdGhhdCBlYWNoIGNvbm5lY3Rpb24gaGFzIGRpZmZlcmVudCBTUUwgc3RhdGVtZW50IGFzc29jaWF0ZWQgd2l0aCBpdC4gCisgICAgICovCisgICAgQFNtYWxsVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RDb25uUmV0cmlldmFsRm9yUHJldmlvdXNseVNlZW5TcWwoKSB7CisgICAgICAgIG1UZXN0UG9vbC5zZXRNYXhQb29sU2l6ZShNQVhfQ09OTik7CisgICAgICAgIGFzc2VydEVxdWFscyhNQVhfQ09OTiwgbVRlc3RQb29sLmdldE1heFBvb2xTaXplKCkpOworCisgICAgICAgIEhhc2hNYXA8U3RyaW5nLCBTUUxpdGVEYXRhYmFzZT4gZGJPYmpzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTUUxpdGVEYXRhYmFzZT4oKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBNQVhfQ09OTjsgaSsrKSB7CisgICAgICAgICAgICBTUUxpdGVEYXRhYmFzZSBkYiA9IG1UZXN0UG9vbC5nZXQoVEVTVF9TUUxTW2ldKTsKKyAgICAgICAgICAgIGV4ZWN1dGVTcWxPbkRhdGFiYXNlQ29ubihkYiwgVEVTVF9TUUxTW2ldKTsKKyAgICAgICAgICAgIGFzc2VydEZhbHNlKGRiT2Jqcy52YWx1ZXMoKS5jb250YWlucyhkYikpOworICAgICAgICAgICAgZGJPYmpzLnB1dChURVNUX1NRTFNbaV0sIGRiKTsKKyAgICAgICAgfQorICAgICAgICBhc3NlcnRFcXVhbHMoMCwgbVRlc3RQb29sLmdldEZyZWVQb29sU2l6ZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKE1BWF9DT05OLCBtVGVzdFBvb2wuZ2V0U2l6ZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKE1BWF9DT05OLCBtVGVzdFBvb2wuZ2V0TWF4UG9vbFNpemUoKSk7CisgICAgICAgIC8vIHBvb2wgaXMgbWF4ZWQgb3V0IGFuZCBubyBmcmVlIGNvbm5lY3Rpb25zLiBhc2sgZm9yIG9uZSBtb3JlIGNvbm5lY3Rpb24KKyAgICAgICAgLy8gdXNlIGEgcHJldmlvdXNseSBzZWVuIFNRTCBzdGF0ZW1lbnQKKyAgICAgICAgU3RyaW5nIHRlc3RTcWwgPSBURVNUX1NRTFNbTUFYX0NPTk4gLSAxXTsKKyAgICAgICAgU1FMaXRlRGF0YWJhc2UgZGIxID0gbVRlc3RQb29sLmdldCh0ZXN0U3FsKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIG1UZXN0UG9vbC5nZXRGcmVlUG9vbFNpemUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhNQVhfQ09OTiwgbVRlc3RQb29sLmdldFNpemUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhNQVhfQ09OTiwgbVRlc3RQb29sLmdldE1heFBvb2xTaXplKCkpOworICAgICAgICAvLyBtYWtlIHN1cmUgZGIxIGlzIG9uZSBvZiB0aGUgZXhpc3Rpbmcgb25lcworICAgICAgICBhc3NlcnRUcnVlKGRiT2Jqcy52YWx1ZXMoKS5jb250YWlucyhkYjEpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGRiMSwgZGJPYmpzLmdldCh0ZXN0U3FsKSk7CisgICAgICAgIC8vIGRvIHRoZSBzYW1lIGFnYWluCisgICAgICAgIFNRTGl0ZURhdGFiYXNlIGRiMiA9IG1UZXN0UG9vbC5nZXQodGVzdFNxbCk7CisgICAgICAgIC8vIG1ha2Ugc3VyZSBkYjEgaXMgb25lIG9mIHRoZSBleGlzdGluZyBvbmVzCisgICAgICAgIGFzc2VydEVxdWFscyhkYjIsIGRiT2Jqcy5nZXQodGVzdFNxbCkpOworCisgICAgICAgIC8vIHBvb2wgc2l6ZSBzaG91bGQgcmVtYWluIGF0IE1BWF9DT05OCisgICAgICAgIGFzc2VydEVxdWFscygwLCBtVGVzdFBvb2wuZ2V0RnJlZVBvb2xTaXplKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoTUFYX0NPTk4sIG1UZXN0UG9vbC5nZXRTaXplKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoTUFYX0NPTk4sIG1UZXN0UG9vbC5nZXRNYXhQb29sU2l6ZSgpKTsKKworICAgICAgICAvLyByZWxlYXNlIGRiMSBidXQgc2luY2UgdGhlIHNhbWUgY29ubmVjdGlvbiBpcyBhbGxvY2F0ZWQgMyB0aW1lcywKKyAgICAgICAgLy8gaXQgc2hvdWxkIHN0aWxsIHJlbWFpbiAnYnVzeScKKyAgICAgICAgbVRlc3RQb29sLnJlbGVhc2UoZGIxKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UobVRlc3RQb29sLmlzRGF0YWJhc2VPYmpGcmVlKGRiT2Jqcy5nZXQodGVzdFNxbCkpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIG1UZXN0UG9vbC5nZXRGcmVlUG9vbFNpemUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhNQVhfQ09OTiwgbVRlc3RQb29sLmdldFNpemUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhNQVhfQ09OTiwgbVRlc3RQb29sLmdldE1heFBvb2xTaXplKCkpOworCisgICAgICAgIC8vIHJlbGVhc2UgZGIyIGJ1dCBzaW5jZSB0aGUgc2FtZSBjb25uZWN0aW9uIGlzIGFsbG9jYXRlZCAyIHRpbWVzLAorICAgICAgICAvLyBpdCBzaG91bGQgc3RpbGwgcmVtYWluICdidXN5JworICAgICAgICBtVGVzdFBvb2wucmVsZWFzZShkYjIpOworICAgICAgICBhc3NlcnRGYWxzZShtVGVzdFBvb2wuaXNEYXRhYmFzZU9iakZyZWUoZGJPYmpzLmdldCh0ZXN0U3FsKSkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMCwgbVRlc3RQb29sLmdldEZyZWVQb29sU2l6ZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKE1BWF9DT05OLCBtVGVzdFBvb2wuZ2V0U2l6ZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKE1BWF9DT05OLCBtVGVzdFBvb2wuZ2V0TWF4UG9vbFNpemUoKSk7CisKKyAgICAgICAgLy8gcmVsZWFzZSBhbGwgY29ubmVjdGlvbnMKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBNQVhfQ09OTjsgaSsrKSB7CisgICAgICAgICAgICBtVGVzdFBvb2wucmVsZWFzZShkYk9ianMuZ2V0KFRFU1RfU1FMU1tpXSkpOworICAgICAgICB9CisgICAgICAgIC8vIGFsbCBvYmplY3RzIGluIHRoZSBwb29sIHNob3VsZCBiZSBmcmVlZCBub3cKKyAgICAgICAgYXNzZXJ0RXF1YWxzKE1BWF9DT05OLCBtVGVzdFBvb2wuZ2V0RnJlZVBvb2xTaXplKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoTUFYX0NPTk4sIG1UZXN0UG9vbC5nZXRTaXplKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoTUFYX0NPTk4sIG1UZXN0UG9vbC5nZXRNYXhQb29sU2l6ZSgpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgZXhlY3V0ZVNxbE9uRGF0YWJhc2VDb25uKFNRTGl0ZURhdGFiYXNlIGRiLCBTdHJpbmcgc3FsKSB7CisgICAgICAgIC8vIGdldCB0aGUgZ2l2ZW4gc3FsIGJlIGNvbXBpbGVkIG9uIHRoZSBnaXZlbiBkYXRhYmFzZSBjb25uZWN0aW9uLgorICAgICAgICAvLyB0aGlzIHdpbGwgaGVscCBEYXRhYmFzZUNvbmVuY3Rpb25Qb29sIGZpZ3VyZSBvdXQgaWYgYSBnaXZlbiBTUUwgc3RhdGVtZW50CisgICAgICAgIC8vIGlzIGFscmVhZHkgY2FjaGVkIGJ5IGEgZGF0YWJhc2UgY29ubmVjdGlvbi4KKyAgICAgICAgQ2xhc3NUb1Rlc3RTcWxDb21waWxhdGlvbkFuZENhY2hpbmcgYyA9CisgICAgICAgICAgICAgICAgQ2xhc3NUb1Rlc3RTcWxDb21waWxhdGlvbkFuZENhY2hpbmcuY3JlYXRlKGRiLCBzcWwpOworICAgICAgICBjLmNsb3NlKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogZ2V0IGEgY29ubmVjdGlvbiBmb3IgYSBTUUwgc3RhdGVtZW50ICdibGFoJy4gKGNvbm5lY3Rpb25fcykKKyAgICAgKiBtYWtlIHN1cmUgdGhlIHBvb2wgaGFzIGF0IGxlYXN0IG9uZSBmcmVlIGNvbm5lY3Rpb24gZXZlbiBhZnRlciB0aGlzIGdldCgpLgorICAgICAqIGFuZCBnZXQgYSBjb25uZWN0aW9uIGZvciB0aGUgc2FtZSBTUUwgYWdhaW4uCisgICAgICogICAgdGhpcyBjb25uZWN0aW9uIHNob3VsZCBiZSBkaWZmZXJlbnQgZnJvbSBjb25uZWN0aW9uX3MuCisgICAgICogICAgZXZlbiB0aG91Z2ggdGhlcmUgaXMgYSBjb25uZWN0aW9uIHdpdGggdGhlIGdpdmVuIFNRTCBwcmUtY29tcGlsZWQsIHNpbmNlIGlzIGl0IG5vdCBmcmVlCisgICAgICogICAgQU5EIHNpbmNlIHRoZSBwb29sIGhhcyBmcmVlIGNvbm5lY3Rpb25zIGF2YWlsYWJsZSwgc2hvdWxkIGdldCBhIG5ldyBjb25uZWN0aW9uLgorICAgICAqLworICAgIEBTbWFsbFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0Q29ubkZvclRoZVNhbWVTcWwoKSB7CisgICAgICAgIG1UZXN0UG9vbC5zZXRNYXhQb29sU2l6ZShNQVhfQ09OTik7CisKKyAgICAgICAgU1FMaXRlRGF0YWJhc2UgZGIgPSBtVGVzdFBvb2wuZ2V0KFRFU1RfU1FMKTsKKyAgICAgICAgZXhlY3V0ZVNxbE9uRGF0YWJhc2VDb25uKGRiLCBURVNUX1NRTCk7CisgICAgICAgIGFzc2VydEVxdWFscygwLCBtVGVzdFBvb2wuZ2V0RnJlZVBvb2xTaXplKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgbVRlc3RQb29sLmdldFNpemUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhNQVhfQ09OTiwgbVRlc3RQb29sLmdldE1heFBvb2xTaXplKCkpOworCisgICAgICAgIGFzc2VydEZhbHNlKG1UZXN0UG9vbC5pc0RhdGFiYXNlT2JqRnJlZShkYikpOworCisgICAgICAgIFNRTGl0ZURhdGFiYXNlIGRiMSA9IG1UZXN0UG9vbC5nZXQoVEVTVF9TUUwpOworICAgICAgICBhc3NlcnRFcXVhbHMoMCwgbVRlc3RQb29sLmdldEZyZWVQb29sU2l6ZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIG1UZXN0UG9vbC5nZXRTaXplKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoTUFYX0NPTk4sIG1UZXN0UG9vbC5nZXRNYXhQb29sU2l6ZSgpKTsKKworICAgICAgICBhc3NlcnRGYWxzZShtVGVzdFBvb2wuaXNEYXRhYmFzZU9iakZyZWUoZGIxKSk7CisgICAgICAgIGFzc2VydEZhbHNlKGRiMS5lcXVhbHMoZGIpKTsKKworICAgICAgICBtVGVzdFBvb2wucmVsZWFzZShkYik7CisgICAgICAgIGFzc2VydEVxdWFscygxLCBtVGVzdFBvb2wuZ2V0RnJlZVBvb2xTaXplKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMiwgbVRlc3RQb29sLmdldFNpemUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhNQVhfQ09OTiwgbVRlc3RQb29sLmdldE1heFBvb2xTaXplKCkpOworCisgICAgICAgIG1UZXN0UG9vbC5yZWxlYXNlKGRiMSk7CisgICAgICAgIGFzc2VydEVxdWFscygyLCBtVGVzdFBvb2wuZ2V0RnJlZVBvb2xTaXplKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMiwgbVRlc3RQb29sLmdldFNpemUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhNQVhfQ09OTiwgbVRlc3RQb29sLmdldE1heFBvb2xTaXplKCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIGdldCB0aGUgc2FtZSBjb25uZWN0aW9uIE4gdGltZXMgYW5kIHJlbGVhc2UgaXQgTiB0aW1lcy4KKyAgICAgKiB0aGlzIHRlc3RzIERhdGFiYXNlQ29ubmVjdGlvblBvb2wuUG9vbE9iai5tTnVtSG9sZGVycworICAgICAqLworICAgIEBTbWFsbFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0U2FtZUNvbm5OdGltZXNBbmRSZWxlYXNlSXROdGltZXMoKSB7CisgICAgICAgIG1UZXN0UG9vbC5zZXRNYXhQb29sU2l6ZShNQVhfQ09OTik7CisgICAgICAgIGFzc2VydEVxdWFscyhNQVhfQ09OTiwgbVRlc3RQb29sLmdldE1heFBvb2xTaXplKCkpOworCisgICAgICAgIEhhc2hNYXA8U3RyaW5nLCBTUUxpdGVEYXRhYmFzZT4gZGJPYmpzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTUUxpdGVEYXRhYmFzZT4oKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBNQVhfQ09OTjsgaSsrKSB7CisgICAgICAgICAgICBTUUxpdGVEYXRhYmFzZSBkYiA9IG1UZXN0UG9vbC5nZXQoVEVTVF9TUUxTW2ldKTsKKyAgICAgICAgICAgIGV4ZWN1dGVTcWxPbkRhdGFiYXNlQ29ubihkYiwgVEVTVF9TUUxTW2ldKTsKKyAgICAgICAgICAgIGFzc2VydEZhbHNlKGRiT2Jqcy52YWx1ZXMoKS5jb250YWlucyhkYikpOworICAgICAgICAgICAgZGJPYmpzLnB1dChURVNUX1NRTFNbaV0sIGRiKTsKKyAgICAgICAgfQorICAgICAgICBhc3NlcnRFcXVhbHMoMCwgbVRlc3RQb29sLmdldEZyZWVQb29sU2l6ZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKE1BWF9DT05OLCBtVGVzdFBvb2wuZ2V0U2l6ZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKE1BWF9DT05OLCBtVGVzdFBvb2wuZ2V0TWF4UG9vbFNpemUoKSk7CisgICAgICAgIC8vIGV2ZXJ5IGNvbm5lY3Rpb24gaW4gdGhlIHBvb2wgc2hvdWxkIGhhdmUgbnVtSG9sZGVycyA9IDEKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBNQVhfQ09OTjsgaSArKykgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIG1UZXN0UG9vbC5nZXRQb29sKCkuZ2V0KGkpLmdldE51bUhvbGRlcnMoKSk7CisgICAgICAgIH0KKyAgICAgICAgLy8gcG9vbCBpcyBtYXhlZCBvdXQgYW5kIG5vIGZyZWUgY29ubmVjdGlvbnMuIGFzayBmb3Igb25lIG1vcmUgY29ubmVjdGlvbgorICAgICAgICAvLyB1c2UgYSBwcmV2aW91c2x5IHNlZW4gU1FMIHN0YXRlbWVudAorICAgICAgICBTdHJpbmcgdGVzdFNxbCA9IFRFU1RfU1FMU1tNQVhfQ09OTiAtIDFdOworICAgICAgICBTUUxpdGVEYXRhYmFzZSBkYjEgPSBtVGVzdFBvb2wuZ2V0KHRlc3RTcWwpOworICAgICAgICBhc3NlcnRFcXVhbHMoMCwgbVRlc3RQb29sLmdldEZyZWVQb29sU2l6ZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKE1BWF9DT05OLCBtVGVzdFBvb2wuZ2V0U2l6ZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKE1BWF9DT05OLCBtVGVzdFBvb2wuZ2V0TWF4UG9vbFNpemUoKSk7CisgICAgICAgIC8vIG1ha2Ugc3VyZSBkYjEgaXMgb25lIG9mIHRoZSBleGlzdGluZyBvbmVzCisgICAgICAgIGFzc2VydFRydWUoZGJPYmpzLnZhbHVlcygpLmNvbnRhaW5zKGRiMSkpOworICAgICAgICBhc3NlcnRFcXVhbHMoZGIxLCBkYk9ianMuZ2V0KHRlc3RTcWwpKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UobVRlc3RQb29sLmlzRGF0YWJhc2VPYmpGcmVlKGRiMSkpOworICAgICAgICBEYXRhYmFzZUNvbm5lY3Rpb25Qb29sLlBvb2xPYmogcG9vbE9iaiA9IG1UZXN0UG9vbC5nZXRQb29sKCkuZ2V0KGRiMS5tQ29ubmVjdGlvbk51bSAtIDEpOworICAgICAgICBpbnQgbnVtSG9sZGVycyA9IHBvb2xPYmouZ2V0TnVtSG9sZGVycygpOworICAgICAgICBhc3NlcnRFcXVhbHMoMiwgbnVtSG9sZGVycyk7CisgICAgICAgIGFzc2VydEVxdWFscygwLCBtVGVzdFBvb2wuZ2V0RnJlZVBvb2xTaXplKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoTUFYX0NPTk4sIG1UZXN0UG9vbC5nZXRTaXplKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoTUFYX0NPTk4sIG1UZXN0UG9vbC5nZXRNYXhQb29sU2l6ZSgpKTsKKyAgICAgICAgLy8gZ2V0IHRoZSBzYW1lIGNvbm5lY3Rpb24gTiB0aW1lcyBtb3JlCisgICAgICAgIGludCBOID0gMTAwOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IE47IGkrKykgeworICAgICAgICAgICAgU1FMaXRlRGF0YWJhc2UgZGIyID0gbVRlc3RQb29sLmdldCh0ZXN0U3FsKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhkYjEsIGRiMik7CisgICAgICAgICAgICBhc3NlcnRGYWxzZShtVGVzdFBvb2wuaXNEYXRhYmFzZU9iakZyZWUoZGIyKSk7CisgICAgICAgICAgICAvLyBudW1Ib2xkZXJzIGZvciB0aGlzIG9iamVjdCBzaG91bGQgYmUgbm93IHVwIGJ5IDEKKyAgICAgICAgICAgIGludCBwcmV2ID0gbnVtSG9sZGVyczsKKyAgICAgICAgICAgIG51bUhvbGRlcnMgPSBwb29sT2JqLmdldE51bUhvbGRlcnMoKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhwcmV2ICsgMSwgbnVtSG9sZGVycyk7CisgICAgICAgIH0KKyAgICAgICAgLy8gcmVsZWFzZSBpdCBOIHRpbWVzCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTjsgaSsrKSB7CisgICAgICAgICAgICBtVGVzdFBvb2wucmVsZWFzZShkYjEpOworICAgICAgICAgICAgaW50IHByZXYgPSBudW1Ib2xkZXJzOworICAgICAgICAgICAgbnVtSG9sZGVycyA9IHBvb2xPYmouZ2V0TnVtSG9sZGVycygpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHByZXYgLSAxLCBudW1Ib2xkZXJzKTsKKyAgICAgICAgICAgIGFzc2VydEZhbHNlKG1UZXN0UG9vbC5pc0RhdGFiYXNlT2JqRnJlZShkYjEpKTsKKyAgICAgICAgfQorICAgICAgICAvLyB0aGUgY29ubmVjdGlvbiBzaG91bGQgc3RpbGwgaGF2ZSAyIG1vcmUgaG9sZGVycworICAgICAgICBhc3NlcnRGYWxzZShtVGVzdFBvb2wuaXNEYXRhYmFzZU9iakZyZWUoZGIxKSk7CisgICAgICAgIGFzc2VydEVxdWFscygyLCBwb29sT2JqLmdldE51bUhvbGRlcnMoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygwLCBtVGVzdFBvb2wuZ2V0RnJlZVBvb2xTaXplKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoTUFYX0NPTk4sIG1UZXN0UG9vbC5nZXRTaXplKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoTUFYX0NPTk4sIG1UZXN0UG9vbC5nZXRNYXhQb29sU2l6ZSgpKTsKKyAgICAgICAgLy8gcmVsZWFzZSAyIG1vcmUgdGltZXMKKyAgICAgICAgbVRlc3RQb29sLnJlbGVhc2UoZGIxKTsKKyAgICAgICAgbVRlc3RQb29sLnJlbGVhc2UoZGIxKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIHBvb2xPYmouZ2V0TnVtSG9sZGVycygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIG1UZXN0UG9vbC5nZXRGcmVlUG9vbFNpemUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhNQVhfQ09OTiwgbVRlc3RQb29sLmdldFNpemUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhNQVhfQ09OTiwgbVRlc3RQb29sLmdldE1heFBvb2xTaXplKCkpOworICAgICAgICBhc3NlcnRUcnVlKG1UZXN0UG9vbC5pc0RhdGFiYXNlT2JqRnJlZShkYjEpKTsKKyAgICB9CisKKyAgICBAU21hbGxUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFN0cmVzc1Rlc3QoKSB7CisgICAgICAgIG1UZXN0UG9vbC5zZXRNYXhQb29sU2l6ZShNQVhfQ09OTik7CisgICAgICAgIGFzc2VydEVxdWFscyhNQVhfQ09OTiwgbVRlc3RQb29sLmdldE1heFBvb2xTaXplKCkpOworCisgICAgICAgIEhhc2hNYXA8U1FMaXRlRGF0YWJhc2UsIEludGVnZXI+IGRiTWFwID0gbmV3IEhhc2hNYXA8U1FMaXRlRGF0YWJhc2UsIEludGVnZXI+KCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTUFYX0NPTk47IGkrKykgeworICAgICAgICAgICAgU1FMaXRlRGF0YWJhc2UgZGIgPSBtVGVzdFBvb2wuZ2V0KFRFU1RfU1FMU1tpXSk7CisgICAgICAgICAgICBhc3NlcnRGYWxzZShkYk1hcC5jb250YWluc0tleShkYikpOworICAgICAgICAgICAgZGJNYXAucHV0KGRiLCAxKTsKKyAgICAgICAgICAgIGV4ZWN1dGVTcWxPbkRhdGFiYXNlQ29ubihkYiwgVEVTVF9TUUxTW2ldKTsKKyAgICAgICAgfQorICAgICAgICBhc3NlcnRFcXVhbHMoMCwgbVRlc3RQb29sLmdldEZyZWVQb29sU2l6ZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKE1BWF9DT05OLCBtVGVzdFBvb2wuZ2V0U2l6ZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKE1BWF9DT05OLCBtVGVzdFBvb2wuZ2V0TWF4UG9vbFNpemUoKSk7CisgICAgICAgIC8vIGFzayBmb3IgbG90IG1vcmUgY29ubmVjdGlvbnMgYnV0IHNpbmNlIHRoZSBwb29sIGlzIG1heGVkIG91dCwgd2Ugc2hvdWxkIHN0YXJ0IHJlY2VpdmluZworICAgICAgICAvLyBjb25uZWN0aW9ucyB0aGF0IHdlIGFscmVhZHkgZ290IHNvIGZhcgorICAgICAgICBmb3IgKGludCBpID0gTUFYX0NPTk47IGkgPCAxMDAwOyBpKyspIHsKKyAgICAgICAgICAgIFNRTGl0ZURhdGFiYXNlIGRiID0gbVRlc3RQb29sLmdldChURVNUX1NRTCArIGkpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShkYk1hcC5jb250YWluc0tleShkYikpOworICAgICAgICAgICAgaW50IGsgPSBkYk1hcC5nZXQoZGIpOworICAgICAgICAgICAgZGJNYXAucHV0KGRiLCArK2spOworICAgICAgICB9CisgICAgICAgIGFzc2VydEVxdWFscygwLCBtVGVzdFBvb2wuZ2V0RnJlZVBvb2xTaXplKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoTUFYX0NPTk4sIG1UZXN0UG9vbC5nZXRTaXplKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoTUFYX0NPTk4sIG1UZXN0UG9vbC5nZXRNYXhQb29sU2l6ZSgpKTsKKyAgICAgICAgLy8gcHJpbnQgdGhlIGRpc3RyaWJ1dGlvbiBvZiB0aGUgZGF0YWJhc2UgY29ubmVjdGlvbiBoYW5kbGVzIHJlY2VpdmVkLCBzaG91bGQgYmUgdW5pZm9ybS4KKyAgICAgICAgZm9yIChTUUxpdGVEYXRhYmFzZSBkIDogZGJNYXAua2V5U2V0KCkpIHsKKyAgICAgICAgICAgIExvZy5pKFRBRywgImNvbm5lY3Rpb24gIyAiICsgZC5tQ29ubmVjdGlvbk51bSArICIsIG51bUhvbGRlcnM6ICIgKyBkYk1hcC5nZXQoZCkpOworICAgICAgICB9CisgICAgICAgIC8vIHByaW50IHRoZSBwb29sIGluZm8KKyAgICAgICAgTG9nLmkoVEFHLCBtVGVzdFBvb2wudG9TdHJpbmcoKSk7CisgICAgICAgIC8vIHJlbGVhc2UgYWxsCisgICAgICAgIGZvciAoU1FMaXRlRGF0YWJhc2UgZCA6IGRiTWFwLmtleVNldCgpKSB7CisgICAgICAgICAgICBpbnQgbnVtID0gZGJNYXAuZ2V0KGQpOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW07IGkrKykgeworICAgICAgICAgICAgICAgIG1UZXN0UG9vbC5yZWxlYXNlKGQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGFzc2VydEVxdWFscyhNQVhfQ09OTiwgbVRlc3RQb29sLmdldEZyZWVQb29sU2l6ZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKE1BWF9DT05OLCBtVGVzdFBvb2wuZ2V0U2l6ZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKE1BWF9DT05OLCBtVGVzdFBvb2wuZ2V0TWF4UG9vbFNpemUoKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvZGF0YWJhc2Uvc3FsaXRlL1NRTGl0ZUN1cnNvclRlc3QuamF2YSBiL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9TUUxpdGVDdXJzb3JUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmJmZmU3MAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9TUUxpdGVDdXJzb3JUZXN0LmphdmEKQEAgLTAsMCArMSwxOTQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlOworCitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRWYWx1ZXM7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5DdXJzb3I7CitpbXBvcnQgYW5kcm9pZC50ZXN0LkFuZHJvaWRUZXN0Q2FzZTsKK2ltcG9ydCBhbmRyb2lkLnRlc3Quc3VpdGVidWlsZGVyLmFubm90YXRpb24uU21hbGxUZXN0OworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CitpbXBvcnQgamF2YS51dGlsLlNldDsKKworcHVibGljIGNsYXNzIFNRTGl0ZUN1cnNvclRlc3QgZXh0ZW5kcyBBbmRyb2lkVGVzdENhc2UgeworICAgIHByaXZhdGUgU1FMaXRlRGF0YWJhc2UgbURhdGFiYXNlOworICAgIHByaXZhdGUgRmlsZSBtRGF0YWJhc2VGaWxlOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUJMRV9OQU1FID0gInRlc3RDdXJzb3IiOworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHN1cGVyLnNldFVwKCk7CisKKyAgICAgICAgRmlsZSBkYkRpciA9IGdldENvbnRleHQoKS5nZXREaXIodGhpcy5nZXRDbGFzcygpLmdldE5hbWUoKSwgQ29udGV4dC5NT0RFX1BSSVZBVEUpOworICAgICAgICBtRGF0YWJhc2VGaWxlID0gbmV3IEZpbGUoZGJEaXIsICJzcWxpdGVjdXJzb3JfdGVzdC5kYiIpOworICAgICAgICBpZiAobURhdGFiYXNlRmlsZS5leGlzdHMoKSkgeworICAgICAgICAgICAgbURhdGFiYXNlRmlsZS5kZWxldGUoKTsKKyAgICAgICAgfQorICAgICAgICBtRGF0YWJhc2UgPSBTUUxpdGVEYXRhYmFzZS5vcGVuT3JDcmVhdGVEYXRhYmFzZShtRGF0YWJhc2VGaWxlLmdldFBhdGgoKSwgbnVsbCk7CisgICAgICAgIGFzc2VydE5vdE51bGwobURhdGFiYXNlKTsKKyAgICAgICAgLy8gY3JlYXRlIGEgdGVzdCB0YWJsZQorICAgICAgICBtRGF0YWJhc2UuZXhlY1NRTCgiQ1JFQVRFIFRBQkxFICIgKyBUQUJMRV9OQU1FICsgIiAoaSBpbnQsIGogaW50KTsiKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBtRGF0YWJhc2UuY2xvc2UoKTsKKyAgICAgICAgbURhdGFiYXNlRmlsZS5kZWxldGUoKTsKKyAgICAgICAgc3VwZXIudGVhckRvd24oKTsKKyAgICB9CisKKyAgICBAU21hbGxUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFF1ZXJ5T2JqUmVhc3NpZ25tZW50KCkgeworICAgICAgICBtRGF0YWJhc2UuZW5hYmxlV3JpdGVBaGVhZExvZ2dpbmcoKTsKKyAgICAgICAgLy8gaGF2ZSBhIGZldyBjb25uZWN0aW9ucyBpbiB0aGUgZGF0YWJhc2UgY29ubmVjdGlvbiBwb29sCisgICAgICAgIERhdGFiYXNlQ29ubmVjdGlvblBvb2wgcG9vbCA9IG1EYXRhYmFzZS5tQ29ubmVjdGlvblBvb2w7CisgICAgICAgIHBvb2wuc2V0TWF4UG9vbFNpemUoNSk7CisgICAgICAgIFNRTGl0ZUN1cnNvciBjdXJzb3IgPQorICAgICAgICAgICAgICAgIChTUUxpdGVDdXJzb3IpIG1EYXRhYmFzZS5yYXdRdWVyeSgic2VsZWN0ICogZnJvbSAiICsgVEFCTEVfTkFNRSwgbnVsbCk7CisgICAgICAgIGFzc2VydE5vdE51bGwoY3Vyc29yKTsKKyAgICAgICAgLy8gaXQgc2hvdWxkIHVzZSBhIHBvb2xlZCBkYXRhYmFzZSBjb25uZWN0aW9uCisgICAgICAgIFNRTGl0ZURhdGFiYXNlIGRiID0gY3Vyc29yLmdldERhdGFiYXNlKCk7CisgICAgICAgIGFzc2VydFRydWUoZGIubUNvbm5lY3Rpb25OdW0gPiAwKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UobURhdGFiYXNlLmVxdWFscyhkYikpOworICAgICAgICBhc3NlcnRFcXVhbHMobURhdGFiYXNlLCBkYi5tUGFyZW50Q29ubk9iaik7CisgICAgICAgIGFzc2VydFRydWUocG9vbC5nZXRDb25uZWN0aW9uTGlzdCgpLmNvbnRhaW5zKGRiKSk7CisgICAgICAgIGFzc2VydFRydWUoZGIuaXNPcGVuKCkpOworICAgICAgICAvLyBkbyBhIHJlcXVlcnkuIGN1cnNvciBzaG91bGQgY29udGludWUgdG8gdXNlIHRoZSBhYm92ZSBwb29sZWQgY29ubmVjdGlvbgorICAgICAgICBjdXJzb3IucmVxdWVyeSgpOworICAgICAgICBTUUxpdGVEYXRhYmFzZSBkYkFnYWluID0gY3Vyc29yLmdldERhdGFiYXNlKCk7CisgICAgICAgIGFzc2VydEVxdWFscyhkYiwgZGJBZ2Fpbik7CisgICAgICAgIC8vIGRpc2FibGUgV0FMIHNvIHRoYXQgdGhlIHBvb2xlZCBjb25uZWN0aW9uIGhlbGQgYnkgdGhlIGFib3ZlIGN1cnNvciBpcyBjbG9zZWQKKyAgICAgICAgbURhdGFiYXNlLmRpc2FibGVXcml0ZUFoZWFkTG9nZ2luZygpOworICAgICAgICBhc3NlcnRGYWxzZShkYi5pc09wZW4oKSk7CisgICAgICAgIGFzc2VydE51bGwobURhdGFiYXNlLm1Db25uZWN0aW9uUG9vbCk7CisgICAgICAgIC8vIHJlcXVlcnkgLSB3aGljaCBzaG91bGQgbWFrZSB0aGUgY3Vyc29yIHVzZSBtRGF0YWJhc2UgY29ubmVjdGlvbiBzaW5jZSB0aGUgcG9vbGVkCisgICAgICAgIC8vIGNvbm5lY3Rpb24gaXMgbm8gbG9uZ2VyIGF2YWlsYWJsZQorICAgICAgICBjdXJzb3IucmVxdWVyeSgpOworICAgICAgICBTUUxpdGVEYXRhYmFzZSBkYjEgPSBjdXJzb3IuZ2V0RGF0YWJhc2UoKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShkYjEubUNvbm5lY3Rpb25OdW0gPT0gMCk7CisgICAgICAgIGFzc2VydEVxdWFscyhtRGF0YWJhc2UsIGRiMSk7CisgICAgICAgIGFzc2VydE51bGwobURhdGFiYXNlLm1Db25uZWN0aW9uUG9vbCk7CisgICAgICAgIGFzc2VydFRydWUoZGIxLmlzT3BlbigpKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UobURhdGFiYXNlLmVxdWFscyhkYikpOworICAgICAgICAvLyBlbmFibGUgV0FMIGFuZCByZXF1ZXJ5IC0gdGhpcyB0aW1lIGEgcG9vbGVkIGNvbm5lY3Rpb24gc2hvdWxkIGJlIHVzZWQKKyAgICAgICAgbURhdGFiYXNlLmVuYWJsZVdyaXRlQWhlYWRMb2dnaW5nKCk7CisgICAgICAgIGN1cnNvci5yZXF1ZXJ5KCk7CisgICAgICAgIGRiID0gY3Vyc29yLmdldERhdGFiYXNlKCk7CisgICAgICAgIGFzc2VydFRydWUoZGIubUNvbm5lY3Rpb25OdW0gPiAwKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UobURhdGFiYXNlLmVxdWFscyhkYikpOworICAgICAgICBhc3NlcnRFcXVhbHMobURhdGFiYXNlLCBkYi5tUGFyZW50Q29ubk9iaik7CisgICAgICAgIGFzc2VydFRydWUobURhdGFiYXNlLm1Db25uZWN0aW9uUG9vbC5nZXRDb25uZWN0aW9uTGlzdCgpLmNvbnRhaW5zKGRiKSk7CisgICAgICAgIGFzc2VydFRydWUoZGIuaXNPcGVuKCkpOworICAgIH0KKworICAgIEBTbWFsbFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RmlsbFdpbmRvdygpIHsKKyAgICAgICAgLy8gY3JlYXRlIHNjaGVtYQorICAgICAgICBmaW5hbCBTdHJpbmcgdGVzdFRhYmxlID0gInRlc3RWIjsKKyAgICAgICAgbURhdGFiYXNlLmJlZ2luVHJhbnNhY3Rpb24oKTsKKyAgICAgICAgbURhdGFiYXNlLmV4ZWNTUUwoIkNSRUFURSBUQUJMRSAiICsgdGVzdFRhYmxlICsgIiAoY29sMSBpbnQsIGRlc2MgdGV4dCBub3QgbnVsbCk7Iik7CisgICAgICAgIG1EYXRhYmFzZS5zZXRUcmFuc2FjdGlvblN1Y2Nlc3NmdWwoKTsKKyAgICAgICAgbURhdGFiYXNlLmVuZFRyYW5zYWN0aW9uKCk7CisKKyAgICAgICAgLy8gcG9wdWxhdGUgdGhlIHRhYmxlIHdpdGggZGF0YQorICAgICAgICAvLyBjcmVhdGUgYSBiaWcgc3RyaW5nIHRoYXQgd2lsbCBhbG1vc3QgZml0IGEgcGFnZSBidXQgbm90IHF1aXRlLgorICAgICAgICAvLyBzaW5jZSBzcWxpdGUgd2FudHMgdG8gbWFrZSBzdXJlIGVhY2ggcm93IGlzIGluIGEgcGFnZSwgdGhpcyBzdHJpbmcgd2lsbCBhbGxvY2F0ZQorICAgICAgICAvLyBhIG5ldyBkYXRhYmFzZSBwYWdlIGZvciBlYWNoIHJvdy4KKyAgICAgICAgU3RyaW5nQnVpbGRlciBidWZmID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCA1MDA7IGkrKykgeworICAgICAgICAgICAgYnVmZi5hcHBlbmQoaSAlIDEwICsgIiIpOworICAgICAgICB9CisgICAgICAgIENvbnRlbnRWYWx1ZXMgdmFsdWVzID0gbmV3IENvbnRlbnRWYWx1ZXMoKTsKKyAgICAgICAgdmFsdWVzLnB1dCgiZGVzYyIsIGJ1ZmYudG9TdHJpbmcoKSk7CisKKyAgICAgICAgLy8gaW5zZXJ0IG1vcmUgdGhhbiAxTUIgb2YgZGF0YSBpbiB0aGUgdGFibGUuIHRoaXMgc2hvdWxkIGVuc3VyZSB0aGF0IHRoZSBlbnRpcmUgdGFibGVkYXRhCisgICAgICAgIC8vIHdpbGwgbmVlZCBtb3JlIHRoYW4gb25lIEN1cnNvcldpbmRvdworICAgICAgICBpbnQgTiA9IDUwMDA7CisgICAgICAgIFNldDxJbnRlZ2VyPiByb3dzID0gbmV3IEhhc2hTZXQ8SW50ZWdlcj4oKTsKKyAgICAgICAgbURhdGFiYXNlLmJlZ2luVHJhbnNhY3Rpb24oKTsKKyAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBOOyBqKyspIHsKKyAgICAgICAgICAgIHZhbHVlcy5wdXQoImNvbDEiLCBqKTsKKyAgICAgICAgICAgIG1EYXRhYmFzZS5pbnNlcnQodGVzdFRhYmxlLCBudWxsLCB2YWx1ZXMpOworICAgICAgICAgICAgcm93cy5hZGQoaik7IC8vIHN0b3JlIGluIGEgaGFzaHRhYmxlIHNvIHdlIGNhbiB2ZXJpZnkgdGhlIHJlc3VsdHMgZnJvbSBjdXJzb3IgbGF0ZXIgb24KKyAgICAgICAgfQorICAgICAgICBtRGF0YWJhc2Uuc2V0VHJhbnNhY3Rpb25TdWNjZXNzZnVsKCk7CisgICAgICAgIG1EYXRhYmFzZS5lbmRUcmFuc2FjdGlvbigpOworICAgICAgICBhc3NlcnRFcXVhbHMoTiwgcm93cy5zaXplKCkpOworICAgICAgICBDdXJzb3IgYzEgPSBtRGF0YWJhc2UucmF3UXVlcnkoInNlbGVjdCAqIGZyb20gIiArIHRlc3RUYWJsZSwgbnVsbCk7CisgICAgICAgIGFzc2VydEVxdWFscyhOLCBjMS5nZXRDb3VudCgpKTsKKyAgICAgICAgYzEuY2xvc2UoKTsKKworICAgICAgICAvLyBzY3JvbGwgdGhyb3VnaCBBTEwgZGF0YSBpbiB0aGUgdGFibGUgdXNpbmcgYSBjdXJzb3IuIHNob3VsZCBjYXVzZSBtdWx0aXBsZSBjYWxscyB0bworICAgICAgICAvLyBuYXRpdmVfZmlsbF93aW5kb3cgKGFuZCByZS1maWxscyBvZiB0aGUgQ3Vyc29yV2luZG93IG9iamVjdCkKKyAgICAgICAgQ3Vyc29yIGMgPSBtRGF0YWJhc2UucXVlcnkodGVzdFRhYmxlLCBuZXcgU3RyaW5nW117ImNvbDEiLCAiZGVzYyJ9LAorICAgICAgICAgICAgICAgIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwpOworICAgICAgICBpbnQgaSA9IDA7CisgICAgICAgIHdoaWxlIChjLm1vdmVUb05leHQoKSkgeworICAgICAgICAgICAgaW50IHZhbCA9IGMuZ2V0SW50KDApOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShyb3dzLmNvbnRhaW5zKHZhbCkpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShyb3dzLnJlbW92ZSh2YWwpKTsKKyAgICAgICAgfQorICAgICAgICAvLyBkaWQgSSBzZWUgYWxsIHRoZSByb3dzIGluIHRoZSB0YWJsZT8KKyAgICAgICAgYXNzZXJ0VHJ1ZShyb3dzLmlzRW1wdHkoKSk7CisKKyAgICAgICAgLy8gY2hhbmdlIGRhdGEgYW5kIG1ha2Ugc3VyZSB0aGUgY3Vyc29yIHBpY2tzIHVwIG5ldyBkYXRhICYgY291bnQKKyAgICAgICAgcm93cyA9IG5ldyBIYXNoU2V0PEludGVnZXI+KCk7CisgICAgICAgIG1EYXRhYmFzZS5iZWdpblRyYW5zYWN0aW9uKCk7CisgICAgICAgIGludCBNID0gTiArIDEwMDA7CisgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgTTsgaisrKSB7CisgICAgICAgICAgICByb3dzLmFkZChqKTsKKyAgICAgICAgICAgIGlmIChqIDwgTikgeworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdmFsdWVzLnB1dCgiY29sMSIsIGopOworICAgICAgICAgICAgbURhdGFiYXNlLmluc2VydCh0ZXN0VGFibGUsIG51bGwsIHZhbHVlcyk7CisgICAgICAgIH0KKyAgICAgICAgbURhdGFiYXNlLnNldFRyYW5zYWN0aW9uU3VjY2Vzc2Z1bCgpOworICAgICAgICBtRGF0YWJhc2UuZW5kVHJhbnNhY3Rpb24oKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKE0sIHJvd3Muc2l6ZSgpKTsKKyAgICAgICAgYy5yZXF1ZXJ5KCk7CisgICAgICAgIGkgPSAwOworICAgICAgICB3aGlsZSAoYy5tb3ZlVG9OZXh0KCkpIHsKKyAgICAgICAgICAgIGludCB2YWwgPSBjLmdldEludCgwKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUocm93cy5jb250YWlucyh2YWwpKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUocm93cy5yZW1vdmUodmFsKSk7CisgICAgICAgIH0KKyAgICAgICAgLy8gZGlkIEkgc2VlIGFsbCBkYXRhIGZyb20gdGhlIG1vZGlmaWVkIHRhYmxlCisgICAgICAgIGFzc2VydFRydWUocm93cy5pc0VtcHR5KCkpOworCisgICAgICAgIC8vIG1vdmUgY3Vyc29yIGJhY2sgdG8gMXN0IHJvdyBhbmQgc2Nyb2xsIHRvIGFib3V0IGhhbGZ3YXkgaW4gdGhlIHJlc3VsdCBzZXQKKyAgICAgICAgLy8gYW5kIHRoZW4gZGVsZXRlIDc1JSBvZiBkYXRhIC0gYW5kIHRoZW4gZG8gcmVxdWVyeQorICAgICAgICBjLm1vdmVUb0ZpcnN0KCk7CisgICAgICAgIGludCBLID0gTiAvIDI7CisgICAgICAgIGZvciAoaW50IHAgPSAwOyBwIDwgSyAmJiBjLm1vdmVUb05leHQoKTsgcCsrKSB7CisgICAgICAgICAgICAvLyBub3RoaW5nIHRvIGRvIC0ganVzdCBzY3JvbGxpbmcgdG8gYWJvdXQgaGFsZi1wb2ludCBpbiB0aGUgcmVzdWx0c2V0CisgICAgICAgIH0KKyAgICAgICAgbURhdGFiYXNlLmJlZ2luVHJhbnNhY3Rpb24oKTsKKyAgICAgICAgbURhdGFiYXNlLmRlbGV0ZSh0ZXN0VGFibGUsICJjb2wxIDwgPyIsIG5ldyBTdHJpbmdbXXsgKDMgKiBNIC8gNCkgKyAiIn0pOworICAgICAgICBtRGF0YWJhc2Uuc2V0VHJhbnNhY3Rpb25TdWNjZXNzZnVsKCk7CisgICAgICAgIG1EYXRhYmFzZS5lbmRUcmFuc2FjdGlvbigpOworICAgICAgICBjLnJlcXVlcnkoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKE0gLyA0LCBjLmdldENvdW50KCkpOworICAgICAgICB3aGlsZSAoYy5tb3ZlVG9OZXh0KCkpIHsKKyAgICAgICAgICAgIC8vIGp1c3QgbW92ZSB0aGUgY3Vyc29yIHRvIG5leHQgcm93IC0gdG8gbWFrZSBzdXJlIGl0IGNhbiBnbyB0aHJvdWdoIHRoZSBlbnRpcmUKKyAgICAgICAgICAgIC8vIHJlc3VsdHNldCB3aXRob3V0IGFueSBwcm9ibGVtcworICAgICAgICB9CisgICAgICAgIGMuY2xvc2UoKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9kYXRhYmFzZS9zcWxpdGUvU1FMaXRlRGF0YWJhc2VUZXN0LmphdmEgYi9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9kYXRhYmFzZS9zcWxpdGUvU1FMaXRlRGF0YWJhc2VUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODZlZGE3MQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9TUUxpdGVEYXRhYmFzZVRlc3QuamF2YQpAQCAtMCwwICsxLDk0OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGU7CisKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFZhbHVlczsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLkN1cnNvcjsKK2ltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLkRhdGFiYXNlRXJyb3JIYW5kbGVyOworaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2UuRGF0YWJhc2VVdGlsczsKK2ltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLkRlZmF1bHREYXRhYmFzZUVycm9ySGFuZGxlcjsKK2ltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZS5TUUxpdGVEYXRhYmFzZTsKK2ltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZS5TUUxpdGVEYXRhYmFzZS5DdXJzb3JGYWN0b3J5OworaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlLlNRTGl0ZVN0YXRlbWVudDsKK2ltcG9ydCBhbmRyb2lkLnRlc3QuQW5kcm9pZFRlc3RDYXNlOworaW1wb3J0IGFuZHJvaWQudGVzdC5zdWl0ZWJ1aWxkZXIuYW5ub3RhdGlvbi5MYXJnZVRlc3Q7CitpbXBvcnQgYW5kcm9pZC50ZXN0LnN1aXRlYnVpbGRlci5hbm5vdGF0aW9uLk1lZGl1bVRlc3Q7CitpbXBvcnQgYW5kcm9pZC50ZXN0LnN1aXRlYnVpbGRlci5hbm5vdGF0aW9uLlNtYWxsVGVzdDsKK2ltcG9ydCBhbmRyb2lkLnRlc3Quc3VpdGVidWlsZGVyLmFubm90YXRpb24uU3VwcHJlc3M7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworCitwdWJsaWMgY2xhc3MgU1FMaXRlRGF0YWJhc2VUZXN0IGV4dGVuZHMgQW5kcm9pZFRlc3RDYXNlIHsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIkRhdGFiYXNlR2VuZXJhbFRlc3QiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBURVNUX1RBQkxFID0gInRlc3QiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDVVJSRU5UX0RBVEFCQVNFX1ZFUlNJT04gPSA0MjsKKyAgICBwcml2YXRlIFNRTGl0ZURhdGFiYXNlIG1EYXRhYmFzZTsKKyAgICBwcml2YXRlIEZpbGUgbURhdGFiYXNlRmlsZTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgSU5TRVJUID0gMTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgVVBEQVRFID0gMjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgREVMRVRFID0gMzsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREJfTkFNRSA9ICJkYXRhYmFzZV90ZXN0LmRiIjsKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHN1cGVyLnNldFVwKCk7CisgICAgICAgIGRiU2V0VXAoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBkYlRlYXJkb3duKCk7CisgICAgICAgIHN1cGVyLnRlYXJEb3duKCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGRiVGVhcmRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgbURhdGFiYXNlLmNsb3NlKCk7CisgICAgICAgIG1EYXRhYmFzZUZpbGUuZGVsZXRlKCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGRiU2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgRmlsZSBkYkRpciA9IGdldENvbnRleHQoKS5nZXREaXIodGhpcy5nZXRDbGFzcygpLmdldE5hbWUoKSwgQ29udGV4dC5NT0RFX1BSSVZBVEUpOworICAgICAgICBtRGF0YWJhc2VGaWxlID0gbmV3IEZpbGUoZGJEaXIsIERCX05BTUUpOworICAgICAgICBpZiAobURhdGFiYXNlRmlsZS5leGlzdHMoKSkgeworICAgICAgICAgICAgbURhdGFiYXNlRmlsZS5kZWxldGUoKTsKKyAgICAgICAgfQorICAgICAgICBtRGF0YWJhc2UgPSBTUUxpdGVEYXRhYmFzZS5vcGVuT3JDcmVhdGVEYXRhYmFzZShtRGF0YWJhc2VGaWxlLmdldFBhdGgoKSwgbnVsbCwgbnVsbCk7CisgICAgICAgIGFzc2VydE5vdE51bGwobURhdGFiYXNlKTsKKyAgICAgICAgbURhdGFiYXNlLnNldFZlcnNpb24oQ1VSUkVOVF9EQVRBQkFTRV9WRVJTSU9OKTsKKyAgICB9CisKKyAgICBAU21hbGxUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEVuYWJsZVdyaXRlQWhlYWRMb2dnaW5nKCkgeworICAgICAgICBtRGF0YWJhc2UuZGlzYWJsZVdyaXRlQWhlYWRMb2dnaW5nKCk7CisgICAgICAgIGFzc2VydE51bGwobURhdGFiYXNlLm1Db25uZWN0aW9uUG9vbCk7CisgICAgICAgIG1EYXRhYmFzZS5lbmFibGVXcml0ZUFoZWFkTG9nZ2luZygpOworICAgICAgICBEYXRhYmFzZUNvbm5lY3Rpb25Qb29sIHBvb2wgPSBtRGF0YWJhc2UubUNvbm5lY3Rpb25Qb29sOworICAgICAgICBhc3NlcnROb3ROdWxsKHBvb2wpOworICAgICAgICAvLyBtYWtlIHRoZSBzYW1lIGNhbGwgYWdhaW4gYW5kIG1ha2Ugc3VyZSB0aGUgcG9vbCBhbHJlYWR5IHNldHVwIGlzIG5vdCByZS1jcmVhdGVkCisgICAgICAgIG1EYXRhYmFzZS5lbmFibGVXcml0ZUFoZWFkTG9nZ2luZygpOworICAgICAgICBhc3NlcnRFcXVhbHMocG9vbCwgbURhdGFiYXNlLm1Db25uZWN0aW9uUG9vbCk7CisgICAgfQorCisgICAgQFNtYWxsVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3REaXNhYmxlV3JpdGVBaGVhZExvZ2dpbmcoKSB7CisgICAgICAgIG1EYXRhYmFzZS5leGVjU1FMKCJjcmVhdGUgdGFibGUgdGVzdCAoaSBpbnQpOyIpOworICAgICAgICBtRGF0YWJhc2UuZW5hYmxlV3JpdGVBaGVhZExvZ2dpbmcoKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChtRGF0YWJhc2UubUNvbm5lY3Rpb25Qb29sKTsKKyAgICAgICAgLy8gZ2V0IGEgcG9vbGVkIGRhdGFiYXNlIGNvbm5lY3Rpb24KKyAgICAgICAgU1FMaXRlRGF0YWJhc2UgZGIgPSBtRGF0YWJhc2UuZ2V0RGJDb25uZWN0aW9uKCJzZWxlY3QgKiBmcm9tIHRlc3QiKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChkYik7CisgICAgICAgIGFzc2VydEZhbHNlKG1EYXRhYmFzZS5lcXVhbHMoZGIpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShkYi5pc09wZW4oKSk7CisgICAgICAgIC8vIGRpc2FibGUgV0FMIC0gd2hpY2ggc2hvdWxkIGNsb3NlIGNvbm5lY3Rpb24gcG9vbCBhbmQgYWxsIHBvb2xlZCBjb25uZWN0aW9ucworICAgICAgICBtRGF0YWJhc2UuZGlzYWJsZVdyaXRlQWhlYWRMb2dnaW5nKCk7CisgICAgICAgIGFzc2VydE51bGwobURhdGFiYXNlLm1Db25uZWN0aW9uUG9vbCk7CisgICAgICAgIGFzc2VydEZhbHNlKGRiLmlzT3BlbigpKTsKKyAgICB9CisKKyAgICBAU21hbGxUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEN1cnNvcnNXaXRoQ2xvc2VkRGJDb25uQWZ0ZXJEaXNhYmxlV3JpdGVBaGVhZExvZ2dpbmcoKSB7CisgICAgICAgIG1EYXRhYmFzZS5kaXNhYmxlV3JpdGVBaGVhZExvZ2dpbmcoKTsKKyAgICAgICAgbURhdGFiYXNlLmJlZ2luVHJhbnNhY3Rpb25Ob25FeGNsdXNpdmUoKTsKKyAgICAgICAgbURhdGFiYXNlLmV4ZWNTUUwoImNyZWF0ZSB0YWJsZSB0ZXN0IChpIGludCk7Iik7CisgICAgICAgIG1EYXRhYmFzZS5leGVjU1FMKCJpbnNlcnQgaW50byB0ZXN0IHZhbHVlcygxKTsiKTsKKyAgICAgICAgbURhdGFiYXNlLnNldFRyYW5zYWN0aW9uU3VjY2Vzc2Z1bCgpOworICAgICAgICBtRGF0YWJhc2UuZW5kVHJhbnNhY3Rpb24oKTsKKyAgICAgICAgbURhdGFiYXNlLmVuYWJsZVdyaXRlQWhlYWRMb2dnaW5nKCk7CisgICAgICAgIGFzc2VydE5vdE51bGwobURhdGFiYXNlLm1Db25uZWN0aW9uUG9vbCk7CisgICAgICAgIGFzc2VydEVxdWFscygwLCBtRGF0YWJhc2UubUNvbm5lY3Rpb25Qb29sLmdldFNpemUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygwLCBtRGF0YWJhc2UubUNvbm5lY3Rpb25Qb29sLmdldEZyZWVQb29sU2l6ZSgpKTsKKyAgICAgICAgLy8gZ2V0IGEgY3Vyc29yIHdoaWNoIHNob3VsZCB1c2UgcG9vbGVkIGRhdGFiYXNlIGNvbm5lY3Rpb24KKyAgICAgICAgQ3Vyc29yIGMgPSBtRGF0YWJhc2UucmF3UXVlcnkoInNlbGVjdCAqIGZyb20gdGVzdCIsIG51bGwpOworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgYy5nZXRDb3VudCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIG1EYXRhYmFzZS5tQ29ubmVjdGlvblBvb2wuZ2V0U2l6ZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIG1EYXRhYmFzZS5tQ29ubmVjdGlvblBvb2wuZ2V0RnJlZVBvb2xTaXplKCkpOworICAgICAgICBTUUxpdGVEYXRhYmFzZSBkYiA9IG1EYXRhYmFzZS5tQ29ubmVjdGlvblBvb2wuZ2V0Q29ubmVjdGlvbkxpc3QoKS5nZXQoMCk7CisgICAgICAgIGFzc2VydFRydWUobURhdGFiYXNlLm1Db25uZWN0aW9uUG9vbC5pc0RhdGFiYXNlT2JqRnJlZShkYikpOworICAgICAgICAvLyBkaXNhYmxlIFdBTCAtIHdoaWNoIHNob3VsZCBjbG9zZSBjb25uZWN0aW9uIHBvb2wgYW5kIGFsbCBwb29sZWQgY29ubmVjdGlvbnMKKyAgICAgICAgbURhdGFiYXNlLmRpc2FibGVXcml0ZUFoZWFkTG9nZ2luZygpOworICAgICAgICBhc3NlcnROdWxsKG1EYXRhYmFzZS5tQ29ubmVjdGlvblBvb2wpOworICAgICAgICBhc3NlcnRGYWxzZShkYi5pc09wZW4oKSk7CisgICAgICAgIC8vIGN1cnNvciBkYXRhIHNob3VsZCBzdGlsbCBiZSBhY2Nlc3NpYmxlIGJlY2F1c2UgaXQgaXMgZmV0Y2hpbmcgZGF0YSBmcm9tIEN1cnNvcldpbmRvdworICAgICAgICBjLm1vdmVUb05leHQoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIGMuZ2V0SW50KDApKTsKKyAgICAgICAgYy5yZXF1ZXJ5KCk7CisgICAgICAgIGFzc2VydEVxdWFscygxLCBjLmdldENvdW50KCkpOworICAgICAgICBjLm1vdmVUb05leHQoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIGMuZ2V0SW50KDApKTsKKyAgICAgICAgYy5jbG9zZSgpOworICAgIH0KKworICAgIEBTbWFsbFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2V0Q29ubmVjdGlvblBvb2xTaXplKCkgeworICAgICAgICBtRGF0YWJhc2UuZW5hYmxlV3JpdGVBaGVhZExvZ2dpbmcoKTsKKyAgICAgICAgLy8gY2FuJ3Qgc2V0IHBvb2wgc2l6ZSB0byB6ZXJvCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBtRGF0YWJhc2Uuc2V0Q29ubmVjdGlvblBvb2xTaXplKDApOworICAgICAgICAgICAgZmFpbCgiSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGV4cGVjdGVkIik7CisgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBhc3NlcnRUcnVlKGUuZ2V0TWVzc2FnZSgpLmNvbnRhaW5zKCJsZXNzIHRoYW4gdGhlIGN1cnJlbnQgbWF4IHZhbHVlIikpOworICAgICAgICB9CisgICAgICAgIC8vIHNldCBwb29sIHNpemUgdG8gYSB2YWxpZCB2YWx1ZQorICAgICAgICBtRGF0YWJhc2Uuc2V0Q29ubmVjdGlvblBvb2xTaXplKDEwKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEwLCBtRGF0YWJhc2UubUNvbm5lY3Rpb25Qb29sLmdldE1heFBvb2xTaXplKCkpOworICAgICAgICAvLyBjYW4ndCBzZXQgcG9vbCBzaXplIHRvIDwgdGhlIHZhbHVlIGFib3ZlCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBtRGF0YWJhc2Uuc2V0Q29ubmVjdGlvblBvb2xTaXplKDEpOworICAgICAgICAgICAgZmFpbCgiSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGV4cGVjdGVkIik7CisgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBhc3NlcnRUcnVlKGUuZ2V0TWVzc2FnZSgpLmNvbnRhaW5zKCJsZXNzIHRoYW4gdGhlIGN1cnJlbnQgbWF4IHZhbHVlIikpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogYSB0cmFuc2FjdGlvbiBzaG91bGQgYmUgc3RhcnRlZCBiZWZvcmUgYSBzdGFuZGFsb25lLXVwZGF0ZS9pbnNlcnQvZGVsZXRlIHN0YXRlbWVudAorICAgICAqLworICAgIEBTbWFsbFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U3RhcnRYYWN0QmVmb3JlVXBkYXRlU3FsKCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICAgICAgcnVuVGVzdEZvclN0YXJ0WGFjdEJlZm9yZVVwZGF0ZVNxbChJTlNFUlQpOworICAgICAgICBydW5UZXN0Rm9yU3RhcnRYYWN0QmVmb3JlVXBkYXRlU3FsKFVQREFURSk7CisgICAgICAgIHJ1blRlc3RGb3JTdGFydFhhY3RCZWZvcmVVcGRhdGVTcWwoREVMRVRFKTsKKyAgICB9CisgICAgcHJpdmF0ZSB2b2lkIHJ1blRlc3RGb3JTdGFydFhhY3RCZWZvcmVVcGRhdGVTcWwoaW50IHN0bXRUeXBlKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24geworICAgICAgICBjcmVhdGVUYWJsZUFuZENsZWFyQ2FjaGUoKTsKKworICAgICAgICBDb250ZW50VmFsdWVzIHZhbHVlcyA9IG5ldyBDb250ZW50VmFsdWVzKCk7CisgICAgICAgIC8vIG1ha2Ugc29tZSBjaGFuZ2VzIHRvIGRhdGEgaW4gVEVTVF9UQUJMRQorICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDU7IGkrKykgeworICAgICAgICAgICAgdmFsdWVzLnB1dCgiaSIsIGkpOworICAgICAgICAgICAgdmFsdWVzLnB1dCgiaiIsICJpIiArIFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpKTsKKyAgICAgICAgICAgIG1EYXRhYmFzZS5pbnNlcnQoVEVTVF9UQUJMRSwgbnVsbCwgdmFsdWVzKTsKKyAgICAgICAgICAgIHN3aXRjaCAoc3RtdFR5cGUpIHsKKyAgICAgICAgICAgICAgICBjYXNlIFVQREFURToKKyAgICAgICAgICAgICAgICAgICAgdmFsdWVzLnB1dCgiaiIsICJ1IiArIFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpKTsKKyAgICAgICAgICAgICAgICAgICAgbURhdGFiYXNlLnVwZGF0ZShURVNUX1RBQkxFLCB2YWx1ZXMsICJpID0gIiArIGksIG51bGwpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIERFTEVURToKKyAgICAgICAgICAgICAgICAgICAgbURhdGFiYXNlLmRlbGV0ZShURVNUX1RBQkxFLCAiaSA9IDEiLCBudWxsKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLy8gZG8gYSBxdWVyeS4gZXZlbiB0aG91Z2ggcXVlcnkgdXNlcyBhIGRpZmZlcmVudCBkYXRhYmFzZSBjb25uZWN0aW9uLAorICAgICAgICAvLyBpdCBzaG91bGQgc3RpbGwgc2VlIHRoZSBhYm92ZSBjaGFuZ2VzIHRvIGRhdGEgYmVjYXVzZSB0aGUgYWJvdmUgc3RhbmRhbG9uZQorICAgICAgICAvLyBpbnNlcnQvdXBkYXRlL2RlbGV0ZXMgYXJlIGRvbmUgaW4gdHJhbnNhY3Rpb25zIGF1dG9tYXRpY2FsbHkuCisgICAgICAgIFN0cmluZyBzcWwgPSAic2VsZWN0IGNvdW50KCopIGZyb20gIiArIFRFU1RfVEFCTEU7CisgICAgICAgIFNRTGl0ZVN0YXRlbWVudCBzdG10ID0gbURhdGFiYXNlLmNvbXBpbGVTdGF0ZW1lbnQoc3FsKTsKKyAgICAgICAgZmluYWwgaW50IGV4cGVjdGVkVmFsdWUgPSAoc3RtdFR5cGUgPT0gREVMRVRFKSA/IDQgOiA1OworICAgICAgICBhc3NlcnRFcXVhbHMoZXhwZWN0ZWRWYWx1ZSwgc3RtdC5zaW1wbGVRdWVyeUZvckxvbmcoKSk7CisgICAgICAgIHN0bXQuY2xvc2UoKTsKKyAgICAgICAgQ3Vyc29yIGMgPSBtRGF0YWJhc2UucmF3UXVlcnkoc3FsLCBudWxsKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIGMuZ2V0Q291bnQoKSk7CisgICAgICAgIGMubW92ZVRvRmlyc3QoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGV4cGVjdGVkVmFsdWUsIGMuZ2V0TG9uZygwKSk7CisgICAgICAgIGMuY2xvc2UoKTsKKworICAgICAgICAvLyBkbyA1IG1vcmUgY2hhbmdlcyBpbiBhIHRyYW5zYWN0aW9uIGJ1dCBkbyBhIHF1ZXJ5IGJlZm9yZSBhbmQgYWZ0ZXIgdGhlIGNvbW1pdAorICAgICAgICBtRGF0YWJhc2UuYmVnaW5UcmFuc2FjdGlvbigpOworICAgICAgICBmb3IgKGludCBpID0gMTA7IGkgPCAxNTsgaSsrKSB7CisgICAgICAgICAgICB2YWx1ZXMucHV0KCJpIiwgaSk7CisgICAgICAgICAgICB2YWx1ZXMucHV0KCJqIiwgImkiICsgU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkpOworICAgICAgICAgICAgbURhdGFiYXNlLmluc2VydChURVNUX1RBQkxFLCBudWxsLCB2YWx1ZXMpOworICAgICAgICAgICAgc3dpdGNoIChzdG10VHlwZSkgeworICAgICAgICAgICAgICAgIGNhc2UgVVBEQVRFOgorICAgICAgICAgICAgICAgICAgICB2YWx1ZXMucHV0KCJqIiwgInUiICsgU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkpOworICAgICAgICAgICAgICAgICAgICBtRGF0YWJhc2UudXBkYXRlKFRFU1RfVEFCTEUsIHZhbHVlcywgImkgPSAiICsgaSwgbnVsbCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgREVMRVRFOgorICAgICAgICAgICAgICAgICAgICBtRGF0YWJhc2UuZGVsZXRlKFRFU1RfVEFCTEUsICJpID0gMSIsIG51bGwpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBtRGF0YWJhc2Uuc2V0VHJhbnNhY3Rpb25TdWNjZXNzZnVsKCk7CisgICAgICAgIC8vIGRvIGEgcXVlcnkgYmVmb3JlIGNvbW1pdCAtIHNob3VsZCBzdGlsbCBoYXZlIDUgcm93cworICAgICAgICAvLyB0aGlzIHF1ZXJ5IHNob3VsZCBydW4gaW4gYSBkaWZmZXJlbnQgdGhyZWFkIHRvIGZvcmNlIGl0IHRvIHVzZSBhIGRpZmZlcmVudCBkYXRhYmFzZQorICAgICAgICAvLyBjb25uZWN0aW9uCisgICAgICAgIFRocmVhZCB0ID0gbmV3IFRocmVhZCgpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZSBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgU3RyaW5nIHNxbCA9ICJzZWxlY3QgY291bnQoKikgZnJvbSAiICsgVEVTVF9UQUJMRTsKKyAgICAgICAgICAgICAgICBTUUxpdGVTdGF0ZW1lbnQgc3RtdCA9IGdldERiKCkuY29tcGlsZVN0YXRlbWVudChzcWwpOworICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscyhleHBlY3RlZFZhbHVlLCBzdG10LnNpbXBsZVF1ZXJ5Rm9yTG9uZygpKTsKKyAgICAgICAgICAgICAgICBzdG10LmNsb3NlKCk7CisgICAgICAgICAgICAgICAgQ3Vyc29yIGMgPSBnZXREYigpLnJhd1F1ZXJ5KHNxbCwgbnVsbCk7CisgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIGMuZ2V0Q291bnQoKSk7CisgICAgICAgICAgICAgICAgYy5tb3ZlVG9GaXJzdCgpOworICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscyhleHBlY3RlZFZhbHVlLCBjLmdldExvbmcoMCkpOworICAgICAgICAgICAgICAgIGMuY2xvc2UoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKyAgICAgICAgdC5zdGFydCgpOworICAgICAgICAvLyB3YWl0IHVudGlsIHRoZSBhYm92ZSB0aHJlYWQgaXMgZG9uZQorICAgICAgICB0LmpvaW4oKTsKKyAgICAgICAgLy8gY29tbWl0IGFuZCB0aGVuIHF1ZXJ5LiBzaG91bGQgc2VlIGNoYW5nZXMgZnJvbSB0aGUgdHJhbnNhY3Rpb24KKyAgICAgICAgbURhdGFiYXNlLmVuZFRyYW5zYWN0aW9uKCk7CisgICAgICAgIHN0bXQgPSBtRGF0YWJhc2UuY29tcGlsZVN0YXRlbWVudChzcWwpOworICAgICAgICBmaW5hbCBpbnQgZXhwZWN0ZWRWYWx1ZTIgPSAoc3RtdFR5cGUgPT0gREVMRVRFKSA/IDkgOiAxMDsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGV4cGVjdGVkVmFsdWUyLCBzdG10LnNpbXBsZVF1ZXJ5Rm9yTG9uZygpKTsKKyAgICAgICAgc3RtdC5jbG9zZSgpOworICAgICAgICBjID0gbURhdGFiYXNlLnJhd1F1ZXJ5KHNxbCwgbnVsbCk7CisgICAgICAgIGFzc2VydEVxdWFscygxLCBjLmdldENvdW50KCkpOworICAgICAgICBjLm1vdmVUb0ZpcnN0KCk7CisgICAgICAgIGFzc2VydEVxdWFscyhleHBlY3RlZFZhbHVlMiwgYy5nZXRMb25nKDApKTsKKyAgICAgICAgYy5jbG9zZSgpOworICAgIH0KKyAgICBwcml2YXRlIHN5bmNocm9uaXplZCBTUUxpdGVEYXRhYmFzZSBnZXREYigpIHsKKyAgICAgICAgcmV0dXJuIG1EYXRhYmFzZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0IHRvIGVuc3VyZSB0aGF0IHJlYWRlcnMgYXJlIGFibGUgdG8gcmVhZCB0aGUgZGF0YWJhc2UgZGF0YSAob2xkIHZlcnNpb25zKQorICAgICAqIEVWRU4gV0hFTiB0aGUgd3JpdGVyIGlzIGluIGEgdHJhbnNhY3Rpb24gb24gdGhlIHNhbWUgZGF0YWJhc2UuCisgICAgICo8cD4KKyAgICAgKiBUaGlzIHRlc3Qgc3RhcnRzIDEgV3JpdGVyIGFuZCAyIFJlYWRlcnMgYW5kIHNldHMgdXAgY29ubmVjdGlvbiBwb29sIGZvciByZWFkZXJzCisgICAgICogYnkgY2FsbGluZyB0aGUgbWV0aG9kIHtAbGluayBTUUxpdGVEYXRhYmFzZSNlbmFibGVXcml0ZUFoZWFkTG9nZ2luZygpfS4KKyAgICAgKiA8cD4KKyAgICAgKiBXcml0ZXIgZG9lcyB0aGUgZm9sbG93aW5nIGluIGEgdGlnaHQgbG9vcAorICAgICAqIDxwcmU+CisgICAgICogICAgIGJlZ2luIHRyYW5zYWN0aW9uCisgICAgICogICAgIGluc2VydCBpbnRvIHRhYmxlXzEKKyAgICAgKiAgICAgaW5zZXJ0IGludG8gdGFibGVfMgorICAgICAqICAgICBjb21taXQKKyAgICAgKiA8L3ByZT4KKyAgICAgKiA8cD4KKyAgICAgKiBBcyBsb25nIGEgdGhlIHdyaXRlciBpcyBhbGl2ZSwgUmVhZGVycyBkbyB0aGUgZm9sbG93aW5nIGluIGEgdGlnaHQgbG9vcCBhdCB0aGUgc2FtZSB0aW1lCisgICAgICogPHByZT4KKyAgICAgKiAgICAgUmVhZGVyX0sgZG9lcyAic2VsZWN0IGNvdW50KCopIGZyb20gdGFibGVfSyIgIHdoZXJlIEsgPSAxIG9yIDIKKyAgICAgKiA8L3ByZT4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGUgdGVzdCBpcyBydW4gZm9yIFRJTUVfVE9fUlVOX1dBTF9URVNUX0ZPUiBzZWMuCisgICAgICogPHA+CisgICAgICogVGhlIHRlc3QgaXMgcmVwZWF0ZWQgZm9yIGRpZmZlcmVudCBjb25uZWN0aW9uLXBvb2wtc2l6ZXMgKDEuLjMpCisgICAgICogPHA+CisgICAgICogQW5kIGF0IHRoZSBlbmQgb2Ygb2YgZWFjaCB0ZXN0LCB0aGUgZm9sbG93aW5nIHN0YXRpc3RpY3MgYXJlIHByaW50ZWQKKyAgICAgKiA8dWw+CisgICAgICogICAgPGxpPmNvbm5lY3Rpb24tcG9vbC1zaXplPC9saT4KKyAgICAgKiAgICA8bGk+bnVtYmVyLW9mLXRyYW5zYWN0aW9ucyBieSB3cml0ZXI8L2xpPgorICAgICAqICAgIDxsaT5udW1iZXIgb2YgcmVhZHMgYnkgcmVhZGVyX0sgd2hpbGUgdGhlIHdyaXRlciBpcyBJTiBvciBOT1QtSU4geGFjdGlvbjwvbGk+CisgICAgICogPC91bD4KKyAgICAgKi8KKyAgICBATGFyZ2VUZXN0CisgICAgQFN1cHByZXNzIC8vIHJ1biB0aGlzIHRlc3Qgb25seSBpZiB5b3UgbmVlZCB0byBjb2xsZWN0IHRoZSBudW1iZXJzIGZyb20gdGhpcyB0ZXN0CisgICAgcHVibGljIHZvaWQgdGVzdENvbmN1cnJlbmN5RWZmZWN0c09mQ29ublBvb2woKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gcnVuIHRoZSB0ZXN0IHdpdGggc3FsaXRlIFdBTCBlbmFibGUKKyAgICAgICAgcnVuQ29ubmVjdGlvblBvb2xUZXN0KHRydWUpOworCisgICAgICAgIC8vIHJ1biB0aGUgc2FtZSB0ZXN0IFdJVEhPVVQgc3FsaXRlIFdBTCBlbmFibGVkCisgICAgICAgIHJ1bkNvbm5lY3Rpb25Qb29sVGVzdChmYWxzZSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHJ1bkNvbm5lY3Rpb25Qb29sVGVzdChib29sZWFuIHVzZVdhbCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGludCBNID0gMzsKKyAgICAgICAgU3RyaW5nQnVpbGRlcltdIGJ1ZmYgPSBuZXcgU3RyaW5nQnVpbGRlcltNXTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBNOyBpKyspIHsKKyAgICAgICAgICAgIGlmICh1c2VXYWwpIHsKKyAgICAgICAgICAgICAgICAvLyBzZXQgdXAgY29ubmVjdGlvbiBwb29sCisgICAgICAgICAgICAgICAgbURhdGFiYXNlLmVuYWJsZVdyaXRlQWhlYWRMb2dnaW5nKCk7CisgICAgICAgICAgICAgICAgbURhdGFiYXNlLnNldENvbm5lY3Rpb25Qb29sU2l6ZShpICsgMSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG1EYXRhYmFzZS5kaXNhYmxlV3JpdGVBaGVhZExvZ2dpbmcoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1EYXRhYmFzZS5leGVjU1FMKCJDUkVBVEUgVEFCTEUgdDEgKGkgaW50LCBqIGludCk7Iik7CisgICAgICAgICAgICBtRGF0YWJhc2UuZXhlY1NRTCgiQ1JFQVRFIFRBQkxFIHQyIChpIGludCwgaiBpbnQpOyIpOworICAgICAgICAgICAgbURhdGFiYXNlLmJlZ2luVHJhbnNhY3Rpb24oKTsKKyAgICAgICAgICAgIGZvciAoaW50IGsgPSAwOyBrIDwgNTsgaysrKSB7CisgICAgICAgICAgICAgICAgbURhdGFiYXNlLmV4ZWNTUUwoImluc2VydCBpbnRvIHQxIHZhbHVlcyg/LD8pOyIsIG5ldyBTdHJpbmdbXSB7aysiIiwgaysiIn0pOworICAgICAgICAgICAgICAgIG1EYXRhYmFzZS5leGVjU1FMKCJpbnNlcnQgaW50byB0MiB2YWx1ZXMoPyw/KTsiLCBuZXcgU3RyaW5nW10ge2srIiIsIGsrIiJ9KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1EYXRhYmFzZS5zZXRUcmFuc2FjdGlvblN1Y2Nlc3NmdWwoKTsKKyAgICAgICAgICAgIG1EYXRhYmFzZS5lbmRUcmFuc2FjdGlvbigpOworCisgICAgICAgICAgICAvLyBzdGFydCBhIHdyaXRlcgorICAgICAgICAgICAgV3JpdGVyIHcgPSBuZXcgV3JpdGVyKG1EYXRhYmFzZSk7CisKKyAgICAgICAgICAgIC8vIGluaXRpYWxpemUgYW4gYXJyYXkgb2YgY291bnRlcnMgdG8gYmUgcGFzc2VkIHRvIHRoZSByZWFkZXJzCisgICAgICAgICAgICBSZWFkZXIgcjEgPSBuZXcgUmVhZGVyKG1EYXRhYmFzZSwgInQxIiwgdywgMCk7CisgICAgICAgICAgICBSZWFkZXIgcjIgPSBuZXcgUmVhZGVyKG1EYXRhYmFzZSwgInQyIiwgdywgMSk7CisgICAgICAgICAgICB3LnN0YXJ0KCk7CisgICAgICAgICAgICByMS5zdGFydCgpOworICAgICAgICAgICAgcjIuc3RhcnQoKTsKKworICAgICAgICAgICAgLy8gd2FpdCBmb3IgYWxsIHRocmVhZHMgdG8gZGllCisgICAgICAgICAgICB3LmpvaW4oKTsKKyAgICAgICAgICAgIHIxLmpvaW4oKTsKKyAgICAgICAgICAgIHIyLmpvaW4oKTsKKworICAgICAgICAgICAgLy8gcHJpbnQgdGhlIHN0YXRzCisgICAgICAgICAgICBpbnRbXVtdIGNvdW50cyA9IGdldENvdW50cygpOworICAgICAgICAgICAgYnVmZltpXSA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisgICAgICAgICAgICBidWZmW2ldLmFwcGVuZCgiY29ubnBvb2wtc2l6ZSA9ICIpOworICAgICAgICAgICAgYnVmZltpXS5hcHBlbmQoaSArIDEpOworICAgICAgICAgICAgYnVmZltpXS5hcHBlbmQoIiwgbnVtIHhhY3RzIGJ5IHdyaXRlciA9ICIpOworICAgICAgICAgICAgYnVmZltpXS5hcHBlbmQoZ2V0TnVtWGFjdHMoKSk7CisgICAgICAgICAgICBidWZmW2ldLmFwcGVuZCgiLCBudW0tcmVhZHMtaW4teGFjdC9OT1QtaW4teGFjdCBieSByZWFkZXIxID0gIik7CisgICAgICAgICAgICBidWZmW2ldLmFwcGVuZChjb3VudHNbMF1bMV0gKyAiLyIgKyBjb3VudHNbMF1bMF0pOworICAgICAgICAgICAgYnVmZltpXS5hcHBlbmQoIiwgYnkgcmVhZGVyMiA9ICIpOworICAgICAgICAgICAgYnVmZltpXS5hcHBlbmQoY291bnRzWzFdWzFdICsgIi8iICsgY291bnRzWzFdWzBdKTsKKworICAgICAgICAgICAgTG9nLmkoVEFHLCAiZG9uZSB0ZXN0aW5nIGZvciBjb25uLXBvb2wtc2l6ZSBvZiAiICsgKGkrMSkpOworCisgICAgICAgICAgICBkYlRlYXJkb3duKCk7CisgICAgICAgICAgICBkYlNldFVwKCk7CisgICAgICAgIH0KKyAgICAgICAgTG9nLmkoVEFHLCAiZHVyYXRpb24gb2YgdGVzdCAiICsgVElNRV9UT19SVU5fV0FMX1RFU1RfRk9SICsgIiBzZWMiKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBNOyBpKyspIHsKKyAgICAgICAgICAgIExvZy5pKFRBRywgYnVmZltpXS50b1N0cmluZygpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgYm9vbGVhbiBpblhhY3QgPSBmYWxzZTsKKyAgICBwcml2YXRlIGludCBudW1YYWN0czsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgVElNRV9UT19SVU5fV0FMX1RFU1RfRk9SID0gMTU7IC8vIG51bSBzZWMgdGhpcyB0ZXN0IHNob3VsZCBydW4KKyAgICBwcml2YXRlIGludFtdW10gY291bnRzID0gbmV3IGludFsyXVsyXTsKKworICAgIHByaXZhdGUgc3luY2hyb25pemVkIGJvb2xlYW4gaW5YYWN0KCkgeworICAgICAgICByZXR1cm4gaW5YYWN0OworICAgIH0KKworICAgIHByaXZhdGUgc3luY2hyb25pemVkIHZvaWQgc2V0SW5YYWN0RmxhZyhib29sZWFuIGZsYWcpIHsKKyAgICAgICAgaW5YYWN0ID0gZmxhZzsKKyAgICB9CisKKyAgICBwcml2YXRlIHN5bmNocm9uaXplZCB2b2lkIHNldENvdW50cyhpbnQgcmVhZGVyTnVtLCBpbnRbXSBudW1SZWFkcykgeworICAgICAgICBjb3VudHNbcmVhZGVyTnVtXVswXSA9IG51bVJlYWRzWzBdOworICAgICAgICBjb3VudHNbcmVhZGVyTnVtXVsxXSA9IG51bVJlYWRzWzFdOworICAgIH0KKworICAgIHByaXZhdGUgc3luY2hyb25pemVkIGludFtdW10gZ2V0Q291bnRzKCkgeworICAgICAgICByZXR1cm4gY291bnRzOworICAgIH0KKworICAgIHByaXZhdGUgc3luY2hyb25pemVkIHZvaWQgc2V0TnVtWGFjdHMoaW50IG51bSkgeworICAgICAgICBudW1YYWN0cyA9IG51bTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN5bmNocm9uaXplZCBpbnQgZ2V0TnVtWGFjdHMoKSB7CisgICAgICAgIHJldHVybiBudW1YYWN0czsKKyAgICB9CisKKyAgICBwcml2YXRlIGNsYXNzIFdyaXRlciBleHRlbmRzIFRocmVhZCB7CisgICAgICAgIHByaXZhdGUgU1FMaXRlRGF0YWJhc2UgZGIgPSBudWxsOworICAgICAgICBwdWJsaWMgV3JpdGVyKFNRTGl0ZURhdGFiYXNlIGRiKSB7CisgICAgICAgICAgICB0aGlzLmRiID0gZGI7CisgICAgICAgIH0KKyAgICAgICAgQE92ZXJyaWRlIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgIC8vIGluIGEgbG9vcCwgZm9yIE4gc2VjLCBkbyB0aGUgZm9sbG93aW5nCisgICAgICAgICAgICAvLyAgICBCRUdJTiB0cmFuc2FjdGlvbgorICAgICAgICAgICAgLy8gICAgaW5zZXJ0IGludG8gdGFibGUgdDEsIHQyCisgICAgICAgICAgICAvLyAgICBDb21taXQKKyAgICAgICAgICAgIGxvbmcgbm93ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisgICAgICAgICAgICBpbnQgazsKKyAgICAgICAgICAgIGZvciAoayA9IDA7KFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC0gbm93KSAvIDEwMDAgPCBUSU1FX1RPX1JVTl9XQUxfVEVTVF9GT1I7IGsrKykgeworICAgICAgICAgICAgICAgIGRiLmJlZ2luVHJhbnNhY3Rpb25Ob25FeGNsdXNpdmUoKTsKKyAgICAgICAgICAgICAgICBzZXRJblhhY3RGbGFnKHRydWUpOworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMTA7IGkrKykgeworICAgICAgICAgICAgICAgICAgICBkYi5leGVjU1FMKCJpbnNlcnQgaW50byB0MSB2YWx1ZXMoPyw/KTsiLCBuZXcgU3RyaW5nW10ge2krIiIsIGkrIiJ9KTsKKyAgICAgICAgICAgICAgICAgICAgZGIuZXhlY1NRTCgiaW5zZXJ0IGludG8gdDIgdmFsdWVzKD8sPyk7IiwgbmV3IFN0cmluZ1tdIHtpKyIiLCBpKyIifSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGRiLnNldFRyYW5zYWN0aW9uU3VjY2Vzc2Z1bCgpOworICAgICAgICAgICAgICAgIHNldEluWGFjdEZsYWcoZmFsc2UpOworICAgICAgICAgICAgICAgIGRiLmVuZFRyYW5zYWN0aW9uKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzZXROdW1YYWN0cyhrKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgY2xhc3MgUmVhZGVyIGV4dGVuZHMgVGhyZWFkIHsKKyAgICAgICAgcHJpdmF0ZSBTUUxpdGVEYXRhYmFzZSBkYiA9IG51bGw7CisgICAgICAgIHByaXZhdGUgU3RyaW5nIHRhYmxlID0gbnVsbDsKKyAgICAgICAgcHJpdmF0ZSBXcml0ZXIgdyA9IG51bGw7CisgICAgICAgIHByaXZhdGUgaW50IHJlYWRlck51bTsKKyAgICAgICAgcHJpdmF0ZSBpbnRbXSBudW1SZWFkcyA9IG5ldyBpbnRbMl07CisgICAgICAgIHB1YmxpYyBSZWFkZXIoU1FMaXRlRGF0YWJhc2UgZGIsIFN0cmluZyB0YWJsZSwgV3JpdGVyIHcsIGludCByZWFkZXJOdW0pIHsKKyAgICAgICAgICAgIHRoaXMuZGIgPSBkYjsKKyAgICAgICAgICAgIHRoaXMudGFibGUgPSB0YWJsZTsKKyAgICAgICAgICAgIHRoaXMudyA9IHc7CisgICAgICAgICAgICB0aGlzLnJlYWRlck51bSA9IHJlYWRlck51bTsKKyAgICAgICAgfQorICAgICAgICBAT3ZlcnJpZGUgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgLy8gd2hpbGUgdGhlIHdyaXRlIGlzIGFsaXZlLCBpbiBhIGxvb3AgZG8gdGhlIHF1ZXJ5IG9uIGEgdGFibGUKKyAgICAgICAgICAgIHdoaWxlICh3LmlzQWxpdmUoKSkgeworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMTA7IGkrKykgeworICAgICAgICAgICAgICAgICAgICBEYXRhYmFzZVV0aWxzLmxvbmdGb3JRdWVyeShkYiwgInNlbGVjdCBjb3VudCgqKSBmcm9tICIgKyB0aGlzLnRhYmxlLCBudWxsKTsKKyAgICAgICAgICAgICAgICAgICAgLy8gdXBkYXRlIGNvdW50IG9mIHJlYWRzCisgICAgICAgICAgICAgICAgICAgIG51bVJlYWRzW2luWGFjdCgpID8gMSA6IDBdICs9IDE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgc2V0Q291bnRzKHJlYWRlck51bSwgbnVtUmVhZHMpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBDbGFzc1RvVGVzdFNxbENvbXBpbGF0aW9uQW5kQ2FjaGluZyBleHRlbmRzIFNRTGl0ZVByb2dyYW0geworICAgICAgICBwcml2YXRlIENsYXNzVG9UZXN0U3FsQ29tcGlsYXRpb25BbmRDYWNoaW5nKFNRTGl0ZURhdGFiYXNlIGRiLCBTdHJpbmcgc3FsKSB7CisgICAgICAgICAgICBzdXBlcihkYiwgc3FsKTsKKyAgICAgICAgfQorICAgICAgICBwdWJsaWMgc3RhdGljIENsYXNzVG9UZXN0U3FsQ29tcGlsYXRpb25BbmRDYWNoaW5nIGNyZWF0ZShTUUxpdGVEYXRhYmFzZSBkYiwgU3RyaW5nIHNxbCkgeworICAgICAgICAgICAgZGIubG9jaygpOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IENsYXNzVG9UZXN0U3FsQ29tcGlsYXRpb25BbmRDYWNoaW5nKGRiLCBzcWwpOworICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICBkYi51bmxvY2soKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIEBTbWFsbFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0THJ1Q2FjaGluZ09mU3FsaXRlQ29tcGlsZWRTcWxPYmpzKCkgeworICAgICAgICBjcmVhdGVUYWJsZUFuZENsZWFyQ2FjaGUoKTsKKyAgICAgICAgLy8gc2V0IGNhY2hlIHNpemUKKyAgICAgICAgaW50IE4gPSBTUUxpdGVEYXRhYmFzZS5NQVhfU1FMX0NBQ0hFX1NJWkU7CisgICAgICAgIG1EYXRhYmFzZS5zZXRNYXhTcWxDYWNoZVNpemUoTik7CisKKyAgICAgICAgLy8gZG8gTisxIHF1ZXJpZXMgLSBhbmQgd2hlbiB0aGUgMHRoIGVudHJ5IGlzIHJlbW92ZWQgZnJvbSBMUlUgY2FjaGUgZHVlIHRvIHRoZQorICAgICAgICAvLyBpbnNlcnRpb24gb2YgKE4rMSl0aCBlbnRyeSwgbWFrZSBzdXJlIDB0aCBlbnRyeSBpcyBjbG9zZWQKKyAgICAgICAgQXJyYXlMaXN0PEludGVnZXI+IHN0bXRPYmpzID0gbmV3IEFycmF5TGlzdDxJbnRlZ2VyPigpOworICAgICAgICBBcnJheUxpc3Q8U3RyaW5nPiBzcWxTdHJpbmdzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7CisgICAgICAgIGludCBzdG10MCA9IDA7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTisxOyBpKyspIHsKKyAgICAgICAgICAgIFN0cmluZyBzID0gImluc2VydCBpbnRvIHRlc3QgdmFsdWVzKCIgKyBpICsgIiw/KTsiOworICAgICAgICAgICAgc3FsU3RyaW5ncy5hZGQocyk7CisgICAgICAgICAgICBDbGFzc1RvVGVzdFNxbENvbXBpbGF0aW9uQW5kQ2FjaGluZyBjID0KKyAgICAgICAgICAgICAgICAgICAgQ2xhc3NUb1Rlc3RTcWxDb21waWxhdGlvbkFuZENhY2hpbmcuY3JlYXRlKG1EYXRhYmFzZSwgcyk7CisgICAgICAgICAgICBpbnQgbiA9IGMuZ2V0U3FsU3RhdGVtZW50SWQoKTsKKyAgICAgICAgICAgIHN0bXRPYmpzLmFkZChpLCBuKTsKKyAgICAgICAgICAgIGlmIChpID09IDApIHsKKyAgICAgICAgICAgICAgICAvLyBzYXZlIHRoZSBzdGF0ZW1lbnRJZCBvZiB0aGlzIG9iai4gd2Ugd2FudCB0byBtYWtlIHN1cmUgaXQgaXMgdGhyb3duIG91dCBvZgorICAgICAgICAgICAgICAgIC8vIHRoZSBjYWNoZSBhdCB0aGUgZW5kIG9mIHRoaXMgdGVzdC4KKyAgICAgICAgICAgICAgICBzdG10MCA9IG47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjLmNsb3NlKCk7CisgICAgICAgIH0KKyAgICAgICAgLy8gaXMgMCd0aCBlbnRyeSBvdXQgb2YgdGhlIGNhY2hlPyBpdCBzaG91bGQgYmUgaW4gdGhlIGxpc3Qgb2Ygc3RhdGVtZW50SWRzCisgICAgICAgIC8vIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHByZS1jb21waWxlZCBzcWwgc3RhdGVtZW50cyB0byBiZSBmaW5hbGl6ZWQuCisgICAgICAgIGFzc2VydFRydWUobURhdGFiYXNlLmdldFF1ZXVlZFVwU3RtdExpc3QoKS5jb250YWlucyhzdG10MCkpOworICAgICAgICBmb3IgKGludCBpID0gMTsgaSA8IE4rMTsgaSsrKSB7CisgICAgICAgICAgICBTUUxpdGVDb21waWxlZFNxbCBjb21wU3FsID0gbURhdGFiYXNlLmdldENvbXBpbGVkU3RhdGVtZW50Rm9yU3FsKHNxbFN0cmluZ3MuZ2V0KGkpKTsKKyAgICAgICAgICAgIGFzc2VydE5vdE51bGwoY29tcFNxbCk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKHN0bXRPYmpzLmNvbnRhaW5zKGNvbXBTcWwublN0YXRlbWVudCkpOworICAgICAgICB9CisgICAgfQorCisgICAgQE1lZGl1bVRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RGJDbG9zZVJlbGVhc2luZ0FsbENhY2hlZFNxbCgpIHsKKyAgICAgICAgbURhdGFiYXNlLmV4ZWNTUUwoIkNSRUFURSBUQUJMRSB0ZXN0IChfaWQgSU5URUdFUiBQUklNQVJZIEtFWSwgdGV4dDEgVEVYVCwgdGV4dDIgVEVYVCwgIiArCisgICAgICAgICAgICAgICAgIm51bTEgSU5URUdFUiwgbnVtMiBJTlRFR0VSLCBpbWFnZSBCTE9CKTsiKTsKKyAgICAgICAgZmluYWwgU3RyaW5nIHN0YXRlbWVudCA9ICJERUxFVEUgRlJPTSB0ZXN0IFdIRVJFIF9pZD0/OyI7CisgICAgICAgIFNRTGl0ZVN0YXRlbWVudCBzdGF0ZW1lbnREb05vdENsb3NlID0gbURhdGFiYXNlLmNvbXBpbGVTdGF0ZW1lbnQoc3RhdGVtZW50KTsKKyAgICAgICAgc3RhdGVtZW50RG9Ob3RDbG9zZS5iaW5kTG9uZygxLCAxKTsKKyAgICAgICAgLyogZG8gbm90IGNsb3NlIHN0YXRlbWVudERvTm90Q2xvc2Ugb2JqZWN0LgorICAgICAgICAgKiBUaGF0IHNob3VsZCBsZWF2ZSBpdCBpbiBTUUxpdGVEYXRhYmFzZS5tUHJvZ3JhbXMuCisgICAgICAgICAqIG1EYXRhYmFzZS5jbG9zZSgpIGluIHRlYXJEb3duKCkgc2hvdWxkIHJlbGVhc2UgaXQuCisgICAgICAgICAqLworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBjcmVhdGVUYWJsZUFuZENsZWFyQ2FjaGUoKSB7CisgICAgICAgIG1EYXRhYmFzZS5kaXNhYmxlV3JpdGVBaGVhZExvZ2dpbmcoKTsKKyAgICAgICAgbURhdGFiYXNlLmV4ZWNTUUwoIkRST1AgVEFCTEUgSUYgRVhJU1RTICIgKyBURVNUX1RBQkxFKTsKKyAgICAgICAgbURhdGFiYXNlLmV4ZWNTUUwoIkNSRUFURSBUQUJMRSAiICsgVEVTVF9UQUJMRSArICIgKGkgaW50LCBqIGludCk7Iik7CisgICAgICAgIG1EYXRhYmFzZS5lbmFibGVXcml0ZUFoZWFkTG9nZ2luZygpOworICAgICAgICBtRGF0YWJhc2UubG9jaygpOworICAgICAgICAvLyBmbHVzaCB0aGUgYWJvdmUgc3RhdGVtZW50IGZyb20gY2FjaGUgYW5kIGNsb3NlIGFsbCB0aGUgcGVuZGluZyBzdGF0ZW1lbnRzIHRvIGJlIHJlbGVhc2VkCisgICAgICAgIG1EYXRhYmFzZS5kZWFsbG9jQ2FjaGVkU3FsU3RhdGVtZW50cygpOworICAgICAgICBtRGF0YWJhc2UuY2xvc2VQZW5kaW5nU3RhdGVtZW50cygpOworICAgICAgICBtRGF0YWJhc2UudW5sb2NrKCk7CisgICAgICAgIGFzc2VydEVxdWFscygwLCBtRGF0YWJhc2UuZ2V0UXVldWVkVXBTdG10TGlzdCgpLnNpemUoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogdGVzdCB0byBtYWtlIHN1cmUgdGhlIHN0YXRlbWVudCBmaW5hbGl6YXRpb25zIGFyZSBub3QgZG9uZSByaWdodCBhd2F5IGJ1dAorICAgICAqIHBpZ2d5LWJhY2tlZCBvbnRvIHRoZSBuZXh0IHNxbCBzdGF0ZW1lbnQgZXhlY3V0aW9uIG9uIHRoZSBzYW1lIGRhdGFiYXNlLgorICAgICAqLworICAgIEBTbWFsbFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U3RhdGVtZW50Q2xvc2UoKSB7CisgICAgICAgIGNyZWF0ZVRhYmxlQW5kQ2xlYXJDYWNoZSgpOworICAgICAgICAvLyBmaWxsIHVwIHN0YXRlbWVudCBjYWNoZSBpbiBtRGF0YWJhc2UKKyAgICAgICAgaW50IE4gPSBTUUxpdGVEYXRhYmFzZS5NQVhfU1FMX0NBQ0hFX1NJWkU7CisgICAgICAgIG1EYXRhYmFzZS5zZXRNYXhTcWxDYWNoZVNpemUoTik7CisgICAgICAgIFNRTGl0ZVN0YXRlbWVudCBzdG10OworICAgICAgICBpbnQgc3RtdDBJZCA9IDA7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTjsgaSArKykgeworICAgICAgICAgICAgQ2xhc3NUb1Rlc3RTcWxDb21waWxhdGlvbkFuZENhY2hpbmcgYyA9CisgICAgICAgICAgICAgICAgICAgIENsYXNzVG9UZXN0U3FsQ29tcGlsYXRpb25BbmRDYWNoaW5nLmNyZWF0ZShtRGF0YWJhc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgImluc2VydCBpbnRvIHRlc3QgdmFsdWVzKCIgKyBpICsgIiwgPyk7Iik7CisgICAgICAgICAgICAvLyBrZWVwIHRyYWNrIG9mIDB0aCBlbnRyeQorICAgICAgICAgICAgaWYgKGkgPT0gMCkgeworICAgICAgICAgICAgICAgIHN0bXQwSWQgPSBjLmdldFNxbFN0YXRlbWVudElkKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjLmNsb3NlKCk7CisgICAgICAgIH0KKworICAgICAgICAvLyBhZGQgb25lIG1vcmUgdG8gdGhlIGNhY2hlIC0gYW5kIHRoZSBhYm92ZSAnc3RtdDBJZCcgc2hvdWxkIGZhbGwgb3V0IG9mIGNhY2hlCisgICAgICAgIENsYXNzVG9UZXN0U3FsQ29tcGlsYXRpb25BbmRDYWNoaW5nIHN0bXQxID0KKyAgICAgICAgICAgICAgICBDbGFzc1RvVGVzdFNxbENvbXBpbGF0aW9uQW5kQ2FjaGluZy5jcmVhdGUobURhdGFiYXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgImluc2VydCBpbnRvIHRlc3QgdmFsdWVzKDEwMCwgPyk7Iik7CisgICAgICAgIHN0bXQxLmNsb3NlKCk7CisKKyAgICAgICAgLy8gdGhlIGFib3ZlIGNsb3NlKCkgc2hvdWxkIGhhdmUgcXVldWVkVXAgdGhlIHN0YXRlbWVudCBmb3IgZmluYWxpemF0aW9uCisgICAgICAgIEFycmF5TGlzdDxJbnRlZ2VyPiBzdGF0ZW1lbnRJZHMgPSBtRGF0YWJhc2UuZ2V0UXVldWVkVXBTdG10TGlzdCgpOworICAgICAgICBhc3NlcnRUcnVlKHN0YXRlbWVudElkcy5jb250YWlucyhzdG10MElkKSk7CisKKyAgICAgICAgLy8gZXhlY3V0ZSBzb21ldGhpbmcgdG8gc2VlIGlmIHRoaXMgc3RhdGVtZW50IGdldHMgZmluYWxpemVkCisgICAgICAgIG1EYXRhYmFzZS5leGVjU1FMKCJkZWxldGUgZnJvbSB0ZXN0IHdoZXJlIGkgPSAxMDsiKTsKKyAgICAgICAgc3RhdGVtZW50SWRzID0gbURhdGFiYXNlLmdldFF1ZXVlZFVwU3RtdExpc3QoKTsKKyAgICAgICAgYXNzZXJ0RmFsc2Uoc3RhdGVtZW50SWRzLmNvbnRhaW5zKHN0bXQwSWQpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBzYW1lIGFzIGFib3ZlIC0gZXhjZXB0IHRoYXQgdGhlIHN0YXRlbWVudCB0byBiZSBmaW5hbGl6ZWQgaXMgZnJvbSBUaHJlYWQgIyAxLgorICAgICAqIGFuZCBpdCBpcyBldmVudHVhbGx5IGZpbmFsaXplZCBpbiBUaHJlYWQgIyAyIHdoZW4gaXQgZXhlY3V0ZXMgYSBTUUwgc3RhdGVtZW50LgorICAgICAqIEB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24KKyAgICAgKi8KKyAgICBATGFyZ2VUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFN0YXRlbWVudENsb3NlRGlmZlRocmVhZCgpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgICAgIGNyZWF0ZVRhYmxlQW5kQ2xlYXJDYWNoZSgpOworICAgICAgICBmaW5hbCBpbnQgTiA9IFNRTGl0ZURhdGFiYXNlLk1BWF9TUUxfQ0FDSEVfU0laRTsKKyAgICAgICAgbURhdGFiYXNlLnNldE1heFNxbENhY2hlU2l6ZShOKTsKKyAgICAgICAgLy8gZmlsbCB1cCBzdGF0ZW1lbnQgY2FjaGUgaW4gbURhdGFiYXNlIGluIGEgdGhyZWFkCisgICAgICAgIFRocmVhZCB0MSA9IG5ldyBUaHJlYWQoKSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgIFNRTGl0ZVN0YXRlbWVudCBzdG10OworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTjsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIENsYXNzVG9UZXN0U3FsQ29tcGlsYXRpb25BbmRDYWNoaW5nIGMgPQorICAgICAgICAgICAgICAgICAgICAgICAgQ2xhc3NUb1Rlc3RTcWxDb21waWxhdGlvbkFuZENhY2hpbmcuY3JlYXRlKGdldERiKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbnNlcnQgaW50byB0ZXN0IHZhbHVlcygiICsgaSArICIsID8pOyIpOworICAgICAgICAgICAgICAgICAgICAvLyBrZWVwIHRyYWNrIG9mIDB0aCBlbnRyeQorICAgICAgICAgICAgICAgICAgICBpZiAoaSA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzdG10MElkID0gYy5nZXRTcWxTdGF0ZW1lbnRJZCgpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGMuY2xvc2UoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH07CisgICAgICAgIHQxLnN0YXJ0KCk7CisgICAgICAgIC8vIHdhaXQgZm9yIHRoZSB0aHJlYWQgdG8gZmluaXNoCisgICAgICAgIHQxLmpvaW4oKTsKKyAgICAgICAgLy8gbURhdGFiYXNlIHNob3VsZG4ndCBoYXZlIGFueSBzdGF0ZW1lbnRzIHRvIGJlIHJlbGVhc2VkCisgICAgICAgIGFzc2VydEVxdWFscygwLCBtRGF0YWJhc2UuZ2V0UXVldWVkVXBTdG10TGlzdCgpLnNpemUoKSk7CisKKyAgICAgICAgLy8gYWRkIG9uZSBtb3JlIHRvIHRoZSBjYWNoZSAtIGFuZCB0aGUgYWJvdmUgJ3N0bXQwSWQnIHNob3VsZCBmYWxsIG91dCBvZiBjYWNoZQorICAgICAgICAvLyBqdXN0IGZvciB0aGUgaGVjayBvZiBpdCwgZG8gaXQgaW4gYSBzZXBhcmF0ZSB0aHJlYWQKKyAgICAgICAgVGhyZWFkIHQyID0gbmV3IFRocmVhZCgpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZSBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgQ2xhc3NUb1Rlc3RTcWxDb21waWxhdGlvbkFuZENhY2hpbmcgc3RtdDEgPQorICAgICAgICAgICAgICAgICAgICBDbGFzc1RvVGVzdFNxbENvbXBpbGF0aW9uQW5kQ2FjaGluZy5jcmVhdGUoZ2V0RGIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaW5zZXJ0IGludG8gdGVzdCB2YWx1ZXMoMTAwLCA/KTsiKTsKKyAgICAgICAgICAgICAgICBzdG10MS5iaW5kTG9uZygxLCAxKTsKKyAgICAgICAgICAgICAgICBzdG10MS5jbG9zZSgpOworICAgICAgICAgICAgfQorICAgICAgICB9OworICAgICAgICB0Mi5zdGFydCgpOworICAgICAgICB0Mi5qb2luKCk7CisKKyAgICAgICAgLy8gY2xvc2UoKSBpbiB0aGUgYWJvdmUgdGhyZWFkIHNob3VsZCBoYXZlIHF1ZXVlZFVwIHRoZSBzdG10MElkIGZvciBmaW5hbGl6YXRpb24KKyAgICAgICAgQXJyYXlMaXN0PEludGVnZXI+IHN0YXRlbWVudElkcyA9IGdldERiKCkuZ2V0UXVldWVkVXBTdG10TGlzdCgpOworICAgICAgICBhc3NlcnRUcnVlKHN0YXRlbWVudElkcy5jb250YWlucyhnZXRTdG10MElkKCkpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIHN0YXRlbWVudElkcy5zaXplKCkpOworCisgICAgICAgIC8vIGV4ZWN1dGUgc29tZXRoaW5nIHRvIHNlZSBpZiB0aGlzIHN0YXRlbWVudCBnZXRzIGZpbmFsaXplZAorICAgICAgICAvLyBhZ2FpbiBkbyBpdCBpbiBhIHNlcGFyYXRlIHRocmVhZAorICAgICAgICBUaHJlYWQgdDMgPSBuZXcgVGhyZWFkKCkgeworICAgICAgICAgICAgQE92ZXJyaWRlIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICBnZXREYigpLmV4ZWNTUUwoImRlbGV0ZSBmcm9tIHRlc3Qgd2hlcmUgaSA9IDEwOyIpOworICAgICAgICAgICAgfQorICAgICAgICB9OworICAgICAgICB0My5zdGFydCgpOworICAgICAgICB0My5qb2luKCk7CisKKyAgICAgICAgLy8gaXMgdGhlIHN0YXRlbWVudCBmaW5hbGl6ZWQ/CisgICAgICAgIHN0YXRlbWVudElkcyA9IGdldERiKCkuZ2V0UXVldWVkVXBTdG10TGlzdCgpOworICAgICAgICBhc3NlcnRGYWxzZShzdGF0ZW1lbnRJZHMuY29udGFpbnMoZ2V0U3RtdDBJZCgpKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2xhdGlsZSBpbnQgc3RtdDBJZCA9IDA7CisgICAgcHJpdmF0ZSBzeW5jaHJvbml6ZWQgaW50IGdldFN0bXQwSWQoKSB7CisgICAgICAgIHJldHVybiB0aGlzLnN0bXQwSWQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogc2FtZSBhcyBhYm92ZSAtIGV4Y2VwdCB0aGF0IHRoZSBxdWV1ZSBvZiBzdGF0ZW1lbnRzIHRvIGJlIGZpbmFsaXplZCBhcmUgZmluYWxpemVkCisgICAgICogYnkgZGF0YWJhc2UgY2xvc2UoKSBvcGVyYXRpb24uCisgICAgICovCisgICAgQExhcmdlVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTdGF0ZW1lbnRDbG9zZUJ5RGJDbG9zZSgpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgICAgIGNyZWF0ZVRhYmxlQW5kQ2xlYXJDYWNoZSgpOworICAgICAgICAvLyBmaWxsIHVwIHN0YXRlbWVudCBjYWNoZSBpbiBtRGF0YWJhc2UgaW4gYSB0aHJlYWQKKyAgICAgICAgVGhyZWFkIHQxID0gbmV3IFRocmVhZCgpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZSBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgaW50IE4gPSBTUUxpdGVEYXRhYmFzZS5NQVhfU1FMX0NBQ0hFX1NJWkU7CisgICAgICAgICAgICAgICAgZ2V0RGIoKS5zZXRNYXhTcWxDYWNoZVNpemUoTik7CisgICAgICAgICAgICAgICAgU1FMaXRlU3RhdGVtZW50IHN0bXQ7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBOOyBpICsrKSB7CisgICAgICAgICAgICAgICAgICAgIENsYXNzVG9UZXN0U3FsQ29tcGlsYXRpb25BbmRDYWNoaW5nIGMgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIENsYXNzVG9UZXN0U3FsQ29tcGlsYXRpb25BbmRDYWNoaW5nLmNyZWF0ZShnZXREYigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImluc2VydCBpbnRvIHRlc3QgdmFsdWVzKCIgKyBpICsgIiwgPyk7Iik7CisgICAgICAgICAgICAgICAgICAgIC8vIGtlZXAgdHJhY2sgb2YgMHRoIGVudHJ5CisgICAgICAgICAgICAgICAgICAgIGlmIChpID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0bXQwSWQgPSBjLmdldFNxbFN0YXRlbWVudElkKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYy5jbG9zZSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKyAgICAgICAgdDEuc3RhcnQoKTsKKyAgICAgICAgLy8gd2FpdCBmb3IgdGhlIHRocmVhZCB0byBmaW5pc2gKKyAgICAgICAgdDEuam9pbigpOworCisgICAgICAgIC8vIGFkZCBvbmUgbW9yZSB0byB0aGUgY2FjaGUgLSBhbmQgdGhlIGFib3ZlICdzdG10MElkJyBzaG91bGQgZmFsbCBvdXQgb2YgY2FjaGUKKyAgICAgICAgLy8ganVzdCBmb3IgdGhlIGhlY2sgb2YgaXQsIGRvIGl0IGluIGEgc2VwYXJhdGUgdGhyZWFkCisgICAgICAgIFRocmVhZCB0MiA9IG5ldyBUaHJlYWQoKSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgIENsYXNzVG9UZXN0U3FsQ29tcGlsYXRpb25BbmRDYWNoaW5nIHN0bXQxID0KKyAgICAgICAgICAgICAgICAgICAgICAgIENsYXNzVG9UZXN0U3FsQ29tcGlsYXRpb25BbmRDYWNoaW5nLmNyZWF0ZShnZXREYigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaW5zZXJ0IGludG8gdGVzdCB2YWx1ZXMoMTAwLCA/KTsiKTsKKyAgICAgICAgICAgICAgICBzdG10MS5iaW5kTG9uZygxLCAxKTsKKyAgICAgICAgICAgICAgICBzdG10MS5jbG9zZSgpOworICAgICAgICAgICAgfQorICAgICAgICB9OworICAgICAgICB0Mi5zdGFydCgpOworICAgICAgICB0Mi5qb2luKCk7CisKKyAgICAgICAgLy8gY2xvc2UoKSBpbiB0aGUgYWJvdmUgdGhyZWFkIHNob3VsZCBoYXZlIHF1ZXVlZFVwIHRoZSBzdGF0ZW1lbnQgZm9yIGZpbmFsaXphdGlvbgorICAgICAgICBBcnJheUxpc3Q8SW50ZWdlcj4gc3RhdGVtZW50SWRzID0gZ2V0RGIoKS5nZXRRdWV1ZWRVcFN0bXRMaXN0KCk7CisgICAgICAgIGFzc2VydFRydWUoZ2V0U3RtdDBJZCgpID4gMCk7CisgICAgICAgIGFzc2VydFRydWUoc3RhdGVtZW50SWRzLmNvbnRhaW5zKHN0bXQwSWQpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIHN0YXRlbWVudElkcy5zaXplKCkpOworCisgICAgICAgIC8vIGNsb3NlIHRoZSBkYXRhYmFzZS4gZXZlcnl0aGluZyBmcm9tIG1DbG9zZWRTdGF0ZW1lbnRJZHMgaW4gbURhdGFiYXNlCisgICAgICAgIC8vIHNob3VsZCBiZSBmaW5hbGl6ZWQgYW5kIGNsZWFyZWQgZnJvbSB0aGUgbGlzdAorICAgICAgICAvLyBhZ2FpbiBkbyBpdCBpbiBhIHNlcGFyYXRlIHRocmVhZAorICAgICAgICBUaHJlYWQgdDMgPSBuZXcgVGhyZWFkKCkgeworICAgICAgICAgICAgQE92ZXJyaWRlIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICBnZXREYigpLmNsb3NlKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisgICAgICAgIHQzLnN0YXJ0KCk7CisgICAgICAgIHQzLmpvaW4oKTsKKworICAgICAgICAvLyBjaGVjayBtQ2xvc2VkU3RhdGVtZW50SWRzIGluIG1EYXRhYmFzZS4gaXQgc2hvdWxkIGJlIGVtcHR5CisgICAgICAgIHN0YXRlbWVudElkcyA9IGdldERiKCkuZ2V0UXVldWVkVXBTdG10TGlzdCgpOworICAgICAgICBhc3NlcnRFcXVhbHMoMCwgc3RhdGVtZW50SWRzLnNpemUoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhpcyB0ZXN0IHRlc3RzIHVzYWdlIGV4ZWNTUUwoKSB0byBiZWdpbiB0cmFuc2FjdGlvbiB3b3JrcyBpbiB0aGUgZm9sbG93aW5nIHdheQorICAgICAqICAgVGhyZWFkICMxIGRvZXMKKyAgICAgKiAgICAgICBleGVjU1FMKCJiZWdpbiB0cmFuc2FjdGlvbiIpOworICAgICAqICAgICAgIGluc2VydCgpCisgICAgICogICBUaHJlYWQgIyAyCisgICAgICogICAgICAgcXVlcnkoKQorICAgICAqICAgVGhyZWFkIzEgKCJlbmQgdHJhbnNhY3Rpb24iKQorICAgICAqIFRocmVhZCAjIDIgcXVlcnkgd2lsbCBleGVjdXRlIC0gYmVjYXVzZSBqYXZhIGxheWVyIHdpbGwgbm90IGhhdmUgbG9ja2VkIHRoZSBTUUxpdGVEYXRhYmFzZQorICAgICAqIG9iamVjdCBhbmQgc3FsaXRlIHdpbGwgY29uc2lkZXIgdGhpcyBxdWVyeSB0byBiZSBwYXJ0IG9mIHRoZSB0cmFuc2FjdGlvbi4KKyAgICAgKgorICAgICAqIGJ1dCBpZiB0aHJlYWQgIyAxIHVzZXMgYmVnaW5UcmFuc2FjdGlvbigpIGluc3RlYWQgb2YgZXhlY1NRTCgpIHRvIHN0YXJ0IHRyYW5zYWN0aW9uLAorICAgICAqIHRoZW4gVGhyZWFkICMgMidzIHF1ZXJ5IHdpbGwgaGF2ZSBiZWVuIGJsb2NrZWQgYnkgamF2YSBsYXllcgorICAgICAqIHVudGlsIFRocmVhZCMxIGVuZHMgdHJhbnNhY3Rpb24uCisgICAgICoKKyAgICAgKiBAdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uCisgICAgICovCisgICAgQFNtYWxsVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RFeGVjU3FsVG9TdGFydEFuZEVuZFRyYW5zYWN0aW9uKCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICAgICAgcnVuRXhlY1NxbFRvU3RhcnRBbmRFbmRUcmFuc2FjdGlvbigiRU5EIik7CisgICAgICAgIC8vIHNhbWUgYXMgYWJvdmUsIGluc3RlYWQgbm93IGRvICJDT01NSVQiIG9yICJST0xMQkFDSyIgaW5zdGVhZCBvZiAiRU5EIiB0cmFuc2FjdGlvbgorICAgICAgICBydW5FeGVjU3FsVG9TdGFydEFuZEVuZFRyYW5zYWN0aW9uKCJDT01NSVQiKTsKKyAgICAgICAgcnVuRXhlY1NxbFRvU3RhcnRBbmRFbmRUcmFuc2FjdGlvbigiUk9MTEJBQ0siKTsKKyAgICB9CisgICAgcHJpdmF0ZSB2b2lkIHJ1bkV4ZWNTcWxUb1N0YXJ0QW5kRW5kVHJhbnNhY3Rpb24oU3RyaW5nIHN0cikgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICAgICAgY3JlYXRlVGFibGVBbmRDbGVhckNhY2hlKCk7CisgICAgICAgIC8vIGRpc2FibGUgV0FMIGp1c3Qgc28gcXVlcmllcyBhbmQgdXBkYXRlcyB1c2UgdGhlIHNhbWUgZGF0YWJhc2UgY29ubmVjdGlvbgorICAgICAgICBtRGF0YWJhc2UuZGlzYWJsZVdyaXRlQWhlYWRMb2dnaW5nKCk7CisgICAgICAgIG1EYXRhYmFzZS5leGVjU1FMKCJCRUdJTiB0cmFuc2FjdGlvbiIpOworICAgICAgICAvLyBldmVuIHRob3VnaCBtRGF0YWJhc2UuYmVnaW5UcmFuc2FjdGlvbigpIGlzIG5vdCBjYWxsZWQgdG8gc3RhcnQgdHJhbnNhY3Rpb24sCisgICAgICAgIC8vIG1EYXRhYmFzZSBjb25uZWN0aW9uIHNob3VsZCBub3cgYmUgaW4gdHJhbnNhY3Rpb24gYXMgYSByZXN1bHQgb2YKKyAgICAgICAgLy8gbURhdGFiYXNlLmV4ZWNTUUwoIkJFR0lOIHRyYW5zYWN0aW9uIikKKyAgICAgICAgLy8gYnV0IG1EYXRhYmFzZS5tTG9jayBzaG91bGQgbm90IGJlIGhlbGQgYnkgYW55IHRocmVhZAorICAgICAgICBhc3NlcnRUcnVlKG1EYXRhYmFzZS5pblRyYW5zYWN0aW9uKCkpOworICAgICAgICBhc3NlcnRGYWxzZShtRGF0YWJhc2UuaXNEYkxvY2tlZEJ5Q3VycmVudFRocmVhZCgpKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UobURhdGFiYXNlLmlzRGJMb2NrZWRCeU90aGVyVGhyZWFkcygpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShtRGF0YWJhc2UuYW1JSW5UcmFuc2FjdGlvbigpKTsKKyAgICAgICAgbURhdGFiYXNlLmV4ZWNTUUwoIklOU0VSVCBpbnRvICIgKyBURVNUX1RBQkxFICsgIiB2YWx1ZXMoMTAsIDk5OSk7Iik7CisgICAgICAgIGFzc2VydFRydWUobURhdGFiYXNlLmluVHJhbnNhY3Rpb24oKSk7CisgICAgICAgIGFzc2VydEZhbHNlKG1EYXRhYmFzZS5pc0RiTG9ja2VkQnlDdXJyZW50VGhyZWFkKCkpOworICAgICAgICBhc3NlcnRGYWxzZShtRGF0YWJhc2UuaXNEYkxvY2tlZEJ5T3RoZXJUaHJlYWRzKCkpOworICAgICAgICBhc3NlcnRUcnVlKG1EYXRhYmFzZS5hbUlJblRyYW5zYWN0aW9uKCkpOworICAgICAgICBUaHJlYWQgdCA9IG5ldyBUaHJlYWQoKSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgIGFzc2VydFRydWUobURhdGFiYXNlLmFtSUluVHJhbnNhY3Rpb24oKSk7CisgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDk5OSwgRGF0YWJhc2VVdGlscy5sb25nRm9yUXVlcnkoZ2V0RGIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICJzZWxlY3QgaiBmcm9tICIgKyBURVNUX1RBQkxFICsgIiBXSEVSRSBpID0gMTAiLCBudWxsKSk7CisgICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZShnZXREYigpLmluVHJhbnNhY3Rpb24oKSk7CisgICAgICAgICAgICAgICAgYXNzZXJ0RmFsc2UoZ2V0RGIoKS5pc0RiTG9ja2VkQnlDdXJyZW50VGhyZWFkKCkpOworICAgICAgICAgICAgICAgIGFzc2VydEZhbHNlKGdldERiKCkuaXNEYkxvY2tlZEJ5T3RoZXJUaHJlYWRzKCkpOworICAgICAgICAgICAgICAgIGFzc2VydFRydWUobURhdGFiYXNlLmFtSUluVHJhbnNhY3Rpb24oKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisgICAgICAgIHQuc3RhcnQoKTsKKyAgICAgICAgdC5qb2luKCk7CisgICAgICAgIGFzc2VydFRydWUobURhdGFiYXNlLmFtSUluVHJhbnNhY3Rpb24oKSk7CisgICAgICAgIGFzc2VydFRydWUobURhdGFiYXNlLmluVHJhbnNhY3Rpb24oKSk7CisgICAgICAgIGFzc2VydEZhbHNlKG1EYXRhYmFzZS5pc0RiTG9ja2VkQnlDdXJyZW50VGhyZWFkKCkpOworICAgICAgICBhc3NlcnRGYWxzZShtRGF0YWJhc2UuaXNEYkxvY2tlZEJ5T3RoZXJUaHJlYWRzKCkpOworICAgICAgICBtRGF0YWJhc2UuZXhlY1NRTChzdHIpOworICAgICAgICBhc3NlcnRGYWxzZShtRGF0YWJhc2UuYW1JSW5UcmFuc2FjdGlvbigpKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UobURhdGFiYXNlLmluVHJhbnNhY3Rpb24oKSk7CisgICAgICAgIGFzc2VydEZhbHNlKG1EYXRhYmFzZS5pc0RiTG9ja2VkQnlDdXJyZW50VGhyZWFkKCkpOworICAgICAgICBhc3NlcnRGYWxzZShtRGF0YWJhc2UuaXNEYkxvY2tlZEJ5T3RoZXJUaHJlYWRzKCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIHRlc3QgdGhlIGZvbGxvd2luZworICAgICAqIGh0dHA6Ly9iL2lzc3VlP2lkPTI4NzEwMzcKKyAgICAgKiAgICAgICAgICBDdXJzb3IgY3Vyc29yID0gZGIucXVlcnkoLi4uKTsKKyAgICAgKiAgICAgICAgICAvLyB3aXRoIFdBTCBlbmFibGVkLCB0aGUgYWJvdmUgdXNlcyBhIHBvb2xlZCBkYXRhYmFzZSBjb25uZWN0aW9uCisgICAgICogICAgICAgICAgZGIuYmVnaW5UcmFuc2FjdGlvbigpCisgICAgICogICAgICAgICAgdHJ5IHsKKyAgICAgKiAgICAgICAgICAgIGRiLmluc2VydCguLi4uLi4pOworICAgICAqICAgICAgICAgICAgY3Vyc29yLnJlcXVlcnkoKTsKKyAgICAgKiAgICAgICAgICAgIC8vIHNpbmNlIHRoZSBjdXJzb3IgdXNlcyBwb29sZWQgZGF0YWJhc2UgY29ubmVjdGlvbiwgdGhlIGFib3ZlIHJlcXVlcnkKKyAgICAgKiAgICAgICAgICAgIC8vIHdpbGwgbm90IHJldHVybiB0aGUgcmVzdWx0cyB0aGF0IHdlcmUgaW5zZXJ0ZWQgYWJvdmUgc2luY2UgdGhlIGluc2VydCBpcworICAgICAqICAgICAgICAgICAgLy8gZG9uZSB1c2luZyBtYWluIGRhdGFiYXNlIGNvbm5lY3Rpb24gQU5EIHRoZSB0cmFuc2FjdGlvbiBpcyBub3QgY29tbWl0dGVkIHlldC4KKyAgICAgKiAgICAgICAgICAgIC8vIGZpeCBpcyB0byBtYWtlIHRoZSBhYm92ZSBjdXJzb3IgdXNlIHRoZSBtYWluIGRhdGFiYXNlIGNvbm5lY3Rpb24gLSBhbmQgTk9UCisgICAgICogICAgICAgICAgICAvLyB0aGUgcG9vbGVkIGRhdGFiYXNlIGNvbm5lY3Rpb24KKyAgICAgKiAgICAgICAgICAgIGRiLnNldFRyYW5zYWN0aW9uU3VjY2Vzc2Z1bCgpCisgICAgICogICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgKiAgICAgICAgICAgIGRiLmVuZFRyYW5zYWN0aW9uKCkKKyAgICAgKiAgICAgICAgICB9CisgICAgICoKKyAgICAgKiBAdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uCisgICAgICovCisgICAgQFNtYWxsVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RUcmFuc2FjdGlvbkFuZFdhbEludGVycGxheTEoKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24geworICAgICAgICBjcmVhdGVUYWJsZUFuZENsZWFyQ2FjaGUoKTsKKyAgICAgICAgbURhdGFiYXNlLmV4ZWNTUUwoIklOU0VSVCBpbnRvICIgKyBURVNUX1RBQkxFICsgIiB2YWx1ZXMoMTAsIDk5OSk7Iik7CisgICAgICAgIFN0cmluZyBzcWwgPSAic2VsZWN0ICogZnJvbSAiICsgVEVTVF9UQUJMRTsKKyAgICAgICAgQ3Vyc29yIGMgPSBtRGF0YWJhc2UucmF3UXVlcnkoc3FsLCBudWxsKTsKKyAgICAgICAgLy8gc2hvdWxkIGhhdmUgMSByb3cgaW4gdGhlIHRhYmxlCisgICAgICAgIGFzc2VydEVxdWFscygxLCBjLmdldENvdW50KCkpOworICAgICAgICBtRGF0YWJhc2UuYmVnaW5UcmFuc2FjdGlvbk5vbkV4Y2x1c2l2ZSgpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgbURhdGFiYXNlLmV4ZWNTUUwoIklOU0VSVCBpbnRvICIgKyBURVNUX1RBQkxFICsgIiB2YWx1ZXMoMTAwLCA5OTA5KTsiKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygyLCBEYXRhYmFzZVV0aWxzLmxvbmdGb3JRdWVyeShtRGF0YWJhc2UsCisgICAgICAgICAgICAgICAgICAgICJzZWxlY3QgY291bnQoKikgZnJvbSAiICsgVEVTVF9UQUJMRSwgbnVsbCkpOworICAgICAgICAgICAgLy8gcmVxdWVyeSBvbiB0aGUgcHJldmlvdXNseSBvcGVuZWQgY3Vyc29yCisgICAgICAgICAgICAvLyBjdXJzb3Igc2hvdWxkIG5vdyB1c2UgdGhlIG1haW4gZGF0YWJhc2UgY29ubmVjdGlvbiBhbmQgc2VlIDIgcm93cworICAgICAgICAgICAgYy5yZXF1ZXJ5KCk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMiwgYy5nZXRDb3VudCgpKTsKKyAgICAgICAgICAgIG1EYXRhYmFzZS5zZXRUcmFuc2FjdGlvblN1Y2Nlc3NmdWwoKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIG1EYXRhYmFzZS5lbmRUcmFuc2FjdGlvbigpOworICAgICAgICB9CisgICAgICAgIGMuY2xvc2UoKTsKKworICAgICAgICAvLyBkbyB0aGUgc2FtZSB0ZXN0IGJ1dCBub3cgZG8gdGhlIHJlcXVlcnkgaW4gYSBzZXBhcmF0ZSB0aHJlYWQuCisgICAgICAgIGNyZWF0ZVRhYmxlQW5kQ2xlYXJDYWNoZSgpOworICAgICAgICBtRGF0YWJhc2UuZXhlY1NRTCgiSU5TRVJUIGludG8gIiArIFRFU1RfVEFCTEUgKyAiIHZhbHVlcygxMCwgOTk5KTsiKTsKKyAgICAgICAgZmluYWwgQ3Vyc29yIGMxID0gbURhdGFiYXNlLnJhd1F1ZXJ5KCJzZWxlY3QgY291bnQoKikgZnJvbSAiICsgVEVTVF9UQUJMRSwgbnVsbCk7CisgICAgICAgIC8vIHNob3VsZCBoYXZlIDEgcm93IGluIHRoZSB0YWJsZQorICAgICAgICBhc3NlcnRFcXVhbHMoMSwgYzEuZ2V0Q291bnQoKSk7CisgICAgICAgIG1EYXRhYmFzZS5iZWdpblRyYW5zYWN0aW9uTm9uRXhjbHVzaXZlKCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBtRGF0YWJhc2UuZXhlY1NRTCgiSU5TRVJUIGludG8gIiArIFRFU1RfVEFCTEUgKyAiIHZhbHVlcygxMDAsIDk5MDkpOyIpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIERhdGFiYXNlVXRpbHMubG9uZ0ZvclF1ZXJ5KG1EYXRhYmFzZSwKKyAgICAgICAgICAgICAgICAgICAgInNlbGVjdCBjb3VudCgqKSBmcm9tICIgKyBURVNUX1RBQkxFLCBudWxsKSk7CisgICAgICAgICAgICAvLyBxdWVyeSBpbiBhIGRpZmZlcmVudCB0aHJlYWQuIHRoYXQgY2F1c2VzIHRoZSBjdXJzb3IgdG8gdXNlIGEgcG9vbGVkIGNvbm5lY3Rpb24KKyAgICAgICAgICAgIC8vIGFuZCBzaW5jZSB0aGlzIHRocmVhZCBoYXNuJ3QgY29tbWl0dGVkIGl0cyBjaGFuZ2VzLCB0aGUgY3Vyc29yIHNob3VsZCBzdGlsbCBzZWUgb25seQorICAgICAgICAgICAgLy8gMSByb3cKKyAgICAgICAgICAgIFRocmVhZCB0ID0gbmV3IFRocmVhZCgpIHsKKyAgICAgICAgICAgICAgICBAT3ZlcnJpZGUgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgICAgICBjMS5yZXF1ZXJ5KCk7CisgICAgICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscygxLCBjMS5nZXRDb3VudCgpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9OworICAgICAgICAgICAgdC5zdGFydCgpOworICAgICAgICAgICAgdC5qb2luKCk7CisgICAgICAgICAgICAvLyBzaG91bGQgYmUgMiByb3dzIG5vdyAtIGluY2x1ZGluZyB0aGUgdGhlIHJvdyBpbnNlcnRlZCBhYm92ZQorICAgICAgICAgICAgbURhdGFiYXNlLnNldFRyYW5zYWN0aW9uU3VjY2Vzc2Z1bCgpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgbURhdGFiYXNlLmVuZFRyYW5zYWN0aW9uKCk7CisgICAgICAgIH0KKyAgICAgICAgYzEuY2xvc2UoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGlzIHRlc3QgaXMgc2FtZSBhcyB7QGxpbmsgI3Rlc3RUcmFuc2FjdGlvbkFuZFdhbEludGVycGxheTEoKX0gZXhjZXB0IHRoZSBmb2xsb3dpbmc6CisgICAgICogaW5zdGVhZCBvZiBtRGF0YWJhc2UuYmVnaW5UcmFuc2FjdGlvbk5vbkV4Y2x1c2l2ZSgpLCB1c2UgZXhlY1NRTCgiQkVHSU4gdHJhbnNhY3Rpb24iKQorICAgICAqIGFuZCBpbnN0ZWFkIG9mIG1EYXRhYmFzZS5lbmRUcmFuc2FjdGlvbigpLCB1c2UgZXhlY1NRTCgiRU5EIik7CisgICAgICovCisgICAgQFNtYWxsVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RUcmFuc2FjdGlvbkFuZFdhbEludGVycGxheTIoKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24geworICAgICAgICBjcmVhdGVUYWJsZUFuZENsZWFyQ2FjaGUoKTsKKyAgICAgICAgbURhdGFiYXNlLmV4ZWNTUUwoIklOU0VSVCBpbnRvICIgKyBURVNUX1RBQkxFICsgIiB2YWx1ZXMoMTAsIDk5OSk7Iik7CisgICAgICAgIFN0cmluZyBzcWwgPSAic2VsZWN0ICogZnJvbSAiICsgVEVTVF9UQUJMRTsKKyAgICAgICAgQ3Vyc29yIGMgPSBtRGF0YWJhc2UucmF3UXVlcnkoc3FsLCBudWxsKTsKKyAgICAgICAgLy8gc2hvdWxkIGhhdmUgMSByb3cgaW4gdGhlIHRhYmxlCisgICAgICAgIGFzc2VydEVxdWFscygxLCBjLmdldENvdW50KCkpOworICAgICAgICBtRGF0YWJhc2UuZXhlY1NRTCgiQkVHSU4gdHJhbnNhY3Rpb24iKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG1EYXRhYmFzZS5leGVjU1FMKCJJTlNFUlQgaW50byAiICsgVEVTVF9UQUJMRSArICIgdmFsdWVzKDEwMCwgOTkwOSk7Iik7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMiwgRGF0YWJhc2VVdGlscy5sb25nRm9yUXVlcnkobURhdGFiYXNlLAorICAgICAgICAgICAgICAgICAgICAic2VsZWN0IGNvdW50KCopIGZyb20gIiArIFRFU1RfVEFCTEUsIG51bGwpKTsKKyAgICAgICAgICAgIC8vIHJlcXVlcnkgb24gdGhlIHByZXZpb3VzbHkgb3BlbmVkIGN1cnNvcgorICAgICAgICAgICAgLy8gY3Vyc29yIHNob3VsZCBub3cgdXNlIHRoZSBtYWluIGRhdGFiYXNlIGNvbm5lY3Rpb24gYW5kIHNlZSAyIHJvd3MKKyAgICAgICAgICAgIGMucmVxdWVyeSgpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIGMuZ2V0Q291bnQoKSk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBtRGF0YWJhc2UuZXhlY1NRTCgiY29tbWl0OyIpOworICAgICAgICB9CisgICAgICAgIGMuY2xvc2UoKTsKKworICAgICAgICAvLyBkbyB0aGUgc2FtZSB0ZXN0IGJ1dCBub3cgZG8gdGhlIHJlcXVlcnkgaW4gYSBzZXBhcmF0ZSB0aHJlYWQuCisgICAgICAgIGNyZWF0ZVRhYmxlQW5kQ2xlYXJDYWNoZSgpOworICAgICAgICBtRGF0YWJhc2UuZXhlY1NRTCgiSU5TRVJUIGludG8gIiArIFRFU1RfVEFCTEUgKyAiIHZhbHVlcygxMCwgOTk5KTsiKTsKKyAgICAgICAgZmluYWwgQ3Vyc29yIGMxID0gbURhdGFiYXNlLnJhd1F1ZXJ5KCJzZWxlY3QgY291bnQoKikgZnJvbSAiICsgVEVTVF9UQUJMRSwgbnVsbCk7CisgICAgICAgIC8vIHNob3VsZCBoYXZlIDEgcm93IGluIHRoZSB0YWJsZQorICAgICAgICBhc3NlcnRFcXVhbHMoMSwgYzEuZ2V0Q291bnQoKSk7CisgICAgICAgIG1EYXRhYmFzZS5leGVjU1FMKCJCRUdJTiB0cmFuc2FjdGlvbiIpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgbURhdGFiYXNlLmV4ZWNTUUwoIklOU0VSVCBpbnRvICIgKyBURVNUX1RBQkxFICsgIiB2YWx1ZXMoMTAwLCA5OTA5KTsiKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygyLCBEYXRhYmFzZVV0aWxzLmxvbmdGb3JRdWVyeShtRGF0YWJhc2UsCisgICAgICAgICAgICAgICAgICAgICJzZWxlY3QgY291bnQoKikgZnJvbSAiICsgVEVTVF9UQUJMRSwgbnVsbCkpOworICAgICAgICAgICAgLy8gcXVlcnkgaW4gYSBkaWZmZXJlbnQgdGhyZWFkLiBidXQgc2luY2UgdGhlIHRyYW5zYWN0aW9uIGlzIHN0YXJ0ZWQgdXNpbmcKKyAgICAgICAgICAgIC8vIGV4ZWNTUSgpIGluc3RlYWQgb2YgYmVnaW5UcmFuc2FjdGlvbigpLCBjdXJzb3IncyBxdWVyeSBpcyBjb25zaWRlcmVkIHBhcnQgb2YKKyAgICAgICAgICAgIC8vIHRoZSBzYW1lIHRyYW5zYWN0aW9uIC0gYW5kIGhlbmNlIGl0IHNob3VsZCBzZWUgdGhlIGFib3ZlIGluc2VydGVkIHJvdworICAgICAgICAgICAgVGhyZWFkIHQgPSBuZXcgVGhyZWFkKCkgeworICAgICAgICAgICAgICAgIEBPdmVycmlkZSBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgICAgIGMxLnJlcXVlcnkoKTsKKyAgICAgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIGMxLmdldENvdW50KCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH07CisgICAgICAgICAgICB0LnN0YXJ0KCk7CisgICAgICAgICAgICB0LmpvaW4oKTsKKyAgICAgICAgICAgIC8vIHNob3VsZCBiZSAyIHJvd3Mgbm93IC0gaW5jbHVkaW5nIHRoZSB0aGUgcm93IGluc2VydGVkIGFib3ZlCisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBtRGF0YWJhc2UuZXhlY1NRTCgiY29tbWl0Iik7CisgICAgICAgIH0KKyAgICAgICAgYzEuY2xvc2UoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGlzIHRlc3QgaXMgc2FtZSBhcyB7QGxpbmsgI3Rlc3RUcmFuc2FjdGlvbkFuZFdhbEludGVycGxheTIoKX0gZXhjZXB0IHRoZSBmb2xsb3dpbmc6CisgICAgICogaW5zdGVhZCBvZiBjb21taXR0aW5nIHRoZSBkYXRhLCBkbyByb2xsYmFjayBhbmQgbWFrZSBzdXJlIHRoZSBkYXRhIHNlZW4gYnkgdGhlIHF1ZXJ5CisgICAgICogd2l0aGluIHRoZSB0cmFuc2FjdGlvbiBpcyBub3cgZ29uZS4KKyAgICAgKi8KKyAgICBAU21hbGxUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFRyYW5zYWN0aW9uQW5kV2FsSW50ZXJwbGF5MygpIHsKKyAgICAgICAgY3JlYXRlVGFibGVBbmRDbGVhckNhY2hlKCk7CisgICAgICAgIG1EYXRhYmFzZS5leGVjU1FMKCJJTlNFUlQgaW50byAiICsgVEVTVF9UQUJMRSArICIgdmFsdWVzKDEwLCA5OTkpOyIpOworICAgICAgICBTdHJpbmcgc3FsID0gInNlbGVjdCAqIGZyb20gIiArIFRFU1RfVEFCTEU7CisgICAgICAgIEN1cnNvciBjID0gbURhdGFiYXNlLnJhd1F1ZXJ5KHNxbCwgbnVsbCk7CisgICAgICAgIC8vIHNob3VsZCBoYXZlIDEgcm93IGluIHRoZSB0YWJsZQorICAgICAgICBhc3NlcnRFcXVhbHMoMSwgYy5nZXRDb3VudCgpKTsKKyAgICAgICAgbURhdGFiYXNlLmV4ZWNTUUwoIkJFR0lOIHRyYW5zYWN0aW9uIik7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBtRGF0YWJhc2UuZXhlY1NRTCgiSU5TRVJUIGludG8gIiArIFRFU1RfVEFCTEUgKyAiIHZhbHVlcygxMDAsIDk5MDkpOyIpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIERhdGFiYXNlVXRpbHMubG9uZ0ZvclF1ZXJ5KG1EYXRhYmFzZSwKKyAgICAgICAgICAgICAgICAgICAgInNlbGVjdCBjb3VudCgqKSBmcm9tICIgKyBURVNUX1RBQkxFLCBudWxsKSk7CisgICAgICAgICAgICAvLyByZXF1ZXJ5IG9uIHRoZSBwcmV2aW91c2x5IG9wZW5lZCBjdXJzb3IKKyAgICAgICAgICAgIC8vIGN1cnNvciBzaG91bGQgbm93IHVzZSB0aGUgbWFpbiBkYXRhYmFzZSBjb25uZWN0aW9uIGFuZCBzZWUgMiByb3dzCisgICAgICAgICAgICBjLnJlcXVlcnkoKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygyLCBjLmdldENvdW50KCkpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgLy8gcm9sbGJhY2sgdGhlIGNoYW5nZQorICAgICAgICAgICAgbURhdGFiYXNlLmV4ZWNTUUwoInJvbGxiYWNrOyIpOworICAgICAgICB9CisgICAgICAgIC8vIHNpbmNlIHRoZSBjaGFuZ2UgaXMgcm9sbGVkIGJhY2ssIGRvIHRoZSBzYW1lIHF1ZXJ5IGFnYWluIGFuZCBzaG91bGQgbm93IGZpbmQgb25seSAxIHJvdworICAgICAgICBjLnJlcXVlcnkoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIGMuZ2V0Q291bnQoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygxLCBEYXRhYmFzZVV0aWxzLmxvbmdGb3JRdWVyeShtRGF0YWJhc2UsCisgICAgICAgICAgICAgICAgInNlbGVjdCBjb3VudCgqKSBmcm9tICIgKyBURVNUX1RBQkxFLCBudWxsKSk7CisgICAgICAgIGMuY2xvc2UoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBodHRwOi8vYi9pc3N1ZT9pZD0yOTQzMDI4CisgICAgICogU1FMaXRlT3BlbkhlbHBlciBtYWludGFpbnMgYSBTaW5nbGV0b24gZXZlbiBpZiBpdCBpcyBpbiBiYWQgc3RhdGUuCisgICAgICovCisgICAgQFNtYWxsVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RDbG9zZUFuZFJlb3BlbigpIHsKKyAgICAgICAgbURhdGFiYXNlLmNsb3NlKCk7CisgICAgICAgIFRlc3RPcGVuSGVscGVyIGhlbHBlciA9IG5ldyBUZXN0T3BlbkhlbHBlcihnZXRDb250ZXh0KCksIERCX05BTUUsIG51bGwsCisgICAgICAgICAgICAgICAgQ1VSUkVOVF9EQVRBQkFTRV9WRVJTSU9OLCBuZXcgRGVmYXVsdERhdGFiYXNlRXJyb3JIYW5kbGVyKCkpOworICAgICAgICBtRGF0YWJhc2UgPSBoZWxwZXIuZ2V0V3JpdGFibGVEYXRhYmFzZSgpOworICAgICAgICBjcmVhdGVUYWJsZUFuZENsZWFyQ2FjaGUoKTsKKyAgICAgICAgbURhdGFiYXNlLmV4ZWNTUUwoIklOU0VSVCBpbnRvICIgKyBURVNUX1RBQkxFICsgIiB2YWx1ZXMoMTAsIDk5OSk7Iik7CisgICAgICAgIEN1cnNvciBjID0gbURhdGFiYXNlLnF1ZXJ5KFRFU1RfVEFCTEUsIG5ldyBTdHJpbmdbXXsiaSIsICJqIn0sIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwpOworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgYy5nZXRDb3VudCgpKTsKKyAgICAgICAgYy5jbG9zZSgpOworICAgICAgICBtRGF0YWJhc2UuY2xvc2UoKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UobURhdGFiYXNlLmlzT3BlbigpKTsKKyAgICAgICAgbURhdGFiYXNlID0gaGVscGVyLmdldFJlYWRhYmxlRGF0YWJhc2UoKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShtRGF0YWJhc2UuaXNPcGVuKCkpOworICAgICAgICBjID0gbURhdGFiYXNlLnF1ZXJ5KFRFU1RfVEFCTEUsIG5ldyBTdHJpbmdbXXsiaSIsICJqIn0sIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwpOworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgYy5nZXRDb3VudCgpKTsKKyAgICAgICAgYy5jbG9zZSgpOworICAgIH0KKyAgICBwcml2YXRlIGNsYXNzIFRlc3RPcGVuSGVscGVyIGV4dGVuZHMgU1FMaXRlT3BlbkhlbHBlciB7CisgICAgICAgIHB1YmxpYyBUZXN0T3BlbkhlbHBlcihDb250ZXh0IGNvbnRleHQsIFN0cmluZyBuYW1lLCBDdXJzb3JGYWN0b3J5IGZhY3RvcnksIGludCB2ZXJzaW9uLAorICAgICAgICAgICAgICAgIERhdGFiYXNlRXJyb3JIYW5kbGVyIGVycm9ySGFuZGxlcikgeworICAgICAgICAgICAgc3VwZXIoY29udGV4dCwgbmFtZSwgZmFjdG9yeSwgdmVyc2lvbiwgZXJyb3JIYW5kbGVyKTsKKyAgICAgICAgfQorICAgICAgICBAT3ZlcnJpZGUgcHVibGljIHZvaWQgb25DcmVhdGUoU1FMaXRlRGF0YWJhc2UgZGIpIHt9CisgICAgICAgIEBPdmVycmlkZSBwdWJsaWMgdm9pZCBvblVwZ3JhZGUoU1FMaXRlRGF0YWJhc2UgZGIsIGludCBvbGRWZXJzaW9uLCBpbnQgbmV3VmVyc2lvbikge30KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9kYXRhYmFzZS9zcWxpdGUvU1FMaXRlR2VuZXJhbFRlc3QuamF2YSBiL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9TUUxpdGVHZW5lcmFsVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZjdjY2NlLi4wMDAwMDAwCi0tLSBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9TUUxpdGVHZW5lcmFsVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlOwotCi1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7Ci1pbXBvcnQgYW5kcm9pZC50ZXN0LkFuZHJvaWRUZXN0Q2FzZTsKLWltcG9ydCBhbmRyb2lkLnRlc3QuRmxha3lUZXN0OwotaW1wb3J0IGFuZHJvaWQudGVzdC5zdWl0ZWJ1aWxkZXIuYW5ub3RhdGlvbi5MYXJnZVRlc3Q7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci0KLXB1YmxpYyBjbGFzcyBTUUxpdGVHZW5lcmFsVGVzdCBleHRlbmRzIEFuZHJvaWRUZXN0Q2FzZSB7Ci0KLSAgICBwcml2YXRlIFNRTGl0ZURhdGFiYXNlIG1EYXRhYmFzZTsKLSAgICBwcml2YXRlIEZpbGUgbURhdGFiYXNlRmlsZTsKLSAgICBCb29sZWFuIGV4Y2VwdGlvblJlY3ZkID0gZmFsc2U7Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBzdXBlci5zZXRVcCgpOwotICAgICAgICBleGNlcHRpb25SZWN2ZCA9IGZhbHNlOwotICAgICAgICBGaWxlIGRiRGlyID0gZ2V0Q29udGV4dCgpLmdldERpcih0aGlzLmdldENsYXNzKCkuZ2V0TmFtZSgpLCBDb250ZXh0Lk1PREVfUFJJVkFURSk7Ci0gICAgICAgIG1EYXRhYmFzZUZpbGUgPSBuZXcgRmlsZShkYkRpciwgImRhdGFiYXNlX3Rlc3QuZGIiKTsKLSAgICAgICAgaWYgKG1EYXRhYmFzZUZpbGUuZXhpc3RzKCkpIHsKLSAgICAgICAgICAgIG1EYXRhYmFzZUZpbGUuZGVsZXRlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgbURhdGFiYXNlID0gU1FMaXRlRGF0YWJhc2Uub3Blbk9yQ3JlYXRlRGF0YWJhc2UobURhdGFiYXNlRmlsZS5nZXRQYXRoKCksIG51bGwpOwotICAgICAgICBhc3NlcnROb3ROdWxsKG1EYXRhYmFzZSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgbURhdGFiYXNlLmNsb3NlKCk7Ci0gICAgICAgIG1EYXRhYmFzZUZpbGUuZGVsZXRlKCk7Ci0gICAgICAgIHN1cGVyLnRlYXJEb3duKCk7Ci0gICAgfQotCi0gICAgQExhcmdlVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RVc2VPZlNhbWVTcWxTdGF0ZW1lbnRCeTJUaHJlYWRzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIG1EYXRhYmFzZS5leGVjU1FMKCJDUkVBVEUgVEFCTEUgdGVzdF9wc3RtdCAoaSBJTlRFR0VSIFBSSU1BUlkgS0VZLCBqIHRleHQpOyIpOwotCi0gICAgICAgIC8vIHRocmVhZCAxIGNyZWF0ZXMgYSBwcmVwYXJlZCBzdGF0ZW1lbnQKLSAgICAgICAgZmluYWwgU3RyaW5nIHN0bXQgPSAiU0VMRUNUICogRlJPTSB0ZXN0X3BzdG10IFdIRVJFIGkgPSA/IjsKLQotICAgICAgICAvLyBzdGFydCAyIHRocmVhZHMgdG8gZG8gcmVwZWF0ZWRseSBleGVjdXRlICJzdG10IgotICAgICAgICAvLyBzaW5jZSB0aGVzZSAyIHRocmVhZHMgYXJlIGV4ZWN1dGluZyB0aGUgc2FtZSBzcWwsIHRoZXkgZWFjaCBzaG91bGQgZ2V0Ci0gICAgICAgIC8vIHRoZWlyIG93biBjb3B5IGFuZAotICAgICAgICAvLyB0aGVyZSBTSE9VTEQgTk9UIGJlIGFuIGVycm9yIGZyb20gc3FsaXRlOiAicHJlcGFyZWQgc3RhdGVtZW50IGlzIGJ1c3kiCi0gICAgICAgIGNsYXNzIFJ1blN0bXRUaHJlYWQgZXh0ZW5kcyBUaHJlYWQgewotICAgICAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE4gPSAxMDAwOwotICAgICAgICAgICAgQE92ZXJyaWRlIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgICAgICAgICBpbnQgaSA9IDA7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgLy8gZXhlY3V0ZSBtYW55IHRpbWVzCi0gICAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBOOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFNRTGl0ZVN0YXRlbWVudCBzMSA9IG1EYXRhYmFzZS5jb21waWxlU3RhdGVtZW50KHN0bXQpOwotICAgICAgICAgICAgICAgICAgICAgICAgczEuYmluZExvbmcoMSwgaSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzMS5leGVjdXRlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzMS5jbG9zZSgpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoU1FMaXRlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgZmFpbCgiU1FMaXRlRXhjZXB0aW9uOiAiICsgZS5nZXRNZXNzYWdlKCkpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgICAgICAgICAgICAgZmFpbCgicmFuZG9tIHVuZXhwZWN0ZWQgZXhjZXB0aW9uOiAiICsgZS5nZXRNZXNzYWdlKCkpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIFJ1blN0bXRUaHJlYWQgdDEgPSBuZXcgUnVuU3RtdFRocmVhZCgpOwotICAgICAgICB0MS5zdGFydCgpOwotICAgICAgICBSdW5TdG10VGhyZWFkIHQyID0gbmV3IFJ1blN0bXRUaHJlYWQoKTsKLSAgICAgICAgdDIuc3RhcnQoKTsKLSAgICAgICAgd2hpbGUgKHQxLmlzQWxpdmUoKSB8fCB0Mi5pc0FsaXZlKCkpIHsKLSAgICAgICAgICAgIFRocmVhZC5zbGVlcCgxMDAwKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBGbGFreVRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0VXNlT2ZTYW1lUHJlcGFyZWRTdGF0ZW1lbnRCeTJUaHJlYWRzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIG1EYXRhYmFzZS5leGVjU1FMKCJDUkVBVEUgVEFCTEUgdGVzdF9wc3RtdCAoaSBJTlRFR0VSIFBSSU1BUlkgS0VZLCBqIHRleHQpOyIpOwotCi0gICAgICAgIC8vIHRocmVhZCAxIGNyZWF0ZXMgYSBwcmVwYXJlZCBzdGF0ZW1lbnQKLSAgICAgICAgZmluYWwgU3RyaW5nIHN0bXQgPSAiU0VMRUNUICogRlJPTSB0ZXN0X3BzdG10IFdIRVJFIGkgPSA/IjsKLSAgICAgICAgZmluYWwgU1FMaXRlU3RhdGVtZW50IHMxID0gbURhdGFiYXNlLmNvbXBpbGVTdGF0ZW1lbnQoc3RtdCk7Ci0KLSAgICAgICAgLy8gc3RhcnQgMiB0aHJlYWRzIHRvIGRvIHJlcGVhdGVkbHkgZXhlY3V0ZSAic3RtdCIKLSAgICAgICAgLy8gc2luY2UgdGhlc2UgMiB0aHJlYWRzIGFyZSBleGVjdXRpbmcgdGhlIHNhbWUgcHJlcGFyZWQgc3RhdGVtZW50LAotICAgICAgICAvLyBzaG91bGQgc2VlIGFuIGVycm9yIGZyb20gc3FsaXRlOiAicHJlcGFyZWQgc3RhdGVtZW50IGlzIGJ1c3kiCi0gICAgICAgIGNsYXNzIFJ1blN0bXRUaHJlYWQgZXh0ZW5kcyBUaHJlYWQgewotICAgICAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE4gPSAxMDAwOwotICAgICAgICAgICAgQE92ZXJyaWRlIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgICAgICAgICBpbnQgaSA9IDA7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgLy8gZXhlY3V0ZSBtYW55IHRpbWVzCi0gICAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBOOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHMxLmJpbmRMb25nKDEsIGkpOwotICAgICAgICAgICAgICAgICAgICAgICAgczEuZXhlY3V0ZSgpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoU1FMaXRlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gZXhwZWN0IGl0Ci0gICAgICAgICAgICAgICAgICAgIGFzc2VydFRydWUoZS5nZXRNZXNzYWdlKCkuY29udGFpbnMoImxpYnJhcnkgcm91dGluZSBjYWxsZWQgb3V0IG9mIHNlcXVlbmNlOiIpKTsKLSAgICAgICAgICAgICAgICAgICAgZXhjZXB0aW9uUmVjdmQgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgICAgICAgICAgICAgZmFpbCgicmFuZG9tIHVuZXhwZWN0ZWQgZXhjZXB0aW9uOiAiICsgZS5nZXRNZXNzYWdlKCkpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIFJ1blN0bXRUaHJlYWQgdDEgPSBuZXcgUnVuU3RtdFRocmVhZCgpOwotICAgICAgICB0MS5zdGFydCgpOwotICAgICAgICBSdW5TdG10VGhyZWFkIHQyID0gbmV3IFJ1blN0bXRUaHJlYWQoKTsKLSAgICAgICAgdDIuc3RhcnQoKTsKLSAgICAgICAgd2hpbGUgKHQxLmlzQWxpdmUoKSB8fCB0Mi5pc0FsaXZlKCkpIHsKLSAgICAgICAgICAgIFRocmVhZC5zbGVlcCgxMDAwKTsKLSAgICAgICAgfQotICAgICAgICBhc3NlcnRUcnVlKGV4Y2VwdGlvblJlY3ZkKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9kYXRhYmFzZS9zcWxpdGUvU1FMaXRlU3RhdGVtZW50VGVzdC5qYXZhIGIvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvZGF0YWJhc2Uvc3FsaXRlL1NRTGl0ZVN0YXRlbWVudFRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMTc1NDVmCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvZGF0YWJhc2Uvc3FsaXRlL1NRTGl0ZVN0YXRlbWVudFRlc3QuamF2YQpAQCAtMCwwICsxLDIxMyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGU7CisKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLnRlc3QuQW5kcm9pZFRlc3RDYXNlOworaW1wb3J0IGFuZHJvaWQudGVzdC5zdWl0ZWJ1aWxkZXIuYW5ub3RhdGlvbi5MYXJnZVRlc3Q7CitpbXBvcnQgYW5kcm9pZC50ZXN0LnN1aXRlYnVpbGRlci5hbm5vdGF0aW9uLlNtYWxsVGVzdDsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLnV0aWwuUmFuZG9tOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LmxvY2tzLlJlZW50cmFudExvY2s7CisKK3B1YmxpYyBjbGFzcyBTUUxpdGVTdGF0ZW1lbnRUZXN0IGV4dGVuZHMgQW5kcm9pZFRlc3RDYXNlIHsKKyAgICBwcml2YXRlIFNRTGl0ZURhdGFiYXNlIG1EYXRhYmFzZTsKKyAgICBwcml2YXRlIEZpbGUgbURhdGFiYXNlRmlsZTsKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHN1cGVyLnNldFVwKCk7CisKKyAgICAgICAgRmlsZSBkYkRpciA9IGdldENvbnRleHQoKS5nZXREaXIodGhpcy5nZXRDbGFzcygpLmdldE5hbWUoKSwgQ29udGV4dC5NT0RFX1BSSVZBVEUpOworICAgICAgICBtRGF0YWJhc2VGaWxlID0gbmV3IEZpbGUoZGJEaXIsICJkYXRhYmFzZV90ZXN0LmRiIik7CisgICAgICAgIGlmIChtRGF0YWJhc2VGaWxlLmV4aXN0cygpKSB7CisgICAgICAgICAgICBtRGF0YWJhc2VGaWxlLmRlbGV0ZSgpOworICAgICAgICB9CisgICAgICAgIG1EYXRhYmFzZSA9IFNRTGl0ZURhdGFiYXNlLm9wZW5PckNyZWF0ZURhdGFiYXNlKG1EYXRhYmFzZUZpbGUuZ2V0UGF0aCgpLCBudWxsKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChtRGF0YWJhc2UpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIG1EYXRhYmFzZS5jbG9zZSgpOworICAgICAgICBtRGF0YWJhc2VGaWxlLmRlbGV0ZSgpOworICAgICAgICBzdXBlci50ZWFyRG93bigpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFN0YXJ0IDIgdGhyZWFkcyB0byByZXBlYXRlZGx5IGV4ZWN1dGUgdGhlIGFib3ZlIFNRTCBzdGF0ZW1lbnQuCisgICAgICogRXZlbiB0aG91Z2ggMiB0aHJlYWRzIGFyZSBleGVjdXRpbmcgdGhlIHNhbWUgU1FMLCB0aGV5IGVhY2ggc2hvdWxkIGdldCB0aGVpciBvd24gY29weSBvZgorICAgICAqIHByZXBhcmVkIFNRTCBzdGF0ZW1lbnQgaWQgYW5kIHRoZXJlIFNIT1VMRCBOT1QgYmUgYW4gZXJyb3IgZnJvbSBzcWxpdGUgb3IgYW5kcm9pZC4KKyAgICAgKiBAdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHRocm93biBpZiB0aGUgdGVzdCB0aHJlYWRzIHN0YXJ0ZWQgYnkgdGhpcyB0ZXN0IGFyZSBpbnRlcnJ1cHRlZAorICAgICAqLworICAgIEBMYXJnZVRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VXNlT2ZTYW1lU3FsU3RhdGVtZW50QnkyVGhyZWFkcygpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgICAgIG1EYXRhYmFzZS5leGVjU1FMKCJDUkVBVEUgVEFCTEUgdGVzdF9wc3RtdCAoaSBJTlRFR0VSIFBSSU1BUlkgS0VZLCBqIHRleHQpOyIpOworICAgICAgICBmaW5hbCBTdHJpbmcgc3RtdCA9ICJTRUxFQ1QgKiBGUk9NIHRlc3RfcHN0bXQgV0hFUkUgaSA9ID8iOworICAgICAgICBjbGFzcyBSdW5TdG10VGhyZWFkIGV4dGVuZHMgVGhyZWFkIHsKKyAgICAgICAgICAgIEBPdmVycmlkZSBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgLy8gZG8gaXQgZW5vdWdoIHRpbWVzIHRvIG1ha2Ugc3VyZSB0aGVyZSBhcmUgbm8gY29ybmVyIGNhc2VzIGdvaW5nIHVudGVzdGVkCisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAxMDAwOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgU1FMaXRlU3RhdGVtZW50IHMxID0gbURhdGFiYXNlLmNvbXBpbGVTdGF0ZW1lbnQoc3RtdCk7CisgICAgICAgICAgICAgICAgICAgIHMxLmJpbmRMb25nKDEsIGkpOworICAgICAgICAgICAgICAgICAgICBzMS5leGVjdXRlKCk7CisgICAgICAgICAgICAgICAgICAgIHMxLmNsb3NlKCk7CisgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBSdW5TdG10VGhyZWFkIHQxID0gbmV3IFJ1blN0bXRUaHJlYWQoKTsKKyAgICAgICAgdDEuc3RhcnQoKTsKKyAgICAgICAgUnVuU3RtdFRocmVhZCB0MiA9IG5ldyBSdW5TdG10VGhyZWFkKCk7CisgICAgICAgIHQyLnN0YXJ0KCk7CisgICAgICAgICB3aGlsZSAodDEuaXNBbGl2ZSgpIHx8IHQyLmlzQWxpdmUoKSkgeworICAgICAgICAgICAgIFRocmVhZC5zbGVlcCgxMCk7CisgICAgICAgICB9CisgICAgIH0KKworICAgIC8qKgorICAgICAqIEEgc2ltcGxlIHRlc3Q6IHN0YXJ0IDIgdGhyZWFkcyB0byByZXBlYXRlZGx5IGV4ZWN1dGUgdGhlIHNhbWUge0BsaW5rIFNRTGl0ZVN0YXRlbWVudH0uCisgICAgICogVGhlIDIgdGhyZWFkcyB0YWtlIHR1cm5zIHRvIHVzZSB0aGUge0BsaW5rIFNRTGl0ZVN0YXRlbWVudH07IGkuZS4sIGl0IGlzIE5PVCBpbiB1c2UKKyAgICAgKiBieSBib3RoIHRoZSB0aHJlYWRzIGF0IHRoZSBzYW1lIHRpbWUuCisgICAgICoKKyAgICAgKiBAdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHRocm93biBpZiB0aGUgdGVzdCB0aHJlYWRzIHN0YXJ0ZWQgYnkgdGhpcyB0ZXN0IGFyZSBpbnRlcnJ1cHRlZAorICAgICAqLworICAgIEBMYXJnZVRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VXNlT2ZTYW1lU3FsaXRlU3RhdGVtZW50QnkyVGhyZWFkcygpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgICAgIG1EYXRhYmFzZS5leGVjU1FMKCJDUkVBVEUgVEFCTEUgdGVzdF9wc3RtdCAoaSBJTlRFR0VSIFBSSU1BUlkgS0VZLCBqIHRleHQpOyIpOworICAgICAgICBmaW5hbCBTdHJpbmcgc3RtdCA9ICJTRUxFQ1QgKiBGUk9NIHRlc3RfcHN0bXQgV0hFUkUgaSA9ID8iOworICAgICAgICBmaW5hbCBTUUxpdGVTdGF0ZW1lbnQgczEgPSBtRGF0YWJhc2UuY29tcGlsZVN0YXRlbWVudChzdG10KTsKKyAgICAgICAgY2xhc3MgUnVuU3RtdFRocmVhZCBleHRlbmRzIFRocmVhZCB7CisgICAgICAgICAgICBAT3ZlcnJpZGUgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgIC8vIGRvIGl0IGVub3VnaCB0aW1lcyB0byBtYWtlIHN1cmUgdGhlcmUgYXJlIG5vIGNvcm5lciBjYXNlcyBnb2luZyB1bnRlc3RlZAorICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMTAwMDsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIGxvY2soKTsKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHMxLmJpbmRMb25nKDEsIGkpOworICAgICAgICAgICAgICAgICAgICAgICAgczEuZXhlY3V0ZSgpOworICAgICAgICAgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgICAgICAgICAgdW5sb2NrKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgVGhyZWFkLnlpZWxkKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIFJ1blN0bXRUaHJlYWQgdDEgPSBuZXcgUnVuU3RtdFRocmVhZCgpOworICAgICAgICB0MS5zdGFydCgpOworICAgICAgICBSdW5TdG10VGhyZWFkIHQyID0gbmV3IFJ1blN0bXRUaHJlYWQoKTsKKyAgICAgICAgdDIuc3RhcnQoKTsKKyAgICAgICAgd2hpbGUgKHQxLmlzQWxpdmUoKSB8fCB0Mi5pc0FsaXZlKCkpIHsKKyAgICAgICAgICAgIFRocmVhZC5zbGVlcCgxMCk7CisgICAgICAgIH0KKyAgICB9CisgICAgLyoqIFN5bmNocm9uaXplIG9uIHRoaXMgd2hlbiBhY2Nlc3NpbmcgdGhlIFNxbGl0ZVN0YXRlbWV0IGluIHRoZSBhYm92ZSAqLworICAgIHByaXZhdGUgZmluYWwgUmVlbnRyYW50TG9jayBtTG9jayA9IG5ldyBSZWVudHJhbnRMb2NrKHRydWUpOworICAgIHByaXZhdGUgdm9pZCBsb2NrKCkgeworICAgICAgICBtTG9jay5sb2NrKCk7CisgICAgfQorICAgIHByaXZhdGUgdm9pZCB1bmxvY2soKSB7CisgICAgICAgIG1Mb2NrLnVubG9jaygpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3RzIHRoZSBmb2xsb3dpbmc6IGEge0BsaW5rIFNRTGl0ZVN0YXRlbWVudH0gb2JqZWN0IHNob3VsZCBub3QgcmVmZXIgdG8gYQorICAgICAqIHByZS1jb21waWxlZCBTUUwgc3RhdGVtZW50IGlkIGV4Y2VwdCBpbiBkdXJpbmcgdGhlIHBlcmlvZCBvZiBiaW5kaW5nIHRoZSBhcmd1bWVudHMKKyAgICAgKiBhbmQgZXhlY3V0aW5nIHRoZSBTUUwgc3RhdGVtZW50LgorICAgICAqLworICAgIEBTbWFsbFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVmZXJlbmNlVG9QcmVjb21waWxlZFN0YXRlbWVudElkKCkgeworICAgICAgICBtRGF0YWJhc2UuZXhlY1NRTCgiY3JlYXRlIHRhYmxlIHQgKGkgaW50LCBqIHRleHQpOyIpOworICAgICAgICB2ZXJpZnlSZWZlcmVuY2VUb1ByZWNvbXBpbGVkU3RhdGVtZW50SWQoZmFsc2UpOworICAgICAgICB2ZXJpZnlSZWZlcmVuY2VUb1ByZWNvbXBpbGVkU3RhdGVtZW50SWQodHJ1ZSk7CisKKyAgICAgICAgLy8gYSBzbWFsbCBzdHJlc3MgdGVzdCB0byBtYWtlIHN1cmUgdGhlcmUgYXJlIG5vIHNpZGUgZWZmZWN0cyBvZgorICAgICAgICAvLyB0aGUgYWNxdWlyZSAmIHJlbGVhc2Ugb2YgcHJlLWNvbXBpbGVkIHN0YXRlbWVudCBpZCBieSBTUUxpdGVTdGF0ZW1lbnQgb2JqZWN0LgorICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDEwMDsgaSsrKSB7CisgICAgICAgICAgICB2ZXJpZnlSZWZlcmVuY2VUb1ByZWNvbXBpbGVkU3RhdGVtZW50SWQoZmFsc2UpOworICAgICAgICAgICAgdmVyaWZ5UmVmZXJlbmNlVG9QcmVjb21waWxlZFN0YXRlbWVudElkKHRydWUpOworICAgICAgICB9CisgICAgfQorCisgICAgQFN1cHByZXNzV2FybmluZ3MoImRlcHJlY2F0aW9uIikKKyAgICBwcml2YXRlIHZvaWQgdmVyaWZ5UmVmZXJlbmNlVG9QcmVjb21waWxlZFN0YXRlbWVudElkKGJvb2xlYW4gd2FsKSB7CisgICAgICAgIGlmICh3YWwpIHsKKyAgICAgICAgICAgIG1EYXRhYmFzZS5lbmFibGVXcml0ZUFoZWFkTG9nZ2luZygpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbURhdGFiYXNlLmRpc2FibGVXcml0ZUFoZWFkTG9nZ2luZygpOworICAgICAgICB9CisgICAgICAgIC8vIHRlc3Qgd2l0aCBJTlNFUlQgc3RhdGVtZW50IC0gZG9lc24ndCB1c2UgY29ubmVjdGlvbiBwb29sLCBpZiBXQUwgaXMgc2V0CisgICAgICAgIFNRTGl0ZVN0YXRlbWVudCBzdG10ID0gbURhdGFiYXNlLmNvbXBpbGVTdGF0ZW1lbnQoImluc2VydCBpbnRvIHQgdmFsdWVzKD8sPyk7Iik7CisgICAgICAgIGFzc2VydEVxdWFscyhtRGF0YWJhc2UubU5hdGl2ZUhhbmRsZSwgc3RtdC5uSGFuZGxlKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKG1EYXRhYmFzZSwgc3RtdC5tRGF0YWJhc2UpOworICAgICAgICAvLyBzcWwgc3RhdGVtZW50IHNob3VsZCBub3QgYmUgY29tcGlsZWQgeWV0CisgICAgICAgIGFzc2VydEVxdWFscygwLCBzdG10Lm5TdGF0ZW1lbnQpOworICAgICAgICBhc3NlcnRFcXVhbHMoMCwgc3RtdC5nZXRTcWxTdGF0ZW1lbnRJZCgpKTsKKyAgICAgICAgaW50IGNvbFZhbHVlID0gbmV3IFJhbmRvbSgpLm5leHRJbnQoKTsKKyAgICAgICAgc3RtdC5iaW5kTG9uZygxLCBjb2xWYWx1ZSk7CisgICAgICAgIC8vIHZlcmlmeSB0aGF0IHRoZSBzcWwgc3RhdGVtZW50IGlzIHN0aWxsIG5vdCBjb21waWxlZAorICAgICAgICBhc3NlcnRFcXVhbHMoMCwgc3RtdC5nZXRTcWxTdGF0ZW1lbnRJZCgpKTsKKyAgICAgICAgLy8gc2hvdWxkIHN0aWxsIGJlIHVzaW5nIHRoZSBtRGF0YWJhc2UgY29ubmVjdGlvbiAtIHZlcmlmeQorICAgICAgICBhc3NlcnRFcXVhbHMobURhdGFiYXNlLm1OYXRpdmVIYW5kbGUsIHN0bXQubkhhbmRsZSk7CisgICAgICAgIGFzc2VydEVxdWFscyhtRGF0YWJhc2UsIHN0bXQubURhdGFiYXNlKTsKKyAgICAgICAgc3RtdC5iaW5kU3RyaW5nKDIsICJibGFoIiArIGNvbFZhbHVlKTsKKyAgICAgICAgLy8gdmVyaWZ5IHRoYXQgdGhlIHNxbCBzdGF0ZW1lbnQgaXMgc3RpbGwgbm90IGNvbXBpbGVkCisgICAgICAgIGFzc2VydEVxdWFscygwLCBzdG10LmdldFNxbFN0YXRlbWVudElkKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMobURhdGFiYXNlLm1OYXRpdmVIYW5kbGUsIHN0bXQubkhhbmRsZSk7CisgICAgICAgIGFzc2VydEVxdWFscyhtRGF0YWJhc2UsIHN0bXQubURhdGFiYXNlKTsKKyAgICAgICAgc3RtdC5leGVjdXRlSW5zZXJ0KCk7CisgICAgICAgIC8vIG5vdyB0aGF0IHRoZSBzdGF0ZW1lbnQgaXMgZXhlY3V0ZWQsIHByZS1jb21waWxlZCBzdGF0ZW1lbnQgc2hvdWxkIGJlIHJlbGVhc2VkCisgICAgICAgIGFzc2VydEVxdWFscygwLCBzdG10Lm5TdGF0ZW1lbnQpOworICAgICAgICBhc3NlcnRFcXVhbHMoMCwgc3RtdC5nZXRTcWxTdGF0ZW1lbnRJZCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKG1EYXRhYmFzZS5tTmF0aXZlSGFuZGxlLCBzdG10Lm5IYW5kbGUpOworICAgICAgICBhc3NlcnRFcXVhbHMobURhdGFiYXNlLCBzdG10Lm1EYXRhYmFzZSk7CisgICAgICAgIHN0bXQuY2xvc2UoKTsKKyAgICAgICAgLy8gcHJlLWNvbXBpbGVkIFNRTCBzdGF0ZW1lbnQgc2hvdWxkIHN0aWxsIHJlbWFpbiByZWxlYXNlZCBmcm9tIHRoaXMgb2JqZWN0CisgICAgICAgIGFzc2VydEVxdWFscygwLCBzdG10Lm5TdGF0ZW1lbnQpOworICAgICAgICBhc3NlcnRFcXVhbHMoMCwgc3RtdC5nZXRTcWxTdGF0ZW1lbnRJZCgpKTsKKyAgICAgICAgLy8gYnV0IHRoZSBkYXRhYmFzZSBoYW5kbGUgc2hvdWxkIHN0aWxsIGJlIHRoZSBzYW1lCisgICAgICAgIGFzc2VydEVxdWFscyhtRGF0YWJhc2UsIHN0bXQubURhdGFiYXNlKTsKKworICAgICAgICAvLyB0ZXN0IHdpdGggYSBTRUxFQ1Qgc3RhdGVtZW50IC0gdXNlcyBjb25uZWN0aW9uIHBvb2wgaWYgV0FMIGlzIHNldAorICAgICAgICBzdG10ID0gbURhdGFiYXNlLmNvbXBpbGVTdGF0ZW1lbnQoInNlbGVjdCBpIGZyb20gdCB3aGVyZSBqPT87Iik7CisgICAgICAgIC8vIHNxbCBzdGF0ZW1lbnQgc2hvdWxkIG5vdCBiZSBjb21waWxlZCB5ZXQKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIHN0bXQublN0YXRlbWVudCk7CisgICAgICAgIGFzc2VydEVxdWFscygwLCBzdG10LmdldFNxbFN0YXRlbWVudElkKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMobURhdGFiYXNlLm1OYXRpdmVIYW5kbGUsIHN0bXQubkhhbmRsZSk7CisgICAgICAgIGFzc2VydEVxdWFscyhtRGF0YWJhc2UsIHN0bXQubURhdGFiYXNlKTsKKyAgICAgICAgc3RtdC5iaW5kU3RyaW5nKDEsICJibGFoIiArIGNvbFZhbHVlKTsKKyAgICAgICAgLy8gdmVyaWZ5IHRoYXQgdGhlIHNxbCBzdGF0ZW1lbnQgaXMgc3RpbGwgbm90IGNvbXBpbGVkCisgICAgICAgIGFzc2VydEVxdWFscygwLCBzdG10Lm5TdGF0ZW1lbnQpOworICAgICAgICBhc3NlcnRFcXVhbHMoMCwgc3RtdC5nZXRTcWxTdGF0ZW1lbnRJZCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKG1EYXRhYmFzZS5tTmF0aXZlSGFuZGxlLCBzdG10Lm5IYW5kbGUpOworICAgICAgICBhc3NlcnRFcXVhbHMobURhdGFiYXNlLCBzdG10Lm1EYXRhYmFzZSk7CisgICAgICAgIC8vIGV4ZWN1dGUgdGhlIHN0YXRlbWVudAorICAgICAgICBMb25nIGwgPSBzdG10LnNpbXBsZVF1ZXJ5Rm9yTG9uZygpOworICAgICAgICBhc3NlcnRFcXVhbHMoY29sVmFsdWUsIGwuaW50VmFsdWUoKSk7CisgICAgICAgIC8vIG5vdyB0aGF0IHRoZSBzdGF0ZW1lbnQgaXMgZXhlY3V0ZWQsIHByZS1jb21waWxlZCBzdGF0ZW1lbnQgc2hvdWxkIGJlIHJlbGVhc2VkCisgICAgICAgIGFzc2VydEVxdWFscygwLCBzdG10Lm5TdGF0ZW1lbnQpOworICAgICAgICBhc3NlcnRFcXVhbHMoMCwgc3RtdC5nZXRTcWxTdGF0ZW1lbnRJZCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKG1EYXRhYmFzZS5tTmF0aXZlSGFuZGxlLCBzdG10Lm5IYW5kbGUpOworICAgICAgICBhc3NlcnRFcXVhbHMobURhdGFiYXNlLCBzdG10Lm1EYXRhYmFzZSk7CisgICAgICAgIHN0bXQuY2xvc2UoKTsKKyAgICAgICAgLy8gcHJlLWNvbXBpbGVkIFNRTCBzdGF0ZW1lbnQgc2hvdWxkIHN0aWxsIHJlbWFpbiByZWxlYXNlZCBmcm9tIHRoaXMgb2JqZWN0CisgICAgICAgIGFzc2VydEVxdWFscygwLCBzdG10Lm5TdGF0ZW1lbnQpOworICAgICAgICBhc3NlcnRFcXVhbHMoMCwgc3RtdC5nZXRTcWxTdGF0ZW1lbnRJZCgpKTsKKyAgICAgICAgLy8gYnV0IHRoZSBkYXRhYmFzZSBoYW5kbGUgc2hvdWxkIHN0aWxsIHJlbWFpbiBhdHRhY2hlZCB0byB0aGUgc3RhdGVtZW50CisgICAgICAgIGFzc2VydEVxdWFscyhtRGF0YWJhc2UubU5hdGl2ZUhhbmRsZSwgc3RtdC5uSGFuZGxlKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKG1EYXRhYmFzZSwgc3RtdC5tRGF0YWJhc2UpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9TUUxpdGVVbmZpbmFsaXplZEV4Y2VwdGlvblRlc3QuamF2YSBiL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9TUUxpdGVVbmZpbmFsaXplZEV4Y2VwdGlvblRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZDIwMDVkCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvZGF0YWJhc2Uvc3FsaXRlL1NRTGl0ZVVuZmluYWxpemVkRXhjZXB0aW9uVGVzdC5qYXZhCkBAIC0wLDAgKzEsODEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlOworCitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGUuU1FMaXRlRGF0YWJhc2VUZXN0LkNsYXNzVG9UZXN0U3FsQ29tcGlsYXRpb25BbmRDYWNoaW5nOworaW1wb3J0IGFuZHJvaWQudGVzdC5BbmRyb2lkVGVzdENhc2U7CitpbXBvcnQgYW5kcm9pZC50ZXN0LnN1aXRlYnVpbGRlci5hbm5vdGF0aW9uLlNtYWxsVGVzdDsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKKworcHVibGljIGNsYXNzIFNRTGl0ZVVuZmluYWxpemVkRXhjZXB0aW9uVGVzdCBleHRlbmRzIEFuZHJvaWRUZXN0Q2FzZSB7CisgICAgcHJpdmF0ZSBTUUxpdGVEYXRhYmFzZSBtRGF0YWJhc2U7CisgICAgcHJpdmF0ZSBGaWxlIG1EYXRhYmFzZUZpbGU7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBQkxFX05BTUUgPSAidGVzdEN1cnNvciI7CisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgc3VwZXIuc2V0VXAoKTsKKworICAgICAgICBGaWxlIGRiRGlyID0gZ2V0Q29udGV4dCgpLmdldERpcih0aGlzLmdldENsYXNzKCkuZ2V0TmFtZSgpLCBDb250ZXh0Lk1PREVfUFJJVkFURSk7CisgICAgICAgIG1EYXRhYmFzZUZpbGUgPSBuZXcgRmlsZShkYkRpciwgIlVuZmluYWxpemVkRXhjZXB0aW9uVGVzdC5kYiIpOworICAgICAgICBpZiAobURhdGFiYXNlRmlsZS5leGlzdHMoKSkgeworICAgICAgICAgICAgbURhdGFiYXNlRmlsZS5kZWxldGUoKTsKKyAgICAgICAgfQorICAgICAgICBtRGF0YWJhc2UgPSBTUUxpdGVEYXRhYmFzZS5vcGVuT3JDcmVhdGVEYXRhYmFzZShtRGF0YWJhc2VGaWxlLmdldFBhdGgoKSwgbnVsbCk7CisgICAgICAgIGFzc2VydE5vdE51bGwobURhdGFiYXNlKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBtRGF0YWJhc2UuY2xvc2UoKTsKKyAgICAgICAgbURhdGFiYXNlRmlsZS5kZWxldGUoKTsKKyAgICAgICAgc3VwZXIudGVhckRvd24oKTsKKyAgICB9CisKKyAgICBAU21hbGxUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFVuZmluYWxpemVkRXhjZXB0aW9uTm90RXhjcGVjdGVkKCkgeworICAgICAgICBtRGF0YWJhc2UuZXhlY1NRTCgiQ1JFQVRFIFRBQkxFICIgKyBUQUJMRV9OQU1FICsgIiAoaSBpbnQsIGogaW50KTsiKTsKKyAgICAgICAgLy8gdGhlIGFib3ZlIHN0YXRlbWVudCBzaG91bGQgYmUgaW4gU1FMaXRlRGF0YWJhc2UubVByb2dyYW1zCisgICAgICAgIC8vIGFuZCBzaG91bGQgYXV0b21hdGljYWxseSBiZSBmaW5hbGl6ZWQgd2hlbiBkYXRhYmFzZSBpcyBjbG9zZWQKKyAgICAgICAgbURhdGFiYXNlLmxvY2soKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG1EYXRhYmFzZS5jbG9zZURhdGFiYXNlKCk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBtRGF0YWJhc2UudW5sb2NrKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAU21hbGxUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFVuZmluYWxpemVkRXhjZXB0aW9uKCkgeworICAgICAgICBtRGF0YWJhc2UuZXhlY1NRTCgiQ1JFQVRFIFRBQkxFICIgKyBUQUJMRV9OQU1FICsgIiAoaSBpbnQsIGogaW50KTsiKTsKKyAgICAgICAgbURhdGFiYXNlLmxvY2soKTsKKyAgICAgICAgbURhdGFiYXNlLmNsb3NlUGVuZGluZ1N0YXRlbWVudHMoKTsgLy8gY2xlYXJzIHRoZSBhYm92ZSBmcm9tIGZpbmFsaXplciBxdWV1ZSBpbiBtZGF0YWJhc2UKKyAgICAgICAgbURhdGFiYXNlLnVubG9jaygpOworICAgICAgICBDbGFzc1RvVGVzdFNxbENvbXBpbGF0aW9uQW5kQ2FjaGluZy5jcmVhdGUobURhdGFiYXNlLCAic2VsZWN0ICogZnJvbSAiICArIFRBQkxFX05BTUUpOworICAgICAgICAvLyBzaW5jZSB0aGUgYWJvdmUgaXMgTk9UIGNsb3NlZCwgY2xvc2luZyBkYXRhYmFzZSBzaG91bGQgZmFpbAorICAgICAgICBtRGF0YWJhc2UubG9jaygpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgbURhdGFiYXNlLmNsb3NlRGF0YWJhc2UoKTsKKyAgICAgICAgICAgIGZhaWwoImV4Y2VwdGlvbiBleHBlY3RlZCIpOworICAgICAgICB9IGNhdGNoIChTUUxpdGVVbmZpbmFsaXplZE9iamVjdHNFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgLy8gZXhwZWN0ZWQKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIG1EYXRhYmFzZS51bmxvY2soKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL25ldC9VcmlUZXN0LmphdmEgYi9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9uZXQvVXJpVGVzdC5qYXZhCmluZGV4IGE1ZmRhMjAuLmM4YWQ2MGQgMTAwNjQ0Ci0tLSBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL25ldC9VcmlUZXN0LmphdmEKKysrIGIvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvbmV0L1VyaVRlc3QuamF2YQpAQCAtMjQsNiArMjQsOSBAQAogCiBpbXBvcnQgamF2YS5pby5GaWxlOwogaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5TZXQ7CiAKIHB1YmxpYyBjbGFzcyBVcmlUZXN0IGV4dGVuZHMgVGVzdENhc2UgewogCkBAIC01MiwyMCArNTUsMjAgQEAKIAogICAgIHByaXZhdGUgdm9pZCBwYXJjZWxBbmRVbnBhcmNlbChVcmkgdSkgewogICAgICAgICBQYXJjZWwgcCA9IFBhcmNlbC5vYnRhaW4oKTsKLQl0cnkgewotCQlVcmkud3JpdGVUb1BhcmNlbChwLCB1KTsKLQkJcC5zZXREYXRhUG9zaXRpb24oMCk7Ci0JCWFzc2VydEVxdWFscyh1LCBVcmkuQ1JFQVRPUi5jcmVhdGVGcm9tUGFyY2VsKHApKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIFVyaS53cml0ZVRvUGFyY2VsKHAsIHUpOworICAgICAgICAgICAgcC5zZXREYXRhUG9zaXRpb24oMCk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHModSwgVXJpLkNSRUFUT1IuY3JlYXRlRnJvbVBhcmNlbChwKSk7CiAKLQkJcC5zZXREYXRhUG9zaXRpb24oMCk7Ci0JCXUgPSB1LmJ1aWxkVXBvbigpLmJ1aWxkKCk7ICAgICAgICAKLQkJVXJpLndyaXRlVG9QYXJjZWwocCwgdSk7Ci0JCXAuc2V0RGF0YVBvc2l0aW9uKDApOwotCQlhc3NlcnRFcXVhbHModSwgVXJpLkNSRUFUT1IuY3JlYXRlRnJvbVBhcmNlbChwKSk7Ci0JfQotCWZpbmFsbHkgewotCQlwLnJlY3ljbGUoKTsKLQl9CisgICAgICAgICAgICBwLnNldERhdGFQb3NpdGlvbigwKTsKKyAgICAgICAgICAgIHUgPSB1LmJ1aWxkVXBvbigpLmJ1aWxkKCk7CisgICAgICAgICAgICBVcmkud3JpdGVUb1BhcmNlbChwLCB1KTsKKyAgICAgICAgICAgIHAuc2V0RGF0YVBvc2l0aW9uKDApOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHUsIFVyaS5DUkVBVE9SLmNyZWF0ZUZyb21QYXJjZWwocCkpOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICAgICAgcC5yZWN5Y2xlKCk7CisgICAgICAgIH0KICAgICB9CiAKICAgICBAU21hbGxUZXN0CkBAIC0yODIsNiArMjg1LDE0IEBACiAgICAgICAgIGFzc2VydEVxdWFscygiZCIsIHVyaS5nZXRRdWVyeVBhcmFtZXRlcigiYyIpKTsKICAgICB9CiAKKyAgICAvLyBodHRwOi8vYi8yMzM3MDQyCisgICAgQFNtYWxsVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RIb3N0V2l0aFRyYWlsaW5nRG90KCkgeworICAgICAgICBVcmkgdXJpID0gVXJpLnBhcnNlKCJodHRwOi8vZ29vZ2xlLmNvbS4vYi9jL2ciKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJnb29nbGUuY29tLiIsIHVyaS5nZXRIb3N0KCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIi9iL2MvZyIsIHVyaS5nZXRQYXRoKCkpOworICAgIH0KKwogICAgIEBTbWFsbFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0U2NoZW1lT25seSgpIHsKICAgICAgICAgVXJpIHVyaSA9IFVyaS5wYXJzZSgiZW1wdHk6Iik7CkBAIC02MDMsNCArNjE0LDEyMiBAQAogICAgICAgICBhc3NlcnRFcXVhbHMoIiIsIHVyaS5nZXRRdWVyeVBhcmFtZXRlcigiYiIpKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKCIiLCB1cmkuZ2V0UXVlcnlQYXJhbWV0ZXIoImMiKSk7CiAgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEdldFF1ZXJ5UGFyYW1ldGVyRW1wdHlLZXkoKSB7CisgICAgICAgIFVyaSB1cmkgPSBVcmkucGFyc2UoImh0dHA6Ly93d3cuZ29vZ2xlLmNvbS8/PWIiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJiIiwgdXJpLmdldFF1ZXJ5UGFyYW1ldGVyKCIiKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEdldFF1ZXJ5UGFyYW1ldGVyRW1wdHlLZXkyKCkgeworICAgICAgVXJpIHVyaSA9IFVyaS5wYXJzZSgiaHR0cDovL3d3dy5nb29nbGUuY29tLz9hPWImJmM9ZCIpOworICAgICAgYXNzZXJ0RXF1YWxzKCIiLCB1cmkuZ2V0UXVlcnlQYXJhbWV0ZXIoIiIpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0UXVlcnlQYXJhbWV0ZXJFbXB0eUtleTMoKSB7CisgICAgICBVcmkgdXJpID0gVXJpLnBhcnNlKCJodHRwOi8vd3d3Lmdvb2dsZS5jb20/Iik7CisgICAgICBhc3NlcnRFcXVhbHMoIiIsIHVyaS5nZXRRdWVyeVBhcmFtZXRlcigiIikpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRRdWVyeVBhcmFtZXRlckVtcHR5S2V5NCgpIHsKKyAgICAgIFVyaSB1cmkgPSBVcmkucGFyc2UoImh0dHA6Ly93d3cuZ29vZ2xlLmNvbT9hPWImIik7CisgICAgICBhc3NlcnRFcXVhbHMoIiIsIHVyaS5nZXRRdWVyeVBhcmFtZXRlcigiIikpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRRdWVyeVBhcmFtZXRlcnNFbXB0eUtleSgpIHsKKyAgICAgICAgVXJpIHVyaSA9IFVyaS5wYXJzZSgiaHR0cDovL3d3dy5nb29nbGUuY29tLz89YiYiKTsKKyAgICAgICAgTGlzdDxTdHJpbmc+IHZhbHVlcyA9IHVyaS5nZXRRdWVyeVBhcmFtZXRlcnMoIiIpOworICAgICAgICBhc3NlcnRFcXVhbHMoMiwgdmFsdWVzLnNpemUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiYiIsIHZhbHVlcy5nZXQoMCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIiIsIHZhbHVlcy5nZXQoMSkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRRdWVyeVBhcmFtZXRlcnNFbXB0eUtleTIoKSB7CisgICAgICAgIFVyaSB1cmkgPSBVcmkucGFyc2UoImh0dHA6Ly93d3cuZ29vZ2xlLmNvbT8iKTsKKyAgICAgICAgTGlzdDxTdHJpbmc+IHZhbHVlcyA9IHVyaS5nZXRRdWVyeVBhcmFtZXRlcnMoIiIpOworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgdmFsdWVzLnNpemUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiIiwgdmFsdWVzLmdldCgwKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEdldFF1ZXJ5UGFyYW1ldGVyc0VtcHR5S2V5MygpIHsKKyAgICAgIFVyaSB1cmkgPSBVcmkucGFyc2UoImh0dHA6Ly93d3cuZ29vZ2xlLmNvbS8/YT1iJiZjPWQiKTsKKyAgICAgIExpc3Q8U3RyaW5nPiB2YWx1ZXMgPSB1cmkuZ2V0UXVlcnlQYXJhbWV0ZXJzKCIiKTsKKyAgICAgIGFzc2VydEVxdWFscygxLCB2YWx1ZXMuc2l6ZSgpKTsKKyAgICAgIGFzc2VydEVxdWFscygiIiwgdmFsdWVzLmdldCgwKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEdldFF1ZXJ5UGFyYW1ldGVyTmFtZXMoKSB7CisgICAgICAgIFVyaSB1cmkgPSBVcmkucGFyc2UoImh0dHA6Ly90ZXN0P2E9MSIpOworICAgICAgICBTZXQ8U3RyaW5nPiBuYW1lcyA9IHVyaS5nZXRRdWVyeVBhcmFtZXRlck5hbWVzKCk7CisgICAgICAgIGFzc2VydEVxdWFscygxLCBuYW1lcy5zaXplKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImEiLCBuYW1lcy5pdGVyYXRvcigpLm5leHQoKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEdldFF1ZXJ5UGFyYW1ldGVyTmFtZXNFbXB0eUtleSgpIHsKKyAgICAgICAgVXJpIHVyaSA9IFVyaS5wYXJzZSgiaHR0cDovL3d3dy5nb29nbGUuY29tLz9hPXgmJmM9eiIpOworICAgICAgICBTZXQ8U3RyaW5nPiBuYW1lcyA9IHVyaS5nZXRRdWVyeVBhcmFtZXRlck5hbWVzKCk7CisgICAgICAgIEl0ZXJhdG9yPFN0cmluZz4gaXRlciA9IG5hbWVzLml0ZXJhdG9yKCk7CisgICAgICAgIGFzc2VydEVxdWFscygzLCBuYW1lcy5zaXplKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImEiLCBpdGVyLm5leHQoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiIiwgaXRlci5uZXh0KCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImMiLCBpdGVyLm5leHQoKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEdldFF1ZXJ5UGFyYW1ldGVyTmFtZXNFbXB0eUtleTIoKSB7CisgICAgICAgIFVyaSB1cmkgPSBVcmkucGFyc2UoImh0dHA6Ly93d3cuZ29vZ2xlLmNvbS8/YT14Jj1kJmM9eiIpOworICAgICAgICBTZXQ8U3RyaW5nPiBuYW1lcyA9IHVyaS5nZXRRdWVyeVBhcmFtZXRlck5hbWVzKCk7CisgICAgICAgIEl0ZXJhdG9yPFN0cmluZz4gaXRlciA9IG5hbWVzLml0ZXJhdG9yKCk7CisgICAgICAgIGFzc2VydEVxdWFscygzLCBuYW1lcy5zaXplKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImEiLCBpdGVyLm5leHQoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiIiwgaXRlci5uZXh0KCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImMiLCBpdGVyLm5leHQoKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEdldFF1ZXJ5UGFyYW1ldGVyTmFtZXNFbXB0eVZhbHVlcygpIHsKKyAgICAgICAgVXJpIHVyaSA9IFVyaS5wYXJzZSgiaHR0cDovL3d3dy5nb29nbGUuY29tLz9hPWZvbyZiPSZjPSIpOworICAgICAgICBTZXQ8U3RyaW5nPiBuYW1lcyA9IHVyaS5nZXRRdWVyeVBhcmFtZXRlck5hbWVzKCk7CisgICAgICAgIEl0ZXJhdG9yPFN0cmluZz4gaXRlciA9IG5hbWVzLml0ZXJhdG9yKCk7CisgICAgICAgIGFzc2VydEVxdWFscygzLCBuYW1lcy5zaXplKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImEiLCBpdGVyLm5leHQoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiYiIsIGl0ZXIubmV4dCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJjIiwgaXRlci5uZXh0KCkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRRdWVyeVBhcmFtZXRlck5hbWVzRWRnZUNhc2VzKCkgeworICAgICAgICBVcmkgdXJpID0gVXJpLnBhcnNlKCJodHRwOi8vZm9vP2E9YmFyJmI9YmFyJmM9JiZkPWJheiZlJmYmZz1idXp6JiYmYSZiPWJhciZoIik7CisgICAgICAgIFNldDxTdHJpbmc+IG5hbWVzID0gdXJpLmdldFF1ZXJ5UGFyYW1ldGVyTmFtZXMoKTsKKyAgICAgICAgSXRlcmF0b3I8U3RyaW5nPiBpdGVyID0gbmFtZXMuaXRlcmF0b3IoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDksIG5hbWVzLnNpemUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiYSIsIGl0ZXIubmV4dCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJiIiwgaXRlci5uZXh0KCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImMiLCBpdGVyLm5leHQoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiIiwgaXRlci5uZXh0KCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImQiLCBpdGVyLm5leHQoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiZSIsIGl0ZXIubmV4dCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJmIiwgaXRlci5uZXh0KCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImciLCBpdGVyLm5leHQoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiaCIsIGl0ZXIubmV4dCgpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0UXVlcnlQYXJhbWV0ZXJOYW1lc0VzY2FwZWRLZXlzKCkgeworICAgICAgICBVcmkgdXJpID0gVXJpLnBhcnNlKCJodHRwOi8vd3d3Lmdvb2dsZS5jb20vP2ElMjBiPWZvbyZjJTIwZD0iKTsKKyAgICAgICAgU2V0PFN0cmluZz4gbmFtZXMgPSB1cmkuZ2V0UXVlcnlQYXJhbWV0ZXJOYW1lcygpOworICAgICAgICBhc3NlcnRFcXVhbHMoMiwgbmFtZXMuc2l6ZSgpKTsKKyAgICAgICAgSXRlcmF0b3I8U3RyaW5nPiBpdGVyID0gbmFtZXMuaXRlcmF0b3IoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJhIGIiLCBpdGVyLm5leHQoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiYyBkIiwgaXRlci5uZXh0KCkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRRdWVyeVBhcmFtZXRlckVzY2FwZWRLZXlzKCkgeworICAgICAgICBVcmkgdXJpID0gVXJpLnBhcnNlKCJodHRwOi8vd3d3Lmdvb2dsZS5jb20vP2ElMjBiPWZvbyZjJTIwZD0iKTsKKyAgICAgICAgU3RyaW5nIHZhbHVlID0gdXJpLmdldFF1ZXJ5UGFyYW1ldGVyKCJhIGIiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJmb28iLCB2YWx1ZSk7CisgICAgfQorICAgIAorICAgIHB1YmxpYyB2b2lkIHRlc3RDbGVhclF1ZXJ5UGFyYW1ldGVycygpIHsKKyAgICAgICAgVXJpIHVyaSA9IFVyaS5wYXJzZSgiaHR0cDovL3d3dy5nb29nbGUuY29tLz9hPXgmYj15JmM9eiIpLmJ1aWxkVXBvbigpCisgICAgICAgICAgICAuY2xlYXJRdWVyeSgpLmFwcGVuZFF1ZXJ5UGFyYW1ldGVyKCJmb28iLCAiYmFyIikuYnVpbGQoKTsKKyAgICAgICAgU2V0PFN0cmluZz4gbmFtZXMgPSB1cmkuZ2V0UXVlcnlQYXJhbWV0ZXJOYW1lcygpOworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgbmFtZXMuc2l6ZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJmb28iLCBuYW1lcy5pdGVyYXRvcigpLm5leHQoKSk7CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvbmV0L1dlYkFkZHJlc3NUZXN0LmphdmEgYi9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9uZXQvV2ViQWRkcmVzc1Rlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMGFmMzVkCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvbmV0L1dlYkFkZHJlc3NUZXN0LmphdmEKQEAgLTAsMCArMSw0MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5uZXQ7CisKK2ltcG9ydCBhbmRyb2lkLm5ldC5XZWJBZGRyZXNzOworaW1wb3J0IGFuZHJvaWQudGVzdC5zdWl0ZWJ1aWxkZXIuYW5ub3RhdGlvbi5TbWFsbFRlc3Q7CitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworCitwdWJsaWMgY2xhc3MgV2ViQWRkcmVzc1Rlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CisKKyAgICAvLyBodHRwOi8vYi8yMzM3MDQyCisgICAgQFNtYWxsVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RIb3N0V2l0aFRyYWlsaW5nRG90KCkgeworICAgICAgICBXZWJBZGRyZXNzIHdlYkFkZHJlc3MgPSBuZXcgV2ViQWRkcmVzcygiaHR0cDovL2dvb2dsZS5jb20uL2IvYy9nIik7CisgICAgICAgIGFzc2VydEVxdWFscygiZ29vZ2xlLmNvbS4iLCB3ZWJBZGRyZXNzLm1Ib3N0KTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIvYi9jL2ciLCB3ZWJBZGRyZXNzLm1QYXRoKTsKKyAgICB9CisKKyAgICAvLyBodHRwOi8vYi8xMDExNjAyCisgICAgQFNtYWxsVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RQYXRoV2l0aG91dExlYWRpbmdTbGFzaCgpIHsKKyAgICAgICAgV2ViQWRkcmVzcyB3ZWJBZGRyZXNzID0gbmV3IFdlYkFkZHJlc3MoImh0dHA6Ly93d3cubXlzcGFjZS5jb20/c2k9MSIpOworICAgICAgICBhc3NlcnRFcXVhbHMoInd3dy5teXNwYWNlLmNvbSIsIHdlYkFkZHJlc3MubUhvc3QpOworICAgICAgICBhc3NlcnRFcXVhbHMoIi8/c2k9MSIsIHdlYkFkZHJlc3MubVBhdGgpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL29zL01lbW9yeUZpbGVUZXN0LmphdmEgYi9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9vcy9NZW1vcnlGaWxlVGVzdC5qYXZhCmluZGV4IDAwOWEwZTIuLmU2MjdiYjQgMTAwNjQ0Ci0tLSBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL29zL01lbW9yeUZpbGVUZXN0LmphdmEKKysrIGIvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvb3MvTWVtb3J5RmlsZVRlc3QuamF2YQpAQCAtMjM3LDUxICsyMzcsNiBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgQFNtYWxsVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RJc01lbW9yeUZpbGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgTWVtb3J5RmlsZSBmaWxlID0gbmV3IE1lbW9yeUZpbGUoIk1lbW9yeUZpbGVUZXN0IiwgMTAwMDAwMCk7Ci0gICAgICAgIEZpbGVEZXNjcmlwdG9yIGZkID0gZmlsZS5nZXRGaWxlRGVzY3JpcHRvcigpOwotICAgICAgICBhc3NlcnROb3ROdWxsKGZkKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShmZC52YWxpZCgpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShNZW1vcnlGaWxlLmlzTWVtb3J5RmlsZShmZCkpOwotICAgICAgICBmaWxlLmNsb3NlKCk7Ci0KLSAgICAgICAgYXNzZXJ0RmFsc2UoTWVtb3J5RmlsZS5pc01lbW9yeUZpbGUoRmlsZURlc2NyaXB0b3IuaW4pKTsKLSAgICAgICAgYXNzZXJ0RmFsc2UoTWVtb3J5RmlsZS5pc01lbW9yeUZpbGUoRmlsZURlc2NyaXB0b3Iub3V0KSk7Ci0gICAgICAgIGFzc2VydEZhbHNlKE1lbW9yeUZpbGUuaXNNZW1vcnlGaWxlKEZpbGVEZXNjcmlwdG9yLmVycikpOwotCi0gICAgICAgIEZpbGUgdGVtcEZpbGUgPSBGaWxlLmNyZWF0ZVRlbXBGaWxlKCJNZW1vcnlGaWxlVGVzdCIsIi50bXAiLCBnZXRDb250ZXh0KCkuZ2V0RmlsZXNEaXIoKSk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoZmlsZSk7Ci0gICAgICAgIEZpbGVPdXRwdXRTdHJlYW0gb3V0ID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIG91dCA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKHRlbXBGaWxlKTsKLSAgICAgICAgICAgIEZpbGVEZXNjcmlwdG9yIGZpbGVGZCA9IG91dC5nZXRGRCgpOwotICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChmaWxlRmQpOwotICAgICAgICAgICAgYXNzZXJ0RmFsc2UoTWVtb3J5RmlsZS5pc01lbW9yeUZpbGUoZmlsZUZkKSk7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBpZiAob3V0ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBvdXQuY2xvc2UoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHRlbXBGaWxlLmRlbGV0ZSgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQFNtYWxsVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RGaWxlRGVzY3JpcHRvcigpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBNZW1vcnlGaWxlIGZpbGUgPSBuZXcgTWVtb3J5RmlsZSgiTWVtb3J5RmlsZVRlc3QiLCAxMDAwMDAwKTsKLSAgICAgICAgTWVtb3J5RmlsZSByZWYgPSBuZXcgTWVtb3J5RmlsZShmaWxlLmdldEZpbGVEZXNjcmlwdG9yKCksIGZpbGUubGVuZ3RoKCksICJyIik7Ci0gICAgICAgIGJ5dGVbXSBidWZmZXI7Ci0KLSAgICAgICAgLy8gd3JpdGUgdG8gb3JpZ2luYWwsIHJlYWQgZnJvbSByZWZlcmVuY2UKLSAgICAgICAgZmlsZS53cml0ZUJ5dGVzKHRlc3RTdHJpbmcsIDAsIDIwMDAsIHRlc3RTdHJpbmcubGVuZ3RoKTsKLSAgICAgICAgYnVmZmVyID0gbmV3IGJ5dGVbdGVzdFN0cmluZy5sZW5ndGhdOwotICAgICAgICByZWYucmVhZEJ5dGVzKGJ1ZmZlciwgMjAwMCwgMCwgdGVzdFN0cmluZy5sZW5ndGgpOwotICAgICAgICBjb21wYXJlQnVmZmVycyh0ZXN0U3RyaW5nLCBidWZmZXIsIHRlc3RTdHJpbmcubGVuZ3RoKTsKLQotICAgICAgICBmaWxlLmNsb3NlKCk7Ci0gICAgICAgIHJlZi5jbG9zZSgpOyAgLy8gRG9lc24ndCBhY3R1YWxseSBkbyBhbnl0aGluZywgc2luY2UgdGhlIGZpbGUgZGVzY3JpcHRvciBpcyBub3QgZHVwKDIpOmVkCi0gICAgfQotCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYnl0ZVtdIHRlc3RTdHJpbmcgPSBuZXcgYnl0ZVtdIHsKICAgICAgICAgMywgMSwgNCwgMSwgNSwgOSwgMiwgNiwgNSwgMywgNSwgOCwgOSwgNywgOSwgMywgMiwgMywgOCwgNCwgNiwgMiwgNiwgNCwgMywgMywgOCwgMywgMiwgNywgOSwgNSwgMCwgMiwgOCwgOCwgNCwgMSwgOSwgNywgMSwgNiwgOSwgMywgOSwgOSwgMywgNywgNSwgMSwgMCwgNSwgOCwgMiwgMCwgOSwgNywgNCwgOSwgNCwgNCwgNSwgOSwgMiwgMywgMCwgNywgOCwgMSwgNiwgNCwKICAgICAgICAgMCwgNiwgMiwgOCwgNiwgMiwgMCwgOCwgOSwgOSwgOCwgNiwgMiwgOCwgMCwgMywgNCwgOCwgMiwgNSwgMywgNCwgMiwgMSwgMSwgNywgMCwgNiwgNywgOSwgOCwgMiwgMSwgNCwgOCwgMCwgOCwgNiwgNSwgMSwgMywgMiwgOCwgMiwgMywgMCwgNiwgNiwgNCwgNywgMCwgOSwgMywgOCwgNCwgNCwgNiwgMCwgOSwgNSwgNSwgMCwgNSwgOCwgMiwgMiwgMywgMSwgNywgMiwKZGlmZiAtLWdpdCBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL29zL01lc3NhZ2VRdWV1ZVRlc3QuamF2YSBiL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL29zL01lc3NhZ2VRdWV1ZVRlc3QuamF2YQppbmRleCBiN2MyZDFmLi5mODJiZmNlIDEwMDY0NAotLS0gYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9vcy9NZXNzYWdlUXVldWVUZXN0LmphdmEKKysrIGIvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvb3MvTWVzc2FnZVF1ZXVlVGVzdC5qYXZhCkBAIC00MSw2ICs0MSwxMCBAQAogICAgICAgICB9CiAKICAgICAgICAgcHVibGljIHZvaWQgaGFuZGxlTWVzc2FnZShNZXNzYWdlIG1zZykgeworICAgICAgICAgICAgaWYgKCFtc2cuaXNJblVzZSgpKSB7CisgICAgICAgICAgICAgICAgZmFpbHVyZShuZXcgUnVudGltZUV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgICAgICJtc2cuaXNJbnVzZSBpcyBmYWxzZSwgc2hvdWxkIGFsd2F5cyBiZSB0cnVlLCAjIiArIG1zZy53aGF0KSk7CisgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAobUNvdW50IDw9IG1MYXN0TWVzc2FnZSkgewogICAgICAgICAgICAgICAgIGlmIChtc2cud2hhdCAhPSBtQ291bnQpIHsKICAgICAgICAgICAgICAgICAgICAgZmFpbHVyZShuZXcgUnVudGltZUV4Y2VwdGlvbigKQEAgLTk5LDUgKzEwMywxNzQgQEAKIAogICAgICAgICB0ZXN0ZXIuZG9UZXN0KDEwMDApOwogICAgIH0KLX0KIAorICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIFRlc3RGaWVsZEludGVncml0eUhhbmRsZXIgZXh0ZW5kcyBUZXN0SGFuZGxlclRocmVhZCB7CisgICAgICAgIEhhbmRsZXIgbUhhbmRsZXI7CisgICAgICAgIGludCBtTGFzdE1lc3NhZ2U7CisgICAgICAgIGludCBtQ291bnQ7CisKKyAgICAgICAgcHVibGljIFRlc3RGaWVsZEludGVncml0eUhhbmRsZXIoKSB7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBnbygpIHsKKyAgICAgICAgICAgIG1IYW5kbGVyID0gbmV3IEhhbmRsZXIoKSB7CisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgaGFuZGxlTWVzc2FnZShNZXNzYWdlIG1zZykgeworICAgICAgICAgICAgICAgICAgICBUZXN0RmllbGRJbnRlZ3JpdHlIYW5kbGVyLnRoaXMuaGFuZGxlTWVzc2FnZShtc2cpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH07CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBoYW5kbGVNZXNzYWdlKE1lc3NhZ2UgbXNnKSB7CisgICAgICAgICAgICBpZiAoIW1zZy5pc0luVXNlKCkpIHsKKyAgICAgICAgICAgICAgICBmYWlsdXJlKG5ldyBSdW50aW1lRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAgICAgIm1zZy5pc0ludXNlIGlzIGZhbHNlLCBzaG91bGQgYWx3YXlzIGJlIHRydWUsICMiICsgbXNnLndoYXQpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChtQ291bnQgPD0gbUxhc3RNZXNzYWdlKSB7CisgICAgICAgICAgICAgICAgaWYgKG1zZy53aGF0ICE9IG1Db3VudCkgeworICAgICAgICAgICAgICAgICAgICBmYWlsdXJlKG5ldyBSdW50aW1lRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFeHBlY3RlZCBtZXNzYWdlICMiICsgbUNvdW50CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIsIHJlY2VpdmVkICMiICsgbXNnLndoYXQpKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG1Db3VudCA9PSBtTGFzdE1lc3NhZ2UpIHsKKyAgICAgICAgICAgICAgICAgICAgc3VjY2VzcygpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBtQ291bnQrKzsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgZmFpbHVyZShuZXcgUnVudGltZUV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgICAgICJNZXNzYWdlIHJlY2VpdmVkIGFmdGVyIGRvbmUsICMiICsgbXNnLndoYXQpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIEBNZWRpdW1UZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEZpZWxkSW50ZWdyaXR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKyAgICAgICAgVGVzdEhhbmRsZXJUaHJlYWQgdGVzdGVyID0gbmV3IFRlc3RGaWVsZEludGVncml0eUhhbmRsZXIoKSB7CisgICAgICAgICAgICBCdW5kbGUgbUJ1bmRsZTsKKworICAgICAgICAgICAgcHVibGljIHZvaWQgZ28oKSB7CisgICAgICAgICAgICAgICAgc3VwZXIuZ28oKTsKKyAgICAgICAgICAgICAgICBtTGFzdE1lc3NhZ2UgPSAxOworICAgICAgICAgICAgICAgIG1Db3VudCA9IDA7CisgICAgICAgICAgICAgICAgbUhhbmRsZXIuc2VuZE1lc3NhZ2UobUhhbmRsZXIub2J0YWluTWVzc2FnZSgwKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIGhhbmRsZU1lc3NhZ2UoTWVzc2FnZSBtc2cpIHsKKyAgICAgICAgICAgICAgICBzdXBlci5oYW5kbGVNZXNzYWdlKG1zZyk7CisgICAgICAgICAgICAgICAgaWYgKG1zZy53aGF0ID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgbXNnLmZsYWdzID0gLTE7CisgICAgICAgICAgICAgICAgICAgIG1zZy53aGF0ID0gMTsKKyAgICAgICAgICAgICAgICAgICAgbXNnLmFyZzEgPSA0NTY7CisgICAgICAgICAgICAgICAgICAgIG1zZy5hcmcyID0gNzg5OworICAgICAgICAgICAgICAgICAgICBtc2cub2JqID0gdGhpczsKKyAgICAgICAgICAgICAgICAgICAgbXNnLnJlcGx5VG8gPSBudWxsOworICAgICAgICAgICAgICAgICAgICBtQnVuZGxlID0gbmV3IEJ1bmRsZSgpOworICAgICAgICAgICAgICAgICAgICBtc2cuZGF0YSA9IG1CdW5kbGU7CisgICAgICAgICAgICAgICAgICAgIG1zZy5kYXRhLnB1dFN0cmluZygia2V5IiwgInZhbHVlIik7CisKKyAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSBuZXdNc2cgPSBtSGFuZGxlci5vYnRhaW5NZXNzYWdlKCk7CisgICAgICAgICAgICAgICAgICAgIG5ld01zZy5jb3B5RnJvbShtc2cpOworICAgICAgICAgICAgICAgICAgICBpZiAobmV3TXNnLmlzSW5Vc2UoKSAhPSBmYWxzZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgZmFpbHVyZShuZXcgUnVudGltZUV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm5ld01zZy5pc0luVXNlIGlzIHRydWUgc2hvdWxkIGJlIGZhbHNlIGFmdGVyIGNvcHlGcm9tIikpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChuZXdNc2cuZmxhZ3MgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgZmFpbHVyZShuZXcgUnVudGltZUV4Y2VwdGlvbihTdHJpbmcuZm9ybWF0KAorICAgICAgICAgICAgICAgICAgICAgICAgIm5ld01zZy5mbGFncyBpcyAlZCBzaG91bGQgYmUgMCBhZnRlciBjb3B5RnJvbSIsIG5ld01zZy5mbGFncykpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAobmV3TXNnLndoYXQgIT0gMSkgeworICAgICAgICAgICAgICAgICAgICAgICAgZmFpbHVyZShuZXcgUnVudGltZUV4Y2VwdGlvbihTdHJpbmcuZm9ybWF0KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibmV3TXNnLndoYXQgaXMgJWQgc2hvdWxkIGJlICVkIGFmdGVyIGNvcHlGcm9tIiwgbmV3TXNnLndoYXQsIDEpKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKG5ld01zZy5hcmcxICE9IDQ1NikgeworICAgICAgICAgICAgICAgICAgICAgICAgZmFpbHVyZShuZXcgUnVudGltZUV4Y2VwdGlvbihTdHJpbmcuZm9ybWF0KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibmV3TXNnLmFyZzEgaXMgJWQgc2hvdWxkIGJlICVkIGFmdGVyIGNvcHlGcm9tIiwgbXNnLmFyZzEsIDQ1NikpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAobmV3TXNnLmFyZzIgIT0gNzg5KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmYWlsdXJlKG5ldyBSdW50aW1lRXhjZXB0aW9uKFN0cmluZy5mb3JtYXQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJuZXdNc2cuYXJnMiBpcyAlZCBzaG91bGQgYmUgJWQgYWZ0ZXIgY29weUZyb20iLCBtc2cuYXJnMiwgNzg5KSkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChuZXdNc2cub2JqICE9IHRoaXMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZhaWx1cmUobmV3IFJ1bnRpbWVFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJuZXdNc2cub2JqIHNob3VsZCBiZSAndGhpcycgYWZ0ZXIgY29weUZyb20iKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKG5ld01zZy5yZXBseVRvICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZhaWx1cmUobmV3IFJ1bnRpbWVFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJuZXdNc2cucmVwbHlUbyBzaG91bGQgYmUgbnVsbCBhZnRlciBjb3B5RnJvbSIpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAobmV3TXNnLmRhdGEgPT0gbUJ1bmRsZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgZmFpbHVyZShuZXcgUnVudGltZUV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm5ld01zZy5kYXRhIHNob3VsZCBOT1QgYmUgbUJ1bmRsZSBhZnRlciBjb3B5RnJvbSIpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAoIW5ld01zZy5kYXRhLmdldFN0cmluZygia2V5IikuZXF1YWxzKG1CdW5kbGUuZ2V0U3RyaW5nKCJrZXkiKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZhaWx1cmUobmV3IFJ1bnRpbWVFeGNlcHRpb24oU3RyaW5nLmZvcm1hdCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm5ld01zZy5kYXRhLmdldFN0cmluZyhcImtleVwiKSBpcyAlcyBhbmQgZG9lcyBub3QgZXF1YWwiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBtQnVuZGxlLmdldFN0cmluZyhcImtleVwiKSB3aGljaCBpcyAlcyBhZnRlciBjb3B5RnJvbSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld01zZy5kYXRhLmdldFN0cmluZygia2V5IiksICBtQnVuZGxlLmdldFN0cmluZygia2V5IikpKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKG5ld01zZy53aGVuICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZhaWx1cmUobmV3IFJ1bnRpbWVFeGNlcHRpb24oU3RyaW5nLmZvcm1hdCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm5ld01zZy53aGVuIGlzICVkIHNob3VsZCBiZSAwIGFmdGVyIGNvcHlGcm9tIiwgbmV3TXNnLndoZW4pKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKG5ld01zZy50YXJnZXQgIT0gbUhhbmRsZXIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZhaWx1cmUobmV3IFJ1bnRpbWVFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJuZXdNc2cudGFyZ2V0IGlzIE5PVCBtSGFuZGxlciBhZnRlciBjb3B5RnJvbSIpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAobmV3TXNnLmNhbGxiYWNrICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZhaWx1cmUobmV3IFJ1bnRpbWVFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJuZXdNc2cuY2FsbGJhY2sgaXMgTk9UIG51bGwgYWZ0ZXIgY29weUZyb20iKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBtSGFuZGxlci5zZW5kTWVzc2FnZShuZXdNc2cpOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobXNnLndoYXQgPT0gMSkgeworICAgICAgICAgICAgICAgICAgICBpZiAobXNnLmlzSW5Vc2UoKSAhPSB0cnVlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmYWlsdXJlKG5ldyBSdW50aW1lRXhjZXB0aW9uKFN0cmluZy5mb3JtYXQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtc2cuaXNJblVzZSBpcyBmYWxzZSBzaG91bGQgYmUgdHJ1ZSBhZnRlciB3aGVuIHByb2Nlc3NpbmcgJWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtc2cud2hhdCkpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAobXNnLmFyZzEgIT0gNDU2KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmYWlsdXJlKG5ldyBSdW50aW1lRXhjZXB0aW9uKFN0cmluZy5mb3JtYXQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtc2cuYXJnMSBpcyAlZCBzaG91bGQgYmUgJWQgd2hlbiBwcm9jZXNzaW5nICMgJWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtc2cuYXJnMSwgNDU2LCBtc2cud2hhdCkpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAobXNnLmFyZzIgIT0gNzg5KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmYWlsdXJlKG5ldyBSdW50aW1lRXhjZXB0aW9uKFN0cmluZy5mb3JtYXQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtc2cuYXJnMiBpcyAlZCBzaG91bGQgYmUgJWQgd2hlbiBwcm9jZXNzaW5nICMgJWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtc2cuYXJnMiwgNzg5LCBtc2cud2hhdCkpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAobXNnLm9iaiAhPSB0aGlzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmYWlsdXJlKG5ldyBSdW50aW1lRXhjZXB0aW9uKFN0cmluZy5mb3JtYXQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtc2cub2JqIHNob3VsZCBiZSAndGhpcycgd2hlbiBwcm9jZXNzaW5nICMgJWQiLCBtc2cud2hhdCkpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAobXNnLnJlcGx5VG8gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgZmFpbHVyZShuZXcgUnVudGltZUV4Y2VwdGlvbihTdHJpbmcuZm9ybWF0KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibXNnLnJlcGx5VG8gc2hvdWxkIGJlIG51bGwgd2hlbiBwcm9jZXNzaW5nICMgJWQiLCBtc2cud2hhdCkpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAoIW1zZy5kYXRhLmdldFN0cmluZygia2V5IikuZXF1YWxzKG1CdW5kbGUuZ2V0U3RyaW5nKCJrZXkiKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZhaWx1cmUobmV3IFJ1bnRpbWVFeGNlcHRpb24oU3RyaW5nLmZvcm1hdCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1zZy5kYXRhLmdldFN0cmluZyhcImtleVwiKSBpcyAlcyBhbmQgZG9lcyBub3QgZXF1YWwiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBtQnVuZGxlLmdldFN0cmluZyhcImtleVwiKSB3aGljaCBpcyAlcyB3aGVuIHByb2Nlc3NpbmcgIyAlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1zZy5kYXRhLmdldFN0cmluZygia2V5IiksICBtQnVuZGxlLmdldFN0cmluZygia2V5IiksIG1zZy53aGF0KSkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChtc2cud2hlbiAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmYWlsdXJlKG5ldyBSdW50aW1lRXhjZXB0aW9uKFN0cmluZy5mb3JtYXQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtc2cud2hlbiBpcyAlZCBzaG91bGQgYmUgMCB3aGVuIHByb2Nlc3NpbmcgIyAlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1zZy53aGVuLCBtc2cud2hhdCkpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAobXNnLnRhcmdldCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmYWlsdXJlKG5ldyBSdW50aW1lRXhjZXB0aW9uKFN0cmluZy5mb3JtYXQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtc2cudGFyZ2V0IGlzIE5PVCBudWxsIHdoZW4gcHJvY2Vzc2luZyAjICVkIiwgbXNnLndoYXQpKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKG1zZy5jYWxsYmFjayAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmYWlsdXJlKG5ldyBSdW50aW1lRXhjZXB0aW9uKFN0cmluZy5mb3JtYXQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtc2cuY2FsbGJhY2sgaXMgTk9UIG51bGwgd2hlbiBwcm9jZXNzaW5nICMgJWQiLCBtc2cud2hhdCkpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGZhaWx1cmUobmV3IFJ1bnRpbWVFeGNlcHRpb24oU3RyaW5nLmZvcm1hdCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVW5leHBlY3RlZCBtc2cud2hhdCBpcyAlZCIgKyBtc2cud2hhdCkpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH07CisKKyAgICAgICAgdGVzdGVyLmRvVGVzdCgxMDAwKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9waW0vdmNhcmQvVkNhcmRFeHBvcnRlclRlc3RzLmphdmEgYi9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9waW0vdmNhcmQvVkNhcmRFeHBvcnRlclRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJiZWM0NjIuLjAwMDAwMDAKLS0tIGEvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvcGltL3ZjYXJkL1ZDYXJkRXhwb3J0ZXJUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIyMyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBhbmRyb2lkLnBpbS52Y2FyZDsKLQotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZW50VmFsdWVzOwotaW1wb3J0IGFuZHJvaWQucGltLnZjYXJkLnRlc3RfdXRpbHMuQ29udGFjdEVudHJ5OwotaW1wb3J0IGFuZHJvaWQucGltLnZjYXJkLnRlc3RfdXRpbHMuUHJvcGVydHlOb2Rlc1ZlcmlmaWVyRWxlbTsKLWltcG9ydCBhbmRyb2lkLnBpbS52Y2FyZC50ZXN0X3V0aWxzLlByb3BlcnR5Tm9kZXNWZXJpZmllckVsZW0uVHlwZVNldDsKLWltcG9ydCBhbmRyb2lkLnBpbS52Y2FyZC50ZXN0X3V0aWxzLlZDYXJkVGVzdHNCYXNlOwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5Db21tb25EYXRhS2luZHMuRW1haWw7Ci1pbXBvcnQgYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0LkNvbW1vbkRhdGFLaW5kcy5FdmVudDsKLWltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuQ29tbW9uRGF0YUtpbmRzLkltOwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5Db21tb25EYXRhS2luZHMuTmlja25hbWU7Ci1pbXBvcnQgYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0LkNvbW1vbkRhdGFLaW5kcy5Ob3RlOwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5Db21tb25EYXRhS2luZHMuT3JnYW5pemF0aW9uOwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5Db21tb25EYXRhS2luZHMuUGhvbmU7Ci1pbXBvcnQgYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0LkNvbW1vbkRhdGFLaW5kcy5QaG90bzsKLWltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuQ29tbW9uRGF0YUtpbmRzLlJlbGF0aW9uOwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5Db21tb25EYXRhS2luZHMuU3RydWN0dXJlZE5hbWU7Ci1pbXBvcnQgYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0LkNvbW1vbkRhdGFLaW5kcy5TdHJ1Y3R1cmVkUG9zdGFsOwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5Db21tb25EYXRhS2luZHMuV2Vic2l0ZTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci0KLS8qKgotICogVGVzdHMgZm9yIHRoZSBjb2RlIHJlbGF0ZWQgdG8gdkNhcmQgZXhwb3J0ZXIsIGluY3VsZGluZyB2Q2FyZCBjb21wb3Nlci4KLSAqIFRoaXMgdGVzdCBjbGFzcyBkZXBlbmRzIG9uIHZDYXJkIGltcG9ydGVyIGNvZGUsIHNvIGlmIHRlc3RzIGZvciB2Q2FyZCBpbXBvcnRlciBmYWlsLAotICogdGhlIHJlc3VsdCBvZiB0aGlzIGNsYXNzIHdpbGwgbm90IGJlIHJlbGlhYmxlLgotICovCi1wdWJsaWMgY2xhc3MgVkNhcmRFeHBvcnRlclRlc3RzIGV4dGVuZHMgVkNhcmRUZXN0c0Jhc2UgewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJ5dGVbXSBzUGhvdG9CeXRlQXJyYXkgPQotICAgICAgICBWQ2FyZEltcG9ydGVyVGVzdHMuc1Bob3RvQnl0ZUFycmF5Rm9yQ29tcGxpY2F0ZWRDYXNlOwotCi0gICAgcHVibGljIHZvaWQgdGVzdFNpbXBsZVYyMSgpIHsKLSAgICAgICAgbVZlcmlmaWVyLmluaXRGb3JFeHBvcnRUZXN0KFYyMSk7Ci0gICAgICAgIG1WZXJpZmllci5hZGRJbnB1dEVudHJ5KCkuYWRkQ29udGVudFZhbHVlcyhTdHJ1Y3R1cmVkTmFtZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLkZBTUlMWV9OQU1FLCAiQW5kbyIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5HSVZFTl9OQU1FLCAiUm9pZCIpOwotICAgICAgICBtVmVyaWZpZXIuYWRkUHJvcGVydHlOb2Rlc1ZlcmlmaWVyRWxlbSgpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiRk4iLCAiUm9pZCBBbmRvIikKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJOIiwgIkFuZG87Um9pZDs7OyIsCi0gICAgICAgICAgICAgICAgICAgICAgICBBcnJheXMuYXNMaXN0KCJBbmRvIiwgIlJvaWQiLCAiIiwgIiIsICIiKSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHRlc3RTdHJ1Y3R1cmVkTmFtZUJhc2ljKGludCB2Y2FyZFR5cGUpIHsKLSAgICAgICAgbVZlcmlmaWVyLmluaXRGb3JFeHBvcnRUZXN0KHZjYXJkVHlwZSk7Ci0gICAgICAgIG1WZXJpZmllci5hZGRJbnB1dEVudHJ5KCkuYWRkQ29udGVudFZhbHVlcyhTdHJ1Y3R1cmVkTmFtZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLkZBTUlMWV9OQU1FLCAiQXBwcm9wcmlhdGVGYW1pbHlOYW1lIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLkdJVkVOX05BTUUsICJBcHByb3ByaWF0ZUdpdmVuTmFtZSIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5NSURETEVfTkFNRSwgIkFwcHJvcHJpYXRlTWlkZGxlTmFtZSIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5QUkVGSVgsICJBcHByb3ByaWF0ZVByZWZpeCIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5TVUZGSVgsICJBcHByb3ByaWF0ZVN1ZmZpeCIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5ESVNQTEFZX05BTUUsICJESVNQTEFZIE5BTUUiKTsKLQotICAgICAgICBtVmVyaWZpZXIuYWRkUHJvcGVydHlOb2Rlc1ZlcmlmaWVyRWxlbSgpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigiTiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAiQXBwcm9wcmlhdGVGYW1pbHlOYW1lO0FwcHJvcHJpYXRlR2l2ZW5OYW1lO0FwcHJvcHJpYXRlTWlkZGxlTmFtZTsiCi0gICAgICAgICAgICAgICAgICAgICAgICArICJBcHByb3ByaWF0ZVByZWZpeDtBcHByb3ByaWF0ZVN1ZmZpeCIsCi0gICAgICAgICAgICAgICAgICAgICAgICBBcnJheXMuYXNMaXN0KCJBcHByb3ByaWF0ZUZhbWlseU5hbWUiLCAiQXBwcm9wcmlhdGVHaXZlbk5hbWUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQXBwcm9wcmlhdGVNaWRkbGVOYW1lIiwgIkFwcHJvcHJpYXRlUHJlZml4IiwgIkFwcHJvcHJpYXRlU3VmZml4IikpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigiRk4iLCAiRElTUExBWSBOQU1FIik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFN0cnVjdHVyZWROYW1lQmFzaWNWMjEoKSB7Ci0gICAgICAgIHRlc3RTdHJ1Y3R1cmVkTmFtZUJhc2ljKFYyMSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFN0cnVjdHVyZWROYW1lQmFzaWNWMzAoKSB7Ci0gICAgICAgIHRlc3RTdHJ1Y3R1cmVkTmFtZUJhc2ljKFYzMCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFN0cnVjdHVyZWROYW1lQmFzaWNWNDAoKSB7Ci0gICAgICAgIHRlc3RTdHJ1Y3R1cmVkTmFtZUJhc2ljKFY0MCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGVzdCB0aGF0IG9ubHkgInByaW1hcnkiIFN0cnVjdHVyZWROYW1lIGlzIGVtaXR0ZWQsIHNvIHRoYXQgb3VyIHZDYXJkIGZpbGUKLSAgICAgKiB3aWxsIG5vdCBjb25mdXNlIHRoZSBleHRlcm5hbCBpbXBvcnRlciwgYXNzdW1pbmcgdGhlcmUgbWF5IGJlIHNvbWUgaW1wb3J0ZXIKLSAgICAgKiB3aGljaCBwcmVzdW1lIHRoYXQgdGhlcmUncyBvbmx5IG9uZSBwcm9wZXJ0eSB0b3dhcmQgZWFjaCBvZiAgIk4iLCAiRk4iLCBldGMuCi0gICAgICogTm90ZSB0aGF0IG1vcmUgdGhhbiBvbmUgIk4iLCAiRk4iLCBldGMuIHByb3BlcnRpZXMgYXJlIGFjY2VwdGFibGUgaW4gdkNhcmQgc3BlYy4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgdGVzdFN0cnVjdHVyZWROYW1lVXNlUHJpbWFyeUNvbW1vbihpbnQgdmNhcmRUeXBlKSB7Ci0gICAgICAgIG1WZXJpZmllci5pbml0Rm9yRXhwb3J0VGVzdCh2Y2FyZFR5cGUpOwotICAgICAgICBmaW5hbCBDb250YWN0RW50cnkgZW50cnkgPSBtVmVyaWZpZXIuYWRkSW5wdXRFbnRyeSgpOwotICAgICAgICBlbnRyeS5hZGRDb250ZW50VmFsdWVzKFN0cnVjdHVyZWROYW1lLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuRkFNSUxZX05BTUUsICJEb05vdEVtaXRGYW1pbHlOYW1lMSIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5HSVZFTl9OQU1FLCAiRG9Ob3RFbWl0R2l2ZW5OYW1lMSIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5NSURETEVfTkFNRSwgIkRvTm90RW1pdE1pZGRsZU5hbWUxIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLlBSRUZJWCwgIkRvTm90RW1pdFByZWZpeDEiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuU1VGRklYLCAiRG9Ob3RFbWl0U3VmZml4MSIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5ESVNQTEFZX05BTUUsICJEb05vdEVtaXREaXNwbGF5TmFtZTEiKTsKLQotICAgICAgICAvLyBXaXRoICJJU19QUklNQVJZPTEiLiBUaGlzIGlzIHdoYXQgd2Ugc2hvdWxkIHVzZS4KLSAgICAgICAgZW50cnkuYWRkQ29udGVudFZhbHVlcyhTdHJ1Y3R1cmVkTmFtZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLkZBTUlMWV9OQU1FLCAiQXBwcm9wcmlhdGVGYW1pbHlOYW1lIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLkdJVkVOX05BTUUsICJBcHByb3ByaWF0ZUdpdmVuTmFtZSIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5NSURETEVfTkFNRSwgIkFwcHJvcHJpYXRlTWlkZGxlTmFtZSIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5QUkVGSVgsICJBcHByb3ByaWF0ZVByZWZpeCIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5TVUZGSVgsICJBcHByb3ByaWF0ZVN1ZmZpeCIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5ESVNQTEFZX05BTUUsICJBcHByb3ByaWF0ZURpc3BsYXlOYW1lIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLklTX1BSSU1BUlksIDEpOwotCi0gICAgICAgIC8vIFdpdGggIklTX1BSSU1BUlk9MSIsIGJ1dCB3ZSBzaG91bGQgaWdub3JlIHRoaXMgdGltZSwgc2luY2UgdGhpcyBpcyBzZWNvbmQsIG5vdCBmaXJzdC4KLSAgICAgICAgLy8gdkNhcmQgMi4xIGRvZXMgbm90IHNwZWNpZnkgYW55dGhpbmcgYWJvdXQgdGhlIG51bWJlciBvZiBOIHByb3BlcnRpZXMuIFdlIGNob29zZSBub3QKLSAgICAgICAgLy8gZW1pdHRpbmcgdGhpcyBwcm9wZXJ0eS4KLSAgICAgICAgLy8gdkNhcmQgMy4wIGRvZXMgKFRoZXJlIG11c3QgYmUgb25lIE4gcHJvcGVydHkpCi0gICAgICAgIC8vIHZDYXJkIDQuMCAocmV2MTMpIGRvZXMgKGNhcmRpbmFsaXR5ICgwLCAxKSkuCi0gICAgICAgIGVudHJ5LmFkZENvbnRlbnRWYWx1ZXMoU3RydWN0dXJlZE5hbWUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5GQU1JTFlfTkFNRSwgIkRvTm90RW1pdEZhbWlseU5hbWUyIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLkdJVkVOX05BTUUsICJEb05vdEVtaXRHaXZlbk5hbWUyIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLk1JRERMRV9OQU1FLCAiRG9Ob3RFbWl0TWlkZGxlTmFtZTIiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuUFJFRklYLCAiRG9Ob3RFbWl0UHJlZml4MiIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5TVUZGSVgsICJEb05vdEVtaXRTdWZmaXgyIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLkRJU1BMQVlfTkFNRSwgIkRvTm90RW1pdERpc3BsYXlOYW1lMiIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5JU19QUklNQVJZLCAxKTsKLQotICAgICAgIG1WZXJpZmllci5hZGRQcm9wZXJ0eU5vZGVzVmVyaWZpZXJFbGVtKCkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJOIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICJBcHByb3ByaWF0ZUZhbWlseU5hbWU7QXBwcm9wcmlhdGVHaXZlbk5hbWU7QXBwcm9wcmlhdGVNaWRkbGVOYW1lOyIKLSAgICAgICAgICAgICAgICAgICAgICAgICsgIkFwcHJvcHJpYXRlUHJlZml4O0FwcHJvcHJpYXRlU3VmZml4IiwKLSAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5cy5hc0xpc3QoIkFwcHJvcHJpYXRlRmFtaWx5TmFtZSIsICJBcHByb3ByaWF0ZUdpdmVuTmFtZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBcHByb3ByaWF0ZU1pZGRsZU5hbWUiLCAiQXBwcm9wcmlhdGVQcmVmaXgiLCAiQXBwcm9wcmlhdGVTdWZmaXgiKSkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJGTiIsICJBcHByb3ByaWF0ZURpc3BsYXlOYW1lIik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFN0cnVjdHVyZWROYW1lVXNlUHJpbWFyeVYyMSgpIHsKLSAgICAgICAgdGVzdFN0cnVjdHVyZWROYW1lVXNlUHJpbWFyeUNvbW1vbihWMjEpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RTdHJ1Y3R1cmVkTmFtZVVzZVByaW1hcnlWMzAoKSB7Ci0gICAgICAgIHRlc3RTdHJ1Y3R1cmVkTmFtZVVzZVByaW1hcnlDb21tb24oVjMwKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0U3RydWN0dXJlZE5hbWVVc2VQcmltYXJ5VjQwKCkgewotICAgICAgICB0ZXN0U3RydWN0dXJlZE5hbWVVc2VQcmltYXJ5Q29tbW9uKFY0MCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGVzdHMgdGhhdCBvbmx5ICJzdXBlciBwcmltYXJ5IiBTdHJ1Y3R1cmVkTmFtZSBpcyBlbWl0dGVkLgotICAgICAqIFNlZSBhbHNvIHRoZSBjb21tZW50IGluIHtAbGluayAjdGVzdFN0cnVjdHVyZWROYW1lVXNlUHJpbWFyeUNvbW1vbihpbnQpfS4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgdGVzdFN0cnVjdHVyZWROYW1lVXNlU3VwZXJQcmltYXJ5Q29tbW9uKGludCB2Y2FyZFR5cGUpIHsKLSAgICAgICAgbVZlcmlmaWVyLmluaXRGb3JFeHBvcnRUZXN0KHZjYXJkVHlwZSk7Ci0gICAgICAgIGZpbmFsIENvbnRhY3RFbnRyeSBlbnRyeSA9IG1WZXJpZmllci5hZGRJbnB1dEVudHJ5KCk7Ci0gICAgICAgIGVudHJ5LmFkZENvbnRlbnRWYWx1ZXMoU3RydWN0dXJlZE5hbWUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5GQU1JTFlfTkFNRSwgIkRvTm90RW1pdEZhbWlseU5hbWUxIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLkdJVkVOX05BTUUsICJEb05vdEVtaXRHaXZlbk5hbWUxIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLk1JRERMRV9OQU1FLCAiRG9Ob3RFbWl0TWlkZGxlTmFtZTEiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuUFJFRklYLCAiRG9Ob3RFbWl0UHJlZml4MSIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5TVUZGSVgsICJEb05vdEVtaXRTdWZmaXgxIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLkRJU1BMQVlfTkFNRSwgIkRvTm90RW1pdERpc3BsYXkxIik7Ci0KLSAgICAgICAgLy8gV2l0aCAiSVNfUFJJTUFSWT0xIiwgYnV0IHdlIHNob3VsZCBpZ25vcmUgdGhpcyB0aW1lLgotICAgICAgICBlbnRyeS5hZGRDb250ZW50VmFsdWVzKFN0cnVjdHVyZWROYW1lLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuRkFNSUxZX05BTUUsICJEb05vdEVtaXRGYW1pbHlOYW1lMiIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5HSVZFTl9OQU1FLCAiRG9Ob3RFbWl0R2l2ZW5OYW1lMiIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5NSURETEVfTkFNRSwgIkRvTm90RW1pdE1pZGRsZU5hbWUyIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLlBSRUZJWCwgIkRvTm90RW1pdFByZWZpeDIiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuU1VGRklYLCAiRG9Ob3RFbWl0U3VmZml4MiIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5ESVNQTEFZX05BTUUsICJEb05vdEVtaXREaXNwbGF5MiIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5JU19QUklNQVJZLCAxKTsKLQotICAgICAgICAvLyBXaXRoICJJU19TVVBFUl9QUklNQVJZPTEiLiBUaGlzIGlzIHdoYXQgd2Ugc2hvdWxkIHVzZS4KLSAgICAgICAgZW50cnkuYWRkQ29udGVudFZhbHVlcyhTdHJ1Y3R1cmVkTmFtZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLkZBTUlMWV9OQU1FLCAiQXBwcm9wcmlhdGVGYW1pbHlOYW1lIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLkdJVkVOX05BTUUsICJBcHByb3ByaWF0ZUdpdmVuTmFtZSIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5NSURETEVfTkFNRSwgIkFwcHJvcHJpYXRlTWlkZGxlTmFtZSIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5QUkVGSVgsICJBcHByb3ByaWF0ZVByZWZpeCIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5TVUZGSVgsICJBcHByb3ByaWF0ZVN1ZmZpeCIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5ESVNQTEFZX05BTUUsICJBcHByb3ByaWF0ZURpc3BsYXlOYW1lIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLklTX1NVUEVSX1BSSU1BUlksIDEpOwotCi0gICAgICAgIGVudHJ5LmFkZENvbnRlbnRWYWx1ZXMoU3RydWN0dXJlZE5hbWUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5GQU1JTFlfTkFNRSwgIkRvTm90RW1pdEZhbWlseU5hbWUzIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLkdJVkVOX05BTUUsICJEb05vdEVtaXRHaXZlbk5hbWUzIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLk1JRERMRV9OQU1FLCAiRG9Ob3RFbWl0TWlkZGxlTmFtZTMiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuUFJFRklYLCAiRG9Ob3RFbWl0UHJlZml4MyIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5TVUZGSVgsICJEb05vdEVtaXRTdWZmaXgzIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLkRJU1BMQVlfTkFNRSwgIkRvTm90RW1pdERpc3BsYXkzIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLklTX1BSSU1BUlksIDEpOwotCi0gICAgICAgIGZpbmFsIFByb3BlcnR5Tm9kZXNWZXJpZmllckVsZW0gZWxlbSA9IG1WZXJpZmllci5hZGRQcm9wZXJ0eU5vZGVzVmVyaWZpZXJFbGVtKCk7Ci0gICAgICAgIGVsZW0uYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJOIiwKLSAgICAgICAgICAgICAgICAiQXBwcm9wcmlhdGVGYW1pbHlOYW1lO0FwcHJvcHJpYXRlR2l2ZW5OYW1lO0FwcHJvcHJpYXRlTWlkZGxlTmFtZTsiCi0gICAgICAgICAgICAgICAgKyAiQXBwcm9wcmlhdGVQcmVmaXg7QXBwcm9wcmlhdGVTdWZmaXgiLAotICAgICAgICAgICAgICAgIEFycmF5cy5hc0xpc3QoIkFwcHJvcHJpYXRlRmFtaWx5TmFtZSIsICJBcHByb3ByaWF0ZUdpdmVuTmFtZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAiQXBwcm9wcmlhdGVNaWRkbGVOYW1lIiwgIkFwcHJvcHJpYXRlUHJlZml4IiwgIkFwcHJvcHJpYXRlU3VmZml4IikpOwotCi0gICAgICAgIGVsZW0uYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJGTiIsICJBcHByb3ByaWF0ZURpc3BsYXlOYW1lIik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFN0cnVjdHVyZWROYW1lVXNlU3VwZXJQcmltYXJ5VjIxKCkgewotICAgICAgICB0ZXN0U3RydWN0dXJlZE5hbWVVc2VTdXBlclByaW1hcnlDb21tb24oVjIxKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0U3RydWN0dXJlZE5hbWVVc2VTdXBlclByaW1hcnlWMzAoKSB7Ci0gICAgICAgIHRlc3RTdHJ1Y3R1cmVkTmFtZVVzZVN1cGVyUHJpbWFyeUNvbW1vbihWMzApOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RTdHJ1Y3R1cmVkTmFtZVVzZVN1cGVyUHJpbWFyeVY0MCgpIHsKLSAgICAgICAgdGVzdFN0cnVjdHVyZWROYW1lVXNlU3VwZXJQcmltYXJ5Q29tbW9uKFY0MCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGVzdHMgcGhvbmV0aWMgbmFtZXMgZmllbGQgYXJlIGhhbmRsZWQgY29ycmVjdGx5LgotICAgICAqCi0gICAgICogdkNhcmQgMi4xIGRvZXMgbm90IGhhdmUgYW55IGZpZWxkIGNvcnJlc3BvbmRpbmcgdG8gdGhlbS4KLSAgICAgKiB2Q2FyZCAzLjAgaGFzIFNPUlQtU1RSSU5HIHByb3BlcnR5LCB3aGljaCBkb2VzIG5vdCBzdXBwb3J0IG11bHRpcGxlIHZhbHVlcyBpbnNpZGUgaXQuCi0gICAgICogdkNhcmQgNC4wIChyZXYxMykgaGFzIFNPUlQtQVMgcGFyYW1ldGVyLCB3aGljaCBoYXMgdGhyZWUgdmFsdWVzIChmYW1pbHksIGdpdmVuLCBtaWRkbGUpCi0gICAgICogaW5zaWRlIGl0LgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCB0ZXN0U3RydWN0dXJlZE5hbWVQaG9uZXRpY05hbWVDb21tb24oaW50IHZjYXJkVHlwZSkgewotICAgICAgICBtVmVyaWZpZXIuaW5pdEZvckV4cG9ydFRlc3QodmNhcmRUeXBlKTsKLSAgICAgICAgZmluYWwgQ29udGFjdEVudHJ5IGVudHJ5ID0gbVZlcmlmaWVyLmFkZElucHV0RW50cnkoKTsKLSAgICAgICAgZW50cnkuYWRkQ29udGVudFZhbHVlcyhTdHJ1Y3R1cmVkTmFtZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLkZBTUlMWV9OQU1FLCAiQXBwcm9wcmlhdGVGYW1pbHlOYW1lIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLkdJVkVOX05BTUUsICJBcHByb3ByaWF0ZUdpdmVuTmFtZSIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5NSURETEVfTkFNRSwgIkFwcHJvcHJpYXRlTWlkZGxlTmFtZSIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5QUkVGSVgsICJBcHByb3ByaWF0ZVByZWZpeCIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5TVUZGSVgsICJBcHByb3ByaWF0ZVN1ZmZpeCIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5ESVNQTEFZX05BTUUsICJBcHByb3ByaWF0ZURpc3BsYXlOYW1lIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLlBIT05FVElDX0ZBTUlMWV9OQU1FLCAiQXBwcm9wcmlhdGVQaG9uZXRpY0ZhbWlseSIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5QSE9ORVRJQ19HSVZFTl9OQU1FLCAiQXBwcm9wcmlhdGVQaG9uZXRpY0dpdmVuIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLlBIT05FVElDX01JRERMRV9OQU1FLCAiQXBwcm9wcmlhdGVQaG9uZXRpY01pZGRsZSIpOwotCi0gICAgICAgIGZpbmFsIFByb3BlcnR5Tm9kZXNWZXJpZmllckVsZW0gZWxlbSA9IG1WZXJpZmllci5hZGRQcm9wZXJ0eU5vZGVzVmVyaWZpZXJFbGVtKCk7Ci0gICAgICAgIGlmIChWQ2FyZENvbmZpZy5pc1ZlcnNpb240MCh2Y2FyZFR5cGUpKSB7Ci0gICAgICAgICAgICBmaW5hbCBDb250ZW50VmFsdWVzIGNvbnRlbnRWYWx1ZXMgPSBuZXcgQ29udGVudFZhbHVlcygpOwotICAgICAgICAgICAgY29udGVudFZhbHVlcy5wdXQoIlNPUlQtQVMiLAotICAgICAgICAgICAgICAgICAgICAiQXBwcm9wcmlhdGVGYW1pbHlOYW1lO0FwcHJvcHJpYXRlR2l2ZW5OYW1lO0FwcHJvcHJpYXRlTWlkZGxlTmFtZSIpOwotICAgICAgICAgICAgLy8gdkNhcmQgNC4wIChyZXYxMykgbm93IHVzZXMgU09SVC1BUyBwYXJhbWV0ZXIsIHdoaWNoIGlzIG5vdCBjb21wYXRpYmxlIHdpdGgKLSAgICAgICAgICAgIC8vIGVpdGhlciAyLjEgbm9yIDMuMC4KLSAgICAgICAgICAgIGVsZW0uYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJOIiwKLSAgICAgICAgICAgICAgICAgICAgIkFwcHJvcHJpYXRlRmFtaWx5TmFtZTtBcHByb3ByaWF0ZUdpdmVuTmFtZTtBcHByb3ByaWF0ZU1pZGRsZU5hbWU7IgotICAgICAgICAgICAgICAgICAgICArICJBcHByb3ByaWF0ZVByZWZpeDtBcHByb3ByaWF0ZVN1ZmZpeCIsCi0gICAgICAgICAgICAgICAgICAgIEFycmF5cy5hc0xpc3QoIkFwcHJvcHJpYXRlRmFtaWx5TmFtZSIsICJBcHByb3ByaWF0ZUdpdmVuTmFtZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFwcHJvcHJpYXRlTWlkZGxlTmFtZSIsICJBcHByb3ByaWF0ZVByZWZpeCIsICJBcHByb3ByaWF0ZVN1ZmZpeCIpLAotICAgICAgICAgICAgICAgICAgICBjb250ZW50VmFsdWVzKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGVsZW0uYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJOIiwKLSAgICAgICAgICAgICAgICAgICAgIkFwcHJvcHJpYXRlRmFtaWx5TmFtZTtBcHByb3ByaWF0ZUdpdmVuTmFtZTtBcHByb3ByaWF0ZU1pZGRsZU5hbWU7IgotICAgICAgICAgICAgICAgICAgICArICJBcHByb3ByaWF0ZVByZWZpeDtBcHByb3ByaWF0ZVN1ZmZpeCIsCi0gICAgICAgICAgICAgICAgICAgIEFycmF5cy5hc0xpc3QoIkFwcHJvcHJpYXRlRmFtaWx5TmFtZSIsICJBcHByb3ByaWF0ZUdpdmVuTmFtZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFwcHJvcHJpYXRlTWlkZGxlTmFtZSIsICJBcHByb3ByaWF0ZVByZWZpeCIsICJBcHByb3ByaWF0ZVN1ZmZpeCIpKTsKLSAgICAgICAgICAgIGlmIChWQ2FyZENvbmZpZy5pc1ZlcnNpb24zMCh2Y2FyZFR5cGUpKSB7Ci0gICAgICAgICAgICAgICAgZWxlbS5hZGRFeHBlY3RlZE5vZGUoIlNPUlQtU1RSSU5HIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICJBcHByb3ByaWF0ZVBob25ldGljR2l2ZW4gQXBwcm9wcmlhdGVQaG9uZXRpY01pZGRsZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICsgIiBBcHByb3ByaWF0ZVBob25ldGljRmFtaWx5Iik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBlbGVtLmFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigiRk4iLCAiQXBwcm9wcmlhdGVEaXNwbGF5TmFtZSIpCi0gICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJYLVBIT05FVElDLUZJUlNULU5BTUUiLCAiQXBwcm9wcmlhdGVQaG9uZXRpY0dpdmVuIikKLSAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIlgtUEhPTkVUSUMtTUlERExFLU5BTUUiLCAiQXBwcm9wcmlhdGVQaG9uZXRpY01pZGRsZSIpCi0gICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJYLVBIT05FVElDLUxBU1QtTkFNRSIsICJBcHByb3ByaWF0ZVBob25ldGljRmFtaWx5Iik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFN0cnVjdHVyZWROYW1lUGhvbmV0aWNOYW1lVjIxKCkgewotICAgICAgICB0ZXN0U3RydWN0dXJlZE5hbWVQaG9uZXRpY05hbWVDb21tb24oVjIxKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0U3RydWN0dXJlZE5hbWVQaG9uZXRpY05hbWVWMzAoKSB7Ci0gICAgICAgIHRlc3RTdHJ1Y3R1cmVkTmFtZVBob25ldGljTmFtZUNvbW1vbihWMzApOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RTdHJ1Y3R1cmVkTmFtZVBob25ldGljTmFtZVY0MCgpIHsKLSAgICAgICAgdGVzdFN0cnVjdHVyZWROYW1lUGhvbmV0aWNOYW1lQ29tbW9uKFY0MCk7Ci0gICAgfQotCi0gICAgLy8gVE9ETzogbmVlZCB0byBhZGQgdGVzdCBjYXNlcyBjb25maXJtaW5nIGVzY2FwaW5nLCBlbXB0eSB2YWx1ZXMsIGV0Yy4KLQotICAgIC8qKgotICAgICAqIENvbmZpcm1zIGFsbCB0aGUgb3RoZXIgc2lkZXMgb2YgdGhlIGhhbmRsaW5nIGlzIGNvcnJlY3RseSBpbnRlcnByZXRlZCBhdCBvbmUgdGltZS4KLSAgICAgKgotICAgICAqIEEga2luZCBvZiByZWdyZXNzaW9uIHRlc3QgZm9yIFN0cnVjdHVyZWROYW1lIGhhbmRsaW5nLgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCB0ZXN0U3RydWN0dXJlZE5hbWVDb21wbGljYXRlZENvbW1vbihpbnQgdmNhcmRUeXBlKSB7Ci0gICAgICAgIG1WZXJpZmllci5pbml0Rm9yRXhwb3J0VGVzdCh2Y2FyZFR5cGUpOwotICAgICAgICBmaW5hbCBDb250YWN0RW50cnkgZW50cnkgPSBtVmVyaWZpZXIuYWRkSW5wdXRFbnRyeSgpOwotICAgICAgICBlbnRyeS5hZGRDb250ZW50VmFsdWVzKFN0cnVjdHVyZWROYW1lLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuRkFNSUxZX05BTUUsICJEb05vdEVtaXRGYW1pbHlOYW1lMSIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5HSVZFTl9OQU1FLCAiRG9Ob3RFbWl0R2l2ZW5OYW1lMSIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5NSURETEVfTkFNRSwgIkRvTm90RW1pdE1pZGRsZU5hbWUxIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLlBSRUZJWCwgIkRvTm90RW1pdFByZWZpeDEiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuU1VGRklYLCAiRG9Ob3RFbWl0U3VmZml4MSIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5QSE9ORVRJQ19GQU1JTFlfTkFNRSwgIkRvTm90RW1pdFBob25ldGljRmFtaWx5MSIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5QSE9ORVRJQ19HSVZFTl9OQU1FLCAiRG9Ob3RFbWl0UGhvbmV0aWNHaXZlbjEiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuUEhPTkVUSUNfTUlERExFX05BTUUsICJEb05vdEVtaXRQaG9uZXRpY01pZGRsZTEiKTsKLQotICAgICAgICAvLyBXaXRoICJJU19QUklNQVJZPTEiLCBidXQgd2Ugc2hvdWxkIGlnbm9yZSB0aGlzIHRpbWUuCi0gICAgICAgIGVudHJ5LmFkZENvbnRlbnRWYWx1ZXMoU3RydWN0dXJlZE5hbWUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5GQU1JTFlfTkFNRSwgIkRvTm90RW1pdEZhbWlseU5hbWUyIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLkdJVkVOX05BTUUsICJEb05vdEVtaXRHaXZlbk5hbWUyIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLk1JRERMRV9OQU1FLCAiRG9Ob3RFbWl0TWlkZGxlTmFtZTIiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuUFJFRklYLCAiRG9Ob3RFbWl0UHJlZml4MiIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5TVUZGSVgsICJEb05vdEVtaXRTdWZmaXgyIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLlBIT05FVElDX0ZBTUlMWV9OQU1FLCAiRG9Ob3RFbWl0UGhvbmV0aWNGYW1pbHkyIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLlBIT05FVElDX0dJVkVOX05BTUUsICJEb05vdEVtaXRQaG9uZXRpY0dpdmVuMiIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5QSE9ORVRJQ19NSURETEVfTkFNRSwgIkRvTm90RW1pdFBob25ldGljTWlkZGxlMiIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5JU19QUklNQVJZLCAxKTsKLQotICAgICAgICAvLyBXaXRoICJJU19TVVBFUl9QUklNQVJZPTEiLiBUaGlzIGlzIHdoYXQgd2Ugc2hvdWxkIHVzZS4KLSAgICAgICAgZW50cnkuYWRkQ29udGVudFZhbHVlcyhTdHJ1Y3R1cmVkTmFtZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLkZBTUlMWV9OQU1FLCAiQXBwcm9wcmlhdGVGYW1pbHlOYW1lIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLkdJVkVOX05BTUUsICJBcHByb3ByaWF0ZUdpdmVuTmFtZSIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5NSURETEVfTkFNRSwgIkFwcHJvcHJpYXRlTWlkZGxlTmFtZSIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5QUkVGSVgsICJBcHByb3ByaWF0ZVByZWZpeCIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5TVUZGSVgsICJBcHByb3ByaWF0ZVN1ZmZpeCIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5QSE9ORVRJQ19GQU1JTFlfTkFNRSwgIkFwcHJvcHJpYXRlUGhvbmV0aWNGYW1pbHkiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuUEhPTkVUSUNfR0lWRU5fTkFNRSwgIkFwcHJvcHJpYXRlUGhvbmV0aWNHaXZlbiIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5QSE9ORVRJQ19NSURETEVfTkFNRSwgIkFwcHJvcHJpYXRlUGhvbmV0aWNNaWRkbGUiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuSVNfU1VQRVJfUFJJTUFSWSwgMSk7Ci0KLSAgICAgICAgZW50cnkuYWRkQ29udGVudFZhbHVlcyhTdHJ1Y3R1cmVkTmFtZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLkZBTUlMWV9OQU1FLCAiRG9Ob3RFbWl0RmFtaWx5TmFtZTMiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuR0lWRU5fTkFNRSwgIkRvTm90RW1pdEdpdmVuTmFtZTMiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuTUlERExFX05BTUUsICJEb05vdEVtaXRNaWRkbGVOYW1lMyIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5QUkVGSVgsICJEb05vdEVtaXRQcmVmaXgzIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLlNVRkZJWCwgIkRvTm90RW1pdFN1ZmZpeDMiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuUEhPTkVUSUNfRkFNSUxZX05BTUUsICJEb05vdEVtaXRQaG9uZXRpY0ZhbWlseTMiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuUEhPTkVUSUNfR0lWRU5fTkFNRSwgIkRvTm90RW1pdFBob25ldGljR2l2ZW4zIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLlBIT05FVElDX01JRERMRV9OQU1FLCAiRG9Ob3RFbWl0UGhvbmV0aWNNaWRkbGUzIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLklTX1BSSU1BUlksIDEpOwotCi0gICAgICAgIGZpbmFsIFByb3BlcnR5Tm9kZXNWZXJpZmllckVsZW0gZWxlbSA9IG1WZXJpZmllci5hZGRQcm9wZXJ0eU5vZGVzVmVyaWZpZXJFbGVtKCk7Ci0gICAgICAgIGlmIChWQ2FyZENvbmZpZy5pc1ZlcnNpb240MCh2Y2FyZFR5cGUpKSB7Ci0gICAgICAgICAgICBmaW5hbCBDb250ZW50VmFsdWVzIGNvbnRlbnRWYWx1ZXMgPSBuZXcgQ29udGVudFZhbHVlcygpOwotICAgICAgICAgICAgY29udGVudFZhbHVlcy5wdXQoIlNPUlQtQVMiLAotICAgICAgICAgICAgICAgICAgICAiQXBwcm9wcmlhdGVGYW1pbHlOYW1lO0FwcHJvcHJpYXRlR2l2ZW5OYW1lO0FwcHJvcHJpYXRlTWlkZGxlTmFtZSIpOwotICAgICAgICAgICAgLy8gdkNhcmQgNC4wIChyZXYxMykgbm93IHVzZXMgU09SVC1BUyBwYXJhbWV0ZXIsIHdoaWNoIGlzIG5vdCBjb21wYXRpYmxlIHdpdGgKLSAgICAgICAgICAgIC8vIGVpdGhlciAyLjEgbm9yIDMuMC4KLSAgICAgICAgICAgIGVsZW0uYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJOIiwKLSAgICAgICAgICAgICAgICAgICAgIkFwcHJvcHJpYXRlRmFtaWx5TmFtZTtBcHByb3ByaWF0ZUdpdmVuTmFtZTtBcHByb3ByaWF0ZU1pZGRsZU5hbWU7IgotICAgICAgICAgICAgICAgICAgICArICJBcHByb3ByaWF0ZVByZWZpeDtBcHByb3ByaWF0ZVN1ZmZpeCIsCi0gICAgICAgICAgICAgICAgICAgIEFycmF5cy5hc0xpc3QoIkFwcHJvcHJpYXRlRmFtaWx5TmFtZSIsICJBcHByb3ByaWF0ZUdpdmVuTmFtZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFwcHJvcHJpYXRlTWlkZGxlTmFtZSIsICJBcHByb3ByaWF0ZVByZWZpeCIsICJBcHByb3ByaWF0ZVN1ZmZpeCIpLAotICAgICAgICAgICAgICAgICAgICBjb250ZW50VmFsdWVzKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGVsZW0uYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJOIiwKLSAgICAgICAgICAgICAgICAgICAgIkFwcHJvcHJpYXRlRmFtaWx5TmFtZTtBcHByb3ByaWF0ZUdpdmVuTmFtZTtBcHByb3ByaWF0ZU1pZGRsZU5hbWU7IgotICAgICAgICAgICAgICAgICAgICArICJBcHByb3ByaWF0ZVByZWZpeDtBcHByb3ByaWF0ZVN1ZmZpeCIsCi0gICAgICAgICAgICAgICAgICAgIEFycmF5cy5hc0xpc3QoIkFwcHJvcHJpYXRlRmFtaWx5TmFtZSIsICJBcHByb3ByaWF0ZUdpdmVuTmFtZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFwcHJvcHJpYXRlTWlkZGxlTmFtZSIsICJBcHByb3ByaWF0ZVByZWZpeCIsICJBcHByb3ByaWF0ZVN1ZmZpeCIpKTsKLSAgICAgICAgICAgIGlmIChWQ2FyZENvbmZpZy5pc1ZlcnNpb24zMCh2Y2FyZFR5cGUpKSB7Ci0gICAgICAgICAgICAgICAgZWxlbS5hZGRFeHBlY3RlZE5vZGUoIlNPUlQtU1RSSU5HIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICJBcHByb3ByaWF0ZVBob25ldGljR2l2ZW4gQXBwcm9wcmlhdGVQaG9uZXRpY01pZGRsZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICsgIiBBcHByb3ByaWF0ZVBob25ldGljRmFtaWx5Iik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBlbGVtLmFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigiRk4iLAotICAgICAgICAgICAgICAgICJBcHByb3ByaWF0ZVByZWZpeCBBcHByb3ByaWF0ZUdpdmVuTmFtZSAiCi0gICAgICAgICAgICAgICAgKyAiQXBwcm9wcmlhdGVNaWRkbGVOYW1lIEFwcHJvcHJpYXRlRmFtaWx5TmFtZSBBcHByb3ByaWF0ZVN1ZmZpeCIpCi0gICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJYLVBIT05FVElDLUZJUlNULU5BTUUiLCAiQXBwcm9wcmlhdGVQaG9uZXRpY0dpdmVuIikKLSAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIlgtUEhPTkVUSUMtTUlERExFLU5BTUUiLCAiQXBwcm9wcmlhdGVQaG9uZXRpY01pZGRsZSIpCi0gICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJYLVBIT05FVElDLUxBU1QtTkFNRSIsICJBcHByb3ByaWF0ZVBob25ldGljRmFtaWx5Iik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFN0cnVjdHVyZWROYW1lQ29tcGxpY2F0ZWRWMjEoKSB7Ci0gICAgICAgIHRlc3RTdHJ1Y3R1cmVkTmFtZUNvbXBsaWNhdGVkQ29tbW9uKFYyMSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFN0cnVjdHVyZWROYW1lQ29tcGxpY2F0ZWRWMzAoKSB7Ci0gICAgICAgIHRlc3RTdHJ1Y3R1cmVkTmFtZUNvbXBsaWNhdGVkQ29tbW9uKFYzMCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFN0cnVjdHVyZWROYW1lQ29tcGxpY2F0ZWRWNDAoKSB7Ci0gICAgICAgIHRlc3RTdHJ1Y3R1cmVkTmFtZUNvbXBsaWNhdGVkQ29tbW9uKFY0MCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdE5pY2tOYW1lVjMwKCkgewotICAgICAgICBtVmVyaWZpZXIuaW5pdEZvckV4cG9ydFRlc3QoVjMwKTsKLSAgICAgICAgbVZlcmlmaWVyLmFkZElucHV0RW50cnkoKS5hZGRDb250ZW50VmFsdWVzKE5pY2tuYW1lLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoTmlja25hbWUuTkFNRSwgIk5pY2t5Iik7Ci0KLSAgICAgICAgbVZlcmlmaWVyLmFkZFByb3BlcnR5Tm9kZXNWZXJpZmllckVsZW1XaXRoRW1wdHlOYW1lKCkKLSAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGVXaXRoT3JkZXIoIk5JQ0tOQU1FIiwgIk5pY2t5Iik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdE5pY2tOYW1lVjQwKCkgewotICAgICAgICBtVmVyaWZpZXIuaW5pdEZvckV4cG9ydFRlc3QoVjQwKTsKLSAgICAgICAgbVZlcmlmaWVyLmFkZElucHV0RW50cnkoKS5hZGRDb250ZW50VmFsdWVzKE5pY2tuYW1lLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoTmlja25hbWUuTkFNRSwgIk5pY2t5Iik7Ci0KLSAgICAgICAgbVZlcmlmaWVyLmFkZFByb3BlcnR5Tm9kZXNWZXJpZmllckVsZW1XaXRoRW1wdHlOYW1lKCkKLSAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGVXaXRoT3JkZXIoIk5JQ0tOQU1FIiwgIk5pY2t5Iik7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHRlc3RQaG9uZUJhc2ljQ29tbW9uKGludCB2Y2FyZFR5cGUpIHsKLSAgICAgICAgbVZlcmlmaWVyLmluaXRGb3JFeHBvcnRUZXN0KHZjYXJkVHlwZSk7Ci0gICAgICAgIG1WZXJpZmllci5hZGRJbnB1dEVudHJ5KCkuYWRkQ29udGVudFZhbHVlcyhQaG9uZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLk5VTUJFUiwgIjEiKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuVFlQRSwgUGhvbmUuVFlQRV9IT01FKTsKLSAgICAgICAgbVZlcmlmaWVyLmFkZFByb3BlcnR5Tm9kZXNWZXJpZmllckVsZW1XaXRoRW1wdHlOYW1lKCkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJURUwiLCAiMSIsIG5ldyBUeXBlU2V0KCJIT01FIikpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RQaG9uZUJhc2ljVjIxKCkgewotICAgICAgICB0ZXN0UGhvbmVCYXNpY0NvbW1vbihWMjEpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RQaG9uZUJhc2ljVjMwKCkgewotICAgICAgICB0ZXN0UGhvbmVCYXNpY0NvbW1vbihWMzApOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RQaG9uZUJhc2ljVjQwKCkgewotICAgICAgICB0ZXN0UGhvbmVCYXNpY0NvbW1vbihWNDApOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RQaG9uZVJlZnJhaW5Gb3JtYXR0aW5nKCkgewotICAgICAgICBtVmVyaWZpZXIuaW5pdEZvckV4cG9ydFRlc3QoVjIxIHwgVkNhcmRDb25maWcuRkxBR19SRUZSQUlOX1BIT05FX05VTUJFUl9GT1JNQVRUSU5HKTsKLSAgICAgICAgbVZlcmlmaWVyLmFkZElucHV0RW50cnkoKS5hZGRDb250ZW50VmFsdWVzKFBob25lLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuTlVNQkVSLCAiMTIzNDU2Nzg5MChhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eikiKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuVFlQRSwgUGhvbmUuVFlQRV9IT01FKTsKLSAgICAgICAgbVZlcmlmaWVyLmFkZFByb3BlcnR5Tm9kZXNWZXJpZmllckVsZW1XaXRoRW1wdHlOYW1lKCkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJURUwiLCAiMTIzNDU2Nzg5MChhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eikiLAotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFR5cGVTZXQoIkhPTUUiKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGVzdHMgdGhhdCB2Q2FyZCBjb21wb3NlciBlbWl0cyBjb3JyZXNwb25kaW5nIHR5cGUgcGFyYW0gd2hpY2ggd2UgZXhwZWN0LgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCB0ZXN0UGhvbmVWYXJpb3VzVHlwZVN1cHBvcnQoaW50IHZjYXJkVHlwZSkgewotICAgICAgICBtVmVyaWZpZXIuaW5pdEZvckV4cG9ydFRlc3QodmNhcmRUeXBlKTsKLSAgICAgICAgQ29udGFjdEVudHJ5IGVudHJ5ID0gbVZlcmlmaWVyLmFkZElucHV0RW50cnkoKTsKLSAgICAgICAgZW50cnkuYWRkQ29udGVudFZhbHVlcyhQaG9uZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLk5VTUJFUiwgIjEwIikKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLlRZUEUsIFBob25lLlRZUEVfSE9NRSk7Ci0gICAgICAgIGVudHJ5LmFkZENvbnRlbnRWYWx1ZXMoUGhvbmUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5OVU1CRVIsICIyMCIpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5UWVBFLCBQaG9uZS5UWVBFX1dPUkspOwotICAgICAgICBlbnRyeS5hZGRDb250ZW50VmFsdWVzKFBob25lLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuTlVNQkVSLCAiMzAiKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuVFlQRSwgUGhvbmUuVFlQRV9GQVhfSE9NRSk7Ci0gICAgICAgIGVudHJ5LmFkZENvbnRlbnRWYWx1ZXMoUGhvbmUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5OVU1CRVIsICI0MCIpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5UWVBFLCBQaG9uZS5UWVBFX0ZBWF9XT1JLKTsKLSAgICAgICAgZW50cnkuYWRkQ29udGVudFZhbHVlcyhQaG9uZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLk5VTUJFUiwgIjUwIikKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLlRZUEUsIFBob25lLlRZUEVfTU9CSUxFKTsKLSAgICAgICAgZW50cnkuYWRkQ29udGVudFZhbHVlcyhQaG9uZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLk5VTUJFUiwgIjYwIikKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLlRZUEUsIFBob25lLlRZUEVfUEFHRVIpOwotICAgICAgICBlbnRyeS5hZGRDb250ZW50VmFsdWVzKFBob25lLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuTlVNQkVSLCAiNzAiKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuVFlQRSwgUGhvbmUuVFlQRV9PVEhFUik7Ci0gICAgICAgIGVudHJ5LmFkZENvbnRlbnRWYWx1ZXMoUGhvbmUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5OVU1CRVIsICI4MCIpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5UWVBFLCBQaG9uZS5UWVBFX0NBUik7Ci0gICAgICAgIGVudHJ5LmFkZENvbnRlbnRWYWx1ZXMoUGhvbmUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5OVU1CRVIsICI5MCIpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5UWVBFLCBQaG9uZS5UWVBFX0NPTVBBTllfTUFJTik7Ci0gICAgICAgIGVudHJ5LmFkZENvbnRlbnRWYWx1ZXMoUGhvbmUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5OVU1CRVIsICIxMDAiKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuVFlQRSwgUGhvbmUuVFlQRV9JU0ROKTsKLSAgICAgICAgZW50cnkuYWRkQ29udGVudFZhbHVlcyhQaG9uZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLk5VTUJFUiwgIjExMCIpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5UWVBFLCBQaG9uZS5UWVBFX01BSU4pOwotICAgICAgICBlbnRyeS5hZGRDb250ZW50VmFsdWVzKFBob25lLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuTlVNQkVSLCAiMTIwIikKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLlRZUEUsIFBob25lLlRZUEVfT1RIRVJfRkFYKTsKLSAgICAgICAgZW50cnkuYWRkQ29udGVudFZhbHVlcyhQaG9uZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLk5VTUJFUiwgIjEzMCIpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5UWVBFLCBQaG9uZS5UWVBFX1RFTEVYKTsKLSAgICAgICAgZW50cnkuYWRkQ29udGVudFZhbHVlcyhQaG9uZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLk5VTUJFUiwgIjE0MCIpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5UWVBFLCBQaG9uZS5UWVBFX1dPUktfTU9CSUxFKTsKLSAgICAgICAgZW50cnkuYWRkQ29udGVudFZhbHVlcyhQaG9uZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLk5VTUJFUiwgIjE1MCIpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5UWVBFLCBQaG9uZS5UWVBFX1dPUktfUEFHRVIpOwotICAgICAgICBlbnRyeS5hZGRDb250ZW50VmFsdWVzKFBob25lLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuTlVNQkVSLCAiMTYwIikKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLlRZUEUsIFBob25lLlRZUEVfTU1TKTsKLQotICAgICAgICBtVmVyaWZpZXIuYWRkUHJvcGVydHlOb2Rlc1ZlcmlmaWVyRWxlbVdpdGhFbXB0eU5hbWUoKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIlRFTCIsICIxMCIsIG5ldyBUeXBlU2V0KCJIT01FIikpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiVEVMIiwgIjIwIiwgbmV3IFR5cGVTZXQoIldPUksiKSkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJURUwiLCAiMzAiLCBuZXcgVHlwZVNldCgiSE9NRSIsICJGQVgiKSkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJURUwiLCAiNDAiLCBuZXcgVHlwZVNldCgiV09SSyIsICJGQVgiKSkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJURUwiLCAiNTAiLCBuZXcgVHlwZVNldCgiQ0VMTCIpKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIlRFTCIsICI2MCIsIG5ldyBUeXBlU2V0KCJQQUdFUiIpKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIlRFTCIsICI3MCIsIG5ldyBUeXBlU2V0KCJWT0lDRSIpKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIlRFTCIsICI4MCIsIG5ldyBUeXBlU2V0KCJDQVIiKSkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJURUwiLCAiOTAiLCBuZXcgVHlwZVNldCgiV09SSyIsICJQUkVGIikpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiVEVMIiwgIjEwMCIsIG5ldyBUeXBlU2V0KCJJU0ROIikpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiVEVMIiwgIjExMCIsIG5ldyBUeXBlU2V0KCJQUkVGIikpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiVEVMIiwgIjEyMCIsIG5ldyBUeXBlU2V0KCJGQVgiKSkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJURUwiLCAiMTMwIiwgbmV3IFR5cGVTZXQoIlRMWCIpKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIlRFTCIsICIxNDAiLCBuZXcgVHlwZVNldCgiV09SSyIsICJDRUxMIikpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiVEVMIiwgIjE1MCIsIG5ldyBUeXBlU2V0KCJXT1JLIiwgIlBBR0VSIikpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiVEVMIiwgIjE2MCIsIG5ldyBUeXBlU2V0KCJNU0ciKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFBob25lVmFyaW91c1R5cGVTdXBwb3J0VjIxKCkgewotICAgICAgICB0ZXN0UGhvbmVWYXJpb3VzVHlwZVN1cHBvcnQoVjIxKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UGhvbmVWYXJpb3VzVHlwZVN1cHBvcnRWMzAoKSB7Ci0gICAgICAgIHRlc3RQaG9uZVZhcmlvdXNUeXBlU3VwcG9ydChWMzApOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RQaG9uZVZhcmlvdXNUeXBlU3VwcG9ydFY0MCgpIHsKLSAgICAgICAgdGVzdFBob25lVmFyaW91c1R5cGVTdXBwb3J0KFY0MCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGVzdHMgdGhhdCAiUFJFRiJzIGFyZSBlbWl0dGVkIGFwcHJvcHJpYXRlbHkuCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHRlc3RQaG9uZVByZWZIYW5kbGluZ0NvbW1vbihpbnQgdmNhcmRUeXBlKSB7Ci0gICAgICAgIG1WZXJpZmllci5pbml0Rm9yRXhwb3J0VGVzdCh2Y2FyZFR5cGUpOwotICAgICAgICBDb250YWN0RW50cnkgZW50cnkgPSBtVmVyaWZpZXIuYWRkSW5wdXRFbnRyeSgpOwotICAgICAgICBlbnRyeS5hZGRDb250ZW50VmFsdWVzKFBob25lLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuTlVNQkVSLCAiMSIpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5UWVBFLCBQaG9uZS5UWVBFX0hPTUUpOwotICAgICAgICBlbnRyeS5hZGRDb250ZW50VmFsdWVzKFBob25lLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuTlVNQkVSLCAiMiIpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5UWVBFLCBQaG9uZS5UWVBFX1dPUkspCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5JU19QUklNQVJZLCAxKTsKLSAgICAgICAgZW50cnkuYWRkQ29udGVudFZhbHVlcyhQaG9uZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLk5VTUJFUiwgIjMiKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuVFlQRSwgUGhvbmUuVFlQRV9GQVhfSE9NRSkKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLklTX1BSSU1BUlksIDEpOwotICAgICAgICBlbnRyeS5hZGRDb250ZW50VmFsdWVzKFBob25lLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuTlVNQkVSLCAiNCIpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5UWVBFLCBQaG9uZS5UWVBFX0ZBWF9XT1JLKTsKLQotICAgICAgICBtVmVyaWZpZXIuYWRkUHJvcGVydHlOb2Rlc1ZlcmlmaWVyRWxlbVdpdGhFbXB0eU5hbWUoKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIlRFTCIsICI0IiwgbmV3IFR5cGVTZXQoIldPUksiLCAiRkFYIikpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiVEVMIiwgIjMiLCBuZXcgVHlwZVNldCgiSE9NRSIsICJGQVgiLCAiUFJFRiIpKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIlRFTCIsICIyIiwgbmV3IFR5cGVTZXQoIldPUksiLCAiUFJFRiIpKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIlRFTCIsICIxIiwgbmV3IFR5cGVTZXQoIkhPTUUiKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFBob25lUHJlZkhhbmRsaW5nVjIxKCkgewotICAgICAgICB0ZXN0UGhvbmVQcmVmSGFuZGxpbmdDb21tb24oVjIxKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UGhvbmVQcmVmSGFuZGxpbmdWMzAoKSB7Ci0gICAgICAgIHRlc3RQaG9uZVByZWZIYW5kbGluZ0NvbW1vbihWMzApOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RQaG9uZVByZWZIYW5kbGluZ1Y0MCgpIHsKLSAgICAgICAgdGVzdFBob25lUHJlZkhhbmRsaW5nQ29tbW9uKFY0MCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHRlc3RNaXNjUGhvbmVUeXBlSGFuZGxpbmcoaW50IHZjYXJkVHlwZSkgewotICAgICAgICBtVmVyaWZpZXIuaW5pdEZvckV4cG9ydFRlc3QodmNhcmRUeXBlKTsKLSAgICAgICAgQ29udGFjdEVudHJ5IGVudHJ5ID0gbVZlcmlmaWVyLmFkZElucHV0RW50cnkoKTsKLSAgICAgICAgZW50cnkuYWRkQ29udGVudFZhbHVlcyhQaG9uZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLk5VTUJFUiwgIjEiKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuVFlQRSwgUGhvbmUuVFlQRV9DVVNUT00pCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5MQUJFTCwgIk1vZGVtIik7Ci0gICAgICAgIGVudHJ5LmFkZENvbnRlbnRWYWx1ZXMoUGhvbmUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5OVU1CRVIsICIyIikKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLlRZUEUsIFBob25lLlRZUEVfQ1VTVE9NKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuTEFCRUwsICJNU0ciKTsKLSAgICAgICAgZW50cnkuYWRkQ29udGVudFZhbHVlcyhQaG9uZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLk5VTUJFUiwgIjMiKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuVFlQRSwgUGhvbmUuVFlQRV9DVVNUT00pCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5MQUJFTCwgIkJCUyIpOwotICAgICAgICBlbnRyeS5hZGRDb250ZW50VmFsdWVzKFBob25lLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuTlVNQkVSLCAiNCIpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5UWVBFLCBQaG9uZS5UWVBFX0NVU1RPTSkKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLkxBQkVMLCAiVklERU8iKTsKLSAgICAgICAgZW50cnkuYWRkQ29udGVudFZhbHVlcyhQaG9uZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLk5VTUJFUiwgIjUiKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuVFlQRSwgUGhvbmUuVFlQRV9DVVNUT00pOwotICAgICAgICBlbnRyeS5hZGRDb250ZW50VmFsdWVzKFBob25lLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuTlVNQkVSLCAiNiIpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5UWVBFLCBQaG9uZS5UWVBFX0NVU1RPTSkKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLkxBQkVMLCAiX0FVVE9fQ0VMTCIpOyAgLy8gVGhlIG9sZCBpbmRpY2F0b3IgZm9yIHRoZSB0eXBlIG1vYmlsZS4KLSAgICAgICAgZW50cnkuYWRkQ29udGVudFZhbHVlcyhQaG9uZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLk5VTUJFUiwgIjciKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuVFlQRSwgUGhvbmUuVFlQRV9DVVNUT00pCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5MQUJFTCwgIlx1NjQzQVx1NUUyRiIpOyAgLy8gTW9iaWxlIHBob25lIGluIEphcGFuZXNlIEthbmppCi0gICAgICAgIGVudHJ5LmFkZENvbnRlbnRWYWx1ZXMoUGhvbmUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5OVU1CRVIsICI4IikKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLlRZUEUsIFBob25lLlRZUEVfQ1VTVE9NKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuTEFCRUwsICJpbnZhbGlkIik7Ci0gICAgICAgIFByb3BlcnR5Tm9kZXNWZXJpZmllckVsZW0gZWxlbSA9IG1WZXJpZmllci5hZGRQcm9wZXJ0eU5vZGVzVmVyaWZpZXJFbGVtV2l0aEVtcHR5TmFtZSgpOwotICAgICAgICBpZiAoVkNhcmRDb25maWcuaXNWZXJzaW9uMzAodmNhcmRUeXBlKSB8fCBWQ2FyZENvbmZpZy5pc1ZlcnNpb240MCh2Y2FyZFR5cGUpKSB7Ci0gICAgICAgICAgICAvLyB2Q2FyZCAzLjAgYWNjZXB0cyAiaW52YWxpZCIuIEFsc28gc3RvcCB1c2luZyB0b1VwcGVyKCkKLSAgICAgICAgICAgIGVsZW0uYWRkRXhwZWN0ZWROb2RlKCJURUwiLCAiMSIsIG5ldyBUeXBlU2V0KCJNb2RlbSIpKQotICAgICAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJURUwiLCAiMiIsIG5ldyBUeXBlU2V0KCJNU0ciKSkKLSAgICAgICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiVEVMIiwgIjMiLCBuZXcgVHlwZVNldCgiQkJTIikpCi0gICAgICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIlRFTCIsICI0IiwgbmV3IFR5cGVTZXQoIlZJREVPIikpCi0gICAgICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIlRFTCIsICI1IiwgbmV3IFR5cGVTZXQoIlZPSUNFIikpCi0gICAgICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIlRFTCIsICI2IiwgbmV3IFR5cGVTZXQoIkNFTEwiKSkKLSAgICAgICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiVEVMIiwgIjciLCBuZXcgVHlwZVNldCgiQ0VMTCIpKQotICAgICAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJURUwiLCAiOCIsIG5ldyBUeXBlU2V0KCJpbnZhbGlkIikpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgZWxlbS5hZGRFeHBlY3RlZE5vZGUoIlRFTCIsICIxIiwgbmV3IFR5cGVTZXQoIk1PREVNIikpCi0gICAgICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIlRFTCIsICIyIiwgbmV3IFR5cGVTZXQoIk1TRyIpKQotICAgICAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJURUwiLCAiMyIsIG5ldyBUeXBlU2V0KCJCQlMiKSkKLSAgICAgICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiVEVMIiwgIjQiLCBuZXcgVHlwZVNldCgiVklERU8iKSkKLSAgICAgICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiVEVMIiwgIjUiLCBuZXcgVHlwZVNldCgiVk9JQ0UiKSkKLSAgICAgICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiVEVMIiwgIjYiLCBuZXcgVHlwZVNldCgiQ0VMTCIpKQotICAgICAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJURUwiLCAiNyIsIG5ldyBUeXBlU2V0KCJDRUxMIikpCi0gICAgICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIlRFTCIsICI4IiwgbmV3IFR5cGVTZXQoIlgtaW52YWxpZCIpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RQaG9uZVR5cGVIYW5kbGluZ1YyMSgpIHsKLSAgICAgICAgdGVzdE1pc2NQaG9uZVR5cGVIYW5kbGluZyhWMjEpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RQaG9uZVR5cGVIYW5kbGluZ1YzMCgpIHsKLSAgICAgICAgdGVzdE1pc2NQaG9uZVR5cGVIYW5kbGluZyhWMzApOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RQaG9uZVR5cGVIYW5kbGluZ1Y0MCgpIHsKLSAgICAgICAgdGVzdE1pc2NQaG9uZVR5cGVIYW5kbGluZyhWNDApOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCB0ZXN0RW1haWxCYXNpY0NvbW1vbihpbnQgdmNhcmRUeXBlKSB7Ci0gICAgICAgIG1WZXJpZmllci5pbml0Rm9yRXhwb3J0VGVzdCh2Y2FyZFR5cGUpOwotICAgICAgICBtVmVyaWZpZXIuYWRkSW5wdXRFbnRyeSgpLmFkZENvbnRlbnRWYWx1ZXMoRW1haWwuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChFbWFpbC5EQVRBLCAic2FtcGxlQGV4YW1wbGUuY29tIik7Ci0gICAgICAgIG1WZXJpZmllci5hZGRQcm9wZXJ0eU5vZGVzVmVyaWZpZXJFbGVtV2l0aEVtcHR5TmFtZSgpCi0gICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJFTUFJTCIsICJzYW1wbGVAZXhhbXBsZS5jb20iKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RW1haWxCYXNpY1YyMSgpIHsKLSAgICAgICAgdGVzdEVtYWlsQmFzaWNDb21tb24oVjIxKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RW1haWxCYXNpY1YzMCgpIHsKLSAgICAgICAgdGVzdEVtYWlsQmFzaWNDb21tb24oVjMwKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RW1haWxCYXNpY1Y0MCgpIHsKLSAgICAgICAgdGVzdEVtYWlsQmFzaWNDb21tb24oVjQwKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgdGVzdEVtYWlsVmFyaW91c1R5cGVTdXBwb3J0Q29tbW9uKGludCB2Y2FyZFR5cGUpIHsKLSAgICAgICAgbVZlcmlmaWVyLmluaXRGb3JFeHBvcnRUZXN0KHZjYXJkVHlwZSk7Ci0gICAgICAgIENvbnRhY3RFbnRyeSBlbnRyeSA9IG1WZXJpZmllci5hZGRJbnB1dEVudHJ5KCk7Ci0gICAgICAgIGVudHJ5LmFkZENvbnRlbnRWYWx1ZXMoRW1haWwuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChFbWFpbC5EQVRBLCAidHlwZV9ob21lQGV4YW1wbGUuY29tIikKLSAgICAgICAgICAgICAgICAucHV0KEVtYWlsLlRZUEUsIEVtYWlsLlRZUEVfSE9NRSk7Ci0gICAgICAgIGVudHJ5LmFkZENvbnRlbnRWYWx1ZXMoRW1haWwuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChFbWFpbC5EQVRBLCAidHlwZV93b3JrQGV4YW1wbGUuY29tIikKLSAgICAgICAgICAgICAgICAucHV0KEVtYWlsLlRZUEUsIEVtYWlsLlRZUEVfV09SSyk7Ci0gICAgICAgIGVudHJ5LmFkZENvbnRlbnRWYWx1ZXMoRW1haWwuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChFbWFpbC5EQVRBLCAidHlwZV9tb2JpbGVAZXhhbXBsZS5jb20iKQotICAgICAgICAgICAgICAgIC5wdXQoRW1haWwuVFlQRSwgRW1haWwuVFlQRV9NT0JJTEUpOwotICAgICAgICBlbnRyeS5hZGRDb250ZW50VmFsdWVzKEVtYWlsLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoRW1haWwuREFUQSwgInR5cGVfb3RoZXJAZXhhbXBsZS5jb20iKQotICAgICAgICAgICAgICAgIC5wdXQoRW1haWwuVFlQRSwgRW1haWwuVFlQRV9PVEhFUik7Ci0gICAgICAgIG1WZXJpZmllci5hZGRQcm9wZXJ0eU5vZGVzVmVyaWZpZXJFbGVtV2l0aEVtcHR5TmFtZSgpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiRU1BSUwiLCAidHlwZV9ob21lQGV4YW1wbGUuY29tIiwgbmV3IFR5cGVTZXQoIkhPTUUiKSkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJFTUFJTCIsICJ0eXBlX3dvcmtAZXhhbXBsZS5jb20iLCBuZXcgVHlwZVNldCgiV09SSyIpKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIkVNQUlMIiwgInR5cGVfbW9iaWxlQGV4YW1wbGUuY29tIiwgbmV3IFR5cGVTZXQoIkNFTEwiKSkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJFTUFJTCIsICJ0eXBlX290aGVyQGV4YW1wbGUuY29tIik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEVtYWlsVmFyaW91c1R5cGVTdXBwb3J0VjIxKCkgewotICAgICAgICB0ZXN0RW1haWxWYXJpb3VzVHlwZVN1cHBvcnRDb21tb24oVjIxKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RW1haWxWYXJpb3VzVHlwZVN1cHBvcnRWMzAoKSB7Ci0gICAgICAgIHRlc3RFbWFpbFZhcmlvdXNUeXBlU3VwcG9ydENvbW1vbihWMzApOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RFbWFpbFZhcmlvdXNUeXBlU3VwcG9ydFY0MCgpIHsKLSAgICAgICAgdGVzdEVtYWlsVmFyaW91c1R5cGVTdXBwb3J0Q29tbW9uKFY0MCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHRlc3RFbWFpbFByZWZIYW5kbGluZ0NvbW1vbihpbnQgdmNhcmRUeXBlKSB7Ci0gICAgICAgIG1WZXJpZmllci5pbml0Rm9yRXhwb3J0VGVzdCh2Y2FyZFR5cGUpOwotICAgICAgICBDb250YWN0RW50cnkgZW50cnkgPSBtVmVyaWZpZXIuYWRkSW5wdXRFbnRyeSgpOwotICAgICAgICBlbnRyeS5hZGRDb250ZW50VmFsdWVzKEVtYWlsLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoRW1haWwuREFUQSwgInR5cGVfaG9tZUBleGFtcGxlLmNvbSIpCi0gICAgICAgICAgICAgICAgLnB1dChFbWFpbC5UWVBFLCBFbWFpbC5UWVBFX0hPTUUpCi0gICAgICAgICAgICAgICAgLnB1dChFbWFpbC5JU19QUklNQVJZLCAxKTsKLSAgICAgICAgZW50cnkuYWRkQ29udGVudFZhbHVlcyhFbWFpbC5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KEVtYWlsLkRBVEEsICJ0eXBlX25vdHlwZUBleGFtcGxlLmNvbSIpCi0gICAgICAgICAgICAgICAgLnB1dChFbWFpbC5JU19QUklNQVJZLCAxKTsKLQotICAgICAgICBtVmVyaWZpZXIuYWRkUHJvcGVydHlOb2Rlc1ZlcmlmaWVyRWxlbVdpdGhFbXB0eU5hbWUoKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIkVNQUlMIiwgInR5cGVfbm90eXBlQGV4YW1wbGUuY29tIiwgbmV3IFR5cGVTZXQoIlBSRUYiKSkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJFTUFJTCIsICJ0eXBlX2hvbWVAZXhhbXBsZS5jb20iLCBuZXcgVHlwZVNldCgiSE9NRSIsICJQUkVGIikpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RFbWFpbFByZWZIYW5kbGluZ1YyMSgpIHsKLSAgICAgICAgdGVzdEVtYWlsUHJlZkhhbmRsaW5nQ29tbW9uKFYyMSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEVtYWlsUHJlZkhhbmRsaW5nVjMwKCkgewotICAgICAgICB0ZXN0RW1haWxQcmVmSGFuZGxpbmdDb21tb24oVjMwKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RW1haWxQcmVmSGFuZGxpbmdWNDAoKSB7Ci0gICAgICAgIHRlc3RFbWFpbFByZWZIYW5kbGluZ0NvbW1vbihWNDApOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCB0ZXN0UG9zdGFsQWRkcmVzc0NvbW1vbihpbnQgdmNhcmRUeXBlKSB7Ci0gICAgICAgIG1WZXJpZmllci5pbml0Rm9yRXhwb3J0VGVzdCh2Y2FyZFR5cGUpOwotICAgICAgICBtVmVyaWZpZXIuYWRkSW5wdXRFbnRyeSgpLmFkZENvbnRlbnRWYWx1ZXMoU3RydWN0dXJlZFBvc3RhbC5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWRQb3N0YWwuUE9CT1gsICJQb2JveCIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkUG9zdGFsLk5FSUdIQk9SSE9PRCwgIk5laWdoYm9yaG9vZCIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkUG9zdGFsLlNUUkVFVCwgIlN0cmVldCIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkUG9zdGFsLkNJVFksICJDaXR5IikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWRQb3N0YWwuUkVHSU9OLCAiUmVnaW9uIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWRQb3N0YWwuUE9TVENPREUsICIxMDAiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZFBvc3RhbC5DT1VOVFJZLCAiQ291bnRyeSIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkUG9zdGFsLkZPUk1BVFRFRF9BRERSRVNTLCAiRm9ybWF0dGVkIEFkZHJlc3MiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZFBvc3RhbC5UWVBFLCBTdHJ1Y3R1cmVkUG9zdGFsLlRZUEVfV09SSyk7Ci0gICAgICAgIC8vIGFkci12YWx1ZSAgICA9IDAqNih0ZXh0LXZhbHVlICI7IikgdGV4dC12YWx1ZQotICAgICAgICAvLyAgICAgICAgICAgICAgOyBQTyBCb3gsIEV4dGVuZGVkIEFkZHJlc3MsIFN0cmVldCwgTG9jYWxpdHksIFJlZ2lvbiwgUG9zdGFsIENvZGUsCi0gICAgICAgIC8vICAgICAgICAgICAgICA7IENvdW50cnkgTmFtZQotICAgICAgICAvLwotICAgICAgICAvLyBUaGUgTkVJR0hCT1JIT09EIGZpZWxkIGlzIGFwcGVuZGVkIGFmdGVyIHRoZSBDSVRZIGZpZWxkLgotICAgICAgICBtVmVyaWZpZXIuYWRkUHJvcGVydHlOb2Rlc1ZlcmlmaWVyRWxlbVdpdGhFbXB0eU5hbWUoKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIkFEUiIsCi0gICAgICAgICAgICAgICAgICAgICAgICBBcnJheXMuYXNMaXN0KCJQb2JveCIsICIiLCAiU3RyZWV0IiwgIkNpdHkgTmVpZ2hib3Job29kIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlJlZ2lvbiIsICIxMDAiLCAiQ291bnRyeSIpLCBuZXcgVHlwZVNldCgiV09SSyIpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UG9zdGFsQWRkcmVzc1YyMSgpIHsKLSAgICAgICAgdGVzdFBvc3RhbEFkZHJlc3NDb21tb24oVjIxKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UG9zdGFsQWRkcmVzc1YzMCgpIHsKLSAgICAgICAgdGVzdFBvc3RhbEFkZHJlc3NDb21tb24oVjMwKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UG9zdGFsQWRkcmVzc1Y0MCgpIHsKLSAgICAgICAgdGVzdFBvc3RhbEFkZHJlc3NDb21tb24oVjQwKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgdGVzdFBvc3RhbEFkZHJlc3NOb25OZWlnaGJvcmhvb2QoaW50IHZjYXJkVHlwZSkgewotICAgICAgICBtVmVyaWZpZXIuaW5pdEZvckV4cG9ydFRlc3QodmNhcmRUeXBlKTsKLSAgICAgICAgbVZlcmlmaWVyLmFkZElucHV0RW50cnkoKS5hZGRDb250ZW50VmFsdWVzKFN0cnVjdHVyZWRQb3N0YWwuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkUG9zdGFsLkNJVFksICJDaXR5Iik7Ci0gICAgICAgIG1WZXJpZmllci5hZGRQcm9wZXJ0eU5vZGVzVmVyaWZpZXJFbGVtV2l0aEVtcHR5TmFtZSgpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiQURSIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5cy5hc0xpc3QoIiIsICIiLCAiIiwgIkNpdHkiLCAiIiwgIiIsICIiKSwgbmV3IFR5cGVTZXQoIkhPTUUiKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFBvc3RhbEFkZHJlc3NOb25OZWlnaGJvcmhvb2RWMjEoKSB7Ci0gICAgICAgIHRlc3RQb3N0YWxBZGRyZXNzTm9uTmVpZ2hib3Job29kKFYyMSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFBvc3RhbEFkZHJlc3NOb25OZWlnaGJvcmhvb2RWMzAoKSB7Ci0gICAgICAgIHRlc3RQb3N0YWxBZGRyZXNzTm9uTmVpZ2hib3Job29kKFYzMCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFBvc3RhbEFkZHJlc3NOb25OZWlnaGJvcmhvb2RWNDAoKSB7Ci0gICAgICAgIHRlc3RQb3N0YWxBZGRyZXNzTm9uTmVpZ2hib3Job29kKFY0MCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHRlc3RQb3N0YWxBZGRyZXNzTm9uQ2l0eShpbnQgdmNhcmRUeXBlKSB7Ci0gICAgICAgIG1WZXJpZmllci5pbml0Rm9yRXhwb3J0VGVzdCh2Y2FyZFR5cGUpOwotICAgICAgICBtVmVyaWZpZXIuYWRkSW5wdXRFbnRyeSgpLmFkZENvbnRlbnRWYWx1ZXMoU3RydWN0dXJlZFBvc3RhbC5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWRQb3N0YWwuTkVJR0hCT1JIT09ELCAiTmVpZ2hib3Job29kIik7Ci0gICAgICAgIG1WZXJpZmllci5hZGRQcm9wZXJ0eU5vZGVzVmVyaWZpZXJFbGVtV2l0aEVtcHR5TmFtZSgpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiQURSIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5cy5hc0xpc3QoIiIsICIiLCAiIiwgIk5laWdoYm9yaG9vZCIsICIiLCAiIiwgIiIpLCBuZXcgVHlwZVNldCgiSE9NRSIpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UG9zdGFsQWRkcmVzc05vbkNpdHlWMjEoKSB7Ci0gICAgICAgIHRlc3RQb3N0YWxBZGRyZXNzTm9uQ2l0eShWMjEpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RQb3N0YWxBZGRyZXNzTm9uQ2l0eVYzMCgpIHsKLSAgICAgICAgdGVzdFBvc3RhbEFkZHJlc3NOb25DaXR5KFYzMCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFBvc3RhbEFkZHJlc3NOb25DaXR5VjQwKCkgewotICAgICAgICB0ZXN0UG9zdGFsQWRkcmVzc05vbkNpdHkoVjQwKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgdGVzdFBvc3RhbE9ubHlXaXRoRm9ybWF0dGVkQWRkcmVzc0NvbW1vbihpbnQgdmNhcmRUeXBlKSB7Ci0gICAgICAgIG1WZXJpZmllci5pbml0Rm9yRXhwb3J0VGVzdCh2Y2FyZFR5cGUpOwotICAgICAgICBtVmVyaWZpZXIuYWRkSW5wdXRFbnRyeSgpLmFkZENvbnRlbnRWYWx1ZXMoU3RydWN0dXJlZFBvc3RhbC5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWRQb3N0YWwuUkVHSU9OLCAiIikgIC8vIE11c3QgYmUgaWdub3JlZC4KLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWRQb3N0YWwuRk9STUFUVEVEX0FERFJFU1MsCi0gICAgICAgICAgICAgICAgIkZvcm1hdHRlZCBhZGRyZXNzIENBIDEyMy0zMzQgVW5pdGVkIFN0YXR1ZSIpOwotICAgICAgICBtVmVyaWZpZXIuYWRkUHJvcGVydHlOb2Rlc1ZlcmlmaWVyRWxlbVdpdGhFbXB0eU5hbWUoKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGVXaXRoT3JkZXIoIkFEUiIsICI7Rm9ybWF0dGVkIGFkZHJlc3MgQ0EgMTIzLTMzNCBVbml0ZWQgU3RhdHVlOzs7OzsiLAotICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlzLmFzTGlzdCgiIiwgIkZvcm1hdHRlZCBhZGRyZXNzIENBIDEyMy0zMzQgVW5pdGVkIFN0YXR1ZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIiLCAiIiwgIiIsICIiLCAiIiksIG5ldyBUeXBlU2V0KCJIT01FIikpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RQb3N0YWxPbmx5V2l0aEZvcm1hdHRlZEFkZHJlc3NWMjEoKSB7Ci0gICAgICAgIHRlc3RQb3N0YWxPbmx5V2l0aEZvcm1hdHRlZEFkZHJlc3NDb21tb24oVjIxKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UG9zdGFsT25seVdpdGhGb3JtYXR0ZWRBZGRyZXNzVjMwKCkgewotICAgICAgICB0ZXN0UG9zdGFsT25seVdpdGhGb3JtYXR0ZWRBZGRyZXNzQ29tbW9uKFYzMCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFBvc3RhbE9ubHlXaXRoRm9ybWF0dGVkQWRkcmVzc1Y0MCgpIHsKLSAgICAgICAgdGVzdFBvc3RhbE9ubHlXaXRoRm9ybWF0dGVkQWRkcmVzc0NvbW1vbihWNDApOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRlc3RzIHRoYXQgdGhlIHZDYXJkIGNvbXBvc2VyIGhvbm9ycyBmb3JtYXR0ZWQgZGF0YSB3aGVuIGl0IGlzIGF2YWlsYWJsZQotICAgICAqIGV2ZW4gd2hlbiBpdCBpcyBwYXJ0aWFsLgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCB0ZXN0UG9zdGFsV2l0aEJvdGhTdHJ1Y3R1cmVkQW5kRm9ybWF0dGVkQ29tbW9uKGludCB2Y2FyZFR5cGUpIHsKLSAgICAgICAgbVZlcmlmaWVyLmluaXRGb3JFeHBvcnRUZXN0KHZjYXJkVHlwZSk7Ci0gICAgICAgIG1WZXJpZmllci5hZGRJbnB1dEVudHJ5KCkuYWRkQ29udGVudFZhbHVlcyhTdHJ1Y3R1cmVkUG9zdGFsLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZFBvc3RhbC5QT0JPWCwgIlBvYm94IikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWRQb3N0YWwuQ09VTlRSWSwgIkNvdW50cnkiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZFBvc3RhbC5GT1JNQVRURURfQUREUkVTUywKLSAgICAgICAgICAgICAgICAgICAgICAgICJGb3JtYXR0ZWQgYWRkcmVzcyBDQSAxMjMtMzM0IFVuaXRlZCBTdGF0dWUiKTsgIC8vIFNob3VsZCBiZSBpZ25vcmVkCi0gICAgICAgIG1WZXJpZmllci5hZGRQcm9wZXJ0eU5vZGVzVmVyaWZpZXJFbGVtV2l0aEVtcHR5TmFtZSgpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiQURSIiwgIlBvYm94Ozs7Ozs7Q291bnRyeSIsCi0gICAgICAgICAgICAgICAgICAgICAgICBBcnJheXMuYXNMaXN0KCJQb2JveCIsICIiLCAiIiwgIiIsICIiLCAiIiwgIkNvdW50cnkiKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBUeXBlU2V0KCJIT01FIikpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RQb3N0YWxXaXRoQm90aFN0cnVjdHVyZWRBbmRGb3JtYXR0ZWRWMjEoKSB7Ci0gICAgICAgIHRlc3RQb3N0YWxXaXRoQm90aFN0cnVjdHVyZWRBbmRGb3JtYXR0ZWRDb21tb24oVjIxKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UG9zdGFsV2l0aEJvdGhTdHJ1Y3R1cmVkQW5kRm9ybWF0dGVkVjMwKCkgewotICAgICAgICB0ZXN0UG9zdGFsV2l0aEJvdGhTdHJ1Y3R1cmVkQW5kRm9ybWF0dGVkQ29tbW9uKFYzMCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFBvc3RhbFdpdGhCb3RoU3RydWN0dXJlZEFuZEZvcm1hdHRlZFY0MCgpIHsKLSAgICAgICAgdGVzdFBvc3RhbFdpdGhCb3RoU3RydWN0dXJlZEFuZEZvcm1hdHRlZENvbW1vbihWNDApOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCB0ZXN0T3JnYW5pemF0aW9uQ29tbW9uKGludCB2Y2FyZFR5cGUpIHsKLSAgICAgICAgbVZlcmlmaWVyLmluaXRGb3JFeHBvcnRUZXN0KHZjYXJkVHlwZSk7Ci0gICAgICAgIENvbnRhY3RFbnRyeSBlbnRyeSA9IG1WZXJpZmllci5hZGRJbnB1dEVudHJ5KCk7Ci0gICAgICAgIGVudHJ5LmFkZENvbnRlbnRWYWx1ZXMoT3JnYW5pemF0aW9uLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoT3JnYW5pemF0aW9uLkNPTVBBTlksICJDb21wYW55WCIpCi0gICAgICAgICAgICAgICAgLnB1dChPcmdhbml6YXRpb24uREVQQVJUTUVOVCwgIkRlcGFydG1lbnRZIikKLSAgICAgICAgICAgICAgICAucHV0KE9yZ2FuaXphdGlvbi5USVRMRSwgIlRpdGxlWiIpCi0gICAgICAgICAgICAgICAgLnB1dChPcmdhbml6YXRpb24uSk9CX0RFU0NSSVBUSU9OLCAiRGVzY3JpcHRpb24gUmFtYmRhIikgIC8vIElnbm9yZWQuCi0gICAgICAgICAgICAgICAgLnB1dChPcmdhbml6YXRpb24uT0ZGSUNFX0xPQ0FUSU9OLCAiTW91bnRhaW4gVmlldyIpICAvLyBJZ25vcmVkLgotICAgICAgICAgICAgICAgIC5wdXQoT3JnYW5pemF0aW9uLlBIT05FVElDX05BTUUsICJQaG9uZXRpY05hbWUhIikgIC8vIElnbm9yZWQKLSAgICAgICAgICAgICAgICAucHV0KE9yZ2FuaXphdGlvbi5TWU1CT0wsICIoXm9eKS9+fiIpOyAgLy8gSWdub3JlIGhpbSAoaGVyKS4KLSAgICAgICAgZW50cnkuYWRkQ29udGVudFZhbHVlcyhPcmdhbml6YXRpb24uQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dE51bGwoT3JnYW5pemF0aW9uLkNPTVBBTlkpCi0gICAgICAgICAgICAgICAgLnB1dChPcmdhbml6YXRpb24uREVQQVJUTUVOVCwgIkRlcGFydG1lbnRYWCIpCi0gICAgICAgICAgICAgICAgLnB1dE51bGwoT3JnYW5pemF0aW9uLlRJVExFKTsKLSAgICAgICAgZW50cnkuYWRkQ29udGVudFZhbHVlcyhPcmdhbml6YXRpb24uQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChPcmdhbml6YXRpb24uQ09NUEFOWSwgIkNvbXBhbnlYWVoiKQotICAgICAgICAgICAgICAgIC5wdXROdWxsKE9yZ2FuaXphdGlvbi5ERVBBUlRNRU5UKQotICAgICAgICAgICAgICAgIC5wdXQoT3JnYW5pemF0aW9uLlRJVExFLCAiVGl0bGVYWVpZWCIpOwotICAgICAgICAvLyBDdXJyZW50bHkgd2UgZG8gbm90IHVzZSBncm91cCBidXQgZGVwZW5kIG9uIHRoZSBvcmRlci4KLSAgICAgICAgbVZlcmlmaWVyLmFkZFByb3BlcnR5Tm9kZXNWZXJpZmllckVsZW1XaXRoRW1wdHlOYW1lKCkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJPUkciLCAiQ29tcGFueVg7RGVwYXJ0bWVudFkiLAotICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlzLmFzTGlzdCgiQ29tcGFueVgiLCAiRGVwYXJ0bWVudFkiKSkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJUSVRMRSIsICJUaXRsZVoiKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGVXaXRoT3JkZXIoIk9SRyIsICJEZXBhcnRtZW50WFgiKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGVXaXRoT3JkZXIoIk9SRyIsICJDb21wYW55WFlaIikKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJUSVRMRSIsICJUaXRsZVhZWllYIik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdE9yZ2FuaXphdGlvblYyMSgpIHsKLSAgICAgICAgdGVzdE9yZ2FuaXphdGlvbkNvbW1vbihWMjEpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RPcmdhbml6YXRpb25WMzAoKSB7Ci0gICAgICAgIHRlc3RPcmdhbml6YXRpb25Db21tb24oVjMwKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0T3JnYW5pemF0aW9uVjQwKCkgewotICAgICAgICB0ZXN0T3JnYW5pemF0aW9uQ29tbW9uKFY0MCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHRlc3RJbVZhcmlvdXNUeXBlU3VwcG9ydENvbW1vbihpbnQgdmNhcmRUeXBlKSB7Ci0gICAgICAgIG1WZXJpZmllci5pbml0Rm9yRXhwb3J0VGVzdCh2Y2FyZFR5cGUpOwotICAgICAgICBDb250YWN0RW50cnkgZW50cnkgPSBtVmVyaWZpZXIuYWRkSW5wdXRFbnRyeSgpOwotICAgICAgICBlbnRyeS5hZGRDb250ZW50VmFsdWVzKEltLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoSW0uUFJPVE9DT0wsIEltLlBST1RPQ09MX0FJTSkKLSAgICAgICAgICAgICAgICAucHV0KEltLkRBVEEsICJhaW0iKTsKLSAgICAgICAgZW50cnkuYWRkQ29udGVudFZhbHVlcyhJbS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KEltLlBST1RPQ09MLCBJbS5QUk9UT0NPTF9NU04pCi0gICAgICAgICAgICAgICAgLnB1dChJbS5EQVRBLCAibXNuIik7Ci0gICAgICAgIGVudHJ5LmFkZENvbnRlbnRWYWx1ZXMoSW0uQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChJbS5QUk9UT0NPTCwgSW0uUFJPVE9DT0xfWUFIT08pCi0gICAgICAgICAgICAgICAgLnB1dChJbS5EQVRBLCAieWFob28iKTsKLSAgICAgICAgZW50cnkuYWRkQ29udGVudFZhbHVlcyhJbS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KEltLlBST1RPQ09MLCBJbS5QUk9UT0NPTF9TS1lQRSkKLSAgICAgICAgICAgICAgICAucHV0KEltLkRBVEEsICJza3lwZSIpOwotICAgICAgICBlbnRyeS5hZGRDb250ZW50VmFsdWVzKEltLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoSW0uUFJPVE9DT0wsIEltLlBST1RPQ09MX1FRKQotICAgICAgICAgICAgICAgIC5wdXQoSW0uREFUQSwgInFxIik7Ci0gICAgICAgIGVudHJ5LmFkZENvbnRlbnRWYWx1ZXMoSW0uQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChJbS5QUk9UT0NPTCwgSW0uUFJPVE9DT0xfR09PR0xFX1RBTEspCi0gICAgICAgICAgICAgICAgLnB1dChJbS5EQVRBLCAiZ29vZ2xlIHRhbGsiKTsKLSAgICAgICAgZW50cnkuYWRkQ29udGVudFZhbHVlcyhJbS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KEltLlBST1RPQ09MLCBJbS5QUk9UT0NPTF9JQ1EpCi0gICAgICAgICAgICAgICAgLnB1dChJbS5EQVRBLCAiaWNxIik7Ci0gICAgICAgIGVudHJ5LmFkZENvbnRlbnRWYWx1ZXMoSW0uQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChJbS5QUk9UT0NPTCwgSW0uUFJPVE9DT0xfSkFCQkVSKQotICAgICAgICAgICAgICAgIC5wdXQoSW0uREFUQSwgImphYmJlciIpOwotICAgICAgICBlbnRyeS5hZGRDb250ZW50VmFsdWVzKEltLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoSW0uUFJPVE9DT0wsIEltLlBST1RPQ09MX05FVE1FRVRJTkcpCi0gICAgICAgICAgICAgICAgLnB1dChJbS5EQVRBLCAibmV0bWVldGluZyIpOwotCi0gICAgICAgIC8vIE5vIGRldGVybWluZWQgd2F5IHRvIGV4cHJlc3MgdW5rbm93biB0eXBlLi4uCi0gICAgICAgIG1WZXJpZmllci5hZGRQcm9wZXJ0eU5vZGVzVmVyaWZpZXJFbGVtV2l0aEVtcHR5TmFtZSgpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiWC1KQUJCRVIiLCAiamFiYmVyIikKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJYLUlDUSIsICJpY3EiKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIlgtR09PR0xFLVRBTEsiLCAiZ29vZ2xlIHRhbGsiKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIlgtUVEiLCAicXEiKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIlgtU0tZUEUtVVNFUk5BTUUiLCAic2t5cGUiKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIlgtWUFIT08iLCAieWFob28iKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIlgtTVNOIiwgIm1zbiIpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiWC1ORVRNRUVUSU5HIiwgIm5ldG1lZXRpbmciKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIlgtQUlNIiwgImFpbSIpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RJbUJhc2lWMjEoKSB7Ci0gICAgICAgIHRlc3RJbVZhcmlvdXNUeXBlU3VwcG9ydENvbW1vbihWMjEpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RJbUJhc2ljVjMwKCkgewotICAgICAgICB0ZXN0SW1WYXJpb3VzVHlwZVN1cHBvcnRDb21tb24oVjMwKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0SW1CYXNpY1Y0MCgpIHsKLSAgICAgICAgdGVzdEltVmFyaW91c1R5cGVTdXBwb3J0Q29tbW9uKFY0MCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHRlc3RJbVByZWZIYW5kbGluZ0NvbW1vbihpbnQgdmNhcmRUeXBlKSB7Ci0gICAgICAgIG1WZXJpZmllci5pbml0Rm9yRXhwb3J0VGVzdCh2Y2FyZFR5cGUpOwotICAgICAgICBDb250YWN0RW50cnkgZW50cnkgPSBtVmVyaWZpZXIuYWRkSW5wdXRFbnRyeSgpOwotICAgICAgICBlbnRyeS5hZGRDb250ZW50VmFsdWVzKEltLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoSW0uUFJPVE9DT0wsIEltLlBST1RPQ09MX0FJTSkKLSAgICAgICAgICAgICAgICAucHV0KEltLkRBVEEsICJhaW0xIik7Ci0gICAgICAgIGVudHJ5LmFkZENvbnRlbnRWYWx1ZXMoSW0uQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChJbS5QUk9UT0NPTCwgSW0uUFJPVE9DT0xfQUlNKQotICAgICAgICAgICAgICAgIC5wdXQoSW0uREFUQSwgImFpbTIiKQotICAgICAgICAgICAgICAgIC5wdXQoSW0uVFlQRSwgSW0uVFlQRV9IT01FKQotICAgICAgICAgICAgICAgIC5wdXQoSW0uSVNfUFJJTUFSWSwgMSk7Ci0KLSAgICAgICAgbVZlcmlmaWVyLmFkZFByb3BlcnR5Tm9kZXNWZXJpZmllckVsZW1XaXRoRW1wdHlOYW1lKCkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJYLUFJTSIsICJhaW0xIikKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJYLUFJTSIsICJhaW0yIiwgbmV3IFR5cGVTZXQoIkhPTUUiLCAiUFJFRiIpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0SW1QcmVmSGFuZGxpbmdWMjEoKSB7Ci0gICAgICAgIHRlc3RJbVByZWZIYW5kbGluZ0NvbW1vbihWMjEpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RJbVByZWZIYW5kbGluZ1YzMCgpIHsKLSAgICAgICAgdGVzdEltUHJlZkhhbmRsaW5nQ29tbW9uKFYzMCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEltUHJlZkhhbmRsaW5nVjQwKCkgewotICAgICAgICB0ZXN0SW1QcmVmSGFuZGxpbmdDb21tb24oVjQwKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgdGVzdFdlYnNpdGVDb21tb24oaW50IHZjYXJkVHlwZSkgewotICAgICAgICBtVmVyaWZpZXIuaW5pdEZvckV4cG9ydFRlc3QodmNhcmRUeXBlKTsKLSAgICAgICAgQ29udGFjdEVudHJ5IGVudHJ5ID0gbVZlcmlmaWVyLmFkZElucHV0RW50cnkoKTsKLSAgICAgICAgZW50cnkuYWRkQ29udGVudFZhbHVlcyhXZWJzaXRlLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoV2Vic2l0ZS5VUkwsICJodHRwOi8vd2Vic2l0ZS5leGFtcGxlLmFuZHJvaWQuY29tL2luZGV4Lmh0bWwiKQotICAgICAgICAgICAgICAgIC5wdXQoV2Vic2l0ZS5UWVBFLCBXZWJzaXRlLlRZUEVfQkxPRyk7Ci0gICAgICAgIGVudHJ5LmFkZENvbnRlbnRWYWx1ZXMoV2Vic2l0ZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFdlYnNpdGUuVVJMLCAiZnRwOi8vZnRwLmV4YW1wbGUuYW5kcm9pZC5jb20vaW5kZXguaHRtbCIpCi0gICAgICAgICAgICAgICAgLnB1dChXZWJzaXRlLlRZUEUsIFdlYnNpdGUuVFlQRV9GVFApOwotCi0gICAgICAgIC8vIFdlIGRyb3AgVFlQRSBpbmZvcm1hdGlvbiBzaW5jZSB2Q2FyZCAoZXNwZWNpYWxseSAzLjApIGRvZXMgbm90IGFsbG93IHVzIHRvIGVtaXQgaXQuCi0gICAgICAgIG1WZXJpZmllci5hZGRQcm9wZXJ0eU5vZGVzVmVyaWZpZXJFbGVtV2l0aEVtcHR5TmFtZSgpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiVVJMIiwgImZ0cDovL2Z0cC5leGFtcGxlLmFuZHJvaWQuY29tL2luZGV4Lmh0bWwiKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIlVSTCIsICJodHRwOi8vd2Vic2l0ZS5leGFtcGxlLmFuZHJvaWQuY29tL2luZGV4Lmh0bWwiKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0V2Vic2l0ZVYyMSgpIHsKLSAgICAgICAgdGVzdFdlYnNpdGVDb21tb24oVjIxKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0V2Vic2l0ZVYzMCgpIHsKLSAgICAgICAgdGVzdFdlYnNpdGVDb21tb24oVjMwKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0V2Vic2l0ZVY0MCgpIHsKLSAgICAgICAgdGVzdFdlYnNpdGVDb21tb24oVjQwKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIFN0cmluZyBnZXRBbmRyb2lkUHJvcFZhbHVlKGZpbmFsIFN0cmluZyBtaW1lVHlwZSwgU3RyaW5nIHZhbHVlLCBJbnRlZ2VyIHR5cGUpIHsKLSAgICAgICAgcmV0dXJuIGdldEFuZHJvaWRQcm9wVmFsdWUobWltZVR5cGUsIHZhbHVlLCB0eXBlLCBudWxsKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIFN0cmluZyBnZXRBbmRyb2lkUHJvcFZhbHVlKGZpbmFsIFN0cmluZyBtaW1lVHlwZSwgU3RyaW5nIHZhbHVlLAotICAgICAgICAgICAgSW50ZWdlciB0eXBlLCBTdHJpbmcgbGFiZWwpIHsKLSAgICAgICAgcmV0dXJuIChtaW1lVHlwZSArICI7IiArIHZhbHVlICsgIjsiCi0gICAgICAgICAgICAgICAgKyAodHlwZSAhPSBudWxsID8gdHlwZSA6ICIiKSArICI7IgotICAgICAgICAgICAgICAgICsgKGxhYmVsICE9IG51bGwgPyBsYWJlbCA6ICIiKSArICI7Ozs7Ozs7Ozs7OzsiKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgdGVzdEV2ZW50Q29tbW9uKGludCB2Y2FyZFR5cGUpIHsKLSAgICAgICAgbVZlcmlmaWVyLmluaXRGb3JFeHBvcnRUZXN0KHZjYXJkVHlwZSk7Ci0gICAgICAgIENvbnRhY3RFbnRyeSBlbnRyeSA9IG1WZXJpZmllci5hZGRJbnB1dEVudHJ5KCk7Ci0gICAgICAgIGVudHJ5LmFkZENvbnRlbnRWYWx1ZXMoRXZlbnQuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChFdmVudC5UWVBFLCBFdmVudC5UWVBFX0FOTklWRVJTQVJZKQotICAgICAgICAgICAgICAgIC5wdXQoRXZlbnQuU1RBUlRfREFURSwgIjE5ODItMDYtMTYiKTsKLSAgICAgICAgZW50cnkuYWRkQ29udGVudFZhbHVlcyhFdmVudC5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KEV2ZW50LlRZUEUsIEV2ZW50LlRZUEVfQklSVEhEQVkpCi0gICAgICAgICAgICAgICAgLnB1dChFdmVudC5TVEFSVF9EQVRFLCAiMjAwOC0xMC0yMiIpOwotICAgICAgICBlbnRyeS5hZGRDb250ZW50VmFsdWVzKEV2ZW50LkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoRXZlbnQuVFlQRSwgRXZlbnQuVFlQRV9PVEhFUikKLSAgICAgICAgICAgICAgICAucHV0KEV2ZW50LlNUQVJUX0RBVEUsICIyMDE4LTAzLTEyIik7Ci0gICAgICAgIGVudHJ5LmFkZENvbnRlbnRWYWx1ZXMoRXZlbnQuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChFdmVudC5UWVBFLCBFdmVudC5UWVBFX0NVU1RPTSkKLSAgICAgICAgICAgICAgICAucHV0KEV2ZW50LkxBQkVMLCAiVGhlIGxhc3QgZGF5IikKLSAgICAgICAgICAgICAgICAucHV0KEV2ZW50LlNUQVJUX0RBVEUsICJXaGVuIHRoZSBUb3dlciBvZiBIYW5vaSB3aXRoIDY0IHJpbmdzIGlzIGNvbXBsZXRlZC4iKTsKLSAgICAgICAgZW50cnkuYWRkQ29udGVudFZhbHVlcyhFdmVudC5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KEV2ZW50LlRZUEUsIEV2ZW50LlRZUEVfQklSVEhEQVkpCi0gICAgICAgICAgICAgICAgLnB1dChFdmVudC5TVEFSVF9EQVRFLCAiMjAwOS0wNS0xOSIpOyAgLy8gU2hvdWxkIGJlIGlnbm9yZWQuCi0gICAgICAgIG1WZXJpZmllci5hZGRQcm9wZXJ0eU5vZGVzVmVyaWZpZXJFbGVtV2l0aEVtcHR5TmFtZSgpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiQkRBWSIsICIyMDA4LTEwLTIyIikKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJYLUFORFJPSUQtQ1VTVE9NIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGdldEFuZHJvaWRQcm9wVmFsdWUoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV2ZW50LkNPTlRFTlRfSVRFTV9UWVBFLCAiMTk4Mi0wNi0xNiIsIEV2ZW50LlRZUEVfQU5OSVZFUlNBUlkpKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIlgtQU5EUk9JRC1DVVNUT00iLAotICAgICAgICAgICAgICAgICAgICAgICAgZ2V0QW5kcm9pZFByb3BWYWx1ZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXZlbnQuQ09OVEVOVF9JVEVNX1RZUEUsICIyMDE4LTAzLTEyIiwgRXZlbnQuVFlQRV9PVEhFUikpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiWC1BTkRST0lELUNVU1RPTSIsCi0gICAgICAgICAgICAgICAgICAgICAgICBnZXRBbmRyb2lkUHJvcFZhbHVlKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFdmVudC5DT05URU5UX0lURU1fVFlQRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIldoZW4gdGhlIFRvd2VyIG9mIEhhbm9pIHdpdGggNjQgcmluZ3MgaXMgY29tcGxldGVkLiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV2ZW50LlRZUEVfQ1VTVE9NLCAiVGhlIGxhc3QgZGF5IikpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RFdmVudFYyMSgpIHsKLSAgICAgICAgdGVzdEV2ZW50Q29tbW9uKFYyMSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEV2ZW50VjMwKCkgewotICAgICAgICB0ZXN0RXZlbnRDb21tb24oVjMwKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RXZlbnRWNDAoKSB7Ci0gICAgICAgIHRlc3RFdmVudENvbW1vbihWNDApOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCB0ZXN0Tm90ZUNvbW1vbihpbnQgdmNhcmRUeXBlKSB7Ci0gICAgICAgIG1WZXJpZmllci5pbml0Rm9yRXhwb3J0VGVzdCh2Y2FyZFR5cGUpOwotICAgICAgICBDb250YWN0RW50cnkgZW50cnkgPSBtVmVyaWZpZXIuYWRkSW5wdXRFbnRyeSgpOwotICAgICAgICBlbnRyeS5hZGRDb250ZW50VmFsdWVzKE5vdGUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChOb3RlLk5PVEUsICJub3RlMSIpOwotICAgICAgICBlbnRyeS5hZGRDb250ZW50VmFsdWVzKE5vdGUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChOb3RlLk5PVEUsICJub3RlMiIpCi0gICAgICAgICAgICAgICAgLnB1dChOb3RlLklTX1BSSU1BUlksIDEpOyAgLy8gSnVzdCBpZ25vcmVkLgotICAgICAgICBtVmVyaWZpZXIuYWRkUHJvcGVydHlOb2Rlc1ZlcmlmaWVyRWxlbVdpdGhFbXB0eU5hbWUoKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGVXaXRoT3JkZXIoIk5PVEUiLCAibm90ZTEiKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGVXaXRoT3JkZXIoIk5PVEUiLCAibm90ZTIiKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0Tm90ZVYyMSgpIHsKLSAgICAgICAgdGVzdE5vdGVDb21tb24oVjIxKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0Tm90ZVYzMCgpIHsKLSAgICAgICAgdGVzdE5vdGVDb21tb24oVjMwKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0Tm90ZVY0MCgpIHsKLSAgICAgICAgdGVzdE5vdGVDb21tb24oVjQwKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgdGVzdFBob3RvQ29tbW9uKGludCB2Y2FyZFR5cGUpIHsKLSAgICAgICAgZmluYWwgYm9vbGVhbiB1c2VCID0KLSAgICAgICAgICAgIChWQ2FyZENvbmZpZy5pc1ZlcnNpb24zMCh2Y2FyZFR5cGUpIHx8IFZDYXJkQ29uZmlnLmlzVmVyc2lvbjQwKHZjYXJkVHlwZSkpOwotICAgICAgICBtVmVyaWZpZXIuaW5pdEZvckV4cG9ydFRlc3QodmNhcmRUeXBlKTsKLSAgICAgICAgQ29udGFjdEVudHJ5IGVudHJ5ID0gbVZlcmlmaWVyLmFkZElucHV0RW50cnkoKTsKLSAgICAgICAgZW50cnkuYWRkQ29udGVudFZhbHVlcyhTdHJ1Y3R1cmVkTmFtZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLkZBTUlMWV9OQU1FLCAiUGhvdG9UZXN0Iik7Ci0gICAgICAgIGVudHJ5LmFkZENvbnRlbnRWYWx1ZXMoUGhvdG8uQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChQaG90by5QSE9UTywgc1Bob3RvQnl0ZUFycmF5KTsKLQotICAgICAgICBDb250ZW50VmFsdWVzIGNvbnRlbnRWYWx1ZXNGb3JQaG90byA9IG5ldyBDb250ZW50VmFsdWVzKCk7Ci0gICAgICAgIGNvbnRlbnRWYWx1ZXNGb3JQaG90by5wdXQoIkVOQ09ESU5HIiwgKHVzZUIgPyAiYiIgOiAiQkFTRTY0IikpOwotICAgICAgICBtVmVyaWZpZXIuYWRkUHJvcGVydHlOb2Rlc1ZlcmlmaWVyRWxlbSgpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiRk4iLCAiUGhvdG9UZXN0IikKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJOIiwgIlBob3RvVGVzdDs7OzsiLAotICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlzLmFzTGlzdCgiUGhvdG9UZXN0IiwgIiIsICIiLCAiIiwgIiIpKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGVXaXRoT3JkZXIoIlBIT1RPIiwgbnVsbCwgbnVsbCwgc1Bob3RvQnl0ZUFycmF5LAotICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudFZhbHVlc0ZvclBob3RvLCBuZXcgVHlwZVNldCgiSlBFRyIpLCBudWxsKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UGhvdG9WMjEoKSB7Ci0gICAgICAgIHRlc3RQaG90b0NvbW1vbihWMjEpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RQaG90b1YzMCgpIHsKLSAgICAgICAgdGVzdFBob3RvQ29tbW9uKFYzMCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFBob3RvVjQwKCkgewotICAgICAgICB0ZXN0UGhvdG9Db21tb24oVjQwKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgdGVzdFJlbGF0aW9uQ29tbW9uKGludCB2Y2FyZFR5cGUpIHsKLSAgICAgICAgbVZlcmlmaWVyLmluaXRGb3JFeHBvcnRUZXN0KHZjYXJkVHlwZSk7Ci0gICAgICAgIG1WZXJpZmllci5hZGRJbnB1dEVudHJ5KCkuYWRkQ29udGVudFZhbHVlcyhSZWxhdGlvbi5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFJlbGF0aW9uLlRZUEUsIFJlbGF0aW9uLlRZUEVfTU9USEVSKQotICAgICAgICAgICAgICAgIC5wdXQoUmVsYXRpb24uTkFNRSwgIk1zLiBNb3RoZXIiKTsKLSAgICAgICAgbVZlcmlmaWVyLmFkZENvbnRlbnRWYWx1ZXNWZXJpZmllckVsZW0oKS5hZGRFeHBlY3RlZChSZWxhdGlvbi5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFJlbGF0aW9uLlRZUEUsIFJlbGF0aW9uLlRZUEVfTU9USEVSKQotICAgICAgICAgICAgICAgIC5wdXQoUmVsYXRpb24uTkFNRSwgIk1zLiBNb3RoZXIiKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UmVsYXRpb25WMjEoKSB7Ci0gICAgICAgIHRlc3RSZWxhdGlvbkNvbW1vbihWMjEpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RSZWxhdGlvblYzMCgpIHsKLSAgICAgICAgdGVzdFJlbGF0aW9uQ29tbW9uKFYzMCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFYzMEhhbmRsZUVzY2FwZSgpIHsKLSAgICAgICAgbVZlcmlmaWVyLmluaXRGb3JFeHBvcnRUZXN0KFYzMCk7Ci0gICAgICAgIG1WZXJpZmllci5hZGRJbnB1dEVudHJ5KCkuYWRkQ29udGVudFZhbHVlcyhTdHJ1Y3R1cmVkTmFtZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLkZBTUlMWV9OQU1FLCAiXFwiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuR0lWRU5fTkFNRSwgIjsiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuTUlERExFX05BTUUsICIsIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLlBSRUZJWCwgIlxuIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLkRJU1BMQVlfTkFNRSwgIls8e1VuZXNjYXBlZDpBc2NpaXN9Pl0iKTsKLSAgICAgICAgLy8gVmVyaWZpZXMgdGhlIHZDYXJkIFN0cmluZyBjb3JyZWN0bHkgZXNjYXBlcyBlYWNoIGNoYXJhY3RlciB3aGljaCBtdXN0IGJlIGVzY2FwZWQuCi0gICAgICAgIG1WZXJpZmllci5hZGRMaW5lVmVyaWZpZXJFbGVtKCkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWQoIk46XFxcXDtcXDs7XFwsO1xcbjsiKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZCgiRk46Wzx7VW5lc2NhcGVkOkFzY2lpc30+XSIpOwotICAgICAgICBtVmVyaWZpZXIuYWRkUHJvcGVydHlOb2Rlc1ZlcmlmaWVyRWxlbSgpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiRk4iLCAiWzx7VW5lc2NhcGVkOkFzY2lpc30+XSIpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiTiIsIEFycmF5cy5hc0xpc3QoIlxcIiwgIjsiLCAiLCIsICJcbiIsICIiKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhlcmUncyBubyAiTklDS05BTUUiIHByb3BlcnR5IGluIHZDYXJkIDIuMSwgd2hpbGUgdGhlcmUgaXMgaW4gdkNhcmQgMy4wLgotICAgICAqIFdlIHVzZSBBbmRyb2lkLXNwZWNpZmljICJYLUFORFJPSUQtQ1VTVE9NIiBwcm9wZXJ0eS4KLSAgICAgKiBUaGlzIHRlc3QgdmVyaWZpZXMgdGhlIGZ1bmN0aW9uYWxpdHkuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdE5pY2tOYW1lVjIxKCkgewotICAgICAgICBtVmVyaWZpZXIuaW5pdEZvckV4cG9ydFRlc3QoVjIxKTsKLSAgICAgICAgbVZlcmlmaWVyLmFkZElucHV0RW50cnkoKS5hZGRDb250ZW50VmFsdWVzKE5pY2tuYW1lLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoTmlja25hbWUuTkFNRSwgIk5pY2t5Iik7Ci0gICAgICAgIG1WZXJpZmllci5hZGRQcm9wZXJ0eU5vZGVzVmVyaWZpZXJFbGVtV2l0aEVtcHR5TmFtZSgpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiWC1BTkRST0lELUNVU1RPTSIsCi0gICAgICAgICAgICAgICAgICAgICAgICBOaWNrbmFtZS5DT05URU5UX0lURU1fVFlQRSArICI7Tmlja3k7Ozs7Ozs7Ozs7Ozs7OyIpOwotICAgICAgICBtVmVyaWZpZXIuYWRkQ29udGVudFZhbHVlc1ZlcmlmaWVyRWxlbSgpLmFkZEV4cGVjdGVkKE5pY2tuYW1lLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoTmlja25hbWUuTkFNRSwgIk5pY2t5Iik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFRvbGVyYXRlQnJva2VuUGhvbmVOdW1iZXJFbnRyeVYyMSgpIHsKLSAgICAgICAgbVZlcmlmaWVyLmluaXRGb3JFeHBvcnRUZXN0KFYyMSk7Ci0gICAgICAgIENvbnRhY3RFbnRyeSBlbnRyeSA9IG1WZXJpZmllci5hZGRJbnB1dEVudHJ5KCk7Ci0gICAgICAgIGVudHJ5LmFkZENvbnRlbnRWYWx1ZXMoUGhvbmUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5UWVBFLCBQaG9uZS5UWVBFX0hPTUUpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5OVU1CRVIsICIxMTEtMjIyLTMzMzMgKE1pYW1pKVxuNDQ0LTU1NTUtNjY2IChUb2t5byk7IgotICAgICAgICAgICAgICAgICAgICAgICAgKyAiNzc3LTg4OC05OTk5IChDaGljYWdvKTsxMTEtMjIyLTMzMzMgKE1pYW1pKSIpOwotICAgICAgICBtVmVyaWZpZXIuYWRkUHJvcGVydHlOb2Rlc1ZlcmlmaWVyRWxlbVdpdGhFbXB0eU5hbWUoKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIlRFTCIsICIxMTEtMjIyLTMzMzMiLCBuZXcgVHlwZVNldCgiSE9NRSIpKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIlRFTCIsICI0NDQtNTU1LTU2NjYiLCBuZXcgVHlwZVNldCgiSE9NRSIpKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIlRFTCIsICI3NzctODg4LTk5OTkiLCBuZXcgVHlwZVNldCgiSE9NRSIpKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgdGVzdFBpY2tVcE5vbkVtcHR5Q29udGVudFZhbHVlc0NvbW1vbihpbnQgdmNhcmRUeXBlKSB7Ci0gICAgICAgIG1WZXJpZmllci5pbml0Rm9yRXhwb3J0VGVzdCh2Y2FyZFR5cGUpOwotICAgICAgICBDb250YWN0RW50cnkgZW50cnkgPSBtVmVyaWZpZXIuYWRkSW5wdXRFbnRyeSgpOwotICAgICAgICBlbnRyeS5hZGRDb250ZW50VmFsdWVzKFN0cnVjdHVyZWROYW1lLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuSVNfUFJJTUFSWSwgMSk7ICAvLyBFbXB0eSBuYW1lLiBTaG91bGQgYmUgaWdub3JlZC4KLSAgICAgICAgZW50cnkuYWRkQ29udGVudFZhbHVlcyhTdHJ1Y3R1cmVkTmFtZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLkZBTUlMWV9OQU1FLCAiZmFtaWx5MSIpICAvLyBOb3QgcHJpbWFyeS4gU2hvdWxkIGJlIGlnbm9yZWQuCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5ESVNQTEFZX05BTUUsICJkaXNwbGF5Iik7Ci0gICAgICAgIGVudHJ5LmFkZENvbnRlbnRWYWx1ZXMoU3RydWN0dXJlZE5hbWUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5JU19QUklNQVJZLCAxKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuRkFNSUxZX05BTUUsICJmYW1pbHkyIikgIC8vIFRoaXMgZW50cnkgaXMgd2hhdCB3ZSB3YW50LgotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuRElTUExBWV9OQU1FLCAiZGlzcGxheSIpOwotICAgICAgICBlbnRyeS5hZGRDb250ZW50VmFsdWVzKFN0cnVjdHVyZWROYW1lLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuSVNfUFJJTUFSWSwgMSkKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLkZBTUlMWV9OQU1FLCAiZmFtaWx5MyIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5ESVNQTEFZX05BTUUsICJkaXNwbGF5Iik7Ci0gICAgICAgIGVudHJ5LmFkZENvbnRlbnRWYWx1ZXMoU3RydWN0dXJlZE5hbWUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5GQU1JTFlfTkFNRSwgImZhbWlseTQiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuRElTUExBWV9OQU1FLCAiZGlzcGxheSIpOwotICAgICAgICBtVmVyaWZpZXIuYWRkUHJvcGVydHlOb2Rlc1ZlcmlmaWVyRWxlbSgpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiTiIsIEFycmF5cy5hc0xpc3QoImZhbWlseTIiLCAiIiwgIiIsICIiLCAiIikpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiRk4iLCAiZGlzcGxheSIpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RQaWNrVXBOb25FbXB0eUNvbnRlbnRWYWx1ZXNWMjEoKSB7Ci0gICAgICAgIHRlc3RQaWNrVXBOb25FbXB0eUNvbnRlbnRWYWx1ZXNDb21tb24oVjIxKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UGlja1VwTm9uRW1wdHlDb250ZW50VmFsdWVzVjMwKCkgewotICAgICAgICB0ZXN0UGlja1VwTm9uRW1wdHlDb250ZW50VmFsdWVzQ29tbW9uKFYzMCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFBpY2tVcE5vbkVtcHR5Q29udGVudFZhbHVlc1Y0MCgpIHsKLSAgICAgICAgdGVzdFBpY2tVcE5vbkVtcHR5Q29udGVudFZhbHVlc0NvbW1vbihWNDApOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RVc2VNdWx0aUJ5dGVUeXBlVjMwKCkgewotICAgICAgICBtVmVyaWZpZXIuaW5pdEZvckV4cG9ydFRlc3QoVjMwKTsKLSAgICAgICAgZmluYWwgQ29udGFjdEVudHJ5IGVudHJ5ID0gbVZlcmlmaWVyLmFkZElucHV0RW50cnkoKTsKLSAgICAgICAgZW50cnkuYWRkQ29udGVudFZhbHVlcyhQaG9uZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLlRZUEUsIFBob25lLlRZUEVfQ1VTVE9NKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuTEFCRUwsICJcdTk2RkJcdThBNzEiKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuTlVNQkVSLCAiMSIpOwotICAgICAgICBtVmVyaWZpZXIuYWRkTGluZVZlcmlmaWVyRWxlbSgpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkKCJOOiIpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkKCJGTjoiKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZCgiVEVMO1RZUEU9XHU5NkZCXHU4QTcxOjEiKTsKLSAgICAgICAgbVZlcmlmaWVyLmFkZFByb3BlcnR5Tm9kZXNWZXJpZmllckVsZW1XaXRoRW1wdHlOYW1lKCkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJURUwiLCAiMSIsIG5ldyBUeXBlU2V0KCJcdTk2RkJcdThBNzEiKSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvcGltL3ZjYXJkL1ZDYXJkSW1wb3J0ZXJUZXN0cy5qYXZhIGIvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvcGltL3ZjYXJkL1ZDYXJkSW1wb3J0ZXJUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOWUyOTE0Li4wMDAwMDAwCi0tLSBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL3BpbS92Y2FyZC9WQ2FyZEltcG9ydGVyVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMDggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIGFuZHJvaWQucGltLnZjYXJkOwotCi1pbXBvcnQgY29tLmFuZHJvaWQuZnJhbWV3b3Jrcy5jb3JldGVzdHMuUjsKLQotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZW50VmFsdWVzOwotaW1wb3J0IGFuZHJvaWQucGltLnZjYXJkLnRlc3RfdXRpbHMuUHJvcGVydHlOb2Rlc1ZlcmlmaWVyRWxlbS5UeXBlU2V0OwotaW1wb3J0IGFuZHJvaWQucGltLnZjYXJkLnRlc3RfdXRpbHMuVkNhcmRUZXN0c0Jhc2U7Ci1pbXBvcnQgYW5kcm9pZC5waW0udmNhcmQudGVzdF91dGlscy5Db250ZW50VmFsdWVzVmVyaWZpZXI7Ci1pbXBvcnQgYW5kcm9pZC5waW0udmNhcmQudGVzdF91dGlscy5Db250ZW50VmFsdWVzVmVyaWZpZXJFbGVtOwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5Db21tb25EYXRhS2luZHMuRW1haWw7Ci1pbXBvcnQgYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0LkNvbW1vbkRhdGFLaW5kcy5FdmVudDsKLWltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuQ29tbW9uRGF0YUtpbmRzLkltOwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5Db21tb25EYXRhS2luZHMuTmlja25hbWU7Ci1pbXBvcnQgYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0LkNvbW1vbkRhdGFLaW5kcy5Ob3RlOwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5Db21tb25EYXRhS2luZHMuT3JnYW5pemF0aW9uOwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5Db21tb25EYXRhS2luZHMuUGhvbmU7Ci1pbXBvcnQgYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0LkNvbW1vbkRhdGFLaW5kcy5QaG90bzsKLWltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuQ29tbW9uRGF0YUtpbmRzLlN0cnVjdHVyZWROYW1lOwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5Db21tb25EYXRhS2luZHMuU3RydWN0dXJlZFBvc3RhbDsKLWltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuQ29tbW9uRGF0YUtpbmRzLldlYnNpdGU7Ci1pbXBvcnQgYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0LkRhdGE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotCi1wdWJsaWMgY2xhc3MgVkNhcmRJbXBvcnRlclRlc3RzIGV4dGVuZHMgVkNhcmRUZXN0c0Jhc2UgewotICAgIC8vIFB1c2ggZGF0YSBpbnRvIGludCBhcnJheSBhdCBmaXJzdCBzaW5jZSB2YWx1ZXMgbGlrZSAweDgwIGFyZQotICAgIC8vIGludGVycHJldGVkIGFzIGludCBieSB0aGUgY29tcGlsZXIgYW5kIGNhc3RpbmcgYWxsIG9mIHRoZW0gaXMKLSAgICAvLyBjdW1iZXJzb21lLi4uCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50W10gc1Bob3RvSW50QXJyYXlGb3JDb21wbGljYXRlZENhc2UgPSB7Ci0gICAgICAgIDB4ZmYsIDB4ZDgsIDB4ZmYsIDB4ZTEsIDB4MGEsIDB4MGYsIDB4NDUsIDB4NzgsIDB4NjksIDB4NjYsIDB4MDAsCi0gICAgICAgIDB4MDAsIDB4NGQsIDB4NGQsIDB4MDAsIDB4MmEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDgsIDB4MDAsIDB4MGQsCi0gICAgICAgIDB4MDEsIDB4MGUsIDB4MDAsIDB4MDIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MGYsIDB4MDAsIDB4MDAsIDB4MDAsCi0gICAgICAgIDB4YWEsIDB4MDEsIDB4MGYsIDB4MDAsIDB4MDIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDcsIDB4MDAsIDB4MDAsCi0gICAgICAgIDB4MDAsIDB4YmEsIDB4MDEsIDB4MTAsIDB4MDAsIDB4MDIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDYsIDB4MDAsCi0gICAgICAgIDB4MDAsIDB4MDAsIDB4YzIsIDB4MDEsIDB4MTIsIDB4MDAsIDB4MDMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDEsCi0gICAgICAgIDB4MDAsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MDEsIDB4MWEsIDB4MDAsIDB4MDUsIDB4MDAsIDB4MDAsIDB4MDAsCi0gICAgICAgIDB4MDEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4YzgsIDB4MDEsIDB4MWIsIDB4MDAsIDB4MDUsIDB4MDAsIDB4MDAsCi0gICAgICAgIDB4MDAsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ZDAsIDB4MDEsIDB4MjgsIDB4MDAsIDB4MDMsIDB4MDAsCi0gICAgICAgIDB4MDAsIDB4MDAsIDB4MDEsIDB4MDAsIDB4MDIsIDB4MDAsIDB4MDAsIDB4MDEsIDB4MzEsIDB4MDAsIDB4MDIsCi0gICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MGUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ZDgsIDB4MDEsIDB4MzIsIDB4MDAsCi0gICAgICAgIDB4MDIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MTQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ZTYsIDB4MDIsIDB4MTMsCi0gICAgICAgIDB4MDAsIDB4MDMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDEsIDB4MDAsIDB4MDEsIDB4MDAsIDB4MDAsIDB4ODIsCi0gICAgICAgIDB4OTgsIDB4MDAsIDB4MDIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MGUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ZmEsCi0gICAgICAgIDB4ODcsIDB4NjksIDB4MDAsIDB4MDQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MDEsCi0gICAgICAgIDB4ODQsIDB4YzQsIDB4YTUsIDB4MDAsIDB4MDcsIDB4MDAsIDB4MDAsIDB4MDAsIDB4N2MsIDB4MDAsIDB4MDAsCi0gICAgICAgIDB4MDEsIDB4MDgsIDB4MDAsIDB4MDAsIDB4MDQsIDB4MWUsIDB4MzIsIDB4MzAsIDB4MzAsIDB4MzgsIDB4MzEsCi0gICAgICAgIDB4MzAsIDB4MzIsIDB4MzksIDB4MzEsIDB4MzMsIDB4MzUsIDB4MzUsIDB4MzMsIDB4MzEsIDB4MDAsIDB4MDAsCi0gICAgICAgIDB4NDQsIDB4NmYsIDB4NDMsIDB4NmYsIDB4NGQsIDB4NmYsIDB4MDAsIDB4MDAsIDB4NDQsIDB4MzksIDB4MzAsCi0gICAgICAgIDB4MzUsIDB4NjksIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NDgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDEsCi0gICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4NDgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDEsIDB4NDQsIDB4MzksIDB4MzAsCi0gICAgICAgIDB4MzUsIDB4NjksIDB4MjAsIDB4NTYsIDB4NjUsIDB4NzIsIDB4MzEsIDB4MmUsIDB4MzAsIDB4MzAsIDB4MDAsCi0gICAgICAgIDB4MzIsIDB4MzAsIDB4MzAsIDB4MzgsIDB4M2EsIDB4MzEsIDB4MzAsIDB4M2EsIDB4MzIsIDB4MzksIDB4MjAsCi0gICAgICAgIDB4MzEsIDB4MzMsIDB4M2EsIDB4MzUsIDB4MzUsIDB4M2EsIDB4MzQsIDB4MzcsIDB4MDAsIDB4MjAsIDB4MjAsCi0gICAgICAgIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsCi0gICAgICAgIDB4MDAsIDB4NTAsIDB4NzIsIDB4NjksIDB4NmUsIDB4NzQsIDB4NDksIDB4NGQsIDB4MDAsIDB4MzAsIDB4MzMsCi0gICAgICAgIDB4MzAsIDB4MzAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDYsIDB4MDAsIDB4MDEsIDB4MDAsIDB4MTQsIDB4MDAsCi0gICAgICAgIDB4MTQsIDB4MDAsIDB4MDIsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDMsIDB4MDAsIDB4MDAsCi0gICAgICAgIDB4MDAsIDB4MzQsIDB4MDEsIDB4MDAsIDB4MDUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDEsIDB4MDEsIDB4MDEsCi0gICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDEsIDB4MTAsIDB4ODAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0gICAgICAgIDB4MTEsIDB4MDksIDB4MDAsIDB4MDAsIDB4MjcsIDB4MTAsIDB4MDAsIDB4MDAsIDB4MGYsIDB4MGIsIDB4MDAsCi0gICAgICAgIDB4MDAsIDB4MjcsIDB4MTAsIDB4MDAsIDB4MDAsIDB4MDUsIDB4OTcsIDB4MDAsIDB4MDAsIDB4MjcsIDB4MTAsCi0gICAgICAgIDB4MDAsIDB4MDAsIDB4MDgsIDB4YjAsIDB4MDAsIDB4MDAsIDB4MjcsIDB4MTAsIDB4MDAsIDB4MDAsIDB4MWMsCi0gICAgICAgIDB4MDEsIDB4MDAsIDB4MDAsIDB4MjcsIDB4MTAsIDB4MDAsIDB4MDAsIDB4MDIsIDB4NWUsIDB4MDAsIDB4MDAsCi0gICAgICAgIDB4MjcsIDB4MTAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OGIsIDB4MDAsIDB4MDAsIDB4MjcsIDB4MTAsIDB4MDAsCi0gICAgICAgIDB4MDAsIDB4MDMsIDB4Y2IsIDB4MDAsIDB4MDAsIDB4MjcsIDB4MTAsIDB4MDAsIDB4MDAsIDB4MWIsIDB4ZTUsCi0gICAgICAgIDB4MDAsIDB4MDAsIDB4MjcsIDB4MTAsIDB4MDAsIDB4MjgsIDB4ODIsIDB4OWEsIDB4MDAsIDB4MDUsIDB4MDAsCi0gICAgICAgIDB4MDAsIDB4MDAsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MDMsIDB4NmEsIDB4ODIsIDB4OWQsIDB4MDAsIDB4MDUsCi0gICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MDMsIDB4NzIsIDB4ODgsIDB4MjIsIDB4MDAsCi0gICAgICAgIDB4MDMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDEsIDB4MDAsIDB4MDIsIDB4MDAsIDB4MDAsIDB4OTAsIDB4MDAsCi0gICAgICAgIDB4MDAsIDB4MDcsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDQsIDB4MzAsIDB4MzIsIDB4MzIsIDB4MzAsIDB4OTAsCi0gICAgICAgIDB4MDMsIDB4MDAsIDB4MDIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MTQsIDB4MDAsIDB4MDAsIDB4MDMsIDB4N2EsCi0gICAgICAgIDB4OTAsIDB4MDQsIDB4MDAsIDB4MDIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MTQsIDB4MDAsIDB4MDAsIDB4MDMsCi0gICAgICAgIDB4OGUsIDB4OTEsIDB4MDEsIDB4MDAsIDB4MDcsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDQsIDB4MDEsIDB4MDIsCi0gICAgICAgIDB4MDMsIDB4MDAsIDB4OTEsIDB4MDIsIDB4MDAsIDB4MDUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDEsIDB4MDAsCi0gICAgICAgIDB4MDAsIDB4MDMsIDB4YTIsIDB4OTIsIDB4MDEsIDB4MDAsIDB4MGEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDEsCi0gICAgICAgIDB4MDAsIDB4MDAsIDB4MDMsIDB4YWEsIDB4OTIsIDB4MDIsIDB4MDAsIDB4MDUsIDB4MDAsIDB4MDAsIDB4MDAsCi0gICAgICAgIDB4MDEsIDB4MDAsIDB4MDAsIDB4MDMsIDB4YjIsIDB4OTIsIDB4MDQsIDB4MDAsIDB4MGEsIDB4MDAsIDB4MDAsCi0gICAgICAgIDB4MDAsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MDMsIDB4YmEsIDB4OTIsIDB4MDUsIDB4MDAsIDB4MDUsIDB4MDAsCi0gICAgICAgIDB4MDAsIDB4MDAsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MDMsIDB4YzIsIDB4OTIsIDB4MDcsIDB4MDAsIDB4MDMsCi0gICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDEsIDB4MDAsIDB4MDIsIDB4MDAsIDB4MDAsIDB4OTIsIDB4MDgsIDB4MDAsCi0gICAgICAgIDB4MDMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OTIsIDB4MDksCi0gICAgICAgIDB4MDAsIDB4MDMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OTIsCi0gICAgICAgIDB4MGEsIDB4MDAsIDB4MDUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MDMsIDB4Y2EsCi0gICAgICAgIDB4OTIsIDB4N2MsIDB4MDAsIDB4MDcsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MDAsCi0gICAgICAgIDB4MDAsIDB4OTIsIDB4ODYsIDB4MDAsIDB4MDcsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MTYsIDB4MDAsIDB4MDAsCi0gICAgICAgIDB4MDMsIDB4ZDIsIDB4YTAsIDB4MDAsIDB4MDAsIDB4MDcsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDQsIDB4MzAsCi0gICAgICAgIDB4MzEsIDB4MzAsIDB4MzAsIDB4YTAsIDB4MDEsIDB4MDAsIDB4MDMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDEsCi0gICAgICAgIDB4MDAsIDB4MDEsIDB4MDAsIDB4MDAsIDB4YTAsIDB4MDIsIDB4MDAsIDB4MDMsIDB4MDAsIDB4MDAsIDB4MDAsCi0gICAgICAgIDB4MDEsIDB4MDAsIDB4NjAsIDB4MDAsIDB4MDAsIDB4YTAsIDB4MDMsIDB4MDAsIDB4MDMsIDB4MDAsIDB4MDAsCi0gICAgICAgIDB4MDAsIDB4MDEsIDB4MDAsIDB4NDgsIDB4MDAsIDB4MDAsIDB4YTAsIDB4MDUsIDB4MDAsIDB4MDQsIDB4MDAsCi0gICAgICAgIDB4MDAsIDB4MDAsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MDQsIDB4MDAsIDB4YTIsIDB4MGUsIDB4MDAsIDB4MDUsCi0gICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MDMsIDB4ZTgsIDB4YTIsIDB4MGYsIDB4MDAsCi0gICAgICAgIDB4MDUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MDMsIDB4ZjAsIDB4YTIsIDB4MTAsCi0gICAgICAgIDB4MDAsIDB4MDMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDEsIDB4MDAsIDB4MDIsIDB4MDAsIDB4MDAsIDB4YTIsCi0gICAgICAgIDB4MTcsIDB4MDAsIDB4MDMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDEsIDB4MDAsIDB4MDIsIDB4MDAsIDB4MDAsCi0gICAgICAgIDB4YTMsIDB4MDAsIDB4MDAsIDB4MDcsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDEsIDB4MDMsIDB4MDAsIDB4MDAsCi0gICAgICAgIDB4MDAsIDB4YTMsIDB4MDEsIDB4MDAsIDB4MDcsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDEsIDB4MDEsIDB4MDAsCi0gICAgICAgIDB4MDAsIDB4MDAsIDB4YTQsIDB4MDEsIDB4MDAsIDB4MDMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDEsIDB4MDAsCi0gICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4YTQsIDB4MDIsIDB4MDAsIDB4MDMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDEsCi0gICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4YTQsIDB4MDMsIDB4MDAsIDB4MDMsIDB4MDAsIDB4MDAsIDB4MDAsCi0gICAgICAgIDB4MDEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4YTQsIDB4MDQsIDB4MDAsIDB4MDUsIDB4MDAsIDB4MDAsCi0gICAgICAgIDB4MDAsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MDMsIDB4ZjgsIDB4YTQsIDB4MDUsIDB4MDAsIDB4MDMsIDB4MDAsCi0gICAgICAgIDB4MDAsIDB4MDAsIDB4MDEsIDB4MDAsIDB4MWQsIDB4MDAsIDB4MDAsIDB4YTQsIDB4MDYsIDB4MDAsIDB4MDMsCi0gICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4YTQsIDB4MDcsIDB4MDAsCi0gICAgICAgIDB4MDMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4YTQsIDB4MDgsCi0gICAgICAgIDB4MDAsIDB4MDMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4YTQsCi0gICAgICAgIDB4MDksIDB4MDAsIDB4MDMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0gICAgICAgIDB4YTQsIDB4MGEsIDB4MDAsIDB4MDMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MDAsCi0gICAgICAgIDB4MDAsIDB4YTQsIDB4MGMsIDB4MDAsIDB4MDMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDEsIDB4MDAsIDB4MDIsCi0gICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NTMsIDB4MDAsCi0gICAgICAgIDB4MDAsIDB4MjcsIDB4MTAsIDB4MDAsIDB4MDAsIDB4MDEsIDB4NWUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NjQsCi0gICAgICAgIDB4MzIsIDB4MzAsIDB4MzAsIDB4MzgsIDB4M2EsIDB4MzEsIDB4MzAsIDB4M2EsIDB4MzIsIDB4MzksIDB4MjAsCi0gICAgICAgIDB4MzEsIDB4MzMsIDB4M2EsIDB4MzUsIDB4MzUsIDB4M2EsIDB4MzMsIDB4MzEsIDB4MDAsIDB4MzIsIDB4MzAsCi0gICAgICAgIDB4MzAsIDB4MzgsIDB4M2EsIDB4MzEsIDB4MzAsIDB4M2EsIDB4MzIsIDB4MzksIDB4MjAsIDB4MzEsIDB4MzMsCi0gICAgICAgIDB4M2EsIDB4MzUsIDB4MzUsIDB4M2EsIDB4MzQsIDB4MzcsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MjksIDB4ODgsCi0gICAgICAgIDB4MDAsIDB4MDAsIDB4MWIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDIsIDB4YjIsIDB4MDAsIDB4MDAsIDB4MDAsCi0gICAgICAgIDB4NjQsIDB4MDAsIDB4MDAsIDB4MDEsIDB4NWUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NjQsIDB4MDAsIDB4MDAsCi0gICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NjQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MjUsIDB4MDAsCi0gICAgICAgIDB4MDAsIDB4MDAsIDB4MGEsIDB4MDAsIDB4MDAsIDB4MGUsIDB4OTIsIDB4MDAsIDB4MDAsIDB4MDMsIDB4ZTgsCi0gICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MzIsIDB4MzAsIDB4MzAsCi0gICAgICAgIDB4MzgsIDB4MzEsIDB4MzAsIDB4MzIsIDB4MzksIDB4MzEsIDB4MzMsIDB4MzUsIDB4MzUsIDB4MzMsIDB4MzEsCi0gICAgICAgIDB4MDAsIDB4MDAsIDB4MjAsIDB4MmEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MGEsIDB4MDAsIDB4MDAsIDB4MmEsCi0gICAgICAgIDB4ZTIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MGEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0gICAgICAgIDB4MDAsIDB4MDEsIDB4MDAsIDB4MDIsIDB4MDAsIDB4MDEsIDB4MDAsIDB4MDIsIDB4MDAsIDB4MDAsIDB4MDAsCi0gICAgICAgIDB4MDQsIDB4NTIsIDB4MzksIDB4MzgsIDB4MDAsIDB4MDAsIDB4MDIsIDB4MDAsIDB4MDcsIDB4MDAsIDB4MDAsCi0gICAgICAgIDB4MDAsIDB4MDQsIDB4MzAsIDB4MzEsIDB4MzAsIDB4MzAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0gICAgICAgIDB4MDYsIDB4MDEsIDB4MDMsIDB4MDAsIDB4MDMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDEsIDB4MDAsIDB4MDYsCi0gICAgICAgIDB4MDAsIDB4MDAsIDB4MDEsIDB4MWEsIDB4MDAsIDB4MDUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDEsIDB4MDAsCi0gICAgICAgIDB4MDAsIDB4MDQsIDB4NmMsIDB4MDEsIDB4MWIsIDB4MDAsIDB4MDUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDEsCi0gICAgICAgIDB4MDAsIDB4MDAsIDB4MDQsIDB4NzQsIDB4MDEsIDB4MjgsIDB4MDAsIDB4MDMsIDB4MDAsIDB4MDAsIDB4MDAsCi0gICAgICAgIDB4MDEsIDB4MDAsIDB4MDIsIDB4MDAsIDB4MDAsIDB4MDIsIDB4MDEsIDB4MDAsIDB4MDQsIDB4MDAsIDB4MDAsCi0gICAgICAgIDB4MDAsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MDQsIDB4N2MsIDB4MDIsIDB4MDIsIDB4MDAsIDB4MDQsIDB4MDAsCi0gICAgICAgIDB4MDAsIDB4MDAsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MDUsIDB4OGIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0gICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4NDgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MDAsCi0gICAgICAgIDB4NDgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDEsIDB4ZmYsIDB4ZDgsIDB4ZmYsIDB4ZGIsIDB4MDAsIDB4ODQsCi0gICAgICAgIDB4MDAsIDB4MjAsIDB4MTYsIDB4MTgsIDB4MWMsIDB4MTgsIDB4MTQsIDB4MjAsIDB4MWMsIDB4MWEsIDB4MWMsCi0gICAgICAgIDB4MjQsIDB4MjIsIDB4MjAsIDB4MjYsIDB4MzAsIDB4NTAsIDB4MzQsIDB4MzAsIDB4MmMsIDB4MmMsIDB4MzAsCi0gICAgICAgIDB4NjIsIDB4NDYsIDB4NGEsIDB4M2EsIDB4NTAsIDB4NzQsIDB4NjYsIDB4N2EsIDB4NzgsIDB4NzIsIDB4NjYsCi0gICAgICAgIDB4NzAsIDB4NmUsIDB4ODAsIDB4OTAsIDB4YjgsIDB4OWMsIDB4ODAsIDB4ODgsIDB4YWUsIDB4OGEsIDB4NmUsCi0gICAgICAgIDB4NzAsIDB4YTAsIDB4ZGEsIDB4YTIsIDB4YWUsIDB4YmUsIDB4YzQsIDB4Y2UsIDB4ZDAsIDB4Y2UsIDB4N2MsCi0gICAgICAgIDB4OWEsIDB4ZTIsIDB4ZjIsIDB4ZTAsIDB4YzgsIDB4ZjAsIDB4YjgsIDB4Y2EsIDB4Y2UsIDB4YzYsIDB4MDEsCi0gICAgICAgIDB4MjIsIDB4MjQsIDB4MjQsIDB4MzAsIDB4MmEsIDB4MzAsIDB4NWUsIDB4MzQsIDB4MzQsIDB4NWUsIDB4YzYsCi0gICAgICAgIDB4ODQsIDB4NzAsIDB4ODQsIDB4YzYsIDB4YzYsIDB4YzYsIDB4YzYsIDB4YzYsIDB4YzYsIDB4YzYsIDB4YzYsCi0gICAgICAgIDB4YzYsIDB4YzYsIDB4YzYsIDB4YzYsIDB4YzYsIDB4YzYsIDB4YzYsIDB4YzYsIDB4YzYsIDB4YzYsIDB4YzYsCi0gICAgICAgIDB4YzYsIDB4YzYsIDB4YzYsIDB4YzYsIDB4YzYsIDB4YzYsIDB4YzYsIDB4YzYsIDB4YzYsIDB4YzYsIDB4YzYsCi0gICAgICAgIDB4YzYsIDB4YzYsIDB4YzYsIDB4YzYsIDB4YzYsIDB4YzYsIDB4YzYsIDB4YzYsIDB4YzYsIDB4YzYsIDB4YzYsCi0gICAgICAgIDB4YzYsIDB4YzYsIDB4YzYsIDB4YzYsIDB4YzYsIDB4YzYsIDB4YzYsIDB4YzYsIDB4YzYsIDB4ZmYsIDB4YzAsCi0gICAgICAgIDB4MDAsIDB4MTEsIDB4MDgsIDB4MDAsIDB4NzgsIDB4MDAsIDB4YTAsIDB4MDMsIDB4MDEsIDB4MjEsIDB4MDAsCi0gICAgICAgIDB4MDIsIDB4MTEsIDB4MDEsIDB4MDMsIDB4MTEsIDB4MDEsIDB4ZmYsIDB4YzQsIDB4MDEsIDB4YTIsIDB4MDAsCi0gICAgICAgIDB4MDAsIDB4MDEsIDB4MDUsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDAsIDB4MDAsCi0gICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDEsIDB4MDIsIDB4MDMsIDB4MDQsIDB4MDUsCi0gICAgICAgIDB4MDYsIDB4MDcsIDB4MDgsIDB4MDksIDB4MGEsIDB4MGIsIDB4MTAsIDB4MDAsIDB4MDIsIDB4MDEsIDB4MDMsCi0gICAgICAgIDB4MDMsIDB4MDIsIDB4MDQsIDB4MDMsIDB4MDUsIDB4MDUsIDB4MDQsIDB4MDQsIDB4MDAsIDB4MDAsIDB4MDEsCi0gICAgICAgIDB4N2QsIDB4MDEsIDB4MDIsIDB4MDMsIDB4MDAsIDB4MDQsIDB4MTEsIDB4MDUsIDB4MTIsIDB4MjEsIDB4MzEsCi0gICAgICAgIDB4NDEsIDB4MDYsIDB4MTMsIDB4NTEsIDB4NjEsIDB4MDcsIDB4MjIsIDB4NzEsIDB4MTQsIDB4MzIsIDB4ODEsCi0gICAgICAgIDB4OTEsIDB4YTEsIDB4MDgsIDB4MjMsIDB4NDIsIDB4YjEsIDB4YzEsIDB4MTUsIDB4NTIsIDB4ZDEsIDB4ZjAsCi0gICAgICAgIDB4MjQsIDB4MzMsIDB4NjIsIDB4NzIsIDB4ODIsIDB4MDksIDB4MGEsIDB4MTYsIDB4MTcsIDB4MTgsIDB4MTksCi0gICAgICAgIDB4MWEsIDB4MjUsIDB4MjYsIDB4MjcsIDB4MjgsIDB4MjksIDB4MmEsIDB4MzQsIDB4MzUsIDB4MzYsIDB4MzcsCi0gICAgICAgIDB4MzgsIDB4MzksIDB4M2EsIDB4NDMsIDB4NDQsIDB4NDUsIDB4NDYsIDB4NDcsIDB4NDgsIDB4NDksIDB4NGEsCi0gICAgICAgIDB4NTMsIDB4NTQsIDB4NTUsIDB4NTYsIDB4NTcsIDB4NTgsIDB4NTksIDB4NWEsIDB4NjMsIDB4NjQsIDB4NjUsCi0gICAgICAgIDB4NjYsIDB4NjcsIDB4NjgsIDB4NjksIDB4NmEsIDB4NzMsIDB4NzQsIDB4NzUsIDB4NzYsIDB4NzcsIDB4NzgsCi0gICAgICAgIDB4NzksIDB4N2EsIDB4ODMsIDB4ODQsIDB4ODUsIDB4ODYsIDB4ODcsIDB4ODgsIDB4ODksIDB4OGEsIDB4OTIsCi0gICAgICAgIDB4OTMsIDB4OTQsIDB4OTUsIDB4OTYsIDB4OTcsIDB4OTgsIDB4OTksIDB4OWEsIDB4YTIsIDB4YTMsIDB4YTQsCi0gICAgICAgIDB4YTUsIDB4YTYsIDB4YTcsIDB4YTgsIDB4YTksIDB4YWEsIDB4YjIsIDB4YjMsIDB4YjQsIDB4YjUsIDB4YjYsCi0gICAgICAgIDB4YjcsIDB4YjgsIDB4YjksIDB4YmEsIDB4YzIsIDB4YzMsIDB4YzQsIDB4YzUsIDB4YzYsIDB4YzcsIDB4YzgsCi0gICAgICAgIDB4YzksIDB4Y2EsIDB4ZDIsIDB4ZDMsIDB4ZDQsIDB4ZDUsIDB4ZDYsIDB4ZDcsIDB4ZDgsIDB4ZDksIDB4ZGEsCi0gICAgICAgIDB4ZTEsIDB4ZTIsIDB4ZTMsIDB4ZTQsIDB4ZTUsIDB4ZTYsIDB4ZTcsIDB4ZTgsIDB4ZTksIDB4ZWEsIDB4ZjEsCi0gICAgICAgIDB4ZjIsIDB4ZjMsIDB4ZjQsIDB4ZjUsIDB4ZjYsIDB4ZjcsIDB4ZjgsIDB4ZjksIDB4ZmEsIDB4MDEsIDB4MDAsCi0gICAgICAgIDB4MDMsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDAsCi0gICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDEsIDB4MDIsIDB4MDMsIDB4MDQsIDB4MDUsIDB4MDYsCi0gICAgICAgIDB4MDcsIDB4MDgsIDB4MDksIDB4MGEsIDB4MGIsIDB4MTEsIDB4MDAsIDB4MDIsIDB4MDEsIDB4MDIsIDB4MDQsCi0gICAgICAgIDB4MDQsIDB4MDMsIDB4MDQsIDB4MDcsIDB4MDUsIDB4MDQsIDB4MDQsIDB4MDAsIDB4MDEsIDB4MDIsIDB4NzcsCi0gICAgICAgIDB4MDAsIDB4MDEsIDB4MDIsIDB4MDMsIDB4MTEsIDB4MDQsIDB4MDUsIDB4MjEsIDB4MzEsIDB4MDYsIDB4MTIsCi0gICAgICAgIDB4NDEsIDB4NTEsIDB4MDcsIDB4NjEsIDB4NzEsIDB4MTMsIDB4MjIsIDB4MzIsIDB4ODEsIDB4MDgsIDB4MTQsCi0gICAgICAgIDB4NDIsIDB4OTEsIDB4YTEsIDB4YjEsIDB4YzEsIDB4MDksIDB4MjMsIDB4MzMsIDB4NTIsIDB4ZjAsIDB4MTUsCi0gICAgICAgIDB4NjIsIDB4NzIsIDB4ZDEsIDB4MGEsIDB4MTYsIDB4MjQsIDB4MzQsIDB4ZTEsIDB4MjUsIDB4ZjEsIDB4MTcsCi0gICAgICAgIDB4MTgsIDB4MTksIDB4MWEsIDB4MjYsIDB4MjcsIDB4MjgsIDB4MjksIDB4MmEsIDB4MzUsIDB4MzYsIDB4MzcsCi0gICAgICAgIDB4MzgsIDB4MzksIDB4M2EsIDB4NDMsIDB4NDQsIDB4NDUsIDB4NDYsIDB4NDcsIDB4NDgsIDB4NDksIDB4NGEsCi0gICAgICAgIDB4NTMsIDB4NTQsIDB4NTUsIDB4NTYsIDB4NTcsIDB4NTgsIDB4NTksIDB4NWEsIDB4NjMsIDB4NjQsIDB4NjUsCi0gICAgICAgIDB4NjYsIDB4NjcsIDB4NjgsIDB4NjksIDB4NmEsIDB4NzMsIDB4NzQsIDB4NzUsIDB4NzYsIDB4NzcsIDB4NzgsCi0gICAgICAgIDB4NzksIDB4N2EsIDB4ODIsIDB4ODMsIDB4ODQsIDB4ODUsIDB4ODYsIDB4ODcsIDB4ODgsIDB4ODksIDB4OGEsCi0gICAgICAgIDB4OTIsIDB4OTMsIDB4OTQsIDB4OTUsIDB4OTYsIDB4OTcsIDB4OTgsIDB4OTksIDB4OWEsIDB4YTIsIDB4YTMsCi0gICAgICAgIDB4YTQsIDB4YTUsIDB4YTYsIDB4YTcsIDB4YTgsIDB4YTksIDB4YWEsIDB4YjIsIDB4YjMsIDB4YjQsIDB4YjUsCi0gICAgICAgIDB4YjYsIDB4YjcsIDB4YjgsIDB4YjksIDB4YmEsIDB4YzIsIDB4YzMsIDB4YzQsIDB4YzUsIDB4YzYsIDB4YzcsCi0gICAgICAgIDB4YzgsIDB4YzksIDB4Y2EsIDB4ZDIsIDB4ZDMsIDB4ZDQsIDB4ZDUsIDB4ZDYsIDB4ZDcsIDB4ZDgsIDB4ZDksCi0gICAgICAgIDB4ZGEsIDB4ZTIsIDB4ZTMsIDB4ZTQsIDB4ZTUsIDB4ZTYsIDB4ZTcsIDB4ZTgsIDB4ZTksIDB4ZWEsIDB4ZjIsCi0gICAgICAgIDB4ZjMsIDB4ZjQsIDB4ZjUsIDB4ZjYsIDB4ZjcsIDB4ZjgsIDB4ZjksIDB4ZmEsIDB4ZmYsIDB4ZGEsIDB4MDAsCi0gICAgICAgIDB4MGMsIDB4MDMsIDB4MDEsIDB4MDAsIDB4MDIsIDB4MTEsIDB4MDMsIDB4MTEsIDB4MDAsIDB4M2YsIDB4MDAsCi0gICAgICAgIDB4MTQsIDB4NTQsIDB4YWEsIDB4MmEsIDB4NDYsIDB4NDgsIDB4YTIsIDB4YTQsIDB4NTUsIDB4YTYsIDB4MDQsCi0gICAgICAgIDB4OGEsIDB4MjksIDB4ZTAsIDB4NTMsIDB4MTAsIDB4ZTAsIDB4MjksIDB4YzAsIDB4NTAsIDB4MDMsIDB4YjEsCi0gICAgICAgIDB4NDYsIDB4MjksIDB4ODAsIDB4ODQsIDB4NTIsIDB4MTEsIDB4NDAsIDB4MGQsIDB4MjIsIDB4OWEsIDB4NDUsCi0gICAgICAgIDB4MjAsIDB4MjMsIDB4NjEsIDB4NTEsIDB4MzAsIDB4YTAsIDB4MDgsIDB4YzgsIDB4YTgsIDB4ZDgsIDB4NTIsCi0gICAgICAgIDB4MDIsIDB4MjYsIDB4MTUsIDB4MGIsIDB4MGEsIDB4MDAsIDB4YjQsIDB4YTIsIDB4YTUsIDB4NWEsIDB4MDAsCi0gICAgICAgIDB4OTEsIDB4NDUsIDB4NGEsIDB4YTIsIDB4ODEsIDB4OTIsIDB4MDEsIDB4NGUsIDB4MDIsIDB4OTgsIDB4ODcsCi0gICAgICAgIDB4MGEsIDB4NzAsIDB4YTAsIDB4MDcsIDB4NjIsIDB4OGMsIDB4NTAsIDB4MjEsIDB4MGQsIDB4MjUsIDB4MDAsCi0gICAgICAgIDB4MzQsIDB4OGEsIDB4NjEsIDB4MTQsIDB4MGMsIDB4NjMsIDB4MGEsIDB4ODksIDB4ODUsIDB4MDAsIDB4NDYsCi0gICAgICAgIDB4ZDUsIDB4MWIsIDB4NTIsIDB4MDIsIDB4MTYsIDB4YTgsIDB4OTgsIDB4NTAsIDB4MDUsIDB4OTQsIDB4YTksCi0gICAgICAgIDB4MTYsIDB4ODAsIDB4MjUsIDB4NWEsIDB4OTUsIDB4NjgsIDB4MTgsIDB4ZjEsIDB4NGYsIDB4MTQsIDB4YzQsCi0gICAgICAgIDB4M2IsIDB4YjUsIDB4MjIsIDB4YjYsIDB4MzgsIDB4MzQsIDB4MDAsIDB4ZTMsIDB4MjIsIDB4OGUsIDB4ZjQsCi0gICAgICAgIDB4NzksIDB4OGEsIDB4N2IsIDB4ZDEsIDB4NzEsIDB4MDMsIDB4MzAsIDB4YzcsIDB4MTQsIDB4ODMsIDB4YTUsCi0gICAgICAgIDB4MDAsIDB4MDYsIDB4OTgsIDB4NjgsIDB4MDEsIDB4OGQsIDB4NTEsIDB4MzUsIDB4MDMsIDB4MjIsIDB4NmEsCi0gICAgICAgIDB4OGQsIDB4YTksIDB4MDEsIDB4MTMsIDB4NTQsIDB4NGQsIDB4NDAsIDB4MTMsIDB4YTUsIDB4NGEsIDB4MjgsCi0gICAgICAgIDB4MDIsIDB4NDUsIDB4MzUsIDB4MmEsIDB4OWEsIDB4MDAsIDB4NzgsIDB4MzQsIDB4ZjAsIDB4NjksIDB4ODAsCi0gICAgICAgIDB4MzQsIDB4ODEsIDB4NDUsIDB4NDAsIDB4Y2UsIDB4NTgsIDB4ZTYsIDB4YTIsIDB4NGMsIDB4MDYsIDB4ZTQsCi0gICAgICAgIDB4ZmEsIDB4ZDEsIDB4OTMsIDB4NTAsIDB4MjEsIDB4Y2EsIDB4ZTQsIDB4NTUsIDB4ODQsIDB4OTAsIDB4MzAsCi0gICAgICAgIDB4YWIsIDB4OGIsIDB4MTgsIDB4YTYsIDB4OWEsIDB4NmEsIDB4YzQsIDB4MzEsIDB4YWEsIDB4MjYsIDB4YTAsCi0gICAgICAgIDB4NjQsIDB4NGQsIDB4NTEsIDB4YjUsIDB4MjAsIDB4MjMsIDB4NmEsIDB4ODksIDB4YTgsIDB4MDIsIDB4NDQsCi0gICAgICAgIDB4MzUsIDB4MmEsIDB4OWEsIDB4MDAsIDB4OTUsIDB4NGQsIDB4NDgsIDB4YTYsIDB4ODAsIDB4MjQsIDB4NTMsCi0gICAgICAgIDB4NGUsIDB4Y2UsIDB4MDUsIDB4MzAsIDB4MmIsIDB4M2IsIDB4ZWUsIDB4NmEsIDB4OTEsIDB4NWQsIDB4NzYsCi0gICAgICAgIDB4NjMsIDB4YmQsIDB4NjUsIDB4N2QsIDB4NDAsIDB4NjYsIDB4NjgsIDB4YTksIDB4MDIsIDB4NDUsIDB4MmIsCi0gICAgICAgIDB4YjMsIDB4OWUsIDB4YjQsIDB4YzUsIDB4NmQsIDB4YWQsIDB4OWEsIDB4YTAsIDB4MmMsIDB4MDYsIDB4YzgsCi0gICAgICAgIDB4Y2QsIDB4MDQsIDB4ZDYsIDB4YTIsIDB4MjMsIDB4NjMsIDB4NTEsIDB4YjEsIDB4YTAsIDB4NjQsIDB4NGQsCi0gICAgICAgIDB4NTEsIDB4OTMsIDB4NDgsIDB4MDgsIDB4ZGEsIDB4YTIsIDB4NmEsIDB4MDAsIDB4NzIsIDB4MWEsIDB4OTksCi0gICAgICAgIDB4NGQsIDB4MDAsIDB4NDgsIDB4YTYsIDB4YTQsIDB4NTMsIDB4NGMsIDB4MDcsIDB4ODYsIDB4MDMsIDB4YmQsCi0gICAgICAgIDB4MmIsIDB4OWMsIDB4YTcsIDB4MTQsIDB4OTgsIDB4MTAsIDB4ODUsIDB4MzQsIDB4ZTAsIDB4YTYsIDB4YjMsCi0gICAgICAgIDB4YjAsIDB4MGIsIDB4YjUsIDB4YTgsIDB4MGEsIDB4ZDQsIDB4NTgsIDB4NDIsIDB4ZWQsIDB4M2UsIDB4OTQsCi0gICAgICAgIDB4ZDIsIDB4YTYsIDB4OGIsIDB4MDEsIDB4MzQsIDB4NDQsIDB4ZWQsIDB4ZTYsIDB4OWMsIDB4NGQsIDB4NmEsCi0gICAgICAgIDB4ODAsIDB4OGQsIDB4OGQsIDB4NDYsIDB4YzYsIDB4ODAsIDB4MjMsIDB4NjMsIDB4NTEsIDB4OWEsIDB4MDYsCi0gICAgICAgIDB4NDYsIDB4ZDUsIDB4MTMsIDB4NTIsIDB4MDEsIDB4NTQsIDB4ZDQsIDB4YWEsIDB4NjgsIDB4MDIsIDB4NDAsCi0gICAgICAgIDB4NmEsIDB4NDAsIDB4NzgsIDB4YTAsIDB4MDgsIDB4NTksIDB4Y2UsIDB4ZWUsIDB4YjUsIDB4MmEsIDB4MzksCi0gICAgICAgIDB4ZDksIDB4NTksIDB4YTcsIDB4YTgsIDB4MDAsIDB4NzMsIDB4ZWIsIDB4NGUsIDB4MGUsIDB4N2QsIDB4NjksCi0gICAgICAgIDB4NWMsIDB4MDUsIDB4ZjMsIDB4MGYsIDB4YWQsIDB4MWUsIDB4NjEsIDB4ZjUsIDB4YTcsIDB4NzEsIDB4MGIsCi0gICAgICAgIDB4ZTYsIDB4MzUsIDB4MjEsIDB4OTAsIDB4ZDMsIDB4YjgsIDB4MGUsIDB4MzIsIDB4MTAsIDB4OTUsIDB4MTAsCi0gICAgICAgIDB4OTEsIDB4YjMsIDB4ZDYsIDB4OWIsIDB4NjAsIDB4NGIsIDB4OWMsIDB4OGEsIDB4NjMsIDB4MWEsIDB4YjAsCi0gICAgICAgIDB4MTgsIDB4NGQsIDB4NDYsIDB4YzYsIDB4ODAsIDB4MjIsIDB4NmEsIDB4NjEsIDB4YTQsIDB4MzEsIDB4YWEsCi0gICAgICAgIDB4NmEsIDB4NTUsIDB4MzQsIDB4MDEsIDB4MmEsIDB4OWEsIDB4N2UsIDB4NzgsIDB4YTAsIDB4MDgsIDB4MDksCi0gICAgICAgIDB4ZjksIDB4YWEsIDB4NTgsIDB4Y2YsIDB4Y2EsIDB4NmIsIDB4M2UsIDB4YTAsIDB4MDAsIDB4ZDMsIDB4ODEsCi0gICAgICAgIDB4YTksIDB4MDEsIDB4NzMsIDB4NDYsIDB4NjksIDB4ODAsIDB4YjksIDB4YTQsIDB4Y2QsIDB4MDAsIDB4MmIsCi0gICAgICAgIDB4MWYsIDB4OTIsIDB4YTMsIDB4MDcsIDB4OWEsIDB4NmYsIDB4NzAsIDB4MjYsIDB4Y2YsIDB4MTQsIDB4ZDIsCi0gICAgICAgIDB4NmIsIDB4NTEsIDB4MGMsIDB4NjMsIDB4NTEsIDB4YjEsIDB4YTAsIDB4MDgsIDB4ZGEsIDB4OTgsIDB4NjksCi0gICAgICAgIDB4MGMsIDB4OGQsIDB4NGQsIDB4NGEsIDB4YTYsIDB4ODAsIDB4MjQsIDB4NTMsIDB4NTIsIDB4MDMsIDB4YzUsCi0gICAgICAgIDB4MDIsIDB4MjEsIDB4MjcsIDB4ZTYsIDB4YTksIDB4MjMsIDB4M2YsIDB4MjksIDB4YWMsIDB4ZmEsIDB4OGMsCi0gICAgICAgIDB4MDEsIDB4ZTYsIDB4OWMsIDB4MGQsIDB4NDgsIDB4MGEsIDB4MGQsIDB4MmUsIDB4NjgsIDB4MDEsIDB4NzMsCi0gICAgICAgIDB4NDksIDB4OWEsIDB4NjAsIDB4MmIsIDB4MWYsIDB4OTIsIDB4OTgsIDB4M2EsIDB4ZDMsIDB4N2IsIDB4ODEsCi0gICAgICAgIDB4MzYsIDB4NzgsIDB4YTYsIDB4OTMsIDB4NWEsIDB4ODgsIDB4OGMsIDB4OWEsIDB4NjMsIDB4MWEsIDB4MDAsCi0gICAgICAgIDB4OGMsIDB4ZDMsIDB4MGQsIDB4MjEsIDB4OTEsIDB4MjksIDB4YTksIDB4MTQsIDB4ZDAsIDB4MDQsIDB4OGEsCi0gICAgICAgIDB4NjksIDB4ZTAsIDB4ZDMsIDB4MTEsIDB4MWIsIDB4MWUsIDB4NmEsIDB4NDgsIDB4Y2YsIDB4Y2EsIDB4NmIsCi0gICAgICAgIDB4M2UsIDB4YTMsIDB4MTAsIDB4MWEsIDB4NzAsIDB4MzUsIDB4MjAsIDB4MzgsIDB4MWEsIDB4NWMsIDB4ZDIsCi0gICAgICAgIDB4MDEsIDB4NzMsIDB4NDksIDB4OWEsIDB4NjAsIDB4MzksIDB4OGYsIDB4Y2EsIDB4MjksIDB4OGIsIDB4ZjcsCi0gICAgICAgIDB4YWEsIDB4YmEsIDB4ODgsIDB4OTYsIDB4OWEsIDB4NmIsIDB4NDAsIDB4MTgsIDB4YzYsIDB4YTMsIDB4MjYsCi0gICAgICAgIDB4ODAsIDB4MTgsIDB4NjksIDB4YTYsIDB4OTAsIDB4YzgsIDB4MTQsIDB4ZDQsIDB4OGEsIDB4NjksIDB4ODAsCi0gICAgICAgIDB4ZjAsIDB4NmEsIDB4NDAsIDB4NjgsIDB4MTAsIDB4YmIsIDB4NDEsIDB4YTcsIDB4ZTMsIDB4MGIsIDB4YzUsCi0gICAgICAgIDB4MmIsIDB4MDEsIDB4MTAsIDB4YTcsIDB4MDMsIDB4NTksIDB4MGMsIDB4NzYsIDB4NjksIDB4NzMsIDB4NDAsCi0gICAgICAgIDB4MGIsIDB4OWEsIDB4MjgsIDB4MTEsIDB4MjgsIDB4MTksIDB4NWUsIDB4NjksIDB4MDIsIDB4ODEsIDB4NWEsCi0gICAgICAgIDB4ZDgsIDB4MDAsIDB4ZDMsIDB4NGQsIDB4NTAsIDB4MGMsIDB4NmEsIDB4OGMsIDB4ZDIsIDB4MDEsIDB4YTYsCi0gICAgICAgIDB4OTgsIDB4NjksIDB4MGMsIDB4YWUsIDB4YTYsIDB4YTQsIDB4MDYsIDB4ODAsIDB4MWUsIDB4YTYsIDB4OWUsCi0gICAgICAgIDB4MGQsIDB4MzEsIDB4MTIsIDB4MDMsIDB4NGYsIDB4MDYsIDB4ODAsIDB4MTMsIDB4NjAsIDB4MzQsIDB4ZDMsCi0gICAgICAgIDB4YzEsIDB4YTgsIDB4OTIsIDB4MDEsIDB4ZjEsIDB4OGQsIDB4ZGQsIDB4NjksIDB4Y2MsIDB4YTEsIDB4NjksCi0gICAgICAgIDB4NWIsIDB4NGIsIDB4ODAsIDB4ODMsIDB4OTMsIDB4NTIsIDB4MDQsIDB4MTQsIDB4ZTIsIDB4YWUsIDB4MDMsCi0gICAgICAgIDB4YTksIDB4MGQsIDB4NjgsIDB4MDMsIDB4NGQsIDB4MzQsIDB4ZDAsIDB4MDMsIDB4MGQsIDB4MzAsIDB4ZDIsCi0gICAgICAgIDB4MDEsIDB4ODYsIDB4OWEsIDB4NjgsIDB4MTksIDB4NTgsIDB4MWEsIDB4NzgsIDB4YTQsIDB4MDQsIDB4OGEsCi0gICAgICAgIDB4NjksIDB4ZTAsIDB4ZDMsIDB4MTAsIDB4ZTAsIDB4NjksIDB4ZTAsIDB4ZDAsIDB4MDMsIDB4YzEsIDB4YTgsCi0gICAgICAgIDB4ZGIsIDB4YWQsIDB4NGMsIDB4ODEsIDB4MTIsIDB4NDUsIDB4ZDYsIDB4OWQsIDB4MjUsIDB4MWQsIDB4MDAsCi0gICAgICAgIDB4NmEsIDB4ZjUsIDB4YTksIDB4ZTgsIDB4ODAsIDB4MzEsIDB4MjksIDB4MGQsIDB4NTgsIDB4MDgsIDB4NjksCi0gICAgICAgIDB4ODYsIDB4ODAsIDB4MWEsIDB4NjksIDB4ODYsIDB4OTAsIDB4MGMsIDB4MzQsIDB4ZDMsIDB4NDgsIDB4NjUsCi0gICAgICAgIDB4NTEsIDB4NGYsIDB4MDYsIDB4OTgsIDB4MGYsIDB4MTQsIDB4ZjAsIDB4NjgsIDB4MTAsIDB4ZjAsIDB4NjksCi0gICAgICAgIDB4ZTAsIDB4ZDAsIDB4MDMsIDB4ODEsIDB4YTUsIDB4MmIsIDB4OWEsIDB4MWEsIDB4YjgsIDB4ODcsIDB4YTgsCi0gICAgICAgIDB4ZGIsIDB4NGEsIDB4NDYsIDB4NjgsIDB4YjYsIDB4ODAsIDB4MmEsIDB4YTgsIDB4MTQsIDB4ZWEsIDB4MTIsCi0gICAgICAgIDB4YjAsIDB4MDUsIDB4MjEsIDB4YTYsIDB4MDIsIDB4MWEsIDB4NjEsIDB4YTAsIDB4MDYsIDB4OWEsIDB4NjEsCi0gICAgICAgIDB4YTQsIDB4MzEsIDB4ODYsIDB4OWEsIDB4NjksIDB4MGMsIDB4YTgsIDB4MGQsIDB4M2MsIDB4NTMsIDB4MDEsCi0gICAgICAgIDB4ZTIsIDB4OWUsIDB4MjgsIDB4MTAsIDB4ZjEsIDB4NGUsIDB4MDYsIDB4OTgsIDB4MGYsIDB4MDYsIDB4OWUsCi0gICAgICAgIDB4MGQsIDB4MDIsIDB4MWMsIDB4MjksIDB4YzIsIDB4ODAsIDB4MTYsIDB4OTYsIDB4ODAsIDB4MGEsIDB4NGEsCi0gICAgICAgIDB4MDAsIDB4NDMsIDB4NGQsIDB4MzQsIDB4MGMsIDB4NjEsIDB4YTYsIDB4MWEsIDB4NDAsIDB4MzQsIDB4ZDMsCi0gICAgICAgIDB4NGQsIDB4MjEsIDB4ODAsIDB4ZmYsIDB4ZDksIDB4ZmYsIDB4ZGIsIDB4MDAsIDB4ODQsIDB4MDAsIDB4MGEsCi0gICAgICAgIDB4MDcsIDB4MDcsIDB4MDgsIDB4MDcsIDB4MDYsIDB4MGEsIDB4MDgsIDB4MDgsIDB4MDgsIDB4MGIsIDB4MGEsCi0gICAgICAgIDB4MGEsIDB4MGIsIDB4MGUsIDB4MTgsIDB4MTAsIDB4MGUsIDB4MGQsIDB4MGQsIDB4MGUsIDB4MWQsIDB4MTUsCi0gICAgICAgIDB4MTYsIDB4MTEsIDB4MTgsIDB4MjMsIDB4MWYsIDB4MjUsIDB4MjQsIDB4MjIsIDB4MWYsIDB4MjIsIDB4MjEsCi0gICAgICAgIDB4MjYsIDB4MmIsIDB4MzcsIDB4MmYsIDB4MjYsIDB4MjksIDB4MzQsIDB4MjksIDB4MjEsIDB4MjIsIDB4MzAsCi0gICAgICAgIDB4NDEsIDB4MzEsIDB4MzQsIDB4MzksIDB4M2IsIDB4M2UsIDB4M2UsIDB4M2UsIDB4MjUsIDB4MmUsIDB4NDQsCi0gICAgICAgIDB4NDksIDB4NDMsIDB4M2MsIDB4NDgsIDB4MzcsIDB4M2QsIDB4M2UsIDB4M2IsIDB4MDEsIDB4MGEsIDB4MGIsCi0gICAgICAgIDB4MGIsIDB4MGUsIDB4MGQsIDB4MGUsIDB4MWMsIDB4MTAsIDB4MTAsIDB4MWMsIDB4M2IsIDB4MjgsIDB4MjIsCi0gICAgICAgIDB4MjgsIDB4M2IsIDB4M2IsIDB4M2IsIDB4M2IsIDB4M2IsIDB4M2IsIDB4M2IsIDB4M2IsIDB4M2IsIDB4M2IsCi0gICAgICAgIDB4M2IsIDB4M2IsIDB4M2IsIDB4M2IsIDB4M2IsIDB4M2IsIDB4M2IsIDB4M2IsIDB4M2IsIDB4M2IsIDB4M2IsCi0gICAgICAgIDB4M2IsIDB4M2IsIDB4M2IsIDB4M2IsIDB4M2IsIDB4M2IsIDB4M2IsIDB4M2IsIDB4M2IsIDB4M2IsIDB4M2IsCi0gICAgICAgIDB4M2IsIDB4M2IsIDB4M2IsIDB4M2IsIDB4M2IsIDB4M2IsIDB4M2IsIDB4M2IsIDB4M2IsIDB4M2IsIDB4M2IsCi0gICAgICAgIDB4M2IsIDB4M2IsIDB4M2IsIDB4M2IsIDB4M2IsIDB4M2IsIDB4M2IsIDB4ZmYsIDB4YzAsIDB4MDAsIDB4MTEsCi0gICAgICAgIDB4MDgsIDB4MDAsIDB4NDgsIDB4MDAsIDB4NjAsIDB4MDMsIDB4MDEsIDB4MjEsIDB4MDAsIDB4MDIsIDB4MTEsCi0gICAgICAgIDB4MDEsIDB4MDMsIDB4MTEsIDB4MDEsIDB4ZmYsIDB4YzQsIDB4MDEsIDB4YTIsIDB4MDAsIDB4MDAsIDB4MDEsCi0gICAgICAgIDB4MDUsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0gICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDEsIDB4MDIsIDB4MDMsIDB4MDQsIDB4MDUsIDB4MDYsIDB4MDcsCi0gICAgICAgIDB4MDgsIDB4MDksIDB4MGEsIDB4MGIsIDB4MTAsIDB4MDAsIDB4MDIsIDB4MDEsIDB4MDMsIDB4MDMsIDB4MDIsCi0gICAgICAgIDB4MDQsIDB4MDMsIDB4MDUsIDB4MDUsIDB4MDQsIDB4MDQsIDB4MDAsIDB4MDAsIDB4MDEsIDB4N2QsIDB4MDEsCi0gICAgICAgIDB4MDIsIDB4MDMsIDB4MDAsIDB4MDQsIDB4MTEsIDB4MDUsIDB4MTIsIDB4MjEsIDB4MzEsIDB4NDEsIDB4MDYsCi0gICAgICAgIDB4MTMsIDB4NTEsIDB4NjEsIDB4MDcsIDB4MjIsIDB4NzEsIDB4MTQsIDB4MzIsIDB4ODEsIDB4OTEsIDB4YTEsCi0gICAgICAgIDB4MDgsIDB4MjMsIDB4NDIsIDB4YjEsIDB4YzEsIDB4MTUsIDB4NTIsIDB4ZDEsIDB4ZjAsIDB4MjQsIDB4MzMsCi0gICAgICAgIDB4NjIsIDB4NzIsIDB4ODIsIDB4MDksIDB4MGEsIDB4MTYsIDB4MTcsIDB4MTgsIDB4MTksIDB4MWEsIDB4MjUsCi0gICAgICAgIDB4MjYsIDB4MjcsIDB4MjgsIDB4MjksIDB4MmEsIDB4MzQsIDB4MzUsIDB4MzYsIDB4MzcsIDB4MzgsIDB4MzksCi0gICAgICAgIDB4M2EsIDB4NDMsIDB4NDQsIDB4NDUsIDB4NDYsIDB4NDcsIDB4NDgsIDB4NDksIDB4NGEsIDB4NTMsIDB4NTQsCi0gICAgICAgIDB4NTUsIDB4NTYsIDB4NTcsIDB4NTgsIDB4NTksIDB4NWEsIDB4NjMsIDB4NjQsIDB4NjUsIDB4NjYsIDB4NjcsCi0gICAgICAgIDB4NjgsIDB4NjksIDB4NmEsIDB4NzMsIDB4NzQsIDB4NzUsIDB4NzYsIDB4NzcsIDB4NzgsIDB4NzksIDB4N2EsCi0gICAgICAgIDB4ODMsIDB4ODQsIDB4ODUsIDB4ODYsIDB4ODcsIDB4ODgsIDB4ODksIDB4OGEsIDB4OTIsIDB4OTMsIDB4OTQsCi0gICAgICAgIDB4OTUsIDB4OTYsIDB4OTcsIDB4OTgsIDB4OTksIDB4OWEsIDB4YTIsIDB4YTMsIDB4YTQsIDB4YTUsIDB4YTYsCi0gICAgICAgIDB4YTcsIDB4YTgsIDB4YTksIDB4YWEsIDB4YjIsIDB4YjMsIDB4YjQsIDB4YjUsIDB4YjYsIDB4YjcsIDB4YjgsCi0gICAgICAgIDB4YjksIDB4YmEsIDB4YzIsIDB4YzMsIDB4YzQsIDB4YzUsIDB4YzYsIDB4YzcsIDB4YzgsIDB4YzksIDB4Y2EsCi0gICAgICAgIDB4ZDIsIDB4ZDMsIDB4ZDQsIDB4ZDUsIDB4ZDYsIDB4ZDcsIDB4ZDgsIDB4ZDksIDB4ZGEsIDB4ZTEsIDB4ZTIsCi0gICAgICAgIDB4ZTMsIDB4ZTQsIDB4ZTUsIDB4ZTYsIDB4ZTcsIDB4ZTgsIDB4ZTksIDB4ZWEsIDB4ZjEsIDB4ZjIsIDB4ZjMsCi0gICAgICAgIDB4ZjQsIDB4ZjUsIDB4ZjYsIDB4ZjcsIDB4ZjgsIDB4ZjksIDB4ZmEsIDB4MDEsIDB4MDAsIDB4MDMsIDB4MDEsCi0gICAgICAgIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MDAsCi0gICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDEsIDB4MDIsIDB4MDMsIDB4MDQsIDB4MDUsIDB4MDYsIDB4MDcsIDB4MDgsCi0gICAgICAgIDB4MDksIDB4MGEsIDB4MGIsIDB4MTEsIDB4MDAsIDB4MDIsIDB4MDEsIDB4MDIsIDB4MDQsIDB4MDQsIDB4MDMsCi0gICAgICAgIDB4MDQsIDB4MDcsIDB4MDUsIDB4MDQsIDB4MDQsIDB4MDAsIDB4MDEsIDB4MDIsIDB4NzcsIDB4MDAsIDB4MDEsCi0gICAgICAgIDB4MDIsIDB4MDMsIDB4MTEsIDB4MDQsIDB4MDUsIDB4MjEsIDB4MzEsIDB4MDYsIDB4MTIsIDB4NDEsIDB4NTEsCi0gICAgICAgIDB4MDcsIDB4NjEsIDB4NzEsIDB4MTMsIDB4MjIsIDB4MzIsIDB4ODEsIDB4MDgsIDB4MTQsIDB4NDIsIDB4OTEsCi0gICAgICAgIDB4YTEsIDB4YjEsIDB4YzEsIDB4MDksIDB4MjMsIDB4MzMsIDB4NTIsIDB4ZjAsIDB4MTUsIDB4NjIsIDB4NzIsCi0gICAgICAgIDB4ZDEsIDB4MGEsIDB4MTYsIDB4MjQsIDB4MzQsIDB4ZTEsIDB4MjUsIDB4ZjEsIDB4MTcsIDB4MTgsIDB4MTksCi0gICAgICAgIDB4MWEsIDB4MjYsIDB4MjcsIDB4MjgsIDB4MjksIDB4MmEsIDB4MzUsIDB4MzYsIDB4MzcsIDB4MzgsIDB4MzksCi0gICAgICAgIDB4M2EsIDB4NDMsIDB4NDQsIDB4NDUsIDB4NDYsIDB4NDcsIDB4NDgsIDB4NDksIDB4NGEsIDB4NTMsIDB4NTQsCi0gICAgICAgIDB4NTUsIDB4NTYsIDB4NTcsIDB4NTgsIDB4NTksIDB4NWEsIDB4NjMsIDB4NjQsIDB4NjUsIDB4NjYsIDB4NjcsCi0gICAgICAgIDB4NjgsIDB4NjksIDB4NmEsIDB4NzMsIDB4NzQsIDB4NzUsIDB4NzYsIDB4NzcsIDB4NzgsIDB4NzksIDB4N2EsCi0gICAgICAgIDB4ODIsIDB4ODMsIDB4ODQsIDB4ODUsIDB4ODYsIDB4ODcsIDB4ODgsIDB4ODksIDB4OGEsIDB4OTIsIDB4OTMsCi0gICAgICAgIDB4OTQsIDB4OTUsIDB4OTYsIDB4OTcsIDB4OTgsIDB4OTksIDB4OWEsIDB4YTIsIDB4YTMsIDB4YTQsIDB4YTUsCi0gICAgICAgIDB4YTYsIDB4YTcsIDB4YTgsIDB4YTksIDB4YWEsIDB4YjIsIDB4YjMsIDB4YjQsIDB4YjUsIDB4YjYsIDB4YjcsCi0gICAgICAgIDB4YjgsIDB4YjksIDB4YmEsIDB4YzIsIDB4YzMsIDB4YzQsIDB4YzUsIDB4YzYsIDB4YzcsIDB4YzgsIDB4YzksCi0gICAgICAgIDB4Y2EsIDB4ZDIsIDB4ZDMsIDB4ZDQsIDB4ZDUsIDB4ZDYsIDB4ZDcsIDB4ZDgsIDB4ZDksIDB4ZGEsIDB4ZTIsCi0gICAgICAgIDB4ZTMsIDB4ZTQsIDB4ZTUsIDB4ZTYsIDB4ZTcsIDB4ZTgsIDB4ZTksIDB4ZWEsIDB4ZjIsIDB4ZjMsIDB4ZjQsCi0gICAgICAgIDB4ZjUsIDB4ZjYsIDB4ZjcsIDB4ZjgsIDB4ZjksIDB4ZmEsIDB4ZmYsIDB4ZGEsIDB4MDAsIDB4MGMsIDB4MDMsCi0gICAgICAgIDB4MDEsIDB4MDAsIDB4MDIsIDB4MTEsIDB4MDMsIDB4MTEsIDB4MDAsIDB4M2YsIDB4MDAsIDB4OWUsIDB4ZDIsCi0gICAgICAgIDB4MmUsIDB4MDcsIDB4MTUsIDB4YWYsIDB4NmQsIDB4MDgsIDB4ZTIsIDB4YjMsIDB4NDUsIDB4MWEsIDB4ZjYsCi0gICAgICAgIDB4ZDAsIDB4MDAsIDB4MDEsIDB4YzUsIDB4NjgsIDB4NDUsIDB4MTcsIDB4NGEsIDB4YjQsIDB4MjIsIDB4ZTQsCi0gICAgICAgIDB4NzAsIDB4OGMsIDB4NzQsIDB4YTksIDB4M2MsIDB4YTEsIDB4OGUsIDB4OTUsIDB4NDgsIDB4OTYsIDB4MzEsCi0gICAgICAgIDB4ZTIsIDB4MTgsIDB4ZTksIDB4NTUsIDB4YTUsIDB4OGMsIDB4N2EsIDB4NTAsIDB4MDUsIDB4MGIsIDB4ODgsCi0gICAgICAgIDB4ODYsIDB4MGYsIDB4MTUsIDB4OGYsIDB4NzUsIDB4MWYsIDB4MjYsIDB4OTMsIDB4MTksIDB4OTEsIDB4NzcsCi0gICAgICAgIDB4MTgsIDB4YzEsIDB4YWMsIDB4NGIsIDB4YzgsIDB4ZmEsIDB4ZDYsIDB4NjMsIDB4MzcsIDB4NmQsIDB4MzEsCi0gICAgICAgIDB4YjQsIDB4NzMsIDB4NWIsIDB4MzYsIDB4YTAsIDB4MWMsIDB4NTAsIDB4ODAsIDB4ZDcsIDB4ODMsIDB4YTAsCi0gICAgICAgIDB4YWIsIDB4ZDEsIDB4NjIsIDB4YWQsIDB4MDksIDB4OGYsIDB4MTcsIDB4MjksIDB4MDMsIDB4YjIsIDB4Y2MsCi0gICAgICAgIDB4ZTAsIDB4NzcsIDB4MTQsIDB4YTMsIDB4NTYsIDB4YjMsIDB4MjcsIDB4MWUsIDB4NjcsIDB4ZTksIDB4NTIsCi0gICAgICAgIDB4ZWEsIDB4YzYsIDB4M2EsIDB4MzYsIDB4NDgsIDB4ZWYsIDB4M2QsIDB4MjcsIDB4NzAsIDB4MjIsIDB4NjAsCi0gICAgICAgIDB4NDcsIDB4NTIsIDB4NjksIDB4YjIsIDB4ZTIsIDB4YWQsIDB4M2IsIDB4ZWEsIDB4ODAsIDB4YTMsIDB4MzgsCi0gICAgICAgIDB4ZTAsIDB4ZDYsIDB4M2QsIDB4ZDgsIDB4MWMsIDB4ZDAsIDB4Y2EsIDB4NDYsIDB4M2QsIDB4ZDAsIDB4MTgsCi0gICAgICAgIDB4MzUsIDB4ODksIDB4NzgsIDB4YTMsIDB4OWEsIDB4Y2QsIDB4OGMsIDB4ZDIsIDB4YjMsIDB4OTMsIDB4MmEsCi0gICAgICAgIDB4MmIsIDB4NjYsIDB4ZDUsIDB4ZjEsIDB4OGEsIDB4MTAsIDB4MWEsIDB4ZDYsIDB4ZjIsIDB4MDMsIDB4OGEsCi0gICAgICAgIDB4OWUsIDB4ZTYsIDB4ZjQsIDB4NWEsIDB4ZGIsIDB4ZWYsIDB4ZmUsIDB4MjMsIDB4YzAsIDB4YTcsIDB4MjcsCi0gICAgICAgIDB4Y2IsIDB4MTYsIDB4YzQsIDB4Y2MsIDB4ZGQsIDB4ZTIsIDB4NzgsIDB4OWEsIDB4NjksIDB4NjYsIDB4Y2MsCi0gICAgICAgIDB4OTksIDB4ZTEsIDB4NGQsIDB4NDcsIDB4YmEsIDB4YmMsIDB4ZDksIDB4NmEsIDB4ZWUsIDB4MjYsIDB4NTksCi0gICAgICAgIDB4NTksIDB4NGQsIDB4YWMsIDB4NjksIDB4MzQsIDB4NTIsIDB4ZTUsIDB4OGYsIDB4NTUsIDB4YWQsIDB4NTgsCi0gICAgICAgIDB4YWUsIDB4ODUsIDB4YzQsIDB4MjIsIDB4NDEsIDB4ZGYsIDB4YWQsIDB4NzYsIDB4NjEsIDB4ZTUsIDB4NmYsCi0gICAgICAgIDB4NzQsIDB4NDUsIDB4NjksIDB4ZGMsIDB4MDAsIDB4NzksIDB4YWMsIDB4OGIsIDB4YTYsIDB4YzksIDB4MzUsCi0gICAgICAgIDB4ZDQsIDB4MzQsIDB4NjQsIDB4ZGMsIDB4MzcsIDB4MDYsIDB4YjEsIDB4YWUsIDB4ODgsIDB4YzEsIDB4YWMsCi0gICAgICAgIDB4ZDgsIDB4YzksIDB4MmMsIDB4YTYsIDB4ZTAsIDB4NzMsIDB4NWIsIDB4MzYsIDB4ZjMsIDB4NzQsIDB4ZTYsCi0gICAgICAgIDB4ODQsIDB4MDUsIDB4ZTMsIDB4YTksIDB4NDcsIDB4NmEsIDB4MTQsIDB4YjYsIDB4NDksIDB4M2QsIDB4ODUsCi0gICAgICAgIDB4M2EsIDB4ZWUsIDB4ZWUsIDB4MmIsIDB4YTgsIDB4ZTIsIDB4NmYsIDB4MzAsIDB4ODEsIDB4ZTksIDB4OGEsCi0gICAgICAgIDB4Y2EsIDB4YTQsIDB4ZTIsIDB4ZDMsIDB4OGIsIDB4MDEsIDB4YjEsIDB4ZjksIDB4MDQsIDB4N2YsIDB4YWYsCi0gICAgICAgIDB4MjMsIDB4ZjAsIDB4YTksIDB4NTQsIDB4NDEsIDB4OWMsIDB4ZmQsIDB4YTMsIDB4ZjQsIDB4YWUsIDB4NjUsCi0gICAgICAgIDB4MTgsIDB4ZjcsIDB4MjUsIDB4OGEsIDB4ZTIsIDB4MDIsIDB4MzgsIDB4YjgsIDB4ZmQsIDB4MmEsIDB4N2IsCi0gICAgICAgIDB4NWIsIDB4YTgsIDB4NmQsIDB4NmQsIDB4NWQsIDB4OWEsIDB4NWQsIDB4Y2IsIDB4YmIsIDB4ZDIsIDB4YjYsCi0gICAgICAgIDB4YTYsIDB4YTMsIDB4MTksIDB4NWUsIDB4ZTIsIDB4MDMsIDB4N2IsIDB4MWQsIDB4YzIsIDB4MTcsIDB4OGQsCi0gICAgICAgIDB4YjgsIDB4YWMsIDB4ZmIsIDB4ODksIDB4MzksIDB4MzUsIDB4ZDYsIDB4OWEsIDB4NmEsIDB4ZTgsIDB4NjYsCi0gICAgICAgIDB4NTUsIDB4Y2IsIDB4ZjUsIDB4YWMsIDB4N2IsIDB4OTYsIDB4ZWIsIDB4NTAsIDB4YzYsIDB4ODgsIDB4NmQsCi0gICAgICAgIDB4NjYsIDB4ZTksIDB4Y2QsIDB4NmMsIDB4ZGIsIDB4NGYsIDB4ZDMsIDB4OWEsIDB4MDAsIDB4MmYsIDB4ZTYsCi0gICAgICAgIDB4ZjksIDB4YTMsIDB4ZTcsIDB4YjUsIDB4NGEsIDB4OTMsIDB4N2YsIDB4YTIsIDB4YzYsIDB4NzMsIDB4ZGMsCi0gICAgICAgIDB4ZDcsIDB4MTUsIDB4NTUsIDB4ZWYsIDB4NDgsIDB4N2QsIDB4MDksIDB4NTIsIDB4NmUsIDB4M2EsIDB4ZDQsCi0gICAgICAgIDB4YWIsIDB4MmYsIDB4YmQsIDB4NjEsIDB4MTYsIDB4MGMsIDB4NzMsIDB4NDksIDB4YzUsIDB4MjQsIDB4OTIsCi0gICAgICAgIDB4N2YsIDB4YTIsIDB4NjMsIDB4ZmQsIDB4YWEsIDB4ZDYsIDB4MmYsIDB4NzEsIDB4MGUsIDB4YjEsIDB4OTMsCi0gICAgICAgIDB4ZjcsIDB4MmQsIDB4ZjUsIDB4YTQsIDB4OWUsIDB4NGUsIDB4YjUsIDB4ZGQsIDB4NGIsIDB4ZjgsIDB4NjgsCi0gICAgICAgIDB4NGMsIDB4Y2IsIDB4YjksIDB4OTMsIDB4YWQsIDB4NjUsIDB4Y2UsIDB4ZDksIDB4MjYsIDB4YTksIDB4OGQsCi0gICAgICAgIDB4MTksIDB4ZjYsIDB4ZjIsIDB4ZjQsIDB4ZTYsIDB4YjUsIDB4YWQsIDB4ZTcsIDB4YzYsIDB4MzksIDB4YTAsCi0gICAgICAgIDB4MTgsIDB4ZWIsIDB4YzksIDB4NzcsIDB4NmMsIDB4MzUsIDB4MmEsIDB4NGIsIDB4ZmUsIDB4OGEsIDB4OWMsCi0gICAgICAgIDB4ZmYsIDB4MDAsIDB4MTEsIDB4YWUsIDB4M2EsIDB4OGIsIDB4ZGUsIDB4NjEsIDB4ZDAsIDB4OWUsIDB4MzksCi0gICAgICAgIDB4YjgsIDB4ZWIsIDB4NTMsIDB4YWMsIDB4YjksIDB4YWUsIDB4NWIsIDB4MDAsIDB4ZjMsIDB4MjcsIDB4MTQsCi0gICAgICAgIDB4OTIsIDB4YzksIDB4ZmUsIDB4OGEsIDB4M2YsIDB4ZGUsIDB4MzUsIDB4YWMsIDB4M2EsIDB4ODgsIDB4OTIsCi0gICAgICAgIDB4Y2QsIDB4YjEsIDB4NmUsIDB4N2QsIDB4Y2QsIDB4MzIsIDB4NjcsIDB4ZWIsIDB4Y2QsIDB4N2EsIDB4MTQsCi0gICAgICAgIDB4ZmUsIDB4MDQsIDB4MjYsIDB4NjYsIDB4Y2UsIDB4ZjksIDB4MjYsIDB4YjMsIDB4ZTYsIDB4NmUsIDB4YjQsCi0gICAgICAgIDB4ZDksIDB4NDgsIDB4YzgsIDB4ODIsIDB4NGUsIDB4MDcsIDB4MzUsIDB4YTcsIDB4NmYsIDB4MmYsIDB4MDIsCi0gICAgICAgIDB4OWEsIDB4MDYsIDB4NWYsIDB4OGMsIDB4YTQsIDB4ODMsIDB4MGUsIDB4MzIsIDB4MmEsIDB4NjksIDB4ZTMsCi0gICAgICAgIDB4ZGQsIDB4MTIsIDB4MDgsIDB4OTcsIDB4ODUsIDB4ZWMsIDB4MmEsIDB4MmEsIDB4NDIsIDB4ZjEsIDB4NzYsCi0gICAgICAgIDB4MjYsIDB4ZTQsIDB4NmEsIDB4NTksIDB4MGUsIDB4MTgsIDB4MTAsIDB4NmEsIDB4ZDIsIDB4ODksIDB4MDIsCi0gICAgICAgIDB4NmUsIDB4MmEsIDB4NzEsIDB4ZWIsIDB4NWMsIDB4MWMsIDB4OGMsIDB4YTYsIDB4NDgsIDB4YmIsIDB4ZGMsCi0gICAgICAgIDB4NjEsIDB4NDEsIDB4MzUsIDB4NzIsIDB4MjgsIDB4ODcsIDB4ZDksIDB4ZjYsIDB4NGEsIDB4YjksIDB4ZTcsCi0gICAgICAgIDB4MzgsIDB4YWUsIDB4OGMsIDB4M2QsIDB4MzYsIDB4ZGQsIDB4ZGUsIDB4YzQsIDB4YjAsIDB4MjEsIDB4NTEsCi0gICAgICAgIDB4NzYsIDB4YTgsIDB4YzAsIDB4YWEsIDB4OTMsIDB4MzEsIDB4ZTYsIDB4YmIsIDB4MmQsIDB4NjUsIDB4NjEsCi0gICAgICAgIDB4MTksIDB4ZDMsIDB4MWUsIDB4YjUsIDB4NDYsIDB4NWEsIDB4OTYsIDB4NWEsIDB4MzAsIDB4YTAsIDB4N2UsCi0gICAgICAgIDB4MDUsIDB4NjksIDB4NWIsIDB4YzksIDB4YzYsIDB4MjgsIDB4NDAsIDB4Y2QsIDB4MDgsIDB4NjQsIDB4M2MsCi0gICAgICAgIDB4NzMsIDB4NTcsIDB4ZTEsIDB4OTQsIDB4ZjEsIDB4Y2QsIDB4NWEsIDB4MjEsIDB4OGMsIDB4YjksIDB4NjMsCi0gICAgICAgIDB4ZTcsIDB4NjcsIDB4MWQsIDB4YWIsIDB4NDAsIDB4YjEsIDB4ZmIsIDB4MDAsIDB4MWQsIDB4ZjAsIDB4MmIsCi0gICAgICAgIDB4OTksIDB4MmQsIDB4NjYsIDB4M2UsIDB4ODgsIDB4NzUsIDB4ODEsIDB4M2YsIDB4MzEsIDB4ZjYsIDB4YWIsCi0gICAgICAgIDB4NjQsIDB4ZDYsIDB4YjQsIDB4MTcsIDB4ZWUsIDB4ZDAsIDB4OWUsIDB4ZTQsIDB4MzIsIDB4MWEsIDB4YTcsCi0gICAgICAgIDB4MzEsIDB4YWQsIDB4MTgsIDB4MTQsIDB4MjYsIDB4ZWYsIDB4NTQsIDB4YTUsIDB4YTgsIDB4NjUsIDB4YTMsCi0gICAgICAgIDB4OWMsIDB4ODEsIDB4ZmEsIDB4NTYsIDB4OGMsIDB4MmQsIDB4Y2UsIDB4NjgsIDB4NDAsIDB4Y2IsIDB4ZjEsCi0gICAgICAgIDB4MzcsIDB4YmQsIDB4NWUsIDB4ODUsIDB4ZWEsIDB4ZDEsIDB4MGMsIDB4YmIsIDB4MTksIDB4NTYsIDB4MjMsCi0gICAgICAgIDB4MjAsIDB4MWYsIDB4YWQsIDB4NWMsIDB4NDIsIDB4MDgsIDB4MDMsIDB4YjUsIDB4NTUsIDB4OTEsIDB4MDQsCi0gICAgICAgIDB4YzksIDB4ODAsIDB4MzgsIDB4MDAsIDB4MGEsIDB4NzEsIDB4MzQsIDB4NmMsIDB4MzIsIDB4MjcsIDB4ZTksCi0gICAgICAgIDB4NTUsIDB4MjUsIDB4MTUsIDB4MmMsIDB4NjgsIDB4YTMsIDB4MzAsIDB4ZWIsIDB4NTQsIDB4YTUsIDB4MTUsCi0gICAgICAgIDB4MGMsIDB4ZDEsIDB4MDAsIDB4ZmYsIDB4ZDl9OwotCi0gICAgLyogcGFja2FnZSAqLyBzdGF0aWMgZmluYWwgYnl0ZVtdIHNQaG90b0J5dGVBcnJheUZvckNvbXBsaWNhdGVkQ2FzZTsKLQotICAgIHN0YXRpYyB7Ci0gICAgICAgIGZpbmFsIGludCBsZW5ndGggPSBzUGhvdG9JbnRBcnJheUZvckNvbXBsaWNhdGVkQ2FzZS5sZW5ndGg7Ci0gICAgICAgIHNQaG90b0J5dGVBcnJheUZvckNvbXBsaWNhdGVkQ2FzZSA9IG5ldyBieXRlW2xlbmd0aF07Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIHNQaG90b0J5dGVBcnJheUZvckNvbXBsaWNhdGVkQ2FzZVtpXSA9IChieXRlKXNQaG90b0ludEFycmF5Rm9yQ29tcGxpY2F0ZWRDYXNlW2ldOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFYyMVNpbXBsZUNhc2UxX1BhcnNpbmcoKSB7Ci0gICAgICAgIG1WZXJpZmllci5pbml0Rm9ySW1wb3J0VGVzdChWMjEsIFIucmF3LnYyMV9zaW1wbGVfMSk7Ci0gICAgICAgIG1WZXJpZmllci5hZGRQcm9wZXJ0eU5vZGVzVmVyaWZpZXJFbGVtV2l0aG91dFZlcnNpb24oKSAgLy8gbm8gIlZFUlNJT046Mi4xIiBsaW5lLgotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGVXaXRoT3JkZXIoIk4iLCAiQW5kbztSb2lkOyIsIEFycmF5cy5hc0xpc3QoIkFuZG8iLCAiUm9pZCIsICIiKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFYyMVNpbXBsZUNhc2UxX1R5cGVfR2VuZXJpYygpIHsKLSAgICAgICAgbVZlcmlmaWVyLmluaXRGb3JJbXBvcnRUZXN0KFZDYXJkQ29uZmlnLlZDQVJEX1RZUEVfVjIxX0dFTkVSSUMsIFIucmF3LnYyMV9zaW1wbGVfMSk7Ci0gICAgICAgIG1WZXJpZmllci5hZGRDb250ZW50VmFsdWVzVmVyaWZpZXJFbGVtKCkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWQoU3RydWN0dXJlZE5hbWUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLkZBTUlMWV9OQU1FLCAiQW5kbyIpCi0gICAgICAgICAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLkdJVkVOX05BTUUsICJSb2lkIikKLSAgICAgICAgICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuRElTUExBWV9OQU1FLCAiUm9pZCBBbmRvIik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFYyMVNpbXBsZUNhc2UxX1R5cGVfSmFwYW5lc2UoKSB7Ci0gICAgICAgIG1WZXJpZmllci5pbml0Rm9ySW1wb3J0VGVzdChWQ2FyZENvbmZpZy5WQ0FSRF9UWVBFX1YyMV9KQVBBTkVTRSwgUi5yYXcudjIxX3NpbXBsZV8xKTsKLSAgICAgICAgbVZlcmlmaWVyLmFkZENvbnRlbnRWYWx1ZXNWZXJpZmllckVsZW0oKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZChTdHJ1Y3R1cmVkTmFtZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuRkFNSUxZX05BTUUsICJBbmRvIikKLSAgICAgICAgICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuR0lWRU5fTkFNRSwgIlJvaWQiKQotICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWYgbmFtZS1yZWxhdGVkIHN0cmluZ3Mgb25seSBjb250YWlucyBwcmludGFibGUgQXNjaWksCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgb3JkZXIgaXMgcmVtYWluZWQgdG8gYmUgVVMnczoKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vICJQcmVmaXggR2l2ZW4gTWlkZGxlIEZhbWlseSBTdWZmaXgiCi0gICAgICAgICAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLkRJU1BMQVlfTkFNRSwgIlJvaWQgQW5kbyIpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RWMjFTaW1wbGVDYXNlMigpIHsKLSAgICAgICAgbVZlcmlmaWVyLmluaXRGb3JJbXBvcnRUZXN0KFZDYXJkQ29uZmlnLlZDQVJEX1RZUEVfVjIxX0pBUEFORVNFLCBSLnJhdy52MjFfc2ltcGxlXzIpOwotICAgICAgICBtVmVyaWZpZXIuYWRkQ29udGVudFZhbHVlc1ZlcmlmaWVyRWxlbSgpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkKFN0cnVjdHVyZWROYW1lLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5ESVNQTEFZX05BTUUsICJBbmRvIFJvaWQiKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0VjIxU2ltcGxlQ2FzZTMoKSB7Ci0gICAgICAgIG1WZXJpZmllci5pbml0Rm9ySW1wb3J0VGVzdChWMjEsIFIucmF3LnYyMV9zaW1wbGVfMyk7Ci0gICAgICAgIG1WZXJpZmllci5hZGRDb250ZW50VmFsdWVzVmVyaWZpZXJFbGVtKCkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWQoU3RydWN0dXJlZE5hbWUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLkZBTUlMWV9OQU1FLCAiQW5kbyIpCi0gICAgICAgICAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLkdJVkVOX05BTUUsICJSb2lkIikKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vICJGTiIgZmllbGQgc2hvdWxkIGJlIHByZWZlcmVkIHNpbmNlIGl0IHNob3VsZCBjb250YWluIHRoZSBvcmlnaW5hbAotICAgICAgICAgICAgICAgICAgICAgICAgLy8gb3JkZXIgaW50ZW5kZWQgYnkgdGhlIGF1dGhvciBvZiB0aGUgZmlsZS4KLSAgICAgICAgICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuRElTUExBWV9OQU1FLCAiQW5kbyBSb2lkIik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGVzdHMgJzsnIGlzIHByb3Blcmx5IGhhbmRsZWQgYnkgVkNhcmRQYXJzZXIgaW1wbGVtZW50YXRpb24uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdFYyMUJhY2tzbGFzaENhc2VfUGFyc2luZygpIHsKLSAgICAgICAgbVZlcmlmaWVyLmluaXRGb3JJbXBvcnRUZXN0KFYyMSwgUi5yYXcudjIxX2JhY2tzbGFzaCk7Ci0gICAgICAgIG1WZXJpZmllci5hZGRQcm9wZXJ0eU5vZGVzVmVyaWZpZXJFbGVtKCkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJOIiwgIjtBO0JcXDtDXFw7O0Q7OkU7XFxcXDsiLAotICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlzLmFzTGlzdCgiIiwgIkE7QlxcIiwgIkNcXDsiLCAiRCIsICI6RSIsICJcXFxcIiwgIiIpKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGVXaXRoT3JkZXIoIkZOIiwgIkE7QlxcQ1xcO0Q6RVxcXFwiKTsKLSAgICAgICAgCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGVzdHMgQ29udGFjdFN0cnVjdCBjb3JyZWN0bHkgaWdub3JlcyByZWR1bmRhbnQgZmllbGRzIGluICJOIiBwcm9wZXJ0eSB2YWx1ZXMgYW5kCi0gICAgICogaW5zZXJ0cyBuYW1lIHJlbGF0ZWQgZGF0YS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0VjIxQmFja3NsYXNoQ2FzZSgpIHsKLSAgICAgICAgbVZlcmlmaWVyLmluaXRGb3JJbXBvcnRUZXN0KFYyMSwgUi5yYXcudjIxX2JhY2tzbGFzaCk7Ci0gICAgICAgIG1WZXJpZmllci5hZGRDb250ZW50VmFsdWVzVmVyaWZpZXJFbGVtKCkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWQoU3RydWN0dXJlZE5hbWUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBGQU1JTFlfTkFNRSBpcyBlbXB0eSBhbmQgcmVtb3ZlZCBpbiB0aGlzIHRlc3QuLi4KLSAgICAgICAgICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuR0lWRU5fTkFNRSwgIkE7QlxcIikKLSAgICAgICAgICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuTUlERExFX05BTUUsICJDXFw7IikKLSAgICAgICAgICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuUFJFRklYLCAiRCIpCi0gICAgICAgICAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLlNVRkZJWCwgIjpFIikKLSAgICAgICAgICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuRElTUExBWV9OQU1FLCAiQTtCXFxDXFw7RDpFXFxcXCIpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RPcmdCZWZvclRpdGxlKCkgewotICAgICAgICBtVmVyaWZpZXIuaW5pdEZvckltcG9ydFRlc3QoVjIxLCBSLnJhdy52MjFfb3JnX2JlZm9yZV90aXRsZSk7Ci0gICAgICAgIENvbnRlbnRWYWx1ZXNWZXJpZmllckVsZW0gZWxlbSA9IG1WZXJpZmllci5hZGRDb250ZW50VmFsdWVzVmVyaWZpZXJFbGVtKCk7Ci0gICAgICAgIGVsZW0uYWRkRXhwZWN0ZWQoU3RydWN0dXJlZE5hbWUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5ESVNQTEFZX05BTUUsICJOb3JtYWwgR3V5Iik7Ci0gICAgICAgIGVsZW0uYWRkRXhwZWN0ZWQoT3JnYW5pemF0aW9uLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoT3JnYW5pemF0aW9uLkNPTVBBTlksICJDb21wYW55IikKLSAgICAgICAgICAgICAgICAucHV0KE9yZ2FuaXphdGlvbi5ERVBBUlRNRU5ULCAiT3JnYW5pemF0aW9uIERldmlzaW9uIFJvb20gU2hlZXQgTm8uIikKLSAgICAgICAgICAgICAgICAucHV0KE9yZ2FuaXphdGlvbi5USVRMRSwgIkV4Y2VsbGVudCBKYW5pdG9yIikKLSAgICAgICAgICAgICAgICAucHV0KE9yZ2FuaXphdGlvbi5UWVBFLCBPcmdhbml6YXRpb24uVFlQRV9XT1JLKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0VGl0bGVCZWZvck9yZygpIHsKLSAgICAgICAgbVZlcmlmaWVyLmluaXRGb3JJbXBvcnRUZXN0KFYyMSwgUi5yYXcudjIxX3RpdGxlX2JlZm9yZV9vcmcpOwotICAgICAgICBDb250ZW50VmFsdWVzVmVyaWZpZXJFbGVtIGVsZW0gPSBtVmVyaWZpZXIuYWRkQ29udGVudFZhbHVlc1ZlcmlmaWVyRWxlbSgpOwotICAgICAgICBlbGVtLmFkZEV4cGVjdGVkKFN0cnVjdHVyZWROYW1lLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuRElTUExBWV9OQU1FLCAiTmljZSBHdXkiKTsKLSAgICAgICAgZWxlbS5hZGRFeHBlY3RlZChPcmdhbml6YXRpb24uQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChPcmdhbml6YXRpb24uQ09NUEFOWSwgIk1hcnZlcm91cyIpCi0gICAgICAgICAgICAgICAgLnB1dChPcmdhbml6YXRpb24uREVQQVJUTUVOVCwgIlBlcmZlY3QgR3JlYXQgR29vZCBCYWQgUG9vciIpCi0gICAgICAgICAgICAgICAgLnB1dChPcmdhbml6YXRpb24uVElUTEUsICJDb29sIFRpdGxlIikKLSAgICAgICAgICAgICAgICAucHV0KE9yZ2FuaXphdGlvbi5UWVBFLCBPcmdhbml6YXRpb24uVFlQRV9XT1JLKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBWZXJpZmllcyB0aGF0IHZDYXJkIGltcG9ydGVyIGNvcnJlY3RseSBpbnRlcnByZXQgIlBSRUYiIGF0dHJpYnV0ZSB0byBJU19QUklNQVJZLgotICAgICAqIFRoZSBkYXRhIGNvbnRhaW4gdGhyZWUgY2FzZXM6IG9uZSAiUFJFRiIsIG5vICJQUkVGIiBhbmQgbXVsdGlwbGUgIlBSRUYiLCBpbiBlYWNoIHR5cGUuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdFYyMVByZWZUb0lzUHJpbWFyeSgpIHsKLSAgICAgICAgbVZlcmlmaWVyLmluaXRGb3JJbXBvcnRUZXN0KFYyMSwgUi5yYXcudjIxX3ByZWZfaGFuZGxpbmcpOwotICAgICAgICBDb250ZW50VmFsdWVzVmVyaWZpZXJFbGVtIGVsZW0gPSBtVmVyaWZpZXIuYWRkQ29udGVudFZhbHVlc1ZlcmlmaWVyRWxlbSgpOwotICAgICAgICBlbGVtLmFkZEV4cGVjdGVkKFN0cnVjdHVyZWROYW1lLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoRGF0YS5NSU1FVFlQRSwgU3RydWN0dXJlZE5hbWUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5ESVNQTEFZX05BTUUsICJTbWl0aCIpOwotICAgICAgICBlbGVtLmFkZEV4cGVjdGVkKFBob25lLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuTlVNQkVSLCAiMSIpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5UWVBFLCBQaG9uZS5UWVBFX0hPTUUpOwotICAgICAgICBlbGVtLmFkZEV4cGVjdGVkKFBob25lLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuTlVNQkVSLCAiMiIpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5UWVBFLCBQaG9uZS5UWVBFX1dPUkspCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5JU19QUklNQVJZLCAxKTsKLSAgICAgICAgZWxlbS5hZGRFeHBlY3RlZChQaG9uZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLk5VTUJFUiwgIjMiKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuVFlQRSwgUGhvbmUuVFlQRV9JU0ROKTsKLSAgICAgICAgZWxlbS5hZGRFeHBlY3RlZChFbWFpbC5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KEVtYWlsLkRBVEEsICJ0ZXN0QGV4YW1wbGUuY29tIikKLSAgICAgICAgICAgICAgICAucHV0KEVtYWlsLlRZUEUsIEVtYWlsLlRZUEVfSE9NRSkKLSAgICAgICAgICAgICAgICAucHV0KEVtYWlsLklTX1BSSU1BUlksIDEpOwotICAgICAgICBlbGVtLmFkZEV4cGVjdGVkKEVtYWlsLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoRW1haWwuREFUQSwgInRlc3QyQGV4YW1pbmF0aW9uLmNvbSIpCi0gICAgICAgICAgICAgICAgLnB1dChFbWFpbC5UWVBFLCBFbWFpbC5UWVBFX01PQklMRSkKLSAgICAgICAgICAgICAgICAucHV0KEVtYWlsLklTX1BSSU1BUlksIDEpOwotICAgICAgICBlbGVtLmFkZEV4cGVjdGVkKE9yZ2FuaXphdGlvbi5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KE9yZ2FuaXphdGlvbi5DT01QQU5ZLCAiQ29tcGFueSIpCi0gICAgICAgICAgICAgICAgLnB1dChPcmdhbml6YXRpb24uVElUTEUsICJFbmdpbmVlciIpCi0gICAgICAgICAgICAgICAgLnB1dChPcmdhbml6YXRpb24uVFlQRSwgT3JnYW5pemF0aW9uLlRZUEVfV09SSyk7Ci0gICAgICAgIGVsZW0uYWRkRXhwZWN0ZWQoT3JnYW5pemF0aW9uLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoT3JnYW5pemF0aW9uLkNPTVBBTlksICJNeXN0ZXJ5IikKLSAgICAgICAgICAgICAgICAucHV0KE9yZ2FuaXphdGlvbi5USVRMRSwgIkJsb2dnZXIiKQotICAgICAgICAgICAgICAgIC5wdXQoT3JnYW5pemF0aW9uLlRZUEUsIE9yZ2FuaXphdGlvbi5UWVBFX1dPUkspOwotICAgICAgICBlbGVtLmFkZEV4cGVjdGVkKE9yZ2FuaXphdGlvbi5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KE9yZ2FuaXphdGlvbi5DT01QQU5ZLCAiUG9ldHJ5IikKLSAgICAgICAgICAgICAgICAucHV0KE9yZ2FuaXphdGlvbi5USVRMRSwgIlBvZXQiKQotICAgICAgICAgICAgICAgIC5wdXQoT3JnYW5pemF0aW9uLlRZUEUsIE9yZ2FuaXphdGlvbi5UWVBFX1dPUkspOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRlc3RzIGFsbCB0aGUgcHJvcGVydGllcyBpbiBhIGNvbXBsaWNhdGVkIHZDYXJkIGFyZSBjb3JyZWN0bHkgcGFyc2VkIGJ5IHRoZSBWQ2FyZFBhcnNlci4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0VjIxQ29tcGxpY2F0ZWRDYXNlX1BhcnNpbmcoKSB7Ci0gICAgICAgIG1WZXJpZmllci5pbml0Rm9ySW1wb3J0VGVzdChWMjEsIFIucmF3LnYyMV9jb21wbGljYXRlZCk7Ci0gICAgICAgIG1WZXJpZmllci5hZGRQcm9wZXJ0eU5vZGVzVmVyaWZpZXJFbGVtKCkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJOIiwgIkd1bXA7Rm9ycmVzdDtIb2dlO1BvcztUYW8iLAotICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlzLmFzTGlzdCgiR3VtcCIsICJGb3JyZXN0IiwgIkhvZ2UiLCAiUG9zIiwgIlRhbyIpKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGVXaXRoT3JkZXIoIkZOIiwgIkpvZSBEdWUiKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGVXaXRoT3JkZXIoIk9SRyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAiR3VtcCBTaHJpbXAgQ28uO1NhbGVzIERlcHQuO01hbmFnZXI7RmlzaCBrZWVwZXIiLAotICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlzLmFzTGlzdCgiR3VtcCBTaHJpbXAgQ28uIiwgIlNhbGVzIERlcHQuO01hbmFnZXIiLCAiRmlzaCBrZWVwZXIiKSkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJST0xFIiwgIkZpc2ggQ2FrZSBLZWVwZXIhIikKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJUSVRMRSIsICJTaHJpbXAgTWFuIikKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJYLUNMQVNTIiwgIlBVQkxJQyIpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigiVEVMIiwgIigxMTEpIDU1NS0xMjEyIiwgbmV3IFR5cGVTZXQoIldPUksiLCAiVk9JQ0UiKSkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJURUwiLCAiKDQwNCkgNTU1LTEyMTIiLCBuZXcgVHlwZVNldCgiSE9NRSIsICJWT0lDRSIpKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGVXaXRoT3JkZXIoIlRFTCIsICIwMzExMTExMTExIiwgbmV3IFR5cGVTZXQoIkNFTEwiKSkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJURUwiLCAiMDMyMjIyMjIyMiIsIG5ldyBUeXBlU2V0KCJWSURFTyIpKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGVXaXRoT3JkZXIoIlRFTCIsICIwMzMzMzMzMzMzIiwgbmV3IFR5cGVTZXQoIlZPSUNFIikpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigiQURSIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICI7OzEwMCBXYXRlcnMgRWRnZTtCYXl0b3duO0xBOzMwMzE0O1VuaXRlZCBTdGF0ZXMgb2YgQW1lcmljYSIsCi0gICAgICAgICAgICAgICAgICAgICAgICBBcnJheXMuYXNMaXN0KCIiLCAiIiwgIjEwMCBXYXRlcnMgRWRnZSIsICJCYXl0b3duIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkxBIiwgIjMwMzE0IiwgIlVuaXRlZCBTdGF0ZXMgb2YgQW1lcmljYSIpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsLCBudWxsLCBuZXcgVHlwZVNldCgiV09SSyIpLCBudWxsKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGVXaXRoT3JkZXIoIkxBQkVMIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICIxMDAgV2F0ZXJzIEVkZ2VcclxuQmF5dG93biwgTEEgMzAzMTRcclxuVW5pdGVkICBTdGF0ZXMgb2YgQW1lcmljYSIsCi0gICAgICAgICAgICAgICAgICAgICAgICBudWxsLCBudWxsLCBtQ29udGVudFZhbHVlc0ZvclFQLCBuZXcgVHlwZVNldCgiV09SSyIpLCBudWxsKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGVXaXRoT3JkZXIoIkFEUiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAiOzs0MiBQbGFudGF0aW9uIFN0LjtCYXl0b3duO0xBOzMwMzE0O1VuaXRlZCBTdGF0ZXMgb2YgQW1lcmljYSIsCi0gICAgICAgICAgICAgICAgICAgICAgICBBcnJheXMuYXNMaXN0KCIiLCAiIiwgIjQyIFBsYW50YXRpb24gU3QuIiwgIkJheXRvd24iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTEEiLCAiMzAzMTQiLCAiVW5pdGVkIFN0YXRlcyBvZiBBbWVyaWNhIiksIG51bGwsIG51bGwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBUeXBlU2V0KCJIT01FIiksIG51bGwpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigiTEFCRUwiLAotICAgICAgICAgICAgICAgICAgICAgICAgIjQyIFBsYW50YXRpb24gU3QuXHJcbkJheXRvd24sIExBIDMwMzE0XHJcblVuaXRlZCAgU3RhdGVzIG9mIEFtZXJpY2EiLAotICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCwgbnVsbCwgbUNvbnRlbnRWYWx1ZXNGb3JRUCwKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBUeXBlU2V0KCJIT01FIiksIG51bGwpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigiRU1BSUwiLCAiZm9ycmVzdGd1bXBAd2FsbGFkYWxsYS5jb20iLAotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFR5cGVTZXQoIlBSRUYiLCAiSU5URVJORVQiKSkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJFTUFJTCIsICJjZWxsQGV4YW1wbGUuY29tIiwgbmV3IFR5cGVTZXQoIkNFTEwiKSkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJOT1RFIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICJUaGUgZm9sbG93aW5nIG5vdGUgaXMgdGhlIGV4YW1wbGUgZnJvbSBSRkMgMjA0NS4iKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGVXaXRoT3JkZXIoIk5PVEUiLAotICAgICAgICAgICAgICAgICAgICAgICAgIk5vdydzIHRoZSB0aW1lIGZvciBhbGwgZm9sayB0byBjb21lIHRvIHRoZSBhaWQgb2YgdGhlaXIgY291bnRyeS4iLAotICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCwgbnVsbCwgbUNvbnRlbnRWYWx1ZXNGb3JRUCwgbnVsbCwgbnVsbCkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJQSE9UTyIsIG51bGwsCi0gICAgICAgICAgICAgICAgICAgICAgICBudWxsLCBzUGhvdG9CeXRlQXJyYXlGb3JDb21wbGljYXRlZENhc2UsIG1Db250ZW50VmFsdWVzRm9yQmFzZTY0VjIxLAotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFR5cGVTZXQoIkpQRUciKSwgbnVsbCkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJYLUFUVFJJQlVURSIsICJTb21lIFN0cmluZyIpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigiQkRBWSIsICIxOTgwMDEwMSIpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigiR0VPIiwgIjM1LjY1NjM4NTQsMTM5LjY5OTQyMzMiKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGVXaXRoT3JkZXIoIlVSTCIsICJodHRwOi8vd3d3LmV4YW1wbGUuY29tLyIpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigiUkVWIiwgIjIwMDgwNDI0VDE5NTI0M1oiKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDaGVja3MgQ29udGFjdFN0cnVjdCBjb3JyZWN0bHkgaW5zZXJ0cyB2YWx1ZXMgaW4gYSBjb21wbGljYXRlZCB2Q2FyZAotICAgICAqIGludG8gQ29udGVudFJlc29sdmVyLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RWMjFDb21wbGljYXRlZENhc2UoKSB7Ci0gICAgICAgIG1WZXJpZmllci5pbml0Rm9ySW1wb3J0VGVzdChWMjEsIFIucmF3LnYyMV9jb21wbGljYXRlZCk7Ci0gICAgICAgIENvbnRlbnRWYWx1ZXNWZXJpZmllckVsZW0gZWxlbSA9IG1WZXJpZmllci5hZGRDb250ZW50VmFsdWVzVmVyaWZpZXJFbGVtKCk7Ci0gICAgICAgIGVsZW0uYWRkRXhwZWN0ZWQoU3RydWN0dXJlZE5hbWUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5GQU1JTFlfTkFNRSwgIkd1bXAiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuR0lWRU5fTkFNRSwgIkZvcnJlc3QiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuTUlERExFX05BTUUsICJIb2dlIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLlBSRUZJWCwgIlBvcyIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5TVUZGSVgsICJUYW8iKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuRElTUExBWV9OQU1FLCAiSm9lIER1ZSIpOwotICAgICAgICBlbGVtLmFkZEV4cGVjdGVkKE9yZ2FuaXphdGlvbi5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KE9yZ2FuaXphdGlvbi5UWVBFLCBPcmdhbml6YXRpb24uVFlQRV9XT1JLKQotICAgICAgICAgICAgICAgIC5wdXQoT3JnYW5pemF0aW9uLkNPTVBBTlksICJHdW1wIFNocmltcCBDby4iKQotICAgICAgICAgICAgICAgIC5wdXQoT3JnYW5pemF0aW9uLkRFUEFSVE1FTlQsICJTYWxlcyBEZXB0LjtNYW5hZ2VyIEZpc2gga2VlcGVyIikKLSAgICAgICAgICAgICAgICAucHV0KE9yZ2FuaXphdGlvbi5USVRMRSwgIlNocmltcCBNYW4iKTsKLSAgICAgICAgZWxlbS5hZGRFeHBlY3RlZChQaG9uZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLlRZUEUsIFBob25lLlRZUEVfV09SSykKLSAgICAgICAgICAgICAgICAvLyBQaG9uZSBudW1iZXIgaXMgZXhwZWN0ZWQgdG8gYmUgZm9ybWF0ZWQgd2l0aCBOQU1QIGZvcm1hdCBpbiBkZWZhdWx0LgotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuTlVNQkVSLCAiMTExLTU1NS0xMjEyIik7Ci0gICAgICAgIGVsZW0uYWRkRXhwZWN0ZWQoUGhvbmUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5UWVBFLCBQaG9uZS5UWVBFX0hPTUUpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5OVU1CRVIsICI0MDQtNTU1LTEyMTIiKTsKLSAgICAgICAgZWxlbS5hZGRFeHBlY3RlZChQaG9uZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLlRZUEUsIFBob25lLlRZUEVfTU9CSUxFKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuTlVNQkVSLCAiMDMxLTExMS0xMTExIik7Ci0gICAgICAgIGVsZW0uYWRkRXhwZWN0ZWQoUGhvbmUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5UWVBFLCBQaG9uZS5UWVBFX0NVU1RPTSkKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLkxBQkVMLCAiVklERU8iKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuTlVNQkVSLCAiMDMyLTIyMi0yMjIyIik7Ci0gICAgICAgIGVsZW0uYWRkRXhwZWN0ZWQoUGhvbmUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5UWVBFLCBQaG9uZS5UWVBFX0NVU1RPTSkKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLkxBQkVMLCAiVk9JQ0UiKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuTlVNQkVSLCAiMDMzLTMzMy0zMzMzIik7Ci0gICAgICAgIGVsZW0uYWRkRXhwZWN0ZWQoU3RydWN0dXJlZFBvc3RhbC5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWRQb3N0YWwuVFlQRSwgU3RydWN0dXJlZFBvc3RhbC5UWVBFX1dPUkspCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkUG9zdGFsLkNPVU5UUlksICJVbml0ZWQgU3RhdGVzIG9mIEFtZXJpY2EiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZFBvc3RhbC5QT1NUQ09ERSwgIjMwMzE0IikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWRQb3N0YWwuUkVHSU9OLCAiTEEiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZFBvc3RhbC5DSVRZLCAiQmF5dG93biIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkUG9zdGFsLlNUUkVFVCwgIjEwMCBXYXRlcnMgRWRnZSIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkUG9zdGFsLkZPUk1BVFRFRF9BRERSRVNTLAotICAgICAgICAgICAgICAgICAgICAgICAgIjEwMCBXYXRlcnMgRWRnZSBCYXl0b3duIExBIDMwMzE0IFVuaXRlZCBTdGF0ZXMgb2YgQW1lcmljYSIpOwotICAgICAgICBlbGVtLmFkZEV4cGVjdGVkKFN0cnVjdHVyZWRQb3N0YWwuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkUG9zdGFsLlRZUEUsIFN0cnVjdHVyZWRQb3N0YWwuVFlQRV9IT01FKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZFBvc3RhbC5DT1VOVFJZLCAiVW5pdGVkIFN0YXRlcyBvZiBBbWVyaWNhIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWRQb3N0YWwuUE9TVENPREUsICIzMDMxNCIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkUG9zdGFsLlJFR0lPTiwgIkxBIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWRQb3N0YWwuQ0lUWSwgIkJheXRvd24iKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZFBvc3RhbC5TVFJFRVQsICI0MiBQbGFudGF0aW9uIFN0LiIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkUG9zdGFsLkZPUk1BVFRFRF9BRERSRVNTLAotICAgICAgICAgICAgICAgICAgICAgICAgIjQyIFBsYW50YXRpb24gU3QuIEJheXRvd24gTEEgMzAzMTQgVW5pdGVkIFN0YXRlcyBvZiBBbWVyaWNhIik7Ci0gICAgICAgIGVsZW0uYWRkRXhwZWN0ZWQoRW1haWwuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLy8gIlRZUEU9SU5URVJORVQiIC0+IFRZUEVfQ1VTVE9NICsgdGhlIGxhYmVsICJJTlRFUk5FVCIKLSAgICAgICAgICAgICAgICAucHV0KEVtYWlsLlRZUEUsIEVtYWlsLlRZUEVfQ1VTVE9NKQotICAgICAgICAgICAgICAgIC5wdXQoRW1haWwuTEFCRUwsICJJTlRFUk5FVCIpCi0gICAgICAgICAgICAgICAgLnB1dChFbWFpbC5EQVRBLCAiZm9ycmVzdGd1bXBAd2FsbGFkYWxsYS5jb20iKQotICAgICAgICAgICAgICAgIC5wdXQoRW1haWwuSVNfUFJJTUFSWSwgMSk7Ci0gICAgICAgIGVsZW0uYWRkRXhwZWN0ZWQoRW1haWwuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChFbWFpbC5UWVBFLCBFbWFpbC5UWVBFX01PQklMRSkKLSAgICAgICAgICAgICAgICAucHV0KEVtYWlsLkRBVEEsICJjZWxsQGV4YW1wbGUuY29tIik7Ci0gICAgICAgIGVsZW0uYWRkRXhwZWN0ZWQoTm90ZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KE5vdGUuTk9URSwgIlRoZSBmb2xsb3dpbmcgbm90ZSBpcyB0aGUgZXhhbXBsZSBmcm9tIFJGQyAyMDQ1LiIpOwotICAgICAgICBlbGVtLmFkZEV4cGVjdGVkKE5vdGUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChOb3RlLk5PVEUsCi0gICAgICAgICAgICAgICAgICAgICAgICAiTm93J3MgdGhlIHRpbWUgZm9yIGFsbCBmb2xrIHRvIGNvbWUgdG8gdGhlIGFpZCBvZiB0aGVpciBjb3VudHJ5LiIpOwotICAgICAgICBlbGVtLmFkZEV4cGVjdGVkKFBob3RvLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC8vIE5vIGluZm9ybWF0aW9uIGFib3V0IGl0cyBpbWFnZSBmb3JtYXQgY2FuIGJlIGluc2VydGVkLgotICAgICAgICAgICAgICAgIC5wdXQoUGhvdG8uUEhPVE8sIHNQaG90b0J5dGVBcnJheUZvckNvbXBsaWNhdGVkQ2FzZSk7Ci0gICAgICAgIGVsZW0uYWRkRXhwZWN0ZWQoRXZlbnQuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChFdmVudC5TVEFSVF9EQVRFLCAiMTk4MDAxMDEiKQotICAgICAgICAgICAgICAgIC5wdXQoRXZlbnQuVFlQRSwgRXZlbnQuVFlQRV9CSVJUSERBWSk7Ci0gICAgICAgIGVsZW0uYWRkRXhwZWN0ZWQoV2Vic2l0ZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFdlYnNpdGUuVVJMLCAiaHR0cDovL3d3dy5leGFtcGxlLmNvbS8iKQotICAgICAgICAgICAgICAgIC5wdXQoV2Vic2l0ZS5UWVBFLCBXZWJzaXRlLlRZUEVfSE9NRVBBR0UpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RJbnZhbGlkTXVsdGlwbGVMaW5lVjIxKCkgewotICAgICAgICBtVmVyaWZpZXIuaW5pdEZvckltcG9ydFRlc3QoVjIxLCBSLnJhdy52MjFfaW52YWxpZF9tdWx0aXBsZV9saW5lKTsKLSAgICAgICAgQ29udGVudFZhbHVlc1ZlcmlmaWVyRWxlbSBlbGVtID0gbVZlcmlmaWVyLmFkZENvbnRlbnRWYWx1ZXNWZXJpZmllckVsZW0oKTsKLSAgICAgICAgZWxlbS5hZGRFeHBlY3RlZChTdHJ1Y3R1cmVkTmFtZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLkdJVkVOX05BTUUsICJPbWVnYSIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5ESVNQTEFZX05BTUUsICJPbWVnYSIpOwotICAgICAgICBlbGVtLmFkZEV4cGVjdGVkKEVtYWlsLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoRW1haWwuVFlQRSwgRW1haWwuVFlQRV9DVVNUT00pCi0gICAgICAgICAgICAgICAgLnB1dChFbWFpbC5MQUJFTCwgIklOVEVSTkVUIikKLSAgICAgICAgICAgICAgICAucHV0KEVtYWlsLkFERFJFU1MsICJcIk9tZWdhXCIgPG9tZWdhQGV4YW1wbGUuY29tPiIpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RWMzBTaW1wbGVfUGFyc2luZygpIHsKLSAgICAgICAgbVZlcmlmaWVyLmluaXRGb3JJbXBvcnRUZXN0KFYzMCwgUi5yYXcudjMwX3NpbXBsZSk7Ci0gICAgICAgIG1WZXJpZmllci5hZGRQcm9wZXJ0eU5vZGVzVmVyaWZpZXJFbGVtKCkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJGTiIsICJBbmQgUm9pZCIpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigiTiIsICJBbmQ7Um9pZDs7OyIsCi0gICAgICAgICAgICAgICAgICAgICAgICBBcnJheXMuYXNMaXN0KCJBbmQiLCAiUm9pZCIsICIiLCAiIiwgIiIpKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGVXaXRoT3JkZXIoIk9SRyIsICJPcGVuO0hhbmRzZXQ7IEFsbGlhbmNlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5cy5hc0xpc3QoIk9wZW4iLCAiSGFuZHNldCIsICIgQWxsaWFuY2UiKSkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJTT1JULVNUUklORyIsICJhbmRyb2lkIikKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJURUwiLCAiMDMwMDAwMDAwMCIsIG5ldyBUeXBlU2V0KCJQUkVGIiwgIlZPSUNFIikpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigiQ0xBU1MiLCAiUFVCTElDIikKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJYLUdOTyIsICIwIikKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJYLUdOIiwgImdyb3VwMCIpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigiWC1SRURVQ1RJT04iLCAiMCIpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigiUkVWIiwgIjIwMDgxMDMxVDA2NTg1NFoiKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0VjMwU2ltcGxlKCkgewotICAgICAgICBtVmVyaWZpZXIuaW5pdEZvckltcG9ydFRlc3QoVjMwLCBSLnJhdy52MzBfc2ltcGxlKTsKLSAgICAgICAgQ29udGVudFZhbHVlc1ZlcmlmaWVyRWxlbSBlbGVtID0gbVZlcmlmaWVyLmFkZENvbnRlbnRWYWx1ZXNWZXJpZmllckVsZW0oKTsKLSAgICAgICAgZWxlbS5hZGRFeHBlY3RlZChTdHJ1Y3R1cmVkTmFtZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLkZBTUlMWV9OQU1FLCAiQW5kIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLkdJVkVOX05BTUUsICJSb2lkIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLkRJU1BMQVlfTkFNRSwgIkFuZCBSb2lkIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLlBIT05FVElDX0dJVkVOX05BTUUsICJhbmRyb2lkIik7Ci0gICAgICAgIGVsZW0uYWRkRXhwZWN0ZWQoT3JnYW5pemF0aW9uLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoT3JnYW5pemF0aW9uLkNPTVBBTlksICJPcGVuIikKLSAgICAgICAgICAgICAgICAucHV0KE9yZ2FuaXphdGlvbi5ERVBBUlRNRU5ULCAiSGFuZHNldCAgQWxsaWFuY2UiKQotICAgICAgICAgICAgICAgIC5wdXQoT3JnYW5pemF0aW9uLlRZUEUsIE9yZ2FuaXphdGlvbi5UWVBFX1dPUkspOwotICAgICAgICBlbGVtLmFkZEV4cGVjdGVkKFBob25lLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuVFlQRSwgUGhvbmUuVFlQRV9DVVNUT00pCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5MQUJFTCwgIlZPSUNFIikKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLk5VTUJFUiwgIjAzMC0wMDAtMDAwMCIpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5JU19QUklNQVJZLCAxKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0VjIxSmFwYW5lc2UxX1BhcnNpbmcoKSB7Ci0gICAgICAgIC8vIFRob3VnaCBKYXBhbmVzZSBjYXJlZXJzIGFwcGVuZCAiOzs7OyIgYXQgdGhlIGVuZCBvZiB0aGUgdmFsdWUgb2YgIlNPVU5EIiwKLSAgICAgICAgLy8gdkNhcmQgMi4xLzMuMCBzcGVjaWZpY2F0aW9uIGRvZXMgbm90IGFsbG93IG11bHRpcGxlIHZhbHVlcy4KLSAgICAgICAgLy8gRG8gbm90IG5lZWQgdG8gaGFuZGxlIGl0IGFzIG11bHRpcGxlIHZhbHVlcy4KLSAgICAgICAgbVZlcmlmaWVyLmluaXRGb3JJbXBvcnRUZXN0KFZDYXJkQ29uZmlnLlZDQVJEX1RZUEVfVjIxX0pBUEFORVNFLCBSLnJhdy52MjFfamFwYW5lc2VfMSk7Ci0gICAgICAgIG1WZXJpZmllci5hZGRQcm9wZXJ0eU5vZGVzVmVyaWZpZXJFbGVtKCkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJOIiwgIlx1NUI4OVx1ODVFNFx1MzBFRFx1MzBBNFx1MzBDOTs7OzsiLAotICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlzLmFzTGlzdCgiXHU1Qjg5XHU4NUU0XHUzMEVEXHUzMEE0XHUzMEM5IiwgIiIsICIiLCAiIiwgIiIpLAotICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCwgbUNvbnRlbnRWYWx1ZXNGb3JTSmlzLCBudWxsLCBudWxsKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGVXaXRoT3JkZXIoIlNPVU5EIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICJcdUZGNzFcdUZGOURcdUZGODRcdUZGOUVcdUZGNzNcdUZGOUJcdUZGNzJcdUZGODRcdUZGOUU7Ozs7IiwKLSAgICAgICAgICAgICAgICAgICAgICAgIG51bGwsIG51bGwsIG1Db250ZW50VmFsdWVzRm9yU0ppcywKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBUeXBlU2V0KCJYLUlSTUMtTiIpLCBudWxsKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGVXaXRoT3JkZXIoIlRFTCIsICIwMzAwMDAwMDAwIiwgbnVsbCwgbnVsbCwgbnVsbCwKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBUeXBlU2V0KCJWT0lDRSIsICJQUkVGIiksIG51bGwpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCB0ZXN0VjIxSmFwYW5lc2UxQ29tbW9uKGludCByZXNJZCwgaW50IHZjYXJkVHlwZSwgYm9vbGVhbiBqYXBhbmVzZSkgewotICAgICAgICBtVmVyaWZpZXIuaW5pdEZvckltcG9ydFRlc3QodmNhcmRUeXBlLCByZXNJZCk7Ci0gICAgICAgIENvbnRlbnRWYWx1ZXNWZXJpZmllckVsZW0gZWxlbSA9IG1WZXJpZmllci5hZGRDb250ZW50VmFsdWVzVmVyaWZpZXJFbGVtKCk7Ci0gICAgICAgIGVsZW0uYWRkRXhwZWN0ZWQoU3RydWN0dXJlZE5hbWUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5GQU1JTFlfTkFNRSwgIlx1NUI4OVx1ODVFNFx1MzBFRFx1MzBBNFx1MzBDOSIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5ESVNQTEFZX05BTUUsICJcdTVCODlcdTg1RTRcdTMwRURcdTMwQTRcdTMwQzkiKQotICAgICAgICAgICAgICAgIC8vIFdoaWxlIHZDYXJkIHBhcnNlciBkb2VzIG5vdCBzcGxpdCAiU09VTkQiIHByb3BlcnR5IHZhbHVlcywKLSAgICAgICAgICAgICAgICAvLyBDb250YWN0U3RydWN0IGNhcmUgaXQuCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5QSE9ORVRJQ19HSVZFTl9OQU1FLAotICAgICAgICAgICAgICAgICAgICAgICAgIlx1RkY3MVx1RkY5RFx1RkY4NFx1RkY5RVx1RkY3M1x1RkY5Qlx1RkY3Mlx1RkY4NFx1RkY5RSIpOwotICAgICAgICBlbGVtLmFkZEV4cGVjdGVkKFBob25lLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC8vIFBob25lIG51bWJlciBmb3JtYXR0aW5nIGlzIGRpZmZlcmVudC4KLSAgICAgICAgICAgICAgICAucHV0KFBob25lLk5VTUJFUiwgKGphcGFuZXNlID8gIjAzLTAwMDAtMDAwMCIgOiAiMDMwLTAwMC0wMDAwIikpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5UWVBFLCBQaG9uZS5UWVBFX0NVU1RPTSkKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLkxBQkVMLCAiVk9JQ0UiKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuSVNfUFJJTUFSWSwgMSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVmVyaWZpZXMgdkNhcmQgd2l0aCBKYXBhbmVzZSBjYW4gYmUgcGFyc2VkIGNvcnJlY3RseSB3aXRoCi0gICAgICoge0BsaW5rIGNvbS5hbmRyb2lkLnZjYXJkLlZDYXJkQ29uZmlnI1ZDQVJEX1RZUEVfVjIxX0dFTkVSSUN9LgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RWMjFKYXBhbmVzZTFfVHlwZV9HZW5lcmljX1V0ZjgoKSB7Ci0gICAgICAgIHRlc3RWMjFKYXBhbmVzZTFDb21tb24oCi0gICAgICAgICAgICAgICAgUi5yYXcudjIxX2phcGFuZXNlXzEsIFZDYXJkQ29uZmlnLlZDQVJEX1RZUEVfVjIxX0dFTkVSSUMsIGZhbHNlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBWZXJpZmllcyB2Q2FyZCB3aXRoIEphcGFuZXNlIGNhbiBiZSBwYXJzZWQgY29ycmVjdGx5IHdpdGgKLSAgICAgKiB7QGxpbmsgY29tLmFuZHJvaWQudmNhcmQuVkNhcmRDb25maWcjVkNBUkRfVFlQRV9WMjFfSkFQQU5FU0V9LgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RWMjFKYXBhbmVzZTFfVHlwZV9KYXBhbmVzZV9TamlzKCkgewotICAgICAgICB0ZXN0VjIxSmFwYW5lc2UxQ29tbW9uKAotICAgICAgICAgICAgICAgIFIucmF3LnYyMV9qYXBhbmVzZV8xLCBWQ2FyZENvbmZpZy5WQ0FSRF9UWVBFX1YyMV9KQVBBTkVTRSwgdHJ1ZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVmVyaWZpZXMgdkNhcmQgd2l0aCBKYXBhbmVzZSBjYW4gYmUgcGFyc2VkIGNvcnJlY3RseSB3aXRoCi0gICAgICoge0BsaW5rIGNvbS5hbmRyb2lkLnZjYXJkLlZDYXJkQ29uZmlnI1ZDQVJEX1RZUEVfVjIxX0pBUEFORVNFfS4KLSAgICAgKiBzaW5jZSB2Q2FyZCAyLjEgc3BlY2lmaWVzIHRoZSBjaGFyc2V0IG9mIGVhY2ggbGluZSBpZiBpdCBjb250YWlucyBub24tQXNjaWkuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdFYyMUphcGFuZXNlMV9UeXBlX0phcGFuZXNlX1V0ZjgoKSB7Ci0gICAgICAgIHRlc3RWMjFKYXBhbmVzZTFDb21tb24oCi0gICAgICAgICAgICAgICAgUi5yYXcudjIxX2phcGFuZXNlXzEsIFZDYXJkQ29uZmlnLlZDQVJEX1RZUEVfVjIxX0pBUEFORVNFLCB0cnVlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0VjIxSmFwYW5lc2UyX1BhcnNpbmcoKSB7Ci0gICAgICAgIG1WZXJpZmllci5pbml0Rm9ySW1wb3J0VGVzdChWQ2FyZENvbmZpZy5WQ0FSRF9UWVBFX1YyMV9KQVBBTkVTRSwgUi5yYXcudjIxX2phcGFuZXNlXzIpOwotICAgICAgICBtVmVyaWZpZXIuYWRkUHJvcGVydHlOb2Rlc1ZlcmlmaWVyRWxlbSgpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigiTiIsICJcdTVCODlcdTg1RTQ7XHUzMEVEXHUzMEE0XHUzMEM5XHUwMDMxOzs7IiwKLSAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5cy5hc0xpc3QoIlx1NUI4OVx1ODVFNCIsICJcdTMwRURcdTMwQTRcdTMwQzlcdTAwMzEiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIiwgIiIsICIiKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIG51bGwsIG1Db250ZW50VmFsdWVzRm9yU0ppcywgbnVsbCwgbnVsbCkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJGTiIsICJcdTVCODlcdTg1RTRcdTAwMjBcdTMwRURcdTMwQTRcdTMwQzlcdTAwMjBcdTAwMzEiLAotICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCwgbnVsbCwgbUNvbnRlbnRWYWx1ZXNGb3JTSmlzLCBudWxsLCBudWxsKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGVXaXRoT3JkZXIoIlNPVU5EIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICJcdUZGNzFcdUZGOURcdUZGODRcdUZGOUVcdUZGNzM7XHVGRjlCXHVGRjcyXHVGRjg0XHVGRjlFXHUwMDMxOzs7IiwKLSAgICAgICAgICAgICAgICAgICAgICAgIG51bGwsIG51bGwsIG1Db250ZW50VmFsdWVzRm9yU0ppcywKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBUeXBlU2V0KCJYLUlSTUMtTiIpLCBudWxsKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGVXaXRoT3JkZXIoIkFEUiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAiO1x1Njc3MVx1NEVBQ1x1OTBGRFx1NkUwQlx1OEMzN1x1NTMzQVx1Njg1QyIgKwotICAgICAgICAgICAgICAgICAgICAgICAgIlx1NEUxOFx1NzUzQVx1MDAzMlx1MDAzNlx1MDAyRFx1MDAzMVx1MzBCQiIgKwotICAgICAgICAgICAgICAgICAgICAgICAgIlx1MzBFQlx1MzBFQVx1MzBBMlx1MzBGM1x1MzBCRlx1MzBFRlx1MzBGQ1x1MDAzNiIgKwotICAgICAgICAgICAgICAgICAgICAgICAgIlx1OTY4RTs7OzsxNTAtODUxMjsiLAotICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlzLmFzTGlzdCgiIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlx1Njc3MVx1NEVBQ1x1OTBGRFx1NkUwQlx1OEMzN1x1NTMzQVx1Njg1QyIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXHU0RTE4XHU3NTNBXHUwMDMyXHUwMDM2XHUwMDJEXHUwMDMxXHUzMEJCIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcdTMwRUJcdTMwRUFcdTMwQTJcdTMwRjNcdTMwQkZcdTMwRUZcdTMwRkMiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlx1MDAzNlx1OTY4RSIsICIiLCAiIiwgIiIsICIxNTAtODUxMiIsICIiKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIG51bGwsIG1Db250ZW50VmFsdWVzRm9yUVBBbmRTSmlzLCBuZXcgVHlwZVNldCgiSE9NRSIpLCBudWxsKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGVXaXRoT3JkZXIoIk5PVEUiLCAiXHUzMEUxXHUzMEUyIiwgbnVsbCwgbnVsbCwKLSAgICAgICAgICAgICAgICAgICAgICAgIG1Db250ZW50VmFsdWVzRm9yUVBBbmRTSmlzLCBudWxsLCBudWxsKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0VjIxSmFwYW5lc2UyX1R5cGVfR2VuZXJpY19VdGY4KCkgewotICAgICAgICBtVmVyaWZpZXIuaW5pdEZvckltcG9ydFRlc3QoVjIxLCBSLnJhdy52MjFfamFwYW5lc2VfMik7Ci0gICAgICAgIENvbnRlbnRWYWx1ZXNWZXJpZmllckVsZW0gZWxlbSA9IG1WZXJpZmllci5hZGRDb250ZW50VmFsdWVzVmVyaWZpZXJFbGVtKCk7Ci0gICAgICAgIGVsZW0uYWRkRXhwZWN0ZWQoU3RydWN0dXJlZE5hbWUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5GQU1JTFlfTkFNRSwgIlx1NUI4OVx1ODVFNCIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5HSVZFTl9OQU1FLCAiXHUzMEVEXHUzMEE0XHUzMEM5XHUwMDMxIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLkRJU1BMQVlfTkFNRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICJcdTVCODlcdTg1RTRcdTAwMjBcdTMwRURcdTMwQTRcdTMwQzlcdTAwMjBcdTAwMzEiKQotICAgICAgICAgICAgICAgIC8vIENvbnRhY3RTdHJ1Y3Qgc2hvdWxkIGNvcnJlY3RseSBzcGxpdCAiU09VTkQiIHByb3BlcnR5IGludG8gc2V2ZXJhbCBlbGVtZW50cywKLSAgICAgICAgICAgICAgICAvLyBldmVuIHRob3VnaCBWQ2FyZFBhcnNlciBzaWRlIGRvZXMgbm90IGNhcmUgaXQuCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5QSE9ORVRJQ19GQU1JTFlfTkFNRSwgIlx1RkY3MVx1RkY5RFx1RkY4NFx1RkY5RVx1RkY3MyIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5QSE9ORVRJQ19HSVZFTl9OQU1FLCAiXHVGRjlCXHVGRjcyXHVGRjg0XHVGRjlFXHUwMDMxIik7Ci0gICAgICAgIGVsZW0uYWRkRXhwZWN0ZWQoU3RydWN0dXJlZFBvc3RhbC5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWRQb3N0YWwuUE9TVENPREUsICIxNTAtODUxMiIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkUG9zdGFsLlNUUkVFVCwKLSAgICAgICAgICAgICAgICAgICAgICAgICJcdTY3NzFcdTRFQUNcdTkwRkRcdTZFMEJcdThDMzdcdTUzM0FcdTY4NUMiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICJcdTRFMThcdTc1M0FcdTAwMzJcdTAwMzZcdTAwMkRcdTAwMzFcdTMwQkIiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICJcdTMwRUJcdTMwRUFcdTMwQTJcdTMwRjNcdTMwQkZcdTMwRUZcdTMwRkMiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICJcdTAwMzZcdTk2OEUiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZFBvc3RhbC5GT1JNQVRURURfQUREUkVTUywKLSAgICAgICAgICAgICAgICAgICAgICAgICJcdTY3NzFcdTRFQUNcdTkwRkRcdTZFMEJcdThDMzdcdTUzM0FcdTY4NUMiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICJcdTRFMThcdTc1M0FcdTAwMzJcdTAwMzZcdTAwMkRcdTAwMzFcdTMwQkIiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICJcdTMwRUJcdTMwRUFcdTMwQTJcdTMwRjNcdTMwQkZcdTMwRUZcdTMwRkMiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICJcdTAwMzZcdTk2OEUgMTUwLTg1MTIiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZFBvc3RhbC5UWVBFLCBTdHJ1Y3R1cmVkUG9zdGFsLlRZUEVfSE9NRSk7Ci0gICAgICAgIGVsZW0uYWRkRXhwZWN0ZWQoTm90ZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KE5vdGUuTk9URSwgIlx1MzBFMVx1MzBFMiIpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RWMjFNdWx0aXBsZUVudHJ5Q2FzZV9QYXJzZSgpIHsKLSAgICAgICAgbVZlcmlmaWVyLmluaXRGb3JJbXBvcnRUZXN0KFZDYXJkQ29uZmlnLlZDQVJEX1RZUEVfVjIxX0pBUEFORVNFLCBSLnJhdy52MjFfbXVsdGlwbGVfZW50cnkpOwotICAgICAgICBtVmVyaWZpZXIuYWRkUHJvcGVydHlOb2Rlc1ZlcmlmaWVyRWxlbSgpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigiTiIsICJcdTVCODlcdTg1RTRcdTMwRURcdTMwQTRcdTMwQzlcdTAwMzM7Ozs7IiwKLSAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5cy5hc0xpc3QoIlx1NUI4OVx1ODVFNFx1MzBFRFx1MzBBNFx1MzBDOVx1MDAzMyIsICIiLCAiIiwgIiIsICIiKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIG51bGwsIG1Db250ZW50VmFsdWVzRm9yU0ppcywgbnVsbCwgbnVsbCkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJTT1VORCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAiXHVGRjcxXHVGRjlEXHVGRjg0XHVGRjlFXHVGRjczXHVGRjlCXHVGRjcyXHVGRjg0XHVGRjlFXHUwMDMzOzs7OyIsCi0gICAgICAgICAgICAgICAgICAgICAgICBudWxsLCBudWxsLCBtQ29udGVudFZhbHVlc0ZvclNKaXMsCi0gICAgICAgICAgICAgICAgICAgICAgICBuZXcgVHlwZVNldCgiWC1JUk1DLU4iKSwgbnVsbCkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJURUwiLCAiOSIsIG5ldyBUeXBlU2V0KCJYLU5FQy1TRUNSRVQiKSkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJURUwiLCAiMTAiLCBuZXcgVHlwZVNldCgiWC1ORUMtSE9URUwiKSkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJURUwiLCAiMTEiLCBuZXcgVHlwZVNldCgiWC1ORUMtU0NIT09MIikpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigiVEVMIiwgIjEyIiwgbmV3IFR5cGVTZXQoIkZBWCIsICJIT01FIikpOwotICAgICAgICBtVmVyaWZpZXIuYWRkUHJvcGVydHlOb2Rlc1ZlcmlmaWVyRWxlbSgpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigiTiIsICJcdTVCODlcdTg1RTRcdTMwRURcdTMwQTRcdTMwQzlcdTAwMzQ7Ozs7IiwKLSAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5cy5hc0xpc3QoIlx1NUI4OVx1ODVFNFx1MzBFRFx1MzBBNFx1MzBDOVx1MDAzNCIsICIiLCAiIiwgIiIsICIiKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIG51bGwsIG1Db250ZW50VmFsdWVzRm9yU0ppcywgbnVsbCwgbnVsbCkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJTT1VORCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAiXHVGRjcxXHVGRjlEXHVGRjg0XHVGRjlFXHVGRjczXHVGRjlCXHVGRjcyXHVGRjg0XHVGRjlFXHUwMDM0Ozs7OyIsCi0gICAgICAgICAgICAgICAgICAgICAgICBudWxsLCBudWxsLCBtQ29udGVudFZhbHVlc0ZvclNKaXMsCi0gICAgICAgICAgICAgICAgICAgICAgICBuZXcgVHlwZVNldCgiWC1JUk1DLU4iKSwgbnVsbCkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJURUwiLCAiMTMiLCBuZXcgVHlwZVNldCgiTU9ERU0iKSkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJURUwiLCAiMTQiLCBuZXcgVHlwZVNldCgiUEFHRVIiKSkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJURUwiLCAiMTUiLCBuZXcgVHlwZVNldCgiWC1ORUMtRkFNSUxZIikpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigiVEVMIiwgIjE2IiwgbmV3IFR5cGVTZXQoIlgtTkVDLUdJUkwiKSk7Ci0gICAgICAgIG1WZXJpZmllci5hZGRQcm9wZXJ0eU5vZGVzVmVyaWZpZXJFbGVtKCkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJOIiwgIlx1NUI4OVx1ODVFNFx1MzBFRFx1MzBBNFx1MzBDOVx1MDAzNTs7OzsiLAotICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlzLmFzTGlzdCgiXHU1Qjg5XHU4NUU0XHUzMEVEXHUzMEE0XHUzMEM5XHUwMDM1IiwgIiIsICIiLCAiIiwgIiIpLAotICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCwgbUNvbnRlbnRWYWx1ZXNGb3JTSmlzLCBudWxsLCBudWxsKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGVXaXRoT3JkZXIoIlNPVU5EIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICJcdUZGNzFcdUZGOURcdUZGODRcdUZGOUVcdUZGNzNcdUZGOUJcdUZGNzJcdUZGODRcdUZGOUVcdTAwMzU7Ozs7IiwKLSAgICAgICAgICAgICAgICAgICAgICAgIG51bGwsIG51bGwsIG1Db250ZW50VmFsdWVzRm9yU0ppcywKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBUeXBlU2V0KCJYLUlSTUMtTiIpLCBudWxsKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGVXaXRoT3JkZXIoIlRFTCIsICIxNyIsIG5ldyBUeXBlU2V0KCJYLU5FQy1CT1kiKSkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJURUwiLCAiMTgiLCBuZXcgVHlwZVNldCgiWC1ORUMtRlJJRU5EIikpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigiVEVMIiwgIjE5IiwgbmV3IFR5cGVTZXQoIlgtTkVDLVBIUyIpKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGVXaXRoT3JkZXIoIlRFTCIsICIyMCIsIG5ldyBUeXBlU2V0KCJYLU5FQy1SRVNUQVVSQU5UIikpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RWMjFNdWx0aXBsZUVudHJ5Q2FzZSgpIHsKLSAgICAgICAgbVZlcmlmaWVyLmluaXRGb3JJbXBvcnRUZXN0KFZDYXJkQ29uZmlnLlZDQVJEX1RZUEVfVjIxX0pBUEFORVNFLCBSLnJhdy52MjFfbXVsdGlwbGVfZW50cnkpOwotICAgICAgICBDb250ZW50VmFsdWVzVmVyaWZpZXJFbGVtIGVsZW0gPSBtVmVyaWZpZXIuYWRkQ29udGVudFZhbHVlc1ZlcmlmaWVyRWxlbSgpOwotICAgICAgICBlbGVtLmFkZEV4cGVjdGVkKFN0cnVjdHVyZWROYW1lLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuRkFNSUxZX05BTUUsICJcdTVCODlcdTg1RTRcdTMwRURcdTMwQTRcdTMwQzlcdTAwMzMiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuRElTUExBWV9OQU1FLCAiXHU1Qjg5XHU4NUU0XHUzMEVEXHUzMEE0XHUzMEM5XHUwMDMzIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLlBIT05FVElDX0dJVkVOX05BTUUsCi0gICAgICAgICAgICAgICAgICAgICAgICAiXHVGRjcxXHVGRjlEXHVGRjg0XHVGRjlFXHVGRjczXHVGRjlCXHVGRjcyXHVGRjg0XHVGRjlFXHUwMDMzIik7Ci0gICAgICAgIGVsZW0uYWRkRXhwZWN0ZWQoUGhvbmUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5UWVBFLCBQaG9uZS5UWVBFX0NVU1RPTSkKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLkxBQkVMLCAiTkVDLVNFQ1JFVCIpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5OVU1CRVIsICI5Iik7Ci0gICAgICAgIGVsZW0uYWRkRXhwZWN0ZWQoUGhvbmUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5UWVBFLCBQaG9uZS5UWVBFX0NVU1RPTSkKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLkxBQkVMLCAiTkVDLUhPVEVMIikKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLk5VTUJFUiwgIjEwIik7Ci0gICAgICAgIGVsZW0uYWRkRXhwZWN0ZWQoUGhvbmUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5UWVBFLCBQaG9uZS5UWVBFX0NVU1RPTSkKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLkxBQkVMLCAiTkVDLVNDSE9PTCIpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5OVU1CRVIsICIxMSIpOwotICAgICAgICBlbGVtLmFkZEV4cGVjdGVkKFBob25lLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuVFlQRSwgUGhvbmUuVFlQRV9GQVhfSE9NRSkKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLk5VTUJFUiwgIjEyIik7Ci0KLSAgICAgICAgZWxlbSA9IG1WZXJpZmllci5hZGRDb250ZW50VmFsdWVzVmVyaWZpZXJFbGVtKCk7Ci0gICAgICAgIGVsZW0uYWRkRXhwZWN0ZWQoU3RydWN0dXJlZE5hbWUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5GQU1JTFlfTkFNRSwgIlx1NUI4OVx1ODVFNFx1MzBFRFx1MzBBNFx1MzBDOVx1MDAzNCIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5ESVNQTEFZX05BTUUsICJcdTVCODlcdTg1RTRcdTMwRURcdTMwQTRcdTMwQzlcdTAwMzQiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuUEhPTkVUSUNfR0lWRU5fTkFNRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICJcdUZGNzFcdUZGOURcdUZGODRcdUZGOUVcdUZGNzNcdUZGOUJcdUZGNzJcdUZGODRcdUZGOUVcdTAwMzQiKTsKLSAgICAgICAgZWxlbS5hZGRFeHBlY3RlZChQaG9uZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLlRZUEUsIFBob25lLlRZUEVfQ1VTVE9NKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuTEFCRUwsICJNT0RFTSIpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5OVU1CRVIsICIxMyIpOwotICAgICAgICBlbGVtLmFkZEV4cGVjdGVkKFBob25lLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuVFlQRSwgUGhvbmUuVFlQRV9QQUdFUikKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLk5VTUJFUiwgIjE0Iik7Ci0gICAgICAgIGVsZW0uYWRkRXhwZWN0ZWQoUGhvbmUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5UWVBFLCBQaG9uZS5UWVBFX0NVU1RPTSkKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLkxBQkVMLCAiTkVDLUZBTUlMWSIpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5OVU1CRVIsICIxNSIpOwotICAgICAgICBlbGVtLmFkZEV4cGVjdGVkKFBob25lLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuVFlQRSwgUGhvbmUuVFlQRV9DVVNUT00pCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5MQUJFTCwgIk5FQy1HSVJMIikKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLk5VTUJFUiwgIjE2Iik7Ci0KLSAgICAgICAgZWxlbSA9IG1WZXJpZmllci5hZGRDb250ZW50VmFsdWVzVmVyaWZpZXJFbGVtKCk7Ci0gICAgICAgIGVsZW0uYWRkRXhwZWN0ZWQoU3RydWN0dXJlZE5hbWUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5GQU1JTFlfTkFNRSwgIlx1NUI4OVx1ODVFNFx1MzBFRFx1MzBBNFx1MzBDOVx1MDAzNSIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5ESVNQTEFZX05BTUUsICJcdTVCODlcdTg1RTRcdTMwRURcdTMwQTRcdTMwQzlcdTAwMzUiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuUEhPTkVUSUNfR0lWRU5fTkFNRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICJcdUZGNzFcdUZGOURcdUZGODRcdUZGOUVcdUZGNzNcdUZGOUJcdUZGNzJcdUZGODRcdUZGOUVcdTAwMzUiKTsKLSAgICAgICAgZWxlbS5hZGRFeHBlY3RlZChQaG9uZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLlRZUEUsIFBob25lLlRZUEVfQ1VTVE9NKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuTEFCRUwsICJORUMtQk9ZIikKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLk5VTUJFUiwgIjE3Iik7Ci0gICAgICAgIGVsZW0uYWRkRXhwZWN0ZWQoUGhvbmUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5UWVBFLCBQaG9uZS5UWVBFX0NVU1RPTSkKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLkxBQkVMLCAiTkVDLUZSSUVORCIpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5OVU1CRVIsICIxOCIpOwotICAgICAgICBlbGVtLmFkZEV4cGVjdGVkKFBob25lLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuVFlQRSwgUGhvbmUuVFlQRV9DVVNUT00pCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5MQUJFTCwgIk5FQy1QSFMiKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuTlVNQkVSLCAiMTkiKTsKLSAgICAgICAgZWxlbS5hZGRFeHBlY3RlZChQaG9uZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLlRZUEUsIFBob25lLlRZUEVfQ1VTVE9NKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuTEFCRUwsICJORUMtUkVTVEFVUkFOVCIpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5OVU1CRVIsICIyMCIpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RJZ25vcmVBZ2VudFYyMV9QYXJzZSgpIHsKLSAgICAgICAgbVZlcmlmaWVyLmluaXRGb3JJbXBvcnRUZXN0KFYyMSwgUi5yYXcudjIxX3dpbm1vXzY1KTsKLSAgICAgICAgQ29udGVudFZhbHVlcyBjb250ZW50VmFsdWVzRm9yVmFsdWUgPSBuZXcgQ29udGVudFZhbHVlcygpOwotICAgICAgICBjb250ZW50VmFsdWVzRm9yVmFsdWUucHV0KCJWQUxVRSIsICJEQVRFIik7Ci0gICAgICAgIG1WZXJpZmllci5hZGRQcm9wZXJ0eU5vZGVzVmVyaWZpZXJFbGVtKCkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJOIiwgQXJyYXlzLmFzTGlzdCgiRXhhbXBsZSIsICIiLCAiIiwgIiIsICIiKSkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJGTiIsICJFeGFtcGxlIikKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJBTk5JVkVSU0FSWSIsICIyMDA5MTAxMCIsIGNvbnRlbnRWYWx1ZXNGb3JWYWx1ZSkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJBR0VOVCIsICIiKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGVXaXRoT3JkZXIoIlgtQ0xBU1MiLCAiUFVCTElDIikKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJYLVJFRFVDVElPTiIsICIiKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGVXaXRoT3JkZXIoIlgtTk8iLCAiIik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdElnbm9yZUFnZW50VjIxKCkgewotICAgICAgICBtVmVyaWZpZXIuaW5pdEZvckltcG9ydFRlc3QoVjIxLCBSLnJhdy52MjFfd2lubW9fNjUpOwotICAgICAgICBDb250ZW50VmFsdWVzVmVyaWZpZXIgdmVyaWZpZXIgPSBuZXcgQ29udGVudFZhbHVlc1ZlcmlmaWVyKCk7Ci0gICAgICAgIENvbnRlbnRWYWx1ZXNWZXJpZmllckVsZW0gZWxlbSA9IG1WZXJpZmllci5hZGRDb250ZW50VmFsdWVzVmVyaWZpZXJFbGVtKCk7Ci0gICAgICAgIGVsZW0uYWRkRXhwZWN0ZWQoU3RydWN0dXJlZE5hbWUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5GQU1JTFlfTkFNRSwgIkV4YW1wbGUiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuRElTUExBWV9OQU1FLCAiRXhhbXBsZSIpOwotICAgICAgICBlbGVtLmFkZEV4cGVjdGVkKEV2ZW50LkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoRXZlbnQuVFlQRSwgRXZlbnQuVFlQRV9BTk5JVkVSU0FSWSkKLSAgICAgICAgICAgICAgICAucHV0KEV2ZW50LlNUQVJUX0RBVEUsICIyMDA5MTAxMCIpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RUb2xlcmF0ZUludmFsaWRDb21tZW50TGlrZUxpbmVWMjEoKSB7Ci0gICAgICAgIG1WZXJpZmllci5pbml0Rm9ySW1wb3J0VGVzdChWMjEsIFIucmF3LnYyMV9pbnZhbGlkX2NvbW1lbnRfbGluZSk7Ci0gICAgICAgIENvbnRlbnRWYWx1ZXNWZXJpZmllckVsZW0gZWxlbSA9IG1WZXJpZmllci5hZGRDb250ZW50VmFsdWVzVmVyaWZpZXJFbGVtKCk7Ci0gICAgICAgIGVsZW0uYWRkRXhwZWN0ZWQoU3RydWN0dXJlZE5hbWUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5HSVZFTl9OQU1FLCAiQ29uZmVyZW5jZSBDYWxsIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLkRJU1BMQVlfTkFNRSwgIkNvbmZlcmVuY2UgQ2FsbCIpOwotICAgICAgICBlbGVtLmFkZEV4cGVjdGVkKE5vdGUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChOb3RlLk5PVEUsICJUaGlzIGlzIGFuIChzaGFycCAtPiM8LSBzaGFycCkgZXhhbXBsZS4gIgotICAgICAgICAgICAgICAgICAgICAgICAgKyAiVGhpcyBtZXNzYWdlIG11c3QgTk9UIGJlIGlnbm9yZWQuIik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFBhZ2VyVjMwX1BhcnNlKCkgewotICAgICAgICBtVmVyaWZpZXIuaW5pdEZvckltcG9ydFRlc3QoVjMwLCBSLnJhdy52MzBfcGFnZXIpOwotICAgICAgICBtVmVyaWZpZXIuYWRkUHJvcGVydHlOb2Rlc1ZlcmlmaWVyRWxlbSgpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigiTiIsIEFycmF5cy5hc0xpc3QoIkYiLCAiRyIsICJNIiwgIiIsICIiKSkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJURUwiLCAiNjEwMTIzMTIzNEBwYWdlcnNhbXBsZS5jb20iLAotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFR5cGVTZXQoIldPUksiLCAiTVNHIiwgIlBBR0VSIikpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RQYWdlclYzMCgpIHsKLSAgICAgICAgbVZlcmlmaWVyLmluaXRGb3JJbXBvcnRUZXN0KFYzMCwgUi5yYXcudjMwX3BhZ2VyKTsKLSAgICAgICAgQ29udGVudFZhbHVlc1ZlcmlmaWVyRWxlbSBlbGVtID0gbVZlcmlmaWVyLmFkZENvbnRlbnRWYWx1ZXNWZXJpZmllckVsZW0oKTsKLSAgICAgICAgZWxlbS5hZGRFeHBlY3RlZChTdHJ1Y3R1cmVkTmFtZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLkZBTUlMWV9OQU1FLCAiRiIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5NSURETEVfTkFNRSwgIk0iKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuR0lWRU5fTkFNRSwgIkciKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuRElTUExBWV9OQU1FLCAiRyBNIEYiKTsKLSAgICAgICAgZWxlbS5hZGRFeHBlY3RlZChQaG9uZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLlRZUEUsIFBob25lLlRZUEVfUEFHRVIpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5OVU1CRVIsICI2MTAxMjMxMjM0QHBhZ2Vyc2FtcGxlLmNvbSIpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RNdWx0aUJ5dGVQcm9wVjMwX1BhcnNlKCkgewotICAgICAgICBtVmVyaWZpZXIuaW5pdEZvckltcG9ydFRlc3QoVjMwLCBSLnJhdy52MzBfbXVsdGlieXRlX3BhcmFtKTsKLSAgICAgICAgbVZlcmlmaWVyLmFkZFByb3BlcnR5Tm9kZXNWZXJpZmllckVsZW0oKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGVXaXRoT3JkZXIoIk4iLCBBcnJheXMuYXNMaXN0KCJGIiwgIkciLCAiTSIsICIiLCAiIikpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigiVEVMIiwgIjEiLCBuZXcgVHlwZVNldCgiXHU4RDM5IikpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RNdWx0aUJ5dGVQcm9wVjMwKCkgewotICAgICAgICBtVmVyaWZpZXIuaW5pdEZvckltcG9ydFRlc3QoVjMwLCBSLnJhdy52MzBfbXVsdGlieXRlX3BhcmFtKTsKLSAgICAgICAgZmluYWwgQ29udGVudFZhbHVlc1ZlcmlmaWVyRWxlbSBlbGVtID0gbVZlcmlmaWVyLmFkZENvbnRlbnRWYWx1ZXNWZXJpZmllckVsZW0oKTsKLSAgICAgICAgZWxlbS5hZGRFeHBlY3RlZChTdHJ1Y3R1cmVkTmFtZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLkZBTUlMWV9OQU1FLCAiRiIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5NSURETEVfTkFNRSwgIk0iKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuR0lWRU5fTkFNRSwgIkciKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuRElTUExBWV9OQU1FLCAiRyBNIEYiKTsKLSAgICAgICAgZWxlbS5hZGRFeHBlY3RlZChQaG9uZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLlRZUEUsIFBob25lLlRZUEVfQ1VTVE9NKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuTEFCRUwsICJcdThEMzkiKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuTlVNQkVSLCAiMSIpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RDb21tYVNlcGFyYXRlZFBhcmFtc1YzMF9QYXJzZSgpIHsKLSAgICAgICAgbVZlcmlmaWVyLmluaXRGb3JJbXBvcnRUZXN0KFYzMCwgUi5yYXcudjMwX2NvbW1hX3NlcGFyYXRlZCk7Ci0gICAgICAgIG1WZXJpZmllci5hZGRQcm9wZXJ0eU5vZGVzVmVyaWZpZXJFbGVtKCkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJOIiwgQXJyYXlzLmFzTGlzdCgiRiIsICJHIiwgIk0iLCAiIiwgIiIpLAotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFR5cGVTZXQoIlBSRUYiLCAiSE9NRSIpKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGVXaXRoT3JkZXIoIlRFTCIsICIxIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBUeXBlU2V0KCJDT01NQSxTRVBBUkFURUQ6SU5TSURFLkRRVU9URSIsICJQUkVGIikpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RTb3J0QXNWNDBfUGFyc2UoKSB7Ci0gICAgICAgIG1WZXJpZmllci5pbml0Rm9ySW1wb3J0VGVzdChWNDAsIFIucmF3LnY0MF9zb3J0X2FzKTsKLQotICAgICAgICBmaW5hbCBDb250ZW50VmFsdWVzIGNvbnRlbnRWYWx1ZXNGb3JTb3J0QXNOID0gbmV3IENvbnRlbnRWYWx1ZXMoKTsKLSAgICAgICAgY29udGVudFZhbHVlc0ZvclNvcnRBc04ucHV0KCJTT1JULUFTIiwKLSAgICAgICAgICAgICAgICAiXHUzMDQyXHUzMDkzXHUzMDY5XHUzMDQ2O1x1MzA4RFx1MzA0NFx1MzA2OSIpOwotICAgICAgICBmaW5hbCBDb250ZW50VmFsdWVzIGNvbnRlbnRWYWx1ZXNGb3JTb3J0QXNPcmcgPSBuZXcgQ29udGVudFZhbHVlcygpOwotICAgICAgICBjb250ZW50VmFsdWVzRm9yU29ydEFzT3JnLnB1dCgiU09SVC1BUyIsCi0gICAgICAgICAgICAgICAgIlx1MzA1MFx1MzBGQ1x1MzA1MFx1MzA4QjtcdTMwNTFcdTMwOTNcdTMwNTVcdTMwNEZcdTMwNzZcdTMwODJcdTMwOTMiKTsKLQotICAgICAgICBtVmVyaWZpZXIuYWRkUHJvcGVydHlOb2Rlc1ZlcmlmaWVyRWxlbSgpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigiRk4iLCAiXHU1Qjg5XHU4NUU0XHUwMDIwXHUzMEVEXHUzMEE0XHUzMEM5IikKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJOIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5cy5hc0xpc3QoIlx1NUI4OVx1ODVFNCIsICJcdTMwRURcdTMwQTRcdTMwQzkiLCAiIiwgIiIsICIiKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnRWYWx1ZXNGb3JTb3J0QXNOKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGVXaXRoT3JkZXIoIk9SRyIsCi0gICAgICAgICAgICAgICAgICAgICAgICBBcnJheXMuYXNMaXN0KCJcdTMwQjBcdTMwRkNcdTMwQjBcdTMwRUIiLCAiXHU2OTFDXHU3RDIyXHU5MEU4XHU5NTgwIiksCi0gICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50VmFsdWVzRm9yU29ydEFzT3JnLCBuZXcgVHlwZVNldCgiV09SSyIpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0U29ydEFzVjQwKCkgewotICAgICAgICBtVmVyaWZpZXIuaW5pdEZvckltcG9ydFRlc3QoVjQwLCBSLnJhdy52NDBfc29ydF9hcyk7Ci0gICAgICAgIGZpbmFsIENvbnRlbnRWYWx1ZXNWZXJpZmllckVsZW0gZWxlbSA9IG1WZXJpZmllci5hZGRDb250ZW50VmFsdWVzVmVyaWZpZXJFbGVtKCk7Ci0gICAgICAgIGVsZW0uYWRkRXhwZWN0ZWQoU3RydWN0dXJlZE5hbWUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5GQU1JTFlfTkFNRSwgIlx1NUI4OVx1ODVFNCIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5HSVZFTl9OQU1FLCAiXHUzMEVEXHUzMEE0XHUzMEM5IikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLkRJU1BMQVlfTkFNRSwgIlx1NUI4OVx1ODVFNFx1MDAyMFx1MzBFRFx1MzBBNFx1MzBDOSIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5QSE9ORVRJQ19GQU1JTFlfTkFNRSwgIlx1MzA0Mlx1MzA5M1x1MzA2OVx1MzA0NiIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5QSE9ORVRJQ19HSVZFTl9OQU1FLAotICAgICAgICAgICAgICAgICAgICAgICAgIlx1MzA4RFx1MzA0NFx1MzA2OSIpOwotICAgICAgICBlbGVtLmFkZEV4cGVjdGVkKE9yZ2FuaXphdGlvbi5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KE9yZ2FuaXphdGlvbi5UWVBFLCBPcmdhbml6YXRpb24uVFlQRV9XT1JLKQotICAgICAgICAgICAgICAgIC5wdXQoT3JnYW5pemF0aW9uLkNPTVBBTlksICJcdTMwQjBcdTMwRkNcdTMwQjBcdTMwRUIiKQotICAgICAgICAgICAgICAgIC5wdXQoT3JnYW5pemF0aW9uLkRFUEFSVE1FTlQsICJcdTY5MUNcdTdEMjJcdTkwRThcdTk1ODAiKQotICAgICAgICAgICAgICAgIC5wdXQoT3JnYW5pemF0aW9uLlBIT05FVElDX05BTUUsCi0gICAgICAgICAgICAgICAgICAgICAgICAiXHUzMDUwXHUzMEZDXHUzMDUwXHUzMDhCXHUzMDUxXHUzMDkzXHUzMDU1XHUzMDRGXHUzMDc2XHUzMDgyXHUzMDkzIik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdElNVjIxX1BhcnNlKCkgewotICAgICAgICBtVmVyaWZpZXIuaW5pdEZvckltcG9ydFRlc3QoVjIxLCBSLnJhdy52MjFfaW0pOwotICAgICAgICBtVmVyaWZpZXIuYWRkUHJvcGVydHlOb2Rlc1ZlcmlmaWVyRWxlbSgpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigiWC1BTkRST0lELUNVU1RPTSIsCi0gICAgICAgICAgICAgICAgICAgICAgICBBcnJheXMuYXNMaXN0KCJ2bmQuYW5kcm9pZC5jdXJzb3IuaXRlbS9uaWNrbmFtZSIsICJOaWNrIiwgIjEiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIikpICAvLyAxMwotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGVXaXRoT3JkZXIoIlgtR09PR0xFLVRBTEsiLCAiaGhoQGdtYWlsLmNvbSIpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RJTVYyMSgpIHsKLSAgICAgICAgbVZlcmlmaWVyLmluaXRGb3JJbXBvcnRUZXN0KFYyMSwgUi5yYXcudjIxX2ltKTsKLSAgICAgICAgZmluYWwgQ29udGVudFZhbHVlc1ZlcmlmaWVyRWxlbSBlbGVtID0gbVZlcmlmaWVyLmFkZENvbnRlbnRWYWx1ZXNWZXJpZmllckVsZW0oKTsKLSAgICAgICAgZWxlbS5hZGRFeHBlY3RlZChOaWNrbmFtZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KE5pY2tuYW1lLk5BTUUsICJOaWNrIikKLSAgICAgICAgICAgICAgICAucHV0KE5pY2tuYW1lLlRZUEUsICIxIik7Ci0gICAgICAgIGVsZW0uYWRkRXhwZWN0ZWQoSW0uQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChJbS5QUk9UT0NPTCwgSW0uUFJPVE9DT0xfR09PR0xFX1RBTEspCi0gICAgICAgICAgICAgICAgLnB1dChJbS5UWVBFLCBJbS5UWVBFX0hPTUUpCi0gICAgICAgICAgICAgICAgLnB1dChJbS5EQVRBLCAiaGhoQGdtYWlsLmNvbSIpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL3BpbS92Y2FyZC9WQ2FyZEphcGFuaXphdGlvblRlc3RzLmphdmEgYi9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9waW0vdmNhcmQvVkNhcmRKYXBhbml6YXRpb25UZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YTk5NDE5Li4wMDAwMDAwCi0tLSBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL3BpbS92Y2FyZC9WQ2FyZEphcGFuaXphdGlvblRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MzUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIGFuZHJvaWQucGltLnZjYXJkOwotCi1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRWYWx1ZXM7Ci1pbXBvcnQgYW5kcm9pZC5waW0udmNhcmQudGVzdF91dGlscy5Db250YWN0RW50cnk7Ci1pbXBvcnQgYW5kcm9pZC5waW0udmNhcmQudGVzdF91dGlscy5Db250ZW50VmFsdWVzQnVpbGRlcjsKLWltcG9ydCBhbmRyb2lkLnBpbS52Y2FyZC50ZXN0X3V0aWxzLlByb3BlcnR5Tm9kZXNWZXJpZmllckVsZW07Ci1pbXBvcnQgYW5kcm9pZC5waW0udmNhcmQudGVzdF91dGlscy5Qcm9wZXJ0eU5vZGVzVmVyaWZpZXJFbGVtLlR5cGVTZXQ7Ci1pbXBvcnQgYW5kcm9pZC5waW0udmNhcmQudGVzdF91dGlscy5WQ2FyZFRlc3RzQmFzZTsKLWltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuQ29tbW9uRGF0YUtpbmRzLk5pY2tuYW1lOwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5Db21tb25EYXRhS2luZHMuTm90ZTsKLWltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuQ29tbW9uRGF0YUtpbmRzLlBob25lOwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5Db21tb25EYXRhS2luZHMuU3RydWN0dXJlZE5hbWU7Ci1pbXBvcnQgYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0LkNvbW1vbkRhdGFLaW5kcy5TdHJ1Y3R1cmVkUG9zdGFsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLQotcHVibGljIGNsYXNzIFZDYXJkSmFwYW5pemF0aW9uVGVzdHMgZXh0ZW5kcyBWQ2FyZFRlc3RzQmFzZSB7Ci0gICAgcHJpdmF0ZSB2b2lkIHRlc3ROYW1lVXRmOENvbW1vbihpbnQgdmNhcmRUeXBlKSB7Ci0gICAgICAgIG1WZXJpZmllci5pbml0Rm9yRXhwb3J0VGVzdCh2Y2FyZFR5cGUpOwotICAgICAgICBDb250YWN0RW50cnkgZW50cnkgPSBtVmVyaWZpZXIuYWRkSW5wdXRFbnRyeSgpOwotICAgICAgICBlbnRyeS5hZGRDb250ZW50VmFsdWVzKFN0cnVjdHVyZWROYW1lLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuRkFNSUxZX05BTUUsICJcdTMwNzVcdTMwOEJcdTMwNjkiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuR0lWRU5fTkFNRSwgIlx1MzA5MVx1MzA4QVx1MzA0QiIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5NSURETEVfTkFNRSwgIkIiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuUFJFRklYLCAiRHIuIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLlNVRkZJWCwgIlBoLkQiKTsKLSAgICAgICAgQ29udGVudFZhbHVlcyBjb250ZW50VmFsdWVzID0KLSAgICAgICAgICAgIChWQ2FyZENvbmZpZy5pc1ZlcnNpb24yMSh2Y2FyZFR5cGUpID8gbUNvbnRlbnRWYWx1ZXNGb3JRUEFuZFV0ZjggOiBudWxsKTsKLSAgICAgICAgbVZlcmlmaWVyLmFkZFByb3BlcnR5Tm9kZXNWZXJpZmllckVsZW0oKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIkZOIiwgIkRyLiBcdTMwNzVcdTMwOEJcdTMwNjkgQiBcdTMwOTFcdTMwOEFcdTMwNEIgUGguRCIsCi0gICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50VmFsdWVzKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIk4iLCAiXHUzMDc1XHUzMDhCXHUzMDY5O1x1MzA5MVx1MzA4QVx1MzA0QjtCO0RyLjtQaC5EIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5cy5hc0xpc3QoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcdTMwNzVcdTMwOEJcdTMwNjkiLCAiXHUzMDkxXHUzMDhBXHUzMDRCIiwgIkIiLCAiRHIuIiwgIlBoLkQiKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCwgY29udGVudFZhbHVlcywgbnVsbCwgbnVsbCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdE5hbWVVdGY4VjIxKCkgewotICAgICAgICB0ZXN0TmFtZVV0ZjhDb21tb24oVkNhcmRDb25maWcuVkNBUkRfVFlQRV9WMjFfSkFQQU5FU0UpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3ROYW1lVXRmOFYzMCgpIHsKLSAgICAgICAgdGVzdE5hbWVVdGY4Q29tbW9uKFZDYXJkQ29uZmlnLlZDQVJEX1RZUEVfVjMwX0pBUEFORVNFKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0TmFtZVNoaWZ0SmlzKCkgewotICAgICAgICBtVmVyaWZpZXIuaW5pdEZvckV4cG9ydFRlc3QoVkNhcmRDb25maWcuVkNBUkRfVFlQRV9WMzBfSkFQQU5FU0UsICJTaGlmdF9KSVMiKTsKLSAgICAgICAgQ29udGFjdEVudHJ5IGVudHJ5ID0gbVZlcmlmaWVyLmFkZElucHV0RW50cnkoKTsKLSAgICAgICAgZW50cnkuYWRkQ29udGVudFZhbHVlcyhTdHJ1Y3R1cmVkTmFtZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLkZBTUlMWV9OQU1FLCAiXHUzMDc1XHUzMDhCXHUzMDY5IikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLkdJVkVOX05BTUUsICJcdTMwOTFcdTMwOEFcdTMwNEIiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuTUlERExFX05BTUUsICJCIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLlBSRUZJWCwgIkRyLiIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5TVUZGSVgsICJQaC5EIik7Ci0KLSAgICAgICAgbVZlcmlmaWVyLmFkZFByb3BlcnR5Tm9kZXNWZXJpZmllckVsZW0oKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIkZOIiwgIkRyLiBcdTMwNzVcdTMwOEJcdTMwNjkgQiBcdTMwOTFcdTMwOEFcdTMwNEIgUGguRCIsCi0gICAgICAgICAgICAgICAgICAgICAgICBtQ29udGVudFZhbHVlc0ZvclNKaXMpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiTiIsICJcdTMwNzVcdTMwOEJcdTMwNjk7XHUzMDkxXHUzMDhBXHUzMDRCO0I7RHIuO1BoLkQiLAotICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlzLmFzTGlzdCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlx1MzA3NVx1MzA4Qlx1MzA2OSIsICJcdTMwOTFcdTMwOEFcdTMwNEIiLCAiQiIsICJEci4iLCAiUGguRCIpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsLCBtQ29udGVudFZhbHVlc0ZvclNKaXMsIG51bGwsIG51bGwpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIERvQ29NbyBwaG9uZXMgcmVxdWlyZSBhbGwgbmFtZSBlbGVtZW50cyBzaG91bGQgYmUgaW4gImZhbWlseSBuYW1lIiBmaWVsZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0TmFtZURvQ29NbygpIHsKLSAgICAgICAgbVZlcmlmaWVyLmluaXRGb3JFeHBvcnRUZXN0KFZDYXJkQ29uZmlnLlZDQVJEX1RZUEVfRE9DT01PLCAiU2hpZnRfSklTIik7Ci0gICAgICAgIENvbnRhY3RFbnRyeSBlbnRyeSA9IG1WZXJpZmllci5hZGRJbnB1dEVudHJ5KCk7Ci0gICAgICAgIGVudHJ5LmFkZENvbnRlbnRWYWx1ZXMoU3RydWN0dXJlZE5hbWUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5GQU1JTFlfTkFNRSwgIlx1MzA3NVx1MzA4Qlx1MzA2OSIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5HSVZFTl9OQU1FLCAiXHUzMDkxXHUzMDhBXHUzMDRCIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLk1JRERMRV9OQU1FLCAiQiIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5QUkVGSVgsICJEci4iKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuU1VGRklYLCAiUGguRCIpOwotCi0gICAgICAgIGZpbmFsIFN0cmluZyBmdWxsTmFtZSA9ICJEci4gXHUzMDc1XHUzMDhCXHUzMDY5IEIgXHUzMDkxXHUzMDhBXHUzMDRCIFBoLkQiOwotICAgICAgICBtVmVyaWZpZXIuYWRkUHJvcGVydHlOb2Rlc1ZlcmlmaWVyRWxlbSgpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiTiIsIGZ1bGxOYW1lICsgIjs7OzsiLAotICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlzLmFzTGlzdChmdWxsTmFtZSwgIiIsICIiLCAiIiwgIiIpLAotICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCwgbUNvbnRlbnRWYWx1ZXNGb3JTSmlzLCBudWxsLCBudWxsKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIkZOIiwgZnVsbE5hbWUsIG1Db250ZW50VmFsdWVzRm9yU0ppcykKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJTT1VORCIsICI7Ozs7IiwgbmV3IFR5cGVTZXQoIlgtSVJNQy1OIikpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiVEVMIiwgIiIsIG5ldyBUeXBlU2V0KCJIT01FIikpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiRU1BSUwiLCAiIiwgbmV3IFR5cGVTZXQoIkhPTUUiKSkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJBRFIiLCAiIiwgbmV3IFR5cGVTZXQoIkhPTUUiKSkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJYLUNMQVNTIiwgIlBVQkxJQyIpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiWC1SRURVQ1RJT04iLCAiIikKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJYLU5PIiwgIiIpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiWC1EQ00tSE1OLU1PREUiLCAiIik7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHRlc3RQaG9uZXRpY05hbWVDb21tb24oaW50IHZjYXJkVHlwZSwgU3RyaW5nIGNoYXJzZXQpIHsKLSAgICAgICAgbVZlcmlmaWVyLmluaXRGb3JFeHBvcnRUZXN0KHZjYXJkVHlwZSwgY2hhcnNldCk7Ci0gICAgICAgIENvbnRhY3RFbnRyeSBlbnRyeSA9IG1WZXJpZmllci5hZGRJbnB1dEVudHJ5KCk7Ci0gICAgICAgIGVudHJ5LmFkZENvbnRlbnRWYWx1ZXMoU3RydWN0dXJlZE5hbWUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5QSE9ORVRJQ19GQU1JTFlfTkFNRSwgIlx1MzA4NFx1MzA3RVx1MzA2MCIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5QSE9ORVRJQ19NSURETEVfTkFNRSwgIlx1MzBERlx1MzBDOVx1MzBFQlx1MzBDRFx1MzBGQ1x1MzBFMCIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5QSE9ORVRJQ19HSVZFTl9OQU1FLCAiXHUzMDVGXHUzMDhEXHUzMDQ2Iik7Ci0KLSAgICAgICAgZmluYWwgQ29udGVudFZhbHVlcyBjb250ZW50VmFsdWVzID0KLSAgICAgICAgICAgICgiU0hJRlRfSklTIi5lcXVhbHNJZ25vcmVDYXNlKGNoYXJzZXQpID8KLSAgICAgICAgICAgICAgICAgICAgKFZDYXJkQ29uZmlnLmlzVmVyc2lvbjIxKHZjYXJkVHlwZSkgPyBtQ29udGVudFZhbHVlc0ZvclFQQW5kU0ppcyA6Ci0gICAgICAgICAgICAgICAgICAgICAgICBtQ29udGVudFZhbHVlc0ZvclNKaXMpIDoKLSAgICAgICAgICAgICAgICAgICAgKFZDYXJkQ29uZmlnLmlzVmVyc2lvbjIxKHZjYXJkVHlwZSkgPyBtQ29udGVudFZhbHVlc0ZvclFQQW5kVXRmOCA6IG51bGwpKTsKLSAgICAgICAgUHJvcGVydHlOb2Rlc1ZlcmlmaWVyRWxlbSBlbGVtID0gbVZlcmlmaWVyLmFkZFByb3BlcnR5Tm9kZXNWZXJpZmllckVsZW1XaXRoRW1wdHlOYW1lKCk7Ci0gICAgICAgIGVsZW0uYWRkRXhwZWN0ZWROb2RlKCJYLVBIT05FVElDLUxBU1QtTkFNRSIsICJcdTMwODRcdTMwN0VcdTMwNjAiLAotICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudFZhbHVlcykKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJYLVBIT05FVElDLU1JRERMRS1OQU1FIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICJcdTMwREZcdTMwQzlcdTMwRUJcdTMwQ0RcdTMwRkNcdTMwRTAiLAotICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudFZhbHVlcykKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJYLVBIT05FVElDLUZJUlNULU5BTUUiLCAiXHUzMDVGXHUzMDhEXHUzMDQ2IiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnRWYWx1ZXMpOwotICAgICAgICBpZiAoIVZDYXJkQ29uZmlnLmlzVmVyc2lvbjIxKHZjYXJkVHlwZSkpIHsKLSAgICAgICAgICAgIGVsZW0uYWRkRXhwZWN0ZWROb2RlKCJTT1JULVNUUklORyIsCi0gICAgICAgICAgICAgICAgICAgICJcdTMwODRcdTMwN0VcdTMwNjAgXHUzMERGXHUzMEM5XHUzMEVCXHUzMENEXHUzMEZDXHUzMEUwIFx1MzA1Rlx1MzA4RFx1MzA0NiIsCi0gICAgICAgICAgICAgICAgICAgIGNvbnRlbnRWYWx1ZXMpOwotICAgICAgICB9Ci0gICAgICAgIENvbnRlbnRWYWx1ZXNCdWlsZGVyIGJ1aWxkZXIgPSBtVmVyaWZpZXIuYWRkQ29udGVudFZhbHVlc1ZlcmlmaWVyRWxlbSgpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkKFN0cnVjdHVyZWROYW1lLkNPTlRFTlRfSVRFTV9UWVBFKTsKLSAgICAgICAgYnVpbGRlci5wdXQoU3RydWN0dXJlZE5hbWUuUEhPTkVUSUNfRkFNSUxZX05BTUUsICJcdTMwODRcdTMwN0VcdTMwNjAiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuUEhPTkVUSUNfTUlERExFX05BTUUsICJcdTMwREZcdTMwQzlcdTMwRUJcdTMwQ0RcdTMwRkNcdTMwRTAiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuUEhPTkVUSUNfR0lWRU5fTkFNRSwgIlx1MzA1Rlx1MzA4RFx1MzA0NiIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5ESVNQTEFZX05BTUUsCi0gICAgICAgICAgICAgICAgICAgICAgICAiXHUzMDg0XHUzMDdFXHUzMDYwIFx1MzBERlx1MzBDOVx1MzBFQlx1MzBDRFx1MzBGQ1x1MzBFMCAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICJcdTMwNUZcdTMwOERcdTMwNDYiKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UGhvbmV0aWNOYW1lRm9ySmFwYW5lc2VWMjFVdGY4KCkgewotICAgICAgICB0ZXN0UGhvbmV0aWNOYW1lQ29tbW9uKFZDYXJkQ29uZmlnLlZDQVJEX1RZUEVfVjIxX0pBUEFORVNFLCBudWxsKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UGhvbmV0aWNOYW1lRm9ySmFwYW5lc2VWMjFTamlzKCkgewotICAgICAgICB0ZXN0UGhvbmV0aWNOYW1lQ29tbW9uKFZDYXJkQ29uZmlnLlZDQVJEX1RZUEVfVjIxX0pBUEFORVNFLCAiU2hpZnRfSklTIik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFBob25ldGljTmFtZUZvckphcGFuZXNlVjMwVXRmOCgpIHsKLSAgICAgICAgdGVzdFBob25ldGljTmFtZUNvbW1vbihWQ2FyZENvbmZpZy5WQ0FSRF9UWVBFX1YzMF9KQVBBTkVTRSwgbnVsbCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFBob25ldGljTmFtZUZvckphcGFuZXNlVjMwU0ppcygpIHsKLSAgICAgICAgdGVzdFBob25ldGljTmFtZUNvbW1vbihWQ2FyZENvbmZpZy5WQ0FSRF9UWVBFX1YzMF9KQVBBTkVTRSwgIlNoaWZ0X0pJUyIpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RQaG9uZXRpY05hbWVGb3JNb2JpbGVWMjFfMSgpIHsKLSAgICAgICAgbVZlcmlmaWVyLmluaXRGb3JFeHBvcnRUZXN0KFZDYXJkQ29uZmlnLlZDQVJEX1RZUEVfVjIxX0pBUEFORVNFX01PQklMRSwgIlNoaWZ0X0pJUyIpOwotICAgICAgICBDb250YWN0RW50cnkgZW50cnkgPSBtVmVyaWZpZXIuYWRkSW5wdXRFbnRyeSgpOwotICAgICAgICBlbnRyeS5hZGRDb250ZW50VmFsdWVzKFN0cnVjdHVyZWROYW1lLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuUEhPTkVUSUNfRkFNSUxZX05BTUUsICJcdTMwODRcdTMwN0VcdTMwNjAiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuUEhPTkVUSUNfTUlERExFX05BTUUsICJcdTMwREZcdTMwQzlcdTMwRUJcdTMwQ0RcdTMwRkNcdTMwRTAiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuUEhPTkVUSUNfR0lWRU5fTkFNRSwgIlx1MzA1Rlx1MzA4RFx1MzA0NiIpOwotCi0gICAgICAgIG1WZXJpZmllci5hZGRQcm9wZXJ0eU5vZGVzVmVyaWZpZXJFbGVtKCkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJTT1VORCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAiXHVGRjk0XHVGRjhGXHVGRjgwXHVGRjlFIFx1RkY5MFx1RkY4NFx1RkY5RVx1RkY5OVx1RkY4OFx1RkY3MFx1RkY5MSAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICJcdUZGODBcdUZGOUJcdUZGNzM7Ozs7IiwKLSAgICAgICAgICAgICAgICAgICAgICAgIG1Db250ZW50VmFsdWVzRm9yU0ppcywgbmV3IFR5cGVTZXQoIlgtSVJNQy1OIikpOwotICAgICAgICBDb250ZW50VmFsdWVzQnVpbGRlciBidWlsZGVyID0gbVZlcmlmaWVyLmFkZENvbnRlbnRWYWx1ZXNWZXJpZmllckVsZW0oKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZChTdHJ1Y3R1cmVkTmFtZS5DT05URU5UX0lURU1fVFlQRSk7Ci0gICAgICAgIGJ1aWxkZXIucHV0KFN0cnVjdHVyZWROYW1lLlBIT05FVElDX0ZBTUlMWV9OQU1FLCAiXHVGRjk0XHVGRjhGXHVGRjgwXHVGRjlFIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLlBIT05FVElDX01JRERMRV9OQU1FLAotICAgICAgICAgICAgICAgICAgICAgICAgIlx1RkY5MFx1RkY4NFx1RkY5RVx1RkY5OVx1RkY4OFx1RkY3MFx1RkY5MSIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5QSE9ORVRJQ19HSVZFTl9OQU1FLCAiXHVGRjgwXHVGRjlCXHVGRjczIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLkRJU1BMQVlfTkFNRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICJcdUZGOTRcdUZGOEZcdUZGODBcdUZGOUUgXHVGRjkwXHVGRjg0XHVGRjlFXHVGRjk5XHVGRjg4XHVGRjcwXHVGRjkxICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgIlx1RkY4MFx1RkY5Qlx1RkY3MyIpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RQaG9uZXRpY05hbWVGb3JNb2JpbGVWMjFfMigpIHsKLSAgICAgICAgbVZlcmlmaWVyLmluaXRGb3JFeHBvcnRUZXN0KFZDYXJkQ29uZmlnLlZDQVJEX1RZUEVfVjIxX0pBUEFORVNFX01PQklMRSwgIlNoaWZ0X0pJUyIpOwotICAgICAgICBDb250YWN0RW50cnkgZW50cnkgPSBtVmVyaWZpZXIuYWRkSW5wdXRFbnRyeSgpOwotICAgICAgICBlbnRyeS5hZGRDb250ZW50VmFsdWVzKFN0cnVjdHVyZWROYW1lLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuUEhPTkVUSUNfRkFNSUxZX05BTUUsICJcdTMwODRcdTMwN0VcdTMwNjAiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuUEhPTkVUSUNfR0lWRU5fTkFNRSwgIlx1MzA1Rlx1MzA4RFx1MzA0NiIpOwotCi0gICAgICAgIG1WZXJpZmllci5hZGRQcm9wZXJ0eU5vZGVzVmVyaWZpZXJFbGVtKCkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJTT1VORCIsICJcdUZGOTRcdUZGOEZcdUZGODBcdUZGOUUgXHVGRjgwXHVGRjlCXHVGRjczOzs7OyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Db250ZW50VmFsdWVzRm9yU0ppcywgbmV3IFR5cGVTZXQoIlgtSVJNQy1OIikpOwotICAgICAgICBDb250ZW50VmFsdWVzQnVpbGRlciBidWlsZGVyID0gbVZlcmlmaWVyLmFkZENvbnRlbnRWYWx1ZXNWZXJpZmllckVsZW0oKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZChTdHJ1Y3R1cmVkTmFtZS5DT05URU5UX0lURU1fVFlQRSk7Ci0gICAgICAgIGJ1aWxkZXIucHV0KFN0cnVjdHVyZWROYW1lLlBIT05FVElDX0ZBTUlMWV9OQU1FLCAiXHVGRjk0XHVGRjhGXHVGRjgwXHVGRjlFIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLlBIT05FVElDX0dJVkVOX05BTUUsICJcdUZGODBcdUZGOUJcdUZGNzMiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuRElTUExBWV9OQU1FLCAiXHVGRjk0XHVGRjhGXHVGRjgwXHVGRjlFIFx1RkY4MFx1RkY5Qlx1RkY3MyIpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCB0ZXN0UG9zdGFsQWRkcmVzc1dpdGhKYXBhbmVzZUNvbW1vbihpbnQgdmNhcmRUeXBlLCBTdHJpbmcgY2hhcnNldCkgewotICAgICAgICBtVmVyaWZpZXIuaW5pdEZvckV4cG9ydFRlc3QodmNhcmRUeXBlLCBjaGFyc2V0KTsKLSAgICAgICAgQ29udGFjdEVudHJ5IGVudHJ5ID0gbVZlcmlmaWVyLmFkZElucHV0RW50cnkoKTsKLSAgICAgICAgZW50cnkuYWRkQ29udGVudFZhbHVlcyhTdHJ1Y3R1cmVkUG9zdGFsLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZFBvc3RhbC5QT0JPWCwgIlx1NzlDMVx1NjZGOFx1N0JCMTA3IikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWRQb3N0YWwuU1RSRUVULCAiXHU5NkRCXHU4OThCXHU2Q0EyXHU2NzUxIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWRQb3N0YWwuQ0lUWSwgIlx1OUU3Rlx1OUFBOFx1NUUwMiIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkUG9zdGFsLlJFR0lPTiwgIlx1MDBEN1x1MDBEN1x1NzcwQyIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkUG9zdGFsLlBPU1RDT0RFLCAiNDk0LTEzMTMiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZFBvc3RhbC5DT1VOVFJZLCAiXHU2NUU1XHU2NzJDIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWRQb3N0YWwuRk9STUFUVEVEX0FERFJFU1MsCi0gICAgICAgICAgICAgICAgICAgICAgICAiXHUzMDUzXHUzMDkzXHUzMDZBXHUzMDY4XHUzMDUzXHUzMDhEXHUzMDkyXHU4OThCIgotICAgICAgICAgICAgICAgICAgICAgICAgKyAiXHUzMDhCXHUzMDZBXHUzMDkzXHUzMDY2XHU2Njg3XHU0RUJBXHUzMDY3XHUzMDU5XHUzMDRCXHVGRjFGIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWRQb3N0YWwuVFlQRSwgU3RydWN0dXJlZFBvc3RhbC5UWVBFX0NVU1RPTSkKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWRQb3N0YWwuTEFCRUwsICJcdTMwNEFcdTMwODJcdTMwNjFcdTMwNEJcdTMwNDhcdTMwOEEiKTsKLQotICAgICAgICBDb250ZW50VmFsdWVzIGNvbnRlbnRWYWx1ZXMgPSAoIlVURi04Ii5lcXVhbHNJZ25vcmVDYXNlKGNoYXJzZXQpID8KLSAgICAgICAgICAgICAgICAoVkNhcmRDb25maWcuaXNWZXJzaW9uMjEodmNhcmRUeXBlKSA/IG1Db250ZW50VmFsdWVzRm9yUVBBbmRTSmlzIDoKLSAgICAgICAgICAgICAgICAgICAgbUNvbnRlbnRWYWx1ZXNGb3JTSmlzKSA6Ci0gICAgICAgICAgICAgICAgKFZDYXJkQ29uZmlnLmlzVmVyc2lvbjIxKHZjYXJkVHlwZSkgPyBtQ29udGVudFZhbHVlc0ZvclFQQW5kVXRmOCA6Ci0gICAgICAgICAgICAgICAgICAgIG1Db250ZW50VmFsdWVzRm9yVXRmOCkpOwotCi0gICAgICAgIFByb3BlcnR5Tm9kZXNWZXJpZmllckVsZW0gZWxlbSA9IG1WZXJpZmllci5hZGRQcm9wZXJ0eU5vZGVzVmVyaWZpZXJFbGVtV2l0aEVtcHR5TmFtZSgpOwotICAgICAgICAvLyBMQUJFTCBtdXN0IGJlIGlnbm9yZWQgaW4gdkNhcmQgMi4xLiBBcyBmb3IgdkNhcmQgMy4wLCB0aGUgY3VycmVudCBiZWhhdmlvciBpcwotICAgICAgICAvLyBzYW1lIGFzIHRoYXQgaW4gdkNhcmQgMy4wLCB3aGljaCBjYW4gYmUgY2hhbmdlZCBpbiB0aGUgZnV0dXJlLgotICAgICAgICBlbGVtLmFkZEV4cGVjdGVkTm9kZSgiQURSIiwgQXJyYXlzLmFzTGlzdCgiXHU3OUMxXHU2NkY4XHU3QkIxMDciLAotICAgICAgICAgICAgICAgICIiLCAiXHU5NkRCXHU4OThCXHU2Q0EyXHU2NzUxIiwgIlx1OUU3Rlx1OUFBOFx1NUUwMiIsICJcdTAwRDdcdTAwRDdcdTc3MEMiLAotICAgICAgICAgICAgICAgICI0OTQtMTMxMyIsICJcdTY1RTVcdTY3MkMiKSwKLSAgICAgICAgICAgICAgICBjb250ZW50VmFsdWVzKTsKLSAgICAgICAgbVZlcmlmaWVyLmFkZENvbnRlbnRWYWx1ZXNWZXJpZmllckVsZW0oKS5hZGRFeHBlY3RlZChTdHJ1Y3R1cmVkUG9zdGFsLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZFBvc3RhbC5QT0JPWCwgIlx1NzlDMVx1NjZGOFx1N0JCMTA3IikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWRQb3N0YWwuU1RSRUVULCAiXHU5NkRCXHU4OThCXHU2Q0EyXHU2NzUxIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWRQb3N0YWwuQ0lUWSwgIlx1OUU3Rlx1OUFBOFx1NUUwMiIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkUG9zdGFsLlJFR0lPTiwgIlx1MDBEN1x1MDBEN1x1NzcwQyIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkUG9zdGFsLlBPU1RDT0RFLCAiNDk0LTEzMTMiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZFBvc3RhbC5DT1VOVFJZLCAiXHU2NUU1XHU2NzJDIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWRQb3N0YWwuRk9STUFUVEVEX0FERFJFU1MsCi0gICAgICAgICAgICAgICAgICAgICAgICAiXHU2NUU1XHU2NzJDIDQ5NC0xMzEzIFx1MDBEN1x1MDBEN1x1NzcwQyBcdTlFN0ZcdTlBQThcdTVFMDIgIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAiXHU5NkRCXHU4OThCXHU2Q0EyXHU2NzUxICIgKyAiXHU3OUMxXHU2NkY4XHU3QkIxMDciKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZFBvc3RhbC5UWVBFLCBTdHJ1Y3R1cmVkUG9zdGFsLlRZUEVfSE9NRSk7Ci0gICAgfQotICAgIHB1YmxpYyB2b2lkIHRlc3RQb3N0YWxBZGRyZXNzd2l0aEphcGFuZXNlVjIxKCkgewotICAgICAgICB0ZXN0UG9zdGFsQWRkcmVzc1dpdGhKYXBhbmVzZUNvbW1vbihWQ2FyZENvbmZpZy5WQ0FSRF9UWVBFX1YyMV9KQVBBTkVTRSwgIlNoaWZ0X0pJUyIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFZlcmlmaWVzIHRoYXQgb25seSBvbmUgYWRkcmVzcyBmaWVsZCBpcyBlbWl0dGVkIHRvd2FyZCBEb0NvTW8gcGhvbmVzLgotICAgICAqIFByZWZlcmVkIHR5cGUgbXVzdCAoc2hvdWxkPykgYmU6IEhPTUUgPiBXT1JLID4gT1RIRVIgPiBDVVNUT00KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UG9zdGFsQWRycmVzc0ZvckRvQ29Nb18xKCkgewotICAgICAgICBtVmVyaWZpZXIuaW5pdEZvckV4cG9ydFRlc3QoVkNhcmRDb25maWcuVkNBUkRfVFlQRV9ET0NPTU8sICJTaGlmdF9KSVMiKTsKLSAgICAgICAgQ29udGFjdEVudHJ5IGVudHJ5ID0gbVZlcmlmaWVyLmFkZElucHV0RW50cnkoKTsKLSAgICAgICAgZW50cnkuYWRkQ29udGVudFZhbHVlcyhTdHJ1Y3R1cmVkUG9zdGFsLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZFBvc3RhbC5UWVBFLCBTdHJ1Y3R1cmVkUG9zdGFsLlRZUEVfV09SSykKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWRQb3N0YWwuUE9CT1gsICIxIik7Ci0gICAgICAgIGVudHJ5LmFkZENvbnRlbnRWYWx1ZXMoU3RydWN0dXJlZFBvc3RhbC5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWRQb3N0YWwuVFlQRSwgU3RydWN0dXJlZFBvc3RhbC5UWVBFX09USEVSKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZFBvc3RhbC5QT0JPWCwgIjIiKTsKLSAgICAgICAgZW50cnkuYWRkQ29udGVudFZhbHVlcyhTdHJ1Y3R1cmVkUG9zdGFsLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZFBvc3RhbC5UWVBFLCBTdHJ1Y3R1cmVkUG9zdGFsLlRZUEVfSE9NRSkKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWRQb3N0YWwuUE9CT1gsICIzIik7Ci0gICAgICAgIGVudHJ5LmFkZENvbnRlbnRWYWx1ZXMoU3RydWN0dXJlZFBvc3RhbC5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWRQb3N0YWwuVFlQRSwgU3RydWN0dXJlZFBvc3RhbC5UWVBFX0NVU1RPTSkKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWRQb3N0YWwuTEFCRUwsICJjdXN0b20iKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZFBvc3RhbC5QT0JPWCwgIjQiKTsKLQotICAgICAgICBtVmVyaWZpZXIuYWRkUHJvcGVydHlOb2Rlc1ZlcmlmaWVyRWxlbVdpdGhFbXB0eU5hbWUoKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIlRFTCIsICIiLCBuZXcgVHlwZVNldCgiSE9NRSIpKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIkVNQUlMIiwgIiIsIG5ldyBUeXBlU2V0KCJIT01FIikpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiWC1DTEFTUyIsICJQVUJMSUMiKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIlgtUkVEVUNUSU9OIiwgIiIpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiWC1OTyIsICIiKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIlgtRENNLUhNTi1NT0RFIiwgIiIpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiQURSIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5cy5hc0xpc3QoIjMiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiKSwgbmV3IFR5cGVTZXQoIkhPTUUiKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFBvc3RhbEFkcnJlc3NGb3JEb0NvTW9fMigpIHsKLSAgICAgICAgbVZlcmlmaWVyLmluaXRGb3JFeHBvcnRUZXN0KFZDYXJkQ29uZmlnLlZDQVJEX1RZUEVfRE9DT01PLCAiU2hpZnRfSklTIik7Ci0gICAgICAgIENvbnRhY3RFbnRyeSBlbnRyeSA9IG1WZXJpZmllci5hZGRJbnB1dEVudHJ5KCk7Ci0gICAgICAgIGVudHJ5LmFkZENvbnRlbnRWYWx1ZXMoU3RydWN0dXJlZFBvc3RhbC5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWRQb3N0YWwuVFlQRSwgU3RydWN0dXJlZFBvc3RhbC5UWVBFX09USEVSKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZFBvc3RhbC5QT0JPWCwgIjEiKTsKLSAgICAgICAgZW50cnkuYWRkQ29udGVudFZhbHVlcyhTdHJ1Y3R1cmVkUG9zdGFsLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZFBvc3RhbC5UWVBFLCBTdHJ1Y3R1cmVkUG9zdGFsLlRZUEVfV09SSykKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWRQb3N0YWwuUE9CT1gsICIyIik7Ci0gICAgICAgIGVudHJ5LmFkZENvbnRlbnRWYWx1ZXMoU3RydWN0dXJlZFBvc3RhbC5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWRQb3N0YWwuVFlQRSwgU3RydWN0dXJlZFBvc3RhbC5UWVBFX0NVU1RPTSkKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWRQb3N0YWwuTEFCRUwsICJjdXN0b20iKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZFBvc3RhbC5QT0JPWCwgIjMiKTsKLQotICAgICAgICBtVmVyaWZpZXIuYWRkUHJvcGVydHlOb2Rlc1ZlcmlmaWVyRWxlbVdpdGhFbXB0eU5hbWUoKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIlRFTCIsICIiLCBuZXcgVHlwZVNldCgiSE9NRSIpKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIkVNQUlMIiwgIiIsIG5ldyBUeXBlU2V0KCJIT01FIikpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiWC1DTEFTUyIsICJQVUJMSUMiKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIlgtUkVEVUNUSU9OIiwgIiIpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiWC1OTyIsICIiKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIlgtRENNLUhNTi1NT0RFIiwgIiIpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiQURSIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5cy5hc0xpc3QoIjIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiKSwgbmV3IFR5cGVTZXQoIldPUksiKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFBvc3RhbEFkcnJlc3NGb3JEb0NvTW9fMygpIHsKLSAgICAgICAgbVZlcmlmaWVyLmluaXRGb3JFeHBvcnRUZXN0KFZDYXJkQ29uZmlnLlZDQVJEX1RZUEVfRE9DT01PLCAiU2hpZnRfSklTIik7Ci0gICAgICAgIENvbnRhY3RFbnRyeSBlbnRyeSA9IG1WZXJpZmllci5hZGRJbnB1dEVudHJ5KCk7Ci0gICAgICAgIGVudHJ5LmFkZENvbnRlbnRWYWx1ZXMoU3RydWN0dXJlZFBvc3RhbC5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWRQb3N0YWwuVFlQRSwgU3RydWN0dXJlZFBvc3RhbC5UWVBFX0NVU1RPTSkKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWRQb3N0YWwuTEFCRUwsICJjdXN0b20xIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWRQb3N0YWwuUE9CT1gsICIxIik7Ci0gICAgICAgIGVudHJ5LmFkZENvbnRlbnRWYWx1ZXMoU3RydWN0dXJlZFBvc3RhbC5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWRQb3N0YWwuVFlQRSwgU3RydWN0dXJlZFBvc3RhbC5UWVBFX09USEVSKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZFBvc3RhbC5QT0JPWCwgIjIiKTsKLSAgICAgICAgZW50cnkuYWRkQ29udGVudFZhbHVlcyhTdHJ1Y3R1cmVkUG9zdGFsLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZFBvc3RhbC5UWVBFLCBTdHJ1Y3R1cmVkUG9zdGFsLlRZUEVfQ1VTVE9NKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZFBvc3RhbC5MQUJFTCwgImN1c3RvbTIiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZFBvc3RhbC5QT0JPWCwgIjMiKTsKLQotICAgICAgICBtVmVyaWZpZXIuYWRkUHJvcGVydHlOb2Rlc1ZlcmlmaWVyRWxlbVdpdGhFbXB0eU5hbWUoKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIlRFTCIsICIiLCBuZXcgVHlwZVNldCgiSE9NRSIpKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIkVNQUlMIiwgIiIsIG5ldyBUeXBlU2V0KCJIT01FIikpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiWC1DTEFTUyIsICJQVUJMSUMiKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIlgtUkVEVUNUSU9OIiwgIiIpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiWC1OTyIsICIiKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIlgtRENNLUhNTi1NT0RFIiwgIiIpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiQURSIiwgQXJyYXlzLmFzTGlzdCgiMiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBWZXJpZmllcyB0aGUgdkNhcmQgZXhwb3J0ZXIgdG9sZXJhdGVzIG51bGwgVFlQRS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UG9zdGFsQWRycmVzc0ZvckRvQ29Nb180KCkgewotICAgICAgICBtVmVyaWZpZXIuaW5pdEZvckV4cG9ydFRlc3QoVkNhcmRDb25maWcuVkNBUkRfVFlQRV9ET0NPTU8sICJTaGlmdF9KSVMiKTsKLSAgICAgICAgQ29udGFjdEVudHJ5IGVudHJ5ID0gbVZlcmlmaWVyLmFkZElucHV0RW50cnkoKTsKLSAgICAgICAgZW50cnkuYWRkQ29udGVudFZhbHVlcyhTdHJ1Y3R1cmVkUG9zdGFsLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZFBvc3RhbC5QT0JPWCwgIjEiKTsKLSAgICAgICAgZW50cnkuYWRkQ29udGVudFZhbHVlcyhTdHJ1Y3R1cmVkUG9zdGFsLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZFBvc3RhbC5UWVBFLCBTdHJ1Y3R1cmVkUG9zdGFsLlRZUEVfT1RIRVIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkUG9zdGFsLlBPQk9YLCAiMiIpOwotICAgICAgICBlbnRyeS5hZGRDb250ZW50VmFsdWVzKFN0cnVjdHVyZWRQb3N0YWwuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkUG9zdGFsLlRZUEUsIFN0cnVjdHVyZWRQb3N0YWwuVFlQRV9IT01FKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZFBvc3RhbC5QT0JPWCwgIjMiKTsKLSAgICAgICAgZW50cnkuYWRkQ29udGVudFZhbHVlcyhTdHJ1Y3R1cmVkUG9zdGFsLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZFBvc3RhbC5UWVBFLCBTdHJ1Y3R1cmVkUG9zdGFsLlRZUEVfV09SSykKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWRQb3N0YWwuUE9CT1gsICI0Iik7Ci0gICAgICAgIGVudHJ5LmFkZENvbnRlbnRWYWx1ZXMoU3RydWN0dXJlZFBvc3RhbC5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWRQb3N0YWwuUE9CT1gsICI1Iik7Ci0KLSAgICAgICAgbVZlcmlmaWVyLmFkZFByb3BlcnR5Tm9kZXNWZXJpZmllckVsZW1XaXRoRW1wdHlOYW1lKCkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJURUwiLCAiIiwgbmV3IFR5cGVTZXQoIkhPTUUiKSkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJFTUFJTCIsICIiLCBuZXcgVHlwZVNldCgiSE9NRSIpKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIlgtQ0xBU1MiLCAiUFVCTElDIikKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJYLVJFRFVDVElPTiIsICIiKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIlgtTk8iLCAiIikKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJYLURDTS1ITU4tTU9ERSIsICIiKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIkFEUiIsCi0gICAgICAgICAgICAgICAgICAgICAgICBBcnJheXMuYXNMaXN0KCIzIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiksIG5ldyBUeXBlU2V0KCJIT01FIikpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCB0ZXN0SmFwYW5lc2VQaG9uZU51bWJlckNvbW1vbihpbnQgdmNhcmRUeXBlKSB7Ci0gICAgICAgIG1WZXJpZmllci5pbml0Rm9yRXhwb3J0VGVzdCh2Y2FyZFR5cGUpOwotICAgICAgICBDb250YWN0RW50cnkgZW50cnkgPSBtVmVyaWZpZXIuYWRkSW5wdXRFbnRyeSgpOwotICAgICAgICBlbnRyeS5hZGRDb250ZW50VmFsdWVzKFBob25lLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuTlVNQkVSLCAiMDMxMjM0MTIzNCIpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5UWVBFLCBQaG9uZS5UWVBFX0hPTUUpOwotICAgICAgICBlbnRyeS5hZGRDb250ZW50VmFsdWVzKFBob25lLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuTlVNQkVSLCAiMDkwMTIzNDEyMzQiKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuVFlQRSwgUGhvbmUuVFlQRV9NT0JJTEUpOwotICAgICAgICBtVmVyaWZpZXIuYWRkUHJvcGVydHlOb2Rlc1ZlcmlmaWVyRWxlbVdpdGhFbXB0eU5hbWUoKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIlRFTCIsICIwMy0xMjM0LTEyMzQiLCBuZXcgVHlwZVNldCgiSE9NRSIpKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIlRFTCIsICIwOTAtMTIzNC0xMjM0IiwgbmV3IFR5cGVTZXQoIkNFTEwiKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEphcGFuZXNlUGhvbmVOdW1iZXJWMjFfMSgpIHsKLSAgICAgICAgdGVzdEphcGFuZXNlUGhvbmVOdW1iZXJDb21tb24oVkNhcmRDb25maWcuVkNBUkRfVFlQRV9WMjFfSkFQQU5FU0UpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RKYXBhbmVzZVBob25lTnVtYmVyVjMwKCkgewotICAgICAgICB0ZXN0SmFwYW5lc2VQaG9uZU51bWJlckNvbW1vbihWQ2FyZENvbmZpZy5WQ0FSRF9UWVBFX1YzMF9KQVBBTkVTRSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEphcGFuZXNlUGhvbmVOdW1iZXJEb0NvTW8oKSB7Ci0gICAgICAgIG1WZXJpZmllci5pbml0Rm9yRXhwb3J0VGVzdChWQ2FyZENvbmZpZy5WQ0FSRF9UWVBFX0RPQ09NTywgIlNoaWZ0X0pJUyIpOwotICAgICAgICBDb250YWN0RW50cnkgZW50cnkgPSBtVmVyaWZpZXIuYWRkSW5wdXRFbnRyeSgpOwotICAgICAgICBlbnRyeS5hZGRDb250ZW50VmFsdWVzKFBob25lLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuTlVNQkVSLCAiMDMxMjM0MTIzNCIpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5UWVBFLCBQaG9uZS5UWVBFX0hPTUUpOwotICAgICAgICBlbnRyeS5hZGRDb250ZW50VmFsdWVzKFBob25lLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuTlVNQkVSLCAiMDkwMTIzNDEyMzQiKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuVFlQRSwgUGhvbmUuVFlQRV9NT0JJTEUpOwotICAgICAgICBtVmVyaWZpZXIuYWRkUHJvcGVydHlOb2Rlc1ZlcmlmaWVyRWxlbVdpdGhFbXB0eU5hbWUoKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIkVNQUlMIiwgIiIsIG5ldyBUeXBlU2V0KCJIT01FIikpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiWC1DTEFTUyIsICJQVUJMSUMiKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIlgtUkVEVUNUSU9OIiwgIiIpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiWC1OTyIsICIiKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIlgtRENNLUhNTi1NT0RFIiwgIiIpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiQURSIiwgIiIsIG5ldyBUeXBlU2V0KCJIT01FIikpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiVEVMIiwgIjAzLTEyMzQtMTIzNCIsIG5ldyBUeXBlU2V0KCJIT01FIikpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiVEVMIiwgIjA5MC0xMjM0LTEyMzQiLCBuZXcgVHlwZVNldCgiQ0VMTCIpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0Tm90ZURvQ29NbygpIHsKLSAgICAgICAgbVZlcmlmaWVyLmluaXRGb3JFeHBvcnRUZXN0KFZDYXJkQ29uZmlnLlZDQVJEX1RZUEVfRE9DT01PLCAiU2hpZnRfSklTIik7Ci0gICAgICAgIENvbnRhY3RFbnRyeSBlbnRyeSA9IG1WZXJpZmllci5hZGRJbnB1dEVudHJ5KCk7Ci0gICAgICAgIGVudHJ5LmFkZENvbnRlbnRWYWx1ZXMoTm90ZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KE5vdGUuTk9URSwgIm5vdGUxIik7Ci0gICAgICAgIGVudHJ5LmFkZENvbnRlbnRWYWx1ZXMoTm90ZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KE5vdGUuTk9URSwgIm5vdGUyIik7Ci0gICAgICAgIGVudHJ5LmFkZENvbnRlbnRWYWx1ZXMoTm90ZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KE5vdGUuTk9URSwgIm5vdGUzIik7Ci0KLSAgICAgICAgLy8gTW9yZSB0aGFuIG9uZSBub3RlIGZpZWxkcyBtdXN0IGJlIGFnZ3JlZ2F0ZWQgaW50byBvbmUgbm90ZS4KLSAgICAgICAgbVZlcmlmaWVyLmFkZFByb3BlcnR5Tm9kZXNWZXJpZmllckVsZW1XaXRoRW1wdHlOYW1lKCkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJURUwiLCAiIiwgbmV3IFR5cGVTZXQoIkhPTUUiKSkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJFTUFJTCIsICIiLCBuZXcgVHlwZVNldCgiSE9NRSIpKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIlgtQ0xBU1MiLCAiUFVCTElDIikKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJYLVJFRFVDVElPTiIsICIiKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIlgtTk8iLCAiIikKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJYLURDTS1ITU4tTU9ERSIsICIiKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIkFEUiIsICIiLCBuZXcgVHlwZVNldCgiSE9NRSIpKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIk5PVEUiLCAibm90ZTFcbm5vdGUyXG5ub3RlMyIsIG1Db250ZW50VmFsdWVzRm9yUVApOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RBbmRyb2lkQ3VzdG9tVjIxKCkgewotICAgICAgICBtVmVyaWZpZXIuaW5pdEZvckV4cG9ydFRlc3QoVkNhcmRDb25maWcuVkNBUkRfVFlQRV9WMjFfR0VORVJJQyk7Ci0gICAgICAgIG1WZXJpZmllci5hZGRJbnB1dEVudHJ5KCkuYWRkQ29udGVudFZhbHVlcyhOaWNrbmFtZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KE5pY2tuYW1lLk5BTUUsICJcdTMwNERcdTMwODNcdTMwRkNcdTMwQThcdTMwQzNcdTMwQzFcdTMwRkMiKTsKLSAgICAgICAgbVZlcmlmaWVyLmFkZFByb3BlcnR5Tm9kZXNWZXJpZmllckVsZW1XaXRoRW1wdHlOYW1lKCkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJYLUFORFJPSUQtQ1VTVE9NIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5cy5hc0xpc3QoTmlja25hbWUuQ09OVEVOVF9JVEVNX1RZUEUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcdTMwNERcdTMwODNcdTMwRkNcdTMwQThcdTMwQzNcdTMwQzFcdTMwRkMiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIpLAotICAgICAgICAgICAgICAgICAgICAgICAgbUNvbnRlbnRWYWx1ZXNGb3JRUEFuZFV0ZjgpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL3BpbS92Y2FyZC9WQ2FyZFRlc3RSdW5uZXIuamF2YSBiL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL3BpbS92Y2FyZC9WQ2FyZFRlc3RSdW5uZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTNhNDM5My4uMDAwMDAwMAotLS0gYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9waW0vdmNhcmQvVkNhcmRUZXN0UnVubmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2UgYW5kcm9pZC5waW0udmNhcmQ7Ci0KLWltcG9ydCBhbmRyb2lkLnRlc3QuSW5zdHJ1bWVudGF0aW9uVGVzdFJ1bm5lcjsKLWltcG9ydCBhbmRyb2lkLnRlc3QuSW5zdHJ1bWVudGF0aW9uVGVzdFN1aXRlOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLQotLyoqCi0gKiBVc2FnZTogYWRiIHNoZWxsIGFtIGluc3RydW1lbnQgLXcgY29tLmFuZHJvaWQudmNhcmQudGVzdHMvLlZDYXJkVGVzdFJ1bm5lclRlc3RSdW5uZXIKLSAqLwotcHVibGljIGNsYXNzIFZDYXJkVGVzdFJ1bm5lciBleHRlbmRzIEluc3RydW1lbnRhdGlvblRlc3RSdW5uZXIgewotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBUZXN0U3VpdGUgZ2V0QWxsVGVzdHMoKSB7Ci0gICAgICAgIFRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBJbnN0cnVtZW50YXRpb25UZXN0U3VpdGUodGhpcyk7Ci0gICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShWQ2FyZFV0aWxzVGVzdHMuY2xhc3MpOwotICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUoVkNhcmRUZXN0VXRpbHNUZXN0cy5jbGFzcyk7Ci0gICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShWQ2FyZEltcG9ydGVyVGVzdHMuY2xhc3MpOwotICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUoVkNhcmRFeHBvcnRlclRlc3RzLmNsYXNzKTsKLSAgICAgICAgc3VpdGUuYWRkVGVzdFN1aXRlKFZDYXJkSmFwYW5pemF0aW9uVGVzdHMuY2xhc3MpOwotICAgICAgICByZXR1cm4gc3VpdGU7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIENsYXNzTG9hZGVyIGdldExvYWRlcigpIHsKLSAgICAgICAgcmV0dXJuIFZDYXJkVGVzdFJ1bm5lci5jbGFzcy5nZXRDbGFzc0xvYWRlcigpOwotICAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9waW0vdmNhcmQvVkNhcmRUZXN0VXRpbHNUZXN0cy5qYXZhIGIvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvcGltL3ZjYXJkL1ZDYXJkVGVzdFV0aWxzVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2ZmNWNmNy4uMDAwMDAwMAotLS0gYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9waW0vdmNhcmQvVkNhcmRUZXN0VXRpbHNUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIGFuZHJvaWQucGltLnZjYXJkOwotCi1pbXBvcnQgY29tLmFuZHJvaWQuZnJhbWV3b3Jrcy5jb3JldGVzdHMuUjsKLQotaW1wb3J0IGFuZHJvaWQucGltLnZjYXJkLnRlc3RfdXRpbHMuVkNhcmRWZXJpZmllcjsKLWltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuQ29tbW9uRGF0YUtpbmRzLlN0cnVjdHVyZWROYW1lOwotaW1wb3J0IGFuZHJvaWQudGVzdC5BbmRyb2lkVGVzdENhc2U7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuQXNzZXJ0aW9uRmFpbGVkRXJyb3I7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLQotLyoqCi0gKiBUZXN0cyBjb25maXJtaW5nIHV0aWxpdGllcyBmb3IgdkNhcmQgdGVzdHMgd29yayBmaW5lLgotICoKLSAqIE5vdyB0aGF0IHRoZSBmb3VuZGF0aW9uIGNsYXNzZXMgZm9yIHZDYXJkIHRlc3QgY2FzZXMgYmVjYW1lIHRvbyBjb21wbGljYXRlZCB0bwotICogcmVseSBvbiB3aXRob3V0IHRlc3RpbmcgaXRzZWxmLgotICovCi1wdWJsaWMgY2xhc3MgVkNhcmRUZXN0VXRpbHNUZXN0cyBleHRlbmRzIEFuZHJvaWRUZXN0Q2FzZSB7Ci0gICAgcHVibGljIHZvaWQgdGVzdFNob3VsZEZhaWxBdFByb3BlcnR5Tm9kZVZlcmlmaWNhdGlvbigpIHsKLSAgICAgICAgYm9vbGVhbiBmYWlsdXJlRGV0ZWN0ZWQgPSBmYWxzZTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGZpbmFsIFZDYXJkVmVyaWZpZXIgdmVyaWZpZXIgPSBuZXcgVkNhcmRWZXJpZmllcih0aGlzKTsKLSAgICAgICAgICAgIHZlcmlmaWVyLmluaXRGb3JJbXBvcnRUZXN0KFZDYXJkQ29uZmlnLlZDQVJEX1RZUEVfVjIxX0dFTkVSSUMsIFIucmF3LnYyMV9iYWNrc2xhc2gpOwotICAgICAgICAgICAgdmVyaWZpZXIuYWRkUHJvcGVydHlOb2Rlc1ZlcmlmaWVyRWxlbSgpCi0gICAgICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGVXaXRoT3JkZXIoIk4iLCAiO0E7QlxcO0NcXDs7RDs6RTtcXFxcOy0tIiwgIC8vIHdyb25nCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlzLmFzTGlzdCgiIiwgIkE7QlxcIiwgIkNcXDsiLCAiRCIsICI6RSIsICJcXFxcIiwgIiIpKQotICAgICAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJGTiIsICJBO0JcXENcXDtEOkVcXFxcIik7Ci0gICAgICAgICAgICB2ZXJpZmllci52ZXJpZnkoKTsKLSAgICAgICAgfSBjYXRjaCAoQXNzZXJ0aW9uRmFpbGVkRXJyb3IgZSkgewotICAgICAgICAgICAgZmFpbHVyZURldGVjdGVkID0gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICBpZiAoIWZhaWx1cmVEZXRlY3RlZCkgewotICAgICAgICAgICAgVGVzdENhc2UuZmFpbCgiVGVzdCBjYXNlIHRoYXQgc2hvdWxkIGZhaWwgYWN0dWFsbHkgc3VjY2VlZGVkLiIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFNob3VsZEZhaWxBdENvbnRlbnRWYWx1ZVZlcmlmaWNhdGlvbigpIHsKLSAgICAgICAgYm9vbGVhbiBmYWlsdXJlRGV0ZWN0ZWQgPSBmYWxzZTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGZpbmFsIFZDYXJkVmVyaWZpZXIgdmVyaWZpZXIgPSBuZXcgVkNhcmRWZXJpZmllcih0aGlzKTsKLSAgICAgICAgICAgIHZlcmlmaWVyLmluaXRGb3JJbXBvcnRUZXN0KFZDYXJkQ29uZmlnLlZDQVJEX1RZUEVfVjIxX0dFTkVSSUMsIFIucmF3LnYyMV9iYWNrc2xhc2gpOwotICAgICAgICAgICAgdmVyaWZpZXIuYWRkQ29udGVudFZhbHVlc1ZlcmlmaWVyRWxlbSgpCi0gICAgICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZChTdHJ1Y3R1cmVkTmFtZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLkdJVkVOX05BTUUsICJBO0JcXCIpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5NSURETEVfTkFNRSwgIkNcXDsiKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuUFJFRklYLCAiRCIpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5TVUZGSVgsICI6RSIpOwotICAgICAgICAgICAgLy8gRElTUExBWV9OQU1FIGlzIG1pc3NpbmcuCi0gICAgICAgICAgICB2ZXJpZmllci52ZXJpZnkoKTsKLSAgICAgICAgfSBjYXRjaCAoQXNzZXJ0aW9uRmFpbGVkRXJyb3IgZSkgewotICAgICAgICAgICAgZmFpbHVyZURldGVjdGVkID0gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICBpZiAoIWZhaWx1cmVEZXRlY3RlZCkgewotICAgICAgICAgICAgVGVzdENhc2UuZmFpbCgiVGVzdCBjYXNlIHRoYXQgc2hvdWxkIGZhaWwgYWN0dWFsbHkgc3VjY2VlZGVkLiIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFNob3VsZEZhaWxBdExpbmVWZXJpZmljYXRpb24oKSB7Ci0gICAgICAgIGJvb2xlYW4gZmFpbHVyZURldGVjdGVkID0gZmFsc2U7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBmaW5hbCBWQ2FyZFZlcmlmaWVyIHZlcmlmaWVyID0gbmV3IFZDYXJkVmVyaWZpZXIodGhpcyk7Ci0gICAgICAgICAgICB2ZXJpZmllci5pbml0Rm9yRXhwb3J0VGVzdChWQ2FyZENvbmZpZy5WQ0FSRF9UWVBFX1YzMF9HRU5FUklDKTsKLSAgICAgICAgICAgIHZlcmlmaWVyLmFkZElucHV0RW50cnkoKS5hZGRDb250ZW50VmFsdWVzKFN0cnVjdHVyZWROYW1lLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLkZBTUlMWV9OQU1FLCAiXFwiKQotICAgICAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLkdJVkVOX05BTUUsICI7IikKLSAgICAgICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5NSURETEVfTkFNRSwgIiwiKQotICAgICAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLlBSRUZJWCwgIlxuIikKLSAgICAgICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5ESVNQTEFZX05BTUUsICJbPHtVbmVzY2FwZWQ6QXNjaWlzfT5dIik7Ci0gICAgICAgICAgICB2ZXJpZmllci5hZGRMaW5lVmVyaWZpZXJFbGVtKCkKLSAgICAgICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkKCJURUw6MSIpICAvLyB3cm9uZwotICAgICAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWQoIkZOOls8e1VuZXNjYXBlZDpBc2NpaXN9Pl0iKTsKLSAgICAgICAgICAgIHZlcmlmaWVyLnZlcmlmeSgpOwotICAgICAgICB9IGNhdGNoIChBc3NlcnRpb25GYWlsZWRFcnJvciBlKSB7Ci0gICAgICAgICAgICBmYWlsdXJlRGV0ZWN0ZWQgPSB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIGlmICghZmFpbHVyZURldGVjdGVkKSB7Ci0gICAgICAgICAgICBUZXN0Q2FzZS5mYWlsKCJUZXN0IGNhc2UgdGhhdCBzaG91bGQgZmFpbCBhY3R1YWxseSBzdWNjZWVkZWQuIik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL3BpbS92Y2FyZC9WQ2FyZFV0aWxzVGVzdHMuamF2YSBiL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL3BpbS92Y2FyZC9WQ2FyZFV0aWxzVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjUxZmFiMi4uMDAwMDAwMAotLS0gYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9waW0vdmNhcmQvVkNhcmRVdGlsc1Rlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIGFuZHJvaWQucGltLnZjYXJkOwotCi1pbXBvcnQgYW5kcm9pZC50ZXh0LlRleHRVdGlsczsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1wdWJsaWMgY2xhc3MgVkNhcmRVdGlsc1Rlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotICAgIHB1YmxpYyB2b2lkIHRlc3RDb250YWluc09ubHlQcmludGFibGVBc2NpaSgpIHsKLSAgICAgICAgYXNzZXJ0VHJ1ZShWQ2FyZFV0aWxzLmNvbnRhaW5zT25seVByaW50YWJsZUFzY2lpKChTdHJpbmcpbnVsbCkpOwotICAgICAgICBhc3NlcnRUcnVlKFZDYXJkVXRpbHMuY29udGFpbnNPbmx5UHJpbnRhYmxlQXNjaWkoKFN0cmluZ1tdKW51bGwpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShWQ2FyZFV0aWxzLmNvbnRhaW5zT25seVByaW50YWJsZUFzY2lpKChMaXN0PFN0cmluZz4pbnVsbCkpOwotICAgICAgICBhc3NlcnRUcnVlKFZDYXJkVXRpbHMuY29udGFpbnNPbmx5UHJpbnRhYmxlQXNjaWkoIiIpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShWQ2FyZFV0aWxzLmNvbnRhaW5zT25seVByaW50YWJsZUFzY2lpKCJhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eiIpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShWQ2FyZFV0aWxzLmNvbnRhaW5zT25seVByaW50YWJsZUFzY2lpKCJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWiIpKTsKLSAgICAgICAgU3RyaW5nQnVpbGRlciBidWlsZGVyID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDB4MjA7IGkgPCAweDdGOyBpKyspIHsKLSAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKChjaGFyKWkpOwotICAgICAgICB9Ci0gICAgICAgIGFzc2VydFRydWUoVkNhcmRVdGlscy5jb250YWluc09ubHlQcmludGFibGVBc2NpaShidWlsZGVyLnRvU3RyaW5nKCkpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShWQ2FyZFV0aWxzLmNvbnRhaW5zT25seVByaW50YWJsZUFzY2lpKCJcclxuIikpOwotICAgICAgICBhc3NlcnRGYWxzZShWQ2FyZFV0aWxzLmNvbnRhaW5zT25seVByaW50YWJsZUFzY2lpKCJcdTAwMTkiKSk7Ci0gICAgICAgIGFzc2VydEZhbHNlKFZDYXJkVXRpbHMuY29udGFpbnNPbmx5UHJpbnRhYmxlQXNjaWkoIlx1MDA3RiIpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q29udGFpbnNPbmx5Tm9uQ3JMZlByaW50YWJsZUFzY2lpKCkgewotICAgICAgICBhc3NlcnRUcnVlKFZDYXJkVXRpbHMuY29udGFpbnNPbmx5Tm9uQ3JMZlByaW50YWJsZUFzY2lpKChTdHJpbmcpbnVsbCkpOwotICAgICAgICBhc3NlcnRUcnVlKFZDYXJkVXRpbHMuY29udGFpbnNPbmx5Tm9uQ3JMZlByaW50YWJsZUFzY2lpKChTdHJpbmdbXSludWxsKSk7Ci0gICAgICAgIGFzc2VydFRydWUoVkNhcmRVdGlscy5jb250YWluc09ubHlOb25DckxmUHJpbnRhYmxlQXNjaWkoKExpc3Q8U3RyaW5nPiludWxsKSk7Ci0gICAgICAgIGFzc2VydFRydWUoVkNhcmRVdGlscy5jb250YWluc09ubHlOb25DckxmUHJpbnRhYmxlQXNjaWkoIiIpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShWQ2FyZFV0aWxzLmNvbnRhaW5zT25seU5vbkNyTGZQcmludGFibGVBc2NpaSgiYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXoiKSk7Ci0gICAgICAgIGFzc2VydFRydWUoVkNhcmRVdGlscy5jb250YWluc09ubHlOb25DckxmUHJpbnRhYmxlQXNjaWkoIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaIikpOwotICAgICAgICBTdHJpbmdCdWlsZGVyIGJ1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotICAgICAgICBmb3IgKGludCBpID0gMHgyMDsgaSA8IDB4N0Y7IGkrKykgewotICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoKGNoYXIpaSk7Ci0gICAgICAgIH0KLSAgICAgICAgYXNzZXJ0VHJ1ZShWQ2FyZFV0aWxzLmNvbnRhaW5zT25seU5vbkNyTGZQcmludGFibGVBc2NpaShidWlsZGVyLnRvU3RyaW5nKCkpKTsKLSAgICAgICAgYXNzZXJ0RmFsc2UoVkNhcmRVdGlscy5jb250YWluc09ubHlOb25DckxmUHJpbnRhYmxlQXNjaWkoIlx1MDAxOSIpKTsKLSAgICAgICAgYXNzZXJ0RmFsc2UoVkNhcmRVdGlscy5jb250YWluc09ubHlOb25DckxmUHJpbnRhYmxlQXNjaWkoIlx1MDA3RiIpKTsKLSAgICAgICAgYXNzZXJ0RmFsc2UoVkNhcmRVdGlscy5jb250YWluc09ubHlOb25DckxmUHJpbnRhYmxlQXNjaWkoIlxyIikpOwotICAgICAgICBhc3NlcnRGYWxzZShWQ2FyZFV0aWxzLmNvbnRhaW5zT25seU5vbkNyTGZQcmludGFibGVBc2NpaSgiXG4iKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdENvbnRhaW5zT25seUFscGhhRGlnaXRIeXBoZW4oKSB7Ci0gICAgICAgIGFzc2VydFRydWUoVkNhcmRVdGlscy5jb250YWluc09ubHlBbHBoYURpZ2l0SHlwaGVuKChTdHJpbmcpbnVsbCkpOwotICAgICAgICBhc3NlcnRUcnVlKFZDYXJkVXRpbHMuY29udGFpbnNPbmx5QWxwaGFEaWdpdEh5cGhlbigoU3RyaW5nW10pbnVsbCkpOwotICAgICAgICBhc3NlcnRUcnVlKFZDYXJkVXRpbHMuY29udGFpbnNPbmx5QWxwaGFEaWdpdEh5cGhlbigoTGlzdDxTdHJpbmc+KW51bGwpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShWQ2FyZFV0aWxzLmNvbnRhaW5zT25seUFscGhhRGlnaXRIeXBoZW4oIiIpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShWQ2FyZFV0aWxzLmNvbnRhaW5zT25seU5vbkNyTGZQcmludGFibGVBc2NpaSgiYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXoiKSk7Ci0gICAgICAgIGFzc2VydFRydWUoVkNhcmRVdGlscy5jb250YWluc09ubHlOb25DckxmUHJpbnRhYmxlQXNjaWkoIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaIikpOwotICAgICAgICBhc3NlcnRUcnVlKFZDYXJkVXRpbHMuY29udGFpbnNPbmx5Tm9uQ3JMZlByaW50YWJsZUFzY2lpKCIwMTIzNDU2Nzg5LSIpKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAweDMwOyBpKyspIHsKLSAgICAgICAgICAgIGlmIChpID09IDB4MkQpIHsgIC8vIC0KLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGFzc2VydEZhbHNlKFZDYXJkVXRpbHMuY29udGFpbnNPbmx5QWxwaGFEaWdpdEh5cGhlbihTdHJpbmcudmFsdWVPZigoY2hhcilpKSkpOwotICAgICAgICB9Ci0gICAgICAgIGZvciAoaW50IGkgPSAweDNBOyBpIDwgMHg0MTsgaSsrKSB7Ci0gICAgICAgICAgICBhc3NlcnRGYWxzZShWQ2FyZFV0aWxzLmNvbnRhaW5zT25seUFscGhhRGlnaXRIeXBoZW4oU3RyaW5nLnZhbHVlT2YoKGNoYXIpaSkpKTsKLSAgICAgICAgfQotICAgICAgICBmb3IgKGludCBpID0gMHg1QjsgaSA8IDB4NjE7IGkrKykgewotICAgICAgICAgICAgYXNzZXJ0RmFsc2UoVkNhcmRVdGlscy5jb250YWluc09ubHlBbHBoYURpZ2l0SHlwaGVuKFN0cmluZy52YWx1ZU9mKChjaGFyKWkpKSk7Ci0gICAgICAgIH0KLSAgICAgICAgZm9yIChpbnQgaSA9IDB4N0I7IGkgPCAweDEwMDsgaSsrKSB7Ci0gICAgICAgICAgICBhc3NlcnRGYWxzZShWQ2FyZFV0aWxzLmNvbnRhaW5zT25seUFscGhhRGlnaXRIeXBoZW4oU3RyaW5nLnZhbHVlT2YoKGNoYXIpaSkpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RUb1N0cmluZ0F2YWlsYWJsZUFzVjMwUGFyYW1WYWx1ZSgpIHsKLSAgICAgICAgLy8gU21va2UgdGVzdHMuCi0gICAgICAgIGFzc2VydEVxdWFscygiSE9NRSIsIFZDYXJkVXRpbHMudG9TdHJpbmdBc1YzMFBhcmFtVmFsdWUoIkhPTUUiKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiVEVMIiwgVkNhcmRVdGlscy50b1N0cmluZ0FzVjMwUGFyYW1WYWx1ZSgiVEVMIikpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIlBBR0VSIiwgVkNhcmRVdGlscy50b1N0cmluZ0FzVjMwUGFyYW1WYWx1ZSgiUEFHRVIiKSk7Ci0KLSAgICAgICAgYXNzZXJ0VHJ1ZShUZXh0VXRpbHMuaXNFbXB0eShWQ2FyZFV0aWxzLnRvU3RyaW5nQXNWMzBQYXJhbVZhbHVlKCIiKSkpOwotICAgICAgICBhc3NlcnRUcnVlKFRleHRVdGlscy5pc0VtcHR5KFZDYXJkVXRpbHMudG9TdHJpbmdBc1YzMFBhcmFtVmFsdWUobnVsbCkpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShUZXh0VXRpbHMuaXNFbXB0eShWQ2FyZFV0aWxzLnRvU3RyaW5nQXNWMzBQYXJhbVZhbHVlKCIgXHQiKSkpOwotCi0gICAgICAgIC8vIG5vbi1Bc2NpaSBtdXN0IGJlIGFsbG93ZWQKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJcdTRFOEJcdTUyRDlcdTYyNDAiLAotICAgICAgICAgICAgICAgIFZDYXJkVXRpbHMudG9TdHJpbmdBc1YzMFBhcmFtVmFsdWUoIlx1NEU4Qlx1NTJEOVx1NjI0MCIpKTsKLSAgICAgICAgLy8gUmVwb3J0ZWQgYXMgYnVnIHJlcG9ydC4KLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJcdThEMzkiLCBWQ2FyZFV0aWxzLnRvU3RyaW5nQXNWMzBQYXJhbVZhbHVlKCJcdThEMzkiKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiXCJjb21tYSxzZXBhcmF0ZWRcIiIsCi0gICAgICAgICAgICAgICAgVkNhcmRVdGlscy50b1N0cmluZ0FzVjMwUGFyYW1WYWx1ZSgiY29tbWEsc2VwYXJhdGVkIikpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIlwiY29sb246YXdhcmVcIiIsCi0gICAgICAgICAgICAgICAgVkNhcmRVdGlscy50b1N0cmluZ0FzVjMwUGFyYW1WYWx1ZSgiY29sb246YXdhcmUiKSk7Ci0gICAgICAgIC8vIENUTCBjaGFyYWN0ZXJzLgotICAgICAgICBhc3NlcnRFcXVhbHMoIkNUTEV4YW1wbGUiLAotICAgICAgICAgICAgICAgIFZDYXJkVXRpbHMudG9TdHJpbmdBc1YzMFBhcmFtVmFsdWUoIkNUTFx1MDAwMUV4YW1wbGUiKSk7Ci0gICAgICAgIGFzc2VydFRydWUoVGV4dFV0aWxzLmlzRW1wdHkoCi0gICAgICAgICAgICAgICAgVkNhcmRVdGlscy50b1N0cmluZ0FzVjMwUGFyYW1WYWx1ZSgiXHUwMDAxXHUwMDAyXHUwMDAzIikpKTsKLSAgICAgICAgLy8gRFFVT1RFIG11c3QgYmUgcmVtb3ZlZC4KLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJxdW90ZWQiLAotICAgICAgICAgICAgICAgIFZDYXJkVXRpbHMudG9TdHJpbmdBc1YzMFBhcmFtVmFsdWUoIlwicXVvdGVkXCIiKSk7Ci0gICAgICAgIC8vIERRVU9URSBtdXN0IGJlIHJlbW92ZWQgYmFzaWNhbGx5LCBidXQgd2Ugc2hvdWxkIGRldGVjdCBhIHNwYWNlLCB3aGljaAotICAgICAgICAvLyByZXF1aXJlIHVzIHRvIHVzZSBEUVVPVEUgYWdhaW4uCi0gICAgICAgIC8vIFJpZ2h0LXNpZGUgaGFzIG9uZSBtb3JlIGlsbGVnYWwgZHF1b3RlIHRvIHRlc3QgcXVvdGUtaGFuZGxlIGNvZGUgdGhvcm91Z2hseS4KLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJcIkFscmVhZHkgcXVvdGVkXCIiLAotICAgICAgICAgICAgICAgIFZDYXJkVXRpbHMudG9TdHJpbmdBc1YzMFBhcmFtVmFsdWUoIlwiQWxyZWFkeSBxdW90ZWRcIlwiIikpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL3BpbS92Y2FyZC90ZXN0X3V0aWxzL0NvbnRhY3RFbnRyeS5qYXZhIGIvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvcGltL3ZjYXJkL3Rlc3RfdXRpbHMvQ29udGFjdEVudHJ5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg0Mzc1MGUuLjAwMDAwMDAKLS0tIGEvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvcGltL3ZjYXJkL3Rlc3RfdXRpbHMvQ29udGFjdEVudHJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QKLSAqIHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCi0gKiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQKLSAqIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZQotICogTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIKLSAqIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIGFuZHJvaWQucGltLnZjYXJkLnRlc3RfdXRpbHM7Ci0KLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFZhbHVlczsKLWltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuRGF0YTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLS8qKgotICogPHA+Ci0gKiBUaGUgY2xhc3MgcmVwcmVzZW50aW5nIG9uZSBjb250YWN0LCB3aGljaCBzaG91bGQgY29udGFpbiBtdWx0aXBsZSBDb250ZW50VmFsdWVzIGxpa2UKLSAqIFN0cnVjdHVyZWROYW1lLCBFbWFpbCwgZXRjLgotICogPC9wPgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgQ29udGFjdEVudHJ5IHsKLSAgICBwcml2YXRlIGZpbmFsIExpc3Q8Q29udGVudFZhbHVlcz4gbUNvbnRlbnRWYWx1ZXNMaXN0ID0gbmV3IEFycmF5TGlzdDxDb250ZW50VmFsdWVzPigpOwotCi0gICAgcHVibGljIENvbnRlbnRWYWx1ZXNCdWlsZGVyIGFkZENvbnRlbnRWYWx1ZXMoU3RyaW5nIG1pbWVUeXBlKSB7Ci0gICAgICAgIENvbnRlbnRWYWx1ZXMgY29udGVudFZhbHVlcyA9IG5ldyBDb250ZW50VmFsdWVzKCk7Ci0gICAgICAgIGNvbnRlbnRWYWx1ZXMucHV0KERhdGEuTUlNRVRZUEUsIG1pbWVUeXBlKTsKLSAgICAgICAgbUNvbnRlbnRWYWx1ZXNMaXN0LmFkZChjb250ZW50VmFsdWVzKTsKLSAgICAgICAgcmV0dXJuIG5ldyBDb250ZW50VmFsdWVzQnVpbGRlcihjb250ZW50VmFsdWVzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTGlzdDxDb250ZW50VmFsdWVzPiBnZXRMaXN0KCkgewotICAgICAgICByZXR1cm4gbUNvbnRlbnRWYWx1ZXNMaXN0OwotICAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9waW0vdmNhcmQvdGVzdF91dGlscy9Db250ZW50VmFsdWVzQnVpbGRlci5qYXZhIGIvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvcGltL3ZjYXJkL3Rlc3RfdXRpbHMvQ29udGVudFZhbHVlc0J1aWxkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmRjY2NmOS4uMDAwMDAwMAotLS0gYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9waW0vdmNhcmQvdGVzdF91dGlscy9Db250ZW50VmFsdWVzQnVpbGRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIGFuZHJvaWQucGltLnZjYXJkLnRlc3RfdXRpbHM7Ci0KLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFZhbHVlczsKLQotLyoqCi0gKiBDb250ZW50VmFsdWVzLWxpa2UgY2xhc3Mgd2hpY2ggZW5hYmxlcyB1c2VycyB0byBjaGFpbiBwdXQoKSBtZXRob2RzIGFuZCByZXN0cmljdHMKLSAqIHRoZSBvdGhlciBtZXRob2RzLgotICovCi1wdWJsaWMgY2xhc3MgQ29udGVudFZhbHVlc0J1aWxkZXIgewotICAgIHByaXZhdGUgZmluYWwgQ29udGVudFZhbHVlcyBtQ29udGVudFZhbHVlczsKLQotICAgIHB1YmxpYyBDb250ZW50VmFsdWVzQnVpbGRlcihmaW5hbCBDb250ZW50VmFsdWVzIGNvbnRlbnRWYWx1ZXMpIHsKLSAgICAgICAgbUNvbnRlbnRWYWx1ZXMgPSBjb250ZW50VmFsdWVzOwotICAgIH0KLQotICAgIHB1YmxpYyBDb250ZW50VmFsdWVzQnVpbGRlciBwdXQoU3RyaW5nIGtleSwgU3RyaW5nIHZhbHVlKSB7Ci0gICAgICAgIG1Db250ZW50VmFsdWVzLnB1dChrZXksIHZhbHVlKTsKLSAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgfQotCi0gICAgLyoKLSAgICBwdWJsaWMgQ29udGVudFZhbHVlc0J1aWxkZXIgcHV0KFN0cmluZyBrZXksIEJ5dGUgdmFsdWUpIHsKLSAgICAgICAgbUNvbnRlbnRWYWx1ZXMucHV0KGtleSwgdmFsdWUpOwotICAgICAgICByZXR1cm4gdGhpczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQ29udGVudFZhbHVlc0J1aWxkZXIgcHV0KFN0cmluZyBrZXksIFNob3J0IHZhbHVlKSB7Ci0gICAgICAgIG1Db250ZW50VmFsdWVzLnB1dChrZXksIHZhbHVlKTsKLSAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgfSovCi0KLSAgICBwdWJsaWMgQ29udGVudFZhbHVlc0J1aWxkZXIgcHV0KFN0cmluZyBrZXksIEludGVnZXIgdmFsdWUpIHsKLSAgICAgICAgbUNvbnRlbnRWYWx1ZXMucHV0KGtleSwgdmFsdWUpOwotICAgICAgICByZXR1cm4gdGhpczsKLSAgICB9Ci0KLSAgICAvKgotICAgIHB1YmxpYyBDb250ZW50VmFsdWVzQnVpbGRlciBwdXQoU3RyaW5nIGtleSwgTG9uZyB2YWx1ZSkgewotICAgICAgICBtQ29udGVudFZhbHVlcy5wdXQoa2V5LCB2YWx1ZSk7Ci0gICAgICAgIHJldHVybiB0aGlzOwotICAgIH0KLQotICAgIHB1YmxpYyBDb250ZW50VmFsdWVzQnVpbGRlciBwdXQoU3RyaW5nIGtleSwgRmxvYXQgdmFsdWUpIHsKLSAgICAgICAgbUNvbnRlbnRWYWx1ZXMucHV0KGtleSwgdmFsdWUpOwotICAgICAgICByZXR1cm4gdGhpczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQ29udGVudFZhbHVlc0J1aWxkZXIgcHV0KFN0cmluZyBrZXksIERvdWJsZSB2YWx1ZSkgewotICAgICAgICBtQ29udGVudFZhbHVlcy5wdXQoa2V5LCB2YWx1ZSk7Ci0gICAgICAgIHJldHVybiB0aGlzOwotICAgIH0KLQotICAgIHB1YmxpYyBDb250ZW50VmFsdWVzQnVpbGRlciBwdXQoU3RyaW5nIGtleSwgQm9vbGVhbiB2YWx1ZSkgewotICAgICAgICBtQ29udGVudFZhbHVlcy5wdXQoa2V5LCB2YWx1ZSk7Ci0gICAgICAgIHJldHVybiB0aGlzOwotICAgIH0qLwotCi0gICAgcHVibGljIENvbnRlbnRWYWx1ZXNCdWlsZGVyIHB1dChTdHJpbmcga2V5LCBieXRlW10gdmFsdWUpIHsKLSAgICAgICAgbUNvbnRlbnRWYWx1ZXMucHV0KGtleSwgdmFsdWUpOwotICAgICAgICByZXR1cm4gdGhpczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQ29udGVudFZhbHVlc0J1aWxkZXIgcHV0TnVsbChTdHJpbmcga2V5KSB7Ci0gICAgICAgIG1Db250ZW50VmFsdWVzLnB1dE51bGwoa2V5KTsKLSAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvcGltL3ZjYXJkL3Rlc3RfdXRpbHMvQ29udGVudFZhbHVlc1ZlcmlmaWVyLmphdmEgYi9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9waW0vdmNhcmQvdGVzdF91dGlscy9Db250ZW50VmFsdWVzVmVyaWZpZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDA2MTNjNi4uMDAwMDAwMAotLS0gYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9waW0vdmNhcmQvdGVzdF91dGlscy9Db250ZW50VmFsdWVzVmVyaWZpZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBhbmRyb2lkLnBpbS52Y2FyZC50ZXN0X3V0aWxzOwotCi1pbXBvcnQgYW5kcm9pZC5waW0udmNhcmQuVkNhcmRFbnRyeTsKLWltcG9ydCBhbmRyb2lkLnBpbS52Y2FyZC5WQ2FyZEVudHJ5SGFuZGxlcjsKLWltcG9ydCBhbmRyb2lkLnRlc3QuQW5kcm9pZFRlc3RDYXNlOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotcHVibGljIGNsYXNzIENvbnRlbnRWYWx1ZXNWZXJpZmllciBpbXBsZW1lbnRzIFZDYXJkRW50cnlIYW5kbGVyIHsKLSAgICBwcml2YXRlIExpc3Q8Q29udGVudFZhbHVlc1ZlcmlmaWVyRWxlbT4gbUNvbnRlbnRWYWx1ZXNWZXJpZmllckVsZW1MaXN0ID0KLSAgICAgICAgbmV3IEFycmF5TGlzdDxDb250ZW50VmFsdWVzVmVyaWZpZXJFbGVtPigpOwotICAgIHByaXZhdGUgaW50IG1JbmRleDsKLQotICAgIHB1YmxpYyBDb250ZW50VmFsdWVzVmVyaWZpZXJFbGVtIGFkZEVsZW0oQW5kcm9pZFRlc3RDYXNlIGFuZHJvaWRUZXN0Q2FzZSkgewotICAgICAgICBDb250ZW50VmFsdWVzVmVyaWZpZXJFbGVtIGVsZW0gPSBuZXcgQ29udGVudFZhbHVlc1ZlcmlmaWVyRWxlbShhbmRyb2lkVGVzdENhc2UpOwotICAgICAgICBtQ29udGVudFZhbHVlc1ZlcmlmaWVyRWxlbUxpc3QuYWRkKGVsZW0pOwotICAgICAgICByZXR1cm4gZWxlbTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBvblN0YXJ0KCkgewotICAgICAgICBmb3IgKENvbnRlbnRWYWx1ZXNWZXJpZmllckVsZW0gZWxlbSA6IG1Db250ZW50VmFsdWVzVmVyaWZpZXJFbGVtTGlzdCkgewotICAgICAgICAgICAgZWxlbS5vblBhcnNpbmdTdGFydCgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgb25FbnRyeUNyZWF0ZWQoVkNhcmRFbnRyeSBlbnRyeSkgewotICAgICAgICBBbmRyb2lkVGVzdENhc2UuYXNzZXJ0VHJ1ZShtSW5kZXggPCBtQ29udGVudFZhbHVlc1ZlcmlmaWVyRWxlbUxpc3Quc2l6ZSgpKTsKLSAgICAgICAgbUNvbnRlbnRWYWx1ZXNWZXJpZmllckVsZW1MaXN0LmdldChtSW5kZXgpLm9uRW50cnlDcmVhdGVkKGVudHJ5KTsKLSAgICAgICAgbUluZGV4Kys7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgb25FbmQoKSB7Ci0gICAgICAgIGZvciAoQ29udGVudFZhbHVlc1ZlcmlmaWVyRWxlbSBlbGVtIDogbUNvbnRlbnRWYWx1ZXNWZXJpZmllckVsZW1MaXN0KSB7Ci0gICAgICAgICAgICBlbGVtLm9uUGFyc2luZ0VuZCgpOwotICAgICAgICAgICAgZWxlbS52ZXJpZnlSZXNvbHZlcigpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvcGltL3ZjYXJkL3Rlc3RfdXRpbHMvQ29udGVudFZhbHVlc1ZlcmlmaWVyRWxlbS5qYXZhIGIvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvcGltL3ZjYXJkL3Rlc3RfdXRpbHMvQ29udGVudFZhbHVlc1ZlcmlmaWVyRWxlbS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwM2MxOGUxLi4wMDAwMDAwCi0tLSBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL3BpbS92Y2FyZC90ZXN0X3V0aWxzL0NvbnRlbnRWYWx1ZXNWZXJpZmllckVsZW0uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBhbmRyb2lkLnBpbS52Y2FyZC50ZXN0X3V0aWxzOwotCi1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRWYWx1ZXM7Ci1pbXBvcnQgYW5kcm9pZC5waW0udmNhcmQuVkNhcmRFbnRyeTsKLWltcG9ydCBhbmRyb2lkLnBpbS52Y2FyZC5WQ2FyZEVudHJ5Q29tbWl0dGVyOwotaW1wb3J0IGFuZHJvaWQucGltLnZjYXJkLlZDYXJkRW50cnlDb25zdHJ1Y3RvcjsKLWltcG9ydCBhbmRyb2lkLnBpbS52Y2FyZC5WQ2FyZEVudHJ5SGFuZGxlcjsKLWltcG9ydCBhbmRyb2lkLnBpbS52Y2FyZC5WQ2FyZFBhcnNlcjsKLWltcG9ydCBhbmRyb2lkLnBpbS52Y2FyZC5WQ2FyZFV0aWxzOwotaW1wb3J0IGFuZHJvaWQucGltLnZjYXJkLmV4Y2VwdGlvbi5WQ2FyZEV4Y2VwdGlvbjsKLWltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuRGF0YTsKLWltcG9ydCBhbmRyb2lkLnRlc3QuQW5kcm9pZFRlc3RDYXNlOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotCi1wdWJsaWMgY2xhc3MgQ29udGVudFZhbHVlc1ZlcmlmaWVyRWxlbSB7Ci0gICAgcHJpdmF0ZSBmaW5hbCBBbmRyb2lkVGVzdENhc2UgbVRlc3RDYXNlOwotICAgIHByaXZhdGUgZmluYWwgSW1wb3J0VGVzdFJlc29sdmVyIG1SZXNvbHZlcjsKLSAgICBwcml2YXRlIGZpbmFsIFZDYXJkRW50cnlIYW5kbGVyIG1IYW5kbGVyOwotCi0gICAgcHVibGljIENvbnRlbnRWYWx1ZXNWZXJpZmllckVsZW0oQW5kcm9pZFRlc3RDYXNlIGFuZHJvaWRUZXN0Q2FzZSkgewotICAgICAgICBtVGVzdENhc2UgPSBhbmRyb2lkVGVzdENhc2U7Ci0gICAgICAgIG1SZXNvbHZlciA9IG5ldyBJbXBvcnRUZXN0UmVzb2x2ZXIoYW5kcm9pZFRlc3RDYXNlKTsKLSAgICAgICAgbUhhbmRsZXIgPSBuZXcgVkNhcmRFbnRyeUNvbW1pdHRlcihtUmVzb2x2ZXIpOwotICAgIH0KLQotICAgIHB1YmxpYyBDb250ZW50VmFsdWVzQnVpbGRlciBhZGRFeHBlY3RlZChTdHJpbmcgbWltZVR5cGUpIHsKLSAgICAgICAgQ29udGVudFZhbHVlcyBjb250ZW50VmFsdWVzID0gbmV3IENvbnRlbnRWYWx1ZXMoKTsKLSAgICAgICAgY29udGVudFZhbHVlcy5wdXQoRGF0YS5NSU1FVFlQRSwgbWltZVR5cGUpOwotICAgICAgICBtUmVzb2x2ZXIuYWRkRXhwZWN0ZWRDb250ZW50VmFsdWVzKGNvbnRlbnRWYWx1ZXMpOwotICAgICAgICByZXR1cm4gbmV3IENvbnRlbnRWYWx1ZXNCdWlsZGVyKGNvbnRlbnRWYWx1ZXMpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHZlcmlmeShpbnQgcmVzSWQsIGludCB2Y2FyZFR5cGUpCi0gICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFZDYXJkRXhjZXB0aW9uIHsKLSAgICAgICAgdmVyaWZ5KG1UZXN0Q2FzZS5nZXRDb250ZXh0KCkuZ2V0UmVzb3VyY2VzKCkub3BlblJhd1Jlc291cmNlKHJlc0lkKSwgdmNhcmRUeXBlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB2ZXJpZnkoSW5wdXRTdHJlYW0gaXMsIGludCB2Y2FyZFR5cGUpIHRocm93cyBJT0V4Y2VwdGlvbiwgVkNhcmRFeGNlcHRpb24gewotICAgICAgICBmaW5hbCBWQ2FyZFBhcnNlciB2Q2FyZFBhcnNlciA9IFZDYXJkVXRpbHMuZ2V0QXBwcm9wcmlhdGVQYXJzZXIodmNhcmRUeXBlKTsKLSAgICAgICAgZmluYWwgVkNhcmRFbnRyeUNvbnN0cnVjdG9yIGJ1aWxkZXIgPSBuZXcgVkNhcmRFbnRyeUNvbnN0cnVjdG9yKHZjYXJkVHlwZSwgbnVsbCk7Ci0gICAgICAgIGJ1aWxkZXIuYWRkRW50cnlIYW5kbGVyKG1IYW5kbGVyKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHZDYXJkUGFyc2VyLnBhcnNlKGlzLCBidWlsZGVyKTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIGlmIChpcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgaXMuY2xvc2UoKTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHZlcmlmeVJlc29sdmVyKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdmVyaWZ5UmVzb2x2ZXIoKSB7Ci0gICAgICAgIG1SZXNvbHZlci52ZXJpZnkoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBvblBhcnNpbmdTdGFydCgpIHsKLSAgICAgICAgbUhhbmRsZXIub25TdGFydCgpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIG9uRW50cnlDcmVhdGVkKFZDYXJkRW50cnkgZW50cnkpIHsKLSAgICAgICAgbUhhbmRsZXIub25FbnRyeUNyZWF0ZWQoZW50cnkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIG9uUGFyc2luZ0VuZCgpIHsKLSAgICAgICAgbUhhbmRsZXIub25FbmQoKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9waW0vdmNhcmQvdGVzdF91dGlscy9FeHBvcnRUZXN0UHJvdmlkZXIuamF2YSBiL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL3BpbS92Y2FyZC90ZXN0X3V0aWxzL0V4cG9ydFRlc3RQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMDk1MjU4Li4wMDAwMDAwCi0tLSBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL3BpbS92Y2FyZC90ZXN0X3V0aWxzL0V4cG9ydFRlc3RQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdAotICogdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKLSAqIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgV0lUSE9VVAotICogV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlCi0gKiBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlcgotICogdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2UgYW5kcm9pZC5waW0udmNhcmQudGVzdF91dGlsczsKLQotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZW50UmVzb2x2ZXI7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRWYWx1ZXM7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkVudGl0eTsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuRW50aXR5SXRlcmF0b3I7Ci1pbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5DdXJzb3I7Ci1pbXBvcnQgYW5kcm9pZC5uZXQuVXJpOwotaW1wb3J0IGFuZHJvaWQucGltLnZjYXJkLlZDYXJkQ29tcG9zZXI7Ci1pbXBvcnQgYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0LkNvbnRhY3RzOwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5EYXRhOwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5SYXdDb250YWN0czsKLWltcG9ydCBhbmRyb2lkLnRlc3QuQW5kcm9pZFRlc3RDYXNlOwotaW1wb3J0IGFuZHJvaWQudGVzdC5tb2NrLk1vY2tDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgYW5kcm9pZC50ZXN0Lm1vY2suTW9ja0N1cnNvcjsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1wdWJsaWMgY2xhc3MgRXhwb3J0VGVzdFByb3ZpZGVyIGV4dGVuZHMgTW9ja0NvbnRlbnRQcm92aWRlciB7Ci0gICAgZmluYWwgcHJpdmF0ZSBBcnJheUxpc3Q8Q29udGFjdEVudHJ5PiBtQ29udGFjdEVudHJ5TGlzdCA9IG5ldyBBcnJheUxpc3Q8Q29udGFjdEVudHJ5PigpOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgTW9ja0VudGl0eUl0ZXJhdG9yIGltcGxlbWVudHMgRW50aXR5SXRlcmF0b3IgewotICAgICAgICBMaXN0PEVudGl0eT4gbUVudGl0eUxpc3Q7Ci0gICAgICAgIEl0ZXJhdG9yPEVudGl0eT4gbUl0ZXJhdG9yOwotCi0gICAgICAgIHB1YmxpYyBNb2NrRW50aXR5SXRlcmF0b3IoTGlzdDxDb250ZW50VmFsdWVzPiBjb250ZW50VmFsdWVzTGlzdCkgewotICAgICAgICAgICAgbUVudGl0eUxpc3QgPSBuZXcgQXJyYXlMaXN0PEVudGl0eT4oKTsKLSAgICAgICAgICAgIEVudGl0eSBlbnRpdHkgPSBuZXcgRW50aXR5KG5ldyBDb250ZW50VmFsdWVzKCkpOwotICAgICAgICAgICAgZm9yIChDb250ZW50VmFsdWVzIGNvbnRlbnRWYWx1ZXMgOiBjb250ZW50VmFsdWVzTGlzdCkgewotICAgICAgICAgICAgICAgICAgICBlbnRpdHkuYWRkU3ViVmFsdWUoRGF0YS5DT05URU5UX1VSSSwgY29udGVudFZhbHVlcyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtRW50aXR5TGlzdC5hZGQoZW50aXR5KTsKLSAgICAgICAgICAgIG1JdGVyYXRvciA9IG1FbnRpdHlMaXN0Lml0ZXJhdG9yKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBoYXNOZXh0KCkgewotICAgICAgICAgICAgcmV0dXJuIG1JdGVyYXRvci5oYXNOZXh0KCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgRW50aXR5IG5leHQoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbUl0ZXJhdG9yLm5leHQoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHJlbW92ZSgpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigicmVtb3ZlIG5vdCBzdXBwb3J0ZWQiKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHJlc2V0KCkgewotICAgICAgICAgICAgbUl0ZXJhdG9yID0gbUVudGl0eUxpc3QuaXRlcmF0b3IoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIGNsb3NlKCkgewotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIEV4cG9ydFRlc3RQcm92aWRlcihBbmRyb2lkVGVzdENhc2UgYW5kcm9pZFRlc3RDYXNlKSB7Ci0gICAgfQotCi0gICAgcHVibGljIENvbnRhY3RFbnRyeSBidWlsZElucHV0RW50cnkoKSB7Ci0gICAgICAgIENvbnRhY3RFbnRyeSBjb250YWN0RW50cnkgPSBuZXcgQ29udGFjdEVudHJ5KCk7Ci0gICAgICAgIG1Db250YWN0RW50cnlMaXN0LmFkZChjb250YWN0RW50cnkpOwotICAgICAgICByZXR1cm4gY29udGFjdEVudHJ5OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDxwPgotICAgICAqIEFuIG9sZCBtZXRob2Qgd2hpY2ggaGFkIGV4aXN0ZWQgYnV0IHdhcyByZW1vdmVkIGZyb20gQ29udGVudFJlc29sdmVyLgotICAgICAqIDwvcD4KLSAgICAgKiA8cD4KLSAgICAgKiBXZSBzdGlsbCBrZWVwIHVzaW5nIHRoaXMgbWV0aG9kIHNpbmNlIHdlIGRvbid0IGhhdmUgYSBwcm9wZWVyIHdheSB0byBrbm93Ci0gICAgICogd2hpY2ggdmFsdWUgaW4gdGhlIENvbnRlbnRWYWx1ZSBjb3JyZXNwb25kcyB0byB0aGUgZW50cnkgaW4gQ29udGFjdHMgZGF0YWJhc2UuCi0gICAgICogPC9wPgotICAgICAqLwotICAgIHB1YmxpYyBFbnRpdHlJdGVyYXRvciBxdWVyeUVudGl0aWVzKFVyaSB1cmksCi0gICAgICAgICAgICBTdHJpbmcgc2VsZWN0aW9uLCBTdHJpbmdbXSBzZWxlY3Rpb25BcmdzLCBTdHJpbmcgc29ydE9yZGVyKSB7Ci0gICAgICAgIFRlc3RDYXNlLmFzc2VydFRydWUodXJpICE9IG51bGwpOwotICAgICAgICBUZXN0Q2FzZS5hc3NlcnRUcnVlKENvbnRlbnRSZXNvbHZlci5TQ0hFTUVfQ09OVEVOVC5lcXVhbHModXJpLmdldFNjaGVtZSgpKSk7Ci0gICAgICAgIGZpbmFsIFN0cmluZyBhdXRob3JpdHkgPSB1cmkuZ2V0QXV0aG9yaXR5KCk7Ci0gICAgICAgIFRlc3RDYXNlLmFzc2VydFRydWUoUmF3Q29udGFjdHMuQ09OVEVOVF9VUkkuZ2V0QXV0aG9yaXR5KCkuZXF1YWxzKGF1dGhvcml0eSkpOwotICAgICAgICBUZXN0Q2FzZS5hc3NlcnRUcnVlKChEYXRhLkNPTlRBQ1RfSUQgKyAiPT8iKS5lcXVhbHMoc2VsZWN0aW9uKSk7Ci0gICAgICAgIFRlc3RDYXNlLmFzc2VydEVxdWFscygxLCBzZWxlY3Rpb25BcmdzLmxlbmd0aCk7Ci0gICAgICAgIGZpbmFsIGludCBpZCA9IEludGVnZXIucGFyc2VJbnQoc2VsZWN0aW9uQXJnc1swXSk7Ci0gICAgICAgIFRlc3RDYXNlLmFzc2VydFRydWUoaWQgPj0gMCAmJiBpZCA8IG1Db250YWN0RW50cnlMaXN0LnNpemUoKSk7Ci0KLSAgICAgICAgcmV0dXJuIG5ldyBNb2NrRW50aXR5SXRlcmF0b3IobUNvbnRhY3RFbnRyeUxpc3QuZ2V0KGlkKS5nZXRMaXN0KCkpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBDdXJzb3IgcXVlcnkoVXJpIHVyaSxTdHJpbmdbXSBwcm9qZWN0aW9uLAotICAgICAgICAgICAgU3RyaW5nIHNlbGVjdGlvbiwgU3RyaW5nW10gc2VsZWN0aW9uQXJncywgU3RyaW5nIHNvcnRPcmRlcikgewotICAgICAgICBUZXN0Q2FzZS5hc3NlcnRUcnVlKFZDYXJkQ29tcG9zZXIuQ09OVEFDVFNfVEVTVF9DT05URU5UX1VSSS5lcXVhbHModXJpKSk7Ci0gICAgICAgIC8vIEluIHRoaXMgdGVzdCwgZm9sbG93aW5nIGFyZ3VtZW50cyBhcmUgbm90IHN1cHBvcnRlZC4KLSAgICAgICAgVGVzdENhc2UuYXNzZXJ0TnVsbChzZWxlY3Rpb24pOwotICAgICAgICBUZXN0Q2FzZS5hc3NlcnROdWxsKHNlbGVjdGlvbkFyZ3MpOwotICAgICAgICBUZXN0Q2FzZS5hc3NlcnROdWxsKHNvcnRPcmRlcik7Ci0KLSAgICAgICAgcmV0dXJuIG5ldyBNb2NrQ3Vyc29yKCkgewotICAgICAgICAgICAgaW50IG1DdXJyZW50UG9zaXRpb24gPSAtMTsKLQotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgaW50IGdldENvdW50KCkgewotICAgICAgICAgICAgICAgIHJldHVybiBtQ29udGFjdEVudHJ5TGlzdC5zaXplKCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gbW92ZVRvRmlyc3QoKSB7Ci0gICAgICAgICAgICAgICAgbUN1cnJlbnRQb3NpdGlvbiA9IDA7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gbW92ZVRvTmV4dCgpIHsKLSAgICAgICAgICAgICAgICBpZiAobUN1cnJlbnRQb3NpdGlvbiA8IG1Db250YWN0RW50cnlMaXN0LnNpemUoKSkgewotICAgICAgICAgICAgICAgICAgICBtQ3VycmVudFBvc2l0aW9uKys7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gaXNCZWZvcmVGaXJzdCgpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbUN1cnJlbnRQb3NpdGlvbiA8IDA7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gaXNBZnRlckxhc3QoKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG1DdXJyZW50UG9zaXRpb24gPj0gbUNvbnRhY3RFbnRyeUxpc3Quc2l6ZSgpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyBpbnQgZ2V0Q29sdW1uSW5kZXgoU3RyaW5nIGNvbHVtbk5hbWUpIHsKLSAgICAgICAgICAgICAgICBUZXN0Q2FzZS5hc3NlcnRFcXVhbHMoQ29udGFjdHMuX0lELCBjb2x1bW5OYW1lKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgaW50IGdldEludChpbnQgY29sdW1uSW5kZXgpIHsKLSAgICAgICAgICAgICAgICBUZXN0Q2FzZS5hc3NlcnRFcXVhbHMoMCwgY29sdW1uSW5kZXgpOwotICAgICAgICAgICAgICAgIFRlc3RDYXNlLmFzc2VydFRydWUobUN1cnJlbnRQb3NpdGlvbiA+PSAwCi0gICAgICAgICAgICAgICAgICAgICAgICAmJiBtQ3VycmVudFBvc2l0aW9uIDwgbUNvbnRhY3RFbnRyeUxpc3Quc2l6ZSgpKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gbUN1cnJlbnRQb3NpdGlvbjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgU3RyaW5nIGdldFN0cmluZyhpbnQgY29sdW1uSW5kZXgpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gU3RyaW5nLnZhbHVlT2YoZ2V0SW50KGNvbHVtbkluZGV4KSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgY2xvc2UoKSB7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH07Ci0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL3BpbS92Y2FyZC90ZXN0X3V0aWxzL0V4cG9ydFRlc3RSZXNvbHZlci5qYXZhIGIvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvcGltL3ZjYXJkL3Rlc3RfdXRpbHMvRXhwb3J0VGVzdFJlc29sdmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYwNmQ5MWEuLjAwMDAwMDAKLS0tIGEvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvcGltL3ZjYXJkL3Rlc3RfdXRpbHMvRXhwb3J0VGVzdFJlc29sdmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QKLSAqIHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCi0gKiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQKLSAqIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZQotICogTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIKLSAqIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIGFuZHJvaWQucGltLnZjYXJkLnRlc3RfdXRpbHM7Ci0KLWltcG9ydCBhbmRyb2lkLnBpbS52Y2FyZC5WQ2FyZENvbXBvc2VyOwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5SYXdDb250YWN0czsKLWltcG9ydCBhbmRyb2lkLnRlc3QuQW5kcm9pZFRlc3RDYXNlOwotaW1wb3J0IGFuZHJvaWQudGVzdC5tb2NrLk1vY2tDb250ZW50UmVzb2x2ZXI7Ci0KLXB1YmxpYyBjbGFzcyBFeHBvcnRUZXN0UmVzb2x2ZXIgZXh0ZW5kcyBNb2NrQ29udGVudFJlc29sdmVyIHsKLSAgICBwcml2YXRlIGZpbmFsIEV4cG9ydFRlc3RQcm92aWRlciBtUHJvdmlkZXI7Ci0gICAgcHVibGljIEV4cG9ydFRlc3RSZXNvbHZlcihBbmRyb2lkVGVzdENhc2UgYW5kcm9pZFRlc3RDYXNlKSB7Ci0gICAgICAgIG1Qcm92aWRlciA9IG5ldyBFeHBvcnRUZXN0UHJvdmlkZXIoYW5kcm9pZFRlc3RDYXNlKTsKLSAgICAgICAgYWRkUHJvdmlkZXIoVkNhcmRDb21wb3Nlci5WQ0FSRF9URVNUX0FVVEhPUklUWSwgbVByb3ZpZGVyKTsKLSAgICAgICAgYWRkUHJvdmlkZXIoUmF3Q29udGFjdHMuQ09OVEVOVF9VUkkuZ2V0QXV0aG9yaXR5KCksIG1Qcm92aWRlcik7Ci0gICAgfQotCi0gICAgcHVibGljIENvbnRhY3RFbnRyeSBhZGRJbnB1dENvbnRhY3RFbnRyeSgpIHsKLSAgICAgICAgcmV0dXJuIG1Qcm92aWRlci5idWlsZElucHV0RW50cnkoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgRXhwb3J0VGVzdFByb3ZpZGVyIGdldFByb3ZpZGVyKCkgewotICAgICAgICByZXR1cm4gbVByb3ZpZGVyOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL3BpbS92Y2FyZC90ZXN0X3V0aWxzL0ltcG9ydFRlc3RQcm92aWRlci5qYXZhIGIvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvcGltL3ZjYXJkL3Rlc3RfdXRpbHMvSW1wb3J0VGVzdFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRmODk0OTEuLjAwMDAwMDAKLS0tIGEvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvcGltL3ZjYXJkL3Rlc3RfdXRpbHMvSW1wb3J0VGVzdFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNzQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIGFuZHJvaWQucGltLnZjYXJkLnRlc3RfdXRpbHM7Ci0KLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFByb3ZpZGVyT3BlcmF0aW9uOwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZW50UHJvdmlkZXJSZXN1bHQ7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRWYWx1ZXM7Ci1pbXBvcnQgYW5kcm9pZC5uZXQuVXJpOwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5Db21tb25EYXRhS2luZHMuRW1haWw7Ci1pbXBvcnQgYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0LkNvbW1vbkRhdGFLaW5kcy5FdmVudDsKLWltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuQ29tbW9uRGF0YUtpbmRzLkdyb3VwTWVtYmVyc2hpcDsKLWltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuQ29tbW9uRGF0YUtpbmRzLkltOwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5Db21tb25EYXRhS2luZHMuTmlja25hbWU7Ci1pbXBvcnQgYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0LkNvbW1vbkRhdGFLaW5kcy5Ob3RlOwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5Db21tb25EYXRhS2luZHMuT3JnYW5pemF0aW9uOwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5Db21tb25EYXRhS2luZHMuUGhvbmU7Ci1pbXBvcnQgYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0LkNvbW1vbkRhdGFLaW5kcy5QaG90bzsKLWltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuQ29tbW9uRGF0YUtpbmRzLlJlbGF0aW9uOwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5Db21tb25EYXRhS2luZHMuU3RydWN0dXJlZE5hbWU7Ci1pbXBvcnQgYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0LkNvbW1vbkRhdGFLaW5kcy5TdHJ1Y3R1cmVkUG9zdGFsOwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5Db21tb25EYXRhS2luZHMuV2Vic2l0ZTsKLWltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuRGF0YTsKLWltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuUmF3Q29udGFjdHM7Ci1pbXBvcnQgYW5kcm9pZC50ZXN0LkFuZHJvaWRUZXN0Q2FzZTsKLWltcG9ydCBhbmRyb2lkLnRlc3QubW9jay5Nb2NrQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IGFuZHJvaWQudGV4dC5UZXh0VXRpbHM7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwLkVudHJ5OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci1pbXBvcnQgamF2YS51dGlsLlNvcnRlZE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuVHJlZU1hcDsKLQotcHVibGljIGNsYXNzIEltcG9ydFRlc3RQcm92aWRlciBleHRlbmRzIE1vY2tDb250ZW50UHJvdmlkZXIgewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFNldDxTdHJpbmc+IHNLbm93bk1pbWVUeXBlU2V0ID0KLSAgICAgICAgbmV3IEhhc2hTZXQ8U3RyaW5nPihBcnJheXMuYXNMaXN0KFN0cnVjdHVyZWROYW1lLkNPTlRFTlRfSVRFTV9UWVBFLAotICAgICAgICAgICAgICAgIE5pY2tuYW1lLkNPTlRFTlRfSVRFTV9UWVBFLCBQaG9uZS5DT05URU5UX0lURU1fVFlQRSwKLSAgICAgICAgICAgICAgICBFbWFpbC5DT05URU5UX0lURU1fVFlQRSwgU3RydWN0dXJlZFBvc3RhbC5DT05URU5UX0lURU1fVFlQRSwKLSAgICAgICAgICAgICAgICBJbS5DT05URU5UX0lURU1fVFlQRSwgT3JnYW5pemF0aW9uLkNPTlRFTlRfSVRFTV9UWVBFLAotICAgICAgICAgICAgICAgIEV2ZW50LkNPTlRFTlRfSVRFTV9UWVBFLCBQaG90by5DT05URU5UX0lURU1fVFlQRSwKLSAgICAgICAgICAgICAgICBOb3RlLkNPTlRFTlRfSVRFTV9UWVBFLCBXZWJzaXRlLkNPTlRFTlRfSVRFTV9UWVBFLAotICAgICAgICAgICAgICAgIFJlbGF0aW9uLkNPTlRFTlRfSVRFTV9UWVBFLCBFdmVudC5DT05URU5UX0lURU1fVFlQRSwKLSAgICAgICAgICAgICAgICBHcm91cE1lbWJlcnNoaXAuQ09OVEVOVF9JVEVNX1RZUEUpKTsKLQotICAgIGZpbmFsIE1hcDxTdHJpbmcsIENvbGxlY3Rpb248Q29udGVudFZhbHVlcz4+IG1NaW1lVHlwZVRvRXhwZWN0ZWRDb250ZW50VmFsdWVzOwotCi0gICAgcHVibGljIEltcG9ydFRlc3RQcm92aWRlcihBbmRyb2lkVGVzdENhc2UgYW5kcm9pZFRlc3RDYXNlKSB7Ci0gICAgICAgIG1NaW1lVHlwZVRvRXhwZWN0ZWRDb250ZW50VmFsdWVzID0KLSAgICAgICAgICAgIG5ldyBIYXNoTWFwPFN0cmluZywgQ29sbGVjdGlvbjxDb250ZW50VmFsdWVzPj4oKTsKLSAgICAgICAgZm9yIChTdHJpbmcgYWNjZXB0YW5ibGVNaW1lVHlwZSA6IHNLbm93bk1pbWVUeXBlU2V0KSB7Ci0gICAgICAgICAgICAvLyBEbyBub3QgdXNlIEhhc2hTZXQgc2luY2UgdGhlIGN1cnJlbnQgaW1wbGVtZW50YXRpb24gY2hhbmdlcyB0aGUgY29udGVudCBvZgotICAgICAgICAgICAgLy8gQ29udGVudFZhbHVlcyBhZnRlciB0aGUgaW5zZXJ0aW9uLCB3aGljaCBtYWtlIHRoZSByZXN1bHQgb2YgaGFzaENvZGUoKQotICAgICAgICAgICAgLy8gY2hhbmdlcy4uLgotICAgICAgICAgICAgbU1pbWVUeXBlVG9FeHBlY3RlZENvbnRlbnRWYWx1ZXMucHV0KAotICAgICAgICAgICAgICAgICAgICBhY2NlcHRhbmJsZU1pbWVUeXBlLCBuZXcgQXJyYXlMaXN0PENvbnRlbnRWYWx1ZXM+KCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYWRkRXhwZWN0ZWRDb250ZW50VmFsdWVzKENvbnRlbnRWYWx1ZXMgZXhwZWN0ZWRDb250ZW50VmFsdWVzKSB7Ci0gICAgICAgIGZpbmFsIFN0cmluZyBtaW1lVHlwZSA9IGV4cGVjdGVkQ29udGVudFZhbHVlcy5nZXRBc1N0cmluZyhEYXRhLk1JTUVUWVBFKTsKLSAgICAgICAgaWYgKCFzS25vd25NaW1lVHlwZVNldC5jb250YWlucyhtaW1lVHlwZSkpIHsKLSAgICAgICAgICAgIFRlc3RDYXNlLmZhaWwoU3RyaW5nLmZvcm1hdCgKLSAgICAgICAgICAgICAgICAgICAgIlVua25vdyBNaW1lVHlwZSAlcyBpbiB0aGUgdGVzdCBjb2RlLiBUZXN0IGNvZGUgc2hvdWxkIGJlIGJyb2tlbi4iLAotICAgICAgICAgICAgICAgICAgICBtaW1lVHlwZSkpOwotICAgICAgICB9Ci0KLSAgICAgICAgZmluYWwgQ29sbGVjdGlvbjxDb250ZW50VmFsdWVzPiBjb250ZW50VmFsdWVzQ29sbGVjdGlvbiA9Ci0gICAgICAgICAgICAgICAgbU1pbWVUeXBlVG9FeHBlY3RlZENvbnRlbnRWYWx1ZXMuZ2V0KG1pbWVUeXBlKTsKLSAgICAgICAgY29udGVudFZhbHVlc0NvbGxlY3Rpb24uYWRkKGV4cGVjdGVkQ29udGVudFZhbHVlcyk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIENvbnRlbnRQcm92aWRlclJlc3VsdFtdIGFwcGx5QmF0Y2goCi0gICAgICAgICAgICBBcnJheUxpc3Q8Q29udGVudFByb3ZpZGVyT3BlcmF0aW9uPiBvcGVyYXRpb25zKSB7Ci0gICAgICAgIGlmIChvcGVyYXRpb25zID09IG51bGwpIHsKLSAgICAgICAgICAgIFRlc3RDYXNlLmZhaWwoIlRoZXJlIGlzIG5vIG9wZXJhdGlvbi4iKTsKLSAgICAgICAgfQotCi0gICAgICAgIGZpbmFsIGludCBzaXplID0gb3BlcmF0aW9ucy5zaXplKCk7Ci0gICAgICAgIENvbnRlbnRQcm92aWRlclJlc3VsdFtdIGZha2VSZXN1bHRBcnJheSA9IG5ldyBDb250ZW50UHJvdmlkZXJSZXN1bHRbc2l6ZV07Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0gICAgICAgICAgICBVcmkgdXJpID0gVXJpLndpdGhBcHBlbmRlZFBhdGgoUmF3Q29udGFjdHMuQ09OVEVOVF9VUkksIFN0cmluZy52YWx1ZU9mKGkpKTsKLSAgICAgICAgICAgIGZha2VSZXN1bHRBcnJheVtpXSA9IG5ldyBDb250ZW50UHJvdmlkZXJSZXN1bHQodXJpKTsKLSAgICAgICAgfQotCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0gICAgICAgICAgICBDb250ZW50UHJvdmlkZXJPcGVyYXRpb24gb3BlcmF0aW9uID0gb3BlcmF0aW9ucy5nZXQoaSk7Ci0gICAgICAgICAgICBDb250ZW50VmFsdWVzIGNvbnRlbnRWYWx1ZXMgPSBvcGVyYXRpb24ucmVzb2x2ZVZhbHVlQmFja1JlZmVyZW5jZXMoCi0gICAgICAgICAgICAgICAgICAgIGZha2VSZXN1bHRBcnJheSwgaSk7Ci0gICAgICAgIH0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLSAgICAgICAgICAgIENvbnRlbnRQcm92aWRlck9wZXJhdGlvbiBvcGVyYXRpb24gPSBvcGVyYXRpb25zLmdldChpKTsKLSAgICAgICAgICAgIENvbnRlbnRWYWx1ZXMgYWN0dWFsQ29udGVudFZhbHVlcyA9IG9wZXJhdGlvbi5yZXNvbHZlVmFsdWVCYWNrUmVmZXJlbmNlcygKLSAgICAgICAgICAgICAgICAgICAgZmFrZVJlc3VsdEFycmF5LCBpKTsKLSAgICAgICAgICAgIGZpbmFsIFVyaSB1cmkgPSBvcGVyYXRpb24uZ2V0VXJpKCk7Ci0gICAgICAgICAgICBpZiAodXJpLmVxdWFscyhSYXdDb250YWN0cy5DT05URU5UX1VSSSkpIHsKLSAgICAgICAgICAgICAgICBUZXN0Q2FzZS5hc3NlcnROdWxsKGFjdHVhbENvbnRlbnRWYWx1ZXMuZ2V0KFJhd0NvbnRhY3RzLkFDQ09VTlRfTkFNRSkpOwotICAgICAgICAgICAgICAgIFRlc3RDYXNlLmFzc2VydE51bGwoYWN0dWFsQ29udGVudFZhbHVlcy5nZXQoUmF3Q29udGFjdHMuQUNDT1VOVF9UWVBFKSk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKHVyaS5lcXVhbHMoRGF0YS5DT05URU5UX1VSSSkpIHsKLSAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgbWltZVR5cGUgPSBhY3R1YWxDb250ZW50VmFsdWVzLmdldEFzU3RyaW5nKERhdGEuTUlNRVRZUEUpOwotICAgICAgICAgICAgICAgIGlmICghc0tub3duTWltZVR5cGVTZXQuY29udGFpbnMobWltZVR5cGUpKSB7Ci0gICAgICAgICAgICAgICAgICAgIFRlc3RDYXNlLmZhaWwoU3RyaW5nLmZvcm1hdCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVW5rbm93biBNaW1lVHlwZSAlcy4gUHJvYmFibHkgYWRkZWQgYWZ0ZXIgZGV2ZWxvcGluZyB0aGlzIHRlc3QiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbWVUeXBlKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIC8vIFJlbW92ZSBkYXRhIG1lYW5pbmdsZXNzIGluIHRoaXMgdW5pdCB0ZXN0cy4KLSAgICAgICAgICAgICAgICAvLyBTcGVjaWZpY2FsbHksIERhdGEuREFUQTEgLSBEQVRBNyBhcmUgc2V0IHRvIG51bGwgb3IgZW1wdHkgU3RyaW5nCi0gICAgICAgICAgICAgICAgLy8gcmVnYXJkbGVzcyBvZiB0aGUgaW5wdXQsIGJ1dCBpdCBtYXkgY2hhbmdlIGRlcGVuZGluZyBvbiBob3cKLSAgICAgICAgICAgICAgICAvLyByZXNvbHZlci1yZWxhdGVkIGNvZGUgaGFuZGxlcyBpdC4KLSAgICAgICAgICAgICAgICAvLyBIZXJlLCB3ZSBpZ25vcmUgdGhlc2UgaW1wbGVtZW50YXRpb24tZGVwZW5kZW50IHNwZWNzIGFuZAotICAgICAgICAgICAgICAgIC8vIGp1c3QgY2hlY2sgd2hldGhlciB2Q2FyZCBpbXBvcnRlciBjb3JyZWN0bHkgaW5zZXJ0cyByZWxsZXZlbnQgZGF0YS4KLSAgICAgICAgICAgICAgICBTZXQ8U3RyaW5nPiBrZXlUb0JlUmVtb3ZlZCA9IG5ldyBIYXNoU2V0PFN0cmluZz4oKTsKLSAgICAgICAgICAgICAgICBmb3IgKEVudHJ5PFN0cmluZywgT2JqZWN0PiBlbnRyeSA6IGFjdHVhbENvbnRlbnRWYWx1ZXMudmFsdWVTZXQoKSkgewotICAgICAgICAgICAgICAgICAgICBPYmplY3QgdmFsdWUgPSBlbnRyeS5nZXRWYWx1ZSgpOwotICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCB8fCBUZXh0VXRpbHMuaXNFbXB0eSh2YWx1ZS50b1N0cmluZygpKSkgewotICAgICAgICAgICAgICAgICAgICAgICAga2V5VG9CZVJlbW92ZWQuYWRkKGVudHJ5LmdldEtleSgpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBmb3IgKFN0cmluZyBrZXk6IGtleVRvQmVSZW1vdmVkKSB7Ci0gICAgICAgICAgICAgICAgICAgIGFjdHVhbENvbnRlbnRWYWx1ZXMucmVtb3ZlKGtleSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIC8qIGZvciB0ZXN0aW5nCi0gICAgICAgICAgICAgICAgTG9nLmQoIkBAQCIsCi0gICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcuZm9ybWF0KCJNaW1lVHlwZTogJXMsIGRhdGE6ICVzIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWltZVR5cGUsIGFjdHVhbENvbnRlbnRWYWx1ZXMudG9TdHJpbmcoKSkpOyAqLwotICAgICAgICAgICAgICAgIC8vIFJlbW92ZSBSQVdfQ09OVEFDVF9JRCBlbnRyeSBqdXN0IGZvciBzYWZldHksIHNpbmNlIHdlIGRvIG5vdCBjYXJlCi0gICAgICAgICAgICAgICAgLy8gaG93IHJlc29sdmVyLXJlbGF0ZWQgY29kZSBoYW5kbGVzIHRoZSBlbnRyeSBpbiB0aGlzIHVuaXQgdGVzdCwKLSAgICAgICAgICAgICAgICBpZiAoYWN0dWFsQ29udGVudFZhbHVlcy5jb250YWluc0tleShEYXRhLlJBV19DT05UQUNUX0lEKSkgewotICAgICAgICAgICAgICAgICAgICBhY3R1YWxDb250ZW50VmFsdWVzLnJlbW92ZShEYXRhLlJBV19DT05UQUNUX0lEKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZmluYWwgQ29sbGVjdGlvbjxDb250ZW50VmFsdWVzPiBjb250ZW50VmFsdWVzQ29sbGVjdGlvbiA9Ci0gICAgICAgICAgICAgICAgICAgIG1NaW1lVHlwZVRvRXhwZWN0ZWRDb250ZW50VmFsdWVzLmdldChtaW1lVHlwZSk7Ci0gICAgICAgICAgICAgICAgaWYgKGNvbnRlbnRWYWx1ZXNDb2xsZWN0aW9uLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgICAgICAgICBUZXN0Q2FzZS5mYWlsKCJDb250ZW50VmFsdWVzIGZvciBNaW1lVHlwZSAiICsgbWltZVR5cGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgaXMgbm90IGV4cGVjdGVkIGF0IGFsbCAoIiArIGFjdHVhbENvbnRlbnRWYWx1ZXMgKyAiKSIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBib29sZWFuIGNoZWNrZWQgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICBmb3IgKENvbnRlbnRWYWx1ZXMgZXhwZWN0ZWRDb250ZW50VmFsdWVzIDogY29udGVudFZhbHVlc0NvbGxlY3Rpb24pIHsKLSAgICAgICAgICAgICAgICAgICAgLypmb3IgdGVzdGluZwotICAgICAgICAgICAgICAgICAgICBMb2cuZCgiQEBAIiwgImV4cGVjdGVkOiAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBjb252ZXJ0VG9FYXNpbHlSZWFkYWJsZVN0cmluZyhleHBlY3RlZENvbnRlbnRWYWx1ZXMpKTsKLSAgICAgICAgICAgICAgICAgICAgTG9nLmQoIkBAQCIsICJhY3R1YWwgIDogIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgY29udmVydFRvRWFzaWx5UmVhZGFibGVTdHJpbmcoYWN0dWFsQ29udGVudFZhbHVlcykpOyovCi0gICAgICAgICAgICAgICAgICAgIGlmIChlcXVhbHNGb3JDb250ZW50VmFsdWVzKGV4cGVjdGVkQ29udGVudFZhbHVlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3R1YWxDb250ZW50VmFsdWVzKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgVGVzdENhc2UuYXNzZXJ0VHJ1ZShjb250ZW50VmFsdWVzQ29sbGVjdGlvbi5yZW1vdmUoZXhwZWN0ZWRDb250ZW50VmFsdWVzKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjaGVja2VkID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmICghY2hlY2tlZCkgewotICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmdCdWlsZGVyIGJ1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotICAgICAgICAgICAgICAgICAgICBidWlsZGVyLmFwcGVuZCgiXG4iKTsKLSAgICAgICAgICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoIlVuZXhwZWN0ZWQ6ICIpOwotICAgICAgICAgICAgICAgICAgICBidWlsZGVyLmFwcGVuZChjb252ZXJ0VG9FYXNpbHlSZWFkYWJsZVN0cmluZyhhY3R1YWxDb250ZW50VmFsdWVzKSk7Ci0gICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKCJcbiIpOwotICAgICAgICAgICAgICAgICAgICBidWlsZGVyLmFwcGVuZCgiRXhwZWN0ZWQgIDogIik7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoQ29udGVudFZhbHVlcyBleHBlY3RlZENvbnRlbnRWYWx1ZXMgOiBjb250ZW50VmFsdWVzQ29sbGVjdGlvbikgewotICAgICAgICAgICAgICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoY29udmVydFRvRWFzaWx5UmVhZGFibGVTdHJpbmcoZXhwZWN0ZWRDb250ZW50VmFsdWVzKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgVGVzdENhc2UuZmFpbChidWlsZGVyLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgVGVzdENhc2UuZmFpbCgiVW5leHBlY3RlZCBVcmkgaGFzIGNvbWU6ICIgKyB1cmkpOwotICAgICAgICAgICAgfQotICAgICAgICB9ICAvLyBmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotICAgICAgICByZXR1cm4gZmFrZVJlc3VsdEFycmF5OwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHZlcmlmeSgpIHsKLSAgICAgICAgU3RyaW5nQnVpbGRlciBidWlsZGVyID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLSAgICAgICAgZm9yIChDb2xsZWN0aW9uPENvbnRlbnRWYWx1ZXM+IGNvbnRlbnRWYWx1ZXNDb2xsZWN0aW9uIDoKLSAgICAgICAgICAgICAgICBtTWltZVR5cGVUb0V4cGVjdGVkQ29udGVudFZhbHVlcy52YWx1ZXMoKSkgewotICAgICAgICAgICAgZm9yIChDb250ZW50VmFsdWVzIGV4cGVjdGVkQ29udGVudFZhbHVlczogY29udGVudFZhbHVlc0NvbGxlY3Rpb24pIHsKLSAgICAgICAgICAgICAgICBidWlsZGVyLmFwcGVuZChjb252ZXJ0VG9FYXNpbHlSZWFkYWJsZVN0cmluZyhleHBlY3RlZENvbnRlbnRWYWx1ZXMpKTsKLSAgICAgICAgICAgICAgICBidWlsZGVyLmFwcGVuZCgiXG4iKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAoYnVpbGRlci5sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyBmYWlsTXNnID0KLSAgICAgICAgICAgICAgICAiVGhlcmUgaXMoYXJlKSByZW1haW5pbmcgZXhwZWN0ZWQgQ29udGVudFZhbHVlcyBpbnN0YW5jZShzKTogXG4iCi0gICAgICAgICAgICAgICAgICAgICsgYnVpbGRlci50b1N0cmluZygpOwotICAgICAgICAgICAgVGVzdENhc2UuZmFpbChmYWlsTXNnKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFV0aWxpdHkgbWV0aG9kIHRvIHByaW50IENvbnRlbnRWYWx1ZXMgd2hvc2UgY29udGVudCBpcyBwcmludGVkIHdpdGggc29ydGVkIGtleXMuCi0gICAgICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgY29udmVydFRvRWFzaWx5UmVhZGFibGVTdHJpbmcoQ29udGVudFZhbHVlcyBjb250ZW50VmFsdWVzKSB7Ci0gICAgICAgIGlmIChjb250ZW50VmFsdWVzID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiAibnVsbCI7Ci0gICAgICAgIH0KLSAgICAgICAgU3RyaW5nIG1pbWVUeXBlVmFsdWUgPSAiIjsKLSAgICAgICAgU29ydGVkTWFwPFN0cmluZywgU3RyaW5nPiBzb3J0ZWRNYXAgPSBuZXcgVHJlZU1hcDxTdHJpbmcsIFN0cmluZz4oKTsKLSAgICAgICAgZm9yIChFbnRyeTxTdHJpbmcsIE9iamVjdD4gZW50cnkgOiBjb250ZW50VmFsdWVzLnZhbHVlU2V0KCkpIHsKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyBrZXkgPSBlbnRyeS5nZXRLZXkoKTsKLSAgICAgICAgICAgIGZpbmFsIE9iamVjdCB2YWx1ZSA9IGVudHJ5LmdldFZhbHVlKCk7Ci0gICAgICAgICAgICBmaW5hbCBTdHJpbmcgdmFsdWVTdHJpbmcgPSAodmFsdWUgIT0gbnVsbCA/IHZhbHVlLnRvU3RyaW5nKCkgOiBudWxsKTsKLSAgICAgICAgICAgIGlmIChEYXRhLk1JTUVUWVBFLmVxdWFscyhrZXkpKSB7Ci0gICAgICAgICAgICAgICAgbWltZVR5cGVWYWx1ZSA9IHZhbHVlU3RyaW5nOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBUZXN0Q2FzZS5hc3NlcnROb3ROdWxsKGtleSk7Ci0gICAgICAgICAgICAgICAgc29ydGVkTWFwLnB1dChrZXksIHZhbHVlU3RyaW5nKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBTdHJpbmdCdWlsZGVyIGJ1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotICAgICAgICBidWlsZGVyLmFwcGVuZChEYXRhLk1JTUVUWVBFKTsKLSAgICAgICAgYnVpbGRlci5hcHBlbmQoJz0nKTsKLSAgICAgICAgYnVpbGRlci5hcHBlbmQobWltZVR5cGVWYWx1ZSk7Ci0gICAgICAgIGZvciAoRW50cnk8U3RyaW5nLCBTdHJpbmc+IGVudHJ5IDogc29ydGVkTWFwLmVudHJ5U2V0KCkpIHsKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyBrZXkgPSBlbnRyeS5nZXRLZXkoKTsKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyB2YWx1ZSA9IGVudHJ5LmdldFZhbHVlKCk7Ci0gICAgICAgICAgICBidWlsZGVyLmFwcGVuZCgnICcpOwotICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoa2V5KTsKLSAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKCI9XCIiKTsKLSAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKHZhbHVlKTsKLSAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKCciJyk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGJ1aWxkZXIudG9TdHJpbmcoKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGVxdWFsc0ZvckNvbnRlbnRWYWx1ZXMoCi0gICAgICAgICAgICBmaW5hbCBDb250ZW50VmFsdWVzIGV4cGVjdGVkLCBmaW5hbCBDb250ZW50VmFsdWVzIGFjdHVhbCkgewotICAgICAgICBpZiAoZXhwZWN0ZWQgPT0gYWN0dWFsKSB7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfSBlbHNlIGlmIChleHBlY3RlZCA9PSBudWxsIHx8IGFjdHVhbCA9PSBudWxsIHx8IGV4cGVjdGVkLnNpemUoKSAhPSBhY3R1YWwuc2l6ZSgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICBmb3IgKEVudHJ5PFN0cmluZywgT2JqZWN0PiBlbnRyeSA6IGV4cGVjdGVkLnZhbHVlU2V0KCkpIHsKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyBrZXkgPSBlbnRyeS5nZXRLZXkoKTsKLSAgICAgICAgICAgIGZpbmFsIE9iamVjdCB2YWx1ZSA9IGVudHJ5LmdldFZhbHVlKCk7Ci0gICAgICAgICAgICBpZiAoIWFjdHVhbC5jb250YWluc0tleShrZXkpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gVHlwZSBtaXNtYXRjaCB1c3VhbGwgaGFwcGVucyBhcyBpbXBvcnRlciBkb2Vzbid0IGNhcmUgdGhlIHR5cGUgb2YgZWFjaCB2YWx1ZS4KLSAgICAgICAgICAgIC8vIEZvciBleGFtcGxlLCB2YXJpYWJsZSB0eXBlIG1pZ2h0IGJlIEludGVnZXIgd2hlbiBpbXBvcnRpbmcgdGhlIHR5cGUgb2YgVEVMLAotICAgICAgICAgICAgLy8gd2hpbGUgdmFyaWFibGUgdHlwZSB3b3VsZCBiZSBTdHJpbmcgd2hlbiBpbXBvcnRpbmcgdGhlIHR5cGUgb2YgUkVMQVRJT04uCi0gICAgICAgICAgICBmaW5hbCBPYmplY3QgYWN0dWFsVmFsdWUgPSBhY3R1YWwuZ2V0KGtleSk7Ci0gICAgICAgICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBieXRlW10pIHsKLSAgICAgICAgICAgICAgICBpZiAoIUFycmF5cy5lcXVhbHMoKGJ5dGVbXSl2YWx1ZSwgKGJ5dGVbXSlhY3R1YWxWYWx1ZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgYnl0ZVtdIGUgPSAoYnl0ZVtdKXZhbHVlOwotICAgICAgICAgICAgICAgICAgICBieXRlW10gYSA9IChieXRlW10pYWN0dWFsVmFsdWU7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKCF2YWx1ZS5lcXVhbHMoYWN0dWFsVmFsdWUpICYmCi0gICAgICAgICAgICAgICAgICAgICF2YWx1ZS50b1N0cmluZygpLmVxdWFscyhhY3R1YWxWYWx1ZS50b1N0cmluZygpKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvcGltL3ZjYXJkL3Rlc3RfdXRpbHMvSW1wb3J0VGVzdFJlc29sdmVyLmphdmEgYi9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9waW0vdmNhcmQvdGVzdF91dGlscy9JbXBvcnRUZXN0UmVzb2x2ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTgyMmFmZS4uMDAwMDAwMAotLS0gYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9waW0vdmNhcmQvdGVzdF91dGlscy9JbXBvcnRUZXN0UmVzb2x2ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBhbmRyb2lkLnBpbS52Y2FyZC50ZXN0X3V0aWxzOwotCi1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRQcm92aWRlck9wZXJhdGlvbjsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFByb3ZpZGVyUmVzdWx0OwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZW50VmFsdWVzOwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5SYXdDb250YWN0czsKLWltcG9ydCBhbmRyb2lkLnRlc3QuQW5kcm9pZFRlc3RDYXNlOwotaW1wb3J0IGFuZHJvaWQudGVzdC5tb2NrLk1vY2tDb250ZW50UmVzb2x2ZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotCi1wdWJsaWMgY2xhc3MgSW1wb3J0VGVzdFJlc29sdmVyIGV4dGVuZHMgTW9ja0NvbnRlbnRSZXNvbHZlciB7Ci0gICAgcHJpdmF0ZSBmaW5hbCBJbXBvcnRUZXN0UHJvdmlkZXIgbVByb3ZpZGVyOwotCi0gICAgcHVibGljIEltcG9ydFRlc3RSZXNvbHZlcihBbmRyb2lkVGVzdENhc2UgYW5kcm9pZFRlc3RDYXNlKSB7Ci0gICAgICAgIG1Qcm92aWRlciA9IG5ldyBJbXBvcnRUZXN0UHJvdmlkZXIoYW5kcm9pZFRlc3RDYXNlKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgQ29udGVudFByb3ZpZGVyUmVzdWx0W10gYXBwbHlCYXRjaChTdHJpbmcgYXV0aG9yaXR5LAotICAgICAgICAgICAgQXJyYXlMaXN0PENvbnRlbnRQcm92aWRlck9wZXJhdGlvbj4gb3BlcmF0aW9ucykgewotICAgICAgICBlcXVhbHNTdHJpbmcoYXV0aG9yaXR5LCBSYXdDb250YWN0cy5DT05URU5UX1VSSS50b1N0cmluZygpKTsKLSAgICAgICAgcmV0dXJuIG1Qcm92aWRlci5hcHBseUJhdGNoKG9wZXJhdGlvbnMpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFkZEV4cGVjdGVkQ29udGVudFZhbHVlcyhDb250ZW50VmFsdWVzIGV4cGVjdGVkQ29udGVudFZhbHVlcykgewotICAgICAgICBtUHJvdmlkZXIuYWRkRXhwZWN0ZWRDb250ZW50VmFsdWVzKGV4cGVjdGVkQ29udGVudFZhbHVlcyk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdmVyaWZ5KCkgewotICAgICAgICBtUHJvdmlkZXIudmVyaWZ5KCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBlcXVhbHNTdHJpbmcoU3RyaW5nIGEsIFN0cmluZyBiKSB7Ci0gICAgICAgIGlmIChhID09IG51bGwgfHwgYS5sZW5ndGgoKSA9PSAwKSB7Ci0gICAgICAgICAgICByZXR1cm4gYiA9PSBudWxsIHx8IGIubGVuZ3RoKCkgPT0gMDsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiBhLmVxdWFscyhiKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL3BpbS92Y2FyZC90ZXN0X3V0aWxzL0xpbmVWZXJpZmllci5qYXZhIGIvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvcGltL3ZjYXJkL3Rlc3RfdXRpbHMvTGluZVZlcmlmaWVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUzMTRhYzUuLjAwMDAwMDAKLS0tIGEvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvcGltL3ZjYXJkL3Rlc3RfdXRpbHMvTGluZVZlcmlmaWVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2UgYW5kcm9pZC5waW0udmNhcmQudGVzdF91dGlsczsKLQotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwotaW1wb3J0IGFuZHJvaWQucGltLnZjYXJkLlZDYXJkQ29tcG9zZXI7Ci1pbXBvcnQgYW5kcm9pZC50ZXN0LkFuZHJvaWRUZXN0Q2FzZTsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci0KLXB1YmxpYyBjbGFzcyBMaW5lVmVyaWZpZXIgaW1wbGVtZW50cyBWQ2FyZENvbXBvc2VyLk9uZUVudHJ5SGFuZGxlciB7Ci0gICAgcHJpdmF0ZSBmaW5hbCBBbmRyb2lkVGVzdENhc2UgbUFuZHJvaWRUZXN0Q2FzZTsKLSAgICBwcml2YXRlIGZpbmFsIEFycmF5TGlzdDxMaW5lVmVyaWZpZXJFbGVtPiBtTGluZVZlcmlmaWVyRWxlbUxpc3Q7Ci0gICAgcHJpdmF0ZSBpbnQgbVZDYXJkVHlwZTsKLSAgICBwcml2YXRlIGludCBpbmRleDsKLQotICAgIHB1YmxpYyBMaW5lVmVyaWZpZXIoQW5kcm9pZFRlc3RDYXNlIGFuZHJvaWRUZXN0Q2FzZSwgaW50IHZjYXJkVHlwZSkgewotICAgICAgICBtQW5kcm9pZFRlc3RDYXNlID0gYW5kcm9pZFRlc3RDYXNlOwotICAgICAgICBtTGluZVZlcmlmaWVyRWxlbUxpc3QgPSBuZXcgQXJyYXlMaXN0PExpbmVWZXJpZmllckVsZW0+KCk7Ci0gICAgICAgIG1WQ2FyZFR5cGUgPSB2Y2FyZFR5cGU7Ci0gICAgfQotCi0gICAgcHVibGljIExpbmVWZXJpZmllckVsZW0gYWRkTGluZVZlcmlmaWVyRWxlbSgpIHsKLSAgICAgICAgTGluZVZlcmlmaWVyRWxlbSBsaW5lVmVyaWZpZXIgPSBuZXcgTGluZVZlcmlmaWVyRWxlbShtQW5kcm9pZFRlc3RDYXNlLCBtVkNhcmRUeXBlKTsKLSAgICAgICAgbUxpbmVWZXJpZmllckVsZW1MaXN0LmFkZChsaW5lVmVyaWZpZXIpOwotICAgICAgICByZXR1cm4gbGluZVZlcmlmaWVyOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHZlcmlmeShTdHJpbmcgdmNhcmQpIHsKLSAgICAgICAgaWYgKGluZGV4ID49IG1MaW5lVmVyaWZpZXJFbGVtTGlzdC5zaXplKCkpIHsKLSAgICAgICAgICAgIFRlc3RDYXNlLmZhaWwoIkluc3VmZmljaWVudCBudW1iZXIgb2YgTGluZVZlcmlmaWVyICgiICsgaW5kZXggKyAiKSIpOwotICAgICAgICB9Ci0KLSAgICAgICAgZmluYWwgTGluZVZlcmlmaWVyRWxlbSBsaW5lVmVyaWZpZXIgPSBtTGluZVZlcmlmaWVyRWxlbUxpc3QuZ2V0KGluZGV4KTsKLSAgICAgICAgbGluZVZlcmlmaWVyLnZlcmlmeSh2Y2FyZCk7Ci0KLSAgICAgICAgaW5kZXgrKzsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBvbkVudHJ5Q3JlYXRlZChTdHJpbmcgdmNhcmQpIHsKLSAgICAgICAgdmVyaWZ5KHZjYXJkKTsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gb25Jbml0KENvbnRleHQgY29udGV4dCkgewotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBvblRlcm1pbmF0ZSgpIHsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9waW0vdmNhcmQvdGVzdF91dGlscy9MaW5lVmVyaWZpZXJFbGVtLmphdmEgYi9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9waW0vdmNhcmQvdGVzdF91dGlscy9MaW5lVmVyaWZpZXJFbGVtLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUyM2E5Y2QuLjAwMDAwMDAKLS0tIGEvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvcGltL3ZjYXJkL3Rlc3RfdXRpbHMvTGluZVZlcmlmaWVyRWxlbS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdAotICogdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKLSAqIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgV0lUSE9VVAotICogV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlCi0gKiBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlcgotICogdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2UgYW5kcm9pZC5waW0udmNhcmQudGVzdF91dGlsczsKLQotaW1wb3J0IGFuZHJvaWQucGltLnZjYXJkLlZDYXJkQ29uZmlnOwotaW1wb3J0IGFuZHJvaWQudGVzdC5BbmRyb2lkVGVzdENhc2U7Ci1pbXBvcnQgYW5kcm9pZC50ZXh0LlRleHRVdGlsczsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLXB1YmxpYyBjbGFzcyBMaW5lVmVyaWZpZXJFbGVtIHsKLSAgICBwcml2YXRlIGZpbmFsIExpc3Q8U3RyaW5nPiBtRXhwZWN0ZWRMaW5lTGlzdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotICAgIHByaXZhdGUgZmluYWwgaW50IG1WQ2FyZFR5cGU7Ci0KLSAgICBwdWJsaWMgTGluZVZlcmlmaWVyRWxlbShBbmRyb2lkVGVzdENhc2UgYW5kcm9pZFRlc3RDYXNlLCBpbnQgdmNhcmRUeXBlKSB7Ci0gICAgICAgIG1WQ2FyZFR5cGUgPSB2Y2FyZFR5cGU7Ci0gICAgfQotCi0gICAgcHVibGljIExpbmVWZXJpZmllckVsZW0gYWRkRXhwZWN0ZWQoZmluYWwgU3RyaW5nIGxpbmUpIHsKLSAgICAgICAgaWYgKCFUZXh0VXRpbHMuaXNFbXB0eShsaW5lKSkgewotICAgICAgICAgICAgbUV4cGVjdGVkTGluZUxpc3QuYWRkKGxpbmUpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0aGlzOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHZlcmlmeShmaW5hbCBTdHJpbmcgdmNhcmQpIHsKLSAgICAgICAgZmluYWwgU3RyaW5nW10gbGluZUFycmF5ID0gdmNhcmQuc3BsaXQoIlxccj9cXG4iKTsKLSAgICAgICAgZmluYWwgaW50IGxlbmd0aCA9IGxpbmVBcnJheS5sZW5ndGg7Ci0gICAgICAgIGJvb2xlYW4gYmVnaW5FeGlzdHMgPSBmYWxzZTsKLSAgICAgICAgYm9vbGVhbiBlbmRFeGlzdHMgPSBmYWxzZTsKLSAgICAgICAgYm9vbGVhbiB2ZXJzaW9uRXhpc3RzID0gZmFsc2U7Ci0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewotICAgICAgICAgICAgZmluYWwgU3RyaW5nIGxpbmUgPSBsaW5lQXJyYXlbaV07Ci0gICAgICAgICAgICBpZiAoVGV4dFV0aWxzLmlzRW1wdHkobGluZSkpIHsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKCJCRUdJTjpWQ0FSRCIuZXF1YWxzSWdub3JlQ2FzZShsaW5lKSkgewotICAgICAgICAgICAgICAgIGlmIChiZWdpbkV4aXN0cykgewotICAgICAgICAgICAgICAgICAgICBUZXN0Q2FzZS5mYWlsKCJNdWx0aXBsZSBcIkJFR0lOOlZDQVJEXCIgbGluZSBmb3VuZCIpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGJlZ2luRXhpc3RzID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIGlmICgiRU5EOlZDQVJEIi5lcXVhbHNJZ25vcmVDYXNlKGxpbmUpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGVuZEV4aXN0cykgewotICAgICAgICAgICAgICAgICAgICBUZXN0Q2FzZS5mYWlsKCJNdWx0aXBsZSBcIkVORDpWQ0FSRFwiIGxpbmUgZm91bmQiKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBlbmRFeGlzdHMgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKChWQ2FyZENvbmZpZy5pc1ZlcnNpb24yMShtVkNhcmRUeXBlKSA/ICJWRVJTSU9OOjIuMSIgOgotICAgICAgICAgICAgICAgIChWQ2FyZENvbmZpZy5pc1ZlcnNpb24zMChtVkNhcmRUeXBlKSA/ICJWRVJTSU9OOjMuMCIgOgotICAgICAgICAgICAgICAgICAgICAiVkVSU0lPTjo0LjAiKSkuZXF1YWxzSWdub3JlQ2FzZShsaW5lKSkgewotICAgICAgICAgICAgICAgIGlmICh2ZXJzaW9uRXhpc3RzKSB7Ci0gICAgICAgICAgICAgICAgICAgIFRlc3RDYXNlLmZhaWwoIk11bHRpcGxlIFZFUlNJT04gbGluZSArIGZvdW5kIik7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgdmVyc2lvbkV4aXN0cyA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKCFiZWdpbkV4aXN0cykgewotICAgICAgICAgICAgICAgIFRlc3RDYXNlLmZhaWwoIlByb3BlcnR5IG90aGVyIHRoYW4gQkVHSU4gY2FtZSBiZWZvcmUgQkVHSU4gcHJvcGVydHk6ICIgKyBsaW5lKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoZW5kRXhpc3RzKSB7Ci0gICAgICAgICAgICAgICAgVGVzdENhc2UuZmFpbCgiUHJvcGVydHkgb3RoZXIgdGhhbiBFTkQgY2FtZSBhZnRlciBFTkQgcHJvcGVydHk6ICIgKyBsaW5lKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgZmluYWwgaW50IGluZGV4ID0gbUV4cGVjdGVkTGluZUxpc3QuaW5kZXhPZihsaW5lKTsKLSAgICAgICAgICAgIGlmIChpbmRleCA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgbUV4cGVjdGVkTGluZUxpc3QucmVtb3ZlKGluZGV4KTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgVGVzdENhc2UuZmFpbCgiVW5leHBlY3RlZCBsaW5lOiAiICsgbGluZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoIW1FeHBlY3RlZExpbmVMaXN0LmlzRW1wdHkoKSkgewotICAgICAgICAgICAgU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICAgICAgICAgIGZvciAoU3RyaW5nIGV4cGVjdGVkTGluZSA6IG1FeHBlY3RlZExpbmVMaXN0KSB7Ci0gICAgICAgICAgICAgICAgYnVmZmVyLmFwcGVuZChleHBlY3RlZExpbmUpOwotICAgICAgICAgICAgICAgIGJ1ZmZlci5hcHBlbmQoIlxuIik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIFRlc3RDYXNlLmZhaWwoIkV4cGVjdGVkIGxpbmUocykgbm90IGZvdW5kOiIgKyBidWZmZXIudG9TdHJpbmcoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9waW0vdmNhcmQvdGVzdF91dGlscy9Qcm9wZXJ0eU5vZGUuamF2YSBiL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL3BpbS92Y2FyZC90ZXN0X3V0aWxzL1Byb3BlcnR5Tm9kZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZTdhZDhlLi4wMDAwMDAwCi0tLSBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL3BpbS92Y2FyZC90ZXN0X3V0aWxzL1Byb3BlcnR5Tm9kZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjA0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBhbmRyb2lkLnBpbS52Y2FyZC50ZXN0X3V0aWxzOwotCi1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRWYWx1ZXM7Ci1pbXBvcnQgYW5kcm9pZC5waW0udmNhcmQuVkNhcmRFbnRyeTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi0vKioKLSAqIDxwPgotICogVGhlIGNsYXNzIHJlcHJlc2VudGluZyBvbmUgcHJvcGVydHkgKGUuZy4gIk47RU5DT0RJTkc9VVRGLTg6ZmFtaWx5OmdpdmVuOm1pZGRsZTpwcmVmaXg6c3VmZml4IikuCi0gKiA8L3A+Ci0gKiA8cD4KLSAqIFByZXZpb3VzbHkgdXNlZCBpbiBtYWluIHZDYXJkIGhhbmRsaW5nIGNvZGUgYnV0IG5vdyBleGlzdHMgb25seSBmb3IgdGVzdGluZy4KLSAqIDwvcD4KLSAqIDxwPgotICogRXNwZWNpYWxseSB1c2VmdWwgZm9yIHRlc3RpbmcgcGFyc2VyIGNvZGUgKFZDYXJkUGFyc2VyKSwgc2luY2UgYWxsIHByb3BlcnRpZXMgY2FuIGJlCi0gKiBjaGVja2VkIHZpYSB0aGlzIGNsYXNzIHVubGlrZSB7QGxpbmsgVkNhcmRFbnRyeX0sIHdoaWNoIG9ubHkgZW1pdHMgdGhlIHJlc3VsdCBvZgotICogaW50ZXJwcmV0YXRpb24gb2YgdGhlIGNvbnRlbnQgb2YgZWFjaCB2Q2FyZC4gV2UgY2Fubm90IGtub3cgd2hldGhlciB2Q2FyZCBwYXJzZXIgb3IKLSAqIHtAbGluayBWQ2FyZEVudHJ5fSBpcyB3cm9uZyB3aXRob3V0IHRoaXMgY2xhc3MuCi0gKiA8L3A+Ci0gKi8KLXB1YmxpYyBjbGFzcyBQcm9wZXJ0eU5vZGUgewotICAgIHB1YmxpYyBTdHJpbmcgcHJvcE5hbWU7Ci0gICAgcHVibGljIFN0cmluZyBwcm9wVmFsdWU7Ci0gICAgcHVibGljIExpc3Q8U3RyaW5nPiBwcm9wVmFsdWVfdmVjdG9yOwotCi0gICAgLyoqIFN0b3JlIHZhbHVlIGFzIGJ5dGVbXSxhZnRlciBkZWNvZGUuCi0gICAgICogVXNlZCB3aGVuIHByb3BWYWx1ZSBpcyBlbmNvZGVkIGJ5IHNvbWV0aGluZyBsaWtlIEJBU0U2NCwgUVVPVEVELVBSSU5UQUJMRSwgZXRjLgotICAgICAqLwotICAgIHB1YmxpYyBieXRlW10gcHJvcFZhbHVlX2J5dGVzOwotCi0gICAgLyoqCi0gICAgICogcGFyYW0gc3RvcmU6IGtleT1wYXJhbVR5cGUsIHZhbHVlPXBhcmFtVmFsdWUKLSAgICAgKiBOb3RlIHRoYXQgY3VycmVudGx5IFByb3BlcnR5Tm9kZSBjbGFzcyBkb2VzIG5vdCBzdXBwb3J0IG11bHRpcGxlIHBhcmFtLXZhbHVlcwotICAgICAqIGRlZmluZWQgaW4gdkNhcmQgMy4wIChTZWUgYWxzbyBSRkMgMjQyNikuIG11bHRpcGxlLXZhbHVlcyBhcmUgc3RvcmVkIGFzCi0gICAgICogb25lIFN0cmluZyB2YWx1ZSBsaWtlICJBLEIiLCBub3QgWyJBIiwgIkIiXS4uLgotICAgICAqIFRPRE86IGZpeCB0aGlzLiAKLSAgICAgKi8KLSAgICBwdWJsaWMgQ29udGVudFZhbHVlcyBwYXJhbU1hcDsKLQotICAgIC8qKiBPbmx5IGZvciBUWVBFPT8/PyBwYXJhbSBzdG9yZS4gKi8KLSAgICBwdWJsaWMgU2V0PFN0cmluZz4gcGFyYW1NYXBfVFlQRTsKLQotICAgIC8qKiBTdG9yZSBncm91cCB2YWx1ZXMuIFVzZWQgb25seSBpbiBWQ2FyZC4gKi8KLSAgICBwdWJsaWMgU2V0PFN0cmluZz4gcHJvcEdyb3VwU2V0OwotICAgIAotICAgIHB1YmxpYyBQcm9wZXJ0eU5vZGUoKSB7Ci0gICAgICAgIHByb3BOYW1lID0gIiI7Ci0gICAgICAgIHByb3BWYWx1ZSA9ICIiOwotICAgICAgICBwcm9wVmFsdWVfdmVjdG9yID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0gICAgICAgIHBhcmFtTWFwID0gbmV3IENvbnRlbnRWYWx1ZXMoKTsKLSAgICAgICAgcGFyYW1NYXBfVFlQRSA9IG5ldyBIYXNoU2V0PFN0cmluZz4oKTsKLSAgICAgICAgcHJvcEdyb3VwU2V0ID0gbmV3IEhhc2hTZXQ8U3RyaW5nPigpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgUHJvcGVydHlOb2RlKAotICAgICAgICAgICAgU3RyaW5nIHByb3BOYW1lLCBTdHJpbmcgcHJvcFZhbHVlLCBMaXN0PFN0cmluZz4gcHJvcFZhbHVlX3ZlY3RvciwKLSAgICAgICAgICAgIGJ5dGVbXSBwcm9wVmFsdWVfYnl0ZXMsIENvbnRlbnRWYWx1ZXMgcGFyYW1NYXAsIFNldDxTdHJpbmc+IHBhcmFtTWFwX1RZUEUsCi0gICAgICAgICAgICBTZXQ8U3RyaW5nPiBwcm9wR3JvdXBTZXQpIHsKLSAgICAgICAgaWYgKHByb3BOYW1lICE9IG51bGwpIHsKLSAgICAgICAgICAgIHRoaXMucHJvcE5hbWUgPSBwcm9wTmFtZTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHRoaXMucHJvcE5hbWUgPSAiIjsKLSAgICAgICAgfQotICAgICAgICBpZiAocHJvcFZhbHVlICE9IG51bGwpIHsKLSAgICAgICAgICAgIHRoaXMucHJvcFZhbHVlID0gcHJvcFZhbHVlOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdGhpcy5wcm9wVmFsdWUgPSAiIjsKLSAgICAgICAgfQotICAgICAgICBpZiAocHJvcFZhbHVlX3ZlY3RvciAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0aGlzLnByb3BWYWx1ZV92ZWN0b3IgPSBwcm9wVmFsdWVfdmVjdG9yOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdGhpcy5wcm9wVmFsdWVfdmVjdG9yID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0gICAgICAgIH0KLSAgICAgICAgdGhpcy5wcm9wVmFsdWVfYnl0ZXMgPSBwcm9wVmFsdWVfYnl0ZXM7Ci0gICAgICAgIGlmIChwYXJhbU1hcCAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0aGlzLnBhcmFtTWFwID0gcGFyYW1NYXA7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB0aGlzLnBhcmFtTWFwID0gbmV3IENvbnRlbnRWYWx1ZXMoKTsKLSAgICAgICAgfQotICAgICAgICBpZiAocGFyYW1NYXBfVFlQRSAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0aGlzLnBhcmFtTWFwX1RZUEUgPSBwYXJhbU1hcF9UWVBFOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdGhpcy5wYXJhbU1hcF9UWVBFID0gbmV3IEhhc2hTZXQ8U3RyaW5nPigpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChwcm9wR3JvdXBTZXQgIT0gbnVsbCkgewotICAgICAgICAgICAgdGhpcy5wcm9wR3JvdXBTZXQgPSBwcm9wR3JvdXBTZXQ7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB0aGlzLnByb3BHcm91cFNldCA9IG5ldyBIYXNoU2V0PFN0cmluZz4oKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgewotICAgICAgICAvLyB2Q2FyZCBtYXkgY29udGFpbiBtb3JlIHRoYW4gb25lIHNhbWUgbGluZSBpbiBvbmUgZW50cnksIHdoaWxlIEhhc2hTZXQgb3IgYW55IG90aGVyCi0gICAgICAgIC8vIGxpYnJhcnkgd2hpY2ggdXRpbGl6ZSBoYXNoQ29kZSgpIGRvZXMgbm90IGhvbm9yIHRoYXQsIHNvIGludGVudGlvbmFsbHkgdGhyb3cgYW4KLSAgICAgICAgLy8gRXhjZXB0aW9uLgotICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgIlByb3BlcnR5Tm9kZSBkb2VzIG5vdCBwcm92aWRlIGhhc2hDb2RlKCkgaW1wbGVtZW50YXRpb24gaW50ZW50aW9uYWxseS4iKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgewotICAgICAgICBpZiAoIShvYmogaW5zdGFuY2VvZiBQcm9wZXJ0eU5vZGUpKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIFByb3BlcnR5Tm9kZSBub2RlID0gKFByb3BlcnR5Tm9kZSlvYmo7Ci0gICAgICAgIAotICAgICAgICBpZiAocHJvcE5hbWUgPT0gbnVsbCB8fCAhcHJvcE5hbWUuZXF1YWxzKG5vZGUucHJvcE5hbWUpKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0gZWxzZSBpZiAoIXBhcmFtTWFwX1RZUEUuZXF1YWxzKG5vZGUucGFyYW1NYXBfVFlQRSkpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfSBlbHNlIGlmICghcGFyYW1NYXBfVFlQRS5lcXVhbHMobm9kZS5wYXJhbU1hcF9UWVBFKSkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9IGVsc2UgaWYgKCFwcm9wR3JvdXBTZXQuZXF1YWxzKG5vZGUucHJvcEdyb3VwU2V0KSkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHByb3BWYWx1ZV9ieXRlcyAhPSBudWxsICYmIEFycmF5cy5lcXVhbHMocHJvcFZhbHVlX2J5dGVzLCBub2RlLnByb3BWYWx1ZV9ieXRlcykpIHsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaWYgKCFwcm9wVmFsdWUuZXF1YWxzKG5vZGUucHJvcFZhbHVlKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gVGhlIHZhbHVlIGluIHByb3BWYWx1ZV92ZWN0b3IgaXMgbm90IGRlY29kZWQgZXZlbiBpZiBpdCBzaG91bGQgYmUKLSAgICAgICAgICAgIC8vIGRlY29kZWQgYnkgQkFTRTY0IG9yIFFVT1RFRC1QUklOVEFCTEUuIFdoZW4gdGhlIHNpemUgb2YgcHJvcFZhbHVlX3ZlY3RvcgotICAgICAgICAgICAgLy8gaXMgMSwgdGhlIGVuY29kZWQgdmFsdWUgaXMgc3RvcmVkIGluIHByb3BWYWx1ZSwgc28gd2UgZG8gbm90IGhhdmUgdG8KLSAgICAgICAgICAgIC8vIGNoZWNrIGl0LgotICAgICAgICAgICAgcmV0dXJuIChwcm9wVmFsdWVfdmVjdG9yLmVxdWFscyhub2RlLnByb3BWYWx1ZV92ZWN0b3IpIHx8Ci0gICAgICAgICAgICAgICAgICAgIHByb3BWYWx1ZV92ZWN0b3Iuc2l6ZSgpID09IDEgfHwKLSAgICAgICAgICAgICAgICAgICAgbm9kZS5wcm9wVmFsdWVfdmVjdG9yLnNpemUoKSA9PSAxKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICBTdHJpbmdCdWlsZGVyIGJ1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotICAgICAgICBidWlsZGVyLmFwcGVuZCgicHJvcE5hbWU6ICIpOwotICAgICAgICBidWlsZGVyLmFwcGVuZChwcm9wTmFtZSk7Ci0gICAgICAgIGJ1aWxkZXIuYXBwZW5kKCIsIHBhcmFtTWFwOiAiKTsKLSAgICAgICAgYnVpbGRlci5hcHBlbmQocGFyYW1NYXAudG9TdHJpbmcoKSk7Ci0gICAgICAgIGJ1aWxkZXIuYXBwZW5kKCIsIHBhcmFtTWFwX1RZUEU6IFsiKTsKLSAgICAgICAgYm9vbGVhbiBmaXJzdCA9IHRydWU7Ci0gICAgICAgIGZvciAoU3RyaW5nIGVsZW0gOiBwYXJhbU1hcF9UWVBFKSB7Ci0gICAgICAgICAgICBpZiAoZmlyc3QpIHsKLSAgICAgICAgICAgICAgICBmaXJzdCA9IGZhbHNlOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBidWlsZGVyLmFwcGVuZCgiLCAiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKCciJyk7Ci0gICAgICAgICAgICBidWlsZGVyLmFwcGVuZChlbGVtKTsKLSAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKCciJyk7Ci0gICAgICAgIH0KLSAgICAgICAgYnVpbGRlci5hcHBlbmQoIl0iKTsKLSAgICAgICAgaWYgKCFwcm9wR3JvdXBTZXQuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICBidWlsZGVyLmFwcGVuZCgiLCBwcm9wR3JvdXBTZXQ6IFsiKTsKLSAgICAgICAgICAgIGZpcnN0ID0gdHJ1ZTsKLSAgICAgICAgICAgIGZvciAoU3RyaW5nIGVsZW0gOiBwcm9wR3JvdXBTZXQpIHsKLSAgICAgICAgICAgICAgICBpZiAoZmlyc3QpIHsKLSAgICAgICAgICAgICAgICAgICAgZmlyc3QgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBidWlsZGVyLmFwcGVuZCgiLCAiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoJyInKTsKLSAgICAgICAgICAgICAgICBidWlsZGVyLmFwcGVuZChlbGVtKTsKLSAgICAgICAgICAgICAgICBidWlsZGVyLmFwcGVuZCgnIicpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoIl0iKTsKLSAgICAgICAgfQotICAgICAgICBpZiAocHJvcFZhbHVlX3ZlY3RvciAhPSBudWxsICYmIHByb3BWYWx1ZV92ZWN0b3Iuc2l6ZSgpID4gMSkgewotICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoIiwgcHJvcFZhbHVlX3ZlY3RvciBzaXplOiAiKTsKLSAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKHByb3BWYWx1ZV92ZWN0b3Iuc2l6ZSgpKTsKLSAgICAgICAgfQotICAgICAgICBpZiAocHJvcFZhbHVlX2J5dGVzICE9IG51bGwpIHsKLSAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKCIsIHByb3BWYWx1ZV9ieXRlcyBzaXplOiAiKTsKLSAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKHByb3BWYWx1ZV9ieXRlcy5sZW5ndGgpOwotICAgICAgICB9Ci0gICAgICAgIGJ1aWxkZXIuYXBwZW5kKCIsIHByb3BWYWx1ZTogXCIiKTsKLSAgICAgICAgYnVpbGRlci5hcHBlbmQocHJvcFZhbHVlKTsKLSAgICAgICAgYnVpbGRlci5hcHBlbmQoIlwiIik7Ci0gICAgICAgIHJldHVybiBidWlsZGVyLnRvU3RyaW5nKCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvcGltL3ZjYXJkL3Rlc3RfdXRpbHMvUHJvcGVydHlOb2Rlc1ZlcmlmaWVyLmphdmEgYi9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9waW0vdmNhcmQvdGVzdF91dGlscy9Qcm9wZXJ0eU5vZGVzVmVyaWZpZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDIyOTI4NC4uMDAwMDAwMAotLS0gYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9waW0vdmNhcmQvdGVzdF91dGlscy9Qcm9wZXJ0eU5vZGVzVmVyaWZpZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBhbmRyb2lkLnBpbS52Y2FyZC50ZXN0X3V0aWxzOwotCi1pbXBvcnQgYW5kcm9pZC5waW0udmNhcmQuVkNhcmRQYXJzZXI7Ci1pbXBvcnQgYW5kcm9pZC5waW0udmNhcmQuVkNhcmRVdGlsczsKLWltcG9ydCBhbmRyb2lkLnBpbS52Y2FyZC5leGNlcHRpb24uVkNhcmRFeGNlcHRpb247Ci1pbXBvcnQgYW5kcm9pZC50ZXN0LkFuZHJvaWRUZXN0Q2FzZTsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1wdWJsaWMgY2xhc3MgUHJvcGVydHlOb2Rlc1ZlcmlmaWVyIGV4dGVuZHMgVk5vZGVCdWlsZGVyIHsKLSAgICBwcml2YXRlIGZpbmFsIExpc3Q8UHJvcGVydHlOb2Rlc1ZlcmlmaWVyRWxlbT4gbVByb3BlcnR5Tm9kZXNWZXJpZmllckVsZW1MaXN0OwotICAgIHByaXZhdGUgZmluYWwgQW5kcm9pZFRlc3RDYXNlIG1BbmRyb2lkVGVzdENhc2U7Ci0gICAgcHJpdmF0ZSBpbnQgbUluZGV4OwotCi0gICAgcHVibGljIFByb3BlcnR5Tm9kZXNWZXJpZmllcihBbmRyb2lkVGVzdENhc2UgdGVzdENhc2UpIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICAgICAgbVByb3BlcnR5Tm9kZXNWZXJpZmllckVsZW1MaXN0ID0gbmV3IEFycmF5TGlzdDxQcm9wZXJ0eU5vZGVzVmVyaWZpZXJFbGVtPigpOwotICAgICAgICBtQW5kcm9pZFRlc3RDYXNlID0gdGVzdENhc2U7Ci0gICAgfQotCi0gICAgcHVibGljIFByb3BlcnR5Tm9kZXNWZXJpZmllckVsZW0gYWRkUHJvcGVydHlOb2Rlc1ZlcmlmaWVyRWxlbSgpIHsKLSAgICAgICAgUHJvcGVydHlOb2Rlc1ZlcmlmaWVyRWxlbSBlbGVtID0gbmV3IFByb3BlcnR5Tm9kZXNWZXJpZmllckVsZW0obUFuZHJvaWRUZXN0Q2FzZSk7Ci0gICAgICAgIG1Qcm9wZXJ0eU5vZGVzVmVyaWZpZXJFbGVtTGlzdC5hZGQoZWxlbSk7Ci0gICAgICAgIHJldHVybiBlbGVtOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHZlcmlmeShpbnQgcmVzSWQsIGludCB2Y2FyZFR5cGUpIHRocm93cyBJT0V4Y2VwdGlvbiwgVkNhcmRFeGNlcHRpb24gewotICAgICAgICB2ZXJpZnkobUFuZHJvaWRUZXN0Q2FzZS5nZXRDb250ZXh0KCkuZ2V0UmVzb3VyY2VzKCkub3BlblJhd1Jlc291cmNlKHJlc0lkKSwgdmNhcmRUeXBlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB2ZXJpZnkoaW50IHJlc0lkLCBpbnQgdmNhcmRUeXBlLCBmaW5hbCBWQ2FyZFBhcnNlciBwYXJzZXIpCi0gICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFZDYXJkRXhjZXB0aW9uIHsKLSAgICAgICAgdmVyaWZ5KG1BbmRyb2lkVGVzdENhc2UuZ2V0Q29udGV4dCgpLmdldFJlc291cmNlcygpLm9wZW5SYXdSZXNvdXJjZShyZXNJZCksCi0gICAgICAgICAgICAgICAgdmNhcmRUeXBlLCBwYXJzZXIpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHZlcmlmeShJbnB1dFN0cmVhbSBpcywgaW50IHZjYXJkVHlwZSkgdGhyb3dzIElPRXhjZXB0aW9uLCBWQ2FyZEV4Y2VwdGlvbiB7Ci0gICAgICAgIGZpbmFsIFZDYXJkUGFyc2VyIHBhcnNlciA9IFZDYXJkVXRpbHMuZ2V0QXBwcm9wcmlhdGVQYXJzZXIodmNhcmRUeXBlKTsKLSAgICAgICAgdmVyaWZ5KGlzLCB2Y2FyZFR5cGUsIHBhcnNlcik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdmVyaWZ5KElucHV0U3RyZWFtIGlzLCBpbnQgdmNhcmRUeXBlLCBmaW5hbCBWQ2FyZFBhcnNlciBwYXJzZXIpCi0gICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFZDYXJkRXhjZXB0aW9uIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHBhcnNlci5wYXJzZShpcywgdGhpcyk7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBpZiAoaXMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIGlzLmNsb3NlKCk7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGVuZEVudHJ5KCkgewotICAgICAgICBzdXBlci5lbmRFbnRyeSgpOwotICAgICAgICBBbmRyb2lkVGVzdENhc2UuYXNzZXJ0VHJ1ZShtSW5kZXggPCBtUHJvcGVydHlOb2Rlc1ZlcmlmaWVyRWxlbUxpc3Quc2l6ZSgpKTsKLSAgICAgICAgQW5kcm9pZFRlc3RDYXNlLmFzc2VydFRydWUobUluZGV4IDwgdk5vZGVMaXN0LnNpemUoKSk7Ci0gICAgICAgIG1Qcm9wZXJ0eU5vZGVzVmVyaWZpZXJFbGVtTGlzdC5nZXQobUluZGV4KS52ZXJpZnkodk5vZGVMaXN0LmdldChtSW5kZXgpKTsKLSAgICAgICAgbUluZGV4Kys7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvcGltL3ZjYXJkL3Rlc3RfdXRpbHMvUHJvcGVydHlOb2Rlc1ZlcmlmaWVyRWxlbS5qYXZhIGIvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvcGltL3ZjYXJkL3Rlc3RfdXRpbHMvUHJvcGVydHlOb2Rlc1ZlcmlmaWVyRWxlbS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NGM2YWJjLi4wMDAwMDAwCi0tLSBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL3BpbS92Y2FyZC90ZXN0X3V0aWxzL1Byb3BlcnR5Tm9kZXNWZXJpZmllckVsZW0uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzMCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2UgYW5kcm9pZC5waW0udmNhcmQudGVzdF91dGlsczsKLQotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZW50VmFsdWVzOwotaW1wb3J0IGFuZHJvaWQudGVzdC5BbmRyb2lkVGVzdENhc2U7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLS8qKgotICogVXRpbGl0eSBjbGFzcyB3aGljaCB2ZXJpZmllcyBpbnB1dCBWTm9kZS4KLSAqCi0gKiBUaGlzIGNsYXNzIGZpcnN0IGNoZWNrcyB3aGV0aGVyIGVhY2ggcHJvcGVydHlOb2RlIGluIHRoZSBWTm9kZSBpcyBpbiB0aGUKLSAqICJvcmRlcmVkIGV4cGVjdGVkIHByb3BlcnR5IGxpc3QiLgotICogSWYgdGhlIG5vZGUgZG9lcyBub3QgZXhpc3QgaW4gdGhlICJvcmRlcmVkIGxpc3QiLCB0aGUgY2xhc3MgcmVmZXJzIHRvCi0gKiAidW5vcmRlcmQgZXhwZWN0ZWQgcHJvcGVydHkgc2V0IiBhbmQgY2hlY2tzIHRoZSBub2RlIGlzIGV4cGVjdGVkIHNvbWV3aGVyZS4KLSAqLwotcHVibGljIGNsYXNzIFByb3BlcnR5Tm9kZXNWZXJpZmllckVsZW0gewotICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgVHlwZVNldCBleHRlbmRzIEhhc2hTZXQ8U3RyaW5nPiB7Ci0gICAgICAgIHB1YmxpYyBUeXBlU2V0KFN0cmluZyAuLi4gYXJyYXkpIHsKLSAgICAgICAgICAgIHN1cGVyKEFycmF5cy5hc0xpc3QoYXJyYXkpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgR3JvdXBTZXQgZXh0ZW5kcyBIYXNoU2V0PFN0cmluZz4gewotICAgICAgICBwdWJsaWMgR3JvdXBTZXQoU3RyaW5nIC4uLiBhcnJheSkgewotICAgICAgICAgICAgc3VwZXIoQXJyYXlzLmFzTGlzdChhcnJheSkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBmaW5hbCBIYXNoTWFwPFN0cmluZywgTGlzdDxQcm9wZXJ0eU5vZGU+PiBtT3JkZXJlZE5vZGVNYXA7Ci0gICAgLy8gSW50ZW50aW9uYWxseSB1c2UgQXJyYXlMaXN0IGluc3RlYWQgb2YgU2V0LCBhc3N1bWluZyB0aGVyZSBtYXkgYmUgbW9yZSB0aGFuIG9uZQotICAgIC8vIGV4YWN0bHkgc2FtZSBvYmplY3RzLgotICAgIHByaXZhdGUgZmluYWwgQXJyYXlMaXN0PFByb3BlcnR5Tm9kZT4gbVVub3JkZXJlZE5vZGVMaXN0OwotCi0gICAgcHVibGljIFByb3BlcnR5Tm9kZXNWZXJpZmllckVsZW0oQW5kcm9pZFRlc3RDYXNlIGFuZHJvaWRUZXN0Q2FzZSkgewotICAgICAgICBtT3JkZXJlZE5vZGVNYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIExpc3Q8UHJvcGVydHlOb2RlPj4oKTsKLSAgICAgICAgbVVub3JkZXJlZE5vZGVMaXN0ID0gbmV3IEFycmF5TGlzdDxQcm9wZXJ0eU5vZGU+KCk7Ci0gICAgfQotCi0gICAgLy8gV2l0aE9yZGVyCi0KLSAgICBwdWJsaWMgUHJvcGVydHlOb2Rlc1ZlcmlmaWVyRWxlbSBhZGRFeHBlY3RlZE5vZGVXaXRoT3JkZXIoU3RyaW5nIHByb3BOYW1lLCBTdHJpbmcgcHJvcFZhbHVlKSB7Ci0gICAgICAgIHJldHVybiBhZGRFeHBlY3RlZE5vZGVXaXRoT3JkZXIocHJvcE5hbWUsIHByb3BWYWx1ZSwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCk7Ci0gICAgfQotCi0gICAgcHVibGljIFByb3BlcnR5Tm9kZXNWZXJpZmllckVsZW0gYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKAotICAgICAgICAgICAgU3RyaW5nIHByb3BOYW1lLCBTdHJpbmcgcHJvcFZhbHVlLCBDb250ZW50VmFsdWVzIGNvbnRlbnRWYWx1ZXMpIHsKLSAgICAgICAgcmV0dXJuIGFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcihwcm9wTmFtZSwgcHJvcFZhbHVlLCBudWxsLAotICAgICAgICAgICAgICAgIG51bGwsIGNvbnRlbnRWYWx1ZXMsIG51bGwsIG51bGwpOwotICAgIH0KLQotICAgIHB1YmxpYyBQcm9wZXJ0eU5vZGVzVmVyaWZpZXJFbGVtIGFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigKLSAgICAgICAgICAgIFN0cmluZyBwcm9wTmFtZSwgTGlzdDxTdHJpbmc+IHByb3BWYWx1ZUxpc3QsIENvbnRlbnRWYWx1ZXMgY29udGVudFZhbHVlcykgewotICAgICAgICByZXR1cm4gYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKHByb3BOYW1lLCBudWxsLCBwcm9wVmFsdWVMaXN0LAotICAgICAgICAgICAgICAgIG51bGwsIGNvbnRlbnRWYWx1ZXMsIG51bGwsIG51bGwpOwotICAgIH0KLQotICAgIHB1YmxpYyBQcm9wZXJ0eU5vZGVzVmVyaWZpZXJFbGVtIGFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigKLSAgICAgICAgICAgIFN0cmluZyBwcm9wTmFtZSwgU3RyaW5nIHByb3BWYWx1ZSwgTGlzdDxTdHJpbmc+IHByb3BWYWx1ZUxpc3QpIHsKLSAgICAgICAgcmV0dXJuIGFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcihwcm9wTmFtZSwgcHJvcFZhbHVlLCBwcm9wVmFsdWVMaXN0LCBudWxsLAotICAgICAgICAgICAgICAgIG51bGwsIG51bGwsIG51bGwpOwotICAgIH0KLQotICAgIHB1YmxpYyBQcm9wZXJ0eU5vZGVzVmVyaWZpZXJFbGVtIGFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigKLSAgICAgICAgICAgIFN0cmluZyBwcm9wTmFtZSwgTGlzdDxTdHJpbmc+IHByb3BWYWx1ZUxpc3QpIHsKLSAgICAgICAgZmluYWwgU3RyaW5nIHByb3BWYWx1ZSA9IGNvbmNhdGluYXRlTGlzdFdpdGhTZW1pQ29sb24ocHJvcFZhbHVlTGlzdCk7Ci0gICAgICAgIHJldHVybiBhZGRFeHBlY3RlZE5vZGVXaXRoT3JkZXIocHJvcE5hbWUsIHByb3BWYWx1ZS50b1N0cmluZygpLCBwcm9wVmFsdWVMaXN0LAotICAgICAgICAgICAgICAgIG51bGwsIG51bGwsIG51bGwsIG51bGwpOwotICAgIH0KLQotICAgIHB1YmxpYyBQcm9wZXJ0eU5vZGVzVmVyaWZpZXJFbGVtIGFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcihTdHJpbmcgcHJvcE5hbWUsIFN0cmluZyBwcm9wVmFsdWUsCi0gICAgICAgICAgICBUeXBlU2V0IHBhcmFtTWFwX1RZUEUpIHsKLSAgICAgICAgcmV0dXJuIGFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcihwcm9wTmFtZSwgcHJvcFZhbHVlLCBudWxsLAotICAgICAgICAgICAgICAgIG51bGwsIG51bGwsIHBhcmFtTWFwX1RZUEUsIG51bGwpOwotICAgIH0KLQotICAgIHB1YmxpYyBQcm9wZXJ0eU5vZGVzVmVyaWZpZXJFbGVtIGFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcihTdHJpbmcgcHJvcE5hbWUsCi0gICAgICAgICAgICBMaXN0PFN0cmluZz4gcHJvcFZhbHVlTGlzdCwgVHlwZVNldCBwYXJhbU1hcF9UWVBFKSB7Ci0gICAgICAgIHJldHVybiBhZGRFeHBlY3RlZE5vZGVXaXRoT3JkZXIocHJvcE5hbWUsIG51bGwsIHByb3BWYWx1ZUxpc3QsIG51bGwsIG51bGwsCi0gICAgICAgICAgICAgICAgcGFyYW1NYXBfVFlQRSwgbnVsbCk7Ci0gICAgfQotCi0gICAgcHVibGljIFByb3BlcnR5Tm9kZXNWZXJpZmllckVsZW0gYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKFN0cmluZyBwcm9wTmFtZSwKLSAgICAgICAgICAgIExpc3Q8U3RyaW5nPiBwcm9wVmFsdWVMaXN0LCBDb250ZW50VmFsdWVzIHBhcmFtTWFwLCBUeXBlU2V0IHBhcmFtTWFwX1RZUEUpIHsKLSAgICAgICAgcmV0dXJuIGFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcihwcm9wTmFtZSwgbnVsbCwgcHJvcFZhbHVlTGlzdCwgbnVsbCwgcGFyYW1NYXAsCi0gICAgICAgICAgICAgICAgcGFyYW1NYXBfVFlQRSwgbnVsbCk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBQcm9wZXJ0eU5vZGVzVmVyaWZpZXJFbGVtIGFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcihTdHJpbmcgcHJvcE5hbWUsIFN0cmluZyBwcm9wVmFsdWUsCi0gICAgICAgICAgICBDb250ZW50VmFsdWVzIHBhcmFtTWFwLCBUeXBlU2V0IHBhcmFtTWFwX1RZUEUpIHsKLSAgICAgICAgcmV0dXJuIGFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcihwcm9wTmFtZSwgcHJvcFZhbHVlLCBudWxsLCBudWxsLAotICAgICAgICAgICAgICAgIHBhcmFtTWFwLCBwYXJhbU1hcF9UWVBFLCBudWxsKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgUHJvcGVydHlOb2Rlc1ZlcmlmaWVyRWxlbSBhZGRFeHBlY3RlZE5vZGVXaXRoT3JkZXIoU3RyaW5nIHByb3BOYW1lLCBTdHJpbmcgcHJvcFZhbHVlLAotICAgICAgICAgICAgTGlzdDxTdHJpbmc+IHByb3BWYWx1ZUxpc3QsIFR5cGVTZXQgcGFyYW1NYXBfVFlQRSkgewotICAgICAgICByZXR1cm4gYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKHByb3BOYW1lLCBwcm9wVmFsdWUsIHByb3BWYWx1ZUxpc3QsIG51bGwsIG51bGwsCi0gICAgICAgICAgICAgICAgcGFyYW1NYXBfVFlQRSwgbnVsbCk7Ci0gICAgfQotCi0gICAgcHVibGljIFByb3BlcnR5Tm9kZXNWZXJpZmllckVsZW0gYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKFN0cmluZyBwcm9wTmFtZSwgU3RyaW5nIHByb3BWYWx1ZSwKLSAgICAgICAgICAgIExpc3Q8U3RyaW5nPiBwcm9wVmFsdWVMaXN0LCBDb250ZW50VmFsdWVzIHBhcmFtTWFwKSB7Ci0gICAgICAgIHJldHVybiBhZGRFeHBlY3RlZE5vZGVXaXRoT3JkZXIocHJvcE5hbWUsIHByb3BWYWx1ZSwgcHJvcFZhbHVlTGlzdCwgbnVsbCwgcGFyYW1NYXAsCi0gICAgICAgICAgICAgICAgbnVsbCwgbnVsbCk7Ci0gICAgfQotCi0gICAgcHVibGljIFByb3BlcnR5Tm9kZXNWZXJpZmllckVsZW0gYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKFN0cmluZyBwcm9wTmFtZSwgU3RyaW5nIHByb3BWYWx1ZSwKLSAgICAgICAgICAgIExpc3Q8U3RyaW5nPiBwcm9wVmFsdWVMaXN0LCBieXRlW10gcHJvcFZhbHVlX2J5dGVzLAotICAgICAgICAgICAgQ29udGVudFZhbHVlcyBwYXJhbU1hcCwgVHlwZVNldCBwYXJhbU1hcF9UWVBFLCBHcm91cFNldCBwcm9wR3JvdXBTZXQpIHsKLSAgICAgICAgaWYgKHByb3BWYWx1ZSA9PSBudWxsICYmIHByb3BWYWx1ZUxpc3QgIT0gbnVsbCkgewotICAgICAgICAgICAgcHJvcFZhbHVlID0gY29uY2F0aW5hdGVMaXN0V2l0aFNlbWlDb2xvbihwcm9wVmFsdWVMaXN0KTsKLSAgICAgICAgfQotICAgICAgICBmaW5hbCBQcm9wZXJ0eU5vZGUgcHJvcGVydHlOb2RlID0gbmV3IFByb3BlcnR5Tm9kZShwcm9wTmFtZSwKLSAgICAgICAgICAgICAgICBwcm9wVmFsdWUsIHByb3BWYWx1ZUxpc3QsIHByb3BWYWx1ZV9ieXRlcywKLSAgICAgICAgICAgICAgICBwYXJhbU1hcCwgcGFyYW1NYXBfVFlQRSwgcHJvcEdyb3VwU2V0KTsKLSAgICAgICAgTGlzdDxQcm9wZXJ0eU5vZGU+IGV4cGVjdGVkTm9kZUxpc3QgPSBtT3JkZXJlZE5vZGVNYXAuZ2V0KHByb3BOYW1lKTsKLSAgICAgICAgaWYgKGV4cGVjdGVkTm9kZUxpc3QgPT0gbnVsbCkgewotICAgICAgICAgICAgZXhwZWN0ZWROb2RlTGlzdCA9IG5ldyBBcnJheUxpc3Q8UHJvcGVydHlOb2RlPigpOwotICAgICAgICAgICAgbU9yZGVyZWROb2RlTWFwLnB1dChwcm9wTmFtZSwgZXhwZWN0ZWROb2RlTGlzdCk7Ci0gICAgICAgIH0KLSAgICAgICAgZXhwZWN0ZWROb2RlTGlzdC5hZGQocHJvcGVydHlOb2RlKTsKLSAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgfQotCi0gICAgLy8gV2l0aG91dE9yZGVyCi0KLSAgICBwdWJsaWMgUHJvcGVydHlOb2Rlc1ZlcmlmaWVyRWxlbSBhZGRFeHBlY3RlZE5vZGUoU3RyaW5nIHByb3BOYW1lLCBTdHJpbmcgcHJvcFZhbHVlKSB7Ci0gICAgICAgIHJldHVybiBhZGRFeHBlY3RlZE5vZGUocHJvcE5hbWUsIHByb3BWYWx1ZSwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCk7Ci0gICAgfQotCi0gICAgcHVibGljIFByb3BlcnR5Tm9kZXNWZXJpZmllckVsZW0gYWRkRXhwZWN0ZWROb2RlKFN0cmluZyBwcm9wTmFtZSwgU3RyaW5nIHByb3BWYWx1ZSwKLSAgICAgICAgICAgIENvbnRlbnRWYWx1ZXMgY29udGVudFZhbHVlcykgewotICAgICAgICByZXR1cm4gYWRkRXhwZWN0ZWROb2RlKHByb3BOYW1lLCBwcm9wVmFsdWUsIG51bGwsIG51bGwsIGNvbnRlbnRWYWx1ZXMsIG51bGwsIG51bGwpOwotICAgIH0KLQotICAgIHB1YmxpYyBQcm9wZXJ0eU5vZGVzVmVyaWZpZXJFbGVtIGFkZEV4cGVjdGVkTm9kZShTdHJpbmcgcHJvcE5hbWUsCi0gICAgICAgICAgICBMaXN0PFN0cmluZz4gcHJvcFZhbHVlTGlzdCwgQ29udGVudFZhbHVlcyBjb250ZW50VmFsdWVzKSB7Ci0gICAgICAgIHJldHVybiBhZGRFeHBlY3RlZE5vZGUocHJvcE5hbWUsIG51bGwsCi0gICAgICAgICAgICAgICAgcHJvcFZhbHVlTGlzdCwgbnVsbCwgY29udGVudFZhbHVlcywgbnVsbCwgbnVsbCk7Ci0gICAgfQotCi0gICAgcHVibGljIFByb3BlcnR5Tm9kZXNWZXJpZmllckVsZW0gYWRkRXhwZWN0ZWROb2RlKFN0cmluZyBwcm9wTmFtZSwgU3RyaW5nIHByb3BWYWx1ZSwKLSAgICAgICAgICAgIExpc3Q8U3RyaW5nPiBwcm9wVmFsdWVMaXN0KSB7Ci0gICAgICAgIHJldHVybiBhZGRFeHBlY3RlZE5vZGUocHJvcE5hbWUsIHByb3BWYWx1ZSwgcHJvcFZhbHVlTGlzdCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCk7Ci0gICAgfQotCi0gICAgcHVibGljIFByb3BlcnR5Tm9kZXNWZXJpZmllckVsZW0gYWRkRXhwZWN0ZWROb2RlKFN0cmluZyBwcm9wTmFtZSwKLSAgICAgICAgICAgIExpc3Q8U3RyaW5nPiBwcm9wVmFsdWVMaXN0KSB7Ci0gICAgICAgIHJldHVybiBhZGRFeHBlY3RlZE5vZGUocHJvcE5hbWUsIG51bGwsIHByb3BWYWx1ZUxpc3QsCi0gICAgICAgICAgICAgICAgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCk7Ci0gICAgfQotCi0gICAgcHVibGljIFByb3BlcnR5Tm9kZXNWZXJpZmllckVsZW0gYWRkRXhwZWN0ZWROb2RlKFN0cmluZyBwcm9wTmFtZSwgU3RyaW5nIHByb3BWYWx1ZSwKLSAgICAgICAgICAgIFR5cGVTZXQgcGFyYW1NYXBfVFlQRSkgewotICAgICAgICByZXR1cm4gYWRkRXhwZWN0ZWROb2RlKHByb3BOYW1lLCBwcm9wVmFsdWUsIG51bGwsIG51bGwsIG51bGwsIHBhcmFtTWFwX1RZUEUsIG51bGwpOwotICAgIH0KLQotICAgIHB1YmxpYyBQcm9wZXJ0eU5vZGVzVmVyaWZpZXJFbGVtIGFkZEV4cGVjdGVkTm9kZShTdHJpbmcgcHJvcE5hbWUsCi0gICAgICAgICAgICBMaXN0PFN0cmluZz4gcHJvcFZhbHVlTGlzdCwgVHlwZVNldCBwYXJhbU1hcF9UWVBFKSB7Ci0gICAgICAgIGZpbmFsIFN0cmluZyBwcm9wVmFsdWUgPSBjb25jYXRpbmF0ZUxpc3RXaXRoU2VtaUNvbG9uKHByb3BWYWx1ZUxpc3QpOwotICAgICAgICByZXR1cm4gYWRkRXhwZWN0ZWROb2RlKHByb3BOYW1lLCBwcm9wVmFsdWUsIHByb3BWYWx1ZUxpc3QsIG51bGwsIG51bGwsCi0gICAgICAgICAgICAgICAgcGFyYW1NYXBfVFlQRSwgbnVsbCk7Ci0gICAgfQotCi0gICAgcHVibGljIFByb3BlcnR5Tm9kZXNWZXJpZmllckVsZW0gYWRkRXhwZWN0ZWROb2RlKFN0cmluZyBwcm9wTmFtZSwgU3RyaW5nIHByb3BWYWx1ZSwKLSAgICAgICAgICAgIExpc3Q8U3RyaW5nPiBwcm9wVmFsdWVMaXN0LCBUeXBlU2V0IHBhcmFtTWFwX1RZUEUpIHsKLSAgICAgICAgcmV0dXJuIGFkZEV4cGVjdGVkTm9kZShwcm9wTmFtZSwgcHJvcFZhbHVlLCBwcm9wVmFsdWVMaXN0LCBudWxsLCBudWxsLAotICAgICAgICAgICAgICAgIHBhcmFtTWFwX1RZUEUsIG51bGwpOwotICAgIH0KLQotICAgIHB1YmxpYyBQcm9wZXJ0eU5vZGVzVmVyaWZpZXJFbGVtIGFkZEV4cGVjdGVkTm9kZShTdHJpbmcgcHJvcE5hbWUsIFN0cmluZyBwcm9wVmFsdWUsCi0gICAgICAgICAgICBDb250ZW50VmFsdWVzIHBhcmFtTWFwLCBUeXBlU2V0IHBhcmFtTWFwX1RZUEUpIHsKLSAgICAgICAgcmV0dXJuIGFkZEV4cGVjdGVkTm9kZShwcm9wTmFtZSwgcHJvcFZhbHVlLCBudWxsLCBudWxsLAotICAgICAgICAgICAgICAgIHBhcmFtTWFwLCBwYXJhbU1hcF9UWVBFLCBudWxsKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgUHJvcGVydHlOb2Rlc1ZlcmlmaWVyRWxlbSBhZGRFeHBlY3RlZE5vZGUoU3RyaW5nIHByb3BOYW1lLCBTdHJpbmcgcHJvcFZhbHVlLAotICAgICAgICAgICAgTGlzdDxTdHJpbmc+IHByb3BWYWx1ZUxpc3QsIGJ5dGVbXSBwcm9wVmFsdWVfYnl0ZXMsCi0gICAgICAgICAgICBDb250ZW50VmFsdWVzIHBhcmFtTWFwLCBUeXBlU2V0IHBhcmFtTWFwX1RZUEUsIEdyb3VwU2V0IHByb3BHcm91cFNldCkgewotICAgICAgICBpZiAocHJvcFZhbHVlID09IG51bGwgJiYgcHJvcFZhbHVlTGlzdCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBwcm9wVmFsdWUgPSBjb25jYXRpbmF0ZUxpc3RXaXRoU2VtaUNvbG9uKHByb3BWYWx1ZUxpc3QpOwotICAgICAgICB9Ci0gICAgICAgIG1Vbm9yZGVyZWROb2RlTGlzdC5hZGQobmV3IFByb3BlcnR5Tm9kZShwcm9wTmFtZSwgcHJvcFZhbHVlLAotICAgICAgICAgICAgICAgIHByb3BWYWx1ZUxpc3QsIHByb3BWYWx1ZV9ieXRlcywgcGFyYW1NYXAsIHBhcmFtTWFwX1RZUEUsIHByb3BHcm91cFNldCkpOwotICAgICAgICByZXR1cm4gdGhpczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB2ZXJpZnkoVk5vZGUgdm5vZGUpIHsKLSAgICAgICAgZm9yIChQcm9wZXJ0eU5vZGUgYWN0dWFsTm9kZSA6IHZub2RlLnByb3BMaXN0KSB7Ci0gICAgICAgICAgICB2ZXJpZnlOb2RlKGFjdHVhbE5vZGUucHJvcE5hbWUsIGFjdHVhbE5vZGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCFtT3JkZXJlZE5vZGVNYXAuaXNFbXB0eSgpIHx8ICFtVW5vcmRlcmVkTm9kZUxpc3QuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICBmaW5hbCBMaXN0PFN0cmluZz4gZXhwZWN0ZWRQcm9wcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotICAgICAgICAgICAgZm9yIChMaXN0PFByb3BlcnR5Tm9kZT4gbm9kZXMgOiBtT3JkZXJlZE5vZGVNYXAudmFsdWVzKCkpIHsKLSAgICAgICAgICAgICAgICBmb3IgKFByb3BlcnR5Tm9kZSBub2RlIDogbm9kZXMpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCFleHBlY3RlZFByb3BzLmNvbnRhaW5zKG5vZGUucHJvcE5hbWUpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBleHBlY3RlZFByb3BzLmFkZChub2RlLnByb3BOYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZvciAoUHJvcGVydHlOb2RlIG5vZGUgOiBtVW5vcmRlcmVkTm9kZUxpc3QpIHsKLSAgICAgICAgICAgICAgICBpZiAoIWV4cGVjdGVkUHJvcHMuY29udGFpbnMobm9kZS5wcm9wTmFtZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWRQcm9wcy5hZGQobm9kZS5wcm9wTmFtZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgVGVzdENhc2UuZmFpbCgiRXhwZWN0ZWQgcHJvcGVydHkgIiArIEFycmF5cy50b1N0cmluZyhleHBlY3RlZFByb3BzLnRvQXJyYXkoKSkKLSAgICAgICAgICAgICAgICAgICAgKyAiIHdhcyBub3QgZm91bmQuIik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgdmVyaWZ5Tm9kZShmaW5hbCBTdHJpbmcgcHJvcE5hbWUsIGZpbmFsIFByb3BlcnR5Tm9kZSBhY3R1YWxOb2RlKSB7Ci0gICAgICAgIGZpbmFsIExpc3Q8UHJvcGVydHlOb2RlPiBleHBlY3RlZE5vZGVMaXN0ID0gbU9yZGVyZWROb2RlTWFwLmdldChwcm9wTmFtZSk7Ci0gICAgICAgIGZpbmFsIGludCBzaXplID0gKGV4cGVjdGVkTm9kZUxpc3QgIT0gbnVsbCA/IGV4cGVjdGVkTm9kZUxpc3Quc2l6ZSgpIDogMCk7Ci0gICAgICAgIGlmIChzaXplID4gMCkgewotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLSAgICAgICAgICAgICAgICBmaW5hbCBQcm9wZXJ0eU5vZGUgZXhwZWN0ZWROb2RlID0gZXhwZWN0ZWROb2RlTGlzdC5nZXQoaSk7Ci0gICAgICAgICAgICAgICAgZmluYWwgTGlzdDxQcm9wZXJ0eU5vZGU+IGV4cGVjdGVkQnV0RGlmZmVyZW50VmFsdWVMaXN0ID0KLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBBcnJheUxpc3Q8UHJvcGVydHlOb2RlPigpOwotICAgICAgICAgICAgICAgIGlmIChleHBlY3RlZE5vZGUucHJvcE5hbWUuZXF1YWxzKHByb3BOYW1lKSkgewotICAgICAgICAgICAgICAgICAgICBpZiAoZXhwZWN0ZWROb2RlLmVxdWFscyhhY3R1YWxOb2RlKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWROb2RlTGlzdC5yZW1vdmUoaSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXhwZWN0ZWROb2RlTGlzdC5zaXplKCkgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1PcmRlcmVkTm9kZU1hcC5yZW1vdmUocHJvcE5hbWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWRCdXREaWZmZXJlbnRWYWx1ZUxpc3QuYWRkKGV4cGVjdGVkTm9kZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvLyAiYWN0dWFsTm9kZSIgaXMgbm90IGluIG9yZGVyZWQgZXhwZWN0ZWQgbGlzdC4KLSAgICAgICAgICAgICAgICAvLyBUcnkgbG9va2luZyBvdmVyIHVub3JkZXJlZCBleHBlY3RlZCBsaXN0LgotICAgICAgICAgICAgICAgIGlmICh0cnlGb3VuZEV4cGVjdGVkTm9kZUZyb21Vbm9yZGVyZWRMaXN0KGFjdHVhbE5vZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICBleHBlY3RlZEJ1dERpZmZlcmVudFZhbHVlTGlzdCkpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmICghZXhwZWN0ZWRCdXREaWZmZXJlbnRWYWx1ZUxpc3QuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIFNhbWUgcHJvcE5hbWUgZXhpc3RzIGJ1dCB3aXRoIGRpZmZlcmVudCB2YWx1ZShzKS4KLSAgICAgICAgICAgICAgICAgICAgZmFpbFdpdGhFeHBlY3RlZE5vZGVMaXN0KHByb3BOYW1lLCBhY3R1YWxOb2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkQnV0RGlmZmVyZW50VmFsdWVMaXN0KTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAvLyBUaGVyZSdzIG5vIGV4cGVjdGVkIG5vZGUgd2l0aCBzYW1lIHByb3BOYW1lLgotICAgICAgICAgICAgICAgICAgICBUZXN0Q2FzZS5mYWlsKCJVbmV4cGVjdGVkIHByb3BlcnR5IFwiIiArIHByb3BOYW1lICsgIlwiIGV4aXN0cy4iKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBMaXN0PFByb3BlcnR5Tm9kZT4gZXhwZWN0ZWRCdXREaWZmZXJlbnRWYWx1ZUxpc3QgPQotICAgICAgICAgICAgICAgIG5ldyBBcnJheUxpc3Q8UHJvcGVydHlOb2RlPigpOwotICAgICAgICAgICAgaWYgKHRyeUZvdW5kRXhwZWN0ZWROb2RlRnJvbVVub3JkZXJlZExpc3QoYWN0dWFsTm9kZSwgZXhwZWN0ZWRCdXREaWZmZXJlbnRWYWx1ZUxpc3QpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBpZiAoIWV4cGVjdGVkQnV0RGlmZmVyZW50VmFsdWVMaXN0LmlzRW1wdHkoKSkgewotICAgICAgICAgICAgICAgICAgICAvLyBTYW1lIHByb3BOYW1lIGV4aXN0cyBidXQgd2l0aCBkaWZmZXJlbnQgdmFsdWUocykuCi0gICAgICAgICAgICAgICAgICAgIGZhaWxXaXRoRXhwZWN0ZWROb2RlTGlzdChwcm9wTmFtZSwgYWN0dWFsTm9kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHBlY3RlZEJ1dERpZmZlcmVudFZhbHVlTGlzdCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gVGhlcmUncyBubyBleHBlY3RlZCBub2RlIHdpdGggc2FtZSBwcm9wTmFtZS4KLSAgICAgICAgICAgICAgICAgICAgVGVzdENhc2UuZmFpbCgiVW5leHBlY3RlZCBwcm9wZXJ0eSBcIiIgKyBwcm9wTmFtZSArICJcIiBleGlzdHMuIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBTdHJpbmcgY29uY2F0aW5hdGVMaXN0V2l0aFNlbWlDb2xvbihMaXN0PFN0cmluZz4gYXJyYXkpIHsKLSAgICAgICAgU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICAgICAgYm9vbGVhbiBmaXJzdCA9IHRydWU7Ci0gICAgICAgIGZvciAoU3RyaW5nIHByb3BWYWx1ZUVsZW0gOiBhcnJheSkgewotICAgICAgICAgICAgaWYgKGZpcnN0KSB7Ci0gICAgICAgICAgICAgICAgZmlyc3QgPSBmYWxzZTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgYnVmZmVyLmFwcGVuZCgnOycpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnVmZmVyLmFwcGVuZChwcm9wVmFsdWVFbGVtKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gdHJ5Rm91bmRFeHBlY3RlZE5vZGVGcm9tVW5vcmRlcmVkTGlzdChQcm9wZXJ0eU5vZGUgYWN0dWFsTm9kZSwKLSAgICAgICAgICAgIExpc3Q8UHJvcGVydHlOb2RlPiBleHBlY3RlZEJ1dERpZmZlcmVudFZhbHVlTGlzdCkgewotICAgICAgICBmaW5hbCBTdHJpbmcgcHJvcE5hbWUgPSBhY3R1YWxOb2RlLnByb3BOYW1lOwotICAgICAgICBpbnQgdW5vcmRlcmVkTGlzdFNpemUgPSBtVW5vcmRlcmVkTm9kZUxpc3Quc2l6ZSgpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHVub3JkZXJlZExpc3RTaXplOyBpKyspIHsKLSAgICAgICAgICAgIFByb3BlcnR5Tm9kZSB1bm9yZGVyZWRFeHBlY3RlZE5vZGUgPSBtVW5vcmRlcmVkTm9kZUxpc3QuZ2V0KGkpOwotICAgICAgICAgICAgaWYgKHVub3JkZXJlZEV4cGVjdGVkTm9kZS5wcm9wTmFtZS5lcXVhbHMocHJvcE5hbWUpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHVub3JkZXJlZEV4cGVjdGVkTm9kZS5lcXVhbHMoYWN0dWFsTm9kZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgbVVub3JkZXJlZE5vZGVMaXN0LnJlbW92ZShpKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGV4cGVjdGVkQnV0RGlmZmVyZW50VmFsdWVMaXN0LmFkZCh1bm9yZGVyZWRFeHBlY3RlZE5vZGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgZmFpbFdpdGhFeHBlY3RlZE5vZGVMaXN0KFN0cmluZyBwcm9wTmFtZSwgUHJvcGVydHlOb2RlIGFjdHVhbE5vZGUsCi0gICAgICAgICAgICBMaXN0PFByb3BlcnR5Tm9kZT4gZXhwZWN0ZWROb2RlTGlzdCkgewotICAgICAgICBTdHJpbmdCdWlsZGVyIGJ1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotICAgICAgICBmb3IgKFByb3BlcnR5Tm9kZSBleHBlY3RlZE5vZGUgOiBleHBlY3RlZE5vZGVMaXN0KSB7Ci0gICAgICAgICAgICBidWlsZGVyLmFwcGVuZCgiZXhwZWN0ZWQ6ICIpOwotICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoZXhwZWN0ZWROb2RlLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoIlxuIik7Ci0gICAgICAgIH0KLSAgICAgICAgVGVzdENhc2UuZmFpbCgiUHJvcGVydHkgXCIiICsgcHJvcE5hbWUgKyAiXCIgaGFzIHdyb25nIHZhbHVlLlxuIgotICAgICAgICAgICAgICAgICsgYnVpbGRlci50b1N0cmluZygpCi0gICAgICAgICAgICAgICAgKyAiICBhY3R1YWw6ICIgKyBhY3R1YWxOb2RlLnRvU3RyaW5nKCkpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL3BpbS92Y2FyZC90ZXN0X3V0aWxzL1ZDYXJkVGVzdHNCYXNlLmphdmEgYi9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9waW0vdmNhcmQvdGVzdF91dGlscy9WQ2FyZFRlc3RzQmFzZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNzQxM2FiLi4wMDAwMDAwCi0tLSBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL3BpbS92Y2FyZC90ZXN0X3V0aWxzL1ZDYXJkVGVzdHNCYXNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2UgYW5kcm9pZC5waW0udmNhcmQudGVzdF91dGlsczsKLQotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZW50VmFsdWVzOwotaW1wb3J0IGFuZHJvaWQucGltLnZjYXJkLlZDYXJkQ29uZmlnOwotaW1wb3J0IGFuZHJvaWQudGVzdC5BbmRyb2lkVGVzdENhc2U7Ci0KLS8qKgotICogQmFzZUNsYXNzIGZvciB2Q2FyZCB1bml0IHRlc3RzIHdpdGggdXRpbGl0eSBjbGFzc2VzLgotICogUGxlYXNlIGRvIG5vdCBhZGQgZWFjaCB1bml0IHRlc3QgaGVyZS4KLSAqLwotcHVibGljIGNsYXNzIFZDYXJkVGVzdHNCYXNlIGV4dGVuZHMgQW5kcm9pZFRlc3RDYXNlIHsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBWMjEgPSBWQ2FyZENvbmZpZy5WQ0FSRF9UWVBFX1YyMV9HRU5FUklDOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFYzMCA9IFZDYXJkQ29uZmlnLlZDQVJEX1RZUEVfVjMwX0dFTkVSSUM7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVjQwID0gVkNhcmRDb25maWcuVkNBUkRfVFlQRV9WNDBfR0VORVJJQzsKLQotICAgIC8vIERvIG5vdCBtb2RpZnkgdGhlc2UgZHVyaW5nIHRlc3RzLgotICAgIHByb3RlY3RlZCBmaW5hbCBDb250ZW50VmFsdWVzIG1Db250ZW50VmFsdWVzRm9yUVA7Ci0gICAgcHJvdGVjdGVkIGZpbmFsIENvbnRlbnRWYWx1ZXMgbUNvbnRlbnRWYWx1ZXNGb3JTSmlzOwotICAgIHByb3RlY3RlZCBmaW5hbCBDb250ZW50VmFsdWVzIG1Db250ZW50VmFsdWVzRm9yVXRmODsKLSAgICBwcm90ZWN0ZWQgZmluYWwgQ29udGVudFZhbHVlcyBtQ29udGVudFZhbHVlc0ZvclFQQW5kU0ppczsKLSAgICBwcm90ZWN0ZWQgZmluYWwgQ29udGVudFZhbHVlcyBtQ29udGVudFZhbHVlc0ZvclFQQW5kVXRmODsKLSAgICBwcm90ZWN0ZWQgZmluYWwgQ29udGVudFZhbHVlcyBtQ29udGVudFZhbHVlc0ZvckJhc2U2NFYyMTsKLSAgICBwcm90ZWN0ZWQgZmluYWwgQ29udGVudFZhbHVlcyBtQ29udGVudFZhbHVlc0ZvckJhc2U2NFYzMDsKLQotICAgIHByb3RlY3RlZCBWQ2FyZFZlcmlmaWVyIG1WZXJpZmllcjsKLSAgICBwcml2YXRlIGJvb2xlYW4gbVNraXBWZXJpZmljYXRpb247Ci0KLSAgICBwdWJsaWMgVkNhcmRUZXN0c0Jhc2UoKSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgICAgIC8vIE5vdCB1c2luZyBjb25zdGFudHMgaW4gdkNhcmQgY29kZSBzaW5jZSBpdCBtYXkgYmUgd3JvbmcuCi0gICAgICAgIG1Db250ZW50VmFsdWVzRm9yUVAgPSBuZXcgQ29udGVudFZhbHVlcygpOwotICAgICAgICBtQ29udGVudFZhbHVlc0ZvclFQLnB1dCgiRU5DT0RJTkciLCAiUVVPVEVELVBSSU5UQUJMRSIpOwotICAgICAgICBtQ29udGVudFZhbHVlc0ZvclNKaXMgPSBuZXcgQ29udGVudFZhbHVlcygpOwotICAgICAgICBtQ29udGVudFZhbHVlc0ZvclNKaXMucHV0KCJDSEFSU0VUIiwgIlNISUZUX0pJUyIpOwotICAgICAgICBtQ29udGVudFZhbHVlc0ZvclV0ZjggPSBuZXcgQ29udGVudFZhbHVlcygpOwotICAgICAgICBtQ29udGVudFZhbHVlc0ZvclV0ZjgucHV0KCJDSEFSU0VUIiwgIlVURi04Iik7Ci0gICAgICAgIG1Db250ZW50VmFsdWVzRm9yUVBBbmRTSmlzID0gbmV3IENvbnRlbnRWYWx1ZXMoKTsKLSAgICAgICAgbUNvbnRlbnRWYWx1ZXNGb3JRUEFuZFNKaXMucHV0KCJFTkNPRElORyIsICJRVU9URUQtUFJJTlRBQkxFIik7Ci0gICAgICAgIG1Db250ZW50VmFsdWVzRm9yUVBBbmRTSmlzLnB1dCgiQ0hBUlNFVCIsICJTSElGVF9KSVMiKTsKLSAgICAgICAgbUNvbnRlbnRWYWx1ZXNGb3JRUEFuZFV0ZjggPSBuZXcgQ29udGVudFZhbHVlcygpOwotICAgICAgICBtQ29udGVudFZhbHVlc0ZvclFQQW5kVXRmOC5wdXQoIkVOQ09ESU5HIiwgIlFVT1RFRC1QUklOVEFCTEUiKTsKLSAgICAgICAgbUNvbnRlbnRWYWx1ZXNGb3JRUEFuZFV0ZjgucHV0KCJDSEFSU0VUIiwgIlVURi04Iik7Ci0gICAgICAgIG1Db250ZW50VmFsdWVzRm9yQmFzZTY0VjIxID0gbmV3IENvbnRlbnRWYWx1ZXMoKTsKLSAgICAgICAgbUNvbnRlbnRWYWx1ZXNGb3JCYXNlNjRWMjEucHV0KCJFTkNPRElORyIsICJCQVNFNjQiKTsKLSAgICAgICAgbUNvbnRlbnRWYWx1ZXNGb3JCYXNlNjRWMzAgPSBuZXcgQ29udGVudFZhbHVlcygpOwotICAgICAgICBtQ29udGVudFZhbHVlc0ZvckJhc2U2NFYzMC5wdXQoIkVOQ09ESU5HIiwgImIiKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCB0ZXN0QW5kcm9pZFRlc3RDYXNlU2V0dXBQcm9wZXJseSgpIHsKLSAgICAgICAgc3VwZXIudGVzdEFuZHJvaWRUZXN0Q2FzZVNldHVwUHJvcGVybHkoKTsKLSAgICAgICAgbVNraXBWZXJpZmljYXRpb24gPSB0cnVlOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbnsKLSAgICAgICAgc3VwZXIuc2V0VXAoKTsKLSAgICAgICAgbVZlcmlmaWVyID0gbmV3IFZDYXJkVmVyaWZpZXIodGhpcyk7Ci0gICAgICAgIG1Ta2lwVmVyaWZpY2F0aW9uID0gZmFsc2U7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgc3VwZXIudGVhckRvd24oKTsKLSAgICAgICAgaWYgKCFtU2tpcFZlcmlmaWNhdGlvbikgewotICAgICAgICAgICAgbVZlcmlmaWVyLnZlcmlmeSgpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvcGltL3ZjYXJkL3Rlc3RfdXRpbHMvVkNhcmRWZXJpZmllci5qYXZhIGIvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvcGltL3ZjYXJkL3Rlc3RfdXRpbHMvVkNhcmRWZXJpZmllci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3Mzc5YTViLi4wMDAwMDAwCi0tLSBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL3BpbS92Y2FyZC90ZXN0X3V0aWxzL1ZDYXJkVmVyaWZpZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3MCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QKLSAqIHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCi0gKiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQKLSAqIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZQotICogTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIKLSAqIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIGFuZHJvaWQucGltLnZjYXJkLnRlc3RfdXRpbHM7Ci0KLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFJlc29sdmVyOwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5FbnRpdHlJdGVyYXRvcjsKLWltcG9ydCBhbmRyb2lkLm5ldC5Vcmk7Ci1pbXBvcnQgYW5kcm9pZC5waW0udmNhcmQuVkNhcmRDb21wb3NlcjsKLWltcG9ydCBhbmRyb2lkLnBpbS52Y2FyZC5WQ2FyZENvbmZpZzsKLWltcG9ydCBhbmRyb2lkLnBpbS52Y2FyZC5WQ2FyZEVudHJ5Q29uc3RydWN0b3I7Ci1pbXBvcnQgYW5kcm9pZC5waW0udmNhcmQuVkNhcmRJbnRlcnByZXRlcjsKLWltcG9ydCBhbmRyb2lkLnBpbS52Y2FyZC5WQ2FyZEludGVycHJldGVyQ29sbGVjdGlvbjsKLWltcG9ydCBhbmRyb2lkLnBpbS52Y2FyZC5WQ2FyZFBhcnNlcjsKLWltcG9ydCBhbmRyb2lkLnBpbS52Y2FyZC5WQ2FyZFV0aWxzOwotaW1wb3J0IGFuZHJvaWQucGltLnZjYXJkLmV4Y2VwdGlvbi5WQ2FyZEV4Y2VwdGlvbjsKLWltcG9ydCBhbmRyb2lkLnRlc3QuQW5kcm9pZFRlc3RDYXNlOwotaW1wb3J0IGFuZHJvaWQudGVzdC5tb2NrLk1vY2tDb250ZXh0OwotaW1wb3J0IGFuZHJvaWQudGV4dC5UZXh0VXRpbHM7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotCi0vKioKLSAqIDxwPgotICogVGhlIGNsYXNzIGxldHMgdXNlcnMgY2hlY2tzIHRoYXQgZ2l2ZW4gZXhwZWN0ZWQgdkNhcmQgZGF0YSBhcmUgc2FtZSBhcyBnaXZlbiBhY3R1YWwgdkNhcmQgZGF0YS4KLSAqIEFibGUgdG8gdmVyaWZ5IGJvdGggdkNhcmQgaW1wb3J0ZXIvZXhwb3J0ZXIuCi0gKiA8L3A+Ci0gKiA8cD4KLSAqIEZpcnN0IGEgdXNlciBoYXMgdG8gaW5pdGlhbGl6ZSB0aGUgb2JqZWN0IGJ5IGNhbGxpbmcgZWl0aGVyCi0gKiB7QGxpbmsgI2luaXRGb3JJbXBvcnRUZXN0KGludCwgaW50KX0gb3Ige0BsaW5rICNpbml0Rm9yRXhwb3J0VGVzdChpbnQpfS4KLSAqICJSb3VuZCB0cmlwIHRlc3QiIChpbXBvcnQgLT4gZXhwb3J0IC0+IGltcG9ydCwgb3IgZXhwb3J0IC0+IGltcG9ydCAtPiBleHBvcnQpIGlzIG5vdCBzdXBwb3J0ZWQuCi0gKiA8L3A+Ci0gKi8KLXB1YmxpYyBjbGFzcyBWQ2FyZFZlcmlmaWVyIHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTE9HX1RBRyA9ICJWQ2FyZFZlcmlmaWVyIjsKLQotICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIEN1c3RvbU1vY2tDb250ZXh0IGV4dGVuZHMgTW9ja0NvbnRleHQgewotICAgICAgICBmaW5hbCBDb250ZW50UmVzb2x2ZXIgbVJlc29sdmVyOwotICAgICAgICBwdWJsaWMgQ3VzdG9tTW9ja0NvbnRleHQoQ29udGVudFJlc29sdmVyIHJlc29sdmVyKSB7Ci0gICAgICAgICAgICBtUmVzb2x2ZXIgPSByZXNvbHZlcjsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgQ29udGVudFJlc29sdmVyIGdldENvbnRlbnRSZXNvbHZlcigpIHsKLSAgICAgICAgICAgIHJldHVybiBtUmVzb2x2ZXI7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIGNsYXNzIFZDYXJkVmVyaWZpZXJJbnRlcm5hbCBpbXBsZW1lbnRzIFZDYXJkQ29tcG9zZXIuT25lRW50cnlIYW5kbGVyIHsKLSAgICAgICAgcHVibGljIGJvb2xlYW4gb25Jbml0KENvbnRleHQgY29udGV4dCkgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgcHVibGljIGJvb2xlYW4gb25FbnRyeUNyZWF0ZWQoU3RyaW5nIHZjYXJkKSB7Ci0gICAgICAgICAgICB2ZXJpZnlPbmVWQ2FyZEZvckV4cG9ydCh2Y2FyZCk7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICBwdWJsaWMgdm9pZCBvblRlcm1pbmF0ZSgpIHsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgZmluYWwgQW5kcm9pZFRlc3RDYXNlIG1BbmRyb2lkVGVzdENhc2U7Ci0gICAgcHJpdmF0ZSBmaW5hbCBWQ2FyZFZlcmlmaWVySW50ZXJuYWwgbVZDYXJkVmVyaWZpZXJJbnRlcm5hbDsKLSAgICBwcml2YXRlIGludCBtVkNhcmRUeXBlOwotICAgIHByaXZhdGUgYm9vbGVhbiBtSXNEb0NvTW87Ci0KLSAgICAvLyBPbmx5IG9uZSBvZiB0aGVtIG11c3QgYmUgbm9uLWVtcHR5LgotICAgIHByaXZhdGUgRXhwb3J0VGVzdFJlc29sdmVyIG1FeHBvcnRUZXN0UmVzb2x2ZXI7Ci0gICAgcHJpdmF0ZSBJbnB1dFN0cmVhbSBtSW5wdXRTdHJlYW07Ci0KLSAgICAvLyBUbyBhbGxvdyBkdXBsaWNhdGlvbiwgdXNlIGxpc3QgaW5zdGVhZCBvZiBzZXQuCi0gICAgLy8gV2hlbiBudWxsLCB3ZSBkb24ndCBuZWVkIHRvIGRvIHRoZSB2ZXJpZmljYXRpb24uCi0gICAgcHJpdmF0ZSBQcm9wZXJ0eU5vZGVzVmVyaWZpZXIgbVByb3BlcnR5Tm9kZXNWZXJpZmllcjsKLSAgICBwcml2YXRlIExpbmVWZXJpZmllciBtTGluZVZlcmlmaWVyOwotICAgIHByaXZhdGUgQ29udGVudFZhbHVlc1ZlcmlmaWVyIG1Db250ZW50VmFsdWVzVmVyaWZpZXI7Ci0gICAgcHJpdmF0ZSBib29sZWFuIG1Jbml0aWFsaXplZDsKLSAgICBwcml2YXRlIGJvb2xlYW4gbVZlcmlmaWVkID0gZmFsc2U7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgbUNoYXJzZXQ7Ci0KLSAgICAvLyBDYWxsZWQgYnkgVkNhcmRUZXN0c0Jhc2UKLSAgICBwdWJsaWMgVkNhcmRWZXJpZmllcihBbmRyb2lkVGVzdENhc2UgYW5kcm9pZFRlc3RDYXNlKSB7Ci0gICAgICAgIG1BbmRyb2lkVGVzdENhc2UgPSBhbmRyb2lkVGVzdENhc2U7Ci0gICAgICAgIG1WQ2FyZFZlcmlmaWVySW50ZXJuYWwgPSBuZXcgVkNhcmRWZXJpZmllckludGVybmFsKCk7Ci0gICAgICAgIG1FeHBvcnRUZXN0UmVzb2x2ZXIgPSBudWxsOwotICAgICAgICBtSW5wdXRTdHJlYW0gPSBudWxsOwotICAgICAgICBtSW5pdGlhbGl6ZWQgPSBmYWxzZTsKLSAgICAgICAgbVZlcmlmaWVkID0gZmFsc2U7Ci0gICAgfQotCi0gICAgLy8gU2hvdWxkIGJlIGNhbGxlZCBhdCB0aGUgYmVnaW5uaW5nIG9mIGVhY2ggaW1wb3J0IHRlc3QuCi0gICAgcHVibGljIHZvaWQgaW5pdEZvckltcG9ydFRlc3QoaW50IHZjYXJkVHlwZSwgaW50IHJlc0lkKSB7Ci0gICAgICAgIGlmIChtSW5pdGlhbGl6ZWQpIHsKLSAgICAgICAgICAgIEFuZHJvaWRUZXN0Q2FzZS5mYWlsKCJBbHJlYWR5IGluaXRpYWxpemVkIik7Ci0gICAgICAgIH0KLSAgICAgICAgbVZDYXJkVHlwZSA9IHZjYXJkVHlwZTsKLSAgICAgICAgbUlzRG9Db01vID0gVkNhcmRDb25maWcuaXNEb0NvTW8odmNhcmRUeXBlKTsKLSAgICAgICAgc2V0SW5wdXRSZXNvdXJjZUlkKHJlc0lkKTsKLSAgICAgICAgbUluaXRpYWxpemVkID0gdHJ1ZTsKLSAgICB9Ci0KLSAgICAvLyBTaG91bGQgYmUgY2FsbGVkIGF0IHRoZSBiZWdpbm5pbmcgb2YgZWFjaCBleHBvcnQgdGVzdC4KLSAgICBwdWJsaWMgdm9pZCBpbml0Rm9yRXhwb3J0VGVzdChpbnQgdmNhcmRUeXBlKSB7Ci0gICAgICAgIGluaXRGb3JFeHBvcnRUZXN0KHZjYXJkVHlwZSwgIlVURi04Iik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgaW5pdEZvckV4cG9ydFRlc3QoaW50IHZjYXJkVHlwZSwgU3RyaW5nIGNoYXJzZXQpIHsKLSAgICAgICAgaWYgKG1Jbml0aWFsaXplZCkgewotICAgICAgICAgICAgQW5kcm9pZFRlc3RDYXNlLmZhaWwoIkFscmVhZHkgaW5pdGlhbGl6ZWQiKTsKLSAgICAgICAgfQotICAgICAgICBtRXhwb3J0VGVzdFJlc29sdmVyID0gbmV3IEV4cG9ydFRlc3RSZXNvbHZlcihtQW5kcm9pZFRlc3RDYXNlKTsKLSAgICAgICAgbVZDYXJkVHlwZSA9IHZjYXJkVHlwZTsKLSAgICAgICAgbUlzRG9Db01vID0gVkNhcmRDb25maWcuaXNEb0NvTW8odmNhcmRUeXBlKTsKLSAgICAgICAgbUluaXRpYWxpemVkID0gdHJ1ZTsKLSAgICAgICAgaWYgKFRleHRVdGlscy5pc0VtcHR5KGNoYXJzZXQpKSB7Ci0gICAgICAgICAgICBtQ2hhcnNldCA9ICJVVEYtOCI7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtQ2hhcnNldCA9IGNoYXJzZXQ7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgc2V0SW5wdXRSZXNvdXJjZUlkKGludCByZXNJZCkgewotICAgICAgICBJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSA9IG1BbmRyb2lkVGVzdENhc2UuZ2V0Q29udGV4dCgpLmdldFJlc291cmNlcygpLm9wZW5SYXdSZXNvdXJjZShyZXNJZCk7Ci0gICAgICAgIGlmIChpbnB1dFN0cmVhbSA9PSBudWxsKSB7Ci0gICAgICAgICAgICBBbmRyb2lkVGVzdENhc2UuZmFpbCgiV3JvbmcgcmVzSWQ6ICIgKyByZXNJZCk7Ci0gICAgICAgIH0KLSAgICAgICAgc2V0SW5wdXRTdHJlYW0oaW5wdXRTdHJlYW0pOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBzZXRJbnB1dFN0cmVhbShJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSkgewotICAgICAgICBpZiAobUV4cG9ydFRlc3RSZXNvbHZlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBBbmRyb2lkVGVzdENhc2UuZmFpbCgiYWRkSW5wdXRFbnRyeSgpIGlzIGNhbGxlZC4iKTsKLSAgICAgICAgfSBlbHNlIGlmIChtSW5wdXRTdHJlYW0gIT0gbnVsbCkgewotICAgICAgICAgICAgQW5kcm9pZFRlc3RDYXNlLmZhaWwoIklucHV0U3RyZWFtIGlzIGFscmVhZHkgc2V0Iik7Ci0gICAgICAgIH0KLSAgICAgICAgbUlucHV0U3RyZWFtID0gaW5wdXRTdHJlYW07Ci0gICAgfQotCi0gICAgcHVibGljIENvbnRhY3RFbnRyeSBhZGRJbnB1dEVudHJ5KCkgewotICAgICAgICBpZiAoIW1Jbml0aWFsaXplZCkgewotICAgICAgICAgICAgQW5kcm9pZFRlc3RDYXNlLmZhaWwoIk5vdCBpbml0aWFsaXplZCIpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChtSW5wdXRTdHJlYW0gIT0gbnVsbCkgewotICAgICAgICAgICAgQW5kcm9pZFRlc3RDYXNlLmZhaWwoInNldElucHV0U3RyZWFtIGlzIGNhbGxlZCIpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBtRXhwb3J0VGVzdFJlc29sdmVyLmFkZElucHV0Q29udGFjdEVudHJ5KCk7Ci0gICAgfQotCi0gICAgcHVibGljIFByb3BlcnR5Tm9kZXNWZXJpZmllckVsZW0gYWRkUHJvcGVydHlOb2Rlc1ZlcmlmaWVyRWxlbVdpdGhvdXRWZXJzaW9uKCkgewotICAgICAgICBpZiAoIW1Jbml0aWFsaXplZCkgewotICAgICAgICAgICAgQW5kcm9pZFRlc3RDYXNlLmZhaWwoIk5vdCBpbml0aWFsaXplZCIpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChtUHJvcGVydHlOb2Rlc1ZlcmlmaWVyID09IG51bGwpIHsKLSAgICAgICAgICAgIG1Qcm9wZXJ0eU5vZGVzVmVyaWZpZXIgPSBuZXcgUHJvcGVydHlOb2Rlc1ZlcmlmaWVyKG1BbmRyb2lkVGVzdENhc2UpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBtUHJvcGVydHlOb2Rlc1ZlcmlmaWVyLmFkZFByb3BlcnR5Tm9kZXNWZXJpZmllckVsZW0oKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIFByb3BlcnR5Tm9kZXNWZXJpZmllckVsZW0gYWRkUHJvcGVydHlOb2Rlc1ZlcmlmaWVyRWxlbSgpIHsKLSAgICAgICAgZmluYWwgUHJvcGVydHlOb2Rlc1ZlcmlmaWVyRWxlbSBlbGVtID0gYWRkUHJvcGVydHlOb2Rlc1ZlcmlmaWVyRWxlbVdpdGhvdXRWZXJzaW9uKCk7Ci0gICAgICAgIGZpbmFsIFN0cmluZyB2ZXJzaW9uU3RyaW5nOwotICAgICAgICBpZiAoVkNhcmRDb25maWcuaXNWZXJzaW9uMjEobVZDYXJkVHlwZSkpIHsKLSAgICAgICAgICAgIHZlcnNpb25TdHJpbmcgPSAiMi4xIjsKLSAgICAgICAgfSBlbHNlIGlmIChWQ2FyZENvbmZpZy5pc1ZlcnNpb24zMChtVkNhcmRUeXBlKSkgewotICAgICAgICAgICAgdmVyc2lvblN0cmluZyA9ICIzLjAiOwotICAgICAgICB9IGVsc2UgaWYgKFZDYXJkQ29uZmlnLmlzVmVyc2lvbjQwKG1WQ2FyZFR5cGUpKSB7Ci0gICAgICAgICAgICB2ZXJzaW9uU3RyaW5nID0gIjQuMCI7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiVW5leHBlY3RlZCB2Y2FyZCB0eXBlIGR1cmluZyBhIHVuaXQgdGVzdCIpOwotICAgICAgICB9Ci0gICAgICAgIGVsZW0uYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJWRVJTSU9OIiwgdmVyc2lvblN0cmluZyk7Ci0KLSAgICAgICAgcmV0dXJuIGVsZW07Ci0gICAgfQotCi0gICAgcHVibGljIFByb3BlcnR5Tm9kZXNWZXJpZmllckVsZW0gYWRkUHJvcGVydHlOb2Rlc1ZlcmlmaWVyRWxlbVdpdGhFbXB0eU5hbWUoKSB7Ci0gICAgICAgIGlmICghbUluaXRpYWxpemVkKSB7Ci0gICAgICAgICAgICBBbmRyb2lkVGVzdENhc2UuZmFpbCgiTm90IGluaXRpYWxpemVkIik7Ci0gICAgICAgIH0KLSAgICAgICAgZmluYWwgUHJvcGVydHlOb2Rlc1ZlcmlmaWVyRWxlbSBlbGVtID0gYWRkUHJvcGVydHlOb2Rlc1ZlcmlmaWVyRWxlbSgpOwotICAgICAgICBpZiAoVkNhcmRDb25maWcuaXNWZXJzaW9uNDAobVZDYXJkVHlwZSkpIHsKLSAgICAgICAgICAgIGVsZW0uYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJGTiIsICIiKTsKLSAgICAgICAgfSBlbHNlIGlmIChWQ2FyZENvbmZpZy5pc1ZlcnNpb24zMChtVkNhcmRUeXBlKSkgewotICAgICAgICAgICAgZWxlbS5hZGRFeHBlY3RlZE5vZGVXaXRoT3JkZXIoIk4iLCAiIik7Ci0gICAgICAgICAgICBlbGVtLmFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigiRk4iLCAiIik7Ci0gICAgICAgIH0gZWxzZSBpZiAobUlzRG9Db01vKSB7Ci0gICAgICAgICAgICBlbGVtLmFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigiTiIsICIiKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZWxlbTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTGluZVZlcmlmaWVyRWxlbSBhZGRMaW5lVmVyaWZpZXJFbGVtKCkgewotICAgICAgICBpZiAoIW1Jbml0aWFsaXplZCkgewotICAgICAgICAgICAgQW5kcm9pZFRlc3RDYXNlLmZhaWwoIk5vdCBpbml0aWFsaXplZCIpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChtTGluZVZlcmlmaWVyID09IG51bGwpIHsKLSAgICAgICAgICAgIG1MaW5lVmVyaWZpZXIgPSBuZXcgTGluZVZlcmlmaWVyKG1BbmRyb2lkVGVzdENhc2UsIG1WQ2FyZFR5cGUpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBtTGluZVZlcmlmaWVyLmFkZExpbmVWZXJpZmllckVsZW0oKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQ29udGVudFZhbHVlc1ZlcmlmaWVyRWxlbSBhZGRDb250ZW50VmFsdWVzVmVyaWZpZXJFbGVtKCkgewotICAgICAgICBpZiAoIW1Jbml0aWFsaXplZCkgewotICAgICAgICAgICAgQW5kcm9pZFRlc3RDYXNlLmZhaWwoIk5vdCBpbml0aWFsaXplZCIpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChtQ29udGVudFZhbHVlc1ZlcmlmaWVyID09IG51bGwpIHsKLSAgICAgICAgICAgIG1Db250ZW50VmFsdWVzVmVyaWZpZXIgPSBuZXcgQ29udGVudFZhbHVlc1ZlcmlmaWVyKCk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gbUNvbnRlbnRWYWx1ZXNWZXJpZmllci5hZGRFbGVtKG1BbmRyb2lkVGVzdENhc2UpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdXAgc3ViLXZlcmlmaWVycyBjb3JyZWN0bHkgYW5kIHRyeSBwYXJzZSBnaXZlbiB2Q2FyZCBhcyBJbnB1dFN0cmVhbS4KLSAgICAgKiBFcnJvcnMgYXJvdW5kIElucHV0U3RyZWFtIG11c3QgYmUgaGFuZGxlZCBvdXRzaWRlIHRoaXMgbWV0aG9kLgotICAgICAqCi0gICAgICogVXNlZCBib3RoIGZyb20ge0BsaW5rICN2ZXJpZnlGb3JJbXBvcnRUZXN0KCl9IGFuZCBmcm9tIHtAbGluayAjdmVyaWZ5Rm9yRXhwb3J0VGVzdCgpfS4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgdmVyaWZ5V2l0aElucHV0U3RyZWFtKElucHV0U3RyZWFtIGlzKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBmaW5hbCBWQ2FyZEludGVycHJldGVyIGludGVycHJldGVyOwotICAgICAgICBpZiAobUNvbnRlbnRWYWx1ZXNWZXJpZmllciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBmaW5hbCBWQ2FyZEVudHJ5Q29uc3RydWN0b3IgY29uc3RydWN0b3IgPSBuZXcgVkNhcmRFbnRyeUNvbnN0cnVjdG9yKG1WQ2FyZFR5cGUpOwotICAgICAgICAgICAgY29uc3RydWN0b3IuYWRkRW50cnlIYW5kbGVyKG1Db250ZW50VmFsdWVzVmVyaWZpZXIpOwotICAgICAgICAgICAgaWYgKG1Qcm9wZXJ0eU5vZGVzVmVyaWZpZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGludGVycHJldGVyID0gbmV3IFZDYXJkSW50ZXJwcmV0ZXJDb2xsZWN0aW9uKEFycmF5cy5hc0xpc3QoCi0gICAgICAgICAgICAgICAgICAgICAgICBtUHJvcGVydHlOb2Rlc1ZlcmlmaWVyLCBjb25zdHJ1Y3RvcikpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBpbnRlcnByZXRlciA9IGNvbnN0cnVjdG9yOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaWYgKG1Qcm9wZXJ0eU5vZGVzVmVyaWZpZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGludGVycHJldGVyID0gbVByb3BlcnR5Tm9kZXNWZXJpZmllcjsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaW50ZXJwcmV0ZXIgPSBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIE5vdGU6IHdlIG11c3Qgbm90IHNwZWNpZnkgY2hhcnNldCB0b3dhcmQgdkNhcmQgcGFyc2Vycy4gVGhpcyBjb2RlIGNoZWNrcyB3aGV0aGVyCi0gICAgICAgICAgICAvLyB0aG9zZSBwYXJzZXJzIGFyZSBhYmxlIHRvIGVuY29kZSBnaXZlbiBiaW5hcnkgd2l0aG91dCBhbnkgZXh0cmEgaW5mb3JtYXRpb24gZm9yCi0gICAgICAgICAgICAvLyBjaGFyc2V0LgotICAgICAgICAgICAgZmluYWwgVkNhcmRQYXJzZXIgcGFyc2VyID0gVkNhcmRVdGlscy5nZXRBcHByb3ByaWF0ZVBhcnNlcihtVkNhcmRUeXBlKTsKLSAgICAgICAgICAgIHBhcnNlci5wYXJzZShpcywgaW50ZXJwcmV0ZXIpOwotICAgICAgICB9IGNhdGNoIChWQ2FyZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBBbmRyb2lkVGVzdENhc2UuZmFpbCgiVW5leHBlY3RlZCBWQ2FyZEV4Y2VwdGlvbjogIiArIGUuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCB2ZXJpZnlPbmVWQ2FyZEZvckV4cG9ydChmaW5hbCBTdHJpbmcgdmNhcmQpIHsKLSAgICAgICAgTG9nLmQoTE9HX1RBRywgdmNhcmQpOwotICAgICAgICBJbnB1dFN0cmVhbSBpcyA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBpcyA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbSh2Y2FyZC5nZXRCeXRlcyhtQ2hhcnNldCkpOwotICAgICAgICAgICAgdmVyaWZ5V2l0aElucHV0U3RyZWFtKGlzKTsKLSAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgQW5kcm9pZFRlc3RDYXNlLmZhaWwoIlVuZXhwZWN0ZWQgSU9FeGNlcHRpb246ICIgKyBlLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBpZiAoaXMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIGlzLmNsb3NlKCk7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICBBbmRyb2lkVGVzdENhc2UuZmFpbCgiVW5leHBlY3RlZCBJT0V4Y2VwdGlvbjogIiArIGUuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB2ZXJpZnkoKSB7Ci0gICAgICAgIGlmICghbUluaXRpYWxpemVkKSB7Ci0gICAgICAgICAgICBUZXN0Q2FzZS5mYWlsKCJOb3QgaW5pdGlhbGl6ZWQuIik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG1WZXJpZmllZCkgewotICAgICAgICAgICAgVGVzdENhc2UuZmFpbCgidmVyaWZ5KCkgd2FzIGNhbGxlZCB0d2ljZS4iKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtSW5wdXRTdHJlYW0gIT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKG1FeHBvcnRUZXN0UmVzb2x2ZXIgIT0gbnVsbCl7Ci0gICAgICAgICAgICAgICAgVGVzdENhc2UuZmFpbCgiVGhlcmUgYXJlIHR3byBpbnB1dCBzb3VyY2VzLiIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdmVyaWZ5Rm9ySW1wb3J0VGVzdCgpOwotICAgICAgICB9IGVsc2UgaWYgKG1FeHBvcnRUZXN0UmVzb2x2ZXIgIT0gbnVsbCl7Ci0gICAgICAgICAgICB2ZXJpZnlGb3JFeHBvcnRUZXN0KCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBUZXN0Q2FzZS5mYWlsKCJObyBpbnB1dCBpcyBkZXRlcm1pbmVkIik7Ci0gICAgICAgIH0KLSAgICAgICAgbVZlcmlmaWVkID0gdHJ1ZTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgdmVyaWZ5Rm9ySW1wb3J0VGVzdCgpIHsKLSAgICAgICAgaWYgKG1MaW5lVmVyaWZpZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgQW5kcm9pZFRlc3RDYXNlLmZhaWwoIk5vdCBzdXBwb3J0ZWQgbm93LiIpOwotICAgICAgICB9Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHZlcmlmeVdpdGhJbnB1dFN0cmVhbShtSW5wdXRTdHJlYW0pOwotICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBBbmRyb2lkVGVzdENhc2UuZmFpbCgiSU9FeGNlcHRpb24gd2FzIHRocm93bjogIiArIGUuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIGlmIChtSW5wdXRTdHJlYW0gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIG1JbnB1dFN0cmVhbS5jbG9zZSgpOwotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIEVudGl0eUl0ZXJhdG9yIG1vY2tHZXRFbnRpdHlJdGVyYXRvck1ldGhvZCgKLSAgICAgICAgICAgIGZpbmFsIENvbnRlbnRSZXNvbHZlciByZXNvbHZlciwKLSAgICAgICAgICAgIGZpbmFsIFVyaSB1cmksIGZpbmFsIFN0cmluZyBzZWxlY3Rpb24sCi0gICAgICAgICAgICBmaW5hbCBTdHJpbmdbXSBzZWxlY3Rpb25BcmdzLCBmaW5hbCBTdHJpbmcgc29ydE9yZGVyKSB7Ci0gICAgICAgIGlmIChFeHBvcnRUZXN0UmVzb2x2ZXIuY2xhc3MuZXF1YWxzKHJlc29sdmVyLmdldENsYXNzKCkpKSB7Ci0gICAgICAgICAgICByZXR1cm4gKChFeHBvcnRUZXN0UmVzb2x2ZXIpcmVzb2x2ZXIpLmdldFByb3ZpZGVyKCkucXVlcnlFbnRpdGllcygKLSAgICAgICAgICAgICAgICAgICAgdXJpLCBzZWxlY3Rpb24sIHNlbGVjdGlvbkFyZ3MsIHNvcnRPcmRlcik7Ci0gICAgICAgIH0KLQotICAgICAgICBMb2cuZShMT0dfVEFHLCAiVW5leHBlY3RlZCBwcm92aWRlciBnaXZlbi4iKTsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBNZXRob2QgZ2V0TW9ja0dldEVudGl0eUl0ZXJhdG9yTWV0aG9kKCkKLSAgICAgICAgICAgIHRocm93cyBTZWN1cml0eUV4Y2VwdGlvbiwgTm9TdWNoTWV0aG9kRXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIHRoaXMuZ2V0Q2xhc3MoKS5nZXRNZXRob2QoIm1vY2tHZXRFbnRpdHlJdGVyYXRvck1ldGhvZCIsCi0gICAgICAgICAgICAgICAgQ29udGVudFJlc29sdmVyLmNsYXNzLCBVcmkuY2xhc3MsIFN0cmluZy5jbGFzcywgU3RyaW5nW10uY2xhc3MsIFN0cmluZy5jbGFzcyk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHZlcmlmeUZvckV4cG9ydFRlc3QoKSB7Ci0gICAgICAgZmluYWwgVkNhcmRDb21wb3NlciBjb21wb3NlciA9Ci0gICAgICAgICAgICBuZXcgVkNhcmRDb21wb3NlcihuZXcgQ3VzdG9tTW9ja0NvbnRleHQobUV4cG9ydFRlc3RSZXNvbHZlciksIG1WQ2FyZFR5cGUsIG1DaGFyc2V0KTsKLSAgICAgICAgY29tcG9zZXIuYWRkSGFuZGxlcihtTGluZVZlcmlmaWVyKTsKLSAgICAgICAgY29tcG9zZXIuYWRkSGFuZGxlcihtVkNhcmRWZXJpZmllckludGVybmFsKTsKLSAgICAgICAgaWYgKCFjb21wb3Nlci5pbml0KFZDYXJkQ29tcG9zZXIuQ09OVEFDVFNfVEVTVF9DT05URU5UX1VSSSwgbnVsbCwgbnVsbCwgbnVsbCkpIHsKLSAgICAgICAgICAgIEFuZHJvaWRUZXN0Q2FzZS5mYWlsKCJpbml0KCkgZmFpbGVkLiBSZWFzb246ICIgKyBjb21wb3Nlci5nZXRFcnJvclJlYXNvbigpKTsKLSAgICAgICAgfQotICAgICAgICBBbmRyb2lkVGVzdENhc2UuYXNzZXJ0RmFsc2UoY29tcG9zZXIuaXNBZnRlckxhc3QoKSk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICB3aGlsZSAoIWNvbXBvc2VyLmlzQWZ0ZXJMYXN0KCkpIHsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBmaW5hbCBNZXRob2QgbW9ja0dldEVudGl0eUl0ZXJhdG9yTWV0aG9kID0gZ2V0TW9ja0dldEVudGl0eUl0ZXJhdG9yTWV0aG9kKCk7Ci0gICAgICAgICAgICAgICAgICAgIEFuZHJvaWRUZXN0Q2FzZS5hc3NlcnROb3ROdWxsKG1vY2tHZXRFbnRpdHlJdGVyYXRvck1ldGhvZCk7Ci0gICAgICAgICAgICAgICAgICAgIEFuZHJvaWRUZXN0Q2FzZS5hc3NlcnRUcnVlKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvc2VyLmNyZWF0ZU9uZUVudHJ5KG1vY2tHZXRFbnRpdHlJdGVyYXRvck1ldGhvZCkpOwotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgICAgICAgICAgICAgIEFuZHJvaWRUZXN0Q2FzZS5mYWlsKGUudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgY29tcG9zZXIudGVybWluYXRlKCk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9waW0vdmNhcmQvdGVzdF91dGlscy9WTm9kZS5qYXZhIGIvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvcGltL3ZjYXJkL3Rlc3RfdXRpbHMvVk5vZGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjg5MGUyYy4uMDAwMDAwMAotLS0gYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9waW0vdmNhcmQvdGVzdF91dGlscy9WTm9kZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIGFuZHJvaWQucGltLnZjYXJkLnRlc3RfdXRpbHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotCi0vKioKLSAqIFByZXZpb3VzbHkgdXNlZCBpbiBtYWluIHZDYXJkIGhhbmRsaW5nIGNvZGUgYnV0IG5vdyBleGlzdHMgb25seSBmb3IgdGVzdGluZy4KLSAqLwotcHVibGljIGNsYXNzIFZOb2RlIHsKLSAgICBwdWJsaWMgU3RyaW5nIFZOYW1lOwotCi0gICAgcHVibGljIEFycmF5TGlzdDxQcm9wZXJ0eU5vZGU+IHByb3BMaXN0ID0gbmV3IEFycmF5TGlzdDxQcm9wZXJ0eU5vZGU+KCk7Ci0KLSAgICAvKiogMDpwYXJzZSBvdmVyLiAxOnBhcnNpbmcuICovCi0gICAgcHVibGljIGludCBwYXJzZVN0YXR1cyA9IDE7Ci19CmRpZmYgLS1naXQgYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9waW0vdmNhcmQvdGVzdF91dGlscy9WTm9kZUJ1aWxkZXIuamF2YSBiL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL3BpbS92Y2FyZC90ZXN0X3V0aWxzL1ZOb2RlQnVpbGRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ODM3MDM0Li4wMDAwMDAwCi0tLSBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL3BpbS92Y2FyZC90ZXN0X3V0aWxzL1ZOb2RlQnVpbGRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBhbmRyb2lkLnBpbS52Y2FyZC50ZXN0X3V0aWxzOwotCi1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRWYWx1ZXM7Ci1pbXBvcnQgYW5kcm9pZC5waW0udmNhcmQuVkNhcmRDb25maWc7Ci1pbXBvcnQgYW5kcm9pZC5waW0udmNhcmQuVkNhcmRJbnRlcnByZXRlcjsKLWltcG9ydCBhbmRyb2lkLnBpbS52Y2FyZC5WQ2FyZFV0aWxzOwotaW1wb3J0IGFuZHJvaWQudXRpbC5CYXNlNjQ7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkNoYXJzZXRVdGlsczsKLWltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwotCi1pbXBvcnQgamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7Ci1pbXBvcnQgamF2YS5uaW8uY2hhcnNldC5DaGFyc2V0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLS8qKgotICogPHA+Ci0gKiBUaGUgY2xhc3Mgc3RvcmluZyB0aGUgcGFyc2UgcmVzdWx0IHRvIGN1c3RvbSBkYXRhc3RydWN0OgotICoge0BsaW5rIFZOb2RlfSwgYW5kIHtAbGluayBQcm9wZXJ0eU5vZGV9LgotICogTWF5YmUgc2V2ZXJhbCB2Y2FyZCBpbnN0YW5jZSwgc28gdXNlIHZOb2RlTGlzdCB0byBzdG9yZS4KLSAqIDwvcD4KLSAqIDxwPgotICogVGhpcyBpcyBjYWxsZWQgVk5vZGUsIG5vdCBWQ2FyZE5vZGUsIHNpbmNlIGl0IHdhcyB1c2VkIGZvciBleHByZXNzaW5nIHZDYWxlbmRhciAoaUNhbCkuCi0gKiA8L3A+Ci0gKi8KLXB1YmxpYyBjbGFzcyBWTm9kZUJ1aWxkZXIgaW1wbGVtZW50cyBWQ2FyZEludGVycHJldGVyIHsKLSAgICBzdGF0aWMgcHJpdmF0ZSBTdHJpbmcgTE9HX1RBRyA9ICJWTm9kZUJ1aWxkZXIiOyAKLSAgICAKLSAgICBwdWJsaWMgTGlzdDxWTm9kZT4gdk5vZGVMaXN0ID0gbmV3IEFycmF5TGlzdDxWTm9kZT4oKTsKLSAgICBwcml2YXRlIGludCBtTm9kZUxpc3RQb3MgPSAwOwotICAgIHByaXZhdGUgVk5vZGUgbUN1cnJlbnRWTm9kZTsKLSAgICBwcml2YXRlIFByb3BlcnR5Tm9kZSBtQ3VycmVudFByb3BOb2RlOwotICAgIHByaXZhdGUgU3RyaW5nIG1DdXJyZW50UGFyYW1UeXBlOwotCi0gICAgLyoqCi0gICAgICogVGhlIGNoYXJzZXQgdXNpbmcgd2hpY2ggVlBhcnNlciBwYXJzZXMgdGhlIHRleHQuCi0gICAgICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgbVNvdXJjZUNoYXJzZXQ7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgY2hhcnNldCB3aXRoIHdoaWNoIGJ5dGUgYXJyYXkgaXMgZW5jb2RlZCB0byBTdHJpbmcuCi0gICAgICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgbVRhcmdldENoYXJzZXQ7Ci0gICAgCi0gICAgcHJpdmF0ZSBib29sZWFuIG1TdHJpY3RMaW5lQnJlYWtQYXJzaW5nOwotICAgIAotICAgIHB1YmxpYyBWTm9kZUJ1aWxkZXIoKSB7Ci0gICAgICAgIHRoaXMoVkNhcmRDb25maWcuREVGQVVMVF9JTVBPUlRfQ0hBUlNFVCwgZmFsc2UpOwotICAgIH0KLQotICAgIHB1YmxpYyBWTm9kZUJ1aWxkZXIoU3RyaW5nIHRhcmdldENoYXJzZXQsIGJvb2xlYW4gc3RyaWN0TGluZUJyZWFrUGFyc2luZykgewotICAgICAgICBtU291cmNlQ2hhcnNldCA9IFZDYXJkQ29uZmlnLkRFRkFVTFRfSU5URVJNRURJQVRFX0NIQVJTRVQ7Ci0gICAgICAgIGlmICh0YXJnZXRDaGFyc2V0ICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1UYXJnZXRDaGFyc2V0ID0gdGFyZ2V0Q2hhcnNldDsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1UYXJnZXRDaGFyc2V0ID0gVkNhcmRDb25maWcuREVGQVVMVF9JTVBPUlRfQ0hBUlNFVDsKLSAgICAgICAgfQotICAgICAgICBtU3RyaWN0TGluZUJyZWFrUGFyc2luZyA9IHN0cmljdExpbmVCcmVha1BhcnNpbmc7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc3RhcnQoKSB7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZW5kKCkgewotICAgIH0KLQotICAgIC8vIE5vdGU6IEkgZ3Vlc3MgdGhhdCB0aGlzIGNvZGUgYXNzdW1lcyB0aGUgUmVjb3JkIG1heSBuZXN0IGxpa2UgdGhpczoKLSAgICAvLyBTVEFSVDpWUE9TCi0gICAgLy8gLi4uCi0gICAgLy8gU1RBUlQ6VlBPUzIKLSAgICAvLyAuLi4KLSAgICAvLyBFTkQ6VlBPUzIKLSAgICAvLyAuLi4KLSAgICAvLyBFTkQ6VlBPUwotICAgIC8vCi0gICAgLy8gSG93ZXZlciB0aGUgZm9sbG93aW5nIGNvZGUgaGFzIGEgYnVnLgotICAgIC8vIFdoZW4gZXJyb3Igb2NjdXJzIGFmdGVyIGNhbGxpbmcgc3RhcnRSZWNvcmQoKSwgdGhlIGVudHJ5IHdoaWNoIGlzIHByb2JhYmx5Ci0gICAgLy8gdGhlIGNhdXNlIG9mIHRoZSBlcnJvciByZW1haW5zIHRvIGJlIGluIHZOb2RlTGlzdCwgd2hpbGUgZW5kUmVjb3JkKCkgaXMgbm90IGNhbGxlZC4KLSAgICAvLwotICAgIC8vIEkgbGVhdmUgdGhpcyBjb2RlIGFzIGlzIHNpbmNlIEknbSBub3QgZmFtaWxpYXIgd2l0aCB2Y2FsZW5kYXIgc3BlY2lmaWNhdGlvbi4KLSAgICAvLyBCdXQgSSBiZWxpZXZlIHdlIHNob3VsZCByZWZhY3RvciB0aGlzIGNvZGUgaW4gdGhlIGZ1dHVyZS4KLSAgICAvLyBVbnRpbCB0aGlzLCB0aGUgbGFzdCBlbnRyeSBoYXMgdG8gYmUgcmVtb3ZlZCB3aGVuIHNvbWUgZXJyb3Igb2NjdXJzLgotICAgIHB1YmxpYyB2b2lkIHN0YXJ0RW50cnkoKSB7Ci0gICAgICAgIFZOb2RlIHZub2RlID0gbmV3IFZOb2RlKCk7Ci0gICAgICAgIHZub2RlLnBhcnNlU3RhdHVzID0gMTsKLSAgICAgICAgdm5vZGUuVk5hbWUgPSAiVkNBUkQiOwotICAgICAgICAvLyBJIGZlZWwgdGhpcyBzaG91bGQgYmUgZG9uZSBpbiBlbmRSZWNvcmQoKSwgYnV0IGl0IGNhbm5vdCBiZSBkb25lIGJlY2F1c2Ugb2YKLSAgICAgICAgLy8gdGhlIHJlYXNvbiBhYm92ZS4KLSAgICAgICAgdk5vZGVMaXN0LmFkZCh2bm9kZSk7Ci0gICAgICAgIG1Ob2RlTGlzdFBvcyA9IHZOb2RlTGlzdC5zaXplKCkgLSAxOwotICAgICAgICBtQ3VycmVudFZOb2RlID0gdk5vZGVMaXN0LmdldChtTm9kZUxpc3RQb3MpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGVuZEVudHJ5KCkgewotICAgICAgICBWTm9kZSBlbmROb2RlID0gdk5vZGVMaXN0LmdldChtTm9kZUxpc3RQb3MpOwotICAgICAgICBlbmROb2RlLnBhcnNlU3RhdHVzID0gMDsKLSAgICAgICAgd2hpbGUobU5vZGVMaXN0UG9zID4gMCl7Ci0gICAgICAgICAgICBtTm9kZUxpc3RQb3MtLTsKLSAgICAgICAgICAgIGlmKCh2Tm9kZUxpc3QuZ2V0KG1Ob2RlTGlzdFBvcykpLnBhcnNlU3RhdHVzID09IDEpCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgbUN1cnJlbnRWTm9kZSA9IHZOb2RlTGlzdC5nZXQobU5vZGVMaXN0UG9zKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzdGFydFByb3BlcnR5KCkgewotICAgICAgICBtQ3VycmVudFByb3BOb2RlID0gbmV3IFByb3BlcnR5Tm9kZSgpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGVuZFByb3BlcnR5KCkgewotICAgICAgICBtQ3VycmVudFZOb2RlLnByb3BMaXN0LmFkZChtQ3VycmVudFByb3BOb2RlKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgcHJvcGVydHlOYW1lKFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIG1DdXJyZW50UHJvcE5vZGUucHJvcE5hbWUgPSBuYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHByb3BlcnR5R3JvdXAoU3RyaW5nIGdyb3VwKSB7Ci0gICAgICAgIG1DdXJyZW50UHJvcE5vZGUucHJvcEdyb3VwU2V0LmFkZChncm91cCk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHByb3BlcnR5UGFyYW1UeXBlKFN0cmluZyB0eXBlKSB7Ci0gICAgICAgIG1DdXJyZW50UGFyYW1UeXBlID0gdHlwZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBwcm9wZXJ0eVBhcmFtVmFsdWUoU3RyaW5nIHZhbHVlKSB7Ci0gICAgICAgIGlmICghVkNhcmRVdGlscy5jb250YWluc09ubHlBbHBoYURpZ2l0SHlwaGVuKHZhbHVlKSkgewotICAgICAgICAgICAgdmFsdWUgPSBWQ2FyZFV0aWxzLmNvbnZlcnRTdHJpbmdDaGFyc2V0KHZhbHVlLAotICAgICAgICAgICAgICAgICAgICBWQ2FyZENvbmZpZy5ERUZBVUxUX0lOVEVSTUVESUFURV9DSEFSU0VULAotICAgICAgICAgICAgICAgICAgICBWQ2FyZENvbmZpZy5ERUZBVUxUX0lNUE9SVF9DSEFSU0VUKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtQ3VycmVudFBhcmFtVHlwZSA9PSBudWxsIHx8Ci0gICAgICAgICAgICAgICAgbUN1cnJlbnRQYXJhbVR5cGUuZXF1YWxzSWdub3JlQ2FzZSgiVFlQRSIpKSB7Ci0gICAgICAgICAgICBtQ3VycmVudFByb3BOb2RlLnBhcmFtTWFwX1RZUEUuYWRkKHZhbHVlKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1DdXJyZW50UHJvcE5vZGUucGFyYW1NYXAucHV0KG1DdXJyZW50UGFyYW1UeXBlLCB2YWx1ZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBtQ3VycmVudFBhcmFtVHlwZSA9IG51bGw7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBTdHJpbmcgZW5jb2RlU3RyaW5nKFN0cmluZyBvcmlnaW5hbFN0cmluZywgU3RyaW5nIHRhcmdldENoYXJzZXQpIHsKLSAgICAgICAgaWYgKG1Tb3VyY2VDaGFyc2V0LmVxdWFsc0lnbm9yZUNhc2UodGFyZ2V0Q2hhcnNldCkpIHsKLSAgICAgICAgICAgIHJldHVybiBvcmlnaW5hbFN0cmluZzsKLSAgICAgICAgfQotICAgICAgICBDaGFyc2V0IGNoYXJzZXQgPSBDaGFyc2V0LmZvck5hbWUobVNvdXJjZUNoYXJzZXQpOwotICAgICAgICBCeXRlQnVmZmVyIGJ5dGVCdWZmZXIgPSBjaGFyc2V0LmVuY29kZShvcmlnaW5hbFN0cmluZyk7Ci0gICAgICAgIC8vIGJ5dGVCdWZmZXIuYXJyYXkoKSAibWF5IiByZXR1cm4gYnl0ZSBhcnJheSB3aGljaCBpcyBsYXJnZXIgdGhhbgotICAgICAgICAvLyBieXRlQnVmZmVyLnJlbWFpbmluZygpLiBIZXJlLCB3ZSBrZWVwIG9uIHRoZSBzYWZlIHNpZGUuCi0gICAgICAgIGJ5dGVbXSBieXRlcyA9IG5ldyBieXRlW2J5dGVCdWZmZXIucmVtYWluaW5nKCldOwotICAgICAgICBieXRlQnVmZmVyLmdldChieXRlcyk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IFN0cmluZyhieXRlcywgdGFyZ2V0Q2hhcnNldCk7Ci0gICAgICAgIH0gY2F0Y2ggKFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgTG9nLmUoTE9HX1RBRywgIkZhaWxlZCB0byBlbmNvZGU6IGNoYXJzZXQ9IiArIHRhcmdldENoYXJzZXQpOwotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBTdHJpbmcgaGFuZGxlT25lVmFsdWUoU3RyaW5nIHZhbHVlLCBTdHJpbmcgdGFyZ2V0Q2hhcnNldCwgU3RyaW5nIGVuY29kaW5nKSB7Ci0gICAgICAgIGlmIChlbmNvZGluZyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBlbmNvZGluZyA9IGVuY29kaW5nLnRvVXBwZXJDYXNlKCk7Ci0gICAgICAgICAgICBpZiAoZW5jb2RpbmcuZXF1YWxzKCJCQVNFNjQiKSB8fCBlbmNvZGluZy5lcXVhbHMoIkIiKSkgewotICAgICAgICAgICAgICAgIC8vIEFzc3VtZSBCQVNFNjQgaXMgdXNlZCBvbmx5IHdoZW4gdGhlIG51bWJlciBvZiB2YWx1ZXMgaXMgMS4KLSAgICAgICAgICAgICAgICBtQ3VycmVudFByb3BOb2RlLnByb3BWYWx1ZV9ieXRlcyA9IEJhc2U2NC5kZWNvZGUodmFsdWUuZ2V0Qnl0ZXMoKSwgQmFzZTY0Lk5PX1dSQVApOwotICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoZW5jb2RpbmcuZXF1YWxzKCJRVU9URUQtUFJJTlRBQkxFIikpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gVkNhcmRVdGlscy5wYXJzZVF1b3RlZFByaW50YWJsZSgKLSAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlLCBtU3RyaWN0TGluZUJyZWFrUGFyc2luZywgbVNvdXJjZUNoYXJzZXQsIHRhcmdldENoYXJzZXQpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gVW5rbm93biBlbmNvZGluZy4gRmFsbCBiYWNrIHRvIGRlZmF1bHQuCi0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGVuY29kZVN0cmluZyh2YWx1ZSwgdGFyZ2V0Q2hhcnNldCk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHByb3BlcnR5VmFsdWVzKExpc3Q8U3RyaW5nPiB2YWx1ZXMpIHsKLSAgICAgICAgaWYgKHZhbHVlcyA9PSBudWxsIHx8IHZhbHVlcy5zaXplKCkgPT0gMCkgewotICAgICAgICAgICAgbUN1cnJlbnRQcm9wTm9kZS5wcm9wVmFsdWVfYnl0ZXMgPSBudWxsOwotICAgICAgICAgICAgbUN1cnJlbnRQcm9wTm9kZS5wcm9wVmFsdWVfdmVjdG9yLmNsZWFyKCk7Ci0gICAgICAgICAgICBtQ3VycmVudFByb3BOb2RlLnByb3BWYWx1ZV92ZWN0b3IuYWRkKCIiKTsKLSAgICAgICAgICAgIG1DdXJyZW50UHJvcE5vZGUucHJvcFZhbHVlID0gIiI7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIENvbnRlbnRWYWx1ZXMgcGFyYW1NYXAgPSBtQ3VycmVudFByb3BOb2RlLnBhcmFtTWFwOwotICAgICAgICAKLSAgICAgICAgU3RyaW5nIHRhcmdldENoYXJzZXQgPSBDaGFyc2V0VXRpbHMubmFtZUZvckRlZmF1bHRWZW5kb3IocGFyYW1NYXAuZ2V0QXNTdHJpbmcoIkNIQVJTRVQiKSk7IAotICAgICAgICBTdHJpbmcgZW5jb2RpbmcgPSBwYXJhbU1hcC5nZXRBc1N0cmluZygiRU5DT0RJTkciKTsgCi0gICAgICAgIAotICAgICAgICBpZiAodGFyZ2V0Q2hhcnNldCA9PSBudWxsIHx8IHRhcmdldENoYXJzZXQubGVuZ3RoKCkgPT0gMCkgewotICAgICAgICAgICAgdGFyZ2V0Q2hhcnNldCA9IG1UYXJnZXRDaGFyc2V0OwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBmb3IgKFN0cmluZyB2YWx1ZSA6IHZhbHVlcykgewotICAgICAgICAgICAgbUN1cnJlbnRQcm9wTm9kZS5wcm9wVmFsdWVfdmVjdG9yLmFkZCgKLSAgICAgICAgICAgICAgICAgICAgaGFuZGxlT25lVmFsdWUodmFsdWUsIHRhcmdldENoYXJzZXQsIGVuY29kaW5nKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBtQ3VycmVudFByb3BOb2RlLnByb3BWYWx1ZSA9IGxpc3RUb1N0cmluZyhtQ3VycmVudFByb3BOb2RlLnByb3BWYWx1ZV92ZWN0b3IpOwotICAgIH0KLQotICAgIHByaXZhdGUgU3RyaW5nIGxpc3RUb1N0cmluZyhMaXN0PFN0cmluZz4gbGlzdCl7Ci0gICAgICAgIGludCBzaXplID0gbGlzdC5zaXplKCk7Ci0gICAgICAgIGlmIChzaXplID4gMSkgewotICAgICAgICAgICAgU3RyaW5nQnVpbGRlciB0eXBlTGlzdEIgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotICAgICAgICAgICAgZm9yIChTdHJpbmcgdHlwZSA6IGxpc3QpIHsKLSAgICAgICAgICAgICAgICB0eXBlTGlzdEIuYXBwZW5kKHR5cGUpLmFwcGVuZCgiOyIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaW50IGxlbiA9IHR5cGVMaXN0Qi5sZW5ndGgoKTsKLSAgICAgICAgICAgIGlmIChsZW4gPiAwICYmIHR5cGVMaXN0Qi5jaGFyQXQobGVuIC0gMSkgPT0gJzsnKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHR5cGVMaXN0Qi5zdWJzdHJpbmcoMCwgbGVuIC0gMSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gdHlwZUxpc3RCLnRvU3RyaW5nKCk7Ci0gICAgICAgIH0gZWxzZSBpZiAoc2l6ZSA9PSAxKSB7Ci0gICAgICAgICAgICByZXR1cm4gbGlzdC5nZXQoMCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gIiI7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHVibGljIFN0cmluZyBnZXRSZXN1bHQoKXsKLSAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIk5vdCBzdXBwb3J0ZWQiKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9wcm92aWRlci9TZXR0aW5nc1Byb3ZpZGVyVGVzdC5qYXZhIGIvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvcHJvdmlkZXIvU2V0dGluZ3NQcm92aWRlclRlc3QuamF2YQppbmRleCAzNzBhZTc4Li5iODJlNjk4IDEwMDY0NAotLS0gYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9wcm92aWRlci9TZXR0aW5nc1Byb3ZpZGVyVGVzdC5qYXZhCisrKyBiL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL3Byb3ZpZGVyL1NldHRpbmdzUHJvdmlkZXJUZXN0LmphdmEKQEAgLTE0NCw0ICsxNDQsNTEgQEAKIAogICAgICAgICBhc3NlcnRFcXVhbHMobnVsbCwgU2V0dGluZ3MuQm9va21hcmtzLmdldEludGVudEZvclNob3J0Y3V0KHIsICcqJykpOwogICAgIH0KKworICAgIEBNZWRpdW1UZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFBhcnNlUHJvdmlkZXJMaXN0KCkgeworICAgICAgICBDb250ZW50UmVzb2x2ZXIgciA9IGdldENvbnRleHQoKS5nZXRDb250ZW50UmVzb2x2ZXIoKTsKKworICAgICAgICAvLyBNYWtlIHN1cmUgd2UgZ2V0IG91dCB3aGF0IHdlIHB1dCBpbi4KKyAgICAgICAgU2V0dGluZ3MuU2VjdXJlLnB1dFN0cmluZyhyLCBTZXR0aW5ncy5TZWN1cmUuTE9DQVRJT05fUFJPVklERVJTX0FMTE9XRUQsCisgICAgICAgICAgICAgICAgInRlc3QxLHRlc3QyLHRlc3QzIik7CisgICAgICAgIGFzc2VydEVxdWFscyhTZXR0aW5ncy5TZWN1cmUuZ2V0U3RyaW5nKHIsIFNldHRpbmdzLlNlY3VyZS5MT0NBVElPTl9QUk9WSURFUlNfQUxMT1dFRCksCisgICAgICAgICAgICAgICAgInRlc3QxLHRlc3QyLHRlc3QzIik7CisKKyAgICAgICAgLy8gVGVzdCBhZGRpbmcgYSB2YWx1ZQorICAgICAgICBTZXR0aW5ncy5TZWN1cmUucHV0U3RyaW5nKHIsIFNldHRpbmdzLlNlY3VyZS5MT0NBVElPTl9QUk9WSURFUlNfQUxMT1dFRCwKKyAgICAgICAgICAgICAgICAiIik7CisgICAgICAgIFNldHRpbmdzLlNlY3VyZS5wdXRTdHJpbmcociwgU2V0dGluZ3MuU2VjdXJlLkxPQ0FUSU9OX1BST1ZJREVSU19BTExPV0VELCAiK3Rlc3QxIik7CisgICAgICAgIGFzc2VydEVxdWFscygidGVzdDEiLAorICAgICAgICAgICAgICAgIFNldHRpbmdzLlNlY3VyZS5nZXRTdHJpbmcociwgU2V0dGluZ3MuU2VjdXJlLkxPQ0FUSU9OX1BST1ZJREVSU19BTExPV0VEKSk7CisKKyAgICAgICAgLy8gVGVzdCBhZGRpbmcgYSBzZWNvbmQgdmFsdWUKKyAgICAgICAgU2V0dGluZ3MuU2VjdXJlLnB1dFN0cmluZyhyLCBTZXR0aW5ncy5TZWN1cmUuTE9DQVRJT05fUFJPVklERVJTX0FMTE9XRUQsICIrdGVzdDIiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ0ZXN0MSx0ZXN0MiIsCisgICAgICAgICAgICAgICAgU2V0dGluZ3MuU2VjdXJlLmdldFN0cmluZyhyLCBTZXR0aW5ncy5TZWN1cmUuTE9DQVRJT05fUFJPVklERVJTX0FMTE9XRUQpKTsKKworICAgICAgICAvLyBUZXN0IGFkZGluZyBhIHRoaXJkIHZhbHVlCisgICAgICAgIFNldHRpbmdzLlNlY3VyZS5wdXRTdHJpbmcociwgU2V0dGluZ3MuU2VjdXJlLkxPQ0FUSU9OX1BST1ZJREVSU19BTExPV0VELCAiK3Rlc3QzIik7CisgICAgICAgIGFzc2VydEVxdWFscygidGVzdDEsdGVzdDIsdGVzdDMiLAorICAgICAgICAgICAgICAgIFNldHRpbmdzLlNlY3VyZS5nZXRTdHJpbmcociwgU2V0dGluZ3MuU2VjdXJlLkxPQ0FUSU9OX1BST1ZJREVSU19BTExPV0VEKSk7CisKKyAgICAgICAgLy8gVGVzdCBkZWxldGluZyB0aGUgZmlyc3QgdmFsdWUgaW4gYSAzIGl0ZW0gbGlzdAorICAgICAgICBTZXR0aW5ncy5TZWN1cmUucHV0U3RyaW5nKHIsIFNldHRpbmdzLlNlY3VyZS5MT0NBVElPTl9QUk9WSURFUlNfQUxMT1dFRCwgIi10ZXN0MSIpOworICAgICAgICBhc3NlcnRFcXVhbHMoInRlc3QyLHRlc3QzIiwKKyAgICAgICAgICAgICAgICBTZXR0aW5ncy5TZWN1cmUuZ2V0U3RyaW5nKHIsIFNldHRpbmdzLlNlY3VyZS5MT0NBVElPTl9QUk9WSURFUlNfQUxMT1dFRCkpOworCisgICAgICAgIC8vIFRlc3QgZGVsZXRpbmcgdGhlIG1pZGRsZSB2YWx1ZSBpbiBhIDMgaXRlbSBsaXN0CisgICAgICAgIFNldHRpbmdzLlNlY3VyZS5wdXRTdHJpbmcociwgU2V0dGluZ3MuU2VjdXJlLkxPQ0FUSU9OX1BST1ZJREVSU19BTExPV0VELAorICAgICAgICAgICAgICAgICJ0ZXN0MSx0ZXN0Mix0ZXN0MyIpOworICAgICAgICBTZXR0aW5ncy5TZWN1cmUucHV0U3RyaW5nKHIsIFNldHRpbmdzLlNlY3VyZS5MT0NBVElPTl9QUk9WSURFUlNfQUxMT1dFRCwgIi10ZXN0MiIpOworICAgICAgICBhc3NlcnRFcXVhbHMoInRlc3QxLHRlc3QzIiwKKyAgICAgICAgICAgICAgICBTZXR0aW5ncy5TZWN1cmUuZ2V0U3RyaW5nKHIsIFNldHRpbmdzLlNlY3VyZS5MT0NBVElPTl9QUk9WSURFUlNfQUxMT1dFRCkpOworCisgICAgICAgIC8vIFRlc3QgZGVsZXRpbmcgdGhlIGxhc3QgdmFsdWUgaW4gYSAzIGl0ZW0gbGlzdAorICAgICAgICBTZXR0aW5ncy5TZWN1cmUucHV0U3RyaW5nKHIsIFNldHRpbmdzLlNlY3VyZS5MT0NBVElPTl9QUk9WSURFUlNfQUxMT1dFRCwKKyAgICAgICAgICAgICAgICAidGVzdDEsdGVzdDIsdGVzdDMiKTsKKyAgICAgICAgU2V0dGluZ3MuU2VjdXJlLnB1dFN0cmluZyhyLCBTZXR0aW5ncy5TZWN1cmUuTE9DQVRJT05fUFJPVklERVJTX0FMTE9XRUQsICItdGVzdDMiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ0ZXN0MSx0ZXN0MiIsCisgICAgICAgICAgICAgICAgU2V0dGluZ3MuU2VjdXJlLmdldFN0cmluZyhyLCBTZXR0aW5ncy5TZWN1cmUuTE9DQVRJT05fUFJPVklERVJTX0FMTE9XRUQpKTsKKyAgICAgfQogfQpkaWZmIC0tZ2l0IGEvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvdGV4dC9TdGF0aWNMYXlvdXRCaWRpVGVzdC5qYXZhIGIvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvdGV4dC9TdGF0aWNMYXlvdXRCaWRpVGVzdC5qYXZhCmluZGV4IDhlN2U2M2UuLmZiMGYwYzEgMTAwNjQ0Ci0tLSBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL3RleHQvU3RhdGljTGF5b3V0QmlkaVRlc3QuamF2YQorKysgYi9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC90ZXh0L1N0YXRpY0xheW91dEJpZGlUZXN0LmphdmEKQEAgLTIyLDcgKzIyLDcgQEAKIGltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CiAKIC8qKgotICogVGVzdHMgU3RhdGljTGF5b3V0IGJpZGkgaW1wbGVtZW50YXRpb24uCisgKiBRdWljayBjaGVjayBvZiBuYXRpdmUgYmlkaSBpbXBsZW1lbnRhdGlvbi4KICAqLwogcHVibGljIGNsYXNzIFN0YXRpY0xheW91dEJpZGlUZXN0IGV4dGVuZHMgVGVzdENhc2UgewogICAgIApAQCAtNDEsNzMgKzQxLDQ3IEBACiAgICAgCiAgICAgLy9AU21hbGxUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdEFsbEx0cigpIHsKLSAgICAgICAgZXhwZWN0QmlkaShSRVFfREwsICJhIHRlc3QiLCAiMDAwMDAwIiwgTCk7CisgICAgICAgIGV4cGVjdE5hdGl2ZUJpZGkoUkVRX0RMLCAiYSB0ZXN0IiwgIjAwMDAwMCIsIEwpOwogICAgIH0KICAgICAKICAgICAvL0BTbWFsbFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0THRyUnRsKCkgewotICAgICAgICBleHBlY3RCaWRpKFJFUV9ETCwgImFiYyAiICsgQUxFRiArIEJFVCArIEdJTUVMLCAiMDAwMDExMSIsIEwpOworICAgICAgICBleHBlY3ROYXRpdmVCaWRpKFJFUV9ETCwgImFiYyAiICsgQUxFRiArIEJFVCArIEdJTUVMLCAiMDAwMDExMSIsIEwpOwogICAgIH0KICAgICAKICAgICAvL0BTbWFsbFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0QWxsUnRsKCkgewotICAgICAgICBleHBlY3RCaWRpKFJFUV9ETCwgQUxFRiArIFNQICsgQUxFRiArIEJFVCArIEdJTUVMICsgREFMRVQsICIxMTExMTEiLCBSKTsKKyAgICAgICAgZXhwZWN0TmF0aXZlQmlkaShSRVFfREwsIEFMRUYgKyBTUCArIEFMRUYgKyBCRVQgKyBHSU1FTCArIERBTEVULCAiMTExMTExIiwgUik7CiAgICAgfQogICAgIAogICAgIC8vQFNtYWxsVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3RSdGxMdHIoKSB7Ci0gICAgICAgIGV4cGVjdEJpZGkoUkVRX0RMLCAgQUxFRiArIEJFVCArIEdJTUVMICsgIiBhYmMiLCAiMTExMTAwMCIsIFIpOworICAgICAgICBleHBlY3ROYXRpdmVCaWRpKFJFUV9ETCwgIEFMRUYgKyBCRVQgKyBHSU1FTCArICIgYWJjIiwgIjExMTEyMjIiLCBSKTsKICAgICB9CiAgICAgCiAgICAgLy9AU21hbGxUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdFJBbGxMdHIoKSB7Ci0gICAgICAgIGV4cGVjdEJpZGkoUkVRX1IsICJhIHRlc3QiLCAiMDAwMDAwIiwgUik7CisgICAgICAgIGV4cGVjdE5hdGl2ZUJpZGkoUkVRX1IsICJhIHRlc3QiLCAiMjIyMjIyIiwgUik7CiAgICAgfQogICAgIAogICAgIC8vQFNtYWxsVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3RSTHRyUnRsKCkgewotICAgICAgICBleHBlY3RCaWRpKFJFUV9SLCAiYWJjICIgKyBBTEVGICsgQkVUICsgR0lNRUwsICIwMDAxMTExIiwgUik7CisgICAgICAgIGV4cGVjdE5hdGl2ZUJpZGkoUkVRX1IsICJhYmMgIiArIEFMRUYgKyBCRVQgKyBHSU1FTCwgIjIyMjExMTEiLCBSKTsKICAgICB9CiAgICAgCiAgICAgLy9AU21hbGxUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdExBbGxSdGwoKSB7Ci0gICAgICAgIGV4cGVjdEJpZGkoUkVRX0wsIEFMRUYgKyBTUCArIEFMRUYgKyBCRVQgKyBHSU1FTCArIERBTEVULCAiMTExMTExIiwgTCk7CisgICAgICAgIGV4cGVjdE5hdGl2ZUJpZGkoUkVRX0wsIEFMRUYgKyBTUCArIEFMRUYgKyBCRVQgKyBHSU1FTCArIERBTEVULCAiMTExMTExIiwgTCk7CiAgICAgfQogICAgIAogICAgIC8vQFNtYWxsVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3RMUnRsTHRyKCkgewotICAgICAgICBleHBlY3RCaWRpKFJFUV9MLCAgQUxFRiArIEJFVCArIEdJTUVMICsgIiBhYmMiLCAiMTExMDAwMCIsIEwpOwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHZvaWQgZXhwZWN0QmlkaShpbnQgZGlyLCBTdHJpbmcgdGV4dCwgCi0gICAgICAgICAgICBTdHJpbmcgZXhwZWN0ZWRMZXZlbHMsIGludCBleHBlY3RlZERpcikgewotICAgICAgICBjaGFyW10gY2hzID0gdGV4dC50b0NoYXJBcnJheSgpOwotICAgICAgICBpbnQgbiA9IGNocy5sZW5ndGg7Ci0gICAgICAgIGJ5dGVbXSBjaEluZm8gPSBuZXcgYnl0ZVtuXTsKLSAgICAgICAgCi0gICAgICAgIGludCByZXN1bHREaXIgPSBTdGF0aWNMYXlvdXQuYmlkaShkaXIsIGNocywgY2hJbmZvLCBuLCBmYWxzZSk7Ci0gICAgICAgIAotICAgICAgICB7Ci0gICAgICAgICAgICBTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoImluZm86Iik7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG47ICsraSkgewotICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgiICIpLmFwcGVuZChTdHJpbmcudmFsdWVPZihjaEluZm9baV0pKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIExvZy5pKCJCSURJIiwgc2IudG9TdHJpbmcoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGNoYXJbXSByZXN1bHRMZXZlbENoYXJzID0gbmV3IGNoYXJbbl07Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbjsgKytpKSB7Ci0gICAgICAgICAgICByZXN1bHRMZXZlbENoYXJzW2ldID0gKGNoYXIpKCcwJyArIGNoSW5mb1tpXSk7Ci0gICAgICAgIH0KLSAgICAgICAgU3RyaW5nIHJlc3VsdExldmVscyA9IG5ldyBTdHJpbmcocmVzdWx0TGV2ZWxDaGFycyk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiZGlyZWN0aW9uIiwgZXhwZWN0ZWREaXIsIHJlc3VsdERpcik7Ci0gICAgICAgIGFzc2VydEVxdWFscygibGV2ZWxzIiwgZXhwZWN0ZWRMZXZlbHMsIHJlc3VsdExldmVscyk7CisgICAgICAgIGV4cGVjdE5hdGl2ZUJpZGkoUkVRX0RMLCAgQUxFRiArIEJFVCArIEdJTUVMICsgIiBhYmMiLCAiMTExMTIyMiIsIFIpOwogICAgIH0KICAgICAKICAgICAvL0BTbWFsbFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0TmF0aXZlQmlkaSgpIHsKLSAgICAgICAgLy8gbmF0aXZlIGJpZGkgcmV0dXJucyBsZXZlbHMsIG5vdCBzaW1wbHkgZGlyZWN0aW9ucwotICAgICAgICBleHBlY3ROYXRpdmVCaWRpKFJFUV9ETCwgIEFMRUYgKyBCRVQgKyBHSU1FTCArICIgYWJjIiwgIjExMTEyMjIiLCBSKTsKKyAgICAgICAgZXhwZWN0TmF0aXZlQmlkaShSRVFfTCwgIEFMRUYgKyBCRVQgKyBHSU1FTCArICIgYWJjIiwgIjExMTAwMDAiLCBMKTsKICAgICB9CiAgICAgCiAgICAgcHJpdmF0ZSB2b2lkIGV4cGVjdE5hdGl2ZUJpZGkoaW50IGRpciwgU3RyaW5nIHRleHQsIApkaWZmIC0tZ2l0IGEvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvdGV4dC9TdGF0aWNMYXlvdXREaXJlY3Rpb25zVGVzdC5qYXZhIGIvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvdGV4dC9TdGF0aWNMYXlvdXREaXJlY3Rpb25zVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRmZGU4NDkKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC90ZXh0L1N0YXRpY0xheW91dERpcmVjdGlvbnNUZXN0LmphdmEKQEAgLTAsMCArMSwyNDMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdAorICogdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKKyAqIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgV0lUSE9VVAorICogV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlCisgKiBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlcgorICogdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLnRleHQ7CisKK2ltcG9ydCBhbmRyb2lkLnRleHQuTGF5b3V0LkRpcmVjdGlvbnM7CitpbXBvcnQgYW5kcm9pZC50ZXh0LlN0YXRpY0xheW91dFRlc3QuTGF5b3V0QnVpbGRlcjsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkZvcm1hdHRlcjsKKworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKKworcHVibGljIGNsYXNzIFN0YXRpY0xheW91dERpcmVjdGlvbnNUZXN0IGV4dGVuZHMgVGVzdENhc2UgeworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGNoYXIgQUxFRiA9ICdcdTA1ZDAnOworCisgICAgcHJpdmF0ZSBzdGF0aWMgRGlyZWN0aW9ucyBkaXJzKGludCAuLi4gZGlycykgeworICAgICAgICByZXR1cm4gbmV3IERpcmVjdGlvbnMoZGlycyk7CisgICAgfQorCisgICAgLy8gY29uc3RhbnRzIGZyb20gTGF5b3V0IHRoYXQgYXJlIHBhY2thZ2UtcHJvdGVjdGVkCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFJVTl9MRU5HVEhfTUFTSyA9IDB4MDNmZmZmZmY7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFJVTl9MRVZFTF9TSElGVCA9IDI2OworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBSVU5fTEVWRUxfTUFTSyA9IDB4M2Y7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFJVTl9SVExfRkxBRyA9IDEgPDwgUlVOX0xFVkVMX1NISUZUOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgRGlyZWN0aW9ucyBESVJTX0FMTF9MRUZUX1RPX1JJR0hUID0KKyAgICAgICAgbmV3IERpcmVjdGlvbnMobmV3IGludFtdIHsgMCwgUlVOX0xFTkdUSF9NQVNLIH0pOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIERpcmVjdGlvbnMgRElSU19BTExfUklHSFRfVE9fTEVGVCA9CisgICAgICAgIG5ldyBEaXJlY3Rpb25zKG5ldyBpbnRbXSB7IDAsIFJVTl9MRU5HVEhfTUFTSyB8IFJVTl9SVExfRkxBRyB9KTsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBMVkwxXzEgPSAxIHwgKDEgPDwgUlVOX0xFVkVMX1NISUZUKTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTFZMMl8xID0gMSB8ICgyIDw8IFJVTl9MRVZFTF9TSElGVCk7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IExWTDJfMiA9IDIgfCAoMiA8PCBSVU5fTEVWRUxfU0hJRlQpOworCisgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nW10gdGV4dHMgPSB7CisgICAgICAgICIiLAorICAgICAgICAiICIsCisgICAgICAgICJhIiwKKyAgICAgICAgImExIiwKKyAgICAgICAgImFBIiwKKyAgICAgICAgImExYiIsCisgICAgICAgICJhMUEiLAorICAgICAgICAiYUExIiwKKyAgICAgICAgImFBYiIsCisgICAgICAgICJhQTFCIiwKKyAgICAgICAgImFBMUIyIiwKKworICAgICAgICAvLyBydGwKKyAgICAgICAgIkEiLAorICAgICAgICAiQTEiLAorICAgICAgICAiQWEiLAorICAgICAgICAiQTFCIiwKKyAgICAgICAgIkExYSIsCisgICAgICAgICJBYTEiLAorICAgICAgICAiQWFCIgorICAgIH07CisKKyAgICAvLyBFeHBlY3RlZCBkaXJlY3Rpb25zIGFyZSBhbiBhcnJheSBvZiBzdGFydC9sZW5ndGgrbGV2ZWwgcGFpcnMsCisgICAgLy8gaW4gdmlzdWFsIG9yZGVyIGZyb20gdGhlIGxlYWRpbmcgbWFyZ2luLgorICAgIHByaXZhdGUgc3RhdGljIERpcmVjdGlvbnNbXSBleHBlY3RlZCA9IHsKKyAgICAgICAgRElSU19BTExfTEVGVF9UT19SSUdIVCwKKyAgICAgICAgRElSU19BTExfTEVGVF9UT19SSUdIVCwKKyAgICAgICAgRElSU19BTExfTEVGVF9UT19SSUdIVCwKKyAgICAgICAgRElSU19BTExfTEVGVF9UT19SSUdIVCwKKyAgICAgICAgZGlycygwLCAxLCAxLCBMVkwxXzEpLAorICAgICAgICBESVJTX0FMTF9MRUZUX1RPX1JJR0hULAorICAgICAgICBkaXJzKDAsIDIsIDIsIExWTDFfMSksCisgICAgICAgIGRpcnMoMCwgMSwgMiwgTFZMMl8xLCAxLCBMVkwxXzEpLAorICAgICAgICBkaXJzKDAsIDEsIDEsIExWTDFfMSwgMiwgMSksCisgICAgICAgIGRpcnMoMCwgMSwgMywgTFZMMV8xLCAyLCBMVkwyXzEsIDEsIExWTDFfMSksCisgICAgICAgIGRpcnMoMCwgMSwgNCwgTFZMMl8xLCAzLCBMVkwxXzEsIDIsIExWTDJfMSwgMSwgTFZMMV8xKSwKKworICAgICAgICAvLyBydGwKKyAgICAgICAgRElSU19BTExfUklHSFRfVE9fTEVGVCwKKyAgICAgICAgZGlycygwLCBMVkwxXzEsIDEsIExWTDJfMSksCisgICAgICAgIGRpcnMoMCwgTFZMMV8xLCAxLCBMVkwyXzEpLAorICAgICAgICBkaXJzKDAsIExWTDFfMSwgMSwgTFZMMl8xLCAyLCBMVkwxXzEpLAorICAgICAgICBkaXJzKDAsIExWTDFfMSwgMSwgTFZMMl8yKSwKKyAgICAgICAgZGlycygwLCBMVkwxXzEsIDEsIExWTDJfMiksCisgICAgICAgIGRpcnMoMCwgTFZMMV8xLCAxLCBMVkwyXzEsIDIsIExWTDFfMSksCisgICAgfTsKKworICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBwc2V1ZG9CaWRpVG9SZWFsKFN0cmluZyBzcmMpIHsKKyAgICAgICAgY2hhcltdIGNoYXJzID0gc3JjLnRvQ2hhckFycmF5KCk7CisgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgY2hhcnMubGVuZ3RoOyArK2opIHsKKyAgICAgICAgICAgIGNoYXIgYyA9IGNoYXJzW2pdOworICAgICAgICAgICAgaWYgKGMgPj0gJ0EnICYmIGMgPD0gJ0QnKSB7CisgICAgICAgICAgICAgICAgY2hhcnNbal0gPSAoY2hhcikoQUxFRiArIGMgLSAnQScpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmcoY2hhcnMsIDAsIGNoYXJzLmxlbmd0aCk7CisgICAgfQorCisgICAgLy8gQFNtYWxsVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3REaXJlY3Rpb25zKCkgeworICAgICAgICBTdHJpbmdCdWlsZGVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWlsZGVyKCJcbiIpOworICAgICAgICBGb3JtYXR0ZXIgZiA9IG5ldyBGb3JtYXR0ZXIoYnVmKTsKKworICAgICAgICBMYXlvdXRCdWlsZGVyIGIgPSBTdGF0aWNMYXlvdXRUZXN0LmJ1aWxkZXIoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0ZXh0cy5sZW5ndGg7ICsraSkgeworICAgICAgICAgICAgYi5zZXRUZXh0KHBzZXVkb0JpZGlUb1JlYWwodGV4dHNbaV0pKTsKKyAgICAgICAgICAgIGNoZWNrRGlyZWN0aW9ucyhiLmJ1aWxkKCksIGksIGIudGV4dCwgZXhwZWN0ZWQsIGYpOworICAgICAgICB9CisgICAgICAgIGlmIChidWYubGVuZ3RoKCkgPiAxKSB7CisgICAgICAgICAgICBmYWlsKGJ1Zi50b1N0cmluZygpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIEBTbWFsbFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VHJhaWxpbmdXaGl0ZXNwYWNlKCkgeworICAgICAgICBMYXlvdXRCdWlsZGVyIGIgPSBTdGF0aWNMYXlvdXRUZXN0LmJ1aWxkZXIoKTsKKyAgICAgICAgYi5zZXRUZXh0KHBzZXVkb0JpZGlUb1JlYWwoIkFiICAgYyIpKTsKKyAgICAgICAgZmxvYXQgd2lkdGggPSBiLnBhaW50Lm1lYXN1cmVUZXh0KGIudGV4dCwgMCwgNSk7ICAvLyBleGNsdWRlICdjJworICAgICAgICBiLnNldFdpZHRoKE1hdGgucm91bmQod2lkdGgpKTsKKyAgICAgICAgTGF5b3V0IGwgPSBiLmJ1aWxkKCk7CisgICAgICAgIGlmIChsLmdldExpbmVDb3VudCgpICE9IDIpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJleHBlY3RlZCAyIGxpbmVzLCBnb3Q6ICIgKyBsLmdldExpbmVDb3VudCgpKTsKKyAgICAgICAgfQorICAgICAgICBEaXJlY3Rpb25zIHJlc3VsdCA9IGwuZ2V0TGluZURpcmVjdGlvbnMoMCk7CisgICAgICAgIERpcmVjdGlvbnMgZXhwZWN0ZWQgPSBkaXJzKDAsIExWTDFfMSwgMSwgTFZMMl8xLCAyLCAzIHwgKDEgPDwgTGF5b3V0LlJVTl9MRVZFTF9TSElGVCkpOworICAgICAgICBleHBlY3REaXJlY3Rpb25zKCJzcGxpdCBsaW5lIiwgZXhwZWN0ZWQsIHJlc3VsdCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdE5leHRUb1JpZ2h0T2YoKSB7CisgICAgICAgIExheW91dEJ1aWxkZXIgYiA9IFN0YXRpY0xheW91dFRlc3QuYnVpbGRlcigpOworICAgICAgICBiLnNldFRleHQocHNldWRvQmlkaVRvUmVhbCgiYUExQjIiKSk7CisgICAgICAgIC8vIHZpc3VhbCBhMkIxQSBwb3NpdGlvbnMgMDQzMjEKKyAgICAgICAgLy8gMDogfGEyQjFBLCBzdHJvbmcgaXMgc29sLCBhZnRlciAtPiAwCisgICAgICAgIC8vIDE6IGF8MkIxQSwgc3Ryb25nIGlzIGEsIGFmdGVyIC0+LCAxCisgICAgICAgIC8vIDI6IGEyfEIxQSwgc3Ryb25nIGlzIEIsIGFmdGVyIC0+IDQKKyAgICAgICAgLy8gMzogYTJCfDFBLCBzdHJvbmcgaXMgQiwgYmVmb3JlIC0+IDMKKyAgICAgICAgLy8gNDogYTJCMXxBLCBzdHJvbmcgaXMgQSwgYWZ0ZXIgLT4gMgorICAgICAgICAvLyA1OiBhMkIxQXwsIHN0cm9uZyBpcyBlb2wsIGJlZm9yZSAtPiA1CisgICAgICAgIGludFtdIGV4cGVjdGVkID0geyAwLCAxLCA0LCAzLCAyLCA1IH07CisgICAgICAgIExheW91dCBsID0gYi5idWlsZCgpOworICAgICAgICBpbnQgbiA9IDA7CisgICAgICAgIGZvciAoaW50IGkgPSAxOyBpIDwgZXhwZWN0ZWQubGVuZ3RoOyArK2kpIHsKKyAgICAgICAgICAgIGludCB0ID0gbC5nZXRPZmZzZXRUb1JpZ2h0T2Yobik7CisgICAgICAgICAgICBpZiAodCAhPSBleHBlY3RlZFtpXSkgeworICAgICAgICAgICAgICAgIGZhaWwoIm9mZnNldFsiICsgaSArICJdIHRvIHJpZ2h0IG9mOiAiICsgbiArICIgZXhwZWN0ZWQ6ICIgKworICAgICAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWRbaV0gKyAiIGdvdDogIiArIHQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbiA9IHQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TmV4dFRvTGVmdE9mKCkgeworICAgICAgICBMYXlvdXRCdWlsZGVyIGIgPSBTdGF0aWNMYXlvdXRUZXN0LmJ1aWxkZXIoKTsKKyAgICAgICAgYi5zZXRUZXh0KHBzZXVkb0JpZGlUb1JlYWwoImFBMUIyIikpOworICAgICAgICBpbnRbXSBleHBlY3RlZCA9IHsgMCwgMSwgNCwgMywgMiwgNSB9OworICAgICAgICBMYXlvdXQgbCA9IGIuYnVpbGQoKTsKKyAgICAgICAgaW50IG4gPSA1OworICAgICAgICBmb3IgKGludCBpID0gZXhwZWN0ZWQubGVuZ3RoIC0gMTsgLS1pID49IDA7KSB7CisgICAgICAgICAgICBpbnQgdCA9IGwuZ2V0T2Zmc2V0VG9MZWZ0T2Yobik7CisgICAgICAgICAgICBpZiAodCAhPSBleHBlY3RlZFtpXSkgeworICAgICAgICAgICAgICAgIGZhaWwoIm9mZnNldFsiICsgaSArICJdIHRvIGxlZnQgb2Y6ICIgKyBuICsgIiBleHBlY3RlZDogIiArCisgICAgICAgICAgICAgICAgICAgICAgICBleHBlY3RlZFtpXSArICIgZ290OiAiICsgdCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBuID0gdDsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIHV0aWxpdHksIG5vdCByZWFsbHkgYSB0ZXN0CisgICAgLyoKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TWVhc3VyZVRleHQxKCkgeworICAgICAgICBMYXlvdXRCdWlsZGVyIGIgPSBTdGF0aWNMYXlvdXRUZXN0LmJ1aWxkZXIoKTsKKyAgICAgICAgU3RyaW5nIHRleHQgPSAiQUJDIjsgLy8gImFiQUIiCisgICAgICAgIGIuc2V0VGV4dChwc2V1ZG9CaWRpVG9SZWFsKHRleHQpKTsKKyAgICAgICAgTGF5b3V0IGwgPSBiLmJ1aWxkKCk7CisgICAgICAgIERpcmVjdGlvbnMgZGlyZWN0aW9ucyA9IGwuZ2V0TGluZURpcmVjdGlvbnMoMCk7CisKKyAgICAgICAgVGV4dFBhaW50IHdvcmtQYWludCA9IG5ldyBUZXh0UGFpbnQoKTsKKworICAgICAgICBpbnQgZGlyID0gLTE7IC8vIExFRlRfVE9fUklHSFQKKyAgICAgICAgYm9vbGVhbiB0cmFpbGluZyA9IHRydWU7CisgICAgICAgIGJvb2xlYW4gYWx0ID0gdHJ1ZTsKKyAgICAgICAgZG8geworICAgICAgICAgICAgZGlyID0gLWRpcjsKKyAgICAgICAgICAgIGRvIHsKKyAgICAgICAgICAgICAgICB0cmFpbGluZyA9ICF0cmFpbGluZzsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBvZmZzZXQgPSAwLCBlbmQgPSBiLnRleHQubGVuZ3RoKCk7IG9mZnNldCA8PSBlbmQ7ICsrb2Zmc2V0KSB7CisgICAgICAgICAgICAgICAgICAgIGZsb2F0IHdpZHRoID0gTGF5b3V0Lm1lYXN1cmVUZXh0KGIucGFpbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgd29ya1BhaW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGIudGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCBvZmZzZXQsIGVuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXIsIGRpcmVjdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhaWxpbmcsIGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwpOworICAgICAgICAgICAgICAgICAgICBMb2cuaSgiQklESSIsICJkaXI6ICIgKyBkaXIgKyAiIHRyYWlsOiAiICsgdHJhaWxpbmcgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgb2Zmc2V0OiAiICsgb2Zmc2V0ICsgIiB3aWR0aDogIiArIHdpZHRoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IHdoaWxlICghdHJhaWxpbmcpOworICAgICAgICB9IHdoaWxlIChkaXIgPiAwKTsKKyAgICB9CisgICAgKi8KKworICAgIC8vIHV0aWxpdHkgZm9yIGRpc3BsYXlpbmcgYXJyYXlzIGluIGhleAorICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBoZXhBcnJheShpbnRbXSBhcnJheSkgeworICAgICAgICBTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKyAgICAgICAgc2IuYXBwZW5kKCd7Jyk7CisgICAgICAgIGZvciAoaW50IGkgOiBhcnJheSkgeworICAgICAgICAgICAgaWYgKHNiLmxlbmd0aCgpID4gMSkgeworICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgiLCAiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNiLmFwcGVuZChJbnRlZ2VyLnRvSGV4U3RyaW5nKGkpKTsKKyAgICAgICAgfQorICAgICAgICBzYi5hcHBlbmQoJ30nKTsKKyAgICAgICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGNoZWNrRGlyZWN0aW9ucyhMYXlvdXQgbCwgaW50IGksIFN0cmluZyB0ZXh0LAorICAgICAgICAgICAgRGlyZWN0aW9uc1tdIGV4cGVjdGVkRGlycywgRm9ybWF0dGVyIGYpIHsKKyAgICAgICAgRGlyZWN0aW9ucyBleHBlY3RlZCA9IGV4cGVjdGVkRGlyc1tpXTsKKyAgICAgICAgRGlyZWN0aW9ucyByZXN1bHQgPSBsLmdldExpbmVEaXJlY3Rpb25zKDApOworICAgICAgICBpZiAoIUFycmF5cy5lcXVhbHMoZXhwZWN0ZWQubURpcmVjdGlvbnMsIHJlc3VsdC5tRGlyZWN0aW9ucykpIHsKKyAgICAgICAgICAgIGYuZm9ybWF0KCIlblslMmRdICclcycsICVzICE9ICVzIiwgaSwgdGV4dCwKKyAgICAgICAgICAgICAgICAgICAgaGV4QXJyYXkoZXhwZWN0ZWQubURpcmVjdGlvbnMpLAorICAgICAgICAgICAgICAgICAgICBoZXhBcnJheShyZXN1bHQubURpcmVjdGlvbnMpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBleHBlY3REaXJlY3Rpb25zKFN0cmluZyBtc2csIERpcmVjdGlvbnMgZXhwZWN0ZWQsIERpcmVjdGlvbnMgcmVzdWx0KSB7CisgICAgICAgIGlmICghQXJyYXlzLmVxdWFscyhleHBlY3RlZC5tRGlyZWN0aW9ucywgcmVzdWx0Lm1EaXJlY3Rpb25zKSkgeworICAgICAgICAgICAgZmFpbCgiZXhwZWN0ZWQ6ICIgKyBoZXhBcnJheShleHBlY3RlZC5tRGlyZWN0aW9ucykgKworICAgICAgICAgICAgICAgICAgICAiIGdvdDogIiArIGhleEFycmF5KHJlc3VsdC5tRGlyZWN0aW9ucykpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvdGV4dC9TdGF0aWNMYXlvdXRUZXN0LmphdmEgYi9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC90ZXh0L1N0YXRpY0xheW91dFRlc3QuamF2YQppbmRleCAxZjU4YTJjLi5kNTU0YTUwIDEwMDY0NAotLS0gYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC90ZXh0L1N0YXRpY0xheW91dFRlc3QuamF2YQorKysgYi9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC90ZXh0L1N0YXRpY0xheW91dFRlc3QuamF2YQpAQCAtMjI4LDExICsyMjgsMTEgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIHByaXZhdGUgc3RhdGljIExheW91dEJ1aWxkZXIgYnVpbGRlcigpIHsKKyAgICAvKiBwYWNrYWdlICovIHN0YXRpYyBMYXlvdXRCdWlsZGVyIGJ1aWxkZXIoKSB7CiAgICAgICAgIHJldHVybiBuZXcgTGF5b3V0QnVpbGRlcigpOwogICAgIH0KIAotICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIExheW91dEJ1aWxkZXIgeworICAgIC8qIHBhY2thZ2UgKi8gc3RhdGljIGNsYXNzIExheW91dEJ1aWxkZXIgewogICAgICAgICBTdHJpbmcgdGV4dCA9ICJUaGlzIGlzIGEgdGVzdCI7CiAgICAgICAgIFRleHRQYWludCBwYWludCA9IG5ldyBUZXh0UGFpbnQoKTsgLy8gZGVmYXVsdAogICAgICAgICBpbnQgd2lkdGggPSAxMDA7CmRpZmYgLS1naXQgYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC91dGlsL0V4cGFuZGFibGVMaXN0U2NlbmFyaW8uamF2YSBiL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL3V0aWwvRXhwYW5kYWJsZUxpc3RTY2VuYXJpby5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YTEyYjBkLi4wMDAwMDAwCi0tLSBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL3V0aWwvRXhwYW5kYWJsZUxpc3RTY2VuYXJpby5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzg2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGFuZHJvaWQudXRpbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBhbmRyb2lkLnZpZXcuR3Jhdml0eTsKLWltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKLWltcG9ydCBhbmRyb2lkLnZpZXcuVmlld0dyb3VwOwotaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkFic0xpc3RWaWV3OwotaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkJhc2VFeHBhbmRhYmxlTGlzdEFkYXB0ZXI7Ci1pbXBvcnQgYW5kcm9pZC53aWRnZXQuRXhwYW5kYWJsZUxpc3RBZGFwdGVyOwotaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkV4cGFuZGFibGVMaXN0VmlldzsKLWltcG9ydCBhbmRyb2lkLndpZGdldC5MaXN0VmlldzsKLWltcG9ydCBhbmRyb2lkLndpZGdldC5UZXh0VmlldzsKLQotLyoqCi0gKiBVdGlsaXR5IGJhc2UgY2xhc3MgZm9yIGNyZWF0aW5nIHZhcmlvdXMgRXhwYW5kYWJsZSBMaXN0IHNjZW5hcmlvcy4KLSAqIDxwPgotICogV0FSTklORzogQSBsb3Qgb2YgdGhlIGZlYXR1cmVzIGFyZSBtaXhlZCBiZXR3ZWVuIExpc3RWaWV3J3MgZXhwZWN0ZWQgcG9zaXRpb24KLSAqIChmbGF0IGxpc3QgcG9zaXRpb24pIGFuZCBhbiBFeHBhbmRhYmxlTGlzdFZpZXcncyBleHBlY3RlZCBwb3NpdGlvbi4gIFlvdSBtdXN0IGFkZC9jaGFuZ2UKLSAqIGZlYXR1cmVzIGFzIHlvdSBuZWVkIHRoZW0uCi0gKiAKLSAqIEBzZWUgTGlzdFNjZW5hcmlvCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBFeHBhbmRhYmxlTGlzdFNjZW5hcmlvIGV4dGVuZHMgTGlzdFNjZW5hcmlvIHsKLSAgICBwcm90ZWN0ZWQgRXhwYW5kYWJsZUxpc3RBZGFwdGVyIG1BZGFwdGVyOyAKLSAgICBwcm90ZWN0ZWQgTGlzdDxNeUdyb3VwPiBtR3JvdXBzOwotICAgIAotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBMaXN0VmlldyBjcmVhdGVMaXN0VmlldygpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBFeHBhbmRhYmxlTGlzdFZpZXcodGhpcyk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIFBhcmFtcyBjcmVhdGVQYXJhbXMoKSB7Ci0gICAgICAgIHJldHVybiBuZXcgRXhwYW5kYWJsZVBhcmFtcygpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIHNldEFkYXB0ZXIoTGlzdFZpZXcgbGlzdFZpZXcpIHsKLSAgICAgICAgKChFeHBhbmRhYmxlTGlzdFZpZXcpIGxpc3RWaWV3KS5zZXRBZGFwdGVyKG1BZGFwdGVyID0gY3JlYXRlQWRhcHRlcigpKTsKLSAgICB9Ci0gICAgCi0gICAgcHJvdGVjdGVkIEV4cGFuZGFibGVMaXN0QWRhcHRlciBjcmVhdGVBZGFwdGVyKCkgewotICAgICAgICByZXR1cm4gbmV3IE15QWRhcHRlcigpOwotICAgIH0KLSAgICAKLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCByZWFkQW5kVmFsaWRhdGVQYXJhbXMoUGFyYW1zIHBhcmFtcykgewotICAgICAgICBFeHBhbmRhYmxlUGFyYW1zIGV4cGFuZGFibGVQYXJhbXMgPSAoRXhwYW5kYWJsZVBhcmFtcykgcGFyYW1zOwotICAgICAgICAKLSAgICAgICAgaW50W10gbnVtQ2hpbGRyZW4gPSBleHBhbmRhYmxlUGFyYW1zLm1OdW1DaGlsZHJlbjsKLSAgICAgICAgCi0gICAgICAgIG1Hcm91cHMgPSBuZXcgQXJyYXlMaXN0PE15R3JvdXA+KG51bUNoaWxkcmVuLmxlbmd0aCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtQ2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIG1Hcm91cHMuYWRkKG5ldyBNeUdyb3VwKG51bUNoaWxkcmVuW2ldKSk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGV4cGFuZGFibGVQYXJhbXMuc3VwZXJTZXROdW1JdGVtcygpOwotICAgICAgICAKLSAgICAgICAgc3VwZXIucmVhZEFuZFZhbGlkYXRlUGFyYW1zKHBhcmFtcyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0IHRoZSBFeHBhbmRhYmxlTGlzdFZpZXcgd2lkZ2V0LgotICAgICAqIEByZXR1cm4gVGhlIG1haW4gd2lkZ2V0LgotICAgICAqLwotICAgIHB1YmxpYyBFeHBhbmRhYmxlTGlzdFZpZXcgZ2V0RXhwYW5kYWJsZUxpc3RWaWV3KCkgewotICAgICAgICByZXR1cm4gKEV4cGFuZGFibGVMaXN0Vmlldykgc3VwZXIuZ2V0TGlzdFZpZXcoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEV4cGFuZGFibGVQYXJhbXMgZXh0ZW5kcyBQYXJhbXMgewotICAgICAgICBwcml2YXRlIGludFtdIG1OdW1DaGlsZHJlbjsKLSAgICAgICAgCi0gICAgICAgIC8qKgotICAgICAgICAgKiBTZXRzIHRoZSBudW1iZXIgb2YgY2hpbGRyZW4gcGVyIGdyb3VwLgotICAgICAgICAgKiAgCi0gICAgICAgICAqIEBwYXJhbSBudW1DaGlsZHJlblBlckdyb3VwIFRoZSBudW1iZXIgb2YgY2hpbGRyZW4gcGVyIGdyb3VwLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIEV4cGFuZGFibGVQYXJhbXMgc2V0TnVtQ2hpbGRyZW4oaW50W10gbnVtQ2hpbGRyZW4pIHsKLSAgICAgICAgICAgIG1OdW1DaGlsZHJlbiA9IG51bUNoaWxkcmVuOwotICAgICAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogU2V0cyB0aGUgbnVtYmVyIG9mIGl0ZW1zIG9uIHRoZSBzdXBlcmNsYXNzIGJhc2VkIG9uIHRoZSBudW1iZXIgb2YKLSAgICAgICAgICogZ3JvdXBzIGFuZCBjaGlsZHJlbiBwZXIgZ3JvdXAuCi0gICAgICAgICAqLwotICAgICAgICBwcml2YXRlIEV4cGFuZGFibGVQYXJhbXMgc3VwZXJTZXROdW1JdGVtcygpIHsKLSAgICAgICAgICAgIGludCBudW1JdGVtcyA9IDA7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmIChtTnVtQ2hpbGRyZW4gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSBtTnVtQ2hpbGRyZW4ubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHsKLSAgICAgICAgICAgICAgICAgICAgbnVtSXRlbXMgKz0gbU51bUNoaWxkcmVuW2ldOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgc3VwZXIuc2V0TnVtSXRlbXMobnVtSXRlbXMpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICByZXR1cm4gdGhpczsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBQYXJhbXMgc2V0TnVtSXRlbXMoaW50IG51bUl0ZW1zKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJVc2Ugc2V0TnVtR3JvdXBzIGFuZCBzZXROdW1DaGlsZHJlbiBpbnN0ZWFkLiIpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBFeHBhbmRhYmxlUGFyYW1zIHNldEZhZGluZ0VkZ2VTY3JlZW5TaXplRmFjdG9yKGRvdWJsZSBmYWRpbmdFZGdlU2NyZWVuU2l6ZUZhY3RvcikgewotICAgICAgICAgICAgcmV0dXJuIChFeHBhbmRhYmxlUGFyYW1zKSBzdXBlci5zZXRGYWRpbmdFZGdlU2NyZWVuU2l6ZUZhY3RvcihmYWRpbmdFZGdlU2NyZWVuU2l6ZUZhY3Rvcik7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIEV4cGFuZGFibGVQYXJhbXMgc2V0SXRlbVNjcmVlblNpemVGYWN0b3IoZG91YmxlIGl0ZW1TY3JlZW5TaXplRmFjdG9yKSB7Ci0gICAgICAgICAgICByZXR1cm4gKEV4cGFuZGFibGVQYXJhbXMpIHN1cGVyLnNldEl0ZW1TY3JlZW5TaXplRmFjdG9yKGl0ZW1TY3JlZW5TaXplRmFjdG9yKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgRXhwYW5kYWJsZVBhcmFtcyBzZXRJdGVtc0ZvY3VzYWJsZShib29sZWFuIGl0ZW1zRm9jdXNhYmxlKSB7Ci0gICAgICAgICAgICByZXR1cm4gKEV4cGFuZGFibGVQYXJhbXMpIHN1cGVyLnNldEl0ZW1zRm9jdXNhYmxlKGl0ZW1zRm9jdXNhYmxlKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgRXhwYW5kYWJsZVBhcmFtcyBzZXRNdXN0RmlsbFNjcmVlbihib29sZWFuIGZpbGxTY3JlZW4pIHsKLSAgICAgICAgICAgIHJldHVybiAoRXhwYW5kYWJsZVBhcmFtcykgc3VwZXIuc2V0TXVzdEZpbGxTY3JlZW4oZmlsbFNjcmVlbik7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIEV4cGFuZGFibGVQYXJhbXMgc2V0UG9zaXRpb25TY3JlZW5TaXplRmFjdG9yT3ZlcnJpZGUoaW50IHBvc2l0aW9uLCBkb3VibGUgaXRlbVNjcmVlblNpemVGYWN0b3IpIHsKLSAgICAgICAgICAgIHJldHVybiAoRXhwYW5kYWJsZVBhcmFtcykgc3VwZXIuc2V0UG9zaXRpb25TY3JlZW5TaXplRmFjdG9yT3ZlcnJpZGUocG9zaXRpb24sIGl0ZW1TY3JlZW5TaXplRmFjdG9yKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgRXhwYW5kYWJsZVBhcmFtcyBzZXRQb3NpdGlvblVuc2VsZWN0YWJsZShpbnQgcG9zaXRpb24pIHsKLSAgICAgICAgICAgIHJldHVybiAoRXhwYW5kYWJsZVBhcmFtcykgc3VwZXIuc2V0UG9zaXRpb25VbnNlbGVjdGFibGUocG9zaXRpb24pOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBFeHBhbmRhYmxlUGFyYW1zIHNldFN0YWNrRnJvbUJvdHRvbShib29sZWFuIHN0YWNrRnJvbUJvdHRvbSkgewotICAgICAgICAgICAgcmV0dXJuIChFeHBhbmRhYmxlUGFyYW1zKSBzdXBlci5zZXRTdGFja0Zyb21Cb3R0b20oc3RhY2tGcm9tQm90dG9tKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgRXhwYW5kYWJsZVBhcmFtcyBzZXRTdGFydGluZ1NlbGVjdGlvblBvc2l0aW9uKGludCBzdGFydGluZ1NlbGVjdGlvblBvc2l0aW9uKSB7Ci0gICAgICAgICAgICByZXR1cm4gKEV4cGFuZGFibGVQYXJhbXMpIHN1cGVyLnNldFN0YXJ0aW5nU2VsZWN0aW9uUG9zaXRpb24oc3RhcnRpbmdTZWxlY3Rpb25Qb3NpdGlvbik7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIEV4cGFuZGFibGVQYXJhbXMgc2V0Q29ubmVjdEFkYXB0ZXIoYm9vbGVhbiBjb25uZWN0QWRhcHRlcikgewotICAgICAgICAgICAgcmV0dXJuIChFeHBhbmRhYmxlUGFyYW1zKSBzdXBlci5zZXRDb25uZWN0QWRhcHRlcihjb25uZWN0QWRhcHRlcik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIGEgc3RyaW5nIGZvciB0aGUgdmFsdWUgb2Ygc29tZSBpdGVtLgotICAgICAqIEBwYXJhbSBwYWNrZWRQb3NpdGlvbiBUaGUgcG9zaXRpb24gb2YgdGhlIGl0ZW0uCi0gICAgICogQHJldHVybiBUaGUgc3RyaW5nLgotICAgICAqLwotICAgIHB1YmxpYyBmaW5hbCBTdHJpbmcgZ2V0VmFsdWVBdFBvc2l0aW9uKGxvbmcgcGFja2VkUG9zaXRpb24pIHsKLSAgICAgICAgZmluYWwgaW50IHR5cGUgPSBFeHBhbmRhYmxlTGlzdFZpZXcuZ2V0UGFja2VkUG9zaXRpb25UeXBlKHBhY2tlZFBvc2l0aW9uKTsKLSAgICAgICAgCi0gICAgICAgIGlmICh0eXBlID09IEV4cGFuZGFibGVMaXN0Vmlldy5QQUNLRURfUE9TSVRJT05fVFlQRV9DSElMRCkgewotICAgICAgICAgICAgcmV0dXJuIG1Hcm91cHMuZ2V0KEV4cGFuZGFibGVMaXN0Vmlldy5nZXRQYWNrZWRQb3NpdGlvbkdyb3VwKHBhY2tlZFBvc2l0aW9uKSkKLSAgICAgICAgICAgICAgICAgICAgLmNoaWxkcmVuLmdldChFeHBhbmRhYmxlTGlzdFZpZXcuZ2V0UGFja2VkUG9zaXRpb25DaGlsZChwYWNrZWRQb3NpdGlvbikpCi0gICAgICAgICAgICAgICAgICAgIC5uYW1lOwotICAgICAgICB9IGVsc2UgaWYgKHR5cGUgPT0gRXhwYW5kYWJsZUxpc3RWaWV3LlBBQ0tFRF9QT1NJVElPTl9UWVBFX0dST1VQKSB7Ci0gICAgICAgICAgICByZXR1cm4gbUdyb3Vwcy5nZXQoRXhwYW5kYWJsZUxpc3RWaWV3LmdldFBhY2tlZFBvc2l0aW9uR3JvdXAocGFja2VkUG9zaXRpb24pKQotICAgICAgICAgICAgICAgICAgICAubmFtZTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oInBhY2tlZFBvc2l0aW9uIGlzIG5vdCBhIHZhbGlkIHBvc2l0aW9uLiIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogV2hldGhlciBhIHBhcnRpY3VsYXIgcG9zaXRpb24gaXMgb3V0IG9mIGJvdW5kcy4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gcGFja2VkUG9zaXRpb24gVGhlIHBhY2tlZCBwb3NpdGlvbi4KLSAgICAgKiBAcmV0dXJuIFdoZXRoZXIgaXQncyBvdXQgb2YgYm91bmRzLgotICAgICAqLwotICAgIHByaXZhdGUgYm9vbGVhbiBpc091dE9mQm91bmRzKGxvbmcgcGFja2VkUG9zaXRpb24pIHsKLSAgICAgICAgZmluYWwgaW50IHR5cGUgPSBFeHBhbmRhYmxlTGlzdFZpZXcuZ2V0UGFja2VkUG9zaXRpb25UeXBlKHBhY2tlZFBvc2l0aW9uKTsKLSAgICAgICAgCi0gICAgICAgIGlmICh0eXBlID09IEV4cGFuZGFibGVMaXN0Vmlldy5QQUNLRURfUE9TSVRJT05fVFlQRV9OVUxMKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJwYWNrZWRQb3NpdGlvbiBpcyBub3QgYSB2YWxpZCBwb3NpdGlvbi4iKTsKLSAgICAgICAgfQotCi0gICAgICAgIGZpbmFsIGludCBncm91cCA9IEV4cGFuZGFibGVMaXN0Vmlldy5nZXRQYWNrZWRQb3NpdGlvbkdyb3VwKHBhY2tlZFBvc2l0aW9uKTsgCi0gICAgICAgIGlmIChncm91cCA+PSBtR3JvdXBzLnNpemUoKSB8fCBncm91cCA8IDApIHsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBpZiAodHlwZSA9PSBFeHBhbmRhYmxlTGlzdFZpZXcuUEFDS0VEX1BPU0lUSU9OX1RZUEVfQ0hJTEQpIHsKLSAgICAgICAgICAgIGZpbmFsIGludCBjaGlsZCA9IEV4cGFuZGFibGVMaXN0Vmlldy5nZXRQYWNrZWRQb3NpdGlvbkNoaWxkKHBhY2tlZFBvc2l0aW9uKTsgCi0gICAgICAgICAgICBpZiAoY2hpbGQgPj0gbUdyb3Vwcy5nZXQoZ3JvdXApLmNoaWxkcmVuLnNpemUoKSB8fCBjaGlsZCA8IDApIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBHZXRzIGEgdmlldyBmb3IgdGhlIHBhY2tlZCBwb3NpdGlvbiwgcG9zc2libHkgcmV1c2luZyB0aGUgY29udmVydFZpZXcuCi0gICAgICogCi0gICAgICogQHBhcmFtIHBhY2tlZFBvc2l0aW9uIFRoZSBwb3NpdGlvbiB0byBnZXQgYSB2aWV3IGZvci4KLSAgICAgKiBAcGFyYW0gY29udmVydFZpZXcgT3B0aW9uYWwgdmlldyB0byBjb252ZXJ0LgotICAgICAqIEBwYXJhbSBwYXJlbnQgVGhlIGZ1dHVyZSBwYXJlbnQuCi0gICAgICogQHJldHVybiBBIHZpZXcuCi0gICAgICovCi0gICAgcHJpdmF0ZSBWaWV3IGdldFZpZXcobG9uZyBwYWNrZWRQb3NpdGlvbiwgVmlldyBjb252ZXJ0VmlldywgVmlld0dyb3VwIHBhcmVudCkgewotICAgICAgICBpZiAoaXNPdXRPZkJvdW5kcyhwYWNrZWRQb3NpdGlvbikpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oInBvc2l0aW9uIG91dCBvZiByYW5nZSBmb3IgYWRhcHRlciEiKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgZmluYWwgRXhwYW5kYWJsZUxpc3RWaWV3IGVsdiA9IGdldEV4cGFuZGFibGVMaXN0VmlldygpOwotICAgICAgICBmaW5hbCBpbnQgZmxQb3MgPSBlbHYuZ2V0RmxhdExpc3RQb3NpdGlvbihwYWNrZWRQb3NpdGlvbik7IAotICAgICAgICAKLSAgICAgICAgaWYgKGNvbnZlcnRWaWV3ICE9IG51bGwpIHsKLSAgICAgICAgICAgICgoVGV4dFZpZXcpIGNvbnZlcnRWaWV3KS5zZXRUZXh0KGdldFZhbHVlQXRQb3NpdGlvbihwYWNrZWRQb3NpdGlvbikpOwotICAgICAgICAgICAgY29udmVydFZpZXcuc2V0SWQoZmxQb3MpOwotICAgICAgICAgICAgcmV0dXJuIGNvbnZlcnRWaWV3OwotICAgICAgICB9Ci0KLSAgICAgICAgaW50IGRlc2lyZWRIZWlnaHQgPSBnZXRIZWlnaHRGb3JQb3NpdGlvbihmbFBvcyk7Ci0gICAgICAgIHJldHVybiBjcmVhdGVWaWV3KHBhY2tlZFBvc2l0aW9uLCBmbFBvcywgcGFyZW50LCBkZXNpcmVkSGVpZ2h0KTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGEgdmlldyBmb3IgYSBncm91cCBvciBjaGlsZCBwb3NpdGlvbi4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gcGFja2VkUG9zaXRpb24gVGhlIHBhY2tlZCBwb3NpdGlvbiAoaGFzIHR5cGUsIGdyb3VwIHBvcywgYW5kIG9wdGlvbmFsbHkgY2hpbGQgcG9zKS4KLSAgICAgKiBAcGFyYW0gZmxQb3MgVGhlIGZsYXQgbGlzdCBwb3NpdGlvbiAodGhlIHBvc2l0aW9uIHRoYXQgdGhlIExpc3RWaWV3IGdvZXMgYnkpLgotICAgICAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCB2aWV3LgotICAgICAqIEBwYXJhbSBkZXNpcmVkSGVpZ2h0IFRoZSBkZXNpcmVkIGhlaWdodC4KLSAgICAgKiBAcmV0dXJuIEEgdmlldy4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgVmlldyBjcmVhdGVWaWV3KGxvbmcgcGFja2VkUG9zaXRpb24sIGludCBmbFBvcywgVmlld0dyb3VwIHBhcmVudCwgaW50IGRlc2lyZWRIZWlnaHQpIHsKLSAgICAgICAgVGV4dFZpZXcgcmVzdWx0ID0gbmV3IFRleHRWaWV3KHBhcmVudC5nZXRDb250ZXh0KCkpOwotICAgICAgICByZXN1bHQuc2V0SGVpZ2h0KGRlc2lyZWRIZWlnaHQpOwotICAgICAgICByZXN1bHQuc2V0VGV4dChnZXRWYWx1ZUF0UG9zaXRpb24ocGFja2VkUG9zaXRpb24pKTsKLSAgICAgICAgZmluYWwgVmlld0dyb3VwLkxheW91dFBhcmFtcyBscCA9IG5ldyBBYnNMaXN0Vmlldy5MYXlvdXRQYXJhbXMoCi0gICAgICAgICAgICAgICAgVmlld0dyb3VwLkxheW91dFBhcmFtcy5NQVRDSF9QQVJFTlQsCi0gICAgICAgICAgICAgICAgVmlld0dyb3VwLkxheW91dFBhcmFtcy5XUkFQX0NPTlRFTlQpOwotICAgICAgICByZXN1bHQuc2V0TGF5b3V0UGFyYW1zKGxwKTsKLSAgICAgICAgcmVzdWx0LnNldEdyYXZpdHkoR3Jhdml0eS5DRU5URVJfVkVSVElDQUwpOwotICAgICAgICByZXN1bHQuc2V0UGFkZGluZygzNiwgMCwgMCwgMCk7Ci0gICAgICAgIHJlc3VsdC5zZXRJZChmbFBvcyk7Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFJldHVybnMgYSBncm91cCBpbmRleCBjb250YWluaW5nIGVpdGhlciB0aGUgbnVtYmVyIG9mIGNoaWxkcmVuIG9yIGF0Ci0gICAgICogbGVhc3Qgb25lIGNoaWxkLgotICAgICAqIAotICAgICAqIEBwYXJhbSBudW1DaGlsZHJlbiBUaGUgZ3JvdXAgbXVzdCBoYXZlIHRoaXMgYW1vdW50LCBvciAtMSBpZiB1c2luZwotICAgICAqICAgICAgICAgICAgYXRMZWFzdE9uZUNoaWxkLgotICAgICAqIEBwYXJhbSBhdExlYXN0T25lQ2hpbGQgVGhlIGdyb3VwIG11c3QgaGF2ZSBhdCBsZWFzdCBvbmUgY2hpbGQsIG9yIGZhbHNlCi0gICAgICogICAgICAgICAgICBpZiB1c2luZyBudW1DaGlsZHJlbi4KLSAgICAgKiBAcmV0dXJuIEEgZ3JvdXAgaW5kZXggd2l0aCB0aGUgcmVxdWlyZW1lbnRzLgotICAgICAqLwotICAgIHB1YmxpYyBpbnQgZmluZEdyb3VwV2l0aE51bUNoaWxkcmVuKGludCBudW1DaGlsZHJlbiwgYm9vbGVhbiBhdExlYXN0T25lQ2hpbGQpIHsKLSAgICAgICAgZmluYWwgRXhwYW5kYWJsZUxpc3RBZGFwdGVyIGFkYXB0ZXIgPSBtQWRhcHRlcjsKLSAgICAgICAgCi0gICAgICAgIGZvciAoaW50IGkgPSBhZGFwdGVyLmdldEdyb3VwQ291bnQoKSAtIDE7IGkgPj0gMDsgaS0tKSB7Ci0gICAgICAgICAgICBmaW5hbCBpbnQgY3VyTnVtQ2hpbGRyZW4gPSBhZGFwdGVyLmdldENoaWxkcmVuQ291bnQoaSk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmIChudW1DaGlsZHJlbiA9PSBjdXJOdW1DaGlsZHJlbiB8fCBhdExlYXN0T25lQ2hpbGQgJiYgY3VyTnVtQ2hpbGRyZW4gPiAwKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIExpc3Q8TXlHcm91cD4gZ2V0R3JvdXBzKCkgewotICAgICAgICByZXR1cm4gbUdyb3VwczsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIEV4cGFuZGFibGVMaXN0QWRhcHRlciBnZXRBZGFwdGVyKCkgewotICAgICAgICByZXR1cm4gbUFkYXB0ZXI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2ltcGxlIGV4cGFuZGFibGUgbGlzdCBhZGFwdGVyLgotICAgICAqLwotICAgIHByb3RlY3RlZCBjbGFzcyBNeUFkYXB0ZXIgZXh0ZW5kcyBCYXNlRXhwYW5kYWJsZUxpc3RBZGFwdGVyIHsKLSAgICAgICAgcHVibGljIE9iamVjdCBnZXRDaGlsZChpbnQgZ3JvdXBQb3NpdGlvbiwgaW50IGNoaWxkUG9zaXRpb24pIHsKLSAgICAgICAgICAgIHJldHVybiBnZXRWYWx1ZUF0UG9zaXRpb24oRXhwYW5kYWJsZUxpc3RWaWV3LmdldFBhY2tlZFBvc2l0aW9uRm9yQ2hpbGQoZ3JvdXBQb3NpdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgY2hpbGRQb3NpdGlvbikpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGxvbmcgZ2V0Q2hpbGRJZChpbnQgZ3JvdXBQb3NpdGlvbiwgaW50IGNoaWxkUG9zaXRpb24pIHsKLSAgICAgICAgICAgIHJldHVybiBtR3JvdXBzLmdldChncm91cFBvc2l0aW9uKS5jaGlsZHJlbi5nZXQoY2hpbGRQb3NpdGlvbikuaWQ7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgaW50IGdldENoaWxkcmVuQ291bnQoaW50IGdyb3VwUG9zaXRpb24pIHsKLSAgICAgICAgICAgIHJldHVybiBtR3JvdXBzLmdldChncm91cFBvc2l0aW9uKS5jaGlsZHJlbi5zaXplKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgVmlldyBnZXRDaGlsZFZpZXcoaW50IGdyb3VwUG9zaXRpb24sIGludCBjaGlsZFBvc2l0aW9uLCBib29sZWFuIGlzTGFzdENoaWxkLAotICAgICAgICAgICAgICAgIFZpZXcgY29udmVydFZpZXcsIFZpZXdHcm91cCBwYXJlbnQpIHsKLSAgICAgICAgICAgIHJldHVybiBnZXRWaWV3KEV4cGFuZGFibGVMaXN0Vmlldy5nZXRQYWNrZWRQb3NpdGlvbkZvckNoaWxkKGdyb3VwUG9zaXRpb24sCi0gICAgICAgICAgICAgICAgICAgIGNoaWxkUG9zaXRpb24pLCBjb252ZXJ0VmlldywgcGFyZW50KTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBPYmplY3QgZ2V0R3JvdXAoaW50IGdyb3VwUG9zaXRpb24pIHsKLSAgICAgICAgICAgIHJldHVybiBnZXRWYWx1ZUF0UG9zaXRpb24oRXhwYW5kYWJsZUxpc3RWaWV3LmdldFBhY2tlZFBvc2l0aW9uRm9yR3JvdXAoZ3JvdXBQb3NpdGlvbikpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGludCBnZXRHcm91cENvdW50KCkgewotICAgICAgICAgICAgcmV0dXJuIG1Hcm91cHMuc2l6ZSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGxvbmcgZ2V0R3JvdXBJZChpbnQgZ3JvdXBQb3NpdGlvbikgewotICAgICAgICAgICAgcmV0dXJuIG1Hcm91cHMuZ2V0KGdyb3VwUG9zaXRpb24pLmlkOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIFZpZXcgZ2V0R3JvdXBWaWV3KGludCBncm91cFBvc2l0aW9uLCBib29sZWFuIGlzRXhwYW5kZWQsIFZpZXcgY29udmVydFZpZXcsCi0gICAgICAgICAgICAgICAgVmlld0dyb3VwIHBhcmVudCkgewotICAgICAgICAgICAgcmV0dXJuIGdldFZpZXcoRXhwYW5kYWJsZUxpc3RWaWV3LmdldFBhY2tlZFBvc2l0aW9uRm9yR3JvdXAoZ3JvdXBQb3NpdGlvbiksCi0gICAgICAgICAgICAgICAgICAgIGNvbnZlcnRWaWV3LCBwYXJlbnQpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGJvb2xlYW4gaXNDaGlsZFNlbGVjdGFibGUoaW50IGdyb3VwUG9zaXRpb24sIGludCBjaGlsZFBvc2l0aW9uKSB7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGhhc1N0YWJsZUlkcygpIHsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIAotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgTXlHcm91cCB7Ci0gICAgICAgIHByaXZhdGUgc3RhdGljIGxvbmcgbU5leHRJZCA9IDEwMDA7Ci0gICAgICAgIAotICAgICAgICBTdHJpbmcgbmFtZTsKLSAgICAgICAgbG9uZyBpZCA9IG1OZXh0SWQrKzsKLSAgICAgICAgTGlzdDxNeUNoaWxkPiBjaGlsZHJlbjsKLSAgICAgICAgCi0gICAgICAgIHB1YmxpYyBNeUdyb3VwKGludCBudW1DaGlsZHJlbikgewotICAgICAgICAgICAgbmFtZSA9ICJHcm91cCAiICsgaWQ7Ci0gICAgICAgICAgICBjaGlsZHJlbiA9IG5ldyBBcnJheUxpc3Q8TXlDaGlsZD4obnVtQ2hpbGRyZW4pOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1DaGlsZHJlbjsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgY2hpbGRyZW4uYWRkKG5ldyBNeUNoaWxkKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgTXlDaGlsZCB7Ci0gICAgICAgIHByaXZhdGUgc3RhdGljIGxvbmcgbU5leHRJZCA9IDIwMDA7Ci0gICAgICAgIAotICAgICAgICBTdHJpbmcgbmFtZTsKLSAgICAgICAgbG9uZyBpZCA9IG1OZXh0SWQrKzsKLSAgICAgICAgCi0gICAgICAgIHB1YmxpYyBNeUNoaWxkKCkgewotICAgICAgICAgICAgbmFtZSA9ICJDaGlsZCAiICsgaWQ7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIGZpbmFsIHZvaWQgaW5pdChQYXJhbXMgcGFyYW1zKSB7Ci0gICAgICAgIGluaXQoKEV4cGFuZGFibGVQYXJhbXMpIHBhcmFtcyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHNlZSBMaXN0U2NlbmFyaW8jaW5pdAotICAgICAqLwotICAgIHByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGluaXQoRXhwYW5kYWJsZVBhcmFtcyBwYXJhbXMpOwotfQpkaWZmIC0tZ2l0IGEvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvdXRpbC9Kc29uUmVhZGVyVGVzdC5qYXZhIGIvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvdXRpbC9Kc29uUmVhZGVyVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNlZDkzMTAKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC91dGlsL0pzb25SZWFkZXJUZXN0LmphdmEKQEAgLTAsMCArMSw2ODMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQudXRpbDsKKworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5TdHJpbmdSZWFkZXI7CisKK3B1YmxpYyBmaW5hbCBjbGFzcyBKc29uUmVhZGVyVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKKworICAgIHB1YmxpYyB2b2lkIHRlc3RSZWFkQXJyYXkoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBKc29uUmVhZGVyIHJlYWRlciA9IG5ldyBKc29uUmVhZGVyKG5ldyBTdHJpbmdSZWFkZXIoIlt0cnVlLCB0cnVlXSIpKTsKKyAgICAgICAgcmVhZGVyLmJlZ2luQXJyYXkoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHRydWUsIHJlYWRlci5uZXh0Qm9vbGVhbigpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHRydWUsIHJlYWRlci5uZXh0Qm9vbGVhbigpKTsKKyAgICAgICAgcmVhZGVyLmVuZEFycmF5KCk7CisgICAgICAgIGFzc2VydEVxdWFscyhKc29uVG9rZW4uRU5EX0RPQ1VNRU5ULCByZWFkZXIucGVlaygpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVhZEVtcHR5QXJyYXkoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBKc29uUmVhZGVyIHJlYWRlciA9IG5ldyBKc29uUmVhZGVyKG5ldyBTdHJpbmdSZWFkZXIoIltdIikpOworICAgICAgICByZWFkZXIuYmVnaW5BcnJheSgpOworICAgICAgICBhc3NlcnRGYWxzZShyZWFkZXIuaGFzTmV4dCgpKTsKKyAgICAgICAgcmVhZGVyLmVuZEFycmF5KCk7CisgICAgICAgIGFzc2VydEVxdWFscyhKc29uVG9rZW4uRU5EX0RPQ1VNRU5ULCByZWFkZXIucGVlaygpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVhZE9iamVjdCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIEpzb25SZWFkZXIgcmVhZGVyID0gbmV3IEpzb25SZWFkZXIobmV3IFN0cmluZ1JlYWRlcigKKyAgICAgICAgICAgICAgICAie1wiYVwiOiBcImFuZHJvaWRcIiwgXCJiXCI6IFwiYmFuYW5hXCJ9IikpOworICAgICAgICByZWFkZXIuYmVnaW5PYmplY3QoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJhIiwgcmVhZGVyLm5leHROYW1lKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImFuZHJvaWQiLCByZWFkZXIubmV4dFN0cmluZygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJiIiwgcmVhZGVyLm5leHROYW1lKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImJhbmFuYSIsIHJlYWRlci5uZXh0U3RyaW5nKCkpOworICAgICAgICByZWFkZXIuZW5kT2JqZWN0KCk7CisgICAgICAgIGFzc2VydEVxdWFscyhKc29uVG9rZW4uRU5EX0RPQ1VNRU5ULCByZWFkZXIucGVlaygpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVhZEVtcHR5T2JqZWN0KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgSnNvblJlYWRlciByZWFkZXIgPSBuZXcgSnNvblJlYWRlcihuZXcgU3RyaW5nUmVhZGVyKCJ7fSIpKTsKKyAgICAgICAgcmVhZGVyLmJlZ2luT2JqZWN0KCk7CisgICAgICAgIGFzc2VydEZhbHNlKHJlYWRlci5oYXNOZXh0KCkpOworICAgICAgICByZWFkZXIuZW5kT2JqZWN0KCk7CisgICAgICAgIGFzc2VydEVxdWFscyhKc29uVG9rZW4uRU5EX0RPQ1VNRU5ULCByZWFkZXIucGVlaygpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2tpcE9iamVjdCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIEpzb25SZWFkZXIgcmVhZGVyID0gbmV3IEpzb25SZWFkZXIobmV3IFN0cmluZ1JlYWRlcigKKyAgICAgICAgICAgICAgICAie1wiYVwiOiB7IFwiY1wiOiBbXSwgXCJkXCI6IFt0cnVlLCB0cnVlLCB7fV0gfSwgXCJiXCI6IFwiYmFuYW5hXCJ9IikpOworICAgICAgICByZWFkZXIuYmVnaW5PYmplY3QoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJhIiwgcmVhZGVyLm5leHROYW1lKCkpOworICAgICAgICByZWFkZXIuc2tpcFZhbHVlKCk7CisgICAgICAgIGFzc2VydEVxdWFscygiYiIsIHJlYWRlci5uZXh0TmFtZSgpKTsKKyAgICAgICAgcmVhZGVyLnNraXBWYWx1ZSgpOworICAgICAgICByZWFkZXIuZW5kT2JqZWN0KCk7CisgICAgICAgIGFzc2VydEVxdWFscyhKc29uVG9rZW4uRU5EX0RPQ1VNRU5ULCByZWFkZXIucGVlaygpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SGVsbG9Xb3JsZCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIFN0cmluZyBqc29uID0gIntcbiIgKworICAgICAgICAgICAgICAgICIgICBcImhlbGxvXCI6IHRydWUsXG4iICsKKyAgICAgICAgICAgICAgICAiICAgXCJmb29cIjogW1wid29ybGRcIl1cbiIgKworICAgICAgICAgICAgICAgICJ9IjsKKyAgICAgICAgSnNvblJlYWRlciByZWFkZXIgPSBuZXcgSnNvblJlYWRlcihuZXcgU3RyaW5nUmVhZGVyKGpzb24pKTsKKyAgICAgICAgcmVhZGVyLmJlZ2luT2JqZWN0KCk7CisgICAgICAgIGFzc2VydEVxdWFscygiaGVsbG8iLCByZWFkZXIubmV4dE5hbWUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyh0cnVlLCByZWFkZXIubmV4dEJvb2xlYW4oKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiZm9vIiwgcmVhZGVyLm5leHROYW1lKCkpOworICAgICAgICByZWFkZXIuYmVnaW5BcnJheSgpOworICAgICAgICBhc3NlcnRFcXVhbHMoIndvcmxkIiwgcmVhZGVyLm5leHRTdHJpbmcoKSk7CisgICAgICAgIHJlYWRlci5lbmRBcnJheSgpOworICAgICAgICByZWFkZXIuZW5kT2JqZWN0KCk7CisgICAgICAgIGFzc2VydEVxdWFscyhKc29uVG9rZW4uRU5EX0RPQ1VNRU5ULCByZWFkZXIucGVlaygpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TnVsbHMoKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBuZXcgSnNvblJlYWRlcihudWxsKTsKKyAgICAgICAgICAgIGZhaWwoKTsKKyAgICAgICAgfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZXhwZWN0ZWQpIHsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RFbXB0eVN0cmluZygpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBuZXcgSnNvblJlYWRlcihuZXcgU3RyaW5nUmVhZGVyKCIiKSkuYmVnaW5BcnJheSgpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBleHBlY3RlZCkgeworICAgICAgICB9CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBuZXcgSnNvblJlYWRlcihuZXcgU3RyaW5nUmVhZGVyKCIiKSkuYmVnaW5PYmplY3QoKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZXhwZWN0ZWQpIHsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3ROb1RvcExldmVsT2JqZWN0KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG5ldyBKc29uUmVhZGVyKG5ldyBTdHJpbmdSZWFkZXIoInRydWUiKSkubmV4dEJvb2xlYW4oKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZXhwZWN0ZWQpIHsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RDaGFyYWN0ZXJVbmVzY2FwaW5nKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgU3RyaW5nIGpzb24gPSAiW1wiYVwiLCIKKyAgICAgICAgICAgICAgICArICJcImFcXFwiXCIsIgorICAgICAgICAgICAgICAgICsgIlwiXFxcIlwiLCIKKyAgICAgICAgICAgICAgICArICJcIjpcIiwiCisgICAgICAgICAgICAgICAgKyAiXCIsXCIsIgorICAgICAgICAgICAgICAgICsgIlwiXFxiXCIsIgorICAgICAgICAgICAgICAgICsgIlwiXFxmXCIsIgorICAgICAgICAgICAgICAgICsgIlwiXFxuXCIsIgorICAgICAgICAgICAgICAgICsgIlwiXFxyXCIsIgorICAgICAgICAgICAgICAgICsgIlwiXFx0XCIsIgorICAgICAgICAgICAgICAgICsgIlwiIFwiLCIKKyAgICAgICAgICAgICAgICArICJcIlxcXFxcIiwiCisgICAgICAgICAgICAgICAgKyAiXCJ7XCIsIgorICAgICAgICAgICAgICAgICsgIlwifVwiLCIKKyAgICAgICAgICAgICAgICArICJcIltcIiwiCisgICAgICAgICAgICAgICAgKyAiXCJdXCIsIgorICAgICAgICAgICAgICAgICsgIlwiXFx1MDAwMFwiLCIKKyAgICAgICAgICAgICAgICArICJcIlxcdTAwMTlcIiwiCisgICAgICAgICAgICAgICAgKyAiXCJcXHUyMEFDXCIiCisgICAgICAgICAgICAgICAgKyAiXSI7CisgICAgICAgIEpzb25SZWFkZXIgcmVhZGVyID0gbmV3IEpzb25SZWFkZXIobmV3IFN0cmluZ1JlYWRlcihqc29uKSk7CisgICAgICAgIHJlYWRlci5iZWdpbkFycmF5KCk7CisgICAgICAgIGFzc2VydEVxdWFscygiYSIsIHJlYWRlci5uZXh0U3RyaW5nKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImFcIiIsIHJlYWRlci5uZXh0U3RyaW5nKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIlwiIiwgcmVhZGVyLm5leHRTdHJpbmcoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiOiIsIHJlYWRlci5uZXh0U3RyaW5nKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIiwiLCByZWFkZXIubmV4dFN0cmluZygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJcYiIsIHJlYWRlci5uZXh0U3RyaW5nKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIlxmIiwgcmVhZGVyLm5leHRTdHJpbmcoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiXG4iLCByZWFkZXIubmV4dFN0cmluZygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJcciIsIHJlYWRlci5uZXh0U3RyaW5nKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIlx0IiwgcmVhZGVyLm5leHRTdHJpbmcoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiICIsIHJlYWRlci5uZXh0U3RyaW5nKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIlxcIiwgcmVhZGVyLm5leHRTdHJpbmcoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygieyIsIHJlYWRlci5uZXh0U3RyaW5nKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIn0iLCByZWFkZXIubmV4dFN0cmluZygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJbIiwgcmVhZGVyLm5leHRTdHJpbmcoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiXSIsIHJlYWRlci5uZXh0U3RyaW5nKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIlwwIiwgcmVhZGVyLm5leHRTdHJpbmcoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiXHUwMDE5IiwgcmVhZGVyLm5leHRTdHJpbmcoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiXHUyMEFDIiwgcmVhZGVyLm5leHRTdHJpbmcoKSk7CisgICAgICAgIHJlYWRlci5lbmRBcnJheSgpOworICAgICAgICBhc3NlcnRFcXVhbHMoSnNvblRva2VuLkVORF9ET0NVTUVOVCwgcmVhZGVyLnBlZWsoKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEludGVnZXJzV2l0aEZyYWN0aW9uYWxQYXJ0U3BlY2lmaWVkKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgSnNvblJlYWRlciByZWFkZXIgPSBuZXcgSnNvblJlYWRlcihuZXcgU3RyaW5nUmVhZGVyKCJbMS4wLDEuMCwxLjBdIikpOworICAgICAgICByZWFkZXIuYmVnaW5BcnJheSgpOworICAgICAgICBhc3NlcnRFcXVhbHMoMS4wLCByZWFkZXIubmV4dERvdWJsZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIHJlYWRlci5uZXh0SW50KCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMUwsIHJlYWRlci5uZXh0TG9uZygpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RG91YmxlcygpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIFN0cmluZyBqc29uID0gIlstMC4wLCIKKyAgICAgICAgICAgICAgICArICIxLjAsIgorICAgICAgICAgICAgICAgICsgIjEuNzk3NjkzMTM0ODYyMzE1N0UzMDgsIgorICAgICAgICAgICAgICAgICsgIjQuOUUtMzI0LCIKKyAgICAgICAgICAgICAgICArICIwLjAsIgorICAgICAgICAgICAgICAgICsgIi0wLjUsIgorICAgICAgICAgICAgICAgICsgIjIuMjI1MDczODU4NTA3MjAxNEUtMzA4LCIKKyAgICAgICAgICAgICAgICArICIzLjE0MTU5MjY1MzU4OTc5MywiCisgICAgICAgICAgICAgICAgKyAiMi43MTgyODE4Mjg0NTkwNDVdIjsKKyAgICAgICAgSnNvblJlYWRlciByZWFkZXIgPSBuZXcgSnNvblJlYWRlcihuZXcgU3RyaW5nUmVhZGVyKGpzb24pKTsKKyAgICAgICAgcmVhZGVyLmJlZ2luQXJyYXkoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKC0wLjAsIHJlYWRlci5uZXh0RG91YmxlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMS4wLCByZWFkZXIubmV4dERvdWJsZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEuNzk3NjkzMTM0ODYyMzE1N0UzMDgsIHJlYWRlci5uZXh0RG91YmxlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoNC45RS0zMjQsIHJlYWRlci5uZXh0RG91YmxlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMC4wLCByZWFkZXIubmV4dERvdWJsZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKC0wLjUsIHJlYWRlci5uZXh0RG91YmxlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMi4yMjUwNzM4NTg1MDcyMDE0RS0zMDgsIHJlYWRlci5uZXh0RG91YmxlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMy4xNDE1OTI2NTM1ODk3OTMsIHJlYWRlci5uZXh0RG91YmxlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMi43MTgyODE4Mjg0NTkwNDUsIHJlYWRlci5uZXh0RG91YmxlKCkpOworICAgICAgICByZWFkZXIuZW5kQXJyYXkoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKEpzb25Ub2tlbi5FTkRfRE9DVU1FTlQsIHJlYWRlci5wZWVrKCkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3ROb25GaW5pdGVEb3VibGVzKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgU3RyaW5nIGpzb24gPSAiW05hTl0iOworICAgICAgICBKc29uUmVhZGVyIHJlYWRlciA9IG5ldyBKc29uUmVhZGVyKG5ldyBTdHJpbmdSZWFkZXIoanNvbikpOworICAgICAgICByZWFkZXIuYmVnaW5BcnJheSgpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmVhZGVyLm5leHREb3VibGUoKTsKKyAgICAgICAgICAgIGZhaWwoKTsKKyAgICAgICAgfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGV4cGVjdGVkKSB7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TG9uZ3MoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBTdHJpbmcganNvbiA9ICJbMCwwLDAsIgorICAgICAgICAgICAgICAgICsgIjEsMSwxLCIKKyAgICAgICAgICAgICAgICArICItMSwtMSwtMSwiCisgICAgICAgICAgICAgICAgKyAiLTkyMjMzNzIwMzY4NTQ3NzU4MDgsIgorICAgICAgICAgICAgICAgICsgIjkyMjMzNzIwMzY4NTQ3NzU4MDddIjsKKyAgICAgICAgSnNvblJlYWRlciByZWFkZXIgPSBuZXcgSnNvblJlYWRlcihuZXcgU3RyaW5nUmVhZGVyKGpzb24pKTsKKyAgICAgICAgcmVhZGVyLmJlZ2luQXJyYXkoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDBMLCByZWFkZXIubmV4dExvbmcoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygwLCByZWFkZXIubmV4dEludCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAuMCwgcmVhZGVyLm5leHREb3VibGUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygxTCwgcmVhZGVyLm5leHRMb25nKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgcmVhZGVyLm5leHRJbnQoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygxLjAsIHJlYWRlci5uZXh0RG91YmxlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoLTFMLCByZWFkZXIubmV4dExvbmcoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygtMSwgcmVhZGVyLm5leHRJbnQoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygtMS4wLCByZWFkZXIubmV4dERvdWJsZSgpKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJlYWRlci5uZXh0SW50KCk7CisgICAgICAgICAgICBmYWlsKCk7CisgICAgICAgIH0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBleHBlY3RlZCkgeworICAgICAgICB9CisgICAgICAgIGFzc2VydEVxdWFscyhMb25nLk1JTl9WQUxVRSwgcmVhZGVyLm5leHRMb25nKCkpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmVhZGVyLm5leHRJbnQoKTsKKyAgICAgICAgICAgIGZhaWwoKTsKKyAgICAgICAgfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGV4cGVjdGVkKSB7CisgICAgICAgIH0KKyAgICAgICAgYXNzZXJ0RXF1YWxzKExvbmcuTUFYX1ZBTFVFLCByZWFkZXIubmV4dExvbmcoKSk7CisgICAgICAgIHJlYWRlci5lbmRBcnJheSgpOworICAgICAgICBhc3NlcnRFcXVhbHMoSnNvblRva2VuLkVORF9ET0NVTUVOVCwgcmVhZGVyLnBlZWsoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhpcyB0ZXN0IGZhaWxzIGJlY2F1c2UgdGhlcmUncyBubyBkb3VibGUgZm9yIDkyMjMzNzIwMzY4NTQ3NzU4MDYsIGFuZAorICAgICAqIG91ciBsb25nIHBhcnNpbmcgdXNlcyBEb3VibGUucGFyc2VEb3VibGUoKSBmb3IgZnJhY3Rpb25hbCB2YWx1ZXMuCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdEhpZ2hQcmVjaXNpb25Mb25nKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgU3RyaW5nIGpzb24gPSAiWzkyMjMzNzIwMzY4NTQ3NzU4MDYuMDAwXSI7CisgICAgICAgIEpzb25SZWFkZXIgcmVhZGVyID0gbmV3IEpzb25SZWFkZXIobmV3IFN0cmluZ1JlYWRlcihqc29uKSk7CisgICAgICAgIHJlYWRlci5iZWdpbkFycmF5KCk7CisgICAgICAgIGFzc2VydEVxdWFscyg5MjIzMzcyMDM2ODU0Nzc1ODA2TCwgcmVhZGVyLm5leHRMb25nKCkpOworICAgICAgICByZWFkZXIuZW5kQXJyYXkoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TnVtYmVyV2l0aE9jdGFsUHJlZml4KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgU3RyaW5nIGpzb24gPSAiWzAxXSI7CisgICAgICAgIEpzb25SZWFkZXIgcmVhZGVyID0gbmV3IEpzb25SZWFkZXIobmV3IFN0cmluZ1JlYWRlcihqc29uKSk7CisgICAgICAgIHJlYWRlci5iZWdpbkFycmF5KCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZWFkZXIubmV4dEludCgpOworICAgICAgICAgICAgZmFpbCgpOworICAgICAgICB9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZXhwZWN0ZWQpIHsKKyAgICAgICAgfQorICAgICAgICB0cnkgeworICAgICAgICAgICAgcmVhZGVyLm5leHRMb25nKCk7CisgICAgICAgICAgICBmYWlsKCk7CisgICAgICAgIH0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBleHBlY3RlZCkgeworICAgICAgICB9CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZWFkZXIubmV4dERvdWJsZSgpOworICAgICAgICAgICAgZmFpbCgpOworICAgICAgICB9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZXhwZWN0ZWQpIHsKKyAgICAgICAgfQorICAgICAgICBhc3NlcnRFcXVhbHMoIjAxIiwgcmVhZGVyLm5leHRTdHJpbmcoKSk7CisgICAgICAgIHJlYWRlci5lbmRBcnJheSgpOworICAgICAgICBhc3NlcnRFcXVhbHMoSnNvblRva2VuLkVORF9ET0NVTUVOVCwgcmVhZGVyLnBlZWsoKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEJvb2xlYW5zKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgSnNvblJlYWRlciByZWFkZXIgPSBuZXcgSnNvblJlYWRlcihuZXcgU3RyaW5nUmVhZGVyKCJbdHJ1ZSxmYWxzZV0iKSk7CisgICAgICAgIHJlYWRlci5iZWdpbkFycmF5KCk7CisgICAgICAgIGFzc2VydEVxdWFscyh0cnVlLCByZWFkZXIubmV4dEJvb2xlYW4oKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhmYWxzZSwgcmVhZGVyLm5leHRCb29sZWFuKCkpOworICAgICAgICByZWFkZXIuZW5kQXJyYXkoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKEpzb25Ub2tlbi5FTkRfRE9DVU1FTlQsIHJlYWRlci5wZWVrKCkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RNaXhlZENhc2VMaXRlcmFscygpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIEpzb25SZWFkZXIgcmVhZGVyID0gbmV3IEpzb25SZWFkZXIobmV3IFN0cmluZ1JlYWRlcigiW1RydWUsVHJ1RSxGYWxzZSxGQUxTRSxOVUxMLG51bExdIikpOworICAgICAgICByZWFkZXIuYmVnaW5BcnJheSgpOworICAgICAgICBhc3NlcnRFcXVhbHModHJ1ZSwgcmVhZGVyLm5leHRCb29sZWFuKCkpOworICAgICAgICBhc3NlcnRFcXVhbHModHJ1ZSwgcmVhZGVyLm5leHRCb29sZWFuKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoZmFsc2UsIHJlYWRlci5uZXh0Qm9vbGVhbigpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGZhbHNlLCByZWFkZXIubmV4dEJvb2xlYW4oKSk7CisgICAgICAgIHJlYWRlci5uZXh0TnVsbCgpOworICAgICAgICByZWFkZXIubmV4dE51bGwoKTsKKyAgICAgICAgcmVhZGVyLmVuZEFycmF5KCk7CisgICAgICAgIGFzc2VydEVxdWFscyhKc29uVG9rZW4uRU5EX0RPQ1VNRU5ULCByZWFkZXIucGVlaygpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TWlzc2luZ1ZhbHVlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgSnNvblJlYWRlciByZWFkZXIgPSBuZXcgSnNvblJlYWRlcihuZXcgU3RyaW5nUmVhZGVyKCJ7XCJhXCI6fSIpKTsKKyAgICAgICAgcmVhZGVyLmJlZ2luT2JqZWN0KCk7CisgICAgICAgIGFzc2VydEVxdWFscygiYSIsIHJlYWRlci5uZXh0TmFtZSgpKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJlYWRlci5uZXh0U3RyaW5nKCk7CisgICAgICAgICAgICBmYWlsKCk7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGV4cGVjdGVkKSB7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UHJlbWF0dXJlRW5kT2ZJbnB1dCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIEpzb25SZWFkZXIgcmVhZGVyID0gbmV3IEpzb25SZWFkZXIobmV3IFN0cmluZ1JlYWRlcigie1wiYVwiOnRydWUsIikpOworICAgICAgICByZWFkZXIuYmVnaW5PYmplY3QoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJhIiwgcmVhZGVyLm5leHROYW1lKCkpOworICAgICAgICBhc3NlcnRFcXVhbHModHJ1ZSwgcmVhZGVyLm5leHRCb29sZWFuKCkpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmVhZGVyLm5leHROYW1lKCk7CisgICAgICAgICAgICBmYWlsKCk7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGV4cGVjdGVkKSB7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UHJlbWF0dXJlbHlDbG9zZWQoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgSnNvblJlYWRlciByZWFkZXIgPSBuZXcgSnNvblJlYWRlcihuZXcgU3RyaW5nUmVhZGVyKCJ7XCJhXCI6W119IikpOworICAgICAgICAgICAgcmVhZGVyLmJlZ2luT2JqZWN0KCk7CisgICAgICAgICAgICByZWFkZXIuY2xvc2UoKTsKKyAgICAgICAgICAgIHJlYWRlci5uZXh0TmFtZSgpOworICAgICAgICAgICAgZmFpbCgpOworICAgICAgICB9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZXhwZWN0ZWQpIHsKKyAgICAgICAgfQorCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBKc29uUmVhZGVyIHJlYWRlciA9IG5ldyBKc29uUmVhZGVyKG5ldyBTdHJpbmdSZWFkZXIoIntcImFcIjpbXX0iKSk7CisgICAgICAgICAgICByZWFkZXIuY2xvc2UoKTsKKyAgICAgICAgICAgIHJlYWRlci5iZWdpbk9iamVjdCgpOworICAgICAgICAgICAgZmFpbCgpOworICAgICAgICB9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZXhwZWN0ZWQpIHsKKyAgICAgICAgfQorCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBKc29uUmVhZGVyIHJlYWRlciA9IG5ldyBKc29uUmVhZGVyKG5ldyBTdHJpbmdSZWFkZXIoIntcImFcIjp0cnVlfSIpKTsKKyAgICAgICAgICAgIHJlYWRlci5iZWdpbk9iamVjdCgpOworICAgICAgICAgICAgcmVhZGVyLm5leHROYW1lKCk7CisgICAgICAgICAgICByZWFkZXIucGVlaygpOworICAgICAgICAgICAgcmVhZGVyLmNsb3NlKCk7CisgICAgICAgICAgICByZWFkZXIubmV4dEJvb2xlYW4oKTsKKyAgICAgICAgICAgIGZhaWwoKTsKKyAgICAgICAgfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGV4cGVjdGVkKSB7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TmV4dEZhaWx1cmVzRG9Ob3RBZHZhbmNlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgSnNvblJlYWRlciByZWFkZXIgPSBuZXcgSnNvblJlYWRlcihuZXcgU3RyaW5nUmVhZGVyKCJ7XCJhXCI6dHJ1ZX0iKSk7CisgICAgICAgIHJlYWRlci5iZWdpbk9iamVjdCgpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmVhZGVyLm5leHRTdHJpbmcoKTsKKyAgICAgICAgICAgIGZhaWwoKTsKKyAgICAgICAgfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGV4cGVjdGVkKSB7CisgICAgICAgIH0KKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJhIiwgcmVhZGVyLm5leHROYW1lKCkpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmVhZGVyLm5leHROYW1lKCk7CisgICAgICAgICAgICBmYWlsKCk7CisgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBleHBlY3RlZCkgeworICAgICAgICB9CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZWFkZXIuYmVnaW5BcnJheSgpOworICAgICAgICAgICAgZmFpbCgpOworICAgICAgICB9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZXhwZWN0ZWQpIHsKKyAgICAgICAgfQorICAgICAgICB0cnkgeworICAgICAgICAgICAgcmVhZGVyLmVuZEFycmF5KCk7CisgICAgICAgICAgICBmYWlsKCk7CisgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBleHBlY3RlZCkgeworICAgICAgICB9CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZWFkZXIuYmVnaW5PYmplY3QoKTsKKyAgICAgICAgICAgIGZhaWwoKTsKKyAgICAgICAgfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGV4cGVjdGVkKSB7CisgICAgICAgIH0KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJlYWRlci5lbmRPYmplY3QoKTsKKyAgICAgICAgICAgIGZhaWwoKTsKKyAgICAgICAgfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGV4cGVjdGVkKSB7CisgICAgICAgIH0KKyAgICAgICAgYXNzZXJ0RXF1YWxzKHRydWUsIHJlYWRlci5uZXh0Qm9vbGVhbigpKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJlYWRlci5uZXh0U3RyaW5nKCk7CisgICAgICAgICAgICBmYWlsKCk7CisgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBleHBlY3RlZCkgeworICAgICAgICB9CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZWFkZXIubmV4dE5hbWUoKTsKKyAgICAgICAgICAgIGZhaWwoKTsKKyAgICAgICAgfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGV4cGVjdGVkKSB7CisgICAgICAgIH0KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJlYWRlci5iZWdpbkFycmF5KCk7CisgICAgICAgICAgICBmYWlsKCk7CisgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBleHBlY3RlZCkgeworICAgICAgICB9CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZWFkZXIuZW5kQXJyYXkoKTsKKyAgICAgICAgICAgIGZhaWwoKTsKKyAgICAgICAgfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGV4cGVjdGVkKSB7CisgICAgICAgIH0KKyAgICAgICAgcmVhZGVyLmVuZE9iamVjdCgpOworICAgICAgICBhc3NlcnRFcXVhbHMoSnNvblRva2VuLkVORF9ET0NVTUVOVCwgcmVhZGVyLnBlZWsoKSk7CisgICAgICAgIHJlYWRlci5jbG9zZSgpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RTdHJpbmdOdWxsSXNOb3ROdWxsKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgSnNvblJlYWRlciByZWFkZXIgPSBuZXcgSnNvblJlYWRlcihuZXcgU3RyaW5nUmVhZGVyKCJbXCJudWxsXCJdIikpOworICAgICAgICByZWFkZXIuYmVnaW5BcnJheSgpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmVhZGVyLm5leHROdWxsKCk7CisgICAgICAgICAgICBmYWlsKCk7CisgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBleHBlY3RlZCkgeworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdE51bGxMaXRlcmFsSXNOb3RBU3RyaW5nKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICBKc29uUmVhZGVyIHJlYWRlciA9IG5ldyBKc29uUmVhZGVyKG5ldyBTdHJpbmdSZWFkZXIoIltudWxsXSIpKTsKKyAgICAgICAgcmVhZGVyLmJlZ2luQXJyYXkoKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJlYWRlci5uZXh0U3RyaW5nKCk7CisgICAgICAgICAgICBmYWlsKCk7CisgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBleHBlY3RlZCkgeworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFN0cmljdE5hbWVWYWx1ZVNlcGFyYXRvcigpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIEpzb25SZWFkZXIgcmVhZGVyID0gbmV3IEpzb25SZWFkZXIobmV3IFN0cmluZ1JlYWRlcigie1wiYVwiPXRydWV9IikpOworICAgICAgICByZWFkZXIuYmVnaW5PYmplY3QoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJhIiwgcmVhZGVyLm5leHROYW1lKCkpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmVhZGVyLm5leHRCb29sZWFuKCk7CisgICAgICAgICAgICBmYWlsKCk7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGV4cGVjdGVkKSB7CisgICAgICAgIH0KKworICAgICAgICByZWFkZXIgPSBuZXcgSnNvblJlYWRlcihuZXcgU3RyaW5nUmVhZGVyKCJ7XCJhXCI9PnRydWV9IikpOworICAgICAgICByZWFkZXIuYmVnaW5PYmplY3QoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJhIiwgcmVhZGVyLm5leHROYW1lKCkpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmVhZGVyLm5leHRCb29sZWFuKCk7CisgICAgICAgICAgICBmYWlsKCk7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGV4cGVjdGVkKSB7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TGVuaWVudE5hbWVWYWx1ZVNlcGFyYXRvcigpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIEpzb25SZWFkZXIgcmVhZGVyID0gbmV3IEpzb25SZWFkZXIobmV3IFN0cmluZ1JlYWRlcigie1wiYVwiPXRydWV9IikpOworICAgICAgICByZWFkZXIuc2V0TGVuaWVudCh0cnVlKTsKKyAgICAgICAgcmVhZGVyLmJlZ2luT2JqZWN0KCk7CisgICAgICAgIGFzc2VydEVxdWFscygiYSIsIHJlYWRlci5uZXh0TmFtZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHRydWUsIHJlYWRlci5uZXh0Qm9vbGVhbigpKTsKKworICAgICAgICByZWFkZXIgPSBuZXcgSnNvblJlYWRlcihuZXcgU3RyaW5nUmVhZGVyKCJ7XCJhXCI9PnRydWV9IikpOworICAgICAgICByZWFkZXIuc2V0TGVuaWVudCh0cnVlKTsKKyAgICAgICAgcmVhZGVyLmJlZ2luT2JqZWN0KCk7CisgICAgICAgIGFzc2VydEVxdWFscygiYSIsIHJlYWRlci5uZXh0TmFtZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHRydWUsIHJlYWRlci5uZXh0Qm9vbGVhbigpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U3RyaWN0Q29tbWVudHMoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBKc29uUmVhZGVyIHJlYWRlciA9IG5ldyBKc29uUmVhZGVyKG5ldyBTdHJpbmdSZWFkZXIoIlsvLyBjb21tZW50IFxuIHRydWVdIikpOworICAgICAgICByZWFkZXIuYmVnaW5BcnJheSgpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmVhZGVyLm5leHRCb29sZWFuKCk7CisgICAgICAgICAgICBmYWlsKCk7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGV4cGVjdGVkKSB7CisgICAgICAgIH0KKworICAgICAgICByZWFkZXIgPSBuZXcgSnNvblJlYWRlcihuZXcgU3RyaW5nUmVhZGVyKCJbIyBjb21tZW50IFxuIHRydWVdIikpOworICAgICAgICByZWFkZXIuYmVnaW5BcnJheSgpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmVhZGVyLm5leHRCb29sZWFuKCk7CisgICAgICAgICAgICBmYWlsKCk7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGV4cGVjdGVkKSB7CisgICAgICAgIH0KKworICAgICAgICByZWFkZXIgPSBuZXcgSnNvblJlYWRlcihuZXcgU3RyaW5nUmVhZGVyKCJbLyogY29tbWVudCAqLyB0cnVlXSIpKTsKKyAgICAgICAgcmVhZGVyLmJlZ2luQXJyYXkoKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJlYWRlci5uZXh0Qm9vbGVhbigpOworICAgICAgICAgICAgZmFpbCgpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBleHBlY3RlZCkgeworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdExlbmllbnRDb21tZW50cygpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIEpzb25SZWFkZXIgcmVhZGVyID0gbmV3IEpzb25SZWFkZXIobmV3IFN0cmluZ1JlYWRlcigiWy8vIGNvbW1lbnQgXG4gdHJ1ZV0iKSk7CisgICAgICAgIHJlYWRlci5zZXRMZW5pZW50KHRydWUpOworICAgICAgICByZWFkZXIuYmVnaW5BcnJheSgpOworICAgICAgICBhc3NlcnRFcXVhbHModHJ1ZSwgcmVhZGVyLm5leHRCb29sZWFuKCkpOworCisgICAgICAgIHJlYWRlciA9IG5ldyBKc29uUmVhZGVyKG5ldyBTdHJpbmdSZWFkZXIoIlsjIGNvbW1lbnQgXG4gdHJ1ZV0iKSk7CisgICAgICAgIHJlYWRlci5zZXRMZW5pZW50KHRydWUpOworICAgICAgICByZWFkZXIuYmVnaW5BcnJheSgpOworICAgICAgICBhc3NlcnRFcXVhbHModHJ1ZSwgcmVhZGVyLm5leHRCb29sZWFuKCkpOworCisgICAgICAgIHJlYWRlciA9IG5ldyBKc29uUmVhZGVyKG5ldyBTdHJpbmdSZWFkZXIoIlsvKiBjb21tZW50ICovIHRydWVdIikpOworICAgICAgICByZWFkZXIuc2V0TGVuaWVudCh0cnVlKTsKKyAgICAgICAgcmVhZGVyLmJlZ2luQXJyYXkoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHRydWUsIHJlYWRlci5uZXh0Qm9vbGVhbigpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U3RyaWN0VW5xdW90ZWROYW1lcygpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIEpzb25SZWFkZXIgcmVhZGVyID0gbmV3IEpzb25SZWFkZXIobmV3IFN0cmluZ1JlYWRlcigie2E6dHJ1ZX0iKSk7CisgICAgICAgIHJlYWRlci5iZWdpbk9iamVjdCgpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmVhZGVyLm5leHROYW1lKCk7CisgICAgICAgICAgICBmYWlsKCk7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGV4cGVjdGVkKSB7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TGVuaWVudFVucXVvdGVkTmFtZXMoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBKc29uUmVhZGVyIHJlYWRlciA9IG5ldyBKc29uUmVhZGVyKG5ldyBTdHJpbmdSZWFkZXIoInthOnRydWV9IikpOworICAgICAgICByZWFkZXIuc2V0TGVuaWVudCh0cnVlKTsKKyAgICAgICAgcmVhZGVyLmJlZ2luT2JqZWN0KCk7CisgICAgICAgIGFzc2VydEVxdWFscygiYSIsIHJlYWRlci5uZXh0TmFtZSgpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U3RyaWN0U2luZ2xlUXVvdGVkTmFtZXMoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBKc29uUmVhZGVyIHJlYWRlciA9IG5ldyBKc29uUmVhZGVyKG5ldyBTdHJpbmdSZWFkZXIoInsnYSc6dHJ1ZX0iKSk7CisgICAgICAgIHJlYWRlci5iZWdpbk9iamVjdCgpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmVhZGVyLm5leHROYW1lKCk7CisgICAgICAgICAgICBmYWlsKCk7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGV4cGVjdGVkKSB7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TGVuaWVudFNpbmdsZVF1b3RlZE5hbWVzKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgSnNvblJlYWRlciByZWFkZXIgPSBuZXcgSnNvblJlYWRlcihuZXcgU3RyaW5nUmVhZGVyKCJ7J2EnOnRydWV9IikpOworICAgICAgICByZWFkZXIuc2V0TGVuaWVudCh0cnVlKTsKKyAgICAgICAgcmVhZGVyLmJlZ2luT2JqZWN0KCk7CisgICAgICAgIGFzc2VydEVxdWFscygiYSIsIHJlYWRlci5uZXh0TmFtZSgpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U3RyaWN0VW5xdW90ZWRTdHJpbmdzKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgSnNvblJlYWRlciByZWFkZXIgPSBuZXcgSnNvblJlYWRlcihuZXcgU3RyaW5nUmVhZGVyKCJbYV0iKSk7CisgICAgICAgIHJlYWRlci5iZWdpbkFycmF5KCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZWFkZXIubmV4dFN0cmluZygpOworICAgICAgICAgICAgZmFpbCgpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBleHBlY3RlZCkgeworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdExlbmllbnRVbnF1b3RlZFN0cmluZ3MoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBKc29uUmVhZGVyIHJlYWRlciA9IG5ldyBKc29uUmVhZGVyKG5ldyBTdHJpbmdSZWFkZXIoIlthXSIpKTsKKyAgICAgICAgcmVhZGVyLnNldExlbmllbnQodHJ1ZSk7CisgICAgICAgIHJlYWRlci5iZWdpbkFycmF5KCk7CisgICAgICAgIGFzc2VydEVxdWFscygiYSIsIHJlYWRlci5uZXh0U3RyaW5nKCkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RTdHJpY3RTaW5nbGVRdW90ZWRTdHJpbmdzKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgSnNvblJlYWRlciByZWFkZXIgPSBuZXcgSnNvblJlYWRlcihuZXcgU3RyaW5nUmVhZGVyKCJbJ2EnXSIpKTsKKyAgICAgICAgcmVhZGVyLmJlZ2luQXJyYXkoKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJlYWRlci5uZXh0U3RyaW5nKCk7CisgICAgICAgICAgICBmYWlsKCk7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGV4cGVjdGVkKSB7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TGVuaWVudFNpbmdsZVF1b3RlZFN0cmluZ3MoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBKc29uUmVhZGVyIHJlYWRlciA9IG5ldyBKc29uUmVhZGVyKG5ldyBTdHJpbmdSZWFkZXIoIlsnYSddIikpOworICAgICAgICByZWFkZXIuc2V0TGVuaWVudCh0cnVlKTsKKyAgICAgICAgcmVhZGVyLmJlZ2luQXJyYXkoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJhIiwgcmVhZGVyLm5leHRTdHJpbmcoKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFN0cmljdFNlbWljb2xvbkRlbGltaXRlZEFycmF5KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgSnNvblJlYWRlciByZWFkZXIgPSBuZXcgSnNvblJlYWRlcihuZXcgU3RyaW5nUmVhZGVyKCJbdHJ1ZTt0cnVlXSIpKTsKKyAgICAgICAgcmVhZGVyLmJlZ2luQXJyYXkoKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJlYWRlci5uZXh0Qm9vbGVhbigpOworICAgICAgICAgICAgcmVhZGVyLm5leHRCb29sZWFuKCk7CisgICAgICAgICAgICBmYWlsKCk7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGV4cGVjdGVkKSB7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TGVuaWVudFNlbWljb2xvbkRlbGltaXRlZEFycmF5KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgSnNvblJlYWRlciByZWFkZXIgPSBuZXcgSnNvblJlYWRlcihuZXcgU3RyaW5nUmVhZGVyKCJbdHJ1ZTt0cnVlXSIpKTsKKyAgICAgICAgcmVhZGVyLnNldExlbmllbnQodHJ1ZSk7CisgICAgICAgIHJlYWRlci5iZWdpbkFycmF5KCk7CisgICAgICAgIGFzc2VydEVxdWFscyh0cnVlLCByZWFkZXIubmV4dEJvb2xlYW4oKSk7CisgICAgICAgIGFzc2VydEVxdWFscyh0cnVlLCByZWFkZXIubmV4dEJvb2xlYW4oKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFN0cmljdFNlbWljb2xvbkRlbGltaXRlZE5hbWVWYWx1ZVBhaXIoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBKc29uUmVhZGVyIHJlYWRlciA9IG5ldyBKc29uUmVhZGVyKG5ldyBTdHJpbmdSZWFkZXIoIntcImFcIjp0cnVlO1wiYlwiOnRydWV9IikpOworICAgICAgICByZWFkZXIuYmVnaW5PYmplY3QoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJhIiwgcmVhZGVyLm5leHROYW1lKCkpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmVhZGVyLm5leHRCb29sZWFuKCk7CisgICAgICAgICAgICByZWFkZXIubmV4dE5hbWUoKTsKKyAgICAgICAgICAgIGZhaWwoKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZXhwZWN0ZWQpIHsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RMZW5pZW50U2VtaWNvbG9uRGVsaW1pdGVkTmFtZVZhbHVlUGFpcigpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIEpzb25SZWFkZXIgcmVhZGVyID0gbmV3IEpzb25SZWFkZXIobmV3IFN0cmluZ1JlYWRlcigie1wiYVwiOnRydWU7XCJiXCI6dHJ1ZX0iKSk7CisgICAgICAgIHJlYWRlci5zZXRMZW5pZW50KHRydWUpOworICAgICAgICByZWFkZXIuYmVnaW5PYmplY3QoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJhIiwgcmVhZGVyLm5leHROYW1lKCkpOworICAgICAgICBhc3NlcnRFcXVhbHModHJ1ZSwgcmVhZGVyLm5leHRCb29sZWFuKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImIiLCByZWFkZXIubmV4dE5hbWUoKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFN0cmljdFVubmVjZXNzYXJ5QXJyYXlTZXBhcmF0b3JzKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgSnNvblJlYWRlciByZWFkZXIgPSBuZXcgSnNvblJlYWRlcihuZXcgU3RyaW5nUmVhZGVyKCJbdHJ1ZSwsdHJ1ZV0iKSk7CisgICAgICAgIHJlYWRlci5iZWdpbkFycmF5KCk7CisgICAgICAgIGFzc2VydEVxdWFscyh0cnVlLCByZWFkZXIubmV4dEJvb2xlYW4oKSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZWFkZXIubmV4dE51bGwoKTsKKyAgICAgICAgICAgIGZhaWwoKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZXhwZWN0ZWQpIHsKKyAgICAgICAgfQorCisgICAgICAgIHJlYWRlciA9IG5ldyBKc29uUmVhZGVyKG5ldyBTdHJpbmdSZWFkZXIoIlssdHJ1ZV0iKSk7CisgICAgICAgIHJlYWRlci5iZWdpbkFycmF5KCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZWFkZXIubmV4dE51bGwoKTsKKyAgICAgICAgICAgIGZhaWwoKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZXhwZWN0ZWQpIHsKKyAgICAgICAgfQorCisgICAgICAgIHJlYWRlciA9IG5ldyBKc29uUmVhZGVyKG5ldyBTdHJpbmdSZWFkZXIoIlt0cnVlLF0iKSk7CisgICAgICAgIHJlYWRlci5iZWdpbkFycmF5KCk7CisgICAgICAgIGFzc2VydEVxdWFscyh0cnVlLCByZWFkZXIubmV4dEJvb2xlYW4oKSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZWFkZXIubmV4dE51bGwoKTsKKyAgICAgICAgICAgIGZhaWwoKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZXhwZWN0ZWQpIHsKKyAgICAgICAgfQorCisgICAgICAgIHJlYWRlciA9IG5ldyBKc29uUmVhZGVyKG5ldyBTdHJpbmdSZWFkZXIoIlssXSIpKTsKKyAgICAgICAgcmVhZGVyLmJlZ2luQXJyYXkoKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJlYWRlci5uZXh0TnVsbCgpOworICAgICAgICAgICAgZmFpbCgpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBleHBlY3RlZCkgeworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdExlbmllbnRVbm5lY2Vzc2FyeUFycmF5U2VwYXJhdG9ycygpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIEpzb25SZWFkZXIgcmVhZGVyID0gbmV3IEpzb25SZWFkZXIobmV3IFN0cmluZ1JlYWRlcigiW3RydWUsLHRydWVdIikpOworICAgICAgICByZWFkZXIuc2V0TGVuaWVudCh0cnVlKTsKKyAgICAgICAgcmVhZGVyLmJlZ2luQXJyYXkoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHRydWUsIHJlYWRlci5uZXh0Qm9vbGVhbigpKTsKKyAgICAgICAgcmVhZGVyLm5leHROdWxsKCk7CisgICAgICAgIGFzc2VydEVxdWFscyh0cnVlLCByZWFkZXIubmV4dEJvb2xlYW4oKSk7CisgICAgICAgIHJlYWRlci5lbmRBcnJheSgpOworCisgICAgICAgIHJlYWRlciA9IG5ldyBKc29uUmVhZGVyKG5ldyBTdHJpbmdSZWFkZXIoIlssdHJ1ZV0iKSk7CisgICAgICAgIHJlYWRlci5zZXRMZW5pZW50KHRydWUpOworICAgICAgICByZWFkZXIuYmVnaW5BcnJheSgpOworICAgICAgICByZWFkZXIubmV4dE51bGwoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHRydWUsIHJlYWRlci5uZXh0Qm9vbGVhbigpKTsKKyAgICAgICAgcmVhZGVyLmVuZEFycmF5KCk7CisKKyAgICAgICAgcmVhZGVyID0gbmV3IEpzb25SZWFkZXIobmV3IFN0cmluZ1JlYWRlcigiW3RydWUsXSIpKTsKKyAgICAgICAgcmVhZGVyLnNldExlbmllbnQodHJ1ZSk7CisgICAgICAgIHJlYWRlci5iZWdpbkFycmF5KCk7CisgICAgICAgIGFzc2VydEVxdWFscyh0cnVlLCByZWFkZXIubmV4dEJvb2xlYW4oKSk7CisgICAgICAgIHJlYWRlci5uZXh0TnVsbCgpOworICAgICAgICByZWFkZXIuZW5kQXJyYXkoKTsKKworICAgICAgICByZWFkZXIgPSBuZXcgSnNvblJlYWRlcihuZXcgU3RyaW5nUmVhZGVyKCJbLF0iKSk7CisgICAgICAgIHJlYWRlci5zZXRMZW5pZW50KHRydWUpOworICAgICAgICByZWFkZXIuYmVnaW5BcnJheSgpOworICAgICAgICByZWFkZXIubmV4dE51bGwoKTsKKyAgICAgICAgcmVhZGVyLm5leHROdWxsKCk7CisgICAgICAgIHJlYWRlci5lbmRBcnJheSgpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL3V0aWwvSnNvbldyaXRlclRlc3QuamF2YSBiL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL3V0aWwvSnNvbldyaXRlclRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYTg0MDIzCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvdXRpbC9Kc29uV3JpdGVyVGVzdC5qYXZhCkBAIC0wLDAgKzEsNDE5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLnV0aWw7CisKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uU3RyaW5nV3JpdGVyOworCitwdWJsaWMgZmluYWwgY2xhc3MgSnNvbldyaXRlclRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0V3JvbmdUb3BMZXZlbFR5cGUoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBTdHJpbmdXcml0ZXIgc3RyaW5nV3JpdGVyID0gbmV3IFN0cmluZ1dyaXRlcigpOworICAgICAgICBKc29uV3JpdGVyIGpzb25Xcml0ZXIgPSBuZXcgSnNvbldyaXRlcihzdHJpbmdXcml0ZXIpOworICAgICAgICB0cnkgeworICAgICAgICAgICAganNvbldyaXRlci52YWx1ZSgiYSIpOworICAgICAgICAgICAgZmFpbCgpOworICAgICAgICB9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZXhwZWN0ZWQpIHsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RUd29OYW1lcygpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIFN0cmluZ1dyaXRlciBzdHJpbmdXcml0ZXIgPSBuZXcgU3RyaW5nV3JpdGVyKCk7CisgICAgICAgIEpzb25Xcml0ZXIganNvbldyaXRlciA9IG5ldyBKc29uV3JpdGVyKHN0cmluZ1dyaXRlcik7CisgICAgICAgIGpzb25Xcml0ZXIuYmVnaW5PYmplY3QoKTsKKyAgICAgICAganNvbldyaXRlci5uYW1lKCJhIik7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBqc29uV3JpdGVyLm5hbWUoImEiKTsKKyAgICAgICAgICAgIGZhaWwoKTsKKyAgICAgICAgfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGV4cGVjdGVkKSB7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TmFtZVdpdGhvdXRWYWx1ZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIFN0cmluZ1dyaXRlciBzdHJpbmdXcml0ZXIgPSBuZXcgU3RyaW5nV3JpdGVyKCk7CisgICAgICAgIEpzb25Xcml0ZXIganNvbldyaXRlciA9IG5ldyBKc29uV3JpdGVyKHN0cmluZ1dyaXRlcik7CisgICAgICAgIGpzb25Xcml0ZXIuYmVnaW5PYmplY3QoKTsKKyAgICAgICAganNvbldyaXRlci5uYW1lKCJhIik7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBqc29uV3JpdGVyLmVuZE9iamVjdCgpOworICAgICAgICAgICAgZmFpbCgpOworICAgICAgICB9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZXhwZWN0ZWQpIHsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RWYWx1ZVdpdGhvdXROYW1lKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgU3RyaW5nV3JpdGVyIHN0cmluZ1dyaXRlciA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKKyAgICAgICAgSnNvbldyaXRlciBqc29uV3JpdGVyID0gbmV3IEpzb25Xcml0ZXIoc3RyaW5nV3JpdGVyKTsKKyAgICAgICAganNvbldyaXRlci5iZWdpbk9iamVjdCgpOworICAgICAgICB0cnkgeworICAgICAgICAgICAganNvbldyaXRlci52YWx1ZSh0cnVlKTsKKyAgICAgICAgICAgIGZhaWwoKTsKKyAgICAgICAgfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGV4cGVjdGVkKSB7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TXVsdGlwbGVUb3BMZXZlbFZhbHVlcygpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIFN0cmluZ1dyaXRlciBzdHJpbmdXcml0ZXIgPSBuZXcgU3RyaW5nV3JpdGVyKCk7CisgICAgICAgIEpzb25Xcml0ZXIganNvbldyaXRlciA9IG5ldyBKc29uV3JpdGVyKHN0cmluZ1dyaXRlcik7CisgICAgICAgIGpzb25Xcml0ZXIuYmVnaW5BcnJheSgpLmVuZEFycmF5KCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBqc29uV3JpdGVyLmJlZ2luQXJyYXkoKTsKKyAgICAgICAgICAgIGZhaWwoKTsKKyAgICAgICAgfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGV4cGVjdGVkKSB7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QmFkTmVzdGluZ09iamVjdCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIFN0cmluZ1dyaXRlciBzdHJpbmdXcml0ZXIgPSBuZXcgU3RyaW5nV3JpdGVyKCk7CisgICAgICAgIEpzb25Xcml0ZXIganNvbldyaXRlciA9IG5ldyBKc29uV3JpdGVyKHN0cmluZ1dyaXRlcik7CisgICAgICAgIGpzb25Xcml0ZXIuYmVnaW5BcnJheSgpOworICAgICAgICBqc29uV3JpdGVyLmJlZ2luT2JqZWN0KCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBqc29uV3JpdGVyLmVuZEFycmF5KCk7CisgICAgICAgICAgICBmYWlsKCk7CisgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBleHBlY3RlZCkgeworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEJhZE5lc3RpbmdBcnJheSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIFN0cmluZ1dyaXRlciBzdHJpbmdXcml0ZXIgPSBuZXcgU3RyaW5nV3JpdGVyKCk7CisgICAgICAgIEpzb25Xcml0ZXIganNvbldyaXRlciA9IG5ldyBKc29uV3JpdGVyKHN0cmluZ1dyaXRlcik7CisgICAgICAgIGpzb25Xcml0ZXIuYmVnaW5BcnJheSgpOworICAgICAgICBqc29uV3JpdGVyLmJlZ2luQXJyYXkoKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGpzb25Xcml0ZXIuZW5kT2JqZWN0KCk7CisgICAgICAgICAgICBmYWlsKCk7CisgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBleHBlY3RlZCkgeworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdE51bGxOYW1lKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgU3RyaW5nV3JpdGVyIHN0cmluZ1dyaXRlciA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKKyAgICAgICAgSnNvbldyaXRlciBqc29uV3JpdGVyID0gbmV3IEpzb25Xcml0ZXIoc3RyaW5nV3JpdGVyKTsKKyAgICAgICAganNvbldyaXRlci5iZWdpbk9iamVjdCgpOworICAgICAgICB0cnkgeworICAgICAgICAgICAganNvbldyaXRlci5uYW1lKG51bGwpOworICAgICAgICAgICAgZmFpbCgpOworICAgICAgICB9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBleHBlY3RlZCkgeworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdE51bGxTdHJpbmdWYWx1ZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIFN0cmluZ1dyaXRlciBzdHJpbmdXcml0ZXIgPSBuZXcgU3RyaW5nV3JpdGVyKCk7CisgICAgICAgIEpzb25Xcml0ZXIganNvbldyaXRlciA9IG5ldyBKc29uV3JpdGVyKHN0cmluZ1dyaXRlcik7CisgICAgICAgIGpzb25Xcml0ZXIuYmVnaW5PYmplY3QoKTsKKyAgICAgICAganNvbldyaXRlci5uYW1lKCJhIik7CisgICAgICAgIGpzb25Xcml0ZXIudmFsdWUobnVsbCk7CisgICAgICAgIGpzb25Xcml0ZXIuZW5kT2JqZWN0KCk7CisgICAgICAgIGFzc2VydEVxdWFscygie1wiYVwiOm51bGx9Iiwgc3RyaW5nV3JpdGVyLnRvU3RyaW5nKCkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3ROb25GaW5pdGVEb3VibGVzKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgU3RyaW5nV3JpdGVyIHN0cmluZ1dyaXRlciA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKKyAgICAgICAgSnNvbldyaXRlciBqc29uV3JpdGVyID0gbmV3IEpzb25Xcml0ZXIoc3RyaW5nV3JpdGVyKTsKKyAgICAgICAganNvbldyaXRlci5iZWdpbkFycmF5KCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBqc29uV3JpdGVyLnZhbHVlKERvdWJsZS5OYU4pOworICAgICAgICAgICAgZmFpbCgpOworICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXhwZWN0ZWQpIHsKKyAgICAgICAgfQorICAgICAgICB0cnkgeworICAgICAgICAgICAganNvbldyaXRlci52YWx1ZShEb3VibGUuTkVHQVRJVkVfSU5GSU5JVFkpOworICAgICAgICAgICAgZmFpbCgpOworICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXhwZWN0ZWQpIHsKKyAgICAgICAgfQorICAgICAgICB0cnkgeworICAgICAgICAgICAganNvbldyaXRlci52YWx1ZShEb3VibGUuUE9TSVRJVkVfSU5GSU5JVFkpOworICAgICAgICAgICAgZmFpbCgpOworICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXhwZWN0ZWQpIHsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3REb3VibGVzKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgU3RyaW5nV3JpdGVyIHN0cmluZ1dyaXRlciA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKKyAgICAgICAgSnNvbldyaXRlciBqc29uV3JpdGVyID0gbmV3IEpzb25Xcml0ZXIoc3RyaW5nV3JpdGVyKTsKKyAgICAgICAganNvbldyaXRlci5iZWdpbkFycmF5KCk7CisgICAgICAgIGpzb25Xcml0ZXIudmFsdWUoLTAuMCk7CisgICAgICAgIGpzb25Xcml0ZXIudmFsdWUoMS4wKTsKKyAgICAgICAganNvbldyaXRlci52YWx1ZShEb3VibGUuTUFYX1ZBTFVFKTsKKyAgICAgICAganNvbldyaXRlci52YWx1ZShEb3VibGUuTUlOX1ZBTFVFKTsKKyAgICAgICAganNvbldyaXRlci52YWx1ZSgwLjApOworICAgICAgICBqc29uV3JpdGVyLnZhbHVlKC0wLjUpOworICAgICAgICBqc29uV3JpdGVyLnZhbHVlKERvdWJsZS5NSU5fTk9STUFMKTsKKyAgICAgICAganNvbldyaXRlci52YWx1ZShNYXRoLlBJKTsKKyAgICAgICAganNvbldyaXRlci52YWx1ZShNYXRoLkUpOworICAgICAgICBqc29uV3JpdGVyLmVuZEFycmF5KCk7CisgICAgICAgIGpzb25Xcml0ZXIuY2xvc2UoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJbLTAuMCwiCisgICAgICAgICAgICAgICAgKyAiMS4wLCIKKyAgICAgICAgICAgICAgICArICIxLjc5NzY5MzEzNDg2MjMxNTdFMzA4LCIKKyAgICAgICAgICAgICAgICArICI0LjlFLTMyNCwiCisgICAgICAgICAgICAgICAgKyAiMC4wLCIKKyAgICAgICAgICAgICAgICArICItMC41LCIKKyAgICAgICAgICAgICAgICArICIyLjIyNTA3Mzg1ODUwNzIwMTRFLTMwOCwiCisgICAgICAgICAgICAgICAgKyAiMy4xNDE1OTI2NTM1ODk3OTMsIgorICAgICAgICAgICAgICAgICsgIjIuNzE4MjgxODI4NDU5MDQ1XSIsIHN0cmluZ1dyaXRlci50b1N0cmluZygpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TG9uZ3MoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBTdHJpbmdXcml0ZXIgc3RyaW5nV3JpdGVyID0gbmV3IFN0cmluZ1dyaXRlcigpOworICAgICAgICBKc29uV3JpdGVyIGpzb25Xcml0ZXIgPSBuZXcgSnNvbldyaXRlcihzdHJpbmdXcml0ZXIpOworICAgICAgICBqc29uV3JpdGVyLmJlZ2luQXJyYXkoKTsKKyAgICAgICAganNvbldyaXRlci52YWx1ZSgwKTsKKyAgICAgICAganNvbldyaXRlci52YWx1ZSgxKTsKKyAgICAgICAganNvbldyaXRlci52YWx1ZSgtMSk7CisgICAgICAgIGpzb25Xcml0ZXIudmFsdWUoTG9uZy5NSU5fVkFMVUUpOworICAgICAgICBqc29uV3JpdGVyLnZhbHVlKExvbmcuTUFYX1ZBTFVFKTsKKyAgICAgICAganNvbldyaXRlci5lbmRBcnJheSgpOworICAgICAgICBqc29uV3JpdGVyLmNsb3NlKCk7CisgICAgICAgIGFzc2VydEVxdWFscygiWzAsIgorICAgICAgICAgICAgICAgICsgIjEsIgorICAgICAgICAgICAgICAgICsgIi0xLCIKKyAgICAgICAgICAgICAgICArICItOTIyMzM3MjAzNjg1NDc3NTgwOCwiCisgICAgICAgICAgICAgICAgKyAiOTIyMzM3MjAzNjg1NDc3NTgwN10iLCBzdHJpbmdXcml0ZXIudG9TdHJpbmcoKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEJvb2xlYW5zKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgU3RyaW5nV3JpdGVyIHN0cmluZ1dyaXRlciA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKKyAgICAgICAgSnNvbldyaXRlciBqc29uV3JpdGVyID0gbmV3IEpzb25Xcml0ZXIoc3RyaW5nV3JpdGVyKTsKKyAgICAgICAganNvbldyaXRlci5iZWdpbkFycmF5KCk7CisgICAgICAgIGpzb25Xcml0ZXIudmFsdWUodHJ1ZSk7CisgICAgICAgIGpzb25Xcml0ZXIudmFsdWUoZmFsc2UpOworICAgICAgICBqc29uV3JpdGVyLmVuZEFycmF5KCk7CisgICAgICAgIGFzc2VydEVxdWFscygiW3RydWUsZmFsc2VdIiwgc3RyaW5nV3JpdGVyLnRvU3RyaW5nKCkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3ROdWxscygpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIFN0cmluZ1dyaXRlciBzdHJpbmdXcml0ZXIgPSBuZXcgU3RyaW5nV3JpdGVyKCk7CisgICAgICAgIEpzb25Xcml0ZXIganNvbldyaXRlciA9IG5ldyBKc29uV3JpdGVyKHN0cmluZ1dyaXRlcik7CisgICAgICAgIGpzb25Xcml0ZXIuYmVnaW5BcnJheSgpOworICAgICAgICBqc29uV3JpdGVyLm51bGxWYWx1ZSgpOworICAgICAgICBqc29uV3JpdGVyLmVuZEFycmF5KCk7CisgICAgICAgIGFzc2VydEVxdWFscygiW251bGxdIiwgc3RyaW5nV3JpdGVyLnRvU3RyaW5nKCkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RTdHJpbmdzKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgU3RyaW5nV3JpdGVyIHN0cmluZ1dyaXRlciA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKKyAgICAgICAgSnNvbldyaXRlciBqc29uV3JpdGVyID0gbmV3IEpzb25Xcml0ZXIoc3RyaW5nV3JpdGVyKTsKKyAgICAgICAganNvbldyaXRlci5iZWdpbkFycmF5KCk7CisgICAgICAgIGpzb25Xcml0ZXIudmFsdWUoImEiKTsKKyAgICAgICAganNvbldyaXRlci52YWx1ZSgiYVwiIik7CisgICAgICAgIGpzb25Xcml0ZXIudmFsdWUoIlwiIik7CisgICAgICAgIGpzb25Xcml0ZXIudmFsdWUoIjoiKTsKKyAgICAgICAganNvbldyaXRlci52YWx1ZSgiLCIpOworICAgICAgICBqc29uV3JpdGVyLnZhbHVlKCJcYiIpOworICAgICAgICBqc29uV3JpdGVyLnZhbHVlKCJcZiIpOworICAgICAgICBqc29uV3JpdGVyLnZhbHVlKCJcbiIpOworICAgICAgICBqc29uV3JpdGVyLnZhbHVlKCJcciIpOworICAgICAgICBqc29uV3JpdGVyLnZhbHVlKCJcdCIpOworICAgICAgICBqc29uV3JpdGVyLnZhbHVlKCIgIik7CisgICAgICAgIGpzb25Xcml0ZXIudmFsdWUoIlxcIik7CisgICAgICAgIGpzb25Xcml0ZXIudmFsdWUoInsiKTsKKyAgICAgICAganNvbldyaXRlci52YWx1ZSgifSIpOworICAgICAgICBqc29uV3JpdGVyLnZhbHVlKCJbIik7CisgICAgICAgIGpzb25Xcml0ZXIudmFsdWUoIl0iKTsKKyAgICAgICAganNvbldyaXRlci52YWx1ZSgiXDAiKTsKKyAgICAgICAganNvbldyaXRlci52YWx1ZSgiXHUwMDE5Iik7CisgICAgICAgIGpzb25Xcml0ZXIuZW5kQXJyYXkoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJbXCJhXCIsIgorICAgICAgICAgICAgICAgICsgIlwiYVxcXCJcIiwiCisgICAgICAgICAgICAgICAgKyAiXCJcXFwiXCIsIgorICAgICAgICAgICAgICAgICsgIlwiOlwiLCIKKyAgICAgICAgICAgICAgICArICJcIixcIiwiCisgICAgICAgICAgICAgICAgKyAiXCJcXGJcIiwiCisgICAgICAgICAgICAgICAgKyAiXCJcXGZcIiwiCisgICAgICAgICAgICAgICAgKyAiXCJcXG5cIiwiCisgICAgICAgICAgICAgICAgKyAiXCJcXHJcIiwiCisgICAgICAgICAgICAgICAgKyAiXCJcXHRcIiwiCisgICAgICAgICAgICAgICAgKyAiXCIgXCIsIgorICAgICAgICAgICAgICAgICsgIlwiXFxcXFwiLCIKKyAgICAgICAgICAgICAgICArICJcIntcIiwiCisgICAgICAgICAgICAgICAgKyAiXCJ9XCIsIgorICAgICAgICAgICAgICAgICsgIlwiW1wiLCIKKyAgICAgICAgICAgICAgICArICJcIl1cIiwiCisgICAgICAgICAgICAgICAgKyAiXCJcXHUwMDAwXCIsIgorICAgICAgICAgICAgICAgICsgIlwiXFx1MDAxOVwiXSIsIHN0cmluZ1dyaXRlci50b1N0cmluZygpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RW1wdHlBcnJheSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIFN0cmluZ1dyaXRlciBzdHJpbmdXcml0ZXIgPSBuZXcgU3RyaW5nV3JpdGVyKCk7CisgICAgICAgIEpzb25Xcml0ZXIganNvbldyaXRlciA9IG5ldyBKc29uV3JpdGVyKHN0cmluZ1dyaXRlcik7CisgICAgICAgIGpzb25Xcml0ZXIuYmVnaW5BcnJheSgpOworICAgICAgICBqc29uV3JpdGVyLmVuZEFycmF5KCk7CisgICAgICAgIGFzc2VydEVxdWFscygiW10iLCBzdHJpbmdXcml0ZXIudG9TdHJpbmcoKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEVtcHR5T2JqZWN0KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgU3RyaW5nV3JpdGVyIHN0cmluZ1dyaXRlciA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKKyAgICAgICAgSnNvbldyaXRlciBqc29uV3JpdGVyID0gbmV3IEpzb25Xcml0ZXIoc3RyaW5nV3JpdGVyKTsKKyAgICAgICAganNvbldyaXRlci5iZWdpbk9iamVjdCgpOworICAgICAgICBqc29uV3JpdGVyLmVuZE9iamVjdCgpOworICAgICAgICBhc3NlcnRFcXVhbHMoInt9Iiwgc3RyaW5nV3JpdGVyLnRvU3RyaW5nKCkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RPYmplY3RzSW5BcnJheXMoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBTdHJpbmdXcml0ZXIgc3RyaW5nV3JpdGVyID0gbmV3IFN0cmluZ1dyaXRlcigpOworICAgICAgICBKc29uV3JpdGVyIGpzb25Xcml0ZXIgPSBuZXcgSnNvbldyaXRlcihzdHJpbmdXcml0ZXIpOworICAgICAgICBqc29uV3JpdGVyLmJlZ2luQXJyYXkoKTsKKyAgICAgICAganNvbldyaXRlci5iZWdpbk9iamVjdCgpOworICAgICAgICBqc29uV3JpdGVyLm5hbWUoImEiKS52YWx1ZSg1KTsKKyAgICAgICAganNvbldyaXRlci5uYW1lKCJiIikudmFsdWUoZmFsc2UpOworICAgICAgICBqc29uV3JpdGVyLmVuZE9iamVjdCgpOworICAgICAgICBqc29uV3JpdGVyLmJlZ2luT2JqZWN0KCk7CisgICAgICAgIGpzb25Xcml0ZXIubmFtZSgiYyIpLnZhbHVlKDYpOworICAgICAgICBqc29uV3JpdGVyLm5hbWUoImQiKS52YWx1ZSh0cnVlKTsKKyAgICAgICAganNvbldyaXRlci5lbmRPYmplY3QoKTsKKyAgICAgICAganNvbldyaXRlci5lbmRBcnJheSgpOworICAgICAgICBhc3NlcnRFcXVhbHMoIlt7XCJhXCI6NSxcImJcIjpmYWxzZX0sIgorICAgICAgICAgICAgICAgICsgIntcImNcIjo2LFwiZFwiOnRydWV9XSIsIHN0cmluZ1dyaXRlci50b1N0cmluZygpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QXJyYXlzSW5PYmplY3RzKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgU3RyaW5nV3JpdGVyIHN0cmluZ1dyaXRlciA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKKyAgICAgICAgSnNvbldyaXRlciBqc29uV3JpdGVyID0gbmV3IEpzb25Xcml0ZXIoc3RyaW5nV3JpdGVyKTsKKyAgICAgICAganNvbldyaXRlci5iZWdpbk9iamVjdCgpOworICAgICAgICBqc29uV3JpdGVyLm5hbWUoImEiKTsKKyAgICAgICAganNvbldyaXRlci5iZWdpbkFycmF5KCk7CisgICAgICAgIGpzb25Xcml0ZXIudmFsdWUoNSk7CisgICAgICAgIGpzb25Xcml0ZXIudmFsdWUoZmFsc2UpOworICAgICAgICBqc29uV3JpdGVyLmVuZEFycmF5KCk7CisgICAgICAgIGpzb25Xcml0ZXIubmFtZSgiYiIpOworICAgICAgICBqc29uV3JpdGVyLmJlZ2luQXJyYXkoKTsKKyAgICAgICAganNvbldyaXRlci52YWx1ZSg2KTsKKyAgICAgICAganNvbldyaXRlci52YWx1ZSh0cnVlKTsKKyAgICAgICAganNvbldyaXRlci5lbmRBcnJheSgpOworICAgICAgICBqc29uV3JpdGVyLmVuZE9iamVjdCgpOworICAgICAgICBhc3NlcnRFcXVhbHMoIntcImFcIjpbNSxmYWxzZV0sIgorICAgICAgICAgICAgICAgICsgIlwiYlwiOls2LHRydWVdfSIsIHN0cmluZ1dyaXRlci50b1N0cmluZygpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RGVlcE5lc3RpbmdBcnJheXMoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBTdHJpbmdXcml0ZXIgc3RyaW5nV3JpdGVyID0gbmV3IFN0cmluZ1dyaXRlcigpOworICAgICAgICBKc29uV3JpdGVyIGpzb25Xcml0ZXIgPSBuZXcgSnNvbldyaXRlcihzdHJpbmdXcml0ZXIpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDIwOyBpKyspIHsKKyAgICAgICAgICAgIGpzb25Xcml0ZXIuYmVnaW5BcnJheSgpOworICAgICAgICB9CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMjA7IGkrKykgeworICAgICAgICAgICAganNvbldyaXRlci5lbmRBcnJheSgpOworICAgICAgICB9CisgICAgICAgIGFzc2VydEVxdWFscygiW1tbW1tbW1tbW1tbW1tbW1tbW1tdXV1dXV1dXV1dXV1dXV1dXV1dXSIsIHN0cmluZ1dyaXRlci50b1N0cmluZygpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RGVlcE5lc3RpbmdPYmplY3RzKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgU3RyaW5nV3JpdGVyIHN0cmluZ1dyaXRlciA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKKyAgICAgICAgSnNvbldyaXRlciBqc29uV3JpdGVyID0gbmV3IEpzb25Xcml0ZXIoc3RyaW5nV3JpdGVyKTsKKyAgICAgICAganNvbldyaXRlci5iZWdpbk9iamVjdCgpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDIwOyBpKyspIHsKKyAgICAgICAgICAgIGpzb25Xcml0ZXIubmFtZSgiYSIpOworICAgICAgICAgICAganNvbldyaXRlci5iZWdpbk9iamVjdCgpOworICAgICAgICB9CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMjA7IGkrKykgeworICAgICAgICAgICAganNvbldyaXRlci5lbmRPYmplY3QoKTsKKyAgICAgICAgfQorICAgICAgICBqc29uV3JpdGVyLmVuZE9iamVjdCgpOworICAgICAgICBhc3NlcnRFcXVhbHMoIntcImFcIjp7XCJhXCI6e1wiYVwiOntcImFcIjp7XCJhXCI6e1wiYVwiOntcImFcIjp7XCJhXCI6e1wiYVwiOntcImFcIjoiCisgICAgICAgICAgICAgICAgKyAie1wiYVwiOntcImFcIjp7XCJhXCI6e1wiYVwiOntcImFcIjp7XCJhXCI6e1wiYVwiOntcImFcIjp7XCJhXCI6e1wiYVwiOnsiCisgICAgICAgICAgICAgICAgKyAifX19fX19fX19fX19fX19fX19fX19Iiwgc3RyaW5nV3JpdGVyLnRvU3RyaW5nKCkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RSZXBlYXRlZE5hbWUoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBTdHJpbmdXcml0ZXIgc3RyaW5nV3JpdGVyID0gbmV3IFN0cmluZ1dyaXRlcigpOworICAgICAgICBKc29uV3JpdGVyIGpzb25Xcml0ZXIgPSBuZXcgSnNvbldyaXRlcihzdHJpbmdXcml0ZXIpOworICAgICAgICBqc29uV3JpdGVyLmJlZ2luT2JqZWN0KCk7CisgICAgICAgIGpzb25Xcml0ZXIubmFtZSgiYSIpLnZhbHVlKHRydWUpOworICAgICAgICBqc29uV3JpdGVyLm5hbWUoImEiKS52YWx1ZShmYWxzZSk7CisgICAgICAgIGpzb25Xcml0ZXIuZW5kT2JqZWN0KCk7CisgICAgICAgIC8vIEpzb25Xcml0ZXIgZG9lc24ndCBhdHRlbXB0IHRvIGRldGVjdCBkdXBsaWNhdGUgbmFtZXMKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ7XCJhXCI6dHJ1ZSxcImFcIjpmYWxzZX0iLCBzdHJpbmdXcml0ZXIudG9TdHJpbmcoKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFByZXR0eVByaW50T2JqZWN0KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgU3RyaW5nV3JpdGVyIHN0cmluZ1dyaXRlciA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKKyAgICAgICAgSnNvbldyaXRlciBqc29uV3JpdGVyID0gbmV3IEpzb25Xcml0ZXIoc3RyaW5nV3JpdGVyKTsKKyAgICAgICAganNvbldyaXRlci5zZXRJbmRlbnQoIiAgICIpOworCisgICAgICAgIGpzb25Xcml0ZXIuYmVnaW5PYmplY3QoKTsKKyAgICAgICAganNvbldyaXRlci5uYW1lKCJhIikudmFsdWUodHJ1ZSk7CisgICAgICAgIGpzb25Xcml0ZXIubmFtZSgiYiIpLnZhbHVlKGZhbHNlKTsKKyAgICAgICAganNvbldyaXRlci5uYW1lKCJjIikudmFsdWUoNS4wKTsKKyAgICAgICAganNvbldyaXRlci5uYW1lKCJlIikubnVsbFZhbHVlKCk7CisgICAgICAgIGpzb25Xcml0ZXIubmFtZSgiZiIpLmJlZ2luQXJyYXkoKTsKKyAgICAgICAganNvbldyaXRlci52YWx1ZSg2LjApOworICAgICAgICBqc29uV3JpdGVyLnZhbHVlKDcuMCk7CisgICAgICAgIGpzb25Xcml0ZXIuZW5kQXJyYXkoKTsKKyAgICAgICAganNvbldyaXRlci5uYW1lKCJnIikuYmVnaW5PYmplY3QoKTsKKyAgICAgICAganNvbldyaXRlci5uYW1lKCJoIikudmFsdWUoOC4wKTsKKyAgICAgICAganNvbldyaXRlci5uYW1lKCJpIikudmFsdWUoOS4wKTsKKyAgICAgICAganNvbldyaXRlci5lbmRPYmplY3QoKTsKKyAgICAgICAganNvbldyaXRlci5lbmRPYmplY3QoKTsKKworICAgICAgICBTdHJpbmcgZXhwZWN0ZWQgPSAie1xuIgorICAgICAgICAgICAgICAgICsgIiAgIFwiYVwiOiB0cnVlLFxuIgorICAgICAgICAgICAgICAgICsgIiAgIFwiYlwiOiBmYWxzZSxcbiIKKyAgICAgICAgICAgICAgICArICIgICBcImNcIjogNS4wLFxuIgorICAgICAgICAgICAgICAgICsgIiAgIFwiZVwiOiBudWxsLFxuIgorICAgICAgICAgICAgICAgICsgIiAgIFwiZlwiOiBbXG4iCisgICAgICAgICAgICAgICAgKyAiICAgICAgNi4wLFxuIgorICAgICAgICAgICAgICAgICsgIiAgICAgIDcuMFxuIgorICAgICAgICAgICAgICAgICsgIiAgIF0sXG4iCisgICAgICAgICAgICAgICAgKyAiICAgXCJnXCI6IHtcbiIKKyAgICAgICAgICAgICAgICArICIgICAgICBcImhcIjogOC4wLFxuIgorICAgICAgICAgICAgICAgICsgIiAgICAgIFwiaVwiOiA5LjBcbiIKKyAgICAgICAgICAgICAgICArICIgICB9XG4iCisgICAgICAgICAgICAgICAgKyAifSI7CisgICAgICAgIGFzc2VydEVxdWFscyhleHBlY3RlZCwgc3RyaW5nV3JpdGVyLnRvU3RyaW5nKCkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RQcmV0dHlQcmludEFycmF5KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgU3RyaW5nV3JpdGVyIHN0cmluZ1dyaXRlciA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKKyAgICAgICAgSnNvbldyaXRlciBqc29uV3JpdGVyID0gbmV3IEpzb25Xcml0ZXIoc3RyaW5nV3JpdGVyKTsKKyAgICAgICAganNvbldyaXRlci5zZXRJbmRlbnQoIiAgICIpOworCisgICAgICAgIGpzb25Xcml0ZXIuYmVnaW5BcnJheSgpOworICAgICAgICBqc29uV3JpdGVyLnZhbHVlKHRydWUpOworICAgICAgICBqc29uV3JpdGVyLnZhbHVlKGZhbHNlKTsKKyAgICAgICAganNvbldyaXRlci52YWx1ZSg1LjApOworICAgICAgICBqc29uV3JpdGVyLm51bGxWYWx1ZSgpOworICAgICAgICBqc29uV3JpdGVyLmJlZ2luT2JqZWN0KCk7CisgICAgICAgIGpzb25Xcml0ZXIubmFtZSgiYSIpLnZhbHVlKDYuMCk7CisgICAgICAgIGpzb25Xcml0ZXIubmFtZSgiYiIpLnZhbHVlKDcuMCk7CisgICAgICAgIGpzb25Xcml0ZXIuZW5kT2JqZWN0KCk7CisgICAgICAgIGpzb25Xcml0ZXIuYmVnaW5BcnJheSgpOworICAgICAgICBqc29uV3JpdGVyLnZhbHVlKDguMCk7CisgICAgICAgIGpzb25Xcml0ZXIudmFsdWUoOS4wKTsKKyAgICAgICAganNvbldyaXRlci5lbmRBcnJheSgpOworICAgICAgICBqc29uV3JpdGVyLmVuZEFycmF5KCk7CisKKyAgICAgICAgU3RyaW5nIGV4cGVjdGVkID0gIltcbiIKKyAgICAgICAgICAgICAgICArICIgICB0cnVlLFxuIgorICAgICAgICAgICAgICAgICsgIiAgIGZhbHNlLFxuIgorICAgICAgICAgICAgICAgICsgIiAgIDUuMCxcbiIKKyAgICAgICAgICAgICAgICArICIgICBudWxsLFxuIgorICAgICAgICAgICAgICAgICsgIiAgIHtcbiIKKyAgICAgICAgICAgICAgICArICIgICAgICBcImFcIjogNi4wLFxuIgorICAgICAgICAgICAgICAgICsgIiAgICAgIFwiYlwiOiA3LjBcbiIKKyAgICAgICAgICAgICAgICArICIgICB9LFxuIgorICAgICAgICAgICAgICAgICsgIiAgIFtcbiIKKyAgICAgICAgICAgICAgICArICIgICAgICA4LjAsXG4iCisgICAgICAgICAgICAgICAgKyAiICAgICAgOS4wXG4iCisgICAgICAgICAgICAgICAgKyAiICAgXVxuIgorICAgICAgICAgICAgICAgICsgIl0iOworICAgICAgICBhc3NlcnRFcXVhbHMoZXhwZWN0ZWQsIHN0cmluZ1dyaXRlci50b1N0cmluZygpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC91dGlsL1BhdHRlcm5zVGVzdC5qYXZhIGIvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvdXRpbC9QYXR0ZXJuc1Rlc3QuamF2YQppbmRleCBiOTBjOTdiLi5hYWQzZmUxIDEwMDY0NAotLS0gYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC91dGlsL1BhdHRlcm5zVGVzdC5qYXZhCisrKyBiL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL3V0aWwvUGF0dGVybnNUZXN0LmphdmEKQEAgLTY4LDYgKzY4LDEzIEBACiAgICAgICAgIHQgPSBQYXR0ZXJucy5XRUJfVVJMLm1hdGNoZXIoInhuLS1mc3F1MDBhLnhuLS0wendtNTZkIikubWF0Y2hlcygpOwogICAgICAgICBhc3NlcnRUcnVlKCJWYWxpZCBVUkwiLCB0KTsKIAorICAgICAgICAvLyBVcmwgZm9yIHRlc3RpbmcgdG9wIGxldmVsIEFyYWJpYyBjb3VudHJ5IGNvZGUgZG9tYWluIGluIFB1bnljb2RlOgorICAgICAgICAvLyAgIGh0dHA6Ly94bi0tNGdicmltLnhuLS0tLXJtY2tiYmFqbGM2ZGo3YnhuZTJjLnhuLS13Z2JoMWMvYXIvZGVmYXVsdC5hc3B4CisgICAgICAgIHQgPSBQYXR0ZXJucy5XRUJfVVJMLm1hdGNoZXIoImh0dHA6Ly94bi0tNGdicmltLnhuLS0tLXJtY2tiYmFqbGM2ZGo3YnhuZTJjLnhuLS13Z2JoMWMvYXIvZGVmYXVsdC5hc3B4IikubWF0Y2hlcygpOworICAgICAgICBhc3NlcnRUcnVlKCJWYWxpZCBVUkwiLCB0KTsKKyAgICAgICAgdCA9IFBhdHRlcm5zLldFQl9VUkwubWF0Y2hlcigieG4tLTRnYnJpbS54bi0tLS1ybWNrYmJhamxjNmRqN2J4bmUyYy54bi0td2diaDFjL2FyL2RlZmF1bHQuYXNweCIpLm1hdGNoZXMoKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiVmFsaWQgVVJMIiwgdCk7CisKICAgICAgICAgLy8gSW50ZXJuYXRpb25hbGl6ZWQgVVJMLgogICAgICAgICB0ID0gUGF0dGVybnMuV0VCX1VSTC5tYXRjaGVyKCJodHRwOi8vXHVENjA0XHVBRTA4XHVDNjAxXHVDMjE4XHVDOTlELmtyIikubWF0Y2hlcygpOwogICAgICAgICBhc3NlcnRUcnVlKCJWYWxpZCBVUkwiLCB0KTsKQEAgLTEwOSw3ICsxMTYsNyBAQAogICAgICAgICB0ID0gUGF0dGVybnMuRE9NQUlOX05BTUUubWF0Y2hlcigibWFpbC5leGFtcGxlLmNvbSIpLm1hdGNoZXMoKTsKICAgICAgICAgYXNzZXJ0VHJ1ZSgiVmFsaWQgZG9tYWluIiwgdCk7CiAKLSAgICAgICAgdCA9IFBhdHRlcm5zLldFQl9VUkwubWF0Y2hlcigiZ29vZ2xlLm1lIikubWF0Y2hlcygpOworICAgICAgICB0ID0gUGF0dGVybnMuRE9NQUlOX05BTUUubWF0Y2hlcigiZ29vZ2xlLm1lIikubWF0Y2hlcygpOwogICAgICAgICBhc3NlcnRUcnVlKCJWYWxpZCBkb21haW4iLCB0KTsKIAogICAgICAgICAvLyBJbnRlcm5hdGlvbmFsaXplZCBkb21haW5zLgpAQCAtMTE4LDYgKzEyNSwxNCBAQAogCiAgICAgICAgIHQgPSBQYXR0ZXJucy5ET01BSU5fTkFNRS5tYXRjaGVyKCJfXysmNDIueGVyIikubWF0Y2hlcygpOwogICAgICAgICBhc3NlcnRGYWxzZSgiSW52YWxpZCBkb21haW4iLCB0KTsKKworICAgICAgICAvLyBPYnNvbGV0ZSBkb21haW4gLnl1CisgICAgICAgIHQgPSBQYXR0ZXJucy5ET01BSU5fTkFNRS5tYXRjaGVyKCJ0ZXN0Lnl1IikubWF0Y2hlcygpOworICAgICAgICBhc3NlcnRGYWxzZSgiT2Jzb2xldGUgY291bnRyeSBjb2RlIHRvcCBsZXZlbCBkb21haW4iLCB0KTsKKworICAgICAgICAvLyBUZXN0aW5nIHRvcCBsZXZlbCBBcmFiaWMgY291bnRyeSBjb2RlIGRvbWFpbiBpbiBQdW55Y29kZToKKyAgICAgICAgdCA9IFBhdHRlcm5zLkRPTUFJTl9OQU1FLm1hdGNoZXIoInhuLS00Z2JyaW0ueG4tLS0tcm1ja2JiYWpsYzZkajdieG5lMmMueG4tLXdnYmgxYyIpLm1hdGNoZXMoKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiVmFsaWQgZG9tYWluIiwgdCk7CiAgICAgfQogCiAgICAgQFNtYWxsVGVzdApkaWZmIC0tZ2l0IGEvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvd2Via2l0L0FjY2Vzc2liaWxpdHlJbmplY3RvclRlc3QuamF2YSBiL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL3dlYmtpdC9BY2Nlc3NpYmlsaXR5SW5qZWN0b3JUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWM5ZDlmZQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL3dlYmtpdC9BY2Nlc3NpYmlsaXR5SW5qZWN0b3JUZXN0LmphdmEKQEAgLTAsMCArMSw5NDUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQud2Via2l0OworCitpbXBvcnQgYW5kcm9pZC5hY2Nlc3NpYmlsaXR5c2VydmljZS5BY2Nlc3NpYmlsaXR5U2VydmljZTsKK2ltcG9ydCBhbmRyb2lkLmFjY2Vzc2liaWxpdHlzZXJ2aWNlLkFjY2Vzc2liaWxpdHlTZXJ2aWNlSW5mbzsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29tcG9uZW50TmFtZTsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OworaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLkxvb3BlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLlN5c3RlbUNsb2NrOworaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuU2V0dGluZ3M7CitpbXBvcnQgYW5kcm9pZC50ZXN0LkFuZHJvaWRUZXN0Q2FzZTsKK2ltcG9ydCBhbmRyb2lkLnRlc3Quc3VpdGVidWlsZGVyLmFubm90YXRpb24uTGFyZ2VUZXN0OworaW1wb3J0IGFuZHJvaWQudmlldy5LZXlFdmVudDsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmlsaXR5RXZlbnQ7CitpbXBvcnQgYW5kcm9pZC52aWV3LmFjY2Vzc2liaWxpdHkuQWNjZXNzaWJpbGl0eU1hbmFnZXI7CisKKy8qKgorICogVGhpcyBpcyBhIHRlc3QgZm9yIHRoZSBiZWhhdmlvciBvZiB0aGUge0BsaW5rIEFjY2Vzc2liaWxpdHlJbmplY3Rvcn0KKyAqIHdoaWNoIGlzIHVzZWQgYnkge0BsaW5rIFdlYlZpZXd9IHRvIHByb3ZpZGUgYmFzaWMgYWNjZXNzaWJpbGl0eSBzdXBwb3J0CisgKiBpbiBjYXNlIEphdmFTY3JpcHQgaXMgZGlzYWJsZWQuCisgKiA8L3A+CisgKiBOb3RlOiBUaGlzIHRlc3Qgd29ya3MgYWdhaW5zdCB0aGUgZ2VuZXJhdGVkIHtAbGluayBBY2Nlc3NpYmlsaXR5RXZlbnR9cworICogICAgICAgdG8gc28gaXQgYWxzbyBjaGVja3MgaWYgdGhlIHRlc3QgZm9yIGFubm91bmNpbmcgbmF2aWdhdGlvbiBheGlzIGFuZAorICogICAgICAgc3RhdHVzIG1lc3NhZ2VzIGFzIGFwcHJvcHJpYXRlLgorICovCitwdWJsaWMgY2xhc3MgQWNjZXNzaWJpbGl0eUluamVjdG9yVGVzdCBleHRlbmRzIEFuZHJvaWRUZXN0Q2FzZSB7CisKKyAgICAvKiogVGhlIHRpbWVvdXQgdG8gd2FpdCBmb3IgdGhlIGV4cGVjdGVkIHNlbGVjdGlvbi4gKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIFRJTUVPVVRfV0FJVF9GT1JfU0VMRUNUSU9OX1NUUklORyA9IDEwMDA7CisKKyAgICAvKiogVGhlIHRpbWVvdXQgdG8gd2FpdCBmb3IgYWNjZXNzaWJpbGl0eSBhbmQgdGhlIG1vY2sgc2VydmljZSB0byBiZSBlbmFibGVkLiAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgVElNRU9VVF9FTkFCTEVfQUNDRVNTSUJJTElUWV9BTkRfTU9DS19TRVJWSUNFID0gNTAwOworCisgICAgLyoqIFRoZSBjb3VudCBvZiB0ZXN0cyB0byBkZXRlY3Qgd2hlbiB0byBzaHV0IGRvd24gdGhlIHNlcnZpY2UuICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFRFU1RfQ0FTRV9DT1VOVCA9IDg7CisKKyAgICAvKiogVGhlIG1ldGEgc3RhdGUgZm9yIHByZXNzZWQgbGVmdCBBTFQuICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1FVEFfU1RBVEVfQUxUX0xFRlRfT04gPSBLZXlFdmVudC5NRVRBX0FMVF9PTgorICAgICAgICAgICAgfCBLZXlFdmVudC5NRVRBX0FMVF9MRUZUX09OOworCisgICAgLyoqIFRoZSB2YWx1ZSBmb3Igbm90IHNwZWNpZmllZCBzZWxlY3Rpb24gc3RyaW5nIHNpbmNlIG51bGwgaXMgYSB2YWxpZCB2YWx1ZS4gKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VMRUNUSU9OX1NUUklOR19VTktOT1dOID0gIlVua25vd24iOworCisgICAgLyoqIExvY2sgZm9yIGxvY2tpbmcgdGhlIHRlc3QuICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgT2JqZWN0IHNUZXN0TG9jayA9IG5ldyBPYmplY3QoKTsKKworICAgIC8qKiBIYW5kbGUgdG8gdGhlIHRlc3QgZm9yIHVzZSBieSB0aGUgbW9jayBzZXJ2aWNlLiAqLworICAgIHByaXZhdGUgc3RhdGljIEFjY2Vzc2liaWxpdHlJbmplY3RvclRlc3Qgc0luc3RhbmNlOworCisgICAgLyoqIEZsYWcgaW5kaWNhdGluZyBpZiB0aGUgYWNjZXNzaWJpbGl0eSBzZXJ2aWNlIGlzIHJlYWR5IHRvIHJlY2VpdmUgZXZlbnRzLiAqLworICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gc0lzQWNjZXNzaWJpbGl0eVNlcnZpY2VSZWFkeTsKKworICAgIC8qKiBUaGUgY291bnQgb2YgZXhlY3V0ZWQgdGVzdHMgdG8gZGV0ZWN0IHdoZW4gdG8gdG9nZ2xlIGFjY2Vzc2liaWxpdHkgYW5kIHRoZSBzZXJ2aWNlLiAqLworICAgIHByaXZhdGUgc3RhdGljIGludCBzRXhlY3V0ZWRUZXN0Q291bnQ7CisKKyAgICAvKiogV29ya2VyIHRocmVhZCB3aXRoIGEgaGFuZGxlciB0byBwZXJmb3JtIG5vbiB0ZXN0IHRocmVhZCBwcm9jZXNzaW5nLiAqLworICAgIHByaXZhdGUgV29ya2VyIG1Xb3JrZXI7CisKKyAgICAvKiogSGFuZGxlIHRvIHRoZSB7QGxpbmsgV2ViVmlld30gdG8gbG9hZCBkYXRhIGluLiAqLworICAgIHByaXZhdGUgV2ViVmlldyBtV2ViVmlldzsKKworICAgIC8qKiBUaGUgcmVjZWl2ZWQgc2VsZWN0aW9uIHN0cmluZyBmb3IgYXNzZXJ0aW9uIGNoZWNraW5nLiAqLworICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBzUmVjZWl2ZWRTZWxlY3Rpb25TdHJpbmcgPSBTRUxFQ1RJT05fU1RSSU5HX1VOS05PV047CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBzdXBlci5zZXRVcCgpOworICAgICAgICBtV29ya2VyID0gbmV3IFdvcmtlcigpOworICAgICAgICBzSW5zdGFuY2UgPSB0aGlzOworICAgICAgICBpZiAoc0V4ZWN1dGVkVGVzdENvdW50ID09IDApIHsKKyAgICAgICAgICAgIC8vIHVudGlsIEpVbml0NCBjb21lcyB0byBwbGF5IHdpdGggQEJlZm9yZVRlc3QKKyAgICAgICAgICAgIGRpc2FibGVBY2Nlc3NpYmlsaXR5QW5kTW9ja0FjY2Vzc2liaWxpdHlTZXJ2aWNlKCk7CisgICAgICAgICAgICBlbmFibGVBY2Nlc3NpYmlsaXR5QW5kTW9ja0FjY2Vzc2liaWxpdHlTZXJ2aWNlKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBpZiAobVdvcmtlciAhPSBudWxsKSB7CisgICAgICAgICAgICBtV29ya2VyLnN0b3AoKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoc0V4ZWN1dGVkVGVzdENvdW50ID09IFRFU1RfQ0FTRV9DT1VOVCkgeworICAgICAgICAgICAgLy8gdW50aWwgSlVuaXQ0IGNvbWVzIHRvIHBsYXkgd2l0aCBAQWZ0ZXJUZXN0CisgICAgICAgICAgICBkaXNhYmxlQWNjZXNzaWJpbGl0eUFuZE1vY2tBY2Nlc3NpYmlsaXR5U2VydmljZSgpOworICAgICAgICB9CisgICAgICAgIHN1cGVyLnRlYXJEb3duKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdHMgbmF2aWdhdGlvbiBieSBjaGFyYWN0ZXIuCisgICAgICovCisgICAgQExhcmdlVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3ROYXZpZ2F0aW9uQnlDaGFyYWN0ZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gYSBiaXQgdWdseSBidXQgaGVscHMgZGV0ZWN0IGJlZ2lubmluZyBhbmQgZW5kIG9mIGFsbCB0ZXN0cyBzbyBhY2Nlc3NpYmlsaXR5CisgICAgICAgIC8vIGFuZCB0aGUgbW9jayBzZXJ2aWNlIGFyZSBub3QgdG9nZ2xlZCBvbiBldmVyeSB0ZXN0IChleHBlbnNpdmUpCisgICAgICAgIHNFeGVjdXRlZFRlc3RDb3VudCsrOworCisgICAgICAgIFN0cmluZyBodG1sID0KKyAgICAgICAgICAgICI8aHRtbD4iICsKKyAgICAgICAgICAgICAgICI8aGVhZD4iICsKKyAgICAgICAgICAgICAgICI8L2hlYWQ+IiArCisgICAgICAgICAgICAgICAiPGJvZHk+IiArCisgICAgICAgICAgICAgICAgICAgIjxwPiIgKworICAgICAgICAgICAgICAgICAgICAgICJhIDxiPmI8L2I+IGMiICsKKyAgICAgICAgICAgICAgICAgICAiPC9wPiIgKworICAgICAgICAgICAgICAgICAgICI8cD4iICsKKyAgICAgICAgICAgICAgICAgICAgICJkIiArCisgICAgICAgICAgICAgICAgICAgICAiPGlucHV0PmU8L2lucHV0PiIgKworICAgICAgICAgICAgICAgICAgICI8L3A+IiArCisgICAgICAgICAgICAgICAiPC9ib2R5PiIgKworICAgICAgICAgICAgICI8L2h0bWw+IjsKKworICAgICAgICBXZWJWaWV3IHdlYlZpZXcgPSBjcmVhdGVXZWJWZXdXaXRoSHRtbChodG1sKTsKKworICAgICAgICAvLyBjaGFuZ2UgbmF2aWdhdGlvbiBheGlzIHRvIHdvcmQKKyAgICAgICAgc2VuZEtleUV2ZW50KHdlYlZpZXcsIEtleUV2ZW50LktFWUNPREVfRFBBRF9ET1dOLCBNRVRBX1NUQVRFX0FMVF9MRUZUX09OKTsKKyAgICAgICAgYXNzZXJ0U2VsZWN0aW9uU3RyaW5nKCIxIik7IC8vIGV4cGVjdCB0aGUgd29yZCBuYXZpZ2F0aW9uIGF4aXMKKworICAgICAgICAvLyBjaGFuZ2UgbmF2aWdhdGlvbiBheGlzIHRvIGNoYXJhY3RlcgorICAgICAgICBzZW5kS2V5RXZlbnQod2ViVmlldywgS2V5RXZlbnQuS0VZQ09ERV9EUEFEX0RPV04sIE1FVEFfU1RBVEVfQUxUX0xFRlRfT04pOworICAgICAgICBhc3NlcnRTZWxlY3Rpb25TdHJpbmcoIjAiKTsgLy8gZXhwZWN0IHRoZSBjaGFyYWN0ZXIgbmF2aWdhdGlvbiBheGlzCisKKyAgICAgICAgLy8gZ28gdG8gdGhlIGZpcnN0IGNoYXJhY3RlcgorICAgICAgICBzZW5kS2V5RXZlbnQod2ViVmlldywgS2V5RXZlbnQuS0VZQ09ERV9EUEFEX0RPV04sIDApOworICAgICAgICBhc3NlcnRTZWxlY3Rpb25TdHJpbmcoImEiKTsKKworICAgICAgICAvLyBnbyB0byB0aGUgc2Vjb25kIGNoYXJhY3RlcgorICAgICAgICBzZW5kS2V5RXZlbnQod2ViVmlldywgS2V5RXZlbnQuS0VZQ09ERV9EUEFEX0RPV04sIDApOworICAgICAgICBhc3NlcnRTZWxlY3Rpb25TdHJpbmcoIjxiPmI8L2I+Iik7CisKKyAgICAgICAgLy8gZ28gdG8gdGhlIHRoaXJkIGNoYXJhY3RlcgorICAgICAgICBzZW5kS2V5RXZlbnQod2ViVmlldywgS2V5RXZlbnQuS0VZQ09ERV9EUEFEX0RPV04sIDApOworICAgICAgICBhc3NlcnRTZWxlY3Rpb25TdHJpbmcoImMiKTsKKworICAgICAgICAvLyBnbyB0byB0aGUgZm91cnRoIGNoYXJhY3RlcgorICAgICAgICBzZW5kS2V5RXZlbnQod2ViVmlldywgS2V5RXZlbnQuS0VZQ09ERV9EUEFEX0RPV04sIDApOworICAgICAgICBhc3NlcnRTZWxlY3Rpb25TdHJpbmcoImQiKTsKKworICAgICAgICAvLyBnbyB0byB0aGUgZmlmdGggY2hhcmFjdGVyCisgICAgICAgIHNlbmRLZXlFdmVudCh3ZWJWaWV3LCBLZXlFdmVudC5LRVlDT0RFX0RQQURfRE9XTiwgMCk7CisgICAgICAgIGFzc2VydFNlbGVjdGlvblN0cmluZygiZSIpOworCisgICAgICAgIC8vIHRyeSB0byBnbyBwYXN0IHRoZSBsYXN0IGNoYXJhY3RlcgorICAgICAgICBzZW5kS2V5RXZlbnQod2ViVmlldywgS2V5RXZlbnQuS0VZQ09ERV9EUEFEX0RPV04sIDApOworICAgICAgICBhc3NlcnRTZWxlY3Rpb25TdHJpbmcobnVsbCk7CisKKyAgICAgICAgLy8gZ28gdG8gdGhlIGZvdXJ0aCBjaGFyYWN0ZXIgKHJldmVyc2UpCisgICAgICAgIHNlbmRLZXlFdmVudCh3ZWJWaWV3LCBLZXlFdmVudC5LRVlDT0RFX0RQQURfVVAsIDApOworICAgICAgICBhc3NlcnRTZWxlY3Rpb25TdHJpbmcoImQiKTsKKworICAgICAgICAvLyBnbyB0byB0aGUgdGhpcmQgY2hhcmFjdGVyCisgICAgICAgIHNlbmRLZXlFdmVudCh3ZWJWaWV3LCBLZXlFdmVudC5LRVlDT0RFX0RQQURfVVAsIDApOworICAgICAgICBhc3NlcnRTZWxlY3Rpb25TdHJpbmcoImMiKTsKKworICAgICAgICAvLyBnbyB0byB0aGUgc2Vjb25kIGNoYXJhY3RlcgorICAgICAgICBzZW5kS2V5RXZlbnQod2ViVmlldywgS2V5RXZlbnQuS0VZQ09ERV9EUEFEX1VQLCAwKTsKKyAgICAgICAgYXNzZXJ0U2VsZWN0aW9uU3RyaW5nKCI8Yj5iPC9iPiIpOworCisgICAgICAgIC8vIGdvIHRvIHRoZSBmaXJzdCBjaGFyYWN0ZXIKKyAgICAgICAgc2VuZEtleUV2ZW50KHdlYlZpZXcsIEtleUV2ZW50LktFWUNPREVfRFBBRF9VUCwgMCk7CisgICAgICAgIGFzc2VydFNlbGVjdGlvblN0cmluZygiYSIpOworCisgICAgICAgIC8vIHRyeSB0byBnbyBiZWZvcmUgdGhlIGZpcnN0IGNoYXJhY3RlcgorICAgICAgICBzZW5kS2V5RXZlbnQod2ViVmlldywgS2V5RXZlbnQuS0VZQ09ERV9EUEFEX1VQLCAwKTsKKyAgICAgICAgYXNzZXJ0U2VsZWN0aW9uU3RyaW5nKG51bGwpOworCisgICAgICAgIC8vIGdvIHRvIHRoZSBzZWNvbmQgY2hhcmFjdGVyIChyZXZlcnNlIGFnYWluKQorICAgICAgICBzZW5kS2V5RXZlbnQod2ViVmlldywgS2V5RXZlbnQuS0VZQ09ERV9EUEFEX0RPV04sIDApOworICAgICAgICBhc3NlcnRTZWxlY3Rpb25TdHJpbmcoIjxiPmI8L2I+Iik7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdHMgbmF2aWdhdGlvbiBieSB3b3JkLgorICAgICAqLworICAgIEBMYXJnZVRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TmF2aWdhdGlvbkJ5V29yZCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICAvLyBhIGJpdCB1Z2x5IGJ1dCBoZWxwcyBkZXRlY3QgYmVnaW5uaW5nIGFuZCBlbmQgb2YgYWxsIHRlc3RzIHNvIGFjY2Vzc2liaWxpdHkKKyAgICAgICAgLy8gYW5kIHRoZSBtb2NrIHNlcnZpY2UgYXJlIG5vdCB0b2dnbGVkIG9uIGV2ZXJ5IHRlc3QgKGV4cGVuc2l2ZSkKKyAgICAgICAgc0V4ZWN1dGVkVGVzdENvdW50Kys7CisKKyAgICAgICAgU3RyaW5nIGh0bWwgPQorICAgICAgICAgICAgIjxodG1sPiIgKworICAgICAgICAgICAgICAgIjxoZWFkPiIgKworICAgICAgICAgICAgICAgIjwvaGVhZD4iICsKKyAgICAgICAgICAgICAgICI8Ym9keT4iICsKKyAgICAgICAgICAgICAgICAgICAiPHA+IiArCisgICAgICAgICAgICAgICAgICAgICAgIlRoaXMgaXMgPGI+YTwvYj4gc2VudGVuY2UiICsKKyAgICAgICAgICAgICAgICAgICAiPC9wPiIgKworICAgICAgICAgICAgICAgICAgICI8cD4iICsKKyAgICAgICAgICAgICAgICAgICAgICIgc2NhdHRlcmVkICIgKworICAgICAgICAgICAgICAgICAgICAgIjxpbnB1dD5hbGw8L2lucHV0PiIgKworICAgICAgICAgICAgICAgICAgICAgIiBvdmVyICIgKworICAgICAgICAgICAgICAgICAgICI8L3A+IiArCisgICAgICAgICAgICAgICAgICAgIjxkaXY+IiArCisgICAgICAgICAgICAgICAgICAgICAiPGJ1dHRvbj50aGUgcGxhY2UuPC9idXR0b24+IiArCisgICAgICAgICAgICAgICAgICAgIjwvZGl2PiIgKworICAgICAgICAgICAgICAgIjwvYm9keT4iICsKKyAgICAgICAgICAgICAiPC9odG1sPiI7CisKKyAgICAgICAgV2ViVmlldyB3ZWJWaWV3ID0gY3JlYXRlV2ViVmV3V2l0aEh0bWwoaHRtbCk7CisKKyAgICAgICAgLy8gY2hhbmdlIG5hdmlnYXRpb24gYXhpcyB0byB3b3JkCisgICAgICAgIHNlbmRLZXlFdmVudCh3ZWJWaWV3LCBLZXlFdmVudC5LRVlDT0RFX0RQQURfRE9XTiwgTUVUQV9TVEFURV9BTFRfTEVGVF9PTik7CisgICAgICAgIGFzc2VydFNlbGVjdGlvblN0cmluZygiMSIpOyAvLyBleHBlY3QgdGhlIHdvcmQgbmF2aWdhdGlvbiBheGlzCisKKyAgICAgICAgLy8gZ28gdG8gdGhlIGZpcnN0IHdvcmQKKyAgICAgICAgc2VuZEtleUV2ZW50KHdlYlZpZXcsIEtleUV2ZW50LktFWUNPREVfRFBBRF9ET1dOLCAwKTsKKyAgICAgICAgYXNzZXJ0U2VsZWN0aW9uU3RyaW5nKCJUaGlzIik7CisKKyAgICAgICAgLy8gZ28gdG8gdGhlIHNlY29uZCB3b3JkCisgICAgICAgIHNlbmRLZXlFdmVudCh3ZWJWaWV3LCBLZXlFdmVudC5LRVlDT0RFX0RQQURfRE9XTiwgMCk7CisgICAgICAgIGFzc2VydFNlbGVjdGlvblN0cmluZygiaXMiKTsKKworICAgICAgICAvLyBnbyB0byB0aGUgdGhpcmQgd29yZAorICAgICAgICBzZW5kS2V5RXZlbnQod2ViVmlldywgS2V5RXZlbnQuS0VZQ09ERV9EUEFEX0RPV04sIDApOworICAgICAgICBhc3NlcnRTZWxlY3Rpb25TdHJpbmcoIjxiPmE8L2I+Iik7CisKKyAgICAgICAgLy8gZ28gdG8gdGhlIGZvdXJ0aCB3b3JkCisgICAgICAgIHNlbmRLZXlFdmVudCh3ZWJWaWV3LCBLZXlFdmVudC5LRVlDT0RFX0RQQURfRE9XTiwgMCk7CisgICAgICAgIGFzc2VydFNlbGVjdGlvblN0cmluZygic2VudGVuY2UiKTsKKworICAgICAgICAvLyBnbyB0byB0aGUgZmlmdGggd29yZAorICAgICAgICBzZW5kS2V5RXZlbnQod2ViVmlldywgS2V5RXZlbnQuS0VZQ09ERV9EUEFEX0RPV04sIDApOworICAgICAgICBhc3NlcnRTZWxlY3Rpb25TdHJpbmcoInNjYXR0ZXJlZCIpOworCisgICAgICAgIC8vIGdvIHRvIHRoZSBzaXh0aCB3b3JkCisgICAgICAgIHNlbmRLZXlFdmVudCh3ZWJWaWV3LCBLZXlFdmVudC5LRVlDT0RFX0RQQURfRE9XTiwgMCk7CisgICAgICAgIGFzc2VydFNlbGVjdGlvblN0cmluZygiYWxsIik7CisKKyAgICAgICAgLy8gZ28gdG8gdGhlIHNldmVudGggd29yZAorICAgICAgICBzZW5kS2V5RXZlbnQod2ViVmlldywgS2V5RXZlbnQuS0VZQ09ERV9EUEFEX0RPV04sIDApOworICAgICAgICBhc3NlcnRTZWxlY3Rpb25TdHJpbmcoIm92ZXIiKTsKKworICAgICAgICAvLyBnbyB0byB0aGUgZWlnaHQgd29yZAorICAgICAgICBzZW5kS2V5RXZlbnQod2ViVmlldywgS2V5RXZlbnQuS0VZQ09ERV9EUEFEX0RPV04sIDApOworICAgICAgICBhc3NlcnRTZWxlY3Rpb25TdHJpbmcoInRoZSIpOworCisgICAgICAgIC8vIGdvIHRvIHRoZSBuaW50aCB3b3JkCisgICAgICAgIHNlbmRLZXlFdmVudCh3ZWJWaWV3LCBLZXlFdmVudC5LRVlDT0RFX0RQQURfRE9XTiwgMCk7CisgICAgICAgIGFzc2VydFNlbGVjdGlvblN0cmluZygicGxhY2UiKTsKKworICAgICAgICAvLyBOT1RFOiBXZWJLaXQgc2VsZWN0aW9uIHJldHVybnMgdGhlIGRvdCBhcyBhIHdvcmQKKyAgICAgICAgc2VuZEtleUV2ZW50KHdlYlZpZXcsIEtleUV2ZW50LktFWUNPREVfRFBBRF9ET1dOLCAwKTsKKyAgICAgICAgYXNzZXJ0U2VsZWN0aW9uU3RyaW5nKCIuIik7CisKKyAgICAgICAgLy8gdHJ5IHRvIGdvIHBhc3QgdGhlIGxhc3Qgd29yZAorICAgICAgICBzZW5kS2V5RXZlbnQod2ViVmlldywgS2V5RXZlbnQuS0VZQ09ERV9EUEFEX0RPV04sIDApOworICAgICAgICBhc3NlcnRTZWxlY3Rpb25TdHJpbmcobnVsbCk7CisKKyAgICAgICAgLy8gZ28gdG8gdGhlIGxhc3Qgd29yZCAocmV2ZXJzZSkKKyAgICAgICAgc2VuZEtleUV2ZW50KHdlYlZpZXcsIEtleUV2ZW50LktFWUNPREVfRFBBRF9VUCwgMCk7CisgICAgICAgIGFzc2VydFNlbGVjdGlvblN0cmluZygicGxhY2UiKTsKKworICAgICAgICAvLyBnbyB0byB0aGUgZWlnaHQgd29yZAorICAgICAgICBzZW5kS2V5RXZlbnQod2ViVmlldywgS2V5RXZlbnQuS0VZQ09ERV9EUEFEX1VQLCAwKTsKKyAgICAgICAgYXNzZXJ0U2VsZWN0aW9uU3RyaW5nKCJ0aGUiKTsKKworICAgICAgICAvLyBnbyB0byB0aGUgc2V2ZW50aCB3b3JkCisgICAgICAgIHNlbmRLZXlFdmVudCh3ZWJWaWV3LCBLZXlFdmVudC5LRVlDT0RFX0RQQURfVVAsIDApOworICAgICAgICBhc3NlcnRTZWxlY3Rpb25TdHJpbmcoIm92ZXIiKTsKKworICAgICAgICAvLyBnbyB0byB0aGUgc2l4dGggd29yZAorICAgICAgICBzZW5kS2V5RXZlbnQod2ViVmlldywgS2V5RXZlbnQuS0VZQ09ERV9EUEFEX1VQLCAwKTsKKyAgICAgICAgYXNzZXJ0U2VsZWN0aW9uU3RyaW5nKCJhbGwiKTsKKworICAgICAgICAvLyBnbyB0byB0aGUgZmlmdGggd29yZAorICAgICAgICBzZW5kS2V5RXZlbnQod2ViVmlldywgS2V5RXZlbnQuS0VZQ09ERV9EUEFEX1VQLCAwKTsKKyAgICAgICAgYXNzZXJ0U2VsZWN0aW9uU3RyaW5nKCJzY2F0dGVyZWQiKTsKKworICAgICAgICAvLyBnbyB0byB0aGUgZm91cnRoIHdvcmQKKyAgICAgICAgc2VuZEtleUV2ZW50KHdlYlZpZXcsIEtleUV2ZW50LktFWUNPREVfRFBBRF9VUCwgMCk7CisgICAgICAgIGFzc2VydFNlbGVjdGlvblN0cmluZygic2VudGVuY2UiKTsKKworICAgICAgICAvLyBnbyB0byB0aGUgdGhpcmQgd29yZAorICAgICAgICBzZW5kS2V5RXZlbnQod2ViVmlldywgS2V5RXZlbnQuS0VZQ09ERV9EUEFEX1VQLCAwKTsKKyAgICAgICAgYXNzZXJ0U2VsZWN0aW9uU3RyaW5nKCI8Yj5hPC9iPiIpOworCisgICAgICAgIC8vIGdvIHRvIHRoZSBzZWNvbmQgd29yZAorICAgICAgICBzZW5kS2V5RXZlbnQod2ViVmlldywgS2V5RXZlbnQuS0VZQ09ERV9EUEFEX1VQLCAwKTsKKyAgICAgICAgYXNzZXJ0U2VsZWN0aW9uU3RyaW5nKCJpcyIpOworCisgICAgICAgIC8vIGdvIHRvIHRoZSBmaXJzdCB3b3JkCisgICAgICAgIHNlbmRLZXlFdmVudCh3ZWJWaWV3LCBLZXlFdmVudC5LRVlDT0RFX0RQQURfVVAsIDApOworICAgICAgICBhc3NlcnRTZWxlY3Rpb25TdHJpbmcoIlRoaXMiKTsKKworICAgICAgICAvLyB0cnkgdG8gZ28gYmVmb3JlIHRoZSBmaXJzdCB3b3JkCisgICAgICAgIHNlbmRLZXlFdmVudCh3ZWJWaWV3LCBLZXlFdmVudC5LRVlDT0RFX0RQQURfVVAsIDApOworICAgICAgICBhc3NlcnRTZWxlY3Rpb25TdHJpbmcobnVsbCk7CisKKyAgICAgICAgLy8gZ28gdG8gdGhlIHNlY29uZCB3b3JkIChyZXZlcnNlIGFnYWluKQorICAgICAgICBzZW5kS2V5RXZlbnQod2ViVmlldywgS2V5RXZlbnQuS0VZQ09ERV9EUEFEX0RPV04sIDApOworICAgICAgICBhc3NlcnRTZWxlY3Rpb25TdHJpbmcoImlzIik7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdHMgbmF2aWdhdGlvbiBieSBzZW50ZW5jZS4KKyAgICAgKi8KKyAgICBATGFyZ2VUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE5hdmlnYXRpb25CeVNlbnRlbmNlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIC8vIGEgYml0IHVnbHkgYnV0IGhlbHBzIGRldGVjdCBiZWdpbm5pbmcgYW5kIGVuZCBvZiBhbGwgdGVzdHMgc28gYWNjZXNzaWJpbGl0eQorICAgICAgICAvLyBhbmQgdGhlIG1vY2sgc2VydmljZSBhcmUgbm90IHRvZ2dsZWQgb24gZXZlcnkgdGVzdCAoZXhwZW5zaXZlKQorICAgICAgICBzRXhlY3V0ZWRUZXN0Q291bnQrKzsKKworICAgICAgICBTdHJpbmcgaHRtbCA9CisgICAgICAgICAgICAiPGh0bWw+IiArCisgICAgICAgICAgICAgICI8aGVhZD4iICsKKyAgICAgICAgICAgICAgIjwvaGVhZD4iICsKKyAgICAgICAgICAgICAgIjxib2R5PiIgKworICAgICAgICAgICAgICAgICI8ZGl2PiIgKworICAgICAgICAgICAgICAgICAgIjxwPiIgKworICAgICAgICAgICAgICAgICAgICAiVGhpcyBpcyB0aGUgZmlyc3Qgc2VudGVuY2Ugb2YgdGhlIGZpcnN0IHBhcmFncmFwaCBhbmQgaGFzIGFuIDxiPmlubGluZSBib2xkIHRhZzwvYj4uIiArCisgICAgICAgICAgICAgICAgICAgICJUaGlzIGlzIHRoZSBzZWNvbmQgc2VudGVuY2Ugb2YgdGhlIGZpcnN0IHBhcmFncmFwaC4iICsKKyAgICAgICAgICAgICAgICAgICI8L3A+IiArCisgICAgICAgICAgICAgICAgICAiPGgxPlRoaXMgaXMgYSBoZWFkaW5nPC9oMT4iICsKKyAgICAgICAgICAgICAgICAgICI8cD4iICsKKyAgICAgICAgICAgICAgICAgICAgIlRoaXMgaXMgdGhlIGZpcnN0IHNlbnRlbmNlIG9mIHRoZSBzZWNvbmQgcGFyYWdyYXBoLiIgKworICAgICAgICAgICAgICAgICAgICAiVGhpcyBpcyB0aGUgc2Vjb25kIHNlbnRlbmNlIG9mIHRoZSBzZWNvbmQgcGFyYWdyYXBoLiIgKworICAgICAgICAgICAgICAgICAgIjwvcD4iICsKKyAgICAgICAgICAgICAgICAiPC9kaXY+IiArCisgICAgICAgICAgICAgICI8L2JvZHk+IiArCisgICAgICAgICAgICAiPC9odG1sPiI7CisKKyAgICAgICAgV2ViVmlldyB3ZWJWaWV3ID0gY3JlYXRlV2ViVmV3V2l0aEh0bWwoaHRtbCk7CisKKyAgICAgICAgLy8gU2VudGVuY2UgYXhpcyBpcyB0aGUgZGVmYXVsdAorCisgICAgICAgIC8vIGdvIHRvIHRoZSBmaXJzdCBzZW50ZW5jZQorICAgICAgICBzZW5kS2V5RXZlbnQod2ViVmlldywgS2V5RXZlbnQuS0VZQ09ERV9EUEFEX0RPV04sIDApOworICAgICAgICBhc3NlcnRTZWxlY3Rpb25TdHJpbmcoIlRoaXMgaXMgdGhlIGZpcnN0IHNlbnRlbmNlIG9mIHRoZSBmaXJzdCBwYXJhZ3JhcGggYW5kIGhhcyBhbiAiCisgICAgICAgICAgICAgICAgKyAiPGI+aW5saW5lIGJvbGQgdGFnPC9iPi4iKTsKKworICAgICAgICAvLyBnbyB0byB0aGUgc2Vjb25kIHNlbnRlbmNlCisgICAgICAgIHNlbmRLZXlFdmVudCh3ZWJWaWV3LCBLZXlFdmVudC5LRVlDT0RFX0RQQURfRE9XTiwgMCk7CisgICAgICAgIGFzc2VydFNlbGVjdGlvblN0cmluZygiVGhpcyBpcyB0aGUgc2Vjb25kIHNlbnRlbmNlIG9mIHRoZSBmaXJzdCBwYXJhZ3JhcGguIik7CisKKyAgICAgICAgLy8gZ28gdG8gdGhlIHRoaXJkIHNlbnRlbmNlCisgICAgICAgIHNlbmRLZXlFdmVudCh3ZWJWaWV3LCBLZXlFdmVudC5LRVlDT0RFX0RQQURfRE9XTiwgMCk7CisgICAgICAgIGFzc2VydFNlbGVjdGlvblN0cmluZygiVGhpcyBpcyBhIGhlYWRpbmciKTsKKworICAgICAgICAvLyBnbyB0byB0aGUgZm91cnRoIHNlbnRlbmNlCisgICAgICAgIHNlbmRLZXlFdmVudCh3ZWJWaWV3LCBLZXlFdmVudC5LRVlDT0RFX0RQQURfRE9XTiwgMCk7CisgICAgICAgIGFzc2VydFNlbGVjdGlvblN0cmluZygiVGhpcyBpcyB0aGUgZmlyc3Qgc2VudGVuY2Ugb2YgdGhlIHNlY29uZCBwYXJhZ3JhcGguIik7CisKKyAgICAgICAgLy8gZ28gdG8gdGhlIGZpZnRoIHNlbnRlbmNlCisgICAgICAgIHNlbmRLZXlFdmVudCh3ZWJWaWV3LCBLZXlFdmVudC5LRVlDT0RFX0RQQURfRE9XTiwgMCk7CisgICAgICAgIGFzc2VydFNlbGVjdGlvblN0cmluZygiVGhpcyBpcyB0aGUgc2Vjb25kIHNlbnRlbmNlIG9mIHRoZSBzZWNvbmQgcGFyYWdyYXBoLiIpOworCisgICAgICAgIC8vIHRyeSB0byBnbyBwYXN0IHRoZSBsYXN0IHNlbnRlbmNlCisgICAgICAgIHNlbmRLZXlFdmVudCh3ZWJWaWV3LCBLZXlFdmVudC5LRVlDT0RFX0RQQURfRE9XTiwgMCk7CisgICAgICAgIGFzc2VydFNlbGVjdGlvblN0cmluZyhudWxsKTsKKworICAgICAgICAvLyBnbyB0byB0aGUgZm91cnRoIHNlbnRlbmNlIChyZXZlcnNlKQorICAgICAgICBzZW5kS2V5RXZlbnQod2ViVmlldywgS2V5RXZlbnQuS0VZQ09ERV9EUEFEX1VQLCAwKTsKKyAgICAgICAgYXNzZXJ0U2VsZWN0aW9uU3RyaW5nKCJUaGlzIGlzIHRoZSBmaXJzdCBzZW50ZW5jZSBvZiB0aGUgc2Vjb25kIHBhcmFncmFwaC4iKTsKKworICAgICAgICAvLyBnbyB0byB0aGUgdGhpcmQgc2VudGVuY2UKKyAgICAgICAgc2VuZEtleUV2ZW50KHdlYlZpZXcsIEtleUV2ZW50LktFWUNPREVfRFBBRF9VUCwgMCk7CisgICAgICAgIGFzc2VydFNlbGVjdGlvblN0cmluZygiVGhpcyBpcyBhIGhlYWRpbmciKTsKKworICAgICAgICAvLyBnbyB0byB0aGUgc2Vjb25kIHNlbnRlbmNlCisgICAgICAgIHNlbmRLZXlFdmVudCh3ZWJWaWV3LCBLZXlFdmVudC5LRVlDT0RFX0RQQURfVVAsIDApOworICAgICAgICBhc3NlcnRTZWxlY3Rpb25TdHJpbmcoIlRoaXMgaXMgdGhlIHNlY29uZCBzZW50ZW5jZSBvZiB0aGUgZmlyc3QgcGFyYWdyYXBoLiIpOworCisgICAgICAgIC8vIGdvIHRvIHRoZSBmaXJzdCBzZW50ZW5jZQorICAgICAgICBzZW5kS2V5RXZlbnQod2ViVmlldywgS2V5RXZlbnQuS0VZQ09ERV9EUEFEX1VQLCAwKTsKKyAgICAgICAgYXNzZXJ0U2VsZWN0aW9uU3RyaW5nKCJUaGlzIGlzIHRoZSBmaXJzdCBzZW50ZW5jZSBvZiB0aGUgZmlyc3QgcGFyYWdyYXBoIGFuZCBoYXMgYW4gIgorICAgICAgICAgICAgICAgICsgIjxiPmlubGluZSBib2xkIHRhZzwvYj4uIik7CisKKyAgICAgICAgLy8gdHJ5IHRvIGdvIGJlZm9yZSB0aGUgZmlyc3Qgc2VudGVuY2UKKyAgICAgICAgc2VuZEtleUV2ZW50KHdlYlZpZXcsIEtleUV2ZW50LktFWUNPREVfRFBBRF9VUCwgMCk7CisgICAgICAgIGFzc2VydFNlbGVjdGlvblN0cmluZyhudWxsKTsKKworICAgICAgICAvLyBnbyB0byB0aGUgc2Vjb25kIHNlbnRlbmNlIChyZXZlcnNlIGFnYWluKQorICAgICAgICBzZW5kS2V5RXZlbnQod2ViVmlldywgS2V5RXZlbnQuS0VZQ09ERV9EUEFEX0RPV04sIDApOworICAgICAgICBhc3NlcnRTZWxlY3Rpb25TdHJpbmcoIlRoaXMgaXMgdGhlIHNlY29uZCBzZW50ZW5jZSBvZiB0aGUgZmlyc3QgcGFyYWdyYXBoLiIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3RzIG5hdmlnYXRpb24gYnkgaGVhZGluZy4KKyAgICAgKi8KKyAgICBATGFyZ2VUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE5hdmlnYXRpb25CeUhlYWRpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gYSBiaXQgdWdseSBidXQgaGVscHMgZGV0ZWN0IGJlZ2lubmluZyBhbmQgZW5kIG9mIGFsbCB0ZXN0cyBzbyBhY2Nlc3NpYmlsaXR5CisgICAgICAgIC8vIGFuZCB0aGUgbW9jayBzZXJ2aWNlIGFyZSBub3QgdG9nZ2xlZCBvbiBldmVyeSB0ZXN0IChleHBlbnNpdmUpCisgICAgICAgIHNFeGVjdXRlZFRlc3RDb3VudCsrOworCisgICAgICAgIFN0cmluZyBodG1sID0KKyAgICAgICAgICAgICI8IURPQ1RZUEUgaHRtbD4iICsKKyAgICAgICAgICAgICI8aHRtbD4iICsKKyAgICAgICAgICAgICAgIjxoZWFkPiIgKworICAgICAgICAgICAgICAiPC9oZWFkPiIgKworICAgICAgICAgICAgICAiPGJvZHk+IiArCisgICAgICAgICAgICAgICAgIjxoMT5IZWFkaW5nIG9uZTwvaDE+IiArCisgICAgICAgICAgICAgICAgIjxwPiIgKworICAgICAgICAgICAgICAgICAgIlRoaXMgaXMgc29tZSB0ZXh0IiArCisgICAgICAgICAgICAgICAgIjwvcD4iICsKKyAgICAgICAgICAgICAgICAiPGgyPkhlYWRpbmcgdHdvPC9oMj4iICsKKyAgICAgICAgICAgICAgICAiPHA+IiArCisgICAgICAgICAgICAgICAgICAiVGhpcyBpcyBzb21lIHRleHQiICsKKyAgICAgICAgICAgICAgICAiPC9wPiIgKworICAgICAgICAgICAgICAgICI8aDM+SGVhZGluZyB0aHJlZTwvaDM+IiArCisgICAgICAgICAgICAgICAgIjxwPiIgKworICAgICAgICAgICAgICAgICAgIlRoaXMgaXMgc29tZSB0ZXh0IiArCisgICAgICAgICAgICAgICAgIjwvcD4iICsKKyAgICAgICAgICAgICAgICAiPGg0PkhlYWRpbmcgZm91cjwvaDQ+IiArCisgICAgICAgICAgICAgICAgIjxwPiIgKworICAgICAgICAgICAgICAgICAgIlRoaXMgaXMgc29tZSB0ZXh0IiArCisgICAgICAgICAgICAgICAgIjwvcD4iICsKKyAgICAgICAgICAgICAgICAiPGg1PkhlYWRpbmcgZml2ZTwvaDU+IiArCisgICAgICAgICAgICAgICAgIjxwPiIgKworICAgICAgICAgICAgICAgICAgIlRoaXMgaXMgc29tZSB0ZXh0IiArCisgICAgICAgICAgICAgICAgIjwvcD4iICsKKyAgICAgICAgICAgICAgICAiPGg2PkhlYWRpbmcgc2l4PC9oNj4iICsKKyAgICAgICAgICAgICAgIjwvYm9keT4iICsKKyAgICAgICAgICAgICI8L2h0bWw+IjsKKworICAgICAgICBXZWJWaWV3IHdlYlZpZXcgPSBjcmVhdGVXZWJWZXdXaXRoSHRtbChodG1sKTsKKworICAgICAgICAvLyBjaGFuZ2UgbmF2aWdhdGlvbiBheGlzIHRvIGhlYWRpbmcKKyAgICAgICAgc2VuZEtleUV2ZW50KHdlYlZpZXcsIEtleUV2ZW50LktFWUNPREVfRFBBRF9SSUdIVCwgTUVUQV9TVEFURV9BTFRfTEVGVF9PTik7CisgICAgICAgIGFzc2VydFNlbGVjdGlvblN0cmluZygiMyIpOyAvLyBleHBlY3QgdGhlIGhlYWRpbmcgbmF2aWdhdGlvbiBheGlzCisKKyAgICAgICAgLy8gZ28gdG8gdGhlIGZpcnN0IGhlYWRpbmcKKyAgICAgICAgc2VuZEtleUV2ZW50KHdlYlZpZXcsIEtleUV2ZW50LktFWUNPREVfRFBBRF9ET1dOLCAwKTsKKyAgICAgICAgYXNzZXJ0U2VsZWN0aW9uU3RyaW5nKCI8aDE+SGVhZGluZyBvbmU8L2gxPiIpOworCisgICAgICAgIC8vIGdvIHRvIHRoZSBzZWNvbmQgaGVhZGluZworICAgICAgICBzZW5kS2V5RXZlbnQod2ViVmlldywgS2V5RXZlbnQuS0VZQ09ERV9EUEFEX0RPV04sIDApOworICAgICAgICBhc3NlcnRTZWxlY3Rpb25TdHJpbmcoIjxoMj5IZWFkaW5nIHR3bzwvaDI+Iik7CisKKyAgICAgICAgLy8gZ28gdG8gdGhlIHRoaXJkIGhlYWRpbmcKKyAgICAgICAgc2VuZEtleUV2ZW50KHdlYlZpZXcsIEtleUV2ZW50LktFWUNPREVfRFBBRF9ET1dOLCAwKTsKKyAgICAgICAgYXNzZXJ0U2VsZWN0aW9uU3RyaW5nKCI8aDM+SGVhZGluZyB0aHJlZTwvaDM+Iik7CisKKyAgICAgICAgLy8gZ28gdG8gdGhlIGZvdXJ0aCBoZWFkaW5nCisgICAgICAgIHNlbmRLZXlFdmVudCh3ZWJWaWV3LCBLZXlFdmVudC5LRVlDT0RFX0RQQURfRE9XTiwgMCk7CisgICAgICAgIGFzc2VydFNlbGVjdGlvblN0cmluZygiPGg0PkhlYWRpbmcgZm91cjwvaDQ+Iik7CisKKyAgICAgICAgLy8gZ28gdG8gdGhlIGZpZnRoIGhlYWRpbmcKKyAgICAgICAgc2VuZEtleUV2ZW50KHdlYlZpZXcsIEtleUV2ZW50LktFWUNPREVfRFBBRF9ET1dOLCAwKTsKKyAgICAgICAgYXNzZXJ0U2VsZWN0aW9uU3RyaW5nKCI8aDU+SGVhZGluZyBmaXZlPC9oNT4iKTsKKworICAgICAgICAvLyBnbyB0byB0aGUgc2l4dGggaGVhZGluZworICAgICAgICBzZW5kS2V5RXZlbnQod2ViVmlldywgS2V5RXZlbnQuS0VZQ09ERV9EUEFEX0RPV04sIDApOworICAgICAgICBhc3NlcnRTZWxlY3Rpb25TdHJpbmcoIjxoNj5IZWFkaW5nIHNpeDwvaDY+Iik7CisKKyAgICAgICAgLy8gdHJ5IHRvIGdvIHBhc3QgdGhlIGxhc3QgaGVhZGluZworICAgICAgICBzZW5kS2V5RXZlbnQod2ViVmlldywgS2V5RXZlbnQuS0VZQ09ERV9EUEFEX0RPV04sIDApOworICAgICAgICBhc3NlcnRTZWxlY3Rpb25TdHJpbmcobnVsbCk7CisKKyAgICAgICAgLy8gZ28gdG8gdGhlIGZpZnRoIGhlYWRpbmcgKHJldmVyc2UpCisgICAgICAgIHNlbmRLZXlFdmVudCh3ZWJWaWV3LCBLZXlFdmVudC5LRVlDT0RFX0RQQURfVVAsIDApOworICAgICAgICBhc3NlcnRTZWxlY3Rpb25TdHJpbmcoIjxoNT5IZWFkaW5nIGZpdmU8L2g1PiIpOworCisgICAgICAgIC8vIGdvIHRvIHRoZSBmb3VydGggaGVhZGluZworICAgICAgICBzZW5kS2V5RXZlbnQod2ViVmlldywgS2V5RXZlbnQuS0VZQ09ERV9EUEFEX1VQLCAwKTsKKyAgICAgICAgYXNzZXJ0U2VsZWN0aW9uU3RyaW5nKCI8aDQ+SGVhZGluZyBmb3VyPC9oND4iKTsKKworICAgICAgICAvLyBnbyB0byB0aGUgdGhpcmQgaGVhZGluZworICAgICAgICBzZW5kS2V5RXZlbnQod2ViVmlldywgS2V5RXZlbnQuS0VZQ09ERV9EUEFEX1VQLCAwKTsKKyAgICAgICAgYXNzZXJ0U2VsZWN0aW9uU3RyaW5nKCI8aDM+SGVhZGluZyB0aHJlZTwvaDM+Iik7CisKKyAgICAgICAgLy8gZ28gdG8gdGhlIHNlY29uZCBoZWFkaW5nCisgICAgICAgIHNlbmRLZXlFdmVudCh3ZWJWaWV3LCBLZXlFdmVudC5LRVlDT0RFX0RQQURfVVAsIDApOworICAgICAgICBhc3NlcnRTZWxlY3Rpb25TdHJpbmcoIjxoMj5IZWFkaW5nIHR3bzwvaDI+Iik7CisKKyAgICAgICAgLy8gZ28gdG8gdGhlIGZpcnN0IGhlYWRpbmcKKyAgICAgICAgc2VuZEtleUV2ZW50KHdlYlZpZXcsIEtleUV2ZW50LktFWUNPREVfRFBBRF9VUCwgMCk7CisgICAgICAgIGFzc2VydFNlbGVjdGlvblN0cmluZygiPGgxPkhlYWRpbmcgb25lPC9oMT4iKTsKKworICAgICAgICAvLyB0cnkgdG8gZ28gYmVmb3JlIHRoZSBmaXJzdCBoZWFkaW5nCisgICAgICAgIHNlbmRLZXlFdmVudCh3ZWJWaWV3LCBLZXlFdmVudC5LRVlDT0RFX0RQQURfVVAsIDApOworICAgICAgICBhc3NlcnRTZWxlY3Rpb25TdHJpbmcobnVsbCk7CisKKyAgICAgICAgLy8gZ28gdG8gdGhlIHNlY29uZCBoZWFkaW5nIChyZXZlcnNlIGFnYWluKQorICAgICAgICBzZW5kS2V5RXZlbnQod2ViVmlldywgS2V5RXZlbnQuS0VZQ09ERV9EUEFEX0RPV04sIDApOworICAgICAgICBhc3NlcnRTZWxlY3Rpb25TdHJpbmcoIjxoMj5IZWFkaW5nIHR3bzwvaDI+Iik7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdHMgbmF2aWdhdGlvbiBieSBzaWJsaW5nLgorICAgICAqLworICAgIEBMYXJnZVRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TmF2aWdhdGlvbkJ5U2liaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIC8vIGEgYml0IHVnbHkgYnV0IGhlbHBzIGRldGVjdCBiZWdpbm5pbmcgYW5kIGVuZCBvZiBhbGwgdGVzdHMgc28gYWNjZXNzaWJpbGl0eQorICAgICAgICAvLyBhbmQgdGhlIG1vY2sgc2VydmljZSBhcmUgbm90IHRvZ2dsZWQgb24gZXZlcnkgdGVzdCAoZXhwZW5zaXZlKQorICAgICAgICBzRXhlY3V0ZWRUZXN0Q291bnQrKzsKKworICAgICAgICBTdHJpbmcgaHRtbCA9CisgICAgICAgICAgICAiPCFET0NUWVBFIGh0bWw+IiArCisgICAgICAgICAgICAiPGh0bWw+IiArCisgICAgICAgICAgICAgICI8aGVhZD4iICsKKyAgICAgICAgICAgICAgIjwvaGVhZD4iICsKKyAgICAgICAgICAgICAgIjxib2R5PiIgKworICAgICAgICAgICAgICAgICI8aDE+SGVhZGluZyBvbmU8L2gxPiIgKworICAgICAgICAgICAgICAgICI8cD4iICsKKyAgICAgICAgICAgICAgICAgICJUaGlzIGlzIHNvbWUgdGV4dCIgKworICAgICAgICAgICAgICAgICI8L3A+IiArCisgICAgICAgICAgICAgICAgIjxkaXY+IiArCisgICAgICAgICAgICAgICAgICAiPGJ1dHRvbj5JbnB1dDwvYnV0dG9uPiIgKworICAgICAgICAgICAgICAgICI8L2Rpdj4iICsKKyAgICAgICAgICAgICAgIjwvYm9keT4iICsKKyAgICAgICAgICAgICI8L2h0bWw+IjsKKworICAgICAgICBXZWJWaWV3IHdlYlZpZXcgPSBjcmVhdGVXZWJWZXdXaXRoSHRtbChodG1sKTsKKworICAgICAgICAvLyBjaGFuZ2UgbmF2aWdhdGlvbiBheGlzIHRvIGhlYWRpbmcKKyAgICAgICAgc2VuZEtleUV2ZW50KHdlYlZpZXcsIEtleUV2ZW50LktFWUNPREVfRFBBRF9SSUdIVCwgTUVUQV9TVEFURV9BTFRfTEVGVF9PTik7CisgICAgICAgIGFzc2VydFNlbGVjdGlvblN0cmluZygiMyIpOyAvLyBleHBlY3QgdGhlIGhlYWRpbmcgbmF2aWdhdGlvbiBheGlzCisKKyAgICAgICAgLy8gY2hhbmdlIG5hdmlnYXRpb24gYXhpcyB0byBzaWJsaW5nCisgICAgICAgIHNlbmRLZXlFdmVudCh3ZWJWaWV3LCBLZXlFdmVudC5LRVlDT0RFX0RQQURfUklHSFQsIE1FVEFfU1RBVEVfQUxUX0xFRlRfT04pOworICAgICAgICBhc3NlcnRTZWxlY3Rpb25TdHJpbmcoIjQiKTsgLy8gZXhwZWN0IHRoZSBzaWJsaW5nIG5hdmlnYXRpb24gYXhpcworCisgICAgICAgIC8vIGNoYW5nZSBuYXZpZ2F0aW9uIGF4aXMgdG8gcGFyZW50L2ZpcnN0IGNoaWxkCisgICAgICAgIHNlbmRLZXlFdmVudCh3ZWJWaWV3LCBLZXlFdmVudC5LRVlDT0RFX0RQQURfUklHSFQsIE1FVEFfU1RBVEVfQUxUX0xFRlRfT04pOworICAgICAgICBhc3NlcnRTZWxlY3Rpb25TdHJpbmcoIjUiKTsgLy8gZXhwZWN0IHRoZSBwYXJlbnQvZmlyc3QgY2hpbGQgbmF2aWdhdGlvbiBheGlzCisKKyAgICAgICAgLy8gZ28gdG8gdGhlIGZpcnN0IGNoaWxkIG9mIHRoZSBib2R5CisgICAgICAgIHNlbmRLZXlFdmVudCh3ZWJWaWV3LCBLZXlFdmVudC5LRVlDT0RFX0RQQURfRE9XTiwgMCk7CisgICAgICAgIGFzc2VydFNlbGVjdGlvblN0cmluZygiPGgxPkhlYWRpbmcgb25lPC9oMT4iKTsKKworICAgICAgICAvLyBjaGFuZ2UgbmF2aWdhdGlvbiBheGlzIHRvIHNpYmxpbmcKKyAgICAgICAgc2VuZEtleUV2ZW50KHdlYlZpZXcsIEtleUV2ZW50LktFWUNPREVfRFBBRF9MRUZULCBNRVRBX1NUQVRFX0FMVF9MRUZUX09OKTsKKyAgICAgICAgYXNzZXJ0U2VsZWN0aW9uU3RyaW5nKCI0Iik7IC8vIGV4cGVjdCB0aGUgc2libGluZyBuYXZpZ2F0aW9uIGF4aXMKKworICAgICAgICAvLyBnbyB0byB0aGUgbmV4dCBzaWJsaW5nCisgICAgICAgIHNlbmRLZXlFdmVudCh3ZWJWaWV3LCBLZXlFdmVudC5LRVlDT0RFX0RQQURfRE9XTiwgMCk7CisgICAgICAgIGFzc2VydFNlbGVjdGlvblN0cmluZygiPHA+VGhpcyBpcyBzb21lIHRleHQ8L3A+Iik7CisKKyAgICAgICAgLy8gZ28gdG8gdGhlIG5leHQgc2libGluZworICAgICAgICBzZW5kS2V5RXZlbnQod2ViVmlldywgS2V5RXZlbnQuS0VZQ09ERV9EUEFEX0RPV04sIDApOworICAgICAgICBhc3NlcnRTZWxlY3Rpb25TdHJpbmcoIjxkaXY+PGJ1dHRvbj5JbnB1dDwvYnV0dG9uPjwvZGl2PiIpOworCisgICAgICAgIC8vIHRyeSB0byBnbyBwYXN0IHRoZSBsYXN0IHNpYmxpbmcKKyAgICAgICAgc2VuZEtleUV2ZW50KHdlYlZpZXcsIEtleUV2ZW50LktFWUNPREVfRFBBRF9ET1dOLCAwKTsKKyAgICAgICAgYXNzZXJ0U2VsZWN0aW9uU3RyaW5nKG51bGwpOworCisgICAgICAgIC8vIGdvIHRvIHRoZSBwcmV2aW91cyBzaWJsaW5nIChyZXZlcnNlKQorICAgICAgICBzZW5kS2V5RXZlbnQod2ViVmlldywgS2V5RXZlbnQuS0VZQ09ERV9EUEFEX1VQLCAwKTsKKyAgICAgICAgYXNzZXJ0U2VsZWN0aW9uU3RyaW5nKCI8cD5UaGlzIGlzIHNvbWUgdGV4dDwvcD4iKTsKKworICAgICAgICAvLyBnbyB0byB0aGUgcHJldmlvdXMgc2libGluZworICAgICAgICBzZW5kS2V5RXZlbnQod2ViVmlldywgS2V5RXZlbnQuS0VZQ09ERV9EUEFEX1VQLCAwKTsKKyAgICAgICAgYXNzZXJ0U2VsZWN0aW9uU3RyaW5nKCI8aDE+SGVhZGluZyBvbmU8L2gxPiIpOworCisgICAgICAgIC8vIHRyeSB0byBnbyBiZWZvcmUgdGhlIHByZXZpb3VzIHNpYmxpbmcKKyAgICAgICAgc2VuZEtleUV2ZW50KHdlYlZpZXcsIEtleUV2ZW50LktFWUNPREVfRFBBRF9VUCwgMCk7CisgICAgICAgIGFzc2VydFNlbGVjdGlvblN0cmluZyhudWxsKTsKKworICAgICAgICAvLyBnbyB0byB0aGUgbmV4dCBzaWJsaW5nIChyZXZlcnNlIGFnYWluKQorICAgICAgICBzZW5kS2V5RXZlbnQod2ViVmlldywgS2V5RXZlbnQuS0VZQ09ERV9EUEFEX0RPV04sIDApOworICAgICAgICBhc3NlcnRTZWxlY3Rpb25TdHJpbmcoIjxwPlRoaXMgaXMgc29tZSB0ZXh0PC9wPiIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3RzIG5hdmlnYXRpb24gYnkgcGFyZW50L2ZpcnN0IGNoaWxkLgorICAgICAqLworICAgIEBMYXJnZVRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TmF2aWdhdGlvbkJ5UGFyZW50Rmlyc3RDaGlsZCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICAvLyBhIGJpdCB1Z2x5IGJ1dCBoZWxwcyBkZXRlY3QgYmVnaW5uaW5nIGFuZCBlbmQgb2YgYWxsIHRlc3RzIHNvIGFjY2Vzc2liaWxpdHkKKyAgICAgICAgLy8gYW5kIHRoZSBtb2NrIHNlcnZpY2UgYXJlIG5vdCB0b2dnbGVkIG9uIGV2ZXJ5IHRlc3QgKGV4cGVuc2l2ZSkKKyAgICAgICAgc0V4ZWN1dGVkVGVzdENvdW50Kys7CisKKyAgICAgICAgU3RyaW5nIGh0bWwgPQorICAgICAgICAgICAgIjwhRE9DVFlQRSBodG1sPiIgKworICAgICAgICAgICAgIjxodG1sPiIgKworICAgICAgICAgICAgICAiPGhlYWQ+IiArCisgICAgICAgICAgICAgICI8L2hlYWQ+IiArCisgICAgICAgICAgICAgICI8Ym9keT4iICsKKyAgICAgICAgICAgICAgICAiPGRpdj4iICsKKyAgICAgICAgICAgICAgICAgICI8YnV0dG9uPklucHV0PC9idXR0b24+IiArCisgICAgICAgICAgICAgICAgIjwvZGl2PiIgKworICAgICAgICAgICAgICAiPC9ib2R5PiIgKworICAgICAgICAgICAgIjwvaHRtbD4iOworCisgICAgICAgIFdlYlZpZXcgd2ViVmlldyA9IGNyZWF0ZVdlYlZld1dpdGhIdG1sKGh0bWwpOworCisgICAgICAgIC8vIGNoYW5nZSBuYXZpZ2F0aW9uIGF4aXMgdG8gZG9jdW1lbnQKKyAgICAgICAgc2VuZEtleUV2ZW50KHdlYlZpZXcsIEtleUV2ZW50LktFWUNPREVfRFBBRF9MRUZULCBNRVRBX1NUQVRFX0FMVF9MRUZUX09OKTsKKyAgICAgICAgYXNzZXJ0U2VsZWN0aW9uU3RyaW5nKCI2Iik7IC8vIGV4cGVjdCB0aGUgZG9jdW1lbnQgbmF2aWdhdGlvbiBheGlzCisKKyAgICAgICAgLy8gY2hhbmdlIG5hdmlnYXRpb24gYXhpcyB0byBwYXJlbnQvZmlyc3QgY2hpbGQKKyAgICAgICAgc2VuZEtleUV2ZW50KHdlYlZpZXcsIEtleUV2ZW50LktFWUNPREVfRFBBRF9MRUZULCBNRVRBX1NUQVRFX0FMVF9MRUZUX09OKTsKKyAgICAgICAgYXNzZXJ0U2VsZWN0aW9uU3RyaW5nKCI1Iik7IC8vIGV4cGVjdCB0aGUgcGFyZW50L2ZpcnN0IGNoaWxkIG5hdmlnYXRpb24gYXhpcworCisgICAgICAgIC8vIGdvIHRvIHRoZSBmaXJzdCBjaGlsZAorICAgICAgICBzZW5kS2V5RXZlbnQod2ViVmlldywgS2V5RXZlbnQuS0VZQ09ERV9EUEFEX0RPV04sIDApOworICAgICAgICBhc3NlcnRTZWxlY3Rpb25TdHJpbmcoIjxkaXY+PGJ1dHRvbj5JbnB1dDwvYnV0dG9uPjwvZGl2PiIpOworCisgICAgICAgIC8vIGdvIHRvIHRoZSBmaXJzdCBjaGlsZAorICAgICAgICBzZW5kS2V5RXZlbnQod2ViVmlldywgS2V5RXZlbnQuS0VZQ09ERV9EUEFEX0RPV04sIDApOworICAgICAgICBhc3NlcnRTZWxlY3Rpb25TdHJpbmcoIjxidXR0b24+SW5wdXQ8L2J1dHRvbj4iKTsKKworICAgICAgICAvLyB0cnkgdG8gZ28gdG8gdGhlIGZpcnN0IGNoaWxkIG9mIGEgbGVhZiBlbGVtZW50CisgICAgICAgIHNlbmRLZXlFdmVudCh3ZWJWaWV3LCBLZXlFdmVudC5LRVlDT0RFX0RQQURfRE9XTiwgMCk7CisgICAgICAgIGFzc2VydFNlbGVjdGlvblN0cmluZyhudWxsKTsKKworICAgICAgICAvLyBnbyB0byB0aGUgcGFyZW50IChyZXZlcnNlKQorICAgICAgICBzZW5kS2V5RXZlbnQod2ViVmlldywgS2V5RXZlbnQuS0VZQ09ERV9EUEFEX1VQLCAwKTsKKyAgICAgICAgYXNzZXJ0U2VsZWN0aW9uU3RyaW5nKCI8ZGl2PjxidXR0b24+SW5wdXQ8L2J1dHRvbj48L2Rpdj4iKTsKKworICAgICAgICAvLyBnbyB0byB0aGUgcGFyZW50CisgICAgICAgIHNlbmRLZXlFdmVudCh3ZWJWaWV3LCBLZXlFdmVudC5LRVlDT0RFX0RQQURfVVAsIDApOworICAgICAgICBhc3NlcnRTZWxlY3Rpb25TdHJpbmcoIjxib2R5PjxkaXY+PGJ1dHRvbj5JbnB1dDwvYnV0dG9uPjwvZGl2PjwvYm9keT4iKTsKKworICAgICAgICAvLyB0cnkgdG8gZ28gdG8gdGhlIGJvZHkgcGFyZW50CisgICAgICAgIHNlbmRLZXlFdmVudCh3ZWJWaWV3LCBLZXlFdmVudC5LRVlDT0RFX0RQQURfVVAsIDApOworICAgICAgICBhc3NlcnRTZWxlY3Rpb25TdHJpbmcobnVsbCk7CisKKyAgICAgICAgLy8gZ28gdG8gdGhlIGZpcnN0IGNoaWxkIChyZXZlcnNlIGFnYWluKQorICAgICAgICBzZW5kS2V5RXZlbnQod2ViVmlldywgS2V5RXZlbnQuS0VZQ09ERV9EUEFEX0RPV04sIDApOworICAgICAgICBhc3NlcnRTZWxlY3Rpb25TdHJpbmcoIjxkaXY+PGJ1dHRvbj5JbnB1dDwvYnV0dG9uPjwvZGl2PiIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3RzIG5hdmlnYXRpb24gYnkgZG9jdW1lbnQuCisgICAgICovCisgICAgQExhcmdlVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3ROYXZpZ2F0aW9uQnlEb2N1bWVudCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICAvLyBhIGJpdCB1Z2x5IGJ1dCBoZWxwcyBkZXRlY3QgYmVnaW5uaW5nIGFuZCBlbmQgb2YgYWxsIHRlc3RzIHNvIGFjY2Vzc2liaWxpdHkKKyAgICAgICAgLy8gYW5kIHRoZSBtb2NrIHNlcnZpY2UgYXJlIG5vdCB0b2dnbGVkIG9uIGV2ZXJ5IHRlc3QgKGV4cGVuc2l2ZSkKKyAgICAgICAgc0V4ZWN1dGVkVGVzdENvdW50Kys7CisKKyAgICAgICAgU3RyaW5nIGh0bWwgPQorICAgICAgICAgICAgIjwhRE9DVFlQRSBodG1sPiIgKworICAgICAgICAgICAgIjxodG1sPiIgKworICAgICAgICAgICAgICAiPGhlYWQ+IiArCisgICAgICAgICAgICAgICI8L2hlYWQ+IiArCisgICAgICAgICAgICAgICI8Ym9keT4iICsKKyAgICAgICAgICAgICAgICAiPGJ1dHRvbj5DbGljazwvYnV0dG9uPiIgKworICAgICAgICAgICAgICAiPC9ib2R5PiIgKworICAgICAgICAgICAgIjwvaHRtbD4iOworCisgICAgICAgIFdlYlZpZXcgd2ViVmlldyA9IGNyZWF0ZVdlYlZld1dpdGhIdG1sKGh0bWwpOworCisgICAgICAgIC8vIGNoYW5nZSBuYXZpZ2F0aW9uIGF4aXMgdG8gZG9jdW1lbnQKKyAgICAgICAgc2VuZEtleUV2ZW50KHdlYlZpZXcsIEtleUV2ZW50LktFWUNPREVfRFBBRF9MRUZULCBNRVRBX1NUQVRFX0FMVF9MRUZUX09OKTsKKyAgICAgICAgYXNzZXJ0U2VsZWN0aW9uU3RyaW5nKCI2Iik7IC8vIGV4cGVjdCB0aGUgZG9jdW1lbnQgbmF2aWdhdGlvbiBheGlzCisKKyAgICAgICAgLy8gZ28gdG8gdGhlIGJvdHRvbSBvZiB0aGUgZG9jdW1lbnQKKyAgICAgICAgc2VuZEtleUV2ZW50KHdlYlZpZXcsIEtleUV2ZW50LktFWUNPREVfRFBBRF9ET1dOLCAwKTsKKyAgICAgICAgYXNzZXJ0U2VsZWN0aW9uU3RyaW5nKCJDbGljayIpOworCisgICAgICAgIC8vIGdvIHRvIHRoZSB0b3Agb2YgdGhlIGRvY3VtZW50IChyZXZlcnNlKQorICAgICAgICBzZW5kS2V5RXZlbnQod2ViVmlldywgS2V5RXZlbnQuS0VZQ09ERV9EUEFEX1VQLCAwKTsKKyAgICAgICAgYXNzZXJ0U2VsZWN0aW9uU3RyaW5nKCI8Ym9keT48YnV0dG9uPkNsaWNrPC9idXR0b24+PC9ib2R5PiIpOworCisgICAgICAgIC8vIGdvIHRvIHRoZSBib3R0b20gb2YgdGhlIGRvY3VtZW50IChyZXZlcnNlIGFnYWluKQorICAgICAgICBzZW5kS2V5RXZlbnQod2ViVmlldywgS2V5RXZlbnQuS0VZQ09ERV9EUEFEX0RPV04sIDApOworICAgICAgICBhc3NlcnRTZWxlY3Rpb25TdHJpbmcoIkNsaWNrIik7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdHMgdGhlIHN5bmMgYmV0d2VlbiB0aGUgdGV4dCBuYXZpZ2F0aW9uIGFuZCBuYXZpZ2F0aW9uIGJ5IERPTSBlbGVtZW50cy4KKyAgICAgKi8KKyAgICBATGFyZ2VUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFN5bmNCZXR3ZWVuVGV4dEFuZERvbU5vZGVOYXZpZ2F0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIC8vIGEgYml0IHVnbHkgYnV0IGhlbHBzIGRldGVjdCBiZWdpbm5pbmcgYW5kIGVuZCBvZiBhbGwgdGVzdHMgc28gYWNjZXNzaWJpbGl0eQorICAgICAgICAvLyBhbmQgdGhlIG1vY2sgc2VydmljZSBhcmUgbm90IHRvZ2dsZWQgb24gZXZlcnkgdGVzdCAoZXhwZW5zaXZlKQorICAgICAgICBzRXhlY3V0ZWRUZXN0Q291bnQrKzsKKworICAgICAgICBTdHJpbmcgaHRtbCA9CisgICAgICAgICAgICAiPCFET0NUWVBFIGh0bWw+IiArCisgICAgICAgICAgICAiPGh0bWw+IiArCisgICAgICAgICAgICAgICI8aGVhZD4iICsKKyAgICAgICAgICAgICAgIjwvaGVhZD4iICsKKyAgICAgICAgICAgICAgIjxib2R5PiIgKworICAgICAgICAgICAgICAgICI8cD4iICsKKyAgICAgICAgICAgICAgICAgICJGaXJzdCIgKworICAgICAgICAgICAgICAgICI8L3A+IiArCisgICAgICAgICAgICAgICAgIjxidXR0b24+U2Vjb25kPC9idXR0b24+IiArCisgICAgICAgICAgICAgICAgIjxwPiIgKworICAgICAgICAgICAgICAgICAgIlRoaXJkIiArCisgICAgICAgICAgICAgICAgIjwvcD4iICsKKyAgICAgICAgICAgICAgIjwvYm9keT4iICsKKyAgICAgICAgICAgICI8L2h0bWw+IjsKKworICAgICAgICBXZWJWaWV3IHdlYlZpZXcgPSBjcmVhdGVXZWJWZXdXaXRoSHRtbChodG1sKTsKKworICAgICAgICAvLyBjaGFuZ2UgbmF2aWdhdGlvbiBheGlzIHRvIHdvcmQKKyAgICAgICAgc2VuZEtleUV2ZW50KHdlYlZpZXcsIEtleUV2ZW50LktFWUNPREVfRFBBRF9ET1dOLCBNRVRBX1NUQVRFX0FMVF9MRUZUX09OKTsKKyAgICAgICAgYXNzZXJ0U2VsZWN0aW9uU3RyaW5nKCIxIik7IC8vIGV4cGVjdCB0aGUgd29yZCBuYXZpZ2F0aW9uIGF4aXMKKworICAgICAgICAvLyBnbyB0byB0aGUgZmlyc3Qgd29yZAorICAgICAgICBzZW5kS2V5RXZlbnQod2ViVmlldywgS2V5RXZlbnQuS0VZQ09ERV9EUEFEX0RPV04sIDApOworICAgICAgICBhc3NlcnRTZWxlY3Rpb25TdHJpbmcoIkZpcnN0Iik7CisKKyAgICAgICAgLy8gY2hhbmdlIG5hdmlnYXRpb24gYXhpcyB0byBoZWFkaW5nCisgICAgICAgIHNlbmRLZXlFdmVudCh3ZWJWaWV3LCBLZXlFdmVudC5LRVlDT0RFX0RQQURfUklHSFQsIE1FVEFfU1RBVEVfQUxUX0xFRlRfT04pOworICAgICAgICBhc3NlcnRTZWxlY3Rpb25TdHJpbmcoIjMiKTsgLy8gZXhwZWN0IHRoZSBoZWFkaW5nIG5hdmlnYXRpb24gYXhpcworCisgICAgICAgIC8vIGNoYW5nZSBuYXZpZ2F0aW9uIGF4aXMgdG8gc2libGluZworICAgICAgICBzZW5kS2V5RXZlbnQod2ViVmlldywgS2V5RXZlbnQuS0VZQ09ERV9EUEFEX1JJR0hULCBNRVRBX1NUQVRFX0FMVF9MRUZUX09OKTsKKyAgICAgICAgYXNzZXJ0U2VsZWN0aW9uU3RyaW5nKCI0Iik7IC8vIGV4cGVjdCB0aGUgc2libGluZyBuYXZpZ2F0aW9uIGF4aXMKKworICAgICAgICAvLyBnbyB0byB0aGUgbmV4dCBzaWJsaW5nCisgICAgICAgIHNlbmRLZXlFdmVudCh3ZWJWaWV3LCBLZXlFdmVudC5LRVlDT0RFX0RQQURfRE9XTiwgMCk7CisgICAgICAgIGFzc2VydFNlbGVjdGlvblN0cmluZygiPGJ1dHRvbj5TZWNvbmQ8L2J1dHRvbj4iKTsKKworICAgICAgICAvLyBjaGFuZ2UgbmF2aWdhdGlvbiBheGlzIHRvIGNoYXJhY3RlcgorICAgICAgICBzZW5kS2V5RXZlbnQod2ViVmlldywgS2V5RXZlbnQuS0VZQ09ERV9EUEFEX1VQLCBNRVRBX1NUQVRFX0FMVF9MRUZUX09OKTsKKyAgICAgICAgYXNzZXJ0U2VsZWN0aW9uU3RyaW5nKCIwIik7IC8vIGV4cGVjdCB0aGUgY2hhcmFjdGVyIG5hdmlnYXRpb24gYXhpcworCisgICAgICAgIC8vIGNoYW5nZSBuYXZpZ2F0aW9uIGF4aXMgdG8gd29yZAorICAgICAgICBzZW5kS2V5RXZlbnQod2ViVmlldywgS2V5RXZlbnQuS0VZQ09ERV9EUEFEX1VQLCBNRVRBX1NUQVRFX0FMVF9MRUZUX09OKTsKKyAgICAgICAgYXNzZXJ0U2VsZWN0aW9uU3RyaW5nKCIxIik7IC8vIGV4cGVjdCB0aGUgd29yZCBuYXZpZ2F0aW9uIGF4aXMKKworICAgICAgICAvLyBnbyB0byB0aGUgbmV4dCB3b3JkCisgICAgICAgIHNlbmRLZXlFdmVudCh3ZWJWaWV3LCBLZXlFdmVudC5LRVlDT0RFX0RQQURfRE9XTiwgMCk7CisgICAgICAgIGFzc2VydFNlbGVjdGlvblN0cmluZygiVGhpcmQiKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBFbmFibGUgYWNjZXNzaWJpbGl0eSBhbmQgdGhlIG1vY2sgYWNjZXNzaWJpbGl0eSBzZXJ2aWNlLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBlbmFibGVBY2Nlc3NpYmlsaXR5QW5kTW9ja0FjY2Vzc2liaWxpdHlTZXJ2aWNlKCkgeworICAgICAgICAvLyBtYWtlIHN1cmUgdGhlIG1hbmFnZXIgaXMgaW5zdGFudGlhdGVkIHNvIHRoZSBzeXN0ZW0gaW5pdGlhbGl6ZXMgaXQKKyAgICAgICAgQWNjZXNzaWJpbGl0eU1hbmFnZXIuZ2V0SW5zdGFuY2UoZ2V0Q29udGV4dCgpKTsKKworICAgICAgICAvLyBlbmFibGUgYWNjZXNzaWJpbGl0eSBhbmQgdGhlIG1vY2sgYWNjZXNzaWJpbGl0eSBzZXJ2aWNlCisgICAgICAgIFNldHRpbmdzLlNlY3VyZS5wdXRJbnQoZ2V0Q29udGV4dCgpLmdldENvbnRlbnRSZXNvbHZlcigpLAorICAgICAgICAgICAgICAgIFNldHRpbmdzLlNlY3VyZS5BQ0NFU1NJQklMSVRZX0VOQUJMRUQsIDEpOworICAgICAgICBTdHJpbmcgZW5hYmxlZFNlcnZpY2VzID0gbmV3IENvbXBvbmVudE5hbWUoZ2V0Q29udGV4dCgpLmdldFBhY2thZ2VOYW1lKCksCisgICAgICAgICAgICAgICAgTW9ja0FjY2Vzc2liaWxpdHlTZXJ2aWNlLmNsYXNzLmdldE5hbWUoKSkuZmxhdHRlblRvU2hvcnRTdHJpbmcoKTsKKyAgICAgICAgU2V0dGluZ3MuU2VjdXJlLnB1dFN0cmluZyhnZXRDb250ZXh0KCkuZ2V0Q29udGVudFJlc29sdmVyKCksCisgICAgICAgICAgICAgICAgU2V0dGluZ3MuU2VjdXJlLkVOQUJMRURfQUNDRVNTSUJJTElUWV9TRVJWSUNFUywgZW5hYmxlZFNlcnZpY2VzKTsKKworICAgICAgICAvLyBwb2xsIHdpdGhpbiBhIHRpbWVvdXQgYW5kIGxldCBiZSBpbnRlcnJ1cHRlZCBpbiBjYXNlIG9mIHN1Y2Nlc3MKKyAgICAgICAgbG9uZyBpbmNyZW1lbnRTdGVwID0gVElNRU9VVF9FTkFCTEVfQUNDRVNTSUJJTElUWV9BTkRfTU9DS19TRVJWSUNFIC8gNTsKKyAgICAgICAgbG9uZyBzdGFydCA9IFN5c3RlbUNsb2NrLnVwdGltZU1pbGxpcygpOworICAgICAgICB3aGlsZSAoU3lzdGVtQ2xvY2sudXB0aW1lTWlsbGlzKCkgLSBzdGFydCA8IFRJTUVPVVRfRU5BQkxFX0FDQ0VTU0lCSUxJVFlfQU5EX01PQ0tfU0VSVklDRSAmJgorICAgICAgICAgICAgICAgICFzSXNBY2Nlc3NpYmlsaXR5U2VydmljZVJlYWR5KSB7CisgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKHNUZXN0TG9jaykgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIHNUZXN0TG9jay53YWl0KGluY3JlbWVudFN0ZXApOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGllKSB7CisgICAgICAgICAgICAgICAgICAgIC8qIGlnbm9yZSAqLworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmICghc0lzQWNjZXNzaWJpbGl0eVNlcnZpY2VSZWFkeSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiTW9ja0FjY2Vzc2liaWxpdHlTZXJ2aWNlIG5vdCByZWFkeS4gRGlkIHlvdSBhZGQgIiArCisgICAgICAgICAgICAgICAgICAgICJ0ZXN0cyBhbmQgZm9yZ290IHRvIHVwZGF0ZSBBY2Nlc3NpYmlsaXR5SW5qZWN0b3JUZXN0I1RFU1RfQ0FTRV9DT1VOVD8iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIHNjcnViQ2xhc3MoQ2xhc3M8Pz4gdGVzdENhc2VDbGFzcykgeworICAgICAgICAvKiBkbyBub3RoaW5nIC0gYXZvaWQgc3VwZXJjbGFzcyBiZWhhdmlvciAqLworICAgIH0KKworICAgIC8qKgorICAgICAqIERpc2FibGVzIGFjY2Vzc2liaWxpdHkgYW5kIHRoZSBtb2NrIGFjY2Vzc2liaWxpdHkgc2VydmljZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgZGlzYWJsZUFjY2Vzc2liaWxpdHlBbmRNb2NrQWNjZXNzaWJpbGl0eVNlcnZpY2UoKSB7CisgICAgICAgIC8vIGRpc2FibGUgYWNjZXNzaWJpbGl0eSBhbmQgdGhlIG1vY2sgYWNjZXNzaWJpbGl0eSBzZXJ2aWNlCisgICAgICAgIFNldHRpbmdzLlNlY3VyZS5wdXRJbnQoZ2V0Q29udGV4dCgpLmdldENvbnRlbnRSZXNvbHZlcigpLAorICAgICAgICAgICAgICAgIFNldHRpbmdzLlNlY3VyZS5BQ0NFU1NJQklMSVRZX0VOQUJMRUQsIDApOworICAgICAgICBTZXR0aW5ncy5TZWN1cmUucHV0U3RyaW5nKGdldENvbnRleHQoKS5nZXRDb250ZW50UmVzb2x2ZXIoKSwKKyAgICAgICAgICAgICAgICBTZXR0aW5ncy5TZWN1cmUuRU5BQkxFRF9BQ0NFU1NJQklMSVRZX1NFUlZJQ0VTLCAiIik7CisgICAgfQorCisgICAgLyoqCisgICAgICogQXNzZXJ0cyB0aGUgbmV4dCA8Y29kZT5leHBlY3RlZFNlbGVjdGlvblN0cmluZzwvY29kZT4gdG8gYmUgcmVjZWl2ZWQuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIGFzc2VydFNlbGVjdGlvblN0cmluZyhTdHJpbmcgZXhwZWN0ZWRTZWxlY3Rpb25TdHJpbmcpIHsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiTW9ja0FjY2Vzc2liaWxpdHlTZXJ2aWNlIG5vdCByZWFkeSIsIHNJc0FjY2Vzc2liaWxpdHlTZXJ2aWNlUmVhZHkpOworCisgICAgICAgIGxvbmcgaW5jcmVtZW50U3RlcCA9IFRJTUVPVVRfV0FJVF9GT1JfU0VMRUNUSU9OX1NUUklORyAvIDU7CisgICAgICAgIGxvbmcgc3RhcnQgPSBTeXN0ZW1DbG9jay51cHRpbWVNaWxsaXMoKTsKKyAgICAgICAgd2hpbGUgKFN5c3RlbUNsb2NrLnVwdGltZU1pbGxpcygpIC0gc3RhcnQgPCBUSU1FT1VUX1dBSVRfRk9SX1NFTEVDVElPTl9TVFJJTkcgJiYKKyAgICAgICAgICAgICAgICBzUmVjZWl2ZWRTZWxlY3Rpb25TdHJpbmcgPT0gU0VMRUNUSU9OX1NUUklOR19VTktOT1dOKSB7CisgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKHNUZXN0TG9jaykgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIHNUZXN0TG9jay53YWl0KGluY3JlbWVudFN0ZXApOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGllKSB7CisgICAgICAgICAgICAgICAgICAgIC8qIGlnbm9yZSAqLworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICB0cnkgeworICAgICAgICAgICAgaWYgKHNSZWNlaXZlZFNlbGVjdGlvblN0cmluZyA9PSBTRUxFQ1RJT05fU1RSSU5HX1VOS05PV04pIHsKKyAgICAgICAgICAgICAgICBmYWlsKCJObyBzZWxlY3Rpb24gc3RyaW5nIHJlY2VpdmVkLiBFeHBlY3RlZDogIiArIGV4cGVjdGVkU2VsZWN0aW9uU3RyaW5nKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhleHBlY3RlZFNlbGVjdGlvblN0cmluZywgc1JlY2VpdmVkU2VsZWN0aW9uU3RyaW5nKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIHNSZWNlaXZlZFNlbGVjdGlvblN0cmluZyA9IFNFTEVDVElPTl9TVFJJTkdfVU5LTk9XTjsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFNlbmRzIGEge0BsaW5rIEtleUV2ZW50fSAodXAgYW5kIGRvd24pIHRvIHRoZSB7QGxpbmsgV2ViVmlld30uCisgICAgICoKKyAgICAgKiBAcGFyYW0ga2V5Q29kZSBUaGUgZXZlbnQga2V5IGNvZGUuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIHNlbmRLZXlFdmVudChXZWJWaWV3IHdlYlZpZXcsIGludCBrZXlDb2RlLCBpbnQgbWV0YVN0YXRlKSB7CisgICAgICAgIHdlYlZpZXcub25LZXlEb3duKGtleUNvZGUsIG5ldyBLZXlFdmVudCgwLCAwLCBLZXlFdmVudC5BQ1RJT05fRE9XTiwga2V5Q29kZSwgMSwgbWV0YVN0YXRlKSk7CisgICAgICAgIHdlYlZpZXcub25LZXlVcChrZXlDb2RlLCBuZXcgS2V5RXZlbnQoMCwgMCwgS2V5RXZlbnQuQUNUSU9OX1VQLCBrZXlDb2RlLCAxLCBtZXRhU3RhdGUpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEge0BsaW5rIFdlYlZpZXd9IHdpdGggd2l0aCBhIGdpdmVuIEhUTUwgY29udGVudC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBodG1sIFRoZSBIVE1MIGNvbnRlbnQ7CisgICAgICogQHJldHVybiBUaGUgY3JlYXRlZCB2aWV3LgorICAgICAqLworICAgIHByaXZhdGUgV2ViVmlldyBjcmVhdGVXZWJWZXdXaXRoSHRtbChmaW5hbCBTdHJpbmcgaHRtbCkgeworICAgICAgICBtV29ya2VyLmdldEhhbmRsZXIoKS5wb3N0KG5ldyBSdW5uYWJsZSgpIHsKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICBtV2ViVmlldyA9IG5ldyBXZWJWaWV3KGdldENvbnRleHQoKSk7CisgICAgICAgICAgICAgICAgbVdlYlZpZXcubG9hZERhdGEoaHRtbCwgInRleHQvaHRtbCIsICJ1dGYtOCIpOworICAgICAgICAgICAgICAgIG1XZWJWaWV3LnNldFdlYlZpZXdDbGllbnQobmV3IFdlYlZpZXdDbGllbnQoKSB7CisgICAgICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBvblBhZ2VGaW5pc2hlZChXZWJWaWV3IHZpZXcsIFN0cmluZyB1cmwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1Xb3JrZXIuZ2V0SGFuZGxlcigpLnBvc3QobmV3IFJ1bm5hYmxlKCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3luY2hyb25pemVkIChzVGVzdExvY2spIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNUZXN0TG9jay5ub3RpZnlBbGwoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworICAgICAgICBzeW5jaHJvbml6ZWQgKHNUZXN0TG9jaykgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBzVGVzdExvY2sud2FpdCgpOworICAgICAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gaWUpIHsKKyAgICAgICAgICAgICAgICAvKiBpZ25vcmUgKi8KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbVdlYlZpZXc7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhpcyBpcyBhIHdvcmtlciB0aHJlYWQgcmVzcG9uc2libGUgZm9yIGNyZWF0aW5nIHRoZSB7QGxpbmsgV2ViVmlld30uCisgICAgICovCisgICAgcHJpdmF0ZSBjbGFzcyBXb3JrZXIgaW1wbGVtZW50cyBSdW5uYWJsZSB7CisgICAgICAgIHByaXZhdGUgZmluYWwgT2JqZWN0IG1Xb3JrZXJMb2NrID0gbmV3IE9iamVjdCgpOworICAgICAgICBwcml2YXRlIEhhbmRsZXIgbUhhbmRsZXI7CisKKyAgICAgICBwdWJsaWMgV29ya2VyKCkgeworICAgICAgICAgICAgbmV3IFRocmVhZCh0aGlzKS5zdGFydCgpOworICAgICAgICAgICAgc3luY2hyb25pemVkIChtV29ya2VyTG9jaykgeworICAgICAgICAgICAgICAgIHdoaWxlIChtSGFuZGxlciA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtV29ya2VyTG9jay53YWl0KCk7CisgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvKiBpZ25vcmUgKi8KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgIHN5bmNocm9uaXplZCAobVdvcmtlckxvY2spIHsKKyAgICAgICAgICAgICAgICBMb29wZXIucHJlcGFyZSgpOworICAgICAgICAgICAgICAgIG1IYW5kbGVyID0gbmV3IEhhbmRsZXIoKTsKKyAgICAgICAgICAgICAgICBtV29ya2VyTG9jay5ub3RpZnlBbGwoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIExvb3Blci5sb29wKCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgSGFuZGxlciBnZXRIYW5kbGVyKCkgeworICAgICAgICAgICAgcmV0dXJuIG1IYW5kbGVyOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgc3RvcCgpIHsKKyAgICAgICAgICAgIG1IYW5kbGVyLmdldExvb3BlcigpLnF1aXQoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIE1vY2sgYWNjZXNzaWJpbGl0eSBzZXJ2aWNlIHRvIHJlY2VpdmUgdGhlIGFjY2Vzc2liaWxpdHkgZXZlbnRzCisgICAgICogd2l0aCB0aGUgY3VycmVudCB7QGxpbmsgV2ViVmlld30gc2VsZWN0aW9uLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgTW9ja0FjY2Vzc2liaWxpdHlTZXJ2aWNlIGV4dGVuZHMgQWNjZXNzaWJpbGl0eVNlcnZpY2UgeworICAgICAgICBwcml2YXRlIGJvb2xlYW4gbUlzU2VydmljZUluZm9TZXQ7CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHByb3RlY3RlZCB2b2lkIG9uU2VydmljZUNvbm5lY3RlZCgpIHsKKyAgICAgICAgICAgIGlmIChtSXNTZXJ2aWNlSW5mb1NldCkgeworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEFjY2Vzc2liaWxpdHlTZXJ2aWNlSW5mbyBpbmZvID0gbmV3IEFjY2Vzc2liaWxpdHlTZXJ2aWNlSW5mbygpOworICAgICAgICAgICAgaW5mby5ldmVudFR5cGVzID0gQWNjZXNzaWJpbGl0eUV2ZW50LlRZUEVfVklFV19TRUxFQ1RFRDsKKyAgICAgICAgICAgIGluZm8uZmVlZGJhY2tUeXBlID0gQWNjZXNzaWJpbGl0eVNlcnZpY2VJbmZvLkZFRURCQUNLX0dFTkVSSUM7CisgICAgICAgICAgICBzZXRTZXJ2aWNlSW5mbyhpbmZvKTsKKyAgICAgICAgICAgIG1Jc1NlcnZpY2VJbmZvU2V0ID0gdHJ1ZTsKKworICAgICAgICAgICAgc0lzQWNjZXNzaWJpbGl0eVNlcnZpY2VSZWFkeSA9IHRydWU7CisKKyAgICAgICAgICAgIGlmIChzSW5zdGFuY2UgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHN5bmNocm9uaXplZCAoc1Rlc3RMb2NrKSB7CisgICAgICAgICAgICAgICAgc1Rlc3RMb2NrLm5vdGlmeUFsbCgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIG9uQWNjZXNzaWJpbGl0eUV2ZW50KEFjY2Vzc2liaWxpdHlFdmVudCBldmVudCkgeworICAgICAgICAgICAgaWYgKHNJbnN0YW5jZSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCFldmVudC5nZXRUZXh0KCkuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgQ2hhclNlcXVlbmNlIHRleHQgPSBldmVudC5nZXRUZXh0KCkuZ2V0KDApOworICAgICAgICAgICAgICAgIHNSZWNlaXZlZFNlbGVjdGlvblN0cmluZyA9ICh0ZXh0ICE9IG51bGwpID8gdGV4dC50b1N0cmluZygpIDogbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHN5bmNocm9uaXplZCAoc1Rlc3RMb2NrKSB7CisgICAgICAgICAgICAgICAgc1Rlc3RMb2NrLm5vdGlmeUFsbCgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIG9uSW50ZXJydXB0KCkgeworICAgICAgICAgICAgLyogZG8gbm90aGluZyAqLworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIG9uVW5iaW5kKEludGVudCBpbnRlbnQpIHsKKyAgICAgICAgICAgIHNJc0FjY2Vzc2liaWxpdHlTZXJ2aWNlUmVhZHkgPSBmYWxzZTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL3dlYmtpdC9ab29tTWFuYWdlclRlc3QuamF2YSBiL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL3dlYmtpdC9ab29tTWFuYWdlclRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYzlkZWZlCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvd2Via2l0L1pvb21NYW5hZ2VyVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTI3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2UgYW5kcm9pZC53ZWJraXQ7CisKK2ltcG9ydCBhbmRyb2lkLnRlc3QuQW5kcm9pZFRlc3RDYXNlOworCitwdWJsaWMgY2xhc3MgWm9vbU1hbmFnZXJUZXN0IGV4dGVuZHMgQW5kcm9pZFRlc3RDYXNlIHsKKworICAgIHByaXZhdGUgWm9vbU1hbmFnZXIgem9vbU1hbmFnZXI7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBzZXRVcCgpIHsKKyAgICAgICAgV2ViVmlldyB3ZWJWaWV3ID0gbmV3IFdlYlZpZXcodGhpcy5nZXRDb250ZXh0KCkpOworICAgICAgICBDYWxsYmFja1Byb3h5IGNhbGxiYWNrUHJveHkgPSBuZXcgQ2FsbGJhY2tQcm94eSh0aGlzLmdldENvbnRleHQoKSwgd2ViVmlldyk7CisgICAgICAgIHpvb21NYW5hZ2VyID0gbmV3IFpvb21NYW5hZ2VyKHdlYlZpZXcsIGNhbGxiYWNrUHJveHkpOworCisgICAgICAgIHpvb21NYW5hZ2VyLmluaXQoMS4wMGYpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RJbml0KCkgeworICAgICAgICB0ZXN0SW5pdCgwLjAxZik7CisgICAgICAgIHRlc3RJbml0KDEuMDBmKTsKKyAgICAgICAgdGVzdEluaXQoMS4yNWYpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCB0ZXN0SW5pdChmbG9hdCBkZW5zaXR5KSB7CisgICAgICAgIHpvb21NYW5hZ2VyLmluaXQoZGVuc2l0eSk7CisgICAgICAgIGFjdHVhbFNjYWxlVGVzdChkZW5zaXR5KTsKKyAgICAgICAgZGVmYXVsdFNjYWxlVGVzdChkZW5zaXR5KTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHpvb21NYW5hZ2VyLmdldERlZmF1bHRNYXhab29tU2NhbGUoKSwgem9vbU1hbmFnZXIuZ2V0TWF4Wm9vbVNjYWxlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoem9vbU1hbmFnZXIuZ2V0RGVmYXVsdE1pblpvb21TY2FsZSgpLCB6b29tTWFuYWdlci5nZXRNaW5ab29tU2NhbGUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhkZW5zaXR5LCB6b29tTWFuYWdlci5nZXRUZXh0V3JhcFNjYWxlKCkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RVcGRhdGVEZWZhdWx0Wm9vbURlbnNpdHkoKSB7CisgICAgICAgIC8vIHRlc3QgdGhlIGJhc2ljIGNhc2Ugd2hlcmUgdGhlIGFjdHVhbCB2YWx1ZXMgYXJlIGVxdWFsIHRvIHRoZSBkZWZhdWx0cworICAgICAgICB0ZXN0VXBkYXRlRGVmYXVsdFpvb21EZW5zaXR5KDAuMDFmKTsKKyAgICAgICAgdGVzdFVwZGF0ZURlZmF1bHRab29tRGVuc2l0eSgxLjAwZik7CisgICAgICAgIHRlc3RVcGRhdGVEZWZhdWx0Wm9vbURlbnNpdHkoMS4yNWYpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCB0ZXN0VXBkYXRlRGVmYXVsdFpvb21EZW5zaXR5KGZsb2F0IGRlbnNpdHkpIHsKKyAgICAgICAgem9vbU1hbmFnZXIudXBkYXRlRGVmYXVsdFpvb21EZW5zaXR5KGRlbnNpdHkpOworICAgICAgICBkZWZhdWx0U2NhbGVUZXN0KGRlbnNpdHkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RVcGRhdGVEZWZhdWx0Wm9vbURlbnNpdHlXaXRoU21hbGxNaW5ab29tKCkgeworICAgICAgICAvLyB0ZXN0IHRoZSBjYXNlIHdoZXJlIHRoZSBtaW5ab29tU2NhbGUgaGFzIGNoYW5nZWQgdG8gYmUgPCB0aGUgZGVmYXVsdAorICAgICAgICBmbG9hdCBuZXdEZWZhdWx0U2NhbGUgPSAxLjUwZjsKKyAgICAgICAgZmxvYXQgbWluWm9vbVNjYWxlID0gWm9vbU1hbmFnZXIuREVGQVVMVF9NSU5fWk9PTV9TQ0FMRV9GQUNUT1IgKiBuZXdEZWZhdWx0U2NhbGU7CisgICAgICAgIFdlYlZpZXdDb3JlLlZpZXdTdGF0ZSBtaW5WaWV3U3RhdGUgPSBuZXcgV2ViVmlld0NvcmUuVmlld1N0YXRlKCk7CisgICAgICAgIG1pblZpZXdTdGF0ZS5tTWluU2NhbGUgPSBtaW5ab29tU2NhbGUgLSAwLjFmOworICAgICAgICB6b29tTWFuYWdlci51cGRhdGVab29tUmFuZ2UobWluVmlld1N0YXRlLCAwLCAwKTsKKyAgICAgICAgem9vbU1hbmFnZXIudXBkYXRlRGVmYXVsdFpvb21EZW5zaXR5KG5ld0RlZmF1bHRTY2FsZSk7CisgICAgICAgIGRlZmF1bHRTY2FsZVRlc3QobmV3RGVmYXVsdFNjYWxlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlRGVmYXVsdFpvb21EZW5zaXR5V2l0aExhcmdlTWluWm9vbSgpIHsKKyAgICAgICAgLy8gdGVzdCB0aGUgY2FzZSB3aGVyZSB0aGUgbWluWm9vbVNjYWxlIGhhcyBjaGFuZ2VkIHRvIGJlID4gdGhlIGRlZmF1bHQKKyAgICAgICAgZmxvYXQgbmV3RGVmYXVsdFNjYWxlID0gMS41MGY7CisgICAgICAgIGZsb2F0IG1pblpvb21TY2FsZSA9IFpvb21NYW5hZ2VyLkRFRkFVTFRfTUlOX1pPT01fU0NBTEVfRkFDVE9SICogbmV3RGVmYXVsdFNjYWxlOworICAgICAgICBXZWJWaWV3Q29yZS5WaWV3U3RhdGUgbWluVmlld1N0YXRlID0gbmV3IFdlYlZpZXdDb3JlLlZpZXdTdGF0ZSgpOworICAgICAgICBtaW5WaWV3U3RhdGUubU1pblNjYWxlID0gbWluWm9vbVNjYWxlICsgMC4xZjsKKyAgICAgICAgem9vbU1hbmFnZXIudXBkYXRlWm9vbVJhbmdlKG1pblZpZXdTdGF0ZSwgMCwgMCk7CisgICAgICAgIHpvb21NYW5hZ2VyLnVwZGF0ZURlZmF1bHRab29tRGVuc2l0eShuZXdEZWZhdWx0U2NhbGUpOworICAgICAgICBkZWZhdWx0U2NhbGVUZXN0KG5ld0RlZmF1bHRTY2FsZSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFVwZGF0ZURlZmF1bHRab29tRGVuc2l0eVdpdGhTbWFsbE1heFpvb20oKSB7CisgICAgICAgIC8vIHRlc3QgdGhlIGNhc2Ugd2hlcmUgdGhlIG1heFpvb21TY2FsZSBoYXMgY2hhbmdlZCB0byBiZSA8IHRoZSBkZWZhdWx0CisgICAgICAgIGZsb2F0IG5ld0RlZmF1bHRTY2FsZSA9IDEuNTBmOworICAgICAgICBmbG9hdCBtYXhab29tU2NhbGUgPSBab29tTWFuYWdlci5ERUZBVUxUX01BWF9aT09NX1NDQUxFX0ZBQ1RPUiAqIG5ld0RlZmF1bHRTY2FsZTsKKyAgICAgICAgV2ViVmlld0NvcmUuVmlld1N0YXRlIG1heFZpZXdTdGF0ZSA9IG5ldyBXZWJWaWV3Q29yZS5WaWV3U3RhdGUoKTsKKyAgICAgICAgbWF4Vmlld1N0YXRlLm1NYXhTY2FsZSA9IG1heFpvb21TY2FsZSAtIDAuMWY7CisgICAgICAgIHpvb21NYW5hZ2VyLnVwZGF0ZVpvb21SYW5nZShtYXhWaWV3U3RhdGUsIDAsIDApOworICAgICAgICB6b29tTWFuYWdlci51cGRhdGVEZWZhdWx0Wm9vbURlbnNpdHkobmV3RGVmYXVsdFNjYWxlKTsKKyAgICAgICAgZGVmYXVsdFNjYWxlVGVzdChuZXdEZWZhdWx0U2NhbGUpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RVcGRhdGVEZWZhdWx0Wm9vbURlbnNpdHlXaXRoTGFyZ2VNYXhab29tKCkgeworICAgICAgICAvLyB0ZXN0IHRoZSBjYXNlIHdoZXJlIHRoZSBtYXhab29tU2NhbGUgaGFzIGNoYW5nZWQgdG8gYmUgPiB0aGUgZGVmYXVsdAorICAgICAgICBmbG9hdCBuZXdEZWZhdWx0U2NhbGUgPSAxLjUwZjsKKyAgICAgICAgZmxvYXQgbWF4Wm9vbVNjYWxlID0gWm9vbU1hbmFnZXIuREVGQVVMVF9NQVhfWk9PTV9TQ0FMRV9GQUNUT1IgKiBuZXdEZWZhdWx0U2NhbGU7CisgICAgICAgIFdlYlZpZXdDb3JlLlZpZXdTdGF0ZSBtYXhWaWV3U3RhdGUgPSBuZXcgV2ViVmlld0NvcmUuVmlld1N0YXRlKCk7CisgICAgICAgIG1heFZpZXdTdGF0ZS5tTWF4U2NhbGUgPSBtYXhab29tU2NhbGUgKyAwLjFmOworICAgICAgICB6b29tTWFuYWdlci51cGRhdGVab29tUmFuZ2UobWF4Vmlld1N0YXRlLCAwLCAwKTsKKyAgICAgICAgem9vbU1hbmFnZXIudXBkYXRlRGVmYXVsdFpvb21EZW5zaXR5KG5ld0RlZmF1bHRTY2FsZSk7CisgICAgICAgIGRlZmF1bHRTY2FsZVRlc3QobmV3RGVmYXVsdFNjYWxlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q29tcHV0ZVNjYWxlV2l0aExpbWl0cygpIHsKKyAgICAgICAgZmluYWwgZmxvYXQgbWF4U2NhbGUgPSB6b29tTWFuYWdlci5nZXRNYXhab29tU2NhbGUoKTsKKyAgICAgICAgZmluYWwgZmxvYXQgbWluU2NhbGUgPSB6b29tTWFuYWdlci5nZXRNaW5ab29tU2NhbGUoKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShtYXhTY2FsZSA+IG1pblNjYWxlKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKG1heFNjYWxlLCB6b29tTWFuYWdlci5jb21wdXRlU2NhbGVXaXRoTGltaXRzKG1heFNjYWxlKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhtYXhTY2FsZSwgem9vbU1hbmFnZXIuY29tcHV0ZVNjYWxlV2l0aExpbWl0cyhtYXhTY2FsZSArIC4wMWYpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKG1pblNjYWxlLCB6b29tTWFuYWdlci5jb21wdXRlU2NhbGVXaXRoTGltaXRzKG1pblNjYWxlKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhtaW5TY2FsZSwgem9vbU1hbmFnZXIuY29tcHV0ZVNjYWxlV2l0aExpbWl0cyhtaW5TY2FsZSAtIC4wMWYpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgYWN0dWFsU2NhbGVUZXN0KGZsb2F0IGFjdHVhbFNjYWxlKSB7CisgICAgICAgIGFzc2VydEVxdWFscyhhY3R1YWxTY2FsZSwgem9vbU1hbmFnZXIuZ2V0U2NhbGUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygxIC8gYWN0dWFsU2NhbGUsIHpvb21NYW5hZ2VyLmdldEludlNjYWxlKCkpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBkZWZhdWx0U2NhbGVUZXN0KGZsb2F0IGRlZmF1bHRTY2FsZSkgeworICAgICAgICBmaW5hbCBmbG9hdCBtYXhEZWZhdWx0ID0gWm9vbU1hbmFnZXIuREVGQVVMVF9NQVhfWk9PTV9TQ0FMRV9GQUNUT1IgKiBkZWZhdWx0U2NhbGU7CisgICAgICAgIGZpbmFsIGZsb2F0IG1pbkRlZmF1bHQgPSBab29tTWFuYWdlci5ERUZBVUxUX01JTl9aT09NX1NDQUxFX0ZBQ1RPUiAqIGRlZmF1bHRTY2FsZTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGRlZmF1bHRTY2FsZSwgem9vbU1hbmFnZXIuZ2V0RGVmYXVsdFNjYWxlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMSAvIGRlZmF1bHRTY2FsZSwgem9vbU1hbmFnZXIuZ2V0SW52RGVmYXVsdFNjYWxlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMobWF4RGVmYXVsdCwgem9vbU1hbmFnZXIuZ2V0RGVmYXVsdE1heFpvb21TY2FsZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKG1pbkRlZmF1bHQsIHpvb21NYW5hZ2VyLmdldERlZmF1bHRNaW5ab29tU2NhbGUoKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvd2lkZ2V0L2V4cGFuZGFibGVsaXN0dmlldy9FeHBhbmRhYmxlTGlzdEJhc2ljVGVzdC5qYXZhIGIvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvd2lkZ2V0L2V4cGFuZGFibGVsaXN0dmlldy9FeHBhbmRhYmxlTGlzdEJhc2ljVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMjNiNTE2Li4wMDAwMDAwCi0tLSBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL3dpZGdldC9leHBhbmRhYmxlbGlzdHZpZXcvRXhwYW5kYWJsZUxpc3RCYXNpY1Rlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBhbmRyb2lkLndpZGdldC5leHBhbmRhYmxlbGlzdHZpZXc7Ci0KLWltcG9ydCBhbmRyb2lkLnRlc3QuQWN0aXZpdHlJbnN0cnVtZW50YXRpb25UZXN0Q2FzZTI7Ci1pbXBvcnQgYW5kcm9pZC50ZXN0LnN1aXRlYnVpbGRlci5hbm5vdGF0aW9uLk1lZGl1bVRlc3Q7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkV4cGFuZGFibGVMaXN0U2NlbmFyaW87Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkxpc3RVdGlsOwotaW1wb3J0IGFuZHJvaWQudXRpbC5FeHBhbmRhYmxlTGlzdFNjZW5hcmlvLk15R3JvdXA7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LktleUV2ZW50OwotaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkJhc2VFeHBhbmRhYmxlTGlzdEFkYXB0ZXI7Ci1pbXBvcnQgYW5kcm9pZC53aWRnZXQuRXhwYW5kYWJsZUxpc3RBZGFwdGVyOwotaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkV4cGFuZGFibGVMaXN0VmlldzsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1wdWJsaWMgY2xhc3MgRXhwYW5kYWJsZUxpc3RCYXNpY1Rlc3QgZXh0ZW5kcyBBY3Rpdml0eUluc3RydW1lbnRhdGlvblRlc3RDYXNlMjxFeHBhbmRhYmxlTGlzdFNpbXBsZT4gewotICAgIHByaXZhdGUgRXhwYW5kYWJsZUxpc3RTY2VuYXJpbyBtQWN0aXZpdHk7Ci0gICAgcHJpdmF0ZSBFeHBhbmRhYmxlTGlzdFZpZXcgbUV4cGFuZGFibGVMaXN0VmlldzsKLSAgICBwcml2YXRlIEV4cGFuZGFibGVMaXN0QWRhcHRlciBtQWRhcHRlcjsKLSAgICBwcml2YXRlIExpc3RVdGlsIG1MaXN0VXRpbDsKLSAgICAKLSAgICBwdWJsaWMgRXhwYW5kYWJsZUxpc3RCYXNpY1Rlc3QoKSB7Ci0gICAgICAgIHN1cGVyKEV4cGFuZGFibGVMaXN0U2ltcGxlLmNsYXNzKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBzdXBlci5zZXRVcCgpOwotICAgICAgICAKLSAgICAgICAgbUFjdGl2aXR5ID0gZ2V0QWN0aXZpdHkoKTsKLSAgICAgICAgbUV4cGFuZGFibGVMaXN0VmlldyA9IG1BY3Rpdml0eS5nZXRFeHBhbmRhYmxlTGlzdFZpZXcoKTsKLSAgICAgICAgbUFkYXB0ZXIgPSBtRXhwYW5kYWJsZUxpc3RWaWV3LmdldEV4cGFuZGFibGVMaXN0QWRhcHRlcigpOwotICAgICAgICBtTGlzdFV0aWwgPSBuZXcgTGlzdFV0aWwobUV4cGFuZGFibGVMaXN0VmlldywgZ2V0SW5zdHJ1bWVudGF0aW9uKCkpOwotICAgIH0KLSAgICAKLSAgICBATWVkaXVtVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RQcmVjb25kaXRpb25zKCkgewotICAgICAgICBhc3NlcnROb3ROdWxsKG1BY3Rpdml0eSk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwobUV4cGFuZGFibGVMaXN0Vmlldyk7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgaW50IGV4cGFuZEdyb3VwKGludCBudW1DaGlsZHJlbiwgYm9vbGVhbiBhdExlYXN0T25lQ2hpbGQpIHsKLSAgICAgICAgZmluYWwgaW50IGdyb3VwUG9zID0gbUFjdGl2aXR5LmZpbmRHcm91cFdpdGhOdW1DaGlsZHJlbihudW1DaGlsZHJlbiwgYXRMZWFzdE9uZUNoaWxkKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSgiQ291bGQgbm90IGZpbmQgZ3JvdXAgdG8gZXhwYW5kIiwgZ3JvdXBQb3MgPj0gMCk7Ci0KLSAgICAgICAgYXNzZXJ0RmFsc2UoIkdyb3VwIGlzIGFscmVhZHkgZXhwYW5kZWQiLCBtRXhwYW5kYWJsZUxpc3RWaWV3LmlzR3JvdXBFeHBhbmRlZChncm91cFBvcykpOwotICAgICAgICBtTGlzdFV0aWwuYXJyb3dTY3JvbGxUb1NlbGVjdGVkUG9zaXRpb24oZ3JvdXBQb3MpOwotICAgICAgICBnZXRJbnN0cnVtZW50YXRpb24oKS53YWl0Rm9ySWRsZVN5bmMoKTsKLSAgICAgICAgc2VuZEtleXMoS2V5RXZlbnQuS0VZQ09ERV9EUEFEX0NFTlRFUik7Ci0gICAgICAgIGdldEluc3RydW1lbnRhdGlvbigpLndhaXRGb3JJZGxlU3luYygpOwotICAgICAgICBhc3NlcnRUcnVlKCJHcm91cCBkaWQgbm90IGV4cGFuZCIsIG1FeHBhbmRhYmxlTGlzdFZpZXcuaXNHcm91cEV4cGFuZGVkKGdyb3VwUG9zKSk7Ci0KLSAgICAgICAgcmV0dXJuIGdyb3VwUG9zOwotICAgIH0KLQotICAgIEBNZWRpdW1UZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdEV4cGFuZEdyb3VwKCkgewotICAgICAgICBleHBhbmRHcm91cCgtMSwgdHJ1ZSk7Ci0gICAgfQotICAgIAotICAgIEBNZWRpdW1UZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdENvbGxhcHNlR3JvdXAoKSB7Ci0gICAgICAgIGZpbmFsIGludCBncm91cFBvcyA9IGV4cGFuZEdyb3VwKC0xLCB0cnVlKTsKLSAgICAgICAgCi0gICAgICAgIHNlbmRLZXlzKEtleUV2ZW50LktFWUNPREVfRFBBRF9DRU5URVIpOwotICAgICAgICBnZXRJbnN0cnVtZW50YXRpb24oKS53YWl0Rm9ySWRsZVN5bmMoKTsKLSAgICAgICAgYXNzZXJ0RmFsc2UoIkdyb3VwIGRpZCBub3QgY29sbGFwc2UiLCBtRXhwYW5kYWJsZUxpc3RWaWV3LmlzR3JvdXBFeHBhbmRlZChncm91cFBvcykpOwotICAgIH0KLSAgICAKLSAgICBATWVkaXVtVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RFeHBhbmRlZEdyb3VwTW92ZW1lbnQoKSB7Ci0gICAgICAgIC8vIEV4cGFuZCB0aGUgZmlyc3QgZ3JvdXAKLSAgICAgICAgbUxpc3RVdGlsLmFycm93U2Nyb2xsVG9TZWxlY3RlZFBvc2l0aW9uKDApOwotICAgICAgICBzZW5kS2V5cyhLZXlFdmVudC5LRVlDT0RFX0RQQURfQ0VOVEVSKTsKLSAgICAgICAgZ2V0SW5zdHJ1bWVudGF0aW9uKCkud2FpdEZvcklkbGVTeW5jKCk7Ci0KLSAgICAgICAgLy8gRW5zdXJlIGl0IGV4cGFuZGVkCi0gICAgICAgIGFzc2VydFRydWUoIkdyb3VwIGRpZCBub3QgZXhwYW5kIiwgbUV4cGFuZGFibGVMaXN0Vmlldy5pc0dyb3VwRXhwYW5kZWQoMCkpOwotICAgICAgICAKLSAgICAgICAgLy8gV2FpdCB1bnRpbCB0aGF0J3MgYWxsIGdvb2QKLSAgICAgICAgZ2V0SW5zdHJ1bWVudGF0aW9uKCkud2FpdEZvcklkbGVTeW5jKCk7Ci0gICAgICAgIAotICAgICAgICAvLyBNYWtlIHN1cmUgaXQgZXhwYW5kZWQKLSAgICAgICAgYXNzZXJ0VHJ1ZSgiR3JvdXAgZGlkIG5vdCBleHBhbmQiLCBtRXhwYW5kYWJsZUxpc3RWaWV3LmlzR3JvdXBFeHBhbmRlZCgwKSk7Ci0gICAgICAgIAotICAgICAgICAvLyBJbnNlcnQgYSBjb2xsYXBzZWQgZ3JvdXAgaW4gZnJvbnQgb2YgdGhlIG9uZSBqdXN0IGV4cGFuZGVkCi0gICAgICAgIExpc3Q8TXlHcm91cD4gZ3JvdXBzID0gbUFjdGl2aXR5LmdldEdyb3VwcygpOwotICAgICAgICBNeUdyb3VwIGluc2VydGVkR3JvdXAgPSBuZXcgTXlHcm91cCgxKTsKLSAgICAgICAgZ3JvdXBzLmFkZCgwLCBpbnNlcnRlZEdyb3VwKTsKLSAgICAgICAgCi0gICAgICAgIC8vIE5vdGlmeSBkYXRhIGNoYW5nZQotICAgICAgICBhc3NlcnRUcnVlKCJBZGFwdGVyIGlzIG5vdCBhbiBpbnN0YW5jZSBvZiB0aGUgYmFzZSBhZGFwdGVyIiwKLSAgICAgICAgICAgICAgICBtQWRhcHRlciBpbnN0YW5jZW9mIEJhc2VFeHBhbmRhYmxlTGlzdEFkYXB0ZXIpOwotICAgICAgICBmaW5hbCBCYXNlRXhwYW5kYWJsZUxpc3RBZGFwdGVyIGFkYXB0ZXIgPSAoQmFzZUV4cGFuZGFibGVMaXN0QWRhcHRlcikgbUFkYXB0ZXI7Ci0gICAgIAotICAgICAgICBtQWN0aXZpdHkucnVuT25VaVRocmVhZChuZXcgUnVubmFibGUoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICAgICAgICAgICAgYWRhcHRlci5ub3RpZnlEYXRhU2V0Q2hhbmdlZCgpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICAgICAgZ2V0SW5zdHJ1bWVudGF0aW9uKCkud2FpdEZvcklkbGVTeW5jKCk7Ci0gICAgICAgIAotICAgICAgICAvLyBNYWtlIHN1cmUgdGhlIHJpZ2h0IGdyb3VwIGlzIGV4cGFuZGVkCi0gICAgICAgIGFzc2VydFRydWUoIlRoZSBleHBhbmRlZCBzdGF0ZSBkaWRuJ3Qgc3RheSB3aXRoIHRoZSBwcm9wZXIgZ3JvdXAiLAotICAgICAgICAgICAgICAgIG1FeHBhbmRhYmxlTGlzdFZpZXcuaXNHcm91cEV4cGFuZGVkKDEpKTsKLSAgICAgICAgYXNzZXJ0RmFsc2UoIlRoZSBleHBhbmRlZCBzdGF0ZSB3YXMgZ2l2ZW4gdG8gdGhlIGluc2VydGVkIGdyb3VwIiwKLSAgICAgICAgICAgICAgICBtRXhwYW5kYWJsZUxpc3RWaWV3LmlzR3JvdXBFeHBhbmRlZCgwKSk7Ci0gICAgfQotCi0gICAgQE1lZGl1bVRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q29udGV4dE1lbnVzKCkgewotICAgICAgICBFeHBhbmRhYmxlTGlzdFRlc3RlciB0ZXN0ZXIgPSBuZXcgRXhwYW5kYWJsZUxpc3RUZXN0ZXIobUV4cGFuZGFibGVMaXN0VmlldywgdGhpcyk7Ci0gICAgICAgIHRlc3Rlci50ZXN0Q29udGV4dE1lbnVzKCk7Ci0gICAgfQotCi0gICAgQE1lZGl1bVRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q29udmVydGlvbkJldHdlZW5GbGF0QW5kUGFja2VkKCkgewotICAgICAgICBFeHBhbmRhYmxlTGlzdFRlc3RlciB0ZXN0ZXIgPSBuZXcgRXhwYW5kYWJsZUxpc3RUZXN0ZXIobUV4cGFuZGFibGVMaXN0VmlldywgdGhpcyk7Ci0gICAgICAgIHRlc3Rlci50ZXN0Q29udmVydGlvbkJldHdlZW5GbGF0QW5kUGFja2VkT25Hcm91cHMoKTsKLSAgICAgICAgdGVzdGVyLnRlc3RDb252ZXJ0aW9uQmV0d2VlbkZsYXRBbmRQYWNrZWRPbkNoaWxkcmVuKCk7Ci0gICAgfQotCi0gICAgQE1lZGl1bVRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0U2VsZWN0ZWRQb3NpdGlvbigpIHsKLSAgICAgICAgRXhwYW5kYWJsZUxpc3RUZXN0ZXIgdGVzdGVyID0gbmV3IEV4cGFuZGFibGVMaXN0VGVzdGVyKG1FeHBhbmRhYmxlTGlzdFZpZXcsIHRoaXMpOwotICAgICAgICB0ZXN0ZXIudGVzdFNlbGVjdGVkUG9zaXRpb25Pbkdyb3VwcygpOwotICAgICAgICB0ZXN0ZXIudGVzdFNlbGVjdGVkUG9zaXRpb25PbkNoaWxkcmVuKCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvd2lkZ2V0L2V4cGFuZGFibGVsaXN0dmlldy9FeHBhbmRhYmxlTGlzdFNpbXBsZS5qYXZhIGIvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvd2lkZ2V0L2V4cGFuZGFibGVsaXN0dmlldy9FeHBhbmRhYmxlTGlzdFNpbXBsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OGRiMjhjLi4wMDAwMDAwCi0tLSBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL3dpZGdldC9leHBhbmRhYmxlbGlzdHZpZXcvRXhwYW5kYWJsZUxpc3RTaW1wbGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGFuZHJvaWQud2lkZ2V0LmV4cGFuZGFibGVsaXN0dmlldzsKLQotaW1wb3J0IGFuZHJvaWQudmlldy5NZW51OwotaW1wb3J0IGFuZHJvaWQudmlldy5NZW51SXRlbTsKLWltcG9ydCBhbmRyb2lkLnZpZXcuTWVudUl0ZW0uT25NZW51SXRlbUNsaWNrTGlzdGVuZXI7Ci1pbXBvcnQgYW5kcm9pZC53aWRnZXQuQmFzZUV4cGFuZGFibGVMaXN0QWRhcHRlcjsKLQotaW1wb3J0IGFuZHJvaWQudXRpbC5FeHBhbmRhYmxlTGlzdFNjZW5hcmlvOwotCi1wdWJsaWMgY2xhc3MgRXhwYW5kYWJsZUxpc3RTaW1wbGUgZXh0ZW5kcyBFeHBhbmRhYmxlTGlzdFNjZW5hcmlvIHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnRbXSBOVU1fQ0hJTERSRU4gPSB7NCwgMywgMiwgMSwgMH07Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCBpbml0KEV4cGFuZGFibGVQYXJhbXMgcGFyYW1zKSB7Ci0gICAgICAgIHBhcmFtcy5zZXROdW1DaGlsZHJlbihOVU1fQ0hJTERSRU4pCi0gICAgICAgICAgICAgICAgLnNldEl0ZW1TY3JlZW5TaXplRmFjdG9yKDAuMTQpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIG9uQ3JlYXRlT3B0aW9uc01lbnUoTWVudSBtZW51KSB7Ci0KLSAgICAgICAgbWVudS5hZGQoIkFkZCBpdGVtIikuc2V0T25NZW51SXRlbUNsaWNrTGlzdGVuZXIobmV3IE9uTWVudUl0ZW1DbGlja0xpc3RlbmVyKCkgewotICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gb25NZW51SXRlbUNsaWNrKE1lbnVJdGVtIGl0ZW0pIHsKLSAgICAgICAgICAgICAgICBtR3JvdXBzLmFkZCgwLCBuZXcgTXlHcm91cCgyKSk7Ci0gICAgICAgICAgICAgICAgKChCYXNlRXhwYW5kYWJsZUxpc3RBZGFwdGVyKSBtQWRhcHRlcikubm90aWZ5RGF0YVNldENoYW5nZWQoKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgCi19CmRpZmYgLS1naXQgYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC93aWRnZXQvZXhwYW5kYWJsZWxpc3R2aWV3L0V4cGFuZGFibGVMaXN0VGVzdGVyLmphdmEgYi9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC93aWRnZXQvZXhwYW5kYWJsZWxpc3R2aWV3L0V4cGFuZGFibGVMaXN0VGVzdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRmYjEwZmIuLjAwMDAwMDAKLS0tIGEvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvd2lkZ2V0L2V4cGFuZGFibGVsaXN0dmlldy9FeHBhbmRhYmxlTGlzdFRlc3Rlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGFuZHJvaWQud2lkZ2V0LmV4cGFuZGFibGVsaXN0dmlldzsKLQotaW1wb3J0IGFuZHJvaWQuYXBwLkluc3RydW1lbnRhdGlvbjsKLWltcG9ydCBhbmRyb2lkLnRlc3QuQWN0aXZpdHlJbnN0cnVtZW50YXRpb25UZXN0Q2FzZTI7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkV4cGFuZGFibGVMaXN0U2NlbmFyaW87Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkxpc3RVdGlsOwotaW1wb3J0IGFuZHJvaWQudmlldy5LZXlFdmVudDsKLWltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKLWltcG9ydCBhbmRyb2lkLndpZGdldC5FeHBhbmRhYmxlTGlzdEFkYXB0ZXI7Ci1pbXBvcnQgYW5kcm9pZC53aWRnZXQuRXhwYW5kYWJsZUxpc3RWaWV3OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLkFzc2VydDsKLQotcHVibGljIGNsYXNzIEV4cGFuZGFibGVMaXN0VGVzdGVyIHsKLSAgICBwcml2YXRlIGZpbmFsIEV4cGFuZGFibGVMaXN0VmlldyBtRXhwYW5kYWJsZUxpc3RWaWV3OwotICAgIHByaXZhdGUgZmluYWwgRXhwYW5kYWJsZUxpc3RBZGFwdGVyIG1BZGFwdGVyOwotICAgIHByaXZhdGUgZmluYWwgTGlzdFV0aWwgbUxpc3RVdGlsOwotCi0gICAgcHJpdmF0ZSBmaW5hbCBBY3Rpdml0eUluc3RydW1lbnRhdGlvblRlc3RDYXNlMjw/IGV4dGVuZHMgRXhwYW5kYWJsZUxpc3RTY2VuYXJpbz4KLSAgICAgICAgbUFjdGl2aXR5SW5zdHJ1bWVudGF0aW9uOwotCi0gICAgSW5zdHJ1bWVudGF0aW9uIG1JbnN0cnVtZW50YXRpb247Ci0KLSAgICBwdWJsaWMgRXhwYW5kYWJsZUxpc3RUZXN0ZXIoCi0gICAgICAgICAgICBFeHBhbmRhYmxlTGlzdFZpZXcgZXhwYW5kYWJsZUxpc3RWaWV3LAotICAgICAgICAgICAgQWN0aXZpdHlJbnN0cnVtZW50YXRpb25UZXN0Q2FzZTI8PyBleHRlbmRzIEV4cGFuZGFibGVMaXN0U2NlbmFyaW8+Ci0gICAgICAgICAgICBhY3Rpdml0eUluc3RydW1lbnRhdGlvbikgewotICAgICAgICBtRXhwYW5kYWJsZUxpc3RWaWV3ID0gZXhwYW5kYWJsZUxpc3RWaWV3OwotICAgICAgICBJbnN0cnVtZW50YXRpb24gaW5zdHJ1bWVudGF0aW9uID0gYWN0aXZpdHlJbnN0cnVtZW50YXRpb24uZ2V0SW5zdHJ1bWVudGF0aW9uKCk7Ci0gICAgICAgIG1MaXN0VXRpbCA9IG5ldyBMaXN0VXRpbChtRXhwYW5kYWJsZUxpc3RWaWV3LCBpbnN0cnVtZW50YXRpb24pOwotICAgICAgICBtQWRhcHRlciA9IG1FeHBhbmRhYmxlTGlzdFZpZXcuZ2V0RXhwYW5kYWJsZUxpc3RBZGFwdGVyKCk7Ci0gICAgICAgIG1BY3Rpdml0eUluc3RydW1lbnRhdGlvbiA9IGFjdGl2aXR5SW5zdHJ1bWVudGF0aW9uOwotICAgICAgICBtSW5zdHJ1bWVudGF0aW9uID0gbUFjdGl2aXR5SW5zdHJ1bWVudGF0aW9uLmdldEluc3RydW1lbnRhdGlvbigpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBleHBhbmRHcm91cChmaW5hbCBpbnQgZ3JvdXBJbmRleCwgaW50IGZsYXRQb3NpdGlvbikgewotICAgICAgICBBc3NlcnQuYXNzZXJ0RmFsc2UoIkdyb3VwIGlzIGFscmVhZHkgZXhwYW5kZWQiLCBtRXhwYW5kYWJsZUxpc3RWaWV3Ci0gICAgICAgICAgICAgICAgLmlzR3JvdXBFeHBhbmRlZChncm91cEluZGV4KSk7Ci0gICAgICAgIG1MaXN0VXRpbC5hcnJvd1Njcm9sbFRvU2VsZWN0ZWRQb3NpdGlvbihmbGF0UG9zaXRpb24pOwotICAgICAgICBtSW5zdHJ1bWVudGF0aW9uLndhaXRGb3JJZGxlU3luYygpOwotICAgICAgICBtQWN0aXZpdHlJbnN0cnVtZW50YXRpb24uc2VuZEtleXMoS2V5RXZlbnQuS0VZQ09ERV9EUEFEX0NFTlRFUik7Ci0gICAgICAgIG1BY3Rpdml0eUluc3RydW1lbnRhdGlvbi5nZXRJbnN0cnVtZW50YXRpb24oKS53YWl0Rm9ySWRsZVN5bmMoKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIkdyb3VwIGRpZCBub3QgZXhwYW5kICIgKyBncm91cEluZGV4LCAKLSAgICAgICAgICAgICAgICBtRXhwYW5kYWJsZUxpc3RWaWV3LmlzR3JvdXBFeHBhbmRlZChncm91cEluZGV4KSk7Ci0gICAgfQotCi0gICAgdm9pZCB0ZXN0Q29udGV4dE1lbnVzKCkgewotICAgICAgICAvLyBBZGQgYSBwb3NpdGlvbiB0ZXN0ZXIgQ29udGV4dE1lbnUgbGlzdGVuZXIgdG8gdGhlIEV4cGFuZGFibGVMaXN0VmlldwotICAgICAgICBQb3NpdGlvblRlc3RlckNvbnRleHRNZW51TGlzdGVuZXIgbWVudUxpc3RlbmVyID0gbmV3IFBvc2l0aW9uVGVzdGVyQ29udGV4dE1lbnVMaXN0ZW5lcigpOwotICAgICAgICBtRXhwYW5kYWJsZUxpc3RWaWV3LnNldE9uQ3JlYXRlQ29udGV4dE1lbnVMaXN0ZW5lcihtZW51TGlzdGVuZXIpOwotCi0gICAgICAgIGludCBpbmRleCA9IDA7Ci0KLSAgICAgICAgLy8gU2Nyb2xsaW5nIG9uIGhlYWRlciBlbGVtZW50cyBzaG91bGQgdHJpZ2dlciBhbiBBZGFwdGVyQ29udGV4dE1lbnUKLSAgICAgICAgZm9yIChpbnQgaT0wOyBpPG1FeHBhbmRhYmxlTGlzdFZpZXcuZ2V0SGVhZGVyVmlld3NDb3VudCgpOyBpKyspIHsKLSAgICAgICAgICAgIC8vIENoZWNrIGdyb3VwIGluZGV4IGluIGNvbnRleHQgbWVudQotICAgICAgICAgICAgbWVudUxpc3RlbmVyLmV4cGVjdEFkYXB0ZXJDb250ZXh0TWVudShpKTsKLSAgICAgICAgICAgIC8vIE1ha2Ugc3VyZSB0aGUgZ3JvdXAgaXMgdmlzaWJsZSBzbyB0aGF0IGdldENoaWxkIGZpbmRzIGl0Ci0gICAgICAgICAgICBtTGlzdFV0aWwuYXJyb3dTY3JvbGxUb1NlbGVjdGVkUG9zaXRpb24oaW5kZXgpOwotICAgICAgICAgICAgVmlldyBoZWFkZXJDaGlsZCA9IG1FeHBhbmRhYmxlTGlzdFZpZXcuZ2V0Q2hpbGRBdChpbmRleAotICAgICAgICAgICAgICAgICAgICAtIG1FeHBhbmRhYmxlTGlzdFZpZXcuZ2V0Rmlyc3RWaXNpYmxlUG9zaXRpb24oKSk7Ci0gICAgICAgICAgICBtRXhwYW5kYWJsZUxpc3RWaWV3LnNob3dDb250ZXh0TWVudUZvckNoaWxkKGhlYWRlckNoaWxkKTsKLSAgICAgICAgICAgIG1JbnN0cnVtZW50YXRpb24ud2FpdEZvcklkbGVTeW5jKCk7Ci0gICAgICAgICAgICBBc3NlcnQuYXNzZXJ0TnVsbChtZW51TGlzdGVuZXIuZ2V0RXJyb3JNZXNzYWdlKCksIG1lbnVMaXN0ZW5lci5nZXRFcnJvck1lc3NhZ2UoKSk7Ci0gICAgICAgICAgICBpbmRleCsrOwotICAgICAgICB9Ci0KLSAgICAgICAgaW50IGdyb3VwQ291bnQgPSBtQWRhcHRlci5nZXRHcm91cENvdW50KCk7Ci0gICAgICAgIGZvciAoaW50IGdyb3VwSW5kZXggPSAwOyBncm91cEluZGV4IDwgZ3JvdXBDb3VudDsgZ3JvdXBJbmRleCsrKSB7Ci0KLSAgICAgICAgICAgIC8vIEV4cGFuZCBncm91cAotICAgICAgICAgICAgZXhwYW5kR3JvdXAoZ3JvdXBJbmRleCwgaW5kZXgpOwotCi0gICAgICAgICAgICAvLyBDaGVjayBncm91cCBpbmRleCBpbiBjb250ZXh0IG1lbnUKLSAgICAgICAgICAgIG1lbnVMaXN0ZW5lci5leHBlY3RHcm91cENvbnRleHRNZW51KGdyb3VwSW5kZXgpOwotICAgICAgICAgICAgLy8gTWFrZSBzdXJlIHRoZSBncm91cCBpcyB2aXNpYmxlIHNvIHRoYXQgZ2V0Q2hpbGQgZmluZHMgaXQKLSAgICAgICAgICAgIG1MaXN0VXRpbC5hcnJvd1Njcm9sbFRvU2VsZWN0ZWRQb3NpdGlvbihpbmRleCk7Ci0gICAgICAgICAgICBWaWV3IGdyb3VwQ2hpbGQgPSBtRXhwYW5kYWJsZUxpc3RWaWV3LmdldENoaWxkQXQoaW5kZXgKLSAgICAgICAgICAgICAgICAgICAgLSBtRXhwYW5kYWJsZUxpc3RWaWV3LmdldEZpcnN0VmlzaWJsZVBvc2l0aW9uKCkpOwotICAgICAgICAgICAgbUV4cGFuZGFibGVMaXN0Vmlldy5zaG93Q29udGV4dE1lbnVGb3JDaGlsZChncm91cENoaWxkKTsKLSAgICAgICAgICAgIG1JbnN0cnVtZW50YXRpb24ud2FpdEZvcklkbGVTeW5jKCk7Ci0gICAgICAgICAgICBBc3NlcnQuYXNzZXJ0TnVsbChtZW51TGlzdGVuZXIuZ2V0RXJyb3JNZXNzYWdlKCksIG1lbnVMaXN0ZW5lci5nZXRFcnJvck1lc3NhZ2UoKSk7Ci0gICAgICAgICAgICBpbmRleCsrOwotCi0gICAgICAgICAgICBmaW5hbCBpbnQgY2hpbGRyZW5Db3VudCA9IG1BZGFwdGVyLmdldENoaWxkcmVuQ291bnQoZ3JvdXBJbmRleCk7Ci0gICAgICAgICAgICBmb3IgKGludCBjaGlsZEluZGV4ID0gMDsgY2hpbGRJbmRleCA8IGNoaWxkcmVuQ291bnQ7IGNoaWxkSW5kZXgrKykgewotICAgICAgICAgICAgICAgIC8vIENoZWNrIGNoaWxkIGluZGV4IGluIGNvbnRleHQgbWVudQotICAgICAgICAgICAgICAgIG1MaXN0VXRpbC5hcnJvd1Njcm9sbFRvU2VsZWN0ZWRQb3NpdGlvbihpbmRleCk7Ci0gICAgICAgICAgICAgICAgbWVudUxpc3RlbmVyLmV4cGVjdENoaWxkQ29udGV4dE1lbnUoZ3JvdXBJbmRleCwgY2hpbGRJbmRleCk7Ci0gICAgICAgICAgICAgICAgVmlldyBjaGlsZCA9IG1FeHBhbmRhYmxlTGlzdFZpZXcuZ2V0Q2hpbGRBdChpbmRleAotICAgICAgICAgICAgICAgICAgICAgICAgLSBtRXhwYW5kYWJsZUxpc3RWaWV3LmdldEZpcnN0VmlzaWJsZVBvc2l0aW9uKCkpOwotICAgICAgICAgICAgICAgIG1FeHBhbmRhYmxlTGlzdFZpZXcuc2hvd0NvbnRleHRNZW51Rm9yQ2hpbGQoY2hpbGQpOwotICAgICAgICAgICAgICAgIG1JbnN0cnVtZW50YXRpb24ud2FpdEZvcklkbGVTeW5jKCk7Ci0gICAgICAgICAgICAgICAgQXNzZXJ0LmFzc2VydE51bGwobWVudUxpc3RlbmVyLmdldEVycm9yTWVzc2FnZSgpLCBtZW51TGlzdGVuZXIuZ2V0RXJyb3JNZXNzYWdlKCkpOwotICAgICAgICAgICAgICAgIGluZGV4Kys7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBTY3JvbGxpbmcgb24gZm9vdGVyIGVsZW1lbnRzIHNob3VsZCB0cmlnZ2VyIGFuIEFkYXB0ZXJDb250ZXh0TWVudQotICAgICAgICBmb3IgKGludCBpPTA7IGk8bUV4cGFuZGFibGVMaXN0Vmlldy5nZXRGb290ZXJWaWV3c0NvdW50KCk7IGkrKykgewotICAgICAgICAgICAgLy8gQ2hlY2sgZ3JvdXAgaW5kZXggaW4gY29udGV4dCBtZW51Ci0gICAgICAgICAgICBtZW51TGlzdGVuZXIuZXhwZWN0QWRhcHRlckNvbnRleHRNZW51KGluZGV4KTsKLSAgICAgICAgICAgIC8vIE1ha2Ugc3VyZSB0aGUgZ3JvdXAgaXMgdmlzaWJsZSBzbyB0aGF0IGdldENoaWxkIGZpbmRzIGl0Ci0gICAgICAgICAgICBtTGlzdFV0aWwuYXJyb3dTY3JvbGxUb1NlbGVjdGVkUG9zaXRpb24oaW5kZXgpOwotICAgICAgICAgICAgVmlldyBmb290ZXJDaGlsZCA9IG1FeHBhbmRhYmxlTGlzdFZpZXcuZ2V0Q2hpbGRBdChpbmRleAotICAgICAgICAgICAgICAgICAgICAtIG1FeHBhbmRhYmxlTGlzdFZpZXcuZ2V0Rmlyc3RWaXNpYmxlUG9zaXRpb24oKSk7Ci0gICAgICAgICAgICBtRXhwYW5kYWJsZUxpc3RWaWV3LnNob3dDb250ZXh0TWVudUZvckNoaWxkKGZvb3RlckNoaWxkKTsKLSAgICAgICAgICAgIG1JbnN0cnVtZW50YXRpb24ud2FpdEZvcklkbGVTeW5jKCk7Ci0gICAgICAgICAgICBBc3NlcnQuYXNzZXJ0TnVsbChtZW51TGlzdGVuZXIuZ2V0RXJyb3JNZXNzYWdlKCksIG1lbnVMaXN0ZW5lci5nZXRFcnJvck1lc3NhZ2UoKSk7Ci0gICAgICAgICAgICBpbmRleCsrOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gQ2xlYW51cDogcmVtb3ZlIHRoZSBsaXN0ZW5lciB3ZSBhZGRlZC4KLSAgICAgICAgbUV4cGFuZGFibGVMaXN0Vmlldy5zZXRPbkNyZWF0ZUNvbnRleHRNZW51TGlzdGVuZXIobnVsbCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBpbnQgZXhwYW5kQUdyb3VwKCkgewotICAgICAgICBmaW5hbCBpbnQgZ3JvdXBJbmRleCA9IDI7Ci0gICAgICAgIGZpbmFsIGludCBoZWFkZXJDb3VudCA9IG1FeHBhbmRhYmxlTGlzdFZpZXcuZ2V0SGVhZGVyVmlld3NDb3VudCgpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSgiTm90IGVub3VnaCBncm91cHMiLCBncm91cEluZGV4IDwgbUFkYXB0ZXIuZ2V0R3JvdXBDb3VudCgpKTsKLSAgICAgICAgZXhwYW5kR3JvdXAoZ3JvdXBJbmRleCwgZ3JvdXBJbmRleCArIGhlYWRlckNvdW50KTsKLSAgICAgICAgcmV0dXJuIGdyb3VwSW5kZXg7Ci0gICAgfQotCi0gICAgLy8gVGhpcyBtZXRob2QgYXNzdW1lcyB0aGF0IE5PIGdyb3VwIGlzIGV4cGFuZGVkIHdoZW4gY2FsbGVkCi0gICAgdm9pZCB0ZXN0Q29udmVydGlvbkJldHdlZW5GbGF0QW5kUGFja2VkT25Hcm91cHMoKSB7Ci0gICAgICAgIGZpbmFsIGludCBoZWFkZXJDb3VudCA9IG1FeHBhbmRhYmxlTGlzdFZpZXcuZ2V0SGVhZGVyVmlld3NDb3VudCgpOwotCi0gICAgICAgIGZvciAoaW50IGk9MDsgaTxoZWFkZXJDb3VudDsgaSsrKSB7Ci0gICAgICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCJOb24gTlVMTCBwb3NpdGlvbiBmb3IgaGVhZGVyIGl0ZW0iLAotICAgICAgICAgICAgICAgICAgICBFeHBhbmRhYmxlTGlzdFZpZXcuUEFDS0VEX1BPU0lUSU9OX1ZBTFVFX05VTEwsCi0gICAgICAgICAgICAgICAgICAgIG1FeHBhbmRhYmxlTGlzdFZpZXcuZ2V0RXhwYW5kYWJsZUxpc3RQb3NpdGlvbihpKSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBUZXN0IGFsbCAobm9uIGV4cGFuZGVkKSBncm91cHMKLSAgICAgICAgZmluYWwgaW50IGdyb3VwQ291bnQgPSBtQWRhcHRlci5nZXRHcm91cENvdW50KCk7Ci0gICAgICAgIGZvciAoaW50IGdyb3VwSW5kZXggPSAwOyBncm91cEluZGV4IDwgZ3JvdXBDb3VudDsgZ3JvdXBJbmRleCsrKSB7Ci0gICAgICAgICAgICBpbnQgZXhwZWN0ZWRGbGF0UG9zaXRpb24gPSBoZWFkZXJDb3VudCArIGdyb3VwSW5kZXg7Ci0gICAgICAgICAgICBsb25nIHBhY2tlZFBvc2l0aW9uRm9yR3JvdXAgPSBFeHBhbmRhYmxlTGlzdFZpZXcuZ2V0UGFja2VkUG9zaXRpb25Gb3JHcm91cChncm91cEluZGV4KTsKLSAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIkdyb3VwIG5vdCBmb3VuZCBhdCBmbGF0IHBvc2l0aW9uICIgKyBleHBlY3RlZEZsYXRQb3NpdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgcGFja2VkUG9zaXRpb25Gb3JHcm91cCwKLSAgICAgICAgICAgICAgICAgICAgbUV4cGFuZGFibGVMaXN0Vmlldy5nZXRFeHBhbmRhYmxlTGlzdFBvc2l0aW9uKGV4cGVjdGVkRmxhdFBvc2l0aW9uKSk7Ci0KLSAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIldyb25nIGZsYXQgcG9zaXRpb24gZm9yIGdyb3VwICIgKyBncm91cEluZGV4LAotICAgICAgICAgICAgICAgICAgICBleHBlY3RlZEZsYXRQb3NpdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgbUV4cGFuZGFibGVMaXN0Vmlldy5nZXRGbGF0TGlzdFBvc2l0aW9uKHBhY2tlZFBvc2l0aW9uRm9yR3JvdXApKTsKLSAgICAgICAgfQotCi0gICAgICAgIGZvciAoaW50IGk9MDsgaTxtRXhwYW5kYWJsZUxpc3RWaWV3LmdldEZvb3RlclZpZXdzQ291bnQoKTsgaSsrKSB7Ci0gICAgICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCJOb24gTlVMTCBwb3NpdGlvbiBmb3IgaGVhZGVyIGl0ZW0iLAotICAgICAgICAgICAgICAgICAgICBFeHBhbmRhYmxlTGlzdFZpZXcuUEFDS0VEX1BPU0lUSU9OX1ZBTFVFX05VTEwsCi0gICAgICAgICAgICAgICAgICAgIG1FeHBhbmRhYmxlTGlzdFZpZXcuZ2V0RXhwYW5kYWJsZUxpc3RQb3NpdGlvbihoZWFkZXJDb3VudCArIGdyb3VwQ291bnQgKyBpKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBUaGlzIG1ldGhvZCBhc3N1bWVzIHRoYXQgTk8gZ3JvdXAgaXMgZXhwYW5kZWQgd2hlbiBjYWxsZWQKLSAgICB2b2lkIHRlc3RDb252ZXJ0aW9uQmV0d2VlbkZsYXRBbmRQYWNrZWRPbkNoaWxkcmVuKCkgewotICAgICAgICAvLyBUZXN0IHdpdGggYW4gZXhwYW5kZWQgZ3JvdXAKLSAgICAgICAgZmluYWwgaW50IGhlYWRlckNvdW50ID0gbUV4cGFuZGFibGVMaXN0Vmlldy5nZXRIZWFkZXJWaWV3c0NvdW50KCk7Ci0gICAgICAgIGZpbmFsIGludCBncm91cEluZGV4ID0gZXhwYW5kQUdyb3VwKCk7Ci0KLSAgICAgICAgZmluYWwgaW50IGNoaWxkcmVuQ291bnQgPSBtQWRhcHRlci5nZXRDaGlsZHJlbkNvdW50KGdyb3VwSW5kZXgpOwotICAgICAgICBmb3IgKGludCBjaGlsZEluZGV4ID0gMDsgY2hpbGRJbmRleCA8IGNoaWxkcmVuQ291bnQ7IGNoaWxkSW5kZXgrKykgewotICAgICAgICAgICAgaW50IGV4cGVjdGVkRmxhdFBvc2l0aW9uID0gaGVhZGVyQ291bnQgKyBncm91cEluZGV4ICsgMSArIGNoaWxkSW5kZXg7Ci0gICAgICAgICAgICBsb25nIGNoaWxkUG9zID0gRXhwYW5kYWJsZUxpc3RWaWV3LmdldFBhY2tlZFBvc2l0aW9uRm9yQ2hpbGQoZ3JvdXBJbmRleCwgY2hpbGRJbmRleCk7Ci0KLSAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIldyb25nIGZsYXQgcG9zaXRpb24gZm9yIGNoaWxkICIsCi0gICAgICAgICAgICAgICAgICAgIGNoaWxkUG9zLAotICAgICAgICAgICAgICAgICAgICBtRXhwYW5kYWJsZUxpc3RWaWV3LmdldEV4cGFuZGFibGVMaXN0UG9zaXRpb24oZXhwZWN0ZWRGbGF0UG9zaXRpb24pKTsKLQotICAgICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygiV3JvbmcgZmxhdCBwb3NpdGlvbiBmb3IgY2hpbGQgIiwKLSAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWRGbGF0UG9zaXRpb24sCi0gICAgICAgICAgICAgICAgICAgIG1FeHBhbmRhYmxlTGlzdFZpZXcuZ2V0RmxhdExpc3RQb3NpdGlvbihjaGlsZFBvcykpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8gVGhpcyBtZXRob2QgYXNzdW1lcyB0aGF0IE5PIGdyb3VwIGlzIGV4cGFuZGVkIHdoZW4gY2FsbGVkCi0gICAgdm9pZCB0ZXN0U2VsZWN0ZWRQb3NpdGlvbk9uR3JvdXBzKCkgewotICAgICAgICBpbnQgaW5kZXggPSAwOwotCi0gICAgICAgIC8vIFNjcm9sbGluZyBvbiBoZWFkZXIgZWxlbWVudHMgc2hvdWxkIG5vdCBnaXZlIGEgdmFsaWQgc2VsZWN0ZWQgcG9zaXRpb24uCi0gICAgICAgIGZvciAoaW50IGk9MDsgaTxtRXhwYW5kYWJsZUxpc3RWaWV3LmdldEhlYWRlclZpZXdzQ291bnQoKTsgaSsrKSB7Ci0gICAgICAgICAgICBtTGlzdFV0aWwuYXJyb3dTY3JvbGxUb1NlbGVjdGVkUG9zaXRpb24oaW5kZXgpOwotICAgICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygiSGVhZGVyIGl0ZW0gaXMgc2VsZWN0ZWQiLAotICAgICAgICAgICAgICAgICAgICBFeHBhbmRhYmxlTGlzdFZpZXcuUEFDS0VEX1BPU0lUSU9OX1ZBTFVFX05VTEwsCi0gICAgICAgICAgICAgICAgICAgIG1FeHBhbmRhYmxlTGlzdFZpZXcuZ2V0U2VsZWN0ZWRQb3NpdGlvbigpKTsKLSAgICAgICAgICAgIGluZGV4Kys7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBDaGVjayBzZWxlY3Rpb24gb24gZ3JvdXAgaXRlbXMKLSAgICAgICAgZmluYWwgaW50IGdyb3VwQ291bnQgPSBtQWRhcHRlci5nZXRHcm91cENvdW50KCk7Ci0gICAgICAgIGZvciAoaW50IGdyb3VwSW5kZXggPSAwOyBncm91cEluZGV4IDwgZ3JvdXBDb3VudDsgZ3JvdXBJbmRleCsrKSB7Ci0gICAgICAgICAgICBtTGlzdFV0aWwuYXJyb3dTY3JvbGxUb1NlbGVjdGVkUG9zaXRpb24oaW5kZXgpOwotICAgICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygiR3JvdXAgaXRlbSBpcyBub3Qgc2VsZWN0ZWQiLAotICAgICAgICAgICAgICAgICAgICBFeHBhbmRhYmxlTGlzdFZpZXcuZ2V0UGFja2VkUG9zaXRpb25Gb3JHcm91cChncm91cEluZGV4KSwKLSAgICAgICAgICAgICAgICAgICAgbUV4cGFuZGFibGVMaXN0Vmlldy5nZXRTZWxlY3RlZFBvc2l0aW9uKCkpOwotICAgICAgICAgICAgaW5kZXgrKzsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIFNjcm9sbGluZyBvbiBmb290ZXIgZWxlbWVudHMgc2hvdWxkIG5vdCBnaXZlIGEgdmFsaWQgc2VsZWN0ZWQgcG9zaXRpb24uCi0gICAgICAgIGZvciAoaW50IGk9MDsgaTxtRXhwYW5kYWJsZUxpc3RWaWV3LmdldEZvb3RlclZpZXdzQ291bnQoKTsgaSsrKSB7Ci0gICAgICAgICAgICBtTGlzdFV0aWwuYXJyb3dTY3JvbGxUb1NlbGVjdGVkUG9zaXRpb24oaW5kZXgpOwotICAgICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygiRm9vdGVyIGl0ZW0gaXMgc2VsZWN0ZWQiLAotICAgICAgICAgICAgICAgICAgICBFeHBhbmRhYmxlTGlzdFZpZXcuUEFDS0VEX1BPU0lUSU9OX1ZBTFVFX05VTEwsCi0gICAgICAgICAgICAgICAgICAgIG1FeHBhbmRhYmxlTGlzdFZpZXcuZ2V0U2VsZWN0ZWRQb3NpdGlvbigpKTsKLSAgICAgICAgICAgIGluZGV4Kys7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBUaGlzIG1ldGhvZCBhc3N1bWVzIHRoYXQgTk8gZ3JvdXAgaXMgZXhwYW5kZWQgd2hlbiBjYWxsZWQKLSAgICB2b2lkIHRlc3RTZWxlY3RlZFBvc2l0aW9uT25DaGlsZHJlbigpIHsKLSAgICAgICAgLy8gVGVzdCB3aXRoIGFuIGV4cGFuZGVkIGdyb3VwCi0gICAgICAgIGZpbmFsIGludCBoZWFkZXJDb3VudCA9IG1FeHBhbmRhYmxlTGlzdFZpZXcuZ2V0SGVhZGVyVmlld3NDb3VudCgpOwotICAgICAgICBmaW5hbCBpbnQgZ3JvdXBJbmRleCA9IGV4cGFuZEFHcm91cCgpOwotCi0gICAgICAgIGZpbmFsIGludCBjaGlsZHJlbkNvdW50ID0gbUFkYXB0ZXIuZ2V0Q2hpbGRyZW5Db3VudChncm91cEluZGV4KTsKLSAgICAgICAgZm9yIChpbnQgY2hpbGRJbmRleCA9IDA7IGNoaWxkSW5kZXggPCBjaGlsZHJlbkNvdW50OyBjaGlsZEluZGV4KyspIHsKLSAgICAgICAgICAgIGludCBjaGlsZEZsYXRQb3NpdGlvbiA9IGhlYWRlckNvdW50ICsgZ3JvdXBJbmRleCArIDEgKyBjaGlsZEluZGV4OwotICAgICAgICAgICAgbUxpc3RVdGlsLmFycm93U2Nyb2xsVG9TZWxlY3RlZFBvc2l0aW9uKGNoaWxkRmxhdFBvc2l0aW9uKTsKLSAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIkdyb3VwIGl0ZW0gaXMgbm90IHNlbGVjdGVkIiwKLSAgICAgICAgICAgICAgICAgICAgRXhwYW5kYWJsZUxpc3RWaWV3LmdldFBhY2tlZFBvc2l0aW9uRm9yQ2hpbGQoZ3JvdXBJbmRleCwgY2hpbGRJbmRleCksCi0gICAgICAgICAgICAgICAgICAgIG1FeHBhbmRhYmxlTGlzdFZpZXcuZ2V0U2VsZWN0ZWRQb3NpdGlvbigpKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL3dpZGdldC9leHBhbmRhYmxlbGlzdHZpZXcvRXhwYW5kYWJsZUxpc3RXaXRoSGVhZGVycy5qYXZhIGIvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvd2lkZ2V0L2V4cGFuZGFibGVsaXN0dmlldy9FeHBhbmRhYmxlTGlzdFdpdGhIZWFkZXJzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIyNTFjMWQuLjAwMDAwMDAKLS0tIGEvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvd2lkZ2V0L2V4cGFuZGFibGVsaXN0dmlldy9FeHBhbmRhYmxlTGlzdFdpdGhIZWFkZXJzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBhbmRyb2lkLndpZGdldC5leHBhbmRhYmxlbGlzdHZpZXc7Ci0KLWltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKLWltcG9ydCBhbmRyb2lkLnV0aWwuRXhwYW5kYWJsZUxpc3RTY2VuYXJpbzsKLWltcG9ydCBhbmRyb2lkLndpZGdldC5CdXR0b247Ci1pbXBvcnQgYW5kcm9pZC53aWRnZXQuRXhwYW5kYWJsZUxpc3RWaWV3OwotCi1wdWJsaWMgY2xhc3MgRXhwYW5kYWJsZUxpc3RXaXRoSGVhZGVycyBleHRlbmRzIEV4cGFuZGFibGVMaXN0U2NlbmFyaW8gewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludFtdIHNOdW1DaGlsZHJlbiA9IHsxLCA0LCAzLCAyLCA2fTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgc051bU9mSGVhZGVyc0FuZEZvb3RlcnMgPSAxMjsKLSAgICAKLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCBpbml0KEV4cGFuZGFibGVQYXJhbXMgcGFyYW1zKSB7Ci0gICAgICAgIHBhcmFtcy5zZXRTdGFja0Zyb21Cb3R0b20oZmFsc2UpCi0gICAgICAgICAgICAgICAgLnNldFN0YXJ0aW5nU2VsZWN0aW9uUG9zaXRpb24oLTEpCi0gICAgICAgICAgICAgICAgLnNldE51bUNoaWxkcmVuKHNOdW1DaGlsZHJlbikKLSAgICAgICAgICAgICAgICAuc2V0SXRlbVNjcmVlblNpemVGYWN0b3IoMC4xNCkKLSAgICAgICAgICAgICAgICAuc2V0Q29ubmVjdEFkYXB0ZXIoZmFsc2UpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIG9uQ3JlYXRlKEJ1bmRsZSBpY2ljbGUpIHsKLSAgICAgICAgc3VwZXIub25DcmVhdGUoaWNpY2xlKTsKLQotICAgICAgICBmaW5hbCBFeHBhbmRhYmxlTGlzdFZpZXcgZXhwYW5kYWJsZUxpc3RWaWV3ID0gZ2V0RXhwYW5kYWJsZUxpc3RWaWV3KCk7Ci0gICAgICAgIGV4cGFuZGFibGVMaXN0Vmlldy5zZXRJdGVtc0NhbkZvY3VzKHRydWUpOwotCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc051bU9mSGVhZGVyc0FuZEZvb3RlcnM7IGkrKykgewotICAgICAgICAgICAgQnV0dG9uIGhlYWRlciA9IG5ldyBCdXR0b24odGhpcyk7Ci0gICAgICAgICAgICBoZWFkZXIuc2V0VGV4dCgiSGVhZGVyIFZpZXcgIiArIGkpOwotICAgICAgICAgICAgZXhwYW5kYWJsZUxpc3RWaWV3LmFkZEhlYWRlclZpZXcoaGVhZGVyKTsKLSAgICAgICAgfQotCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc051bU9mSGVhZGVyc0FuZEZvb3RlcnM7IGkrKykgewotICAgICAgICAgICAgQnV0dG9uIGZvb3RlciA9IG5ldyBCdXR0b24odGhpcyk7Ci0gICAgICAgICAgICBmb290ZXIuc2V0VGV4dCgiRm9vdGVyIFZpZXcgIiArIGkpOwotICAgICAgICAgICAgZXhwYW5kYWJsZUxpc3RWaWV3LmFkZEZvb3RlclZpZXcoZm9vdGVyKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgLy8gU2V0IGFkYXB0ZXIgaGVyZSBBRlRFUiB3ZSBzZXQgaGVhZGVyIGFuZCBmb290ZXIgdmlld3MKLSAgICAgICAgc2V0QWRhcHRlcihleHBhbmRhYmxlTGlzdFZpZXcpOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIFRoZSBudW1iZXIgb2YgaGVhZGVycyAoYW5kIHRoZSBzYW1lIG51bWJlciBvZiBmb290ZXJzKQotICAgICAqLwotICAgIHB1YmxpYyBpbnQgZ2V0TnVtT2ZIZWFkZXJzQW5kRm9vdGVycygpIHsKLSAgICAgICAgcmV0dXJuIHNOdW1PZkhlYWRlcnNBbmRGb290ZXJzOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvd2lkZ2V0L2V4cGFuZGFibGVsaXN0dmlldy9FeHBhbmRhYmxlTGlzdFdpdGhIZWFkZXJzVGVzdC5qYXZhIGIvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvd2lkZ2V0L2V4cGFuZGFibGVsaXN0dmlldy9FeHBhbmRhYmxlTGlzdFdpdGhIZWFkZXJzVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNzRjODUzLi4wMDAwMDAwCi0tLSBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL3dpZGdldC9leHBhbmRhYmxlbGlzdHZpZXcvRXhwYW5kYWJsZUxpc3RXaXRoSGVhZGVyc1Rlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGFuZHJvaWQud2lkZ2V0LmV4cGFuZGFibGVsaXN0dmlldzsKLQotaW1wb3J0IGFuZHJvaWQudGVzdC5BY3Rpdml0eUluc3RydW1lbnRhdGlvblRlc3RDYXNlMjsKLWltcG9ydCBhbmRyb2lkLnRlc3Quc3VpdGVidWlsZGVyLmFubm90YXRpb24uTGFyZ2VUZXN0OwotaW1wb3J0IGFuZHJvaWQudGVzdC5zdWl0ZWJ1aWxkZXIuYW5ub3RhdGlvbi5NZWRpdW1UZXN0OwotaW1wb3J0IGFuZHJvaWQudXRpbC5MaXN0VXRpbDsKLWltcG9ydCBhbmRyb2lkLnZpZXcuS2V5RXZlbnQ7Ci1pbXBvcnQgYW5kcm9pZC53aWRnZXQuRXhwYW5kYWJsZUxpc3RWaWV3OwotCi1wdWJsaWMgY2xhc3MgRXhwYW5kYWJsZUxpc3RXaXRoSGVhZGVyc1Rlc3QgZXh0ZW5kcwotICAgICAgICBBY3Rpdml0eUluc3RydW1lbnRhdGlvblRlc3RDYXNlMjxFeHBhbmRhYmxlTGlzdFdpdGhIZWFkZXJzPiB7Ci0gICAgcHJpdmF0ZSBFeHBhbmRhYmxlTGlzdFZpZXcgbUV4cGFuZGFibGVMaXN0VmlldzsKLSAgICBwcml2YXRlIExpc3RVdGlsIG1MaXN0VXRpbDsKLSAgICAKLSAgICBwdWJsaWMgRXhwYW5kYWJsZUxpc3RXaXRoSGVhZGVyc1Rlc3QoKSB7Ci0gICAgICAgIHN1cGVyKEV4cGFuZGFibGVMaXN0V2l0aEhlYWRlcnMuY2xhc3MpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHN1cGVyLnNldFVwKCk7Ci0gICAgICAgIAotICAgICAgICBtRXhwYW5kYWJsZUxpc3RWaWV3ID0gZ2V0QWN0aXZpdHkoKS5nZXRFeHBhbmRhYmxlTGlzdFZpZXcoKTsKLSAgICAgICAgbUxpc3RVdGlsID0gbmV3IExpc3RVdGlsKG1FeHBhbmRhYmxlTGlzdFZpZXcsIGdldEluc3RydW1lbnRhdGlvbigpKTsKLSAgICB9Ci0gICAgCi0gICAgQE1lZGl1bVRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0UHJlY29uZGl0aW9ucygpIHsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChtRXhwYW5kYWJsZUxpc3RWaWV3KTsKLSAgICB9Ci0gICAgCi0gICAgQE1lZGl1bVRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0RXhwYW5kT25GaXJzdFBvc2l0aW9uKCkgewotICAgICAgICAvLyBTaG91bGQgYmUgYSBoZWFkZXIsIGFuZCBoZW5jZSB0aGUgZmlyc3QgZ3JvdXAgc2hvdWxkIE5PVCBoYXZlIGV4cGFuZGVkCi0gICAgICAgIG1MaXN0VXRpbC5hcnJvd1Njcm9sbFRvU2VsZWN0ZWRQb3NpdGlvbigwKTsKLSAgICAgICAgc2VuZEtleXMoS2V5RXZlbnQuS0VZQ09ERV9EUEFEX0NFTlRFUik7Ci0gICAgICAgIGdldEluc3RydW1lbnRhdGlvbigpLndhaXRGb3JJZGxlU3luYygpOwotICAgICAgICBhc3NlcnRGYWxzZShtRXhwYW5kYWJsZUxpc3RWaWV3LmlzR3JvdXBFeHBhbmRlZCgwKSk7Ci0gICAgfQotCi0gICAgQExhcmdlVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RFeHBhbmRPbkZpcnN0R3JvdXAoKSB7Ci0gICAgICAgIG1MaXN0VXRpbC5hcnJvd1Njcm9sbFRvU2VsZWN0ZWRQb3NpdGlvbihnZXRBY3Rpdml0eSgpLmdldE51bU9mSGVhZGVyc0FuZEZvb3RlcnMoKSk7Ci0gICAgICAgIHNlbmRLZXlzKEtleUV2ZW50LktFWUNPREVfRFBBRF9DRU5URVIpOwotICAgICAgICBnZXRJbnN0cnVtZW50YXRpb24oKS53YWl0Rm9ySWRsZVN5bmMoKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShtRXhwYW5kYWJsZUxpc3RWaWV3LmlzR3JvdXBFeHBhbmRlZCgwKSk7Ci0gICAgfQotCi0gICAgQExhcmdlVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RDb250ZXh0TWVudXMoKSB7Ci0gICAgICAgIEV4cGFuZGFibGVMaXN0VGVzdGVyIHRlc3RlciA9IG5ldyBFeHBhbmRhYmxlTGlzdFRlc3RlcihtRXhwYW5kYWJsZUxpc3RWaWV3LCB0aGlzKTsKLSAgICAgICAgdGVzdGVyLnRlc3RDb250ZXh0TWVudXMoKTsKLSAgICB9Ci0KLSAgICBATGFyZ2VUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdENvbnZlcnRpb25CZXR3ZWVuRmxhdEFuZFBhY2tlZCgpIHsKLSAgICAgICAgRXhwYW5kYWJsZUxpc3RUZXN0ZXIgdGVzdGVyID0gbmV3IEV4cGFuZGFibGVMaXN0VGVzdGVyKG1FeHBhbmRhYmxlTGlzdFZpZXcsIHRoaXMpOwotICAgICAgICB0ZXN0ZXIudGVzdENvbnZlcnRpb25CZXR3ZWVuRmxhdEFuZFBhY2tlZE9uR3JvdXBzKCk7Ci0gICAgICAgIHRlc3Rlci50ZXN0Q29udmVydGlvbkJldHdlZW5GbGF0QW5kUGFja2VkT25DaGlsZHJlbigpOwotICAgIH0KLQotICAgIEBMYXJnZVRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0U2VsZWN0ZWRQb3NpdGlvbigpIHsKLSAgICAgICAgRXhwYW5kYWJsZUxpc3RUZXN0ZXIgdGVzdGVyID0gbmV3IEV4cGFuZGFibGVMaXN0VGVzdGVyKG1FeHBhbmRhYmxlTGlzdFZpZXcsIHRoaXMpOwotICAgICAgICB0ZXN0ZXIudGVzdFNlbGVjdGVkUG9zaXRpb25Pbkdyb3VwcygpOwotICAgICAgICB0ZXN0ZXIudGVzdFNlbGVjdGVkUG9zaXRpb25PbkNoaWxkcmVuKCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvd2lkZ2V0L2V4cGFuZGFibGVsaXN0dmlldy9JbmZsYXRlZEV4cGFuZGFibGVMaXN0Vmlldy5qYXZhIGIvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvd2lkZ2V0L2V4cGFuZGFibGVsaXN0dmlldy9JbmZsYXRlZEV4cGFuZGFibGVMaXN0Vmlldy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNGM5ZDU2Li4wMDAwMDAwCi0tLSBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL3dpZGdldC9leHBhbmRhYmxlbGlzdHZpZXcvSW5mbGF0ZWRFeHBhbmRhYmxlTGlzdFZpZXcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBhbmRyb2lkLndpZGdldC5leHBhbmRhYmxlbGlzdHZpZXc7Ci0KLWltcG9ydCBjb20uYW5kcm9pZC5mcmFtZXdvcmtzLmNvcmV0ZXN0cy5SOwotCi1pbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHk7Ci1pbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LkdyYXZpdHk7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LlZpZXdHcm91cDsKLWltcG9ydCBhbmRyb2lkLndpZGdldC5BYnNMaXN0VmlldzsKLWltcG9ydCBhbmRyb2lkLndpZGdldC5CYXNlRXhwYW5kYWJsZUxpc3RBZGFwdGVyOwotaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkV4cGFuZGFibGVMaXN0VmlldzsKLWltcG9ydCBhbmRyb2lkLndpZGdldC5UZXh0VmlldzsKLQotcHVibGljIGNsYXNzIEluZmxhdGVkRXhwYW5kYWJsZUxpc3RWaWV3IGV4dGVuZHMgQWN0aXZpdHkgewotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgb25DcmVhdGUoQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgewotICAgICAgICBzdXBlci5vbkNyZWF0ZShzYXZlZEluc3RhbmNlU3RhdGUpOwotICAgICAgICAKLSAgICAgICAgc2V0Q29udGVudFZpZXcoUi5sYXlvdXQuaW5mbGF0ZWRfZXhwYW5kYWJsZWxpc3R2aWV3KTsKLSAgICAgICAgCi0gICAgICAgIEV4cGFuZGFibGVMaXN0VmlldyBlbHYgPSAoRXhwYW5kYWJsZUxpc3RWaWV3KSBmaW5kVmlld0J5SWQoUi5pZC5lbHYpOwotICAgICAgICBlbHYuc2V0QWRhcHRlcihuZXcgTXlFeHBhbmRhYmxlTGlzdEFkYXB0ZXIoKSk7Ci0gICAgfQotCi0gICAgcHVibGljIGNsYXNzIE15RXhwYW5kYWJsZUxpc3RBZGFwdGVyIGV4dGVuZHMgQmFzZUV4cGFuZGFibGVMaXN0QWRhcHRlciB7Ci0gICAgICAgIC8vIFNhbXBsZSBkYXRhIHNldC4gIGNoaWxkcmVuW2ldIGNvbnRhaW5zIHRoZSBjaGlsZHJlbiAoU3RyaW5nW10pIGZvciBncm91cHNbaV0uCi0gICAgICAgIHByaXZhdGUgU3RyaW5nW10gZ3JvdXBzID0geyAiUGVvcGxlIE5hbWVzIiwgIkRvZyBOYW1lcyIsICJDYXQgTmFtZXMiLCAiRmlzaCBOYW1lcyIgfTsKLSAgICAgICAgcHJpdmF0ZSBTdHJpbmdbXVtdIGNoaWxkcmVuID0gewotICAgICAgICAgICAgICAgIHsgIkFybm9sZCIsICJCYXJyeSIsICJDaHVjayIsICJEYXZpZCIgfSwKLSAgICAgICAgICAgICAgICB7ICJBY2UiLCAiQmFuZGl0IiwgIkNoYS1DaGEiLCAiRGV1Y2UiIH0sCi0gICAgICAgICAgICAgICAgeyAiRmx1ZmZ5IiwgIlNudWdnbGVzIiB9LAotICAgICAgICAgICAgICAgIHsgIkdvbGR5IiwgIkJ1YmJsZXMiIH0KLSAgICAgICAgfTsKLSAgICAgICAgCi0gICAgICAgIHB1YmxpYyBPYmplY3QgZ2V0Q2hpbGQoaW50IGdyb3VwUG9zaXRpb24sIGludCBjaGlsZFBvc2l0aW9uKSB7Ci0gICAgICAgICAgICByZXR1cm4gY2hpbGRyZW5bZ3JvdXBQb3NpdGlvbl1bY2hpbGRQb3NpdGlvbl07Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgbG9uZyBnZXRDaGlsZElkKGludCBncm91cFBvc2l0aW9uLCBpbnQgY2hpbGRQb3NpdGlvbikgewotICAgICAgICAgICAgcmV0dXJuIGNoaWxkUG9zaXRpb247Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgaW50IGdldENoaWxkcmVuQ291bnQoaW50IGdyb3VwUG9zaXRpb24pIHsKLSAgICAgICAgICAgIHJldHVybiBjaGlsZHJlbltncm91cFBvc2l0aW9uXS5sZW5ndGg7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgVGV4dFZpZXcgZ2V0R2VuZXJpY1ZpZXcoKSB7Ci0gICAgICAgICAgICAvLyBMYXlvdXQgcGFyYW1ldGVycyBmb3IgdGhlIEV4cGFuZGFibGVMaXN0VmlldwotICAgICAgICAgICAgQWJzTGlzdFZpZXcuTGF5b3V0UGFyYW1zIGxwID0gbmV3IEFic0xpc3RWaWV3LkxheW91dFBhcmFtcygKLSAgICAgICAgICAgICAgICAgICAgVmlld0dyb3VwLkxheW91dFBhcmFtcy5NQVRDSF9QQVJFTlQsIDY0KTsKLQotICAgICAgICAgICAgVGV4dFZpZXcgdGV4dFZpZXcgPSBuZXcgVGV4dFZpZXcoSW5mbGF0ZWRFeHBhbmRhYmxlTGlzdFZpZXcudGhpcyk7Ci0gICAgICAgICAgICB0ZXh0Vmlldy5zZXRMYXlvdXRQYXJhbXMobHApOwotICAgICAgICAgICAgLy8gQ2VudGVyIHRoZSB0ZXh0IHZlcnRpY2FsbHkKLSAgICAgICAgICAgIHRleHRWaWV3LnNldEdyYXZpdHkoR3Jhdml0eS5DRU5URVJfVkVSVElDQUwgfCBHcmF2aXR5LkxFRlQpOwotICAgICAgICAgICAgLy8gU2V0IHRoZSB0ZXh0IHN0YXJ0aW5nIHBvc2l0aW9uCi0gICAgICAgICAgICB0ZXh0Vmlldy5zZXRQYWRkaW5nKDM2LCAwLCAwLCAwKTsKLSAgICAgICAgICAgIHJldHVybiB0ZXh0VmlldzsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcHVibGljIFZpZXcgZ2V0Q2hpbGRWaWV3KGludCBncm91cFBvc2l0aW9uLCBpbnQgY2hpbGRQb3NpdGlvbiwgYm9vbGVhbiBpc0xhc3RDaGlsZCwKLSAgICAgICAgICAgICAgICBWaWV3IGNvbnZlcnRWaWV3LCBWaWV3R3JvdXAgcGFyZW50KSB7Ci0gICAgICAgICAgICBUZXh0VmlldyB0ZXh0VmlldyA9IGdldEdlbmVyaWNWaWV3KCk7Ci0gICAgICAgICAgICB0ZXh0Vmlldy5zZXRUZXh0KGdldENoaWxkKGdyb3VwUG9zaXRpb24sIGNoaWxkUG9zaXRpb24pLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgcmV0dXJuIHRleHRWaWV3OwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIE9iamVjdCBnZXRHcm91cChpbnQgZ3JvdXBQb3NpdGlvbikgewotICAgICAgICAgICAgcmV0dXJuIGdyb3Vwc1tncm91cFBvc2l0aW9uXTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBpbnQgZ2V0R3JvdXBDb3VudCgpIHsKLSAgICAgICAgICAgIHJldHVybiBncm91cHMubGVuZ3RoOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGxvbmcgZ2V0R3JvdXBJZChpbnQgZ3JvdXBQb3NpdGlvbikgewotICAgICAgICAgICAgcmV0dXJuIGdyb3VwUG9zaXRpb247Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgVmlldyBnZXRHcm91cFZpZXcoaW50IGdyb3VwUG9zaXRpb24sIGJvb2xlYW4gaXNFeHBhbmRlZCwgVmlldyBjb252ZXJ0VmlldywKLSAgICAgICAgICAgICAgICBWaWV3R3JvdXAgcGFyZW50KSB7Ci0gICAgICAgICAgICBUZXh0VmlldyB0ZXh0VmlldyA9IGdldEdlbmVyaWNWaWV3KCk7Ci0gICAgICAgICAgICB0ZXh0Vmlldy5zZXRUZXh0KGdldEdyb3VwKGdyb3VwUG9zaXRpb24pLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgcmV0dXJuIHRleHRWaWV3OwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGJvb2xlYW4gaXNDaGlsZFNlbGVjdGFibGUoaW50IGdyb3VwUG9zaXRpb24sIGludCBjaGlsZFBvc2l0aW9uKSB7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGhhc1N0YWJsZUlkcygpIHsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0KLSAgICB9Ci0gICAgCi19CmRpZmYgLS1naXQgYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC93aWRnZXQvZXhwYW5kYWJsZWxpc3R2aWV3L1Bvc2l0aW9uVGVzdGVyQ29udGV4dE1lbnVMaXN0ZW5lci5qYXZhIGIvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvd2lkZ2V0L2V4cGFuZGFibGVsaXN0dmlldy9Qb3NpdGlvblRlc3RlckNvbnRleHRNZW51TGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmRiZGZmOC4uMDAwMDAwMAotLS0gYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC93aWRnZXQvZXhwYW5kYWJsZWxpc3R2aWV3L1Bvc2l0aW9uVGVzdGVyQ29udGV4dE1lbnVMaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTExICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGFuZHJvaWQud2lkZ2V0LmV4cGFuZGFibGVsaXN0dmlldzsKLQotaW1wb3J0IGFuZHJvaWQudmlldy5Db250ZXh0TWVudTsKLWltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKLWltcG9ydCBhbmRyb2lkLnZpZXcuQ29udGV4dE1lbnUuQ29udGV4dE1lbnVJbmZvOwotaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3Lk9uQ3JlYXRlQ29udGV4dE1lbnVMaXN0ZW5lcjsKLWltcG9ydCBhbmRyb2lkLndpZGdldC5FeHBhbmRhYmxlTGlzdFZpZXc7Ci1pbXBvcnQgYW5kcm9pZC53aWRnZXQuQWRhcHRlclZpZXcuQWRhcHRlckNvbnRleHRNZW51SW5mbzsKLQotcHVibGljIGNsYXNzIFBvc2l0aW9uVGVzdGVyQ29udGV4dE1lbnVMaXN0ZW5lciBpbXBsZW1lbnRzIE9uQ3JlYXRlQ29udGV4dE1lbnVMaXN0ZW5lciB7Ci0KLSAgICBwcml2YXRlIGludCBncm91cFBvc2l0aW9uLCBjaGlsZFBvc2l0aW9uOwotCi0gICAgLy8gRmFrZSBjb25zdGFudCB0byBzdG9yZSBpbiB0ZXN0VHlwZSBhIHRlc3QgdHlwZSBzcGVjaWZpYyB0byBoZWFkZXJzIGFuZCBmb290ZXJzCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEFEQVBURVJfVFlQRSA9IC0xOwotICAgIHByaXZhdGUgaW50IHRlc3RUeXBlOyAvLyBhcyByZXR1cm5lZCBieSBnZXRQYWNrZWRQb3NpdGlvblR5cGUKLQotICAgIC8vIFdpbGwgYmUgc2V0IHRvIG51bGwgYnkgZWFjaCBjYWxsIHRvIG9uQ3JlYXRlQ29udGV4dE1lbnUsIHVubGVzcyBhbiBlcnJvciBvY2N1cnJlZC4gCi0gICAgcHJpdmF0ZSBTdHJpbmcgZXJyb3JNZXNzYWdlOwotCi0gICAgcHVibGljIHZvaWQgZXhwZWN0R3JvdXBDb250ZXh0TWVudShpbnQgZ3JvdXBQb3NpdGlvbikgewotICAgICAgICB0aGlzLmdyb3VwUG9zaXRpb24gPSBncm91cFBvc2l0aW9uOwotICAgICAgICB0ZXN0VHlwZSA9IEV4cGFuZGFibGVMaXN0Vmlldy5QQUNLRURfUE9TSVRJT05fVFlQRV9HUk9VUDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBleHBlY3RDaGlsZENvbnRleHRNZW51KGludCBncm91cFBvc2l0aW9uLCBpbnQgY2hpbGRQb3NpdGlvbikgewotICAgICAgICB0aGlzLmdyb3VwUG9zaXRpb24gPSBncm91cFBvc2l0aW9uOwotICAgICAgICB0aGlzLmNoaWxkUG9zaXRpb24gPSBjaGlsZFBvc2l0aW9uOwotICAgICAgICB0ZXN0VHlwZSA9IEV4cGFuZGFibGVMaXN0Vmlldy5QQUNLRURfUE9TSVRJT05fVFlQRV9DSElMRDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBleHBlY3RBZGFwdGVyQ29udGV4dE1lbnUoaW50IGZsYXRQb3NpdGlvbikgewotICAgICAgICB0aGlzLmdyb3VwUG9zaXRpb24gPSBmbGF0UG9zaXRpb247Ci0gICAgICAgIHRlc3RUeXBlID0gQURBUFRFUl9UWVBFOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIG9uQ3JlYXRlQ29udGV4dE1lbnUoQ29udGV4dE1lbnUgbWVudSwgVmlldyB2LCBDb250ZXh0TWVudUluZm8gbWVudUluZm8pIHsKLSAgICAgICAgZXJyb3JNZXNzYWdlID0gbnVsbDsKLSAgICAgICAgaWYgKHRlc3RUeXBlID09IEFEQVBURVJfVFlQRSkgewotICAgICAgICAgICAgaWYgKCFpc1RydWUoIk1lbnVJbmZvIGlzIG5vdCBhbiBBZGFwdGVyQ29udGV4dE1lbnVJbmZvIiwKLSAgICAgICAgICAgICAgICAgICAgbWVudUluZm8gaW5zdGFuY2VvZiBBZGFwdGVyQ29udGV4dE1lbnVJbmZvKSkgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIEFkYXB0ZXJDb250ZXh0TWVudUluZm8gYWRhcHRlckNvbnRleHRNZW51SW5mbyA9IChBZGFwdGVyQ29udGV4dE1lbnVJbmZvKSBtZW51SW5mbzsKLSAgICAgICAgICAgIGlmICghYXJlRXF1YWwoIldyb25nIGZsYXQgcG9zaXRpb24iLCBncm91cFBvc2l0aW9uLCBhZGFwdGVyQ29udGV4dE1lbnVJbmZvLnBvc2l0aW9uKSkgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGlmICghaXNUcnVlKCJNZW51SW5mbyBpcyBub3QgYW4gRXhwYW5kYWJsZUxpc3RDb250ZXh0TWVudUluZm8iLAotICAgICAgICAgICAgICAgICAgICBtZW51SW5mbyBpbnN0YW5jZW9mIEV4cGFuZGFibGVMaXN0Vmlldy5FeHBhbmRhYmxlTGlzdENvbnRleHRNZW51SW5mbykpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBFeHBhbmRhYmxlTGlzdFZpZXcuRXhwYW5kYWJsZUxpc3RDb250ZXh0TWVudUluZm8gZWx2TWVudUluZm8gPQotICAgICAgICAgICAgICAgIChFeHBhbmRhYmxlTGlzdFZpZXcuRXhwYW5kYWJsZUxpc3RDb250ZXh0TWVudUluZm8pIG1lbnVJbmZvOwotICAgICAgICAgICAgbG9uZyBwYWNrZWRQb3NpdGlvbiA9IGVsdk1lbnVJbmZvLnBhY2tlZFBvc2l0aW9uOwotCi0gICAgICAgICAgICBpbnQgcGFja2VkUG9zaXRpb25UeXBlID0gRXhwYW5kYWJsZUxpc3RWaWV3LmdldFBhY2tlZFBvc2l0aW9uVHlwZShwYWNrZWRQb3NpdGlvbik7Ci0gICAgICAgICAgICBpZiAoIWFyZUVxdWFsKCJXcm9uZyBwYWNrZWQgcG9zaXRpb24gdHlwZSIsIHRlc3RUeXBlLCBwYWNrZWRQb3NpdGlvblR5cGUpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpbnQgcGFja2VkUG9zaXRpb25Hcm91cCA9IEV4cGFuZGFibGVMaXN0Vmlldy5nZXRQYWNrZWRQb3NpdGlvbkdyb3VwKHBhY2tlZFBvc2l0aW9uKTsKLSAgICAgICAgICAgIGlmICghYXJlRXF1YWwoIldyb25nIGdyb3VwIHBvc2l0aW9uIiwgZ3JvdXBQb3NpdGlvbiwgcGFja2VkUG9zaXRpb25Hcm91cCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmICh0ZXN0VHlwZSA9PSBFeHBhbmRhYmxlTGlzdFZpZXcuUEFDS0VEX1BPU0lUSU9OX1RZUEVfQ0hJTEQpIHsKLSAgICAgICAgICAgICAgICBpbnQgcGFja2VkUG9zaXRpb25DaGlsZCA9IEV4cGFuZGFibGVMaXN0Vmlldy5nZXRQYWNrZWRQb3NpdGlvbkNoaWxkKHBhY2tlZFBvc2l0aW9uKTsKLSAgICAgICAgICAgICAgICBpZiAoIWFyZUVxdWFsKCJXcm9uZyBjaGlsZCBwb3NpdGlvbiIsIGNoaWxkUG9zaXRpb24sIHBhY2tlZFBvc2l0aW9uQ2hpbGQpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gYXJlRXF1YWwoU3RyaW5nIG1lc3NhZ2UsIGludCBleHBlY3RlZCwgaW50IGFjdHVhbCkgewotICAgICAgICBpZiAoZXhwZWN0ZWQgIT0gYWN0dWFsKSB7Ci0gICAgICAgICAgICBlcnJvck1lc3NhZ2UgPSBTdHJpbmcuZm9ybWF0KG1lc3NhZ2UgKyAiICglZCB2cyAlZCIsIGV4cGVjdGVkLCBhY3R1YWwpOwotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIHByaXZhdGUgYm9vbGVhbiBpc1RydWUoU3RyaW5nIG1lc3NhZ2UsIGJvb2xlYW4gdmFsdWUpIHsKLSAgICAgICAgaWYgKCF2YWx1ZSkgewotICAgICAgICAgICAgZXJyb3JNZXNzYWdlID0gbWVzc2FnZTsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEVycm9yTWVzc2FnZSgpIHsKLSAgICAgICAgcmV0dXJuIGVycm9yTWVzc2FnZTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9jb3JlL3Rlc3RzL2hvc3R0ZXN0cy9zcmMvYW5kcm9pZC9jb250ZW50L3BtL1BhY2thZ2VNYW5hZ2VySG9zdFRlc3RVdGlscy5qYXZhIGIvY29yZS90ZXN0cy9ob3N0dGVzdHMvc3JjL2FuZHJvaWQvY29udGVudC9wbS9QYWNrYWdlTWFuYWdlckhvc3RUZXN0VXRpbHMuamF2YQppbmRleCAwOWUzYmNjLi4wZjczNTFhIDEwMDY0NAotLS0gYS9jb3JlL3Rlc3RzL2hvc3R0ZXN0cy9zcmMvYW5kcm9pZC9jb250ZW50L3BtL1BhY2thZ2VNYW5hZ2VySG9zdFRlc3RVdGlscy5qYXZhCisrKyBiL2NvcmUvdGVzdHMvaG9zdHRlc3RzL3NyYy9hbmRyb2lkL2NvbnRlbnQvcG0vUGFja2FnZU1hbmFnZXJIb3N0VGVzdFV0aWxzLmphdmEKQEAgLTE1Miw3ICsxNTIsMTEgQEAKICAgICAgICAgfQogCiAgICAgICAgIENvbGxlY3RpbmdUZXN0UnVuTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgQ29sbGVjdGluZ1Rlc3RSdW5MaXN0ZW5lcigpOwotICAgICAgICB0ZXN0UnVubmVyLnJ1bihsaXN0ZW5lcik7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICB0ZXN0UnVubmVyLnJ1bihsaXN0ZW5lcik7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkgeworICAgICAgICAgICAgTG9nLncoTE9HX1RBRywgImVuY291bnRlcmVkIElPRXhjZXB0aW9uICIgKyBpb2UpOworICAgICAgICB9CiAgICAgICAgIHJldHVybiBsaXN0ZW5lcjsKICAgICB9CiAKZGlmZiAtLWdpdCBhL2RhdGEvZXRjL2FuZHJvaWQuaGFyZHdhcmUuc2Vuc29yLmJhcm9tZXRlci54bWwgYi9kYXRhL2V0Yy9hbmRyb2lkLmhhcmR3YXJlLnNlbnNvci5iYXJvbWV0ZXIueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmViZDM5MmQKLS0tIC9kZXYvbnVsbAorKysgYi9kYXRhL2V0Yy9hbmRyb2lkLmhhcmR3YXJlLnNlbnNvci5iYXJvbWV0ZXIueG1sCkBAIC0wLDAgKzEsMjAgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgIAorICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8IS0tIEZlYXR1cmUgZm9yIGRldmljZXMgd2l0aCBiYXJvbWV0ZXIuIC0tPgorPHBlcm1pc3Npb25zPgorICAgIDxmZWF0dXJlIG5hbWU9ImFuZHJvaWQuaGFyZHdhcmUuc2Vuc29yLmJhcm9tZXRlciIgLz4KKzwvcGVybWlzc2lvbnM+CmRpZmYgLS1naXQgYS9kYXRhL2V0Yy9hbmRyb2lkLmhhcmR3YXJlLnNlbnNvci5neXJvc2NvcGUueG1sIGIvZGF0YS9ldGMvYW5kcm9pZC5oYXJkd2FyZS5zZW5zb3IuZ3lyb3Njb3BlLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZTc5NjMyCi0tLSAvZGV2L251bGwKKysrIGIvZGF0YS9ldGMvYW5kcm9pZC5oYXJkd2FyZS5zZW5zb3IuZ3lyb3Njb3BlLnhtbApAQCAtMCwwICsxLDIwIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICAKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPCEtLSBGZWF0dXJlIGZvciBkZXZpY2VzIHdpdGggZ3lyb3Njb3BlLiAtLT4KKzxwZXJtaXNzaW9ucz4KKyAgICA8ZmVhdHVyZSBuYW1lPSJhbmRyb2lkLmhhcmR3YXJlLnNlbnNvci5neXJvc2NvcGUiIC8+Cis8L3Blcm1pc3Npb25zPgpkaWZmIC0tZ2l0IGEvZGF0YS9ldGMvcGxhdGZvcm0ueG1sIGIvZGF0YS9ldGMvcGxhdGZvcm0ueG1sCmluZGV4IDZmOGFmZmYuLjQzOWZjOTAgMTAwNjQ0Ci0tLSBhL2RhdGEvZXRjL3BsYXRmb3JtLnhtbAorKysgYi9kYXRhL2V0Yy9wbGF0Zm9ybS54bWwKQEAgLTU4LDYgKzU4LDEwIEBACiAgICAgICAgIDxncm91cCBnaWQ9InNkY2FyZF9ydyIgLz4KICAgICA8L3Blcm1pc3Npb24+CiAKKyAgICA8cGVybWlzc2lvbiBuYW1lPSJhbmRyb2lkLnBlcm1pc3Npb24uQUNDRVNTX1VTQiIgPgorICAgICAgICA8Z3JvdXAgZ2lkPSJ1c2IiIC8+CisgICAgPC9wZXJtaXNzaW9uPgorCiAgICAgPCEtLSBUaGUgZ3JvdXAgdGhhdCAvY2FjaGUgYmVsb25ncyB0bywgbGlua2VkIHRvIHRoZSBwZXJtaXNzaW9uCiAgICAgICAgICBzZXQgb24gdGhlIGFwcGxpY2F0aW9ucyB0aGF0IGNhbiBhY2Nlc3MgL2NhY2hlIC0tPgogICAgIDxwZXJtaXNzaW9uIG5hbWU9ImFuZHJvaWQucGVybWlzc2lvbi5BQ0NFU1NfQ0FDSEVfRklMRVNZU1RFTSIgPgpkaWZmIC0tZ2l0IGEvZGF0YS9ldGMvdGFibGV0X2NvcmVfaGFyZHdhcmUueG1sIGIvZGF0YS9ldGMvdGFibGV0X2NvcmVfaGFyZHdhcmUueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk1MmQwNzgKLS0tIC9kZXYvbnVsbAorKysgYi9kYXRhL2V0Yy90YWJsZXRfY29yZV9oYXJkd2FyZS54bWwKQEAgLTAsMCArMSw1MyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAgCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgIAorICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzwhLS0gVGhlc2UgYXJlIHRoZSBoYXJkd2FyZSBjb21wb25lbnRzIHRoYXQgYWxsIGhhbmRoZWxkIGRldmljZXMKKyAgICAgbXVzdCBpbmNsdWRlLiBEZXZpY2VzIHdpdGggb3B0aW9uYWwgaGFyZHdhcmUgbXVzdCBhbHNvIGluY2x1ZGUgZXh0cmEKKyAgICAgaGFyZHdhcmUgZmlsZXMsIHBlciB0aGUgY29tbWVudHMgYmVsb3cuCisKKyAgICAgSGFuZGhlbGQgZGV2aWNlcyBpbmNsdWRlIHBob25lcywgbW9iaWxlIEludGVybmV0IGRldmljZXMgKE1JRHMpLAorICAgICBQZXJzb25hbCBNZWRpYSBQbGF5ZXJzIChQTVBzKSwgc21hbGwgdGFibGV0cyAoNyIgb3IgbGVzcyksIGFuZCBzaW1pbGFyCisgICAgIGRldmljZXMuCistLT4KKzxwZXJtaXNzaW9ucz4KKyAgICA8ZmVhdHVyZSBuYW1lPSJhbmRyb2lkLmhhcmR3YXJlLmxvY2F0aW9uIiAvPgorICAgIDxmZWF0dXJlIG5hbWU9ImFuZHJvaWQuaGFyZHdhcmUubG9jYXRpb24ubmV0d29yayIgLz4KKyAgICA8ZmVhdHVyZSBuYW1lPSJhbmRyb2lkLmhhcmR3YXJlLnNlbnNvci5jb21wYXNzIiAvPgorICAgIDxmZWF0dXJlIG5hbWU9ImFuZHJvaWQuaGFyZHdhcmUuc2Vuc29yLmFjY2VsZXJvbWV0ZXIiIC8+CisgICAgPGZlYXR1cmUgbmFtZT0iYW5kcm9pZC5oYXJkd2FyZS5ibHVldG9vdGgiIC8+CisgICAgPGZlYXR1cmUgbmFtZT0iYW5kcm9pZC5oYXJkd2FyZS50b3VjaHNjcmVlbiIgLz4KKyAgICA8ZmVhdHVyZSBuYW1lPSJhbmRyb2lkLmhhcmR3YXJlLnRvdWNoc2NyZWVuLm11bHRpdG91Y2giIC8+CisgICAgPGZlYXR1cmUgbmFtZT0iYW5kcm9pZC5oYXJkd2FyZS50b3VjaHNjcmVlbi5tdWx0aXRvdWNoLmRpc3RpbmN0IiAvPgorICAgIDxmZWF0dXJlIG5hbWU9ImFuZHJvaWQuaGFyZHdhcmUubWljcm9waG9uZSIgLz4KKyAgICA8IS0tIGRldmljZXMgd2l0aCBHUFMgbXVzdCBpbmNsdWRlIGFuZHJvaWQuaGFyZHdhcmUubG9jYXRpb24uZ3BzLnhtbCAtLT4KKyAgICA8IS0tIGRldmljZXMgd2l0aCBhIHJlYXItZmFjaW5nIGNhbWVyYSBtdXN0IGluY2x1ZGUgb25lIG9mIHRoZXNlIGFzIGFwcHJvcHJpYXRlOgorICAgICAgICAgYW5kcm9pZC5oYXJkd2FyZS5jYW1lcmEueG1sIG9yIAorICAgICAgICAgYW5kcm9pZC5oYXJkd2FyZS5jYW1lcmEuYXV0b2ZvY3VzLnhtbCBvciAKKyAgICAgICAgIGFuZHJvaWQuaGFyZHdhcmUuY2FtZXJhLmF1dG9mb2N1cy1mbGFzaC54bWwgLS0+CisgICAgPCEtLSBkZXZpY2VzIHdpdGggYSBmcm9udCBmYWNpbmcgY2FtZXJhIG11c3QgaW5jbHVkZQorICAgICAgICAgYW5kcm9pZC5oYXJkd2FyZS5jYW1lcmEuZnJvbnQueG1sIC0tPgorICAgIDwhLS0gZGV2aWNlcyB3aXRoIFdpRmkgbXVzdCBhbHNvIGluY2x1ZGUgYW5kcm9pZC5oYXJkd2FyZS53aWZpLnhtbCAtLT4KKyAgICA8IS0tIGRldmljZXMgd2l0aCBhbiBhbWJpZW50IGxpZ2h0IHNlbnNvciBtdXN0IGFsc28gaW5jbHVkZQorICAgICAgICAgYW5kcm9pZC5oYXJkd2FyZS5zZW5zb3IubGlnaHQueG1sIC0tPgorICAgIDwhLS0gZGV2aWNlcyB3aXRoIGEgcHJveGltaXR5IHNlbnNvciBtdXN0IGFsc28gaW5jbHVkZQorICAgICAgICAgYW5kcm9pZC5oYXJkd2FyZS5zZW5zb3IucHJveGltaXR5LnhtbCAtLT4KKyAgICA8IS0tIGRldmljZXMgd2l0aCBhIGJhcm9tZXRlciBtdXN0IGFsc28gaW5jbHVkZQorICAgICAgICAgYW5kcm9pZC5oYXJkd2FyZS5zZW5zb3IuYmFyb21ldGVyLnhtbCAtLT4KKyAgICA8IS0tIGRldmljZXMgd2l0aCBhIGd5cm9zY29wZSBtdXN0IGFsc28gaW5jbHVkZQorICAgICAgICAgYW5kcm9pZC5oYXJkd2FyZS5zZW5zb3IuZ3lyb3Njb3BlLnhtbCAtLT4KKyAgICA8IS0tIEdTTSBwaG9uZXMgbXVzdCBhbHNvIGluY2x1ZGUgYW5kcm9pZC5oYXJkd2FyZS50ZWxlcGhvbnkuZ3NtLnhtbCAtLT4KKyAgICA8IS0tIENETUEgcGhvbmVzIG11c3QgYWxzbyBpbmNsdWRlIGFuZHJvaWQuaGFyZHdhcmUudGVsZXBob255LmNkbWEueG1sIC0tPgorPC9wZXJtaXNzaW9ucz4KZGlmZiAtLWdpdCBhL2RhdGEvZm9udHMvQW5kcm9pZC5tayBiL2RhdGEvZm9udHMvQW5kcm9pZC5tawpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGM0MDY0Ni4uMDAwMDAwMAotLS0gYS9kYXRhL2ZvbnRzL0FuZHJvaWQubWsKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi0jIENvcHlyaWdodCAoQykgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0jCi0jIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0jIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0jIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0jIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0jIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1MT0NBTF9QQVRIOj0gJChjYWxsIG15LWRpcikKLWluY2x1ZGUgJChDTEVBUl9WQVJTKQotCi1jb3B5X2Zyb20gOj0gICAgICAgICAgICAgICAgXAotICAgIERyb2lkU2Fucy50dGYgICAgICAgICAgIFwKLSAgICBEcm9pZFNhbnMtQm9sZC50dGYgICAgICBcCi0gICAgRHJvaWRTYW5zQXJhYmljLnR0ZiAgICAgXAotICAgIERyb2lkU2Fuc0hlYnJldy50dGYgICAgIFwKLSAgICBEcm9pZFNhbnNUaGFpLnR0ZiAgICAgICBcCi0gICAgRHJvaWRTZXJpZi1SZWd1bGFyLnR0ZiAgXAotICAgIERyb2lkU2VyaWYtQm9sZC50dGYgICAgIFwKLSAgICBEcm9pZFNlcmlmLUl0YWxpYy50dGYgICBcCi0gICAgRHJvaWRTZXJpZi1Cb2xkSXRhbGljLnR0ZiAgIFwKLSAgICBEcm9pZFNhbnNNb25vLnR0ZiAgICAgICAgXAotICAgIENsb2Nrb3BpYS50dGYKLQotaWZuZXEgKCQoTk9fRkFMTEJBQ0tfRk9OVCksdHJ1ZSkKLWlmZXEgKCQoZmlsdGVyICVzeXN0ZW0vZm9udHMvRHJvaWRTYW5zRmFsbGJhY2sudHRmLCQoUFJPRFVDVF9DT1BZX0ZJTEVTKSksKQotICAgICMgaWYgdGhlIHByb2R1Y3QgbWFrZWZpbGUgaGFzIHNldCB0aGUgdGhlIGZhbGxiYWNrIGZvbnQsIGRvbid0IG92ZXJyaWRlIGl0LgotICAgIGNvcHlfZnJvbSArPSBEcm9pZFNhbnNGYWxsYmFjay50dGYKLWVuZGlmCi1lbmRpZgotCi1jb3B5X2ZpbGVfcGFpcnMgOj0gJChmb3JlYWNoIGNmLCQoY29weV9mcm9tKSwkKExPQ0FMX1BBVEgpLyQoY2YpOnN5c3RlbS9mb250cy8kKGNmKSkKLVBST0RVQ1RfQ09QWV9GSUxFUyArPSAkKGNvcHlfZmlsZV9wYWlycykKZGlmZiAtLWdpdCBhL2RhdGEvZm9udHMvZm9udHMubWsgYi9kYXRhL2ZvbnRzL2ZvbnRzLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM0ZDAzMzEKLS0tIC9kZXYvbnVsbAorKysgYi9kYXRhL2ZvbnRzL2ZvbnRzLm1rCkBAIC0wLDAgKzEsMjkgQEAKKyMgQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyMgV2FybmluZzogdGhpcyBpcyBhY3R1YWxseSBhIHByb2R1Y3QgZGVmaW5pdGlvbiwgdG8gYmUgaW5oZXJpdGVkIGZyb20KKworUFJPRFVDVF9DT1BZX0ZJTEVTIDo9IFwKKyAgICBmcmFtZXdvcmtzL2Jhc2UvZGF0YS9mb250cy9Ecm9pZFNhbnMudHRmOnN5c3RlbS9mb250cy9Ecm9pZFNhbnMudHRmIFwKKyAgICBmcmFtZXdvcmtzL2Jhc2UvZGF0YS9mb250cy9Ecm9pZFNhbnMtQm9sZC50dGY6c3lzdGVtL2ZvbnRzL0Ryb2lkU2Fucy1Cb2xkLnR0ZiBcCisgICAgZnJhbWV3b3Jrcy9iYXNlL2RhdGEvZm9udHMvRHJvaWRTYW5zQXJhYmljLnR0ZjpzeXN0ZW0vZm9udHMvRHJvaWRTYW5zQXJhYmljLnR0ZiBcCisgICAgZnJhbWV3b3Jrcy9iYXNlL2RhdGEvZm9udHMvRHJvaWRTYW5zSGVicmV3LnR0ZjpzeXN0ZW0vZm9udHMvRHJvaWRTYW5zSGVicmV3LnR0ZiBcCisgICAgZnJhbWV3b3Jrcy9iYXNlL2RhdGEvZm9udHMvRHJvaWRTYW5zVGhhaS50dGY6c3lzdGVtL2ZvbnRzL0Ryb2lkU2Fuc1RoYWkudHRmIFwKKyAgICBmcmFtZXdvcmtzL2Jhc2UvZGF0YS9mb250cy9Ecm9pZFNlcmlmLVJlZ3VsYXIudHRmOnN5c3RlbS9mb250cy9Ecm9pZFNlcmlmLVJlZ3VsYXIudHRmIFwKKyAgICBmcmFtZXdvcmtzL2Jhc2UvZGF0YS9mb250cy9Ecm9pZFNlcmlmLUJvbGQudHRmOnN5c3RlbS9mb250cy9Ecm9pZFNlcmlmLUJvbGQudHRmIFwKKyAgICBmcmFtZXdvcmtzL2Jhc2UvZGF0YS9mb250cy9Ecm9pZFNlcmlmLUl0YWxpYy50dGY6c3lzdGVtL2ZvbnRzL0Ryb2lkU2VyaWYtSXRhbGljLnR0ZiBcCisgICAgZnJhbWV3b3Jrcy9iYXNlL2RhdGEvZm9udHMvRHJvaWRTZXJpZi1Cb2xkSXRhbGljLnR0ZjpzeXN0ZW0vZm9udHMvRHJvaWRTZXJpZi1Cb2xkSXRhbGljLnR0ZiBcCisgICAgZnJhbWV3b3Jrcy9iYXNlL2RhdGEvZm9udHMvRHJvaWRTYW5zTW9uby50dGY6c3lzdGVtL2ZvbnRzL0Ryb2lkU2Fuc01vbm8udHRmIFwKKyAgICBmcmFtZXdvcmtzL2Jhc2UvZGF0YS9mb250cy9DbG9ja29waWEudHRmOnN5c3RlbS9mb250cy9DbG9ja29waWEudHRmIFwKKyAgICBmcmFtZXdvcmtzL2Jhc2UvZGF0YS9mb250cy9Ecm9pZFNhbnNGYWxsYmFjay50dGY6c3lzdGVtL2ZvbnRzL0Ryb2lkU2Fuc0ZhbGxiYWNrLnR0ZgpkaWZmIC0tZ2l0IGEvZG9jcy9odG1sL2d1aWRlL2RldmVsb3BpbmcvdGVzdGluZy9pbmRleC5qZCBiL2RvY3MvaHRtbC9ndWlkZS9kZXZlbG9waW5nL3Rlc3RpbmcvaW5kZXguamQKaW5kZXggZWE2MWNjMy4uMjE2NDcwNSAxMDA2NDQKLS0tIGEvZG9jcy9odG1sL2d1aWRlL2RldmVsb3BpbmcvdGVzdGluZy9pbmRleC5qZAorKysgYi9kb2NzL2h0bWwvZ3VpZGUvZGV2ZWxvcGluZy90ZXN0aW5nL2luZGV4LmpkCkBAIC0xLDYgKzEsNSBAQAogcGFnZS50aXRsZT1UZXN0aW5nIE92ZXJ2aWV3CiBAamQ6Ym9keQotCiA8cD4KICAgICBBbmRyb2lkIGluY2x1ZGVzIHBvd2VyZnVsIHRvb2xzIGZvciBzZXR0aW5nIHVwIGFuZCBydW5uaW5nIHRlc3QgYXBwbGljYXRpb25zLgogICAgIFdoZXRoZXIgeW91IGFyZSB3b3JraW5nIGluIEVjbGlwc2Ugd2l0aCBBRFQgb3Igd29ya2luZyBmcm9tIHRoZSBjb21tYW5kIGxpbmUsIHRoZXNlIHRvb2xzCkBAIC05LDcgKzgsNyBAQAogPC9wPgogPHA+CiAgICAgSWYgeW91IGFyZW4ndCB5ZXQgZmFtaWxpYXIgd2l0aCB0aGUgQW5kcm9pZCB0ZXN0aW5nIGZyYW1ld29yaywgcGxlYXNlIHJlYWQgdGhlIHRvcGljCi0gICAgPGEgaHJlZj0ie0Bkb2NSb290fWd1aWRlL3RvcGljcy90ZXN0aW5nL3Rlc3RpbmdfYW5kcm9pZC5odG1sIj5UZXN0aW5nIGFuZCBJbnN0cnVtZW50YXRpb248L2E+CisgICAgPGEgaHJlZj0ie0Bkb2NSb290fWd1aWRlL3RvcGljcy90ZXN0aW5nL3Rlc3RpbmdfYW5kcm9pZC5odG1sIj5UZXN0aW5nIEZ1bmRhbWVudGFsczwvYT4KICAgICBiZWZvcmUgeW91IGdldCBzdGFydGVkLgogICAgIEZvciBhIHN0ZXAtYnktc3RlcCBpbnRyb2R1Y3Rpb24gdG8gQW5kcm9pZCB0ZXN0aW5nLCB0cnkgdGhlIDxhCiAgICAgaHJlZj0ie0Bkb2NSb290fXJlc291cmNlcy90dXRvcmlhbHMvdGVzdGluZy9oZWxsb2FuZHJvaWRfdGVzdC5odG1sIj5IZWxsbywgVGVzdGluZzwvYT4KZGlmZiAtLWdpdCBhL2RvY3MvaHRtbC9ndWlkZS9kZXZlbG9waW5nL3Rlc3RpbmcvdGVzdGluZ19lY2xpcHNlLmpkIGIvZG9jcy9odG1sL2d1aWRlL2RldmVsb3BpbmcvdGVzdGluZy90ZXN0aW5nX2VjbGlwc2UuamQKaW5kZXggZGExYzBmMC4uMzI1OGFmOSAxMDA2NDQKLS0tIGEvZG9jcy9odG1sL2d1aWRlL2RldmVsb3BpbmcvdGVzdGluZy90ZXN0aW5nX2VjbGlwc2UuamQKKysrIGIvZG9jcy9odG1sL2d1aWRlL2RldmVsb3BpbmcvdGVzdGluZy90ZXN0aW5nX2VjbGlwc2UuamQKQEAgLTEsMjggKzEsMjMgQEAKIHBhZ2UudGl0bGU9VGVzdGluZyBJbiBFY2xpcHNlLCB3aXRoIEFEVAogQGpkOmJvZHkKLQogPGRpdiBpZD0icXYtd3JhcHBlciI+Ci0gIDxkaXYgaWQ9InF2Ij4KLSAgPGgyPkluIHRoaXMgZG9jdW1lbnQ8L2gyPgotICA8b2w+Ci0gICAgPGxpPjxhIGhyZWY9IiNDcmVhdGVUZXN0UHJvamVjdEVjbGlwc2UiPkNyZWF0aW5nIGEgVGVzdCBQcm9qZWN0PC9hPjwvbGk+Ci0gICAgPGxpPjxhIGhyZWY9IiNDcmVhdGVUZXN0QXBwRWNsaXBzZSI+Q3JlYXRpbmcgYSBUZXN0IEFwcGxpY2F0aW9uPC9hPjwvbGk+Ci0gICAgPGxpPjxhIGhyZWY9IiNSdW5UZXN0RWNsaXBzZSI+UnVubmluZyBUZXN0czwvYT48L2xpPgotICA8L29sPgotICA8L2Rpdj4KKyAgICA8ZGl2IGlkPSJxdiI+CisgICAgICAgIDxoMj5JbiB0aGlzIGRvY3VtZW50PC9oMj4KKyAgICAgICAgICAgIDxvbD4KKyAgICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iI0NyZWF0ZVRlc3RQcm9qZWN0RWNsaXBzZSI+Q3JlYXRpbmcgYSBUZXN0IFByb2plY3Q8L2E+PC9saT4KKyAgICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iI0NyZWF0ZVRlc3RBcHBFY2xpcHNlIj5DcmVhdGluZyBhIFRlc3QgUGFja2FnZTwvYT48L2xpPgorICAgICAgICAgICAgICAgIDxsaT48YSBocmVmPSIjUnVuVGVzdEVjbGlwc2UiPlJ1bm5pbmcgVGVzdHM8L2E+PC9saT4KKyAgICAgICAgICAgIDwvb2w+CisgICAgPC9kaXY+CiA8L2Rpdj4KIDxwPgotICBUaGlzIHRvcGljIGV4cGxhaW5zIGhvdyBjcmVhdGUgYW5kIHJ1biB0ZXN0cyBvZiBBbmRyb2lkIGFwcGxpY2F0aW9ucyBpbiBFY2xpcHNlIHdpdGggQURULgotCi0gIHdpdGggdGhlIGJhc2ljIHByb2Nlc3NlcyBmb3IgY3JlYXRpbmcgYW5kIHJ1bm5pbmcgYXBwbGljYXRpb25zIHdpdGggQURULCBhcyBkZXNjcmliZWQgaW4KLSAgPGEgaHJlZj0ie0Bkb2NSb290fWd1aWRlL2RldmVsb3BpbmcvZWNsaXBzZS1hZHQuaHRtbCI+RGV2ZWxvcGluZyBJbiBFY2xpcHNlLCB3aXRoIEFEVDwvYT4uCi0KLSAgQmVmb3JlIHlvdSByZWFkIHRoaXMgdG9waWMsIHlvdSBzaG91bGQgcmVhZCBhYm91dCBob3cgdG8gY3JlYXRlIGEgQW5kcm9pZCBhcHBsaWNhdGlvbiB3aXRoIHRoZQotICBiYXNpYyBwcm9jZXNzZXMgZm9yIGNyZWF0aW5nIGFuZCBydW5uaW5nIGFwcGxpY2F0aW9ucyB3aXRoIEFEVCwgYXMgZGVzY3JpYmVkIGluCi0gIDxhIGhyZWY9IntAZG9jUm9vdH1ndWlkZS9kZXZlbG9waW5nL2VjbGlwc2UtYWR0Lmh0bWwiPkRldmVsb3BpbmcgSW4gRWNsaXBzZSwgd2l0aCBBRFQ8L2E+LgotICBZb3UgbWF5IGFsc28gd2FudCB0byByZWFkCi0gIDxhIGhyZWY9IntAZG9jUm9vdH1ndWlkZS90b3BpY3MvdGVzdGluZy90ZXN0aW5nX2FuZHJvaWQuaHRtbCI+VGVzdGluZyBhbmQgSW5zdHJ1bWVudGF0aW9uPC9hPiwKLSAgd2hpY2ggcHJvdmlkZXMgYW4gb3ZlcnZpZXcgb2YgdGhlIEFuZHJvaWQgdGVzdGluZyBmcmFtZXdvcmsuCisgICAgVGhpcyB0b3BpYyBleHBsYWlucyBob3cgY3JlYXRlIGFuZCBydW4gdGVzdHMgb2YgQW5kcm9pZCBhcHBsaWNhdGlvbnMgaW4gRWNsaXBzZSB3aXRoIEFEVC4KKyAgICBCZWZvcmUgeW91IHJlYWQgdGhpcyB0b3BpYywgeW91IHNob3VsZCByZWFkIGFib3V0IGhvdyB0byBjcmVhdGUgYSBBbmRyb2lkIGFwcGxpY2F0aW9uIHdpdGggdGhlCisgICAgYmFzaWMgcHJvY2Vzc2VzIGZvciBjcmVhdGluZyBhbmQgcnVubmluZyBhcHBsaWNhdGlvbnMgd2l0aCBBRFQsIGFzIGRlc2NyaWJlZCBpbgorICAgIDxhIGhyZWY9IntAZG9jUm9vdH1ndWlkZS9kZXZlbG9waW5nL2VjbGlwc2UtYWR0Lmh0bWwiPkRldmVsb3BpbmcgSW4gRWNsaXBzZSwgd2l0aCBBRFQ8L2E+LgorICAgIFlvdSBtYXkgYWxzbyB3YW50IHRvIHJlYWQKKyAgICA8YSBocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvdG9waWNzL3Rlc3RpbmcvdGVzdGluZ19hbmRyb2lkLmh0bWwiPlRlc3RpbmcgRnVuZGFtZW50YWxzPC9hPiwKKyAgICB3aGljaCBwcm92aWRlcyBhbiBvdmVydmlldyBvZiB0aGUgQW5kcm9pZCB0ZXN0aW5nIGZyYW1ld29yay4KIDwvcD4KIDxwPgogICAgIEFEVCBwcm92aWRlcyBzZXZlcmFsIGZlYXR1cmVzIHRoYXQgaGVscCB5b3Ugc2V0IHVwIGFuZCBtYW5hZ2UgeW91ciB0ZXN0aW5nIGVudmlyb25tZW50CkBAIC0zMiwyMCArMjcsMjAgQEAKICAgICAgICAgPGxpPgogICAgICAgICAgICAgSXQgbGV0cyB5b3UgcXVpY2tseSBjcmVhdGUgYSB0ZXN0IHByb2plY3QgYW5kIGxpbmsgaXQgdG8gdGhlIGFwcGxpY2F0aW9uIHVuZGVyIHRlc3QuCiAgICAgICAgICAgICBXaGVuIGl0IGNyZWF0ZXMgdGhlIHRlc3QgcHJvamVjdCwgaXQgYXV0b21hdGljYWxseSBpbnNlcnRzIHRoZSBuZWNlc3NhcnkKLSAgICAgICAgICAgIDxjb2RlPiZsdDtpbnN0cnVtZW50YXRpb24mZ3Q7PC9jb2RlPiBlbGVtZW50IGluIHRoZSB0ZXN0IGFwcGxpY2F0aW9uJ3MgbWFuaWZlc3QgZmlsZS4KKyAgICAgICAgICAgIDxjb2RlPiZsdDtpbnN0cnVtZW50YXRpb24mZ3Q7PC9jb2RlPiBlbGVtZW50IGluIHRoZSB0ZXN0IHBhY2thZ2UncyBtYW5pZmVzdCBmaWxlLgogICAgICAgICA8L2xpPgogICAgICAgICA8bGk+CiAgICAgICAgICAgICBJdCBsZXRzIHlvdSBxdWlja2x5IGltcG9ydCB0aGUgY2xhc3NlcyBvZiB0aGUgYXBwbGljYXRpb24gdW5kZXIgdGVzdCwgc28gdGhhdCB5b3VyCiAgICAgICAgICAgICB0ZXN0cyBjYW4gaW5zcGVjdCB0aGVtLgogICAgICAgICA8L2xpPgogICAgICAgICA8bGk+Ci0gICAgICAgICAgICBJdCBsZXRzIHlvdSBjcmVhdGUgcnVuIGNvbmZpZ3VyYXRpb25zIGZvciB5b3VyIHRlc3QgYXBwbGljYXRpb24gYW5kIGluY2x1ZGUgaW4KKyAgICAgICAgICAgIEl0IGxldHMgeW91IGNyZWF0ZSBydW4gY29uZmlndXJhdGlvbnMgZm9yIHlvdXIgdGVzdCBwYWNrYWdlIGFuZCBpbmNsdWRlIGluCiAgICAgICAgICAgICB0aGVtIGZsYWdzIHRoYXQgYXJlIHBhc3NlZCB0byB0aGUgQW5kcm9pZCB0ZXN0aW5nIGZyYW1ld29yay4KICAgICAgICAgPC9saT4KICAgICAgICAgPGxpPgotICAgICAgICAgICAgSXQgbGV0cyB5b3UgcnVuIHlvdXIgdGVzdCBhcHBsaWNhdGlvbiB3aXRob3V0IGxlYXZpbmcgRWNsaXBzZS4gQURUIGJ1aWxkcyBib3RoIHRoZQotICAgICAgICAgICAgYXBwbGljYXRpb24gdW5kZXIgdGVzdCBhbmQgdGhlIHRlc3QgYXBwbGljYXRpb24gYXV0b21hdGljYWxseSwgaW5zdGFsbHMgdGhlbSBpZgotICAgICAgICAgICAgbmVjZXNzYXJ5IHRvIHlvdXIgZGV2aWNlIG9yIGVtdWxhdG9yLCBydW5zIHRoZSB0ZXN0IGFwcGxpY2F0aW9uLCBhbmQgZGlzcGxheXMgdGhlCisgICAgICAgICAgICBJdCBsZXRzIHlvdSBydW4geW91ciB0ZXN0IHBhY2thZ2Ugd2l0aG91dCBsZWF2aW5nIEVjbGlwc2UuIEFEVCBidWlsZHMgYm90aCB0aGUKKyAgICAgICAgICAgIGFwcGxpY2F0aW9uIHVuZGVyIHRlc3QgYW5kIHRoZSB0ZXN0IHBhY2thZ2UgYXV0b21hdGljYWxseSwgaW5zdGFsbHMgdGhlbSBpZgorICAgICAgICAgICAgbmVjZXNzYXJ5IHRvIHlvdXIgZGV2aWNlIG9yIGVtdWxhdG9yLCBydW5zIHRoZSB0ZXN0IHBhY2thZ2UsIGFuZCBkaXNwbGF5cyB0aGUKICAgICAgICAgICAgIHJlc3VsdHMgaW4gYSBzZXBhcmF0ZSB3aW5kb3cgaW4gRWNsaXBzZS4KICAgICAgICAgPC9saT4KICAgICA8L3VsPgpAQCAtNTUsMzA1ICs1MCwzOTYgQEAKICAgICA8YSBocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvZGV2ZWxvcGluZy90ZXN0aW5nL3Rlc3Rpbmdfb3RoZXJpZGUuaHRtbCI+VGVzdGluZyBpbiBPdGhlciBJREVzPC9hPi4KIDwvcD4KIDxoMiBpZD0iQ3JlYXRlVGVzdFByb2plY3RFY2xpcHNlIj5DcmVhdGluZyBhIFRlc3QgUHJvamVjdDwvaDI+Ci0gIDxwPgorPHA+CiAgICAgVG8gc2V0IHVwIGEgdGVzdCBlbnZpcm9ubWVudCBmb3IgeW91ciBBbmRyb2lkIGFwcGxpY2F0aW9uLCB5b3UgbXVzdCBmaXJzdCBjcmVhdGUgYSBzZXBhcmF0ZQotICAgIGFwcGxpY2F0aW9uIHByb2plY3QgdGhhdCBob2xkcyB0aGUgdGVzdCBjb2RlLiBUaGUgbmV3IHByb2plY3QgZm9sbG93cyB0aGUgZGlyZWN0b3J5IHN0cnVjdHVyZQorICAgIHByb2plY3QgdGhhdCBob2xkcyB0aGUgdGVzdCBjb2RlLiBUaGUgbmV3IHByb2plY3QgZm9sbG93cyB0aGUgZGlyZWN0b3J5IHN0cnVjdHVyZQogICAgIHVzZWQgZm9yIGFueSBBbmRyb2lkIGFwcGxpY2F0aW9uLiBJdCBpbmNsdWRlcyB0aGUgc2FtZSB0eXBlcyBvZiBjb250ZW50IGFuZCBmaWxlcywgc3VjaCBhcwotICAgIHNvdXJjZSBjb2RlLCByZXNvdXJjZXMsIGEgbWFuaWZlc3QgZmlsZSwgYW5kIHNvIGZvcnRoLiBUaGUgdGVzdCBhcHBsaWNhdGlvbiB5b3UKKyAgICBzb3VyY2UgY29kZSwgcmVzb3VyY2VzLCBhIG1hbmlmZXN0IGZpbGUsIGFuZCBzbyBmb3J0aC4gVGhlIHRlc3QgcGFja2FnZSB5b3UKICAgICBjcmVhdGUgaXMgY29ubmVjdGVkIHRvIHRoZSBhcHBsaWNhdGlvbiB1bmRlciB0ZXN0IGJ5IGFuCiAgICAgPGEgaHJlZj0ie0Bkb2NSb290fWd1aWRlL3RvcGljcy9tYW5pZmVzdC9pbnN0cnVtZW50YXRpb24tZWxlbWVudC5odG1sIj4KICAgICA8Y29kZT4mbHQ7aW5zdHJ1bWVudGF0aW9uJmd0OzwvY29kZT48L2E+IGVsZW1lbnQgaW4gaXRzIG1hbmlmZXN0IGZpbGUuCi0gIDwvcD4KLSAgPHA+Ci0gICAgVGhlIDxzdHJvbmc+TmV3IEFuZHJvaWQgVGVzdCBQcm9qZWN0PC9zdHJvbmc+IGRpYWxvZyBtYWtlcyBpdCBlYXN5IGZvciB5b3UgdG8gZ2VuZXJhdGUgYQotICAgIG5ldyB0ZXN0IHByb2plY3QgdGhhdCBoYXMgdGhlIHByb3BlciBzdHJ1Y3R1cmUsIGluY2x1ZGluZyB0aGUKLSAgICA8Y29kZT4mbHQ7aW5zdHJ1bWVudGF0aW9uJmd0OzwvY29kZT4gZWxlbWVudCBpbiB0aGUgbWFuaWZlc3QgZmlsZS4gWW91IGNhbiB1c2UgdGhlIE5ldyBBbmRyb2lkCi0gICAgVGVzdCBQcm9qZWN0IGRpYWxvZyB0byBnZW5lcmF0ZSB0aGUgdGVzdCBwcm9qZWN0IGF0IGFueSB0aW1lLiBUaGUgZGlhbG9nIGFwcGVhcnMganVzdCBhZnRlciB5b3UKLSAgICBjcmVhdGUgYSBuZXcgQW5kcm9pZCBtYWluIGFwcGxpY2F0aW9uIHByb2plY3QsIGJ1dCB5b3UgY2FuIGFsc28gcnVuIGl0IHRvIGNyZWF0ZSBhIHRlc3QgcHJvamVjdAotICAgIGZvciBhIHByb2plY3QgdGhhdCB5b3UgY3JlYXRlZCBwcmV2aW91c2x5LgotICA8L3A+Cis8L3A+CiA8cD4KLSAgVG8gY3JlYXRlIGEgdGVzdCBwcm9qZWN0IGluIEVjbGlwc2Ugd2l0aCBBRFQ6CisgICAgVGhlIDxlbT5OZXcgQW5kcm9pZCBUZXN0IFByb2plY3Q8L2VtPiBkaWFsb2cgbWFrZXMgaXQgZWFzeSBmb3IgeW91IHRvIGdlbmVyYXRlIGEKKyAgICBuZXcgdGVzdCBwcm9qZWN0IHRoYXQgaGFzIHRoZSBwcm9wZXIgc3RydWN0dXJlLCBpbmNsdWRpbmcgdGhlCisgICAgPGNvZGU+Jmx0O2luc3RydW1lbnRhdGlvbiZndDs8L2NvZGU+IGVsZW1lbnQgaW4gdGhlIG1hbmlmZXN0IGZpbGUuIFlvdSBjYW4gdXNlIHRoZSBOZXcKKyAgICBBbmRyb2lkIFRlc3QgUHJvamVjdCBkaWFsb2cgdG8gZ2VuZXJhdGUgdGhlIHRlc3QgcHJvamVjdCBhdCBhbnkgdGltZS4gVGhlIGRpYWxvZyBhcHBlYXJzCisgICAganVzdCBhZnRlciB5b3UgY3JlYXRlIGEgbmV3IEFuZHJvaWQgbWFpbiBhcHBsaWNhdGlvbiBwcm9qZWN0LCBidXQgeW91IGNhbiBhbHNvIHJ1biBpdCB0bworICAgIGNyZWF0ZSBhIHRlc3QgcHJvamVjdCBmb3IgYSBwcm9qZWN0IHRoYXQgeW91IGNyZWF0ZWQgcHJldmlvdXNseS4KKzwvcD4KKzxwPgorICAgIFRvIGNyZWF0ZSBhIHRlc3QgcHJvamVjdCBpbiBFY2xpcHNlIHdpdGggQURUOgogPC9wPgogPG9sPgotICA8bGk+Ci0gICAgSW4gRWNsaXBzZSwgc2VsZWN0IDxzdHJvbmc+RmlsZSAmZ3Q7IE5ldyAmZ3Q7IE90aGVyPC9zdHJvbmc+LiBUaGlzCi0gICAgb3BlbnMgdGhlIFNlbGVjdCBhIFdpemFyZCBkaWFsb2cuCi0gIDwvbGk+Ci0gIDxsaT4KLSAgICBJbiB0aGUgZGlhbG9nLCBpbiB0aGUgV2l6YXJkcyBkcm9wLWRvd24gbGlzdCwKLSAgICBmaW5kIHRoZSBlbnRyeSBmb3IgQW5kcm9pZCwgdGhlbiBjbGljayB0aGUgdG9nZ2xlIHRvIHRoZSBsZWZ0LiBTZWxlY3QKLSAgICBBbmRyb2lkIFRlc3QgUHJvamVjdCwgdGhlbiBhdCB0aGUgYm90dG9tCi0gICAgb2YgdGhlIGRpYWxvZyBjbGljayBOZXh0LiBUaGUgTmV3IEFuZHJvaWQgVGVzdCBQcm9qZWN0IHdpemFyZCBhcHBlYXJzLgotICA8L2xpPgotICA8bGk+Ci0gICAgRW50ZXIgYSBwcm9qZWN0IG5hbWUuIFlvdSBtYXkgdXNlIGFueSBuYW1lLCBidXQgeW91IG1heSB3YW50IHRvCi0gICAgYXNzb2NpYXRlIHRoZSBuYW1lIHdpdGggdGhlIHByb2plY3QgbmFtZSBmb3IgeW91ciBBcHBsaWNhdGlvbi4gT25lCi0gICAgd2F5IHRvIGRvIHRoaXMgaXMgdG8gdGFrZSB0aGUgQXBwbGljYXRpb24ncyBwcm9qZWN0IG5hbWUsIGFwcGVuZCB0aGUKLSAgICBzdHJpbmcgIlRlc3QiIHRvIGl0LCBhbmQgdGhlbiB1c2UgdGhpcyBhcyB0aGUgdGVzdCBjYXNlIHByb2plY3QgbmFtZS4KLSAgPC9saT4KLSAgPGxpPgotICAgIEluIHRoZSBUZXN0IFRhcmdldCBwYW5lbCwgc2V0Ci0gICAgQW4gRXhpc3RpbmcgQW5kcm9pZCBQcm9qZWN0LCBjbGljawotICAgIEJyb3dzZSwgdGhlbiBzZWxlY3QgeW91ciBBbmRyb2lkIGFwcGxpY2F0aW9uIGZyb20KLSAgICB0aGUgbGlzdC4gWW91IG5vdyBzZWUgdGhhdCB0aGUgd2l6YXJkIGhhcyBjb21wbGV0ZWQgdGhlIFRlc3QKLSAgICBUYXJnZXQgUGFja2FnZSwgQXBwbGljYXRpb24gTmFtZSwgYW5kCi0gICAgUGFja2FnZSBOYW1lIGZpZWxkcyBmb3IgeW91ICh0aGUgbGF0dGVyIHR3byBhcmUgaW4KLSAgICB0aGUgUHJvcGVydGllcyBwYW5lbCkuCi0gIDwvbGk+Ci0gIDxsaT4KLSAgICBJbiB0aGUgQnVpbGQgVGFyZ2V0IHBhbmVsLCBzZWxlY3QgdGhlIEFuZHJvaWQgU0RLCi0gICAgcGxhdGZvcm0gdGhhdCB5b3Ugd2lsbCB1c2UgdG8gdGVzdCB5b3VyIGFwcGxpY2F0aW9uLiBNYWtlIHRoaXMgdGhlIHNhbWUgYXMgdGhlCi0gICAgYnVpbGQgdGFyZ2V0IG9mIHRoZSBhcHBsaWNhdGlvbiB1bmRlciB0ZXN0LgotICA8L2xpPgotICA8bGk+Ci0gICAgQ2xpY2sgRmluaXNoIHRvIGNvbXBsZXRlIHRoZSB3aXphcmQuIElmCi0gICAgRmluaXNoIGlzIGRpc2FibGVkLCBsb29rCi0gICAgZm9yIGVycm9yIG1lc3NhZ2VzIGF0IHRoZSB0b3Agb2YgdGhlIHdpemFyZCBkaWFsb2csIGFuZCB0aGVuIGZpeAotICAgIGFueSBwcm9ibGVtcy4KLSAgPC9saT4KKyAgICA8bGk+CisgICAgICAgIEluIEVjbGlwc2UsIHNlbGVjdCA8c3Ryb25nPkZpbGUgJmd0OyBOZXcgJmd0OyBPdGhlcjwvc3Ryb25nPi4gVGhpcyBvcGVucyB0aGUgPGVtPlNlbGVjdCBhCisgICAgICAgIFdpemFyZDwvZW0+IGRpYWxvZy4KKyAgICA8L2xpPgorICAgIDxsaT4KKyAgICAgICAgSW4gdGhlIGRpYWxvZywgaW4gdGhlIDxlbT5XaXphcmRzPC9lbT4gZHJvcC1kb3duIGxpc3QsIGZpbmQgdGhlIGVudHJ5IGZvciBBbmRyb2lkLCB0aGVuCisgICAgICAgIGNsaWNrIHRoZSB0b2dnbGUgdG8gdGhlIGxlZnQuIFNlbGVjdCA8c3Ryb25nPkFuZHJvaWQgVGVzdCBQcm9qZWN0PC9zdHJvbmc+LCB0aGVuIGF0IHRoZQorICAgICAgICBib3R0b20gb2YgdGhlIGRpYWxvZyBjbGljayA8c3Ryb25nPk5leHQ8L3N0cm9uZz4uIFRoZSA8ZW0+TmV3IEFuZHJvaWQgVGVzdCBQcm9qZWN0PC9lbT4KKyAgICAgICAgd2l6YXJkIGFwcGVhcnMuCisgICAgPC9saT4KKyAgICA8bGk+CisgICAgICAgIE5leHQgdG8gPGVtPlRlc3QgUHJvamVjdCBOYW1lPC9lbT4sIGVudGVyIGEgbmFtZSBmb3IgdGhlIHByb2plY3QuIFlvdSBtYXkgdXNlIGFueSBuYW1lLAorICAgICAgICBidXQgeW91IG1heSB3YW50IHRvIGFzc29jaWF0ZSB0aGUgbmFtZSB3aXRoIHRoZSBwcm9qZWN0IG5hbWUgZm9yIHRoZSBhcHBsaWNhdGlvbiB1bmRlciB0ZXN0LgorICAgICAgICBPbmUgd2F5IHRvIGRvIHRoaXMgaXMgdG8gdGFrZSB0aGUgYXBwbGljYXRpb24ncyBwcm9qZWN0IG5hbWUsIGFwcGVuZCB0aGUgc3RyaW5nICJUZXN0IiB0bworICAgICAgICBpdCwgYW5kIHRoZW4gdXNlIHRoaXMgYXMgdGhlIHRlc3QgcGFja2FnZSBwcm9qZWN0IG5hbWUuCisgICAgICAgIDxwPgorICAgICAgICAgICAgVGhlIG5hbWUgYmVjb21lcyBwYXJ0IG9mIHRoZSBzdWdnZXN0ZWQgcHJvamVjdCBwYXRoLCBidXQgeW91IGNhbiBjaGFuZ2UgdGhpcyBpbiB0aGUKKyAgICAgICAgICAgIG5leHQgc3RlcC4KKyAgICAgICAgPC9wPgorICAgIDwvbGk+CisgICAgPGxpPgorICAgICAgICBJbiB0aGUgPGVtPkNvbnRlbnQ8L2VtPiBwYW5lbCwgZXhhbWluZSB0aGUgc3VnZ2VzdGVkIHBhdGggdG8gdGhlIHByb2plY3QuCisgICAgICAgIElmIDxlbT5Vc2UgZGVmYXVsdCBsb2NhdGlvbjwvZW0+IGlzIHNldCwgdGhlbiB0aGUgd2l6YXJkIHdpbGwgc3VnZ2VzdCBhIHBhdGggdGhhdCBpcworICAgICAgICBhIGNvbmNhdGVuYXRpb24gb2YgdGhlIHdvcmtzcGFjZSBwYXRoIGFuZCB0aGUgcHJvamVjdCBuYW1lIHlvdSBlbnRlcmVkLiBGb3IgZXhhbXBsZSwKKyAgICAgICAgaWYgeW91ciB3b3Jrc3BhY2UgcGF0aCBpcyA8Y29kZT4vdXNyL2xvY2FsL3dvcmtzcGFjZTwvY29kZT4gYW5kIHlvdXIgcHJvamVjdCBuYW1lIGlzCisgICAgICAgIDxjb2RlPk15VGVzdEFwcDwvY29kZT4sIHRoZW4gdGhlIHdpemFyZCB3aWxsIHN1Z2dlc3QKKyAgICAgICAgPGNvZGU+L3Vzci9sb2NhbC93b3Jrc3BhY2UvTXlUZXN0QXBwPC9jb2RlPi4gVG8gZW50ZXIgeW91ciBvd24KKyAgICAgICAgY2hvaWNlIGZvciBhIHBhdGgsIHVuc2VsZWN0IDxlbT5Vc2UgZGVmYXVsdCBsb2NhdGlvbjwvZW0+LCB0aGVuIGVudGVyIG9yIGJyb3dzZSB0byB0aGUKKyAgICAgICAgcGF0aCB3aGVyZSB5b3Ugd2FudCB5b3VyIHByb2plY3QuCisgICAgICAgIDxwPgorICAgICAgICAgICAgVG8gbGVhcm4gbW9yZSBhYm91dCBjaG9vc2luZyB0aGUgbG9jYXRpb24gb2YgdGVzdCBwcm9qZWN0cywgcGxlYXNlIHJlYWQKKyAgICAgICAgICAgIDxhIGhyZWY9IntAZG9jUm9vdH1ndWlkZS90b3BpY3MvdGVzdGluZy90ZXN0aW5nX2FuZHJvaWQuaHRtbCNUZXN0UHJvamVjdFBhdGhzIj4KKyAgICAgICAgICAgIFRlc3RpbmcgRnVuZGFtZW50YWxzPC9hPi4KKyAgICAgICAgPC9wPgorICAgIDwvbGk+CisgICAgPGxpPgorICAgICAgICBJbiB0aGUgVGVzdCBUYXJnZXQgcGFuZWwsIHNldCBBbiBFeGlzdGluZyBBbmRyb2lkIFByb2plY3QsIGNsaWNrIEJyb3dzZSwgdGhlbiBzZWxlY3QgeW91cgorICAgICAgICBBbmRyb2lkIGFwcGxpY2F0aW9uIGZyb20gdGhlIGxpc3QuIFlvdSBub3cgc2VlIHRoYXQgdGhlIHdpemFyZCBoYXMgY29tcGxldGVkIHRoZSBUZXN0CisgICAgICAgIFRhcmdldCBQYWNrYWdlLCBBcHBsaWNhdGlvbiBOYW1lLCBhbmQgUGFja2FnZSBOYW1lIGZpZWxkcyBmb3IgeW91ICh0aGUgbGF0dGVyIHR3byBhcmUgaW4KKyAgICAgICAgdGhlIFByb3BlcnRpZXMgcGFuZWwpLgorICAgIDwvbGk+CisgICAgPGxpPgorICAgICAgICBJbiB0aGUgQnVpbGQgVGFyZ2V0IHBhbmVsLCBzZWxlY3QgdGhlIEFuZHJvaWQgU0RLIHBsYXRmb3JtIHRoYXQgdGhlIGFwcGxpY2F0aW9uIHVuZGVyIHRlc3QKKyAgICAgICAgdXNlcy4KKyAgICA8L2xpPgorICAgIDxsaT4KKyAgICAgICAgQ2xpY2sgRmluaXNoIHRvIGNvbXBsZXRlIHRoZSB3aXphcmQuIElmIEZpbmlzaCBpcyBkaXNhYmxlZCwgbG9vayBmb3IgZXJyb3IgbWVzc2FnZXMgYXQgdGhlCisgICAgICAgIHRvcCBvZiB0aGUgd2l6YXJkIGRpYWxvZywgYW5kIHRoZW4gZml4IGFueSBwcm9ibGVtcy4KKyAgICA8L2xpPgorPC9vbD4KKzxoMiBpZD0iQ3JlYXRlVGVzdEFwcEVjbGlwc2UiPkNyZWF0aW5nIGEgVGVzdCBQYWNrYWdlPC9oMj4KKzxwPgorICAgIE9uY2UgeW91IGhhdmUgY3JlYXRlZCBhIHRlc3QgcHJvamVjdCwgeW91IHBvcHVsYXRlIGl0IHdpdGggYSB0ZXN0IHBhY2thZ2UuIFRoaXMgcGFja2FnZSBkb2VzIG5vdAorICAgIHJlcXVpcmUgYW4gQWN0aXZpdHksIGFsdGhvdWdoIHlvdSBjYW4gZGVmaW5lIG9uZSBpZiB5b3Ugd2lzaC4gQWx0aG91Z2ggeW91ciB0ZXN0IHBhY2thZ2UgY2FuCisgICAgY29tYmluZSBBY3Rpdml0eSBjbGFzc2VzLCB0ZXN0IGNhc2UgY2xhc3Nlcywgb3Igb3JkaW5hcnkgY2xhc3NlcywgeW91ciBtYWluIHRlc3QgY2FzZQorICAgIHNob3VsZCBleHRlbmQgb25lIG9mIHRoZSBBbmRyb2lkIHRlc3QgY2FzZSBjbGFzc2VzIG9yIEpVbml0IGNsYXNzZXMsIGJlY2F1c2UgdGhlc2UgcHJvdmlkZSB0aGUKKyAgICBiZXN0IHRlc3RpbmcgZmVhdHVyZXMuCis8L3A+Cis8cD4KKyAgICBUZXN0IHBhY2thZ2VzIGRvIG5vdCBuZWVkIHRvIGhhdmUgYW4gQW5kcm9pZCBHVUkuIFdoZW4geW91IHJ1biB0aGUgcGFja2FnZSBpbgorICAgIEVjbGlwc2Ugd2l0aCBBRFQsIGl0cyByZXN1bHRzIGFwcGVhciBpbiB0aGUgSlVuaXQgdmlldy4gUnVubmluZyB0ZXN0cyBhbmQgc2VlaW5nIHRoZSByZXN1bHRzIGlzCisgICAgZGVzY3JpYmVkIGluIG1vcmUgZGV0YWlsIGluIHRoZSBzZWN0aW9uIDxhIGhyZWY9IiNSdW5UZXN0RWNsaXBzZSI+UnVubmluZyBUZXN0czwvYT4uCis8L3A+CisKKzxwPgorICAgIFRvIGNyZWF0ZSBhIHRlc3QgcGFja2FnZSwgc3RhcnQgd2l0aCBvbmUgb2YgQW5kcm9pZCdzIHRlc3QgY2FzZSBjbGFzc2VzIGRlZmluZWQgaW4KKyAgICB7QGxpbmsgYW5kcm9pZC50ZXN0IGFuZHJvaWQudGVzdH0uIFRoZXNlIGV4dGVuZCB0aGUgSlVuaXQKKyAgICB7QGxpbmsganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlIFRlc3RDYXNlfSBjbGFzcy4gVGhlIEFuZHJvaWQgdGVzdCBjbGFzc2VzIGZvciBBY3Rpdml0eSBvYmplY3RzCisgICAgYWxzbyBwcm92aWRlIGluc3RydW1lbnRhdGlvbiBmb3IgdGVzdGluZyBhbiBBY3Rpdml0eS4gVG8gbGVhcm4gbW9yZSBhYm91dCB0ZXN0IGNhc2UKKyAgICBjbGFzc2VzLCBwbGVhc2UgcmVhZCB0aGUgdG9waWMgPGEgaHJlZj0ie0Bkb2NSb290fWd1aWRlL3RvcGljcy90ZXN0aW5nL3Rlc3RpbmdfYW5kcm9pZC5odG1sIj4KKyAgICBUZXN0aW5nIEZ1bmRhbWVudGFsczwvYT4uCis8L3A+Cis8cD4KKyAgICBCZWZvcmUgeW91IGNyZWF0ZSB5b3VyIHRlc3QgcGFja2FnZSwgeW91IGNob29zZSB0aGUgSmF2YSBwYWNrYWdlIGlkZW50aWZpZXIgeW91IHdhbnQgdG8gdXNlCisgICAgZm9yIHlvdXIgdGVzdCBjYXNlIGNsYXNzZXMgYW5kIHRoZSBBbmRyb2lkIHBhY2thZ2UgbmFtZSB5b3Ugd2FudCB0byB1c2UuIFRvIGxlYXJuIG1vcmUKKyAgICBhYm91dCB0aGlzLCBwbGVhc2UgcmVhZAorICAgIDxhIGhyZWY9IntAZG9jUm9vdH1ndWlkZS90b3BpY3MvdGVzdGluZy90ZXN0aW5nX2FuZHJvaWQuaHRtbCNQYWNrYWdlTmFtZXMiPgorICAgIFRlc3RpbmcgRnVuZGFtZW50YWxzPC9hPi4KKzwvcD4KKzxwPgorICAgIFRvIGFkZCBhIHRlc3QgY2FzZSBjbGFzcyB0byB5b3VyIHByb2plY3Q6Cis8L3A+Cis8b2w+CisgICAgPGxpPgorICAgICAgICBJbiB0aGUgPGVtPlByb2plY3QgRXhwbG9yZXI8L2VtPiB0YWIsIG9wZW4geW91ciB0ZXN0IHByb2plY3QsIHRoZW4gb3BlbiB0aGUgPGVtPnNyYzwvZW0+CisgICAgICAgIGZvbGRlci4KKyAgICA8L2xpPgorICAgIDxsaT4KKyAgICAgICAgRmluZCB0aGUgSmF2YSBwYWNrYWdlIGlkZW50aWZpZXIgc2V0IGJ5IHRoZSBwcm9qZWN0aW9uIGNyZWF0aW9uIHdpemFyZC4gSWYgeW91IGhhdmVuJ3QKKyAgICAgICAgYWRkZWQgY2xhc3NlcyB5ZXQsIHRoaXMgbm9kZSB3b24ndCBoYXZlIGFueSBjaGlsZHJlbiwgYW5kIGl0cyBpY29uIHdpbGwgbm90IGJlIGZpbGxlZCBpbi4KKyAgICAgICAgSWYgeW91IHdhbnQgdG8gY2hhbmdlIHRoZSBpZGVudGlmaWVyIHZhbHVlLCByaWdodC1jbGljayB0aGUgaWRlbnRpZmllciBhbmQgc2VsZWN0CisgICAgICAgIDxzdHJvbmc+UmVmYWN0b3I8L3N0cm9uZz4gJmd0OyA8c3Ryb25nPlJlbmFtZTwvc3Ryb25nPiwgdGhlbiBlbnRlciB0aGUgbmV3IG5hbWUuCisgICAgPC9saT4KKyAgICA8bGk+CisgICAgICAgIFdoZW4geW91IGFyZSByZWFkeSwgcmlnaHQtY2xpY2sgdGhlIEphdmEgcGFja2FnZSBpZGVudGlmaWVyIGFnYWluIGFuZCBzZWxlY3QKKyAgICAgICAgPHN0cm9uZz5OZXc8L3N0cm9uZz4gJmd0OyA8c3Ryb25nPkNsYXNzPC9zdHJvbmc+LiBUaGlzIGRpc3BsYXlzIHRoZSA8ZW0+TmV3IEphdmEgQ2xhc3M8L2VtPgorICAgICAgICBkaWFsb2csIHdpdGggdGhlIDxlbT5Tb3VyY2UgZm9sZGVyPC9lbT4gYW5kIDxlbT5QYWNrYWdlPC9lbT4gdmFsdWVzIGFscmVhZHkgc2V0LgorICAgIDwvbGk+CisgICAgPGxpPgorICAgICAgICBJbiB0aGUgPGVtPk5hbWU8L2VtPiBmaWVsZCwgZW50ZXIgYSBuYW1lIGZvciB0aGUgdGVzdCBjYXNlIGNsYXNzLiBPbmUgd2F5IHRvIGNob29zZSBhCisgICAgICAgIGNsYXNzIG5hbWUgaXMgdG8gYXBwZW5kIHRoZSBzdHJpbmcgIlRlc3QiIHRvIHRoZSBjbGFzcyBvZiB0aGUgY29tcG9uZW50IHlvdSBhcmUgdGVzdGluZy4KKyAgICAgICAgRm9yIGV4YW1wbGUsIGlmIHlvdSBhcmUgdGVzdGluZyB0aGUgY2xhc3MgTXlBcHBBY3Rpdml0eSwgeW91ciB0ZXN0IGNhc2UgY2xhc3MKKyAgICAgICAgbmFtZSB3b3VsZCBiZSBNeUFwcEFjdGl2aXR5VGVzdC4gTGVhdmUgdGhlIG1vZGlmaWVycyBzZXQgdG8gPGVtPnB1YmxpYzwvZW0+LgorICAgIDwvbGk+CisgICAgPGxpPgorICAgICAgICBJbiB0aGUgPGVtPlN1cGVyY2xhc3M8L2VtPiBmaWVsZCwgZW50ZXIgdGhlIG5hbWUgb2YgdGhlIEFuZHJvaWQgdGVzdCBjYXNlIGNsYXNzIHlvdQorICAgICAgICBhcmUgZXh0ZW5kaW5nLiBZb3UgY2FuIGFsc28gYnJvd3NlIHRoZSBhdmFpbGFibGUgY2xhc3Nlcy4KKyAgICA8L2xpPgorICAgIDxsaT4KKyAgICAgICAgSW4gPGVtPldoaWNoIG1ldGhvZCBzdHVicyB3b3VsZCB5b3UgbGlrZSB0byBjcmVhdGU/PC9lbT4sIHVuc2V0IGFsbCB0aGUgb3B0aW9ucywgdGhlbgorICAgICAgICBjbGljayA8c3Ryb25nPkZpbmlzaDwvc3Ryb25nPi4gWW91IHdpbGwgc2V0IHVwIHRoZSBjb25zdHJ1Y3RvciBtYW51YWxseS4KKyAgICA8L2xpPgorICAgIDxsaT4KKyAgICAgICAgWW91ciBuZXcgY2xhc3MgYXBwZWFycyBpbiBhIG5ldyBKYXZhIGVkaXRvciBwYW5lLgorICAgIDwvbGk+CiA8L29sPgogPHA+Ci0KLTwvcD4KLTxoMiBpZD0iQ3JlYXRlVGVzdEFwcEVjbGlwc2UiPkNyZWF0aW5nIGEgVGVzdCBBcHBsaWNhdGlvbjwvaDI+Ci08cD4KLSAgT25jZSB5b3UgaGF2ZSBjcmVhdGVkIGEgdGVzdCBwcm9qZWN0LCB5b3UgcG9wdWxhdGUgaXQgd2l0aCBhIHRlc3QKLSAgQW5kcm9pZCBhcHBsaWNhdGlvbi4gVGhpcyBhcHBsaWNhdGlvbiBkb2VzIG5vdCByZXF1aXJlIGFuIHtAbGluayBhbmRyb2lkLmFwcC5BY3Rpdml0eSBBY3Rpdml0eX0sCi0gIGFsdGhvdWdoIHlvdSBjYW4gZGVmaW5lIG9uZSBpZiB5b3Ugd2lzaC4gQWx0aG91Z2ggeW91ciB0ZXN0IGFwcGxpY2F0aW9uIGNhbgotICBjb21iaW5lIEFjdGl2aXRpZXMsIEFuZHJvaWQgdGVzdCBjbGFzcyBleHRlbnNpb25zLCBKVW5pdCBleHRlbnNpb25zLCBvcgotICBvcmRpbmFyeSBjbGFzc2VzLCB5b3Ugc2hvdWxkIGV4dGVuZCBvbmUgb2YgdGhlIEFuZHJvaWQgdGVzdCBjbGFzc2VzIG9yIEpVbml0IGNsYXNzZXMsCi0gIGJlY2F1c2UgdGhlc2UgcHJvdmlkZSB0aGUgYmVzdCB0ZXN0aW5nIGZlYXR1cmVzLgorICAgIFlvdSBub3cgaGF2ZSB0byBlbnN1cmUgdGhhdCB0aGUgY29uc3RydWN0b3IgaXMgc2V0IHVwIGNvcnJlY3RseS4gQ3JlYXRlIGEgY29uc3RydWN0b3IgZm9yIHlvdXIKKyAgICBjbGFzcyB0aGF0IGhhcyBubyBhcmd1bWVudHM7IHRoaXMgaXMgcmVxdWlyZWQgYnkgSlVuaXQuIEFzIHRoZSBmaXJzdCBzdGF0ZW1lbnQgaW4gdGhpcworICAgIGNvbnN0cnVjdG9yLCBhZGQgYSBjYWxsIHRvIHRoZSBiYXNlIGNsYXNzJyBjb25zdHJ1Y3Rvci4gRWFjaCBiYXNlIHRlc3QgY2FzZSBjbGFzcyBoYXMgaXRzCisgICAgb3duIGNvbnN0cnVjdG9yIHNpZ25hdHVyZS4gUmVmZXIgdG8gdGhlIGNsYXNzIGRvY3VtZW50YXRpb24gaW4gdGhlIGRvY3VtZW50YXRpb24gZm9yCisgICAge0BsaW5rIGFuZHJvaWQudGVzdH0gZm9yIG1vcmUgaW5mb3JtYXRpb24uCiA8L3A+CiA8cD4KLSAgVGVzdCBhcHBsaWNhdGlvbnMgZG8gbm90IGhhdmUgYW4gQW5kcm9pZCBHVUkuIEluc3RlYWQsIHdoZW4geW91IHJ1biB0aGUgYXBwbGljYXRpb24gaW4KLSAgRWNsaXBzZSB3aXRoIEFEVCwgaXRzIHJlc3VsdHMgYXBwZWFyIGluIHRoZSBKVW5pdCB2aWV3LiBJZiB5b3UgcnVuCi0gIHlvdXIgdGVzdHMgd2l0aCB7QGxpbmsgYW5kcm9pZC50ZXN0Lkluc3RydW1lbnRhdGlvblRlc3RSdW5uZXIgSW5zdHJ1bWVudGF0aW9uVGVzdFJ1bm5lcn0gKG9yIGEgcmVsYXRlZCB0ZXN0IHJ1bm5lciksCi0gIHRoZW4gaXQgd2lsbCBydW4gYWxsIHRoZSBtZXRob2RzIGluIGVhY2ggY2xhc3MuIFlvdSBjYW4gbW9kaWZ5IHRoaXMgYmVoYXZpb3IKLSAgYnkgdXNpbmcgdGhlIHtAbGluayBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlIFRlc3RTdWl0ZX0gY2xhc3MuCi08L3A+Ci0KLTxwPgotICBUbyBjcmVhdGUgYSB0ZXN0IGFwcGxpY2F0aW9uLCBzdGFydCB3aXRoIG9uZSBvZiBBbmRyb2lkJ3MgdGVzdCBjbGFzc2VzIGluIHRoZSBKYXZhIHBhY2thZ2Uge0BsaW5rIGFuZHJvaWQudGVzdCBhbmRyb2lkLnRlc3R9LgotICBUaGVzZSBleHRlbmQgdGhlIEpVbml0IHtAbGluayBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2UgVGVzdENhc2V9IGNsYXNzLiBXaXRoIGEgZmV3IGV4Y2VwdGlvbnMsIHRoZSBBbmRyb2lkIHRlc3QgY2xhc3NlcwotICBhbHNvIHByb3ZpZGUgaW5zdHJ1bWVudGF0aW9uIGZvciB0ZXN0aW5nLgotPC9wPgotPHA+Ci0gIEZvciB0ZXN0IGNsYXNzZXMgdGhhdCBleHRlbmQge0BsaW5rIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSBUZXN0Q2FzZX0sIHlvdSBwcm9iYWJseSB3YW50IHRvIG92ZXJyaWRlCi0gIHRoZSA8Y29kZT5zZXRVcCgpPC9jb2RlPiBhbmQgPGNvZGU+dGVhckRvd24oKTwvY29kZT4gbWV0aG9kczoKKyAgICBUbyBjb250cm9sIHlvdXIgdGVzdCBlbnZpcm9ubWVudCwgeW91IHdpbGwgd2FudCB0byBvdmVycmlkZSB0aGUgPGNvZGU+c2V0VXAoKTwvY29kZT4gYW5kCisgICAgPGNvZGU+dGVhckRvd24oKTwvY29kZT4gbWV0aG9kczoKIDwvcD4KIDx1bD4KLSAgPGxpPgotICAgIDxjb2RlPnNldFVwKCk8L2NvZGU+OiBUaGlzIG1ldGhvZCBpcyBpbnZva2VkIGJlZm9yZSBhbnkgb2YgdGhlIHRlc3QgbWV0aG9kcyBpbiB0aGUgY2xhc3MuCi0gICAgICBVc2UgaXQgdG8gc2V0IHVwIHRoZSBlbnZpcm9ubWVudCBmb3IgdGhlIHRlc3QuIFlvdSBjYW4gdXNlIDxjb2RlPnNldFVwKCk8L2NvZGU+Ci0gICAgICB0byBpbnN0YW50aWF0ZSBhIG5ldyA8Y29kZT5JbnRlbnQ8L2NvZGU+IG9iamVjdCB3aXRoIHRoZSBhY3Rpb24gPGNvZGU+QUNUSU9OX01BSU48L2NvZGU+LiBZb3UgY2FuCi0gICAgICB0aGVuIHVzZSB0aGlzIGludGVudCB0byBzdGFydCB0aGUgQWN0aXZpdHkgdW5kZXIgdGVzdC4KLSAgICAgIDxwIGNsYXNzPSJub3RlIj48c3Ryb25nPk5vdGU6PC9zdHJvbmc+IElmIHlvdSBvdmVycmlkZSB0aGlzIG1ldGhvZCwgY2FsbAotICAgICAgICA8Y29kZT5zdXBlci5zZXRVcCgpPC9jb2RlPiBhcyB0aGUgZmlyc3Qgc3RhdGVtZW50IGluIHlvdXIgY29kZS4KLSAgICAgIDwvcD4KLSAgPC9saT4KLSAgPGxpPgotICAgIDxjb2RlPnRlYXJEb3duKCk8L2NvZGU+OiBUaGlzIG1ldGhvZCBpcyBpbnZva2VkIGFmdGVyIGFsbCB0aGUgdGVzdCBtZXRob2RzIGluIHRoZSBjbGFzcy4gVXNlCi0gICAgaXQgdG8gZG8gZ2FyYmFnZSBjb2xsZWN0aW9uIGFuZCByZS1zZXR0aW5nIGJlZm9yZSBtb3Zpbmcgb24gdG8gdGhlIG5leHQgc2V0IG9mIHRlc3RzLgotICAgIDxwIGNsYXNzPSJub3RlIj48c3Ryb25nPk5vdGU6PC9zdHJvbmc+IElmIHlvdSBvdmVycmlkZSB0aGlzIG1ldGhvZCwgeW91IG11c3QgY2FsbAotICAgIDxjb2RlPnN1cGVyLnRlYXJEb3duKCk8L2NvZGU+IGFzIHRoZSA8ZW0+bGFzdDwvZW0+IHN0YXRlbWVudCBpbiB5b3VyIGNvZGUuPC9wPgotICA8L2xpPgorICAgIDxsaT4KKyAgICAgICAgPGNvZGU+c2V0VXAoKTwvY29kZT46IFRoaXMgbWV0aG9kIGlzIGludm9rZWQgYmVmb3JlIGFueSBvZiB0aGUgdGVzdCBtZXRob2RzIGluIHRoZSBjbGFzcy4KKyAgICAgICAgVXNlIGl0IHRvIHNldCB1cCB0aGUgZW52aXJvbm1lbnQgZm9yIHRoZSB0ZXN0ICh0aGUgdGVzdCBmaXh0dXJlLiBZb3UgY2FuIHVzZQorICAgICAgICA8Y29kZT5zZXRVcCgpPC9jb2RlPiB0byBpbnN0YW50aWF0ZSBhIG5ldyBJbnRlbnQgd2l0aCB0aGUgYWN0aW9uIDxjb2RlPkFDVElPTl9NQUlOPC9jb2RlPi4KKyAgICAgICAgWW91IGNhbiB0aGVuIHVzZSB0aGlzIGludGVudCB0byBzdGFydCB0aGUgQWN0aXZpdHkgdW5kZXIgdGVzdC4KKyAgICA8L2xpPgorICAgIDxsaT4KKyAgICAgICAgPGNvZGU+dGVhckRvd24oKTwvY29kZT46IFRoaXMgbWV0aG9kIGlzIGludm9rZWQgYWZ0ZXIgYWxsIHRoZSB0ZXN0IG1ldGhvZHMgaW4gdGhlIGNsYXNzLiBVc2UKKyAgICAgICAgaXQgdG8gZG8gZ2FyYmFnZSBjb2xsZWN0aW9uIGFuZCB0byByZXNldCB0aGUgdGVzdCBmaXh0dXJlLgorICAgIDwvbGk+CiA8L3VsPgogPHA+Ci0gIEFub3RoZXIgdXNlZnVsIGNvbnZlbnRpb24gaXMgdG8gYWRkIHRoZSBtZXRob2QgPGNvZGU+dGVzdFByZUNvbmRpdGlvbnMoKTwvY29kZT4gdG8geW91ciB0ZXN0Ci0gIGNsYXNzLiBVc2UgdGhpcyBtZXRob2QgdG8gdGVzdCB0aGF0IHRoZSBhcHBsaWNhdGlvbiB1bmRlciB0ZXN0IGlzIGluaXRpYWxpemVkIGNvcnJlY3RseS4gSWYgdGhpcwotICB0ZXN0IGZhaWxzLCB5b3Uga25vdyB0aGF0IHRoYXQgdGhlIGluaXRpYWwgY29uZGl0aW9ucyB3ZXJlIGluIGVycm9yLiBXaGVuIHRoaXMgaGFwcGVucywgZnVydGhlciB0ZXN0Ci0gIHJlc3VsdHMgYXJlIHN1c3BlY3QsIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciBvciBub3QgdGhlIHRlc3RzIHN1Y2NlZWRlZC4KKyAgICBBbm90aGVyIHVzZWZ1bCBjb252ZW50aW9uIGlzIHRvIGFkZCB0aGUgbWV0aG9kIDxjb2RlPnRlc3RQcmVjb25kaXRpb25zKCk8L2NvZGU+IHRvIHlvdXIgdGVzdAorICAgIGNsYXNzLiBVc2UgdGhpcyBtZXRob2QgdG8gdGVzdCB0aGF0IHRoZSBhcHBsaWNhdGlvbiB1bmRlciB0ZXN0IGlzIGluaXRpYWxpemVkIGNvcnJlY3RseS4gSWYgdGhpcworICAgIHRlc3QgZmFpbHMsIHlvdSBrbm93IHRoYXQgdGhhdCB0aGUgaW5pdGlhbCBjb25kaXRpb25zIHdlcmUgaW4gZXJyb3IuIFdoZW4gdGhpcyBoYXBwZW5zLCBmdXJ0aGVyCisgICAgdGVzdCByZXN1bHRzIGFyZSBzdXNwZWN0LCByZWdhcmRsZXNzIG9mIHdoZXRoZXIgb3Igbm90IHRoZSB0ZXN0cyBzdWNjZWVkZWQuCiA8L3A+CiA8cD4KLSAgVGhlIFJlc291cmNlcyB0YWIgY29udGFpbnMgYW4gPGEgaHJlZj0ie0Bkb2NSb290fXJlc291cmNlcy90dXRvcmlhbHMvdGVzdGluZy9hY3Rpdml0eV90ZXN0Lmh0bWwiPkFjdGl2aXR5IFRlc3Rpbmc8L2E+Ci0gIHR1dG9yaWFsIHdpdGggbW9yZSBpbmZvcm1hdGlvbiBhYm91dCBjcmVhdGluZyB0ZXN0IGNsYXNzZXMgYW5kIG1ldGhvZHMuCisgICAgVGhlIFJlc291cmNlcyB0YWIgY29udGFpbnMgYW4KKyAgICA8YSBocmVmPSJ7QGRvY1Jvb3R9cmVzb3VyY2VzL3R1dG9yaWFscy90ZXN0aW5nL2FjdGl2aXR5X3Rlc3QuaHRtbCI+QWN0aXZpdHkgVGVzdGluZzwvYT4KKyAgICB0dXRvcmlhbCB3aXRoIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgY3JlYXRpbmcgdGVzdCBjbGFzc2VzIGFuZCBtZXRob2RzLgogPC9wPgogPGgyIGlkPSJSdW5UZXN0RWNsaXBzZSI+UnVubmluZyBUZXN0czwvaDI+Ci08ZGl2IGNsYXNzPSJzaWRlYm94LXdyYXBwZXIiPgotICAgIDxkaXYgY2xhc3M9InNpZGVib3giPgotICAgICAgICA8aDI+UnVubmluZyB0ZXN0cyBmcm9tIHRoZSBjb21tYW5kIGxpbmU8L2gyPgotICAgICAgICAgICAgPHA+Ci0gICAgICAgICAgICAgICAgSWYgeW91J3ZlIGNyZWF0ZWQgeW91ciB0ZXN0cyBpbiBFY2xpcHNlLCB5b3UgY2FuIHN0aWxsIHJ1biB5b3VyIHRlc3RzIGFuZCB0ZXN0Ci0gICAgICAgICAgICAgICAgc3VpdGVzIGJ5IHVzaW5nIGNvbW1hbmQtbGluZSB0b29scyBpbmNsdWRlZCB3aXRoIHRoZSBBbmRyb2lkIFNESy4gWW91IG1heSB3YW50IHRvCi0gICAgICAgICAgICAgICAgZG8gdGhpcywgZm9yIGV4YW1wbGUsIGlmIHlvdSBoYXZlIGEgbGFyZ2UgbnVtYmVyIG9mIHRlc3RzIHRvIHJ1biwgaWYgeW91IGhhdmUgYQotICAgICAgICAgICAgICAgIGxhcmdlIHRlc3QgY2FzZSwgb3IgaWYgeW91IHdhbnQgYSBmaW5lIGxldmVsIG9mIGNvbnRyb2wgb3ZlciB3aGljaCB0ZXN0cyBhcmUgcnVuIGF0Ci0gICAgICAgICAgICAgICAgYSBwYXJ0aWN1bGFyIHRpbWUuCi0gICAgICAgICAgICA8L3A+Ci0gICAgICAgICAgICA8cD4KLSAgICAgICAgICAgICAgICBUbyBydW4gdGVzdHMgY3JlYXRlZCBpbiBFY2xpcHNlIHdpdGggQURUIHdpdGggY29tbWFuZC1saW5lIHRvb2xzLCB5b3UgbXVzdCBmaXJzdAotICAgICAgICAgICAgICAgIGluc3RhbGwgYWRkaXRpb25hbCBmaWxlcyBpbnRvIHRoZSB0ZXN0IHByb2plY3QgdXNpbmcgdGhlIDxjb2RlPmFuZHJvaWQ8L2NvZGU+IHRvb2wncwotICAgICAgICAgICAgICAgICJjcmVhdGUgdGVzdC1wcm9qZWN0IiBvcHRpb24uIFRvIHNlZSBob3cgdG8gZG8gdGhpcywgcmVhZCB0aGUgc2VjdGlvbgotICAgICAgICAgICAgICAgIDxhIGhyZWY9IntAZG9jUm9vdH1ndWlkZS9kZXZlbG9waW5nL3Rlc3RpbmcvdGVzdGluZ19vdGhlcmlkZS5odG1sI0NyZWF0ZVByb2plY3QiPgotICAgICAgICAgICAgICAgIENyZWF0aW5nIGEgdGVzdCBwcm9qZWN0PC9hPiBpbiB0aGUgdG9waWMKLSAgICAgICAgICAgICAgICA8YSBocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvZGV2ZWxvcGluZy90ZXN0aW5nL3Rlc3Rpbmdfb3RoZXJpZGUuaHRtbCI+VGVzdGluZyBpbiBPdGhlcgotICAgICAgICAgICAgICAgIElERXM8L2E+LgotICAgICAgICAgICAgPC9wPgorICAgIDxkaXYgY2xhc3M9InNpZGVib3gtd3JhcHBlciI+CisgICAgICAgIDxkaXYgY2xhc3M9InNpZGVib3giPgorICAgICAgICAgICAgPGgyPlJ1bm5pbmcgdGVzdHMgZnJvbSB0aGUgY29tbWFuZCBsaW5lPC9oMj4KKyAgICAgICAgICAgICAgICA8cD4KKyAgICAgICAgICAgICAgICAgICAgSWYgeW91J3ZlIGNyZWF0ZWQgeW91ciB0ZXN0cyBpbiBFY2xpcHNlLCB5b3UgY2FuIHN0aWxsIHJ1biB5b3VyIHRlc3RzIGFuZCB0ZXN0CisgICAgICAgICAgICAgICAgICAgIHN1aXRlcyBieSB1c2luZyBjb21tYW5kLWxpbmUgdG9vbHMgaW5jbHVkZWQgd2l0aCB0aGUgQW5kcm9pZCBTREsuIFlvdSBtYXkgd2FudAorICAgICAgICAgICAgICAgICAgICB0byBkbyB0aGlzLCBmb3IgZXhhbXBsZSwgaWYgeW91IGhhdmUgYSBsYXJnZSBudW1iZXIgb2YgdGVzdHMgdG8gcnVuLCBpZiB5b3UKKyAgICAgICAgICAgICAgICAgICAgaGF2ZSBhIGxhcmdlIHRlc3QgY2FzZSwgb3IgaWYgeW91IHdhbnQgYSBmaW5lIGxldmVsIG9mIGNvbnRyb2wgb3ZlciB3aGljaAorICAgICAgICAgICAgICAgICAgICB0ZXN0cyBhcmUgcnVuIGF0IGEgcGFydGljdWxhciB0aW1lLgorICAgICAgICAgICAgICAgIDwvcD4KKyAgICAgICAgICAgICAgICA8cD4KKyAgICAgICAgICAgICAgICAgICAgVG8gcnVuIHRlc3RzIGNyZWF0ZWQgaW4gRWNsaXBzZSB3aXRoIEFEVCB3aXRoIGNvbW1hbmQtbGluZSB0b29scywgeW91IG11c3QgZmlyc3QKKyAgICAgICAgICAgICAgICAgICAgaW5zdGFsbCBhZGRpdGlvbmFsIGZpbGVzIGludG8gdGhlIHRlc3QgcHJvamVjdCB1c2luZyB0aGUgPGNvZGU+YW5kcm9pZDwvY29kZT4KKyAgICAgICAgICAgICAgICAgICAgdG9vbCdzICJjcmVhdGUgdGVzdC1wcm9qZWN0IiBvcHRpb24uIFRvIHNlZSBob3cgdG8gZG8gdGhpcywgcmVhZAorICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9IntAZG9jUm9vdH1ndWlkZS9kZXZlbG9waW5nL3Rlc3RpbmcvdGVzdGluZ19vdGhlcmlkZS5odG1sI0NyZWF0ZVByb2plY3QiPgorICAgICAgICAgICAgICAgICAgICBUZXN0aW5nIGluIE90aGVyIElERXM8L2E+LgorICAgICAgICAgICAgICAgIDwvcD4KKyAgICAgICAgPC9kaXY+CiAgICAgPC9kaXY+Ci08L2Rpdj4KIDxwPgotICBXaGVuIHlvdSBydW4gYSB0ZXN0IGFwcGxpY2F0aW9uIGluIEVjbGlwc2Ugd2l0aCBBRFQsIHRoZSBvdXRwdXQgYXBwZWFycyBpbgotICBhbiBFY2xpcHNlIHZpZXcgcGFuZWwuIFlvdSBjYW4gcnVuIHRoZSBlbnRpcmUgdGVzdCBhcHBsaWNhdGlvbiwgb25lIGNsYXNzLCBvciBvbmUKLSAgbWV0aG9kIG9mIGEgY2xhc3MuIFRvIGRvIHRoaXMsIEVjbGlwc2UgcnVucyB0aGUgPGNvZGU+YWRiPC9jb2RlPiBjb21tYW5kIGZvciBydW5uaW5nIGEgdGVzdCBhcHBsaWNhdGlvbiwgYW5kCi0gIGRpc3BsYXlzIHRoZSBvdXRwdXQsIHNvIHRoZXJlIGlzIG5vIGRpZmZlcmVuY2UgYmV0d2VlbiBydW5uaW5nIHRlc3RzIGluc2lkZSBFY2xpcHNlIGFuZCBydW5uaW5nIHRoZW0gZnJvbSB0aGUgY29tbWFuZCBsaW5lLgorICAgIFdoZW4geW91IHJ1biBhIHRlc3QgcGFja2FnZSBpbiBFY2xpcHNlIHdpdGggQURULCB0aGUgb3V0cHV0IGFwcGVhcnMgaW4gdGhlIEVjbGlwc2UgSlVuaXQgdmlldy4KKyAgICBZb3UgY2FuIHJ1biB0aGUgZW50aXJlIHRlc3QgcGFja2FnZSBvciBvbmUgdGVzdCBjYXNlIGNsYXNzLiBUbyBkbyBydW4gdGVzdHMsIEVjbGlwc2UgcnVucyB0aGUKKyAgICA8Y29kZT5hZGI8L2NvZGU+IGNvbW1hbmQgZm9yIHJ1bm5pbmcgYSB0ZXN0IHBhY2thZ2UsIGFuZCBkaXNwbGF5cyB0aGUgb3V0cHV0LCBzbyB0aGVyZSBpcyBubworICAgIGRpZmZlcmVuY2UgYmV0d2VlbiBydW5uaW5nIHRlc3RzIGluc2lkZSBFY2xpcHNlIGFuZCBydW5uaW5nIHRoZW0gZnJvbSB0aGUgY29tbWFuZCBsaW5lLgogPC9wPgogPHA+Ci0gICAgQXMgd2l0aCBhbnkgb3RoZXIgYXBwbGljYXRpb24sIHRvIHJ1biBhIHRlc3QgYXBwbGljYXRpb24gaW4gRWNsaXBzZSB3aXRoIEFEVCB5b3UgbXVzdCBlaXRoZXIgYXR0YWNoIGEgZGV2aWNlIHRvIHlvdXIKLSAgICBjb21wdXRlciBvciB1c2UgdGhlIEFuZHJvaWQgZW11bGF0b3IuIElmIHlvdSB1c2UgdGhlIGVtdWxhdG9yLCB5b3UgbXVzdCBoYXZlIGFuIEFuZHJvaWQgVmlydHVhbCBEZXZpY2UgKEFWRCkgdGhhdCB1c2VzCi0gICAgdGhlIHNhbWUgdGFyZ2V0CisgICAgQXMgd2l0aCBhbnkgb3RoZXIgcGFja2FnZSwgdG8gcnVuIGEgdGVzdCBwYWNrYWdlIGluIEVjbGlwc2Ugd2l0aCBBRFQgeW91IG11c3QgZWl0aGVyIGF0dGFjaCBhCisgICAgZGV2aWNlIHRvIHlvdXIgY29tcHV0ZXIgb3IgdXNlIHRoZSBBbmRyb2lkIGVtdWxhdG9yLiBJZiB5b3UgdXNlIHRoZSBlbXVsYXRvciwgeW91IG11c3QgaGF2ZSBhbgorICAgIEFuZHJvaWQgVmlydHVhbCBEZXZpY2UgKEFWRCkgdGhhdCB1c2VzIHRoZSBzYW1lIHRhcmdldCBhcyB0aGUgdGVzdCBwYWNrYWdlLgogPC9wPgogPHA+Ci0gIFRvIHJ1biBhIHRlc3QgaW4gRWNsaXBzZSwgeW91IGhhdmUgdHdvIGNob2ljZXM6PC9wPgotPG9sPgotICA8bGk+Ci0gIFJ1biBhIHRlc3QganVzdCBhcyB5b3UgcnVuIGFuIGFwcGxpY2F0aW9uLCBieSBzZWxlY3RpbmcKLSAgPHN0cm9uZz5SdW4gQXMuLi4gJmd0OyBBbmRyb2lkIEpVbml0IFRlc3Q8L3N0cm9uZz4gZnJvbSB0aGUgcHJvamVjdCdzIGNvbnRleHQgbWVudSBvcgotICBmcm9tIHRoZSBtYWluIG1lbnUncyA8c3Ryb25nPlJ1bjwvc3Ryb25nPiBpdGVtLgotICA8L2xpPgotICA8bGk+Ci0gIENyZWF0ZSBhbiBFY2xpcHNlIHJ1biBjb25maWd1cmF0aW9uIGZvciB5b3VyIHRlc3QgcHJvamVjdC4gVGhpcyBpcyB1c2VmdWwgaWYgeW91IHdhbnQgbXVsdGlwbGUgdGVzdCBzdWl0ZXMsIGVhY2ggY29uc2lzdGluZyBvZiBzZWxlY3RlZCB0ZXN0cyBmcm9tIHRoZSBwcm9qZWN0LiBUbyBydW4KLSAgYSB0ZXN0IHN1aXRlLCB5b3UgcnVuIHRoZSB0ZXN0IGNvbmZpZ3VyYXRpb24uCi0gIDxwPgotICAgIENyZWF0aW5nIGFuZCBydW5uaW5nIHRlc3QgY29uZmlndXJhdGlvbnMgaXMgZGVzY3JpYmVkIGluIHRoZSBuZXh0IHNlY3Rpb24uCi0gIDwvcD4KLSAgPC9saT4KLTwvb2w+Ci08cD5UbyBjcmVhdGUgYW5kIHJ1biBhIHRlc3Qgc3VpdGUgdXNpbmcgYSBydW4gY29uZmlndXJhdGlvbjo8L3A+Ci08b2w+Ci0gIDxsaT4KLSAgICBJbiB0aGUgUGFja2FnZSBFeHBsb3Jlciwgc2VsZWN0IHRoZSB0ZXN0Ci0gICAgcHJvamVjdCwgdGhlbiBmcm9tIHRoZSBtYWluIG1lbnUsIHNlbGVjdAotICAgIDxzdHJvbmc+UnVuICZndDsgUnVuIENvbmZpZ3VyYXRpb25zLi4uPC9zdHJvbmc+LiBUaGUKLSAgICBSdW4gQ29uZmlndXJhdGlvbnMgZGlhbG9nIGFwcGVhcnMuCi0gIDwvbGk+Ci0gIDxsaT4KLSAgICBJbiB0aGUgbGVmdC1oYW5kIHBhbmUsIGZpbmQgdGhlCi0gICAgQW5kcm9pZCBKVW5pdCBUZXN0IGVudHJ5LgotICAgIEluIHRoZSByaWdodC1oYW5kIHBhbmUsIGNsaWNrIHRoZSBUZXN0IHRhYi4KLSAgICBUaGUgTmFtZTogdGV4dCBib3gKLSAgICBzaG93cyB0aGUgbmFtZSBvZiB5b3VyIHByb2plY3QuIFRoZQotICAgIFRlc3QgY2xhc3M6IGRyb3Bkb3duIGJveCBzaG93cyBvbmUgeW91ciBwcm9qZWN0J3MgY2xhc3NlcwotICAgIHRlc3QgY2xhc3NlcyBpbiB5b3VyIHByb2plY3QuCi0gIDwvbGk+Ci0gIDxsaT4KLSAgICBUbyBydW4gb25lIHRlc3QgY2xhc3MsIGNsaWNrICBSdW4gYSBzaW5nbGUgdGVzdCwgdGhlbiBlbnRlciB5b3VyIHByb2plY3QKLSAgICBuYW1lIGluIHRoZSBQcm9qZWN0OiB0ZXh0IGJveCBhbmQgdGhlIGNsYXNzIG5hbWUgaW4gdGhlCi0gICAgVGVzdCBjbGFzczogdGV4dCBib3guCi0gICAgPHA+Ci0gICAgICAgIFRvIHJ1biBhbGwgdGhlIHRlc3QgY2xhc3NlcywKLSAgICAgICAgY2xpY2sgUnVuIGFsbCB0ZXN0cyBpbiB0aGUgc2VsZWN0ZWQgcHJvamVjdCBvciBwYWNrYWdlLAotICAgICAgICB0aGVuIGVudGVyIHRoZSBwcm9qZWN0IG9yIHBhY2thZ2UgbmFtZSBpbiB0aGUgdGV4dCBib3guCi0gICAgPC9wPgotIDwvbGk+Ci0gIDxsaT4KLSAgICBOb3cgY2xpY2sgdGhlIFRhcmdldCB0YWIuCi0gICAgPHVsPgotICAgICAgICA8bGk+Ci0gICAgICAgICAgICBPcHRpb25hbDogSWYgeW91IGFyZSB1c2luZyB0aGUgZW11bGF0b3IsIGNsaWNrCi0gICAgICAgICAgICBBdXRvbWF0aWMsIHRoZW4gaW4gdGhlIEFuZHJvaWQgVmlydHVhbCBEZXZpY2UgKEFWRCkKLSAgICAgICAgICAgIHNlbGVjdGlvbiB0YWJsZSwgc2VsZWN0IGFuIGV4aXN0aW5nIEFWRC4KLSAgICAgICAgPC9saT4KLSAgICAgICAgPGxpPgotICAgICAgICAgICAgSW4gdGhlIEVtdWxhdG9yIExhdW5jaCBQYXJhbWV0ZXJzIHBhbmUsIHNldCB0aGUKLSAgICAgICAgICAgIEFuZHJvaWQgZW11bGF0b3IgZmxhZ3MgeW91IHdhbnQgdG8gdXNlLiBUaGVzZSBhcmUgZG9jdW1lbnRlZCBpbiB0aGUgdG9waWMKLSAgICAgICAgICAgIDxhIGhyZWY9IntAZG9jUm9vdH1ndWlkZS9kZXZlbG9waW5nL3Rvb2xzL2VtdWxhdG9yLmh0bWwjc3RhcnR1cC1vcHRpb25zIj5FbXVsYXRvciBTdGFydHVwIE9wdGlvbnM8L2E+LgotICAgICAgICA8L2xpPgotICAgIDwvdWw+Ci0gIDxsaT4KLSAgICBDbGljayB0aGUgQ29tbW9uIHRhYi4gSW4gdGhlCi0gICAgU2F2ZSBBcyBwYW5lLCBjbGljayBMb2NhbCB0byBzYXZlCi0gICAgdGhpcyBydW4gY29uZmlndXJhdGlvbiBsb2NhbGx5LCBvciBjbGljayBTaGFyZWQgdG8KLSAgICBzYXZlIGl0IHRvIGFub3RoZXIgcHJvamVjdC4KLSAgPC9saT4KLSAgPGxpPgotICAgIE9wdGlvbmFsOiBBZGQgdGhlIGNvbmZpZ3VyYXRpb24gdG8gdGhlIFJ1biB0b29sYmFyIGFuZCB0aGUgPHN0cm9uZz5GYXZvcml0ZXM8L3N0cm9uZz4KLSAgICBtZW51OiBpbiB0aGUgRGlzcGxheSBpbiBGYXZvcml0ZXMgcGFuZQotICAgIGNsaWNrIHRoZSBjaGVja2JveCBuZXh0IHRvIFJ1bi4KLSAgPC9saT4KLSAgPGxpPgotICAgIE9wdGlvbmFsOiBUbyBhZGQgdGhpcyBjb25maWd1cmF0aW9uIHRvIHRoZSA8c3Ryb25nPkRlYnVnPC9zdHJvbmc+IG1lbnUgYW5kIHRvb2xiYXIsIGNsaWNrCi0gICAgdGhlIGNoZWNrYm94IG5leHQgdG8gRGVidWcuCi0gIDwvbGk+Ci0gIDxsaT4KLSAgICBUbyBzYXZlIHlvdXIgc2V0dGluZ3MsIGNsaWNrIENsb3NlLjxici8+Ci0gICAgPHAgY2xhc3M9Im5vdGUiPjxzdHJvbmc+Tm90ZTo8L3N0cm9uZz4gQWx0aG91Z2ggeW91IGNhbiBydW4gdGhlIHRlc3QgaW1tZWRpYXRlbHkgYnkKLSAgICBjbGlja2luZyBSdW4sIHlvdSBzaG91bGQgc2F2ZSB0aGUgdGVzdCBmaXJzdCBhbmQgdGhlbgotICAgIHJ1biBpdCBieSBzZWxlY3RpbmcgaXQgZnJvbSB0aGUgRWNsaXBzZSBzdGFuZGFyZCB0b29sYmFyLjwvcD4KLSAgPC9saT4KLSAgPGxpPgotICAgIE9uIHRoZSBFY2xpcHNlIHN0YW5kYXJkIHRvb2xiYXIsIGNsaWNrIHRoZSBkb3duIGFycm93IG5leHQgdG8gdGhlCi0gICAgZ3JlZW4gUnVuIGFycm93LiBUaGlzIGRpc3BsYXlzIGEgbWVudSBvZiBzYXZlZCBSdW4gYW5kIERlYnVnCi0gICAgY29uZmlndXJhdGlvbnMuCi0gIDwvbGk+Ci0gIDxsaT4KLSAgICBTZWxlY3QgdGhlIHRlc3QgcnVuIGNvbmZpZ3VyYXRpb24geW91IGp1c3QgY3JlYXRlZC4KLSAgPC9saT4KLSAgPGxpPgotICAgIFRoZSBwcm9ncmVzcyBvZiB5b3VyIHRlc3QgYXBwZWFycyBpbiB0aGUgQ29uc29sZSB2aWV3LgotICAgIFlvdSBzaG91bGQgc2VlIHRoZSBmb2xsb3dpbmcgbWVzc2FnZXMsIGFtb25nIG90aGVyczoKLSAgICA8dWw+Ci0gICAgICA8bGk+Ci0gICAgICAgIDxjb2RlPlBlcmZvcm1pbmcgQW5kcm9pZC50ZXN0Lkluc3RydW1lbnRhdGlvblRlc3RSdW5uZXIgSlVuaXQgbGF1bmNoPC9jb2RlPjxicj4KLSAgICAgICAgVGhlIGNsYXNzIG5hbWUgdGhhdCBwcm9jZWVkcyAiSlVuaXQiIGRlcGVuZHMgb24gdGhlIEFuZHJvaWQgaW5zdHJ1bWVudGF0aW9uCi0gICAgICAgIGNsYXNzIHlvdSBoYXZlIGNob3Nlbi4KLSAgICAgIDwvbGk+Ci0gICAgICA8bGk+Ci0gICAgICAgIElmIHlvdSBhcmUgdXNpbmcgYW4gZW11bGF0b3IgYW5kIHlvdSBoYXZlIG5vdCB5ZXQgc3RhcnRlZCBpdCwgdGhlbiB5b3Ugd2lsbCBzZWUKLSAgICAgICAgdGhlIG1lc3NhZ2U6CisgICAgVG8gcnVuIGEgdGVzdCBpbiBFY2xpcHNlLCB5b3UgaGF2ZSB0d28gY2hvaWNlczo8L3A+Cis8dWw+CisgICAgPGxpPgorICAgICAgICBSdW4gYSB0ZXN0IGp1c3QgYXMgeW91IHJ1biBhbiBhcHBsaWNhdGlvbiwgYnkgc2VsZWN0aW5nCisgICAgICAgIDxzdHJvbmc+UnVuIEFzLi4uICZndDsgQW5kcm9pZCBKVW5pdCBUZXN0PC9zdHJvbmc+IGZyb20gdGhlIHByb2plY3QncyBjb250ZXh0IG1lbnUgb3IKKyAgICAgICAgZnJvbSB0aGUgbWFpbiBtZW51J3MgPHN0cm9uZz5SdW48L3N0cm9uZz4gaXRlbS4KKyAgICA8L2xpPgorICAgIDxsaT4KKyAgICAgICAgQ3JlYXRlIGFuIEVjbGlwc2UgcnVuIGNvbmZpZ3VyYXRpb24gZm9yIHlvdXIgdGVzdCBwcm9qZWN0LiBUaGlzIGlzIHVzZWZ1bCBpZiB5b3Ugd2FudAorICAgICAgICBtdWx0aXBsZSB0ZXN0IHN1aXRlcywgZWFjaCBjb25zaXN0aW5nIG9mIHNlbGVjdGVkIHRlc3RzIGZyb20gdGhlIHByb2plY3QuIFRvIHJ1bgorICAgICAgICBhIHRlc3Qgc3VpdGUsIHlvdSBydW4gdGhlIHRlc3QgY29uZmlndXJhdGlvbi4KICAgICAgICAgPHA+Ci0gICAgICAgICAgPGNvZGU+QXV0b21hdGljIFRhcmdldCBNb2RlOiBsYXVuY2hpbmcgbmV3IGVtdWxhdG9yIHdpdGggY29tcGF0aWJsZQotICAgICAgICAgIEFWRCA8ZW0+YXZkbmFtZTwvZW0+PC9jb2RlPjxicj4od2hlcmUgPGVtPmF2ZG5hbWU8L2VtPiBpcyB0aGUgbmFtZSBvZgotICAgICAgICAgIHRoZSBBVkQgeW91IGFyZSB1c2luZy4pCisgICAgICAgICAgICBDcmVhdGluZyBhbmQgcnVubmluZyB0ZXN0IGNvbmZpZ3VyYXRpb25zIGlzIGRlc2NyaWJlZCBpbiB0aGUgbmV4dCBzZWN0aW9uLgogICAgICAgICA8L3A+Ci0gICAgICA8L2xpPgotICAgICAgPGxpPgotICAgICAgICBJZiB5b3UgaGF2ZSBub3QgYWxyZWFkeSBpbnN0YWxsZWQgeW91ciB0ZXN0IGFwcGxpY2F0aW9uLCB0aGVuIHlvdSB3aWxsIHNlZQotICAgICAgICB0aGUgbWVzc2FnZToKKyAgICA8L2xpPgorPC91bD4KKzxwPgorICAgIFRvIGNyZWF0ZSBhbmQgcnVuIGEgdGVzdCBzdWl0ZSB1c2luZyBhIHJ1biBjb25maWd1cmF0aW9uOgorPC9wPgorPG9sPgorICAgIDxsaT4KKyAgICAgICAgSW4gdGhlIFBhY2thZ2UgRXhwbG9yZXIsIHNlbGVjdCB0aGUgdGVzdCBwcm9qZWN0LCB0aGVuIGZyb20gdGhlIG1haW4gbWVudSwgc2VsZWN0CisgICAgICAgIDxzdHJvbmc+UnVuICZndDsgUnVuIENvbmZpZ3VyYXRpb25zLi4uPC9zdHJvbmc+LiBUaGUgUnVuIENvbmZpZ3VyYXRpb25zIGRpYWxvZyBhcHBlYXJzLgorICAgIDwvbGk+CisgICAgPGxpPgorICAgICAgICBJbiB0aGUgbGVmdC1oYW5kIHBhbmUsIGZpbmQgdGhlIEFuZHJvaWQgSlVuaXQgVGVzdCBlbnRyeS4gSW4gdGhlIHJpZ2h0LWhhbmQgcGFuZSwgY2xpY2sgdGhlCisgICAgICAgIFRlc3QgdGFiLiBUaGUgTmFtZTogdGV4dCBib3ggc2hvd3MgdGhlIG5hbWUgb2YgeW91ciBwcm9qZWN0LiBUaGUgVGVzdCBjbGFzczogZHJvcGRvd24gYm94CisgICAgICAgIHNob3dzIG9uZSBvZiB0aGUgdGVzdCBjbGFzc2VzIGluIHlvdXIgcHJvamVjdC4KKyAgICA8L2xpPgorICAgIDxsaT4KKyAgICAgICAgVG8gcnVuIG9uZSB0ZXN0IGNsYXNzLCBjbGljayAgUnVuIGEgc2luZ2xlIHRlc3QsIHRoZW4gZW50ZXIgeW91ciBwcm9qZWN0IG5hbWUgaW4gdGhlCisgICAgICAgIFByb2plY3Q6IHRleHQgYm94IGFuZCB0aGUgY2xhc3MgbmFtZSBpbiB0aGUgVGVzdCBjbGFzczogdGV4dCBib3guCiAgICAgICAgIDxwPgotICAgICAgICAgIDxjb2RlPlVwbG9hZGluZyA8ZW0+dGVzdGNsYXNzPC9lbT4uYXBrIG9udG8gZGV2aWNlICc8ZW0+ZGV2aWNlLWlkPC9lbT4nPC9jb2RlPjxicj4KLSAgICAgICAgICB3aGVyZSA8ZW0+dGVzdGNsYXNzPC9lbT4gaXMgdGhlIG5hbWUgb2YgeW91ciB1bml0IHRlc3QgY2xhc3MgYW5kIDxlbT5kZXZpY2UtaWQ8L2VtPgotICAgICAgICAgIGlzIHRoZSBuYW1lIGFuZCBwb3J0IGZvciB5b3VyIHRlc3QgZGV2aWNlIG9yIGVtdWxhdG9yLCBmb2xsb3dlZCBieSB0aGUgbWVzc2FnZSA8Y29kZT5JbnN0YWxsaW5nIDxlbT50ZXN0Y2xhc3M8L2VtPi5hcGs8L2NvZGU+CisgICAgICAgICAgICBUbyBydW4gYWxsIHRoZSB0ZXN0IGNsYXNzZXMsIGNsaWNrIFJ1biBhbGwgdGVzdHMgaW4gdGhlIHNlbGVjdGVkIHByb2plY3Qgb3IgcGFja2FnZSwKKyAgICAgICAgICAgIHRoZW4gZW50ZXIgdGhlIHByb2plY3Qgb3IgcGFja2FnZSBuYW1lIGluIHRoZSB0ZXh0IGJveC4KICAgICAgICAgPC9wPgotICAgICAgPC9saT4KLSAgICAgIDxsaT4KLSAgICAgICA8Y29kZT5MYXVuY2hpbmcgaW5zdHJ1bWVudGF0aW9uIEFuZHJvaWQudGVzdC5JbnN0cnVtZW50YXRpb25UZXN0UnVubmVyIG9uIGRldmljZSA8ZW0+ZGV2aWNlLWlkPC9lbT48L2NvZGU+Ljxicj4KLSAgICAgICBUaGlzIGluZGljYXRlcyB0aGF0IEFuZHJvaWQncyBJbnN0cnVtZW50YXRpb24gc3lzdGVtIGlzIG5vdyB0ZXN0aW5nIHlvdXIgY29kZS4gQWdhaW4sIHRoZQotICAgICAgIGluc3RydW1lbnRhdGlvbiBjbGFzcyBuYW1lIGRlcGVuZHMgb24gdGhlIEFuZHJvaWQgaW5zdHJ1bWVudGF0aW9uIGNsYXNzIHlvdSBoYXZlIGNob3Nlbi4KLSAgICAgIDwvbGk+Ci0gICAgICA8bGk+Ci0gICAgICAgPGNvZGU+VGVzdCBydW4gY29tcGxldGU8L2NvZGU+Ljxicj4gV2hlbiB5b3Ugc2VlIHRoaXMsIHlvdXIgdW5pdCB0ZXN0cyBoYXZlIGZpbmlzaGVkLgotICAgICAgPC9saT4KLSAgICA8L3VsPgorICAgIDwvbGk+CisgICAgPGxpPgorICAgICAgICBOb3cgY2xpY2sgdGhlIFRhcmdldCB0YWIuCisgICAgICAgIDx1bD4KKyAgICAgICAgICAgIDxsaT4KKyAgICAgICAgICAgICAgICBPcHRpb25hbDogSWYgeW91IGFyZSB1c2luZyB0aGUgZW11bGF0b3IsIGNsaWNrIEF1dG9tYXRpYywgdGhlbiBpbiB0aGUgQW5kcm9pZAorICAgICAgICAgICAgICAgIFZpcnR1YWwgRGV2aWNlIChBVkQpIHNlbGVjdGlvbiB0YWJsZSwgc2VsZWN0IGFuIGV4aXN0aW5nIEFWRC4KKyAgICAgICAgICAgIDwvbGk+CisgICAgICAgICAgICA8bGk+CisgICAgICAgICAgICAgICAgSW4gdGhlIEVtdWxhdG9yIExhdW5jaCBQYXJhbWV0ZXJzIHBhbmUsIHNldCB0aGUgQW5kcm9pZCBlbXVsYXRvciBmbGFncyB5b3Ugd2FudCB0bworICAgICAgICAgICAgICAgIHVzZS4gVGhlc2UgYXJlIGRvY3VtZW50ZWQgaW4gdGhlIHRvcGljCisgICAgICAgICAgICAgICAgPGEgaHJlZj0ie0Bkb2NSb290fWd1aWRlL2RldmVsb3BpbmcvdG9vbHMvZW11bGF0b3IuaHRtbCNzdGFydHVwLW9wdGlvbnMiPgorICAgICAgICAgICAgICAgIEFuZHJvaWQgRW11bGF0b3I8L2E+LgorICAgICAgICAgICAgPC9saT4KKyAgICAgICAgPC91bD4KKyAgICA8bGk+CisgICAgICAgIENsaWNrIHRoZSBDb21tb24gdGFiLiBJbiB0aGUgU2F2ZSBBcyBwYW5lLCBjbGljayBMb2NhbCB0byBzYXZlIHRoaXMgcnVuIGNvbmZpZ3VyYXRpb24KKyAgICAgICAgbG9jYWxseSwgb3IgY2xpY2sgU2hhcmVkIHRvIHNhdmUgaXQgdG8gYW5vdGhlciBwcm9qZWN0LgorICAgIDwvbGk+CisgICAgPGxpPgorICAgICAgICBPcHRpb25hbDogQWRkIHRoZSBjb25maWd1cmF0aW9uIHRvIHRoZSBSdW4gdG9vbGJhciBhbmQgdGhlIDxzdHJvbmc+RmF2b3JpdGVzPC9zdHJvbmc+CisgICAgICAgIG1lbnU6IGluIHRoZSBEaXNwbGF5IGluIEZhdm9yaXRlcyBwYW5lIGNsaWNrIHRoZSBjaGVja2JveCBuZXh0IHRvIFJ1bi4KKyAgICA8L2xpPgorICAgIDxsaT4KKyAgICAgICAgT3B0aW9uYWw6IFRvIGFkZCB0aGlzIGNvbmZpZ3VyYXRpb24gdG8gdGhlIDxzdHJvbmc+RGVidWc8L3N0cm9uZz4gbWVudSBhbmQgdG9vbGJhciwgY2xpY2sKKyAgICAgICAgdGhlIGNoZWNrYm94IG5leHQgdG8gRGVidWcuCisgICAgPC9saT4KKyAgICA8bGk+CisgICAgICAgIFRvIHNhdmUgeW91ciBzZXR0aW5ncywgY2xpY2sgQ2xvc2UuPGJyLz4KKyAgICAgICAgPHAgY2xhc3M9Im5vdGUiPjxzdHJvbmc+Tm90ZTo8L3N0cm9uZz4KKyAgICAgICAgICAgIEFsdGhvdWdoIHlvdSBjYW4gcnVuIHRoZSB0ZXN0IGltbWVkaWF0ZWx5IGJ5IGNsaWNraW5nIFJ1biwgeW91IHNob3VsZCBzYXZlIHRoZSB0ZXN0CisgICAgICAgICAgICBmaXJzdCBhbmQgdGhlbiBydW4gaXQgYnkgc2VsZWN0aW5nIGl0IGZyb20gdGhlIEVjbGlwc2Ugc3RhbmRhcmQgdG9vbGJhci4KKyAgICAgICAgPC9wPgorICAgIDwvbGk+CisgICAgPGxpPgorICAgICAgICBPbiB0aGUgRWNsaXBzZSBzdGFuZGFyZCB0b29sYmFyLCBjbGljayB0aGUgZG93biBhcnJvdyBuZXh0IHRvIHRoZSBncmVlbiBSdW4gYXJyb3cuIFRoaXMKKyAgICAgICAgZGlzcGxheXMgYSBtZW51IG9mIHNhdmVkIFJ1biBhbmQgRGVidWcgY29uZmlndXJhdGlvbnMuCisgICAgPC9saT4KKyAgICA8bGk+CisgICAgICAgIFNlbGVjdCB0aGUgdGVzdCBydW4gY29uZmlndXJhdGlvbiB5b3UganVzdCBjcmVhdGVkLiBUaGUgdGVzdCBzdGFydHMuCisgICAgPC9saT4KIDwvb2w+CiA8cD4KLSAgICAgICAgVGhlIHRlc3QgcmVzdWx0cyBhcHBlYXIgaW4gdGhlIEpVbml0IHZpZXcuIFRoaXMgaXMgZGl2aWRlZCBpbnRvIGFuIHVwcGVyIHN1bW1hcnkgcGFuZSwKLSAgICAgICAgYW5kIGEgbG93ZXIgc3RhY2sgdHJhY2UgcGFuZS4KKyAgICBUaGUgcHJvZ3Jlc3Mgb2YgeW91ciB0ZXN0IGFwcGVhcnMgaW4gdGhlIENvbnNvbGUgdmlldyBhcyBhIHNlcmllcyBvZiBtZXNzYWdlcy4gRWFjaCBtZXNzYWdlIGlzCisgICAgcHJlY2VkZWQgYnkgYSB0aW1lc3RhbXAgYW5kIHRoZSBBbmRyb2lkIHBhY2thZ2UgbmFtZSB0byB3aGljaCBpdCBhcHBsaWVzLgorICAgIEluIHRoZSBmb2xsb3dpbmcgZGVzY3JpcHRpb24gb2YgdGhlc2UgbWVzc2FnZXMsIDxjb2RlPjxlbT5kZXZpY2VuYW1lPC9lbT48L2NvZGU+IGlzIHRoZSBuYW1lIG9mCisgICAgdGhlIGRldmljZSBvciBlbXVsYXRvciB5b3UgYXJlIHVzaW5nIHRvIHJ1biB0aGUgdGVzdCwgYW5kIDxjb2RlPjxlbT5wb3J0PC9lbT48L2NvZGU+IGlzIHRoZQorICAgIHBvcnQgbnVtYmVyIGZvciB0aGUgZGV2aWNlLiBUaGUgbmFtZSBhbmQgcG9ydCBudW1iZXIgYXJlIGluIHRoZSBmb3JtYXQgdXNlZCBieSB0aGUKKyAgICA8Y29kZT48YSBocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvZGV2ZWxvcGluZy90b29scy9hZGIuaHRtbCNkZXZpY2VzdGF0dXMiPmFkYiBkZXZpY2VzPC9hPjwvY29kZT4KKyAgICBjb21tYW5kLiBBbHNvLCA8Y29kZT48ZW0+dGVzdHBhY2thZ2U8L2VtPjwvY29kZT4gaXMgdGhlIG5hbWUgb2YgdGhlIHRlc3QgcGFja2FnZSB5b3UgYXJlCisgICAgcnVubmluZywgYW5kIDxlbT5hcHBfcGFja2FnZTwvZW0+IGlzIHRoZSBsYWJlbCBmb3IgdGhlIGFwcGxpY2F0aW9uIHVuZGVyIHRlc3QuCis8L3A+Cis8dWw+CisgICAgPGxpPgorICAgICAgICBJZiB5b3UgYXJlIHVzaW5nIGFuIGVtdWxhdG9yIGFuZCB5b3UgaGF2ZSBub3QgeWV0IHN0YXJ0ZWQgaXQsIHRoZW4gRWNsaXBzZQorICAgICAgICBmaXJzdCBzdGFydHMgdGhlIGVtdWxhdG9yLiBXaGVuIHRoaXMgaXMgY29tcGxldGUsIHlvdSBzZWUKKyAgICAgICAgdGhlIG1lc3NhZ2U6CisgICAgICAgIDxwPgorICAgICAgICAgICAgPGNvZGU+SE9NRSBpcyB1cCBvbiBkZXZpY2UgJzxlbT5kZXZpY2VuYW1lPC9lbT4tPGVtPnBvcnQ8L2VtPic8L2NvZGU+CisgICAgICAgIDwvcD4KKyAgICA8L2xpPgorICAgIDxsaT4KKyAgICAgICAgSWYgeW91IGhhdmUgbm90IGFscmVhZHkgaW5zdGFsbGVkIHlvdXIgdGVzdCBwYWNrYWdlLCB0aGVuIHlvdSBzZWUKKyAgICAgICAgdGhlIG1lc3NhZ2U6CisgICAgICAgIDxwPgorICAgICAgICAgICAgPGNvZGU+VXBsb2FkaW5nIDxlbT50ZXN0cGFja2FnZTwvZW0+IG9udG8gZGV2aWNlICc8ZW0+ZGV2aWNlbmFtZTwvZW0+LTxlbT5wb3J0PC9lbT4nCisgICAgICAgICAgICA8L2NvZGU+CisgICAgICAgIDwvcD4KKyAgICAgICAgPHA+CisgICAgICAgICAgICB0aGVuIHRoZSBtZXNzYWdlIDxjb2RlPkluc3RhbGxpbmcgPGVtPnRlc3RwYWNrYWdlPC9lbT48L2NvZGU+LgorICAgICAgICA8L3A+CisgICAgICAgIDxwPgorICAgICAgICAgICAgYW5kIGZpbmFsbHkgdGhlIG1lc3NhZ2UgPGNvZGU+U3VjY2VzcyE8L2NvZGU+CisgICAgICAgIDwvcD4KKyAgICA8L2xpPgorICAgIDxsaT4KKyAgICAgICAgTmV4dCwgaWYgeW91IGhhdmUgbm90IHlldCBpbnN0YWxsZWQgdGhlIGFwcGxpY2F0aW9uIHVuZGVyIHRlc3QgdG8gdGhlIGRldmljZSBvcgorICAgICAgICBlbXVsYXRvciwgeW91IHNlZSB0aGUgbWVzc2FnZQorICAgICAgICA8cD4KKyAgICAgICAgPGNvZGU+UHJvamVjdCBkZXBlbmRlbmN5IGZvdW5kLCBpbnN0YWxsaW5nOiA8ZW0+YXBwX3BhY2thZ2U8L2VtPjwvY29kZT4KKyAgICAgICAgPC9wPgorICAgICAgICA8cD4KKyAgICAgICAgICAgIHRoZW4gdGhlIG1lc3NhZ2UgPGNvZGU+VXBsb2FkaW5nIDxlbT5hcHBfbmFtZTwvZW0+LmFwazwvY29kZT4gb250byBkZXZpY2UKKyAgICAgICAgICAgICc8ZW0+ZGV2aWNlbmFtZTwvZW0+LTxlbT5wb3J0PC9lbT4nCisgICAgICAgIDwvcD4KKyAgICAgICAgPHA+CisgICAgICAgICAgICB0aGVuIHRoZSBtZXNzYWdlIDxjb2RlPkluc3RhbGxpbmcgPGVtPmFwcF9uYW1lPC9lbT4uYXBrPC9jb2RlPgorICAgICAgICA8L3A+CisgICAgICAgIDxwPgorICAgICAgICAgICAgYW5kIGZpbmFsbHkgdGhlIG1lc3NhZ2UgPGNvZGU+U3VjY2VzcyE8L2NvZGU+CisgICAgICAgIDwvcD4KKyAgICA8L2xpPgorICAgIDxsaT4KKyAgICAgICAgTmV4dCwgeW91IHNlZSB0aGUgbWVzc2FnZQorICAgICAgICA8Y29kZT5MYXVuY2hpbmcgaW5zdHJ1bWVudGF0aW9uIDxlbT5pbnN0cnVtZW50YXRpb25fY2xhc3M8L2VtPiBvbiBkZXZpY2UKKyAgICAgICAgPGVtPmRldmljZW5hbWU8L2VtPi08ZW0+cG9ydDwvZW0+PC9jb2RlPgorICAgICAgICA8cD4KKyAgICAgICAgICAgIDxjb2RlPmluc3RydW1lbnRhdGlvbl9jbGFzczwvY29kZT4gaXMgdGhlIGZ1bGx5LXF1YWxpZmllZCBjbGFzcyBuYW1lIG9mIHRoZQorICAgICAgICAgICAgaW5zdHJ1bWVudGF0aW9uIHRlc3QgcnVubmVyIHlvdSBoYXZlIHNwZWNpZmllZCAodXN1YWxseQorICAgICAgICAgICAge0BsaW5rIGFuZHJvaWQudGVzdC5JbnN0cnVtZW50YXRpb25UZXN0UnVubmVyfS4KKyAgICAgICAgPC9wPgorICAgIDwvbGk+CisgICAgPGxpPgorICAgICAgICBOZXh0LCBhcyB7QGxpbmsgYW5kcm9pZC50ZXN0Lkluc3RydW1lbnRhdGlvblRlc3RSdW5uZXJ9IGJ1aWxkcyBhIGxpc3Qgb2YgdGVzdHMgdG8gcnVuLAorICAgICAgICB5b3Ugc2VlIHRoZSBtZXNzYWdlCisgICAgICAgIDxwPgorICAgICAgICAgICAgPGNvZGU+Q29sbGVjdGluZyB0ZXN0IGluZm9ybWF0aW9uPC9jb2RlPgorICAgICAgICA8L3A+CisgICAgICAgIDxwPgorICAgICAgICAgICAgZm9sbG93ZWQgYnkKKyAgICAgICAgPC9wPgorICAgICAgICA8cD4KKyAgICAgICAgICAgIDxjb2RlPlNlbmRpbmcgdGVzdCBpbmZvcm1hdGlvbiB0byBFY2xpcHNlPC9jb2RlPgorICAgICAgICA8L3A+CisgICAgPC9saT4KKyAgICA8bGk+CisgICAgICAgIEZpbmFsbHksIHlvdSBzZWUgdGhlIG1lc3NhZ2UgPGNvZGU+UnVubmluZyB0ZXN0czwvY29kZT4sIHdoaWNoIGluZGljYXRlcyB0aGF0IHlvdXIgdGVzdHMKKyAgICAgICAgYXJlIHJ1bm5pbmcuIEF0IHRoaXMgcG9pbnQsIHlvdSBzaG91bGQgc3RhcnQgc2VlaW5nIHRoZSB0ZXN0IHJlc3VsdHMgaW4gdGhlIEpVbml0IHZpZXcuCisgICAgICAgIFdoZW4gdGhlIHRlc3RzIGFyZSBmaW5pc2hlZCwgeW91IHNlZSB0aGUgY29uc29sZSBtZXNzYWdlIDxjb2RlPlRlc3QgcnVuIGNvbXBsZXRlPC9jb2RlPi4KKyAgICAgICAgVGhpcyBpbmRpY2F0ZXMgdGhhdCB5b3VyIHRlc3RzIGFyZSBmaW5pc2hlZC4KKyAgICA8L2xpPgorPC91bD4KKzxwPgorICAgIFRoZSB0ZXN0IHJlc3VsdHMgYXBwZWFyIGluIHRoZSBKVW5pdCB2aWV3LiBUaGlzIGlzIGRpdmlkZWQgaW50byBhbiB1cHBlciBzdW1tYXJ5IHBhbmUsCisgICAgYW5kIGEgbG93ZXIgc3RhY2sgdHJhY2UgcGFuZS4KIDwvcD4KIDxwPgotICAgICAgICBUaGUgdXBwZXIgcGFuZSBjb250YWlucyB0ZXN0IGluZm9ybWF0aW9uLiBJbiB0aGUgcGFuZSdzIGhlYWRlciwgeW91IHNlZSB0aGUgZm9sbG93aW5nCi0gICAgICAgIGluZm9ybWF0aW9uOgorICAgIFRoZSB1cHBlciBwYW5lIGNvbnRhaW5zIHRlc3QgaW5mb3JtYXRpb24uIEluIHRoZSBwYW5lJ3MgaGVhZGVyLCB5b3Ugc2VlIHRoZSBmb2xsb3dpbmcKKyAgICBpbmZvcm1hdGlvbjoKIDwvcD4KLSAgICA8dWw+Ci0gICAgICAgIDxsaT4KLSAgICAgICAgICAgVG90YWwgdGltZSBlbGFwc2VkIGZvciB0aGUgdGVzdCBhcHBsaWNhdGlvbiAobGFiZWxlZCBGaW5pc2hlZCBhZnRlciA8ZW0+eDwvZW0+IHNlY29uZHMpLgotICAgICAgICA8L2xpPgotICAgICAgICA8bGk+Ci0gICAgICAgICAgIE51bWJlciBvZiBydW5zIChSdW5zOikgLSB0aGUgbnVtYmVyIG9mIHRlc3RzIGluIHRoZSBlbnRpcmUgdGVzdCBjbGFzcy4KLSAgICAgICAgPC9saT4KLSAgICAgICAgPGxpPgotICAgICAgICAgICBOdW1iZXIgb2YgZXJyb3JzIChFcnJvcnM6KSAtIHRoZSBudW1iZXIgb2YgcHJvZ3JhbSBlcnJvcnMgYW5kIGV4Y2VwdGlvbnMgZW5jb3VudGVyZWQKLSAgICAgICAgICAgZHVyaW5nIHRoZSB0ZXN0IHJ1bi4KLSAgICAgICAgPC9saT4KLSAgICAgICAgPGxpPgotICAgICAgICAgICBOdW1iZXIgb2YgZmFpbHVyZXMgKEZhaWx1cmVzOikgLSB0aGUgbnVtYmVyIG9mIHRlc3QgZmFpbHVyZXMgZW5jb3VudGVyZWQgZHVyaW5nIHRoZSB0ZXN0Ci0gICAgICAgICAgIHJ1bi4gVGhpcyBpcyB0aGUgbnVtYmVyIG9mIGFzc2VydGlvbiBmYWlsdXJlcy4gQSB0ZXN0IGNhbiBmYWlsIGV2ZW4gaWYgdGhlIHByb2dyYW0gZG9lcwotICAgICAgICAgICBub3QgZW5jb3VudGVyIGFuIGVycm9yLgotICAgICAgICA8L2xpPgotICAgICAgICA8bGk+Ci0gICAgICAgICAgIEEgcHJvZ3Jlc3MgYmFyLiBUaGUgcHJvZ3Jlc3MgYmFyIGV4dGVuZHMgZnJvbSBsZWZ0IHRvIHJpZ2h0IGFzIHRoZSB0ZXN0cyBydW4uIElmIGFsbCB0aGUKLSAgICAgICAgICAgdGVzdHMgc3VjY2VlZCwgdGhlIGJhciByZW1haW5zIGdyZWVuLiBJZiBhIHRlc3QgZmFpbHMsIHRoZSBiYXIgdHVybnMgZnJvbSBncmVlbiB0byByZWQuCi0gICAgICAgIDwvbGk+Ci0gICAgPC91bD4KKzx1bD4KKyAgICA8bGk+CisgICAgICAgIFRvdGFsIHRpbWUgZWxhcHNlZCBmb3IgdGhlIHRlc3QgcGFja2FnZSAobGFiZWxlZCBGaW5pc2hlZCBhZnRlciA8ZW0+eDwvZW0+IHNlY29uZHMpLgorICAgIDwvbGk+CisgICAgPGxpPgorICAgICAgICBOdW1iZXIgb2YgcnVucyAoUnVuczopIC0gdGhlIG51bWJlciBvZiB0ZXN0cyBpbiB0aGUgZW50aXJlIHRlc3QgY2xhc3MuCisgICAgPC9saT4KKyAgICA8bGk+CisgICAgICAgIE51bWJlciBvZiBlcnJvcnMgKEVycm9yczopIC0gdGhlIG51bWJlciBvZiBwcm9ncmFtIGVycm9ycyBhbmQgZXhjZXB0aW9ucyBlbmNvdW50ZXJlZAorICAgICAgICBkdXJpbmcgdGhlIHRlc3QgcnVuLgorICAgIDwvbGk+CisgICAgPGxpPgorICAgICAgICBOdW1iZXIgb2YgZmFpbHVyZXMgKEZhaWx1cmVzOikgLSB0aGUgbnVtYmVyIG9mIHRlc3QgZmFpbHVyZXMgZW5jb3VudGVyZWQgZHVyaW5nIHRoZSB0ZXN0CisgICAgICAgIHJ1bi4gVGhpcyBpcyB0aGUgbnVtYmVyIG9mIGFzc2VydGlvbiBmYWlsdXJlcy4gQSB0ZXN0IGNhbiBmYWlsIGV2ZW4gaWYgdGhlIHByb2dyYW0gZG9lcworICAgICAgICBub3QgZW5jb3VudGVyIGFuIGVycm9yLgorICAgIDwvbGk+CisgICAgPGxpPgorICAgICAgICBBIHByb2dyZXNzIGJhci4gVGhlIHByb2dyZXNzIGJhciBleHRlbmRzIGZyb20gbGVmdCB0byByaWdodCBhcyB0aGUgdGVzdHMgcnVuLiBJZiBhbGwgdGhlCisgICAgICAgIHRlc3RzIHN1Y2NlZWQsIHRoZSBiYXIgcmVtYWlucyBncmVlbi4gSWYgYSB0ZXN0IGZhaWxzLCB0aGUgYmFyIHR1cm5zIGZyb20gZ3JlZW4gdG8gcmVkLgorICAgIDwvbGk+Cis8L3VsPgogPHA+CiAgICAgVGhlIGJvZHkgb2YgdGhlIHVwcGVyIHBhbmUgY29udGFpbnMgdGhlIGRldGFpbHMgb2YgdGhlIHRlc3QgcnVuLiBGb3IgZWFjaCB0ZXN0IGNhc2UgY2xhc3MKICAgICB0aGF0IHdhcyBydW4sIHlvdSBzZWUgYSBsaW5lIHdpdGggdGhlIGNsYXNzIG5hbWUuIFRvIGxvb2sgYXQgdGhlIHJlc3VsdHMgZm9yIHRoZSBpbmRpdmlkdWFsCmRpZmYgLS1naXQgYS9kb2NzL2h0bWwvZ3VpZGUvZGV2ZWxvcGluZy90ZXN0aW5nL3Rlc3Rpbmdfb3RoZXJpZGUuamQgYi9kb2NzL2h0bWwvZ3VpZGUvZGV2ZWxvcGluZy90ZXN0aW5nL3Rlc3Rpbmdfb3RoZXJpZGUuamQKaW5kZXggMmJkZjRkMC4uNTIzYThlNSAxMDA2NDQKLS0tIGEvZG9jcy9odG1sL2d1aWRlL2RldmVsb3BpbmcvdGVzdGluZy90ZXN0aW5nX290aGVyaWRlLmpkCisrKyBiL2RvY3MvaHRtbC9ndWlkZS9kZXZlbG9waW5nL3Rlc3RpbmcvdGVzdGluZ19vdGhlcmlkZS5qZApAQCAtMiwxMjIgKzIsMTI4IEBACiBAamQ6Ym9keQogCiA8ZGl2IGlkPSJxdi13cmFwcGVyIj4KLSAgPGRpdiBpZD0icXYiPgotICA8aDI+SW4gdGhpcyBkb2N1bWVudDwvaDI+Ci0gIDxvbD4KLSAgICA8bGk+Ci0gICAgICAgIDxhIGhyZWY9IiNDcmVhdGVUZXN0UHJvamVjdENvbW1hbmQiPldvcmtpbmcgd2l0aCBUZXN0IFByb2plY3RzPC9hPgotICAgICAgICA8b2w+Ci0gICAgICAgICAgICA8bGk+Ci0gICAgICAgICAgICAgICAgPGEgaHJlZj0iI0NyZWF0ZVRlc3RQcm9qZWN0Ij5DcmVhdGluZyBhIHRlc3QgcHJvamVjdDwvYT4KLSAgICAgICAgICAgIDwvbGk+Ci0gICAgICAgICAgICA8bGk+Ci0gICAgICAgICAgICAgICAgPGEgaHJlZj0iI1VwZGF0ZVRlc3RQcm9qZWN0Ij5VcGRhdGluZyBhIHRlc3QgcHJvamVjdDwvYT4KLSAgICAgICAgICAgIDwvbGk+Ci0gICAgICAgIDwvb2w+Ci0gICAgPC9saT4KLSAgICA8bGk+Ci0gICAgICAgIDxhIGhyZWY9IiNDcmVhdGVUZXN0QXBwIj5DcmVhdGluZyBhIFRlc3QgQXBwbGljYXRpb248L2E+Ci0gICAgPC9saT4KLSAgICA8bGk+Ci0gICAgICAgIDxhIGhyZWY9IiNSdW5UZXN0c0NvbW1hbmQiPlJ1bm5pbmcgVGVzdHM8L2E+Ci0gICAgICAgIDxvbD4KLSAgICAgICAgICAgIDxsaT4KLSAgICAgICAgICAgICAgICA8YSBocmVmPSIjUnVuVGVzdHNBbnQiPlF1aWNrIGJ1aWxkIGFuZCBydW4gd2l0aCBBbnQ8L2E+Ci0gICAgICAgICAgICA8L2xpPgotICAgICAgICAgICAgPGxpPgotICAgICAgICAgICAgICAgIDxhIGhyZWY9IiNSdW5UZXN0c0RldmljZSI+UnVubmluZyB0ZXN0cyBvbiBhIGRldmljZSBvciBlbXVsYXRvcjwvYT4KLSAgICAgICAgICAgIDwvbGk+Ci0gICAgICAgIDwvb2w+Ci0gICAgPC9saT4KLSAgICA8bGk+Ci0gICAgICAgIDxhIGhyZWY9IiNBTVN5bnRheCI+VXNpbmcgdGhlIEluc3RydW1lbnQgQ29tbWFuZDwvYT4KLSAgICAgICAgPG9sPgotICAgICAgICAgICAgPGxpPgotICAgICAgICAgICAgICAgIDxhIGhyZWY9IiNBTU9wdGlvbnNTeW50YXgiPkluc3RydW1lbnQgb3B0aW9uczwvYT4KLSAgICAgICAgICAgIDwvbGk+Ci0gICAgICAgICAgICA8bGk+Ci0gICAgICAgICAgICAgICAgPGEgaHJlZj0iI1J1blRlc3RFeGFtcGxlcyI+SW5zdHJ1bWVudCBleGFtcGxlczwvYT4KLSAgICAgICAgICAgIDwvbGk+Ci0gICAgICAgIDwvb2w+Ci0gICAgPC9saT4KLQotICA8L29sPgotICA8aDI+U2VlIEFsc288L2gyPgotICA8b2w+Ci0gICAgPGxpPgotICAgICAgICA8YQotICAgICAgICBocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvdG9waWNzL3Rlc3RpbmcvdGVzdGluZ19hbmRyb2lkLmh0bWwiPlRlc3RpbmcgYW5kIEluc3RydW1lbnRhdGlvbjwvYT4KLSAgICA8L2xpPgotICAgIDxsaT4KLSAgICAgICAgPGEgaHJlZj0ie0Bkb2NSb290fXJlc291cmNlcy90dXRvcmlhbHMvdGVzdGluZy9hY3Rpdml0eV90ZXN0Lmh0bWwiPkFjdGl2aXR5IFRlc3Rpbmc8L2E+Ci0gICAgPC9saT4KLSAgICA8bGk+Ci0gICAgICAgIDxhIGhyZWY9IntAZG9jUm9vdH1ndWlkZS9kZXZlbG9waW5nL3Rvb2xzL2FkYi5odG1sIj5BbmRyb2lkIERlYnVnIEJyaWRnZTwvYT4KLSAgICA8L2xpPgotICA8L29sPgotICA8L2Rpdj4KKyAgICA8ZGl2IGlkPSJxdiI+CisgICAgICAgIDxoMj5JbiB0aGlzIGRvY3VtZW50PC9oMj4KKyAgICAgICAgICAgIDxvbD4KKyAgICAgICAgICAgICAgICA8bGk+CisgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9IiNDcmVhdGVUZXN0UHJvamVjdENvbW1hbmQiPldvcmtpbmcgd2l0aCBUZXN0IFByb2plY3RzPC9hPgorICAgICAgICAgICAgICAgICAgICA8b2w+CisgICAgICAgICAgICAgICAgICAgICAgICA8bGk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iI0NyZWF0ZVRlc3RQcm9qZWN0Ij5DcmVhdGluZyBhIHRlc3QgcHJvamVjdDwvYT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+CisgICAgICAgICAgICAgICAgICAgICAgICA8bGk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iI1VwZGF0ZVRlc3RQcm9qZWN0Ij5VcGRhdGluZyBhIHRlc3QgcHJvamVjdDwvYT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+CisgICAgICAgICAgICAgICAgICAgIDwvb2w+CisgICAgICAgICAgICAgICAgPC9saT4KKyAgICAgICAgICAgICAgICA8bGk+CisgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9IiNDcmVhdGVUZXN0QXBwIj5DcmVhdGluZyBhIFRlc3QgUGFja2FnZTwvYT4KKyAgICAgICAgICAgICAgICA8L2xpPgorICAgICAgICAgICAgICAgIDxsaT4KKyAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iI1J1blRlc3RzQ29tbWFuZCI+UnVubmluZyBUZXN0czwvYT4KKyAgICAgICAgICAgICAgICAgICAgPG9sPgorICAgICAgICAgICAgICAgICAgICAgICAgPGxpPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9IiNSdW5UZXN0c0FudCI+UXVpY2sgYnVpbGQgYW5kIHJ1biB3aXRoIEFudDwvYT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+CisgICAgICAgICAgICAgICAgICAgICAgICA8bGk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iI1J1blRlc3RzRGV2aWNlIj5SdW5uaW5nIHRlc3RzIG9uIGEgZGV2aWNlIG9yIGVtdWxhdG9yPC9hPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9saT4KKyAgICAgICAgICAgICAgICAgICAgPC9vbD4KKyAgICAgICAgICAgICAgICA8L2xpPgorICAgICAgICAgICAgICAgIDxsaT4KKyAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iI0FNU3ludGF4Ij5Vc2luZyB0aGUgSW5zdHJ1bWVudCBDb21tYW5kPC9hPgorICAgICAgICAgICAgICAgICAgICA8b2w+CisgICAgICAgICAgICAgICAgICAgICAgICA8bGk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iI0FNT3B0aW9uc1N5bnRheCI+SW5zdHJ1bWVudCBvcHRpb25zPC9hPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9saT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxsaT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSIjUnVuVGVzdEV4YW1wbGVzIj5JbnN0cnVtZW50IGV4YW1wbGVzPC9hPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9saT4KKyAgICAgICAgICAgICAgICAgICAgPC9vbD4KKyAgICAgICAgICAgICAgICA8L2xpPgorICAgICAgICAgICAgPC9vbD4KKyAgICAgICAgPGgyPlNlZSBBbHNvPC9oMj4KKyAgICAgICAgICAgIDxvbD4KKyAgICAgICAgICAgICAgICA8bGk+CisgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9IntAZG9jUm9vdH1ndWlkZS90b3BpY3MvdGVzdGluZy90ZXN0aW5nX2FuZHJvaWQuaHRtbCI+CisgICAgICAgICAgICAgICAgICAgICAgICBUZXN0aW5nIEZ1bmRhbWVudGFsczwvYT4KKyAgICAgICAgICAgICAgICA8L2xpPgorICAgICAgICAgICAgICAgIDxsaT4KKyAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0ie0Bkb2NSb290fWd1aWRlL2RldmVsb3BpbmcvdG9vbHMvYWRiLmh0bWwiPkFuZHJvaWQgRGVidWcgQnJpZGdlPC9hPgorICAgICAgICAgICAgICAgIDwvbGk+CisgICAgICAgICAgICA8L29sPgorICAgIDwvZGl2PgogPC9kaXY+CiA8cD4KLSAgVGhpcyBkb2N1bWVudCBkZXNjcmliZXMgaG93IHRvIGNyZWF0ZSBhbmQgcnVuIHRlc3RzIGRpcmVjdGx5IGZyb20gdGhlIGNvbW1hbmQgbGluZS4KLSAgWW91IGNhbiB1c2UgdGhlIHRlY2huaXF1ZXMgZGVzY3JpYmVkIGhlcmUgaWYgeW91IGFyZSBkZXZlbG9waW5nIGluIGFuIElERSBvdGhlciB0aGFuIEVjbGlwc2UKLSAgb3IgaWYgeW91IHByZWZlciB0byB3b3JrIGZyb20gdGhlIGNvbW1hbmQgbGluZS4gVGhpcyBkb2N1bWVudCBhc3N1bWVzIHRoYXQgeW91IGFscmVhZHkga25vdyBob3cKLSAgdG8gY3JlYXRlIGEgQW5kcm9pZCBhcHBsaWNhdGlvbiBpbiB5b3VyIHByb2dyYW1taW5nIGVudmlyb25tZW50LiBCZWZvcmUgeW91IHN0YXJ0IHRoaXMKLSAgZG9jdW1lbnQsIHlvdSBzaG91bGQgcmVhZCB0aGUgZG9jdW1lbnQgPGEKLSAgaHJlZj0ie0Bkb2NSb290fWd1aWRlL3RvcGljcy90ZXN0aW5nL3Rlc3RpbmdfYW5kcm9pZC5odG1sIj5UZXN0aW5nIGFuZCBJbnN0cnVtZW50YXRpb248L2E+LAotICB3aGljaCBwcm92aWRlcyBhbiBvdmVydmlldyBvZiBBbmRyb2lkIHRlc3RpbmcuCisgICAgVGhpcyBkb2N1bWVudCBkZXNjcmliZXMgaG93IHRvIGNyZWF0ZSBhbmQgcnVuIHRlc3RzIGRpcmVjdGx5IGZyb20gdGhlIGNvbW1hbmQgbGluZS4KKyAgICBZb3UgY2FuIHVzZSB0aGUgdGVjaG5pcXVlcyBkZXNjcmliZWQgaGVyZSBpZiB5b3UgYXJlIGRldmVsb3BpbmcgaW4gYW4gSURFIG90aGVyIHRoYW4gRWNsaXBzZQorICAgIG9yIGlmIHlvdSBwcmVmZXIgdG8gd29yayBmcm9tIHRoZSBjb21tYW5kIGxpbmUuIFRoaXMgZG9jdW1lbnQgYXNzdW1lcyB0aGF0IHlvdSBhbHJlYWR5IGtub3cgaG93CisgICAgdG8gY3JlYXRlIGEgQW5kcm9pZCBhcHBsaWNhdGlvbiBpbiB5b3VyIHByb2dyYW1taW5nIGVudmlyb25tZW50LiBCZWZvcmUgeW91IHN0YXJ0IHRoaXMKKyAgICBkb2N1bWVudCwgeW91IHNob3VsZCByZWFkIHRoZSB0b3BpYworICAgIDxhIGhyZWY9IntAZG9jUm9vdH1ndWlkZS90b3BpY3MvdGVzdGluZy90ZXN0aW5nX2FuZHJvaWQuaHRtbCI+VGVzdGluZyBGdW5kYW1lbnRhbHM8L2E+LAorICAgIHdoaWNoIHByb3ZpZGVzIGFuIG92ZXJ2aWV3IG9mIEFuZHJvaWQgdGVzdGluZy4KIDwvcD4KIDxwPgotICBJZiB5b3UgYXJlIGRldmVsb3BpbmcgaW4gRWNsaXBzZSB3aXRoIEFEVCwgeW91IGNhbiBzZXQgdXAgYW5kIHJ1biB5b3VyIHRlc3RzCi1kaXJlY3RseSBpbiBFY2xpcHNlLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgcGxlYXNlIHJlYWQgPGEKLSAgaHJlZj0ie0Bkb2NSb290fWd1aWRlL2RldmVsb3BpbmcvdGVzdGluZy90ZXN0aW5nX2VjbGlwc2UuaHRtbCI+VGVzdGluZyZuYnNwO2luJm5ic3A7RWNsaXBzZSwmbmJzcDt3aXRoJm5ic3A7QURUPC9hPi4KKyAgICBJZiB5b3UgYXJlIGRldmVsb3BpbmcgaW4gRWNsaXBzZSB3aXRoIEFEVCwgeW91IGNhbiBzZXQgdXAgYW5kIHJ1biB5b3VyIHRlc3RzCisgICAgZGlyZWN0bHkgaW4gRWNsaXBzZS4gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHBsZWFzZSByZWFkCisgICAgPGEgaHJlZj0ie0Bkb2NSb290fWd1aWRlL2RldmVsb3BpbmcvdGVzdGluZy90ZXN0aW5nX2VjbGlwc2UuaHRtbCI+CisgICAgVGVzdGluZyBpbiBFY2xpcHNlLCB3aXRoIEFEVDwvYT4uCiA8L3A+CiA8aDIgaWQ9IkNyZWF0ZVRlc3RQcm9qZWN0Q29tbWFuZCI+V29ya2luZyB3aXRoIFRlc3QgUHJvamVjdHM8L2gyPgogPHA+Ci0gIFlvdSB1c2UgdGhlIDxjb2RlPmFuZHJvaWQ8L2NvZGU+IHRvb2wgdG8gY3JlYXRlIHRlc3QgcHJvamVjdHMuCi0gIFlvdSBhbHNvIHVzZSA8Y29kZT5hbmRyb2lkPC9jb2RlPiB0byBjb252ZXJ0IGV4aXN0aW5nIHRlc3QgY29kZSBpbnRvIGFuIEFuZHJvaWQgdGVzdCBwcm9qZWN0LAotICBvciB0byBhZGQgdGhlIDxjb2RlPnJ1bi10ZXN0czwvY29kZT4gQW50IHRhcmdldCB0byBhbiBleGlzdGluZyBBbmRyb2lkIHRlc3QgcHJvamVjdC4KLSAgVGhlc2Ugb3BlcmF0aW9ucyBhcmUgZGVzY3JpYmVkIGluIG1vcmUgZGV0YWlsIGluIHRoZSBzZWN0aW9uIDxhCi0gIGhyZWY9IiNVcGRhdGVUZXN0UHJvamVjdCI+VXBkYXRpbmcgYSB0ZXN0IHByb2plY3Q8L2E+LgotICBUaGUgPGNvZGU+cnVuLXRlc3RzPC9jb2RlPiB0YXJnZXQgaXMgZGVzY3JpYmVkIGluIDxhCi0gIGhyZWY9IiNSdW5UZXN0c0FudCI+UXVpY2sgYnVpbGQgYW5kIHJ1biB3aXRoIEFudDwvYT4uCisgICAgWW91IHVzZSB0aGUgPGNvZGU+YW5kcm9pZDwvY29kZT4gdG9vbCB0byBjcmVhdGUgdGVzdCBwcm9qZWN0cy4KKyAgICBZb3UgYWxzbyB1c2UgPGNvZGU+YW5kcm9pZDwvY29kZT4gdG8gY29udmVydCBleGlzdGluZyB0ZXN0IGNvZGUgaW50byBhbiBBbmRyb2lkIHRlc3QgcHJvamVjdCwKKyAgICBvciB0byBhZGQgdGhlIDxjb2RlPnJ1bi10ZXN0czwvY29kZT4gQW50IHRhcmdldCB0byBhbiBleGlzdGluZyBBbmRyb2lkIHRlc3QgcHJvamVjdC4KKyAgICBUaGVzZSBvcGVyYXRpb25zIGFyZSBkZXNjcmliZWQgaW4gbW9yZSBkZXRhaWwgaW4gdGhlIHNlY3Rpb24gPGEgaHJlZj0iI1VwZGF0ZVRlc3RQcm9qZWN0Ij4KKyAgICBVcGRhdGluZyBhIHRlc3QgcHJvamVjdDwvYT4uIFRoZSA8Y29kZT5ydW4tdGVzdHM8L2NvZGU+IHRhcmdldCBpcyBkZXNjcmliZWQgaW4KKyAgICA8YSBocmVmPSIjUnVuVGVzdHNBbnQiPlF1aWNrIGJ1aWxkIGFuZCBydW4gd2l0aCBBbnQ8L2E+LgogPC9wPgogPGgzIGlkPSJDcmVhdGVUZXN0UHJvamVjdCI+Q3JlYXRpbmcgYSB0ZXN0IHByb2plY3Q8L2gzPgogPHA+Ci0gIFRvIGNyZWF0ZSBhIHRlc3QgcHJvamVjdCB3aXRoIHRoZSA8Y29kZT5hbmRyb2lkPC9jb2RlPiB0b29sLCBlbnRlcjoKLTxwcmU+YW5kcm9pZCBjcmVhdGUgdGVzdC1wcm9qZWN0IC1tICZsdDttYWluX3BhdGgmZ3Q7IC1uICZsdDtwcm9qZWN0X25hbWUmZ3Q7IC1wICZsdDt0ZXN0X3BhdGgmZ3Q7PC9wcmU+CisgICAgVG8gY3JlYXRlIGEgdGVzdCBwcm9qZWN0IHdpdGggdGhlIDxjb2RlPmFuZHJvaWQ8L2NvZGU+IHRvb2wsIGVudGVyOgorPC9wPgorPHByZT4KK2FuZHJvaWQgY3JlYXRlIHRlc3QtcHJvamVjdCAtbSAmbHQ7bWFpbl9wYXRoJmd0OyAtbiAmbHQ7cHJvamVjdF9uYW1lJmd0OyAtcCAmbHQ7dGVzdF9wYXRoJmd0OworPC9wcmU+CiA8cD4KLSAgWW91IG11c3Qgc3VwcGx5IGFsbCB0aGUgZmxhZ3MuIFRoZSBmb2xsb3dpbmcgdGFibGUgZXhwbGFpbnMgdGhlbSBpbiBkZXRhaWw6CisgICAgWW91IG11c3Qgc3VwcGx5IGFsbCB0aGUgZmxhZ3MuIFRoZSBmb2xsb3dpbmcgdGFibGUgZXhwbGFpbnMgdGhlbSBpbiBkZXRhaWw6CiA8L3A+CiA8dGFibGU+Ci0gIDx0cj4KLSAgICA8dGg+RmxhZzwvdGg+Ci0gICAgPHRoPlZhbHVlPC90aD4KLSAgICA8dGg+RGVzY3JpcHRpb248L3RoPgotICA8dHI+Ci0gICAgPHRkPjxjb2RlPi1tLCAtLW1haW48L2NvZGU+PC90ZD4KLSAgICA8dGQ+Ci0gICAgICAgIFBhdGggdG8gdGhlIHByb2plY3Qgb2YgdGhlIGFwcGxpY2F0aW9uIHVuZGVyIHRlc3QsIHJlbGF0aXZlIHRvIHRoZSB0ZXN0IGFwcGxpY2F0aW9uCi0gICAgICAgIGRpcmVjdG9yeS4KLSAgICA8L3RkPgotICAgIDx0ZD4KLSAgICAgICAgRm9yIGV4YW1wbGUsIGlmIHRoZSBhcHBsaWNhdGlvbiB1bmRlciB0ZXN0IGlzIGluIDxjb2RlPnNvdXJjZS9IZWxsb0FuZHJvaWQ8L2NvZGU+LCBhbmQgeW91Ci0gICAgICAgIHdhbnQgdG8gY3JlYXRlIHRoZSB0ZXN0IHByb2plY3QgaW4gPGNvZGU+c291cmNlL0hlbGxvQW5kcm9pZFRlc3Q8L2NvZGU+LCB0aGVuIHRoZSB2YWx1ZSBvZgotICAgICAgICA8Y29kZT4tLW1haW48L2NvZGU+IHNob3VsZCBiZSA8Y29kZT4uLi9IZWxsb0FuZHJvaWQ8L2NvZGU+LgorICAgIDx0cj4KKyAgICAgICAgPHRoPkZsYWc8L3RoPgorICAgICAgICA8dGg+VmFsdWU8L3RoPgorICAgICAgICA8dGg+RGVzY3JpcHRpb248L3RoPgorICAgIDwvdHI+CisgICAgPHRyPgorICAgICAgICA8dGQ+PGNvZGU+LW0sIC0tbWFpbjwvY29kZT48L3RkPgorICAgICAgICA8dGQ+CisgICAgICAgICAgICBQYXRoIHRvIHRoZSBwcm9qZWN0IG9mIHRoZSBhcHBsaWNhdGlvbiB1bmRlciB0ZXN0LCByZWxhdGl2ZSB0byB0aGUgdGVzdCBwYWNrYWdlCisgICAgICAgICAgICBkaXJlY3RvcnkuCiAgICAgICAgIDwvdGQ+Ci0gIDx0cj4KLSAgICA8dGQ+PGNvZGU+LW4sIC0tbmFtZTwvY29kZT48L3RkPgotICAgIDx0ZD5OYW1lIHRoYXQgeW91IHdhbnQgdG8gZ2l2ZSB0aGUgdGVzdCBwcm9qZWN0LjwvdGQ+Ci0gICAgPHRkPiZuYnNwOzwvdGQ+Ci0gIDwvdHI+Ci0gIDx0cj4KLSAgICA8dGQ+PGNvZGU+LXAsIC0tcGF0aDwvY29kZT48L3RkPgotICAgIDx0ZD5EaXJlY3RvcnkgaW4gd2hpY2ggeW91IHdhbnQgdG8gY3JlYXRlIHRoZSBuZXcgdGVzdCBwcm9qZWN0LjwvdGQ+Ci0gICAgPHRkPgotICAgICAgVGhlIDxjb2RlPmFuZHJvaWQ8L2NvZGU+IHRvb2wgY3JlYXRlcyB0aGUgdGVzdCBwcm9qZWN0IGZpbGVzIGFuZCBkaXJlY3Rvcnkgc3RydWN0dXJlIGluIHRoaXMKLSAgICAgIGRpcmVjdG9yeS4gSWYgdGhlIGRpcmVjdG9yeSBkb2VzIG5vdCBleGlzdCwgPGNvZGU+YW5kcm9pZDwvY29kZT4gY3JlYXRlcyBpdC4KLSAgICA8L3RkPgotICA8L3RyPgorICAgICAgICA8dGQ+CisgICAgICAgICAgICBGb3IgZXhhbXBsZSwgaWYgdGhlIGFwcGxpY2F0aW9uIHVuZGVyIHRlc3QgaXMgaW4gPGNvZGU+c291cmNlL0hlbGxvQW5kcm9pZDwvY29kZT4sIGFuZAorICAgICAgICAgICAgeW91IHdhbnQgdG8gY3JlYXRlIHRoZSB0ZXN0IHByb2plY3QgaW4gPGNvZGU+c291cmNlL0hlbGxvQW5kcm9pZFRlc3Q8L2NvZGU+LCB0aGVuIHRoZQorICAgICAgICAgICAgdmFsdWUgb2YgPGNvZGU+LS1tYWluPC9jb2RlPiBzaG91bGQgYmUgPGNvZGU+Li4vSGVsbG9BbmRyb2lkPC9jb2RlPi4KKyAgICAgICAgPHA+CisgICAgICAgICAgICBUbyBsZWFybiBtb3JlIGFib3V0IGNob29zaW5nIHRoZSBsb2NhdGlvbiBvZiB0ZXN0IHByb2plY3RzLCBwbGVhc2UgcmVhZAorICAgICAgICAgICAgPGEgaHJlZj0ie0Bkb2NSb290fWd1aWRlL3RvcGljcy90ZXN0aW5nL3Rlc3RpbmdfYW5kcm9pZC5odG1sI1Rlc3RQcm9qZWN0cyI+CisgICAgICAgICAgICBUZXN0aW5nIEZ1bmRhbWVudGFsczwvYT4uCisgICAgICAgIDwvcD4KKyAgICAgICAgPC90ZD4KKyAgICA8L3RyPgorICAgIDx0cj4KKyAgICAgICAgPHRkPjxjb2RlPi1uLCAtLW5hbWU8L2NvZGU+PC90ZD4KKyAgICAgICAgPHRkPk5hbWUgdGhhdCB5b3Ugd2FudCB0byBnaXZlIHRoZSB0ZXN0IHByb2plY3QuPC90ZD4KKyAgICAgICAgPHRkPiZuYnNwOzwvdGQ+CisgICAgPC90cj4KKyAgICA8dHI+CisgICAgICAgIDx0ZD48Y29kZT4tcCwgLS1wYXRoPC9jb2RlPjwvdGQ+CisgICAgICAgIDx0ZD5EaXJlY3RvcnkgaW4gd2hpY2ggeW91IHdhbnQgdG8gY3JlYXRlIHRoZSBuZXcgdGVzdCBwcm9qZWN0LjwvdGQ+CisgICAgICAgIDx0ZD4KKyAgICAgICAgICAgIFRoZSA8Y29kZT5hbmRyb2lkPC9jb2RlPiB0b29sIGNyZWF0ZXMgdGhlIHRlc3QgcHJvamVjdCBmaWxlcyBhbmQgZGlyZWN0b3J5IHN0cnVjdHVyZQorICAgICAgICAgICAgaW4gdGhpcyBkaXJlY3RvcnkuIElmIHRoZSBkaXJlY3RvcnkgZG9lcyBub3QgZXhpc3QsIDxjb2RlPmFuZHJvaWQ8L2NvZGU+IGNyZWF0ZXMgaXQuCisgICAgICAgIDwvdGQ+CisgICAgPC90cj4KIDwvdGFibGU+CiA8cD4KICAgICBJZiB0aGUgb3BlcmF0aW9uIGlzIHN1Y2Nlc3NmdWwsIDxjb2RlPmFuZHJvaWQ8L2NvZGU+IGxpc3RzIHRvIFNURE9VVCB0aGUgbmFtZXMgb2YgdGhlIGZpbGVzCkBAIC0xMzUsMTEgKzE0MSwxMCBAQAogICAgIGFyZSB0ZXN0aW5nIGFuZCBjb250cm9sIGl0IHdpdGggaW5zdHJ1bWVudGF0aW9uLgogPC9wPgogPHA+Ci0gICAgRm9yIGV4YW1wbGUsIHN1cHBvc2UgeW91IGNyZWF0ZSB0aGUgPGEKLSAgICBocmVmPSJ7QGRvY1Jvb3R9cmVzb3VyY2VzL3R1dG9yaWFscy9oZWxsby13b3JsZC5odG1sIj5IZWxsbywgV29ybGQ8L2E+IHR1dG9yaWFsIGFwcGxpY2F0aW9uCi0gICAgaW4gdGhlIGRpcmVjdG9yeSA8Y29kZT5+L3NvdXJjZS9IZWxsb0FuZHJvaWQ8L2NvZGU+LiBJbiB0aGUgdHV0b3JpYWwsIHRoaXMgYXBwbGljYXRpb24gdXNlcyB0aGUKLSAgICBwYWNrYWdlIG5hbWUgPGNvZGU+Y29tLmV4YW1wbGUuaGVsbG9hbmRyb2lkPC9jb2RlPiBhbmQgdGhlIGFjdGl2aXR5IG5hbWUKLSAgICA8Y29kZT5IZWxsb0FuZHJvaWQ8L2NvZGU+LiBZb3UgY2FuIHRvIGNyZWF0ZSB0aGUgdGVzdCBmb3IgdGhpcyBpbgorICAgIEZvciBleGFtcGxlLCBzdXBwb3NlIHlvdSBjcmVhdGUgdGhlIDxhIGhyZWY9IntAZG9jUm9vdH1yZXNvdXJjZXMvdHV0b3JpYWxzL2hlbGxvLXdvcmxkLmh0bWwiPgorICAgIEhlbGxvLCBXb3JsZDwvYT4gdHV0b3JpYWwgYXBwbGljYXRpb24gaW4gdGhlIGRpcmVjdG9yeSA8Y29kZT5+L3NvdXJjZS9IZWxsb0FuZHJvaWQ8L2NvZGU+LgorICAgIEluIHRoZSB0dXRvcmlhbCwgdGhpcyBhcHBsaWNhdGlvbiB1c2VzIHRoZSBwYWNrYWdlIG5hbWUgPGNvZGU+Y29tLmV4YW1wbGUuaGVsbG9hbmRyb2lkPC9jb2RlPgorICAgIGFuZCB0aGUgYWN0aXZpdHkgbmFtZSA8Y29kZT5IZWxsb0FuZHJvaWQ8L2NvZGU+LiBZb3UgY2FuIHRvIGNyZWF0ZSB0aGUgdGVzdCBmb3IgdGhpcyBpbgogICAgIDxjb2RlPn4vc291cmNlL0hlbGxvQW5kcm9pZFRlc3Q8L2NvZGU+LiBUbyBkbyBzbywgeW91IGVudGVyOgogPC9wPgogPHByZT4KQEAgLTE5Niw3ICsyMDEsNyBAQAogPHAgY2xhc3M9Im5vdGUiPgogICAgIDxzdHJvbmc+Tm90ZTo8L3N0cm9uZz4gSWYgeW91IGNoYW5nZSB0aGUgQW5kcm9pZCBwYWNrYWdlIG5hbWUgb2YgdGhlIGFwcGxpY2F0aW9uIHVuZGVyIHRlc3QsCiAgICAgeW91IG11c3QgPGVtPm1hbnVhbGx5PC9lbT4gY2hhbmdlIHRoZSB2YWx1ZSBvZiB0aGUgPGNvZGU+Jmx0O2FuZHJvaWQ6dGFyZ2V0UGFja2FnZSZndDs8L2NvZGU+Ci0gICAgYXR0cmlidXRlIHdpdGhpbiB0aGUgPGNvZGU+QW5kcm9pZE1hbmlmZXN0LnhtbDwvY29kZT4gZmlsZSBvZiB0aGUgdGVzdCBhcHBsaWNhdGlvbi4KKyAgICBhdHRyaWJ1dGUgd2l0aGluIHRoZSA8Y29kZT5BbmRyb2lkTWFuaWZlc3QueG1sPC9jb2RlPiBmaWxlIG9mIHRoZSB0ZXN0IHBhY2thZ2UuCiAgICAgUnVubmluZyA8Y29kZT5hbmRyb2lkIHVwZGF0ZSB0ZXN0LXByb2plY3Q8L2NvZGU+IGRvZXMgbm90IGRvIHRoaXMuCiA8L3A+CiA8cD4KQEAgLTIwNSwzOCArMjEwLDM4IEBACiA8cHJlPmFuZHJvaWQgdXBkYXRlLXRlc3QtcHJvamVjdCAtbSAmbHQ7bWFpbl9wYXRoJmd0OyAtcCAmbHQ7dGVzdF9wYXRoJmd0OzwvcHJlPgogCiA8dGFibGU+Ci08dHI+Ci0gIDx0aD5GbGFnPC90aD4KLSAgPHRoPlZhbHVlPC90aD4KLSAgPHRoPkRlc2NyaXB0aW9uPC90aD4KLTwvdHI+Ci08dHI+Ci0gIDx0ZD48Y29kZT4tbSwgLS1tYWluPC9jb2RlPjwvdGQ+Ci0gIDx0ZD5UaGUgcGF0aCB0byB0aGUgcHJvamVjdCBvZiB0aGUgYXBwbGljYXRpb24gdW5kZXIgdGVzdCwgcmVsYXRpdmUgdG8gdGhlIHRlc3QgcHJvamVjdDwvdGQ+Ci0gIDx0ZD4KLSAgICBGb3IgZXhhbXBsZSwgaWYgdGhlIGFwcGxpY2F0aW9uIHVuZGVyIHRlc3QgaXMgaW4gPGNvZGU+c291cmNlL0hlbGxvQW5kcm9pZDwvY29kZT4sIGFuZAotICAgIHRoZSB0ZXN0IHByb2plY3QgaXMgaW4gPGNvZGU+c291cmNlL0hlbGxvQW5kcm9pZFRlc3Q8L2NvZGU+LCB0aGVuIHRoZSB2YWx1ZSBmb3IKLSAgICA8Y29kZT4tLW1haW48L2NvZGU+IGlzIDxjb2RlPi4uL0hlbGxvQW5kcm9pZDwvY29kZT4uCi0gIDwvdGQ+Ci08L3RyPgotPHRyPgotICA8dGQ+PGNvZGU+LXAsIC0tcGF0aDwvY29kZT48L3RkPgotICA8dGQ+VGhlIG9mIHRoZSB0ZXN0IHByb2plY3QuPC90ZD4KLSAgPHRkPgotICAgIEZvciBleGFtcGxlLCBpZiB0aGUgdGVzdCBwcm9qZWN0IGlzIGluIDxjb2RlPnNvdXJjZS9IZWxsb0FuZHJvaWRUZXN0PC9jb2RlPiwgdGhlbiB0aGUKLSAgICB2YWx1ZSBmb3IgPGNvZGU+LS1wYXRoPC9jb2RlPiBpcyA8Y29kZT5IZWxsb0FuZHJvaWRUZXN0PC9jb2RlPi4KLSAgPC90ZD4KLTwvdHI+CisgICAgPHRyPgorICAgICAgICA8dGg+RmxhZzwvdGg+CisgICAgICAgIDx0aD5WYWx1ZTwvdGg+CisgICAgICAgIDx0aD5EZXNjcmlwdGlvbjwvdGg+CisgICAgPC90cj4KKyAgICA8dHI+CisgICAgICAgIDx0ZD48Y29kZT4tbSwgLS1tYWluPC9jb2RlPjwvdGQ+CisgICAgICAgIDx0ZD5UaGUgcGF0aCB0byB0aGUgcHJvamVjdCBvZiB0aGUgYXBwbGljYXRpb24gdW5kZXIgdGVzdCwgcmVsYXRpdmUgdG8gdGhlIHRlc3QgcHJvamVjdDwvdGQ+CisgICAgICAgIDx0ZD4KKyAgICAgICAgICAgIEZvciBleGFtcGxlLCBpZiB0aGUgYXBwbGljYXRpb24gdW5kZXIgdGVzdCBpcyBpbiA8Y29kZT5zb3VyY2UvSGVsbG9BbmRyb2lkPC9jb2RlPiwgYW5kCisgICAgICAgICAgICB0aGUgdGVzdCBwcm9qZWN0IGlzIGluIDxjb2RlPnNvdXJjZS9IZWxsb0FuZHJvaWRUZXN0PC9jb2RlPiwgdGhlbiB0aGUgdmFsdWUgZm9yCisgICAgICAgICAgICA8Y29kZT4tLW1haW48L2NvZGU+IGlzIDxjb2RlPi4uL0hlbGxvQW5kcm9pZDwvY29kZT4uCisgICAgICAgIDwvdGQ+CisgICAgPC90cj4KKyAgICA8dHI+CisgICAgICAgIDx0ZD48Y29kZT4tcCwgLS1wYXRoPC9jb2RlPjwvdGQ+CisgICAgICAgIDx0ZD5UaGUgb2YgdGhlIHRlc3QgcHJvamVjdC48L3RkPgorICAgICAgICA8dGQ+CisgICAgICAgICAgICBGb3IgZXhhbXBsZSwgaWYgdGhlIHRlc3QgcHJvamVjdCBpcyBpbiA8Y29kZT5zb3VyY2UvSGVsbG9BbmRyb2lkVGVzdDwvY29kZT4sIHRoZW4gdGhlCisgICAgICAgICAgICB2YWx1ZSBmb3IgPGNvZGU+LS1wYXRoPC9jb2RlPiBpcyA8Y29kZT5IZWxsb0FuZHJvaWRUZXN0PC9jb2RlPi4KKyAgICAgICAgPC90ZD4KKyAgICA8L3RyPgogPC90YWJsZT4KIDxwPgogICAgIElmIHRoZSBvcGVyYXRpb24gaXMgc3VjY2Vzc2Z1bCwgPGNvZGU+YW5kcm9pZDwvY29kZT4gbGlzdHMgdG8gU1RET1VUIHRoZSBuYW1lcyBvZiB0aGUgZmlsZXMKICAgICBhbmQgZGlyZWN0b3JpZXMgaXQgaGFzIGNyZWF0ZWQuCiA8L3A+Ci08aDIgaWQ9IkNyZWF0ZVRlc3RBcHAiPkNyZWF0aW5nIGEgVGVzdCBBcHBsaWNhdGlvbjwvaDI+Cis8aDIgaWQ9IkNyZWF0ZVRlc3RBcHAiPkNyZWF0aW5nIGEgVGVzdCBQYWNrYWdlPC9oMj4KIDxwPgotICAgIE9uY2UgeW91IGhhdmUgY3JlYXRlZCBhIHRlc3QgcHJvamVjdCwgeW91IHBvcHVsYXRlIGl0IHdpdGggYSB0ZXN0IGFwcGxpY2F0aW9uLgorICAgIE9uY2UgeW91IGhhdmUgY3JlYXRlZCBhIHRlc3QgcHJvamVjdCwgeW91IHBvcHVsYXRlIGl0IHdpdGggYSB0ZXN0IHBhY2thZ2UuCiAgICAgVGhlIGFwcGxpY2F0aW9uIGRvZXMgbm90IHJlcXVpcmUgYW4ge0BsaW5rIGFuZHJvaWQuYXBwLkFjdGl2aXR5IEFjdGl2aXR5fSwKLSAgICBhbHRob3VnaCB5b3UgY2FuIGRlZmluZSBvbmUgaWYgeW91IHdpc2guIEFsdGhvdWdoIHlvdXIgdGVzdCBhcHBsaWNhdGlvbiBjYW4KKyAgICBhbHRob3VnaCB5b3UgY2FuIGRlZmluZSBvbmUgaWYgeW91IHdpc2guIEFsdGhvdWdoIHlvdXIgdGVzdCBwYWNrYWdlIGNhbgogICAgIGNvbWJpbmUgQWN0aXZpdGllcywgQW5kcm9pZCB0ZXN0IGNsYXNzIGV4dGVuc2lvbnMsIEpVbml0IGV4dGVuc2lvbnMsIG9yCiAgICAgb3JkaW5hcnkgY2xhc3NlcywgeW91IHNob3VsZCBleHRlbmQgb25lIG9mIHRoZSBBbmRyb2lkIHRlc3QgY2xhc3NlcyBvciBKVW5pdCBjbGFzc2VzLAogICAgIGJlY2F1c2UgdGhlc2UgcHJvdmlkZSB0aGUgYmVzdCB0ZXN0aW5nIGZlYXR1cmVzLgpAQCAtMjQ4LDcgKzI1Myw3IEBACiA8L3A+CiAKIDxwPgotICAgIFRvIGNyZWF0ZSBhIHRlc3QgYXBwbGljYXRpb24sIHN0YXJ0IHdpdGggb25lIG9mIEFuZHJvaWQncyB0ZXN0IGNsYXNzZXMgaW4gdGhlIEphdmEgcGFja2FnZQorICAgIFRvIGNyZWF0ZSBhIHRlc3QgcGFja2FnZSwgc3RhcnQgd2l0aCBvbmUgb2YgQW5kcm9pZCdzIHRlc3QgY2xhc3NlcyBpbiB0aGUgSmF2YSBwYWNrYWdlCiAgICAge0BsaW5rIGFuZHJvaWQudGVzdCBhbmRyb2lkLnRlc3R9LiBUaGVzZSBleHRlbmQgdGhlIEpVbml0CiAgICAge0BsaW5rIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSBUZXN0Q2FzZX0gY2xhc3MuIFdpdGggYSBmZXcgZXhjZXB0aW9ucywgdGhlIEFuZHJvaWQgdGVzdAogICAgIGNsYXNzZXMgYWxzbyBwcm92aWRlIGluc3RydW1lbnRhdGlvbiBmb3IgdGVzdGluZy4KQEAgLTI4MiwyNCArMjg3LDE3IEBACiAgICAgdGVzdCByZXN1bHRzIGFyZSBzdXNwZWN0LCByZWdhcmRsZXNzIG9mIHdoZXRoZXIgb3Igbm90IHRoZSB0ZXN0cyBzdWNjZWVkZWQuCiA8L3A+CiA8cD4KLSAgICBUbyBsZWFybiBtb3JlIGFib3V0IGNyZWF0aW5nIHRlc3QgYXBwbGljYXRpb25zLCBzZWUgdGhlIHRvcGljIDxhCi0gICAgaHJlZj0ie0Bkb2NSb290fWd1aWRlL3RvcGljcy90ZXN0aW5nL3Rlc3RpbmdfYW5kcm9pZC5odG1sIj5UZXN0aW5nIGFuZCBJbnN0cnVtZW50YXRpb248L2E+LAorICAgIFRvIGxlYXJuIG1vcmUgYWJvdXQgY3JlYXRpbmcgdGVzdCBwYWNrYWdlcywgc2VlIHRoZSB0b3BpYyA8YQorICAgIGhyZWY9IntAZG9jUm9vdH1ndWlkZS90b3BpY3MvdGVzdGluZy90ZXN0aW5nX2FuZHJvaWQuaHRtbCI+VGVzdGluZyBGdW5kYW1lbnRhbHM8L2E+LAogICAgIHdoaWNoIHByb3ZpZGVzIGFuIG92ZXJ2aWV3IG9mIEFuZHJvaWQgdGVzdGluZy4gSWYgeW91IHByZWZlciB0byBmb2xsb3cgYSB0dXRvcmlhbCwKICAgICB0cnkgdGhlIDxhIGhyZWY9IntAZG9jUm9vdH1yZXNvdXJjZXMvdHV0b3JpYWxzL3Rlc3RpbmcvYWN0aXZpdHlfdGVzdC5odG1sIj5BY3Rpdml0eSBUZXN0aW5nPC9hPgogICAgIHR1dG9yaWFsLCB3aGljaCBsZWFkcyB5b3UgdGhyb3VnaCB0aGUgY3JlYXRpb24gb2YgdGVzdHMgZm9yIGFuIGFjdHVhbCBBbmRyb2lkIGFwcGxpY2F0aW9uLgogPC9wPgogPGgyIGlkPSJSdW5UZXN0c0NvbW1hbmQiPlJ1bm5pbmcgVGVzdHM8L2gyPgogPHA+Ci0gICAgSWYgeW91IGFyZSBub3QgZGV2ZWxvcGluZyBpbiBFY2xpcHNlIHdpdGggQURULCB5b3UgbmVlZCB0byBydW4gdGVzdHMgZnJvbSB0aGUgY29tbWFuZCBsaW5lLgotICAgIFlvdSBjYW4gZG8gdGhpcyBlaXRoZXIgd2l0aCBBbnQgb3Igd2l0aCB0aGUge0BsaW5rIGFuZHJvaWQuYXBwLkFjdGl2aXR5TWFuYWdlciBBY3Rpdml0eU1hbmFnZXJ9Ci0gICAgY29tbWFuZCBsaW5lIGludGVyZmFjZS4KLTwvcD4KLTxwPgotICAgIFlvdSBjYW4gYWxzbyBydW4gdGVzdHMgZnJvbSB0aGUgY29tbWFuZCBsaW5lIGV2ZW4gaWYgeW91IGFyZSB1c2luZyBFY2xpcHNlIHdpdGggQURUIHRvIGRldmVsb3AKLSAgICB0aGVtLiBUbyBkbyB0aGlzLCB5b3UgbmVlZCB0byBjcmVhdGUgdGhlIHByb3BlciBmaWxlcyBhbmQgZGlyZWN0b3J5IHN0cnVjdHVyZSBpbiB0aGUgdGVzdAotICAgIHByb2plY3QsIHVzaW5nIHRoZSA8Y29kZT5hbmRyb2lkPC9jb2RlPiB0b29sIHdpdGggdGhlIG9wdGlvbiA8Y29kZT5jcmVhdGUgdGVzdC1wcm9qZWN0PC9jb2RlPi4KLSAgICBUaGlzIGlzIGRlc2NyaWJlZCBpbiB0aGUgc2VjdGlvbiA8YQotICAgIGhyZWY9IiNDcmVhdGVUZXN0UHJvamVjdENvbW1hbmQiPldvcmtpbmcgd2l0aCBUZXN0IFByb2plY3RzPC9hPi4KKyAgICBZb3UgcnVuIHRlc3RzIGZyb20gdGhlIGNvbW1hbmQgbGluZSwgZWl0aGVyIHdpdGggQW50IG9yIHdpdGggYW4KKyAgICA8YSBocmVmPSJ7QGRvY1Jvb3R9aHR0cDovL2RldmVsb3Blci5hbmRyb2lkLmNvbS9ndWlkZS9kZXZlbG9waW5nL3Rvb2xzL2FkYi5odG1sIj4KKyAgICBBbmRyb2lkIERlYnVnIEJyaWRnZSAoYWRiKTwvYT4gc2hlbGwuCiA8L3A+CiA8aDMgaWQ9IlJ1blRlc3RzQW50Ij5RdWljayBidWlsZCBhbmQgcnVuIHdpdGggQW50PC9oMz4KIDxwPgpAQCAtMzE2LDU3ICszMTQsNjMgQEAKICAgICBZb3UgY2FuIHVwZGF0ZSBhbiBleGlzdGluZyB0ZXN0IHByb2plY3QgdG8gdXNlIHRoaXMgZmVhdHVyZS4gVG8gZG8gdGhpcywgdXNlIHRoZQogICAgIDxjb2RlPmFuZHJvaWQ8L2NvZGU+IHRvb2wgd2l0aCB0aGUgPGNvZGU+dXBkYXRlIHRlc3QtcHJvamVjdDwvY29kZT4gb3B0aW9uLiBUaGlzIGlzIGRlc2NyaWJlZAogICAgIGluIHRoZSBzZWN0aW9uIDxhIGhyZWY9IiNVcGRhdGVUZXN0UHJvamVjdCI+VXBkYXRpbmcgYSB0ZXN0IHByb2plY3Q8L2E+LgorPC9wPgogPGgzIGlkPSJSdW5UZXN0c0RldmljZSI+UnVubmluZyB0ZXN0cyBvbiBhIGRldmljZSBvciBlbXVsYXRvcjwvaDM+CiA8cD4KLSAgICBXaGVuIHlvdSBydW4gdGVzdHMgZnJvbSB0aGUgY29tbWFuZCBsaW5lIHdpdGggdGhlIEFjdGl2aXR5TWFuYWdlciAoPGNvZGU+YW08L2NvZGU+KQotICAgIGNvbW1hbmQtbGluZSB0b29sLCB5b3UgZ2V0IG1vcmUgb3B0aW9ucyBmb3IgY2hvb3NpbmcgdGhlIHRlc3RzIHRvIHJ1biB0aGFuIHdpdGggYW55IG90aGVyCi0gICAgbWV0aG9kLiBZb3UgY2FuIHNlbGVjdCBpbmRpdmlkdWFsIHRlc3QgbWV0aG9kcywgZmlsdGVyIHRlc3RzIGFjY29yZGluZyB0byB0aGVpciBhbm5vdGF0aW9uLCBvcgotICAgIHNwZWNpZnkgdGVzdGluZyBvcHRpb25zLiBTaW5jZSB0aGUgdGVzdCBydW4gaXMgY29udHJvbGxlZCBlbnRpcmVseSBmcm9tIGEgY29tbWFuZCBsaW5lLCB5b3UgY2FuCi0gICAgY3VzdG9taXplIHlvdXIgdGVzdGluZyB3aXRoIHNoZWxsIHNjcmlwdHMgaW4gdmFyaW91cyB3YXlzLgorICAgIFdoZW4geW91IHJ1biB0ZXN0cyBmcm9tIHRoZSBjb21tYW5kIGxpbmUgd2l0aAorICAgIDxhIGhyZWY9IntAZG9jUm9vdH1odHRwOi8vZGV2ZWxvcGVyLmFuZHJvaWQuY29tL2d1aWRlL2RldmVsb3BpbmcvdG9vbHMvYWRiLmh0bWwiPgorICAgIEFuZHJvaWQgRGVidWcgQnJpZGdlIChhZGIpPC9hPiwgeW91IGdldCBtb3JlIG9wdGlvbnMgZm9yIGNob29zaW5nIHRoZSB0ZXN0cworICAgIHRvIHJ1biB0aGFuIHdpdGggYW55IG90aGVyIG1ldGhvZC4gWW91IGNhbiBzZWxlY3QgaW5kaXZpZHVhbCB0ZXN0IG1ldGhvZHMsIGZpbHRlciB0ZXN0cworICAgIGFjY29yZGluZyB0byB0aGVpciBhbm5vdGF0aW9uLCBvciBzcGVjaWZ5IHRlc3Rpbmcgb3B0aW9ucy4gU2luY2UgdGhlIHRlc3QgcnVuIGlzIGNvbnRyb2xsZWQKKyAgICBlbnRpcmVseSBmcm9tIGEgY29tbWFuZCBsaW5lLCB5b3UgY2FuIGN1c3RvbWl6ZSB5b3VyIHRlc3Rpbmcgd2l0aCBzaGVsbCBzY3JpcHRzIGluIHZhcmlvdXMgd2F5cy4KIDwvcD4KIDxwPgotICAgIFlvdSBydW4gdGhlIDxjb2RlPmFtPC9jb2RlPiB0b29sIG9uIGFuIEFuZHJvaWQgZGV2aWNlIG9yIGVtdWxhdG9yIHVzaW5nIHRoZQotICAgIDxhIGhyZWY9IntAZG9jUm9vdH1ndWlkZS9kZXZlbG9waW5nL3Rvb2xzL2FkYi5odG1sIj5BbmRyb2lkIERlYnVnIEJyaWRnZTwvYT4KLSAgICAoPGNvZGU+YWRiPC9jb2RlPikgc2hlbGwuIFdoZW4geW91IGRvIHRoaXMsIHlvdSB1c2UgdGhlIEFjdGl2aXR5TWFuYWdlcgotICAgIDxjb2RlPmluc3RydW1lbnQ8L2NvZGU+IG9wdGlvbiB0byBydW4geW91ciB0ZXN0IGFwcGxpY2F0aW9uIHVzaW5nIGFuIEFuZHJvaWQgdGVzdCBydW5uZXIKLSAgICAodXN1YWxseSB7QGxpbmsgYW5kcm9pZC50ZXN0Lkluc3RydW1lbnRhdGlvblRlc3RSdW5uZXJ9KS4gWW91IHNldCA8Y29kZT5hbTwvY29kZT4KLSAgICBvcHRpb25zIHdpdGggY29tbWFuZC1saW5lIGZsYWdzLgorICAgIFRvIHJ1biBhIHRlc3QgZnJvbSB0aGUgY29tbWFuZCBsaW5lLCB5b3UgcnVuIDxjb2RlPmFkYiBzaGVsbDwvY29kZT4gdG8gc3RhcnQgYSBjb21tYW5kLWxpbmUKKyAgICBzaGVsbCBvbiB5b3VyIGRldmljZSBvciBlbXVsYXRvciwgYW5kIHRoZW4gaW4gdGhlIHNoZWxsIHJ1biB0aGUgPGNvZGU+YW0gaW5zdHJ1bWVudDwvY29kZT4KKyAgICBjb21tYW5kLiBZb3UgY29udHJvbCA8Y29kZT5hbTwvY29kZT4gYW5kIHlvdXIgdGVzdHMgd2l0aCBjb21tYW5kLWxpbmUgZmxhZ3MuCiA8L3A+CiA8cD4KLSAgICBUbyBydW4gYSB0ZXN0IHdpdGggPGNvZGU+YW08L2NvZGU+OgorICAgIEFzIGEgc2hvcnRjdXQsIHlvdSBjYW4gc3RhcnQgYW4gPGNvZGU+YWRiPC9jb2RlPiBzaGVsbCwgY2FsbCA8Y29kZT5hbSBpbnN0cnVtZW50PC9jb2RlPiwgYW5kCisgICAgc3BlY2lmeSBjb21tYW5kLWxpbmUgZmxhZ3MgYWxsIG9uIG9uZSBpbnB1dCBsaW5lLiBUaGUgc2hlbGwgb3BlbnMgb24gdGhlIGRldmljZSBvciBlbXVsYXRvciwKKyAgICBydW5zIHlvdXIgdGVzdHMsIHByb2R1Y2VzIG91dHB1dCwgYW5kIHRoZW4gcmV0dXJucyB0byB0aGUgY29tbWFuZCBsaW5lIG9uIHlvdXIgY29tcHV0ZXIuCis8L3A+Cis8cD4KKyAgICBUbyBydW4gYSB0ZXN0IHdpdGggPGNvZGU+YW0gaW5zdHJ1bWVudDwvY29kZT46CiA8L3A+CiA8b2w+Ci0gIDxsaT4KLSAgICBJZiBuZWNlc3NhcnksIHJlLWJ1aWxkIHlvdXIgbWFpbiBhcHBsaWNhdGlvbiBhbmQgdGVzdCBhcHBsaWNhdGlvbi4KLSAgPC9saT4KLSAgPGxpPgotICAgIEluc3RhbGwgeW91ciB0ZXN0IGFwcGxpY2F0aW9uIGFuZCBtYWluIGFwcGxpY2F0aW9uIEFuZHJvaWQgcGFja2FnZSBmaWxlcwotICAgICg8Y29kZT4uYXBrPC9jb2RlPiBmaWxlcykgdG8geW91ciBjdXJyZW50IEFuZHJvaWQgZGV2aWNlIG9yIGVtdWxhdG9yPC9saT4KLSAgPGxpPgotICAgIEF0IHRoZSBjb21tYW5kIGxpbmUsIGVudGVyOgorICAgIDxsaT4KKyAgICAgICAgSWYgbmVjZXNzYXJ5LCByZWJ1aWxkIHlvdXIgbWFpbiBhcHBsaWNhdGlvbiBhbmQgdGVzdCBwYWNrYWdlLgorICAgIDwvbGk+CisgICAgPGxpPgorICAgICAgICBJbnN0YWxsIHlvdXIgdGVzdCBwYWNrYWdlIGFuZCBtYWluIGFwcGxpY2F0aW9uIEFuZHJvaWQgcGFja2FnZSBmaWxlcworICAgICAgICAoPGNvZGU+LmFwazwvY29kZT4gZmlsZXMpIHRvIHlvdXIgY3VycmVudCBBbmRyb2lkIGRldmljZSBvciBlbXVsYXRvcjwvbGk+CisgICAgPGxpPgorICAgICAgICBBdCB0aGUgY29tbWFuZCBsaW5lLCBlbnRlcjoKIDxwcmU+CiAkIGFkYiBzaGVsbCBhbSBpbnN0cnVtZW50IC13ICZsdDt0ZXN0X3BhY2thZ2VfbmFtZSZndDsvJmx0O3J1bm5lcl9jbGFzcyZndDsKIDwvcHJlPgotPHA+Ci0gICAgd2hlcmUgPGNvZGU+Jmx0O3Rlc3RfcGFja2FnZV9uYW1lJmd0OzwvY29kZT4gaXMgdGhlIEFuZHJvaWQgcGFja2FnZSBuYW1lIG9mIHlvdXIgdGVzdAotICAgIGFwcGxpY2F0aW9uLCBhbmQgPGNvZGU+Jmx0O3J1bm5lcl9jbGFzcyZndDs8L2NvZGU+IGlzIHRoZSBuYW1lIG9mIHRoZSBBbmRyb2lkIHRlc3QgcnVubmVyCi0gICAgY2xhc3MgeW91IGFyZSB1c2luZy4gVGhlIEFuZHJvaWQgcGFja2FnZSBuYW1lIGlzIHRoZSB2YWx1ZSBvZiB0aGUgPGNvZGU+cGFja2FnZTwvY29kZT4KLSAgICBhdHRyaWJ1dGUgb2YgdGhlIDxjb2RlPm1hbmlmZXN0PC9jb2RlPiBlbGVtZW50IGluIHRoZSBtYW5pZmVzdCBmaWxlCi0gICAgKDxjb2RlPkFuZHJvaWRNYW5pZmVzdC54bWw8L2NvZGU+KSBvZiB5b3VyIHRlc3QgYXBwbGljYXRpb24uIFRoZSBBbmRyb2lkIHRlc3QgcnVubmVyCi0gICAgY2xhc3MgaXMgdXN1YWxseSA8Y29kZT5JbnN0cnVtZW50YXRpb25UZXN0UnVubmVyPC9jb2RlPi4KLTwvcD4KLTxwPllvdXIgdGVzdCByZXN1bHRzIGFwcGVhciBpbiA8Y29kZT5TVERPVVQ8L2NvZGU+LjwvcD4KLSAgPC9saT4KKyAgICAgICAgPHA+CisgICAgICAgICAgICB3aGVyZSA8Y29kZT4mbHQ7dGVzdF9wYWNrYWdlX25hbWUmZ3Q7PC9jb2RlPiBpcyB0aGUgQW5kcm9pZCBwYWNrYWdlIG5hbWUgb2YgeW91ciB0ZXN0CisgICAgICAgICAgICBhcHBsaWNhdGlvbiwgYW5kIDxjb2RlPiZsdDtydW5uZXJfY2xhc3MmZ3Q7PC9jb2RlPiBpcyB0aGUgbmFtZSBvZiB0aGUgQW5kcm9pZCB0ZXN0CisgICAgICAgICAgICBydW5uZXIgY2xhc3MgeW91IGFyZSB1c2luZy4gVGhlIEFuZHJvaWQgcGFja2FnZSBuYW1lIGlzIHRoZSB2YWx1ZSBvZiB0aGUKKyAgICAgICAgICAgIDxjb2RlPnBhY2thZ2U8L2NvZGU+IGF0dHJpYnV0ZSBvZiB0aGUgPGNvZGU+bWFuaWZlc3Q8L2NvZGU+IGVsZW1lbnQgaW4gdGhlIG1hbmlmZXN0IGZpbGUKKyAgICAgICAgICAgICg8Y29kZT5BbmRyb2lkTWFuaWZlc3QueG1sPC9jb2RlPikgb2YgeW91ciB0ZXN0IHBhY2thZ2UuIFRoZSBBbmRyb2lkIHRlc3QgcnVubmVyCisgICAgICAgICAgICBjbGFzcyBpcyB1c3VhbGx5IHtAbGluayBhbmRyb2lkLnRlc3QuSW5zdHJ1bWVudGF0aW9uVGVzdFJ1bm5lcn0uCisgICAgICAgIDwvcD4KKyAgICAgICAgPHA+CisgICAgICAgICAgICBZb3VyIHRlc3QgcmVzdWx0cyBhcHBlYXIgaW4gPGNvZGU+U1RET1VUPC9jb2RlPi4KKyAgICAgICAgPC9wPgorICAgIDwvbGk+CiA8L29sPgogPHA+Ci0gICAgVGhpcyBvcGVyYXRpb24gc3RhcnRzIGFuIDxjb2RlPmFkYjwvY29kZT4gc2hlbGwsIHRoZW4gcnVucyA8Y29kZT5hbSBpbnN0cnVtZW50PC9jb2RlPiBpbiBpdAorICAgIFRoaXMgb3BlcmF0aW9uIHN0YXJ0cyBhbiA8Y29kZT5hZGI8L2NvZGU+IHNoZWxsLCB0aGVuIHJ1bnMgPGNvZGU+YW0gaW5zdHJ1bWVudDwvY29kZT4KICAgICB3aXRoIHRoZSBzcGVjaWZpZWQgcGFyYW1ldGVycy4gVGhpcyBwYXJ0aWN1bGFyIGZvcm0gb2YgdGhlIGNvbW1hbmQgd2lsbCBydW4gYWxsIG9mIHRoZSB0ZXN0cwotICAgIGluIHlvdXIgdGVzdCBhcHBsaWNhdGlvbi4gWW91IGNhbiBjb250cm9sIHRoaXMgYmVoYXZpb3Igd2l0aCBmbGFncyB0aGF0IHlvdSBwYXNzIHRvCisgICAgaW4geW91ciB0ZXN0IHBhY2thZ2UuIFlvdSBjYW4gY29udHJvbCB0aGlzIGJlaGF2aW9yIHdpdGggZmxhZ3MgdGhhdCB5b3UgcGFzcyB0bwogICAgIDxjb2RlPmFtIGluc3RydW1lbnQ8L2NvZGU+LiBUaGVzZSBmbGFncyBhcmUgZGVzY3JpYmVkIGluIHRoZSBuZXh0IHNlY3Rpb24uCiA8L3A+Ci08aDIgaWQ9IkFNU3ludGF4Ij5Vc2luZyB0aGUgSW5zdHJ1bWVudCBDb21tYW5kPC9oMj4KKzxoMiBpZD0iQU1TeW50YXgiPlVzaW5nIHRoZSBhbSBpbnN0cnVtZW50IENvbW1hbmQ8L2gyPgogPHA+Ci0gIFRoZSBnZW5lcmFsIHN5bnRheCBvZiB0aGUgPGNvZGU+YW0gaW5zdHJ1bWVudDwvY29kZT4gY29tbWFuZCBpczoKKyAgICBUaGUgZ2VuZXJhbCBzeW50YXggb2YgdGhlIDxjb2RlPmFtIGluc3RydW1lbnQ8L2NvZGU+IGNvbW1hbmQgaXM6CiA8L3A+CiA8cHJlPgogICAgIGFtIGluc3RydW1lbnQgW2ZsYWdzXSAmbHQ7dGVzdF9wYWNrYWdlJmd0Oy8mbHQ7cnVubmVyX2NsYXNzJmd0OwpAQCAtMzkxLDExICszOTUsMTEgQEAKICAgICAgICAgICAgIDxjb2RlPiZsdDt0ZXN0X3BhY2thZ2UmZ3Q7PC9jb2RlPgogICAgICAgICA8L3RkPgogICAgICAgICA8dGQ+Ci0gICAgICAgICAgICBUaGUgQW5kcm9pZCBwYWNrYWdlIG5hbWUgb2YgdGhlIHRlc3QgYXBwbGljYXRpb24uCisgICAgICAgICAgICBUaGUgQW5kcm9pZCBwYWNrYWdlIG5hbWUgb2YgdGhlIHRlc3QgcGFja2FnZS4KICAgICAgICAgPC90ZD4KICAgICAgICAgPHRkPgogICAgICAgICAgICAgVGhlIHZhbHVlIG9mIHRoZSA8Y29kZT5wYWNrYWdlPC9jb2RlPiBhdHRyaWJ1dGUgb2YgdGhlIDxjb2RlPm1hbmlmZXN0PC9jb2RlPgotICAgICAgICAgICAgZWxlbWVudCBpbiB0aGUgdGVzdCBhcHBsaWNhdGlvbidzIG1hbmlmZXN0IGZpbGUuCisgICAgICAgICAgICBlbGVtZW50IGluIHRoZSB0ZXN0IHBhY2thZ2UncyBtYW5pZmVzdCBmaWxlLgogICAgICAgICA8L3RkPgogICAgIDwvdHI+CiAgICAgPHRyPgpAQCAtNDExLDcgKzQxNSw3IEBACiAgICAgPC90cj4KIDwvdGFibGU+CiA8cD4KLVRoZSBmbGFncyBmb3IgPGNvZGU+YW0gaW5zdHJ1bWVudDwvY29kZT4gYXJlIGRlc2NyaWJlZCBpbiB0aGUgZm9sbG93aW5nIHRhYmxlOgorICAgIFRoZSBmbGFncyBmb3IgPGNvZGU+YW0gaW5zdHJ1bWVudDwvY29kZT4gYXJlIGRlc2NyaWJlZCBpbiB0aGUgZm9sbG93aW5nIHRhYmxlOgogPC9wPgogPHRhYmxlPgogICAgIDx0cj4KQEAgLTQ2MSwyMCArNDY1LDIxIEBACiAgICAgICAgICAgICAgJmx0O3Rlc3Rfb3B0aW9ucyZndDsKICAgICAgICAgPC90ZD4KICAgICAgICAgPHRkPgotICAgICAgICAgICAgUHJvdmlkZXMgdGVzdGluZyBvcHRpb25zICwgaW4gdGhlIGZvcm0gb2Yga2V5LXZhbHVlIHBhaXJzLiBUaGUKKyAgICAgICAgICAgIFByb3ZpZGVzIHRlc3Rpbmcgb3B0aW9ucyBhcyBrZXktdmFsdWUgcGFpcnMuIFRoZQogICAgICAgICAgICAgPGNvZGU+YW0gaW5zdHJ1bWVudDwvY29kZT4gdG9vbCBwYXNzZXMgdGhlc2UgdG8gdGhlIHNwZWNpZmllZCBpbnN0cnVtZW50YXRpb24gY2xhc3MKICAgICAgICAgICAgIHZpYSBpdHMgPGNvZGU+b25DcmVhdGUoKTwvY29kZT4gbWV0aG9kLiBZb3UgY2FuIHNwZWNpZnkgbXVsdGlwbGUgb2NjdXJyZW5jZXMgb2YKLSAgICAgICAgICAgIDxjb2RlPi1lICZsdDt0ZXN0X29wdGlvbnM8L2NvZGU+LiBUaGUga2V5cyBhbmQgdmFsdWVzIGFyZSBkZXNjcmliZWQgaW4gdGhlIG5leHQgdGFibGUuCisgICAgICAgICAgICA8Y29kZT4tZSAmbHQ7dGVzdF9vcHRpb25zJmd0OzwvY29kZT4uIFRoZSBrZXlzIGFuZCB2YWx1ZXMgYXJlIGRlc2NyaWJlZCBpbiB0aGUKKyAgICAgICAgICAgIHNlY3Rpb24gPGEgaHJlZj0iI0FNT3B0aW9uc1N5bnRheCI+YW0gaW5zdHJ1bWVudCBvcHRpb25zPC9hPi4KICAgICAgICAgICAgIDxwPgotICAgICAgICAgICAgICAgIFRoZSBvbmx5IGluc3RydW1lbnRhdGlvbiBjbGFzcyB0aGF0IHVuZGVyc3RhbmRzIHRoZXNlIGtleS12YWx1ZSBwYWlycyBpcwotICAgICAgICAgICAgICAgIDxjb2RlPkluc3RydW1lbnRhdGlvblRlc3RSdW5uZXI8L2NvZGU+IChvciBhIHN1YmNsYXNzKS4gVXNpbmcgdGhlbSB3aXRoCisgICAgICAgICAgICAgICAgVGhlIG9ubHkgaW5zdHJ1bWVudGF0aW9uIGNsYXNzIHRoYXQgdXNlcyB0aGVzZSBrZXktdmFsdWUgcGFpcnMgaXMKKyAgICAgICAgICAgICAgICB7QGxpbmsgYW5kcm9pZC50ZXN0Lkluc3RydW1lbnRhdGlvblRlc3RSdW5uZXJ9IChvciBhIHN1YmNsYXNzKS4gVXNpbmcgdGhlbSB3aXRoCiAgICAgICAgICAgICAgICAgYW55IG90aGVyIGNsYXNzIGhhcyBubyBlZmZlY3QuCiAgICAgICAgICAgICA8L3A+CiAgICAgICAgIDwvdGQ+CiAgICAgPC90cj4KIDwvdGFibGU+CiAKLTxoMyBpZD0iQU1PcHRpb25zU3ludGF4Ij5JbnN0cnVtZW50IG9wdGlvbnM8L2gzPgorPGgzIGlkPSJBTU9wdGlvbnNTeW50YXgiPmFtIGluc3RydW1lbnQgb3B0aW9uczwvaDM+CiA8cD4KICAgICBUaGUgPGNvZGU+YW0gaW5zdHJ1bWVudDwvY29kZT4gdG9vbCBwYXNzZXMgdGVzdGluZyBvcHRpb25zIHRvCiAgICAgPGNvZGU+SW5zdHJ1bWVudGF0aW9uVGVzdFJ1bm5lcjwvY29kZT4gb3IgYSBzdWJjbGFzcyBpbiB0aGUgZm9ybSBvZiBrZXktdmFsdWUgcGFpcnMsCkBAIC00ODQsMTIzICs0ODksMTI3IEBACiAgICAgLWUgJmx0O2tleSZndDsgJmx0O3ZhbHVlJmd0OwogPC9wcmU+CiA8cD4KLSAgICBXaGVyZSBhcHBsaWNhYmxlLCBhICZsdDtrZXkmZ3Q7IG1heSBoYXZlIG11bHRpcGxlIHZhbHVlcyBzZXBhcmF0ZWQgYnkgYSBjb21tYSAoLCkuCisgICAgU29tZSBrZXlzIGFjY2VwdCBtdWx0aXBsZSB2YWx1ZXMuIFlvdSBzcGVjaWZ5IG11bHRpcGxlIHZhbHVlcyBpbiBhIGNvbW1hLXNlcGFyYXRlZCBsaXN0LgogICAgIEZvciBleGFtcGxlLCB0aGlzIGludm9jYXRpb24gb2YgPGNvZGU+SW5zdHJ1bWVudGF0aW9uVGVzdFJ1bm5lcjwvY29kZT4gcHJvdmlkZXMgbXVsdGlwbGUKICAgICB2YWx1ZXMgZm9yIHRoZSA8Y29kZT5wYWNrYWdlPC9jb2RlPiBrZXk6Cis8L3A+CiA8cHJlPgotJCBhZGIgc2hlbGwgYW0gaW5zdHJ1bWVudCAtdyAtZSBwYWNrYWdlIGNvbS5hbmRyb2lkLnRlc3QucGFja2FnZTEsY29tLmFuZHJvaWQudGVzdC5wYWNrYWdlMiBjb20uYW5kcm9pZC50ZXN0L2FuZHJvaWQudGVzdC5JbnN0cnVtZW50YXRpb25UZXN0UnVubmVyCiskIGFkYiBzaGVsbCBhbSBpbnN0cnVtZW50IC13IC1lIHBhY2thZ2UgY29tLmFuZHJvaWQudGVzdC5wYWNrYWdlMSxjb20uYW5kcm9pZC50ZXN0LnBhY2thZ2UyIFwKKyZndDsgY29tLmFuZHJvaWQudGVzdC9hbmRyb2lkLnRlc3QuSW5zdHJ1bWVudGF0aW9uVGVzdFJ1bm5lcgogPC9wcmU+CiA8cD4KICAgICBUaGUgZm9sbG93aW5nIHRhYmxlIGRlc2NyaWJlcyB0aGUga2V5LXZhbHVlIHBhaXJzIGFuZCB0aGVpciByZXN1bHQuIFBsZWFzZSByZXZpZXcgdGhlCiAgICAgPHN0cm9uZz5Vc2FnZSBOb3Rlczwvc3Ryb25nPiBmb2xsb3dpbmcgdGhlIHRhYmxlLgogPC9wPgogPHRhYmxlPgotPHRyPgotICAgIDx0aD5LZXk8L3RoPgotICAgIDx0aD5WYWx1ZTwvdGg+Ci0gICAgPHRoPkRlc2NyaXB0aW9uPC90aD4KLTwvdHI+Ci08dHI+Ci0gICAgPHRkPgotICAgICAgICA8Y29kZT5wYWNrYWdlPC9jb2RlPgotICAgIDwvdGQ+Ci0gICAgPHRkPgotICAgICAgICAmbHQ7SmF2YV9wYWNrYWdlX25hbWUmZ3Q7Ci0gICAgPC90ZD4KLSAgICA8dGQ+Ci0gICAgICAgIFRoZSBmdWxseS1xdWFsaWZpZWQgPGVtPkphdmE8L2VtPiBwYWNrYWdlIG5hbWUgZm9yIG9uZSBvZiB0aGUgcGFja2FnZXMgaW4gdGhlIHRlc3QKLSAgICAgICAgYXBwbGljYXRpb24uIEFueSB0ZXN0IGNhc2UgY2xhc3MgdGhhdCB1c2VzIHRoaXMgcGFja2FnZSBuYW1lIGlzIGV4ZWN1dGVkLiBOb3RpY2UgdGhhdCB0aGlzCi0gICAgICAgIGlzIG5vdCBhbiA8ZW0+QW5kcm9pZDwvZW0+IHBhY2thZ2UgbmFtZTsgYSB0ZXN0IGFwcGxpY2F0aW9uIGhhcyBhIHNpbmdsZSBBbmRyb2lkIHBhY2thZ2UKLSAgICAgICAgbmFtZSBidXQgbWF5IGhhdmUgc2V2ZXJhbCBKYXZhIHBhY2thZ2VzIHdpdGhpbiBpdC4KLSAgICA8L3RkPgotPC90cj4KLTx0cj4KLSAgICA8dGQgcm93c3Bhbj0iMiI+PGNvZGU+Y2xhc3M8L2NvZGU+PC90ZD4KLSAgICA8dGQ+Jmx0O2NsYXNzX25hbWUmZ3Q7PC90ZD4KLSAgICA8dGQ+Ci0gICAgICAgIFRoZSBmdWxseS1xdWFsaWZpZWQgSmF2YSBjbGFzcyBuYW1lIGZvciBvbmUgb2YgdGhlIHRlc3QgY2FzZSBjbGFzc2VzLiBPbmx5IHRoaXMgdGVzdCBjYXNlCi0gICAgICAgIGNsYXNzIGlzIGV4ZWN1dGVkLgotICAgIDwvdGQ+Ci08L3RyPgotPHRyPgotICAgIDx0ZD4mbHQ7Y2xhc3NfbmFtZSZndDs8c3Ryb25nPiM8L3N0cm9uZz5tZXRob2QgbmFtZTwvdGQ+Ci0gICAgPHRkPgotICAgICAgICBBIGZ1bGx5LXF1YWxpZmllZCB0ZXN0IGNhc2UgY2xhc3MgbmFtZSwgYW5kIG9uZSBvZiBpdHMgbWV0aG9kcy4gT25seSB0aGlzIG1ldGhvZCBpcwotICAgICAgICBleGVjdXRlZC4gTm90ZSB0aGUgaGFzaCBtYXJrICgjKSBiZXR3ZWVuIHRoZSBjbGFzcyBuYW1lIGFuZCB0aGUgbWV0aG9kIG5hbWUuCi0gICAgPC90ZD4KLTwvdHI+Ci08dHI+Ci0gICAgPHRkPjxjb2RlPmZ1bmM8L2NvZGU+PC90ZD4KLSAgICA8dGQ+PGNvZGU+dHJ1ZTwvY29kZT48L3RkPgotICAgIDx0ZD4KLSAgICAgICAgUnVucyBhbGwgdGVzdCBjbGFzc2VzIHRoYXQgZXh0ZW5kIHtAbGluayBhbmRyb2lkLnRlc3QuSW5zdHJ1bWVudGF0aW9uVGVzdENhc2V9LgotICAgIDwvdGQ+Ci08L3RyPgotPHRyPgotICAgIDx0ZD48Y29kZT51bml0PC9jb2RlPjwvdGQ+Ci0gICAgPHRkPjxjb2RlPnRydWU8L2NvZGU+PC90ZD4KLSAgICA8dGQ+Ci0gICAgICAgIFJ1bnMgYWxsIHRlc3QgY2xhc3NlcyB0aGF0IGRvIDxlbT5ub3Q8L2VtPiBleHRlbmQgZWl0aGVyCi0gICAgICAgIHtAbGluayBhbmRyb2lkLnRlc3QuSW5zdHJ1bWVudGF0aW9uVGVzdENhc2V9IG9yIHtAbGluayBhbmRyb2lkLnRlc3QuUGVyZm9ybWFuY2VUZXN0Q2FzZX0uCi0gICAgPC90ZD4KLTwvdHI+Ci08dHI+Ci0gICAgPHRkPjxjb2RlPnNpemU8L2NvZGU+PC90ZD4KLSAgICA8dGQ+Wzxjb2RlPnNtYWxsPC9jb2RlPiB8IDxjb2RlPm1lZGl1bTwvY29kZT4gfCA8Y29kZT5sYXJnZTwvY29kZT5dCi0gICAgPC90ZD4KLSAgICA8dGQ+Ci0gICAgICAgIFJ1bnMgYSB0ZXN0IG1ldGhvZCBhbm5vdGF0ZWQgYnkgc2l6ZS4gVGhlICBhbm5vdGF0aW9ucyBhcmUgPGNvZGU+QFNtYWxsVGVzdDwvY29kZT4sCi0gICAgICAgIDxjb2RlPkBNZWRpdW1UZXN0PC9jb2RlPiwgYW5kIDxjb2RlPkBMYXJnZVRlc3Q8L2NvZGU+LgotICAgIDwvdGQ+Ci08L3RyPgotPHRyPgotICAgIDx0ZD48Y29kZT5wZXJmPC9jb2RlPjwvdGQ+Ci0gICAgPHRkPjxjb2RlPnRydWU8L2NvZGU+PC90ZD4KLSAgICA8dGQ+Ci0gICAgICAgIFJ1bnMgYWxsIHRlc3QgY2xhc3NlcyB0aGF0IGltcGxlbWVudCB7QGxpbmsgYW5kcm9pZC50ZXN0LlBlcmZvcm1hbmNlVGVzdENhc2V9LgotICAgICAgICBXaGVuIHlvdSB1c2UgdGhpcyBvcHRpb24sIGFsc28gc3BlY2lmeSB0aGUgPGNvZGU+LXI8L2NvZGU+IGZsYWcgZm9yCi0gICAgICAgIDxjb2RlPmFtIGluc3RydW1lbnQ8L2NvZGU+LCBzbyB0aGF0IHRoZSBvdXRwdXQgaXMga2VwdCBpbiByYXcgZm9ybWF0IGFuZCBub3QKLSAgICAgICAgcmUtZm9ybWF0dGVkIGFzIHRlc3QgcmVzdWx0cy4KLSAgICA8L3RkPgotPC90cj4KLTx0cj4KLSAgICA8dGQ+PGNvZGU+ZGVidWc8L2NvZGU+PC90ZD4KLSAgICA8dGQ+PGNvZGU+dHJ1ZTwvY29kZT48L3RkPgotICAgIDx0ZD4KLSAgICAgICAgUnVucyB0ZXN0cyBpbiBkZWJ1ZyBtb2RlLgotICAgIDwvdGQ+Ci08L3RyPgotPHRyPgotICAgIDx0ZD48Y29kZT5sb2c8L2NvZGU+PC90ZD4KLSAgICA8dGQ+PGNvZGU+dHJ1ZTwvY29kZT48L3RkPgotICAgIDx0ZD4KLSAgICAgICAgTG9hZHMgYW5kIGxvZ3MgYWxsIHNwZWNpZmllZCB0ZXN0cywgYnV0IGRvZXMgbm90IHJ1biB0aGVtLiBUaGUgdGVzdAotICAgICAgICBpbmZvcm1hdGlvbiBhcHBlYXJzIGluIDxjb2RlPlNURE9VVDwvY29kZT4uIFVzZSB0aGlzIHRvIHZlcmlmeSBjb21iaW5hdGlvbnMgb2Ygb3RoZXIgZmlsdGVycwotICAgICAgICBhbmQgdGVzdCBzcGVjaWZpY2F0aW9ucy4KLSAgICA8L3RkPgotPC90cj4KLTx0cj4KLSAgICA8dGQ+PGNvZGU+ZW1tYTwvY29kZT48L3RkPgotICAgIDx0ZD48Y29kZT50cnVlPC9jb2RlPjwvdGQ+Ci0gICAgPHRkPgotICAgICAgICBSdW5zIGFuIEVNTUEgY29kZSBjb3ZlcmFnZSBhbmFseXNpcyBhbmQgd3JpdGVzIHRoZSBvdXRwdXQgdG8gPGNvZGU+L2RhdGEvL2NvdmVyYWdlLmVjPC9jb2RlPgotICAgICAgICBvbiB0aGUgZGV2aWNlLiBUbyBvdmVycmlkZSB0aGUgZmlsZSBsb2NhdGlvbiwgdXNlIHRoZSA8Y29kZT5jb3ZlcmFnZUZpbGU8L2NvZGU+IGtleSB0aGF0Ci0gICAgICAgIGlzIGRlc2NyaWJlZCBpbiB0aGUgZm9sbG93aW5nIGVudHJ5LgotICAgICAgICA8cCBjbGFzcz0ibm90ZSI+Ci0gICAgICAgICAgICA8c3Ryb25nPk5vdGU6PC9zdHJvbmc+IFRoaXMgb3B0aW9uIHJlcXVpcmVzIGFuIEVNTUEtaW5zdHJ1bWVudGVkIGJ1aWxkIG9mIHRoZSB0ZXN0Ci0gICAgICAgICAgICBhcHBsaWNhdGlvbiwgd2hpY2ggeW91IGNhbiBnZW5lcmF0ZSB3aXRoIHRoZSA8Y29kZT5jb3ZlcmFnZTwvY29kZT4gdGFyZ2V0LgotICAgICAgICA8L3A+Ci0gICAgPC90ZD4KLTwvdHI+Ci08dHI+Ci0gICAgPHRkPjxjb2RlPmNvdmVyYWdlRmlsZTwvY29kZT48L3RkPgotICAgIDx0ZD48Y29kZT4mbHQ7ZmlsZW5hbWUmZ3Q7PC9jb2RlPjwvdGQ+Ci0gICAgPHRkPgotICAgICAgICBPdmVycmlkZXMgdGhlIGRlZmF1bHQgbG9jYXRpb24gb2YgdGhlIEVNTUEgY292ZXJhZ2UgZmlsZSBvbiB0aGUgZGV2aWNlLiBTcGVjaWZ5IHRoaXMKLSAgICAgICAgdmFsdWUgYXMgYSBwYXRoIGFuZCBmaWxlbmFtZSBpbiBVTklYIGZvcm1hdC4gVGhlIGRlZmF1bHQgZmlsZW5hbWUgaXMgZGVzY3JpYmVkIGluIHRoZQotICAgICAgICBlbnRyeSBmb3IgdGhlIDxjb2RlPmVtbWE8L2NvZGU+IGtleS4KLSAgICA8L3RkPgotPC90cj4KKyAgICA8dHI+CisgICAgICAgIDx0aD5LZXk8L3RoPgorICAgICAgICA8dGg+VmFsdWU8L3RoPgorICAgICAgICA8dGg+RGVzY3JpcHRpb248L3RoPgorICAgIDwvdHI+CisgICAgPHRyPgorICAgICAgICA8dGQ+CisgICAgICAgICAgICA8Y29kZT5wYWNrYWdlPC9jb2RlPgorICAgICAgICA8L3RkPgorICAgICAgICA8dGQ+CisgICAgICAgICAgICAmbHQ7SmF2YV9wYWNrYWdlX25hbWUmZ3Q7CisgICAgICAgIDwvdGQ+CisgICAgICAgIDx0ZD4KKyAgICAgICAgICAgIFRoZSBmdWxseS1xdWFsaWZpZWQgPGVtPkphdmE8L2VtPiBwYWNrYWdlIG5hbWUgZm9yIG9uZSBvZiB0aGUgcGFja2FnZXMgaW4gdGhlIHRlc3QKKyAgICAgICAgICAgIGFwcGxpY2F0aW9uLiBBbnkgdGVzdCBjYXNlIGNsYXNzIHRoYXQgdXNlcyB0aGlzIHBhY2thZ2UgbmFtZSBpcyBleGVjdXRlZC4gTm90aWNlIHRoYXQKKyAgICAgICAgICAgIHRoaXMgaXMgbm90IGFuIDxlbT5BbmRyb2lkPC9lbT4gcGFja2FnZSBuYW1lOyBhIHRlc3QgcGFja2FnZSBoYXMgYSBzaW5nbGUKKyAgICAgICAgICAgIEFuZHJvaWQgcGFja2FnZSBuYW1lIGJ1dCBtYXkgaGF2ZSBzZXZlcmFsIEphdmEgcGFja2FnZXMgd2l0aGluIGl0LgorICAgICAgICA8L3RkPgorICAgIDwvdHI+CisgICAgPHRyPgorICAgICAgICA8dGQgcm93c3Bhbj0iMiI+PGNvZGU+Y2xhc3M8L2NvZGU+PC90ZD4KKyAgICAgICAgPHRkPiZsdDtjbGFzc19uYW1lJmd0OzwvdGQ+CisgICAgICAgIDx0ZD4KKyAgICAgICAgICAgIFRoZSBmdWxseS1xdWFsaWZpZWQgSmF2YSBjbGFzcyBuYW1lIGZvciBvbmUgb2YgdGhlIHRlc3QgY2FzZSBjbGFzc2VzLiBPbmx5IHRoaXMgdGVzdAorICAgICAgICAgICAgY2FzZSBjbGFzcyBpcyBleGVjdXRlZC4KKyAgICAgICAgPC90ZD4KKyAgICA8L3RyPgorICAgIDx0cj4KKyAgICAgICAgPHRkPiZsdDtjbGFzc19uYW1lJmd0OzxzdHJvbmc+Izwvc3Ryb25nPm1ldGhvZCBuYW1lPC90ZD4KKyAgICAgICAgPHRkPgorICAgICAgICAgICAgQSBmdWxseS1xdWFsaWZpZWQgdGVzdCBjYXNlIGNsYXNzIG5hbWUsIGFuZCBvbmUgb2YgaXRzIG1ldGhvZHMuIE9ubHkgdGhpcyBtZXRob2QgaXMKKyAgICAgICAgICAgIGV4ZWN1dGVkLiBOb3RlIHRoZSBoYXNoIG1hcmsgKCMpIGJldHdlZW4gdGhlIGNsYXNzIG5hbWUgYW5kIHRoZSBtZXRob2QgbmFtZS4KKyAgICAgICAgPC90ZD4KKyAgICA8L3RyPgorICAgIDx0cj4KKyAgICAgICAgPHRkPjxjb2RlPmZ1bmM8L2NvZGU+PC90ZD4KKyAgICAgICAgPHRkPjxjb2RlPnRydWU8L2NvZGU+PC90ZD4KKyAgICAgICAgPHRkPgorICAgICAgICAgICAgUnVucyBhbGwgdGVzdCBjbGFzc2VzIHRoYXQgZXh0ZW5kIHtAbGluayBhbmRyb2lkLnRlc3QuSW5zdHJ1bWVudGF0aW9uVGVzdENhc2V9LgorICAgICAgICA8L3RkPgorICAgIDwvdHI+CisgICAgPHRyPgorICAgICAgICA8dGQ+PGNvZGU+dW5pdDwvY29kZT48L3RkPgorICAgICAgICA8dGQ+PGNvZGU+dHJ1ZTwvY29kZT48L3RkPgorICAgICAgICA8dGQ+CisgICAgICAgICAgICBSdW5zIGFsbCB0ZXN0IGNsYXNzZXMgdGhhdCBkbyA8ZW0+bm90PC9lbT4gZXh0ZW5kIGVpdGhlcgorICAgICAgICAgICAge0BsaW5rIGFuZHJvaWQudGVzdC5JbnN0cnVtZW50YXRpb25UZXN0Q2FzZX0gb3IKKyAgICAgICAgICAgIHtAbGluayBhbmRyb2lkLnRlc3QuUGVyZm9ybWFuY2VUZXN0Q2FzZX0uCisgICAgICAgIDwvdGQ+CisgICAgPC90cj4KKyAgICA8dHI+CisgICAgICAgIDx0ZD48Y29kZT5zaXplPC9jb2RlPjwvdGQ+CisgICAgICAgIDx0ZD4KKyAgICAgICAgICAgIFs8Y29kZT5zbWFsbDwvY29kZT4gfCA8Y29kZT5tZWRpdW08L2NvZGU+IHwgPGNvZGU+bGFyZ2U8L2NvZGU+XQorICAgICAgICA8L3RkPgorICAgICAgICA8dGQ+CisgICAgICAgICAgICBSdW5zIGEgdGVzdCBtZXRob2QgYW5ub3RhdGVkIGJ5IHNpemUuIFRoZSAgYW5ub3RhdGlvbnMgYXJlIDxjb2RlPkBTbWFsbFRlc3Q8L2NvZGU+LAorICAgICAgICAgICAgPGNvZGU+QE1lZGl1bVRlc3Q8L2NvZGU+LCBhbmQgPGNvZGU+QExhcmdlVGVzdDwvY29kZT4uCisgICAgICAgIDwvdGQ+CisgICAgPC90cj4KKyAgICA8dHI+CisgICAgICAgIDx0ZD48Y29kZT5wZXJmPC9jb2RlPjwvdGQ+CisgICAgICAgIDx0ZD48Y29kZT50cnVlPC9jb2RlPjwvdGQ+CisgICAgICAgIDx0ZD4KKyAgICAgICAgICAgIFJ1bnMgYWxsIHRlc3QgY2xhc3NlcyB0aGF0IGltcGxlbWVudCB7QGxpbmsgYW5kcm9pZC50ZXN0LlBlcmZvcm1hbmNlVGVzdENhc2V9LgorICAgICAgICAgICAgV2hlbiB5b3UgdXNlIHRoaXMgb3B0aW9uLCBhbHNvIHNwZWNpZnkgdGhlIDxjb2RlPi1yPC9jb2RlPiBmbGFnIGZvcgorICAgICAgICAgICAgPGNvZGU+YW0gaW5zdHJ1bWVudDwvY29kZT4sIHNvIHRoYXQgdGhlIG91dHB1dCBpcyBrZXB0IGluIHJhdyBmb3JtYXQgYW5kIG5vdAorICAgICAgICAgICAgcmUtZm9ybWF0dGVkIGFzIHRlc3QgcmVzdWx0cy4KKyAgICAgICAgPC90ZD4KKyAgICA8L3RyPgorICAgIDx0cj4KKyAgICAgICAgPHRkPjxjb2RlPmRlYnVnPC9jb2RlPjwvdGQ+CisgICAgICAgIDx0ZD48Y29kZT50cnVlPC9jb2RlPjwvdGQ+CisgICAgICAgIDx0ZD4KKyAgICAgICAgICAgIFJ1bnMgdGVzdHMgaW4gZGVidWcgbW9kZS4KKyAgICAgICAgPC90ZD4KKyAgICA8L3RyPgorICAgIDx0cj4KKyAgICAgICAgPHRkPjxjb2RlPmxvZzwvY29kZT48L3RkPgorICAgICAgICA8dGQ+PGNvZGU+dHJ1ZTwvY29kZT48L3RkPgorICAgICAgICA8dGQ+CisgICAgICAgICAgICBMb2FkcyBhbmQgbG9ncyBhbGwgc3BlY2lmaWVkIHRlc3RzLCBidXQgZG9lcyBub3QgcnVuIHRoZW0uIFRoZSB0ZXN0CisgICAgICAgICAgICBpbmZvcm1hdGlvbiBhcHBlYXJzIGluIDxjb2RlPlNURE9VVDwvY29kZT4uIFVzZSB0aGlzIHRvIHZlcmlmeSBjb21iaW5hdGlvbnMgb2Ygb3RoZXIKKyAgICAgICAgICAgIGZpbHRlcnMgYW5kIHRlc3Qgc3BlY2lmaWNhdGlvbnMuCisgICAgICAgIDwvdGQ+CisgICAgPC90cj4KKyAgICA8dHI+CisgICAgICAgIDx0ZD48Y29kZT5lbW1hPC9jb2RlPjwvdGQ+CisgICAgICAgIDx0ZD48Y29kZT50cnVlPC9jb2RlPjwvdGQ+CisgICAgICAgIDx0ZD4KKyAgICAgICAgICAgIFJ1bnMgYW4gRU1NQSBjb2RlIGNvdmVyYWdlIGFuYWx5c2lzIGFuZCB3cml0ZXMgdGhlIG91dHB1dCB0bworICAgICAgICAgICAgPGNvZGU+L2RhdGEvL2NvdmVyYWdlLmVjPC9jb2RlPiBvbiB0aGUgZGV2aWNlLiBUbyBvdmVycmlkZSB0aGUgZmlsZSBsb2NhdGlvbiwgdXNlIHRoZQorICAgICAgICAgICAgPGNvZGU+Y292ZXJhZ2VGaWxlPC9jb2RlPiBrZXkgdGhhdCBpcyBkZXNjcmliZWQgaW4gdGhlIGZvbGxvd2luZyBlbnRyeS4KKyAgICAgICAgICAgIDxwIGNsYXNzPSJub3RlIj4KKyAgICAgICAgICAgICAgICA8c3Ryb25nPk5vdGU6PC9zdHJvbmc+IFRoaXMgb3B0aW9uIHJlcXVpcmVzIGFuIEVNTUEtaW5zdHJ1bWVudGVkIGJ1aWxkIG9mIHRoZSB0ZXN0CisgICAgICAgICAgICAgICAgYXBwbGljYXRpb24sIHdoaWNoIHlvdSBjYW4gZ2VuZXJhdGUgd2l0aCB0aGUgPGNvZGU+Y292ZXJhZ2U8L2NvZGU+IHRhcmdldC4KKyAgICAgICAgICAgIDwvcD4KKyAgICAgICAgPC90ZD4KKyAgICA8L3RyPgorICAgIDx0cj4KKyAgICAgICAgPHRkPjxjb2RlPmNvdmVyYWdlRmlsZTwvY29kZT48L3RkPgorICAgICAgICA8dGQ+PGNvZGU+Jmx0O2ZpbGVuYW1lJmd0OzwvY29kZT48L3RkPgorICAgICAgICA8dGQ+CisgICAgICAgICAgICBPdmVycmlkZXMgdGhlIGRlZmF1bHQgbG9jYXRpb24gb2YgdGhlIEVNTUEgY292ZXJhZ2UgZmlsZSBvbiB0aGUgZGV2aWNlLiBTcGVjaWZ5IHRoaXMKKyAgICAgICAgICAgIHZhbHVlIGFzIGEgcGF0aCBhbmQgZmlsZW5hbWUgaW4gVU5JWCBmb3JtYXQuIFRoZSBkZWZhdWx0IGZpbGVuYW1lIGlzIGRlc2NyaWJlZCBpbiB0aGUKKyAgICAgICAgICAgIGVudHJ5IGZvciB0aGUgPGNvZGU+ZW1tYTwvY29kZT4ga2V5LgorICAgICAgICA8L3RkPgorICAgIDwvdHI+CiA8L3RhYmxlPgogPHN0cm9uZz48Y29kZT4tZTwvY29kZT4gRmxhZyBVc2FnZSBOb3Rlczwvc3Ryb25nPgogPHVsPgpAQCAtNjE4LDEzICs2MjcsMTMgQEAKICAgICAgICAgVGhlIDxjb2RlPmZ1bmM8L2NvZGU+IGtleSBhbmQgPGNvZGU+dW5pdDwvY29kZT4ga2V5IGFyZSBtdXR1YWxseSBleGNsdXNpdmUuCiAgICAgPC9saT4KIDwvdWw+Ci08aDMgaWQ9IlJ1blRlc3RFeGFtcGxlcyI+SW5zdHJ1bWVudCBleGFtcGxlczwvaDM+Cis8aDMgaWQ9IlJ1blRlc3RFeGFtcGxlcyI+VXNhZ2UgZXhhbXBsZXM8L2gzPgogPHA+Ci1IZXJlIGFyZSBzb21lIGV4YW1wbGVzIG9mIHVzaW5nIDxjb2RlPmFtIGluc3RydW1lbnQ8L2NvZGU+IHRvIHJ1biB0ZXN0cy4gVGhleSBhcmUgYmFzZWQgb24KLXRoZSBmb2xsb3dpbmcgc3RydWN0dXJlOjwvcD4KK1RoZSBmb2xsb3dpbmcgc2VjdGlvbnMgcHJvdmlkZSBleGFtcGxlcyBvZiB1c2luZyA8Y29kZT5hbSBpbnN0cnVtZW50PC9jb2RlPiB0byBydW4gdGVzdHMuCitUaGV5IGFyZSBiYXNlZCBvbiB0aGUgZm9sbG93aW5nIHN0cnVjdHVyZTo8L3A+CiA8dWw+CiAgICAgPGxpPgotICAgICAgICBUaGUgdGVzdCBhcHBsaWNhdGlvbiBoYXMgdGhlIEFuZHJvaWQgcGFja2FnZSBuYW1lIDxjb2RlPmNvbS5hbmRyb2lkLmRlbW8uYXBwLnRlc3RzPC9jb2RlPgorICAgICAgICBUaGUgdGVzdCBwYWNrYWdlIGhhcyB0aGUgQW5kcm9pZCBwYWNrYWdlIG5hbWUgPGNvZGU+Y29tLmFuZHJvaWQuZGVtby5hcHAudGVzdHM8L2NvZGU+CiAgICAgPC9saT4KICAgICA8bGk+CiAgICAgICAgIFRoZXJlIGFyZSB0aHJlZSB0ZXN0IGNsYXNzZXM6CkBAIC02NDcsMzUgKzY1NiwzNSBAQAogICAgICAgICBUaGUgdGVzdCBydW5uZXIgaXMge0BsaW5rIGFuZHJvaWQudGVzdC5JbnN0cnVtZW50YXRpb25UZXN0UnVubmVyfS4KICAgICA8L2xpPgogPC91bD4KLTxoND5SdW5uaW5nIHRoZSBFbnRpcmUgVGVzdCBBcHBsaWNhdGlvbjwvaDQ+Cis8aDQ+UnVubmluZyB0aGUgZW50aXJlIHRlc3QgcGFja2FnZTwvaDQ+CiA8cD4KLSAgICBUbyBydW4gYWxsIG9mIHRoZSB0ZXN0IGNsYXNzZXMgaW4gdGhlIHRlc3QgYXBwbGljYXRpb24sIGVudGVyOgorICAgIFRvIHJ1biBhbGwgb2YgdGhlIHRlc3QgY2xhc3NlcyBpbiB0aGUgdGVzdCBwYWNrYWdlLCBlbnRlcjoKIDwvcD4KIDxwcmU+CiAkIGFkYiBzaGVsbCBhbSBpbnN0cnVtZW50IC13IGNvbS5hbmRyb2lkLmRlbW8uYXBwLnRlc3RzL2FuZHJvaWQudGVzdC5JbnN0cnVtZW50YXRpb25UZXN0UnVubmVyCiA8L3ByZT4KLTxoND5SdW5uaW5nIEFsbCBUZXN0cyBpbiBhIFRlc3QgQ2FzZSBDbGFzczwvaDQ+Cis8aDQ+UnVubmluZyBhbGwgdGVzdHMgaW4gYSB0ZXN0IGNhc2UgY2xhc3M8L2g0PgogPHA+CiAgICAgVG8gcnVuIGFsbCBvZiB0aGUgdGVzdHMgaW4gdGhlIGNsYXNzIDxjb2RlPlVuaXRUZXN0czwvY29kZT4sIGVudGVyOgogPC9wPgogPHByZT4KICQgYWRiIHNoZWxsIGFtIGluc3RydW1lbnQgLXcgIFwKLS1lIGNsYXNzIGNvbS5hbmRyb2lkLmRlbW8uYXBwLnRlc3RzLlVuaXRUZXN0cyBcCi1jb20uYW5kcm9pZC5kZW1vLmFwcC50ZXN0cy9hbmRyb2lkLnRlc3QuSW5zdHJ1bWVudGF0aW9uVGVzdFJ1bm5lcgorJmd0OyAtZSBjbGFzcyBjb20uYW5kcm9pZC5kZW1vLmFwcC50ZXN0cy5Vbml0VGVzdHMgXAorJmd0OyBjb20uYW5kcm9pZC5kZW1vLmFwcC50ZXN0cy9hbmRyb2lkLnRlc3QuSW5zdHJ1bWVudGF0aW9uVGVzdFJ1bm5lcgogPC9wcmU+CiA8cD4KICAgPGNvZGU+YW0gaW5zdHJ1bWVudDwvY29kZT4gZ2V0cyB0aGUgdmFsdWUgb2YgdGhlIDxjb2RlPi1lPC9jb2RlPiBmbGFnLCBkZXRlY3RzIHRoZQogICA8Y29kZT5jbGFzczwvY29kZT4ga2V5d29yZCwgYW5kIHJ1bnMgYWxsIHRoZSBtZXRob2RzIGluIHRoZSA8Y29kZT5Vbml0VGVzdHM8L2NvZGU+IGNsYXNzLgogPC9wPgotPGg0PlNlbGVjdGluZyBhIFN1YnNldCBvZiBUZXN0czwvaDQ+Cis8aDQ+U2VsZWN0aW5nIGEgc3Vic2V0IG9mIHRlc3RzPC9oND4KIDxwPgotICBUbyBydW4gYWxsIG9mIHRoZSB0ZXN0cyBpbiA8Y29kZT5Vbml0VGVzdHM8L2NvZGU+LCBhbmQgdGhlIDxjb2RlPnRlc3RDYW1lcmE8L2NvZGU+IG1ldGhvZCBpbgotICA8Y29kZT5GdW5jdGlvblRlc3RzPC9jb2RlPiwgZW50ZXI6CisgICAgVG8gcnVuIGFsbCBvZiB0aGUgdGVzdHMgaW4gPGNvZGU+VW5pdFRlc3RzPC9jb2RlPiwgYW5kIHRoZSA8Y29kZT50ZXN0Q2FtZXJhPC9jb2RlPiBtZXRob2QgaW4KKyAgICA8Y29kZT5GdW5jdGlvblRlc3RzPC9jb2RlPiwgZW50ZXI6CiA8L3A+CiA8cHJlPgogJCBhZGIgc2hlbGwgYW0gaW5zdHJ1bWVudCAtdyBcCi0tZSBjbGFzcyBjb20uYW5kcm9pZC5kZW1vLmFwcC50ZXN0cy5Vbml0VGVzdHMsY29tLmFuZHJvaWQuZGVtby5hcHAudGVzdHMuRnVuY3Rpb25UZXN0cyN0ZXN0Q2FtZXJhIFwKLWNvbS5hbmRyb2lkLmRlbW8uYXBwLnRlc3RzL2FuZHJvaWQudGVzdC5JbnN0cnVtZW50YXRpb25UZXN0UnVubmVyCismZ3Q7IC1lIGNsYXNzIGNvbS5hbmRyb2lkLmRlbW8uYXBwLnRlc3RzLlVuaXRUZXN0cyxjb20uYW5kcm9pZC5kZW1vLmFwcC50ZXN0cy5GdW5jdGlvblRlc3RzI3Rlc3RDYW1lcmEgXAorJmd0OyBjb20uYW5kcm9pZC5kZW1vLmFwcC50ZXN0cy9hbmRyb2lkLnRlc3QuSW5zdHJ1bWVudGF0aW9uVGVzdFJ1bm5lcgogPC9wcmU+CiA8cD4KICAgICBZb3UgY2FuIGZpbmQgbW9yZSBleGFtcGxlcyBvZiB0aGUgY29tbWFuZCBpbiB0aGUgZG9jdW1lbnRhdGlvbiBmb3IKZGlmZiAtLWdpdCBhL2RvY3MvaHRtbC9ndWlkZS9ndWlkZV90b2MuY3MgYi9kb2NzL2h0bWwvZ3VpZGUvZ3VpZGVfdG9jLmNzCmluZGV4IDM1Y2UxN2UuLjk3OTM3NDggMTAwNjQ0Ci0tLSBhL2RvY3MvaHRtbC9ndWlkZS9ndWlkZV90b2MuY3MKKysrIGIvZG9jcy9odG1sL2d1aWRlL2d1aWRlX3RvYy5jcwpAQCAtMjU0LDkgKzI1NCwzMCBAQAogICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ijw/Y3MgdmFyOnRvcm9vdD8+Z3VpZGUvdG9waWNzL3NlYXJjaC9zZWFyY2hhYmxlLWNvbmZpZy5odG1sIj5TZWFyY2hhYmxlIENvbmZpZ3VyYXRpb248L2E+PC9saT4KICAgICAgICAgICA8L3VsPgogICAgICAgPC9saT4KLSAgICAgIDxsaT48YSBocmVmPSI8P2NzIHZhcjp0b3Jvb3Q/Pmd1aWRlL3RvcGljcy90ZXN0aW5nL3Rlc3RpbmdfYW5kcm9pZC5odG1sIj4KLSAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJlbiI+VGVzdGluZyBhbmQgSW5zdHJ1bWVudGF0aW9uPC9zcGFuPjwvYT4KLSAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJuZXciPm5ldyE8L3NwYW4+PC9saT4KKyAgICAgIDxsaSBjbGFzcz0idG9nZ2xlLWxpc3QiPgorICAgICAgICAgICA8ZGl2PgorICAgICAgICAgICAgICAgIDxhIGhyZWY9Ijw/Y3MgdmFyOnRvcm9vdCA/Pmd1aWRlL3RvcGljcy90ZXN0aW5nL2luZGV4Lmh0bWwiPgorICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJlbiI+VGVzdGluZzwvc3Bhbj4KKyAgICAgICAgICAgICAgIDwvYT4gPHNwYW4gY2xhc3M9Im5ldyI+bmV3ITwvc3Bhbj4KKyAgICAgICAgICAgPC9kaXY+CisgICAgICAgICAgIDx1bD4KKyAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ijw/Y3MgdmFyOnRvcm9vdD8+Z3VpZGUvdG9waWNzL3Rlc3RpbmcvdGVzdGluZ19hbmRyb2lkLmh0bWwiPgorICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJlbiI+VGVzdGluZyBGdW5kYW1lbnRhbHM8L3NwYW4+PC9hPgorICAgICAgICAgICAgICA8L2xpPgorICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iPD9jcyB2YXI6dG9yb290Pz5ndWlkZS90b3BpY3MvdGVzdGluZy9hY3Rpdml0eV90ZXN0aW5nLmh0bWwiPgorICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJlbiI+QWN0aXZpdHkgVGVzdGluZzwvc3Bhbj48L2E+CisgICAgICAgICAgICAgIDwvbGk+CisgICAgICAgICAgICAgIDxsaT48YSBocmVmPSI8P2NzIHZhcjp0b3Jvb3QgPz5ndWlkZS90b3BpY3MvdGVzdGluZy9jb250ZW50cHJvdmlkZXJfdGVzdGluZy5odG1sIj4KKyAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iZW4iPkNvbnRlbnQgUHJvdmlkZXIgVGVzdGluZzwvc3Bhbj48L2E+CisgICAgICAgICAgICAgIDwvbGk+CisgICAgICAgICAgICAgIDxsaT48YSBocmVmPSI8P2NzIHZhcjp0b3Jvb3QgPz5ndWlkZS90b3BpY3MvdGVzdGluZy9zZXJ2aWNlX3Rlc3RpbmcuaHRtbCI+CisgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImVuIj5TZXJ2aWNlIFRlc3Rpbmc8L3NwYW4+PC9hPgorICAgICAgICAgICAgICA8L2xpPgorICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iPD9jcyB2YXI6dG9yb290ID8+Z3VpZGUvdG9waWNzL3Rlc3Rpbmcvd2hhdF90b190ZXN0Lmh0bWwiPgorICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJlbiI+V2hhdCBUbyBUZXN0PC9zcGFuPjwvYT4KKyAgICAgICAgICAgICAgPC9saT4KKyAgICAgICAgICAgPC91bD4KKyAgICAgIDwvbGk+CiAgICAgPC91bD4KICAgPC9saT4KIApkaWZmIC0tZ2l0IGEvZG9jcy9odG1sL2d1aWRlL3RvcGljcy9mdW5kYW1lbnRhbHMuamQgYi9kb2NzL2h0bWwvZ3VpZGUvdG9waWNzL2Z1bmRhbWVudGFscy5qZAppbmRleCA2ZDZhYmQ4Li5kYjA2ZWZjIDEwMDY0NAotLS0gYS9kb2NzL2h0bWwvZ3VpZGUvdG9waWNzL2Z1bmRhbWVudGFscy5qZAorKysgYi9kb2NzL2h0bWwvZ3VpZGUvdG9waWNzL2Z1bmRhbWVudGFscy5qZApAQCAtMjkyLDggKzI5Miw4IEBACiA8bGk+PHA+QSBzZXJ2aWNlIGlzIHN0YXJ0ZWQgKG9yIG5ldyBpbnN0cnVjdGlvbnMgYXJlIGdpdmVuIHRvIGFuIG9uZ29pbmcgCiBzZXJ2aWNlKSBieSBwYXNzaW5nIGFuIEludGVudCBvYmplY3QgdG8gPGNvZGU+e0BsaW5rIAogYW5kcm9pZC5jb250ZW50LkNvbnRleHQjc3RhcnRTZXJ2aWNlIENvbnRleHQuc3RhcnRTZXJ2aWNlKCl9PC9jb2RlPi4gIAotQW5kcm9pZCBjYWxscyB0aGUgc2VydmljZSdzIDxjb2RlPntAbGluayBhbmRyb2lkLmFwcC5TZXJ2aWNlI29uU3RhcnQgCi1vblN0YXJ0KCl9PC9jb2RlPiBtZXRob2QgYW5kIHBhc3NlcyBpdCB0aGUgSW50ZW50IG9iamVjdC48L3A+CitBbmRyb2lkIGNhbGxzIHRoZSBzZXJ2aWNlJ3MgPGNvZGU+e0BsaW5rIGFuZHJvaWQuYXBwLlNlcnZpY2Ujb25TdGFydENvbW1hbmQKK29uU3RhcnRDb21tYW5kKCl9PC9jb2RlPiBtZXRob2QgYW5kIHBhc3NlcyBpdCB0aGUgSW50ZW50IG9iamVjdC48L3A+CiAKIDxwPgogU2ltaWxhcmx5LCBhbiBpbnRlbnQgY2FuIGJlIHBhc3NlZCB0byA8Y29kZT57QGxpbmsgCkBAIC0xNTA4LDkgKzE1MDgsOSBAQAogaW4ge0Bjb2RlIG9uQ3JlYXRlKCl9LCBhbmQgdGhlbiBzdG9wIHRoZSB0aHJlYWQgaW4ge0Bjb2RlIG9uRGVzdHJveSgpfS48L2xpPgogCiA8bGk+PHA+VGhlIDxiPmFjdGl2ZSBsaWZldGltZTwvYj4gb2YgYSBzZXJ2aWNlIGJlZ2lucyB3aXRoIGEgY2FsbCB0byAKLTxjb2RlPntAbGluayBhbmRyb2lkLmFwcC5TZXJ2aWNlI29uU3RhcnQgb25TdGFydCgpfTwvY29kZT4uICBUaGlzIG1ldGhvZCAKKzxjb2RlPntAbGluayBhbmRyb2lkLmFwcC5TZXJ2aWNlI29uU3RhcnRDb21tYW5kIG9uU3RhcnRDb21tYW5kKCl9PC9jb2RlPi4gIFRoaXMgbWV0aG9kCiBpcyBoYW5kZWQgdGhlIEludGVudCBvYmplY3QgdGhhdCB3YXMgcGFzc2VkIHRvIHtAY29kZSBzdGFydFNlcnZpY2UoKX0uCi1UaGUgbXVzaWMgc2VydmljZSB3b3VsZCBvcGVuIHRoZSBJbnRlbnQgdG8gZGlzY292ZXIgd2hpY2ggbXVzaWMgdG8gCitUaGUgbXVzaWMgc2VydmljZSB3b3VsZCBvcGVuIHRoZSBJbnRlbnQgdG8gZGlzY292ZXIgd2hpY2ggbXVzaWMgdG8KIHBsYXksIGFuZCBiZWdpbiB0aGUgcGxheWJhY2suPC9wPgogCiA8cD4KQEAgLTE1MjUsNyArMTUyNSw3IEBACiA8Y29kZT57QGxpbmsgYW5kcm9pZC5jb250ZW50LkNvbnRleHQjc3RhcnRTZXJ2aWNlIENvbnRleHQuc3RhcnRTZXJ2aWNlKCl9PC9jb2RlPgogb3IgCiA8Y29kZT57QGxpbmsgYW5kcm9pZC5jb250ZW50LkNvbnRleHQjYmluZFNlcnZpY2UgQ29udGV4dC5iaW5kU2VydmljZSgpfTwvY29kZT4uCi1Ib3dldmVyLCB7QGNvZGUgb25TdGFydCgpfSBpcyBjYWxsZWQgb25seSBmb3Igc2VydmljZXMgc3RhcnRlZCBieSB7QGNvZGUKK0hvd2V2ZXIsIHtAY29kZSBvblN0YXJ0Q29tbWFuZCgpfSBpcyBjYWxsZWQgb25seSBmb3Igc2VydmljZXMgc3RhcnRlZCBieSB7QGNvZGUKIHN0YXJ0U2VydmljZSgpfS4KIDwvcD4KIApAQCAtMTYyOSw3ICsxNjI5LDcgQEAKIAogPGxpPjxwPkl0IGhhcyBhIHtAbGluayBhbmRyb2lkLmFwcC5TZXJ2aWNlfSBvYmplY3QgdGhhdCdzIGV4ZWN1dGluZwogb25lIG9mIGl0cyBsaWZlY3ljbGUgY2FsbGJhY2tzICg8Y29kZT57QGxpbmsgYW5kcm9pZC5hcHAuU2VydmljZSNvbkNyZWF0ZSAKLW9uQ3JlYXRlKCl9PC9jb2RlPiwgPGNvZGU+e0BsaW5rIGFuZHJvaWQuYXBwLlNlcnZpY2Ujb25TdGFydCBvblN0YXJ0KCl9PC9jb2RlPiwgCitvbkNyZWF0ZSgpfTwvY29kZT4sIDxjb2RlPntAbGluayBhbmRyb2lkLmFwcC5TZXJ2aWNlI29uU3RhcnRDb21tYW5kIG9uU3RhcnRDb21tYW5kKCl9PC9jb2RlPiwKIG9yIDxjb2RlPntAbGluayBhbmRyb2lkLmFwcC5TZXJ2aWNlI29uRGVzdHJveSBvbkRlc3Ryb3koKX08L2NvZGU+KS48L3A+PC9saT4KIAogPGxpPjxwPkl0IGhhcyBhIHtAbGluayBhbmRyb2lkLmNvbnRlbnQuQnJvYWRjYXN0UmVjZWl2ZXJ9IG9iamVjdCB0aGF0J3MgCmRpZmYgLS1naXQgYS9kb2NzL2h0bWwvZ3VpZGUvdG9waWNzL3Jlc291cmNlcy9zdHJpbmctcmVzb3VyY2UuamQgYi9kb2NzL2h0bWwvZ3VpZGUvdG9waWNzL3Jlc291cmNlcy9zdHJpbmctcmVzb3VyY2UuamQKaW5kZXggODFjNWQ1NS4uMmRiMzhmMSAxMDA2NDQKLS0tIGEvZG9jcy9odG1sL2d1aWRlL3RvcGljcy9yZXNvdXJjZXMvc3RyaW5nLXJlc291cmNlLmpkCisrKyBiL2RvY3MvaHRtbC9ndWlkZS90b3BpY3MvcmVzb3VyY2VzL3N0cmluZy1yZXNvdXJjZS5qZApAQCAtMTIsOCArMTIsOCBAQAogICAgIDxkZD5YTUwgcmVzb3VyY2UgdGhhdCBwcm92aWRlcyBhIHNpbmdsZSBzdHJpbmcuPC9kZD4KICAgPGR0PjxhIGhyZWY9IiNTdHJpbmdBcnJheSI+U3RyaW5nIEFycmF5PC9hPjwvZHQ+CiAgICAgPGRkPlhNTCByZXNvdXJjZSB0aGF0IHByb3ZpZGVzIGFuIGFycmF5IG9mIHN0cmluZ3MuPC9kZD4KLSAgPGR0PjxhIGhyZWY9IiNQbHVyYWxzIj5QbHVyYWxzPC9hPjwvZHQ+Ci0gICAgPGRkPlhNTCByZXNvdXJjZSB0aGF0IGNhcnJpZXMgZGlmZmVyZW50IHN0cmluZ3MgZm9yIGRpZmZlcmVudCBwbHVyYWxpemF0aW9ucworICA8ZHQ+PGEgaHJlZj0iI1BsdXJhbHMiPlF1YW50aXR5IFN0cmluZ3MgKFBsdXJhbHMpPC9hPjwvZHQ+CisgICAgPGRkPlhNTCByZXNvdXJjZSB0aGF0IGNhcnJpZXMgZGlmZmVyZW50IHN0cmluZ3MgZm9yIGRpZmZlcmVudCBxdWFudGl0aWVzCiAgICAgb2YgdGhlIHNhbWUgd29yZCBvciBwaHJhc2UuPC9kZD4KIDwvZGw+CiAKQEAgLTIxOCwxMyArMjE4LDMwIEBACiAKIAogCi08aDIgaWQ9IlBsdXJhbHMiPlBsdXJhbHM8L2gyPgorPGgyIGlkPSJQbHVyYWxzIj5RdWFudGl0eSBTdHJpbmdzIChQbHVyYWxzKTwvaDI+CiAKLTxwPkEgcGFpciBvZiBzdHJpbmdzIHRoYXQgZWFjaCBwcm92aWRlIGEgZGlmZmVyZW50IHBsdXJhbCBmb3JtIG9mIHRoZSBzYW1lIHdvcmQgb3IgcGhyYXNlLAotd2hpY2ggeW91IGNhbiBjb2xsZWN0aXZlbHkgcmVmZXJlbmNlIGZyb20gdGhlIGFwcGxpY2F0aW9uLiBXaGVuIHlvdSByZXF1ZXN0IHRoZSBwbHVyYWxzCi1yZXNvdXJjZSB1c2luZyBhIG1ldGhvZCBzdWNoIGFzIHtAbGluayBhbmRyb2lkLmNvbnRlbnQucmVzLlJlc291cmNlcyNnZXRRdWFudGl0eVN0cmluZyhpbnQsaW50KQotZ2V0UXVhbnRpdHlTdHJpbmcoKX0sIHlvdSBtdXN0IHBhc3MgYSAiY291bnQiLCB3aGljaCB3aWxsIGRldGVybWluZSB0aGUgcGx1cmFsIGZvcm0geW91Ci1yZXF1aXJlIGFuZCByZXR1cm4gdGhhdCBzdHJpbmcgdG8geW91LjwvcD4KKzxwPkRpZmZlcmVudCBsYW5ndWFnZXMgaGF2ZSBkaWZmZXJlbnQgcnVsZXMgZm9yIGdyYW1tYXRpY2FsIGFncmVlbWVudCB3aXRoIHF1YW50aXR5LiBJbiBFbmdsaXNoLAorZm9yIGV4YW1wbGUsIHRoZSBxdWFudGl0eSAxIGlzIGEgc3BlY2lhbCBjYXNlLiBXZSB3cml0ZSAiMSBib29rIiwgYnV0IGZvciBhbnkgb3RoZXIgcXVhbnRpdHkgd2UnZAord3JpdGUgIjxpPm48L2k+IGJvb2tzIi4gVGhpcyBkaXN0aW5jdGlvbiBiZXR3ZWVuIHNpbmd1bGFyIGFuZCBwbHVyYWwgaXMgdmVyeSBjb21tb24sIGJ1dCBvdGhlcgorbGFuZ3VhZ2VzIG1ha2UgZmluZXIgZGlzdGluY3Rpb25zLiBUaGUgZnVsbCBzZXQgc3VwcG9ydGVkIGJ5IEFuZHJvaWQgaXMgPGNvZGU+emVybzwvY29kZT4sCis8Y29kZT5vbmU8L2NvZGU+LCA8Y29kZT50d288L2NvZGU+LCA8Y29kZT5mZXc8L2NvZGU+LCA8Y29kZT5tYW55PC9jb2RlPiwgYW5kIDxjb2RlPm90aGVyPC9jb2RlPi4KKworPHA+VGhlIHJ1bGVzIGZvciBkZWNpZGluZyB3aGljaCBjYXNlIHRvIHVzZSBmb3IgYSBnaXZlbiBsYW5ndWFnZSBhbmQgcXVhbnRpdHkgY2FuIGJlIHZlcnkgY29tcGxleCwKK3NvIEFuZHJvaWQgcHJvdmlkZXMgeW91IHdpdGggbWV0aG9kcyBzdWNoIGFzCit7QGxpbmsgYW5kcm9pZC5jb250ZW50LnJlcy5SZXNvdXJjZXMjZ2V0UXVhbnRpdHlTdHJpbmcoaW50LGludCkgZ2V0UXVhbnRpdHlTdHJpbmcoKX0gdG8gc2VsZWN0Cit0aGUgYXBwcm9wcmlhdGUgcmVzb3VyY2UgZm9yIHlvdS4KKworPHA+Tm90ZSB0aGF0IHRoZSBzZWxlY3Rpb24gaXMgbWFkZSBiYXNlZCBvbiBncmFtbWF0aWNhbCBuZWNlc3NpdHkuIEEgc3RyaW5nIGZvciA8Y29kZT56ZXJvPC9jb2RlPgoraW4gRW5nbGlzaCB3aWxsIGJlIGlnbm9yZWQgZXZlbiBpZiB0aGUgcXVhbnRpdHkgaXMgMCwgYmVjYXVzZSAwIGlzbid0IGdyYW1tYXRpY2FsbHkgZGlmZmVyZW50Citmcm9tIDIsIG9yIGFueSBvdGhlciBudW1iZXIgZXhjZXB0IDEgKCJ6ZXJvIGJvb2tzIiwgIm9uZSBib29rIiwgInR3byBib29rcyIsIGV0IGNldGVyYSkuCitEb24ndCBiZSBtaXNsZWQgZWl0aGVyIGJ5IHRoZSBmYWN0IHRoYXQsIHNheSwgPGNvZGU+dHdvPC9jb2RlPiBzb3VuZHMgbGlrZSBpdCBjb3VsZCBvbmx5IGFwcGx5IHRvCit0aGUgcXVhbnRpdHkgMjogYSBsYW5ndWFnZSBtYXkgcmVxdWlyZSB0aGF0IDIsIDEyLCAxMDIgKGV0IGNldGVyYSkgYXJlIGFsbCB0cmVhdGVkIGxpa2Ugb25lCithbm90aGVyIGJ1dCBkaWZmZXJlbnRseSB0byBvdGhlciBxdWFudGl0aWVzLiBSZWx5IG9uIHlvdXIgdHJhbnNsYXRvciB0byBrbm93IHdoYXQgZGlzdGluY3Rpb25zCit0aGVpciBsYW5ndWFnZSBhY3R1YWxseSBpbnNpc3RzIHVwb24uCisKKzxwPkl0J3Mgb2Z0ZW4gcG9zc2libGUgdG8gYXZvaWQgcXVhbnRpdHkgc3RyaW5ncyBieSB1c2luZyBxdWFudGl0eS1uZXV0cmFsIGZvcm11bGF0aW9ucyBzdWNoIGFzCisiQm9va3M6IDEiLiBUaGlzIHdpbGwgbWFrZSB5b3VyIGxpZmUgYW5kIHlvdXIgdHJhbnNsYXRvcnMnIGxpdmVzIGVhc2llciwgaWYgaXQncyBhIHN0eWxlIHRoYXQncworaW4ga2VlcGluZyB3aXRoIHlvdXIgYXBwbGljYXRpb24uCiAKIDxwIGNsYXNzPSJub3RlIj48c3Ryb25nPk5vdGU6PC9zdHJvbmc+IEEgcGx1cmFscyBjb2xsZWN0aW9uIGlzIGEgc2ltcGxlIHJlc291cmNlIHRoYXQgaXMKIHJlZmVyZW5jZWQgdXNpbmcgdGhlIHZhbHVlIHByb3ZpZGVkIGluIHRoZSB7QGNvZGUgbmFtZX0gYXR0cmlidXRlIChub3QgdGhlIG5hbWUgb2YgdGhlIFhNTApAQCAtMjUxLDcgKzI2OCw3IEBACiAgICAgJmx0OzxhIGhyZWY9IiNwbHVyYWxzLWVsZW1lbnQiPnBsdXJhbHM8L2E+CiAgICAgICAgIG5hbWU9IjxlbT5wbHVyYWxfbmFtZTwvZW0+Ij4KICAgICAgICAgJmx0OzxhIGhyZWY9IiNwbHVyYWxzLWl0ZW0tZWxlbWVudCI+aXRlbTwvYT4KLSAgICAgICAgICAgIHF1YW50aXR5PVsib25lIiB8ICJvdGhlciJdCisgICAgICAgICAgICBxdWFudGl0eT1bInplcm8iIHwgIm9uZSIgfCAidHdvIiB8ICJmZXciIHwgIm1hbnkiIHwgIm90aGVyIl0KICAgICAgICAgICAgICZndDs8ZW0+dGV4dF9zdHJpbmc8L2VtPiZsdDsvaXRlbT4KICAgICAmbHQ7L3BsdXJhbHM+CiAmbHQ7L3Jlc291cmNlcz4KQEAgLTI4NSwxNiArMzAyLDI3IEBACiAgICAgICA8cCBjbGFzcz0iY2FwcyI+YXR0cmlidXRlczo8L3A+CiAgICAgICA8ZGwgY2xhc3M9ImF0bi1saXN0Ij4KICAgICAgICAgPGR0Pjxjb2RlPnF1YW50aXR5PC9jb2RlPjwvZHQ+Ci0gICAgICAgIDxkZD48ZW0+S2V5d29yZDwvZW0+LiBBIHZhbHVlIGluZGljYXRpbmcgdGhlIGNhc2UgaW4gd2hpY2ggdGhpcyBzdHJpbmcgc2hvdWxkIGJlIHVzZWQuIFZhbGlkCi12YWx1ZXM6CisgICAgICAgIDxkZD48ZW0+S2V5d29yZDwvZW0+LiBBIHZhbHVlIGluZGljYXRpbmcgd2hlbiB0aGlzIHN0cmluZyBzaG91bGQgYmUgdXNlZC4gVmFsaWQKK3ZhbHVlcywgd2l0aCBub24tZXhoYXVzdGl2ZSBleGFtcGxlcyBpbiBwYXJlbnRoZXNlczoKICAgICAgICAgICA8dGFibGU+CiAgICAgICAgICAgICA8dHI+PHRoPlZhbHVlPC90aD48dGg+RGVzY3JpcHRpb248L3RoPjwvdHI+CiAgICAgICAgICAgICA8dHI+Ci0gICAgICAgICAgICAgIDx0ZD57QGNvZGUgb25lfTwvdGQ+PHRkPldoZW4gdGhlcmUgaXMgb25lIChhIHNpbmd1bGFyIHN0cmluZykuPC90ZD4KKyAgICAgICAgICAgICAgPHRkPntAY29kZSB6ZXJvfTwvdGQ+PHRkPldoZW4gdGhlIGxhbmd1YWdlIHJlcXVpcmVzIHNwZWNpYWwgdHJlYXRtZW50IG9mIHRoZSBudW1iZXIgMCAoYXMgaW4gQXJhYmljKS48L3RkPgogICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgIDx0cj4KLSAgICAgICAgICAgICAgPHRkPntAY29kZSBvdGhlcn08L3RkPjx0ZD5XaGVuIHRoZSBxdWFudGl0eSBpcyBhbnl0aGluZyBvdGhlciB0aGFuIG9uZSAoYSBwbHVyYWwKLXN0cmluZywgYnV0IGFsc28gdXNlZCB3aGVuIHRoZSBjb3VudCBpcyB6ZXJvKS48L3RkPgorICAgICAgICAgICAgICA8dGQ+e0Bjb2RlIG9uZX08L3RkPjx0ZD5XaGVuIHRoZSBsYW5ndWFnZSByZXF1aXJlcyBzcGVjaWFsIHRyZWF0bWVudCBvZiBudW1iZXJzIGxpa2Ugb25lIChhcyB3aXRoIHRoZSBudW1iZXIgMSBpbiBFbmdsaXNoIGFuZCBtb3N0IG90aGVyIGxhbmd1YWdlczsgaW4gUnVzc2lhbiwgYW55IG51bWJlciBlbmRpbmcgaW4gMSBidXQgbm90IGVuZGluZyBpbiAxMSBpcyBpbiB0aGlzIGNsYXNzKS48L3RkPgorICAgICAgICAgICAgPC90cj4KKyAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgPHRkPntAY29kZSB0d299PC90ZD48dGQ+V2hlbiB0aGUgbGFuZ3VhZ2UgcmVxdWlyZXMgc3BlY2lhbCB0cmVhdG1lbnQgb2YgbnVtYmVycyBsaWtlIHR3byAoYXMgaW4gV2Vsc2gpLjwvdGQ+CisgICAgICAgICAgICA8L3RyPgorICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICA8dGQ+e0Bjb2RlIGZld308L3RkPjx0ZD5XaGVuIHRoZSBsYW5ndWFnZSByZXF1aXJlcyBzcGVjaWFsIHRyZWF0bWVudCBvZiAic21hbGwiIG51bWJlcnMgKGFzIHdpdGggMiwgMywgYW5kIDQgaW4gQ3plY2g7IG9yIG51bWJlcnMgZW5kaW5nIDIsIDMsIG9yIDQgYnV0IG5vdCAxMiwgMTMsIG9yIDE0IGluIFBvbGlzaCkuPC90ZD4KKyAgICAgICAgICAgIDwvdHI+CisgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgIDx0ZD57QGNvZGUgbWFueX08L3RkPjx0ZD5XaGVuIHRoZSBsYW5ndWFnZSByZXF1aXJlcyBzcGVjaWFsIHRyZWF0bWVudCBvZiAibGFyZ2UiIG51bWJlcnMgKGFzIHdpdGggbnVtYmVycyBlbmRpbmcgMTEtOTkgaW4gTWFsdGVzZSkuPC90ZD4KKyAgICAgICAgICAgIDwvdHI+CisgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgIDx0ZD57QGNvZGUgb3RoZXJ9PC90ZD48dGQ+V2hlbiB0aGUgbGFuZ3VhZ2UgZG9lcyBub3QgcmVxdWlyZSBzcGVjaWFsIHRyZWF0bWVudCBvZiB0aGUgZ2l2ZW4gcXVhbnRpdHkuPC90ZD4KICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgPC90YWJsZT4KICAgICAgICAgPC9kZD4KQEAgLTMxNSw2ICszNDMsMTcgQEAKICAgICAmbHQ7L3BsdXJhbHM+CiAmbHQ7L3Jlc291cmNlcz4KIDwvcHJlPgorICAgIDxwPlhNTCBmaWxlIHNhdmVkIGF0IHtAY29kZSByZXMvdmFsdWVzLXBsL3N0cmluZ3MueG1sfTo8L3A+Cis8cHJlPgorJmx0Oz94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKyZsdDtyZXNvdXJjZXM+CisgICAgJmx0O3BsdXJhbHMgbmFtZT0ibnVtYmVyT2ZTb25nc0F2YWlsYWJsZSI+CisgICAgICAgICZsdDtpdGVtIHF1YW50aXR5PSJvbmUiPlpuYWxlemlvbm8gamVkbiYjeDAxMDU7IHBpb3NlbmsmI3gwMTE5Oy4mbHQ7L2l0ZW0+CisgICAgICAgICZsdDtpdGVtIHF1YW50aXR5PSJmZXciPlpuYWxlemlvbm8gJWQgcGlvc2Vua2kuJmx0Oy9pdGVtPgorICAgICAgICAmbHQ7aXRlbSBxdWFudGl0eT0ib3RoZXIiPlpuYWxlemlvbm8gJWQgcGlvc2VuZWsuJmx0Oy9pdGVtPgorICAgICZsdDsvcGx1cmFscz4KKyZsdDsvcmVzb3VyY2VzPgorPC9wcmU+CiAgICAgPHA+SmF2YSBjb2RlOjwvcD4KIDxwcmU+CiBpbnQgY291bnQgPSBnZXROdW1iZXJPZnNvbmdzQXZhaWxhYmxlKCk7CmRpZmYgLS1naXQgYS9kb2NzL2h0bWwvZ3VpZGUvdG9waWNzL3Rlc3RpbmcvYWN0aXZpdHlfdGVzdGluZy5qZCBiL2RvY3MvaHRtbC9ndWlkZS90b3BpY3MvdGVzdGluZy9hY3Rpdml0eV90ZXN0aW5nLmpkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYzOTJhZDcKLS0tIC9kZXYvbnVsbAorKysgYi9kb2NzL2h0bWwvZ3VpZGUvdG9waWNzL3Rlc3RpbmcvYWN0aXZpdHlfdGVzdGluZy5qZApAQCAtMCwwICsxLDM5MiBAQAorcGFnZS50aXRsZT1BY3Rpdml0eSBUZXN0aW5nCitAamQ6Ym9keQorCis8ZGl2IGlkPSJxdi13cmFwcGVyIj4KKyAgPGRpdiBpZD0icXYiPgorICA8aDI+SW4gdGhpcyBkb2N1bWVudDwvaDI+CisgIDxvbD4KKyAgICA8bGk+CisgICAgICA8YSBocmVmPSIjQWN0aXZpdHlUZXN0QVBJIj5UaGUgQWN0aXZpdHkgVGVzdGluZyBBUEk8L2E+CisgICAgICA8b2w+CisgICAgICAgIDxsaT4KKyAgICAgICAgICAgIDxhIGhyZWY9IiNBY3Rpdml0eUluc3RydW1lbnRhdGlvblRlc3RDYXNlMiI+QWN0aXZpdHlJbnN0cnVtZW50YXRpb25UZXN0Q2FzZTI8L2E+CisgICAgICAgIDwvbGk+CisgICAgICAgIDxsaT4KKyAgICAgICAgICAgIDxhIGhyZWY9IiNBY3Rpdml0eVVuaXRUZXN0Q2FzZSI+QWN0aXZpdHlVbml0VGVzdENhc2U8L2E+CisgICAgICAgIDwvbGk+CisgICAgICAgIDxsaT4KKyAgICAgICAgICAgIDxhIGhyZWY9IiNTaW5nbGVMYXVuY2hBY3Rpdml0eVRlc3RDYXNlIj5TaW5nbGVMYXVuY2hBY3Rpdml0eVRlc3RDYXNlPC9hPgorICAgICAgICA8L2xpPgorICAgICAgICA8bGk+CisgICAgICAgICAgICA8YSBocmVmPSIjTW9ja09iamVjdE5vdGVzIj5Nb2NrIG9iamVjdHMgYW5kIGFjdGl2aXR5IHRlc3Rpbmc8L2E+CisgICAgICAgIDwvbGk+CisgICAgICAgIDxsaT4KKyAgICAgICAgICAgIDxhIGhyZWY9IiNBc3NlcnRpb25Ob3RlcyI+QXNzZXJ0aW9ucyBmb3IgYWN0aXZpdHkgdGVzdGluZzwvYT4KKyAgICAgICAgPC9saT4KKyAgICAgIDwvb2w+CisgICAgPC9saT4KKyAgICA8bGk+CisgICAgICAgIDxhIGhyZWY9IiNXaGF0VG9UZXN0Ij5XaGF0IHRvIFRlc3Q8L2E+CisgICAgPC9saT4KKyAgICA8bGk+CisgICAgICAgIDxhIGhyZWY9IiNOZXh0U3RlcHMiPk5leHQgU3RlcHM8L2E+CisgICAgPC9saT4KKyAgICA8bGk+CisgICAgICA8YSBocmVmPSIjVUlUZXN0aW5nIj5BcHBlbmRpeDogVUkgVGVzdGluZyBOb3RlczwvYT4KKyAgICAgIDxvbD4KKyAgICAgICAgPGxpPgorICAgICAgICAgIDxhIGhyZWY9IiNSdW5PblVJVGhyZWFkIj5UZXN0aW5nIG9uIHRoZSBVSSB0aHJlYWQ8L2E+CisgICAgICAgIDwvbGk+CisgICAgICAgIDxsaT4KKyAgICAgICAgICA8YSBocmVmPSIjTm90b3VjaE1vZGUiPlR1cm5pbmcgb2ZmIHRvdWNoIG1vZGU8L2E+CisgICAgICAgIDwvbGk+CisgICAgICAgIDxsaT4KKyAgICAgICAgICA8YSBocmVmPSIjVW5sb2NrRGV2aWNlIj5VbmxvY2tpbmcgdGhlIEVtdWxhdG9yIG9yIERldmljZTwvYT4KKyAgICAgICAgPC9saT4KKyAgICAgICAgPGxpPgorICAgICAgICAgIDxhIGhyZWY9IiNVSVRlc3RUcm91Ymxlc2hvb3RpbmciPlRyb3VibGVzaG9vdGluZyBVSSB0ZXN0czwvYT4KKyAgICAgICAgPC9saT4KKyAgICAgIDwvb2w+CisgICAgPC9saT4KKyAgICA8L29sPgorPGgyPktleSBDbGFzc2VzPC9oMj4KKyAgICA8b2w+CisgICAgICA8bGk+e0BsaW5rIGFuZHJvaWQudGVzdC5JbnN0cnVtZW50YXRpb25UZXN0UnVubmVyfTwvbGk+CisgICAgICA8bGk+e0BsaW5rIGFuZHJvaWQudGVzdC5BY3Rpdml0eUluc3RydW1lbnRhdGlvblRlc3RDYXNlMn08L2xpPgorICAgICAgPGxpPntAbGluayBhbmRyb2lkLnRlc3QuQWN0aXZpdHlVbml0VGVzdENhc2V9PC9saT4KKyAgICA8L29sPgorPGgyPlJlbGF0ZWQgVHV0b3JpYWxzPC9oMj4KKyAgICA8b2w+CisgICAgICA8bGk+CisgICAgICAgIDxhIGhyZWY9IntAZG9jUm9vdH1yZXNvdXJjZXMvdHV0b3JpYWxzL3Rlc3RpbmcvaGVsbG9hbmRyb2lkX3Rlc3QuaHRtbCI+CisgICAgICAgIEhlbGxvLCBUZXN0aW5nPC9hPgorICAgICAgPC9saT4KKyAgICAgIDxsaT4KKyAgICAgICAgIDxhIGhyZWY9IntAZG9jUm9vdH1yZXNvdXJjZXMvdHV0b3JpYWxzL3Rlc3RpbmcvYWN0aXZpdHlfdGVzdC5odG1sIj5BY3Rpdml0eSBUZXN0aW5nPC9hPgorICAgICAgPC9saT4KKyAgICA8L29sPgorPGgyPlNlZSBBbHNvPC9oMj4KKyAgICAgIDxvbD4KKyAgICAgICAgPGxpPgorICAgICAgICAgIDxhIGhyZWY9IntAZG9jUm9vdH1ndWlkZS9kZXZlbG9waW5nL3Rlc3RpbmcvdGVzdGluZ19lY2xpcHNlLmh0bWwiPgorICAgICAgICAgIFRlc3RpbmcgaW4gRWNsaXBzZSwgd2l0aCBBRFQ8L2E+CisgICAgICAgIDwvbGk+CisgICAgICAgIDxsaT4KKyAgICAgICAgICA8YSBocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvZGV2ZWxvcGluZy90ZXN0aW5nL3Rlc3Rpbmdfb3RoZXJpZGUuaHRtbCI+CisgICAgICAgICAgVGVzdGluZyBpbiBPdGhlciBJREVzPC9hPgorICAgICAgICA8L2xpPgorICAgICAgPC9vbD4KKyAgPC9kaXY+Cis8L2Rpdj4KKzxwPgorICAgIEFjdGl2aXR5IHRlc3RpbmcgaXMgcGFydGljdWxhcmx5IGRlcGVuZGVudCBvbiB0aGUgdGhlIEFuZHJvaWQgaW5zdHJ1bWVudGF0aW9uIGZyYW1ld29yay4KKyAgICBVbmxpa2Ugb3RoZXIgY29tcG9uZW50cywgYWN0aXZpdGllcyBoYXZlIGEgY29tcGxleCBsaWZlY3ljbGUgYmFzZWQgb24gY2FsbGJhY2sgbWV0aG9kczsgdGhlc2UKKyAgICBjYW4ndCBiZSBpbnZva2VkIGRpcmVjdGx5IGV4Y2VwdCBieSBpbnN0cnVtZW50YXRpb24uIEFsc28sIHRoZSBvbmx5IHdheSB0byBzZW5kIGV2ZW50cyB0byB0aGUKKyAgICB1c2VyIGludGVyZmFjZSBmcm9tIGEgcHJvZ3JhbSBpcyB0aHJvdWdoIGluc3RydW1lbnRhdGlvbi4KKzwvcD4KKzxwPgorICAgIFRoaXMgZG9jdW1lbnQgZGVzY3JpYmVzIGhvdyB0byB0ZXN0IGFjdGl2aXRpZXMgdXNpbmcgaW5zdHJ1bWVudGF0aW9uIGFuZCBvdGhlciB0ZXN0CisgICAgZmFjaWxpdGllcy4gVGhlIGRvY3VtZW50IGFzc3VtZXMgeW91IGhhdmUgYWxyZWFkeSByZWFkCisgICAgPGEgaHJlZj0ie0Bkb2NSb290fWd1aWRlL3RvcGljcy90ZXN0aW5nL3Rlc3RpbmdfYW5kcm9pZC5odG1sIj5UZXN0aW5nIEZ1bmRhbWVudGFsczwvYT4sCisgICAgdGhlIGludHJvZHVjdGlvbiB0byB0aGUgQW5kcm9pZCB0ZXN0aW5nIGFuZCBpbnN0cnVtZW50YXRpb24gZnJhbWV3b3JrLgorPC9wPgorPGgyIGlkPSJBY3Rpdml0eVRlc3RBUEkiPlRoZSBBY3Rpdml0eSBUZXN0aW5nIEFQSTwvaDI+Cis8cD4KKyAgICBUaGUgYWN0aXZpdHkgdGVzdGluZyBBUEkgYmFzZSBjbGFzcyBpcyB7QGxpbmsgYW5kcm9pZC50ZXN0Lkluc3RydW1lbnRhdGlvblRlc3RDYXNlfSwKKyAgICB3aGljaCBwcm92aWRlcyBpbnN0cnVtZW50YXRpb24gdG8gdGhlIHRlc3QgY2FzZSBzdWJjbGFzc2VzIHlvdSB1c2UgZm9yIEFjdGl2aXRpZXMuCis8L3A+Cis8cD4KKyAgICBGb3IgYWN0aXZpdHkgdGVzdGluZywgdGhpcyBiYXNlIGNsYXNzIHByb3ZpZGVzIHRoZXNlIGZ1bmN0aW9uczoKKzwvcD4KKzx1bD4KKyAgICA8bGk+CisgICAgICAgIExpZmVjeWNsZSBjb250cm9sOiBXaXRoIGluc3RydW1lbnRhdGlvbiwgeW91IGNhbiBzdGFydCB0aGUgYWN0aXZpdHkgdW5kZXIgdGVzdCwgcGF1c2UgaXQsCisgICAgICAgIGFuZCBkZXN0cm95IGl0LCB1c2luZyBtZXRob2RzIHByb3ZpZGVkIGJ5IHRoZSB0ZXN0IGNhc2UgY2xhc3Nlcy4KKyAgICA8L2xpPgorICAgIDxsaT4KKyAgICAgICAgRGVwZW5kZW5jeSBpbmplY3Rpb246IEluc3RydW1lbnRhdGlvbiBhbGxvd3MgeW91IHRvIGNyZWF0ZSBtb2NrIHN5c3RlbSBvYmplY3RzIHN1Y2ggYXMKKyAgICAgICAgQ29udGV4dHMgb3IgQXBwbGljYXRpb25zIGFuZCB1c2UgdGhlbSB0byBydW4gdGhlIGFjdGl2aXR5IHVuZGVyIHRlc3QuIFRoaXMKKyAgICAgICAgaGVscHMgeW91IGNvbnRyb2wgdGhlIHRlc3QgZW52aXJvbm1lbnQgYW5kIGlzb2xhdGUgaXQgZnJvbSBwcm9kdWN0aW9uIHN5c3RlbXMuIFlvdSBjYW4KKyAgICAgICAgYWxzbyBzZXQgdXAgY3VzdG9taXplZCBJbnRlbnRzIGFuZCBzdGFydCBhbiBhY3Rpdml0eSB3aXRoIHRoZW0uCisgICAgPC9saT4KKyAgICA8bGk+CisgICAgICAgIFVzZXIgaW50ZXJmYWNlIGludGVyYWN0aW9uOiBZb3UgdXNlIGluc3RydW1lbnRhdGlvbiB0byBzZW5kIGtleXN0cm9rZXMgb3IgdG91Y2ggZXZlbnRzCisgICAgICAgIGRpcmVjdGx5IHRvIHRoZSBVSSBvZiB0aGUgYWN0aXZpdHkgdW5kZXIgdGVzdC4KKyAgICA8L2xpPgorPC91bD4KKzxwPgorICAgIFRoZSBhY3Rpdml0eSB0ZXN0aW5nIGNsYXNzZXMgYWxzbyBwcm92aWRlIHRoZSBKVW5pdCBmcmFtZXdvcmsgYnkgZXh0ZW5kaW5nCisgICAge0BsaW5rIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZX0gYW5kIHtAbGluayBqdW5pdC5mcmFtZXdvcmsuQXNzZXJ0fS4KKzwvcD4KKzxwPgorICAgIFRoZSB0d28gbWFpbiB0ZXN0aW5nIHN1YmNsYXNzZXMgYXJlIHtAbGluayBhbmRyb2lkLnRlc3QuQWN0aXZpdHlJbnN0cnVtZW50YXRpb25UZXN0Q2FzZTJ9IGFuZAorICAgIHtAbGluayBhbmRyb2lkLnRlc3QuQWN0aXZpdHlVbml0VGVzdENhc2V9LiBUbyB0ZXN0IGFuIEFjdGl2aXR5IHRoYXQgaXMgbGF1bmNoZWQgaW4gYSBtb2RlCisgICAgb3RoZXIgdGhhbiA8Y29kZT5zdGFuZGFyZDwvY29kZT4sIHlvdSB1c2Uge0BsaW5rIGFuZHJvaWQudGVzdC5TaW5nbGVMYXVuY2hBY3Rpdml0eVRlc3RDYXNlfS4KKzwvcD4KKzxoMyBpZD0iQWN0aXZpdHlJbnN0cnVtZW50YXRpb25UZXN0Q2FzZTIiPkFjdGl2aXR5SW5zdHJ1bWVudGF0aW9uVGVzdENhc2UyPC9oMz4KKzxwPgorICAgIFRoZSB7QGxpbmsgYW5kcm9pZC50ZXN0LkFjdGl2aXR5SW5zdHJ1bWVudGF0aW9uVGVzdENhc2UyfSB0ZXN0IGNhc2UgY2xhc3MgaXMgZGVzaWduZWQgdG8gZG8KKyAgICBmdW5jdGlvbmFsIHRlc3Rpbmcgb2Ygb25lIG9yIG1vcmUgQWN0aXZpdGllcyBpbiBhbiBhcHBsaWNhdGlvbiwgdXNpbmcgYSBub3JtYWwgc3lzdGVtCisgICAgaW5mcmFzdHJ1Y3R1cmUuIEl0IHJ1bnMgdGhlIEFjdGl2aXRpZXMgaW4gYSBub3JtYWwgaW5zdGFuY2Ugb2YgdGhlIGFwcGxpY2F0aW9uIHVuZGVyIHRlc3QsCisgICAgdXNpbmcgYSBzdGFuZGFyZCBzeXN0ZW0gQ29udGV4dC4gSXQgYWxsb3dzIHlvdSB0byBzZW5kIG1vY2sgSW50ZW50cyB0byB0aGUgYWN0aXZpdHkgdW5kZXIKKyAgICB0ZXN0LCBzbyB5b3UgY2FuIHVzZSBpdCB0byB0ZXN0IGFuIGFjdGl2aXR5IHRoYXQgcmVzcG9uZHMgdG8gbXVsdGlwbGUgdHlwZXMgb2YgaW50ZW50cywgb3IKKyAgICBhbiBhY3Rpdml0eSB0aGF0IGV4cGVjdHMgYSBjZXJ0YWluIHR5cGUgb2YgZGF0YSBpbiB0aGUgaW50ZW50LCBvciBib3RoLiBOb3RpY2UsIHRob3VnaCwgdGhhdCBpdAorICAgIGRvZXMgbm90IGFsbG93IG1vY2sgQ29udGV4dHMgb3IgQXBwbGljYXRpb25zLCBzbyB5b3UgY2FuIG5vdCBpc29sYXRlIHRoZSB0ZXN0IGZyb20gdGhlIHJlc3Qgb2YKKyAgICBhIHByb2R1Y3Rpb24gc3lzdGVtLgorPC9wPgorPGgzIGlkPSJBY3Rpdml0eVVuaXRUZXN0Q2FzZSI+QWN0aXZpdHlVbml0VGVzdENhc2U8L2gzPgorPHA+CisgICAgVGhlIHtAbGluayBhbmRyb2lkLnRlc3QuQWN0aXZpdHlVbml0VGVzdENhc2V9IHRlc3QgY2FzZSBjbGFzcyB0ZXN0cyBhIHNpbmdsZSBhY3Rpdml0eSBpbgorICAgIGlzb2xhdGlvbi4gQmVmb3JlIHlvdSBzdGFydCB0aGUgYWN0aXZpdHksIHlvdSBjYW4gaW5qZWN0IGEgbW9jayBDb250ZXh0IG9yIEFwcGxpY2F0aW9uLCBvciBib3RoLgorICAgIFlvdSB1c2UgaXQgdG8gcnVuIGFjdGl2aXR5IHRlc3RzIGluIGlzb2xhdGlvbiwgYW5kIHRvIGRvIHVuaXQgdGVzdGluZyBvZiBtZXRob2RzCisgICAgdGhhdCBkbyBub3QgaW50ZXJhY3Qgd2l0aCBBbmRyb2lkLiBZb3UgY2FuIG5vdCBzZW5kIG1vY2sgSW50ZW50cyB0byB0aGUgYWN0aXZpdHkgdW5kZXIgdGVzdCwKKyAgICBhbHRob3VnaCB5b3UgY2FuIGNhbGwKKyAgICB7QGxpbmsgYW5kcm9pZC5hcHAuQWN0aXZpdHkjc3RhcnRBY3Rpdml0eShJbnRlbnQpIEFjdGl2aXR5LnN0YXJ0QWN0aXZpdHkoSW50ZW50KX0gYW5kIHRoZW4KKyAgICBsb29rIGF0IGFyZ3VtZW50cyB0aGF0IHdlcmUgcmVjZWl2ZWQuCis8L3A+Cis8aDMgaWQ9IlNpbmdsZUxhdW5jaEFjdGl2aXR5VGVzdENhc2UiPlNpbmdsZUxhdW5jaEFjdGl2aXR5VGVzdENhc2U8L2gzPgorPHA+CisgICAgVGhlIHtAbGluayBhbmRyb2lkLnRlc3QuU2luZ2xlTGF1bmNoQWN0aXZpdHlUZXN0Q2FzZX0gY2xhc3MgaXMgYSBjb252ZW5pZW5jZSBjbGFzcyBmb3IKKyAgICB0ZXN0aW5nIGEgc2luZ2xlIGFjdGl2aXR5IGluIGFuIGVudmlyb25tZW50IHRoYXQgZG9lc24ndCBjaGFuZ2UgZnJvbSB0ZXN0IHRvIHRlc3QuCisgICAgSXQgaW52b2tlcyB7QGxpbmsganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlI3NldFVwKCkgc2V0VXAoKX0gYW5kCisgICAge0BsaW5rIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSN0ZWFyRG93bigpIHRlYXJEb3duKCl9IG9ubHkgb25jZSwgaW5zdGVhZCBvZiBvbmNlIHBlcgorICAgIG1ldGhvZCBjYWxsLiBJdCBkb2VzIG5vdCBhbGxvdyB5b3UgdG8gaW5qZWN0IGFueSBtb2NrIG9iamVjdHMuCis8L3A+Cis8cD4KKyAgICBUaGlzIHRlc3QgY2FzZSBpcyB1c2VmdWwgZm9yIHRlc3RpbmcgYW4gYWN0aXZpdHkgdGhhdCBydW5zIGluIGEgbW9kZSBvdGhlciB0aGFuCisgICAgPGNvZGU+c3RhbmRhcmQ8L2NvZGU+LiBJdCBlbnN1cmVzIHRoYXQgdGhlIHRlc3QgZml4dHVyZSBpcyBub3QgcmVzZXQgYmV0d2VlbiB0ZXN0cy4gWW91CisgICAgY2FuIHRoZW4gdGVzdCB0aGF0IHRoZSBhY3Rpdml0eSBoYW5kbGVzIG11bHRpcGxlIGNhbGxzIGNvcnJlY3RseS4KKzwvcD4KKzxoMyBpZD0iTW9ja09iamVjdE5vdGVzIj5Nb2NrIG9iamVjdHMgYW5kIGFjdGl2aXR5IHRlc3Rpbmc8L2gzPgorPHA+CisgICAgVGhpcyBzZWN0aW9uIGNvbnRhaW5zIG5vdGVzIGFib3V0IHRoZSB1c2Ugb2YgdGhlIG1vY2sgb2JqZWN0cyBkZWZpbmVkIGluCisgICAge0BsaW5rIGFuZHJvaWQudGVzdC5tb2NrfSB3aXRoIGFjdGl2aXR5IHRlc3RzLgorPC9wPgorPHA+CisgICAgVGhlIG1vY2sgb2JqZWN0IHtAbGluayBhbmRyb2lkLnRlc3QubW9jay5Nb2NrQXBwbGljYXRpb259IGlzIG9ubHkgYXZhaWxhYmxlIGZvciBhY3Rpdml0eQorICAgIHRlc3RpbmcgaWYgeW91IHVzZSB0aGUge0BsaW5rIGFuZHJvaWQudGVzdC5BY3Rpdml0eVVuaXRUZXN0Q2FzZX0gdGVzdCBjYXNlIGNsYXNzLgorICAgIEJ5IGRlZmF1bHQsIDxjb2RlPkFjdGl2aXR5VW5pdFRlc3RDYXNlPC9jb2RlPiwgY3JlYXRlcyBhIGhpZGRlbiA8Y29kZT5Nb2NrQXBwbGljYXRpb248L2NvZGU+CisgICAgb2JqZWN0IHRoYXQgaXMgdXNlZCBhcyB0aGUgYXBwbGljYXRpb24gdW5kZXIgdGVzdC4gWW91IGNhbiBpbmplY3QgeW91ciBvd24gb2JqZWN0IHVzaW5nCisgICAge0BsaW5rIGFuZHJvaWQudGVzdC5BY3Rpdml0eVVuaXRUZXN0Q2FzZSNzZXRBcHBsaWNhdGlvbihBcHBsaWNhdGlvbikgc2V0QXBwbGljYXRpb24oKX0uCis8L3A+Cis8aDMgaWQ9IkFzc2VydGlvbk5vdGVzIj5Bc3NlcnRpb25zIGZvciBhY3Rpdml0eSB0ZXN0aW5nPC9oMz4KKzxwPgorICAgIHtAbGluayBhbmRyb2lkLnRlc3QuVmlld0Fzc2VydHN9IGRlZmluZXMgYXNzZXJ0aW9ucyBmb3IgVmlld3MuIFlvdSB1c2UgaXQgdG8gdmVyaWZ5IHRoZQorICAgIGFsaWdubWVudCBhbmQgcG9zaXRpb24gb2YgVmlldyBvYmplY3RzLCBhbmQgdG8gbG9vayBhdCB0aGUgc3RhdGUgb2YgVmlld0dyb3VwIG9iamVjdHMuCis8L3A+Cis8aDIgaWQ9IldoYXRUb1Rlc3QiPldoYXQgVG8gVGVzdDwvaDI+Cis8dWw+CisgICAgPGxpPgorICAgICAgICBJbnB1dCB2YWxpZGF0aW9uOiBUZXN0IHRoYXQgYW4gYWN0aXZpdHkgcmVzcG9uZHMgY29ycmVjdGx5IHRvIGlucHV0IHZhbHVlcyBpbiBhbgorICAgICAgICBFZGl0VGV4dCBWaWV3LiBTZXQgdXAgYSBrZXlzdHJva2Ugc2VxdWVuY2UsIHNlbmQgaXQgdG8gdGhlIGFjdGl2aXR5LCBhbmQgdGhlbgorICAgICAgICB1c2Uge0BsaW5rIGFuZHJvaWQudmlldy5WaWV3I2ZpbmRWaWV3QnlJZChpbnQpfSB0byBleGFtaW5lIHRoZSBzdGF0ZSBvZiB0aGUgVmlldy4gWW91IGNhbgorICAgICAgICB2ZXJpZnkgdGhhdCBhIHZhbGlkIGtleXN0cm9rZSBzZXF1ZW5jZSBlbmFibGVzIGFuIE9LIGJ1dHRvbiwgd2hpbGUgYW4gaW52YWxpZCBvbmUgbGVhdmVzIHRoZQorICAgICAgICBidXR0b24gZGlzYWJsZWQuIFlvdSBjYW4gYWxzbyB2ZXJpZnkgdGhhdCB0aGUgQWN0aXZpdHkgcmVzcG9uZHMgdG8gaW52YWxpZCBpbnB1dCBieQorICAgICAgICBzZXR0aW5nIGVycm9yIG1lc3NhZ2VzIGluIHRoZSBWaWV3LgorICAgIDwvbGk+CisgICAgPGxpPgorICAgICAgICBMaWZlY3ljbGUgZXZlbnRzOiBUZXN0IHRoYXQgZWFjaCBvZiB5b3VyIGFwcGxpY2F0aW9uJ3MgYWN0aXZpdGllcyBoYW5kbGVzIGxpZmVjeWNsZSBldmVudHMKKyAgICAgICAgY29ycmVjdGx5LiBJbiBnZW5lcmFsLCBsaWZlY3ljbGUgZXZlbnRzIGFyZSBhY3Rpb25zLCBlaXRoZXIgZnJvbSB0aGUgc3lzdGVtIG9yIGZyb20gdGhlCisgICAgICAgIHVzZXIsIHRoYXQgdHJpZ2dlciBhIGNhbGxiYWNrIG1ldGhvZCBzdWNoIGFzIDxjb2RlPm9uQ3JlYXRlKCk8L2NvZGU+IG9yCisgICAgICAgIDxjb2RlPm9uQ2xpY2soKTwvY29kZT4uIEZvciBleGFtcGxlLCBhbiBhY3Rpdml0eSBzaG91bGQgcmVzcG9uZCB0byBwYXVzZSBvciBkZXN0cm95IGV2ZW50cworICAgICAgICBieSBzYXZpbmcgaXRzIHN0YXRlLiBSZW1lbWJlciB0aGF0IGV2ZW4gYSBjaGFuZ2UgaW4gc2NyZWVuIG9yaWVudGF0aW9uIGNhdXNlcyB0aGUgY3VycmVudAorICAgICAgICBhY3Rpdml0eSB0byBiZSBkZXN0cm95ZWQsIHNvIHlvdSBzaG91bGQgdGVzdCB0aGF0IGFjY2lkZW50YWwgZGV2aWNlIG1vdmVtZW50cyBkb24ndAorICAgICAgICBhY2NpZGVudGFsbHkgbG9zZSB0aGUgYXBwbGljYXRpb24gc3RhdGUuCisgICAgPC9saT4KKyAgICA8bGk+CisgICAgICAgIEludGVudHM6IFRlc3QgdGhhdCBlYWNoIGFjdGl2aXR5IGNvcnJlY3RseSBoYW5kbGVzIHRoZSBpbnRlbnRzIGxpc3RlZCBpbiB0aGUgaW50ZW50CisgICAgICAgIGZpbHRlciBzcGVjaWZpZWQgaW4gaXRzIG1hbmlmZXN0LiBZb3UgY2FuIHVzZQorICAgICAgICB7QGxpbmsgYW5kcm9pZC50ZXN0LkFjdGl2aXR5SW5zdHJ1bWVudGF0aW9uVGVzdENhc2UyfSB0byBzZW5kIG1vY2sgSW50ZW50cyB0byB0aGUKKyAgICAgICAgYWN0aXZpdHkgdW5kZXIgdGVzdC4KKyAgICA8L2xpPgorICAgIDxsaT4KKyAgICAgICAgUnVudGltZSBjb25maWd1cmF0aW9uIGNoYW5nZXM6IFRlc3QgdGhhdCBlYWNoIGFjdGl2aXR5IHJlc3BvbmRzIGNvcnJlY3RseSB0byB0aGUKKyAgICAgICAgcG9zc2libGUgY2hhbmdlcyBpbiB0aGUgZGV2aWNlJ3MgY29uZmlndXJhdGlvbiB3aGlsZSB5b3VyIGFwcGxpY2F0aW9uIGlzIHJ1bm5pbmcuIFRoZXNlCisgICAgICAgIGluY2x1ZGUgYSBjaGFuZ2UgdG8gdGhlIGRldmljZSdzIG9yaWVudGF0aW9uLCBhIGNoYW5nZSB0byB0aGUgY3VycmVudCBsYW5ndWFnZSwgYW5kIHNvCisgICAgICAgIGZvcnRoLiBIYW5kbGluZyB0aGVzZSBjaGFuZ2VzIGlzIGRlc2NyaWJlZCBpbiBkZXRhaWwgaW4gdGhlIHRvcGljCisgICAgICAgIDxhIGhyZWY9IntAZG9jUm9vdH1ndWlkZS90b3BpY3MvcmVzb3VyY2VzL3J1bnRpbWUtY2hhbmdlcy5odG1sIj5IYW5kbGluZyBSdW50aW1lCisgICAgICAgIENoYW5nZXM8L2E+LgorICAgIDwvbGk+CisgICAgPGxpPgorICAgICAgICBTY3JlZW4gc2l6ZXMgYW5kIHJlc29sdXRpb25zOiBCZWZvcmUgeW91IHB1Ymxpc2ggeW91ciBhcHBsaWNhdGlvbiwgbWFrZSBzdXJlIHRvIHRlc3QgaXQgb24KKyAgICAgICAgYWxsIG9mIHRoZSBzY3JlZW4gc2l6ZXMgYW5kIGRlbnNpdGllcyBvbiB3aGljaCB5b3Ugd2FudCBpdCB0byBydW4uIFlvdSBjYW4gdGVzdCB0aGUKKyAgICAgICAgYXBwbGljYXRpb24gb24gbXVsdGlwbGUgc2l6ZXMgYW5kIGRlbnNpdGllcyB1c2luZyBBVkRzLCBvciB5b3UgY2FuIHRlc3QgeW91ciBhcHBsaWNhdGlvbgorICAgICAgICBkaXJlY3RseSBvbiB0aGUgZGV2aWNlcyB0aGF0IHlvdSBhcmUgdGFyZ2V0aW5nLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIHRoZSB0b3BpYworICAgICAgICA8YSBocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvcHJhY3RpY2VzL3NjcmVlbnNfc3VwcG9ydC5odG1sIj5TdXBwb3J0aW5nIE11bHRpcGxlIFNjcmVlbnM8L2E+LgorICAgIDwvbGk+Cis8L3VsPgorPGgyIGlkPSJOZXh0U3RlcHMiPk5leHQgU3RlcHM8L2gyPgorPHA+CisgICAgVG8gbGVhcm4gaG93IHRvIHNldCB1cCBhbmQgcnVuIHRlc3RzIGluIEVjbGlwc2UsIHBsZWFzZSByZWZlciB0byA8YQorICAgIGhyZWY9IntAZG9jUm9vdH1ndWlkZS9kZXZlbG9waW5nL3Rlc3RpbmcvdGVzdGluZ19lY2xpcHNlLmh0bWwiPlRlc3RpbmcgaW4KKyAgICBFY2xpcHNlLCB3aXRoIEFEVDwvYT4uIElmIHlvdSdyZSBub3Qgd29ya2luZyBpbiBFY2xpcHNlLCByZWZlciB0byA8YQorICAgIGhyZWY9IntAZG9jUm9vdH1ndWlkZS9kZXZlbG9waW5nL3Rlc3RpbmcvdGVzdGluZ19vdGhlcmlkZS5odG1sIj5UZXN0aW5nIGluIE90aGVyCisgICAgSURFczwvYT4uCis8L3A+Cis8cD4KKyAgICBJZiB5b3Ugd2FudCBhIHN0ZXAtYnktc3RlcCBpbnRyb2R1Y3Rpb24gdG8gdGVzdGluZyBhY3Rpdml0aWVzLCB0cnkgb25lIG9mIHRoZQorICAgIHRlc3RpbmcgdHV0b3JpYWxzOgorPC9wPgorPHVsPgorICAgIDxsaT4KKyAgICAgICAgVGhlIDxhCisgICAgICAgIGhyZWY9IntAZG9jUm9vdH1yZXNvdXJjZXMvdHV0b3JpYWxzL3Rlc3RpbmcvaGVsbG9hbmRyb2lkX3Rlc3QuaHRtbCI+SGVsbG8sCisgICAgICAgIFRlc3Rpbmc8L2E+IHR1dG9yaWFsIGludHJvZHVjZXMgYmFzaWMgdGVzdGluZyBjb25jZXB0cyBhbmQgcHJvY2VkdXJlcyBpbiB0aGUKKyAgICAgICAgY29udGV4dCBvZiB0aGUgSGVsbG8sIFdvcmxkIGFwcGxpY2F0aW9uLgorICAgIDwvbGk+CisgICAgPGxpPgorICAgICAgICBUaGUgPGEKKyAgICAgICAgaHJlZj0ie0Bkb2NSb290fXJlc291cmNlcy90dXRvcmlhbHMvdGVzdGluZy9hY3Rpdml0eV90ZXN0Lmh0bWwiPkFjdGl2aXR5CisgICAgICAgIFRlc3Rpbmc8L2E+IHR1dG9yaWFsIGlzIGFuIGV4Y2VsbGVudCBmb2xsb3ctdXAgdG8gdGhlIEhlbGxvLCBUZXN0aW5nIHR1dG9yaWFsLgorICAgICAgICBJdCBndWlkZXMgeW91IHRocm91Z2ggYSBtb3JlIGNvbXBsZXggdGVzdGluZyBzY2VuYXJpbyB0aGF0IHlvdSBkZXZlbG9wIGFnYWluc3QgYQorICAgICAgICBtb3JlIHJlYWxpc3RpYyBhY3Rpdml0eS1vcmllbnRlZCBhcHBsaWNhdGlvbi4KKyAgICA8L2xpPgorPC91bD4KKzxoMiBpZD0iVUlUZXN0aW5nIj5BcHBlbmRpeDogVUkgVGVzdGluZyBOb3RlczwvaDI+Cis8cD4KKyAgICBUaGUgZm9sbG93aW5nIHNlY3Rpb25zIGhhdmUgdGlwcyBmb3IgdGVzdGluZyB0aGUgVUkgb2YgeW91ciBBbmRyb2lkIGFwcGxpY2F0aW9uLCBzcGVjaWZpY2FsbHkKKyAgICB0byBoZWxwIHlvdSBoYW5kbGUgYWN0aW9ucyB0aGF0IHJ1biBpbiB0aGUgVUkgdGhyZWFkLCB0b3VjaCBzY3JlZW4gYW5kIGtleWJvYXJkIGV2ZW50cywgYW5kIGhvbWUKKyAgICBzY3JlZW4gdW5sb2NrIGR1cmluZyB0ZXN0aW5nLgorPC9wPgorPGgzIGlkPSJSdW5PblVJVGhyZWFkIj5UZXN0aW5nIG9uIHRoZSBVSSB0aHJlYWQ8L2gzPgorPHA+CisgICAgQW4gYXBwbGljYXRpb24ncyBhY3Rpdml0aWVzIHJ1biBvbiB0aGUgYXBwbGljYXRpb24ncyA8c3Ryb25nPlVJIHRocmVhZDwvc3Ryb25nPi4gT25jZSB0aGUKKyAgICBVSSBpcyBpbnN0YW50aWF0ZWQsIGZvciBleGFtcGxlIGluIHRoZSBhY3Rpdml0eSdzIDxjb2RlPm9uQ3JlYXRlKCk8L2NvZGU+IG1ldGhvZCwgdGhlbiBhbGwKKyAgICBpbnRlcmFjdGlvbnMgd2l0aCB0aGUgVUkgbXVzdCBydW4gaW4gdGhlIFVJIHRocmVhZC4gV2hlbiB5b3UgcnVuIHRoZSBhcHBsaWNhdGlvbiBub3JtYWxseSwgaXQKKyAgICBoYXMgYWNjZXNzIHRvIHRoZSB0aHJlYWQgYW5kIGRvZXMgbm90IGhhdmUgdG8gZG8gYW55dGhpbmcgc3BlY2lhbC4KKzwvcD4KKzxwPgorICAgIFRoaXMgY2hhbmdlcyB3aGVuIHlvdSBydW4gdGVzdHMgYWdhaW5zdCB0aGUgYXBwbGljYXRpb24uIFdpdGggaW5zdHJ1bWVudGF0aW9uLWJhc2VkIGNsYXNzZXMsCisgICAgeW91IGNhbiBpbnZva2UgbWV0aG9kcyBhZ2FpbnN0IHRoZSBVSSBvZiB0aGUgYXBwbGljYXRpb24gdW5kZXIgdGVzdC4gVGhlIG90aGVyIHRlc3QgY2xhc3NlcworICAgIGRvbid0IGFsbG93IHRoaXMuIFRvIHJ1biBhbiBlbnRpcmUgdGVzdCBtZXRob2Qgb24gdGhlIFVJIHRocmVhZCwgeW91IGNhbiBhbm5vdGF0ZSB0aGUgdGhyZWFkCisgICAgd2l0aCA8Y29kZT5AVUlUaHJlYWRUZXN0PC9jb2RlPi4gTm90aWNlIHRoYXQgdGhpcyB3aWxsIHJ1biA8ZW0+YWxsPC9lbT4gb2YgdGhlIG1ldGhvZCBzdGF0ZW1lbnRzCisgICAgb24gdGhlIFVJIHRocmVhZC4gIE1ldGhvZHMgdGhhdCBkbyBub3QgaW50ZXJhY3Qgd2l0aCB0aGUgVUkgYXJlIG5vdCBhbGxvd2VkOyBmb3IgZXhhbXBsZSwgeW91CisgICAgY2FuJ3QgaW52b2tlIDxjb2RlPkluc3RydW1lbnRhdGlvbi53YWl0Rm9ySWRsZVN5bmMoKTwvY29kZT4uCis8L3A+Cis8cD4KKyAgICBUbyBydW4gYSBzdWJzZXQgb2YgYSB0ZXN0IG1ldGhvZCBvbiB0aGUgVUkgdGhyZWFkLCBjcmVhdGUgYW4gYW5vbnltb3VzIGNsYXNzIG9mIHR5cGUKKyAgICA8Y29kZT5SdW5uYWJsZTwvY29kZT4sIHB1dCB0aGUgc3RhdGVtZW50cyB5b3Ugd2FudCBpbiB0aGUgPGNvZGU+cnVuKCk8L2NvZGU+IG1ldGhvZCwgYW5kCisgICAgaW5zdGFudGlhdGUgYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIGNsYXNzIGFzIGEgcGFyYW1ldGVyIHRvIHRoZSBtZXRob2QKKyAgICA8Y29kZT48ZW0+YXBwQWN0aXZpdHk8L2VtPi5ydW5PblVpVGhyZWFkKCk8L2NvZGU+LCB3aGVyZSA8Y29kZT48ZW0+YXBwQWN0aXZpdHk8L2VtPjwvY29kZT4gaXMKKyAgICB0aGUgaW5zdGFuY2Ugb2YgdGhlIGFwcGxpY2F0aW9uIHlvdSBhcmUgdGVzdGluZy4KKzwvcD4KKzxwPgorICAgIEZvciBleGFtcGxlLCB0aGlzIGNvZGUgaW5zdGFudGlhdGVzIGFuIGFjdGl2aXR5IHRvIHRlc3QsIHJlcXVlc3RzIGZvY3VzIChhIFVJIGFjdGlvbikgZm9yIHRoZQorICAgIFNwaW5uZXIgZGlzcGxheWVkIGJ5IHRoZSBhY3Rpdml0eSwgYW5kIHRoZW4gc2VuZHMgYSBrZXkgdG8gaXQuIE5vdGljZSB0aGF0IHRoZSBjYWxscyB0bworICAgIDxjb2RlPndhaXRGb3JJZGxlU3luYzwvY29kZT4gYW5kIDxjb2RlPnNlbmRLZXlzPC9jb2RlPiBhcmVuJ3QgYWxsb3dlZCB0byBydW4gb24gdGhlIFVJIHRocmVhZDoKKzwvcD4KKzxwcmU+CisgIHByaXZhdGUgTXlBY3Rpdml0eSBtQWN0aXZpdHk7IC8vIE15QWN0aXZpdHkgaXMgdGhlIGNsYXNzIG5hbWUgb2YgdGhlIGFwcCB1bmRlciB0ZXN0CisgIHByaXZhdGUgU3Bpbm5lciBtU3Bpbm5lcjsKKworICAuLi4KKworICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgc3VwZXIuc2V0VXAoKTsKKyAgICAgIG1JbnN0cnVtZW50YXRpb24gPSBnZXRJbnN0cnVtZW50YXRpb24oKTsKKworICAgICAgbUFjdGl2aXR5ID0gZ2V0QWN0aXZpdHkoKTsgLy8gZ2V0IGEgcmVmZXJlbmNlcyB0byB0aGUgYXBwIHVuZGVyIHRlc3QKKworICAgICAgLyoKKyAgICAgICAqIEdldCBhIHJlZmVyZW5jZSB0byB0aGUgbWFpbiB3aWRnZXQgb2YgdGhlIGFwcCB1bmRlciB0ZXN0LCBhIFNwaW5uZXIKKyAgICAgICAqLworICAgICAgbVNwaW5uZXIgPSAoU3Bpbm5lcikgbUFjdGl2aXR5LmZpbmRWaWV3QnlJZChjb20uYW5kcm9pZC5kZW1vLm15YWN0aXZpdHkuUi5pZC5TcGlubmVyMDEpOworCisgIC4uLgorCisgIHB1YmxpYyB2b2lkIGFUZXN0KCkgeworICAgICAgLyoKKyAgICAgICAqIHJlcXVlc3QgZm9jdXMgZm9yIHRoZSBTcGlubmVyLCBzbyB0aGF0IHRoZSB0ZXN0IGNhbiBzZW5kIGtleSBldmVudHMgdG8gaXQKKyAgICAgICAqIFRoaXMgcmVxdWVzdCBtdXN0IGJlIHJ1biBvbiB0aGUgVUkgdGhyZWFkLiBUbyBkbyB0aGlzLCB1c2UgdGhlIHJ1bk9uVWlUaHJlYWQgbWV0aG9kCisgICAgICAgKiBhbmQgcGFzcyBpdCBhIFJ1bm5hYmxlIHRoYXQgY29udGFpbnMgYSBjYWxsIHRvIHJlcXVlc3RGb2N1cyBvbiB0aGUgU3Bpbm5lci4KKyAgICAgICAqLworICAgICAgbUFjdGl2aXR5LnJ1bk9uVWlUaHJlYWQobmV3IFJ1bm5hYmxlKCkgeworICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgbVNwaW5uZXIucmVxdWVzdEZvY3VzKCk7CisgICAgICAgICAgfQorICAgICAgfSk7CisKKyAgICAgIG1JbnN0cnVtZW50YXRpb24ud2FpdEZvcklkbGVTeW5jKCk7CisKKyAgICAgIHRoaXMuc2VuZEtleXMoS2V5RXZlbnQuS0VZQ09ERV9EUEFEX0NFTlRFUik7Cis8L3ByZT4KKworPGgzIGlkPSJOb3RvdWNoTW9kZSI+VHVybmluZyBvZmYgdG91Y2ggbW9kZTwvaDM+Cis8cD4KKyAgICBUbyBjb250cm9sIHRoZSBlbXVsYXRvciBvciBhIGRldmljZSB3aXRoIGtleSBldmVudHMgeW91IHNlbmQgZnJvbSB5b3VyIHRlc3RzLCB5b3UgbXVzdCB0dXJuIG9mZgorICAgIHRvdWNoIG1vZGUuIElmIHlvdSBkbyBub3QgZG8gdGhpcywgdGhlIGtleSBldmVudHMgYXJlIGlnbm9yZWQuCis8L3A+Cis8cD4KKyAgICBUbyB0dXJuIG9mZiB0b3VjaCBtb2RlLCB5b3UgaW52b2tlCisgICAgPGNvZGU+QWN0aXZpdHlJbnN0cnVtZW50YXRpb25UZXN0Q2FzZTIuc2V0QWN0aXZpdHlUb3VjaE1vZGUoZmFsc2UpPC9jb2RlPgorICAgIDxlbT5iZWZvcmU8L2VtPiB5b3UgY2FsbCA8Y29kZT5nZXRBY3Rpdml0eSgpPC9jb2RlPiB0byBzdGFydCB0aGUgYWN0aXZpdHkuIFlvdSBtdXN0IGludm9rZSB0aGUKKyAgICBtZXRob2QgaW4gYSB0ZXN0IG1ldGhvZCB0aGF0IGlzIDxlbT5ub3Q8L2VtPiBydW5uaW5nIG9uIHRoZSBVSSB0aHJlYWQuIEZvciB0aGlzIHJlYXNvbiwgeW91CisgICAgY2FuJ3QgaW52b2tlIHRoZSB0b3VjaCBtb2RlIG1ldGhvZCBmcm9tIGEgdGVzdCBtZXRob2QgdGhhdCBpcyBhbm5vdGF0ZWQgd2l0aAorICAgIDxjb2RlPkBVSVRocmVhZDwvY29kZT4uIEluc3RlYWQsIGludm9rZSB0aGUgdG91Y2ggbW9kZSBtZXRob2QgZnJvbSA8Y29kZT5zZXRVcCgpPC9jb2RlPi4KKzwvcD4KKzxoMyBpZD0iVW5sb2NrRGV2aWNlIj5VbmxvY2tpbmcgdGhlIGVtdWxhdG9yIG9yIGRldmljZTwvaDM+Cis8cD4KKyAgICBZb3UgbWF5IGZpbmQgdGhhdCBVSSB0ZXN0cyBkb24ndCB3b3JrIGlmIHRoZSBlbXVsYXRvcidzIG9yIGRldmljZSdzIGhvbWUgc2NyZWVuIGlzIGRpc2FibGVkIHdpdGgKKyAgICB0aGUga2V5Z3VhcmQgcGF0dGVybi4gVGhpcyBpcyBiZWNhdXNlIHRoZSBhcHBsaWNhdGlvbiB1bmRlciB0ZXN0IGNhbid0IHJlY2VpdmUga2V5IGV2ZW50cyBzZW50CisgICAgYnkgPGNvZGU+c2VuZEtleXMoKTwvY29kZT4uIFRoZSBiZXN0IHdheSB0byBhdm9pZCB0aGlzIGlzIHRvIHN0YXJ0IHlvdXIgZW11bGF0b3Igb3IgZGV2aWNlCisgICAgZmlyc3QgYW5kIHRoZW4gZGlzYWJsZSB0aGUga2V5Z3VhcmQgZm9yIHRoZSBob21lIHNjcmVlbi4KKzwvcD4KKzxwPgorICAgIFlvdSBjYW4gYWxzbyBleHBsaWNpdGx5IGRpc2FibGUgdGhlIGtleWd1YXJkLiBUbyBkbyB0aGlzLAorICAgIHlvdSBuZWVkIHRvIGFkZCBhIHBlcm1pc3Npb24gaW4gdGhlIG1hbmlmZXN0IGZpbGUgKDxjb2RlPkFuZHJvaWRNYW5pZmVzdC54bWw8L2NvZGU+KSBhbmQKKyAgICB0aGVuIGRpc2FibGUgdGhlIGtleWd1YXJkIGluIHlvdXIgYXBwbGljYXRpb24gdW5kZXIgdGVzdC4gTm90ZSwgdGhvdWdoLCB0aGF0IHlvdSBlaXRoZXIgaGF2ZSB0bworICAgIHJlbW92ZSB0aGlzIGJlZm9yZSB5b3UgcHVibGlzaCB5b3VyIGFwcGxpY2F0aW9uLCBvciB5b3UgaGF2ZSB0byBkaXNhYmxlIGl0IHdpdGggY29kZSBpbgorICAgIHRoZSBwdWJsaXNoZWQgYXBwbGljYXRpb24uCis8L3A+Cis8cD4KKyAgICBUbyBhZGQgdGhlIHRoZSBwZXJtaXNzaW9uLCBhZGQgdGhlIGVsZW1lbnQKKyAgICA8Y29kZT4mbHQ7dXNlcy1wZXJtaXNzaW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5wZXJtaXNzaW9uLkRJU0FCTEVfS0VZR1VBUkQiLyZndDs8L2NvZGU+CisgICAgYXMgYSBjaGlsZCBvZiB0aGUgPGNvZGU+Jmx0O21hbmlmZXN0Jmd0OzwvY29kZT4gZWxlbWVudC4gVG8gZGlzYWJsZSB0aGUgS2V5R3VhcmQsIGFkZCB0aGUKKyAgICBmb2xsb3dpbmcgY29kZSB0byB0aGUgPGNvZGU+b25DcmVhdGUoKTwvY29kZT4gbWV0aG9kIG9mIGFjdGl2aXRpZXMgeW91IGludGVuZCB0byB0ZXN0OgorPC9wPgorPHByZT4KKyAgbUtleUd1YXJkTWFuYWdlciA9IChLZXlndWFyZE1hbmFnZXIpIGdldFN5c3RlbVNlcnZpY2UoS0VZR1VBUkRfU0VSVklDRSk7CisgIG1Mb2NrID0gbUtleUd1YXJkTWFuYWdlci5uZXdLZXlndWFyZExvY2soIjxlbT5hY3Rpdml0eV9jbGFzc25hbWU8L2VtPiIpOworICBtTG9jay5kaXNhYmxlS2V5Z3VhcmQoKTsKKzwvcHJlPgorPHA+d2hlcmUgPGNvZGU+PGVtPmFjdGl2aXR5X2NsYXNzbmFtZTwvZW0+PC9jb2RlPiBpcyB0aGUgY2xhc3MgbmFtZSBvZiB0aGUgYWN0aXZpdHkuPC9wPgorPGgzIGlkPSJVSVRlc3RUcm91Ymxlc2hvb3RpbmciPlRyb3VibGVzaG9vdGluZyBVSSB0ZXN0czwvaDM+Cis8cD4KKyAgICBUaGlzIHNlY3Rpb24gbGlzdHMgc29tZSBvZiB0aGUgY29tbW9uIHRlc3QgZmFpbHVyZXMgeW91IG1heSBlbmNvdW50ZXIgaW4gVUkgdGVzdGluZywgYW5kIHRoZWlyCisgICAgY2F1c2VzOgorPC9wPgorPGRsPgorICAgIDxkdD48Y29kZT5Xcm9uZ1RocmVhZEV4Y2VwdGlvbjwvY29kZT48L2R0PgorICAgIDxkZD4KKyAgICAgIDxwPjxzdHJvbmc+UHJvYmxlbTo8L3N0cm9uZz48L3A+CisgICAgICBGb3IgYSBmYWlsZWQgdGVzdCwgdGhlIEZhaWx1cmUgVHJhY2UgY29udGFpbnMgdGhlIGZvbGxvd2luZyBlcnJvciBtZXNzYWdlOgorICAgICAgPGNvZGU+CisgICAgICAgIGFuZHJvaWQudmlldy5WaWV3Um9vdCRDYWxsZWRGcm9tV3JvbmdUaHJlYWRFeGNlcHRpb246IE9ubHkgdGhlIG9yaWdpbmFsIHRocmVhZCB0aGF0IGNyZWF0ZWQKKyAgICAgICAgYSB2aWV3IGhpZXJhcmNoeSBjYW4gdG91Y2ggaXRzIHZpZXdzLgorICAgICAgPC9jb2RlPgorICAgICAgPHA+PHN0cm9uZz5Qcm9iYWJsZSBDYXVzZTo8L3N0cm9uZz48L3A+CisgICAgICAgIFRoaXMgZXJyb3IgaXMgY29tbW9uIGlmIHlvdSB0cmllZCB0byBzZW5kIFVJIGV2ZW50cyB0byB0aGUgVUkgdGhyZWFkIGZyb20gb3V0c2lkZSB0aGUgVUkKKyAgICAgICAgdGhyZWFkLiBUaGlzIGNvbW1vbmx5IGhhcHBlbnMgaWYgeW91IHNlbmQgVUkgZXZlbnRzIGZyb20gdGhlIHRlc3QgYXBwbGljYXRpb24sIGJ1dCB5b3UgZG9uJ3QKKyAgICAgICAgdXNlIHRoZSA8Y29kZT5AVUlUaHJlYWQ8L2NvZGU+IGFubm90YXRpb24gb3IgdGhlIDxjb2RlPnJ1bk9uVWlUaHJlYWQoKTwvY29kZT4gbWV0aG9kLiBUaGUKKyAgICAgICAgdGVzdCBtZXRob2QgdHJpZWQgdG8gaW50ZXJhY3Qgd2l0aCB0aGUgVUkgb3V0c2lkZSB0aGUgVUkgdGhyZWFkLgorICAgICAgPHA+PHN0cm9uZz5TdWdnZXN0ZWQgUmVzb2x1dGlvbjo8L3N0cm9uZz48L3A+CisgICAgICAgIFJ1biB0aGUgaW50ZXJhY3Rpb24gb24gdGhlIFVJIHRocmVhZC4gVXNlIGEgdGVzdCBjbGFzcyB0aGF0IHByb3ZpZGVzIGluc3RydW1lbnRhdGlvbi4gU2VlCisgICAgICAgIHRoZSBwcmV2aW91cyBzZWN0aW9uIDxhIGhyZWY9IiNSdW5PblVJVGhyZWFkIj5UZXN0aW5nIG9uIHRoZSBVSSBUaHJlYWQ8L2E+CisgICAgICAgIGZvciBtb3JlIGRldGFpbHMuCisgICAgPC9kZD4KKyAgICA8ZHQ+PGNvZGU+amF2YS5sYW5nLlJ1bnRpbWVFeGNlcHRpb248L2NvZGU+PC9kdD4KKyAgICA8ZGQ+CisgICAgICA8cD48c3Ryb25nPlByb2JsZW06PC9zdHJvbmc+PC9wPgorICAgICAgICBGb3IgYSBmYWlsZWQgdGVzdCwgdGhlIEZhaWx1cmUgVHJhY2UgY29udGFpbnMgdGhlIGZvbGxvd2luZyBlcnJvciBtZXNzYWdlOgorICAgICAgPGNvZGU+CisgICAgICAgIGphdmEubGFuZy5SdW50aW1lRXhjZXB0aW9uOiBUaGlzIG1ldGhvZCBjYW4gbm90IGJlIGNhbGxlZCBmcm9tIHRoZSBtYWluIGFwcGxpY2F0aW9uIHRocmVhZAorICAgICAgPC9jb2RlPgorICAgICAgPHA+PHN0cm9uZz5Qcm9iYWJsZSBDYXVzZTo8L3N0cm9uZz48L3A+CisgICAgICAgIFRoaXMgZXJyb3IgaXMgY29tbW9uIGlmIHlvdXIgdGVzdCBtZXRob2QgaXMgYW5ub3RhdGVkIHdpdGggPGNvZGU+QFVpVGhyZWFkVGVzdDwvY29kZT4gYnV0CisgICAgICAgIHRoZW4gdHJpZXMgdG8gZG8gc29tZXRoaW5nIG91dHNpZGUgdGhlIFVJIHRocmVhZCBvciB0cmllcyB0byBpbnZva2UKKyAgICAgICAgPGNvZGU+cnVuT25VaVRocmVhZCgpPC9jb2RlPi4KKyAgICAgIDxwPjxzdHJvbmc+U3VnZ2VzdGVkIFJlc29sdXRpb246PC9zdHJvbmc+PC9wPgorICAgICAgICBSZW1vdmUgdGhlIDxjb2RlPkBVaVRocmVhZFRlc3Q8L2NvZGU+IGFubm90YXRpb24sIHJlbW92ZSB0aGUgPGNvZGU+cnVuT25VaVRocmVhZCgpPC9jb2RlPgorICAgICAgICBjYWxsLCBvciByZS1mYWN0b3IgeW91ciB0ZXN0cy4KKyAgICA8L2RkPgorPC9kbD4KZGlmZiAtLWdpdCBhL2RvY3MvaHRtbC9ndWlkZS90b3BpY3MvdGVzdGluZy9jb250ZW50cHJvdmlkZXJfdGVzdGluZy5qZCBiL2RvY3MvaHRtbC9ndWlkZS90b3BpY3MvdGVzdGluZy9jb250ZW50cHJvdmlkZXJfdGVzdGluZy5qZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OTNiNWM5Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jcy9odG1sL2d1aWRlL3RvcGljcy90ZXN0aW5nL2NvbnRlbnRwcm92aWRlcl90ZXN0aW5nLmpkCkBAIC0wLDAgKzEsMjI0IEBACitwYWdlLnRpdGxlPUNvbnRlbnQgUHJvdmlkZXIgVGVzdGluZworQGpkOmJvZHkKKworPGRpdiBpZD0icXYtd3JhcHBlciI+CisgIDxkaXYgaWQ9InF2Ij4KKyAgPGgyPkluIHRoaXMgZG9jdW1lbnQ8L2gyPgorICA8b2w+CisgICAgPGxpPgorICAgICAgICA8YSBocmVmPSIjRGVzaWduQW5kVGVzdCI+Q29udGVudCBQcm92aWRlciBEZXNpZ24gYW5kIFRlc3Rpbmc8L2E+CisgICAgPC9saT4KKyAgICA8bGk+CisgICAgICA8YSBocmVmPSIjQ29udGVudFByb3ZpZGVyVGVzdEFQSSI+VGhlIENvbnRlbnQgUHJvdmlkZXIgVGVzdGluZyBBUEk8L2E+CisgICAgICA8b2w+CisgICAgICAgIDxsaT4KKyAgICAgICAgICA8YSBocmVmPSIjUHJvdmlkZXJUZXN0Q2FzZTIiPlByb3ZpZGVyVGVzdENhc2UyIDwvYT4KKyAgICAgICAgPC9saT4KKyAgICAgICAgPGxpPgorICAgICAgICAgIDxhIGhyZWY9IiNNb2NrT2JqZWN0cyI+TW9jayBvYmplY3QgY2xhc3NlczwvYT4KKyAgICAgICAgPC9saT4KKyAgICAgIDwvb2w+CisgICAgPC9saT4KKyAgICA8bGk+CisgICAgICAgIDxhIGhyZWY9IiNXaGF0VG9UZXN0Ij5XaGF0IFRvIFRlc3Q8L2E+CisgICAgPC9saT4KKyAgICA8bGk+CisgICAgICAgIDxhIGhyZWY9IiNOZXh0U3RlcHMiPk5leHQgU3RlcHM8L2E+CisgICAgPC9saT4KKyAgPC9vbD4KKyAgPGgyPktleSBDbGFzc2VzPC9oMj4KKyAgICA8b2w+CisgICAgICA8bGk+e0BsaW5rIGFuZHJvaWQudGVzdC5JbnN0cnVtZW50YXRpb25UZXN0UnVubmVyfTwvbGk+CisgICAgICA8bGk+e0BsaW5rIGFuZHJvaWQudGVzdC5Qcm92aWRlclRlc3RDYXNlMn08L2xpPgorICAgICAgPGxpPntAbGluayBhbmRyb2lkLnRlc3QuSXNvbGF0ZWRDb250ZXh0fTwvbGk+CisgICAgICA8bGk+e0BsaW5rIGFuZHJvaWQudGVzdC5tb2NrLk1vY2tDb250ZW50UmVzb2x2ZXJ9PC9saT4KKyAgICA8L29sPgorICA8aDI+U2VlIEFsc288L2gyPgorICAgICAgPG9sPgorICAgICAgICA8bGk+CisgICAgICAgICAgPGEKKyAgICAgICAgICBocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvdG9waWNzL3Rlc3RpbmcvdG9waWNzL3Rlc3RpbmdfYW5kcm9pZC5odG1sIj4KKyAgICAgICAgICBUZXN0aW5nIEZ1bmRhbWVudGFsczwvYT4KKyAgICAgICAgPC9saT4KKyAgICAgICAgPGxpPgorICAgICAgICAgIDxhIGhyZWY9IntAZG9jUm9vdH1ndWlkZS9kZXZlbG9waW5nL3Rlc3RpbmcvdGVzdGluZ19lY2xpcHNlLmh0bWwiPgorICAgICAgICAgIFRlc3RpbmcgaW4gRWNsaXBzZSwgd2l0aCBBRFQ8L2E+CisgICAgICAgIDwvbGk+CisgICAgICAgIDxsaT4KKyAgICAgICAgICA8YSBocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvZGV2ZWxvcGluZy90ZXN0aW5nL3Rlc3Rpbmdfb3RoZXJpZGUuaHRtbCI+CisgICAgICAgICAgVGVzdGluZyBpbiBPdGhlciBJREVzPC9hPgorICAgICAgICA8L2xpPgorICAgICAgPC9vbD4KKyAgPC9kaXY+Cis8L2Rpdj4KKzxwPgorICAgIENvbnRlbnQgcHJvdmlkZXJzLCB3aGljaCBzdG9yZSBhbmQgcmV0cmlldmUgZGF0YSBhbmQgbWFrZSBpdCBhY2Nlc3NpYmxlIGFjcm9zcyBhcHBsaWNhdGlvbnMsCisgICAgYXJlIGEga2V5IHBhcnQgb2YgdGhlIEFuZHJvaWQgQVBJLiBBcyBhbiBhcHBsaWNhdGlvbiBkZXZlbG9wZXIgeW91J3JlIGFsbG93ZWQgdG8gcHJvdmlkZSB5b3VyCisgICAgb3duIHB1YmxpYyBwcm92aWRlcnMgZm9yIHVzZSBieSBvdGhlciBhcHBsaWNhdGlvbnMuIElmIHlvdSBkbywgdGhlbiB5b3Ugc2hvdWxkIHRlc3QgdGhlbQorICAgIHVzaW5nIHRoZSBBUEkgeW91IHB1Ymxpc2guCis8L3A+Cis8cD4KKyAgICBUaGlzIGRvY3VtZW50IGRlc2NyaWJlcyBob3cgdG8gdGVzdCBwdWJsaWMgY29udGVudCBwcm92aWRlcnMsIGFsdGhvdWdoIHRoZSBpbmZvcm1hdGlvbiBpcworICAgIGFsc28gYXBwbGljYWJsZSB0byBwcm92aWRlcnMgdGhhdCB5b3Uga2VlcCBwcml2YXRlIHRvIHlvdXIgb3duIGFwcGxpY2F0aW9uLiBJZiB5b3UgYXJlbid0CisgICAgZmFtaWxpYXIgd2l0aCBjb250ZW50ICBwcm92aWRlcnMgb3IgdGhlIEFuZHJvaWQgdGVzdGluZyBmcmFtZXdvcmssIHBsZWFzZSByZWFkCisgICAgPGEgaHJlZj0ie0Bkb2NSb290fWd1aWRlL3RvcGljcy9wcm92aWRlcnMvY29udGVudC1wcm92aWRlcnMuaHRtbCI+Q29udGVudCBQcm92aWRlcnM8L2E+LAorICAgIHRoZSBndWlkZSB0byBkZXZlbG9waW5nIGNvbnRlbnQgcHJvdmlkZXJzLCBhbmQKKyAgICA8YSBocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvdG9waWNzL3Rlc3RpbmcvdGVzdGluZ19hbmRyb2lkLmh0bWwiPlRlc3RpbmcgRnVuZGFtZW50YWxzPC9hPiwKKyAgICB0aGUgaW50cm9kdWN0aW9uIHRvIHRoZSBBbmRyb2lkIHRlc3RpbmcgYW5kIGluc3RydW1lbnRhdGlvbiBmcmFtZXdvcmsuCis8L3A+Cis8aDIgaWQ9IkRlc2lnbkFuZFRlc3QiPkNvbnRlbnQgUHJvdmlkZXIgRGVzaWduIGFuZCBUZXN0aW5nPC9oMj4KKzxwPgorICAgIEluIEFuZHJvaWQsIGNvbnRlbnQgcHJvdmlkZXJzIGFyZSB2aWV3ZWQgZXh0ZXJuYWxseSBhcyBkYXRhIEFQSXMgdGhhdCBwcm92aWRlCisgICAgdGFibGVzIG9mIGRhdGEsIHdpdGggdGhlaXIgaW50ZXJuYWxzIGhpZGRlbiBmcm9tIHZpZXcuIEEgY29udGVudCBwcm92aWRlciBtYXkgaGF2ZSBtYW55CisgICAgcHVibGljIGNvbnN0YW50cywgYnV0IGl0IHVzdWFsbHkgaGFzIGZldyBpZiBhbnkgcHVibGljIG1ldGhvZHMgYW5kIG5vIHB1YmxpYyB2YXJpYWJsZXMuCisgICAgVGhpcyBzdWdnZXN0cyB0aGF0IHlvdSBzaG91bGQgd3JpdGUgeW91ciB0ZXN0cyBiYXNlZCBvbmx5IG9uIHRoZSBwcm92aWRlcidzIHB1YmxpYyBtZW1iZXJzLgorICAgIEEgY29udGVudCBwcm92aWRlciB0aGF0IGlzIGRlc2lnbmVkIGxpa2UgdGhpcyBpcyBvZmZlcmluZyBhIGNvbnRyYWN0IGJldHdlZW4gaXRzZWxmIGFuZCBpdHMKKyAgICB1c2Vycy4KKzwvcD4KKzxwPgorICAgIFRoZSBiYXNlIHRlc3QgY2FzZSBjbGFzcyBmb3IgY29udGVudCBwcm92aWRlcnMsCisgICAge0BsaW5rIGFuZHJvaWQudGVzdC5Qcm92aWRlclRlc3RDYXNlMn0sIGFsbG93cyB5b3UgdG8gdGVzdCB5b3VyIGNvbnRlbnQgcHJvdmlkZXIgaW4gYW4KKyAgICBpc29sYXRlZCBlbnZpcm9ubWVudC4gQW5kcm9pZCBtb2NrIG9iamVjdHMgc3VjaCBhcyB7QGxpbmsgYW5kcm9pZC50ZXN0Lklzb2xhdGVkQ29udGV4dH0gYW5kCisgICAge0BsaW5rIGFuZHJvaWQudGVzdC5tb2NrLk1vY2tDb250ZW50UmVzb2x2ZXJ9IGFsc28gaGVscCBwcm92aWRlIGFuIGlzb2xhdGVkIHRlc3QgZW52aXJvbm1lbnQuCis8L3A+Cis8cD4KKyAgICBBcyB3aXRoIG90aGVyIEFuZHJvaWQgdGVzdHMsIHByb3ZpZGVyIHRlc3QgcGFja2FnZXMgYXJlIHJ1biB1bmRlciB0aGUgY29udHJvbCBvZiB0aGUgdGVzdAorICAgIHJ1bm5lciB7QGxpbmsgYW5kcm9pZC50ZXN0Lkluc3RydW1lbnRhdGlvblRlc3RSdW5uZXJ9LiBUaGUgc2VjdGlvbgorICAgIDxhIGhyZWY9IntAZG9jUm9vdH1ndWlkZS90b3BpY3MvdGVzdGluZy90ZXN0aW5nX2FuZHJvaWQuaHRtbCNJbnN0cnVtZW50YXRpb25UZXN0UnVubmVyIj4KKyAgICBSdW5uaW5nIFRlc3RzIFdpdGggSW5zdHJ1bWVudGF0aW9uVGVzdFJ1bm5lcjwvYT4gZGVzY3JpYmVzIHRoZSB0ZXN0IHJ1bm5lciBpbgorICAgIG1vcmUgZGV0YWlsLiBUaGUgdG9waWMgPGEgaHJlZj0ie0Bkb2NSb290fWd1aWRlL2RldmVsb3BpbmcvdGVzdGluZy90ZXN0aW5nX2VjbGlwc2UuaHRtbCI+CisgICAgVGVzdGluZyBpbiBFY2xpcHNlLCB3aXRoIEFEVDwvYT4gc2hvd3MgeW91IGhvdyB0byBydW4gYSB0ZXN0IHBhY2thZ2UgaW4gRWNsaXBzZSwgYW5kIHRoZQorICAgIHRvcGljIDxhIGhyZWY9IntAZG9jUm9vdH1ndWlkZS9kZXZlbG9waW5nL3Rlc3RpbmcvdGVzdGluZ19vdGhlcmlkZS5odG1sIj4KKyAgICBUZXN0aW5nIGluIE90aGVyIElERXM8L2E+CisgICAgc2hvd3MgeW91IGhvdyB0byBydW4gYSB0ZXN0IHBhY2thZ2UgZnJvbSB0aGUgY29tbWFuZCBsaW5lLgorPC9wPgorPGgyIGlkPSJDb250ZW50UHJvdmlkZXJUZXN0QVBJIj5Db250ZW50IFByb3ZpZGVyIFRlc3RpbmcgQVBJPC9oMj4KKzxwPgorICAgIFRoZSBtYWluIGZvY3VzIG9mIHRoZSBwcm92aWRlciB0ZXN0aW5nIEFQSSBpcyB0byBwcm92aWRlIGFuIGlzb2xhdGVkIHRlc3RpbmcgZW52aXJvbm1lbnQuIFRoaXMKKyAgICBlbnN1cmVzIHRoYXQgdGVzdHMgYWx3YXlzIHJ1biBhZ2FpbnN0IGRhdGEgZGVwZW5kZW5jaWVzIHNldCBleHBsaWNpdGx5IGluIHRoZSB0ZXN0IGNhc2UuIEl0CisgICAgYWxzbyBwcmV2ZW50cyB0ZXN0cyBmcm9tIG1vZGlmeWluZyBhY3R1YWwgdXNlciBkYXRhLiBGb3IgZXhhbXBsZSwgeW91IHdhbnQgdG8gYXZvaWQgd3JpdGluZworICAgIGEgdGVzdCB0aGF0IGZhaWxzIGJlY2F1c2UgdGhlcmUgd2FzIGRhdGEgbGVmdCBvdmVyIGZyb20gYSBwcmV2aW91cyB0ZXN0LCBhbmQgeW91IHdhbnQgdG8KKyAgICBhdm9pZCBhZGRpbmcgb3IgZGVsZXRpbmcgY29udGFjdCBpbmZvcm1hdGlvbiBpbiBhIGFjdHVhbCBwcm92aWRlci4KKzwvcD4KKzxwPgorICAgIFRoZSB0ZXN0IGNhc2UgY2xhc3MgYW5kIG1vY2sgb2JqZWN0IGNsYXNzZXMgZm9yIHByb3ZpZGVyIHRlc3Rpbmcgc2V0IHVwIHRoaXMgaXNvbGF0ZWQgdGVzdGluZworICAgIGVudmlyb25tZW50IGZvciB5b3UuCis8L3A+Cis8aDMgaWQ9IlByb3ZpZGVyVGVzdENhc2UyIj5Qcm92aWRlclRlc3RDYXNlMjwvaDM+Cis8cD4KKyAgICBZb3UgdGVzdCBhIHByb3ZpZGVyIHdpdGggYSBzdWJjbGFzcyBvZiB7QGxpbmsgYW5kcm9pZC50ZXN0LlByb3ZpZGVyVGVzdENhc2UyfS4gVGhpcyBiYXNlIGNsYXNzCisgICAgZXh0ZW5kcyB7QGxpbmsgYW5kcm9pZC50ZXN0LkFuZHJvaWRUZXN0Q2FzZX0sIHNvIGl0IHByb3ZpZGVzIHRoZSBKVW5pdCB0ZXN0aW5nIGZyYW1ld29yayBhcyB3ZWxsCisgICAgYXMgQW5kcm9pZC1zcGVjaWZpYyBtZXRob2RzIGZvciB0ZXN0aW5nIGFwcGxpY2F0aW9uIHBlcm1pc3Npb25zLiBUaGUgbW9zdCBpbXBvcnRhbnQKKyAgICBmZWF0dXJlIG9mIHRoaXMgY2xhc3MgaXMgaXRzIGluaXRpYWxpemF0aW9uLCB3aGljaCBjcmVhdGVzIHRoZSBpc29sYXRlZCB0ZXN0IGVudmlyb25tZW50LgorPC9wPgorPHA+CisgICAgVGhlIGluaXRpYWxpemF0aW9uIGlzIGRvbmUgaW4gdGhlIGNvbnN0cnVjdG9yIGZvciB7QGxpbmsgYW5kcm9pZC50ZXN0LlByb3ZpZGVyVGVzdENhc2UyfSwgd2hpY2gKKyAgICBzdWJjbGFzc2VzIGNhbGwgaW4gdGhlaXIgb3duIGNvbnN0cnVjdG9ycy4gVGhlIHtAbGluayBhbmRyb2lkLnRlc3QuUHJvdmlkZXJUZXN0Q2FzZTJ9CisgICAgY29uc3RydWN0b3IgY3JlYXRlcyBhbiB7QGxpbmsgYW5kcm9pZC50ZXN0Lklzb2xhdGVkQ29udGV4dH0gb2JqZWN0IHRoYXQgYWxsb3dzIGZpbGUgYW5kCisgICAgZGF0YWJhc2Ugb3BlcmF0aW9ucyBidXQgc3R1YnMgb3V0IG90aGVyIGludGVyYWN0aW9ucyB3aXRoIHRoZSBBbmRyb2lkIHN5c3RlbS4KKyAgICBUaGUgZmlsZSBhbmQgZGF0YWJhc2Ugb3BlcmF0aW9ucyB0aGVtc2VsdmVzIHRha2UgcGxhY2UgaW4gYSBkaXJlY3RvcnkgdGhhdCBpcyBsb2NhbCB0byB0aGUKKyAgICBkZXZpY2Ugb3IgZW11bGF0b3IgYW5kIGhhcyBhIHNwZWNpYWwgcHJlZml4LgorPC9wPgorPHA+CisgICAgVGhlIGNvbnN0cnVjdG9yIHRoZW4gY3JlYXRlcyBhIHtAbGluayBhbmRyb2lkLnRlc3QubW9jay5Nb2NrQ29udGVudFJlc29sdmVyfSB0byB1c2UgYXMgdGhlCisgICAgcmVzb2x2ZXIgZm9yIHRoZSB0ZXN0LiBUaGUge0BsaW5rIGFuZHJvaWQudGVzdC5tb2NrLk1vY2tDb250ZW50UmVzb2x2ZXJ9IGNsYXNzIGlzIGRlc2NyaWJlZCBpbgorICAgIGRldGFpbCBpbiB0aGUgc2VjdGlvbgorICAgIDxhIGhyZWY9IntAZG9jUm9vdH1ndWlkZS90b3BpY3MvdGVzdGluZy90ZXN0X2FuZHJvaWQjTW9ja09iamVjdENsYXNzZXMiPk1vY2sgb2JqZWN0IGNsYXNzZXM8L2E+LgorPC9wPgorPHA+CisgICAgTGFzdGx5LCB0aGUgY29uc3RydWN0b3IgY3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgcHJvdmlkZXIgdW5kZXIgdGVzdC4gVGhpcyBpcyBhIG5vcm1hbAorICAgIHtAbGluayBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFByb3ZpZGVyfSBvYmplY3QsIGJ1dCBpdCB0YWtlcyBhbGwgb2YgaXRzIGVudmlyb25tZW50IGluZm9ybWF0aW9uCisgICAgZnJvbSB0aGUge0BsaW5rIGFuZHJvaWQudGVzdC5Jc29sYXRlZENvbnRleHR9LCBzbyBpdCBpcyByZXN0cmljdGVkIHRvCisgICAgd29ya2luZyBpbiB0aGUgaXNvbGF0ZWQgdGVzdCBlbnZpcm9ubWVudC4gQWxsIG9mIHRoZSB0ZXN0cyBkb25lIGluIHRoZSB0ZXN0IGNhc2UgY2xhc3MgcnVuCisgICAgYWdhaW5zdCB0aGlzIGlzb2xhdGVkIG9iamVjdC4KKzwvcD4KKzxoMyBpZD0iTW9ja09iamVjdHMiPk1vY2sgb2JqZWN0IGNsYXNzZXM8L2gzPgorPHA+CisgICAge0BsaW5rIGFuZHJvaWQudGVzdC5Qcm92aWRlclRlc3RDYXNlMn0gdXNlcyB7QGxpbmsgYW5kcm9pZC50ZXN0Lklzb2xhdGVkQ29udGV4dH0gYW5kCisgICAge0BsaW5rIGFuZHJvaWQudGVzdC5tb2NrLk1vY2tDb250ZW50UmVzb2x2ZXJ9LCB3aGljaCBhcmUgc3RhbmRhcmQgbW9jayBvYmplY3QgY2xhc3Nlcy4gVG8KKyAgICBsZWFybiBtb3JlIGFib3V0IHRoZW0sIHBsZWFzZSByZWFkCisgICAgPGEgaHJlZj0ie0Bkb2NSb290fWd1aWRlL3RvcGljcy90ZXN0aW5nL3Rlc3RfYW5kcm9pZCNNb2NrT2JqZWN0Q2xhc3NlcyI+CisgICAgVGVzdGluZyBGdW5kYW1lbnRhbHM8L2E+LgorPC9wPgorPGgyIGlkPSJXaGF0VG9UZXN0Ij5XaGF0IFRvIFRlc3Q8L2gyPgorPHA+CisgICAgVGhlIHRvcGljIDxhIGhyZWY9IntAZG9jUm9vdH1ndWlkZS90b3BpY3MvdGVzdGluZy93aGF0X3RvX3Rlc3QuaHRtbCI+V2hhdCBUbyBUZXN0PC9hPgorICAgIGxpc3RzIGdlbmVyYWwgY29uc2lkZXJhdGlvbnMgZm9yIHRlc3RpbmcgQW5kcm9pZCBjb21wb25lbnRzLgorICAgIEhlcmUgYXJlIHNvbWUgc3BlY2lmaWMgZ3VpZGVsaW5lcyBmb3IgdGVzdGluZyBjb250ZW50IHByb3ZpZGVycy4KKzwvcD4KKzx1bD4KKyAgICA8bGk+CisgICAgICAgIFRlc3Qgd2l0aCByZXNvbHZlciBtZXRob2RzOiBFdmVuIHRob3VnaCB5b3UgY2FuIGluc3RhbnRpYXRlIGEgcHJvdmlkZXIgb2JqZWN0IGluCisgICAgICAgIHtAbGluayBhbmRyb2lkLnRlc3QuUHJvdmlkZXJUZXN0Q2FzZTJ9LCB5b3Ugc2hvdWxkIGFsd2F5cyB0ZXN0IHdpdGggYSByZXNvbHZlciBvYmplY3QKKyAgICAgICAgdXNpbmcgdGhlIGFwcHJvcHJpYXRlIFVSSS4gVGhpcyBlbnN1cmVzIHRoYXQgeW91IGFyZSB0ZXN0aW5nIHRoZSBwcm92aWRlciB1c2luZyB0aGUgc2FtZQorICAgICAgICBpbnRlcmFjdGlvbiB0aGF0IGEgcmVndWxhciBhcHBsaWNhdGlvbiB3b3VsZCB1c2UuCisgICAgPC9saT4KKyAgICA8bGk+CisgICAgICAgIFRlc3QgYSBwdWJsaWMgcHJvdmlkZXIgYXMgYSBjb250cmFjdDogSWYgeW91IGludGVudCB5b3VyIHByb3ZpZGVyIHRvIGJlIHB1YmxpYyBhbmQKKyAgICAgICAgYXZhaWxhYmxlIHRvIG90aGVyIGFwcGxpY2F0aW9ucywgeW91IHNob3VsZCB0ZXN0IGl0IGFzIGEgY29udHJhY3QuIFRoaXMgaW5jbHVkZXMKKyAgICAgICAgdGhlIGZvbGxvd2luZyBpZGVhczoKKyAgICAgICAgPHVsPgorICAgICAgICAgICAgPGxpPgorICAgICAgICAgICAgICAgIFRlc3Qgd2l0aCBjb25zdGFudHMgdGhhdCB5b3VyIHByb3ZpZGVyIHB1YmxpY2x5IGV4cG9zZXMuIEZvcgorICAgICAgICAgICAgICAgIGV4YW1wbGUsIGxvb2sgZm9yIGNvbnN0YW50cyB0aGF0IHJlZmVyIHRvIGNvbHVtbiBuYW1lcyBpbiBvbmUgb2YgdGhlIHByb3ZpZGVyJ3MKKyAgICAgICAgICAgICAgICBkYXRhIHRhYmxlcy4gVGhlc2Ugc2hvdWxkIGFsd2F5cyBiZSBjb25zdGFudHMgcHVibGljbHkgZGVmaW5lZCBieSB0aGUgcHJvdmlkZXIuCisgICAgICAgICAgICA8L2xpPgorICAgICAgICAgICAgPGxpPgorICAgICAgICAgICAgICAgIFRlc3QgYWxsIHRoZSBVUklzIG9mZmVyZWQgYnkgeW91ciBwcm92aWRlci4gWW91ciBwcm92aWRlciBtYXkgb2ZmZXIgc2V2ZXJhbCBVUklzLAorICAgICAgICAgICAgICAgIGVhY2ggb25lIHJlZmVycmluZyB0byBhIGRpZmZlcmVudCBhc3BlY3Qgb2YgdGhlIGRhdGEuIFRoZQorICAgICAgICAgICAgICAgIDxhIGhyZWY9IntAZG9jUm9vdH1yZXNvdXJjZXMvc2FtcGxlcy9Ob3RlUGFkL2luZGV4Lmh0bWwiPk5vdGUgUGFkPC9hPiBzYW1wbGUsCisgICAgICAgICAgICAgICAgZm9yIGV4YW1wbGUsIGZlYXR1cmVzIGEgcHJvdmlkZXIgdGhhdCBvZmZlcnMgb25lIFVSSSBmb3IgcmV0cmlldmluZyBhIGxpc3Qgb2Ygbm90ZXMsCisgICAgICAgICAgICAgICAgYW5vdGhlciBmb3IgcmV0cmlldmluZyBhbiBpbmRpdmlkdWFsIG5vdGUgYnkgaXQncyBkYXRhYmFzZSBJRCwgYW5kIGEgdGhpcmQgZm9yCisgICAgICAgICAgICAgICAgZGlzcGxheWluZyBub3RlcyBpbiBhIGxpdmUgZm9sZGVyLiBUaGUgc2FtcGxlIHRlc3QgcGFja2FnZSBmb3IgTm90ZSBQYWQsCisgICAgICAgICAgICAgICAgPGEgaHJlZj0ie0Bkb2NSb290fXJlc291cmNlcy9zYW1wbGVzL05vdGVQYWRUZXN0L2luZGV4Lmh0bWwiPiBOb3RlIFBhZCBUZXN0PC9hPiwgaGFzCisgICAgICAgICAgICAgICAgdW5pdCB0ZXN0cyBmb3IgdHdvIG9mIHRoZXNlIFVSSXMuCisgICAgICAgICAgICA8L2xpPgorICAgICAgICAgICAgPGxpPgorICAgICAgICAgICAgICAgIFRlc3QgaW52YWxpZCBVUklzOiBZb3VyIHVuaXQgdGVzdHMgc2hvdWxkIGRlbGliZXJhdGVseSBjYWxsIHRoZSBwcm92aWRlciB3aXRoIGFuCisgICAgICAgICAgICAgICAgaW52YWxpZCBVUkksIGFuZCBsb29rIGZvciBlcnJvcnMuIEdvb2QgcHJvdmlkZXIgZGVzaWduIGlzIHRvIHRocm93IGFuCisgICAgICAgICAgICAgICAgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGZvciBpbnZhbGlkIFVSSXMuCisKKyAgICAgICAgICAgIDwvbGk+CisgICAgICAgIDwvdWw+CisgICAgPC9saT4KKyAgICA8bGk+CisgICAgICAgIFRlc3QgdGhlIHN0YW5kYXJkIHByb3ZpZGVyIGludGVyYWN0aW9uczogTW9zdCBwcm92aWRlcnMgb2ZmZXIgc2l4IGFjY2VzcyBtZXRob2RzOgorICAgICAgICBxdWVyeSwgaW5zZXJ0LCBkZWxldGUsIHVwZGF0ZSwgZ2V0VHlwZSwgYW5kIG9uQ3JlYXRlKCkuIFlvdXIgdGVzdHMgc2hvdWxkIHZlcmlmeSB0aGF0IGFsbAorICAgICAgICBvZiB0aGVzZSBtZXRob2RzIHdvcmsuIFRoZXNlIGFyZSBkZXNjcmliZWQgaW4gbW9yZSBkZXRhaWwgaW4gdGhlIHRvcGljCisgICAgICAgIDxhIGhyZWY9IntAZG9jUm9vdH1ndWlkZS90b3BpY3MvcHJvdmlkZXJzL2NvbnRlbnQtcHJvdmlkZXJzLmh0bWwiPkNvbnRlbnQgUHJvdmlkZXJzPC9hPi4KKyAgICA8L2xpPgorICAgIDxsaT4KKyAgICAgICAgVGVzdCBidXNpbmVzcyBsb2dpYzogRG9uJ3QgZm9yZ2V0IHRvIHRlc3QgdGhlIGJ1c2luZXNzIGxvZ2ljIHRoYXQgeW91ciBwcm92aWRlciBzaG91bGQKKyAgICAgICAgZW5mb3JjZS4gQnVzaW5lc3MgbG9naWMgaW5jbHVkZXMgaGFuZGxpbmcgb2YgaW52YWxpZCB2YWx1ZXMsIGZpbmFuY2lhbCBvciBhcml0aG1ldGljCisgICAgICAgIGNhbGN1bGF0aW9ucywgZWxpbWluYXRpb24gb3IgY29tYmluaW5nIG9mIGR1cGxpY2F0ZXMsIGFuZCBzbyBmb3J0aC4gQSBjb250ZW50IHByb3ZpZGVyCisgICAgICAgIGRvZXMgbm90IGhhdmUgdG8gaGF2ZSBidXNpbmVzcyBsb2dpYywgYmVjYXVzZSBpdCBtYXkgYmUgaW1wbGVtZW50ZWQgYnkgYWN0aXZpdGllcyB0aGF0CisgICAgICAgIG1vZGlmeSB0aGUgZGF0YS4gSWYgdGhlIHByb3ZpZGVyIGRvZXMgaW1wbGVtZW50IGJ1c2luZXNzIGxvZ2ljLCB5b3Ugc2hvdWxkIHRlc3QgaXQuCisgICAgPC9saT4KKzwvdWw+Cis8aDIgaWQ9Ik5leHRTdGVwcyI+TmV4dCBTdGVwczwvaDI+Cis8cD4KKyAgICBUbyBsZWFybiBob3cgdG8gc2V0IHVwIGFuZCBydW4gdGVzdHMgaW4gRWNsaXBzZSwgcGxlYXNlIHJlZmVyIHRvIDxhCisgICAgaHJlZj0ie0Bkb2NSb290fWd1aWRlL2RldmVsb3BpbmcvdGVzdGluZy90ZXN0aW5nX2VjbGlwc2UuaHRtbCI+VGVzdGluZyBpbgorICAgIEVjbGlwc2UsIHdpdGggQURUPC9hPi4gSWYgeW91J3JlIG5vdCB3b3JraW5nIGluIEVjbGlwc2UsIHJlZmVyIHRvIDxhCisgICAgaHJlZj0ie0Bkb2NSb290fWd1aWRlL2RldmVsb3BpbmcvdGVzdGluZy90ZXN0aW5nX290aGVyaWRlLmh0bWwiPlRlc3RpbmcgaW4gT3RoZXIKKyAgICBJREVzPC9hPi4KKzwvcD4KKzxwPgorICAgIElmIHlvdSB3YW50IGEgc3RlcC1ieS1zdGVwIGludHJvZHVjdGlvbiB0byB0ZXN0aW5nIGFjdGl2aXRpZXMsIHRyeSBvbmUgb2YgdGhlCisgICAgdGVzdGluZyB0dXRvcmlhbHM6Cis8L3A+Cis8dWw+CisgICAgPGxpPgorICAgICAgICBUaGUgPGEKKyAgICAgICAgaHJlZj0ie0Bkb2NSb290fXJlc291cmNlcy90dXRvcmlhbHMvdGVzdGluZy9oZWxsb2FuZHJvaWRfdGVzdC5odG1sIj5IZWxsbywKKyAgICAgICAgVGVzdGluZzwvYT4gdHV0b3JpYWwgaW50cm9kdWNlcyBiYXNpYyB0ZXN0aW5nIGNvbmNlcHRzIGFuZCBwcm9jZWR1cmVzIGluIHRoZQorICAgICAgICBjb250ZXh0IG9mIHRoZSBIZWxsbywgV29ybGQgYXBwbGljYXRpb24uCisgICAgPC9saT4KKyAgICA8bGk+CisgICAgICAgIFRoZSA8YQorICAgICAgICBocmVmPSJ7QGRvY1Jvb3R9cmVzb3VyY2VzL3R1dG9yaWFscy90ZXN0aW5nL2FjdGl2aXR5X3Rlc3QuaHRtbCI+QWN0aXZpdHkKKyAgICAgICAgVGVzdGluZzwvYT4gdHV0b3JpYWwgaXMgYW4gZXhjZWxsZW50IGZvbGxvdy11cCB0byB0aGUgSGVsbG8sIFRlc3RpbmcgdHV0b3JpYWwuCisgICAgICAgIEl0IGd1aWRlcyB5b3UgdGhyb3VnaCBhIG1vcmUgY29tcGxleCB0ZXN0aW5nIHNjZW5hcmlvIHRoYXQgeW91IGRldmVsb3AgYWdhaW5zdCBhCisgICAgICAgIG1vcmUgcmVhbGlzdGljIGFjdGl2aXR5LW9yaWVudGVkIGFwcGxpY2F0aW9uLgorICAgIDwvbGk+Cis8L3VsPgpkaWZmIC0tZ2l0IGEvZG9jcy9odG1sL2d1aWRlL3RvcGljcy90ZXN0aW5nL2luZGV4LmpkIGIvZG9jcy9odG1sL2d1aWRlL3RvcGljcy90ZXN0aW5nL2luZGV4LmpkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkyZWQ1YTcKLS0tIC9kZXYvbnVsbAorKysgYi9kb2NzL2h0bWwvZ3VpZGUvdG9waWNzL3Rlc3RpbmcvaW5kZXguamQKQEAgLTAsMCArMSw4MCBAQAorcGFnZS50aXRsZT1UZXN0aW5nCitAamQ6Ym9keQorPHA+CisgICAgVGhlIEFuZHJvaWQgZGV2ZWxvcG1lbnQgZW52aXJvbm1lbnQgaW5jbHVkZXMgYW4gaW50ZWdyYXRlZCB0ZXN0aW5nIGZyYW1ld29yayB0aGF0IGhlbHBzIHlvdQorICAgIHRlc3QgYWxsIGFzcGVjdHMgb2YgeW91ciBhcHBsaWNhdGlvbi4KKzwvcD4KKzxoND5GdW5kYW1lbnRhbHM8L2g0PgorPHA+CisgICAgVG8gc3RhcnQgbGVhcm5pbmcgaG93IHRvIHVzZSB0aGUgZnJhbWV3b3JrIHRvIGNyZWF0ZSB0ZXN0cyBmb3IgeW91ciBhcHBsaWNhdGlvbnMsIHBsZWFzZQorICAgIHJlYWQgdGhlIHRvcGljIDxhIGhyZWY9IntAZG9jUm9vdH1ndWlkZS90b3BpY3MvdGVzdGluZy90ZXN0aW5nX2FuZHJvaWQuaHRtbCI+CisgICAgVGVzdGluZyBGdW5kYW1lbnRhbHM8L2E+LgorPC9wPgorPGg0PkNvbmNlcHRzPC9oND4KKzx1bD4KKyAgICA8bGk+CisgICAgICAgIFRlc3RpbmcgVG9vbHMgZGVzY3JpYmVzIHRoZSBFY2xpcHNlIHdpdGggQURUIGFuZCBjb21tYW5kLWxpbmUgdG9vbHMgeW91IHVzZSB0byB0ZXN0CisgICAgICAgIEFuZHJvaWQgYXBwbGljYXRpb25zLgorICAgIDwvbGk+CisgICAgPGxpPgorICAgICAgICBXaGF0IHRvIFRlc3QgaXMgYW4gb3ZlcnZpZXcgb2YgdGhlIHR5cGVzIG9mIHRlc3RpbmcgeW91IHNob3VsZCBkby4gSXQgZm9jdXNlcyBvbiB0ZXN0aW5nCisgICAgICAgIHN5c3RlbS13aWRlIGFzcGVjdHMgb2YgQW5kcm9pZCB0aGF0IGNhbiBhZmZlY3QgZXZlcnkgY29tcG9uZW50IGluIHlvdXIgYXBwbGljYXRpb24uCisgICAgPC9saT4KKyAgICA8bGk+CisgICAgICAgIDxhIGhyZWY9IntAZG9jUm9vdH1ndWlkZS90b3BpY3MvdGVzdGluZy9hY3Rpdml0eV90ZXN0aW5nLmh0bWwiPgorICAgICAgICBBY3Rpdml0eSBUZXN0aW5nPC9hPiBmb2N1c2VzIG9uIHRlc3RpbmcgYWN0aXZpdGllcy4gSXQgZGVzY3JpYmVzIGhvdyBpbnN0cnVtZW50YXRpb24gYWxsb3dzCisgICAgICAgIHlvdSB0byBjb250cm9sIGFjdGl2aXRpZXMgb3V0c2lkZSB0aGUgbm9ybWFsIGFwcGxpY2F0aW9uIGxpZmVjeWNsZS4gSXQgYWxzbyBsaXN0cworICAgICAgICBhY3Rpdml0eS1zcGVjaWZpYyBmZWF0dXJlcyB5b3Ugc2hvdWxkIHRlc3QsIGFuZCBpdCBwcm92aWRlcyB0aXBzIGZvciB0ZXN0aW5nIEFuZHJvaWQKKyAgICAgICAgdXNlciBpbnRlcmZhY2VzLgorICAgIDwvbGk+CisgICAgPGxpPgorICAgICAgICA8YSBocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvdG9waWNzL3Rlc3RpbmcvY29udGVudHByb3ZpZGVyX3Rlc3RpbmcuaHRtbCI+CisgICAgICAgIENvbnRlbnQgUHJvdmlkZXIgVGVzdGluZzwvYT4gZm9jdXNlcyBvbiB0ZXN0aW5nIGNvbnRlbnQgcHJvdmlkZXJzLiBJdCBkZXNjcmliZXMgdGhlCisgICAgICAgIG1vY2sgc3lzdGVtIG9iamVjdHMgeW91IGNhbiB1c2UsIHByb3ZpZGVzIHRpcHMgZm9yIGRlc2lnbmluZyBwcm92aWRlcnMgc28gdGhhdCB0aGV5CisgICAgICAgIGNhbiBiZSB0ZXN0ZWQsIGFuZCBsaXN0cyBwcm92aWRlci1zcGVjaWZpYyBmZWF0dXJlcyB5b3Ugc2hvdWxkIHRlc3QuCisgICAgPC9saT4KKyAgICA8bGk+CisgICAgICAgIDxhIGhyZWY9IntAZG9jUm9vdH1ndWlkZS90b3BpY3MvdGVzdGluZy9zZXJ2aWNlX3Rlc3RpbmcuaHRtbCI+CisgICAgICAgIFNlcnZpY2UgVGVzdGluZzwvYT4gZm9jdXNlcyBvbiB0ZXN0aW5nIHNlcnZpY2VzLiBJdCBhbHNvIGxpc3RzIHNlcnZpY2Utc3BlY2lmaWMgZmVhdHVyZXMKKyAgICAgICAgeW91IHNob3VsZCB0ZXN0LgorICAgIDwvbGk+Cis8L3VsPgorPGg0PlByb2NlZHVyZXM8L2g0PgorPHVsPgorICAgIDxsaT4KKyAgICAgICAgVGhlIHRvcGljIDxhIGhyZWY9IntAZG9jUm9vdH1ndWlkZS9kZXZlbG9waW5nL3Rlc3RpbmcvdGVzdGluZ19lY2xpcHNlLmh0bWwiPgorICAgICAgICBUZXN0aW5nIGluIEVjbGlwc2UsIHdpdGggQURUPC9hPiBkZXNjcmliZXMgaG93IHRvIGNyZWF0ZSBhbmQgcnVuIHRlc3RzIGluIEVjbGlwc2Ugd2l0aCBBRFQuCisgICAgPC9saT4KKyAgICA8bGk+CisgICAgICAgIFRoZSB0b3BpYyA8YSBocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvZGV2ZWxvcGluZy90ZXN0aW5nL3Rlc3Rpbmdfb3RoZXJpZGUuaHRtbCI+CisgICAgICAgIFRlc3RpbmcgaW4gb3RoZXIgSURFczwvYT4gZGVzY3JpYmVzIGhvdyB0byBjcmVhdGUgYW5kIHJ1biB0ZXN0cyB3aXRoIGNvbW1hbmQtbGluZSB0b29scy4KKyAgICA8L2xpPgorPC91bD4KKzxoND5UdXRvcmlhbHM8L2g0PgorPHVsPgorICAgIDxsaT4KKyAgICAgICAgVGhlIDxhIGhyZWY9IntAZG9jUm9vdH1yZXNvdXJjZXMvdHV0b3JpYWxzL3Rlc3RpbmcvaGVsbG9hbmRyb2lkX3Rlc3QuaHRtbCI+CisgICAgICAgIEhlbGxvLCBUZXN0aW5nPC9hPiB0dXRvcmlhbCBpbnRyb2R1Y2VzIGJhc2ljIHRlc3RpbmcgY29uY2VwdHMgYW5kIHByb2NlZHVyZXMuCisgICAgPC9saT4KKyAgICA8bGk+CisgICAgICAgIEZvciBhIG1vcmUgYWR2YW5jZWQgdHV0b3JpYWwsIHRyeQorICAgICAgICA8YSBocmVmPSJ7QGRvY1Jvb3R9cmVzb3VyY2VzL3R1dG9yaWFscy90ZXN0aW5nL2FjdGl2aXR5X3Rlc3QuaHRtbCI+QWN0aXZpdHkgVGVzdGluZzwvYT4sCisgICAgICAgIHdoaWNoIGd1aWRlcyB5b3UgdGhyb3VnaCBhIG1vcmUgY29tcGxleCB0ZXN0aW5nIHNjZW5hcmlvLgorICAgIDwvbGk+Cis8L3VsPgorPGg0PlNhbXBsZXM8L2g0PgorPHVsPgorICAgIDxsaT4KKyAgICAgICAgPGEgaHJlZj0ie0Bkb2NSb290fXJlc291cmNlcy9zYW1wbGVzL05vdGVQYWRUZXN0Lmh0bWwiPk5vdGUgUGFkIFByb3ZpZGVyCisgICAgICAgIFRlc3Q8L2E+IGlzIGEgdGVzdCBwYWNrYWdlIGZvciB0aGUKKyAgICAgICAgPGEgaHJlZj0ie0Bkb2NSb290fXJlc291cmNlcy9zYW1wbGVzL05vdGVQYWQuaHRtbCI+Tm90ZSBQYWQ8L2E+IHNhbXBsZQorICAgICAgICBhcHBsaWNhdGlvbi4gSXQgcHJvdmlkZXMgYSBzaW1wbGUgZXhhbXBsZSBvZiB1bml0IHRlc3RpbmcKKyAgICAgICAgYSB7QGxpbmsgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRQcm92aWRlcn0uCisgICAgPC9saT4KKyAgICA8bGk+CisgICAgICAgIFRoZSA8YSBocmVmPSJ7QGRvY1Jvb3R9cmVzb3VyY2VzL3NhbXBsZXMvQWxhcm1TZXJ2aWNlVGVzdC5odG1sIj5BbGFybSBTZXJ2aWNlIFRlc3Q8L2E+CisgICAgICAgIGlzIGEgdGVzdCBwYWNrYWdlIGZvciB0aGUgPGEgaHJlZj0ie0Bkb2NSb290fXJlc291cmNlcy9zYW1wbGVzL0FsYXJtLmh0bWwiPkFsYXJtPC9hPgorICAgICAgICBzYW1wbGUgYXBwbGljYXRpb24uIEl0IHByb3ZpZGVzIGEgc2ltcGxlIGV4YW1wbGUgb2YgdW5pdAorICAgICAgICB0ZXN0aW5nIGEge0BsaW5rIGFuZHJvaWQuYXBwLlNlcnZpY2V9LgorICAgIDwvbGk+Cis8L3VsPgpkaWZmIC0tZ2l0IGEvZG9jcy9odG1sL2d1aWRlL3RvcGljcy90ZXN0aW5nL3NlcnZpY2VfdGVzdGluZy5qZCBiL2RvY3MvaHRtbC9ndWlkZS90b3BpY3MvdGVzdGluZy9zZXJ2aWNlX3Rlc3RpbmcuamQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzk3OWYzYwotLS0gL2Rldi9udWxsCisrKyBiL2RvY3MvaHRtbC9ndWlkZS90b3BpY3MvdGVzdGluZy9zZXJ2aWNlX3Rlc3RpbmcuamQKQEAgLTAsMCArMSwxNzggQEAKK3BhZ2UudGl0bGU9U2VydmljZSBUZXN0aW5nCitAamQ6Ym9keQorCis8ZGl2IGlkPSJxdi13cmFwcGVyIj4KKyAgPGRpdiBpZD0icXYiPgorICA8aDI+SW4gdGhpcyBkb2N1bWVudDwvaDI+CisgIDxvbD4KKyAgICA8bGk+CisgICAgICAgIDxhIGhyZWY9IiNEZXNpZ25BbmRUZXN0Ij5TZXJ2aWNlIERlc2lnbiBhbmQgVGVzdGluZzwvYT4KKyAgICA8L2xpPgorICAgIDxsaT4KKyAgICAgICAgPGEgaHJlZj0iI1NlcnZpY2VUZXN0Q2FzZSI+U2VydmljZVRlc3RDYXNlPC9hPgorICAgIDwvbGk+CisgICAgPGxpPgorICAgICAgICA8YSBocmVmPSIjTW9ja09iamVjdHMiPk1vY2sgb2JqZWN0IGNsYXNzZXM8L2E+CisgICAgPC9saT4KKyAgICA8bGk+CisgICAgICAgIDxhIGhyZWY9IiNUZXN0QXJlYXMiPldoYXQgdG8gVGVzdDwvYT4KKyAgICA8L2xpPgorICA8L29sPgorICA8aDI+S2V5IENsYXNzZXM8L2gyPgorICAgIDxvbD4KKyAgICAgIDxsaT57QGxpbmsgYW5kcm9pZC50ZXN0Lkluc3RydW1lbnRhdGlvblRlc3RSdW5uZXJ9PC9saT4KKyAgICAgIDxsaT57QGxpbmsgYW5kcm9pZC50ZXN0LlNlcnZpY2VUZXN0Q2FzZX08L2xpPgorICAgICAgPGxpPntAbGluayBhbmRyb2lkLnRlc3QubW9jay5Nb2NrQXBwbGljYXRpb259PC9saT4KKyAgICAgIDxsaT57QGxpbmsgYW5kcm9pZC50ZXN0LlJlbmFtaW5nRGVsZWdhdGluZ0NvbnRleHR9PC9saT4KKyAgICA8L29sPgorICA8aDI+UmVsYXRlZCBUdXRvcmlhbHM8L2gyPgorICAgIDxvbD4KKyAgICAgICAgPGxpPgorICAgICAgICAgICAgPGEgaHJlZj0ie0Bkb2NSb290fXJlc291cmNlcy90dXRvcmlhbHMvdGVzdGluZy9oZWxsb2FuZHJvaWRfdGVzdC5odG1sIj4KKyAgICAgICAgICAgIEhlbGxvLCBUZXN0aW5nPC9hPgorICAgICAgICA8L2xpPgorICAgICAgICA8bGk+CisgICAgICAgICAgICA8YSBocmVmPSJ7QGRvY1Jvb3R9cmVzb3VyY2VzL3R1dG9yaWFscy90ZXN0aW5nL2FjdGl2aXR5X3Rlc3QuaHRtbCI+QWN0aXZpdHkgVGVzdGluZzwvYT4KKyAgICAgICAgPC9saT4KKyAgICA8L29sPgorICA8aDI+U2VlIEFsc288L2gyPgorICAgICAgPG9sPgorICAgICAgICA8bGk+CisgICAgICAgICAgPGEgaHJlZj0ie0Bkb2NSb290fWd1aWRlL2RldmVsb3BpbmcvdGVzdGluZy90ZXN0aW5nX2VjbGlwc2UuaHRtbCI+CisgICAgICAgICAgVGVzdGluZyBpbiBFY2xpcHNlLCB3aXRoIEFEVDwvYT4KKyAgICAgICAgPC9saT4KKyAgICAgICAgPGxpPgorICAgICAgICAgIDxhIGhyZWY9IntAZG9jUm9vdH1ndWlkZS9kZXZlbG9waW5nL3Rlc3RpbmcvdGVzdGluZ19vdGhlcmlkZS5odG1sIj4KKyAgICAgICAgICBUZXN0aW5nIGluIE90aGVyIElERXM8L2E+CisgICAgICAgIDwvbGk+CisgICAgICA8L29sPgorICA8L2Rpdj4KKzwvZGl2PgorPHA+CisgICAgQW5kcm9pZCBwcm92aWRlcyBhIHRlc3RpbmcgZnJhbWV3b3JrIGZvciBTZXJ2aWNlIG9iamVjdHMgdGhhdCBjYW4gcnVuIHRoZW0gaW4KKyAgICBpc29sYXRpb24gYW5kIHByb3ZpZGVzIG1vY2sgb2JqZWN0cy4gVGhlIHRlc3QgY2FzZSBjbGFzcyBmb3IgU2VydmljZSBvYmplY3RzIGlzCisgICAge0BsaW5rIGFuZHJvaWQudGVzdC5TZXJ2aWNlVGVzdENhc2V9LiBTaW5jZSB0aGUgU2VydmljZSBjbGFzcyBhc3N1bWVzIHRoYXQgaXQgaXMgc2VwYXJhdGUKKyAgICBmcm9tIGl0cyBjbGllbnRzLCB5b3UgY2FuIHRlc3QgYSBTZXJ2aWNlIG9iamVjdCB3aXRob3V0IHVzaW5nIGluc3RydW1lbnRhdGlvbi4KKzwvcD4KKzxwPgorICAgIFRoaXMgZG9jdW1lbnQgZGVzY3JpYmVzIHRlY2huaXF1ZXMgZm9yIHRlc3RpbmcgU2VydmljZSBvYmplY3RzLiBJZiB5b3UgYXJlbid0IGZhbWlsaWFyIHdpdGggdGhlCisgICAgU2VydmljZSBjbGFzcywgcGxlYXNlIHJlYWQgPGEgaHJlZj0ie0Bkb2NSb290fWd1aWRlL3RvcGljcy9mdW5kYW1lbnRhbHMuaHRtbCI+CisgICAgQXBwbGljYXRpb24gRnVuZGFtZW50YWxzPC9hPi4gSWYgeW91IGFyZW4ndCBmYW1pbGlhciB3aXRoIEFuZHJvaWQgdGVzdGluZywgcGxlYXNlIHJlYWQKKyAgICA8YSBocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvdG9waWNzL3Rlc3RpbmcvdGVzdGluZ19hbmRyb2lkLmh0bWwiPlRlc3RpbmcgRnVuZGFtZW50YWxzPC9hPiwKKyAgICB0aGUgaW50cm9kdWN0aW9uIHRvIHRoZSBBbmRyb2lkIHRlc3RpbmcgYW5kIGluc3RydW1lbnRhdGlvbiBmcmFtZXdvcmsuCis8L3A+Cis8aDIgaWQ9IkRlc2lnbkFuZFRlc3QiPlNlcnZpY2UgRGVzaWduIGFuZCBUZXN0aW5nPC9oMj4KKzxwPgorICAgIFdoZW4geW91IGRlc2lnbiBhIFNlcnZpY2UsIHlvdSBzaG91bGQgY29uc2lkZXIgaG93IHlvdXIgdGVzdHMgY2FuIGV4YW1pbmUgdGhlIHZhcmlvdXMgc3RhdGVzCisgICAgb2YgdGhlIFNlcnZpY2UgbGlmZWN5Y2xlLiBJZiB0aGUgbGlmZWN5Y2xlIG1ldGhvZHMgdGhhdCBzdGFydCB1cCB5b3VyIFNlcnZpY2UsIHN1Y2ggYXMKKyAgICB7QGxpbmsgYW5kcm9pZC5hcHAuU2VydmljZSNvbkNyZWF0ZSgpIG9uQ3JlYXRlKCl9IG9yCisgICAge0BsaW5rIGFuZHJvaWQuYXBwLlNlcnZpY2Ujb25TdGFydENvbW1hbmQoSW50ZW50LCBpbnQsIGludCkgb25TdGFydENvbW1hbmQoKX0gZG8gbm90IG5vcm1hbGx5CisgICAgc2V0IGEgZ2xvYmFsIHZhcmlhYmxlIHRvIGluZGljYXRlIHRoYXQgdGhleSB3ZXJlIHN1Y2Nlc3NmdWwsIHlvdSBtYXkgd2FudCB0byBwcm92aWRlIHN1Y2ggYQorICAgIHZhcmlhYmxlIGZvciB0ZXN0aW5nIHB1cnBvc2VzLgorPC9wPgorPHA+CisgICAgTW9zdCBvdGhlciB0ZXN0aW5nIGlzIGZhY2lsaXRhdGVkIGJ5IHRoZSBtZXRob2RzIGluIHRoZSB7QGxpbmsgYW5kcm9pZC50ZXN0LlNlcnZpY2VUZXN0Q2FzZX0KKyAgICB0ZXN0IGNhc2UgY2xhc3MuIEZvciBleGFtcGxlLCB0aGUge0BsaW5rIGFuZHJvaWQudGVzdC5TZXJ2aWNlVGVzdENhc2UjZ2V0U2VydmljZSgpfSBtZXRob2QKKyAgICByZXR1cm5zIGEgaGFuZGxlIHRvIHRoZSBTZXJ2aWNlIHVuZGVyIHRlc3QsIHdoaWNoIHlvdSBjYW4gdGVzdCB0byBjb25maXJtIHRoYXQgdGhlIFNlcnZpY2UgaXMKKyAgICBydW5uaW5nIGV2ZW4gYXQgdGhlIGVuZCBvZiB5b3VyIHRlc3RzLgorPC9wPgorPGgyIGlkPSJTZXJ2aWNlVGVzdENhc2UiPlNlcnZpY2VUZXN0Q2FzZTwvaDI+Cis8cD4KKyAgICB7QGxpbmsgYW5kcm9pZC50ZXN0LlNlcnZpY2VUZXN0Q2FzZX0gZXh0ZW5kcyB0aGUgSlVuaXQge0BsaW5rIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZX0gY2xhc3MKKyAgICB3aXRoIHdpdGggbWV0aG9kcyBmb3IgdGVzdGluZyBhcHBsaWNhdGlvbiBwZXJtaXNzaW9ucyBhbmQgZm9yIGNvbnRyb2xsaW5nIHRoZSBhcHBsaWNhdGlvbiBhbmQKKyAgICBTZXJ2aWNlIHVuZGVyIHRlc3QuIEl0IGFsc28gcHJvdmlkZXMgbW9jayBhcHBsaWNhdGlvbiBhbmQgQ29udGV4dCBvYmplY3RzIHRoYXQgaXNvbGF0ZSB5b3VyCisgICAgdGVzdCBmcm9tIHRoZSByZXN0IG9mIHRoZSBzeXN0ZW0uCis8L3A+Cis8cD4KKyAgICB7QGxpbmsgYW5kcm9pZC50ZXN0LlNlcnZpY2VUZXN0Q2FzZX0gZGVmZXJzIGluaXRpYWxpemF0aW9uIG9mIHRoZSB0ZXN0IGVudmlyb25tZW50IHVudGlsIHlvdQorICAgIGNhbGwge0BsaW5rIGFuZHJvaWQudGVzdC5TZXJ2aWNlVGVzdENhc2Ujc3RhcnRTZXJ2aWNlKEludGVudCkgU2VydmljZVRlc3RDYXNlLnN0YXJ0U2VydmljZSgpfSBvcgorICAgIHtAbGluayBhbmRyb2lkLnRlc3QuU2VydmljZVRlc3RDYXNlI2JpbmRTZXJ2aWNlKEludGVudCkgU2VydmljZVRlc3RDYXNlLmJpbmRTZXJ2aWNlKCl9LiBUaGlzCisgICAgYWxsb3dzIHlvdSB0byBzZXQgdXAgeW91ciB0ZXN0IGVudmlyb25tZW50LCBwYXJ0aWN1bGFybHkgeW91ciBtb2NrIG9iamVjdHMsIGJlZm9yZSB0aGUgU2VydmljZQorICAgIGlzIHN0YXJ0ZWQuCis8L3A+Cis8cD4KKyAgICBOb3RpY2UgdGhhdCB0aGUgcGFyYW1ldGVycyB0byA8Y29kZT5TZXJ2aWNlVGVzdENhc2UuYmluZFNlcnZpY2UoKTwvY29kZT5hcmUgZGlmZmVyZW50IGZyb20KKyAgICB0aG9zZSBmb3IgPGNvZGU+U2VydmljZS5iaW5kU2VydmljZSgpPC9jb2RlPi4gRm9yIHRoZSA8Y29kZT5TZXJ2aWNlVGVzdENhc2U8L2NvZGU+IHZlcnNpb24sCisgICAgeW91IG9ubHkgcHJvdmlkZSBhbiBJbnRlbnQuIEluc3RlYWQgb2YgcmV0dXJuaW5nIGEgYm9vbGVhbiwKKyAgICA8Y29kZT5TZXJ2aWNlVGVzdENhc2UuYmluZFNlcnZpY2UoKTwvY29kZT4gcmV0dXJucyBhbiBvYmplY3QgdGhhdCBzdWJjbGFzc2VzCisgICAge0BsaW5rIGFuZHJvaWQub3MuSUJpbmRlcn0uCis8L3A+Cis8cD4KKyAgICBUaGUge0BsaW5rIGFuZHJvaWQudGVzdC5TZXJ2aWNlVGVzdENhc2Ujc2V0VXAoKX0gbWV0aG9kIGZvciB7QGxpbmsgYW5kcm9pZC50ZXN0LlNlcnZpY2VUZXN0Q2FzZX0KKyAgICBpcyBjYWxsZWQgYmVmb3JlIGVhY2ggdGVzdC4gSXQgc2V0cyB1cCB0aGUgdGVzdCBmaXh0dXJlIGJ5IG1ha2luZyBhIGNvcHkgb2YgdGhlIGN1cnJlbnQgc3lzdGVtCisgICAgQ29udGV4dCBiZWZvcmUgYW55IHRlc3QgbWV0aG9kcyB0b3VjaCBpdC4gWW91IGNhbiByZXRyaWV2ZSB0aGlzIENvbnRleHQgYnkgY2FsbGluZworICAgIHtAbGluayBhbmRyb2lkLnRlc3QuU2VydmljZVRlc3RDYXNlI2dldFN5c3RlbUNvbnRleHQoKX0uIElmIHlvdSBvdmVycmlkZSB0aGlzIG1ldGhvZCwgeW91IG11c3QKKyAgICBjYWxsIDxjb2RlPnN1cGVyLnNldFVwKCk8L2NvZGU+IGFzIHRoZSBmaXJzdCBzdGF0ZW1lbnQgaW4gdGhlIG92ZXJyaWRlLgorPC9wPgorPHA+CisgICAgVGhlIG1ldGhvZHMge0BsaW5rIGFuZHJvaWQudGVzdC5TZXJ2aWNlVGVzdENhc2Ujc2V0QXBwbGljYXRpb24oQXBwbGljYXRpb24pIHNldEFwcGxpY2F0aW9uKCl9CisgICAgYW5kIHtAbGluayBhbmRyb2lkLnRlc3QuQW5kcm9pZFRlc3RDYXNlI3NldENvbnRleHQoQ29udGV4dCl9IHNldENvbnRleHQoKX0gYWxsb3cgeW91IHRvIHNldAorICAgIGEgbW9jayBDb250ZXh0IG9yIG1vY2sgQXBwbGljYXRpb24gKG9yIGJvdGgpIGZvciB0aGUgU2VydmljZSwgYmVmb3JlIHlvdSBzdGFydCBpdC4gVGhlc2UgbW9jaworICAgIG9iamVjdHMgYXJlIGRlc2NyaWJlZCBpbiA8YSBocmVmPSIjTW9ja09iamVjdHMiPk1vY2sgb2JqZWN0IGNsYXNzZXM8L2E+LgorPC9wPgorPHA+CisgICAgQnkgZGVmYXVsdCwge0BsaW5rIGFuZHJvaWQudGVzdC5TZXJ2aWNlVGVzdENhc2V9IHJ1bnMgdGhlIHRlc3QgbWV0aG9kCisgICAge0BsaW5rIGFuZHJvaWQudGVzdC5BbmRyb2lkVGVzdENhc2UjdGVzdEFuZHJvaWRUZXN0Q2FzZVNldHVwUHJvcGVybHkoKX0sIHdoaWNoIGFzc2VydHMgdGhhdAorICAgIHRoZSBiYXNlIHRlc3QgY2FzZSBjbGFzcyBzdWNjZXNzZnVsbHkgc2V0IHVwIGEgQ29udGV4dCBiZWZvcmUgcnVubmluZy4KKzwvcD4KKzxoMiBpZD0iTW9ja09iamVjdHMiPk1vY2sgb2JqZWN0IGNsYXNzZXM8L2gyPgorPHA+CisgICAgPGNvZGU+U2VydmljZVRlc3RDYXNlPC9jb2RlPiBhc3N1bWVzIHRoYXQgeW91IHdpbGwgdXNlIGEgbW9jayBDb250ZXh0IG9yIG1vY2sgQXBwbGljYXRpb24KKyAgICAob3IgYm90aCkgZm9yIHRoZSB0ZXN0IGVudmlyb25tZW50LiBUaGVzZSBvYmplY3RzIGlzb2xhdGUgdGhlIHRlc3QgZW52aXJvbm1lbnQgZnJvbSB0aGUKKyAgICByZXN0IG9mIHRoZSBzeXN0ZW0uIElmIHlvdSBkb24ndCBwcm92aWRlIHlvdXIgb3duIGluc3RhbmNlcyBvZiB0aGVzZSBvYmplY3RzIGJlZm9yZSB5b3UKKyAgICBzdGFydCB0aGUgU2VydmljZSwgdGhlbiB7QGxpbmsgYW5kcm9pZC50ZXN0LlNlcnZpY2VUZXN0Q2FzZX0gd2lsbCBjcmVhdGUgaXRzIG93biBpbnRlcm5hbAorICAgIGluc3RhbmNlcyBhbmQgaW5qZWN0IHRoZW0gaW50byB0aGUgU2VydmljZS4gWW91IGNhbiBvdmVycmlkZSB0aGlzIGJlaGF2aW9yIGJ5IGNyZWF0aW5nIGFuZAorICAgIGluamVjdGluZyB5b3VyIG93biBpbnN0YW5jZXMgYmVmb3JlIHN0YXJ0aW5nIHRoZSBTZXJ2aWNlCis8L3A+Cis8cD4KKyAgICBUbyBpbmplY3QgYSBtb2NrIEFwcGxpY2F0aW9uIG9iamVjdCBpbnRvIHRoZSBTZXJ2aWNlIHVuZGVyIHRlc3QsIGZpcnN0IGNyZWF0ZSBhIHN1YmNsYXNzIG9mCisgICAge0BsaW5rIGFuZHJvaWQudGVzdC5tb2NrLk1vY2tBcHBsaWNhdGlvbn0uIDxjb2RlPk1vY2tBcHBsaWNhdGlvbjwvY29kZT4gaXMgYSBzdWJjbGFzcyBvZgorICAgIHtAbGluayBhbmRyb2lkLmFwcC5BcHBsaWNhdGlvbn0gaW4gd2hpY2ggYWxsIHRoZSBtZXRob2RzIHRocm93IGFuIEV4Y2VwdGlvbiwgc28gdG8gdXNlIGl0CisgICAgZWZmZWN0aXZlbHkgeW91IHN1YmNsYXNzIGl0IGFuZCBvdmVycmlkZSB0aGUgbWV0aG9kcyB5b3UgbmVlZC4gWW91IHRoZW4gaW5qZWN0IGl0IGludG8gdGhlCisgICAgU2VydmljZSB3aXRoIHRoZQorICAgIHtAbGluayBhbmRyb2lkLnRlc3QuU2VydmljZVRlc3RDYXNlI3NldEFwcGxpY2F0aW9uKEFwcGxpY2F0aW9uKSBzZXRBcHBsaWNhdGlvbigpfSBtZXRob2QuCisgICAgVGhpcyBtb2NrIG9iamVjdCBhbGxvd3MgeW91IHRvIGNvbnRyb2wgdGhlIGFwcGxpY2F0aW9uIHZhbHVlcyB0aGF0IHRoZSBTZXJ2aWNlIHNlZXMsIGFuZAorICAgIGlzb2xhdGVzIGl0IGZyb20gdGhlIHJlYWwgc3lzdGVtLiBJbiBhZGRpdGlvbiwgYW55IGhpZGRlbiBkZXBlbmRlbmNpZXMgeW91ciBTZXJ2aWNlIGhhcyBvbgorICAgIGl0cyBhcHBsaWNhdGlvbiByZXZlYWwgdGhlbXNlbHZlcyBhcyBleGNlcHRpb25zIHdoZW4geW91IHJ1biB0aGUgdGVzdC4KKzwvcD4KKzxwPgorICAgIFlvdSBpbmplY3QgYSBtb2NrIENvbnRleHQgaW50byB0aGUgU2VydmljZSB1bmRlciB0ZXN0IHdpdGggdGhlCisgICAge0BsaW5rIGFuZHJvaWQudGVzdC5BbmRyb2lkVGVzdENhc2Ujc2V0Q29udGV4dChDb250ZXh0KSBzZXRDb250ZXh0KCl9IG1ldGhvZC4gVGhlIG1vY2sKKyAgICBDb250ZXh0IGNsYXNzZXMgeW91IGNhbiB1c2UgYXJlIGRlc2NyaWJlZCBpbiBtb3JlIGRldGFpbCBpbgorICAgIDxhIGhyZWY9IntAZG9jUm9vdH1ndWlkZS90b3BpY3MvdGVzdGluZy90ZXN0aW5nX2FuZHJvaWQuaHRtbCNNb2NrT2JqZWN0Q2xhc3NlcyI+CisgICAgVGVzdGluZyBGdW5kYW1lbnRhbHM8L2E+LgorPC9wPgorPGgyIGlkPSJUZXN0QXJlYXMiPldoYXQgdG8gVGVzdDwvaDI+Cis8cD4KKyAgICBUaGUgdG9waWMgPGEgaHJlZj0ie0Bkb2NSb290fWd1aWRlL3RvcGljcy90ZXN0aW5nL3doYXRfdG9fdGVzdC5odG1sIj5XaGF0IFRvIFRlc3Q8L2E+CisgICAgbGlzdHMgZ2VuZXJhbCBjb25zaWRlcmF0aW9ucyBmb3IgdGVzdGluZyBBbmRyb2lkIGNvbXBvbmVudHMuCisgICAgSGVyZSBhcmUgc29tZSBzcGVjaWZpYyBndWlkZWxpbmVzIGZvciB0ZXN0aW5nIGEgU2VydmljZToKKzwvcD4KKzx1bD4KKyAgICA8bGk+CisgICAgICAgIEVuc3VyZSB0aGF0IHRoZSB7QGxpbmsgYW5kcm9pZC5hcHAuU2VydmljZSNvbkNyZWF0ZSgpfSBpcyBjYWxsZWQgaW4gcmVzcG9uc2UgdG8KKyAgICAgICAge0BsaW5rIGFuZHJvaWQuY29udGVudC5Db250ZXh0I3N0YXJ0U2VydmljZShJbnRlbnQpIENvbnRleHQuc3RhcnRTZXJ2aWNlKCl9IG9yCisgICAge0BsaW5rIGFuZHJvaWQuY29udGVudC5Db250ZXh0I2JpbmRTZXJ2aWNlKEludGVudCxTZXJ2aWNlQ29ubmVjdGlvbixpbnQpIENvbnRleHQuYmluZFNlcnZpY2UoKX0uCisgICAgICAgIFNpbWlsYXJseSwgeW91IHNob3VsZCBlbnN1cmUgdGhhdCB7QGxpbmsgYW5kcm9pZC5hcHAuU2VydmljZSNvbkRlc3Ryb3koKX0gaXMgY2FsbGVkIGluCisgICAgICAgIHJlc3BvbnNlIHRvIHtAbGluayBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCNzdG9wU2VydmljZShJbnRlbnQpIENvbnRleHQuc3RvcFNlcnZpY2UoKX0sCisgICAgICAgIHtAbGluayBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCN1bmJpbmRTZXJ2aWNlKFNlcnZpY2VDb25uZWN0aW9uKSBDb250ZXh0LnVuYmluZFNlcnZpY2UoKX0sCisgICAgICAgIHtAbGluayBhbmRyb2lkLmFwcC5TZXJ2aWNlI3N0b3BTZWxmKCl9LCBvcgorICAgICAgICB7QGxpbmsgYW5kcm9pZC5hcHAuU2VydmljZSNzdG9wU2VsZlJlc3VsdChpbnQpIHN0b3BTZWxmUmVzdWx0KCl9LgorICAgIDwvbGk+CisgICAgPGxpPgorICAgICAgICBUZXN0IHRoYXQgeW91ciBTZXJ2aWNlIGNvcnJlY3RseSBoYW5kbGVzIG11bHRpcGxlIGNhbGxzIGZyb20KKyAgICAgICAgPGNvZGU+Q29udGV4dC5zdGFydFNlcnZpY2UoKTwvY29kZT4uIE9ubHkgdGhlIGZpcnN0IGNhbGwgdHJpZ2dlcnMKKyAgICAgICAgPGNvZGU+U2VydmljZS5vbkNyZWF0ZSgpPC9jb2RlPiwgYnV0IGFsbCBjYWxscyB0cmlnZ2VyIGEgY2FsbCB0bworICAgICAgICA8Y29kZT5TZXJ2aWNlLm9uU3RhcnRDb21tYW5kKCk8L2NvZGU+LgorICAgICAgICA8cD4KKyAgICAgICAgICAgIEluIGFkZGl0aW9uLCByZW1lbWJlciB0aGF0IDxjb2RlPnN0YXJ0U2VydmljZSgpPC9jb2RlPiBjYWxscyBkb24ndAorICAgICAgICAgICAgbmVzdCwgc28gYSBzaW5nbGUgY2FsbCB0byA8Y29kZT5Db250ZXh0LnN0b3BTZXJ2aWNlKCk8L2NvZGU+IG9yCisgICAgICAgICAgICA8Y29kZT5TZXJ2aWNlLnN0b3BTZWxmKCk8L2NvZGU+IChidXQgbm90IDxjb2RlPnN0b3BTZWxmKGludCk8L2NvZGU+KQorICAgICAgICAgICAgd2lsbCBzdG9wIHRoZSBTZXJ2aWNlLiBZb3Ugc2hvdWxkIHRlc3QgdGhhdCB5b3VyIFNlcnZpY2Ugc3RvcHMgYXQgdGhlIGNvcnJlY3QgcG9pbnQuCisgICAgICAgIDwvcD4KKyAgICA8L2xpPgorICAgIDxsaT4KKyAgICAgICAgVGVzdCBhbnkgYnVzaW5lc3MgbG9naWMgdGhhdCB5b3VyIFNlcnZpY2UgaW1wbGVtZW50cy4gQnVzaW5lc3MgbG9naWMgaW5jbHVkZXMgY2hlY2tpbmcgZm9yCisgICAgICAgIGludmFsaWQgdmFsdWVzLCBmaW5hbmNpYWwgYW5kIGFyaXRobWV0aWMgY2FsY3VsYXRpb25zLCBhbmQgc28gZm9ydGguCisgICAgPC9saT4KKzwvdWw+CmRpZmYgLS1naXQgYS9kb2NzL2h0bWwvZ3VpZGUvdG9waWNzL3Rlc3RpbmcvdGVzdGluZ19hbmRyb2lkLmpkIGIvZG9jcy9odG1sL2d1aWRlL3RvcGljcy90ZXN0aW5nL3Rlc3RpbmdfYW5kcm9pZC5qZAppbmRleCA0NmJhNzY5Li41MTNlNDcyIDEwMDc1NQotLS0gYS9kb2NzL2h0bWwvZ3VpZGUvdG9waWNzL3Rlc3RpbmcvdGVzdGluZ19hbmRyb2lkLmpkCisrKyBiL2RvY3MvaHRtbC9ndWlkZS90b3BpY3MvdGVzdGluZy90ZXN0aW5nX2FuZHJvaWQuamQKQEAgLTEsNCArMSw0IEBACi1wYWdlLnRpdGxlPVRlc3RpbmcgYW5kIEluc3RydW1lbnRhdGlvbgorcGFnZS50aXRsZT1UZXN0aW5nIEZ1bmRhbWVudGFscwogQGpkOmJvZHkKIAogPGRpdiBpZD0icXYtd3JhcHBlciI+CkBAIC02LDY1ICs2LDYyIEBACiAgIDxoMj5JbiB0aGlzIGRvY3VtZW50PC9oMj4KICAgPG9sPgogICAgIDxsaT4KLSAgICAgICAgPGEgaHJlZj0iI092ZXJ2aWV3Ij5PdmVydmlldzwvYT4KKyAgICAgICAgPGEgaHJlZj0iI1Rlc3RTdHJ1Y3R1cmUiPlRlc3QgU3RydWN0dXJlPC9hPgorICAgIDwvbGk+CisgICAgPGxpPgorICAgICAgICA8YSBocmVmPSIjVGVzdFByb2plY3RzIj5UZXN0IFByb2plY3RzPC9hPgogICAgIDwvbGk+CiAgICAgPGxpPgogICAgICAgPGEgaHJlZj0iI1Rlc3RBUEkiPlRoZSBUZXN0aW5nIEFQSTwvYT4KICAgICAgIDxvbD4KICAgICAgICAgPGxpPgotICAgICAgICAgIDxhIGhyZWY9IiNFeHRlbnNpb25zIj5KVW5pdCB0ZXN0IGNhc2UgY2xhc3NlczwvYT4KKyAgICAgICAgICA8YSBocmVmPSIjSlVuaXQiPkpVbml0PC9hPgogICAgICAgICA8L2xpPgogICAgICAgICA8bGk+Ci0gICAgICAgICAgPGEgaHJlZj0iI0luc3RydW1lbnRhdGlvbiI+SW5zdHJ1bWVudGF0aW9uIHRlc3QgY2FzZSBjbGFzc2VzPC9hPgorICAgICAgICAgIDxhIGhyZWY9IiNJbnN0cnVtZW50YXRpb24iPkluc3RydW1lbnRhdGlvbjwvYT4KICAgICAgICAgPC9saT4KICAgICAgICAgPGxpPgotICAgICAgICAgIDxhIGhyZWY9IiNBc3NlcnQiPkFzc2VydCBjbGFzc2VzPC9hPgorICAgICAgICAgICAgPGEgaHJlZj0iI1Rlc3RDYXNlQ2xhc3NlcyI+VGVzdCBjYXNlIGNsYXNzZXM8L2E+CiAgICAgICAgIDwvbGk+CiAgICAgICAgIDxsaT4KLSAgICAgICAgICA8YSBocmVmPSIjTW9ja09iamVjdHMiPk1vY2sgb2JqZWN0IGNsYXNzZXM8L2E+CisgICAgICAgICAgPGEgaHJlZj0iI0Fzc2VydGlvbkNsYXNzZXMiPkFzc2VydGlvbiBjbGFzc2VzPC9hPgogICAgICAgICA8L2xpPgotICAgICAgICAgICAgPGxpPgotICAgICAgICAgICAgICAgIDxhIGhyZWY9IiNJbnN0cnVtZW50YXRpb25UZXN0UnVubmVyIj5JbnN0cnVtZW50YXRpb24gVGVzdCBSdW5uZXI8L2E+Ci0gICAgICAgICAgICA8L2xpPgorICAgICAgICA8bGk+CisgICAgICAgICAgPGEgaHJlZj0iI01vY2tPYmplY3RDbGFzc2VzIj5Nb2NrIG9iamVjdCBjbGFzc2VzPC9hPgorICAgICAgICA8L2xpPgogICAgICAgPC9vbD4KICAgICA8L2xpPgogICAgIDxsaT4KLSAgICAgPGEgaHJlZj0iI1Rlc3RFbnZpcm9tZW50Ij5Xb3JraW5nIGluIHRoZSBUZXN0IEVudmlyb25tZW50PC9hPgorICAgICAgICA8YSBocmVmPSIjSW5zdHJ1bWVudGF0aW9uVGVzdFJ1bm5lciI+UnVubmluZyBUZXN0czwvYT4KICAgICA8L2xpPgogICAgIDxsaT4KLSAgICAgICAgPGEgaHJlZj0iI1Rlc3RBcmVhcyI+V2hhdCB0byBUZXN0PC9hPgorICAgICAgICA8YSBocmVmPSIjVGVzdFJlc3VsdHMiPlNlZWluZyBUZXN0IFJlc3VsdHM8L2E+CiAgICAgPC9saT4KICAgICA8bGk+Ci0gICAgICA8YSBocmVmPSIjVUlUZXN0aW5nIj5BcHBlbmRpeDogVUkgVGVzdGluZyBOb3RlczwvYT4KLSAgICAgIDxvbD4KLSAgICAgICAgPGxpPgotICAgICAgICAgIDxhIGhyZWY9IiNSdW5PblVJVGhyZWFkIj5UZXN0aW5nIG9uIHRoZSBVSSB0aHJlYWQ8L2E+Ci0gICAgICAgIDwvbGk+Ci0gICAgICAgIDxsaT4KLSAgICAgICAgICA8YSBocmVmPSIjTm90b3VjaE1vZGUiPlR1cm5pbmcgb2ZmIHRvdWNoIG1vZGU8L2E+Ci0gICAgICAgIDwvbGk+Ci0gICAgICAgIDxsaT4KLSAgICAgICAgICA8YSBocmVmPSIjVW5sb2NrRGV2aWNlIj5VbmxvY2tpbmcgdGhlIEVtdWxhdG9yIG9yIERldmljZTwvYT4KLSAgICAgICAgPC9saT4KLSAgICAgICAgPGxpPgotICAgICAgICAgIDxhIGhyZWY9IiNVSVRlc3RUcm91Ymxlc2hvb3RpbmciPlRyb3VibGVzaG9vdGluZyBVSSB0ZXN0czwvYT4KLSAgICAgICAgPC9saT4KLSAgICAgIDwvb2w+CisgICAgICAgIDxhIGhyZWY9IiNNb25rZXlzIj5Nb25rZXkgYW5kIE1vbmtleVJ1bm5lcjwvYT4KKyAgICA8L2xpPgorICAgIDxsaT4KKyAgICAgICA8YSBocmVmPSIjUGFja2FnZU5hbWVzIj5Xb3JraW5nIFdpdGggUGFja2FnZSBOYW1lczwvYT4KKyAgICA8L2xpPgorICAgIDxsaT4KKyAgICAgICAgPGEgaHJlZj0iI1doYXRUb1Rlc3QiPldoYXQgVG8gVGVzdDwvYT4KKyAgICA8L2xpPgorICAgIDxsaT4KKyAgICAgICAgPGEgaHJlZj0iI05leHRTdGVwcyI+TmV4dCBTdGVwczwvYT4KICAgICA8L2xpPgogICA8L29sPgotICA8aDI+S2V5IENsYXNzZXM8L2gyPgorICA8aDI+S2V5IENsYXNzZXMgYW5kIFBhY2thZ2VzPC9oMj4KICAgICA8b2w+CiAgICAgICA8bGk+e0BsaW5rIGFuZHJvaWQudGVzdC5JbnN0cnVtZW50YXRpb25UZXN0UnVubmVyfTwvbGk+Ci0gICAgICA8bGk+e0BsaW5rIGFuZHJvaWQudGVzdC5BY3Rpdml0eUluc3RydW1lbnRhdGlvblRlc3RDYXNlMn08L2xpPgotICAgICAgPGxpPntAbGluayBhbmRyb2lkLnRlc3QuQWN0aXZpdHlVbml0VGVzdENhc2V9PC9saT4KLSAgICAgIDxsaT57QGxpbmsgYW5kcm9pZC50ZXN0LkFwcGxpY2F0aW9uVGVzdENhc2V9PC9saT4KLSAgICAgIDxsaT57QGxpbmsgYW5kcm9pZC50ZXN0LlByb3ZpZGVyVGVzdENhc2UyfTwvbGk+Ci0gICAgICA8bGk+e0BsaW5rIGFuZHJvaWQudGVzdC5TZXJ2aWNlVGVzdENhc2V9PC9saT4KKyAgICAgIDxsaT57QGxpbmsgYW5kcm9pZC50ZXN0fTwvbGk+CisgICAgICA8bGk+e0BsaW5rIGFuZHJvaWQudGVzdC5tb2NrfTwvbGk+CisgICAgICA8bGk+e0BsaW5rIGp1bml0LmZyYW1ld29ya308L2xpPgogICAgIDwvb2w+CiAgIDxoMj5SZWxhdGVkIFR1dG9yaWFsczwvaDI+CiAgICAgPG9sPgogICAgICAgICA8bGk+Ci0gICAgICAgICAgICA8YSBocmVmPSJ7QGRvY1Jvb3R9cmVzb3VyY2VzL3R1dG9yaWFscy90ZXN0aW5nL2hlbGxvYW5kcm9pZF90ZXN0Lmh0bWwiPkhlbGxvLCBUZXN0aW5nPC9hPgorICAgICAgICAgICAgPGEgaHJlZj0ie0Bkb2NSb290fXJlc291cmNlcy90dXRvcmlhbHMvdGVzdGluZy9oZWxsb2FuZHJvaWRfdGVzdC5odG1sIj4KKyAgICAgICAgICAgIEhlbGxvLCBUZXN0aW5nPC9hPgogICAgICAgICA8L2xpPgogICAgICAgICA8bGk+CiAgICAgICAgICAgICA8YSBocmVmPSJ7QGRvY1Jvb3R9cmVzb3VyY2VzL3R1dG9yaWFscy90ZXN0aW5nL2FjdGl2aXR5X3Rlc3QuaHRtbCI+QWN0aXZpdHkgVGVzdGluZzwvYT4KQEAgLTczLDQ0NSArNzAsNTkwIEBACiAgIDxoMj5TZWUgQWxzbzwvaDI+CiAgICAgICA8b2w+CiAgICAgICAgIDxsaT4KLSAgICAgICAgICA8YSBocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvZGV2ZWxvcGluZy90ZXN0aW5nL3Rlc3RpbmdfZWNsaXBzZS5odG1sIj5UZXN0aW5nIGluIEVjbGlwc2UsIHdpdGggQURUPC9hPgorICAgICAgICAgIDxhIGhyZWY9IntAZG9jUm9vdH1ndWlkZS9kZXZlbG9waW5nL3Rlc3RpbmcvdGVzdGluZ19lY2xpcHNlLmh0bWwiPgorICAgICAgICAgIFRlc3RpbmcgaW4gRWNsaXBzZSwgd2l0aCBBRFQ8L2E+CiAgICAgICAgIDwvbGk+CiAgICAgICAgIDxsaT4KLSAgICAgICAgICA8YSBocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvZGV2ZWxvcGluZy90ZXN0aW5nL3Rlc3Rpbmdfb3RoZXJpZGUuaHRtbCI+VGVzdGluZyBpbiBPdGhlciBJREVzPC9hPgorICAgICAgICAgIDxhIGhyZWY9IntAZG9jUm9vdH1ndWlkZS9kZXZlbG9waW5nL3Rlc3RpbmcvdGVzdGluZ19vdGhlcmlkZS5odG1sIj4KKyAgICAgICAgICBUZXN0aW5nIGluIE90aGVyIElERXM8L2E+CiAgICAgICAgIDwvbGk+CiAgICAgICA8L29sPgogICA8L2Rpdj4KIDwvZGl2PgotCi08cD5BbmRyb2lkIGluY2x1ZGVzIGEgcG93ZXJmdWwgc2V0IG9mIHRlc3RpbmcgdG9vbHMgdGhhdCBleHRlbmQgdGhlCi1pbmR1c3RyeS1zdGFuZGFyZCBKVW5pdCB0ZXN0IGZyYW1ld29yayB3aXRoIGZlYXR1cmVzIHNwZWNpZmljIHRvIHRoZSBBbmRyb2lkCi1lbnZpcm9ubWVudC4gQWx0aG91Z2ggeW91IGNhbiB0ZXN0IGFuIEFuZHJvaWQgYXBwbGljYXRpb24gd2l0aCBKVW5pdCwgdGhlCi1BbmRyb2lkIHRvb2xzIGFsbG93IHlvdSB0byB3cml0ZSBtdWNoIG1vcmUgc29waGlzdGljYXRlZCB0ZXN0cyBmb3IgZXZlcnkgYXNwZWN0Ci1vZiB5b3VyIGFwcGxpY2F0aW9uLCBib3RoIGF0IHRoZSB1bml0IGFuZCBmcmFtZXdvcmsgbGV2ZWxzLjwvcD4KLQotPHA+S2V5IGZlYXR1cmVzIG9mIHRoZSBBbmRyb2lkIHRlc3RpbmcgZW52aXJvbm1lbnQgaW5jbHVkZTo8L3A+Ci0KKzxwPgorICAgIFRoZSBBbmRyb2lkIHRlc3RpbmcgZnJhbWV3b3JrLCBhbiBpbnRlZ3JhbCBwYXJ0IG9mIHRoZSBkZXZlbG9wbWVudCBlbnZpcm9ubWVudCwKKyAgICBwcm92aWRlcyBhbiBhcmNoaXRlY3R1cmUgYW5kIHBvd2VyZnVsIHRvb2xzIHRoYXQgaGVscCB5b3UgdGVzdCBldmVyeSBhc3BlY3Qgb2YgeW91ciBhcHBsaWNhdGlvbgorICAgIGF0IGV2ZXJ5IGxldmVsIGZyb20gdW5pdCB0byBmcmFtZXdvcmsuCis8L3A+Cis8cD4KKyAgICBUaGUgdGVzdGluZyBmcmFtZXdvcmsgaGFzIHRoZXNlIGtleSBmZWF0dXJlczoKKzwvcD4KIDx1bD4KLSAgPGxpPkFuZHJvaWQgZXh0ZW5zaW9ucyB0byB0aGUgSlVuaXQgZnJhbWV3b3JrIHRoYXQgcHJvdmlkZSBhY2Nlc3MgdG8gQW5kcm9pZAotc3lzdGVtIG9iamVjdHMuPC9saT4KLSAgPGxpPkFuIGluc3RydW1lbnRhdGlvbiBmcmFtZXdvcmsgdGhhdCBsZXRzIHRlc3RzIGNvbnRyb2wgYW5kIGV4YW1pbmUgdGhlCi1hcHBsaWNhdGlvbi48L2xpPgotICA8bGk+TW9jayB2ZXJzaW9ucyBvZiBjb21tb25seS11c2VkIEFuZHJvaWQgc3lzdGVtIG9iamVjdHMuPC9saT4KLSAgPGxpPlRvb2xzIGZvciBydW5uaW5nIHNpbmdsZSB0ZXN0cyBvciB0ZXN0IHN1aXRlcywgd2l0aCBvciB3aXRob3V0Ci1pbnN0cnVtZW50YXRpb24uPC9saT4KLSAgPGxpPlN1cHBvcnQgZm9yIG1hbmFnaW5nIHRlc3RzIGFuZCB0ZXN0IHByb2plY3RzIGluIHRoZSBBRFQgUGx1Z2luIGZvciBFY2xpcHNlCi1hbmQgYXQgdGhlIGNvbW1hbmQgbGluZS48L2xpPgorICAgIDxsaT4KKyAgICAgICAgQW5kcm9pZCB0ZXN0IHN1aXRlcyBhcmUgYmFzZWQgb24gSlVuaXQuIFlvdSBjYW4gdXNlIHBsYWluIEpVbml0IHRvIHRlc3QgYSBjbGFzcyB0aGF0IGRvZXNuJ3QKKyAgICAgICAgY2FsbCB0aGUgQW5kcm9pZCBBUEksIG9yIEFuZHJvaWQncyBKVW5pdCBleHRlbnNpb25zIHRvIHRlc3QgQW5kcm9pZCBjb21wb25lbnRzLiBJZiB5b3UncmUKKyAgICAgICAgbmV3IHRvIEFuZHJvaWQgdGVzdGluZywgeW91IGNhbiBzdGFydCB3aXRoIGdlbmVyYWwtcHVycG9zZSB0ZXN0IGNhc2UgY2xhc3NlcyBzdWNoIGFzIHtAbGluaworICAgICAgICBhbmRyb2lkLnRlc3QuQW5kcm9pZFRlc3RDYXNlfSBhbmQgdGhlbiBnbyBvbiB0byB1c2UgbW9yZSBzb3BoaXN0aWNhdGVkIGNsYXNzZXMuCisgICAgPC9saT4KKyAgICA8bGk+CisgICAgICAgIFRoZSBBbmRyb2lkIEpVbml0IGV4dGVuc2lvbnMgcHJvdmlkZSBjb21wb25lbnQtc3BlY2lmaWMgdGVzdCBjYXNlIGNsYXNzZXMuIFRoZXNlIGNsYXNzZXMKKyAgICAgICAgcHJvdmlkZSBoZWxwZXIgbWV0aG9kcyBmb3IgY3JlYXRpbmcgbW9jayBvYmplY3RzIGFuZCBtZXRob2RzIHRoYXQgaGVscCB5b3UgY29udHJvbCB0aGUKKyAgICAgICAgbGlmZWN5Y2xlIG9mIGEgY29tcG9uZW50LgorICAgIDwvbGk+CisgICAgPGxpPgorICAgICAgICBUZXN0IHN1aXRlcyBhcmUgY29udGFpbmVkIGluIHRlc3QgcGFja2FnZXMgdGhhdCBhcmUgc2ltaWxhciB0byBtYWluIGFwcGxpY2F0aW9uIHBhY2thZ2VzLCBzbworICAgICAgICB5b3UgZG9uJ3QgbmVlZCB0byBsZWFybiBhIG5ldyBzZXQgb2YgdG9vbHMgb3IgdGVjaG5pcXVlcyBmb3IgZGVzaWduaW5nIGFuZCBidWlsZGluZyB0ZXN0cy4KKyAgICA8L2xpPgorICAgIDxsaT4KKyAgICAgICAgVGhlIFNESyB0b29scyBmb3IgYnVpbGRpbmcgYW5kIHRlc3RzIGFyZSBhdmFpbGFibGUgaW4gRWNsaXBzZSB3aXRoIEFEVCwgYW5kIGFsc28gaW4KKyAgICAgICAgY29tbWFuZC1saW5lIGZvcm0gZm9yIHVzZSB3aXRoIG90aGVyIElERVMuIFRoZXNlIHRvb2xzIGdldCBpbmZvcm1hdGlvbiBmcm9tIHRoZSBwcm9qZWN0IG9mCisgICAgICAgIHRoZSBhcHBsaWNhdGlvbiB1bmRlciB0ZXN0IGFuZCB1c2UgdGhpcyBpbmZvcm1hdGlvbiB0byBhdXRvbWF0aWNhbGx5IGNyZWF0ZSB0aGUgYnVpbGQgZmlsZXMsCisgICAgICAgIG1hbmlmZXN0IGZpbGUsIGFuZCBkaXJlY3Rvcnkgc3RydWN0dXJlIGZvciB0aGUgdGVzdCBwYWNrYWdlLgorICAgIDwvbGk+CisgICAgPGxpPgorICAgICAgICBUaGUgU0RLIGFsc28gcHJvdmlkZXMKKyAgICAgICAgPGEgaHJlZj0ie0Bkb2NSb290fWd1aWRlL3RvcGljcy90ZXN0aW5nL21vbmtleXJ1bm5lci5odG1sIj5Nb25rZXlSdW5uZXI8L2E+LCBhbiBBUEkgZm9yCisgICAgICAgIHRlc3RpbmcgZGV2aWNlcyB3aXRoIEp5dGhvbiBzY3JpcHRzLCBhbmQgPGEKKyAgICAgICAgaHJlZj0ie0Bkb2NSb290fWd1aWRlL2RldmVsb3BpbmcvdG9vbHMvbW9ua2V5Lmh0bWwiPk1vbmtleTwvYT4sIGEgY29tbWFuZC1saW5lIHRvb2wgZm9yCisgICAgICAgIHN0cmVzcy10ZXN0aW5nIFVJcyBieSBzZW5kaW5nIHBzZXVkby1yYW5kb20gZXZlbnRzIHRvIGEgZGV2aWNlLgorICAgIDwvbGk+CiA8L3VsPgotCi08cD5UaGlzIGRvY3VtZW50IGlzIGFuIG92ZXJ2aWV3IG9mIHRoZSBBbmRyb2lkIHRlc3RpbmcgZW52aXJvbm1lbnQgYW5kIHRoZSB3YXkKLXlvdSB1c2UgaXQuIFRoZSBkb2N1bWVudCBhc3N1bWVzIHlvdSBoYXZlIGEgYmFzaWMga25vd2xlZGdlIG9mIEFuZHJvaWQKLWFwcGxpY2F0aW9uIHByb2dyYW1taW5nIGFuZCBKVW5pdCB0ZXN0aW5nIG1ldGhvZG9sb2d5LjwvcD4KLQotPGgyIGlkPSJPdmVydmlldyI+T3ZlcnZpZXc8L2gyPgotCi08cD4gQXQgdGhlIGhlYXJ0IG9mIHRoZSBBbmRyb2lkIHRlc3RpbmcgZW52aXJvbm1lbnQgaXMgYW4gaW5zdHJ1bWVudGF0aW9uCi1mcmFtZXdvcmsgdGhhdCB5b3VyIHRlc3QgYXBwbGljYXRpb24gdXNlcyB0byBwcmVjaXNlbHkgY29udHJvbCB0aGUgYXBwbGljYXRpb24KLXVuZGVyIHRlc3QuIFdpdGggaW5zdHJ1bWVudGF0aW9uLCB5b3UgY2FuIHNldCB1cCBtb2NrIHN5c3RlbSBvYmplY3RzIHN1Y2ggYXMKLUNvbnRleHRzIGJlZm9yZSB0aGUgbWFpbiBhcHBsaWNhdGlvbiBzdGFydHMsIGNvbnRyb2wgeW91ciBhcHBsaWNhdGlvbiBhdCB2YXJpb3VzCi1wb2ludHMgb2YgaXRzIGxpZmVjeWNsZSwgc2VuZCBVSSBldmVudHMgdG8gdGhlIGFwcGxpY2F0aW9uLCBhbmQgZXhhbWluZSB0aGUKLWFwcGxpY2F0aW9uJ3Mgc3RhdGUgZHVyaW5nIGl0cyBleGVjdXRpb24uIFRoZSBpbnN0cnVtZW50YXRpb24gZnJhbWV3b3JrCi1hY2NvbXBsaXNoZXMgdGhpcyBieSBydW5uaW5nIGJvdGggdGhlIG1haW4gYXBwbGljYXRpb24gYW5kIHRoZSB0ZXN0IGFwcGxpY2F0aW9uCi1pbiB0aGUgc2FtZSBwcm9jZXNzLiA8L3A+Ci0KLTxwPllvdXIgdGVzdCBhcHBsaWNhdGlvbiBpcyBsaW5rZWQgdG8gdGhlIGFwcGxpY2F0aW9uIHVuZGVyIHRlc3QgYnkgbWVhbnMgb2YgYW4KLTxhCi1ocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvdG9waWNzL21hbmlmZXN0L2luc3RydW1lbnRhdGlvbi1lbGVtZW50Lmh0bWwiPjxjb2RlPiZsdDtpbnN0cnVtZW50YXRpb24mZ3Q7PC9jb2RlPjwvYT4KLWVsZW1lbnQgaW4gdGhlIHRlc3QgYXBwbGljYXRpb24ncyBtYW5pZmVzdCBmaWxlLiBUaGUgYXR0cmlidXRlcyBvZiB0aGUgZWxlbWVudAotc3BlY2lmeSB0aGUgcGFja2FnZSBuYW1lIG9mIHRoZSBhcHBsaWNhdGlvbiB1bmRlciB0ZXN0IGFuZCBhbHNvIHRlbGwgQW5kcm9pZCBob3cKLXRvIHJ1biB0aGUgdGVzdCBhcHBsaWNhdGlvbi4gSW5zdHJ1bWVudGF0aW9uIGlzIGRlc2NyaWJlZCBpbiBtb3JlIGRldGFpbCBpbiB0aGUKLXNlY3Rpb24gPGEgaHJlZj0iI0luc3RydW1lbnRhdGlvblRlc3RSdW5uZXIiPkluc3RydW1lbnRhdGlvbiBUZXN0Ci1SdW5uZXI8L2E+LjwvcD4KLQotPHA+VGhlIGZvbGxvd2luZyBkaWFncmFtIHN1bW1hcml6ZXMgdGhlIEFuZHJvaWQgdGVzdGluZyBlbnZpcm9ubWVudDo8L3A+Ci0KLTxpbWcgc3JjPSJ7QGRvY1Jvb3R9aW1hZ2VzL3Rlc3RpbmcvYW5kcm9pZF90ZXN0X2ZyYW1ld29yay5wbmciLz4KLQotPHA+SW4gQW5kcm9pZCwgdGVzdCBhcHBsaWNhdGlvbnMgYXJlIHRoZW1zZWx2ZXMgQW5kcm9pZCBhcHBsaWNhdGlvbnMsIHNvIHlvdQotd3JpdGUgdGhlbSBpbiBtdWNoIHRoZSBzYW1lIHdheSBhcyB0aGUgYXBwbGljYXRpb24geW91IGFyZSB0ZXN0aW5nLiBUaGUgU0RLCi10b29scyBoZWxwIHlvdSBjcmVhdGUgYSBtYWluIGFwcGxpY2F0aW9uIHByb2plY3QgYW5kIGl0cyB0ZXN0IHByb2plY3QgYXQgdGhlIHNhbWUKLXRpbWUuIFlvdSBjYW4gcnVuIEFuZHJvaWQgdGVzdHMgd2l0aGluIEVjbGlwc2Ugd2l0aCBBRFQgb3IgZnJvbSB0aGUgY29tbWFuZAotbGluZS4gRWNsaXBzZSB3aXRoIEFEVCBwcm92aWRlcyBhbiBleHRlbnNpdmUgc2V0IG9mIHRvb2xzIGZvciBjcmVhdGluZyB0ZXN0cywKLXJ1bm5pbmcgdGhlbSwgYW5kIHZpZXdpbmcgdGhlaXIgcmVzdWx0cy4gWW91IGNhbiBhbHNvIHVzZSB0aGUgPGNvZGU+YWRiPC9jb2RlPgotdG9vbCB0byBydW4gdGVzdHMsIG9yIHVzZSBhIGJ1aWx0LWluIEFudCB0YXJnZXQuPC9wPgotCi08cD5UbyBsZWFybiBob3cgdG8gc2V0IHVwIGFuZCBydW4gdGVzdHMgaW4gRWNsaXBzZSwgcGxlYXNlIHJlZmVyIHRvIDxhCi1ocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvZGV2ZWxvcGluZy90ZXN0aW5nL3Rlc3RpbmdfZWNsaXBzZS5odG1sIj5UZXN0aW5nIGluCi1FY2xpcHNlLCB3aXRoIEFEVDwvYT4uIElmIHlvdSdyZSBub3Qgd29ya2luZyBpbiBFY2xpcHNlLCByZWZlciB0byA8YQotaHJlZj0ie0Bkb2NSb290fWd1aWRlL2RldmVsb3BpbmcvdGVzdGluZy90ZXN0aW5nX290aGVyaWRlLmh0bWwiPlRlc3RpbmcgaW4gT3RoZXIKLUlERXM8L2E+LjwvcD4KLQotPHA+SWYgeW91IHdhbnQgYSBzdGVwLWJ5LXN0ZXAgaW50cm9kdWN0aW9uIHRvIEFuZHJvaWQgdGVzdGluZywgdHJ5IG9uZSBvZiB0aGUKLXRlc3RpbmcgdHV0b3JpYWxzOjwvcD4KLQotPHVsPgotICA8bGk+VGhlIDxhCi1ocmVmPSJ7QGRvY1Jvb3R9cmVzb3VyY2VzL3R1dG9yaWFscy90ZXN0aW5nL2hlbGxvYW5kcm9pZF90ZXN0Lmh0bWwiPkhlbGxvLAotVGVzdGluZzwvYT4gdHV0b3JpYWwgaW50cm9kdWNlcyBiYXNpYyB0ZXN0aW5nIGNvbmNlcHRzIGFuZCBwcm9jZWR1cmVzIGluIHRoZQotY29udGV4dCBvZiB0aGUgSGVsbG8sIFdvcmxkIGFwcGxpY2F0aW9uLjwvbGk+Ci0gIDxsaT5UaGUgPGEKLWhyZWY9IntAZG9jUm9vdH1yZXNvdXJjZXMvdHV0b3JpYWxzL3Rlc3RpbmcvYWN0aXZpdHlfdGVzdC5odG1sIj5BY3Rpdml0eQotVGVzdGluZzwvYT4gdHV0b3JpYWwgaXMgYW4gZXhjZWxsZW50IGZvbGxvdy11cCB0byB0aGUgSGVsbG8sIFRlc3RpbmcgdHV0b3JpYWwuCi1JdCBndWlkZXMgeW91IHRocm91Z2ggYSBtb3JlIGNvbXBsZXggdGVzdGluZyBzY2VuYXJpbyB0aGF0IHlvdSBkZXZlbG9wIGFnYWluc3QgYQotbW9yZSByZWFsaXN0aWMgYXBwbGljYXRpb24uPC9saT4KLTwvdWw+Ci0KKzxwPgorICAgIFRoaXMgZG9jdW1lbnQgZGVzY3JpYmVzIHRoZSBmdW5kYW1lbnRhbHMgb2YgdGhlIEFuZHJvaWQgdGVzdGluZyBmcmFtZXdvcmssIGluY2x1ZGluZyB0aGUKKyAgICBzdHJ1Y3R1cmUgb2YgdGVzdHMsIHRoZSBBUElzIHRoYXQgeW91IHVzZSB0byBkZXZlbG9wIHRlc3RzLCBhbmQgdGhlIHRvb2xzIHRoYXQgeW91IHVzZSB0byBydW4KKyAgICB0ZXN0cyBhbmQgdmlldyByZXN1bHRzLiBUaGUgZG9jdW1lbnQgYXNzdW1lcyB5b3UgaGF2ZSBhIGJhc2ljIGtub3dsZWRnZSBvZiBBbmRyb2lkIGFwcGxpY2F0aW9uCisgICAgcHJvZ3JhbW1pbmcgYW5kIEpVbml0IHRlc3RpbmcgbWV0aG9kb2xvZ3kuCis8L3A+Cis8cD4KKyAgICBUaGUgZm9sbG93aW5nIGRpYWdyYW0gc3VtbWFyaXplcyB0aGUgdGVzdGluZyBmcmFtZXdvcms6Cis8L3A+Cis8ZGl2IHN0eWxlPSJ3aWR0aDogNzAlOyBtYXJnaW4tbGVmdDphdXRvOyBtYXJnaW4tcmlnaHQ6YXV0bzsiPgorPGEgaHJlZj0ie0Bkb2NSb290fWltYWdlcy90ZXN0aW5nL3Rlc3RfZnJhbWV3b3JrLnBuZyI+CisgICAgPGltZyBzcmM9IntAZG9jUm9vdH1pbWFnZXMvdGVzdGluZy90ZXN0X2ZyYW1ld29yay5wbmciCisgICAgICAgIGFsdD0iVGhlIEFuZHJvaWQgdGVzdGluZyBmcmFtZXdvcmsiLz4KKzwvYT4KKzwvZGl2PgorPGgyIGlkPSJUZXN0U3RydWN0dXJlIj5UZXN0IFN0cnVjdHVyZTwvaDI+Cis8cD4KKyAgICBBbmRyb2lkJ3MgYnVpbGQgYW5kIHRlc3QgdG9vbHMgYXNzdW1lIHRoYXQgdGVzdCBwcm9qZWN0cyBhcmUgb3JnYW5pemVkIGludG8gYSBzdGFuZGFyZAorICAgIHN0cnVjdHVyZSBvZiB0ZXN0cywgdGVzdCBjYXNlIGNsYXNzZXMsIHRlc3QgcGFja2FnZXMsIGFuZCB0ZXN0IHByb2plY3RzLgorPC9wPgorPHA+CisgICAgQW5kcm9pZCB0ZXN0aW5nIGlzIGJhc2VkIG9uIEpVbml0LiBJbiBnZW5lcmFsLCBhIEpVbml0IHRlc3QgaXMgYSBtZXRob2Qgd2hvc2UKKyAgICBzdGF0ZW1lbnRzIHRlc3QgYSBwYXJ0IG9mIHRoZSBhcHBsaWNhdGlvbiB1bmRlciB0ZXN0LiBZb3Ugb3JnYW5pemUgdGVzdCBtZXRob2RzIGludG8gY2xhc3NlcworICAgIGNhbGxlZCB0ZXN0IGNhc2VzIChvciB0ZXN0IHN1aXRlcykuIEVhY2ggdGVzdCBpcyBhbiBpc29sYXRlZCB0ZXN0IG9mIGFuIGluZGl2aWR1YWwgbW9kdWxlIGluCisgICAgdGhlIGFwcGxpY2F0aW9uIHVuZGVyIHRlc3QuIEVhY2ggY2xhc3MgaXMgYSBjb250YWluZXIgZm9yIHJlbGF0ZWQgdGVzdCBtZXRob2RzLCBhbHRob3VnaCBpdAorICAgIG9mdGVuIHByb3ZpZGVzIGhlbHBlciBtZXRob2RzIGFzIHdlbGwuCis8L3A+Cis8cD4KKyAgICBJbiBKVW5pdCwgeW91IGJ1aWxkIG9uZSBvciBtb3JlIHRlc3Qgc291cmNlIGZpbGVzIGludG8gYSBjbGFzcyBmaWxlLiBTaW1pbGFybHksIGluIEFuZHJvaWQgeW91CisgICAgdXNlIHRoZSBTREsncyBidWlsZCB0b29scyB0byBidWlsZCBvbmUgb3IgbW9yZSB0ZXN0IHNvdXJjZSBmaWxlcyBpbnRvIGNsYXNzIGZpbGVzIGluIGFuCisgICAgQW5kcm9pZCB0ZXN0IHBhY2thZ2UuIEluIEpVbml0LCB5b3UgdXNlIGEgdGVzdCBydW5uZXIgdG8gZXhlY3V0ZSB0ZXN0IGNsYXNzZXMuIEluIEFuZHJvaWQsIHlvdQorICAgIHVzZSB0ZXN0IHRvb2xzIHRvIGxvYWQgdGhlIHRlc3QgcGFja2FnZSBhbmQgdGhlIGFwcGxpY2F0aW9uIHVuZGVyIHRlc3QsIGFuZCB0aGUgdG9vbHMgdGhlbgorICAgIGV4ZWN1dGUgYW4gQW5kcm9pZC1zcGVjaWZpYyB0ZXN0IHJ1bm5lci4KKzwvcD4KKzxoMiBpZD0iVGVzdFByb2plY3RzIj5UZXN0IFByb2plY3RzPC9oMj4KKzxwPgorICAgIFRlc3RzLCBsaWtlIEFuZHJvaWQgYXBwbGljYXRpb25zLCBhcmUgb3JnYW5pemVkIGludG8gcHJvamVjdHMuCis8L3A+Cis8cD4KKyAgICBBIHRlc3QgcHJvamVjdCBpcyBhIGRpcmVjdG9yeSBvciBFY2xpcHNlIHByb2plY3QgaW4gd2hpY2ggeW91IGNyZWF0ZSB0aGUgc291cmNlIGNvZGUsIG1hbmlmZXN0CisgICAgZmlsZSwgYW5kIG90aGVyIGZpbGVzIGZvciBhIHRlc3QgcGFja2FnZS4gVGhlIEFuZHJvaWQgU0RLIGNvbnRhaW5zIHRvb2xzIGZvciBFY2xpcHNlIHdpdGggQURUCisgICAgYW5kIGZvciB0aGUgY29tbWFuZCBsaW5lIHRoYXQgY3JlYXRlIGFuZCB1cGRhdGUgdGVzdCBwcm9qZWN0cyBmb3IgeW91LiBUaGUgdG9vbHMgY3JlYXRlIHRoZQorICAgIGRpcmVjdG9yaWVzIHlvdSB1c2UgZm9yIHNvdXJjZSBjb2RlIGFuZCByZXNvdXJjZXMgYW5kIHRoZSBtYW5pZmVzdCBmaWxlIGZvciB0aGUgdGVzdCBwYWNrYWdlLgorICAgIFRoZSBjb21tYW5kLWxpbmUgdG9vbHMgYWxzbyBjcmVhdGUgdGhlIEFudCBidWlsZCBmaWxlcyB5b3UgbmVlZC4KKzwvcD4KKzxwPgorICAgIFlvdSBzaG91bGQgYWx3YXlzIHVzZSBBbmRyb2lkIHRvb2xzIHRvIGNyZWF0ZSBhIHRlc3QgcHJvamVjdC4gQW1vbmcgb3RoZXIgYmVuZWZpdHMsCisgICAgdGhlIHRvb2xzOgorPC9wPgorICAgIDx1bD4KKyAgICAgICAgPGxpPgorICAgICAgICAgICAgQXV0b21hdGljYWxseSBzZXQgdXAgeW91ciB0ZXN0IHBhY2thZ2UgdG8gdXNlCisgICAgICAgICAgICB7QGxpbmsgYW5kcm9pZC50ZXN0Lkluc3RydW1lbnRhdGlvblRlc3RSdW5uZXJ9IGFzIHRoZSB0ZXN0IGNhc2UgcnVubmVyLiBZb3UgbXVzdCB1c2UKKyAgICAgICAgICAgIDxjb2RlPkluc3RydW1lbnRhdGlvblRlc3RSdW5uZXI8L2NvZGU+IChvciBhIHN1YmNsYXNzKSB0byBydW4gSlVuaXQgdGVzdHMuCisgICAgICAgIDwvbGk+CisgICAgICAgIDxsaT4KKyAgICAgICAgICAgIENyZWF0ZSBhbiBhcHByb3ByaWF0ZSBuYW1lIGZvciB0aGUgdGVzdCBwYWNrYWdlLiBJZiB0aGUgYXBwbGljYXRpb24KKyAgICAgICAgICAgIHVuZGVyIHRlc3QgaGFzIGEgcGFja2FnZSBuYW1lIG9mIDxjb2RlPmNvbS5teWRvbWFpbi5teWFwcDwvY29kZT4sIHRoZW4gdGhlCisgICAgICAgICAgICBBbmRyb2lkIHRvb2xzIHNldCB0aGUgdGVzdCBwYWNrYWdlIG5hbWUgdG8gPGNvZGU+Y29tLm15ZG9tYWluLm15YXBwLnRlc3Q8L2NvZGU+LiBUaGlzCisgICAgICAgICAgICBoZWxwcyB5b3UgaWRlbnRpZnkgdGhlaXIgcmVsYXRpb25zaGlwLCB3aGlsZSBwcmV2ZW50aW5nIGNvbmZsaWN0cyB3aXRoaW4gdGhlIHN5c3RlbS4KKyAgICAgICAgPC9saT4KKyAgICAgICAgPGxpPgorICAgICAgICAgICAgQXV0b21hdGljYWxseSBjcmVhdGUgdGhlIHByb3BlciBidWlsZCBmaWxlcywgbWFuaWZlc3QgZmlsZSwgYW5kIGRpcmVjdG9yeQorICAgICAgICAgICAgc3RydWN0dXJlIGZvciB0aGUgdGVzdCBwcm9qZWN0LiBUaGlzIGhlbHBzIHlvdSB0byBidWlsZCB0aGUgdGVzdCBwYWNrYWdlIHdpdGhvdXQKKyAgICAgICAgICAgIGhhdmluZyB0byBtb2RpZnkgYnVpbGQgZmlsZXMgYW5kIHNldHMgdXAgdGhlIGxpbmthZ2UgYmV0d2VlbiB5b3VyIHRlc3QgcGFja2FnZSBhbmQKKyAgICAgICAgICAgIHRoZSBhcHBsaWNhdGlvbiB1bmRlciB0ZXN0LgorICAgICAgICAgICAgVGhlCisgICAgICAgIDwvbGk+CisgICAgPC91bD4KKzxwPgorICAgIFlvdSBjYW4gY3JlYXRlIGEgdGVzdCBwcm9qZWN0IGFueXdoZXJlIGluIHlvdXIgZmlsZSBzeXN0ZW0sIGJ1dCB0aGUgYmVzdCBhcHByb2FjaCBpcyB0bworICAgIGFkZCB0aGUgdGVzdCBwcm9qZWN0IHNvIHRoYXQgaXRzIHJvb3QgZGlyZWN0b3J5IDxjb2RlPnRlc3RzLzwvY29kZT4gaXMgYXQgdGhlIHNhbWUgbGV2ZWwKKyAgICBhcyB0aGUgPGNvZGU+c3JjLzwvY29kZT4gZGlyZWN0b3J5IG9mIHRoZSBtYWluIGFwcGxpY2F0aW9uJ3MgcHJvamVjdC4gVGhpcyBoZWxwcyB5b3UgZmluZCB0aGUKKyAgICB0ZXN0cyBhc3NvY2lhdGVkIHdpdGggYW4gYXBwbGljYXRpb24uIEZvciBleGFtcGxlLCBpZiB5b3VyIGFwcGxpY2F0aW9uIHByb2plY3QncyByb290IGRpcmVjdG9yeQorICAgIGlzIDxjb2RlPk15UHJvamVjdDwvY29kZT4sIHRoZW4geW91IHNob3VsZCB1c2UgdGhlIGZvbGxvd2luZyBkaXJlY3Rvcnkgc3RydWN0dXJlOgorPC9wPgorPHByZSBjbGFzcz0iY2xhc3NpYyBuby1wcmV0dHktcHJpbnQiPgorICBNeVByb2plY3QvCisgICAgICBBbmRyb2lkTWFuaWZlc3QueG1sCisgICAgICByZXMvCisgICAgICAgICAgLi4uIChyZXNvdXJjZXMgZm9yIG1haW4gYXBwbGljYXRpb24pCisgICAgICBzcmMvCisgICAgICAgICAgLi4uIChzb3VyY2UgY29kZSBmb3IgbWFpbiBhcHBsaWNhdGlvbikgLi4uCisgICAgICB0ZXN0cy8KKyAgICAgICAgICBBbmRyb2lkTWFuaWZlc3QueG1sCisgICAgICAgICAgcmVzLworICAgICAgICAgICAgICAuLi4gKHJlc291cmNlcyBmb3IgdGVzdHMpCisgICAgICAgICAgc3JjLworICAgICAgICAgICAgICAuLi4gKHNvdXJjZSBjb2RlIGZvciB0ZXN0cykKKzwvcHJlPgogPGgyIGlkPSJUZXN0QVBJIj5UaGUgVGVzdGluZyBBUEk8L2gyPgogPHA+Ci0gICAgRm9yIHdyaXRpbmcgdGVzdHMgYW5kIHRlc3QgYXBwbGljYXRpb25zIGluIHRoZSBKYXZhIHByb2dyYW1taW5nIGxhbmd1YWdlLCBBbmRyb2lkIHByb3ZpZGVzIGEKLSAgICB0ZXN0aW5nIEFQSSB0aGF0IGlzIGJhc2VkIGluIHBhcnQgb24gdGhlIEpVbml0IHRlc3QgZnJhbWV3b3JrLiBBZGRpbmcgdG8gdGhhdCwgQW5kcm9pZCBpbmNsdWRlcwotICAgIGEgcG93ZXJmdWwgaW5zdHJ1bWVudGF0aW9uIGZyYW1ld29yayB0aGF0IGxldHMgeW91ciB0ZXN0cyBhY2Nlc3MgdGhlIHN0YXRlIGFuZCBydW50aW1lIG9iamVjdHMKLSAgICBvZiB0aGUgYXBwbGljYXRpb24gdW5kZXIgdGVzdHMuCisgICAgVGhlIEFuZHJvaWQgdGVzdGluZyBBUEkgaXMgYmFzZWQgb24gdGhlIEpVbml0IEFQSSBhbmQgZXh0ZW5kZWQgd2l0aCBhIGluc3RydW1lbnRhdGlvbgorICAgIGZyYW1ld29yayBhbmQgQW5kcm9pZC1zcGVjaWZpYyB0ZXN0aW5nIGNsYXNzZXMuCiA8L3A+Ci08cD5UaGUgc2VjdGlvbnMgYmVsb3cgZGVzY3JpYmUgdGhlIG1ham9yIGNvbXBvbmVudHMgb2YgdGhlIHRlc3RpbmcgQVBJIGF2YWlsYWJsZSBpbiBBbmRyb2lkLjwvcD4KLTxoMyBpZD0iRXh0ZW5zaW9ucyI+SlVuaXQgdGVzdCBjYXNlIGNsYXNzZXM8L2gzPgorPGgzIGlkPSJKVW5pdCI+SlVuaXQ8L2gzPgogPHA+Ci0gIFNvbWUgb2YgdGhlIGNsYXNzZXMgaW4gdGhlIHRlc3RpbmcgQVBJIGV4dGVuZCB0aGUgSlVuaXQge0BsaW5rIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSBUZXN0Q2FzZX0gYnV0IGRvIG5vdCB1c2UgdGhlIGluc3RydW1lbnRhdGlvbiBmcmFtZXdvcmsuIFRoZXNlIGNsYXNzZXMKLSAgY29udGFpbiBtZXRob2RzIGZvciBhY2Nlc3Npbmcgc3lzdGVtIG9iamVjdHMgc3VjaCBhcyB0aGUgQ29udGV4dCBvZiB0aGUgYXBwbGljYXRpb24gdW5kZXIgdGVzdC4gV2l0aCB0aGlzIENvbnRleHQsIHlvdSBjYW4gbG9vayBhdCBpdHMgcmVzb3VyY2VzLCBmaWxlcywgZGF0YWJhc2VzLAotICBhbmQgc28gZm9ydGguIFRoZSBiYXNlIGNsYXNzIGlzIHtAbGluayBhbmRyb2lkLnRlc3QuQW5kcm9pZFRlc3RDYXNlfSwgYnV0IHlvdSB1c3VhbGx5IHVzZSBhIHN1YmNsYXNzIGFzc29jaWF0ZWQgd2l0aCBhIHBhcnRpY3VsYXIgY29tcG9uZW50LgotPHA+Ci0gIFRoZSBzdWJjbGFzc2VzIGFyZToKLTwvcD4KLSAgPHVsPgotICAgIDxsaT4KLSAgICAgIHtAbGluayBhbmRyb2lkLnRlc3QuQXBwbGljYXRpb25UZXN0Q2FzZX0gLSBBIGNsYXNzIGZvciB0ZXN0aW5nIGFuIGVudGlyZSBhcHBsaWNhdGlvbi4gSXQgYWxsb3dzIHlvdSB0byBpbmplY3QgYSBtb2NrIENvbnRleHQgaW50byB0aGUgYXBwbGljYXRpb24sCi0gICAgICBzZXQgdXAgaW5pdGlhbCB0ZXN0IHBhcmFtZXRlcnMgYmVmb3JlIHRoZSBhcHBsaWNhdGlvbiBzdGFydHMsIGFuZCBleGFtaW5lIHRoZSBhcHBsaWNhdGlvbiBhZnRlciBpdCBmaW5pc2hlcyBidXQgYmVmb3JlIGl0IGlzIGRlc3Ryb3llZC4KLSAgICA8L2xpPgotICAgIDxsaT4KLSAgICAgIHtAbGluayBhbmRyb2lkLnRlc3QuUHJvdmlkZXJUZXN0Q2FzZTJ9IC0gQSBjbGFzcyBmb3IgaXNvbGF0ZWQgdGVzdGluZyBvZiBhIHNpbmdsZSB7QGxpbmsgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRQcm92aWRlcn0uIFNpbmNlIGl0IGlzIHJlc3RyaWN0ZWQgdG8gdXNpbmcgYQotICAgICAge0BsaW5rIGFuZHJvaWQudGVzdC5tb2NrLk1vY2tDb250ZW50UmVzb2x2ZXJ9IGZvciB0aGUgcHJvdmlkZXIsIGFuZCBpdCBpbmplY3RzIGFuIHtAbGluayBhbmRyb2lkLnRlc3QuSXNvbGF0ZWRDb250ZXh0fSwgeW91ciBwcm92aWRlciB0ZXN0aW5nIGlzIGlzb2xhdGVkCi0gICAgICBmcm9tIHRoZSByZXN0IG9mIHRoZSBPUy4KLSAgICA8L2xpPgotICAgIDxsaT4KLSAgICAgIHtAbGluayBhbmRyb2lkLnRlc3QuU2VydmljZVRlc3RDYXNlfSAtIGEgY2xhc3MgZm9yIGlzb2xhdGVkIHRlc3Rpbmcgb2YgYSBzaW5nbGUge0BsaW5rIGFuZHJvaWQuYXBwLlNlcnZpY2V9LiBZb3UgY2FuIGluamVjdCBhIG1vY2sgQ29udGV4dCBvcgotICAgICAgbW9jayBBcHBsaWNhdGlvbiAob3IgYm90aCksIG9yIGxldCBBbmRyb2lkIHByb3ZpZGUgeW91IGEgZnVsbCBDb250ZXh0IGFuZCBhIHtAbGluayBhbmRyb2lkLnRlc3QubW9jay5Nb2NrQXBwbGljYXRpb259LgotICAgIDwvbGk+Ci0gIDwvdWw+Ci08aDMgaWQ9Ikluc3RydW1lbnRhdGlvbiI+SW5zdHJ1bWVudGF0aW9uIHRlc3QgY2FzZSBjbGFzc2VzPC9oMz4KLTxwPgotICBUaGUgQVBJIGZvciB0ZXN0aW5nIGFjdGl2aXRpZXMgZXh0ZW5kcyB0aGUgSlVuaXQge0BsaW5rIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSBUZXN0Q2FzZX0gY2xhc3MgYW5kIGFsc28gdXNlcyB0aGUgaW5zdHJ1bWVudGF0aW9uIGZyYW1ld29yay4gV2l0aCBpbnN0cnVtZW50YXRpb24sCi0gIEFuZHJvaWQgY2FuIGF1dG9tYXRlIFVJIHRlc3RpbmcgYnkgc2VuZGluZyBldmVudHMgdG8gdGhlIGFwcGxpY2F0aW9uIHVuZGVyIHRlc3QsIHByZWNpc2VseSBjb250cm9sIHRoZSBzdGFydCBvZiBhbiBhY3Rpdml0eSwgYW5kIG1vbml0b3IgdGhlIHN0YXRlIG9mIHRoZQotICBhY3Rpdml0eSBkdXJpbmcgaXRzIGxpZmUgY3ljbGUuCisgICAgWW91IGNhbiB1c2UgdGhlIEpVbml0IHtAbGluayBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2UgVGVzdENhc2V9IGNsYXNzIHRvIGRvIHVuaXQgdGVzdGluZyBvbgorICAgIGEgcGxhaW4gSmF2YSBvYmplY3QuIDxjb2RlPlRlc3RDYXNlPC9jb2RlPiBpcyBhbHNvIHRoZSBiYXNlIGNsYXNzIGZvcgorICAgIHtAbGluayBhbmRyb2lkLnRlc3QuQW5kcm9pZFRlc3RDYXNlfSwgd2hpY2ggeW91IGNhbiB1c2UgdG8gdGVzdCBBbmRyb2lkLWRlcGVuZGVudCBvYmplY3RzLgorICAgIEJlc2lkZXMgcHJvdmlkaW5nIHRoZSBKVW5pdCBmcmFtZXdvcmssIEFuZHJvaWRUZXN0Q2FzZSBvZmZlcnMgQW5kcm9pZC1zcGVjaWZpYyBzZXR1cCwKKyAgICB0ZWFyZG93biwgYW5kIGhlbHBlciBtZXRob2RzLgogPC9wPgogPHA+Ci0gIFRoZSBiYXNlIGNsYXNzIGlzIHtAbGluayBhbmRyb2lkLnRlc3QuSW5zdHJ1bWVudGF0aW9uVGVzdENhc2V9LiBBbGwgb2YgaXRzIHN1YmNsYXNzZXMgaGF2ZSB0aGUgYWJpbGl0eSB0byBzZW5kIGEga2V5c3Ryb2tlIG9yIHRvdWNoIGV2ZW50IHRvIHRoZSBVSSBvZiB0aGUgYXBwbGljYXRpb24KLSAgdW5kZXIgdGVzdC4gVGhlIHN1YmNsYXNzZXMgY2FuIGFsc28gaW5qZWN0IGEgbW9jayBJbnRlbnQuCi0gIFRoZSBzdWJjbGFzc2VzIGFyZToKKyAgICBZb3UgdXNlIHRoZSBKVW5pdCB7QGxpbmsganVuaXQuZnJhbWV3b3JrLkFzc2VydH0gY2xhc3MgdG8gZGlzcGxheSB0ZXN0IHJlc3VsdHMuCisgICAgVGhlIGFzc2VydCBtZXRob2RzIGNvbXBhcmUgdmFsdWVzIHlvdSBleHBlY3QgZnJvbSBhIHRlc3QgdG8gdGhlIGFjdHVhbCByZXN1bHRzIGFuZAorICAgIHRocm93IGFuIGV4Y2VwdGlvbiBpZiB0aGUgY29tcGFyaXNvbiBmYWlscy4gQW5kcm9pZCBhbHNvIHByb3ZpZGVzIGEgY2xhc3Mgb2YgYXNzZXJ0aW9ucyB0aGF0CisgICAgZXh0ZW5kIHRoZSBwb3NzaWJsZSB0eXBlcyBvZiBjb21wYXJpc29ucywgYW5kIGFub3RoZXIgY2xhc3Mgb2YgYXNzZXJ0aW9ucyBmb3IgdGVzdGluZyB0aGUgVUkuCisgICAgVGhlc2UgYXJlIGRlc2NyaWJlZCBpbiBtb3JlIGRldGFpbCBpbiB0aGUgc2VjdGlvbiA8YSBocmVmPSIjQXNzZXJ0aW9uQ2xhc3NlcyI+CisgICAgQXNzZXJ0aW9uIGNsYXNzZXM8L2E+CiA8L3A+Ci0gIDx1bD4KLSAgICA8bGk+Ci0gICAgICB7QGxpbmsgYW5kcm9pZC50ZXN0LkFjdGl2aXR5VGVzdENhc2V9IC0gQSBiYXNlIGNsYXNzIGZvciBhY3Rpdml0eSB0ZXN0IGNsYXNzZXMuCi0gICAgPC9saT4KLSAgICA8bGk+Ci0gICAgICB7QGxpbmsgYW5kcm9pZC50ZXN0LlNpbmdsZUxhdW5jaEFjdGl2aXR5VGVzdENhc2V9IC0gQSBjb252ZW5pZW5jZSBjbGFzcyBmb3IgdGVzdGluZyBhIHNpbmdsZSBhY3Rpdml0eS4KLSAgICAgIEl0IGludm9rZXMge0BsaW5rIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSNzZXRVcCgpIHNldFVwKCl9IGFuZCB7QGxpbmsganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlI3RlYXJEb3duKCkgdGVhckRvd24oKX0gb25seQotICAgICAgb25jZSwgaW5zdGVhZCBvZiBvbmNlIHBlciBtZXRob2QgY2FsbC4gVXNlIGl0IHdoZW4gYWxsIG9mIHlvdXIgdGVzdCBtZXRob2RzIHJ1biBhZ2FpbnN0IHRoZSBzYW1lIGFjdGl2aXR5LgotICAgIDwvbGk+Ci0gICAgPGxpPgotICAgICAge0BsaW5rIGFuZHJvaWQudGVzdC5TeW5jQmFzZUluc3RydW1lbnRhdGlvbn0gLSBBIGNsYXNzIHRoYXQgdGVzdHMgc3luY2hyb25pemF0aW9uIG9mIGEgY29udGVudCBwcm92aWRlci4gSXQgdXNlcyBpbnN0cnVtZW50YXRpb24gdG8gY2FuY2VsIGFuZCBkaXNhYmxlCi0gICAgICBleGlzdGluZyBzeW5jaHJvbml6YXRpb25zIGJlZm9yZSBzdGFydGluZyB0aGUgdGVzdCBzeW5jaHJvbml6YXRpb24uCi0gICAgPC9saT4KLSAgICA8bGk+Ci0gICAgICB7QGxpbmsgYW5kcm9pZC50ZXN0LkFjdGl2aXR5VW5pdFRlc3RDYXNlfSAtIFRoaXMgY2xhc3MgZG9lcyBhbiBpc29sYXRlZCB0ZXN0IG9mIGEgc2luZ2xlIGFjdGl2aXR5LiBXaXRoIGl0LCB5b3UgY2FuIGluamVjdCBhIG1vY2sgY29udGV4dCBvciBhcHBsaWNhdGlvbiwgb3IgYm90aC4KLSAgICAgIEl0IGlzIGludGVuZGVkIGZvciBkb2luZyB1bml0IHRlc3RzIG9mIGFuIGFjdGl2aXR5LCBhbmQgaXMgdGhlIGFjdGl2aXR5IGVxdWl2YWxlbnQgb2YgdGhlIHRlc3QgY2xhc3NlcyBkZXNjcmliZWQgaW4gPGEgaHJlZj0iI0V4dGVuc2lvbnMiPkpVbml0IHRlc3QgY2FzZSBjbGFzc2VzPC9hPi4KLSAgICAgIDxwPiBVbmxpa2UgdGhlIG90aGVyIGluc3RydW1lbnRhdGlvbiBjbGFzc2VzLCB0aGlzIHRlc3QgY2xhc3MgY2Fubm90IGluamVjdCBhIG1vY2sgSW50ZW50LjwvcD4KLSAgICA8L2xpPgotICAgIDxsaT4KLSAgICAgIHtAbGluayBhbmRyb2lkLnRlc3QuQWN0aXZpdHlJbnN0cnVtZW50YXRpb25UZXN0Q2FzZTJ9IC0gVGhpcyBjbGFzcyB0ZXN0cyBhIHNpbmdsZSBhY3Rpdml0eSB3aXRoaW4gdGhlIG5vcm1hbCBzeXN0ZW0gZW52aXJvbm1lbnQuCi0gICAgICBZb3UgY2Fubm90IGluamVjdCBhIG1vY2sgQ29udGV4dCwgYnV0IHlvdSBjYW4gaW5qZWN0IG1vY2sgSW50ZW50cy4gQWxzbywgeW91IGNhbiBydW4gYSB0ZXN0IG1ldGhvZCBvbiB0aGUgVUkgdGhyZWFkICh0aGUgbWFpbiB0aHJlYWQgb2YgdGhlIGFwcGxpY2F0aW9uIHVuZGVyIHRlc3QpLAotICAgICAgd2hpY2ggYWxsb3dzIHlvdSB0byBzZW5kIGtleSBhbmQgdG91Y2ggZXZlbnRzIHRvIHRoZSBhcHBsaWNhdGlvbiBVSS4KLSAgICA8L2xpPgotICA8L3VsPgotPGgzIGlkPSJBc3NlcnQiPkFzc2VydCBjbGFzc2VzPC9oMz4KIDxwPgotICBBbmRyb2lkIGFsc28gZXh0ZW5kcyB0aGUgSlVuaXQge0BsaW5rIGp1bml0LmZyYW1ld29yay5Bc3NlcnR9IGNsYXNzIHRoYXQgaXMgdGhlIGJhc2lzIG9mIDxjb2RlPmFzc2VydCgpPC9jb2RlPiBjYWxscyBpbiB0ZXN0cy4KLSAgVGhlcmUgYXJlIHR3byBleHRlbnNpb25zIHRvIHRoaXMgY2xhc3MsIHtAbGluayBhbmRyb2lkLnRlc3QuTW9yZUFzc2VydHN9IGFuZCB7QGxpbmsgYW5kcm9pZC50ZXN0LlZpZXdBc3NlcnRzfToKKyAgICBUbyBsZWFybiBtb3JlIGFib3V0IEpVbml0LCB5b3UgY2FuIHJlYWQgdGhlIGRvY3VtZW50YXRpb24gb24gdGhlCisgICAgPGEgaHJlZj0iaHR0cDovL3d3dy5qdW5pdC5vcmciPmp1bml0Lm9yZzwvYT4gaG9tZSBwYWdlLgorICAgIE5vdGUgdGhhdCB0aGUgQW5kcm9pZCB0ZXN0aW5nIEFQSSBzdXBwb3J0cyBKVW5pdCAzIGNvZGUgc3R5bGUsIGJ1dCBub3QgSlVuaXQgNC4gQWxzbywgeW91IG11c3QKKyAgICB1c2UgQW5kcm9pZCdzIGluc3RydW1lbnRlZCB0ZXN0IHJ1bm5lciB7QGxpbmsgYW5kcm9pZC50ZXN0Lkluc3RydW1lbnRhdGlvblRlc3RSdW5uZXJ9IHRvIHJ1bgorICAgIHlvdXIgdGVzdCBjYXNlIGNsYXNzZXMuIFRoaXMgdGVzdCBydW5uZXIgaXMgZGVzY3JpYmVkIGluIHRoZQorICAgIHNlY3Rpb24gPGEgaHJlZj0iI0luc3RydW1lbnRhdGlvblRlc3RSdW5uZXIiPlJ1bm5pbmcgVGVzdHM8L2E+LgorPC9wPgorPGgzIGlkPSJJbnN0cnVtZW50YXRpb24iPkluc3RydW1lbnRhdGlvbjwvaDM+Cis8cD4KKyAgICBBbmRyb2lkIGluc3RydW1lbnRhdGlvbiBpcyBhIHNldCBvZiBjb250cm9sIG1ldGhvZHMgb3IgImhvb2tzIiBpbiB0aGUgQW5kcm9pZCBzeXN0ZW0uIFRoZXNlIGhvb2tzCisgICAgY29udHJvbCBhbiBBbmRyb2lkIGNvbXBvbmVudCBpbmRlcGVuZGVudGx5IG9mIGl0cyBub3JtYWwgbGlmZWN5Y2xlLiBUaGV5IGFsc28gY29udHJvbCBob3cKKyAgICBBbmRyb2lkIGxvYWRzIGFwcGxpY2F0aW9ucy4KKzwvcD4KKzxwPgorICAgIE5vcm1hbGx5LCBhbiBBbmRyb2lkIGNvbXBvbmVudCBydW5zIGluIGEgbGlmZWN5Y2xlIGRldGVybWluZWQgYnkgdGhlIHN5c3RlbS4gRm9yIGV4YW1wbGUsIGFuCisgICAgQWN0aXZpdHkgb2JqZWN0J3MgbGlmZWN5Y2xlIHN0YXJ0cyB3aGVuIHRoZSBBY3Rpdml0eSBpcyBhY3RpdmF0ZWQgYnkgYW4gSW50ZW50LiBUaGUgb2JqZWN0J3MKKyAgICA8Y29kZT5vbkNyZWF0ZSgpPC9jb2RlPiBtZXRob2QgaXMgY2FsbGVkLCBmb2xsb3dlZCBieSA8Y29kZT5vblJlc3VtZSgpPC9jb2RlPi4gV2hlbiB0aGUgdXNlcgorICAgIHN0YXJ0cyBhbm90aGVyIGFwcGxpY2F0aW9uLCB0aGUgPGNvZGU+b25QYXVzZSgpPC9jb2RlPiBtZXRob2QgaXMgY2FsbGVkLiBJZiB0aGUgQWN0aXZpdHkKKyAgICBjb2RlIGNhbGxzIHRoZSA8Y29kZT5maW5pc2goKTwvY29kZT4gbWV0aG9kLCB0aGUgPGNvZGU+b25EZXN0cm95KCk8L2NvZGU+IG1ldGhvZCBpcyBjYWxsZWQuCisgICAgVGhlIEFuZHJvaWQgZnJhbWV3b3JrIEFQSSBkb2VzIG5vdCBwcm92aWRlIGEgd2F5IGZvciB5b3VyIGNvZGUgdG8gaW52b2tlIHRoZXNlIGNhbGxiYWNrCisgICAgbWV0aG9kcyBkaXJlY3RseSwgYnV0IHlvdSBjYW4gZG8gc28gdXNpbmcgaW5zdHJ1bWVudGF0aW9uLgorPC9wPgorPHA+CisgICAgQWxzbywgdGhlIHN5c3RlbSBydW5zIGFsbCB0aGUgY29tcG9uZW50cyBvZiBhbiBhcHBsaWNhdGlvbiBpbnRvIHRoZSBzYW1lCisgICAgcHJvY2Vzcy4gWW91IGNhbiBhbGxvdyBzb21lIGNvbXBvbmVudHMsIHN1Y2ggYXMgY29udGVudCBwcm92aWRlcnMsIHRvIHJ1biBpbiBhIHNlcGFyYXRlIHByb2Nlc3MsCisgICAgYnV0IHlvdSBjYW4ndCBmb3JjZSBhbiBhcHBsaWNhdGlvbiB0byBydW4gaW4gdGhlIHNhbWUgcHJvY2VzcyBhcyBhbm90aGVyIGFwcGxpY2F0aW9uIHRoYXQgaXMKKyAgICBhbHJlYWR5IHJ1bm5pbmcuCis8L3A+Cis8cD4KKyAgICBXaXRoIEFuZHJvaWQgaW5zdHJ1bWVudGF0aW9uLCB0aG91Z2gsIHlvdSBjYW4gaW52b2tlIGNhbGxiYWNrIG1ldGhvZHMgaW4geW91ciB0ZXN0IGNvZGUuCisgICAgVGhpcyBhbGxvd3MgeW91IHRvIHJ1biB0aHJvdWdoIHRoZSBsaWZlY3ljbGUgb2YgYSBjb21wb25lbnQgc3RlcCBieSBzdGVwLCBhcyBpZiB5b3Ugd2VyZQorICAgIGRlYnVnZ2luZyB0aGUgY29tcG9uZW50LiBUaGUgZm9sbG93aW5nIHRlc3QgY29kZSBzbmlwcGV0IGRlbW9uc3RyYXRlcyBob3cgdG8gdXNlIHRoaXMgdG8KKyAgICB0ZXN0IHRoYXQgYW4gQWN0aXZpdHkgc2F2ZXMgYW5kIHJlc3RvcmVzIGl0cyBzdGF0ZToKKzwvcD4KKzxhIG5hbWU9IkFjdGl2aXR5U25pcHBldCI+PC9hPgorPHByZT4KKyAgICAvLyBTdGFydCB0aGUgbWFpbiBhY3Rpdml0eSBvZiB0aGUgYXBwbGljYXRpb24gdW5kZXIgdGVzdAorICAgIG1BY3Rpdml0eSA9IGdldEFjdGl2aXR5KCk7CisKKyAgICAvLyBHZXQgYSBoYW5kbGUgdG8gdGhlIEFjdGl2aXR5IG9iamVjdCdzIG1haW4gVUkgd2lkZ2V0LCBhIFNwaW5uZXIKKyAgICBtU3Bpbm5lciA9IChTcGlubmVyKW1BY3Rpdml0eS5maW5kVmlld0J5SWQoY29tLmFuZHJvaWQuZXhhbXBsZS5zcGlubmVyLlIuaWQuU3Bpbm5lcjAxKTsKKworICAgIC8vIFNldCB0aGUgU3Bpbm5lciB0byBhIGtub3duIHBvc2l0aW9uCisgICAgbUFjdGl2aXR5LnNldFNwaW5uZXJQb3NpdGlvbihURVNUX1NUQVRFX0RFU1RST1lfUE9TSVRJT04pOworCisgICAgLy8gU3RvcCB0aGUgYWN0aXZpdHkgLSBUaGUgb25EZXN0cm95KCkgbWV0aG9kIHNob3VsZCBzYXZlIHRoZSBzdGF0ZSBvZiB0aGUgU3Bpbm5lcgorICAgIG1BY3Rpdml0eS5maW5pc2goKTsKKworICAgIC8vIFJlLXN0YXJ0IHRoZSBBY3Rpdml0eSAtIHRoZSBvblJlc3VtZSgpIG1ldGhvZCBzaG91bGQgcmVzdG9yZSB0aGUgc3RhdGUgb2YgdGhlIFNwaW5uZXIKKyAgICBtQWN0aXZpdHkgPSBnZXRBY3Rpdml0eSgpOworCisgICAgLy8gR2V0IHRoZSBTcGlubmVyJ3MgY3VycmVudCBwb3NpdGlvbgorICAgIGludCBjdXJyZW50UG9zaXRpb24gPSBtQWN0aXZpdHkuZ2V0U3Bpbm5lclBvc2l0aW9uKCk7CisKKyAgICAvLyBBc3NlcnQgdGhhdCB0aGUgY3VycmVudCBwb3NpdGlvbiBpcyB0aGUgc2FtZSBhcyB0aGUgc3RhcnRpbmcgcG9zaXRpb24KKyAgICBhc3NlcnRFcXVhbHMoVEVTVF9TVEFURV9ERVNUUk9ZX1BPU0lUSU9OLCBjdXJyZW50UG9zaXRpb24pOworPC9wcmU+Cis8cD4KKyAgICBUaGUga2V5IG1ldGhvZCB1c2VkIGhlcmUgaXMKKyAgICB7QGxpbmsgYW5kcm9pZC50ZXN0LkFjdGl2aXR5SW5zdHJ1bWVudGF0aW9uVGVzdENhc2UyI2dldEFjdGl2aXR5KCl9LCB3aGljaCBpcyBhCisgICAgcGFydCBvZiB0aGUgaW5zdHJ1bWVudGF0aW9uIEFQSS4gVGhlIEFjdGl2aXR5IHVuZGVyIHRlc3QgaXMgbm90IHN0YXJ0ZWQgdW50aWwgeW91IGNhbGwgdGhpcworICAgIG1ldGhvZC4gWW91IGNhbiBzZXQgdXAgdGhlIHRlc3QgZml4dHVyZSBpbiBhZHZhbmNlLCBhbmQgdGhlbiBjYWxsIHRoaXMgbWV0aG9kIHRvIHN0YXJ0IHRoZQorICAgIEFjdGl2aXR5LgorPC9wPgorPHA+CisgICAgQWxzbywgaW5zdHJ1bWVudGF0aW9uIGNhbiBsb2FkIGJvdGggYSB0ZXN0IHBhY2thZ2UgYW5kIHRoZSBhcHBsaWNhdGlvbiB1bmRlciB0ZXN0IGludG8gdGhlCisgICAgc2FtZSBwcm9jZXNzLiBTaW5jZSB0aGUgYXBwbGljYXRpb24gY29tcG9uZW50cyBhbmQgdGhlaXIgdGVzdHMgYXJlIGluIHRoZSBzYW1lIHByb2Nlc3MsIHRoZQorICAgIHRlc3RzIGNhbiBpbnZva2UgbWV0aG9kcyBpbiB0aGUgY29tcG9uZW50cywgYW5kIG1vZGlmeSBhbmQgZXhhbWluZSBmaWVsZHMgaW4gdGhlIGNvbXBvbmVudHMuCis8L3A+Cis8aDMgaWQ9IlRlc3RDYXNlQ2xhc3NlcyI+VGVzdCBjYXNlIGNsYXNzZXM8L2gzPgorPHA+CisgICAgQW5kcm9pZCBwcm92aWRlcyBzZXZlcmFsIHRlc3QgY2FzZSBjbGFzc2VzIHRoYXQgZXh0ZW5kIHtAbGluayBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2V9IGFuZAorICAgIHtAbGluayBqdW5pdC5mcmFtZXdvcmsuQXNzZXJ0fSB3aXRoIEFuZHJvaWQtc3BlY2lmaWMgc2V0dXAsIHRlYXJkb3duLCBhbmQgaGVscGVyIG1ldGhvZHMuCis8L3A+Cis8aDQgaWQ9IkFuZHJvaWRUZXN0Q2FzZSI+QW5kcm9pZFRlc3RDYXNlPC9oND4KKzxwPgorICAgIEEgdXNlZnVsIGdlbmVyYWwgdGVzdCBjYXNlIGNsYXNzLCBlc3BlY2lhbGx5IGlmIHlvdSBhcmUKKyAgICBqdXN0IHN0YXJ0aW5nIG91dCB3aXRoIEFuZHJvaWQgdGVzdGluZywgaXMge0BsaW5rIGFuZHJvaWQudGVzdC5BbmRyb2lkVGVzdENhc2V9LiBJdCBleHRlbmRzCisgICAgYm90aCB7QGxpbmsganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlfSBhbmQge0BsaW5rIGp1bml0LmZyYW1ld29yay5Bc3NlcnR9LiBJdCBwcm92aWRlcyB0aGUKKyAgICBKVW5pdC1zdGFuZGFyZCA8Y29kZT5zZXRVcCgpPC9jb2RlPiBhbmQgPGNvZGU+dGVhckRvd24oKTwvY29kZT4gbWV0aG9kcywgYXMgd2VsbCBhcyB3ZWxsIGFzCisgICAgYWxsIG9mIEpVbml0J3MgQXNzZXJ0IG1ldGhvZHMuIEluIGFkZGl0aW9uLCBpdCBwcm92aWRlcyBtZXRob2RzIGZvciB0ZXN0aW5nIHBlcm1pc3Npb25zLCBhbmQgYQorICAgIG1ldGhvZCB0aGF0IGd1YXJkcyBhZ2FpbnN0IG1lbW9yeSBsZWFrcyBieSBjbGVhcmluZyBvdXQgY2VydGFpbiBjbGFzcyByZWZlcmVuY2VzLgorPC9wPgorPGg0IGlkPSJDb21wb25lbnRUZXN0Q2FzZSI+Q29tcG9uZW50LXNwZWNpZmljIHRlc3QgY2FzZXM8L2g0PgorPHA+CisgICAgQSBrZXkgZmVhdHVyZSBvZiB0aGUgQW5kcm9pZCB0ZXN0aW5nIGZyYW1ld29yayBpcyBpdHMgY29tcG9uZW50LXNwZWNpZmljIHRlc3QgY2FzZSBjbGFzc2VzLgorICAgIFRoZXNlIGFkZHJlc3Mgc3BlY2lmaWMgY29tcG9uZW50IHRlc3RpbmcgbmVlZHMgd2l0aCBtZXRob2RzIGZvciBmaXh0dXJlIHNldHVwIGFuZAorICAgIHRlYXJkb3duIGFuZCBjb21wb25lbnQgbGlmZWN5Y2xlIGNvbnRyb2wuIFRoZXkgYWxzbyBwcm92aWRlIG1ldGhvZHMgZm9yIHNldHRpbmcgdXAgbW9jayBvYmplY3RzLgorICAgIFRoZXNlIGNsYXNzZXMgYXJlIGRlc2NyaWJlZCBpbiB0aGUgY29tcG9uZW50LXNwZWNpZmljIHRlc3RpbmcgdG9waWNzOgogPC9wPgogPHVsPgotICA8bGk+Ci0gICAgVGhlIDxjb2RlPk1vcmVBc3NlcnRzPC9jb2RlPiBjbGFzcyBjb250YWlucyBtb3JlIHBvd2VyZnVsIGFzc2VydGlvbnMgc3VjaCBhcyB7QGxpbmsgYW5kcm9pZC50ZXN0Lk1vcmVBc3NlcnRzI2Fzc2VydENvbnRhaW5zUmVnZXh9IHRoYXQgZG9lcyByZWd1bGFyIGV4cHJlc3Npb24gbWF0Y2hpbmcuCi0gIDwvbGk+Ci0gIDxsaT4KLSAgICBUaGUge0BsaW5rIGFuZHJvaWQudGVzdC5WaWV3QXNzZXJ0c30gY2xhc3MgY29udGFpbnMgdXNlZnVsIGFzc2VydGlvbnMgYWJvdXQgQW5kcm9pZCBWaWV3cywgc3VjaCBhcyB7QGxpbmsgYW5kcm9pZC50ZXN0LlZpZXdBc3NlcnRzI2Fzc2VydEhhc1NjcmVlbkNvb3JkaW5hdGVzfSB0aGF0IHRlc3RzIGlmIGEgVmlldyBoYXMgYSBwYXJ0aWN1bGFyIFggYW5kIFkKLSAgICBwb3NpdGlvbiBvbiB0aGUgdmlzaWJsZSBzY3JlZW4uIFRoZXNlIGFzc2VydHMgc2ltcGxpZnkgdGVzdGluZyBvZiBnZW9tZXRyeSBhbmQgYWxpZ25tZW50IGluIHRoZSBVSS4KLSAgPC9saT4KKyAgICA8bGk+CisgICAgICAgIDxhIGhyZWY9IntAZG9jUm9vdH1ndWlkZS90b3BpY3MvdGVzdGluZy9hY3Rpdml0eV90ZXN0aW5nLmh0bWwiPkFjdGl2aXR5IFRlc3Rpbmc8L2E+CisgICAgPC9saT4KKyAgICA8bGk+CisgICAgICAgIDxhIGhyZWY9IntAZG9jUm9vdH1ndWlkZS90b3BpY3MvdGVzdGluZy9jb250ZW50cHJvdmlkZXJfdGVzdGluZy5odG1sIj4KKyAgICAgICAgQ29udGVudCBQcm92aWRlciBUZXN0aW5nPC9hPgorICAgIDwvbGk+CisgICAgPGxpPgorICAgICAgICA8YSBocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvdG9waWNzL3Rlc3Rpbmcvc2VydmljZV90ZXN0aW5nLmh0bWwiPlNlcnZpY2UgVGVzdGluZzwvYT4KKyAgICA8L2xpPgogPC91bD4KLTxoMyBpZD0iTW9ja09iamVjdHMiPk1vY2sgb2JqZWN0IGNsYXNzZXM8L2gzPgotICA8cD4KLSAgICBBbmRyb2lkIGhhcyBjb252ZW5pZW5jZSBjbGFzc2VzIGZvciBjcmVhdGluZyBtb2NrIHN5c3RlbSBvYmplY3RzIHN1Y2ggYXMgYXBwbGljYXRpb25zLCBjb250ZXh0cywgY29udGVudCByZXNvbHZlcnMsIGFuZCByZXNvdXJjZXMuIEFuZHJvaWQgYWxzbyBwcm92aWRlcwotICAgIG1ldGhvZHMgaW4gc29tZSB0ZXN0IGNsYXNzZXMgZm9yIGNyZWF0aW5nIG1vY2sgSW50ZW50cy4gVXNlIHRoZXNlIG1vY2tzIHRvIGZhY2lsaXRhdGUgZGVwZW5kZW5jeSBpbmplY3Rpb24sIHNpbmNlIHRoZXkgYXJlIGVhc2llciB0byB1c2UgdGhhbiBjcmVhdGluZyB0aGVpcgotICAgIHJlYWwgY291bnRlcnBhcnRzLiBUaGVzZSBjb252ZW5pZW5jZSBjbGFzc2VzIGFyZSBmb3VuZCBpbiB7QGxpbmsgYW5kcm9pZC50ZXN0fSBhbmQge0BsaW5rIGFuZHJvaWQudGVzdC5tb2NrfS4gVGhleSBhcmU6Ci0gIDwvcD4KKzxwPgorICAgIEFuZHJvaWQgZG9lcyBub3QgcHJvdmlkZSBhIHNlcGFyYXRlIHRlc3QgY2FzZSBjbGFzcyBmb3IgQnJvYWRjYXN0UmVjZWl2ZXIuIEluc3RlYWQsIHRlc3QgYQorICAgIEJyb2FkY2FzdFJlY2VpdmVyIGJ5IHRlc3RpbmcgdGhlIGNvbXBvbmVudCB0aGF0IHNlbmRzIGl0IEludGVudCBvYmplY3RzLCB0byB2ZXJpZnkgdGhhdCB0aGUKKyAgICBCcm9hZGNhc3RSZWNlaXZlciByZXNwb25kcyBjb3JyZWN0bHkuCis8L3A+Cis8aDQgaWQ9IkFwcGxpY2F0aW9uVGVzdENhc2UiPkFwcGxpY2F0aW9uVGVzdENhc2U8L2g0PgorPHA+CisgICAgWW91IHVzZSB0aGUge0BsaW5rIGFuZHJvaWQudGVzdC5BcHBsaWNhdGlvblRlc3RDYXNlfSB0ZXN0IGNhc2UgY2xhc3MgdG8gdGVzdCB0aGUgc2V0dXAgYW5kCisgICAgdGVhcmRvd24gb2Yge0BsaW5rIGFuZHJvaWQuYXBwLkFwcGxpY2F0aW9ufSBvYmplY3RzLiBUaGVzZSBvYmplY3RzIG1haW50YWluIHRoZSBnbG9iYWwgc3RhdGUgb2YKKyAgICBpbmZvcm1hdGlvbiB0aGF0IGFwcGxpZXMgdG8gYWxsIHRoZSBjb21wb25lbnRzIGluIGFuIGFwcGxpY2F0aW9uIHBhY2thZ2UuIFRoZSB0ZXN0IGNhc2UgY2FuCisgICAgYmUgdXNlZnVsIGluIHZlcmlmeWluZyB0aGF0IHRoZSAmbHQ7YXBwbGljYXRpb24mZ3Q7IGVsZW1lbnQgaW4gdGhlIG1hbmlmZXN0IGZpbGUgaXMgY29ycmVjdGx5CisgICAgc2V0IHVwLiBOb3RlLCBob3dldmVyLCB0aGF0IHRoaXMgdGVzdCBjYXNlIGRvZXMgbm90IGFsbG93IHlvdSB0byBjb250cm9sIHRlc3Rpbmcgb2YgdGhlCisgICAgY29tcG9uZW50cyB3aXRoaW4geW91ciBhcHBsaWNhdGlvbiBwYWNrYWdlLgorPC9wPgorPGg0IGlkPSJJbnN0cnVtZW50YXRpb25UZXN0Q2FzZSI+SW5zdHJ1bWVudGF0aW9uVGVzdENhc2U8L2g0PgorPHA+CisgICAgSWYgeW91IHdhbnQgdG8gdXNlIGluc3RydW1lbnRhdGlvbiBtZXRob2RzIGluIGEgdGVzdCBjYXNlIGNsYXNzLCB5b3UgbXVzdCB1c2UKKyAgICB7QGxpbmsgYW5kcm9pZC50ZXN0Lkluc3RydW1lbnRhdGlvblRlc3RDYXNlfSBvciBvbmUgb2YgaXRzIHN1YmNsYXNzZXMuIFRoZQorICAgIHtAbGluayBhbmRyb2lkLmFwcC5BY3Rpdml0eX0gdGVzdCBjYXNlcyBleHRlbmQgdGhpcyBiYXNlIGNsYXNzIHdpdGggb3RoZXIgZnVuY3Rpb25hbGl0eSB0aGF0CisgICAgYXNzaXN0cyBpbiBBY3Rpdml0eSB0ZXN0aW5nLgorPC9wPgorCis8aDMgaWQ9IkFzc2VydGlvbkNsYXNzZXMiPkFzc2VydGlvbiBjbGFzc2VzPC9oMz4KKzxwPgorICAgIEJlY2F1c2UgQW5kcm9pZCB0ZXN0IGNhc2UgY2xhc3NlcyBleHRlbmQgSlVuaXQsIHlvdSBjYW4gdXNlIGFzc2VydGlvbiBtZXRob2RzIHRvIGRpc3BsYXkgdGhlCisgICAgcmVzdWx0cyBvZiB0ZXN0cy4gQW4gYXNzZXJ0aW9uIG1ldGhvZCBjb21wYXJlcyBhbiBhY3R1YWwgdmFsdWUgcmV0dXJuZWQgYnkgYSB0ZXN0IHRvIGFuCisgICAgZXhwZWN0ZWQgdmFsdWUsIGFuZCB0aHJvd3MgYW4gQXNzZXJ0aW9uRXhjZXB0aW9uIGlmIHRoZSBjb21wYXJpc29uIHRlc3QgZmFpbHMuIFVzaW5nIGFzc2VydGlvbnMKKyAgICBpcyBtb3JlIGNvbnZlbmllbnQgdGhhbiBkb2luZyBsb2dnaW5nLCBhbmQgcHJvdmlkZXMgYmV0dGVyIHRlc3QgcGVyZm9ybWFuY2UuCis8L3A+Cis8cD4KKyAgICBCZXNpZGVzIHRoZSBKVW5pdCB7QGxpbmsganVuaXQuZnJhbWV3b3JrLkFzc2VydH0gY2xhc3MgbWV0aG9kcywgdGhlIHRlc3RpbmcgQVBJIGFsc28gcHJvdmlkZXMKKyAgICB0aGUge0BsaW5rIGFuZHJvaWQudGVzdC5Nb3JlQXNzZXJ0c30gYW5kIHtAbGluayBhbmRyb2lkLnRlc3QuVmlld0Fzc2VydHN9IGNsYXNzZXM6Cis8L3A+Cis8dWw+CisgICAgPGxpPgorICAgICAgICB7QGxpbmsgYW5kcm9pZC50ZXN0Lk1vcmVBc3NlcnRzfSBjb250YWlucyBtb3JlIHBvd2VyZnVsIGFzc2VydGlvbnMgc3VjaCBhcworICAgICAgICB7QGxpbmsgYW5kcm9pZC50ZXN0Lk1vcmVBc3NlcnRzI2Fzc2VydENvbnRhaW5zUmVnZXh9LCB3aGljaCBkb2VzIHJlZ3VsYXIgZXhwcmVzc2lvbgorICAgICAgICBtYXRjaGluZy4KKyAgICA8L2xpPgorICAgIDxsaT4KKyAgICAgICAge0BsaW5rIGFuZHJvaWQudGVzdC5WaWV3QXNzZXJ0c30gY29udGFpbnMgdXNlZnVsIGFzc2VydGlvbnMgYWJvdXQgVmlld3MuIEZvciBleGFtcGxlCisgICAgICAgIGl0IGNvbnRhaW5zIHtAbGluayBhbmRyb2lkLnRlc3QuVmlld0Fzc2VydHMjYXNzZXJ0SGFzU2NyZWVuQ29vcmRpbmF0ZXN9IHRoYXQgdGVzdHMgaWYgYSBWaWV3CisgICAgICAgIGhhcyBhIHBhcnRpY3VsYXIgWCBhbmQgWSBwb3NpdGlvbiBvbiB0aGUgdmlzaWJsZSBzY3JlZW4uIFRoZXNlIGFzc2VydHMgc2ltcGxpZnkgdGVzdGluZyBvZgorICAgICAgICBnZW9tZXRyeSBhbmQgYWxpZ25tZW50IGluIHRoZSBVSS4KKyAgICA8L2xpPgorPC91bD4KKzxoMyBpZD0iTW9ja09iamVjdENsYXNzZXMiPk1vY2sgb2JqZWN0IGNsYXNzZXM8L2gzPgorPHA+CisgICAgVG8gZmFjaWxpdGF0ZSBkZXBlbmRlbmN5IGluamVjdGlvbiBpbiB0ZXN0aW5nLCBBbmRyb2lkIHByb3ZpZGVzIGNsYXNzZXMgdGhhdCBjcmVhdGUgbW9jayBzeXN0ZW0KKyAgICBvYmplY3RzIHN1Y2ggYXMge0BsaW5rIGFuZHJvaWQuY29udGVudC5Db250ZXh0fSBvYmplY3RzLAorICAgIHtAbGluayBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFByb3ZpZGVyfSBvYmplY3RzLCB7QGxpbmsgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRSZXNvbHZlcn0KKyAgICBvYmplY3RzLCBhbmQge0BsaW5rIGFuZHJvaWQuYXBwLlNlcnZpY2V9IG9iamVjdHMuIFNvbWUgdGVzdCBjYXNlcyBhbHNvIHByb3ZpZGUgbW9jaworICAgIHtAbGluayBhbmRyb2lkLmNvbnRlbnQuSW50ZW50fSBvYmplY3RzLiBZb3UgdXNlIHRoZXNlIG1vY2tzIGJvdGggdG8gaXNvbGF0ZSB0ZXN0cworICAgIGZyb20gdGhlIHJlc3Qgb2YgdGhlIHN5c3RlbSBhbmQgdG8gZmFjaWxpdGF0ZSBkZXBlbmRlbmN5IGluamVjdGlvbiBmb3IgdGVzdGluZy4gVGhlc2UgY2xhc3NlcworICAgIGFyZSBmb3VuZCBpbiB0aGUgSmF2YSBwYWNrYWdlcyB7QGxpbmsgYW5kcm9pZC50ZXN0fSBhbmQge0BsaW5rIGFuZHJvaWQudGVzdC5tb2NrfS4KKzwvcD4KKzxwPgorICAgIE1vY2sgb2JqZWN0cyBpc29sYXRlIHRlc3RzIGZyb20gYSBydW5uaW5nIHN5c3RlbSBieSBzdHViYmluZyBvdXQgb3Igb3ZlcnJpZGluZworICAgIG5vcm1hbCBvcGVyYXRpb25zLiBGb3IgZXhhbXBsZSwgYSB7QGxpbmsgYW5kcm9pZC50ZXN0Lm1vY2suTW9ja0NvbnRlbnRSZXNvbHZlcn0KKyAgICByZXBsYWNlcyB0aGUgbm9ybWFsIHJlc29sdmVyIGZyYW1ld29yayB3aXRoIGl0cyBvd24gbG9jYWwgZnJhbWV3b3JrLCB3aGljaCBpcyBpc29sYXRlZAorICAgIGZyb20gdGhlIHJlc3Qgb2YgdGhlIHN5c3RlbS4gTW9ja0NvbnRlbnRSZXNvbHZlciBhbHNvIGFsc28gc3R1YnMgb3V0IHRoZQorICAgIHtAbGluayBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFJlc29sdmVyI25vdGlmeUNoYW5nZShVcmksIENvbnRlbnRPYnNlcnZlciwgYm9vbGVhbil9IG1ldGhvZAorICAgIHNvIHRoYXQgb2JzZXJ2ZXIgb2JqZWN0cyBvdXRzaWRlIHRoZSB0ZXN0IGVudmlyb25tZW50IGFyZSBub3QgYWNjaWRlbnRhbGx5IHRyaWdnZXJlZC4KKzwvcD4KKzxwPgorICAgIE1vY2sgb2JqZWN0IGNsYXNzZXMgYWxzbyBmYWNpbGl0YXRlIGRlcGVuZGVuY3kgaW5qZWN0aW9uIGJ5IHByb3ZpZGluZyBhIHN1YmNsYXNzIG9mIHRoZQorICAgIG5vcm1hbCBvYmplY3QgdGhhdCBpcyBub24tZnVuY3Rpb25hbCBleGNlcHQgZm9yIG92ZXJyaWRlcyB5b3UgZGVmaW5lLiBGb3IgZXhhbXBsZSwgdGhlCisgICAge0BsaW5rIGFuZHJvaWQudGVzdC5tb2NrLk1vY2tSZXNvdXJjZXN9IG9iamVjdCBwcm92aWRlcyBhIHN1YmNsYXNzIG9mCisgICAge0BsaW5rIGFuZHJvaWQuY29udGVudC5yZXMuUmVzb3VyY2VzfSBpbiB3aGljaCBhbGwgdGhlIG1ldGhvZHMgdGhyb3cgRXhjZXB0aW9ucyB3aGVuIGNhbGxlZC4KKyAgICBUbyB1c2UgaXQsIHlvdSBvdmVycmlkZSBvbmx5IHRob3NlIG1ldGhvZHMgdGhhdCBtdXN0IHByb3ZpZGUgaW5mb3JtYXRpb24uCis8L3A+Cis8cD4KKyAgICBUaGVzZSBhcmUgdGhlIG1vY2sgb2JqZWN0IGNsYXNzZXMgYXZhaWxhYmxlIGluIEFuZHJvaWQ6Cis8L3A+Cis8aDQgaWQ9IlNpbXBsZU1vY2tzIj5TaW1wbGUgbW9jayBvYmplY3QgY2xhc3NlczwvaDQ+Cis8cD4KKyAgICB7QGxpbmsgYW5kcm9pZC50ZXN0Lm1vY2suTW9ja0FwcGxpY2F0aW9ufSwge0BsaW5rIGFuZHJvaWQudGVzdC5tb2NrLk1vY2tDb250ZXh0fSwKKyAgICB7QGxpbmsgYW5kcm9pZC50ZXN0Lm1vY2suTW9ja0NvbnRlbnRQcm92aWRlcn0sIHtAbGluayBhbmRyb2lkLnRlc3QubW9jay5Nb2NrQ3Vyc29yfSwKKyAgICB7QGxpbmsgYW5kcm9pZC50ZXN0Lm1vY2suTW9ja0RpYWxvZ0ludGVyZmFjZX0sIHtAbGluayBhbmRyb2lkLnRlc3QubW9jay5Nb2NrUGFja2FnZU1hbmFnZXJ9LCBhbmQKKyAgICB7QGxpbmsgYW5kcm9pZC50ZXN0Lm1vY2suTW9ja1Jlc291cmNlc30gcHJvdmlkZSBhIHNpbXBsZSBhbmQgdXNlZnVsIG1vY2sgc3RyYXRlZ3kuIFRoZXkgYXJlCisgICAgc3R1YmJlZC1vdXQgdmVyc2lvbnMgb2YgdGhlIGNvcnJlc3BvbmRpbmcgc3lzdGVtIG9iamVjdCBjbGFzcywgYW5kIGFsbCBvZiB0aGVpciBtZXRob2RzIHRocm93IGFuCisgICAge0BsaW5rIGphdmEubGFuZy5VbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbn0gZXhjZXB0aW9uIGlmIGNhbGxlZC4gVG8gdXNlIHRoZW0sIHlvdSBvdmVycmlkZQorICAgIHRoZSBtZXRob2RzIHlvdSBuZWVkIGluIG9yZGVyIHRvIHByb3ZpZGUgbW9jayBkZXBlbmRlbmNpZXMuCis8L3A+Cis8cCBjbGFzcz0iTm90ZSI+PHN0cm9uZz5Ob3RlOjwvc3Ryb25nPgorICAgIHtAbGluayBhbmRyb2lkLnRlc3QubW9jay5Nb2NrQ29udGVudFByb3ZpZGVyfQorICAgIGFuZCB7QGxpbmsgYW5kcm9pZC50ZXN0Lm1vY2suTW9ja0N1cnNvcn0gYXJlIG5ldyBhcyBvZiBBUEkgbGV2ZWwgOC4KKzwvcD4KKzxoNCBpZD0iUmVzb2x2ZXJNb2NrcyI+UmVzb2x2ZXIgbW9jayBvYmplY3RzPC9oND4KKzxwPgorICAgIHtAbGluayBhbmRyb2lkLnRlc3QubW9jay5Nb2NrQ29udGVudFJlc29sdmVyfSBwcm92aWRlcyBpc29sYXRlZCB0ZXN0aW5nIG9mIGNvbnRlbnQgcHJvdmlkZXJzIGJ5CisgICAgbWFza2luZyBvdXQgdGhlIG5vcm1hbCBzeXN0ZW0gcmVzb2x2ZXIgZnJhbWV3b3JrLiBJbnN0ZWFkIG9mIGxvb2tpbmcgaW4gdGhlIHN5c3RlbSB0byBmaW5kIGEKKyAgICBjb250ZW50IHByb3ZpZGVyIGdpdmVuIGFuIGF1dGhvcml0eSBzdHJpbmcsIE1vY2tDb250ZW50UmVzb2x2ZXIgdXNlcyBpdHMgb3duIGludGVybmFsIHRhYmxlLiBZb3UKKyAgICBtdXN0IGV4cGxpY2l0bHkgYWRkIHByb3ZpZGVycyB0byB0aGlzIHRhYmxlIHVzaW5nCisgICAge0BsaW5rIGFuZHJvaWQudGVzdC5tb2NrLk1vY2tDb250ZW50UmVzb2x2ZXIjYWRkUHJvdmlkZXIoU3RyaW5nLENvbnRlbnRQcm92aWRlcil9LgorPC9wPgorPHA+CisgICAgV2l0aCB0aGlzIGZlYXR1cmUsIHlvdSBjYW4gYXNzb2NpYXRlIGEgbW9jayBjb250ZW50IHByb3ZpZGVyIHdpdGggYW4gYXV0aG9yaXR5LiBZb3UgY2FuIGNyZWF0ZQorICAgIGFuIGluc3RhbmNlIG9mIGEgcmVhbCBwcm92aWRlciBidXQgdXNlIHRlc3QgZGF0YSBpbiBpdC4gWW91IGNhbiBldmVuIHNldCB0aGUgcHJvdmlkZXIgZm9yIGFuCisgICAgYXV0aG9yaXR5IHRvIDxjb2RlPm51bGw8L2NvZGU+LiBJbiBlZmZlY3QsIGEgTW9ja0NvbnRlbnRSZXNvbHZlciBvYmplY3QgaXNvbGF0ZXMgeW91ciB0ZXN0CisgICAgZnJvbSBwcm92aWRlcnMgdGhhdCBjb250YWluIHJlYWwgZGF0YS4gWW91IGNhbiBjb250cm9sIHRoZQorICAgIGZ1bmN0aW9uIG9mIHRoZSBwcm92aWRlciwgYW5kIHlvdSBjYW4gcHJldmVudCB5b3VyIHRlc3QgZnJvbSBhZmZlY3RpbmcgcmVhbCBkYXRhLgorPC9wPgorPGgzIGlkPSJDb250ZXh0TW9ja3MiPkNvbnRleHRzIGZvciB0ZXN0aW5nPC9oMz4KKzxwPgorICAgIEFuZHJvaWQgcHJvdmlkZXMgdHdvIENvbnRleHQgY2xhc3NlcyB0aGF0IGFyZSB1c2VmdWwgZm9yIHRlc3Rpbmc6Cis8L3A+Cis8dWw+CisgICAgPGxpPgorICAgICAgICB7QGxpbmsgYW5kcm9pZC50ZXN0Lklzb2xhdGVkQ29udGV4dH0gcHJvdmlkZXMgYW4gaXNvbGF0ZWQge0BsaW5rIGFuZHJvaWQuY29udGVudC5Db250ZXh0fSwKKyAgICAgICAgRmlsZSwgZGlyZWN0b3J5LCBhbmQgZGF0YWJhc2Ugb3BlcmF0aW9ucyB0aGF0IHVzZSB0aGlzIENvbnRleHQgdGFrZSBwbGFjZSBpbiBhIHRlc3QgYXJlYS4KKyAgICAgICAgVGhvdWdoIGl0cyBmdW5jdGlvbmFsaXR5IGlzIGxpbWl0ZWQsIHRoaXMgQ29udGV4dCBoYXMgZW5vdWdoIHN0dWIgY29kZSB0byByZXNwb25kIHRvCisgICAgICAgIHN5c3RlbSBjYWxscy4KKyAgICAgICAgPHA+CisgICAgICAgICAgICBUaGlzIGNsYXNzIGFsbG93cyB5b3UgdG8gdGVzdCBhbiBhcHBsaWNhdGlvbidzIGRhdGEgb3BlcmF0aW9ucyB3aXRob3V0IGFmZmVjdGluZyByZWFsCisgICAgICAgICAgICBkYXRhIHRoYXQgbWF5IGJlIHByZXNlbnQgb24gdGhlIGRldmljZS4KKyAgICAgICAgPC9wPgorICAgIDwvbGk+CisgICAgPGxpPgorICAgICAgICB7QGxpbmsgYW5kcm9pZC50ZXN0LlJlbmFtaW5nRGVsZWdhdGluZ0NvbnRleHR9IHByb3ZpZGVzIGEgQ29udGV4dCBpbiB3aGljaAorICAgICAgICBtb3N0IGZ1bmN0aW9ucyBhcmUgaGFuZGxlZCBieSBhbiBleGlzdGluZyB7QGxpbmsgYW5kcm9pZC5jb250ZW50LkNvbnRleHR9LCBidXQKKyAgICAgICAgZmlsZSBhbmQgZGF0YWJhc2Ugb3BlcmF0aW9ucyBhcmUgaGFuZGxlZCBieSBhIHtAbGluayBhbmRyb2lkLnRlc3QuSXNvbGF0ZWRDb250ZXh0fS4KKyAgICAgICAgVGhlIGlzb2xhdGVkIHBhcnQgdXNlcyBhIHRlc3QgZGlyZWN0b3J5IGFuZCBjcmVhdGVzIHNwZWNpYWwgZmlsZSBhbmQgZGlyZWN0b3J5IG5hbWVzLgorICAgICAgICBZb3UgY2FuIGNvbnRyb2wgdGhlIG5hbWluZyB5b3Vyc2VsZiwgb3IgbGV0IHRoZSBjb25zdHJ1Y3RvciBkZXRlcm1pbmUgaXQgYXV0b21hdGljYWxseS4KKyAgICAgICAgPHA+CisgICAgICAgICAgICBUaGlzIG9iamVjdCBwcm92aWRlcyBhIHF1aWNrIHdheSB0byBzZXQgdXAgYW4gaXNvbGF0ZWQgYXJlYSBmb3IgZGF0YSBvcGVyYXRpb25zLAorICAgICAgICAgICAgd2hpbGUga2VlcGluZyBub3JtYWwgZnVuY3Rpb25hbGl0eSBmb3IgYWxsIG90aGVyIENvbnRleHQgb3BlcmF0aW9ucy4KKyAgICAgICAgPC9wPgorICAgIDwvbGk+Cis8L3VsPgorPGgyIGlkPSJJbnN0cnVtZW50YXRpb25UZXN0UnVubmVyIj5SdW5uaW5nIFRlc3RzPC9oMj4KKzxwPgorICAgIFRlc3QgY2FzZXMgYXJlIHJ1biBieSBhIHRlc3QgcnVubmVyIGNsYXNzIHRoYXQgbG9hZHMgdGhlIHRlc3QgY2FzZSBjbGFzcywgc2V0IHVwcywKKyAgICBydW5zLCBhbmQgdGVhcnMgZG93biBlYWNoIHRlc3QuIEFuIEFuZHJvaWQgdGVzdCBydW5uZXIgbXVzdCBhbHNvIGJlIGluc3RydW1lbnRlZCwgc28gdGhhdAorICAgIHRoZSBzeXN0ZW0gdXRpbGl0eSBmb3Igc3RhcnRpbmcgYXBwbGljYXRpb25zIGNhbiBjb250cm9sIGhvdyB0aGUgdGVzdCBwYWNrYWdlCisgICAgbG9hZHMgdGVzdCBjYXNlcyBhbmQgdGhlIGFwcGxpY2F0aW9uIHVuZGVyIHRlc3QuIFlvdSB0ZWxsIHRoZSBBbmRyb2lkIHBsYXRmb3JtCisgICAgd2hpY2ggaW5zdHJ1bWVudGVkIHRlc3QgcnVubmVyIHRvIHVzZSBieSBzZXR0aW5nIGEgdmFsdWUgaW4gdGhlIHRlc3QgcGFja2FnZSdzIG1hbmlmZXN0IGZpbGUuCis8L3A+Cis8cD4KKyAgICB7QGxpbmsgYW5kcm9pZC50ZXN0Lkluc3RydW1lbnRhdGlvblRlc3RSdW5uZXJ9IGlzIHRoZSBwcmltYXJ5IEFuZHJvaWQgdGVzdCBydW5uZXIgY2xhc3MuIEl0CisgICAgZXh0ZW5kcyB0aGUgSlVuaXQgdGVzdCBydW5uZXIgZnJhbWV3b3JrIGFuZCBpcyBhbHNvIGluc3RydW1lbnRlZC4gSXQgY2FuIHJ1biBhbnkgb2YgdGhlIHRlc3QKKyAgICBjYXNlIGNsYXNzZXMgcHJvdmlkZWQgYnkgQW5kcm9pZCBhbmQgc3VwcG9ydHMgYWxsIHBvc3NpYmxlIHR5cGVzIG9mIHRlc3RpbmcuCis8L3A+Cis8cD4KKyAgICBZb3Ugc3BlY2lmeSA8Y29kZT5JbnN0cnVtZW50YXRpb25UZXN0UnVubmVyPC9jb2RlPiBvciBhIHN1YmNsYXNzIGluIHlvdXIgdGVzdCBwYWNrYWdlJ3MKKyAgICBtYW5pZmVzdCBmaWxlLCBpbiB0aGUgPGEgaHJlZj0ie0Bkb2NSb290fWd1aWRlL3RvcGljcy9tYW5pZmVzdC9pbnN0cnVtZW50YXRpb24tZWxlbWVudC5odG1sIj4KKyAgICBpbnN0cnVtZW50YXRpb248L2E+IGVsZW1lbnQuIEFsc28sIDxjb2RlPkluc3RydW1lbnRhdGlvblRlc3RSdW5uZXI8L2NvZGU+IGNvZGUgcmVzaWRlcworICAgIGluIHRoZSBzaGFyZWQgbGlicmFyeSA8Y29kZT5hbmRyb2lkLnRlc3QucnVubmVyPC9jb2RlPiwgIHdoaWNoIGlzIG5vdCBub3JtYWxseSBsaW5rZWQgdG8KKyAgICBBbmRyb2lkIGNvZGUuIFRvIGluY2x1ZGUgaXQsIHlvdSBtdXN0IHNwZWNpZnkgaXQgaW4gYQorICAgIDxhIGhyZWY9IntAZG9jUm9vdH1ndWlkZS90b3BpY3MvbWFuaWZlc3QvdXNlcy1saWJyYXJ5LWVsZW1lbnQuaHRtbCI+dXNlcy1saWJyYXJ5PC9hPiBlbGVtZW50LgorICAgIFlvdSBkbyBub3QgaGF2ZSB0byBzZXQgdXAgdGhlc2UgZWxlbWVudHMgeW91cnNlbGYuIEJvdGggRWNsaXBzZSB3aXRoIEFEVCBhbmQgdGhlCisgICAgPGNvZGU+YW5kcm9pZDwvY29kZT4gY29tbWFuZC1saW5lIHRvb2wgY29uc3RydWN0IHRoZW0gYXV0b21hdGljYWxseSBhbmQgYWRkIHRoZW0gdG8geW91cgorICAgIHRlc3QgcGFja2FnZSdzIG1hbmlmZXN0IGZpbGUuCis8L3A+Cis8cCBjbGFzcz0iTm90ZSI+CisgICAgPHN0cm9uZz5Ob3RlOjwvc3Ryb25nPiBJZiB5b3UgdXNlIGEgdGVzdCBydW5uZXIgb3RoZXIgdGhhbgorICAgIDxjb2RlPkluc3RydW1lbnRhdGlvblRlc3RSdW5uZXI8L2NvZGU+LCB5b3UgbXVzdCBjaGFuZ2UgdGhlICZsdDtpbnN0cnVtZW50YXRpb24mZ3Q7CisgICAgZWxlbWVudCB0byBwb2ludCB0byB0aGUgY2xhc3MgeW91IHdhbnQgdG8gdXNlLgorPC9wPgorPHA+CisgICAgVG8gcnVuIHtAbGluayBhbmRyb2lkLnRlc3QuSW5zdHJ1bWVudGF0aW9uVGVzdFJ1bm5lcn0sIHlvdSB1c2UgaW50ZXJuYWwgc3lzdGVtIGNsYXNzZXMgY2FsbGVkIGJ5CisgICAgQW5kcm9pZCB0b29scy4gV2hlbiB5b3UgcnVuIGEgdGVzdCBpbiBFY2xpcHNlIHdpdGggQURULCB0aGUgY2xhc3NlcyBhcmUgY2FsbGVkIGF1dG9tYXRpY2FsbHkuCisgICAgV2hlbiB5b3UgcnVuIGEgdGVzdCBmcm9tIHRoZSBjb21tYW5kIGxpbmUsIHlvdSBydW4gdGhlc2UgY2xhc3NlcyB3aXRoCisgICAgPGEgaHJlZj0ie0Bkb2NSb290fWd1aWRlL2RldmVsb3BpbmcvdG9vbHMvYWRiLmh0bWwiPkFuZHJvaWQgRGVidWcgQnJpZGdlIChhZGIpPC9hPi4KKzwvcD4KKzxwPgorICAgIFRoZSBzeXN0ZW0gY2xhc3NlcyBsb2FkIGFuZCBzdGFydCB0aGUgdGVzdCBwYWNrYWdlLCBraWxsIGFueSBwcm9jZXNzZXMgdGhhdAorICAgIGFyZSBydW5uaW5nIGFuIGluc3RhbmNlIG9mIHRoZSBhcHBsaWNhdGlvbiB1bmRlciB0ZXN0LCBhbmQgdGhlbiBsb2FkIGEgbmV3IGluc3RhbmNlIG9mIHRoZQorICAgIGFwcGxpY2F0aW9uIHVuZGVyIHRlc3QuIFRoZXkgdGhlbiBwYXNzIGNvbnRyb2wgdG8KKyAgICB7QGxpbmsgYW5kcm9pZC50ZXN0Lkluc3RydW1lbnRhdGlvblRlc3RSdW5uZXJ9LCB3aGljaCBydW5zCisgICAgZWFjaCB0ZXN0IGNhc2UgY2xhc3MgaW4gdGhlIHRlc3QgcGFja2FnZS4gWW91IGNhbiBhbHNvIGNvbnRyb2wgd2hpY2ggdGVzdCBjYXNlcyBhbmQKKyAgICBtZXRob2RzIGFyZSBydW4gdXNpbmcgc2V0dGluZ3MgaW4gRWNsaXBzZSB3aXRoIEFEVCwgb3IgdXNpbmcgZmxhZ3Mgd2l0aCB0aGUgY29tbWFuZC1saW5lIHRvb2xzLgorPC9wPgorPHA+CisgICAgTmVpdGhlciB0aGUgc3lzdGVtIGNsYXNzZXMgbm9yIHtAbGluayBhbmRyb2lkLnRlc3QuSW5zdHJ1bWVudGF0aW9uVGVzdFJ1bm5lcn0gcnVuCisgICAgdGhlIGFwcGxpY2F0aW9uIHVuZGVyIHRlc3QuIEluc3RlYWQsIHRoZSB0ZXN0IGNhc2UgZG9lcyB0aGlzIGRpcmVjdGx5LiBJdCBlaXRoZXIgY2FsbHMgbWV0aG9kcworICAgIGluIHRoZSBhcHBsaWNhdGlvbiB1bmRlciB0ZXN0LCBvciBpdCBjYWxscyBpdHMgb3duIG1ldGhvZHMgdGhhdCB0cmlnZ2VyIGxpZmVjeWNsZSBldmVudHMgaW4KKyAgICB0aGUgYXBwbGljYXRpb24gdW5kZXIgdGVzdC4gVGhlIGFwcGxpY2F0aW9uIGlzIHVuZGVyIHRoZSBjb21wbGV0ZSBjb250cm9sIG9mIHRoZSB0ZXN0IGNhc2UsCisgICAgd2hpY2ggYWxsb3dzIGl0IHRvIHNldCB1cCB0aGUgdGVzdCBlbnZpcm9ubWVudCAodGhlIHRlc3QgZml4dHVyZSkgYmVmb3JlIHJ1bm5pbmcgYSB0ZXN0LiBUaGlzCisgICAgaXMgZGVtb25zdHJhdGVkIGluIHRoZSBwcmV2aW91cyA8YSBocmVmPSIjQWN0aXZpdHlTbmlwcGV0Ij5jb2RlIHNuaXBwZXQ8L2E+IHRoYXQgdGVzdHMgYW4KKyAgICBBY3Rpdml0eSB0aGF0IGRpc3BsYXlzIGEgU3Bpbm5lciB3aWRnZXQuCis8L3A+Cis8cD4KKyAgICBUbyBsZWFybiBtb3JlIGFib3V0IHJ1bm5pbmcgdGVzdHMsIHBsZWFzZSByZWFkIHRoZSB0b3BpY3MKKyAgICA8YSBocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvZGV2ZWxvcGluZy90ZXN0aW5nL3Rlc3RpbmdfZWNsaXBzZS5odG1sIiI+CisgICAgVGVzdGluZyBpbiBFY2xpcHNlLCB3aXRoIEFEVDwvYT4gb3IKKyAgICA8YSBocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvZGV2ZWxvcGluZy90ZXN0aW5nL3Rlc3Rpbmdfb3RoZXJpZGUuaHRtbCI+CisgICAgVGVzdGluZyBpbiBPdGhlciBJRGVzPC9hPi4KKzwvcD4KKzxoMiBpZD0iVGVzdFJlc3VsdHMiPlNlZWluZyBUZXN0IFJlc3VsdHM8L2gyPgorPHA+CisgICAgVGhlIEFuZHJvaWQgdGVzdGluZyBmcmFtZXdvcmsgcmV0dXJucyB0ZXN0IHJlc3VsdHMgYmFjayB0byB0aGUgdG9vbCB0aGF0IHN0YXJ0ZWQgdGhlIHRlc3QuCisgICAgSWYgeW91IHJ1biBhIHRlc3QgaW4gRWNsaXBzZSB3aXRoIEFEVCwgdGhlIHJlc3VsdHMgYXJlIGRpc3BsYXllZCBpbiBhIG5ldyBKVW5pdCB2aWV3IHBhbmUuIElmCisgICAgeW91IHJ1biBhIHRlc3QgZnJvbSB0aGUgY29tbWFuZCBsaW5lLCB0aGUgcmVzdWx0cyBhcmUgZGlzcGxheWVkIGluIDxjb2RlPlNURE9VVDwvY29kZT4uIEluCisgICAgYm90aCBjYXNlcywgeW91IHNlZSBhIHRlc3Qgc3VtbWFyeSB0aGF0IGRpc3BsYXlzIHRoZSBuYW1lIG9mIGVhY2ggdGVzdCBjYXNlIGFuZCBtZXRob2QgdGhhdAorICAgIHdhcyBydW4uIFlvdSBhbHNvIHNlZSBhbGwgdGhlIGFzc2VydGlvbiBmYWlsdXJlcyB0aGF0IG9jY3VycmVkLiBUaGVzZSBpbmNsdWRlIHBvaW50ZXJzIHRvIHRoZQorICAgIGxpbmUgaW4gdGhlIHRlc3QgY29kZSB3aGVyZSB0aGUgZmFpbHVyZSBvY2N1cnJlZC4gQXNzZXJ0aW9uIGZhaWx1cmVzIGFsc28gbGlzdCB0aGUgZXhwZWN0ZWQKKyAgICB2YWx1ZSBhbmQgYWN0dWFsIHZhbHVlLgorPC9wPgorPHA+CisgICAgVGhlIHRlc3QgcmVzdWx0cyBoYXZlIGEgZm9ybWF0IHRoYXQgaXMgc3BlY2lmaWMgdG8gdGhlIElERSB0aGF0IHlvdSBhcmUgdXNpbmcuIFRoZSB0ZXN0CisgICAgcmVzdWx0cyBmb3JtYXQgZm9yIEVjbGlwc2Ugd2l0aCBBRFQgaXMgZGVzY3JpYmVkIGluCisgICAgPGEgaHJlZj0ie0Bkb2NSb290fWd1aWRlL2RldmVsb3BpbmcvdGVzdGluZy90ZXN0aW5nX2VjbGlwc2UuaHRtbCNSdW5UZXN0RWNsaXBzZSI+CisgICAgVGVzdGluZyBpbiBFY2xpcHNlLCB3aXRoIEFEVDwvYT4uIFRoZSB0ZXN0IHJlc3VsdHMgZm9ybWF0IGZvciB0ZXN0cyBydW4gZnJvbSB0aGUKKyAgICBjb21tYW5kIGxpbmUgaXMgZGVzY3JpYmVkIGluCisgICAgPGEgaHJlZj0ie0Bkb2NSb290fWd1aWRlL2RldmVsb3BpbmcvdGVzdGluZy90ZXN0aW5nX290aGVyaWRlLmh0bWwjUnVuVGVzdHNDb21tYW5kIj4KKyAgICBUZXN0aW5nIGluIE90aGVyIElERXM8L2E+LgorPC9wPgorPGgyIGlkPSJNb25rZXlzIj5Nb25rZXkgYW5kIE1vbmtleVJ1bm5lcjwvaDI+Cis8cD4KKyAgICBUaGUgU0RLIHByb3ZpZGVzIHR3byB0b29scyBmb3IgZnVuY3Rpb25hbC1sZXZlbCBhcHBsaWNhdGlvbiB0ZXN0aW5nOgorPC9wPgogICAgIDx1bD4KLSAgICAgIDxsaT4KLSAgICAgICAge0BsaW5rIGFuZHJvaWQudGVzdC5Jc29sYXRlZENvbnRleHR9IC0gTW9ja3MgYSBDb250ZXh0IHNvIHRoYXQgdGhlIGFwcGxpY2F0aW9uIHVzaW5nIGl0IHJ1bnMgaW4gaXNvbGF0aW9uLgotICAgICAgICBBdCB0aGUgc2FtZSB0aW1lLCBpdCBoYXMgZW5vdWdoIHN0dWIgY29kZSB0byBzYXRpc2Z5IE9TIGNvZGUgdGhhdCB0cmllcyB0byBjb21tdW5pY2F0ZSB3aXRoIGNvbnRleHRzLiBUaGlzIGNsYXNzIGlzIHVzZWZ1bCBpbiB1bml0IHRlc3RpbmcuCi0gICAgICA8L2xpPgotICAgICAgPGxpPgotICAgICAgICB7QGxpbmsgYW5kcm9pZC50ZXN0LlJlbmFtaW5nRGVsZWdhdGluZ0NvbnRleHR9IC0gRGVsZWdhdGVzIG1vc3QgY29udGV4dCBmdW5jdGlvbnMgdG8gYW4gZXhpc3RpbmcsIG5vcm1hbCBjb250ZXh0IHdoaWxlIGNoYW5naW5nIHRoZSBkZWZhdWx0IGZpbGUgYW5kIGRhdGFiYXNlCi0gICAgICAgIG5hbWVzIGluIHRoZSBjb250ZXh0LiBVc2UgdGhpcyB0byB0ZXN0IGZpbGUgYW5kIGRhdGFiYXNlIG9wZXJhdGlvbnMgd2l0aCBhIG5vcm1hbCBzeXN0ZW0gY29udGV4dCwgdXNpbmcgdGVzdCBuYW1lcy4KLSAgICAgIDwvbGk+Ci0gICAgICA8bGk+Ci0gICAgICAgIHtAbGluayBhbmRyb2lkLnRlc3QubW9jay5Nb2NrQXBwbGljYXRpb259LCB7QGxpbmsgYW5kcm9pZC50ZXN0Lm1vY2suTW9ja0NvbnRlbnRSZXNvbHZlcn0sIHtAbGluayBhbmRyb2lkLnRlc3QubW9jay5Nb2NrQ29udGV4dH0sCi0gICAgICAgIHtAbGluayBhbmRyb2lkLnRlc3QubW9jay5Nb2NrRGlhbG9nSW50ZXJmYWNlfSwge0BsaW5rIGFuZHJvaWQudGVzdC5tb2NrLk1vY2tQYWNrYWdlTWFuYWdlcn0sCi0gICAgICAgIHtAbGluayBhbmRyb2lkLnRlc3QubW9jay5Nb2NrUmVzb3VyY2VzfSAtIENsYXNzZXMgdGhhdCBjcmVhdGUgbW9jayBBbmRyb2lkIHN5c3RlbSBvYmplY3RzIGZvciB1c2UgaW4gdGVzdGluZy4gVGhleSBleHBvc2Ugb25seSB0aG9zZSBtZXRob2RzIHRoYXQgYXJlCi0gICAgICAgIHVzZWZ1bCBpbiBtYW5hZ2luZyB0aGUgb2JqZWN0LiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbnMgb2YgdGhlc2UgbWV0aG9kcyBzaW1wbHkgdGhyb3cgYW4gRXhjZXB0aW9uLiBZb3UgYXJlIGV4cGVjdGVkIHRvIGV4dGVuZCB0aGUgY2xhc3NlcyBhbmQKLSAgICAgICAgb3ZlcnJpZGUgYW55IG1ldGhvZHMgdGhhdCBhcmUgY2FsbGVkIGJ5IHRoZSBhcHBsaWNhdGlvbiB1bmRlciB0ZXN0LgotICAgICAgPC9saT4KKyAgICAgICAgPGxpPgorICAgICAgICAgICAgPGEgaHJlZj0ie0Bkb2NSb290fWd1aWRlL2RldmVsb3BpbmcvdG9vbHMvbW9ua2V5Lmh0bWwiPk1vbmtleTwvYT4gaXMgYSBjb21tYW5kLWxpbmUKKyAgICAgICAgICAgIHRvb2wgdGhhdCBzZW5kcyBwc2V1ZG8tcmFuZG9tIHN0cmVhbXMgb2Yga2V5c3Ryb2tlcywgdG91Y2hlcywgYW5kIGdlc3R1cmVzIHRvIGEKKyAgICAgICAgICAgIGRldmljZS4gWW91IHJ1biBpdCB3aXRoIHRoZSA8YSBocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvZGV2ZWxvcGluZy90b29scy9hZGIuaHRtbCI+CisgICAgICAgICAgICBBbmRyb2lkIERlYnVnIEJyaWRnZTwvYT4gKGFkYikgdG9vbC4gWW91IHVzZSBpdCB0byBzdHJlc3MtdGVzdCB5b3VyIGFwcGxpY2F0aW9uIGFuZAorICAgICAgICAgICAgcmVwb3J0IGJhY2sgZXJyb3JzIHRoYXQgYXJlIGVuY291bnRlcmVkLiBZb3UgY2FuIHJlcGVhdCBhIHN0cmVhbSBvZiBldmVudHMgYnkKKyAgICAgICAgICAgIHJ1bm5pbmcgdGhlIHRvb2wgZWFjaCB0aW1lIHdpdGggdGhlIHNhbWUgcmFuZG9tIG51bWJlciBzZWVkLgorICAgICAgICA8L2xpPgorICAgICAgICA8bGk+CisgICAgICAgICAgICA8YSBocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvdG9waWNzL3Rlc3RpbmcvbW9ua2V5cnVubmVyLmh0bWwiPk1vbmtleVJ1bm5lcjwvYT4gaXMgYQorICAgICAgICAgICAgSnl0aG9uIEFQSSB0aGF0IHlvdSB1c2UgaW4gdGVzdCBwcm9ncmFtcyB3cml0dGVuIGluIFB5dGhvbi4gVGhlIEFQSSBpbmNsdWRlcyBmdW5jdGlvbnMKKyAgICAgICAgICAgIGZvciBjb25uZWN0aW5nIHRvIGEgZGV2aWNlLCBpbnN0YWxsaW5nIGFuZCB1bmluc3RhbGxpbmcgcGFja2FnZXMsIHRha2luZyBzY3JlZW5zaG90cywKKyAgICAgICAgICAgIGNvbXBhcmluZyB0d28gaW1hZ2VzLCBhbmQgcnVubmluZyBhIHRlc3QgcGFja2FnZSBhZ2FpbnN0IGFuIGFwcGxpY2F0aW9uLiBVc2luZyB0aGUgQVBJCisgICAgICAgICAgICB3aXRoIFB5dGhvbiwgeW91IGNhbiB3cml0ZSBhIHdpZGUgcmFuZ2Ugb2YgbGFyZ2UsIHBvd2VyZnVsLCBhbmQgY29tcGxleCB0ZXN0cy4KKyAgICAgICAgPC9saT4KICAgICA8L3VsPgotPGgzIGlkPSJJbnN0cnVtZW50YXRpb25UZXN0UnVubmVyIj5JbnN0cnVtZW50YXRpb24gVGVzdCBSdW5uZXI8L2gzPgorPGgyIGlkPSJQYWNrYWdlTmFtZXMiPldvcmtpbmcgV2l0aCBQYWNrYWdlIG5hbWVzPC9oMj4KIDxwPgotICBBbmRyb2lkIHByb3ZpZGVzIGEgY3VzdG9tIGNsYXNzIGZvciBydW5uaW5nIHRlc3RzIHdpdGggaW5zdHJ1bWVudGF0aW9uIGNhbGxlZCBjYWxsZWQKLSAge0BsaW5rIGFuZHJvaWQudGVzdC5JbnN0cnVtZW50YXRpb25UZXN0UnVubmVyfS4gVGhpcyBjbGFzcwotICBjb250cm9scyBvZiB0aGUgYXBwbGljYXRpb24gdW5kZXIgdGVzdCwgcnVucyB0aGUgdGVzdCBhcHBsaWNhdGlvbiBhbmQgdGhlIG1haW4gYXBwbGljYXRpb24gaW4gdGhlIHNhbWUgcHJvY2VzcywgYW5kIHJvdXRlcwotICB0ZXN0IG91dHB1dCB0byB0aGUgYXBwcm9wcmlhdGUgcGxhY2UuIFVzaW5nIGluc3RydW1lbnRhdGlvbiBpcyBrZXkgdG8gdGhlIGFiaWxpdHkgb2YgPGNvZGU+SW5zdHJ1bWVudGF0aW9uVGVzdFJ1bm5lcjwvY29kZT4gdG8gY29udHJvbCB0aGUgZW50aXJlIHRlc3QKLSAgZW52aXJvbm1lbnQgYXQgcnVudGltZS4gTm90aWNlIHRoYXQgeW91IHVzZSB0aGlzIHRlc3QgcnVubmVyIGV2ZW4gaWYgeW91ciB0ZXN0IGNsYXNzIGRvZXMgbm90IGl0c2VsZiB1c2UgaW5zdHJ1bWVudGF0aW9uLgorICAgIEluIHRoZSB0ZXN0IGVudmlyb25tZW50LCB5b3Ugd29yayB3aXRoIGJvdGggQW5kcm9pZCBhcHBsaWNhdGlvbiBwYWNrYWdlIG5hbWVzIGFuZAorICAgIEphdmEgcGFja2FnZSBpZGVudGlmaWVycy4gQm90aCB1c2UgdGhlIHNhbWUgbmFtaW5nIGZvcm1hdCwgYnV0IHRoZXkgcmVwcmVzZW50IHN1YnN0YW50aWFsbHkKKyAgICBkaWZmZXJlbnQgZW50aXRpZXMuIFlvdSBuZWVkIHRvIGtub3cgdGhlIGRpZmZlcmVuY2UgdG8gc2V0IHVwIHlvdXIgdGVzdHMgY29ycmVjdGx5LgogPC9wPgogPHA+Ci0gIFdoZW4geW91IHJ1biBhIHRlc3QgYXBwbGljYXRpb24sIHlvdSBmaXJzdCBydW4gYSBzeXN0ZW0gdXRpbGl0eSBjYWxsZWQgQWN0aXZpdHkgTWFuYWdlci4gQWN0aXZpdHkgTWFuYWdlciB1c2VzIHRoZSBpbnN0cnVtZW50YXRpb24gZnJhbWV3b3JrIHRvIHN0YXJ0IGFuZCBjb250cm9sIHRoZSB0ZXN0IHJ1bm5lciwgd2hpY2ggaW4gdHVybiB1c2VzIGluc3RydW1lbnRhdGlvbiB0byBzaHV0IGRvd24gYW55IHJ1bm5pbmcgaW5zdGFuY2VzCi0gIG9mIHRoZSBtYWluIGFwcGxpY2F0aW9uLCBzdGFydHMgdGhlIHRlc3QgYXBwbGljYXRpb24sIGFuZCB0aGVuIHN0YXJ0cyB0aGUgbWFpbiBhcHBsaWNhdGlvbiBpbiB0aGUgc2FtZSBwcm9jZXNzLiBUaGlzIGFsbG93cyB2YXJpb3VzIGFzcGVjdHMgb2YgdGhlIHRlc3QgYXBwbGljYXRpb24gdG8gd29yayBkaXJlY3RseSB3aXRoIHRoZSBtYWluIGFwcGxpY2F0aW9uLgorICAgIEFuIEFuZHJvaWQgcGFja2FnZSBuYW1lIGlzIGEgdW5pcXVlIHN5c3RlbSBuYW1lIGZvciBhIDxjb2RlPi5hcGs8L2NvZGU+IGZpbGUsIHNldCBieSB0aGUKKyAgICAmcXVvdDthbmRyb2lkOnBhY2thZ2UmcXVvdDsgYXR0cmlidXRlIG9mIHRoZSAmbHQ7bWFuaWZlc3QmZ3Q7IGVsZW1lbnQgaW4gdGhlIHBhY2thZ2UncworICAgIG1hbmlmZXN0LiBUaGUgQW5kcm9pZCBwYWNrYWdlIG5hbWUgb2YgeW91ciB0ZXN0IHBhY2thZ2UgbXVzdCBiZSBkaWZmZXJlbnQgZnJvbSB0aGUKKyAgICBBbmRyb2lkIHBhY2thZ2UgbmFtZSBvZiB0aGUgYXBwbGljYXRpb24gdW5kZXIgdGVzdC4gQnkgZGVmYXVsdCwgQW5kcm9pZCB0b29scyBjcmVhdGUgdGhlCisgICAgdGVzdCBwYWNrYWdlIG5hbWUgYnkgYXBwZW5kaW5nICIudGVzdCIgdG8gdGhlIHBhY2thZ2UgbmFtZSBvZiB0aGUgYXBwbGljYXRpb24gdW5kZXIgdGVzdC4KIDwvcD4KIDxwPgotICBJZiB5b3UgYXJlIGRldmVsb3BpbmcgaW4gRWNsaXBzZSwgdGhlIEFEVCBwbHVnaW4gYXNzaXN0cyB5b3UgaW4gdGhlIHNldHVwIG9mIDxjb2RlPkluc3RydW1lbnRhdGlvblRlc3RSdW5uZXI8L2NvZGU+IG9yIG90aGVyIHRlc3QgcnVubmVycy4KLSAgVGhlIHBsdWdpbiBVSSBwcm9tcHRzIHlvdSB0byBzcGVjaWZ5IHRoZSB0ZXN0IHJ1bm5lciBjbGFzcyB0byB1c2UsIGFzIHdlbGwgYXMgdGhlIHBhY2thZ2UgbmFtZSBvZiB0aGUgYXBwbGljYXRpb24gdW5kZXIgdGVzdC4KLSAgVGhlIHBsdWdpbiB0aGVuIGFkZHMgYW4gPGNvZGU+Jmx0O2luc3RydW1lbnRhdGlvbiZndDs8L2NvZGU+IGVsZW1lbnQgd2l0aCBhcHByb3ByaWF0ZSBhdHRyaWJ1dGVzIHRvIHRoZSBtYW5pZmVzdCBmaWxlIG9mIHRoZSB0ZXN0IGFwcGxpY2F0aW9uLgotICBFY2xpcHNlIHdpdGggQURUIGF1dG9tYXRpY2FsbHkgc3RhcnRzIGEgdGVzdCBhcHBsaWNhdGlvbiB1bmRlciB0aGUgY29udHJvbCBvZiBBY3Rpdml0eSBNYW5hZ2VyIHVzaW5nIGluc3RydW1lbnRhdGlvbiwKLSAgYW5kIHJlZGlyZWN0cyB0aGUgdGVzdCBvdXRwdXQgdG8gdGhlIEVjbGlwc2Ugd2luZG93J3MgSlVuaXQgdmlldy4KKyAgICBUaGUgdGVzdCBwYWNrYWdlIGFsc28gdXNlcyBhbiBBbmRyb2lkIHBhY2thZ2UgbmFtZSB0byB0YXJnZXQgdGhlIGFwcGxpY2F0aW9uIHBhY2thZ2UgaXQKKyAgICB0ZXN0cy4gVGhpcyBpcyBzZXQgaW4gdGhlICZxdW90O2FuZHJvaWQ6dGFyZ2V0UGFja2FnZSZxdW90OyBhdHRyaWJ1dGUgb2YgdGhlCisgICAgJmx0O2luc3RydW1lbnRhdGlvbiZndDsgZWxlbWVudCBpbiB0aGUgdGVzdCBwYWNrYWdlJ3MgbWFuaWZlc3QuCiA8L3A+CiA8cD4KLSAgSWYgeW91IHByZWZlciB3b3JraW5nIGZyb20gdGhlIGNvbW1hbmQgbGluZSwgeW91IGNhbiB1c2UgQW50IGFuZCB0aGUgPGNvZGU+YW5kcm9pZDwvY29kZT4KLSAgdG9vbCB0byBoZWxwIHlvdSBzZXQgdXAgeW91ciB0ZXN0IHByb2plY3RzLiBUbyBydW4gdGVzdHMgd2l0aCBpbnN0cnVtZW50YXRpb24sIHlvdSBjYW4gYWNjZXNzIHRoZQotICBBY3Rpdml0eSBNYW5hZ2VyIHRocm91Z2ggdGhlIDxhIGhyZWY9IntAZG9jUm9vdH1ndWlkZS9kZXZlbG9waW5nL3Rvb2xzL2FkYi5odG1sIj5BbmRyb2lkIERlYnVnCi0gIEJyaWRnZTwvYT4gKDxjb2RlPmFkYjwvY29kZT4pIHRvb2wgYW5kIHRoZSBvdXRwdXQgaXMgZGlyZWN0ZWQgdG8gPGNvZGU+U1RET1VUPC9jb2RlPi4KLTwvcD4KLTxoMiBpZD0iVGVzdEVudmlyb21lbnQiPldvcmtpbmcgaW4gdGhlIFRlc3QgRW52aXJvbm1lbnQ8L2gyPgotPHA+Ci0gICAgVGhlIHRlc3RzIGZvciBhbiBBbmRyb2lkIGFwcGxpY2F0aW9uIGFyZSBjb250YWluZWQgaW4gYSB0ZXN0IGFwcGxpY2F0aW9uLCB3aGljaCBpdHNlbGYgaXMgYW4gQW5kcm9pZCBhcHBsaWNhdGlvbi4gQSB0ZXN0IGFwcGxpY2F0aW9uIHJlc2lkZXMgaW4gYSBzZXBhcmF0ZSBBbmRyb2lkIHByb2plY3QgdGhhdCBoYXMgdGhlCi0gICAgc2FtZSBmaWxlcyBhbmQgZGlyZWN0b3JpZXMgYXMgYSByZWd1bGFyIEFuZHJvaWQgYXBwbGljYXRpb24uIFRoZSB0ZXN0IHByb2plY3QgaXMgbGlua2VkIHRvIHRoZSBwcm9qZWN0IG9mIHRoZSBhcHBsaWNhdGlvbiBpdCB0ZXN0cwotICAgIChrbm93biBhcyB0aGUgYXBwbGljYXRpb24gdW5kZXIgdGVzdCkgYnkgaXRzIG1hbmlmZXN0IGZpbGUuCisgICAgQSBKYXZhIHBhY2thZ2UgaWRlbnRpZmllciBhcHBsaWVzIHRvIGEgc291cmNlIGZpbGUuIFRoaXMgcGFja2FnZSBuYW1lIHJlZmxlY3RzIHRoZSBkaXJlY3RvcnkKKyAgICBwYXRoIG9mIHRoZSBzb3VyY2UgZmlsZS4gSXQgYWxzbyBhZmZlY3RzIHRoZSB2aXNpYmlsaXR5IG9mIGNsYXNzZXMgYW5kIG1lbWJlcnMgdG8gZWFjaCBvdGhlci4KIDwvcD4KIDxwPgotICAgIEVhY2ggdGVzdCBhcHBsaWNhdGlvbiBjb250YWlucyBvbmUgb3IgbW9yZSB0ZXN0IGNhc2UgY2xhc3NlcyBiYXNlZCBvbiBhbiBBbmRyb2lkIGNsYXNzIGZvciBhCi0gICAgcGFydGljdWxhciB0eXBlIG9mIGNvbXBvbmVudC4gVGhlIHRlc3QgY2FzZSBjbGFzcyBjb250YWlucyBtZXRob2RzIHRoYXQgZGVmaW5lIHRlc3RzIG9uIHNvbWUgcGFydCBvZiB0aGUgYXBwbGljYXRpb24gdW5kZXIgdGVzdC4gV2hlbiB5b3UgcnVuIHRoZSB0ZXN0IGFwcGxpY2F0aW9uLCBBbmRyb2lkCi0gICAgc3RhcnRzIGl0LCBsb2FkcyB0aGUgYXBwbGljYXRpb24gdW5kZXIgdGVzdCBpbnRvIHRoZSBzYW1lIHByb2Nlc3MsIGFuZCB0aGVuIGludm9rZXMgZWFjaCBtZXRob2QgaW4gdGhlIHRlc3QgY2FzZSBjbGFzcy4KKyAgICBBbmRyb2lkIHRvb2xzIHRoYXQgY3JlYXRlIHRlc3QgcHJvamVjdHMgc2V0IHVwIGFuIEFuZHJvaWQgdGVzdCBwYWNrYWdlIG5hbWUgZm9yIHlvdS4KKyAgICBGcm9tIHlvdXIgaW5wdXQsIHRoZSB0b29scyBzZXQgdXAgdGhlIHRlc3QgcGFja2FnZSBuYW1lIGFuZCB0aGUgdGFyZ2V0IHBhY2thZ2UgbmFtZSBmb3IgdGhlCisgICAgYXBwbGljYXRpb24gdW5kZXIgdGVzdC4gRm9yIHRoZXNlIHRvb2xzIHRvIHdvcmssIHRoZSBhcHBsaWNhdGlvbiBwcm9qZWN0IG11c3QgYWxyZWFkeSBleGlzdC4KIDwvcD4KIDxwPgotICAgIFRoZSB0b29scyBhbmQgcHJvY2VkdXJlcyB5b3UgdXNlIHdpdGggdGVzdGluZyBkZXBlbmQgb24gdGhlIGRldmVsb3BtZW50IGVudmlyb25tZW50IHlvdSBhcmUgdXNpbmcuIElmIHlvdSB1c2UgRWNsaXBzZSwgdGhlbiB0aGUgQURUIHBsdWcgaW4gZm9yIEVjbGlwc2UgcHJvdmlkZXMgdG9vbHMgdGhhdAotICAgIGFsbG93IHlvdSB0byBkZXZlbG9wIGFuZCBydW4gdGVzdHMgZW50aXJlbHkgd2l0aGluIEVjbGlwc2UuIFRoaXMgaXMgZG9jdW1lbnRlZCBpbiB0aGUgdG9waWMgPGEgaHJlZj0ie0Bkb2NSb290fWd1aWRlL2RldmVsb3BpbmcvdGVzdGluZy90ZXN0aW5nX2VjbGlwc2UuaHRtbCI+VGVzdGluZyBpbiBFY2xpcHNlLCB3aXRoIEFEVDwvYT4uCi0gICAgSWYgeW91IHVzZSBhbm90aGVyIGRldmVsb3BtZW50IGVudmlyb25tZW50LCB0aGVuIHlvdSB1c2UgQW5kcm9pZCdzIGNvbW1hbmQtbGluZSB0b29scywgYXMgZG9jdW1lbnRlZCBpbiB0aGUgdG9waWMgPGEgaHJlZj0ie0Bkb2NSb290fWd1aWRlL2RldmVsb3BpbmcvdGVzdGluZy90ZXN0aW5nX290aGVyaWRlLmh0bWwiPlRlc3RpbmcgaW4gT3RoZXIgSURFczwvYT4uCisgICAgQnkgZGVmYXVsdCwgdGhlc2UgdG9vbHMgc2V0IHRoZSBKYXZhIHBhY2thZ2UgaWRlbnRpZmllciBmb3IgdGhlIHRlc3QgY2xhc3MgdG8gYmUgdGhlIHNhbWUKKyAgICBhcyB0aGUgQW5kcm9pZCBwYWNrYWdlIGlkZW50aWZpZXIuIFlvdSBtYXkgd2FudCB0byBjaGFuZ2UgdGhpcyBpZiB5b3Ugd2FudCB0byBleHBvc2UKKyAgICBtZW1iZXJzIGluIHRoZSBhcHBsaWNhdGlvbiB1bmRlciB0ZXN0IGJ5IGdpdmluZyB0aGVtIHBhY2thZ2UgdmlzaWJpbGl0eS4gSWYgeW91IGRvIHRoaXMsCisgICAgY2hhbmdlIG9ubHkgdGhlIEphdmEgcGFja2FnZSBpZGVudGlmaWVyLCBub3QgdGhlIEFuZHJvaWQgcGFja2FnZSBuYW1lcywgYW5kIGNoYW5nZSBvbmx5IHRoZQorICAgIHRlc3QgY2FzZSBzb3VyY2UgZmlsZXMuIERvIG5vdCBjaGFuZ2UgdGhlIEphdmEgcGFja2FnZSBuYW1lIG9mIHRoZSBnZW5lcmF0ZWQKKyAgICA8Y29kZT5SLmphdmE8L2NvZGU+IGNsYXNzIGluIHlvdXIgdGVzdCBwYWNrYWdlLCBiZWNhdXNlIGl0IHdpbGwgdGhlbiBjb25mbGljdCB3aXRoIHRoZQorICAgIDxjb2RlPlIuamF2YTwvY29kZT4gY2xhc3MgaW4gdGhlIGFwcGxpY2F0aW9uIHVuZGVyIHRlc3QuIERvIG5vdCBjaGFuZ2UgdGhlIEFuZHJvaWQgcGFja2FnZSBuYW1lCisgICAgb2YgeW91ciB0ZXN0IHBhY2thZ2UgdG8gYmUgdGhlIHNhbWUgYXMgdGhlIGFwcGxpY2F0aW9uIGl0IHRlc3RzLCBiZWNhdXNlIHRoZW4gdGhlaXIgbmFtZXMKKyAgICB3aWxsIG5vIGxvbmdlciBiZSB1bmlxdWUgaW4gdGhlIHN5c3RlbS4KIDwvcD4KLTxoMyBpZD0iVGVzdFByb2plY3RzIj5Xb3JraW5nIHdpdGggdGVzdCBwcm9qZWN0czwvaDM+Cis8aDIgaWQ9IldoYXRUb1Rlc3QiPldoYXQgdG8gVGVzdDwvaDI+CiA8cD4KLSAgICBUbyBzdGFydCB0ZXN0aW5nIGFuIEFuZHJvaWQgYXBwbGljYXRpb24sIHlvdSBjcmVhdGUgYSB0ZXN0IHByb2plY3QgZm9yIGl0IHVzaW5nIEFuZHJvaWQgdG9vbHMuIFRoZSB0b29scyBjcmVhdGUgdGhlIHByb2plY3QgZGlyZWN0b3J5IGFuZCB0aGUgZmlsZXMgYW5kIHN1YmRpcmVjdG9yaWVzIG5lZWRlZC4KLSAgICBUaGUgdG9vbHMgYWxzbyBjcmVhdGUgYSBtYW5pZmVzdCBmaWxlIHRoYXQgbGlua3MgdGhlIGFwcGxpY2F0aW9uIGluIHRoZSB0ZXN0IHByb2plY3QgdG8gdGhlIGFwcGxpY2F0aW9uIHVuZGVyIHRlc3QuIFRoZSBwcm9jZWR1cmUgZm9yIGNyZWF0aW5nIGEgdGVzdCBwcm9qZWN0IGluIEVjbGlwc2Ugd2l0aAotICAgIEFEVCBpcyBkb2N1bWVudGVkIGluIDxhIGhyZWY9IntAZG9jUm9vdH1ndWlkZS9kZXZlbG9waW5nL3Rlc3RpbmcvdGVzdGluZ19lY2xpcHNlLmh0bWwiPlRlc3RpbmcgaW4gRWNsaXBzZSwgd2l0aCBBRFQ8L2E+LiBUaGUgcHJvY2VkdXJlIGZvciBjcmVhdGluZyBhIHRlc3QgcHJvamVjdCBmb3IgdXNlIHdpdGggZGV2ZWxvcG1lbnQKLSAgICB0b29scyBvdGhlciB0aGFuIEVjbGlwc2UgaXMgZG9jdW1lbnRlZCBpbiA8YSBocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvZGV2ZWxvcGluZy90ZXN0aW5nL3Rlc3Rpbmdfb3RoZXJpZGUuaHRtbCI+VGVzdGluZyBpbiBPdGhlciBJREVzPC9hPi4KLTwvcD4KLTxoMyBpZD0iVGVzdENsYXNzZXMiPldvcmtpbmcgd2l0aCB0ZXN0IGNhc2UgY2xhc3NlczwvaDM+Ci08cD4KLSAgICBBIHRlc3QgYXBwbGljYXRpb24gY29udGFpbnMgb25lIG9yIG1vcmUgdGVzdCBjYXNlIGNsYXNzZXMgdGhhdCBleHRlbmQgYW4gQW5kcm9pZCB0ZXN0IGNhc2UgY2xhc3MuIFlvdSBjaG9vc2UgYSB0ZXN0IGNhc2UgY2xhc3MgYmFzZWQgb24gdGhlIHR5cGUgb2YgQW5kcm9pZCBjb21wb25lbnQgeW91IGFyZSB0ZXN0aW5nIGFuZCB0aGUKLSAgICB0ZXN0cyB5b3UgYXJlIGRvaW5nLiBBIHRlc3QgYXBwbGljYXRpb24gY2FuIHRlc3QgZGlmZmVyZW50IGNvbXBvbmVudHMsIGJ1dCBlYWNoIHRlc3QgY2FzZSBjbGFzcyBpcyBkZXNpZ25lZCB0byB0ZXN0IGEgc2luZ2xlIHR5cGUgb2YgY29tcG9uZW50LgotICAgIFRoZSBBbmRyb2lkIHRlc3QgY2FzZSBjbGFzc2VzIGFyZSBkZXNjcmliZWQgaW4gdGhlIHNlY3Rpb24gPGEgaHJlZj0iI1Rlc3RBUEkiPlRoZSBUZXN0aW5nIEFQSTwvYT4uCisgICAgVGhlIHRvcGljIDxhIGhyZWY9IntAZG9jUm9vdH1ndWlkZS90b3BpY3MvdGVzdGluZy93aGF0X3RvX3Rlc3QuaHRtbCI+V2hhdCBUbyBUZXN0PC9hPgorICAgIGRlc2NyaWJlcyB0aGUga2V5IGZ1bmN0aW9uYWxpdHkgeW91IHNob3VsZCB0ZXN0IGluIGFuIEFuZHJvaWQgYXBwbGljYXRpb24sIGFuZCB0aGUga2V5CisgICAgc2l0dWF0aW9ucyB0aGF0IG1pZ2h0IGFmZmVjdCB0aGF0IGZ1bmN0aW9uYWxpdHkuCiA8L3A+CiA8cD4KLSAgICBTb21lIEFuZHJvaWQgY29tcG9uZW50cyBoYXZlIG1vcmUgdGhhbiBvbmUgYXNzb2NpYXRlZCB0ZXN0IGNhc2UgY2xhc3MuIEluIHRoaXMgY2FzZSwgeW91IGNob29zZSBhbW9uZyB0aGUgYXZhaWxhYmxlIGNsYXNzZXMgYmFzZWQgb24gdGhlIHR5cGUgb2YgdGVzdHMgeW91IHdhbnQgdG8gZG8uIEZvciBhY3Rpdml0aWVzLAotICAgIGZvciBleGFtcGxlLCB5b3UgaGF2ZSB0aGUgY2hvaWNlIG9mIGVpdGhlciB7QGxpbmsgYW5kcm9pZC50ZXN0LkFjdGl2aXR5SW5zdHJ1bWVudGF0aW9uVGVzdENhc2UyfSBvciB7QGxpbmsgYW5kcm9pZC50ZXN0LkFjdGl2aXR5VW5pdFRlc3RDYXNlfS4KLTxwPgotICAgIDxjb2RlPkFjdGl2aXR5SW5zdHJ1bWVudGF0aW9uVGVzdENhc2UyPC9jb2RlPiBpcyBkZXNpZ25lZCB0byBkbyBmdW5jdGlvbmFsIHRlc3RpbmcsIHNvIGl0IHRlc3RzIGFjdGl2aXRpZXMgaW4gYSBub3JtYWwgc3lzdGVtIGluZnJhc3RydWN0dXJlLiBZb3UgY2FuIGluamVjdCBtb2NrZWQgSW50ZW50cywgYnV0IG5vdAotICAgIG1vY2tlZCBDb250ZXh0cy4gSW4gZ2VuZXJhbCwgeW91IGNhbid0IG1vY2sgZGVwZW5kZW5jaWVzIGZvciB0aGUgYWN0aXZpdHkgdW5kZXIgdGVzdC4KKyAgICBNb3N0IHVuaXQgdGVzdGluZyBpcyBzcGVjaWZpYyB0byB0aGUgQW5kcm9pZCBjb21wb25lbnQgeW91IGFyZSB0ZXN0aW5nLgorICAgIFRoZSB0b3BpY3MgPGEgaHJlZj0ie0Bkb2NSb290fWd1aWRlL3RvcGljcy90ZXN0aW5nL2FjdGl2aXR5X3Rlc3RpbmcuaHRtbCI+QWN0aXZpdHkgVGVzdGluZzwvYT4sCisgICAgPGEgaHJlZj0ie0Bkb2NSb290fWd1aWRlL3RvcGljcy90ZXN0aW5nL2NvbnRlbnRwcm92aWRlcl90ZXN0aW5nLmh0bWwiPgorICAgIENvbnRlbnQgUHJvdmlkZXIgVGVzdGluZzwvYT4sIGFuZCA8YSBocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvdG9waWNzL3Rlc3Rpbmcvc2VydmljZV90ZXN0aW5nLmh0bWwiPgorICAgIFNlcnZpY2UgVGVzdGluZzwvYT4gZWFjaCBoYXZlIGEgc2VjdGlvbiBlbnRpdGxlZCAiV2hhdCBUbyBUZXN0IiB0aGF0IGxpc3RzIHBvc3NpYmxlIHRlc3RpbmcKKyAgICBhcmVhcy4KIDwvcD4KIDxwPgotICAgIEluIGNvbXBhcmlzb24sIDxjb2RlPkFjdGl2aXR5VW5pdFRlc3RDYXNlPC9jb2RlPiBpcyBkZXNpZ25lZCBmb3IgdW5pdCB0ZXN0aW5nLCBzbyBpdCB0ZXN0cyBhY3Rpdml0aWVzIGluIGFuIGlzb2xhdGVkIHN5c3RlbSBpbmZyYXN0cnVjdHVyZS4gWW91IGNhbiBpbmplY3QgbW9ja2VkIG9yIHdyYXBwZXJlZCBkZXBlbmRlbmNpZXMgZm9yCi0gICAgdGhlIGFjdGl2aXR5IHVuZGVyIHRlc3QsIHBhcnRpY3VsYXJseSBtb2NrZWQgQ29udGV4dHMuIE9uIHRoZSBvdGhlciBoYW5kLCB3aGVuIHlvdSB1c2UgdGhpcyB0ZXN0IGNhc2UgY2xhc3MgdGhlIGFjdGl2aXR5IHVuZGVyIHRlc3QgcnVucyBpbiBpc29sYXRpb24gYW5kIGNhbid0IGludGVyYWN0IHdpdGggb3RoZXIgYWN0aXZpdGllcy4KKyAgICBXaGVuIHBvc3NpYmxlLCB5b3Ugc2hvdWxkIHJ1biB0aGVzZSB0ZXN0cyBvbiBhbiBhY3R1YWwgZGV2aWNlLiBJZiB0aGlzIGlzIG5vdCBwb3NzaWJsZSwgeW91IGNhbgorICAgIHVzZSB0aGUgPGEgaHJlZj0ie0Bkb2NSb290fWd1aWRlL2RldmVsb3BpbmcvdG9vbHMvZW11bGF0b3IuaHRtbCI+QW5kcm9pZCBFbXVsYXRvcjwvYT4gd2l0aAorICAgIDxhIGhyZWY9IntAZG9jUm9vdH1ndWlkZS9kZXZlbG9waW5nL3Rvb2xzL2F2ZC5odG1sIj5BbmRyb2lkIFZpcnR1YWwgRGV2aWNlczwvYT4gY29uZmlndXJlZCBmb3IKKyAgICB0aGUgaGFyZHdhcmUsIHNjcmVlbnMsIGFuZCB2ZXJzaW9ucyB5b3Ugd2FudCB0byB0ZXN0LgorPC9wPgorPGgyIGlkPSJOZXh0U3RlcHMiPk5leHQgU3RlcHM8L2gyPgorPHA+CisgICAgVG8gbGVhcm4gaG93IHRvIHNldCB1cCBhbmQgcnVuIHRlc3RzIGluIEVjbGlwc2UsIHBsZWFzZSByZWZlciB0byA8YQorICAgIGhyZWY9IntAZG9jUm9vdH1ndWlkZS9kZXZlbG9waW5nL3Rlc3RpbmcvdGVzdGluZ19lY2xpcHNlLmh0bWwiPlRlc3RpbmcgaW4KKyAgICBFY2xpcHNlLCB3aXRoIEFEVDwvYT4uIElmIHlvdSdyZSBub3Qgd29ya2luZyBpbiBFY2xpcHNlLCByZWZlciB0byA8YQorICAgIGhyZWY9IntAZG9jUm9vdH1ndWlkZS9kZXZlbG9waW5nL3Rlc3RpbmcvdGVzdGluZ19vdGhlcmlkZS5odG1sIj5UZXN0aW5nIGluIE90aGVyCisgICAgSURFczwvYT4uCiA8L3A+CiA8cD4KLSAgICBBcyBhIHJ1bGUgb2YgdGh1bWIsIGlmIHlvdSB3YW50ZWQgdG8gdGVzdCBhbiBhY3Rpdml0eSdzIGludGVyYWN0aW9uIHdpdGggdGhlIHJlc3Qgb2YgQW5kcm9pZCwgeW91IHdvdWxkIHVzZSA8Y29kZT5BY3Rpdml0eUluc3RydW1lbnRhdGlvblRlc3RDYXNlMjwvY29kZT4uIElmIHlvdSB3YW50ZWQgdG8gZG8gcmVncmVzc2lvbiB0ZXN0aW5nCi0gICAgb24gYW4gYWN0aXZpdHksIHlvdSB3b3VsZCB1c2UgPGNvZGU+QWN0aXZpdHlVbml0VGVzdENhc2U8L2NvZGU+LgorICAgIElmIHlvdSB3YW50IGEgc3RlcC1ieS1zdGVwIGludHJvZHVjdGlvbiB0byBBbmRyb2lkIHRlc3RpbmcsIHRyeSBvbmUgb2YgdGhlCisgICAgdGVzdGluZyB0dXRvcmlhbHMgb3Igc2FtcGxlIHRlc3QgcGFja2FnZXM6CiA8L3A+Ci08aDMgaWQ9IlRlc3RzIj5Xb3JraW5nIHdpdGggdGVzdCBtZXRob2RzPC9oMz4KLTxwPgotICAgIEVhY2ggdGVzdCBjYXNlIGNsYXNzIHByb3ZpZGVzIG1ldGhvZHMgdGhhdCB5b3UgdXNlIHRvIHNldCB1cCB0aGUgdGVzdCBlbnZpcm9ubWVudCBhbmQgY29udHJvbCB0aGUgYXBwbGljYXRpb24gdW5kZXIgdGVzdC4gRm9yIGV4YW1wbGUsIGFsbCB0ZXN0IGNhc2UgY2xhc3NlcyBwcm92aWRlIHRoZSBKVW5pdCB7QGxpbmsganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlI3NldFVwKCkgc2V0VXAoKX0KLSAgICBtZXRob2QgdGhhdCB5b3UgY2FuIG92ZXJyaWRlIHRvIHNldCB1cCBmaXh0dXJlcy4gSW4gYWRkaXRpb24sIHlvdSBhZGQgbWV0aG9kcyB0byB0aGUgY2xhc3MgdG8gZGVmaW5lIGluZGl2aWR1YWwgdGVzdHMuIEVhY2ggbWV0aG9kIHlvdSBhZGQgaXMgcnVuIG9uY2UgZWFjaCB0aW1lIHlvdSBydW4gdGhlIHRlc3QgYXBwbGljYXRpb24uIElmIHlvdSBvdmVycmlkZSB0aGUgPGNvZGU+c2V0VXAoKTwvY29kZT4KLSAgICBtZXRob2QsIGl0IHJ1bnMgYmVmb3JlIGVhY2ggb2YgeW91ciBtZXRob2RzLiBTaW1pbGFybHksIHRoZSBKVW5pdCB7QGxpbmsganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlI3RlYXJEb3duKCkgdGVhckRvd24oKX0gbWV0aG9kIGlzIHJ1biBvbmNlIGFmdGVyIGVhY2ggb2YgeW91ciBtZXRob2RzLgotPC9wPgotPHA+Ci0gICAgVGhlIHRlc3QgY2FzZSBjbGFzc2VzIGdpdmUgeW91IHN1YnN0YW50aWFsIGNvbnRyb2wgb3ZlciBzdGFydGluZyBhbmQgc3RvcHBpbmcgY29tcG9uZW50cy4gRm9yIHRoaXMgcmVhc29uLCB5b3UgaGF2ZSB0byBzcGVjaWZpY2FsbHkgdGVsbCBBbmRyb2lkIHRvIHN0YXJ0IGEgY29tcG9uZW50IGJlZm9yZSB5b3UgcnVuIHRlc3RzIGFnYWluc3QgaXQuIEZvciBleGFtcGxlLCB5b3UgdXNlIHRoZQotICAgIHtAbGluayBhbmRyb2lkLnRlc3QuQWN0aXZpdHlJbnN0cnVtZW50YXRpb25UZXN0Q2FzZTIjZ2V0QWN0aXZpdHkoKX0gbWV0aG9kIHRvIHN0YXJ0IHRoZSBhY3Rpdml0eSB1bmRlciB0ZXN0LiBZb3UgY2FuIGNhbGwgdGhpcyBtZXRob2Qgb25jZSBkdXJpbmcgdGhlIGVudGlyZSB0ZXN0IGNhc2UsIG9yIG9uY2UgZm9yIGVhY2ggdGVzdCBtZXRob2QuIFlvdSBjYW4gZXZlbiBkZXN0cm95IHRoZQotICAgIGFjdGl2aXR5IHVuZGVyIHRlc3QgYnkgY2FsbGluZyBpdHMge0BsaW5rIGFuZHJvaWQuYXBwLkFjdGl2aXR5I2ZpbmlzaCgpfSBtZXRob2QgYW5kIHRoZW4gcmVzdGFydCBpdCB3aXRoIDxjb2RlPmdldEFjdGl2aXR5KCk8L2NvZGU+IHdpdGhpbiBhIHNpbmdsZSB0ZXN0IG1ldGhvZC4KLTwvcD4KLTxoMyBpZD0iUnVuVGVzdHMiPlJ1bm5pbmcgdGVzdHMgYW5kIHNlZWluZyB0aGUgcmVzdWx0czwvaDM+Ci08cD4KLSAgICBUbyBydW4geW91ciB0ZXN0cywgeW91IGJ1aWxkIHlvdXIgdGVzdCBwcm9qZWN0IGFuZCB0aGVuIHJ1biB0aGUgdGVzdCBhcHBsaWNhdGlvbiB1c2luZyB0aGUgc3lzdGVtIHV0aWxpdHkgQWN0aXZpdHkgTWFuYWdlciB3aXRoIGluc3RydW1lbnRhdGlvbi4gWW91IHByb3ZpZGUgdG8gQWN0aXZpdHkgTWFuYWdlciB0aGUgbmFtZSBvZiB0aGUgdGVzdCBydW5uZXIgKHVzdWFsbHkKLSAgICB7QGxpbmsgYW5kcm9pZC50ZXN0Lkluc3RydW1lbnRhdGlvblRlc3RSdW5uZXJ9KSB5b3Ugc3BlY2lmaWVkIGZvciB5b3VyIGFwcGxpY2F0aW9uOyB0aGUgbmFtZSBpbmNsdWRlcyBib3RoIHlvdXIgdGVzdCBhcHBsaWNhdGlvbidzIHBhY2thZ2UgbmFtZSBhbmQgdGhlIHRlc3QgcnVubmVyIGNsYXNzIG5hbWUuIEFjdGl2aXR5IE1hbmFnZXIgbG9hZHMgYW5kIHN0YXJ0cyB5b3VyCi0gICAgdGVzdCBhcHBsaWNhdGlvbiwga2lsbHMgYW55IGluc3RhbmNlcyBvZiB0aGUgYXBwbGljYXRpb24gdW5kZXIgdGVzdCwgbG9hZHMgYW4gaW5zdGFuY2Ugb2YgdGhlIGFwcGxpY2F0aW9uIHVuZGVyIHRlc3QgaW50byB0aGUgc2FtZSBwcm9jZXNzIGFzIHRoZSB0ZXN0IGFwcGxpY2F0aW9uLCBhbmQgdGhlbiBwYXNzZXMgY29udHJvbCB0byB0aGUgZmlyc3QgdGVzdCBjYXNlCi0gICAgY2xhc3MgaW4geW91ciB0ZXN0IGFwcGxpY2F0aW9uLiBUaGUgdGVzdCBydW5uZXIgdGhlbiB0YWtlcyBjb250cm9sIG9mIHRoZSB0ZXN0cywgcnVubmluZyBlYWNoIG9mIHlvdXIgdGVzdCBtZXRob2RzIGFnYWluc3QgdGhlIGFwcGxpY2F0aW9uIHVuZGVyIHRlc3QgdW50aWwgYWxsIHRoZSBtZXRob2RzIGluIGFsbCB0aGUgY2xhc3NlcyBoYXZlIGJlZW4gcnVuLgotPC9wPgotPHA+Ci0gICAgSWYgeW91IHJ1biBhIHRlc3Qgd2l0aGluIEVjbGlwc2Ugd2l0aCBBRFQsIHRoZSBvdXRwdXQgYXBwZWFycyBpbiBhIG5ldyBKVW5pdCB2aWV3IHBhbmUuIElmIHlvdSBydW4gYSB0ZXN0IGZyb20gdGhlIGNvbW1hbmQgbGluZSwgdGhlIG91dHB1dCBnb2VzIHRvIFNURE9VVC4KLTwvcD4KLTxoMiBpZD0iVGVzdEFyZWFzIj5XaGF0IHRvIFRlc3Q8L2gyPgotPHA+Ci0gIEluIGFkZGl0aW9uIHRvIHRoZSBmdW5jdGlvbmFsIGFyZWFzIHlvdSB3b3VsZCBub3JtYWxseSB0ZXN0LCBoZXJlIGFyZSBzb21lIGFyZWFzCi0gIG9mIEFuZHJvaWQgYXBwbGljYXRpb24gdGVzdGluZyB0aGF0IHlvdSBzaG91bGQgY29uc2lkZXI6Ci08L3A+Ci0gIDx1bD4KKzx1bD4KICAgICA8bGk+Ci0gICAgICBBY3Rpdml0eSBsaWZlY3ljbGUgZXZlbnRzOiBZb3Ugc2hvdWxkIHRlc3QgdGhhdCB5b3VyIGFjdGl2aXRpZXMgaGFuZGxlIGxpZmVjeWNsZSBldmVudHMgY29ycmVjdGx5LiBGb3IgZXhhbXBsZQotICAgICAgYW4gYWN0aXZpdHkgc2hvdWxkIHJlc3BvbmQgdG8gcGF1c2Ugb3IgZGVzdHJveSBldmVudHMgYnkgc2F2aW5nIGl0cyBzdGF0ZS4gUmVtZW1iZXIgdGhhdCBldmVuIGEgY2hhbmdlIGluIHNjcmVlbiBvcmllbnRhdGlvbgotICAgICAgY2F1c2VzIHRoZSBjdXJyZW50IGFjdGl2aXR5IHRvIGJlIGRlc3Ryb3llZCwgc28geW91IHNob3VsZCB0ZXN0IHRoYXQgYWNjaWRlbnRhbCBkZXZpY2UgbW92ZW1lbnRzIGRvbid0IGFjY2lkZW50YWxseSBsb3NlIHRoZQotICAgICAgYXBwbGljYXRpb24gc3RhdGUuCisgICAgICAgIFRoZSA8YQorICAgICAgICBocmVmPSJ7QGRvY1Jvb3R9cmVzb3VyY2VzL3R1dG9yaWFscy90ZXN0aW5nL2hlbGxvYW5kcm9pZF90ZXN0Lmh0bWwiPkhlbGxvLAorICAgICAgICBUZXN0aW5nPC9hPiB0dXRvcmlhbCBpbnRyb2R1Y2VzIGJhc2ljIHRlc3RpbmcgY29uY2VwdHMgYW5kIHByb2NlZHVyZXMgaW4gdGhlCisgICAgICAgIGNvbnRleHQgb2YgdGhlIEhlbGxvLCBXb3JsZCBhcHBsaWNhdGlvbi4KICAgICA8L2xpPgogICAgIDxsaT4KLSAgICAgIERhdGFiYXNlIG9wZXJhdGlvbnM6IFlvdSBzaG91bGQgZW5zdXJlIHRoYXQgZGF0YWJhc2Ugb3BlcmF0aW9ucyBjb3JyZWN0bHkgaGFuZGxlIGNoYW5nZXMgdG8gdGhlIGFwcGxpY2F0aW9uJ3Mgc3RhdGUuCi0gICAgICBUbyBkbyB0aGlzLCB1c2UgbW9jayBvYmplY3RzIGZyb20gdGhlIHBhY2thZ2Uge0BsaW5rIGFuZHJvaWQudGVzdC5tb2NrIGFuZHJvaWQudGVzdC5tb2NrfS4KKyAgICAgICAgVGhlIDxhIGhyZWY9IntAZG9jUm9vdH1yZXNvdXJjZXMvdHV0b3JpYWxzL3Rlc3RpbmcvYWN0aXZpdHlfdGVzdC5odG1sIj5BY3Rpdml0eQorICAgICAgICBUZXN0aW5nPC9hPiB0dXRvcmlhbCBpcyBhbiBleGNlbGxlbnQgZm9sbG93LXVwIHRvIHRoZSBIZWxsbywgVGVzdGluZyB0dXRvcmlhbC4KKyAgICAgICAgSXQgZ3VpZGVzIHlvdSB0aHJvdWdoIGEgbW9yZSBjb21wbGV4IHRlc3Rpbmcgc2NlbmFyaW8gdGhhdCB5b3UgZGV2ZWxvcCBhZ2FpbnN0IGEKKyAgICAgICAgbW9yZSByZWFsaXN0aWMgYXBwbGljYXRpb24uCiAgICAgPC9saT4KICAgICA8bGk+Ci0gICAgICAgIFNjcmVlbiBzaXplcyBhbmQgcmVzb2x1dGlvbnM6IEJlZm9yZSB5b3UgcHVibGlzaCB5b3VyIGFwcGxpY2F0aW9uLCBtYWtlIHN1cmUgdG8gdGVzdCBpdCBvbiBhbGwgb2YgdGhlCi0gICAgICAgIHNjcmVlbiBzaXplcyBhbmQgZGVuc2l0aWVzIG9uIHdoaWNoIHlvdSB3YW50IGl0IHRvIHJ1bi4gWW91IGNhbiB0ZXN0IHRoZSBhcHBsaWNhdGlvbiBvbiBtdWx0aXBsZSBzaXplcyBhbmQgZGVuc2l0aWVzIHVzaW5nCi0gICAgICAgIEFWRHMsIG9yIHlvdSBjYW4gdGVzdCB5b3VyIGFwcGxpY2F0aW9uIGRpcmVjdGx5IG9uIHRoZSBkZXZpY2VzIHRoYXQgeW91IGFyZSB0YXJnZXRpbmcuIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUKLSAgICAgICAgdGhlIHRvcGljIDxhIGhyZWY9IntAZG9jUm9vdH1ndWlkZS9wcmFjdGljZXMvc2NyZWVuc19zdXBwb3J0Lmh0bWwiPlN1cHBvcnRpbmcgTXVsdGlwbGUgU2NyZWVuczwvYT4uCisgICAgICAgIFRoZSBzYW1wbGUgdGVzdCBwYWNrYWdlCisgICAgICAgIDxhIGhyZWY9IntAZG9jUm9vdH1yZXNvdXJjZXMvc2FtcGxlcy9Ob3RlUGFkVGVzdCI+Tm90ZSBQYWQgVGVzdDwvYT4gaXMgYW4gZXhhbXBsZSBvZgorICAgICAgICB0ZXN0aW5nIGEge0BsaW5rIGFuZHJvaWQuY29udGVudC5Db250ZW50UHJvdmlkZXJ9LiBJdCBjb250YWlucyBhIHNldCBvZiB1bml0IHRlc3RzIGZvciB0aGUKKyAgICAgICAgTm90ZSBQYWQgc2FtcGxlIGFwcGxpY2F0aW9uJ3Mge0BsaW5rIGFuZHJvaWQuY29udGVudC5Db250ZW50UHJvdmlkZXJ9LgogICAgIDwvbGk+Ci0gIDwvdWw+Ci08cD4KLSAgV2hlbiBwb3NzaWJsZSwgeW91IHNob3VsZCBydW4gdGhlc2UgdGVzdHMgb24gYW4gYWN0dWFsIGRldmljZS4gSWYgdGhpcyBpcyBub3QgcG9zc2libGUsIHlvdSBjYW4KLSAgdXNlIHRoZSA8YSBocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvZGV2ZWxvcGluZy90b29scy9lbXVsYXRvci5odG1sIj5BbmRyb2lkIEVtdWxhdG9yPC9hPiB3aXRoCi0gIDxhIGhyZWY9IntAZG9jUm9vdH1ndWlkZS9kZXZlbG9waW5nL3Rvb2xzL2F2ZC5odG1sIj5BbmRyb2lkIFZpcnR1YWwgRGV2aWNlczwvYT4gY29uZmlndXJlZCBmb3IKLSAgdGhlIGhhcmR3YXJlLCBzY3JlZW5zLCBhbmQgdmVyc2lvbnMgeW91IHdhbnQgdG8gdGVzdC4KLTwvcD4KLTxoMiBpZD0iVUlUZXN0aW5nIj5BcHBlbmRpeDogVUkgVGVzdGluZyBOb3RlczwvaDI+Ci08cD4KLSAgVGhlIGZvbGxvd2luZyBzZWN0aW9ucyBoYXZlIHRpcHMgZm9yIHRlc3RpbmcgdGhlIFVJIG9mIHlvdXIgQW5kcm9pZCBhcHBsaWNhdGlvbiwgc3BlY2lmaWNhbGx5Ci0gIHRvIGhlbHAgeW91IGhhbmRsZSBhY3Rpb25zIHRoYXQgcnVuIGluIHRoZSBVSSB0aHJlYWQsIHRvdWNoIHNjcmVlbiBhbmQga2V5Ym9hcmQgZXZlbnRzLCBhbmQgaG9tZQotICBzY3JlZW4gdW5sb2NrIGR1cmluZyB0ZXN0aW5nLgotPC9wPgotPGgzIGlkPSJSdW5PblVJVGhyZWFkIj5UZXN0aW5nIG9uIHRoZSBVSSB0aHJlYWQ8L2gzPgotPHA+Ci0gIEFuIGFwcGxpY2F0aW9uJ3MgYWN0aXZpdGllcyBydW4gb24gdGhlIGFwcGxpY2F0aW9uJ3MgPHN0cm9uZz5VSSB0aHJlYWQ8L3N0cm9uZz4uIE9uY2UgdGhlCi0gIFVJIGlzIGluc3RhbnRpYXRlZCwgZm9yIGV4YW1wbGUgaW4gdGhlIGFjdGl2aXR5J3MgPGNvZGU+b25DcmVhdGUoKTwvY29kZT4gbWV0aG9kLCB0aGVuIGFsbAotICBpbnRlcmFjdGlvbnMgd2l0aCB0aGUgVUkgbXVzdCBydW4gaW4gdGhlIFVJIHRocmVhZC4gV2hlbiB5b3UgcnVuIHRoZSBhcHBsaWNhdGlvbiBub3JtYWxseSwgaXQKLSAgaGFzIGFjY2VzcyB0byB0aGUgdGhyZWFkIGFuZCBkb2VzIG5vdCBoYXZlIHRvIGRvIGFueXRoaW5nIHNwZWNpYWwuCi08L3A+Ci08cD4KLSAgVGhpcyBjaGFuZ2VzIHdoZW4geW91IHJ1biB0ZXN0cyBhZ2FpbnN0IHRoZSBhcHBsaWNhdGlvbi4gV2l0aCBpbnN0cnVtZW50YXRpb24tYmFzZWQgY2xhc3NlcywKLSAgeW91IGNhbiBpbnZva2UgbWV0aG9kcyBhZ2FpbnN0IHRoZSBVSSBvZiB0aGUgYXBwbGljYXRpb24gdW5kZXIgdGVzdC4gVGhlIG90aGVyIHRlc3QgY2xhc3NlcyBkb24ndCBhbGxvdyB0aGlzLgotICBUbyBydW4gYW4gZW50aXJlIHRlc3QgbWV0aG9kIG9uIHRoZSBVSSB0aHJlYWQsIHlvdSBjYW4gYW5ub3RhdGUgdGhlIHRocmVhZCB3aXRoIDxjb2RlPkBVSVRocmVhZFRlc3Q8L2NvZGU+LgotICBOb3RpY2UgdGhhdCB0aGlzIHdpbGwgcnVuIDxlbT5hbGw8L2VtPiBvZiB0aGUgbWV0aG9kIHN0YXRlbWVudHMgb24gdGhlIFVJIHRocmVhZC4gIE1ldGhvZHMgdGhhdCBkbyBub3QgaW50ZXJhY3Qgd2l0aCB0aGUgVUkKLSAgYXJlIG5vdCBhbGxvd2VkOyBmb3IgZXhhbXBsZSwgeW91IGNhbid0IGludm9rZSA8Y29kZT5JbnN0cnVtZW50YXRpb24ud2FpdEZvcklkbGVTeW5jKCk8L2NvZGU+LgotPC9wPgotPHA+Ci0gIFRvIHJ1biBhIHN1YnNldCBvZiBhIHRlc3QgbWV0aG9kIG9uIHRoZSBVSSB0aHJlYWQsIGNyZWF0ZSBhbiBhbm9ueW1vdXMgY2xhc3Mgb2YgdHlwZQotICA8Y29kZT5SdW5uYWJsZTwvY29kZT4sIHB1dCB0aGUgc3RhdGVtZW50cyB5b3Ugd2FudCBpbiB0aGUgPGNvZGU+cnVuKCk8L2NvZGU+IG1ldGhvZCwgYW5kIGluc3RhbnRpYXRlIGEgbmV3Ci0gIGluc3RhbmNlIG9mIHRoZSBjbGFzcyBhcyBhIHBhcmFtZXRlciB0byB0aGUgbWV0aG9kIDxjb2RlPjxlbT5hcHBBY3Rpdml0eTwvZW0+LnJ1bk9uVWlUaHJlYWQoKTwvY29kZT4sIHdoZXJlCi0gIDxjb2RlPjxlbT5hcHBBY3Rpdml0eTwvZW0+PC9jb2RlPiBpcyB0aGUgaW5zdGFuY2Ugb2YgdGhlIGFwcCB5b3UgYXJlIHRlc3RpbmcuCi08L3A+Ci08cD4KLSAgRm9yIGV4YW1wbGUsIHRoaXMgY29kZSBpbnN0YW50aWF0ZXMgYW4gYWN0aXZpdHkgdG8gdGVzdCwgcmVxdWVzdHMgZm9jdXMgKGEgVUkgYWN0aW9uKSBmb3IgdGhlIFNwaW5uZXIgZGlzcGxheWVkCi0gIGJ5IHRoZSBhY3Rpdml0eSwgYW5kIHRoZW4gc2VuZHMgYSBrZXkgdG8gaXQuIE5vdGljZSB0aGF0IHRoZSBjYWxscyB0byA8Y29kZT53YWl0Rm9ySWRsZVN5bmM8L2NvZGU+IGFuZCA8Y29kZT5zZW5kS2V5czwvY29kZT4KLSAgYXJlbid0IGFsbG93ZWQgdG8gcnVuIG9uIHRoZSBVSSB0aHJlYWQ6PC9wPgotPHByZT4KLSAgcHJpdmF0ZSBNeUFjdGl2aXR5IG1BY3Rpdml0eTsgLy8gTXlBY3Rpdml0eSBpcyB0aGUgY2xhc3MgbmFtZSBvZiB0aGUgYXBwIHVuZGVyIHRlc3QKLSAgcHJpdmF0ZSBTcGlubmVyIG1TcGlubmVyOwotCi0gIC4uLgotCi0gIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICBzdXBlci5zZXRVcCgpOwotICAgICAgbUluc3RydW1lbnRhdGlvbiA9IGdldEluc3RydW1lbnRhdGlvbigpOwotCi0gICAgICBtQWN0aXZpdHkgPSBnZXRBY3Rpdml0eSgpOyAvLyBnZXQgYSByZWZlcmVuY2VzIHRvIHRoZSBhcHAgdW5kZXIgdGVzdAotCi0gICAgICAvKgotICAgICAgICogR2V0IGEgcmVmZXJlbmNlIHRvIHRoZSBtYWluIHdpZGdldCBvZiB0aGUgYXBwIHVuZGVyIHRlc3QsIGEgU3Bpbm5lcgotICAgICAgICovCi0gICAgICBtU3Bpbm5lciA9IChTcGlubmVyKSBtQWN0aXZpdHkuZmluZFZpZXdCeUlkKGNvbS5hbmRyb2lkLmRlbW8ubXlhY3Rpdml0eS5SLmlkLlNwaW5uZXIwMSk7Ci0KLSAgLi4uCi0KLSAgcHVibGljIHZvaWQgYVRlc3QoKSB7Ci0gICAgICAvKgotICAgICAgICogcmVxdWVzdCBmb2N1cyBmb3IgdGhlIFNwaW5uZXIsIHNvIHRoYXQgdGhlIHRlc3QgY2FuIHNlbmQga2V5IGV2ZW50cyB0byBpdAotICAgICAgICogVGhpcyByZXF1ZXN0IG11c3QgYmUgcnVuIG9uIHRoZSBVSSB0aHJlYWQuIFRvIGRvIHRoaXMsIHVzZSB0aGUgcnVuT25VaVRocmVhZCBtZXRob2QKLSAgICAgICAqIGFuZCBwYXNzIGl0IGEgUnVubmFibGUgdGhhdCBjb250YWlucyBhIGNhbGwgdG8gcmVxdWVzdEZvY3VzIG9uIHRoZSBTcGlubmVyLgotICAgICAgICovCi0gICAgICBtQWN0aXZpdHkucnVuT25VaVRocmVhZChuZXcgUnVubmFibGUoKSB7Ci0gICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgewotICAgICAgICAgICAgICBtU3Bpbm5lci5yZXF1ZXN0Rm9jdXMoKTsKLSAgICAgICAgICB9Ci0gICAgICB9KTsKLQotICAgICAgbUluc3RydW1lbnRhdGlvbi53YWl0Rm9ySWRsZVN5bmMoKTsKLQotICAgICAgdGhpcy5zZW5kS2V5cyhLZXlFdmVudC5LRVlDT0RFX0RQQURfQ0VOVEVSKTsKLTwvcHJlPgotCi08aDMgaWQ9Ik5vdG91Y2hNb2RlIj5UdXJuaW5nIG9mZiB0b3VjaCBtb2RlPC9oMz4KLTxwPgotICBUbyBjb250cm9sIHRoZSBlbXVsYXRvciBvciBhIGRldmljZSB3aXRoIGtleSBldmVudHMgeW91IHNlbmQgZnJvbSB5b3VyIHRlc3RzLCB5b3UgbXVzdCB0dXJuIG9mZgotICB0b3VjaCBtb2RlLiBJZiB5b3UgZG8gbm90IGRvIHRoaXMsIHRoZSBrZXkgZXZlbnRzIGFyZSBpZ25vcmVkLgotPC9wPgotPHA+Ci0gIFRvIHR1cm4gb2ZmIHRvdWNoIG1vZGUsIHlvdSBpbnZva2UgPGNvZGU+QWN0aXZpdHlJbnN0cnVtZW50YXRpb25UZXN0Q2FzZTIuc2V0QWN0aXZpdHlUb3VjaE1vZGUoZmFsc2UpPC9jb2RlPgotICA8ZW0+YmVmb3JlPC9lbT4geW91IGNhbGwgPGNvZGU+Z2V0QWN0aXZpdHkoKTwvY29kZT4gdG8gc3RhcnQgdGhlIGFjdGl2aXR5LiBZb3UgbXVzdCBpbnZva2UgdGhlIG1ldGhvZCBpbiBhIHRlc3QgbWV0aG9kCi0gIHRoYXQgaXMgPGVtPm5vdDwvZW0+IHJ1bm5pbmcgb24gdGhlIFVJIHRocmVhZC4gRm9yIHRoaXMgcmVhc29uLCB5b3UgY2FuJ3QgaW52b2tlIHRoZSB0b3VjaCBtb2RlIG1ldGhvZAotICBmcm9tIGEgdGVzdCBtZXRob2QgdGhhdCBpcyBhbm5vdGF0ZWQgd2l0aCA8Y29kZT5AVUlUaHJlYWQ8L2NvZGU+LiBJbnN0ZWFkLCBpbnZva2UgdGhlIHRvdWNoIG1vZGUgbWV0aG9kIGZyb20gPGNvZGU+c2V0VXAoKTwvY29kZT4uCi08L3A+Ci08aDMgaWQ9IlVubG9ja0RldmljZSI+VW5sb2NraW5nIHRoZSBlbXVsYXRvciBvciBkZXZpY2U8L2gzPgotPHA+Ci0gIFlvdSBtYXkgZmluZCB0aGF0IFVJIHRlc3RzIGRvbid0IHdvcmsgaWYgdGhlIGVtdWxhdG9yJ3Mgb3IgZGV2aWNlJ3MgaG9tZSBzY3JlZW4gaXMgZGlzYWJsZWQgd2l0aCB0aGUga2V5Z3VhcmQgcGF0dGVybi4KLSAgVGhpcyBpcyBiZWNhdXNlIHRoZSBhcHBsaWNhdGlvbiB1bmRlciB0ZXN0IGNhbid0IHJlY2VpdmUga2V5IGV2ZW50cyBzZW50IGJ5IDxjb2RlPnNlbmRLZXlzKCk8L2NvZGU+LiBUaGUgYmVzdAotICB3YXkgdG8gYXZvaWQgdGhpcyBpcyB0byBzdGFydCB5b3VyIGVtdWxhdG9yIG9yIGRldmljZSBmaXJzdCBhbmQgdGhlbiBkaXNhYmxlIHRoZSBrZXlndWFyZCBmb3IgdGhlIGhvbWUgc2NyZWVuLgotPC9wPgotPHA+Ci0gIFlvdSBjYW4gYWxzbyBleHBsaWNpdGx5IGRpc2FibGUgdGhlIGtleWd1YXJkLiBUbyBkbyB0aGlzLAotICB5b3UgbmVlZCB0byBhZGQgYSBwZXJtaXNzaW9uIGluIHRoZSBtYW5pZmVzdCBmaWxlICg8Y29kZT5BbmRyb2lkTWFuaWZlc3QueG1sPC9jb2RlPikgYW5kCi0gIHRoZW4gZGlzYWJsZSB0aGUga2V5Z3VhcmQgaW4geW91ciBhcHBsaWNhdGlvbiB1bmRlciB0ZXN0LiBOb3RlLCB0aG91Z2gsIHRoYXQgeW91IGVpdGhlciBoYXZlIHRvIHJlbW92ZSB0aGlzIGJlZm9yZQotICB5b3UgcHVibGlzaCB5b3VyIGFwcGxpY2F0aW9uLCBvciB5b3UgaGF2ZSB0byBkaXNhYmxlIGl0IHByb2dyYW1tYXRpY2FsbHkgaW4gdGhlIHB1Ymxpc2hlZCBhcHAuCi08L3A+Ci08cD4KLSAgVG8gYWRkIHRoZSB0aGUgcGVybWlzc2lvbiwgYWRkIHRoZSBlbGVtZW50IDxjb2RlPiZsdDt1c2VzLXBlcm1pc3Npb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnBlcm1pc3Npb24uRElTQUJMRV9LRVlHVUFSRCIvJmd0OzwvY29kZT4KLSAgYXMgYSBjaGlsZCBvZiB0aGUgPGNvZGU+Jmx0O21hbmlmZXN0Jmd0OzwvY29kZT4gZWxlbWVudC4gVG8gZGlzYWJsZSB0aGUgS2V5R3VhcmQsIGFkZCB0aGUgZm9sbG93aW5nIGNvZGUKLSAgdG8gdGhlIDxjb2RlPm9uQ3JlYXRlKCk8L2NvZGU+IG1ldGhvZCBvZiBhY3Rpdml0aWVzIHlvdSBpbnRlbmQgdG8gdGVzdDoKLTwvcD4KLTxwcmU+Ci0gIG1LZXlHdWFyZE1hbmFnZXIgPSAoS2V5Z3VhcmRNYW5hZ2VyKSBnZXRTeXN0ZW1TZXJ2aWNlKEtFWUdVQVJEX1NFUlZJQ0UpOwotICBtTG9jayA9IG1LZXlHdWFyZE1hbmFnZXIubmV3S2V5Z3VhcmRMb2NrKCI8ZW0+YWN0aXZpdHlfY2xhc3NuYW1lPC9lbT4iKTsKLSAgbUxvY2suZGlzYWJsZUtleWd1YXJkKCk7Ci08L3ByZT4KLTxwPndoZXJlIDxjb2RlPjxlbT5hY3Rpdml0eV9jbGFzc25hbWU8L2VtPjwvY29kZT4gaXMgdGhlIGNsYXNzIG5hbWUgb2YgdGhlIGFjdGl2aXR5LjwvcD4KLTxoMyBpZD0iVUlUZXN0VHJvdWJsZXNob290aW5nIj5Ucm91Ymxlc2hvb3RpbmcgVUkgdGVzdHM8L2gzPgotPHA+Ci0gIFRoaXMgc2VjdGlvbiBsaXN0cyBzb21lIG9mIHRoZSBjb21tb24gdGVzdCBmYWlsdXJlcyB5b3UgbWF5IGVuY291bnRlciBpbiBVSSB0ZXN0aW5nLCBhbmQgdGhlaXIgY2F1c2VzOgotPC9wPgotPGRsPgotICAgIDxkdD48Y29kZT5Xcm9uZ1RocmVhZEV4Y2VwdGlvbjwvY29kZT48L2R0PgotICAgIDxkZD4KLSAgICAgIDxwPjxzdHJvbmc+UHJvYmxlbTo8L3N0cm9uZz48L3A+Ci0gICAgICBGb3IgYSBmYWlsZWQgdGVzdCwgdGhlIEZhaWx1cmUgVHJhY2UgY29udGFpbnMgdGhlIGZvbGxvd2luZyBlcnJvciBtZXNzYWdlOgotICAgICAgPGNvZGU+Ci0gICAgICAgIGFuZHJvaWQudmlldy5WaWV3Um9vdCRDYWxsZWRGcm9tV3JvbmdUaHJlYWRFeGNlcHRpb246IE9ubHkgdGhlIG9yaWdpbmFsIHRocmVhZCB0aGF0IGNyZWF0ZWQgYSB2aWV3IGhpZXJhcmNoeSBjYW4gdG91Y2ggaXRzIHZpZXdzLgotICAgICAgPC9jb2RlPgotICAgICAgPHA+PHN0cm9uZz5Qcm9iYWJsZSBDYXVzZTo8L3N0cm9uZz48L3A+Ci0gICAgICAgIFRoaXMgZXJyb3IgaXMgY29tbW9uIGlmIHlvdSB0cmllZCB0byBzZW5kIFVJIGV2ZW50cyB0byB0aGUgVUkgdGhyZWFkIGZyb20gb3V0c2lkZSB0aGUgVUkgdGhyZWFkLiBUaGlzIGNvbW1vbmx5IGhhcHBlbnMgaWYgeW91IHNlbmQgVUkgZXZlbnRzCi0gICAgICAgIGZyb20gdGhlIHRlc3QgYXBwbGljYXRpb24sIGJ1dCB5b3UgZG9uJ3QgdXNlIHRoZSA8Y29kZT5AVUlUaHJlYWQ8L2NvZGU+IGFubm90YXRpb24gb3IgdGhlIDxjb2RlPnJ1bk9uVWlUaHJlYWQoKTwvY29kZT4gbWV0aG9kLiBUaGUgdGVzdCBtZXRob2QgdHJpZWQgdG8gaW50ZXJhY3Qgd2l0aCB0aGUgVUkgb3V0c2lkZSB0aGUgVUkgdGhyZWFkLgotICAgICAgPHA+PHN0cm9uZz5TdWdnZXN0ZWQgUmVzb2x1dGlvbjo8L3N0cm9uZz48L3A+Ci0gICAgICAgIFJ1biB0aGUgaW50ZXJhY3Rpb24gb24gdGhlIFVJIHRocmVhZC4gVXNlIGEgdGVzdCBjbGFzcyB0aGF0IHByb3ZpZGVzIGluc3RydW1lbnRhdGlvbi4gU2VlIHRoZSBwcmV2aW91cyBzZWN0aW9uIDxhIGhyZWY9IiNSdW5PblVJVGhyZWFkIj5UZXN0aW5nIG9uIHRoZSBVSSBUaHJlYWQ8L2E+Ci0gICAgICAgIGZvciBtb3JlIGRldGFpbHMuCi0gICAgPC9kZD4KLSAgICA8ZHQ+PGNvZGU+amF2YS5sYW5nLlJ1bnRpbWVFeGNlcHRpb248L2NvZGU+PC9kdD4KLSAgICA8ZGQ+Ci0gICAgICA8cD48c3Ryb25nPlByb2JsZW06PC9zdHJvbmc+PC9wPgotICAgICAgRm9yIGEgZmFpbGVkIHRlc3QsIHRoZSBGYWlsdXJlIFRyYWNlIGNvbnRhaW5zIHRoZSBmb2xsb3dpbmcgZXJyb3IgbWVzc2FnZToKLSAgICAgIDxjb2RlPgotICAgICAgICBqYXZhLmxhbmcuUnVudGltZUV4Y2VwdGlvbjogVGhpcyBtZXRob2QgY2FuIG5vdCBiZSBjYWxsZWQgZnJvbSB0aGUgbWFpbiBhcHBsaWNhdGlvbiB0aHJlYWQKLSAgICAgIDwvY29kZT4KLSAgICAgIDxwPjxzdHJvbmc+UHJvYmFibGUgQ2F1c2U6PC9zdHJvbmc+PC9wPgotICAgICAgICBUaGlzIGVycm9yIGlzIGNvbW1vbiBpZiB5b3VyIHRlc3QgbWV0aG9kIGlzIGFubm90YXRlZCB3aXRoIDxjb2RlPkBVaVRocmVhZFRlc3Q8L2NvZGU+IGJ1dCB0aGVuIHRyaWVzIHRvCi0gICAgICAgIGRvIHNvbWV0aGluZyBvdXRzaWRlIHRoZSBVSSB0aHJlYWQgb3IgdHJpZXMgdG8gaW52b2tlIDxjb2RlPnJ1bk9uVWlUaHJlYWQoKTwvY29kZT4uCi0gICAgICA8cD48c3Ryb25nPlN1Z2dlc3RlZCBSZXNvbHV0aW9uOjwvc3Ryb25nPjwvcD4KLSAgICAgICAgUmVtb3ZlIHRoZSA8Y29kZT5AVWlUaHJlYWRUZXN0PC9jb2RlPiBhbm5vdGF0aW9uLCByZW1vdmUgdGhlIDxjb2RlPnJ1bk9uVWlUaHJlYWQoKTwvY29kZT4gY2FsbCwgb3IgcmUtZmFjdG9yIHlvdXIgdGVzdHMuCi0gICAgPC9kZD4KLTwvZGw+CisgICAgPGxpPgorICAgICAgICBUaGUgc2FtcGxlIHRlc3QgcGFja2FnZSA8YSBocmVmPSJ7QGRvY1Jvb3R9cmVzb3VyY2VzL3NhbXBsZXMvQWxhcm1TZXJ2aWNlVGVzdCJ9PgorICAgICAgICBBbGFybSBTZXJ2aWNlIFRlc3Q8L2E+IGlzIGFuIGV4YW1wbGUgb2YgdGVzdGluZyBhIHtAbGluayBhbmRyb2lkLmFwcC5TZXJ2aWNlfS4gSXQgY29udGFpbnMKKyAgICAgICAgYSBzZXQgb2YgdW5pdCB0ZXN0cyBmb3IgdGhlIEFsYXJtIFNlcnZpY2Ugc2FtcGxlIGFwcGxpY2F0aW9uJ3Mge0BsaW5rIGFuZHJvaWQuYXBwLlNlcnZpY2V9LgorICAgIDwvbGk+Cis8L3VsPgogCmRpZmYgLS1naXQgYS9kb2NzL2h0bWwvZ3VpZGUvdG9waWNzL3Rlc3Rpbmcvd2hhdF90b190ZXN0LmpkIGIvZG9jcy9odG1sL2d1aWRlL3RvcGljcy90ZXN0aW5nL3doYXRfdG9fdGVzdC5qZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMTM1MzhhCi0tLSAvZGV2L251bGwKKysrIGIvZG9jcy9odG1sL2d1aWRlL3RvcGljcy90ZXN0aW5nL3doYXRfdG9fdGVzdC5qZApAQCAtMCwwICsxLDg0IEBACitwYWdlLnRpdGxlPVdoYXQgVG8gVGVzdAorQGpkOmJvZHkKKzxwPgorICAgIEFzIHlvdSBkZXZlbG9wIEFuZHJvaWQgYXBwbGljYXRpb25zLCBrbm93aW5nIHdoYXQgdG8gdGVzdCBpcyBhcyBpbXBvcnRhbnQgYXMga25vd2luZyBob3cgdG8KKyAgICB0ZXN0LiBUaGlzIGRvY3VtZW50IGxpc3RzIHNvbWUgbW9zdCBjb21tb24gQW5kcm9pZC1yZWxhdGVkIHNpdHVhdGlvbnMgdGhhdCB5b3Ugc2hvdWxkIGNvbnNpZGVyCisgICAgd2hlbiB5b3UgdGVzdCwgZXZlbiBhdCB0aGUgdW5pdCB0ZXN0IGxldmVsLiBUaGlzIGlzIG5vdCBhbiBleGhhdXN0aXZlIGxpc3QsIGFuZCB5b3UgY29uc3VsdCB0aGUKKyAgICBkb2N1bWVudGF0aW9uIGZvciB0aGUgZmVhdHVyZXMgdGhhdCB5b3UgdXNlIGZvciBtb3JlIGlkZWFzLiBUaGUKKyAgICA8YSBocmVmPSJodHRwOi8vZ3JvdXBzLmdvb2dsZS5jb20vZ3JvdXAvYW5kcm9pZC1kZXZlbG9wZXJzIj5hbmRyb2lkLWRldmVsb3BlcnM8L2E+IEdvb2dsZSBHcm91cHMKKyAgICBzaXRlIGlzIGFub3RoZXIgcmVzb3VyY2UgZm9yIGluZm9ybWF0aW9uIGFib3V0IHRlc3RpbmcuCis8L3A+Cis8aDIgaWQ9IlRlc3RzIj5JZGVhcyBmb3IgVGVzdGluZzwvaDI+Cis8cD4KKyAgICBUaGUgZm9sbG93aW5nIHNlY3Rpb25zIGFyZSBvcmdhbml6ZWQgYnkgYmVoYXZpb3JzIG9yIHNpdHVhdGlvbnMgdGhhdCB5b3Ugc2hvdWxkIHRlc3QuIEVhY2gKKyAgICBzZWN0aW9uIGNvbnRhaW5zIGEgc2NlbmFyaW8gdGhhdCBmdXJ0aGVyIGlsbHVzdHJhdGVzIHRoZSBzaXR1YXRpb24gYW5kIHRoZSB0ZXN0IG9yIHRlc3RzIHlvdQorICAgIHNob3VsZCBkby4KKzwvcD4KKzxoND5DaGFuZ2UgaW4gb3JpZW50YXRpb248L2g0PgorPHA+CisgICAgRm9yIGRldmljZXMgdGhhdCBzdXBwb3J0IG11bHRpcGxlIG9yaWVudGF0aW9ucywgQW5kcm9pZCBkZXRlY3RzIGEgY2hhbmdlIGluIG9yaWVudGF0aW9uIHdoZW4KKyAgICB0aGUgdXNlciB0dXJucyB0aGUgZGV2aWNlIHNvIHRoYXQgdGhlIGRpc3BsYXkgaXMgImxhbmRzY2FwZSIgKGxvbmcgZWRnZSBpcyBob3Jpem9udGFsKSBpbnN0ZWFkCisgICAgb2YgInBvcnRyYWl0IiAobG9uZyBlZGdlIGlzIHZlcnRpY2FsKS4KKzwvcD4KKzxwPgorICAgIFdoZW4gQW5kcm9pZCBkZXRlY3RzIGEgY2hhbmdlIGluIG9yaWVudGF0aW9uLCBpdHMgZGVmYXVsdCBiZWhhdmlvciBpcyB0byBkZXN0cm95IGFuZCB0aGVuCisgICAgcmUtc3RhcnQgdGhlIGZvcmVncm91bmQgQWN0aXZpdHkuIFlvdSBzaG91bGQgY29uc2lkZXIgdGVzdGluZyB0aGUgZm9sbG93aW5nOgorPC9wPgorPHVsPgorICAgIDxsaT4KKyAgICAgICAgSXMgdGhlIHNjcmVlbiByZS1kcmF3biBjb3JyZWN0bHk/IEFueSBjdXN0b20gVUkgY29kZSB5b3UgaGF2ZSBzaG91bGQgaGFuZGxlIGNoYW5nZXMgaW4gdGhlCisgICAgICAgIG9yaWVudGF0aW9uLgorICAgIDwvbGk+CisgICAgPGxpPgorICAgICAgICBEb2VzIHRoZSBhcHBsaWNhdGlvbiBtYWludGFpbiBpdHMgc3RhdGU/IFRoZSBBY3Rpdml0eSBzaG91bGQgbm90IGxvc2UgYW55dGhpbmcgdGhhdCB0aGUKKyAgICAgICAgdXNlciBoYXMgYWxyZWFkeSBlbnRlcmVkIGludG8gdGhlIFVJLiBUaGUgYXBwbGljYXRpb24gc2hvdWxkIG5vdCAiZm9yZ2V0IiBpdHMgcGxhY2UgaW4gdGhlCisgICAgICAgIGN1cnJlbnQgdHJhbnNhY3Rpb24uCisgICAgPC9saT4KKzwvdWw+Cis8aDQ+Q2hhbmdlIGluIGNvbmZpZ3VyYXRpb248L2g0PgorPHA+CisgICAgQSBzaXR1YXRpb24gdGhhdCBpcyBtb3JlIGdlbmVyYWwgdGhhbiBhIGNoYW5nZSBpbiBvcmllbnRhdGlvbiBpcyBhIGNoYW5nZSBpbiB0aGUgZGV2aWNlJ3MKKyAgICBjb25maWd1cmF0aW9uLCBzdWNoIGFzIGEgY2hhbmdlIGluIHRoZSBhdmFpbGFiaWxpdHkgb2YgYSBrZXlib2FyZCBvciBhIGNoYW5nZSBpbiBzeXN0ZW0KKyAgICBsYW5ndWFnZS4KKzwvcD4KKzxwPgorICAgIEEgY2hhbmdlIGluIGNvbmZpZ3VyYXRpb24gYWxzbyB0cmlnZ2VycyB0aGUgZGVmYXVsdCBiZWhhdmlvciBvZiBkZXN0cm95aW5nIGFuZCB0aGVuIHJlc3RhcnRpbmcKKyAgICB0aGUgZm9yZWdyb3VuZCBBY3Rpdml0eS4gQmVzaWRlcyB0ZXN0aW5nIHRoYXQgdGhlIGFwcGxpY2F0aW9uIG1haW50YWlucyB0aGUgVUkgYW5kIGl0cworICAgIHRyYW5zYWN0aW9uIHN0YXRlLCB5b3Ugc2hvdWxkIGFsc28gdGVzdCB0aGF0IHRoZSBhcHBsaWNhdGlvbiB1cGRhdGVzIGl0c2VsZiB0byByZXNwb25kCisgICAgY29ycmVjdGx5IHRvIHRoZSBuZXcgY29uZmlndXJhdGlvbi4KKzwvcD4KKzxoND5CYXR0ZXJ5IGxpZmU8L2g0PgorPHA+CisgICAgTW9iaWxlIGRldmljZXMgcHJpbWFyaWx5IHJ1biBvbiBiYXR0ZXJ5IHBvd2VyLiBBIGRldmljZSBoYXMgZmluaXRlICJiYXR0ZXJ5IGJ1ZGdldCIsIGFuZCB3aGVuIGl0CisgICAgaXMgZ29uZSwgdGhlIGRldmljZSBpcyB1c2VsZXNzIHVudGlsIGl0IGlzIHJlY2hhcmdlZC4gWW91IG5lZWQgdG8gd3JpdGUgeW91ciBhcHBsaWNhdGlvbiB0bworICAgIG1pbmltaXplIGJhdHRlcnkgdXNhZ2UsIHlvdSBuZWVkIHRvIHRlc3QgaXRzIGJhdHRlcnkgcGVyZm9ybWFuY2UsIGFuZCB5b3UgbmVlZCB0byB0ZXN0IHRoZQorICAgIG1ldGhvZHMgdGhhdCBtYW5hZ2UgYmF0dGVyeSB1c2FnZS4KKzwvcD4KKzxwPgorICAgIFRlY2huaXF1ZXMgZm9yIG1pbmltaXppbmcgYmF0dGVyeSB1c2FnZSB3ZXJlIHByZXNlbnRlZCBhdCB0aGUgMjAxMCBHb29nbGUgSS9PIGNvbmZlcmVuY2UgaW4gdGhlCisgICAgcHJlc2VudGF0aW9uCisgICAgPGEgaHJlZj0iaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9ldmVudHMvaW8vMjAwOS9zZXNzaW9ucy9Db2RpbmdMaWZlQmF0dGVyeUxpZmUuaHRtbCI+CisgICAgQ29kaW5nIGZvciBMaWZlIC0tIEJhdHRlcnkgTGlmZSwgVGhhdCBJczwvYT4uIFRoaXMgcHJlc2VudGF0aW9uIGRlc2NyaWJlcyB0aGUgaW1wYWN0IG9uIGJhdHRlcnkKKyAgICBsaWZlIG9mIHZhcmlvdXMgb3BlcmF0aW9ucywgYW5kIHRoZSB3YXlzIHlvdSBjYW4gZGVzaWduIHlvdXIgYXBwbGljYXRpb24gdG8gbWluaW1pemUgdGhlc2UKKyAgICBpbXBhY3RzLiBXaGVuIHlvdSBjb2RlIHlvdXIgYXBwbGljYXRpb24gdG8gcmVkdWNlIGJhdHRlcnkgdXNhZ2UsIHlvdSBhbHNvIHdyaXRlIHRoZQorICAgIGFwcHJvcHJpYXRlIHVuaXQgdGVzdHMuCis8L3A+Cis8aDQ+RGVwZW5kZW5jZSBvbiBleHRlcm5hbCByZXNvdXJjZXM8L2g0PgorPHA+CisgICAgSWYgeW91ciBhcHBsaWNhdGlvbiBkZXBlbmRzIG9uIG5ldHdvcmsgYWNjZXNzLCBTTVMsIEJsdWV0b290aCwgb3IgR1BTLCB0aGVuIHlvdSBzaG91bGQKKyAgICB0ZXN0IHdoYXQgaGFwcGVucyB3aGVuIHRoZSByZXNvdXJjZSBvciByZXNvdXJjZXMgYXJlIG5vdCBhdmFpbGFibGUuCis8L3A+Cis8cD4KKyAgICBGb3IgZXhhbXBsZSwgaWYgeW91ciBhcHBsaWNhdGlvbiB1c2VzIHRoZSBuZXR3b3JrLGl0IGNhbiBub3RpZnkgdGhlIHVzZXIgaWYgYWNjZXNzIGlzCisgICAgdW5hdmFpbGFibGUsIG9yIGRpc2FibGUgbmV0d29yay1yZWxhdGVkIGZlYXR1cmVzLCBvciBkbyBib3RoLiBGb3IgR1BTLCBpdCBjYW4gc3dpdGNoIHRvCisgICAgSVAtYmFzZWQgbG9jYXRpb24gYXdhcmVuZXNzLiBJdCBjYW4gYWxzbyB3YWl0IGZvciBXaUZpIGFjY2VzcyBiZWZvcmUgZG9pbmcgbGFyZ2UgZGF0YSB0cmFuc2ZlcnMsCisgICAgc2luY2UgV2lGaSB0cmFuc2ZlcnMgbWF4aW1pemUgYmF0dGVyeSB1c2FnZSBjb21wYXJlZCB0byB0cmFuc2ZlcnMgb3ZlciAzRyBvciBFREdFLgorPC9wPgorPHA+CisgICAgWW91IGNhbiB1c2UgdGhlIGVtdWxhdG9yIHRvIHRlc3QgbmV0d29yayBhY2Nlc3MgYW5kIGJhbmR3aWR0aC4gVG8gbGVhcm4gbW9yZSwgcGxlYXNlIHNlZQorICAgIDxhIGhyZWY9IntAZG9jUm9vdH1ndWlkZS9kZXZlbG9waW5nL3Rvb2xzL2VtdWxhdG9yLmh0bWwjbmV0c3BlZWQiPk5ldHdvcmsgU3BlZWQgRW11bGF0aW9uPC9hPi4KKyAgICBUbyB0ZXN0IEdQUywgeW91IGNhbiB1c2UgdGhlIGVtdWxhdG9yIGNvbnNvbGUgYW5kIHtAbGluayBhbmRyb2lkLmxvY2F0aW9uLkxvY2F0aW9uTWFuYWdlcn0uIFRvCisgICAgbGVhcm4gbW9yZSBhYm91dCB0aGUgZW11bGF0b3IgY29uc29sZSwgcGxlYXNlIHNlZQorICAgIDxhIGhyZWY9IntAZG9jUm9vdH0vZ3VpZGUvZGV2ZWxvcGluZy90b29scy9lbXVsYXRvci5odG1sI2NvbnNvbGUiPgorICAgIFVzaW5nIHRoZSBFbXVsYXRvciBDb25zb2xlPC9hPi4KKzwvcD4KZGlmZiAtLWdpdCBhL2RvY3MvaHRtbC9ndWlkZS90b3BpY3MvdWkvZGlhbG9ncy5qZCBiL2RvY3MvaHRtbC9ndWlkZS90b3BpY3MvdWkvZGlhbG9ncy5qZAppbmRleCA3NGI1NDRiLi5kMDQ3YjJkIDEwMDY0NAotLS0gYS9kb2NzL2h0bWwvZ3VpZGUvdG9waWNzL3VpL2RpYWxvZ3MuamQKKysrIGIvZG9jcy9odG1sL2d1aWRlL3RvcGljcy91aS9kaWFsb2dzLmpkCkBAIC00NzIsMTggKzQ3MiwyNSBAQAogICAgICAgICAgICAgcHJvZ3Jlc3NEaWFsb2cgPSBuZXcgUHJvZ3Jlc3NEaWFsb2coTm90aWZpY2F0aW9uVGVzdC50aGlzKTsKICAgICAgICAgICAgIHByb2dyZXNzRGlhbG9nLnNldFByb2dyZXNzU3R5bGUoUHJvZ3Jlc3NEaWFsb2cuU1RZTEVfSE9SSVpPTlRBTCk7CiAgICAgICAgICAgICBwcm9ncmVzc0RpYWxvZy5zZXRNZXNzYWdlKCJMb2FkaW5nLi4uIik7Ci0gICAgICAgICAgICBwcm9ncmVzc1RocmVhZCA9IG5ldyBQcm9ncmVzc1RocmVhZChoYW5kbGVyKTsKLSAgICAgICAgICAgIHByb2dyZXNzVGhyZWFkLnN0YXJ0KCk7CiAgICAgICAgICAgICByZXR1cm4gcHJvZ3Jlc3NEaWFsb2c7CiAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgfQogICAgIH0KIAorICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG9uUHJlcGFyZURpYWxvZyhpbnQgaWQsIERpYWxvZyBkaWFsb2cpIHsKKyAgICAgICAgc3dpdGNoKGlkKSB7CisgICAgICAgIGNhc2UgUFJPR1JFU1NfRElBTE9HOgorICAgICAgICAgICAgcHJvZ3Jlc3NEaWFsb2cuc2V0UHJvZ3Jlc3MoMCk7CisgICAgICAgICAgICBwcm9ncmVzc1RocmVhZCA9IG5ldyBQcm9ncmVzc1RocmVhZChoYW5kbGVyKTsKKyAgICAgICAgICAgIHByb2dyZXNzVGhyZWFkLnN0YXJ0KCk7CisgICAgfQorCiAgICAgLy8gRGVmaW5lIHRoZSBIYW5kbGVyIHRoYXQgcmVjZWl2ZXMgbWVzc2FnZXMgZnJvbSB0aGUgdGhyZWFkIGFuZCB1cGRhdGUgdGhlIHByb2dyZXNzCiAgICAgZmluYWwgSGFuZGxlciBoYW5kbGVyID0gbmV3IEhhbmRsZXIoKSB7CiAgICAgICAgIHB1YmxpYyB2b2lkIGhhbmRsZU1lc3NhZ2UoTWVzc2FnZSBtc2cpIHsKLSAgICAgICAgICAgIGludCB0b3RhbCA9IG1zZy5nZXREYXRhKCkuZ2V0SW50KCJ0b3RhbCIpOworICAgICAgICAgICAgaW50IHRvdGFsID0gbXNnLmFyZzE7CiAgICAgICAgICAgICBwcm9ncmVzc0RpYWxvZy5zZXRQcm9ncmVzcyh0b3RhbCk7CiAgICAgICAgICAgICBpZiAodG90YWwgPj0gMTAwKXsKICAgICAgICAgICAgICAgICBkaXNtaXNzRGlhbG9nKFBST0dSRVNTX0RJQUxPRyk7CkBAIC01MTQsOSArNTIxLDcgQEAKICAgICAgICAgICAgICAgICAgICAgTG9nLmUoIkVSUk9SIiwgIlRocmVhZCBJbnRlcnJ1cHRlZCIpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBNZXNzYWdlIG1zZyA9IG1IYW5kbGVyLm9idGFpbk1lc3NhZ2UoKTsKLSAgICAgICAgICAgICAgICBCdW5kbGUgYiA9IG5ldyBCdW5kbGUoKTsKLSAgICAgICAgICAgICAgICBiLnB1dEludCgidG90YWwiLCB0b3RhbCk7Ci0gICAgICAgICAgICAgICAgbXNnLnNldERhdGEoYik7CisgICAgICAgICAgICAgICAgbXNnLmFyZzEgPSB0b3RhbDsKICAgICAgICAgICAgICAgICBtSGFuZGxlci5zZW5kTWVzc2FnZShtc2cpOwogICAgICAgICAgICAgICAgIHRvdGFsKys7CiAgICAgICAgICAgICB9CmRpZmYgLS1naXQgYS9kb2NzL2h0bWwvaW1hZ2VzL3Rlc3RpbmcvYW5kcm9pZF90ZXN0X2ZyYW1ld29yay5wbmcgYi9kb2NzL2h0bWwvaW1hZ2VzL3Rlc3RpbmcvYW5kcm9pZF90ZXN0X2ZyYW1ld29yay5wbmcKaW5kZXggNmY4MDUzMC4uNDU5OTc1YyAxMDA3NTUKLS0tIGEvZG9jcy9odG1sL2ltYWdlcy90ZXN0aW5nL2FuZHJvaWRfdGVzdF9mcmFtZXdvcmsucG5nCisrKyBiL2RvY3MvaHRtbC9pbWFnZXMvdGVzdGluZy9hbmRyb2lkX3Rlc3RfZnJhbWV3b3JrLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL2h0bWwvaW1hZ2VzL3Rlc3RpbmcvdGVzdF9mcmFtZXdvcmsucG5nIGIvZG9jcy9odG1sL2ltYWdlcy90ZXN0aW5nL3Rlc3RfZnJhbWV3b3JrLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYmM1ZmMyCi0tLSAvZGV2L251bGwKKysrIGIvZG9jcy9odG1sL2ltYWdlcy90ZXN0aW5nL3Rlc3RfZnJhbWV3b3JrLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL2h0bWwvcmVzb3VyY2VzL2Jyb3dzZXIuamQgYi9kb2NzL2h0bWwvcmVzb3VyY2VzL2Jyb3dzZXIuamQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGEwODc2OQotLS0gL2Rldi9udWxsCisrKyBiL2RvY3MvaHRtbC9yZXNvdXJjZXMvYnJvd3Nlci5qZApAQCAtMCwwICsxLDQ5IEBACitwYWdlLnRpdGxlPVRlY2huaWNhbCBSZXNvdXJjZXMKK0BqZDpib2R5CisKKzxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+CisgIHtAbGl0ZXJhbCBAaW1wb3J0fSAie0Bkb2NSb290fWFzc2V0cy9hbmRyb2lkLWRldmVsb3Blci1yZXNvdXJjZS1icm93c2VyLmNzcyI7Cis8L3N0eWxlPgorCis8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJ7QGRvY1Jvb3R9YXNzZXRzL2FuZHJvaWQtZGV2ZWxvcGVyLXJlc291cmNlLWJyb3dzZXIuanMiPjwvc2NyaXB0PgorPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0ie0Bkb2NSb290fWFzc2V0cy9taWNyb3RlbXBsYXRlLmpzIj48L3NjcmlwdD4KKworPGRpdj4KKyAgPHAgc3R5bGU9ImRpc3BsYXk6IG5vbmU7IGZsb2F0OiByaWdodCI+RmlsdGVyOiA8aW5wdXQgaWQ9InJlc291cmNlLWJyb3dzZXIta2V5d29yZC1maWx0ZXIiLz48L3A+CisgIDxwIGlkPSJyZXNvdXJjZS1icm93c2VyLXNlYXJjaC1wYXJhbXMiPlNob3dpbmcgYWxsIHRlY2huaWNhbCByZXNvdXJjZXM6PC9wPgorPC9kaXY+CisKKzxub3NjcmlwdD4KKyAgPHAgY2xhc3M9Im5vdGUiPjxzdHJvbmc+RXJyb3I6PC9zdHJvbmc+CisgICAgWW91IG11c3QgaGF2ZSBKYXZhU2NyaXB0IGVuYWJsZWQgdG8gdmlldyB0aGlzIHBhZ2UuIFJlc291cmNlcyBhcmUgYWxzbworICAgIGF2YWlsYWJsZSBvZmZsaW5lIGluIHRoZSBTREsuCisgIDwvcD4KKzwvbm9zY3JpcHQ+CisKKzxkaXYgaWQ9InJlc291cmNlLWJyb3dzZXItcmVzdWx0cyI+CisgIDxkaXYgY2xhc3M9Im5vLXJlc3VsdHMiPk5vIHJlc3VsdHMuPC9kaXY+Cis8L2Rpdj4KKworPHNjcmlwdCB0eXBlPSJ0ZXh0L2h0bWwiIGlkPSJ0bXBsX3Jlc291cmNlX2Jyb3dzZXJfcmVzdWx0Ij4KKzxkaXYgY2xhc3M9InJlc3VsdCI+CisgIDxoMz4KKyAgICA8JSBpZiAoJ2V4dGVybmFsJyBpbiB0YWdzSGFzaCkgeyAlPjxzdHJvbmc+RXh0ZXJuYWw6IDwvc3Ryb25nPiA8JSB9ICU+CisgICAgPGEgaHJlZj0iPCU9IHBhdGggJT4iPjwlPSB0aXRsZS5lbiAlPjwvYT4KKyAgICA8JSBpZiAoJ25ldycgaW4gdGFnc0hhc2gpIHsgJT48c3BhbiBjbGFzcz0ibmV3Ij5uZXchPC9zcGFuPiA8JSB9ICU+CisgIDwvaDM+CisgIDxwIGNsYXNzPSJyZXNvdXJjZS1tZXRhIj48JQorICAgIHZhciBfX2cgPSBbJycsICcnXTsKKyAgICBpZiAoJ2FydGljbGUnIGluIHRhZ3NIYXNoKSB7CisgICAgICBfX2cgPSBbJ0FydGljbGUnLCAnYWJvdXQnXTsKKyAgICB9IGVsc2UgaWYgKCd0dXRvcmlhbCcgaW4gdGFnc0hhc2gpIHsKKyAgICAgIF9fZyA9IFsnVHV0b3JpYWwnLCAnb24nXTsKKyAgICB9IGVsc2UgaWYgKCdzYW1wbGUnIGluIHRhZ3NIYXNoKSB7CisgICAgICBfX2cgPSBbJ1NhbXBsZScsICdmb3InXTsKKyAgICB9IGVsc2UgaWYgKCd2aWRlbycgaW4gdGFnc0hhc2gpIHsKKyAgICAgIF9fZyA9IFsnVmlkZW8nLCAnYWJvdXQnXTsKKyAgICB9CisgICU+CisgIDwlPSBfX2dbMF0gJT48JSBpZiAodG9waWNzSHRtbCkgeyAlPiA8JT0gX19nWzFdICU+PCUgfSAlPiA8JT0gdG9waWNzSHRtbCAlPjwvcD4KKyAgPHA+PCU9IGRlc2NyaXB0aW9uLmVuICU+PC9wPgorPC9kaXY+Cis8L3NjcmlwdD4KZGlmZiAtLWdpdCBhL2RvY3MvaHRtbC9yZXNvdXJjZXMvaW5kZXguamQgYi9kb2NzL2h0bWwvcmVzb3VyY2VzL2luZGV4LmpkCmluZGV4IDE2Njg3MjEuLjkwNTU4NjggMTAwNjQ0Ci0tLSBhL2RvY3MvaHRtbC9yZXNvdXJjZXMvaW5kZXguamQKKysrIGIvZG9jcy9odG1sL3Jlc291cmNlcy9pbmRleC5qZApAQCAtMSwzOCArMSw5MCBAQAogcGFnZS50aXRsZT1EZXZlbG9wZXIgUmVzb3VyY2VzCiBAamQ6Ym9keQogCis8c3R5bGUgdHlwZT0idGV4dC9jc3MiPgorICAjcmVzb3VyY2UtbGlzdC10YWJsZSB0ZCB7CisgICAgYm9yZGVyOiAwOworICAgIHBhZGRpbmc6IDAgMjRweDsKKyAgICB3aWR0aDogMzMlOworICAgIG1heC13aWR0aDogMjUwcHg7CisgICAgYm9yZGVyLXJpZ2h0OiAxcHggc29saWQgI2RkZDsKKyAgfQorCisgICNyZXNvdXJjZS1saXN0LXRhYmxlIHRkLmxhc3QgeworICAgIGJvcmRlci1yaWdodDogMDsKKyAgICBwYWRkaW5nLXJpZ2h0OiAwOworICB9Cis8L3N0eWxlPgorCiA8cD4KLVRoaXMgc2VjdGlvbiBwcm92aWRlcyB0ZWNobmljYWwgYXJ0aWNsZXMsIHR1dG9yaWFscywgc2FtcGxlIGNvZGUsIGFuZCBvdGhlcgorVGhpcyBzZWN0aW9uIHByb3ZpZGVzIGFydGljbGVzLCB0dXRvcmlhbHMsIHNhbXBsZSBjb2RlLCBhbmQgb3RoZXIKIGluZm9ybWF0aW9uIHRvIGhlbHAgeW91IHF1aWNrbHkgaW1wbGVtZW50IHRoZSBmZWF0dXJlcyB5b3Ugd2FudCBpbiB5b3VyCi1hcHBsaWNhdGlvbi4KK2FwcGxpY2F0aW9uLiBUbyByZXR1cm4gdG8gdGhpcyBwYWdlIGxhdGVyLCBqdXN0IGNsaWNrIHRoZSAiUmVzb3VyY2VzIgordGFiIHdoaWxlIGFueSBSZXNvdXJjZXMgcGFnZSBpcyBsb2FkZWQuCiA8L3A+CiAKKzxoMj5UZWNobmljYWwgUmVzb3VyY2VzPC9oMj4KKworPHRhYmxlIGlkPSJyZXNvdXJjZS1saXN0LXRhYmxlIj4KKzx0cj4KKyAgPHRkPgorICAgIDxhIGhyZWY9IntAZG9jUm9vdH1yZXNvdXJjZXMvYnJvd3Nlci5odG1sP3RhZz1zYW1wbGUiPgorICAgICAgPGltZyBzcmM9IntAZG9jUm9vdH1hc3NldHMvaW1hZ2VzL3Jlc291cmNlLWJpZy1zYW1wbGUucG5nIi8+CisgICAgPC9hPgorICAgIDxoMz48YSBocmVmPSJ7QGRvY1Jvb3R9cmVzb3VyY2VzL2Jyb3dzZXIuaHRtbD90YWc9c2FtcGxlIj4KKyAgICAgIFNhbXBsZSBDb2RlCisgICAgPC9hPjwvaDM+CisgICAgPHA+RnVsbHktZnVuY3Rpb25pbmcgc2FtcGxlIGFwcGxpY2F0aW9ucyB0aGF0IHlvdSBjYW4gYnVpbGQgYW5kIHJ1bgorICAgIHRvIGxlYXJuIGFib3V0IGhvdyBBbmRyb2lkIHdvcmtzLiBGZWVsIGZyZWUgdG8gcmV1c2UgYW55IG9mIHRoZSBjb2RlIG9yCisgICAgdGVjaG5pcXVlcyBpbiB0aGUgc2FtcGxlcy48L3A+CisgIDwvdGQ+CisgIDx0ZD4KKyAgICA8YSBocmVmPSJ7QGRvY1Jvb3R9cmVzb3VyY2VzL2Jyb3dzZXIuaHRtbD90YWc9YXJ0aWNsZSI+CisgICAgICA8aW1nIHNyYz0ie0Bkb2NSb290fWFzc2V0cy9pbWFnZXMvcmVzb3VyY2UtYmlnLWFydGljbGUucG5nIi8+CisgICAgPC9hPgorICAgIDxoMz48YSBocmVmPSJ7QGRvY1Jvb3R9cmVzb3VyY2VzL2Jyb3dzZXIuaHRtbD90YWc9YXJ0aWNsZSI+CisgICAgICBBcnRpY2xlcworICAgIDwvYT48L2gzPgorICAgIDxwPkZvY3VzZWQgZGlzY3Vzc2lvbnMgYWJvdXQgQW5kcm9pZCBkZXZlbG9wbWVudCBzdWJqZWN0cywgaW5jbHVkaW5nCisgICAgb3B0aW1pemF0aW9ucywgdGlwcywgaW50ZXJlc3RpbmcgaW1wbGVtZW50YXRpb25zLCAiaG93LXRvcyIsCisgICAgYW5kIHNvIG9uLjwvcD4KKyAgPC90ZD4KKyAgPHRkPgorICAgIDxhIGhyZWY9IntAZG9jUm9vdH1yZXNvdXJjZXMvYnJvd3Nlci5odG1sP3RhZz10dXRvcmlhbCI+CisgICAgICA8aW1nIHNyYz0ie0Bkb2NSb290fWFzc2V0cy9pbWFnZXMvcmVzb3VyY2UtYmlnLXR1dG9yaWFsLnBuZyIvPgorICAgIDwvYT4KKyAgICA8aDM+PGEgaHJlZj0ie0Bkb2NSb290fXJlc291cmNlcy9icm93c2VyLmh0bWw/dGFnPXR1dG9yaWFsIj4KKyAgICAgIFR1dG9yaWFscworICAgIDwvYT48L2gzPgorICAgIDxwPlN0ZXAtYnktc3RlcCBpbnN0cnVjdGlvbnMgZGVtb25zdHJhdGluZyBob3cgdG8gYnVpbGQgYW4gQW5kcm9pZCBhcHBsaWNhdGlvbgorICAgIHRoYXQgaGFzIHRoZSBzcGVjaWZpYyBmZWF0dXJlcyB5b3Ugd2FudC48L3A+CisgIDwvdGQ+CisgIDwhLS0gPHRkIGNsYXNzPSJsYXN0Ij4KKyAgICA8YSBocmVmPSJ7QGRvY1Jvb3R9cmVzb3VyY2VzL2Jyb3dzZXIuaHRtbD90YWc9dmlkZW8iPgorICAgICAgPGltZyBzcmM9IntAZG9jUm9vdH1hc3NldHMvaW1hZ2VzL3Jlc291cmNlLWJpZy12aWRlby5wbmciLz4KKyAgICA8L2E+CisgICAgPGgzPjxhIGhyZWY9IntAZG9jUm9vdH1yZXNvdXJjZXMvYnJvd3Nlci5odG1sP3RhZz12aWRlbyI+CisgICAgICBWaWRlb3MgJmFtcDsgU2NyZWVuY2FzdHMKKyAgICA8L2E+PC9oMz4KKyAgICA8cD5WaWRlb3MgYW5kIHByZXNlbnRhdGlvbiBzbGlkZXMgZnJvbSBkZXZlbG9wZXIgZXZlbnRzLCBhbG9uZyB3aXRoCisgICAgc2NyZWVuY2FzdHMgdG8gd2FsayB5b3UgdGhyb3VnaCBjb21tb24gQW5kcm9pZCBkZXZlbG9wbWVudAorICAgIHdvcmtmbG93cy48L3A+CisgIDwvdGQ+IC0tPgorPC90cj4KKzwvdGFibGU+CisKKzxoMj5PdGhlciBSZXNvdXJjZXM8L2gyPgorCiA8ZGw+Ci08ZHQ+PGI+VGVjaG5pY2FsIEFydGljbGVzPC9iPjwvZHQ+Ci08ZGQ+Rm9jdXNlZCBkaXNjdXNzaW9ucyBhYm91dCBBbmRyb2lkIGRldmVsb3BtZW50IHN1YmplY3RzLCBpbmNsdWRpbmcKLW9wdGltaXphdGlvbnMsIHRpcHMsIGludGVyZXN0aW5nIGltcGxlbWVudGF0aW9ucywKLWFuZCBzbyBvbi4gTW9zdCBvZiB0aGUgYXJ0aWNsZXMgcHJvdmlkZSAiaG93LXRvIiBpbnN0cnVjdGlvbnMgZm9yIGFkZGluZwotZmVhdHVyZXMgb3IgZnVuY3Rpb25hbGl0eSB0byB5b3VyIGFwcC4gVGhlIGFydGljbGVzIGFyZSBkcmF3biBmcm9tIHBvc3RzIHRvIHRoZQotQW5kcm9pZCBEZXZlbG9wZXJzIEJsb2cuCi08L2RkPgotCi08ZHQ+PGI+VHV0b3JpYWxzPC9iPjwvZHQ+Ci08ZGQ+U3RlcC1ieS1zdGVwIGluc3RydWN0aW9ucyBkZW1vbnN0cmF0aW5nIGhvdyB0byBidWlsZCBhbiBBbmRyb2lkIGFwcGxpY2F0aW9uCi10aGF0IGhhcyB0aGUgc3BlY2lmaWMgZmVhdHVyZXMgeW91IHdhbnQuIDwvZGQ+Ci0KLTxkdD48Yj5TYW1wbGUgQ29kZTwvYj48L2R0PgotPGRkPkZ1bGx5LWZ1bmN0aW9uaW5nIHNhbXBsZSBhcHBsaWNhdGlvbnMgdGhhdCB5b3UgY2FuIGxvb2sgYXQgb3IgYnVpbGQgYW5kIHJ1biwKLXRvIGxlYXJuIGFib3V0IGhvdyBBbmRyb2lkIHdvcmtzLiBGZWVsIGZyZWUgdG8gcmV1c2UgYW55IG9mIHRoZSBjb2RlIG9yCi10ZWNobmlxdWVzIHRoYXQgeW91IGZpbmQgaW4gdGhlIHNhbXBsZXMhPC9kZD4KLQogPGR0PjxiPkNvbW11bml0eTwvYj48L2R0PgogPGRkPkxpbmtzIHRvIHRoZSBBbmRyb2lkIGRpc2N1c3Npb24gZ3JvdXBzIGFuZCBpbmZvcm1hdGlvbiBhYm91dCBvdGhlciB3YXlzIHRvCiBjb2xsYWJvcmF0ZSB3aXRoIG90aGVyIGRldmVsb3BlcnMuIDwvZGQ+CiAKKzxkdD48Yj5EZXZpY2UgRGFzaGJvYXJkPC9iPjwvZHQ+Cis8ZGQ+RGV2aWNlIGRpc3RyaWJ1dGlvbiBkYXRhLCBncm91cGVkIGJ5IHZhcmlvdXMgZGltZW5zaW9ucyBzdWNoIGFzIHNjcmVlbiBzaXplCithbmQgQW5kcm9pZCBwbGF0Zm9ybSB2ZXJzaW9uLiA8L2RkPgorCiA8ZHQ+PGI+TW9yZTwvYj48L2R0PgogPGRkPlF1aWNrIGRldmVsb3BtZW50IHRpcHMsIHRyb3VibGVzaG9vdGluZyBpbmZvcm1hdGlvbiwgYW5kIGZyZXF1ZW50bHkgYXNrZWQKIHF1ZXN0aW9ucyAoRkFRcykuIDwvZGQ+CiA8L2RsPgotCi08cD5UbyByZXR1cm4gdG8gdGhpcyBwYWdlIGxhdGVyLCBqdXN0IGNsaWNrIHRoZSAiUmVzb3VyY2VzIiB0YWIgd2hpbGUgYW55Ci1SZXNvdXJjZXMgcGFnZSBpcyBsb2FkZWQuIDwvcD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL2h0bWwvcmVzb3VyY2VzL3Jlc291cmNlcy1kYXRhLmpzIGIvZG9jcy9odG1sL3Jlc291cmNlcy9yZXNvdXJjZXMtZGF0YS5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMDZiNjk1Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jcy9odG1sL3Jlc291cmNlcy9yZXNvdXJjZXMtZGF0YS5qcwpAQCAtMCwwICsxLDYzMiBAQAordmFyIEFORFJPSURfVEFHUyA9IHsKKyAgdHlwZTogeworICAgICdhcnRpY2xlJzogJ0FydGljbGUnLAorICAgICd0dXRvcmlhbCc6ICdUdXRvcmlhbCcsCisgICAgJ3NhbXBsZSc6ICdTYW1wbGUnLAorICAgICd2aWRlbyc6ICdWaWRlbycsCisgICAgJ2xpYnJhcnknOiAnQ29kZSBMaWJyYXJ5JworICB9LAorICB0b3BpYzogeworICAgICdhY2Nlc3NpYmlsaXR5JzogJ0FjY2Vzc2liaWxpdHknLAorICAgICdhY2NvdW50c3luYyc6ICdBY2NvdW50cyAmYW1wOyBTeW5jJywKKyAgICAnYmVzdHByYWN0aWNlJzogJ0Jlc3QgUHJhY3RpY2VzJywKKyAgICAnY29tbXVuaWNhdGlvbic6ICdDb21tdW5pY2F0aW9uJywKKyAgICAnY29tcGF0aWJpbGl0eSc6ICdDb21wYXRpYmlsaXR5JywKKyAgICAnZGF0YSc6ICdEYXRhIEFjY2VzcycsCisgICAgJ2RyYXdpbmcnOiAnQ2FudmFzIERyYXdpbmcnLAorICAgICdnYW1lZGV2JzogJ0dhbWUgRGV2ZWxvcG1lbnQnLAorICAgICdnbCc6ICdPcGVuR0wgRVMnLAorICAgICdpbnB1dCc6ICdJbnB1dCBNZXRob2RzJywKKyAgICAnaW50ZW50JzogJ0ludGVudHMnLAorICAgICdsYXlvdXQnOiAnTGF5b3V0cy9WaWV3cycsCisgICAgJ21lZGlhJzogJ011bHRpbWVkaWEnLAorICAgICduZXdmZWF0dXJlJzogJ05ldyBGZWF0dXJlcycsCisgICAgJ3BlcmZvcm1hbmNlJzogJ1BlcmZvcm1hbmNlJywKKyAgICAnc2VhcmNoJzogJ1NlYXJjaCcsCisgICAgJ3Rlc3RpbmcnOiAnVGVzdGluZycsCisgICAgJ3VpJzogJ1VzZXIgSW50ZXJmYWNlJywKKyAgICAnd2ViJzogJ1dlYiBDb250ZW50JworICB9LAorICBtaXNjOiB7CisgICAgJ2V4dGVybmFsJzogJ0V4dGVybmFsJywKKyAgICAnbmV3JzogJ05ldycKKyAgfQorfTsKKwordmFyIEFORFJPSURfUkVTT1VSQ0VTID0gWworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8vIFRFQ0hOSUNBTCBBUlRJQ0xFUyAvLy8KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKyAgeworICAgIHRhZ3M6IFsnYXJ0aWNsZScsICdwZXJmb3JtYW5jZScsICdiZXN0cHJhY3RpY2UnXSwKKyAgICBwYXRoOiAnYXJ0aWNsZXMvYXZvaWRpbmctbWVtb3J5LWxlYWtzLmh0bWwnLAorICAgIHRpdGxlOiB7CisgICAgICBlbjogJ0F2b2lkaW5nIE1lbW9yeSBMZWFrcycKKyAgICB9LAorICAgIGRlc2NyaXB0aW9uOiB7CisgICAgICBlbjogJ01vYmlsZSBkZXZpY2VzIG9mdGVuIGhhdmUgbGltaXRlZCBtZW1vcnksIGFuZCBtZW1vcnkgbGVha3MgY2FuIGNhdXNlIHlvdXIgYXBwbGljYXRpb24gdG8gd2FzdGUgdGhpcyB2YWx1YWJsZSByZXNvdXJjZSB3aXRob3V0IHlvdXIga25vd2xlZGdlLiBUaGlzIGFydGljbGUgcHJvdmlkZXMgdGlwcyB0byBoZWxwIHlvdSBhdm9pZCBjb21tb24gY2F1c2VzIG9mIG1lbW9yeSBsZWFrcyBvbiB0aGUgQW5kcm9pZCBwbGF0Zm9ybS4nCisgICAgfQorICB9LAorICB7CisgICAgdGFnczogWydhcnRpY2xlJywgJ2NvbXBhdGliaWxpdHknXSwKKyAgICBwYXRoOiAnYXJ0aWNsZXMvYmFja3dhcmQtY29tcGF0aWJpbGl0eS5odG1sJywKKyAgICB0aXRsZTogeworICAgICAgZW46ICdCYWNrd2FyZCBDb21wYXRpYmlsaXR5JworICAgIH0sCisgICAgZGVzY3JpcHRpb246IHsKKyAgICAgIGVuOiAnVGhlIEFuZHJvaWQgcGxhdGZvcm0gc3RyaXZlcyB0byBlbnN1cmUgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkuIEhvd2V2ZXIsIHNvbWV0aW1lcyB5b3Ugd2FudCB0byB1c2UgbmV3IGZlYXR1cmVzIHdoaWNoIGFyZW5cJ3Qgc3VwcG9ydGVkIG9uIG9sZGVyIHBsYXRmb3Jtcy4gVGhpcyBhcnRpY2xlIGRpc2N1c3NlcyBzdHJhdGVnaWVzIGZvciBzZWxlY3RpdmVseSB1c2luZyB0aGVzZSBmZWF0dXJlcyBiYXNlZCBvbiBhdmFpbGFiaWxpdHksIGFsbG93aW5nIHlvdSB0byBrZWVwIHlvdXIgYXBwbGljYXRpb25zIHBvcnRhYmxlIGFjcm9zcyBhIHdpZGUgcmFuZ2Ugb2YgZGV2aWNlcy4nCisgICAgfQorICB9LAorICB7CisgICAgdGFnczogWydhcnRpY2xlJywgJ2ludGVudCddLAorICAgIHBhdGg6ICdhcnRpY2xlcy9jYW4taS11c2UtdGhpcy1pbnRlbnQuaHRtbCcsCisgICAgdGl0bGU6IHsKKyAgICAgIGVuOiAnQ2FuIEkgVXNlIHRoaXMgSW50ZW50PycKKyAgICB9LAorICAgIGRlc2NyaXB0aW9uOiB7CisgICAgICBlbjogJ0FuZHJvaWQgb2ZmZXJzIGEgdmVyeSBwb3dlcmZ1bCBhbmQgeWV0IGVhc3ktdG8tdXNlIG1lc3NhZ2UgdHlwZSBjYWxsZWQgYW4gaW50ZW50LiBZb3UgY2FuIHVzZSBpbnRlbnRzIHRvIHR1cm4gYXBwbGljYXRpb25zIGludG8gaGlnaC1sZXZlbCBsaWJyYXJpZXMgYW5kIG1ha2UgY29kZSBtb2R1bGFyIGFuZCByZXVzYWJsZS4gV2hpbGUgaXQgaXMgbmljZSB0byBiZSBhYmxlIHRvIG1ha2UgdXNlIG9mIGEgbG9vc2VseSBjb3VwbGVkIEFQSSwgdGhlcmUgaXMgbm8gZ3VhcmFudGVlIHRoYXQgdGhlIGludGVudCB5b3Ugc2VuZCB3aWxsIGJlIHJlY2VpdmVkIGJ5IGFub3RoZXIgYXBwbGljYXRpb24uIFRoaXMgYXJ0aWNsZSBkZXNjcmliZXMgYSB0ZWNobmlxdWUgeW91IGNhbiB1c2UgdG8gZmluZCBvdXQgd2hldGhlciB0aGUgc3lzdGVtIGNvbnRhaW5zIGFueSBhcHBsaWNhdGlvbiBjYXBhYmxlIG9mIHJlc3BvbmRpbmcgdG8gdGhlIGludGVudCB5b3Ugd2FudCB0byB1c2UuJworICAgIH0KKyAgfSwKKyAgeworICAgIHRhZ3M6IFsnYXJ0aWNsZScsICdpbnB1dCddLAorICAgIHBhdGg6ICdhcnRpY2xlcy9jcmVhdGluZy1pbnB1dC1tZXRob2QuaHRtbCcsCisgICAgdGl0bGU6IHsKKyAgICAgIGVuOiAnQ3JlYXRpbmcgYW4gSW5wdXQgTWV0aG9kJworICAgIH0sCisgICAgZGVzY3JpcHRpb246IHsKKyAgICAgIGVuOiAnSW5wdXQgTWV0aG9kIEVkaXRvcnMgKElNRXMpIHByb3ZpZGUgdGhlIG1lY2hhbmlzbSBmb3IgZW50ZXJpbmcgdGV4dCBpbnRvIHRleHQgZmllbGRzIGFuZCBvdGhlciBWaWV3cy4gQW5kcm9pZCBkZXZpY2VzIGNvbWUgYnVuZGxlZCB3aXRoIGF0IGxlYXN0IG9uZSBJTUUsIGJ1dCB1c2VycyBjYW4gaW5zdGFsbCBhZGRpdGlvbmFsIElNRXMuIFRoaXMgYXJ0aWNsZSBjb3ZlcnMgdGhlIGJhc2ljcyBvZiBkZXZlbG9waW5nIGFuIElNRSBmb3IgdGhlIEFuZHJvaWQgcGxhdGZvcm0uJworICAgIH0KKyAgfSwKKyAgeworICAgIHRhZ3M6IFsnYXJ0aWNsZScsICdkcmF3aW5nJywgJ3VpJ10sCisgICAgcGF0aDogJ2FydGljbGVzL2RyYXdhYmxlLW11dGF0aW9ucy5odG1sJywKKyAgICB0aXRsZTogeworICAgICAgZW46ICdEcmF3YWJsZSBNdXRhdGlvbnMnCisgICAgfSwKKyAgICBkZXNjcmlwdGlvbjogeworICAgICAgZW46ICdEcmF3YWJsZXMgYXJlIHBsdWdnYWJsZSBkcmF3aW5nIGNvbnRhaW5lcnMgdGhhdCBhbGxvdyBhcHBsaWNhdGlvbnMgdG8gZGlzcGxheSBncmFwaGljcy4gVGhpcyBhcnRpY2xlIGV4cGxhaW5zIHNvbWUgY29tbW9uIHBpdGZhbGxzIHdoZW4gdHJ5aW5nIHRvIG1vZGlmeSB0aGUgcHJvcGVydGllcyBvZiBtdWx0aXBsZSBEcmF3YWJsZXMuJworICAgIH0KKyAgfSwKKyAgeworICAgIHRhZ3M6IFsnYXJ0aWNsZScsICdiZXN0cHJhY3RpY2UnLCAndWknXSwKKyAgICBwYXRoOiAnYXJ0aWNsZXMvZmFzdGVyLXNjcmVlbi1vcmllbnRhdGlvbi1jaGFuZ2UuaHRtbCcsCisgICAgdGl0bGU6IHsKKyAgICAgIGVuOiAnRmFzdGVyIFNjcmVlbiBPcmllbnRhdGlvbiBDaGFuZ2UnCisgICAgfSwKKyAgICBkZXNjcmlwdGlvbjogeworICAgICAgZW46ICdXaGVuIGFuIEFuZHJvaWQgZGV2aWNlIGNoYW5nZXMgaXRzIG9yaWVudGF0aW9uLCB0aGUgZGVmYXVsdCBiZWhhdmlvciBpcyB0byBhdXRvbWF0aWNhbGx5IHJlc3RhcnQgdGhlIGN1cnJlbnQgYWN0aXZpdHkgd2l0aCBhIG5ldyBjb25maWd1cmF0aW9uLiBIb3dldmVyLCB0aGlzIGNhbiBiZWNvbWUgYSBib3R0bGVuZWNrIGluIGFwcGxpY2F0aW9ucyB0aGF0IGFjY2VzcyBhIGxhcmdlIGFtb3VudCBvZiBleHRlcm5hbCBkYXRhLiBUaGlzIGFydGljbGUgZGlzY3Vzc2VzIGhvdyB0byBncmFjZWZ1bGx5IGhhbmRsZSB0aGlzIHNpdHVhdGlvbiB3aXRob3V0IHJlc29ydGluZyB0byBtYW51YWxseSBwcm9jZXNzaW5nIGNvbmZpZ3VyYXRpb24gY2hhbmdlcy4nCisgICAgfQorICB9LAorICB7CisgICAgdGFnczogWydhcnRpY2xlJywgJ2NvbXBhdGliaWxpdHknXSwKKyAgICBwYXRoOiAnYXJ0aWNsZXMvZnV0dXJlLXByb29maW5nLmh0bWwnLAorICAgIHRpdGxlOiB7CisgICAgICBlbjogJ0Z1dHVyZS1Qcm9vZmluZyBZb3VyIEFwcHMnCisgICAgfSwKKyAgICBkZXNjcmlwdGlvbjogeworICAgICAgZW46ICdBIGNvbGxlY3Rpb24gb2YgY29tbW9uIHNlbnNlIGFkdmljZSB0byBoZWxwIHlvdSBlbnN1cmUgdGhhdCB5b3VyIGFwcGxpY2F0aW9ucyBkb25cJ3QgYnJlYWsgd2hlbiBuZXcgdmVyc2lvbnMgb2YgdGhlIEFuZHJvaWQgcGxhdGZvcm0gYXJlIHJlbGVhc2VkLicKKyAgICB9CisgIH0sCisgIHsKKyAgICB0YWdzOiBbJ2FydGljbGUnLCAnaW5wdXQnXSwKKyAgICBwYXRoOiAnYXJ0aWNsZXMvZ2VzdHVyZXMuaHRtbCcsCisgICAgdGl0bGU6IHsKKyAgICAgIGVuOiAnR2VzdHVyZXMnCisgICAgfSwKKyAgICBkZXNjcmlwdGlvbjogeworICAgICAgZW46ICdUb3VjaCBzY3JlZW5zIGFsbG93IHVzZXJzIHRvIHBlcmZvcm0gZ2VzdHVyZXMsIHN1Y2ggYXMgdGFwcGluZywgZHJhZ2dpbmcsIGZsaW5naW5nLCBvciBzbGlkaW5nLCB0byBwZXJmb3JtIHZhcmlvdXMgYWN0aW9ucy4gVGhlIGdlc3R1cmVzIEFQSSBlbmFibGVzIHlvdXIgYXBwbGljYXRpb24gdG8gcmVjb2duaXplIGV2ZW4gY29tcGxpY2F0ZWQgZ2VzdHVyZXMgd2l0aCBlYXNlLiBUaGlzIGFydGljbGUgZXhwbGFpbnMgaG93IHRvIGludGVncmF0ZSB0aGlzIEFQSSBpbnRvIGFuIGFwcGxpY2F0aW9uLicKKyAgICB9CisgIH0sCisgIHsKKyAgICB0YWdzOiBbJ2FydGljbGUnLCAnZ2FtZWRldicsICdnbCddLAorICAgIHBhdGg6ICdhcnRpY2xlcy9nbHN1cmZhY2V2aWV3Lmh0bWwnLAorICAgIHRpdGxlOiB7CisgICAgICBlbjogJ0ludHJvZHVjaW5nIEdMU3VyZmFjZVZpZXcnCisgICAgfSwKKyAgICBkZXNjcmlwdGlvbjogeworICAgICAgZW46ICdUaGlzIGFydGljbGUgcHJvdmlkZXMgYW4gb3ZlcnZpZXcgb2YgR0xTdXJmYWNlVmlldywgYSBjbGFzcyB0aGF0IG1ha2VzIGl0IGVhc3kgdG8gaW1wbGVtZW50IDJEIG9yIDNEIE9wZW5HTCByZW5kZXJpbmcgaW5zaWRlIG9mIGFuIEFuZHJvaWQgYXBwbGljYXRpb24uJworICAgIH0KKyAgfSwKKyAgeworICAgIHRhZ3M6IFsnYXJ0aWNsZScsICd1aScsICdsYXlvdXQnXSwKKyAgICBwYXRoOiAnYXJ0aWNsZXMvbGF5b3V0LXRyaWNrcy1yZXVzZS5odG1sJywKKyAgICB0aXRsZTogeworICAgICAgZW46ICdMYXlvdXQgVHJpY2tzOiBDcmVhdGluZyBSZXVzYWJsZSBVSSBDb21wb25lbnRzJworICAgIH0sCisgICAgZGVzY3JpcHRpb246IHsKKyAgICAgIGVuOiAnTGVhcm4gaG93IHRvIGNvbWJpbmUgbXVsdGlwbGUgc3RhbmRhcmQgVUkgd2lkZ2V0cyBpbnRvIGEgc2luZ2xlIGhpZ2gtbGV2ZWwgY29tcG9uZW50LCB3aGljaCBjYW4gYmUgcmV1c2VkIHRocm91Z2hvdXQgeW91ciBhcHBsaWNhdGlvbi4nCisgICAgfQorICB9LAorICB7CisgICAgdGFnczogWydhcnRpY2xlJywgJ2xheW91dCcsICd1aScsICdwZXJmb3JtYW5jZScsICdiZXN0cHJhY3RpY2UnXSwKKyAgICBwYXRoOiAnYXJ0aWNsZXMvbGF5b3V0LXRyaWNrcy1lZmZpY2llbmN5Lmh0bWwnLAorICAgIHRpdGxlOiB7CisgICAgICBlbjogJ0xheW91dCBUcmlja3M6IENyZWF0aW5nIEVmZmljaWVudCBMYXlvdXRzJworICAgIH0sCisgICAgZGVzY3JpcHRpb246IHsKKyAgICAgIGVuOiAnTGVhcm4gaG93IHRvIG9wdGltaXplIGFwcGxpY2F0aW9uIGxheW91dHMgYXMgdGhpcyBhcnRpY2xlIHdhbGtzIHlvdSB0aHJvdWdoIGNvbnZlcnRpbmcgYSBMaW5lYXJMYXlvdXQgaW50byBhIFJlbGF0aXZlTGF5b3V0LCBhbmQgYW5hbHl6ZXMgdGhlIHJlc3VsdGluZyBpbXBsaWNhdGlvbnMgb24gcGVyZm9ybWFuY2UuJworICAgIH0KKyAgfSwKKyAgeworICAgIHRhZ3M6IFsnYXJ0aWNsZScsICdsYXlvdXQnLCAndWknLCAncGVyZm9ybWFuY2UnLCAnYmVzdHByYWN0aWNlJ10sCisgICAgcGF0aDogJ2FydGljbGVzL2xheW91dC10cmlja3Mtc3R1YnMuaHRtbCcsCisgICAgdGl0bGU6IHsKKyAgICAgIGVuOiAnTGF5b3V0IFRyaWNrczogVXNpbmcgVmlld1N0dWJzJworICAgIH0sCisgICAgZGVzY3JpcHRpb246IHsKKyAgICAgIGVuOiAnTGVhcm4gYWJvdXQgdXNpbmcgVmlld1N0dWJzIGluc2lkZSBhbiBhcHBsaWNhdGlvblwncyBsYXlvdXQgaW4gb3JkZXIgdG8gaW5mbGF0ZSByYXJlbHkgdXNlZCBVSSBlbGVtZW50cywgd2l0aG91dCB0aGUgcGVyZm9ybWFuY2UgaW1wbGljYXRpb25zIHdoaWNoIHdvdWxkIG90aGVyd2lzZSBiZSBjYXVzZWQgYnkgdXNpbmcgdGhlIDxjb2RlPiZsdDtpbmNsdWRlJmd0OzwvY29kZT4gdGFnLicKKyAgICB9CisgIH0sCisgIHsKKyAgICB0YWdzOiBbJ2FydGljbGUnLCAnbGF5b3V0JywgJ3VpJywgJ3BlcmZvcm1hbmNlJywgJ2Jlc3RwcmFjdGljZSddLAorICAgIHBhdGg6ICdhcnRpY2xlcy9sYXlvdXQtdHJpY2tzLW1lcmdlLmh0bWwnLAorICAgIHRpdGxlOiB7CisgICAgICBlbjogJ0xheW91dCBUcmlja3M6IE1lcmdpbmcgTGF5b3V0cycKKyAgICB9LAorICAgIGRlc2NyaXB0aW9uOiB7CisgICAgICBlbjogJ0xlYXJuIGhvdyB0byB1c2UgdGhlIDxjb2RlPiZsdDttZXJnZSZndDs8L2NvZGU+IHRhZyBpbiB5b3VyIFhNTCBsYXlvdXRzIGluIG9yZGVyIHRvIGF2b2lkIHVubmVjZXNzYXJ5IGxldmVscyBvZiBoaWVyYXJjaHkgd2l0aGluIGFuIGFwcGxpY2F0aW9uXCdzIHZpZXcgdHJlZS4nCisgICAgfQorICB9LAorICB7CisgICAgdGFnczogWydhcnRpY2xlJywgJ3VpJywgJ3BlcmZvcm1hbmNlJ10sCisgICAgcGF0aDogJ2FydGljbGVzL2xpc3R2aWV3LWJhY2tncm91bmRzLmh0bWwnLAorICAgIHRpdGxlOiB7CisgICAgICBlbjogJ0xpc3RWaWV3IEJhY2tncm91bmRzOiBBbiBPcHRpbWl6YXRpb24nCisgICAgfSwKKyAgICBkZXNjcmlwdGlvbjogeworICAgICAgZW46ICdMaXN0Vmlld3MgYXJlIHZlcnkgcG9wdWxhciB3aWRnZXRzIHdpdGhpbiB0aGUgQW5kcm9pZCBmcmFtZXdvcmsuIFRoaXMgYXJ0aWNsZSBkZXNjcmliZXMgc29tZSBvZiB0aGUgb3B0aW1pemF0aW9ucyB1c2VkIGJ5IHRoZSBMaXN0VmlldyB3aWRnZXQsIGFuZCBob3cgdG8gYXZvaWQgc29tZSBjb21tb24gaXNzdWVzIHRoYXQgdGhpcyBjYXVzZXMgd2hlbiB0cnlpbmcgdG8gdXNlIGEgY3VzdG9tIGJhY2tncm91bmQuJworICAgIH0KKyAgfSwKKyAgeworICAgIHRhZ3M6IFsnYXJ0aWNsZScsICd1aScsICduZXdmZWF0dXJlJ10sCisgICAgcGF0aDogJ2FydGljbGVzL2xpdmUtZm9sZGVycy5odG1sJywKKyAgICB0aXRsZTogeworICAgICAgZW46ICdMaXZlIEZvbGRlcnMnCisgICAgfSwKKyAgICBkZXNjcmlwdGlvbjogeworICAgICAgZW46ICdMaXZlIEZvbGRlcnMgYWxsb3cgdXNlcnMgdG8gZGlzcGxheSBhbnkgc291cmNlIG9mIGRhdGEgb24gdGhlaXIgaG9tZSBzY3JlZW4gd2l0aG91dCBsYXVuY2hpbmcgYW4gYXBwbGljYXRpb24uIFRoaXMgYXJ0aWNsZSBkaXNjdXNzZXMgaG93IHRvIGV4cG9ydCBhbiBhcHBsaWNhdGlvblwncyBkYXRhIGluIGEgZm9ybWF0IHN1aXRhYmxlIGZvciBkaXNwbGF5IGluc2lkZSBvZiBhIGxpdmUgZm9sZGVyLicKKyAgICB9CisgIH0sCisgIHsKKyAgICB0YWdzOiBbJ2FydGljbGUnLCAndWknLCAnbmV3ZmVhdHVyZSddLAorICAgIHBhdGg6ICdhcnRpY2xlcy9saXZlLXdhbGxwYXBlcnMuaHRtbCcsCisgICAgdGl0bGU6IHsKKyAgICAgIGVuOiAnTGl2ZSBXYWxscGFwZXJzJworICAgIH0sCisgICAgZGVzY3JpcHRpb246IHsKKyAgICAgIGVuOiAnTGl2ZSB3YWxscGFwZXJzIGFyZSByaWNoZXIsIGFuaW1hdGVkLCBpbnRlcmFjdGl2ZSBiYWNrZ3JvdW5kcyB0aGF0IHVzZXJzIGNhbiBkaXNwbGF5IGluIHRoZWlyIGhvbWUgc2NyZWVucy4gTGVhcm4gaG93IHRvIGNyZWF0ZSBhIGxpdmUgd2FsbHBhcGVyIGFuZCBidW5kbGUgaXQgaW4gYW4gYXBwbGljYXRpb24gdGhhdCB1c2VycyBjYW4gaW5zdGFsbCBvbiB0aGVpciBkZXZpY2VzLicKKyAgICB9CisgIH0sCisgIHsKKyAgICB0YWdzOiBbJ2FydGljbGUnLCAnaW5wdXQnXSwKKyAgICBwYXRoOiAnYXJ0aWNsZXMvb24tc2NyZWVuLWlucHV0cy5odG1sJywKKyAgICB0aXRsZTogeworICAgICAgZW46ICdPbnNjcmVlbiBJbnB1dCBNZXRob2RzJworICAgIH0sCisgICAgZGVzY3JpcHRpb246IHsKKyAgICAgIGVuOiAnVGhlIElucHV0IE1ldGhvZCBGcmFtZXdvcmsgKElNRikgYWxsb3dzIHVzZXJzIHRvIHRha2UgYWR2YW50YWdlIG9mIG9uLXNjcmVlbiBpbnB1dCBtZXRob2RzLCBzdWNoIGFzIHNvZnR3YXJlIGtleWJvYXJkcy4gVGhpcyBhcnRpY2xlIHByb3ZpZGVzIGFuIG92ZXJ2aWV3IG9mIElucHV0IE1ldGhvZCBFZGl0b3JzIChJTUVzKSBhbmQgaG93IGFwcGxpY2F0aW9ucyBpbnRlcmFjdCB3aXRoIHRoZW0uJworICAgIH0KKyAgfSwKKyAgeworICAgIHRhZ3M6IFsnYXJ0aWNsZScsICdwZXJmb3JtYW5jZScsICdiZXN0cHJhY3RpY2UnXSwKKyAgICBwYXRoOiAnYXJ0aWNsZXMvcGFpbmxlc3MtdGhyZWFkaW5nLmh0bWwnLAorICAgIHRpdGxlOiB7CisgICAgICBlbjogJ1BhaW5sZXNzIFRocmVhZGluZycKKyAgICB9LAorICAgIGRlc2NyaXB0aW9uOiB7CisgICAgICBlbjogJ1RoaXMgYXJ0aWNsZSBkaXNjdXNzZXMgdGhlIHRocmVhZGluZyBtb2RlbCB1c2VkIGJ5IEFuZHJvaWQgYXBwbGljYXRpb25zIGFuZCBob3cgYXBwbGljYXRpb25zIGNhbiBlbnN1cmUgYmVzdCBVSSBwZXJmb3JtYW5jZSBieSBzcGF3bmluZyB3b3JrZXIgdGhyZWFkcyB0byBoYW5kbGUgbG9uZy1ydW5uaW5nIG9wZXJhdGlvbnMsIHJhdGhlciB0aGFuIGhhbmRsaW5nIHRoZW0gaW4gdGhlIG1haW4gdGhyZWFkLiBUaGUgYXJ0aWNsZSBhbHNvIGV4cGxhaW5zIHRoZSBBUEkgdGhhdCB5b3VyIGFwcGxpY2F0aW9uIGNhbiB1c2UgdG8gaW50ZXJhY3Qgd2l0aCBBbmRyb2lkIFVJIHRvb2xraXQgY29tcG9uZW50cyBydW5uaW5nIG9uIHRoZSBtYWluIHRocmVhZCBhbmQgc3Bhd24gbWFuYWdlZCB3b3JrZXIgdGhyZWFkcy4nCisgICAgfQorICB9LAorICB7CisgICAgdGFnczogWydhcnRpY2xlJywgJ3VpJywgJ3NlYXJjaCddLAorICAgIHBhdGg6ICdhcnRpY2xlcy9xc2IuaHRtbCcsCisgICAgdGl0bGU6IHsKKyAgICAgIGVuOiAnUXVpY2sgU2VhcmNoIEJveCcKKyAgICB9LAorICAgIGRlc2NyaXB0aW9uOiB7CisgICAgICBlbjogJ1F1aWNrIFNlYXJjaCBCb3ggKFFTQikgaXMgYSBwb3dlcmZ1bCwgc3lzdGVtLXdpZGUgc2VhcmNoIGZyYW1ld29yay4gUVNCIG1ha2VzIGl0IHBvc3NpYmxlIGZvciB1c2VycyB0byBxdWlja2x5IGFuZCBlYXNpbHkgZmluZCB3aGF0IHRoZXlcJ3JlIGxvb2tpbmcgZm9yLCBib3RoIG9uIHRoZWlyIGRldmljZXMgYW5kIG9uIHRoZSB3ZWIuIFRoaXMgYXJ0aWNsZSBkaXNjdXNzZXMgaG93IHRvIHdvcmsgd2l0aCB0aGUgUVNCIGZyYW1ld29yayB0byBhZGQgbmV3IHNlYXJjaCByZXN1bHRzIGZvciBhbiBpbnN0YWxsZWQgYXBwbGljYXRpb24uJworICAgIH0KKyAgfSwKKyAgeworICAgIHRhZ3M6IFsnYXJ0aWNsZScsICd1aSddLAorICAgIHBhdGg6ICdhcnRpY2xlcy90b3VjaC1tb2RlLmh0bWwnLAorICAgIHRpdGxlOiB7CisgICAgICBlbjogJ1RvdWNoIE1vZGUnCisgICAgfSwKKyAgICBkZXNjcmlwdGlvbjogeworICAgICAgZW46ICdUaGlzIGFydGljbGUgZXhwbGFpbnMgdGhlIHRvdWNoIG1vZGUsIG9uZSBvZiB0aGUgbW9zdCBpbXBvcnRhbnQgcHJpbmNpcGxlcyBvZiBBbmRyb2lkXCdzIFVJIHRvb2xraXQuIFdoZW5ldmVyIGEgdXNlciBpbnRlcmFjdHMgd2l0aCBhIGRldmljZVwncyB0b3VjaCBzY3JlZW4sIHRoZSBzeXN0ZW0gZW50ZXJzIHRvdWNoIG1vZGUuIFdoaWxlIHNpbXBsZSBpbiBjb25jZXB0LCB0aGVyZSBhcmUgaW1wb3J0YW50IGltcGxpY2F0aW9ucyB0b3VjaCBtb2RlIHRoYXQgYXJlIG9mdGVuIG92ZXJsb29rZWQuJworICAgIH0KKyAgfSwKKyAgeworICAgIHRhZ3M6IFsnYXJ0aWNsZScsICdwZXJmb3JtYW5jZScsICdiZXN0cHJhY3RpY2UnXSwKKyAgICBwYXRoOiAnYXJ0aWNsZXMvdHJhY2stbWVtLmh0bWwnLAorICAgIHRpdGxlOiB7CisgICAgICBlbjogJ1RyYWNraW5nIE1lbW9yeSBBbGxvY2F0aW9ucycKKyAgICB9LAorICAgIGRlc2NyaXB0aW9uOiB7CisgICAgICBlbjogJ1RoaXMgYXJ0aWNsZSBkaXNjdXNzZXMgaG93IHRvIHVzZSB0aGUgQWxsb2NhdGlvbiBUcmFja2VyIHRvb2wgdG8gb2JzZXJ2ZSBtZW1vcnkgYWxsb2NhdGlvbnMgYW5kIGF2b2lkIHBlcmZvcm1hbmNlIHByb2JsZW1zIHRoYXQgd291bGQgb3RoZXJ3aXNlIGJlIGNhdXNlZCBieSBpZ25vcmluZyB0aGUgZWZmZWN0IG9mIERhbHZpa1wncyBnYXJiYWdlIGNvbGxlY3Rvci4nCisgICAgfQorICB9LAorICB7CisgICAgdGFnczogWydhcnRpY2xlJywgJ25ld2ZlYXR1cmUnXSwKKyAgICBwYXRoOiAnYXJ0aWNsZXMvdWktMS41Lmh0bWwnLAorICAgIHRpdGxlOiB7CisgICAgICBlbjogJ1VJIEZyYW1ld29yayBDaGFuZ2VzIGluIEFuZHJvaWQgMS41JworICAgIH0sCisgICAgZGVzY3JpcHRpb246IHsKKyAgICAgIGVuOiAnRXhwbG9yZSB0aGUgVUkgY2hhbmdlcyB0aGF0IHdlcmUgaW50cm9kdWNlZCBpbiBBbmRyb2lkIDEuNSwgY29tcGFyZWQgd2l0aCB0aGUgVUkgcHJvdmlkZWQgaW4gQW5kcm9pZCAxLjAgYW5kIDEuMS4nCisgICAgfQorICB9LAorICB7CisgICAgdGFnczogWydhcnRpY2xlJywgJ25ld2ZlYXR1cmUnXSwKKyAgICBwYXRoOiAnYXJ0aWNsZXMvdWktMS42Lmh0bWwnLAorICAgIHRpdGxlOiB7CisgICAgICBlbjogJ1VJIEZyYW1ld29yayBDaGFuZ2VzIGluIEFuZHJvaWQgMS42JworICAgIH0sCisgICAgZGVzY3JpcHRpb246IHsKKyAgICAgIGVuOiAnRXhwbG9yZSB0aGUgVUkgY2hhbmdlcyB0aGF0IHdlcmUgaW50cm9kdWNlZCBpbiBBbmRyb2lkIDEuNiwgY29tcGFyZWQgd2l0aCB0aGUgVUkgcHJvdmlkZWQgaW4gQW5kcm9pZCAxLjUuIEluIHBhcnRpY3VsYXIsIHRoaXMgYXJ0aWNsZSBkaXNjdXNzZXMgY2hhbmdlcyB0byBSZWxhdGl2ZUxheW91dHMgYW5kIGNsaWNrIGxpc3RlbmVycy4nCisgICAgfQorICB9LAorICB7CisgICAgdGFnczogWydhcnRpY2xlJywgJ3VpJywgJ2Jlc3RwcmFjdGljZSddLAorICAgIHBhdGg6ICdhcnRpY2xlcy90aW1lZC11aS11cGRhdGVzLmh0bWwnLAorICAgIHRpdGxlOiB7CisgICAgICBlbjogJ1VwZGF0aW5nIHRoZSBVSSBmcm9tIGEgVGltZXInCisgICAgfSwKKyAgICBkZXNjcmlwdGlvbjogeworICAgICAgZW46ICdMZWFybiBhYm91dCBob3cgdG8gdXNlIEhhbmRsZXJzIGFzIGEgbW9yZSBlZmZpY2llbnQgcmVwbGFjZW1lbnQgZm9yIGphdmEudXRpbC5UaW1lciBvbiB0aGUgQW5kcm9pZCBwbGF0Zm9ybS4nCisgICAgfQorICB9LAorICB7CisgICAgdGFnczogWydhcnRpY2xlJywgJ3VpJywgJ2FjY2Vzc2liaWxpdHknXSwKKyAgICBwYXRoOiAnYXJ0aWNsZXMvdHRzLmh0bWwnLAorICAgIHRpdGxlOiB7CisgICAgICBlbjogJ1VzaW5nIFRleHQtdG8tU3BlZWNoJworICAgIH0sCisgICAgZGVzY3JpcHRpb246IHsKKyAgICAgIGVuOiAnVGhlIHRleHQtdG8tc3BlZWNoIEFQSSBsZXRzIHlvdXIgYXBwbGljYXRpb24gInNwZWFrIiB0byB1c2VycywgaW4gYW55IG9mIHNldmVyYWwgbGFuZ3VhZ2VzLiBUaGlzIGFydGljbGUgcHJvdmlkZXMgYW4gb3ZlcnZpZXcgb2YgdGhlIFRUUyBBUEkgYW5kIGhvdyB5b3UgdXNlIHRvIGFkZCBzcGVlY2ggY2FwYWJpbGl0aWVzIHRvIHlvdXIgYXBwbGljYXRpb24uJworICAgIH0KKyAgfSwKKyAgeworICAgIHRhZ3M6IFsnYXJ0aWNsZScsICd1aScsICd3ZWInXSwKKyAgICBwYXRoOiAnYXJ0aWNsZXMvdXNpbmctd2Vidmlld3MuaHRtbCcsCisgICAgdGl0bGU6IHsKKyAgICAgIGVuOiAnVXNpbmcgV2ViVmlld3MnCisgICAgfSwKKyAgICBkZXNjcmlwdGlvbjogeworICAgICAgZW46ICdXZWJWaWV3cyBhbGxvdyBhbiBhcHBsaWNhdGlvbiB0byBkeW5hbWljYWxseSBkaXNwbGF5IEhUTUwgYW5kIGV4ZWN1dGUgSmF2YVNjcmlwdCwgd2l0aG91dCByZWxpbnF1aXNoaW5nIGNvbnRyb2wgdG8gYSBzZXBhcmF0ZSBicm93c2VyIGFwcGxpY2F0aW9uLiBUaGlzIGFydGljbGUgaW50cm9kdWNlcyB0aGUgV2ViVmlldyBjbGFzc2VzIGFuZCBwcm92aWRlcyBhIHNhbXBsZSBhcHBsaWNhdGlvbiB0aGF0IGRlbW9uc3RyYXRlcyBpdHMgdXNlLicKKyAgICB9CisgIH0sCisgIHsKKyAgICB0YWdzOiBbJ2FydGljbGUnLCAndWknXSwKKyAgICBwYXRoOiAnYXJ0aWNsZXMvd2lraW5vdGVzLWxpbmtpZnkuaHRtbCcsCisgICAgdGl0bGU6IHsKKyAgICAgIGVuOiAnV2lraU5vdGVzOiBMaW5raWZ5IHlvdXIgVGV4dCEnCisgICAgfSwKKyAgICBkZXNjcmlwdGlvbjogeworICAgICAgZW46ICdUaGlzIGFydGljbGUgaW50cm9kdWNlcyBXaWtpTm90ZXMgZm9yIEFuZHJvaWQsIHBhcnQgb2YgdGhlIEFwcHMgZm9yIEFuZHJvaWQgcHJvamVjdC4gSXQgY292ZXJzIHRoZSB1c2Ugb2YgTGlua2lmeSB0byB0dXJuIG9yZGluYXJ5IHRleHQgdmlld3MgaW50byByaWNoZXIsIGxpbmstb3JpZW50ZWQgY29udGVudCB0aGF0IGNhdXNlcyBBbmRyb2lkIGludGVudHMgdG8gZmlyZSB3aGVuIGEgbGluayBpcyBzZWxlY3RlZC4nCisgICAgfQorICB9LAorICB7CisgICAgdGFnczogWydhcnRpY2xlJywgJ2ludGVudCddLAorICAgIHBhdGg6ICdhcnRpY2xlcy93aWtpbm90ZXMtaW50ZW50cy5odG1sJywKKyAgICB0aXRsZTogeworICAgICAgZW46ICdXaWtpTm90ZXM6IFJvdXRpbmcgSW50ZW50cycKKyAgICB9LAorICAgIGRlc2NyaXB0aW9uOiB7CisgICAgICBlbjogJ1RoaXMgYXJ0aWNsZSBpbGx1c3RyYXRlcyBob3cgYW4gYXBwbGljYXRpb24sIGluIHRoaXMgY2FzZSB0aGUgV2lraU5vdGVzIHNhbXBsZSBhcHAsIGNhbiB1c2UgaW50ZW50cyB0byByb3V0ZSB2YXJpb3VzIHR5cGVzIG9mIGxpbmtlZCB0ZXh0IHRvIHRoZSBhcHBsaWNhdGlvbiB0aGF0IGhhbmRsZXMgdGhhdCB0eXBlIG9mIGRhdGEuIEZvciBleGFtcGxlLCBhbiBhcHAgY2FuIHVzZSBpbnRlbnRzIHRvIHJvdXRlIGEgbGlua2VkIHRlbGVwaG9uZSBudW1iZXIgdG8gYSBkaWFsZXIgYXBwIGFuZCBhIHdlYiBVUkwgdG8gYSBicm93c2VyLicKKyAgICB9CisgIH0sCisgIHsKKyAgICB0YWdzOiBbJ2FydGljbGUnLCAndWknLCAncGVyZm9ybWFuY2UnXSwKKyAgICBwYXRoOiAnYXJ0aWNsZXMvd2luZG93LWJnLXNwZWVkLmh0bWwnLAorICAgIHRpdGxlOiB7CisgICAgICBlbjogJ1dpbmRvdyBCYWNrZ3JvdW5kcyAmIFVJIFNwZWVkJworICAgIH0sCisgICAgZGVzY3JpcHRpb246IHsKKyAgICAgIGVuOiAnU29tZSBBbmRyb2lkIGFwcGxpY2F0aW9ucyBuZWVkIHRvIHNxdWVlemUgZXZlcnkgYml0IG9mIHBlcmZvcm1hbmNlIG91dCBvZiB0aGUgVUkgdG9vbGtpdCBhbmQgdGhlcmUgYXJlIG1hbnkgd2F5cyB0byBkbyBzby4gSW4gdGhpcyBhcnRpY2xlLCB5b3Ugd2lsbCBkaXNjb3ZlciBob3cgdG8gc3BlZWQgdXAgdGhlIGRyYXdpbmcgYW5kIHRoZSBwZXJjZWl2ZWQgc3RhcnR1cCB0aW1lIG9mIHlvdXIgYWN0aXZpdGllcy4gQm90aCBvZiB0aGVzZSB0ZWNobmlxdWVzIHJlbHkgb24gYSBzaW5nbGUgZmVhdHVyZSwgdGhlIHdpbmRvd1wncyBiYWNrZ3JvdW5kIGRyYXdhYmxlLicKKyAgICB9CisgIH0sCisgIHsKKyAgICB0YWdzOiBbJ2FydGljbGUnLCAncGVyZm9ybWFuY2UnLCAnYmVzdHByYWN0aWNlJ10sCisgICAgcGF0aDogJ2FydGljbGVzL3ppcGFsaWduLmh0bWwnLAorICAgIHRpdGxlOiB7CisgICAgICBlbjogJ1ppcGFsaWduOiBhbiBFYXN5IE9wdGltaXphdGlvbicKKyAgICB9LAorICAgIGRlc2NyaXB0aW9uOiB7CisgICAgICBlbjogJ1RoZSBBbmRyb2lkIFNESyBpbmNsdWRlcyBhIHRvb2wgY2FsbGVkIHppcGFsaWduIHRoYXQgb3B0aW1pemVzIHRoZSB3YXkgYW4gYXBwbGljYXRpb24gaXMgcGFja2FnZWQuIFJ1bm5pbmcgemlwYWxpZ24gYWdhaW5zdCB5b3VyIGFwcGxpY2F0aW9uIGVuYWJsZXMgQW5kcm9pZCB0byBpbnRlcmFjdCB3aXRoIGl0IG1vcmUgZWZmaWNpZW50bHkgYXQgcnVuIHRpbWUgYW5kIHRodXMgaGFzIHRoZSBwb3RlbnRpYWwgdG8gbWFrZSBpdCBhbmQgdGhlIG92ZXJhbGwgc3lzdGVtIHJ1biBmYXN0ZXIuIFRoaXMgYXJ0aWNsZSBwcm92aWRlcyBhIGhpZ2gtbGV2ZWwgb3ZlcnZpZXcgb2YgdGhlIHppcGFsaWduIHRvb2wgYW5kIGl0cyB1c2UuJworICAgIH0KKyAgfSwKKworLy8vLy8vLy8vLy8vLy8vLy8vLworLy8vIFNBTVBMRSBDT0RFIC8vLworLy8vLy8vLy8vLy8vLy8vLy8vLworCisgIHsKKyAgICB0YWdzOiBbJ3NhbXBsZScsICdsYXlvdXQnLCAndWknXSwKKyAgICBwYXRoOiAnc2FtcGxlcy9BcGlEZW1vcy9pbmRleC5odG1sJywKKyAgICB0aXRsZTogeworICAgICAgZW46ICdBUEkgRGVtb3MnCisgICAgfSwKKyAgICBkZXNjcmlwdGlvbjogeworICAgICAgZW46ICdBIHZhcmlldHkgb2Ygc21hbGwgYXBwbGljYXRpb25zIHRoYXQgZGVtb25zdHJhdGUgYW4gZXh0ZW5zaXZlIGNvbGxlY3Rpb24gb2YgZnJhbWV3b3JrIHRvcGljcy4nCisgICAgfQorICB9LAorICB7CisgICAgdGFnczogWydzYW1wbGUnLCAnZGF0YScsICduZXdmZWF0dXJlJywgJ2FjY291bnRzeW5jJywgJ25ldyddLAorICAgIHBhdGg6ICdzYW1wbGVzL0JhY2t1cFJlc3RvcmUvaW5kZXguaHRtbCcsCisgICAgdGl0bGU6IHsKKyAgICAgIGVuOiAnQmFja3VwIGFuZCBSZXN0b3JlJworICAgIH0sCisgICAgZGVzY3JpcHRpb246IHsKKyAgICAgIGVuOiAnSWxsdXN0cmF0ZXMgYSBmZXcgZGlmZmVyZW50IGFwcHJvYWNoZXMgdGhhdCBhbiBhcHBsaWNhdGlvbiBkZXZlbG9wZXIgY2FuIHRha2Ugd2hlbiBpbnRlZ3JhdGluZyB3aXRoIHRoZSBBbmRyb2lkIEJhY2t1cCBNYW5hZ2VyIHVzaW5nIHRoZSBCYWNrdXBBZ2VudCBBUEkgaW50cm9kdWNlZCBpbiBBbmRyb2lkIDIuMi4nCisgICAgfQorICB9LAorICB7CisgICAgdGFnczogWydzYW1wbGUnLCAnY29tbXVuaWNhdGlvbiddLAorICAgIHBhdGg6ICdzYW1wbGVzL0JsdWV0b290aENoYXQvaW5kZXguaHRtbCcsCisgICAgdGl0bGU6IHsKKyAgICAgIGVuOiAnQmx1ZXRvb3RoIENoYXQnCisgICAgfSwKKyAgICBkZXNjcmlwdGlvbjogeworICAgICAgZW46ICdBbiBhcHBsaWNhdGlvbiBmb3IgdHdvLXdheSB0ZXh0IG1lc3NhZ2luZyBvdmVyIEJsdWV0b290aC4nCisgICAgfQorICB9LAorICB7CisgICAgdGFnczogWydzYW1wbGUnLCAnYWNjb3VudHN5bmMnXSwKKyAgICBwYXRoOiAnc2FtcGxlcy9CdXNpbmVzc0NhcmQvaW5kZXguaHRtbCcsCisgICAgdGl0bGU6IHsKKyAgICAgIGVuOiAnQnVzaW5lc3NDYXJkJworICAgIH0sCisgICAgZGVzY3JpcHRpb246IHsKKyAgICAgIGVuOiAnQW4gYXBwbGljYXRpb24gdGhhdCBkZW1vbnN0cmF0ZXMgaG93IHRvIGxhdW5jaCB0aGUgYnVpbHQtaW4gY29udGFjdCBwaWNrZXIgZnJvbSB3aXRoaW4gYW4gYWN0aXZpdHkuIFRoaXMgc2FtcGxlIGFsc28gdXNlcyByZWZsZWN0aW9uIHRvIGVuc3VyZSB0aGF0IHRoZSBjb3JyZWN0IHZlcnNpb24gb2YgdGhlIGNvbnRhY3RzIEFQSSBpcyB1c2VkLCBkZXBlbmRpbmcgb24gd2hpY2ggQVBJIGxldmVsIHRoZSBhcHBsaWNhdGlvbiBpcyBydW5uaW5nIHVuZGVyLicKKyAgICB9CisgIH0sCisgIHsKKyAgICB0YWdzOiBbJ3NhbXBsZScsICdhY2NvdW50c3luYyddLAorICAgIHBhdGg6ICdzYW1wbGVzL0NvbnRhY3RNYW5hZ2VyL2luZGV4Lmh0bWwnLAorICAgIHRpdGxlOiB7CisgICAgICBlbjogJ0NvbnRhY3QgTWFuYWdlcicKKyAgICB9LAorICAgIGRlc2NyaXB0aW9uOiB7CisgICAgICBlbjogJ0FuIGFwcGxpY2F0aW9uIHRoYXQgZGVtb25zdHJhdGVzIGhvdyB0byBxdWVyeSB0aGUgc3lzdGVtIGNvbnRhY3RzIHByb3ZpZGVyICB1c2luZyB0aGUgPGNvZGU+Q29udGFjdHNDb250cmFjdDwvY29kZT4gQVBJLCBhcyB3ZWxsIGFzIGluc2VydCBjb250YWN0cyBpbnRvIGEgc3BlY2lmaWMgYWNjb3VudC4nCisgICAgfQorICB9LAorICB7CisgICAgdGFnczogWydzYW1wbGUnXSwKKyAgICBwYXRoOiAnc2FtcGxlcy9Ib21lL2luZGV4Lmh0bWwnLAorICAgIHRpdGxlOiB7CisgICAgICBlbjogJ0hvbWUnCisgICAgfSwKKyAgICBkZXNjcmlwdGlvbjogeworICAgICAgZW46ICdBIGhvbWUgc2NyZWVuIHJlcGxhY2VtZW50IGFwcGxpY2F0aW9uLicKKyAgICB9CisgIH0sCisgIHsKKyAgICB0YWdzOiBbJ3NhbXBsZScsICdnYW1lZGV2JywgJ21lZGlhJ10sCisgICAgcGF0aDogJ3NhbXBsZXMvSmV0Qm95L2luZGV4Lmh0bWwnLAorICAgIHRpdGxlOiB7CisgICAgICBlbjogJ0pldEJveScKKyAgICB9LAorICAgIGRlc2NyaXB0aW9uOiB7CisgICAgICBlbjogJ0EgZ2FtZSB0aGF0IGRlbW9uc3RyYXRlcyB0aGUgU09OaVZPWCBKRVQgaW50ZXJhY3RpdmUgbXVzaWMgdGVjaG5vbG9neSwgd2l0aCA8Y29kZT48YSBocmVmPSIvcmVmZXJlbmNlL2FuZHJvaWQvbWVkaWEvSmV0UGxheWVyLmh0bWwiPkpldFBsYXllcjwvYT48L2NvZGU+LicKKyAgICB9CisgIH0sCisgIHsKKyAgICB0YWdzOiBbJ3NhbXBsZScsICd1aScsICduZXdmZWF0dXJlJ10sCisgICAgcGF0aDogJ3NhbXBsZXMvQ3ViZUxpdmVXYWxscGFwZXIvaW5kZXguaHRtbCcsCisgICAgdGl0bGU6IHsKKyAgICAgIGVuOiAnTGl2ZSBXYWxscGFwZXInCisgICAgfSwKKyAgICBkZXNjcmlwdGlvbjogeworICAgICAgZW46ICdBbiBhcHBsaWNhdGlvbiB0aGF0IGRlbW9uc3RyYXRlcyBob3cgdG8gY3JlYXRlIGEgbGl2ZSB3YWxscGFwZXIgYW5kICBidW5kbGUgaXQgaW4gYW4gYXBwbGljYXRpb24gdGhhdCB1c2VycyBjYW4gaW5zdGFsbCBvbiB0aGVpciBkZXZpY2VzLicKKyAgICB9CisgIH0sCisgIHsKKyAgICB0YWdzOiBbJ3NhbXBsZScsICdnYW1lZGV2JywgJ21lZGlhJ10sCisgICAgcGF0aDogJ3NhbXBsZXMvTHVuYXJMYW5kZXIvaW5kZXguaHRtbCcsCisgICAgdGl0bGU6IHsKKyAgICAgIGVuOiAnTHVuYXIgTGFuZGVyJworICAgIH0sCisgICAgZGVzY3JpcHRpb246IHsKKyAgICAgIGVuOiAnQSBjbGFzc2ljIEx1bmFyIExhbmRlciBnYW1lLicKKyAgICB9CisgIH0sCisgIHsKKyAgICB0YWdzOiBbJ3NhbXBsZScsICd1aScsICdiZXN0cHJhY3RpY2UnLCAnbGF5b3V0J10sCisgICAgcGF0aDogJ3NhbXBsZXMvTXVsdGlSZXNvbHV0aW9uL2luZGV4Lmh0bWwnLAorICAgIHRpdGxlOiB7CisgICAgICBlbjogJ011bHRpcGxlIFJlc29sdXRpb25zJworICAgIH0sCisgICAgZGVzY3JpcHRpb246IHsKKyAgICAgIGVuOiAnQSBzYW1wbGUgYXBwbGljYXRpb24gdGhhdCBzaG93cyBob3cgdG8gdXNlIHJlc291cmNlIGRpcmVjdG9yeSBxdWFsaWZpZXJzIHRvIHByb3ZpZGUgZGlmZmVyZW50IHJlc291cmNlcyBmb3IgZGlmZmVyZW50IHNjcmVlbiBjb25maWd1cmF0aW9ucy4nCisgICAgfQorICB9LAorICB7CisgICAgdGFnczogWydzYW1wbGUnLCAnZGF0YSddLAorICAgIHBhdGg6ICdzYW1wbGVzL05vdGVQYWQvaW5kZXguaHRtbCcsCisgICAgdGl0bGU6IHsKKyAgICAgIGVuOiAnTm90ZSBQYWQnCisgICAgfSwKKyAgICBkZXNjcmlwdGlvbjogeworICAgICAgZW46ICdBbiBhcHBsaWNhdGlvbiBmb3Igc2F2aW5nIG5vdGVzLiBTaW1pbGFyIChidXQgbm90IGlkZW50aWNhbCkgdG8gdGhlIDxhIGhyZWY9Ii9yZXNvdXJjZXMvdHV0b3JpYWxzL25vdGVwYWQvaW5kZXguaHRtbCI+Tm90ZXBhZCB0dXRvcmlhbDwvYT4uJworICAgIH0KKyAgfSwKKyAgeworICAgIHRhZ3M6IFsnc2FtcGxlJywgJ2FjY291bnRzeW5jJ10sCisgICAgcGF0aDogJ3NhbXBsZXMvU2FtcGxlU3luY0FkYXB0ZXIvaW5kZXguaHRtbCcsCisgICAgdGl0bGU6IHsKKyAgICAgIGVuOiAnU2FtcGxlU3luY0FkYXB0ZXInCisgICAgfSwKKyAgICBkZXNjcmlwdGlvbjogeworICAgICAgZW46ICdEZW1vbnN0cmF0ZXMgaG93IGFuIGFwcGxpY2F0aW9uIGNhbiBjb21tdW5pY2F0ZSB3aXRoIGEgY2xvdWQtYmFzZWQgc2VydmljZSBhbmQgc3luY2hyb25pemUgaXRzIGRhdGEgd2l0aCBkYXRhIHN0b3JlZCBsb2NhbGx5IGluIGEgY29udGVudCBwcm92aWRlci4gVGhlIHNhbXBsZSB1c2VzIHR3byByZWxhdGVkIHBhcnRzIG9mIHRoZSBBbmRyb2lkIGZyYW1ld29yayAmbWRhc2g7IHRoZSBhY2NvdW50IG1hbmFnZXIgYW5kIHRoZSBzeW5jaHJvbml6YXRpb24gbWFuYWdlciAodGhyb3VnaCBhIHN5bmMgYWRhcHRlcikuJworICAgIH0KKyAgfSwKKyAgeworICAgIHRhZ3M6IFsnc2FtcGxlJywgJ3VpJywgJ3NlYXJjaCcsICduZXcnXSwKKyAgICBwYXRoOiAnc2FtcGxlcy9TZWFyY2hhYmxlRGljdGlvbmFyeS9pbmRleC5odG1sJywKKyAgICB0aXRsZTogeworICAgICAgZW46ICdTZWFyY2hhYmxlIERpY3Rpb25hcnkgdjInCisgICAgfSwKKyAgICBkZXNjcmlwdGlvbjogeworICAgICAgZW46ICdBIHNhbXBsZSBhcHBsaWNhdGlvbiB0aGF0IGRlbW9uc3RyYXRlcyBBbmRyb2lkXCdzIHNlYXJjaCBmcmFtZXdvcmssIGluY2x1ZGluZyBob3cgdG8gcHJvdmlkZSBzZWFyY2ggc3VnZ2VzdGlvbnMgZm9yIFF1aWNrIFNlYXJjaCBCb3guJworICAgIH0KKyAgfSwKKyAgeworICAgIHRhZ3M6IFsnc2FtcGxlJywgJ2xheW91dCcsICd1aSddLAorICAgIHBhdGg6ICdzYW1wbGVzL1NuYWtlL2luZGV4Lmh0bWwnLAorICAgIHRpdGxlOiB7CisgICAgICBlbjogJ1NuYWtlJworICAgIH0sCisgICAgZGVzY3JpcHRpb246IHsKKyAgICAgIGVuOiAnQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIGNsYXNzaWMgZ2FtZSAiU25ha2UuIicKKyAgICB9CisgIH0sCisgIHsKKyAgICB0YWdzOiBbJ3NhbXBsZScsICd0ZXN0aW5nJywgJ25ldyddLAorICAgIHBhdGg6ICdzYW1wbGVzL1NwaW5uZXIvaW5kZXguaHRtbCcsCisgICAgdGl0bGU6IHsKKyAgICAgIGVuOiAnU3Bpbm5lcicKKyAgICB9LAorICAgIGRlc2NyaXB0aW9uOiB7CisgICAgICBlbjogJ0Egc2ltcGxlIGFwcGxpY2F0aW9uIHRoYXQgc2VydmVzIGFzIGFuIGFwcGxpY2F0aW9uIHVuZGVyIHRlc3QgZm9yIHRoZSBTcGlubmVyVGVzdCBleGFtcGxlLicKKyAgICB9CisgIH0sCisgIHsKKyAgICB0YWdzOiBbJ3NhbXBsZScsICd0ZXN0aW5nJywgJ25ldyddLAorICAgIHBhdGg6ICdzYW1wbGVzL1NwaW5uZXJUZXN0L2luZGV4Lmh0bWwnLAorICAgIHRpdGxlOiB7CisgICAgICBlbjogJ1NwaW5uZXJUZXN0JworICAgIH0sCisgICAgZGVzY3JpcHRpb246IHsKKyAgICAgIGVuOiAnVGhlIHRlc3QgYXBwbGljYXRpb24gZm9yIHRoZSBBY3Rpdml0eSBUZXN0aW5nIHR1dG9yaWFsLiBJdCB0ZXN0cyB0aGUgU3Bpbm5lciBleGFtcGxlIGFwcGxpY2F0aW9uLicKKyAgICB9CisgIH0sCisgIHsKKyAgICB0YWdzOiBbJ3NhbXBsZScsICduZXdmZWF0dXJlJywgJ25ldyddLAorICAgIHBhdGg6ICdzYW1wbGVzL1RpY1RhY1RvZUxpYi9pbmRleC5odG1sJywKKyAgICB0aXRsZTogeworICAgICAgZW46ICdUaWNUYWNUb2VMaWInCisgICAgfSwKKyAgICBkZXNjcmlwdGlvbjogeworICAgICAgZW46ICdBbiBleGFtcGxlIG9mIGFuIEFuZHJvaWQgbGlicmFyeSBwcm9qZWN0LCBhIHR5cGUgb2YgcHJvamVjdCB0aGF0IGxldHMgeW91IHN0b3JlIGFuZCBtYW5hZ2Ugc2hhcmVkIGNvZGUgYW5kIHJlc291cmNlcyBpbiBvbmUgcGxhY2UsIHRoZW4gbWFrZSB0aGVtIGF2YWlsYWJsZSB0byB5b3VyIG90aGVyIEFuZHJvaWQgYXBwbGljYXRpb25zLicKKyAgICB9CisgIH0sCisgIHsKKyAgICB0YWdzOiBbJ3NhbXBsZScsICduZXdmZWF0dXJlJywgJ25ldyddLAorICAgIHBhdGg6ICdzYW1wbGVzL1RpY1RhY1RvZU1haW4vaW5kZXguaHRtbCcsCisgICAgdGl0bGU6IHsKKyAgICAgIGVuOiAnVGljVGFjVG9lTWFpbicKKyAgICB9LAorICAgIGRlc2NyaXB0aW9uOiB7CisgICAgICBlbjogJ0RlbW9uc3RyYXRlcyBob3cgYW4gYXBwbGljYXRpb24gY2FuIG1ha2UgdXNlIG9mIHNoYXJlZCBjb2RlIGFuZCByZXNvdXJjZXMgc3RvcmVkIGluIGFuIEFuZHJvaWQgbGlicmFyeSBwcm9qZWN0LicKKyAgICB9CisgIH0sCisgIHsKKyAgICB0YWdzOiBbJ3NhbXBsZScsICdpbnB1dCddLAorICAgIHBhdGg6ICdzYW1wbGVzL1NvZnRLZXlib2FyZC9pbmRleC5odG1sJywKKyAgICB0aXRsZTogeworICAgICAgZW46ICdTb2Z0IEtleWJvYXJkJworICAgIH0sCisgICAgZGVzY3JpcHRpb246IHsKKyAgICAgIGVuOiAnQW4gZXhhbXBsZSBvZiB3cml0aW5nIGFuIGlucHV0IG1ldGhvZCBmb3IgYSBzb2Z0d2FyZSBrZXlib2FyZC4nCisgICAgfQorICB9LAorICB7CisgICAgdGFnczogWydzYW1wbGUnLCAndWknXSwKKyAgICBwYXRoOiAnc2FtcGxlcy9XaWt0aW9uYXJ5L2luZGV4Lmh0bWwnLAorICAgIHRpdGxlOiB7CisgICAgICBlbjogJ1dpa3Rpb25hcnknCisgICAgfSwKKyAgICBkZXNjcmlwdGlvbjogeworICAgICAgZW46ICdBbiBleGFtcGxlIG9mIGNyZWF0aW5nIGludGVyYWN0aXZlIHdpZGdldHMgZm9yIGRpc3BsYXkgb24gdGhlIEFuZHJvaWQgaG9tZSBzY3JlZW4uJworICAgIH0KKyAgfSwKKyAgeworICAgIHRhZ3M6IFsnc2FtcGxlJywgJ3VpJ10sCisgICAgcGF0aDogJ3NhbXBsZXMvV2lrdGlvbmFyeVNpbXBsZS9pbmRleC5odG1sJywKKyAgICB0aXRsZTogeworICAgICAgZW46ICdXaWt0aW9uYXJ5IChTaW1wbGlmaWVkKScKKyAgICB9LAorICAgIGRlc2NyaXB0aW9uOiB7CisgICAgICBlbjogJ0Egc2ltcGxlIEFuZHJvaWQgaG9tZSBzY3JlZW4gd2lkZ2V0cyBleGFtcGxlLicKKyAgICB9CisgIH0sCisgIHsKKyAgICB0YWdzOiBbJ3NhbXBsZScsICdsYXlvdXQnLCAnbmV3J10sCisgICAgcGF0aDogJ3NhbXBsZXMvWG1sQWRhcHRlcnMvaW5kZXguaHRtbCcsCisgICAgdGl0bGU6IHsKKyAgICAgIGVuOiAnWE1MIEFkYXB0ZXJzJworICAgIH0sCisgICAgZGVzY3JpcHRpb246IHsKKyAgICAgIGVuOiAnQmluZGluZyBkYXRhIHRvIHZpZXdzIHVzaW5nIFhNTCBBZGFwdGVycyBleGFtcGxlcy4nCisgICAgfQorICB9LAorCisvLy8vLy8vLy8vLy8vLy8vLworLy8vIFRVVE9SSUFMUyAvLy8KKy8vLy8vLy8vLy8vLy8vLy8vCisKKyAgeworICAgIHRhZ3M6IFsndHV0b3JpYWwnXSwKKyAgICBwYXRoOiAndHV0b3JpYWxzL2hlbGxvLXdvcmxkLmh0bWwnLAorICAgIHRpdGxlOiB7CisgICAgICBlbjogJ0hlbGxvIFdvcmxkJworICAgIH0sCisgICAgZGVzY3JpcHRpb246IHsKKyAgICAgIGVuOiAnQmVnaW5uaW5nIGJhc2ljIGFwcGxpY2F0aW9uIGRldmVsb3BtZW50IHdpdGggdGhlIEFuZHJvaWQgU0RLLicKKyAgICB9CisgIH0sCisgIHsKKyAgICB0YWdzOiBbJ3R1dG9yaWFsJywgJ3VpJywgJ2xheW91dCddLAorICAgIHBhdGg6ICd0dXRvcmlhbHMvdmlld3MvaW5kZXguaHRtbCcsCisgICAgdGl0bGU6IHsKKyAgICAgIGVuOiAnSGVsbG8gVmlld3MnCisgICAgfSwKKyAgICBkZXNjcmlwdGlvbjogeworICAgICAgZW46ICdBIHdhbGstdGhyb3VnaCBvZiB0aGUgdmFyaW91cyB0eXBlcyBvZiBsYXlvdXRzIGFuZCB2aWV3cyBhdmFpbGFibGUgaW4gdGhlIEFuZHJvaWQgU0RLLicKKyAgICB9CisgIH0sCisgIHsKKyAgICB0YWdzOiBbJ3R1dG9yaWFsJywgJ3VpJywgJ2Jlc3RwcmFjdGljZSddLAorICAgIHBhdGg6ICd0dXRvcmlhbHMvbG9jYWxpemF0aW9uL2luZGV4Lmh0bWwnLAorICAgIHRpdGxlOiB7CisgICAgICBlbjogJ0hlbGxvIExvY2FsaXphdGlvbicKKyAgICB9LAorICAgIGRlc2NyaXB0aW9uOiB7CisgICAgICBlbjogJ1RoZSBiYXNpY3Mgb2YgbG9jYWxpemluZyB5b3VyIGFwcGxpY2F0aW9ucyBmb3IgbXVsdGlwbGUgbGFuZ3VhZ2VzIGFuZCBsb2NhbGVzLicKKyAgICB9CisgIH0sCisgIHsKKyAgICB0YWdzOiBbJ3R1dG9yaWFsJywgJ2RhdGEnXSwKKyAgICBwYXRoOiAndHV0b3JpYWxzL25vdGVwYWQvaW5kZXguaHRtbCcsCisgICAgdGl0bGU6IHsKKyAgICAgIGVuOiAnTm90ZXBhZCBUdXRvcmlhbCcKKyAgICB9LAorICAgIGRlc2NyaXB0aW9uOiB7CisgICAgICBlbjogJ0EgbXVsdGktcGFydCB0dXRvcmlhbCBkaXNjdXNzaW5nIGludGVybWVkaWF0ZS1sZXZlbCBjb25jZXB0cyBzdWNoIGFzIGRhdGEgYWNjZXNzLicKKyAgICB9CisgIH0sCisgIHsKKyAgICB0YWdzOiBbJ3R1dG9yaWFsJywgJ3Rlc3RpbmcnLCAnbmV3J10sCisgICAgcGF0aDogJ3R1dG9yaWFscy90ZXN0aW5nL2hlbGxvYW5kcm9pZF90ZXN0Lmh0bWwnLAorICAgIHRpdGxlOiB7CisgICAgICBlbjogJ0hlbGxvIFRlc3RpbmcnCisgICAgfSwKKyAgICBkZXNjcmlwdGlvbjogeworICAgICAgZW46ICdBIGJhc2ljIGludHJvZHVjdGlvbiB0byB0aGUgQW5kcm9pZCB0ZXN0aW5nIGZyYW1ld29yay4nCisgICAgfQorICB9LAorICB7CisgICAgdGFnczogWyd0dXRvcmlhbCcsICd0ZXN0aW5nJywgJ25ldyddLAorICAgIHBhdGg6ICd0dXRvcmlhbHMvdGVzdGluZy9hY3Rpdml0eV90ZXN0Lmh0bWwnLAorICAgIHRpdGxlOiB7CisgICAgICBlbjogJ0FjdGl2aXR5IFRlc3RpbmcnCisgICAgfSwKKyAgICBkZXNjcmlwdGlvbjogeworICAgICAgZW46ICdBIG1vcmUgYWR2YW5jZWQgZGVtb25zdHJhdGlvbiBvZiB0aGUgQW5kcm9pZCB0ZXN0aW5nIGZyYW1ld29yayBhbmQgdG9vbHMuJworICAgIH0KKyAgfQorXTsKZGlmZiAtLWdpdCBhL2RvY3MvaHRtbC9yZXNvdXJjZXMvcmVzb3VyY2VzX3RvYy5jcyBiL2RvY3MvaHRtbC9yZXNvdXJjZXMvcmVzb3VyY2VzX3RvYy5jcwppbmRleCA1MjY4OWI2Li5hMTcxMWI1IDEwMDY0NAotLS0gYS9kb2NzL2h0bWwvcmVzb3VyY2VzL3Jlc291cmNlc190b2MuY3MKKysrIGIvZG9jcy9odG1sL3Jlc291cmNlcy9yZXNvdXJjZXNfdG9jLmNzCkBAIC0xLDUgKzEsNTYgQEAKIDx1bD4KICAgPGxpPgorICAgIDxoMj48c3BhbiBjbGFzcz0iZW4iPlRlY2huaWNhbCBSZXNvdXJjZXM8L3NwYW4+CisgICAgPC9oMj4KKyAgICA8dWw+CisgICAgICA8bGkgY2xhc3M9InRvZ2dsZS1saXN0Ij4KKyAgICAgICAgPGRpdj48YSBocmVmPSI8P2NzIHZhcjp0b3Jvb3QgPz5yZXNvdXJjZXMvYnJvd3Nlci5odG1sP3RhZz1zYW1wbGUiPgorICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImVuIj5TYW1wbGUgQ29kZTwvc3Bhbj4KKyAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJkZSIgc3R5bGU9ImRpc3BsYXk6bm9uZSI+QmVpc3BpZWxjb2RlPC9zcGFuPgorICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImVzIiBzdHlsZT0iZGlzcGxheTpub25lIj5Dw7NkaWdvIGRlIGVqZW1wbG88L3NwYW4+CisgICAgICAgICAgICA8c3BhbiBjbGFzcz0iZnIiIHN0eWxlPSJkaXNwbGF5Om5vbmUiPkV4ZW1wbGUgZGUgY29kZTwvc3Bhbj4KKyAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJpdCIgc3R5bGU9ImRpc3BsYXk6bm9uZSI+Q29kaWNlIGRpIGVzZW1waW88L3NwYW4+CisgICAgICAgICAgICA8c3BhbiBjbGFzcz0iamEiIHN0eWxlPSJkaXNwbGF5Om5vbmUiPuOCteODs+ODl+ODqyDjgrPjg7zjg4k8L3NwYW4+CisgICAgICAgICAgICA8c3BhbiBjbGFzcz0iemgtQ04iIHN0eWxlPSJkaXNwbGF5Om5vbmUiPjwvc3Bhbj4KKyAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJ6aC1UVyIgc3R5bGU9ImRpc3BsYXk6bm9uZSI+PC9zcGFuPgorICAgICAgICAgIDwvYT48L2Rpdj4KKyAgICAgICAgPHVsIGlkPSJkZXZkb2MtbmF2LXNhbXBsZS1saXN0Ij4KKyAgICAgICAgICA8bGk+PGEgaHJlZj0iPD9jcyB2YXI6dG9yb290ID8+cmVzb3VyY2VzL3NhbXBsZXMvZ2V0Lmh0bWwiPgorICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJlbiI+R2V0dGluZyB0aGUgU2FtcGxlczwvc3Bhbj4KKyAgICAgICAgICAgICAgPC9hPjwvbGk+CisgICAgICAgIDwvdWw+CisgICAgICA8L2xpPgorICAgICAgPGxpIGNsYXNzPSJ0b2dnbGUtbGlzdCI+CisgICAgICAgIDxkaXY+PGEgaHJlZj0iPD9jcyB2YXI6dG9yb290ID8+cmVzb3VyY2VzL2Jyb3dzZXIuaHRtbD90YWc9YXJ0aWNsZSI+CisgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iZW4iPkFydGljbGVzPC9zcGFuPgorICAgICAgICAgICAgIDwvYT48L2Rpdj4KKyAgICAgICAgPHVsIGlkPSJkZXZkb2MtbmF2LWFydGljbGUtbGlzdCI+CisgICAgICAgIDwvdWw+CisgICAgICA8L2xpPgorICAgICAgPGxpIGNsYXNzPSJ0b2dnbGUtbGlzdCI+CisgICAgICAgIDxkaXY+PGEgaHJlZj0iPD9jcyB2YXI6dG9yb290ID8+cmVzb3VyY2VzL2Jyb3dzZXIuaHRtbD90YWc9dHV0b3JpYWwiPgorICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImVuIj5UdXRvcmlhbHM8L3NwYW4+CisgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iZGUiIHN0eWxlPSJkaXNwbGF5Om5vbmUiPkxlcm5wcm9ncmFtbWU8L3NwYW4+CisgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iZXMiIHN0eWxlPSJkaXNwbGF5Om5vbmUiPlR1dG9yaWFsZXM8L3NwYW4+CisgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iZnIiIHN0eWxlPSJkaXNwbGF5Om5vbmUiPkRpZGFjdGljaWVsczwvc3Bhbj4KKyAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJpdCIgc3R5bGU9ImRpc3BsYXk6bm9uZSI+RXNlcmNpdGF6aW9uaTwvc3Bhbj4KKyAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJqYSIgc3R5bGU9ImRpc3BsYXk6bm9uZSI+44OB44Ol44O844OI44Oq44Ki44OrPC9zcGFuPgorICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9InpoLUNOIiBzdHlsZT0iZGlzcGxheTpub25lIj48L3NwYW4+CisgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iemgtVFciIHN0eWxlPSJkaXNwbGF5Om5vbmUiPjwvc3Bhbj4KKyAgICAgICAgICAgICA8L2E+PC9kaXY+CisgICAgICAgIDx1bCBpZD0iZGV2ZG9jLW5hdi10dXRvcmlhbC1saXN0Ij4KKyAgICAgICAgPC91bD4KKyAgICAgIDwvbGk+CisgICAgICA8bGkgY2xhc3M9InRvZ2dsZS1saXN0Ij4KKyAgICAgICAgPGRpdj48YSBocmVmPSI8P2NzIHZhcjp0b3Jvb3QgPz5yZXNvdXJjZXMvdG9waWNzLmh0bWwiPgorICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImVuIj5Ub3BpY3M8L3NwYW4+CisgICAgICAgICAgICAgPC9hPjwvZGl2PgorICAgICAgICA8dWwgaWQ9ImRldmRvYy1uYXYtdG9waWMtbGlzdCI+CisgICAgICAgIDwvdWw+CisgICAgICA8L2xpPgorICAgIDwvdWw+CisgIDwvbGk+CisgIDxsaT4KICAgICA8aDI+PHNwYW4gY2xhc3M9ImVuIj5Db21tdW5pdHk8L3NwYW4+CiAgICAgICAgICAgICAgICA8c3BhbiBzdHlsZT0iZGlzcGxheTpub25lIiBjbGFzcz0iZGUiPjwvc3Bhbj4KICAgICAgICAgICAgICAgIDxzcGFuIHN0eWxlPSJkaXNwbGF5Om5vbmUiIGNsYXNzPSJlcyI+Q29tdW5pZGFkPC9zcGFuPgpAQCAtMzQsMjQxICs4NSw2IEBACiAgIDwvbGk+PD9jcwogICAvaWYKID8+Ci0KLSAgPGxpPgotICAgIDxoMj48c3BhbiBjbGFzcz0iZW4iPlRlY2huaWNhbCBBcnRpY2xlczwvc3Bhbj4KLSAgICA8L2gyPgotICAgIDx1bD4KLSAgICAgIDxsaSBjbGFzcz0idG9nZ2xlLWxpc3QiPgotICAgICAgICA8ZGl2PjxhIGhyZWY9Ijw/Y3MgdmFyOnRvcm9vdCA/PnJlc291cmNlcy9hcnRpY2xlcy9pbmRleC5odG1sIj4KLSAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJlbiI+TGlzdCBvZiBBcnRpY2xlczwvc3Bhbj4KLSAgICAgICAgICAgICA8L2E+PC9kaXY+Ci0gICAgICAgIDx1bD4KLSAgICAgICAgPGxpPjxhIGhyZWY9Ijw/Y3MgdmFyOnRvcm9vdCA/PnJlc291cmNlcy9hcnRpY2xlcy9hdm9pZGluZy1tZW1vcnktbGVha3MuaHRtbCI+Ci0gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImVuIj5Bdm9pZGluZyBNZW1vcnkgTGVha3M8L3NwYW4+Ci0gICAgICAgICAgICAgICAgPC9hPjwvbGk+Ci0gICAgICAgIDxsaT48YSBocmVmPSI8P2NzIHZhcjp0b3Jvb3QgPz5yZXNvdXJjZXMvYXJ0aWNsZXMvYmFja3dhcmQtY29tcGF0aWJpbGl0eS5odG1sIj4KLSAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iZW4iPkJhY2t3YXJkIENvbXBhdGliaWxpdHk8L3NwYW4+Ci0gICAgICAgICAgICAgICAgPC9hPjwvbGk+Ci0gICAgICAgIDxsaT48YSBocmVmPSI8P2NzIHZhcjp0b3Jvb3QgPz5yZXNvdXJjZXMvYXJ0aWNsZXMvY2FuLWktdXNlLXRoaXMtaW50ZW50Lmh0bWwiPgotICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJlbiI+Q2FuIEkgVXNlIHRoaXMgSW50ZW50Pzwvc3Bhbj4KLSAgICAgICAgICAgICAgICA8L2E+PC9saT4KLSAgICAgICAgPGxpPjxhIGhyZWY9Ijw/Y3MgdmFyOnRvcm9vdCA/PnJlc291cmNlcy9hcnRpY2xlcy9jcmVhdGluZy1pbnB1dC1tZXRob2QuaHRtbCI+Ci0gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImVuIj5DcmVhdGluZyBhbiBJbnB1dCBNZXRob2Q8L3NwYW4+Ci0gICAgICAgICAgICAgICAgPC9hPjwvbGk+Ci0gICAgICAgIDxsaT48YSBocmVmPSI8P2NzIHZhcjp0b3Jvb3QgPz5yZXNvdXJjZXMvYXJ0aWNsZXMvZHJhd2FibGUtbXV0YXRpb25zLmh0bWwiPgotICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJlbiI+RHJhd2FibGUgTXV0YXRpb25zPC9zcGFuPgotICAgICAgICAgICAgICAgIDwvYT48L2xpPgotICAgICAgICA8bGk+PGEgaHJlZj0iPD9jcyB2YXI6dG9yb290ID8+cmVzb3VyY2VzL2FydGljbGVzL2Zhc3Rlci1zY3JlZW4tb3JpZW50YXRpb24tY2hhbmdlLmh0bWwiPgotICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJlbiI+RmFzdGVyIFNjcmVlbiBPcmllbnRhdGlvbiBDaGFuZ2U8L3NwYW4+Ci0gICAgICAgICAgICAgICAgPC9hPjwvbGk+Ci0gICAgICAgIDxsaT48YSBocmVmPSI8P2NzIHZhcjp0b3Jvb3QgPz5yZXNvdXJjZXMvYXJ0aWNsZXMvZnV0dXJlLXByb29maW5nLmh0bWwiPgotICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJlbiI+RnV0dXJlLVByb29maW5nIFlvdXIgQXBwczwvc3Bhbj4KLSAgICAgICAgICAgICAgICA8L2E+PC9saT4KLSAgICAgICAgPGxpPjxhIGhyZWY9Ijw/Y3MgdmFyOnRvcm9vdCA/PnJlc291cmNlcy9hcnRpY2xlcy9nZXN0dXJlcy5odG1sIj4KLSAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iZW4iPkdlc3R1cmVzPC9zcGFuPgotICAgICAgICAgICAgICAgIDwvYT48L2xpPgotICAgICAgICA8bGk+PGEgaHJlZj0iPD9jcyB2YXI6dG9yb290ID8+cmVzb3VyY2VzL2FydGljbGVzL2dsc3VyZmFjZXZpZXcuaHRtbCI+Ci0gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImVuIj5JbnRyb2R1Y2luZyBHTFN1cmZhY2VWaWV3PC9zcGFuPgotICAgICAgICAgICAgICAgIDwvYT48L2xpPgotICAgICAgICA8bGk+PGEgaHJlZj0iPD9jcyB2YXI6dG9yb290ID8+cmVzb3VyY2VzL2FydGljbGVzL2xheW91dC10cmlja3MtcmV1c2UuaHRtbCI+Ci0gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImVuIj5MYXlvdXQgVHJpY2tzOiBSZXVzaW5nIDwvc3Bhbj4KLSAgICAgICAgICAgICAgICA8L2E+PC9saT4KLSAgICAgICAgPGxpPjxhIGhyZWY9Ijw/Y3MgdmFyOnRvcm9vdCA/PnJlc291cmNlcy9hcnRpY2xlcy9sYXlvdXQtdHJpY2tzLWVmZmljaWVuY3kuaHRtbCI+Ci0gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImVuIj5MYXlvdXQgVHJpY2tzOiBFZmZpY2llbmN5PC9zcGFuPgotICAgICAgICAgICAgICAgIDwvYT48L2xpPgotICAgICAgICA8bGk+PGEgaHJlZj0iPD9jcyB2YXI6dG9yb290ID8+cmVzb3VyY2VzL2FydGljbGVzL2xheW91dC10cmlja3Mtc3R1YnMuaHRtbCI+Ci0gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImVuIj5MYXlvdXQgVHJpY2tzOiBWaWV3U3R1YnMgPC9zcGFuPgotICAgICAgICAgICAgICAgIDwvYT48L2xpPgotICAgICAgICA8bGk+PGEgaHJlZj0iPD9jcyB2YXI6dG9yb290ID8+cmVzb3VyY2VzL2FydGljbGVzL2xheW91dC10cmlja3MtbWVyZ2UuaHRtbCI+Ci0gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImVuIj5MYXlvdXQgVHJpY2tzOiBNZXJnaW5nIDwvc3Bhbj4KLSAgICAgICAgICAgICAgICA8L2E+PC9saT4KLSAgICAgICAgPGxpPjxhIGhyZWY9Ijw/Y3MgdmFyOnRvcm9vdCA/PnJlc291cmNlcy9hcnRpY2xlcy9saXN0dmlldy1iYWNrZ3JvdW5kcy5odG1sIj4KLSAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iZW4iPkxpc3RWaWV3IEJhY2tncm91bmRzPC9zcGFuPgotICAgICAgICAgICAgICAgIDwvYT48L2xpPgotICAgICAgICA8bGk+PGEgaHJlZj0iPD9jcyB2YXI6dG9yb290ID8+cmVzb3VyY2VzL2FydGljbGVzL2xpdmUtZm9sZGVycy5odG1sIj4KLSAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iZW4iPkxpdmUgRm9sZGVyczwvc3Bhbj4KLSAgICAgICAgICAgICAgICA8L2E+PC9saT4KLSAgICAgICAgPGxpPjxhIGhyZWY9Ijw/Y3MgdmFyOnRvcm9vdCA/PnJlc291cmNlcy9hcnRpY2xlcy9saXZlLXdhbGxwYXBlcnMuaHRtbCI+Ci0gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImVuIj5MaXZlIFdhbGxwYXBlcnM8L3NwYW4+Ci0gICAgICAgICAgICAgICAgPC9hPjwvbGk+Ci0gICAgICAgIDxsaT48YSBocmVmPSI8P2NzIHZhcjp0b3Jvb3QgPz5yZXNvdXJjZXMvYXJ0aWNsZXMvb24tc2NyZWVuLWlucHV0cy5odG1sIj4KLSAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iZW4iPk9uc2NyZWVuIElucHV0IE1ldGhvZHM8L3NwYW4+Ci0gICAgICAgICAgICAgICAgPC9hPjwvbGk+Ci0gICAgICAgIDxsaT48YSBocmVmPSI8P2NzIHZhcjp0b3Jvb3QgPz5yZXNvdXJjZXMvYXJ0aWNsZXMvcGFpbmxlc3MtdGhyZWFkaW5nLmh0bWwiPgotICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJlbiI+UGFpbmxlc3MgVGhyZWFkaW5nPC9zcGFuPgotICAgICAgICAgICAgICAgIDwvYT48L2xpPgotICAgICAgICA8bGk+PGEgaHJlZj0iPD9jcyB2YXI6dG9yb290ID8+cmVzb3VyY2VzL2FydGljbGVzL3FzYi5odG1sIj4KLSAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iZW4iPlF1aWNrIFNlYXJjaCBCb3g8L3NwYW4+Ci0gICAgICAgICAgICAgICAgPC9hPjwvbGk+Ci0gICAgICAgIDxsaT48YSBocmVmPSI8P2NzIHZhcjp0b3Jvb3QgPz5yZXNvdXJjZXMvYXJ0aWNsZXMvc3BlZWNoLWlucHV0Lmh0bWwiPgotICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJlbiI+U3BlZWNoIElucHV0PC9zcGFuPgotICAgICAgICAgICAgICAgIDwvYT48L2xpPgotICAgICAgICA8bGk+PGEgaHJlZj0iPD9jcyB2YXI6dG9yb290ID8+cmVzb3VyY2VzL2FydGljbGVzL3RvdWNoLW1vZGUuaHRtbCI+Ci0gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImVuIj5Ub3VjaCBNb2RlPC9zcGFuPgotICAgICAgICAgICAgICAgIDwvYT48L2xpPgotICAgICAgICA8bGk+PGEgaHJlZj0iPD9jcyB2YXI6dG9yb290ID8+cmVzb3VyY2VzL2FydGljbGVzL3RyYWNrLW1lbS5odG1sIj4KLSAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iZW4iPlRyYWNraW5nIE1lbW9yeSBBbGxvY2F0aW9uczwvc3Bhbj4KLSAgICAgICAgICAgICAgICA8L2E+PC9saT4KLSAgICAgICAgPGxpPjxhIGhyZWY9Ijw/Y3MgdmFyOnRvcm9vdCA/PnJlc291cmNlcy9hcnRpY2xlcy91aS0xLjUuaHRtbCI+Ci0gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImVuIj5VSSBGcmFtZXdvcmsgQ2hhbmdlcyBpbiBBbmRyb2lkIDEuNTwvc3Bhbj4KLSAgICAgICAgICAgICAgICA8L2E+PC9saT4KLSAgICAgICAgPGxpPjxhIGhyZWY9Ijw/Y3MgdmFyOnRvcm9vdCA/PnJlc291cmNlcy9hcnRpY2xlcy91aS0xLjYuaHRtbCI+Ci0gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImVuIj5VSSBGcmFtZXdvcmsgQ2hhbmdlcyBpbiBBbmRyb2lkIDEuNjwvc3Bhbj4KLSAgICAgICAgICAgICAgICA8L2E+PC9saT4KLSAgICAgICAgPGxpPjxhIGhyZWY9Ijw/Y3MgdmFyOnRvcm9vdCA/PnJlc291cmNlcy9hcnRpY2xlcy90aW1lZC11aS11cGRhdGVzLmh0bWwiPgotICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJlbiI+VXBkYXRpbmcgdGhlIFVJIGZyb20gYSBUaW1lcjwvc3Bhbj4KLSAgICAgICAgICAgICAgICA8L2E+PC9saT4KLSAgICAgICAgPGxpPjxhIGhyZWY9Ijw/Y3MgdmFyOnRvcm9vdCA/PnJlc291cmNlcy9hcnRpY2xlcy90dHMuaHRtbCI+Ci0gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImVuIj5Vc2luZyBUZXh0LXRvLVNwZWVjaDwvc3Bhbj4KLSAgICAgICAgICAgICAgICA8L2E+PC9saT4KLSAgICAgICAgPGxpPjxhIGhyZWY9Ijw/Y3MgdmFyOnRvcm9vdCA/PnJlc291cmNlcy9hcnRpY2xlcy9jb250YWN0cy5odG1sIj4KLSAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iZW4iPlVzaW5nIHRoZSBDb250YWN0cyBBUEk8L3NwYW4+Ci0gICAgICAgICAgICAgICAgPC9hPjwvbGk+Ci0gICAgICAgIDxsaT48YSBocmVmPSI8P2NzIHZhcjp0b3Jvb3QgPz5yZXNvdXJjZXMvYXJ0aWNsZXMvdXNpbmctd2Vidmlld3MuaHRtbCI+Ci0gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImVuIj5Vc2luZyBXZWJWaWV3czwvc3Bhbj4KLSAgICAgICAgICAgICAgICA8L2E+PC9saT4KLSAgICAgICAgPGxpPjxhIGhyZWY9Ijw/Y3MgdmFyOnRvcm9vdCA/PnJlc291cmNlcy9hcnRpY2xlcy93aWtpbm90ZXMtbGlua2lmeS5odG1sIj4KLSAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iZW4iPldpa2lOb3RlczogTGlua2lmeSB5b3VyIFRleHQhPC9zcGFuPgotICAgICAgICAgICAgICAgIDwvYT48L2xpPgotICAgICAgICA8bGk+PGEgaHJlZj0iPD9jcyB2YXI6dG9yb290ID8+cmVzb3VyY2VzL2FydGljbGVzL3dpa2lub3Rlcy1pbnRlbnRzLmh0bWwiPgotICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJlbiI+V2lraU5vdGVzOiBSb3V0aW5nIEludGVudHM8L3NwYW4+Ci0gICAgICAgICAgICAgICAgPC9hPjwvbGk+Ci0gICAgICAgIDxsaT48YSBocmVmPSI8P2NzIHZhcjp0b3Jvb3QgPz5yZXNvdXJjZXMvYXJ0aWNsZXMvd2luZG93LWJnLXNwZWVkLmh0bWwiPgotICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJlbiI+V2luZG93IEJhY2tncm91bmRzICZhbXA7IFVJIFNwZWVkPC9zcGFuPgotICAgICAgICAgICAgICAgIDwvYT48L2xpPgotICAgICAgICA8bGk+PGEgaHJlZj0iPD9jcyB2YXI6dG9yb290ID8+cmVzb3VyY2VzL2FydGljbGVzL3ppcGFsaWduLmh0bWwiPgotICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJlbiI+WmlwYWxpZ246IEFuIEVhc3kgT3B0aW1pemF0aW9uPC9zcGFuPgotICAgICAgICAgICAgICAgIDwvYT48L2xpPgotICAgICAgICA8L3VsPgotICAgICAgPC9saT4KLSAgICA8L3VsPgotICAgPC9saT4KLQotICA8bGk+Ci0gICAgPGgyPjxzcGFuIGNsYXNzPSJlbiI+VHV0b3JpYWxzPC9zcGFuPgotICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImRlIiBzdHlsZT0iZGlzcGxheTpub25lIj5MZXJucHJvZ3JhbW1lPC9zcGFuPgotICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImVzIiBzdHlsZT0iZGlzcGxheTpub25lIj5UdXRvcmlhbGVzPC9zcGFuPgotICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImZyIiBzdHlsZT0iZGlzcGxheTpub25lIj5EaWRhY3RpY2llbHM8L3NwYW4+Ci0gICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iaXQiIHN0eWxlPSJkaXNwbGF5Om5vbmUiPkVzZXJjaXRhemlvbmk8L3NwYW4+Ci0gICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iamEiIHN0eWxlPSJkaXNwbGF5Om5vbmUiPuODgeODpeODvOODiOODquOCouODqzwvc3Bhbj4KLSAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJ6aC1DTiIgc3R5bGU9ImRpc3BsYXk6bm9uZSI+PC9zcGFuPgotICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9InpoLVRXIiBzdHlsZT0iZGlzcGxheTpub25lIj48L3NwYW4+Ci0gICAgPC9oMj4KLSAgICA8dWw+Ci0gICAgICA8bGk+PGEgaHJlZj0iPD9jcyB2YXI6dG9yb290ID8+cmVzb3VyY2VzL3R1dG9yaWFscy9oZWxsby13b3JsZC5odG1sIj4KLSAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJlbiI+SGVsbG8gV29ybGQ8L3NwYW4+Ci0gICAgICAgICAgPC9hPjwvbGk+Ci0gICAgICA8bGk+PGEgaHJlZj0iPD9jcyB2YXI6dG9yb290ID8+cmVzb3VyY2VzL3R1dG9yaWFscy92aWV3cy9pbmRleC5odG1sIj4KLSAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJlbiI+SGVsbG8gVmlld3M8L3NwYW4+Ci0gICAgICAgICAgPC9hPjwvbGk+Ci0gICAgICA8bGk+PGEgaHJlZj0iPD9jcyB2YXI6dG9yb290ID8+cmVzb3VyY2VzL3R1dG9yaWFscy9sb2NhbGl6YXRpb24vaW5kZXguaHRtbCI+Ci0gICAgICAgICAgICA8c3BhbiBjbGFzcz0iZW4iPkhlbGxvIExvY2FsaXphdGlvbjwvc3Bhbj4KLSAgICAgICAgICA8L2E+PC9saT4KLSAgICAgIDxsaT48YSBocmVmPSI8P2NzIHZhcjp0b3Jvb3QgPz5yZXNvdXJjZXMvdHV0b3JpYWxzL3Rlc3RpbmcvaGVsbG9hbmRyb2lkX3Rlc3QuaHRtbCI+Ci0gICAgICAgICAgICA8c3BhbiBjbGFzcz0iZW4iPkhlbGxvIFRlc3Rpbmc8L3NwYW4+PC9hPgotICAgICAgICAgICAgPHNwYW4gY2xhc3M9Im5ldyI+bmV3ITwvc3Bhbj4KLSAgICAgIDwvbGk+Ci0gICAgICA8bGk+PGEgaHJlZj0iPD9jcyB2YXI6dG9yb290ID8+cmVzb3VyY2VzL3R1dG9yaWFscy9ub3RlcGFkL2luZGV4Lmh0bWwiPgotICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImVuIj5Ob3RlcGFkIFR1dG9yaWFsPC9zcGFuPgotICAgICAgICAgIDwvYT48L2xpPgotICAgICAgPGxpPjxhIGhyZWY9Ijw/Y3MgdmFyOnRvcm9vdCA/PnJlc291cmNlcy90dXRvcmlhbHMvdGVzdGluZy9hY3Rpdml0eV90ZXN0Lmh0bWwiPgotICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImVuIj5BY3Rpdml0eSBUZXN0aW5nPC9zcGFuPjwvYT4KLSAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJuZXciPm5ldyE8L3NwYW4+Ci0gICAgICA8L2xpPgotICAgIDwvdWw+Ci0gIDwvbGk+Ci0KLQotICA8bGk+Ci0gICAgPGgyPjxzcGFuIGNsYXNzPSJlbiI+U2FtcGxlIENvZGU8L3NwYW4+Ci0gICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iZGUiIHN0eWxlPSJkaXNwbGF5Om5vbmUiPkJlaXNwaWVsY29kZTwvc3Bhbj4KLSAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJlcyIgc3R5bGU9ImRpc3BsYXk6bm9uZSI+Q8OzZGlnbyBkZSBlamVtcGxvPC9zcGFuPgotICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImZyIiBzdHlsZT0iZGlzcGxheTpub25lIj5FeGVtcGxlIGRlIGNvZGU8L3NwYW4+Ci0gICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iaXQiIHN0eWxlPSJkaXNwbGF5Om5vbmUiPkNvZGljZSBkaSBlc2VtcGlvPC9zcGFuPgotICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImphIiBzdHlsZT0iZGlzcGxheTpub25lIj7jgrXjg7Pjg5fjg6sg44Kz44O844OJPC9zcGFuPgotICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9InpoLUNOIiBzdHlsZT0iZGlzcGxheTpub25lIj48L3NwYW4+Ci0gICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iemgtVFciIHN0eWxlPSJkaXNwbGF5Om5vbmUiPjwvc3Bhbj4KLSAgICA8L2gyPgotICAgIDx1bD4KLSAgICAgIDxsaT48YSBocmVmPSI8P2NzIHZhcjp0b3Jvb3QgPz5yZXNvdXJjZXMvc2FtcGxlcy9nZXQuaHRtbCI+Ci0gICAgICAgICAgICA8c3BhbiBjbGFzcz0iZW4iPkdldHRpbmcgdGhlIFNhbXBsZXM8L3NwYW4+Ci0gICAgICAgICAgPC9hPjwvbGk+Ci0gICAgICA8bGkgY2xhc3M9InRvZ2dsZS1saXN0Ij4KLSAgICAgICAgPGRpdj48YSBocmVmPSI8P2NzIHZhcjp0b3Jvb3QgPz5yZXNvdXJjZXMvc2FtcGxlcy9pbmRleC5odG1sIj4KLSAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJlbiI+TGlzdCBvZiBTYW1wbGVzPC9zcGFuPgotICAgICAgICAgICAgIDwvYT48L2Rpdj4KLSAgICAgICAgPHVsPgotICAgICAgICAgIDxsaT48YSBocmVmPSI8P2NzIHZhcjp0b3Jvb3QgPz5yZXNvdXJjZXMvc2FtcGxlcy9BcGlEZW1vcy9pbmRleC5odG1sIj4KLSAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iZW4iPkFQSSBEZW1vczwvc3Bhbj4KLSAgICAgICAgICAgICAgPC9hPjwvbGk+Ci0gICAgICAgICAgPGxpPjxhIGhyZWY9Ijw/Y3MgdmFyOnRvcm9vdCA/PnJlc291cmNlcy9zYW1wbGVzL0JhY2t1cFJlc3RvcmUvaW5kZXguaHRtbCI+Ci0gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImVuIj5CYWNrdXAgYW5kIFJlc3RvcmU8L3NwYW4+Ci0gICAgICAgICAgICAgIDwvYT4gPHNwYW4gY2xhc3M9Im5ldyI+bmV3ITwvc3Bhbj48L2xpPgotICAgICAgICAgIDxsaT48YSBocmVmPSI8P2NzIHZhcjp0b3Jvb3QgPz5yZXNvdXJjZXMvc2FtcGxlcy9CbHVldG9vdGhDaGF0L2luZGV4Lmh0bWwiPgotICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJlbiI+Qmx1ZXRvb3RoIENoYXQ8L3NwYW4+Ci0gICAgICAgICAgICAgIDwvYT48L2xpPgotICAgICAgICAgIDxsaT48YSBocmVmPSI8P2NzIHZhcjp0b3Jvb3QgPz5yZXNvdXJjZXMvc2FtcGxlcy9CdXNpbmVzc0NhcmQvaW5kZXguaHRtbCI+Ci0gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImVuIj5CdXNpbmVzcyBDYXJkPC9zcGFuPgotICAgICAgICAgICAgICA8L2E+PC9saT4KLSAgICAgICAgICA8bGk+PGEgaHJlZj0iPD9jcyB2YXI6dG9yb290ID8+cmVzb3VyY2VzL3NhbXBsZXMvQ29udGFjdE1hbmFnZXIvaW5kZXguaHRtbCI+Ci0gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImVuIj5Db250YWN0IE1hbmFnZXI8L3NwYW4+Ci0gICAgICAgICAgICAgIDwvYT48L2xpPgotICAgICAgICAgIDxsaT48YSBocmVmPSI8P2NzIHZhcjp0b3Jvb3QgPz5yZXNvdXJjZXMvc2FtcGxlcy9Ib21lL2luZGV4Lmh0bWwiPgotICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJlbiI+SG9tZTwvc3Bhbj4KLSAgICAgICAgICAgICAgPC9hPjwvbGk+Ci0gICAgICAgICAgPGxpPjxhIGhyZWY9Ijw/Y3MgdmFyOnRvcm9vdCA/PnJlc291cmNlcy9zYW1wbGVzL0pldEJveS9pbmRleC5odG1sIj4KLSAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iZW4iPkpldEJveTwvc3Bhbj4KLSAgICAgICAgICAgICAgPC9hPjwvbGk+Ci0gICAgICAgICAgPGxpPjxhIGhyZWY9Ijw/Y3MgdmFyOnRvcm9vdCA/PnJlc291cmNlcy9zYW1wbGVzL0N1YmVMaXZlV2FsbHBhcGVyL2luZGV4Lmh0bWwiPgotICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJlbiI+TGl2ZSBXYWxscGFwZXI8L3NwYW4+Ci0gICAgICAgICAgICAgICAgPC9hPjwvbGk+Ci0gICAgICAgICAgPGxpPjxhIGhyZWY9Ijw/Y3MgdmFyOnRvcm9vdCA/PnJlc291cmNlcy9zYW1wbGVzL0x1bmFyTGFuZGVyL2luZGV4Lmh0bWwiPgotICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJlbiI+THVuYXIgTGFuZGVyPC9zcGFuPgotICAgICAgICAgICAgICA8L2E+PC9saT4KLSAgICAgICAgICA8bGk+PGEgaHJlZj0iPD9jcyB2YXI6dG9yb290ID8+cmVzb3VyY2VzL3NhbXBsZXMvTXVsdGlSZXNvbHV0aW9uL2luZGV4Lmh0bWwiPgotICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJlbiI+TXVsdGlwbGUgUmVzb2x1dGlvbnM8L3NwYW4+Ci0gICAgICAgICAgICAgIDwvYT48L2xpPgotICAgICAgICAgIDxsaT48YSBocmVmPSI8P2NzIHZhcjp0b3Jvb3QgPz5yZXNvdXJjZXMvc2FtcGxlcy9Ob3RlUGFkL2luZGV4Lmh0bWwiPgotICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJlbiI+Tm90ZSBQYWQ8L3NwYW4+Ci0gICAgICAgICAgICAgIDwvYT48L2xpPgotICAgICAgICAgIDxsaT48YSBocmVmPSI8P2NzIHZhcjp0b3Jvb3QgPz5yZXNvdXJjZXMvc2FtcGxlcy9TYW1wbGVTeW5jQWRhcHRlci9pbmRleC5odG1sIj4KLSAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iZW4iPlNhbXBsZSBTeW5jIEFkYXB0ZXI8L3NwYW4+Ci0gICAgICAgICAgICAgIDwvYT48L2xpPgotICAgICAgICAgIDxsaT48YSBocmVmPSI8P2NzIHZhcjp0b3Jvb3QgPz5yZXNvdXJjZXMvc2FtcGxlcy9TZWFyY2hhYmxlRGljdGlvbmFyeS9pbmRleC5odG1sIj4KLSAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iZW4iPlNlYXJjaGFibGUgRGljdGlvbmFyeSB2Mjwvc3Bhbj4KLSAgICAgICAgICAgICAgPC9hPiA8c3BhbiBjbGFzcz0ibmV3Ij5uZXchPC9zcGFuPjwvbGk+Ci0gICAgICAgICAgPGxpPjxhIGhyZWY9Ijw/Y3MgdmFyOnRvcm9vdCA/PnJlc291cmNlcy9zYW1wbGVzL1NuYWtlL2luZGV4Lmh0bWwiPgotICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJlbiI+U25ha2U8L3NwYW4+Ci0gICAgICAgICAgICAgIDwvYT48L2xpPgotICAgICAgICAgIDxsaT48YSBocmVmPSI8P2NzIHZhcjp0b3Jvb3QgPz5yZXNvdXJjZXMvc2FtcGxlcy9Tb2Z0S2V5Ym9hcmQvaW5kZXguaHRtbCI+Ci0gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImVuIj5Tb2Z0IEtleWJvYXJkPC9zcGFuPgotICAgICAgICAgICAgICA8L2E+PC9saT4KLSAgICAgICAgICA8bGk+PGEgaHJlZj0iPD9jcyB2YXI6dG9yb290ID8+cmVzb3VyY2VzL3NhbXBsZXMvU3Bpbm5lci9pbmRleC5odG1sIj4KLSAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iZW4iPlNwaW5uZXI8L3NwYW4+Ci0gICAgICAgICAgICAgICAgPC9hPiA8c3BhbiBjbGFzcz0ibmV3Ij5uZXchPC9zcGFuPjwvbGk+Ci0gICAgICAgICAgPGxpPjxhIGhyZWY9Ijw/Y3MgdmFyOnRvcm9vdCA/PnJlc291cmNlcy9zYW1wbGVzL1NwaW5uZXJUZXN0L2luZGV4Lmh0bWwiPgotICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJlbiI+U3Bpbm5lclRlc3Q8L3NwYW4+Ci0gICAgICAgICAgICAgICAgPC9hPiA8c3BhbiBjbGFzcz0ibmV3Ij5uZXchPC9zcGFuPjwvbGk+Ci0gICAgICAgICAgPGxpPjxhIGhyZWY9Ijw/Y3MgdmFyOnRvcm9vdCA/PnJlc291cmNlcy9zYW1wbGVzL1RpY1RhY1RvZUxpYi9pbmRleC5odG1sIj4KLSAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iZW4iPlRpY1RhY1RvZUxpYjwvc3Bhbj4KLSAgICAgICAgICAgICAgICA8L2E+IDxzcGFuIGNsYXNzPSJuZXciPm5ldyE8L3NwYW4+PC9saT4KLSAgICAgICAgICA8bGk+PGEgaHJlZj0iPD9jcyB2YXI6dG9yb290ID8+cmVzb3VyY2VzL3NhbXBsZXMvVGljVGFjVG9lTWFpbi9pbmRleC5odG1sIj4KLSAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iZW4iPlRpY1RhY1RvZU1haW48L3NwYW4+Ci0gICAgICAgICAgICAgICAgPC9hPiA8c3BhbiBjbGFzcz0ibmV3Ij5uZXchPC9zcGFuPjwvbGk+Ci0gICAgICAgICAgPGxpPjxhIGhyZWY9Ijw/Y3MgdmFyOnRvcm9vdCA/PnJlc291cmNlcy9zYW1wbGVzL1dpa3Rpb25hcnkvaW5kZXguaHRtbCI+Ci0gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImVuIj5XaWt0aW9uYXJ5PC9zcGFuPgotICAgICAgICAgICAgICA8L2E+PC9saT4KLSAgICAgICAgICA8bGk+PGEgaHJlZj0iPD9jcyB2YXI6dG9yb290ID8+cmVzb3VyY2VzL3NhbXBsZXMvV2lrdGlvbmFyeVNpbXBsZS9pbmRleC5odG1sIj4KLSAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iZW4iPldpa3Rpb25hcnkgKFNpbXBsaWZpZWQpPC9zcGFuPgotICAgICAgICAgICAgICA8L2E+PC9saT4KLSAgICAgICAgPC91bD4KLSAgICAgIDwvbGk+Ci0gICAgPC91bD4KLSAgPC9saT4KLQotCi0KICAgPGxpPgogICAgIDxoMj48c3BhbiBjbGFzcz0iZW4iPk1vcmU8L3NwYW4+CiAgICAgPC9oMj4KQEAgLTI5Nyw4ICsxMTMsNiBAQAogICAgICA8L2xpPgogICAgIDwvdWw+CiAgIDwvbGk+Ci0KLQogPC91bD4KIAogPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgpkaWZmIC0tZ2l0IGEvZG9jcy9odG1sL3Jlc291cmNlcy9zYW1wbGVzL2ltYWdlcy9YbWxQaG90b3NBZGFwdGVyLnBuZyBiL2RvY3MvaHRtbC9yZXNvdXJjZXMvc2FtcGxlcy9pbWFnZXMvWG1sUGhvdG9zQWRhcHRlci5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzAxOGQ1NAotLS0gL2Rldi9udWxsCisrKyBiL2RvY3MvaHRtbC9yZXNvdXJjZXMvc2FtcGxlcy9pbWFnZXMvWG1sUGhvdG9zQWRhcHRlci5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9odG1sL3Jlc291cmNlcy9zYW1wbGVzL2ltYWdlcy9YbWxSc3NSZWFkZXIucG5nIGIvZG9jcy9odG1sL3Jlc291cmNlcy9zYW1wbGVzL2ltYWdlcy9YbWxSc3NSZWFkZXIucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAwZjg0MWIKLS0tIC9kZXYvbnVsbAorKysgYi9kb2NzL2h0bWwvcmVzb3VyY2VzL3NhbXBsZXMvaW1hZ2VzL1htbFJzc1JlYWRlci5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9odG1sL3Jlc291cmNlcy9zYW1wbGVzL2ltYWdlcy9zYW1wbGVfbm90ZXBhZHRlc3RfanVuaXQucG5nIGIvZG9jcy9odG1sL3Jlc291cmNlcy9zYW1wbGVzL2ltYWdlcy9zYW1wbGVfbm90ZXBhZHRlc3RfanVuaXQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRjZGE1NGUKLS0tIC9kZXYvbnVsbAorKysgYi9kb2NzL2h0bWwvcmVzb3VyY2VzL3NhbXBsZXMvaW1hZ2VzL3NhbXBsZV9ub3RlcGFkdGVzdF9qdW5pdC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9odG1sL3Jlc291cmNlcy90b3BpY3MuamQgYi9kb2NzL2h0bWwvcmVzb3VyY2VzL3RvcGljcy5qZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNTk2MGZmCi0tLSAvZGV2L251bGwKKysrIGIvZG9jcy9odG1sL3Jlc291cmNlcy90b3BpY3MuamQKQEAgLTAsMCArMSw3MiBAQAorcGFnZS50aXRsZT1UZWNobmljYWwgUmVzb3VyY2UgVG9waWNzCitAamQ6Ym9keQorCis8c3R5bGUgdHlwZT0idGV4dC9jc3MiPgorICAjcmVzb3VyY2UtdG9waWMtdGFibGUgdGQgeworICAgIGJvcmRlcjogMDsKKyAgICBwYWRkaW5nOiAwOworICAgIG1hcmdpbjogMDsKKyAgICBwYWRkaW5nLWxlZnQ6IDFlbTsKKyAgICB3aWR0aDogMThlbTsKKyAgfQorCisgICNyZXNvdXJjZS10b3BpYy10YWJsZSB1bCB7CisgICAgcGFkZGluZzogMDsKKyAgICBtYXJnaW46IDA7CisgIH0KKworICAjcmVzb3VyY2UtdG9waWMtdGFibGUgbGkgeworICAgIGxpc3Qtc3R5bGU6IG5vbmU7CisgICAgbWFyZ2luOiAwOworICAgIHBhZGRpbmc6IDA7CisgIH0KKzwvc3R5bGU+CisKKzxwPgorWW91IGNhbiBicm93c2UgdGhlIGxpc3Qgb2YgdGVjaG5pY2FsIHJlc291cmNlcyBieSB0b3BpYyBieSBjbGlja2luZyBvbiB0aGUKK2xpbmtzIGJlbG93LiBPdmVyIHRpbWUsIGFzIG1vcmUgdG9waWNzIGFyZSBhZGRlZCwgdGhleSB3aWxsIGJlIGFkZGVkIHRvIHRoZQorbGlzdCBiZWxvdy4KKzwvcD4KKworPG5vc2NyaXB0PgorICA8cCBjbGFzcz0ibm90ZSI+PHN0cm9uZz5FcnJvcjo8L3N0cm9uZz4KKyAgICBZb3UgbXVzdCBoYXZlIEphdmFTY3JpcHQgZW5hYmxlZCB0byB2aWV3IHRoaXMgcGFnZS4gUmVzb3VyY2VzIGFyZSBhbHNvCisgICAgYXZhaWxhYmxlIG9mZmxpbmUgaW4gdGhlIFNESy4KKyAgPC9wPgorPC9ub3NjcmlwdD4KKworPHRhYmxlIGlkPSJyZXNvdXJjZS10b3BpYy10YWJsZSI+CisgIDx0cj48L3RyPgorPC90YWJsZT4KKworPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgorPCEtLSAKKyhmdW5jdGlvbigpIHsKKyAgdmFyIHRvcGljcyA9IFtdOworICBmb3IgKHZhciB0b3BpYyBpbiBBTkRST0lEX1RBR1NbJ3RvcGljJ10pIHsKKyAgICB0b3BpY3MucHVzaCh7bmFtZTp0b3BpYyx0aXRsZTpBTkRST0lEX1RBR1NbJ3RvcGljJ11bdG9waWNdfSk7CisgIH0KKyAgdG9waWNzLnNvcnQoZnVuY3Rpb24oeCx5KXsgcmV0dXJuICh4LnRpdGxlIDwgeS50aXRsZSkgPyAtMSA6IDE7IH0pOworICB2YXIgdG9waWNQYXJlbnQgPSBudWxsOworICBmb3IgKHZhciBpID0gMDsgaSA8IHRvcGljcy5sZW5ndGg7IGkrKykgeworICAgIGlmICh0b3BpY1BhcmVudCA9PSBudWxsIHx8IGkgJSAxMCA9PSAwKSB7CisgICAgICAvLyBjcmVhdGUgYSBuZXcgY29sdW1uCisgICAgICB0b3BpY1BhcmVudCA9ICQoJ3VsJywgJCgnPHRkPjx1bD4nKS5hcHBlbmRUbygnI3Jlc291cmNlLXRvcGljLXRhYmxlIHRyJykpOworICAgIH0KKworICAgIHRvcGljUGFyZW50LmFwcGVuZCgKKyAgICAgICAgJCgnPGxpPicpLmFwcGVuZCgKKyAgICAgICAgICAkKCc8aDM+JykuYXBwZW5kKAorICAgICAgICAgICAgJCgnPGE+JykKKyAgICAgICAgICAgICAgLmF0dHIoJ2hyZWYnLCB0b1Jvb3QgKyAicmVzb3VyY2VzL2Jyb3dzZXIuaHRtbD90YWc9IiArIHRvcGljc1tpXS5uYW1lKQorICAgICAgICAgICAgICAuYXBwZW5kKCQoJzxzcGFuPicpCisgICAgICAgICAgICAgICAgLmFkZENsYXNzKCdlbicpCisgICAgICAgICAgICAgICAgLmh0bWwodG9waWNzW2ldLnRpdGxlKQorICAgICAgICAgICAgICApCisgICAgICAgICAgICApCisgICAgICAgICAgKQorICAgICAgICApOworICB9Cit9KSgpOworLy8tLT4KKzwvc2NyaXB0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9ncmFwaGljcy9CaXRtYXAuamF2YSBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9ncmFwaGljcy9CaXRtYXAuamF2YQppbmRleCA3Y2EzNzQxLi45YTE5MDU2IDEwMDY0NAotLS0gYS9ncmFwaGljcy9qYXZhL2FuZHJvaWQvZ3JhcGhpY3MvQml0bWFwLmphdmEKKysrIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL2dyYXBoaWNzL0JpdG1hcC5qYXZhCkBAIC0xOSwxMiArMTksMTYgQEAKIGltcG9ydCBhbmRyb2lkLm9zLlBhcmNlbDsKIGltcG9ydCBhbmRyb2lkLm9zLlBhcmNlbGFibGU7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkRpc3BsYXlNZXRyaWNzOworaW1wb3J0IGFuZHJvaWQudXRpbC5GaW5hbGl6ZXJzOwogCiBpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07CiBpbXBvcnQgamF2YS5uaW8uQnVmZmVyOwogaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7CiBpbXBvcnQgamF2YS5uaW8uSW50QnVmZmVyOwogaW1wb3J0IGphdmEubmlvLlNob3J0QnVmZmVyOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OwogCiBwdWJsaWMgZmluYWwgY2xhc3MgQml0bWFwIGltcGxlbWVudHMgUGFyY2VsYWJsZSB7CiAgICAgLyoqCkBAIC0zNSw5ICszOSwxMyBAQAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERFTlNJVFlfTk9ORSA9IDA7CiAgICAgCi0gICAgLy8gTm90ZTogIG1OYXRpdmVCaXRtYXAgaXMgdXNlZCBieSBGYWNlRGV0ZWN0b3Jfam5pLmNwcAotICAgIC8vIERvbid0IGNoYW5nZS9yZW5hbWUgd2l0aG91dCB1cGRhdGluZyBGYWNlRGV0ZWN0b3Jfam5pLmNwcAotICAgIHByaXZhdGUgZmluYWwgaW50IG1OYXRpdmVCaXRtYXA7CisgICAgLyoqCisgICAgICogTm90ZTogIG1OYXRpdmVCaXRtYXAgaXMgdXNlZCBieSBGYWNlRGV0ZWN0b3Jfam5pLmNwcAorICAgICAqIERvbid0IGNoYW5nZS9yZW5hbWUgd2l0aG91dCB1cGRhdGluZyBGYWNlRGV0ZWN0b3Jfam5pLmNwcAorICAgICAqIAorICAgICAqIEBoaWRlCisgICAgICovCisgICAgcHVibGljIGZpbmFsIGludCBtTmF0aXZlQml0bWFwOwogCiAgICAgcHJpdmF0ZSBmaW5hbCBib29sZWFuIG1Jc011dGFibGU7CiAgICAgcHJpdmF0ZSBieXRlW10gbU5pbmVQYXRjaENodW5rOyAgIC8vIG1heSBiZSBudWxsCkBAIC01MSw3ICs1OSw3IEBACiAgICAgcHJpdmF0ZSBzdGF0aWMgdm9sYXRpbGUgTWF0cml4IHNTY2FsZU1hdHJpeDsKIAogICAgIHByaXZhdGUgc3RhdGljIHZvbGF0aWxlIGludCBzRGVmYXVsdERlbnNpdHkgPSAtMTsKLSAgICAKKwogICAgIC8qKgogICAgICAqIEZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSwgYWxsb3dzIHRoZSBhcHAgbGF5ZXIgdG8gY2hhbmdlIHRoZSBkZWZhdWx0CiAgICAgICogZGVuc2l0eSB3aGVuIHJ1bm5pbmcgb2xkIGFwcHMuCkBAIC03Nyw4ICs4NSw3IEBACiAKICAgICAgICAgVGhpcyBjYW4gYmUgY2FsbGVkIGZyb20gSk5JIGNvZGUuCiAgICAgKi8KLSAgICBwcml2YXRlIEJpdG1hcChpbnQgbmF0aXZlQml0bWFwLCBib29sZWFuIGlzTXV0YWJsZSwgYnl0ZVtdIG5pbmVQYXRjaENodW5rLAotICAgICAgICAgICAgaW50IGRlbnNpdHkpIHsKKyAgICBwcml2YXRlIEJpdG1hcChpbnQgbmF0aXZlQml0bWFwLCBib29sZWFuIGlzTXV0YWJsZSwgYnl0ZVtdIG5pbmVQYXRjaENodW5rLCBpbnQgZGVuc2l0eSkgewogICAgICAgICBpZiAobmF0aXZlQml0bWFwID09IDApIHsKICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJpbnRlcm5hbCBlcnJvcjogbmF0aXZlIGJpdG1hcCBpcyAwIik7CiAgICAgICAgIH0KQEAgLTkwLDYgKzk3LDEzIEBACiAgICAgICAgIGlmIChkZW5zaXR5ID49IDApIHsKICAgICAgICAgICAgIG1EZW5zaXR5ID0gZGVuc2l0eTsKICAgICAgICAgfQorCisgICAgICAgIC8vIElmIHRoZSBmaW5hbGl6ZXJzIHF1ZXVlIGlzIG51bGwsIHdlIGFyZSBydW5uaW5nIGluIHp5Z290ZSBhbmQgdGhlCisgICAgICAgIC8vIGJpdG1hcCB3aWxsIG5ldmVyIGJlIHJlY2xhaW1lZCwgc28gd2UgZG9uJ3QgbmVlZCB0byBydW4gb3VyIG5hdGl2ZQorICAgICAgICAvLyBkZXN0cnVjdG9yCisgICAgICAgIGlmIChGaW5hbGl6ZXJzLmdldFF1ZXVlKCkgIT0gbnVsbCkgeworICAgICAgICAgICAgbmV3IEJpdG1hcEZpbmFsaXplcih0aGlzKTsKKyAgICAgICAgfQogICAgIH0KIAogICAgIC8qKgpAQCAtMTcyLDYgKzE4NiwxOSBAQAogICAgIH0KIAogICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIGdlbmVyYXRpb24gSUQgb2YgdGhpcyBiaXRtYXAuIFRoZSBnZW5lcmF0aW9uIElEIGNoYW5nZXMKKyAgICAgKiB3aGVuZXZlciB0aGUgYml0bWFwIGlzIG1vZGlmaWVkLiBUaGlzIGNhbiBiZSB1c2VkIGFzIGFuIGVmZmljaWVudCB3YXkgdG8KKyAgICAgKiBjaGVjayBpZiBhIGJpdG1hcCBoYXMgY2hhbmdlZC4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIFRoZSBjdXJyZW50IGdlbmVyYXRpb24gSUQgZm9yIHRoaXMgYml0bWFwLgorICAgICAqIAorICAgICAqIEBoaWRlCisgICAgICovCisgICAgcHVibGljIGludCBnZXRHZW5lcmF0aW9uSWQoKSB7CisgICAgICAgIHJldHVybiBuYXRpdmVHZW5lcmF0aW9uSWQobU5hdGl2ZUJpdG1hcCk7CisgICAgfQorICAgIAorICAgIC8qKgogICAgICAqIFRoaXMgaXMgY2FsbGVkIGJ5IG1ldGhvZHMgdGhhdCB3YW50IHRvIHRocm93IGFuIGV4Y2VwdGlvbiBpZiB0aGUgYml0bWFwCiAgICAgICogaGFzIGFscmVhZHkgYmVlbiByZWN5Y2xlZC4KICAgICAgKi8KQEAgLTQxOSwyOCArNDQ2LDMwIEBACiAgICAgICAgIFJlY3Qgc3JjUiA9IG5ldyBSZWN0KHgsIHksIHggKyB3aWR0aCwgeSArIGhlaWdodCk7CiAgICAgICAgIFJlY3RGIGRzdFIgPSBuZXcgUmVjdEYoMCwgMCwgd2lkdGgsIGhlaWdodCk7CiAKKyAgICAgICAgZmluYWwgQ29uZmlnIG5ld0NvbmZpZyA9IHNvdXJjZS5nZXRDb25maWcoKSA9PSBDb25maWcuQVJHQl84ODg4ID8KKyAgICAgICAgICAgICAgICBDb25maWcuQVJHQl84ODg4IDogQ29uZmlnLlJHQl81NjU7CisKICAgICAgICAgaWYgKG0gPT0gbnVsbCB8fCBtLmlzSWRlbnRpdHkoKSkgewotICAgICAgICAgICAgYml0bWFwID0gY3JlYXRlQml0bWFwKG5ld3csIG5ld2gsCi0gICAgICAgICAgICAgICAgICAgIHNvdXJjZS5oYXNBbHBoYSgpID8gQ29uZmlnLkFSR0JfODg4OCA6IENvbmZpZy5SR0JfNTY1KTsKKyAgICAgICAgICAgIGJpdG1hcCA9IGNyZWF0ZUJpdG1hcChuZXd3LCBuZXdoLCBuZXdDb25maWcsIHNvdXJjZS5oYXNBbHBoYSgpKTsKICAgICAgICAgICAgIHBhaW50ID0gbnVsbDsgICAvLyBub3QgbmVlZGVkCiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvKiAgdGhlIGRzdCBzaG91bGQgaGF2ZSBhbHBoYSBpZiB0aGUgc3JjIGRvZXMsIG9yIGlmIG91ciBtYXRyaXgKLSAgICAgICAgICAgICAgICBkb2Vzbid0IHByZXNlcnZlIHJlY3RuZXNzCi0gICAgICAgICAgICAqLwotICAgICAgICAgICAgYm9vbGVhbiBoYXNBbHBoYSA9IHNvdXJjZS5oYXNBbHBoYSgpIHx8ICFtLnJlY3RTdGF5c1JlY3QoKTsKKyAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gdHJhbnNmb3JtZWQgPSAhbS5yZWN0U3RheXNSZWN0KCk7CisKICAgICAgICAgICAgIFJlY3RGIGRldmljZVIgPSBuZXcgUmVjdEYoKTsKICAgICAgICAgICAgIG0ubWFwUmVjdChkZXZpY2VSLCBkc3RSKTsKKwogICAgICAgICAgICAgbmV3dyA9IE1hdGgucm91bmQoZGV2aWNlUi53aWR0aCgpKTsKICAgICAgICAgICAgIG5ld2ggPSBNYXRoLnJvdW5kKGRldmljZVIuaGVpZ2h0KCkpOwotICAgICAgICAgICAgYml0bWFwID0gY3JlYXRlQml0bWFwKG5ld3csIG5ld2gsIGhhc0FscGhhID8gQ29uZmlnLkFSR0JfODg4OCA6IENvbmZpZy5SR0JfNTY1KTsKLSAgICAgICAgICAgIGlmIChoYXNBbHBoYSkgewotICAgICAgICAgICAgICAgIGJpdG1hcC5lcmFzZUNvbG9yKDApOwotICAgICAgICAgICAgfQorCisgICAgICAgICAgICBiaXRtYXAgPSBjcmVhdGVCaXRtYXAobmV3dywgbmV3aCwgdHJhbnNmb3JtZWQgPyBDb25maWcuQVJHQl84ODg4IDogbmV3Q29uZmlnLAorICAgICAgICAgICAgICAgICAgICB0cmFuc2Zvcm1lZCB8fCBzb3VyY2UuaGFzQWxwaGEoKSk7CisKICAgICAgICAgICAgIGNhbnZhcy50cmFuc2xhdGUoLWRldmljZVIubGVmdCwgLWRldmljZVIudG9wKTsKICAgICAgICAgICAgIGNhbnZhcy5jb25jYXQobSk7CisKICAgICAgICAgICAgIHBhaW50ID0gbmV3IFBhaW50KCk7CiAgICAgICAgICAgICBwYWludC5zZXRGaWx0ZXJCaXRtYXAoZmlsdGVyKTsKLSAgICAgICAgICAgIGlmICghbS5yZWN0U3RheXNSZWN0KCkpIHsKKyAgICAgICAgICAgIGlmICh0cmFuc2Zvcm1lZCkgewogICAgICAgICAgICAgICAgIHBhaW50LnNldEFudGlBbGlhcyh0cnVlKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQpAQCAtNDY1LDggKzQ5NCwzMCBAQAogICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRoZSB3aWR0aCBvciBoZWlnaHQgYXJlIDw9IDAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIEJpdG1hcCBjcmVhdGVCaXRtYXAoaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBDb25maWcgY29uZmlnKSB7CisgICAgICAgIHJldHVybiBjcmVhdGVCaXRtYXAod2lkdGgsIGhlaWdodCwgY29uZmlnLCB0cnVlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGEgbXV0YWJsZSBiaXRtYXAgd2l0aCB0aGUgc3BlY2lmaWVkIHdpZHRoIGFuZCBoZWlnaHQuICBJdHMKKyAgICAgKiBpbml0aWFsIGRlbnNpdHkgaXMgYXMgcGVyIHtAbGluayAjZ2V0RGVuc2l0eX0uCisgICAgICoKKyAgICAgKiBAcGFyYW0gd2lkdGggICAgVGhlIHdpZHRoIG9mIHRoZSBiaXRtYXAKKyAgICAgKiBAcGFyYW0gaGVpZ2h0ICAgVGhlIGhlaWdodCBvZiB0aGUgYml0bWFwCisgICAgICogQHBhcmFtIGNvbmZpZyAgIFRoZSBiaXRtYXAgY29uZmlnIHRvIGNyZWF0ZS4KKyAgICAgKiBAcGFyYW0gaGFzQWxwaGEgSWYgdGhlIGJpdG1hcCBpcyBBUkdCXzg4ODggdGhpcyBmbGFnIGNhbiBiZSB1c2VkIHRvIG1hcmsgdGhlCisgICAgICogICAgICAgICAgICAgICAgIGJpdG1hcCBhcyBvcGFxdWUuIERvaW5nIHNvIHdpbGwgY2xlYXIgdGhlIGJpdG1hcCBpbiBibGFjaworICAgICAqICAgICAgICAgICAgICAgICBpbnN0ZWFkIG9mIHRyYW5zcGFyZW50LiAgCisgICAgICogCisgICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhlIHdpZHRoIG9yIGhlaWdodCBhcmUgPD0gMAorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIEJpdG1hcCBjcmVhdGVCaXRtYXAoaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBDb25maWcgY29uZmlnLCBib29sZWFuIGhhc0FscGhhKSB7CiAgICAgICAgIEJpdG1hcCBibSA9IG5hdGl2ZUNyZWF0ZShudWxsLCAwLCB3aWR0aCwgd2lkdGgsIGhlaWdodCwgY29uZmlnLm5hdGl2ZUludCwgdHJ1ZSk7Ci0gICAgICAgIGJtLmVyYXNlQ29sb3IoMCk7ICAgIC8vIHN0YXJ0IHdpdGggYmxhY2svdHJhbnNwYXJlbnQgcGl4ZWxzCisgICAgICAgIGlmIChjb25maWcgPT0gQ29uZmlnLkFSR0JfODg4OCAmJiAhaGFzQWxwaGEpIHsKKyAgICAgICAgICAgIGJtLmVyYXNlQ29sb3IoMHhmZjAwMDAwMCk7CisgICAgICAgICAgICBuYXRpdmVTZXRIYXNBbHBoYShibS5tTmF0aXZlQml0bWFwLCBoYXNBbHBoYSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBibS5lcmFzZUNvbG9yKDApOworICAgICAgICB9CiAgICAgICAgIHJldHVybiBibTsKICAgICB9CiAKQEAgLTk5OSwxMiArMTA1MCwyMiBAQAogICAgICAgICBuYXRpdmVQcmVwYXJlVG9EcmF3KG1OYXRpdmVCaXRtYXApOwogICAgIH0KIAotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIGZpbmFsaXplKCkgdGhyb3dzIFRocm93YWJsZSB7Ci0gICAgICAgIHRyeSB7CisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgQml0bWFwRmluYWxpemVyIGV4dGVuZHMgRmluYWxpemVycy5SZWNsYWltYWJsZVJlZmVyZW5jZTxCaXRtYXA+IHsKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU2V0PEJpdG1hcEZpbmFsaXplcj4gc0ZpbmFsaXplcnMgPSBDb2xsZWN0aW9ucy5zeW5jaHJvbml6ZWRTZXQoCisgICAgICAgICAgICAgICAgbmV3IEhhc2hTZXQ8Qml0bWFwRmluYWxpemVyPigpKTsKKworICAgICAgICBwcml2YXRlIGludCBtTmF0aXZlQml0bWFwOworCisgICAgICAgIEJpdG1hcEZpbmFsaXplcihCaXRtYXAgYikgeworICAgICAgICAgICAgc3VwZXIoYiwgRmluYWxpemVycy5nZXRRdWV1ZSgpKTsKKyAgICAgICAgICAgIG1OYXRpdmVCaXRtYXAgPSBiLm1OYXRpdmVCaXRtYXA7CisgICAgICAgICAgICBzRmluYWxpemVycy5hZGQodGhpcyk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgcmVjbGFpbSgpIHsKICAgICAgICAgICAgIG5hdGl2ZURlc3RydWN0b3IobU5hdGl2ZUJpdG1hcCk7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBzdXBlci5maW5hbGl6ZSgpOworICAgICAgICAgICAgc0ZpbmFsaXplcnMucmVtb3ZlKHRoaXMpOwogICAgICAgICB9CiAgICAgfQogCkBAIC0xMDQxLDYgKzExMDIsNyBAQAogICAgIHByaXZhdGUgc3RhdGljIG5hdGl2ZSB2b2lkIG5hdGl2ZUNvcHlQaXhlbHNUb0J1ZmZlcihpbnQgbmF0aXZlQml0bWFwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCdWZmZXIgZHN0KTsKICAgICBwcml2YXRlIHN0YXRpYyBuYXRpdmUgdm9pZCBuYXRpdmVDb3B5UGl4ZWxzRnJvbUJ1ZmZlcihpbnQgbmIsIEJ1ZmZlciBzcmMpOworICAgIHByaXZhdGUgc3RhdGljIG5hdGl2ZSBpbnQgbmF0aXZlR2VuZXJhdGlvbklkKGludCBuYXRpdmVCaXRtYXApOwogCiAgICAgcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIEJpdG1hcCBuYXRpdmVDcmVhdGVGcm9tUGFyY2VsKFBhcmNlbCBwKTsKICAgICAvLyByZXR1cm5zIHRydWUgb24gc3VjY2VzcwpAQCAtMTA1Niw3ICsxMTE4LDcgQEAKICAgICBwcml2YXRlIHN0YXRpYyBuYXRpdmUgdm9pZCBuYXRpdmVQcmVwYXJlVG9EcmF3KGludCBuYXRpdmVCaXRtYXApOwogICAgIHByaXZhdGUgc3RhdGljIG5hdGl2ZSB2b2lkIG5hdGl2ZVNldEhhc0FscGhhKGludCBuQml0bWFwLCBib29sZWFuIGhhc0FscGhhKTsKICAgICBwcml2YXRlIHN0YXRpYyBuYXRpdmUgYm9vbGVhbiBuYXRpdmVTYW1lQXMoaW50IG5iMCwgaW50IG5iMSk7Ci0KKyAgICAKICAgICAvKiBwYWNrYWdlICovIGZpbmFsIGludCBuaSgpIHsKICAgICAgICAgcmV0dXJuIG1OYXRpdmVCaXRtYXA7CiAgICAgfQpkaWZmIC0tZ2l0IGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL2dyYXBoaWNzL0JpdG1hcEZhY3RvcnkuamF2YSBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9ncmFwaGljcy9CaXRtYXBGYWN0b3J5LmphdmEKaW5kZXggNjIzNGYyYy4uZGMyMWE3MiAxMDA2NDQKLS0tIGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL2dyYXBoaWNzL0JpdG1hcEZhY3RvcnkuamF2YQorKysgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvZ3JhcGhpY3MvQml0bWFwRmFjdG9yeS5qYXZhCkBAIC0xOCw3ICsxOCw2IEBACiAKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLkFzc2V0TWFuYWdlcjsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlJlc291cmNlczsKLWltcG9ydCBhbmRyb2lkLm9zLk1lbW9yeUZpbGU7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkRpc3BsYXlNZXRyaWNzOwogaW1wb3J0IGFuZHJvaWQudXRpbC5UeXBlZFZhbHVlOwogCkBAIC04NCw3ICs4Myw3IEBACiAgICAgICAgIC8qKgogICAgICAgICAgKiBUaGUgcGl4ZWwgZGVuc2l0eSB0byB1c2UgZm9yIHRoZSBiaXRtYXAuICBUaGlzIHdpbGwgYWx3YXlzIHJlc3VsdAogICAgICAgICAgKiBpbiB0aGUgcmV0dXJuZWQgYml0bWFwIGhhdmluZyBhIGRlbnNpdHkgc2V0IGZvciBpdCAoc2VlCi0gICAgICAgICAqIHtAbGluayBCaXRtYXAjc2V0RGVuc2l0eShpbnQpIEJpdG1hcC5zZXREZW5zaXR5KGludCkpLiAgSW4gYWRkaXRpb24sCisgICAgICAgICAqIHtAbGluayBCaXRtYXAjc2V0RGVuc2l0eShpbnQpIEJpdG1hcC5zZXREZW5zaXR5KGludCl9KS4gIEluIGFkZGl0aW9uLAogICAgICAgICAgKiBpZiB7QGxpbmsgI2luU2NhbGVkfSBpcyBzZXQgKHdoaWNoIGl0IGlzIGJ5IGRlZmF1bHR9IGFuZCB0aGlzCiAgICAgICAgICAqIGRlbnNpdHkgZG9lcyBub3QgbWF0Y2gge0BsaW5rICNpblRhcmdldERlbnNpdHl9LCB0aGVuIHRoZSBiaXRtYXAKICAgICAgICAgICogd2lsbCBiZSBzY2FsZWQgdG8gdGhlIHRhcmdldCBkZW5zaXR5IGJlZm9yZSBiZWluZyByZXR1cm5lZC4KQEAgLTUwNyw5ICs1MDYsNyBAQAogICAgICAqCiAgICAgICogQHBhcmFtIGlzIFRoZSBpbnB1dCBzdHJlYW0gdGhhdCBob2xkcyB0aGUgcmF3IGRhdGEgdG8gYmUgZGVjb2RlZCBpbnRvIGEKICAgICAgKiAgICAgICAgICAgYml0bWFwLgotICAgICAqIEByZXR1cm4gVGhlIGRlY29kZWQgYml0bWFwLCBvciBudWxsIGlmIHRoZSBpbWFnZSBkYXRhIGNvdWxkIG5vdCBiZQotICAgICAqICAgICAgICAgZGVjb2RlZCwgb3IsIGlmIG9wdHMgaXMgbm9uLW51bGwsIGlmIG9wdHMgcmVxdWVzdGVkIG9ubHkgdGhlCi0gICAgICogICAgICAgICBzaXplIGJlIHJldHVybmVkIChpbiBvcHRzLm91dFdpZHRoIGFuZCBvcHRzLm91dEhlaWdodCkKKyAgICAgKiBAcmV0dXJuIFRoZSBkZWNvZGVkIGJpdG1hcCwgb3IgbnVsbCBpZiB0aGUgaW1hZ2UgZGF0YSBjb3VsZCBub3QgYmUgZGVjb2RlZC4KICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIEJpdG1hcCBkZWNvZGVTdHJlYW0oSW5wdXRTdHJlYW0gaXMpIHsKICAgICAgICAgcmV0dXJuIGRlY29kZVN0cmVhbShpcywgbnVsbCwgbnVsbCk7CkBAIC01MzAsMTggKzUyNyw2IEBACiAgICAgICogQHJldHVybiB0aGUgZGVjb2RlZCBiaXRtYXAsIG9yIG51bGwKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIEJpdG1hcCBkZWNvZGVGaWxlRGVzY3JpcHRvcihGaWxlRGVzY3JpcHRvciBmZCwgUmVjdCBvdXRQYWRkaW5nLCBPcHRpb25zIG9wdHMpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGlmIChNZW1vcnlGaWxlLmlzTWVtb3J5RmlsZShmZCkpIHsKLSAgICAgICAgICAgICAgICBpbnQgbWFwcGVkbGVuZ3RoID0gTWVtb3J5RmlsZS5nZXRTaXplKGZkKTsKLSAgICAgICAgICAgICAgICBNZW1vcnlGaWxlIGZpbGUgPSBuZXcgTWVtb3J5RmlsZShmZCwgbWFwcGVkbGVuZ3RoLCAiciIpOwotICAgICAgICAgICAgICAgIElucHV0U3RyZWFtIGlzID0gZmlsZS5nZXRJbnB1dFN0cmVhbSgpOwotICAgICAgICAgICAgICAgIEJpdG1hcCBibSA9IGRlY29kZVN0cmVhbShpcywgb3V0UGFkZGluZywgb3B0cyk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZpbmlzaERlY29kZShibSwgb3V0UGFkZGluZywgb3B0cyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICAvLyBpbnZhbGlkIGZpbGVkZXNjcmlwdG9yLCBubyBuZWVkIHRvIGNhbGwgbmF0aXZlRGVjb2RlRmlsZURlc2NyaXB0b3IoKQotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KICAgICAgICAgQml0bWFwIGJtID0gbmF0aXZlRGVjb2RlRmlsZURlc2NyaXB0b3IoZmQsIG91dFBhZGRpbmcsIG9wdHMpOwogICAgICAgICByZXR1cm4gZmluaXNoRGVjb2RlKGJtLCBvdXRQYWRkaW5nLCBvcHRzKTsKICAgICB9CmRpZmYgLS1naXQgYS9ncmFwaGljcy9qYXZhL2FuZHJvaWQvZ3JhcGhpY3MvQml0bWFwU2hhZGVyLmphdmEgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvZ3JhcGhpY3MvQml0bWFwU2hhZGVyLmphdmEKaW5kZXggNjEyYjBhYi4uNGJhNjc5YiAxMDA2NDQKLS0tIGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL2dyYXBoaWNzL0JpdG1hcFNoYWRlci5qYXZhCisrKyBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9ncmFwaGljcy9CaXRtYXBTaGFkZXIuamF2YQpAQCAtMTYsMTAgKzE2LDE2IEBACiAKIHBhY2thZ2UgYW5kcm9pZC5ncmFwaGljczsKIAorLyoqCisgKiBTaGFkZXIgdXNlZCB0byBkcmF3IGEgYml0bWFwIGFzIGEgdGV4dHVyZS4gVGhlIGJpdG1hcCBjYW4gYmUgcmVwZWF0ZWQgb3IKKyAqIG1pcnJvcmVkIGJ5IHNldHRpbmcgdGhlIHRpbGluZyBtb2RlLgorICovCiBwdWJsaWMgY2xhc3MgQml0bWFwU2hhZGVyIGV4dGVuZHMgU2hhZGVyIHsKLQotICAgIC8vIHdlIGhvbGQgb24ganVzdCBmb3IgdGhlIEdDLCBzaW5jZSBvdXIgbmF0aXZlIGNvdW50ZXJwYXJ0IGlzIHVzaW5nIGl0Ci0gICAgcHJpdmF0ZSBCaXRtYXAgbUJpdG1hcDsKKyAgICAvKioKKyAgICAgKiBQcmV2ZW50IGdhcmJhZ2UgY29sbGVjdGlvbi4KKyAgICAgKi8KKyAgICBAU3VwcHJlc3NXYXJuaW5ncyh7IkZpZWxkQ2FuQmVMb2NhbCIsICJVbnVzZWREZWNsYXJhdGlvbiJ9KQorICAgIHByaXZhdGUgZmluYWwgQml0bWFwIG1CaXRtYXA7CiAKICAgICAvKioKICAgICAgKiBDYWxsIHRoaXMgdG8gY3JlYXRlIGEgbmV3IHNoYWRlciB0aGF0IHdpbGwgZHJhdyB3aXRoIGEgYml0bWFwLgpAQCAtMzAsMTIgKzM2LDEzIEBACiAgICAgICovCiAgICAgcHVibGljIEJpdG1hcFNoYWRlcihCaXRtYXAgYml0bWFwLCBUaWxlTW9kZSB0aWxlWCwgVGlsZU1vZGUgdGlsZVkpIHsKICAgICAgICAgbUJpdG1hcCA9IGJpdG1hcDsKLSAgICAgICAgbmF0aXZlX2luc3RhbmNlID0gbmF0aXZlQ3JlYXRlKGJpdG1hcC5uaSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGlsZVgubmF0aXZlSW50LCB0aWxlWS5uYXRpdmVJbnQpOworICAgICAgICBmaW5hbCBpbnQgYiA9IGJpdG1hcC5uaSgpOworICAgICAgICBuYXRpdmVfaW5zdGFuY2UgPSBuYXRpdmVDcmVhdGUoYiwgdGlsZVgubmF0aXZlSW50LCB0aWxlWS5uYXRpdmVJbnQpOworICAgICAgICBuYXRpdmVfc2hhZGVyID0gbmF0aXZlUG9zdENyZWF0ZShuYXRpdmVfaW5zdGFuY2UsIGIsIHRpbGVYLm5hdGl2ZUludCwgdGlsZVkubmF0aXZlSW50KTsKICAgICB9CiAKLSAgICBwcml2YXRlIHN0YXRpYyBuYXRpdmUgaW50IG5hdGl2ZUNyZWF0ZShpbnQgbmF0aXZlX2JpdG1hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2hhZGVyVGlsZU1vZGVYLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzaGFkZXJUaWxlTW9kZVkpOyAgICAKKyAgICBwcml2YXRlIHN0YXRpYyBuYXRpdmUgaW50IG5hdGl2ZUNyZWF0ZShpbnQgbmF0aXZlX2JpdG1hcCwgaW50IHNoYWRlclRpbGVNb2RlWCwKKyAgICAgICAgICAgIGludCBzaGFkZXJUaWxlTW9kZVkpOworICAgIHByaXZhdGUgc3RhdGljIG5hdGl2ZSBpbnQgbmF0aXZlUG9zdENyZWF0ZShpbnQgbmF0aXZlX3NoYWRlciwgaW50IG5hdGl2ZV9iaXRtYXAsCisgICAgICAgICAgICBpbnQgc2hhZGVyVGlsZU1vZGVYLCBpbnQgc2hhZGVyVGlsZU1vZGVZKTsKIH0KLQpkaWZmIC0tZ2l0IGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL2dyYXBoaWNzL0NhbnZhcy5qYXZhIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL2dyYXBoaWNzL0NhbnZhcy5qYXZhCmluZGV4IDc2Y2RlNzMuLmU3NWExOWUgMTAwNjQ0Ci0tLSBhL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9ncmFwaGljcy9DYW52YXMuamF2YQorKysgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvZ3JhcGhpY3MvQ2FudmFzLmphdmEKQEAgLTE2LDExICsxNiwxMCBAQAogCiBwYWNrYWdlIGFuZHJvaWQuZ3JhcGhpY3M7CiAKLWltcG9ydCBhbmRyb2lkLnRleHQuVGV4dFV0aWxzOwotaW1wb3J0IGFuZHJvaWQudGV4dC5TcGFubmVkU3RyaW5nOwotaW1wb3J0IGFuZHJvaWQudGV4dC5TcGFubmFibGVTdHJpbmc7CiBpbXBvcnQgYW5kcm9pZC50ZXh0LkdyYXBoaWNzT3BlcmF0aW9uczsKLWltcG9ydCBhbmRyb2lkLnV0aWwuRGlzcGxheU1ldHJpY3M7CitpbXBvcnQgYW5kcm9pZC50ZXh0LlNwYW5uYWJsZVN0cmluZzsKK2ltcG9ydCBhbmRyb2lkLnRleHQuU3Bhbm5lZFN0cmluZzsKK2ltcG9ydCBhbmRyb2lkLnRleHQuVGV4dFV0aWxzOwogCiBpbXBvcnQgamF2YXgubWljcm9lZGl0aW9uLmtocm9ub3Mub3BlbmdsZXMuR0w7CiAKQEAgLTQzLDIyICs0MiwzOSBAQAogICAgICAgICBmb3IgYm90aCB0byBiZSBudWxsLgogICAgICovCiAgICAgcHJpdmF0ZSBCaXRtYXAgIG1CaXRtYXA7ICAgIC8vIGlmIG5vdCBudWxsLCBtR0wgbXVzdCBiZSBudWxsCi0gICAgcHJpdmF0ZSBHTCAgICAgIG1HTDsgICAgICAgIC8vIGlmIG5vdCBudWxsLCBtQml0bWFwIG11c3QgYmUgbnVsbAogICAgIAogICAgIC8vIG9wdGlvbmFsIGZpZWxkIHNldCBieSB0aGUgY2FsbGVyCi0gICAgcHJpdmF0ZSBEcmF3RmlsdGVyICBtRHJhd0ZpbHRlcjsKKyAgICBwcml2YXRlIERyYXdGaWx0ZXIgbURyYXdGaWx0ZXI7CiAKLSAgICAvLyBQYWNrYWdlLXNjb3BlZCBmb3IgcXVpY2sgYWNjZXNzLgotICAgIC8qcGFja2FnZSovIGludCBtRGVuc2l0eSA9IEJpdG1hcC5ERU5TSVRZX05PTkU7CisgICAgLyoqCisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgaW50IG1EZW5zaXR5ID0gQml0bWFwLkRFTlNJVFlfTk9ORTsKIAotICAgIC8vIFVzZWQgdG8gZGV0ZXJtaW5lIHdoZW4gY29tcGF0aWJpbGl0eSBzY2FsaW5nIGlzIGluIGVmZmVjdC4KLSAgICBwcml2YXRlIGludCBtU2NyZWVuRGVuc2l0eSA9IEJpdG1hcC5ERU5TSVRZX05PTkU7CisgICAgLyoqCisgICAgICogVXNlZCB0byBkZXRlcm1pbmUgd2hlbiBjb21wYXRpYmlsaXR5IHNjYWxpbmcgaXMgaW4gZWZmZWN0LgorICAgICAqIAorICAgICAqIEBoaWRlCisgICAgICovCisgICAgcHJvdGVjdGVkIGludCBtU2NyZWVuRGVuc2l0eSA9IEJpdG1hcC5ERU5TSVRZX05PTkU7CiAgICAgCiAgICAgLy8gVXNlZCBieSBuYXRpdmUgY29kZQogICAgIEBTdXBwcmVzc1dhcm5pbmdzKHsiVW51c2VkRGVjbGFyYXRpb24ifSkKICAgICBwcml2YXRlIGludCAgICAgICAgIG1TdXJmYWNlRm9ybWF0OwogCiAgICAgLyoqCisgICAgICogRmxhZyBmb3IgZHJhd1RleHRSdW4gaW5kaWNhdGluZyBsZWZ0LXRvLXJpZ2h0IHJ1biBkaXJlY3Rpb24uCisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBESVJFQ1RJT05fTFRSID0gMDsKKyAgICAKKyAgICAvKioKKyAgICAgKiBGbGFnIGZvciBkcmF3VGV4dFJ1biBpbmRpY2F0aW5nIHJpZ2h0LXRvLWxlZnQgcnVuIGRpcmVjdGlvbi4KKyAgICAgKiBAaGlkZQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERJUkVDVElPTl9SVEwgPSAxOworICAgIAorICAgIC8qKgogICAgICAqIENvbnN0cnVjdCBhbiBlbXB0eSByYXN0ZXIgY2FudmFzLiBVc2Ugc2V0Qml0bWFwKCkgdG8gc3BlY2lmeSBhIGJpdG1hcCB0bwogICAgICAqIGRyYXcgaW50by4gIFRoZSBpbml0aWFsIHRhcmdldCBkZW5zaXR5IGlzIHtAbGluayBCaXRtYXAjREVOU0lUWV9OT05FfTsKICAgICAgKiB0aGlzIHdpbGwgdHlwaWNhbGx5IGJlIHJlcGxhY2VkIHdoZW4gYSB0YXJnZXQgYml0bWFwIGlzIHNldCBmb3IgdGhlCkBAIC04OSw0NyArMTA1LDM3IEBACiAgICAgICAgIG1EZW5zaXR5ID0gYml0bWFwLm1EZW5zaXR5OwogICAgIH0KICAgICAKLSAgICAvKnBhY2thZ2UqLyBDYW52YXMoaW50IG5hdGl2ZUNhbnZhcykgeworICAgIENhbnZhcyhpbnQgbmF0aXZlQ2FudmFzKSB7CiAgICAgICAgIGlmIChuYXRpdmVDYW52YXMgPT0gMCkgewogICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOwogICAgICAgICB9CiAgICAgICAgIG1OYXRpdmVDYW52YXMgPSBuYXRpdmVDYW52YXM7CiAgICAgICAgIG1EZW5zaXR5ID0gQml0bWFwLmdldERlZmF1bHREZW5zaXR5KCk7CiAgICAgfQotICAgIAorCiAgICAgLyoqCi0gICAgICogQ29uc3RydWN0IGEgY2FudmFzIHdpdGggdGhlIHNwZWNpZmllZCBnbCBjb250ZXh0LiBBbGwgZHJhd2luZyB0aHJvdWdoCi0gICAgICogdGhpcyBjYW52YXMgd2lsbCBiZSByZWRpcmVjdGVkIHRvIE9wZW5HTC4gTm90ZTogc29tZSBmZWF0dXJlcyBtYXkgbm90Ci0gICAgICogYmUgc3VwcG9ydGVkIGluIHRoaXMgbW9kZSAoZS5nLiBzb21lIEdMIGltcGxlbWVudGF0aW9ucyBtYXkgbm90IHN1cHBvcnQKLSAgICAgKiBhbnRpYWxpYXNpbmcgb3IgY2VydGFpbiBlZmZlY3RzIGxpa2UgQ29sb3JNYXRyaXggb3IgY2VydGFpbiBYZmVybW9kZXMpLgotICAgICAqIEhvd2V2ZXIsIG5vIGV4Y2VwdGlvbiB3aWxsIGJlIHRocm93biBpbiB0aG9zZSBjYXNlcy4KKyAgICAgKiBSZXR1cm5zIG51bGwuCiAgICAgICogCi0gICAgICogPHA+VGhlIGluaXRpYWwgdGFyZ2V0IGRlbnNpdHkgb2YgdGhlIGNhbnZhcyBpcyB0aGUgc2FtZSBhcyB0aGUgaW5pdGlhbAotICAgICAqIGRlbnNpdHkgb2YgYml0bWFwcyBhcyBwZXIge0BsaW5rIEJpdG1hcCNnZXREZW5zaXR5KCkgQml0bWFwLmdldERlbnNpdHkoKX0uCisgICAgICogQGRlcHJlY2F0ZWQgVGhpcyBtZXRob2QgaXMgbm90IHN1cHBvcnRlZCBhbmQgc2hvdWxkIG5vdCBiZSBpbnZva2VkLgogICAgICAqLwotICAgIHB1YmxpYyBDYW52YXMoR0wgZ2wpIHsKLSAgICAgICAgbU5hdGl2ZUNhbnZhcyA9IGluaXRHTCgpOwotICAgICAgICBtR0wgPSBnbDsKLSAgICAgICAgbURlbnNpdHkgPSBCaXRtYXAuZ2V0RGVmYXVsdERlbnNpdHkoKTsKKyAgICBARGVwcmVjYXRlZAorICAgIHByb3RlY3RlZCBHTCBnZXRHTCgpIHsKKyAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgfQotICAgIAorCiAgICAgLyoqCi0gICAgICogUmV0dXJuIHRoZSBHTCBvYmplY3QgYXNzb2NpYXRlZCB3aXRoIHRoaXMgY2FudmFzLCBvciBudWxsIGlmIGl0IGlzIG5vdAotICAgICAqIGJhY2tlZCBieSBHTC4KKyAgICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGlzIENhbnZhcyB1c2VzIGhhcmR3YXJlIGFjY2VsZXJhdGlvbi4KKyAgICAgKiAKKyAgICAgKiBOb3RlIHRoYXQgdGhpcyBtZXRob2QgZG9lcyBub3QgZGVmaW5lIHdoYXQgdHlwZSBvZiBoYXJkd2FyZSBhY2NlbGVyYXRpb24KKyAgICAgKiBtYXkgb3IgbWF5IG5vdCBiZSB1c2VkLgorICAgICAqIAorICAgICAqIEByZXR1cm4gVHJ1ZSBpZiBkcmF3aW5nIG9wZXJhdGlvbnMgYXJlIGhhcmR3YXJlIGFjY2VsZXJhdGVkLAorICAgICAqICAgICAgICAgZmFsc2Ugb3RoZXJ3aXNlLgogICAgICAqLwotICAgIHB1YmxpYyBHTCBnZXRHTCgpIHsKLSAgICAgICAgcmV0dXJuIG1HTDsKKyAgICBwdWJsaWMgYm9vbGVhbiBpc0hhcmR3YXJlQWNjZWxlcmF0ZWQoKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogQ2FsbCB0aGlzIHRvIGZyZWUgdXAgT3BlbkdMIHJlc291cmNlcyB0aGF0IG1heSBiZSBjYWNoZWQgb3IgYWxsb2NhdGVkCi0gICAgICogb24gYmVoYWxmIG9mIHRoZSBDYW52YXMuIEFueSBzdWJzZXF1ZW50IGRyYXdpbmcgd2l0aCBhIEdMLWJhY2tlZCBDYW52YXMKLSAgICAgKiB3aWxsIGhhdmUgdG8gcmVjcmVhdGUgdGhvc2UgcmVzb3VyY2VzLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBmcmVlR2xDYWNoZXMoKSB7Ci0gICAgICAgIGZyZWVDYWNoZXMoKTsKLSAgICB9Ci0gICAgICAgIAorCiAgICAgLyoqCiAgICAgICogU3BlY2lmeSBhIGJpdG1hcCBmb3IgdGhlIGNhbnZhcyB0byBkcmF3IGludG8uICBBcyBhIHNpZGUtZWZmZWN0LCBhbHNvCiAgICAgICogdXBkYXRlcyB0aGUgY2FudmFzJ3MgdGFyZ2V0IGRlbnNpdHkgdG8gbWF0Y2ggdGhhdCBvZiB0aGUgYml0bWFwLgpAQCAtMTQzLDcgKzE0OSw3IEBACiAgICAgICAgIGlmICghYml0bWFwLmlzTXV0YWJsZSgpKSB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7CiAgICAgICAgIH0KLSAgICAgICAgaWYgKG1HTCAhPSBudWxsKSB7CisgICAgICAgIGlmIChpc0hhcmR3YXJlQWNjZWxlcmF0ZWQoKSkgewogICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIkNhbid0IHNldCBhIGJpdG1hcCBkZXZpY2Ugb24gYSBHTCBjYW52YXMiKTsKICAgICAgICAgfQogICAgICAgICB0aHJvd0lmUmVjeWNsZWQoYml0bWFwKTsKQEAgLTE1NywxMyArMTYzLDEyIEBACiAgICAgICogU2V0IHRoZSB2aWV3cG9ydCBkaW1lbnNpb25zIGlmIHRoaXMgY2FudmFzIGlzIEdMIGJhc2VkLiBJZiBpdCBpcyBub3QsCiAgICAgICogdGhpcyBtZXRob2QgaXMgaWdub3JlZCBhbmQgbm8gZXhjZXB0aW9uIGlzIHRocm93bi4KICAgICAgKgotICAgICAqICBAcGFyYW0gd2lkdGggICAgVGhlIHdpZHRoIG9mIHRoZSB2aWV3cG9ydAotICAgICAqICBAcGFyYW0gaGVpZ2h0ICAgVGhlIGhlaWdodCBvZiB0aGUgdmlld3BvcnQKKyAgICAgKiBAcGFyYW0gd2lkdGggVGhlIHdpZHRoIG9mIHRoZSB2aWV3cG9ydAorICAgICAqIEBwYXJhbSBoZWlnaHQgVGhlIGhlaWdodCBvZiB0aGUgdmlld3BvcnQKKyAgICAgKiAKKyAgICAgKiBAaGlkZQogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldFZpZXdwb3J0KGludCB3aWR0aCwgaW50IGhlaWdodCkgewotICAgICAgICBpZiAobUdMICE9IG51bGwpIHsKLSAgICAgICAgICAgIG5hdGl2ZVNldFZpZXdwb3J0KG1OYXRpdmVDYW52YXMsIHdpZHRoLCBoZWlnaHQpOwotICAgICAgICB9CiAgICAgfQogCiAgICAgLyoqCkBAIC0zNzcsOCArMzgyLDggQEAKICAgICAgKgogICAgICAqIEBwYXJhbSBzeCBUaGUgYW1vdW50IHRvIHNjYWxlIGluIFgKICAgICAgKiBAcGFyYW0gc3kgVGhlIGFtb3VudCB0byBzY2FsZSBpbiBZCi0gICAgICogQHBhcmFtIHB4IFRoZSB4LWNvb3JkIGZvciB0aGUgcGl2b3QgcG9pbnQgKHVuY2hhbmdlZCBieSB0aGUgcm90YXRpb24pCi0gICAgICogQHBhcmFtIHB5IFRoZSB5LWNvb3JkIGZvciB0aGUgcGl2b3QgcG9pbnQgKHVuY2hhbmdlZCBieSB0aGUgcm90YXRpb24pCisgICAgICogQHBhcmFtIHB4IFRoZSB4LWNvb3JkIGZvciB0aGUgcGl2b3QgcG9pbnQgKHVuY2hhbmdlZCBieSB0aGUgc2NhbGUpCisgICAgICogQHBhcmFtIHB5IFRoZSB5LWNvb3JkIGZvciB0aGUgcGl2b3QgcG9pbnQgKHVuY2hhbmdlZCBieSB0aGUgc2NhbGUpCiAgICAgICovCiAgICAgcHVibGljIGZpbmFsIHZvaWQgc2NhbGUoZmxvYXQgc3gsIGZsb2F0IHN5LCBmbG9hdCBweCwgZmxvYXQgcHkpIHsKICAgICAgICAgdHJhbnNsYXRlKHB4LCBweSk7CkBAIC02MjEsNyArNjI2LDExIEBACiAgICAgICAgIEVkZ2VUeXBlKGludCBuYXRpdmVJbnQpIHsKICAgICAgICAgICAgIHRoaXMubmF0aXZlSW50ID0gbmF0aXZlSW50OwogICAgICAgICB9Ci0gICAgICAgIGZpbmFsIGludCBuYXRpdmVJbnQ7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBoaWRlCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgZmluYWwgaW50IG5hdGl2ZUludDsKICAgICB9CiAKICAgICAvKioKQEAgLTk1OCw2ICs5NjcsMjEgQEAKICAgICB9CiAKICAgICAvKioKKyAgICAgKiBEcmF3cyB0aGUgc3BlY2lmaWVkIGJpdG1hcCBhcyBhbiBOLXBhdGNoIChtb3N0IG9mdGVuLCBhIDktcGF0Y2hlcy4pCisgICAgICoKKyAgICAgKiBOb3RlOiBPbmx5IHN1cHBvcnRlZCBieSBoYXJkd2FyZSBhY2NlbGVyYXRlZCBjYW52YXMgYXQgdGhlIG1vbWVudC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBiaXRtYXAgVGhlIGJpdG1hcCB0byBkcmF3IGFzIGFuIE4tcGF0Y2gKKyAgICAgKiBAcGFyYW0gY2h1bmtzIFRoZSBwYXRjaGVzIGluZm9ybWF0aW9uIChtYXRjaGVzIHRoZSBuYXRpdmUgc3RydWN0IFJlc19wbmdfOXBhdGNoKQorICAgICAqIEBwYXJhbSBkc3QgVGhlIGRlc3RpbmF0aW9uIHJlY3RhbmdsZS4KKyAgICAgKiBAcGFyYW0gcGFpbnQgVGhlIHBhaW50IHRvIGRyYXcgdGhlIGJpdG1hcCB3aXRoLiBtYXkgYmUgbnVsbAorICAgICAqIAorICAgICAqIEBoaWRlCisgICAgICovCisgICAgcHVibGljIHZvaWQgZHJhd1BhdGNoKEJpdG1hcCBiaXRtYXAsIGJ5dGVbXSBjaHVua3MsIFJlY3RGIGRzdCwgUGFpbnQgcGFpbnQpIHsKKyAgICB9ICAgIAorICAgIAorICAgIC8qKgogICAgICAqIERyYXcgdGhlIHNwZWNpZmllZCBiaXRtYXAsIHdpdGggaXRzIHRvcC9sZWZ0IGNvcm5lciBhdCAoeCx5KSwgdXNpbmcKICAgICAgKiB0aGUgc3BlY2lmaWVkIHBhaW50LCB0cmFuc2Zvcm1lZCBieSB0aGUgY3VycmVudCBtYXRyaXguCiAgICAgICogCkBAIC0xMjQ2LDggKzEyNzAsOCBAQAogICAgICAgICAgICAgKHRleHQubGVuZ3RoIC0gaW5kZXggLSBjb3VudCkpIDwgMCkgewogICAgICAgICAgICAgdGhyb3cgbmV3IEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24oKTsKICAgICAgICAgfQotICAgICAgICBuYXRpdmVfZHJhd1RleHQobU5hdGl2ZUNhbnZhcywgdGV4dCwgaW5kZXgsIGNvdW50LCB4LCB5LAotICAgICAgICAgICAgICAgICAgICAgICAgcGFpbnQubU5hdGl2ZVBhaW50KTsKKyAgICAgICAgbmF0aXZlX2RyYXdUZXh0KG1OYXRpdmVDYW52YXMsIHRleHQsIGluZGV4LCBjb3VudCwgeCwgeSwgcGFpbnQubUJpZGlGbGFncywKKyAgICAgICAgICAgICAgICBwYWludC5tTmF0aXZlUGFpbnQpOwogICAgIH0KIAogICAgIC8qKgpAQCAtMTI1OSw3ICsxMjgzLDEwIEBACiAgICAgICogQHBhcmFtIHkgICAgIFRoZSB5LWNvb3JkaW5hdGUgb2YgdGhlIG9yaWdpbiBvZiB0aGUgdGV4dCBiZWluZyBkcmF3bgogICAgICAqIEBwYXJhbSBwYWludCBUaGUgcGFpbnQgdXNlZCBmb3IgdGhlIHRleHQgKGUuZy4gY29sb3IsIHNpemUsIHN0eWxlKQogICAgICAqLwotICAgIHB1YmxpYyBuYXRpdmUgdm9pZCBkcmF3VGV4dChTdHJpbmcgdGV4dCwgZmxvYXQgeCwgZmxvYXQgeSwgUGFpbnQgcGFpbnQpOworICAgIHB1YmxpYyB2b2lkIGRyYXdUZXh0KFN0cmluZyB0ZXh0LCBmbG9hdCB4LCBmbG9hdCB5LCBQYWludCBwYWludCkgeworICAgICAgICBuYXRpdmVfZHJhd1RleHQobU5hdGl2ZUNhbnZhcywgdGV4dCwgMCwgdGV4dC5sZW5ndGgoKSwgeCwgeSwgcGFpbnQubUJpZGlGbGFncywKKyAgICAgICAgICAgICAgICBwYWludC5tTmF0aXZlUGFpbnQpOworICAgIH0KIAogICAgIC8qKgogICAgICAqIERyYXcgdGhlIHRleHQsIHdpdGggb3JpZ2luIGF0ICh4LHkpLCB1c2luZyB0aGUgc3BlY2lmaWVkIHBhaW50LgpAQCAtMTI3Nyw4ICsxMzA0LDggQEAKICAgICAgICAgaWYgKChzdGFydCB8IGVuZCB8IChlbmQgLSBzdGFydCkgfCAodGV4dC5sZW5ndGgoKSAtIGVuZCkpIDwgMCkgewogICAgICAgICAgICAgdGhyb3cgbmV3IEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24oKTsKICAgICAgICAgfQotICAgICAgICBuYXRpdmVfZHJhd1RleHQobU5hdGl2ZUNhbnZhcywgdGV4dCwgc3RhcnQsIGVuZCwgeCwgeSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHBhaW50Lm1OYXRpdmVQYWludCk7CisgICAgICAgIG5hdGl2ZV9kcmF3VGV4dChtTmF0aXZlQ2FudmFzLCB0ZXh0LCBzdGFydCwgZW5kLCB4LCB5LCBwYWludC5tQmlkaUZsYWdzLAorICAgICAgICAgICAgICAgIHBhaW50Lm1OYXRpdmVQYWludCk7CiAgICAgfQogCiAgICAgLyoqCkBAIC0xMjk5LDE2ICsxMzI2LDEwOCBAQAogICAgICAgICBpZiAodGV4dCBpbnN0YW5jZW9mIFN0cmluZyB8fCB0ZXh0IGluc3RhbmNlb2YgU3Bhbm5lZFN0cmluZyB8fAogICAgICAgICAgICAgdGV4dCBpbnN0YW5jZW9mIFNwYW5uYWJsZVN0cmluZykgewogICAgICAgICAgICAgbmF0aXZlX2RyYXdUZXh0KG1OYXRpdmVDYW52YXMsIHRleHQudG9TdHJpbmcoKSwgc3RhcnQsIGVuZCwgeCwgeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWludC5tTmF0aXZlUGFpbnQpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKHRleHQgaW5zdGFuY2VvZiBHcmFwaGljc09wZXJhdGlvbnMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWludC5tQmlkaUZsYWdzLCBwYWludC5tTmF0aXZlUGFpbnQpOworICAgICAgICB9IGVsc2UgaWYgKHRleHQgaW5zdGFuY2VvZiBHcmFwaGljc09wZXJhdGlvbnMpIHsKICAgICAgICAgICAgICgoR3JhcGhpY3NPcGVyYXRpb25zKSB0ZXh0KS5kcmF3VGV4dCh0aGlzLCBzdGFydCwgZW5kLCB4LCB5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWludCk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7CisgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBjaGFyW10gYnVmID0gVGVtcG9yYXJ5QnVmZmVyLm9idGFpbihlbmQgLSBzdGFydCk7CiAgICAgICAgICAgICBUZXh0VXRpbHMuZ2V0Q2hhcnModGV4dCwgc3RhcnQsIGVuZCwgYnVmLCAwKTsKLSAgICAgICAgICAgIGRyYXdUZXh0KGJ1ZiwgMCwgZW5kIC0gc3RhcnQsIHgsIHksIHBhaW50KTsKKyAgICAgICAgICAgIG5hdGl2ZV9kcmF3VGV4dChtTmF0aXZlQ2FudmFzLCBidWYsIDAsIGVuZCAtIHN0YXJ0LCB4LCB5LCAKKyAgICAgICAgICAgICAgICAgICAgcGFpbnQubUJpZGlGbGFncywgcGFpbnQubU5hdGl2ZVBhaW50KTsKKyAgICAgICAgICAgIFRlbXBvcmFyeUJ1ZmZlci5yZWN5Y2xlKGJ1Zik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZW5kZXIgYSBydW4gb2YgYWxsIExUUiBvciBhbGwgUlRMIHRleHQsIHdpdGggc2hhcGluZy4gVGhpcyBkb2VzIG5vdCBydW4KKyAgICAgKiBiaWRpIG9uIHRoZSBwcm92aWRlZCB0ZXh0LCBidXQgcmVuZGVycyBpdCBhcyBhIHVuaWZvcm0gcmlnaHQtdG8tbGVmdCBvcgorICAgICAqIGxlZnQtdG8tcmlnaHQgcnVuLCBhcyBpbmRpY2F0ZWQgYnkgZGlyLiBBbGlnbm1lbnQgb2YgdGhlIHRleHQgaXMgYXMKKyAgICAgKiBkZXRlcm1pbmVkIGJ5IHRoZSBQYWludCdzIFRleHRBbGlnbiB2YWx1ZS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gdGV4dCB0aGUgdGV4dCB0byByZW5kZXIKKyAgICAgKiBAcGFyYW0gaW5kZXggdGhlIHN0YXJ0IG9mIHRoZSB0ZXh0IHRvIHJlbmRlcgorICAgICAqIEBwYXJhbSBjb3VudCB0aGUgY291bnQgb2YgY2hhcnMgdG8gcmVuZGVyCisgICAgICogQHBhcmFtIGNvbnRleHRJbmRleCB0aGUgc3RhcnQgb2YgdGhlIGNvbnRleHQgZm9yIHNoYXBpbmcuICBNdXN0IGJlCisgICAgICogICAgICAgICBubyBncmVhdGVyIHRoYW4gaW5kZXguCisgICAgICogQHBhcmFtIGNvbnRleHRDb3VudCB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgaW4gdGhlIGNvbnRleHQgZm9yIHNoYXBpbmcuCisgICAgICogICAgICAgICBDb250ZXhJbmRleCArIGNvbnRleHRDb3VudCBtdXN0IGJlIG5vIGxlc3MgdGhhbiBpbmRleAorICAgICAqICAgICAgICAgKyBjb3VudC4KKyAgICAgKiBAcGFyYW0geCB0aGUgeCBwb3NpdGlvbiBhdCB3aGljaCB0byBkcmF3IHRoZSB0ZXh0CisgICAgICogQHBhcmFtIHkgdGhlIHkgcG9zaXRpb24gYXQgd2hpY2ggdG8gZHJhdyB0aGUgdGV4dAorICAgICAqIEBwYXJhbSBkaXIgdGhlIHJ1biBkaXJlY3Rpb24sIGVpdGhlciB7QGxpbmsgI0RJUkVDVElPTl9MVFJ9IG9yCisgICAgICogICAgICAgICB7QGxpbmsgI0RJUkVDVElPTl9SVEx9LgorICAgICAqIEBwYXJhbSBwYWludCB0aGUgcGFpbnQKKyAgICAgKiBAaGlkZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGRyYXdUZXh0UnVuKGNoYXJbXSB0ZXh0LCBpbnQgaW5kZXgsIGludCBjb3VudCwKKyAgICAgICAgICAgIGludCBjb250ZXh0SW5kZXgsIGludCBjb250ZXh0Q291bnQsIGZsb2F0IHgsIGZsb2F0IHksIGludCBkaXIsCisgICAgICAgICAgICBQYWludCBwYWludCkgeworCisgICAgICAgIGlmICh0ZXh0ID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigidGV4dCBpcyBudWxsIik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHBhaW50ID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigicGFpbnQgaXMgbnVsbCIpOworICAgICAgICB9CisgICAgICAgIGlmICgoaW5kZXggfCBjb3VudCB8IHRleHQubGVuZ3RoIC0gaW5kZXggLSBjb3VudCkgPCAwKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbigpOworICAgICAgICB9CisgICAgICAgIGlmIChkaXIgIT0gRElSRUNUSU9OX0xUUiAmJiBkaXIgIT0gRElSRUNUSU9OX1JUTCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigidW5rbm93biBkaXI6ICIgKyBkaXIpOworICAgICAgICB9CisKKyAgICAgICAgbmF0aXZlX2RyYXdUZXh0UnVuKG1OYXRpdmVDYW52YXMsIHRleHQsIGluZGV4LCBjb3VudCwKKyAgICAgICAgICAgICAgICBjb250ZXh0SW5kZXgsIGNvbnRleHRDb3VudCwgeCwgeSwgZGlyLCBwYWludC5tTmF0aXZlUGFpbnQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlbmRlciBhIHJ1biBvZiBhbGwgTFRSIG9yIGFsbCBSVEwgdGV4dCwgd2l0aCBzaGFwaW5nLiBUaGlzIGRvZXMgbm90IHJ1bgorICAgICAqIGJpZGkgb24gdGhlIHByb3ZpZGVkIHRleHQsIGJ1dCByZW5kZXJzIGl0IGFzIGEgdW5pZm9ybSByaWdodC10by1sZWZ0IG9yCisgICAgICogbGVmdC10by1yaWdodCBydW4sIGFzIGluZGljYXRlZCBieSBkaXIuIEFsaWdubWVudCBvZiB0aGUgdGV4dCBpcyBhcworICAgICAqIGRldGVybWluZWQgYnkgdGhlIFBhaW50J3MgVGV4dEFsaWduIHZhbHVlLgorICAgICAqCisgICAgICogQHBhcmFtIHRleHQgdGhlIHRleHQgdG8gcmVuZGVyCisgICAgICogQHBhcmFtIHN0YXJ0IHRoZSBzdGFydCBvZiB0aGUgdGV4dCB0byByZW5kZXIuIERhdGEgYmVmb3JlIHRoaXMgcG9zaXRpb24KKyAgICAgKiAgICAgICAgICAgIGNhbiBiZSB1c2VkIGZvciBzaGFwaW5nIGNvbnRleHQuCisgICAgICogQHBhcmFtIGVuZCB0aGUgZW5kIG9mIHRoZSB0ZXh0IHRvIHJlbmRlci4gRGF0YSBhdCBvciBhZnRlciB0aGlzCisgICAgICogICAgICAgICAgICBwb3NpdGlvbiBjYW4gYmUgdXNlZCBmb3Igc2hhcGluZyBjb250ZXh0LgorICAgICAqIEBwYXJhbSB4IHRoZSB4IHBvc2l0aW9uIGF0IHdoaWNoIHRvIGRyYXcgdGhlIHRleHQKKyAgICAgKiBAcGFyYW0geSB0aGUgeSBwb3NpdGlvbiBhdCB3aGljaCB0byBkcmF3IHRoZSB0ZXh0CisgICAgICogQHBhcmFtIGRpciB0aGUgcnVuIGRpcmVjdGlvbiwgZWl0aGVyIDAgZm9yIExUUiBvciAxIGZvciBSVEwuCisgICAgICogQHBhcmFtIHBhaW50IHRoZSBwYWludAorICAgICAqIEBoaWRlCisgICAgICovCisgICAgcHVibGljIHZvaWQgZHJhd1RleHRSdW4oQ2hhclNlcXVlbmNlIHRleHQsIGludCBzdGFydCwgaW50IGVuZCwKKyAgICAgICAgICAgIGludCBjb250ZXh0U3RhcnQsIGludCBjb250ZXh0RW5kLCBmbG9hdCB4LCBmbG9hdCB5LCBpbnQgZGlyLAorICAgICAgICAgICAgUGFpbnQgcGFpbnQpIHsKKworICAgICAgICBpZiAodGV4dCA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oInRleHQgaXMgbnVsbCIpOworICAgICAgICB9CisgICAgICAgIGlmIChwYWludCA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oInBhaW50IGlzIG51bGwiKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoKHN0YXJ0IHwgZW5kIHwgZW5kIC0gc3RhcnQgfCB0ZXh0Lmxlbmd0aCgpIC0gZW5kKSA8IDApIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKworICAgICAgICBpbnQgZmxhZ3MgPSBkaXIgPT0gMCA/IDAgOiAxOworCisgICAgICAgIGlmICh0ZXh0IGluc3RhbmNlb2YgU3RyaW5nIHx8IHRleHQgaW5zdGFuY2VvZiBTcGFubmVkU3RyaW5nIHx8CisgICAgICAgICAgICAgICAgdGV4dCBpbnN0YW5jZW9mIFNwYW5uYWJsZVN0cmluZykgeworICAgICAgICAgICAgbmF0aXZlX2RyYXdUZXh0UnVuKG1OYXRpdmVDYW52YXMsIHRleHQudG9TdHJpbmcoKSwgc3RhcnQsIGVuZCwKKyAgICAgICAgICAgICAgICAgICAgY29udGV4dFN0YXJ0LCBjb250ZXh0RW5kLCB4LCB5LCBmbGFncywgcGFpbnQubU5hdGl2ZVBhaW50KTsKKyAgICAgICAgfSBlbHNlIGlmICh0ZXh0IGluc3RhbmNlb2YgR3JhcGhpY3NPcGVyYXRpb25zKSB7CisgICAgICAgICAgICAoKEdyYXBoaWNzT3BlcmF0aW9ucykgdGV4dCkuZHJhd1RleHRSdW4odGhpcywgc3RhcnQsIGVuZCwKKyAgICAgICAgICAgICAgICAgICAgY29udGV4dFN0YXJ0LCBjb250ZXh0RW5kLCB4LCB5LCBmbGFncywgcGFpbnQpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaW50IGNvbnRleHRMZW4gPSBjb250ZXh0RW5kIC0gY29udGV4dFN0YXJ0OworICAgICAgICAgICAgaW50IGxlbiA9IGVuZCAtIHN0YXJ0OworICAgICAgICAgICAgY2hhcltdIGJ1ZiA9IFRlbXBvcmFyeUJ1ZmZlci5vYnRhaW4oY29udGV4dExlbik7CisgICAgICAgICAgICBUZXh0VXRpbHMuZ2V0Q2hhcnModGV4dCwgY29udGV4dFN0YXJ0LCBjb250ZXh0RW5kLCBidWYsIDApOworICAgICAgICAgICAgbmF0aXZlX2RyYXdUZXh0UnVuKG1OYXRpdmVDYW52YXMsIGJ1Ziwgc3RhcnQgLSBjb250ZXh0U3RhcnQsIGxlbiwKKyAgICAgICAgICAgICAgICAgICAgMCwgY29udGV4dExlbiwgeCwgeSwgZmxhZ3MsIHBhaW50Lm1OYXRpdmVQYWludCk7CiAgICAgICAgICAgICBUZW1wb3JhcnlCdWZmZXIucmVjeWNsZShidWYpOwogICAgICAgICB9CiAgICAgfQpAQCAtMTM2OCw3ICsxNDg3LDcgQEAKICAgICAgICAgfQogICAgICAgICBuYXRpdmVfZHJhd1RleHRPblBhdGgobU5hdGl2ZUNhbnZhcywgdGV4dCwgaW5kZXgsIGNvdW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0aC5uaSgpLCBoT2Zmc2V0LCB2T2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFpbnQubU5hdGl2ZVBhaW50KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhaW50Lm1CaWRpRmxhZ3MsIHBhaW50Lm1OYXRpdmVQYWludCk7CiAgICAgfQogCiAgICAgLyoqCkBAIC0xMzg4LDcgKzE1MDcsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHZPZmZzZXQsIFBhaW50IHBhaW50KSB7CiAgICAgICAgIGlmICh0ZXh0Lmxlbmd0aCgpID4gMCkgewogICAgICAgICAgICAgbmF0aXZlX2RyYXdUZXh0T25QYXRoKG1OYXRpdmVDYW52YXMsIHRleHQsIHBhdGgubmkoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoT2Zmc2V0LCB2T2Zmc2V0LCBwYWludC5tTmF0aXZlUGFpbnQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhPZmZzZXQsIHZPZmZzZXQsIHBhaW50Lm1CaWRpRmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFpbnQubU5hdGl2ZVBhaW50KTsKICAgICAgICAgfQogICAgIH0KIApAQCAtMTQzMSwyOCArMTU1MSw3NCBAQAogICAgICAgICBkcmF3UGljdHVyZShwaWN0dXJlKTsKICAgICAgICAgcmVzdG9yZSgpOwogICAgIH0KLSAgICAKKworICAgIC8qKgorICAgICAqIDxwPkFjcXVpcmVzIHRoZSBDYW52YXMgY29udGV4dC4gQWZ0ZXIgaW52b2tpbmcgdGhpcyBtZXRob2QsIHRoZSBDYW52YXMKKyAgICAgKiBjb250ZXh0ICBjYW4gYmUgbW9kaWZpZWQgYnkgdGhlIGNhbGxlci4gRm9yIGluc3RhbmNlLCBpZiB5b3UgYWNxdWlyZQorICAgICAqIHRoZSBjb250ZXh0IG9mIGFuIE9wZW5HTCBDYW52YXMgeW91IGNhbiByZXNldCB0aGUgR0wgdmlld3BvcnQsIHNjaXNzb3IsCisgICAgICogZXRjLjwvcD4KKyAgICAgKiAKKyAgICAgKiA8cD5BIGNhbGwgdG8ge0BsaW5rICNhY3F1aXJlQ29udGV4dCgpfSBzaG91bGQgYXdheXMgYmUgZm9sbG93ZWQgYnkKKyAgICAgKiBhIGNhbGwgdG8ge0BsaW5rICNyZWxlYXNlQ29udGV4dCgpfSwgcHJlZmVycmFibHkgdXNpbmcgYSB0cnkgYmxvY2s6PC9wPgorICAgICAqIAorICAgICAqIDxwcmU+CisgICAgICogdHJ5IHsKKyAgICAgKiAgICAgaWYgKGNhbnZhcy5hY3F1aXJlQ29udGV4dCgpKSB7CisgICAgICogICAgICAgICAvLyBVc2UgdGhlIGNhbnZhcyBhbmQvb3IgaXRzIGNvbnRleHQKKyAgICAgKiAgICAgfQorICAgICAqIH0gZmluYWxseSB7CisgICAgICogICAgIGNhbnZhcy5yZWxlYXNlQ29udGV4dCgpOworICAgICAqIH0KKyAgICAgKiA8L3ByZT4KKyAgICAgKiAKKyAgICAgKiA8cD5BY3F1aXJpbmcgdGhlIGNvbnRleHQgY2FuIGJlIGFuIGV4cGVuc2l2ZSBvcGVyYXRpb24gYW5kIHNob3VsZCBub3QKKyAgICAgKiBiZSBkb25lIHVubGVzcyBhYnNvbHV0ZWx5IG5lY2Vzc2FyeS48L3A+CisgICAgICogCisgICAgICogPHA+QXBwbGljYXRpb25zIHNob3VsZCBuZXZlciBpbnZva2UgdGhpcyBtZXRob2QgZGlyZWN0bHkuPC9wPgorICAgICAqIAorICAgICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgY29udGV4dCBjb3VsZCBiZSBhY3F1aXJlZCBzdWNjZXNzZnVsbHksIGZhbHNlCisgICAgICogICAgICAgICBvdGhlcndpc2UgKGlmIHRoZSBjb250ZXh0IGlzIGFscmVhZHkgYWNxdWlyZWQgZm9yIGluc3RhbmNlLikKKyAgICAgKiAKKyAgICAgKiBAc2VlICNyZWxlYXNlQ29udGV4dCgpIAorICAgICAqIAorICAgICAqIEBoaWRlCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gYWNxdWlyZUNvbnRleHQoKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiA8cD5SZWxlYXNlIHRoZSBjb250ZXh0IGFjcXVpcmVkIHdpdGgge0BsaW5rICNhY3F1aXJlQ29udGV4dCgpfS48L3A+CisgICAgICogCisgICAgICogQHNlZSAjYWNxdWlyZUNvbnRleHQoKSAKKyAgICAgKiAKKyAgICAgKiBAaGlkZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJlbGVhc2VDb250ZXh0KCkgeworICAgIH0KKworICAgIEBPdmVycmlkZQogICAgIHByb3RlY3RlZCB2b2lkIGZpbmFsaXplKCkgdGhyb3dzIFRocm93YWJsZSB7Ci0gICAgICAgIHN1cGVyLmZpbmFsaXplKCk7Ci0gICAgICAgIC8vIElmIHRoZSBjb25zdHJ1Y3RvciB0aHJldyBhbiBleGNlcHRpb24gYmVmb3JlIHNldHRpbmcgbU5hdGl2ZUNhbnZhcywgdGhlIG5hdGl2ZSBmaW5hbGl6ZXIKLSAgICAgICAgLy8gbXVzdCBub3QgYmUgaW52b2tlZC4KLSAgICAgICAgaWYgKG1OYXRpdmVDYW52YXMgIT0gMCkgewotICAgICAgICAgICAgZmluYWxpemVyKG1OYXRpdmVDYW52YXMpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgc3VwZXIuZmluYWxpemUoKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIC8vIElmIHRoZSBjb25zdHJ1Y3RvciB0aHJldyBhbiBleGNlcHRpb24gYmVmb3JlIHNldHRpbmcgbU5hdGl2ZUNhbnZhcywKKyAgICAgICAgICAgIC8vIHRoZSBuYXRpdmUgZmluYWxpemVyIG11c3Qgbm90IGJlIGludm9rZWQuCisgICAgICAgICAgICBpZiAobU5hdGl2ZUNhbnZhcyAhPSAwKSB7CisgICAgICAgICAgICAgICAgZmluYWxpemVyKG1OYXRpdmVDYW52YXMpOworICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogRnJlZSB1cCBhcyBtdWNoIG1lbW9yeSBhcyBwb3NzaWJsZSBmcm9tIHByaXZhdGUgY2FjaGVzIChlLmcuIGZvbnRzLAotICAgICAqIGltYWdlcykKKyAgICAgKiBGcmVlIHVwIGFzIG11Y2ggbWVtb3J5IGFzIHBvc3NpYmxlIGZyb20gcHJpdmF0ZSBjYWNoZXMgKGUuZy4gZm9udHMsIGltYWdlcykKICAgICAgKgotICAgICAqIEBoaWRlIC0gZm9yIG5vdworICAgICAqIEBoaWRlCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBuYXRpdmUgdm9pZCBmcmVlQ2FjaGVzKCk7CiAKICAgICBwcml2YXRlIHN0YXRpYyBuYXRpdmUgaW50IGluaXRSYXN0ZXIoaW50IG5hdGl2ZUJpdG1hcE9yWmVybyk7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIGludCBpbml0R0woKTsKICAgICBwcml2YXRlIHN0YXRpYyBuYXRpdmUgdm9pZCBuYXRpdmVfc2V0Qml0bWFwKGludCBuYXRpdmVDYW52YXMsIGludCBiaXRtYXApOwotICAgIHByaXZhdGUgc3RhdGljIG5hdGl2ZSB2b2lkIG5hdGl2ZVNldFZpZXdwb3J0KGludCBuQ2FudmFzLCBpbnQgdywgaW50IGgpOwogICAgIHByaXZhdGUgc3RhdGljIG5hdGl2ZSBpbnQgbmF0aXZlX3NhdmVMYXllcihpbnQgbmF0aXZlQ2FudmFzLCBSZWN0RiBib3VuZHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwYWludCwgaW50IGxheWVyRmxhZ3MpOwogICAgIHByaXZhdGUgc3RhdGljIG5hdGl2ZSBpbnQgbmF0aXZlX3NhdmVMYXllcihpbnQgbmF0aXZlQ2FudmFzLCBmbG9hdCBsLApAQCAtMTU1NSwxMCArMTcyMSwxOSBAQAogICAgIAogICAgIHByaXZhdGUgc3RhdGljIG5hdGl2ZSB2b2lkIG5hdGl2ZV9kcmF3VGV4dChpbnQgbmF0aXZlQ2FudmFzLCBjaGFyW10gdGV4dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4LCBpbnQgY291bnQsIGZsb2F0IHgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHksIGludCBwYWludCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHksIGludCBmbGFncywgaW50IHBhaW50KTsKICAgICBwcml2YXRlIHN0YXRpYyBuYXRpdmUgdm9pZCBuYXRpdmVfZHJhd1RleHQoaW50IG5hdGl2ZUNhbnZhcywgU3RyaW5nIHRleHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdGFydCwgaW50IGVuZCwgZmxvYXQgeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgeSwgaW50IHBhaW50KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgeSwgaW50IGZsYWdzLCBpbnQgcGFpbnQpOworCisgICAgcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIHZvaWQgbmF0aXZlX2RyYXdUZXh0UnVuKGludCBuYXRpdmVDYW52YXMsIFN0cmluZyB0ZXh0LAorICAgICAgICAgICAgaW50IHN0YXJ0LCBpbnQgZW5kLCBpbnQgY29udGV4dFN0YXJ0LCBpbnQgY29udGV4dEVuZCwKKyAgICAgICAgICAgIGZsb2F0IHgsIGZsb2F0IHksIGludCBmbGFncywgaW50IHBhaW50KTsKKworICAgIHByaXZhdGUgc3RhdGljIG5hdGl2ZSB2b2lkIG5hdGl2ZV9kcmF3VGV4dFJ1bihpbnQgbmF0aXZlQ2FudmFzLCBjaGFyW10gdGV4dCwKKyAgICAgICAgICAgIGludCBzdGFydCwgaW50IGNvdW50LCBpbnQgY29udGV4dFN0YXJ0LCBpbnQgY29udGV4dENvdW50LAorICAgICAgICAgICAgZmxvYXQgeCwgZmxvYXQgeSwgaW50IGZsYWdzLCBpbnQgcGFpbnQpOworCiAgICAgcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIHZvaWQgbmF0aXZlX2RyYXdQb3NUZXh0KGludCBuYXRpdmVDYW52YXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXJbXSB0ZXh0LCBpbnQgaW5kZXgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjb3VudCwgZmxvYXRbXSBwb3MsCkBAIC0xNTcwLDExICsxNzQ1LDEzIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXJbXSB0ZXh0LCBpbnQgaW5kZXgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjb3VudCwgaW50IHBhdGgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGhPZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHZPZmZzZXQsIGludCBwYWludCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHZPZmZzZXQsIGludCBiaWRpRmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwYWludCk7CiAgICAgcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIHZvaWQgbmF0aXZlX2RyYXdUZXh0T25QYXRoKGludCBuYXRpdmVDYW52YXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyB0ZXh0LCBpbnQgcGF0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgaE9mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgdk9mZnNldCwgaW50IHBhaW50KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgaE9mZnNldCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHZPZmZzZXQsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZmxhZ3MsIGludCBwYWludCk7CiAgICAgcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIHZvaWQgbmF0aXZlX2RyYXdQaWN0dXJlKGludCBuYXRpdmVDYW52YXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBuYXRpdmVQaWN0dXJlKTsKICAgICBwcml2YXRlIHN0YXRpYyBuYXRpdmUgdm9pZCBmaW5hbGl6ZXIoaW50IG5hdGl2ZUNhbnZhcyk7CmRpZmYgLS1naXQgYS9ncmFwaGljcy9qYXZhL2FuZHJvaWQvZ3JhcGhpY3MvQ29sb3JGaWx0ZXIuamF2YSBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9ncmFwaGljcy9Db2xvckZpbHRlci5qYXZhCmluZGV4IDc2ZjJjN2YuLmU1Y2Y4MzAgMTAwNjQ0Ci0tLSBhL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9ncmFwaGljcy9Db2xvckZpbHRlci5qYXZhCisrKyBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9ncmFwaGljcy9Db2xvckZpbHRlci5qYXZhCkBAIC0yMywxMiArMjMsMjAgQEAKIAogCiBwdWJsaWMgY2xhc3MgQ29sb3JGaWx0ZXIgeworICAgIGludCBuYXRpdmVfaW5zdGFuY2U7CisKKyAgICAvKioKKyAgICAgKiBAaGlkZQorICAgICAqLworICAgIHB1YmxpYyBpbnQgbmF0aXZlQ29sb3JGaWx0ZXI7CiAKICAgICBwcm90ZWN0ZWQgdm9pZCBmaW5hbGl6ZSgpIHRocm93cyBUaHJvd2FibGUgewotICAgICAgICBmaW5hbGl6ZXIobmF0aXZlX2luc3RhbmNlKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHN1cGVyLmZpbmFsaXplKCk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBmaW5hbGl6ZXIobmF0aXZlX2luc3RhbmNlLCBuYXRpdmVDb2xvckZpbHRlcik7CisgICAgICAgIH0KICAgICB9CiAKLSAgICBwcml2YXRlIHN0YXRpYyBuYXRpdmUgdm9pZCBmaW5hbGl6ZXIoaW50IG5hdGl2ZV9pbnN0YW5jZSk7Ci0KLSAgICBpbnQgbmF0aXZlX2luc3RhbmNlOworICAgIHByaXZhdGUgc3RhdGljIG5hdGl2ZSB2b2lkIGZpbmFsaXplcihpbnQgbmF0aXZlX2luc3RhbmNlLCBpbnQgbmF0aXZlQ29sb3JGaWx0ZXIpOwogfQpkaWZmIC0tZ2l0IGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL2dyYXBoaWNzL0NvbG9yTWF0cml4Q29sb3JGaWx0ZXIuamF2YSBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9ncmFwaGljcy9Db2xvck1hdHJpeENvbG9yRmlsdGVyLmphdmEKaW5kZXggNWQ3M2NmZi4uMjQ1YzYxNSAxMDA2NDQKLS0tIGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL2dyYXBoaWNzL0NvbG9yTWF0cml4Q29sb3JGaWx0ZXIuamF2YQorKysgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvZ3JhcGhpY3MvQ29sb3JNYXRyaXhDb2xvckZpbHRlci5qYXZhCkBAIC0yNSw3ICsyNSw5IEBACiAgICAgICogICAgICAgICAgICAgICBpcyBjb25zdHJ1Y3RlZCB3aWxsIG5vdCBiZSByZWZsZWN0ZWQgaW4gdGhlIGZpbHRlci4KICAgICAgKi8KICAgICBwdWJsaWMgQ29sb3JNYXRyaXhDb2xvckZpbHRlcihDb2xvck1hdHJpeCBtYXRyaXgpIHsKLSAgICAgICAgbmF0aXZlX2luc3RhbmNlID0gbmF0aXZlQ29sb3JNYXRyaXhGaWx0ZXIobWF0cml4LmdldEFycmF5KCkpOworICAgICAgICBmaW5hbCBmbG9hdFtdIGNvbG9yTWF0cml4ID0gbWF0cml4LmdldEFycmF5KCk7CisgICAgICAgIG5hdGl2ZV9pbnN0YW5jZSA9IG5hdGl2ZUNvbG9yTWF0cml4RmlsdGVyKGNvbG9yTWF0cml4KTsKKyAgICAgICAgbmF0aXZlQ29sb3JGaWx0ZXIgPSBuQ29sb3JNYXRyaXhGaWx0ZXIoY29sb3JNYXRyaXgpOwogICAgIH0KIAogICAgIC8qKgpAQCAtNDAsNyArNDIsOSBAQAogICAgICAgICAgICAgdGhyb3cgbmV3IEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbigpOwogICAgICAgICB9CiAgICAgICAgIG5hdGl2ZV9pbnN0YW5jZSA9IG5hdGl2ZUNvbG9yTWF0cml4RmlsdGVyKGFycmF5KTsKKyAgICAgICAgbmF0aXZlQ29sb3JGaWx0ZXIgPSBuQ29sb3JNYXRyaXhGaWx0ZXIoYXJyYXkpOwogICAgIH0KIAogICAgIHByaXZhdGUgc3RhdGljIG5hdGl2ZSBpbnQgbmF0aXZlQ29sb3JNYXRyaXhGaWx0ZXIoZmxvYXRbXSBhcnJheSk7CisgICAgcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIGludCBuQ29sb3JNYXRyaXhGaWx0ZXIoZmxvYXRbXSBhcnJheSk7CiB9CmRpZmYgLS1naXQgYS9ncmFwaGljcy9qYXZhL2FuZHJvaWQvZ3JhcGhpY3MvQ29tcG9zZVNoYWRlci5qYXZhIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL2dyYXBoaWNzL0NvbXBvc2VTaGFkZXIuamF2YQppbmRleCBhMDZkMzBiLi44ZDVjOTEzIDEwMDY0NAotLS0gYS9ncmFwaGljcy9qYXZhL2FuZHJvaWQvZ3JhcGhpY3MvQ29tcG9zZVNoYWRlci5qYXZhCisrKyBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9ncmFwaGljcy9Db21wb3NlU2hhZGVyLmphdmEKQEAgLTIwLDYgKzIwLDE0IEBACiAgICAgYW4ge0BsaW5rIGFuZHJvaWQuZ3JhcGhpY3MuWGZlcm1vZGV9IHN1YmNsYXNzLgogKi8KIHB1YmxpYyBjbGFzcyBDb21wb3NlU2hhZGVyIGV4dGVuZHMgU2hhZGVyIHsKKyAgICAvKioKKyAgICAgKiBIb2xkIG9udG8gdGhlIHNoYWRlcnMgdG8gYXZvaWQgR0MuCisgICAgICovCisgICAgQFN1cHByZXNzV2FybmluZ3MoeyJVbnVzZWREZWNsYXJhdGlvbiJ9KQorICAgIHByaXZhdGUgZmluYWwgU2hhZGVyIG1TaGFkZXJBOworICAgIEBTdXBwcmVzc1dhcm5pbmdzKHsiVW51c2VkRGVjbGFyYXRpb24ifSkKKyAgICBwcml2YXRlIGZpbmFsIFNoYWRlciBtU2hhZGVyQjsKKwogICAgIC8qKiBDcmVhdGUgYSBuZXcgY29tcG9zZSBzaGFkZXIsIGdpdmVuIHNoYWRlcnMgQSwgQiwgYW5kIGEgY29tYmluaW5nIG1vZGUuCiAgICAgICAgIFdoZW4gdGhlIG1vZGUgaXMgYXBwbGllZCwgaXQgd2lsbCBiZSBnaXZlbiB0aGUgcmVzdWx0IGZyb20gc2hhZGVyIEEgYXMgaXRzCiAgICAgICAgICJkc3QiLCBhbmQgdGhlIHJlc3VsdCBvZiBmcm9tIHNoYWRlciBCIGFzIGl0cyAic3JjIi4KQEAgLTI5LDggKzM3LDE4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICBpcyBudWxsLCB0aGVuIFNSQ19PVkVSIGlzIGFzc3VtZWQuCiAgICAgKi8KICAgICBwdWJsaWMgQ29tcG9zZVNoYWRlcihTaGFkZXIgc2hhZGVyQSwgU2hhZGVyIHNoYWRlckIsIFhmZXJtb2RlIG1vZGUpIHsKKyAgICAgICAgbVNoYWRlckEgPSBzaGFkZXJBOworICAgICAgICBtU2hhZGVyQiA9IHNoYWRlckI7CiAgICAgICAgIG5hdGl2ZV9pbnN0YW5jZSA9IG5hdGl2ZUNyZWF0ZTEoc2hhZGVyQS5uYXRpdmVfaW5zdGFuY2UsIHNoYWRlckIubmF0aXZlX2luc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtb2RlICE9IG51bGwpID8gbW9kZS5uYXRpdmVfaW5zdGFuY2UgOiAwKTsKKyAgICAgICAgICAgICAgICAobW9kZSAhPSBudWxsKSA/IG1vZGUubmF0aXZlX2luc3RhbmNlIDogMCk7CisgICAgICAgIGlmIChtb2RlIGluc3RhbmNlb2YgUG9ydGVyRHVmZlhmZXJtb2RlKSB7CisgICAgICAgICAgICBQb3J0ZXJEdWZmLk1vZGUgcGRNb2RlID0gKChQb3J0ZXJEdWZmWGZlcm1vZGUpIG1vZGUpLm1vZGU7CisgICAgICAgICAgICBuYXRpdmVfc2hhZGVyID0gbmF0aXZlUG9zdENyZWF0ZTIobmF0aXZlX2luc3RhbmNlLCBzaGFkZXJBLm5hdGl2ZV9zaGFkZXIsCisgICAgICAgICAgICAgICAgICAgIHNoYWRlckIubmF0aXZlX3NoYWRlciwgcGRNb2RlICE9IG51bGwgPyBwZE1vZGUubmF0aXZlSW50IDogMCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBuYXRpdmVfc2hhZGVyID0gbmF0aXZlUG9zdENyZWF0ZTEobmF0aXZlX2luc3RhbmNlLCBzaGFkZXJBLm5hdGl2ZV9zaGFkZXIsCisgICAgICAgICAgICAgICAgICAgIHNoYWRlckIubmF0aXZlX3NoYWRlciwgbW9kZSAhPSBudWxsID8gbW9kZS5uYXRpdmVfaW5zdGFuY2UgOiAwKTsKKyAgICAgICAgfQogICAgIH0KIAogICAgIC8qKiBDcmVhdGUgYSBuZXcgY29tcG9zZSBzaGFkZXIsIGdpdmVuIHNoYWRlcnMgQSwgQiwgYW5kIGEgY29tYmluaW5nIFBvcnRlckR1ZmYgbW9kZS4KQEAgLTQxLDExICs1OSwyMCBAQAogICAgICAgICBAcGFyYW0gbW9kZSAgICAgVGhlIFBvcnRlckR1ZmYgbW9kZSB0aGF0IGNvbWJpbmVzIHRoZSBjb2xvcnMgZnJvbSB0aGUgdHdvIHNoYWRlcnMuCiAgICAgKi8KICAgICBwdWJsaWMgQ29tcG9zZVNoYWRlcihTaGFkZXIgc2hhZGVyQSwgU2hhZGVyIHNoYWRlckIsIFBvcnRlckR1ZmYuTW9kZSBtb2RlKSB7CisgICAgICAgIG1TaGFkZXJBID0gc2hhZGVyQTsKKyAgICAgICAgbVNoYWRlckIgPSBzaGFkZXJCOwogICAgICAgICBuYXRpdmVfaW5zdGFuY2UgPSBuYXRpdmVDcmVhdGUyKHNoYWRlckEubmF0aXZlX2luc3RhbmNlLCBzaGFkZXJCLm5hdGl2ZV9pbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RlLm5hdGl2ZUludCk7CisgICAgICAgICAgICAgICAgbW9kZS5uYXRpdmVJbnQpOworICAgICAgICBuYXRpdmVfc2hhZGVyID0gbmF0aXZlUG9zdENyZWF0ZTIobmF0aXZlX2luc3RhbmNlLCBzaGFkZXJBLm5hdGl2ZV9zaGFkZXIsCisgICAgICAgICAgICAgICAgc2hhZGVyQi5uYXRpdmVfc2hhZGVyLCBtb2RlLm5hdGl2ZUludCk7CiAgICAgfQogCi0gICAgcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIGludCBuYXRpdmVDcmVhdGUxKGludCBuYXRpdmVfc2hhZGVyQSwgaW50IG5hdGl2ZV9zaGFkZXJCLCBpbnQgbmF0aXZlX21vZGUpOwotICAgIHByaXZhdGUgc3RhdGljIG5hdGl2ZSBpbnQgbmF0aXZlQ3JlYXRlMihpbnQgbmF0aXZlX3NoYWRlckEsIGludCBuYXRpdmVfc2hhZGVyQiwgaW50IHBvcnRlckR1ZmZNb2RlKTsKKyAgICBwcml2YXRlIHN0YXRpYyBuYXRpdmUgaW50IG5hdGl2ZUNyZWF0ZTEoaW50IG5hdGl2ZV9zaGFkZXJBLCBpbnQgbmF0aXZlX3NoYWRlckIsCisgICAgICAgICAgICBpbnQgbmF0aXZlX21vZGUpOworICAgIHByaXZhdGUgc3RhdGljIG5hdGl2ZSBpbnQgbmF0aXZlQ3JlYXRlMihpbnQgbmF0aXZlX3NoYWRlckEsIGludCBuYXRpdmVfc2hhZGVyQiwKKyAgICAgICAgICAgIGludCBwb3J0ZXJEdWZmTW9kZSk7CisgICAgcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIGludCBuYXRpdmVQb3N0Q3JlYXRlMShpbnQgbmF0aXZlX3NoYWRlciwgaW50IG5hdGl2ZV9za2lhU2hhZGVyQSwKKyAgICAgICAgICAgIGludCBuYXRpdmVfc2tpYVNoYWRlckIsIGludCBuYXRpdmVfbW9kZSk7CisgICAgcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIGludCBuYXRpdmVQb3N0Q3JlYXRlMihpbnQgbmF0aXZlX3NoYWRlciwgaW50IG5hdGl2ZV9za2lhU2hhZGVyQSwKKyAgICAgICAgICAgIGludCBuYXRpdmVfc2tpYVNoYWRlckIsIGludCBwb3J0ZXJEdWZmTW9kZSk7CiB9Ci0KZGlmZiAtLWdpdCBhL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9ncmFwaGljcy9MaWdodGluZ0NvbG9yRmlsdGVyLmphdmEgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvZ3JhcGhpY3MvTGlnaHRpbmdDb2xvckZpbHRlci5qYXZhCmluZGV4IDU1NjIzODkuLjcxNWNlODYgMTAwNjQ0Ci0tLSBhL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9ncmFwaGljcy9MaWdodGluZ0NvbG9yRmlsdGVyLmphdmEKKysrIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL2dyYXBoaWNzL0xpZ2h0aW5nQ29sb3JGaWx0ZXIuamF2YQpAQCAtMzAsNyArMzAsOSBAQAogICAgICAqLwogICAgIHB1YmxpYyBMaWdodGluZ0NvbG9yRmlsdGVyKGludCBtdWwsIGludCBhZGQpIHsKICAgICAgICAgbmF0aXZlX2luc3RhbmNlID0gbmF0aXZlX0NyZWF0ZUxpZ2h0aW5nRmlsdGVyKG11bCwgYWRkKTsKKyAgICAgICAgbmF0aXZlQ29sb3JGaWx0ZXIgPSBuQ3JlYXRlTGlnaHRpbmdGaWx0ZXIobXVsLCBhZGQpOwogICAgIH0KIAogICAgIHByaXZhdGUgc3RhdGljIG5hdGl2ZSBpbnQgbmF0aXZlX0NyZWF0ZUxpZ2h0aW5nRmlsdGVyKGludCBtdWwsIGludCBhZGQpOworICAgIHByaXZhdGUgc3RhdGljIG5hdGl2ZSBpbnQgbkNyZWF0ZUxpZ2h0aW5nRmlsdGVyKGludCBtdWwsIGludCBhZGQpOwogfQpkaWZmIC0tZ2l0IGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL2dyYXBoaWNzL0xpbmVhckdyYWRpZW50LmphdmEgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvZ3JhcGhpY3MvTGluZWFyR3JhZGllbnQuamF2YQppbmRleCBlM2RiMTA1Li44MmVkMTk5IDEwMDY0NAotLS0gYS9ncmFwaGljcy9qYXZhL2FuZHJvaWQvZ3JhcGhpY3MvTGluZWFyR3JhZGllbnQuamF2YQorKysgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvZ3JhcGhpY3MvTGluZWFyR3JhZGllbnQuamF2YQpAQCAtMTcsNyArMTcsNiBAQAogcGFja2FnZSBhbmRyb2lkLmdyYXBoaWNzOwogCiBwdWJsaWMgY2xhc3MgTGluZWFyR3JhZGllbnQgZXh0ZW5kcyBTaGFkZXIgewotCiAJLyoqCUNyZWF0ZSBhIHNoYWRlciB0aGF0IGRyYXdzIGEgbGluZWFyIGdyYWRpZW50IGFsb25nIGEgbGluZS4KICAgICAgICAgQHBhcmFtIHgwICAgICAgICAgICBUaGUgeC1jb29yZGluYXRlIGZvciB0aGUgc3RhcnQgb2YgdGhlIGdyYWRpZW50IGxpbmUKICAgICAgICAgQHBhcmFtIHkwICAgICAgICAgICBUaGUgeS1jb29yZGluYXRlIGZvciB0aGUgc3RhcnQgb2YgdGhlIGdyYWRpZW50IGxpbmUKQEAgLTM4LDYgKzM3LDggQEAKICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImNvbG9yIGFuZCBwb3NpdGlvbiBhcnJheXMgbXVzdCBiZSBvZiBlcXVhbCBsZW5ndGgiKTsKICAgICAgICAgfQogICAgICAgICBuYXRpdmVfaW5zdGFuY2UgPSBuYXRpdmVDcmVhdGUxKHgwLCB5MCwgeDEsIHkxLCBjb2xvcnMsIHBvc2l0aW9ucywgdGlsZS5uYXRpdmVJbnQpOworICAgICAgICBuYXRpdmVfc2hhZGVyID0gbmF0aXZlUG9zdENyZWF0ZTEobmF0aXZlX2luc3RhbmNlLCB4MCwgeTAsIHgxLCB5MSwgY29sb3JzLCBwb3NpdGlvbnMsCisgICAgICAgICAgICAgICAgdGlsZS5uYXRpdmVJbnQpOwogICAgIH0KIAogCS8qKglDcmVhdGUgYSBzaGFkZXIgdGhhdCBkcmF3cyBhIGxpbmVhciBncmFkaWVudCBhbG9uZyBhIGxpbmUuCkBAIC01MiwxMiArNTMsMTYgQEAKIAlwdWJsaWMgTGluZWFyR3JhZGllbnQoZmxvYXQgeDAsIGZsb2F0IHkwLCBmbG9hdCB4MSwgZmxvYXQgeTEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjb2xvcjAsIGludCBjb2xvcjEsIFRpbGVNb2RlIHRpbGUpIHsKICAgICAgICAgbmF0aXZlX2luc3RhbmNlID0gbmF0aXZlQ3JlYXRlMih4MCwgeTAsIHgxLCB5MSwgY29sb3IwLCBjb2xvcjEsIHRpbGUubmF0aXZlSW50KTsKKyAgICAgICAgbmF0aXZlX3NoYWRlciA9IG5hdGl2ZVBvc3RDcmVhdGUyKG5hdGl2ZV9pbnN0YW5jZSwgeDAsIHkwLCB4MSwgeTEsIGNvbG9yMCwgY29sb3IxLAorICAgICAgICAgICAgICAgIHRpbGUubmF0aXZlSW50KTsKICAgICB9CiAKLQotCXByaXZhdGUgc3RhdGljIG5hdGl2ZSBpbnQgbmF0aXZlQ3JlYXRlMShmbG9hdCB4MCwgZmxvYXQgeTAsIGZsb2F0IHgxLCBmbG9hdCB5MSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNvbG9yc1tdLCBmbG9hdCBwb3NpdGlvbnNbXSwgaW50IHRpbGVNb2RlKTsKLQlwcml2YXRlIHN0YXRpYyBuYXRpdmUgaW50IG5hdGl2ZUNyZWF0ZTIoZmxvYXQgeDAsIGZsb2F0IHkwLCBmbG9hdCB4MSwgZmxvYXQgeTEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjb2xvcjAsIGludCBjb2xvcjEsIGludCB0aWxlTW9kZSk7CisJcHJpdmF0ZSBuYXRpdmUgaW50IG5hdGl2ZUNyZWF0ZTEoZmxvYXQgeDAsIGZsb2F0IHkwLCBmbG9hdCB4MSwgZmxvYXQgeTEsCisgICAgICAgICAgICBpbnQgY29sb3JzW10sIGZsb2F0IHBvc2l0aW9uc1tdLCBpbnQgdGlsZU1vZGUpOworCXByaXZhdGUgbmF0aXZlIGludCBuYXRpdmVDcmVhdGUyKGZsb2F0IHgwLCBmbG9hdCB5MCwgZmxvYXQgeDEsIGZsb2F0IHkxLAorICAgICAgICAgICAgaW50IGNvbG9yMCwgaW50IGNvbG9yMSwgaW50IHRpbGVNb2RlKTsKKyAgICBwcml2YXRlIG5hdGl2ZSBpbnQgbmF0aXZlUG9zdENyZWF0ZTEoaW50IG5hdGl2ZV9zaGFkZXIsIGZsb2F0IHgwLCBmbG9hdCB5MCwgZmxvYXQgeDEsIGZsb2F0IHkxLAorICAgICAgICAgICAgaW50IGNvbG9yc1tdLCBmbG9hdCBwb3NpdGlvbnNbXSwgaW50IHRpbGVNb2RlKTsKKyAgICBwcml2YXRlIG5hdGl2ZSBpbnQgbmF0aXZlUG9zdENyZWF0ZTIoaW50IG5hdGl2ZV9zaGFkZXIsIGZsb2F0IHgwLCBmbG9hdCB5MCwgZmxvYXQgeDEsIGZsb2F0IHkxLAorICAgICAgICAgICAgaW50IGNvbG9yMCwgaW50IGNvbG9yMSwgaW50IHRpbGVNb2RlKTsKIH0KLQpkaWZmIC0tZ2l0IGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL2dyYXBoaWNzL01hdHJpeC5qYXZhIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL2dyYXBoaWNzL01hdHJpeC5qYXZhCmluZGV4IGY1NDk5MDAuLmIzMzY5OTUgMTAwNjQ0Ci0tLSBhL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9ncmFwaGljcy9NYXRyaXguamF2YQorKysgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvZ3JhcGhpY3MvTWF0cml4LmphdmEKQEAgLTM3LDcgKzM3LDEwIEBACiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTVBFUlNQXzEgPSA3OyAgIC8vITwgdXNlIHdpdGggZ2V0VmFsdWVzL3NldFZhbHVlcwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1QRVJTUF8yID0gODsgICAvLyE8IHVzZSB3aXRoIGdldFZhbHVlcy9zZXRWYWx1ZXMKIAotICAgIC8qIHBhY2thZ2UgKi8gaW50IG5hdGl2ZV9pbnN0YW5jZTsKKyAgICAvKioKKyAgICAgKiBAaGlkZQorICAgICAqLworICAgIHB1YmxpYyBpbnQgbmF0aXZlX2luc3RhbmNlOwogCiAgICAgLyoqCiAgICAgICogQ3JlYXRlIGFuIGlkZW50aXR5IG1hdHJpeApkaWZmIC0tZ2l0IGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL2dyYXBoaWNzL05pbmVQYXRjaC5qYXZhIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL2dyYXBoaWNzL05pbmVQYXRjaC5qYXZhCmluZGV4IDg4ZGZkNjcuLmRmNmZlYmEgMTAwNjQ0Ci0tLSBhL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9ncmFwaGljcy9OaW5lUGF0Y2guamF2YQorKysgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvZ3JhcGhpY3MvTmluZVBhdGNoLmphdmEKQEAgLTM1LDYgKzM1LDEyIEBACiAgKiA8L3A+CiAgKi8KIHB1YmxpYyBjbGFzcyBOaW5lUGF0Y2ggeworICAgIHByaXZhdGUgZmluYWwgQml0bWFwIG1CaXRtYXA7CisgICAgcHJpdmF0ZSBmaW5hbCBieXRlW10gbUNodW5rOworICAgIHByaXZhdGUgUGFpbnQgbVBhaW50OworICAgIHByaXZhdGUgU3RyaW5nIG1TcmNOYW1lOyAgLy8gVXNlZnVsIGZvciBkZWJ1Z2dpbmcKKyAgICBwcml2YXRlIGZpbmFsIFJlY3RGIG1SZWN0ID0gbmV3IFJlY3RGKCk7CisgICAgCiAgICAgLyoqIAogICAgICAqIENyZWF0ZSBhIGRyYXdhYmxlIHByb2plY3Rpb24gZnJvbSBhIGJpdG1hcCB0byBuaW5lIHBhdGNoZXMuCiAgICAgICoKQEAgLTc0LDEwICs4MCwxNCBAQAogICAgICAqIEBwYXJhbSBsb2NhdGlvbiAgV2hlcmUgdG8gZHJhdyB0aGUgYml0bWFwLgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIGRyYXcoQ2FudmFzIGNhbnZhcywgUmVjdEYgbG9jYXRpb24pIHsKLSAgICAgICAgbmF0aXZlRHJhdyhjYW52YXMubU5hdGl2ZUNhbnZhcywgbG9jYXRpb24sCi0gICAgICAgICAgICAgICAgICAgbUJpdG1hcC5uaSgpLCBtQ2h1bmssCi0gICAgICAgICAgICAgICAgICAgbVBhaW50ICE9IG51bGwgPyBtUGFpbnQubU5hdGl2ZVBhaW50IDogMCwKLSAgICAgICAgICAgICAgICAgICBjYW52YXMubURlbnNpdHksIG1CaXRtYXAubURlbnNpdHkpOworICAgICAgICBpZiAoIWNhbnZhcy5pc0hhcmR3YXJlQWNjZWxlcmF0ZWQoKSkgeworICAgICAgICAgICAgbmF0aXZlRHJhdyhjYW52YXMubU5hdGl2ZUNhbnZhcywgbG9jYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgIG1CaXRtYXAubmkoKSwgbUNodW5rLAorICAgICAgICAgICAgICAgICAgICAgICBtUGFpbnQgIT0gbnVsbCA/IG1QYWludC5tTmF0aXZlUGFpbnQgOiAwLAorICAgICAgICAgICAgICAgICAgICAgICBjYW52YXMubURlbnNpdHksIG1CaXRtYXAubURlbnNpdHkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgY2FudmFzLmRyYXdQYXRjaChtQml0bWFwLCBtQ2h1bmssIGxvY2F0aW9uLCBudWxsKTsKKyAgICAgICAgfQogICAgIH0KICAgICAKICAgICAvKiogCkBAIC04NywxMCArOTcsMTUgQEAKICAgICAgKiBAcGFyYW0gbG9jYXRpb24gIFdoZXJlIHRvIGRyYXcgdGhlIGJpdG1hcC4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBkcmF3KENhbnZhcyBjYW52YXMsIFJlY3QgbG9jYXRpb24pIHsKLSAgICAgICAgbmF0aXZlRHJhdyhjYW52YXMubU5hdGl2ZUNhbnZhcywgbG9jYXRpb24sCi0gICAgICAgICAgICAgICAgbUJpdG1hcC5uaSgpLCBtQ2h1bmssCi0gICAgICAgICAgICAgICAgbVBhaW50ICE9IG51bGwgPyBtUGFpbnQubU5hdGl2ZVBhaW50IDogMCwKLSAgICAgICAgICAgICAgICBjYW52YXMubURlbnNpdHksIG1CaXRtYXAubURlbnNpdHkpOworICAgICAgICBpZiAoIWNhbnZhcy5pc0hhcmR3YXJlQWNjZWxlcmF0ZWQoKSkgeworICAgICAgICAgICAgbmF0aXZlRHJhdyhjYW52YXMubU5hdGl2ZUNhbnZhcywgbG9jYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICBtQml0bWFwLm5pKCksIG1DaHVuaywKKyAgICAgICAgICAgICAgICAgICAgICAgIG1QYWludCAhPSBudWxsID8gbVBhaW50Lm1OYXRpdmVQYWludCA6IDAsCisgICAgICAgICAgICAgICAgICAgICAgICBjYW52YXMubURlbnNpdHksIG1CaXRtYXAubURlbnNpdHkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbVJlY3Quc2V0KGxvY2F0aW9uKTsKKyAgICAgICAgICAgIGNhbnZhcy5kcmF3UGF0Y2gobUJpdG1hcCwgbUNodW5rLCBtUmVjdCwgbnVsbCk7CisgICAgICAgIH0KICAgICB9CiAKICAgICAvKiogCkBAIC0xMDEsOSArMTE2LDE0IEBACiAgICAgICogQHBhcmFtIHBhaW50ICAgICBUaGUgUGFpbnQgdG8gZHJhdyB0aHJvdWdoLgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIGRyYXcoQ2FudmFzIGNhbnZhcywgUmVjdCBsb2NhdGlvbiwgUGFpbnQgcGFpbnQpIHsKLSAgICAgICAgbmF0aXZlRHJhdyhjYW52YXMubU5hdGl2ZUNhbnZhcywgbG9jYXRpb24sCi0gICAgICAgICAgICAgICAgbUJpdG1hcC5uaSgpLCBtQ2h1bmssIHBhaW50ICE9IG51bGwgPyBwYWludC5tTmF0aXZlUGFpbnQgOiAwLAotICAgICAgICAgICAgICAgIGNhbnZhcy5tRGVuc2l0eSwgbUJpdG1hcC5tRGVuc2l0eSk7CisgICAgICAgIGlmICghY2FudmFzLmlzSGFyZHdhcmVBY2NlbGVyYXRlZCgpKSB7CisgICAgICAgICAgICBuYXRpdmVEcmF3KGNhbnZhcy5tTmF0aXZlQ2FudmFzLCBsb2NhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgbUJpdG1hcC5uaSgpLCBtQ2h1bmssIHBhaW50ICE9IG51bGwgPyBwYWludC5tTmF0aXZlUGFpbnQgOiAwLAorICAgICAgICAgICAgICAgICAgICBjYW52YXMubURlbnNpdHksIG1CaXRtYXAubURlbnNpdHkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbVJlY3Quc2V0KGxvY2F0aW9uKTsKKyAgICAgICAgICAgIGNhbnZhcy5kcmF3UGF0Y2gobUJpdG1hcCwgbUNodW5rLCBtUmVjdCwgcGFpbnQpOworICAgICAgICB9CiAgICAgfQogCiAgICAgLyoqCkBAIC0xMzMsMTEgKzE1Myw2IEBACiAgICAgCiAgICAgcHVibGljIG5hdGl2ZSBzdGF0aWMgYm9vbGVhbiBpc05pbmVQYXRjaENodW5rKGJ5dGVbXSBjaHVuayk7CiAKLSAgICBwcml2YXRlIGZpbmFsIEJpdG1hcCBtQml0bWFwOwotICAgIHByaXZhdGUgZmluYWwgYnl0ZVtdIG1DaHVuazsKLSAgICBwcml2YXRlIFBhaW50ICAgICAgICBtUGFpbnQ7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgICAgICAgbVNyY05hbWU7ICAvLyBVc2VmdWwgZm9yIGRlYnVnZ2luZwotCiAgICAgcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIHZvaWQgdmFsaWRhdGVOaW5lUGF0Y2hDaHVuayhpbnQgYml0bWFwLCBieXRlW10gY2h1bmspOwogICAgIHByaXZhdGUgc3RhdGljIG5hdGl2ZSB2b2lkIG5hdGl2ZURyYXcoaW50IGNhbnZhc19pbnN0YW5jZSwgUmVjdEYgbG9jLCBpbnQgYml0bWFwX2luc3RhbmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZVtdIGMsIGludCBwYWludF9pbnN0YW5jZV9vcl9udWxsLApkaWZmIC0tZ2l0IGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL2dyYXBoaWNzL1BhaW50LmphdmEgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvZ3JhcGhpY3MvUGFpbnQuamF2YQppbmRleCAzZTNmODdiLi42MmZiZmI0IDEwMDY0NAotLS0gYS9ncmFwaGljcy9qYXZhL2FuZHJvaWQvZ3JhcGhpY3MvUGFpbnQuamF2YQorKysgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvZ3JhcGhpY3MvUGFpbnQuamF2YQpAQCAtMTYsMTAgKzE2LDEwIEBACiAKIHBhY2thZ2UgYW5kcm9pZC5ncmFwaGljczsKIAotaW1wb3J0IGFuZHJvaWQudGV4dC5UZXh0VXRpbHM7CitpbXBvcnQgYW5kcm9pZC50ZXh0LkdyYXBoaWNzT3BlcmF0aW9uczsKIGltcG9ydCBhbmRyb2lkLnRleHQuU3Bhbm5hYmxlU3RyaW5nOwogaW1wb3J0IGFuZHJvaWQudGV4dC5TcGFubmVkU3RyaW5nOwotaW1wb3J0IGFuZHJvaWQudGV4dC5HcmFwaGljc09wZXJhdGlvbnM7CitpbXBvcnQgYW5kcm9pZC50ZXh0LlRleHRVdGlsczsKIAogLyoqCiAgKiBUaGUgUGFpbnQgY2xhc3MgaG9sZHMgdGhlIHN0eWxlIGFuZCBjb2xvciBpbmZvcm1hdGlvbiBhYm91dCBob3cgdG8gZHJhdwpAQCAtMjcsNyArMjcsMTEgQEAKICAqLwogcHVibGljIGNsYXNzIFBhaW50IHsKIAotICAgIC8qcGFja2FnZSovIGludCAgICAgbU5hdGl2ZVBhaW50OworICAgIC8qKgorICAgICAqIEBoaWRlCisgICAgICovCisgICAgcHVibGljIGludCBtTmF0aXZlUGFpbnQ7CisKICAgICBwcml2YXRlIENvbG9yRmlsdGVyIG1Db2xvckZpbHRlcjsKICAgICBwcml2YXRlIE1hc2tGaWx0ZXIgIG1NYXNrRmlsdGVyOwogICAgIHByaXZhdGUgUGF0aEVmZmVjdCAgbVBhdGhFZmZlY3Q7CkBAIC0zOSw2ICs0MywzMiBAQAogICAgIHByaXZhdGUgYm9vbGVhbiAgICAgbUhhc0NvbXBhdFNjYWxpbmc7CiAgICAgcHJpdmF0ZSBmbG9hdCAgICAgICBtQ29tcGF0U2NhbGluZzsKICAgICBwcml2YXRlIGZsb2F0ICAgICAgIG1JbnZDb21wYXRTY2FsaW5nOworCisgICAgLyoqCisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBoYXNTaGFkb3c7CisgICAgLyoqCisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgZmxvYXQgc2hhZG93RHg7CisgICAgLyoqCisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgZmxvYXQgc2hhZG93RHk7CisgICAgLyoqCisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgZmxvYXQgc2hhZG93UmFkaXVzOworICAgIC8qKgorICAgICAqIEBoaWRlCisgICAgICovCisgICAgcHVibGljIGludCBzaGFkb3dDb2xvcjsKKworICAgIC8qKgorICAgICAqIEBoaWRlCisgICAgICovCisgICAgcHVibGljICBpbnQgICAgICAgICBtQmlkaUZsYWdzID0gQklESV9ERUZBVUxUX0xUUjsKICAgICAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHlsZVtdIHNTdHlsZUFycmF5ID0gewogICAgICAgICBTdHlsZS5GSUxMLCBTdHlsZS5TVFJPS0UsIFN0eWxlLkZJTExfQU5EX1NUUk9LRQpAQCAtNzYsOCArMTA2LDExNiBAQAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBERUZBVUxUX1BBSU5UX0ZMQUdTID0gREVWX0tFUk5fVEVYVF9GTEFHOwogCiAgICAgLyoqCi0gICAgICogVGhlIFN0eWxlIHNwZWNpZmllcyBpZiB0aGUgcHJpbWl0aXZlIGJlaW5nIGRyYXduIGlzIGZpbGxlZCwKLSAgICAgKiBzdHJva2VkLCBvciBib3RoIChpbiB0aGUgc2FtZSBjb2xvcikuIFRoZSBkZWZhdWx0IGlzIEZJTEwuCisgICAgICogQmlkaSBmbGFnIHRvIHNldCBMVFIgcGFyYWdyYXBoIGRpcmVjdGlvbi4KKyAgICAgKiAKKyAgICAgKiBAaGlkZQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEJJRElfTFRSID0gMHgwOworCisgICAgLyoqCisgICAgICogQmlkaSBmbGFnIHRvIHNldCBSVEwgcGFyYWdyYXBoIGRpcmVjdGlvbi4KKyAgICAgKiAKKyAgICAgKiBAaGlkZQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEJJRElfUlRMID0gMHgxOworCisgICAgLyoqCisgICAgICogQmlkaSBmbGFnIHRvIGRldGVjdCBwYXJhZ3JhcGggZGlyZWN0aW9uIHZpYSBoZXVyaXN0aWNzLCBkZWZhdWx0aW5nIHRvCisgICAgICogTFRSLgorICAgICAqIAorICAgICAqIEBoaWRlCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQklESV9ERUZBVUxUX0xUUiA9IDB4MjsKKworICAgIC8qKgorICAgICAqIEJpZGkgZmxhZyB0byBkZXRlY3QgcGFyYWdyYXBoIGRpcmVjdGlvbiB2aWEgaGV1cmlzdGljcywgZGVmYXVsdGluZyB0bworICAgICAqIFJUTC4KKyAgICAgKiAKKyAgICAgKiBAaGlkZQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEJJRElfREVGQVVMVF9SVEwgPSAweDM7CisKKyAgICAvKioKKyAgICAgKiBCaWRpIGZsYWcgdG8gb3ZlcnJpZGUgZGlyZWN0aW9uIHRvIGFsbCBMVFIgKGlnbm9yZSBiaWRpKS4KKyAgICAgKiAKKyAgICAgKiBAaGlkZQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEJJRElfRk9SQ0VfTFRSID0gMHg0OworCisgICAgLyoqCisgICAgICogQmlkaSBmbGFnIHRvIG92ZXJyaWRlIGRpcmVjdGlvbiB0byBhbGwgUlRMIChpZ25vcmUgYmlkaSkuCisgICAgICogCisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBCSURJX0ZPUkNFX1JUTCA9IDB4NTsKKworICAgIC8qKgorICAgICAqIE1heGltdW0gQmlkaSBmbGFnIHZhbHVlLgorICAgICAqIEBoaWRlCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEJJRElfTUFYX0ZMQUdfVkFMVUUgPSBCSURJX0ZPUkNFX1JUTDsKKworICAgIC8qKgorICAgICAqIE1hc2sgZm9yIGJpZGkgZmxhZ3MuCisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQklESV9GTEFHX01BU0sgPSAweDc7CisKKyAgICAvKioKKyAgICAgKiBGbGFnIGZvciBnZXRUZXh0UnVuQWR2YW5jZXMgaW5kaWNhdGluZyBsZWZ0LXRvLXJpZ2h0IHJ1biBkaXJlY3Rpb24uCisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBESVJFQ1RJT05fTFRSID0gMDsKKworICAgIC8qKgorICAgICAqIEZsYWcgZm9yIGdldFRleHRSdW5BZHZhbmNlcyBpbmRpY2F0aW5nIHJpZ2h0LXRvLWxlZnQgcnVuIGRpcmVjdGlvbi4KKyAgICAgKiBAaGlkZQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERJUkVDVElPTl9SVEwgPSAxOworCisgICAgLyoqCisgICAgICogT3B0aW9uIGZvciBnZXRUZXh0UnVuQ3Vyc29yIHRvIGNvbXB1dGUgdGhlIHZhbGlkIGN1cnNvciBhZnRlcgorICAgICAqIG9mZnNldCBvciB0aGUgbGltaXQgb2YgdGhlIGNvbnRleHQsIHdoaWNoZXZlciBpcyBsZXNzLgorICAgICAqIEBoaWRlCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ1VSU09SX0FGVEVSID0gMDsKKworICAgIC8qKgorICAgICAqIE9wdGlvbiBmb3IgZ2V0VGV4dFJ1bkN1cnNvciB0byBjb21wdXRlIHRoZSB2YWxpZCBjdXJzb3IgYXQgb3IgYWZ0ZXIKKyAgICAgKiB0aGUgb2Zmc2V0IG9yIHRoZSBsaW1pdCBvZiB0aGUgY29udGV4dCwgd2hpY2hldmVyIGlzIGxlc3MuCisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDVVJTT1JfQVRfT1JfQUZURVIgPSAxOworCisgICAgIC8qKgorICAgICAqIE9wdGlvbiBmb3IgZ2V0VGV4dFJ1bkN1cnNvciB0byBjb21wdXRlIHRoZSB2YWxpZCBjdXJzb3IgYmVmb3JlCisgICAgICogb2Zmc2V0IG9yIHRoZSBzdGFydCBvZiB0aGUgY29udGV4dCwgd2hpY2hldmVyIGlzIGdyZWF0ZXIuCisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDVVJTT1JfQkVGT1JFID0gMjsKKworICAgLyoqCisgICAgICogT3B0aW9uIGZvciBnZXRUZXh0UnVuQ3Vyc29yIHRvIGNvbXB1dGUgdGhlIHZhbGlkIGN1cnNvciBhdCBvciBiZWZvcmUKKyAgICAgKiBvZmZzZXQgb3IgdGhlIHN0YXJ0IG9mIHRoZSBjb250ZXh0LCB3aGljaGV2ZXIgaXMgZ3JlYXRlci4KKyAgICAgKiBAaGlkZQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENVUlNPUl9BVF9PUl9CRUZPUkUgPSAzOworCisgICAgLyoqCisgICAgICogT3B0aW9uIGZvciBnZXRUZXh0UnVuQ3Vyc29yIHRvIHJldHVybiBvZmZzZXQgaWYgdGhlIGN1cnNvciBhdCBvZmZzZXQKKyAgICAgKiBpcyB2YWxpZCwgb3IgLTEgaWYgaXQgaXNuJ3QuCisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDVVJTT1JfQVQgPSA0OworCisgICAgLyoqCisgICAgICogTWF4aW11bSBjdXJzb3Igb3B0aW9uIHZhbHVlLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDVVJTT1JfT1BUX01BWF9WQUxVRSA9IENVUlNPUl9BVDsKKworICAgIC8qKgorICAgICAqIFRoZSBTdHlsZSBzcGVjaWZpZXMgaWYgdGhlIHByaW1pdGl2ZSBiZWluZyBkcmF3biBpcyBmaWxsZWQsIHN0cm9rZWQsIG9yCisgICAgICogYm90aCAoaW4gdGhlIHNhbWUgY29sb3IpLiBUaGUgZGVmYXVsdCBpcyBGSUxMLgogICAgICAqLwogICAgIHB1YmxpYyBlbnVtIFN0eWxlIHsKICAgICAgICAgLyoqCkBAIC05Myw3ICsyMzEsOSBAQAogICAgICAgICAvKioKICAgICAgICAgICogR2VvbWV0cnkgYW5kIHRleHQgZHJhd24gd2l0aCB0aGlzIHN0eWxlIHdpbGwgYmUgYm90aCBmaWxsZWQgYW5kCiAgICAgICAgICAqIHN0cm9rZWQgYXQgdGhlIHNhbWUgdGltZSwgcmVzcGVjdGluZyB0aGUgc3Ryb2tlLXJlbGF0ZWQgZmllbGRzIG9uCi0gICAgICAgICAqIHRoZSBwYWludC4KKyAgICAgICAgICogdGhlIHBhaW50LiBUaGlzIG1vZGUgY2FuIGdpdmUgdW5leHBlY3RlZCByZXN1bHRzIGlmIHRoZSBnZW9tZXRyeQorICAgICAgICAgKiBpcyBvcmllbnRlZCBjb3VudGVyLWNsb2Nrd2lzZS4gVGhpcyByZXN0cmljdGlvbiBkb2VzIG5vdCBhcHBseSB0bworICAgICAgICAgKiBlaXRoZXIgRklMTCBvciBTVFJPS0UuCiAgICAgICAgICAqLwogICAgICAgICBGSUxMX0FORF9TVFJPS0UgKDIpOwogICAgICAgICAKQEAgLTIwOCw2ICszNDgsNyBAQAogICAgICAgICBtSGFzQ29tcGF0U2NhbGluZyA9IHBhaW50Lm1IYXNDb21wYXRTY2FsaW5nOwogICAgICAgICBtQ29tcGF0U2NhbGluZyA9IHBhaW50Lm1Db21wYXRTY2FsaW5nOwogICAgICAgICBtSW52Q29tcGF0U2NhbGluZyA9IHBhaW50Lm1JbnZDb21wYXRTY2FsaW5nOworICAgICAgICBtQmlkaUZsYWdzID0gcGFpbnQubUJpZGlGbGFnczsKICAgICB9CiAKICAgICAvKiogUmVzdG9yZXMgdGhlIHBhaW50IHRvIGl0cyBkZWZhdWx0IHNldHRpbmdzLiAqLwpAQCAtMjE2LDYgKzM1Nyw3IEBACiAgICAgICAgIHNldEZsYWdzKERFRkFVTFRfUEFJTlRfRkxBR1MpOwogICAgICAgICBtSGFzQ29tcGF0U2NhbGluZyA9IGZhbHNlOwogICAgICAgICBtQ29tcGF0U2NhbGluZyA9IG1JbnZDb21wYXRTY2FsaW5nID0gMTsKKyAgICAgICAgbUJpZGlGbGFncyA9IEJJRElfREVGQVVMVF9MVFI7CiAgICAgfQogICAgIAogICAgIC8qKgpAQCAtMjM4LDYgKzM4MCw3IEBACiAgICAgICAgICAgICBtSGFzQ29tcGF0U2NhbGluZyA9IHNyYy5tSGFzQ29tcGF0U2NhbGluZzsKICAgICAgICAgICAgIG1Db21wYXRTY2FsaW5nICAgID0gc3JjLm1Db21wYXRTY2FsaW5nOwogICAgICAgICAgICAgbUludkNvbXBhdFNjYWxpbmcgPSBzcmMubUludkNvbXBhdFNjYWxpbmc7CisgICAgICAgICAgICBtQmlkaUZsYWdzICAgICAgPSBzcmMubUJpZGlGbGFnczsKICAgICAgICAgfQogICAgIH0KIApAQCAtMjUyLDEwICszOTUsMzMgQEAKICAgICAgICAgICAgIG1JbnZDb21wYXRTY2FsaW5nID0gMS4wZi9mYWN0b3I7CiAgICAgICAgIH0KICAgICB9Ci0gICAgCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIGJpZGkgZmxhZ3Mgb24gdGhlIHBhaW50LgorICAgICAqIAorICAgICAqIEByZXR1cm4gdGhlIGJpZGkgZmxhZ3Mgb24gdGhlIHBhaW50CisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldEJpZGlGbGFncygpIHsKKyAgICAgICAgcmV0dXJuIG1CaWRpRmxhZ3M7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBiaWRpIGZsYWdzIG9uIHRoZSBwYWludC4KKyAgICAgKiBAaGlkZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEJpZGlGbGFncyhpbnQgZmxhZ3MpIHsKKyAgICAgICAgLy8gb25seSBmbGFnIHZhbHVlIGlzIHRoZSAzLWJpdCBCSURJIGNvbnRyb2wgc2V0dGluZworICAgICAgICBmbGFncyAmPSBCSURJX0ZMQUdfTUFTSzsKKyAgICAgICAgaWYgKGZsYWdzID4gQklESV9NQVhfRkxBR19WQUxVRSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigidW5rbm93biBiaWRpIGZsYWc6ICIgKyBmbGFncyk7CisgICAgICAgIH0KKyAgICAgICAgbUJpZGlGbGFncyA9IGZsYWdzOworICAgIH0KKwogICAgIC8qKgogICAgICAqIFJldHVybiB0aGUgcGFpbnQncyBmbGFncy4gVXNlIHRoZSBGbGFnIGVudW0gdG8gdGVzdCBmbGFnIHZhbHVlcy4KLSAgICAgKgorICAgICAqIAogICAgICAqIEByZXR1cm4gdGhlIHBhaW50J3MgZmxhZ3MgKHNlZSBlbnVtcyBlbmRpbmcgaW4gX0ZsYWcgZm9yIGJpdCBtYXNrcykKICAgICAgKi8KICAgICBwdWJsaWMgbmF0aXZlIGludCBnZXRGbGFncygpOwpAQCAtNzg3LDE4ICs5NTMsMjcgQEAKICAgICB9CiAgICAgCiAgICAgLyoqCi0gICAgICogVGVtcG9yYXJ5IEFQSSB0byBleHBvc2UgbGF5ZXIgZHJhd2luZy4gVGhpcyBkcmF3cyBhIHNoYWRvdyBsYXllciBiZWxvdwotICAgICAqIHRoZSBtYWluIGxheWVyLCB3aXRoIHRoZSBzcGVjaWZpZWQgb2Zmc2V0IGFuZCBjb2xvciwgYW5kIGJsdXIgcmFkaXVzLgotICAgICAqIElmIHJhZGl1cyBpcyAwLCB0aGVuIHRoZSBzaGFkb3cgbGF5ZXIgaXMgcmVtb3ZlZC4KKyAgICAgKiBUaGlzIGRyYXdzIGEgc2hhZG93IGxheWVyIGJlbG93IHRoZSBtYWluIGxheWVyLCB3aXRoIHRoZSBzcGVjaWZpZWQKKyAgICAgKiBvZmZzZXQgYW5kIGNvbG9yLCBhbmQgYmx1ciByYWRpdXMuIElmIHJhZGl1cyBpcyAwLCB0aGVuIHRoZSBzaGFkb3cKKyAgICAgKiBsYXllciBpcyByZW1vdmVkLgogICAgICAqLwotICAgIHB1YmxpYyBuYXRpdmUgdm9pZCBzZXRTaGFkb3dMYXllcihmbG9hdCByYWRpdXMsIGZsb2F0IGR4LCBmbG9hdCBkeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNvbG9yKTsKKyAgICBwdWJsaWMgdm9pZCBzZXRTaGFkb3dMYXllcihmbG9hdCByYWRpdXMsIGZsb2F0IGR4LCBmbG9hdCBkeSwgaW50IGNvbG9yKSB7CisgICAgICAgIGhhc1NoYWRvdyA9IHJhZGl1cyA+IDAuMGY7CisgICAgICAgIHNoYWRvd1JhZGl1cyA9IHJhZGl1czsKKyAgICAgICAgc2hhZG93RHggPSBkeDsKKyAgICAgICAgc2hhZG93RHkgPSBkeTsKKyAgICAgICAgc2hhZG93Q29sb3IgPSBjb2xvcjsKKyAgICAgICAgblNldFNoYWRvd0xheWVyKHJhZGl1cywgZHgsIGR5LCBjb2xvcik7CisgICAgfQorICAgIAorICAgIHByaXZhdGUgbmF0aXZlIHZvaWQgblNldFNoYWRvd0xheWVyKGZsb2F0IHJhZGl1cywgZmxvYXQgZHgsIGZsb2F0IGR5LCBpbnQgY29sb3IpOwogCiAgICAgLyoqCi0gICAgICogVGVtcG9yYXJ5IEFQSSB0byBjbGVhciB0aGUgc2hhZG93IGxheWVyLgorICAgICAqIENsZWFyIHRoZSBzaGFkb3cgbGF5ZXIuCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgY2xlYXJTaGFkb3dMYXllcigpIHsKLSAgICAgICAgc2V0U2hhZG93TGF5ZXIoMCwgMCwgMCwgMCk7CisgICAgICAgIGhhc1NoYWRvdyA9IGZhbHNlOworICAgICAgICBuU2V0U2hhZG93TGF5ZXIoMCwgMCwgMCwgMCk7CiAgICAgfQogCiAgICAgLyoqCkBAIC0xMjMyLDEwICsxNDA3LDEwIEBACiAgICAgICAgIH0KIAogICAgICAgICBjaGFyW10gYnVmID0gVGVtcG9yYXJ5QnVmZmVyLm9idGFpbihlbmQgLSBzdGFydCk7Ci0gICAgCVRleHRVdGlscy5nZXRDaGFycyh0ZXh0LCBzdGFydCwgZW5kLCBidWYsIDApOwotICAgIAlpbnQgcmVzdWx0ID0gZ2V0VGV4dFdpZHRocyhidWYsIDAsIGVuZCAtIHN0YXJ0LCB3aWR0aHMpOworICAgICAgICBUZXh0VXRpbHMuZ2V0Q2hhcnModGV4dCwgc3RhcnQsIGVuZCwgYnVmLCAwKTsKKyAgICAgICAgaW50IHJlc3VsdCA9IGdldFRleHRXaWR0aHMoYnVmLCAwLCBlbmQgLSBzdGFydCwgd2lkdGhzKTsKICAgICAgICAgVGVtcG9yYXJ5QnVmZmVyLnJlY3ljbGUoYnVmKTsKLSAgICAJcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICB9CiAKICAgICAvKioKQEAgLTEyODIsNiArMTQ1NywyODQgQEAKICAgICB9CiAKICAgICAvKioKKyAgICAgKiBDb252ZW5pZW5jZSBvdmVybG9hZCB0aGF0IHRha2VzIGEgY2hhciBhcnJheSBpbnN0ZWFkIG9mIGEKKyAgICAgKiBTdHJpbmcuCisgICAgICoKKyAgICAgKiBAc2VlICNnZXRUZXh0UnVuQWR2YW5jZXMoU3RyaW5nLCBpbnQsIGludCwgaW50LCBpbnQsIGludCwgZmxvYXRbXSwgaW50KQorICAgICAqIEBoaWRlCisgICAgICovCisgICAgcHVibGljIGZsb2F0IGdldFRleHRSdW5BZHZhbmNlcyhjaGFyW10gY2hhcnMsIGludCBpbmRleCwgaW50IGNvdW50LAorICAgICAgICAgICAgaW50IGNvbnRleHRJbmRleCwgaW50IGNvbnRleHRDb3VudCwgaW50IGZsYWdzLCBmbG9hdFtdIGFkdmFuY2VzLAorICAgICAgICAgICAgaW50IGFkdmFuY2VzSW5kZXgpIHsKKworICAgICAgICBpZiAoKGluZGV4IHwgY291bnQgfCBjb250ZXh0SW5kZXggfCBjb250ZXh0Q291bnQgfCBhZHZhbmNlc0luZGV4CisgICAgICAgICAgICAgICAgfCAoaW5kZXggLSBjb250ZXh0SW5kZXgpCisgICAgICAgICAgICAgICAgfCAoKGNvbnRleHRJbmRleCArIGNvbnRleHRDb3VudCkgLSAoaW5kZXggKyBjb3VudCkpCisgICAgICAgICAgICAgICAgfCAoY2hhcnMubGVuZ3RoIC0gKGNvbnRleHRJbmRleCArIGNvbnRleHRDb3VudCkpCisgICAgICAgICAgICAgICAgfCAoYWR2YW5jZXMgPT0gbnVsbCA/IDAgOgorICAgICAgICAgICAgICAgICAgICAoYWR2YW5jZXMubGVuZ3RoIC0gKGFkdmFuY2VzSW5kZXggKyBjb3VudCkpKSkgPCAwKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbigpOworICAgICAgICB9CisgICAgICAgIGlmIChmbGFncyAhPSBESVJFQ1RJT05fTFRSICYmIGZsYWdzICE9IERJUkVDVElPTl9SVEwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInVua25vd24gZmxhZ3MgdmFsdWU6ICIgKyBmbGFncyk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoIW1IYXNDb21wYXRTY2FsaW5nKSB7CisgICAgICAgICAgICByZXR1cm4gbmF0aXZlX2dldFRleHRSdW5BZHZhbmNlcyhtTmF0aXZlUGFpbnQsIGNoYXJzLCBpbmRleCwgY291bnQsCisgICAgICAgICAgICAgICAgICAgIGNvbnRleHRJbmRleCwgY29udGV4dENvdW50LCBmbGFncywgYWR2YW5jZXMsIGFkdmFuY2VzSW5kZXgpOworICAgICAgICB9CisKKyAgICAgICAgZmluYWwgZmxvYXQgb2xkU2l6ZSA9IGdldFRleHRTaXplKCk7CisgICAgICAgIHNldFRleHRTaXplKG9sZFNpemUgKiBtQ29tcGF0U2NhbGluZyk7CisgICAgICAgIGZsb2F0IHJlcyA9IG5hdGl2ZV9nZXRUZXh0UnVuQWR2YW5jZXMobU5hdGl2ZVBhaW50LCBjaGFycywgaW5kZXgsIGNvdW50LAorICAgICAgICAgICAgICAgIGNvbnRleHRJbmRleCwgY29udGV4dENvdW50LCBmbGFncywgYWR2YW5jZXMsIGFkdmFuY2VzSW5kZXgpOworICAgICAgICBzZXRUZXh0U2l6ZShvbGRTaXplKTsKKworICAgICAgICBpZiAoYWR2YW5jZXMgIT0gbnVsbCkgeworICAgICAgICAgICAgZm9yIChpbnQgaSA9IGFkdmFuY2VzSW5kZXgsIGUgPSBpICsgY291bnQ7IGkgPCBlOyBpKyspIHsKKyAgICAgICAgICAgICAgICBhZHZhbmNlc1tpXSAqPSBtSW52Q29tcGF0U2NhbGluZzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmVzICogbUludkNvbXBhdFNjYWxpbmc7IC8vIGFzc3VtZSBlcnJvcnMgYXJlIG5vdCBzaWduaWZpY2FudAorICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnZlbmllbmNlIG92ZXJsb2FkIHRoYXQgdGFrZXMgYSBDaGFyU2VxdWVuY2UgaW5zdGVhZCBvZiBhCisgICAgICogU3RyaW5nLgorICAgICAqCisgICAgICogQHNlZSAjZ2V0VGV4dFJ1bkFkdmFuY2VzKFN0cmluZywgaW50LCBpbnQsIGludCwgaW50LCBpbnQsIGZsb2F0W10sIGludCkKKyAgICAgKiBAaGlkZQorICAgICAqLworICAgIHB1YmxpYyBmbG9hdCBnZXRUZXh0UnVuQWR2YW5jZXMoQ2hhclNlcXVlbmNlIHRleHQsIGludCBzdGFydCwgaW50IGVuZCwKKyAgICAgICAgICAgIGludCBjb250ZXh0U3RhcnQsIGludCBjb250ZXh0RW5kLCBpbnQgZmxhZ3MsIGZsb2F0W10gYWR2YW5jZXMsCisgICAgICAgICAgICBpbnQgYWR2YW5jZXNJbmRleCkgeworCisgICAgICAgIGlmICh0ZXh0IGluc3RhbmNlb2YgU3RyaW5nKSB7CisgICAgICAgICAgICByZXR1cm4gZ2V0VGV4dFJ1bkFkdmFuY2VzKChTdHJpbmcpIHRleHQsIHN0YXJ0LCBlbmQsCisgICAgICAgICAgICAgICAgICAgIGNvbnRleHRTdGFydCwgY29udGV4dEVuZCwgZmxhZ3MsIGFkdmFuY2VzLCBhZHZhbmNlc0luZGV4KTsKKyAgICAgICAgfQorICAgICAgICBpZiAodGV4dCBpbnN0YW5jZW9mIFNwYW5uZWRTdHJpbmcgfHwKKyAgICAgICAgICAgIHRleHQgaW5zdGFuY2VvZiBTcGFubmFibGVTdHJpbmcpIHsKKyAgICAgICAgICAgIHJldHVybiBnZXRUZXh0UnVuQWR2YW5jZXModGV4dC50b1N0cmluZygpLCBzdGFydCwgZW5kLAorICAgICAgICAgICAgICAgICAgICBjb250ZXh0U3RhcnQsIGNvbnRleHRFbmQsIGZsYWdzLCBhZHZhbmNlcywgYWR2YW5jZXNJbmRleCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHRleHQgaW5zdGFuY2VvZiBHcmFwaGljc09wZXJhdGlvbnMpIHsKKyAgICAgICAgICAgIHJldHVybiAoKEdyYXBoaWNzT3BlcmF0aW9ucykgdGV4dCkuZ2V0VGV4dFJ1bkFkdmFuY2VzKHN0YXJ0LCBlbmQsCisgICAgICAgICAgICAgICAgICAgIGNvbnRleHRTdGFydCwgY29udGV4dEVuZCwgZmxhZ3MsIGFkdmFuY2VzLCBhZHZhbmNlc0luZGV4LCB0aGlzKTsKKyAgICAgICAgfQorCisgICAgICAgIGludCBjb250ZXh0TGVuID0gY29udGV4dEVuZCAtIGNvbnRleHRTdGFydDsKKyAgICAgICAgaW50IGxlbiA9IGVuZCAtIHN0YXJ0OworICAgICAgICBjaGFyW10gYnVmID0gVGVtcG9yYXJ5QnVmZmVyLm9idGFpbihjb250ZXh0TGVuKTsKKyAgICAgICAgVGV4dFV0aWxzLmdldENoYXJzKHRleHQsIHN0YXJ0LCBlbmQsIGJ1ZiwgMCk7CisgICAgICAgIGZsb2F0IHJlc3VsdCA9IGdldFRleHRSdW5BZHZhbmNlcyhidWYsIHN0YXJ0IC0gY29udGV4dFN0YXJ0LCBsZW4sCisgICAgICAgICAgICAgICAgMCwgY29udGV4dExlbiwgZmxhZ3MsIGFkdmFuY2VzLCBhZHZhbmNlc0luZGV4KTsKKyAgICAgICAgVGVtcG9yYXJ5QnVmZmVyLnJlY3ljbGUoYnVmKTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSB0b3RhbCBhZHZhbmNlIHdpZHRoIGZvciB0aGUgY2hhcmFjdGVycyBpbiB0aGUgcnVuCisgICAgICogYmV0d2VlbiBzdGFydCBhbmQgZW5kLCBhbmQgaWYgYWR2YW5jZXMgaXMgbm90IG51bGwsIHRoZSBhZHZhbmNlCisgICAgICogYXNzaWduZWQgdG8gZWFjaCBvZiB0aGVzZSBjaGFyYWN0ZXJzIChqYXZhIGNoYXJzKS4KKyAgICAgKgorICAgICAqIDxwPlRoZSB0cmFpbGluZyBzdXJyb2dhdGUgaW4gYSB2YWxpZCBzdXJyb2dhdGUgcGFpciBpcyBhc3NpZ25lZAorICAgICAqIGFuIGFkdmFuY2Ugb2YgMC4gIFRodXMgdGhlIG51bWJlciBvZiByZXR1cm5lZCBhZHZhbmNlcyBpcworICAgICAqIGFsd2F5cyBlcXVhbCB0byBjb3VudCwgbm90IHRvIHRoZSBudW1iZXIgb2YgdW5pY29kZSBjb2RlcG9pbnRzCisgICAgICogcmVwcmVzZW50ZWQgYnkgdGhlIHJ1bi4KKyAgICAgKgorICAgICAqIDxwPkluIHRoZSBjYXNlIG9mIGNvbmp1bmN0cyBvciBjb21iaW5pbmcgbWFya3MsIHRoZSB0b3RhbAorICAgICAqIGFkdmFuY2UgaXMgYXNzaWduZWQgdG8gdGhlIGZpcnN0IGxvZ2ljYWwgY2hhcmFjdGVyLCBhbmQgdGhlCisgICAgICogZm9sbG93aW5nIGNoYXJhY3RlcnMgYXJlIGFzc2lnbmVkIGFuIGFkdmFuY2Ugb2YgMC4KKyAgICAgKgorICAgICAqIDxwPlRoaXMgZ2VuZXJhdGVzIHRoZSBzdW0gb2YgdGhlIGFkdmFuY2VzIG9mIGdseXBocyBmb3IKKyAgICAgKiBjaGFyYWN0ZXJzIGluIGEgcmVvcmRlcmVkIGNsdXN0ZXIgYXMgdGhlIHdpZHRoIG9mIHRoZSBmaXJzdAorICAgICAqIGxvZ2ljYWwgY2hhcmFjdGVyIGluIHRoZSBjbHVzdGVyLCBhbmQgMCBmb3IgdGhlIHdpZHRocyBvZiBhbGwKKyAgICAgKiBvdGhlciBjaGFyYWN0ZXJzIGluIHRoZSBjbHVzdGVyLiAgSW4gZWZmZWN0LCBzdWNoIGNsdXN0ZXJzIGFyZQorICAgICAqIHRyZWF0ZWQgbGlrZSBjb25qdW5jdHMuCisgICAgICoKKyAgICAgKiA8cD5UaGUgc2hhcGluZyBib3VuZHMgbGltaXQgdGhlIGFtb3VudCBvZiBjb250ZXh0IGF2YWlsYWJsZQorICAgICAqIG91dHNpZGUgc3RhcnQgYW5kIGVuZCB0aGF0IGNhbiBiZSB1c2VkIGZvciBzaGFwaW5nIGFuYWx5c2lzLgorICAgICAqIFRoZXNlIGJvdW5kcyB0eXBpY2FsbHkgcmVmbGVjdCBjaGFuZ2VzIGluIGJpZGkgbGV2ZWwgb3IgZm9udAorICAgICAqIG1ldHJpY3MgYWNyb3NzIHdoaWNoIHNoYXBpbmcgZG9lcyBub3Qgb2NjdXIuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdGV4dCB0aGUgdGV4dCB0byBtZWFzdXJlCisgICAgICogQHBhcmFtIHN0YXJ0IHRoZSBpbmRleCBvZiB0aGUgZmlyc3QgY2hhcmFjdGVyIHRvIG1lYXN1cmUKKyAgICAgKiBAcGFyYW0gZW5kIHRoZSBpbmRleCBwYXN0IHRoZSBsYXN0IGNoYXJhY3RlciB0byBtZWFzdXJlCisgICAgICogQHBhcmFtIGNvbnRleHRTdGFydCB0aGUgaW5kZXggb2YgdGhlIGZpcnN0IGNoYXJhY3RlciB0byB1c2UgZm9yIHNoYXBpbmcgY29udGV4dCwKKyAgICAgKiBtdXN0IGJlIDw9IHN0YXJ0CisgICAgICogQHBhcmFtIGNvbnRleHRFbmQgdGhlIGluZGV4IHBhc3QgdGhlIGxhc3QgY2hhcmFjdGVyIHRvIHVzZSBmb3Igc2hhcGluZyBjb250ZXh0LAorICAgICAqIG11c3QgYmUgPj0gZW5kCisgICAgICogQHBhcmFtIGZsYWdzIHRoZSBmbGFncyB0byBjb250cm9sIHRoZSBhZHZhbmNlcywgZWl0aGVyIHtAbGluayAjRElSRUNUSU9OX0xUUn0KKyAgICAgKiBvciB7QGxpbmsgI0RJUkVDVElPTl9SVEx9CisgICAgICogQHBhcmFtIGFkdmFuY2VzIGFycmF5IHRvIHJlY2VpdmUgdGhlIGFkdmFuY2VzLCBtdXN0IGhhdmUgcm9vbSBmb3IgYWxsIGFkdmFuY2VzLAorICAgICAqIGNhbiBiZSBudWxsIGlmIG9ubHkgdG90YWwgYWR2YW5jZSBpcyBuZWVkZWQKKyAgICAgKiBAcGFyYW0gYWR2YW5jZXNJbmRleCB0aGUgcG9zaXRpb24gaW4gYWR2YW5jZXMgYXQgd2hpY2ggdG8gcHV0IHRoZQorICAgICAqIGFkdmFuY2UgY29ycmVzcG9uZGluZyB0byB0aGUgY2hhcmFjdGVyIGF0IHN0YXJ0CisgICAgICogQHJldHVybiB0aGUgdG90YWwgYWR2YW5jZQorICAgICAqCisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgZmxvYXQgZ2V0VGV4dFJ1bkFkdmFuY2VzKFN0cmluZyB0ZXh0LCBpbnQgc3RhcnQsIGludCBlbmQsIGludCBjb250ZXh0U3RhcnQsCisgICAgICAgICAgICBpbnQgY29udGV4dEVuZCwgaW50IGZsYWdzLCBmbG9hdFtdIGFkdmFuY2VzLCBpbnQgYWR2YW5jZXNJbmRleCkgeworCisgICAgICAgIGlmICgoc3RhcnQgfCBlbmQgfCBjb250ZXh0U3RhcnQgfCBjb250ZXh0RW5kIHwgYWR2YW5jZXNJbmRleCB8IChlbmQgLSBzdGFydCkKKyAgICAgICAgICAgICAgICB8IChzdGFydCAtIGNvbnRleHRTdGFydCkgfCAoY29udGV4dEVuZCAtIGVuZCkKKyAgICAgICAgICAgICAgICB8ICh0ZXh0Lmxlbmd0aCgpIC0gY29udGV4dEVuZCkKKyAgICAgICAgICAgICAgICB8IChhZHZhbmNlcyA9PSBudWxsID8gMCA6CisgICAgICAgICAgICAgICAgICAgIChhZHZhbmNlcy5sZW5ndGggLSBhZHZhbmNlc0luZGV4IC0gKGVuZCAtIHN0YXJ0KSkpKSA8IDApIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGZsYWdzICE9IERJUkVDVElPTl9MVFIgJiYgZmxhZ3MgIT0gRElSRUNUSU9OX1JUTCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigidW5rbm93biBmbGFncyB2YWx1ZTogIiArIGZsYWdzKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICghbUhhc0NvbXBhdFNjYWxpbmcpIHsKKyAgICAgICAgICAgIHJldHVybiBuYXRpdmVfZ2V0VGV4dFJ1bkFkdmFuY2VzKG1OYXRpdmVQYWludCwgdGV4dCwgc3RhcnQsIGVuZCwKKyAgICAgICAgICAgICAgICAgICAgY29udGV4dFN0YXJ0LCBjb250ZXh0RW5kLCBmbGFncywgYWR2YW5jZXMsIGFkdmFuY2VzSW5kZXgpOworICAgICAgICB9CisKKyAgICAgICAgZmluYWwgZmxvYXQgb2xkU2l6ZSA9IGdldFRleHRTaXplKCk7CisgICAgICAgIHNldFRleHRTaXplKG9sZFNpemUgKiBtQ29tcGF0U2NhbGluZyk7CisgICAgICAgIGZsb2F0IHRvdGFsQWR2YW5jZSA9IG5hdGl2ZV9nZXRUZXh0UnVuQWR2YW5jZXMobU5hdGl2ZVBhaW50LCB0ZXh0LCBzdGFydCwgZW5kLAorICAgICAgICAgICAgICAgIGNvbnRleHRTdGFydCwgY29udGV4dEVuZCwgZmxhZ3MsIGFkdmFuY2VzLCBhZHZhbmNlc0luZGV4KTsKKyAgICAgICAgc2V0VGV4dFNpemUob2xkU2l6ZSk7CisKKyAgICAgICAgaWYgKGFkdmFuY2VzICE9IG51bGwpIHsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSBhZHZhbmNlc0luZGV4LCBlID0gaSArIChlbmQgLSBzdGFydCk7IGkgPCBlOyBpKyspIHsKKyAgICAgICAgICAgICAgICBhZHZhbmNlc1tpXSAqPSBtSW52Q29tcGF0U2NhbGluZzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdG90YWxBZHZhbmNlICogbUludkNvbXBhdFNjYWxpbmc7IC8vIGFzc3VtZSBlcnJvcnMgYXJlIGluc2lnbmlmaWNhbnQKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBuZXh0IGN1cnNvciBwb3NpdGlvbiBpbiB0aGUgcnVuLiAgVGhpcyBhdm9pZHMgcGxhY2luZyB0aGUKKyAgICAgKiBjdXJzb3IgYmV0d2VlbiBzdXJyb2dhdGVzLCBiZXR3ZWVuIGNoYXJhY3RlcnMgdGhhdCBmb3JtIGNvbmp1bmN0cywKKyAgICAgKiBiZXR3ZWVuIGJhc2UgY2hhcmFjdGVycyBhbmQgY29tYmluaW5nIG1hcmtzLCBvciB3aXRoaW4gYSByZW9yZGVyaW5nCisgICAgICogY2x1c3Rlci4KKyAgICAgKgorICAgICAqIDxwPkNvbnRleHRTdGFydCBhbmQgb2Zmc2V0IGFyZSByZWxhdGl2ZSB0byB0aGUgc3RhcnQgb2YgdGV4dC4KKyAgICAgKiBUaGUgY29udGV4dCBpcyB0aGUgc2hhcGluZyBjb250ZXh0IGZvciBjdXJzb3IgbW92ZW1lbnQsIGdlbmVyYWxseQorICAgICAqIHRoZSBib3VuZHMgb2YgdGhlIG1ldHJpYyBzcGFuIGVuY2xvc2luZyB0aGUgY3Vyc29yIGluIHRoZSBkaXJlY3Rpb24gb2YKKyAgICAgKiBtb3ZlbWVudC4KKyAgICAgKgorICAgICAqIDxwPklmIGN1cnNvck9wdCBpcyB7QGxpbmsgI0NVUlNPUl9BVH0gYW5kIHRoZSBvZmZzZXQgaXMgbm90IGEgdmFsaWQKKyAgICAgKiBjdXJzb3IgcG9zaXRpb24sIHRoaXMgcmV0dXJucyAtMS4gIE90aGVyd2lzZSB0aGlzIHdpbGwgbmV2ZXIgcmV0dXJuIGEKKyAgICAgKiB2YWx1ZSBiZWZvcmUgY29udGV4dFN0YXJ0IG9yIGFmdGVyIGNvbnRleHRTdGFydCArIGNvbnRleHRMZW5ndGguCisgICAgICoKKyAgICAgKiBAcGFyYW0gdGV4dCB0aGUgdGV4dAorICAgICAqIEBwYXJhbSBjb250ZXh0U3RhcnQgdGhlIHN0YXJ0IG9mIHRoZSBjb250ZXh0CisgICAgICogQHBhcmFtIGNvbnRleHRMZW5ndGggdGhlIGxlbmd0aCBvZiB0aGUgY29udGV4dAorICAgICAqIEBwYXJhbSBmbGFncyBlaXRoZXIge0BsaW5rICNESVJFQ1RJT05fUlRMfSBvciB7QGxpbmsgI0RJUkVDVElPTl9MVFJ9CisgICAgICogQHBhcmFtIG9mZnNldCB0aGUgY3Vyc29yIHBvc2l0aW9uIHRvIG1vdmUgZnJvbQorICAgICAqIEBwYXJhbSBjdXJzb3JPcHQgaG93IHRvIG1vdmUgdGhlIGN1cnNvciwgb25lIG9mIHtAbGluayAjQ1VSU09SX0FGVEVSfSwKKyAgICAgKiB7QGxpbmsgI0NVUlNPUl9BVF9PUl9BRlRFUn0sIHtAbGluayAjQ1VSU09SX0JFRk9SRX0sCisgICAgICoge0BsaW5rICNDVVJTT1JfQVRfT1JfQkVGT1JFfSwgb3Ige0BsaW5rICNDVVJTT1JfQVR9CisgICAgICogQHJldHVybiB0aGUgb2Zmc2V0IG9mIHRoZSBuZXh0IHBvc2l0aW9uLCBvciAtMQorICAgICAqIEBoaWRlCisgICAgICovCisgICAgcHVibGljIGludCBnZXRUZXh0UnVuQ3Vyc29yKGNoYXJbXSB0ZXh0LCBpbnQgY29udGV4dFN0YXJ0LCBpbnQgY29udGV4dExlbmd0aCwKKyAgICAgICAgICAgIGludCBmbGFncywgaW50IG9mZnNldCwgaW50IGN1cnNvck9wdCkgeworICAgICAgICBpbnQgY29udGV4dEVuZCA9IGNvbnRleHRTdGFydCArIGNvbnRleHRMZW5ndGg7CisgICAgICAgIGlmICgoKGNvbnRleHRTdGFydCB8IGNvbnRleHRFbmQgfCBvZmZzZXQgfCAoY29udGV4dEVuZCAtIGNvbnRleHRTdGFydCkKKyAgICAgICAgICAgICAgICB8IChvZmZzZXQgLSBjb250ZXh0U3RhcnQpIHwgKGNvbnRleHRFbmQgLSBvZmZzZXQpCisgICAgICAgICAgICAgICAgfCAodGV4dC5sZW5ndGggLSBjb250ZXh0RW5kKSB8IGN1cnNvck9wdCkgPCAwKQorICAgICAgICAgICAgICAgIHx8IGN1cnNvck9wdCA+IENVUlNPUl9PUFRfTUFYX1ZBTFVFKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbigpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIG5hdGl2ZV9nZXRUZXh0UnVuQ3Vyc29yKG1OYXRpdmVQYWludCwgdGV4dCwKKyAgICAgICAgICAgICAgICBjb250ZXh0U3RhcnQsIGNvbnRleHRMZW5ndGgsIGZsYWdzLCBvZmZzZXQsIGN1cnNvck9wdCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgbmV4dCBjdXJzb3IgcG9zaXRpb24gaW4gdGhlIHJ1bi4gIFRoaXMgYXZvaWRzIHBsYWNpbmcgdGhlCisgICAgICogY3Vyc29yIGJldHdlZW4gc3Vycm9nYXRlcywgYmV0d2VlbiBjaGFyYWN0ZXJzIHRoYXQgZm9ybSBjb25qdW5jdHMsCisgICAgICogYmV0d2VlbiBiYXNlIGNoYXJhY3RlcnMgYW5kIGNvbWJpbmluZyBtYXJrcywgb3Igd2l0aGluIGEgcmVvcmRlcmluZworICAgICAqIGNsdXN0ZXIuCisgICAgICoKKyAgICAgKiA8cD5Db250ZXh0U3RhcnQsIGNvbnRleHRFbmQsIGFuZCBvZmZzZXQgYXJlIHJlbGF0aXZlIHRvIHRoZSBzdGFydCBvZgorICAgICAqIHRleHQuICBUaGUgY29udGV4dCBpcyB0aGUgc2hhcGluZyBjb250ZXh0IGZvciBjdXJzb3IgbW92ZW1lbnQsIGdlbmVyYWxseQorICAgICAqIHRoZSBib3VuZHMgb2YgdGhlIG1ldHJpYyBzcGFuIGVuY2xvc2luZyB0aGUgY3Vyc29yIGluIHRoZSBkaXJlY3Rpb24gb2YKKyAgICAgKiBtb3ZlbWVudC4KKyAgICAgKgorICAgICAqIDxwPklmIGN1cnNvck9wdCBpcyB7QGxpbmsgI0NVUlNPUl9BVH0gYW5kIHRoZSBvZmZzZXQgaXMgbm90IGEgdmFsaWQKKyAgICAgKiBjdXJzb3IgcG9zaXRpb24sIHRoaXMgcmV0dXJucyAtMS4gIE90aGVyd2lzZSB0aGlzIHdpbGwgbmV2ZXIgcmV0dXJuIGEKKyAgICAgKiB2YWx1ZSBiZWZvcmUgY29udGV4dFN0YXJ0IG9yIGFmdGVyIGNvbnRleHRFbmQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdGV4dCB0aGUgdGV4dAorICAgICAqIEBwYXJhbSBjb250ZXh0U3RhcnQgdGhlIHN0YXJ0IG9mIHRoZSBjb250ZXh0CisgICAgICogQHBhcmFtIGNvbnRleHRFbmQgdGhlIGVuZCBvZiB0aGUgY29udGV4dAorICAgICAqIEBwYXJhbSBmbGFncyBlaXRoZXIge0BsaW5rICNESVJFQ1RJT05fUlRMfSBvciB7QGxpbmsgI0RJUkVDVElPTl9MVFJ9CisgICAgICogQHBhcmFtIG9mZnNldCB0aGUgY3Vyc29yIHBvc2l0aW9uIHRvIG1vdmUgZnJvbQorICAgICAqIEBwYXJhbSBjdXJzb3JPcHQgaG93IHRvIG1vdmUgdGhlIGN1cnNvciwgb25lIG9mIHtAbGluayAjQ1VSU09SX0FGVEVSfSwKKyAgICAgKiB7QGxpbmsgI0NVUlNPUl9BVF9PUl9BRlRFUn0sIHtAbGluayAjQ1VSU09SX0JFRk9SRX0sCisgICAgICoge0BsaW5rICNDVVJTT1JfQVRfT1JfQkVGT1JFfSwgb3Ige0BsaW5rICNDVVJTT1JfQVR9CisgICAgICogQHJldHVybiB0aGUgb2Zmc2V0IG9mIHRoZSBuZXh0IHBvc2l0aW9uLCBvciAtMQorICAgICAqIEBoaWRlCisgICAgICovCisgICAgcHVibGljIGludCBnZXRUZXh0UnVuQ3Vyc29yKENoYXJTZXF1ZW5jZSB0ZXh0LCBpbnQgY29udGV4dFN0YXJ0LAorICAgICAgICAgICBpbnQgY29udGV4dEVuZCwgaW50IGZsYWdzLCBpbnQgb2Zmc2V0LCBpbnQgY3Vyc29yT3B0KSB7CisKKyAgICAgICAgaWYgKHRleHQgaW5zdGFuY2VvZiBTdHJpbmcgfHwgdGV4dCBpbnN0YW5jZW9mIFNwYW5uZWRTdHJpbmcgfHwKKyAgICAgICAgICAgICAgICB0ZXh0IGluc3RhbmNlb2YgU3Bhbm5hYmxlU3RyaW5nKSB7CisgICAgICAgICAgICByZXR1cm4gZ2V0VGV4dFJ1bkN1cnNvcih0ZXh0LnRvU3RyaW5nKCksIGNvbnRleHRTdGFydCwgY29udGV4dEVuZCwKKyAgICAgICAgICAgICAgICAgICAgZmxhZ3MsIG9mZnNldCwgY3Vyc29yT3B0KTsKKyAgICAgICAgfQorICAgICAgICBpZiAodGV4dCBpbnN0YW5jZW9mIEdyYXBoaWNzT3BlcmF0aW9ucykgeworICAgICAgICAgICAgcmV0dXJuICgoR3JhcGhpY3NPcGVyYXRpb25zKSB0ZXh0KS5nZXRUZXh0UnVuQ3Vyc29yKAorICAgICAgICAgICAgICAgICAgICBjb250ZXh0U3RhcnQsIGNvbnRleHRFbmQsIGZsYWdzLCBvZmZzZXQsIGN1cnNvck9wdCwgdGhpcyk7CisgICAgICAgIH0KKworICAgICAgICBpbnQgY29udGV4dExlbiA9IGNvbnRleHRFbmQgLSBjb250ZXh0U3RhcnQ7CisgICAgICAgIGNoYXJbXSBidWYgPSBUZW1wb3JhcnlCdWZmZXIub2J0YWluKGNvbnRleHRMZW4pOworICAgICAgICBUZXh0VXRpbHMuZ2V0Q2hhcnModGV4dCwgY29udGV4dFN0YXJ0LCBjb250ZXh0RW5kLCBidWYsIDApOworICAgICAgICBpbnQgcmVzdWx0ID0gZ2V0VGV4dFJ1bkN1cnNvcihidWYsIDAsIGNvbnRleHRMZW4sIGZsYWdzLCBvZmZzZXQsIGN1cnNvck9wdCk7CisgICAgICAgIFRlbXBvcmFyeUJ1ZmZlci5yZWN5Y2xlKGJ1Zik7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgbmV4dCBjdXJzb3IgcG9zaXRpb24gaW4gdGhlIHJ1bi4gIFRoaXMgYXZvaWRzIHBsYWNpbmcgdGhlCisgICAgICogY3Vyc29yIGJldHdlZW4gc3Vycm9nYXRlcywgYmV0d2VlbiBjaGFyYWN0ZXJzIHRoYXQgZm9ybSBjb25qdW5jdHMsCisgICAgICogYmV0d2VlbiBiYXNlIGNoYXJhY3RlcnMgYW5kIGNvbWJpbmluZyBtYXJrcywgb3Igd2l0aGluIGEgcmVvcmRlcmluZworICAgICAqIGNsdXN0ZXIuCisgICAgICoKKyAgICAgKiA8cD5Db250ZXh0U3RhcnQsIGNvbnRleHRFbmQsIGFuZCBvZmZzZXQgYXJlIHJlbGF0aXZlIHRvIHRoZSBzdGFydCBvZgorICAgICAqIHRleHQuICBUaGUgY29udGV4dCBpcyB0aGUgc2hhcGluZyBjb250ZXh0IGZvciBjdXJzb3IgbW92ZW1lbnQsIGdlbmVyYWxseQorICAgICAqIHRoZSBib3VuZHMgb2YgdGhlIG1ldHJpYyBzcGFuIGVuY2xvc2luZyB0aGUgY3Vyc29yIGluIHRoZSBkaXJlY3Rpb24gb2YKKyAgICAgKiBtb3ZlbWVudC4KKyAgICAgKgorICAgICAqIDxwPklmIGN1cnNvck9wdCBpcyB7QGxpbmsgI0NVUlNPUl9BVH0gYW5kIHRoZSBvZmZzZXQgaXMgbm90IGEgdmFsaWQKKyAgICAgKiBjdXJzb3IgcG9zaXRpb24sIHRoaXMgcmV0dXJucyAtMS4gIE90aGVyd2lzZSB0aGlzIHdpbGwgbmV2ZXIgcmV0dXJuIGEKKyAgICAgKiB2YWx1ZSBiZWZvcmUgY29udGV4dFN0YXJ0IG9yIGFmdGVyIGNvbnRleHRFbmQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdGV4dCB0aGUgdGV4dAorICAgICAqIEBwYXJhbSBjb250ZXh0U3RhcnQgdGhlIHN0YXJ0IG9mIHRoZSBjb250ZXh0CisgICAgICogQHBhcmFtIGNvbnRleHRFbmQgdGhlIGVuZCBvZiB0aGUgY29udGV4dAorICAgICAqIEBwYXJhbSBmbGFncyBlaXRoZXIge0BsaW5rICNESVJFQ1RJT05fUlRMfSBvciB7QGxpbmsgI0RJUkVDVElPTl9MVFJ9CisgICAgICogQHBhcmFtIG9mZnNldCB0aGUgY3Vyc29yIHBvc2l0aW9uIHRvIG1vdmUgZnJvbQorICAgICAqIEBwYXJhbSBjdXJzb3JPcHQgaG93IHRvIG1vdmUgdGhlIGN1cnNvciwgb25lIG9mIHtAbGluayAjQ1VSU09SX0FGVEVSfSwKKyAgICAgKiB7QGxpbmsgI0NVUlNPUl9BVF9PUl9BRlRFUn0sIHtAbGluayAjQ1VSU09SX0JFRk9SRX0sCisgICAgICoge0BsaW5rICNDVVJTT1JfQVRfT1JfQkVGT1JFfSwgb3Ige0BsaW5rICNDVVJTT1JfQVR9CisgICAgICogQHJldHVybiB0aGUgb2Zmc2V0IG9mIHRoZSBuZXh0IHBvc2l0aW9uLCBvciAtMQorICAgICAqIEBoaWRlCisgICAgICovCisgICAgcHVibGljIGludCBnZXRUZXh0UnVuQ3Vyc29yKFN0cmluZyB0ZXh0LCBpbnQgY29udGV4dFN0YXJ0LCBpbnQgY29udGV4dEVuZCwKKyAgICAgICAgICAgIGludCBmbGFncywgaW50IG9mZnNldCwgaW50IGN1cnNvck9wdCkgeworICAgICAgICBpZiAoKChjb250ZXh0U3RhcnQgfCBjb250ZXh0RW5kIHwgb2Zmc2V0IHwgKGNvbnRleHRFbmQgLSBjb250ZXh0U3RhcnQpCisgICAgICAgICAgICAgICAgfCAob2Zmc2V0IC0gY29udGV4dFN0YXJ0KSB8IChjb250ZXh0RW5kIC0gb2Zmc2V0KQorICAgICAgICAgICAgICAgIHwgKHRleHQubGVuZ3RoKCkgLSBjb250ZXh0RW5kKSB8IGN1cnNvck9wdCkgPCAwKQorICAgICAgICAgICAgICAgIHx8IGN1cnNvck9wdCA+IENVUlNPUl9PUFRfTUFYX1ZBTFVFKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbigpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIG5hdGl2ZV9nZXRUZXh0UnVuQ3Vyc29yKG1OYXRpdmVQYWludCwgdGV4dCwKKyAgICAgICAgICAgICAgICBjb250ZXh0U3RhcnQsIGNvbnRleHRFbmQsIGZsYWdzLCBvZmZzZXQsIGN1cnNvck9wdCk7CisgICAgfQorCisgICAgLyoqCiAgICAgICogUmV0dXJuIHRoZSBwYXRoIChvdXRsaW5lKSBmb3IgdGhlIHNwZWNpZmllZCB0ZXh0LgogICAgICAqIE5vdGU6IGp1c3QgbGlrZSBDYW52YXMuZHJhd1RleHQsIHRoaXMgd2lsbCByZXNwZWN0IHRoZSBBbGlnbiBzZXR0aW5nIGluCiAgICAgICogdGhlIHBhaW50LgpAQCAtMTI5OSw3ICsxNzUyLDggQEAKICAgICAgICAgaWYgKChpbmRleCB8IGNvdW50KSA8IDAgfHwgaW5kZXggKyBjb3VudCA+IHRleHQubGVuZ3RoKSB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKCk7CiAgICAgICAgIH0KLSAgICAgICAgbmF0aXZlX2dldFRleHRQYXRoKG1OYXRpdmVQYWludCwgdGV4dCwgaW5kZXgsIGNvdW50LCB4LCB5LCBwYXRoLm5pKCkpOworICAgICAgICBuYXRpdmVfZ2V0VGV4dFBhdGgobU5hdGl2ZVBhaW50LCBtQmlkaUZsYWdzLCB0ZXh0LCBpbmRleCwgY291bnQsIHgsIHksIAorICAgICAgICAgICAgICAgIHBhdGgubmkoKSk7CiAgICAgfQogCiAgICAgLyoqCkBAIC0xMzIwLDcgKzE3NzQsOCBAQAogICAgICAgICBpZiAoKHN0YXJ0IHwgZW5kIHwgKGVuZCAtIHN0YXJ0KSB8ICh0ZXh0Lmxlbmd0aCgpIC0gZW5kKSkgPCAwKSB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbigpOwogICAgICAgICB9Ci0gICAgICAgIG5hdGl2ZV9nZXRUZXh0UGF0aChtTmF0aXZlUGFpbnQsIHRleHQsIHN0YXJ0LCBlbmQsIHgsIHksIHBhdGgubmkoKSk7CisgICAgICAgIG5hdGl2ZV9nZXRUZXh0UGF0aChtTmF0aXZlUGFpbnQsIG1CaWRpRmxhZ3MsIHRleHQsIHN0YXJ0LCBlbmQsIHgsIHksIAorICAgICAgICAgICAgICAgIHBhdGgubmkoKSk7CiAgICAgfQogICAgIAogICAgIC8qKgpAQCAtMTQwNCw5ICsxODU5LDIyIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhcltdIHRleHQsIGludCBpbmRleCwgaW50IGNvdW50LCBmbG9hdFtdIHdpZHRocyk7CiAgICAgcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIGludCBuYXRpdmVfZ2V0VGV4dFdpZHRocyhpbnQgbmF0aXZlX29iamVjdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgdGV4dCwgaW50IHN0YXJ0LCBpbnQgZW5kLCBmbG9hdFtdIHdpZHRocyk7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIHZvaWQgbmF0aXZlX2dldFRleHRQYXRoKGludCBuYXRpdmVfb2JqZWN0LAorCisgICAgcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIGZsb2F0IG5hdGl2ZV9nZXRUZXh0UnVuQWR2YW5jZXMoaW50IG5hdGl2ZV9vYmplY3QsCisgICAgICAgICAgICBjaGFyW10gdGV4dCwgaW50IGluZGV4LCBpbnQgY291bnQsIGludCBjb250ZXh0SW5kZXgsIGludCBjb250ZXh0Q291bnQsCisgICAgICAgICAgICBpbnQgZmxhZ3MsIGZsb2F0W10gYWR2YW5jZXMsIGludCBhZHZhbmNlc0luZGV4KTsKKyAgICBwcml2YXRlIHN0YXRpYyBuYXRpdmUgZmxvYXQgbmF0aXZlX2dldFRleHRSdW5BZHZhbmNlcyhpbnQgbmF0aXZlX29iamVjdCwKKyAgICAgICAgICAgIFN0cmluZyB0ZXh0LCBpbnQgc3RhcnQsIGludCBlbmQsIGludCBjb250ZXh0U3RhcnQsIGludCBjb250ZXh0RW5kLAorICAgICAgICAgICAgaW50IGZsYWdzLCBmbG9hdFtdIGFkdmFuY2VzLCBpbnQgYWR2YW5jZXNJbmRleCk7CisKKyAgICBwcml2YXRlIG5hdGl2ZSBpbnQgbmF0aXZlX2dldFRleHRSdW5DdXJzb3IoaW50IG5hdGl2ZV9vYmplY3QsIGNoYXJbXSB0ZXh0LAorICAgICAgICAgICAgaW50IGNvbnRleHRTdGFydCwgaW50IGNvbnRleHRMZW5ndGgsIGludCBmbGFncywgaW50IG9mZnNldCwgaW50IGN1cnNvck9wdCk7CisgICAgcHJpdmF0ZSBuYXRpdmUgaW50IG5hdGl2ZV9nZXRUZXh0UnVuQ3Vyc29yKGludCBuYXRpdmVfb2JqZWN0LCBTdHJpbmcgdGV4dCwKKyAgICAgICAgICAgIGludCBjb250ZXh0U3RhcnQsIGludCBjb250ZXh0RW5kLCBpbnQgZmxhZ3MsIGludCBvZmZzZXQsIGludCBjdXJzb3JPcHQpOworCisgICAgcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIHZvaWQgbmF0aXZlX2dldFRleHRQYXRoKGludCBuYXRpdmVfb2JqZWN0LCBpbnQgYmlkaUZsYWdzLAogICAgICAgICAgICAgICAgIGNoYXJbXSB0ZXh0LCBpbnQgaW5kZXgsIGludCBjb3VudCwgZmxvYXQgeCwgZmxvYXQgeSwgaW50IHBhdGgpOwotICAgIHByaXZhdGUgc3RhdGljIG5hdGl2ZSB2b2lkIG5hdGl2ZV9nZXRUZXh0UGF0aChpbnQgbmF0aXZlX29iamVjdCwKKyAgICBwcml2YXRlIHN0YXRpYyBuYXRpdmUgdm9pZCBuYXRpdmVfZ2V0VGV4dFBhdGgoaW50IG5hdGl2ZV9vYmplY3QsIGludCBiaWRpRmxhZ3MsCiAgICAgICAgICAgICAgICAgU3RyaW5nIHRleHQsIGludCBzdGFydCwgaW50IGVuZCwgZmxvYXQgeCwgZmxvYXQgeSwgaW50IHBhdGgpOwogICAgIHByaXZhdGUgc3RhdGljIG5hdGl2ZSB2b2lkIG5hdGl2ZUdldFN0cmluZ0JvdW5kcyhpbnQgbmF0aXZlUGFpbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyB0ZXh0LCBpbnQgc3RhcnQsIGludCBlbmQsIFJlY3QgYm91bmRzKTsKQEAgLTE0MTQsNCArMTg4MiwzIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXJbXSB0ZXh0LCBpbnQgaW5kZXgsIGludCBjb3VudCwgUmVjdCBib3VuZHMpOwogICAgIHByaXZhdGUgc3RhdGljIG5hdGl2ZSB2b2lkIGZpbmFsaXplcihpbnQgbmF0aXZlUGFpbnQpOwogfQotCmRpZmYgLS1naXQgYS9ncmFwaGljcy9qYXZhL2FuZHJvaWQvZ3JhcGhpY3MvUGF0aC5qYXZhIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL2dyYXBoaWNzL1BhdGguamF2YQppbmRleCAyODE4MjNhLi5jMzQxNmEwIDEwMDY0NAotLS0gYS9ncmFwaGljcy9qYXZhL2FuZHJvaWQvZ3JhcGhpY3MvUGF0aC5qYXZhCisrKyBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9ncmFwaGljcy9QYXRoLmphdmEKQEAgLTE2LDYgKzE2LDggQEAKIAogcGFja2FnZSBhbmRyb2lkLmdyYXBoaWNzOwogCitpbXBvcnQgYW5kcm9pZC52aWV3LkhhcmR3YXJlUmVuZGVyZXI7CisKIC8qKgogICogVGhlIFBhdGggY2xhc3MgZW5jYXBzdWxhdGVzIGNvbXBvdW5kIChtdWx0aXBsZSBjb250b3VyKSBnZW9tZXRyaWMgcGF0aHMKICAqIGNvbnNpc3Rpbmcgb2Ygc3RyYWlnaHQgbGluZSBzZWdtZW50cywgcXVhZHJhdGljIGN1cnZlcywgYW5kIGN1YmljIGN1cnZlcy4KQEAgLTI0LDEyICsyNiwyNyBAQAogICogdGV4dCBvbiBhIHBhdGguCiAgKi8KIHB1YmxpYyBjbGFzcyBQYXRoIHsKKyAgICAvKioKKyAgICAgKiBAaGlkZQorICAgICAqLworICAgIHB1YmxpYyBmaW5hbCBpbnQgbU5hdGl2ZVBhdGg7CisKKyAgICAvKioKKyAgICAgKiBAaGlkZQorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzU2ltcGxlUGF0aCA9IHRydWU7CisgICAgLyoqCisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgUmVnaW9uIHJlY3RzOworICAgIHByaXZhdGUgYm9vbGVhbiBtRGV0ZWN0U2ltcGxlUGF0aHM7CiAKICAgICAvKioKICAgICAgKiBDcmVhdGUgYW4gZW1wdHkgcGF0aAogICAgICAqLwogICAgIHB1YmxpYyBQYXRoKCkgewogICAgICAgICBtTmF0aXZlUGF0aCA9IGluaXQxKCk7CisgICAgICAgIG1EZXRlY3RTaW1wbGVQYXRocyA9IEhhcmR3YXJlUmVuZGVyZXIuaXNBdmFpbGFibGUoKTsKICAgICB9CiAKICAgICAvKioKQEAgLTQzLDYgKzYwLDcgQEAKICAgICAgICAgICAgIHZhbE5hdGl2ZSA9IHNyYy5tTmF0aXZlUGF0aDsKICAgICAgICAgfQogICAgICAgICBtTmF0aXZlUGF0aCA9IGluaXQyKHZhbE5hdGl2ZSk7CisgICAgICAgIG1EZXRlY3RTaW1wbGVQYXRocyA9IEhhcmR3YXJlUmVuZGVyZXIuaXNBdmFpbGFibGUoKTsKICAgICB9CiAgICAgCiAgICAgLyoqCkBAIC01MCw2ICs2OCwxMCBAQAogICAgICAqIFRoaXMgZG9lcyBOT1QgY2hhbmdlIHRoZSBmaWxsLXR5cGUgc2V0dGluZy4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCByZXNldCgpIHsKKyAgICAgICAgaXNTaW1wbGVQYXRoID0gdHJ1ZTsKKyAgICAgICAgaWYgKG1EZXRlY3RTaW1wbGVQYXRocykgeworICAgICAgICAgICAgaWYgKHJlY3RzICE9IG51bGwpIHJlY3RzLnNldEVtcHR5KCk7CisgICAgICAgIH0KICAgICAgICAgbmF0aXZlX3Jlc2V0KG1OYXRpdmVQYXRoKTsKICAgICB9CiAKQEAgLTU4LDYgKzgwLDEwIEBACiAgICAgICoga2VlcHMgdGhlIGludGVybmFsIGRhdGEgc3RydWN0dXJlIGZvciBmYXN0ZXIgcmV1c2UuCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgcmV3aW5kKCkgeworICAgICAgICBpc1NpbXBsZVBhdGggPSB0cnVlOworICAgICAgICBpZiAobURldGVjdFNpbXBsZVBhdGhzKSB7CisgICAgICAgICAgICBpZiAocmVjdHMgIT0gbnVsbCkgcmVjdHMuc2V0RW1wdHkoKTsKKyAgICAgICAgfQogICAgICAgICBuYXRpdmVfcmV3aW5kKG1OYXRpdmVQYXRoKTsKICAgICB9CiAKQEAgLTY1LDYgKzkxLDcgQEAKICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldChQYXRoIHNyYykgewogICAgICAgICBpZiAodGhpcyAhPSBzcmMpIHsKKyAgICAgICAgICAgIGlzU2ltcGxlUGF0aCA9IHNyYy5pc1NpbXBsZVBhdGg7CiAgICAgICAgICAgICBuYXRpdmVfc2V0KG1OYXRpdmVQYXRoLCBzcmMubU5hdGl2ZVBhdGgpOwogICAgICAgICB9CiAgICAgfQpAQCAtMTYwLDYgKzE4Nyw3IEBACiAgICAgICogQHBhcmFtIGJvdW5kcyBSZXR1cm5zIHRoZSBjb21wdXRlZCBib3VuZHMgb2YgdGhlIHBhdGgncyBjb250cm9sIHBvaW50cy4KICAgICAgKiBAcGFyYW0gZXhhY3QgVGhpcyBwYXJhbWV0ZXIgaXMgbm8gbG9uZ2VyIHVzZWQuCiAgICAgICovCisgICAgQFN1cHByZXNzV2FybmluZ3MoeyJVbnVzZWREZWNsYXJhdGlvbiJ9KQogICAgIHB1YmxpYyB2b2lkIGNvbXB1dGVCb3VuZHMoUmVjdEYgYm91bmRzLCBib29sZWFuIGV4YWN0KSB7CiAgICAgICAgIG5hdGl2ZV9jb21wdXRlQm91bmRzKG1OYXRpdmVQYXRoLCBib3VuZHMpOwogICAgIH0KQEAgLTIzNiw2ICsyNjQsNyBAQAogICAgICAqIEBwYXJhbSB5MiBUaGUgeS1jb29yZGluYXRlIG9mIHRoZSBlbmQgcG9pbnQgb24gYSBxdWFkcmF0aWMgY3VydmUKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBxdWFkVG8oZmxvYXQgeDEsIGZsb2F0IHkxLCBmbG9hdCB4MiwgZmxvYXQgeTIpIHsKKyAgICAgICAgaXNTaW1wbGVQYXRoID0gZmFsc2U7CiAgICAgICAgIG5hdGl2ZV9xdWFkVG8obU5hdGl2ZVBhdGgsIHgxLCB5MSwgeDIsIHkyKTsKICAgICB9CiAKQEAgLTI1NCw2ICsyODMsNyBAQAogICAgICAqICAgICAgICAgICAgdGhpcyBjb250b3VyLCBmb3IgdGhlIGVuZCBwb2ludCBvZiBhIHF1YWRyYXRpYyBjdXJ2ZQogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHJRdWFkVG8oZmxvYXQgZHgxLCBmbG9hdCBkeTEsIGZsb2F0IGR4MiwgZmxvYXQgZHkyKSB7CisgICAgICAgIGlzU2ltcGxlUGF0aCA9IGZhbHNlOwogICAgICAgICBuYXRpdmVfclF1YWRUbyhtTmF0aXZlUGF0aCwgZHgxLCBkeTEsIGR4MiwgZHkyKTsKICAgICB9CiAKQEAgLTI3MSw2ICszMDEsNyBAQAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIGN1YmljVG8oZmxvYXQgeDEsIGZsb2F0IHkxLCBmbG9hdCB4MiwgZmxvYXQgeTIsCiAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCB4MywgZmxvYXQgeTMpIHsKKyAgICAgICAgaXNTaW1wbGVQYXRoID0gZmFsc2U7CiAgICAgICAgIG5hdGl2ZV9jdWJpY1RvKG1OYXRpdmVQYXRoLCB4MSwgeTEsIHgyLCB5MiwgeDMsIHkzKTsKICAgICB9CiAKQEAgLTI4MSw2ICszMTIsNyBAQAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHJDdWJpY1RvKGZsb2F0IHgxLCBmbG9hdCB5MSwgZmxvYXQgeDIsIGZsb2F0IHkyLAogICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHgzLCBmbG9hdCB5MykgeworICAgICAgICBpc1NpbXBsZVBhdGggPSBmYWxzZTsKICAgICAgICAgbmF0aXZlX3JDdWJpY1RvKG1OYXRpdmVQYXRoLCB4MSwgeTEsIHgyLCB5MiwgeDMsIHkzKTsKICAgICB9CiAKQEAgLTI5OSw2ICszMzEsNyBAQAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIGFyY1RvKFJlY3RGIG92YWwsIGZsb2F0IHN0YXJ0QW5nbGUsIGZsb2F0IHN3ZWVwQW5nbGUsCiAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBmb3JjZU1vdmVUbykgeworICAgICAgICBpc1NpbXBsZVBhdGggPSBmYWxzZTsKICAgICAgICAgbmF0aXZlX2FyY1RvKG1OYXRpdmVQYXRoLCBvdmFsLCBzdGFydEFuZ2xlLCBzd2VlcEFuZ2xlLCBmb3JjZU1vdmVUbyk7CiAgICAgfQogICAgIApAQCAtMzE0LDYgKzM0Nyw3IEBACiAgICAgICogQHBhcmFtIHN3ZWVwQW5nbGUgIFN3ZWVwIGFuZ2xlIChpbiBkZWdyZWVzKSBtZWFzdXJlZCBjbG9ja3dpc2UKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBhcmNUbyhSZWN0RiBvdmFsLCBmbG9hdCBzdGFydEFuZ2xlLCBmbG9hdCBzd2VlcEFuZ2xlKSB7CisgICAgICAgIGlzU2ltcGxlUGF0aCA9IGZhbHNlOwogICAgICAgICBuYXRpdmVfYXJjVG8obU5hdGl2ZVBhdGgsIG92YWwsIHN0YXJ0QW5nbGUsIHN3ZWVwQW5nbGUsIGZhbHNlKTsKICAgICB9CiAgICAgCkBAIC0zMjIsNiArMzU2LDcgQEAKICAgICAgKiBmaXJzdCBwb2ludCBvZiB0aGUgY29udG91ciwgYSBsaW5lIHNlZ21lbnQgaXMgYXV0b21hdGljYWxseSBhZGRlZC4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBjbG9zZSgpIHsKKyAgICAgICAgaXNTaW1wbGVQYXRoID0gZmFsc2U7CiAgICAgICAgIG5hdGl2ZV9jbG9zZShtTmF0aXZlUGF0aCk7CiAgICAgfQogCkBAIC0zNTEsNiArMzg2LDExIEBACiAgICAgICAgIGlmIChyZWN0ID09IG51bGwpIHsKICAgICAgICAgICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigibmVlZCByZWN0IHBhcmFtZXRlciIpOwogICAgICAgICB9CisgICAgICAgIGlmIChtRGV0ZWN0U2ltcGxlUGF0aHMpIHsKKyAgICAgICAgICAgIGlmIChyZWN0cyA9PSBudWxsKSByZWN0cyA9IG5ldyBSZWdpb24oKTsKKyAgICAgICAgICAgIHJlY3RzLm9wKChpbnQpIHJlY3QubGVmdCwgKGludCkgcmVjdC50b3AsIChpbnQpIHJlY3QucmlnaHQsIChpbnQpIHJlY3QuYm90dG9tLAorICAgICAgICAgICAgICAgICAgICBSZWdpb24uT3AuVU5JT04pOworICAgICAgICB9CiAgICAgICAgIG5hdGl2ZV9hZGRSZWN0KG1OYXRpdmVQYXRoLCByZWN0LCBkaXIubmF0aXZlSW50KTsKICAgICB9CiAKQEAgLTM2Myw4ICs0MDMsMTEgQEAKICAgICAgKiBAcGFyYW0gYm90dG9tIFRoZSBib3R0b20gb2YgYSByZWN0YW5nbGUgdG8gYWRkIHRvIHRoZSBwYXRoCiAgICAgICogQHBhcmFtIGRpciAgICBUaGUgZGlyZWN0aW9uIHRvIHdpbmQgdGhlIHJlY3RhbmdsZSdzIGNvbnRvdXIKICAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBhZGRSZWN0KGZsb2F0IGxlZnQsIGZsb2F0IHRvcCwgZmxvYXQgcmlnaHQsIGZsb2F0IGJvdHRvbSwKLSAgICAgICAgICAgICAgICAgICAgICAgIERpcmVjdGlvbiBkaXIpIHsKKyAgICBwdWJsaWMgdm9pZCBhZGRSZWN0KGZsb2F0IGxlZnQsIGZsb2F0IHRvcCwgZmxvYXQgcmlnaHQsIGZsb2F0IGJvdHRvbSwgRGlyZWN0aW9uIGRpcikgeworICAgICAgICBpZiAobURldGVjdFNpbXBsZVBhdGhzKSB7CisgICAgICAgICAgICBpZiAocmVjdHMgPT0gbnVsbCkgcmVjdHMgPSBuZXcgUmVnaW9uKCk7CisgICAgICAgICAgICByZWN0cy5vcCgoaW50KSBsZWZ0LCAoaW50KSB0b3AsIChpbnQpIHJpZ2h0LCAoaW50KSBib3R0b20sIFJlZ2lvbi5PcC5VTklPTik7CisgICAgICAgIH0KICAgICAgICAgbmF0aXZlX2FkZFJlY3QobU5hdGl2ZVBhdGgsIGxlZnQsIHRvcCwgcmlnaHQsIGJvdHRvbSwgZGlyLm5hdGl2ZUludCk7CiAgICAgfQogCkBAIC0zNzgsNiArNDIxLDcgQEAKICAgICAgICAgaWYgKG92YWwgPT0gbnVsbCkgewogICAgICAgICAgICAgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCJuZWVkIG92YWwgcGFyYW1ldGVyIik7CiAgICAgICAgIH0KKyAgICAgICAgaXNTaW1wbGVQYXRoID0gZmFsc2U7CiAgICAgICAgIG5hdGl2ZV9hZGRPdmFsKG1OYXRpdmVQYXRoLCBvdmFsLCBkaXIubmF0aXZlSW50KTsKICAgICB9CiAKQEAgLTM5MCw2ICs0MzQsNyBAQAogICAgICAqIEBwYXJhbSBkaXIgICAgVGhlIGRpcmVjdGlvbiB0byB3aW5kIHRoZSBjaXJjbGUncyBjb250b3VyCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgYWRkQ2lyY2xlKGZsb2F0IHgsIGZsb2F0IHksIGZsb2F0IHJhZGl1cywgRGlyZWN0aW9uIGRpcikgeworICAgICAgICBpc1NpbXBsZVBhdGggPSBmYWxzZTsKICAgICAgICAgbmF0aXZlX2FkZENpcmNsZShtTmF0aXZlUGF0aCwgeCwgeSwgcmFkaXVzLCBkaXIubmF0aXZlSW50KTsKICAgICB9CiAKQEAgLTQwNCw2ICs0NDksNyBAQAogICAgICAgICBpZiAob3ZhbCA9PSBudWxsKSB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oIm5lZWQgb3ZhbCBwYXJhbWV0ZXIiKTsKICAgICAgICAgfQorICAgICAgICBpc1NpbXBsZVBhdGggPSBmYWxzZTsKICAgICAgICAgbmF0aXZlX2FkZEFyYyhtTmF0aXZlUGF0aCwgb3ZhbCwgc3RhcnRBbmdsZSwgc3dlZXBBbmdsZSk7CiAgICAgfQogCkBAIC00MTksNiArNDY1LDcgQEAKICAgICAgICAgaWYgKHJlY3QgPT0gbnVsbCkgewogICAgICAgICAgICAgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCJuZWVkIHJlY3QgcGFyYW1ldGVyIik7CiAgICAgICAgIH0KKyAgICAgICAgaXNTaW1wbGVQYXRoID0gZmFsc2U7CiAgICAgICAgIG5hdGl2ZV9hZGRSb3VuZFJlY3QobU5hdGl2ZVBhdGgsIHJlY3QsIHJ4LCByeSwgZGlyLm5hdGl2ZUludCk7CiAgICAgfQogICAgIApAQCAtNDM4LDYgKzQ4NSw3IEBACiAgICAgICAgIGlmIChyYWRpaS5sZW5ndGggPCA4KSB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKCJyYWRpaVtdIG5lZWRzIDggdmFsdWVzIik7CiAgICAgICAgIH0KKyAgICAgICAgaXNTaW1wbGVQYXRoID0gZmFsc2U7CiAgICAgICAgIG5hdGl2ZV9hZGRSb3VuZFJlY3QobU5hdGl2ZVBhdGgsIHJlY3QsIHJhZGlpLCBkaXIubmF0aXZlSW50KTsKICAgICB9CiAgICAgCkBAIC00NDgsNiArNDk2LDcgQEAKICAgICAgKiBAcGFyYW0gZHggIFRoZSBhbW91bnQgdG8gdHJhbnNsYXRlIHRoZSBwYXRoIGluIFggYXMgaXQgaXMgYWRkZWQKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBhZGRQYXRoKFBhdGggc3JjLCBmbG9hdCBkeCwgZmxvYXQgZHkpIHsKKyAgICAgICAgaXNTaW1wbGVQYXRoID0gZmFsc2U7CiAgICAgICAgIG5hdGl2ZV9hZGRQYXRoKG1OYXRpdmVQYXRoLCBzcmMubU5hdGl2ZVBhdGgsIGR4LCBkeSk7CiAgICAgfQogCkBAIC00NTcsNiArNTA2LDcgQEAKICAgICAgKiBAcGFyYW0gc3JjIFRoZSBwYXRoIHRoYXQgaXMgYXBwZW5kZWQgdG8gdGhlIGN1cnJlbnQgcGF0aAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIGFkZFBhdGgoUGF0aCBzcmMpIHsKKyAgICAgICAgaXNTaW1wbGVQYXRoID0gZmFsc2U7CiAgICAgICAgIG5hdGl2ZV9hZGRQYXRoKG1OYXRpdmVQYXRoLCBzcmMubU5hdGl2ZVBhdGgpOwogICAgIH0KIApAQCAtNDY2LDYgKzUxNiw3IEBACiAgICAgICogQHBhcmFtIHNyYyBUaGUgcGF0aCB0byBhZGQgYXMgYSBuZXcgY29udG91cgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIGFkZFBhdGgoUGF0aCBzcmMsIE1hdHJpeCBtYXRyaXgpIHsKKyAgICAgICAgaWYgKCFzcmMuaXNTaW1wbGVQYXRoKSBpc1NpbXBsZVBhdGggPSBmYWxzZTsKICAgICAgICAgbmF0aXZlX2FkZFBhdGgobU5hdGl2ZVBhdGgsIHNyYy5tTmF0aXZlUGF0aCwgbWF0cml4Lm5hdGl2ZV9pbnN0YW5jZSk7CiAgICAgfQogCkBAIC01MDIsNiArNTUzLDcgQEAKICAgICAgKiBAcGFyYW0gZHkgVGhlIG5ldyBZIGNvb3JkaW5hdGUgZm9yIHRoZSBsYXN0IHBvaW50CiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0TGFzdFBvaW50KGZsb2F0IGR4LCBmbG9hdCBkeSkgeworICAgICAgICBpc1NpbXBsZVBhdGggPSBmYWxzZTsKICAgICAgICAgbmF0aXZlX3NldExhc3RQb2ludChtTmF0aXZlUGF0aCwgZHgsIGR5KTsKICAgICB9CiAKQEAgLTUzNyw4ICs1ODksOCBAQAogICAgICAgICAgICAgc3VwZXIuZmluYWxpemUoKTsKICAgICAgICAgfQogICAgIH0KLSAgICAKLSAgICAvKnBhY2thZ2UqLyBmaW5hbCBpbnQgbmkoKSB7CisKKyAgICBmaW5hbCBpbnQgbmkoKSB7CiAgICAgICAgIHJldHVybiBtTmF0aXZlUGF0aDsKICAgICB9CiAKQEAgLTU5Miw2ICs2NDQsNCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRzdF9wYXRoKTsKICAgICBwcml2YXRlIHN0YXRpYyBuYXRpdmUgdm9pZCBuYXRpdmVfdHJhbnNmb3JtKGludCBuUGF0aCwgaW50IG1hdHJpeCk7CiAgICAgcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIHZvaWQgZmluYWxpemVyKGludCBuUGF0aCk7Ci0KLSAgICBwcml2YXRlIGZpbmFsIGludCBtTmF0aXZlUGF0aDsKIH0KZGlmZiAtLWdpdCBhL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9ncmFwaGljcy9Qb3J0ZXJEdWZmLmphdmEgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvZ3JhcGhpY3MvUG9ydGVyRHVmZi5qYXZhCmluZGV4IDM5MDQyMzQuLjJlZjE2NjIgMTAwNjQ0Ci0tLSBhL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9ncmFwaGljcy9Qb3J0ZXJEdWZmLmphdmEKKysrIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL2dyYXBoaWNzL1BvcnRlckR1ZmYuamF2YQpAQCAtNTMsMTEgKzUzLDE4IEBACiAgICAgICAgIC8qKiBbU2EgKiBEYSwgU2MgKiBEY10gKi8KICAgICAgICAgTVVMVElQTFkgICAgKDE0KSwKICAgICAgICAgLyoqIFtTYSArIERhIC0gU2EgKiBEYSwgU2MgKyBEYyAtIFNjICogRGNdICovCi0gICAgICAgIFNDUkVFTiAgICAgICgxNSk7CisgICAgICAgIFNDUkVFTiAgICAgICgxNSksCisgICAgICAgIC8qKiBTYXR1cmF0ZShTICsgRCkgKi8KKyAgICAgICAgQUREICAgICAgICAgKDE2KSwKKyAgICAgICAgT1ZFUkxBWSAgICAgKDE3KTsKIAogICAgICAgICBNb2RlKGludCBuYXRpdmVJbnQpIHsKICAgICAgICAgICAgIHRoaXMubmF0aXZlSW50ID0gbmF0aXZlSW50OwogICAgICAgICB9Ci0gICAgICAgIGZpbmFsIGludCBuYXRpdmVJbnQ7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBoaWRlCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgZmluYWwgaW50IG5hdGl2ZUludDsKICAgICB9CiB9CmRpZmYgLS1naXQgYS9ncmFwaGljcy9qYXZhL2FuZHJvaWQvZ3JhcGhpY3MvUG9ydGVyRHVmZkNvbG9yRmlsdGVyLmphdmEgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvZ3JhcGhpY3MvUG9ydGVyRHVmZkNvbG9yRmlsdGVyLmphdmEKaW5kZXggMDY3MjRiZC4uYjAyZGFiMSAxMDA2NDQKLS0tIGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL2dyYXBoaWNzL1BvcnRlckR1ZmZDb2xvckZpbHRlci5qYXZhCisrKyBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9ncmFwaGljcy9Qb3J0ZXJEdWZmQ29sb3JGaWx0ZXIuamF2YQpAQCAtMjUsMTAgKzI1LDEwIEBACiAgICAgICogQHBhcmFtIG1vZGUgICAgICAgICAgIFRoZSBwb3J0ZXItZHVmZiBtb2RlIHRoYXQgaXMgYXBwbGllZAogICAgICAqLwogICAgIHB1YmxpYyBQb3J0ZXJEdWZmQ29sb3JGaWx0ZXIoaW50IHNyY0NvbG9yLCBQb3J0ZXJEdWZmLk1vZGUgbW9kZSkgewotICAgICAgICBuYXRpdmVfaW5zdGFuY2UgPSBuYXRpdmVfQ3JlYXRlUG9ydGVyRHVmZkZpbHRlcihzcmNDb2xvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kZS5uYXRpdmVJbnQpOworICAgICAgICBuYXRpdmVfaW5zdGFuY2UgPSBuYXRpdmVfQ3JlYXRlUG9ydGVyRHVmZkZpbHRlcihzcmNDb2xvciwgbW9kZS5uYXRpdmVJbnQpOworICAgICAgICBuYXRpdmVDb2xvckZpbHRlciA9IG5DcmVhdGVQb3J0ZXJEdWZmRmlsdGVyKHNyY0NvbG9yLCBtb2RlLm5hdGl2ZUludCk7CiAgICAgfQogCi0gICAgcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIGludCBuYXRpdmVfQ3JlYXRlUG9ydGVyRHVmZkZpbHRlcihpbnQgc3JjQ29sb3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcG9ydGVyRHVmZk1vZGUpOworICAgIHByaXZhdGUgc3RhdGljIG5hdGl2ZSBpbnQgbmF0aXZlX0NyZWF0ZVBvcnRlckR1ZmZGaWx0ZXIoaW50IHNyY0NvbG9yLCBpbnQgcG9ydGVyRHVmZk1vZGUpOworICAgIHByaXZhdGUgc3RhdGljIG5hdGl2ZSBpbnQgbkNyZWF0ZVBvcnRlckR1ZmZGaWx0ZXIoaW50IHNyY0NvbG9yLCBpbnQgcG9ydGVyRHVmZk1vZGUpOwogfQpkaWZmIC0tZ2l0IGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL2dyYXBoaWNzL1BvcnRlckR1ZmZYZmVybW9kZS5qYXZhIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL2dyYXBoaWNzL1BvcnRlckR1ZmZYZmVybW9kZS5qYXZhCmluZGV4IGNiMTI3ZmQuLjZiYTA2NGMgMTAwNjQ0Ci0tLSBhL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9ncmFwaGljcy9Qb3J0ZXJEdWZmWGZlcm1vZGUuamF2YQorKysgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvZ3JhcGhpY3MvUG9ydGVyRHVmZlhmZXJtb2RlLmphdmEKQEAgLTE4LDExICsxOCwxNyBAQAogCiBwdWJsaWMgY2xhc3MgUG9ydGVyRHVmZlhmZXJtb2RlIGV4dGVuZHMgWGZlcm1vZGUgewogICAgIC8qKgorICAgICAqIEBoaWRlCisgICAgICovCisgICAgcHVibGljIGZpbmFsIFBvcnRlckR1ZmYuTW9kZSBtb2RlOworCisgICAgLyoqCiAgICAgICogQ3JlYXRlIGFuIHhmZXJtb2RlIHRoYXQgdXNlcyB0aGUgc3BlY2lmaWVkIHBvcnRlci1kdWZmIG1vZGUuCiAgICAgICoKICAgICAgKiBAcGFyYW0gbW9kZSAgICAgICAgICAgVGhlIHBvcnRlci1kdWZmIG1vZGUgdGhhdCBpcyBhcHBsaWVkCiAgICAgICovCiAgICAgcHVibGljIFBvcnRlckR1ZmZYZmVybW9kZShQb3J0ZXJEdWZmLk1vZGUgbW9kZSkgeworICAgICAgICB0aGlzLm1vZGUgPSBtb2RlOwogICAgICAgICBuYXRpdmVfaW5zdGFuY2UgPSBuYXRpdmVDcmVhdGVYZmVybW9kZShtb2RlLm5hdGl2ZUludCk7CiAgICAgfQogICAgIApkaWZmIC0tZ2l0IGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL2dyYXBoaWNzL1JlZ2lvbi5qYXZhIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL2dyYXBoaWNzL1JlZ2lvbi5qYXZhCmluZGV4IDJiMDgwYWEuLmU1NDA4MDYgMTAwNjQ0Ci0tLSBhL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9ncmFwaGljcy9SZWdpb24uamF2YQorKysgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvZ3JhcGhpY3MvUmVnaW9uLmphdmEKQEAgLTIwLDYgKzIwLDEwIEBACiBpbXBvcnQgYW5kcm9pZC5vcy5QYXJjZWxhYmxlOwogCiBwdWJsaWMgY2xhc3MgUmVnaW9uIGltcGxlbWVudHMgUGFyY2VsYWJsZSB7CisgICAgLyoqCisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgZmluYWwgaW50IG1OYXRpdmVSZWdpb247CiAKICAgICAvLyB0aGUgbmF0aXZlIHZhbHVlcyBmb3IgdGhlc2UgbXVzdCBtYXRjaCB1cCB3aXRoIHRoZSBlbnVtIGluIFNrUmVnaW9uLmgKICAgICBwdWJsaWMgZW51bSBPcCB7CkBAIC0zMyw3ICszNywxMSBAQAogICAgICAgICBPcChpbnQgbmF0aXZlSW50KSB7CiAgICAgICAgICAgICB0aGlzLm5hdGl2ZUludCA9IG5hdGl2ZUludDsKICAgICAgICAgfQotICAgICAgICBmaW5hbCBpbnQgbmF0aXZlSW50OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBAaGlkZQorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIGZpbmFsIGludCBuYXRpdmVJbnQ7CiAgICAgfQogCiAgICAgLyoqIENyZWF0ZSBhbiBlbXB0eSByZWdpb24KQEAgLTMyNSwxMCArMzMzLDE0IEBACiAgICAgfQogCiAgICAgcHJvdGVjdGVkIHZvaWQgZmluYWxpemUoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLSAgICAgICAgbmF0aXZlRGVzdHJ1Y3RvcihtTmF0aXZlUmVnaW9uKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG5hdGl2ZURlc3RydWN0b3IobU5hdGl2ZVJlZ2lvbik7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBzdXBlci5maW5hbGl6ZSgpOworICAgICAgICB9CiAgICAgfQogICAgIAotICAgIC8qcGFja2FnZSovIFJlZ2lvbihpbnQgbmkpIHsKKyAgICBSZWdpb24oaW50IG5pKSB7CiAgICAgICAgIGlmIChuaSA9PSAwKSB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigpOwogICAgICAgICB9CkBAIC0zNDEsNyArMzUzLDcgQEAKICAgICAgICAgdGhpcyhuaSk7CiAgICAgfQogCi0gICAgLypwYWNrYWdlKi8gZmluYWwgaW50IG5pKCkgeworICAgIGZpbmFsIGludCBuaSgpIHsKICAgICAgICAgcmV0dXJuIG1OYXRpdmVSZWdpb247CiAgICAgfQogCkBAIC0zNzAsNiArMzgyLDQgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhcmNlbCBwKTsKIAogICAgIHByaXZhdGUgc3RhdGljIG5hdGl2ZSBib29sZWFuIG5hdGl2ZUVxdWFscyhpbnQgbmF0aXZlX3IxLCBpbnQgbmF0aXZlX3IyKTsKLQotICAgIHByaXZhdGUgZmluYWwgaW50IG1OYXRpdmVSZWdpb247CiB9CmRpZmYgLS1naXQgYS9ncmFwaGljcy9qYXZhL2FuZHJvaWQvZ3JhcGhpY3MvU2hhZGVyLmphdmEgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvZ3JhcGhpY3MvU2hhZGVyLmphdmEKaW5kZXggYWUwMzA0ZS4uYjM5NzY2MiAxMDA2NDQKLS0tIGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL2dyYXBoaWNzL1NoYWRlci5qYXZhCisrKyBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9ncmFwaGljcy9TaGFkZXIuamF2YQpAQCAtMjMsOSArMjMsMTYgQEAKICAqIGRyYXduIHdpdGggdGhhdCBwYWludCB3aWxsIGdldCBpdHMgY29sb3IocykgZnJvbSB0aGUgc2hhZGVyLgogICovCiBwdWJsaWMgY2xhc3MgU2hhZGVyIHsKLQotICAgIC8vIHRoaXMgaXMgc2V0IGJ5IHN1YmNsYXNzZXMsIGJ1dCBkb24ndCBtYWtlIGl0IHB1YmxpYwotICAgIC8qIHBhY2thZ2UgKi8gaW50IG5hdGl2ZV9pbnN0YW5jZTsKKyAgICAvKioKKyAgICAgKiBUaGlzIGlzIHNldCBieSBzdWJjbGFzc2VzLCBidXQgZG9uJ3QgbWFrZSBpdCBwdWJsaWMuCisgICAgICogCisgICAgICogQGhpZGUgCisgICAgICovCisgICAgcHVibGljIGludCBuYXRpdmVfaW5zdGFuY2U7CisgICAgLyoqCisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IG5hdGl2ZV9zaGFkZXI7CiAKICAgICBwdWJsaWMgZW51bSBUaWxlTW9kZSB7CiAgICAgICAgIC8qKgpAQCAtNjQsMTcgKzcxLDIwIEBACiAgICAgICogQHBhcmFtIGxvY2FsTSBUaGUgc2hhZGVyJ3MgbmV3IGxvY2FsIG1hdHJpeCwgb3IgbnVsbCB0byBzcGVjaWZ5IGlkZW50aXR5CiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0TG9jYWxNYXRyaXgoTWF0cml4IGxvY2FsTSkgewotICAgICAgICBuYXRpdmVTZXRMb2NhbE1hdHJpeChuYXRpdmVfaW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2FsTSAhPSBudWxsID8gbG9jYWxNLm5hdGl2ZV9pbnN0YW5jZSA6IDApOworICAgICAgICBuYXRpdmVTZXRMb2NhbE1hdHJpeChuYXRpdmVfaW5zdGFuY2UsIG5hdGl2ZV9zaGFkZXIsIGxvY2FsTS5uYXRpdmVfaW5zdGFuY2UpOwogICAgIH0KIAogICAgIHByb3RlY3RlZCB2b2lkIGZpbmFsaXplKCkgdGhyb3dzIFRocm93YWJsZSB7Ci0gICAgICAgIG5hdGl2ZURlc3RydWN0b3IobmF0aXZlX2luc3RhbmNlKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHN1cGVyLmZpbmFsaXplKCk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBuYXRpdmVEZXN0cnVjdG9yKG5hdGl2ZV9pbnN0YW5jZSwgbmF0aXZlX3NoYWRlcik7CisgICAgICAgIH0KICAgICB9CiAKLSAgICBwcml2YXRlIHN0YXRpYyBuYXRpdmUgdm9pZCBuYXRpdmVEZXN0cnVjdG9yKGludCBuYXRpdmVfc2hhZGVyKTsKKyAgICBwcml2YXRlIHN0YXRpYyBuYXRpdmUgdm9pZCBuYXRpdmVEZXN0cnVjdG9yKGludCBuYXRpdmVfc2hhZGVyLCBpbnQgbmF0aXZlX3NraWFTaGFkZXIpOwogICAgIHByaXZhdGUgc3RhdGljIG5hdGl2ZSBib29sZWFuIG5hdGl2ZUdldExvY2FsTWF0cml4KGludCBuYXRpdmVfc2hhZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtYXRyaXhfaW5zdGFuY2UpOworICAgICAgICAgICAgaW50IG1hdHJpeF9pbnN0YW5jZSk7IAogICAgIHByaXZhdGUgc3RhdGljIG5hdGl2ZSB2b2lkIG5hdGl2ZVNldExvY2FsTWF0cml4KGludCBuYXRpdmVfc2hhZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtYXRyaXhfaW5zdGFuY2UpOworICAgICAgICAgICAgaW50IG5hdGl2ZV9za2lhU2hhZGVyLCBpbnQgbWF0cml4X2luc3RhbmNlKTsKIH0KZGlmZiAtLWdpdCBhL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9ncmFwaGljcy9UZW1wb3JhcnlCdWZmZXIuamF2YSBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9ncmFwaGljcy9UZW1wb3JhcnlCdWZmZXIuamF2YQppbmRleCAxZDdmZTAxLi5jNWI4MTQzIDEwMDY0NAotLS0gYS9ncmFwaGljcy9qYXZhL2FuZHJvaWQvZ3JhcGhpY3MvVGVtcG9yYXJ5QnVmZmVyLmphdmEKKysrIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL2dyYXBoaWNzL1RlbXBvcmFyeUJ1ZmZlci5qYXZhCkBAIC0xOCw5ICsxOCwxMSBAQAogCiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudXRpbC5BcnJheVV0aWxzOwogCi0vKiBwYWNrYWdlICovIGNsYXNzIFRlbXBvcmFyeUJ1ZmZlcgotewotICAgIC8qIHBhY2thZ2UgKi8gc3RhdGljIGNoYXJbXSBvYnRhaW4oaW50IGxlbikgeworLyoqCisgKiBAaGlkZQorICovCitwdWJsaWMgY2xhc3MgVGVtcG9yYXJ5QnVmZmVyIHsKKyAgICBwdWJsaWMgc3RhdGljIGNoYXJbXSBvYnRhaW4oaW50IGxlbikgewogICAgICAgICBjaGFyW10gYnVmOwogCiAgICAgICAgIHN5bmNocm9uaXplZCAoVGVtcG9yYXJ5QnVmZmVyLmNsYXNzKSB7CkBAIC0yOCwxNSArMzAsMTUgQEAKICAgICAgICAgICAgIHNUZW1wID0gbnVsbDsKICAgICAgICAgfQogCi0gICAgICAgIGlmIChidWYgPT0gbnVsbCB8fCBidWYubGVuZ3RoIDwgbGVuKQorICAgICAgICBpZiAoYnVmID09IG51bGwgfHwgYnVmLmxlbmd0aCA8IGxlbikgewogICAgICAgICAgICAgYnVmID0gbmV3IGNoYXJbQXJyYXlVdGlscy5pZGVhbENoYXJBcnJheVNpemUobGVuKV07CisgICAgICAgIH0KIAogICAgICAgICByZXR1cm4gYnVmOwogICAgIH0KIAotICAgIC8qIHBhY2thZ2UgKi8gc3RhdGljIHZvaWQgcmVjeWNsZShjaGFyW10gdGVtcCkgewotICAgICAgICBpZiAodGVtcC5sZW5ndGggPiAxMDAwKQotICAgICAgICAgICAgcmV0dXJuOworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCByZWN5Y2xlKGNoYXJbXSB0ZW1wKSB7CisgICAgICAgIGlmICh0ZW1wLmxlbmd0aCA+IDEwMDApIHJldHVybjsKIAogICAgICAgICBzeW5jaHJvbml6ZWQgKFRlbXBvcmFyeUJ1ZmZlci5jbGFzcykgewogICAgICAgICAgICAgc1RlbXAgPSB0ZW1wOwpkaWZmIC0tZ2l0IGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL2dyYXBoaWNzL1hmZXJtb2RlLmphdmEgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvZ3JhcGhpY3MvWGZlcm1vZGUuamF2YQppbmRleCA0MmM0MTBlLi4yNDY3YmRjIDEwMDY0NAotLS0gYS9ncmFwaGljcy9qYXZhL2FuZHJvaWQvZ3JhcGhpY3MvWGZlcm1vZGUuamF2YQorKysgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvZ3JhcGhpY3MvWGZlcm1vZGUuamF2YQpAQCAtMzEsNyArMzEsMTEgQEAKIHB1YmxpYyBjbGFzcyBYZmVybW9kZSB7CiAKICAgICBwcm90ZWN0ZWQgdm9pZCBmaW5hbGl6ZSgpIHRocm93cyBUaHJvd2FibGUgewotICAgICAgICBmaW5hbGl6ZXIobmF0aXZlX2luc3RhbmNlKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGZpbmFsaXplcihuYXRpdmVfaW5zdGFuY2UpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgc3VwZXIuZmluYWxpemUoKTsKKyAgICAgICAgfQogICAgIH0KIAogICAgIHByaXZhdGUgc3RhdGljIG5hdGl2ZSB2b2lkIGZpbmFsaXplcihpbnQgbmF0aXZlX2luc3RhbmNlKTsKZGlmZiAtLWdpdCBhL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9ncmFwaGljcy9kcmF3YWJsZS9EcmF3YWJsZS5qYXZhIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL2dyYXBoaWNzL2RyYXdhYmxlL0RyYXdhYmxlLmphdmEKaW5kZXggMzEyNTMyMS4uN2IyZDlkNyAxMDA2NDQKLS0tIGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL2dyYXBoaWNzL2RyYXdhYmxlL0RyYXdhYmxlLmphdmEKKysrIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL2dyYXBoaWNzL2RyYXdhYmxlL0RyYXdhYmxlLmphdmEKQEAgLTE2LDIxICsxNiwzMCBAQAogCiBwYWNrYWdlIGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGU7CiAKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLQogaW1wb3J0IG9yZy54bWxwdWxsLnYxLlhtbFB1bGxQYXJzZXI7CiBpbXBvcnQgb3JnLnhtbHB1bGwudjEuWG1sUHVsbFBhcnNlckV4Y2VwdGlvbjsKIAogaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuUmVzb3VyY2VzOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuVHlwZWRBcnJheTsKLWltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLio7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5CaXRtYXA7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5CaXRtYXBGYWN0b3J5OworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQ2FudmFzOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQ29sb3JGaWx0ZXI7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5OaW5lUGF0Y2g7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5QaXhlbEZvcm1hdDsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlBvcnRlckR1ZmY7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5Qb3J0ZXJEdWZmQ29sb3JGaWx0ZXI7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5SZWN0OworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUmVnaW9uOwogaW1wb3J0IGFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQ7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkRpc3BsYXlNZXRyaWNzOwogaW1wb3J0IGFuZHJvaWQudXRpbC5TdGF0ZVNldDsKLWltcG9ydCBhbmRyb2lkLnV0aWwuWG1sOwogaW1wb3J0IGFuZHJvaWQudXRpbC5UeXBlZFZhbHVlOworaW1wb3J0IGFuZHJvaWQudXRpbC5YbWw7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKIAogLyoqCiAgKiBBIERyYXdhYmxlIGlzIGEgZ2VuZXJhbCBhYnN0cmFjdGlvbiBmb3IgInNvbWV0aGluZyB0aGF0IGNhbiBiZSBkcmF3bi4iICBNb3N0CkBAIC02NDUsNiArNjU0LDggQEAKICAgICAgKiBDYWxsaW5nIHRoaXMgbWV0aG9kIG9uIGEgbXV0YWJsZSBEcmF3YWJsZSB3aWxsIGhhdmUgbm8gZWZmZWN0LgogICAgICAqCiAgICAgICogQHJldHVybiBUaGlzIGRyYXdhYmxlLgorICAgICAqIEBzZWUgQ29uc3RhbnRTdGF0ZQorICAgICAqIEBzZWUgI2dldENvbnN0YW50U3RhdGUoKQogICAgICAqLwogICAgIHB1YmxpYyBEcmF3YWJsZSBtdXRhdGUoKSB7CiAgICAgICAgIHJldHVybiB0aGlzOwpAQCAtNzQ5LDYgKzc2MCw4IEBACiAgICAgICAgICAgICBkcmF3YWJsZSA9IG5ldyBTdGF0ZUxpc3REcmF3YWJsZSgpOwogICAgICAgICB9IGVsc2UgaWYgKG5hbWUuZXF1YWxzKCJsZXZlbC1saXN0IikpIHsKICAgICAgICAgICAgIGRyYXdhYmxlID0gbmV3IExldmVsTGlzdERyYXdhYmxlKCk7CisgICAgICAgIH0gZWxzZSBpZiAobmFtZS5lcXVhbHMoIm1pcG1hcCIpKSB7CisgICAgICAgICAgICBkcmF3YWJsZSA9IG5ldyBNaXBtYXBEcmF3YWJsZSgpOwogICAgICAgICB9IGVsc2UgaWYgKG5hbWUuZXF1YWxzKCJsYXllci1saXN0IikpIHsKICAgICAgICAgICAgIGRyYXdhYmxlID0gbmV3IExheWVyRHJhd2FibGUoKTsKICAgICAgICAgfSBlbHNlIGlmIChuYW1lLmVxdWFscygidHJhbnNpdGlvbiIpKSB7CkBAIC03NzAsNyArNzgzLDcgQEAKICAgICAgICAgfSBlbHNlIGlmIChuYW1lLmVxdWFscygiaW5zZXQiKSkgewogICAgICAgICAgICAgZHJhd2FibGUgPSBuZXcgSW5zZXREcmF3YWJsZSgpOwogICAgICAgICB9IGVsc2UgaWYgKG5hbWUuZXF1YWxzKCJiaXRtYXAiKSkgewotICAgICAgICAgICAgZHJhd2FibGUgPSBuZXcgQml0bWFwRHJhd2FibGUoKTsKKyAgICAgICAgICAgIGRyYXdhYmxlID0gbmV3IEJpdG1hcERyYXdhYmxlKHIpOwogICAgICAgICAgICAgaWYgKHIgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgKChCaXRtYXBEcmF3YWJsZSkgZHJhd2FibGUpLnNldFRhcmdldERlbnNpdHkoci5nZXREaXNwbGF5TWV0cmljcygpKTsKICAgICAgICAgICAgIH0KQEAgLTgwNSw2ICs4MTgsOSBAQAogICAgICAgICByZXR1cm4gbnVsbDsKICAgICB9CiAKKyAgICAvKioKKyAgICAgKiBJbmZsYXRlIHRoaXMgRHJhd2FibGUgZnJvbSBhbiBYTUwgcmVzb3VyY2UuCisgICAgICovCiAgICAgcHVibGljIHZvaWQgaW5mbGF0ZShSZXNvdXJjZXMgciwgWG1sUHVsbFBhcnNlciBwYXJzZXIsIEF0dHJpYnV0ZVNldCBhdHRycykKICAgICAgICAgICAgIHRocm93cyBYbWxQdWxsUGFyc2VyRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CiAKQEAgLTgxMyw2ICs4MjksMTIgQEAKICAgICAgICAgYS5yZWN5Y2xlKCk7CiAgICAgfQogCisgICAgLyoqCisgICAgICogSW5mbGF0ZSBhIERyYXdhYmxlIGZyb20gYW4gWE1MIHJlc291cmNlLgorICAgICAqCisgICAgICogQHRocm93cyBYbWxQdWxsUGFyc2VyRXhjZXB0aW9uCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAqLwogICAgIHZvaWQgaW5mbGF0ZVdpdGhBdHRyaWJ1dGVzKFJlc291cmNlcyByLCBYbWxQdWxsUGFyc2VyIHBhcnNlciwKICAgICAgICAgICAgIFR5cGVkQXJyYXkgYXR0cnMsIGludCB2aXNpYmxlQXR0cikKICAgICAgICAgICAgIHRocm93cyBYbWxQdWxsUGFyc2VyRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CkBAIC04MjAsMTIgKzg0MiwyNyBAQAogICAgICAgICBtVmlzaWJsZSA9IGF0dHJzLmdldEJvb2xlYW4odmlzaWJsZUF0dHIsIG1WaXNpYmxlKTsKICAgICB9CiAKKyAgICAvKioKKyAgICAgKiBUaGlzIGFic3RyYWN0IGNsYXNzIGlzIHVzZWQgYnkge0BsaW5rIERyYXdhYmxlfXMgdG8gc3RvcmUgc2hhcmVkIGNvbnN0YW50IHN0YXRlIGFuZCBkYXRhCisgICAgICogYmV0d2VlbiBEcmF3YWJsZXMuIHtAbGluayBCaXRtYXBEcmF3YWJsZX1zIGNyZWF0ZWQgZnJvbSB0aGUgc2FtZSByZXNvdXJjZSB3aWxsIGZvciBpbnN0YW5jZQorICAgICAqIHNoYXJlIGEgdW5pcXVlIGJpdG1hcCBzdG9yZWQgaW4gdGhlaXIgQ29uc3RhbnRTdGF0ZS4KKyAgICAgKgorICAgICAqIDxwPgorICAgICAqIHtAbGluayAjbmV3RHJhd2FibGUoUmVzb3VyY2VzKX0gY2FuIGJlIHVzZWQgYXMgYSBmYWN0b3J5IHRvIGNyZWF0ZSBuZXcgRHJhd2FibGUgaW5zdGFuY2VzCisgICAgICogZnJvbSB0aGlzIENvbnN0YW50U3RhdGUuCisgICAgICogPC9wPgorICAgICAqCisgICAgICogVXNlIHtAbGluayBEcmF3YWJsZSNnZXRDb25zdGFudFN0YXRlKCl9IHRvIHJldHJpZXZlIHRoZSBDb25zdGFudFN0YXRlIG9mIGEgRHJhd2FibGUuIENhbGxpbmcKKyAgICAgKiB7QGxpbmsgRHJhd2FibGUjbXV0YXRlKCl9IG9uIGEgRHJhd2FibGUgc2hvdWxkIHR5cGljYWxseSBjcmVhdGUgYSBuZXcgQ29uc3RhbnRTdGF0ZSBmb3IgdGhhdAorICAgICAqIERyYXdhYmxlLgorICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgYWJzdHJhY3QgY2xhc3MgQ29uc3RhbnRTdGF0ZSB7CiAgICAgICAgIC8qKgogICAgICAgICAgKiBDcmVhdGUgYSBuZXcgZHJhd2FibGUgd2l0aG91dCBzdXBwbHlpbmcgcmVzb3VyY2VzIHRoZSBjYWxsZXIKICAgICAgICAgICogaXMgcnVubmluZyBpbi4gIE5vdGUgdGhhdCB1c2luZyB0aGlzIG1lYW5zIHRoZSBkZW5zaXR5LWRlcGVuZGVudAogICAgICAgICAgKiBkcmF3YWJsZXMgKGxpa2UgYml0bWFwcykgd2lsbCBub3QgYmUgYWJsZSB0byB1cGRhdGUgdGhlaXIgdGFyZ2V0Ci0gICAgICAgICAqIGRlbnNpdHkgY29ycmVjdGx5LgorICAgICAgICAgKiBkZW5zaXR5IGNvcnJlY3RseS4gT25lIHNob3VsZCB1c2Uge0BsaW5rICNuZXdEcmF3YWJsZShSZXNvdXJjZXMpfQorICAgICAgICAgKiBpbnN0ZWFkIHRvIHByb3ZpZGUgYSByZXNvdXJjZS4KICAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyBhYnN0cmFjdCBEcmF3YWJsZSBuZXdEcmF3YWJsZSgpOwogICAgICAgICAvKioKQEAgLTg0NCw2ICs4ODEsMTMgQEAKICAgICAgICAgcHVibGljIGFic3RyYWN0IGludCBnZXRDaGFuZ2luZ0NvbmZpZ3VyYXRpb25zKCk7CiAgICAgfQogCisgICAgLyoqCisgICAgICogUmV0dXJuIGEge0BsaW5rIENvbnN0YW50U3RhdGV9IGluc3RhbmNlIHRoYXQgaG9sZHMgdGhlIHNoYXJlZCBzdGF0ZSBvZiB0aGlzIERyYXdhYmxlLgorICAgICAqcQorICAgICAqIEByZXR1cm4gVGhlIENvbnN0YW50U3RhdGUgYXNzb2NpYXRlZCB0byB0aGF0IERyYXdhYmxlLgorICAgICAqIEBzZWUgQ29uc3RhbnRTdGF0ZQorICAgICAqIEBzZWUgRHJhd2FibGUjbXV0YXRlKCkKKyAgICAgKi8KICAgICBwdWJsaWMgQ29uc3RhbnRTdGF0ZSBnZXRDb25zdGFudFN0YXRlKCkgewogICAgICAgICByZXR1cm4gbnVsbDsKICAgICB9CmRpZmYgLS1naXQgYS9ncmFwaGljcy9qYXZhL2FuZHJvaWQvZ3JhcGhpY3MvZHJhd2FibGUvRHJhd2FibGVDb250YWluZXIuamF2YSBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9ncmFwaGljcy9kcmF3YWJsZS9EcmF3YWJsZUNvbnRhaW5lci5qYXZhCmluZGV4IGM2ZjU3ZDQuLjEyNGQ5MDcgMTAwNjQ0Ci0tLSBhL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9ncmFwaGljcy9kcmF3YWJsZS9EcmF3YWJsZUNvbnRhaW5lci5qYXZhCisrKyBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9ncmFwaGljcy9kcmF3YWJsZS9EcmF3YWJsZUNvbnRhaW5lci5qYXZhCkBAIC0xNyw4ICsxNywxNiBAQAogcGFja2FnZSBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlOwogCiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5SZXNvdXJjZXM7Ci1pbXBvcnQgYW5kcm9pZC5ncmFwaGljcy4qOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQ2FudmFzOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQ29sb3JGaWx0ZXI7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5QaXhlbEZvcm1hdDsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlJlY3Q7CiAKKy8qKgorICogQSBoZWxwZXIgY2xhc3MgdGhhdCBjb250YWlucyBzZXZlcmFsIHtAbGluayBEcmF3YWJsZX1zIGFuZCBzZWxlY3RzIHdoaWNoIG9uZSB0byB1c2UuCisgKgorICogWW91IGNhbiBzdWJjbGFzcyBpdCB0byBjcmVhdGUgeW91ciBvd24gRHJhd2FibGVDb250YWluZXJzIG9yIGRpcmVjdGx5IHVzZSBvbmUgaXRzIGNoaWxkIGNsYXNzZXMuCisgKi8KIHB1YmxpYyBjbGFzcyBEcmF3YWJsZUNvbnRhaW5lciBleHRlbmRzIERyYXdhYmxlIGltcGxlbWVudHMgRHJhd2FibGUuQ2FsbGJhY2sgewogCiAgICAgLyoqCkBAIC0xOTYsOCArMjA0LDcgQEAKICAgICAgICAgICAgICAgICBtRHJhd2FibGVDb250YWluZXJTdGF0ZS5nZXRPcGFjaXR5KCk7CiAgICAgfQogCi0gICAgcHVibGljIGJvb2xlYW4gc2VsZWN0RHJhd2FibGUoaW50IGlkeCkKLSAgICB7CisgICAgcHVibGljIGJvb2xlYW4gc2VsZWN0RHJhd2FibGUoaW50IGlkeCkgewogICAgICAgICBpZiAoaWR4ID09IG1DdXJJbmRleCkgewogICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9CkBAIC0yNTUsNiArMjYyLDEyIEBACiAgICAgICAgIHJldHVybiB0aGlzOwogICAgIH0KIAorICAgIC8qKgorICAgICAqIEEgQ29uc3RhbnRTdGF0ZSB0aGF0IGNhbiBjb250YWluIHNldmVyYWwge0BsaW5rIERyYXdhYmxlfXMuCisgICAgICoKKyAgICAgKiBUaGlzIGNsYXNzIHdhcyBtYWRlIHB1YmxpYyB0byBlbmFibGUgdGVzdGluZywgYW5kIGl0cyB2aXNpYmlsaXR5IG1heSBjaGFuZ2UgaW4gYSBmdXR1cmUKKyAgICAgKiByZWxlYXNlLgorICAgICAqLwogICAgIHB1YmxpYyBhYnN0cmFjdCBzdGF0aWMgY2xhc3MgRHJhd2FibGVDb250YWluZXJTdGF0ZSBleHRlbmRzIENvbnN0YW50U3RhdGUgewogICAgICAgICBmaW5hbCBEcmF3YWJsZUNvbnRhaW5lciBtT3duZXI7CiAKQEAgLTQ0MywxMiArNDU2LDEyIEBACiAgICAgICAgICAgICByZXR1cm4gbUNvbnN0YW50TWluaW11bUhlaWdodDsKICAgICAgICAgfQogCi0gICAgICAgIHByaXZhdGUgdm9pZCBjb21wdXRlQ29uc3RhbnRTaXplKCkgeworICAgICAgICBwcm90ZWN0ZWQgdm9pZCBjb21wdXRlQ29uc3RhbnRTaXplKCkgewogICAgICAgICAgICAgbUNvbXB1dGVkQ29uc3RhbnRTaXplID0gdHJ1ZTsKIAogICAgICAgICAgICAgZmluYWwgaW50IE4gPSBnZXRDaGlsZENvdW50KCk7CiAgICAgICAgICAgICBmaW5hbCBEcmF3YWJsZVtdIGRyYXdhYmxlcyA9IG1EcmF3YWJsZXM7Ci0gICAgICAgICAgICBtQ29uc3RhbnRXaWR0aCA9IG1Db25zdGFudEhlaWdodCA9IDA7CisgICAgICAgICAgICBtQ29uc3RhbnRXaWR0aCA9IG1Db25zdGFudEhlaWdodCA9IC0xOwogICAgICAgICAgICAgbUNvbnN0YW50TWluaW11bVdpZHRoID0gbUNvbnN0YW50TWluaW11bUhlaWdodCA9IDA7CiAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IE47IGkrKykgewogICAgICAgICAgICAgICAgIERyYXdhYmxlIGRyID0gZHJhd2FibGVzW2ldOwpkaWZmIC0tZ2l0IGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL2dyYXBoaWNzL2RyYXdhYmxlL0dyYWRpZW50RHJhd2FibGUuamF2YSBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9ncmFwaGljcy9kcmF3YWJsZS9HcmFkaWVudERyYXdhYmxlLmphdmEKaW5kZXggMzNlY2JlYS4uODhmNmQ0MyAxMDA2NDQKLS0tIGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL2dyYXBoaWNzL2RyYXdhYmxlL0dyYWRpZW50RHJhd2FibGUuamF2YQorKysgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvZ3JhcGhpY3MvZHJhd2FibGUvR3JhZGllbnREcmF3YWJsZS5qYXZhCkBAIC0zMTMsMTggKzMxMywxNiBAQAogICAgICAgICAgICAgY2FzZSBSRUNUQU5HTEU6CiAgICAgICAgICAgICAgICAgaWYgKHN0Lm1SYWRpdXNBcnJheSAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgIG1QYXRoLnJlc2V0KCk7Ci0gICAgICAgICAgICAgICAgICAgIG1QYXRoLmFkZFJvdW5kUmVjdChtUmVjdCwgc3QubVJhZGl1c0FycmF5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGF0aC5EaXJlY3Rpb24uQ1cpOworICAgICAgICAgICAgICAgICAgICBtUGF0aC5hZGRSb3VuZFJlY3QobVJlY3QsIHN0Lm1SYWRpdXNBcnJheSwgUGF0aC5EaXJlY3Rpb24uQ1cpOwogICAgICAgICAgICAgICAgICAgICBjYW52YXMuZHJhd1BhdGgobVBhdGgsIG1GaWxsUGFpbnQpOwogICAgICAgICAgICAgICAgICAgICBpZiAoaGF2ZVN0cm9rZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgY2FudmFzLmRyYXdQYXRoKG1QYXRoLCBtU3Ryb2tlUGFpbnQpOwogICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc3QubVJhZGl1cyA+IDAuMGYpIHsKICAgICAgICAgICAgICAgICAgICAgLy8gc2luY2UgdGhlIGNhbGxlciBpcyBvbmx5IGdpdmluZyB1cyAxIHZhbHVlLCB3ZSB3aWxsIGZvcmNlCiAgICAgICAgICAgICAgICAgICAgIC8vIGl0IHRvIGJlIHNxdWFyZSBpZiB0aGUgcmVjdCBpcyB0b28gc21hbGwgaW4gb25lIGRpbWVuc2lvbgogICAgICAgICAgICAgICAgICAgICAvLyB0byBzaG93IGl0LiBJZiB3ZSBkaWQgbm90aGluZywgU2tpYSB3b3VsZCBjbGFtcCB0aGUgcmFkCi0gICAgICAgICAgICAgICAgICAgIC8vIGluZGVwZW5kZW50bHkgYWxvbmcgZWFjaCBheGlzLCBnaXZpbmcgdXMgYSB0aGluIGVsbGlwcworICAgICAgICAgICAgICAgICAgICAvLyBpbmRlcGVuZGVudGx5IGFsb25nIGVhY2ggYXhpcywgZ2l2aW5nIHVzIGEgdGhpbiBlbGxpcHNlCiAgICAgICAgICAgICAgICAgICAgIC8vIGlmIHRoZSByZWN0IHdlcmUgdmVyeSB3aWRlIGJ1dCBub3QgdmVyeSB0YWxsCiAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHJhZCA9IHN0Lm1SYWRpdXM7CiAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHIgPSBNYXRoLm1pbihtUmVjdC53aWR0aCgpLCBtUmVjdC5oZWlnaHQoKSkgKiAwLjVmOwpAQCAtMzM1LDYgKzMzMywxMSBAQAogICAgICAgICAgICAgICAgICAgICBpZiAoaGF2ZVN0cm9rZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgY2FudmFzLmRyYXdSb3VuZFJlY3QobVJlY3QsIHJhZCwgcmFkLCBtU3Ryb2tlUGFpbnQpOwogICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgY2FudmFzLmRyYXdSZWN0KG1SZWN0LCBtRmlsbFBhaW50KTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGhhdmVTdHJva2UpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhbnZhcy5kcmF3UmVjdChtUmVjdCwgbVN0cm9rZVBhaW50KTsKKyAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIGNhc2UgT1ZBTDoKZGlmZiAtLWdpdCBhL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9ncmFwaGljcy9kcmF3YWJsZS9MYXllckRyYXdhYmxlLmphdmEgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvZ3JhcGhpY3MvZHJhd2FibGUvTGF5ZXJEcmF3YWJsZS5qYXZhCmluZGV4IDgwNDdkZDQuLjUwMWNjYTkgMTAwNjQ0Ci0tLSBhL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9ncmFwaGljcy9kcmF3YWJsZS9MYXllckRyYXdhYmxlLmphdmEKKysrIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL2dyYXBoaWNzL2RyYXdhYmxlL0xheWVyRHJhd2FibGUuamF2YQpAQCAtMjY2LDYgKzI2Niw3IEBACiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gc2V0RHJhd2FibGVCeUxheWVySWQoaW50IGlkLCBEcmF3YWJsZSBkcmF3YWJsZSkgewogICAgICAgICBmaW5hbCBDaGlsZERyYXdhYmxlW10gbGF5ZXJzID0gbUxheWVyU3RhdGUubUNoaWxkcmVuOworICAgICAgICBkcmF3YWJsZS5zZXRDYWxsYmFjayh0aGlzKTsKICAgICAgICAgCiAgICAgICAgIGZvciAoaW50IGkgPSBtTGF5ZXJTdGF0ZS5tTnVtIC0gMTsgaSA+PSAwOyBpLS0pIHsKICAgICAgICAgICAgIGlmIChsYXllcnNbaV0ubUlkID09IGlkKSB7CmRpZmYgLS1naXQgYS9ncmFwaGljcy9qYXZhL2FuZHJvaWQvZ3JhcGhpY3MvZHJhd2FibGUvTWlwbWFwRHJhd2FibGUuamF2YSBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9ncmFwaGljcy9kcmF3YWJsZS9NaXBtYXBEcmF3YWJsZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc1ZmRlZWQKLS0tIC9kZXYvbnVsbAorKysgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvZ3JhcGhpY3MvZHJhd2FibGUvTWlwbWFwRHJhd2FibGUuamF2YQpAQCAtMCwwICsxLDMwOSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZTsKKworaW1wb3J0IG9yZy54bWxwdWxsLnYxLlhtbFB1bGxQYXJzZXI7CitpbXBvcnQgb3JnLnhtbHB1bGwudjEuWG1sUHVsbFBhcnNlckV4Y2VwdGlvbjsKKworaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuUmVzb3VyY2VzOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuVHlwZWRBcnJheTsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlJlY3Q7CitpbXBvcnQgYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldDsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CisKKy8qKgorICogQSByZXNvdXJjZSB0aGF0IG1hbmFnZXMgYSBudW1iZXIgb2YgYWx0ZXJuYXRlIERyYXdhYmxlcywgYW5kIHdoaWNoIGFjdHVhbGx5IGRyYXdzIHRoZSBvbmUgd2hpY2gKKyAqIHNpemUgbWF0Y2hlcyB0aGUgbW9zdCBjbG9zZWx5IHRoZSBkcmF3aW5nIGJvdW5kcy4gUHJvdmlkaW5nIHNldmVyYWwgcHJlLXNjYWxlZCB2ZXJzaW9uIG9mIHRoZQorICogZHJhd2FibGUgaGVscHMgbWluaW1pemluZyB0aGUgYWxpYXNpbmcgYXJ0aWZhY3RzIHRoYXQgY2FuIGJlIGludHJvZHVjZWQgYnkgdGhlIHNjYWxpbmcuCisgKgorICogPHA+CisgKiBVc2Uge0BsaW5rICNhZGREcmF3YWJsZShEcmF3YWJsZSl9IHRvIGRlZmluZSB0aGUgZGlmZmVyZW50IERyYXdhYmxlcyB0aGF0IHdpbGwgcmVwcmVzZW50IHRoZQorICogbWlwbWFwIGxldmVscyBvZiB0aGlzIE1pcG1hcERyYXdhYmxlLiBUaGUgbWlwbWFwIERyYXdhYmxlIHRoYXQgd2lsbCBhY3R1YWxseSBiZSB1c2VkIHdoZW4gdGhpcworICogTWlwbWFwRHJhd2FibGUgaXMgZHJhd24gaXMgdGhlIG9uZSB3aGljaCBoYXMgdGhlIHNtYWxsZXN0IGludHJpbnNpYyBoZWlnaHQgZ3JlYXRlciBvciBlcXVhbCB0aGFuCisgKiB0aGUgYm91bmRzJyBoZWlnaHQuIFRoaXMgc2VsZWN0aW9uIGVuc3VyZXMgdGhhdCB0aGUgYmVzdCBhdmFpbGFibGUgbWlwbWFwIGxldmVsIGlzIHNjYWxlZCBkb3duIHRvCisgKiBkcmF3IHRoaXMgTWlwbWFwRHJhd2FibGUuCisgKiA8L3A+CisgKgorICogSWYgdGhlIGJvdW5kcycgaGVpZ2h0IGlzIGxhcmdlciB0aGFuIHRoZSBsYXJnZXN0IG1pcG1hcCwgdGhlIGxhcmdlc3QgbWlwbWFwIHdpbGwgYmUgc2NhbGVkIHVwLgorICogTm90ZSB0aGF0IERyYXdhYmxlcyB3aXRob3V0IGludHJpbnNpYyBoZWlnaHQgKGkuZS4gd2l0aCBhIG5lZ2F0aXZlIHZhbHVlLCBzdWNoIGFzIENvbG9yKSB3aWxsCisgKiBvbmx5IGJlIHVzZWQgaWYgbm8gb3RoZXIgbWlwbWFwIERyYXdhYmxlIGFyZSBwcm92aWRlZC4gVGhlIERyYXdhYmxlcycgaW50cmluc2ljIGhlaWdodHMgc2hvdWxkCisgKiBub3QgYmUgY2hhbmdlZCBhZnRlciB0aGUgRHJhd2FibGUgaGFzIGJlZW4gYWRkZWQgdG8gdGhpcyBNaXBtYXBEcmF3YWJsZS4KKyAqCisgKiA8cD4KKyAqIFRoZSBkaWZmZXJlbnQgbWlwbWFwcycgcGFyYW1ldGVycyAob3BhY2l0eSwgcGFkZGluZywgY29sb3IgZmlsdGVyLCBncmF2aXR5Li4uKSBzaG91bGQgdHlwaWNhbGx5CisgKiBiZSBzaW1pbGFyIHRvIGVuc3VyZSBhIGNvbnRpbnVvdXMgdmlzdWFsIGFwcGVhcmFuY2Ugd2hlbiB0aGUgTWlwbWFwRHJhd2FibGUgaXMgc2NhbGVkLiBUaGUgYXNwZWN0CisgKiByYXRpbyBvZiB0aGUgZGlmZmVyZW50IG1pcG1hcHMgc2hvdWxkIGVzcGVjaWFsbHkgYmUgZXF1YWwuCisgKiA8L3A+CisgKgorICogQSB0eXBpY2FsIGV4YW1wbGUgdXNlIG9mIGEgTWlwbWFwRHJhd2FibGUgd291bGQgYmUgZm9yIGFuIGltYWdlIHdoaWNoIGlzIGludGVuZGVkIHRvIGJlIHNjYWxlZCBhdAorICogdmFyaW91cyBzaXplcywgYW5kIGZvciB3aGljaCBvbmUgd2FudHMgdG8gcHJvdmlkZSBwcmUtc2NhbGVkIHZlcnNpb25zIHRvIHByZWNpc2VseSBjb250cm9sIGl0cworICogYXBwZWFyYW5jZS4KKyAqCisgKiA8cD4KKyAqIFRoZSBpbnRyaW5zaWMgc2l6ZSBvZiBhIE1pcG1hcERyYXdhYmxlIGFyZSBpbmZlcnJlZCBmcm9tIHRob3NlIG9mIHRoZSBsYXJnZXN0IG1pcG1hcCAoaW4gdGVybXMgb2YKKyAqIHtAbGluayBEcmF3YWJsZSNnZXRJbnRyaW5zaWNIZWlnaHQoKX0pLiBPbiB0aGUgb3Bwb3NpdGUsIGl0cyBtaW5pbXVtCisgKiBzaXplIGlzIGRlZmluZWQgYnkgdGhlIHNtYWxsZXN0IHByb3ZpZGVkIG1pcG1hcC4KKyAqIDwvcD4KKworICogSXQgY2FuIGJlIGRlZmluZWQgaW4gYW4gWE1MIGZpbGUgd2l0aCB0aGUgPGNvZGU+Jmx0O21pcG1hcD48L2NvZGU+IGVsZW1lbnQuCisgKiBFYWNoIG1pcG1hcCBEcmF3YWJsZSBpcyBkZWZpbmVkIGluIGEgbmVzdGVkIDxjb2RlPiZsdDtpdGVtPjwvY29kZT4uIEZvciBleGFtcGxlOgorICogPHByZT4KKyAqICZsdDttaXBtYXAgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIj4KKyAqICAmbHQ7aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvbXlfaW1hZ2VfOCIgLz4KKyAqICAmbHQ7aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvbXlfaW1hZ2VfMzIiIC8+CisgKiAgJmx0O2l0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL215X2ltYWdlXzEyOCIgLz4KKyAqICZsdDsvbWlwbWFwPgorICo8L3ByZT4KKyAqIDxwPgorICogV2l0aCB0aGlzIFhNTCBzYXZlZCBpbnRvIHRoZSByZXMvZHJhd2FibGUvIGZvbGRlciBvZiB0aGUgcHJvamVjdCwgaXQgY2FuIGJlIHJlZmVyZW5jZWQgYXMKKyAqIHRoZSBkcmF3YWJsZSBmb3IgYW4ge0BsaW5rIGFuZHJvaWQud2lkZ2V0LkltYWdlVmlld30uIEFzc3VtaW5nIHRoYXQgdGhlIGhlaWdodHMgb2YgdGhlIHByb3ZpZGVkCisgKiBkcmF3YWJsZXMgYXJlIHJlc3BlY3RpdmVseSA4LCAzMiBhbmQgMTI4IHBpeGVscywgdGhlIGZpcnN0IG9uZSB3aWxsIGJlIHNjYWxlZCBkb3duIHdoZW4gdGhlCisgKiBib3VuZHMnIGhlaWdodCBpcyBsb3dlciBvciBlcXVhbCB0aGFuIDggcGl4ZWxzLiBUaGUgc2Vjb25kIGRyYXdhYmxlIHdpbGwgdGhlbiBiZSB1c2VkIHVwIHRvIGEKKyAqIGhlaWdodCBvZiAzMiBwaXhlbHMgYW5kIHRoZSBsYXJnZXN0IGRyYXdhYmxlIHdpbGwgYmUgdXNlZCBmb3IgZ3JlYXRlciBoZWlnaHRzLgorICogPC9wPgorICogQGF0dHIgcmVmIGFuZHJvaWQuUi5zdHlsZWFibGUjTWlwbWFwRHJhd2FibGVJdGVtX2RyYXdhYmxlCisgKi8KK3B1YmxpYyBjbGFzcyBNaXBtYXBEcmF3YWJsZSBleHRlbmRzIERyYXdhYmxlQ29udGFpbmVyIHsKKyAgICBwcml2YXRlIGZpbmFsIE1pcG1hcENvbnRhaW5lclN0YXRlIG1NaXBtYXBDb250YWluZXJTdGF0ZTsKKyAgICBwcml2YXRlIGJvb2xlYW4gbU11dGF0ZWQ7CisKKyAgICBwdWJsaWMgTWlwbWFwRHJhd2FibGUoKSB7CisgICAgICAgIHRoaXMobnVsbCwgbnVsbCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkcyBhIERyYXdhYmxlIHRvIHRoZSBsaXN0IG9mIGF2YWlsYWJsZSBtaXBtYXAgRHJhd2FibGVzLiBUaGUgRHJhd2FibGUgYWN0dWFsbHkgdXNlZCB3aGVuCisgICAgICogdGhpcyBNaXBtYXBEcmF3YWJsZSBpcyBkcmF3biBpcyBkZXRlcm1pbmVkIGZyb20gaXRzIGJvdW5kcy4KKyAgICAgKgorICAgICAqIFRoaXMgbWV0aG9kIGhhcyBubyBlZmZlY3QgaWYgZHJhd2FibGUgaXMgbnVsbC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBkcmF3YWJsZSBUaGUgRHJhd2FibGUgdGhhdCB3aWxsIGJlIGFkZGVkIHRvIGxpc3Qgb2YgYXZhaWxhYmxlIG1pcG1hcCBEcmF3YWJsZXMuCisgICAgICovCisKKyAgICBwdWJsaWMgdm9pZCBhZGREcmF3YWJsZShEcmF3YWJsZSBkcmF3YWJsZSkgeworICAgICAgICBpZiAoZHJhd2FibGUgIT0gbnVsbCkgeworICAgICAgICAgICAgbU1pcG1hcENvbnRhaW5lclN0YXRlLmFkZERyYXdhYmxlKGRyYXdhYmxlKTsKKyAgICAgICAgICAgIG9uRHJhd2FibGVBZGRlZCgpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIG9uRHJhd2FibGVBZGRlZCgpIHsKKyAgICAgICAgLy8gc2VsZWN0RHJhd2FibGUgYXNzdW1lcyB0aGF0IHRoZSBjb250YWluZXIgY29udGVudCBkb2VzIG5vdCBjaGFuZ2UuCisgICAgICAgIC8vIFdoZW4gYSBEcmF3YWJsZSBpcyBhZGRlZCwgdGhlIHNhbWUgaW5kZXggY2FuIGNvcnJlc3BvbmQgdG8gYSBuZXcgRHJhd2FibGUsIGFuZCBzaW5jZQorICAgICAgICAvLyBzZWxlY3REcmF3YWJsZSBoYXMgYSBmYXN0IGV4aXQgY2FzZSB3aGVuIG9sZEluZGV4PT1uZXdJbmRleCwgdGhlIG5ldyBkcmF3YWJsZSBjb3VsZCBlbmQKKyAgICAgICAgLy8gdXAgbm90IGJlaW5nIHVzZWQgaW4gcGxhY2Ugb2YgdGhlIHByZXZpb3VzIG9uZSBpZiB0aGV5IGhhcHBlbiB0byBzaGFyZSB0aGUgc2FtZSBpbmRleC4KKyAgICAgICAgLy8gVGhpcyBtYWtlIHN1cmUgdGhlIG5ldyBjb21wdXRlZCBpbmRleCBjYW4gYWN0dWFsbHkgcmVwbGFjZSB0aGUgcHJldmlvdXMgb25lLgorICAgICAgICBzZWxlY3REcmF3YWJsZSgtMSk7CisgICAgICAgIG9uQm91bmRzQ2hhbmdlKGdldEJvdW5kcygpKTsKKyAgICB9CisKKyAgICAvLyBvdmVycmlkZXMgZnJvbSBEcmF3YWJsZQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25Cb3VuZHNDaGFuZ2UoUmVjdCBib3VuZHMpIHsKKyAgICAgICAgZmluYWwgaW50IGluZGV4ID0gbU1pcG1hcENvbnRhaW5lclN0YXRlLmluZGV4Rm9yQm91bmRzKGJvdW5kcyk7CisKKyAgICAgICAgLy8gV2lsbCBjYWxsIGludmFsaWRhdGVTZWxmKCkgaWYgbmVlZGVkCisgICAgICAgIHNlbGVjdERyYXdhYmxlKGluZGV4KTsKKworICAgICAgICBzdXBlci5vbkJvdW5kc0NoYW5nZShib3VuZHMpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGluZmxhdGUoUmVzb3VyY2VzIHIsIFhtbFB1bGxQYXJzZXIgcGFyc2VyLCBBdHRyaWJ1dGVTZXQgYXR0cnMpCisgICAgdGhyb3dzIFhtbFB1bGxQYXJzZXJFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKKworICAgICAgICBzdXBlci5pbmZsYXRlKHIsIHBhcnNlciwgYXR0cnMpOworCisgICAgICAgIGludCB0eXBlOworCisgICAgICAgIGZpbmFsIGludCBpbm5lckRlcHRoID0gcGFyc2VyLmdldERlcHRoKCkgKyAxOworICAgICAgICBpbnQgZGVwdGg7CisgICAgICAgIHdoaWxlICgodHlwZSA9IHBhcnNlci5uZXh0KCkpICE9IFhtbFB1bGxQYXJzZXIuRU5EX0RPQ1VNRU5UCisgICAgICAgICAgICAgICAgJiYgKChkZXB0aCA9IHBhcnNlci5nZXREZXB0aCgpKSA+PSBpbm5lckRlcHRoCisgICAgICAgICAgICAgICAgICAgICAgICB8fCB0eXBlICE9IFhtbFB1bGxQYXJzZXIuRU5EX1RBRykpIHsKKyAgICAgICAgICAgIGlmICh0eXBlICE9IFhtbFB1bGxQYXJzZXIuU1RBUlRfVEFHKSB7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChkZXB0aCA+IGlubmVyRGVwdGggfHwgIXBhcnNlci5nZXROYW1lKCkuZXF1YWxzKCJpdGVtIikpIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgVHlwZWRBcnJheSBhID0gci5vYnRhaW5BdHRyaWJ1dGVzKGF0dHJzLAorICAgICAgICAgICAgICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZS5NaXBtYXBEcmF3YWJsZUl0ZW0pOworCisgICAgICAgICAgICBpbnQgZHJhd2FibGVSZXMgPSBhLmdldFJlc291cmNlSWQoCisgICAgICAgICAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLk1pcG1hcERyYXdhYmxlSXRlbV9kcmF3YWJsZSwgMCk7CisKKyAgICAgICAgICAgIGEucmVjeWNsZSgpOworCisgICAgICAgICAgICBEcmF3YWJsZSBkcjsKKyAgICAgICAgICAgIGlmIChkcmF3YWJsZVJlcyAhPSAwKSB7CisgICAgICAgICAgICAgICAgZHIgPSByLmdldERyYXdhYmxlKGRyYXdhYmxlUmVzKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgd2hpbGUgKCh0eXBlID0gcGFyc2VyLm5leHQoKSkgPT0gWG1sUHVsbFBhcnNlci5URVhUKSB7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmICh0eXBlICE9IFhtbFB1bGxQYXJzZXIuU1RBUlRfVEFHKSB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBYbWxQdWxsUGFyc2VyRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlci5nZXRQb3NpdGlvbkRlc2NyaXB0aW9uKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArICI6IDxpdGVtPiB0YWcgcmVxdWlyZXMgYSAnZHJhd2FibGUnIGF0dHJpYnV0ZSBvciAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiY2hpbGQgdGFnIGRlZmluaW5nIGEgZHJhd2FibGUiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZHIgPSBEcmF3YWJsZS5jcmVhdGVGcm9tWG1sSW5uZXIociwgcGFyc2VyLCBhdHRycyk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG1NaXBtYXBDb250YWluZXJTdGF0ZS5hZGREcmF3YWJsZShkcik7CisgICAgICAgIH0KKworICAgICAgICBvbkRyYXdhYmxlQWRkZWQoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgRHJhd2FibGUgbXV0YXRlKCkgeworICAgICAgICBpZiAoIW1NdXRhdGVkICYmIHN1cGVyLm11dGF0ZSgpID09IHRoaXMpIHsKKyAgICAgICAgICAgIG1NaXBtYXBDb250YWluZXJTdGF0ZS5tTWlwbWFwSGVpZ2h0cyA9IG1NaXBtYXBDb250YWluZXJTdGF0ZS5tTWlwbWFwSGVpZ2h0cy5jbG9uZSgpOworICAgICAgICAgICAgbU11dGF0ZWQgPSB0cnVlOworICAgICAgICB9CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIHByaXZhdGUgZmluYWwgc3RhdGljIGNsYXNzIE1pcG1hcENvbnRhaW5lclN0YXRlIGV4dGVuZHMgRHJhd2FibGVDb250YWluZXJTdGF0ZSB7CisgICAgICAgIHByaXZhdGUgaW50W10gbU1pcG1hcEhlaWdodHM7CisKKyAgICAgICAgTWlwbWFwQ29udGFpbmVyU3RhdGUoTWlwbWFwQ29udGFpbmVyU3RhdGUgb3JpZywgTWlwbWFwRHJhd2FibGUgb3duZXIsIFJlc291cmNlcyByZXMpIHsKKyAgICAgICAgICAgIHN1cGVyKG9yaWcsIG93bmVyLCByZXMpOworCisgICAgICAgICAgICBpZiAob3JpZyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgbU1pcG1hcEhlaWdodHMgPSBvcmlnLm1NaXBtYXBIZWlnaHRzOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBtTWlwbWFwSGVpZ2h0cyA9IG5ldyBpbnRbZ2V0Q2hpbGRyZW4oKS5sZW5ndGhdOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBDaGFuZ2UgdGhlIGRlZmF1bHQgdmFsdWUKKyAgICAgICAgICAgIHNldENvbnN0YW50U2l6ZSh0cnVlKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBSZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgY2hpbGQgbWlwbWFwIGRyYXdhYmxlIHRoYXQgd2lsbCBiZXN0IGZpdCB0aGUgcHJvdmlkZWQgYm91bmRzLgorICAgICAgICAgKiBUaGlzIGluZGV4IGlzIGRldGVybWluZWQgYnkgY29tcGFyaW5nIGJvdW5kcycgaGVpZ2h0IGFuZCBjaGlsZHJlbiBpbnRyaW5zaWMgaGVpZ2h0cy4KKyAgICAgICAgICogVGhlIHJldHVybmVkIG1pcG1hcCBpbmRleCBpcyB0aGUgc21hbGxlc3QgbWlwbWFwIHdoaWNoIGhlaWdodCBpcyBncmVhdGVyIG9yIGVxdWFsIHRoYW4KKyAgICAgICAgICogdGhlIGJvdW5kcycgaGVpZ2h0LiBJZiB0aGUgYm91bmRzJyBoZWlnaHQgaXMgbGFyZ2VyIHRoYW4gdGhlIGxhcmdlc3QgbWlwbWFwLCB0aGUgbGFyZ2VzdAorICAgICAgICAgKiBtaXBtYXAgaW5kZXggaXMgcmV0dXJuZWQuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBib3VuZHMgVGhlIGJvdW5kcyBvZiB0aGUgTWlwTWFwRHJhd2FibGUuCisgICAgICAgICAqIEByZXR1cm4gVGhlIGluZGV4IG9mIHRoZSBjaGlsZCBEcmF3YWJsZSB0aGF0IHdpbGwgYmVzdCBmaXQgdGhlc2UgYm91bmRzLCBvciAtMSBpZiB0aGVyZQorICAgICAgICAgKiBhcmUgbm8gY2hpbGRyZW4gbWlwbWFwcy4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBpbnQgaW5kZXhGb3JCb3VuZHMoUmVjdCBib3VuZHMpIHsKKyAgICAgICAgICAgIGZpbmFsIGludCBib3VuZHNIZWlnaHQgPSBib3VuZHMuaGVpZ2h0KCk7CisgICAgICAgICAgICBmaW5hbCBpbnQgTiA9IGdldENoaWxkQ291bnQoKTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTjsgaSsrKSB7CisgICAgICAgICAgICAgICAgaWYgKGJvdW5kc0hlaWdodCA8PSBtTWlwbWFwSGVpZ2h0c1tpXSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gaTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIE5vIG1pcG1hcCBsYXJnZXIgdGhhbiBib3VuZHMgZm91bmQuIFVzZSBsYXJnZXN0IG9uZSB3aGljaCB3aWxsIGJlIHNjYWxlZCB1cC4KKyAgICAgICAgICAgIGlmIChOID4gMCkgeworICAgICAgICAgICAgICAgIHJldHVybiBOIC0gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIE5vIERyYXdhYmxlIG1pcG1hcCBhdCBhbGwKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBBZGRzIGEgRHJhd2FibGUgdG8gdGhlIGxpc3Qgb2YgYXZhaWxhYmxlIG1pcG1hcCBEcmF3YWJsZXMuIFRoaXMgbGlzdCBjYW4gYmUgcmV0cmlldmVkCisgICAgICAgICAqIHVzaW5nIHtAbGluayBEcmF3YWJsZUNvbnRhaW5lci5EcmF3YWJsZUNvbnRhaW5lclN0YXRlI2dldENoaWxkcmVuKCl9IGFuZCB0aGlzIG1ldGhvZAorICAgICAgICAgKiBlbnN1cmVzIHRoYXQgaXQgaXMgYWx3YXlzIHNvcnRlZCBieSBpbmNyZWFzaW5nIHtAbGluayBEcmF3YWJsZSNnZXRJbnRyaW5zaWNIZWlnaHQoKX0uCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBkcmF3YWJsZSBUaGUgRHJhd2FibGUgdGhhdCB3aWxsIGJlIGFkZGVkIHRvIGNoaWxkcmVuIGxpc3QKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2b2lkIGFkZERyYXdhYmxlKERyYXdhYmxlIGRyYXdhYmxlKSB7CisgICAgICAgICAgICAvLyBJbnNlcnQgZHJhd2FibGUgaW4gbGFzdCBwb3NpdGlvbiwgY29ycmVjdGx5IHJlc2V0dGluZyBjYWNoZWQgdmFsdWVzIGFuZAorICAgICAgICAgICAgLy8gZXNwZWNpYWxseSBtQ29tcHV0ZWRDb25zdGFudFNpemUKKyAgICAgICAgICAgIGludCBwb3MgPSBhZGRDaGlsZChkcmF3YWJsZSk7CisKKyAgICAgICAgICAgIC8vIEJ1YmJsZSBzb3J0IHRoZSBsYXN0IGRyYXdhYmxlIHRvIHJlc3RvcmUgdGhlIHNvcnQgYnkgaW50cmluc2ljIGhlaWdodAorICAgICAgICAgICAgZmluYWwgaW50IGRyYXdhYmxlSGVpZ2h0ID0gZHJhd2FibGUuZ2V0SW50cmluc2ljSGVpZ2h0KCk7CisKKyAgICAgICAgICAgIHdoaWxlIChwb3MgPiAwKSB7CisgICAgICAgICAgICAgICAgZmluYWwgRHJhd2FibGUgcHJldmlvdXNEcmF3YWJsZSA9IG1EcmF3YWJsZXNbcG9zLTFdOworICAgICAgICAgICAgICAgIGZpbmFsIGludCBwcmV2aW91c0ludHJpbnNpY0hlaWdodCA9IHByZXZpb3VzRHJhd2FibGUuZ2V0SW50cmluc2ljSGVpZ2h0KCk7CisKKyAgICAgICAgICAgICAgICBpZiAoZHJhd2FibGVIZWlnaHQgPCBwcmV2aW91c0ludHJpbnNpY0hlaWdodCkgeworICAgICAgICAgICAgICAgICAgICBtRHJhd2FibGVzW3Bvc10gPSBwcmV2aW91c0RyYXdhYmxlOworICAgICAgICAgICAgICAgICAgICBtTWlwbWFwSGVpZ2h0c1twb3NdID0gcHJldmlvdXNJbnRyaW5zaWNIZWlnaHQ7CisKKyAgICAgICAgICAgICAgICAgICAgbURyYXdhYmxlc1twb3MtMV0gPSBkcmF3YWJsZTsKKyAgICAgICAgICAgICAgICAgICAgbU1pcG1hcEhlaWdodHNbcG9zLTFdID0gZHJhd2FibGVIZWlnaHQ7CisgICAgICAgICAgICAgICAgICAgIHBvcy0tOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBJbnRyaW5zaWMgc2l6ZXMgYXJlIHRob3NlIG9mIHRoZSBsYXJnZXN0IGF2YWlsYWJsZSBtaXBtYXAuCisgICAgICAgICAqIE1pbmltdW0gc2l6ZXMgYXJlIHRob3NlIG9mIHRoZSBzbWFsbGVzdCBhdmFpbGFibGUgbWlwbWFwLgorICAgICAgICAgKi8KKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHByb3RlY3RlZCB2b2lkIGNvbXB1dGVDb25zdGFudFNpemUoKSB7CisgICAgICAgICAgICBmaW5hbCBpbnQgTiA9IGdldENoaWxkQ291bnQoKTsKKyAgICAgICAgICAgIGlmIChOID4gMCkgeworICAgICAgICAgICAgICAgIGZpbmFsIERyYXdhYmxlIHNtYWxsZXN0RHJhd2FibGUgPSBtRHJhd2FibGVzWzBdOworICAgICAgICAgICAgICAgIG1Db25zdGFudE1pbmltdW1XaWR0aCA9IHNtYWxsZXN0RHJhd2FibGUuZ2V0TWluaW11bVdpZHRoKCk7CisgICAgICAgICAgICAgICAgbUNvbnN0YW50TWluaW11bUhlaWdodCA9IHNtYWxsZXN0RHJhd2FibGUuZ2V0TWluaW11bUhlaWdodCgpOworCisgICAgICAgICAgICAgICAgZmluYWwgRHJhd2FibGUgbGFyZ2VzdERyYXdhYmxlID0gbURyYXdhYmxlc1tOLTFdOworICAgICAgICAgICAgICAgIG1Db25zdGFudFdpZHRoID0gbGFyZ2VzdERyYXdhYmxlLmdldEludHJpbnNpY1dpZHRoKCk7CisgICAgICAgICAgICAgICAgbUNvbnN0YW50SGVpZ2h0ID0gbGFyZ2VzdERyYXdhYmxlLmdldEludHJpbnNpY0hlaWdodCgpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBtQ29uc3RhbnRXaWR0aCA9IG1Db25zdGFudEhlaWdodCA9IC0xOworICAgICAgICAgICAgICAgIG1Db25zdGFudE1pbmltdW1XaWR0aCA9IG1Db25zdGFudE1pbmltdW1IZWlnaHQgPSAwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbUNvbXB1dGVkQ29uc3RhbnRTaXplID0gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgRHJhd2FibGUgbmV3RHJhd2FibGUoKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IE1pcG1hcERyYXdhYmxlKHRoaXMsIG51bGwpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBEcmF3YWJsZSBuZXdEcmF3YWJsZShSZXNvdXJjZXMgcmVzKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IE1pcG1hcERyYXdhYmxlKHRoaXMsIHJlcyk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgZ3Jvd0FycmF5KGludCBvbGRTaXplLCBpbnQgbmV3U2l6ZSkgeworICAgICAgICAgICAgc3VwZXIuZ3Jvd0FycmF5KG9sZFNpemUsIG5ld1NpemUpOworICAgICAgICAgICAgaW50W10gbmV3SW50cyA9IG5ldyBpbnRbbmV3U2l6ZV07CisgICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KG1NaXBtYXBIZWlnaHRzLCAwLCBuZXdJbnRzLCAwLCBvbGRTaXplKTsKKyAgICAgICAgICAgIG1NaXBtYXBIZWlnaHRzID0gbmV3SW50czsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgTWlwbWFwRHJhd2FibGUoTWlwbWFwQ29udGFpbmVyU3RhdGUgc3RhdGUsIFJlc291cmNlcyByZXMpIHsKKyAgICAgICAgTWlwbWFwQ29udGFpbmVyU3RhdGUgYXMgPSBuZXcgTWlwbWFwQ29udGFpbmVyU3RhdGUoc3RhdGUsIHRoaXMsIHJlcyk7CisgICAgICAgIG1NaXBtYXBDb250YWluZXJTdGF0ZSA9IGFzOworICAgICAgICBzZXRDb25zdGFudFN0YXRlKGFzKTsKKyAgICAgICAgb25EcmF3YWJsZUFkZGVkKCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL2dyYXBoaWNzL2RyYXdhYmxlL05pbmVQYXRjaERyYXdhYmxlLmphdmEgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvZ3JhcGhpY3MvZHJhd2FibGUvTmluZVBhdGNoRHJhd2FibGUuamF2YQppbmRleCBiYWQ5NGZiLi45YTk4ZDUzIDEwMDY0NAotLS0gYS9ncmFwaGljcy9qYXZhL2FuZHJvaWQvZ3JhcGhpY3MvZHJhd2FibGUvTmluZVBhdGNoRHJhd2FibGUuamF2YQorKysgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvZ3JhcGhpY3MvZHJhd2FibGUvTmluZVBhdGNoRHJhd2FibGUuamF2YQpAQCAtMTc1LDE2ICsxNzUsOSBAQAogICAgICAgICAgICAgZGVzdC5ib3R0b20gPSBCaXRtYXAuc2NhbGVGcm9tRGVuc2l0eShzcmMuYm90dG9tLCBzZGVuc2l0eSwgdGRlbnNpdHkpOwogICAgICAgICB9CiAgICAgfQotICAgIAotICAgIC8vIG92ZXJyaWRlcwogCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgZHJhdyhDYW52YXMgY2FudmFzKSB7Ci0gICAgICAgIGlmIChmYWxzZSkgewotICAgICAgICAgICAgZmxvYXRbXSBwdHMgPSBuZXcgZmxvYXRbMl07Ci0gICAgICAgICAgICBjYW52YXMuZ2V0TWF0cml4KCkubWFwUG9pbnRzKHB0cyk7Ci0gICAgICAgICAgICBMb2cudigiOXBhdGNoIiwgIkRyYXdpbmcgOS1wYXRjaCBAICIgKyBwdHNbMF0gKyAiLCIgKyBwdHNbMV0gKyAiOiAiICsgZ2V0Qm91bmRzKCkpOwotICAgICAgICB9CiAgICAgICAgIG1OaW5lUGF0Y2guZHJhdyhjYW52YXMsIGdldEJvdW5kcygpLCBtUGFpbnQpOwogICAgIH0KIApkaWZmIC0tZ2l0IGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL2dyYXBoaWNzL2RyYXdhYmxlL3NoYXBlcy9Sb3VuZFJlY3RTaGFwZS5qYXZhIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL2dyYXBoaWNzL2RyYXdhYmxlL3NoYXBlcy9Sb3VuZFJlY3RTaGFwZS5qYXZhCmluZGV4IGY0Y2YxNWMuLmI0NjlkMmEgMTAwNjQ0Ci0tLSBhL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9ncmFwaGljcy9kcmF3YWJsZS9zaGFwZXMvUm91bmRSZWN0U2hhcGUuamF2YQorKysgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvZ3JhcGhpY3MvZHJhd2FibGUvc2hhcGVzL1JvdW5kUmVjdFNoYXBlLmphdmEKQEAgLTU3LDEzICs1NywxMSBAQAogICAgICAqLwogICAgIHB1YmxpYyBSb3VuZFJlY3RTaGFwZShmbG9hdFtdIG91dGVyUmFkaWksIFJlY3RGIGluc2V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdFtdIGlubmVyUmFkaWkpIHsKLSAgICAgICAgaWYgKG91dGVyUmFkaWkubGVuZ3RoIDwgOCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAib3V0ZXIgcmFkaWkgbXVzdCBoYXZlID49IDggdmFsdWVzIik7CisgICAgICAgIGlmIChvdXRlclJhZGlpICE9IG51bGwgJiYgb3V0ZXJSYWRpaS5sZW5ndGggPCA4KSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKCJvdXRlciByYWRpaSBtdXN0IGhhdmUgPj0gOCB2YWx1ZXMiKTsKICAgICAgICAgfQogICAgICAgICBpZiAoaW5uZXJSYWRpaSAhPSBudWxsICYmIGlubmVyUmFkaWkubGVuZ3RoIDwgOCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaW5uZXIgcmFkaWkgbXVzdCBoYXZlID49IDggdmFsdWVzIik7CisgICAgICAgICAgICB0aHJvdyBuZXcgQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKCJpbm5lciByYWRpaSBtdXN0IGhhdmUgPj0gOCB2YWx1ZXMiKTsKICAgICAgICAgfQogICAgICAgICBtT3V0ZXJSYWRpaSA9IG91dGVyUmFkaWk7CiAgICAgICAgIG1JbnNldCA9IGluc2V0OwpAQCAtOTcsOCArOTUsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgci5yaWdodCAtIG1JbnNldC5yaWdodCwgci5ib3R0b20gLSBtSW5zZXQuYm90dG9tKTsKICAgICAgICAgICAgIGlmIChtSW5uZXJSZWN0LndpZHRoKCkgPCB3ICYmIG1Jbm5lclJlY3QuaGVpZ2h0KCkgPCBoKSB7CiAgICAgICAgICAgICAgICAgaWYgKG1Jbm5lclJhZGlpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgbVBhdGguYWRkUm91bmRSZWN0KG1Jbm5lclJlY3QsIG1Jbm5lclJhZGlpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGF0aC5EaXJlY3Rpb24uQ0NXKTsKKyAgICAgICAgICAgICAgICAgICAgbVBhdGguYWRkUm91bmRSZWN0KG1Jbm5lclJlY3QsIG1Jbm5lclJhZGlpLCBQYXRoLkRpcmVjdGlvbi5DQ1cpOwogICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgIG1QYXRoLmFkZFJlY3QobUlubmVyUmVjdCwgUGF0aC5EaXJlY3Rpb24uQ0NXKTsKICAgICAgICAgICAgICAgICB9CkBAIC0xMDksOCArMTA2LDggQEAKICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgUm91bmRSZWN0U2hhcGUgY2xvbmUoKSB0aHJvd3MgQ2xvbmVOb3RTdXBwb3J0ZWRFeGNlcHRpb24gewogICAgICAgICBSb3VuZFJlY3RTaGFwZSBzaGFwZSA9IChSb3VuZFJlY3RTaGFwZSkgc3VwZXIuY2xvbmUoKTsKLSAgICAgICAgc2hhcGUubU91dGVyUmFkaWkgPSBtT3V0ZXJSYWRpaS5jbG9uZSgpOwotICAgICAgICBzaGFwZS5tSW5uZXJSYWRpaSA9IG1Jbm5lclJhZGlpLmNsb25lKCk7CisgICAgICAgIHNoYXBlLm1PdXRlclJhZGlpID0gbU91dGVyUmFkaWkgIT0gbnVsbCA/IG1PdXRlclJhZGlpLmNsb25lKCkgOiBudWxsOworICAgICAgICBzaGFwZS5tSW5uZXJSYWRpaSA9IG1Jbm5lclJhZGlpICE9IG51bGwgPyBtSW5uZXJSYWRpaS5jbG9uZSgpIDogbnVsbDsKICAgICAgICAgc2hhcGUubUluc2V0ID0gbmV3IFJlY3RGKG1JbnNldCk7CiAgICAgICAgIHNoYXBlLm1Jbm5lclJlY3QgPSBuZXcgUmVjdEYobUlubmVyUmVjdCk7CiAgICAgICAgIHNoYXBlLm1QYXRoID0gbmV3IFBhdGgobVBhdGgpOwpkaWZmIC0tZ2l0IGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9BbGxvY2F0aW9uLmphdmEgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L0FsbG9jYXRpb24uamF2YQppbmRleCBiMjdjN2Y1Li45ODVkNzAwIDEwMDY0NAotLS0gYS9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L0FsbG9jYXRpb24uamF2YQorKysgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L0FsbG9jYXRpb24uamF2YQpAQCAtMzUsMTEgKzM1LDI1IEBACiAgICAgQml0bWFwIG1CaXRtYXA7CiAKICAgICBBbGxvY2F0aW9uKGludCBpZCwgUmVuZGVyU2NyaXB0IHJzLCBUeXBlIHQpIHsKLSAgICAgICAgc3VwZXIocnMpOwotICAgICAgICBtSUQgPSBpZDsKKyAgICAgICAgc3VwZXIoaWQsIHJzKTsKICAgICAgICAgbVR5cGUgPSB0OwogICAgIH0KIAorICAgIEFsbG9jYXRpb24oaW50IGlkLCBSZW5kZXJTY3JpcHQgcnMpIHsKKyAgICAgICAgc3VwZXIoaWQsIHJzKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICB2b2lkIHVwZGF0ZUZyb21OYXRpdmUoKSB7CisgICAgICAgIG1SUy52YWxpZGF0ZSgpOworICAgICAgICBtTmFtZSA9IG1SUy5uR2V0TmFtZShtSUQpOworICAgICAgICBpbnQgdHlwZUlEID0gbVJTLm5BbGxvY2F0aW9uR2V0VHlwZShtSUQpOworICAgICAgICBpZih0eXBlSUQgIT0gMCkgeworICAgICAgICAgICAgbVR5cGUgPSBuZXcgVHlwZSh0eXBlSUQsIG1SUyk7CisgICAgICAgICAgICBtVHlwZS51cGRhdGVGcm9tTmF0aXZlKCk7CisgICAgICAgIH0KKyAgICB9CisKICAgICBwdWJsaWMgVHlwZSBnZXRUeXBlKCkgewogICAgICAgICByZXR1cm4gbVR5cGU7CiAgICAgfQpAQCAtNzYsMTAgKzkwLDUwIEBACiAgICAgICAgIHN1YkRhdGExRCgwLCBtVHlwZS5nZXRFbGVtZW50Q291bnQoKSwgZCk7CiAgICAgfQogCisgICAgcHVibGljIHZvaWQgc3ViRGF0YShpbnQgeG9mZiwgRmllbGRQYWNrZXIgZnApIHsKKyAgICAgICAgaW50IGVTaXplID0gbVR5cGUubUVsZW1lbnQuZ2V0U2l6ZUJ5dGVzKCk7CisgICAgICAgIGZpbmFsIGJ5dGVbXSBkYXRhID0gZnAuZ2V0RGF0YSgpOworCisgICAgICAgIGludCBjb3VudCA9IGRhdGEubGVuZ3RoIC8gZVNpemU7CisgICAgICAgIGlmICgoZVNpemUgKiBjb3VudCkgIT0gZGF0YS5sZW5ndGgpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkZpZWxkIHBhY2tlciBsZW5ndGggIiArIGRhdGEubGVuZ3RoICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBub3QgZGl2aXNpYmxlIGJ5IGVsZW1lbnQgc2l6ZSAiICsgZVNpemUgKyAiLiIpOworICAgICAgICB9CisgICAgICAgIGRhdGExRENoZWNrcyh4b2ZmLCBjb3VudCwgZGF0YS5sZW5ndGgsIGRhdGEubGVuZ3RoKTsKKyAgICAgICAgbVJTLm5BbGxvY2F0aW9uU3ViRGF0YTFEKG1JRCwgeG9mZiwgY291bnQsIGRhdGEsIGRhdGEubGVuZ3RoKTsKKyAgICB9CisKKworICAgIHB1YmxpYyB2b2lkIHN1YkVsZW1lbnREYXRhKGludCB4b2ZmLCBpbnQgY29tcG9uZW50X251bWJlciwgRmllbGRQYWNrZXIgZnApIHsKKyAgICAgICAgaWYgKGNvbXBvbmVudF9udW1iZXIgPj0gbVR5cGUubUVsZW1lbnQubUVsZW1lbnRzLmxlbmd0aCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiQ29tcG9uZW50X251bWJlciAiICsgY29tcG9uZW50X251bWJlciArICIgb3V0IG9mIHJhbmdlLiIpOworICAgICAgICB9CisgICAgICAgIGlmKHhvZmYgPCAwKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJPZmZzZXQgbXVzdCBiZSA+PSAwLiIpOworICAgICAgICB9CisKKyAgICAgICAgZmluYWwgYnl0ZVtdIGRhdGEgPSBmcC5nZXREYXRhKCk7CisgICAgICAgIGludCBlU2l6ZSA9IG1UeXBlLm1FbGVtZW50Lm1FbGVtZW50c1tjb21wb25lbnRfbnVtYmVyXS5nZXRTaXplQnl0ZXMoKTsKKworICAgICAgICBpZiAoZGF0YS5sZW5ndGggIT0gZVNpemUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkZpZWxkIHBhY2tlciBzaXplbGVuZ3RoICIgKyBkYXRhLmxlbmd0aCArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgZG9lcyBub3QgbWF0Y2ggY29tcG9uZW50IHNpemUgIiArIGVTaXplICsgIi4iKTsKKyAgICAgICAgfQorCisgICAgICAgIG1SUy5uQWxsb2NhdGlvblN1YkVsZW1lbnREYXRhMUQobUlELCB4b2ZmLCBjb21wb25lbnRfbnVtYmVyLCBkYXRhLCBkYXRhLmxlbmd0aCk7CisgICAgfQorCiAgICAgcHJpdmF0ZSB2b2lkIGRhdGExRENoZWNrcyhpbnQgb2ZmLCBpbnQgY291bnQsIGludCBsZW4sIGludCBkYXRhU2l6ZSkgewogICAgICAgICBtUlMudmFsaWRhdGUoKTsKLSAgICAgICAgaWYoKG9mZiA8IDApIHx8IChjb3VudCA8IDEpIHx8ICgob2ZmICsgY291bnQpID4gbVR5cGUuZ2V0RWxlbWVudENvdW50KCkpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJPZmZzZXQgb3IgQ291bnQgb3V0IG9mIGJvdW5kcy4iKTsKKyAgICAgICAgaWYob2ZmIDwgMCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiT2Zmc2V0IG11c3QgYmUgPj0gMC4iKTsKKyAgICAgICAgfQorICAgICAgICBpZihjb3VudCA8IDEpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkNvdW50IG11c3QgYmUgPj0gMS4iKTsKKyAgICAgICAgfQorICAgICAgICBpZigob2ZmICsgY291bnQpID4gbVR5cGUuZ2V0RWxlbWVudENvdW50KCkpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIk92ZXJmbG93LCBBdmFpbGFibGUgY291bnQgIiArIG1UeXBlLmdldEVsZW1lbnRDb3VudCgpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiwgZ290ICIgKyBjb3VudCArICIgYXQgb2Zmc2V0ICIgKyBvZmYgKyAiLiIpOwogICAgICAgICB9CiAgICAgICAgIGlmKChsZW4pIDwgZGF0YVNpemUpIHsKICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkFycmF5IHRvbyBzbWFsbCBmb3IgYWxsb2NhdGlvbiB0eXBlLiIpOwpAQCAtMTA4LDcgKzE2Miw2IEBACiAgICAgfQogCiAKLQogICAgIHB1YmxpYyB2b2lkIHN1YkRhdGEyRChpbnQgeG9mZiwgaW50IHlvZmYsIGludCB3LCBpbnQgaCwgaW50W10gZCkgewogICAgICAgICBtUlMudmFsaWRhdGUoKTsKICAgICAgICAgbVJTLm5BbGxvY2F0aW9uU3ViRGF0YTJEKG1JRCwgeG9mZiwgeW9mZiwgdywgaCwgZCwgZC5sZW5ndGggKiA0KTsKQEAgLTEyOSwyNSArMTgyLDEwIEBACiAgICAgICAgIG1SUy5uQWxsb2NhdGlvblJlYWQobUlELCBkKTsKICAgICB9CiAKLSAgICBwdWJsaWMgdm9pZCBkYXRhKE9iamVjdCBvKSB7Ci0gICAgICAgIG1SUy52YWxpZGF0ZSgpOwotICAgICAgICBtUlMubkFsbG9jYXRpb25TdWJEYXRhRnJvbU9iamVjdChtSUQsIG1UeXBlLCAwLCBvKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCByZWFkKE9iamVjdCBvKSB7Ci0gICAgICAgIG1SUy52YWxpZGF0ZSgpOwotICAgICAgICBtUlMubkFsbG9jYXRpb25TdWJSZWFkRnJvbU9iamVjdChtSUQsIG1UeXBlLCAwLCBvKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzdWJEYXRhKGludCBvZmZzZXQsIE9iamVjdCBvKSB7Ci0gICAgICAgIG1SUy52YWxpZGF0ZSgpOwotICAgICAgICBtUlMubkFsbG9jYXRpb25TdWJEYXRhRnJvbU9iamVjdChtSUQsIG1UeXBlLCBvZmZzZXQsIG8pOwotICAgIH0KIAogICAgIHB1YmxpYyBjbGFzcyBBZGFwdGVyMUQgZXh0ZW5kcyBCYXNlT2JqIHsKICAgICAgICAgQWRhcHRlcjFEKGludCBpZCwgUmVuZGVyU2NyaXB0IHJzKSB7Ci0gICAgICAgICAgICBzdXBlcihycyk7Ci0gICAgICAgICAgICBtSUQgPSBpZDsKKyAgICAgICAgICAgIHN1cGVyKGlkLCBycyk7CiAgICAgICAgIH0KIAogICAgICAgICBwdWJsaWMgdm9pZCBzZXRDb25zdHJhaW50KERpbWVuc2lvbiBkaW0sIGludCB2YWx1ZSkgewpAQCAtMTg5LDggKzIyNyw3IEBACiAKICAgICBwdWJsaWMgY2xhc3MgQWRhcHRlcjJEIGV4dGVuZHMgQmFzZU9iaiB7CiAgICAgICAgIEFkYXB0ZXIyRChpbnQgaWQsIFJlbmRlclNjcmlwdCBycykgewotICAgICAgICAgICAgc3VwZXIocnMpOwotICAgICAgICAgICAgbUlEID0gaWQ7CisgICAgICAgICAgICBzdXBlcihpZCwgcnMpOwogICAgICAgICB9CiAKICAgICAgICAgcHVibGljIHZvaWQgc2V0Q29uc3RyYWludChEaW1lbnNpb24gZGltLCBpbnQgdmFsdWUpIHsKQEAgLTM3Nyw2ICs0MTQsMjEgQEAKICAgICAgICAgQml0bWFwIGIgPSBCaXRtYXBGYWN0b3J5LmRlY29kZVJlc291cmNlKHJlcywgaWQsIG1CaXRtYXBPcHRpb25zKTsKICAgICAgICAgcmV0dXJuIGNyZWF0ZUZyb21CaXRtYXBCb3hlZChycywgYiwgZHN0Rm10LCBnZW5NaXBzKTsKICAgICB9CisKKyAgICBzdGF0aWMgcHVibGljIEFsbG9jYXRpb24gY3JlYXRlRnJvbVN0cmluZyhSZW5kZXJTY3JpcHQgcnMsIFN0cmluZyBzdHIpCisgICAgICAgIHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24geworICAgICAgICBieXRlW10gYWxsb2NBcnJheSA9IG51bGw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBhbGxvY0FycmF5ID0gc3RyLmdldEJ5dGVzKCJVVEYtOCIpOworICAgICAgICAgICAgQWxsb2NhdGlvbiBhbGxvYyA9IEFsbG9jYXRpb24uY3JlYXRlU2l6ZWQocnMsIEVsZW1lbnQuVTgocnMpLCBhbGxvY0FycmF5Lmxlbmd0aCk7CisgICAgICAgICAgICBhbGxvYy5kYXRhKGFsbG9jQXJyYXkpOworICAgICAgICAgICAgcmV0dXJuIGFsbG9jOworICAgICAgICB9CisgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgTG9nLmUoInJzIiwgImNvdWxkIG5vdCBjb252ZXJ0IHN0cmluZyB0byB1dGYtOCIpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KIH0KIAogCmRpZmYgLS1naXQgYS9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L0Jhc2VPYmouamF2YSBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvQmFzZU9iai5qYXZhCmluZGV4IDAwMmZjNzguLjMxOThlM2YgMTAwNjQ0Ci0tLSBhL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvQmFzZU9iai5qYXZhCisrKyBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvQmFzZU9iai5qYXZhCkBAIC0yNCwxMCArMjQsMTAgQEAKICAqKi8KIGNsYXNzIEJhc2VPYmogewogCi0gICAgQmFzZU9iaihSZW5kZXJTY3JpcHQgcnMpIHsKKyAgICBCYXNlT2JqKGludCBpZCwgUmVuZGVyU2NyaXB0IHJzKSB7CiAgICAgICAgIHJzLnZhbGlkYXRlKCk7CiAgICAgICAgIG1SUyA9IHJzOwotICAgICAgICBtSUQgPSAwOworICAgICAgICBtSUQgPSBpZDsKICAgICAgICAgbURlc3Ryb3llZCA9IGZhbHNlOwogICAgIH0KIApAQCAtNjIsNyArNjIsNyBAQAogICAgIHsKICAgICAgICAgaWYgKCFtRGVzdHJveWVkKSB7CiAgICAgICAgICAgICBpZihtSUQgIT0gMCAmJiBtUlMuaXNBbGl2ZSgpKSB7Ci0gICAgICAgICAgICAgICAgbVJTLm5PYmpEZXN0cm95T09CKG1JRCk7CisgICAgICAgICAgICAgICAgbVJTLm5PYmpEZXN0cm95KG1JRCk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBtUlMgPSBudWxsOwogICAgICAgICAgICAgbUlEID0gMDsKQEAgLTgxLDUgKzgxLDEwIEBACiAgICAgICAgIG1SUy5uT2JqRGVzdHJveShtSUQpOwogICAgIH0KIAorICAgIC8vIElmIGFuIG9iamVjdCBjYW1lIGZyb20gYW4gYTNkIGZpbGUsIGphdmEgZmllbGRzIG5lZWQgdG8gYmUKKyAgICAvLyBjcmVhdGVkIHdpdGggb2JqZWN0cyBmcm9tIHRoZSBuYXRpdmUgbGF5ZXIKKyAgICB2b2lkIHVwZGF0ZUZyb21OYXRpdmUoKSB7CisgICAgfQorCiB9CiAKZGlmZiAtLWdpdCBhL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvQnl0ZTIuamF2YSBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvQnl0ZTIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NWNmODhjCi0tLSAvZGV2L251bGwKKysrIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9CeXRlMi5qYXZhCkBAIC0wLDAgKzEsMzcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQucmVuZGVyc2NyaXB0OworCitpbXBvcnQgamF2YS5sYW5nLk1hdGg7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKKworCisvKioKKyAqIEBoaWRlCisgKgorICoqLworcHVibGljIGNsYXNzIEJ5dGUyIHsKKyAgICBwdWJsaWMgQnl0ZTIoKSB7CisgICAgfQorCisgICAgcHVibGljIGJ5dGUgeDsKKyAgICBwdWJsaWMgYnl0ZSB5OworfQorCisKKworCmRpZmYgLS1naXQgYS9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L0J5dGUzLmphdmEgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L0J5dGUzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTZjMGNhOQotLS0gL2Rldi9udWxsCisrKyBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvQnl0ZTMuamF2YQpAQCAtMCwwICsxLDM4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLnJlbmRlcnNjcmlwdDsKKworaW1wb3J0IGphdmEubGFuZy5NYXRoOworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CisKKworLyoqCisgKiBAaGlkZQorICoKKyAqKi8KK3B1YmxpYyBjbGFzcyBCeXRlMyB7CisgICAgcHVibGljIEJ5dGUzKCkgeworICAgIH0KKworICAgIHB1YmxpYyBieXRlIHg7CisgICAgcHVibGljIGJ5dGUgeTsKKyAgICBwdWJsaWMgYnl0ZSB6OworfQorCisKKworCmRpZmYgLS1naXQgYS9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L0J5dGU0LmphdmEgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L0J5dGU0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTViZmM2MQotLS0gL2Rldi9udWxsCisrKyBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvQnl0ZTQuamF2YQpAQCAtMCwwICsxLDM4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLnJlbmRlcnNjcmlwdDsKKworaW1wb3J0IGphdmEubGFuZy5NYXRoOworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CisKKworLyoqCisgKiBAaGlkZQorICoKKyAqKi8KK3B1YmxpYyBjbGFzcyBCeXRlNCB7CisgICAgcHVibGljIEJ5dGU0KCkgeworICAgIH0KKworICAgIHB1YmxpYyBieXRlIHg7CisgICAgcHVibGljIGJ5dGUgeTsKKyAgICBwdWJsaWMgYnl0ZSB6OworICAgIHB1YmxpYyBieXRlIHc7Cit9CisKKworCmRpZmYgLS1naXQgYS9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L0VsZW1lbnQuamF2YSBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvRWxlbWVudC5qYXZhCmluZGV4IDEwZWYwNWEuLjA1YjJkNjAgMTAwNjQ0Ci0tLSBhL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvRWxlbWVudC5qYXZhCisrKyBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvRWxlbWVudC5qYXZhCkBAIC0xNyw2ICsxNyw3IEBACiBwYWNrYWdlIGFuZHJvaWQucmVuZGVyc2NyaXB0OwogCiBpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuRmllbGQ7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKIAogLyoqCiAgKiBAaGlkZQpAQCAtMjYsNiArMjcsNyBAQAogICAgIGludCBtU2l6ZTsKICAgICBFbGVtZW50W10gbUVsZW1lbnRzOwogICAgIFN0cmluZ1tdIG1FbGVtZW50TmFtZXM7CisgICAgaW50W10gbUFycmF5U2l6ZXM7CiAKICAgICBEYXRhVHlwZSBtVHlwZTsKICAgICBEYXRhS2luZCBtS2luZDsKQEAgLTQ3LDIwICs0OSwyNiBAQAogICAgICAgICBVTlNJR05FRF8zMiAoMTAsIDQpLAogICAgICAgICAvL1VOU0lHTkVEXzY0ICgxMSwgOCksCiAKLSAgICAgICAgVU5TSUdORURfNV82XzUgKDEyLCAyKSwKLSAgICAgICAgVU5TSUdORURfNV81XzVfMSAoMTMsIDIpLAotICAgICAgICBVTlNJR05FRF80XzRfNF80ICgxNCwgMiksCisgICAgICAgIEJPT0xFQU4oMTIsIDEpLAogCi0gICAgICAgIFJTX0VMRU1FTlQgKDE1LCA0KSwKLSAgICAgICAgUlNfVFlQRSAoMTYsIDQpLAotICAgICAgICBSU19BTExPQ0FUSU9OICgxNywgNCksCi0gICAgICAgIFJTX1NBTVBMRVIgKDE4LCA0KSwKLSAgICAgICAgUlNfU0NSSVBUICgxOSwgNCksCi0gICAgICAgIFJTX01FU0ggKDIwLCA0KSwKLSAgICAgICAgUlNfUFJPR1JBTV9GUkFHTUVOVCAoMjEsIDQpLAotICAgICAgICBSU19QUk9HUkFNX1ZFUlRFWCAoMjIsIDQpLAotICAgICAgICBSU19QUk9HUkFNX1JBU1RFUiAoMjMsIDQpLAotICAgICAgICBSU19QUk9HUkFNX1NUT1JFICgyNCwgNCk7CisgICAgICAgIFVOU0lHTkVEXzVfNl81ICgxMywgMiksCisgICAgICAgIFVOU0lHTkVEXzVfNV81XzEgKDE0LCAyKSwKKyAgICAgICAgVU5TSUdORURfNF80XzRfNCAoMTUsIDIpLAorCisgICAgICAgIE1BVFJJWF80WDQgKDE2LCA2NCksCisgICAgICAgIE1BVFJJWF8zWDMgKDE3LCAzNiksCisgICAgICAgIE1BVFJJWF8yWDIgKDE4LCAxNiksCisKKyAgICAgICAgUlNfRUxFTUVOVCAoMTAwMCwgNCksCisgICAgICAgIFJTX1RZUEUgKDEwMDEsIDQpLAorICAgICAgICBSU19BTExPQ0FUSU9OICgxMDAyLCA0KSwKKyAgICAgICAgUlNfU0FNUExFUiAoMTAwMywgNCksCisgICAgICAgIFJTX1NDUklQVCAoMTAwNCwgNCksCisgICAgICAgIFJTX01FU0ggKDEwMDUsIDQpLAorICAgICAgICBSU19QUk9HUkFNX0ZSQUdNRU5UICgxMDA2LCA0KSwKKyAgICAgICAgUlNfUFJPR1JBTV9WRVJURVggKDEwMDcsIDQpLAorICAgICAgICBSU19QUk9HUkFNX1JBU1RFUiAoMTAwOCwgNCksCisgICAgICAgIFJTX1BST0dSQU1fU1RPUkUgKDEwMDksIDQpOwogCiAgICAgICAgIGludCBtSUQ7CiAgICAgICAgIGludCBtU2l6ZTsKQEAgLTcyLDEyICs4MCw2IEBACiAKICAgICBwdWJsaWMgZW51bSBEYXRhS2luZCB7CiAgICAgICAgIFVTRVIgKDApLAotICAgICAgICBDT0xPUiAoMSksCi0gICAgICAgIFBPU0lUSU9OICgyKSwKLSAgICAgICAgVEVYVFVSRSAoMyksCi0gICAgICAgIE5PUk1BTCAoNCksCi0gICAgICAgIElOREVYICg1KSwKLSAgICAgICAgUE9JTlRfU0laRSg2KSwKIAogICAgICAgICBQSVhFTF9MICg3KSwKICAgICAgICAgUElYRUxfQSAoOCksCkBAIC05MSw0MSArOTMsMTMzIEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICBwdWJsaWMgc3RhdGljIEVsZW1lbnQgVVNFUl9VOChSZW5kZXJTY3JpcHQgcnMpIHsKLSAgICAgICAgaWYocnMubUVsZW1lbnRfVVNFUl9VOCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBycy5tRWxlbWVudF9VU0VSX1U4ID0gY3JlYXRlVXNlcihycywgRGF0YVR5cGUuVU5TSUdORURfOCk7CisgICAgcHVibGljIHN0YXRpYyBFbGVtZW50IEJPT0xFQU4oUmVuZGVyU2NyaXB0IHJzKSB7CisgICAgICAgIGlmKHJzLm1FbGVtZW50X0JPT0xFQU4gPT0gbnVsbCkgeworICAgICAgICAgICAgcnMubUVsZW1lbnRfQk9PTEVBTiA9IGNyZWF0ZVVzZXIocnMsIERhdGFUeXBlLkJPT0xFQU4pOwogICAgICAgICB9Ci0gICAgICAgIHJldHVybiBycy5tRWxlbWVudF9VU0VSX1U4OworICAgICAgICByZXR1cm4gcnMubUVsZW1lbnRfQk9PTEVBTjsKICAgICB9CiAKLSAgICBwdWJsaWMgc3RhdGljIEVsZW1lbnQgVVNFUl9JOChSZW5kZXJTY3JpcHQgcnMpIHsKLSAgICAgICAgaWYocnMubUVsZW1lbnRfVVNFUl9JOCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBycy5tRWxlbWVudF9VU0VSX0k4ID0gY3JlYXRlVXNlcihycywgRGF0YVR5cGUuU0lHTkVEXzgpOworICAgIHB1YmxpYyBzdGF0aWMgRWxlbWVudCBVOChSZW5kZXJTY3JpcHQgcnMpIHsKKyAgICAgICAgaWYocnMubUVsZW1lbnRfVTggPT0gbnVsbCkgeworICAgICAgICAgICAgcnMubUVsZW1lbnRfVTggPSBjcmVhdGVVc2VyKHJzLCBEYXRhVHlwZS5VTlNJR05FRF84KTsKICAgICAgICAgfQotICAgICAgICByZXR1cm4gcnMubUVsZW1lbnRfVVNFUl9JODsKKyAgICAgICAgcmV0dXJuIHJzLm1FbGVtZW50X1U4OwogICAgIH0KIAotICAgIHB1YmxpYyBzdGF0aWMgRWxlbWVudCBVU0VSX1UzMihSZW5kZXJTY3JpcHQgcnMpIHsKLSAgICAgICAgaWYocnMubUVsZW1lbnRfVVNFUl9VMzIgPT0gbnVsbCkgewotICAgICAgICAgICAgcnMubUVsZW1lbnRfVVNFUl9VMzIgPSBjcmVhdGVVc2VyKHJzLCBEYXRhVHlwZS5VTlNJR05FRF8zMik7CisgICAgcHVibGljIHN0YXRpYyBFbGVtZW50IEk4KFJlbmRlclNjcmlwdCBycykgeworICAgICAgICBpZihycy5tRWxlbWVudF9JOCA9PSBudWxsKSB7CisgICAgICAgICAgICBycy5tRWxlbWVudF9JOCA9IGNyZWF0ZVVzZXIocnMsIERhdGFUeXBlLlNJR05FRF84KTsKICAgICAgICAgfQotICAgICAgICByZXR1cm4gcnMubUVsZW1lbnRfVVNFUl9VMzI7CisgICAgICAgIHJldHVybiBycy5tRWxlbWVudF9JODsKICAgICB9CiAKLSAgICBwdWJsaWMgc3RhdGljIEVsZW1lbnQgVVNFUl9JMzIoUmVuZGVyU2NyaXB0IHJzKSB7Ci0gICAgICAgIGlmKHJzLm1FbGVtZW50X1VTRVJfSTMyID09IG51bGwpIHsKLSAgICAgICAgICAgIHJzLm1FbGVtZW50X1VTRVJfSTMyID0gY3JlYXRlVXNlcihycywgRGF0YVR5cGUuU0lHTkVEXzMyKTsKKyAgICBwdWJsaWMgc3RhdGljIEVsZW1lbnQgVTE2KFJlbmRlclNjcmlwdCBycykgeworICAgICAgICBpZihycy5tRWxlbWVudF9VMTYgPT0gbnVsbCkgeworICAgICAgICAgICAgcnMubUVsZW1lbnRfVTE2ID0gY3JlYXRlVXNlcihycywgRGF0YVR5cGUuVU5TSUdORURfMTYpOwogICAgICAgICB9Ci0gICAgICAgIHJldHVybiBycy5tRWxlbWVudF9VU0VSX0kzMjsKKyAgICAgICAgcmV0dXJuIHJzLm1FbGVtZW50X1UxNjsKICAgICB9CiAKLSAgICBwdWJsaWMgc3RhdGljIEVsZW1lbnQgVVNFUl9GMzIoUmVuZGVyU2NyaXB0IHJzKSB7Ci0gICAgICAgIGlmKHJzLm1FbGVtZW50X1VTRVJfRjMyID09IG51bGwpIHsKLSAgICAgICAgICAgIHJzLm1FbGVtZW50X1VTRVJfRjMyID0gY3JlYXRlVXNlcihycywgRGF0YVR5cGUuRkxPQVRfMzIpOworICAgIHB1YmxpYyBzdGF0aWMgRWxlbWVudCBJMTYoUmVuZGVyU2NyaXB0IHJzKSB7CisgICAgICAgIGlmKHJzLm1FbGVtZW50X0kxNiA9PSBudWxsKSB7CisgICAgICAgICAgICBycy5tRWxlbWVudF9JMTYgPSBjcmVhdGVVc2VyKHJzLCBEYXRhVHlwZS5TSUdORURfMTYpOwogICAgICAgICB9Ci0gICAgICAgIHJldHVybiBycy5tRWxlbWVudF9VU0VSX0YzMjsKKyAgICAgICAgcmV0dXJuIHJzLm1FbGVtZW50X0kxNjsKICAgICB9CiAKKyAgICBwdWJsaWMgc3RhdGljIEVsZW1lbnQgVTMyKFJlbmRlclNjcmlwdCBycykgeworICAgICAgICBpZihycy5tRWxlbWVudF9VMzIgPT0gbnVsbCkgeworICAgICAgICAgICAgcnMubUVsZW1lbnRfVTMyID0gY3JlYXRlVXNlcihycywgRGF0YVR5cGUuVU5TSUdORURfMzIpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBycy5tRWxlbWVudF9VMzI7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBFbGVtZW50IEkzMihSZW5kZXJTY3JpcHQgcnMpIHsKKyAgICAgICAgaWYocnMubUVsZW1lbnRfSTMyID09IG51bGwpIHsKKyAgICAgICAgICAgIHJzLm1FbGVtZW50X0kzMiA9IGNyZWF0ZVVzZXIocnMsIERhdGFUeXBlLlNJR05FRF8zMik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJzLm1FbGVtZW50X0kzMjsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIEVsZW1lbnQgRjMyKFJlbmRlclNjcmlwdCBycykgeworICAgICAgICBpZihycy5tRWxlbWVudF9GMzIgPT0gbnVsbCkgeworICAgICAgICAgICAgcnMubUVsZW1lbnRfRjMyID0gY3JlYXRlVXNlcihycywgRGF0YVR5cGUuRkxPQVRfMzIpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBycy5tRWxlbWVudF9GMzI7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBFbGVtZW50IEVMRU1FTlQoUmVuZGVyU2NyaXB0IHJzKSB7CisgICAgICAgIGlmKHJzLm1FbGVtZW50X0VMRU1FTlQgPT0gbnVsbCkgeworICAgICAgICAgICAgcnMubUVsZW1lbnRfRUxFTUVOVCA9IGNyZWF0ZVVzZXIocnMsIERhdGFUeXBlLlJTX0VMRU1FTlQpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBycy5tRWxlbWVudF9FTEVNRU5UOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgRWxlbWVudCBUWVBFKFJlbmRlclNjcmlwdCBycykgeworICAgICAgICBpZihycy5tRWxlbWVudF9UWVBFID09IG51bGwpIHsKKyAgICAgICAgICAgIHJzLm1FbGVtZW50X1RZUEUgPSBjcmVhdGVVc2VyKHJzLCBEYXRhVHlwZS5SU19UWVBFKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcnMubUVsZW1lbnRfVFlQRTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIEVsZW1lbnQgQUxMT0NBVElPTihSZW5kZXJTY3JpcHQgcnMpIHsKKyAgICAgICAgaWYocnMubUVsZW1lbnRfQUxMT0NBVElPTiA9PSBudWxsKSB7CisgICAgICAgICAgICBycy5tRWxlbWVudF9BTExPQ0FUSU9OID0gY3JlYXRlVXNlcihycywgRGF0YVR5cGUuUlNfQUxMT0NBVElPTik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJzLm1FbGVtZW50X0FMTE9DQVRJT047CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBFbGVtZW50IFNBTVBMRVIoUmVuZGVyU2NyaXB0IHJzKSB7CisgICAgICAgIGlmKHJzLm1FbGVtZW50X1NBTVBMRVIgPT0gbnVsbCkgeworICAgICAgICAgICAgcnMubUVsZW1lbnRfU0FNUExFUiA9IGNyZWF0ZVVzZXIocnMsIERhdGFUeXBlLlJTX1NBTVBMRVIpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBycy5tRWxlbWVudF9TQU1QTEVSOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgRWxlbWVudCBTQ1JJUFQoUmVuZGVyU2NyaXB0IHJzKSB7CisgICAgICAgIGlmKHJzLm1FbGVtZW50X1NDUklQVCA9PSBudWxsKSB7CisgICAgICAgICAgICBycy5tRWxlbWVudF9TQ1JJUFQgPSBjcmVhdGVVc2VyKHJzLCBEYXRhVHlwZS5SU19TQ1JJUFQpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBycy5tRWxlbWVudF9TQ1JJUFQ7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBFbGVtZW50IE1FU0goUmVuZGVyU2NyaXB0IHJzKSB7CisgICAgICAgIGlmKHJzLm1FbGVtZW50X01FU0ggPT0gbnVsbCkgeworICAgICAgICAgICAgcnMubUVsZW1lbnRfTUVTSCA9IGNyZWF0ZVVzZXIocnMsIERhdGFUeXBlLlJTX01FU0gpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBycy5tRWxlbWVudF9NRVNIOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgRWxlbWVudCBQUk9HUkFNX0ZSQUdNRU5UKFJlbmRlclNjcmlwdCBycykgeworICAgICAgICBpZihycy5tRWxlbWVudF9QUk9HUkFNX0ZSQUdNRU5UID09IG51bGwpIHsKKyAgICAgICAgICAgIHJzLm1FbGVtZW50X1BST0dSQU1fRlJBR01FTlQgPSBjcmVhdGVVc2VyKHJzLCBEYXRhVHlwZS5SU19QUk9HUkFNX0ZSQUdNRU5UKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcnMubUVsZW1lbnRfUFJPR1JBTV9GUkFHTUVOVDsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIEVsZW1lbnQgUFJPR1JBTV9WRVJURVgoUmVuZGVyU2NyaXB0IHJzKSB7CisgICAgICAgIGlmKHJzLm1FbGVtZW50X1BST0dSQU1fVkVSVEVYID09IG51bGwpIHsKKyAgICAgICAgICAgIHJzLm1FbGVtZW50X1BST0dSQU1fVkVSVEVYID0gY3JlYXRlVXNlcihycywgRGF0YVR5cGUuUlNfUFJPR1JBTV9WRVJURVgpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBycy5tRWxlbWVudF9QUk9HUkFNX1ZFUlRFWDsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIEVsZW1lbnQgUFJPR1JBTV9SQVNURVIoUmVuZGVyU2NyaXB0IHJzKSB7CisgICAgICAgIGlmKHJzLm1FbGVtZW50X1BST0dSQU1fUkFTVEVSID09IG51bGwpIHsKKyAgICAgICAgICAgIHJzLm1FbGVtZW50X1BST0dSQU1fUkFTVEVSID0gY3JlYXRlVXNlcihycywgRGF0YVR5cGUuUlNfUFJPR1JBTV9SQVNURVIpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBycy5tRWxlbWVudF9QUk9HUkFNX1JBU1RFUjsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIEVsZW1lbnQgUFJPR1JBTV9TVE9SRShSZW5kZXJTY3JpcHQgcnMpIHsKKyAgICAgICAgaWYocnMubUVsZW1lbnRfUFJPR1JBTV9TVE9SRSA9PSBudWxsKSB7CisgICAgICAgICAgICBycy5tRWxlbWVudF9QUk9HUkFNX1NUT1JFID0gY3JlYXRlVXNlcihycywgRGF0YVR5cGUuUlNfUFJPR1JBTV9TVE9SRSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJzLm1FbGVtZW50X1BST0dSQU1fU1RPUkU7CisgICAgfQorCisKICAgICBwdWJsaWMgc3RhdGljIEVsZW1lbnQgQV84KFJlbmRlclNjcmlwdCBycykgewogICAgICAgICBpZihycy5tRWxlbWVudF9BXzggPT0gbnVsbCkgewogICAgICAgICAgICAgcnMubUVsZW1lbnRfQV84ID0gY3JlYXRlUGl4ZWwocnMsIERhdGFUeXBlLlVOU0lHTkVEXzgsIERhdGFLaW5kLlBJWEVMX0EpOwpAQCAtMTY4LDE2OCArMjYyLDE0MSBAQAogICAgICAgICByZXR1cm4gcnMubUVsZW1lbnRfUkdCQV84ODg4OwogICAgIH0KIAotICAgIHB1YmxpYyBzdGF0aWMgRWxlbWVudCBJTkRFWF8xNihSZW5kZXJTY3JpcHQgcnMpIHsKLSAgICAgICAgaWYocnMubUVsZW1lbnRfSU5ERVhfMTYgPT0gbnVsbCkgewotICAgICAgICAgICAgcnMubUVsZW1lbnRfSU5ERVhfMTYgPSBjcmVhdGVJbmRleChycyk7CisgICAgcHVibGljIHN0YXRpYyBFbGVtZW50IEYzMl8yKFJlbmRlclNjcmlwdCBycykgeworICAgICAgICBpZihycy5tRWxlbWVudF9GTE9BVF8yID09IG51bGwpIHsKKyAgICAgICAgICAgIHJzLm1FbGVtZW50X0ZMT0FUXzIgPSBjcmVhdGVWZWN0b3IocnMsIERhdGFUeXBlLkZMT0FUXzMyLCAyKTsKICAgICAgICAgfQotICAgICAgICByZXR1cm4gcnMubUVsZW1lbnRfSU5ERVhfMTY7CisgICAgICAgIHJldHVybiBycy5tRWxlbWVudF9GTE9BVF8yOwogICAgIH0KIAotICAgIHB1YmxpYyBzdGF0aWMgRWxlbWVudCBBVFRSSUJfUE9TSVRJT05fMihSZW5kZXJTY3JpcHQgcnMpIHsKLSAgICAgICAgaWYocnMubUVsZW1lbnRfUE9TSVRJT05fMiA9PSBudWxsKSB7Ci0gICAgICAgICAgICBycy5tRWxlbWVudF9QT1NJVElPTl8yID0gY3JlYXRlQXR0cmliKHJzLCBEYXRhVHlwZS5GTE9BVF8zMiwgRGF0YUtpbmQuUE9TSVRJT04sIDIpOworICAgIHB1YmxpYyBzdGF0aWMgRWxlbWVudCBGMzJfMyhSZW5kZXJTY3JpcHQgcnMpIHsKKyAgICAgICAgaWYocnMubUVsZW1lbnRfRkxPQVRfMyA9PSBudWxsKSB7CisgICAgICAgICAgICBycy5tRWxlbWVudF9GTE9BVF8zID0gY3JlYXRlVmVjdG9yKHJzLCBEYXRhVHlwZS5GTE9BVF8zMiwgMyk7CiAgICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJzLm1FbGVtZW50X1BPU0lUSU9OXzI7CisgICAgICAgIHJldHVybiBycy5tRWxlbWVudF9GTE9BVF8zOwogICAgIH0KIAotICAgIHB1YmxpYyBzdGF0aWMgRWxlbWVudCBBVFRSSUJfUE9TSVRJT05fMyhSZW5kZXJTY3JpcHQgcnMpIHsKLSAgICAgICAgaWYocnMubUVsZW1lbnRfUE9TSVRJT05fMyA9PSBudWxsKSB7Ci0gICAgICAgICAgICBycy5tRWxlbWVudF9QT1NJVElPTl8zID0gY3JlYXRlQXR0cmliKHJzLCBEYXRhVHlwZS5GTE9BVF8zMiwgRGF0YUtpbmQuUE9TSVRJT04sIDMpOworICAgIHB1YmxpYyBzdGF0aWMgRWxlbWVudCBGMzJfNChSZW5kZXJTY3JpcHQgcnMpIHsKKyAgICAgICAgaWYocnMubUVsZW1lbnRfRkxPQVRfNCA9PSBudWxsKSB7CisgICAgICAgICAgICBycy5tRWxlbWVudF9GTE9BVF80ID0gY3JlYXRlVmVjdG9yKHJzLCBEYXRhVHlwZS5GTE9BVF8zMiwgNCk7CiAgICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJzLm1FbGVtZW50X1BPU0lUSU9OXzM7CisgICAgICAgIHJldHVybiBycy5tRWxlbWVudF9GTE9BVF80OwogICAgIH0KIAotICAgIHB1YmxpYyBzdGF0aWMgRWxlbWVudCBBVFRSSUJfVEVYVFVSRV8yKFJlbmRlclNjcmlwdCBycykgewotICAgICAgICBpZihycy5tRWxlbWVudF9URVhUVVJFXzIgPT0gbnVsbCkgewotICAgICAgICAgICAgcnMubUVsZW1lbnRfVEVYVFVSRV8yID0gY3JlYXRlQXR0cmliKHJzLCBEYXRhVHlwZS5GTE9BVF8zMiwgRGF0YUtpbmQuVEVYVFVSRSwgMik7CisgICAgcHVibGljIHN0YXRpYyBFbGVtZW50IFU4XzQoUmVuZGVyU2NyaXB0IHJzKSB7CisgICAgICAgIGlmKHJzLm1FbGVtZW50X1VDSEFSXzQgPT0gbnVsbCkgeworICAgICAgICAgICAgcnMubUVsZW1lbnRfVUNIQVJfNCA9IGNyZWF0ZVZlY3RvcihycywgRGF0YVR5cGUuVU5TSUdORURfOCwgNCk7CiAgICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJzLm1FbGVtZW50X1RFWFRVUkVfMjsKKyAgICAgICAgcmV0dXJuIHJzLm1FbGVtZW50X1VDSEFSXzQ7CiAgICAgfQogCi0gICAgcHVibGljIHN0YXRpYyBFbGVtZW50IEFUVFJJQl9OT1JNQUxfMyhSZW5kZXJTY3JpcHQgcnMpIHsKLSAgICAgICAgaWYocnMubUVsZW1lbnRfTk9STUFMXzMgPT0gbnVsbCkgewotICAgICAgICAgICAgcnMubUVsZW1lbnRfTk9STUFMXzMgPSBjcmVhdGVBdHRyaWIocnMsIERhdGFUeXBlLkZMT0FUXzMyLCBEYXRhS2luZC5OT1JNQUwsIDMpOworICAgIHB1YmxpYyBzdGF0aWMgRWxlbWVudCBNQVRSSVhfNFg0KFJlbmRlclNjcmlwdCBycykgeworICAgICAgICBpZihycy5tRWxlbWVudF9NQVRSSVhfNFg0ID09IG51bGwpIHsKKyAgICAgICAgICAgIHJzLm1FbGVtZW50X01BVFJJWF80WDQgPSBjcmVhdGVVc2VyKHJzLCBEYXRhVHlwZS5NQVRSSVhfNFg0KTsKICAgICAgICAgfQotICAgICAgICByZXR1cm4gcnMubUVsZW1lbnRfTk9STUFMXzM7CisgICAgICAgIHJldHVybiBycy5tRWxlbWVudF9NQVRSSVhfNFg0OworICAgIH0KKyAgICBwdWJsaWMgc3RhdGljIEVsZW1lbnQgTUFUUklYNFg0KFJlbmRlclNjcmlwdCBycykgeworICAgICAgICByZXR1cm4gTUFUUklYXzRYNChycyk7CiAgICAgfQogCi0gICAgcHVibGljIHN0YXRpYyBFbGVtZW50IEFUVFJJQl9DT0xPUl9VOF80KFJlbmRlclNjcmlwdCBycykgewotICAgICAgICBpZihycy5tRWxlbWVudF9DT0xPUl9VOF80ID09IG51bGwpIHsKLSAgICAgICAgICAgIHJzLm1FbGVtZW50X0NPTE9SX1U4XzQgPSBjcmVhdGVBdHRyaWIocnMsIERhdGFUeXBlLlVOU0lHTkVEXzgsIERhdGFLaW5kLkNPTE9SLCA0KTsKKyAgICBwdWJsaWMgc3RhdGljIEVsZW1lbnQgTUFUUklYXzNYMyhSZW5kZXJTY3JpcHQgcnMpIHsKKyAgICAgICAgaWYocnMubUVsZW1lbnRfTUFUUklYXzNYMyA9PSBudWxsKSB7CisgICAgICAgICAgICBycy5tRWxlbWVudF9NQVRSSVhfM1gzID0gY3JlYXRlVXNlcihycywgRGF0YVR5cGUuTUFUUklYXzNYMyk7CiAgICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJzLm1FbGVtZW50X0NPTE9SX1U4XzQ7CisgICAgICAgIHJldHVybiBycy5tRWxlbWVudF9NQVRSSVhfNFg0OwogICAgIH0KIAotICAgIHB1YmxpYyBzdGF0aWMgRWxlbWVudCBBVFRSSUJfQ09MT1JfRjMyXzQoUmVuZGVyU2NyaXB0IHJzKSB7Ci0gICAgICAgIGlmKHJzLm1FbGVtZW50X0NPTE9SX0YzMl80ID09IG51bGwpIHsKLSAgICAgICAgICAgIHJzLm1FbGVtZW50X0NPTE9SX0YzMl80ID0gY3JlYXRlQXR0cmliKHJzLCBEYXRhVHlwZS5GTE9BVF8zMiwgRGF0YUtpbmQuQ09MT1IsIDQpOworICAgIHB1YmxpYyBzdGF0aWMgRWxlbWVudCBNQVRSSVhfMlgyKFJlbmRlclNjcmlwdCBycykgeworICAgICAgICBpZihycy5tRWxlbWVudF9NQVRSSVhfMlgyID09IG51bGwpIHsKKyAgICAgICAgICAgIHJzLm1FbGVtZW50X01BVFJJWF8yWDIgPSBjcmVhdGVVc2VyKHJzLCBEYXRhVHlwZS5NQVRSSVhfMlgyKTsKICAgICAgICAgfQotICAgICAgICByZXR1cm4gcnMubUVsZW1lbnRfQ09MT1JfRjMyXzQ7CisgICAgICAgIHJldHVybiBycy5tRWxlbWVudF9NQVRSSVhfMlgyOwogICAgIH0KIAotICAgIEVsZW1lbnQoUmVuZGVyU2NyaXB0IHJzLCBFbGVtZW50W10gZSwgU3RyaW5nW10gbikgewotICAgICAgICBzdXBlcihycyk7CisgICAgRWxlbWVudChpbnQgaWQsIFJlbmRlclNjcmlwdCBycywgRWxlbWVudFtdIGUsIFN0cmluZ1tdIG4sIGludFtdIGFzKSB7CisgICAgICAgIHN1cGVyKGlkLCBycyk7CiAgICAgICAgIG1TaXplID0gMDsKICAgICAgICAgbUVsZW1lbnRzID0gZTsKICAgICAgICAgbUVsZW1lbnROYW1lcyA9IG47Ci0gICAgICAgIGludFtdIGlkcyA9IG5ldyBpbnRbbUVsZW1lbnRzLmxlbmd0aF07CisgICAgICAgIG1BcnJheVNpemVzID0gYXM7CiAgICAgICAgIGZvciAoaW50IGN0ID0gMDsgY3QgPCBtRWxlbWVudHMubGVuZ3RoOyBjdCsrICkgewogICAgICAgICAgICAgbVNpemUgKz0gbUVsZW1lbnRzW2N0XS5tU2l6ZTsKLSAgICAgICAgICAgIGlkc1tjdF0gPSBtRWxlbWVudHNbY3RdLm1JRDsKICAgICAgICAgfQotICAgICAgICBtSUQgPSBycy5uRWxlbWVudENyZWF0ZTIoaWRzLCBtRWxlbWVudE5hbWVzKTsKICAgICB9CiAKLSAgICBFbGVtZW50KFJlbmRlclNjcmlwdCBycywgRGF0YVR5cGUgZHQsIERhdGFLaW5kIGRrLCBib29sZWFuIG5vcm0sIGludCBzaXplKSB7Ci0gICAgICAgIHN1cGVyKHJzKTsKKyAgICBFbGVtZW50KGludCBpZCwgUmVuZGVyU2NyaXB0IHJzLCBEYXRhVHlwZSBkdCwgRGF0YUtpbmQgZGssIGJvb2xlYW4gbm9ybSwgaW50IHNpemUpIHsKKyAgICAgICAgc3VwZXIoaWQsIHJzKTsKICAgICAgICAgbVNpemUgPSBkdC5tU2l6ZSAqIHNpemU7CiAgICAgICAgIG1UeXBlID0gZHQ7CiAgICAgICAgIG1LaW5kID0gZGs7CiAgICAgICAgIG1Ob3JtYWxpemVkID0gbm9ybTsKICAgICAgICAgbVZlY3RvclNpemUgPSBzaXplOwotICAgICAgICBtSUQgPSBycy5uRWxlbWVudENyZWF0ZShkdC5tSUQsIGRrLm1JRCwgbm9ybSwgc2l6ZSk7CisgICAgfQorCisgICAgRWxlbWVudChpbnQgaWQsIFJlbmRlclNjcmlwdCBycykgeworICAgICAgICBzdXBlcihpZCwgcnMpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHZvaWQgdXBkYXRlRnJvbU5hdGl2ZSgpIHsKKworICAgICAgICAvLyB3ZSB3aWxsIHBhY2sgbVR5cGU7IG1LaW5kOyBtTm9ybWFsaXplZDsgbVZlY3RvclNpemU7IE51bVN1YkVsZW1lbnRzCisgICAgICAgIGludFtdIGRhdGFCdWZmZXIgPSBuZXcgaW50WzVdOworICAgICAgICBtUlMubkVsZW1lbnRHZXROYXRpdmVEYXRhKG1JRCwgZGF0YUJ1ZmZlcik7CisKKyAgICAgICAgbU5vcm1hbGl6ZWQgPSBkYXRhQnVmZmVyWzJdID09IDEgPyB0cnVlIDogZmFsc2U7CisgICAgICAgIG1WZWN0b3JTaXplID0gZGF0YUJ1ZmZlclszXTsKKyAgICAgICAgbVNpemUgPSAwOworICAgICAgICBmb3IgKERhdGFUeXBlIGR0OiBEYXRhVHlwZS52YWx1ZXMoKSkgeworICAgICAgICAgICAgaWYoZHQubUlEID09IGRhdGFCdWZmZXJbMF0peworICAgICAgICAgICAgICAgIG1UeXBlID0gZHQ7CisgICAgICAgICAgICAgICAgbVNpemUgPSBtVHlwZS5tU2l6ZSAqIG1WZWN0b3JTaXplOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGZvciAoRGF0YUtpbmQgZGs6IERhdGFLaW5kLnZhbHVlcygpKSB7CisgICAgICAgICAgICBpZihkay5tSUQgPT0gZGF0YUJ1ZmZlclsxXSl7CisgICAgICAgICAgICAgICAgbUtpbmQgPSBkazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGludCBudW1TdWJFbGVtZW50cyA9IGRhdGFCdWZmZXJbNF07CisgICAgICAgIGlmKG51bVN1YkVsZW1lbnRzID4gMCkgeworICAgICAgICAgICAgbUVsZW1lbnRzID0gbmV3IEVsZW1lbnRbbnVtU3ViRWxlbWVudHNdOworICAgICAgICAgICAgbUVsZW1lbnROYW1lcyA9IG5ldyBTdHJpbmdbbnVtU3ViRWxlbWVudHNdOworCisgICAgICAgICAgICBpbnRbXSBzdWJFbGVtZW50SWRzID0gbmV3IGludFtudW1TdWJFbGVtZW50c107CisgICAgICAgICAgICBtUlMubkVsZW1lbnRHZXRTdWJFbGVtZW50cyhtSUQsIHN1YkVsZW1lbnRJZHMsIG1FbGVtZW50TmFtZXMpOworICAgICAgICAgICAgZm9yKGludCBpID0gMDsgaSA8IG51bVN1YkVsZW1lbnRzOyBpICsrKSB7CisgICAgICAgICAgICAgICAgbUVsZW1lbnRzW2ldID0gbmV3IEVsZW1lbnQoc3ViRWxlbWVudElkc1tpXSwgbVJTKTsKKyAgICAgICAgICAgICAgICBtRWxlbWVudHNbaV0udXBkYXRlRnJvbU5hdGl2ZSgpOworICAgICAgICAgICAgICAgIG1TaXplICs9IG1FbGVtZW50c1tpXS5tU2l6ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCiAgICAgfQogCiAgICAgcHVibGljIHZvaWQgZGVzdHJveSgpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gewogICAgICAgICBzdXBlci5kZXN0cm95KCk7CiAgICAgfQogCi0gICAgcHVibGljIHN0YXRpYyBFbGVtZW50IGNyZWF0ZUZyb21DbGFzcyhSZW5kZXJTY3JpcHQgcnMsIENsYXNzIGMpIHsKLSAgICAgICAgcnMudmFsaWRhdGUoKTsKLSAgICAgICAgRmllbGRbXSBmaWVsZHMgPSBjLmdldEZpZWxkcygpOwotICAgICAgICBCdWlsZGVyIGIgPSBuZXcgQnVpbGRlcihycyk7Ci0KLSAgICAgICAgZm9yKEZpZWxkIGY6IGZpZWxkcykgewotICAgICAgICAgICAgQ2xhc3MgZmMgPSBmLmdldFR5cGUoKTsKLSAgICAgICAgICAgIGlmKGZjID09IGludC5jbGFzcykgewotICAgICAgICAgICAgICAgIGIuYWRkKGNyZWF0ZVVzZXIocnMsIERhdGFUeXBlLlNJR05FRF8zMiksIGYuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZihmYyA9PSBzaG9ydC5jbGFzcykgewotICAgICAgICAgICAgICAgIGIuYWRkKGNyZWF0ZVVzZXIocnMsIERhdGFUeXBlLlNJR05FRF8xNiksIGYuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZihmYyA9PSBieXRlLmNsYXNzKSB7Ci0gICAgICAgICAgICAgICAgYi5hZGQoY3JlYXRlVXNlcihycywgRGF0YVR5cGUuU0lHTkVEXzgpLCBmLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYoZmMgPT0gZmxvYXQuY2xhc3MpIHsKLSAgICAgICAgICAgICAgICBiLmFkZChjcmVhdGVVc2VyKHJzLCBEYXRhVHlwZS5GTE9BVF8zMiksIGYuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVW5rb3duIGZpZWxkIHR5cGUiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gYi5jcmVhdGUoKTsKLSAgICB9Ci0KLQogICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAgICAgcHVibGljIHN0YXRpYyBFbGVtZW50IGNyZWF0ZVVzZXIoUmVuZGVyU2NyaXB0IHJzLCBEYXRhVHlwZSBkdCkgewotICAgICAgICByZXR1cm4gbmV3IEVsZW1lbnQocnMsIGR0LCBEYXRhS2luZC5VU0VSLCBmYWxzZSwgMSk7CisgICAgICAgIERhdGFLaW5kIGRrID0gRGF0YUtpbmQuVVNFUjsKKyAgICAgICAgYm9vbGVhbiBub3JtID0gZmFsc2U7CisgICAgICAgIGludCB2ZWNTaXplID0gMTsKKyAgICAgICAgaW50IGlkID0gcnMubkVsZW1lbnRDcmVhdGUoZHQubUlELCBkay5tSUQsIG5vcm0sIHZlY1NpemUpOworICAgICAgICByZXR1cm4gbmV3IEVsZW1lbnQoaWQsIHJzLCBkdCwgZGssIG5vcm0sIHZlY1NpemUpOwogICAgIH0KIAogICAgIHB1YmxpYyBzdGF0aWMgRWxlbWVudCBjcmVhdGVWZWN0b3IoUmVuZGVyU2NyaXB0IHJzLCBEYXRhVHlwZSBkdCwgaW50IHNpemUpIHsKICAgICAgICAgaWYgKHNpemUgPCAyIHx8IHNpemUgPiA0KSB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJCYWQgc2l6ZSIpOwogICAgICAgICB9Ci0gICAgICAgIHJldHVybiBuZXcgRWxlbWVudChycywgZHQsIERhdGFLaW5kLlVTRVIsIGZhbHNlLCBzaXplKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIEVsZW1lbnQgY3JlYXRlSW5kZXgoUmVuZGVyU2NyaXB0IHJzKSB7Ci0gICAgICAgIHJldHVybiBuZXcgRWxlbWVudChycywgRGF0YVR5cGUuVU5TSUdORURfMTYsIERhdGFLaW5kLklOREVYLCBmYWxzZSwgMSk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBFbGVtZW50IGNyZWF0ZUF0dHJpYihSZW5kZXJTY3JpcHQgcnMsIERhdGFUeXBlIGR0LCBEYXRhS2luZCBkaywgaW50IHNpemUpIHsKLSAgICAgICAgaWYgKCEoZHQgPT0gRGF0YVR5cGUuRkxPQVRfMzIgfHwKLSAgICAgICAgICAgICAgZHQgPT0gRGF0YVR5cGUuVU5TSUdORURfOCB8fAotICAgICAgICAgICAgICBkdCA9PSBEYXRhVHlwZS5VTlNJR05FRF8xNiB8fAotICAgICAgICAgICAgICBkdCA9PSBEYXRhVHlwZS5VTlNJR05FRF8zMiB8fAotICAgICAgICAgICAgICBkdCA9PSBEYXRhVHlwZS5TSUdORURfOCB8fAotICAgICAgICAgICAgICBkdCA9PSBEYXRhVHlwZS5TSUdORURfMTYgfHwKLSAgICAgICAgICAgICAgZHQgPT0gRGF0YVR5cGUuU0lHTkVEXzMyKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVW5zdXBwb3J0ZWQgRGF0YVR5cGUiKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICghKGRrID09IERhdGFLaW5kLkNPTE9SIHx8Ci0gICAgICAgICAgICAgIGRrID09IERhdGFLaW5kLlBPU0lUSU9OIHx8Ci0gICAgICAgICAgICAgIGRrID09IERhdGFLaW5kLlRFWFRVUkUgfHwKLSAgICAgICAgICAgICAgZGsgPT0gRGF0YUtpbmQuTk9STUFMIHx8Ci0gICAgICAgICAgICAgIGRrID09IERhdGFLaW5kLlBPSU5UX1NJWkUgfHwKLSAgICAgICAgICAgICAgZGsgPT0gRGF0YUtpbmQuVVNFUikpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlVuc3VwcG9ydGVkIERhdGFLaW5kIik7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoZGsgPT0gRGF0YUtpbmQuQ09MT1IgJiYKLSAgICAgICAgICAgICgoZHQgIT0gRGF0YVR5cGUuRkxPQVRfMzIgJiYgZHQgIT0gRGF0YVR5cGUuVU5TSUdORURfOCkgfHwKLSAgICAgICAgICAgICBzaXplIDwgMyB8fCBzaXplID4gNCkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkJhZCBjb21ibyIpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChkayA9PSBEYXRhS2luZC5QT1NJVElPTiAmJiAoc2l6ZSA8IDEgfHwgc2l6ZSA+IDQpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJCYWQgY29tYm8iKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoZGsgPT0gRGF0YUtpbmQuVEVYVFVSRSAmJgotICAgICAgICAgICAgKGR0ICE9IERhdGFUeXBlLkZMT0FUXzMyIHx8IHNpemUgPCAxIHx8IHNpemUgPiA0KSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiQmFkIGNvbWJvIik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGRrID09IERhdGFLaW5kLk5PUk1BTCAmJgotICAgICAgICAgICAgKGR0ICE9IERhdGFUeXBlLkZMT0FUXzMyIHx8IHNpemUgIT0gMykpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkJhZCBjb21ibyIpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChkayA9PSBEYXRhS2luZC5QT0lOVF9TSVpFICYmCi0gICAgICAgICAgICAoZHQgIT0gRGF0YVR5cGUuRkxPQVRfMzIgfHwgc2l6ZSAhPSAxKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiQmFkIGNvbWJvIik7Ci0gICAgICAgIH0KLQorICAgICAgICBEYXRhS2luZCBkayA9IERhdGFLaW5kLlVTRVI7CiAgICAgICAgIGJvb2xlYW4gbm9ybSA9IGZhbHNlOwotICAgICAgICBpZiAoZGsgPT0gRGF0YUtpbmQuQ09MT1IgJiYgZHQgPT0gRGF0YVR5cGUuVU5TSUdORURfOCkgewotICAgICAgICAgICAgbm9ybSA9IHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gbmV3IEVsZW1lbnQocnMsIGR0LCBkaywgbm9ybSwgc2l6ZSk7CisgICAgICAgIGludCBpZCA9IHJzLm5FbGVtZW50Q3JlYXRlKGR0Lm1JRCwgZGsubUlELCBub3JtLCBzaXplKTsKKyAgICAgICAgcmV0dXJuIG5ldyBFbGVtZW50KGlkLCBycywgZHQsIGRrLCBub3JtLCBzaXplKTsKICAgICB9CiAKICAgICBwdWJsaWMgc3RhdGljIEVsZW1lbnQgY3JlYXRlUGl4ZWwoUmVuZGVyU2NyaXB0IHJzLCBEYXRhVHlwZSBkdCwgRGF0YUtpbmQgZGspIHsKQEAgLTM2NywxMyArNDM0LDE2IEBACiAgICAgICAgICAgICBzaXplID0gNDsKICAgICAgICAgfQogCi0gICAgICAgIHJldHVybiBuZXcgRWxlbWVudChycywgZHQsIGRrLCB0cnVlLCBzaXplKTsKKyAgICAgICAgYm9vbGVhbiBub3JtID0gdHJ1ZTsKKyAgICAgICAgaW50IGlkID0gcnMubkVsZW1lbnRDcmVhdGUoZHQubUlELCBkay5tSUQsIG5vcm0sIHNpemUpOworICAgICAgICByZXR1cm4gbmV3IEVsZW1lbnQoaWQsIHJzLCBkdCwgZGssIG5vcm0sIHNpemUpOwogICAgIH0KIAogICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQnVpbGRlciB7CiAgICAgICAgIFJlbmRlclNjcmlwdCBtUlM7CiAgICAgICAgIEVsZW1lbnRbXSBtRWxlbWVudHM7CiAgICAgICAgIFN0cmluZ1tdIG1FbGVtZW50TmFtZXM7CisgICAgICAgIGludFtdIG1BcnJheVNpemVzOwogICAgICAgICBpbnQgbUNvdW50OwogCiAgICAgICAgIHB1YmxpYyBCdWlsZGVyKFJlbmRlclNjcmlwdCBycykgewpAQCAtMzgxLDI5ICs0NTEsNDkgQEAKICAgICAgICAgICAgIG1Db3VudCA9IDA7CiAgICAgICAgICAgICBtRWxlbWVudHMgPSBuZXcgRWxlbWVudFs4XTsKICAgICAgICAgICAgIG1FbGVtZW50TmFtZXMgPSBuZXcgU3RyaW5nWzhdOworICAgICAgICAgICAgbUFycmF5U2l6ZXMgPSBuZXcgaW50WzhdOwogICAgICAgICB9CiAKLSAgICAgICAgcHVibGljIHZvaWQgYWRkKEVsZW1lbnQgZWxlbWVudCwgU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgcHVibGljIHZvaWQgYWRkKEVsZW1lbnQgZWxlbWVudCwgU3RyaW5nIG5hbWUsIGludCBhcnJheVNpemUpIHsKKyAgICAgICAgICAgIGlmIChhcnJheVNpemUgPCAxKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiQXJyYXkgc2l6ZSBjYW5ub3QgYmUgbGVzcyB0aGFuIDEuIik7CisgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZihtQ291bnQgPT0gbUVsZW1lbnRzLmxlbmd0aCkgewogICAgICAgICAgICAgICAgIEVsZW1lbnRbXSBlID0gbmV3IEVsZW1lbnRbbUNvdW50ICsgOF07CiAgICAgICAgICAgICAgICAgU3RyaW5nW10gcyA9IG5ldyBTdHJpbmdbbUNvdW50ICsgOF07CisgICAgICAgICAgICAgICAgaW50W10gYXMgPSBuZXcgaW50W21Db3VudCArIDhdOwogICAgICAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkobUVsZW1lbnRzLCAwLCBlLCAwLCBtQ291bnQpOwogICAgICAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkobUVsZW1lbnROYW1lcywgMCwgcywgMCwgbUNvdW50KTsKKyAgICAgICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KG1BcnJheVNpemVzLCAwLCBhcywgMCwgbUNvdW50KTsKICAgICAgICAgICAgICAgICBtRWxlbWVudHMgPSBlOwogICAgICAgICAgICAgICAgIG1FbGVtZW50TmFtZXMgPSBzOworICAgICAgICAgICAgICAgIG1BcnJheVNpemVzID0gYXM7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBtRWxlbWVudHNbbUNvdW50XSA9IGVsZW1lbnQ7CiAgICAgICAgICAgICBtRWxlbWVudE5hbWVzW21Db3VudF0gPSBuYW1lOworICAgICAgICAgICAgbUFycmF5U2l6ZXNbbUNvdW50XSA9IGFycmF5U2l6ZTsKICAgICAgICAgICAgIG1Db3VudCsrOwogICAgICAgICB9CiAKKyAgICAgICAgcHVibGljIHZvaWQgYWRkKEVsZW1lbnQgZWxlbWVudCwgU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgICAgIGFkZChlbGVtZW50LCBuYW1lLCAxKTsKKyAgICAgICAgfQorCiAgICAgICAgIHB1YmxpYyBFbGVtZW50IGNyZWF0ZSgpIHsKICAgICAgICAgICAgIG1SUy52YWxpZGF0ZSgpOwogICAgICAgICAgICAgRWxlbWVudFtdIGVpbiA9IG5ldyBFbGVtZW50W21Db3VudF07CiAgICAgICAgICAgICBTdHJpbmdbXSBzaW4gPSBuZXcgU3RyaW5nW21Db3VudF07CisgICAgICAgICAgICBpbnRbXSBhc2luID0gbmV3IGludFttQ291bnRdOwogICAgICAgICAgICAgamF2YS5sYW5nLlN5c3RlbS5hcnJheWNvcHkobUVsZW1lbnRzLCAwLCBlaW4sIDAsIG1Db3VudCk7CiAgICAgICAgICAgICBqYXZhLmxhbmcuU3lzdGVtLmFycmF5Y29weShtRWxlbWVudE5hbWVzLCAwLCBzaW4sIDAsIG1Db3VudCk7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IEVsZW1lbnQobVJTLCBlaW4sIHNpbik7CisgICAgICAgICAgICBqYXZhLmxhbmcuU3lzdGVtLmFycmF5Y29weShtQXJyYXlTaXplcywgMCwgYXNpbiwgMCwgbUNvdW50KTsKKworICAgICAgICAgICAgaW50W10gaWRzID0gbmV3IGludFtlaW4ubGVuZ3RoXTsKKyAgICAgICAgICAgIGZvciAoaW50IGN0ID0gMDsgY3QgPCBlaW4ubGVuZ3RoOyBjdCsrICkgeworICAgICAgICAgICAgICAgIGlkc1tjdF0gPSBlaW5bY3RdLm1JRDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGludCBpZCA9IG1SUy5uRWxlbWVudENyZWF0ZTIoaWRzLCBzaW4sIGFzaW4pOworICAgICAgICAgICAgcmV0dXJuIG5ldyBFbGVtZW50KGlkLCBtUlMsIGVpbiwgc2luLCBhc2luKTsKICAgICAgICAgfQogICAgIH0KIApkaWZmIC0tZ2l0IGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9GaWVsZFBhY2tlci5qYXZhIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9GaWVsZFBhY2tlci5qYXZhCmluZGV4IGIyNmU0N2QuLmI2Zjg4YmUgMTAwNjQ0Ci0tLSBhL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvRmllbGRQYWNrZXIuamF2YQorKysgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L0ZpZWxkUGFja2VyLmphdmEKQEAgLTMzLDIxICszMywyOCBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgdm9pZCByZXNldCgpIHsKKyAgICBwdWJsaWMgdm9pZCByZXNldCgpIHsKICAgICAgICAgbVBvcyA9IDA7CiAgICAgfQorICAgIHB1YmxpYyB2b2lkIHJlc2V0KGludCBpKSB7CisgICAgICAgIG1Qb3MgPSBpOworICAgIH0KIAotICAgIHZvaWQgYWRkSTgoYnl0ZSB2KSB7CisgICAgcHVibGljIHZvaWQgc2tpcChpbnQgaSkgeworICAgICAgICBtUG9zICs9IGk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgYWRkSTgoYnl0ZSB2KSB7CiAgICAgICAgIG1EYXRhW21Qb3MrK10gPSB2OwogICAgIH0KIAotICAgIHZvaWQgYWRkSTE2KHNob3J0IHYpIHsKKyAgICBwdWJsaWMgdm9pZCBhZGRJMTYoc2hvcnQgdikgewogICAgICAgICBhbGlnbigyKTsKICAgICAgICAgbURhdGFbbVBvcysrXSA9IChieXRlKSh2ICYgMHhmZik7CiAgICAgICAgIG1EYXRhW21Qb3MrK10gPSAoYnl0ZSkodiA+PiA4KTsKICAgICB9CiAKLSAgICB2b2lkIGFkZEkzMihpbnQgdikgeworICAgIHB1YmxpYyB2b2lkIGFkZEkzMihpbnQgdikgewogICAgICAgICBhbGlnbig0KTsKICAgICAgICAgbURhdGFbbVBvcysrXSA9IChieXRlKSh2ICYgMHhmZik7CiAgICAgICAgIG1EYXRhW21Qb3MrK10gPSAoYnl0ZSkoKHYgPj4gOCkgJiAweGZmKTsKQEAgLTU1LDcgKzYyLDcgQEAKICAgICAgICAgbURhdGFbbVBvcysrXSA9IChieXRlKSgodiA+PiAyNCkgJiAweGZmKTsKICAgICB9CiAKLSAgICB2b2lkIGFkZEk2NChsb25nIHYpIHsKKyAgICBwdWJsaWMgdm9pZCBhZGRJNjQobG9uZyB2KSB7CiAgICAgICAgIGFsaWduKDgpOwogICAgICAgICBtRGF0YVttUG9zKytdID0gKGJ5dGUpKHYgJiAweGZmKTsKICAgICAgICAgbURhdGFbbVBvcysrXSA9IChieXRlKSgodiA+PiA4KSAmIDB4ZmYpOwpAQCAtNjcsMTUgKzc0LDE3IEBACiAgICAgICAgIG1EYXRhW21Qb3MrK10gPSAoYnl0ZSkoKHYgPj4gNTYpICYgMHhmZik7CiAgICAgfQogCi0gICAgdm9pZCBhZGRVOChzaG9ydCB2KSB7CisgICAgcHVibGljIHZvaWQgYWRkVTgoc2hvcnQgdikgewogICAgICAgICBpZiAoKHYgPCAwKSB8fCAodiA+IDB4ZmYpKSB7CisgICAgICAgICAgICBhbmRyb2lkLnV0aWwuTG9nLmUoInJzIiwgIkZpZWxkUGFja2VyLmFkZFU4KCAiICsgdiArICIgKSIpOwogICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiU2F2aW5nIHZhbHVlIG91dCBvZiByYW5nZSBmb3IgdHlwZSIpOwogICAgICAgICB9CiAgICAgICAgIG1EYXRhW21Qb3MrK10gPSAoYnl0ZSl2OwogICAgIH0KIAotICAgIHZvaWQgYWRkVTE2KGludCB2KSB7CisgICAgcHVibGljIHZvaWQgYWRkVTE2KGludCB2KSB7CiAgICAgICAgIGlmICgodiA8IDApIHx8ICh2ID4gMHhmZmZmKSkgeworICAgICAgICAgICAgYW5kcm9pZC51dGlsLkxvZy5lKCJycyIsICJGaWVsZFBhY2tlci5hZGRVMTYoICIgKyB2ICsgIiApIik7CiAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJTYXZpbmcgdmFsdWUgb3V0IG9mIHJhbmdlIGZvciB0eXBlIik7CiAgICAgICAgIH0KICAgICAgICAgYWxpZ24oMik7CkBAIC04Myw4ICs5Miw5IEBACiAgICAgICAgIG1EYXRhW21Qb3MrK10gPSAoYnl0ZSkodiA+PiA4KTsKICAgICB9CiAKLSAgICB2b2lkIGFkZFUzMihsb25nIHYpIHsKLSAgICAgICAgaWYgKCh2IDwgMCkgfHwgKHYgPiAweGZmZmZmZmZmKSkgeworICAgIHB1YmxpYyB2b2lkIGFkZFUzMihsb25nIHYpIHsKKyAgICAgICAgaWYgKCh2IDwgMCkgfHwgKHYgPiAweGZmZmZmZmZmTCkpIHsKKyAgICAgICAgICAgIGFuZHJvaWQudXRpbC5Mb2cuZSgicnMiLCAiRmllbGRQYWNrZXIuYWRkVTMyKCAiICsgdiArICIgKSIpOwogICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiU2F2aW5nIHZhbHVlIG91dCBvZiByYW5nZSBmb3IgdHlwZSIpOwogICAgICAgICB9CiAgICAgICAgIGFsaWduKDQpOwpAQCAtOTQsOCArMTA0LDkgQEAKICAgICAgICAgbURhdGFbbVBvcysrXSA9IChieXRlKSgodiA+PiAyNCkgJiAweGZmKTsKICAgICB9CiAKLSAgICB2b2lkIGFkZFU2NChsb25nIHYpIHsKKyAgICBwdWJsaWMgdm9pZCBhZGRVNjQobG9uZyB2KSB7CiAgICAgICAgIGlmICh2IDwgMCkgeworICAgICAgICAgICAgYW5kcm9pZC51dGlsLkxvZy5lKCJycyIsICJGaWVsZFBhY2tlci5hZGRVNjQoICIgKyB2ICsgIiApIik7CiAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJTYXZpbmcgdmFsdWUgb3V0IG9mIHJhbmdlIGZvciB0eXBlIik7CiAgICAgICAgIH0KICAgICAgICAgYWxpZ24oOCk7CkBAIC0xMDksMTUgKzEyMCwxNTcgQEAKICAgICAgICAgbURhdGFbbVBvcysrXSA9IChieXRlKSgodiA+PiA1NikgJiAweGZmKTsKICAgICB9CiAKLSAgICB2b2lkIGFkZEYzMihmbG9hdCB2KSB7CisgICAgcHVibGljIHZvaWQgYWRkRjMyKGZsb2F0IHYpIHsKICAgICAgICAgYWRkSTMyKEZsb2F0LmZsb2F0VG9SYXdJbnRCaXRzKHYpKTsKICAgICB9CiAKLSAgICB2b2lkIGFkZEY2NChmbG9hdCB2KSB7CisgICAgcHVibGljIHZvaWQgYWRkRjY0KGZsb2F0IHYpIHsKICAgICAgICAgYWRkSTY0KERvdWJsZS5kb3VibGVUb1Jhd0xvbmdCaXRzKHYpKTsKICAgICB9CiAKLSAgICBmaW5hbCBieXRlW10gZ2V0RGF0YSgpIHsKKyAgICBwdWJsaWMgdm9pZCBhZGRPYmooQmFzZU9iaiBvYmopIHsKKyAgICAgICAgaWYgKG9iaiAhPSBudWxsKSB7CisgICAgICAgICAgICBhZGRJMzIob2JqLmdldElEKCkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYWRkSTMyKDApOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgYWRkRjMyKEZsb2F0MiB2KSB7CisgICAgICAgIGFkZEYzMih2LngpOworICAgICAgICBhZGRGMzIodi55KTsKKyAgICB9CisgICAgcHVibGljIHZvaWQgYWRkRjMyKEZsb2F0MyB2KSB7CisgICAgICAgIGFkZEYzMih2LngpOworICAgICAgICBhZGRGMzIodi55KTsKKyAgICAgICAgYWRkRjMyKHYueik7CisgICAgfQorICAgIHB1YmxpYyB2b2lkIGFkZEYzMihGbG9hdDQgdikgeworICAgICAgICBhZGRGMzIodi54KTsKKyAgICAgICAgYWRkRjMyKHYueSk7CisgICAgICAgIGFkZEYzMih2LnopOworICAgICAgICBhZGRGMzIodi53KTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBhZGRJOChCeXRlMiB2KSB7CisgICAgICAgIGFkZEk4KHYueCk7CisgICAgICAgIGFkZEk4KHYueSk7CisgICAgfQorICAgIHB1YmxpYyB2b2lkIGFkZEk4KEJ5dGUzIHYpIHsKKyAgICAgICAgYWRkSTgodi54KTsKKyAgICAgICAgYWRkSTgodi55KTsKKyAgICAgICAgYWRkSTgodi56KTsKKyAgICB9CisgICAgcHVibGljIHZvaWQgYWRkSTgoQnl0ZTQgdikgeworICAgICAgICBhZGRJOCh2LngpOworICAgICAgICBhZGRJOCh2LnkpOworICAgICAgICBhZGRJOCh2LnopOworICAgICAgICBhZGRJOCh2LncpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGFkZFU4KFNob3J0MiB2KSB7CisgICAgICAgIGFkZFU4KHYueCk7CisgICAgICAgIGFkZFU4KHYueSk7CisgICAgfQorICAgIHB1YmxpYyB2b2lkIGFkZFU4KFNob3J0MyB2KSB7CisgICAgICAgIGFkZFU4KHYueCk7CisgICAgICAgIGFkZFU4KHYueSk7CisgICAgICAgIGFkZFU4KHYueik7CisgICAgfQorICAgIHB1YmxpYyB2b2lkIGFkZFU4KFNob3J0NCB2KSB7CisgICAgICAgIGFkZFU4KHYueCk7CisgICAgICAgIGFkZFU4KHYueSk7CisgICAgICAgIGFkZFU4KHYueik7CisgICAgICAgIGFkZFU4KHYudyk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgYWRkSTE2KFNob3J0MiB2KSB7CisgICAgICAgIGFkZEkxNih2LngpOworICAgICAgICBhZGRJMTYodi55KTsKKyAgICB9CisgICAgcHVibGljIHZvaWQgYWRkSTE2KFNob3J0MyB2KSB7CisgICAgICAgIGFkZEkxNih2LngpOworICAgICAgICBhZGRJMTYodi55KTsKKyAgICAgICAgYWRkSTE2KHYueik7CisgICAgfQorICAgIHB1YmxpYyB2b2lkIGFkZEkxNihTaG9ydDQgdikgeworICAgICAgICBhZGRJMTYodi54KTsKKyAgICAgICAgYWRkSTE2KHYueSk7CisgICAgICAgIGFkZEkxNih2LnopOworICAgICAgICBhZGRJMTYodi53KTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBhZGRVMTYoSW50MiB2KSB7CisgICAgICAgIGFkZFUxNih2LngpOworICAgICAgICBhZGRVMTYodi55KTsKKyAgICB9CisgICAgcHVibGljIHZvaWQgYWRkVTE2KEludDMgdikgeworICAgICAgICBhZGRVMTYodi54KTsKKyAgICAgICAgYWRkVTE2KHYueSk7CisgICAgICAgIGFkZFUxNih2LnopOworICAgIH0KKyAgICBwdWJsaWMgdm9pZCBhZGRVMTYoSW50NCB2KSB7CisgICAgICAgIGFkZFUxNih2LngpOworICAgICAgICBhZGRVMTYodi55KTsKKyAgICAgICAgYWRkVTE2KHYueik7CisgICAgICAgIGFkZFUxNih2LncpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGFkZEkzMihJbnQyIHYpIHsKKyAgICAgICAgYWRkSTMyKHYueCk7CisgICAgICAgIGFkZEkzMih2LnkpOworICAgIH0KKyAgICBwdWJsaWMgdm9pZCBhZGRJMzIoSW50MyB2KSB7CisgICAgICAgIGFkZEkzMih2LngpOworICAgICAgICBhZGRJMzIodi55KTsKKyAgICAgICAgYWRkSTMyKHYueik7CisgICAgfQorICAgIHB1YmxpYyB2b2lkIGFkZEkzMihJbnQ0IHYpIHsKKyAgICAgICAgYWRkSTMyKHYueCk7CisgICAgICAgIGFkZEkzMih2LnkpOworICAgICAgICBhZGRJMzIodi56KTsKKyAgICAgICAgYWRkSTMyKHYudyk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgYWRkVTMyKEludDIgdikgeworICAgICAgICBhZGRVMzIodi54KTsKKyAgICAgICAgYWRkVTMyKHYueSk7CisgICAgfQorICAgIHB1YmxpYyB2b2lkIGFkZFUzMihJbnQzIHYpIHsKKyAgICAgICAgYWRkVTMyKHYueCk7CisgICAgICAgIGFkZFUzMih2LnkpOworICAgICAgICBhZGRVMzIodi56KTsKKyAgICB9CisgICAgcHVibGljIHZvaWQgYWRkVTMyKEludDQgdikgeworICAgICAgICBhZGRVMzIodi54KTsKKyAgICAgICAgYWRkVTMyKHYueSk7CisgICAgICAgIGFkZFUzMih2LnopOworICAgICAgICBhZGRVMzIodi53KTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBhZGRPYmooTWF0cml4NGYgdikgeworICAgICAgICBmb3IgKGludCBpPTA7IGkgPCB2Lm1NYXQubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIGFkZEYzMih2Lm1NYXRbaV0pOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgYWRkT2JqKE1hdHJpeDNmIHYpIHsKKyAgICAgICAgZm9yIChpbnQgaT0wOyBpIDwgdi5tTWF0Lmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBhZGRGMzIodi5tTWF0W2ldKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGFkZE9iaihNYXRyaXgyZiB2KSB7CisgICAgICAgIGZvciAoaW50IGk9MDsgaSA8IHYubU1hdC5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgYWRkRjMyKHYubU1hdFtpXSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBhZGRCb29sZWFuKGJvb2xlYW4gdikgeworICAgICAgICBhZGRJOCgoYnl0ZSkodiA/IDEgOiAwKSk7CisgICAgfQorCisgICAgcHVibGljIGZpbmFsIGJ5dGVbXSBnZXREYXRhKCkgewogICAgICAgICByZXR1cm4gbURhdGE7CiAgICAgfQogCmRpZmYgLS1naXQgYS9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L0ZpbGVBM0QuamF2YSBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvRmlsZUEzRC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI0MTQwNjIKLS0tIC9kZXYvbnVsbAorKysgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L0ZpbGVBM0QuamF2YQpAQCAtMCwwICsxLDIxNyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5yZW5kZXJzY3JpcHQ7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CisKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlJlc291cmNlczsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLkFzc2V0TWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkJpdG1hcDsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkJpdG1hcEZhY3Rvcnk7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuVHlwZWRWYWx1ZTsKKworLyoqCisgKiBAaGlkZQorICoKKyAqKi8KK3B1YmxpYyBjbGFzcyBGaWxlQTNEIGV4dGVuZHMgQmFzZU9iaiB7CisKKyAgICBwdWJsaWMgZW51bSBDbGFzc0lEIHsKKworICAgICAgICBVTktOT1dOLAorICAgICAgICBNRVNILAorICAgICAgICBUWVBFLAorICAgICAgICBFTEVNRU5ULAorICAgICAgICBBTExPQ0FUSU9OLAorICAgICAgICBQUk9HUkFNX1ZFUlRFWCwKKyAgICAgICAgUFJPR1JBTV9SQVNURVIsCisgICAgICAgIFBST0dSQU1fRlJBR01FTlQsCisgICAgICAgIFBST0dSQU1fU1RPUkUsCisgICAgICAgIFNBTVBMRVIsCisgICAgICAgIEFOSU1BVElPTiwKKyAgICAgICAgTElHSFQsCisgICAgICAgIEFEQVBURVJfMUQsCisgICAgICAgIEFEQVBURVJfMkQsCisgICAgICAgIFNDUklQVF9DOworCisgICAgICAgIHB1YmxpYyBzdGF0aWMgQ2xhc3NJRCB0b0NsYXNzSUQoaW50IGludElEKSB7CisgICAgICAgICAgICByZXR1cm4gQ2xhc3NJRC52YWx1ZXMoKVtpbnRJRF07CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBSZWFkIG9ubHkgY2xhc3Mgd2l0aCBpbmRleCBlbnRyaWVzCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBJbmRleEVudHJ5IHsKKyAgICAgICAgUmVuZGVyU2NyaXB0IG1SUzsKKyAgICAgICAgaW50IG1JbmRleDsKKyAgICAgICAgaW50IG1JRDsKKyAgICAgICAgU3RyaW5nIG1OYW1lOworICAgICAgICBDbGFzc0lEIG1DbGFzc0lEOworICAgICAgICBCYXNlT2JqIG1Mb2FkZWRPYmo7CisKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgeworICAgICAgICAgICAgcmV0dXJuIG1OYW1lOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIENsYXNzSUQgZ2V0Q2xhc3NJRCgpIHsKKyAgICAgICAgICAgIHJldHVybiBtQ2xhc3NJRDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBCYXNlT2JqIGdldE9iamVjdCgpIHsKKyAgICAgICAgICAgIG1SUy52YWxpZGF0ZSgpOworICAgICAgICAgICAgQmFzZU9iaiBvYmogPSBpbnRlcm5hbENyZWF0ZShtUlMsIHRoaXMpOworICAgICAgICAgICAgcmV0dXJuIG9iajsKKyAgICAgICAgfQorCisgICAgICAgIHN0YXRpYyBzeW5jaHJvbml6ZWQgQmFzZU9iaiBpbnRlcm5hbENyZWF0ZShSZW5kZXJTY3JpcHQgcnMsIEluZGV4RW50cnkgZW50cnkpIHsKKyAgICAgICAgICAgIGlmKGVudHJ5Lm1Mb2FkZWRPYmogIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHJldHVybiBlbnRyeS5tTG9hZGVkT2JqOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZihlbnRyeS5tQ2xhc3NJRCA9PSBDbGFzc0lELlVOS05PV04pIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaW50IG9iamVjdElEID0gcnMubkZpbGVBM0RHZXRFbnRyeUJ5SW5kZXgoZW50cnkubUlELCBlbnRyeS5tSW5kZXgpOworICAgICAgICAgICAgaWYob2JqZWN0SUQgPT0gMCkgeworICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzd2l0Y2ggKGVudHJ5Lm1DbGFzc0lEKSB7CisgICAgICAgICAgICBjYXNlIE1FU0g6CisgICAgICAgICAgICAgICAgZW50cnkubUxvYWRlZE9iaiA9IG5ldyBNZXNoKG9iamVjdElELCBycyk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFRZUEU6CisgICAgICAgICAgICAgICAgZW50cnkubUxvYWRlZE9iaiA9IG5ldyBUeXBlKG9iamVjdElELCBycyk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEVMRU1FTlQ6CisgICAgICAgICAgICAgICAgZW50cnkubUxvYWRlZE9iaiA9IG51bGw7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEFMTE9DQVRJT046CisgICAgICAgICAgICAgICAgZW50cnkubUxvYWRlZE9iaiA9IG51bGw7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFBST0dSQU1fVkVSVEVYOgorICAgICAgICAgICAgICAgIGVudHJ5Lm1Mb2FkZWRPYmogPSBuZXcgUHJvZ3JhbVZlcnRleChvYmplY3RJRCwgcnMpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBQUk9HUkFNX1JBU1RFUjoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgUFJPR1JBTV9GUkFHTUVOVDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgUFJPR1JBTV9TVE9SRToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgU0FNUExFUjoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQU5JTUFUSU9OOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBMSUdIVDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQURBUFRFUl8xRDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQURBUFRFUl8yRDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgU0NSSVBUX0M6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGVudHJ5Lm1Mb2FkZWRPYmoudXBkYXRlRnJvbU5hdGl2ZSgpOworCisgICAgICAgICAgICByZXR1cm4gZW50cnkubUxvYWRlZE9iajsKKyAgICAgICAgfQorCisgICAgICAgIEluZGV4RW50cnkoUmVuZGVyU2NyaXB0IHJzLCBpbnQgaW5kZXgsIGludCBpZCwgU3RyaW5nIG5hbWUsIENsYXNzSUQgY2xhc3NJRCkgeworICAgICAgICAgICAgbVJTID0gcnM7CisgICAgICAgICAgICBtSW5kZXggPSBpbmRleDsKKyAgICAgICAgICAgIG1JRCA9IGlkOworICAgICAgICAgICAgbU5hbWUgPSBuYW1lOworICAgICAgICAgICAgbUNsYXNzSUQgPSBjbGFzc0lEOworICAgICAgICAgICAgbUxvYWRlZE9iaiA9IG51bGw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBJbmRleEVudHJ5W10gbUZpbGVFbnRyaWVzOworCisgICAgRmlsZUEzRChpbnQgaWQsIFJlbmRlclNjcmlwdCBycykgeworICAgICAgICBzdXBlcihpZCwgcnMpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBpbml0RW50cmllcygpIHsKKyAgICAgICAgaW50IG51bUZpbGVFbnRyaWVzID0gbVJTLm5GaWxlQTNER2V0TnVtSW5kZXhFbnRyaWVzKG1JRCk7CisgICAgICAgIGlmKG51bUZpbGVFbnRyaWVzIDw9IDApIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIG1GaWxlRW50cmllcyA9IG5ldyBJbmRleEVudHJ5W251bUZpbGVFbnRyaWVzXTsKKyAgICAgICAgaW50W10gaWRzID0gbmV3IGludFtudW1GaWxlRW50cmllc107CisgICAgICAgIFN0cmluZ1tdIG5hbWVzID0gbmV3IFN0cmluZ1tudW1GaWxlRW50cmllc107CisKKyAgICAgICAgbVJTLm5GaWxlQTNER2V0SW5kZXhFbnRyaWVzKG1JRCwgbnVtRmlsZUVudHJpZXMsIGlkcywgbmFtZXMpOworCisgICAgICAgIGZvcihpbnQgaSA9IDA7IGkgPCBudW1GaWxlRW50cmllczsgaSArKykgeworICAgICAgICAgICAgbUZpbGVFbnRyaWVzW2ldID0gbmV3IEluZGV4RW50cnkobVJTLCBpLCBtSUQsIG5hbWVzW2ldLCBDbGFzc0lELnRvQ2xhc3NJRChpZHNbaV0pKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBpbnQgZ2V0TnVtSW5kZXhFbnRyaWVzKCkgeworICAgICAgICBpZihtRmlsZUVudHJpZXMgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG1GaWxlRW50cmllcy5sZW5ndGg7CisgICAgfQorCisgICAgcHVibGljIEluZGV4RW50cnkgZ2V0SW5kZXhFbnRyeShpbnQgaW5kZXgpIHsKKyAgICAgICAgaWYoZ2V0TnVtSW5kZXhFbnRyaWVzKCkgPT0gMCB8fCBpbmRleCA8IDAgfHwgaW5kZXggPj0gbUZpbGVFbnRyaWVzLmxlbmd0aCkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG1GaWxlRW50cmllc1tpbmRleF07CisgICAgfQorCisgICAgc3RhdGljIHB1YmxpYyBGaWxlQTNEIGNyZWF0ZUZyb21SZXNvdXJjZShSZW5kZXJTY3JpcHQgcnMsIFJlc291cmNlcyByZXMsIGludCBpZCkKKyAgICAgICAgdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB7CisKKyAgICAgICAgcnMudmFsaWRhdGUoKTsKKyAgICAgICAgSW5wdXRTdHJlYW0gaXMgPSBudWxsOworICAgICAgICB0cnkgeworICAgICAgICAgICAgZmluYWwgVHlwZWRWYWx1ZSB2YWx1ZSA9IG5ldyBUeXBlZFZhbHVlKCk7CisgICAgICAgICAgICBpcyA9IHJlcy5vcGVuUmF3UmVzb3VyY2UoaWQsIHZhbHVlKTsKKworICAgICAgICAgICAgaW50IGFzc2V0ID0gKChBc3NldE1hbmFnZXIuQXNzZXRJbnB1dFN0cmVhbSkgaXMpLmdldEFzc2V0SW50KCk7CisKKyAgICAgICAgICAgIGludCBmaWxlSWQgPSBycy5uRmlsZUEzRENyZWF0ZUZyb21Bc3NldFN0cmVhbShhc3NldCk7CisKKyAgICAgICAgICAgIGlmKGZpbGVJZCA9PSAwKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiTG9hZCBmYWlsZWQuIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBGaWxlQTNEIGZhM2QgPSBuZXcgRmlsZUEzRChmaWxlSWQsIHJzKTsKKyAgICAgICAgICAgIGZhM2QuaW5pdEVudHJpZXMoKTsKKyAgICAgICAgICAgIHJldHVybiBmYTNkOworCisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAvLyBJZ25vcmUKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIGlmIChpcyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgaXMuY2xvc2UoKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIElnbm9yZQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvRmxvYXQyLmphdmEgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L0Zsb2F0Mi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg4OWJmN2IKLS0tIC9kZXYvbnVsbAorKysgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L0Zsb2F0Mi5qYXZhCkBAIC0wLDAgKzEsNDIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQucmVuZGVyc2NyaXB0OworCitpbXBvcnQgamF2YS5sYW5nLk1hdGg7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKKworCisvKioKKyAqIEBoaWRlCisgKgorICoqLworcHVibGljIGNsYXNzIEZsb2F0MiB7CisgICAgcHVibGljIEZsb2F0MigpIHsKKyAgICB9CisKKyAgICBwdWJsaWMgRmxvYXQyKGZsb2F0IGluaXRYLCBmbG9hdCBpbml0WSkgeworICAgICAgICB4ID0gaW5pdFg7CisgICAgICAgIHkgPSBpbml0WTsKKyAgICB9CisKKyAgICBwdWJsaWMgZmxvYXQgeDsKKyAgICBwdWJsaWMgZmxvYXQgeTsKK30KKworCisKKwpkaWZmIC0tZ2l0IGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9GbG9hdDMuamF2YSBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvRmxvYXQzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWJlMTQwZAotLS0gL2Rldi9udWxsCisrKyBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvRmxvYXQzLmphdmEKQEAgLTAsMCArMSw0MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5yZW5kZXJzY3JpcHQ7CisKK2ltcG9ydCBqYXZhLmxhbmcuTWF0aDsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworCisKKy8qKgorICogQGhpZGUKKyAqCisgKiovCitwdWJsaWMgY2xhc3MgRmxvYXQzIHsKKyAgICBwdWJsaWMgRmxvYXQzKCkgeworICAgIH0KKyAgICBwdWJsaWMgRmxvYXQzKGZsb2F0IGluaXRYLCBmbG9hdCBpbml0WSwgZmxvYXQgaW5pdFopIHsKKyAgICAgICAgeCA9IGluaXRYOworICAgICAgICB5ID0gaW5pdFk7CisgICAgICAgIHogPSBpbml0WjsKKyAgICB9CisKKyAgICBwdWJsaWMgZmxvYXQgeDsKKyAgICBwdWJsaWMgZmxvYXQgeTsKKyAgICBwdWJsaWMgZmxvYXQgejsKK30KKworCisKKwpkaWZmIC0tZ2l0IGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9GbG9hdDQuamF2YSBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvRmxvYXQ0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODQ3NzMyZgotLS0gL2Rldi9udWxsCisrKyBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvRmxvYXQ0LmphdmEKQEAgLTAsMCArMSw0NSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5yZW5kZXJzY3JpcHQ7CisKK2ltcG9ydCBqYXZhLmxhbmcuTWF0aDsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworCisKKy8qKgorICogQGhpZGUKKyAqCisgKiovCitwdWJsaWMgY2xhc3MgRmxvYXQ0IHsKKyAgICBwdWJsaWMgRmxvYXQ0KCkgeworICAgIH0KKworICAgIHB1YmxpYyBGbG9hdDQoZmxvYXQgaW5pdFgsIGZsb2F0IGluaXRZLCBmbG9hdCBpbml0WiwgZmxvYXQgaW5pdFcpIHsKKyAgICAgICAgeCA9IGluaXRYOworICAgICAgICB5ID0gaW5pdFk7CisgICAgICAgIHogPSBpbml0WjsKKyAgICAgICAgdyA9IGluaXRXOworICAgIH0KKworICAgIHB1YmxpYyBmbG9hdCB4OworICAgIHB1YmxpYyBmbG9hdCB5OworICAgIHB1YmxpYyBmbG9hdCB6OworICAgIHB1YmxpYyBmbG9hdCB3OworfQorCisKKwpkaWZmIC0tZ2l0IGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9Gb250LmphdmEgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L0ZvbnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZTI1MDE0Ci0tLSAvZGV2L251bGwKKysrIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9Gb250LmphdmEKQEAgLTAsMCArMSwxNjUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQucmVuZGVyc2NyaXB0OworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CisKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlJlc291cmNlczsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLkFzc2V0TWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworaW1wb3J0IGFuZHJvaWQudXRpbC5UeXBlZFZhbHVlOworCisvKioKKyAqIEBoaWRlCisgKgorICoqLworcHVibGljIGNsYXNzIEZvbnQgZXh0ZW5kcyBCYXNlT2JqIHsKKworICAgIC8vVGhlc2UgaGVscCB1cyBjcmVhdGUgYSBmb250IGJ5IGZhbWlseSBuYW1lCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gc1NhbnNOYW1lcyA9IHsKKyAgICAgICAgInNhbnMtc2VyaWYiLCAiYXJpYWwiLCAiaGVsdmV0aWNhIiwgInRhaG9tYSIsICJ2ZXJkYW5hIgorICAgIH07CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBzU2VyaWZOYW1lcyA9IHsKKyAgICAgICAgInNlcmlmIiwgInRpbWVzIiwgInRpbWVzIG5ldyByb21hbiIsICJwYWxhdGlubyIsICJnZW9yZ2lhIiwgImJhc2tlcnZpbGxlIiwKKyAgICAgICAgImdvdWR5IiwgImZhbnRhc3kiLCAiY3Vyc2l2ZSIsICJJVEMgU3RvbmUgU2VyaWYiCisgICAgfTsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIHNNb25vTmFtZXMgPSB7CisgICAgICAgICJtb25vc3BhY2UiLCAiY291cmllciIsICJjb3VyaWVyIG5ldyIsICJtb25hY28iCisgICAgfTsKKworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIEZvbnRGYW1pbHkgeworICAgICAgICBTdHJpbmdbXSBtTmFtZXM7CisgICAgICAgIFN0cmluZyBtTm9ybWFsRmlsZU5hbWU7CisgICAgICAgIFN0cmluZyBtQm9sZEZpbGVOYW1lOworICAgICAgICBTdHJpbmcgbUl0YWxpY0ZpbGVOYW1lOworICAgICAgICBTdHJpbmcgbUJvbGRJdGFsaWNGaWxlTmFtZTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBNYXA8U3RyaW5nLCBGb250RmFtaWx5PiBzRm9udEZhbWlseU1hcDsKKworICAgIHB1YmxpYyBlbnVtIFN0eWxlIHsKKyAgICAgICAgTk9STUFMLAorICAgICAgICBCT0xELAorICAgICAgICBJVEFMSUMsCisgICAgICAgIEJPTERfSVRBTElDOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIHZvaWQgYWRkRmFtaWx5VG9NYXAoRm9udEZhbWlseSBmYW1pbHkpIHsKKyAgICAgICAgZm9yKGludCBpID0gMDsgaSA8IGZhbWlseS5tTmFtZXMubGVuZ3RoOyBpICsrKSB7CisgICAgICAgICAgICBzRm9udEZhbWlseU1hcC5wdXQoZmFtaWx5Lm1OYW1lc1tpXSwgZmFtaWx5KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIHZvaWQgaW5pdEZvbnRGYW1pbHlNYXAoKSB7CisgICAgICAgIHNGb250RmFtaWx5TWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBGb250RmFtaWx5PigpOworCisgICAgICAgIEZvbnRGYW1pbHkgc2Fuc0ZhbWlseSA9IG5ldyBGb250RmFtaWx5KCk7CisgICAgICAgIHNhbnNGYW1pbHkubU5hbWVzID0gc1NhbnNOYW1lczsKKyAgICAgICAgc2Fuc0ZhbWlseS5tTm9ybWFsRmlsZU5hbWUgPSAiRHJvaWRTYW5zLnR0ZiI7CisgICAgICAgIHNhbnNGYW1pbHkubUJvbGRGaWxlTmFtZSA9ICJEcm9pZFNhbnMtQm9sZC50dGYiOworICAgICAgICBzYW5zRmFtaWx5Lm1JdGFsaWNGaWxlTmFtZSA9ICJEcm9pZFNhbnMudHRmIjsKKyAgICAgICAgc2Fuc0ZhbWlseS5tQm9sZEl0YWxpY0ZpbGVOYW1lID0gIkRyb2lkU2Fucy1Cb2xkLnR0ZiI7CisgICAgICAgIGFkZEZhbWlseVRvTWFwKHNhbnNGYW1pbHkpOworCisgICAgICAgIEZvbnRGYW1pbHkgc2VyaWZGYW1pbHkgPSBuZXcgRm9udEZhbWlseSgpOworICAgICAgICBzZXJpZkZhbWlseS5tTmFtZXMgPSBzU2VyaWZOYW1lczsKKyAgICAgICAgc2VyaWZGYW1pbHkubU5vcm1hbEZpbGVOYW1lID0gIkRyb2lkU2VyaWYtUmVndWxhci50dGYiOworICAgICAgICBzZXJpZkZhbWlseS5tQm9sZEZpbGVOYW1lID0gIkRyb2lkU2VyaWYtQm9sZC50dGYiOworICAgICAgICBzZXJpZkZhbWlseS5tSXRhbGljRmlsZU5hbWUgPSAiRHJvaWRTZXJpZi1JdGFsaWMudHRmIjsKKyAgICAgICAgc2VyaWZGYW1pbHkubUJvbGRJdGFsaWNGaWxlTmFtZSA9ICJEcm9pZFNlcmlmLUJvbGRJdGFsaWMudHRmIjsKKyAgICAgICAgYWRkRmFtaWx5VG9NYXAoc2VyaWZGYW1pbHkpOworCisgICAgICAgIEZvbnRGYW1pbHkgbW9ub0ZhbWlseSA9IG5ldyBGb250RmFtaWx5KCk7CisgICAgICAgIG1vbm9GYW1pbHkubU5hbWVzID0gc01vbm9OYW1lczsKKyAgICAgICAgbW9ub0ZhbWlseS5tTm9ybWFsRmlsZU5hbWUgPSAiRHJvaWRTYW5zTW9uby50dGYiOworICAgICAgICBtb25vRmFtaWx5Lm1Cb2xkRmlsZU5hbWUgPSAiRHJvaWRTYW5zTW9uby50dGYiOworICAgICAgICBtb25vRmFtaWx5Lm1JdGFsaWNGaWxlTmFtZSA9ICJEcm9pZFNhbnNNb25vLnR0ZiI7CisgICAgICAgIG1vbm9GYW1pbHkubUJvbGRJdGFsaWNGaWxlTmFtZSA9ICJEcm9pZFNhbnNNb25vLnR0ZiI7CisgICAgICAgIGFkZEZhbWlseVRvTWFwKG1vbm9GYW1pbHkpOworICAgIH0KKworICAgIHN0YXRpYyB7CisgICAgICAgIGluaXRGb250RmFtaWx5TWFwKCk7CisgICAgfQorCisgICAgc3RhdGljIFN0cmluZyBnZXRGb250RmlsZU5hbWUoU3RyaW5nIGZhbWlseU5hbWUsIFN0eWxlIHN0eWxlKSB7CisgICAgICAgIEZvbnRGYW1pbHkgZmFtaWx5ID0gc0ZvbnRGYW1pbHlNYXAuZ2V0KGZhbWlseU5hbWUpOworICAgICAgICBpZihmYW1pbHkgIT0gbnVsbCkgeworICAgICAgICAgICAgc3dpdGNoKHN0eWxlKSB7CisgICAgICAgICAgICAgICAgY2FzZSBOT1JNQUw6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYW1pbHkubU5vcm1hbEZpbGVOYW1lOworICAgICAgICAgICAgICAgIGNhc2UgQk9MRDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbWlseS5tQm9sZEZpbGVOYW1lOworICAgICAgICAgICAgICAgIGNhc2UgSVRBTElDOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFtaWx5Lm1JdGFsaWNGaWxlTmFtZTsKKyAgICAgICAgICAgICAgICBjYXNlIEJPTERfSVRBTElDOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFtaWx5Lm1Cb2xkSXRhbGljRmlsZU5hbWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLy8gRmFsbGJhY2sgaWYgd2UgY291bGQgbm90IGZpbmQgdGhlIGRlc2lyZWQgZmFtaWx5CisgICAgICAgIHJldHVybiAiRHJvaWRTYW5zLnR0ZiI7CisgICAgfQorCisgICAgRm9udChpbnQgaWQsIFJlbmRlclNjcmlwdCBycykgeworICAgICAgICBzdXBlcihpZCwgcnMpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRha2VzIGEgc3BlY2lmaWMgZmlsZSBuYW1lIGFzIGFuIGFyZ3VtZW50CisgICAgICovCisgICAgc3RhdGljIHB1YmxpYyBGb250IGNyZWF0ZShSZW5kZXJTY3JpcHQgcnMsIFJlc291cmNlcyByZXMsIFN0cmluZyBmaWxlTmFtZSwgaW50IHNpemUpCisgICAgICAgIHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24geworCisgICAgICAgIHJzLnZhbGlkYXRlKCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgZHBpID0gcmVzLmdldERpc3BsYXlNZXRyaWNzKCkuZGVuc2l0eURwaTsKKyAgICAgICAgICAgIGludCBmb250SWQgPSBycy5uRm9udENyZWF0ZUZyb21GaWxlKGZpbGVOYW1lLCBzaXplLCBkcGkpOworCisgICAgICAgICAgICBpZihmb250SWQgPT0gMCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkZhaWxlZCBsb2FkaW5nIGEgZm9udCIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgRm9udCByc0ZvbnQgPSBuZXcgRm9udChmb250SWQsIHJzKTsKKworICAgICAgICAgICAgcmV0dXJuIHJzRm9udDsKKworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgLy8gSWdub3JlCisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBY2NlcHRzIG9uZSBvZiB0aGUgZm9sbG93aW5nIGZhbWlseSBuYW1lcyBhcyBhbiBhcmd1bWVudAorICAgICAqIGFuZCB3aWxsIGF0dGVtcCB0byBwcm9kdWNlIHRoZSBiZXN0IG1hdGNoIHdpdGggYSBzeXN0ZW0gZm9udAorICAgICAqICJzYW5zLXNlcmlmIiAiYXJpYWwiICJoZWx2ZXRpY2EiICJ0YWhvbWEiICJ2ZXJkYW5hIgorICAgICAqICJzZXJpZiIgInRpbWVzIiAidGltZXMgbmV3IHJvbWFuIiAicGFsYXRpbm8iICJnZW9yZ2lhIiAiYmFza2VydmlsbGUiCisgICAgICogImdvdWR5IiAiZmFudGFzeSIgImN1cnNpdmUiICJJVEMgU3RvbmUgU2VyaWYiCisgICAgICogIm1vbm9zcGFjZSIgImNvdXJpZXIiICJjb3VyaWVyIG5ldyIgIm1vbmFjbyIKKyAgICAgKiBSZXR1cm5zIGRlZmF1bHQgZm9udCBpZiBubyBtYXRjaCBjb3VsZCBiZSBmb3VuZAorICAgICAqLworICAgIHN0YXRpYyBwdWJsaWMgRm9udCBjcmVhdGVGcm9tRmFtaWx5KFJlbmRlclNjcmlwdCBycywgUmVzb3VyY2VzIHJlcywgU3RyaW5nIGZhbWlseU5hbWUsIFN0eWxlIGZvbnRTdHlsZSwgaW50IHNpemUpCisgICAgdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB7CisgICAgICAgIFN0cmluZyBmaWxlTmFtZSA9IGdldEZvbnRGaWxlTmFtZShmYW1pbHlOYW1lLCBmb250U3R5bGUpOworICAgICAgICByZXR1cm4gY3JlYXRlKHJzLCByZXMsIGZpbGVOYW1lLCBzaXplKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L0ludDIuamF2YSBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvSW50Mi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU2ZTJmZTkKLS0tIC9kZXYvbnVsbAorKysgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L0ludDIuamF2YQpAQCAtMCwwICsxLDM3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLnJlbmRlcnNjcmlwdDsKKworaW1wb3J0IGphdmEubGFuZy5NYXRoOworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CisKKworLyoqCisgKiBAaGlkZQorICoKKyAqKi8KK3B1YmxpYyBjbGFzcyBJbnQyIHsKKyAgICBwdWJsaWMgSW50MigpIHsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IHg7CisgICAgcHVibGljIGludCB5OworfQorCisKKworCmRpZmYgLS1naXQgYS9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L0ludDMuamF2YSBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvSW50My5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFiMjc1MDkKLS0tIC9kZXYvbnVsbAorKysgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L0ludDMuamF2YQpAQCAtMCwwICsxLDM4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLnJlbmRlcnNjcmlwdDsKKworaW1wb3J0IGphdmEubGFuZy5NYXRoOworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CisKKworLyoqCisgKiBAaGlkZQorICoKKyAqKi8KK3B1YmxpYyBjbGFzcyBJbnQzIHsKKyAgICBwdWJsaWMgSW50MygpIHsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IHg7CisgICAgcHVibGljIGludCB5OworICAgIHB1YmxpYyBpbnQgejsKK30KKworCisKKwpkaWZmIC0tZ2l0IGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9JbnQ0LmphdmEgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L0ludDQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZDZmM2Y1Ci0tLSAvZGV2L251bGwKKysrIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9JbnQ0LmphdmEKQEAgLTAsMCArMSwzOCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5yZW5kZXJzY3JpcHQ7CisKK2ltcG9ydCBqYXZhLmxhbmcuTWF0aDsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworCisKKy8qKgorICogQGhpZGUKKyAqCisgKiovCitwdWJsaWMgY2xhc3MgSW50NCB7CisgICAgcHVibGljIEludDQoKSB7CisgICAgfQorCisgICAgcHVibGljIGludCB4OworICAgIHB1YmxpYyBpbnQgeTsKKyAgICBwdWJsaWMgaW50IHo7CisgICAgcHVibGljIGludCB3OworfQorCisKKwpkaWZmIC0tZ2l0IGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9MaWdodC5qYXZhIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9MaWdodC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYWI2NTZmLi4wMDAwMDAwCi0tLSBhL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvTGlnaHQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGFuZHJvaWQucmVuZGVyc2NyaXB0OwotCi1pbXBvcnQgYW5kcm9pZC51dGlsLkNvbmZpZzsKLWltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwotCi0vKioKLSAqIEBoaWRlCi0gKgotICoqLwotcHVibGljIGNsYXNzIExpZ2h0IGV4dGVuZHMgQmFzZU9iaiB7Ci0gICAgTGlnaHQoaW50IGlkLCBSZW5kZXJTY3JpcHQgcnMpIHsKLSAgICAgICAgc3VwZXIocnMpOwotICAgICAgICBtSUQgPSBpZDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRDb2xvcihmbG9hdCByLCBmbG9hdCBnLCBmbG9hdCBiKSB7Ci0gICAgICAgIG1SUy52YWxpZGF0ZSgpOwotICAgICAgICBtUlMubkxpZ2h0U2V0Q29sb3IobUlELCByLCBnLCBiKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRQb3NpdGlvbihmbG9hdCB4LCBmbG9hdCB5LCBmbG9hdCB6KSB7Ci0gICAgICAgIG1SUy52YWxpZGF0ZSgpOwotICAgICAgICBtUlMubkxpZ2h0U2V0UG9zaXRpb24obUlELCB4LCB5LCB6KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEJ1aWxkZXIgewotICAgICAgICBSZW5kZXJTY3JpcHQgbVJTOwotICAgICAgICBib29sZWFuIG1Jc01vbm87Ci0gICAgICAgIGJvb2xlYW4gbUlzTG9jYWw7Ci0KLSAgICAgICAgcHVibGljIEJ1aWxkZXIoUmVuZGVyU2NyaXB0IHJzKSB7Ci0gICAgICAgICAgICBtUlMgPSByczsKLSAgICAgICAgICAgIG1Jc01vbm8gPSBmYWxzZTsKLSAgICAgICAgICAgIG1Jc0xvY2FsID0gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBsaWdodFNldElzTW9ubyhib29sZWFuIGlzTW9ubykgewotICAgICAgICAgICAgbUlzTW9ubyA9IGlzTW9ubzsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIGxpZ2h0U2V0SXNMb2NhbChib29sZWFuIGlzTG9jYWwpIHsKLSAgICAgICAgICAgIG1Jc0xvY2FsID0gaXNMb2NhbDsKLSAgICAgICAgfQotCi0gICAgICAgIHN0YXRpYyBzeW5jaHJvbml6ZWQgTGlnaHQgaW50ZXJuYWxDcmVhdGUoUmVuZGVyU2NyaXB0IHJzLCBCdWlsZGVyIGIpIHsKLSAgICAgICAgICAgIHJzLm5TYW1wbGVyQmVnaW4oKTsKLSAgICAgICAgICAgIHJzLm5MaWdodFNldElzTW9ubyhiLm1Jc01vbm8pOwotICAgICAgICAgICAgcnMubkxpZ2h0U2V0SXNMb2NhbChiLm1Jc0xvY2FsKTsKLSAgICAgICAgICAgIGludCBpZCA9IHJzLm5MaWdodENyZWF0ZSgpOwotICAgICAgICAgICAgcmV0dXJuIG5ldyBMaWdodChpZCwgcnMpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIExpZ2h0IGNyZWF0ZSgpIHsKLSAgICAgICAgICAgIG1SUy52YWxpZGF0ZSgpOwotICAgICAgICAgICAgcmV0dXJuIGludGVybmFsQ3JlYXRlKG1SUywgdGhpcyk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLX0KLQpkaWZmIC0tZ2l0IGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9Mb25nMi5qYXZhIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9Mb25nMi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjExZWFkMmYKLS0tIC9kZXYvbnVsbAorKysgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L0xvbmcyLmphdmEKQEAgLTAsMCArMSwzNyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5yZW5kZXJzY3JpcHQ7CisKK2ltcG9ydCBqYXZhLmxhbmcuTWF0aDsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworCisKKy8qKgorICogQGhpZGUKKyAqCisgKiovCitwdWJsaWMgY2xhc3MgTG9uZzIgeworICAgIHB1YmxpYyBMb25nMigpIHsKKyAgICB9CisKKyAgICBwdWJsaWMgbG9uZyB4OworICAgIHB1YmxpYyBsb25nIHk7Cit9CisKKworCisKZGlmZiAtLWdpdCBhL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvTG9uZzMuamF2YSBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvTG9uZzMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNjA0NTMyCi0tLSAvZGV2L251bGwKKysrIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9Mb25nMy5qYXZhCkBAIC0wLDAgKzEsMzggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQucmVuZGVyc2NyaXB0OworCitpbXBvcnQgamF2YS5sYW5nLk1hdGg7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKKworCisvKioKKyAqIEBoaWRlCisgKgorICoqLworcHVibGljIGNsYXNzIExvbmczIHsKKyAgICBwdWJsaWMgTG9uZzMoKSB7CisgICAgfQorCisgICAgcHVibGljIGxvbmcgeDsKKyAgICBwdWJsaWMgbG9uZyB5OworICAgIHB1YmxpYyBsb25nIHo7Cit9CisKKworCisKZGlmZiAtLWdpdCBhL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvTG9uZzQuamF2YSBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvTG9uZzQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZmQyNzQ3Ci0tLSAvZGV2L251bGwKKysrIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9Mb25nNC5qYXZhCkBAIC0wLDAgKzEsMzggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQucmVuZGVyc2NyaXB0OworCitpbXBvcnQgamF2YS5sYW5nLk1hdGg7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKKworCisvKioKKyAqIEBoaWRlCisgKgorICoqLworcHVibGljIGNsYXNzIExvbmc0IHsKKyAgICBwdWJsaWMgTG9uZzQoKSB7CisgICAgfQorCisgICAgcHVibGljIGxvbmcgeDsKKyAgICBwdWJsaWMgbG9uZyB5OworICAgIHB1YmxpYyBsb25nIHo7CisgICAgcHVibGljIGxvbmcgdzsKK30KKworCisKZGlmZiAtLWdpdCBhL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvTWF0cml4MmYuamF2YSBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvTWF0cml4MmYuamF2YQppbmRleCA0YjVlNjFiLi45OWQyM2RiIDEwMDY0NAotLS0gYS9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L01hdHJpeDJmLmphdmEKKysrIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9NYXRyaXgyZi5qYXZhCkBAIC01MSw2ICs1MSw1NyBAQAogICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KG1NYXQsIDAsIHNyYywgMCwgNCk7CiAgICAgfQogCisgICAgcHVibGljIHZvaWQgbG9hZFJvdGF0ZShmbG9hdCByb3QpIHsKKyAgICAgICAgZmxvYXQgYywgczsKKyAgICAgICAgcm90ICo9IChmbG9hdCkoamF2YS5sYW5nLk1hdGguUEkgLyAxODAuMGYpOworICAgICAgICBjID0gKGZsb2F0KWphdmEubGFuZy5NYXRoLmNvcyhyb3QpOworICAgICAgICBzID0gKGZsb2F0KWphdmEubGFuZy5NYXRoLnNpbihyb3QpOworICAgICAgICBtTWF0WzBdID0gYzsKKyAgICAgICAgbU1hdFsxXSA9IC1zOworICAgICAgICBtTWF0WzJdID0gczsKKyAgICAgICAgbU1hdFszXSA9IGM7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgbG9hZFNjYWxlKGZsb2F0IHgsIGZsb2F0IHkpIHsKKyAgICAgICAgbG9hZElkZW50aXR5KCk7CisgICAgICAgIG1NYXRbMF0gPSB4OworICAgICAgICBtTWF0WzNdID0geTsKKyAgICB9CisgICAgcHVibGljIHZvaWQgbG9hZE11bHRpcGx5KE1hdHJpeDJmIGxocywgTWF0cml4MmYgcmhzKSB7CisgICAgICAgIGZvciAoaW50IGk9MCA7IGk8MiA7IGkrKykgeworICAgICAgICAgICAgZmxvYXQgcmkwID0gMDsKKyAgICAgICAgICAgIGZsb2F0IHJpMSA9IDA7CisgICAgICAgICAgICBmb3IgKGludCBqPTAgOyBqPDIgOyBqKyspIHsKKyAgICAgICAgICAgICAgICBmbG9hdCByaHNfaWogPSByaHMuZ2V0KGksaik7CisgICAgICAgICAgICAgICAgcmkwICs9IGxocy5nZXQoaiwwKSAqIHJoc19pajsKKyAgICAgICAgICAgICAgICByaTEgKz0gbGhzLmdldChqLDEpICogcmhzX2lqOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2V0KGksMCwgcmkwKTsKKyAgICAgICAgICAgIHNldChpLDEsIHJpMSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBtdWx0aXBseShNYXRyaXgyZiByaHMpIHsKKyAgICAgICAgTWF0cml4MmYgdG1wID0gbmV3IE1hdHJpeDJmKCk7CisgICAgICAgIHRtcC5sb2FkTXVsdGlwbHkodGhpcywgcmhzKTsKKyAgICAgICAgbG9hZCh0bXApOworICAgIH0KKyAgICBwdWJsaWMgdm9pZCByb3RhdGUoZmxvYXQgcm90KSB7CisgICAgICAgIE1hdHJpeDJmIHRtcCA9IG5ldyBNYXRyaXgyZigpOworICAgICAgICB0bXAubG9hZFJvdGF0ZShyb3QpOworICAgICAgICBtdWx0aXBseSh0bXApOworICAgIH0KKyAgICBwdWJsaWMgdm9pZCBzY2FsZShmbG9hdCB4LCBmbG9hdCB5KSB7CisgICAgICAgIE1hdHJpeDJmIHRtcCA9IG5ldyBNYXRyaXgyZigpOworICAgICAgICB0bXAubG9hZFNjYWxlKHgsIHkpOworICAgICAgICBtdWx0aXBseSh0bXApOworICAgIH0KKyAgICBwdWJsaWMgdm9pZCB0cmFuc3Bvc2UoKSB7CisgICAgICAgIGZsb2F0IHRlbXAgPSBtTWF0WzFdOworICAgICAgICBtTWF0WzFdID0gbU1hdFsyXTsKKyAgICAgICAgbU1hdFsyXSA9IHRlbXA7CisgICAgfQorCiAgICAgZmluYWwgZmxvYXRbXSBtTWF0OwogfQogCmRpZmYgLS1naXQgYS9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L01hdHJpeDNmLmphdmEgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L01hdHJpeDNmLmphdmEKaW5kZXggMTlkN2I0My4uOTYxYmM1ZCAxMDA2NDQKLS0tIGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9NYXRyaXgzZi5qYXZhCisrKyBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvTWF0cml4M2YuamF2YQpAQCAtNTcsNiArNTcsMTI0IEBACiAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkobU1hdCwgMCwgc3JjLCAwLCA5KTsKICAgICB9CiAKKyAgICBwdWJsaWMgdm9pZCBsb2FkUm90YXRlKGZsb2F0IHJvdCwgZmxvYXQgeCwgZmxvYXQgeSwgZmxvYXQgeikgeworICAgICAgICBmbG9hdCBjLCBzOworICAgICAgICByb3QgKj0gKGZsb2F0KShqYXZhLmxhbmcuTWF0aC5QSSAvIDE4MC4wZik7CisgICAgICAgIGMgPSAoZmxvYXQpamF2YS5sYW5nLk1hdGguY29zKHJvdCk7CisgICAgICAgIHMgPSAoZmxvYXQpamF2YS5sYW5nLk1hdGguc2luKHJvdCk7CisKKyAgICAgICAgZmxvYXQgbGVuID0gKGZsb2F0KWphdmEubGFuZy5NYXRoLnNxcnQoeCp4ICsgeSp5ICsgeip6KTsKKyAgICAgICAgaWYgKCEobGVuICE9IDEpKSB7CisgICAgICAgICAgICBmbG9hdCByZWNpcExlbiA9IDEuZiAvIGxlbjsKKyAgICAgICAgICAgIHggKj0gcmVjaXBMZW47CisgICAgICAgICAgICB5ICo9IHJlY2lwTGVuOworICAgICAgICAgICAgeiAqPSByZWNpcExlbjsKKyAgICAgICAgfQorICAgICAgICBmbG9hdCBuYyA9IDEuMGYgLSBjOworICAgICAgICBmbG9hdCB4eSA9IHggKiB5OworICAgICAgICBmbG9hdCB5eiA9IHkgKiB6OworICAgICAgICBmbG9hdCB6eCA9IHogKiB4OworICAgICAgICBmbG9hdCB4cyA9IHggKiBzOworICAgICAgICBmbG9hdCB5cyA9IHkgKiBzOworICAgICAgICBmbG9hdCB6cyA9IHogKiBzOworICAgICAgICBtTWF0WzBdID0geCp4Km5jICsgIGM7CisgICAgICAgIG1NYXRbM10gPSAgeHkqbmMgLSB6czsKKyAgICAgICAgbU1hdFs2XSA9ICB6eCpuYyArIHlzOworICAgICAgICBtTWF0WzFdID0gIHh5Km5jICsgenM7CisgICAgICAgIG1NYXRbNF0gPSB5KnkqbmMgKyAgYzsKKyAgICAgICAgbU1hdFs5XSA9ICB5eipuYyAtIHhzOworICAgICAgICBtTWF0WzJdID0gIHp4Km5jIC0geXM7CisgICAgICAgIG1NYXRbNl0gPSAgeXoqbmMgKyB4czsKKyAgICAgICAgbU1hdFs4XSA9IHoqeipuYyArICBjOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGxvYWRSb3RhdGUoZmxvYXQgcm90KSB7CisgICAgICAgIGZsb2F0IGMsIHM7CisgICAgICAgIHJvdCAqPSAoZmxvYXQpKGphdmEubGFuZy5NYXRoLlBJIC8gMTgwLjBmKTsKKyAgICAgICAgYyA9IChmbG9hdClqYXZhLmxhbmcuTWF0aC5jb3Mocm90KTsKKyAgICAgICAgcyA9IChmbG9hdClqYXZhLmxhbmcuTWF0aC5zaW4ocm90KTsKKyAgICAgICAgbU1hdFswXSA9IGM7CisgICAgICAgIG1NYXRbMV0gPSAtczsKKyAgICAgICAgbU1hdFszXSA9IHM7CisgICAgICAgIG1NYXRbNF0gPSBjOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGxvYWRTY2FsZShmbG9hdCB4LCBmbG9hdCB5KSB7CisgICAgICAgIGxvYWRJZGVudGl0eSgpOworICAgICAgICBtTWF0WzBdID0geDsKKyAgICAgICAgbU1hdFs0XSA9IHk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgbG9hZFNjYWxlKGZsb2F0IHgsIGZsb2F0IHksIGZsb2F0IHopIHsKKyAgICAgICAgbG9hZElkZW50aXR5KCk7CisgICAgICAgIG1NYXRbMF0gPSB4OworICAgICAgICBtTWF0WzRdID0geTsKKyAgICAgICAgbU1hdFs4XSA9IHo7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgbG9hZFRyYW5zbGF0ZShmbG9hdCB4LCBmbG9hdCB5KSB7CisgICAgICAgIGxvYWRJZGVudGl0eSgpOworICAgICAgICBtTWF0WzZdID0geDsKKyAgICAgICAgbU1hdFs3XSA9IHk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgbG9hZE11bHRpcGx5KE1hdHJpeDNmIGxocywgTWF0cml4M2YgcmhzKSB7CisgICAgICAgIGZvciAoaW50IGk9MCA7IGk8MyA7IGkrKykgeworICAgICAgICAgICAgZmxvYXQgcmkwID0gMDsKKyAgICAgICAgICAgIGZsb2F0IHJpMSA9IDA7CisgICAgICAgICAgICBmbG9hdCByaTIgPSAwOworICAgICAgICAgICAgZm9yIChpbnQgaj0wIDsgajwzIDsgaisrKSB7CisgICAgICAgICAgICAgICAgZmxvYXQgcmhzX2lqID0gcmhzLmdldChpLGopOworICAgICAgICAgICAgICAgIHJpMCArPSBsaHMuZ2V0KGosMCkgKiByaHNfaWo7CisgICAgICAgICAgICAgICAgcmkxICs9IGxocy5nZXQoaiwxKSAqIHJoc19pajsKKyAgICAgICAgICAgICAgICByaTIgKz0gbGhzLmdldChqLDIpICogcmhzX2lqOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2V0KGksMCwgcmkwKTsKKyAgICAgICAgICAgIHNldChpLDEsIHJpMSk7CisgICAgICAgICAgICBzZXQoaSwyLCByaTIpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgbXVsdGlwbHkoTWF0cml4M2YgcmhzKSB7CisgICAgICAgIE1hdHJpeDNmIHRtcCA9IG5ldyBNYXRyaXgzZigpOworICAgICAgICB0bXAubG9hZE11bHRpcGx5KHRoaXMsIHJocyk7CisgICAgICAgIGxvYWQodG1wKTsKKyAgICB9CisgICAgcHVibGljIHZvaWQgcm90YXRlKGZsb2F0IHJvdCwgZmxvYXQgeCwgZmxvYXQgeSwgZmxvYXQgeikgeworICAgICAgICBNYXRyaXgzZiB0bXAgPSBuZXcgTWF0cml4M2YoKTsKKyAgICAgICAgdG1wLmxvYWRSb3RhdGUocm90LCB4LCB5LCB6KTsKKyAgICAgICAgbXVsdGlwbHkodG1wKTsKKyAgICB9CisgICAgcHVibGljIHZvaWQgcm90YXRlKGZsb2F0IHJvdCkgeworICAgICAgICBNYXRyaXgzZiB0bXAgPSBuZXcgTWF0cml4M2YoKTsKKyAgICAgICAgdG1wLmxvYWRSb3RhdGUocm90KTsKKyAgICAgICAgbXVsdGlwbHkodG1wKTsKKyAgICB9CisgICAgcHVibGljIHZvaWQgc2NhbGUoZmxvYXQgeCwgZmxvYXQgeSkgeworICAgICAgICBNYXRyaXgzZiB0bXAgPSBuZXcgTWF0cml4M2YoKTsKKyAgICAgICAgdG1wLmxvYWRTY2FsZSh4LCB5KTsKKyAgICAgICAgbXVsdGlwbHkodG1wKTsKKyAgICB9CisgICAgcHVibGljIHZvaWQgc2NhbGUoZmxvYXQgeCwgZmxvYXQgeSwgZmxvYXQgeikgeworICAgICAgICBNYXRyaXgzZiB0bXAgPSBuZXcgTWF0cml4M2YoKTsKKyAgICAgICAgdG1wLmxvYWRTY2FsZSh4LCB5LCB6KTsKKyAgICAgICAgbXVsdGlwbHkodG1wKTsKKyAgICB9CisgICAgcHVibGljIHZvaWQgdHJhbnNsYXRlKGZsb2F0IHgsIGZsb2F0IHkpIHsKKyAgICAgICAgTWF0cml4M2YgdG1wID0gbmV3IE1hdHJpeDNmKCk7CisgICAgICAgIHRtcC5sb2FkVHJhbnNsYXRlKHgsIHkpOworICAgICAgICBtdWx0aXBseSh0bXApOworICAgIH0KKyAgICBwdWJsaWMgdm9pZCB0cmFuc3Bvc2UoKSB7CisgICAgICAgIGZvcihpbnQgaSA9IDA7IGkgPCAyOyArK2kpIHsKKyAgICAgICAgICAgIGZvcihpbnQgaiA9IGkgKyAxOyBqIDwgMzsgKytqKSB7CisgICAgICAgICAgICAgICAgZmxvYXQgdGVtcCA9IG1NYXRbaSozICsgal07CisgICAgICAgICAgICAgICAgbU1hdFtpKjMgKyBqXSA9IG1NYXRbaiozICsgaV07CisgICAgICAgICAgICAgICAgbU1hdFtqKjMgKyBpXSA9IHRlbXA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKICAgICBmaW5hbCBmbG9hdFtdIG1NYXQ7CiB9CiAKZGlmZiAtLWdpdCBhL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvTWF0cml4NGYuamF2YSBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvTWF0cml4NGYuamF2YQppbmRleCBlYmQ1YmRlLi41ZmZjMjFhIDEwMDY0NAotLS0gYS9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L01hdHJpeDRmLmphdmEKKysrIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9NYXRyaXg0Zi5qYXZhCkBAIC0xNzksNiArMTc5LDg1IEBACiAgICAgICAgIHRtcC5sb2FkVHJhbnNsYXRlKHgsIHksIHopOwogICAgICAgICBtdWx0aXBseSh0bXApOwogICAgIH0KKyAgICBwcml2YXRlIGZsb2F0IGNvbXB1dGVDb2ZhY3RvcihpbnQgaSwgaW50IGopIHsKKyAgICAgICAgaW50IGMwID0gKGkrMSkgJSA0OworICAgICAgICBpbnQgYzEgPSAoaSsyKSAlIDQ7CisgICAgICAgIGludCBjMiA9IChpKzMpICUgNDsKKyAgICAgICAgaW50IHIwID0gKGorMSkgJSA0OworICAgICAgICBpbnQgcjEgPSAoaisyKSAlIDQ7CisgICAgICAgIGludCByMiA9IChqKzMpICUgNDsKKworICAgICAgICBmbG9hdCBtaW5vciA9IChtTWF0W2MwICsgNCpyMF0gKiAobU1hdFtjMSArIDQqcjFdICogbU1hdFtjMiArIDQqcjJdIC0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbU1hdFtjMSArIDQqcjJdICogbU1hdFtjMiArIDQqcjFdKSkKKyAgICAgICAgICAgICAgICAgICAgIC0gKG1NYXRbYzAgKyA0KnIxXSAqIChtTWF0W2MxICsgNCpyMF0gKiBtTWF0W2MyICsgNCpyMl0gLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTWF0W2MxICsgNCpyMl0gKiBtTWF0W2MyICsgNCpyMF0pKQorICAgICAgICAgICAgICAgICAgICAgKyAobU1hdFtjMCArIDQqcjJdICogKG1NYXRbYzEgKyA0KnIwXSAqIG1NYXRbYzIgKyA0KnIxXSAtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1NYXRbYzEgKyA0KnIxXSAqIG1NYXRbYzIgKyA0KnIwXSkpOworCisgICAgICAgIGZsb2F0IGNvZmFjdG9yID0gKChpK2opICYgMSkgIT0gMCA/IC1taW5vciA6IG1pbm9yOworICAgICAgICByZXR1cm4gY29mYWN0b3I7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaW52ZXJzZSgpIHsKKworICAgICAgICBNYXRyaXg0ZiByZXN1bHQgPSBuZXcgTWF0cml4NGYoKTsKKworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDQ7ICsraSkgeworICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCA0OyArK2opIHsKKyAgICAgICAgICAgICAgICByZXN1bHQubU1hdFs0KmkgKyBqXSA9IGNvbXB1dGVDb2ZhY3RvcihpLCBqKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIERvdCBwcm9kdWN0IG9mIDB0aCBjb2x1bW4gb2Ygc291cmNlIGFuZCAwdGggcm93IG9mIHJlc3VsdAorICAgICAgICBmbG9hdCBkZXQgPSBtTWF0WzBdKnJlc3VsdC5tTWF0WzBdICsgbU1hdFs0XSpyZXN1bHQubU1hdFsxXSArCisgICAgICAgICAgICAgICAgICAgICBtTWF0WzhdKnJlc3VsdC5tTWF0WzJdICsgbU1hdFsxMl0qcmVzdWx0Lm1NYXRbM107CisKKyAgICAgICAgaWYgKE1hdGguYWJzKGRldCkgPCAxZS02KSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICBkZXQgPSAxLjBmIC8gZGV0OworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDE2OyArK2kpIHsKKyAgICAgICAgICAgIG1NYXRbaV0gPSByZXN1bHQubU1hdFtpXSAqIGRldDsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGludmVyc2VUcmFuc3Bvc2UoKSB7CisKKyAgICAgICAgTWF0cml4NGYgcmVzdWx0ID0gbmV3IE1hdHJpeDRmKCk7CisKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCA0OyArK2kpIHsKKyAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgNDsgKytqKSB7CisgICAgICAgICAgICAgICAgcmVzdWx0Lm1NYXRbNCpqICsgaV0gPSBjb21wdXRlQ29mYWN0b3IoaSwgaik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBmbG9hdCBkZXQgPSBtTWF0WzBdKnJlc3VsdC5tTWF0WzBdICsgbU1hdFs0XSpyZXN1bHQubU1hdFs0XSArCisgICAgICAgICAgICAgICAgICAgICBtTWF0WzhdKnJlc3VsdC5tTWF0WzhdICsgbU1hdFsxMl0qcmVzdWx0Lm1NYXRbMTJdOworCisgICAgICAgIGlmIChNYXRoLmFicyhkZXQpIDwgMWUtNikgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgZGV0ID0gMS4wZiAvIGRldDsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAxNjsgKytpKSB7CisgICAgICAgICAgICBtTWF0W2ldID0gcmVzdWx0Lm1NYXRbaV0gKiBkZXQ7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0cmFuc3Bvc2UoKSB7CisgICAgICAgIGZvcihpbnQgaSA9IDA7IGkgPCAzOyArK2kpIHsKKyAgICAgICAgICAgIGZvcihpbnQgaiA9IGkgKyAxOyBqIDwgNDsgKytqKSB7CisgICAgICAgICAgICAgICAgZmxvYXQgdGVtcCA9IG1NYXRbaSo0ICsgal07CisgICAgICAgICAgICAgICAgbU1hdFtpKjQgKyBqXSA9IG1NYXRbaio0ICsgaV07CisgICAgICAgICAgICAgICAgbU1hdFtqKjQgKyBpXSA9IHRlbXA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CiAKICAgICBmaW5hbCBmbG9hdFtdIG1NYXQ7CiB9CmRpZmYgLS1naXQgYS9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L01lc2guamF2YSBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvTWVzaC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI3NGMxZjgKLS0tIC9kZXYvbnVsbAorKysgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L01lc2guamF2YQpAQCAtMCwwICsxLDQ3OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5yZW5kZXJzY3JpcHQ7CisKK2ltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOworCitpbXBvcnQgYW5kcm9pZC51dGlsLkNvbmZpZzsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworCisvKioKKyAqIEBoaWRlCisgKgorICoqLworcHVibGljIGNsYXNzIE1lc2ggZXh0ZW5kcyBCYXNlT2JqIHsKKworICAgIEFsbG9jYXRpb25bXSBtVmVydGV4QnVmZmVyczsKKyAgICBBbGxvY2F0aW9uW10gbUluZGV4QnVmZmVyczsKKyAgICBQcmltaXRpdmVbXSBtUHJpbWl0aXZlczsKKworICAgIE1lc2goaW50IGlkLCBSZW5kZXJTY3JpcHQgcnMpIHsKKyAgICAgICAgc3VwZXIoaWQsIHJzKTsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGdldFZlcnRleEFsbG9jYXRpb25Db3VudCgpIHsKKyAgICAgICAgaWYobVZlcnRleEJ1ZmZlcnMgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG1WZXJ0ZXhCdWZmZXJzLmxlbmd0aDsKKyAgICB9CisgICAgcHVibGljIEFsbG9jYXRpb24gZ2V0VmVydGV4QWxsb2NhdGlvbihpbnQgc2xvdCkgeworICAgICAgICByZXR1cm4gbVZlcnRleEJ1ZmZlcnNbc2xvdF07CisgICAgfQorCisgICAgcHVibGljIGludCBnZXRQcmltaXRpdmVDb3VudCgpIHsKKyAgICAgICAgaWYobUluZGV4QnVmZmVycyA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbUluZGV4QnVmZmVycy5sZW5ndGg7CisgICAgfQorICAgIHB1YmxpYyBBbGxvY2F0aW9uIGdldEluZGV4QWxsb2NhdGlvbihpbnQgc2xvdCkgeworICAgICAgICByZXR1cm4gbUluZGV4QnVmZmVyc1tzbG90XTsKKyAgICB9CisgICAgcHVibGljIFByaW1pdGl2ZSBnZXRQcmltaXRpdmUoaW50IHNsb3QpIHsKKyAgICAgICAgcmV0dXJuIG1QcmltaXRpdmVzW3Nsb3RdOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHZvaWQgdXBkYXRlRnJvbU5hdGl2ZSgpIHsKKyAgICAgICAgbU5hbWUgPSBtUlMubkdldE5hbWUobUlEKTsKKyAgICAgICAgaW50IHZ0eENvdW50ID0gbVJTLm5NZXNoR2V0VmVydGV4QnVmZmVyQ291bnQobUlEKTsKKyAgICAgICAgaW50IGlkeENvdW50ID0gbVJTLm5NZXNoR2V0SW5kZXhDb3VudChtSUQpOworCisgICAgICAgIGludFtdIHZ0eElEcyA9IG5ldyBpbnRbdnR4Q291bnRdOworICAgICAgICBpbnRbXSBpZHhJRHMgPSBuZXcgaW50W2lkeENvdW50XTsKKyAgICAgICAgaW50W10gcHJpbWl0aXZlcyA9IG5ldyBpbnRbaWR4Q291bnRdOworCisgICAgICAgIG1SUy5uTWVzaEdldFZlcnRpY2VzKG1JRCwgdnR4SURzLCB2dHhDb3VudCk7CisgICAgICAgIG1SUy5uTWVzaEdldEluZGljZXMobUlELCBpZHhJRHMsIHByaW1pdGl2ZXMsIHZ0eENvdW50KTsKKworICAgICAgICBtVmVydGV4QnVmZmVycyA9IG5ldyBBbGxvY2F0aW9uW3Z0eENvdW50XTsKKyAgICAgICAgbUluZGV4QnVmZmVycyA9IG5ldyBBbGxvY2F0aW9uW2lkeENvdW50XTsKKyAgICAgICAgbVByaW1pdGl2ZXMgPSBuZXcgUHJpbWl0aXZlW2lkeENvdW50XTsKKworICAgICAgICBmb3IoaW50IGkgPSAwOyBpIDwgdnR4Q291bnQ7IGkgKyspIHsKKyAgICAgICAgICAgIGlmKHZ0eElEc1tpXSAhPSAwKSB7CisgICAgICAgICAgICAgICAgbVZlcnRleEJ1ZmZlcnNbaV0gPSBuZXcgQWxsb2NhdGlvbih2dHhJRHNbaV0sIG1SUyk7CisgICAgICAgICAgICAgICAgbVZlcnRleEJ1ZmZlcnNbaV0udXBkYXRlRnJvbU5hdGl2ZSgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgZm9yKGludCBpID0gMDsgaSA8IGlkeENvdW50OyBpICsrKSB7CisgICAgICAgICAgICBpZihpZHhJRHNbaV0gIT0gMCkgeworICAgICAgICAgICAgICAgIG1JbmRleEJ1ZmZlcnNbaV0gPSBuZXcgQWxsb2NhdGlvbihpZHhJRHNbaV0sIG1SUyk7CisgICAgICAgICAgICAgICAgbUluZGV4QnVmZmVyc1tpXS51cGRhdGVGcm9tTmF0aXZlKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtUHJpbWl0aXZlc1tpXSA9IFByaW1pdGl2ZS52YWx1ZXMoKVtwcmltaXRpdmVzW2ldXTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQnVpbGRlciB7CisgICAgICAgIFJlbmRlclNjcmlwdCBtUlM7CisKKyAgICAgICAgY2xhc3MgRW50cnkgeworICAgICAgICAgICAgVHlwZSB0OworICAgICAgICAgICAgRWxlbWVudCBlOworICAgICAgICAgICAgaW50IHNpemU7CisgICAgICAgICAgICBQcmltaXRpdmUgcHJpbTsKKyAgICAgICAgfQorCisgICAgICAgIGludCBtVmVydGV4VHlwZUNvdW50OworICAgICAgICBFbnRyeVtdIG1WZXJ0ZXhUeXBlczsKKyAgICAgICAgVmVjdG9yIG1JbmRleFR5cGVzOworCisgICAgICAgIHB1YmxpYyBCdWlsZGVyKFJlbmRlclNjcmlwdCBycykgeworICAgICAgICAgICAgbVJTID0gcnM7CisgICAgICAgICAgICBtVmVydGV4VHlwZUNvdW50ID0gMDsKKyAgICAgICAgICAgIG1WZXJ0ZXhUeXBlcyA9IG5ldyBFbnRyeVsxNl07CisgICAgICAgICAgICBtSW5kZXhUeXBlcyA9IG5ldyBWZWN0b3IoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBpbnQgYWRkVmVydGV4VHlwZShUeXBlIHQpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24geworICAgICAgICAgICAgaWYgKG1WZXJ0ZXhUeXBlQ291bnQgPj0gbVZlcnRleFR5cGVzLmxlbmd0aCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIk1heCB2ZXJ0ZXggdHlwZXMgZXhjZWVkZWQuIik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGludCBhZGRlZEluZGV4ID0gbVZlcnRleFR5cGVDb3VudDsKKyAgICAgICAgICAgIG1WZXJ0ZXhUeXBlc1ttVmVydGV4VHlwZUNvdW50XSA9IG5ldyBFbnRyeSgpOworICAgICAgICAgICAgbVZlcnRleFR5cGVzW21WZXJ0ZXhUeXBlQ291bnRdLnQgPSB0OworICAgICAgICAgICAgbVZlcnRleFR5cGVzW21WZXJ0ZXhUeXBlQ291bnRdLmUgPSBudWxsOworICAgICAgICAgICAgbVZlcnRleFR5cGVDb3VudCsrOworICAgICAgICAgICAgcmV0dXJuIGFkZGVkSW5kZXg7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgaW50IGFkZFZlcnRleFR5cGUoRWxlbWVudCBlLCBpbnQgc2l6ZSkgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiB7CisgICAgICAgICAgICBpZiAobVZlcnRleFR5cGVDb3VudCA+PSBtVmVydGV4VHlwZXMubGVuZ3RoKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiTWF4IHZlcnRleCB0eXBlcyBleGNlZWRlZC4iKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaW50IGFkZGVkSW5kZXggPSBtVmVydGV4VHlwZUNvdW50OworICAgICAgICAgICAgbVZlcnRleFR5cGVzW21WZXJ0ZXhUeXBlQ291bnRdID0gbmV3IEVudHJ5KCk7CisgICAgICAgICAgICBtVmVydGV4VHlwZXNbbVZlcnRleFR5cGVDb3VudF0udCA9IG51bGw7CisgICAgICAgICAgICBtVmVydGV4VHlwZXNbbVZlcnRleFR5cGVDb3VudF0uZSA9IGU7CisgICAgICAgICAgICBtVmVydGV4VHlwZXNbbVZlcnRleFR5cGVDb3VudF0uc2l6ZSA9IHNpemU7CisgICAgICAgICAgICBtVmVydGV4VHlwZUNvdW50Kys7CisgICAgICAgICAgICByZXR1cm4gYWRkZWRJbmRleDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBpbnQgYWRkSW5kZXhUeXBlKFR5cGUgdCwgUHJpbWl0aXZlIHApIHsKKyAgICAgICAgICAgIGludCBhZGRlZEluZGV4ICA9IG1JbmRleFR5cGVzLnNpemUoKTsKKyAgICAgICAgICAgIEVudHJ5IGluZGV4VHlwZSA9IG5ldyBFbnRyeSgpOworICAgICAgICAgICAgaW5kZXhUeXBlLnQgPSB0OworICAgICAgICAgICAgaW5kZXhUeXBlLmUgPSBudWxsOworICAgICAgICAgICAgaW5kZXhUeXBlLnNpemUgPSAwOworICAgICAgICAgICAgaW5kZXhUeXBlLnByaW0gPSBwOworICAgICAgICAgICAgbUluZGV4VHlwZXMuYWRkRWxlbWVudChpbmRleFR5cGUpOworICAgICAgICAgICAgcmV0dXJuIGFkZGVkSW5kZXg7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgaW50IGFkZEluZGV4VHlwZShQcmltaXRpdmUgcCkgeworICAgICAgICAgICAgaW50IGFkZGVkSW5kZXggID0gbUluZGV4VHlwZXMuc2l6ZSgpOworICAgICAgICAgICAgRW50cnkgaW5kZXhUeXBlID0gbmV3IEVudHJ5KCk7CisgICAgICAgICAgICBpbmRleFR5cGUudCA9IG51bGw7CisgICAgICAgICAgICBpbmRleFR5cGUuZSA9IG51bGw7CisgICAgICAgICAgICBpbmRleFR5cGUuc2l6ZSA9IDA7CisgICAgICAgICAgICBpbmRleFR5cGUucHJpbSA9IHA7CisgICAgICAgICAgICBtSW5kZXhUeXBlcy5hZGRFbGVtZW50KGluZGV4VHlwZSk7CisgICAgICAgICAgICByZXR1cm4gYWRkZWRJbmRleDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBpbnQgYWRkSW5kZXhUeXBlKEVsZW1lbnQgZSwgaW50IHNpemUsIFByaW1pdGl2ZSBwKSB7CisgICAgICAgICAgICBpbnQgYWRkZWRJbmRleCAgPSBtSW5kZXhUeXBlcy5zaXplKCk7CisgICAgICAgICAgICBFbnRyeSBpbmRleFR5cGUgPSBuZXcgRW50cnkoKTsKKyAgICAgICAgICAgIGluZGV4VHlwZS50ID0gbnVsbDsKKyAgICAgICAgICAgIGluZGV4VHlwZS5lID0gZTsKKyAgICAgICAgICAgIGluZGV4VHlwZS5zaXplID0gc2l6ZTsKKyAgICAgICAgICAgIGluZGV4VHlwZS5wcmltID0gcDsKKyAgICAgICAgICAgIG1JbmRleFR5cGVzLmFkZEVsZW1lbnQoaW5kZXhUeXBlKTsKKyAgICAgICAgICAgIHJldHVybiBhZGRlZEluZGV4OworICAgICAgICB9CisKKyAgICAgICAgVHlwZSBuZXdUeXBlKEVsZW1lbnQgZSwgaW50IHNpemUpIHsKKyAgICAgICAgICAgIFR5cGUuQnVpbGRlciB0YiA9IG5ldyBUeXBlLkJ1aWxkZXIobVJTLCBlKTsKKyAgICAgICAgICAgIHRiLmFkZChEaW1lbnNpb24uWCwgc2l6ZSk7CisgICAgICAgICAgICByZXR1cm4gdGIuY3JlYXRlKCk7CisgICAgICAgIH0KKworICAgICAgICBzdGF0aWMgc3luY2hyb25pemVkIE1lc2ggaW50ZXJuYWxDcmVhdGUoUmVuZGVyU2NyaXB0IHJzLCBCdWlsZGVyIGIpIHsKKworICAgICAgICAgICAgaW50IGlkID0gcnMubk1lc2hDcmVhdGUoYi5tVmVydGV4VHlwZUNvdW50LCBiLm1JbmRleFR5cGVzLnNpemUoKSk7CisgICAgICAgICAgICBNZXNoIG5ld01lc2ggPSBuZXcgTWVzaChpZCwgcnMpOworICAgICAgICAgICAgbmV3TWVzaC5tSW5kZXhCdWZmZXJzID0gbmV3IEFsbG9jYXRpb25bYi5tSW5kZXhUeXBlcy5zaXplKCldOworICAgICAgICAgICAgbmV3TWVzaC5tUHJpbWl0aXZlcyA9IG5ldyBQcmltaXRpdmVbYi5tSW5kZXhUeXBlcy5zaXplKCldOworICAgICAgICAgICAgbmV3TWVzaC5tVmVydGV4QnVmZmVycyA9IG5ldyBBbGxvY2F0aW9uW2IubVZlcnRleFR5cGVDb3VudF07CisKKyAgICAgICAgICAgIGZvcihpbnQgY3QgPSAwOyBjdCA8IGIubUluZGV4VHlwZXMuc2l6ZSgpOyBjdCArKykgeworICAgICAgICAgICAgICAgIEFsbG9jYXRpb24gYWxsb2MgPSBudWxsOworICAgICAgICAgICAgICAgIEVudHJ5IGVudHJ5ID0gKEVudHJ5KWIubUluZGV4VHlwZXMuZWxlbWVudEF0KGN0KTsKKyAgICAgICAgICAgICAgICBpZiAoZW50cnkudCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGFsbG9jID0gQWxsb2NhdGlvbi5jcmVhdGVUeXBlZChycywgZW50cnkudCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYoZW50cnkuZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGFsbG9jID0gQWxsb2NhdGlvbi5jcmVhdGVTaXplZChycywgZW50cnkuZSwgZW50cnkuc2l6ZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGludCBhbGxvY0lEID0gKGFsbG9jID09IG51bGwpID8gMCA6IGFsbG9jLmdldElEKCk7CisgICAgICAgICAgICAgICAgcnMubk1lc2hCaW5kSW5kZXgoaWQsIGFsbG9jSUQsIGVudHJ5LnByaW0ubUlELCBjdCk7CisgICAgICAgICAgICAgICAgbmV3TWVzaC5tSW5kZXhCdWZmZXJzW2N0XSA9IGFsbG9jOworICAgICAgICAgICAgICAgIG5ld01lc2gubVByaW1pdGl2ZXNbY3RdID0gZW50cnkucHJpbTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZm9yKGludCBjdCA9IDA7IGN0IDwgYi5tVmVydGV4VHlwZUNvdW50OyBjdCArKykgeworICAgICAgICAgICAgICAgIEFsbG9jYXRpb24gYWxsb2MgPSBudWxsOworICAgICAgICAgICAgICAgIEVudHJ5IGVudHJ5ID0gYi5tVmVydGV4VHlwZXNbY3RdOworICAgICAgICAgICAgICAgIGlmIChlbnRyeS50ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgYWxsb2MgPSBBbGxvY2F0aW9uLmNyZWF0ZVR5cGVkKHJzLCBlbnRyeS50KTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYoZW50cnkuZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGFsbG9jID0gQWxsb2NhdGlvbi5jcmVhdGVTaXplZChycywgZW50cnkuZSwgZW50cnkuc2l6ZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJzLm5NZXNoQmluZFZlcnRleChpZCwgYWxsb2MuZ2V0SUQoKSwgY3QpOworICAgICAgICAgICAgICAgIG5ld01lc2gubVZlcnRleEJ1ZmZlcnNbY3RdID0gYWxsb2M7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiBuZXdNZXNoOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIE1lc2ggY3JlYXRlKCkgeworICAgICAgICAgICAgbVJTLnZhbGlkYXRlKCk7CisgICAgICAgICAgICBNZXNoIHNtID0gaW50ZXJuYWxDcmVhdGUobVJTLCB0aGlzKTsKKyAgICAgICAgICAgIHJldHVybiBzbTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQWxsb2NhdGlvbkJ1aWxkZXIgeworICAgICAgICBSZW5kZXJTY3JpcHQgbVJTOworCisgICAgICAgIGNsYXNzIEVudHJ5IHsKKyAgICAgICAgICAgIEFsbG9jYXRpb24gYTsKKyAgICAgICAgICAgIFByaW1pdGl2ZSBwcmltOworICAgICAgICB9CisKKyAgICAgICAgaW50IG1WZXJ0ZXhUeXBlQ291bnQ7CisgICAgICAgIEVudHJ5W10gbVZlcnRleFR5cGVzOworCisgICAgICAgIFZlY3RvciBtSW5kZXhUeXBlczsKKworICAgICAgICBwdWJsaWMgQWxsb2NhdGlvbkJ1aWxkZXIoUmVuZGVyU2NyaXB0IHJzKSB7CisgICAgICAgICAgICBtUlMgPSByczsKKyAgICAgICAgICAgIG1WZXJ0ZXhUeXBlQ291bnQgPSAwOworICAgICAgICAgICAgbVZlcnRleFR5cGVzID0gbmV3IEVudHJ5WzE2XTsKKyAgICAgICAgICAgIG1JbmRleFR5cGVzID0gbmV3IFZlY3RvcigpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGludCBhZGRWZXJ0ZXhBbGxvY2F0aW9uKEFsbG9jYXRpb24gYSkgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiB7CisgICAgICAgICAgICBpZiAobVZlcnRleFR5cGVDb3VudCA+PSBtVmVydGV4VHlwZXMubGVuZ3RoKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiTWF4IHZlcnRleCB0eXBlcyBleGNlZWRlZC4iKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaW50IGFkZGVkSW5kZXggPSBtVmVydGV4VHlwZUNvdW50OworICAgICAgICAgICAgbVZlcnRleFR5cGVzW21WZXJ0ZXhUeXBlQ291bnRdID0gbmV3IEVudHJ5KCk7CisgICAgICAgICAgICBtVmVydGV4VHlwZXNbbVZlcnRleFR5cGVDb3VudF0uYSA9IGE7CisgICAgICAgICAgICBtVmVydGV4VHlwZUNvdW50Kys7CisgICAgICAgICAgICByZXR1cm4gYWRkZWRJbmRleDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBpbnQgYWRkSW5kZXhBbGxvY2F0aW9uKEFsbG9jYXRpb24gYSwgUHJpbWl0aXZlIHApIHsKKyAgICAgICAgICAgIGludCBhZGRlZEluZGV4ICA9IG1JbmRleFR5cGVzLnNpemUoKTsKKyAgICAgICAgICAgIEVudHJ5IGluZGV4VHlwZSA9IG5ldyBFbnRyeSgpOworICAgICAgICAgICAgaW5kZXhUeXBlLmEgPSBhOworICAgICAgICAgICAgaW5kZXhUeXBlLnByaW0gPSBwOworICAgICAgICAgICAgbUluZGV4VHlwZXMuYWRkRWxlbWVudChpbmRleFR5cGUpOworICAgICAgICAgICAgcmV0dXJuIGFkZGVkSW5kZXg7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgaW50IGFkZEluZGV4VHlwZShQcmltaXRpdmUgcCkgeworICAgICAgICAgICAgaW50IGFkZGVkSW5kZXggID0gbUluZGV4VHlwZXMuc2l6ZSgpOworICAgICAgICAgICAgRW50cnkgaW5kZXhUeXBlID0gbmV3IEVudHJ5KCk7CisgICAgICAgICAgICBpbmRleFR5cGUuYSA9IG51bGw7CisgICAgICAgICAgICBpbmRleFR5cGUucHJpbSA9IHA7CisgICAgICAgICAgICBtSW5kZXhUeXBlcy5hZGRFbGVtZW50KGluZGV4VHlwZSk7CisgICAgICAgICAgICByZXR1cm4gYWRkZWRJbmRleDsKKyAgICAgICAgfQorCisgICAgICAgIHN0YXRpYyBzeW5jaHJvbml6ZWQgTWVzaCBpbnRlcm5hbENyZWF0ZShSZW5kZXJTY3JpcHQgcnMsIEFsbG9jYXRpb25CdWlsZGVyIGIpIHsKKworICAgICAgICAgICAgaW50IGlkID0gcnMubk1lc2hDcmVhdGUoYi5tVmVydGV4VHlwZUNvdW50LCBiLm1JbmRleFR5cGVzLnNpemUoKSk7CisgICAgICAgICAgICBNZXNoIG5ld01lc2ggPSBuZXcgTWVzaChpZCwgcnMpOworICAgICAgICAgICAgbmV3TWVzaC5tSW5kZXhCdWZmZXJzID0gbmV3IEFsbG9jYXRpb25bYi5tSW5kZXhUeXBlcy5zaXplKCldOworICAgICAgICAgICAgbmV3TWVzaC5tUHJpbWl0aXZlcyA9IG5ldyBQcmltaXRpdmVbYi5tSW5kZXhUeXBlcy5zaXplKCldOworICAgICAgICAgICAgbmV3TWVzaC5tVmVydGV4QnVmZmVycyA9IG5ldyBBbGxvY2F0aW9uW2IubVZlcnRleFR5cGVDb3VudF07CisKKyAgICAgICAgICAgIGZvcihpbnQgY3QgPSAwOyBjdCA8IGIubUluZGV4VHlwZXMuc2l6ZSgpOyBjdCArKykgeworICAgICAgICAgICAgICAgIEVudHJ5IGVudHJ5ID0gKEVudHJ5KWIubUluZGV4VHlwZXMuZWxlbWVudEF0KGN0KTsKKyAgICAgICAgICAgICAgICBpbnQgYWxsb2NJRCA9IChlbnRyeS5hID09IG51bGwpID8gMCA6IGVudHJ5LmEuZ2V0SUQoKTsKKyAgICAgICAgICAgICAgICBycy5uTWVzaEJpbmRJbmRleChpZCwgYWxsb2NJRCwgZW50cnkucHJpbS5tSUQsIGN0KTsKKyAgICAgICAgICAgICAgICBuZXdNZXNoLm1JbmRleEJ1ZmZlcnNbY3RdID0gZW50cnkuYTsKKyAgICAgICAgICAgICAgICBuZXdNZXNoLm1QcmltaXRpdmVzW2N0XSA9IGVudHJ5LnByaW07CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZvcihpbnQgY3QgPSAwOyBjdCA8IGIubVZlcnRleFR5cGVDb3VudDsgY3QgKyspIHsKKyAgICAgICAgICAgICAgICBFbnRyeSBlbnRyeSA9IGIubVZlcnRleFR5cGVzW2N0XTsKKyAgICAgICAgICAgICAgICBycy5uTWVzaEJpbmRWZXJ0ZXgoaWQsIGVudHJ5LmEubUlELCBjdCk7CisgICAgICAgICAgICAgICAgbmV3TWVzaC5tVmVydGV4QnVmZmVyc1tjdF0gPSBlbnRyeS5hOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gbmV3TWVzaDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBNZXNoIGNyZWF0ZSgpIHsKKyAgICAgICAgICAgIG1SUy52YWxpZGF0ZSgpOworICAgICAgICAgICAgTWVzaCBzbSA9IGludGVybmFsQ3JlYXRlKG1SUywgdGhpcyk7CisgICAgICAgICAgICByZXR1cm4gc207CisgICAgICAgIH0KKyAgICB9CisKKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgVHJpYW5nbGVNZXNoQnVpbGRlciB7CisgICAgICAgIGZsb2F0IG1WdHhEYXRhW107CisgICAgICAgIGludCBtVnR4Q291bnQ7CisgICAgICAgIHNob3J0IG1JbmRleERhdGFbXTsKKyAgICAgICAgaW50IG1JbmRleENvdW50OworICAgICAgICBSZW5kZXJTY3JpcHQgbVJTOworICAgICAgICBFbGVtZW50IG1FbGVtZW50OworCisgICAgICAgIGZsb2F0IG1OWCA9IDA7CisgICAgICAgIGZsb2F0IG1OWSA9IDA7CisgICAgICAgIGZsb2F0IG1OWiA9IC0xOworICAgICAgICBmbG9hdCBtUzAgPSAwOworICAgICAgICBmbG9hdCBtVDAgPSAwOworICAgICAgICBmbG9hdCBtUiA9IDE7CisgICAgICAgIGZsb2F0IG1HID0gMTsKKyAgICAgICAgZmxvYXQgbUIgPSAxOworICAgICAgICBmbG9hdCBtQSA9IDE7CisKKyAgICAgICAgaW50IG1WdHhTaXplOworICAgICAgICBpbnQgbUZsYWdzOworCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENPTE9SID0gMHgwMDAxOworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBOT1JNQUwgPSAweDAwMDI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRFWFRVUkVfMCA9IDB4MDEwMDsKKworICAgICAgICBwdWJsaWMgVHJpYW5nbGVNZXNoQnVpbGRlcihSZW5kZXJTY3JpcHQgcnMsIGludCB2dHhTaXplLCBpbnQgZmxhZ3MpIHsKKyAgICAgICAgICAgIG1SUyA9IHJzOworICAgICAgICAgICAgbVZ0eENvdW50ID0gMDsKKyAgICAgICAgICAgIG1JbmRleENvdW50ID0gMDsKKyAgICAgICAgICAgIG1WdHhEYXRhID0gbmV3IGZsb2F0WzEyOF07CisgICAgICAgICAgICBtSW5kZXhEYXRhID0gbmV3IHNob3J0WzEyOF07CisgICAgICAgICAgICBtVnR4U2l6ZSA9IHZ0eFNpemU7CisgICAgICAgICAgICBtRmxhZ3MgPSBmbGFnczsKKworICAgICAgICAgICAgaWYgKHZ0eFNpemUgPCAyIHx8IHZ0eFNpemUgPiAzKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVmVydGV4IHNpemUgb3V0IG9mIHJhbmdlLiIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSB2b2lkIG1ha2VTcGFjZShpbnQgY291bnQpIHsKKyAgICAgICAgICAgIGlmICgobVZ0eENvdW50ICsgY291bnQpID49IG1WdHhEYXRhLmxlbmd0aCkgeworICAgICAgICAgICAgICAgIGZsb2F0IHRbXSA9IG5ldyBmbG9hdFttVnR4RGF0YS5sZW5ndGggKiAyXTsKKyAgICAgICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KG1WdHhEYXRhLCAwLCB0LCAwLCBtVnR4RGF0YS5sZW5ndGgpOworICAgICAgICAgICAgICAgIG1WdHhEYXRhID0gdDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgdm9pZCBsYXRjaCgpIHsKKyAgICAgICAgICAgIGlmICgobUZsYWdzICYgQ09MT1IpICE9IDApIHsKKyAgICAgICAgICAgICAgICBtYWtlU3BhY2UoNCk7CisgICAgICAgICAgICAgICAgbVZ0eERhdGFbbVZ0eENvdW50KytdID0gbVI7CisgICAgICAgICAgICAgICAgbVZ0eERhdGFbbVZ0eENvdW50KytdID0gbUc7CisgICAgICAgICAgICAgICAgbVZ0eERhdGFbbVZ0eENvdW50KytdID0gbUI7CisgICAgICAgICAgICAgICAgbVZ0eERhdGFbbVZ0eENvdW50KytdID0gbUE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoKG1GbGFncyAmIFRFWFRVUkVfMCkgIT0gMCkgeworICAgICAgICAgICAgICAgIG1ha2VTcGFjZSgyKTsKKyAgICAgICAgICAgICAgICBtVnR4RGF0YVttVnR4Q291bnQrK10gPSBtUzA7CisgICAgICAgICAgICAgICAgbVZ0eERhdGFbbVZ0eENvdW50KytdID0gbVQwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKChtRmxhZ3MgJiBOT1JNQUwpICE9IDApIHsKKyAgICAgICAgICAgICAgICBtYWtlU3BhY2UoMyk7CisgICAgICAgICAgICAgICAgbVZ0eERhdGFbbVZ0eENvdW50KytdID0gbU5YOworICAgICAgICAgICAgICAgIG1WdHhEYXRhW21WdHhDb3VudCsrXSA9IG1OWTsKKyAgICAgICAgICAgICAgICBtVnR4RGF0YVttVnR4Q291bnQrK10gPSBtTlo7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBhZGRWZXJ0ZXgoZmxvYXQgeCwgZmxvYXQgeSkgeworICAgICAgICAgICAgaWYgKG1WdHhTaXplICE9IDIpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJhZGQgbWlzdG1hdGNoIHdpdGggZGVjbGFyZWQgY29tcG9uZW50cy4iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1ha2VTcGFjZSgyKTsKKyAgICAgICAgICAgIG1WdHhEYXRhW21WdHhDb3VudCsrXSA9IHg7CisgICAgICAgICAgICBtVnR4RGF0YVttVnR4Q291bnQrK10gPSB5OworICAgICAgICAgICAgbGF0Y2goKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIGFkZFZlcnRleChmbG9hdCB4LCBmbG9hdCB5LCBmbG9hdCB6KSB7CisgICAgICAgICAgICBpZiAobVZ0eFNpemUgIT0gMykgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oImFkZCBtaXN0bWF0Y2ggd2l0aCBkZWNsYXJlZCBjb21wb25lbnRzLiIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbWFrZVNwYWNlKDMpOworICAgICAgICAgICAgbVZ0eERhdGFbbVZ0eENvdW50KytdID0geDsKKyAgICAgICAgICAgIG1WdHhEYXRhW21WdHhDb3VudCsrXSA9IHk7CisgICAgICAgICAgICBtVnR4RGF0YVttVnR4Q291bnQrK10gPSB6OworICAgICAgICAgICAgbGF0Y2goKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHNldFRleHR1cmUoZmxvYXQgcywgZmxvYXQgdCkgeworICAgICAgICAgICAgaWYgKChtRmxhZ3MgJiBURVhUVVJFXzApID09IDApIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJhZGQgbWlzdG1hdGNoIHdpdGggZGVjbGFyZWQgY29tcG9uZW50cy4iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1TMCA9IHM7CisgICAgICAgICAgICBtVDAgPSB0OworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgc2V0Tm9ybWFsKGZsb2F0IHgsIGZsb2F0IHksIGZsb2F0IHopIHsKKyAgICAgICAgICAgIGlmICgobUZsYWdzICYgTk9STUFMKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiYWRkIG1pc3RtYXRjaCB3aXRoIGRlY2xhcmVkIGNvbXBvbmVudHMuIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtTlggPSB4OworICAgICAgICAgICAgbU5ZID0geTsKKyAgICAgICAgICAgIG1OWiA9IHo7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBzZXRDb2xvcihmbG9hdCByLCBmbG9hdCBnLCBmbG9hdCBiLCBmbG9hdCBhKSB7CisgICAgICAgICAgICBpZiAoKG1GbGFncyAmIENPTE9SKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiYWRkIG1pc3RtYXRjaCB3aXRoIGRlY2xhcmVkIGNvbXBvbmVudHMuIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtUiA9IHI7CisgICAgICAgICAgICBtRyA9IGc7CisgICAgICAgICAgICBtQiA9IGI7CisgICAgICAgICAgICBtQSA9IGE7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBhZGRUcmlhbmdsZShpbnQgaWR4MSwgaW50IGlkeDIsIGludCBpZHgzKSB7CisgICAgICAgICAgICBpZigoaWR4MSA+PSBtVnR4Q291bnQpIHx8IChpZHgxIDwgMCkgfHwKKyAgICAgICAgICAgICAgIChpZHgyID49IG1WdHhDb3VudCkgfHwgKGlkeDIgPCAwKSB8fAorICAgICAgICAgICAgICAgKGlkeDMgPj0gbVZ0eENvdW50KSB8fCAoaWR4MyA8IDApKSB7CisgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJJbmRleCBwcm92aWRlZCBncmVhdGVyIHRoYW4gdmVydGV4IGNvdW50LiIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKChtSW5kZXhDb3VudCArIDMpID49IG1JbmRleERhdGEubGVuZ3RoKSB7CisgICAgICAgICAgICAgICAgc2hvcnQgdFtdID0gbmV3IHNob3J0W21JbmRleERhdGEubGVuZ3RoICogMl07CisgICAgICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weShtSW5kZXhEYXRhLCAwLCB0LCAwLCBtSW5kZXhEYXRhLmxlbmd0aCk7CisgICAgICAgICAgICAgICAgbUluZGV4RGF0YSA9IHQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtSW5kZXhEYXRhW21JbmRleENvdW50KytdID0gKHNob3J0KWlkeDE7CisgICAgICAgICAgICBtSW5kZXhEYXRhW21JbmRleENvdW50KytdID0gKHNob3J0KWlkeDI7CisgICAgICAgICAgICBtSW5kZXhEYXRhW21JbmRleENvdW50KytdID0gKHNob3J0KWlkeDM7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgTWVzaCBjcmVhdGUoYm9vbGVhbiB1cGxvYWRUb0J1ZmZlck9iamVjdCkgeworICAgICAgICAgICAgRWxlbWVudC5CdWlsZGVyIGIgPSBuZXcgRWxlbWVudC5CdWlsZGVyKG1SUyk7CisgICAgICAgICAgICBpbnQgZmxvYXRDb3VudCA9IG1WdHhTaXplOworICAgICAgICAgICAgYi5hZGQoRWxlbWVudC5jcmVhdGVWZWN0b3IobVJTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRWxlbWVudC5EYXRhVHlwZS5GTE9BVF8zMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1WdHhTaXplKSwgInBvc2l0aW9uIik7CisgICAgICAgICAgICBpZiAoKG1GbGFncyAmIENPTE9SKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgZmxvYXRDb3VudCArPSA0OworICAgICAgICAgICAgICAgIGIuYWRkKEVsZW1lbnQuRjMyXzQobVJTKSwgImNvbG9yIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoKG1GbGFncyAmIFRFWFRVUkVfMCkgIT0gMCkgeworICAgICAgICAgICAgICAgIGZsb2F0Q291bnQgKz0gMjsKKyAgICAgICAgICAgICAgICBiLmFkZChFbGVtZW50LkYzMl8yKG1SUyksICJ0ZXh0dXJlMCIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKChtRmxhZ3MgJiBOT1JNQUwpICE9IDApIHsKKyAgICAgICAgICAgICAgICBmbG9hdENvdW50ICs9IDM7CisgICAgICAgICAgICAgICAgYi5hZGQoRWxlbWVudC5GMzJfMyhtUlMpLCAibm9ybWFsIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtRWxlbWVudCA9IGIuY3JlYXRlKCk7CisKKyAgICAgICAgICAgIEJ1aWxkZXIgc21iID0gbmV3IEJ1aWxkZXIobVJTKTsKKyAgICAgICAgICAgIHNtYi5hZGRWZXJ0ZXhUeXBlKG1FbGVtZW50LCBtVnR4Q291bnQgLyBmbG9hdENvdW50KTsKKyAgICAgICAgICAgIHNtYi5hZGRJbmRleFR5cGUoRWxlbWVudC5VMTYobVJTKSwgbUluZGV4Q291bnQsIFByaW1pdGl2ZS5UUklBTkdMRSk7CisKKyAgICAgICAgICAgIE1lc2ggc20gPSBzbWIuY3JlYXRlKCk7CisKKyAgICAgICAgICAgIHNtLmdldFZlcnRleEFsbG9jYXRpb24oMCkuZGF0YShtVnR4RGF0YSk7CisgICAgICAgICAgICBpZih1cGxvYWRUb0J1ZmZlck9iamVjdCkgeworICAgICAgICAgICAgICAgIHNtLmdldFZlcnRleEFsbG9jYXRpb24oMCkudXBsb2FkVG9CdWZmZXJPYmplY3QoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc20uZ2V0SW5kZXhBbGxvY2F0aW9uKDApLmRhdGEobUluZGV4RGF0YSk7CisgICAgICAgICAgICBzbS5nZXRJbmRleEFsbG9jYXRpb24oMCkudXBsb2FkVG9CdWZmZXJPYmplY3QoKTsKKworICAgICAgICAgICAgcmV0dXJuIHNtOworICAgICAgICB9CisgICAgfQorfQorCmRpZmYgLS1naXQgYS9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L1Byb2dyYW0uamF2YSBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvUHJvZ3JhbS5qYXZhCmluZGV4IDE2MTRlYzUuLmM2ZWQ3MmEgMTAwNjQ0Ci0tLSBhL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvUHJvZ3JhbS5qYXZhCisrKyBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvUHJvZ3JhbS5qYXZhCkBAIC0xNyw2ICsxNywxMSBAQAogcGFja2FnZSBhbmRyb2lkLnJlbmRlcnNjcmlwdDsKIAogCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbjsKKworaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuUmVzb3VyY2VzOwogaW1wb3J0IGFuZHJvaWQudXRpbC5Db25maWc7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKIApAQCAtMzgsOCArNDMsNyBAQAogICAgIFN0cmluZyBtU2hhZGVyOwogCiAgICAgUHJvZ3JhbShpbnQgaWQsIFJlbmRlclNjcmlwdCBycykgewotICAgICAgICBzdXBlcihycyk7Ci0gICAgICAgIG1JRCA9IGlkOworICAgICAgICBzdXBlcihpZCwgcnMpOwogICAgIH0KIAogICAgIHB1YmxpYyB2b2lkIGJpbmRDb25zdGFudHMoQWxsb2NhdGlvbiBhLCBpbnQgc2xvdCkgewpAQCAtOTEsOCArOTUsNDcgQEAKICAgICAgICAgICAgIG1UZXh0dXJlQ291bnQgPSAwOwogICAgICAgICB9CiAKLSAgICAgICAgcHVibGljIHZvaWQgc2V0U2hhZGVyKFN0cmluZyBzKSB7CisgICAgICAgIHB1YmxpYyBCYXNlUHJvZ3JhbUJ1aWxkZXIgc2V0U2hhZGVyKFN0cmluZyBzKSB7CiAgICAgICAgICAgICBtU2hhZGVyID0gczsKKyAgICAgICAgICAgIHJldHVybiB0aGlzOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIEJhc2VQcm9ncmFtQnVpbGRlciBzZXRTaGFkZXIoUmVzb3VyY2VzIHJlc291cmNlcywgaW50IHJlc291cmNlSUQpIHsKKyAgICAgICAgICAgIGJ5dGVbXSBzdHI7CisgICAgICAgICAgICBpbnQgc3RyTGVuZ3RoOworICAgICAgICAgICAgSW5wdXRTdHJlYW0gaXMgPSByZXNvdXJjZXMub3BlblJhd1Jlc291cmNlKHJlc291cmNlSUQpOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBzdHIgPSBuZXcgYnl0ZVsxMDI0XTsKKyAgICAgICAgICAgICAgICAgICAgc3RyTGVuZ3RoID0gMDsKKyAgICAgICAgICAgICAgICAgICAgd2hpbGUodHJ1ZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJ5dGVzTGVmdCA9IHN0ci5sZW5ndGggLSBzdHJMZW5ndGg7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYnl0ZXNMZWZ0ID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBieXRlW10gYnVmMiA9IG5ldyBieXRlW3N0ci5sZW5ndGggKiAyXTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KHN0ciwgMCwgYnVmMiwgMCwgc3RyLmxlbmd0aCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyID0gYnVmMjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBieXRlc0xlZnQgPSBzdHIubGVuZ3RoIC0gc3RyTGVuZ3RoOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJ5dGVzUmVhZCA9IGlzLnJlYWQoc3RyLCBzdHJMZW5ndGgsIGJ5dGVzTGVmdCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYnl0ZXNSZWFkIDw9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIHN0ckxlbmd0aCArPSBieXRlc1JlYWQ7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgICAgICBpcy5jbG9zZSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gY2F0Y2goSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBSZXNvdXJjZXMuTm90Rm91bmRFeGNlcHRpb24oKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBtU2hhZGVyID0gbmV3IFN0cmluZyhzdHIsIDAsIHN0ckxlbmd0aCwgIlVURi04Iik7CisgICAgICAgICAgICB9IGNhdGNoIChVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBMb2cuZSgiUmVuZGVyc2NyaXB0IHNoYWRlciBjcmVhdGlvbiIsICJDb3VsZCBub3QgZGVjb2RlIHNoYWRlciBzdHJpbmciKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgIH0KIAogICAgICAgICBwdWJsaWMgdm9pZCBhZGRJbnB1dChFbGVtZW50IGUpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gewpAQCAtMTIwLDEyICsxNjMsMTMgQEAKICAgICAgICAgICAgIHJldHVybiBtQ29uc3RhbnRDb3VudCsrOwogICAgICAgICB9CiAKLSAgICAgICAgcHVibGljIHZvaWQgc2V0VGV4dHVyZUNvdW50KGludCBjb3VudCkgdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB7CisgICAgICAgIHB1YmxpYyBCYXNlUHJvZ3JhbUJ1aWxkZXIgc2V0VGV4dHVyZUNvdW50KGludCBjb3VudCkgdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB7CiAgICAgICAgICAgICAvLyBTaG91bGQgY2hlY2sgZm9yIGNvbnNpc3RhbnQgYW5kIG5vbi1jb25mbGljdGluZyBuYW1lcy4uLgogICAgICAgICAgICAgaWYoY291bnQgPj0gTUFYX0NPTlNUQU5UKSB7CiAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiTWF4IHRleHR1cmUgY291bnQgZXhjZWVkZWQuIik7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBtVGV4dHVyZUNvdW50ID0gY291bnQ7CisgICAgICAgICAgICByZXR1cm4gdGhpczsKICAgICAgICAgfQogCiAgICAgICAgIHByb3RlY3RlZCB2b2lkIGluaXRQcm9ncmFtKFByb2dyYW0gcCkgewpkaWZmIC0tZ2l0IGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9Qcm9ncmFtRnJhZ21lbnQuamF2YSBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvUHJvZ3JhbUZyYWdtZW50LmphdmEKaW5kZXggNWUwNGYwYy4uMDBjNWNmMSAxMDA2NDQKLS0tIGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9Qcm9ncmFtRnJhZ21lbnQuamF2YQorKysgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L1Byb2dyYW1GcmFnbWVudC5qYXZhCkBAIC02MiwxMCArNjIsMTEgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQnVpbGRlciB7CisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBCdWlsZGVyIGV4dGVuZHMgU2hhZGVyQnVpbGRlciB7CiAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1BWF9URVhUVVJFID0gMjsKLSAgICAgICAgUmVuZGVyU2NyaXB0IG1SUzsKKyAgICAgICAgaW50IG1OdW1UZXh0dXJlczsKICAgICAgICAgYm9vbGVhbiBtUG9pbnRTcHJpdGVFbmFibGU7CisgICAgICAgIGJvb2xlYW4gbVZhcnlpbmdDb2xvckVuYWJsZTsKIAogICAgICAgICBwdWJsaWMgZW51bSBFbnZNb2RlIHsKICAgICAgICAgICAgIFJFUExBQ0UgKDEpLApAQCAtMTAwLDM5ICsxMDEsMTI1IEBACiAgICAgICAgIH0KICAgICAgICAgU2xvdFtdIG1TbG90czsKIAorICAgICAgICBwcml2YXRlIHZvaWQgYnVpbGRTaGFkZXJTdHJpbmcoKSB7CisgICAgICAgICAgICBtU2hhZGVyICA9ICIvL3JzX3NoYWRlcl9pbnRlcm5hbFxuIjsKKyAgICAgICAgICAgIG1TaGFkZXIgKz0gInZhcnlpbmcgbG93cCB2ZWM0IHZhckNvbG9yO1xuIjsKKyAgICAgICAgICAgIG1TaGFkZXIgKz0gInZhcnlpbmcgdmVjNCB2YXJUZXgwO1xuIjsKKworICAgICAgICAgICAgbVNoYWRlciArPSAidm9pZCBtYWluKCkge1xuIjsKKyAgICAgICAgICAgIGlmIChtVmFyeWluZ0NvbG9yRW5hYmxlKSB7CisgICAgICAgICAgICAgICAgbVNoYWRlciArPSAiICBsb3dwIHZlYzQgY29sID0gdmFyQ29sb3I7XG4iOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBtU2hhZGVyICs9ICIgIGxvd3AgdmVjNCBjb2wgPSBVTklfQ29sb3I7XG4iOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAobU51bVRleHR1cmVzICE9IDApIHsKKyAgICAgICAgICAgICAgICBpZiAobVBvaW50U3ByaXRlRW5hYmxlKSB7CisgICAgICAgICAgICAgICAgICAgIG1TaGFkZXIgKz0gIiAgdmVjMiB0MCA9IGdsX1BvaW50Q29vcmQ7XG4iOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIG1TaGFkZXIgKz0gIiAgdmVjMiB0MCA9IHZhclRleDAueHk7XG4iOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZm9yKGludCBpID0gMDsgaSA8IG1OdW1UZXh0dXJlczsgaSArKykgeworICAgICAgICAgICAgICAgIHN3aXRjaChtU2xvdHNbaV0uZW52KSB7CisgICAgICAgICAgICAgICAgY2FzZSBSRVBMQUNFOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKG1TbG90c1tpXS5mb3JtYXQpIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBBTFBIQToKKyAgICAgICAgICAgICAgICAgICAgICAgIG1TaGFkZXIgKz0gIiAgY29sLmEgPSB0ZXh0dXJlMkQoVU5JX1RleDAsIHQwKS5hO1xuIjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIExVTUlOQU5DRV9BTFBIQToKKyAgICAgICAgICAgICAgICAgICAgICAgIG1TaGFkZXIgKz0gIiAgY29sLnJnYmEgPSB0ZXh0dXJlMkQoVU5JX1RleDAsIHQwKS5yZ2JhO1xuIjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIFJHQjoKKyAgICAgICAgICAgICAgICAgICAgICAgIG1TaGFkZXIgKz0gIiAgY29sLnJnYiA9IHRleHR1cmUyRChVTklfVGV4MCwgdDApLnJnYjtcbiI7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBSR0JBOgorICAgICAgICAgICAgICAgICAgICAgICAgbVNoYWRlciArPSAiICBjb2wucmdiYSA9IHRleHR1cmUyRChVTklfVGV4MCwgdDApLnJnYmE7XG4iOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBNT0RVTEFURToKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChtU2xvdHNbaV0uZm9ybWF0KSB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgQUxQSEE6CisgICAgICAgICAgICAgICAgICAgICAgICBtU2hhZGVyICs9ICIgIGNvbC5hICo9IHRleHR1cmUyRChVTklfVGV4MCwgdDApLmE7XG4iOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgTFVNSU5BTkNFX0FMUEhBOgorICAgICAgICAgICAgICAgICAgICAgICAgbVNoYWRlciArPSAiICBjb2wucmdiYSAqPSB0ZXh0dXJlMkQoVU5JX1RleDAsIHQwKS5yZ2JhO1xuIjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIFJHQjoKKyAgICAgICAgICAgICAgICAgICAgICAgIG1TaGFkZXIgKz0gIiAgY29sLnJnYiAqPSB0ZXh0dXJlMkQoVU5JX1RleDAsIHQwKS5yZ2I7XG4iOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgUkdCQToKKyAgICAgICAgICAgICAgICAgICAgICAgIG1TaGFkZXIgKz0gIiAgY29sLnJnYmEgKj0gdGV4dHVyZTJEKFVOSV9UZXgwLCB0MCkucmdiYTtcbiI7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIERFQ0FMOgorICAgICAgICAgICAgICAgICAgICBtU2hhZGVyICs9ICIgIGNvbCA9IHRleHR1cmUyRChVTklfVGV4MCwgdDApO1xuIjsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBtU2hhZGVyICs9ICIgIGdsX0ZyYWdDb2xvciA9IGNvbDtcbiI7CisgICAgICAgICAgICBtU2hhZGVyICs9ICJ9XG4iOworICAgICAgICB9CisKICAgICAgICAgcHVibGljIEJ1aWxkZXIoUmVuZGVyU2NyaXB0IHJzKSB7CisgICAgICAgICAgICBzdXBlcihycyk7CiAgICAgICAgICAgICBtUlMgPSByczsKICAgICAgICAgICAgIG1TbG90cyA9IG5ldyBTbG90W01BWF9URVhUVVJFXTsKICAgICAgICAgICAgIG1Qb2ludFNwcml0ZUVuYWJsZSA9IGZhbHNlOwogICAgICAgICB9CiAKLSAgICAgICAgcHVibGljIHZvaWQgc2V0VGV4dHVyZShFbnZNb2RlIGVudiwgRm9ybWF0IGZtdCwgaW50IHNsb3QpCisgICAgICAgIHB1YmxpYyBCdWlsZGVyIHNldFRleHR1cmUoRW52TW9kZSBlbnYsIEZvcm1hdCBmbXQsIGludCBzbG90KQogICAgICAgICAgICAgdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB7CiAgICAgICAgICAgICBpZigoc2xvdCA8IDApIHx8IChzbG90ID49IE1BWF9URVhUVVJFKSkgewogICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIk1BWF9URVhUVVJFIGV4Y2VlZGVkLiIpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgbVNsb3RzW3Nsb3RdID0gbmV3IFNsb3QoZW52LCBmbXQpOworICAgICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgIH0KIAotICAgICAgICBwdWJsaWMgdm9pZCBzZXRQb2ludFNwcml0ZVRleENvb3JkaW5hdGVSZXBsYWNlbWVudChib29sZWFuIGVuYWJsZSkgeworICAgICAgICBwdWJsaWMgQnVpbGRlciBzZXRQb2ludFNwcml0ZVRleENvb3JkaW5hdGVSZXBsYWNlbWVudChib29sZWFuIGVuYWJsZSkgewogICAgICAgICAgICAgbVBvaW50U3ByaXRlRW5hYmxlID0gZW5hYmxlOworICAgICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgIH0KIAorICAgICAgICBwdWJsaWMgQnVpbGRlciBzZXRWYXJ5aW5nQ29sb3IoYm9vbGVhbiBlbmFibGUpIHsKKyAgICAgICAgICAgIG1WYXJ5aW5nQ29sb3JFbmFibGUgPSBlbmFibGU7CisgICAgICAgICAgICByZXR1cm4gdGhpczsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQogICAgICAgICBwdWJsaWMgUHJvZ3JhbUZyYWdtZW50IGNyZWF0ZSgpIHsKLSAgICAgICAgICAgIG1SUy52YWxpZGF0ZSgpOwotICAgICAgICAgICAgaW50W10gdG1wID0gbmV3IGludFtNQVhfVEVYVFVSRSAqIDIgKyAxXTsKLSAgICAgICAgICAgIGlmIChtU2xvdHNbMF0gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRtcFswXSA9IG1TbG90c1swXS5lbnYubUlEOwotICAgICAgICAgICAgICAgIHRtcFsxXSA9IG1TbG90c1swXS5mb3JtYXQubUlEOworICAgICAgICAgICAgbU51bVRleHR1cmVzID0gMDsKKyAgICAgICAgICAgIGZvcihpbnQgaSA9IDA7IGkgPCBNQVhfVEVYVFVSRTsgaSArKykgeworICAgICAgICAgICAgICAgIGlmKG1TbG90c1tpXSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIG1OdW1UZXh0dXJlcyArKzsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAobVNsb3RzWzFdICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0bXBbMl0gPSBtU2xvdHNbMV0uZW52Lm1JRDsKLSAgICAgICAgICAgICAgICB0bXBbM10gPSBtU2xvdHNbMV0uZm9ybWF0Lm1JRDsKKyAgICAgICAgICAgIGJ1aWxkU2hhZGVyU3RyaW5nKCk7CisgICAgICAgICAgICBUeXBlIGNvbnN0VHlwZSA9IG51bGw7CisgICAgICAgICAgICBpZiAoIW1WYXJ5aW5nQ29sb3JFbmFibGUpIHsKKyAgICAgICAgICAgICAgICBFbGVtZW50LkJ1aWxkZXIgYiA9IG5ldyBFbGVtZW50LkJ1aWxkZXIobVJTKTsKKyAgICAgICAgICAgICAgICBiLmFkZChFbGVtZW50LkYzMl80KG1SUyksICJDb2xvciIpOworICAgICAgICAgICAgICAgIFR5cGUuQnVpbGRlciB0eXBlQnVpbGRlciA9IG5ldyBUeXBlLkJ1aWxkZXIobVJTLCBiLmNyZWF0ZSgpKTsKKyAgICAgICAgICAgICAgICB0eXBlQnVpbGRlci5hZGQoRGltZW5zaW9uLlgsIDEpOworICAgICAgICAgICAgICAgIGNvbnN0VHlwZSA9IHR5cGVCdWlsZGVyLmNyZWF0ZSgpOworICAgICAgICAgICAgICAgIGFkZENvbnN0YW50KGNvbnN0VHlwZSk7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB0bXBbNF0gPSBtUG9pbnRTcHJpdGVFbmFibGUgPyAxIDogMDsKLSAgICAgICAgICAgIGludCBpZCA9IG1SUy5uUHJvZ3JhbUZyYWdtZW50Q3JlYXRlKHRtcCk7Ci0gICAgICAgICAgICBQcm9ncmFtRnJhZ21lbnQgcGYgPSBuZXcgUHJvZ3JhbUZyYWdtZW50KGlkLCBtUlMpOworICAgICAgICAgICAgc2V0VGV4dHVyZUNvdW50KG1OdW1UZXh0dXJlcyk7CisKKyAgICAgICAgICAgIFByb2dyYW1GcmFnbWVudCBwZiA9IHN1cGVyLmNyZWF0ZSgpOwogICAgICAgICAgICAgcGYubVRleHR1cmVDb3VudCA9IE1BWF9URVhUVVJFOworICAgICAgICAgICAgaWYgKCFtVmFyeWluZ0NvbG9yRW5hYmxlKSB7CisgICAgICAgICAgICAgICAgQWxsb2NhdGlvbiBjb25zdGFudERhdGEgPSBBbGxvY2F0aW9uLmNyZWF0ZVR5cGVkKG1SUyxjb25zdFR5cGUpOworICAgICAgICAgICAgICAgIGZsb2F0W10gZGF0YSA9IG5ldyBmbG9hdFs0XTsKKyAgICAgICAgICAgICAgICBkYXRhWzBdID0gZGF0YVsxXSA9IGRhdGFbMl0gPSBkYXRhWzNdID0gMS4wZjsKKyAgICAgICAgICAgICAgICBjb25zdGFudERhdGEuZGF0YShkYXRhKTsKKyAgICAgICAgICAgICAgICBwZi5iaW5kQ29uc3RhbnRzKGNvbnN0YW50RGF0YSwgMCk7CisgICAgICAgICAgICB9CiAgICAgICAgICAgICByZXR1cm4gcGY7CiAgICAgICAgIH0KICAgICB9CmRpZmYgLS1naXQgYS9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L1Byb2dyYW1SYXN0ZXIuamF2YSBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvUHJvZ3JhbVJhc3Rlci5qYXZhCmluZGV4IDU2ZjliZjQuLjc5MWRhYzggMTAwNjQ0Ci0tLSBhL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvUHJvZ3JhbVJhc3Rlci5qYXZhCisrKyBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvUHJvZ3JhbVJhc3Rlci5qYXZhCkBAIC0yNiw3NiArMjYsMTEzIEBACiAgKgogICoqLwogcHVibGljIGNsYXNzIFByb2dyYW1SYXN0ZXIgZXh0ZW5kcyBCYXNlT2JqIHsKKworICAgIHB1YmxpYyBlbnVtIEN1bGxNb2RlIHsKKyAgICAgICAgQkFDSyAoMCksCisgICAgICAgIEZST05UICgxKSwKKyAgICAgICAgTk9ORSAoMik7CisKKyAgICAgICAgaW50IG1JRDsKKyAgICAgICAgQ3VsbE1vZGUoaW50IGlkKSB7CisgICAgICAgICAgICBtSUQgPSBpZDsKKyAgICAgICAgfQorICAgIH0KKwogICAgIGJvb2xlYW4gbVBvaW50U21vb3RoOwogICAgIGJvb2xlYW4gbUxpbmVTbW9vdGg7CiAgICAgYm9vbGVhbiBtUG9pbnRTcHJpdGU7Ci0gICAgZmxvYXQgbVBvaW50U2l6ZTsKICAgICBmbG9hdCBtTGluZVdpZHRoOwotICAgIEVsZW1lbnQgbUluOwotICAgIEVsZW1lbnQgbU91dDsKKyAgICBDdWxsTW9kZSBtQ3VsbE1vZGU7CiAKICAgICBQcm9ncmFtUmFzdGVyKGludCBpZCwgUmVuZGVyU2NyaXB0IHJzKSB7Ci0gICAgICAgIHN1cGVyKHJzKTsKLSAgICAgICAgbUlEID0gaWQ7CisgICAgICAgIHN1cGVyKGlkLCBycyk7CiAKLSAgICAgICAgbVBvaW50U2l6ZSA9IDEuMGY7CiAgICAgICAgIG1MaW5lV2lkdGggPSAxLjBmOwogICAgICAgICBtUG9pbnRTbW9vdGggPSBmYWxzZTsKICAgICAgICAgbUxpbmVTbW9vdGggPSBmYWxzZTsKICAgICAgICAgbVBvaW50U3ByaXRlID0gZmFsc2U7CisKKyAgICAgICAgbUN1bGxNb2RlID0gQ3VsbE1vZGUuQkFDSzsKICAgICB9CiAKLSAgICBwdWJsaWMgdm9pZCBzZXRMaW5lV2lkdGgoZmxvYXQgdykgeworICAgIHZvaWQgc2V0TGluZVdpZHRoKGZsb2F0IHcpIHsKICAgICAgICAgbVJTLnZhbGlkYXRlKCk7CiAgICAgICAgIG1MaW5lV2lkdGggPSB3OwogICAgICAgICBtUlMublByb2dyYW1SYXN0ZXJTZXRMaW5lV2lkdGgobUlELCB3KTsKICAgICB9CiAKLSAgICBwdWJsaWMgdm9pZCBzZXRQb2ludFNpemUoZmxvYXQgcykgeworICAgIHZvaWQgc2V0Q3VsbE1vZGUoQ3VsbE1vZGUgbSkgewogICAgICAgICBtUlMudmFsaWRhdGUoKTsKLSAgICAgICAgbVBvaW50U2l6ZSA9IHM7Ci0gICAgICAgIG1SUy5uUHJvZ3JhbVJhc3RlclNldFBvaW50U2l6ZShtSUQsIHMpOworICAgICAgICBtQ3VsbE1vZGUgPSBtOworICAgICAgICBtUlMublByb2dyYW1SYXN0ZXJTZXRDdWxsTW9kZShtSUQsIG0ubUlEKTsKICAgICB9CiAKLSAgICB2b2lkIGludGVybmFsSW5pdCgpIHsKLSAgICAgICAgaW50IGluSUQgPSAwOwotICAgICAgICBpbnQgb3V0SUQgPSAwOwotICAgICAgICBpZiAobUluICE9IG51bGwpIHsKLSAgICAgICAgICAgIGluSUQgPSBtSW4ubUlEOworICAgIHB1YmxpYyBzdGF0aWMgUHJvZ3JhbVJhc3RlciBDVUxMX0JBQ0soUmVuZGVyU2NyaXB0IHJzKSB7CisgICAgICAgIGlmKHJzLm1Qcm9ncmFtUmFzdGVyX0NVTExfQkFDSyA9PSBudWxsKSB7CisgICAgICAgICAgICBQcm9ncmFtUmFzdGVyLkJ1aWxkZXIgYnVpbGRlciA9IG5ldyBQcm9ncmFtUmFzdGVyLkJ1aWxkZXIocnMpOworICAgICAgICAgICAgYnVpbGRlci5zZXRDdWxsTW9kZShDdWxsTW9kZS5CQUNLKTsKKyAgICAgICAgICAgIHJzLm1Qcm9ncmFtUmFzdGVyX0NVTExfQkFDSyA9IGJ1aWxkZXIuY3JlYXRlKCk7CiAgICAgICAgIH0KLSAgICAgICAgaWYgKG1PdXQgIT0gbnVsbCkgewotICAgICAgICAgICAgb3V0SUQgPSBtT3V0Lm1JRDsKLSAgICAgICAgfQotICAgICAgICBtSUQgPSBtUlMublByb2dyYW1SYXN0ZXJDcmVhdGUoaW5JRCwgb3V0SUQsIG1Qb2ludFNtb290aCwgbUxpbmVTbW9vdGgsIG1Qb2ludFNwcml0ZSk7CisgICAgICAgIHJldHVybiBycy5tUHJvZ3JhbVJhc3Rlcl9DVUxMX0JBQ0s7CiAgICAgfQogCisgICAgcHVibGljIHN0YXRpYyBQcm9ncmFtUmFzdGVyIENVTExfRlJPTlQoUmVuZGVyU2NyaXB0IHJzKSB7CisgICAgICAgIGlmKHJzLm1Qcm9ncmFtUmFzdGVyX0NVTExfRlJPTlQgPT0gbnVsbCkgeworICAgICAgICAgICAgUHJvZ3JhbVJhc3Rlci5CdWlsZGVyIGJ1aWxkZXIgPSBuZXcgUHJvZ3JhbVJhc3Rlci5CdWlsZGVyKHJzKTsKKyAgICAgICAgICAgIGJ1aWxkZXIuc2V0Q3VsbE1vZGUoQ3VsbE1vZGUuRlJPTlQpOworICAgICAgICAgICAgcnMubVByb2dyYW1SYXN0ZXJfQ1VMTF9GUk9OVCA9IGJ1aWxkZXIuY3JlYXRlKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJzLm1Qcm9ncmFtUmFzdGVyX0NVTExfRlJPTlQ7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBQcm9ncmFtUmFzdGVyIENVTExfTk9ORShSZW5kZXJTY3JpcHQgcnMpIHsKKyAgICAgICAgaWYocnMubVByb2dyYW1SYXN0ZXJfQ1VMTF9OT05FID09IG51bGwpIHsKKyAgICAgICAgICAgIFByb2dyYW1SYXN0ZXIuQnVpbGRlciBidWlsZGVyID0gbmV3IFByb2dyYW1SYXN0ZXIuQnVpbGRlcihycyk7CisgICAgICAgICAgICBidWlsZGVyLnNldEN1bGxNb2RlKEN1bGxNb2RlLk5PTkUpOworICAgICAgICAgICAgcnMubVByb2dyYW1SYXN0ZXJfQ1VMTF9OT05FID0gYnVpbGRlci5jcmVhdGUoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcnMubVByb2dyYW1SYXN0ZXJfQ1VMTF9OT05FOworICAgIH0KIAogICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQnVpbGRlciB7CiAgICAgICAgIFJlbmRlclNjcmlwdCBtUlM7Ci0gICAgICAgIFByb2dyYW1SYXN0ZXIgbVBSOworICAgICAgICBib29sZWFuIG1Qb2ludFNwcml0ZTsKKyAgICAgICAgYm9vbGVhbiBtUG9pbnRTbW9vdGg7CisgICAgICAgIGJvb2xlYW4gbUxpbmVTbW9vdGg7CisgICAgICAgIEN1bGxNb2RlIG1DdWxsTW9kZTsKIAotICAgICAgICBwdWJsaWMgQnVpbGRlcihSZW5kZXJTY3JpcHQgcnMsIEVsZW1lbnQgaW4sIEVsZW1lbnQgb3V0KSB7CisgICAgICAgIHB1YmxpYyBCdWlsZGVyKFJlbmRlclNjcmlwdCBycykgewogICAgICAgICAgICAgbVJTID0gcnM7Ci0gICAgICAgICAgICBtUFIgPSBuZXcgUHJvZ3JhbVJhc3RlcigwLCBycyk7CisgICAgICAgICAgICBtUG9pbnRTbW9vdGggPSBmYWxzZTsKKyAgICAgICAgICAgIG1MaW5lU21vb3RoID0gZmFsc2U7CisgICAgICAgICAgICBtUG9pbnRTcHJpdGUgPSBmYWxzZTsKKyAgICAgICAgICAgIG1DdWxsTW9kZSA9IEN1bGxNb2RlLkJBQ0s7CiAgICAgICAgIH0KIAotICAgICAgICBwdWJsaWMgdm9pZCBzZXRQb2ludFNwcml0ZUVuYWJsZShib29sZWFuIGVuYWJsZSkgewotICAgICAgICAgICAgbVBSLm1Qb2ludFNwcml0ZSA9IGVuYWJsZTsKKyAgICAgICAgcHVibGljIEJ1aWxkZXIgc2V0UG9pbnRTcHJpdGVFbmFibGUoYm9vbGVhbiBlbmFibGUpIHsKKyAgICAgICAgICAgIG1Qb2ludFNwcml0ZSA9IGVuYWJsZTsKKyAgICAgICAgICAgIHJldHVybiB0aGlzOwogICAgICAgICB9CiAKLSAgICAgICAgcHVibGljIHZvaWQgc2V0UG9pbnRTbW9vdGhFbmFibGUoYm9vbGVhbiBlbmFibGUpIHsKLSAgICAgICAgICAgIG1QUi5tUG9pbnRTbW9vdGggPSBlbmFibGU7CisgICAgICAgIHB1YmxpYyBCdWlsZGVyIHNldFBvaW50U21vb3RoRW5hYmxlKGJvb2xlYW4gZW5hYmxlKSB7CisgICAgICAgICAgICBtUG9pbnRTbW9vdGggPSBlbmFibGU7CisgICAgICAgICAgICByZXR1cm4gdGhpczsKICAgICAgICAgfQogCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldExpbmVTbW9vdGhFbmFibGUoYm9vbGVhbiBlbmFibGUpIHsKLSAgICAgICAgICAgIG1QUi5tTGluZVNtb290aCA9IGVuYWJsZTsKKyAgICAgICAgcHVibGljIEJ1aWxkZXIgc2V0TGluZVNtb290aEVuYWJsZShib29sZWFuIGVuYWJsZSkgeworICAgICAgICAgICAgbUxpbmVTbW9vdGggPSBlbmFibGU7CisgICAgICAgICAgICByZXR1cm4gdGhpczsKICAgICAgICAgfQogCisgICAgICAgIHB1YmxpYyBCdWlsZGVyIHNldEN1bGxNb2RlKEN1bGxNb2RlIG0pIHsKKyAgICAgICAgICAgIG1DdWxsTW9kZSA9IG07CisgICAgICAgICAgICByZXR1cm4gdGhpczsKKyAgICAgICAgfQogCiAgICAgICAgIHN0YXRpYyBzeW5jaHJvbml6ZWQgUHJvZ3JhbVJhc3RlciBpbnRlcm5hbENyZWF0ZShSZW5kZXJTY3JpcHQgcnMsIEJ1aWxkZXIgYikgewotICAgICAgICAgICAgYi5tUFIuaW50ZXJuYWxJbml0KCk7Ci0gICAgICAgICAgICBQcm9ncmFtUmFzdGVyIHByID0gYi5tUFI7Ci0gICAgICAgICAgICBiLm1QUiA9IG5ldyBQcm9ncmFtUmFzdGVyKDAsIGIubVJTKTsKKyAgICAgICAgICAgIGludCBpZCA9IHJzLm5Qcm9ncmFtUmFzdGVyQ3JlYXRlKGIubVBvaW50U21vb3RoLCBiLm1MaW5lU21vb3RoLCBiLm1Qb2ludFNwcml0ZSk7CisgICAgICAgICAgICBQcm9ncmFtUmFzdGVyIHByID0gbmV3IFByb2dyYW1SYXN0ZXIoaWQsIHJzKTsKKyAgICAgICAgICAgIHByLnNldEN1bGxNb2RlKGIubUN1bGxNb2RlKTsKICAgICAgICAgICAgIHJldHVybiBwcjsKICAgICAgICAgfQogCkBAIC0xMTEsMyArMTQ4LDQgQEAKIAogCiAKKwpkaWZmIC0tZ2l0IGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9Qcm9ncmFtU3RvcmUuamF2YSBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvUHJvZ3JhbVN0b3JlLmphdmEKaW5kZXggNjliZTI0NS4uMzJjMGQwMSAxMDA2NDQKLS0tIGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9Qcm9ncmFtU3RvcmUuamF2YQorKysgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L1Byb2dyYW1TdG9yZS5qYXZhCkBAIC03NiwxMSArNzYsMTQzIEBACiAKIAogICAgIFByb2dyYW1TdG9yZShpbnQgaWQsIFJlbmRlclNjcmlwdCBycykgewotICAgICAgICBzdXBlcihycyk7Ci0gICAgICAgIG1JRCA9IGlkOworICAgICAgICBzdXBlcihpZCwgcnMpOwogICAgIH0KIAorICAgIHB1YmxpYyBzdGF0aWMgUHJvZ3JhbVN0b3JlIEJMRU5EX05PTkVfREVQVEhfVEVTVChSZW5kZXJTY3JpcHQgcnMpIHsKKyAgICAgICAgaWYocnMubVByb2dyYW1TdG9yZV9CTEVORF9OT05FX0RFUFRIX1RFU1QgPT0gbnVsbCkgeworICAgICAgICAgICAgUHJvZ3JhbVN0b3JlLkJ1aWxkZXIgYnVpbGRlciA9IG5ldyBQcm9ncmFtU3RvcmUuQnVpbGRlcihycyk7CisgICAgICAgICAgICBidWlsZGVyLnNldERlcHRoRnVuYyhQcm9ncmFtU3RvcmUuRGVwdGhGdW5jLkxFU1MpOworICAgICAgICAgICAgYnVpbGRlci5zZXRCbGVuZEZ1bmMoQmxlbmRTcmNGdW5jLk9ORSwgQmxlbmREc3RGdW5jLlpFUk8pOworICAgICAgICAgICAgYnVpbGRlci5zZXREaXRoZXJFbmFibGUoZmFsc2UpOworICAgICAgICAgICAgYnVpbGRlci5zZXREZXB0aE1hc2sodHJ1ZSk7CisgICAgICAgICAgICBycy5tUHJvZ3JhbVN0b3JlX0JMRU5EX05PTkVfREVQVEhfVEVTVCA9IGJ1aWxkZXIuY3JlYXRlKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJzLm1Qcm9ncmFtU3RvcmVfQkxFTkRfTk9ORV9ERVBUSF9URVNUOworICAgIH0KKyAgICBwdWJsaWMgc3RhdGljIFByb2dyYW1TdG9yZSBCTEVORF9OT05FX0RFUFRIX05PX0RFUFRIKFJlbmRlclNjcmlwdCBycykgeworICAgICAgICBpZihycy5tUHJvZ3JhbVN0b3JlX0JMRU5EX05PTkVfREVQVEhfTk9fREVQVEggPT0gbnVsbCkgeworICAgICAgICAgICAgUHJvZ3JhbVN0b3JlLkJ1aWxkZXIgYnVpbGRlciA9IG5ldyBQcm9ncmFtU3RvcmUuQnVpbGRlcihycyk7CisgICAgICAgICAgICBidWlsZGVyLnNldERlcHRoRnVuYyhQcm9ncmFtU3RvcmUuRGVwdGhGdW5jLkFMV0FZUyk7CisgICAgICAgICAgICBidWlsZGVyLnNldEJsZW5kRnVuYyhCbGVuZFNyY0Z1bmMuT05FLCBCbGVuZERzdEZ1bmMuWkVSTyk7CisgICAgICAgICAgICBidWlsZGVyLnNldERpdGhlckVuYWJsZShmYWxzZSk7CisgICAgICAgICAgICBidWlsZGVyLnNldERlcHRoTWFzayhmYWxzZSk7CisgICAgICAgICAgICBycy5tUHJvZ3JhbVN0b3JlX0JMRU5EX05PTkVfREVQVEhfTk9fREVQVEggPSBidWlsZGVyLmNyZWF0ZSgpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBycy5tUHJvZ3JhbVN0b3JlX0JMRU5EX05PTkVfREVQVEhfTk9fREVQVEg7CisgICAgfQorICAgIHB1YmxpYyBzdGF0aWMgUHJvZ3JhbVN0b3JlIEJMRU5EX05PTkVfREVQVEhfTk9fVEVTVChSZW5kZXJTY3JpcHQgcnMpIHsKKyAgICAgICAgaWYocnMubVByb2dyYW1TdG9yZV9CTEVORF9OT05FX0RFUFRIX05PX1RFU1QgPT0gbnVsbCkgeworICAgICAgICAgICAgUHJvZ3JhbVN0b3JlLkJ1aWxkZXIgYnVpbGRlciA9IG5ldyBQcm9ncmFtU3RvcmUuQnVpbGRlcihycyk7CisgICAgICAgICAgICBidWlsZGVyLnNldERlcHRoRnVuYyhQcm9ncmFtU3RvcmUuRGVwdGhGdW5jLkFMV0FZUyk7CisgICAgICAgICAgICBidWlsZGVyLnNldEJsZW5kRnVuYyhCbGVuZFNyY0Z1bmMuT05FLCBCbGVuZERzdEZ1bmMuWkVSTyk7CisgICAgICAgICAgICBidWlsZGVyLnNldERpdGhlckVuYWJsZShmYWxzZSk7CisgICAgICAgICAgICBidWlsZGVyLnNldERlcHRoTWFzayh0cnVlKTsKKyAgICAgICAgICAgIHJzLm1Qcm9ncmFtU3RvcmVfQkxFTkRfTk9ORV9ERVBUSF9OT19URVNUID0gYnVpbGRlci5jcmVhdGUoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcnMubVByb2dyYW1TdG9yZV9CTEVORF9OT05FX0RFUFRIX05PX1RFU1Q7CisgICAgfQorICAgIHB1YmxpYyBzdGF0aWMgUHJvZ3JhbVN0b3JlIEJMRU5EX05PTkVfREVQVEhfTk9fV1JJVEUoUmVuZGVyU2NyaXB0IHJzKSB7CisgICAgICAgIGlmKHJzLm1Qcm9ncmFtU3RvcmVfQkxFTkRfTk9ORV9ERVBUSF9OT19XUklURSA9PSBudWxsKSB7CisgICAgICAgICAgICBQcm9ncmFtU3RvcmUuQnVpbGRlciBidWlsZGVyID0gbmV3IFByb2dyYW1TdG9yZS5CdWlsZGVyKHJzKTsKKyAgICAgICAgICAgIGJ1aWxkZXIuc2V0RGVwdGhGdW5jKFByb2dyYW1TdG9yZS5EZXB0aEZ1bmMuTEVTUyk7CisgICAgICAgICAgICBidWlsZGVyLnNldEJsZW5kRnVuYyhCbGVuZFNyY0Z1bmMuT05FLCBCbGVuZERzdEZ1bmMuWkVSTyk7CisgICAgICAgICAgICBidWlsZGVyLnNldERpdGhlckVuYWJsZShmYWxzZSk7CisgICAgICAgICAgICBidWlsZGVyLnNldERlcHRoTWFzayhmYWxzZSk7CisgICAgICAgICAgICBycy5tUHJvZ3JhbVN0b3JlX0JMRU5EX05PTkVfREVQVEhfTk9fV1JJVEUgPSBidWlsZGVyLmNyZWF0ZSgpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBycy5tUHJvZ3JhbVN0b3JlX0JMRU5EX05PTkVfREVQVEhfTk9fV1JJVEU7CisgICAgfQogCisgICAgcHVibGljIHN0YXRpYyBQcm9ncmFtU3RvcmUgQkxFTkRfQUxQSEFfREVQVEhfVEVTVChSZW5kZXJTY3JpcHQgcnMpIHsKKyAgICAgICAgaWYocnMubVByb2dyYW1TdG9yZV9CTEVORF9BTFBIQV9ERVBUSF9URVNUID09IG51bGwpIHsKKyAgICAgICAgICAgIFByb2dyYW1TdG9yZS5CdWlsZGVyIGJ1aWxkZXIgPSBuZXcgUHJvZ3JhbVN0b3JlLkJ1aWxkZXIocnMpOworICAgICAgICAgICAgYnVpbGRlci5zZXREZXB0aEZ1bmMoUHJvZ3JhbVN0b3JlLkRlcHRoRnVuYy5MRVNTKTsKKyAgICAgICAgICAgIGJ1aWxkZXIuc2V0QmxlbmRGdW5jKEJsZW5kU3JjRnVuYy5TUkNfQUxQSEEsIEJsZW5kRHN0RnVuYy5PTkVfTUlOVVNfU1JDX0FMUEhBKTsKKyAgICAgICAgICAgIGJ1aWxkZXIuc2V0RGl0aGVyRW5hYmxlKGZhbHNlKTsKKyAgICAgICAgICAgIGJ1aWxkZXIuc2V0RGVwdGhNYXNrKHRydWUpOworICAgICAgICAgICAgcnMubVByb2dyYW1TdG9yZV9CTEVORF9BTFBIQV9ERVBUSF9URVNUID0gYnVpbGRlci5jcmVhdGUoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcnMubVByb2dyYW1TdG9yZV9CTEVORF9BTFBIQV9ERVBUSF9URVNUOworICAgIH0KKyAgICBwdWJsaWMgc3RhdGljIFByb2dyYW1TdG9yZSBCTEVORF9BTFBIQV9ERVBUSF9OT19ERVBUSChSZW5kZXJTY3JpcHQgcnMpIHsKKyAgICAgICAgaWYocnMubVByb2dyYW1TdG9yZV9CTEVORF9BTFBIQV9ERVBUSF9OT19ERVBUSCA9PSBudWxsKSB7CisgICAgICAgICAgICBQcm9ncmFtU3RvcmUuQnVpbGRlciBidWlsZGVyID0gbmV3IFByb2dyYW1TdG9yZS5CdWlsZGVyKHJzKTsKKyAgICAgICAgICAgIGJ1aWxkZXIuc2V0RGVwdGhGdW5jKFByb2dyYW1TdG9yZS5EZXB0aEZ1bmMuQUxXQVlTKTsKKyAgICAgICAgICAgIGJ1aWxkZXIuc2V0QmxlbmRGdW5jKEJsZW5kU3JjRnVuYy5TUkNfQUxQSEEsIEJsZW5kRHN0RnVuYy5PTkVfTUlOVVNfU1JDX0FMUEhBKTsKKyAgICAgICAgICAgIGJ1aWxkZXIuc2V0RGl0aGVyRW5hYmxlKGZhbHNlKTsKKyAgICAgICAgICAgIGJ1aWxkZXIuc2V0RGVwdGhNYXNrKGZhbHNlKTsKKyAgICAgICAgICAgIHJzLm1Qcm9ncmFtU3RvcmVfQkxFTkRfQUxQSEFfREVQVEhfTk9fREVQVEggPSBidWlsZGVyLmNyZWF0ZSgpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBycy5tUHJvZ3JhbVN0b3JlX0JMRU5EX0FMUEhBX0RFUFRIX05PX0RFUFRIOworICAgIH0KKyAgICBwdWJsaWMgc3RhdGljIFByb2dyYW1TdG9yZSBCTEVORF9BTFBIQV9ERVBUSF9OT19URVNUKFJlbmRlclNjcmlwdCBycykgeworICAgICAgICBpZihycy5tUHJvZ3JhbVN0b3JlX0JMRU5EX0FMUEhBX0RFUFRIX05PX1RFU1QgPT0gbnVsbCkgeworICAgICAgICAgICAgUHJvZ3JhbVN0b3JlLkJ1aWxkZXIgYnVpbGRlciA9IG5ldyBQcm9ncmFtU3RvcmUuQnVpbGRlcihycyk7CisgICAgICAgICAgICBidWlsZGVyLnNldERlcHRoRnVuYyhQcm9ncmFtU3RvcmUuRGVwdGhGdW5jLkFMV0FZUyk7CisgICAgICAgICAgICBidWlsZGVyLnNldEJsZW5kRnVuYyhCbGVuZFNyY0Z1bmMuU1JDX0FMUEhBLCBCbGVuZERzdEZ1bmMuT05FX01JTlVTX1NSQ19BTFBIQSk7CisgICAgICAgICAgICBidWlsZGVyLnNldERpdGhlckVuYWJsZShmYWxzZSk7CisgICAgICAgICAgICBidWlsZGVyLnNldERlcHRoTWFzayh0cnVlKTsKKyAgICAgICAgICAgIHJzLm1Qcm9ncmFtU3RvcmVfQkxFTkRfQUxQSEFfREVQVEhfTk9fVEVTVCA9IGJ1aWxkZXIuY3JlYXRlKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJzLm1Qcm9ncmFtU3RvcmVfQkxFTkRfQUxQSEFfREVQVEhfTk9fVEVTVDsKKyAgICB9CisgICAgcHVibGljIHN0YXRpYyBQcm9ncmFtU3RvcmUgQkxFTkRfQUxQSEFfREVQVEhfTk9fV1JJVEUoUmVuZGVyU2NyaXB0IHJzKSB7CisgICAgICAgIGlmKHJzLm1Qcm9ncmFtU3RvcmVfQkxFTkRfQUxQSEFfREVQVEhfTk9fV1JJVEUgPT0gbnVsbCkgeworICAgICAgICAgICAgUHJvZ3JhbVN0b3JlLkJ1aWxkZXIgYnVpbGRlciA9IG5ldyBQcm9ncmFtU3RvcmUuQnVpbGRlcihycyk7CisgICAgICAgICAgICBidWlsZGVyLnNldERlcHRoRnVuYyhQcm9ncmFtU3RvcmUuRGVwdGhGdW5jLkxFU1MpOworICAgICAgICAgICAgYnVpbGRlci5zZXRCbGVuZEZ1bmMoQmxlbmRTcmNGdW5jLlNSQ19BTFBIQSwgQmxlbmREc3RGdW5jLk9ORV9NSU5VU19TUkNfQUxQSEEpOworICAgICAgICAgICAgYnVpbGRlci5zZXREaXRoZXJFbmFibGUoZmFsc2UpOworICAgICAgICAgICAgYnVpbGRlci5zZXREZXB0aE1hc2soZmFsc2UpOworICAgICAgICAgICAgcnMubVByb2dyYW1TdG9yZV9CTEVORF9BTFBIQV9ERVBUSF9OT19XUklURSA9IGJ1aWxkZXIuY3JlYXRlKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJzLm1Qcm9ncmFtU3RvcmVfQkxFTkRfQUxQSEFfREVQVEhfTk9fV1JJVEU7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBQcm9ncmFtU3RvcmUgQkxFTkRfQUREX0RFUFRIX1RFU1QoUmVuZGVyU2NyaXB0IHJzKSB7CisgICAgICAgIGlmKHJzLm1Qcm9ncmFtU3RvcmVfQkxFTkRfQUREX0RFUFRIX1RFU1QgPT0gbnVsbCkgeworICAgICAgICAgICAgUHJvZ3JhbVN0b3JlLkJ1aWxkZXIgYnVpbGRlciA9IG5ldyBQcm9ncmFtU3RvcmUuQnVpbGRlcihycyk7CisgICAgICAgICAgICBidWlsZGVyLnNldERlcHRoRnVuYyhQcm9ncmFtU3RvcmUuRGVwdGhGdW5jLkxFU1MpOworICAgICAgICAgICAgYnVpbGRlci5zZXRCbGVuZEZ1bmMoQmxlbmRTcmNGdW5jLk9ORSwgQmxlbmREc3RGdW5jLk9ORSk7CisgICAgICAgICAgICBidWlsZGVyLnNldERpdGhlckVuYWJsZShmYWxzZSk7CisgICAgICAgICAgICBidWlsZGVyLnNldERlcHRoTWFzayh0cnVlKTsKKyAgICAgICAgICAgIHJzLm1Qcm9ncmFtU3RvcmVfQkxFTkRfQUREX0RFUFRIX1RFU1QgPSBidWlsZGVyLmNyZWF0ZSgpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBycy5tUHJvZ3JhbVN0b3JlX0JMRU5EX0FERF9ERVBUSF9URVNUOworICAgIH0KKyAgICBwdWJsaWMgc3RhdGljIFByb2dyYW1TdG9yZSBCTEVORF9BRERfREVQVEhfTk9fREVQVEgoUmVuZGVyU2NyaXB0IHJzKSB7CisgICAgICAgIGlmKHJzLm1Qcm9ncmFtU3RvcmVfQkxFTkRfQUREX0RFUFRIX05PX0RFUFRIID09IG51bGwpIHsKKyAgICAgICAgICAgIFByb2dyYW1TdG9yZS5CdWlsZGVyIGJ1aWxkZXIgPSBuZXcgUHJvZ3JhbVN0b3JlLkJ1aWxkZXIocnMpOworICAgICAgICAgICAgYnVpbGRlci5zZXREZXB0aEZ1bmMoUHJvZ3JhbVN0b3JlLkRlcHRoRnVuYy5BTFdBWVMpOworICAgICAgICAgICAgYnVpbGRlci5zZXRCbGVuZEZ1bmMoQmxlbmRTcmNGdW5jLk9ORSwgQmxlbmREc3RGdW5jLk9ORSk7CisgICAgICAgICAgICBidWlsZGVyLnNldERpdGhlckVuYWJsZShmYWxzZSk7CisgICAgICAgICAgICBidWlsZGVyLnNldERlcHRoTWFzayhmYWxzZSk7CisgICAgICAgICAgICBycy5tUHJvZ3JhbVN0b3JlX0JMRU5EX0FERF9ERVBUSF9OT19ERVBUSCA9IGJ1aWxkZXIuY3JlYXRlKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJzLm1Qcm9ncmFtU3RvcmVfQkxFTkRfQUREX0RFUFRIX05PX0RFUFRIOworICAgIH0KKyAgICBwdWJsaWMgc3RhdGljIFByb2dyYW1TdG9yZSBCTEVORF9BRERfREVQVEhfTk9fVEVTVChSZW5kZXJTY3JpcHQgcnMpIHsKKyAgICAgICAgaWYocnMubVByb2dyYW1TdG9yZV9CTEVORF9BRERfREVQVEhfTk9fVEVTVCA9PSBudWxsKSB7CisgICAgICAgICAgICBQcm9ncmFtU3RvcmUuQnVpbGRlciBidWlsZGVyID0gbmV3IFByb2dyYW1TdG9yZS5CdWlsZGVyKHJzKTsKKyAgICAgICAgICAgIGJ1aWxkZXIuc2V0RGVwdGhGdW5jKFByb2dyYW1TdG9yZS5EZXB0aEZ1bmMuQUxXQVlTKTsKKyAgICAgICAgICAgIGJ1aWxkZXIuc2V0QmxlbmRGdW5jKEJsZW5kU3JjRnVuYy5PTkUsIEJsZW5kRHN0RnVuYy5PTkUpOworICAgICAgICAgICAgYnVpbGRlci5zZXREaXRoZXJFbmFibGUoZmFsc2UpOworICAgICAgICAgICAgYnVpbGRlci5zZXREZXB0aE1hc2sodHJ1ZSk7CisgICAgICAgICAgICBycy5tUHJvZ3JhbVN0b3JlX0JMRU5EX0FERF9ERVBUSF9OT19ERVBUSCA9IGJ1aWxkZXIuY3JlYXRlKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJzLm1Qcm9ncmFtU3RvcmVfQkxFTkRfQUREX0RFUFRIX05PX1RFU1Q7CisgICAgfQorICAgIHB1YmxpYyBzdGF0aWMgUHJvZ3JhbVN0b3JlIEJMRU5EX0FERF9ERVBUSF9OT19XUklURShSZW5kZXJTY3JpcHQgcnMpIHsKKyAgICAgICAgaWYocnMubVByb2dyYW1TdG9yZV9CTEVORF9BRERfREVQVEhfTk9fV1JJVEUgPT0gbnVsbCkgeworICAgICAgICAgICAgUHJvZ3JhbVN0b3JlLkJ1aWxkZXIgYnVpbGRlciA9IG5ldyBQcm9ncmFtU3RvcmUuQnVpbGRlcihycyk7CisgICAgICAgICAgICBidWlsZGVyLnNldERlcHRoRnVuYyhQcm9ncmFtU3RvcmUuRGVwdGhGdW5jLkFMV0FZUyk7CisgICAgICAgICAgICBidWlsZGVyLnNldEJsZW5kRnVuYyhCbGVuZFNyY0Z1bmMuT05FLCBCbGVuZERzdEZ1bmMuT05FKTsKKyAgICAgICAgICAgIGJ1aWxkZXIuc2V0RGl0aGVyRW5hYmxlKGZhbHNlKTsKKyAgICAgICAgICAgIGJ1aWxkZXIuc2V0RGVwdGhNYXNrKGZhbHNlKTsKKyAgICAgICAgICAgIHJzLm1Qcm9ncmFtU3RvcmVfQkxFTkRfQUREX0RFUFRIX05PX1dSSVRFID0gYnVpbGRlci5jcmVhdGUoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcnMubVByb2dyYW1TdG9yZV9CTEVORF9BRERfREVQVEhfTk9fV1JJVEU7CisgICAgfQogCiAgICAgcHVibGljIHN0YXRpYyBjbGFzcyBCdWlsZGVyIHsKICAgICAgICAgUmVuZGVyU2NyaXB0IG1SUzsKQEAgLTExMCwzMiArMjQyLDQ5IEBACiAgICAgICAgICAgICBtQ29sb3JNYXNrQSA9IHRydWU7CiAgICAgICAgICAgICBtQmxlbmRTcmMgPSBCbGVuZFNyY0Z1bmMuT05FOwogICAgICAgICAgICAgbUJsZW5kRHN0ID0gQmxlbmREc3RGdW5jLlpFUk87Ci0KLQogICAgICAgICB9CiAKLSAgICAgICAgcHVibGljIHZvaWQgc2V0RGVwdGhGdW5jKERlcHRoRnVuYyBmdW5jKSB7CisgICAgICAgIHB1YmxpYyBCdWlsZGVyKFJlbmRlclNjcmlwdCBycykgeworICAgICAgICAgICAgbVJTID0gcnM7CisgICAgICAgICAgICBtSW4gPSBudWxsOworICAgICAgICAgICAgbU91dCA9IG51bGw7CisgICAgICAgICAgICBtRGVwdGhGdW5jID0gRGVwdGhGdW5jLkFMV0FZUzsKKyAgICAgICAgICAgIG1EZXB0aE1hc2sgPSBmYWxzZTsKKyAgICAgICAgICAgIG1Db2xvck1hc2tSID0gdHJ1ZTsKKyAgICAgICAgICAgIG1Db2xvck1hc2tHID0gdHJ1ZTsKKyAgICAgICAgICAgIG1Db2xvck1hc2tCID0gdHJ1ZTsKKyAgICAgICAgICAgIG1Db2xvck1hc2tBID0gdHJ1ZTsKKyAgICAgICAgICAgIG1CbGVuZFNyYyA9IEJsZW5kU3JjRnVuYy5PTkU7CisgICAgICAgICAgICBtQmxlbmREc3QgPSBCbGVuZERzdEZ1bmMuWkVSTzsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBCdWlsZGVyIHNldERlcHRoRnVuYyhEZXB0aEZ1bmMgZnVuYykgewogICAgICAgICAgICAgbURlcHRoRnVuYyA9IGZ1bmM7CisgICAgICAgICAgICByZXR1cm4gdGhpczsKICAgICAgICAgfQogCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldERlcHRoTWFzayhib29sZWFuIGVuYWJsZSkgeworICAgICAgICBwdWJsaWMgQnVpbGRlciBzZXREZXB0aE1hc2soYm9vbGVhbiBlbmFibGUpIHsKICAgICAgICAgICAgIG1EZXB0aE1hc2sgPSBlbmFibGU7CisgICAgICAgICAgICByZXR1cm4gdGhpczsKICAgICAgICAgfQogCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldENvbG9yTWFzayhib29sZWFuIHIsIGJvb2xlYW4gZywgYm9vbGVhbiBiLCBib29sZWFuIGEpIHsKKyAgICAgICAgcHVibGljIEJ1aWxkZXIgc2V0Q29sb3JNYXNrKGJvb2xlYW4gciwgYm9vbGVhbiBnLCBib29sZWFuIGIsIGJvb2xlYW4gYSkgewogICAgICAgICAgICAgbUNvbG9yTWFza1IgPSByOwogICAgICAgICAgICAgbUNvbG9yTWFza0cgPSBnOwogICAgICAgICAgICAgbUNvbG9yTWFza0IgPSBiOwogICAgICAgICAgICAgbUNvbG9yTWFza0EgPSBhOworICAgICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgIH0KIAotICAgICAgICBwdWJsaWMgdm9pZCBzZXRCbGVuZEZ1bmMoQmxlbmRTcmNGdW5jIHNyYywgQmxlbmREc3RGdW5jIGRzdCkgeworICAgICAgICBwdWJsaWMgQnVpbGRlciBzZXRCbGVuZEZ1bmMoQmxlbmRTcmNGdW5jIHNyYywgQmxlbmREc3RGdW5jIGRzdCkgewogICAgICAgICAgICAgbUJsZW5kU3JjID0gc3JjOwogICAgICAgICAgICAgbUJsZW5kRHN0ID0gZHN0OworICAgICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgIH0KIAotICAgICAgICBwdWJsaWMgdm9pZCBzZXREaXRoZXJFbmFibGUoYm9vbGVhbiBlbmFibGUpIHsKKyAgICAgICAgcHVibGljIEJ1aWxkZXIgc2V0RGl0aGVyRW5hYmxlKGJvb2xlYW4gZW5hYmxlKSB7CiAgICAgICAgICAgICBtRGl0aGVyID0gZW5hYmxlOworICAgICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgIH0KIAogICAgICAgICBzdGF0aWMgc3luY2hyb25pemVkIFByb2dyYW1TdG9yZSBpbnRlcm5hbENyZWF0ZShSZW5kZXJTY3JpcHQgcnMsIEJ1aWxkZXIgYikgewpAQCAtMTQ3LDE3ICsyOTYsMTcgQEAKICAgICAgICAgICAgIGlmIChiLm1PdXQgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgIG91dElEID0gYi5tT3V0Lm1JRDsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJzLm5Qcm9ncmFtRnJhZ21lbnRTdG9yZUJlZ2luKGluSUQsIG91dElEKTsKLSAgICAgICAgICAgIHJzLm5Qcm9ncmFtRnJhZ21lbnRTdG9yZURlcHRoRnVuYyhiLm1EZXB0aEZ1bmMubUlEKTsKLSAgICAgICAgICAgIHJzLm5Qcm9ncmFtRnJhZ21lbnRTdG9yZURlcHRoTWFzayhiLm1EZXB0aE1hc2spOwotICAgICAgICAgICAgcnMublByb2dyYW1GcmFnbWVudFN0b3JlQ29sb3JNYXNrKGIubUNvbG9yTWFza1IsCisgICAgICAgICAgICBycy5uUHJvZ3JhbVN0b3JlQmVnaW4oaW5JRCwgb3V0SUQpOworICAgICAgICAgICAgcnMublByb2dyYW1TdG9yZURlcHRoRnVuYyhiLm1EZXB0aEZ1bmMubUlEKTsKKyAgICAgICAgICAgIHJzLm5Qcm9ncmFtU3RvcmVEZXB0aE1hc2soYi5tRGVwdGhNYXNrKTsKKyAgICAgICAgICAgIHJzLm5Qcm9ncmFtU3RvcmVDb2xvck1hc2soYi5tQ29sb3JNYXNrUiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiLm1Db2xvck1hc2tHLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGIubUNvbG9yTWFza0IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYi5tQ29sb3JNYXNrQSk7Ci0gICAgICAgICAgICBycy5uUHJvZ3JhbUZyYWdtZW50U3RvcmVCbGVuZEZ1bmMoYi5tQmxlbmRTcmMubUlELCBiLm1CbGVuZERzdC5tSUQpOwotICAgICAgICAgICAgcnMublByb2dyYW1GcmFnbWVudFN0b3JlRGl0aGVyKGIubURpdGhlcik7CisgICAgICAgICAgICBycy5uUHJvZ3JhbVN0b3JlQmxlbmRGdW5jKGIubUJsZW5kU3JjLm1JRCwgYi5tQmxlbmREc3QubUlEKTsKKyAgICAgICAgICAgIHJzLm5Qcm9ncmFtU3RvcmVEaXRoZXIoYi5tRGl0aGVyKTsKIAotICAgICAgICAgICAgaW50IGlkID0gcnMublByb2dyYW1GcmFnbWVudFN0b3JlQ3JlYXRlKCk7CisgICAgICAgICAgICBpbnQgaWQgPSBycy5uUHJvZ3JhbVN0b3JlQ3JlYXRlKCk7CiAgICAgICAgICAgICByZXR1cm4gbmV3IFByb2dyYW1TdG9yZShpZCwgcnMpOwogICAgICAgICB9CiAKZGlmZiAtLWdpdCBhL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvUHJvZ3JhbVZlcnRleC5qYXZhIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9Qcm9ncmFtVmVydGV4LmphdmEKaW5kZXggMWIxNTVkNy4uMTE5ZGI2OSAxMDA2NDQKLS0tIGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9Qcm9ncmFtVmVydGV4LmphdmEKKysrIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9Qcm9ncmFtVmVydGV4LmphdmEKQEAgLTE3LDYgKzE3LDcgQEAKIHBhY2thZ2UgYW5kcm9pZC5yZW5kZXJzY3JpcHQ7CiAKIAoraW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuTWF0cml4OwogaW1wb3J0IGFuZHJvaWQudXRpbC5Db25maWc7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKIApAQCAtMzgsMjUgKzM5LDYgQEAKICAgICAgICAgYmluZENvbnN0YW50cyh2YS5tQWxsb2MsIDApOwogICAgIH0KIAotCi0gICAgcHVibGljIHN0YXRpYyBjbGFzcyBCdWlsZGVyIHsKLSAgICAgICAgUmVuZGVyU2NyaXB0IG1SUzsKLSAgICAgICAgYm9vbGVhbiBtVGV4dHVyZU1hdHJpeEVuYWJsZTsKLQotICAgICAgICBwdWJsaWMgQnVpbGRlcihSZW5kZXJTY3JpcHQgcnMsIEVsZW1lbnQgaW4sIEVsZW1lbnQgb3V0KSB7Ci0gICAgICAgICAgICBtUlMgPSByczsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldFRleHR1cmVNYXRyaXhFbmFibGUoYm9vbGVhbiBlbmFibGUpIHsKLSAgICAgICAgICAgIG1UZXh0dXJlTWF0cml4RW5hYmxlID0gZW5hYmxlOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIFByb2dyYW1WZXJ0ZXggY3JlYXRlKCkgewotICAgICAgICAgICAgaW50IGlkID0gbVJTLm5Qcm9ncmFtVmVydGV4Q3JlYXRlKG1UZXh0dXJlTWF0cml4RW5hYmxlKTsKLSAgICAgICAgICAgIHJldHVybiBuZXcgUHJvZ3JhbVZlcnRleChpZCwgbVJTKTsKLSAgICAgICAgfQotICAgIH0KLQogICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgU2hhZGVyQnVpbGRlciBleHRlbmRzIEJhc2VQcm9ncmFtQnVpbGRlciB7CiAgICAgICAgIHB1YmxpYyBTaGFkZXJCdWlsZGVyKFJlbmRlclNjcmlwdCBycykgewogICAgICAgICAgICAgc3VwZXIocnMpOwpAQCAtODksNiArNzEsNjggQEAKICAgICAgICAgfQogICAgIH0KIAorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQnVpbGRlciBleHRlbmRzIFNoYWRlckJ1aWxkZXIgeworICAgICAgICBib29sZWFuIG1UZXh0dXJlTWF0cml4RW5hYmxlOworCisgICAgICAgIHB1YmxpYyBCdWlsZGVyKFJlbmRlclNjcmlwdCBycywgRWxlbWVudCBpbiwgRWxlbWVudCBvdXQpIHsKKyAgICAgICAgICAgIHN1cGVyKHJzKTsKKyAgICAgICAgfQorICAgICAgICBwdWJsaWMgQnVpbGRlcihSZW5kZXJTY3JpcHQgcnMpIHsKKyAgICAgICAgICAgIHN1cGVyKHJzKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBCdWlsZGVyIHNldFRleHR1cmVNYXRyaXhFbmFibGUoYm9vbGVhbiBlbmFibGUpIHsKKyAgICAgICAgICAgIG1UZXh0dXJlTWF0cml4RW5hYmxlID0gZW5hYmxlOworICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICAgIH0KKyAgICAgICAgc3RhdGljIFR5cGUgZ2V0Q29uc3RhbnRJbnB1dFR5cGUoUmVuZGVyU2NyaXB0IHJzKSB7CisgICAgICAgICAgICBFbGVtZW50LkJ1aWxkZXIgYiA9IG5ldyBFbGVtZW50LkJ1aWxkZXIocnMpOworICAgICAgICAgICAgYi5hZGQoRWxlbWVudC5NQVRSSVg0WDQocnMpLCAiTVYiKTsKKyAgICAgICAgICAgIGIuYWRkKEVsZW1lbnQuTUFUUklYNFg0KHJzKSwgIlAiKTsKKyAgICAgICAgICAgIGIuYWRkKEVsZW1lbnQuTUFUUklYNFg0KHJzKSwgIlRleE1hdHJpeCIpOworICAgICAgICAgICAgYi5hZGQoRWxlbWVudC5NQVRSSVg0WDQocnMpLCAiTVZQIik7CisKKyAgICAgICAgICAgIFR5cGUuQnVpbGRlciB0eXBlQnVpbGRlciA9IG5ldyBUeXBlLkJ1aWxkZXIocnMsIGIuY3JlYXRlKCkpOworICAgICAgICAgICAgdHlwZUJ1aWxkZXIuYWRkKERpbWVuc2lvbi5YLCAxKTsKKyAgICAgICAgICAgIHJldHVybiB0eXBlQnVpbGRlci5jcmVhdGUoKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgdm9pZCBidWlsZFNoYWRlclN0cmluZygpIHsKKworICAgICAgICAgICAgbVNoYWRlciAgPSAiLy9yc19zaGFkZXJfaW50ZXJuYWxcbiI7CisgICAgICAgICAgICBtU2hhZGVyICs9ICJ2YXJ5aW5nIHZlYzQgdmFyQ29sb3I7XG4iOworICAgICAgICAgICAgbVNoYWRlciArPSAidmFyeWluZyB2ZWM0IHZhclRleDA7XG4iOworCisgICAgICAgICAgICBtU2hhZGVyICs9ICJ2b2lkIG1haW4oKSB7XG4iOworICAgICAgICAgICAgbVNoYWRlciArPSAiICBnbF9Qb3NpdGlvbiA9IFVOSV9NVlAgKiBBVFRSSUJfcG9zaXRpb247XG4iOworICAgICAgICAgICAgbVNoYWRlciArPSAiICBnbF9Qb2ludFNpemUgPSAxLjA7XG4iOworCisgICAgICAgICAgICBtU2hhZGVyICs9ICIgIHZhckNvbG9yID0gQVRUUklCX2NvbG9yO1xuIjsKKyAgICAgICAgICAgIGlmIChtVGV4dHVyZU1hdHJpeEVuYWJsZSkgeworICAgICAgICAgICAgICAgIG1TaGFkZXIgKz0gIiAgdmFyVGV4MCA9IFVOSV9UZXhNYXRyaXggKiBBVFRSSUJfdGV4dHVyZTA7XG4iOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBtU2hhZGVyICs9ICIgIHZhclRleDAgPSBBVFRSSUJfdGV4dHVyZTA7XG4iOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbVNoYWRlciArPSAifVxuIjsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgUHJvZ3JhbVZlcnRleCBjcmVhdGUoKSB7CisgICAgICAgICAgICBidWlsZFNoYWRlclN0cmluZygpOworCisgICAgICAgICAgICBhZGRDb25zdGFudChnZXRDb25zdGFudElucHV0VHlwZShtUlMpKTsKKworICAgICAgICAgICAgRWxlbWVudC5CdWlsZGVyIGIgPSBuZXcgRWxlbWVudC5CdWlsZGVyKG1SUyk7CisgICAgICAgICAgICBiLmFkZChFbGVtZW50LkYzMl80KG1SUyksICJwb3NpdGlvbiIpOworICAgICAgICAgICAgYi5hZGQoRWxlbWVudC5GMzJfNChtUlMpLCAiY29sb3IiKTsKKyAgICAgICAgICAgIGIuYWRkKEVsZW1lbnQuRjMyXzMobVJTKSwgIm5vcm1hbCIpOworICAgICAgICAgICAgYi5hZGQoRWxlbWVudC5GMzJfNChtUlMpLCAidGV4dHVyZTAiKTsKKyAgICAgICAgICAgIGFkZElucHV0KGIuY3JlYXRlKCkpOworCisgICAgICAgICAgICByZXR1cm4gc3VwZXIuY3JlYXRlKCk7CisgICAgICAgIH0KKyAgICB9CisKIAogCiAgICAgcHVibGljIHN0YXRpYyBjbGFzcyBNYXRyaXhBbGxvY2F0aW9uIHsKQEAgLTEwMSwxNiArMTQ1LDE3IEBACiAgICAgICAgIE1hdHJpeDRmIG1UZXh0dXJlOwogCiAgICAgICAgIHB1YmxpYyBBbGxvY2F0aW9uIG1BbGxvYzsKKyAgICAgICAgcHJpdmF0ZSBGaWVsZFBhY2tlciBtSU9CdWZmZXI7CiAKICAgICAgICAgcHVibGljIE1hdHJpeEFsbG9jYXRpb24oUmVuZGVyU2NyaXB0IHJzKSB7Ci0gICAgICAgICAgICBtTW9kZWwgPSBuZXcgTWF0cml4NGYoKTsKLSAgICAgICAgICAgIG1Qcm9qZWN0aW9uID0gbmV3IE1hdHJpeDRmKCk7Ci0gICAgICAgICAgICBtVGV4dHVyZSA9IG5ldyBNYXRyaXg0ZigpOwotCi0gICAgICAgICAgICBtQWxsb2MgPSBBbGxvY2F0aW9uLmNyZWF0ZVNpemVkKHJzLCBFbGVtZW50LmNyZWF0ZVVzZXIocnMsIEVsZW1lbnQuRGF0YVR5cGUuRkxPQVRfMzIpLCA0OCk7Ci0gICAgICAgICAgICBtQWxsb2Muc3ViRGF0YTFEKE1PREVMVklFV19PRkZTRVQsIDE2LCBtTW9kZWwubU1hdCk7Ci0gICAgICAgICAgICBtQWxsb2Muc3ViRGF0YTFEKFBST0pFQ1RJT05fT0ZGU0VULCAxNiwgbVByb2plY3Rpb24ubU1hdCk7Ci0gICAgICAgICAgICBtQWxsb2Muc3ViRGF0YTFEKFRFWFRVUkVfT0ZGU0VULCAxNiwgbVRleHR1cmUubU1hdCk7CisgICAgICAgICAgICBUeXBlIGNvbnN0SW5wdXRUeXBlID0gUHJvZ3JhbVZlcnRleC5CdWlsZGVyLmdldENvbnN0YW50SW5wdXRUeXBlKHJzKTsKKyAgICAgICAgICAgIG1BbGxvYyA9IEFsbG9jYXRpb24uY3JlYXRlVHlwZWQocnMsIGNvbnN0SW5wdXRUeXBlKTsKKyAgICAgICAgICAgIGludCBidWZmZXJTaXplID0gY29uc3RJbnB1dFR5cGUuZ2V0RWxlbWVudCgpLmdldFNpemVCeXRlcygpKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdElucHV0VHlwZS5nZXRFbGVtZW50Q291bnQoKTsKKyAgICAgICAgICAgIG1JT0J1ZmZlciA9IG5ldyBGaWVsZFBhY2tlcihidWZmZXJTaXplKTsKKyAgICAgICAgICAgIGxvYWRNb2RlbHZpZXcobmV3IE1hdHJpeDRmKCkpOworICAgICAgICAgICAgbG9hZFByb2plY3Rpb24obmV3IE1hdHJpeDRmKCkpOworICAgICAgICAgICAgbG9hZFRleHR1cmUobmV3IE1hdHJpeDRmKCkpOwogICAgICAgICB9CiAKICAgICAgICAgcHVibGljIHZvaWQgZGVzdHJveSgpIHsKQEAgLTExOCwyNCArMTYzLDMyIEBACiAgICAgICAgICAgICBtQWxsb2MgPSBudWxsOwogICAgICAgICB9CiAKKyAgICAgICAgcHJpdmF0ZSB2b2lkIGFkZFRvQnVmZmVyKGludCBvZmZzZXQsIE1hdHJpeDRmIG0pIHsKKyAgICAgICAgICAgIG1JT0J1ZmZlci5yZXNldChvZmZzZXQpOworICAgICAgICAgICAgZm9yKGludCBpID0gMDsgaSA8IDE2OyBpICsrKSB7CisgICAgICAgICAgICAgICAgbUlPQnVmZmVyLmFkZEYzMihtLm1NYXRbaV0pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbUFsbG9jLmRhdGEobUlPQnVmZmVyLmdldERhdGEoKSk7CisgICAgICAgIH0KKwogICAgICAgICBwdWJsaWMgdm9pZCBsb2FkTW9kZWx2aWV3KE1hdHJpeDRmIG0pIHsKICAgICAgICAgICAgIG1Nb2RlbCA9IG07Ci0gICAgICAgICAgICBtQWxsb2Muc3ViRGF0YTFEKE1PREVMVklFV19PRkZTRVQsIDE2LCBtLm1NYXQpOworICAgICAgICAgICAgYWRkVG9CdWZmZXIoTU9ERUxWSUVXX09GRlNFVCo0LCBtKTsKICAgICAgICAgfQogCiAgICAgICAgIHB1YmxpYyB2b2lkIGxvYWRQcm9qZWN0aW9uKE1hdHJpeDRmIG0pIHsKICAgICAgICAgICAgIG1Qcm9qZWN0aW9uID0gbTsKLSAgICAgICAgICAgIG1BbGxvYy5zdWJEYXRhMUQoUFJPSkVDVElPTl9PRkZTRVQsIDE2LCBtLm1NYXQpOworICAgICAgICAgICAgYWRkVG9CdWZmZXIoUFJPSkVDVElPTl9PRkZTRVQqNCwgbSk7CiAgICAgICAgIH0KIAogICAgICAgICBwdWJsaWMgdm9pZCBsb2FkVGV4dHVyZShNYXRyaXg0ZiBtKSB7CiAgICAgICAgICAgICBtVGV4dHVyZSA9IG07Ci0gICAgICAgICAgICBtQWxsb2Muc3ViRGF0YTFEKFRFWFRVUkVfT0ZGU0VULCAxNiwgbS5tTWF0KTsKKyAgICAgICAgICAgIGFkZFRvQnVmZmVyKFRFWFRVUkVfT0ZGU0VUKjQsIG0pOwogICAgICAgICB9CiAKICAgICAgICAgcHVibGljIHZvaWQgc2V0dXBPcnRob1dpbmRvdyhpbnQgdywgaW50IGgpIHsKICAgICAgICAgICAgIG1Qcm9qZWN0aW9uLmxvYWRPcnRobygwLHcsIGgsMCwgLTEsMSk7Ci0gICAgICAgICAgICBtQWxsb2Muc3ViRGF0YTFEKFBST0pFQ1RJT05fT0ZGU0VULCAxNiwgbVByb2plY3Rpb24ubU1hdCk7CisgICAgICAgICAgICBhZGRUb0J1ZmZlcihQUk9KRUNUSU9OX09GRlNFVCo0LCBtUHJvamVjdGlvbik7CiAgICAgICAgIH0KIAogICAgICAgICBwdWJsaWMgdm9pZCBzZXR1cE9ydGhvTm9ybWFsaXplZChpbnQgdywgaW50IGgpIHsKQEAgLTE0Nyw3ICsyMDAsNyBAQAogICAgICAgICAgICAgICAgIGZsb2F0IGFzcGVjdCA9ICgoZmxvYXQpaCkgLyB3OwogICAgICAgICAgICAgICAgIG1Qcm9qZWN0aW9uLmxvYWRPcnRobygtMSwxLCAtYXNwZWN0LGFzcGVjdCwgIC0xLDEpOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgbUFsbG9jLnN1YkRhdGExRChQUk9KRUNUSU9OX09GRlNFVCwgMTYsIG1Qcm9qZWN0aW9uLm1NYXQpOworICAgICAgICAgICAgYWRkVG9CdWZmZXIoUFJPSkVDVElPTl9PRkZTRVQqNCwgbVByb2plY3Rpb24pOwogICAgICAgICB9CiAKICAgICAgICAgcHVibGljIHZvaWQgc2V0dXBQcm9qZWN0aW9uTm9ybWFsaXplZChpbnQgdywgaW50IGgpIHsKQEAgLTE3Myw3ICsyMjYsNyBAQAogICAgICAgICAgICAgbTEubG9hZE11bHRpcGx5KG0xLCBtMik7CiAKICAgICAgICAgICAgIG1Qcm9qZWN0aW9uID0gbTE7Ci0gICAgICAgICAgICBtQWxsb2Muc3ViRGF0YTFEKFBST0pFQ1RJT05fT0ZGU0VULCAxNiwgbVByb2plY3Rpb24ubU1hdCk7CisgICAgICAgICAgICBhZGRUb0J1ZmZlcihQUk9KRUNUSU9OX09GRlNFVCo0LCBtUHJvamVjdGlvbik7CiAgICAgICAgIH0KIAogICAgIH0KZGlmZiAtLWdpdCBhL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvUmVuZGVyU2NyaXB0LmphdmEgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L1JlbmRlclNjcmlwdC5qYXZhCmluZGV4IGE5MzUyNDMuLjFmM2UxNTkgMTAwNjQ0Ci0tLSBhL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvUmVuZGVyU2NyaXB0LmphdmEKKysrIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9SZW5kZXJTY3JpcHQuamF2YQpAQCAtNTcsMTUxICs1Nyw0NjYgQEAKICAgICAgICAgfQogICAgIH0KIAorICAgIC8vIE5vbi10aHJlYWRzYWZlIGZ1bmN0aW9ucy4KICAgICBuYXRpdmUgdm9pZCBuSW5pdEVsZW1lbnRzKGludCBhOCwgaW50IHJnYmE0NDQ0LCBpbnQgcmdiYTg4ODgsIGludCByZ2I1NjUpOwotCiAgICAgbmF0aXZlIGludCAgbkRldmljZUNyZWF0ZSgpOwogICAgIG5hdGl2ZSB2b2lkIG5EZXZpY2VEZXN0cm95KGludCBkZXYpOwogICAgIG5hdGl2ZSB2b2lkIG5EZXZpY2VTZXRDb25maWcoaW50IGRldiwgaW50IHBhcmFtLCBpbnQgdmFsdWUpOwotICAgIG5hdGl2ZSBpbnQgIG5Db250ZXh0Q3JlYXRlR0woaW50IGRldiwgaW50IHZlciwgYm9vbGVhbiB1c2VEZXB0aCk7Ci0gICAgbmF0aXZlIGludCAgbkNvbnRleHRDcmVhdGUoaW50IGRldiwgaW50IHZlcik7Ci0gICAgbmF0aXZlIHZvaWQgbkNvbnRleHREZXN0cm95KGludCBjb24pOwotICAgIG5hdGl2ZSB2b2lkIG5Db250ZXh0U2V0U3VyZmFjZShpbnQgdywgaW50IGgsIFN1cmZhY2Ugc3VyKTsKLSAgICBuYXRpdmUgdm9pZCBuQ29udGV4dFNldFByaW9yaXR5KGludCBwKTsKLSAgICBuYXRpdmUgdm9pZCBuQ29udGV4dER1bXAoaW50IGJpdHMpOwotCi0gICAgbmF0aXZlIHZvaWQgbkNvbnRleHRCaW5kUm9vdFNjcmlwdChpbnQgc2NyaXB0KTsKLSAgICBuYXRpdmUgdm9pZCBuQ29udGV4dEJpbmRTYW1wbGVyKGludCBzYW1wbGVyLCBpbnQgc2xvdCk7Ci0gICAgbmF0aXZlIHZvaWQgbkNvbnRleHRCaW5kUHJvZ3JhbUZyYWdtZW50U3RvcmUoaW50IHBmcyk7Ci0gICAgbmF0aXZlIHZvaWQgbkNvbnRleHRCaW5kUHJvZ3JhbUZyYWdtZW50KGludCBwZik7Ci0gICAgbmF0aXZlIHZvaWQgbkNvbnRleHRCaW5kUHJvZ3JhbVZlcnRleChpbnQgcGYpOwotICAgIG5hdGl2ZSB2b2lkIG5Db250ZXh0QmluZFByb2dyYW1SYXN0ZXIoaW50IHByKTsKLSAgICBuYXRpdmUgdm9pZCBuQ29udGV4dFBhdXNlKCk7Ci0gICAgbmF0aXZlIHZvaWQgbkNvbnRleHRSZXN1bWUoKTsKLSAgICBuYXRpdmUgaW50IG5Db250ZXh0R2V0TWVzc2FnZShpbnRbXSBkYXRhLCBib29sZWFuIHdhaXQpOwotICAgIG5hdGl2ZSB2b2lkIG5Db250ZXh0SW5pdFRvQ2xpZW50KCk7Ci0gICAgbmF0aXZlIHZvaWQgbkNvbnRleHREZWluaXRUb0NsaWVudCgpOwotCi0gICAgbmF0aXZlIHZvaWQgbkFzc2lnbk5hbWUoaW50IG9iaiwgYnl0ZVtdIG5hbWUpOwotICAgIG5hdGl2ZSB2b2lkIG5PYmpEZXN0cm95KGludCBpZCk7Ci0gICAgbmF0aXZlIHZvaWQgbk9iakRlc3Ryb3lPT0IoaW50IGlkKTsKLSAgICBuYXRpdmUgaW50ICBuRmlsZU9wZW4oYnl0ZVtdIG5hbWUpOworICAgIG5hdGl2ZSBpbnQgIG5Db250ZXh0R2V0TWVzc2FnZShpbnQgY29uLCBpbnRbXSBkYXRhLCBib29sZWFuIHdhaXQpOworICAgIG5hdGl2ZSB2b2lkIG5Db250ZXh0SW5pdFRvQ2xpZW50KGludCBjb24pOworICAgIG5hdGl2ZSB2b2lkIG5Db250ZXh0RGVpbml0VG9DbGllbnQoaW50IGNvbik7CiAKIAotICAgIG5hdGl2ZSBpbnQgIG5FbGVtZW50Q3JlYXRlKGludCB0eXBlLCBpbnQga2luZCwgYm9vbGVhbiBub3JtLCBpbnQgdmVjU2l6ZSk7Ci0gICAgbmF0aXZlIGludCAgbkVsZW1lbnRDcmVhdGUyKGludFtdIGVsZW1lbnRzLCBTdHJpbmdbXSBuYW1lcyk7CisgICAgLy8gTWV0aG9kcyBiZWxvdyBhcmUgd3JhcHBlZCB0byBwcm90ZWN0IHRoZSBub24tdGhyZWFkc2FmZQorICAgIC8vIGxvY2tsZXNzIGZpZm8uCisgICAgbmF0aXZlIGludCAgcnNuQ29udGV4dENyZWF0ZUdMKGludCBkZXYsIGludCB2ZXIsIGJvb2xlYW4gdXNlRGVwdGgpOworICAgIHN5bmNocm9uaXplZCBpbnQgbkNvbnRleHRDcmVhdGVHTChpbnQgZGV2LCBpbnQgdmVyLCBib29sZWFuIHVzZURlcHRoKSB7CisgICAgICAgIHJldHVybiByc25Db250ZXh0Q3JlYXRlR0woZGV2LCB2ZXIsIHVzZURlcHRoKTsKKyAgICB9CisgICAgbmF0aXZlIGludCAgcnNuQ29udGV4dENyZWF0ZShpbnQgZGV2LCBpbnQgdmVyKTsKKyAgICBzeW5jaHJvbml6ZWQgaW50IG5Db250ZXh0Q3JlYXRlKGludCBkZXYsIGludCB2ZXIpIHsKKyAgICAgICAgcmV0dXJuIHJzbkNvbnRleHRDcmVhdGUoZGV2LCB2ZXIpOworICAgIH0KKyAgICBuYXRpdmUgdm9pZCByc25Db250ZXh0RGVzdHJveShpbnQgY29uKTsKKyAgICBzeW5jaHJvbml6ZWQgdm9pZCBuQ29udGV4dERlc3Ryb3koKSB7CisgICAgICAgIHJzbkNvbnRleHREZXN0cm95KG1Db250ZXh0KTsKKyAgICB9CisgICAgbmF0aXZlIHZvaWQgcnNuQ29udGV4dFNldFN1cmZhY2UoaW50IGNvbiwgaW50IHcsIGludCBoLCBTdXJmYWNlIHN1cik7CisgICAgc3luY2hyb25pemVkIHZvaWQgbkNvbnRleHRTZXRTdXJmYWNlKGludCB3LCBpbnQgaCwgU3VyZmFjZSBzdXIpIHsKKyAgICAgICAgcnNuQ29udGV4dFNldFN1cmZhY2UobUNvbnRleHQsIHcsIGgsIHN1cik7CisgICAgfQorICAgIG5hdGl2ZSB2b2lkIHJzbkNvbnRleHRTZXRQcmlvcml0eShpbnQgY29uLCBpbnQgcCk7CisgICAgc3luY2hyb25pemVkIHZvaWQgbkNvbnRleHRTZXRQcmlvcml0eShpbnQgcCkgeworICAgICAgICByc25Db250ZXh0U2V0UHJpb3JpdHkobUNvbnRleHQsIHApOworICAgIH0KKyAgICBuYXRpdmUgdm9pZCByc25Db250ZXh0RHVtcChpbnQgY29uLCBpbnQgYml0cyk7CisgICAgc3luY2hyb25pemVkIHZvaWQgbkNvbnRleHREdW1wKGludCBiaXRzKSB7CisgICAgICAgIHJzbkNvbnRleHREdW1wKG1Db250ZXh0LCBiaXRzKTsKKyAgICB9CisgICAgbmF0aXZlIHZvaWQgcnNuQ29udGV4dEZpbmlzaChpbnQgY29uKTsKKyAgICBzeW5jaHJvbml6ZWQgdm9pZCBuQ29udGV4dEZpbmlzaCgpIHsKKyAgICAgICAgcnNuQ29udGV4dEZpbmlzaChtQ29udGV4dCk7CisgICAgfQogCi0gICAgbmF0aXZlIHZvaWQgblR5cGVCZWdpbihpbnQgZWxlbWVudElEKTsKLSAgICBuYXRpdmUgdm9pZCBuVHlwZUFkZChpbnQgZGltLCBpbnQgdmFsKTsKLSAgICBuYXRpdmUgaW50ICBuVHlwZUNyZWF0ZSgpOwotICAgIG5hdGl2ZSB2b2lkIG5UeXBlRmluYWxEZXN0cm95KFR5cGUgdCk7Ci0gICAgbmF0aXZlIHZvaWQgblR5cGVTZXR1cEZpZWxkcyhUeXBlIHQsIGludFtdIHR5cGVzLCBpbnRbXSBiaXRzLCBGaWVsZFtdIElEcyk7CisgICAgbmF0aXZlIHZvaWQgcnNuQ29udGV4dEJpbmRSb290U2NyaXB0KGludCBjb24sIGludCBzY3JpcHQpOworICAgIHN5bmNocm9uaXplZCB2b2lkIG5Db250ZXh0QmluZFJvb3RTY3JpcHQoaW50IHNjcmlwdCkgeworICAgICAgICByc25Db250ZXh0QmluZFJvb3RTY3JpcHQobUNvbnRleHQsIHNjcmlwdCk7CisgICAgfQorICAgIG5hdGl2ZSB2b2lkIHJzbkNvbnRleHRCaW5kU2FtcGxlcihpbnQgY29uLCBpbnQgc2FtcGxlciwgaW50IHNsb3QpOworICAgIHN5bmNocm9uaXplZCB2b2lkIG5Db250ZXh0QmluZFNhbXBsZXIoaW50IHNhbXBsZXIsIGludCBzbG90KSB7CisgICAgICAgIHJzbkNvbnRleHRCaW5kU2FtcGxlcihtQ29udGV4dCwgc2FtcGxlciwgc2xvdCk7CisgICAgfQorICAgIG5hdGl2ZSB2b2lkIHJzbkNvbnRleHRCaW5kUHJvZ3JhbVN0b3JlKGludCBjb24sIGludCBwZnMpOworICAgIHN5bmNocm9uaXplZCB2b2lkIG5Db250ZXh0QmluZFByb2dyYW1TdG9yZShpbnQgcGZzKSB7CisgICAgICAgIHJzbkNvbnRleHRCaW5kUHJvZ3JhbVN0b3JlKG1Db250ZXh0LCBwZnMpOworICAgIH0KKyAgICBuYXRpdmUgdm9pZCByc25Db250ZXh0QmluZFByb2dyYW1GcmFnbWVudChpbnQgY29uLCBpbnQgcGYpOworICAgIHN5bmNocm9uaXplZCB2b2lkIG5Db250ZXh0QmluZFByb2dyYW1GcmFnbWVudChpbnQgcGYpIHsKKyAgICAgICAgcnNuQ29udGV4dEJpbmRQcm9ncmFtRnJhZ21lbnQobUNvbnRleHQsIHBmKTsKKyAgICB9CisgICAgbmF0aXZlIHZvaWQgcnNuQ29udGV4dEJpbmRQcm9ncmFtVmVydGV4KGludCBjb24sIGludCBwdik7CisgICAgc3luY2hyb25pemVkIHZvaWQgbkNvbnRleHRCaW5kUHJvZ3JhbVZlcnRleChpbnQgcHYpIHsKKyAgICAgICAgcnNuQ29udGV4dEJpbmRQcm9ncmFtVmVydGV4KG1Db250ZXh0LCBwdik7CisgICAgfQorICAgIG5hdGl2ZSB2b2lkIHJzbkNvbnRleHRCaW5kUHJvZ3JhbVJhc3RlcihpbnQgY29uLCBpbnQgcHIpOworICAgIHN5bmNocm9uaXplZCB2b2lkIG5Db250ZXh0QmluZFByb2dyYW1SYXN0ZXIoaW50IHByKSB7CisgICAgICAgIHJzbkNvbnRleHRCaW5kUHJvZ3JhbVJhc3RlcihtQ29udGV4dCwgcHIpOworICAgIH0KKyAgICBuYXRpdmUgdm9pZCByc25Db250ZXh0UGF1c2UoaW50IGNvbik7CisgICAgc3luY2hyb25pemVkIHZvaWQgbkNvbnRleHRQYXVzZSgpIHsKKyAgICAgICAgcnNuQ29udGV4dFBhdXNlKG1Db250ZXh0KTsKKyAgICB9CisgICAgbmF0aXZlIHZvaWQgcnNuQ29udGV4dFJlc3VtZShpbnQgY29uKTsKKyAgICBzeW5jaHJvbml6ZWQgdm9pZCBuQ29udGV4dFJlc3VtZSgpIHsKKyAgICAgICAgcnNuQ29udGV4dFJlc3VtZShtQ29udGV4dCk7CisgICAgfQogCi0gICAgbmF0aXZlIGludCAgbkFsbG9jYXRpb25DcmVhdGVUeXBlZChpbnQgdHlwZSk7Ci0gICAgbmF0aXZlIGludCAgbkFsbG9jYXRpb25DcmVhdGVGcm9tQml0bWFwKGludCBkc3RGbXQsIGJvb2xlYW4gZ2VuTWlwcywgQml0bWFwIGJtcCk7Ci0gICAgbmF0aXZlIGludCAgbkFsbG9jYXRpb25DcmVhdGVCaXRtYXBSZWYoaW50IHR5cGUsIEJpdG1hcCBibXApOwotICAgIG5hdGl2ZSBpbnQgIG5BbGxvY2F0aW9uQ3JlYXRlRnJvbUJpdG1hcEJveGVkKGludCBkc3RGbXQsIGJvb2xlYW4gZ2VuTWlwcywgQml0bWFwIGJtcCk7Ci0gICAgbmF0aXZlIGludCAgbkFsbG9jYXRpb25DcmVhdGVGcm9tQXNzZXRTdHJlYW0oaW50IGRzdEZtdCwgYm9vbGVhbiBnZW5NaXBzLCBpbnQgYXNzZXRTdHJlYW0pOworICAgIG5hdGl2ZSB2b2lkIHJzbkFzc2lnbk5hbWUoaW50IGNvbiwgaW50IG9iaiwgYnl0ZVtdIG5hbWUpOworICAgIHN5bmNocm9uaXplZCB2b2lkIG5Bc3NpZ25OYW1lKGludCBvYmosIGJ5dGVbXSBuYW1lKSB7CisgICAgICAgIHJzbkFzc2lnbk5hbWUobUNvbnRleHQsIG9iaiwgbmFtZSk7CisgICAgfQorICAgIG5hdGl2ZSBTdHJpbmcgcnNuR2V0TmFtZShpbnQgY29uLCBpbnQgb2JqKTsKKyAgICBzeW5jaHJvbml6ZWQgU3RyaW5nIG5HZXROYW1lKGludCBvYmopIHsKKyAgICAgICAgcmV0dXJuIHJzbkdldE5hbWUobUNvbnRleHQsIG9iaik7CisgICAgfQorICAgIG5hdGl2ZSB2b2lkIHJzbk9iakRlc3Ryb3koaW50IGNvbiwgaW50IGlkKTsKKyAgICBzeW5jaHJvbml6ZWQgdm9pZCBuT2JqRGVzdHJveShpbnQgaWQpIHsKKyAgICAgICAgcnNuT2JqRGVzdHJveShtQ29udGV4dCwgaWQpOworICAgIH0KKyAgICBuYXRpdmUgaW50ICByc25GaWxlT3BlbihpbnQgY29uLCBieXRlW10gbmFtZSk7CisgICAgc3luY2hyb25pemVkIGludCBuRmlsZU9wZW4oYnl0ZVtdIG5hbWUpIHsKKyAgICAgICAgcmV0dXJuIHJzbkZpbGVPcGVuKG1Db250ZXh0LCBuYW1lKTsKKyAgICB9CiAKLSAgICBuYXRpdmUgdm9pZCBuQWxsb2NhdGlvblVwbG9hZFRvVGV4dHVyZShpbnQgYWxsb2MsIGJvb2xlYW4gZ2VuTWlwcywgaW50IGJhc2VNaW9MZXZlbCk7Ci0gICAgbmF0aXZlIHZvaWQgbkFsbG9jYXRpb25VcGxvYWRUb0J1ZmZlck9iamVjdChpbnQgYWxsb2MpOworICAgIG5hdGl2ZSBpbnQgIHJzbkVsZW1lbnRDcmVhdGUoaW50IGNvbiwgaW50IHR5cGUsIGludCBraW5kLCBib29sZWFuIG5vcm0sIGludCB2ZWNTaXplKTsKKyAgICBzeW5jaHJvbml6ZWQgaW50IG5FbGVtZW50Q3JlYXRlKGludCB0eXBlLCBpbnQga2luZCwgYm9vbGVhbiBub3JtLCBpbnQgdmVjU2l6ZSkgeworICAgICAgICByZXR1cm4gcnNuRWxlbWVudENyZWF0ZShtQ29udGV4dCwgdHlwZSwga2luZCwgbm9ybSwgdmVjU2l6ZSk7CisgICAgfQorICAgIG5hdGl2ZSBpbnQgIHJzbkVsZW1lbnRDcmVhdGUyKGludCBjb24sIGludFtdIGVsZW1lbnRzLCBTdHJpbmdbXSBuYW1lcywgaW50W10gYXJyYXlTaXplcyk7CisgICAgc3luY2hyb25pemVkIGludCBuRWxlbWVudENyZWF0ZTIoaW50W10gZWxlbWVudHMsIFN0cmluZ1tdIG5hbWVzLCBpbnRbXSBhcnJheVNpemVzKSB7CisgICAgICAgIHJldHVybiByc25FbGVtZW50Q3JlYXRlMihtQ29udGV4dCwgZWxlbWVudHMsIG5hbWVzLCBhcnJheVNpemVzKTsKKyAgICB9CisgICAgbmF0aXZlIHZvaWQgcnNuRWxlbWVudEdldE5hdGl2ZURhdGEoaW50IGNvbiwgaW50IGlkLCBpbnRbXSBlbGVtZW50RGF0YSk7CisgICAgc3luY2hyb25pemVkIHZvaWQgbkVsZW1lbnRHZXROYXRpdmVEYXRhKGludCBpZCwgaW50W10gZWxlbWVudERhdGEpIHsKKyAgICAgICAgcnNuRWxlbWVudEdldE5hdGl2ZURhdGEobUNvbnRleHQsIGlkLCBlbGVtZW50RGF0YSk7CisgICAgfQorICAgIG5hdGl2ZSB2b2lkIHJzbkVsZW1lbnRHZXRTdWJFbGVtZW50cyhpbnQgY29uLCBpbnQgaWQsIGludFtdIElEcywgU3RyaW5nW10gbmFtZXMpOworICAgIHN5bmNocm9uaXplZCB2b2lkIG5FbGVtZW50R2V0U3ViRWxlbWVudHMoaW50IGlkLCBpbnRbXSBJRHMsIFN0cmluZ1tdIG5hbWVzKSB7CisgICAgICAgIHJzbkVsZW1lbnRHZXRTdWJFbGVtZW50cyhtQ29udGV4dCwgaWQsIElEcywgbmFtZXMpOworICAgIH0KIAotICAgIG5hdGl2ZSB2b2lkIG5BbGxvY2F0aW9uU3ViRGF0YTFEKGludCBpZCwgaW50IG9mZiwgaW50IGNvdW50LCBpbnRbXSBkLCBpbnQgc2l6ZUJ5dGVzKTsKLSAgICBuYXRpdmUgdm9pZCBuQWxsb2NhdGlvblN1YkRhdGExRChpbnQgaWQsIGludCBvZmYsIGludCBjb3VudCwgc2hvcnRbXSBkLCBpbnQgc2l6ZUJ5dGVzKTsKLSAgICBuYXRpdmUgdm9pZCBuQWxsb2NhdGlvblN1YkRhdGExRChpbnQgaWQsIGludCBvZmYsIGludCBjb3VudCwgYnl0ZVtdIGQsIGludCBzaXplQnl0ZXMpOwotICAgIG5hdGl2ZSB2b2lkIG5BbGxvY2F0aW9uU3ViRGF0YTFEKGludCBpZCwgaW50IG9mZiwgaW50IGNvdW50LCBmbG9hdFtdIGQsIGludCBzaXplQnl0ZXMpOworICAgIG5hdGl2ZSB2b2lkIHJzblR5cGVCZWdpbihpbnQgY29uLCBpbnQgZWxlbWVudElEKTsKKyAgICBzeW5jaHJvbml6ZWQgdm9pZCBuVHlwZUJlZ2luKGludCBlbGVtZW50SUQpIHsKKyAgICAgICAgcnNuVHlwZUJlZ2luKG1Db250ZXh0LCBlbGVtZW50SUQpOworICAgIH0KKyAgICBuYXRpdmUgdm9pZCByc25UeXBlQWRkKGludCBjb24sIGludCBkaW0sIGludCB2YWwpOworICAgIHN5bmNocm9uaXplZCB2b2lkIG5UeXBlQWRkKGludCBkaW0sIGludCB2YWwpIHsKKyAgICAgICAgcnNuVHlwZUFkZChtQ29udGV4dCwgZGltLCB2YWwpOworICAgIH0KKyAgICBuYXRpdmUgaW50ICByc25UeXBlQ3JlYXRlKGludCBjb24pOworICAgIHN5bmNocm9uaXplZCBpbnQgblR5cGVDcmVhdGUoKSB7CisgICAgICAgIHJldHVybiByc25UeXBlQ3JlYXRlKG1Db250ZXh0KTsKKyAgICB9CisgICAgbmF0aXZlIHZvaWQgcnNuVHlwZUdldE5hdGl2ZURhdGEoaW50IGNvbiwgaW50IGlkLCBpbnRbXSB0eXBlRGF0YSk7CisgICAgc3luY2hyb25pemVkIHZvaWQgblR5cGVHZXROYXRpdmVEYXRhKGludCBpZCwgaW50W10gdHlwZURhdGEpIHsKKyAgICAgICAgcnNuVHlwZUdldE5hdGl2ZURhdGEobUNvbnRleHQsIGlkLCB0eXBlRGF0YSk7CisgICAgfQogCi0gICAgbmF0aXZlIHZvaWQgbkFsbG9jYXRpb25TdWJEYXRhMkQoaW50IGlkLCBpbnQgeG9mZiwgaW50IHlvZmYsIGludCB3LCBpbnQgaCwgaW50W10gZCwgaW50IHNpemVCeXRlcyk7Ci0gICAgbmF0aXZlIHZvaWQgbkFsbG9jYXRpb25TdWJEYXRhMkQoaW50IGlkLCBpbnQgeG9mZiwgaW50IHlvZmYsIGludCB3LCBpbnQgaCwgZmxvYXRbXSBkLCBpbnQgc2l6ZUJ5dGVzKTsKLSAgICBuYXRpdmUgdm9pZCBuQWxsb2NhdGlvblJlYWQoaW50IGlkLCBpbnRbXSBkKTsKLSAgICBuYXRpdmUgdm9pZCBuQWxsb2NhdGlvblJlYWQoaW50IGlkLCBmbG9hdFtdIGQpOwotICAgIG5hdGl2ZSB2b2lkIG5BbGxvY2F0aW9uU3ViRGF0YUZyb21PYmplY3QoaW50IGlkLCBUeXBlIHQsIGludCBvZmZzZXQsIE9iamVjdCBvKTsKLSAgICBuYXRpdmUgdm9pZCBuQWxsb2NhdGlvblN1YlJlYWRGcm9tT2JqZWN0KGludCBpZCwgVHlwZSB0LCBpbnQgb2Zmc2V0LCBPYmplY3Qgbyk7CisgICAgbmF0aXZlIGludCAgcnNuQWxsb2NhdGlvbkNyZWF0ZVR5cGVkKGludCBjb24sIGludCB0eXBlKTsKKyAgICBzeW5jaHJvbml6ZWQgaW50IG5BbGxvY2F0aW9uQ3JlYXRlVHlwZWQoaW50IHR5cGUpIHsKKyAgICAgICAgcmV0dXJuIHJzbkFsbG9jYXRpb25DcmVhdGVUeXBlZChtQ29udGV4dCwgdHlwZSk7CisgICAgfQorICAgIG5hdGl2ZSBpbnQgIHJzbkFsbG9jYXRpb25DcmVhdGVGcm9tQml0bWFwKGludCBjb24sIGludCBkc3RGbXQsIGJvb2xlYW4gZ2VuTWlwcywgQml0bWFwIGJtcCk7CisgICAgc3luY2hyb25pemVkIGludCBuQWxsb2NhdGlvbkNyZWF0ZUZyb21CaXRtYXAoaW50IGRzdEZtdCwgYm9vbGVhbiBnZW5NaXBzLCBCaXRtYXAgYm1wKSB7CisgICAgICAgIHJldHVybiByc25BbGxvY2F0aW9uQ3JlYXRlRnJvbUJpdG1hcChtQ29udGV4dCwgZHN0Rm10LCBnZW5NaXBzLCBibXApOworICAgIH0KKyAgICBuYXRpdmUgaW50ICByc25BbGxvY2F0aW9uQ3JlYXRlQml0bWFwUmVmKGludCBjb24sIGludCB0eXBlLCBCaXRtYXAgYm1wKTsKKyAgICBzeW5jaHJvbml6ZWQgaW50IG5BbGxvY2F0aW9uQ3JlYXRlQml0bWFwUmVmKGludCB0eXBlLCBCaXRtYXAgYm1wKSB7CisgICAgICAgIHJldHVybiByc25BbGxvY2F0aW9uQ3JlYXRlQml0bWFwUmVmKG1Db250ZXh0LCB0eXBlLCBibXApOworICAgIH0KKyAgICBuYXRpdmUgaW50ICByc25BbGxvY2F0aW9uQ3JlYXRlRnJvbUJpdG1hcEJveGVkKGludCBjb24sIGludCBkc3RGbXQsIGJvb2xlYW4gZ2VuTWlwcywgQml0bWFwIGJtcCk7CisgICAgc3luY2hyb25pemVkIGludCBuQWxsb2NhdGlvbkNyZWF0ZUZyb21CaXRtYXBCb3hlZChpbnQgZHN0Rm10LCBib29sZWFuIGdlbk1pcHMsIEJpdG1hcCBibXApIHsKKyAgICAgICAgcmV0dXJuIHJzbkFsbG9jYXRpb25DcmVhdGVGcm9tQml0bWFwQm94ZWQobUNvbnRleHQsIGRzdEZtdCwgZ2VuTWlwcywgYm1wKTsKKyAgICB9CisgICAgbmF0aXZlIGludCAgcnNuQWxsb2NhdGlvbkNyZWF0ZUZyb21Bc3NldFN0cmVhbShpbnQgY29uLCBpbnQgZHN0Rm10LCBib29sZWFuIGdlbk1pcHMsIGludCBhc3NldFN0cmVhbSk7CisgICAgc3luY2hyb25pemVkIGludCBuQWxsb2NhdGlvbkNyZWF0ZUZyb21Bc3NldFN0cmVhbShpbnQgZHN0Rm10LCBib29sZWFuIGdlbk1pcHMsIGludCBhc3NldFN0cmVhbSkgeworICAgICAgICByZXR1cm4gcnNuQWxsb2NhdGlvbkNyZWF0ZUZyb21Bc3NldFN0cmVhbShtQ29udGV4dCwgZHN0Rm10LCBnZW5NaXBzLCBhc3NldFN0cmVhbSk7CisgICAgfQogCi0gICAgbmF0aXZlIHZvaWQgbkFkYXB0ZXIxREJpbmRBbGxvY2F0aW9uKGludCBhZCwgaW50IGFsbG9jKTsKLSAgICBuYXRpdmUgdm9pZCBuQWRhcHRlcjFEU2V0Q29uc3RyYWludChpbnQgYWQsIGludCBkaW0sIGludCB2YWx1ZSk7Ci0gICAgbmF0aXZlIHZvaWQgbkFkYXB0ZXIxRERhdGEoaW50IGFkLCBpbnRbXSBkKTsKLSAgICBuYXRpdmUgdm9pZCBuQWRhcHRlcjFERGF0YShpbnQgYWQsIGZsb2F0W10gZCk7Ci0gICAgbmF0aXZlIHZvaWQgbkFkYXB0ZXIxRFN1YkRhdGEoaW50IGFkLCBpbnQgb2ZmLCBpbnQgY291bnQsIGludFtdIGQpOwotICAgIG5hdGl2ZSB2b2lkIG5BZGFwdGVyMURTdWJEYXRhKGludCBhZCwgaW50IG9mZiwgaW50IGNvdW50LCBmbG9hdFtdIGQpOwotICAgIG5hdGl2ZSBpbnQgIG5BZGFwdGVyMURDcmVhdGUoKTsKKyAgICBuYXRpdmUgdm9pZCByc25BbGxvY2F0aW9uVXBsb2FkVG9UZXh0dXJlKGludCBjb24sIGludCBhbGxvYywgYm9vbGVhbiBnZW5NaXBzLCBpbnQgYmFzZU1pb0xldmVsKTsKKyAgICBzeW5jaHJvbml6ZWQgdm9pZCBuQWxsb2NhdGlvblVwbG9hZFRvVGV4dHVyZShpbnQgYWxsb2MsIGJvb2xlYW4gZ2VuTWlwcywgaW50IGJhc2VNaW9MZXZlbCkgeworICAgICAgICByc25BbGxvY2F0aW9uVXBsb2FkVG9UZXh0dXJlKG1Db250ZXh0LCBhbGxvYywgZ2VuTWlwcywgYmFzZU1pb0xldmVsKTsKKyAgICB9CisgICAgbmF0aXZlIHZvaWQgcnNuQWxsb2NhdGlvblVwbG9hZFRvQnVmZmVyT2JqZWN0KGludCBjb24sIGludCBhbGxvYyk7CisgICAgc3luY2hyb25pemVkIHZvaWQgbkFsbG9jYXRpb25VcGxvYWRUb0J1ZmZlck9iamVjdChpbnQgYWxsb2MpIHsKKyAgICAgICAgcnNuQWxsb2NhdGlvblVwbG9hZFRvQnVmZmVyT2JqZWN0KG1Db250ZXh0LCBhbGxvYyk7CisgICAgfQogCi0gICAgbmF0aXZlIHZvaWQgbkFkYXB0ZXIyREJpbmRBbGxvY2F0aW9uKGludCBhZCwgaW50IGFsbG9jKTsKLSAgICBuYXRpdmUgdm9pZCBuQWRhcHRlcjJEU2V0Q29uc3RyYWludChpbnQgYWQsIGludCBkaW0sIGludCB2YWx1ZSk7Ci0gICAgbmF0aXZlIHZvaWQgbkFkYXB0ZXIyRERhdGEoaW50IGFkLCBpbnRbXSBkKTsKLSAgICBuYXRpdmUgdm9pZCBuQWRhcHRlcjJERGF0YShpbnQgYWQsIGZsb2F0W10gZCk7Ci0gICAgbmF0aXZlIHZvaWQgbkFkYXB0ZXIyRFN1YkRhdGEoaW50IGFkLCBpbnQgeG9mZiwgaW50IHlvZmYsIGludCB3LCBpbnQgaCwgaW50W10gZCk7Ci0gICAgbmF0aXZlIHZvaWQgbkFkYXB0ZXIyRFN1YkRhdGEoaW50IGFkLCBpbnQgeG9mZiwgaW50IHlvZmYsIGludCB3LCBpbnQgaCwgZmxvYXRbXSBkKTsKLSAgICBuYXRpdmUgaW50ICBuQWRhcHRlcjJEQ3JlYXRlKCk7CisgICAgbmF0aXZlIHZvaWQgcnNuQWxsb2NhdGlvblN1YkRhdGExRChpbnQgY29uLCBpbnQgaWQsIGludCBvZmYsIGludCBjb3VudCwgaW50W10gZCwgaW50IHNpemVCeXRlcyk7CisgICAgc3luY2hyb25pemVkIHZvaWQgbkFsbG9jYXRpb25TdWJEYXRhMUQoaW50IGlkLCBpbnQgb2ZmLCBpbnQgY291bnQsIGludFtdIGQsIGludCBzaXplQnl0ZXMpIHsKKyAgICAgICAgcnNuQWxsb2NhdGlvblN1YkRhdGExRChtQ29udGV4dCwgaWQsIG9mZiwgY291bnQsIGQsIHNpemVCeXRlcyk7CisgICAgfQorICAgIG5hdGl2ZSB2b2lkIHJzbkFsbG9jYXRpb25TdWJEYXRhMUQoaW50IGNvbiwgaW50IGlkLCBpbnQgb2ZmLCBpbnQgY291bnQsIHNob3J0W10gZCwgaW50IHNpemVCeXRlcyk7CisgICAgc3luY2hyb25pemVkIHZvaWQgbkFsbG9jYXRpb25TdWJEYXRhMUQoaW50IGlkLCBpbnQgb2ZmLCBpbnQgY291bnQsIHNob3J0W10gZCwgaW50IHNpemVCeXRlcykgeworICAgICAgICByc25BbGxvY2F0aW9uU3ViRGF0YTFEKG1Db250ZXh0LCBpZCwgb2ZmLCBjb3VudCwgZCwgc2l6ZUJ5dGVzKTsKKyAgICB9CisgICAgbmF0aXZlIHZvaWQgcnNuQWxsb2NhdGlvblN1YkRhdGExRChpbnQgY29uLCBpbnQgaWQsIGludCBvZmYsIGludCBjb3VudCwgYnl0ZVtdIGQsIGludCBzaXplQnl0ZXMpOworICAgIHN5bmNocm9uaXplZCB2b2lkIG5BbGxvY2F0aW9uU3ViRGF0YTFEKGludCBpZCwgaW50IG9mZiwgaW50IGNvdW50LCBieXRlW10gZCwgaW50IHNpemVCeXRlcykgeworICAgICAgICByc25BbGxvY2F0aW9uU3ViRGF0YTFEKG1Db250ZXh0LCBpZCwgb2ZmLCBjb3VudCwgZCwgc2l6ZUJ5dGVzKTsKKyAgICB9CisgICAgbmF0aXZlIHZvaWQgcnNuQWxsb2NhdGlvblN1YkVsZW1lbnREYXRhMUQoaW50IGNvbiwgaW50IGlkLCBpbnQgeG9mZiwgaW50IGNvbXBJZHgsIGJ5dGVbXSBkLCBpbnQgc2l6ZUJ5dGVzKTsKKyAgICBzeW5jaHJvbml6ZWQgdm9pZCBuQWxsb2NhdGlvblN1YkVsZW1lbnREYXRhMUQoaW50IGlkLCBpbnQgeG9mZiwgaW50IGNvbXBJZHgsIGJ5dGVbXSBkLCBpbnQgc2l6ZUJ5dGVzKSB7CisgICAgICAgIHJzbkFsbG9jYXRpb25TdWJFbGVtZW50RGF0YTFEKG1Db250ZXh0LCBpZCwgeG9mZiwgY29tcElkeCwgZCwgc2l6ZUJ5dGVzKTsKKyAgICB9CisgICAgbmF0aXZlIHZvaWQgcnNuQWxsb2NhdGlvblN1YkRhdGExRChpbnQgY29uLCBpbnQgaWQsIGludCBvZmYsIGludCBjb3VudCwgZmxvYXRbXSBkLCBpbnQgc2l6ZUJ5dGVzKTsKKyAgICBzeW5jaHJvbml6ZWQgdm9pZCBuQWxsb2NhdGlvblN1YkRhdGExRChpbnQgaWQsIGludCBvZmYsIGludCBjb3VudCwgZmxvYXRbXSBkLCBpbnQgc2l6ZUJ5dGVzKSB7CisgICAgICAgIHJzbkFsbG9jYXRpb25TdWJEYXRhMUQobUNvbnRleHQsIGlkLCBvZmYsIGNvdW50LCBkLCBzaXplQnl0ZXMpOworICAgIH0KIAotICAgIG5hdGl2ZSB2b2lkIG5TY3JpcHRCaW5kQWxsb2NhdGlvbihpbnQgc2NyaXB0LCBpbnQgYWxsb2MsIGludCBzbG90KTsKLSAgICBuYXRpdmUgdm9pZCBuU2NyaXB0U2V0Q2xlYXJDb2xvcihpbnQgc2NyaXB0LCBmbG9hdCByLCBmbG9hdCBnLCBmbG9hdCBiLCBmbG9hdCBhKTsKLSAgICBuYXRpdmUgdm9pZCBuU2NyaXB0U2V0Q2xlYXJEZXB0aChpbnQgc2NyaXB0LCBmbG9hdCBkZXB0aCk7Ci0gICAgbmF0aXZlIHZvaWQgblNjcmlwdFNldENsZWFyU3RlbmNpbChpbnQgc2NyaXB0LCBpbnQgc3RlbmNpbCk7Ci0gICAgbmF0aXZlIHZvaWQgblNjcmlwdFNldFRpbWVab25lKGludCBzY3JpcHQsIGJ5dGVbXSB0aW1lWm9uZSk7Ci0gICAgbmF0aXZlIHZvaWQgblNjcmlwdFNldFR5cGUoaW50IHR5cGUsIGJvb2xlYW4gd3JpdGFibGUsIFN0cmluZyBuYW1lLCBpbnQgc2xvdCk7Ci0gICAgbmF0aXZlIHZvaWQgblNjcmlwdFNldFJvb3QoYm9vbGVhbiBpc1Jvb3QpOwotICAgIG5hdGl2ZSB2b2lkIG5TY3JpcHRTZXRJbnZva2FibGUoU3RyaW5nIG5hbWUsIGludCBzbG90KTsKLSAgICBuYXRpdmUgdm9pZCBuU2NyaXB0SW52b2tlKGludCBpZCwgaW50IHNsb3QpOworICAgIG5hdGl2ZSB2b2lkIHJzbkFsbG9jYXRpb25TdWJEYXRhMkQoaW50IGNvbiwgaW50IGlkLCBpbnQgeG9mZiwgaW50IHlvZmYsIGludCB3LCBpbnQgaCwgaW50W10gZCwgaW50IHNpemVCeXRlcyk7CisgICAgc3luY2hyb25pemVkIHZvaWQgbkFsbG9jYXRpb25TdWJEYXRhMkQoaW50IGlkLCBpbnQgeG9mZiwgaW50IHlvZmYsIGludCB3LCBpbnQgaCwgaW50W10gZCwgaW50IHNpemVCeXRlcykgeworICAgICAgICByc25BbGxvY2F0aW9uU3ViRGF0YTJEKG1Db250ZXh0LCBpZCwgeG9mZiwgeW9mZiwgdywgaCwgZCwgc2l6ZUJ5dGVzKTsKKyAgICB9CisgICAgbmF0aXZlIHZvaWQgcnNuQWxsb2NhdGlvblN1YkRhdGEyRChpbnQgY29uLCBpbnQgaWQsIGludCB4b2ZmLCBpbnQgeW9mZiwgaW50IHcsIGludCBoLCBmbG9hdFtdIGQsIGludCBzaXplQnl0ZXMpOworICAgIHN5bmNocm9uaXplZCB2b2lkIG5BbGxvY2F0aW9uU3ViRGF0YTJEKGludCBpZCwgaW50IHhvZmYsIGludCB5b2ZmLCBpbnQgdywgaW50IGgsIGZsb2F0W10gZCwgaW50IHNpemVCeXRlcykgeworICAgICAgICByc25BbGxvY2F0aW9uU3ViRGF0YTJEKG1Db250ZXh0LCBpZCwgeG9mZiwgeW9mZiwgdywgaCwgZCwgc2l6ZUJ5dGVzKTsKKyAgICB9CisgICAgbmF0aXZlIHZvaWQgcnNuQWxsb2NhdGlvblJlYWQoaW50IGNvbiwgaW50IGlkLCBpbnRbXSBkKTsKKyAgICBzeW5jaHJvbml6ZWQgdm9pZCBuQWxsb2NhdGlvblJlYWQoaW50IGlkLCBpbnRbXSBkKSB7CisgICAgICAgIHJzbkFsbG9jYXRpb25SZWFkKG1Db250ZXh0LCBpZCwgZCk7CisgICAgfQorICAgIG5hdGl2ZSB2b2lkIHJzbkFsbG9jYXRpb25SZWFkKGludCBjb24sIGludCBpZCwgZmxvYXRbXSBkKTsKKyAgICBzeW5jaHJvbml6ZWQgdm9pZCBuQWxsb2NhdGlvblJlYWQoaW50IGlkLCBmbG9hdFtdIGQpIHsKKyAgICAgICAgcnNuQWxsb2NhdGlvblJlYWQobUNvbnRleHQsIGlkLCBkKTsKKyAgICB9CisgICAgbmF0aXZlIGludCAgcnNuQWxsb2NhdGlvbkdldFR5cGUoaW50IGNvbiwgaW50IGlkKTsKKyAgICBzeW5jaHJvbml6ZWQgaW50IG5BbGxvY2F0aW9uR2V0VHlwZShpbnQgaWQpIHsKKyAgICAgICAgcmV0dXJuIHJzbkFsbG9jYXRpb25HZXRUeXBlKG1Db250ZXh0LCBpZCk7CisgICAgfQogCi0gICAgbmF0aXZlIHZvaWQgblNjcmlwdENCZWdpbigpOwotICAgIG5hdGl2ZSB2b2lkIG5TY3JpcHRDU2V0U2NyaXB0KGJ5dGVbXSBzY3JpcHQsIGludCBvZmZzZXQsIGludCBsZW5ndGgpOwotICAgIG5hdGl2ZSBpbnQgIG5TY3JpcHRDQ3JlYXRlKCk7Ci0gICAgbmF0aXZlIHZvaWQgblNjcmlwdENBZGREZWZpbmVJMzIoU3RyaW5nIG5hbWUsIGludCB2YWx1ZSk7Ci0gICAgbmF0aXZlIHZvaWQgblNjcmlwdENBZGREZWZpbmVGKFN0cmluZyBuYW1lLCBmbG9hdCB2YWx1ZSk7CisgICAgbmF0aXZlIGludCAgcnNuRmlsZUEzRENyZWF0ZUZyb21Bc3NldFN0cmVhbShpbnQgY29uLCBpbnQgYXNzZXRTdHJlYW0pOworICAgIHN5bmNocm9uaXplZCBpbnQgbkZpbGVBM0RDcmVhdGVGcm9tQXNzZXRTdHJlYW0oaW50IGFzc2V0U3RyZWFtKSB7CisgICAgICAgIHJldHVybiByc25GaWxlQTNEQ3JlYXRlRnJvbUFzc2V0U3RyZWFtKG1Db250ZXh0LCBhc3NldFN0cmVhbSk7CisgICAgfQorICAgIG5hdGl2ZSBpbnQgIHJzbkZpbGVBM0RHZXROdW1JbmRleEVudHJpZXMoaW50IGNvbiwgaW50IGZpbGVBM0QpOworICAgIHN5bmNocm9uaXplZCBpbnQgbkZpbGVBM0RHZXROdW1JbmRleEVudHJpZXMoaW50IGZpbGVBM0QpIHsKKyAgICAgICAgcmV0dXJuIHJzbkZpbGVBM0RHZXROdW1JbmRleEVudHJpZXMobUNvbnRleHQsIGZpbGVBM0QpOworICAgIH0KKyAgICBuYXRpdmUgdm9pZCByc25GaWxlQTNER2V0SW5kZXhFbnRyaWVzKGludCBjb24sIGludCBmaWxlQTNELCBpbnQgbnVtRW50cmllcywgaW50W10gSURzLCBTdHJpbmdbXSBuYW1lcyk7CisgICAgc3luY2hyb25pemVkIHZvaWQgbkZpbGVBM0RHZXRJbmRleEVudHJpZXMoaW50IGZpbGVBM0QsIGludCBudW1FbnRyaWVzLCBpbnRbXSBJRHMsIFN0cmluZ1tdIG5hbWVzKSB7CisgICAgICAgIHJzbkZpbGVBM0RHZXRJbmRleEVudHJpZXMobUNvbnRleHQsIGZpbGVBM0QsIG51bUVudHJpZXMsIElEcywgbmFtZXMpOworICAgIH0KKyAgICBuYXRpdmUgaW50ICByc25GaWxlQTNER2V0RW50cnlCeUluZGV4KGludCBjb24sIGludCBmaWxlQTNELCBpbnQgaW5kZXgpOworICAgIHN5bmNocm9uaXplZCBpbnQgbkZpbGVBM0RHZXRFbnRyeUJ5SW5kZXgoaW50IGZpbGVBM0QsIGludCBpbmRleCkgeworICAgICAgICByZXR1cm4gcnNuRmlsZUEzREdldEVudHJ5QnlJbmRleChtQ29udGV4dCwgZmlsZUEzRCwgaW5kZXgpOworICAgIH0KIAotICAgIG5hdGl2ZSB2b2lkIG5TYW1wbGVyQmVnaW4oKTsKLSAgICBuYXRpdmUgdm9pZCBuU2FtcGxlclNldChpbnQgcGFyYW0sIGludCB2YWx1ZSk7Ci0gICAgbmF0aXZlIGludCAgblNhbXBsZXJDcmVhdGUoKTsKKyAgICBuYXRpdmUgaW50ICByc25Gb250Q3JlYXRlRnJvbUZpbGUoaW50IGNvbiwgU3RyaW5nIGZpbGVOYW1lLCBpbnQgc2l6ZSwgaW50IGRwaSk7CisgICAgc3luY2hyb25pemVkIGludCBuRm9udENyZWF0ZUZyb21GaWxlKFN0cmluZyBmaWxlTmFtZSwgaW50IHNpemUsIGludCBkcGkpIHsKKyAgICAgICAgcmV0dXJuIHJzbkZvbnRDcmVhdGVGcm9tRmlsZShtQ29udGV4dCwgZmlsZU5hbWUsIHNpemUsIGRwaSk7CisgICAgfQogCi0gICAgbmF0aXZlIHZvaWQgblByb2dyYW1GcmFnbWVudFN0b3JlQmVnaW4oaW50IGluLCBpbnQgb3V0KTsKLSAgICBuYXRpdmUgdm9pZCBuUHJvZ3JhbUZyYWdtZW50U3RvcmVEZXB0aEZ1bmMoaW50IGZ1bmMpOwotICAgIG5hdGl2ZSB2b2lkIG5Qcm9ncmFtRnJhZ21lbnRTdG9yZURlcHRoTWFzayhib29sZWFuIGVuYWJsZSk7Ci0gICAgbmF0aXZlIHZvaWQgblByb2dyYW1GcmFnbWVudFN0b3JlQ29sb3JNYXNrKGJvb2xlYW4gciwgYm9vbGVhbiBnLCBib29sZWFuIGIsIGJvb2xlYW4gYSk7Ci0gICAgbmF0aXZlIHZvaWQgblByb2dyYW1GcmFnbWVudFN0b3JlQmxlbmRGdW5jKGludCBzcmMsIGludCBkc3QpOwotICAgIG5hdGl2ZSB2b2lkIG5Qcm9ncmFtRnJhZ21lbnRTdG9yZURpdGhlcihib29sZWFuIGVuYWJsZSk7Ci0gICAgbmF0aXZlIGludCAgblByb2dyYW1GcmFnbWVudFN0b3JlQ3JlYXRlKCk7CisgICAgbmF0aXZlIHZvaWQgcnNuQWRhcHRlcjFEQmluZEFsbG9jYXRpb24oaW50IGNvbiwgaW50IGFkLCBpbnQgYWxsb2MpOworICAgIHN5bmNocm9uaXplZCB2b2lkIG5BZGFwdGVyMURCaW5kQWxsb2NhdGlvbihpbnQgYWQsIGludCBhbGxvYykgeworICAgICAgICByc25BZGFwdGVyMURCaW5kQWxsb2NhdGlvbihtQ29udGV4dCwgYWQsIGFsbG9jKTsKKyAgICB9CisgICAgbmF0aXZlIHZvaWQgcnNuQWRhcHRlcjFEU2V0Q29uc3RyYWludChpbnQgY29uLCBpbnQgYWQsIGludCBkaW0sIGludCB2YWx1ZSk7CisgICAgc3luY2hyb25pemVkIHZvaWQgbkFkYXB0ZXIxRFNldENvbnN0cmFpbnQoaW50IGFkLCBpbnQgZGltLCBpbnQgdmFsdWUpIHsKKyAgICAgICAgcnNuQWRhcHRlcjFEU2V0Q29uc3RyYWludChtQ29udGV4dCwgYWQsIGRpbSwgdmFsdWUpOworICAgIH0KKyAgICBuYXRpdmUgdm9pZCByc25BZGFwdGVyMUREYXRhKGludCBjb24sIGludCBhZCwgaW50W10gZCk7CisgICAgc3luY2hyb25pemVkIHZvaWQgbkFkYXB0ZXIxRERhdGEoaW50IGFkLCBpbnRbXSBkKSB7CisgICAgICAgIHJzbkFkYXB0ZXIxRERhdGEobUNvbnRleHQsIGFkLCBkKTsKKyAgICB9CisgICAgbmF0aXZlIHZvaWQgcnNuQWRhcHRlcjFERGF0YShpbnQgY29uLCBpbnQgYWQsIGZsb2F0W10gZCk7CisgICAgc3luY2hyb25pemVkIHZvaWQgbkFkYXB0ZXIxRERhdGEoaW50IGFkLCBmbG9hdFtdIGQpIHsKKyAgICAgICAgcnNuQWRhcHRlcjFERGF0YShtQ29udGV4dCwgYWQsIGQpOworICAgIH0KKyAgICBuYXRpdmUgdm9pZCByc25BZGFwdGVyMURTdWJEYXRhKGludCBjb24sIGludCBhZCwgaW50IG9mZiwgaW50IGNvdW50LCBpbnRbXSBkKTsKKyAgICBzeW5jaHJvbml6ZWQgdm9pZCBuQWRhcHRlcjFEU3ViRGF0YShpbnQgYWQsIGludCBvZmYsIGludCBjb3VudCwgaW50W10gZCkgeworICAgICAgICByc25BZGFwdGVyMURTdWJEYXRhKG1Db250ZXh0LCBhZCwgb2ZmLCBjb3VudCwgZCk7CisgICAgfQorICAgIG5hdGl2ZSB2b2lkIHJzbkFkYXB0ZXIxRFN1YkRhdGEoaW50IGNvbiwgaW50IGFkLCBpbnQgb2ZmLCBpbnQgY291bnQsIGZsb2F0W10gZCk7CisgICAgc3luY2hyb25pemVkIHZvaWQgbkFkYXB0ZXIxRFN1YkRhdGEoaW50IGFkLCBpbnQgb2ZmLCBpbnQgY291bnQsIGZsb2F0W10gZCkgeworICAgICAgICByc25BZGFwdGVyMURTdWJEYXRhKG1Db250ZXh0LCBhZCwgb2ZmLCBjb3VudCwgZCk7CisgICAgfQorICAgIG5hdGl2ZSBpbnQgIHJzbkFkYXB0ZXIxRENyZWF0ZShpbnQgY29uKTsKKyAgICBzeW5jaHJvbml6ZWQgaW50IG5BZGFwdGVyMURDcmVhdGUoKSB7CisgICAgICAgIHJldHVybiByc25BZGFwdGVyMURDcmVhdGUobUNvbnRleHQpOworICAgIH0KIAotICAgIG5hdGl2ZSBpbnQgIG5Qcm9ncmFtUmFzdGVyQ3JlYXRlKGludCBpbiwgaW50IG91dCwgYm9vbGVhbiBwb2ludFNtb290aCwgYm9vbGVhbiBsaW5lU21vb3RoLCBib29sZWFuIHBvaW50U3ByaXRlKTsKLSAgICBuYXRpdmUgdm9pZCBuUHJvZ3JhbVJhc3RlclNldExpbmVXaWR0aChpbnQgcHIsIGZsb2F0IHYpOwotICAgIG5hdGl2ZSB2b2lkIG5Qcm9ncmFtUmFzdGVyU2V0UG9pbnRTaXplKGludCBwciwgZmxvYXQgdik7CisgICAgbmF0aXZlIHZvaWQgcnNuQWRhcHRlcjJEQmluZEFsbG9jYXRpb24oaW50IGNvbiwgaW50IGFkLCBpbnQgYWxsb2MpOworICAgIHN5bmNocm9uaXplZCB2b2lkIG5BZGFwdGVyMkRCaW5kQWxsb2NhdGlvbihpbnQgYWQsIGludCBhbGxvYykgeworICAgICAgICByc25BZGFwdGVyMkRCaW5kQWxsb2NhdGlvbihtQ29udGV4dCwgYWQsIGFsbG9jKTsKKyAgICB9CisgICAgbmF0aXZlIHZvaWQgcnNuQWRhcHRlcjJEU2V0Q29uc3RyYWludChpbnQgY29uLCBpbnQgYWQsIGludCBkaW0sIGludCB2YWx1ZSk7CisgICAgc3luY2hyb25pemVkIHZvaWQgbkFkYXB0ZXIyRFNldENvbnN0cmFpbnQoaW50IGFkLCBpbnQgZGltLCBpbnQgdmFsdWUpIHsKKyAgICAgICAgcnNuQWRhcHRlcjJEU2V0Q29uc3RyYWludChtQ29udGV4dCwgYWQsIGRpbSwgdmFsdWUpOworICAgIH0KKyAgICBuYXRpdmUgdm9pZCByc25BZGFwdGVyMkREYXRhKGludCBjb24sIGludCBhZCwgaW50W10gZCk7CisgICAgc3luY2hyb25pemVkIHZvaWQgbkFkYXB0ZXIyRERhdGEoaW50IGFkLCBpbnRbXSBkKSB7CisgICAgICAgIHJzbkFkYXB0ZXIyRERhdGEobUNvbnRleHQsIGFkLCBkKTsKKyAgICB9CisgICAgbmF0aXZlIHZvaWQgcnNuQWRhcHRlcjJERGF0YShpbnQgY29uLCBpbnQgYWQsIGZsb2F0W10gZCk7CisgICAgc3luY2hyb25pemVkIHZvaWQgbkFkYXB0ZXIyRERhdGEoaW50IGFkLCBmbG9hdFtdIGQpIHsKKyAgICAgICAgcnNuQWRhcHRlcjJERGF0YShtQ29udGV4dCwgYWQsIGQpOworICAgIH0KKyAgICBuYXRpdmUgdm9pZCByc25BZGFwdGVyMkRTdWJEYXRhKGludCBjb24sIGludCBhZCwgaW50IHhvZmYsIGludCB5b2ZmLCBpbnQgdywgaW50IGgsIGludFtdIGQpOworICAgIHN5bmNocm9uaXplZCB2b2lkIG5BZGFwdGVyMkRTdWJEYXRhKGludCBhZCwgaW50IHhvZmYsIGludCB5b2ZmLCBpbnQgdywgaW50IGgsIGludFtdIGQpIHsKKyAgICAgICAgcnNuQWRhcHRlcjJEU3ViRGF0YShtQ29udGV4dCwgYWQsIHhvZmYsIHlvZmYsIHcsIGgsIGQpOworICAgIH0KKyAgICBuYXRpdmUgdm9pZCByc25BZGFwdGVyMkRTdWJEYXRhKGludCBjb24sIGludCBhZCwgaW50IHhvZmYsIGludCB5b2ZmLCBpbnQgdywgaW50IGgsIGZsb2F0W10gZCk7CisgICAgc3luY2hyb25pemVkIHZvaWQgbkFkYXB0ZXIyRFN1YkRhdGEoaW50IGFkLCBpbnQgeG9mZiwgaW50IHlvZmYsIGludCB3LCBpbnQgaCwgZmxvYXRbXSBkKSB7CisgICAgICAgIHJzbkFkYXB0ZXIyRFN1YkRhdGEobUNvbnRleHQsIGFkLCB4b2ZmLCB5b2ZmLCB3LCBoLCBkKTsKKyAgICB9CisgICAgbmF0aXZlIGludCAgcnNuQWRhcHRlcjJEQ3JlYXRlKGludCBjb24pOworICAgIHN5bmNocm9uaXplZCBpbnQgbkFkYXB0ZXIyRENyZWF0ZSgpIHsKKyAgICAgICAgcmV0dXJuIHJzbkFkYXB0ZXIyRENyZWF0ZShtQ29udGV4dCk7CisgICAgfQogCi0gICAgbmF0aXZlIHZvaWQgblByb2dyYW1CaW5kQ29uc3RhbnRzKGludCBwdiwgaW50IHNsb3QsIGludCBtSUQpOwotICAgIG5hdGl2ZSB2b2lkIG5Qcm9ncmFtQmluZFRleHR1cmUoaW50IHZwZiwgaW50IHNsb3QsIGludCBhKTsKLSAgICBuYXRpdmUgdm9pZCBuUHJvZ3JhbUJpbmRTYW1wbGVyKGludCB2cGYsIGludCBzbG90LCBpbnQgcyk7CisgICAgbmF0aXZlIHZvaWQgcnNuU2NyaXB0QmluZEFsbG9jYXRpb24oaW50IGNvbiwgaW50IHNjcmlwdCwgaW50IGFsbG9jLCBpbnQgc2xvdCk7CisgICAgc3luY2hyb25pemVkIHZvaWQgblNjcmlwdEJpbmRBbGxvY2F0aW9uKGludCBzY3JpcHQsIGludCBhbGxvYywgaW50IHNsb3QpIHsKKyAgICAgICAgcnNuU2NyaXB0QmluZEFsbG9jYXRpb24obUNvbnRleHQsIHNjcmlwdCwgYWxsb2MsIHNsb3QpOworICAgIH0KKyAgICBuYXRpdmUgdm9pZCByc25TY3JpcHRTZXRUaW1lWm9uZShpbnQgY29uLCBpbnQgc2NyaXB0LCBieXRlW10gdGltZVpvbmUpOworICAgIHN5bmNocm9uaXplZCB2b2lkIG5TY3JpcHRTZXRUaW1lWm9uZShpbnQgc2NyaXB0LCBieXRlW10gdGltZVpvbmUpIHsKKyAgICAgICAgcnNuU2NyaXB0U2V0VGltZVpvbmUobUNvbnRleHQsIHNjcmlwdCwgdGltZVpvbmUpOworICAgIH0KKyAgICBuYXRpdmUgdm9pZCByc25TY3JpcHRJbnZva2UoaW50IGNvbiwgaW50IGlkLCBpbnQgc2xvdCk7CisgICAgc3luY2hyb25pemVkIHZvaWQgblNjcmlwdEludm9rZShpbnQgaWQsIGludCBzbG90KSB7CisgICAgICAgIHJzblNjcmlwdEludm9rZShtQ29udGV4dCwgaWQsIHNsb3QpOworICAgIH0KKyAgICBuYXRpdmUgdm9pZCByc25TY3JpcHRJbnZva2VWKGludCBjb24sIGludCBpZCwgaW50IHNsb3QsIGJ5dGVbXSBwYXJhbXMpOworICAgIHN5bmNocm9uaXplZCB2b2lkIG5TY3JpcHRJbnZva2VWKGludCBpZCwgaW50IHNsb3QsIGJ5dGVbXSBwYXJhbXMpIHsKKyAgICAgICAgcnNuU2NyaXB0SW52b2tlVihtQ29udGV4dCwgaWQsIHNsb3QsIHBhcmFtcyk7CisgICAgfQorICAgIG5hdGl2ZSB2b2lkIHJzblNjcmlwdFNldFZhckkoaW50IGNvbiwgaW50IGlkLCBpbnQgc2xvdCwgaW50IHZhbCk7CisgICAgc3luY2hyb25pemVkIHZvaWQgblNjcmlwdFNldFZhckkoaW50IGlkLCBpbnQgc2xvdCwgaW50IHZhbCkgeworICAgICAgICByc25TY3JpcHRTZXRWYXJJKG1Db250ZXh0LCBpZCwgc2xvdCwgdmFsKTsKKyAgICB9CisgICAgbmF0aXZlIHZvaWQgcnNuU2NyaXB0U2V0VmFyRihpbnQgY29uLCBpbnQgaWQsIGludCBzbG90LCBmbG9hdCB2YWwpOworICAgIHN5bmNocm9uaXplZCB2b2lkIG5TY3JpcHRTZXRWYXJGKGludCBpZCwgaW50IHNsb3QsIGZsb2F0IHZhbCkgeworICAgICAgICByc25TY3JpcHRTZXRWYXJGKG1Db250ZXh0LCBpZCwgc2xvdCwgdmFsKTsKKyAgICB9CisgICAgbmF0aXZlIHZvaWQgcnNuU2NyaXB0U2V0VmFyVihpbnQgY29uLCBpbnQgaWQsIGludCBzbG90LCBieXRlW10gdmFsKTsKKyAgICBzeW5jaHJvbml6ZWQgdm9pZCBuU2NyaXB0U2V0VmFyVihpbnQgaWQsIGludCBzbG90LCBieXRlW10gdmFsKSB7CisgICAgICAgIHJzblNjcmlwdFNldFZhclYobUNvbnRleHQsIGlkLCBzbG90LCB2YWwpOworICAgIH0KIAotICAgIG5hdGl2ZSBpbnQgIG5Qcm9ncmFtRnJhZ21lbnRDcmVhdGUoaW50W10gcGFyYW1zKTsKLSAgICBuYXRpdmUgaW50ICBuUHJvZ3JhbUZyYWdtZW50Q3JlYXRlMihTdHJpbmcgc2hhZGVyLCBpbnRbXSBwYXJhbXMpOworICAgIG5hdGl2ZSB2b2lkIHJzblNjcmlwdENCZWdpbihpbnQgY29uKTsKKyAgICBzeW5jaHJvbml6ZWQgdm9pZCBuU2NyaXB0Q0JlZ2luKCkgeworICAgICAgICByc25TY3JpcHRDQmVnaW4obUNvbnRleHQpOworICAgIH0KKyAgICBuYXRpdmUgdm9pZCByc25TY3JpcHRDU2V0U2NyaXB0KGludCBjb24sIGJ5dGVbXSBzY3JpcHQsIGludCBvZmZzZXQsIGludCBsZW5ndGgpOworICAgIHN5bmNocm9uaXplZCB2b2lkIG5TY3JpcHRDU2V0U2NyaXB0KGJ5dGVbXSBzY3JpcHQsIGludCBvZmZzZXQsIGludCBsZW5ndGgpIHsKKyAgICAgICAgcnNuU2NyaXB0Q1NldFNjcmlwdChtQ29udGV4dCwgc2NyaXB0LCBvZmZzZXQsIGxlbmd0aCk7CisgICAgfQorICAgIG5hdGl2ZSBpbnQgIHJzblNjcmlwdENDcmVhdGUoaW50IGNvbik7CisgICAgc3luY2hyb25pemVkIGludCBuU2NyaXB0Q0NyZWF0ZSgpIHsKKyAgICAgICAgcmV0dXJuIHJzblNjcmlwdENDcmVhdGUobUNvbnRleHQpOworICAgIH0KIAotICAgIG5hdGl2ZSBpbnQgIG5Qcm9ncmFtVmVydGV4Q3JlYXRlKGJvb2xlYW4gdGV4TWF0KTsKLSAgICBuYXRpdmUgaW50ICBuUHJvZ3JhbVZlcnRleENyZWF0ZTIoU3RyaW5nIHNoYWRlciwgaW50W10gcGFyYW1zKTsKKyAgICBuYXRpdmUgdm9pZCByc25TYW1wbGVyQmVnaW4oaW50IGNvbik7CisgICAgc3luY2hyb25pemVkIHZvaWQgblNhbXBsZXJCZWdpbigpIHsKKyAgICAgICAgcnNuU2FtcGxlckJlZ2luKG1Db250ZXh0KTsKKyAgICB9CisgICAgbmF0aXZlIHZvaWQgcnNuU2FtcGxlclNldChpbnQgY29uLCBpbnQgcGFyYW0sIGludCB2YWx1ZSk7CisgICAgc3luY2hyb25pemVkIHZvaWQgblNhbXBsZXJTZXQoaW50IHBhcmFtLCBpbnQgdmFsdWUpIHsKKyAgICAgICAgcnNuU2FtcGxlclNldChtQ29udGV4dCwgcGFyYW0sIHZhbHVlKTsKKyAgICB9CisgICAgbmF0aXZlIGludCAgcnNuU2FtcGxlckNyZWF0ZShpbnQgY29uKTsKKyAgICBzeW5jaHJvbml6ZWQgaW50IG5TYW1wbGVyQ3JlYXRlKCkgeworICAgICAgICByZXR1cm4gcnNuU2FtcGxlckNyZWF0ZShtQ29udGV4dCk7CisgICAgfQogCi0gICAgbmF0aXZlIHZvaWQgbkxpZ2h0QmVnaW4oKTsKLSAgICBuYXRpdmUgdm9pZCBuTGlnaHRTZXRJc01vbm8oYm9vbGVhbiBpc01vbm8pOwotICAgIG5hdGl2ZSB2b2lkIG5MaWdodFNldElzTG9jYWwoYm9vbGVhbiBpc0xvY2FsKTsKLSAgICBuYXRpdmUgaW50ICBuTGlnaHRDcmVhdGUoKTsKLSAgICBuYXRpdmUgdm9pZCBuTGlnaHRTZXRDb2xvcihpbnQgbCwgZmxvYXQgciwgZmxvYXQgZywgZmxvYXQgYik7Ci0gICAgbmF0aXZlIHZvaWQgbkxpZ2h0U2V0UG9zaXRpb24oaW50IGwsIGZsb2F0IHgsIGZsb2F0IHksIGZsb2F0IHopOworICAgIG5hdGl2ZSB2b2lkIHJzblByb2dyYW1TdG9yZUJlZ2luKGludCBjb24sIGludCBpbiwgaW50IG91dCk7CisgICAgc3luY2hyb25pemVkIHZvaWQgblByb2dyYW1TdG9yZUJlZ2luKGludCBpbiwgaW50IG91dCkgeworICAgICAgICByc25Qcm9ncmFtU3RvcmVCZWdpbihtQ29udGV4dCwgaW4sIG91dCk7CisgICAgfQorICAgIG5hdGl2ZSB2b2lkIHJzblByb2dyYW1TdG9yZURlcHRoRnVuYyhpbnQgY29uLCBpbnQgZnVuYyk7CisgICAgc3luY2hyb25pemVkIHZvaWQgblByb2dyYW1TdG9yZURlcHRoRnVuYyhpbnQgZnVuYykgeworICAgICAgICByc25Qcm9ncmFtU3RvcmVEZXB0aEZ1bmMobUNvbnRleHQsIGZ1bmMpOworICAgIH0KKyAgICBuYXRpdmUgdm9pZCByc25Qcm9ncmFtU3RvcmVEZXB0aE1hc2soaW50IGNvbiwgYm9vbGVhbiBlbmFibGUpOworICAgIHN5bmNocm9uaXplZCB2b2lkIG5Qcm9ncmFtU3RvcmVEZXB0aE1hc2soYm9vbGVhbiBlbmFibGUpIHsKKyAgICAgICAgcnNuUHJvZ3JhbVN0b3JlRGVwdGhNYXNrKG1Db250ZXh0LCBlbmFibGUpOworICAgIH0KKyAgICBuYXRpdmUgdm9pZCByc25Qcm9ncmFtU3RvcmVDb2xvck1hc2soaW50IGNvbiwgYm9vbGVhbiByLCBib29sZWFuIGcsIGJvb2xlYW4gYiwgYm9vbGVhbiBhKTsKKyAgICBzeW5jaHJvbml6ZWQgdm9pZCBuUHJvZ3JhbVN0b3JlQ29sb3JNYXNrKGJvb2xlYW4gciwgYm9vbGVhbiBnLCBib29sZWFuIGIsIGJvb2xlYW4gYSkgeworICAgICAgICByc25Qcm9ncmFtU3RvcmVDb2xvck1hc2sobUNvbnRleHQsIHIsIGcsIGIsIGEpOworICAgIH0KKyAgICBuYXRpdmUgdm9pZCByc25Qcm9ncmFtU3RvcmVCbGVuZEZ1bmMoaW50IGNvbiwgaW50IHNyYywgaW50IGRzdCk7CisgICAgc3luY2hyb25pemVkIHZvaWQgblByb2dyYW1TdG9yZUJsZW5kRnVuYyhpbnQgc3JjLCBpbnQgZHN0KSB7CisgICAgICAgIHJzblByb2dyYW1TdG9yZUJsZW5kRnVuYyhtQ29udGV4dCwgc3JjLCBkc3QpOworICAgIH0KKyAgICBuYXRpdmUgdm9pZCByc25Qcm9ncmFtU3RvcmVEaXRoZXIoaW50IGNvbiwgYm9vbGVhbiBlbmFibGUpOworICAgIHN5bmNocm9uaXplZCB2b2lkIG5Qcm9ncmFtU3RvcmVEaXRoZXIoYm9vbGVhbiBlbmFibGUpIHsKKyAgICAgICAgcnNuUHJvZ3JhbVN0b3JlRGl0aGVyKG1Db250ZXh0LCBlbmFibGUpOworICAgIH0KKyAgICBuYXRpdmUgaW50ICByc25Qcm9ncmFtU3RvcmVDcmVhdGUoaW50IGNvbik7CisgICAgc3luY2hyb25pemVkIGludCBuUHJvZ3JhbVN0b3JlQ3JlYXRlKCkgeworICAgICAgICByZXR1cm4gcnNuUHJvZ3JhbVN0b3JlQ3JlYXRlKG1Db250ZXh0KTsKKyAgICB9CiAKLSAgICBuYXRpdmUgaW50ICBuU2ltcGxlTWVzaENyZWF0ZShpbnQgYmF0Y2hJRCwgaW50IGlkeElELCBpbnRbXSB2dHhJRCwgaW50IHByaW0pOwotICAgIG5hdGl2ZSB2b2lkIG5TaW1wbGVNZXNoQmluZFZlcnRleChpbnQgaWQsIGludCBhbGxvYywgaW50IHNsb3QpOwotICAgIG5hdGl2ZSB2b2lkIG5TaW1wbGVNZXNoQmluZEluZGV4KGludCBpZCwgaW50IGFsbG9jKTsKKyAgICBuYXRpdmUgaW50ICByc25Qcm9ncmFtUmFzdGVyQ3JlYXRlKGludCBjb24sIGJvb2xlYW4gcG9pbnRTbW9vdGgsIGJvb2xlYW4gbGluZVNtb290aCwgYm9vbGVhbiBwb2ludFNwcml0ZSk7CisgICAgc3luY2hyb25pemVkIGludCBuUHJvZ3JhbVJhc3RlckNyZWF0ZShib29sZWFuIHBvaW50U21vb3RoLCBib29sZWFuIGxpbmVTbW9vdGgsIGJvb2xlYW4gcG9pbnRTcHJpdGUpIHsKKyAgICAgICAgcmV0dXJuIHJzblByb2dyYW1SYXN0ZXJDcmVhdGUobUNvbnRleHQsIHBvaW50U21vb3RoLCBsaW5lU21vb3RoLCBwb2ludFNwcml0ZSk7CisgICAgfQorICAgIG5hdGl2ZSB2b2lkIHJzblByb2dyYW1SYXN0ZXJTZXRMaW5lV2lkdGgoaW50IGNvbiwgaW50IHByLCBmbG9hdCB2KTsKKyAgICBzeW5jaHJvbml6ZWQgdm9pZCBuUHJvZ3JhbVJhc3RlclNldExpbmVXaWR0aChpbnQgcHIsIGZsb2F0IHYpIHsKKyAgICAgICAgcnNuUHJvZ3JhbVJhc3RlclNldExpbmVXaWR0aChtQ29udGV4dCwgcHIsIHYpOworICAgIH0KKyAgICBuYXRpdmUgdm9pZCByc25Qcm9ncmFtUmFzdGVyU2V0Q3VsbE1vZGUoaW50IGNvbiwgaW50IHByLCBpbnQgbW9kZSk7CisgICAgc3luY2hyb25pemVkIHZvaWQgblByb2dyYW1SYXN0ZXJTZXRDdWxsTW9kZShpbnQgcHIsIGludCBtb2RlKSB7CisgICAgICAgIHJzblByb2dyYW1SYXN0ZXJTZXRDdWxsTW9kZShtQ29udGV4dCwgcHIsIG1vZGUpOworICAgIH0KIAotICAgIG5hdGl2ZSB2b2lkIG5BbmltYXRpb25CZWdpbihpbnQgYXR0cmliQ291bnQsIGludCBrZXlmcmFtZUNvdW50KTsKLSAgICBuYXRpdmUgdm9pZCBuQW5pbWF0aW9uQWRkKGZsb2F0IHRpbWUsIGZsb2F0W10gYXR0cmlicyk7Ci0gICAgbmF0aXZlIGludCAgbkFuaW1hdGlvbkNyZWF0ZSgpOworICAgIG5hdGl2ZSB2b2lkIHJzblByb2dyYW1CaW5kQ29uc3RhbnRzKGludCBjb24sIGludCBwdiwgaW50IHNsb3QsIGludCBtSUQpOworICAgIHN5bmNocm9uaXplZCB2b2lkIG5Qcm9ncmFtQmluZENvbnN0YW50cyhpbnQgcHYsIGludCBzbG90LCBpbnQgbUlEKSB7CisgICAgICAgIHJzblByb2dyYW1CaW5kQ29uc3RhbnRzKG1Db250ZXh0LCBwdiwgc2xvdCwgbUlEKTsKKyAgICB9CisgICAgbmF0aXZlIHZvaWQgcnNuUHJvZ3JhbUJpbmRUZXh0dXJlKGludCBjb24sIGludCB2cGYsIGludCBzbG90LCBpbnQgYSk7CisgICAgc3luY2hyb25pemVkIHZvaWQgblByb2dyYW1CaW5kVGV4dHVyZShpbnQgdnBmLCBpbnQgc2xvdCwgaW50IGEpIHsKKyAgICAgICAgcnNuUHJvZ3JhbUJpbmRUZXh0dXJlKG1Db250ZXh0LCB2cGYsIHNsb3QsIGEpOworICAgIH0KKyAgICBuYXRpdmUgdm9pZCByc25Qcm9ncmFtQmluZFNhbXBsZXIoaW50IGNvbiwgaW50IHZwZiwgaW50IHNsb3QsIGludCBzKTsKKyAgICBzeW5jaHJvbml6ZWQgdm9pZCBuUHJvZ3JhbUJpbmRTYW1wbGVyKGludCB2cGYsIGludCBzbG90LCBpbnQgcykgeworICAgICAgICByc25Qcm9ncmFtQmluZFNhbXBsZXIobUNvbnRleHQsIHZwZiwgc2xvdCwgcyk7CisgICAgfQorCisgICAgbmF0aXZlIGludCAgcnNuUHJvZ3JhbUZyYWdtZW50Q3JlYXRlKGludCBjb24sIGludFtdIHBhcmFtcyk7CisgICAgc3luY2hyb25pemVkIGludCBuUHJvZ3JhbUZyYWdtZW50Q3JlYXRlKGludFtdIHBhcmFtcykgeworICAgICAgICByZXR1cm4gcnNuUHJvZ3JhbUZyYWdtZW50Q3JlYXRlKG1Db250ZXh0LCBwYXJhbXMpOworICAgIH0KKyAgICBuYXRpdmUgaW50ICByc25Qcm9ncmFtRnJhZ21lbnRDcmVhdGUyKGludCBjb24sIFN0cmluZyBzaGFkZXIsIGludFtdIHBhcmFtcyk7CisgICAgc3luY2hyb25pemVkIGludCBuUHJvZ3JhbUZyYWdtZW50Q3JlYXRlMihTdHJpbmcgc2hhZGVyLCBpbnRbXSBwYXJhbXMpIHsKKyAgICAgICAgcmV0dXJuIHJzblByb2dyYW1GcmFnbWVudENyZWF0ZTIobUNvbnRleHQsIHNoYWRlciwgcGFyYW1zKTsKKyAgICB9CisKKyAgICBuYXRpdmUgaW50ICByc25Qcm9ncmFtVmVydGV4Q3JlYXRlKGludCBjb24sIGJvb2xlYW4gdGV4TWF0KTsKKyAgICBzeW5jaHJvbml6ZWQgaW50IG5Qcm9ncmFtVmVydGV4Q3JlYXRlKGJvb2xlYW4gdGV4TWF0KSB7CisgICAgICAgIHJldHVybiByc25Qcm9ncmFtVmVydGV4Q3JlYXRlKG1Db250ZXh0LCB0ZXhNYXQpOworICAgIH0KKyAgICBuYXRpdmUgaW50ICByc25Qcm9ncmFtVmVydGV4Q3JlYXRlMihpbnQgY29uLCBTdHJpbmcgc2hhZGVyLCBpbnRbXSBwYXJhbXMpOworICAgIHN5bmNocm9uaXplZCBpbnQgblByb2dyYW1WZXJ0ZXhDcmVhdGUyKFN0cmluZyBzaGFkZXIsIGludFtdIHBhcmFtcykgeworICAgICAgICByZXR1cm4gcnNuUHJvZ3JhbVZlcnRleENyZWF0ZTIobUNvbnRleHQsIHNoYWRlciwgcGFyYW1zKTsKKyAgICB9CisKKworICAgIG5hdGl2ZSBpbnQgIHJzbk1lc2hDcmVhdGUoaW50IGNvbiwgaW50IHZ0eENvdW50LCBpbnQgaW5kZXhDb3VudCk7CisgICAgc3luY2hyb25pemVkIGludCBuTWVzaENyZWF0ZShpbnQgdnR4Q291bnQsIGludCBpbmRleENvdW50KSB7CisgICAgICAgIHJldHVybiByc25NZXNoQ3JlYXRlKG1Db250ZXh0LCB2dHhDb3VudCwgaW5kZXhDb3VudCk7CisgICAgfQorICAgIG5hdGl2ZSB2b2lkIHJzbk1lc2hCaW5kVmVydGV4KGludCBjb24sIGludCBpZCwgaW50IGFsbG9jLCBpbnQgc2xvdCk7CisgICAgc3luY2hyb25pemVkIHZvaWQgbk1lc2hCaW5kVmVydGV4KGludCBpZCwgaW50IGFsbG9jLCBpbnQgc2xvdCkgeworICAgICAgICByc25NZXNoQmluZFZlcnRleChtQ29udGV4dCwgaWQsIGFsbG9jLCBzbG90KTsKKyAgICB9CisgICAgbmF0aXZlIHZvaWQgcnNuTWVzaEJpbmRJbmRleChpbnQgY29uLCBpbnQgaWQsIGludCBhbGxvYywgaW50IHByaW0sIGludCBzbG90KTsKKyAgICBzeW5jaHJvbml6ZWQgdm9pZCBuTWVzaEJpbmRJbmRleChpbnQgaWQsIGludCBhbGxvYywgaW50IHByaW0sIGludCBzbG90KSB7CisgICAgICAgIHJzbk1lc2hCaW5kSW5kZXgobUNvbnRleHQsIGlkLCBhbGxvYywgcHJpbSwgc2xvdCk7CisgICAgfQorICAgIG5hdGl2ZSBpbnQgIHJzbk1lc2hHZXRWZXJ0ZXhCdWZmZXJDb3VudChpbnQgY29uLCBpbnQgaWQpOworICAgIHN5bmNocm9uaXplZCBpbnQgbk1lc2hHZXRWZXJ0ZXhCdWZmZXJDb3VudChpbnQgaWQpIHsKKyAgICAgICAgcmV0dXJuIHJzbk1lc2hHZXRWZXJ0ZXhCdWZmZXJDb3VudChtQ29udGV4dCwgaWQpOworICAgIH0KKyAgICBuYXRpdmUgaW50ICByc25NZXNoR2V0SW5kZXhDb3VudChpbnQgY29uLCBpbnQgaWQpOworICAgIHN5bmNocm9uaXplZCBpbnQgbk1lc2hHZXRJbmRleENvdW50KGludCBpZCkgeworICAgICAgICByZXR1cm4gcnNuTWVzaEdldEluZGV4Q291bnQobUNvbnRleHQsIGlkKTsKKyAgICB9CisgICAgbmF0aXZlIHZvaWQgcnNuTWVzaEdldFZlcnRpY2VzKGludCBjb24sIGludCBpZCwgaW50W10gdnR4SWRzLCBpbnQgdnR4SWRDb3VudCk7CisgICAgc3luY2hyb25pemVkIHZvaWQgbk1lc2hHZXRWZXJ0aWNlcyhpbnQgaWQsIGludFtdIHZ0eElkcywgaW50IHZ0eElkQ291bnQpIHsKKyAgICAgICAgcnNuTWVzaEdldFZlcnRpY2VzKG1Db250ZXh0LCBpZCwgdnR4SWRzLCB2dHhJZENvdW50KTsKKyAgICB9CisgICAgbmF0aXZlIHZvaWQgcnNuTWVzaEdldEluZGljZXMoaW50IGNvbiwgaW50IGlkLCBpbnRbXSBpZHhJZHMsIGludFtdIHByaW1pdGl2ZXMsIGludCB2dHhJZENvdW50KTsKKyAgICBzeW5jaHJvbml6ZWQgdm9pZCBuTWVzaEdldEluZGljZXMoaW50IGlkLCBpbnRbXSBpZHhJZHMsIGludFtdIHByaW1pdGl2ZXMsIGludCB2dHhJZENvdW50KSB7CisgICAgICAgIHJzbk1lc2hHZXRJbmRpY2VzKG1Db250ZXh0LCBpZCwgaWR4SWRzLCBwcmltaXRpdmVzLCB2dHhJZENvdW50KTsKKyAgICB9CisKIAogICAgIHByb3RlY3RlZCBpbnQgICAgIG1EZXY7CiAgICAgcHJvdGVjdGVkIGludCAgICAgbUNvbnRleHQ7CiAgICAgQFN1cHByZXNzV2FybmluZ3MoeyJGaWVsZENhbkJlTG9jYWwifSkKICAgICBwcm90ZWN0ZWQgTWVzc2FnZVRocmVhZCBtTWVzc2FnZVRocmVhZDsKIAotICAgIEVsZW1lbnQgbUVsZW1lbnRfVVNFUl9VODsKLSAgICBFbGVtZW50IG1FbGVtZW50X1VTRVJfSTg7Ci0gICAgRWxlbWVudCBtRWxlbWVudF9VU0VSX1UxNjsKLSAgICBFbGVtZW50IG1FbGVtZW50X1VTRVJfSTE2OwotICAgIEVsZW1lbnQgbUVsZW1lbnRfVVNFUl9VMzI7Ci0gICAgRWxlbWVudCBtRWxlbWVudF9VU0VSX0kzMjsKLSAgICBFbGVtZW50IG1FbGVtZW50X1VTRVJfRjMyOworICAgIEVsZW1lbnQgbUVsZW1lbnRfVTg7CisgICAgRWxlbWVudCBtRWxlbWVudF9JODsKKyAgICBFbGVtZW50IG1FbGVtZW50X1UxNjsKKyAgICBFbGVtZW50IG1FbGVtZW50X0kxNjsKKyAgICBFbGVtZW50IG1FbGVtZW50X1UzMjsKKyAgICBFbGVtZW50IG1FbGVtZW50X0kzMjsKKyAgICBFbGVtZW50IG1FbGVtZW50X0YzMjsKKyAgICBFbGVtZW50IG1FbGVtZW50X0JPT0xFQU47CisKKyAgICBFbGVtZW50IG1FbGVtZW50X0VMRU1FTlQ7CisgICAgRWxlbWVudCBtRWxlbWVudF9UWVBFOworICAgIEVsZW1lbnQgbUVsZW1lbnRfQUxMT0NBVElPTjsKKyAgICBFbGVtZW50IG1FbGVtZW50X1NBTVBMRVI7CisgICAgRWxlbWVudCBtRWxlbWVudF9TQ1JJUFQ7CisgICAgRWxlbWVudCBtRWxlbWVudF9NRVNIOworICAgIEVsZW1lbnQgbUVsZW1lbnRfUFJPR1JBTV9GUkFHTUVOVDsKKyAgICBFbGVtZW50IG1FbGVtZW50X1BST0dSQU1fVkVSVEVYOworICAgIEVsZW1lbnQgbUVsZW1lbnRfUFJPR1JBTV9SQVNURVI7CisgICAgRWxlbWVudCBtRWxlbWVudF9QUk9HUkFNX1NUT1JFOwogCiAgICAgRWxlbWVudCBtRWxlbWVudF9BXzg7CiAgICAgRWxlbWVudCBtRWxlbWVudF9SR0JfNTY1OwpAQCAtMjEwLDEzICs1MjUsMzggQEAKICAgICBFbGVtZW50IG1FbGVtZW50X1JHQkFfNDQ0NDsKICAgICBFbGVtZW50IG1FbGVtZW50X1JHQkFfODg4ODsKIAotICAgIEVsZW1lbnQgbUVsZW1lbnRfSU5ERVhfMTY7Ci0gICAgRWxlbWVudCBtRWxlbWVudF9QT1NJVElPTl8yOwotICAgIEVsZW1lbnQgbUVsZW1lbnRfUE9TSVRJT05fMzsKLSAgICBFbGVtZW50IG1FbGVtZW50X1RFWFRVUkVfMjsKLSAgICBFbGVtZW50IG1FbGVtZW50X05PUk1BTF8zOwotICAgIEVsZW1lbnQgbUVsZW1lbnRfQ09MT1JfVThfNDsKLSAgICBFbGVtZW50IG1FbGVtZW50X0NPTE9SX0YzMl80OworICAgIEVsZW1lbnQgbUVsZW1lbnRfRkxPQVRfMjsKKyAgICBFbGVtZW50IG1FbGVtZW50X0ZMT0FUXzM7CisgICAgRWxlbWVudCBtRWxlbWVudF9GTE9BVF80OworICAgIEVsZW1lbnQgbUVsZW1lbnRfVUNIQVJfNDsKKworICAgIEVsZW1lbnQgbUVsZW1lbnRfTUFUUklYXzRYNDsKKyAgICBFbGVtZW50IG1FbGVtZW50X01BVFJJWF8zWDM7CisgICAgRWxlbWVudCBtRWxlbWVudF9NQVRSSVhfMlgyOworCisgICAgU2FtcGxlciBtU2FtcGxlcl9DTEFNUF9ORUFSRVNUOworICAgIFNhbXBsZXIgbVNhbXBsZXJfQ0xBTVBfTElORUFSOworICAgIFNhbXBsZXIgbVNhbXBsZXJfQ0xBTVBfTElORUFSX01JUF9MSU5FQVI7CisgICAgU2FtcGxlciBtU2FtcGxlcl9XUkFQX05FQVJFU1Q7CisgICAgU2FtcGxlciBtU2FtcGxlcl9XUkFQX0xJTkVBUjsKKyAgICBTYW1wbGVyIG1TYW1wbGVyX1dSQVBfTElORUFSX01JUF9MSU5FQVI7CisKKyAgICBQcm9ncmFtU3RvcmUgbVByb2dyYW1TdG9yZV9CTEVORF9OT05FX0RFUFRIX1RFU1Q7CisgICAgUHJvZ3JhbVN0b3JlIG1Qcm9ncmFtU3RvcmVfQkxFTkRfTk9ORV9ERVBUSF9OT19ERVBUSDsKKyAgICBQcm9ncmFtU3RvcmUgbVByb2dyYW1TdG9yZV9CTEVORF9OT05FX0RFUFRIX05PX1RFU1Q7CisgICAgUHJvZ3JhbVN0b3JlIG1Qcm9ncmFtU3RvcmVfQkxFTkRfTk9ORV9ERVBUSF9OT19XUklURTsKKyAgICBQcm9ncmFtU3RvcmUgbVByb2dyYW1TdG9yZV9CTEVORF9BTFBIQV9ERVBUSF9URVNUOworICAgIFByb2dyYW1TdG9yZSBtUHJvZ3JhbVN0b3JlX0JMRU5EX0FMUEhBX0RFUFRIX05PX0RFUFRIOworICAgIFByb2dyYW1TdG9yZSBtUHJvZ3JhbVN0b3JlX0JMRU5EX0FMUEhBX0RFUFRIX05PX1RFU1Q7CisgICAgUHJvZ3JhbVN0b3JlIG1Qcm9ncmFtU3RvcmVfQkxFTkRfQUxQSEFfREVQVEhfTk9fV1JJVEU7CisgICAgUHJvZ3JhbVN0b3JlIG1Qcm9ncmFtU3RvcmVfQkxFTkRfQUREX0RFUFRIX1RFU1Q7CisgICAgUHJvZ3JhbVN0b3JlIG1Qcm9ncmFtU3RvcmVfQkxFTkRfQUREX0RFUFRIX05PX0RFUFRIOworICAgIFByb2dyYW1TdG9yZSBtUHJvZ3JhbVN0b3JlX0JMRU5EX0FERF9ERVBUSF9OT19URVNUOworICAgIFByb2dyYW1TdG9yZSBtUHJvZ3JhbVN0b3JlX0JMRU5EX0FERF9ERVBUSF9OT19XUklURTsKKworICAgIFByb2dyYW1SYXN0ZXIgbVByb2dyYW1SYXN0ZXJfQ1VMTF9CQUNLOworICAgIFByb2dyYW1SYXN0ZXIgbVByb2dyYW1SYXN0ZXJfQ1VMTF9GUk9OVDsKKyAgICBQcm9ncmFtUmFzdGVyIG1Qcm9ncmFtUmFzdGVyX0NVTExfTk9ORTsKIAogICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAgICAgLy8KQEAgLTI2NCwxNyArNjA0LDI0IEBACiAgICAgICAgICAgICAvLyBUaGlzIGZ1bmN0aW9uIGlzIGEgdGVtcG9yYXJ5IHNvbHV0aW9uLiAgVGhlIGZpbmFsIHNvbHV0aW9uIHdpbGwKICAgICAgICAgICAgIC8vIHVzZWQgdHlwZWQgYWxsb2NhdGlvbnMgd2hlcmUgdGhlIG1lc3NhZ2UgaWQgaXMgdGhlIHR5cGUgaW5kaWNhdG9yLgogICAgICAgICAgICAgaW50W10gcmJ1ZiA9IG5ldyBpbnRbMTZdOwotICAgICAgICAgICAgbVJTLm5Db250ZXh0SW5pdFRvQ2xpZW50KCk7CisgICAgICAgICAgICBtUlMubkNvbnRleHRJbml0VG9DbGllbnQobVJTLm1Db250ZXh0KTsKICAgICAgICAgICAgIHdoaWxlKG1SdW4pIHsKLSAgICAgICAgICAgICAgICBpbnQgbXNnID0gbVJTLm5Db250ZXh0R2V0TWVzc2FnZShyYnVmLCB0cnVlKTsKKyAgICAgICAgICAgICAgICByYnVmWzBdID0gMDsKKyAgICAgICAgICAgICAgICBpbnQgbXNnID0gbVJTLm5Db250ZXh0R2V0TWVzc2FnZShtUlMubUNvbnRleHQsIHJidWYsIHRydWUpOwogICAgICAgICAgICAgICAgIGlmIChtc2cgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICAvLyBTaG91bGQgb25seSBoYXBwZW4gZHVyaW5nIHRlYXJkb3duLgotICAgICAgICAgICAgICAgICAgICAvLyBCdXQgd2Ugd2FudCB0byBhdm9pZCBzdGFydmluZyBvdGhlciB0aHJlYWRzIGR1cmluZwotICAgICAgICAgICAgICAgICAgICAvLyB0ZWFyZG93biBieSB5aWVsZGluZyB1bnRpbCB0aGUgbmV4dCBsaW5lIGluIHRoZSBkZXN0cnVjdG9yCi0gICAgICAgICAgICAgICAgICAgIC8vIGNhbiBleGVjdXRlIHRvIHNldCBtUnVuID0gZmFsc2UKLSAgICAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNsZWVwKDEsIDApOwotICAgICAgICAgICAgICAgICAgICB9IGNhdGNoKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gQ2FuIGhhcHBlbiBmb3IgdHdvIHJlYXNvbnMKKyAgICAgICAgICAgICAgICAgICAgaWYgKHJidWZbMF0gPiAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyAxOiBCdWZmZXIgbmVlZHMgdG8gYmUgZW5sYXJnZWQuCisgICAgICAgICAgICAgICAgICAgICAgICByYnVmID0gbmV3IGludFtyYnVmWzBdICsgMl07CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyAyOiB0ZWFyZG93bi4KKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIEJ1dCB3ZSB3YW50IHRvIGF2b2lkIHN0YXJ2aW5nIG90aGVyIHRocmVhZHMgZHVyaW5nCisgICAgICAgICAgICAgICAgICAgICAgICAvLyB0ZWFyZG93biBieSB5aWVsZGluZyB1bnRpbCB0aGUgbmV4dCBsaW5lIGluIHRoZSBkZXN0cnVjdG9yCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBjYW4gZXhlY3V0ZSB0byBzZXQgbVJ1biA9IGZhbHNlCisgICAgICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNsZWVwKDEsIDApOworICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgaWYobVJTLm1NZXNzYWdlQ2FsbGJhY2sgIT0gbnVsbCkgewpAQCAtMjgyLDcgKzYyOSw2IEBACiAgICAgICAgICAgICAgICAgICAgIG1SUy5tTWVzc2FnZUNhbGxiYWNrLm1JRCA9IG1zZzsKICAgICAgICAgICAgICAgICAgICAgbVJTLm1NZXNzYWdlQ2FsbGJhY2sucnVuKCk7CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIC8vTG9nLmQoTE9HX1RBRywgIk1lc3NhZ2VUaHJlYWQgbXNnICIgKyBtc2cgKyAiIHYxICIgKyByYnVmWzBdICsgIiB2MiAiICsgcmJ1ZlsxXSArICIgdjMgIiArcmJ1ZlsyXSk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBMb2cuZChMT0dfVEFHLCAiTWVzc2FnZVRocmVhZCBleGl0aW5nLiIpOwogICAgICAgICB9CkBAIC0zMDcsMTIgKzY1MywxNiBAQAogICAgICAgICBuQ29udGV4dER1bXAoYml0cyk7CiAgICAgfQogCisgICAgcHVibGljIHZvaWQgZmluaXNoKCkgeworICAgICAgICBuQ29udGV4dEZpbmlzaCgpOworICAgIH0KKwogICAgIHB1YmxpYyB2b2lkIGRlc3Ryb3koKSB7CiAgICAgICAgIHZhbGlkYXRlKCk7Ci0gICAgICAgIG5Db250ZXh0RGVpbml0VG9DbGllbnQoKTsKKyAgICAgICAgbkNvbnRleHREZWluaXRUb0NsaWVudChtQ29udGV4dCk7CiAgICAgICAgIG1NZXNzYWdlVGhyZWFkLm1SdW4gPSBmYWxzZTsKIAotICAgICAgICBuQ29udGV4dERlc3Ryb3kobUNvbnRleHQpOworICAgICAgICBuQ29udGV4dERlc3Ryb3koKTsKICAgICAgICAgbUNvbnRleHQgPSAwOwogCiAgICAgICAgIG5EZXZpY2VEZXN0cm95KG1EZXYpOwpAQCAtMzM1LDMgKzY4NSw0IEBACiB9CiAKIAorCmRpZmYgLS1naXQgYS9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L1JlbmRlclNjcmlwdEdMLmphdmEgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L1JlbmRlclNjcmlwdEdMLmphdmEKaW5kZXggZDFkZjIzZC4uNjFlY2M4ZCAxMDA2NDQKLS0tIGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9SZW5kZXJTY3JpcHRHTC5qYXZhCisrKyBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvUmVuZGVyU2NyaXB0R0wuamF2YQpAQCAtNzQsOSArNzQsOSBAQAogICAgICAgICBuQ29udGV4dEJpbmRSb290U2NyaXB0KHNhZmVJRChzKSk7CiAgICAgfQogCi0gICAgcHVibGljIHZvaWQgY29udGV4dEJpbmRQcm9ncmFtRnJhZ21lbnRTdG9yZShQcm9ncmFtU3RvcmUgcCkgeworICAgIHB1YmxpYyB2b2lkIGNvbnRleHRCaW5kUHJvZ3JhbVN0b3JlKFByb2dyYW1TdG9yZSBwKSB7CiAgICAgICAgIHZhbGlkYXRlKCk7Ci0gICAgICAgIG5Db250ZXh0QmluZFByb2dyYW1GcmFnbWVudFN0b3JlKHNhZmVJRChwKSk7CisgICAgICAgIG5Db250ZXh0QmluZFByb2dyYW1TdG9yZShzYWZlSUQocCkpOwogICAgIH0KIAogICAgIHB1YmxpYyB2b2lkIGNvbnRleHRCaW5kUHJvZ3JhbUZyYWdtZW50KFByb2dyYW1GcmFnbWVudCBwKSB7CkBAIC0xMDIsOCArMTAyLDcgQEAKIAogICAgIHB1YmxpYyBjbGFzcyBGaWxlIGV4dGVuZHMgQmFzZU9iaiB7CiAgICAgICAgIEZpbGUoaW50IGlkKSB7Ci0gICAgICAgICAgICBzdXBlcihSZW5kZXJTY3JpcHRHTC50aGlzKTsKLSAgICAgICAgICAgIG1JRCA9IGlkOworICAgICAgICAgICAgc3VwZXIoaWQsIFJlbmRlclNjcmlwdEdMLnRoaXMpOwogICAgICAgICB9CiAgICAgfQogCmRpZmYgLS1naXQgYS9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L1NhbXBsZXIuamF2YSBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvU2FtcGxlci5qYXZhCmluZGV4IDQwYmE3MjIuLjM0M2ZjZGIgMTAwNjQ0Ci0tLSBhL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvU2FtcGxlci5qYXZhCisrKyBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvU2FtcGxlci5qYXZhCkBAIC00NywxMCArNDcsODIgQEAKICAgICB9CiAKICAgICBTYW1wbGVyKGludCBpZCwgUmVuZGVyU2NyaXB0IHJzKSB7Ci0gICAgICAgIHN1cGVyKHJzKTsKLSAgICAgICAgbUlEID0gaWQ7CisgICAgICAgIHN1cGVyKGlkLCBycyk7CiAgICAgfQogCisgICAgcHVibGljIHN0YXRpYyBTYW1wbGVyIENMQU1QX05FQVJFU1QoUmVuZGVyU2NyaXB0IHJzKSB7CisgICAgICAgIGlmKHJzLm1TYW1wbGVyX0NMQU1QX05FQVJFU1QgPT0gbnVsbCkgeworICAgICAgICAgICAgQnVpbGRlciBiID0gbmV3IEJ1aWxkZXIocnMpOworICAgICAgICAgICAgYi5zZXRNaW4oVmFsdWUuTkVBUkVTVCk7CisgICAgICAgICAgICBiLnNldE1hZyhWYWx1ZS5ORUFSRVNUKTsKKyAgICAgICAgICAgIGIuc2V0V3JhcFMoVmFsdWUuQ0xBTVApOworICAgICAgICAgICAgYi5zZXRXcmFwVChWYWx1ZS5DTEFNUCk7CisgICAgICAgICAgICBycy5tU2FtcGxlcl9DTEFNUF9ORUFSRVNUID0gYi5jcmVhdGUoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcnMubVNhbXBsZXJfQ0xBTVBfTkVBUkVTVDsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIFNhbXBsZXIgQ0xBTVBfTElORUFSKFJlbmRlclNjcmlwdCBycykgeworICAgICAgICBpZihycy5tU2FtcGxlcl9DTEFNUF9MSU5FQVIgPT0gbnVsbCkgeworICAgICAgICAgICAgQnVpbGRlciBiID0gbmV3IEJ1aWxkZXIocnMpOworICAgICAgICAgICAgYi5zZXRNaW4oVmFsdWUuTElORUFSKTsKKyAgICAgICAgICAgIGIuc2V0TWFnKFZhbHVlLkxJTkVBUik7CisgICAgICAgICAgICBiLnNldFdyYXBTKFZhbHVlLkNMQU1QKTsKKyAgICAgICAgICAgIGIuc2V0V3JhcFQoVmFsdWUuQ0xBTVApOworICAgICAgICAgICAgcnMubVNhbXBsZXJfQ0xBTVBfTElORUFSID0gYi5jcmVhdGUoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcnMubVNhbXBsZXJfQ0xBTVBfTElORUFSOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgU2FtcGxlciBDTEFNUF9MSU5FQVJfTUlQX0xJTkVBUihSZW5kZXJTY3JpcHQgcnMpIHsKKyAgICAgICAgaWYocnMubVNhbXBsZXJfQ0xBTVBfTElORUFSX01JUF9MSU5FQVIgPT0gbnVsbCkgeworICAgICAgICAgICAgQnVpbGRlciBiID0gbmV3IEJ1aWxkZXIocnMpOworICAgICAgICAgICAgYi5zZXRNaW4oVmFsdWUuTElORUFSX01JUF9MSU5FQVIpOworICAgICAgICAgICAgYi5zZXRNYWcoVmFsdWUuTElORUFSKTsKKyAgICAgICAgICAgIGIuc2V0V3JhcFMoVmFsdWUuQ0xBTVApOworICAgICAgICAgICAgYi5zZXRXcmFwVChWYWx1ZS5DTEFNUCk7CisgICAgICAgICAgICBycy5tU2FtcGxlcl9DTEFNUF9MSU5FQVJfTUlQX0xJTkVBUiA9IGIuY3JlYXRlKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJzLm1TYW1wbGVyX0NMQU1QX0xJTkVBUl9NSVBfTElORUFSOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgU2FtcGxlciBXUkFQX05FQVJFU1QoUmVuZGVyU2NyaXB0IHJzKSB7CisgICAgICAgIGlmKHJzLm1TYW1wbGVyX1dSQVBfTkVBUkVTVCA9PSBudWxsKSB7CisgICAgICAgICAgICBCdWlsZGVyIGIgPSBuZXcgQnVpbGRlcihycyk7CisgICAgICAgICAgICBiLnNldE1pbihWYWx1ZS5ORUFSRVNUKTsKKyAgICAgICAgICAgIGIuc2V0TWFnKFZhbHVlLk5FQVJFU1QpOworICAgICAgICAgICAgYi5zZXRXcmFwUyhWYWx1ZS5XUkFQKTsKKyAgICAgICAgICAgIGIuc2V0V3JhcFQoVmFsdWUuV1JBUCk7CisgICAgICAgICAgICBycy5tU2FtcGxlcl9XUkFQX05FQVJFU1QgPSBiLmNyZWF0ZSgpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBycy5tU2FtcGxlcl9XUkFQX05FQVJFU1Q7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBTYW1wbGVyIFdSQVBfTElORUFSKFJlbmRlclNjcmlwdCBycykgeworICAgICAgICBpZihycy5tU2FtcGxlcl9XUkFQX0xJTkVBUiA9PSBudWxsKSB7CisgICAgICAgICAgICBCdWlsZGVyIGIgPSBuZXcgQnVpbGRlcihycyk7CisgICAgICAgICAgICBiLnNldE1pbihWYWx1ZS5MSU5FQVIpOworICAgICAgICAgICAgYi5zZXRNYWcoVmFsdWUuTElORUFSKTsKKyAgICAgICAgICAgIGIuc2V0V3JhcFMoVmFsdWUuV1JBUCk7CisgICAgICAgICAgICBiLnNldFdyYXBUKFZhbHVlLldSQVApOworICAgICAgICAgICAgcnMubVNhbXBsZXJfV1JBUF9MSU5FQVIgPSBiLmNyZWF0ZSgpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBycy5tU2FtcGxlcl9XUkFQX0xJTkVBUjsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIFNhbXBsZXIgV1JBUF9MSU5FQVJfTUlQX0xJTkVBUihSZW5kZXJTY3JpcHQgcnMpIHsKKyAgICAgICAgaWYocnMubVNhbXBsZXJfV1JBUF9MSU5FQVJfTUlQX0xJTkVBUiA9PSBudWxsKSB7CisgICAgICAgICAgICBCdWlsZGVyIGIgPSBuZXcgQnVpbGRlcihycyk7CisgICAgICAgICAgICBiLnNldE1pbihWYWx1ZS5MSU5FQVJfTUlQX0xJTkVBUik7CisgICAgICAgICAgICBiLnNldE1hZyhWYWx1ZS5MSU5FQVIpOworICAgICAgICAgICAgYi5zZXRXcmFwUyhWYWx1ZS5XUkFQKTsKKyAgICAgICAgICAgIGIuc2V0V3JhcFQoVmFsdWUuV1JBUCk7CisgICAgICAgICAgICBycy5tU2FtcGxlcl9XUkFQX0xJTkVBUl9NSVBfTElORUFSID0gYi5jcmVhdGUoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcnMubVNhbXBsZXJfV1JBUF9MSU5FQVJfTUlQX0xJTkVBUjsKKyAgICB9CisKKwogICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQnVpbGRlciB7CiAgICAgICAgIFJlbmRlclNjcmlwdCBtUlM7CiAgICAgICAgIFZhbHVlIG1NaW47CmRpZmYgLS1naXQgYS9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L1NjcmlwdC5qYXZhIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9TY3JpcHQuamF2YQppbmRleCA1N2NjZmEzLi4xOWM0NDRjIDEwMDY0NAotLS0gYS9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L1NjcmlwdC5qYXZhCisrKyBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvU2NyaXB0LmphdmEKQEAgLTQyLDI5ICs0Miw0NiBAQAogICAgICAgICB9CiAgICAgfQogCisgICAgcHJvdGVjdGVkIHZvaWQgaW52b2tlKGludCBzbG90KSB7CisgICAgICAgIG1SUy5uU2NyaXB0SW52b2tlKG1JRCwgc2xvdCk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIHZvaWQgaW52b2tlKGludCBzbG90LCBGaWVsZFBhY2tlciB2KSB7CisgICAgICAgIGlmICh2ICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1SUy5uU2NyaXB0SW52b2tlVihtSUQsIHNsb3QsIHYuZ2V0RGF0YSgpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1SUy5uU2NyaXB0SW52b2tlKG1JRCwgc2xvdCk7CisgICAgICAgIH0KKyAgICB9CisKKwogICAgIFNjcmlwdChpbnQgaWQsIFJlbmRlclNjcmlwdCBycykgewotICAgICAgICBzdXBlcihycyk7Ci0gICAgICAgIG1JRCA9IGlkOworICAgICAgICBzdXBlcihpZCwgcnMpOwogICAgIH0KIAogICAgIHB1YmxpYyB2b2lkIGJpbmRBbGxvY2F0aW9uKEFsbG9jYXRpb24gdmEsIGludCBzbG90KSB7CiAgICAgICAgIG1SUy52YWxpZGF0ZSgpOwotICAgICAgICBtUlMublNjcmlwdEJpbmRBbGxvY2F0aW9uKG1JRCwgdmEubUlELCBzbG90KTsKKyAgICAgICAgaWYgKHZhICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1SUy5uU2NyaXB0QmluZEFsbG9jYXRpb24obUlELCB2YS5tSUQsIHNsb3QpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbVJTLm5TY3JpcHRCaW5kQWxsb2NhdGlvbihtSUQsIDAsIHNsb3QpOworICAgICAgICB9CiAgICAgfQogCi0gICAgcHVibGljIHZvaWQgc2V0Q2xlYXJDb2xvcihmbG9hdCByLCBmbG9hdCBnLCBmbG9hdCBiLCBmbG9hdCBhKSB7Ci0gICAgICAgIG1SUy52YWxpZGF0ZSgpOwotICAgICAgICBtUlMublNjcmlwdFNldENsZWFyQ29sb3IobUlELCByLCBnLCBiLCBhKTsKKyAgICBwdWJsaWMgdm9pZCBzZXRWYXIoaW50IGluZGV4LCBmbG9hdCB2KSB7CisgICAgICAgIG1SUy5uU2NyaXB0U2V0VmFyRihtSUQsIGluZGV4LCB2KTsKICAgICB9CiAKLSAgICBwdWJsaWMgdm9pZCBzZXRDbGVhckRlcHRoKGZsb2F0IGQpIHsKLSAgICAgICAgbVJTLnZhbGlkYXRlKCk7Ci0gICAgICAgIG1SUy5uU2NyaXB0U2V0Q2xlYXJEZXB0aChtSUQsIGQpOworICAgIHB1YmxpYyB2b2lkIHNldFZhcihpbnQgaW5kZXgsIGludCB2KSB7CisgICAgICAgIG1SUy5uU2NyaXB0U2V0VmFySShtSUQsIGluZGV4LCB2KTsKICAgICB9CiAKLSAgICBwdWJsaWMgdm9pZCBzZXRDbGVhclN0ZW5jaWwoaW50IHN0ZW5jaWwpIHsKLSAgICAgICAgbVJTLnZhbGlkYXRlKCk7Ci0gICAgICAgIG1SUy5uU2NyaXB0U2V0Q2xlYXJTdGVuY2lsKG1JRCwgc3RlbmNpbCk7CisgICAgcHVibGljIHZvaWQgc2V0VmFyKGludCBpbmRleCwgYm9vbGVhbiB2KSB7CisgICAgICAgIG1SUy5uU2NyaXB0U2V0VmFySShtSUQsIGluZGV4LCB2ID8gMSA6IDApOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFZhcihpbnQgaW5kZXgsIEZpZWxkUGFja2VyIHYpIHsKKyAgICAgICAgbVJTLm5TY3JpcHRTZXRWYXJWKG1JRCwgaW5kZXgsIHYuZ2V0RGF0YSgpKTsKICAgICB9CiAKICAgICBwdWJsaWMgdm9pZCBzZXRUaW1lWm9uZShTdHJpbmcgdGltZVpvbmUpIHsKQEAgLTc4LDcyICs5NSw1NCBAQAogCiAgICAgcHVibGljIHN0YXRpYyBjbGFzcyBCdWlsZGVyIHsKICAgICAgICAgUmVuZGVyU2NyaXB0IG1SUzsKLSAgICAgICAgYm9vbGVhbiBtSXNSb290ID0gZmFsc2U7Ci0gICAgICAgIFR5cGVbXSBtVHlwZXM7Ci0gICAgICAgIFN0cmluZ1tdIG1OYW1lczsKLSAgICAgICAgYm9vbGVhbltdIG1Xcml0YWJsZTsKLSAgICAgICAgaW50IG1JbnZva2FibGVDb3VudCA9IDA7Ci0gICAgICAgIEludm9rYWJsZVtdIG1JbnZva2FibGVzOwogCiAgICAgICAgIEJ1aWxkZXIoUmVuZGVyU2NyaXB0IHJzKSB7CiAgICAgICAgICAgICBtUlMgPSByczsKLSAgICAgICAgICAgIG1UeXBlcyA9IG5ldyBUeXBlW01BWF9TTE9UXTsKLSAgICAgICAgICAgIG1OYW1lcyA9IG5ldyBTdHJpbmdbTUFYX1NMT1RdOwotICAgICAgICAgICAgbVdyaXRhYmxlID0gbmV3IGJvb2xlYW5bTUFYX1NMT1RdOwotICAgICAgICAgICAgbUludm9rYWJsZXMgPSBuZXcgSW52b2thYmxlW01BWF9TTE9UXTsKICAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldFR5cGUoVHlwZSB0LCBpbnQgc2xvdCkgewotICAgICAgICAgICAgbVR5cGVzW3Nsb3RdID0gdDsKLSAgICAgICAgICAgIG1OYW1lc1tzbG90XSA9IG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBzZXRUeXBlKFR5cGUgdCwgU3RyaW5nIG5hbWUsIGludCBzbG90KSB7Ci0gICAgICAgICAgICBtVHlwZXNbc2xvdF0gPSB0OwotICAgICAgICAgICAgbU5hbWVzW3Nsb3RdID0gbmFtZTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBJbnZva2FibGUgYWRkSW52b2thYmxlKFN0cmluZyBmdW5jKSB7Ci0gICAgICAgICAgICBJbnZva2FibGUgaSA9IG5ldyBJbnZva2FibGUoKTsKLSAgICAgICAgICAgIGkubU5hbWUgPSBmdW5jOwotICAgICAgICAgICAgaS5tUlMgPSBtUlM7Ci0gICAgICAgICAgICBpLm1TbG90ID0gbUludm9rYWJsZUNvdW50OwotICAgICAgICAgICAgbUludm9rYWJsZXNbbUludm9rYWJsZUNvdW50KytdID0gaTsKLSAgICAgICAgICAgIHJldHVybiBpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgc2V0VHlwZShib29sZWFuIHdyaXRhYmxlLCBpbnQgc2xvdCkgewotICAgICAgICAgICAgbVdyaXRhYmxlW3Nsb3RdID0gd3JpdGFibGU7Ci0gICAgICAgIH0KLQotICAgICAgICB2b2lkIHRyYW5zZmVyQ3JlYXRlKCkgewotICAgICAgICAgICAgbVJTLm5TY3JpcHRTZXRSb290KG1Jc1Jvb3QpOwotICAgICAgICAgICAgZm9yKGludCBjdD0wOyBjdCA8IG1UeXBlcy5sZW5ndGg7IGN0KyspIHsKLSAgICAgICAgICAgICAgICBpZihtVHlwZXNbY3RdICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgbVJTLm5TY3JpcHRTZXRUeXBlKG1UeXBlc1tjdF0ubUlELCBtV3JpdGFibGVbY3RdLCBtTmFtZXNbY3RdLCBjdCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgZm9yKGludCBjdD0wOyBjdCA8IG1JbnZva2FibGVDb3VudDsgY3QrKykgewotICAgICAgICAgICAgICAgIG1SUy5uU2NyaXB0U2V0SW52b2thYmxlKG1JbnZva2FibGVzW2N0XS5tTmFtZSwgY3QpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgdm9pZCB0cmFuc2Zlck9iamVjdChTY3JpcHQgcykgewotICAgICAgICAgICAgcy5tSXNSb290ID0gbUlzUm9vdDsKLSAgICAgICAgICAgIHMubVR5cGVzID0gbVR5cGVzOwotICAgICAgICAgICAgcy5tSW52b2thYmxlcyA9IG5ldyBJbnZva2FibGVbbUludm9rYWJsZUNvdW50XTsKLSAgICAgICAgICAgIGZvcihpbnQgY3Q9MDsgY3QgPCBtSW52b2thYmxlQ291bnQ7IGN0KyspIHsKLSAgICAgICAgICAgICAgICBzLm1JbnZva2FibGVzW2N0XSA9IG1JbnZva2FibGVzW2N0XTsKLSAgICAgICAgICAgICAgICBzLm1JbnZva2FibGVzW2N0XS5tU2NyaXB0ID0gczsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHMubUludm9rYWJsZXMgPSBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgc2V0Um9vdChib29sZWFuIHIpIHsKLSAgICAgICAgICAgIG1Jc1Jvb3QgPSByOwotICAgICAgICB9Ci0KICAgICB9CiAKKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgRmllbGRCYXNlIHsKKyAgICAgICAgcHJvdGVjdGVkIEVsZW1lbnQgbUVsZW1lbnQ7CisgICAgICAgIHByb3RlY3RlZCBUeXBlIG1UeXBlOworICAgICAgICBwcm90ZWN0ZWQgQWxsb2NhdGlvbiBtQWxsb2NhdGlvbjsKKworICAgICAgICBwcm90ZWN0ZWQgdm9pZCBpbml0KFJlbmRlclNjcmlwdCBycywgaW50IGRpbXgpIHsKKyAgICAgICAgICAgIG1BbGxvY2F0aW9uID0gQWxsb2NhdGlvbi5jcmVhdGVTaXplZChycywgbUVsZW1lbnQsIGRpbXgpOworICAgICAgICAgICAgbVR5cGUgPSBtQWxsb2NhdGlvbi5nZXRUeXBlKCk7CisgICAgICAgIH0KKworICAgICAgICBwcm90ZWN0ZWQgRmllbGRCYXNlKCkgeworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIEVsZW1lbnQgZ2V0RWxlbWVudCgpIHsKKyAgICAgICAgICAgIHJldHVybiBtRWxlbWVudDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBUeXBlIGdldFR5cGUoKSB7CisgICAgICAgICAgICByZXR1cm4gbVR5cGU7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgQWxsb2NhdGlvbiBnZXRBbGxvY2F0aW9uKCkgeworICAgICAgICAgICAgcmV0dXJuIG1BbGxvY2F0aW9uOworICAgICAgICB9CisKKyAgICAgICAgLy9AT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgdXBkYXRlQWxsb2NhdGlvbigpIHsKKyAgICAgICAgfQorCisKKyAgICAgICAgLy8KKyAgICAgICAgLyoKKyAgICAgICAgcHVibGljIGNsYXNzIFNjcmlwdEZpZWxkX1VzZXJGaWVsZAorICAgICAgICAgICAgZXh0ZW5kcyBhbmRyb2lkLnJlbmRlcnNjcmlwdC5TY3JpcHQuRmllbGRCYXNlIHsKKworICAgICAgICAgICAgcHJvdGVjdGVkCisKKyAgICAgICAgfQorCisgICAgICAgICovCisKKyAgICB9CiB9CiAKZGlmZiAtLWdpdCBhL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvU2NyaXB0Qy5qYXZhIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9TY3JpcHRDLmphdmEKaW5kZXggYmI5OWUyMy4uNTk1OWJlNCAxMDA2NDQKLS0tIGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9TY3JpcHRDLmphdmEKKysrIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9TY3JpcHRDLmphdmEKQEAgLTM3LDExICszNyw0OSBAQAogICAgICAgICBzdXBlcihpZCwgcnMpOwogICAgIH0KIAorICAgIHByb3RlY3RlZCBTY3JpcHRDKFJlbmRlclNjcmlwdCBycywgUmVzb3VyY2VzIHJlc291cmNlcywgaW50IHJlc291cmNlSUQsIGJvb2xlYW4gaXNSb290KSB7CisgICAgICAgIHN1cGVyKDAsIHJzKTsKKyAgICAgICAgbUlEID0gaW50ZXJuYWxDcmVhdGUocnMsIHJlc291cmNlcywgcmVzb3VyY2VJRCk7CisgICAgfQorCisKKyAgICBwcml2YXRlIHN0YXRpYyBzeW5jaHJvbml6ZWQgaW50IGludGVybmFsQ3JlYXRlKFJlbmRlclNjcmlwdCBycywgUmVzb3VyY2VzIHJlc291cmNlcywgaW50IHJlc291cmNlSUQpIHsKKyAgICAgICAgYnl0ZVtdIHBnbTsKKyAgICAgICAgaW50IHBnbUxlbmd0aDsKKyAgICAgICAgSW5wdXRTdHJlYW0gaXMgPSByZXNvdXJjZXMub3BlblJhd1Jlc291cmNlKHJlc291cmNlSUQpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBwZ20gPSBuZXcgYnl0ZVsxMDI0XTsKKyAgICAgICAgICAgICAgICBwZ21MZW5ndGggPSAwOworICAgICAgICAgICAgICAgIHdoaWxlKHRydWUpIHsKKyAgICAgICAgICAgICAgICAgICAgaW50IGJ5dGVzTGVmdCA9IHBnbS5sZW5ndGggLSBwZ21MZW5ndGg7CisgICAgICAgICAgICAgICAgICAgIGlmIChieXRlc0xlZnQgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZVtdIGJ1ZjIgPSBuZXcgYnl0ZVtwZ20ubGVuZ3RoICogMl07CisgICAgICAgICAgICAgICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KHBnbSwgMCwgYnVmMiwgMCwgcGdtLmxlbmd0aCk7CisgICAgICAgICAgICAgICAgICAgICAgICBwZ20gPSBidWYyOworICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZXNMZWZ0ID0gcGdtLmxlbmd0aCAtIHBnbUxlbmd0aDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpbnQgYnl0ZXNSZWFkID0gaXMucmVhZChwZ20sIHBnbUxlbmd0aCwgYnl0ZXNMZWZ0KTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGJ5dGVzUmVhZCA8PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBwZ21MZW5ndGggKz0gYnl0ZXNSZWFkOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgaXMuY2xvc2UoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgUmVzb3VyY2VzLk5vdEZvdW5kRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKworICAgICAgICBycy5uU2NyaXB0Q0JlZ2luKCk7CisgICAgICAgIHJzLm5TY3JpcHRDU2V0U2NyaXB0KHBnbSwgMCwgcGdtTGVuZ3RoKTsKKyAgICAgICAgcmV0dXJuIHJzLm5TY3JpcHRDQ3JlYXRlKCk7CisgICAgfQorCiAgICAgcHVibGljIHN0YXRpYyBjbGFzcyBCdWlsZGVyIGV4dGVuZHMgU2NyaXB0LkJ1aWxkZXIgewogICAgICAgICBieXRlW10gbVByb2dyYW07CiAgICAgICAgIGludCBtUHJvZ3JhbUxlbmd0aDsKLSAgICAgICAgSGFzaE1hcDxTdHJpbmcsSW50ZWdlcj4gbUludERlZmluZXMgPSBuZXcgSGFzaE1hcCgpOwotICAgICAgICBIYXNoTWFwPFN0cmluZyxGbG9hdD4gbUZsb2F0RGVmaW5lcyA9IG5ldyBIYXNoTWFwKCk7CiAKICAgICAgICAgcHVibGljIEJ1aWxkZXIoUmVuZGVyU2NyaXB0IHJzKSB7CiAgICAgICAgICAgICBzdXBlcihycyk7CkBAIC05Miw2NiArMTMwLDIwIEBACiAKICAgICAgICAgc3RhdGljIHN5bmNocm9uaXplZCBTY3JpcHRDIGludGVybmFsQ3JlYXRlKEJ1aWxkZXIgYikgewogICAgICAgICAgICAgYi5tUlMublNjcmlwdENCZWdpbigpOwotICAgICAgICAgICAgYi50cmFuc2ZlckNyZWF0ZSgpOwogCi0gICAgICAgICAgICBmb3IgKEVudHJ5PFN0cmluZyxJbnRlZ2VyPiBlOiBiLm1JbnREZWZpbmVzLmVudHJ5U2V0KCkpIHsKLSAgICAgICAgICAgICAgICBiLm1SUy5uU2NyaXB0Q0FkZERlZmluZUkzMihlLmdldEtleSgpLCBlLmdldFZhbHVlKCkuaW50VmFsdWUoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmb3IgKEVudHJ5PFN0cmluZyxGbG9hdD4gZTogYi5tRmxvYXREZWZpbmVzLmVudHJ5U2V0KCkpIHsKLSAgICAgICAgICAgICAgICBiLm1SUy5uU2NyaXB0Q0FkZERlZmluZUYoZS5nZXRLZXkoKSwgZS5nZXRWYWx1ZSgpLmZsb2F0VmFsdWUoKSk7Ci0gICAgICAgICAgICB9Ci0KKyAgICAgICAgICAgIGFuZHJvaWQudXRpbC5Mb2cuZSgicnMiLCAibGVuID0gIiArIGIubVByb2dyYW1MZW5ndGgpOwogICAgICAgICAgICAgYi5tUlMublNjcmlwdENTZXRTY3JpcHQoYi5tUHJvZ3JhbSwgMCwgYi5tUHJvZ3JhbUxlbmd0aCk7CiAKICAgICAgICAgICAgIGludCBpZCA9IGIubVJTLm5TY3JpcHRDQ3JlYXRlKCk7CiAgICAgICAgICAgICBTY3JpcHRDIG9iaiA9IG5ldyBTY3JpcHRDKGlkLCBiLm1SUyk7Ci0gICAgICAgICAgICBiLnRyYW5zZmVyT2JqZWN0KG9iaik7Ci0KICAgICAgICAgICAgIHJldHVybiBvYmo7CiAgICAgICAgIH0KIAotICAgICAgICBwdWJsaWMgdm9pZCBhZGREZWZpbmUoU3RyaW5nIG5hbWUsIGludCB2YWx1ZSkgewotICAgICAgICAgICAgbUludERlZmluZXMucHV0KG5hbWUsIHZhbHVlKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIGFkZERlZmluZShTdHJpbmcgbmFtZSwgZmxvYXQgdmFsdWUpIHsKLSAgICAgICAgICAgIG1GbG9hdERlZmluZXMucHV0KG5hbWUsIHZhbHVlKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBUYWtlcyB0aGUgYWxsIHB1YmxpYyBzdGF0aWMgZmluYWwgZmllbGRzIGZvciBhIGNsYXNzLCBhbmQgYWRkcyBkZWZpbmVzCi0gICAgICAgICAqIGZvciB0aGVtLCB1c2luZyB0aGUgbmFtZSBvZiB0aGUgZmllbGQgYXMgdGhlIG5hbWUgb2YgdGhlIGRlZmluZS4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyB2b2lkIGFkZERlZmluZXMoQ2xhc3MgY2wpIHsKLSAgICAgICAgICAgIGFkZERlZmluZXMoY2wuZ2V0RmllbGRzKCksIChNb2RpZmllci5TVEFUSUMgfCBNb2RpZmllci5GSU5BTCB8IE1vZGlmaWVyLlBVQkxJQyksIG51bGwpOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFRha2VzIHRoZSBhbGwgcHVibGljIGZpZWxkcyBmb3IgYW4gb2JqZWN0LCBhbmQgYWRkcyBkZWZpbmVzCi0gICAgICAgICAqIGZvciB0aGVtLCB1c2luZyB0aGUgbmFtZSBvZiB0aGUgZmllbGQgYXMgdGhlIG5hbWUgb2YgdGhlIGRlZmluZS4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyB2b2lkIGFkZERlZmluZXMoT2JqZWN0IG8pIHsKLSAgICAgICAgICAgIGFkZERlZmluZXMoby5nZXRDbGFzcygpLmdldEZpZWxkcygpLCBNb2RpZmllci5QVUJMSUMsIG8pOwotICAgICAgICB9Ci0KLSAgICAgICAgdm9pZCBhZGREZWZpbmVzKEZpZWxkW10gZmllbGRzLCBpbnQgbWFzaywgT2JqZWN0IG8pIHsKLSAgICAgICAgICAgIGZvciAoRmllbGQgZjogZmllbGRzKSB7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKChmLmdldE1vZGlmaWVycygpICYgbWFzaykgPT0gbWFzaykgewotICAgICAgICAgICAgICAgICAgICAgICAgQ2xhc3MgdCA9IGYuZ2V0VHlwZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHQgPT0gaW50LmNsYXNzKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbUludERlZmluZXMucHV0KGYuZ2V0TmFtZSgpLCBmLmdldEludChvKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICh0ID09IGZsb2F0LmNsYXNzKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbUZsb2F0RGVmaW5lcy5wdXQoZi5nZXROYW1lKCksIGYuZ2V0RmxvYXQobykpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgICAgICAgICAvLyBUT0RPOiBEbyB3ZSB3YW50IHRoaXMgbG9nPwotICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJhZGREZWZpbmVzIHNraXBwaW5nIGZpZWxkICIgKyBmLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9CisgICAgICAgIHB1YmxpYyB2b2lkIGFkZERlZmluZShTdHJpbmcgbmFtZSwgaW50IHZhbHVlKSB7fQorICAgICAgICBwdWJsaWMgdm9pZCBhZGREZWZpbmUoU3RyaW5nIG5hbWUsIGZsb2F0IHZhbHVlKSB7fQorICAgICAgICBwdWJsaWMgdm9pZCBhZGREZWZpbmVzKENsYXNzIGNsKSB7fQorICAgICAgICBwdWJsaWMgdm9pZCBhZGREZWZpbmVzKE9iamVjdCBvKSB7fQorICAgICAgICB2b2lkIGFkZERlZmluZXMoRmllbGRbXSBmaWVsZHMsIGludCBtYXNrLCBPYmplY3Qgbykge30KIAogICAgICAgICBwdWJsaWMgU2NyaXB0QyBjcmVhdGUoKSB7CiAgICAgICAgICAgICByZXR1cm4gaW50ZXJuYWxDcmVhdGUodGhpcyk7CmRpZmYgLS1naXQgYS9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L1Nob3J0Mi5qYXZhIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9TaG9ydDIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MjY4MDFmCi0tLSAvZGV2L251bGwKKysrIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9TaG9ydDIuamF2YQpAQCAtMCwwICsxLDM3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLnJlbmRlcnNjcmlwdDsKKworaW1wb3J0IGphdmEubGFuZy5NYXRoOworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CisKKworLyoqCisgKiBAaGlkZQorICoKKyAqKi8KK3B1YmxpYyBjbGFzcyBTaG9ydDIgeworICAgIHB1YmxpYyBTaG9ydDIoKSB7CisgICAgfQorCisgICAgcHVibGljIHNob3J0IHg7CisgICAgcHVibGljIHNob3J0IHk7Cit9CisKKworCisKZGlmZiAtLWdpdCBhL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvU2hvcnQzLmphdmEgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L1Nob3J0My5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdiOWMzMDUKLS0tIC9kZXYvbnVsbAorKysgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L1Nob3J0My5qYXZhCkBAIC0wLDAgKzEsMzggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQucmVuZGVyc2NyaXB0OworCitpbXBvcnQgamF2YS5sYW5nLk1hdGg7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKKworCisvKioKKyAqIEBoaWRlCisgKgorICoqLworcHVibGljIGNsYXNzIFNob3J0MyB7CisgICAgcHVibGljIFNob3J0MygpIHsKKyAgICB9CisKKyAgICBwdWJsaWMgc2hvcnQgeDsKKyAgICBwdWJsaWMgc2hvcnQgeTsKKyAgICBwdWJsaWMgc2hvcnQgejsKK30KKworCisKKwpkaWZmIC0tZ2l0IGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9TaG9ydDQuamF2YSBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvU2hvcnQ0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWE0NzRlMgotLS0gL2Rldi9udWxsCisrKyBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvU2hvcnQ0LmphdmEKQEAgLTAsMCArMSwzOCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5yZW5kZXJzY3JpcHQ7CisKK2ltcG9ydCBqYXZhLmxhbmcuTWF0aDsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworCisKKy8qKgorICogQGhpZGUKKyAqCisgKiovCitwdWJsaWMgY2xhc3MgU2hvcnQ0IHsKKyAgICBwdWJsaWMgU2hvcnQ0KCkgeworICAgIH0KKworICAgIHB1YmxpYyBzaG9ydCB4OworICAgIHB1YmxpYyBzaG9ydCB5OworICAgIHB1YmxpYyBzaG9ydCB6OworICAgIHB1YmxpYyBzaG9ydCB3OworfQorCisKKwpkaWZmIC0tZ2l0IGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9TaW1wbGVNZXNoLmphdmEgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L1NpbXBsZU1lc2guamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGEyMTdhOS4uMDAwMDAwMAotLS0gYS9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L1NpbXBsZU1lc2guamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2NCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBhbmRyb2lkLnJlbmRlcnNjcmlwdDsKLQotaW1wb3J0IGFuZHJvaWQudXRpbC5Db25maWc7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKLQotLyoqCi0gKiBAaGlkZQotICoKLSAqKi8KLXB1YmxpYyBjbGFzcyBTaW1wbGVNZXNoIGV4dGVuZHMgQmFzZU9iaiB7Ci0gICAgVHlwZVtdIG1WZXJ0ZXhUeXBlczsKLSAgICBUeXBlIG1JbmRleFR5cGU7Ci0gICAgLy9UeXBlIG1CYXRjaGVUeXBlOwotICAgIFByaW1pdGl2ZSBtUHJpbWl0aXZlOwotCi0gICAgU2ltcGxlTWVzaChpbnQgaWQsIFJlbmRlclNjcmlwdCBycykgewotICAgICAgICBzdXBlcihycyk7Ci0gICAgICAgIG1JRCA9IGlkOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGJpbmRWZXJ0ZXhBbGxvY2F0aW9uKEFsbG9jYXRpb24gYSwgaW50IHNsb3QpIHsKLSAgICAgICAgbVJTLnZhbGlkYXRlKCk7Ci0gICAgICAgIG1SUy5uU2ltcGxlTWVzaEJpbmRWZXJ0ZXgobUlELCBhLm1JRCwgc2xvdCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYmluZEluZGV4QWxsb2NhdGlvbihBbGxvY2F0aW9uIGEpIHsKLSAgICAgICAgbVJTLnZhbGlkYXRlKCk7Ci0gICAgICAgIG1SUy5uU2ltcGxlTWVzaEJpbmRJbmRleChtSUQsIGEubUlEKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQWxsb2NhdGlvbiBjcmVhdGVWZXJ0ZXhBbGxvY2F0aW9uKGludCBzbG90KSB7Ci0gICAgICAgIG1SUy52YWxpZGF0ZSgpOwotICAgICAgICByZXR1cm4gQWxsb2NhdGlvbi5jcmVhdGVUeXBlZChtUlMsIG1WZXJ0ZXhUeXBlc1tzbG90XSk7Ci0gICAgfQotCi0gICAgcHVibGljIEFsbG9jYXRpb24gY3JlYXRlSW5kZXhBbGxvY2F0aW9uKCkgewotICAgICAgICBtUlMudmFsaWRhdGUoKTsKLSAgICAgICAgcmV0dXJuIEFsbG9jYXRpb24uY3JlYXRlVHlwZWQobVJTLCBtSW5kZXhUeXBlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgVHlwZSBnZXRWZXJ0ZXhUeXBlKGludCBzbG90KSB7Ci0gICAgICAgIHJldHVybiBtVmVydGV4VHlwZXNbc2xvdF07Ci0gICAgfQotCi0gICAgcHVibGljIFR5cGUgZ2V0SW5kZXhUeXBlKCkgewotICAgICAgICByZXR1cm4gbUluZGV4VHlwZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEJ1aWxkZXIgewotICAgICAgICBSZW5kZXJTY3JpcHQgbVJTOwotCi0gICAgICAgIGNsYXNzIEVudHJ5IHsKLSAgICAgICAgICAgIFR5cGUgdDsKLSAgICAgICAgICAgIEVsZW1lbnQgZTsKLSAgICAgICAgICAgIGludCBzaXplOwotICAgICAgICB9Ci0KLSAgICAgICAgaW50IG1WZXJ0ZXhUeXBlQ291bnQ7Ci0gICAgICAgIEVudHJ5W10gbVZlcnRleFR5cGVzOwotICAgICAgICBFbnRyeSBtSW5kZXhUeXBlOwotICAgICAgICAvL0VudHJ5IG1CYXRjaFR5cGU7Ci0gICAgICAgIFByaW1pdGl2ZSBtUHJpbWl0aXZlOwotCi0KLSAgICAgICAgcHVibGljIEJ1aWxkZXIoUmVuZGVyU2NyaXB0IHJzKSB7Ci0gICAgICAgICAgICBtUlMgPSByczsKLSAgICAgICAgICAgIG1WZXJ0ZXhUeXBlQ291bnQgPSAwOwotICAgICAgICAgICAgbVZlcnRleFR5cGVzID0gbmV3IEVudHJ5WzE2XTsKLSAgICAgICAgICAgIG1JbmRleFR5cGUgPSBuZXcgRW50cnkoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBpbnQgYWRkVmVydGV4VHlwZShUeXBlIHQpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gewotICAgICAgICAgICAgaWYgKG1WZXJ0ZXhUeXBlQ291bnQgPj0gbVZlcnRleFR5cGVzLmxlbmd0aCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIk1heCB2ZXJ0ZXggdHlwZXMgZXhjZWVkZWQuIik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGludCBhZGRlZEluZGV4ID0gbVZlcnRleFR5cGVDb3VudDsKLSAgICAgICAgICAgIG1WZXJ0ZXhUeXBlc1ttVmVydGV4VHlwZUNvdW50XSA9IG5ldyBFbnRyeSgpOwotICAgICAgICAgICAgbVZlcnRleFR5cGVzW21WZXJ0ZXhUeXBlQ291bnRdLnQgPSB0OwotICAgICAgICAgICAgbVZlcnRleFR5cGVDb3VudCsrOwotICAgICAgICAgICAgcmV0dXJuIGFkZGVkSW5kZXg7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgaW50IGFkZFZlcnRleFR5cGUoRWxlbWVudCBlLCBpbnQgc2l6ZSkgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICBpZiAobVZlcnRleFR5cGVDb3VudCA+PSBtVmVydGV4VHlwZXMubGVuZ3RoKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiTWF4IHZlcnRleCB0eXBlcyBleGNlZWRlZC4iKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaW50IGFkZGVkSW5kZXggPSBtVmVydGV4VHlwZUNvdW50OwotICAgICAgICAgICAgbVZlcnRleFR5cGVzW21WZXJ0ZXhUeXBlQ291bnRdID0gbmV3IEVudHJ5KCk7Ci0gICAgICAgICAgICBtVmVydGV4VHlwZXNbbVZlcnRleFR5cGVDb3VudF0uZSA9IGU7Ci0gICAgICAgICAgICBtVmVydGV4VHlwZXNbbVZlcnRleFR5cGVDb3VudF0uc2l6ZSA9IHNpemU7Ci0gICAgICAgICAgICBtVmVydGV4VHlwZUNvdW50Kys7Ci0gICAgICAgICAgICByZXR1cm4gYWRkZWRJbmRleDsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldEluZGV4VHlwZShUeXBlIHQpIHsKLSAgICAgICAgICAgIG1JbmRleFR5cGUudCA9IHQ7Ci0gICAgICAgICAgICBtSW5kZXhUeXBlLmUgPSBudWxsOwotICAgICAgICAgICAgbUluZGV4VHlwZS5zaXplID0gMDsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldEluZGV4VHlwZShFbGVtZW50IGUsIGludCBzaXplKSB7Ci0gICAgICAgICAgICBtSW5kZXhUeXBlLnQgPSBudWxsOwotICAgICAgICAgICAgbUluZGV4VHlwZS5lID0gZTsKLSAgICAgICAgICAgIG1JbmRleFR5cGUuc2l6ZSA9IHNpemU7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBzZXRQcmltaXRpdmUoUHJpbWl0aXZlIHApIHsKLSAgICAgICAgICAgIG1QcmltaXRpdmUgPSBwOwotICAgICAgICB9Ci0KLQotICAgICAgICBUeXBlIG5ld1R5cGUoRWxlbWVudCBlLCBpbnQgc2l6ZSkgewotICAgICAgICAgICAgVHlwZS5CdWlsZGVyIHRiID0gbmV3IFR5cGUuQnVpbGRlcihtUlMsIGUpOwotICAgICAgICAgICAgdGIuYWRkKERpbWVuc2lvbi5YLCBzaXplKTsKLSAgICAgICAgICAgIHJldHVybiB0Yi5jcmVhdGUoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHN0YXRpYyBzeW5jaHJvbml6ZWQgU2ltcGxlTWVzaCBpbnRlcm5hbENyZWF0ZShSZW5kZXJTY3JpcHQgcnMsIEJ1aWxkZXIgYikgewotICAgICAgICAgICAgVHlwZVtdIHRvRGVzdHJveSA9IG5ldyBUeXBlWzE4XTsKLSAgICAgICAgICAgIGludCB0b0Rlc3Ryb3lDb3VudCA9IDA7Ci0KLSAgICAgICAgICAgIGludCBpbmRleElEID0gMDsKLSAgICAgICAgICAgIGlmIChiLm1JbmRleFR5cGUudCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgaW5kZXhJRCA9IGIubUluZGV4VHlwZS50Lm1JRDsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoYi5tSW5kZXhUeXBlLnNpemUgIT0gMCkgewotICAgICAgICAgICAgICAgIGIubUluZGV4VHlwZS50ID0gYi5uZXdUeXBlKGIubUluZGV4VHlwZS5lLCBiLm1JbmRleFR5cGUuc2l6ZSk7Ci0gICAgICAgICAgICAgICAgaW5kZXhJRCA9IGIubUluZGV4VHlwZS50Lm1JRDsKLSAgICAgICAgICAgICAgICB0b0Rlc3Ryb3lbdG9EZXN0cm95Q291bnQrK10gPSBiLm1JbmRleFR5cGUudDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaW50W10gSURzID0gbmV3IGludFtiLm1WZXJ0ZXhUeXBlQ291bnRdOwotICAgICAgICAgICAgZm9yKGludCBjdD0wOyBjdCA8IGIubVZlcnRleFR5cGVDb3VudDsgY3QrKykgewotICAgICAgICAgICAgICAgIGlmIChiLm1WZXJ0ZXhUeXBlc1tjdF0udCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIElEc1tjdF0gPSBiLm1WZXJ0ZXhUeXBlc1tjdF0udC5tSUQ7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgYi5tVmVydGV4VHlwZXNbY3RdLnQgPSBiLm5ld1R5cGUoYi5tVmVydGV4VHlwZXNbY3RdLmUsIGIubVZlcnRleFR5cGVzW2N0XS5zaXplKTsKLSAgICAgICAgICAgICAgICAgICAgSURzW2N0XSA9IGIubVZlcnRleFR5cGVzW2N0XS50Lm1JRDsKLSAgICAgICAgICAgICAgICAgICAgdG9EZXN0cm95W3RvRGVzdHJveUNvdW50KytdID0gYi5tVmVydGV4VHlwZXNbY3RdLnQ7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpbnQgaWQgPSBycy5uU2ltcGxlTWVzaENyZWF0ZSgwLCBpbmRleElELCBJRHMsIGIubVByaW1pdGl2ZS5tSUQpOwotICAgICAgICAgICAgZm9yKGludCBjdD0wOyBjdCA8IHRvRGVzdHJveUNvdW50OyBjdCsrKSB7Ci0gICAgICAgICAgICAgICAgdG9EZXN0cm95W2N0XS5kZXN0cm95KCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiBuZXcgU2ltcGxlTWVzaChpZCwgcnMpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIFNpbXBsZU1lc2ggY3JlYXRlKCkgewotICAgICAgICAgICAgbVJTLnZhbGlkYXRlKCk7Ci0gICAgICAgICAgICBTaW1wbGVNZXNoIHNtID0gaW50ZXJuYWxDcmVhdGUobVJTLCB0aGlzKTsKLSAgICAgICAgICAgIHNtLm1WZXJ0ZXhUeXBlcyA9IG5ldyBUeXBlW21WZXJ0ZXhUeXBlQ291bnRdOwotICAgICAgICAgICAgZm9yKGludCBjdD0wOyBjdCA8IG1WZXJ0ZXhUeXBlQ291bnQ7IGN0KyspIHsKLSAgICAgICAgICAgICAgICBzbS5tVmVydGV4VHlwZXNbY3RdID0gbVZlcnRleFR5cGVzW2N0XS50OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc20ubUluZGV4VHlwZSA9IG1JbmRleFR5cGUudDsKLSAgICAgICAgICAgIHNtLm1QcmltaXRpdmUgPSBtUHJpbWl0aXZlOwotICAgICAgICAgICAgcmV0dXJuIHNtOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBjbGFzcyBUcmlhbmdsZU1lc2hCdWlsZGVyIHsKLSAgICAgICAgZmxvYXQgbVZ0eERhdGFbXTsKLSAgICAgICAgaW50IG1WdHhDb3VudDsKLSAgICAgICAgc2hvcnQgbUluZGV4RGF0YVtdOwotICAgICAgICBpbnQgbUluZGV4Q291bnQ7Ci0gICAgICAgIFJlbmRlclNjcmlwdCBtUlM7Ci0gICAgICAgIEVsZW1lbnQgbUVsZW1lbnQ7Ci0KLSAgICAgICAgZmxvYXQgbU5YID0gMDsKLSAgICAgICAgZmxvYXQgbU5ZID0gMDsKLSAgICAgICAgZmxvYXQgbU5aID0gLTE7Ci0gICAgICAgIGZsb2F0IG1TMCA9IDA7Ci0gICAgICAgIGZsb2F0IG1UMCA9IDA7Ci0gICAgICAgIGZsb2F0IG1SID0gMTsKLSAgICAgICAgZmxvYXQgbUcgPSAxOwotICAgICAgICBmbG9hdCBtQiA9IDE7Ci0gICAgICAgIGZsb2F0IG1BID0gMTsKLQotICAgICAgICBpbnQgbVZ0eFNpemU7Ci0gICAgICAgIGludCBtRmxhZ3M7Ci0KLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ09MT1IgPSAweDAwMDE7Ci0gICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE5PUk1BTCA9IDB4MDAwMjsKLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVEVYVFVSRV8wID0gMHgwMTAwOwotCi0gICAgICAgIHB1YmxpYyBUcmlhbmdsZU1lc2hCdWlsZGVyKFJlbmRlclNjcmlwdCBycywgaW50IHZ0eFNpemUsIGludCBmbGFncykgewotICAgICAgICAgICAgbVJTID0gcnM7Ci0gICAgICAgICAgICBtVnR4Q291bnQgPSAwOwotICAgICAgICAgICAgbUluZGV4Q291bnQgPSAwOwotICAgICAgICAgICAgbVZ0eERhdGEgPSBuZXcgZmxvYXRbMTI4XTsKLSAgICAgICAgICAgIG1JbmRleERhdGEgPSBuZXcgc2hvcnRbMTI4XTsKLSAgICAgICAgICAgIG1WdHhTaXplID0gdnR4U2l6ZTsKLSAgICAgICAgICAgIG1GbGFncyA9IGZsYWdzOwotCi0gICAgICAgICAgICBpZiAodnR4U2l6ZSA8IDIgfHwgdnR4U2l6ZSA+IDMpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJWZXJ0ZXggc2l6ZSBvdXQgb2YgcmFuZ2UuIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgbWFrZVNwYWNlKGludCBjb3VudCkgewotICAgICAgICAgICAgaWYgKChtVnR4Q291bnQgKyBjb3VudCkgPj0gbVZ0eERhdGEubGVuZ3RoKSB7Ci0gICAgICAgICAgICAgICAgZmxvYXQgdFtdID0gbmV3IGZsb2F0W21WdHhEYXRhLmxlbmd0aCAqIDJdOwotICAgICAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkobVZ0eERhdGEsIDAsIHQsIDAsIG1WdHhEYXRhLmxlbmd0aCk7Ci0gICAgICAgICAgICAgICAgbVZ0eERhdGEgPSB0OwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIGxhdGNoKCkgewotICAgICAgICAgICAgaWYgKChtRmxhZ3MgJiBDT0xPUikgIT0gMCkgewotICAgICAgICAgICAgICAgIG1ha2VTcGFjZSg0KTsKLSAgICAgICAgICAgICAgICBtVnR4RGF0YVttVnR4Q291bnQrK10gPSBtUjsKLSAgICAgICAgICAgICAgICBtVnR4RGF0YVttVnR4Q291bnQrK10gPSBtRzsKLSAgICAgICAgICAgICAgICBtVnR4RGF0YVttVnR4Q291bnQrK10gPSBtQjsKLSAgICAgICAgICAgICAgICBtVnR4RGF0YVttVnR4Q291bnQrK10gPSBtQTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICgobUZsYWdzICYgVEVYVFVSRV8wKSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgbWFrZVNwYWNlKDIpOwotICAgICAgICAgICAgICAgIG1WdHhEYXRhW21WdHhDb3VudCsrXSA9IG1TMDsKLSAgICAgICAgICAgICAgICBtVnR4RGF0YVttVnR4Q291bnQrK10gPSBtVDA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoKG1GbGFncyAmIE5PUk1BTCkgIT0gMCkgewotICAgICAgICAgICAgICAgIG1ha2VTcGFjZSgzKTsKLSAgICAgICAgICAgICAgICBtVnR4RGF0YVttVnR4Q291bnQrK10gPSBtTlg7Ci0gICAgICAgICAgICAgICAgbVZ0eERhdGFbbVZ0eENvdW50KytdID0gbU5ZOwotICAgICAgICAgICAgICAgIG1WdHhEYXRhW21WdHhDb3VudCsrXSA9IG1OWjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIGFkZFZlcnRleChmbG9hdCB4LCBmbG9hdCB5KSB7Ci0gICAgICAgICAgICBpZiAobVZ0eFNpemUgIT0gMikgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oImFkZCBtaXN0bWF0Y2ggd2l0aCBkZWNsYXJlZCBjb21wb25lbnRzLiIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbWFrZVNwYWNlKDIpOwotICAgICAgICAgICAgbVZ0eERhdGFbbVZ0eENvdW50KytdID0geDsKLSAgICAgICAgICAgIG1WdHhEYXRhW21WdHhDb3VudCsrXSA9IHk7Ci0gICAgICAgICAgICBsYXRjaCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgYWRkVmVydGV4KGZsb2F0IHgsIGZsb2F0IHksIGZsb2F0IHopIHsKLSAgICAgICAgICAgIGlmIChtVnR4U2l6ZSAhPSAzKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiYWRkIG1pc3RtYXRjaCB3aXRoIGRlY2xhcmVkIGNvbXBvbmVudHMuIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtYWtlU3BhY2UoMyk7Ci0gICAgICAgICAgICBtVnR4RGF0YVttVnR4Q291bnQrK10gPSB4OwotICAgICAgICAgICAgbVZ0eERhdGFbbVZ0eENvdW50KytdID0geTsKLSAgICAgICAgICAgIG1WdHhEYXRhW21WdHhDb3VudCsrXSA9IHo7Ci0gICAgICAgICAgICBsYXRjaCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgc2V0VGV4dHVyZShmbG9hdCBzLCBmbG9hdCB0KSB7Ci0gICAgICAgICAgICBpZiAoKG1GbGFncyAmIFRFWFRVUkVfMCkgPT0gMCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oImFkZCBtaXN0bWF0Y2ggd2l0aCBkZWNsYXJlZCBjb21wb25lbnRzLiIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbVMwID0gczsKLSAgICAgICAgICAgIG1UMCA9IHQ7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBzZXROb3JtYWwoZmxvYXQgeCwgZmxvYXQgeSwgZmxvYXQgeikgewotICAgICAgICAgICAgaWYgKChtRmxhZ3MgJiBOT1JNQUwpID09IDApIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJhZGQgbWlzdG1hdGNoIHdpdGggZGVjbGFyZWQgY29tcG9uZW50cy4iKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1OWCA9IHg7Ci0gICAgICAgICAgICBtTlkgPSB5OwotICAgICAgICAgICAgbU5aID0gejsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldENvbG9yKGZsb2F0IHIsIGZsb2F0IGcsIGZsb2F0IGIsIGZsb2F0IGEpIHsKLSAgICAgICAgICAgIGlmICgobUZsYWdzICYgQ09MT1IpID09IDApIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJhZGQgbWlzdG1hdGNoIHdpdGggZGVjbGFyZWQgY29tcG9uZW50cy4iKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1SID0gcjsKLSAgICAgICAgICAgIG1HID0gZzsKLSAgICAgICAgICAgIG1CID0gYjsKLSAgICAgICAgICAgIG1BID0gYTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIGFkZFRyaWFuZ2xlKGludCBpZHgxLCBpbnQgaWR4MiwgaW50IGlkeDMpIHsKLSAgICAgICAgICAgIGlmKChpZHgxID49IG1WdHhDb3VudCkgfHwgKGlkeDEgPCAwKSB8fAotICAgICAgICAgICAgICAgKGlkeDIgPj0gbVZ0eENvdW50KSB8fCAoaWR4MiA8IDApIHx8Ci0gICAgICAgICAgICAgICAoaWR4MyA+PSBtVnR4Q291bnQpIHx8IChpZHgzIDwgMCkpIHsKLSAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkluZGV4IHByb3ZpZGVkIGdyZWF0ZXIgdGhhbiB2ZXJ0ZXggY291bnQuIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoKG1JbmRleENvdW50ICsgMykgPj0gbUluZGV4RGF0YS5sZW5ndGgpIHsKLSAgICAgICAgICAgICAgICBzaG9ydCB0W10gPSBuZXcgc2hvcnRbbUluZGV4RGF0YS5sZW5ndGggKiAyXTsKLSAgICAgICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KG1JbmRleERhdGEsIDAsIHQsIDAsIG1JbmRleERhdGEubGVuZ3RoKTsKLSAgICAgICAgICAgICAgICBtSW5kZXhEYXRhID0gdDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1JbmRleERhdGFbbUluZGV4Q291bnQrK10gPSAoc2hvcnQpaWR4MTsKLSAgICAgICAgICAgIG1JbmRleERhdGFbbUluZGV4Q291bnQrK10gPSAoc2hvcnQpaWR4MjsKLSAgICAgICAgICAgIG1JbmRleERhdGFbbUluZGV4Q291bnQrK10gPSAoc2hvcnQpaWR4MzsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBTaW1wbGVNZXNoIGNyZWF0ZSgpIHsKLSAgICAgICAgICAgIEVsZW1lbnQuQnVpbGRlciBiID0gbmV3IEVsZW1lbnQuQnVpbGRlcihtUlMpOwotICAgICAgICAgICAgaW50IGZsb2F0Q291bnQgPSBtVnR4U2l6ZTsKLSAgICAgICAgICAgIGIuYWRkKEVsZW1lbnQuY3JlYXRlQXR0cmliKG1SUywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVsZW1lbnQuRGF0YVR5cGUuRkxPQVRfMzIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFbGVtZW50LkRhdGFLaW5kLlBPU0lUSU9OLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVZ0eFNpemUpLCAicG9zaXRpb24iKTsKLSAgICAgICAgICAgIGlmICgobUZsYWdzICYgQ09MT1IpICE9IDApIHsKLSAgICAgICAgICAgICAgICBmbG9hdENvdW50ICs9IDQ7Ci0gICAgICAgICAgICAgICAgYi5hZGQoRWxlbWVudC5jcmVhdGVBdHRyaWIobVJTLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVsZW1lbnQuRGF0YVR5cGUuRkxPQVRfMzIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRWxlbWVudC5EYXRhS2luZC5DT0xPUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0KSwgImNvbG9yIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoKG1GbGFncyAmIFRFWFRVUkVfMCkgIT0gMCkgewotICAgICAgICAgICAgICAgIGZsb2F0Q291bnQgKz0gMjsKLSAgICAgICAgICAgICAgICBiLmFkZChFbGVtZW50LmNyZWF0ZUF0dHJpYihtUlMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRWxlbWVudC5EYXRhVHlwZS5GTE9BVF8zMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFbGVtZW50LkRhdGFLaW5kLlRFWFRVUkUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMiksICJ0ZXh0dXJlIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoKG1GbGFncyAmIE5PUk1BTCkgIT0gMCkgewotICAgICAgICAgICAgICAgIGZsb2F0Q291bnQgKz0gMzsKLSAgICAgICAgICAgICAgICBiLmFkZChFbGVtZW50LmNyZWF0ZUF0dHJpYihtUlMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRWxlbWVudC5EYXRhVHlwZS5GTE9BVF8zMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFbGVtZW50LkRhdGFLaW5kLk5PUk1BTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzKSwgIm5vcm1hbCIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbUVsZW1lbnQgPSBiLmNyZWF0ZSgpOwotCi0gICAgICAgICAgICBCdWlsZGVyIHNtYiA9IG5ldyBCdWlsZGVyKG1SUyk7Ci0gICAgICAgICAgICBzbWIuYWRkVmVydGV4VHlwZShtRWxlbWVudCwgbVZ0eENvdW50IC8gZmxvYXRDb3VudCk7Ci0gICAgICAgICAgICBzbWIuc2V0SW5kZXhUeXBlKEVsZW1lbnQuY3JlYXRlSW5kZXgobVJTKSwgbUluZGV4Q291bnQpOwotICAgICAgICAgICAgc21iLnNldFByaW1pdGl2ZShQcmltaXRpdmUuVFJJQU5HTEUpOwotICAgICAgICAgICAgU2ltcGxlTWVzaCBzbSA9IHNtYi5jcmVhdGUoKTsKLQotICAgICAgICAgICAgQWxsb2NhdGlvbiB2ZXJ0ZXhBbGxvYyA9IHNtLmNyZWF0ZVZlcnRleEFsbG9jYXRpb24oMCk7Ci0gICAgICAgICAgICBBbGxvY2F0aW9uIGluZGV4QWxsb2MgPSBzbS5jcmVhdGVJbmRleEFsbG9jYXRpb24oKTsKLSAgICAgICAgICAgIHNtLmJpbmRWZXJ0ZXhBbGxvY2F0aW9uKHZlcnRleEFsbG9jLCAwKTsKLSAgICAgICAgICAgIHNtLmJpbmRJbmRleEFsbG9jYXRpb24oaW5kZXhBbGxvYyk7Ci0KLSAgICAgICAgICAgIHZlcnRleEFsbG9jLmRhdGEobVZ0eERhdGEpOwotICAgICAgICAgICAgdmVydGV4QWxsb2MudXBsb2FkVG9CdWZmZXJPYmplY3QoKTsKLQotICAgICAgICAgICAgaW5kZXhBbGxvYy5kYXRhKG1JbmRleERhdGEpOwotICAgICAgICAgICAgaW5kZXhBbGxvYy51cGxvYWRUb0J1ZmZlck9iamVjdCgpOwotCi0gICAgICAgICAgICByZXR1cm4gc207Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KZGlmZiAtLWdpdCBhL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvVHlwZS5qYXZhIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9UeXBlLmphdmEKaW5kZXggNjJkMzg2Ny4uMGIzZGI2OSAxMDA2NDQKLS0tIGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9UeXBlLmphdmEKKysrIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9UeXBlLmphdmEKQEAgLTE2LDcgKzE2LDkgQEAKIAogcGFja2FnZSBhbmRyb2lkLnJlbmRlcnNjcmlwdDsKIAorCiBpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuRmllbGQ7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKIAogLyoqCiAgKiBAaGlkZQpAQCAtMzEsNyArMzMsNiBAQAogICAgIGludCBtRWxlbWVudENvdW50OwogICAgIEVsZW1lbnQgbUVsZW1lbnQ7CiAKLSAgICBwcml2YXRlIGludCBtTmF0aXZlQ2FjaGU7CiAgICAgQ2xhc3MgbUphdmFDbGFzczsKIAogICAgIHB1YmxpYyBFbGVtZW50IGdldEVsZW1lbnQoKSB7CkBAIC05NSw2MSArOTYsMzcgQEAKIAogCiAgICAgVHlwZShpbnQgaWQsIFJlbmRlclNjcmlwdCBycykgewotICAgICAgICBzdXBlcihycyk7Ci0gICAgICAgIG1JRCA9IGlkOwotICAgICAgICBtTmF0aXZlQ2FjaGUgPSAwOworICAgICAgICBzdXBlcihpZCwgcnMpOwogICAgIH0KIAogICAgIHByb3RlY3RlZCB2b2lkIGZpbmFsaXplKCkgdGhyb3dzIFRocm93YWJsZSB7Ci0gICAgICAgIGlmKG1OYXRpdmVDYWNoZSAhPSAwKSB7Ci0gICAgICAgICAgICBtUlMublR5cGVGaW5hbERlc3Ryb3kodGhpcyk7Ci0gICAgICAgICAgICBtTmF0aXZlQ2FjaGUgPSAwOwotICAgICAgICB9CiAgICAgICAgIHN1cGVyLmZpbmFsaXplKCk7CiAgICAgfQogCi0gICAgcHVibGljIHN0YXRpYyBUeXBlIGNyZWF0ZUZyb21DbGFzcyhSZW5kZXJTY3JpcHQgcnMsIENsYXNzIGMsIGludCBzaXplKSB7Ci0gICAgICAgIEVsZW1lbnQgZSA9IEVsZW1lbnQuY3JlYXRlRnJvbUNsYXNzKHJzLCBjKTsKLSAgICAgICAgQnVpbGRlciBiID0gbmV3IEJ1aWxkZXIocnMsIGUpOwotICAgICAgICBiLmFkZChEaW1lbnNpb24uWCwgc2l6ZSk7Ci0gICAgICAgIFR5cGUgdCA9IGIuY3JlYXRlKCk7Ci0gICAgICAgIGUuZGVzdHJveSgpOworICAgIEBPdmVycmlkZQorICAgIHZvaWQgdXBkYXRlRnJvbU5hdGl2ZSgpIHsKKyAgICAgICAgLy8gV2UgaGF2ZSA2IGludGVnZXIgdG8gb2J0YWluIG1EaW1YOyBtRGltWTsgbURpbVo7CisgICAgICAgIC8vIG1EaW1MT0Q7IG1EaW1GYWNlczsgbUVsZW1lbnQ7CisgICAgICAgIGludFtdIGRhdGFCdWZmZXIgPSBuZXcgaW50WzZdOworICAgICAgICBtUlMublR5cGVHZXROYXRpdmVEYXRhKG1JRCwgZGF0YUJ1ZmZlcik7CiAKLSAgICAgICAgLy8gbmF0aXZlIGZpZWxkcwotICAgICAgICB7Ci0gICAgICAgICAgICBGaWVsZFtdIGZpZWxkcyA9IGMuZ2V0RmllbGRzKCk7Ci0gICAgICAgICAgICBpbnRbXSBhclR5cGVzID0gbmV3IGludFtmaWVsZHMubGVuZ3RoXTsKLSAgICAgICAgICAgIGludFtdIGFyQml0cyA9IG5ldyBpbnRbZmllbGRzLmxlbmd0aF07CisgICAgICAgIG1EaW1YID0gZGF0YUJ1ZmZlclswXTsKKyAgICAgICAgbURpbVkgPSBkYXRhQnVmZmVyWzFdOworICAgICAgICBtRGltWiA9IGRhdGFCdWZmZXJbMl07CisgICAgICAgIG1EaW1MT0QgPSBkYXRhQnVmZmVyWzNdID09IDEgPyB0cnVlIDogZmFsc2U7CisgICAgICAgIG1EaW1GYWNlcyA9IGRhdGFCdWZmZXJbNF0gPT0gMSA/IHRydWUgOiBmYWxzZTsKIAotICAgICAgICAgICAgZm9yKGludCBjdD0wOyBjdCA8IGZpZWxkcy5sZW5ndGg7IGN0KyspIHsKLSAgICAgICAgICAgICAgICBGaWVsZCBmID0gZmllbGRzW2N0XTsKLSAgICAgICAgICAgICAgICBDbGFzcyBmYyA9IGYuZ2V0VHlwZSgpOwotICAgICAgICAgICAgICAgIGlmKGZjID09IGludC5jbGFzcykgewotICAgICAgICAgICAgICAgICAgICBhclR5cGVzW2N0XSA9IEVsZW1lbnQuRGF0YVR5cGUuU0lHTkVEXzMyLm1JRDsKLSAgICAgICAgICAgICAgICAgICAgYXJCaXRzW2N0XSA9IDMyOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZihmYyA9PSBzaG9ydC5jbGFzcykgewotICAgICAgICAgICAgICAgICAgICBhclR5cGVzW2N0XSA9IEVsZW1lbnQuRGF0YVR5cGUuU0lHTkVEXzE2Lm1JRDsKLSAgICAgICAgICAgICAgICAgICAgYXJCaXRzW2N0XSA9IDE2OwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZihmYyA9PSBieXRlLmNsYXNzKSB7Ci0gICAgICAgICAgICAgICAgICAgIGFyVHlwZXNbY3RdID0gRWxlbWVudC5EYXRhVHlwZS5TSUdORURfOC5tSUQ7Ci0gICAgICAgICAgICAgICAgICAgIGFyQml0c1tjdF0gPSA4OwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZihmYyA9PSBmbG9hdC5jbGFzcykgewotICAgICAgICAgICAgICAgICAgICBhclR5cGVzW2N0XSA9IEVsZW1lbnQuRGF0YVR5cGUuRkxPQVRfMzIubUlEOwotICAgICAgICAgICAgICAgICAgICBhckJpdHNbY3RdID0gMzI7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVW5rb3duIGZpZWxkIHR5cGUiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBycy5uVHlwZVNldHVwRmllbGRzKHQsIGFyVHlwZXMsIGFyQml0cywgZmllbGRzKTsKKyAgICAgICAgaW50IGVsZW1lbnRJRCA9IGRhdGFCdWZmZXJbNV07CisgICAgICAgIGlmKGVsZW1lbnRJRCAhPSAwKSB7CisgICAgICAgICAgICBtRWxlbWVudCA9IG5ldyBFbGVtZW50KGVsZW1lbnRJRCwgbVJTKTsKKyAgICAgICAgICAgIG1FbGVtZW50LnVwZGF0ZUZyb21OYXRpdmUoKTsKICAgICAgICAgfQotICAgICAgICB0Lm1KYXZhQ2xhc3MgPSBjOwotICAgICAgICByZXR1cm4gdDsKKyAgICAgICAgY2FsY0VsZW1lbnRDb3VudCgpOwogICAgIH0KIAogICAgIHB1YmxpYyBzdGF0aWMgVHlwZSBjcmVhdGVGcm9tQ2xhc3MoUmVuZGVyU2NyaXB0IHJzLCBDbGFzcyBjLCBpbnQgc2l6ZSwgU3RyaW5nIHNjcmlwdE5hbWUpIHsKLSAgICAgICAgVHlwZSB0ID0gY3JlYXRlRnJvbUNsYXNzKHJzLCBjLCBzaXplKTsKLSAgICAgICAgdC5zZXROYW1lKHNjcmlwdE5hbWUpOwotICAgICAgICByZXR1cm4gdDsKKyAgICAgICAgYW5kcm9pZC51dGlsLkxvZy5lKCJSZW5kZXJTY3JpcHQiLCAiQ2FsbGluZyBkZXByaWNhdGVkIGNyZWF0ZUZyb21DbGFzcyIpOworICAgICAgICByZXR1cm4gbnVsbDsKICAgICB9CiAKIApkaWZmIC0tZ2l0IGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9WZWN0b3IyZi5qYXZhIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9WZWN0b3IyZi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NjdkNTdmYS4uMDAwMDAwMAotLS0gYS9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L1ZlY3RvcjJmLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBhbmRyb2lkLnJlbmRlcnNjcmlwdDsKLQotaW1wb3J0IGphdmEubGFuZy5NYXRoOwotaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7Ci0KLQotLyoqCi0gKiBAaGlkZQotICoKLSAqKi8KLXB1YmxpYyBjbGFzcyBWZWN0b3IyZiB7Ci0gICAgcHVibGljIFZlY3RvcjJmKCkgewotICAgIH0KLQotICAgIHB1YmxpYyBmbG9hdCB4OwotICAgIHB1YmxpYyBmbG9hdCB5OwotfQotCi0KLQotCmRpZmYgLS1naXQgYS9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L1ZlY3RvcjNmLmphdmEgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L1ZlY3RvcjNmLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYyODQyZjMuLjAwMDAwMDAKLS0tIGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9WZWN0b3IzZi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgYW5kcm9pZC5yZW5kZXJzY3JpcHQ7Ci0KLWltcG9ydCBqYXZhLmxhbmcuTWF0aDsKLWltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwotCi0KLS8qKgotICogQGhpZGUKLSAqCi0gKiovCi1wdWJsaWMgY2xhc3MgVmVjdG9yM2YgewotICAgIHB1YmxpYyBWZWN0b3IzZigpIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgZmxvYXQgeDsKLSAgICBwdWJsaWMgZmxvYXQgeTsKLSAgICBwdWJsaWMgZmxvYXQgejsKLX0KLQotCi0KLQpkaWZmIC0tZ2l0IGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9WZWN0b3I0Zi5qYXZhIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9WZWN0b3I0Zi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYWJkOTU5Li4wMDAwMDAwCi0tLSBhL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvVmVjdG9yNGYuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGFuZHJvaWQucmVuZGVyc2NyaXB0OwotCi1pbXBvcnQgamF2YS5sYW5nLk1hdGg7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKLQotCi0vKioKLSAqIEBoaWRlCi0gKgotICoqLwotcHVibGljIGNsYXNzIFZlY3RvcjRmIHsKLSAgICBwdWJsaWMgVmVjdG9yNGYoKSB7Ci0gICAgfQotCi0gICAgcHVibGljIGZsb2F0IHg7Ci0gICAgcHVibGljIGZsb2F0IHk7Ci0gICAgcHVibGljIGZsb2F0IHo7Ci0gICAgcHVibGljIGZsb2F0IHc7Ci19Ci0KLQotCmRpZmYgLS1naXQgYS9ncmFwaGljcy9qbmkvQW5kcm9pZC5tayBiL2dyYXBoaWNzL2puaS9BbmRyb2lkLm1rCmluZGV4IDg0NzZiZTEuLjRjNGExMjggMTAwNjQ0Ci0tLSBhL2dyYXBoaWNzL2puaS9BbmRyb2lkLm1rCisrKyBiL2dyYXBoaWNzL2puaS9BbmRyb2lkLm1rCkBAIC0xMywxNCArMTMsMTMgQEAKIAogTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBcCiAgICAgICAgIGxpYmFuZHJvaWRfcnVudGltZSBcCi0gICAgICAgIGxpYmFjYyBcCiAgICAgICAgIGxpYm5hdGl2ZWhlbHBlciBcCiAgICAgICAgIGxpYlJTIFwKICAgICAgICAgbGliY3V0aWxzIFwKICAgICAgICAgbGlic2tpYSBcCiAgICAgICAgIGxpYnV0aWxzIFwKICAgICAgICAgbGlidWkgXAotICAgICAgICBsaWJzdXJmYWNlZmxpbmdlcl9jbGllbnQgCisgICAgICAgIGxpYnN1cmZhY2VmbGluZ2VyX2NsaWVudAogCiBMT0NBTF9TVEFUSUNfTElCUkFSSUVTIDo9CiAKZGlmZiAtLWdpdCBhL2dyYXBoaWNzL2puaS9hbmRyb2lkX3JlbmRlcnNjcmlwdF9SZW5kZXJTY3JpcHQuY3BwIGIvZ3JhcGhpY3Mvam5pL2FuZHJvaWRfcmVuZGVyc2NyaXB0X1JlbmRlclNjcmlwdC5jcHAKaW5kZXggNDVjYzcyZS4uZjM4NjUzNyAxMDA2NDQKLS0tIGEvZ3JhcGhpY3Mvam5pL2FuZHJvaWRfcmVuZGVyc2NyaXB0X1JlbmRlclNjcmlwdC5jcHAKKysrIGIvZ3JhcGhpY3Mvam5pL2FuZHJvaWRfcmVuZGVyc2NyaXB0X1JlbmRlclNjcmlwdC5jcHAKQEAgLTM3LDYgKzM3LDcgQEAKICNpbmNsdWRlICJqbmkuaCIKICNpbmNsdWRlICJKTklIZWxwLmgiCiAjaW5jbHVkZSAiYW5kcm9pZF9ydW50aW1lL0FuZHJvaWRSdW50aW1lLmgiCisjaW5jbHVkZSAiYW5kcm9pZF9ydW50aW1lL2FuZHJvaWRfdmlld19TdXJmYWNlLmgiCiAKICNpbmNsdWRlIDxSZW5kZXJTY3JpcHQuaD4KICNpbmNsdWRlIDxSZW5kZXJTY3JpcHRFbnYuaD4KQEAgLTY5LDkgKzcwLDYgQEAKIAogICAgIGpjbGFzcyBiaXRtYXBDbGFzcyA9IF9lbnYtPkZpbmRDbGFzcygiYW5kcm9pZC9ncmFwaGljcy9CaXRtYXAiKTsKICAgICBnTmF0aXZlQml0bWFwSUQgPSBfZW52LT5HZXRGaWVsZElEKGJpdG1hcENsYXNzLCAibU5hdGl2ZUJpdG1hcCIsICJJIik7Ci0KLSAgICBqY2xhc3MgdHlwZUNsYXNzID0gX2Vudi0+RmluZENsYXNzKCJhbmRyb2lkL3JlbmRlcnNjcmlwdC9UeXBlIik7Ci0gICAgZ1R5cGVOYXRpdmVDYWNoZSA9IF9lbnYtPkdldEZpZWxkSUQodHlwZUNsYXNzLCAibU5hdGl2ZUNhY2hlIiwgIkkiKTsKIH0KIAogc3RhdGljIHZvaWQgbkluaXRFbGVtZW50cyhKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIGppbnQgYTgsIGppbnQgcmdiYTQ0NDQsIGppbnQgcmdiYTg4ODgsIGppbnQgcmdiNTY1KQpAQCAtODUsNDEgKzgzLDQzIEBACiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAogc3RhdGljIHZvaWQKLW5Bc3NpZ25OYW1lKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgamludCBvYmosIGpieXRlQXJyYXkgc3RyKQorbkNvbnRleHRGaW5pc2goSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBSc0NvbnRleHQgY29uKQogewotICAgIFJzQ29udGV4dCBjb24gPSAoUnNDb250ZXh0KShfZW52LT5HZXRJbnRGaWVsZChfdGhpcywgZ0NvbnRleHRJZCkpOwotICAgIExPR19BUEkoIm5Bc3NpZ25OYW1lLCBjb24oJXApLCBvYmooJXApIiwgY29uLCAodm9pZCAqKW9iaik7CisgICAgTE9HX0FQSSgibkNvbnRleHRGaW5pc2gsIGNvbiglcCkiLCBjb24pOworICAgIHJzQ29udGV4dEZpbmlzaChjb24pOworfQogCitzdGF0aWMgdm9pZAorbkFzc2lnbk5hbWUoSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBSc0NvbnRleHQgY29uLCBqaW50IG9iaiwgamJ5dGVBcnJheSBzdHIpCit7CisgICAgTE9HX0FQSSgibkFzc2lnbk5hbWUsIGNvbiglcCksIG9iaiglcCkiLCBjb24sICh2b2lkICopb2JqKTsKICAgICBqaW50IGxlbiA9IF9lbnYtPkdldEFycmF5TGVuZ3RoKHN0cik7CiAgICAgamJ5dGUgKiBjcHRyID0gKGpieXRlICopIF9lbnYtPkdldFByaW1pdGl2ZUFycmF5Q3JpdGljYWwoc3RyLCAwKTsKICAgICByc0Fzc2lnbk5hbWUoY29uLCAodm9pZCAqKW9iaiwgKGNvbnN0IGNoYXIgKiljcHRyLCBsZW4pOwogICAgIF9lbnYtPlJlbGVhc2VQcmltaXRpdmVBcnJheUNyaXRpY2FsKHN0ciwgY3B0ciwgSk5JX0FCT1JUKTsKIH0KIAotc3RhdGljIHZvaWQKLW5PYmpEZXN0cm95KEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgamludCBvYmopCitzdGF0aWMganN0cmluZworbkdldE5hbWUoSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBSc0NvbnRleHQgY29uLCBqaW50IG9iaikKIHsKLSAgICBSc0NvbnRleHQgY29uID0gKFJzQ29udGV4dCkoX2Vudi0+R2V0SW50RmllbGQoX3RoaXMsIGdDb250ZXh0SWQpKTsKKyAgICBMT0dfQVBJKCJuR2V0TmFtZSwgY29uKCVwKSwgb2JqKCVwKSIsIGNvbiwgKHZvaWQgKilvYmopOworICAgIGNvbnN0IGNoYXIgKm5hbWUgPSBOVUxMOworICAgIHJzR2V0TmFtZShjb24sICh2b2lkICopb2JqLCAmbmFtZSk7CisgICAgcmV0dXJuIF9lbnYtPk5ld1N0cmluZ1VURihuYW1lKTsKK30KKworc3RhdGljIHZvaWQKK25PYmpEZXN0cm95KEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgUnNDb250ZXh0IGNvbiwgamludCBvYmopCit7CiAgICAgTE9HX0FQSSgibk9iakRlc3Ryb3ksIGNvbiglcCkgb2JqKCVwKSIsIGNvbiwgKHZvaWQgKilvYmopOwogICAgIHJzT2JqRGVzdHJveShjb24sICh2b2lkICopb2JqKTsKIH0KIAotc3RhdGljIHZvaWQKLW5PYmpEZXN0cm95T09CKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgamludCBvYmopCi17Ci0gICAgLy8gVGhpcyBmdW5jdGlvbiBvbmx5IGRpZmZlcnMgZnJvbSBuT2JqRGVzdHJveSBpbiB0aGF0IGl0IGNhbGxzIHRoZQotICAgIC8vIHNwZWNpYWwgT3V0IE9mIEJhbmQgdmVyc2lvbiBvZiBPYmpEZXN0cm95IHdoaWNoIGlzIHRocmVhZCBzYWZlLgotICAgIFJzQ29udGV4dCBjb24gPSAoUnNDb250ZXh0KShfZW52LT5HZXRJbnRGaWVsZChfdGhpcywgZ0NvbnRleHRJZCkpOwotICAgIExPR19BUEkoIm5PYmpEZXN0cm95T09CLCBjb24oJXApIG9iaiglcCkiLCBjb24sICh2b2lkICopb2JqKTsKLSAgICByc09iakRlc3Ryb3lPT0IoY29uLCAodm9pZCAqKW9iaik7Ci19CiAKIHN0YXRpYyBqaW50Ci1uRmlsZU9wZW4oSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBqYnl0ZUFycmF5IHN0cikKK25GaWxlT3BlbihKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIFJzQ29udGV4dCBjb24sIGpieXRlQXJyYXkgc3RyKQogewotICAgIFJzQ29udGV4dCBjb24gPSAoUnNDb250ZXh0KShfZW52LT5HZXRJbnRGaWVsZChfdGhpcywgZ0NvbnRleHRJZCkpOwogICAgIExPR19BUEkoIm5GaWxlT3BlbiwgY29uKCVwKSIsIGNvbik7Ci0KICAgICBqaW50IGxlbiA9IF9lbnYtPkdldEFycmF5TGVuZ3RoKHN0cik7CiAgICAgamJ5dGUgKiBjcHRyID0gKGpieXRlICopIF9lbnYtPkdldFByaW1pdGl2ZUFycmF5Q3JpdGljYWwoc3RyLCAwKTsKICAgICBqaW50IHJldCA9IChqaW50KXJzRmlsZU9wZW4oY29uLCAoY29uc3QgY2hhciAqKWNwdHIsIGxlbik7CkBAIC0xNjUsOSArMTY1LDggQEAKIH0KIAogc3RhdGljIHZvaWQKLW5Db250ZXh0U2V0UHJpb3JpdHkoSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBqaW50IHApCituQ29udGV4dFNldFByaW9yaXR5KEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgUnNDb250ZXh0IGNvbiwgamludCBwKQogewotICAgIFJzQ29udGV4dCBjb24gPSAoUnNDb250ZXh0KShfZW52LT5HZXRJbnRGaWVsZChfdGhpcywgZ0NvbnRleHRJZCkpOwogICAgIExPR19BUEkoIkNvbnRleHRTZXRQcmlvcml0eSwgY29uKCVwKSwgcHJpb3JpdHkoJWkpIiwgY29uLCBwKTsKICAgICByc0NvbnRleHRTZXRQcmlvcml0eShjb24sIHApOwogfQpAQCAtMTc1LDEwMSArMTc0LDkyIEBACiAKIAogc3RhdGljIHZvaWQKLW5Db250ZXh0U2V0U3VyZmFjZShKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIGppbnQgd2lkdGgsIGppbnQgaGVpZ2h0LCBqb2JqZWN0IHduZCkKK25Db250ZXh0U2V0U3VyZmFjZShKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIFJzQ29udGV4dCBjb24sIGppbnQgd2lkdGgsIGppbnQgaGVpZ2h0LCBqb2JqZWN0IHduZCkKIHsKLSAgICBSc0NvbnRleHQgY29uID0gKFJzQ29udGV4dCkoX2Vudi0+R2V0SW50RmllbGQoX3RoaXMsIGdDb250ZXh0SWQpKTsKICAgICBMT0dfQVBJKCJuQ29udGV4dFNldFN1cmZhY2UsIGNvbiglcCksIHdpZHRoKCVpKSwgaGVpZ2h0KCVpKSwgc3VyZmFjZSglcCkiLCBjb24sIHdpZHRoLCBoZWlnaHQsIChTdXJmYWNlICopd25kKTsKIAogICAgIFN1cmZhY2UgKiB3aW5kb3cgPSBOVUxMOwogICAgIGlmICh3bmQgPT0gTlVMTCkgewogCiAgICAgfSBlbHNlIHsKLSAgICAgICAgamNsYXNzIHN1cmZhY2VfY2xhc3MgPSBfZW52LT5GaW5kQ2xhc3MoImFuZHJvaWQvdmlldy9TdXJmYWNlIik7Ci0gICAgICAgIGpmaWVsZElEIHN1cmZhY2VGaWVsZElEID0gX2Vudi0+R2V0RmllbGRJRChzdXJmYWNlX2NsYXNzLCBBTkRST0lEX1ZJRVdfU1VSRkFDRV9KTklfSUQsICJJIik7Ci0gICAgICAgIHdpbmRvdyA9IChTdXJmYWNlKilfZW52LT5HZXRJbnRGaWVsZCh3bmQsIHN1cmZhY2VGaWVsZElEKTsKKyAgICAgICAgd2luZG93ID0gKFN1cmZhY2UqKSBhbmRyb2lkX1N1cmZhY2VfZ2V0TmF0aXZlV2luZG93KF9lbnYsIHduZCkuZ2V0KCk7CiAgICAgfQogCiAgICAgcnNDb250ZXh0U2V0U3VyZmFjZShjb24sIHdpZHRoLCBoZWlnaHQsIHdpbmRvdyk7CiB9CiAKIHN0YXRpYyB2b2lkCi1uQ29udGV4dERlc3Ryb3koSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBqaW50IGNvbikKK25Db250ZXh0RGVzdHJveShKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIFJzQ29udGV4dCBjb24pCiB7Ci0gICAgTE9HX0FQSSgibkNvbnRleHREZXN0cm95LCBjb24oJXApIiwgKFJzQ29udGV4dCljb24pOwotICAgIHJzQ29udGV4dERlc3Ryb3koKFJzQ29udGV4dCljb24pOworICAgIExPR19BUEkoIm5Db250ZXh0RGVzdHJveSwgY29uKCVwKSIsIGNvbik7CisgICAgcnNDb250ZXh0RGVzdHJveShjb24pOwogfQogCiBzdGF0aWMgdm9pZAotbkNvbnRleHREdW1wKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgamludCBiaXRzKQorbkNvbnRleHREdW1wKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgUnNDb250ZXh0IGNvbiwgamludCBiaXRzKQogewotICAgIFJzQ29udGV4dCBjb24gPSAoUnNDb250ZXh0KShfZW52LT5HZXRJbnRGaWVsZChfdGhpcywgZ0NvbnRleHRJZCkpOwogICAgIExPR19BUEkoIm5Db250ZXh0RHVtcCwgY29uKCVwKSAgYml0cyglaSkiLCAoUnNDb250ZXh0KWNvbiwgYml0cyk7CiAgICAgcnNDb250ZXh0RHVtcCgoUnNDb250ZXh0KWNvbiwgYml0cyk7CiB9CiAKIHN0YXRpYyB2b2lkCi1uQ29udGV4dFBhdXNlKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcykKK25Db250ZXh0UGF1c2UoSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBSc0NvbnRleHQgY29uKQogewotICAgIFJzQ29udGV4dCBjb24gPSAoUnNDb250ZXh0KShfZW52LT5HZXRJbnRGaWVsZChfdGhpcywgZ0NvbnRleHRJZCkpOwogICAgIExPR19BUEkoIm5Db250ZXh0UGF1c2UsIGNvbiglcCkiLCBjb24pOwogICAgIHJzQ29udGV4dFBhdXNlKGNvbik7CiB9CiAKIHN0YXRpYyB2b2lkCi1uQ29udGV4dFJlc3VtZShKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMpCituQ29udGV4dFJlc3VtZShKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIFJzQ29udGV4dCBjb24pCiB7Ci0gICAgUnNDb250ZXh0IGNvbiA9IChSc0NvbnRleHQpKF9lbnYtPkdldEludEZpZWxkKF90aGlzLCBnQ29udGV4dElkKSk7CiAgICAgTE9HX0FQSSgibkNvbnRleHRSZXN1bWUsIGNvbiglcCkiLCBjb24pOwogICAgIHJzQ29udGV4dFJlc3VtZShjb24pOwogfQogCiBzdGF0aWMgamludAotbkNvbnRleHRHZXRNZXNzYWdlKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgamludEFycmF5IGRhdGEsIGpib29sZWFuIHdhaXQpCituQ29udGV4dEdldE1lc3NhZ2UoSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBSc0NvbnRleHQgY29uLCBqaW50QXJyYXkgZGF0YSwgamJvb2xlYW4gd2FpdCkKIHsKLSAgICBSc0NvbnRleHQgY29uID0gKFJzQ29udGV4dCkoX2Vudi0+R2V0SW50RmllbGQoX3RoaXMsIGdDb250ZXh0SWQpKTsKICAgICBqaW50IGxlbiA9IF9lbnYtPkdldEFycmF5TGVuZ3RoKGRhdGEpOwogICAgIExPR19BUEkoIm5Db250ZXh0R2V0TWVzc2FnZSwgY29uKCVwKSwgbGVuKCVpKSIsIGNvbiwgbGVuKTsKICAgICBqaW50ICpwdHIgPSBfZW52LT5HZXRJbnRBcnJheUVsZW1lbnRzKGRhdGEsIE5VTEwpOwogICAgIHNpemVfdCByZWNlaXZlTGVuOwogICAgIGludCBpZCA9IHJzQ29udGV4dEdldE1lc3NhZ2UoY29uLCBwdHIsICZyZWNlaXZlTGVuLCBsZW4gKiA0LCB3YWl0KTsKICAgICBpZiAoIWlkICYmIHJlY2VpdmVMZW4pIHsKLSAgICAgICAgTE9HRSgibWVzc2FnZSByZWNlaXZlIGJ1ZmZlciB0b28gc21hbGwuICAlaSIsIHJlY2VpdmVMZW4pOworICAgICAgICBMT0dWKCJtZXNzYWdlIHJlY2VpdmUgYnVmZmVyIHRvbyBzbWFsbC4gICVpIiwgcmVjZWl2ZUxlbik7CisgICAgICAgICpwdHIgPSAoamludClyZWNlaXZlTGVuOwogICAgIH0KICAgICBfZW52LT5SZWxlYXNlSW50QXJyYXlFbGVtZW50cyhkYXRhLCBwdHIsIDApOwogICAgIHJldHVybiBpZDsKIH0KIAotc3RhdGljIHZvaWQgbkNvbnRleHRJbml0VG9DbGllbnQoSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzKQorc3RhdGljIHZvaWQgbkNvbnRleHRJbml0VG9DbGllbnQoSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBSc0NvbnRleHQgY29uKQogewotICAgIFJzQ29udGV4dCBjb24gPSAoUnNDb250ZXh0KShfZW52LT5HZXRJbnRGaWVsZChfdGhpcywgZ0NvbnRleHRJZCkpOwogICAgIExPR19BUEkoIm5Db250ZXh0SW5pdFRvQ2xpZW50LCBjb24oJXApIiwgY29uKTsKICAgICByc0NvbnRleHRJbml0VG9DbGllbnQoY29uKTsKIH0KIAotc3RhdGljIHZvaWQgbkNvbnRleHREZWluaXRUb0NsaWVudChKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMpCitzdGF0aWMgdm9pZCBuQ29udGV4dERlaW5pdFRvQ2xpZW50KEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgUnNDb250ZXh0IGNvbikKIHsKLSAgICBSc0NvbnRleHQgY29uID0gKFJzQ29udGV4dCkoX2Vudi0+R2V0SW50RmllbGQoX3RoaXMsIGdDb250ZXh0SWQpKTsKICAgICBMT0dfQVBJKCJuQ29udGV4dERlaW5pdFRvQ2xpZW50LCBjb24oJXApIiwgY29uKTsKICAgICByc0NvbnRleHREZWluaXRUb0NsaWVudChjb24pOwogfQogCiAKIHN0YXRpYyBqaW50Ci1uRWxlbWVudENyZWF0ZShKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIGppbnQgdHlwZSwgamludCBraW5kLCBqYm9vbGVhbiBub3JtLCBqaW50IHNpemUpCituRWxlbWVudENyZWF0ZShKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIFJzQ29udGV4dCBjb24sIGppbnQgdHlwZSwgamludCBraW5kLCBqYm9vbGVhbiBub3JtLCBqaW50IHNpemUpCiB7Ci0gICAgUnNDb250ZXh0IGNvbiA9IChSc0NvbnRleHQpKF9lbnYtPkdldEludEZpZWxkKF90aGlzLCBnQ29udGV4dElkKSk7CiAgICAgTE9HX0FQSSgibkVsZW1lbnRDcmVhdGUsIGNvbiglcCksIHR5cGUoJWkpLCBraW5kKCVpKSwgbm9ybSglaSksIHNpemUoJWkpIiwgY29uLCB0eXBlLCBraW5kLCBub3JtLCBzaXplKTsKICAgICByZXR1cm4gKGppbnQpcnNFbGVtZW50Q3JlYXRlKGNvbiwgKFJzRGF0YVR5cGUpdHlwZSwgKFJzRGF0YUtpbmQpa2luZCwgbm9ybSwgc2l6ZSk7CiB9CiAKIHN0YXRpYyBqaW50Ci1uRWxlbWVudENyZWF0ZTIoSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBqaW50QXJyYXkgX2lkcywgam9iamVjdEFycmF5IF9uYW1lcykKK25FbGVtZW50Q3JlYXRlMihKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIFJzQ29udGV4dCBjb24sIGppbnRBcnJheSBfaWRzLCBqb2JqZWN0QXJyYXkgX25hbWVzLCBqaW50QXJyYXkgX2FycmF5U2l6ZXMpCiB7CiAgICAgaW50IGZpZWxkQ291bnQgPSBfZW52LT5HZXRBcnJheUxlbmd0aChfaWRzKTsKLSAgICBSc0NvbnRleHQgY29uID0gKFJzQ29udGV4dCkoX2Vudi0+R2V0SW50RmllbGQoX3RoaXMsIGdDb250ZXh0SWQpKTsKICAgICBMT0dfQVBJKCJuRWxlbWVudENyZWF0ZTIsIGNvbiglcCkiLCBjb24pOwogCiAgICAgamludCAqaWRzID0gX2Vudi0+R2V0SW50QXJyYXlFbGVtZW50cyhfaWRzLCBOVUxMKTsKKyAgICBqaW50ICphcnJheVNpemVzID0gX2Vudi0+R2V0SW50QXJyYXlFbGVtZW50cyhfYXJyYXlTaXplcywgTlVMTCk7CiAgICAgY29uc3QgY2hhciAqKiBuYW1lQXJyYXkgPSAoY29uc3QgY2hhciAqKiljYWxsb2MoZmllbGRDb3VudCwgc2l6ZW9mKGNoYXIgKikpOwogICAgIHNpemVfdCogc2l6ZUFycmF5ID0gKHNpemVfdCopY2FsbG9jKGZpZWxkQ291bnQsIHNpemVvZihzaXplX3QpKTsKIApAQCAtMjc4LDE4MyArMjY4LDExNiBAQAogICAgICAgICBuYW1lQXJyYXlbY3RdID0gX2Vudi0+R2V0U3RyaW5nVVRGQ2hhcnMocywgTlVMTCk7CiAgICAgICAgIHNpemVBcnJheVtjdF0gPSBfZW52LT5HZXRTdHJpbmdVVEZMZW5ndGgocyk7CiAgICAgfQotICAgIGppbnQgaWQgPSAoamludClyc0VsZW1lbnRDcmVhdGUyKGNvbiwgZmllbGRDb3VudCwgKFJzRWxlbWVudCAqKWlkcywgbmFtZUFycmF5LCBzaXplQXJyYXkpOworICAgIGppbnQgaWQgPSAoamludClyc0VsZW1lbnRDcmVhdGUyKGNvbiwgZmllbGRDb3VudCwgKFJzRWxlbWVudCAqKWlkcywgbmFtZUFycmF5LCBzaXplQXJyYXksIChjb25zdCB1aW50MzJfdCAqKWFycmF5U2l6ZXMpOwogICAgIGZvciAoaW50IGN0PTA7IGN0IDwgZmllbGRDb3VudDsgY3QrKykgewogICAgICAgICBqc3RyaW5nIHMgPSAoanN0cmluZylfZW52LT5HZXRPYmplY3RBcnJheUVsZW1lbnQoX25hbWVzLCBjdCk7CiAgICAgICAgIF9lbnYtPlJlbGVhc2VTdHJpbmdVVEZDaGFycyhzLCBuYW1lQXJyYXlbY3RdKTsKICAgICB9CiAgICAgX2Vudi0+UmVsZWFzZUludEFycmF5RWxlbWVudHMoX2lkcywgaWRzLCBKTklfQUJPUlQpOworICAgIF9lbnYtPlJlbGVhc2VJbnRBcnJheUVsZW1lbnRzKF9hcnJheVNpemVzLCBhcnJheVNpemVzLCBKTklfQUJPUlQpOwogICAgIGZyZWUobmFtZUFycmF5KTsKICAgICBmcmVlKHNpemVBcnJheSk7CiAgICAgcmV0dXJuIChqaW50KWlkOwogfQogCitzdGF0aWMgdm9pZAorbkVsZW1lbnRHZXROYXRpdmVEYXRhKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgUnNDb250ZXh0IGNvbiwgamludCBpZCwgamludEFycmF5IF9lbGVtZW50RGF0YSkKK3sKKyAgICBpbnQgZGF0YVNpemUgPSBfZW52LT5HZXRBcnJheUxlbmd0aChfZWxlbWVudERhdGEpOworICAgIExPR19BUEkoIm5FbGVtZW50R2V0TmF0aXZlRGF0YSwgY29uKCVwKSIsIGNvbik7CisKKyAgICAvLyB3ZSB3aWxsIHBhY2sgbVR5cGU7IG1LaW5kOyBtTm9ybWFsaXplZDsgbVZlY3RvclNpemU7IE51bVN1YkVsZW1lbnRzCisgICAgYXNzZXJ0KGRhdGFTaXplID09IDUpOworCisgICAgdWludDMyX3QgZWxlbWVudERhdGFbNV07CisgICAgcnNFbGVtZW50R2V0TmF0aXZlRGF0YShjb24sIChSc0VsZW1lbnQpaWQsIGVsZW1lbnREYXRhLCBkYXRhU2l6ZSk7CisKKyAgICBmb3IoamludCBpID0gMDsgaSA8IGRhdGFTaXplOyBpICsrKSB7CisgICAgICAgIF9lbnYtPlNldEludEFycmF5UmVnaW9uKF9lbGVtZW50RGF0YSwgaSwgMSwgKGNvbnN0IGppbnQqKSZlbGVtZW50RGF0YVtpXSk7CisgICAgfQorfQorCisKK3N0YXRpYyB2b2lkCituRWxlbWVudEdldFN1YkVsZW1lbnRzKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgUnNDb250ZXh0IGNvbiwgamludCBpZCwgamludEFycmF5IF9JRHMsIGpvYmplY3RBcnJheSBfbmFtZXMpCit7CisgICAgaW50IGRhdGFTaXplID0gX2Vudi0+R2V0QXJyYXlMZW5ndGgoX0lEcyk7CisgICAgTE9HX0FQSSgibkVsZW1lbnRHZXRTdWJFbGVtZW50cywgY29uKCVwKSIsIGNvbik7CisKKyAgICB1aW50MzJfdCAqaWRzID0gKHVpbnQzMl90ICopbWFsbG9jKCh1aW50MzJfdClkYXRhU2l6ZSAqIHNpemVvZih1aW50MzJfdCkpOworICAgIGNvbnN0IGNoYXIgKipuYW1lcyA9IChjb25zdCBjaGFyICoqKW1hbGxvYygodWludDMyX3QpZGF0YVNpemUgKiBzaXplb2YoY29uc3QgY2hhciAqKSk7CisKKyAgICByc0VsZW1lbnRHZXRTdWJFbGVtZW50cyhjb24sIChSc0VsZW1lbnQpaWQsIGlkcywgbmFtZXMsICh1aW50MzJfdClkYXRhU2l6ZSk7CisKKyAgICBmb3IoamludCBpID0gMDsgaSA8IGRhdGFTaXplOyBpICsrKSB7CisgICAgICAgIF9lbnYtPlNldE9iamVjdEFycmF5RWxlbWVudChfbmFtZXMsIGksIF9lbnYtPk5ld1N0cmluZ1VURihuYW1lc1tpXSkpOworICAgICAgICBfZW52LT5TZXRJbnRBcnJheVJlZ2lvbihfSURzLCBpLCAxLCAoY29uc3QgamludCopJmlkc1tpXSk7CisgICAgfQorCisgICAgZnJlZShpZHMpOworICAgIGZyZWUobmFtZXMpOworfQorCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCiBzdGF0aWMgdm9pZAotblR5cGVCZWdpbihKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIGppbnQgZUlEKQorblR5cGVCZWdpbihKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIFJzQ29udGV4dCBjb24sIGppbnQgZUlEKQogewotICAgIFJzQ29udGV4dCBjb24gPSAoUnNDb250ZXh0KShfZW52LT5HZXRJbnRGaWVsZChfdGhpcywgZ0NvbnRleHRJZCkpOwogICAgIExPR19BUEkoIm5UeXBlQmVnaW4sIGNvbiglcCkgZSglcCkiLCBjb24sIChSc0VsZW1lbnQpZUlEKTsKICAgICByc1R5cGVCZWdpbihjb24sIChSc0VsZW1lbnQpZUlEKTsKIH0KIAogc3RhdGljIHZvaWQKLW5UeXBlQWRkKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgamludCBkaW0sIGppbnQgdmFsKQorblR5cGVBZGQoSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBSc0NvbnRleHQgY29uLCBqaW50IGRpbSwgamludCB2YWwpCiB7Ci0gICAgUnNDb250ZXh0IGNvbiA9IChSc0NvbnRleHQpKF9lbnYtPkdldEludEZpZWxkKF90aGlzLCBnQ29udGV4dElkKSk7CiAgICAgTE9HX0FQSSgiblR5cGVBZGQsIGNvbiglcCkgZGltKCVpKSwgdmFsKCVpKSIsIGNvbiwgZGltLCB2YWwpOwogICAgIHJzVHlwZUFkZChjb24sIChSc0RpbWVuc2lvbilkaW0sIHZhbCk7CiB9CiAKIHN0YXRpYyBqaW50Ci1uVHlwZUNyZWF0ZShKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMpCituVHlwZUNyZWF0ZShKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIFJzQ29udGV4dCBjb24pCiB7Ci0gICAgUnNDb250ZXh0IGNvbiA9IChSc0NvbnRleHQpKF9lbnYtPkdldEludEZpZWxkKF90aGlzLCBnQ29udGV4dElkKSk7CiAgICAgTE9HX0FQSSgiblR5cGVDcmVhdGUsIGNvbiglcCkiLCBjb24pOwogICAgIHJldHVybiAoamludClyc1R5cGVDcmVhdGUoY29uKTsKIH0KIAotc3RhdGljIHZvaWQgKiBTRl9Mb2FkSW50KEpOSUVudiAqX2Vudiwgam9iamVjdCBfb2JqLCBqZmllbGRJRCBfZmllbGQsIHZvaWQgKmJ1ZmZlcikKLXsKLSAgICAoKGludDMyX3QgKilidWZmZXIpWzBdID0gX2Vudi0+R2V0SW50RmllbGQoX29iaiwgX2ZpZWxkKTsKLSAgICByZXR1cm4gKCh1aW50OF90ICopYnVmZmVyKSArIDQ7Ci19Ci0KLXN0YXRpYyB2b2lkICogU0ZfTG9hZFNob3J0KEpOSUVudiAqX2Vudiwgam9iamVjdCBfb2JqLCBqZmllbGRJRCBfZmllbGQsIHZvaWQgKmJ1ZmZlcikKLXsKLSAgICAoKGludDE2X3QgKilidWZmZXIpWzBdID0gX2Vudi0+R2V0U2hvcnRGaWVsZChfb2JqLCBfZmllbGQpOwotICAgIHJldHVybiAoKHVpbnQ4X3QgKilidWZmZXIpICsgMjsKLX0KLQotc3RhdGljIHZvaWQgKiBTRl9Mb2FkQnl0ZShKTklFbnYgKl9lbnYsIGpvYmplY3QgX29iaiwgamZpZWxkSUQgX2ZpZWxkLCB2b2lkICpidWZmZXIpCi17Ci0gICAgKChpbnQ4X3QgKilidWZmZXIpWzBdID0gX2Vudi0+R2V0Qnl0ZUZpZWxkKF9vYmosIF9maWVsZCk7Ci0gICAgcmV0dXJuICgodWludDhfdCAqKWJ1ZmZlcikgKyAxOwotfQotCi1zdGF0aWMgdm9pZCAqIFNGX0xvYWRGbG9hdChKTklFbnYgKl9lbnYsIGpvYmplY3QgX29iaiwgamZpZWxkSUQgX2ZpZWxkLCB2b2lkICpidWZmZXIpCi17Ci0gICAgKChmbG9hdCAqKWJ1ZmZlcilbMF0gPSBfZW52LT5HZXRGbG9hdEZpZWxkKF9vYmosIF9maWVsZCk7Ci0gICAgcmV0dXJuICgodWludDhfdCAqKWJ1ZmZlcikgKyA0OwotfQotCi1zdGF0aWMgdm9pZCAqIFNGX1NhdmVJbnQoSk5JRW52ICpfZW52LCBqb2JqZWN0IF9vYmosIGpmaWVsZElEIF9maWVsZCwgdm9pZCAqYnVmZmVyKQotewotICAgIF9lbnYtPlNldEludEZpZWxkKF9vYmosIF9maWVsZCwgKChpbnQzMl90ICopYnVmZmVyKVswXSk7Ci0gICAgcmV0dXJuICgodWludDhfdCAqKWJ1ZmZlcikgKyA0OwotfQotCi1zdGF0aWMgdm9pZCAqIFNGX1NhdmVTaG9ydChKTklFbnYgKl9lbnYsIGpvYmplY3QgX29iaiwgamZpZWxkSUQgX2ZpZWxkLCB2b2lkICpidWZmZXIpCi17Ci0gICAgX2Vudi0+U2V0U2hvcnRGaWVsZChfb2JqLCBfZmllbGQsICgoaW50MTZfdCAqKWJ1ZmZlcilbMF0pOwotICAgIHJldHVybiAoKHVpbnQ4X3QgKilidWZmZXIpICsgMjsKLX0KLQotc3RhdGljIHZvaWQgKiBTRl9TYXZlQnl0ZShKTklFbnYgKl9lbnYsIGpvYmplY3QgX29iaiwgamZpZWxkSUQgX2ZpZWxkLCB2b2lkICpidWZmZXIpCi17Ci0gICAgX2Vudi0+U2V0Qnl0ZUZpZWxkKF9vYmosIF9maWVsZCwgKChpbnQ4X3QgKilidWZmZXIpWzBdKTsKLSAgICByZXR1cm4gKCh1aW50OF90ICopYnVmZmVyKSArIDE7Ci19Ci0KLXN0YXRpYyB2b2lkICogU0ZfU2F2ZUZsb2F0KEpOSUVudiAqX2Vudiwgam9iamVjdCBfb2JqLCBqZmllbGRJRCBfZmllbGQsIHZvaWQgKmJ1ZmZlcikKLXsKLSAgICBfZW52LT5TZXRGbG9hdEZpZWxkKF9vYmosIF9maWVsZCwgKChmbG9hdCAqKWJ1ZmZlcilbMF0pOwotICAgIHJldHVybiAoKHVpbnQ4X3QgKilidWZmZXIpICsgNDsKLX0KLQotc3RydWN0IFR5cGVGaWVsZENhY2hlIHsKLSAgICBqZmllbGRJRCBmaWVsZDsKLSAgICBpbnQgYml0czsKLSAgICB2b2lkICogKCpwdHIpKEpOSUVudiAqLCBqb2JqZWN0LCBqZmllbGRJRCwgdm9pZCAqYnVmZmVyKTsKLSAgICB2b2lkICogKCpyZWFkUHRyKShKTklFbnYgKiwgam9iamVjdCwgamZpZWxkSUQsIHZvaWQgKmJ1ZmZlcik7Ci19OwotCi1zdHJ1Y3QgVHlwZUNhY2hlIHsKLSAgICBpbnQgZmllbGRDb3VudDsKLSAgICBpbnQgc2l6ZTsKLSAgICBUeXBlRmllbGRDYWNoZSBmaWVsZHNbMV07Ci19OwotCi0vL3siblR5cGVGaW5hbERlc3Ryb3kiLCAgICAgICAgICAgICAgIihMYW5kcm9pZC9yZW5kZXJzY3JpcHQvVHlwZTspViIsICAgICAgICh2b2lkKiluVHlwZUZpbmFsRGVzdHJveSB9LAogc3RhdGljIHZvaWQKLW5UeXBlRmluYWxEZXN0cm95KEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgam9iamVjdCBfdHlwZSkKK25UeXBlR2V0TmF0aXZlRGF0YShKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIFJzQ29udGV4dCBjb24sIGppbnQgaWQsIGppbnRBcnJheSBfdHlwZURhdGEpCiB7Ci0gICAgVHlwZUNhY2hlICp0YyA9IChUeXBlQ2FjaGUgKilfZW52LT5HZXRJbnRGaWVsZChfdHlwZSwgZ1R5cGVOYXRpdmVDYWNoZSk7Ci0gICAgZnJlZSh0Yyk7Ci19CisgICAgLy8gV2UgYXJlIHBhY2tpbmcgNiBpdGVtczogbURpbVg7IG1EaW1ZOyBtRGltWjsKKyAgICAvLyBtRGltTE9EOyBtRGltRmFjZXM7IG1FbGVtZW50OyBpbnRvIHR5cGVEYXRhCisgICAgaW50IGVsZW1lbnRDb3VudCA9IF9lbnYtPkdldEFycmF5TGVuZ3RoKF90eXBlRGF0YSk7CiAKLS8vIG5hdGl2ZSB2b2lkIG5UeXBlU2V0dXBGaWVsZHMoVHlwZSB0LCBpbnRbXSB0eXBlcywgaW50W10gYml0cywgRmllbGRbXSBJRHMpOwotc3RhdGljIHZvaWQKLW5UeXBlU2V0dXBGaWVsZHMoSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBqb2JqZWN0IF90eXBlLCBqaW50QXJyYXkgX3R5cGVzLCBqaW50QXJyYXkgX2JpdHMsIGpvYmplY3RBcnJheSBfSURzKQotewotICAgIGludCBmaWVsZENvdW50ID0gX2Vudi0+R2V0QXJyYXlMZW5ndGgoX3R5cGVzKTsKLSAgICBzaXplX3Qgc3RydWN0U2l6ZSA9IHNpemVvZihUeXBlQ2FjaGUpICsgKHNpemVvZihUeXBlRmllbGRDYWNoZSkgKiAoZmllbGRDb3VudC0xKSk7Ci0gICAgVHlwZUNhY2hlICp0YyA9IChUeXBlQ2FjaGUgKiltYWxsb2Moc3RydWN0U2l6ZSk7Ci0gICAgbWVtc2V0KHRjLCAwLCBzdHJ1Y3RTaXplKTsKKyAgICBhc3NlcnQoZWxlbWVudENvdW50ID09IDYpOworICAgIExPR19BUEkoIm5UeXBlQ3JlYXRlLCBjb24oJXApIiwgY29uKTsKIAotICAgIFR5cGVGaWVsZENhY2hlICp0ZmMgPSAmdGMtPmZpZWxkc1swXTsKLSAgICB0Yy0+ZmllbGRDb3VudCA9IGZpZWxkQ291bnQ7Ci0gICAgX2Vudi0+U2V0SW50RmllbGQoX3R5cGUsIGdUeXBlTmF0aXZlQ2FjaGUsIChqaW50KXRjKTsKKyAgICB1aW50MzJfdCB0eXBlRGF0YVs2XTsKKyAgICByc1R5cGVHZXROYXRpdmVEYXRhKGNvbiwgKFJzVHlwZSlpZCwgdHlwZURhdGEsIDYpOwogCi0gICAgamludCAqZlR5cGUgPSBfZW52LT5HZXRJbnRBcnJheUVsZW1lbnRzKF90eXBlcywgTlVMTCk7Ci0gICAgamludCAqZkJpdHMgPSBfZW52LT5HZXRJbnRBcnJheUVsZW1lbnRzKF9iaXRzLCBOVUxMKTsKLSAgICBmb3IgKGludCBjdD0wOyBjdCA8IGZpZWxkQ291bnQ7IGN0KyspIHsKLSAgICAgICAgam9iamVjdCBmaWVsZCA9IF9lbnYtPkdldE9iamVjdEFycmF5RWxlbWVudChfSURzLCBjdCk7Ci0gICAgICAgIHRmY1tjdF0uZmllbGQgPSBfZW52LT5Gcm9tUmVmbGVjdGVkRmllbGQoZmllbGQpOwotICAgICAgICB0ZmNbY3RdLmJpdHMgPSBmQml0c1tjdF07Ci0KLSAgICAgICAgc3dpdGNoKGZUeXBlW2N0XSkgewotICAgICAgICBjYXNlIFJTX1RZUEVfRkxPQVRfMzI6Ci0gICAgICAgICAgICB0ZmNbY3RdLnB0ciA9IFNGX0xvYWRGbG9hdDsKLSAgICAgICAgICAgIHRmY1tjdF0ucmVhZFB0ciA9IFNGX1NhdmVGbG9hdDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFJTX1RZUEVfVU5TSUdORURfMzI6Ci0gICAgICAgIGNhc2UgUlNfVFlQRV9TSUdORURfMzI6Ci0gICAgICAgICAgICB0ZmNbY3RdLnB0ciA9IFNGX0xvYWRJbnQ7Ci0gICAgICAgICAgICB0ZmNbY3RdLnJlYWRQdHIgPSBTRl9TYXZlSW50OwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgUlNfVFlQRV9VTlNJR05FRF8xNjoKLSAgICAgICAgY2FzZSBSU19UWVBFX1NJR05FRF8xNjoKLSAgICAgICAgICAgIHRmY1tjdF0ucHRyID0gU0ZfTG9hZFNob3J0OwotICAgICAgICAgICAgdGZjW2N0XS5yZWFkUHRyID0gU0ZfU2F2ZVNob3J0OwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgUlNfVFlQRV9VTlNJR05FRF84OgotICAgICAgICBjYXNlIFJTX1RZUEVfU0lHTkVEXzg6Ci0gICAgICAgICAgICB0ZmNbY3RdLnB0ciA9IFNGX0xvYWRCeXRlOwotICAgICAgICAgICAgdGZjW2N0XS5yZWFkUHRyID0gU0ZfU2F2ZUJ5dGU7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICB0Yy0+c2l6ZSArPSA0OworICAgIGZvcihqaW50IGkgPSAwOyBpIDwgZWxlbWVudENvdW50OyBpICsrKSB7CisgICAgICAgIF9lbnYtPlNldEludEFycmF5UmVnaW9uKF90eXBlRGF0YSwgaSwgMSwgKGNvbnN0IGppbnQqKSZ0eXBlRGF0YVtpXSk7CiAgICAgfQotCi0gICAgX2Vudi0+UmVsZWFzZUludEFycmF5RWxlbWVudHMoX3R5cGVzLCBmVHlwZSwgSk5JX0FCT1JUKTsKLSAgICBfZW52LT5SZWxlYXNlSW50QXJyYXlFbGVtZW50cyhfYml0cywgZkJpdHMsIEpOSV9BQk9SVCk7CiB9CiAKLQogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAogc3RhdGljIGppbnQKLW5BbGxvY2F0aW9uQ3JlYXRlVHlwZWQoSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBqaW50IGUpCituQWxsb2NhdGlvbkNyZWF0ZVR5cGVkKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgUnNDb250ZXh0IGNvbiwgamludCBlKQogewotICAgIFJzQ29udGV4dCBjb24gPSAoUnNDb250ZXh0KShfZW52LT5HZXRJbnRGaWVsZChfdGhpcywgZ0NvbnRleHRJZCkpOwogICAgIExPR19BUEkoIm5BbGxvY2F0aW9uQ3JlYXRlVHlwZWQsIGNvbiglcCksIGUoJXApIiwgY29uLCAoUnNFbGVtZW50KWUpOwogICAgIHJldHVybiAoamludCkgcnNBbGxvY2F0aW9uQ3JlYXRlVHlwZWQoY29uLCAoUnNFbGVtZW50KWUpOwogfQogCiBzdGF0aWMgdm9pZAotbkFsbG9jYXRpb25VcGxvYWRUb1RleHR1cmUoSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBqaW50IGEsIGpib29sZWFuIGdlbk1pcCwgamludCBtaXApCituQWxsb2NhdGlvblVwbG9hZFRvVGV4dHVyZShKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIFJzQ29udGV4dCBjb24sIGppbnQgYSwgamJvb2xlYW4gZ2VuTWlwLCBqaW50IG1pcCkKIHsKLSAgICBSc0NvbnRleHQgY29uID0gKFJzQ29udGV4dCkoX2Vudi0+R2V0SW50RmllbGQoX3RoaXMsIGdDb250ZXh0SWQpKTsKICAgICBMT0dfQVBJKCJuQWxsb2NhdGlvblVwbG9hZFRvVGV4dHVyZSwgY29uKCVwKSwgYSglcCksIGdlbk1pcCglaSksIG1pcCglaSkiLCBjb24sIChSc0FsbG9jYXRpb24pYSwgZ2VuTWlwLCBtaXApOwogICAgIHJzQWxsb2NhdGlvblVwbG9hZFRvVGV4dHVyZShjb24sIChSc0FsbG9jYXRpb24pYSwgZ2VuTWlwLCBtaXApOwogfQogCiBzdGF0aWMgdm9pZAotbkFsbG9jYXRpb25VcGxvYWRUb0J1ZmZlck9iamVjdChKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIGppbnQgYSkKK25BbGxvY2F0aW9uVXBsb2FkVG9CdWZmZXJPYmplY3QoSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBSc0NvbnRleHQgY29uLCBqaW50IGEpCiB7Ci0gICAgUnNDb250ZXh0IGNvbiA9IChSc0NvbnRleHQpKF9lbnYtPkdldEludEZpZWxkKF90aGlzLCBnQ29udGV4dElkKSk7CiAgICAgTE9HX0FQSSgibkFsbG9jYXRpb25VcGxvYWRUb0J1ZmZlck9iamVjdCwgY29uKCVwKSwgYSglcCkiLCBjb24sIChSc0FsbG9jYXRpb24pYSk7CiAgICAgcnNBbGxvY2F0aW9uVXBsb2FkVG9CdWZmZXJPYmplY3QoY29uLCAoUnNBbGxvY2F0aW9uKWEpOwogfQpAQCAtNDgwLDkgKzQwMyw4IEBACiB9CiAKIHN0YXRpYyBpbnQKLW5BbGxvY2F0aW9uQ3JlYXRlRnJvbUJpdG1hcChKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIGppbnQgZHN0Rm10LCBqYm9vbGVhbiBnZW5NaXBzLCBqb2JqZWN0IGpiaXRtYXApCituQWxsb2NhdGlvbkNyZWF0ZUZyb21CaXRtYXAoSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBSc0NvbnRleHQgY29uLCBqaW50IGRzdEZtdCwgamJvb2xlYW4gZ2VuTWlwcywgam9iamVjdCBqYml0bWFwKQogewotICAgIFJzQ29udGV4dCBjb24gPSAoUnNDb250ZXh0KShfZW52LT5HZXRJbnRGaWVsZChfdGhpcywgZ0NvbnRleHRJZCkpOwogICAgIFNrQml0bWFwIGNvbnN0ICogbmF0aXZlQml0bWFwID0KICAgICAgICAgICAgIChTa0JpdG1hcCBjb25zdCAqKV9lbnYtPkdldEludEZpZWxkKGpiaXRtYXAsIGdOYXRpdmVCaXRtYXBJRCk7CiAgICAgY29uc3QgU2tCaXRtYXAmIGJpdG1hcCgqbmF0aXZlQml0bWFwKTsKQEAgLTUwOCw5ICs0MzAsOCBAQAogfQogCiBzdGF0aWMgaW50Ci1uQWxsb2NhdGlvbkNyZWF0ZUJpdG1hcFJlZihKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIGppbnQgdHlwZSwgam9iamVjdCBqYml0bWFwKQorbkFsbG9jYXRpb25DcmVhdGVCaXRtYXBSZWYoSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBSc0NvbnRleHQgY29uLCBqaW50IHR5cGUsIGpvYmplY3QgamJpdG1hcCkKIHsKLSAgICBSc0NvbnRleHQgY29uID0gKFJzQ29udGV4dCkoX2Vudi0+R2V0SW50RmllbGQoX3RoaXMsIGdDb250ZXh0SWQpKTsKICAgICBTa0JpdG1hcCAqIG5hdGl2ZUJpdG1hcCA9CiAgICAgICAgICAgICAoU2tCaXRtYXAgKilfZW52LT5HZXRJbnRGaWVsZChqYml0bWFwLCBnTmF0aXZlQml0bWFwSUQpOwogCkBAIC01MjIsMTAgKzQ0Myw4IEBACiB9CiAKIHN0YXRpYyBpbnQKLW5BbGxvY2F0aW9uQ3JlYXRlRnJvbUFzc2V0U3RyZWFtKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgamludCBkc3RGbXQsIGpib29sZWFuIGdlbk1pcHMsIGppbnQgbmF0aXZlX2Fzc2V0KQorbkFsbG9jYXRpb25DcmVhdGVGcm9tQXNzZXRTdHJlYW0oSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBSc0NvbnRleHQgY29uLCBqaW50IGRzdEZtdCwgamJvb2xlYW4gZ2VuTWlwcywgamludCBuYXRpdmVfYXNzZXQpCiB7Ci0gICAgUnNDb250ZXh0IGNvbiA9IChSc0NvbnRleHQpKF9lbnYtPkdldEludEZpZWxkKF90aGlzLCBnQ29udGV4dElkKSk7Ci0KICAgICBBc3NldCogYXNzZXQgPSByZWludGVycHJldF9jYXN0PEFzc2V0Kj4obmF0aXZlX2Fzc2V0KTsKICAgICBTa0JpdG1hcCBiaXRtYXA7CiAgICAgU2tJbWFnZURlY29kZXI6OkRlY29kZU1lbW9yeShhc3NldC0+Z2V0QnVmZmVyKGZhbHNlKSwgYXNzZXQtPmdldExlbmd0aCgpLApAQCAtNTQ4LDkgKzQ2Nyw4IEBACiB9CiAKIHN0YXRpYyBpbnQKLW5BbGxvY2F0aW9uQ3JlYXRlRnJvbUJpdG1hcEJveGVkKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgamludCBkc3RGbXQsIGpib29sZWFuIGdlbk1pcHMsIGpvYmplY3QgamJpdG1hcCkKK25BbGxvY2F0aW9uQ3JlYXRlRnJvbUJpdG1hcEJveGVkKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgUnNDb250ZXh0IGNvbiwgamludCBkc3RGbXQsIGpib29sZWFuIGdlbk1pcHMsIGpvYmplY3QgamJpdG1hcCkKIHsKLSAgICBSc0NvbnRleHQgY29uID0gKFJzQ29udGV4dCkoX2Vudi0+R2V0SW50RmllbGQoX3RoaXMsIGdDb250ZXh0SWQpKTsKICAgICBTa0JpdG1hcCBjb25zdCAqIG5hdGl2ZUJpdG1hcCA9CiAgICAgICAgICAgICAoU2tCaXRtYXAgY29uc3QgKilfZW52LT5HZXRJbnRGaWVsZChqYml0bWFwLCBnTmF0aXZlQml0bWFwSUQpOwogICAgIGNvbnN0IFNrQml0bWFwJiBiaXRtYXAoKm5hdGl2ZUJpdG1hcCk7CkBAIC01NzIsOSArNDkwLDggQEAKIAogCiBzdGF0aWMgdm9pZAotbkFsbG9jYXRpb25TdWJEYXRhMURfaShKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIGppbnQgYWxsb2MsIGppbnQgb2Zmc2V0LCBqaW50IGNvdW50LCBqaW50QXJyYXkgZGF0YSwgaW50IHNpemVCeXRlcykKK25BbGxvY2F0aW9uU3ViRGF0YTFEX2koSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBSc0NvbnRleHQgY29uLCBqaW50IGFsbG9jLCBqaW50IG9mZnNldCwgamludCBjb3VudCwgamludEFycmF5IGRhdGEsIGludCBzaXplQnl0ZXMpCiB7Ci0gICAgUnNDb250ZXh0IGNvbiA9IChSc0NvbnRleHQpKF9lbnYtPkdldEludEZpZWxkKF90aGlzLCBnQ29udGV4dElkKSk7CiAgICAgamludCBsZW4gPSBfZW52LT5HZXRBcnJheUxlbmd0aChkYXRhKTsKICAgICBMT0dfQVBJKCJuQWxsb2NhdGlvbjFEU3ViRGF0YV9pLCBjb24oJXApLCBhZGFwdGVyKCVwKSwgb2Zmc2V0KCVpKSwgY291bnQoJWkpLCBsZW4oJWkpLCBzaXplQnl0ZXMoJWkpIiwgY29uLCAoUnNBbGxvY2F0aW9uKWFsbG9jLCBvZmZzZXQsIGNvdW50LCBsZW4sIHNpemVCeXRlcyk7CiAgICAgamludCAqcHRyID0gX2Vudi0+R2V0SW50QXJyYXlFbGVtZW50cyhkYXRhLCBOVUxMKTsKQEAgLTU4Myw5ICs1MDAsOCBAQAogfQogCiBzdGF0aWMgdm9pZAotbkFsbG9jYXRpb25TdWJEYXRhMURfcyhKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIGppbnQgYWxsb2MsIGppbnQgb2Zmc2V0LCBqaW50IGNvdW50LCBqc2hvcnRBcnJheSBkYXRhLCBpbnQgc2l6ZUJ5dGVzKQorbkFsbG9jYXRpb25TdWJEYXRhMURfcyhKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIFJzQ29udGV4dCBjb24sIGppbnQgYWxsb2MsIGppbnQgb2Zmc2V0LCBqaW50IGNvdW50LCBqc2hvcnRBcnJheSBkYXRhLCBpbnQgc2l6ZUJ5dGVzKQogewotICAgIFJzQ29udGV4dCBjb24gPSAoUnNDb250ZXh0KShfZW52LT5HZXRJbnRGaWVsZChfdGhpcywgZ0NvbnRleHRJZCkpOwogICAgIGppbnQgbGVuID0gX2Vudi0+R2V0QXJyYXlMZW5ndGgoZGF0YSk7CiAgICAgTE9HX0FQSSgibkFsbG9jYXRpb24xRFN1YkRhdGFfcywgY29uKCVwKSwgYWRhcHRlciglcCksIG9mZnNldCglaSksIGNvdW50KCVpKSwgbGVuKCVpKSwgc2l6ZUJ5dGVzKCVpKSIsIGNvbiwgKFJzQWxsb2NhdGlvbilhbGxvYywgb2Zmc2V0LCBjb3VudCwgbGVuLCBzaXplQnl0ZXMpOwogICAgIGpzaG9ydCAqcHRyID0gX2Vudi0+R2V0U2hvcnRBcnJheUVsZW1lbnRzKGRhdGEsIE5VTEwpOwpAQCAtNTk0LDkgKzUxMCw4IEBACiB9CiAKIHN0YXRpYyB2b2lkCi1uQWxsb2NhdGlvblN1YkRhdGExRF9iKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgamludCBhbGxvYywgamludCBvZmZzZXQsIGppbnQgY291bnQsIGpieXRlQXJyYXkgZGF0YSwgaW50IHNpemVCeXRlcykKK25BbGxvY2F0aW9uU3ViRGF0YTFEX2IoSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBSc0NvbnRleHQgY29uLCBqaW50IGFsbG9jLCBqaW50IG9mZnNldCwgamludCBjb3VudCwgamJ5dGVBcnJheSBkYXRhLCBpbnQgc2l6ZUJ5dGVzKQogewotICAgIFJzQ29udGV4dCBjb24gPSAoUnNDb250ZXh0KShfZW52LT5HZXRJbnRGaWVsZChfdGhpcywgZ0NvbnRleHRJZCkpOwogICAgIGppbnQgbGVuID0gX2Vudi0+R2V0QXJyYXlMZW5ndGgoZGF0YSk7CiAgICAgTE9HX0FQSSgibkFsbG9jYXRpb24xRFN1YkRhdGFfYiwgY29uKCVwKSwgYWRhcHRlciglcCksIG9mZnNldCglaSksIGNvdW50KCVpKSwgbGVuKCVpKSwgc2l6ZUJ5dGVzKCVpKSIsIGNvbiwgKFJzQWxsb2NhdGlvbilhbGxvYywgb2Zmc2V0LCBjb3VudCwgbGVuLCBzaXplQnl0ZXMpOwogICAgIGpieXRlICpwdHIgPSBfZW52LT5HZXRCeXRlQXJyYXlFbGVtZW50cyhkYXRhLCBOVUxMKTsKQEAgLTYwNSw5ICs1MjAsOCBAQAogfQogCiBzdGF0aWMgdm9pZAotbkFsbG9jYXRpb25TdWJEYXRhMURfZihKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIGppbnQgYWxsb2MsIGppbnQgb2Zmc2V0LCBqaW50IGNvdW50LCBqZmxvYXRBcnJheSBkYXRhLCBpbnQgc2l6ZUJ5dGVzKQorbkFsbG9jYXRpb25TdWJEYXRhMURfZihKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIFJzQ29udGV4dCBjb24sIGppbnQgYWxsb2MsIGppbnQgb2Zmc2V0LCBqaW50IGNvdW50LCBqZmxvYXRBcnJheSBkYXRhLCBpbnQgc2l6ZUJ5dGVzKQogewotICAgIFJzQ29udGV4dCBjb24gPSAoUnNDb250ZXh0KShfZW52LT5HZXRJbnRGaWVsZChfdGhpcywgZ0NvbnRleHRJZCkpOwogICAgIGppbnQgbGVuID0gX2Vudi0+R2V0QXJyYXlMZW5ndGgoZGF0YSk7CiAgICAgTE9HX0FQSSgibkFsbG9jYXRpb24xRFN1YkRhdGFfZiwgY29uKCVwKSwgYWRhcHRlciglcCksIG9mZnNldCglaSksIGNvdW50KCVpKSwgbGVuKCVpKSwgc2l6ZUJ5dGVzKCVpKSIsIGNvbiwgKFJzQWxsb2NhdGlvbilhbGxvYywgb2Zmc2V0LCBjb3VudCwgbGVuLCBzaXplQnl0ZXMpOwogICAgIGpmbG9hdCAqcHRyID0gX2Vudi0+R2V0RmxvYXRBcnJheUVsZW1lbnRzKGRhdGEsIE5VTEwpOwpAQCAtNjE2LDkgKzUzMCwxOSBAQAogfQogCiBzdGF0aWMgdm9pZAotbkFsbG9jYXRpb25TdWJEYXRhMkRfaShKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIGppbnQgYWxsb2MsIGppbnQgeG9mZiwgamludCB5b2ZmLCBqaW50IHcsIGppbnQgaCwgamludEFycmF5IGRhdGEsIGludCBzaXplQnl0ZXMpCisvLyAgICBuYXRpdmUgdm9pZCByc25BbGxvY2F0aW9uU3ViRWxlbWVudERhdGExRChpbnQgY29uLCBpbnQgaWQsIGludCB4b2ZmLCBpbnQgY29tcElkeCwgYnl0ZVtdIGQsIGludCBzaXplQnl0ZXMpOworbkFsbG9jYXRpb25TdWJFbGVtZW50RGF0YTFEKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgUnNDb250ZXh0IGNvbiwgamludCBhbGxvYywgamludCBvZmZzZXQsIGppbnQgY29tcElkeCwgamJ5dGVBcnJheSBkYXRhLCBpbnQgc2l6ZUJ5dGVzKQogewotICAgIFJzQ29udGV4dCBjb24gPSAoUnNDb250ZXh0KShfZW52LT5HZXRJbnRGaWVsZChfdGhpcywgZ0NvbnRleHRJZCkpOworICAgIGppbnQgbGVuID0gX2Vudi0+R2V0QXJyYXlMZW5ndGgoZGF0YSk7CisgICAgTE9HX0FQSSgibkFsbG9jYXRpb25TdWJFbGVtZW50RGF0YTFELCBjb24oJXApLCBhbGxvYyglcCksIG9mZnNldCglaSksIGNvbXAoJWkpLCBsZW4oJWkpLCBzaXplQnl0ZXMoJWkpIiwgY29uLCAoUnNBbGxvY2F0aW9uKWFsbG9jLCBvZmZzZXQsIGNvbXBJZHgsIGxlbiwgc2l6ZUJ5dGVzKTsKKyAgICBqYnl0ZSAqcHRyID0gX2Vudi0+R2V0Qnl0ZUFycmF5RWxlbWVudHMoZGF0YSwgTlVMTCk7CisgICAgcnNBbGxvY2F0aW9uMURTdWJFbGVtZW50RGF0YShjb24sIChSc0FsbG9jYXRpb24pYWxsb2MsIG9mZnNldCwgcHRyLCBjb21wSWR4LCBzaXplQnl0ZXMpOworICAgIF9lbnYtPlJlbGVhc2VCeXRlQXJyYXlFbGVtZW50cyhkYXRhLCBwdHIsIEpOSV9BQk9SVCk7Cit9CisKK3N0YXRpYyB2b2lkCituQWxsb2NhdGlvblN1YkRhdGEyRF9pKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgUnNDb250ZXh0IGNvbiwgamludCBhbGxvYywgamludCB4b2ZmLCBqaW50IHlvZmYsIGppbnQgdywgamludCBoLCBqaW50QXJyYXkgZGF0YSwgaW50IHNpemVCeXRlcykKK3sKICAgICBqaW50IGxlbiA9IF9lbnYtPkdldEFycmF5TGVuZ3RoKGRhdGEpOwogICAgIExPR19BUEkoIm5BbGxvY2F0aW9uMkRTdWJEYXRhX2ksIGNvbiglcCksIGFkYXB0ZXIoJXApLCB4b2ZmKCVpKSwgeW9mZiglaSksIHcoJWkpLCBoKCVpKSwgbGVuKCVpKSIsIGNvbiwgKFJzQWxsb2NhdGlvbilhbGxvYywgeG9mZiwgeW9mZiwgdywgaCwgbGVuKTsKICAgICBqaW50ICpwdHIgPSBfZW52LT5HZXRJbnRBcnJheUVsZW1lbnRzKGRhdGEsIE5VTEwpOwpAQCAtNjI3LDkgKzU1MSw4IEBACiB9CiAKIHN0YXRpYyB2b2lkCi1uQWxsb2NhdGlvblN1YkRhdGEyRF9mKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgamludCBhbGxvYywgamludCB4b2ZmLCBqaW50IHlvZmYsIGppbnQgdywgamludCBoLCBqZmxvYXRBcnJheSBkYXRhLCBpbnQgc2l6ZUJ5dGVzKQorbkFsbG9jYXRpb25TdWJEYXRhMkRfZihKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIFJzQ29udGV4dCBjb24sIGppbnQgYWxsb2MsIGppbnQgeG9mZiwgamludCB5b2ZmLCBqaW50IHcsIGppbnQgaCwgamZsb2F0QXJyYXkgZGF0YSwgaW50IHNpemVCeXRlcykKIHsKLSAgICBSc0NvbnRleHQgY29uID0gKFJzQ29udGV4dCkoX2Vudi0+R2V0SW50RmllbGQoX3RoaXMsIGdDb250ZXh0SWQpKTsKICAgICBqaW50IGxlbiA9IF9lbnYtPkdldEFycmF5TGVuZ3RoKGRhdGEpOwogICAgIExPR19BUEkoIm5BbGxvY2F0aW9uMkRTdWJEYXRhX2ksIGNvbiglcCksIGFkYXB0ZXIoJXApLCB4b2ZmKCVpKSwgeW9mZiglaSksIHcoJWkpLCBoKCVpKSwgbGVuKCVpKSIsIGNvbiwgKFJzQWxsb2NhdGlvbilhbGxvYywgeG9mZiwgeW9mZiwgdywgaCwgbGVuKTsKICAgICBqZmxvYXQgKnB0ciA9IF9lbnYtPkdldEZsb2F0QXJyYXlFbGVtZW50cyhkYXRhLCBOVUxMKTsKQEAgLTYzOCw5ICs1NjEsOCBAQAogfQogCiBzdGF0aWMgdm9pZAotbkFsbG9jYXRpb25SZWFkX2koSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBqaW50IGFsbG9jLCBqaW50QXJyYXkgZGF0YSkKK25BbGxvY2F0aW9uUmVhZF9pKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgUnNDb250ZXh0IGNvbiwgamludCBhbGxvYywgamludEFycmF5IGRhdGEpCiB7Ci0gICAgUnNDb250ZXh0IGNvbiA9IChSc0NvbnRleHQpKF9lbnYtPkdldEludEZpZWxkKF90aGlzLCBnQ29udGV4dElkKSk7CiAgICAgamludCBsZW4gPSBfZW52LT5HZXRBcnJheUxlbmd0aChkYXRhKTsKICAgICBMT0dfQVBJKCJuQWxsb2NhdGlvblJlYWRfaSwgY29uKCVwKSwgYWxsb2MoJXApLCBsZW4oJWkpIiwgY29uLCAoUnNBbGxvY2F0aW9uKWFsbG9jLCBsZW4pOwogICAgIGppbnQgKnB0ciA9IF9lbnYtPkdldEludEFycmF5RWxlbWVudHMoZGF0YSwgTlVMTCk7CkBAIC02NDksOSArNTcxLDggQEAKIH0KIAogc3RhdGljIHZvaWQKLW5BbGxvY2F0aW9uUmVhZF9mKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgamludCBhbGxvYywgamZsb2F0QXJyYXkgZGF0YSkKK25BbGxvY2F0aW9uUmVhZF9mKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgUnNDb250ZXh0IGNvbiwgamludCBhbGxvYywgamZsb2F0QXJyYXkgZGF0YSkKIHsKLSAgICBSc0NvbnRleHQgY29uID0gKFJzQ29udGV4dCkoX2Vudi0+R2V0SW50RmllbGQoX3RoaXMsIGdDb250ZXh0SWQpKTsKICAgICBqaW50IGxlbiA9IF9lbnYtPkdldEFycmF5TGVuZ3RoKGRhdGEpOwogICAgIExPR19BUEkoIm5BbGxvY2F0aW9uUmVhZF9mLCBjb24oJXApLCBhbGxvYyglcCksIGxlbiglaSkiLCBjb24sIChSc0FsbG9jYXRpb24pYWxsb2MsIGxlbik7CiAgICAgamZsb2F0ICpwdHIgPSBfZW52LT5HZXRGbG9hdEFycmF5RWxlbWVudHMoZGF0YSwgTlVMTCk7CkBAIC02NTksNzAgKzU4MCw4OSBAQAogICAgIF9lbnYtPlJlbGVhc2VGbG9hdEFycmF5RWxlbWVudHMoZGF0YSwgcHRyLCAwKTsKIH0KIAotCi0vL3sibkFsbG9jYXRpb25EYXRhRnJvbU9iamVjdCIsICAgICAgIihJTGFuZHJvaWQvcmVuZGVyc2NyaXB0L1R5cGU7TGphdmEvbGFuZy9PYmplY3Q7KVYiLCAgICh2b2lkKiluQWxsb2NhdGlvbkRhdGFGcm9tT2JqZWN0IH0sCi1zdGF0aWMgdm9pZAotbkFsbG9jYXRpb25TdWJEYXRhRnJvbU9iamVjdChKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIGppbnQgYWxsb2MsIGpvYmplY3QgX3R5cGUsIGppbnQgb2Zmc2V0LCBqb2JqZWN0IF9vKQorc3RhdGljIGppbnQKK25BbGxvY2F0aW9uR2V0VHlwZShKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIFJzQ29udGV4dCBjb24sIGppbnQgYSkKIHsKLSAgICBSc0NvbnRleHQgY29uID0gKFJzQ29udGV4dCkoX2Vudi0+R2V0SW50RmllbGQoX3RoaXMsIGdDb250ZXh0SWQpKTsKLSAgICBMT0dfQVBJKCJuQWxsb2NhdGlvbkRhdGFGcm9tT2JqZWN0IGNvbiglcCksIGFsbG9jKCVwKSIsIGNvbiwgKFJzQWxsb2NhdGlvbilhbGxvYyk7CisgICAgTE9HX0FQSSgibkFsbG9jYXRpb25HZXRUeXBlLCBjb24oJXApLCBhKCVwKSIsIGNvbiwgKFJzQWxsb2NhdGlvbilhKTsKKyAgICByZXR1cm4gKGppbnQpIHJzQWxsb2NhdGlvbkdldFR5cGUoY29uLCAoUnNBbGxvY2F0aW9uKWEpOworfQogCi0gICAgY29uc3QgVHlwZUNhY2hlICp0YyA9IChUeXBlQ2FjaGUgKilfZW52LT5HZXRJbnRGaWVsZChfdHlwZSwgZ1R5cGVOYXRpdmVDYWNoZSk7CisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCi0gICAgdm9pZCAqIGJ1ZkFsbG9jID0gbWFsbG9jKHRjLT5zaXplKTsKLSAgICB2b2lkICogYnVmID0gYnVmQWxsb2M7Ci0gICAgZm9yIChpbnQgY3Q9MDsgY3QgPCB0Yy0+ZmllbGRDb3VudDsgY3QrKykgewotICAgICAgICBjb25zdCBUeXBlRmllbGRDYWNoZSAqdGZjID0gJnRjLT5maWVsZHNbY3RdOwotICAgICAgICBidWYgPSB0ZmMtPnB0cihfZW52LCBfbywgdGZjLT5maWVsZCwgYnVmKTsKLSAgICB9Ci0gICAgcnNBbGxvY2F0aW9uMURTdWJEYXRhKGNvbiwgKFJzQWxsb2NhdGlvbilhbGxvYywgb2Zmc2V0LCAxLCBidWZBbGxvYywgdGMtPnNpemUpOwotICAgIGZyZWUoYnVmQWxsb2MpOworc3RhdGljIGludAorbkZpbGVBM0RDcmVhdGVGcm9tQXNzZXRTdHJlYW0oSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBSc0NvbnRleHQgY29uLCBqaW50IG5hdGl2ZV9hc3NldCkKK3sKKyAgICBMT0dWKCJfX19fX19uRmlsZUEzRCAldSIsICh1aW50MzJfdCkgbmF0aXZlX2Fzc2V0KTsKKworICAgIEFzc2V0KiBhc3NldCA9IHJlaW50ZXJwcmV0X2Nhc3Q8QXNzZXQqPihuYXRpdmVfYXNzZXQpOworCisgICAgamludCBpZCA9IChqaW50KXJzRmlsZUEzRENyZWF0ZUZyb21Bc3NldFN0cmVhbShjb24sIGFzc2V0LT5nZXRCdWZmZXIoZmFsc2UpLCBhc3NldC0+Z2V0TGVuZ3RoKCkpOworICAgIHJldHVybiBpZDsKK30KKworc3RhdGljIGludAorbkZpbGVBM0RHZXROdW1JbmRleEVudHJpZXMoSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBSc0NvbnRleHQgY29uLCBqaW50IGZpbGVBM0QpCit7CisgICAgaW50MzJfdCBudW1FbnRyaWVzID0gMDsKKyAgICByc0ZpbGVBM0RHZXROdW1JbmRleEVudHJpZXMoY29uLCAmbnVtRW50cmllcywgKFJzRmlsZSlmaWxlQTNEKTsKKyAgICByZXR1cm4gbnVtRW50cmllczsKIH0KIAogc3RhdGljIHZvaWQKLW5BbGxvY2F0aW9uU3ViUmVhZEZyb21PYmplY3QoSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBqaW50IGFsbG9jLCBqb2JqZWN0IF90eXBlLCBqaW50IG9mZnNldCwgam9iamVjdCBfbykKK25GaWxlQTNER2V0SW5kZXhFbnRyaWVzKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgUnNDb250ZXh0IGNvbiwgamludCBmaWxlQTNELCBqaW50IG51bUVudHJpZXMsIGppbnRBcnJheSBfaWRzLCBqb2JqZWN0QXJyYXkgX2VudHJpZXMpCiB7Ci0gICAgUnNDb250ZXh0IGNvbiA9IChSc0NvbnRleHQpKF9lbnYtPkdldEludEZpZWxkKF90aGlzLCBnQ29udGV4dElkKSk7Ci0gICAgTE9HX0FQSSgibkFsbG9jYXRpb25SZWFkRnJvbU9iamVjdCBjb24oJXApLCBhbGxvYyglcCkiLCBjb24sIChSc0FsbG9jYXRpb24pYWxsb2MpOworICAgIExPR1YoIl9fX19fX25GaWxlQTNEICV1IiwgKHVpbnQzMl90KSBmaWxlQTNEKTsKKyAgICBSc0ZpbGVJbmRleEVudHJ5ICpmaWxlRW50cmllcyA9IChSc0ZpbGVJbmRleEVudHJ5KiltYWxsb2MoKHVpbnQzMl90KW51bUVudHJpZXMgKiBzaXplb2YoUnNGaWxlSW5kZXhFbnRyeSkpOwogCi0gICAgYXNzZXJ0KG9mZnNldCA9PSAwKTsKKyAgICByc0ZpbGVBM0RHZXRJbmRleEVudHJpZXMoY29uLCBmaWxlRW50cmllcywgKHVpbnQzMl90KW51bUVudHJpZXMsIChSc0ZpbGUpZmlsZUEzRCk7CiAKLSAgICBjb25zdCBUeXBlQ2FjaGUgKnRjID0gKFR5cGVDYWNoZSAqKV9lbnYtPkdldEludEZpZWxkKF90eXBlLCBnVHlwZU5hdGl2ZUNhY2hlKTsKLQotICAgIHZvaWQgKiBidWZBbGxvYyA9IG1hbGxvYyh0Yy0+c2l6ZSk7Ci0gICAgdm9pZCAqIGJ1ZiA9IGJ1ZkFsbG9jOwotICAgIHJzQWxsb2NhdGlvblJlYWQoY29uLCAoUnNBbGxvY2F0aW9uKWFsbG9jLCBidWZBbGxvYyk7Ci0KLSAgICBmb3IgKGludCBjdD0wOyBjdCA8IHRjLT5maWVsZENvdW50OyBjdCsrKSB7Ci0gICAgICAgIGNvbnN0IFR5cGVGaWVsZENhY2hlICp0ZmMgPSAmdGMtPmZpZWxkc1tjdF07Ci0gICAgICAgIGJ1ZiA9IHRmYy0+cmVhZFB0cihfZW52LCBfbywgdGZjLT5maWVsZCwgYnVmKTsKKyAgICBmb3IoamludCBpID0gMDsgaSA8IG51bUVudHJpZXM7IGkgKyspIHsKKyAgICAgICAgX2Vudi0+U2V0T2JqZWN0QXJyYXlFbGVtZW50KF9lbnRyaWVzLCBpLCBfZW52LT5OZXdTdHJpbmdVVEYoZmlsZUVudHJpZXNbaV0ub2JqZWN0TmFtZSkpOworICAgICAgICBfZW52LT5TZXRJbnRBcnJheVJlZ2lvbihfaWRzLCBpLCAxLCAoY29uc3QgamludCopJmZpbGVFbnRyaWVzW2ldLmNsYXNzSUQpOwogICAgIH0KLSAgICBmcmVlKGJ1ZkFsbG9jKTsKKworICAgIGZyZWUoZmlsZUVudHJpZXMpOworfQorCitzdGF0aWMgaW50CituRmlsZUEzREdldEVudHJ5QnlJbmRleChKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIFJzQ29udGV4dCBjb24sIGppbnQgZmlsZUEzRCwgamludCBpbmRleCkKK3sKKyAgICBMT0dWKCJfX19fX19uRmlsZUEzRCAldSIsICh1aW50MzJfdCkgZmlsZUEzRCk7CisgICAgamludCBpZCA9IChqaW50KXJzRmlsZUEzREdldEVudHJ5QnlJbmRleChjb24sICh1aW50MzJfdClpbmRleCwgKFJzRmlsZSlmaWxlQTNEKTsKKyAgICByZXR1cm4gaWQ7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyBpbnQKK25Gb250Q3JlYXRlRnJvbUZpbGUoSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBSc0NvbnRleHQgY29uLCBqc3RyaW5nIGZpbGVOYW1lLCBqaW50IGZvbnRTaXplLCBqaW50IGRwaSkKK3sKKyAgICBjb25zdCBjaGFyKiBmaWxlTmFtZVVURiA9IF9lbnYtPkdldFN0cmluZ1VURkNoYXJzKGZpbGVOYW1lLCBOVUxMKTsKKworICAgIGppbnQgaWQgPSAoamludClyc0ZvbnRDcmVhdGVGcm9tRmlsZShjb24sIGZpbGVOYW1lVVRGLCBmb250U2l6ZSwgZHBpKTsKKyAgICByZXR1cm4gaWQ7CiB9CiAKIAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAogc3RhdGljIHZvaWQKLW5BZGFwdGVyMURCaW5kQWxsb2NhdGlvbihKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIGppbnQgYWRhcHRlciwgamludCBhbGxvYykKK25BZGFwdGVyMURCaW5kQWxsb2NhdGlvbihKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIFJzQ29udGV4dCBjb24sIGppbnQgYWRhcHRlciwgamludCBhbGxvYykKIHsKLSAgICBSc0NvbnRleHQgY29uID0gKFJzQ29udGV4dCkoX2Vudi0+R2V0SW50RmllbGQoX3RoaXMsIGdDb250ZXh0SWQpKTsKICAgICBMT0dfQVBJKCJuQWRhcHRlcjFEQmluZEFsbG9jYXRpb24sIGNvbiglcCksIGFkYXB0ZXIoJXApLCBhbGxvYyglcCkiLCBjb24sIChSc0FkYXB0ZXIxRClhZGFwdGVyLCAoUnNBbGxvY2F0aW9uKWFsbG9jKTsKICAgICByc0FkYXB0ZXIxREJpbmRBbGxvY2F0aW9uKGNvbiwgKFJzQWRhcHRlcjFEKWFkYXB0ZXIsIChSc0FsbG9jYXRpb24pYWxsb2MpOwogfQogCiBzdGF0aWMgdm9pZAotbkFkYXB0ZXIxRFNldENvbnN0cmFpbnQoSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBqaW50IGFkYXB0ZXIsIGppbnQgZGltLCBqaW50IHZhbHVlKQorbkFkYXB0ZXIxRFNldENvbnN0cmFpbnQoSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBSc0NvbnRleHQgY29uLCBqaW50IGFkYXB0ZXIsIGppbnQgZGltLCBqaW50IHZhbHVlKQogewotICAgIFJzQ29udGV4dCBjb24gPSAoUnNDb250ZXh0KShfZW52LT5HZXRJbnRGaWVsZChfdGhpcywgZ0NvbnRleHRJZCkpOwogICAgIExPR19BUEkoIm5BZGFwdGVyMURTZXRDb25zdHJhaW50LCBjb24oJXApLCBhZGFwdGVyKCVwKSwgZGltKCVpKSwgdmFsdWUoJWkpIiwgY29uLCAoUnNBZGFwdGVyMUQpYWRhcHRlciwgZGltLCB2YWx1ZSk7CiAgICAgcnNBZGFwdGVyMURTZXRDb25zdHJhaW50KGNvbiwgKFJzQWRhcHRlcjFEKWFkYXB0ZXIsIChSc0RpbWVuc2lvbilkaW0sIHZhbHVlKTsKIH0KIAogc3RhdGljIHZvaWQKLW5BZGFwdGVyMUREYXRhX2koSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBqaW50IGFkYXB0ZXIsIGppbnRBcnJheSBkYXRhKQorbkFkYXB0ZXIxRERhdGFfaShKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIFJzQ29udGV4dCBjb24sIGppbnQgYWRhcHRlciwgamludEFycmF5IGRhdGEpCiB7Ci0gICAgUnNDb250ZXh0IGNvbiA9IChSc0NvbnRleHQpKF9lbnYtPkdldEludEZpZWxkKF90aGlzLCBnQ29udGV4dElkKSk7CiAgICAgamludCBsZW4gPSBfZW52LT5HZXRBcnJheUxlbmd0aChkYXRhKTsKICAgICBMT0dfQVBJKCJuQWRhcHRlcjFERGF0YV9pLCBjb24oJXApLCBhZGFwdGVyKCVwKSwgbGVuKCVpKSIsIGNvbiwgKFJzQWRhcHRlcjFEKWFkYXB0ZXIsIGxlbik7CiAgICAgamludCAqcHRyID0gX2Vudi0+R2V0SW50QXJyYXlFbGVtZW50cyhkYXRhLCBOVUxMKTsKQEAgLTczMSw5ICs2NzEsOCBAQAogfQogCiBzdGF0aWMgdm9pZAotbkFkYXB0ZXIxRFN1YkRhdGFfaShKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIGppbnQgYWRhcHRlciwgamludCBvZmZzZXQsIGppbnQgY291bnQsIGppbnRBcnJheSBkYXRhKQorbkFkYXB0ZXIxRFN1YkRhdGFfaShKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIFJzQ29udGV4dCBjb24sIGppbnQgYWRhcHRlciwgamludCBvZmZzZXQsIGppbnQgY291bnQsIGppbnRBcnJheSBkYXRhKQogewotICAgIFJzQ29udGV4dCBjb24gPSAoUnNDb250ZXh0KShfZW52LT5HZXRJbnRGaWVsZChfdGhpcywgZ0NvbnRleHRJZCkpOwogICAgIGppbnQgbGVuID0gX2Vudi0+R2V0QXJyYXlMZW5ndGgoZGF0YSk7CiAgICAgTE9HX0FQSSgibkFkYXB0ZXIxRFN1YkRhdGFfaSwgY29uKCVwKSwgYWRhcHRlciglcCksIG9mZnNldCglaSksIGNvdW50KCVpKSwgbGVuKCVpKSIsIGNvbiwgKFJzQWRhcHRlcjFEKWFkYXB0ZXIsIG9mZnNldCwgY291bnQsIGxlbik7CiAgICAgamludCAqcHRyID0gX2Vudi0+R2V0SW50QXJyYXlFbGVtZW50cyhkYXRhLCBOVUxMKTsKQEAgLTc0Miw5ICs2ODEsOCBAQAogfQogCiBzdGF0aWMgdm9pZAotbkFkYXB0ZXIxRERhdGFfZihKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIGppbnQgYWRhcHRlciwgamZsb2F0QXJyYXkgZGF0YSkKK25BZGFwdGVyMUREYXRhX2YoSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBSc0NvbnRleHQgY29uLCBqaW50IGFkYXB0ZXIsIGpmbG9hdEFycmF5IGRhdGEpCiB7Ci0gICAgUnNDb250ZXh0IGNvbiA9IChSc0NvbnRleHQpKF9lbnYtPkdldEludEZpZWxkKF90aGlzLCBnQ29udGV4dElkKSk7CiAgICAgamludCBsZW4gPSBfZW52LT5HZXRBcnJheUxlbmd0aChkYXRhKTsKICAgICBMT0dfQVBJKCJuQWRhcHRlcjFERGF0YV9mLCBjb24oJXApLCBhZGFwdGVyKCVwKSwgbGVuKCVpKSIsIGNvbiwgKFJzQWRhcHRlcjFEKWFkYXB0ZXIsIGxlbik7CiAgICAgamZsb2F0ICpwdHIgPSBfZW52LT5HZXRGbG9hdEFycmF5RWxlbWVudHMoZGF0YSwgTlVMTCk7CkBAIC03NTMsOSArNjkxLDggQEAKIH0KIAogc3RhdGljIHZvaWQKLW5BZGFwdGVyMURTdWJEYXRhX2YoSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBqaW50IGFkYXB0ZXIsIGppbnQgb2Zmc2V0LCBqaW50IGNvdW50LCBqZmxvYXRBcnJheSBkYXRhKQorbkFkYXB0ZXIxRFN1YkRhdGFfZihKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIFJzQ29udGV4dCBjb24sIGppbnQgYWRhcHRlciwgamludCBvZmZzZXQsIGppbnQgY291bnQsIGpmbG9hdEFycmF5IGRhdGEpCiB7Ci0gICAgUnNDb250ZXh0IGNvbiA9IChSc0NvbnRleHQpKF9lbnYtPkdldEludEZpZWxkKF90aGlzLCBnQ29udGV4dElkKSk7CiAgICAgamludCBsZW4gPSBfZW52LT5HZXRBcnJheUxlbmd0aChkYXRhKTsKICAgICBMT0dfQVBJKCJuQWRhcHRlcjFEU3ViRGF0YV9mLCBjb24oJXApLCBhZGFwdGVyKCVwKSwgb2Zmc2V0KCVpKSwgY291bnQoJWkpLCBsZW4oJWkpIiwgY29uLCAoUnNBZGFwdGVyMUQpYWRhcHRlciwgb2Zmc2V0LCBjb3VudCwgbGVuKTsKICAgICBqZmxvYXQgKnB0ciA9IF9lbnYtPkdldEZsb2F0QXJyYXlFbGVtZW50cyhkYXRhLCBOVUxMKTsKQEAgLTc2NCw5ICs3MDEsOCBAQAogfQogCiBzdGF0aWMgamludAotbkFkYXB0ZXIxRENyZWF0ZShKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMpCituQWRhcHRlcjFEQ3JlYXRlKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgUnNDb250ZXh0IGNvbikKIHsKLSAgICBSc0NvbnRleHQgY29uID0gKFJzQ29udGV4dCkoX2Vudi0+R2V0SW50RmllbGQoX3RoaXMsIGdDb250ZXh0SWQpKTsKICAgICBMT0dfQVBJKCJuQWRhcHRlcjFEQ3JlYXRlLCBjb24oJXApIiwgY29uKTsKICAgICByZXR1cm4gKGppbnQpcnNBZGFwdGVyMURDcmVhdGUoY29uKTsKIH0KQEAgLTc3NCwyNSArNzEwLDIyIEBACiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCiBzdGF0aWMgdm9pZAotbkFkYXB0ZXIyREJpbmRBbGxvY2F0aW9uKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgamludCBhZGFwdGVyLCBqaW50IGFsbG9jKQorbkFkYXB0ZXIyREJpbmRBbGxvY2F0aW9uKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgUnNDb250ZXh0IGNvbiwgamludCBhZGFwdGVyLCBqaW50IGFsbG9jKQogewotICAgIFJzQ29udGV4dCBjb24gPSAoUnNDb250ZXh0KShfZW52LT5HZXRJbnRGaWVsZChfdGhpcywgZ0NvbnRleHRJZCkpOwogICAgIExPR19BUEkoIm5BZGFwdGVyMkRCaW5kQWxsb2NhdGlvbiwgY29uKCVwKSwgYWRhcHRlciglcCksIGFsbG9jKCVwKSIsIGNvbiwgKFJzQWRhcHRlcjJEKWFkYXB0ZXIsIChSc0FsbG9jYXRpb24pYWxsb2MpOwogICAgIHJzQWRhcHRlcjJEQmluZEFsbG9jYXRpb24oY29uLCAoUnNBZGFwdGVyMkQpYWRhcHRlciwgKFJzQWxsb2NhdGlvbilhbGxvYyk7CiB9CiAKIHN0YXRpYyB2b2lkCi1uQWRhcHRlcjJEU2V0Q29uc3RyYWludChKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIGppbnQgYWRhcHRlciwgamludCBkaW0sIGppbnQgdmFsdWUpCituQWRhcHRlcjJEU2V0Q29uc3RyYWludChKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIFJzQ29udGV4dCBjb24sIGppbnQgYWRhcHRlciwgamludCBkaW0sIGppbnQgdmFsdWUpCiB7Ci0gICAgUnNDb250ZXh0IGNvbiA9IChSc0NvbnRleHQpKF9lbnYtPkdldEludEZpZWxkKF90aGlzLCBnQ29udGV4dElkKSk7CiAgICAgTE9HX0FQSSgibkFkYXB0ZXIyRFNldENvbnN0cmFpbnQsIGNvbiglcCksIGFkYXB0ZXIoJXApLCBkaW0oJWkpLCB2YWx1ZSglaSkiLCBjb24sIChSc0FkYXB0ZXIyRClhZGFwdGVyLCBkaW0sIHZhbHVlKTsKICAgICByc0FkYXB0ZXIyRFNldENvbnN0cmFpbnQoY29uLCAoUnNBZGFwdGVyMkQpYWRhcHRlciwgKFJzRGltZW5zaW9uKWRpbSwgdmFsdWUpOwogfQogCiBzdGF0aWMgdm9pZAotbkFkYXB0ZXIyRERhdGFfaShKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIGppbnQgYWRhcHRlciwgamludEFycmF5IGRhdGEpCituQWRhcHRlcjJERGF0YV9pKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgUnNDb250ZXh0IGNvbiwgamludCBhZGFwdGVyLCBqaW50QXJyYXkgZGF0YSkKIHsKLSAgICBSc0NvbnRleHQgY29uID0gKFJzQ29udGV4dCkoX2Vudi0+R2V0SW50RmllbGQoX3RoaXMsIGdDb250ZXh0SWQpKTsKICAgICBqaW50IGxlbiA9IF9lbnYtPkdldEFycmF5TGVuZ3RoKGRhdGEpOwogICAgIExPR19BUEkoIm5BZGFwdGVyMkREYXRhX2ksIGNvbiglcCksIGFkYXB0ZXIoJXApLCBsZW4oJWkpIiwgY29uLCAoUnNBZGFwdGVyMkQpYWRhcHRlciwgbGVuKTsKICAgICBqaW50ICpwdHIgPSBfZW52LT5HZXRJbnRBcnJheUVsZW1lbnRzKGRhdGEsIE5VTEwpOwpAQCAtODAxLDkgKzczNCw4IEBACiB9CiAKIHN0YXRpYyB2b2lkCi1uQWRhcHRlcjJERGF0YV9mKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgamludCBhZGFwdGVyLCBqZmxvYXRBcnJheSBkYXRhKQorbkFkYXB0ZXIyRERhdGFfZihKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIFJzQ29udGV4dCBjb24sIGppbnQgYWRhcHRlciwgamZsb2F0QXJyYXkgZGF0YSkKIHsKLSAgICBSc0NvbnRleHQgY29uID0gKFJzQ29udGV4dCkoX2Vudi0+R2V0SW50RmllbGQoX3RoaXMsIGdDb250ZXh0SWQpKTsKICAgICBqaW50IGxlbiA9IF9lbnYtPkdldEFycmF5TGVuZ3RoKGRhdGEpOwogICAgIExPR19BUEkoIm5BZGFwdGVyMkREYXRhX2YsIGNvbiglcCksIGFkYXB0ZXIoJXApLCBsZW4oJWkpIiwgY29uLCAoUnNBZGFwdGVyMkQpYWRhcHRlciwgbGVuKTsKICAgICBqZmxvYXQgKnB0ciA9IF9lbnYtPkdldEZsb2F0QXJyYXlFbGVtZW50cyhkYXRhLCBOVUxMKTsKQEAgLTgxMiw5ICs3NDQsOCBAQAogfQogCiBzdGF0aWMgdm9pZAotbkFkYXB0ZXIyRFN1YkRhdGFfaShKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIGppbnQgYWRhcHRlciwgamludCB4b2ZmLCBqaW50IHlvZmYsIGppbnQgdywgamludCBoLCBqaW50QXJyYXkgZGF0YSkKK25BZGFwdGVyMkRTdWJEYXRhX2koSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBSc0NvbnRleHQgY29uLCBqaW50IGFkYXB0ZXIsIGppbnQgeG9mZiwgamludCB5b2ZmLCBqaW50IHcsIGppbnQgaCwgamludEFycmF5IGRhdGEpCiB7Ci0gICAgUnNDb250ZXh0IGNvbiA9IChSc0NvbnRleHQpKF9lbnYtPkdldEludEZpZWxkKF90aGlzLCBnQ29udGV4dElkKSk7CiAgICAgamludCBsZW4gPSBfZW52LT5HZXRBcnJheUxlbmd0aChkYXRhKTsKICAgICBMT0dfQVBJKCJuQWRhcHRlcjJEU3ViRGF0YV9pLCBjb24oJXApLCBhZGFwdGVyKCVwKSwgeG9mZiglaSksIHlvZmYoJWkpLCB3KCVpKSwgaCglaSksIGxlbiglaSkiLAogICAgICAgICAgICAgY29uLCAoUnNBZGFwdGVyMkQpYWRhcHRlciwgeG9mZiwgeW9mZiwgdywgaCwgbGVuKTsKQEAgLTgyNCw5ICs3NTUsOCBAQAogfQogCiBzdGF0aWMgdm9pZAotbkFkYXB0ZXIyRFN1YkRhdGFfZihKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIGppbnQgYWRhcHRlciwgamludCB4b2ZmLCBqaW50IHlvZmYsIGppbnQgdywgamludCBoLCBqZmxvYXRBcnJheSBkYXRhKQorbkFkYXB0ZXIyRFN1YkRhdGFfZihKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIFJzQ29udGV4dCBjb24sIGppbnQgYWRhcHRlciwgamludCB4b2ZmLCBqaW50IHlvZmYsIGppbnQgdywgamludCBoLCBqZmxvYXRBcnJheSBkYXRhKQogewotICAgIFJzQ29udGV4dCBjb24gPSAoUnNDb250ZXh0KShfZW52LT5HZXRJbnRGaWVsZChfdGhpcywgZ0NvbnRleHRJZCkpOwogICAgIGppbnQgbGVuID0gX2Vudi0+R2V0QXJyYXlMZW5ndGgoZGF0YSk7CiAgICAgTE9HX0FQSSgibkFkYXB0ZXIyRFN1YkRhdGFfZiwgY29uKCVwKSwgYWRhcHRlciglcCksIHhvZmYoJWkpLCB5b2ZmKCVpKSwgdyglaSksIGgoJWkpLCBsZW4oJWkpIiwKICAgICAgICAgICAgIGNvbiwgKFJzQWRhcHRlcjJEKWFkYXB0ZXIsIHhvZmYsIHlvZmYsIHcsIGgsIGxlbik7CkBAIC04MzYsOSArNzY2LDggQEAKIH0KIAogc3RhdGljIGppbnQKLW5BZGFwdGVyMkRDcmVhdGUoSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzKQorbkFkYXB0ZXIyRENyZWF0ZShKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIFJzQ29udGV4dCBjb24pCiB7Ci0gICAgUnNDb250ZXh0IGNvbiA9IChSc0NvbnRleHQpKF9lbnYtPkdldEludEZpZWxkKF90aGlzLCBnQ29udGV4dElkKSk7CiAgICAgTE9HX0FQSSgibkFkYXB0ZXIyRENyZWF0ZSwgY29uKCVwKSIsIGNvbik7CiAgICAgcmV0dXJuIChqaW50KXJzQWRhcHRlcjJEQ3JlYXRlKGNvbik7CiB9CkBAIC04NDYsNDEgKzc3NSw0MCBAQAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAogc3RhdGljIHZvaWQKLW5TY3JpcHRCaW5kQWxsb2NhdGlvbihKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIGppbnQgc2NyaXB0LCBqaW50IGFsbG9jLCBqaW50IHNsb3QpCituU2NyaXB0QmluZEFsbG9jYXRpb24oSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBSc0NvbnRleHQgY29uLCBqaW50IHNjcmlwdCwgamludCBhbGxvYywgamludCBzbG90KQogewotICAgIFJzQ29udGV4dCBjb24gPSAoUnNDb250ZXh0KShfZW52LT5HZXRJbnRGaWVsZChfdGhpcywgZ0NvbnRleHRJZCkpOwogICAgIExPR19BUEkoIm5TY3JpcHRCaW5kQWxsb2NhdGlvbiwgY29uKCVwKSwgc2NyaXB0KCVwKSwgYWxsb2MoJXApLCBzbG90KCVpKSIsIGNvbiwgKFJzU2NyaXB0KXNjcmlwdCwgKFJzQWxsb2NhdGlvbilhbGxvYywgc2xvdCk7CiAgICAgcnNTY3JpcHRCaW5kQWxsb2NhdGlvbihjb24sIChSc1NjcmlwdClzY3JpcHQsIChSc0FsbG9jYXRpb24pYWxsb2MsIHNsb3QpOwogfQogCiBzdGF0aWMgdm9pZAotblNjcmlwdFNldENsZWFyQ29sb3IoSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBqaW50IHNjcmlwdCwgamZsb2F0IHIsIGpmbG9hdCBnLCBqZmxvYXQgYiwgamZsb2F0IGEpCituU2NyaXB0U2V0VmFySShKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIFJzQ29udGV4dCBjb24sIGppbnQgc2NyaXB0LCBqaW50IHNsb3QsIGppbnQgdmFsKQogewotICAgIFJzQ29udGV4dCBjb24gPSAoUnNDb250ZXh0KShfZW52LT5HZXRJbnRGaWVsZChfdGhpcywgZ0NvbnRleHRJZCkpOwotICAgIExPR19BUEkoIm5TY3JpcHRTZXRDbGVhckNvbG9yLCBjb24oJXApLCBzKCVwKSwgciglZiksIGcoJWYpLCBiKCVmKSwgYSglZikiLCBjb24sICh2b2lkICopc2NyaXB0LCByLCBnLCBiLCBhKTsKLSAgICByc1NjcmlwdFNldENsZWFyQ29sb3IoY29uLCAoUnNTY3JpcHQpc2NyaXB0LCByLCBnLCBiLCBhKTsKKyAgICBMT0dfQVBJKCJuU2NyaXB0U2V0VmFySSwgY29uKCVwKSwgcyglcCksIHNsb3QoJWkpLCB2YWwoJWkpIiwgY29uLCAodm9pZCAqKXNjcmlwdCwgc2xvdCwgdmFsKTsKKyAgICByc1NjcmlwdFNldFZhckkoY29uLCAoUnNTY3JpcHQpc2NyaXB0LCBzbG90LCB2YWwpOwogfQogCiBzdGF0aWMgdm9pZAotblNjcmlwdFNldENsZWFyRGVwdGgoSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBqaW50IHNjcmlwdCwgamZsb2F0IGQpCituU2NyaXB0U2V0VmFyRihKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIFJzQ29udGV4dCBjb24sIGppbnQgc2NyaXB0LCBqaW50IHNsb3QsIGZsb2F0IHZhbCkKIHsKLSAgICBSc0NvbnRleHQgY29uID0gKFJzQ29udGV4dCkoX2Vudi0+R2V0SW50RmllbGQoX3RoaXMsIGdDb250ZXh0SWQpKTsKLSAgICBMT0dfQVBJKCJuU2NyaXB0Q1NldENsZWFyRGVwdGgsIGNvbiglcCksIHMoJXApLCBkZXB0aCglZikiLCBjb24sICh2b2lkICopc2NyaXB0LCBkKTsKLSAgICByc1NjcmlwdFNldENsZWFyRGVwdGgoY29uLCAoUnNTY3JpcHQpc2NyaXB0LCBkKTsKKyAgICBMT0dfQVBJKCJuU2NyaXB0U2V0VmFySSwgY29uKCVwKSwgcyglcCksIHNsb3QoJWkpLCB2YWwoJWYpIiwgY29uLCAodm9pZCAqKXNjcmlwdCwgc2xvdCwgdmFsKTsKKyAgICByc1NjcmlwdFNldFZhckYoY29uLCAoUnNTY3JpcHQpc2NyaXB0LCBzbG90LCB2YWwpOwogfQogCiBzdGF0aWMgdm9pZAotblNjcmlwdFNldENsZWFyU3RlbmNpbChKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIGppbnQgc2NyaXB0LCBqaW50IHN0ZW5jaWwpCituU2NyaXB0U2V0VmFyVihKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIFJzQ29udGV4dCBjb24sIGppbnQgc2NyaXB0LCBqaW50IHNsb3QsIGpieXRlQXJyYXkgZGF0YSkKIHsKLSAgICBSc0NvbnRleHQgY29uID0gKFJzQ29udGV4dCkoX2Vudi0+R2V0SW50RmllbGQoX3RoaXMsIGdDb250ZXh0SWQpKTsKLSAgICBMT0dfQVBJKCJuU2NyaXB0Q1NldENsZWFyU3RlbmNpbCwgY29uKCVwKSwgcyglcCksIHN0ZW5jaWwoJWkpIiwgY29uLCAodm9pZCAqKXNjcmlwdCwgc3RlbmNpbCk7Ci0gICAgcnNTY3JpcHRTZXRDbGVhclN0ZW5jaWwoY29uLCAoUnNTY3JpcHQpc2NyaXB0LCBzdGVuY2lsKTsKKyAgICBMT0dfQVBJKCJuU2NyaXB0U2V0VmFyViwgY29uKCVwKSwgcyglcCksIHNsb3QoJWkpIiwgY29uLCAodm9pZCAqKXNjcmlwdCwgc2xvdCk7CisgICAgamludCBsZW4gPSBfZW52LT5HZXRBcnJheUxlbmd0aChkYXRhKTsKKyAgICBqYnl0ZSAqcHRyID0gX2Vudi0+R2V0Qnl0ZUFycmF5RWxlbWVudHMoZGF0YSwgTlVMTCk7CisgICAgcnNTY3JpcHRTZXRWYXJWKGNvbiwgKFJzU2NyaXB0KXNjcmlwdCwgc2xvdCwgcHRyLCBsZW4pOworICAgIF9lbnYtPlJlbGVhc2VCeXRlQXJyYXlFbGVtZW50cyhkYXRhLCBwdHIsIEpOSV9BQk9SVCk7CiB9CiAKKwogc3RhdGljIHZvaWQKLW5TY3JpcHRTZXRUaW1lWm9uZShKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIGppbnQgc2NyaXB0LCBqYnl0ZUFycmF5IHRpbWVab25lKQorblNjcmlwdFNldFRpbWVab25lKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgUnNDb250ZXh0IGNvbiwgamludCBzY3JpcHQsIGpieXRlQXJyYXkgdGltZVpvbmUpCiB7Ci0gICAgUnNDb250ZXh0IGNvbiA9IChSc0NvbnRleHQpKF9lbnYtPkdldEludEZpZWxkKF90aGlzLCBnQ29udGV4dElkKSk7CiAgICAgTE9HX0FQSSgiblNjcmlwdENTZXRUaW1lWm9uZSwgY29uKCVwKSwgcyglcCksIHRpbWVab25lKCVzKSIsIGNvbiwgKHZvaWQgKilzY3JpcHQsIChjb25zdCBjaGFyICopdGltZVpvbmUpOwogCiAgICAgamludCBsZW5ndGggPSBfZW52LT5HZXRBcnJheUxlbmd0aCh0aW1lWm9uZSk7CkBAIC04OTUsNjYgKzgyMywzNiBAQAogfQogCiBzdGF0aWMgdm9pZAotblNjcmlwdFNldFR5cGUoSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBqaW50IHR5cGUsIGpib29sZWFuIHdyaXRhYmxlLCBqc3RyaW5nIF9zdHIsIGppbnQgc2xvdCkKK25TY3JpcHRJbnZva2UoSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBSc0NvbnRleHQgY29uLCBqaW50IG9iaiwgamludCBzbG90KQogewotICAgIFJzQ29udGV4dCBjb24gPSAoUnNDb250ZXh0KShfZW52LT5HZXRJbnRGaWVsZChfdGhpcywgZ0NvbnRleHRJZCkpOwotICAgIExPR19BUEkoIm5TY3JpcHRDQWRkVHlwZSwgY29uKCVwKSwgdHlwZSglcCksIHdyaXRhYmxlKCVpKSwgc2xvdCglaSkiLCBjb24sIChSc1R5cGUpdHlwZSwgd3JpdGFibGUsIHNsb3QpOwotICAgIGNvbnN0IGNoYXIqIG4gPSBOVUxMOwotICAgIGlmIChfc3RyKSB7Ci0gICAgICAgIG4gPSBfZW52LT5HZXRTdHJpbmdVVEZDaGFycyhfc3RyLCBOVUxMKTsKLSAgICB9Ci0gICAgcnNTY3JpcHRTZXRUeXBlKGNvbiwgKFJzVHlwZSl0eXBlLCBzbG90LCB3cml0YWJsZSwgbik7Ci0gICAgaWYgKG4pIHsKLSAgICAgICAgX2Vudi0+UmVsZWFzZVN0cmluZ1VURkNoYXJzKF9zdHIsIG4pOwotICAgIH0KLX0KLQotc3RhdGljIHZvaWQKLW5TY3JpcHRTZXRJbnZva2UoSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBqc3RyaW5nIF9zdHIsIGppbnQgc2xvdCkKLXsKLSAgICBSc0NvbnRleHQgY29uID0gKFJzQ29udGV4dCkoX2Vudi0+R2V0SW50RmllbGQoX3RoaXMsIGdDb250ZXh0SWQpKTsKLSAgICBMT0dfQVBJKCJuU2NyaXB0U2V0SW52b2tlLCBjb24oJXApIiwgY29uKTsKLSAgICBjb25zdCBjaGFyKiBuID0gTlVMTDsKLSAgICBpZiAoX3N0cikgewotICAgICAgICBuID0gX2Vudi0+R2V0U3RyaW5nVVRGQ2hhcnMoX3N0ciwgTlVMTCk7Ci0gICAgfQotICAgIHJzU2NyaXB0U2V0SW52b2tlKGNvbiwgbiwgc2xvdCk7Ci0gICAgaWYgKG4pIHsKLSAgICAgICAgX2Vudi0+UmVsZWFzZVN0cmluZ1VURkNoYXJzKF9zdHIsIG4pOwotICAgIH0KLX0KLQotc3RhdGljIHZvaWQKLW5TY3JpcHRJbnZva2UoSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBqaW50IG9iaiwgamludCBzbG90KQotewotICAgIFJzQ29udGV4dCBjb24gPSAoUnNDb250ZXh0KShfZW52LT5HZXRJbnRGaWVsZChfdGhpcywgZ0NvbnRleHRJZCkpOwogICAgIExPR19BUEkoIm5TY3JpcHRJbnZva2UsIGNvbiglcCksIHNjcmlwdCglcCkiLCBjb24sICh2b2lkICopb2JqKTsKICAgICByc1NjcmlwdEludm9rZShjb24sIChSc1NjcmlwdClvYmosIHNsb3QpOwogfQogCiBzdGF0aWMgdm9pZAotblNjcmlwdFNldFJvb3QoSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBqYm9vbGVhbiBpc1Jvb3QpCituU2NyaXB0SW52b2tlVihKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIFJzQ29udGV4dCBjb24sIGppbnQgc2NyaXB0LCBqaW50IHNsb3QsIGpieXRlQXJyYXkgZGF0YSkKIHsKLSAgICBSc0NvbnRleHQgY29uID0gKFJzQ29udGV4dCkoX2Vudi0+R2V0SW50RmllbGQoX3RoaXMsIGdDb250ZXh0SWQpKTsKLSAgICBMT0dfQVBJKCJuU2NyaXB0Q1NldFJvb3QsIGNvbiglcCksIGlzUm9vdCglaSkiLCBjb24sIGlzUm9vdCk7Ci0gICAgcnNTY3JpcHRTZXRSb290KGNvbiwgaXNSb290KTsKKyAgICBMT0dfQVBJKCJuU2NyaXB0SW52b2tlViwgY29uKCVwKSwgcyglcCksIHNsb3QoJWkpIiwgY29uLCAodm9pZCAqKXNjcmlwdCwgc2xvdCk7CisgICAgamludCBsZW4gPSBfZW52LT5HZXRBcnJheUxlbmd0aChkYXRhKTsKKyAgICBqYnl0ZSAqcHRyID0gX2Vudi0+R2V0Qnl0ZUFycmF5RWxlbWVudHMoZGF0YSwgTlVMTCk7CisgICAgcnNTY3JpcHRJbnZva2VWKGNvbiwgKFJzU2NyaXB0KXNjcmlwdCwgc2xvdCwgcHRyLCBsZW4pOworICAgIF9lbnYtPlJlbGVhc2VCeXRlQXJyYXlFbGVtZW50cyhkYXRhLCBwdHIsIEpOSV9BQk9SVCk7CiB9CiAKKwogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAogc3RhdGljIHZvaWQKLW5TY3JpcHRDQmVnaW4oSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzKQorblNjcmlwdENCZWdpbihKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIFJzQ29udGV4dCBjb24pCiB7Ci0gICAgUnNDb250ZXh0IGNvbiA9IChSc0NvbnRleHQpKF9lbnYtPkdldEludEZpZWxkKF90aGlzLCBnQ29udGV4dElkKSk7CiAgICAgTE9HX0FQSSgiblNjcmlwdENCZWdpbiwgY29uKCVwKSIsIGNvbik7CiAgICAgcnNTY3JpcHRDQmVnaW4oY29uKTsKIH0KIAogc3RhdGljIHZvaWQKLW5TY3JpcHRDU2V0U2NyaXB0KEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgamJ5dGVBcnJheSBzY3JpcHRSZWYsCituU2NyaXB0Q1NldFNjcmlwdChKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIFJzQ29udGV4dCBjb24sIGpieXRlQXJyYXkgc2NyaXB0UmVmLAogICAgICAgICAgICAgICAgICAgamludCBvZmZzZXQsIGppbnQgbGVuZ3RoKQogewotICAgIFJzQ29udGV4dCBjb24gPSAoUnNDb250ZXh0KShfZW52LT5HZXRJbnRGaWVsZChfdGhpcywgZ0NvbnRleHRJZCkpOwogICAgIExPR19BUEkoIiEhISBuU2NyaXB0Q1NldFNjcmlwdCwgY29uKCVwKSIsIGNvbik7CiAgICAgamludCBfZXhjZXB0aW9uID0gMDsKICAgICBqaW50IHJlbWFpbmluZzsKQEAgLTk5NSwxMTQgKzg5Myw4MiBAQAogfQogCiBzdGF0aWMgamludAotblNjcmlwdENDcmVhdGUoSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzKQorblNjcmlwdENDcmVhdGUoSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBSc0NvbnRleHQgY29uKQogewotICAgIFJzQ29udGV4dCBjb24gPSAoUnNDb250ZXh0KShfZW52LT5HZXRJbnRGaWVsZChfdGhpcywgZ0NvbnRleHRJZCkpOwogICAgIExPR19BUEkoIm5TY3JpcHRDQ3JlYXRlLCBjb24oJXApIiwgY29uKTsKICAgICByZXR1cm4gKGppbnQpcnNTY3JpcHRDQ3JlYXRlKGNvbik7CiB9CiAKLXN0YXRpYyB2b2lkCi1uU2NyaXB0Q0FkZERlZmluZUkzMihKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIGpzdHJpbmcgbmFtZSwgamludCB2YWx1ZSkKLXsKLSAgICBSc0NvbnRleHQgY29uID0gKFJzQ29udGV4dCkoX2Vudi0+R2V0SW50RmllbGQoX3RoaXMsIGdDb250ZXh0SWQpKTsKLSAgICBjb25zdCBjaGFyKiBuID0gX2Vudi0+R2V0U3RyaW5nVVRGQ2hhcnMobmFtZSwgTlVMTCk7Ci0gICAgTE9HX0FQSSgiblNjcmlwdENBZGREZWZpbmVJMzIsIGNvbiglcCkgbmFtZSglcykgdmFsdWUoJWQpIiwgY29uLCBuLCB2YWx1ZSk7Ci0gICAgcnNTY3JpcHRDU2V0RGVmaW5lSTMyKGNvbiwgbiwgdmFsdWUpOwotICAgIF9lbnYtPlJlbGVhc2VTdHJpbmdVVEZDaGFycyhuYW1lLCBuKTsKLX0KLQotc3RhdGljIHZvaWQKLW5TY3JpcHRDQWRkRGVmaW5lRihKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIGpzdHJpbmcgbmFtZSwgamZsb2F0IHZhbHVlKQotewotICAgIFJzQ29udGV4dCBjb24gPSAoUnNDb250ZXh0KShfZW52LT5HZXRJbnRGaWVsZChfdGhpcywgZ0NvbnRleHRJZCkpOwotICAgIGNvbnN0IGNoYXIqIG4gPSBfZW52LT5HZXRTdHJpbmdVVEZDaGFycyhuYW1lLCBOVUxMKTsKLSAgICBMT0dfQVBJKCJuU2NyaXB0Q0FkZERlZmluZUYsIGNvbiglcCkgbmFtZSglcykgdmFsdWUoJWYpIiwgY29uLCBuLCB2YWx1ZSk7Ci0gICAgcnNTY3JpcHRDU2V0RGVmaW5lRihjb24sIG4sIHZhbHVlKTsKLSAgICBfZW52LT5SZWxlYXNlU3RyaW5nVVRGQ2hhcnMobmFtZSwgbik7Ci19Ci0KIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCiBzdGF0aWMgdm9pZAotblByb2dyYW1GcmFnbWVudFN0b3JlQmVnaW4oSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBqaW50IGluLCBqaW50IG91dCkKK25Qcm9ncmFtU3RvcmVCZWdpbihKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIFJzQ29udGV4dCBjb24sIGppbnQgaW4sIGppbnQgb3V0KQogewotICAgIFJzQ29udGV4dCBjb24gPSAoUnNDb250ZXh0KShfZW52LT5HZXRJbnRGaWVsZChfdGhpcywgZ0NvbnRleHRJZCkpOwotICAgIExPR19BUEkoIm5Qcm9ncmFtRnJhZ21lbnRTdG9yZUJlZ2luLCBjb24oJXApLCBpbiglcCksIG91dCglcCkiLCBjb24sIChSc0VsZW1lbnQpaW4sIChSc0VsZW1lbnQpb3V0KTsKLSAgICByc1Byb2dyYW1GcmFnbWVudFN0b3JlQmVnaW4oY29uLCAoUnNFbGVtZW50KWluLCAoUnNFbGVtZW50KW91dCk7CisgICAgTE9HX0FQSSgiblByb2dyYW1TdG9yZUJlZ2luLCBjb24oJXApLCBpbiglcCksIG91dCglcCkiLCBjb24sIChSc0VsZW1lbnQpaW4sIChSc0VsZW1lbnQpb3V0KTsKKyAgICByc1Byb2dyYW1TdG9yZUJlZ2luKGNvbiwgKFJzRWxlbWVudClpbiwgKFJzRWxlbWVudClvdXQpOwogfQogCiBzdGF0aWMgdm9pZAotblByb2dyYW1GcmFnbWVudFN0b3JlRGVwdGhGdW5jKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgamludCBmdW5jKQorblByb2dyYW1TdG9yZURlcHRoRnVuYyhKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIFJzQ29udGV4dCBjb24sIGppbnQgZnVuYykKIHsKLSAgICBSc0NvbnRleHQgY29uID0gKFJzQ29udGV4dCkoX2Vudi0+R2V0SW50RmllbGQoX3RoaXMsIGdDb250ZXh0SWQpKTsKLSAgICBMT0dfQVBJKCJuUHJvZ3JhbUZyYWdtZW50U3RvcmVEZXB0aEZ1bmMsIGNvbiglcCksIGZ1bmMoJWkpIiwgY29uLCBmdW5jKTsKLSAgICByc1Byb2dyYW1GcmFnbWVudFN0b3JlRGVwdGhGdW5jKGNvbiwgKFJzRGVwdGhGdW5jKWZ1bmMpOworICAgIExPR19BUEkoIm5Qcm9ncmFtU3RvcmVEZXB0aEZ1bmMsIGNvbiglcCksIGZ1bmMoJWkpIiwgY29uLCBmdW5jKTsKKyAgICByc1Byb2dyYW1TdG9yZURlcHRoRnVuYyhjb24sIChSc0RlcHRoRnVuYylmdW5jKTsKIH0KIAogc3RhdGljIHZvaWQKLW5Qcm9ncmFtRnJhZ21lbnRTdG9yZURlcHRoTWFzayhKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIGpib29sZWFuIGVuYWJsZSkKK25Qcm9ncmFtU3RvcmVEZXB0aE1hc2soSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBSc0NvbnRleHQgY29uLCBqYm9vbGVhbiBlbmFibGUpCiB7Ci0gICAgUnNDb250ZXh0IGNvbiA9IChSc0NvbnRleHQpKF9lbnYtPkdldEludEZpZWxkKF90aGlzLCBnQ29udGV4dElkKSk7Ci0gICAgTE9HX0FQSSgiblByb2dyYW1GcmFnbWVudFN0b3JlRGVwdGhNYXNrLCBjb24oJXApLCBlbmFibGUoJWkpIiwgY29uLCBlbmFibGUpOwotICAgIHJzUHJvZ3JhbUZyYWdtZW50U3RvcmVEZXB0aE1hc2soY29uLCBlbmFibGUpOworICAgIExPR19BUEkoIm5Qcm9ncmFtU3RvcmVEZXB0aE1hc2ssIGNvbiglcCksIGVuYWJsZSglaSkiLCBjb24sIGVuYWJsZSk7CisgICAgcnNQcm9ncmFtU3RvcmVEZXB0aE1hc2soY29uLCBlbmFibGUpOwogfQogCiBzdGF0aWMgdm9pZAotblByb2dyYW1GcmFnbWVudFN0b3JlQ29sb3JNYXNrKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgamJvb2xlYW4gciwgamJvb2xlYW4gZywgamJvb2xlYW4gYiwgamJvb2xlYW4gYSkKK25Qcm9ncmFtU3RvcmVDb2xvck1hc2soSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBSc0NvbnRleHQgY29uLCBqYm9vbGVhbiByLCBqYm9vbGVhbiBnLCBqYm9vbGVhbiBiLCBqYm9vbGVhbiBhKQogewotICAgIFJzQ29udGV4dCBjb24gPSAoUnNDb250ZXh0KShfZW52LT5HZXRJbnRGaWVsZChfdGhpcywgZ0NvbnRleHRJZCkpOwotICAgIExPR19BUEkoIm5Qcm9ncmFtRnJhZ21lbnRTdG9yZUNvbG9yTWFzaywgY29uKCVwKSwgciglaSksIGcoJWkpLCBiKCVpKSwgYSglaSkiLCBjb24sIHIsIGcsIGIsIGEpOwotICAgIHJzUHJvZ3JhbUZyYWdtZW50U3RvcmVDb2xvck1hc2soY29uLCByLCBnLCBiLCBhKTsKKyAgICBMT0dfQVBJKCJuUHJvZ3JhbVN0b3JlQ29sb3JNYXNrLCBjb24oJXApLCByKCVpKSwgZyglaSksIGIoJWkpLCBhKCVpKSIsIGNvbiwgciwgZywgYiwgYSk7CisgICAgcnNQcm9ncmFtU3RvcmVDb2xvck1hc2soY29uLCByLCBnLCBiLCBhKTsKIH0KIAogc3RhdGljIHZvaWQKLW5Qcm9ncmFtRnJhZ21lbnRTdG9yZUJsZW5kRnVuYyhKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIGludCBzcmMsIGludCBkc3QpCituUHJvZ3JhbVN0b3JlQmxlbmRGdW5jKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgUnNDb250ZXh0IGNvbiwgaW50IHNyYywgaW50IGRzdCkKIHsKLSAgICBSc0NvbnRleHQgY29uID0gKFJzQ29udGV4dCkoX2Vudi0+R2V0SW50RmllbGQoX3RoaXMsIGdDb250ZXh0SWQpKTsKLSAgICBMT0dfQVBJKCJuUHJvZ3JhbUZyYWdtZW50U3RvcmVCbGVuZEZ1bmMsIGNvbiglcCksIHNyYyglaSksIGRzdCglaSkiLCBjb24sIHNyYywgZHN0KTsKLSAgICByc1Byb2dyYW1GcmFnbWVudFN0b3JlQmxlbmRGdW5jKGNvbiwgKFJzQmxlbmRTcmNGdW5jKXNyYywgKFJzQmxlbmREc3RGdW5jKWRzdCk7CisgICAgTE9HX0FQSSgiblByb2dyYW1TdG9yZUJsZW5kRnVuYywgY29uKCVwKSwgc3JjKCVpKSwgZHN0KCVpKSIsIGNvbiwgc3JjLCBkc3QpOworICAgIHJzUHJvZ3JhbVN0b3JlQmxlbmRGdW5jKGNvbiwgKFJzQmxlbmRTcmNGdW5jKXNyYywgKFJzQmxlbmREc3RGdW5jKWRzdCk7CiB9CiAKIHN0YXRpYyB2b2lkCi1uUHJvZ3JhbUZyYWdtZW50U3RvcmVEaXRoZXIoSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBqYm9vbGVhbiBlbmFibGUpCituUHJvZ3JhbVN0b3JlRGl0aGVyKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgUnNDb250ZXh0IGNvbiwgamJvb2xlYW4gZW5hYmxlKQogewotICAgIFJzQ29udGV4dCBjb24gPSAoUnNDb250ZXh0KShfZW52LT5HZXRJbnRGaWVsZChfdGhpcywgZ0NvbnRleHRJZCkpOwotICAgIExPR19BUEkoIm5Qcm9ncmFtRnJhZ21lbnRTdG9yZURpdGhlciwgY29uKCVwKSwgZW5hYmxlKCVpKSIsIGNvbiwgZW5hYmxlKTsKLSAgICByc1Byb2dyYW1GcmFnbWVudFN0b3JlRGl0aGVyKGNvbiwgZW5hYmxlKTsKKyAgICBMT0dfQVBJKCJuUHJvZ3JhbVN0b3JlRGl0aGVyLCBjb24oJXApLCBlbmFibGUoJWkpIiwgY29uLCBlbmFibGUpOworICAgIHJzUHJvZ3JhbVN0b3JlRGl0aGVyKGNvbiwgZW5hYmxlKTsKIH0KIAogc3RhdGljIGppbnQKLW5Qcm9ncmFtRnJhZ21lbnRTdG9yZUNyZWF0ZShKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMpCituUHJvZ3JhbVN0b3JlQ3JlYXRlKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgUnNDb250ZXh0IGNvbikKIHsKLSAgICBSc0NvbnRleHQgY29uID0gKFJzQ29udGV4dCkoX2Vudi0+R2V0SW50RmllbGQoX3RoaXMsIGdDb250ZXh0SWQpKTsKLSAgICBMT0dfQVBJKCJuUHJvZ3JhbUZyYWdtZW50U3RvcmVDcmVhdGUsIGNvbiglcCkiLCBjb24pOwotCi0gICAgcmV0dXJuIChqaW50KXJzUHJvZ3JhbUZyYWdtZW50U3RvcmVDcmVhdGUoY29uKTsKKyAgICBMT0dfQVBJKCJuUHJvZ3JhbVN0b3JlQ3JlYXRlLCBjb24oJXApIiwgY29uKTsKKyAgICByZXR1cm4gKGppbnQpcnNQcm9ncmFtU3RvcmVDcmVhdGUoY29uKTsKIH0KIAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKIHN0YXRpYyB2b2lkCi1uUHJvZ3JhbUJpbmRDb25zdGFudHMoSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBqaW50IHZwdiwgamludCBzbG90LCBqaW50IGEpCituUHJvZ3JhbUJpbmRDb25zdGFudHMoSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBSc0NvbnRleHQgY29uLCBqaW50IHZwdiwgamludCBzbG90LCBqaW50IGEpCiB7Ci0gICAgUnNDb250ZXh0IGNvbiA9IChSc0NvbnRleHQpKF9lbnYtPkdldEludEZpZWxkKF90aGlzLCBnQ29udGV4dElkKSk7CiAgICAgTE9HX0FQSSgiblByb2dyYW1CaW5kQ29uc3RhbnRzLCBjb24oJXApLCB2cGYoJXApLCBzbG9hdCglaSksIGEoJXApIiwgY29uLCAoUnNQcm9ncmFtVmVydGV4KXZwdiwgc2xvdCwgKFJzQWxsb2NhdGlvbilhKTsKICAgICByc1Byb2dyYW1CaW5kQ29uc3RhbnRzKGNvbiwgKFJzUHJvZ3JhbSl2cHYsIHNsb3QsIChSc0FsbG9jYXRpb24pYSk7CiB9CiAKIHN0YXRpYyB2b2lkCi1uUHJvZ3JhbUJpbmRUZXh0dXJlKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgamludCB2cGYsIGppbnQgc2xvdCwgamludCBhKQorblByb2dyYW1CaW5kVGV4dHVyZShKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIFJzQ29udGV4dCBjb24sIGppbnQgdnBmLCBqaW50IHNsb3QsIGppbnQgYSkKIHsKLSAgICBSc0NvbnRleHQgY29uID0gKFJzQ29udGV4dCkoX2Vudi0+R2V0SW50RmllbGQoX3RoaXMsIGdDb250ZXh0SWQpKTsKICAgICBMT0dfQVBJKCJuUHJvZ3JhbUJpbmRUZXh0dXJlLCBjb24oJXApLCB2cGYoJXApLCBzbG90KCVpKSwgYSglcCkiLCBjb24sIChSc1Byb2dyYW1GcmFnbWVudCl2cGYsIHNsb3QsIChSc0FsbG9jYXRpb24pYSk7CiAgICAgcnNQcm9ncmFtQmluZFRleHR1cmUoY29uLCAoUnNQcm9ncmFtRnJhZ21lbnQpdnBmLCBzbG90LCAoUnNBbGxvY2F0aW9uKWEpOwogfQogCiBzdGF0aWMgdm9pZAotblByb2dyYW1CaW5kU2FtcGxlcihKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIGppbnQgdnBmLCBqaW50IHNsb3QsIGppbnQgYSkKK25Qcm9ncmFtQmluZFNhbXBsZXIoSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBSc0NvbnRleHQgY29uLCBqaW50IHZwZiwgamludCBzbG90LCBqaW50IGEpCiB7Ci0gICAgUnNDb250ZXh0IGNvbiA9IChSc0NvbnRleHQpKF9lbnYtPkdldEludEZpZWxkKF90aGlzLCBnQ29udGV4dElkKSk7CiAgICAgTE9HX0FQSSgiblByb2dyYW1CaW5kU2FtcGxlciwgY29uKCVwKSwgdnBmKCVwKSwgc2xvdCglaSksIGEoJXApIiwgY29uLCAoUnNQcm9ncmFtRnJhZ21lbnQpdnBmLCBzbG90LCAoUnNTYW1wbGVyKWEpOwogICAgIHJzUHJvZ3JhbUJpbmRTYW1wbGVyKGNvbiwgKFJzUHJvZ3JhbUZyYWdtZW50KXZwZiwgc2xvdCwgKFJzU2FtcGxlcilhKTsKIH0KQEAgLTExMTAsOSArOTc2LDggQEAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCiBzdGF0aWMgamludAotblByb2dyYW1GcmFnbWVudENyZWF0ZShKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIGppbnRBcnJheSBwYXJhbXMpCituUHJvZ3JhbUZyYWdtZW50Q3JlYXRlKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgUnNDb250ZXh0IGNvbiwgamludEFycmF5IHBhcmFtcykKIHsKLSAgICBSc0NvbnRleHQgY29uID0gKFJzQ29udGV4dCkoX2Vudi0+R2V0SW50RmllbGQoX3RoaXMsIGdDb250ZXh0SWQpKTsKICAgICBqaW50ICpwYXJhbVB0ciA9IF9lbnYtPkdldEludEFycmF5RWxlbWVudHMocGFyYW1zLCBOVUxMKTsKICAgICBqaW50IHBhcmFtTGVuID0gX2Vudi0+R2V0QXJyYXlMZW5ndGgocGFyYW1zKTsKIApAQCAtMTEyNCw5ICs5ODksOCBAQAogfQogCiBzdGF0aWMgamludAotblByb2dyYW1GcmFnbWVudENyZWF0ZTIoSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBqc3RyaW5nIHNoYWRlciwgamludEFycmF5IHBhcmFtcykKK25Qcm9ncmFtRnJhZ21lbnRDcmVhdGUyKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgUnNDb250ZXh0IGNvbiwganN0cmluZyBzaGFkZXIsIGppbnRBcnJheSBwYXJhbXMpCiB7Ci0gICAgUnNDb250ZXh0IGNvbiA9IChSc0NvbnRleHQpKF9lbnYtPkdldEludEZpZWxkKF90aGlzLCBnQ29udGV4dElkKSk7CiAgICAgY29uc3QgY2hhciogc2hhZGVyVVRGID0gX2Vudi0+R2V0U3RyaW5nVVRGQ2hhcnMoc2hhZGVyLCBOVUxMKTsKICAgICBqaW50IHNoYWRlckxlbiA9IF9lbnYtPkdldFN0cmluZ1VURkxlbmd0aChzaGFkZXIpOwogICAgIGppbnQgKnBhcmFtUHRyID0gX2Vudi0+R2V0SW50QXJyYXlFbGVtZW50cyhwYXJhbXMsIE5VTEwpOwpAQCAtMTE0NCwxNyArMTAwOCwxNSBAQAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKIHN0YXRpYyBqaW50Ci1uUHJvZ3JhbVZlcnRleENyZWF0ZShKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIGpib29sZWFuIHRleE1hdCkKK25Qcm9ncmFtVmVydGV4Q3JlYXRlKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgUnNDb250ZXh0IGNvbiwgamJvb2xlYW4gdGV4TWF0KQogewotICAgIFJzQ29udGV4dCBjb24gPSAoUnNDb250ZXh0KShfZW52LT5HZXRJbnRGaWVsZChfdGhpcywgZ0NvbnRleHRJZCkpOwogICAgIExPR19BUEkoIm5Qcm9ncmFtVmVydGV4Q3JlYXRlLCBjb24oJXApLCB0ZXhNYXQoJWkpIiwgY29uLCB0ZXhNYXQpOwogICAgIHJldHVybiAoamludClyc1Byb2dyYW1WZXJ0ZXhDcmVhdGUoY29uLCB0ZXhNYXQpOwogfQogCiBzdGF0aWMgamludAotblByb2dyYW1WZXJ0ZXhDcmVhdGUyKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywganN0cmluZyBzaGFkZXIsIGppbnRBcnJheSBwYXJhbXMpCituUHJvZ3JhbVZlcnRleENyZWF0ZTIoSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBSc0NvbnRleHQgY29uLCBqc3RyaW5nIHNoYWRlciwgamludEFycmF5IHBhcmFtcykKIHsKLSAgICBSc0NvbnRleHQgY29uID0gKFJzQ29udGV4dCkoX2Vudi0+R2V0SW50RmllbGQoX3RoaXMsIGdDb250ZXh0SWQpKTsKICAgICBjb25zdCBjaGFyKiBzaGFkZXJVVEYgPSBfZW52LT5HZXRTdHJpbmdVVEZDaGFycyhzaGFkZXIsIE5VTEwpOwogICAgIGppbnQgc2hhZGVyTGVuID0gX2Vudi0+R2V0U3RyaW5nVVRGTGVuZ3RoKHNoYWRlcik7CiAgICAgamludCAqcGFyYW1QdHIgPSBfZW52LT5HZXRJbnRBcnJheUVsZW1lbnRzKHBhcmFtcywgTlVMTCk7CkBAIC0xMTcxLDcwICsxMDMzLDYxIEBACiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAogc3RhdGljIGppbnQKLW5Qcm9ncmFtUmFzdGVyQ3JlYXRlKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgamludCBpbiwgamludCBvdXQsCi0gICAgICAgICAgICAgICAgICAgICBqYm9vbGVhbiBwb2ludFNtb290aCwgamJvb2xlYW4gbGluZVNtb290aCwgamJvb2xlYW4gcG9pbnRTcHJpdGUpCituUHJvZ3JhbVJhc3RlckNyZWF0ZShKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIFJzQ29udGV4dCBjb24sIGpib29sZWFuIHBvaW50U21vb3RoLCBqYm9vbGVhbiBsaW5lU21vb3RoLCBqYm9vbGVhbiBwb2ludFNwcml0ZSkKIHsKLSAgICBSc0NvbnRleHQgY29uID0gKFJzQ29udGV4dCkoX2Vudi0+R2V0SW50RmllbGQoX3RoaXMsIGdDb250ZXh0SWQpKTsKLSAgICBMT0dfQVBJKCJuUHJvZ3JhbVJhc3RlckNyZWF0ZSwgY29uKCVwKSwgaW4oJXApLCBvdXQoJXApLCBwb2ludFNtb290aCglaSksIGxpbmVTbW9vdGgoJWkpLCBwb2ludFNwcml0ZSglaSkiLAotICAgICAgICAgICAgY29uLCAoUnNFbGVtZW50KWluLCAoUnNFbGVtZW50KW91dCwgcG9pbnRTbW9vdGgsIGxpbmVTbW9vdGgsIHBvaW50U3ByaXRlKTsKLSAgICByZXR1cm4gKGppbnQpcnNQcm9ncmFtUmFzdGVyQ3JlYXRlKGNvbiwgKFJzRWxlbWVudClpbiwgKFJzRWxlbWVudClvdXQsIHBvaW50U21vb3RoLCBsaW5lU21vb3RoLCBwb2ludFNwcml0ZSk7CisgICAgTE9HX0FQSSgiblByb2dyYW1SYXN0ZXJDcmVhdGUsIGNvbiglcCksIHBvaW50U21vb3RoKCVpKSwgbGluZVNtb290aCglaSksIHBvaW50U3ByaXRlKCVpKSIsCisgICAgICAgICAgICBjb24sIHBvaW50U21vb3RoLCBsaW5lU21vb3RoLCBwb2ludFNwcml0ZSk7CisgICAgcmV0dXJuIChqaW50KXJzUHJvZ3JhbVJhc3RlckNyZWF0ZShjb24sIHBvaW50U21vb3RoLCBsaW5lU21vb3RoLCBwb2ludFNwcml0ZSk7CiB9CiAKIHN0YXRpYyB2b2lkCi1uUHJvZ3JhbVJhc3RlclNldFBvaW50U2l6ZShKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIGppbnQgdnByLCBqZmxvYXQgdikKK25Qcm9ncmFtUmFzdGVyU2V0TGluZVdpZHRoKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgUnNDb250ZXh0IGNvbiwgamludCB2cHIsIGpmbG9hdCB2KQogewotICAgIFJzQ29udGV4dCBjb24gPSAoUnNDb250ZXh0KShfZW52LT5HZXRJbnRGaWVsZChfdGhpcywgZ0NvbnRleHRJZCkpOwotICAgIExPR19BUEkoIm5Qcm9ncmFtUmFzdGVyU2V0UG9pbnRTaXplLCBjb24oJXApLCB2cGYoJXApLCB2YWx1ZSglZikiLCBjb24sIChSc1Byb2dyYW1SYXN0ZXIpdnByLCB2KTsKLSAgICByc1Byb2dyYW1SYXN0ZXJTZXRQb2ludFNpemUoY29uLCAoUnNQcm9ncmFtRnJhZ21lbnQpdnByLCB2KTsKLX0KLQotc3RhdGljIHZvaWQKLW5Qcm9ncmFtUmFzdGVyU2V0TGluZVdpZHRoKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgamludCB2cHIsIGpmbG9hdCB2KQotewotICAgIFJzQ29udGV4dCBjb24gPSAoUnNDb250ZXh0KShfZW52LT5HZXRJbnRGaWVsZChfdGhpcywgZ0NvbnRleHRJZCkpOwogICAgIExPR19BUEkoIm5Qcm9ncmFtUmFzdGVyU2V0TGluZVdpZHRoLCBjb24oJXApLCB2cGYoJXApLCB2YWx1ZSglZikiLCBjb24sIChSc1Byb2dyYW1SYXN0ZXIpdnByLCB2KTsKLSAgICByc1Byb2dyYW1SYXN0ZXJTZXRMaW5lV2lkdGgoY29uLCAoUnNQcm9ncmFtRnJhZ21lbnQpdnByLCB2KTsKKyAgICByc1Byb2dyYW1SYXN0ZXJTZXRMaW5lV2lkdGgoY29uLCAoUnNQcm9ncmFtUmFzdGVyKXZwciwgdik7Cit9CisKK3N0YXRpYyB2b2lkCituUHJvZ3JhbVJhc3RlclNldEN1bGxNb2RlKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgUnNDb250ZXh0IGNvbiwgamludCB2cHIsIGppbnQgdikKK3sKKyAgICBMT0dfQVBJKCJuUHJvZ3JhbVJhc3RlclNldEN1bGxNb2RlLCBjb24oJXApLCB2cGYoJXApLCB2YWx1ZSglaSkiLCBjb24sIChSc1Byb2dyYW1SYXN0ZXIpdnByLCB2KTsKKyAgICByc1Byb2dyYW1SYXN0ZXJTZXRDdWxsTW9kZShjb24sIChSc1Byb2dyYW1SYXN0ZXIpdnByLCAoUnNDdWxsTW9kZSl2KTsKIH0KIAogCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAogc3RhdGljIHZvaWQKLW5Db250ZXh0QmluZFJvb3RTY3JpcHQoSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBqaW50IHNjcmlwdCkKK25Db250ZXh0QmluZFJvb3RTY3JpcHQoSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBSc0NvbnRleHQgY29uLCBqaW50IHNjcmlwdCkKIHsKLSAgICBSc0NvbnRleHQgY29uID0gKFJzQ29udGV4dCkoX2Vudi0+R2V0SW50RmllbGQoX3RoaXMsIGdDb250ZXh0SWQpKTsKICAgICBMT0dfQVBJKCJuQ29udGV4dEJpbmRSb290U2NyaXB0LCBjb24oJXApLCBzY3JpcHQoJXApIiwgY29uLCAoUnNTY3JpcHQpc2NyaXB0KTsKICAgICByc0NvbnRleHRCaW5kUm9vdFNjcmlwdChjb24sIChSc1NjcmlwdClzY3JpcHQpOwogfQogCiBzdGF0aWMgdm9pZAotbkNvbnRleHRCaW5kUHJvZ3JhbUZyYWdtZW50U3RvcmUoSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBqaW50IHBmcykKK25Db250ZXh0QmluZFByb2dyYW1TdG9yZShKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIFJzQ29udGV4dCBjb24sIGppbnQgcGZzKQogewotICAgIFJzQ29udGV4dCBjb24gPSAoUnNDb250ZXh0KShfZW52LT5HZXRJbnRGaWVsZChfdGhpcywgZ0NvbnRleHRJZCkpOwotICAgIExPR19BUEkoIm5Db250ZXh0QmluZFByb2dyYW1GcmFnbWVudFN0b3JlLCBjb24oJXApLCBwZnMoJXApIiwgY29uLCAoUnNQcm9ncmFtRnJhZ21lbnRTdG9yZSlwZnMpOwotICAgIHJzQ29udGV4dEJpbmRQcm9ncmFtRnJhZ21lbnRTdG9yZShjb24sIChSc1Byb2dyYW1GcmFnbWVudFN0b3JlKXBmcyk7CisgICAgTE9HX0FQSSgibkNvbnRleHRCaW5kUHJvZ3JhbVN0b3JlLCBjb24oJXApLCBwZnMoJXApIiwgY29uLCAoUnNQcm9ncmFtU3RvcmUpcGZzKTsKKyAgICByc0NvbnRleHRCaW5kUHJvZ3JhbVN0b3JlKGNvbiwgKFJzUHJvZ3JhbVN0b3JlKXBmcyk7CiB9CiAKIHN0YXRpYyB2b2lkCi1uQ29udGV4dEJpbmRQcm9ncmFtRnJhZ21lbnQoSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBqaW50IHBmKQorbkNvbnRleHRCaW5kUHJvZ3JhbUZyYWdtZW50KEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgUnNDb250ZXh0IGNvbiwgamludCBwZikKIHsKLSAgICBSc0NvbnRleHQgY29uID0gKFJzQ29udGV4dCkoX2Vudi0+R2V0SW50RmllbGQoX3RoaXMsIGdDb250ZXh0SWQpKTsKICAgICBMT0dfQVBJKCJuQ29udGV4dEJpbmRQcm9ncmFtRnJhZ21lbnQsIGNvbiglcCksIHBmKCVwKSIsIGNvbiwgKFJzUHJvZ3JhbUZyYWdtZW50KXBmKTsKICAgICByc0NvbnRleHRCaW5kUHJvZ3JhbUZyYWdtZW50KGNvbiwgKFJzUHJvZ3JhbUZyYWdtZW50KXBmKTsKIH0KIAogc3RhdGljIHZvaWQKLW5Db250ZXh0QmluZFByb2dyYW1WZXJ0ZXgoSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBqaW50IHBmKQorbkNvbnRleHRCaW5kUHJvZ3JhbVZlcnRleChKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIFJzQ29udGV4dCBjb24sIGppbnQgcGYpCiB7Ci0gICAgUnNDb250ZXh0IGNvbiA9IChSc0NvbnRleHQpKF9lbnYtPkdldEludEZpZWxkKF90aGlzLCBnQ29udGV4dElkKSk7CiAgICAgTE9HX0FQSSgibkNvbnRleHRCaW5kUHJvZ3JhbVZlcnRleCwgY29uKCVwKSwgcGYoJXApIiwgY29uLCAoUnNQcm9ncmFtVmVydGV4KXBmKTsKICAgICByc0NvbnRleHRCaW5kUHJvZ3JhbVZlcnRleChjb24sIChSc1Byb2dyYW1WZXJ0ZXgpcGYpOwogfQogCiBzdGF0aWMgdm9pZAotbkNvbnRleHRCaW5kUHJvZ3JhbVJhc3RlcihKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIGppbnQgcGYpCituQ29udGV4dEJpbmRQcm9ncmFtUmFzdGVyKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgUnNDb250ZXh0IGNvbiwgamludCBwZikKIHsKLSAgICBSc0NvbnRleHQgY29uID0gKFJzQ29udGV4dCkoX2Vudi0+R2V0SW50RmllbGQoX3RoaXMsIGdDb250ZXh0SWQpKTsKICAgICBMT0dfQVBJKCJuQ29udGV4dEJpbmRQcm9ncmFtUmFzdGVyLCBjb24oJXApLCBwZiglcCkiLCBjb24sIChSc1Byb2dyYW1SYXN0ZXIpcGYpOwogICAgIHJzQ29udGV4dEJpbmRQcm9ncmFtUmFzdGVyKGNvbiwgKFJzUHJvZ3JhbVJhc3RlcilwZik7CiB9CkBAIC0xMjQzLDEwOCArMTA5NiwxMDAgQEAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCiBzdGF0aWMgdm9pZAotblNhbXBsZXJCZWdpbihKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMpCituU2FtcGxlckJlZ2luKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgUnNDb250ZXh0IGNvbikKIHsKLSAgICBSc0NvbnRleHQgY29uID0gKFJzQ29udGV4dCkoX2Vudi0+R2V0SW50RmllbGQoX3RoaXMsIGdDb250ZXh0SWQpKTsKICAgICBMT0dfQVBJKCJuU2FtcGxlckJlZ2luLCBjb24oJXApIiwgY29uKTsKICAgICByc1NhbXBsZXJCZWdpbihjb24pOwogfQogCiBzdGF0aWMgdm9pZAotblNhbXBsZXJTZXQoSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBqaW50IHAsIGppbnQgdikKK25TYW1wbGVyU2V0KEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgUnNDb250ZXh0IGNvbiwgamludCBwLCBqaW50IHYpCiB7Ci0gICAgUnNDb250ZXh0IGNvbiA9IChSc0NvbnRleHQpKF9lbnYtPkdldEludEZpZWxkKF90aGlzLCBnQ29udGV4dElkKSk7CiAgICAgTE9HX0FQSSgiblNhbXBsZXJTZXQsIGNvbiglcCksIHBhcmFtKCVpKSwgdmFsdWUoJWkpIiwgY29uLCBwLCB2KTsKICAgICByc1NhbXBsZXJTZXQoY29uLCAoUnNTYW1wbGVyUGFyYW0pcCwgKFJzU2FtcGxlclZhbHVlKXYpOwogfQogCiBzdGF0aWMgamludAotblNhbXBsZXJDcmVhdGUoSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzKQorblNhbXBsZXJDcmVhdGUoSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBSc0NvbnRleHQgY29uKQogewotICAgIFJzQ29udGV4dCBjb24gPSAoUnNDb250ZXh0KShfZW52LT5HZXRJbnRGaWVsZChfdGhpcywgZ0NvbnRleHRJZCkpOwogICAgIExPR19BUEkoIm5TYW1wbGVyQ3JlYXRlLCBjb24oJXApIiwgY29uKTsKICAgICByZXR1cm4gKGppbnQpcnNTYW1wbGVyQ3JlYXRlKGNvbik7CiB9CiAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCi1zdGF0aWMgdm9pZAotbkxpZ2h0QmVnaW4oSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzKQotewotICAgIFJzQ29udGV4dCBjb24gPSAoUnNDb250ZXh0KShfZW52LT5HZXRJbnRGaWVsZChfdGhpcywgZ0NvbnRleHRJZCkpOwotICAgIExPR19BUEkoIm5MaWdodEJlZ2luLCBjb24oJXApIiwgY29uKTsKLSAgICByc0xpZ2h0QmVnaW4oY29uKTsKLX0KLQotc3RhdGljIHZvaWQKLW5MaWdodFNldElzTW9ubyhKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIGpib29sZWFuIGlzTW9ubykKLXsKLSAgICBSc0NvbnRleHQgY29uID0gKFJzQ29udGV4dCkoX2Vudi0+R2V0SW50RmllbGQoX3RoaXMsIGdDb250ZXh0SWQpKTsKLSAgICBMT0dfQVBJKCJuTGlnaHRTZXRJc01vbm8sIGNvbiglcCksIGlzTW9ubyglaSkiLCBjb24sIGlzTW9ubyk7Ci0gICAgcnNMaWdodFNldE1vbm9jaHJvbWF0aWMoY29uLCBpc01vbm8pOwotfQotCi1zdGF0aWMgdm9pZAotbkxpZ2h0U2V0SXNMb2NhbChKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIGpib29sZWFuIGlzTG9jYWwpCi17Ci0gICAgUnNDb250ZXh0IGNvbiA9IChSc0NvbnRleHQpKF9lbnYtPkdldEludEZpZWxkKF90aGlzLCBnQ29udGV4dElkKSk7Ci0gICAgTE9HX0FQSSgibkxpZ2h0U2V0SXNMb2NhbCwgY29uKCVwKSwgaXNMb2NhbCglaSkiLCBjb24sIGlzTG9jYWwpOwotICAgIHJzTGlnaHRTZXRMb2NhbChjb24sIGlzTG9jYWwpOwotfQotCiBzdGF0aWMgamludAotbkxpZ2h0Q3JlYXRlKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcykKK25NZXNoQ3JlYXRlKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgUnNDb250ZXh0IGNvbiwgamludCB2dHhDb3VudCwgamludCBpZHhDb3VudCkKIHsKLSAgICBSc0NvbnRleHQgY29uID0gKFJzQ29udGV4dCkoX2Vudi0+R2V0SW50RmllbGQoX3RoaXMsIGdDb250ZXh0SWQpKTsKLSAgICBMT0dfQVBJKCJuTGlnaHRDcmVhdGUsIGNvbiglcCkiLCBjb24pOwotICAgIHJldHVybiAoamludClyc0xpZ2h0Q3JlYXRlKGNvbik7Ci19Ci0KLXN0YXRpYyB2b2lkCi1uTGlnaHRTZXRDb2xvcihKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIGppbnQgbGlnaHQsIGZsb2F0IHIsIGZsb2F0IGcsIGZsb2F0IGIpCi17Ci0gICAgUnNDb250ZXh0IGNvbiA9IChSc0NvbnRleHQpKF9lbnYtPkdldEludEZpZWxkKF90aGlzLCBnQ29udGV4dElkKSk7Ci0gICAgTE9HX0FQSSgibkxpZ2h0U2V0Q29sb3IsIGNvbiglcCksIGxpZ2h0KCVwKSwgciglZiksIGcoJWYpLCBiKCVmKSIsIGNvbiwgKFJzTGlnaHQpbGlnaHQsIHIsIGcsIGIpOwotICAgIHJzTGlnaHRTZXRDb2xvcihjb24sIChSc0xpZ2h0KWxpZ2h0LCByLCBnLCBiKTsKLX0KLQotc3RhdGljIHZvaWQKLW5MaWdodFNldFBvc2l0aW9uKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgamludCBsaWdodCwgZmxvYXQgeCwgZmxvYXQgeSwgZmxvYXQgeikKLXsKLSAgICBSc0NvbnRleHQgY29uID0gKFJzQ29udGV4dCkoX2Vudi0+R2V0SW50RmllbGQoX3RoaXMsIGdDb250ZXh0SWQpKTsKLSAgICBMT0dfQVBJKCJuTGlnaHRTZXRQb3NpdGlvbiwgY29uKCVwKSwgbGlnaHQoJXApLCB4KCVmKSwgeSglZiksIHooJWYpIiwgY29uLCAoUnNMaWdodClsaWdodCwgeCwgeSwgeik7Ci0gICAgcnNMaWdodFNldFBvc2l0aW9uKGNvbiwgKFJzTGlnaHQpbGlnaHQsIHgsIHksIHopOwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIGppbnQKLW5TaW1wbGVNZXNoQ3JlYXRlKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgamludCBiYXRjaElELCBqaW50IGluZGV4SUQsIGppbnRBcnJheSB2dHhJRHMsIGppbnQgcHJpbUlEKQotewotICAgIFJzQ29udGV4dCBjb24gPSAoUnNDb250ZXh0KShfZW52LT5HZXRJbnRGaWVsZChfdGhpcywgZ0NvbnRleHRJZCkpOwotICAgIGppbnQgbGVuID0gX2Vudi0+R2V0QXJyYXlMZW5ndGgodnR4SURzKTsKLSAgICBMT0dfQVBJKCJuU2ltcGxlTWVzaENyZWF0ZSwgY29uKCVwKSwgYmF0Y2hJRCglaSksIGluZGV4SUQoJWkpLCB2dHhJRHMubGVuKCVpKSwgcHJpbUlEKCVpKSIsCi0gICAgICAgICAgICBjb24sIGJhdGNoSUQsIGluZGV4SUQsIGxlbiwgcHJpbUlEKTsKLSAgICBqaW50ICpwdHIgPSBfZW52LT5HZXRJbnRBcnJheUVsZW1lbnRzKHZ0eElEcywgTlVMTCk7Ci0gICAgaW50IGlkID0gKGludClyc1NpbXBsZU1lc2hDcmVhdGUoY29uLCAodm9pZCAqKWJhdGNoSUQsICh2b2lkICopaW5kZXhJRCwgKHZvaWQgKiopcHRyLCBsZW4sIHByaW1JRCk7Ci0gICAgX2Vudi0+UmVsZWFzZUludEFycmF5RWxlbWVudHModnR4SURzLCBwdHIsIDAvKkpOSV9BQk9SVCovKTsKKyAgICBMT0dfQVBJKCJuTWVzaENyZWF0ZSwgY29uKCVwKSwgdnR4Q291bnQoJWkpLCBpZHhDb3VudCglaSkiLCBjb24sIHZ0eENvdW50LCBpZHhDb3VudCk7CisgICAgaW50IGlkID0gKGludClyc01lc2hDcmVhdGUoY29uLCB2dHhDb3VudCwgaWR4Q291bnQpOwogICAgIHJldHVybiBpZDsKIH0KIAogc3RhdGljIHZvaWQKLW5TaW1wbGVNZXNoQmluZFZlcnRleChKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIGppbnQgcywgamludCBhbGxvYywgamludCBzbG90KQorbk1lc2hCaW5kVmVydGV4KEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgUnNDb250ZXh0IGNvbiwgamludCBtZXNoLCBqaW50IGFsbG9jLCBqaW50IHNsb3QpCiB7Ci0gICAgUnNDb250ZXh0IGNvbiA9IChSc0NvbnRleHQpKF9lbnYtPkdldEludEZpZWxkKF90aGlzLCBnQ29udGV4dElkKSk7Ci0gICAgTE9HX0FQSSgiblNpbXBsZU1lc2hCaW5kVmVydGV4LCBjb24oJXApLCBTaW1wbGVNZXNoKCVwKSwgQWxsb2MoJXApLCBzbG90KCVpKSIsIGNvbiwgKFJzU2ltcGxlTWVzaClzLCAoUnNBbGxvY2F0aW9uKWFsbG9jLCBzbG90KTsKLSAgICByc1NpbXBsZU1lc2hCaW5kVmVydGV4KGNvbiwgKFJzU2ltcGxlTWVzaClzLCAoUnNBbGxvY2F0aW9uKWFsbG9jLCBzbG90KTsKKyAgICBMT0dfQVBJKCJuTWVzaEJpbmRWZXJ0ZXgsIGNvbiglcCksIE1lc2goJXApLCBBbGxvYyglcCksIHNsb3QoJWkpIiwgY29uLCAoUnNNZXNoKW1lc2gsIChSc0FsbG9jYXRpb24pYWxsb2MsIHNsb3QpOworICAgIHJzTWVzaEJpbmRWZXJ0ZXgoY29uLCAoUnNNZXNoKW1lc2gsIChSc0FsbG9jYXRpb24pYWxsb2MsIHNsb3QpOwogfQogCiBzdGF0aWMgdm9pZAotblNpbXBsZU1lc2hCaW5kSW5kZXgoSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBqaW50IHMsIGppbnQgYWxsb2MpCituTWVzaEJpbmRJbmRleChKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIFJzQ29udGV4dCBjb24sIGppbnQgbWVzaCwgamludCBhbGxvYywgamludCBwcmltSUQsIGppbnQgc2xvdCkKIHsKLSAgICBSc0NvbnRleHQgY29uID0gKFJzQ29udGV4dCkoX2Vudi0+R2V0SW50RmllbGQoX3RoaXMsIGdDb250ZXh0SWQpKTsKLSAgICBMT0dfQVBJKCJuU2ltcGxlTWVzaEJpbmRJbmRleCwgY29uKCVwKSwgU2ltcGxlTWVzaCglcCksIEFsbG9jKCVwKSIsIGNvbiwgKFJzU2ltcGxlTWVzaClzLCAoUnNBbGxvY2F0aW9uKWFsbG9jKTsKLSAgICByc1NpbXBsZU1lc2hCaW5kSW5kZXgoY29uLCAoUnNTaW1wbGVNZXNoKXMsIChSc0FsbG9jYXRpb24pYWxsb2MpOworICAgIExPR19BUEkoIm5NZXNoQmluZEluZGV4LCBjb24oJXApLCBNZXNoKCVwKSwgQWxsb2MoJXApIiwgY29uLCAoUnNNZXNoKW1lc2gsIChSc0FsbG9jYXRpb24pYWxsb2MpOworICAgIHJzTWVzaEJpbmRJbmRleChjb24sIChSc01lc2gpbWVzaCwgKFJzQWxsb2NhdGlvbilhbGxvYywgcHJpbUlELCBzbG90KTsKK30KKworc3RhdGljIGppbnQKK25NZXNoR2V0VmVydGV4QnVmZmVyQ291bnQoSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBSc0NvbnRleHQgY29uLCBqaW50IG1lc2gpCit7CisgICAgTE9HX0FQSSgibk1lc2hHZXRWZXJ0ZXhCdWZmZXJDb3VudCwgY29uKCVwKSwgTWVzaCglcCkiLCBjb24sIChSc01lc2gpbWVzaCk7CisgICAgamludCB2dHhDb3VudCA9IDA7CisgICAgcnNNZXNoR2V0VmVydGV4QnVmZmVyQ291bnQoY29uLCAoUnNNZXNoKW1lc2gsICZ2dHhDb3VudCk7CisgICAgcmV0dXJuIHZ0eENvdW50OworfQorCitzdGF0aWMgamludAorbk1lc2hHZXRJbmRleENvdW50KEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgUnNDb250ZXh0IGNvbiwgamludCBtZXNoKQoreworICAgIExPR19BUEkoIm5NZXNoR2V0SW5kZXhDb3VudCwgY29uKCVwKSwgTWVzaCglcCkiLCBjb24sIChSc01lc2gpbWVzaCk7CisgICAgamludCBpZHhDb3VudCA9IDA7CisgICAgcnNNZXNoR2V0SW5kZXhDb3VudChjb24sIChSc01lc2gpbWVzaCwgJmlkeENvdW50KTsKKyAgICByZXR1cm4gaWR4Q291bnQ7Cit9CisKK3N0YXRpYyB2b2lkCituTWVzaEdldFZlcnRpY2VzKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgUnNDb250ZXh0IGNvbiwgamludCBtZXNoLCBqaW50QXJyYXkgX2lkcywgaW50IG51bVZ0eElEcykKK3sKKyAgICBMT0dfQVBJKCJuTWVzaEdldFZlcnRpY2VzLCBjb24oJXApLCBNZXNoKCVwKSIsIGNvbiwgKFJzTWVzaCltZXNoKTsKKworICAgIFJzQWxsb2NhdGlvbiAqYWxsb2NzID0gKFJzQWxsb2NhdGlvbiopbWFsbG9jKCh1aW50MzJfdCludW1WdHhJRHMgKiBzaXplb2YoUnNBbGxvY2F0aW9uKSk7CisgICAgcnNNZXNoR2V0VmVydGljZXMoY29uLCAoUnNNZXNoKW1lc2gsIGFsbG9jcywgKHVpbnQzMl90KW51bVZ0eElEcyk7CisKKyAgICBmb3IoamludCBpID0gMDsgaSA8IG51bVZ0eElEczsgaSArKykgeworICAgICAgICBfZW52LT5TZXRJbnRBcnJheVJlZ2lvbihfaWRzLCBpLCAxLCAoY29uc3QgamludCopJmFsbG9jc1tpXSk7CisgICAgfQorCisgICAgZnJlZShhbGxvY3MpOworfQorCitzdGF0aWMgdm9pZAorbk1lc2hHZXRJbmRpY2VzKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgUnNDb250ZXh0IGNvbiwgamludCBtZXNoLCBqaW50QXJyYXkgX2lkeElkcywgamludEFycmF5IF9wcmltaXRpdmVzLCBpbnQgbnVtSW5kaWNlcykKK3sKKyAgICBMT0dfQVBJKCJuTWVzaEdldFZlcnRpY2VzLCBjb24oJXApLCBNZXNoKCVwKSIsIGNvbiwgKFJzTWVzaCltZXNoKTsKKworICAgIFJzQWxsb2NhdGlvbiAqYWxsb2NzID0gKFJzQWxsb2NhdGlvbiopbWFsbG9jKCh1aW50MzJfdCludW1JbmRpY2VzICogc2l6ZW9mKFJzQWxsb2NhdGlvbikpOworICAgIHVpbnQzMl90ICpwcmltcz0gKHVpbnQzMl90KiltYWxsb2MoKHVpbnQzMl90KW51bUluZGljZXMgKiBzaXplb2YodWludDMyX3QpKTsKKworICAgIHJzTWVzaEdldEluZGljZXMoY29uLCAoUnNNZXNoKW1lc2gsIGFsbG9jcywgcHJpbXMsICh1aW50MzJfdCludW1JbmRpY2VzKTsKKworICAgIGZvcihqaW50IGkgPSAwOyBpIDwgbnVtSW5kaWNlczsgaSArKykgeworICAgICAgICBfZW52LT5TZXRJbnRBcnJheVJlZ2lvbihfaWR4SWRzLCBpLCAxLCAoY29uc3QgamludCopJmFsbG9jc1tpXSk7CisgICAgICAgIF9lbnYtPlNldEludEFycmF5UmVnaW9uKF9wcmltaXRpdmVzLCBpLCAxLCAoY29uc3QgamludCopJnByaW1zW2ldKTsKKyAgICB9CisKKyAgICBmcmVlKGFsbG9jcyk7CisgICAgZnJlZShwcmltcyk7CiB9CiAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpAQCAtMTM1OSwxMjQgKzEyMDQsMTI5IEBACiB7Im5EZXZpY2VDcmVhdGUiLCAgICAgICAgICAgICAgICAgICIoKUkiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopbkRldmljZUNyZWF0ZSB9LAogeyJuRGV2aWNlRGVzdHJveSIsICAgICAgICAgICAgICAgICAiKEkpViIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5EZXZpY2VEZXN0cm95IH0sCiB7Im5EZXZpY2VTZXRDb25maWciLCAgICAgICAgICAgICAgICIoSUlJKVYiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopbkRldmljZVNldENvbmZpZyB9LAoteyJuQ29udGV4dENyZWF0ZSIsICAgICAgICAgICAgICAgICAiKElJKUkiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5Db250ZXh0Q3JlYXRlIH0sCi17Im5Db250ZXh0Q3JlYXRlR0wiLCAgICAgICAgICAgICAgICIoSUlaKUkiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopbkNvbnRleHRDcmVhdGVHTCB9LAoteyJuQ29udGV4dFNldFByaW9yaXR5IiwgICAgICAgICAgICAiKEkpViIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5Db250ZXh0U2V0UHJpb3JpdHkgfSwKLXsibkNvbnRleHRTZXRTdXJmYWNlIiwgICAgICAgICAgICAgIihJSUxhbmRyb2lkL3ZpZXcvU3VyZmFjZTspViIsICAgICAgICAgICh2b2lkKiluQ29udGV4dFNldFN1cmZhY2UgfSwKLXsibkNvbnRleHREZXN0cm95IiwgICAgICAgICAgICAgICAgIihJKVYiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluQ29udGV4dERlc3Ryb3kgfSwKLXsibkNvbnRleHREdW1wIiwgICAgICAgICAgICAgICAgICAgIihJKVYiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluQ29udGV4dER1bXAgfSwKLXsibkNvbnRleHRQYXVzZSIsICAgICAgICAgICAgICAgICAgIigpViIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluQ29udGV4dFBhdXNlIH0sCi17Im5Db250ZXh0UmVzdW1lIiwgICAgICAgICAgICAgICAgICIoKVYiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopbkNvbnRleHRSZXN1bWUgfSwKLXsibkFzc2lnbk5hbWUiLCAgICAgICAgICAgICAgICAgICAgIihJW0IpViIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluQXNzaWduTmFtZSB9LAoteyJuT2JqRGVzdHJveSIsICAgICAgICAgICAgICAgICAgICAiKEkpViIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5PYmpEZXN0cm95IH0sCi17Im5PYmpEZXN0cm95T09CIiwgICAgICAgICAgICAgICAgICIoSSlWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopbk9iakRlc3Ryb3lPT0IgfSwKLXsibkNvbnRleHRHZXRNZXNzYWdlIiwgICAgICAgICAgICAgIihbSVopSSIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluQ29udGV4dEdldE1lc3NhZ2UgfSwKLXsibkNvbnRleHRJbml0VG9DbGllbnQiLCAgICAgICAgICAgIigpViIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluQ29udGV4dEluaXRUb0NsaWVudCB9LAoteyJuQ29udGV4dERlaW5pdFRvQ2xpZW50IiwgICAgICAgICAiKClWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5Db250ZXh0RGVpbml0VG9DbGllbnQgfSwKK3sibkNvbnRleHRHZXRNZXNzYWdlIiwgICAgICAgICAgICAgIihJW0laKUkiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopbkNvbnRleHRHZXRNZXNzYWdlIH0sCit7Im5Db250ZXh0SW5pdFRvQ2xpZW50IiwgICAgICAgICAgICIoSSlWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5Db250ZXh0SW5pdFRvQ2xpZW50IH0sCit7Im5Db250ZXh0RGVpbml0VG9DbGllbnQiLCAgICAgICAgICIoSSlWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5Db250ZXh0RGVpbml0VG9DbGllbnQgfSwKIAoteyJuRmlsZU9wZW4iLCAgICAgICAgICAgICAgICAgICAgICAiKFtCKUkiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5GaWxlT3BlbiB9LAogCi17Im5FbGVtZW50Q3JlYXRlIiwgICAgICAgICAgICAgICAgICIoSUlaSSlJIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopbkVsZW1lbnRDcmVhdGUgfSwKLXsibkVsZW1lbnRDcmVhdGUyIiwgICAgICAgICAgICAgICAgIihbSVtMamF2YS9sYW5nL1N0cmluZzspSSIsICAgICAgICAgICAgICh2b2lkKiluRWxlbWVudENyZWF0ZTIgfSwKKy8vIEFsbCBtZXRob2RzIGJlbG93IGFyZSB0aHJlYWQgcHJvdGVjdGVkIGluIGphdmEuCit7InJzbkNvbnRleHRDcmVhdGUiLCAgICAgICAgICAgICAgICAgIihJSSlJIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluQ29udGV4dENyZWF0ZSB9LAoreyJyc25Db250ZXh0Q3JlYXRlR0wiLCAgICAgICAgICAgICAgICIoSUlaKUkiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopbkNvbnRleHRDcmVhdGVHTCB9LAoreyJyc25Db250ZXh0RmluaXNoIiwgICAgICAgICAgICAgICAgICIoSSlWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5Db250ZXh0RmluaXNoIH0sCit7InJzbkNvbnRleHRTZXRQcmlvcml0eSIsICAgICAgICAgICAgIihJSSlWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopbkNvbnRleHRTZXRQcmlvcml0eSB9LAoreyJyc25Db250ZXh0U2V0U3VyZmFjZSIsICAgICAgICAgICAgICIoSUlJTGFuZHJvaWQvdmlldy9TdXJmYWNlOylWIiwgICAgICAgICAgKHZvaWQqKW5Db250ZXh0U2V0U3VyZmFjZSB9LAoreyJyc25Db250ZXh0RGVzdHJveSIsICAgICAgICAgICAgICAgICIoSSlWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopbkNvbnRleHREZXN0cm95IH0sCit7InJzbkNvbnRleHREdW1wIiwgICAgICAgICAgICAgICAgICAgIihJSSlWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopbkNvbnRleHREdW1wIH0sCit7InJzbkNvbnRleHRQYXVzZSIsICAgICAgICAgICAgICAgICAgIihJKVYiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopbkNvbnRleHRQYXVzZSB9LAoreyJyc25Db250ZXh0UmVzdW1lIiwgICAgICAgICAgICAgICAgICIoSSlWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5Db250ZXh0UmVzdW1lIH0sCit7InJzbkFzc2lnbk5hbWUiLCAgICAgICAgICAgICAgICAgICAgIihJSVtCKVYiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopbkFzc2lnbk5hbWUgfSwKK3sicnNuR2V0TmFtZSIsICAgICAgICAgICAgICAgICAgICAgICAiKElJKUxqYXZhL2xhbmcvU3RyaW5nOyIsICAgICAgICAgICAgICAgKHZvaWQqKW5HZXROYW1lIH0sCit7InJzbk9iakRlc3Ryb3kiLCAgICAgICAgICAgICAgICAgICAgIihJSSlWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopbk9iakRlc3Ryb3kgfSwKIAoteyJuVHlwZUJlZ2luIiwgICAgICAgICAgICAgICAgICAgICAiKEkpViIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5UeXBlQmVnaW4gfSwKLXsiblR5cGVBZGQiLCAgICAgICAgICAgICAgICAgICAgICAgIihJSSlWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluVHlwZUFkZCB9LAoteyJuVHlwZUNyZWF0ZSIsICAgICAgICAgICAgICAgICAgICAiKClJIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5UeXBlQ3JlYXRlIH0sCi17Im5UeXBlRmluYWxEZXN0cm95IiwgICAgICAgICAgICAgICIoTGFuZHJvaWQvcmVuZGVyc2NyaXB0L1R5cGU7KVYiLCAgICAgICAodm9pZCopblR5cGVGaW5hbERlc3Ryb3kgfSwKLXsiblR5cGVTZXR1cEZpZWxkcyIsICAgICAgICAgICAgICAgIihMYW5kcm9pZC9yZW5kZXJzY3JpcHQvVHlwZTtbSVtJW0xqYXZhL2xhbmcvcmVmbGVjdC9GaWVsZDspViIsICh2b2lkKiluVHlwZVNldHVwRmllbGRzIH0sCit7InJzbkZpbGVPcGVuIiwgICAgICAgICAgICAgICAgICAgICAgIihJW0IpSSIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopbkZpbGVPcGVuIH0sCit7InJzbkZpbGVBM0RDcmVhdGVGcm9tQXNzZXRTdHJlYW0iLCAgIihJSSlJIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopbkZpbGVBM0RDcmVhdGVGcm9tQXNzZXRTdHJlYW0gfSwKK3sicnNuRmlsZUEzREdldE51bUluZGV4RW50cmllcyIsICAgICAiKElJKUkiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluRmlsZUEzREdldE51bUluZGV4RW50cmllcyB9LAoreyJyc25GaWxlQTNER2V0SW5kZXhFbnRyaWVzIiwgICAgICAgICIoSUlJW0lbTGphdmEvbGFuZy9TdHJpbmc7KVYiLCAgICAgICAgICAodm9pZCopbkZpbGVBM0RHZXRJbmRleEVudHJpZXMgfSwKK3sicnNuRmlsZUEzREdldEVudHJ5QnlJbmRleCIsICAgICAgICAiKElJSSlJIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluRmlsZUEzREdldEVudHJ5QnlJbmRleCB9LAogCi17Im5BbGxvY2F0aW9uQ3JlYXRlVHlwZWQiLCAgICAgICAgICIoSSlJIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopbkFsbG9jYXRpb25DcmVhdGVUeXBlZCB9LAoteyJuQWxsb2NhdGlvbkNyZWF0ZUZyb21CaXRtYXAiLCAgICAiKElaTGFuZHJvaWQvZ3JhcGhpY3MvQml0bWFwOylJIiwgICAgICAgKHZvaWQqKW5BbGxvY2F0aW9uQ3JlYXRlRnJvbUJpdG1hcCB9LAoteyJuQWxsb2NhdGlvbkNyZWF0ZUJpdG1hcFJlZiIsICAgICAiKElMYW5kcm9pZC9ncmFwaGljcy9CaXRtYXA7KUkiLCAgICAgICAgKHZvaWQqKW5BbGxvY2F0aW9uQ3JlYXRlQml0bWFwUmVmIH0sCi17Im5BbGxvY2F0aW9uQ3JlYXRlRnJvbUJpdG1hcEJveGVkIiwiKElaTGFuZHJvaWQvZ3JhcGhpY3MvQml0bWFwOylJIiwgICAgICAodm9pZCopbkFsbG9jYXRpb25DcmVhdGVGcm9tQml0bWFwQm94ZWQgfSwKLXsibkFsbG9jYXRpb25DcmVhdGVGcm9tQXNzZXRTdHJlYW0iLCIoSVpJKUkiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluQWxsb2NhdGlvbkNyZWF0ZUZyb21Bc3NldFN0cmVhbSB9LAoteyJuQWxsb2NhdGlvblVwbG9hZFRvVGV4dHVyZSIsICAgICAiKElaSSlWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5BbGxvY2F0aW9uVXBsb2FkVG9UZXh0dXJlIH0sCi17Im5BbGxvY2F0aW9uVXBsb2FkVG9CdWZmZXJPYmplY3QiLCIoSSlWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopbkFsbG9jYXRpb25VcGxvYWRUb0J1ZmZlck9iamVjdCB9LAoteyJuQWxsb2NhdGlvblN1YkRhdGExRCIsICAgICAgICAgICAiKElJSVtJSSlWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5BbGxvY2F0aW9uU3ViRGF0YTFEX2kgfSwKLXsibkFsbG9jYXRpb25TdWJEYXRhMUQiLCAgICAgICAgICAgIihJSUlbU0kpViIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluQWxsb2NhdGlvblN1YkRhdGExRF9zIH0sCi17Im5BbGxvY2F0aW9uU3ViRGF0YTFEIiwgICAgICAgICAgICIoSUlJW0JJKVYiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopbkFsbG9jYXRpb25TdWJEYXRhMURfYiB9LAoteyJuQWxsb2NhdGlvblN1YkRhdGExRCIsICAgICAgICAgICAiKElJSVtGSSlWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5BbGxvY2F0aW9uU3ViRGF0YTFEX2YgfSwKLXsibkFsbG9jYXRpb25TdWJEYXRhMkQiLCAgICAgICAgICAgIihJSUlJSVtJSSlWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluQWxsb2NhdGlvblN1YkRhdGEyRF9pIH0sCi17Im5BbGxvY2F0aW9uU3ViRGF0YTJEIiwgICAgICAgICAgICIoSUlJSUlbRkkpViIsICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopbkFsbG9jYXRpb25TdWJEYXRhMkRfZiB9LAoteyJuQWxsb2NhdGlvblJlYWQiLCAgICAgICAgICAgICAgICAiKElbSSlWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5BbGxvY2F0aW9uUmVhZF9pIH0sCi17Im5BbGxvY2F0aW9uUmVhZCIsICAgICAgICAgICAgICAgICIoSVtGKVYiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopbkFsbG9jYXRpb25SZWFkX2YgfSwKLXsibkFsbG9jYXRpb25TdWJEYXRhRnJvbU9iamVjdCIsICAgIihJTGFuZHJvaWQvcmVuZGVyc2NyaXB0L1R5cGU7SUxqYXZhL2xhbmcvT2JqZWN0OylWIiwgICAodm9pZCopbkFsbG9jYXRpb25TdWJEYXRhRnJvbU9iamVjdCB9LAoteyJuQWxsb2NhdGlvblN1YlJlYWRGcm9tT2JqZWN0IiwgICAiKElMYW5kcm9pZC9yZW5kZXJzY3JpcHQvVHlwZTtJTGphdmEvbGFuZy9PYmplY3Q7KVYiLCAgICh2b2lkKiluQWxsb2NhdGlvblN1YlJlYWRGcm9tT2JqZWN0IH0sCit7InJzbkZvbnRDcmVhdGVGcm9tRmlsZSIsICAgICAgICAgICAgIihJTGphdmEvbGFuZy9TdHJpbmc7SUkpSSIsICAgICAgICAgICAgICh2b2lkKiluRm9udENyZWF0ZUZyb21GaWxlIH0sCiAKLXsibkFkYXB0ZXIxREJpbmRBbGxvY2F0aW9uIiwgICAgICAgIihJSSlWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluQWRhcHRlcjFEQmluZEFsbG9jYXRpb24gfSwKLXsibkFkYXB0ZXIxRFNldENvbnN0cmFpbnQiLCAgICAgICAgIihJSUkpViIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluQWRhcHRlcjFEU2V0Q29uc3RyYWludCB9LAoteyJuQWRhcHRlcjFERGF0YSIsICAgICAgICAgICAgICAgICAiKElbSSlWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5BZGFwdGVyMUREYXRhX2kgfSwKLXsibkFkYXB0ZXIxRERhdGEiLCAgICAgICAgICAgICAgICAgIihJW0YpViIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluQWRhcHRlcjFERGF0YV9mIH0sCi17Im5BZGFwdGVyMURTdWJEYXRhIiwgICAgICAgICAgICAgICIoSUlJW0kpViIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopbkFkYXB0ZXIxRFN1YkRhdGFfaSB9LAoteyJuQWRhcHRlcjFEU3ViRGF0YSIsICAgICAgICAgICAgICAiKElJSVtGKVYiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5BZGFwdGVyMURTdWJEYXRhX2YgfSwKLXsibkFkYXB0ZXIxRENyZWF0ZSIsICAgICAgICAgICAgICAgIigpSSIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluQWRhcHRlcjFEQ3JlYXRlIH0sCit7InJzbkVsZW1lbnRDcmVhdGUiLCAgICAgICAgICAgICAgICAgIihJSUlaSSlJIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopbkVsZW1lbnRDcmVhdGUgfSwKK3sicnNuRWxlbWVudENyZWF0ZTIiLCAgICAgICAgICAgICAgICAiKElbSVtMamF2YS9sYW5nL1N0cmluZztbSSlJIiwgICAgICAgICAgICh2b2lkKiluRWxlbWVudENyZWF0ZTIgfSwKK3sicnNuRWxlbWVudEdldE5hdGl2ZURhdGEiLCAgICAgICAgICAiKElJW0kpViIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluRWxlbWVudEdldE5hdGl2ZURhdGEgfSwKK3sicnNuRWxlbWVudEdldFN1YkVsZW1lbnRzIiwgICAgICAgICAiKElJW0lbTGphdmEvbGFuZy9TdHJpbmc7KVYiLCAgICAgICAgICAgKHZvaWQqKW5FbGVtZW50R2V0U3ViRWxlbWVudHMgfSwKIAoteyJuQWRhcHRlcjJEQmluZEFsbG9jYXRpb24iLCAgICAgICAiKElJKVYiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5BZGFwdGVyMkRCaW5kQWxsb2NhdGlvbiB9LAoteyJuQWRhcHRlcjJEU2V0Q29uc3RyYWludCIsICAgICAgICAiKElJSSlWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5BZGFwdGVyMkRTZXRDb25zdHJhaW50IH0sCi17Im5BZGFwdGVyMkREYXRhIiwgICAgICAgICAgICAgICAgICIoSVtJKVYiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopbkFkYXB0ZXIyRERhdGFfaSB9LAoteyJuQWRhcHRlcjJERGF0YSIsICAgICAgICAgICAgICAgICAiKElbRilWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5BZGFwdGVyMkREYXRhX2YgfSwKLXsibkFkYXB0ZXIyRFN1YkRhdGEiLCAgICAgICAgICAgICAgIihJSUlJSVtJKVYiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluQWRhcHRlcjJEU3ViRGF0YV9pIH0sCi17Im5BZGFwdGVyMkRTdWJEYXRhIiwgICAgICAgICAgICAgICIoSUlJSUlbRilWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopbkFkYXB0ZXIyRFN1YkRhdGFfZiB9LAoteyJuQWRhcHRlcjJEQ3JlYXRlIiwgICAgICAgICAgICAgICAiKClJIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5BZGFwdGVyMkRDcmVhdGUgfSwKK3sicnNuVHlwZUJlZ2luIiwgICAgICAgICAgICAgICAgICAgICAiKElJKVYiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluVHlwZUJlZ2luIH0sCit7InJzblR5cGVBZGQiLCAgICAgICAgICAgICAgICAgICAgICAgIihJSUkpViIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopblR5cGVBZGQgfSwKK3sicnNuVHlwZUNyZWF0ZSIsICAgICAgICAgICAgICAgICAgICAiKEkpSSIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluVHlwZUNyZWF0ZSB9LAoreyJyc25UeXBlR2V0TmF0aXZlRGF0YSIsICAgICAgICAgICAgICIoSUlbSSlWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluVHlwZUdldE5hdGl2ZURhdGEgfSwKIAoteyJuU2NyaXB0QmluZEFsbG9jYXRpb24iLCAgICAgICAgICAiKElJSSlWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5TY3JpcHRCaW5kQWxsb2NhdGlvbiB9LAoteyJuU2NyaXB0U2V0Q2xlYXJDb2xvciIsICAgICAgICAgICAiKElGRkZGKVYiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5TY3JpcHRTZXRDbGVhckNvbG9yIH0sCi17Im5TY3JpcHRTZXRDbGVhckRlcHRoIiwgICAgICAgICAgICIoSUYpViIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopblNjcmlwdFNldENsZWFyRGVwdGggfSwKLXsiblNjcmlwdFNldENsZWFyU3RlbmNpbCIsICAgICAgICAgIihJSSlWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluU2NyaXB0U2V0Q2xlYXJTdGVuY2lsIH0sCi17Im5TY3JpcHRTZXRUaW1lWm9uZSIsICAgICAgICAgICAgICIoSVtCKVYiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopblNjcmlwdFNldFRpbWVab25lIH0sCi17Im5TY3JpcHRTZXRUeXBlIiwgICAgICAgICAgICAgICAgICIoSVpMamF2YS9sYW5nL1N0cmluZztJKVYiLCAgICAgICAgICAgICAodm9pZCopblNjcmlwdFNldFR5cGUgfSwKLXsiblNjcmlwdFNldFJvb3QiLCAgICAgICAgICAgICAgICAgIihaKVYiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluU2NyaXB0U2V0Um9vdCB9LAoteyJuU2NyaXB0U2V0SW52b2thYmxlIiwgICAgICAgICAgICAiKExqYXZhL2xhbmcvU3RyaW5nO0kpViIsICAgICAgICAgICAgICAgKHZvaWQqKW5TY3JpcHRTZXRJbnZva2UgfSwKLXsiblNjcmlwdEludm9rZSIsICAgICAgICAgICAgICAgICAgIihJSSlWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluU2NyaXB0SW52b2tlIH0sCit7InJzbkFsbG9jYXRpb25DcmVhdGVUeXBlZCIsICAgICAgICAgIihJSSlJIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopbkFsbG9jYXRpb25DcmVhdGVUeXBlZCB9LAoreyJyc25BbGxvY2F0aW9uQ3JlYXRlRnJvbUJpdG1hcCIsICAgICIoSUlaTGFuZHJvaWQvZ3JhcGhpY3MvQml0bWFwOylJIiwgICAgICAgKHZvaWQqKW5BbGxvY2F0aW9uQ3JlYXRlRnJvbUJpdG1hcCB9LAoreyJyc25BbGxvY2F0aW9uQ3JlYXRlQml0bWFwUmVmIiwgICAgICIoSUlMYW5kcm9pZC9ncmFwaGljcy9CaXRtYXA7KUkiLCAgICAgICAgKHZvaWQqKW5BbGxvY2F0aW9uQ3JlYXRlQml0bWFwUmVmIH0sCit7InJzbkFsbG9jYXRpb25DcmVhdGVGcm9tQml0bWFwQm94ZWQiLCIoSUlaTGFuZHJvaWQvZ3JhcGhpY3MvQml0bWFwOylJIiwgICAgICAodm9pZCopbkFsbG9jYXRpb25DcmVhdGVGcm9tQml0bWFwQm94ZWQgfSwKK3sicnNuQWxsb2NhdGlvbkNyZWF0ZUZyb21Bc3NldFN0cmVhbSIsIihJSVpJKUkiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluQWxsb2NhdGlvbkNyZWF0ZUZyb21Bc3NldFN0cmVhbSB9LAoreyJyc25BbGxvY2F0aW9uVXBsb2FkVG9UZXh0dXJlIiwgICAgICIoSUlaSSlWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5BbGxvY2F0aW9uVXBsb2FkVG9UZXh0dXJlIH0sCit7InJzbkFsbG9jYXRpb25VcGxvYWRUb0J1ZmZlck9iamVjdCIsIihJSSlWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopbkFsbG9jYXRpb25VcGxvYWRUb0J1ZmZlck9iamVjdCB9LAoreyJyc25BbGxvY2F0aW9uU3ViRGF0YTFEIiwgICAgICAgICAgICIoSUlJSVtJSSlWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5BbGxvY2F0aW9uU3ViRGF0YTFEX2kgfSwKK3sicnNuQWxsb2NhdGlvblN1YkRhdGExRCIsICAgICAgICAgICAiKElJSUlbU0kpViIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluQWxsb2NhdGlvblN1YkRhdGExRF9zIH0sCit7InJzbkFsbG9jYXRpb25TdWJEYXRhMUQiLCAgICAgICAgICAgIihJSUlJW0JJKVYiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopbkFsbG9jYXRpb25TdWJEYXRhMURfYiB9LAoreyJyc25BbGxvY2F0aW9uU3ViRGF0YTFEIiwgICAgICAgICAgICIoSUlJSVtGSSlWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5BbGxvY2F0aW9uU3ViRGF0YTFEX2YgfSwKK3sicnNuQWxsb2NhdGlvblN1YkVsZW1lbnREYXRhMUQiLCAgICAiKElJSUlbQkkpViIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluQWxsb2NhdGlvblN1YkVsZW1lbnREYXRhMUQgfSwKK3sicnNuQWxsb2NhdGlvblN1YkRhdGEyRCIsICAgICAgICAgICAiKElJSUlJSVtJSSlWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluQWxsb2NhdGlvblN1YkRhdGEyRF9pIH0sCit7InJzbkFsbG9jYXRpb25TdWJEYXRhMkQiLCAgICAgICAgICAgIihJSUlJSUlbRkkpViIsICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopbkFsbG9jYXRpb25TdWJEYXRhMkRfZiB9LAoreyJyc25BbGxvY2F0aW9uUmVhZCIsICAgICAgICAgICAgICAgICIoSUlbSSlWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5BbGxvY2F0aW9uUmVhZF9pIH0sCit7InJzbkFsbG9jYXRpb25SZWFkIiwgICAgICAgICAgICAgICAgIihJSVtGKVYiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopbkFsbG9jYXRpb25SZWFkX2YgfSwKK3sicnNuQWxsb2NhdGlvbkdldFR5cGUiLCAgICAgICAgICAgICAiKElJKUkiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluQWxsb2NhdGlvbkdldFR5cGV9LAogCi17Im5TY3JpcHRDQmVnaW4iLCAgICAgICAgICAgICAgICAgICIoKVYiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopblNjcmlwdENCZWdpbiB9LAoteyJuU2NyaXB0Q1NldFNjcmlwdCIsICAgICAgICAgICAgICAiKFtCSUkpViIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5TY3JpcHRDU2V0U2NyaXB0IH0sCi17Im5TY3JpcHRDQ3JlYXRlIiwgICAgICAgICAgICAgICAgICIoKUkiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopblNjcmlwdENDcmVhdGUgfSwKLXsiblNjcmlwdENBZGREZWZpbmVJMzIiLCAgICAgICAgICAgIihMamF2YS9sYW5nL1N0cmluZztJKVYiLCAgICAgICAgICAgICAgICh2b2lkKiluU2NyaXB0Q0FkZERlZmluZUkzMiB9LAoteyJuU2NyaXB0Q0FkZERlZmluZUYiLCAgICAgICAgICAgICAiKExqYXZhL2xhbmcvU3RyaW5nO0YpViIsICAgICAgICAgICAgICAgKHZvaWQqKW5TY3JpcHRDQWRkRGVmaW5lRiB9LAoreyJyc25BZGFwdGVyMURCaW5kQWxsb2NhdGlvbiIsICAgICAgICIoSUlJKVYiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5BZGFwdGVyMURCaW5kQWxsb2NhdGlvbiB9LAoreyJyc25BZGFwdGVyMURTZXRDb25zdHJhaW50IiwgICAgICAgICIoSUlJSSlWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5BZGFwdGVyMURTZXRDb25zdHJhaW50IH0sCit7InJzbkFkYXB0ZXIxRERhdGEiLCAgICAgICAgICAgICAgICAgIihJSVtJKVYiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopbkFkYXB0ZXIxRERhdGFfaSB9LAoreyJyc25BZGFwdGVyMUREYXRhIiwgICAgICAgICAgICAgICAgICIoSUlbRilWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5BZGFwdGVyMUREYXRhX2YgfSwKK3sicnNuQWRhcHRlcjFEU3ViRGF0YSIsICAgICAgICAgICAgICAiKElJSUlbSSlWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluQWRhcHRlcjFEU3ViRGF0YV9pIH0sCit7InJzbkFkYXB0ZXIxRFN1YkRhdGEiLCAgICAgICAgICAgICAgIihJSUlJW0YpViIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopbkFkYXB0ZXIxRFN1YkRhdGFfZiB9LAoreyJyc25BZGFwdGVyMURDcmVhdGUiLCAgICAgICAgICAgICAgICIoSSlJIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5BZGFwdGVyMURDcmVhdGUgfSwKIAoteyJuUHJvZ3JhbUZyYWdtZW50U3RvcmVCZWdpbiIsICAgICAiKElJKVYiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5Qcm9ncmFtRnJhZ21lbnRTdG9yZUJlZ2luIH0sCi17Im5Qcm9ncmFtRnJhZ21lbnRTdG9yZURlcHRoRnVuYyIsICIoSSlWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopblByb2dyYW1GcmFnbWVudFN0b3JlRGVwdGhGdW5jIH0sCi17Im5Qcm9ncmFtRnJhZ21lbnRTdG9yZURlcHRoTWFzayIsICIoWilWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopblByb2dyYW1GcmFnbWVudFN0b3JlRGVwdGhNYXNrIH0sCi17Im5Qcm9ncmFtRnJhZ21lbnRTdG9yZUNvbG9yTWFzayIsICIoWlpaWilWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopblByb2dyYW1GcmFnbWVudFN0b3JlQ29sb3JNYXNrIH0sCi17Im5Qcm9ncmFtRnJhZ21lbnRTdG9yZUJsZW5kRnVuYyIsICIoSUkpViIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopblByb2dyYW1GcmFnbWVudFN0b3JlQmxlbmRGdW5jIH0sCi17Im5Qcm9ncmFtRnJhZ21lbnRTdG9yZURpdGhlciIsICAgICIoWilWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopblByb2dyYW1GcmFnbWVudFN0b3JlRGl0aGVyIH0sCi17Im5Qcm9ncmFtRnJhZ21lbnRTdG9yZUNyZWF0ZSIsICAgICIoKUkiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopblByb2dyYW1GcmFnbWVudFN0b3JlQ3JlYXRlIH0sCit7InJzbkFkYXB0ZXIyREJpbmRBbGxvY2F0aW9uIiwgICAgICAgIihJSUkpViIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopbkFkYXB0ZXIyREJpbmRBbGxvY2F0aW9uIH0sCit7InJzbkFkYXB0ZXIyRFNldENvbnN0cmFpbnQiLCAgICAgICAgIihJSUlJKVYiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopbkFkYXB0ZXIyRFNldENvbnN0cmFpbnQgfSwKK3sicnNuQWRhcHRlcjJERGF0YSIsICAgICAgICAgICAgICAgICAiKElJW0kpViIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluQWRhcHRlcjJERGF0YV9pIH0sCit7InJzbkFkYXB0ZXIyRERhdGEiLCAgICAgICAgICAgICAgICAgIihJSVtGKVYiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopbkFkYXB0ZXIyRERhdGFfZiB9LAoreyJyc25BZGFwdGVyMkRTdWJEYXRhIiwgICAgICAgICAgICAgICIoSUlJSUlJW0kpViIsICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5BZGFwdGVyMkRTdWJEYXRhX2kgfSwKK3sicnNuQWRhcHRlcjJEU3ViRGF0YSIsICAgICAgICAgICAgICAiKElJSUlJSVtGKVYiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluQWRhcHRlcjJEU3ViRGF0YV9mIH0sCit7InJzbkFkYXB0ZXIyRENyZWF0ZSIsICAgICAgICAgICAgICAgIihJKUkiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopbkFkYXB0ZXIyRENyZWF0ZSB9LAogCi17Im5Qcm9ncmFtQmluZENvbnN0YW50cyIsICAgICAgICAgICIoSUlJKVYiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopblByb2dyYW1CaW5kQ29uc3RhbnRzIH0sCi17Im5Qcm9ncmFtQmluZFRleHR1cmUiLCAgICAgICAgICAgICIoSUlJKVYiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopblByb2dyYW1CaW5kVGV4dHVyZSB9LAoteyJuUHJvZ3JhbUJpbmRTYW1wbGVyIiwgICAgICAgICAgICAiKElJSSlWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5Qcm9ncmFtQmluZFNhbXBsZXIgfSwKK3sicnNuU2NyaXB0QmluZEFsbG9jYXRpb24iLCAgICAgICAgICAiKElJSUkpViIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluU2NyaXB0QmluZEFsbG9jYXRpb24gfSwKK3sicnNuU2NyaXB0U2V0VGltZVpvbmUiLCAgICAgICAgICAgICAiKElJW0IpViIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluU2NyaXB0U2V0VGltZVpvbmUgfSwKK3sicnNuU2NyaXB0SW52b2tlIiwgICAgICAgICAgICAgICAgICAiKElJSSlWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluU2NyaXB0SW52b2tlIH0sCit7InJzblNjcmlwdEludm9rZVYiLCAgICAgICAgICAgICAgICAgIihJSUlbQilWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopblNjcmlwdEludm9rZVYgfSwKK3sicnNuU2NyaXB0U2V0VmFySSIsICAgICAgICAgICAgICAgICAiKElJSUkpViIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluU2NyaXB0U2V0VmFySSB9LAoreyJyc25TY3JpcHRTZXRWYXJGIiwgICAgICAgICAgICAgICAgICIoSUlJRilWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5TY3JpcHRTZXRWYXJGIH0sCit7InJzblNjcmlwdFNldFZhclYiLCAgICAgICAgICAgICAgICAgIihJSUlbQilWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopblNjcmlwdFNldFZhclYgfSwKIAoteyJuUHJvZ3JhbUZyYWdtZW50Q3JlYXRlIiwgICAgICAgICAiKFtJKUkiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5Qcm9ncmFtRnJhZ21lbnRDcmVhdGUgfSwKLXsiblByb2dyYW1GcmFnbWVudENyZWF0ZTIiLCAgICAgICAgIihMamF2YS9sYW5nL1N0cmluZztbSSlJIiwgICAgICAgICAgICAgICh2b2lkKiluUHJvZ3JhbUZyYWdtZW50Q3JlYXRlMiB9LAoreyJyc25TY3JpcHRDQmVnaW4iLCAgICAgICAgICAgICAgICAgICIoSSlWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5TY3JpcHRDQmVnaW4gfSwKK3sicnNuU2NyaXB0Q1NldFNjcmlwdCIsICAgICAgICAgICAgICAiKElbQklJKVYiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluU2NyaXB0Q1NldFNjcmlwdCB9LAoreyJyc25TY3JpcHRDQ3JlYXRlIiwgICAgICAgICAgICAgICAgICIoSSlJIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5TY3JpcHRDQ3JlYXRlIH0sCiAKLXsiblByb2dyYW1SYXN0ZXJDcmVhdGUiLCAgICAgICAgICAgIihJSVpaWilJIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluUHJvZ3JhbVJhc3RlckNyZWF0ZSB9LAoteyJuUHJvZ3JhbVJhc3RlclNldFBvaW50U2l6ZSIsICAgICAiKElGKVYiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5Qcm9ncmFtUmFzdGVyU2V0UG9pbnRTaXplIH0sCi17Im5Qcm9ncmFtUmFzdGVyU2V0TGluZVdpZHRoIiwgICAgICIoSUYpViIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopblByb2dyYW1SYXN0ZXJTZXRMaW5lV2lkdGggfSwKK3sicnNuUHJvZ3JhbVN0b3JlQmVnaW4iLCAgICAgICAgICAgICAiKElJSSlWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluUHJvZ3JhbVN0b3JlQmVnaW4gfSwKK3sicnNuUHJvZ3JhbVN0b3JlRGVwdGhGdW5jIiwgICAgICAgICAiKElJKVYiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluUHJvZ3JhbVN0b3JlRGVwdGhGdW5jIH0sCit7InJzblByb2dyYW1TdG9yZURlcHRoTWFzayIsICAgICAgICAgIihJWilWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopblByb2dyYW1TdG9yZURlcHRoTWFzayB9LAoreyJyc25Qcm9ncmFtU3RvcmVDb2xvck1hc2siLCAgICAgICAgICIoSVpaWlopViIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5Qcm9ncmFtU3RvcmVDb2xvck1hc2sgfSwKK3sicnNuUHJvZ3JhbVN0b3JlQmxlbmRGdW5jIiwgICAgICAgICAiKElJSSlWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluUHJvZ3JhbVN0b3JlQmxlbmRGdW5jIH0sCit7InJzblByb2dyYW1TdG9yZURpdGhlciIsICAgICAgICAgICAgIihJWilWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopblByb2dyYW1TdG9yZURpdGhlciB9LAoreyJyc25Qcm9ncmFtU3RvcmVDcmVhdGUiLCAgICAgICAgICAgICIoSSlJIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5Qcm9ncmFtU3RvcmVDcmVhdGUgfSwKIAoteyJuUHJvZ3JhbVZlcnRleENyZWF0ZSIsICAgICAgICAgICAiKFopSSIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5Qcm9ncmFtVmVydGV4Q3JlYXRlIH0sCi17Im5Qcm9ncmFtVmVydGV4Q3JlYXRlMiIsICAgICAgICAgICIoTGphdmEvbGFuZy9TdHJpbmc7W0kpSSIsICAgICAgICAgICAgICAodm9pZCopblByb2dyYW1WZXJ0ZXhDcmVhdGUyIH0sCit7InJzblByb2dyYW1CaW5kQ29uc3RhbnRzIiwgICAgICAgICAgIihJSUlJKVYiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopblByb2dyYW1CaW5kQ29uc3RhbnRzIH0sCit7InJzblByb2dyYW1CaW5kVGV4dHVyZSIsICAgICAgICAgICAgIihJSUlJKVYiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopblByb2dyYW1CaW5kVGV4dHVyZSB9LAoreyJyc25Qcm9ncmFtQmluZFNhbXBsZXIiLCAgICAgICAgICAgICIoSUlJSSlWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5Qcm9ncmFtQmluZFNhbXBsZXIgfSwKIAoteyJuTGlnaHRCZWdpbiIsICAgICAgICAgICAgICAgICAgICAiKClWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5MaWdodEJlZ2luIH0sCi17Im5MaWdodFNldElzTW9ubyIsICAgICAgICAgICAgICAgICIoWilWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopbkxpZ2h0U2V0SXNNb25vIH0sCi17Im5MaWdodFNldElzTG9jYWwiLCAgICAgICAgICAgICAgICIoWilWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopbkxpZ2h0U2V0SXNMb2NhbCB9LAoteyJuTGlnaHRDcmVhdGUiLCAgICAgICAgICAgICAgICAgICAiKClJIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5MaWdodENyZWF0ZSB9LAoteyJuTGlnaHRTZXRDb2xvciIsICAgICAgICAgICAgICAgICAiKElGRkYpViIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5MaWdodFNldENvbG9yIH0sCi17Im5MaWdodFNldFBvc2l0aW9uIiwgICAgICAgICAgICAgICIoSUZGRilWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopbkxpZ2h0U2V0UG9zaXRpb24gfSwKK3sicnNuUHJvZ3JhbUZyYWdtZW50Q3JlYXRlIiwgICAgICAgICAiKElbSSlJIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluUHJvZ3JhbUZyYWdtZW50Q3JlYXRlIH0sCit7InJzblByb2dyYW1GcmFnbWVudENyZWF0ZTIiLCAgICAgICAgIihJTGphdmEvbGFuZy9TdHJpbmc7W0kpSSIsICAgICAgICAgICAgICAodm9pZCopblByb2dyYW1GcmFnbWVudENyZWF0ZTIgfSwKIAoteyJuQ29udGV4dEJpbmRSb290U2NyaXB0IiwgICAgICAgICAiKEkpViIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5Db250ZXh0QmluZFJvb3RTY3JpcHQgfSwKLXsibkNvbnRleHRCaW5kUHJvZ3JhbUZyYWdtZW50U3RvcmUiLCIoSSlWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluQ29udGV4dEJpbmRQcm9ncmFtRnJhZ21lbnRTdG9yZSB9LAoteyJuQ29udGV4dEJpbmRQcm9ncmFtRnJhZ21lbnQiLCAgICAiKEkpViIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5Db250ZXh0QmluZFByb2dyYW1GcmFnbWVudCB9LAoteyJuQ29udGV4dEJpbmRQcm9ncmFtVmVydGV4IiwgICAgICAiKEkpViIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5Db250ZXh0QmluZFByb2dyYW1WZXJ0ZXggfSwKLXsibkNvbnRleHRCaW5kUHJvZ3JhbVJhc3RlciIsICAgICAgIihJKVYiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluQ29udGV4dEJpbmRQcm9ncmFtUmFzdGVyIH0sCit7InJzblByb2dyYW1SYXN0ZXJDcmVhdGUiLCAgICAgICAgICAgIihJWlpaKUkiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5Qcm9ncmFtUmFzdGVyQ3JlYXRlIH0sCit7InJzblByb2dyYW1SYXN0ZXJTZXRMaW5lV2lkdGgiLCAgICAgIihJSUYpViIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopblByb2dyYW1SYXN0ZXJTZXRMaW5lV2lkdGggfSwKK3sicnNuUHJvZ3JhbVJhc3RlclNldEN1bGxNb2RlIiwgICAgICAiKElJSSlWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluUHJvZ3JhbVJhc3RlclNldEN1bGxNb2RlIH0sCiAKLXsiblNhbXBsZXJCZWdpbiIsICAgICAgICAgICAgICAgICAgIigpViIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluU2FtcGxlckJlZ2luIH0sCi17Im5TYW1wbGVyU2V0IiwgICAgICAgICAgICAgICAgICAgICIoSUkpViIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopblNhbXBsZXJTZXQgfSwKLXsiblNhbXBsZXJDcmVhdGUiLCAgICAgICAgICAgICAgICAgIigpSSIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluU2FtcGxlckNyZWF0ZSB9LAoreyJyc25Qcm9ncmFtVmVydGV4Q3JlYXRlIiwgICAgICAgICAgICIoSVopSSIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5Qcm9ncmFtVmVydGV4Q3JlYXRlIH0sCit7InJzblByb2dyYW1WZXJ0ZXhDcmVhdGUyIiwgICAgICAgICAgIihJTGphdmEvbGFuZy9TdHJpbmc7W0kpSSIsICAgICAgICAgICAgICAodm9pZCopblByb2dyYW1WZXJ0ZXhDcmVhdGUyIH0sCiAKLXsiblNpbXBsZU1lc2hDcmVhdGUiLCAgICAgICAgICAgICAgIihJSVtJSSlJIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluU2ltcGxlTWVzaENyZWF0ZSB9LAoteyJuU2ltcGxlTWVzaEJpbmRWZXJ0ZXgiLCAgICAgICAgICAiKElJSSlWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5TaW1wbGVNZXNoQmluZFZlcnRleCB9LAoteyJuU2ltcGxlTWVzaEJpbmRJbmRleCIsICAgICAgICAgICAiKElJKVYiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5TaW1wbGVNZXNoQmluZEluZGV4IH0sCit7InJzbkNvbnRleHRCaW5kUm9vdFNjcmlwdCIsICAgICAgICAgIihJSSlWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopbkNvbnRleHRCaW5kUm9vdFNjcmlwdCB9LAoreyJyc25Db250ZXh0QmluZFByb2dyYW1TdG9yZSIsICAgICAgICIoSUkpViIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopbkNvbnRleHRCaW5kUHJvZ3JhbVN0b3JlIH0sCit7InJzbkNvbnRleHRCaW5kUHJvZ3JhbUZyYWdtZW50IiwgICAgIihJSSlWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopbkNvbnRleHRCaW5kUHJvZ3JhbUZyYWdtZW50IH0sCit7InJzbkNvbnRleHRCaW5kUHJvZ3JhbVZlcnRleCIsICAgICAgIihJSSlWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopbkNvbnRleHRCaW5kUHJvZ3JhbVZlcnRleCB9LAoreyJyc25Db250ZXh0QmluZFByb2dyYW1SYXN0ZXIiLCAgICAgICIoSUkpViIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5Db250ZXh0QmluZFByb2dyYW1SYXN0ZXIgfSwKKworeyJyc25TYW1wbGVyQmVnaW4iLCAgICAgICAgICAgICAgICAgICIoSSlWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5TYW1wbGVyQmVnaW4gfSwKK3sicnNuU2FtcGxlclNldCIsICAgICAgICAgICAgICAgICAgICAiKElJSSlWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluU2FtcGxlclNldCB9LAoreyJyc25TYW1wbGVyQ3JlYXRlIiwgICAgICAgICAgICAgICAgICIoSSlJIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5TYW1wbGVyQ3JlYXRlIH0sCisKK3sicnNuTWVzaENyZWF0ZSIsICAgICAgICAgICAgICAgICAgICAiKElJSSlJIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluTWVzaENyZWF0ZSB9LAoreyJyc25NZXNoQmluZFZlcnRleCIsICAgICAgICAgICAgICAgICIoSUlJSSlWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5NZXNoQmluZFZlcnRleCB9LAoreyJyc25NZXNoQmluZEluZGV4IiwgICAgICAgICAgICAgICAgICIoSUlJSUkpViIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5NZXNoQmluZEluZGV4IH0sCisKK3sicnNuTWVzaEdldFZlcnRleEJ1ZmZlckNvdW50IiwgICAgICAiKElJKUkiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluTWVzaEdldFZlcnRleEJ1ZmZlckNvdW50IH0sCit7InJzbk1lc2hHZXRJbmRleENvdW50IiwgICAgICAgICAgICAgIihJSSlJIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopbk1lc2hHZXRJbmRleENvdW50IH0sCit7InJzbk1lc2hHZXRWZXJ0aWNlcyIsICAgICAgICAgICAgICAgIihJSVtJSSlWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluTWVzaEdldFZlcnRpY2VzIH0sCit7InJzbk1lc2hHZXRJbmRpY2VzIiwgICAgICAgICAgICAgICAgIihJSVtJW0lJKVYiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopbk1lc2hHZXRJbmRpY2VzIH0sCiAKIH07CiAKQEAgLTE1MTAsMyArMTM2MCw0IEBACiBiYWlsOgogICAgIHJldHVybiByZXN1bHQ7CiB9CisKZGlmZiAtLWdpdCBhL2dyYXBoaWNzL3Rlc3RzL2dyYXBoaWNzdGVzdHMvc3JjL2FuZHJvaWQvZ3JhcGhpY3MvQml0bWFwRmFjdG9yeVRlc3QuamF2YSBiL2dyYXBoaWNzL3Rlc3RzL2dyYXBoaWNzdGVzdHMvc3JjL2FuZHJvaWQvZ3JhcGhpY3MvQml0bWFwRmFjdG9yeVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOTgyMGVmCi0tLSAvZGV2L251bGwKKysrIGIvZ3JhcGhpY3MvdGVzdHMvZ3JhcGhpY3N0ZXN0cy9zcmMvYW5kcm9pZC9ncmFwaGljcy9CaXRtYXBGYWN0b3J5VGVzdC5qYXZhCkBAIC0wLDAgKzEsNDcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQuZ3JhcGhpY3M7CisKK2ltcG9ydCBhbmRyb2lkLm9zLlBhcmNlbEZpbGVEZXNjcmlwdG9yOworaW1wb3J0IGFuZHJvaWQudGVzdC5zdWl0ZWJ1aWxkZXIuYW5ub3RhdGlvbi5TbWFsbFRlc3Q7CisKK2ltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVEZXNjcmlwdG9yOworCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworCisKK3B1YmxpYyBjbGFzcyBCaXRtYXBGYWN0b3J5VGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKKworICAgIC8vIHRlc3RzIHRoYXQgd2UgY2FuIGRlY29kZSBiaXRtYXBzIGZyb20gTWVtb3J5RmlsZXMKKyAgICBAU21hbGxUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEJpdG1hcFBhcmNlbEZpbGVEZXNjcmlwdG9yKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIEJpdG1hcCBiaXRtYXAxID0gQml0bWFwLmNyZWF0ZUJpdG1hcCgKKyAgICAgICAgICAgICAgICBuZXcgaW50W10geyBDb2xvci5CTFVFIH0sIDEsIDEsIEJpdG1hcC5Db25maWcuUkdCXzU2NSk7CisgICAgICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBvdXQgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7CisgICAgICAgIGJpdG1hcDEuY29tcHJlc3MoQml0bWFwLkNvbXByZXNzRm9ybWF0LlBORywgMTAwLCBvdXQpOworICAgICAgICBQYXJjZWxGaWxlRGVzY3JpcHRvciBwZmQgPSBQYXJjZWxGaWxlRGVzY3JpcHRvci5mcm9tRGF0YShvdXQudG9CeXRlQXJyYXkoKSwgbnVsbCk7CisgICAgICAgIEZpbGVEZXNjcmlwdG9yIGZkID0gcGZkLmdldEZpbGVEZXNjcmlwdG9yKCk7CisgICAgICAgIGFzc2VydE5vdE51bGwoIkdvdCBudWxsIEZpbGVEZXNjcmlwdG9yIiwgZmQpOworICAgICAgICBhc3NlcnRUcnVlKCJHb3QgaW52YWxpZCBGaWxlRGVzY3JpcHRvciIsIGZkLnZhbGlkKCkpOworICAgICAgICBCaXRtYXAgYml0bWFwID0gQml0bWFwRmFjdG9yeS5kZWNvZGVGaWxlRGVzY3JpcHRvcihmZCk7CisgICAgICAgIGFzc2VydE5vdE51bGwoIkJpdG1hcEZhY3RvcnkgcmV0dXJuZWQgbnVsbCIsIGJpdG1hcCk7CisgICAgICAgIGFzc2VydEVxdWFscygiQml0bWFwIHdpZHRoIiwgMSwgYml0bWFwLmdldFdpZHRoKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIkJpdG1hcCBoZWlnaHQiLCAxLCBiaXRtYXAuZ2V0SGVpZ2h0KCkpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvaWN1NGovamF2YS9hbmRyb2lkL2ljdS90ZXh0L0FyYWJpY1NoYXBpbmcuamF2YSBiL2ljdTRqL2phdmEvYW5kcm9pZC9pY3UvdGV4dC9BcmFiaWNTaGFwaW5nLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTNlMjE3NQotLS0gL2Rldi9udWxsCisrKyBiL2ljdTRqL2phdmEvYW5kcm9pZC9pY3UvdGV4dC9BcmFiaWNTaGFwaW5nLmphdmEKQEAgLTAsMCArMSwxOTQ3IEBACisvKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiAgIENvcHlyaWdodCAoQykgMjAwMS0yMDA5LCBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzCisqICAgQ29ycG9yYXRpb24gYW5kIG90aGVycy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqLworCisvKgorICogUG9ydGVkIHdpdGggbWlub3IgbW9kaWZpY2F0aW9ucyBmcm9tIElDVTRKIDQuMidzCisgKiBjb20uaWJtLmljdS50ZXh0LkFyYWJpY1NoYXBpbmcgY2xhc3MuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLmljdS50ZXh0OworCisKKy8qKgorICogU2hhcGUgQXJhYmljIHRleHQgb24gYSBjaGFyYWN0ZXIgYmFzaXMuCisgKgorICogPHA+QXJhYmljU2hhcGluZyBwZXJmb3JtcyBiYXNpYyBvcGVyYXRpb25zIGZvciAic2hhcGluZyIgQXJhYmljIHRleHQuIEl0IGlzIG1vc3QKKyAqIHVzZWZ1bCBmb3IgdXNlIHdpdGggbGVnYWN5IGRhdGEgZm9ybWF0cyBhbmQgbGVnYWN5IGRpc3BsYXkgdGVjaG5vbG9neQorICogKHNpbXBsZSB0ZXJtaW5hbHMpLiBBbGwgb3BlcmF0aW9ucyBhcmUgcGVyZm9ybWVkIG9uIFVuaWNvZGUgY2hhcmFjdGVycy48L3A+CisgKgorICogPHA+VGV4dC1iYXNlZCBzaGFwaW5nIG1lYW5zIHRoYXQgc29tZSBjaGFyYWN0ZXIgY29kZSBwb2ludHMgaW4gdGhlIHRleHQgYXJlCisgKiByZXBsYWNlZCBieSBvdGhlcnMgZGVwZW5kaW5nIG9uIHRoZSBjb250ZXh0LiBJdCB0cmFuc2Zvcm1zIG9uZSBraW5kIG9mIHRleHQKKyAqIGludG8gYW5vdGhlci4gSW4gY29tcGFyaXNvbiwgbW9kZXJuIGRpc3BsYXlzIGZvciBBcmFiaWMgdGV4dCBzZWxlY3QKKyAqIGFwcHJvcHJpYXRlLCBjb250ZXh0LWRlcGVuZGVudCBmb250IGdseXBocyBmb3IgZWFjaCB0ZXh0IGVsZW1lbnQsIHdoaWNoIG1lYW5zCisgKiB0aGF0IHRoZXkgdHJhbnNmb3JtIHRleHQgaW50byBhIGdseXBoIHZlY3Rvci48L3A+CisgKgorICogPHA+VGV4dCB0cmFuc2Zvcm1hdGlvbnMgYXJlIG5lY2Vzc2FyeSB3aGVuIG1vZGVybiBkaXNwbGF5IHRlY2hub2xvZ3kgaXMgbm90CisgKiBhdmFpbGFibGUgb3Igd2hlbiB0ZXh0IG5lZWRzIHRvIGJlIHRyYW5zZm9ybWVkIHRvIG9yIGZyb20gbGVnYWN5IGZvcm1hdHMgdGhhdAorICogdXNlICJzaGFwZWQiIGNoYXJhY3RlcnMuIFNpbmNlIHRoZSBBcmFiaWMgc2NyaXB0IGlzIGN1cnNpdmUsIGNvbm5lY3RpbmcKKyAqIGFkamFjZW50IGxldHRlcnMgdG8gZWFjaCBvdGhlciwgY29tcHV0ZXJzIHNlbGVjdCBpbWFnZXMgZm9yIGVhY2ggbGV0dGVyIGJhc2VkCisgKiBvbiB0aGUgc3Vycm91bmRpbmcgbGV0dGVycy4gVGhpcyB1c3VhbGx5IHJlc3VsdHMgaW4gZm91ciBpbWFnZXMgcGVyIEFyYWJpYworICogbGV0dGVyOiBpbml0aWFsLCBtaWRkbGUsIGZpbmFsLCBhbmQgaXNvbGF0ZWQgZm9ybXMuIEluIFVuaWNvZGUsIG9uIHRoZSBvdGhlcgorICogaGFuZCwgbGV0dGVycyBhcmUgbm9ybWFsbHkgc3RvcmVkIGFic3RyYWN0LCBhbmQgYSBkaXNwbGF5IHN5c3RlbSBpcyBleHBlY3RlZAorICogdG8gc2VsZWN0IHRoZSBuZWNlc3NhcnkgZ2x5cGhzLiAoVGhpcyBtYWtlcyBzZWFyY2hpbmcgYW5kIG90aGVyIHRleHQKKyAqIHByb2Nlc3NpbmcgZWFzaWVyIGJlY2F1c2UgdGhlIHNhbWUgbGV0dGVyIGhhcyBvbmx5IG9uZSBjb2RlLikgSXQgaXMgcG9zc2libGUKKyAqIHRvIG1pbWljIHRoaXMgd2l0aCB0ZXh0IHRyYW5zZm9ybWF0aW9ucyBiZWNhdXNlIHRoZXJlIGFyZSBjaGFyYWN0ZXJzIGluCisgKiBVbmljb2RlIHRoYXQgYXJlIHJlbmRlcmVkIGFzIGxldHRlcnMgd2l0aCBhIHNwZWNpZmljIHNoYXBlCisgKiAob3IgY3Vyc2l2ZSBjb25uZWN0aXZpdHkpLiBUaGV5IHdlcmUgaW5jbHVkZWQgZm9yIGludGVyb3BlcmFiaWxpdHkgd2l0aAorICogbGVnYWN5IHN5c3RlbXMgYW5kIGNvZGVwYWdlcywgYW5kIGZvciB1bnNvcGhpc3RpY2F0ZWQgZGlzcGxheSBzeXN0ZW1zLjwvcD4KKyAqCisgKiA8cD5BIHNlY29uZCBraW5kIG9mIHRleHQgdHJhbnNmb3JtYXRpb25zIGlzIHN1cHBvcnRlZCBmb3IgQXJhYmljIGRpZ2l0czoKKyAqIEZvciBjb21wYXRpYmlsaXR5IHdpdGggbGVnYWN5IGNvZGVwYWdlcyB0aGF0IG9ubHkgaW5jbHVkZSBFdXJvcGVhbiBkaWdpdHMsCisgKiBpdCBpcyBwb3NzaWJsZSB0byByZXBsYWNlIG9uZSBzZXQgb2YgZGlnaXRzIGJ5IGFub3RoZXIsIGNoYW5naW5nIHRoZQorICogY2hhcmFjdGVyIGNvZGUgcG9pbnRzLiBUaGVzZSBvcGVyYXRpb25zIGNhbiBiZSBwZXJmb3JtZWQgZm9yIGVpdGhlcgorICogQXJhYmljLUluZGljIERpZ2l0cyAoVSswNjYwLi4uVSswNjY5KSBvciBFYXN0ZXJuIChFeHRlbmRlZCkgQXJhYmljLUluZGljCisgKiBkaWdpdHMgKFUrMDZmMC4uLlUrMDZmOSkuPC9wPgorICoKKyAqIDxwPlNvbWUgcmVwbGFjZW1lbnRzIG1heSByZXN1bHQgaW4gbW9yZSBvciBmZXdlciBjaGFyYWN0ZXJzIChjb2RlIHBvaW50cykuCisgKiBCeSBkZWZhdWx0LCB0aGlzIG1lYW5zIHRoYXQgdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlciBtYXkgcmVjZWl2ZSB0ZXh0IHdpdGggYQorICogbGVuZ3RoIGRpZmZlcmVudCBmcm9tIHRoZSBzb3VyY2UgbGVuZ3RoLiBTb21lIGxlZ2FjeSBzeXN0ZW1zIHJlbHkgb24gdGhlCisgKiBsZW5ndGggb2YgdGhlIHRleHQgdG8gYmUgY29uc3RhbnQuIFRoZXkgZXhwZWN0IGV4dHJhIHNwYWNlcyB0byBiZSBhZGRlZAorICogb3IgY29uc3VtZWQgZWl0aGVyIG5leHQgdG8gdGhlIGFmZmVjdGVkIGNoYXJhY3RlciBvciBhdCB0aGUgZW5kIG9mIHRoZQorICogdGV4dC48L3A+CisgKiBAc3RhYmxlIElDVSAyLjAKKyAqCisgKiBAaGlkZQorICovCitwdWJsaWMgY2xhc3MgQXJhYmljU2hhcGluZyB7CisgICAgcHJpdmF0ZSBmaW5hbCBpbnQgb3B0aW9uczsKKyAgICBwcml2YXRlIGJvb2xlYW4gaXNMb2dpY2FsOyAvLyBjb252ZW5pZW5jZQorICAgIHByaXZhdGUgYm9vbGVhbiBzcGFjZXNSZWxhdGl2ZVRvVGV4dEJlZ2luRW5kOworICAgIHByaXZhdGUgY2hhciB0YWlsQ2hhcjsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQXJhYmljU2hhcGluZyBTSEFQRVIgPSBuZXcgQXJhYmljU2hhcGluZygKKyAgICAgICAgICAgIEFyYWJpY1NoYXBpbmcuVEVYVF9ESVJFQ1RJT05fTE9HSUNBTCB8CisgICAgICAgICAgICBBcmFiaWNTaGFwaW5nLkxFTkdUSF9GSVhFRF9TUEFDRVNfTkVBUiB8CisgICAgICAgICAgICBBcmFiaWNTaGFwaW5nLkxFVFRFUlNfU0hBUEUgfAorICAgICAgICAgICAgQXJhYmljU2hhcGluZy5ESUdJVFNfTk9PUCk7CisKKyAgICAvKioKKyAgICAgKiBDb252ZXJ0IGEgcmFuZ2Ugb2YgdGV4dCBpbiB0aGUgc291cmNlIGFycmF5LCBwdXR0aW5nIHRoZSByZXN1bHQKKyAgICAgKiBpbnRvIGEgcmFuZ2Ugb2YgdGV4dCBpbiB0aGUgZGVzdGluYXRpb24gYXJyYXksIGFuZCByZXR1cm4gdGhlIG51bWJlcgorICAgICAqIG9mIGNoYXJhY3RlcnMgd3JpdHRlbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzb3VyY2UgQW4gYXJyYXkgY29udGFpbmluZyB0aGUgaW5wdXQgdGV4dAorICAgICAqIEBwYXJhbSBzb3VyY2VTdGFydCBUaGUgc3RhcnQgb2YgdGhlIHJhbmdlIG9mIHRleHQgdG8gY29udmVydAorICAgICAqIEBwYXJhbSBzb3VyY2VMZW5ndGggVGhlIGxlbmd0aCBvZiB0aGUgcmFuZ2Ugb2YgdGV4dCB0byBjb252ZXJ0CisgICAgICogQHBhcmFtIGRlc3QgVGhlIGRlc3RpbmF0aW9uIGFycmF5IHRoYXQgd2lsbCByZWNlaXZlIHRoZSByZXN1bHQuCisgICAgICogICBJdCBtYXkgYmUgPGNvZGU+TlVMTDwvY29kZT4gb25seSBpZiAgPGNvZGU+ZGVzdFNpemU8L2NvZGU+IGlzIDAuCisgICAgICogQHBhcmFtIGRlc3RTdGFydCBUaGUgc3RhcnQgb2YgdGhlIHJhbmdlIG9mIHRoZSBkZXN0aW5hdGlvbiBidWZmZXIgdG8gdXNlLgorICAgICAqIEBwYXJhbSBkZXN0U2l6ZSBUaGUgc2l6ZSAoY2FwYWNpdHkpIG9mIHRoZSBkZXN0aW5hdGlvbiBidWZmZXIuCisgICAgICogICBJZiA8Y29kZT5kZXN0U2l6ZTwvY29kZT4gaXMgMCwgdGhlbiBubyBvdXRwdXQgaXMgcHJvZHVjZWQsCisgICAgICogICBidXQgdGhlIG5lY2Vzc2FyeSBidWZmZXIgc2l6ZSBpcyByZXR1cm5lZCAoInByZWZsaWdodGluZyIpLiAgVGhpcworICAgICAqICAgZG9lcyBub3QgdmFsaWRhdGUgdGhlIHRleHQgYWdhaW5zdCB0aGUgb3B0aW9ucywgZm9yIGV4YW1wbGUsCisgICAgICogICBpZiBsZXR0ZXJzIGFyZSBiZWluZyB1bnNoYXBlZCwgYW5kIHNwYWNlcyBhcmUgYmVpbmcgY29uc3VtZWQKKyAgICAgKiAgIGZvbGxvd2luZyBsYW1hbGVmLCB0aGlzIHdpbGwgbm90IGRldGVjdCBhIGxhbWFsZWYgd2l0aG91dCBhCisgICAgICogICBjb3JyZXNwb25kaW5nIHNwYWNlLiAgQW4gZXJyb3Igd2lsbCBiZSB0aHJvd24gd2hlbiB0aGUgYWN0dWFsCisgICAgICogICBjb252ZXJzaW9uIGlzIGF0dGVtcHRlZC4KKyAgICAgKiBAcmV0dXJuIFRoZSBudW1iZXIgb2YgY2hhcnMgd3JpdHRlbiB0byB0aGUgZGVzdGluYXRpb24gYnVmZmVyLgorICAgICAqICAgSWYgYW4gZXJyb3Igb2NjdXJzLCB0aGVuIG5vIG91dHB1dCB3YXMgd3JpdHRlbiwgb3IgaXQgbWF5IGJlCisgICAgICogICBpbmNvbXBsZXRlLgorICAgICAqIEB0aHJvd3MgQXJhYmljU2hhcGluZ0V4Y2VwdGlvbiBpZiB0aGUgdGV4dCBjYW5ub3QgYmUgY29udmVydGVkIGFjY29yZGluZyB0byB0aGUgb3B0aW9ucy4KKyAgICAgKiBAc3RhYmxlIElDVSAyLjAKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IHNoYXBlKGNoYXJbXSBzb3VyY2UsIGludCBzb3VyY2VTdGFydCwgaW50IHNvdXJjZUxlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgIGNoYXJbXSBkZXN0LCBpbnQgZGVzdFN0YXJ0LCBpbnQgZGVzdFNpemUpIHRocm93cyBBcmFiaWNTaGFwaW5nRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKHNvdXJjZSA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJzb3VyY2UgY2FuIG5vdCBiZSBudWxsIik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHNvdXJjZVN0YXJ0IDwgMCB8fCBzb3VyY2VMZW5ndGggPCAwIHx8IHNvdXJjZVN0YXJ0ICsgc291cmNlTGVuZ3RoID4gc291cmNlLmxlbmd0aCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiYmFkIHNvdXJjZSBzdGFydCAoIiArIHNvdXJjZVN0YXJ0ICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIikgb3IgbGVuZ3RoICgiICsgc291cmNlTGVuZ3RoICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIikgZm9yIGJ1ZmZlciBvZiBsZW5ndGggIiArIHNvdXJjZS5sZW5ndGgpOworICAgICAgICB9CisgICAgICAgIGlmIChkZXN0ID09IG51bGwgJiYgZGVzdFNpemUgIT0gMCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigibnVsbCBkZXN0IHJlcXVpcmVzIGRlc3RTaXplID09IDAiKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoKGRlc3RTaXplICE9IDApICYmCisgICAgICAgICAgICAoZGVzdFN0YXJ0IDwgMCB8fCBkZXN0U2l6ZSA8IDAgfHwgZGVzdFN0YXJ0ICsgZGVzdFNpemUgPiBkZXN0Lmxlbmd0aCkpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImJhZCBkZXN0IHN0YXJ0ICgiICsgZGVzdFN0YXJ0ICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIikgb3Igc2l6ZSAoIiArIGRlc3RTaXplICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIikgZm9yIGJ1ZmZlciBvZiBsZW5ndGggIiArIGRlc3QubGVuZ3RoKTsKKyAgICAgICAgfQorICAgICAgICAvKiBWYWxpZGF0ZSBpbnB1dCBvcHRpb25zICovCisgICAgICAgIGlmICggKChvcHRpb25zJlRBU0hLRUVMX01BU0spID4gMCkgJiYKKyAgICAgICAgICAgICAhKCgob3B0aW9ucyAmIFRBU0hLRUVMX01BU0spPT1UQVNIS0VFTF9CRUdJTikgIHx8CisgICAgICAgICAgICAgICAoKG9wdGlvbnMgJiBUQVNIS0VFTF9NQVNLKT09VEFTSEtFRUxfRU5EICkgICB8fAorICAgICAgICAgICAgICAgKChvcHRpb25zICYgVEFTSEtFRUxfTUFTSyk9PVRBU0hLRUVMX1JFU0laRSApfHwKKyAgICAgICAgICAgICAgICgob3B0aW9ucyAmIFRBU0hLRUVMX01BU0spPT1UQVNIS0VFTF9SRVBMQUNFX0JZX1RBVFdFRUwpKSApeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiV3JvbmcgVGFzaGtlZWwgYXJndW1lbnQiKTsKKyAgICAgICAgfQorCisgICAgICAgLy8vQ0xPVkVSOk9GRgorICAgICAgIC8vQWNjb3JkaW5nIHRvIFN0ZXZlbiBMb29taXMsIHRoZSBjb2RlIGlzIHVucmVhY2hhYmxlIHdoZW4geW91IE9SIGFsbCB0aGUgY29uc3RhbnRzIHdpdGhpbiB0aGUgaWYgc3RhdGVtZW50cworICAgICAgIGlmKCgob3B0aW9ucyZMQU1BTEVGX01BU0spID4gMCkmJgorICAgICAgICAgICAgICAhKCgob3B0aW9ucyAmIExBTUFMRUZfTUFTSyk9PUxBTUFMRUZfQkVHSU4pICB8fAorICAgICAgICAgICAgICAgICgob3B0aW9ucyAmIExBTUFMRUZfTUFTSyk9PUxBTUFMRUZfRU5EICkgICB8fAorICAgICAgICAgICAgICAgICgob3B0aW9ucyAmIExBTUFMRUZfTUFTSyk9PUxBTUFMRUZfUkVTSVpFICl8fAorICAgICAgICAgICAgICAgICAoKG9wdGlvbnMgJiBMQU1BTEVGX01BU0spPT1MQU1BTEVGX0FVVE8pICB8fAorICAgICAgICAgICAgICAgICAoKG9wdGlvbnMgJiBMQU1BTEVGX01BU0spPT1MQU1BTEVGX05FQVIpKSl7CisgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIldyb25nIExhbSBBbGVmIGFyZ3VtZW50Iik7CisgICAgICAgfQorICAgICAgIC8vL0NMT1ZFUjpPTgorCisgICAgICAgLyogVmFsaWRhdGUgVGFzaGtlZWwgKFRhc2hrZWVsIHJlcGxhY2VtZW50IG9wdGlvbnMgc2hvdWxkIGJlIGVuYWJsZWQgaW4gc2hhcGluZyBtb2RlIG9ubHkpKi8KKyAgICAgICBpZigoKG9wdGlvbnMmVEFTSEtFRUxfTUFTSykgPiAwKSAmJiAob3B0aW9ucyZMRVRURVJTX01BU0spID09IExFVFRFUlNfVU5TSEFQRSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGFzaGtlZWwgcmVwbGFjZW1lbnQgc2hvdWxkIG5vdCBiZSBlbmFibGVkIGluIGRlc2hhcGluZyBtb2RlICIpOworICAgICAgIH0KKyAgICAgICByZXR1cm4gaW50ZXJuYWxTaGFwZShzb3VyY2UsIHNvdXJjZVN0YXJ0LCBzb3VyY2VMZW5ndGgsIGRlc3QsIGRlc3RTdGFydCwgZGVzdFNpemUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnZlcnQgYSByYW5nZSBvZiB0ZXh0IGluIHBsYWNlLiAgVGhpcyBtYXkgb25seSBiZSB1c2VkIGlmIHRoZSBMZW5ndGggb3B0aW9uCisgICAgICogZG9lcyBub3QgZ3JvdyBvciBzaHJpbmsgdGhlIHRleHQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gc291cmNlIEFuIGFycmF5IGNvbnRhaW5pbmcgdGhlIGlucHV0IHRleHQKKyAgICAgKiBAcGFyYW0gc3RhcnQgVGhlIHN0YXJ0IG9mIHRoZSByYW5nZSBvZiB0ZXh0IHRvIGNvbnZlcnQKKyAgICAgKiBAcGFyYW0gbGVuZ3RoIFRoZSBsZW5ndGggb2YgdGhlIHJhbmdlIG9mIHRleHQgdG8gY29udmVydAorICAgICAqIEB0aHJvd3MgQXJhYmljU2hhcGluZ0V4Y2VwdGlvbiBpZiB0aGUgdGV4dCBjYW5ub3QgYmUgY29udmVydGVkIGFjY29yZGluZyB0byB0aGUgb3B0aW9ucy4KKyAgICAgKiBAc3RhYmxlIElDVSAyLjAKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzaGFwZShjaGFyW10gc291cmNlLCBpbnQgc3RhcnQsIGludCBsZW5ndGgpIHRocm93cyBBcmFiaWNTaGFwaW5nRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKChvcHRpb25zICYgTEFNQUxFRl9NQVNLKSA9PSBMQU1BTEVGX1JFU0laRSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEFyYWJpY1NoYXBpbmdFeGNlcHRpb24oIkNhbm5vdCBzaGFwZSBpbiBwbGFjZSB3aXRoIGxlbmd0aCBvcHRpb24gcmVzaXplLiIpOworICAgICAgICB9CisgICAgICAgIHNoYXBlKHNvdXJjZSwgc3RhcnQsIGxlbmd0aCwgc291cmNlLCBzdGFydCwgbGVuZ3RoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb252ZXJ0IGEgc3RyaW5nLCByZXR1cm5pbmcgdGhlIG5ldyBzdHJpbmcuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdGV4dCB0aGUgc3RyaW5nIHRvIGNvbnZlcnQKKyAgICAgKiBAcmV0dXJuIHRoZSBjb252ZXJ0ZWQgc3RyaW5nCisgICAgICogQHRocm93cyBBcmFiaWNTaGFwaW5nRXhjZXB0aW9uIGlmIHRoZSBzdHJpbmcgY2Fubm90IGJlIGNvbnZlcnRlZCBhY2NvcmRpbmcgdG8gdGhlIG9wdGlvbnMuCisgICAgICogQHN0YWJsZSBJQ1UgMi4wCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBzaGFwZShTdHJpbmcgdGV4dCkgdGhyb3dzIEFyYWJpY1NoYXBpbmdFeGNlcHRpb24geworICAgICAgICBjaGFyW10gc3JjID0gdGV4dC50b0NoYXJBcnJheSgpOworICAgICAgICBjaGFyW10gZGVzdCA9IHNyYzsKKyAgICAgICAgaWYgKCgob3B0aW9ucyAmIExBTUFMRUZfTUFTSykgPT0gTEFNQUxFRl9SRVNJWkUpICYmCisgICAgICAgICAgICAoKG9wdGlvbnMgJiBMRVRURVJTX01BU0spID09IExFVFRFUlNfVU5TSEFQRSkpIHsKKworICAgICAgICAgICAgZGVzdCA9IG5ldyBjaGFyW3NyYy5sZW5ndGggKiAyXTsgLy8gbWF4CisgICAgICAgIH0KKyAgICAgICAgaW50IGxlbiA9IHNoYXBlKHNyYywgMCwgc3JjLmxlbmd0aCwgZGVzdCwgMCwgZGVzdC5sZW5ndGgpOworCisgICAgICAgIHJldHVybiBuZXcgU3RyaW5nKGRlc3QsIDAsIGxlbik7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29uc3RydWN0IEFyYWJpY1NoYXBpbmcgdXNpbmcgdGhlIG9wdGlvbnMgZmxhZ3MuCisgICAgICogVGhlIGZsYWdzIGFyZSBhcyBmb2xsb3dzOjxicj4KKyAgICAgKiAnTEVOR1RIJyBmbGFncyBjb250cm9sIHdoZXRoZXIgdGhlIHRleHQgY2FuIGNoYW5nZSBzaXplLCBhbmQgaWYgbm90LAorICAgICAqIGhvdyB0byBtYWludGFpbiB0aGUgc2l6ZSBvZiB0aGUgdGV4dCB3aGVuIExhbUFsZWYgbGlnYXR1cmVzIGFyZQorICAgICAqIGZvcm1lZCBvciBicm9rZW4uPGJyPgorICAgICAqICdURVhUX0RJUkVDVElPTicgZmxhZ3MgY29udHJvbCB3aGV0aGVyIHRoZSB0ZXh0IGlzIHJlYWQgYW5kIHdyaXR0ZW4KKyAgICAgKiBpbiB2aXN1YWwgb3JkZXIgb3IgaW4gbG9naWNhbCBvcmRlci48YnI+CisgICAgICogJ0xFVFRFUlNfU0hBUEUnIGZsYWdzIGNvbnRyb2wgd2hldGhlciBjb252ZXJzaW9uIGlzIHRvIG9yIGZyb20KKyAgICAgKiBwcmVzZW50YXRpb24gZm9ybXMuPGJyPgorICAgICAqICdESUdJVFMnIGZsYWdzIGNvbnRyb2wgd2hldGhlciBkaWdpdHMgYXJlIHNoYXBlZCwgYW5kIHdoZXRoZXIgZnJvbQorICAgICAqIEV1cm9wZWFuIHRvIEFyYWJpYy1JbmRpYyBvciB2aWNlLXZlcnNhLjxicj4KKyAgICAgKiAnRElHSVRfVFlQRScgZmxhZ3MgY29udHJvbCB3aGV0aGVyIHN0YW5kYXJkIG9yIGV4dGVuZGVkIEFyYWJpYy1JbmRpYworICAgICAqIGRpZ2l0cyBhcmUgdXNlZCB3aGVuIHBlcmZvcm1pbmcgZGlnaXQgY29udmVyc2lvbi4KKyAgICAgKiBAc3RhYmxlIElDVSAyLjAKKyAgICAgKi8KKyAgICBwdWJsaWMgQXJhYmljU2hhcGluZyhpbnQgb3B0aW9ucykgeworICAgICAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zOworICAgICAgICBpZiAoKG9wdGlvbnMgJiBESUdJVFNfTUFTSykgPiAweDgwKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJiYWQgRElHSVRTIG9wdGlvbnMiKTsKKyAgICAgICAgfQorCisgICAgICAgIGlzTG9naWNhbCA9ICggKG9wdGlvbnMgJiBURVhUX0RJUkVDVElPTl9NQVNLKSA9PSBURVhUX0RJUkVDVElPTl9MT0dJQ0FMICk7CisgICAgICAgIC8qIFZhbGlkYXRlIG9wdGlvbnMgKi8KKyAgICAgICAgc3BhY2VzUmVsYXRpdmVUb1RleHRCZWdpbkVuZCA9ICggKG9wdGlvbnMgJiBTUEFDRVNfUkVMQVRJVkVfVE9fVEVYVF9NQVNLKSA9PSBTUEFDRVNfUkVMQVRJVkVfVE9fVEVYVF9CRUdJTl9FTkQgKTsKKyAgICAgICAgaWYgKCAob3B0aW9ucyZTSEFQRV9UQUlMX1RZUEVfTUFTSykgPT0gU0hBUEVfVEFJTF9ORVdfVU5JQ09ERSl7CisgICAgICAgICAgICB0YWlsQ2hhciA9IE5FV19UQUlMX0NIQVI7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB0YWlsQ2hhciA9IE9MRF9UQUlMX0NIQVI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBTZWVuIFRhaWwgb3B0aW9ucyAqLworICAgIC8qKgorICAgICAqIE1lbW9yeSBvcHRpb246IHRoZSByZXN1bHQgbXVzdCBoYXZlIHRoZSBzYW1lIGxlbmd0aCBhcyB0aGUgc291cmNlLgorICAgICAqIFNoYXBpbmcgbW9kZTogVGhlIFNFRU4gZmFtaWx5IGNoYXJhY3RlciB3aWxsIGV4cGFuZCBpbnRvIHR3byBjaGFyYWN0ZXJzIHVzaW5nIHNwYWNlIG5lYXIKKyAgICAgKiAgICAgICAgICAgICAgIHRoZSBTRUVOIGZhbWlseSBjaGFyYWN0ZXIoaS5lLiB0aGUgc3BhY2UgYWZ0ZXIgdGhlIGNoYXJhY3RlcikuCisgICAgICogICAgICAgICAgICAgICBpZiB0aGVyZSBhcmUgbm8gc3BhY2VzIGZvdW5kLCBBcmFiaWNTaGFwaW5nRXhjZXB0aW9uIHdpbGwgYmUgdGhyb3duCisgICAgICoKKyAgICAgKiBEZS1zaGFwaW5nIG1vZGU6IEFueSBTZWVuIGNoYXJhY3RlciBmb2xsb3dlZCBieSBUYWlsIGNoYXJhY3RlciB3aWxsIGJlCisgICAgICogICAgICAgICAgICAgICAgICByZXBsYWNlZCBieSBvbmUgY2VsbCBTZWVuIGFuZCBhIHNwYWNlIHdpbGwgcmVwbGFjZSB0aGUgVGFpbC4KKyAgICAgKiBBZmZlY3RzOiBTZWVuIG9wdGlvbnMKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTRUVOX1RXT0NFTExfTkVBUiA9IDB4MjAwMDAwOworCisgICAgLyoqIEJpdCBtYXNrIGZvciBTZWVuIG1lbW9yeSBvcHRpb25zLiAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNFRU5fTUFTSyA9IDB4NzAwMDAwOworCisgICAgLyogWWVoSGFtemEgb3B0aW9ucyAqLworICAgIC8qKgorICAgICAqIE1lbW9yeSBvcHRpb246IHRoZSByZXN1bHQgbXVzdCBoYXZlIHRoZSBzYW1lIGxlbmd0aCBhcyB0aGUgc291cmNlLgorICAgICAqIFNoYXBpbmcgbW9kZTogVGhlIFlFSEhBTVpBIGNoYXJhY3RlciB3aWxsIGV4cGFuZCBpbnRvIHR3byBjaGFyYWN0ZXJzIHVzaW5nIHNwYWNlIG5lYXIgaXQKKyAgICAgKiAgICAgICAgICAgICAgKGkuZS4gdGhlIHNwYWNlIGFmdGVyIHRoZSBjaGFyYWN0ZXIpCisgICAgICogICAgICAgICAgICAgICBpZiB0aGVyZSBhcmUgbm8gc3BhY2VzIGZvdW5kLCBBcmFiaWNTaGFwaW5nRXhjZXB0aW9uIHdpbGwgYmUgdGhyb3duCisgICAgICoKKyAgICAgKiBEZS1zaGFwaW5nIG1vZGU6IEFueSBZZWggKGZpbmFsIG9yIGlzb2xhdGVkKSBjaGFyYWN0ZXIgZm9sbG93ZWQgYnkgSGFtemEgY2hhcmFjdGVyIHdpbGwgYmUKKyAgICAgKiAgICAgICAgICAgICAgICAgIHJlcGxhY2VkIGJ5IG9uZSBjZWxsIFllaEhhbXphIGFuZCBzcGFjZSB3aWxsIHJlcGxhY2UgdGhlIEhhbXphLgorICAgICAqIEFmZmVjdHM6IFllaEhhbXphIG9wdGlvbnMKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBZRUhIQU1aQV9UV09DRUxMX05FQVIgID0gMHgxMDAwMDAwOworCisKKyAgICAvKiogQml0IG1hc2sgZm9yIFllaEhhbXphIG1lbW9yeSBvcHRpb25zLiAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFlFSEhBTVpBX01BU0sgPSAweDM4MDAwMDA7CisKKyAgICAvKiBOZXcgVGFzaGtlZWwgb3B0aW9ucyAqLworICAgIC8qKgorICAgICAqIE1lbW9yeSBvcHRpb246IHRoZSByZXN1bHQgbXVzdCBoYXZlIHRoZSBzYW1lIGxlbmd0aCBhcyB0aGUgc291cmNlLgorICAgICAqIFNoYXBpbmcgbW9kZTogVGFzaGtlZWwgY2hhcmFjdGVycyB3aWxsIGJlIHJlcGxhY2VkIGJ5IHNwYWNlcy4KKyAgICAgKiAgICAgICAgICAgICAgIFNwYWNlcyB3aWxsIGJlIHBsYWNlZCBhdCBiZWdpbm5pbmcgb2YgdGhlIGJ1ZmZlcgorICAgICAqCisgICAgICogRGUtc2hhcGluZyBtb2RlOiBOL0EKKyAgICAgKiBBZmZlY3RzOiBUYXNoa2VlbCBvcHRpb25zCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVEFTSEtFRUxfQkVHSU4gPSAweDQwMDAwOworCisgICAgLyoqCisgICAgICogTWVtb3J5IG9wdGlvbjogdGhlIHJlc3VsdCBtdXN0IGhhdmUgdGhlIHNhbWUgbGVuZ3RoIGFzIHRoZSBzb3VyY2UuCisgICAgICogU2hhcGluZyBtb2RlOiBUYXNoa2VlbCBjaGFyYWN0ZXJzIHdpbGwgYmUgcmVwbGFjZWQgYnkgc3BhY2VzLgorICAgICAqICAgICAgICAgICAgICAgU3BhY2VzIHdpbGwgYmUgcGxhY2VkIGF0IGVuZCBvZiB0aGUgYnVmZmVyCisgICAgICoKKyAgICAgKiBEZS1zaGFwaW5nIG1vZGU6IE4vQQorICAgICAqIEFmZmVjdHM6IFRhc2hrZWVsIG9wdGlvbnMKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUQVNIS0VFTF9FTkQgPSAweDYwMDAwOworCisgICAgLyoqCisgICAgICogTWVtb3J5IG9wdGlvbjogYWxsb3cgdGhlIHJlc3VsdCB0byBoYXZlIGEgZGlmZmVyZW50IGxlbmd0aCB0aGFuIHRoZSBzb3VyY2UuCisgICAgICogU2hhcGluZyBtb2RlOiBUYXNoa2VlbCBjaGFyYWN0ZXJzIHdpbGwgYmUgcmVtb3ZlZCwgYnVmZmVyIGxlbmd0aCB3aWxsIHNocmluay4KKyAgICAgKiBEZS1zaGFwaW5nIG1vZGU6IE4vQQorICAgICAqCisgICAgICogQWZmZWN0czogVGFzaGtlZWwgb3B0aW9ucworICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRBU0hLRUVMX1JFU0laRSA9IDB4ODAwMDA7CisKKyAgICAvKioKKyAgICAgKiBNZW1vcnkgb3B0aW9uOiB0aGUgcmVzdWx0IG11c3QgaGF2ZSB0aGUgc2FtZSBsZW5ndGggYXMgdGhlIHNvdXJjZS4KKyAgICAgKiBTaGFwaW5nIG1vZGU6IFRhc2hrZWVsIGNoYXJhY3RlcnMgd2lsbCBiZSByZXBsYWNlZCBieSBUYXR3ZWVsIGlmIGl0IGlzIGNvbm5lY3RlZCB0byBhZGphY2VudAorICAgICAqICAgICAgICAgICAgICAgY2hhcmFjdGVycyAoaS5lLiBzaGFwZWQgb24gVGF0d2VlbCkgb3IgcmVwbGFjZWQgYnkgc3BhY2UgaWYgaXQgaXMgbm90IGNvbm5lY3RlZC4KKyAgICAgKgorICAgICAqIERlLXNoYXBpbmcgbW9kZTogTi9BCisgICAgICogQWZmZWN0czogWWVoSGFtemEgb3B0aW9ucworICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRBU0hLRUVMX1JFUExBQ0VfQllfVEFUV0VFTCA9IDB4QzAwMDA7CisKKyAgICAvKiogQml0IG1hc2sgZm9yIFRhc2hrZWVsIHJlcGxhY2VtZW50IHdpdGggU3BhY2Ugb3IgVGF0d2VlbCBtZW1vcnkgb3B0aW9ucy4gKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUQVNIS0VFTF9NQVNLICA9IDB4RTAwMDA7CisKKyAgICAvKiBTcGFjZSBsb2NhdGlvbiBDb250cm9sIG9wdGlvbnMgKi8KKyAgICAvKioKKyAgICAgKiBUaGlzIG9wdGlvbiBlZmZlY3RzIHRoZSBtZWFuaW5nIG9mIEJFR0lOIGFuZCBFTkQgb3B0aW9ucy4gaWYgdGhpcyBvcHRpb24gaXMgbm90IHVzZWQgdGhlIGRlZmF1bHQKKyAgICAgKiBmb3IgQkVHSU4gYW5kIEVORCB3aWxsIGJlIGFzIGZvbGxvd2luZzoKKyAgICAgKiBUaGUgRGVmYXVsdCAoZm9yIGJvdGggVmlzdWFsIExUUiwgVmlzdWFsIFJUTCBhbmQgTG9naWNhbCBUZXh0KQorICAgICAqICAgICAgICAgICAxLiBCRUdJTiBhbHdheXMgcmVmZXJzIHRvIHRoZSBzdGFydCBhZGRyZXNzIG9mIHBoeXNpY2FsIG1lbW9yeS4KKyAgICAgKiAgICAgICAgICAgMi4gRU5EIGFsd2F5cyByZWZlcnMgdG8gdGhlIGVuZCBhZGRyZXNzIG9mIHBoeXNpY2FsIG1lbW9yeS4KKyAgICAgKgorICAgICAqIElmIHRoaXMgb3B0aW9uIGlzIHVzZWQgaXQgd2lsbCBzd2FwIHRoZSBtZWFuaW5nIG9mIEJFR0lOIGFuZCBFTkQgb25seSBmb3IgVmlzdWFsIExUUiB0ZXh0LgorICAgICAqCisgICAgICogVGhlIGFmZmVjdCBvbiBCRUdJTiBhbmQgRU5EIE1lbW9yeSBPcHRpb25zIHdpbGwgYmUgYXMgZm9sbG93aW5nOgorICAgICAqICAgIEEuIEJFR0lOIEZvciBWaXN1YWwgTFRSIHRleHQ6IFRoaXMgd2lsbCBiZSB0aGUgYmVnaW5uaW5nIChyaWdodCBzaWRlKSBvZiB0aGUgdmlzdWFsIHRleHQKKyAgICAgKiAgICAgICAoY29ycmVzcG9uZGluZyB0byB0aGUgcGh5c2ljYWwgbWVtb3J5IGFkZHJlc3MgZW5kLCBzYW1lIGFzIEVORCBpbiBkZWZhdWx0IGJlaGF2aW9yKQorICAgICAqICAgIEIuIEJFR0lOIEZvciBMb2dpY2FsIHRleHQ6IFNhbWUgYXMgQkVHSU4gaW4gZGVmYXVsdCBiZWhhdmlvci4KKyAgICAgKiAgICBDLiBFTkQgRm9yIFZpc3VhbCBMVFIgdGV4dDogVGhpcyB3aWxsIGJlIHRoZSBlbmQgKGxlZnQgc2lkZSkgb2YgdGhlIHZpc3VhbCB0ZXh0LiAoY29ycmVzcG9uZGluZyB0bworICAgICAqICAgICAgdGhlIHBoeXNpY2FsIG1lbW9yeSBhZGRyZXNzIGJlZ2lubmluZywgc2FtZSBhcyBCRUdJTiBpbiBkZWZhdWx0IGJlaGF2aW9yKQorICAgICAqICAgIEQuIEVORCBGb3IgTG9naWNhbCB0ZXh0OiBTYW1lIGFzIEVORCBpbiBkZWZhdWx0IGJlaGF2aW9yLgorICAgICAqIEFmZmVjdHM6IEFsbCBMYW1BbGVmIEJFR0lOLCBFTkQgYW5kIEFVVE8gb3B0aW9ucy4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTUEFDRVNfUkVMQVRJVkVfVE9fVEVYVF9CRUdJTl9FTkQgPSAweDQwMDAwMDA7CisKKyAgICAvKiogQml0IG1hc2sgZm9yIHN3YXBwaW5nIEJFR0lOIGFuZCBFTkQgZm9yIFZpc3VhbCBMVFIgdGV4dCAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNQQUNFU19SRUxBVElWRV9UT19URVhUX01BU0sgPSAweDQwMDAwMDA7CisKKyAgICAvKioKKyAgICAgKiBJZiB0aGlzIG9wdGlvbiBpcyB1c2VkLCBzaGFwaW5nIHdpbGwgdXNlIHRoZSBuZXcgVW5pY29kZSBjb2RlIHBvaW50IGZvciBUQUlMIChpLmUuIDB4RkU3MykuCisgICAgICogSWYgdGhpcyBvcHRpb24gaXMgbm90IHNwZWNpZmllZCAoRGVmYXVsdCksIG9sZCB1bm9mZmljaWFsIFVuaWNvZGUgVEFJTCBjb2RlIHBvaW50IGlzIHVzZWQgKGkuZS4gMHgyMDBCKQorICAgICAqIERlLXNoYXBpbmcgd2lsbCBub3QgdXNlIHRoaXMgb3B0aW9uIGFzIGl0IHdpbGwgYWx3YXlzIHNlYXJjaCBmb3IgYm90aCB0aGUgbmV3IFVuaWNvZGUgY29kZSBwb2ludCBmb3IgdGhlCisgICAgICogVEFJTCAoaS5lLiAweEZFNzMpIG9yIHRoZSBvbGQgdW5vZmZpY2lhbCBVbmljb2RlIFRBSUwgY29kZSBwb2ludCAoaS5lLiAweDIwMEIpIGFuZCBkZS1zaGFwZSB0aGUKKyAgICAgKiBTZWVuLUZhbWlseSBsZXR0ZXIgYWNjb3JkaW5nbHkuCisgICAgICoKKyAgICAgKiBTaGFwaW5nIE1vZGU6IE9ubHkgc2hhcGluZy4KKyAgICAgKiBEZS1zaGFwaW5nIE1vZGU6IE4vQS4KKyAgICAgKiBBZmZlY3RzOiBBbGwgU2VlbiBvcHRpb25zCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0hBUEVfVEFJTF9ORVdfVU5JQ09ERSA9IDB4ODAwMDAwMDsKKworICAgIC8qKiBCaXQgbWFzayBmb3IgbmV3IFVuaWNvZGUgVGFpbCBvcHRpb24gKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTSEFQRV9UQUlMX1RZUEVfTUFTSyA9IDB4ODAwMDAwMDsKKworICAgIC8qKgorICAgICAqIE1lbW9yeSBvcHRpb246IGFsbG93IHRoZSByZXN1bHQgdG8gaGF2ZSBhIGRpZmZlcmVudCBsZW5ndGggdGhhbiB0aGUgc291cmNlLgorICAgICAqIEBzdGFibGUgSUNVIDIuMAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IExFTkdUSF9HUk9XX1NIUklOSyA9IDA7CisKKyAgICAvKioKKyAgICAgKiBNZW1vcnkgb3B0aW9uOiBhbGxvdyB0aGUgcmVzdWx0IHRvIGhhdmUgYSBkaWZmZXJlbnQgbGVuZ3RoIHRoYW4gdGhlIHNvdXJjZS4KKyAgICAgKiBBZmZlY3RzOiBMYW1BbGVmIG9wdGlvbnMKKyAgICAgKiBUaGlzIG9wdGlvbiBpcyBhbiBhbGlhcyB0byBMRU5HVEhfR1JPV19TSFJJTksKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBMQU1BTEVGX1JFU0laRSAgID0gMDsKKworICAgIC8qKgorICAgICAqIE1lbW9yeSBvcHRpb246IHRoZSByZXN1bHQgbXVzdCBoYXZlIHRoZSBzYW1lIGxlbmd0aCBhcyB0aGUgc291cmNlLgorICAgICAqIElmIG1vcmUgcm9vbSBpcyBuZWNlc3NhcnksIHRoZW4gdHJ5IHRvIGNvbnN1bWUgc3BhY2VzIG5leHQgdG8gbW9kaWZpZWQgY2hhcmFjdGVycy4KKyAgICAgKiBAc3RhYmxlIElDVSAyLjAKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBMRU5HVEhfRklYRURfU1BBQ0VTX05FQVIgPSAxOworCisgICAgLyoqCisgICAgICogTWVtb3J5IG9wdGlvbjogdGhlIHJlc3VsdCBtdXN0IGhhdmUgdGhlIHNhbWUgbGVuZ3RoIGFzIHRoZSBzb3VyY2UuCisgICAgICogSWYgbW9yZSByb29tIGlzIG5lY2Vzc2FyeSwgdGhlbiB0cnkgdG8gY29uc3VtZSBzcGFjZXMgbmV4dCB0byBtb2RpZmllZCBjaGFyYWN0ZXJzLgorICAgICAqIEFmZmVjdHM6IExhbUFsZWYgb3B0aW9ucworICAgICAqIFRoaXMgb3B0aW9uIGlzIGFuIGFsaWFzIHRvIExFTkdUSF9GSVhFRF9TUEFDRVNfTkVBUgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IExBTUFMRUZfTkVBUiA9IDEgOworCisgICAgLyoqCisgICAgICogTWVtb3J5IG9wdGlvbjogdGhlIHJlc3VsdCBtdXN0IGhhdmUgdGhlIHNhbWUgbGVuZ3RoIGFzIHRoZSBzb3VyY2UuCisgICAgICogSWYgbW9yZSByb29tIGlzIG5lY2Vzc2FyeSwgdGhlbiB0cnkgdG8gY29uc3VtZSBzcGFjZXMgYXQgdGhlIGVuZCBvZiB0aGUgdGV4dC4KKyAgICAgKiBAc3RhYmxlIElDVSAyLjAKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBMRU5HVEhfRklYRURfU1BBQ0VTX0FUX0VORCA9IDI7CisKKworICAgIC8qKgorICAgICAqIE1lbW9yeSBvcHRpb246IHRoZSByZXN1bHQgbXVzdCBoYXZlIHRoZSBzYW1lIGxlbmd0aCBhcyB0aGUgc291cmNlLgorICAgICAqIElmIG1vcmUgcm9vbSBpcyBuZWNlc3NhcnksIHRoZW4gdHJ5IHRvIGNvbnN1bWUgc3BhY2VzIGF0IHRoZSBlbmQgb2YgdGhlIHRleHQuCisgICAgICogQWZmZWN0czogTGFtQWxlZiBvcHRpb25zCisgICAgICogVGhpcyBvcHRpb24gaXMgYW4gYWxpYXMgdG8gTEVOR1RIX0ZJWEVEX1NQQUNFU19BVF9FTkQKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBMQU1BTEVGX0VORCA9IDI7CisKKyAgICAvKioKKyAgICAgKiBNZW1vcnkgb3B0aW9uOiB0aGUgcmVzdWx0IG11c3QgaGF2ZSB0aGUgc2FtZSBsZW5ndGggYXMgdGhlIHNvdXJjZS4KKyAgICAgKiBJZiBtb3JlIHJvb20gaXMgbmVjZXNzYXJ5LCB0aGVuIHRyeSB0byBjb25zdW1lIHNwYWNlcyBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSB0ZXh0LgorICAgICAqIEBzdGFibGUgSUNVIDIuMAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IExFTkdUSF9GSVhFRF9TUEFDRVNfQVRfQkVHSU5OSU5HID0gMzsKKworICAgIC8qKgorICAgICAqIE1lbW9yeSBvcHRpb246IHRoZSByZXN1bHQgbXVzdCBoYXZlIHRoZSBzYW1lIGxlbmd0aCBhcyB0aGUgc291cmNlLgorICAgICAqIElmIG1vcmUgcm9vbSBpcyBuZWNlc3NhcnksIHRoZW4gdHJ5IHRvIGNvbnN1bWUgc3BhY2VzIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIHRleHQuCisgICAgICogQWZmZWN0czogTGFtQWxlZiBvcHRpb25zCisgICAgICogVGhpcyBvcHRpb24gaXMgYW4gYWxpYXMgdG8gTEVOR1RIX0ZJWEVEX1NQQUNFU19BVF9CRUdJTk5JTkcKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBMQU1BTEVGX0JFR0lOID0gMzsKKworICAgIC8qKgorICAgICAqIE1lbW9yeSBvcHRpb246IHRoZSByZXN1bHQgbXVzdCBoYXZlIHRoZSBzYW1lIGxlbmd0aCBhcyB0aGUgc291cmNlLgorICAgICAqIFNoYXBpbmcgTW9kZTogRm9yIGVhY2ggTEFNQUxFRiBjaGFyYWN0ZXIgZm91bmQsIGV4cGFuZCBMQU1BTEVGIHVzaW5nIHNwYWNlIGF0IGVuZC4KKyAgICAgKiAgICAgICAgICAgICAgIElmIHRoZXJlIGlzIG5vIHNwYWNlIGF0IGVuZCwgdXNlIHNwYWNlcyBhdCBiZWdpbm5pbmcgb2YgdGhlIGJ1ZmZlci4gSWYgdGhlcmUKKyAgICAgKiAgICAgICAgICAgICAgIGlzIG5vIHNwYWNlIGF0IGJlZ2lubmluZyBvZiB0aGUgYnVmZmVyLCB1c2Ugc3BhY2VzIGF0IHRoZSBuZWFyIChpLmUuIHRoZSBzcGFjZQorICAgICAqICAgICAgICAgICAgICAgYWZ0ZXIgdGhlIExBTUFMRUYgY2hhcmFjdGVyKS4KKyAgICAgKgorICAgICAqIERlc2hhcGluZyBNb2RlOiBQZXJmb3JtIHRoZSBzYW1lIGZ1bmN0aW9uIGFzIHRoZSBmbGFnIGVxdWFscyBMQU1BTEVGX0VORC4KKyAgICAgKiBBZmZlY3RzOiBMYW1BbGVmIG9wdGlvbnMKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBMQU1BTEVGX0FVVE8gID0gMHgxMDAwMDsKKworICAgIC8qKgorICAgICAqIEJpdCBtYXNrIGZvciBtZW1vcnkgb3B0aW9ucy4KKyAgICAgKiBAc3RhYmxlIElDVSAyLjAKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBMRU5HVEhfTUFTSyA9IDB4MTAwMDM7CisKKyAgICAvKiogQml0IG1hc2sgZm9yIExhbUFsZWYgbWVtb3J5IG9wdGlvbnMuICovCisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBMQU1BTEVGX01BU0sgID0gMHgxMDAwMzsKKworICAgIC8qKgorICAgICAqIERpcmVjdGlvbiBpbmRpY2F0b3I6IHRoZSBzb3VyY2UgaXMgaW4gbG9naWNhbCAoa2V5Ym9hcmQpIG9yZGVyLgorICAgICAqIEBzdGFibGUgSUNVIDIuMAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRFWFRfRElSRUNUSU9OX0xPR0lDQUwgPSAwOworCisgICAgLyoqCisgICAgICogRGlyZWN0aW9uIGluZGljYXRvcjp0aGUgc291cmNlIGlzIGluIHZpc3VhbCBSVEwgb3JkZXIsCisgICAgICogdGhlIHJpZ2h0bW9zdCBkaXNwbGF5ZWQgY2hhcmFjdGVyIHN0b3JlZCBmaXJzdC4KKyAgICAgKiBUaGlzIG9wdGlvbiBpcyBhbiBhbGlhcyB0byBVX1NIQVBFX1RFWFRfRElSRUNUSU9OX0xPR0lDQUwKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBURVhUX0RJUkVDVElPTl9WSVNVQUxfUlRMID0gMDsKKworICAgIC8qKgorICAgICAqIERpcmVjdGlvbiBpbmRpY2F0b3I6IHRoZSBzb3VyY2UgaXMgaW4gdmlzdWFsIChkaXNwbGF5KSBvcmRlciwgdGhhdCBpcywKKyAgICAgKiB0aGUgbGVmdG1vc3QgZGlzcGxheWVkIGNoYXJhY3RlciBpcyBzdG9yZWQgZmlyc3QuCisgICAgICogQHN0YWJsZSBJQ1UgMi4wCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVEVYVF9ESVJFQ1RJT05fVklTVUFMX0xUUiA9IDQ7CisKKyAgICAvKioKKyAgICAgKiBCaXQgbWFzayBmb3IgZGlyZWN0aW9uIGluZGljYXRvcnMuCisgICAgICogQHN0YWJsZSBJQ1UgMi4wCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVEVYVF9ESVJFQ1RJT05fTUFTSyA9IDQ7CisKKworICAgIC8qKgorICAgICAqIExldHRlciBzaGFwaW5nIG9wdGlvbjogZG8gbm90IHBlcmZvcm0gbGV0dGVyIHNoYXBpbmcuCisgICAgICogQHN0YWJsZSBJQ1UgMi4wCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTEVUVEVSU19OT09QID0gMDsKKworICAgIC8qKgorICAgICAqIExldHRlciBzaGFwaW5nIG9wdGlvbjogcmVwbGFjZSBub3JtYXRpdmUgbGV0dGVyIGNoYXJhY3RlcnMgaW4gdGhlIFUrMDYwMCAoQXJhYmljKSBibG9jaywKKyAgICAgKiBieSBzaGFwZWQgb25lcyBpbiB0aGUgVStGRTcwIChQcmVzZW50YXRpb24gRm9ybXMgQikgYmxvY2suIFBlcmZvcm1zIExhbS1BbGVmIGxpZ2F0dXJlCisgICAgICogc3Vic3RpdHV0aW9uLgorICAgICAqIEBzdGFibGUgSUNVIDIuMAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IExFVFRFUlNfU0hBUEUgPSA4OworCisgICAgLyoqCisgICAgICogTGV0dGVyIHNoYXBpbmcgb3B0aW9uOiByZXBsYWNlIHNoYXBlZCBsZXR0ZXIgY2hhcmFjdGVycyBpbiB0aGUgVStGRTcwIChQcmVzZW50YXRpb24gRm9ybXMgQikgYmxvY2sKKyAgICAgKiBieSBub3JtYXRpdmUgb25lcyBpbiB0aGUgVSswNjAwIChBcmFiaWMpIGJsb2NrLiAgQ29udmVydHMgTGFtLUFsZWYgbGlnYXR1cmVzIHRvIHBhaXJzIG9mIExhbSBhbmQKKyAgICAgKiBBbGVmIGNoYXJhY3RlcnMsIGNvbnN1bWluZyBzcGFjZXMgaWYgcmVxdWlyZWQuCisgICAgICogQHN0YWJsZSBJQ1UgMi4wCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTEVUVEVSU19VTlNIQVBFID0gMHgxMDsKKworICAgIC8qKgorICAgICAqIExldHRlciBzaGFwaW5nIG9wdGlvbjogcmVwbGFjZSBub3JtYXRpdmUgbGV0dGVyIGNoYXJhY3RlcnMgaW4gdGhlIFUrMDYwMCAoQXJhYmljKSBibG9jaywKKyAgICAgKiBleGNlcHQgZm9yIHRoZSBUQVNIS0VFTCBjaGFyYWN0ZXJzIGF0IFUrMDY0Qi4uLlUrMDY1MiwgYnkgc2hhcGVkIG9uZXMgaW4gdGhlIFUrRmU3MAorICAgICAqIChQcmVzZW50YXRpb24gRm9ybXMgQikgYmxvY2suICBUaGUgVEFTSEtFRUwgY2hhcmFjdGVycyB3aWxsIGFsd2F5cyBiZSBjb252ZXJ0ZWQgdG8KKyAgICAgKiB0aGUgaXNvbGF0ZWQgZm9ybXMgcmF0aGVyIHRoYW4gdG8gdGhlaXIgY29ycmVjdCBzaGFwZS4KKyAgICAgKiBAc3RhYmxlIElDVSAyLjAKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBMRVRURVJTX1NIQVBFX1RBU0hLRUVMX0lTT0xBVEVEID0gMHgxODsKKworICAgIC8qKgorICAgICAqIEJpdCBtYXNrIGZvciBsZXR0ZXIgc2hhcGluZyBvcHRpb25zLgorICAgICAqIEBzdGFibGUgSUNVIDIuMAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IExFVFRFUlNfTUFTSyA9IDB4MTg7CisKKworICAgIC8qKgorICAgICAqIERpZ2l0IHNoYXBpbmcgb3B0aW9uOiBkbyBub3QgcGVyZm9ybSBkaWdpdCBzaGFwaW5nLgorICAgICAqIEBzdGFibGUgSUNVIDIuMAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERJR0lUU19OT09QID0gMDsKKworICAgIC8qKgorICAgICAqIERpZ2l0IHNoYXBpbmcgb3B0aW9uOiBSZXBsYWNlIEV1cm9wZWFuIGRpZ2l0cyAoVSswMDMwLi4uVSswMDM5KSBieSBBcmFiaWMtSW5kaWMgZGlnaXRzLgorICAgICAqIEBzdGFibGUgSUNVIDIuMAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERJR0lUU19FTjJBTiA9IDB4MjA7CisKKyAgICAvKioKKyAgICAgKiBEaWdpdCBzaGFwaW5nIG9wdGlvbjogUmVwbGFjZSBBcmFiaWMtSW5kaWMgZGlnaXRzIGJ5IEV1cm9wZWFuIGRpZ2l0cyAoVSswMDMwLi4uVSswMDM5KS4KKyAgICAgKiBAc3RhYmxlIElDVSAyLjAKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBESUdJVFNfQU4yRU4gPSAweDQwOworCisgICAgLyoqCisgICAgICogRGlnaXQgc2hhcGluZyBvcHRpb246CisgICAgICogUmVwbGFjZSBFdXJvcGVhbiBkaWdpdHMgKFUrMDAzMC4uLlUrMDAzOSkgYnkgQXJhYmljLUluZGljIGRpZ2l0cworICAgICAqIGlmIHRoZSBtb3N0IHJlY2VudCBzdHJvbmdseSBkaXJlY3Rpb25hbCBjaGFyYWN0ZXIKKyAgICAgKiBpcyBhbiBBcmFiaWMgbGV0dGVyIChpdHMgQmlkaSBkaXJlY3Rpb24gdmFsdWUgaXMgUklHSFRfVE9fTEVGVF9BUkFCSUMpLgorICAgICAqIFRoZSBpbml0aWFsIHN0YXRlIGF0IHRoZSBzdGFydCBvZiB0aGUgdGV4dCBpcyBhc3N1bWVkIHRvIGJlIG5vdCBhbiBBcmFiaWMsCisgICAgICogbGV0dGVyLCBzbyBFdXJvcGVhbiBkaWdpdHMgYXQgdGhlIHN0YXJ0IG9mIHRoZSB0ZXh0IHdpbGwgbm90IGNoYW5nZS4KKyAgICAgKiBDb21wYXJlIHRvIERJR0lUU19BTEVOMkFOX0lOSVRfQUwuCisgICAgICogQHN0YWJsZSBJQ1UgMi4wCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRElHSVRTX0VOMkFOX0lOSVRfTFIgPSAweDYwOworCisgICAgLyoqCisgICAgICogRGlnaXQgc2hhcGluZyBvcHRpb246CisgICAgICogUmVwbGFjZSBFdXJvcGVhbiBkaWdpdHMgKFUrMDAzMC4uLlUrMDAzOSkgYnkgQXJhYmljLUluZGljIGRpZ2l0cworICAgICAqIGlmIHRoZSBtb3N0IHJlY2VudCBzdHJvbmdseSBkaXJlY3Rpb25hbCBjaGFyYWN0ZXIKKyAgICAgKiBpcyBhbiBBcmFiaWMgbGV0dGVyIChpdHMgQmlkaSBkaXJlY3Rpb24gdmFsdWUgaXMgUklHSFRfVE9fTEVGVF9BUkFCSUMpLgorICAgICAqIFRoZSBpbml0aWFsIHN0YXRlIGF0IHRoZSBzdGFydCBvZiB0aGUgdGV4dCBpcyBhc3N1bWVkIHRvIGJlIGFuIEFyYWJpYywKKyAgICAgKiBsZXR0ZXIsIHNvIEV1cm9wZWFuIGRpZ2l0cyBhdCB0aGUgc3RhcnQgb2YgdGhlIHRleHQgd2lsbCBjaGFuZ2UuCisgICAgICogQ29tcGFyZSB0byBESUdJVFNfQUxFTjJBTl9JTlRfTFIuCisgICAgICogQHN0YWJsZSBJQ1UgMi4wCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRElHSVRTX0VOMkFOX0lOSVRfQUwgPSAweDgwOworCisgICAgLyoqIE5vdCBhIHZhbGlkIG9wdGlvbiB2YWx1ZS4gKi8KKyAgICAvL3ByaXZhdGUgc3RhdGljIGZpbmFsIGludCBESUdJVFNfUkVTRVJWRUQgPSAweGEwOworCisgICAgLyoqCisgICAgICogQml0IG1hc2sgZm9yIGRpZ2l0IHNoYXBpbmcgb3B0aW9ucy4KKyAgICAgKiBAc3RhYmxlIElDVSAyLjAKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBESUdJVFNfTUFTSyA9IDB4ZTA7CisKKyAgICAvKioKKyAgICAgKiBEaWdpdCB0eXBlIG9wdGlvbjogVXNlIEFyYWJpYy1JbmRpYyBkaWdpdHMgKFUrMDY2MC4uLlUrMDY2OSkuCisgICAgICogQHN0YWJsZSBJQ1UgMi4wCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRElHSVRfVFlQRV9BTiA9IDA7CisKKyAgICAvKioKKyAgICAgKiBEaWdpdCB0eXBlIG9wdGlvbjogVXNlIEVhc3Rlcm4gKEV4dGVuZGVkKSBBcmFiaWMtSW5kaWMgZGlnaXRzIChVKzA2ZjAuLi5VKzA2ZjkpLgorICAgICAqIEBzdGFibGUgSUNVIDIuMAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERJR0lUX1RZUEVfQU5fRVhURU5ERUQgPSAweDEwMDsKKworICAgIC8qKgorICAgICAqIEJpdCBtYXNrIGZvciBkaWdpdCB0eXBlIG9wdGlvbnMuCisgICAgICogQHN0YWJsZSBJQ1UgMi4wCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRElHSVRfVFlQRV9NQVNLID0gMHgwMTAwOyAvLyAweDNmMDA/CisKKyAgICAvKioKKyAgICAgKiBzb21lIGNvbnN0YW50cworICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGNoYXIgSEFNWkFGRV9DSEFSICAgICAgID0gJ1x1ZmU4MCc7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2hhciBIQU1aQTA2X0NIQVIgICAgICAgPSAnXHUwNjIxJzsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyIFlFSF9IQU1aQV9DSEFSICAgICA9ICdcdTA2MjYnOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGNoYXIgWUVIX0hBTVpBRkVfQ0hBUiAgID0gJ1x1RkU4OSc7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2hhciBMQU1BTEVGX1NQQUNFX1NVQiAgPSAnXHVmZmZmJzsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyIFRBU0hLRUVMX1NQQUNFX1NVQiA9ICdcdWZmZmUnOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGNoYXIgTEFNX0NIQVIgICAgICA9ICdcdTA2NDQnOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGNoYXIgU1BBQ0VfQ0hBUiAgICA9ICdcdTAwMjAnOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGNoYXIgU1BBQ0VfQ0hBUl9GT1JfTEFNQUxFRiA9ICdcdWZlZmYnOyAvLyBYWFg6IHR3ZWFrIGZvciBUZXh0TGluZSB1c2UKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyIFNIQUREQV9DSEFSICAgPSAnXHVGRTdDJzsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyIFRBVFdFRUxfQ0hBUiAgPSAnXHUwNjQwJzsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyIFNIQUREQV9UQVRXRUVMX0NIQVIgPSAnXHVGRTdEJzsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyIE5FV19UQUlMX0NIQVIgPSAnXHVGRTczJzsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyIE9MRF9UQUlMX0NIQVIgPSAnXHUyMDBCJzsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU0hBUEVfTU9ERSAgICAgID0gMDsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgREVTSEFQRV9NT0RFICAgID0gMTsKKworICAgIC8qKgorICAgICAqIEBzdGFibGUgSUNVIDIuMAorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgcmhzKSB7CisgICAgICAgIHJldHVybiByaHMgIT0gbnVsbCAmJgorICAgICAgICAgICAgcmhzLmdldENsYXNzKCkgPT0gQXJhYmljU2hhcGluZy5jbGFzcyAmJgorICAgICAgICAgICAgb3B0aW9ucyA9PSAoKEFyYWJpY1NoYXBpbmcpcmhzKS5vcHRpb25zOworICAgIH0KKworICAgIC8qKgorICAgICAqIEBzdGFibGUgSUNVIDIuMAorICAgICAqLworICAgICAvLy9DTE9WRVI6T0ZGCisgICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKKyAgICAgICAgcmV0dXJuIG9wdGlvbnM7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHN0YWJsZSBJQ1UgMi4wCisgICAgICovCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7CisgICAgICAgIGJ1Zi5hcHBlbmQoJ1snKTsKKworICAgICAgICBzd2l0Y2ggKG9wdGlvbnMgJiBMQU1BTEVGX01BU0spIHsKKyAgICAgICAgY2FzZSBMQU1BTEVGX1JFU0laRTogYnVmLmFwcGVuZCgiTGFtQWxlZiByZXNpemUiKTsgYnJlYWs7CisgICAgICAgIGNhc2UgTEFNQUxFRl9ORUFSOiBidWYuYXBwZW5kKCJMYW1BbGVmIHNwYWNlcyBhdCBuZWFyIik7IGJyZWFrOworICAgICAgICBjYXNlIExBTUFMRUZfQkVHSU46IGJ1Zi5hcHBlbmQoIkxhbUFsZWYgc3BhY2VzIGF0IGJlZ2luIik7IGJyZWFrOworICAgICAgICBjYXNlIExBTUFMRUZfRU5EOiBidWYuYXBwZW5kKCJMYW1BbGVmIHNwYWNlcyBhdCBlbmQiKTsgYnJlYWs7CisgICAgICAgIGNhc2UgTEFNQUxFRl9BVVRPOiBidWYuYXBwZW5kKCJsYW1BbGVmIGF1dG8iKTsgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgc3dpdGNoIChvcHRpb25zICYgVEVYVF9ESVJFQ1RJT05fTUFTSykgeworICAgICAgICBjYXNlIFRFWFRfRElSRUNUSU9OX0xPR0lDQUw6IGJ1Zi5hcHBlbmQoIiwgbG9naWNhbCIpOyBicmVhazsKKyAgICAgICAgY2FzZSBURVhUX0RJUkVDVElPTl9WSVNVQUxfTFRSOiBidWYuYXBwZW5kKCIsIHZpc3VhbCIpOyBicmVhazsKKyAgICAgICAgfQorICAgICAgICBzd2l0Y2ggKG9wdGlvbnMgJiBMRVRURVJTX01BU0spIHsKKyAgICAgICAgY2FzZSBMRVRURVJTX05PT1A6IGJ1Zi5hcHBlbmQoIiwgbm8gbGV0dGVyIHNoYXBpbmciKTsgYnJlYWs7CisgICAgICAgIGNhc2UgTEVUVEVSU19TSEFQRTogYnVmLmFwcGVuZCgiLCBzaGFwZSBsZXR0ZXJzIik7IGJyZWFrOworICAgICAgICBjYXNlIExFVFRFUlNfU0hBUEVfVEFTSEtFRUxfSVNPTEFURUQ6IGJ1Zi5hcHBlbmQoIiwgc2hhcGUgbGV0dGVycyB0YXNoa2VlbCBpc29sYXRlZCIpOyBicmVhazsKKyAgICAgICAgY2FzZSBMRVRURVJTX1VOU0hBUEU6IGJ1Zi5hcHBlbmQoIiwgdW5zaGFwZSBsZXR0ZXJzIik7IGJyZWFrOworICAgICAgICB9CisgICAgICAgIHN3aXRjaCAob3B0aW9ucyAmIFNFRU5fTUFTSykgeworICAgICAgICBjYXNlIFNFRU5fVFdPQ0VMTF9ORUFSOiBidWYuYXBwZW5kKCIsIFNlZW4gYXQgbmVhciIpOyBicmVhazsKKyAgICAgICAgfQorICAgICAgICBzd2l0Y2ggKG9wdGlvbnMgJiBZRUhIQU1aQV9NQVNLKSB7CisgICAgICAgIGNhc2UgWUVISEFNWkFfVFdPQ0VMTF9ORUFSOiBidWYuYXBwZW5kKCIsIFllaCBIYW16YSBhdCBuZWFyIik7IGJyZWFrOworICAgICAgICB9CisgICAgICAgIHN3aXRjaCAob3B0aW9ucyAmIFRBU0hLRUVMX01BU0spIHsKKyAgICAgICAgY2FzZSBUQVNIS0VFTF9CRUdJTjogYnVmLmFwcGVuZCgiLCBUYXNoa2VlbCBhdCBiZWdpbiIpOyBicmVhazsKKyAgICAgICAgY2FzZSBUQVNIS0VFTF9FTkQ6IGJ1Zi5hcHBlbmQoIiwgVGFzaGtlZWwgYXQgZW5kIik7IGJyZWFrOworICAgICAgICBjYXNlIFRBU0hLRUVMX1JFUExBQ0VfQllfVEFUV0VFTDogYnVmLmFwcGVuZCgiLCBUYXNoa2VlbCByZXBsYWNlIHdpdGggdGF0d2VlbCIpOyBicmVhazsKKyAgICAgICAgY2FzZSBUQVNIS0VFTF9SRVNJWkU6IGJ1Zi5hcHBlbmQoIiwgVGFzaGtlZWwgcmVzaXplIik7IGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgc3dpdGNoIChvcHRpb25zICYgRElHSVRTX01BU0spIHsKKyAgICAgICAgY2FzZSBESUdJVFNfTk9PUDogYnVmLmFwcGVuZCgiLCBubyBkaWdpdCBzaGFwaW5nIik7IGJyZWFrOworICAgICAgICBjYXNlIERJR0lUU19FTjJBTjogYnVmLmFwcGVuZCgiLCBzaGFwZSBkaWdpdHMgdG8gQU4iKTsgYnJlYWs7CisgICAgICAgIGNhc2UgRElHSVRTX0FOMkVOOiBidWYuYXBwZW5kKCIsIHNoYXBlIGRpZ2l0cyB0byBFTiIpOyBicmVhazsKKyAgICAgICAgY2FzZSBESUdJVFNfRU4yQU5fSU5JVF9MUjogYnVmLmFwcGVuZCgiLCBzaGFwZSBkaWdpdHMgdG8gQU4gY29udGV4dHVhbGx5OiBkZWZhdWx0IEVOIik7IGJyZWFrOworICAgICAgICBjYXNlIERJR0lUU19FTjJBTl9JTklUX0FMOiBidWYuYXBwZW5kKCIsIHNoYXBlIGRpZ2l0cyB0byBBTiBjb250ZXh0dWFsbHk6IGRlZmF1bHQgQUwiKTsgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgc3dpdGNoIChvcHRpb25zICYgRElHSVRfVFlQRV9NQVNLKSB7CisgICAgICAgIGNhc2UgRElHSVRfVFlQRV9BTjogYnVmLmFwcGVuZCgiLCBzdGFuZGFyZCBBcmFiaWMtSW5kaWMgZGlnaXRzIik7IGJyZWFrOworICAgICAgICBjYXNlIERJR0lUX1RZUEVfQU5fRVhURU5ERUQ6IGJ1Zi5hcHBlbmQoIiwgZXh0ZW5kZWQgQXJhYmljLUluZGljIGRpZ2l0cyIpOyBicmVhazsKKyAgICAgICAgfQorICAgICAgICBidWYuYXBwZW5kKCJdIik7CisKKyAgICAgICAgcmV0dXJuIGJ1Zi50b1N0cmluZygpOworICAgIH0KKyAgICAvLy9DTE9WRVI6T04KKworICAgIC8vCisgICAgLy8gcG9ydGVkIGFwaQorICAgIC8vCisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgSVJSRUxFVkFOVCA9IDQ7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IExBTVRZUEUgPSAxNjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQUxFRlRZUEUgPSAzMjsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBMSU5LUiA9IDE7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IExJTktMID0gMjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTElOS19NQVNLID0gMzsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBpcnJlbGV2YW50UG9zW10gPSB7CisgICAgICAgIDB4MCwgMHgyLCAweDQsIDB4NiwgMHg4LCAweEEsIDB4QywgMHhFCisgICAgfTsKKworLyoKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyIGNvbnZlcnRMYW1BbGVmW10gPSAgeworICAgICAgICAnXHUwNjIyJywgLy8gRkVGNQorICAgICAgICAnXHUwNjIyJywgLy8gRkVGNgorICAgICAgICAnXHUwNjIzJywgLy8gRkVGNworICAgICAgICAnXHUwNjIzJywgLy8gRkVGOAorICAgICAgICAnXHUwNjI1JywgLy8gRkVGOQorICAgICAgICAnXHUwNjI1JywgLy8gRkVGQQorICAgICAgICAnXHUwNjI3JywgLy8gRkVGQgorICAgICAgICAnXHUwNjI3JyAgLy8gRkVGQworICAgIH07CisqLworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IHRhaWxGYW1pbHlJc29sYXRlZEZpbmFsW10gPSB7CisgICAgICAgIC8qIEZFQjEgKi8gMSwKKyAgICAgICAgLyogRkVCMiAqLyAxLAorICAgICAgICAvKiBGRUIzICovIDAsCisgICAgICAgIC8qIEZFQjQgKi8gMCwKKyAgICAgICAgLyogRkVCNSAqLyAxLAorICAgICAgICAvKiBGRUI2ICovIDEsCisgICAgICAgIC8qIEZFQjcgKi8gMCwKKyAgICAgICAgLyogRkVCOCAqLyAwLAorICAgICAgICAvKiBGRUI5ICovIDEsCisgICAgICAgIC8qIEZFQkEgKi8gMSwKKyAgICAgICAgLyogRkVCQiAqLyAwLAorICAgICAgICAvKiBGRUJDICovIDAsCisgICAgICAgIC8qIEZFQkQgKi8gMSwKKyAgICAgICAgLyogRkVCRSAqLyAxCisgICAgfTsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCB0YXNoa2VlbE1lZGlhbFtdID0geworICAgICAgICAvKiBGRTcwICovIDAsCisgICAgICAgIC8qIEZFNzEgKi8gMSwKKyAgICAgICAgLyogRkU3MiAqLyAwLAorICAgICAgICAvKiBGRTczICovIDAsCisgICAgICAgIC8qIEZFNzQgKi8gMCwKKyAgICAgICAgLyogRkU3NSAqLyAwLAorICAgICAgICAvKiBGRTc2ICovIDAsCisgICAgICAgIC8qIEZFNzcgKi8gMSwKKyAgICAgICAgLyogRkU3OCAqLyAwLAorICAgICAgICAvKiBGRTc5ICovIDEsCisgICAgICAgIC8qIEZFN0EgKi8gMCwKKyAgICAgICAgLyogRkU3QiAqLyAxLAorICAgICAgICAvKiBGRTdDICovIDAsCisgICAgICAgIC8qIEZFN0QgKi8gMSwKKyAgICAgICAgLyogRkU3RSAqLyAwLAorICAgICAgICAvKiBGRTdGICovIDEKKyAgICB9OworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2hhciB5ZWhIYW16YVRvWWVoW10gPQorICAgIHsKKyAgICAvKiBpc29sYXRlZCovIDB4RkVFRiwKKyAgICAvKiBmaW5hbCAgICovIDB4RkVGMAorICAgIH07CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyIGNvbnZlcnROb3JtYWxpemVkTGFtQWxlZltdID0geworICAgICAgICAnXHUwNjIyJywgLy8gMDY1QworICAgICAgICAnXHUwNjIzJywgLy8gMDY1RAorICAgICAgICAnXHUwNjI1JywgLy8gMDY1RQorICAgICAgICAnXHUwNjI3JywgLy8gMDY1RgorICAgIH07CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnRbXSBhcmFMaW5rID0geworICAgICAgICAxICAgICAgICAgICArIDMyICsgMjU2ICogMHgxMSwgIC8qMHgwNjIyKi8KKyAgICAgICAgMSAgICAgICAgICAgKyAzMiArIDI1NiAqIDB4MTMsICAvKjB4MDYyMyovCisgICAgICAgIDEgICAgICAgICAgICAgICAgKyAyNTYgKiAweDE1LCAgLyoweDA2MjQqLworICAgICAgICAxICAgICAgICAgICArIDMyICsgMjU2ICogMHgxNywgIC8qMHgwNjI1Ki8KKyAgICAgICAgMSArIDIgICAgICAgICAgICArIDI1NiAqIDB4MTksICAvKjB4MDYyNiovCisgICAgICAgIDEgICAgICAgICAgICsgMzIgKyAyNTYgKiAweDFELCAgLyoweDA2MjcqLworICAgICAgICAxICsgMiAgICAgICAgICAgICsgMjU2ICogMHgxRiwgIC8qMHgwNjI4Ki8KKyAgICAgICAgMSAgICAgICAgICAgICAgICArIDI1NiAqIDB4MjMsICAvKjB4MDYyOSovCisgICAgICAgIDEgKyAyICAgICAgICAgICAgKyAyNTYgKiAweDI1LCAgLyoweDA2MkEqLworICAgICAgICAxICsgMiAgICAgICAgICAgICsgMjU2ICogMHgyOSwgIC8qMHgwNjJCKi8KKyAgICAgICAgMSArIDIgICAgICAgICAgICArIDI1NiAqIDB4MkQsICAvKjB4MDYyQyovCisgICAgICAgIDEgKyAyICAgICAgICAgICAgKyAyNTYgKiAweDMxLCAgLyoweDA2MkQqLworICAgICAgICAxICsgMiAgICAgICAgICAgICsgMjU2ICogMHgzNSwgIC8qMHgwNjJFKi8KKyAgICAgICAgMSAgICAgICAgICAgICAgICArIDI1NiAqIDB4MzksICAvKjB4MDYyRiovCisgICAgICAgIDEgICAgICAgICAgICAgICAgKyAyNTYgKiAweDNCLCAgLyoweDA2MzAqLworICAgICAgICAxICAgICAgICAgICAgICAgICsgMjU2ICogMHgzRCwgIC8qMHgwNjMxKi8KKyAgICAgICAgMSAgICAgICAgICAgICAgICArIDI1NiAqIDB4M0YsICAvKjB4MDYzMiovCisgICAgICAgIDEgKyAyICAgICAgICAgICAgKyAyNTYgKiAweDQxLCAgLyoweDA2MzMqLworICAgICAgICAxICsgMiAgICAgICAgICAgICsgMjU2ICogMHg0NSwgIC8qMHgwNjM0Ki8KKyAgICAgICAgMSArIDIgICAgICAgICAgICArIDI1NiAqIDB4NDksICAvKjB4MDYzNSovCisgICAgICAgIDEgKyAyICAgICAgICAgICAgKyAyNTYgKiAweDRELCAgLyoweDA2MzYqLworICAgICAgICAxICsgMiAgICAgICAgICAgICsgMjU2ICogMHg1MSwgIC8qMHgwNjM3Ki8KKyAgICAgICAgMSArIDIgICAgICAgICAgICArIDI1NiAqIDB4NTUsICAvKjB4MDYzOCovCisgICAgICAgIDEgKyAyICAgICAgICAgICAgKyAyNTYgKiAweDU5LCAgLyoweDA2MzkqLworICAgICAgICAxICsgMiAgICAgICAgICAgICsgMjU2ICogMHg1RCwgIC8qMHgwNjNBKi8KKyAgICAgICAgMCwgMCwgMCwgMCwgMCwgICAgICAgICAgICAgICAgICAvKjB4MDYzQi0weDA2M0YqLworICAgICAgICAxICsgMiwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qMHgwNjQwKi8KKyAgICAgICAgMSArIDIgICAgICAgICAgICArIDI1NiAqIDB4NjEsICAvKjB4MDY0MSovCisgICAgICAgIDEgKyAyICAgICAgICAgICAgKyAyNTYgKiAweDY1LCAgLyoweDA2NDIqLworICAgICAgICAxICsgMiAgICAgICAgICAgICsgMjU2ICogMHg2OSwgIC8qMHgwNjQzKi8KKyAgICAgICAgMSArIDIgICAgICAgKyAxNiArIDI1NiAqIDB4NkQsICAvKjB4MDY0NCovCisgICAgICAgIDEgKyAyICAgICAgICAgICAgKyAyNTYgKiAweDcxLCAgLyoweDA2NDUqLworICAgICAgICAxICsgMiAgICAgICAgICAgICsgMjU2ICogMHg3NSwgIC8qMHgwNjQ2Ki8KKyAgICAgICAgMSArIDIgICAgICAgICAgICArIDI1NiAqIDB4NzksICAvKjB4MDY0NyovCisgICAgICAgIDEgICAgICAgICAgICAgICAgKyAyNTYgKiAweDdELCAgLyoweDA2NDgqLworICAgICAgICAxICAgICAgICAgICAgICAgICsgMjU2ICogMHg3RiwgIC8qMHgwNjQ5Ki8KKyAgICAgICAgMSArIDIgICAgICAgICAgICArIDI1NiAqIDB4ODEsICAvKjB4MDY0QSovCisgICAgICAgIDQsIDQsIDQsIDQsICAgICAgICAgICAgICAgICAgICAgLyoweDA2NEItMHgwNjRFKi8KKyAgICAgICAgNCwgNCwgNCwgNCwgICAgICAgICAgICAgICAgICAgICAvKjB4MDY0Ri0weDA2NTIqLworICAgICAgICA0LCA0LCA0LCAwLCAwLCAgICAgICAgICAgICAgICAgIC8qMHgwNjUzLTB4MDY1NyovCisgICAgICAgIDAsIDAsIDAsIDAsICAgICAgICAgICAgICAgICAgICAgLyoweDA2NTgtMHgwNjVCKi8KKyAgICAgICAgMSAgICAgICAgICAgICAgICArIDI1NiAqIDB4ODUsICAvKjB4MDY1QyovCisgICAgICAgIDEgICAgICAgICAgICAgICAgKyAyNTYgKiAweDg3LCAgLyoweDA2NUQqLworICAgICAgICAxICAgICAgICAgICAgICAgICsgMjU2ICogMHg4OSwgIC8qMHgwNjVFKi8KKyAgICAgICAgMSAgICAgICAgICAgICAgICArIDI1NiAqIDB4OEIsICAvKjB4MDY1RiovCisgICAgICAgIDAsIDAsIDAsIDAsIDAsICAgICAgICAgICAgICAgICAgLyoweDA2NjAtMHgwNjY0Ki8KKyAgICAgICAgMCwgMCwgMCwgMCwgMCwgICAgICAgICAgICAgICAgICAvKjB4MDY2NS0weDA2NjkqLworICAgICAgICAwLCAwLCAwLCAwLCAwLCAwLCAgICAgICAgICAgICAgIC8qMHgwNjZBLTB4MDY2RiovCisgICAgICAgIDQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoweDA2NzAqLworICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qMHgwNjcxKi8KKyAgICAgICAgMSAgICAgICAgICAgKyAzMiwgICAgICAgICAgICAgICAvKjB4MDY3MiovCisgICAgICAgIDEgICAgICAgICAgICsgMzIsICAgICAgICAgICAgICAgLyoweDA2NzMqLworICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qMHgwNjc0Ki8KKyAgICAgICAgMSAgICAgICAgICAgKyAzMiwgICAgICAgICAgICAgICAvKjB4MDY3NSovCisgICAgICAgIDEsIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoweDA2NzYtMHgwNjc3Ki8KKyAgICAgICAgMSsyLCAxKzIsIDErMiwgMSsyLCAxKzIsIDErMiwgICAvKjB4MDY3OC0weDA2N0QqLworICAgICAgICAxKzIsIDErMiwgMSsyLCAxKzIsIDErMiwgMSsyLCAgIC8qMHgwNjdFLTB4MDY4MyovCisgICAgICAgIDErMiwgMSsyLCAxKzIsIDErMiwgICAgICAgICAgICAgLyoweDA2ODQtMHgwNjg3Ki8KKyAgICAgICAgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgICAvKjB4MDY4OC0weDA2OTEqLworICAgICAgICAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAgICAgICAgIC8qMHgwNjkyLTB4MDY5OSovCisgICAgICAgIDErMiwgMSsyLCAxKzIsIDErMiwgMSsyLCAxKzIsICAgLyoweDA2OUEtMHgwNkEzKi8KKyAgICAgICAgMSsyLCAxKzIsIDErMiwgMSsyLCAgICAgICAgICAgICAvKjB4MDY5QS0weDA2QTMqLworICAgICAgICAxKzIsIDErMiwgMSsyLCAxKzIsIDErMiwgMSsyLCAgIC8qMHgwNkE0LTB4MDZBRCovCisgICAgICAgIDErMiwgMSsyLCAxKzIsIDErMiwgICAgICAgICAgICAgLyoweDA2QTQtMHgwNkFEKi8KKyAgICAgICAgMSsyLCAxKzIsIDErMiwgMSsyLCAxKzIsIDErMiwgICAvKjB4MDZBRS0weDA2QjcqLworICAgICAgICAxKzIsIDErMiwgMSsyLCAxKzIsICAgICAgICAgICAgIC8qMHgwNkFFLTB4MDZCNyovCisgICAgICAgIDErMiwgMSsyLCAxKzIsIDErMiwgMSsyLCAxKzIsICAgLyoweDA2QjgtMHgwNkJGKi8KKyAgICAgICAgMSsyLCAxKzIsICAgICAgICAgICAgICAgICAgICAgICAvKjB4MDZCOC0weDA2QkYqLworICAgICAgICAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qMHgwNkMwKi8KKyAgICAgICAgMSsyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKjB4MDZDMSovCisgICAgICAgIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsICAgLyoweDA2QzItMHgwNkNCKi8KKyAgICAgICAgMSsyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKjB4MDZDQyovCisgICAgICAgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoweDA2Q0QqLworICAgICAgICAxKzIsIDErMiwgMSsyLCAxKzIsICAgICAgICAgICAgIC8qMHgwNkNFLTB4MDZEMSovCisgICAgICAgIDEsIDEgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoweDA2RDItMHgwNkQzKi8KKyAgICB9OworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50W10gcHJlc0xpbmsgPSB7CisgICAgICAgIDEgKyAyLCAgICAgICAgICAgICAgICAgICAgICAgIC8qMHhGRTcwKi8KKyAgICAgICAgMSArIDIsICAgICAgICAgICAgICAgICAgICAgICAgLyoweEZFNzEqLworICAgICAgICAxICsgMiwgMCwgMSsgMiwgMCwgMSsgMiwgICAgICAvKjB4RkU3Mi0weEZFNzYqLworICAgICAgICAxICsgMiwgICAgICAgICAgICAgICAgICAgICAgICAvKjB4RkU3NyovCisgICAgICAgIDErIDIsIDEgKyAyLCAxKzIsIDEgKyAyLCAgICAgIC8qMHhGRTc4LTB4RkU4MSovCisgICAgICAgIDErIDIsIDEgKyAyLCAxKzIsIDEgKyAyLCAgICAgIC8qMHhGRTgyLTB4RkU4NSovCisgICAgICAgIDAsIDAgKyAzMiwgMSArIDMyLCAwICsgMzIsICAgIC8qMHhGRTg2LTB4RkU4OSovCisgICAgICAgIDEgKyAzMiwgMCwgMSwgIDAgKyAzMiwgICAgICAgIC8qMHhGRThBLTB4RkU4RCovCisgICAgICAgIDEgKyAzMiwgMCwgMiwgIDEgKyAyLCAgICAgICAgIC8qMHhGRThFLTB4RkU5MSovCisgICAgICAgIDEsIDAgKyAzMiwgMSArIDMyLCAwLCAgICAgICAgIC8qMHhGRTkyLTB4RkU5NSovCisgICAgICAgIDIsIDEgKyAyLCAxLCAwLCAgICAgICAgICAgICAgIC8qMHhGRTk2LTB4RkU5OSovCisgICAgICAgIDEsIDAsIDIsIDEgKyAyLCAgICAgICAgICAgICAgIC8qMHhGRTlBLTB4RkU5RCovCisgICAgICAgIDEsIDAsIDIsIDEgKyAyLCAgICAgICAgICAgICAgIC8qMHhGRTlFLTB4RkVBMSovCisgICAgICAgIDEsIDAsIDIsIDEgKyAyLCAgICAgICAgICAgICAgIC8qMHhGRUEyLTB4RkVBNSovCisgICAgICAgIDEsIDAsIDIsIDEgKyAyLCAgICAgICAgICAgICAgIC8qMHhGRUE2LTB4RkVBOSovCisgICAgICAgIDEsIDAsIDIsIDEgKyAyLCAgICAgICAgICAgICAgIC8qMHhGRUFBLTB4RkVBRCovCisgICAgICAgIDEsIDAsIDEsIDAsICAgICAgICAgICAgICAgICAgIC8qMHhGRUFFLTB4RkVCMSovCisgICAgICAgIDEsIDAsIDEsIDAsICAgICAgICAgICAgICAgICAgIC8qMHhGRUIyLTB4RkVCNSovCisgICAgICAgIDEsIDAsIDIsIDErMiwgICAgICAgICAgICAgICAgIC8qMHhGRUI2LTB4RkVCOSovCisgICAgICAgIDEsIDAsIDIsIDErMiwgICAgICAgICAgICAgICAgIC8qMHhGRUJBLTB4RkVCRCovCisgICAgICAgIDEsIDAsIDIsIDErMiwgICAgICAgICAgICAgICAgIC8qMHhGRUJFLTB4RkVDMSovCisgICAgICAgIDEsIDAsIDIsIDErMiwgICAgICAgICAgICAgICAgIC8qMHhGRUMyLTB4RkVDNSovCisgICAgICAgIDEsIDAsIDIsIDErMiwgICAgICAgICAgICAgICAgIC8qMHhGRUM2LTB4RkVDOSovCisgICAgICAgIDEsIDAsIDIsIDErMiwgICAgICAgICAgICAgICAgIC8qMHhGRUNBLTB4RkVDRCovCisgICAgICAgIDEsIDAsIDIsIDErMiwgICAgICAgICAgICAgICAgIC8qMHhGRUNFLTB4RkVEMSovCisgICAgICAgIDEsIDAsIDIsIDErMiwgICAgICAgICAgICAgICAgIC8qMHhGRUQyLTB4RkVENSovCisgICAgICAgIDEsIDAsIDIsIDErMiwgICAgICAgICAgICAgICAgIC8qMHhGRUQ2LTB4RkVEOSovCisgICAgICAgIDEsIDAsIDIsIDErMiwgICAgICAgICAgICAgICAgIC8qMHhGRURBLTB4RkVERCovCisgICAgICAgIDEsIDAsIDIsIDErMiwgICAgICAgICAgICAgICAgIC8qMHhGRURFLTB4RkVFMSovCisgICAgICAgIDEsIDAgKyAxNiwgMiArIDE2LCAxICsgMiArMTYsIC8qMHhGRUUyLTB4RkVFNSovCisgICAgICAgIDEgKyAxNiwgMCwgMiwgMSsyLCAgICAgICAgICAgIC8qMHhGRUU2LTB4RkVFOSovCisgICAgICAgIDEsIDAsIDIsIDErMiwgICAgICAgICAgICAgICAgIC8qMHhGRUVBLTB4RkVFRCovCisgICAgICAgIDEsIDAsIDIsIDErMiwgICAgICAgICAgICAgICAgIC8qMHhGRUVFLTB4RkVGMSovCisgICAgICAgIDEsIDAsIDEsIDAsICAgICAgICAgICAgICAgICAgIC8qMHhGRUYyLTB4RkVGNSovCisgICAgICAgIDEsIDAsIDIsIDErMiwgICAgICAgICAgICAgICAgIC8qMHhGRUY2LTB4RkVGOSovCisgICAgICAgIDEsIDAsIDEsIDAsICAgICAgICAgICAgICAgICAgIC8qMHhGRUZBLTB4RkVGRCovCisgICAgICAgIDEsIDAsIDEsIDAsCisgICAgICAgIDEKKyAgICB9OworCisgICAgcHJpdmF0ZSBzdGF0aWMgaW50W10gY29udmVydEZFdG8wNiA9IHsKKyAgICAgICAgLyoqKioqKioqKioqMCoqKioqKjEqKioqKioyKioqKioqMyoqKioqKjQqKioqKio1KioqKioqNioqKioqKjcqKioqKio4KioqKioqOSoqKioqKkEqKioqKipCKioqKioqQyoqKioqKkQqKioqKipFKioqKioqRioqKi8KKyAgICAgICAgLypGRTcqLyAgIDB4NjRCLCAweDY0QiwgMHg2NEMsIDB4NjRDLCAweDY0RCwgMHg2NEQsIDB4NjRFLCAweDY0RSwgMHg2NEYsIDB4NjRGLCAweDY1MCwgMHg2NTAsIDB4NjUxLCAweDY1MSwgMHg2NTIsIDB4NjUyLAorICAgICAgICAvKkZFOCovICAgMHg2MjEsIDB4NjIyLCAweDYyMiwgMHg2MjMsIDB4NjIzLCAweDYyNCwgMHg2MjQsIDB4NjI1LCAweDYyNSwgMHg2MjYsIDB4NjI2LCAweDYyNiwgMHg2MjYsIDB4NjI3LCAweDYyNywgMHg2MjgsCisgICAgICAgIC8qRkU5Ki8gICAweDYyOCwgMHg2MjgsIDB4NjI4LCAweDYyOSwgMHg2MjksIDB4NjJBLCAweDYyQSwgMHg2MkEsIDB4NjJBLCAweDYyQiwgMHg2MkIsIDB4NjJCLCAweDYyQiwgMHg2MkMsIDB4NjJDLCAweDYyQywKKyAgICAgICAgLypGRUEqLyAgIDB4NjJDLCAweDYyRCwgMHg2MkQsIDB4NjJELCAweDYyRCwgMHg2MkUsIDB4NjJFLCAweDYyRSwgMHg2MkUsIDB4NjJGLCAweDYyRiwgMHg2MzAsIDB4NjMwLCAweDYzMSwgMHg2MzEsIDB4NjMyLAorICAgICAgICAvKkZFQiovICAgMHg2MzIsIDB4NjMzLCAweDYzMywgMHg2MzMsIDB4NjMzLCAweDYzNCwgMHg2MzQsIDB4NjM0LCAweDYzNCwgMHg2MzUsIDB4NjM1LCAweDYzNSwgMHg2MzUsIDB4NjM2LCAweDYzNiwgMHg2MzYsCisgICAgICAgIC8qRkVDKi8gICAweDYzNiwgMHg2MzcsIDB4NjM3LCAweDYzNywgMHg2MzcsIDB4NjM4LCAweDYzOCwgMHg2MzgsIDB4NjM4LCAweDYzOSwgMHg2MzksIDB4NjM5LCAweDYzOSwgMHg2M0EsIDB4NjNBLCAweDYzQSwKKyAgICAgICAgLypGRUQqLyAgIDB4NjNBLCAweDY0MSwgMHg2NDEsIDB4NjQxLCAweDY0MSwgMHg2NDIsIDB4NjQyLCAweDY0MiwgMHg2NDIsIDB4NjQzLCAweDY0MywgMHg2NDMsIDB4NjQzLCAweDY0NCwgMHg2NDQsIDB4NjQ0LAorICAgICAgICAvKkZFRSovICAgMHg2NDQsIDB4NjQ1LCAweDY0NSwgMHg2NDUsIDB4NjQ1LCAweDY0NiwgMHg2NDYsIDB4NjQ2LCAweDY0NiwgMHg2NDcsIDB4NjQ3LCAweDY0NywgMHg2NDcsIDB4NjQ4LCAweDY0OCwgMHg2NDksCisgICAgICAgIC8qRkVGKi8gICAweDY0OSwgMHg2NEEsIDB4NjRBLCAweDY0QSwgMHg2NEEsIDB4NjVDLCAweDY1QywgMHg2NUQsIDB4NjVELCAweDY1RSwgMHg2NUUsIDB4NjVGLCAweDY1RgorICAgIH07CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgc2hhcGVUYWJsZVtdW11bXSA9IHsKKyAgICAgICAgeyB7MCwwLDAsMH0sIHswLDAsMCwwfSwgezAsMSwwLDN9LCB7MCwxLDAsMX0gfSwKKyAgICAgICAgeyB7MCwwLDIsMn0sIHswLDAsMSwyfSwgezAsMSwxLDJ9LCB7MCwxLDEsM30gfSwKKyAgICAgICAgeyB7MCwwLDAsMH0sIHswLDAsMCwwfSwgezAsMSwwLDN9LCB7MCwxLDAsM30gfSwKKyAgICAgICAgeyB7MCwwLDEsMn0sIHswLDAsMSwyfSwgezAsMSwxLDJ9LCB7MCwxLDEsM30gfQorICAgIH07CisKKyAgICAvKgorICAgICAqIFRoaXMgZnVuY3Rpb24gc2hhcGVzIEV1cm9wZWFuIGRpZ2l0cyB0byBBcmFiaWMtSW5kaWMgZGlnaXRzCisgICAgICogaW4tcGxhY2UsIHdyaXRpbmcgb3ZlciB0aGUgaW5wdXQgY2hhcmFjdGVycy4gIERhdGEgaXMgaW4gdmlzdWFsCisgICAgICogb3JkZXIuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIHNoYXBlVG9BcmFiaWNEaWdpdHNXaXRoQ29udGV4dChjaGFyW10gZGVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyIGRpZ2l0QmFzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gbGFzdFN0cm9uZ1dhc0FMKSB7CisgICAgICAgIGRpZ2l0QmFzZSAtPSAnMCc7IC8vIG1vdmUgY29tbW9uIGFkanVzdG1lbnQgb3V0IG9mIGxvb3AKKworICAgICAgICBmb3IoaW50IGkgPSBzdGFydCArIGxlbmd0aDsgLS1pID49IHN0YXJ0OykgeworICAgICAgICAgICAgY2hhciBjaCA9IGRlc3RbaV07CisgICAgICAgICAgICBzd2l0Y2ggKENoYXJhY3Rlci5nZXREaXJlY3Rpb25hbGl0eShjaCkpIHsKKyAgICAgICAgICAgIGNhc2UgQ2hhcmFjdGVyLkRJUkVDVElPTkFMSVRZX0xFRlRfVE9fUklHSFQ6CisgICAgICAgICAgICBjYXNlIENoYXJhY3Rlci5ESVJFQ1RJT05BTElUWV9SSUdIVF9UT19MRUZUOgorICAgICAgICAgICAgICAgIGxhc3RTdHJvbmdXYXNBTCA9IGZhbHNlOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBDaGFyYWN0ZXIuRElSRUNUSU9OQUxJVFlfUklHSFRfVE9fTEVGVF9BUkFCSUM6CisgICAgICAgICAgICAgICAgbGFzdFN0cm9uZ1dhc0FMID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQ2hhcmFjdGVyLkRJUkVDVElPTkFMSVRZX0VVUk9QRUFOX05VTUJFUjoKKyAgICAgICAgICAgICAgICBpZiAobGFzdFN0cm9uZ1dhc0FMICYmIGNoIDw9ICdcdTAwMzknKSB7CisgICAgICAgICAgICAgICAgICAgIGRlc3RbaV0gPSAoY2hhcikoY2ggKyBkaWdpdEJhc2UpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKgorICAgICAqIE5hbWUgICAgOiBpbnZlcnRCdWZmZXIKKyAgICAgKiBGdW5jdGlvbjogVGhpcyBmdW5jdGlvbiBpbnZlcnRzIHRoZSBidWZmZXIsIGl0J3MgdXNlZAorICAgICAqICAgICAgICAgICBpbiBjYXNlIHRoZSB1c2VyIHNwZWNpZmllcyB0aGUgYnVmZmVyIHRvIGJlCisgICAgICogICAgICAgICAgIFRFWFRfRElSRUNUSU9OX0xPR0lDQUwKKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGludmVydEJ1ZmZlcihjaGFyW10gYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGVuZ3RoKSB7CisKKyAgICAgICAgZm9yKGludCBpID0gc3RhcnQsIGogPSBzdGFydCArIGxlbmd0aCAtIDE7IGkgPCBqOyBpKyssIC0taikgeworICAgICAgICAgICAgY2hhciB0ZW1wID0gYnVmZmVyW2ldOworICAgICAgICAgICAgYnVmZmVyW2ldID0gYnVmZmVyW2pdOworICAgICAgICAgICAgYnVmZmVyW2pdID0gdGVtcDsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qCisgICAgICogTmFtZSAgICA6IGNoYW5nZUxhbUFsZWYKKyAgICAgKiBGdW5jdGlvbjogQ29udmVydHMgdGhlIEFsZWYgY2hhcmFjdGVycyBpbnRvIGFuIGVxdWl2YWxlbnQKKyAgICAgKiAgICAgICAgICAgTGFtQWxlZiBsb2NhdGlvbiBpbiB0aGUgMHgwNnh4IFJhbmdlLCB0aGlzIGlzIGFuCisgICAgICogICAgICAgICAgIGludGVybWVkaWF0ZSBzdGFnZSBpbiB0aGUgb3BlcmF0aW9uIG9mIHRoZSBwcm9ncmFtCisgICAgICogICAgICAgICAgIGxhdGVyIGl0J2xsIGJlIGNvbnZlcnRlZCBpbnRvIHRoZSAweEZFeHggTGFtQWxlZnMKKyAgICAgKiAgICAgICAgICAgaW4gdGhlIHNoYXBpbmcgZnVuY3Rpb24uCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgY2hhciBjaGFuZ2VMYW1BbGVmKGNoYXIgY2gpIHsKKyAgICAgICAgc3dpdGNoKGNoKSB7CisgICAgICAgIGNhc2UgJ1x1MDYyMic6IHJldHVybiAnXHUwNjVDJzsKKyAgICAgICAgY2FzZSAnXHUwNjIzJzogcmV0dXJuICdcdTA2NUQnOworICAgICAgICBjYXNlICdcdTA2MjUnOiByZXR1cm4gJ1x1MDY1RSc7CisgICAgICAgIGNhc2UgJ1x1MDYyNyc6IHJldHVybiAnXHUwNjVGJzsKKyAgICAgICAgZGVmYXVsdDogIHJldHVybiAnXHUwMDAwJzsgLy8gbm90IGEgbGFtYWxlZgorICAgICAgICB9CisgICAgfQorCisgICAgLyoKKyAgICAgKiBOYW1lICAgIDogc3BlY2lhbENoYXIKKyAgICAgKiBGdW5jdGlvbjogU3BlY2lhbCBBcmFiaWMgY2hhcmFjdGVycyBuZWVkIHNwZWNpYWwgaGFuZGxpbmcgaW4gdGhlIHNoYXBlVW5pY29kZQorICAgICAqICAgICAgICAgICBmdW5jdGlvbiwgdGhpcyBmdW5jdGlvbiByZXR1cm5zIDEgb3IgMiBmb3IgdGhlc2Ugc3BlY2lhbCBjaGFyYWN0ZXJzCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgaW50IHNwZWNpYWxDaGFyKGNoYXIgY2gpIHsKKyAgICAgICAgaWYgKChjaCA+ICdcdTA2MjEnICYmIGNoIDwgJ1x1MDYyNicpIHx8CisgICAgICAgICAgICAoY2ggPT0gJ1x1MDYyNycpIHx8CisgICAgICAgICAgICAoY2ggPiAnXHUwNjJFJyAmJiBjaCA8ICdcdTA2MzMnKSB8fAorICAgICAgICAgICAgKGNoID4gJ1x1MDY0NycgJiYgY2ggPCAnXHUwNjRBJykgfHwKKyAgICAgICAgICAgIChjaCA9PSAnXHUwNjI5JykpIHsKKyAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICB9IGVsc2UgaWYgKGNoID49ICdcdTA2NEInICYmIGNoPD0gJ1x1MDY1MicpIHsKKyAgICAgICAgICAgIHJldHVybiAyOworICAgICAgICB9IGVsc2UgaWYgKGNoID49IDB4MDY1MyAmJiBjaCA8PSAweDA2NTUgfHwKKyAgICAgICAgICAgICAgICAgICBjaCA9PSAweDA2NzAgfHwKKyAgICAgICAgICAgICAgICAgICBjaCA+PSAweEZFNzAgJiYgY2ggPD0gMHhGRTdGKSB7CisgICAgICAgICAgICByZXR1cm4gMzsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgfQorCisgICAgLyoKKyAgICAgKiBOYW1lICAgIDogZ2V0TGluaworICAgICAqIEZ1bmN0aW9uOiBSZXNvbHZlcyB0aGUgbGluayBiZXR3ZWVuIHRoZSBjaGFyYWN0ZXJzIGFzCisgICAgICogICAgICAgICAgIEFyYWJpYyBjaGFyYWN0ZXJzIGhhdmUgZm91ciBmb3JtcyA6CisgICAgICogICAgICAgICAgIElzb2xhdGVkLCBJbml0aWFsLCBNaWRkbGUgYW5kIEZpbmFsIEZvcm0KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBpbnQgZ2V0TGluayhjaGFyIGNoKSB7CisgICAgICAgIGlmIChjaCA+PSAnXHUwNjIyJyAmJiBjaCA8PSAnXHUwNkQzJykgeworICAgICAgICAgICAgcmV0dXJuIGFyYUxpbmtbY2ggLSAnXHUwNjIyJ107CisgICAgICAgIH0gZWxzZSBpZiAoY2ggPT0gJ1x1MjAwRCcpIHsKKyAgICAgICAgICAgIHJldHVybiAzOworICAgICAgICB9IGVsc2UgaWYgKGNoID49ICdcdTIwNkQnICYmIGNoIDw9ICdcdTIwNkYnKSB7CisgICAgICAgICAgICByZXR1cm4gNDsKKyAgICAgICAgfSBlbHNlIGlmIChjaCA+PSAnXHVGRTcwJyAmJiBjaCA8PSAnXHVGRUZDJykgeworICAgICAgICAgICAgcmV0dXJuIHByZXNMaW5rW2NoIC0gJ1x1RkU3MCddOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKgorICAgICAqIE5hbWUgICAgOiBjb3VudFNwYWNlcworICAgICAqIEZ1bmN0aW9uOiBDb3VudHMgdGhlIG51bWJlciBvZiBzcGFjZXMKKyAgICAgKiAgICAgICAgICAgYXQgZWFjaCBlbmQgb2YgdGhlIGxvZ2ljYWwgYnVmZmVyCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgaW50IGNvdW50U3BhY2VzTGVmdChjaGFyW10gZGVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjb3VudCkgeworICAgICAgICBmb3IgKGludCBpID0gc3RhcnQsIGUgPSBzdGFydCArIGNvdW50OyBpIDwgZTsgKytpKSB7CisgICAgICAgICAgICBpZiAoZGVzdFtpXSAhPSBTUEFDRV9DSEFSKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGkgLSBzdGFydDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gY291bnQ7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgaW50IGNvdW50U3BhY2VzUmlnaHQoY2hhcltdIGRlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjb3VudCkgeworCisgICAgICAgIGZvciAoaW50IGkgPSBzdGFydCArIGNvdW50OyAtLWkgPj0gc3RhcnQ7KSB7CisgICAgICAgICAgICBpZiAoZGVzdFtpXSAhPSBTUEFDRV9DSEFSKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHN0YXJ0ICsgY291bnQgLSAxIC0gaTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gY291bnQ7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBOYW1lICAgIDogaXNUYXNoa2VlbENoYXIKKyAgICAgKiBGdW5jdGlvbjogUmV0dXJucyB0cnVlIGZvciBUYXNoa2VlbCBjaGFyYWN0ZXJzIGVsc2UgcmV0dXJuIGZhbHNlCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc1Rhc2hrZWVsQ2hhcihjaGFyIGNoKSB7CisgICAgICAgIHJldHVybiAoIGNoID49J1x1MDY0QicgJiYgY2ggPD0gJ1x1MDY1MicgKTsKKyAgICB9CisKKyAgICAvKgorICAgICAqTmFtZSAgICAgOiBpc1NlZW5UYWlsRmFtaWx5Q2hhcgorICAgICAqRnVuY3Rpb24gOiByZXR1cm5zIDEgaWYgdGhlIGNoYXJhY3RlciBpcyBhIHNlZW4gZmFtaWx5IGlzb2xhdGVkIGNoYXJhY3RlcgorICAgICAqICAgICAgICAgICBpbiB0aGUgRkUgcmFuZ2Ugb3RoZXJ3aXNlIHJldHVybnMgMAorICAgICAqLworCisgICAgcHJpdmF0ZSBzdGF0aWMgaW50IGlzU2VlblRhaWxGYW1pbHlDaGFyKGNoYXIgY2gpIHsKKyAgICAgICAgaWYgKGNoID49IDB4ZmViMSAmJiBjaCA8IDB4ZmViZil7CisgICAgICAgICAgICAgcmV0dXJuIHRhaWxGYW1pbHlJc29sYXRlZEZpbmFsIFtjaCAtIDB4RkVCMV07CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAgLyogTmFtZSAgICAgOiBpc1NlZW5GYW1pbHlDaGFyCisgICAgICAqIEZ1bmN0aW9uIDogcmV0dXJucyAxIGlmIHRoZSBjaGFyYWN0ZXIgaXMgYSBzZWVuIGZhbWlseSBjaGFyYWN0ZXIgaW4gdGhlIFVuaWNvZGUKKyAgICAgICogICAgICAgICAgICAwNiByYW5nZSBvdGhlcndpc2UgcmV0dXJucyAwCisgICAgICovCisKKyAgICBwcml2YXRlIHN0YXRpYyBpbnQgaXNTZWVuRmFtaWx5Q2hhcihjaGFyICBjaCl7CisgICAgICAgIGlmIChjaCA+PSAweDYzMyAmJiBjaCA8PSAweDYzNil7CisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgfWVsc2UgeworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKgorICAgICAqTmFtZSAgICAgOiBpc1RhaWxDaGFyCisgICAgICpGdW5jdGlvbiA6IHJldHVybnMgdHJ1ZSBpZiB0aGUgY2hhcmFjdGVyIG1hdGNoZXMgb25lIG9mIHRoZSB0YWlsIGNoYXJhY3RlcnMKKyAgICAgKiAgICAgICAgICAgKDB4ZmU3MyBvciAweDIwMGIpIG90aGVyd2lzZSByZXR1cm5zIGZhbHNlCisgICAgICovCisKKyAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzVGFpbENoYXIoY2hhciBjaCkgeworICAgICAgICBpZihjaCA9PSBPTERfVEFJTF9DSEFSIHx8IGNoID09IE5FV19UQUlMX0NIQVIpeworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9ZWxzZXsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKgorICAgICAqTmFtZSAgICAgOiBpc0FsZWZNYWtzb3VyYUNoYXIKKyAgICAgKkZ1bmN0aW9uIDogcmV0dXJucyB0cnVlIGlmIHRoZSBjaGFyYWN0ZXIgaXMgYSBBbGVmIE1ha3NvdXJhIEZpbmFsIG9yIGlzb2xhdGVkCisgICAgICogICAgICAgICAgIG90aGVyd2lzZSByZXR1cm5zIGZhbHNlCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc0FsZWZNYWtzb3VyYUNoYXIoY2hhciBjaCkgeworICAgICAgICByZXR1cm4gKCAoY2ggPT0gMHhGRUVGKSB8fCAoIGNoID09IDB4RkVGMCkgfHwgKGNoID09IDB4MDY0OSkpOworICAgIH0KKworICAgIC8qCisgICAgICogTmFtZSAgICAgOiBpc1llaEhhbXphQ2hhcgorICAgICAqIEZ1bmN0aW9uIDogcmV0dXJucyB0cnVlIGlmIHRoZSBjaGFyYWN0ZXIgaXMgYSB5ZWhIYW16YSBpc29sYXRlZCBvciB5ZWhoYW16YQorICAgICAqICAgICAgICAgICAgZmluYWwgaXMgZm91bmQgb3RoZXJ3aXNlIHJldHVybnMgZmFsc2UKKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzWWVoSGFtemFDaGFyKGNoYXIgY2gpIHsKKyAgICAgICAgaWYoKGNoPT0weEZFODkpfHwoY2g9PTB4RkU4QSkpeworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH1lbHNleworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorCisgICAgLyoKKyAgICAgKk5hbWUgICAgIDogaXNUYXNoa2VlbENoYXJGRQorICAgICAqRnVuY3Rpb24gOiBSZXR1cm5zIHRydWUgZm9yIFRhc2hrZWVsIGNoYXJhY3RlcnMgaW4gRkUgcmFuZ2UgZWxzZSByZXR1cm4gZmFsc2UKKyAgICAgKi8KKworICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNUYXNoa2VlbENoYXJGRShjaGFyIGNoKSB7CisgICAgICAgIHJldHVybiAoIGNoIT0weEZFNzUgJiYoY2g+PTB4RkU3MCAmJiBjaDw9IDB4RkU3RikgKTsKKyAgICB9CisKKyAgICAvKgorICAgICAqIE5hbWU6IGlzVGFzaGtlZWxPblRhdHdlZWxDaGFyCisgICAgICogRnVuY3Rpb246IENoZWNrcyBpZiB0aGUgVGFzaGtlZWwgQ2hhcmFjdGVyIGlzIG9uIFRhdHdlZWwgb3Igbm90LGlmIHRoZQorICAgICAqICAgICAgICAgICBUYXNoa2VlbCBvbiB0YXR3ZWVsIChGRSByYW5nZSksIGl0IHJldHVybnMgMSBlbHNlIGlmIHRoZQorICAgICAqICAgICAgICAgICBUYXNoa2VlbCB3aXRoIHNoYWRkYSBvbiB0YXR3ZWVsIChGQyByYW5nZSlyZXR1cm4gMiBvdGhlcndpc2UKKyAgICAgKiAgICAgICAgICAgcmV0dXJucyAwCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgaW50IGlzVGFzaGtlZWxPblRhdHdlZWxDaGFyKGNoYXIgY2gpeworICAgICAgICBpZiAoY2ggPj0gMHhmZTcwICYmIGNoIDw9IDB4ZmU3ZiAmJiBjaCAhPSBORVdfVEFJTF9DSEFSICYmIGNoICE9IDB4RkU3NSAmJiBjaCAhPSBTSEFEREFfVEFUV0VFTF9DSEFSKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gdGFzaGtlZWxNZWRpYWwgW2NoIC0gMHhGRTcwXTsKKyAgICAgICAgfSBlbHNlIGlmKCAoY2ggPj0gMHhmY2YyICYmIGNoIDw9IDB4ZmNmNCkgfHwgKGNoID09IFNIQUREQV9UQVRXRUVMX0NIQVIpKSB7CisgICAgICAgICAgICByZXR1cm4gMjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgfQorCisgICAgLyoKKyAgICAgKiBOYW1lOiBpc0lzb2xhdGVkVGFzaGtlZWxDaGFyCisgICAgICogRnVuY3Rpb246IENoZWNrcyBpZiB0aGUgVGFzaGtlZWwgQ2hhcmFjdGVyIGlzIGluIHRoZSBpc29sYXRlZCBmb3JtCisgICAgICogICAgICAgICAgIChpLmUuIFVuaWNvZGUgRkUgcmFuZ2UpIHJldHVybnMgMSBlbHNlIGlmIHRoZSBUYXNoa2VlbAorICAgICAqICAgICAgICAgICB3aXRoIHNoYWRkYSBpcyBpbiB0aGUgaXNvbGF0ZWQgZm9ybSAoaS5lLiBVbmljb2RlIEZDIHJhbmdlKQorICAgICAqICAgICAgICAgICByZXR1cm5zIDEgb3RoZXJ3aXNlIHJldHVybnMgMAorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGludCBpc0lzb2xhdGVkVGFzaGtlZWxDaGFyKGNoYXIgY2gpeworICAgICAgICBpZiAoY2ggPj0gMHhmZTcwICYmIGNoIDw9IDB4ZmU3ZiAmJiBjaCAhPSBORVdfVEFJTF9DSEFSICYmIGNoICE9IDB4RkU3NSl7CisgICAgICAgICAgICByZXR1cm4gKDEgLSB0YXNoa2VlbE1lZGlhbCBbY2ggLSAweEZFNzBdKTsKKyAgICAgICAgfSBlbHNlIGlmKGNoID49IDB4ZmM1ZSAmJiBjaCA8PSAweGZjNjMpeworICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIH0gZWxzZXsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgfQorCisgICAgLyoKKyAgICAgKiBOYW1lICAgIDogaXNBbGVmQ2hhcgorICAgICAqIEZ1bmN0aW9uOiBSZXR1cm5zIDEgZm9yIEFsZWYgY2hhcmFjdGVycyBlbHNlIHJldHVybiAwCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc0FsZWZDaGFyKGNoYXIgY2gpIHsKKyAgICAgICAgcmV0dXJuIGNoID09ICdcdTA2MjInIHx8IGNoID09ICdcdTA2MjMnIHx8IGNoID09ICdcdTA2MjUnIHx8IGNoID09ICdcdTA2MjcnOworICAgIH0KKworICAgIC8qCisgICAgICogTmFtZSAgICA6IGlzTGFtQWxlZkNoYXIKKyAgICAgKiBGdW5jdGlvbjogUmV0dXJucyB0cnVlIGZvciBMYW1BbGVmIGNoYXJhY3RlcnMgZWxzZSByZXR1cm4gZmFsc2UKKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzTGFtQWxlZkNoYXIoY2hhciBjaCkgeworICAgICAgICByZXR1cm4gY2ggPj0gJ1x1RkVGNScgJiYgY2ggPD0gJ1x1RkVGQyc7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc05vcm1hbGl6ZWRMYW1BbGVmQ2hhcihjaGFyIGNoKSB7CisgICAgICAgIHJldHVybiBjaCA+PSAnXHUwNjVDJyAmJiBjaCA8PSAnXHUwNjVGJzsKKyAgICB9CisKKyAgICAvKgorICAgICAqIE5hbWUgICAgOiBjYWxjdWxhdGVTaXplCisgICAgICogRnVuY3Rpb246IFRoaXMgZnVuY3Rpb24gY2FsY3VsYXRlcyB0aGUgZGVzdFNpemUgdG8gYmUgdXNlZCBpbiBwcmVmbGlnaHRpbmcKKyAgICAgKiAgICAgICAgICAgd2hlbiB0aGUgZGVzdFNpemUgaXMgZXF1YWwgdG8gMAorICAgICAqLworICAgIHByaXZhdGUgaW50IGNhbGN1bGF0ZVNpemUoY2hhcltdIHNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzb3VyY2VTdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzb3VyY2VMZW5ndGgpIHsKKworICAgICAgICBpbnQgZGVzdFNpemUgPSBzb3VyY2VMZW5ndGg7CisKKyAgICAgICAgc3dpdGNoIChvcHRpb25zICYgTEVUVEVSU19NQVNLKSB7CisgICAgICAgIGNhc2UgTEVUVEVSU19TSEFQRToKKyAgICAgICAgY2FzZSBMRVRURVJTX1NIQVBFX1RBU0hLRUVMX0lTT0xBVEVEOgorICAgICAgICAgICAgaWYgKGlzTG9naWNhbCkgeworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSBzb3VyY2VTdGFydCwgZSA9IHNvdXJjZVN0YXJ0ICsgc291cmNlTGVuZ3RoIC0gMTsgaSA8IGU7ICsraSkgeworICAgICAgICAgICAgICAgICAgICBpZiAoKHNvdXJjZVtpXSA9PSBMQU1fQ0hBUiAmJiBpc0FsZWZDaGFyKHNvdXJjZVtpKzFdKSkgfHwgaXNUYXNoa2VlbENoYXJGRShzb3VyY2VbaV0pKXsKKyAgICAgICAgICAgICAgICAgICAgICAgIC0tZGVzdFNpemU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeyAvLyB2aXN1YWwKKyAgICAgICAgICAgICAgICBmb3IoaW50IGkgPSBzb3VyY2VTdGFydCArIDEsIGUgPSBzb3VyY2VTdGFydCArIHNvdXJjZUxlbmd0aDsgaSA8IGU7ICsraSkgeworICAgICAgICAgICAgICAgICAgICBpZiAoKHNvdXJjZVtpXSA9PSBMQU1fQ0hBUiAmJiBpc0FsZWZDaGFyKHNvdXJjZVtpLTFdKSkgfHwgaXNUYXNoa2VlbENoYXJGRShzb3VyY2VbaV0pKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAtLWRlc3RTaXplOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBMRVRURVJTX1VOU0hBUEU6CisgICAgICAgICAgICBmb3IoaW50IGkgPSBzb3VyY2VTdGFydCwgZSA9IHNvdXJjZVN0YXJ0ICsgc291cmNlTGVuZ3RoOyBpIDwgZTsgKytpKSB7CisgICAgICAgICAgICAgICAgaWYgKGlzTGFtQWxlZkNoYXIoc291cmNlW2ldKSkgeworICAgICAgICAgICAgICAgICAgICBkZXN0U2l6ZSsrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBkZXN0U2l6ZTsKKyAgICB9CisKKworICAgIC8qCisgICAgICogTmFtZSAgICA6IGNvdW50U3BhY2VTdWIKKyAgICAgKiBGdW5jdGlvbjogQ291bnRzIG51bWJlciBvZiB0aW1lcyB0aGUgc3ViQ2hhciBhcHBlYXJzIGluIHRoZSBhcnJheQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgaW50IGNvdW50U3BhY2VTdWIoY2hhciBbXSBkZXN0LGludCBsZW5ndGgsIGNoYXIgc3ViQ2hhcil7CisgICAgICAgIGludCBpID0gMDsKKyAgICAgICAgaW50IGNvdW50ID0gMDsKKyAgICAgICAgd2hpbGUgKGkgPCBsZW5ndGgpIHsKKyAgICAgICAgICBpZiAoZGVzdFtpXSA9PSBzdWJDaGFyKSB7CisgICAgICAgICAgICAgIGNvdW50Kys7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICBpKys7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGNvdW50OworICAgIH0KKworICAgIC8qCisgICAgICogTmFtZSAgICA6IHNoaWZ0QXJyYXkKKyAgICAgKiBGdW5jdGlvbjogU2hpZnRzIGNoYXJhY3RlcnMgdG8gcmVwbGFjZSBzcGFjZSBzdWIgY2hhcmFjdGVycworICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzaGlmdEFycmF5KGNoYXIgW10gZGVzdCxpbnQgc3RhcnQsIGludCBlLCBjaGFyIHN1YkNoYXIpeworICAgICAgICBpbnQgdyA9IGU7CisgICAgICAgIGludCByID0gZTsKKyAgICAgICAgd2hpbGUgKC0tciA+PSBzdGFydCkgeworICAgICAgICAgIGNoYXIgY2ggPSBkZXN0W3JdOworICAgICAgICAgIGlmIChjaCAhPSBzdWJDaGFyKSB7CisgICAgICAgICAgICAtLXc7CisgICAgICAgICAgICBpZiAodyAhPSByKSB7CisgICAgICAgICAgICAgIGRlc3Rbd10gPSBjaDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgIH0KKworICAgIC8qCisgICAgICogTmFtZSAgICA6IGZsaXBBcnJheQorICAgICAqIEZ1bmN0aW9uOiBpbnZlcnRzIGFycmF5LCBzbyB0aGF0IHN0YXJ0IGJlY29tZXMgZW5kIGFuZCB2aWNlIHZlcnNhCisgICAgICovCisgICAgICBwdWJsaWMgc3RhdGljIGludCBmbGlwQXJyYXkoY2hhciBbXSBkZXN0LCBpbnQgc3RhcnQsIGludCBlLCBpbnQgdyl7CisgICAgICAgIGludCByOworICAgICAgICBpZiAodyA+IHN0YXJ0KSB7CisgICAgICAgIC8vIHNoaWZ0LCBhc3N1bWUgc21hbGwgYnVmZmVyIHNpemUgc28gZG9uJ3QgdXNlIGFycmF5Y29weQorICAgICAgICAgIHIgPSB3OworICAgICAgICAgIHcgPSBzdGFydDsKKyAgICAgICAgICB3aGlsZSAociA8IGUpIHsKKyAgICAgICAgICAgIGRlc3RbdysrXSA9IGRlc3RbcisrXTsKKyAgICAgICAgICAgfQorICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICB3ID0gZTsKKyAgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHc7CisgICAgICB9CisKKyAgICAvKgorICAgICAqIE5hbWUgICAgIDogaGFuZGxlVGFzaGtlZWxXaXRoVGF0d2VlbAorICAgICAqIEZ1bmN0aW9uIDogUmVwbGFjZXMgVGFzaGtlZWwgYXMgZm9sbG93aW5nOgorICAgICAqICAgICAgICAgICAgQ2FzZSAxIDppZiB0aGUgVGFzaGtlZWwgb24gdGF0d2VlbCwgcmVwbGFjZSBpdCB3aXRoIFRhdHdlZWwuCisgICAgICogICAgICAgICAgICBDYXNlIDIgOmlmIHRoZSBUYXNoa2VlbCBhZ2dyZWdhdGVkIHdpdGggU2hhZGRhIG9uIFRhdHdlZWwsIHJlcGxhY2UKKyAgICAgKiAgICAgICAgICAgICAgICAgICBpdCB3aXRoIFNoYWRkYSBvbiBUYXR3ZWVsLgorICAgICAqICAgICAgICAgICAgQ2FzZSAzOiBpZiB0aGUgVGFzaGtlZWwgaXMgaXNvbGF0ZWQgcmVwbGFjZSBpdCB3aXRoIFNwYWNlLgorICAgICAqCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgaW50IGhhbmRsZVRhc2hrZWVsV2l0aFRhdHdlZWwoY2hhcltdIGRlc3QsIGludCBzb3VyY2VMZW5ndGgpIHsKKyAgICAgICAgICAgICAgICAgICAgIGludCBpOworICAgICAgICAgICAgICAgICAgICAgZm9yKGkgPSAwOyBpIDwgc291cmNlTGVuZ3RoOyBpKyspeworICAgICAgICAgICAgICAgICAgICAgICAgIGlmKChpc1Rhc2hrZWVsT25UYXR3ZWVsQ2hhcihkZXN0W2ldKSA9PSAxKSl7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3RbaV0gPSBUQVRXRUVMX0NIQVI7CisgICAgICAgICAgICAgICAgICAgICAgICB9ZWxzZSBpZigoaXNUYXNoa2VlbE9uVGF0d2VlbENoYXIoZGVzdFtpXSkgPT0gMikpeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0W2ldID0gU0hBRERBX1RBVFdFRUxfQ0hBUjsKKyAgICAgICAgICAgICAgICAgICAgICAgIH1lbHNlIGlmKChpc0lzb2xhdGVkVGFzaGtlZWxDaGFyKGRlc3RbaV0pPT0xKSAmJiBkZXN0W2ldICE9IFNIQUREQV9DSEFSKXsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdFtpXSA9IFNQQUNFX0NIQVI7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc291cmNlTGVuZ3RoOworICAgIH0KKworICAgIC8qCisgICAgICpOYW1lICAgICA6IGhhbmRsZUdlbmVyYXRlZFNwYWNlcworICAgICAqRnVuY3Rpb24gOiBUaGUgc2hhcGVVbmljb2RlIGZ1bmN0aW9uIGNvbnZlcnRzIExhbSArIEFsZWYgaW50byBMYW1BbGVmICsgc3BhY2UsCisgICAgICogICAgICAgICAgIGFuZCBUYXNoa2VlbCB0byBzcGFjZS4KKyAgICAgKiAgICAgICAgICAgaGFuZGxlR2VuZXJhdGVkU3BhY2VzIGZ1bmN0aW9uIHB1dHMgdGhlc2UgZ2VuZXJhdGVkIHNwYWNlcworICAgICAqICAgICAgICAgICBhY2NvcmRpbmcgdG8gdGhlIG9wdGlvbnMgdGhlIHVzZXIgc3BlY2lmaWVzLiBMYW1BbGVmIGFuZCBUYXNoa2VlbAorICAgICAqICAgICAgICAgICBzcGFjZXMgY2FuIGJlIHJlcGxhY2VkIGF0IGJlZ2luLCBhdCBlbmQsIGF0IG5lYXIgb3IgZGVjcmVhc2UgdGhlCisgICAgICogICAgICAgICAgIGJ1ZmZlciBzaXplLgorICAgICAqCisgICAgICogICAgICAgICAgIFRoZXJlIGlzIGFsc28gQXV0byBvcHRpb24gZm9yIExhbUFsZWYgYW5kIHRhc2hrZWVsLCB3aGljaCB3aWxsIHB1dAorICAgICAqICAgICAgICAgICB0aGUgc3BhY2VzIGF0IGVuZCBvZiB0aGUgYnVmZmVyIChvciBlbmQgb2YgdGV4dCBpZiB0aGUgdXNlciB1c2VkCisgICAgICogICAgICAgICAgIHRoZSBvcHRpb24gU1BBQ0VTX1JFTEFUSVZFX1RPX1RFWFRfQkVHSU5fRU5EKS4KKyAgICAgKgorICAgICAqICAgICAgICAgICBJZiB0aGUgdGV4dCB0eXBlIHdhcyB2aXN1YWxfTFRSIGFuZCB0aGUgb3B0aW9uCisgICAgICogICAgICAgICAgIFNQQUNFU19SRUxBVElWRV9UT19URVhUX0JFR0lOX0VORCB3YXMgc2VsZWN0ZWQgdGhlIEVORAorICAgICAqICAgICAgICAgICBvcHRpb24gd2lsbCBwbGFjZSB0aGUgc3BhY2UgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgYnVmZmVyIGFuZAorICAgICAqICAgICAgICAgICBCRUdJTiB3aWxsIHBsYWNlIHRoZSBzcGFjZSBhdCB0aGUgZW5kIG9mIHRoZSBidWZmZXIuCisgICAgICovCisgIHByaXZhdGUgaW50IGhhbmRsZUdlbmVyYXRlZFNwYWNlcyhjaGFyW10gZGVzdCwKKyAgICAgICAgICAgIGludCBzdGFydCwKKyAgICAgICAgICAgIGludCBsZW5ndGgpIHsKKworICAgICAgaW50IGxlbk9wdGlvbnNMYW1BbGVmID0gb3B0aW9ucyAmIExBTUFMRUZfTUFTSzsKKyAgICAgIGludCBsZW5PcHRpb25zVGFzaGtlZWwgPSBvcHRpb25zICYgVEFTSEtFRUxfTUFTSzsKKyAgICAgIGJvb2xlYW4gbGFtQWxlZk9uID0gZmFsc2U7CisgICAgICBib29sZWFuIHRhc2hrZWVsT24gPSBmYWxzZTsKKworICAgICAgaWYgKCFpc0xvZ2ljYWwgJiAhc3BhY2VzUmVsYXRpdmVUb1RleHRCZWdpbkVuZCkgeworICAgICAgICAgIHN3aXRjaCAobGVuT3B0aW9uc0xhbUFsZWYpIHsKKyAgICAgICAgICBjYXNlIExBTUFMRUZfQkVHSU46IGxlbk9wdGlvbnNMYW1BbGVmID0gTEFNQUxFRl9FTkQ7IGJyZWFrOworICAgICAgICAgIGNhc2UgTEFNQUxFRl9FTkQ6IGxlbk9wdGlvbnNMYW1BbGVmID0gTEFNQUxFRl9CRUdJTjsgYnJlYWs7CisgICAgICAgICAgZGVmYXVsdDogYnJlYWs7CisgICAgICAgICB9CisgICAgICAgICAgc3dpdGNoIChsZW5PcHRpb25zVGFzaGtlZWwpeworICAgICAgICAgIGNhc2UgVEFTSEtFRUxfQkVHSU46IGxlbk9wdGlvbnNUYXNoa2VlbCA9IFRBU0hLRUVMX0VORDsgYnJlYWs7CisgICAgICAgICAgY2FzZSBUQVNIS0VFTF9FTkQ6IGxlbk9wdGlvbnNUYXNoa2VlbCA9IFRBU0hLRUVMX0JFR0lOOyBicmVhazsKKyAgICAgICAgICBkZWZhdWx0OiBicmVhazsKKyAgICAgICAgICB9CisgICAgICAgIH0KKworCisgICAgICBpZiAobGVuT3B0aW9uc0xhbUFsZWYgPT0gTEFNQUxFRl9ORUFSKSB7CisgICAgICAgICAgZm9yIChpbnQgaSA9IHN0YXJ0LCBlID0gaSArIGxlbmd0aDsgaSA8IGU7ICsraSkgeworICAgICAgICAgICAgICBpZiAoZGVzdFtpXSA9PSBMQU1BTEVGX1NQQUNFX1NVQikgeworICAgICAgICAgICAgICAgICAgZGVzdFtpXSA9IFNQQUNFX0NIQVJfRk9SX0xBTUFMRUY7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisKKyAgICAgIH0gZWxzZSB7CisKKyAgICAgICAgICBmaW5hbCBpbnQgZSA9IHN0YXJ0ICsgbGVuZ3RoOworICAgICAgICAgIGludCB3TCA9IGNvdW50U3BhY2VTdWIoZGVzdCwgbGVuZ3RoLCBMQU1BTEVGX1NQQUNFX1NVQik7CisgICAgICAgICAgaW50IHdUID0gY291bnRTcGFjZVN1YihkZXN0LCBsZW5ndGgsIFRBU0hLRUVMX1NQQUNFX1NVQik7CisKKyAgICAgICAgICBpZiAobGVuT3B0aW9uc0xhbUFsZWYgPT0gTEFNQUxFRl9FTkQpeworICAgICAgICAgICAgbGFtQWxlZk9uID0gdHJ1ZTsKKyAgICAgICAgICB9CisgICAgICAgICAgaWYgKGxlbk9wdGlvbnNUYXNoa2VlbCA9PSBUQVNIS0VFTF9FTkQpeworICAgICAgICAgICAgdGFzaGtlZWxPbiA9IHRydWU7CisgICAgICAgICAgfQorCisKKyAgICAgICAgICBpZiAobGFtQWxlZk9uICYmIChsZW5PcHRpb25zTGFtQWxlZiA9PSBMQU1BTEVGX0VORCkpIHsKKyAgICAgICAgICAgIHNoaWZ0QXJyYXkoZGVzdCwgc3RhcnQsIGUsIExBTUFMRUZfU1BBQ0VfU1VCKTsKKyAgICAgICAgICAgIHdoaWxlICh3TCA+IHN0YXJ0KSB7CisgICAgICAgICAgICAgICAgZGVzdFstLXdMXSA9IFNQQUNFX0NIQVI7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorCisgICAgICAgICAgaWYgKHRhc2hrZWVsT24gJiYgKGxlbk9wdGlvbnNUYXNoa2VlbCA9PSBUQVNIS0VFTF9FTkQpKXsKKyAgICAgICAgICAgIHNoaWZ0QXJyYXkoZGVzdCwgc3RhcnQsIGUsIFRBU0hLRUVMX1NQQUNFX1NVQik7CisgICAgICAgICAgICB3aGlsZSAod1QgPiBzdGFydCkgeworICAgICAgICAgICAgICAgICBkZXN0Wy0td1RdID0gU1BBQ0VfQ0hBUjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisKKyAgICAgICAgICBsYW1BbGVmT24gPSBmYWxzZTsKKyAgICAgICAgICB0YXNoa2VlbE9uID0gZmFsc2U7CisKKyAgICAgICAgICBpZiAobGVuT3B0aW9uc0xhbUFsZWYgPT0gTEFNQUxFRl9SRVNJWkUpeworICAgICAgICAgICAgbGFtQWxlZk9uID0gdHJ1ZTsKKyAgICAgICAgICB9CisgICAgICAgICAgaWYgKGxlbk9wdGlvbnNUYXNoa2VlbCA9PSBUQVNIS0VFTF9SRVNJWkUpeworICAgICAgICAgICAgdGFzaGtlZWxPbiA9IHRydWU7CisgICAgICAgICAgfQorCisgICAgICAgICAgaWYgKGxhbUFsZWZPbiAmJiAobGVuT3B0aW9uc0xhbUFsZWYgPT0gTEFNQUxFRl9SRVNJWkUpKXsKKyAgICAgICAgICAgICAgc2hpZnRBcnJheShkZXN0LCBzdGFydCwgZSwgTEFNQUxFRl9TUEFDRV9TVUIpOworICAgICAgICAgICAgICB3TCA9IGZsaXBBcnJheShkZXN0LHN0YXJ0LGUsIHdMKTsKKyAgICAgICAgICAgICAgbGVuZ3RoID0gd0wgLSBzdGFydDsKKyAgICAgICAgICB9CisgICAgICAgICAgaWYgKHRhc2hrZWVsT24gJiYgKGxlbk9wdGlvbnNUYXNoa2VlbCA9PSBUQVNIS0VFTF9SRVNJWkUpKSB7CisgICAgICAgICAgICAgIHNoaWZ0QXJyYXkoZGVzdCwgc3RhcnQsIGUsIFRBU0hLRUVMX1NQQUNFX1NVQik7CisgICAgICAgICAgICAgIHdUID0gZmxpcEFycmF5KGRlc3Qsc3RhcnQsZSwgd1QpOworICAgICAgICAgICAgICBsZW5ndGggPSB3VCAtIHN0YXJ0OworICAgICAgICAgIH0KKworICAgICAgICAgIGxhbUFsZWZPbiA9IGZhbHNlOworICAgICAgICAgIHRhc2hrZWVsT24gPSBmYWxzZTsKKworICAgICAgICAgIGlmICgobGVuT3B0aW9uc0xhbUFsZWYgPT0gTEFNQUxFRl9CRUdJTikgfHwKKyAgICAgICAgICAgICAgKGxlbk9wdGlvbnNMYW1BbGVmID09IExBTUFMRUZfQVVUTykpeworICAgICAgICAgICAgICAgIGxhbUFsZWZPbiA9IHRydWU7CisgICAgICAgICAgfQorICAgICAgICAgIGlmIChsZW5PcHRpb25zVGFzaGtlZWwgPT0gVEFTSEtFRUxfQkVHSU4peworICAgICAgICAgICAgICAgIHRhc2hrZWVsT24gPSB0cnVlOworICAgICAgICAgIH0KKworICAgICAgICAgIGlmIChsYW1BbGVmT24gJiYgKChsZW5PcHRpb25zTGFtQWxlZiA9PSBMQU1BTEVGX0JFR0lOKXx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGxlbk9wdGlvbnNMYW1BbGVmID09IExBTUFMRUZfQVVUTykpKSB7IC8vIHNwYWNlcyBhdCBiZWdpbm5pbmcKKyAgICAgICAgICAgICAgc2hpZnRBcnJheShkZXN0LCBzdGFydCwgZSwgTEFNQUxFRl9TUEFDRV9TVUIpOworICAgICAgICAgICAgICAgd0wgPSBmbGlwQXJyYXkoZGVzdCxzdGFydCxlLCB3TCk7CisgICAgICAgICAgICAgICAgICB3aGlsZSAod0wgPCBlKSB7CisgICAgICAgICAgICAgICAgICAgICAgZGVzdFt3TCsrXSA9IFNQQUNFX0NIQVI7CisgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgaWYodGFzaGtlZWxPbiAmJiAobGVuT3B0aW9uc1Rhc2hrZWVsID09IFRBU0hLRUVMX0JFR0lOKSl7CisgICAgICAgICAgICAgICBzaGlmdEFycmF5KGRlc3QsIHN0YXJ0LCBlLCBUQVNIS0VFTF9TUEFDRV9TVUIpOworICAgICAgICAgICAgICAgd1QgPSBmbGlwQXJyYXkoZGVzdCxzdGFydCxlLCB3VCk7CisgICAgICAgICAgICAgICAgICB3aGlsZSAod1QgPCBlKSB7CisgICAgICAgICAgICAgICAgICAgICAgZGVzdFt3VCsrXSA9IFNQQUNFX0NIQVI7CisgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgfQorCisgICAgICByZXR1cm4gbGVuZ3RoOworICB9CisKKworICAvKgorICAgKk5hbWUgICAgIDpleHBhbmRDb21wb3NpdENoYXJBdEJlZ2luCisgICAqRnVuY3Rpb24gOkV4cGFuZHMgdGhlIExhbUFsZWYgY2hhcmFjdGVyIHRvIExhbSBhbmQgQWxlZiBjb25zdW1pbmcgdGhlIHJlcXVpcmVkCisgICAqICAgICAgICAgc3BhY2UgZnJvbSBiZWdpbm5pbmcgb2YgdGhlIGJ1ZmZlci4gSWYgdGhlIHRleHQgdHlwZSB3YXMgdmlzdWFsX0xUUgorICAgKiAgICAgICAgIGFuZCB0aGUgb3B0aW9uIFNQQUNFU19SRUxBVElWRV9UT19URVhUX0JFR0lOX0VORCB3YXMgc2VsZWN0ZWQKKyAgICogICAgICAgICB0aGUgc3BhY2VzIHdpbGwgYmUgbG9jYXRlZCBhdCBlbmQgb2YgYnVmZmVyLgorICAgKiAgICAgICAgIElmIHRoZXJlIGFyZSBubyBzcGFjZXMgdG8gZXhwYW5kIHRoZSBMYW1BbGVmLCBhbiBleGNlcHRpb24gaXMgdGhyb3duLgorKi8KKyBwcml2YXRlIGJvb2xlYW4gZXhwYW5kQ29tcG9zaXRDaGFyQXRCZWdpbihjaGFyW10gZGVzdCxpbnQgc3RhcnQsIGludCBsZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxhY291bnQpIHsKKyAgICAgYm9vbGVhbiBzcGFjZU5vdEZvdW5kID0gZmFsc2U7CisKKyAgICAgaWYgKGxhY291bnQgPiBjb3VudFNwYWNlc1JpZ2h0KGRlc3QsIHN0YXJ0LCBsZW5ndGgpKSB7CisgICAgICAgICBzcGFjZU5vdEZvdW5kID0gdHJ1ZTsKKyAgICAgICAgIHJldHVybiBzcGFjZU5vdEZvdW5kOworICAgICB9CisgICAgIGZvciAoaW50IHIgPSBzdGFydCArIGxlbmd0aCAtIGxhY291bnQsIHcgPSBzdGFydCArIGxlbmd0aDsgLS1yID49IHN0YXJ0OykgeworICAgICAgICAgY2hhciBjaCA9IGRlc3Rbcl07CisgICAgICAgICBpZiAoaXNOb3JtYWxpemVkTGFtQWxlZkNoYXIoY2gpKSB7CisgICAgICAgICAgICAgZGVzdFstLXddID0gTEFNX0NIQVI7CisgICAgICAgICAgICAgZGVzdFstLXddID0gY29udmVydE5vcm1hbGl6ZWRMYW1BbGVmW2NoIC0gJ1x1MDY1QyddOworICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICBkZXN0Wy0td10gPSBjaDsKKyAgICAgICAgIH0KKyAgICAgfQorICAgICByZXR1cm4gc3BhY2VOb3RGb3VuZDsKKworICB9CisKKyAgLyoKKyAgICpOYW1lICAgICA6IGV4cGFuZENvbXBvc2l0Q2hhckF0RW5kCisgICAqRnVuY3Rpb24gOiBFeHBhbmRzIHRoZSBMYW1BbGVmIGNoYXJhY3RlciB0byBMYW0gYW5kIEFsZWYgY29uc3VtaW5nIHRoZQorICAgKiAgICAgICAgICAgcmVxdWlyZWQgc3BhY2UgZnJvbSBlbmQgb2YgdGhlIGJ1ZmZlci4gSWYgdGhlIHRleHQgdHlwZSB3YXMKKyAgICogICAgICAgICAgIFZpc3VhbCBMVFIgYW5kIHRoZSBvcHRpb24gU1BBQ0VTX1JFTEFUSVZFX1RPX1RFWFRfQkVHSU5fRU5ECisgICAqICAgICAgICAgICB3YXMgdXNlZCwgdGhlIHNwYWNlcyB3aWxsIGJlIGNvbnN1bWVkIGZyb20gYmVnaW4gb2YgYnVmZmVyLiBJZgorICAgKiAgICAgICAgICAgdGhlcmUgYXJlIG5vIHNwYWNlcyB0byBleHBhbmQgdGhlIExhbUFsZWYsIGFuIGV4Y2VwdGlvbiBpcyB0aHJvd24uCisgICAqLworCisgIHByaXZhdGUgYm9vbGVhbiAgZXhwYW5kQ29tcG9zaXRDaGFyQXRFbmQoY2hhcltdIGRlc3QsaW50IHN0YXJ0LCBpbnQgbGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGFjb3VudCl7CisgICAgICBib29sZWFuIHNwYWNlTm90Rm91bmQgPSBmYWxzZTsKKworICAgICAgaWYgKGxhY291bnQgPiBjb3VudFNwYWNlc0xlZnQoZGVzdCwgc3RhcnQsIGxlbmd0aCkpIHsKKyAgICAgICAgICBzcGFjZU5vdEZvdW5kID0gdHJ1ZTsKKyAgICAgICAgICByZXR1cm4gc3BhY2VOb3RGb3VuZDsKKyAgICAgIH0KKyAgICAgIGZvciAoaW50IHIgPSBzdGFydCArIGxhY291bnQsIHcgPSBzdGFydCwgZSA9IHN0YXJ0ICsgbGVuZ3RoOyByIDwgZTsgKytyKSB7CisgICAgICAgICAgY2hhciBjaCA9IGRlc3Rbcl07CisgICAgICAgICAgaWYgKGlzTm9ybWFsaXplZExhbUFsZWZDaGFyKGNoKSkgeworICAgICAgICAgICAgICBkZXN0W3crK10gPSBjb252ZXJ0Tm9ybWFsaXplZExhbUFsZWZbY2ggLSAnXHUwNjVDJ107CisgICAgICAgICAgICAgIGRlc3RbdysrXSA9IExBTV9DSEFSOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgIGRlc3RbdysrXSA9IGNoOworICAgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIHJldHVybiBzcGFjZU5vdEZvdW5kOworICB9CisKKyAgLyoKKyAgICpOYW1lICAgICA6IGV4cGFuZENvbXBvc2l0Q2hhckF0TmVhcgorICAgKkZ1bmN0aW9uIDogRXhwYW5kcyB0aGUgTGFtQWxlZiBjaGFyYWN0ZXIgaW50byBMYW0gKyBBbGVmLCBZZWhIYW16YSBjaGFyYWN0ZXIKKyAgICogICAgICAgICAgIGludG8gWWVoICsgSGFtemEsIFNlZW5GYW1pbHkgY2hhcmFjdGVyIGludG8gU2VlbkZhbWlseSBjaGFyYWN0ZXIKKyAgICogICAgICAgICAgICsgVGFpbCwgd2hpbGUgY29uc3VtaW5nIHRoZSBzcGFjZSBuZXh0IHRvIHRoZSBjaGFyYWN0ZXIuCisgICAqLworCisgIHByaXZhdGUgYm9vbGVhbiBleHBhbmRDb21wb3NpdENoYXJBdE5lYXIoY2hhcltdIGRlc3QsaW50IHN0YXJ0LCBpbnQgbGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHllaEhhbXphT3B0aW9uLCBpbnQgc2VlblRhaWxPcHRpb24sIGludCBsYW1BbGVmT3B0aW9uKXsKKworICAgICAgYm9vbGVhbiBzcGFjZU5vdEZvdW5kID0gZmFsc2U7CisKKworCisgICAgICBpZiAoaXNOb3JtYWxpemVkTGFtQWxlZkNoYXIoZGVzdFtzdGFydF0pKSB7CisgICAgICAgICAgc3BhY2VOb3RGb3VuZCA9IHRydWU7CisgICAgICAgICAgcmV0dXJuIHNwYWNlTm90Rm91bmQ7CisgICAgICB9CisgICAgICBmb3IgKGludCBpID0gc3RhcnQgKyBsZW5ndGg7IC0taSA+PXN0YXJ0OykgeworICAgICAgICAgIGNoYXIgY2ggPSBkZXN0W2ldOworICAgICAgICAgIGlmIChsYW1BbGVmT3B0aW9uID09IDEgJiYgaXNOb3JtYWxpemVkTGFtQWxlZkNoYXIoY2gpKSB7CisgICAgICAgICAgICAgIGlmIChpPnN0YXJ0ICYmZGVzdFtpLTFdID09IFNQQUNFX0NIQVIpIHsKKyAgICAgICAgICAgICAgICAgIGRlc3RbaV0gPSBMQU1fQ0hBUjsKKyAgICAgICAgICAgICAgICAgIGRlc3RbLS1pXSA9IGNvbnZlcnROb3JtYWxpemVkTGFtQWxlZltjaCAtICdcdTA2NUMnXTsKKyAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgIHNwYWNlTm90Rm91bmQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgcmV0dXJuIHNwYWNlTm90Rm91bmQ7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICB9ZWxzZSBpZihzZWVuVGFpbE9wdGlvbiA9PSAxICYmIGlzU2VlblRhaWxGYW1pbHlDaGFyKGNoKSA9PSAxKXsKKyAgICAgICAgICAgICAgaWYoaT5zdGFydCAmJmRlc3RbaS0xXSA9PSBTUEFDRV9DSEFSKXsKKyAgICAgICAgICAgICAgICAgIGRlc3RbaS0xXSA9IHRhaWxDaGFyOworICAgICAgICAgICAgICB9IGVsc2V7CisgICAgICAgICAgICAgICAgICBzcGFjZU5vdEZvdW5kID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgIHJldHVybiBzcGFjZU5vdEZvdW5kOworICAgICAgICAgICAgICB9CisgICAgICAgICAgfWVsc2UgaWYoeWVoSGFtemFPcHRpb24gPT0gMSAmJiBpc1llaEhhbXphQ2hhcihjaCkpeworCisgICAgICAgICAgICAgICBpZihpPnN0YXJ0ICYmZGVzdFtpLTFdID09IFNQQUNFX0NIQVIpeworICAgICAgICAgICAgICAgICAgZGVzdFtpXSA9IHllaEhhbXphVG9ZZWhbY2ggLSBZRUhfSEFNWkFGRV9DSEFSXTsKKyAgICAgICAgICAgICAgICAgIGRlc3RbaS0xXSA9IEhBTVpBRkVfQ0hBUjsKKyAgICAgICAgICAgICAgfWVsc2V7CisgICAgICAgICAgICAgICAgICBzcGFjZU5vdEZvdW5kID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgIHJldHVybiBzcGFjZU5vdEZvdW5kOworICAgICAgICAgICAgICAgIH0KKworCisgICAgICAgICAgfQorICAgICAgfQorICAgICAgcmV0dXJuIGZhbHNlOworCisgIH0KKworICAgIC8qCisgICAgICogTmFtZSAgICA6IGV4cGFuZENvbXBvc2l0Q2hhcgorICAgICAqIEZ1bmN0aW9uOiBMYW1BbGVmIG5lZWRzIHNwZWNpYWwgaGFuZGxpbmcgYXMgdGhlIExhbUFsZWYgaXMKKyAgICAgKiAgICAgICAgICAgb25lIGNoYXJhY3RlciB3aGlsZSBleHBhbmRpbmcgaXQgd2lsbCBnaXZlIHR3bworICAgICAqICAgICAgICAgICBjaGFyYWN0ZXJzIExhbSArIEFsZWYsIHNvIHdlIG5lZWQgdG8gZXhwYW5kIHRoZSBMYW1BbGVmCisgICAgICogICAgICAgICAgIGluIG5lYXIgb3IgZmFyIHNwYWNlcyBhY2NvcmRpbmcgdG8gdGhlIG9wdGlvbnMgdGhlIHVzZXIKKyAgICAgKiAgICAgICAgICAgc3BlY2lmaWVzIG9yIGluY3JlYXNlIHRoZSBidWZmZXIgc2l6ZS4KKyAgICAgKiAgICAgICAgICAgRGVzdCBoYXMgZW5vdWdoIHJvb20gZm9yIHRoZSBleHBhbnNpb24gaWYgd2UgYXJlIGdyb3dpbmcuCisgICAgICogICAgICAgICAgIGxhbWFsZWYgYXJlIG5vcm1hbGl6ZWQgdG8gdGhlICdzcGVjaWFsIGNoYXJhY3RlcnMnCisgICAgICovCisgICAgcHJpdmF0ZSBpbnQgZXhwYW5kQ29tcG9zaXRDaGFyKGNoYXJbXSBkZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsYWNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNoYXBpbmdNb2RlKSB0aHJvd3MgQXJhYmljU2hhcGluZ0V4Y2VwdGlvbiB7CisKKyAgICAgICAgaW50IGxlbk9wdGlvbnNMYW1BbGVmID0gb3B0aW9ucyAmIExBTUFMRUZfTUFTSzsKKyAgICAgICAgaW50IGxlbk9wdGlvbnNTZWVuID0gb3B0aW9ucyAmIFNFRU5fTUFTSzsKKyAgICAgICAgaW50IGxlbk9wdGlvbnNZZWhIYW16YSA9IG9wdGlvbnMgJiBZRUhIQU1aQV9NQVNLOworICAgICAgICBib29sZWFuIHNwYWNlTm90Rm91bmQgPSBmYWxzZTsKKworICAgICAgICBpZiAoIWlzTG9naWNhbCAmJiAhc3BhY2VzUmVsYXRpdmVUb1RleHRCZWdpbkVuZCkgeworICAgICAgICAgICAgc3dpdGNoIChsZW5PcHRpb25zTGFtQWxlZikgeworICAgICAgICAgICAgY2FzZSBMQU1BTEVGX0JFR0lOOiBsZW5PcHRpb25zTGFtQWxlZiA9IExBTUFMRUZfRU5EOyBicmVhazsKKyAgICAgICAgICAgIGNhc2UgTEFNQUxFRl9FTkQ6IGxlbk9wdGlvbnNMYW1BbGVmID0gTEFNQUxFRl9CRUdJTjsgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OiBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmKHNoYXBpbmdNb2RlID09IDEpeworICAgICAgICAgICAgaWYobGVuT3B0aW9uc0xhbUFsZWYgPT0gTEFNQUxFRl9BVVRPKXsKKyAgICAgICAgICAgICAgICBpZihpc0xvZ2ljYWwpeworICAgICAgICAgICAgICAgICAgICBzcGFjZU5vdEZvdW5kID0gZXhwYW5kQ29tcG9zaXRDaGFyQXRFbmQoZGVzdCwgc3RhcnQsIGxlbmd0aCwgbGFjb3VudCk7CisgICAgICAgICAgICAgICAgICAgIGlmKHNwYWNlTm90Rm91bmQpeworICAgICAgICAgICAgICAgICAgICAgICAgc3BhY2VOb3RGb3VuZCA9IGV4cGFuZENvbXBvc2l0Q2hhckF0QmVnaW4oZGVzdCwgc3RhcnQsIGxlbmd0aCwgbGFjb3VudCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYoc3BhY2VOb3RGb3VuZCl7CisgICAgICAgICAgICAgICAgICAgICAgICBzcGFjZU5vdEZvdW5kID0gZXhwYW5kQ29tcG9zaXRDaGFyQXROZWFyKGRlc3QsIHN0YXJ0LCBsZW5ndGgsMCwwLDEpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmKHNwYWNlTm90Rm91bmQpeworICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFyYWJpY1NoYXBpbmdFeGNlcHRpb24oIk5vIHNwYWNlZm9yIGxhbWFsZWYiKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH1lbHNleworICAgICAgICAgICAgICAgICAgICBzcGFjZU5vdEZvdW5kID0gZXhwYW5kQ29tcG9zaXRDaGFyQXRCZWdpbihkZXN0LCBzdGFydCwgbGVuZ3RoLCBsYWNvdW50KTsKKyAgICAgICAgICAgICAgICAgICAgaWYoc3BhY2VOb3RGb3VuZCl7CisgICAgICAgICAgICAgICAgICAgICAgICBzcGFjZU5vdEZvdW5kID0gZXhwYW5kQ29tcG9zaXRDaGFyQXRFbmQoZGVzdCwgc3RhcnQsIGxlbmd0aCwgbGFjb3VudCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYoc3BhY2VOb3RGb3VuZCl7CisgICAgICAgICAgICAgICAgICAgICAgICBzcGFjZU5vdEZvdW5kID0gZXhwYW5kQ29tcG9zaXRDaGFyQXROZWFyKGRlc3QsIHN0YXJ0LCBsZW5ndGgsMCwwLDEpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmKHNwYWNlTm90Rm91bmQpeworICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFyYWJpY1NoYXBpbmdFeGNlcHRpb24oIk5vIHNwYWNlZm9yIGxhbWFsZWYiKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH1lbHNlIGlmKGxlbk9wdGlvbnNMYW1BbGVmID09IExBTUFMRUZfRU5EKXsKKyAgICAgICAgICAgICAgICBzcGFjZU5vdEZvdW5kID0gZXhwYW5kQ29tcG9zaXRDaGFyQXRFbmQoZGVzdCwgc3RhcnQsIGxlbmd0aCwgbGFjb3VudCk7CisgICAgICAgICAgICAgICAgaWYoc3BhY2VOb3RGb3VuZCl7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBBcmFiaWNTaGFwaW5nRXhjZXB0aW9uKCJObyBzcGFjZWZvciBsYW1hbGVmIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfWVsc2UgaWYobGVuT3B0aW9uc0xhbUFsZWYgPT0gTEFNQUxFRl9CRUdJTil7CisgICAgICAgICAgICAgICAgc3BhY2VOb3RGb3VuZCA9IGV4cGFuZENvbXBvc2l0Q2hhckF0QmVnaW4oZGVzdCwgc3RhcnQsIGxlbmd0aCwgbGFjb3VudCk7CisgICAgICAgICAgICAgICAgaWYoc3BhY2VOb3RGb3VuZCl7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBBcmFiaWNTaGFwaW5nRXhjZXB0aW9uKCJObyBzcGFjZWZvciBsYW1hbGVmIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfWVsc2UgaWYobGVuT3B0aW9uc0xhbUFsZWYgPT0gTEFNQUxFRl9ORUFSKXsKKyAgICAgICAgICAgICAgICBzcGFjZU5vdEZvdW5kID0gZXhwYW5kQ29tcG9zaXRDaGFyQXROZWFyKGRlc3QsIHN0YXJ0LCBsZW5ndGgsMCwwLDEpOworICAgICAgICAgICAgICAgIGlmKHNwYWNlTm90Rm91bmQpeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXJhYmljU2hhcGluZ0V4Y2VwdGlvbigiTm8gc3BhY2Vmb3IgbGFtYWxlZiIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgfWVsc2UgaWYobGVuT3B0aW9uc0xhbUFsZWYgPT0gTEFNQUxFRl9SRVNJWkUpeworICAgICAgICAgICAgICAgIGZvciAoaW50IHIgPSBzdGFydCArIGxlbmd0aCwgdyA9IHIgKyBsYWNvdW50OyAtLXIgPj0gc3RhcnQ7KSB7CisgICAgICAgICAgICAgICAgICAgIGNoYXIgY2ggPSBkZXN0W3JdOworICAgICAgICAgICAgICAgICAgICBpZiAoaXNOb3JtYWxpemVkTGFtQWxlZkNoYXIoY2gpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBkZXN0Wy0td10gPSAnXHUwNjQ0JzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlc3RbLS13XSA9IGNvbnZlcnROb3JtYWxpemVkTGFtQWxlZltjaCAtICdcdTA2NUMnXTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlc3RbLS13XSA9IGNoOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGxlbmd0aCArPSBsYWNvdW50OworICAgICAgICAgICAgfQorICAgICAgICAgICAgfWVsc2V7CisgICAgICAgICAgICAgICAgaWYobGVuT3B0aW9uc1NlZW4gPT0gU0VFTl9UV09DRUxMX05FQVIpeworICAgICAgICAgICAgICAgIHNwYWNlTm90Rm91bmQgPSBleHBhbmRDb21wb3NpdENoYXJBdE5lYXIoZGVzdCwgc3RhcnQsIGxlbmd0aCwwLDEsMCk7CisgICAgICAgICAgICAgICAgaWYoc3BhY2VOb3RGb3VuZCl7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBBcmFiaWNTaGFwaW5nRXhjZXB0aW9uKCJObyBzcGFjZSBmb3IgU2VlbiB0YWlsIGV4cGFuc2lvbiIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmKGxlbk9wdGlvbnNZZWhIYW16YSA9PSBZRUhIQU1aQV9UV09DRUxMX05FQVIpeworICAgICAgICAgICAgICAgIHNwYWNlTm90Rm91bmQgPSBleHBhbmRDb21wb3NpdENoYXJBdE5lYXIoZGVzdCwgc3RhcnQsIGxlbmd0aCwxLDAsMCk7CisgICAgICAgICAgICAgICAgaWYoc3BhY2VOb3RGb3VuZCl7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBBcmFiaWNTaGFwaW5nRXhjZXB0aW9uKCJObyBzcGFjZSBmb3IgWWVoSGFtemEgZXhwYW5zaW9uIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICByZXR1cm4gbGVuZ3RoOworICAgIH0KKworCisgICAgLyogQ29udmVydCB0aGUgaW5wdXQgYnVmZmVyIGZyb20gRkV4eCBSYW5nZSBpbnRvIDA2eHggUmFuZ2UKKyAgICAgKiB0byBwdXQgYWxsIGNoYXJhY3RlcnMgaW50byB0aGUgMDZ4eCByYW5nZQorICAgICAqIGV2ZW4gdGhlIGxhbWFsZWYgaXMgY29udmVydGVkIHRvIHRoZSBzcGVjaWFsIHJlZ2lvbiBpbgorICAgICAqIHRoZSAwNnh4IHJhbmdlLiAgUmV0dXJuIHRoZSBudW1iZXIgb2YgbGFtYWxlZiBjaGFycyBmb3VuZC4KKyAgICAgKi8KKyAgICBwcml2YXRlIGludCBub3JtYWxpemUoY2hhcltdIGRlc3QsIGludCBzdGFydCwgaW50IGxlbmd0aCkgeworICAgICAgICBpbnQgbGFjb3VudCA9IDA7CisgICAgICAgIGZvciAoaW50IGkgPSBzdGFydCwgZSA9IGkgKyBsZW5ndGg7IGkgPCBlOyArK2kpIHsKKyAgICAgICAgICAgIGNoYXIgY2ggPSBkZXN0W2ldOworICAgICAgICAgICAgaWYgKGNoID49ICdcdUZFNzAnICYmIGNoIDw9ICdcdUZFRkMnKSB7CisgICAgICAgICAgICAgICAgaWYgKGlzTGFtQWxlZkNoYXIoY2gpKSB7CisgICAgICAgICAgICAgICAgICAgICsrbGFjb3VudDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZGVzdFtpXSA9IChjaGFyKWNvbnZlcnRGRXRvMDZbY2ggLSAnXHVGRTcwJ107CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGxhY291bnQ7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBOYW1lICAgIDogZGVzaGFwZU5vcm1hbGl6ZQorICAgICAqIEZ1bmN0aW9uOiBDb252ZXJ0IHRoZSBpbnB1dCBidWZmZXIgZnJvbSBGRXh4IFJhbmdlIGludG8gMDZ4eCBSYW5nZQorICAgICAqICAgICAgICAgICBldmVuIHRoZSBsYW1hbGVmIGlzIGNvbnZlcnRlZCB0byB0aGUgc3BlY2lhbCByZWdpb24gaW4gdGhlIDA2eHggcmFuZ2UuCisgICAgICogICAgICAgICAgIEFjY29yZGluZyB0byB0aGUgb3B0aW9ucyB0aGUgdXNlciBlbnRlcnMsIGFsbCBzZWVuIGZhbWlseSBjaGFyYWN0ZXJzCisgICAgICogICAgICAgICAgIGZvbGxvd2VkIGJ5IGEgdGFpbCBjaGFyYWN0ZXIgYXJlIG1lcmdlZCB0byBzZWVuIHRhaWwgZmFtaWx5IGNoYXJhY3RlciBhbmQKKyAgICAgKiAgICAgICAgICAgYW55IHllaCBmb2xsb3dlZCBieSBhIGhhbXphIGNoYXJhY3RlciBhcmUgbWVyZ2VkIHRvIHllaGhhbXphIGNoYXJhY3Rlci4KKyAgICAgKiAgICAgICAgICAgTWV0aG9kIHJldHVybnMgdGhlIG51bWJlciBvZiBsYW1hbGVmIGNoYXJzIGZvdW5kLgorICAgICAqLworICAgIHByaXZhdGUgaW50IGRlc2hhcGVOb3JtYWxpemUoY2hhcltdIGRlc3QsIGludCBzdGFydCwgaW50IGxlbmd0aCkgeworICAgICAgICBpbnQgbGFjb3VudCA9IDA7CisgICAgICAgIGludCB5ZWhIYW16YUNvbXBvc2VFbmFibGVkID0gMDsKKyAgICAgICAgaW50IHNlZW5Db21wb3NlRW5hYmxlZCA9IDA7CisKKyAgICAgICAgeWVoSGFtemFDb21wb3NlRW5hYmxlZCA9ICgob3B0aW9ucyZZRUhIQU1aQV9NQVNLKSA9PSBZRUhIQU1aQV9UV09DRUxMX05FQVIpID8gMSA6IDA7CisgICAgICAgIHNlZW5Db21wb3NlRW5hYmxlZCA9ICgob3B0aW9ucyZTRUVOX01BU0spID09IFNFRU5fVFdPQ0VMTF9ORUFSKT8gMSA6IDA7CisKKyAgICAgICAgZm9yIChpbnQgaSA9IHN0YXJ0LCBlID0gaSArIGxlbmd0aDsgaSA8IGU7ICsraSkgeworICAgICAgICAgICAgY2hhciBjaCA9IGRlc3RbaV07CisKKyAgICAgICAgaWYoICh5ZWhIYW16YUNvbXBvc2VFbmFibGVkID09IDEpICYmICgoY2ggPT0gSEFNWkEwNl9DSEFSKSB8fCAoY2ggPT0gSEFNWkFGRV9DSEFSKSkKKyAgICAgICAgICAgICAgICYmIChpIDwgKGxlbmd0aCAtIDEpKSAmJiBpc0FsZWZNYWtzb3VyYUNoYXIoZGVzdFtpKzFdICkpIHsKKyAgICAgICAgICAgICAgICBkZXN0W2ldID0gU1BBQ0VfQ0hBUjsKKyAgICAgICAgICAgICAgICBkZXN0W2krMV0gPSBZRUhfSEFNWkFfQ0hBUjsKKyAgICAgICB9IGVsc2UgaWYgKCAoc2VlbkNvbXBvc2VFbmFibGVkID09IDEpICYmIChpc1RhaWxDaGFyKGNoKSkgJiYgKGk8IChsZW5ndGggLSAxKSkKKyAgICAgICAgICAgICAgICAgICAgICAgJiYgKGlzU2VlblRhaWxGYW1pbHlDaGFyKGRlc3RbaSsxXSk9PTEpICkgeworICAgICAgICAgICAgICAgZGVzdFtpXSA9IFNQQUNFX0NIQVI7CisgICAgICAgfQorICAgICAgIGVsc2UgaWYgKGNoID49ICdcdUZFNzAnICYmIGNoIDw9ICdcdUZFRkMnKSB7CisgICAgICAgICAgICAgICAgaWYgKGlzTGFtQWxlZkNoYXIoY2gpKSB7CisgICAgICAgICAgICAgICAgICAgICsrbGFjb3VudDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZGVzdFtpXSA9IChjaGFyKWNvbnZlcnRGRXRvMDZbY2ggLSAnXHVGRTcwJ107CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGxhY291bnQ7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBOYW1lICAgIDogc2hhcGVVbmljb2RlCisgICAgICogRnVuY3Rpb246IENvbnZlcnRzIGFuIEFyYWJpYyBVbmljb2RlIGJ1ZmZlciBpbiAwNnh4IFJhbmdlIGludG8gYSBzaGFwZWQKKyAgICAgKiAgICAgICAgICAgYXJhYmljIFVuaWNvZGUgYnVmZmVyIGluIEZFeHggUmFuZ2UKKyAgICAgKi8KKyAgICBwcml2YXRlIGludCBzaGFwZVVuaWNvZGUoY2hhcltdIGRlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlc3RTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdGFzaGtlZWxGbGFnKXRocm93cyBBcmFiaWNTaGFwaW5nRXhjZXB0aW9uIHsKKworICAgICAgICBpbnQgbGFtYWxlZl9jb3VudCA9IG5vcm1hbGl6ZShkZXN0LCBzdGFydCwgbGVuZ3RoKTsKKworICAgICAgICAvLyByZXNvbHZlIHRoZSBsaW5rIGJldHdlZW4gdGhlIGNoYXJhY3RlcnMuCisgICAgICAgIC8vIEFyYWJpYyBjaGFyYWN0ZXJzIGhhdmUgZm91ciBmb3JtczogSXNvbGF0ZWQsIEluaXRpYWwsIE1lZGlhbCBhbmQgRmluYWwuCisgICAgICAgIC8vIFRhc2hrZWVsIGNoYXJhY3RlcnMgaGF2ZSB0d28sIGlzb2xhdGVkIG9yIG1lZGlhbCwgYW5kIHNvbWV0aW1lcyBvbmx5IGlzb2xhdGVkLgorICAgICAgICAvLyB0YXNoa2VlbEZsYWcgPT0gMDogc2hhcGUgbm9ybWFsbHksIDE6IHNoYXBlIGlzb2xhdGVkLCAyOiBkb24ndCBzaGFwZQorCisgICAgICAgIGJvb2xlYW4gbGFtYWxlZl9mb3VuZCA9IGZhbHNlLCBzZWVuZmFtX2ZvdW5kID0gZmFsc2U7CisgICAgICAgIGJvb2xlYW4geWVoaGFtemFfZm91bmQgPSBmYWxzZSwgdGFzaGtlZWxfZm91bmQgPSBmYWxzZTsKKyAgICAgICAgaW50IGkgPSBzdGFydCArIGxlbmd0aCAtIDE7CisgICAgICAgIGludCBjdXJyTGluayA9IGdldExpbmsoZGVzdFtpXSk7CisgICAgICAgIGludCBuZXh0TGluayA9IDA7CisgICAgICAgIGludCBwcmV2TGluayA9IDA7CisgICAgICAgIGludCBsYXN0TGluayA9IDA7CisgICAgICAgIC8vaW50IHByZXZQb3MgPSBpOworICAgICAgICBpbnQgbGFzdFBvcyA9IGk7CisgICAgICAgIGludCBueCA9IC0yOworICAgICAgICBpbnQgbncgPSAwOworCisgICAgICAgIHdoaWxlIChpID49IDApIHsKKyAgICAgICAgICAgIC8vIElmIGhpZ2ggYnl0ZSBvZiBjdXJyTGluayA+IDAgdGhlbiB0aGVyZSBtaWdodCBiZSBtb3JlIHRoYW4gb25lIHNoYXBlCisgICAgICAgICAgICBpZiAoKGN1cnJMaW5rICYgJ1x1RkYwMCcpID4gMCB8fCBpc1Rhc2hrZWVsQ2hhcihkZXN0W2ldKSkgeworICAgICAgICAgICAgICAgIG53ID0gaSAtIDE7CisgICAgICAgICAgICAgICAgbnggPSAtMjsKKyAgICAgICAgICAgICAgICB3aGlsZSAobnggPCAwKSB7IC8vIHdlIG5lZWQgdG8ga25vdyBhYm91dCBuZXh0IGNoYXIKKyAgICAgICAgICAgICAgICAgICAgaWYgKG53ID09IC0xKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBuZXh0TGluayA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICBueCA9IEludGVnZXIuTUFYX1ZBTFVFOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgbmV4dExpbmsgPSBnZXRMaW5rKGRlc3RbbnddKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICgobmV4dExpbmsgJiBJUlJFTEVWQU5UKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnggPSBudzsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS1udzsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICgoKGN1cnJMaW5rICYgQUxFRlRZUEUpID4gMCkgJiYgKChsYXN0TGluayAmIExBTVRZUEUpID4gMCkpIHsKKyAgICAgICAgICAgICAgICAgICAgbGFtYWxlZl9mb3VuZCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIGNoYXIgd0xhbWFsZWYgPSBjaGFuZ2VMYW1BbGVmKGRlc3RbaV0pOyAvLyBnZXQgZnJvbSAweDA2NUMtMHgwNjVmCisgICAgICAgICAgICAgICAgICAgIGlmICh3TGFtYWxlZiAhPSAnXHUwMDAwJykgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVwbGFjZSBhbGVmIGJ5IG1hcmtlciwgaXQgd2lsbCBiZSByZW1vdmVkIGxhdGVyCisgICAgICAgICAgICAgICAgICAgICAgICBkZXN0W2ldID0gJ1x1ZmZmZic7CisgICAgICAgICAgICAgICAgICAgICAgICBkZXN0W2xhc3RQb3NdID0gd0xhbWFsZWY7CisgICAgICAgICAgICAgICAgICAgICAgICBpID0gbGFzdFBvczsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGxhc3RMaW5rID0gcHJldkxpbms7CisgICAgICAgICAgICAgICAgICAgIGN1cnJMaW5rID0gZ2V0TGluayh3TGFtYWxlZik7IC8vIHJlcXVpcmVzICdcdTAwMDAnLCB1bmZvcnR1bmF0ZWx5CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmICgoaSA+IDApICYmIChkZXN0W2ktMV0gPT0gU1BBQ0VfQ0hBUikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIGlzU2VlbkZhbWlseUNoYXIoZGVzdFtpXSkgPT0gMSl7CisgICAgICAgICAgICAgICAgICAgICAgICBzZWVuZmFtX2ZvdW5kID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChkZXN0W2ldID09IFlFSF9IQU1aQV9DSEFSKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB5ZWhoYW16YV9mb3VuZCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZihpPT0wKXsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBpc1NlZW5GYW1pbHlDaGFyKGRlc3RbaV0pID09IDEpeworICAgICAgICAgICAgICAgICAgICAgICAgc2VlbmZhbV9mb3VuZCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZGVzdFtpXSA9PSBZRUhfSEFNWkFfQ0hBUikgeworICAgICAgICAgICAgICAgICAgICAgICAgeWVoaGFtemFfZm91bmQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgICAgICAvLyBnZXQgdGhlIHByb3BlciBzaGFwZSBhY2NvcmRpbmcgdG8gbGluayBhYmlsaXR5IG9mIG5laWdoYm9ycworICAgICAgICAgICAgICAgIC8vIGFuZCBvZiBjaGFyYWN0ZXI7IGRlcGVuZHMgb24gdGhlIG9yZGVyIG9mIHRoZSBzaGFwZXMKKyAgICAgICAgICAgICAgICAvLyAoaXNvbGF0ZWQsIGluaXRpYWwsIG1pZGRsZSwgZmluYWwpIGluIHRoZSBjb21wYXRpYmlsaXR5IGFyZWEKKworICAgICAgICAgICAgICAgIGludCBmbGFnID0gc3BlY2lhbENoYXIoZGVzdFtpXSk7CisKKyAgICAgICAgICAgICAgICBpbnQgc2hhcGUgPSBzaGFwZVRhYmxlW25leHRMaW5rICYgTElOS19NQVNLXQorICAgICAgICAgICAgICAgICAgICBbbGFzdExpbmsgJiBMSU5LX01BU0tdCisgICAgICAgICAgICAgICAgICAgIFtjdXJyTGluayAmIExJTktfTUFTS107CisKKyAgICAgICAgICAgICAgICBpZiAoZmxhZyA9PSAxKSB7CisgICAgICAgICAgICAgICAgICAgIHNoYXBlICY9IDB4MTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGZsYWcgPT0gMikgeworICAgICAgICAgICAgICAgICAgICBpZiAodGFzaGtlZWxGbGFnID09IDAgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICgobGFzdExpbmsgJiBMSU5LTCkgIT0gMCkgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICgobmV4dExpbmsgJiBMSU5LUikgIT0gMCkgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlc3RbaV0gIT0gJ1x1MDY0QycgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlc3RbaV0gIT0gJ1x1MDY0RCcgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICEoKG5leHRMaW5rICYgQUxFRlRZUEUpID09IEFMRUZUWVBFICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgIChsYXN0TGluayAmIExBTVRZUEUpID09IExBTVRZUEUpKSB7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIHNoYXBlID0gMTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNoYXBlID0gMDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoZmxhZyA9PSAyKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICh0YXNoa2VlbEZsYWcgPT0gMikgeworICAgICAgICAgICAgICAgICAgICAgICAgZGVzdFtpXSA9IFRBU0hLRUVMX1NQQUNFX1NVQjsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRhc2hrZWVsX2ZvdW5kID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNleworICAgICAgICAgICAgICAgICAgICAgICAgZGVzdFtpXSA9IChjaGFyKSgnXHVGRTcwJyArIGlycmVsZXZhbnRQb3NbZGVzdFtpXSAtICdcdTA2NEInXSArIHNoYXBlKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAvLyBlbHNlIGxlYXZlIHRhc2hrZWVsIGFsb25lCisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgZGVzdFtpXSA9IChjaGFyKSgnXHVGRTcwJyArIChjdXJyTGluayA+PiA4KSArIHNoYXBlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIG1vdmUgb25lIG5vdGNoIGZvcndhcmQKKyAgICAgICAgICAgIGlmICgoY3VyckxpbmsgJiBJUlJFTEVWQU5UKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgcHJldkxpbmsgPSBsYXN0TGluazsKKyAgICAgICAgICAgICAgICBsYXN0TGluayA9IGN1cnJMaW5rOworICAgICAgICAgICAgICAgIC8vcHJldlBvcyA9IGxhc3RQb3M7CisgICAgICAgICAgICAgICAgbGFzdFBvcyA9IGk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC0taTsKKyAgICAgICAgICAgIGlmIChpID09IG54KSB7CisgICAgICAgICAgICAgICAgY3VyckxpbmsgPSBuZXh0TGluazsKKyAgICAgICAgICAgICAgICBueCA9IC0yOworICAgICAgICAgICAgfSBlbHNlIGlmIChpICE9IC0xKSB7CisgICAgICAgICAgICAgICAgY3VyckxpbmsgPSBnZXRMaW5rKGRlc3RbaV0pOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gSWYgd2UgZm91bmQgYSBsYW0vYWxlZiBwYWlyIGluIHRoZSBidWZmZXIKKyAgICAgICAgLy8gY2FsbCBoYW5kbGVHZW5lcmF0ZWRTcGFjZXMgdG8gcmVtb3ZlIHRoZSBzcGFjZXMgdGhhdCB3ZXJlIGFkZGVkCisKKyAgICAgICAgZGVzdFNpemUgPSBsZW5ndGg7CisgICAgICAgIGlmIChsYW1hbGVmX2ZvdW5kIHx8IHRhc2hrZWVsX2ZvdW5kKSB7CisgICAgICAgICAgICBkZXN0U2l6ZSA9IGhhbmRsZUdlbmVyYXRlZFNwYWNlcyhkZXN0LCBzdGFydCwgbGVuZ3RoKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoc2VlbmZhbV9mb3VuZCB8fCB5ZWhoYW16YV9mb3VuZCl7CisgICAgICAgICAgICBkZXN0U2l6ZSA9IGV4cGFuZENvbXBvc2l0Q2hhcihkZXN0LCBzdGFydCwgZGVzdFNpemUsIGxhbWFsZWZfY291bnQsIFNIQVBFX01PREUpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBkZXN0U2l6ZTsKKyAgICB9CisKKyAgICAvKgorICAgICAqIE5hbWUgICAgOiBkZVNoYXBlVW5pY29kZQorICAgICAqIEZ1bmN0aW9uOiBDb252ZXJ0cyBhbiBBcmFiaWMgVW5pY29kZSBidWZmZXIgaW4gRkV4eCBSYW5nZSBpbnRvIHVuc2hhcGVkCisgICAgICogICAgICAgICAgIGFyYWJpYyBVbmljb2RlIGJ1ZmZlciBpbiAwNnh4IFJhbmdlCisgICAgICovCisgICAgcHJpdmF0ZSBpbnQgZGVTaGFwZVVuaWNvZGUoY2hhcltdIGRlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlc3RTaXplKSB0aHJvd3MgQXJhYmljU2hhcGluZ0V4Y2VwdGlvbiB7CisKKyAgICAgICAgaW50IGxhbWFsZWZfY291bnQgPSBkZXNoYXBlTm9ybWFsaXplKGRlc3QsIHN0YXJ0LCBsZW5ndGgpOworCisgICAgICAgIC8vIElmIHRoZXJlIHdhcyBhIGxhbWFsZWYgaW4gdGhlIGJ1ZmZlciBjYWxsIGV4cGFuZExhbUFsZWYKKyAgICAgICAgaWYgKGxhbWFsZWZfY291bnQgIT0gMCkgeworICAgICAgICAgICAgLy8gbmVlZCB0byBhZGp1c3QgZGVzdCB0byBmaXQgZXhwYW5kZWQgYnVmZmVyLi4uICEhIQorICAgICAgICAgICAgZGVzdFNpemUgPSBleHBhbmRDb21wb3NpdENoYXIoZGVzdCwgc3RhcnQsIGxlbmd0aCwgbGFtYWxlZl9jb3VudCxERVNIQVBFX01PREUpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZGVzdFNpemUgPSBsZW5ndGg7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gZGVzdFNpemU7CisgICAgfQorCisgICAgcHJpdmF0ZSBpbnQgaW50ZXJuYWxTaGFwZShjaGFyW10gc291cmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNvdXJjZVN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNvdXJjZUxlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXJbXSBkZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlc3RTdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZXN0U2l6ZSkgdGhyb3dzIEFyYWJpY1NoYXBpbmdFeGNlcHRpb24geworCisgICAgICAgIGlmIChzb3VyY2VMZW5ndGggPT0gMCkgeworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKworICAgICAgICBpZiAoZGVzdFNpemUgPT0gMCkgeworICAgICAgICAgICAgaWYgKCgob3B0aW9ucyAmIExFVFRFUlNfTUFTSykgIT0gTEVUVEVSU19OT09QKSAmJgorICAgICAgICAgICAgICAgICgob3B0aW9ucyAmIExBTUFMRUZfTUFTSykgPT0gTEFNQUxFRl9SRVNJWkUpKSB7CisKKyAgICAgICAgICAgICAgICByZXR1cm4gY2FsY3VsYXRlU2l6ZShzb3VyY2UsIHNvdXJjZVN0YXJ0LCBzb3VyY2VMZW5ndGgpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gc291cmNlTGVuZ3RoOyAvLyBieSBkZWZpbml0aW9uCisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBhbHdheXMgdXNlIHRlbXAgYnVmZmVyCisgICAgICAgIGNoYXJbXSB0ZW1wID0gbmV3IGNoYXJbc291cmNlTGVuZ3RoICogMl07IC8vIGFsbCBsYW1hbGVmcyByZXF1aXJpbmcgZXhwYW5zaW9uCisgICAgICAgIFN5c3RlbS5hcnJheWNvcHkoc291cmNlLCBzb3VyY2VTdGFydCwgdGVtcCwgMCwgc291cmNlTGVuZ3RoKTsKKworICAgICAgICBpZiAoaXNMb2dpY2FsKSB7CisgICAgICAgICAgICBpbnZlcnRCdWZmZXIodGVtcCwgMCwgc291cmNlTGVuZ3RoKTsKKyAgICAgICAgfQorCisgICAgICAgIGludCBvdXRwdXRTaXplID0gc291cmNlTGVuZ3RoOworCisgICAgICAgIHN3aXRjaCAob3B0aW9ucyAmIExFVFRFUlNfTUFTSykgeworICAgICAgICBjYXNlIExFVFRFUlNfU0hBUEVfVEFTSEtFRUxfSVNPTEFURUQ6CisgICAgICAgICAgICBvdXRwdXRTaXplID0gc2hhcGVVbmljb2RlKHRlbXAsIDAsIHNvdXJjZUxlbmd0aCwgZGVzdFNpemUsIDEpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBMRVRURVJTX1NIQVBFOgorICAgICAgICAgICAgaWYoICgob3B0aW9ucyZUQVNIS0VFTF9NQVNLKT4gMCkgJiYKKyAgICAgICAgICAgICAgICAoKG9wdGlvbnMmVEFTSEtFRUxfTUFTSykgIT1UQVNIS0VFTF9SRVBMQUNFX0JZX1RBVFdFRUwpKSB7CisgICAgICAgICAgICAgICAgICAgLyogQ2FsbCB0aGUgc2hhcGluZyBmdW5jdGlvbiB3aXRoIHRhc2hrZWVsIGZsYWcgPT0gMiBmb3IgcmVtb3ZhbCBvZiB0YXNoa2VlbCAqLworICAgICAgICAgICAgICAgIG91dHB1dFNpemUgPSBzaGFwZVVuaWNvZGUodGVtcCwgMCwgc291cmNlTGVuZ3RoLCBkZXN0U2l6ZSwgMik7CisgICAgICAgICAgICAgICAgfWVsc2UgeworICAgICAgICAgICAgICAgICAgIC8vZGVmYXVsdCBDYWxsIHRoZSBzaGFwaW5nIGZ1bmN0aW9uIHdpdGggdGFzaGtlZWwgZmxhZyA9PSAxICovCisgICAgICAgICAgICAgICAgICAgIG91dHB1dFNpemUgPSBzaGFwZVVuaWNvZGUodGVtcCwgMCwgc291cmNlTGVuZ3RoLCBkZXN0U2l6ZSwgMCk7CisKKyAgICAgICAgICAgICAgICAgICAvKkFmdGVyIHNoYXBpbmcgdGV4dCBjaGVjayBpZiB1c2VyIHdhbnRzIHRvIHJlbW92ZSB0YXNoa2VlbCBhbmQgcmVwbGFjZSBpdCB3aXRoIHRhdHdlZWwqLworICAgICAgICAgICAgICAgICAgIGlmKCAob3B0aW9ucyZUQVNIS0VFTF9NQVNLKSA9PSBUQVNIS0VFTF9SRVBMQUNFX0JZX1RBVFdFRUwpeworICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRTaXplID0gaGFuZGxlVGFzaGtlZWxXaXRoVGF0d2VlbCh0ZW1wLHNvdXJjZUxlbmd0aCk7CisgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBMRVRURVJTX1VOU0hBUEU6CisgICAgICAgICAgICBvdXRwdXRTaXplID0gZGVTaGFwZVVuaWNvZGUodGVtcCwgMCwgc291cmNlTGVuZ3RoLCBkZXN0U2l6ZSk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBpZiAob3V0cHV0U2l6ZSA+IGRlc3RTaXplKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQXJhYmljU2hhcGluZ0V4Y2VwdGlvbigibm90IGVub3VnaCByb29tIGZvciByZXN1bHQgZGF0YSIpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKChvcHRpb25zICYgRElHSVRTX01BU0spICE9IERJR0lUU19OT09QKSB7CisgICAgICAgICAgICBjaGFyIGRpZ2l0QmFzZSA9ICdcdTAwMzAnOyAvLyBFdXJvcGVhbiBkaWdpdHMKKyAgICAgICAgICAgIHN3aXRjaCAob3B0aW9ucyAmIERJR0lUX1RZUEVfTUFTSykgeworICAgICAgICAgICAgY2FzZSBESUdJVF9UWVBFX0FOOgorICAgICAgICAgICAgICAgIGRpZ2l0QmFzZSA9ICdcdTA2NjAnOyAgLy8gQXJhYmljLUluZGljIGRpZ2l0cworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIERJR0lUX1RZUEVfQU5fRVhURU5ERUQ6CisgICAgICAgICAgICAgICAgZGlnaXRCYXNlID0gJ1x1MDZmMCc7ICAvLyBFYXN0ZXJuIEFyYWJpYy1JbmRpYyBkaWdpdHMgKFBlcnNpYW4gYW5kIFVyZHUpCisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN3aXRjaCAob3B0aW9ucyAmIERJR0lUU19NQVNLKSB7CisgICAgICAgICAgICBjYXNlIERJR0lUU19FTjJBTjoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGludCBkaWdpdERlbHRhID0gZGlnaXRCYXNlIC0gJ1x1MDAzMCc7CisgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgb3V0cHV0U2l6ZTsgKytpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjaGFyIGNoID0gdGVtcFtpXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjaCA8PSAnXHUwMDM5JyAmJiBjaCA+PSAnXHUwMDMwJykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBbaV0gKz0gZGlnaXREZWx0YTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBESUdJVFNfQU4yRU46CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjaGFyIGRpZ2l0VG9wID0gKGNoYXIpKGRpZ2l0QmFzZSArIDkpOworICAgICAgICAgICAgICAgICAgICBpbnQgZGlnaXREZWx0YSA9ICdcdTAwMzAnIC0gZGlnaXRCYXNlOworICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG91dHB1dFNpemU7ICsraSkgeworICAgICAgICAgICAgICAgICAgICAgICAgY2hhciBjaCA9IHRlbXBbaV07CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2ggPD0gZGlnaXRUb3AgJiYgY2ggPj0gZGlnaXRCYXNlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcFtpXSArPSBkaWdpdERlbHRhOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIERJR0lUU19FTjJBTl9JTklUX0xSOgorICAgICAgICAgICAgICAgIHNoYXBlVG9BcmFiaWNEaWdpdHNXaXRoQ29udGV4dCh0ZW1wLCAwLCBvdXRwdXRTaXplLCBkaWdpdEJhc2UsIGZhbHNlKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBESUdJVFNfRU4yQU5fSU5JVF9BTDoKKyAgICAgICAgICAgICAgICBzaGFwZVRvQXJhYmljRGlnaXRzV2l0aENvbnRleHQodGVtcCwgMCwgb3V0cHV0U2l6ZSwgZGlnaXRCYXNlLCB0cnVlKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChpc0xvZ2ljYWwpIHsKKyAgICAgICAgICAgIGludmVydEJ1ZmZlcih0ZW1wLCAwLCBvdXRwdXRTaXplKTsKKyAgICAgICAgfQorCisgICAgICAgIFN5c3RlbS5hcnJheWNvcHkodGVtcCwgMCwgZGVzdCwgZGVzdFN0YXJ0LCBvdXRwdXRTaXplKTsKKworICAgICAgICByZXR1cm4gb3V0cHV0U2l6ZTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBBcmFiaWNTaGFwaW5nRXhjZXB0aW9uIGV4dGVuZHMgUnVudGltZUV4Y2VwdGlvbiB7CisgICAgICAgIEFyYWJpY1NoYXBpbmdFeGNlcHRpb24oU3RyaW5nIG1zZykgeworICAgICAgICAgICAgc3VwZXIobXNnKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2ljdTRqL2xpY2Vuc2UuaHRtbCBiL2ljdTRqL2xpY2Vuc2UuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOTA1ZGRmCi0tLSAvZGV2L251bGwKKysrIGIvaWN1NGovbGljZW5zZS5odG1sCkBAIC0wLDAgKzEsNTEgQEAKKzxodG1sPgorCis8aGVhZD4KKzxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXVzLWFzY2lpIj48L21ldGE+Cis8dGl0bGU+SUNVIExpY2Vuc2UgLSBJQ1UgMS44LjEgYW5kIGxhdGVyPC90aXRsZT4KKzwvaGVhZD4KKworPGJvZHkgQkdDT0xPUj0iI2ZmZmZmZiI+Cis8aDI+SUNVIExpY2Vuc2UgLSBJQ1UgMS44LjEgYW5kIGxhdGVyPC9oMj4KKworPHA+Q09QWVJJR0hUIEFORCBQRVJNSVNTSU9OIE5PVElDRTwvcD4KKworPHA+CitDb3B5cmlnaHQgKGMpIDE5OTUtMjAwNiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMKKzwvcD4KKzxwPgorQWxsIHJpZ2h0cyByZXNlcnZlZC4KKzwvcD4KKzxwPgorUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weQorb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCit0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCit0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgYW5kL29yIHNlbGwKK2NvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucwordG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZQorY29weXJpZ2h0IG5vdGljZShzKSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcworb2YgdGhlIFNvZnR3YXJlIGFuZCB0aGF0IGJvdGggdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UocykgYW5kIHRoaXMKK3Blcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uCis8L3A+Cis8cD4KK1RIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SIElNUExJRUQsIAorSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEKK1BBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5UIE9GIFRISVJEIFBBUlRZIFJJR0hUUy4gSU4gTk8gRVZFTlQgU0hBTEwKK1RIRSBDT1BZUklHSFQgSE9MREVSIE9SIEhPTERFUlMgSU5DTFVERUQgSU4gVEhJUyBOT1RJQ0UgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sCitPUiBBTlkgU1BFQ0lBTCBJTkRJUkVDVCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMsIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIKK1JFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULAorTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUKK1VTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorPC9wPgorPHA+CitFeGNlcHQgYXMgY29udGFpbmVkIGluIHRoaXMgbm90aWNlLCB0aGUgbmFtZSBvZiBhIGNvcHlyaWdodCBob2xkZXIgc2hhbGwgbm90IGJlCit1c2VkIGluIGFkdmVydGlzaW5nIG9yIG90aGVyd2lzZSB0byBwcm9tb3RlIHRoZSBzYWxlLCB1c2Ugb3Igb3RoZXIgZGVhbGluZ3MgaW4KK3RoaXMgU29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIGF1dGhvcml6YXRpb24gb2YgdGhlIGNvcHlyaWdodCBob2xkZXIuCis8L3A+CisKKzxocj4KKzxwPjxzbWFsbD4KK0FsbCB0cmFkZW1hcmtzIGFuZCByZWdpc3RlcmVkIHRyYWRlbWFya3MgbWVudGlvbmVkIGhlcmVpbiBhcmUgdGhlIHByb3BlcnR5IG9mIHRoZWlyIHJlc3BlY3RpdmUgb3duZXJzLgorPC9zbWFsbD48L3A+Cis8L2JvZHk+Cis8L2h0bWw+CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FuZHJvaWRfcnVudGltZS9BbmRyb2lkUnVudGltZS5oIGIvaW5jbHVkZS9hbmRyb2lkX3J1bnRpbWUvQW5kcm9pZFJ1bnRpbWUuaAppbmRleCAwOWYwZGUxLi4yMmM5YjcyIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FuZHJvaWRfcnVudGltZS9BbmRyb2lkUnVudGltZS5oCisrKyBiL2luY2x1ZGUvYW5kcm9pZF9ydW50aW1lL0FuZHJvaWRSdW50aW1lLmgKQEAgLTMwLDcgKzMwLDkgQEAKIAogCiBuYW1lc3BhY2UgYW5kcm9pZCB7Ci0gICAgCisKK2NsYXNzIEN1cnNvcldpbmRvdzsKKwogY2xhc3MgQW5kcm9pZFJ1bnRpbWUKIHsKIHB1YmxpYzoKQEAgLTEyMiw2ICsxMjQsOCBAQAogLy8gUmV0dXJucyB0aGUgVW5peCBmaWxlIGRlc2NyaXB0b3IgZm9yIGEgUGFyY2VsRmlsZURlc2NyaXB0b3Igb2JqZWN0CiBleHRlcm4gaW50IGdldFBhcmNlbEZpbGVEZXNjcmlwdG9yRkQoSk5JRW52KiBlbnYsIGpvYmplY3Qgb2JqZWN0KTsKIAorZXh0ZXJuIEN1cnNvcldpbmRvdyAqIGdldF93aW5kb3dfZnJvbV9vYmplY3QoSk5JRW52ICogZW52LCBqb2JqZWN0IGphdmFXaW5kb3cpOworCiB9CiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9iaW5kZXIvQ3Vyc29yV2luZG93LmggYi9pbmNsdWRlL2JpbmRlci9DdXJzb3JXaW5kb3cuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZmJmZjJhCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9iaW5kZXIvQ3Vyc29yV2luZG93LmgKQEAgLTAsMCArMSwyMDAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9BTkRST0lEX19EQVRBQkFTRV9XSU5ET1dfSAorI2RlZmluZSBfQU5EUk9JRF9fREFUQUJBU0VfV0lORE9XX0gKKworI2luY2x1ZGUgPGN1dGlscy9sb2cuaD4KKyNpbmNsdWRlIDxzdGRkZWYuaD4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworI2luY2x1ZGUgPGJpbmRlci9JTWVtb3J5Lmg+CisjaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgorCisjZGVmaW5lIERFRkFVTFRfV0lORE9XX1NJWkUgNDA5NgorI2RlZmluZSBNQVhfV0lORE9XX1NJWkUgKDEwMjQgKiAxMDI0KQorI2RlZmluZSBXSU5ET1dfQUxMT0NBVElPTl9TSVpFIDQwOTYKKworI2RlZmluZSBST1dfU0xPVF9DSFVOS19OVU1fUk9XUyAxNgorCisvLyBSb3cgc2xvdHMgYXJlIGFsbG9jYXRlZCBpbiBjaHVua3Mgb2YgUk9XX1NMT1RfQ0hVTktfTlVNX1JPV1MsCisvLyB3aXRoIGFuIG9mZnNldCBhZnRlciB0aGUgcm93cyB0aGF0IHBvaW50cyB0byB0aGUgbmV4dCBjaHVuaworI2RlZmluZSBST1dfU0xPVF9DSFVOS19TSVpFICgoUk9XX1NMT1RfQ0hVTktfTlVNX1JPV1MgKiBzaXplb2Yocm93X3Nsb3RfdCkpICsgc2l6ZW9mKHVpbnQzMl90KSkKKworCisjaWYgTE9HX05ERUJVRworCisjZGVmaW5lIElGX0xPR19XSU5ET1coKSBpZiAoZmFsc2UpCisjZGVmaW5lIExPR19XSU5ET1coLi4uKQorCisjZWxzZQorCisjZGVmaW5lIElGX0xPR19XSU5ET1coKSBJRl9MT0coTE9HX0RFQlVHLCAiQ3Vyc29yV2luZG93IikKKyNkZWZpbmUgTE9HX1dJTkRPVyguLi4pIExPRyhMT0dfREVCVUcsICJDdXJzb3JXaW5kb3ciLCBfX1ZBX0FSR1NfXykKKworI2VuZGlmCisKKworLy8gV2hlbiBkZWZpbmVkIHRvIHRydWUgc3RyaW5ncyBhcmUgc3RvcmVkIGFzIFVURjgsIG90aGVyd2lzZSB0aGV5J3JlIFVURjE2CisjZGVmaW5lIFdJTkRPV19TVE9SQUdFX1VURjggMQorCisvLyBXaGVuIGRlZmluZWQgdG8gdHJ1ZSBudW1iZXJpYyB2YWx1ZXMgYXJlIHN0b3JlZCBpbmxpbmUgaW4gdGhlIGZpZWxkX3Nsb3RfdCwgb3RoZXJ3aXNlIHRoZXkncmUgYWxsb2NhdGVkIGluIHRoZSB3aW5kb3cKKyNkZWZpbmUgV0lORE9XX1NUT1JBR0VfSU5MSU5FX05VTUVSSUNTIDEKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCit0eXBlZGVmIHN0cnVjdAoreworICAgIHVpbnQzMl90IG51bVJvd3M7CisgICAgdWludDMyX3QgbnVtQ29sdW1uczsKK30gd2luZG93X2hlYWRlcl90OworCit0eXBlZGVmIHN0cnVjdAoreworICAgIHVpbnQzMl90IG9mZnNldDsKK30gcm93X3Nsb3RfdDsKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICB1aW50OF90IHR5cGU7CisgICAgdW5pb24geworICAgICAgICBkb3VibGUgZDsKKyAgICAgICAgaW50NjRfdCBsOworICAgICAgICBzdHJ1Y3QgeworICAgICAgICAgICAgdWludDMyX3Qgb2Zmc2V0OworICAgICAgICAgICAgdWludDMyX3Qgc2l6ZTsKKyAgICAgICAgfSBidWZmZXI7CisgICAgfSBkYXRhOworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKSBmaWVsZF9zbG90X3Q7CisKKyNkZWZpbmUgRklFTERfVFlQRV9OVUxMIDAKKyNkZWZpbmUgRklFTERfVFlQRV9JTlRFR0VSIDEKKyNkZWZpbmUgRklFTERfVFlQRV9GTE9BVCAyCisjZGVmaW5lIEZJRUxEX1RZUEVfU1RSSU5HIDMKKyNkZWZpbmUgRklFTERfVFlQRV9CTE9CIDQKKworLyoqCisgKiBUaGlzIGNsYXNzIHN0b3JlcyBhIHNldCBvZiByb3dzIGZyb20gYSBkYXRhYmFzZSBpbiBhIGJ1ZmZlci4gVGhlIGJlZ2luaW5nIG9mIHRoZQorICogd2luZG93IGhhcyBmaXJzdCBjaHVuayBvZiByb3dfc2xvdF90cywgd2hpY2ggYXJlIG9mZnNldHMgdG8gdGhlIHJvdyBkaXJlY3RvcnksIGZvbGxvd2VkIGJ5CisgKiBhbiBvZmZzZXQgdG8gdGhlIG5leHQgY2h1bmsgaW4gYSBsaW5rZWQtbGlzdCBvZiBhZGRpdGlvbmFsIGNodW5rIG9mIHJvd19zbG90X3RzIGluIGNhc2UKKyAqIHRoZSBwcmUtYWxsb2NhdGVkIGNodW5rIGlzbid0IGJpZyBlbm91Z2ggdG8gcmVmZXIgdG8gYWxsIHJvd3MuIEVhY2ggcm93IGRpcmVjdG9yeSBoYXMgYQorICogZmllbGRfc2xvdF90IHBlciBjb2x1bW4sIHdoaWNoIGhhcyB0aGUgc2l6ZSwgb2Zmc2V0LCBhbmQgdHlwZSBvZiB0aGUgZGF0YSBmb3IgdGhhdCBmaWVsZC4KKyAqIE5vdGUgdGhhdCB0aGUgZGF0YSB0eXBlcyBjb21lIGZyb20gc3FsaXRlMy5oLgorICovCitjbGFzcyBDdXJzb3JXaW5kb3cKK3sKK3B1YmxpYzoKKyAgICAgICAgICAgICAgICAgICAgICAgIEN1cnNvcldpbmRvdyhzaXplX3QgbWF4U2l6ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBDdXJzb3JXaW5kb3coKXt9CisgICAgYm9vbCAgICAgICAgICAgICAgICBzZXRNZW1vcnkoY29uc3Qgc3A8SU1lbW9yeT4mKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH5DdXJzb3JXaW5kb3coKTsKKworICAgIGJvb2wgICAgICAgICAgICAgICAgaW5pdEJ1ZmZlcihib29sIGxvY2FsT25seSk7CisgICAgc3A8SU1lbW9yeT4gICAgICAgICBnZXRNZW1vcnkoKSB7cmV0dXJuIG1NZW1vcnk7fQorCisgICAgc2l6ZV90ICAgICAgICAgICAgICBzaXplKCkge3JldHVybiBtU2l6ZTt9CisgICAgdWludDhfdCAqICAgICAgICAgICBkYXRhKCkge3JldHVybiBtRGF0YTt9CisgICAgdWludDMyX3QgICAgICAgICAgICBnZXROdW1Sb3dzKCkge3JldHVybiBtSGVhZGVyLT5udW1Sb3dzO30KKyAgICB1aW50MzJfdCAgICAgICAgICAgIGdldE51bUNvbHVtbnMoKSB7cmV0dXJuIG1IZWFkZXItPm51bUNvbHVtbnM7fQorICAgIHZvaWQgICAgICAgICAgICAgICAgZnJlZUxhc3RSb3coKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1IZWFkZXItPm51bVJvd3MgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1IZWFkZXItPm51bVJvd3MtLTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgYm9vbCAgICAgICAgICAgICAgICBzZXROdW1Db2x1bW5zKHVpbnQzMl90IG51bUNvbHVtbnMpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBjdXIgPSBtSGVhZGVyLT5udW1Db2x1bW5zOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY3VyID4gMCAmJiBjdXIgIT0gbnVtQ29sdW1ucykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTE9HRSgiVHJ5aW5nIHRvIGdvIGZyb20gJWQgY29sdW1ucyB0byAlZCIsIGN1ciwgbnVtQ29sdW1ucyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUhlYWRlci0+bnVtQ29sdW1ucyA9IG51bUNvbHVtbnM7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgIGludDMyX3QgICAgICAgICAgICAgZnJlZVNwYWNlKCk7CisKKyAgICB2b2lkICAgICAgICAgICAgICAgIGNsZWFyKCk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qKgorICAgICAgICAgICAgICAgICAgICAgICAgICogQWxsb2NhdGUgYSByb3cgc2xvdCBhbmQgaXRzIGRpcmVjdG9yeS4gVGhlIHJldHVybmVkCisgICAgICAgICAgICAgICAgICAgICAgICAgKiBwb2ludGVyIHBvaW50cyB0byB0aGUgYmVnaW5pbmcgb2YgdGhlIHJvdydzIGRpcmVjdG9yeQorICAgICAgICAgICAgICAgICAgICAgICAgICogb3IgTlVMTCBpZiB0aGVyZSB3YXNuJ3Qgcm9vbS4gVGhlIGRpcmVjdG9yeSBpcworICAgICAgICAgICAgICAgICAgICAgICAgICogaW5pdGlhbGllZCB3aXRoIE5VTEwgZW50cmllcyBmb3IgZWFjaCBmaWVsZC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIGZpZWxkX3Nsb3RfdCAqICAgICAgYWxsb2NSb3coKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgLyoqCisgICAgICAgICAgICAgICAgICAgICAgICAgKiBBbGxvY2F0ZSBhIHBvcnRpb24gb2YgdGhlIHdpbmRvdy4gUmV0dXJucyB0aGUgb2Zmc2V0CisgICAgICAgICAgICAgICAgICAgICAgICAgKiBvZiB0aGUgYWxsb2NhdGlvbiwgb3IgMCBpZiB0aGVyZSBpc24ndCBlbm91Z2ggc3BhY2UuCisgICAgICAgICAgICAgICAgICAgICAgICAgKiBJZiBhbGlnbmVkIGlzIHRydWUsIHRoZSBhbGxvY2F0aW9uIGdldHMgNCBieXRlIGFsaWdubWVudC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIHVpbnQzMl90ICAgICAgICAgICAgYWxsb2Moc2l6ZV90IHNpemUsIGJvb2wgYWxpZ25lZCA9IGZhbHNlKTsKKworICAgIHVpbnQzMl90ICAgICAgICAgICAgcmVhZF9maWVsZF9zbG90KGludCByb3csIGludCBjb2x1bW4sIGZpZWxkX3Nsb3RfdCAqIHNsb3QpOworCisgICAgICAgICAgICAgICAgICAgICAgICAvKioKKyAgICAgICAgICAgICAgICAgICAgICAgICAqIENvcHkgZGF0YSBpbnRvIHRoZSB3aW5kb3cgYXQgdGhlIGdpdmVuIG9mZnNldC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIHZvaWQgICAgICAgICAgICAgICAgY29weUluKHVpbnQzMl90IG9mZnNldCwgdWludDhfdCBjb25zdCAqIGRhdGEsIHNpemVfdCBzaXplKTsKKyAgICB2b2lkICAgICAgICAgICAgICAgIGNvcHlJbih1aW50MzJfdCBvZmZzZXQsIGludDY0X3QgZGF0YSk7CisgICAgdm9pZCAgICAgICAgICAgICAgICBjb3B5SW4odWludDMyX3Qgb2Zmc2V0LCBkb3VibGUgZGF0YSk7CisKKyAgICB2b2lkICAgICAgICAgICAgICAgIGNvcHlPdXQodWludDMyX3Qgb2Zmc2V0LCB1aW50OF90ICogZGF0YSwgc2l6ZV90IHNpemUpOworICAgIGludDY0X3QgICAgICAgICAgICAgY29weU91dExvbmcodWludDMyX3Qgb2Zmc2V0KTsKKyAgICBkb3VibGUgICAgICAgICAgICAgIGNvcHlPdXREb3VibGUodWludDMyX3Qgb2Zmc2V0KTsKKworICAgIGJvb2wgICAgICAgICAgICAgICAgcHV0TG9uZyh1bnNpZ25lZCBpbnQgcm93LCB1bnNpZ25lZCBpbnQgY29sLCBpbnQ2NF90IHZhbHVlKTsKKyAgICBib29sICAgICAgICAgICAgICAgIHB1dERvdWJsZSh1bnNpZ25lZCBpbnQgcm93LCB1bnNpZ25lZCBpbnQgY29sLCBkb3VibGUgdmFsdWUpOworICAgIGJvb2wgICAgICAgICAgICAgICAgcHV0TnVsbCh1bnNpZ25lZCBpbnQgcm93LCB1bnNpZ25lZCBpbnQgY29sKTsKKworICAgIGJvb2wgICAgICAgICAgICAgICAgZ2V0TG9uZyh1bnNpZ25lZCBpbnQgcm93LCB1bnNpZ25lZCBpbnQgY29sLCBpbnQ2NF90ICogdmFsdWVPdXQpOworICAgIGJvb2wgICAgICAgICAgICAgICAgZ2V0RG91YmxlKHVuc2lnbmVkIGludCByb3csIHVuc2lnbmVkIGludCBjb2wsIGRvdWJsZSAqIHZhbHVlT3V0KTsKKyAgICBib29sICAgICAgICAgICAgICAgIGdldE51bGwodW5zaWduZWQgaW50IHJvdywgdW5zaWduZWQgaW50IGNvbCwgYm9vbCAqIHZhbHVlT3V0KTsKKworICAgIHVpbnQ4X3QgKiAgICAgICAgICAgb2Zmc2V0VG9QdHIodWludDMyX3Qgb2Zmc2V0KSB7cmV0dXJuIG1EYXRhICsgb2Zmc2V0O30KKworICAgIHJvd19zbG90X3QgKiAgICAgICAgYWxsb2NSb3dTbG90KCk7CisKKyAgICByb3dfc2xvdF90ICogICAgICAgIGdldFJvd1Nsb3QoaW50IHJvdyk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qKgorICAgICAgICAgICAgICAgICAgICAgICAgICogcmV0dXJuIE5VTEwgaWYgRmFpbGVkIHRvIGZpbmQgcm93U2xvdCBvcgorICAgICAgICAgICAgICAgICAgICAgICAgICogSW52YWxpZCByb3dTbG90CisgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBmaWVsZF9zbG90X3QgKiAgICAgIGdldEZpZWxkU2xvdFdpdGhDaGVjayhpbnQgcm93LCBpbnQgY29sdW1uKTsKKyAgICBmaWVsZF9zbG90X3QgKiAgICAgIGdldEZpZWxkU2xvdChpbnQgcm93LCBpbnQgY29sdW1uKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZpZWxkRGlyT2Zmc2V0ID0gZ2V0Um93U2xvdChyb3cpLT5vZmZzZXQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoKGZpZWxkX3Nsb3RfdCAqKW9mZnNldFRvUHRyKGZpZWxkRGlyT2Zmc2V0KSkgKyBjb2x1bW47CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCitwcml2YXRlOgorICAgIHVpbnQ4X3QgKiBtRGF0YTsKKyAgICBzaXplX3QgbVNpemU7CisgICAgc2l6ZV90IG1NYXhTaXplOworICAgIHdpbmRvd19oZWFkZXJfdCAqIG1IZWFkZXI7CisgICAgc3A8SU1lbW9yeT4gbU1lbW9yeTsKKworICAgIC8qKgorICAgICAqIE9mZnNldCBvZiB0aGUgbG93ZXN0IHVudXNlZCBkYXRhIGJ5dGUgaW4gdGhlIGFycmF5LgorICAgICAqLworICAgIHVpbnQzMl90IG1GcmVlT2Zmc2V0OworfTsKKworfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NhbWVyYS9DYW1lcmEuaCBiL2luY2x1ZGUvY2FtZXJhL0NhbWVyYS5oCmluZGV4IDk2NDcwMGIuLmY3YjNiNDIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY2FtZXJhL0NhbWVyYS5oCisrKyBiL2luY2x1ZGUvY2FtZXJhL0NhbWVyYS5oCkBAIC0yMiw4ICsyMiw2IEBACiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAotY2xhc3MgSVN1cmZhY2U7Ci0KIC8qCiAgKiBBIHNldCBvZiBiaXQgbWFza3MgZm9yIHNwZWNpZnlpbmcgaG93IHRoZSByZWNlaXZlZCBwcmV2aWV3IGZyYW1lcyBhcmUKICAqIGhhbmRsZWQgYmVmb3JlIHRoZSBwcmV2aWV3Q2FsbGJhY2soKSBjYWxsLgpAQCAtODQsNiArODIsMTQgQEAKICAgICBDQU1FUkFfQ01EX1NUQVJUX1NNT09USF9aT09NICAgICA9IDEsCiAgICAgQ0FNRVJBX0NNRF9TVE9QX1NNT09USF9aT09NICAgICAgPSAyLAogICAgIENBTUVSQV9DTURfU0VUX0RJU1BMQVlfT1JJRU5UQVRJT04gPSAzLAorCisgICAgLy8gY21kVHlwZSB0byBkaXNhYmxlL2VuYWJsZSBzaHV0dGVyIHNvdW5kLgorICAgIC8vIEluIHNlbmRDb21tYW5kIHBhc3NpbmcgYXJnMSA9IDAgd2lsbCBkaXNhYmxlLAorICAgIC8vIHdoaWxlIHBhc3NpbmcgYXJnMSA9IDEgd2lsbCBlbmFibGUgdGhlIHNodXR0ZXIgc291bmQuCisgICAgQ0FNRVJBX0NNRF9FTkFCTEVfU0hVVFRFUl9TT1VORCA9IDQsCisKKyAgICAvLyBjbWRUeXBlIHRvIHBsYXkgcmVjb3JkaW5nIHNvdW5kLgorICAgIENBTUVSQV9DTURfUExBWV9SRUNPUkRJTkdfU09VTkQgPSA1LAogfTsKIAogLy8gY2FtZXJhIGZhdGFsIGVycm9ycwpAQCAtMTUyLDkgKzE1OCw4IEBACiAKICAgICAgICAgICAgIHN0YXR1c190ICAgIGdldFN0YXR1cygpIHsgcmV0dXJuIG1TdGF0dXM7IH0KIAotICAgICAgICAgICAgLy8gcGFzcyB0aGUgYnVmZmVyZWQgSVN1cmZhY2UgdG8gdGhlIGNhbWVyYSBzZXJ2aWNlCisgICAgICAgICAgICAvLyBwYXNzIHRoZSBidWZmZXJlZCBTdXJmYWNlIHRvIHRoZSBjYW1lcmEgc2VydmljZQogICAgICAgICAgICAgc3RhdHVzX3QgICAgc2V0UHJldmlld0Rpc3BsYXkoY29uc3Qgc3A8U3VyZmFjZT4mIHN1cmZhY2UpOwotICAgICAgICAgICAgc3RhdHVzX3QgICAgc2V0UHJldmlld0Rpc3BsYXkoY29uc3Qgc3A8SVN1cmZhY2U+JiBzdXJmYWNlKTsKIAogICAgICAgICAgICAgLy8gc3RhcnQgcHJldmlldyBtb2RlLCBtdXN0IGNhbGwgc2V0UHJldmlld0Rpc3BsYXkgZmlyc3QKICAgICAgICAgICAgIHN0YXR1c190ICAgIHN0YXJ0UHJldmlldygpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jYW1lcmEvQ2FtZXJhSGFyZHdhcmVJbnRlcmZhY2UuaCBiL2luY2x1ZGUvY2FtZXJhL0NhbWVyYUhhcmR3YXJlSW50ZXJmYWNlLmgKaW5kZXggNmE2NmUzYy4uNTE1ZDg3OSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jYW1lcmEvQ2FtZXJhSGFyZHdhcmVJbnRlcmZhY2UuaAorKysgYi9pbmNsdWRlL2NhbWVyYS9DYW1lcmFIYXJkd2FyZUludGVyZmFjZS5oCkBAIC0xOCw2ICsxOCw3IEBACiAjZGVmaW5lIEFORFJPSURfSEFSRFdBUkVfQ0FNRVJBX0hBUkRXQVJFX0lOVEVSRkFDRV9ICiAKICNpbmNsdWRlIDxiaW5kZXIvSU1lbW9yeS5oPgorI2luY2x1ZGUgPHVpL2VnbC9hbmRyb2lkX25hdGl2ZXMuaD4KICNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+CiAjaW5jbHVkZSA8c3VyZmFjZWZsaW5nZXIvSVN1cmZhY2UuaD4KICNpbmNsdWRlIDxjYW1lcmEvQ2FtZXJhLmg+CkBAIC04Niw4ICs4Nyw4IEBACiBwdWJsaWM6CiAgICAgdmlydHVhbCB+Q2FtZXJhSGFyZHdhcmVJbnRlcmZhY2UoKSB7IH0KIAotICAgIC8qKiBSZXR1cm4gdGhlIElNZW1vcnlIZWFwIGZvciB0aGUgcHJldmlldyBpbWFnZSBoZWFwICovCi0gICAgdmlydHVhbCBzcDxJTWVtb3J5SGVhcD4gICAgICAgICBnZXRQcmV2aWV3SGVhcCgpIGNvbnN0ID0gMDsKKyAgICAvKiogU2V0IHRoZSBJU3VyZmFjZSBmcm9tIHdoaWNoIHRoZSBwcmV2aWV3IGJ1ZmZlcnMgc2hvdWxkIGJlIGRlcXVldWVkICovCisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRQcmV2aWV3V2luZG93KGNvbnN0IHNwPEFOYXRpdmVXaW5kb3c+JiBidWYpID0gMDsKIAogICAgIC8qKiBSZXR1cm4gdGhlIElNZW1vcnlIZWFwIGZvciB0aGUgcmF3IGltYWdlIGhlYXAgKi8KICAgICB2aXJ0dWFsIHNwPElNZW1vcnlIZWFwPiAgICAgICAgIGdldFJhd0hlYXAoKSBjb25zdCA9IDA7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2NhbWVyYS9JQ2FtZXJhLmggYi9pbmNsdWRlL2NhbWVyYS9JQ2FtZXJhLmgKaW5kZXggNmZjZjllNS4uOGJjZWVhNSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jYW1lcmEvSUNhbWVyYS5oCisrKyBiL2luY2x1ZGUvY2FtZXJhL0lDYW1lcmEuaApAQCAtMjAsNyArMjAsNyBAQAogI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KICNpbmNsdWRlIDxiaW5kZXIvSUludGVyZmFjZS5oPgogI2luY2x1ZGUgPGJpbmRlci9QYXJjZWwuaD4KLSNpbmNsdWRlIDxzdXJmYWNlZmxpbmdlci9JU3VyZmFjZS5oPgorI2luY2x1ZGUgPHN1cmZhY2VmbGluZ2VyL1N1cmZhY2UuaD4KICNpbmNsdWRlIDxiaW5kZXIvSU1lbW9yeS5oPgogI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KICNpbmNsdWRlIDxjYW1lcmEvQ2FtZXJhLmg+CkBAIC00NSw4ICs0NSw4IEBACiAgICAgLy8gYWxsb3cgb3RoZXIgcHJvY2Vzc2VzIHRvIHVzZSB0aGlzIElDYW1lcmEgaW50ZXJmYWNlCiAgICAgdmlydHVhbCBzdGF0dXNfdCAgICAgICAgdW5sb2NrKCkgPSAwOwogCi0gICAgLy8gcGFzcyB0aGUgYnVmZmVyZWQgSVN1cmZhY2UgdG8gdGhlIGNhbWVyYSBzZXJ2aWNlCi0gICAgdmlydHVhbCBzdGF0dXNfdCAgICAgICAgc2V0UHJldmlld0Rpc3BsYXkoY29uc3Qgc3A8SVN1cmZhY2U+JiBzdXJmYWNlKSA9IDA7CisgICAgLy8gcGFzcyB0aGUgYnVmZmVyZWQgU3VyZmFjZSB0byB0aGUgY2FtZXJhIHNlcnZpY2UKKyAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgICBzZXRQcmV2aWV3RGlzcGxheShjb25zdCBzcDxTdXJmYWNlPiYgc3VyZmFjZSkgPSAwOwogCiAgICAgLy8gc2V0IHRoZSBwcmV2aWV3IGNhbGxiYWNrIGZsYWcgdG8gYWZmZWN0IGhvdyB0aGUgcmVjZWl2ZWQgZnJhbWVzIGZyb20KICAgICAvLyBwcmV2aWV3IGFyZSBoYW5kbGVkLgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9JTWVkaWFQbGF5ZXIuaCBiL2luY2x1ZGUvbWVkaWEvSU1lZGlhUGxheWVyLmgKaW5kZXggYWY5YTdlZC4uYTFjZTExMyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS9JTWVkaWFQbGF5ZXIuaAorKysgYi9pbmNsdWRlL21lZGlhL0lNZWRpYVBsYXllci5oCkBAIC0yNSw2ICsyNSw3IEBACiAKIGNsYXNzIFBhcmNlbDsKIGNsYXNzIElTdXJmYWNlOworY2xhc3MgU3VyZmFjZTsKIAogY2xhc3MgSU1lZGlhUGxheWVyOiBwdWJsaWMgSUludGVyZmFjZQogewpAQCAtMzMsNyArMzQsOCBAQAogCiAgICAgdmlydHVhbCB2b2lkICAgICAgICAgICAgZGlzY29ubmVjdCgpID0gMDsKIAotICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICAgIHNldFZpZGVvU3VyZmFjZShjb25zdCBzcDxJU3VyZmFjZT4mIHN1cmZhY2UpID0gMDsKKyAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgICBzZXRWaWRlb0lTdXJmYWNlKGNvbnN0IHNwPElTdXJmYWNlPiYgc3VyZmFjZSkgPSAwOworICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICAgIHNldFZpZGVvU3VyZmFjZShjb25zdCBzcDxTdXJmYWNlPiYgc3VyZmFjZSkgPSAwOwogICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICAgIHByZXBhcmVBc3luYygpID0gMDsKICAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgICBzdGFydCgpID0gMDsKICAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgICBzdG9wKCkgPSAwOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9JTWVkaWFSZWNvcmRlci5oIGIvaW5jbHVkZS9tZWRpYS9JTWVkaWFSZWNvcmRlci5oCmluZGV4IDU0YWRjYTguLjI4YmU3YzEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbWVkaWEvSU1lZGlhUmVjb3JkZXIuaAorKysgYi9pbmNsdWRlL21lZGlhL0lNZWRpYVJlY29yZGVyLmgKQEAgLTIyLDcgKzIyLDcgQEAKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCi1jbGFzcyBJU3VyZmFjZTsKK2NsYXNzIFN1cmZhY2U7CiBjbGFzcyBJQ2FtZXJhOwogY2xhc3MgSU1lZGlhUmVjb3JkZXJDbGllbnQ7CiAKQEAgLTMyLDcgKzMyLDcgQEAKICAgICBERUNMQVJFX01FVEFfSU5URVJGQUNFKE1lZGlhUmVjb3JkZXIpOwogCiAgICAgdmlydHVhbAlzdGF0dXNfdAkJc2V0Q2FtZXJhKGNvbnN0IHNwPElDYW1lcmE+JiBjYW1lcmEpID0gMDsKLSAgICB2aXJ0dWFsCXN0YXR1c190CQlzZXRQcmV2aWV3U3VyZmFjZShjb25zdCBzcDxJU3VyZmFjZT4mIHN1cmZhY2UpID0gMDsKKyAgICB2aXJ0dWFsCXN0YXR1c190CQlzZXRQcmV2aWV3U3VyZmFjZShjb25zdCBzcDxTdXJmYWNlPiYgc3VyZmFjZSkgPSAwOwogICAgIHZpcnR1YWwJc3RhdHVzX3QJCXNldFZpZGVvU291cmNlKGludCB2cykgPSAwOwogICAgIHZpcnR1YWwJc3RhdHVzX3QJCXNldEF1ZGlvU291cmNlKGludCBhcykgPSAwOwogICAgIHZpcnR1YWwJc3RhdHVzX3QJCXNldE91dHB1dEZvcm1hdChpbnQgb2YpID0gMDsKQEAgLTQwLDYgKzQwLDcgQEAKICAgICB2aXJ0dWFsCXN0YXR1c190CQlzZXRBdWRpb0VuY29kZXIoaW50IGFlKSA9IDA7CiAgICAgdmlydHVhbAlzdGF0dXNfdAkJc2V0T3V0cHV0RmlsZShjb25zdCBjaGFyKiBwYXRoKSA9IDA7CiAgICAgdmlydHVhbAlzdGF0dXNfdAkJc2V0T3V0cHV0RmlsZShpbnQgZmQsIGludDY0X3Qgb2Zmc2V0LCBpbnQ2NF90IGxlbmd0aCkgPSAwOworICAgIHZpcnR1YWwJc3RhdHVzX3QJCXNldE91dHB1dEZpbGVBdXhpbGlhcnkoaW50IGZkKSA9IDA7CiAgICAgdmlydHVhbAlzdGF0dXNfdAkJc2V0VmlkZW9TaXplKGludCB3aWR0aCwgaW50IGhlaWdodCkgPSAwOwogICAgIHZpcnR1YWwJc3RhdHVzX3QJCXNldFZpZGVvRnJhbWVSYXRlKGludCBmcmFtZXNfcGVyX3NlY29uZCkgPSAwOwogICAgIHZpcnR1YWwgICAgIHN0YXR1c190ICAgICAgICAgICAgICAgIHNldFBhcmFtZXRlcnMoY29uc3QgU3RyaW5nOCYgcGFyYW1zKSA9IDA7CkBAIC02OCw0ICs2OSwzIEBACiB9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAogCiAjZW5kaWYgLy8gQU5EUk9JRF9JTUVESUFSRUNPUkRFUl9ICi0KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvSU9NWC5oIGIvaW5jbHVkZS9tZWRpYS9JT01YLmgKaW5kZXggMmY2MWNiZS4uMWY4Y2U3MSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS9JT01YLmgKKysrIGIvaW5jbHVkZS9tZWRpYS9JT01YLmgKQEAgLTE5LDYgKzE5LDcgQEAKICNkZWZpbmUgQU5EUk9JRF9JT01YX0hfCiAKICNpbmNsdWRlIDxiaW5kZXIvSUludGVyZmFjZS5oPgorI2luY2x1ZGUgPHVpL0dyYXBoaWNCdWZmZXIuaD4KICNpbmNsdWRlIDx1dGlscy9MaXN0Lmg+CiAjaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgogCkBAIC03OCwxMCArNzksMTcgQEAKICAgICAgICAgICAgIG5vZGVfaWQgbm9kZSwgT01YX0lOREVYVFlQRSBpbmRleCwKICAgICAgICAgICAgIGNvbnN0IHZvaWQgKnBhcmFtcywgc2l6ZV90IHNpemUpID0gMDsKIAorICAgIHZpcnR1YWwgc3RhdHVzX3QgZW5hYmxlR3JhcGhpY0J1ZmZlcnMoCisgICAgICAgICAgICBub2RlX2lkIG5vZGUsIE9NWF9VMzIgcG9ydF9pbmRleCwgT01YX0JPT0wgZW5hYmxlKSA9IDA7CisKICAgICB2aXJ0dWFsIHN0YXR1c190IHVzZUJ1ZmZlcigKICAgICAgICAgICAgIG5vZGVfaWQgbm9kZSwgT01YX1UzMiBwb3J0X2luZGV4LCBjb25zdCBzcDxJTWVtb3J5PiAmcGFyYW1zLAogICAgICAgICAgICAgYnVmZmVyX2lkICpidWZmZXIpID0gMDsKIAorICAgIHZpcnR1YWwgc3RhdHVzX3QgdXNlR3JhcGhpY0J1ZmZlcigKKyAgICAgICAgICAgIG5vZGVfaWQgbm9kZSwgT01YX1UzMiBwb3J0X2luZGV4LAorICAgICAgICAgICAgY29uc3Qgc3A8R3JhcGhpY0J1ZmZlcj4gJmdyYXBoaWNCdWZmZXIsIGJ1ZmZlcl9pZCAqYnVmZmVyKSA9IDA7CisKICAgICAvLyBUaGlzIEFQSSBjbGVhcmx5IG9ubHkgbWFrZXMgc2Vuc2UgaWYgdGhlIGNhbGxlciBsaXZlcyBpbiB0aGUKICAgICAvLyBzYW1lIHByb2Nlc3MgYXMgdGhlIGNhbGxlZSwgaS5lLiBpcyB0aGUgbWVkaWFfc2VydmVyLCBhcyB0aGUKICAgICAvLyByZXR1cm5lZCAiYnVmZmVyX2RhdGEiIHBvaW50ZXIgaXMganVzdCB0aGF0LCBhIHBvaW50ZXIgaW50byBsb2NhbApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9NZWRpYVBsYXllckludGVyZmFjZS5oIGIvaW5jbHVkZS9tZWRpYS9NZWRpYVBsYXllckludGVyZmFjZS5oCmluZGV4IDM2NjI5ODMuLjEzYzczYWMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbWVkaWEvTWVkaWFQbGF5ZXJJbnRlcmZhY2UuaAorKysgYi9pbmNsdWRlL21lZGlhL01lZGlhUGxheWVySW50ZXJmYWNlLmgKQEAgLTMzLDYgKzMzLDcgQEAKIAogY2xhc3MgUGFyY2VsOwogY2xhc3MgSVN1cmZhY2U7CitjbGFzcyBTdXJmYWNlOwogCiB0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBjbGFzcyBTb3J0ZWRWZWN0b3I7CiAKQEAgLTEwNCw3ICsxMDUsOCBAQAogICAgICAgICAgICAgY29uc3QgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gKmhlYWRlcnMgPSBOVUxMKSA9IDA7CiAKICAgICB2aXJ0dWFsIHN0YXR1c190ICAgIHNldERhdGFTb3VyY2UoaW50IGZkLCBpbnQ2NF90IG9mZnNldCwgaW50NjRfdCBsZW5ndGgpID0gMDsKLSAgICB2aXJ0dWFsIHN0YXR1c190ICAgIHNldFZpZGVvU3VyZmFjZShjb25zdCBzcDxJU3VyZmFjZT4mIHN1cmZhY2UpID0gMDsKKyAgICB2aXJ0dWFsIHN0YXR1c190ICAgIHNldFZpZGVvSVN1cmZhY2UoY29uc3Qgc3A8SVN1cmZhY2U+JiBzdXJmYWNlKSA9IDA7CisgICAgdmlydHVhbCBzdGF0dXNfdCAgICBzZXRWaWRlb1N1cmZhY2UoY29uc3Qgc3A8U3VyZmFjZT4mIHN1cmZhY2UpID0gMDsKICAgICB2aXJ0dWFsIHN0YXR1c190ICAgIHByZXBhcmUoKSA9IDA7CiAgICAgdmlydHVhbCBzdGF0dXNfdCAgICBwcmVwYXJlQXN5bmMoKSA9IDA7CiAgICAgdmlydHVhbCBzdGF0dXNfdCAgICBzdGFydCgpID0gMDsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvTWVkaWFQcm9maWxlcy5oIGIvaW5jbHVkZS9tZWRpYS9NZWRpYVByb2ZpbGVzLmgKaW5kZXggYzNjZDM2MS4uMGVjN2VlYyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS9NZWRpYVByb2ZpbGVzLmgKKysrIGIvaW5jbHVkZS9tZWRpYS9NZWRpYVByb2ZpbGVzLmgKQEAgLTI1LDcgKzI1LDIwIEBACiAKIGVudW0gY2FtY29yZGVyX3F1YWxpdHkgewogICAgIENBTUNPUkRFUl9RVUFMSVRZX0xPVyAgPSAwLAotICAgIENBTUNPUkRFUl9RVUFMSVRZX0hJR0ggPSAxCisgICAgQ0FNQ09SREVSX1FVQUxJVFlfSElHSCA9IDEsCisgICAgQ0FNQ09SREVSX1FVQUxJVFlfUUNJRiA9IDIsCisgICAgQ0FNQ09SREVSX1FVQUxJVFlfQ0lGID0gMywKKyAgICBDQU1DT1JERVJfUVVBTElUWV80ODBQID0gNCwKKyAgICBDQU1DT1JERVJfUVVBTElUWV83MjBQID0gNSwKKyAgICBDQU1DT1JERVJfUVVBTElUWV8xMDgwUCA9IDYsCisKKyAgICBDQU1DT1JERVJfUVVBTElUWV9USU1FX0xBUFNFX0xPVyAgPSAxMDAwLAorICAgIENBTUNPUkRFUl9RVUFMSVRZX1RJTUVfTEFQU0VfSElHSCA9IDEwMDEsCisgICAgQ0FNQ09SREVSX1FVQUxJVFlfVElNRV9MQVBTRV9RQ0lGID0gMTAwMiwKKyAgICBDQU1DT1JERVJfUVVBTElUWV9USU1FX0xBUFNFX0NJRiA9IDEwMDMsCisgICAgQ0FNQ09SREVSX1FVQUxJVFlfVElNRV9MQVBTRV80ODBQID0gMTAwNCwKKyAgICBDQU1DT1JERVJfUVVBTElUWV9USU1FX0xBUFNFXzcyMFAgPSAxMDA1LAorICAgIENBTUNPUkRFUl9RVUFMSVRZX1RJTUVfTEFQU0VfMTA4MFAgPSAxMDA2CiB9OwogCiBlbnVtIHZpZGVvX2RlY29kZXIgewpAQCAtNjgsNiArODEsMTIgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbWNvcmRlcl9xdWFsaXR5IHF1YWxpdHkpIGNvbnN0OwogCiAgICAgLyoqCisgICAgICogUmV0dXJucyB0cnVlIGlmIGEgcHJvZmlsZSBmb3IgdGhlIGdpdmVuIGNhbWVyYSBhdCB0aGUgZ2l2ZW4gcXVhbGl0eSBleGlzdHMsCisgICAgICogb3IgZmFsc2UgaWYgbm90LgorICAgICAqLworICAgIGJvb2wgaGFzQ2FtY29yZGVyUHJvZmlsZShpbnQgY2FtZXJhSWQsIGNhbWNvcmRlcl9xdWFsaXR5IHF1YWxpdHkpIGNvbnN0OworCisgICAgLyoqCiAgICAgICogUmV0dXJucyB0aGUgb3V0cHV0IGZpbGUgZm9ybWF0cyBzdXBwb3J0ZWQuCiAgICAgICovCiAgICAgVmVjdG9yPG91dHB1dF9mb3JtYXQ+IGdldE91dHB1dEZpbGVGb3JtYXRzKCkgY29uc3Q7CkBAIC0yNTIsNiArMjcxLDggQEAKICAgICAgICAgVmVjdG9yPGludD4gbUxldmVsczsKICAgICB9OwogCisgICAgaW50IGdldENhbWNvcmRlclByb2ZpbGVJbmRleChpbnQgY2FtZXJhSWQsIGNhbWNvcmRlcl9xdWFsaXR5IHF1YWxpdHkpIGNvbnN0OworCiAgICAgLy8gRGVidWcKICAgICBzdGF0aWMgdm9pZCBsb2dWaWRlb0NvZGVjKGNvbnN0IFZpZGVvQ29kZWMmIGNvZGVjKTsKICAgICBzdGF0aWMgdm9pZCBsb2dBdWRpb0NvZGVjKGNvbnN0IEF1ZGlvQ29kZWMmIGNvZGVjKTsKQEAgLTI4Myw2ICszMDQsOCBAQAogICAgIHN0YXRpYyBNZWRpYVByb2ZpbGVzKiBjcmVhdGVEZWZhdWx0SW5zdGFuY2UoKTsKICAgICBzdGF0aWMgQ2FtY29yZGVyUHJvZmlsZSAqY3JlYXRlRGVmYXVsdENhbWNvcmRlckxvd1Byb2ZpbGUoKTsKICAgICBzdGF0aWMgQ2FtY29yZGVyUHJvZmlsZSAqY3JlYXRlRGVmYXVsdENhbWNvcmRlckhpZ2hQcm9maWxlKCk7CisgICAgc3RhdGljIENhbWNvcmRlclByb2ZpbGUgKmNyZWF0ZURlZmF1bHRDYW1jb3JkZXJUaW1lTGFwc2VMb3dQcm9maWxlKCk7CisgICAgc3RhdGljIENhbWNvcmRlclByb2ZpbGUgKmNyZWF0ZURlZmF1bHRDYW1jb3JkZXJUaW1lTGFwc2VIaWdoUHJvZmlsZSgpOwogICAgIHN0YXRpYyB2b2lkIGNyZWF0ZURlZmF1bHRDYW1jb3JkZXJQcm9maWxlcyhNZWRpYVByb2ZpbGVzICpwcm9maWxlcyk7CiAgICAgc3RhdGljIHZvaWQgY3JlYXRlRGVmYXVsdFZpZGVvRW5jb2RlcnMoTWVkaWFQcm9maWxlcyAqcHJvZmlsZXMpOwogICAgIHN0YXRpYyB2b2lkIGNyZWF0ZURlZmF1bHRBdWRpb0VuY29kZXJzKE1lZGlhUHJvZmlsZXMgKnByb2ZpbGVzKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvTWVkaWFSZWNvcmRlckJhc2UuaCBiL2luY2x1ZGUvbWVkaWEvTWVkaWFSZWNvcmRlckJhc2UuaAppbmRleCA1ZTllMzY4Li5jNDIzNDZlIDEwMDY0NAotLS0gYS9pbmNsdWRlL21lZGlhL01lZGlhUmVjb3JkZXJCYXNlLmgKKysrIGIvaW5jbHVkZS9tZWRpYS9NZWRpYVJlY29yZGVyQmFzZS5oCkBAIC0yMiw3ICsyMiw3IEBACiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAotY2xhc3MgSVN1cmZhY2U7CitjbGFzcyBTdXJmYWNlOwogCiBzdHJ1Y3QgTWVkaWFSZWNvcmRlckJhc2UgewogICAgIE1lZGlhUmVjb3JkZXJCYXNlKCkge30KQEAgLTM3LDkgKzM3LDEwIEBACiAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRWaWRlb1NpemUoaW50IHdpZHRoLCBpbnQgaGVpZ2h0KSA9IDA7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRWaWRlb0ZyYW1lUmF0ZShpbnQgZnJhbWVzX3Blcl9zZWNvbmQpID0gMDsKICAgICB2aXJ0dWFsIHN0YXR1c190IHNldENhbWVyYShjb25zdCBzcDxJQ2FtZXJhPiYgY2FtZXJhKSA9IDA7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRQcmV2aWV3U3VyZmFjZShjb25zdCBzcDxJU3VyZmFjZT4mIHN1cmZhY2UpID0gMDsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldFByZXZpZXdTdXJmYWNlKGNvbnN0IHNwPFN1cmZhY2U+JiBzdXJmYWNlKSA9IDA7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRPdXRwdXRGaWxlKGNvbnN0IGNoYXIgKnBhdGgpID0gMDsKICAgICB2aXJ0dWFsIHN0YXR1c190IHNldE91dHB1dEZpbGUoaW50IGZkLCBpbnQ2NF90IG9mZnNldCwgaW50NjRfdCBsZW5ndGgpID0gMDsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldE91dHB1dEZpbGVBdXhpbGlhcnkoaW50IGZkKSB7cmV0dXJuIElOVkFMSURfT1BFUkFUSU9OO30KICAgICB2aXJ0dWFsIHN0YXR1c190IHNldFBhcmFtZXRlcnMoY29uc3QgU3RyaW5nOCYgcGFyYW1zKSA9IDA7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRMaXN0ZW5lcihjb25zdCBzcDxJTWVkaWFSZWNvcmRlckNsaWVudD4mIGxpc3RlbmVyKSA9IDA7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBwcmVwYXJlKCkgPSAwOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9QVk1lZGlhUmVjb3JkZXIuaCBiL2luY2x1ZGUvbWVkaWEvUFZNZWRpYVJlY29yZGVyLmgKaW5kZXggYzA5MWMzOS4uNGI0NGNjYyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS9QVk1lZGlhUmVjb3JkZXIuaAorKysgYi9pbmNsdWRlL21lZGlhL1BWTWVkaWFSZWNvcmRlci5oCkBAIC0yMyw3ICsyMyw3IEBACiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAotY2xhc3MgSVN1cmZhY2U7CitjbGFzcyBTdXJmYWNlOwogY2xhc3MgSUNhbWVyYTsKIGNsYXNzIEF1dGhvckRyaXZlcldyYXBwZXI7CiAKQEAgLTQxLDcgKzQxLDcgQEAKICAgICB2aXJ0dWFsIHN0YXR1c190IHNldFZpZGVvU2l6ZShpbnQgd2lkdGgsIGludCBoZWlnaHQpOwogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0VmlkZW9GcmFtZVJhdGUoaW50IGZyYW1lc19wZXJfc2Vjb25kKTsKICAgICB2aXJ0dWFsIHN0YXR1c190IHNldENhbWVyYShjb25zdCBzcDxJQ2FtZXJhPiYgY2FtZXJhKTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldFByZXZpZXdTdXJmYWNlKGNvbnN0IHNwPElTdXJmYWNlPiYgc3VyZmFjZSk7CisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRQcmV2aWV3U3VyZmFjZShjb25zdCBzcDxTdXJmYWNlPiYgc3VyZmFjZSk7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRPdXRwdXRGaWxlKGNvbnN0IGNoYXIgKnBhdGgpOwogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0T3V0cHV0RmlsZShpbnQgZmQsIGludDY0X3Qgb2Zmc2V0LCBpbnQ2NF90IGxlbmd0aCk7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRQYXJhbWV0ZXJzKGNvbnN0IFN0cmluZzgmIHBhcmFtcyk7CkBAIC02Niw0ICs2NiwzIEBACiB9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAogCiAjZW5kaWYgLy8gQU5EUk9JRF9QVk1FRElBUkVDT1JERVJfSAotCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL1BWUGxheWVyLmggYi9pbmNsdWRlL21lZGlhL1BWUGxheWVyLmgKaW5kZXggZGY1MDk4MS4uNjU3ZTdhNiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS9QVlBsYXllci5oCisrKyBiL2luY2x1ZGUvbWVkaWEvUFZQbGF5ZXIuaApAQCAtNDMsNyArNDMsOCBAQAogICAgICAgICAgICAgY29uc3QgY2hhciAqdXJsLCBjb25zdCBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiAqaGVhZGVycyk7CiAKICAgICB2aXJ0dWFsIHN0YXR1c190ICAgIHNldERhdGFTb3VyY2UoaW50IGZkLCBpbnQ2NF90IG9mZnNldCwgaW50NjRfdCBsZW5ndGgpOwotICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgc2V0VmlkZW9TdXJmYWNlKGNvbnN0IHNwPElTdXJmYWNlPiYgc3VyZmFjZSk7CisgICAgdmlydHVhbCBzdGF0dXNfdCAgICBzZXRWaWRlb0lTdXJmYWNlKGNvbnN0IHNwPElTdXJmYWNlPiYgc3VyZmFjZSk7CisgICAgdmlydHVhbCBzdGF0dXNfdCAgICBzZXRWaWRlb1N1cmZhY2UoY29uc3Qgc3A8U3VyZmFjZT4mIHN1cmZhY2UpOwogICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgcHJlcGFyZSgpOwogICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgcHJlcGFyZUFzeW5jKCk7CiAgICAgdmlydHVhbCBzdGF0dXNfdCAgICBzdGFydCgpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9tZWRpYXJlY29yZGVyLmggYi9pbmNsdWRlL21lZGlhL21lZGlhcmVjb3JkZXIuaAppbmRleCAyOTFiMThhLi5hNjAwZjZiIDEwMDY0NAotLS0gYS9pbmNsdWRlL21lZGlhL21lZGlhcmVjb3JkZXIuaAorKysgYi9pbmNsdWRlL21lZGlhL21lZGlhcmVjb3JkZXIuaApAQCAtMTcwLDYgKzE3MCw3IEBACiAgICAgc3RhdHVzX3QgICAgc2V0QXVkaW9FbmNvZGVyKGludCBhZSk7CiAgICAgc3RhdHVzX3QgICAgc2V0T3V0cHV0RmlsZShjb25zdCBjaGFyKiBwYXRoKTsKICAgICBzdGF0dXNfdCAgICBzZXRPdXRwdXRGaWxlKGludCBmZCwgaW50NjRfdCBvZmZzZXQsIGludDY0X3QgbGVuZ3RoKTsKKyAgICBzdGF0dXNfdCAgICBzZXRPdXRwdXRGaWxlQXV4aWxpYXJ5KGludCBmZCk7CiAgICAgc3RhdHVzX3QgICAgc2V0VmlkZW9TaXplKGludCB3aWR0aCwgaW50IGhlaWdodCk7CiAgICAgc3RhdHVzX3QgICAgc2V0VmlkZW9GcmFtZVJhdGUoaW50IGZyYW1lc19wZXJfc2Vjb25kKTsKICAgICBzdGF0dXNfdCAgICBzZXRQYXJhbWV0ZXJzKGNvbnN0IFN0cmluZzgmIHBhcmFtcyk7CkBAIC0xOTYsNiArMTk3LDcgQEAKICAgICBib29sICAgICAgICAgICAgICAgICAgICAgICAgbUlzQXVkaW9FbmNvZGVyU2V0OwogICAgIGJvb2wgICAgICAgICAgICAgICAgICAgICAgICBtSXNWaWRlb0VuY29kZXJTZXQ7CiAgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgICAgIG1Jc091dHB1dEZpbGVTZXQ7CisgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgICAgIG1Jc0F1eGlsaWFyeU91dHB1dEZpbGVTZXQ7CiAgICAgTXV0ZXggICAgICAgICAgICAgICAgICAgICAgIG1Mb2NrOwogICAgIE11dGV4ICAgICAgICAgICAgICAgICAgICAgICBtTm90aWZ5TG9jazsKIH07CmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL21lZGlhc2Nhbm5lci5oIGIvaW5jbHVkZS9tZWRpYS9tZWRpYXNjYW5uZXIuaAppbmRleCAwZDM5N2FjLi43NGM5ZDVkIDEwMDY0NAotLS0gYS9pbmNsdWRlL21lZGlhL21lZGlhc2Nhbm5lci5oCisrKyBiL2luY2x1ZGUvbWVkaWEvbWVkaWFzY2FubmVyLmgKQEAgLTM4LDggKzM4LDcgQEAKIAogICAgIHR5cGVkZWYgYm9vbCAoKkV4Y2VwdGlvbkNoZWNrKSh2b2lkKiBlbnYpOwogICAgIHZpcnR1YWwgc3RhdHVzX3QgcHJvY2Vzc0RpcmVjdG9yeSgKLSAgICAgICAgICAgIGNvbnN0IGNoYXIgKnBhdGgsIGNvbnN0IGNoYXIgKmV4dGVuc2lvbnMsCi0gICAgICAgICAgICBNZWRpYVNjYW5uZXJDbGllbnQgJmNsaWVudCwKKyAgICAgICAgICAgIGNvbnN0IGNoYXIgKnBhdGgsIE1lZGlhU2Nhbm5lckNsaWVudCAmY2xpZW50LAogICAgICAgICAgICAgRXhjZXB0aW9uQ2hlY2sgZXhjZXB0aW9uQ2hlY2ssIHZvaWQgKmV4Y2VwdGlvbkVudik7CiAKICAgICB2b2lkIHNldExvY2FsZShjb25zdCBjaGFyICpsb2NhbGUpOwpAQCAtNTUsOSArNTQsOCBAQAogICAgIGNoYXIgKm1Mb2NhbGU7CiAKICAgICBzdGF0dXNfdCBkb1Byb2Nlc3NEaXJlY3RvcnkoCi0gICAgICAgICAgICBjaGFyICpwYXRoLCBpbnQgcGF0aFJlbWFpbmluZywgY29uc3QgY2hhciAqZXh0ZW5zaW9ucywKLSAgICAgICAgICAgIE1lZGlhU2Nhbm5lckNsaWVudCAmY2xpZW50LCBFeGNlcHRpb25DaGVjayBleGNlcHRpb25DaGVjaywKLSAgICAgICAgICAgIHZvaWQgKmV4Y2VwdGlvbkVudik7CisgICAgICAgICAgICBjaGFyICpwYXRoLCBpbnQgcGF0aFJlbWFpbmluZywgTWVkaWFTY2FubmVyQ2xpZW50ICZjbGllbnQsCisgICAgICAgICAgICBFeGNlcHRpb25DaGVjayBleGNlcHRpb25DaGVjaywgdm9pZCAqZXhjZXB0aW9uRW52KTsKIAogICAgIE1lZGlhU2Nhbm5lcihjb25zdCBNZWRpYVNjYW5uZXIgJik7CiAgICAgTWVkaWFTY2FubmVyICZvcGVyYXRvcj0oY29uc3QgTWVkaWFTY2FubmVyICYpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9DYW1lcmFTb3VyY2UuaCBiL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvQ2FtZXJhU291cmNlLmgKaW5kZXggMzE5MmQwMy4uZWQ1ZjA5ZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9DYW1lcmFTb3VyY2UuaAorKysgYi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0NhbWVyYVNvdXJjZS5oCkBAIC0yMiw3ICsyMiw2IEBACiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFTb3VyY2UuaD4KICNpbmNsdWRlIDx1dGlscy9MaXN0Lmg+CiAjaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgotI2luY2x1ZGUgPHV0aWxzL3RocmVhZHMuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCkBAIC00NywxMiArNDYsMzQgQEAKIAogICAgIHZpcnR1YWwgdm9pZCBzaWduYWxCdWZmZXJSZXR1cm5lZChNZWRpYUJ1ZmZlciogYnVmZmVyKTsKIAotcHJpdmF0ZToKLSAgICBmcmllbmQgY2xhc3MgQ2FtZXJhU291cmNlTGlzdGVuZXI7Ci0KK3Byb3RlY3RlZDoKICAgICBzcDxDYW1lcmE+IG1DYW1lcmE7CiAgICAgc3A8TWV0YURhdGE+IG1NZXRhOwogCisgICAgaW50NjRfdCBtU3RhcnRUaW1lVXM7CisgICAgaW50MzJfdCBtTnVtRnJhbWVzUmVjZWl2ZWQ7CisgICAgaW50NjRfdCBtTGFzdEZyYW1lVGltZXN0YW1wVXM7CisgICAgYm9vbCBtU3RhcnRlZDsKKworICAgIENhbWVyYVNvdXJjZShjb25zdCBzcDxDYW1lcmE+ICZjYW1lcmEpOworCisgICAgdmlydHVhbCB2b2lkIHN0YXJ0Q2FtZXJhUmVjb3JkaW5nKCk7CisgICAgdmlydHVhbCB2b2lkIHN0b3BDYW1lcmFSZWNvcmRpbmcoKTsKKyAgICB2aXJ0dWFsIHZvaWQgcmVsZWFzZVJlY29yZGluZ0ZyYW1lKGNvbnN0IHNwPElNZW1vcnk+JiBmcmFtZSk7CisKKyAgICAvLyBSZXR1cm5zIHRydWUgaWYgbmVlZCB0byBza2lwIHRoZSBjdXJyZW50IGZyYW1lLgorICAgIC8vIENhbGxlZCBmcm9tIGRhdGFDYWxsYmFja1RpbWVzdGFtcC4KKyAgICB2aXJ0dWFsIGJvb2wgc2tpcEN1cnJlbnRGcmFtZShpbnQ2NF90IHRpbWVzdGFtcFVzKSB7cmV0dXJuIGZhbHNlO30KKworICAgIC8vIENhbGxiYWNrIGNhbGxlZCB3aGVuIHN0aWxsIGNhbWVyYSByYXcgZGF0YSBpcyBhdmFpbGFibGUuCisgICAgdmlydHVhbCB2b2lkIGRhdGFDYWxsYmFjayhpbnQzMl90IG1zZ1R5cGUsIGNvbnN0IHNwPElNZW1vcnk+ICZkYXRhKSB7fQorCisgICAgdmlydHVhbCB2b2lkIGRhdGFDYWxsYmFja1RpbWVzdGFtcChpbnQ2NF90IHRpbWVzdGFtcFVzLCBpbnQzMl90IG1zZ1R5cGUsCisgICAgICAgICAgICBjb25zdCBzcDxJTWVtb3J5PiAmZGF0YSk7CisKK3ByaXZhdGU6CisgICAgZnJpZW5kIGNsYXNzIENhbWVyYVNvdXJjZUxpc3RlbmVyOworCiAgICAgTXV0ZXggbUxvY2s7CiAgICAgQ29uZGl0aW9uIG1GcmFtZUF2YWlsYWJsZUNvbmRpdGlvbjsKICAgICBDb25kaXRpb24gbUZyYW1lQ29tcGxldGVDb25kaXRpb247CkBAIC02MCwyMSArODEsMTIgQEAKICAgICBMaXN0PHNwPElNZW1vcnk+ID4gbUZyYW1lc0JlaW5nRW5jb2RlZDsKICAgICBMaXN0PGludDY0X3Q+IG1GcmFtZVRpbWVzOwogCi0gICAgaW50NjRfdCBtU3RhcnRUaW1lVXM7CiAgICAgaW50NjRfdCBtRmlyc3RGcmFtZVRpbWVVczsKLSAgICBpbnQ2NF90IG1MYXN0RnJhbWVUaW1lc3RhbXBVczsKLSAgICBpbnQzMl90IG1OdW1GcmFtZXNSZWNlaXZlZDsKICAgICBpbnQzMl90IG1OdW1GcmFtZXNFbmNvZGVkOwogICAgIGludDMyX3QgbU51bUZyYW1lc0Ryb3BwZWQ7CiAgICAgaW50MzJfdCBtTnVtR2xpdGNoZXM7CiAgICAgaW50NjRfdCBtR2xpdGNoRHVyYXRpb25UaHJlc2hvbGRVczsKICAgICBib29sIG1Db2xsZWN0U3RhdHM7Ci0gICAgYm9vbCBtU3RhcnRlZDsKLQotICAgIENhbWVyYVNvdXJjZShjb25zdCBzcDxDYW1lcmE+ICZjYW1lcmEpOwotCi0gICAgdm9pZCBkYXRhQ2FsbGJhY2tUaW1lc3RhbXAoCi0gICAgICAgICAgICBpbnQ2NF90IHRpbWVzdGFtcFVzLCBpbnQzMl90IG1zZ1R5cGUsIGNvbnN0IHNwPElNZW1vcnk+ICZkYXRhKTsKIAogICAgIHZvaWQgcmVsZWFzZVF1ZXVlZEZyYW1lcygpOwogICAgIHZvaWQgcmVsZWFzZU9uZVJlY29yZGluZ0ZyYW1lKGNvbnN0IHNwPElNZW1vcnk+JiBmcmFtZSk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0NhbWVyYVNvdXJjZVRpbWVMYXBzZS5oIGIvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9DYW1lcmFTb3VyY2VUaW1lTGFwc2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMWNkMGM4Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9DYW1lcmFTb3VyY2VUaW1lTGFwc2UuaApAQCAtMCwwICsxLDE4MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQ0FNRVJBX1NPVVJDRV9USU1FX0xBUFNFX0hfCisKKyNkZWZpbmUgQ0FNRVJBX1NPVVJDRV9USU1FX0xBUFNFX0hfCisKKyNpbmNsdWRlIDxwdGhyZWFkLmg+CisKKyNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+CisjaW5jbHVkZSA8dXRpbHMvdGhyZWFkcy5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NsYXNzIElDYW1lcmE7CitjbGFzcyBJTWVtb3J5OworY2xhc3MgQ2FtZXJhOworCitjbGFzcyBDYW1lcmFTb3VyY2VUaW1lTGFwc2UgOiBwdWJsaWMgQ2FtZXJhU291cmNlIHsKK3B1YmxpYzoKKyAgICBzdGF0aWMgQ2FtZXJhU291cmNlVGltZUxhcHNlICpDcmVhdGUoCisgICAgICAgIGludDY0X3QgdGltZUJldHdlZW5UaW1lTGFwc2VGcmFtZUNhcHR1cmVVcywKKyAgICAgICAgaW50MzJfdCB3aWR0aCwgaW50MzJfdCBoZWlnaHQsCisgICAgICAgIGludDMyX3QgdmlkZW9GcmFtZVJhdGUpOworCisgICAgc3RhdGljIENhbWVyYVNvdXJjZVRpbWVMYXBzZSAqQ3JlYXRlRnJvbUNhbWVyYShjb25zdCBzcDxDYW1lcmE+ICZjYW1lcmEsCisgICAgICAgIGludDY0X3QgdGltZUJldHdlZW5UaW1lTGFwc2VGcmFtZUNhcHR1cmVVcywKKyAgICAgICAgaW50MzJfdCB3aWR0aCwgaW50MzJfdCBoZWlnaHQsCisgICAgICAgIGludDMyX3QgdmlkZW9GcmFtZVJhdGUpOworCisgICAgdmlydHVhbCB+Q2FtZXJhU291cmNlVGltZUxhcHNlKCk7CisKK3ByaXZhdGU6CisgICAgLy8gSWYgdHJ1ZSwgd2lsbCB1c2Ugc3RpbGwgY2FtZXJhIHRha2VQaWN0dXJlKCkgZm9yIHRpbWUgbGFwc2UgZnJhbWVzCisgICAgLy8gSWYgZmFsc2UsIHdpbGwgdXNlIHRoZSB2aWRlb2NhbWVyYSBmcmFtZXMgaW5zdGVhZC4KKyAgICBib29sIG1Vc2VTdGlsbENhbWVyYUZvclRpbWVMYXBzZTsKKworICAgIC8vIFNpemUgb2YgcGljdHVyZSB0YWtlbiBmcm9tIHN0aWxsIGNhbWVyYS4gVGhpcyBtYXkgYmUgbGFyZ2VyIHRoYW4gdGhlIHNpemUKKyAgICAvLyBvZiB0aGUgdmlkZW8sIGFzIHN0aWxsIGNhbWVyYSBtYXkgbm90IHN1cHBvcnQgdGhlIGV4YWN0IHZpZGVvIHJlc29sdXRpb24KKyAgICAvLyBkZW1hbmRlZC4gU2VlIHNldFBpY3R1cmVTaXplVG9DbG9zZXN0U3VwcG9ydGVkKCkuCisgICAgaW50MzJfdCBtUGljdHVyZVdpZHRoOworICAgIGludDMyX3QgbVBpY3R1cmVIZWlnaHQ7CisKKyAgICAvLyBzaXplIG9mIHRoZSBlbmNvZGVkIHZpZGVvLgorICAgIGludDMyX3QgbVZpZGVvV2lkdGg7CisgICAgaW50MzJfdCBtVmlkZW9IZWlnaHQ7CisKKyAgICAvLyBUcnVlIGlmIHdlIG5lZWQgdG8gY3JvcCB0aGUgc3RpbGwgY2FtZXJhIGltYWdlIHRvIGdldCB0aGUgdmlkZW8gZnJhbWUuCisgICAgYm9vbCBtTmVlZENyb3BwaW5nOworCisgICAgLy8gU3RhcnQgbG9jYXRpb24gb2YgdGhlIGNyb3BwaW5nIHJlY3RhbmdsZS4KKyAgICBpbnQzMl90IG1Dcm9wUmVjdFN0YXJ0WDsKKyAgICBpbnQzMl90IG1Dcm9wUmVjdFN0YXJ0WTsKKworICAgIC8vIFRpbWUgYmV0d2VlbiBjYXB0dXJlIG9mIHR3byBmcmFtZXMgZHVyaW5nIHRpbWUgbGFwc2UgcmVjb3JkaW5nCisgICAgLy8gTmVnYXRpdmUgdmFsdWUgaW5kaWNhdGVzIHRoYXQgdGltZWxhcHNlIGlzIGRpc2FibGVkLgorICAgIGludDY0X3QgbVRpbWVCZXR3ZWVuVGltZUxhcHNlRnJhbWVDYXB0dXJlVXM7CisKKyAgICAvLyBUaW1lIGJldHdlZW4gdHdvIGZyYW1lcyBpbiBmaW5hbCB2aWRlbyAoMS9mcmFtZVJhdGUpCisgICAgaW50NjRfdCBtVGltZUJldHdlZW5UaW1lTGFwc2VWaWRlb0ZyYW1lc1VzOworCisgICAgLy8gUmVhbCB0aW1lc3RhbXAgb2YgdGhlIGxhc3QgZW5jb2RlZCB0aW1lIGxhcHNlIGZyYW1lCisgICAgaW50NjRfdCBtTGFzdFRpbWVMYXBzZUZyYW1lUmVhbFRpbWVzdGFtcFVzOworCisgICAgLy8gVGhyZWFkIGlkIG9mIHRocmVhZCB3aGljaCB0YWtlcyBzdGlsbCBwaWN0dXJlIGFuZCBzbGVlcHMgaW4gYSBsb29wLgorICAgIHB0aHJlYWRfdCBtVGhyZWFkVGltZUxhcHNlOworCisgICAgLy8gVmFyaWFibGUgc2V0IGluIGRhdGFDYWxsYmFja1RpbWVzdGFtcCgpIHRvIGhlbHAgc2tpcEN1cnJlbnRGcmFtZSgpCisgICAgLy8gdG8ga25vdyBpZiBjdXJyZW50IGZyYW1lIG5lZWRzIHRvIGJlIHNraXBwZWQuCisgICAgYm9vbCBtU2tpcEN1cnJlbnRGcmFtZTsKKworICAgIC8vIFRydWUgaWYgY2FtZXJhIGlzIGluIHByZXZpZXcgbW9kZSBhbmQgcmVhZHkgZm9yIHRha2VQaWN0dXJlKCkuCisgICAgYm9vbCBtQ2FtZXJhSWRsZTsKKworICAgIENhbWVyYVNvdXJjZVRpbWVMYXBzZShjb25zdCBzcDxDYW1lcmE+ICZjYW1lcmEsCisgICAgICAgIGludDY0X3QgdGltZUJldHdlZW5UaW1lTGFwc2VGcmFtZUNhcHR1cmVVcywKKyAgICAgICAgaW50MzJfdCB3aWR0aCwgaW50MzJfdCBoZWlnaHQsCisgICAgICAgIGludDMyX3QgdmlkZW9GcmFtZVJhdGUpOworCisgICAgLy8gRm9yIHN0aWxsIGNhbWVyYSBjYXNlIHN0YXJ0cyBhIHRocmVhZCB3aGljaCBjYWxscyBjYW1lcmEncyB0YWtlUGljdHVyZSgpCisgICAgLy8gaW4gYSBsb29wLiBGb3IgdmlkZW8gY2FtZXJhIGNhc2UsIGp1c3Qgc3RhcnRzIHRoZSBjYW1lcmEncyB2aWRlbyByZWNvcmRpbmcuCisgICAgdmlydHVhbCB2b2lkIHN0YXJ0Q2FtZXJhUmVjb3JkaW5nKCk7CisKKyAgICAvLyBGb3Igc3RpbGwgY2FtZXJhIGNhc2Ugam9pbnMgdGhlIHRocmVhZCBjcmVhdGVkIGluIHN0YXJ0Q2FtZXJhUmVjb3JkaW5nKCkuCisgICAgLy8gRm9yIHZpZGVvIGNhbWVyYSBjYXNlLCBqdXN0IHN0b3BzIHRoZSBjYW1lcmEncyB2aWRlbyByZWNvcmRpbmcuCisgICAgdmlydHVhbCB2b2lkIHN0b3BDYW1lcmFSZWNvcmRpbmcoKTsKKworICAgIC8vIEZvciBzdGlsbCBjYW1lcmEgY2FzZSBkb24ndCBuZWVkIHRvIGRvIGFueXRoaW5nIGFzIG1lbW9yeSBpcyBsb2NhbGx5CisgICAgLy8gYWxsb2NhdGVkIHdpdGggcmVmY291bnRpbmcuCisgICAgLy8gRm9yIHZpZGVvIGNhbWVyYSBjYXNlIGp1c3QgdGVsbCB0aGUgY2FtZXJhIHRvIHJlbGVhc2UgdGhlIGZyYW1lLgorICAgIHZpcnR1YWwgdm9pZCByZWxlYXNlUmVjb3JkaW5nRnJhbWUoY29uc3Qgc3A8SU1lbW9yeT4mIGZyYW1lKTsKKworICAgIC8vIG1Ta2lwQ3VycmVudEZyYW1lIGlzIHNldCB0byB0cnVlIGluIGRhdGFDYWxsYmFja1RpbWVzdGFtcCgpIGlmIHRoZSBjdXJyZW50CisgICAgLy8gZnJhbWUgbmVlZHMgdG8gYmUgc2tpcHBlZCBhbmQgdGhpcyBmdW5jdGlvbiBqdXN0IHJldHVybnMgdGhlIHZhbHVlIG9mIG1Ta2lwQ3VycmVudEZyYW1lLgorICAgIHZpcnR1YWwgYm9vbCBza2lwQ3VycmVudEZyYW1lKGludDY0X3QgdGltZXN0YW1wVXMpOworCisgICAgLy8gSGFuZGxlcyB0aGUgY2FsbGJhY2sgdG8gaGFuZGxlIHJhdyBmcmFtZSBkYXRhIGZyb20gdGhlIHN0aWxsIGNhbWVyYS4KKyAgICAvLyBDcmVhdGVzIGEgY29weSBvZiB0aGUgZnJhbWUgZGF0YSBhcyB0aGUgY2FtZXJhIGNhbiByZXVzZSB0aGUgZnJhbWUgbWVtb3J5CisgICAgLy8gb25jZSB0aGlzIGNhbGxiYWNrIHJldHVybnMuIFRoZSBmdW5jdGlvbiBhbHNvIHNldHMgYSBuZXcgdGltc3RhbXAgY29ycmVzcG9uZGluZworICAgIC8vIHRvIG9uZSBmcmFtZSB0aW1lIGFoZWFkIG9mIHRoZSBsYXN0IGVuY29kZWQgZnJhbWUncyB0aW1lIHN0YW1wLiBJdCB0aGVuCisgICAgLy8gY2FsbHMgZGF0YUNhbGxiYWNrVGltZXN0YW1wKCkgb2YgdGhlIGJhc2UgY2xhc3Mgd2l0aCB0aGUgY29waWVkIGRhdGEgYW5kIHRoZQorICAgIC8vIG1vZGlmaWVkIHRpbWVzdGFtcCwgd2hpY2ggd2lsbCB0aGluayB0aGF0IGl0IHJlY2lldmVkIHRoZSBmcmFtZSBmcm9tIGEgdmlkZW8KKyAgICAvLyBjYW1lcmEgYW5kIHByb2NlZWQgYXMgdXN1YWwuCisgICAgdmlydHVhbCB2b2lkIGRhdGFDYWxsYmFjayhpbnQzMl90IG1zZ1R5cGUsIGNvbnN0IHNwPElNZW1vcnk+ICZkYXRhKTsKKworICAgIC8vIEluIHRoZSB2aWRlbyBjYW1lcmEgY2FzZSBjYWxscyBza2lwRnJhbWVBbmRNb2RpZnlUaW1lU3RhbXAoKSB0byBtb2RpZnkKKyAgICAvLyB0aW1lc3RhbXAgYW5kIHNldCBtU2tpcEN1cnJlbnRGcmFtZS4KKyAgICAvLyBUaGVuIGl0IGNhbGxzIHRoZSBiYXNlIENhbWVyYVNvdXJjZTo6ZGF0YUNhbGxiYWNrVGltZXN0YW1wKCkKKyAgICB2aXJ0dWFsIHZvaWQgZGF0YUNhbGxiYWNrVGltZXN0YW1wKGludDY0X3QgdGltZXN0YW1wVXMsIGludDMyX3QgbXNnVHlwZSwKKyAgICAgICAgICAgIGNvbnN0IHNwPElNZW1vcnk+ICZkYXRhKTsKKworICAgIC8vIElmIHRoZSBwYXNzZWQgaW4gc2l6ZSAod2lkdGggeCBoZWlnaHQpIGlzIGEgc3VwcG9ydGVkIHByZXZpZXcgc2l6ZSwKKyAgICAvLyB0aGUgZnVuY3Rpb24gc2V0cyB0aGUgY2FtZXJhJ3MgcHJldmlldyBzaXplIHRvIGl0IGFuZCByZXR1cm5zIHRydWUuCisgICAgLy8gT3RoZXJ3aXNlIHJldHVybnMgZmFsc2UuCisgICAgYm9vbCB0cnlTZXR0aW5nUHJldmlld1NpemUoaW50MzJfdCB3aWR0aCwgaW50MzJfdCBoZWlnaHQpOworCisgICAgLy8gVGhlIHN0aWxsIGNhbWVyYSBtYXkgbm90IHN1cHBvcnQgdGhlIGRlbWFuZGVkIHZpZGVvIHdpZHRoIGFuZCBoZWlnaHQuCisgICAgLy8gV2UgbG9vayBmb3IgdGhlIHN1cHBvcnRlZCBwaWN0dXJlIHNpemVzIGZyb20gdGhlIHN0aWxsIGNhbWVyYSBhbmQKKyAgICAvLyBjaG9vc2UgdGhlIHNtYWxsZXN0IG9uZSB3aXRoIGVpdGhlciBkaW1lbnNpb25zIGhpZ2hlciB0aGFuIHRoZSBjb3JyZXNwb25kaW5nCisgICAgLy8gdmlkZW8gZGltZW5zaW9ucy4gVGhlIHN0aWxsIHBpY3R1cmUgd2lsbCBiZSBjcm9wcGVkIHRvIGdldCB0aGUgdmlkZW8gZnJhbWUuCisgICAgLy8gVGhlIGZ1bmN0aW9uIHJldHVybnMgdHJ1ZSBpZiB0aGUgY2FtZXJhIHN1cHBvcnRzIHBpY3R1cmUgc2l6ZXMgZ3JlYXRlciB0aGFuCisgICAgLy8gb3IgZXF1YWwgdG8gdGhlIHBhc3NlZCBpbiB3aWR0aCBhbmQgaGVpZ2h0LCBhbmQgZmFsc2Ugb3RoZXJ3aXNlLgorICAgIGJvb2wgc2V0UGljdHVyZVNpemVUb0Nsb3Nlc3RTdXBwb3J0ZWQoaW50MzJfdCB3aWR0aCwgaW50MzJfdCBoZWlnaHQpOworCisgICAgLy8gQ29tcHV0ZXMgdGhlIG9mZnNldCBvZiB0aGUgcmVjdGFuZ2xlIGZyb20gd2hlcmUgdG8gc3RhcnQgY3JvcHBpbmcgdGhlCisgICAgLy8gc3RpbGwgaW1hZ2UgaW50byB0aGUgdmlkZW8gZnJhbWUuIFdlIGNob29zZSB0aGUgY2VudGVyIG9mIHRoZSBpbWFnZSB0byBiZQorICAgIC8vIGNyb3BwZWQuIFRoZSBvZmZzZXQgaXMgc3RvcmVkIGluIChtQ3JvcFJlY3RTdGFydFgsIG1Dcm9wUmVjdFN0YXJ0WSkuCisgICAgYm9vbCBjb21wdXRlQ3JvcFJlY3RhbmdsZU9mZnNldCgpOworCisgICAgLy8gQ3JvcHMgdGhlIHNvdXJjZSBkYXRhIGludG8gYSBzbWFsbGVyIGltYWdlIHN0YXJ0aW5nIGF0CisgICAgLy8gKG1Dcm9wUmVjdFN0YXJ0WCwgbUNyb3BSZWN0U3RhcnRZKSBhbmQgb2YgdGhlIHNpemUgb2YgdGhlIHZpZGVvIGZyYW1lLgorICAgIC8vIFRoZSBkYXRhIGlzIHJldHVybmVkIGludG8gYSBuZXdseSBhbGxvY2F0ZWQgSU1lbW9yeS4KKyAgICBzcDxJTWVtb3J5PiBjcm9wWVVWSW1hZ2UoY29uc3Qgc3A8SU1lbW9yeT4gJnNvdXJjZV9kYXRhKTsKKworICAgIC8vIFdoZW4gdmlkZW8gY2FtZXJhIGlzIHVzZWQgZm9yIHRpbWUgbGFwc2UgY2FwdHVyZSwgcmV0dXJucyB0cnVlCisgICAgLy8gdW50aWwgZW5vdWdoIHRpbWUgaGFzIHBhc3NlZCBmb3IgdGhlIG5leHQgdGltZSBsYXBzZSBmcmFtZS4gV2hlbgorICAgIC8vIHRoZSBmcmFtZSBuZWVkcyB0byBiZSBlbmNvZGVkLCBpdCByZXR1cm5zIGZhbHNlIGFuZCBhbHNvIG1vZGlmaWVzCisgICAgLy8gdGhlIHRpbWUgc3RhbXAgdG8gYmUgb25lIGZyYW1lIHRpbWUgYWhlYWQgb2YgdGhlIGxhc3QgZW5jb2RlZAorICAgIC8vIGZyYW1lJ3MgdGltZSBzdGFtcC4KKyAgICBib29sIHNraXBGcmFtZUFuZE1vZGlmeVRpbWVTdGFtcChpbnQ2NF90ICp0aW1lc3RhbXBVcyk7CisKKyAgICAvLyBXcmFwcGVyIHRvIGVudGVyIHRocmVhZFRpbWVMYXBzZUVudHJ5KCkKKyAgICBzdGF0aWMgdm9pZCAqVGhyZWFkVGltZUxhcHNlV3JhcHBlcih2b2lkICptZSk7CisKKyAgICAvLyBSdW5zIGEgbG9vcCB3aGljaCBzbGVlcHMgdW50aWwgYSBzdGlsbCBwaWN0dXJlIGlzIHJlcXVpcmVkCisgICAgLy8gYW5kIHRoZW4gY2FsbHMgbUNhbWVyYS0+dGFrZVBpY3R1cmUoKSB0byB0YWtlIHRoZSBzdGlsbCBwaWN0dXJlLgorICAgIC8vIFVzZWQgb25seSBpbiB0aGUgY2FzZSBtVXNlU3RpbGxDYW1lcmFGb3JUaW1lTGFwc2UgPSB0cnVlLgorICAgIHZvaWQgdGhyZWFkVGltZUxhcHNlRW50cnkoKTsKKworICAgIC8vIFdyYXBwZXIgdG8gZW50ZXIgdGhyZWFkU3RhcnRQcmV2aWV3KCkKKyAgICBzdGF0aWMgdm9pZCAqVGhyZWFkU3RhcnRQcmV2aWV3V3JhcHBlcih2b2lkICptZSk7CisKKyAgICAvLyBTdGFydHMgdGhlIGNhbWVyYSdzIHByZXZpZXcuCisgICAgdm9pZCB0aHJlYWRTdGFydFByZXZpZXcoKTsKKworICAgIC8vIFN0YXJ0cyB0aHJlYWQgVGhyZWFkU3RhcnRQcmV2aWV3V3JhcHBlcigpIGZvciByZXN0YXJ0aW5nIHByZXZpZXcuCisgICAgLy8gTmVlZHMgdG8gYmUgZG9uZSBpbiBhIHRocmVhZCBzbyB0aGF0IGRhdGFDYWxsYmFjaygpIHdoaWNoIGNhbGxzIHRoaXMgZnVuY3Rpb24KKyAgICAvLyBjYW4gcmV0dXJuLCBhbmQgdGhlIGNhbWVyYSBjYW4ga25vdyB0aGF0IHRha2VQaWN0dXJlKCkgaXMgZG9uZS4KKyAgICB2b2lkIHJlc3RhcnRQcmV2aWV3KCk7CisKKyAgICAvLyBDcmVhdGVzIGEgY29weSBvZiBzb3VyY2VfZGF0YSBpbnRvIGEgbmV3IG1lbW9yeSBvZiBmaW5hbCB0eXBlIE1lbW9yeUJhc2UuCisgICAgc3A8SU1lbW9yeT4gY3JlYXRlSU1lbW9yeUNvcHkoY29uc3Qgc3A8SU1lbW9yeT4gJnNvdXJjZV9kYXRhKTsKKworICAgIENhbWVyYVNvdXJjZVRpbWVMYXBzZShjb25zdCBDYW1lcmFTb3VyY2VUaW1lTGFwc2UgJik7CisgICAgQ2FtZXJhU291cmNlVGltZUxhcHNlICZvcGVyYXRvcj0oY29uc3QgQ2FtZXJhU291cmNlVGltZUxhcHNlICYpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBDQU1FUkFfU09VUkNFX1RJTUVfTEFQU0VfSF8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvSGFyZHdhcmVBUEkuaCBiL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvSGFyZHdhcmVBUEkuaAppbmRleCAyMjFjNjc5Li40ZGVkNWU4IDEwMDY0NAotLS0gYS9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0hhcmR3YXJlQVBJLmgKKysrIGIvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9IYXJkd2FyZUFQSS5oCkBAIC0yMSwxMCArMjEsNjAgQEAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9PTVhQbHVnaW5CYXNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvVmlkZW9SZW5kZXJlci5oPgogI2luY2x1ZGUgPHN1cmZhY2VmbGluZ2VyL0lTdXJmYWNlLmg+CisjaW5jbHVkZSA8dWkvYW5kcm9pZF9uYXRpdmVfYnVmZmVyLmg+CiAjaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgogCiAjaW5jbHVkZSA8T01YX0NvbXBvbmVudC5oPgogCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKy8vIEEgcG9pbnRlciB0byB0aGlzIHN0cnVjdCBpcyBwYXNzZWQgdG8gdGhlIE9NWF9TZXRQYXJhbWV0ZXIgd2hlbiB0aGUgZXh0ZW5zaW9uCisvLyBpbmRleCBmb3IgdGhlICdPTVguZ29vZ2xlLmFuZHJvaWQuaW5kZXguZW5hYmxlQW5kcm9pZE5hdGl2ZUJ1ZmZlcnMnIGV4dGVuc2lvbgorLy8gaXMgZ2l2ZW4uCisvLworLy8gV2hlbiBBbmRyb2lkIG5hdGl2ZSBidWZmZXIgdXNlIGlzIGRpc2FibGVkIGZvciBhIHBvcnQgKHRoZSBkZWZhdWx0IHN0YXRlKSwKKy8vIHRoZSBPTVggbm9kZSBzaG91bGQgb3BlcmF0ZSBhcyBub3JtYWwsIGFuZCBleHBlY3QgVXNlQnVmZmVyIGNhbGxzIHRvIHNldCBpdHMKKy8vIGJ1ZmZlcnMuICBUaGlzIGlzIHRoZSBtb2RlIHRoYXQgd2lsbCBiZSB1c2VkIHdoZW4gQ1BVIGFjY2VzcyB0byB0aGUgYnVmZmVyIGlzCisvLyByZXF1aXJlZC4KKy8vCisvLyBXaGVuIEFuZHJvaWQgbmF0aXZlIGJ1ZmZlciB1c2UgaGFzIGJlZW4gZW5hYmxlZCwgdGhlIE9NWCBub2RlIG11c3Qgc3VwcG9ydAorLy8gb25seSBjb2xvciBmb3JtYXRzIGluIHRoZSByYW5nZSBbT01YX0NPTE9SX0Zvcm1hdEFuZHJvaWRQcml2YXRlU3RhcnQsCisvLyBPTVhfQ09MT1JfRm9ybWF0QW5kcm9pZFByaXZhdGVFbmQpLiAgVGhlIG5vZGUgc2hvdWxkIHRoZW4gZXhwZWN0IHRvIHJlY2VpdmUKKy8vIFVzZUFuZHJvaWROYXRpdmVCdWZmZXIgY2FsbHMgKHZpYSBPTVhfU2V0UGFyYW1ldGVyKSByYXRoZXIgdGhhbiBVc2VCdWZmZXIKKy8vIGNhbGxzLgorc3RydWN0IEVuYWJsZUFuZHJvaWROYXRpdmVCdWZmZXJzUGFyYW1zIHsKKyAgICBPTVhfVTMyIG5TaXplOworICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsKKyAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7CisgICAgT01YX0JPT0wgZW5hYmxlOworfTsKKworLy8gQ29sb3IgZm9ybWF0cyBpbiB0aGUgcmFuZ2UgW09NWF9DT0xPUl9Gb3JtYXRBbmRyb2lkUHJpdmF0ZVN0YXJ0LAorLy8gT01YX0NPTE9SX0Zvcm1hdEFuZHJvaWRQcml2YXRlRW5kKSB3aWxsIGJlIGNvbnZlcnRlZCB0byBhIGdyYWxsb2MgcGl4ZWwKKy8vIGZvcm1hdCB3aGVuIHVzZWQgdG8gYWxsb2NhdGUgQW5kcm9pZCBuYXRpdmUgYnVmZmVycyB2aWEgZ3JhbGxvYy4gIFRoZQorLy8gY29udmVyc2lvbiBpcyBkb25lIGJ5IHN1YnRyYWN0aW5nIE9NWF9DT0xPUl9Gb3JtYXRBbmRyb2lkUHJpdmF0ZVN0YXJ0IGZyb20KKy8vIHRoZSBjb2xvciBmb3JtYXQgcmVwb3J0ZWQgYnkgdGhlIGNvZGVjLgorZW51bSB7CisgICAgT01YX0NPTE9SX0Zvcm1hdEFuZHJvaWRQcml2YXRlU3RhcnQgPSAweEEwMDAwMDAwLAorICAgIE9NWF9DT0xPUl9Gb3JtYXRBbmRyb2lkUHJpdmF0ZUVuZCA9IDB4QjAwMDAwMDAsCit9OworCisvLyBBIHBvaW50ZXIgdG8gdGhpcyBzdHJ1Y3QgaXMgcGFzc2VkIHRvIE9NWF9TZXRQYXJhbWV0ZXIgd2hlbiB0aGUgZXh0ZW5zaW9uCisvLyBpbmRleCBmb3IgdGhlICdPTVguZ29vZ2xlLmFuZHJvaWQuaW5kZXgudXNlQW5kcm9pZE5hdGl2ZUJ1ZmZlcicgZXh0ZW5zaW9uIGlzCisvLyBnaXZlbi4gIFRoaXMgY2FsbCB3aWxsIG9ubHkgYmUgcGVyZm9ybWVkIGlmIGEgcHJpb3IgY2FsbCB3YXMgbWFkZSB3aXRoIHRoZQorLy8gJ09NWC5nb29nbGUuYW5kcm9pZC5pbmRleC5lbmFibGVBbmRyb2lkTmF0aXZlQnVmZmVycycgZXh0ZW5zaW9uIGluZGV4LAorLy8gZW5hYmxpbmcgdXNlIG9mIEFuZHJvaWQgbmF0aXZlIGJ1ZmZlcnMuCitzdHJ1Y3QgVXNlQW5kcm9pZE5hdGl2ZUJ1ZmZlclBhcmFtcyB7CisgICAgT01YX1UzMiBuU2l6ZTsKKyAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247CisgICAgT01YX1UzMiBuUG9ydEluZGV4OworICAgIE9NWF9QVFIgcEFwcFByaXZhdGU7CisgICAgT01YX0JVRkZFUkhFQURFUlRZUEUgKipidWZmZXJIZWFkZXI7CisgICAgY29uc3Qgc3A8YW5kcm9pZF9uYXRpdmVfYnVmZmVyX3Q+JiBuYXRpdmVCdWZmZXI7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCiBleHRlcm4gYW5kcm9pZDo6VmlkZW9SZW5kZXJlciAqY3JlYXRlUmVuZGVyZXIoCiAgICAgICAgIGNvbnN0IGFuZHJvaWQ6OnNwPGFuZHJvaWQ6OklTdXJmYWNlPiAmc3VyZmFjZSwKICAgICAgICAgY29uc3QgY2hhciAqY29tcG9uZW50TmFtZSwKQEAgLTM1LDQgKzg1LDMgQEAKIGV4dGVybiBhbmRyb2lkOjpPTVhQbHVnaW5CYXNlICpjcmVhdGVPTVhQbHVnaW4oKTsKIAogI2VuZGlmICAvLyBIQVJEV0FSRV9BUElfSF8KLQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYVNvdXJjZVNwbGl0dGVyLmggYi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhU291cmNlU3BsaXR0ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NjhmNGMyCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYVNvdXJjZVNwbGl0dGVyLmgKQEAgLTAsMCArMSwxOTMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyBUaGlzIGNsYXNzIHByb3ZpZGVzIGEgd2F5IHRvIHNwbGl0IGEgc2luZ2xlIG1lZGlhIHNvdXJjZSBpbnRvIG11bHRpcGxlIHNvdXJjZXMuCisvLyBUaGUgY29uc3RydWN0b3IgdGFrZXMgaW4gdGhlIHJlYWwgbWVkaWFTb3VyY2UgYW5kIGNyZWF0ZUNsaWVudCgpIGNhbiB0aGVuIGJlCisvLyB1c2VkIHRvIGNyZWF0ZSBtdWx0aXBsZSBzb3VyY2VzIHNlcnZlZCBmcm9tIHRoaXMgcmVhbCBtZWRpYVNvdXJjZS4KKy8vCisvLyBVc2FnZToKKy8vIC0gQ3JlYXRlIE1lZGlhU291cmNlU3BsaXR0ZXIgYnkgcGFzc2luZyBpbiBhIHJlYWwgbWVkaWFTb3VyY2UgZnJvbSB3aGljaAorLy8gbXVsdGlwbGUgZHVwbGljYXRlIGNoYW5uZWxzIGFyZSBuZWVkZWQuCisvLyAtIENyZWF0ZSBhIGNsaWVudCB1c2luZyBjcmVhdGVDbGllbnQoKSBhbmQgdXNlIGl0IGFzIGFueSBvdGhlciBtZWRpYVNvdXJjZS4KKy8vCisvLyBOb3RlIHRoYXQgbXVsdGlwbGUgY2xpZW50cyBjYW4gYmUgY3JlYXRlZCB1c2luZyBjcmVhdGVDbGllbnQoKSBhbmQKKy8vIHN0YXJ0ZWQvc3RvcHBlZCBpbiBhbnkgb3JkZXIuIE1lZGlhU291cmNlU3BsaXR0ZXIgc3RvcHMgdGhlIHJlYWwgc291cmNlIG9ubHkKKy8vIHdoZW4gYWxsIGNsaWVudHMgaGF2ZSBiZWVuIHN0b3BwZWQuCisvLworLy8gSWYgYSBuZXcgY2xpZW50IGlzIGNyZWF0ZWQvc3RhcnRlZCBhZnRlciBzb21lIGV4aXN0aW5nIGNsaWVudHMgaGF2ZSBhbHJlYWR5CisvLyBzdGFydGVkLCB0aGUgbmV3IGNsaWVudCB3aWxsIHN0YXJ0IGdldHRpbmcgaXRzIHJlYWQgZnJhbWVzIGZyb20gdGhlIGN1cnJlbnQKKy8vIHRpbWUuCisKKyNpZm5kZWYgTUVESUFfU09VUkNFX1NQTElUVEVSX0hfCisKKyNkZWZpbmUgTUVESUFfU09VUkNFX1NQTElUVEVSX0hfCisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYVNvdXJjZS5oPgorI2luY2x1ZGUgPHV0aWxzL3RocmVhZHMuaD4KKyNpbmNsdWRlIDx1dGlscy9WZWN0b3IuaD4KKyNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY2xhc3MgTWVkaWFCdWZmZXI7CitjbGFzcyBNZXRhRGF0YTsKKworY2xhc3MgTWVkaWFTb3VyY2VTcGxpdHRlciA6IHB1YmxpYyBSZWZCYXNlIHsKK3B1YmxpYzoKKyAgICAvLyBDb25zdHJ1Y3RvcgorICAgIC8vIG1lZGlhU291cmNlOiBUaGUgcmVhbCBtZWRpYVNvdXJjZS4gVGhlIGNsYXNzIGtlZXBzIGEgcmVmZXJlbmNlIHRvIGl0IHRvCisgICAgLy8gaW1wbGVtZW50IHRoZSB2YXJpb3VzIGNsaWVudHMuCisgICAgTWVkaWFTb3VyY2VTcGxpdHRlcihzcDxNZWRpYVNvdXJjZT4gbWVkaWFTb3VyY2UpOworCisgICAgfk1lZGlhU291cmNlU3BsaXR0ZXIoKTsKKworICAgIC8vIENyZWF0ZXMgYSBuZXcgY2xpZW50IG9mIGJhc2UgdHlwZSBNZWRpYVNvdXJjZS4gTXVsdGlwbGUgY2xpZW50cyBjYW4gYmUKKyAgICAvLyBjcmVhdGVkIHdoaWNoIGdldCB0aGVpciBkYXRhIHRocm91Z2ggdGhlIHNhbWUgcmVhbCBtZWRpYVNvdXJjZS4gVGhlc2UKKyAgICAvLyBjbGllbnRzIGNhbiB0aGVuIGJlIHVzZWQgbGlrZSBhbnkgb3RoZXIgTWVkaWFTb3VyY2UsIGFsbCBvZiB3aGljaCBwcm92aWRlCisgICAgLy8gZGF0YSBmcm9tIHRoZSBzYW1lIHJlYWwgc291cmNlLgorICAgIHNwPE1lZGlhU291cmNlPiBjcmVhdGVDbGllbnQoKTsKKworcHJpdmF0ZToKKyAgICAvLyBUb3RhbCBudW1iZXIgb2YgY2xpZW50cyBjcmVhdGVkIHRocm91Z2ggY3JlYXRlQ2xpZW50KCkuCisgICAgaW50MzJfdCBtTnVtYmVyT2ZDbGllbnRzOworCisgICAgLy8gcmVmZXJlbmNlIHRvIHRoZSByZWFsIE1lZGlhU291cmNlIHBhc3NlZCB0byB0aGUgY29uc3RydWN0b3IuCisgICAgc3A8TWVkaWFTb3VyY2U+IG1Tb3VyY2U7CisKKyAgICAvLyBTdG9yZXMgcG9pbnRlciB0byB0aGUgTWVkaWFCdWZmZXIgcmVhZCBmcm9tIHRoZSByZWFsIE1lZGlhU291cmNlLgorICAgIC8vIEFsbCBjbGllbnRzIHVzZSB0aGlzIHRvIGltcGxlbWVudCB0aGUgcmVhZCgpIGNhbGwuCisgICAgTWVkaWFCdWZmZXIgKm1MYXN0UmVhZE1lZGlhQnVmZmVyOworCisgICAgLy8gU3RhdHVzIGNvZGUgZm9yIHJlYWQgZnJvbSB0aGUgcmVhbCBNZWRpYVNvdXJjZS4gQWxsIGNsaWVudHMgcmV0dXJuCisgICAgLy8gdGhpcyBmb3IgdGhlaXIgcmVhZCgpLgorICAgIHN0YXR1c190IG1MYXN0UmVhZFN0YXR1czsKKworICAgIC8vIEJvb2xlYW4gdGVsbGluZyB3aGV0aGVyIHRoZSByZWFsIE1lZGlhU291cmNlIGhhcyBzdGFydGVkLgorICAgIGJvb2wgbVNvdXJjZVN0YXJ0ZWQ7CisKKyAgICAvLyBMaXN0IG9mIGJvb2xlYW5zLCBvbmUgZm9yIGVhY2ggY2xpZW50LCBzdG9yaW5nIHdoZXRoZXIgdGhlIGNvcnJlc3BvbmRpbmcKKyAgICAvLyBjbGllbnQncyBzdGFydCgpIGhhcyBiZWVuIGNhbGxlZC4KKyAgICBWZWN0b3I8Ym9vbD4gbUNsaWVudHNTdGFydGVkOworCisgICAgLy8gU3RvcmVzIHRoZSBudW1iZXIgb2YgY2xpZW50cyB3aGljaCBhcmUgY3VycmVudGx5IHN0YXJ0ZWQuCisgICAgaW50MzJfdCBtTnVtYmVyT2ZDbGllbnRzU3RhcnRlZDsKKworICAgIC8vIFNpbmNlIGRpZmZlcmVudCBjbGllbnRzIGNhbGwgcmVhZCgpIGFzeW5jaHJvbm91c2x5LCB3ZSBuZWVkIHRvIGtlZXAgdHJhY2sKKyAgICAvLyBvZiB3aGF0IGRhdGEgaXMgY3VycmVudGx5IHJlYWQgaW50byB0aGUgbUxhc3RSZWFkTWVkaWFCdWZmZXIuCisgICAgLy8gbUN1cnJlbnRSZWFkQml0IHN0b3JlcyB0aGUgYml0IGZvciB0aGUgY3VycmVudCByZWFkIGJ1ZmZlci4gVGhpcyBiaXQKKyAgICAvLyBmbGlwcyBlYWNoIHRpbWUgYSBuZXcgYnVmZmVyIGlzIHJlYWQgZnJvbSB0aGUgc291cmNlLgorICAgIC8vIG1DbGllbnRzRGVzaXJlZFJlYWRCaXQgc3RvcmVzIHRoZSBiaXQgZm9yIHRoZSBuZXh0IGRlc2lyZWQgcmVhZCBidWZmZXIKKyAgICAvLyBmb3IgZWFjaCBjbGllbnQuIFRoaXMgYml0IGZsaXBzIGVhY2ggdGltZSByZWFkKCkgaXMgY29tcGxldGVkIGZvciB0aGlzCisgICAgLy8gY2xpZW50LgorICAgIGJvb2wgbUN1cnJlbnRSZWFkQml0OworICAgIFZlY3Rvcjxib29sPiBtQ2xpZW50c0Rlc2lyZWRSZWFkQml0OworCisgICAgLy8gTnVtYmVyIG9mIGNsaWVudHMgd2hvc2UgY3VycmVudCByZWFkIGhhcyBiZWVuIGNvbXBsZXRlZC4KKyAgICBpbnQzMl90IG1OdW1iZXJPZkN1cnJlbnRSZWFkczsKKworICAgIC8vIEJvb2xlYW4gdGVsbGluZyB3aGV0aGVyIHRoZSBsYXN0IHJlYWQgaGFzIGJlZW4gY29tcGxldGVkIGZvciBhbGwgY2xpZW50cy4KKyAgICAvLyBUaGUgdmFyaWFibGUgaXMgcmVzZXQgdG8gZmFsc2UgZWFjaCB0aW1lIGJ1ZmZlciBpcyByZWFkIGZyb20gdGhlIHJlYWwKKyAgICAvLyBzb3VyY2UuCisgICAgYm9vbCBtTGFzdFJlYWRDb21wbGV0ZWQ7CisKKyAgICAvLyBBIGdsb2JhbCBtdXRleCBmb3IgYWNjZXNzIHRvIGNyaXRpY2FsIHNlY3Rpb25zLgorICAgIE11dGV4IG1Mb2NrOworCisgICAgLy8gQ29uZGl0aW9uIHZhcmlhYmxlIGZvciB3YWl0aW5nIG9uIHJlYWQgZnJvbSBzb3VyY2UgdG8gY29tcGxldGUuCisgICAgQ29uZGl0aW9uIG1SZWFkRnJvbVNvdXJjZUNvbmRpdGlvbjsKKworICAgIC8vIENvbmRpdGlvbiB2YXJpYWJsZSBmb3Igd2FpdGluZyBvbiBhbGwgY2xpZW50J3MgbGFzdCByZWFkIHRvIGNvbXBsZXRlLgorICAgIENvbmRpdGlvbiBtQWxsUmVhZHNDb21wbGV0ZUNvbmRpdGlvbjsKKworICAgIC8vIEZ1bmN0aW9ucyB1c2VkIGJ5IENsaWVudCB0byBpbXBsZW1lbnQgdGhlIE1lZGlhU291cmNlIGludGVyZmFjZS4KKworICAgIC8vIElmIHRoZSByZWFsIHNvdXJjZSBoYXMgbm90IGJlZW4gc3RhcnRlZCB5ZXQgYnkgYW55IGNsaWVudCwgc3RhcnRzIGl0LgorICAgIHN0YXR1c190IHN0YXJ0KGludCBjbGllbnRJZCwgTWV0YURhdGEgKnBhcmFtcyk7CisKKyAgICAvLyBTdG9wcyB0aGUgcmVhbCBzb3VyY2UgYWZ0ZXIgYWxsIGNsaWVudHMgaGF2ZSBjYWxsZWQgc3RvcCgpLgorICAgIHN0YXR1c190IHN0b3AoaW50IGNsaWVudElkKTsKKworICAgIC8vIHJldHVybnMgdGhlIHJlYWwgc291cmNlJ3MgZ2V0Rm9ybWF0KCkuCisgICAgc3A8TWV0YURhdGE+IGdldEZvcm1hdChpbnQgY2xpZW50SWQpOworCisgICAgLy8gSWYgdGhlIGNsaWVudCdzIGRlc2lyZWQgYnVmZmVyIGhhcyBhbHJlYWR5IGJlZW4gcmVhZCBpbnRvCisgICAgLy8gbUxhc3RSZWFkTWVkaWFCdWZmZXIsIHBvaW50cyB0aGUgYnVmZmVyIHRvIHRoYXQuIE90aGVyd2lzZSBpZiBpdCBpcyB0aGUKKyAgICAvLyBtYXN0ZXIgY2xpZW50LCByZWFkcyB0aGUgYnVmZmVyIGZyb20gc291cmNlIG9yIGVsc2Ugd2FpdHMgZm9yIHRoZSBtYXN0ZXIKKyAgICAvLyBjbGllbnQgdG8gcmVhZCB0aGUgYnVmZmVyIGFuZCB1c2VzIHRoYXQuCisgICAgc3RhdHVzX3QgcmVhZChpbnQgY2xpZW50SWQsCisgICAgICAgICAgICBNZWRpYUJ1ZmZlciAqKmJ1ZmZlciwgY29uc3QgTWVkaWFTb3VyY2U6OlJlYWRPcHRpb25zICpvcHRpb25zID0gTlVMTCk7CisKKyAgICAvLyBOb3QgaW1wbGVtZW50ZWQgcmlnaHQgbm93LgorICAgIHN0YXR1c190IHBhdXNlKGludCBjbGllbnRJZCk7CisKKyAgICAvLyBGdW5jdGlvbiB3aGljaCByZWFkcyBhIGJ1ZmZlciBmcm9tIHRoZSByZWFsIHNvdXJjZSBpbnRvCisgICAgLy8gbUxhc3RSZWFkTWVkaWFCdWZmZXIKKyAgICB2b2lkIHJlYWRGcm9tU291cmNlX2xvY2soY29uc3QgTWVkaWFTb3VyY2U6OlJlYWRPcHRpb25zICpvcHRpb25zKTsKKworICAgIC8vIFdhaXRzIHVudGlsIHJlYWQgZnJvbSB0aGUgcmVhbCBzb3VyY2UgaGFzIGJlZW4gY29tcGxldGVkLgorICAgIC8vIF9sb2NrIG1lYW5zIHRoYXQgdGhlIGZ1bmN0aW9uIHNob3VsZCBiZSBjYWxsZWQgd2hlbiB0aGUgdGhyZWFkIGhhcyBhbHJlYWR5CisgICAgLy8gb2J0YWluZWQgdGhlIGxvY2sgZm9yIHRoZSBtdXRleCBtTG9jay4KKyAgICB2b2lkIHdhaXRGb3JSZWFkRnJvbVNvdXJjZV9sb2NrKGludDMyX3QgY2xpZW50SWQpOworCisgICAgLy8gV2FpdHMgdW50aWwgYWxsIGNsaWVudHMgaGF2ZSByZWFkIHRoZSBjdXJyZW50IGJ1ZmZlciBpbgorICAgIC8vIG1MYXN0UmVhZENvbXBsZXRlZC4KKyAgICB2b2lkIHdhaXRGb3JBbGxDbGllbnRzTGFzdFJlYWRfbG9jayhpbnQzMl90IGNsaWVudElkKTsKKworICAgIC8vIEVhY2ggY2xpZW50IGNhbGxzIHRoaXMgYWZ0ZXIgaXQgY29tcGxldGVzIGl0cyByZWFkKCkuIE9uY2UgYWxsIGNsaWVudHMKKyAgICAvLyBoYXZlIGNhbGxlZCB0aGlzIGZvciB0aGUgY3VycmVudCBidWZmZXIsIHRoZSBmdW5jdGlvbiBjYWxscworICAgIC8vIG1BbGxSZWFkc0NvbXBsZXRlQ29uZGl0aW9uLmJyb2FkY2FzdCgpIHRvIHNpZ25hbCB0aGUgd2FpdGluZyBjbGllbnRzLgorICAgIHZvaWQgc2lnbmFsUmVhZENvbXBsZXRlX2xvY2soYm9vbCByZWFkQWJvcnRlZCk7CisKKyAgICAvLyBNYWtlIHRoZXNlIGNvbnN0cnVjdG9ycyBwcml2YXRlLgorICAgIE1lZGlhU291cmNlU3BsaXR0ZXIoKTsKKyAgICBNZWRpYVNvdXJjZVNwbGl0dGVyKGNvbnN0IE1lZGlhU291cmNlU3BsaXR0ZXIgJik7CisgICAgTWVkaWFTb3VyY2VTcGxpdHRlciAmb3BlcmF0b3I9KGNvbnN0IE1lZGlhU291cmNlU3BsaXR0ZXIgJik7CisKKyAgICAvLyBUaGlzIGNsYXNzIGltcGxlbWVudHMgdGhlIE1lZGlhU291cmNlIGludGVyZmFjZS4gRWFjaCBjbGllbnQgc3RvcmVzIGEKKyAgICAvLyByZWZlcmVuY2UgdG8gdGhlIHBhcmVudCBNZWRpYVNvdXJjZVNwbGl0dGVyIGFuZCB1c2VzIGl0IHRvIGNvbXBsZXRlIHRoZQorICAgIC8vIHZhcmlvdXMgY2FsbHMuCisgICAgY2xhc3MgQ2xpZW50IDogcHVibGljIE1lZGlhU291cmNlIHsKKyAgICBwdWJsaWM6CisgICAgICAgIC8vIENvbnN0cnVjdG9yIHN0b3JlcyByZWZlcmVuY2UgdG8gdGhlIHBhcmVudCBNZWRpYVNvdXJjZVNwbGl0dGVyIGFuZCBpdAorICAgICAgICAvLyBjbGllbnQgaWQuCisgICAgICAgIENsaWVudChzcDxNZWRpYVNvdXJjZVNwbGl0dGVyPiBzcGxpdHRlciwgaW50MzJfdCBjbGllbnRJZCk7CisKKyAgICAgICAgLy8gTWVkaWFTb3VyY2UgaW50ZXJmYWNlCisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnQoTWV0YURhdGEgKnBhcmFtcyA9IE5VTEwpOworCisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcCgpOworCisgICAgICAgIHZpcnR1YWwgc3A8TWV0YURhdGE+IGdldEZvcm1hdCgpOworCisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVhZCgKKyAgICAgICAgICAgICAgICBNZWRpYUJ1ZmZlciAqKmJ1ZmZlciwgY29uc3QgUmVhZE9wdGlvbnMgKm9wdGlvbnMgPSBOVUxMKTsKKworICAgICAgICB2aXJ0dWFsIHN0YXR1c190IHBhdXNlKCk7CisKKyAgICBwcml2YXRlOgorICAgICAgICAvLyBSZWZlcm5jZSB0byB0aGUgcGFyZW50IE1lZGlhU291cmNlU3BsaXR0ZXIKKyAgICAgICAgc3A8TWVkaWFTb3VyY2VTcGxpdHRlcj4gbVNwbGl0dGVyOworCisgICAgICAgIC8vIElkIG9mIHRoaXMgY2xpZW50LgorICAgICAgICBpbnQzMl90IG1DbGllbnRJZDsKKyAgICB9OworCisgICAgZnJpZW5kIGNsYXNzIENsaWVudDsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gTUVESUFfU09VUkNFX1NQTElUVEVSX0hfCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L1ZpZGVvU291cmNlRG93blNhbXBsZXIuaCBiL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvVmlkZW9Tb3VyY2VEb3duU2FtcGxlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQzOTkxOGMKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L1ZpZGVvU291cmNlRG93blNhbXBsZXIuaApAQCAtMCwwICsxLDk3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8gVmlkZW9Tb3VyY2VEb3duU2FtcGxlciBpbXBsZW1lbnRzIHRoZSBNZWRpYVNvdXJjZSBpbnRlcmZhY2UsCisvLyBkb3duc2FtcGxpbmcgZnJhbWVzIHByb3ZpZGVkIGZyb20gYSByZWFsIHZpZGVvIHNvdXJjZS4KKworI2lmbmRlZiBWSURFT19TT1VSQ0VfRE9XTl9TQU1QTEVSX0hfCisKKyNkZWZpbmUgVklERU9fU09VUkNFX0RPV05fU0FNUExFUl9IXworCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFTb3VyY2UuaD4KKyNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY2xhc3MgSU1lbW9yeTsKK2NsYXNzIE1lZGlhQnVmZmVyOworY2xhc3MgTWV0YURhdGE7CisKK2NsYXNzIFZpZGVvU291cmNlRG93blNhbXBsZXIgOiBwdWJsaWMgTWVkaWFTb3VyY2UgeworcHVibGljOgorICAgIHZpcnR1YWwgflZpZGVvU291cmNlRG93blNhbXBsZXIoKTsKKworICAgIC8vIENvbnN0cnVjdG9yOgorICAgIC8vIHZpZGVvU291cmNlOiBUaGUgcmVhbCB2aWRlbyBzb3VyY2Ugd2hpY2ggcHJvdmlkZXMgdGhlIG9yaWdpbmFsIGZyYW1lcy4KKyAgICAvLyB3aWR0aCwgaGVpZ2h0OiBUaGUgZGVzaXJlZCB3aWR0aCwgaGVpZ2h0LiBUaGVzZSBzaG91bGQgYmUgbGVzcyB0aGFuIG9yIGVxdWFsCisgICAgLy8gdG8gdGhvc2Ugb2YgdGhlIHJlYWwgdmlkZW8gc291cmNlLiBXZSB0aGVuIGRvd25zYW1wbGUgdGhlIG9yaWdpbmFsIGZyYW1lcyB0bworICAgIC8vIHRoaXMgc2l6ZS4KKyAgICBWaWRlb1NvdXJjZURvd25TYW1wbGVyKGNvbnN0IHNwPE1lZGlhU291cmNlPiAmdmlkZW9Tb3VyY2UsCisgICAgICAgIGludDMyX3Qgd2lkdGgsIGludDMyX3QgaGVpZ2h0KTsKKworICAgIC8vIE1lZGlhU291cmNlIGludGVyZmFjZQorICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnQoTWV0YURhdGEgKnBhcmFtcyA9IE5VTEwpOworCisgICAgdmlydHVhbCBzdGF0dXNfdCBzdG9wKCk7CisKKyAgICB2aXJ0dWFsIHNwPE1ldGFEYXRhPiBnZXRGb3JtYXQoKTsKKworICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVhZCgKKyAgICAgICAgICAgIE1lZGlhQnVmZmVyICoqYnVmZmVyLCBjb25zdCBSZWFkT3B0aW9ucyAqb3B0aW9ucyA9IE5VTEwpOworCisgICAgdmlydHVhbCBzdGF0dXNfdCBwYXVzZSgpOworCitwcml2YXRlOgorICAgIC8vIFJlZmVyZW5jZSB0byB0aGUgcmVhbCB2aWRlbyBzb3VyY2UuCisgICAgc3A8TWVkaWFTb3VyY2U+IG1SZWFsVmlkZW9Tb3VyY2U7CisKKyAgICAvLyBTaXplIG9mIGZyYW1lcyB0byBiZSBwcm92aWRlZCBieSB0aGlzIHNvdXJjZS4KKyAgICBpbnQzMl90IG1XaWR0aDsKKyAgICBpbnQzMl90IG1IZWlnaHQ7CisKKyAgICAvLyBTaXplIG9mIGZyYW1lcyBwcm92aWRlZCBieSB0aGUgcmVhbCBzb3VyY2UuCisgICAgaW50MzJfdCBtUmVhbFNvdXJjZVdpZHRoOworICAgIGludDMyX3QgbVJlYWxTb3VyY2VIZWlnaHQ7CisKKyAgICAvLyBEb3duIHNhbXBsaW5nIHBhcmFtdGVycy4KKyAgICBpbnQzMl90IG1Eb3duU2FtcGxlT2Zmc2V0WDsKKyAgICBpbnQzMl90IG1Eb3duU2FtcGxlT2Zmc2V0WTsKKyAgICBpbnQzMl90IG1Eb3duU2FtcGxlU2tpcFg7CisgICAgaW50MzJfdCBtRG93blNhbXBsZVNraXBZOworCisgICAgLy8gVHJ1ZSBpZiB3ZSBuZWVkIHRvIGNyb3AgdGhlIHN0aWxsIHZpZGVvIGltYWdlIHRvIGdldCB0aGUgdmlkZW8gZnJhbWUuCisgICAgYm9vbCBtTmVlZERvd25TYW1wbGluZzsKKworICAgIC8vIE1ldGEgZGF0YS4gVGhpcyBpcyBhIGNvcHkgb2YgdGhlIHJlYWwgc291cmNlIGV4Y2VwdCBmb3IgdGhlIHdpZHRoIGFuZAorICAgIC8vIGhlaWdodCBwYXJhbWV0ZXJzLgorICAgIHNwPE1ldGFEYXRhPiBtTWV0YTsKKworICAgIC8vIENvbXB1dGVzIHRoZSBvZmZzZXQsIHNraXAgcGFyYW1ldGVycyBmb3IgZG93bnNhbXBsaW5nIHRoZSBvcmlnaW5hbCBmcmFtZQorICAgIC8vIHRvIHRoZSBkZXNpcmVkIHNpemUuCisgICAgdm9pZCBjb21wdXRlRG93blNhbXBsaW5nUGFyYW1ldGVycygpOworCisgICAgLy8gRG93bnNhbXBsZXMgdGhlIGZyYW1lIGluIHNvdXJjZUJ1ZmZlciB0byBzaXplIChtV2lkdGggeCBtSGVpZ2h0KS4gQSBuZXcKKyAgICAvLyBidWZmZXIgaXMgY3JlYXRlZCB3aGljaCBzdG9yZXMgdGhlIGRvd25zYW1wbGVkIGltYWdlLgorICAgIHZvaWQgZG93blNhbXBsZVlVVkltYWdlKGNvbnN0IE1lZGlhQnVmZmVyICZzb3VyY2VCdWZmZXIsIE1lZGlhQnVmZmVyICoqYnVmZmVyKSBjb25zdDsKKworICAgIC8vIERpc2FsbG93IHRoZXNlLgorICAgIFZpZGVvU291cmNlRG93blNhbXBsZXIoY29uc3QgVmlkZW9Tb3VyY2VEb3duU2FtcGxlciAmKTsKKyAgICBWaWRlb1NvdXJjZURvd25TYW1wbGVyICZvcGVyYXRvcj0oY29uc3QgVmlkZW9Tb3VyY2VEb3duU2FtcGxlciAmKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gVklERU9fU09VUkNFX0RPV05fU0FNUExFUl9IXwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9ZVVZDYW52YXMuaCBiL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvWVVWQ2FudmFzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmY3MDkyMwotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvWVVWQ2FudmFzLmgKQEAgLTAsMCArMSw3OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vIFlVVkNhbnZhcyBob2xkcyBhIHJlZmVyZW5jZSB0byBhIFlVVkltYWdlIG9uIHdoaWNoIGl0IGNhbiBkbyB2YXJpb3VzCisvLyBkcmF3aW5nIG9wZXJhdGlvbnMuIEl0IHByb3ZpZGVzIHZhcmlvdXMgdXRpbGl0eSBmdW5jdGlvbnMgZm9yIGZpbGxpbmcsCisvLyBjcm9wcGluZywgZXRjLgorCisKKyNpZm5kZWYgWVVWX0NBTlZBU19IXworCisjZGVmaW5lIFlVVl9DQU5WQVNfSF8KKworI2luY2x1ZGUgPHN0ZGludC5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NsYXNzIFlVVkltYWdlOworY2xhc3MgUmVjdDsKKworY2xhc3MgWVVWQ2FudmFzIHsKK3B1YmxpYzoKKworICAgIC8vIENvbnN0cnVjdG9yIHRha2VzIGluIHJlZmVyZW5jZSB0byBhIHl1dkltYWdlIG9uIHdoaWNoIGl0IGNhbiBkbworICAgIC8vIHZhcmlvdXMgZHJhd2luZyBvcHJlYXRpb25zLgorICAgIFlVVkNhbnZhcyhZVVZJbWFnZSAmeXV2SW1hZ2UpOworICAgIH5ZVVZDYW52YXMoKTsKKworICAgIC8vIEZpbGxzIHRoZSBlbnRpcmUgaW1hZ2Ugd2l0aCB0aGUgZ2l2ZW4gWVVWIHZhbHVlcy4KKyAgICB2b2lkIEZpbGxZVVYodWludDhfdCB5VmFsdWUsIHVpbnQ4X3QgdVZhbHVlLCB1aW50OF90IHZWYWx1ZSk7CisKKyAgICAvLyBGaWxscyB0aGUgcmVjdGFuZ3VsYXIgcmVnaW9uIFtzdGFydFgsZW5kWF14W3N0YXJ0WSxlbmRZXSB3aXRoIHRoZSBnaXZlbiBZVVYgdmFsdWVzLgorICAgIHZvaWQgRmlsbFlVVlJlY3RhbmdsZShjb25zdCBSZWN0JiByZWN0LAorICAgICAgICAgICAgdWludDhfdCB5VmFsdWUsIHVpbnQ4X3QgdVZhbHVlLCB1aW50OF90IHZWYWx1ZSk7CisKKyAgICAvLyBDb3BpZXMgdGhlIHJlZ2lvbiBbc3RhcnRYLGVuZFhdeFtzdGFydFksZW5kWV0gZnJvbSBzcmNJbWFnZSBpbnRvIHRoZQorICAgIC8vIGNhbnZhcycgdGFyZ2V0IGltYWdlIChtWVVWSW1hZ2UpIHN0YXJ0aW5nIGF0CisgICAgLy8gKGRlc3RpbmF0aW9uU3RhcnRYLGRlc3RpbmF0aW9uU3RhcnRZKS4KKyAgICAvLyBOb3RlIHRoYXQgdW5kZWZpbmVkIGJlaGF2aW9yIG1heSBvY2N1ciBpZiBzcmNJbWFnZSBpcyBzYW1lIGFzIHRoZSBjYW52YXMnCisgICAgLy8gdGFyZ2V0IGltYWdlLgorICAgIHZvaWQgQ29weUltYWdlUmVjdCgKKyAgICAgICAgICAgIGNvbnN0IFJlY3QmIHNyY1JlY3QsCisgICAgICAgICAgICBpbnQzMl90IGRlc3RTdGFydFgsIGludDMyX3QgZGVzdFN0YXJ0WSwKKyAgICAgICAgICAgIGNvbnN0IFlVVkltYWdlICZzcmNJbWFnZSk7CisKKyAgICAvLyBEb3duc2FtcGxlcyB0aGUgc3JjSW1hZ2UgaW50byB0aGUgY2FudmFzJyB0YXJnZXQgaW1hZ2UgKG1ZVVZJbWFnZSkKKyAgICAvLyBUaGUgZG93bnNhbXBsaW5nIGNvcGllcyBwaXhlbHMgZnJvbSB0aGUgc291cmNlIGltYWdlIHN0YXJ0aW5nIGF0CisgICAgLy8gKHNyY09mZnNldFgsIHNyY09mZnNldFkpIHRvIHRoZSB0YXJnZXQgaW1hZ2UsIHN0YXJ0aW5nIGF0ICgwLCAwKS4KKyAgICAvLyBGb3IgZWFjaCBYIGluY3JlbWVudCBpbiB0aGUgdGFyZ2V0IGltYWdlLCBza2lwWCBwaXhlbHMgYXJlIHNraXBwZWQKKyAgICAvLyBpbiB0aGUgc291cmNlIGltYWdlLgorICAgIC8vIFNpbWlsYXJseSBmb3IgZWFjaCBZIGluY3JlbWVudCBpbiB0aGUgdGFyZ2V0IGltYWdlLCBza2lwWSBwaXhlbHMKKyAgICAvLyBhcmUgc2tpcHBlZCBpbiB0aGUgc291cmNlIGltYWdlLgorICAgIHZvaWQgZG93bnNhbXBsZSgKKyAgICAgICAgICAgIGludDMyX3Qgc3JjT2Zmc2V0WCwgaW50MzJfdCBzcmNPZmZzZXRZLAorICAgICAgICAgICAgaW50MzJfdCBza2lwWCwgaW50MzJfdCBza2lwWSwKKyAgICAgICAgICAgIGNvbnN0IFlVVkltYWdlICZzcmNJbWFnZSk7CisKK3ByaXZhdGU6CisgICAgWVVWSW1hZ2UmIG1ZVVZJbWFnZTsKKworICAgIFlVVkNhbnZhcyhjb25zdCBZVVZDYW52YXMgJik7CisgICAgWVVWQ2FudmFzICZvcGVyYXRvcj0oY29uc3QgWVVWQ2FudmFzICYpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBZVVZfQ0FOVkFTX0hfCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L1lVVkltYWdlLmggYi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L1lVVkltYWdlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGU5ODYxOAotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvWVVWSW1hZ2UuaApAQCAtMCwwICsxLDE3OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vIEEgY29udGFpbmVyIGNsYXNzIHRvIGhvbGQgWVVWIGRhdGEgYW5kIHByb3ZpZGUgdmFyaW91cyB1dGlsaXRpZXMsCisvLyBlLmcuIHRvIHNldC9nZXQgcGl4ZWwgdmFsdWVzLgorLy8gU3VwcG9ydGVkIGZvcm1hdHM6CisvLyAgLSBZVVY0MjAgUGxhbmFyCisvLyAgLSBZVVY0MjAgU2VtaSBQbGFuYXIKKy8vCisvLyAgQ3VycmVudGx5IGRvZXMgbm90IHN1cHBvcnQgdmFyaWFibGUgc3RyaWRlcy4KKy8vCisvLyAgSW1wbGVtZW50YXRpb246IFR3byBzaW1wbGUgYWJzdHJhY3Rpb25zIGFyZSBkb25lIHRvIHNpbXBsaWZ5IGFjY2VzcworLy8gIHRvIFlVViBjaGFubmVscyBmb3IgZGlmZmVyZW50IGZvcm1hdHM6CisvLyAgLSBpbml0aWFsaXplWVVWUG9pbnRlcnMoKSBzZXRzIHVwIHBvaW50ZXJzIChtWWRhdGEsIG1VZGF0YSwgbVZkYXRhKSB0bworLy8gIHBvaW50IHRvIHRoZSByaWdodCBzdGFydCBsb2NhdGlvbnMgb2YgdGhlIGRpZmZlcmVudCBjaGFubmVsIGRhdGEgZGVwZW5kaW5nCisvLyAgb24gdGhlIGZvcm1hdC4KKy8vICAtIGdldE9mZnNldHMoKSByZXR1cm5zIHRoZSBjb3JyZWN0IG9mZnNldCBmb3IgdGhlIGRpZmZlcmVudCBjaGFubmVscworLy8gIGRlcGVuZGluZyBvbiB0aGUgZm9ybWF0LgorLy8gIExvY2F0aW9uIG9mIGFueSBwaXhlbCdzIFlVViBjaGFubmVscyBjYW4gdGhlbiBiZSBlYXNpbHkgY29tcHV0ZWQgdXNpbmcgdGhlc2UuCisvLworCisjaWZuZGVmIFlVVl9JTUFHRV9IXworCisjZGVmaW5lIFlVVl9JTUFHRV9IXworCisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8Y3N0cmluZz4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjbGFzcyBSZWN0OworCitjbGFzcyBZVVZJbWFnZSB7CitwdWJsaWM6CisgICAgLy8gU3VwcG9ydGVkIFlVViBmb3JtYXRzCisgICAgZW51bSBZVVZGb3JtYXQgeworICAgICAgICBZVVY0MjBQbGFuYXIsCisgICAgICAgIFlVVjQyMFNlbWlQbGFuYXIKKyAgICB9OworCisgICAgLy8gQ29uc3RydWN0cyBhbiBpbWFnZSB3aXRoIHRoZSBnaXZlbiBzaXplLCBmb3JtYXQuIEFsc28gYWxsb2NhdGVzIGFuZCBvd25zCisgICAgLy8gdGhlIHJlcXVpcmVkIG1lbW9yeS4KKyAgICBZVVZJbWFnZShZVVZGb3JtYXQgeXV2Rm9ybWF0LCBpbnQzMl90IHdpZHRoLCBpbnQzMl90IGhlaWdodCk7CisKKyAgICAvLyBDb25zdHJ1Y3RzIGFuIGltYWdlIHdpdGggdGhlIGdpdmVuIHNpemUsIGZvcm1hdC4gVGhlIG1lbW9yeSBpcyBwcm92aWRlZAorICAgIC8vIGJ5IHRoZSBjYWxsZXIgYW5kIHdlIGRvbid0IG93biBpdC4KKyAgICBZVVZJbWFnZShZVVZGb3JtYXQgeXV2Rm9ybWF0LCBpbnQzMl90IHdpZHRoLCBpbnQzMl90IGhlaWdodCwgdWludDhfdCAqYnVmZmVyKTsKKworICAgIC8vIERlc3RydWN0b3IgdG8gZGVsZXRlIHRoZSBtZW1vcnkgaWYgaXQgb3ducyBpdC4KKyAgICB+WVVWSW1hZ2UoKTsKKworICAgIC8vIFJldHVybnMgdGhlIHNpemUgb2YgdGhlIGJ1ZmZlciByZXF1aXJlZCB0byBzdG9yZSB0aGUgWVVWIGRhdGEgZm9yIHRoZSBnaXZlbgorICAgIC8vIGZvcm1hdCBhbmQgZ2VvbWV0cnkuIFVzZWZ1bCB3aGVuIHRoZSBjYWxsZXIgd2FudHMgdG8gYWxsb2NhdGUgdGhlIHJlcXVpc2l0ZQorICAgIC8vIG1lbW9yeS4KKyAgICBzdGF0aWMgc2l6ZV90IGJ1ZmZlclNpemUoWVVWRm9ybWF0IHl1dkZvcm1hdCwgaW50MzJfdCB3aWR0aCwgaW50MzJfdCBoZWlnaHQpOworCisgICAgaW50MzJfdCB3aWR0aCgpIGNvbnN0IHtyZXR1cm4gbVdpZHRoO30KKyAgICBpbnQzMl90IGhlaWdodCgpIGNvbnN0IHtyZXR1cm4gbUhlaWdodDt9CisKKyAgICAvLyBSZXR1cm5zIHRydWUgaWYgcGl4ZWwgaXMgdGhlIHJhbmdlIFswLCB3aWR0aC0xXSB4IFswLCBoZWlnaHQtMV0KKyAgICAvLyBhbmQgZmFsc2Ugb3RoZXJ3aXNlLgorICAgIGJvb2wgdmFsaWRQaXhlbChpbnQzMl90IHgsIGludDMyX3QgeSkgY29uc3Q7CisKKyAgICAvLyBHZXQgdGhlIHBpeGVsIFlVViB2YWx1ZSBhdCBwaXhlbCAoeCx5KS4KKyAgICAvLyBOb3RlIHRoYXQgdGhlIHJhbmdlIG9mIHggaXMgWzAsIHdpZHRoLTFdIGFuZCB0aGUgcmFuZ2Ugb2YgeSBpcyBbMCwgaGVpZ2h0LTFdLgorICAgIC8vIFJldHVybnMgdHJ1ZSBpZiBnZXQgd2FzIHN1Y2Nlc3NmdWwgYW5kIGZhbHNlIG90aGVyd2lzZS4KKyAgICBib29sIGdldFBpeGVsVmFsdWUoaW50MzJfdCB4LCBpbnQzMl90IHksCisgICAgICAgICAgICB1aW50OF90ICp5UHRyLCB1aW50OF90ICp1UHRyLCB1aW50OF90ICp2UHRyKSBjb25zdDsKKworICAgIC8vIFNldCB0aGUgcGl4ZWwgWVVWIHZhbHVlIGF0IHBpeGVsICh4LHkpLgorICAgIC8vIE5vdGUgdGhhdCB0aGUgcmFuZ2Ugb2YgeCBpcyBbMCwgd2lkdGgtMV0gYW5kIHRoZSByYW5nZSBvZiB5IGlzIFswLCBoZWlnaHQtMV0uCisgICAgLy8gUmV0dXJucyB0cnVlIGlmIHNldCB3YXMgc3VjY2Vzc2Z1bCBhbmQgZmFsc2Ugb3RoZXJ3aXNlLgorICAgIGJvb2wgc2V0UGl4ZWxWYWx1ZShpbnQzMl90IHgsIGludDMyX3QgeSwKKyAgICAgICAgICAgIHVpbnQ4X3QgeVZhbHVlLCB1aW50OF90IHVWYWx1ZSwgdWludDhfdCB2VmFsdWUpOworCisgICAgLy8gVXNlcyBtZW1jcHkgdG8gY29weSBhbiBlbnRpcmUgcm93IG9mIGRhdGEKKyAgICBzdGF0aWMgdm9pZCBmYXN0Q29weVJlY3RhbmdsZTQyMFBsYW5hcigKKyAgICAgICAgICAgIGNvbnN0IFJlY3QmIHNyY1JlY3QsCisgICAgICAgICAgICBpbnQzMl90IGRlc3RTdGFydFgsIGludDMyX3QgZGVzdFN0YXJ0WSwKKyAgICAgICAgICAgIGNvbnN0IFlVVkltYWdlICZzcmNJbWFnZSwgWVVWSW1hZ2UgJmRlc3RJbWFnZSk7CisKKyAgICAvLyBVc2VzIG1lbWNweSB0byBjb3B5IGFuIGVudGlyZSByb3cgb2YgZGF0YQorICAgIHN0YXRpYyB2b2lkIGZhc3RDb3B5UmVjdGFuZ2xlNDIwU2VtaVBsYW5hcigKKyAgICAgICAgICAgIGNvbnN0IFJlY3QmIHNyY1JlY3QsCisgICAgICAgICAgICBpbnQzMl90IGRlc3RTdGFydFgsIGludDMyX3QgZGVzdFN0YXJ0WSwKKyAgICAgICAgICAgIGNvbnN0IFlVVkltYWdlICZzcmNJbWFnZSwgWVVWSW1hZ2UgJmRlc3RJbWFnZSk7CisKKyAgICAvLyBUcmllcyB0byB1c2UgbWVtY29weSB0byBjb3B5IGVudGlyZSByb3dzIG9mIGRhdGEuCisgICAgLy8gUmV0dXJucyBmYWxzZSBpZiBmYXN0IGNvcHkgaXMgbm90IHBvc3NpYmxlIGZvciB0aGUgcGFzc2VkIGltYWdlIGZvcm1hdHMuCisgICAgc3RhdGljIGJvb2wgZmFzdENvcHlSZWN0YW5nbGUoCisgICAgICAgICAgICBjb25zdCBSZWN0JiBzcmNSZWN0LAorICAgICAgICAgICAgaW50MzJfdCBkZXN0U3RhcnRYLCBpbnQzMl90IGRlc3RTdGFydFksCisgICAgICAgICAgICBjb25zdCBZVVZJbWFnZSAmc3JjSW1hZ2UsIFlVVkltYWdlICZkZXN0SW1hZ2UpOworCisgICAgLy8gQ29udmVydCB0aGUgZ2l2ZW4gWVVWIHZhbHVlIHRvIFJHQi4KKyAgICB2b2lkIHl1djJyZ2IodWludDhfdCB5VmFsdWUsIHVpbnQ4X3QgdVZhbHVlLCB1aW50OF90IHZWYWx1ZSwKKyAgICAgICAgdWludDhfdCAqciwgdWludDhfdCAqZywgdWludDhfdCAqYikgY29uc3Q7CisKKyAgICAvLyBXcml0ZSB0aGUgaW1hZ2UgdG8gYSBodW1hbiByZWFkYWJsZSBQUE0gZmlsZS4KKyAgICAvLyBSZXR1cm5zIHRydWUgaWYgd3JpdGUgd2FzIHN1Y2Nlc2Z1bCBhbmQgZmFsc2Ugb3RoZXJ3aXNlLgorICAgIGJvb2wgd3JpdGVUb1BQTShjb25zdCBjaGFyICpmaWxlbmFtZSkgY29uc3Q7CisKK3ByaXZhdGU6CisgICAgLy8gWVVWIEZvcm1hdCBvZiB0aGUgaW1hZ2UuCisgICAgWVVWRm9ybWF0IG1ZVVZGb3JtYXQ7CisKKyAgICBpbnQzMl90IG1XaWR0aDsKKyAgICBpbnQzMl90IG1IZWlnaHQ7CisKKyAgICAvLyBQb2ludGVyIHRvIHRoZSBtZW1vcnkgYnVmZmVyLgorICAgIHVpbnQ4X3QgKm1CdWZmZXI7CisKKyAgICAvLyBCb29sZWFuIHRlbGxpbmcgd2hldGhlciB3ZSBvd24gdGhlIG1lbW9yeSBidWZmZXIuCisgICAgYm9vbCBtT3duQnVmZmVyOworCisgICAgLy8gUG9pbnRlciB0byBzdGFydCBvZiB0aGUgWSBkYXRhIHBsYW5lLgorICAgIHVpbnQ4X3QgKm1ZZGF0YTsKKworICAgIC8vIFBvaW50ZXIgdG8gc3RhcnQgb2YgdGhlIFUgZGF0YSBwbGFuZS4gTm90ZSB0aGF0IGluIGNhc2Ugb2YgaW50ZXJsZWF2ZWQgZm9ybWF0cyBsaWtlCisgICAgLy8gWVVWNDIwIHNlbWlwbGFuYXIsIG1VZGF0YSBwb2ludHMgdG8gdGhlIHN0YXJ0IG9mIHRoZSBVIGRhdGEgaW4gdGhlIFVWIHBsYW5lLgorICAgIHVpbnQ4X3QgKm1VZGF0YTsKKworICAgIC8vIFBvaW50ZXIgdG8gc3RhcnQgb2YgdGhlIFYgZGF0YSBwbGFuZS4gTm90ZSB0aGF0IGluIGNhc2Ugb2YgaW50ZXJsZWF2ZWQgZm9ybWF0cyBsaWtlCisgICAgLy8gWVVWNDIwIHNlbWlwbGFuYXIsIG1WZGF0YSBwb2ludHMgdG8gdGhlIHN0YXJ0IG9mIHRoZSBWIGRhdGEgaW4gdGhlIFVWIHBsYW5lLgorICAgIHVpbnQ4X3QgKm1WZGF0YTsKKworICAgIC8vIEluaXRpYWxpemUgdGhlIHBvaW50ZXJzIG1ZZGF0YSwgbVVkYXRhLCBtVmRhdGEgdG8gcG9pbnQgdG8gdGhlIHJpZ2h0IGxvY2F0aW9ucyBmb3IKKyAgICAvLyB0aGUgZ2l2ZW4gZm9ybWF0IGFuZCBnZW9tZXRyeS4KKyAgICAvLyBSZXR1cm5zIHRydWUgaWYgaW5pdGlhbGl6ZSB3YXMgc3VjY2VzZnVsIGFuZCBmYWxzZSBvdGhlcndpc2UuCisgICAgYm9vbCBpbml0aWFsaXplWVVWUG9pbnRlcnMoKTsKKworICAgIC8vIEZvciB0aGUgZ2l2ZW4gcGl4ZWwgbG9jYXRpb24sIHRoaXMgcmV0dXJucyB0aGUgb2Zmc2V0IG9mIHRoZSBsb2NhdGlvbiBvZiB5LCB1IGFuZCB2CisgICAgLy8gZGF0YSBmcm9tIHRoZSBjb3JyZXNwb25kaW5nIGJhc2UgcG9pbnRlcnMgLS0gbVlkYXRhLCBtVWRhdGEsIG1WZGF0YS4KKyAgICAvLyBOb3RlIHRoYXQgdGhlIHJhbmdlIG9mIHggaXMgWzAsIHdpZHRoLTFdIGFuZCB0aGUgcmFuZ2Ugb2YgeSBpcyBbMCwgaGVpZ2h0LTFdLgorICAgIC8vIFJldHVybnMgdHJ1ZSBpZiBnZXR0aW5nIG9mZnNldHMgd2FzIHN1Y2Nlc2Z1bCBhbmQgZmFsc2Ugb3RoZXJ3aXNlLgorICAgIGJvb2wgZ2V0T2Zmc2V0cyhpbnQzMl90IHgsIGludDMyX3QgeSwKKyAgICAgICAgaW50MzJfdCAqeU9mZnNldCwgaW50MzJfdCAqdU9mZnNldCwgaW50MzJfdCAqdk9mZnNldCkgY29uc3Q7CisKKyAgICAvLyBSZXR1cm5zIHRoZSBvZmZzZXQgaW5jcmVtZW50cyBpbmN1cnJlZCBpbiBnb2luZyBmcm9tIG9uZSBkYXRhIHJvdyB0byB0aGUgbmV4dCBkYXRhIHJvdworICAgIC8vIGZvciB0aGUgWVVWIGNoYW5uZWxzLiBOb3RlIHRoYXQgdGhpcyBjb3JyZXNwb25kcyB0byBkYXRhIHJvd3MgYW5kIG5vdCBwaXhlbCByb3dzLgorICAgIC8vIEUuZy4gZGVwZW5kaW5nIG9uIGZvcm1hdHMsIFUvViBjaGFubmVscyBtYXkgaGF2ZSBvbmx5IG9uZSBkYXRhIHJvdyBjb3JyZXNwb25kaW5nCisgICAgLy8gdG8gdHdvIHBpeGVsIHJvd3MuCisgICAgYm9vbCBnZXRPZmZzZXRJbmNyZW1lbnRzUGVyRGF0YVJvdygKKyAgICAgICAgaW50MzJfdCAqeURhdGFPZmZzZXRJbmNyZW1lbnQsCisgICAgICAgIGludDMyX3QgKnVEYXRhT2Zmc2V0SW5jcmVtZW50LAorICAgICAgICBpbnQzMl90ICp2RGF0YU9mZnNldEluY3JlbWVudCkgY29uc3Q7CisKKyAgICAvLyBHaXZlbiB0aGUgb2Zmc2V0IHJldHVybiB0aGUgYWRkcmVzcyBvZiB0aGUgY29ycmVzcG9uZGluZyBjaGFubmVsJ3MgZGF0YS4KKyAgICB1aW50OF90KiBnZXRZQWRkcmVzcyhpbnQzMl90IG9mZnNldCkgY29uc3Q7CisgICAgdWludDhfdCogZ2V0VUFkZHJlc3MoaW50MzJfdCBvZmZzZXQpIGNvbnN0OworICAgIHVpbnQ4X3QqIGdldFZBZGRyZXNzKGludDMyX3Qgb2Zmc2V0KSBjb25zdDsKKworICAgIC8vIEdpdmVuIHRoZSBwaXhlbCBsb2NhdGlvbiwgcmV0dXJucyB0aGUgYWRkcmVzcyBvZiB0aGUgY29ycmVzcG9uZGluZyBjaGFubmVsJ3MgZGF0YS4KKyAgICAvLyBOb3RlIHRoYXQgdGhlIHJhbmdlIG9mIHggaXMgWzAsIHdpZHRoLTFdIGFuZCB0aGUgcmFuZ2Ugb2YgeSBpcyBbMCwgaGVpZ2h0LTFdLgorICAgIGJvb2wgZ2V0WVVWQWRkcmVzc2VzKGludDMyX3QgeCwgaW50MzJfdCB5LAorICAgICAgICB1aW50OF90ICoqeUFkZHIsIHVpbnQ4X3QgKip1QWRkciwgdWludDhfdCAqKnZBZGRyKSBjb25zdDsKKworICAgIC8vIERpc2FsbG93IGltcGxpY2l0IGNhc3RpbmcgYW5kIGNvcHlpbmcuCisgICAgWVVWSW1hZ2UoY29uc3QgWVVWSW1hZ2UgJik7CisgICAgWVVWSW1hZ2UgJm9wZXJhdG9yPShjb25zdCBZVVZJbWFnZSAmKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gWVVWX0lNQUdFX0hfCmRpZmYgLS1naXQgYS9pbmNsdWRlL3N1cmZhY2VmbGluZ2VyL1N1cmZhY2UuaCBiL2luY2x1ZGUvc3VyZmFjZWZsaW5nZXIvU3VyZmFjZS5oCmluZGV4IDdjNWEzOWIuLmEyMTA4ODAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvc3VyZmFjZWZsaW5nZXIvU3VyZmFjZS5oCisrKyBiL2luY2x1ZGUvc3VyZmFjZWZsaW5nZXIvU3VyZmFjZS5oCkBAIC05NCw3ICs5NCw3IEBACiAgICAgZnJpZW5kIGNsYXNzIFN1cmZhY2VDb21wb3NlckNsaWVudDsKIAogICAgIC8vIGNhbWVyYSBhbmQgY2FtY29yZGVyIG5lZWQgYWNjZXNzIHRvIHRoZSBJU3VyZmFjZSBiaW5kZXIgaW50ZXJmYWNlIGZvciBwcmV2aWV3Ci0gICAgZnJpZW5kIGNsYXNzIENhbWVyYTsKKyAgICBmcmllbmQgY2xhc3MgQ2FtZXJhU2VydmljZTsKICAgICBmcmllbmQgY2xhc3MgTWVkaWFSZWNvcmRlcjsKICAgICAvLyBtZWRpYXBsYXllciBuZWVkcyBhY2Nlc3MgdG8gSVN1cmZhY2UgZm9yIGRpc3BsYXkKICAgICBmcmllbmQgY2xhc3MgTWVkaWFQbGF5ZXI7CkBAIC0xNzMsMTEgKzE3MywxMiBAQAogICAgICAqIChldmVudHVhbGx5IHRoaXMgc2hvdWxkIGdvIGF3YXkgYW5kIGJlIHJlcGxhY2VkIGJ5IHByb3BlciBBUElzKQogICAgICAqLwogICAgIC8vIGNhbWVyYSBhbmQgY2FtY29yZGVyIG5lZWQgYWNjZXNzIHRvIHRoZSBJU3VyZmFjZSBiaW5kZXIgaW50ZXJmYWNlIGZvciBwcmV2aWV3Ci0gICAgZnJpZW5kIGNsYXNzIENhbWVyYTsKKyAgICBmcmllbmQgY2xhc3MgQ2FtZXJhU2VydmljZTsKICAgICBmcmllbmQgY2xhc3MgTWVkaWFSZWNvcmRlcjsKICAgICAvLyBNZWRpYVBsYXllciBuZWVkcyBhY2Nlc3MgdG8gSVN1cmZhY2UgZm9yIGRpc3BsYXkKICAgICBmcmllbmQgY2xhc3MgTWVkaWFQbGF5ZXI7CiAgICAgZnJpZW5kIGNsYXNzIElPTVg7CisgICAgZnJpZW5kIGNsYXNzIFNvZnR3YXJlUmVuZGVyZXI7CiAgICAgLy8gdGhpcyBpcyBqdXN0IHRvIGJlIGFibGUgdG8gd3JpdGUgc29tZSB1bml0IHRlc3RzCiAgICAgZnJpZW5kIGNsYXNzIFRlc3Q7CiAKQEAgLTMxMiw0ICszMTMsMyBAQAogfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKIAogI2VuZGlmIC8vIEFORFJPSURfU0ZfU1VSRkFDRV9ICi0KZGlmZiAtLWdpdCBhL2luY2x1ZGUvdXRpbHMvU2luZ2xldG9uLmggYi9pbmNsdWRlL3V0aWxzL1NpbmdsZXRvbi5oCmluZGV4IDNiOTc1YjQuLmUxZWU4ZWIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvdXRpbHMvU2luZ2xldG9uLmgKKysrIGIvaW5jbHVkZS91dGlscy9TaW5nbGV0b24uaApAQCAtMzcsNiArMzcsMTEgQEAKICAgICAgICAgfQogICAgICAgICByZXR1cm4gKmluc3RhbmNlOwogICAgIH0KKworICAgIHN0YXRpYyBib29sIGhhc0luc3RhbmNlKCkgeworICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2woc0xvY2spOworICAgICAgICByZXR1cm4gc0luc3RhbmNlICE9IDA7CisgICAgfQogICAgIAogcHJvdGVjdGVkOgogICAgIH5TaW5nbGV0b24oKSB7IH07CmRpZmYgLS1naXQgYS9saWJzL2JpbmRlci9BbmRyb2lkLm1rIGIvbGlicy9iaW5kZXIvQW5kcm9pZC5tawppbmRleCAxM2RjNTAwLi5mOWQ5ZjI1IDEwMDY0NAotLS0gYS9saWJzL2JpbmRlci9BbmRyb2lkLm1rCisrKyBiL2xpYnMvYmluZGVyL0FuZHJvaWQubWsKQEAgLTE2LDYgKzE2LDcgQEAKIHNvdXJjZXMgOj0gXAogICAgIEJpbmRlci5jcHAgXAogICAgIEJwQmluZGVyLmNwcCBcCisgICAgQ3Vyc29yV2luZG93LmNwcCBcCiAgICAgSUludGVyZmFjZS5jcHAgXAogICAgIElNZW1vcnkuY3BwIFwKICAgICBJUENUaHJlYWRTdGF0ZS5jcHAgXApkaWZmIC0tZ2l0IGEvbGlicy9iaW5kZXIvQ3Vyc29yV2luZG93LmNwcCBiL2xpYnMvYmluZGVyL0N1cnNvcldpbmRvdy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjBiMjdjOQotLS0gL2Rldi9udWxsCisrKyBiL2xpYnMvYmluZGVyL0N1cnNvcldpbmRvdy5jcHAKQEAgLTAsMCArMSw0MDggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDYtMjAwNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IAorICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAKKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlIAorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI3VuZGVmIExPR19UQUcKKyNkZWZpbmUgTE9HX1RBRyAiQ3Vyc29yV2luZG93IgorCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisjaW5jbHVkZSA8YmluZGVyL0N1cnNvcldpbmRvdy5oPgorI2luY2x1ZGUgPGJpbmRlci9NZW1vcnlIZWFwQmFzZS5oPgorI2luY2x1ZGUgPGJpbmRlci9NZW1vcnlCYXNlLmg+CisKKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitDdXJzb3JXaW5kb3c6OkN1cnNvcldpbmRvdyhzaXplX3QgbWF4U2l6ZSkgOgorICAgIG1NYXhTaXplKG1heFNpemUpCit7Cit9CisKK2Jvb2wgQ3Vyc29yV2luZG93OjpzZXRNZW1vcnkoY29uc3Qgc3A8SU1lbW9yeT4mIG1lbW9yeSkKK3sKKyAgICBtTWVtb3J5ID0gbWVtb3J5OworICAgIG1EYXRhID0gKHVpbnQ4X3QgKikgbWVtb3J5LT5wb2ludGVyKCk7CisgICAgaWYgKG1EYXRhID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBtSGVhZGVyID0gKHdpbmRvd19oZWFkZXJfdCAqKSBtRGF0YTsKKworICAgIC8vIE1ha2UgdGhlIHdpbmRvdyByZWFkLW9ubHkKKyAgICBzc2l6ZV90IHNpemUgPSBtZW1vcnktPnNpemUoKTsKKyAgICBtU2l6ZSA9IHNpemU7CisgICAgbU1heFNpemUgPSBzaXplOworICAgIG1GcmVlT2Zmc2V0ID0gc2l6ZTsKK0xPR19XSU5ET1coIkNyZWF0ZWQgQ3Vyc29yV2luZG93IGZyb20gZXhpc3RpbmcgSU1lbW9yeTogbUZyZWVPZmZzZXQgPSAlZCwgbnVtUm93cyA9ICVkLCBudW1Db2x1bW5zID0gJWQsIG1TaXplID0gJWQsIG1NYXhTaXplID0gJWQsIG1EYXRhID0gJXAiLCBtRnJlZU9mZnNldCwgbUhlYWRlci0+bnVtUm93cywgbUhlYWRlci0+bnVtQ29sdW1ucywgbVNpemUsIG1NYXhTaXplLCBtRGF0YSk7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgQ3Vyc29yV2luZG93Ojppbml0QnVmZmVyKGJvb2wgbG9jYWxPbmx5KQoreworICAgIC8vVE9ETyBVc2UgYSBub24tbWVtb3J5IGRlYWxlciBtbWFwIHJlZ2lvbiBmb3IgbG9jYWxPbmx5CisKKyAgICBzcDxNZW1vcnlIZWFwQmFzZT4gaGVhcDsKKyAgICBoZWFwID0gbmV3IE1lbW9yeUhlYXBCYXNlKG1NYXhTaXplLCAwLCAiQ3Vyc29yV2luZG93Iik7CisgICAgaWYgKGhlYXAgIT0gTlVMTCkgeworICAgICAgICBtTWVtb3J5ID0gbmV3IE1lbW9yeUJhc2UoaGVhcCwgMCwgbU1heFNpemUpOworICAgICAgICBpZiAobU1lbW9yeSAhPSBOVUxMKSB7CisgICAgICAgICAgICBtRGF0YSA9ICh1aW50OF90ICopIG1NZW1vcnktPnBvaW50ZXIoKTsKKyAgICAgICAgICAgIGlmIChtRGF0YSkgeworICAgICAgICAgICAgICAgIG1IZWFkZXIgPSAod2luZG93X2hlYWRlcl90ICopIG1EYXRhOworICAgICAgICAgICAgICAgIG1TaXplID0gbU1heFNpemU7CisKKyAgICAgICAgICAgICAgICAvLyBQdXQgdGhlIHdpbmRvdyBpbnRvIGEgY2xlYW4gc3RhdGUKKyAgICAgICAgICAgICAgICBjbGVhcigpOworICAgICAgICAgICAgTE9HX1dJTkRPVygiQ3JlYXRlZCBDdXJzb3JXaW5kb3cgd2l0aCBuZXcgTWVtb3J5RGVhbGVyOiBtRnJlZU9mZnNldCA9ICVkLCBtU2l6ZSA9ICVkLCBtTWF4U2l6ZSA9ICVkLCBtRGF0YSA9ICVwIiwgbUZyZWVPZmZzZXQsIG1TaXplLCBtTWF4U2l6ZSwgbURhdGEpOworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSAKKyAgICAgICAgTE9HRSgiQ3Vyc29yV2luZG93IGhlYXAgYWxsb2NhdGlvbiBmYWlsZWQiKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0gZWxzZSB7CisgICAgICAgIExPR0UoImZhaWxlZCB0byBjcmVhdGUgdGhlIEN1cnNvcldpbmRvdyBoZWFwIik7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9Cit9CisKK0N1cnNvcldpbmRvdzo6fkN1cnNvcldpbmRvdygpCit7CisgICAgLy8gRXZlcnl0aGluZyB0aGF0IG1hdHRlcnMgaXMgYSBzbWFydCBwb2ludGVyCit9CisKK3ZvaWQgQ3Vyc29yV2luZG93OjpjbGVhcigpCit7CisgICAgbUhlYWRlci0+bnVtUm93cyA9IDA7CisgICAgbUhlYWRlci0+bnVtQ29sdW1ucyA9IDA7CisgICAgbUZyZWVPZmZzZXQgPSBzaXplb2Yod2luZG93X2hlYWRlcl90KSArIFJPV19TTE9UX0NIVU5LX1NJWkU7CisgICAgLy8gTWFyayB0aGUgZmlyc3QgY2h1bmsncyBuZXh0ICdwb2ludGVyJyBhcyBudWxsCisgICAgKigodWludDMyX3QgKikobURhdGEgKyBtRnJlZU9mZnNldCAtIHNpemVvZih1aW50MzJfdCkpKSA9IDA7Cit9CisKK2ludDMyX3QgQ3Vyc29yV2luZG93OjpmcmVlU3BhY2UoKQoreworICAgIGludDMyX3QgZnJlZVNwYWNlID0gbVNpemUgLSBtRnJlZU9mZnNldDsKKyAgICBpZiAoZnJlZVNwYWNlIDwgMCkgeworICAgICAgICBmcmVlU3BhY2UgPSAwOworICAgIH0KKyAgICByZXR1cm4gZnJlZVNwYWNlOworfQorCitmaWVsZF9zbG90X3QgKiBDdXJzb3JXaW5kb3c6OmFsbG9jUm93KCkKK3sKKyAgICAvLyBGaWxsIGluIHRoZSByb3cgc2xvdAorICAgIHJvd19zbG90X3QgKiByb3dTbG90ID0gYWxsb2NSb3dTbG90KCk7CisgICAgaWYgKHJvd1Nsb3QgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICAvLyBBbGxvY2F0ZSB0aGUgc2xvdHMgZm9yIHRoZSBmaWVsZCBkaXJlY3RvcnkKKyAgICBzaXplX3QgZmllbGREaXJTaXplID0gbUhlYWRlci0+bnVtQ29sdW1ucyAqIHNpemVvZihmaWVsZF9zbG90X3QpOworICAgIHVpbnQzMl90IGZpZWxkRGlyT2Zmc2V0ID0gYWxsb2MoZmllbGREaXJTaXplKTsKKyAgICBpZiAoIWZpZWxkRGlyT2Zmc2V0KSB7CisgICAgICAgIG1IZWFkZXItPm51bVJvd3MtLTsKKyAgICAgICAgTE9HRSgiVGhlIHJvdyBmYWlsZWQsIHNvIGJhY2sgb3V0IHRoZSBuZXcgcm93IGFjY291bnRpbmcgZnJvbSBhbGxvY1Jvd1Nsb3QgJWQiLCBtSGVhZGVyLT5udW1Sb3dzKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGZpZWxkX3Nsb3RfdCAqIGZpZWxkRGlyID0gKGZpZWxkX3Nsb3RfdCAqKW9mZnNldFRvUHRyKGZpZWxkRGlyT2Zmc2V0KTsKKyAgICBtZW1zZXQoZmllbGREaXIsIDB4MCwgZmllbGREaXJTaXplKTsKKworTE9HX1dJTkRPVygiQWxsb2NhdGVkIHJvdyAldSwgcm93U2xvdCBpcyBhdCBvZmZzZXQgJXUsIGZpZWxkRGlyIGlzICVkIGJ5dGVzIGF0IG9mZnNldCAldVxuIiwgKG1IZWFkZXItPm51bVJvd3MgLSAxKSwgKCh1aW50OF90ICopcm93U2xvdCkgLSBtRGF0YSwgZmllbGREaXJTaXplLCBmaWVsZERpck9mZnNldCk7CisgICAgcm93U2xvdC0+b2Zmc2V0ID0gZmllbGREaXJPZmZzZXQ7CisKKyAgICByZXR1cm4gZmllbGREaXI7Cit9CisKK3VpbnQzMl90IEN1cnNvcldpbmRvdzo6YWxsb2Moc2l6ZV90IHJlcXVlc3RlZFNpemUsIGJvb2wgYWxpZ25lZCkKK3sKKyAgICBpbnQzMl90IHNpemU7CisgICAgdWludDMyX3QgcGFkZGluZzsKKyAgICBpZiAoYWxpZ25lZCkgeworICAgICAgICAvLyA0IGJ5dGUgYWxpZ25tZW50CisgICAgICAgIHBhZGRpbmcgPSA0IC0gKG1GcmVlT2Zmc2V0ICYgMHgzKTsKKyAgICB9IGVsc2UgeworICAgICAgICBwYWRkaW5nID0gMDsKKyAgICB9CisKKyAgICBzaXplID0gcmVxdWVzdGVkU2l6ZSArIHBhZGRpbmc7CisKKyAgICBpZiAoc2l6ZSA+IGZyZWVTcGFjZSgpKSB7CisgICAgICAgIExPR0UoIm5lZWQgdG8gZ3JvdzogbVNpemUgPSAlZCwgc2l6ZSA9ICVkLCBmcmVlU3BhY2UoKSA9ICVkLCBudW1Sb3dzID0gJWQiLCBtU2l6ZSwgc2l6ZSwgZnJlZVNwYWNlKCksIG1IZWFkZXItPm51bVJvd3MpOworICAgICAgICAvLyBPbmx5IGdyb3cgdGhlIHdpbmRvdyBpZiB0aGUgZmlyc3Qgcm93IGRvZXNuJ3QgZml0CisgICAgICAgIGlmIChtSGVhZGVyLT5udW1Sb3dzID4gMSkgeworTE9HRSgibm90IGdyb3dpbmcgc2luY2UgdGhlcmUgYXJlIGFscmVhZHkgJWQgcm93KHMpLCBtYXggc2l6ZSAlZCIsIG1IZWFkZXItPm51bVJvd3MsIG1NYXhTaXplKTsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisKKyAgICAgICAgLy8gRmluZCBhIG5ldyBzaXplIHRoYXQgd2lsbCBmaXQgdGhlIGFsbG9jYXRpb24KKyAgICAgICAgaW50IGFsbG9jYXRlZCA9IG1TaXplIC0gZnJlZVNwYWNlKCk7CisgICAgICAgIGludCBuZXdTaXplID0gbVNpemUgKyBXSU5ET1dfQUxMT0NBVElPTl9TSVpFOworICAgICAgICB3aGlsZSAoc2l6ZSA+IChuZXdTaXplIC0gYWxsb2NhdGVkKSkgeworICAgICAgICAgICAgbmV3U2l6ZSArPSBXSU5ET1dfQUxMT0NBVElPTl9TSVpFOworICAgICAgICAgICAgaWYgKG5ld1NpemUgPiBtTWF4U2l6ZSkgeworICAgICAgICAgICAgICAgIExPR0UoIkF0dGVtcHRpbmcgdG8gZ3JvdyB3aW5kb3cgYmV5b25kIG1heCBzaXplICglZCkiLCBtTWF4U2l6ZSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KK0xPR19XSU5ET1coImZvdW5kIHNpemUgJWQiLCBuZXdTaXplKTsKKyAgICAgICAgbVNpemUgPSBuZXdTaXplOworICAgIH0KKworICAgIHVpbnQzMl90IG9mZnNldCA9IG1GcmVlT2Zmc2V0ICsgcGFkZGluZzsKKyAgICBtRnJlZU9mZnNldCArPSBzaXplOworICAgIHJldHVybiBvZmZzZXQ7Cit9CisKK3Jvd19zbG90X3QgKiBDdXJzb3JXaW5kb3c6OmdldFJvd1Nsb3QoaW50IHJvdykKK3sKKyAgICBMT0dfV0lORE9XKCJlbnRlciBnZXRSb3dTbG90IGN1cnJlbnQgcm93IG51bSAlZCwgdGhpcyByb3cgJWQiLCBtSGVhZGVyLT5udW1Sb3dzLCByb3cpOworICAgIGludCBjaHVua051bSA9IHJvdyAvIFJPV19TTE9UX0NIVU5LX05VTV9ST1dTOworICAgIGludCBjaHVua1BvcyA9IHJvdyAlIFJPV19TTE9UX0NIVU5LX05VTV9ST1dTOworICAgIGludCBjaHVua1B0ck9mZnNldCA9IHNpemVvZih3aW5kb3dfaGVhZGVyX3QpICsgUk9XX1NMT1RfQ0hVTktfU0laRSAtIHNpemVvZih1aW50MzJfdCk7CisgICAgdWludDhfdCAqIHJvd0NodW5rID0gbURhdGEgKyBzaXplb2Yod2luZG93X2hlYWRlcl90KTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGNodW5rTnVtOyBpKyspIHsKKyAgICAgICAgcm93Q2h1bmsgPSBvZmZzZXRUb1B0cigqKCh1aW50MzJfdCAqKShtRGF0YSArIGNodW5rUHRyT2Zmc2V0KSkpOworICAgICAgICBjaHVua1B0ck9mZnNldCA9IHJvd0NodW5rIC0gbURhdGEgKyAoUk9XX1NMT1RfQ0hVTktfTlVNX1JPV1MgKiBzaXplb2Yocm93X3Nsb3RfdCkpOworICAgIH0KKyAgICByZXR1cm4gKHJvd19zbG90X3QgKikocm93Q2h1bmsgKyAoY2h1bmtQb3MgKiBzaXplb2Yocm93X3Nsb3RfdCkpKTsKKyAgICBMT0dfV0lORE9XKCJleGl0IGdldFJvd1Nsb3QgY3VycmVudCByb3cgbnVtICVkLCB0aGlzIHJvdyAlZCIsIG1IZWFkZXItPm51bVJvd3MsIHJvdyk7ICAgIAorfQorCityb3dfc2xvdF90ICogQ3Vyc29yV2luZG93OjphbGxvY1Jvd1Nsb3QoKQoreworICAgIGludCBjaHVua051bSA9IG1IZWFkZXItPm51bVJvd3MgLyBST1dfU0xPVF9DSFVOS19OVU1fUk9XUzsKKyAgICBpbnQgY2h1bmtQb3MgPSBtSGVhZGVyLT5udW1Sb3dzICUgUk9XX1NMT1RfQ0hVTktfTlVNX1JPV1M7CisgICAgaW50IGNodW5rUHRyT2Zmc2V0ID0gc2l6ZW9mKHdpbmRvd19oZWFkZXJfdCkgKyBST1dfU0xPVF9DSFVOS19TSVpFIC0gc2l6ZW9mKHVpbnQzMl90KTsKKyAgICB1aW50OF90ICogcm93Q2h1bmsgPSBtRGF0YSArIHNpemVvZih3aW5kb3dfaGVhZGVyX3QpOworTE9HX1dJTkRPVygiQWxsb2NhdGluZyByb3cgc2xvdCwgbUhlYWRlci0+bnVtUm93cyBpcyAlZCwgY2h1bmtOdW0gaXMgJWQsIGNodW5rUG9zIGlzICVkIiwgbUhlYWRlci0+bnVtUm93cywgY2h1bmtOdW0sIGNodW5rUG9zKTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGNodW5rTnVtOyBpKyspIHsKKyAgICAgICAgdWludDMyX3QgbmV4dENodW5rT2Zmc2V0ID0gKigodWludDMyX3QgKikobURhdGEgKyBjaHVua1B0ck9mZnNldCkpOworTE9HX1dJTkRPVygibmV4dENodW5rT2Zmc2V0IGlzICVkIiwgbmV4dENodW5rT2Zmc2V0KTsKKyAgICAgICAgaWYgKG5leHRDaHVua09mZnNldCA9PSAwKSB7CisgICAgICAgICAgICAvLyBBbGxvY2F0ZSBhIG5ldyByb3cgY2h1bmsKKyAgICAgICAgICAgIG5leHRDaHVua09mZnNldCA9IGFsbG9jKFJPV19TTE9UX0NIVU5LX1NJWkUsIHRydWUpOworICAgICAgICAgICAgaWYgKG5leHRDaHVua09mZnNldCA9PSAwKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByb3dDaHVuayA9IG9mZnNldFRvUHRyKG5leHRDaHVua09mZnNldCk7CitMT0dfV0lORE9XKCJhbGxvY2F0ZWQgbmV3IGNodW5rIGF0ICVkLCByb3dDaHVuayA9ICVwIiwgbmV4dENodW5rT2Zmc2V0LCByb3dDaHVuayk7CisgICAgICAgICAgICAqKCh1aW50MzJfdCAqKShtRGF0YSArIGNodW5rUHRyT2Zmc2V0KSkgPSByb3dDaHVuayAtIG1EYXRhOworICAgICAgICAgICAgLy8gTWFyayB0aGUgbmV3IGNodW5rJ3MgbmV4dCAncG9pbnRlcicgYXMgbnVsbAorICAgICAgICAgICAgKigodWludDMyX3QgKikocm93Q2h1bmsgKyBST1dfU0xPVF9DSFVOS19TSVpFIC0gc2l6ZW9mKHVpbnQzMl90KSkpID0gMDsKKyAgICAgICAgfSBlbHNlIHsKK0xPR19XSU5ET1coImZvbGx3aW5nICdwb2ludGVyJyB0byBuZXh0IGNodW5rLCBvZmZzZXQgb2YgbmV4dCBwb2ludGVyIGlzICVkIiwgY2h1bmtQdHJPZmZzZXQpOworICAgICAgICAgICAgcm93Q2h1bmsgPSBvZmZzZXRUb1B0cihuZXh0Q2h1bmtPZmZzZXQpOworICAgICAgICAgICAgY2h1bmtQdHJPZmZzZXQgPSByb3dDaHVuayAtIG1EYXRhICsgKFJPV19TTE9UX0NIVU5LX05VTV9ST1dTICogc2l6ZW9mKHJvd19zbG90X3QpKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBtSGVhZGVyLT5udW1Sb3dzKys7CisKKyAgICByZXR1cm4gKHJvd19zbG90X3QgKikocm93Q2h1bmsgKyAoY2h1bmtQb3MgKiBzaXplb2Yocm93X3Nsb3RfdCkpKTsKK30KKworZmllbGRfc2xvdF90ICogQ3Vyc29yV2luZG93OjpnZXRGaWVsZFNsb3RXaXRoQ2hlY2soaW50IHJvdywgaW50IGNvbHVtbikKK3sKKyAgaWYgKHJvdyA8IDAgfHwgcm93ID49IG1IZWFkZXItPm51bVJvd3MgfHwgY29sdW1uIDwgMCB8fCBjb2x1bW4gPj0gbUhlYWRlci0+bnVtQ29sdW1ucykgeworICAgICAgTE9HRSgiQmFkIHJlcXVlc3QgZm9yIGZpZWxkIHNsb3QgJWQsJWQuIG51bVJvd3MgPSAlZCwgbnVtQ29sdW1ucyA9ICVkIiwgcm93LCBjb2x1bW4sIG1IZWFkZXItPm51bVJvd3MsIG1IZWFkZXItPm51bUNvbHVtbnMpOworICAgICAgcmV0dXJuIE5VTEw7CisgIH0gICAgICAgIAorICByb3dfc2xvdF90ICogcm93U2xvdCA9IGdldFJvd1Nsb3Qocm93KTsKKyAgaWYgKCFyb3dTbG90KSB7CisgICAgICBMT0dFKCJGYWlsZWQgdG8gZmluZCByb3dTbG90IGZvciByb3cgJWQiLCByb3cpOworICAgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgaWYgKHJvd1Nsb3QtPm9mZnNldCA9PSAwIHx8IHJvd1Nsb3QtPm9mZnNldCA+PSBtU2l6ZSkgeworICAgICAgTE9HRSgiSW52YWxpZCByb3dTbG90LCBvZmZzZXQgPSAlZCIsIHJvd1Nsb3QtPm9mZnNldCk7CisgICAgICByZXR1cm4gTlVMTDsKKyAgfSAgCisgIGludCBmaWVsZERpck9mZnNldCA9IHJvd1Nsb3QtPm9mZnNldDsKKyAgcmV0dXJuICgoZmllbGRfc2xvdF90ICopb2Zmc2V0VG9QdHIoZmllbGREaXJPZmZzZXQpKSArIGNvbHVtbjsgIAorfQorCit1aW50MzJfdCBDdXJzb3JXaW5kb3c6OnJlYWRfZmllbGRfc2xvdChpbnQgcm93LCBpbnQgY29sdW1uLCBmaWVsZF9zbG90X3QgKiBzbG90T3V0KQoreworICAgIGlmIChyb3cgPCAwIHx8IHJvdyA+PSBtSGVhZGVyLT5udW1Sb3dzIHx8IGNvbHVtbiA8IDAgfHwgY29sdW1uID49IG1IZWFkZXItPm51bUNvbHVtbnMpIHsKKyAgICAgICAgTE9HRSgiQmFkIHJlcXVlc3QgZm9yIGZpZWxkIHNsb3QgJWQsJWQuIG51bVJvd3MgPSAlZCwgbnVtQ29sdW1ucyA9ICVkIiwgcm93LCBjb2x1bW4sIG1IZWFkZXItPm51bVJvd3MsIG1IZWFkZXItPm51bUNvbHVtbnMpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfSAgICAgICAgCisgICAgcm93X3Nsb3RfdCAqIHJvd1Nsb3QgPSBnZXRSb3dTbG90KHJvdyk7CisgICAgaWYgKCFyb3dTbG90KSB7CisgICAgICAgIExPR0UoIkZhaWxlZCB0byBmaW5kIHJvd1Nsb3QgZm9yIHJvdyAlZCIsIHJvdyk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgaWYgKHJvd1Nsb3QtPm9mZnNldCA9PSAwIHx8IHJvd1Nsb3QtPm9mZnNldCA+PSBtU2l6ZSkgeworICAgICAgICBMT0dFKCJJbnZhbGlkIHJvd1Nsb3QsIG9mZnNldCA9ICVkIiwgcm93U2xvdC0+b2Zmc2V0KTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KK0xPR19XSU5ET1coIkZvdW5kIGZpZWxkIGRpcmVjdG9yeSBmb3IgJWQsJWQgYXQgcm93U2xvdCAlZCwgb2Zmc2V0ICVkIiwgcm93LCBjb2x1bW4sICh1aW50OF90ICopcm93U2xvdCAtIG1EYXRhLCByb3dTbG90LT5vZmZzZXQpOworICAgIGZpZWxkX3Nsb3RfdCAqIGZpZWxkRGlyID0gKGZpZWxkX3Nsb3RfdCAqKW9mZnNldFRvUHRyKHJvd1Nsb3QtPm9mZnNldCk7CitMT0dfV0lORE9XKCJSZWFkIGZpZWxkX3Nsb3RfdCAlZCwlZDogb2Zmc2V0ID0gJWQsIHNpemUgPSAlZCwgdHlwZSA9ICVkIiwgcm93LCBjb2x1bW4sIGZpZWxkRGlyW2NvbHVtbl0uZGF0YS5idWZmZXIub2Zmc2V0LCBmaWVsZERpcltjb2x1bW5dLmRhdGEuYnVmZmVyLnNpemUsIGZpZWxkRGlyW2NvbHVtbl0udHlwZSk7CisKKyAgICAvLyBDb3B5IHRoZSBkYXRhIHRvIHRoZSBvdXQgcGFyYW0KKyAgICBzbG90T3V0LT5kYXRhLmJ1ZmZlci5vZmZzZXQgPSBmaWVsZERpcltjb2x1bW5dLmRhdGEuYnVmZmVyLm9mZnNldDsKKyAgICBzbG90T3V0LT5kYXRhLmJ1ZmZlci5zaXplID0gZmllbGREaXJbY29sdW1uXS5kYXRhLmJ1ZmZlci5zaXplOworICAgIHNsb3RPdXQtPnR5cGUgPSBmaWVsZERpcltjb2x1bW5dLnR5cGU7CisgICAgcmV0dXJuIDA7Cit9CisKK3ZvaWQgQ3Vyc29yV2luZG93Ojpjb3B5SW4odWludDMyX3Qgb2Zmc2V0LCB1aW50OF90IGNvbnN0ICogZGF0YSwgc2l6ZV90IHNpemUpCit7CisgICAgYXNzZXJ0KG9mZnNldCArIHNpemUgPD0gbVNpemUpOyAgICAKKyAgICBtZW1jcHkobURhdGEgKyBvZmZzZXQsIGRhdGEsIHNpemUpOworfQorCit2b2lkIEN1cnNvcldpbmRvdzo6Y29weUluKHVpbnQzMl90IG9mZnNldCwgaW50NjRfdCBkYXRhKQoreworICAgIGFzc2VydChvZmZzZXQgKyBzaXplb2YoaW50NjRfdCkgPD0gbVNpemUpOworICAgIG1lbWNweShtRGF0YSArIG9mZnNldCwgKHVpbnQ4X3QgKikmZGF0YSwgc2l6ZW9mKGludDY0X3QpKTsKK30KKwordm9pZCBDdXJzb3JXaW5kb3c6OmNvcHlJbih1aW50MzJfdCBvZmZzZXQsIGRvdWJsZSBkYXRhKQoreworICAgIGFzc2VydChvZmZzZXQgKyBzaXplb2YoZG91YmxlKSA8PSBtU2l6ZSk7CisgICAgbWVtY3B5KG1EYXRhICsgb2Zmc2V0LCAodWludDhfdCAqKSZkYXRhLCBzaXplb2YoZG91YmxlKSk7Cit9CisKK3ZvaWQgQ3Vyc29yV2luZG93Ojpjb3B5T3V0KHVpbnQzMl90IG9mZnNldCwgdWludDhfdCAqIGRhdGEsIHNpemVfdCBzaXplKQoreworICAgIGFzc2VydChvZmZzZXQgKyBzaXplIDw9IG1TaXplKTsKKyAgICBtZW1jcHkoZGF0YSwgbURhdGEgKyBvZmZzZXQsIHNpemUpOworfQorCitpbnQ2NF90IEN1cnNvcldpbmRvdzo6Y29weU91dExvbmcodWludDMyX3Qgb2Zmc2V0KQoreworICAgIGludDY0X3QgdmFsdWU7CisgICAgYXNzZXJ0KG9mZnNldCArIHNpemVvZihpbnQ2NF90KSA8PSBtU2l6ZSk7CisgICAgbWVtY3B5KCZ2YWx1ZSwgbURhdGEgKyBvZmZzZXQsIHNpemVvZihpbnQ2NF90KSk7CisgICAgcmV0dXJuIHZhbHVlOworfQorCitkb3VibGUgQ3Vyc29yV2luZG93Ojpjb3B5T3V0RG91YmxlKHVpbnQzMl90IG9mZnNldCkKK3sKKyAgICBkb3VibGUgdmFsdWU7CisgICAgYXNzZXJ0KG9mZnNldCArIHNpemVvZihkb3VibGUpIDw9IG1TaXplKTsKKyAgICBtZW1jcHkoJnZhbHVlLCBtRGF0YSArIG9mZnNldCwgc2l6ZW9mKGRvdWJsZSkpOworICAgIHJldHVybiB2YWx1ZTsKK30KKworYm9vbCBDdXJzb3JXaW5kb3c6OnB1dExvbmcodW5zaWduZWQgaW50IHJvdywgdW5zaWduZWQgaW50IGNvbCwgaW50NjRfdCB2YWx1ZSkKK3sKKyAgICBmaWVsZF9zbG90X3QgKiBmaWVsZFNsb3QgPSBnZXRGaWVsZFNsb3RXaXRoQ2hlY2socm93LCBjb2wpOworICAgIGlmICghZmllbGRTbG90KSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyNpZiBXSU5ET1dfU1RPUkFHRV9JTkxJTkVfTlVNRVJJQ1MKKyAgICBmaWVsZFNsb3QtPmRhdGEubCA9IHZhbHVlOworI2Vsc2UKKyAgICBpbnQgb2Zmc2V0ID0gYWxsb2Moc2l6ZW9mKGludDY0X3QpKTsKKyAgICBpZiAoIW9mZnNldCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgY29weUluKG9mZnNldCwgdmFsdWUpOworCisgICAgZmllbGRTbG90LT5kYXRhLmJ1ZmZlci5vZmZzZXQgPSBvZmZzZXQ7CisgICAgZmllbGRTbG90LT5kYXRhLmJ1ZmZlci5zaXplID0gc2l6ZW9mKGludDY0X3QpOworI2VuZGlmCisgICAgZmllbGRTbG90LT50eXBlID0gRklFTERfVFlQRV9JTlRFR0VSOworICAgIHJldHVybiB0cnVlOworfQorCitib29sIEN1cnNvcldpbmRvdzo6cHV0RG91YmxlKHVuc2lnbmVkIGludCByb3csIHVuc2lnbmVkIGludCBjb2wsIGRvdWJsZSB2YWx1ZSkKK3sKKyAgICBmaWVsZF9zbG90X3QgKiBmaWVsZFNsb3QgPSBnZXRGaWVsZFNsb3RXaXRoQ2hlY2socm93LCBjb2wpOworICAgIGlmICghZmllbGRTbG90KSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyNpZiBXSU5ET1dfU1RPUkFHRV9JTkxJTkVfTlVNRVJJQ1MKKyAgICBmaWVsZFNsb3QtPmRhdGEuZCA9IHZhbHVlOworI2Vsc2UKKyAgICBpbnQgb2Zmc2V0ID0gYWxsb2Moc2l6ZW9mKGludDY0X3QpKTsKKyAgICBpZiAoIW9mZnNldCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgY29weUluKG9mZnNldCwgdmFsdWUpOworCisgICAgZmllbGRTbG90LT5kYXRhLmJ1ZmZlci5vZmZzZXQgPSBvZmZzZXQ7CisgICAgZmllbGRTbG90LT5kYXRhLmJ1ZmZlci5zaXplID0gc2l6ZW9mKGRvdWJsZSk7CisjZW5kaWYKKyAgICBmaWVsZFNsb3QtPnR5cGUgPSBGSUVMRF9UWVBFX0ZMT0FUOworICAgIHJldHVybiB0cnVlOworfQorCitib29sIEN1cnNvcldpbmRvdzo6cHV0TnVsbCh1bnNpZ25lZCBpbnQgcm93LCB1bnNpZ25lZCBpbnQgY29sKQoreworICAgIGZpZWxkX3Nsb3RfdCAqIGZpZWxkU2xvdCA9IGdldEZpZWxkU2xvdFdpdGhDaGVjayhyb3csIGNvbCk7CisgICAgaWYgKCFmaWVsZFNsb3QpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGZpZWxkU2xvdC0+dHlwZSA9IEZJRUxEX1RZUEVfTlVMTDsKKyAgICBmaWVsZFNsb3QtPmRhdGEuYnVmZmVyLm9mZnNldCA9IDA7CisgICAgZmllbGRTbG90LT5kYXRhLmJ1ZmZlci5zaXplID0gMDsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBDdXJzb3JXaW5kb3c6OmdldExvbmcodW5zaWduZWQgaW50IHJvdywgdW5zaWduZWQgaW50IGNvbCwgaW50NjRfdCAqIHZhbHVlT3V0KQoreworICAgIGZpZWxkX3Nsb3RfdCAqIGZpZWxkU2xvdCA9IGdldEZpZWxkU2xvdFdpdGhDaGVjayhyb3csIGNvbCk7CisgICAgaWYgKCFmaWVsZFNsb3QgfHwgZmllbGRTbG90LT50eXBlICE9IEZJRUxEX1RZUEVfSU5URUdFUikgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIAorI2lmIFdJTkRPV19TVE9SQUdFX0lOTElORV9OVU1FUklDUworICAgICp2YWx1ZU91dCA9IGZpZWxkU2xvdC0+ZGF0YS5sOworI2Vsc2UKKyAgICAqdmFsdWVPdXQgPSBjb3B5T3V0TG9uZyhmaWVsZFNsb3QtPmRhdGEuYnVmZmVyLm9mZnNldCk7CisjZW5kaWYKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBDdXJzb3JXaW5kb3c6OmdldERvdWJsZSh1bnNpZ25lZCBpbnQgcm93LCB1bnNpZ25lZCBpbnQgY29sLCBkb3VibGUgKiB2YWx1ZU91dCkKK3sKKyAgICBmaWVsZF9zbG90X3QgKiBmaWVsZFNsb3QgPSBnZXRGaWVsZFNsb3RXaXRoQ2hlY2socm93LCBjb2wpOworICAgIGlmICghZmllbGRTbG90IHx8IGZpZWxkU2xvdC0+dHlwZSAhPSBGSUVMRF9UWVBFX0ZMT0FUKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyNpZiBXSU5ET1dfU1RPUkFHRV9JTkxJTkVfTlVNRVJJQ1MKKyAgICAqdmFsdWVPdXQgPSBmaWVsZFNsb3QtPmRhdGEuZDsKKyNlbHNlCisgICAgKnZhbHVlT3V0ID0gY29weU91dERvdWJsZShmaWVsZFNsb3QtPmRhdGEuYnVmZmVyLm9mZnNldCk7CisjZW5kaWYKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBDdXJzb3JXaW5kb3c6OmdldE51bGwodW5zaWduZWQgaW50IHJvdywgdW5zaWduZWQgaW50IGNvbCwgYm9vbCAqIHZhbHVlT3V0KQoreworICAgIGZpZWxkX3Nsb3RfdCAqIGZpZWxkU2xvdCA9IGdldEZpZWxkU2xvdFdpdGhDaGVjayhyb3csIGNvbCk7CisgICAgaWYgKCFmaWVsZFNsb3QpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICAKKyAgICBpZiAoZmllbGRTbG90LT50eXBlICE9IEZJRUxEX1RZUEVfTlVMTCkgeworICAgICAgICAqdmFsdWVPdXQgPSBmYWxzZTsKKyAgICB9IGVsc2UgeworICAgICAgICAqdmFsdWVPdXQgPSB0cnVlOworICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKK30KKworfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2xpYnMvY2FtZXJhL0NhbWVyYS5jcHAgYi9saWJzL2NhbWVyYS9DYW1lcmEuY3BwCmluZGV4IDdlZmM2ZDcuLmI1Zjc4ZTggMTAwNjQ0Ci0tLSBhL2xpYnMvY2FtZXJhL0NhbWVyYS5jcHAKKysrIGIvbGlicy9jYW1lcmEvQ2FtZXJhLmNwcApAQCAtMTY3LDMyICsxNjcsMjAgQEAKICAgICByZXR1cm4gYy0+dW5sb2NrKCk7CiB9CiAKLS8vIHBhc3MgdGhlIGJ1ZmZlcmVkIElTdXJmYWNlIHRvIHRoZSBjYW1lcmEgc2VydmljZQorLy8gcGFzcyB0aGUgYnVmZmVyZWQgU3VyZmFjZSB0byB0aGUgY2FtZXJhIHNlcnZpY2UKIHN0YXR1c190IENhbWVyYTo6c2V0UHJldmlld0Rpc3BsYXkoY29uc3Qgc3A8U3VyZmFjZT4mIHN1cmZhY2UpCiB7Ci0gICAgTE9HVigic2V0UHJldmlld0Rpc3BsYXkiKTsKKyAgICBMT0dWKCJzZXRQcmV2aWV3RGlzcGxheSglcCkiLCBzdXJmYWNlLmdldCgpKTsKICAgICBzcCA8SUNhbWVyYT4gYyA9IG1DYW1lcmE7CiAgICAgaWYgKGMgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7CiAgICAgaWYgKHN1cmZhY2UgIT0gMCkgewotICAgICAgICByZXR1cm4gYy0+c2V0UHJldmlld0Rpc3BsYXkoc3VyZmFjZS0+Z2V0SVN1cmZhY2UoKSk7CisgICAgICAgIHJldHVybiBjLT5zZXRQcmV2aWV3RGlzcGxheShzdXJmYWNlKTsKICAgICB9IGVsc2UgewogICAgICAgICBMT0dEKCJhcHAgcGFzc2VkIE5VTEwgc3VyZmFjZSIpOwogICAgICAgICByZXR1cm4gYy0+c2V0UHJldmlld0Rpc3BsYXkoMCk7CiAgICAgfQogfQogCi1zdGF0dXNfdCBDYW1lcmE6OnNldFByZXZpZXdEaXNwbGF5KGNvbnN0IHNwPElTdXJmYWNlPiYgc3VyZmFjZSkKLXsKLSAgICBMT0dWKCJzZXRQcmV2aWV3RGlzcGxheSIpOwotICAgIGlmIChzdXJmYWNlID09IDApIHsKLSAgICAgICAgTE9HRCgiYXBwIHBhc3NlZCBOVUxMIHN1cmZhY2UiKTsKLSAgICB9Ci0gICAgc3AgPElDYW1lcmE+IGMgPSBtQ2FtZXJhOwotICAgIGlmIChjID09IDApIHJldHVybiBOT19JTklUOwotICAgIHJldHVybiBjLT5zZXRQcmV2aWV3RGlzcGxheShzdXJmYWNlKTsKLX0KLQotCiAvLyBzdGFydCBwcmV2aWV3IG1vZGUKIHN0YXR1c190IENhbWVyYTo6c3RhcnRQcmV2aWV3KCkKIHsKQEAgLTM3NSw0ICszNjMsMyBAQAogfQogCiB9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCmRpZmYgLS1naXQgYS9saWJzL2NhbWVyYS9JQ2FtZXJhLmNwcCBiL2xpYnMvY2FtZXJhL0lDYW1lcmEuY3BwCmluZGV4IDEzNjczYjUuLjk0ZGM1YzEgMTAwNjQ0Ci0tLSBhL2xpYnMvY2FtZXJhL0lDYW1lcmEuY3BwCisrKyBiL2xpYnMvY2FtZXJhL0lDYW1lcmEuY3BwCkBAIC02NCwxMyArNjQsMTMgQEAKICAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KERJU0NPTk5FQ1QsIGRhdGEsICZyZXBseSk7CiAgICAgfQogCi0gICAgLy8gcGFzcyB0aGUgYnVmZmVyZWQgSVN1cmZhY2UgdG8gdGhlIGNhbWVyYSBzZXJ2aWNlCi0gICAgc3RhdHVzX3Qgc2V0UHJldmlld0Rpc3BsYXkoY29uc3Qgc3A8SVN1cmZhY2U+JiBzdXJmYWNlKQorICAgIC8vIHBhc3MgdGhlIGJ1ZmZlcmVkIFN1cmZhY2UgdG8gdGhlIGNhbWVyYSBzZXJ2aWNlCisgICAgc3RhdHVzX3Qgc2V0UHJldmlld0Rpc3BsYXkoY29uc3Qgc3A8U3VyZmFjZT4mIHN1cmZhY2UpCiAgICAgewogICAgICAgICBMT0dWKCJzZXRQcmV2aWV3RGlzcGxheSIpOwogICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CiAgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQ2FtZXJhOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwotICAgICAgICBkYXRhLndyaXRlU3Ryb25nQmluZGVyKHN1cmZhY2UtPmFzQmluZGVyKCkpOworICAgICAgICBTdXJmYWNlOjp3cml0ZVRvUGFyY2VsKHN1cmZhY2UsICZkYXRhKTsKICAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KFNFVF9QUkVWSUVXX0RJU1BMQVksIGRhdGEsICZyZXBseSk7CiAgICAgICAgIHJldHVybiByZXBseS5yZWFkSW50MzIoKTsKICAgICB9CkBAIC0yNTgsNyArMjU4LDcgQEAKICAgICAgICAgY2FzZSBTRVRfUFJFVklFV19ESVNQTEFZOiB7CiAgICAgICAgICAgICBMT0dWKCJTRVRfUFJFVklFV19ESVNQTEFZIik7CiAgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUNhbWVyYSwgZGF0YSwgcmVwbHkpOwotICAgICAgICAgICAgc3A8SVN1cmZhY2U+IHN1cmZhY2UgPSBpbnRlcmZhY2VfY2FzdDxJU3VyZmFjZT4oZGF0YS5yZWFkU3Ryb25nQmluZGVyKCkpOworICAgICAgICAgICAgc3A8U3VyZmFjZT4gc3VyZmFjZSA9IFN1cmZhY2U6OnJlYWRGcm9tUGFyY2VsKGRhdGEpOwogICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc2V0UHJldmlld0Rpc3BsYXkoc3VyZmFjZSkpOwogICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwogICAgICAgICB9IGJyZWFrOwpAQCAtMzc2LDQgKzM3NiwzIEBACiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKIH07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KZGlmZiAtLWdpdCBhL2xpYnMvaHd1aS9BbmRyb2lkLm1rIGIvbGlicy9od3VpL0FuZHJvaWQubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDQ2OTUwOAotLS0gL2Rldi9udWxsCisrKyBiL2xpYnMvaHd1aS9BbmRyb2lkLm1rCkBAIC0wLDAgKzEsNDMgQEAKK0xPQ0FMX1BBVEg6PSAkKGNhbGwgbXktZGlyKQoraW5jbHVkZSAkKENMRUFSX1ZBUlMpCisKKyMgT25seSBidWlsZCBsaWJod3VpIHdoZW4gVVNFX09QRU5HTF9SRU5ERVJFUiBpcworIyBkZWZpbmVkIGluIHRoZSBjdXJyZW50IGRldmljZS9ib2FyZCBjb25maWd1cmF0aW9uCitpZmVxICgkKFVTRV9PUEVOR0xfUkVOREVSRVIpLHRydWUpCisJTE9DQUxfU1JDX0ZJTEVTOj0gXAorCQlGb250UmVuZGVyZXIuY3BwIFwKKwkJR2FtbWFGb250UmVuZGVyZXIuY3BwIFwKKwkJR3JhZGllbnRDYWNoZS5jcHAgXAorCQlMYXllckNhY2hlLmNwcCBcCisJCU1hdHJpeC5jcHAgXAorCQlPcGVuR0xSZW5kZXJlci5jcHAgXAorCQlQYXRjaC5jcHAgXAorCQlQYXRjaENhY2hlLmNwcCBcCisJCVBhdGhDYWNoZS5jcHAgXAorCQlQcm9ncmFtLmNwcCBcCisJCVByb2dyYW1DYWNoZS5jcHAgXAorCQlTa2lhQ29sb3JGaWx0ZXIuY3BwIFwKKwkJU2tpYVNoYWRlci5jcHAgXAorCQlUZXh0dXJlQ2FjaGUuY3BwIFwKKwkJVGV4dERyb3BTaGFkb3dDYWNoZS5jcHAKKwkKKwlMT0NBTF9DX0lOQ0xVREVTICs9IFwKKwkJJChKTklfSF9JTkNMVURFKSBcCisJCSQoTE9DQUxfUEFUSCkvLi4vLi4vaW5jbHVkZS91dGlscyBcCisJCWV4dGVybmFsL3NraWEvaW5jbHVkZS9jb3JlIFwKKwkJZXh0ZXJuYWwvc2tpYS9pbmNsdWRlL2VmZmVjdHMgXAorCQlleHRlcm5hbC9za2lhL2luY2x1ZGUvaW1hZ2VzIFwKKwkJZXh0ZXJuYWwvc2tpYS9zcmMvcG9ydHMgXAorCQlleHRlcm5hbC9za2lhL2luY2x1ZGUvdXRpbHMKKworCUxPQ0FMX0NGTEFHUyArPSAtRFVTRV9PUEVOR0xfUkVOREVSRVIKKwlMT0NBTF9NT0RVTEVfQ0xBU1MgOj0gU0hBUkVEX0xJQlJBUklFUworCUxPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gbGliY3V0aWxzIGxpYnV0aWxzIGxpYkdMRVN2MiBsaWJza2lhCisJTE9DQUxfTU9EVUxFIDo9IGxpYmh3dWkKKwlMT0NBTF9NT0RVTEVfVEFHUyA6PSBvcHRpb25hbAorCUxPQ0FMX1BSRUxJTktfTU9EVUxFIDo9IGZhbHNlCisJCisJaW5jbHVkZSAkKEJVSUxEX1NIQVJFRF9MSUJSQVJZKQorCisgICAgaW5jbHVkZSAkKGNhbGwgYWxsLW1ha2VmaWxlcy11bmRlciwkKExPQ0FMX1BBVEgpKQorZW5kaWYKZGlmZiAtLWdpdCBhL2xpYnMvaHd1aS9DYWNoZXMuaCBiL2xpYnMvaHd1aS9DYWNoZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YzY3ODg1Ci0tLSAvZGV2L251bGwKKysrIGIvbGlicy9od3VpL0NhY2hlcy5oCkBAIC0wLDAgKzEsNzggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfVUlfQ0FDSEVTX0gKKyNkZWZpbmUgQU5EUk9JRF9VSV9DQUNIRVNfSAorCisjaWZuZGVmIExPR19UQUcKKyAgICAjZGVmaW5lIExPR19UQUcgIk9wZW5HTFJlbmRlcmVyIgorI2VuZGlmCisKKyNpbmNsdWRlIDx1dGlscy9TaW5nbGV0b24uaD4KKworI2luY2x1ZGUgIlRleHR1cmVDYWNoZS5oIgorI2luY2x1ZGUgIkxheWVyQ2FjaGUuaCIKKyNpbmNsdWRlICJHcmFkaWVudENhY2hlLmgiCisjaW5jbHVkZSAiUGF0Y2hDYWNoZS5oIgorI2luY2x1ZGUgIkdhbW1hRm9udFJlbmRlcmVyLmgiCisjaW5jbHVkZSAiUHJvZ3JhbUNhY2hlLmgiCisjaW5jbHVkZSAiUGF0aENhY2hlLmgiCisjaW5jbHVkZSAiVGV4dERyb3BTaGFkb3dDYWNoZS5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgdWlyZW5kZXJlciB7CisKK3N0cnVjdCBDYWNoZUxvZ2dlciB7CisgICAgQ2FjaGVMb2dnZXIoKSB7CisgICAgICAgIExPR0QoIkNyZWF0aW5nIGNhY2hlcyIpOworICAgIH0KK307IC8vIHN0cnVjdCBDYWNoZUxvZ2dlcgorCitjbGFzcyBDYWNoZXM6IHB1YmxpYyBTaW5nbGV0b248Q2FjaGVzPiB7CisgICAgQ2FjaGVzKCk6IFNpbmdsZXRvbjxDYWNoZXM+KCksIGJsZW5kKGZhbHNlKSwgbGFzdFNyY01vZGUoR0xfWkVSTyksCisgICAgICAgICAgICBsYXN0RHN0TW9kZShHTF9aRVJPKSwgY3VycmVudFByb2dyYW0oTlVMTCkgeworICAgIH0KKworICAgIGZyaWVuZCBjbGFzcyBTaW5nbGV0b248Q2FjaGVzPjsKKworICAgIENhY2hlTG9nZ2VyIGxvZ2dlcjsKKworcHVibGljOgorICAgIGJvb2wgYmxlbmQ7CisgICAgR0xlbnVtIGxhc3RTcmNNb2RlOworICAgIEdMZW51bSBsYXN0RHN0TW9kZTsKKyAgICBQcm9ncmFtKiBjdXJyZW50UHJvZ3JhbTsKKworICAgIFRleHR1cmVDYWNoZSB0ZXh0dXJlQ2FjaGU7CisgICAgTGF5ZXJDYWNoZSBsYXllckNhY2hlOworICAgIEdyYWRpZW50Q2FjaGUgZ3JhZGllbnRDYWNoZTsKKyAgICBQcm9ncmFtQ2FjaGUgcHJvZ3JhbUNhY2hlOworICAgIFBhdGhDYWNoZSBwYXRoQ2FjaGU7CisgICAgUGF0Y2hDYWNoZSBwYXRjaENhY2hlOworICAgIFRleHREcm9wU2hhZG93Q2FjaGUgZHJvcFNoYWRvd0NhY2hlOworICAgIEdhbW1hRm9udFJlbmRlcmVyIGZvbnRSZW5kZXJlcjsKK307IC8vIGNsYXNzIENhY2hlcworCit9OyAvLyBuYW1lc3BhY2UgdWlyZW5kZXJlcgorCisjaWZkZWYgVVNFX09QRU5HTF9SRU5ERVJFUgordXNpbmcgbmFtZXNwYWNlIHVpcmVuZGVyZXI7CitBTkRST0lEX1NJTkdMRVRPTl9TVEFUSUNfSU5TVEFOQ0UoQ2FjaGVzKTsKKyNlbmRpZgorCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgLy8gQU5EUk9JRF9VSV9DQUNIRVNfSApkaWZmIC0tZ2l0IGEvbGlicy9od3VpL0V4dGVuc2lvbnMuaCBiL2xpYnMvaHd1aS9FeHRlbnNpb25zLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDUwZDM2ZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYnMvaHd1aS9FeHRlbnNpb25zLmgKQEAgLTAsMCArMSw5NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9VSV9FWFRFTlNJT05TX0gKKyNkZWZpbmUgQU5EUk9JRF9VSV9FWFRFTlNJT05TX0gKKworI2luY2x1ZGUgPHV0aWxzL1NvcnRlZFZlY3Rvci5oPgorI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KKworI2luY2x1ZGUgPEdMRVMyL2dsMi5oPgorI2luY2x1ZGUgPEdMRVMyL2dsMmV4dC5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgdWlyZW5kZXJlciB7CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIERlZmluZXMKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworLy8gRGVidWcKKyNkZWZpbmUgREVCVUdfRVhURU5TSU9OUyAwCisKKy8vIERlYnVnCisjaWYgREVCVUdfRVhURU5TSU9OUworICAgICNkZWZpbmUgRVhUX0xPR0QoLi4uKSBMT0dEKF9fVkFfQVJHU19fKQorI2Vsc2UKKyAgICAjZGVmaW5lIEVYVF9MT0dEKC4uLikKKyNlbmRpZgorCitjbGFzcyBFeHRlbnNpb25zIHsKK3B1YmxpYzoKKyAgICBFeHRlbnNpb25zKCkgeworICAgICAgICBjb25zdCBjaGFyKiBidWZmZXIgPSAoY29uc3QgY2hhciopIGdsR2V0U3RyaW5nKEdMX0VYVEVOU0lPTlMpOworICAgICAgICBjb25zdCBjaGFyKiBjdXJyZW50ID0gYnVmZmVyOworICAgICAgICBjb25zdCBjaGFyKiBoZWFkID0gY3VycmVudDsKKyAgICAgICAgRVhUX0xPR0QoIkF2YWlsYWJsZSBHTCBleHRlbnNpb25zOiIpOworICAgICAgICBkbyB7CisgICAgICAgICAgICBoZWFkID0gc3RyY2hyKGN1cnJlbnQsICcgJyk7CisgICAgICAgICAgICBTdHJpbmc4IHMoY3VycmVudCwgaGVhZCA/IGhlYWQgLSBjdXJyZW50IDogc3RybGVuKGN1cnJlbnQpKTsKKyAgICAgICAgICAgIGlmIChzLmxlbmd0aCgpKSB7CisgICAgICAgICAgICAgICAgbUV4dGVuc2lvbkxpc3QuYWRkKHMpOworICAgICAgICAgICAgICAgIEVYVF9MT0dEKCIgICVzIiwgcy5zdHJpbmcoKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjdXJyZW50ID0gaGVhZCArIDE7CisgICAgICAgIH0gd2hpbGUgKGhlYWQpOworCisgICAgICAgIG1IYXNOUG90ID0gaGFzRXh0ZW5zaW9uKCJHTF9PRVNfdGV4dHVyZV9ucG90Iik7CisgICAgICAgIG1IYXNEcmF3UGF0aCA9IGhhc0V4dGVuc2lvbigiR0xfTlZfZHJhd19wYXRoIik7CisgICAgICAgIG1IYXNDb3ZlcmFnZVNhbXBsZSA9IGhhc0V4dGVuc2lvbigiR0xfTlZfY292ZXJhZ2Vfc2FtcGxlIik7CisgICAgICAgIG1IYXNGcmFtZWJ1ZmZlckZldGNoID0gaGFzRXh0ZW5zaW9uKCJHTF9OVl9zaGFkZXJfZnJhbWVidWZmZXJfZmV0Y2giKTsKKworICAgICAgICBtRXh0ZW5zaW9ucyA9IGJ1ZmZlcjsKKyAgICB9CisKKyAgICBpbmxpbmUgYm9vbCBoYXNOUG90KCkgY29uc3QgeyByZXR1cm4gbUhhc05Qb3Q7IH0KKyAgICBpbmxpbmUgYm9vbCBoYXNEcmF3UGF0aCgpIGNvbnN0IHsgcmV0dXJuIG1IYXNEcmF3UGF0aDsgfQorICAgIGlubGluZSBib29sIGhhc0NvdmVyYWdlU2FtcGxlKCkgY29uc3QgeyByZXR1cm4gbUhhc0NvdmVyYWdlU2FtcGxlOyB9CisgICAgaW5saW5lIGJvb2wgaGFzRnJhbWVidWZmZXJGZXRjaCgpIGNvbnN0IHsgcmV0dXJuIG1IYXNGcmFtZWJ1ZmZlckZldGNoOyB9CisKKyAgICBib29sIGhhc0V4dGVuc2lvbihjb25zdCBjaGFyKiBleHRlbnNpb24pIGNvbnN0IHsKKyAgICAgICAgY29uc3QgU3RyaW5nOCBzKGV4dGVuc2lvbik7CisgICAgICAgIHJldHVybiBtRXh0ZW5zaW9uTGlzdC5pbmRleE9mKHMpID49IDA7CisgICAgfQorCisgICAgdm9pZCBkdW1wKCkgeworICAgICAgICBMT0dEKCJTdXBwb3J0ZWQgZXh0ZW5zaW9uczpcbiVzIiwgbUV4dGVuc2lvbnMpOworICAgIH0KKworcHJpdmF0ZToKKyAgICBTb3J0ZWRWZWN0b3I8U3RyaW5nOD4gbUV4dGVuc2lvbkxpc3Q7CisKKyAgICBjb25zdCBjaGFyKiBtRXh0ZW5zaW9uczsKKworICAgIGJvb2wgbUhhc05Qb3Q7CisgICAgYm9vbCBtSGFzRHJhd1BhdGg7CisgICAgYm9vbCBtSGFzQ292ZXJhZ2VTYW1wbGU7CisgICAgYm9vbCBtSGFzRnJhbWVidWZmZXJGZXRjaDsKK307IC8vIGNsYXNzIEV4dGVuc2lvbnMKKworfTsgLy8gbmFtZXNwYWNlIHVpcmVuZGVyZXIKK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAvLyBBTkRST0lEX1VJX0VYVEVOU0lPTlNfSApkaWZmIC0tZ2l0IGEvbGlicy9od3VpL0ZvbnRSZW5kZXJlci5jcHAgYi9saWJzL2h3dWkvRm9udFJlbmRlcmVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOTU5ODE0Ci0tLSAvZGV2L251bGwKKysrIGIvbGlicy9od3VpL0ZvbnRSZW5kZXJlci5jcHAKQEAgLTAsMCArMSw4MjggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIk9wZW5HTFJlbmRlcmVyIgorCisjaW5jbHVkZSA8U2tVdGlscy5oPgorCisjaW5jbHVkZSA8Y3V0aWxzL3Byb3BlcnRpZXMuaD4KKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgIkZvbnRSZW5kZXJlci5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgdWlyZW5kZXJlciB7CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIERlZmluZXMKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworI2RlZmluZSBERUZBVUxUX1RFWFRfQ0FDSEVfV0lEVEggMTAyNAorI2RlZmluZSBERUZBVUxUX1RFWFRfQ0FDSEVfSEVJR0hUIDI1NgorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBGb250CisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK0ZvbnQ6OkZvbnQoRm9udFJlbmRlcmVyKiBzdGF0ZSwgdWludDMyX3QgZm9udElkLCBmbG9hdCBmb250U2l6ZSkgOgorICAgIG1TdGF0ZShzdGF0ZSksIG1Gb250SWQoZm9udElkKSwgbUZvbnRTaXplKGZvbnRTaXplKSB7Cit9CisKKworRm9udDo6fkZvbnQoKSB7CisgICAgZm9yICh1aW50MzJfdCBjdCA9IDA7IGN0IDwgbVN0YXRlLT5tQWN0aXZlRm9udHMuc2l6ZSgpOyBjdCsrKSB7CisgICAgICAgIGlmIChtU3RhdGUtPm1BY3RpdmVGb250c1tjdF0gPT0gdGhpcykgeworICAgICAgICAgICAgbVN0YXRlLT5tQWN0aXZlRm9udHMucmVtb3ZlQXQoY3QpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgbUNhY2hlZEdseXBocy5zaXplKCk7IGkrKykgeworICAgICAgICBDYWNoZWRHbHlwaEluZm8qIGdseXBoID0gbUNhY2hlZEdseXBocy52YWx1ZUF0KGkpOworICAgICAgICBkZWxldGUgZ2x5cGg7CisgICAgfQorfQorCit2b2lkIEZvbnQ6OmludmFsaWRhdGVUZXh0dXJlQ2FjaGUoKSB7CisgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IG1DYWNoZWRHbHlwaHMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgbUNhY2hlZEdseXBocy52YWx1ZUF0KGkpLT5tSXNWYWxpZCA9IGZhbHNlOworICAgIH0KK30KKwordm9pZCBGb250OjptZWFzdXJlQ2FjaGVkR2x5cGgoQ2FjaGVkR2x5cGhJbmZvICpnbHlwaCwgaW50IHgsIGludCB5LCBSZWN0ICpib3VuZHMpIHsKKyAgICBpbnQgblBlblggPSB4ICsgZ2x5cGgtPm1CaXRtYXBMZWZ0OworICAgIGludCBuUGVuWSA9IHkgKyBnbHlwaC0+bUJpdG1hcFRvcDsKKworICAgIGludCB3aWR0aCA9IChpbnQpIGdseXBoLT5tQml0bWFwV2lkdGg7CisgICAgaW50IGhlaWdodCA9IChpbnQpIGdseXBoLT5tQml0bWFwSGVpZ2h0OworCisgICAgaWYgKGJvdW5kcy0+Ym90dG9tID4gblBlblkpIHsKKyAgICAgICAgYm91bmRzLT5ib3R0b20gPSBuUGVuWTsKKyAgICB9CisgICAgaWYgKGJvdW5kcy0+bGVmdCA+IG5QZW5YKSB7CisgICAgICAgIGJvdW5kcy0+bGVmdCA9IG5QZW5YOworICAgIH0KKyAgICBpZiAoYm91bmRzLT5yaWdodCA8IG5QZW5YICsgd2lkdGgpIHsKKyAgICAgICAgYm91bmRzLT5yaWdodCA9IG5QZW5YICsgd2lkdGg7CisgICAgfQorICAgIGlmIChib3VuZHMtPnRvcCA8IG5QZW5ZICsgaGVpZ2h0KSB7CisgICAgICAgIGJvdW5kcy0+dG9wID0gblBlblkgKyBoZWlnaHQ7CisgICAgfQorfQorCit2b2lkIEZvbnQ6OmRyYXdDYWNoZWRHbHlwaChDYWNoZWRHbHlwaEluZm8qIGdseXBoLCBpbnQgeCwgaW50IHkpIHsKKyAgICBpbnQgblBlblggPSB4ICsgZ2x5cGgtPm1CaXRtYXBMZWZ0OworICAgIGludCBuUGVuWSA9IHkgKyBnbHlwaC0+bUJpdG1hcFRvcCArIGdseXBoLT5tQml0bWFwSGVpZ2h0OworCisgICAgZmxvYXQgdTEgPSBnbHlwaC0+bUJpdG1hcE1pblU7CisgICAgZmxvYXQgdTIgPSBnbHlwaC0+bUJpdG1hcE1heFU7CisgICAgZmxvYXQgdjEgPSBnbHlwaC0+bUJpdG1hcE1pblY7CisgICAgZmxvYXQgdjIgPSBnbHlwaC0+bUJpdG1hcE1heFY7CisKKyAgICBpbnQgd2lkdGggPSAoaW50KSBnbHlwaC0+bUJpdG1hcFdpZHRoOworICAgIGludCBoZWlnaHQgPSAoaW50KSBnbHlwaC0+bUJpdG1hcEhlaWdodDsKKworICAgIG1TdGF0ZS0+YXBwZW5kTWVzaFF1YWQoblBlblgsIG5QZW5ZLCAwLCB1MSwgdjIsCisgICAgICAgICAgICBuUGVuWCArIHdpZHRoLCBuUGVuWSwgMCwgdTIsIHYyLAorICAgICAgICAgICAgblBlblggKyB3aWR0aCwgblBlblkgLSBoZWlnaHQsIDAsIHUyLCB2MSwKKyAgICAgICAgICAgIG5QZW5YLCBuUGVuWSAtIGhlaWdodCwgMCwgdTEsIHYxKTsKK30KKwordm9pZCBGb250OjpkcmF3Q2FjaGVkR2x5cGgoQ2FjaGVkR2x5cGhJbmZvKiBnbHlwaCwgaW50IHgsIGludCB5LAorICAgICAgICB1aW50OF90KiBiaXRtYXAsIHVpbnQzMl90IGJpdG1hcFcsIHVpbnQzMl90IGJpdG1hcEgpIHsKKyAgICBpbnQgblBlblggPSB4ICsgZ2x5cGgtPm1CaXRtYXBMZWZ0OworICAgIGludCBuUGVuWSA9IHkgKyBnbHlwaC0+bUJpdG1hcFRvcDsKKworICAgIHVpbnQzMl90IGVuZFggPSBnbHlwaC0+bVN0YXJ0WCArIGdseXBoLT5tQml0bWFwV2lkdGg7CisgICAgdWludDMyX3QgZW5kWSA9IGdseXBoLT5tU3RhcnRZICsgZ2x5cGgtPm1CaXRtYXBIZWlnaHQ7CisKKyAgICB1aW50MzJfdCBjYWNoZVdpZHRoID0gbVN0YXRlLT5nZXRDYWNoZVdpZHRoKCk7CisgICAgY29uc3QgdWludDhfdCogY2FjaGVCdWZmZXIgPSBtU3RhdGUtPmdldFRleHRUZXh0dXJlRGF0YSgpOworCisgICAgdWludDMyX3QgY2FjaGVYID0gMCwgY2FjaGVZID0gMDsKKyAgICBpbnQzMl90IGJYID0gMCwgYlkgPSAwOworICAgIGZvciAoY2FjaGVYID0gZ2x5cGgtPm1TdGFydFgsIGJYID0gblBlblg7IGNhY2hlWCA8IGVuZFg7IGNhY2hlWCsrLCBiWCsrKSB7CisgICAgICAgIGZvciAoY2FjaGVZID0gZ2x5cGgtPm1TdGFydFksIGJZID0gblBlblk7IGNhY2hlWSA8IGVuZFk7IGNhY2hlWSsrLCBiWSsrKSB7CisgICAgICAgICAgICBpZiAoYlggPCAwIHx8IGJZIDwgMCB8fCBiWCA+PSAoaW50MzJfdCkgYml0bWFwVyB8fCBiWSA+PSAoaW50MzJfdCkgYml0bWFwSCkgeworICAgICAgICAgICAgICAgIExPR0UoIlNraXBwaW5nIGludmFsaWQgaW5kZXgiKTsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHVpbnQ4X3QgdGVtcENvbCA9IGNhY2hlQnVmZmVyW2NhY2hlWSAqIGNhY2hlV2lkdGggKyBjYWNoZVhdOworICAgICAgICAgICAgYml0bWFwW2JZICogYml0bWFwVyArIGJYXSA9IHRlbXBDb2w7CisgICAgICAgIH0KKyAgICB9CisKK30KKworRm9udDo6Q2FjaGVkR2x5cGhJbmZvKiBGb250OjpnZXRDYWNoZWRVVEZDaGFyKFNrUGFpbnQqIHBhaW50LCBpbnQzMl90IHV0ZkNoYXIpIHsKKyAgICBDYWNoZWRHbHlwaEluZm8qIGNhY2hlZEdseXBoID0gTlVMTDsKKyAgICBzc2l6ZV90IGluZGV4ID0gbUNhY2hlZEdseXBocy5pbmRleE9mS2V5KHV0ZkNoYXIpOworICAgIGlmIChpbmRleCA+PSAwKSB7CisgICAgICAgIGNhY2hlZEdseXBoID0gbUNhY2hlZEdseXBocy52YWx1ZUF0KGluZGV4KTsKKyAgICB9IGVsc2UgeworICAgICAgICBjYWNoZWRHbHlwaCA9IGNhY2hlR2x5cGgocGFpbnQsIHV0ZkNoYXIpOworICAgIH0KKworICAgIC8vIElzIHRoZSBnbHlwaCBzdGlsbCBpbiB0ZXh0dXJlIGNhY2hlPworICAgIGlmICghY2FjaGVkR2x5cGgtPm1Jc1ZhbGlkKSB7CisgICAgICAgIGNvbnN0IFNrR2x5cGgmIHNraWFHbHlwaCA9IHBhaW50LT5nZXRVbmljaGFyTWV0cmljcyh1dGZDaGFyKTsKKyAgICAgICAgdXBkYXRlR2x5cGhDYWNoZShwYWludCwgc2tpYUdseXBoLCBjYWNoZWRHbHlwaCk7CisgICAgfQorCisgICAgcmV0dXJuIGNhY2hlZEdseXBoOworfQorCit2b2lkIEZvbnQ6OnJlbmRlclVURihTa1BhaW50KiBwYWludCwgY29uc3QgY2hhciogdGV4dCwgdWludDMyX3Qgc3RhcnQsIHVpbnQzMl90IGxlbiwKKyAgICAgICAgaW50IG51bUdseXBocywgaW50IHgsIGludCB5LCB1aW50OF90ICpiaXRtYXAsIHVpbnQzMl90IGJpdG1hcFcsIHVpbnQzMl90IGJpdG1hcEgpIHsKKyAgICBpZiAoYml0bWFwICE9IE5VTEwgJiYgYml0bWFwVyA+IDAgJiYgYml0bWFwSCA+IDApIHsKKyAgICAgICAgcmVuZGVyVVRGKHBhaW50LCB0ZXh0LCBzdGFydCwgbGVuLCBudW1HbHlwaHMsIHgsIHksIEJJVE1BUCwgYml0bWFwLAorICAgICAgICAgICAgICAgIGJpdG1hcFcsIGJpdG1hcEgsIE5VTEwpOworICAgIH0gZWxzZSB7CisgICAgICAgIHJlbmRlclVURihwYWludCwgdGV4dCwgc3RhcnQsIGxlbiwgbnVtR2x5cGhzLCB4LCB5LCBGUkFNRUJVRkZFUiwgTlVMTCwgMCwgMCwgTlVMTCk7CisgICAgfQorCit9CisKK3ZvaWQgRm9udDo6bWVhc3VyZVVURihTa1BhaW50KiBwYWludCwgY29uc3QgY2hhciogdGV4dCwgdWludDMyX3Qgc3RhcnQsIHVpbnQzMl90IGxlbiwKKyAgICAgICAgaW50IG51bUdseXBocywgUmVjdCAqYm91bmRzKSB7CisgICAgaWYgKGJvdW5kcyA9PSBOVUxMKSB7CisgICAgICAgIExPR0UoIk5vIHJldHVybiByZWN0YW5nbGUgcHJvdmlkZWQgdG8gbWVhc3VyZSB0ZXh0Iik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgYm91bmRzLT5zZXQoMWU2LCAtMWU2LCAtMWU2LCAxZTYpOworICAgIHJlbmRlclVURihwYWludCwgdGV4dCwgc3RhcnQsIGxlbiwgbnVtR2x5cGhzLCAwLCAwLCBNRUFTVVJFLCBOVUxMLCAwLCAwLCBib3VuZHMpOworfQorCisjZGVmaW5lIFNrQXV0b0tlcm5fQWRqdXN0RihwcmV2LCBuZXh0KSAoKChuZXh0KSAtIChwcmV2KSArIDMyKSA+PiA2IDw8IDE2KQorCit2b2lkIEZvbnQ6OnJlbmRlclVURihTa1BhaW50KiBwYWludCwgY29uc3QgY2hhciogdGV4dCwgdWludDMyX3Qgc3RhcnQsIHVpbnQzMl90IGxlbiwKKyAgICAgICAgaW50IG51bUdseXBocywgaW50IHgsIGludCB5LCBSZW5kZXJNb2RlIG1vZGUsIHVpbnQ4X3QgKmJpdG1hcCwKKyAgICAgICAgdWludDMyX3QgYml0bWFwVywgdWludDMyX3QgYml0bWFwSCxSZWN0ICpib3VuZHMpIHsKKyAgICBpZiAobnVtR2x5cGhzID09IDAgfHwgdGV4dCA9PSBOVUxMIHx8IGxlbiA9PSAwKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBTa0ZpeGVkIHBlblggPSBTa0ludFRvRml4ZWQoeCk7CisgICAgaW50IHBlblkgPSB5OworICAgIGludCBnbHlwaHNMZWZ0ID0gMTsKKyAgICBpZiAobnVtR2x5cGhzID4gMCkgeworICAgICAgICBnbHlwaHNMZWZ0ID0gbnVtR2x5cGhzOworICAgIH0KKworICAgIFNrRml4ZWQgcHJldlJzYkRlbHRhID0gMDsKKyAgICBwZW5YICs9IFNLX0ZpeGVkMSAvIDI7CisKKyAgICB0ZXh0ICs9IHN0YXJ0OworCisgICAgd2hpbGUgKGdseXBoc0xlZnQgPiAwKSB7CisgICAgICAgIGludDMyX3QgdXRmQ2hhciA9IFNrVVRGMTZfTmV4dFVuaWNoYXIoKGNvbnN0IHVpbnQxNl90KiopICZ0ZXh0KTsKKworICAgICAgICAvLyBSZWFjaGVkIHRoZSBlbmQgb2YgdGhlIHN0cmluZworICAgICAgICBpZiAodXRmQ2hhciA8IDApIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgQ2FjaGVkR2x5cGhJbmZvKiBjYWNoZWRHbHlwaCA9IGdldENhY2hlZFVURkNoYXIocGFpbnQsIHV0ZkNoYXIpOworICAgICAgICBwZW5YICs9IFNrQXV0b0tlcm5fQWRqdXN0RihwcmV2UnNiRGVsdGEsIGNhY2hlZEdseXBoLT5tTHNiRGVsdGEpOworICAgICAgICBwcmV2UnNiRGVsdGEgPSBjYWNoZWRHbHlwaC0+bVJzYkRlbHRhOworCisgICAgICAgIC8vIElmIGl0J3Mgc3RpbGwgbm90IHZhbGlkLCB3ZSBjb3VsZG4ndCBjYWNoZSBpdCwgc28gd2Ugc2hvdWxkbid0IGRyYXcgZ2FyYmFnZQorICAgICAgICBpZiAoY2FjaGVkR2x5cGgtPm1Jc1ZhbGlkKSB7CisgICAgICAgICAgICBzd2l0Y2gobW9kZSkgeworICAgICAgICAgICAgY2FzZSBGUkFNRUJVRkZFUjoKKyAgICAgICAgICAgICAgICBkcmF3Q2FjaGVkR2x5cGgoY2FjaGVkR2x5cGgsIFNrRml4ZWRGbG9vcihwZW5YKSwgcGVuWSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJJVE1BUDoKKyAgICAgICAgICAgICAgICBkcmF3Q2FjaGVkR2x5cGgoY2FjaGVkR2x5cGgsIFNrRml4ZWRGbG9vcihwZW5YKSwgcGVuWSwgYml0bWFwLCBiaXRtYXBXLCBiaXRtYXBIKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgTUVBU1VSRToKKyAgICAgICAgICAgICAgICBtZWFzdXJlQ2FjaGVkR2x5cGgoY2FjaGVkR2x5cGgsIFNrRml4ZWRGbG9vcihwZW5YKSwgcGVuWSwgYm91bmRzKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHBlblggKz0gY2FjaGVkR2x5cGgtPm1BZHZhbmNlWDsKKworICAgICAgICAvLyBJZiB3ZSB3ZXJlIGdpdmVuIGEgc3BlY2lmaWMgbnVtYmVyIG9mIGdseXBocywgZGVjcmVtZW50CisgICAgICAgIGlmIChudW1HbHlwaHMgPiAwKSB7CisgICAgICAgICAgICBnbHlwaHNMZWZ0LS07CisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQgRm9udDo6dXBkYXRlR2x5cGhDYWNoZShTa1BhaW50KiBwYWludCwgY29uc3QgU2tHbHlwaCYgc2tpYUdseXBoLCBDYWNoZWRHbHlwaEluZm8qIGdseXBoKSB7CisgICAgZ2x5cGgtPm1BZHZhbmNlWCA9IHNraWFHbHlwaC5mQWR2YW5jZVg7CisgICAgZ2x5cGgtPm1BZHZhbmNlWSA9IHNraWFHbHlwaC5mQWR2YW5jZVk7CisgICAgZ2x5cGgtPm1CaXRtYXBMZWZ0ID0gc2tpYUdseXBoLmZMZWZ0OworICAgIGdseXBoLT5tQml0bWFwVG9wID0gc2tpYUdseXBoLmZUb3A7CisgICAgZ2x5cGgtPm1Mc2JEZWx0YSA9IHNraWFHbHlwaC5mTHNiRGVsdGE7CisgICAgZ2x5cGgtPm1Sc2JEZWx0YSA9IHNraWFHbHlwaC5mUnNiRGVsdGE7CisKKyAgICB1aW50MzJfdCBzdGFydFggPSAwOworICAgIHVpbnQzMl90IHN0YXJ0WSA9IDA7CisKKyAgICAvLyBHZXQgdGhlIGJpdG1hcCBmb3IgdGhlIGdseXBoCisgICAgcGFpbnQtPmZpbmRJbWFnZShza2lhR2x5cGgpOworICAgIGdseXBoLT5tSXNWYWxpZCA9IG1TdGF0ZS0+Y2FjaGVCaXRtYXAoc2tpYUdseXBoLCAmc3RhcnRYLCAmc3RhcnRZKTsKKworICAgIGlmICghZ2x5cGgtPm1Jc1ZhbGlkKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICB1aW50MzJfdCBlbmRYID0gc3RhcnRYICsgc2tpYUdseXBoLmZXaWR0aDsKKyAgICB1aW50MzJfdCBlbmRZID0gc3RhcnRZICsgc2tpYUdseXBoLmZIZWlnaHQ7CisKKyAgICBnbHlwaC0+bVN0YXJ0WCA9IHN0YXJ0WDsKKyAgICBnbHlwaC0+bVN0YXJ0WSA9IHN0YXJ0WTsKKyAgICBnbHlwaC0+bUJpdG1hcFdpZHRoID0gc2tpYUdseXBoLmZXaWR0aDsKKyAgICBnbHlwaC0+bUJpdG1hcEhlaWdodCA9IHNraWFHbHlwaC5mSGVpZ2h0OworCisgICAgdWludDMyX3QgY2FjaGVXaWR0aCA9IG1TdGF0ZS0+Z2V0Q2FjaGVXaWR0aCgpOworICAgIHVpbnQzMl90IGNhY2hlSGVpZ2h0ID0gbVN0YXRlLT5nZXRDYWNoZUhlaWdodCgpOworCisgICAgZ2x5cGgtPm1CaXRtYXBNaW5VID0gKGZsb2F0KSBzdGFydFggLyAoZmxvYXQpIGNhY2hlV2lkdGg7CisgICAgZ2x5cGgtPm1CaXRtYXBNaW5WID0gKGZsb2F0KSBzdGFydFkgLyAoZmxvYXQpIGNhY2hlSGVpZ2h0OworICAgIGdseXBoLT5tQml0bWFwTWF4VSA9IChmbG9hdCkgZW5kWCAvIChmbG9hdCkgY2FjaGVXaWR0aDsKKyAgICBnbHlwaC0+bUJpdG1hcE1heFYgPSAoZmxvYXQpIGVuZFkgLyAoZmxvYXQpIGNhY2hlSGVpZ2h0OworCisgICAgbVN0YXRlLT5tVXBsb2FkVGV4dHVyZSA9IHRydWU7Cit9CisKK0ZvbnQ6OkNhY2hlZEdseXBoSW5mbyogRm9udDo6Y2FjaGVHbHlwaChTa1BhaW50KiBwYWludCwgaW50MzJfdCBnbHlwaCkgeworICAgIENhY2hlZEdseXBoSW5mbyogbmV3R2x5cGggPSBuZXcgQ2FjaGVkR2x5cGhJbmZvKCk7CisgICAgbUNhY2hlZEdseXBocy5hZGQoZ2x5cGgsIG5ld0dseXBoKTsKKworICAgIGNvbnN0IFNrR2x5cGgmIHNraWFHbHlwaCA9IHBhaW50LT5nZXRVbmljaGFyTWV0cmljcyhnbHlwaCk7CisgICAgbmV3R2x5cGgtPm1HbHlwaEluZGV4ID0gc2tpYUdseXBoLmZJRDsKKyAgICBuZXdHbHlwaC0+bUlzVmFsaWQgPSBmYWxzZTsKKworICAgIHVwZGF0ZUdseXBoQ2FjaGUocGFpbnQsIHNraWFHbHlwaCwgbmV3R2x5cGgpOworCisgICAgcmV0dXJuIG5ld0dseXBoOworfQorCitGb250KiBGb250OjpjcmVhdGUoRm9udFJlbmRlcmVyKiBzdGF0ZSwgdWludDMyX3QgZm9udElkLCBmbG9hdCBmb250U2l6ZSkgeworICAgIFZlY3RvcjxGb250Kj4gJmFjdGl2ZUZvbnRzID0gc3RhdGUtPm1BY3RpdmVGb250czsKKworICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBhY3RpdmVGb250cy5zaXplKCk7IGkrKykgeworICAgICAgICBGb250KiBmb250ID0gYWN0aXZlRm9udHNbaV07CisgICAgICAgIGlmIChmb250LT5tRm9udElkID09IGZvbnRJZCAmJiBmb250LT5tRm9udFNpemUgPT0gZm9udFNpemUpIHsKKyAgICAgICAgICAgIHJldHVybiBmb250OworICAgICAgICB9CisgICAgfQorCisgICAgRm9udCogbmV3Rm9udCA9IG5ldyBGb250KHN0YXRlLCBmb250SWQsIGZvbnRTaXplKTsKKyAgICBhY3RpdmVGb250cy5wdXNoKG5ld0ZvbnQpOworICAgIHJldHVybiBuZXdGb250OworfQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBGb250UmVuZGVyZXIKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworRm9udFJlbmRlcmVyOjpGb250UmVuZGVyZXIoKSB7CisgICAgTE9HRCgiQ3JlYXRpbmcgRm9udFJlbmRlcmVyIik7CisKKyAgICBtR2FtbWFUYWJsZSA9IE5VTEw7CisgICAgbUluaXRpYWxpemVkID0gZmFsc2U7CisgICAgbU1heE51bWJlck9mUXVhZHMgPSAxMDI0OworICAgIG1DdXJyZW50UXVhZEluZGV4ID0gMDsKKyAgICBtVGV4dHVyZUlkID0gMDsKKworICAgIG1UZXh0TWVzaFB0ciA9IE5VTEw7CisgICAgbVRleHRUZXh0dXJlID0gTlVMTDsKKworICAgIG1JbmRleEJ1ZmZlcklEID0gMDsKKworICAgIG1DYWNoZVdpZHRoID0gREVGQVVMVF9URVhUX0NBQ0hFX1dJRFRIOworICAgIG1DYWNoZUhlaWdodCA9IERFRkFVTFRfVEVYVF9DQUNIRV9IRUlHSFQ7CisKKyAgICBjaGFyIHByb3BlcnR5W1BST1BFUlRZX1ZBTFVFX01BWF07CisgICAgaWYgKHByb3BlcnR5X2dldChQUk9QRVJUWV9URVhUX0NBQ0hFX1dJRFRILCBwcm9wZXJ0eSwgTlVMTCkgPiAwKSB7CisgICAgICAgIExPR0QoIiAgU2V0dGluZyB0ZXh0IGNhY2hlIHdpZHRoIHRvICVzIHBpeGVscyIsIHByb3BlcnR5KTsKKyAgICAgICAgbUNhY2hlV2lkdGggPSBhdG9pKHByb3BlcnR5KTsKKyAgICB9IGVsc2UgeworICAgICAgICBMT0dEKCIgIFVzaW5nIGRlZmF1bHQgdGV4dCBjYWNoZSB3aWR0aCBvZiAlaSBwaXhlbHMiLCBtQ2FjaGVXaWR0aCk7CisgICAgfQorCisgICAgaWYgKHByb3BlcnR5X2dldChQUk9QRVJUWV9URVhUX0NBQ0hFX0hFSUdIVCwgcHJvcGVydHksIE5VTEwpID4gMCkgeworICAgICAgICBMT0dEKCIgIFNldHRpbmcgdGV4dCBjYWNoZSB3aWR0aCB0byAlcyBwaXhlbHMiLCBwcm9wZXJ0eSk7CisgICAgICAgIG1DYWNoZUhlaWdodCA9IGF0b2kocHJvcGVydHkpOworICAgIH0gZWxzZSB7CisgICAgICAgIExPR0QoIiAgVXNpbmcgZGVmYXVsdCB0ZXh0IGNhY2hlIGhlaWdodCBvZiAlaSBwaXhlbHMiLCBtQ2FjaGVIZWlnaHQpOworICAgIH0KK30KKworRm9udFJlbmRlcmVyOjp+Rm9udFJlbmRlcmVyKCkgeworICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBtQ2FjaGVMaW5lcy5zaXplKCk7IGkrKykgeworICAgICAgICBkZWxldGUgbUNhY2hlTGluZXNbaV07CisgICAgfQorICAgIG1DYWNoZUxpbmVzLmNsZWFyKCk7CisKKyAgICBpZiAobUluaXRpYWxpemVkKSB7CisgICAgICAgIGRlbGV0ZVtdIG1UZXh0TWVzaFB0cjsKKyAgICAgICAgZGVsZXRlW10gbVRleHRUZXh0dXJlOworICAgIH0KKworICAgIGlmIChtVGV4dHVyZUlkKSB7CisgICAgICAgIGdsRGVsZXRlVGV4dHVyZXMoMSwgJm1UZXh0dXJlSWQpOworICAgIH0KKworICAgIFZlY3RvcjxGb250Kj4gZm9udHNUb0RlcmVmZXJlbmNlID0gbUFjdGl2ZUZvbnRzOworICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBmb250c1RvRGVyZWZlcmVuY2Uuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgZGVsZXRlIGZvbnRzVG9EZXJlZmVyZW5jZVtpXTsKKyAgICB9Cit9CisKK3ZvaWQgRm9udFJlbmRlcmVyOjpmbHVzaEFsbEFuZEludmFsaWRhdGUoKSB7CisgICAgaWYgKG1DdXJyZW50UXVhZEluZGV4ICE9IDApIHsKKyAgICAgICAgaXNzdWVEcmF3Q29tbWFuZCgpOworICAgICAgICBtQ3VycmVudFF1YWRJbmRleCA9IDA7CisgICAgfQorICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBtQWN0aXZlRm9udHMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgbUFjdGl2ZUZvbnRzW2ldLT5pbnZhbGlkYXRlVGV4dHVyZUNhY2hlKCk7CisgICAgfQorICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBtQ2FjaGVMaW5lcy5zaXplKCk7IGkrKykgeworICAgICAgICBtQ2FjaGVMaW5lc1tpXS0+bUN1cnJlbnRDb2wgPSAwOworICAgIH0KK30KKworYm9vbCBGb250UmVuZGVyZXI6OmNhY2hlQml0bWFwKGNvbnN0IFNrR2x5cGgmIGdseXBoLCB1aW50MzJfdCogcmV0T3JpZ2luWCwgdWludDMyX3QqIHJldE9yaWdpblkpIHsKKyAgICAvLyBJZiB0aGUgZ2x5cGggaXMgdG9vIHRhbGwsIGRvbid0IGNhY2hlIGl0CisgICAgaWYgKGdseXBoLmZIZWlnaHQgPiBtQ2FjaGVMaW5lc1ttQ2FjaGVMaW5lcy5zaXplKCkgLSAxXS0+bU1heEhlaWdodCkgeworICAgICAgICBMT0dFKCJGb250IHNpemUgdG8gbGFyZ2UgdG8gZml0IGluIGNhY2hlLiB3aWR0aCwgaGVpZ2h0ID0gJWksICVpIiwKKyAgICAgICAgICAgICAgICAoaW50KSBnbHlwaC5mV2lkdGgsIChpbnQpIGdseXBoLmZIZWlnaHQpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLy8gTm93IGNvcHkgdGhlIGJpdG1hcCBpbnRvIHRoZSBjYWNoZSB0ZXh0dXJlCisgICAgdWludDMyX3Qgc3RhcnRYID0gMDsKKyAgICB1aW50MzJfdCBzdGFydFkgPSAwOworCisgICAgYm9vbCBiaXRtYXBGaXQgPSBmYWxzZTsKKyAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgbUNhY2hlTGluZXMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgYml0bWFwRml0ID0gbUNhY2hlTGluZXNbaV0tPmZpdEJpdG1hcChnbHlwaCwgJnN0YXJ0WCwgJnN0YXJ0WSk7CisgICAgICAgIGlmIChiaXRtYXBGaXQpIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gSWYgdGhlIG5ldyBnbHlwaCBkaWRuJ3QgZml0LCBmbHVzaCB0aGUgc3RhdGUgc28gZmFyIGFuZCBpbnZhbGlkYXRlIGV2ZXJ5dGhpbmcKKyAgICBpZiAoIWJpdG1hcEZpdCkgeworICAgICAgICBmbHVzaEFsbEFuZEludmFsaWRhdGUoKTsKKworICAgICAgICAvLyBUcnkgdG8gZml0IGl0IGFnYWluCisgICAgICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBtQ2FjaGVMaW5lcy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgYml0bWFwRml0ID0gbUNhY2hlTGluZXNbaV0tPmZpdEJpdG1hcChnbHlwaCwgJnN0YXJ0WCwgJnN0YXJ0WSk7CisgICAgICAgICAgICBpZiAoYml0bWFwRml0KSB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBpZiB3ZSBzdGlsbCBkb24ndCBmaXQsIHNvbWV0aGluZyBpcyB3cm9uZyBhbmQgd2Ugc2hvdWxkbid0IGRyYXcKKyAgICAgICAgaWYgKCFiaXRtYXBGaXQpIHsKKyAgICAgICAgICAgIExPR0UoIkJpdG1hcCBkb2Vzbid0IGZpdCBpbiBjYWNoZS4gd2lkdGgsIGhlaWdodCA9ICVpLCAlaSIsCisgICAgICAgICAgICAgICAgICAgIChpbnQpIGdseXBoLmZXaWR0aCwgKGludCkgZ2x5cGguZkhlaWdodCk7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAqcmV0T3JpZ2luWCA9IHN0YXJ0WDsKKyAgICAqcmV0T3JpZ2luWSA9IHN0YXJ0WTsKKworICAgIHVpbnQzMl90IGVuZFggPSBzdGFydFggKyBnbHlwaC5mV2lkdGg7CisgICAgdWludDMyX3QgZW5kWSA9IHN0YXJ0WSArIGdseXBoLmZIZWlnaHQ7CisKKyAgICB1aW50MzJfdCBjYWNoZVdpZHRoID0gbUNhY2hlV2lkdGg7CisKKyAgICB1aW50OF90KiBjYWNoZUJ1ZmZlciA9IG1UZXh0VGV4dHVyZTsKKyAgICB1aW50OF90KiBiaXRtYXBCdWZmZXIgPSAodWludDhfdCopIGdseXBoLmZJbWFnZTsKKyAgICB1bnNpZ25lZCBpbnQgc3RyaWRlID0gZ2x5cGgucm93Qnl0ZXMoKTsKKworICAgIHVpbnQzMl90IGNhY2hlWCA9IDAsIGJYID0gMCwgY2FjaGVZID0gMCwgYlkgPSAwOworICAgIGZvciAoY2FjaGVYID0gc3RhcnRYLCBiWCA9IDA7IGNhY2hlWCA8IGVuZFg7IGNhY2hlWCsrLCBiWCsrKSB7CisgICAgICAgIGZvciAoY2FjaGVZID0gc3RhcnRZLCBiWSA9IDA7IGNhY2hlWSA8IGVuZFk7IGNhY2hlWSsrLCBiWSsrKSB7CisgICAgICAgICAgICB1aW50OF90IHRlbXBDb2wgPSBiaXRtYXBCdWZmZXJbYlkgKiBzdHJpZGUgKyBiWF07CisgICAgICAgICAgICBjYWNoZUJ1ZmZlcltjYWNoZVkgKiBjYWNoZVdpZHRoICsgY2FjaGVYXSA9IG1HYW1tYVRhYmxlW3RlbXBDb2xdOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHRydWU7Cit9CisKK3ZvaWQgRm9udFJlbmRlcmVyOjppbml0VGV4dFRleHR1cmUoKSB7CisgICAgbVRleHRUZXh0dXJlID0gbmV3IHVpbnQ4X3RbbUNhY2hlV2lkdGggKiBtQ2FjaGVIZWlnaHRdOworICAgIG1VcGxvYWRUZXh0dXJlID0gZmFsc2U7CisKKyAgICBnbEdlblRleHR1cmVzKDEsICZtVGV4dHVyZUlkKTsKKyAgICBnbEJpbmRUZXh0dXJlKEdMX1RFWFRVUkVfMkQsIG1UZXh0dXJlSWQpOworICAgIGdsUGl4ZWxTdG9yZWkoR0xfVU5QQUNLX0FMSUdOTUVOVCwgMSk7CisgICAgLy8gSW5pdGlhbGl6ZSB0ZXh0dXJlIGRpbWVudGlvbnMKKyAgICBnbFRleEltYWdlMkQoR0xfVEVYVFVSRV8yRCwgMCwgR0xfQUxQSEEsIG1DYWNoZVdpZHRoLCBtQ2FjaGVIZWlnaHQsIDAsCisgICAgICAgICAgICBHTF9BTFBIQSwgR0xfVU5TSUdORURfQllURSwgMCk7CisKKyAgICBnbFRleFBhcmFtZXRlcmkoR0xfVEVYVFVSRV8yRCwgR0xfVEVYVFVSRV9NSU5fRklMVEVSLCBHTF9ORUFSRVNUKTsKKyAgICBnbFRleFBhcmFtZXRlcmkoR0xfVEVYVFVSRV8yRCwgR0xfVEVYVFVSRV9NQUdfRklMVEVSLCBHTF9ORUFSRVNUKTsKKworICAgIGdsVGV4UGFyYW1ldGVyaShHTF9URVhUVVJFXzJELCBHTF9URVhUVVJFX1dSQVBfUywgR0xfQ0xBTVBfVE9fRURHRSk7CisgICAgZ2xUZXhQYXJhbWV0ZXJpKEdMX1RFWFRVUkVfMkQsIEdMX1RFWFRVUkVfV1JBUF9ULCBHTF9DTEFNUF9UT19FREdFKTsKKworICAgIC8vIFNwbGl0IHVwIG91ciBjYWNoZSB0ZXh0dXJlIGludG8gbGluZXMgb2YgY2VydGFpbiB3aWR0aHMKKyAgICBpbnQgbmV4dExpbmUgPSAwOworICAgIG1DYWNoZUxpbmVzLnB1c2gobmV3IENhY2hlVGV4dHVyZUxpbmUobUNhY2hlV2lkdGgsIDE2LCBuZXh0TGluZSwgMCkpOworICAgIG5leHRMaW5lICs9IG1DYWNoZUxpbmVzLnRvcCgpLT5tTWF4SGVpZ2h0OworICAgIG1DYWNoZUxpbmVzLnB1c2gobmV3IENhY2hlVGV4dHVyZUxpbmUobUNhY2hlV2lkdGgsIDI0LCBuZXh0TGluZSwgMCkpOworICAgIG5leHRMaW5lICs9IG1DYWNoZUxpbmVzLnRvcCgpLT5tTWF4SGVpZ2h0OworICAgIG1DYWNoZUxpbmVzLnB1c2gobmV3IENhY2hlVGV4dHVyZUxpbmUobUNhY2hlV2lkdGgsIDI0LCBuZXh0TGluZSwgMCkpOworICAgIG5leHRMaW5lICs9IG1DYWNoZUxpbmVzLnRvcCgpLT5tTWF4SGVpZ2h0OworICAgIG1DYWNoZUxpbmVzLnB1c2gobmV3IENhY2hlVGV4dHVyZUxpbmUobUNhY2hlV2lkdGgsIDMyLCBuZXh0TGluZSwgMCkpOworICAgIG5leHRMaW5lICs9IG1DYWNoZUxpbmVzLnRvcCgpLT5tTWF4SGVpZ2h0OworICAgIG1DYWNoZUxpbmVzLnB1c2gobmV3IENhY2hlVGV4dHVyZUxpbmUobUNhY2hlV2lkdGgsIDMyLCBuZXh0TGluZSwgMCkpOworICAgIG5leHRMaW5lICs9IG1DYWNoZUxpbmVzLnRvcCgpLT5tTWF4SGVpZ2h0OworICAgIG1DYWNoZUxpbmVzLnB1c2gobmV3IENhY2hlVGV4dHVyZUxpbmUobUNhY2hlV2lkdGgsIDQwLCBuZXh0TGluZSwgMCkpOworICAgIG5leHRMaW5lICs9IG1DYWNoZUxpbmVzLnRvcCgpLT5tTWF4SGVpZ2h0OworICAgIG1DYWNoZUxpbmVzLnB1c2gobmV3IENhY2hlVGV4dHVyZUxpbmUobUNhY2hlV2lkdGgsIG1DYWNoZUhlaWdodCAtIG5leHRMaW5lLCBuZXh0TGluZSwgMCkpOworfQorCisvLyBBdm9pZCBoYXZpbmcgdG8gcmVhbGxvY2F0ZSBtZW1vcnkgYW5kIHJlbmRlciBxdWFkIGJ5IHF1YWQKK3ZvaWQgRm9udFJlbmRlcmVyOjppbml0VmVydGV4QXJyYXlCdWZmZXJzKCkgeworICAgIHVpbnQzMl90IG51bUluZGljaWVzID0gbU1heE51bWJlck9mUXVhZHMgKiA2OworICAgIHVpbnQzMl90IGluZGV4QnVmZmVyU2l6ZUJ5dGVzID0gbnVtSW5kaWNpZXMgKiBzaXplb2YodWludDE2X3QpOworICAgIHVpbnQxNl90KiBpbmRleEJ1ZmZlckRhdGEgPSAodWludDE2X3QqKSBtYWxsb2MoaW5kZXhCdWZmZXJTaXplQnl0ZXMpOworCisgICAgLy8gRm91ciB2ZXJ0cywgdHdvIHRyaWFuZ2xlcyAsIHNpeCBpbmRpY2VzIHBlciBxdWFkCisgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IG1NYXhOdW1iZXJPZlF1YWRzOyBpKyspIHsKKyAgICAgICAgaW50IGk2ID0gaSAqIDY7CisgICAgICAgIGludCBpNCA9IGkgKiA0OworCisgICAgICAgIGluZGV4QnVmZmVyRGF0YVtpNiArIDBdID0gaTQgKyAwOworICAgICAgICBpbmRleEJ1ZmZlckRhdGFbaTYgKyAxXSA9IGk0ICsgMTsKKyAgICAgICAgaW5kZXhCdWZmZXJEYXRhW2k2ICsgMl0gPSBpNCArIDI7CisKKyAgICAgICAgaW5kZXhCdWZmZXJEYXRhW2k2ICsgM10gPSBpNCArIDA7CisgICAgICAgIGluZGV4QnVmZmVyRGF0YVtpNiArIDRdID0gaTQgKyAyOworICAgICAgICBpbmRleEJ1ZmZlckRhdGFbaTYgKyA1XSA9IGk0ICsgMzsKKyAgICB9CisKKyAgICBnbEdlbkJ1ZmZlcnMoMSwgJm1JbmRleEJ1ZmZlcklEKTsKKyAgICBnbEJpbmRCdWZmZXIoR0xfQVJSQVlfQlVGRkVSLCBtSW5kZXhCdWZmZXJJRCk7CisgICAgZ2xCdWZmZXJEYXRhKEdMX0FSUkFZX0JVRkZFUiwgaW5kZXhCdWZmZXJTaXplQnl0ZXMsIGluZGV4QnVmZmVyRGF0YSwgR0xfRFlOQU1JQ19EUkFXKTsKKyAgICBnbEJpbmRCdWZmZXIoR0xfQVJSQVlfQlVGRkVSLCAwKTsKKworICAgIGZyZWUoaW5kZXhCdWZmZXJEYXRhKTsKKworICAgIHVpbnQzMl90IGNvb3JkU2l6ZSA9IDM7CisgICAgdWludDMyX3QgdXZTaXplID0gMjsKKyAgICB1aW50MzJfdCB2ZXJ0c1BlclF1YWQgPSA0OworICAgIHVpbnQzMl90IHZlcnRleEJ1ZmZlclNpemUgPSBtTWF4TnVtYmVyT2ZRdWFkcyAqIHZlcnRzUGVyUXVhZCAqIGNvb3JkU2l6ZSAqIHV2U2l6ZTsKKyAgICBtVGV4dE1lc2hQdHIgPSBuZXcgZmxvYXRbdmVydGV4QnVmZmVyU2l6ZV07Cit9CisKKy8vIFdlIGRvbid0IHdhbnQgdG8gYWxsb2NhdGUgYW55dGhpbmcgdW5sZXNzIHdlIGFjdHVhbGx5IGRyYXcgdGV4dAordm9pZCBGb250UmVuZGVyZXI6OmNoZWNrSW5pdCgpIHsKKyAgICBpZiAobUluaXRpYWxpemVkKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpbml0VGV4dFRleHR1cmUoKTsKKyAgICBpbml0VmVydGV4QXJyYXlCdWZmZXJzKCk7CisKKyAgICAvLyBXZSBzdG9yZSBhIHN0cmluZyB3aXRoIGxldHRlcnMgaW4gYSByb3VnaCBmcmVxdWVuY3kgb2Ygb2NjdXJyZW5jZQorICAgIG1MYXRpblByZWNhY2hlID0gU3RyaW5nMTYoImVpc2FybnRvbGNkdWdwbWhieWZ2a3d6eGpxICIpOworICAgIG1MYXRpblByZWNhY2hlICs9IFN0cmluZzE2KCJFSVNBUk5UT0xDRFVHUE1IQllGVktXWlhKUSIpOworICAgIG1MYXRpblByZWNhY2hlICs9IFN0cmluZzE2KCIsLj8hKCktK0A7OmAnIik7CisgICAgbUxhdGluUHJlY2FjaGUgKz0gU3RyaW5nMTYoIjAxMjM0NTY3ODkiKTsKKworICAgIG1Jbml0aWFsaXplZCA9IHRydWU7Cit9CisKK3ZvaWQgRm9udFJlbmRlcmVyOjpjaGVja1RleHR1cmVVcGRhdGUoKSB7CisgICAgaWYgKCFtVXBsb2FkVGV4dHVyZSkgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgZ2xCaW5kVGV4dHVyZShHTF9URVhUVVJFXzJELCBtVGV4dHVyZUlkKTsKKworICAgIC8vIEl0ZXJhdGUgb3ZlciBhbGwgdGhlIGNhY2hlIGxpbmVzIGFuZCBzZWUgd2hpY2ggb25lcyBuZWVkIHRvIGJlIHVwZGF0ZWQKKyAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgbUNhY2hlTGluZXMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgQ2FjaGVUZXh0dXJlTGluZSogY2wgPSBtQ2FjaGVMaW5lc1tpXTsKKyAgICAgICAgaWYoY2wtPm1EaXJ0eSkgeworICAgICAgICAgICAgdWludDMyX3QgeE9mZnNldCA9IDA7CisgICAgICAgICAgICB1aW50MzJfdCB5T2Zmc2V0ID0gY2wtPm1DdXJyZW50Um93OworICAgICAgICAgICAgdWludDMyX3Qgd2lkdGggICA9IG1DYWNoZVdpZHRoOworICAgICAgICAgICAgdWludDMyX3QgaGVpZ2h0ICA9IGNsLT5tTWF4SGVpZ2h0OworICAgICAgICAgICAgdm9pZCogdGV4dHVyZURhdGEgPSBtVGV4dFRleHR1cmUgKyB5T2Zmc2V0KndpZHRoOworCisgICAgICAgICAgICBnbFRleFN1YkltYWdlMkQoR0xfVEVYVFVSRV8yRCwgMCwgeE9mZnNldCwgeU9mZnNldCwgd2lkdGgsIGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgR0xfQUxQSEEsIEdMX1VOU0lHTkVEX0JZVEUsIHRleHR1cmVEYXRhKTsKKworICAgICAgICAgICAgY2wtPm1EaXJ0eSA9IGZhbHNlOworICAgICAgICB9CisgICAgfQorCisgICAgbVVwbG9hZFRleHR1cmUgPSBmYWxzZTsKK30KKwordm9pZCBGb250UmVuZGVyZXI6Omlzc3VlRHJhd0NvbW1hbmQoKSB7CisgICAgY2hlY2tUZXh0dXJlVXBkYXRlKCk7CisKKyAgICBmbG9hdCogdnR4ID0gbVRleHRNZXNoUHRyOworICAgIGZsb2F0KiB0ZXggPSB2dHggKyAzOworCisgICAgLy8gcG9zaXRpb24gaXMgc2xvdCAwCisgICAgdWludDMyX3Qgc2xvdCA9IDA7CisgICAgZ2xWZXJ0ZXhBdHRyaWJQb2ludGVyKHNsb3QsIDMsIEdMX0ZMT0FULCBmYWxzZSwgMjAsIHZ0eCk7CisKKyAgICAvLyB0ZXh0dXJlMCBpcyBzbG90IDEKKyAgICBzbG90ID0gMTsKKyAgICBnbFZlcnRleEF0dHJpYlBvaW50ZXIoc2xvdCwgMiwgR0xfRkxPQVQsIGZhbHNlLCAyMCwgdGV4KTsKKworICAgIGdsQmluZEJ1ZmZlcihHTF9FTEVNRU5UX0FSUkFZX0JVRkZFUiwgbUluZGV4QnVmZmVySUQpOworICAgIGdsRHJhd0VsZW1lbnRzKEdMX1RSSUFOR0xFUywgbUN1cnJlbnRRdWFkSW5kZXggKiA2LCBHTF9VTlNJR05FRF9TSE9SVCwgTlVMTCk7Cit9CisKK3ZvaWQgRm9udFJlbmRlcmVyOjphcHBlbmRNZXNoUXVhZChmbG9hdCB4MSwgZmxvYXQgeTEsIGZsb2F0IHoxLCBmbG9hdCB1MSwgZmxvYXQgdjEsIGZsb2F0IHgyLAorICAgICAgICBmbG9hdCB5MiwgZmxvYXQgejIsIGZsb2F0IHUyLCBmbG9hdCB2MiwgZmxvYXQgeDMsIGZsb2F0IHkzLCBmbG9hdCB6MywgZmxvYXQgdTMsIGZsb2F0IHYzLAorICAgICAgICBmbG9hdCB4NCwgZmxvYXQgeTQsIGZsb2F0IHo0LCBmbG9hdCB1NCwgZmxvYXQgdjQpIHsKKyAgICBpZiAoeDEgPiBtQ2xpcC0+cmlnaHQgfHwgeTEgPCBtQ2xpcC0+dG9wIHx8IHgyIDwgbUNsaXAtPmxlZnQgfHwgeTQgPiBtQ2xpcC0+Ym90dG9tKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBjb25zdCB1aW50MzJfdCB2ZXJ0c1BlclF1YWQgPSA0OworICAgIGNvbnN0IHVpbnQzMl90IGZsb2F0c1BlclZlcnQgPSA1OworICAgIGZsb2F0KiBjdXJyZW50UG9zID0gbVRleHRNZXNoUHRyICsgbUN1cnJlbnRRdWFkSW5kZXggKiB2ZXJ0c1BlclF1YWQgKiBmbG9hdHNQZXJWZXJ0OworCisgICAgKCpjdXJyZW50UG9zKyspID0geDE7CisgICAgKCpjdXJyZW50UG9zKyspID0geTE7CisgICAgKCpjdXJyZW50UG9zKyspID0gejE7CisgICAgKCpjdXJyZW50UG9zKyspID0gdTE7CisgICAgKCpjdXJyZW50UG9zKyspID0gdjE7CisKKyAgICAoKmN1cnJlbnRQb3MrKykgPSB4MjsKKyAgICAoKmN1cnJlbnRQb3MrKykgPSB5MjsKKyAgICAoKmN1cnJlbnRQb3MrKykgPSB6MjsKKyAgICAoKmN1cnJlbnRQb3MrKykgPSB1MjsKKyAgICAoKmN1cnJlbnRQb3MrKykgPSB2MjsKKworICAgICgqY3VycmVudFBvcysrKSA9IHgzOworICAgICgqY3VycmVudFBvcysrKSA9IHkzOworICAgICgqY3VycmVudFBvcysrKSA9IHozOworICAgICgqY3VycmVudFBvcysrKSA9IHUzOworICAgICgqY3VycmVudFBvcysrKSA9IHYzOworCisgICAgKCpjdXJyZW50UG9zKyspID0geDQ7CisgICAgKCpjdXJyZW50UG9zKyspID0geTQ7CisgICAgKCpjdXJyZW50UG9zKyspID0gejQ7CisgICAgKCpjdXJyZW50UG9zKyspID0gdTQ7CisgICAgKCpjdXJyZW50UG9zKyspID0gdjQ7CisKKyAgICBtQ3VycmVudFF1YWRJbmRleCsrOworCisgICAgaWYgKG1DdXJyZW50UXVhZEluZGV4ID09IG1NYXhOdW1iZXJPZlF1YWRzKSB7CisgICAgICAgIGlzc3VlRHJhd0NvbW1hbmQoKTsKKyAgICAgICAgbUN1cnJlbnRRdWFkSW5kZXggPSAwOworICAgIH0KK30KKwordWludDMyX3QgRm9udFJlbmRlcmVyOjpnZXRSZW1haW5pbmdDYWNoZUNhcGFjaXR5KCkgeworICAgIHVpbnQzMl90IHJlbWFpbmluZ0NhcGFjaXR5ID0gMDsKKyAgICBmbG9hdCB0b3RhbFBpeGVscyA9IDA7CisgICAgZm9yKHVpbnQzMl90IGkgPSAwOyBpIDwgbUNhY2hlTGluZXMuc2l6ZSgpOyBpICsrKSB7CisgICAgICAgICByZW1haW5pbmdDYXBhY2l0eSArPSAobUNhY2hlTGluZXNbaV0tPm1NYXhXaWR0aCAtIG1DYWNoZUxpbmVzW2ldLT5tQ3VycmVudENvbCk7CisgICAgICAgICB0b3RhbFBpeGVscyArPSBtQ2FjaGVMaW5lc1tpXS0+bU1heFdpZHRoOworICAgIH0KKyAgICByZW1haW5pbmdDYXBhY2l0eSA9IChyZW1haW5pbmdDYXBhY2l0eSAqIDEwMCkgLyB0b3RhbFBpeGVsczsKKyAgICByZXR1cm4gcmVtYWluaW5nQ2FwYWNpdHk7Cit9CisKK3ZvaWQgRm9udFJlbmRlcmVyOjpwcmVjYWNoZUxhdGluKFNrUGFpbnQqIHBhaW50KSB7CisgICAgLy8gUmVtYWluaW5nIGNhcGFjaXR5IGlzIG1lYXN1cmVkIGluICUKKyAgICB1aW50MzJfdCByZW1haW5pbmdDYXBhY2l0eSA9IGdldFJlbWFpbmluZ0NhY2hlQ2FwYWNpdHkoKTsKKyAgICB1aW50MzJfdCBwcmVjYWNoZUlkeCA9IDA7CisgICAgd2hpbGUocmVtYWluaW5nQ2FwYWNpdHkgPiAyNSAmJiBwcmVjYWNoZUlkeCA8IG1MYXRpblByZWNhY2hlLnNpemUoKSkgeworICAgICAgICBtQ3VycmVudEZvbnQtPmdldENhY2hlZFVURkNoYXIocGFpbnQsIChpbnQzMl90KW1MYXRpblByZWNhY2hlW3ByZWNhY2hlSWR4XSk7CisgICAgICAgIHJlbWFpbmluZ0NhcGFjaXR5ID0gZ2V0UmVtYWluaW5nQ2FjaGVDYXBhY2l0eSgpOworICAgICAgICBwcmVjYWNoZUlkeCArKzsKKyAgICB9Cit9CisKK3ZvaWQgRm9udFJlbmRlcmVyOjpzZXRGb250KFNrUGFpbnQqIHBhaW50LCB1aW50MzJfdCBmb250SWQsIGZsb2F0IGZvbnRTaXplKSB7CisgICAgdWludDMyX3QgY3VycmVudE51bUZvbnRzID0gbUFjdGl2ZUZvbnRzLnNpemUoKTsKKyAgICBtQ3VycmVudEZvbnQgPSBGb250OjpjcmVhdGUodGhpcywgZm9udElkLCBmb250U2l6ZSk7CisKKyAgICBjb25zdCBmbG9hdCBtYXhQcmVjYWNoZUZvbnRTaXplID0gNDAuMGY7CisgICAgYm9vbCBpc05ld0ZvbnQgPSBjdXJyZW50TnVtRm9udHMgIT0gbUFjdGl2ZUZvbnRzLnNpemUoKTsKKworICAgIGlmIChpc05ld0ZvbnQgJiYgZm9udFNpemUgPD0gbWF4UHJlY2FjaGVGb250U2l6ZSkgeworICAgICAgICBwcmVjYWNoZUxhdGluKHBhaW50KTsKKyAgICB9Cit9CitGb250UmVuZGVyZXI6OkRyb3BTaGFkb3cgRm9udFJlbmRlcmVyOjpyZW5kZXJEcm9wU2hhZG93KFNrUGFpbnQqIHBhaW50LCBjb25zdCBjaGFyICp0ZXh0LAorICAgICAgICB1aW50MzJfdCBzdGFydEluZGV4LCB1aW50MzJfdCBsZW4sIGludCBudW1HbHlwaHMsIHVpbnQzMl90IHJhZGl1cykgeworICAgIGNoZWNrSW5pdCgpOworCisgICAgaWYgKCFtQ3VycmVudEZvbnQpIHsKKyAgICAgICAgRHJvcFNoYWRvdyBpbWFnZTsKKyAgICAgICAgaW1hZ2Uud2lkdGggPSAwOworICAgICAgICBpbWFnZS5oZWlnaHQgPSAwOworICAgICAgICBpbWFnZS5pbWFnZSA9IE5VTEw7CisgICAgICAgIGltYWdlLnBlblggPSAwOworICAgICAgICBpbWFnZS5wZW5ZID0gMDsKKyAgICAgICAgcmV0dXJuIGltYWdlOworICAgIH0KKworICAgIFJlY3QgYm91bmRzOworICAgIG1DdXJyZW50Rm9udC0+bWVhc3VyZVVURihwYWludCwgdGV4dCwgc3RhcnRJbmRleCwgbGVuLCBudW1HbHlwaHMsICZib3VuZHMpOworICAgIHVpbnQzMl90IHBhZGRlZFdpZHRoID0gKHVpbnQzMl90KSAoYm91bmRzLnJpZ2h0IC0gYm91bmRzLmxlZnQpICsgMiAqIHJhZGl1czsKKyAgICB1aW50MzJfdCBwYWRkZWRIZWlnaHQgPSAodWludDMyX3QpIChib3VuZHMudG9wIC0gYm91bmRzLmJvdHRvbSkgKyAyICogcmFkaXVzOworICAgIHVpbnQ4X3QqIGRhdGFCdWZmZXIgPSBuZXcgdWludDhfdFtwYWRkZWRXaWR0aCAqIHBhZGRlZEhlaWdodF07CisgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IHBhZGRlZFdpZHRoICogcGFkZGVkSGVpZ2h0OyBpKyspIHsKKyAgICAgICAgZGF0YUJ1ZmZlcltpXSA9IDA7CisgICAgfQorCisgICAgaW50IHBlblggPSByYWRpdXMgLSBib3VuZHMubGVmdDsKKyAgICBpbnQgcGVuWSA9IHJhZGl1cyAtIGJvdW5kcy5ib3R0b207CisKKyAgICBtQ3VycmVudEZvbnQtPnJlbmRlclVURihwYWludCwgdGV4dCwgc3RhcnRJbmRleCwgbGVuLCBudW1HbHlwaHMsIHBlblgsIHBlblksCisgICAgICAgICAgICBkYXRhQnVmZmVyLCBwYWRkZWRXaWR0aCwgcGFkZGVkSGVpZ2h0KTsKKyAgICBibHVySW1hZ2UoZGF0YUJ1ZmZlciwgcGFkZGVkV2lkdGgsIHBhZGRlZEhlaWdodCwgcmFkaXVzKTsKKworICAgIERyb3BTaGFkb3cgaW1hZ2U7CisgICAgaW1hZ2Uud2lkdGggPSBwYWRkZWRXaWR0aDsKKyAgICBpbWFnZS5oZWlnaHQgPSBwYWRkZWRIZWlnaHQ7CisgICAgaW1hZ2UuaW1hZ2UgPSBkYXRhQnVmZmVyOworICAgIGltYWdlLnBlblggPSBwZW5YOworICAgIGltYWdlLnBlblkgPSBwZW5ZOworICAgIHJldHVybiBpbWFnZTsKK30KKwordm9pZCBGb250UmVuZGVyZXI6OnJlbmRlclRleHQoU2tQYWludCogcGFpbnQsIGNvbnN0IFJlY3QqIGNsaXAsIGNvbnN0IGNoYXIgKnRleHQsCisgICAgICAgIHVpbnQzMl90IHN0YXJ0SW5kZXgsIHVpbnQzMl90IGxlbiwgaW50IG51bUdseXBocywgaW50IHgsIGludCB5KSB7CisgICAgY2hlY2tJbml0KCk7CisKKyAgICBpZiAoIW1DdXJyZW50Rm9udCkgeworICAgICAgICBMT0dFKCJObyBmb250IHNldCIpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgbUNsaXAgPSBjbGlwOworICAgIG1DdXJyZW50Rm9udC0+cmVuZGVyVVRGKHBhaW50LCB0ZXh0LCBzdGFydEluZGV4LCBsZW4sIG51bUdseXBocywgeCwgeSk7CisKKyAgICBpZiAobUN1cnJlbnRRdWFkSW5kZXggIT0gMCkgeworICAgICAgICBpc3N1ZURyYXdDb21tYW5kKCk7CisgICAgICAgIG1DdXJyZW50UXVhZEluZGV4ID0gMDsKKyAgICB9Cit9CisKK3ZvaWQgRm9udFJlbmRlcmVyOjpjb21wdXRlR2F1c3NpYW5XZWlnaHRzKGZsb2F0KiB3ZWlnaHRzLCBpbnQzMl90IHJhZGl1cykgeworICAgIC8vIENvbXB1dGUgZ2F1c3NpYW4gd2VpZ2h0cyBmb3IgdGhlIGJsdXIKKyAgICAvLyBlIGlzIHRoZSBldWxlcidzIG51bWJlcgorICAgIGZsb2F0IGUgPSAyLjcxODI4MTgyODQ1OTA0NWY7CisgICAgZmxvYXQgcGkgPSAzLjE0MTU5MjY1MzU4OTc5MzJmOworICAgIC8vIGcoeCkgPSAoIDEgLyBzcXJ0KCAyICogcGkgKSAqIHNpZ21hKSAqIGUgXiAoIC14XjIgLyAyICogc2lnbWFeMiApCisgICAgLy8geCBpcyBvZiB0aGUgZm9ybSBbLXJhZGl1cyAuLiAwIC4uIHJhZGl1c10KKyAgICAvLyBhbmQgc2lnbWEgdmFyaWVzIHdpdGggcmFkaXVzLgorICAgIC8vIEJhc2VkIG9uIHNvbWUgZXhwZXJpbWVudGFsIHJhZGl1cyB2YWx1ZXMgYW5kIHNpZ21hJ3MKKyAgICAvLyB3ZSBhcHByb3hpbWF0ZWx5IGZpdCBzaWdtYSA9IGYocmFkaXVzKSBhcworICAgIC8vIHNpZ21hID0gcmFkaXVzICogMC4zICArIDAuNgorICAgIC8vIFRoZSBsYXJnZXIgdGhlIHJhZGl1cyBnZXRzLCB0aGUgbW9yZSBvdXIgZ2F1c3NpYW4gYmx1cgorICAgIC8vIHdpbGwgcmVzZW1ibGUgYSBib3ggYmx1ciBzaW5jZSB3aXRoIGxhcmdlIHNpZ21hCisgICAgLy8gdGhlIGdhdXNzaWFuIGN1cnZlIGJlZ2lucyB0byBsb3NlIGl0cyBzaGFwZQorICAgIGZsb2F0IHNpZ21hID0gMC4zZiAqIChmbG9hdClyYWRpdXMgKyAwLjZmOworCisgICAgLy8gTm93IGNvbXB1dGUgdGhlIGNvZWZmaWNpbnRzCisgICAgLy8gV2Ugd2lsbCBzdG9yZSBzb21lIHJlZHVuZGFudCB2YWx1ZXMgdG8gc2F2ZSBzb21lIG1hdGggZHVyaW5nCisgICAgLy8gdGhlIGJsdXIgY2FsY3VsYXRpb25zCisgICAgLy8gcHJlY29tcHV0ZSBzb21lIHZhbHVlcworICAgIGZsb2F0IGNvZWZmMSA9IDEuMGYgLyAoc3FydCggMi4wZiAqIHBpICkgKiBzaWdtYSk7CisgICAgZmxvYXQgY29lZmYyID0gLSAxLjBmIC8gKDIuMGYgKiBzaWdtYSAqIHNpZ21hKTsKKworICAgIGZsb2F0IG5vcm1hbGl6ZUZhY3RvciA9IDAuMGY7CisgICAgZm9yKGludDMyX3QgciA9IC1yYWRpdXM7IHIgPD0gcmFkaXVzOyByICsrKSB7CisgICAgICAgIGZsb2F0IGZsb2F0UiA9IChmbG9hdClyOworICAgICAgICB3ZWlnaHRzW3IgKyByYWRpdXNdID0gY29lZmYxICogcG93KGUsIGZsb2F0UiAqIGZsb2F0UiAqIGNvZWZmMik7CisgICAgICAgIG5vcm1hbGl6ZUZhY3RvciArPSB3ZWlnaHRzW3IgKyByYWRpdXNdOworICAgIH0KKworICAgIC8vTm93IHdlIG5lZWQgdG8gbm9ybWFsaXplIHRoZSB3ZWlnaHRzIGJlY2F1c2UgYWxsIG91ciBjb2VmZmljaWVudHMgbmVlZCB0byBhZGQgdXAgdG8gb25lCisgICAgbm9ybWFsaXplRmFjdG9yID0gMS4wZiAvIG5vcm1hbGl6ZUZhY3RvcjsKKyAgICBmb3IoaW50MzJfdCByID0gLXJhZGl1czsgciA8PSByYWRpdXM7IHIgKyspIHsKKyAgICAgICAgd2VpZ2h0c1tyICsgcmFkaXVzXSAqPSBub3JtYWxpemVGYWN0b3I7CisgICAgfQorfQorCit2b2lkIEZvbnRSZW5kZXJlcjo6aG9yaXpvbnRhbEJsdXIoZmxvYXQqIHdlaWdodHMsIGludDMyX3QgcmFkaXVzLAorICAgICAgICBjb25zdCB1aW50OF90KiBzb3VyY2UsIHVpbnQ4X3QqIGRlc3QsIGludDMyX3Qgd2lkdGgsIGludDMyX3QgaGVpZ2h0KSB7CisgICAgZmxvYXQgYmx1cnJlZFBpeGVsID0gMC4wZjsKKyAgICBmbG9hdCBjdXJyZW50UGl4ZWwgPSAwLjBmOworCisgICAgZm9yKGludDMyX3QgeSA9IDA7IHkgPCBoZWlnaHQ7IHkgKyspIHsKKworICAgICAgICBjb25zdCB1aW50OF90KiBpbnB1dCA9IHNvdXJjZSArIHkgKiB3aWR0aDsKKyAgICAgICAgdWludDhfdCogb3V0cHV0ID0gZGVzdCArIHkgKiB3aWR0aDsKKworICAgICAgICBmb3IoaW50MzJfdCB4ID0gMDsgeCA8IHdpZHRoOyB4ICsrKSB7CisgICAgICAgICAgICBibHVycmVkUGl4ZWwgPSAwLjBmOworICAgICAgICAgICAgY29uc3QgZmxvYXQqIGdQdHIgPSB3ZWlnaHRzOworICAgICAgICAgICAgLy8gT3B0aW1pemF0aW9uIGZvciBub24tYm9yZGVyIHBpeGVscworICAgICAgICAgICAgaWYgKCh4ID4gcmFkaXVzKSAmJiAoeCA8ICh3aWR0aCAtIHJhZGl1cykpKSB7CisgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqaSA9IGlucHV0ICsgKHggLSByYWRpdXMpOworICAgICAgICAgICAgICAgIGZvcihpbnQgciA9IC1yYWRpdXM7IHIgPD0gcmFkaXVzOyByICsrKSB7CisgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRQaXhlbCA9IChmbG9hdCkoKmkpOworICAgICAgICAgICAgICAgICAgICBibHVycmVkUGl4ZWwgKz0gY3VycmVudFBpeGVsICogZ1B0clswXTsKKyAgICAgICAgICAgICAgICAgICAgZ1B0cisrOworICAgICAgICAgICAgICAgICAgICBpKys7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBmb3IoaW50MzJfdCByID0gLXJhZGl1czsgciA8PSByYWRpdXM7IHIgKyspIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gU3RlcHBpbmcgbGVmdCBhbmQgcmlnaHQgYXdheSBmcm9tIHRoZSBwaXhlbAorICAgICAgICAgICAgICAgICAgICBpbnQgdmFsaWRXID0geCArIHI7CisgICAgICAgICAgICAgICAgICAgIGlmKHZhbGlkVyA8IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkVyA9IDA7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYodmFsaWRXID4gd2lkdGggLSAxKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB2YWxpZFcgPSB3aWR0aCAtIDE7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBjdXJyZW50UGl4ZWwgPSAoZmxvYXQpKGlucHV0W3ZhbGlkV10pOworICAgICAgICAgICAgICAgICAgICBibHVycmVkUGl4ZWwgKz0gY3VycmVudFBpeGVsICogZ1B0clswXTsKKyAgICAgICAgICAgICAgICAgICAgZ1B0cisrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICpvdXRwdXQgPSAodWludDhfdClibHVycmVkUGl4ZWw7CisgICAgICAgICAgICBvdXRwdXQgKys7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQgRm9udFJlbmRlcmVyOjp2ZXJ0aWNhbEJsdXIoZmxvYXQqIHdlaWdodHMsIGludDMyX3QgcmFkaXVzLAorICAgICAgICBjb25zdCB1aW50OF90KiBzb3VyY2UsIHVpbnQ4X3QqIGRlc3QsIGludDMyX3Qgd2lkdGgsIGludDMyX3QgaGVpZ2h0KSB7CisgICAgZmxvYXQgYmx1cnJlZFBpeGVsID0gMC4wZjsKKyAgICBmbG9hdCBjdXJyZW50UGl4ZWwgPSAwLjBmOworCisgICAgZm9yKGludDMyX3QgeSA9IDA7IHkgPCBoZWlnaHQ7IHkgKyspIHsKKworICAgICAgICB1aW50OF90KiBvdXRwdXQgPSBkZXN0ICsgeSAqIHdpZHRoOworCisgICAgICAgIGZvcihpbnQzMl90IHggPSAwOyB4IDwgd2lkdGg7IHggKyspIHsKKyAgICAgICAgICAgIGJsdXJyZWRQaXhlbCA9IDAuMGY7CisgICAgICAgICAgICBjb25zdCBmbG9hdCogZ1B0ciA9IHdlaWdodHM7CisgICAgICAgICAgICBjb25zdCB1aW50OF90KiBpbnB1dCA9IHNvdXJjZSArIHg7CisgICAgICAgICAgICAvLyBPcHRpbWl6YXRpb24gZm9yIG5vbi1ib3JkZXIgcGl4ZWxzCisgICAgICAgICAgICBpZiAoKHkgPiByYWRpdXMpICYmICh5IDwgKGhlaWdodCAtIHJhZGl1cykpKSB7CisgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqaSA9IGlucHV0ICsgKCh5IC0gcmFkaXVzKSAqIHdpZHRoKTsKKyAgICAgICAgICAgICAgICBmb3IoaW50MzJfdCByID0gLXJhZGl1czsgciA8PSByYWRpdXM7IHIgKyspIHsKKyAgICAgICAgICAgICAgICAgICAgY3VycmVudFBpeGVsID0gKGZsb2F0KSgqaSk7CisgICAgICAgICAgICAgICAgICAgIGJsdXJyZWRQaXhlbCArPSBjdXJyZW50UGl4ZWwgKiBnUHRyWzBdOworICAgICAgICAgICAgICAgICAgICBnUHRyKys7CisgICAgICAgICAgICAgICAgICAgIGkgKz0gd2lkdGg7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBmb3IoaW50MzJfdCByID0gLXJhZGl1czsgciA8PSByYWRpdXM7IHIgKyspIHsKKyAgICAgICAgICAgICAgICAgICAgaW50IHZhbGlkSCA9IHkgKyByOworICAgICAgICAgICAgICAgICAgICAvLyBDbGFtcCB0byB6ZXJvIGFuZCB3aWR0aAorICAgICAgICAgICAgICAgICAgICBpZih2YWxpZEggPCAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB2YWxpZEggPSAwOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmKHZhbGlkSCA+IGhlaWdodCAtIDEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkSCA9IGhlaWdodCAtIDE7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICppID0gaW5wdXQgKyB2YWxpZEggKiB3aWR0aDsKKyAgICAgICAgICAgICAgICAgICAgY3VycmVudFBpeGVsID0gKGZsb2F0KSgqaSk7CisgICAgICAgICAgICAgICAgICAgIGJsdXJyZWRQaXhlbCArPSBjdXJyZW50UGl4ZWwgKiBnUHRyWzBdOworICAgICAgICAgICAgICAgICAgICBnUHRyKys7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgKm91dHB1dCA9ICh1aW50OF90KWJsdXJyZWRQaXhlbDsKKyAgICAgICAgICAgIG91dHB1dCArKzsKKyAgICAgICAgfQorICAgIH0KK30KKworCit2b2lkIEZvbnRSZW5kZXJlcjo6Ymx1ckltYWdlKHVpbnQ4X3QgKmltYWdlLCBpbnQzMl90IHdpZHRoLCBpbnQzMl90IGhlaWdodCwgaW50MzJfdCByYWRpdXMpIHsKKyAgICBmbG9hdCAqZ2F1c3NpYW4gPSBuZXcgZmxvYXRbMiAqIHJhZGl1cyArIDFdOworICAgIGNvbXB1dGVHYXVzc2lhbldlaWdodHMoZ2F1c3NpYW4sIHJhZGl1cyk7CisgICAgdWludDhfdCogc2NyYXRjaCA9IG5ldyB1aW50OF90W3dpZHRoICogaGVpZ2h0XTsKKyAgICBob3Jpem9udGFsQmx1cihnYXVzc2lhbiwgcmFkaXVzLCBpbWFnZSwgc2NyYXRjaCwgd2lkdGgsIGhlaWdodCk7CisgICAgdmVydGljYWxCbHVyKGdhdXNzaWFuLCByYWRpdXMsIHNjcmF0Y2gsIGltYWdlLCB3aWR0aCwgaGVpZ2h0KTsKKyAgICBkZWxldGVbXSBnYXVzc2lhbjsKKyAgICBkZWxldGVbXSBzY3JhdGNoOworfQorCit9OyAvLyBuYW1lc3BhY2UgdWlyZW5kZXJlcgorfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2xpYnMvaHd1aS9Gb250UmVuZGVyZXIuaCBiL2xpYnMvaHd1aS9Gb250UmVuZGVyZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZTVjMDE5Ci0tLSAvZGV2L251bGwKKysrIGIvbGlicy9od3VpL0ZvbnRSZW5kZXJlci5oCkBAIC0wLDAgKzEsMjY2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX1VJX0ZPTlRfUkVOREVSRVJfSAorI2RlZmluZSBBTkRST0lEX1VJX0ZPTlRfUkVOREVSRVJfSAorCisjaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgorI2luY2x1ZGUgPHV0aWxzL1N0cmluZzE2Lmg+CisjaW5jbHVkZSA8dXRpbHMvVmVjdG9yLmg+CisjaW5jbHVkZSA8dXRpbHMvS2V5ZWRWZWN0b3IuaD4KKworI2luY2x1ZGUgPFNrU2NhbGVyQ29udGV4dC5oPgorI2luY2x1ZGUgPFNrUGFpbnQuaD4KKworI2luY2x1ZGUgPEdMRVMyL2dsMi5oPgorCisjaW5jbHVkZSAiUmVjdC5oIgorI2luY2x1ZGUgIlByb3BlcnRpZXMuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIHVpcmVuZGVyZXIgeworCitjbGFzcyBGb250UmVuZGVyZXI7CisKKy8qKgorICogUmVwcmVzZW50cyBhIGZvbnQsIGRlZmluZWQgYnkgYSBTa2lhIGZvbnQgaWQgYW5kIGEgZm9udCBzaXplLiBBIGZvbnQgaXMgdXNlZAorICogdG8gZ2VuZXJhdGUgZ2x5cGhzIGFuZCBjYWNoZSB0aGVtIGluIHRoZSBGb250U3RhdGUuCisgKi8KK2NsYXNzIEZvbnQgeworcHVibGljOgorICAgIH5Gb250KCk7CisKKyAgICAvKioKKyAgICAgKiBSZW5kZXJzIHRoZSBzcGVjaWZpZWQgc3RyaW5nIG9mIHRleHQuCisgICAgICogSWYgYml0bWFwIGlzIHNwZWNpZmllZCwgaXQgd2lsbCBiZSB1c2VkIGFzIHRoZSByZW5kZXIgdGFyZ2V0CisgICAgICovCisgICAgdm9pZCByZW5kZXJVVEYoU2tQYWludCogcGFpbnQsIGNvbnN0IGNoYXIgKnRleHQsIHVpbnQzMl90IHN0YXJ0LCB1aW50MzJfdCBsZW4sCisgICAgICAgICAgICAgICAgICAgICBpbnQgbnVtR2x5cGhzLCBpbnQgeCwgaW50IHksCisgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpiaXRtYXAgPSBOVUxMLCB1aW50MzJfdCBiaXRtYXBXID0gMCwgdWludDMyX3QgYml0bWFwSCA9IDApOworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBuZXcgZm9udCBhc3NvY2lhdGVkIHdpdGggdGhlIHNwZWNpZmllZCBmb250IHN0YXRlLgorICAgICAqLworICAgIHN0YXRpYyBGb250KiBjcmVhdGUoRm9udFJlbmRlcmVyKiBzdGF0ZSwgdWludDMyX3QgZm9udElkLCBmbG9hdCBmb250U2l6ZSk7CisKK3Byb3RlY3RlZDoKKyAgICBmcmllbmQgY2xhc3MgRm9udFJlbmRlcmVyOworCisgICAgZW51bSBSZW5kZXJNb2RlIHsKKyAgICAgICAgRlJBTUVCVUZGRVIsCisgICAgICAgIEJJVE1BUCwKKyAgICAgICAgTUVBU1VSRSwKKyAgICB9OworCisgICAgdm9pZCByZW5kZXJVVEYoU2tQYWludCogcGFpbnQsIGNvbnN0IGNoYXIgKnRleHQsIHVpbnQzMl90IHN0YXJ0LCB1aW50MzJfdCBsZW4sCisgICAgICAgICAgICAgICAgICAgICBpbnQgbnVtR2x5cGhzLCBpbnQgeCwgaW50IHksIFJlbmRlck1vZGUgbW9kZSwKKyAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKmJpdG1hcCwgdWludDMyX3QgYml0bWFwVywgdWludDMyX3QgYml0bWFwSCwKKyAgICAgICAgICAgICAgICAgICAgIFJlY3QgKmJvdW5kcyk7CisKKyAgICB2b2lkIG1lYXN1cmVVVEYoU2tQYWludCogcGFpbnQsIGNvbnN0IGNoYXIqIHRleHQsIHVpbnQzMl90IHN0YXJ0LCB1aW50MzJfdCBsZW4sCisgICAgICAgICAgICAgICAgICAgICAgaW50IG51bUdseXBocywgUmVjdCAqYm91bmRzKTsKKworICAgIHN0cnVjdCBDYWNoZWRHbHlwaEluZm8geworICAgICAgICAvLyBIYXMgdGhlIGNhY2hlIGJlZW4gaW52YWxpZGF0ZWQ/CisgICAgICAgIGJvb2wgbUlzVmFsaWQ7CisgICAgICAgIC8vIExvY2F0aW9uIG9mIHRoZSBjYWNoZWQgZ2x5cGggaW4gdGhlIGJpdG1hcAorICAgICAgICAvLyBpbiBjYXNlIHdlIG5lZWQgdG8gcmVzaXplIHRoZSB0ZXh0dXJlIG9yCisgICAgICAgIC8vIHJlbmRlciB0byBiaXRtYXAKKyAgICAgICAgdWludDMyX3QgbVN0YXJ0WDsKKyAgICAgICAgdWludDMyX3QgbVN0YXJ0WTsKKyAgICAgICAgdWludDMyX3QgbUJpdG1hcFdpZHRoOworICAgICAgICB1aW50MzJfdCBtQml0bWFwSGVpZ2h0OworICAgICAgICAvLyBBbHNvIGNhY2hlIHRleHR1cmUgY29vcmRzIGZvciB0aGUgcXVhZAorICAgICAgICBmbG9hdCBtQml0bWFwTWluVTsKKyAgICAgICAgZmxvYXQgbUJpdG1hcE1pblY7CisgICAgICAgIGZsb2F0IG1CaXRtYXBNYXhVOworICAgICAgICBmbG9hdCBtQml0bWFwTWF4VjsKKyAgICAgICAgLy8gTWluaW1pemUgaG93IG11Y2ggd2UgY2FsbCBmcmVldHlwZQorICAgICAgICB1aW50MzJfdCBtR2x5cGhJbmRleDsKKyAgICAgICAgdWludDMyX3QgbUFkdmFuY2VYOworICAgICAgICB1aW50MzJfdCBtQWR2YW5jZVk7CisgICAgICAgIC8vIFZhbHVlcyBiZWxvdyBjb250YWluIGEgZ2x5cGgncyBvcmlnaW4gaW4gdGhlIGJpdG1hcAorICAgICAgICBpbnQzMl90IG1CaXRtYXBMZWZ0OworICAgICAgICBpbnQzMl90IG1CaXRtYXBUb3A7CisgICAgICAgIC8vIEF1dG8ta2VybmluZworICAgICAgICBTa0ZpeGVkIG1Mc2JEZWx0YTsKKyAgICAgICAgU2tGaXhlZCBtUnNiRGVsdGE7CisgICAgfTsKKworICAgIEZvbnQoRm9udFJlbmRlcmVyKiBzdGF0ZSwgdWludDMyX3QgZm9udElkLCBmbG9hdCBmb250U2l6ZSk7CisKKyAgICBEZWZhdWx0S2V5ZWRWZWN0b3I8aW50MzJfdCwgQ2FjaGVkR2x5cGhJbmZvKj4gbUNhY2hlZEdseXBoczsKKworICAgIHZvaWQgaW52YWxpZGF0ZVRleHR1cmVDYWNoZSgpOworCisgICAgQ2FjaGVkR2x5cGhJbmZvKiBjYWNoZUdseXBoKFNrUGFpbnQqIHBhaW50LCBpbnQzMl90IGdseXBoKTsKKyAgICB2b2lkIHVwZGF0ZUdseXBoQ2FjaGUoU2tQYWludCogcGFpbnQsIGNvbnN0IFNrR2x5cGgmIHNraWFHbHlwaCwgQ2FjaGVkR2x5cGhJbmZvICpnbHlwaCk7CisgICAgdm9pZCBtZWFzdXJlQ2FjaGVkR2x5cGgoQ2FjaGVkR2x5cGhJbmZvICpnbHlwaCwgaW50IHgsIGludCB5LCBSZWN0ICpib3VuZHMpOworICAgIHZvaWQgZHJhd0NhY2hlZEdseXBoKENhY2hlZEdseXBoSW5mbyAqZ2x5cGgsIGludCB4LCBpbnQgeSk7CisgICAgdm9pZCBkcmF3Q2FjaGVkR2x5cGgoQ2FjaGVkR2x5cGhJbmZvICpnbHlwaCwgaW50IHgsIGludCB5LAorICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpiaXRtYXAsIHVpbnQzMl90IGJpdG1hcFcsIHVpbnQzMl90IGJpdG1hcEgpOworCisgICAgQ2FjaGVkR2x5cGhJbmZvKiBnZXRDYWNoZWRVVEZDaGFyKFNrUGFpbnQqIHBhaW50LCBpbnQzMl90IHV0ZkNoYXIpOworCisgICAgRm9udFJlbmRlcmVyKiBtU3RhdGU7CisgICAgdWludDMyX3QgbUZvbnRJZDsKKyAgICBmbG9hdCBtRm9udFNpemU7Cit9OworCitjbGFzcyBGb250UmVuZGVyZXIgeworcHVibGljOgorICAgIEZvbnRSZW5kZXJlcigpOworICAgIH5Gb250UmVuZGVyZXIoKTsKKworICAgIHZvaWQgaW5pdCgpOworICAgIHZvaWQgZGVpbml0KCk7CisKKyAgICB2b2lkIHNldEdhbW1hVGFibGUoY29uc3QgdWludDhfdCogZ2FtbWFUYWJsZSkgeworICAgICAgICBtR2FtbWFUYWJsZSA9IGdhbW1hVGFibGU7CisgICAgfQorCisgICAgdm9pZCBzZXRGb250KFNrUGFpbnQqIHBhaW50LCB1aW50MzJfdCBmb250SWQsIGZsb2F0IGZvbnRTaXplKTsKKyAgICB2b2lkIHJlbmRlclRleHQoU2tQYWludCogcGFpbnQsIGNvbnN0IFJlY3QqIGNsaXAsIGNvbnN0IGNoYXIgKnRleHQsIHVpbnQzMl90IHN0YXJ0SW5kZXgsCisgICAgICAgICAgICB1aW50MzJfdCBsZW4sIGludCBudW1HbHlwaHMsIGludCB4LCBpbnQgeSk7CisKKyAgICBzdHJ1Y3QgRHJvcFNoYWRvdyB7CisgICAgICAgIERyb3BTaGFkb3coKSB7IH07CisKKyAgICAgICAgRHJvcFNoYWRvdyhjb25zdCBEcm9wU2hhZG93JiBkcm9wU2hhZG93KToKKyAgICAgICAgICAgIHdpZHRoKGRyb3BTaGFkb3cud2lkdGgpLCBoZWlnaHQoZHJvcFNoYWRvdy5oZWlnaHQpLAorICAgICAgICAgICAgaW1hZ2UoZHJvcFNoYWRvdy5pbWFnZSksIHBlblgoZHJvcFNoYWRvdy5wZW5YKSwKKyAgICAgICAgICAgIHBlblkoZHJvcFNoYWRvdy5wZW5ZKSB7CisgICAgICAgIH0KKworICAgICAgICB1aW50MzJfdCB3aWR0aDsKKyAgICAgICAgdWludDMyX3QgaGVpZ2h0OworICAgICAgICB1aW50OF90KiBpbWFnZTsKKyAgICAgICAgaW50MzJfdCBwZW5YOworICAgICAgICBpbnQzMl90IHBlblk7CisgICAgfTsKKworICAgIC8vIEFmdGVyIHJlbmRlckRyb3BTaGFkb3cgcmV0dXJucywgdGhlIGNhbGxlZCBvd25zIHRoZSBtZW1vcnkgaW4gRHJvcFNoYWRvdy5pbWFnZQorICAgIC8vIGFuZCBpcyByZXNwb25zaWJsZSBmb3IgcmVsZWFzaW5nIGl0IHdoZW4gaXQncyBkb25lIHdpdGggaXQKKyAgICBEcm9wU2hhZG93IHJlbmRlckRyb3BTaGFkb3coU2tQYWludCogcGFpbnQsIGNvbnN0IGNoYXIgKnRleHQsIHVpbnQzMl90IHN0YXJ0SW5kZXgsCisgICAgICAgICAgICB1aW50MzJfdCBsZW4sIGludCBudW1HbHlwaHMsIHVpbnQzMl90IHJhZGl1cyk7CisKKyAgICBHTHVpbnQgZ2V0VGV4dHVyZSgpIHsKKyAgICAgICAgY2hlY2tJbml0KCk7CisgICAgICAgIHJldHVybiBtVGV4dHVyZUlkOworICAgIH0KKworcHJvdGVjdGVkOgorICAgIGZyaWVuZCBjbGFzcyBGb250OworCisgICAgY29uc3QgdWludDhfdCogbUdhbW1hVGFibGU7CisKKyAgICBzdHJ1Y3QgQ2FjaGVUZXh0dXJlTGluZSB7CisgICAgICAgIHVpbnQxNl90IG1NYXhIZWlnaHQ7CisgICAgICAgIHVpbnQxNl90IG1NYXhXaWR0aDsKKyAgICAgICAgdWludDMyX3QgbUN1cnJlbnRSb3c7CisgICAgICAgIHVpbnQzMl90IG1DdXJyZW50Q29sOworICAgICAgICBib29sIG1EaXJ0eTsKKworICAgICAgICBDYWNoZVRleHR1cmVMaW5lKHVpbnQxNl90IG1heFdpZHRoLCB1aW50MTZfdCBtYXhIZWlnaHQsIHVpbnQzMl90IGN1cnJlbnRSb3csCisgICAgICAgICAgICAgICAgdWludDMyX3QgY3VycmVudENvbCk6CisgICAgICAgICAgICAgICAgICAgIG1NYXhIZWlnaHQobWF4SGVpZ2h0KSwKKyAgICAgICAgICAgICAgICAgICAgbU1heFdpZHRoKG1heFdpZHRoKSwKKyAgICAgICAgICAgICAgICAgICAgbUN1cnJlbnRSb3coY3VycmVudFJvdyksCisgICAgICAgICAgICAgICAgICAgIG1DdXJyZW50Q29sKGN1cnJlbnRDb2wpLAorICAgICAgICAgICAgICAgICAgICBtRGlydHkoZmFsc2UpIHsKKyAgICAgICAgfQorCisgICAgICAgIGJvb2wgZml0Qml0bWFwKGNvbnN0IFNrR2x5cGgmIGdseXBoLCB1aW50MzJfdCAqcmV0T3JpZ2luWCwgdWludDMyX3QgKnJldE9yaWdpblkpIHsKKyAgICAgICAgICAgIGlmIChnbHlwaC5mSGVpZ2h0ID4gbU1heEhlaWdodCkgeworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKG1DdXJyZW50Q29sICsgZ2x5cGguZldpZHRoIDwgbU1heFdpZHRoKSB7CisgICAgICAgICAgICAgICAgKnJldE9yaWdpblggPSBtQ3VycmVudENvbDsKKyAgICAgICAgICAgICAgICAqcmV0T3JpZ2luWSA9IG1DdXJyZW50Um93OworICAgICAgICAgICAgICAgIG1DdXJyZW50Q29sICs9IGdseXBoLmZXaWR0aDsKKyAgICAgICAgICAgICAgICBtRGlydHkgPSB0cnVlOworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9OworCisgICAgdWludDMyX3QgZ2V0Q2FjaGVXaWR0aCgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1DYWNoZVdpZHRoOworICAgIH0KKworICAgIHVpbnQzMl90IGdldENhY2hlSGVpZ2h0KCkgY29uc3QgeworICAgICAgICByZXR1cm4gbUNhY2hlSGVpZ2h0OworICAgIH0KKworICAgIHZvaWQgaW5pdFRleHRUZXh0dXJlKCk7CisgICAgYm9vbCBjYWNoZUJpdG1hcChjb25zdCBTa0dseXBoJiBnbHlwaCwgdWludDMyX3QgKnJldE9yaWdpblgsIHVpbnQzMl90ICpyZXRPcmlnaW5ZKTsKKworICAgIHZvaWQgZmx1c2hBbGxBbmRJbnZhbGlkYXRlKCk7CisgICAgdm9pZCBpbml0VmVydGV4QXJyYXlCdWZmZXJzKCk7CisKKyAgICB2b2lkIGNoZWNrSW5pdCgpOworCisgICAgU3RyaW5nMTYgbUxhdGluUHJlY2FjaGU7CisgICAgdm9pZCBwcmVjYWNoZUxhdGluKFNrUGFpbnQqIHBhaW50KTsKKworICAgIHZvaWQgaXNzdWVEcmF3Q29tbWFuZCgpOworICAgIHZvaWQgYXBwZW5kTWVzaFF1YWQoZmxvYXQgeDEsIGZsb2F0IHkxLCBmbG9hdCB6MSwgZmxvYXQgdTEsIGZsb2F0IHYxLCBmbG9hdCB4MiwgZmxvYXQgeTIsCisgICAgICAgICAgICBmbG9hdCB6MiwgZmxvYXQgdTIsIGZsb2F0IHYyLCBmbG9hdCB4MywgZmxvYXQgeTMsIGZsb2F0IHozLCBmbG9hdCB1MywgZmxvYXQgdjMsCisgICAgICAgICAgICBmbG9hdCB4NCwgZmxvYXQgeTQsIGZsb2F0IHo0LCBmbG9hdCB1NCwgZmxvYXQgdjQpOworCisgICAgdWludDMyX3QgbUNhY2hlV2lkdGg7CisgICAgdWludDMyX3QgbUNhY2hlSGVpZ2h0OworCisgICAgVmVjdG9yPENhY2hlVGV4dHVyZUxpbmUqPiBtQ2FjaGVMaW5lczsKKyAgICB1aW50MzJfdCBnZXRSZW1haW5pbmdDYWNoZUNhcGFjaXR5KCk7CisKKyAgICBGb250KiBtQ3VycmVudEZvbnQ7CisgICAgVmVjdG9yPEZvbnQqPiBtQWN0aXZlRm9udHM7CisKKyAgICAvLyBUZXh0dXJlIHRvIGNhY2hlIGdseXBoIGJpdG1hcHMKKyAgICB1aW50OF90KiBtVGV4dFRleHR1cmU7CisgICAgY29uc3QgdWludDhfdCogZ2V0VGV4dFRleHR1cmVEYXRhKCkgY29uc3QgeworICAgICAgICByZXR1cm4gbVRleHRUZXh0dXJlOworICAgIH0KKyAgICBHTHVpbnQgbVRleHR1cmVJZDsKKyAgICB2b2lkIGNoZWNrVGV4dHVyZVVwZGF0ZSgpOworICAgIGJvb2wgbVVwbG9hZFRleHR1cmU7CisKKyAgICAvLyBQb2ludGVyIHRvIHZlcnRleCBkYXRhIHRvIHNwZWVkIHVwIGZyYW1lIHRvIGZyYW1lIHdvcmsKKyAgICBmbG9hdCAqbVRleHRNZXNoUHRyOworICAgIHVpbnQzMl90IG1DdXJyZW50UXVhZEluZGV4OworICAgIHVpbnQzMl90IG1NYXhOdW1iZXJPZlF1YWRzOworCisgICAgdWludDMyX3QgbUluZGV4QnVmZmVySUQ7CisKKyAgICBjb25zdCBSZWN0KiBtQ2xpcDsKKworICAgIGJvb2wgbUluaXRpYWxpemVkOworCisgICAgdm9pZCBjb21wdXRlR2F1c3NpYW5XZWlnaHRzKGZsb2F0KiB3ZWlnaHRzLCBpbnQzMl90IHJhZGl1cyk7CisgICAgdm9pZCBob3Jpem9udGFsQmx1cihmbG9hdCogd2VpZ2h0cywgaW50MzJfdCByYWRpdXMsIGNvbnN0IHVpbnQ4X3QgKnNvdXJjZSwgdWludDhfdCAqZGVzdCwKKyAgICAgICAgICAgIGludDMyX3Qgd2lkdGgsIGludDMyX3QgaGVpZ2h0KTsKKyAgICB2b2lkIHZlcnRpY2FsQmx1cihmbG9hdCogd2VpZ2h0cywgaW50MzJfdCByYWRpdXMsIGNvbnN0IHVpbnQ4X3QgKnNvdXJjZSwgdWludDhfdCAqZGVzdCwKKyAgICAgICAgICAgIGludDMyX3Qgd2lkdGgsIGludDMyX3QgaGVpZ2h0KTsKKyAgICB2b2lkIGJsdXJJbWFnZSh1aW50OF90KiBpbWFnZSwgaW50MzJfdCB3aWR0aCwgaW50MzJfdCBoZWlnaHQsIGludDMyX3QgcmFkaXVzKTsKK307CisKK307IC8vIG5hbWVzcGFjZSB1aXJlbmRlcmVyCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgLy8gQU5EUk9JRF9VSV9GT05UX1JFTkRFUkVSX0gKZGlmZiAtLWdpdCBhL2xpYnMvaHd1aS9HYW1tYUZvbnRSZW5kZXJlci5jcHAgYi9saWJzL2h3dWkvR2FtbWFGb250UmVuZGVyZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZkMDg3ZTMKLS0tIC9kZXYvbnVsbAorKysgYi9saWJzL2h3dWkvR2FtbWFGb250UmVuZGVyZXIuY3BwCkBAIC0wLDAgKzEsMTAzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJPcGVuR0xSZW5kZXJlciIKKworI2luY2x1ZGUgIkdhbW1hRm9udFJlbmRlcmVyLmgiCisjaW5jbHVkZSAiUHJvcGVydGllcy5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgdWlyZW5kZXJlciB7CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIENvbnN0cnVjdG9ycy9kZXN0cnVjdG9yCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK0dhbW1hRm9udFJlbmRlcmVyOjpHYW1tYUZvbnRSZW5kZXJlcigpIHsKKyAgICBMT0dEKCJDcmVhdGluZyBnYW1tYSBmb250IHJlbmRlcmVyIik7CisKKyAgICAvLyBHZXQgdGhlIHJlbmRlcmVyIHByb3BlcnRpZXMKKyAgICBjaGFyIHByb3BlcnR5W1BST1BFUlRZX1ZBTFVFX01BWF07CisKKyAgICAvLyBHZXQgdGhlIGdhbW1hCisgICAgZmxvYXQgZ2FtbWEgPSBERUZBVUxUX1RFWFRfR0FNTUE7CisgICAgaWYgKHByb3BlcnR5X2dldChQUk9QRVJUWV9URVhUX0dBTU1BLCBwcm9wZXJ0eSwgTlVMTCkgPiAwKSB7CisgICAgICAgIExPR0QoIiAgU2V0dGluZyB0ZXh0IGdhbW1hIHRvICVzIiwgcHJvcGVydHkpOworICAgICAgICBnYW1tYSA9IGF0b2YocHJvcGVydHkpOworICAgIH0gZWxzZSB7CisgICAgICAgIExPR0QoIiAgVXNpbmcgZGVmYXVsdCB0ZXh0IGdhbW1hIG9mICUuMmYiLCBERUZBVUxUX1RFWFRfR0FNTUEpOworICAgIH0KKworICAgIC8vIEdldCB0aGUgYmxhY2sgZ2FtbWEgdGhyZXNob2xkCisgICAgbUJsYWNrVGhyZXNob2xkID0gREVGQVVMVF9URVhUX0JMQUNLX0dBTU1BX1RIUkVTSE9MRDsKKyAgICBpZiAocHJvcGVydHlfZ2V0KFBST1BFUlRZX1RFWFRfQkxBQ0tfR0FNTUFfVEhSRVNIT0xELCBwcm9wZXJ0eSwgTlVMTCkgPiAwKSB7CisgICAgICAgIExPR0QoIiAgU2V0dGluZyB0ZXh0IGJsYWNrIGdhbW1hIHRocmVzaG9sZCB0byAlcyIsIHByb3BlcnR5KTsKKyAgICAgICAgbUJsYWNrVGhyZXNob2xkID0gYXRvaShwcm9wZXJ0eSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgTE9HRCgiICBVc2luZyBkZWZhdWx0IHRleHQgYmxhY2sgZ2FtbWEgdGhyZXNob2xkIG9mICVkIiwKKyAgICAgICAgICAgICAgICBERUZBVUxUX1RFWFRfQkxBQ0tfR0FNTUFfVEhSRVNIT0xEKTsKKyAgICB9CisKKyAgICAvLyBHZXQgdGhlIHdoaXRlIGdhbW1hIHRocmVzaG9sZAorICAgIG1XaGl0ZVRocmVzaG9sZCA9IERFRkFVTFRfVEVYVF9XSElURV9HQU1NQV9USFJFU0hPTEQ7CisgICAgaWYgKHByb3BlcnR5X2dldChQUk9QRVJUWV9URVhUX1dISVRFX0dBTU1BX1RIUkVTSE9MRCwgcHJvcGVydHksIE5VTEwpID4gMCkgeworICAgICAgICBMT0dEKCIgIFNldHRpbmcgdGV4dCB3aGl0ZSBnYW1tYSB0aHJlc2hvbGQgdG8gJXMiLCBwcm9wZXJ0eSk7CisgICAgICAgIG1XaGl0ZVRocmVzaG9sZCA9IGF0b2kocHJvcGVydHkpOworICAgIH0gZWxzZSB7CisgICAgICAgIExPR0QoIiAgVXNpbmcgZGVmYXVsdCB3aGl0ZSBibGFjayBnYW1tYSB0aHJlc2hvbGQgb2YgJWQiLAorICAgICAgICAgICAgICAgIERFRkFVTFRfVEVYVF9XSElURV9HQU1NQV9USFJFU0hPTEQpOworICAgIH0KKworICAgIC8vIENvbXB1dGUgdGhlIGdhbW1hIHRhYmxlcworICAgIGNvbnN0IGZsb2F0IGJsYWNrR2FtbWEgPSBnYW1tYTsKKyAgICBjb25zdCBmbG9hdCB3aGl0ZUdhbW1hID0gMS4wZiAvIGdhbW1hOworCisgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8PSAyNTU7IGkrKykgeworICAgICAgICBtRGVmYXVsdFtpXSA9IGk7CisKKyAgICAgICAgY29uc3QgZmxvYXQgdiA9IGkgLyAyNTUuMGY7CisgICAgICAgIGNvbnN0IGZsb2F0IGJsYWNrID0gcG93KHYsIGJsYWNrR2FtbWEpOworICAgICAgICBjb25zdCBmbG9hdCB3aGl0ZSA9IHBvdyh2LCB3aGl0ZUdhbW1hKTsKKworICAgICAgICBtQmxhY2tHYW1tYVtpXSA9IHVpbnQ4X3QoKGZsb2F0KTo6Zmxvb3IoYmxhY2sgKiAyNTUuMGYgKyAwLjVmKSk7CisgICAgICAgIG1XaGl0ZUdhbW1hW2ldID0gdWludDhfdCgoZmxvYXQpOjpmbG9vcih3aGl0ZSAqIDI1NS4wZiArIDAuNWYpKTsKKyAgICB9CisKKyAgICAvLyBDb25maWd1cmUgdGhlIGZvbnQgcmVuZGVyZXJzCisgICAgbURlZmF1bHRSZW5kZXJlci5zZXRHYW1tYVRhYmxlKCZtRGVmYXVsdFswXSk7CisgICAgbUJsYWNrR2FtbWFSZW5kZXJlci5zZXRHYW1tYVRhYmxlKCZtQmxhY2tHYW1tYVswXSk7CisgICAgbVdoaXRlR2FtbWFSZW5kZXJlci5zZXRHYW1tYVRhYmxlKCZtV2hpdGVHYW1tYVswXSk7Cit9CisKK0ZvbnRSZW5kZXJlciYgR2FtbWFGb250UmVuZGVyZXI6OmdldEZvbnRSZW5kZXJlcihjb25zdCBTa1BhaW50KiBwYWludCkgeworICAgIGlmIChwYWludC0+Z2V0U2hhZGVyKCkgPT0gTlVMTCkgeworICAgICAgICB1aW50MzJfdCBjID0gcGFpbnQtPmdldENvbG9yKCk7CisgICAgICAgIGNvbnN0IGludCByID0gKGMgPj4gMTYpICYgMHhGRjsKKyAgICAgICAgY29uc3QgaW50IGcgPSAoYyA+PiAgOCkgJiAweEZGOworICAgICAgICBjb25zdCBpbnQgYiA9IChjICAgICAgKSAmIDB4RkY7CisgICAgICAgIGNvbnN0IGludCBsdW1pbmFuY2UgPSAociAqIDIgKyBnICogNSArIGIpID4+IDM7CisKKyAgICAgICAgaWYgKGx1bWluYW5jZSA8PSBtQmxhY2tUaHJlc2hvbGQpIHsKKyAgICAgICAgICAgIHJldHVybiBtQmxhY2tHYW1tYVJlbmRlcmVyOworICAgICAgICB9IGVsc2UgaWYgKGx1bWluYW5jZSA+PSBtV2hpdGVUaHJlc2hvbGQpIHsKKyAgICAgICAgICAgIHJldHVybiBtV2hpdGVHYW1tYVJlbmRlcmVyOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBtRGVmYXVsdFJlbmRlcmVyOworfQorCit9OyAvLyBuYW1lc3BhY2UgdWlyZW5kZXJlcgorfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2xpYnMvaHd1aS9HYW1tYUZvbnRSZW5kZXJlci5oIGIvbGlicy9od3VpL0dhbW1hRm9udFJlbmRlcmVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWZhNDVjZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYnMvaHd1aS9HYW1tYUZvbnRSZW5kZXJlci5oCkBAIC0wLDAgKzEsNDggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfVUlfR0FNTUFfRk9OVF9SRU5ERVJFUl9ICisjZGVmaW5lIEFORFJPSURfVUlfR0FNTUFfRk9OVF9SRU5ERVJFUl9ICisKKyNpbmNsdWRlIDxTa1BhaW50Lmg+CisKKyNpbmNsdWRlICJGb250UmVuZGVyZXIuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIHVpcmVuZGVyZXIgeworCitzdHJ1Y3QgR2FtbWFGb250UmVuZGVyZXIgeworICAgIEdhbW1hRm9udFJlbmRlcmVyKCk7CisKKyAgICBGb250UmVuZGVyZXImIGdldEZvbnRSZW5kZXJlcihjb25zdCBTa1BhaW50KiBwYWludCk7CisKK3ByaXZhdGU6CisgICAgRm9udFJlbmRlcmVyIG1EZWZhdWx0UmVuZGVyZXI7CisgICAgRm9udFJlbmRlcmVyIG1CbGFja0dhbW1hUmVuZGVyZXI7CisgICAgRm9udFJlbmRlcmVyIG1XaGl0ZUdhbW1hUmVuZGVyZXI7CisKKyAgICBpbnQgbUJsYWNrVGhyZXNob2xkOworICAgIGludCBtV2hpdGVUaHJlc2hvbGQ7CisKKyAgICB1aW50OF90IG1EZWZhdWx0WzI1Nl07CisgICAgdWludDhfdCBtQmxhY2tHYW1tYVsyNTZdOworICAgIHVpbnQ4X3QgbVdoaXRlR2FtbWFbMjU2XTsKK307CisKK307IC8vIG5hbWVzcGFjZSB1aXJlbmRlcmVyCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgLy8gQU5EUk9JRF9VSV9HQU1NQV9GT05UX1JFTkRFUkVSX0gKZGlmZiAtLWdpdCBhL2xpYnMvaHd1aS9HZW5lcmF0aW9uQ2FjaGUuaCBiL2xpYnMvaHd1aS9HZW5lcmF0aW9uQ2FjaGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNzBlMzNmCi0tLSAvZGV2L251bGwKKysrIGIvbGlicy9od3VpL0dlbmVyYXRpb25DYWNoZS5oCkBAIC0wLDAgKzEsMjM2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX1VJX0dFTkVSQVRJT05fQ0FDSEVfSAorI2RlZmluZSBBTkRST0lEX1VJX0dFTkVSQVRJT05fQ0FDSEVfSAorCisjaW5jbHVkZSA8dXRpbHMvS2V5ZWRWZWN0b3IuaD4KKyNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSB1aXJlbmRlcmVyIHsKKwordGVtcGxhdGU8dHlwZW5hbWUgRW50cnlLZXksIHR5cGVuYW1lIEVudHJ5VmFsdWU+CitjbGFzcyBPbkVudHJ5UmVtb3ZlZCB7CitwdWJsaWM6CisgICAgdmlydHVhbCB+T25FbnRyeVJlbW92ZWQoKSB7IH07CisgICAgdmlydHVhbCB2b2lkIG9wZXJhdG9yKCkoRW50cnlLZXkmIGtleSwgRW50cnlWYWx1ZSYgdmFsdWUpID0gMDsKK307IC8vIGNsYXNzIE9uRW50cnlSZW1vdmVkCisKK3RlbXBsYXRlPHR5cGVuYW1lIEVudHJ5S2V5LCB0eXBlbmFtZSBFbnRyeVZhbHVlPgorc3RydWN0IEVudHJ5OiBwdWJsaWMgTGlnaHRSZWZCYXNlPEVudHJ5PEVudHJ5S2V5LCBFbnRyeVZhbHVlPiA+IHsKKyAgICBFbnRyeSgpIHsgfQorICAgIEVudHJ5KGNvbnN0IEVudHJ5PEVudHJ5S2V5LCBFbnRyeVZhbHVlPiYgZSk6CisgICAgICAgICAgICBrZXkoZS5rZXkpLCB2YWx1ZShlLnZhbHVlKSwgcGFyZW50KGUucGFyZW50KSwgY2hpbGQoZS5jaGlsZCkgeyB9CisgICAgRW50cnkoc3A8RW50cnk8RW50cnlLZXksIEVudHJ5VmFsdWU+ID4gZSk6CisgICAgICAgICAgICBrZXkoZS0+a2V5KSwgdmFsdWUoZS0+dmFsdWUpLCBwYXJlbnQoZS0+cGFyZW50KSwgY2hpbGQoZS0+Y2hpbGQpIHsgfQorCisgICAgRW50cnlLZXkga2V5OworICAgIEVudHJ5VmFsdWUgdmFsdWU7CisKKyAgICBzcDxFbnRyeTxFbnRyeUtleSwgRW50cnlWYWx1ZT4gPiBwYXJlbnQ7CisgICAgc3A8RW50cnk8RW50cnlLZXksIEVudHJ5VmFsdWU+ID4gY2hpbGQ7Cit9OyAvLyBzdHJ1Y3QgRW50cnkKKwordGVtcGxhdGU8dHlwZW5hbWUgSywgdHlwZW5hbWUgVj4KK2NsYXNzIEdlbmVyYXRpb25DYWNoZSB7CitwdWJsaWM6CisgICAgR2VuZXJhdGlvbkNhY2hlKHVpbnQzMl90IG1heENhcGFjaXR5KTsKKyAgICB2aXJ0dWFsIH5HZW5lcmF0aW9uQ2FjaGUoKTsKKworICAgIGVudW0gQ2FwYWNpdHkgeworICAgICAgICBrVW5saW1pdGVkQ2FwYWNpdHksCisgICAgfTsKKworICAgIHZvaWQgc2V0T25FbnRyeVJlbW92ZWRMaXN0ZW5lcihPbkVudHJ5UmVtb3ZlZDxLLCBWPiogbGlzdGVuZXIpOworCisgICAgdm9pZCBjbGVhcigpOworCisgICAgYm9vbCBjb250YWlucyhLIGtleSkgY29uc3Q7CisgICAgViBnZXQoSyBrZXkpOworICAgIEsgZ2V0S2V5QXQodWludDMyX3QgaW5kZXgpIGNvbnN0OworICAgIHZvaWQgcHV0KEsga2V5LCBWIHZhbHVlKTsKKyAgICBWIHJlbW92ZShLIGtleSk7CisgICAgViByZW1vdmVPbGRlc3QoKTsKKworICAgIHVpbnQzMl90IHNpemUoKSBjb25zdDsKKworICAgIHZvaWQgYWRkVG9DYWNoZShzcDxFbnRyeTxLLCBWPiA+IGVudHJ5LCBLIGtleSwgViB2YWx1ZSk7CisgICAgdm9pZCBhdHRhY2hUb0NhY2hlKHNwPEVudHJ5PEssIFY+ID4gZW50cnkpOworICAgIHZvaWQgZGV0YWNoRnJvbUNhY2hlKHNwPEVudHJ5PEssIFY+ID4gZW50cnkpOworCisgICAgViByZW1vdmVBdChzc2l6ZV90IGluZGV4KTsKKworICAgIEtleWVkVmVjdG9yPEssIHNwPEVudHJ5PEssIFY+ID4gPiBtQ2FjaGU7CisgICAgdWludDMyX3QgbU1heENhcGFjaXR5OworCisgICAgT25FbnRyeVJlbW92ZWQ8SywgVj4qIG1MaXN0ZW5lcjsKKworICAgIHNwPEVudHJ5PEssIFY+ID4gbU9sZGVzdDsKKyAgICBzcDxFbnRyeTxLLCBWPiA+IG1Zb3VuZ2VzdDsKK307IC8vIGNsYXNzIEdlbmVyYXRpb25DYWNoZQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBLLCB0eXBlbmFtZSBWPgorR2VuZXJhdGlvbkNhY2hlPEssIFY+OjpHZW5lcmF0aW9uQ2FjaGUodWludDMyX3QgbWF4Q2FwYWNpdHkpOiBtTWF4Q2FwYWNpdHkobWF4Q2FwYWNpdHkpLCBtTGlzdGVuZXIoTlVMTCkgeworfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgSywgdHlwZW5hbWUgVj4KK0dlbmVyYXRpb25DYWNoZTxLLCBWPjo6fkdlbmVyYXRpb25DYWNoZSgpIHsKKyAgICBjbGVhcigpOworfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgSywgdHlwZW5hbWUgVj4KK3VpbnQzMl90IEdlbmVyYXRpb25DYWNoZTxLLCBWPjo6c2l6ZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gbUNhY2hlLnNpemUoKTsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgSywgdHlwZW5hbWUgVj4KK3ZvaWQgR2VuZXJhdGlvbkNhY2hlPEssIFY+OjpzZXRPbkVudHJ5UmVtb3ZlZExpc3RlbmVyKE9uRW50cnlSZW1vdmVkPEssIFY+KiBsaXN0ZW5lcikgeworICAgIG1MaXN0ZW5lciA9IGxpc3RlbmVyOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBLLCB0eXBlbmFtZSBWPgordm9pZCBHZW5lcmF0aW9uQ2FjaGU8SywgVj46OmNsZWFyKCkgeworICAgIGlmIChtTGlzdGVuZXIpIHsKKyAgICAgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IG1DYWNoZS5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgc3A8RW50cnk8SywgVj4gPiBlbnRyeSA9IG1DYWNoZS52YWx1ZUF0KGkpOworICAgICAgICAgICAgaWYgKG1MaXN0ZW5lcikgeworICAgICAgICAgICAgICAgICgqbUxpc3RlbmVyKShlbnRyeS0+a2V5LCBlbnRyeS0+dmFsdWUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIG1DYWNoZS5jbGVhcigpOworICAgIG1Zb3VuZ2VzdC5jbGVhcigpOworICAgIG1PbGRlc3QuY2xlYXIoKTsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgSywgdHlwZW5hbWUgVj4KK2Jvb2wgR2VuZXJhdGlvbkNhY2hlPEssIFY+Ojpjb250YWlucyhLIGtleSkgY29uc3QgeworICAgIHJldHVybiBtQ2FjaGUuaW5kZXhPZktleShrZXkpID49IDA7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIEssIHR5cGVuYW1lIFY+CitLIEdlbmVyYXRpb25DYWNoZTxLLCBWPjo6Z2V0S2V5QXQodWludDMyX3QgaW5kZXgpIGNvbnN0IHsKKyAgICByZXR1cm4gbUNhY2hlLmtleUF0KGluZGV4KTsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgSywgdHlwZW5hbWUgVj4KK1YgR2VuZXJhdGlvbkNhY2hlPEssIFY+OjpnZXQoSyBrZXkpIHsKKyAgICBzc2l6ZV90IGluZGV4ID0gbUNhY2hlLmluZGV4T2ZLZXkoa2V5KTsKKyAgICBpZiAoaW5kZXggPj0gMCkgeworICAgICAgICBzcDxFbnRyeTxLLCBWPiA+IGVudHJ5ID0gbUNhY2hlLnZhbHVlQXQoaW5kZXgpOworICAgICAgICBpZiAoZW50cnkuZ2V0KCkpIHsKKyAgICAgICAgICAgIGRldGFjaEZyb21DYWNoZShlbnRyeSk7CisgICAgICAgICAgICBhdHRhY2hUb0NhY2hlKGVudHJ5KTsKKyAgICAgICAgICAgIHJldHVybiBlbnRyeS0+dmFsdWU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gTlVMTDsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgSywgdHlwZW5hbWUgVj4KK3ZvaWQgR2VuZXJhdGlvbkNhY2hlPEssIFY+OjpwdXQoSyBrZXksIFYgdmFsdWUpIHsKKyAgICBpZiAobU1heENhcGFjaXR5ICE9IGtVbmxpbWl0ZWRDYXBhY2l0eSAmJiBtQ2FjaGUuc2l6ZSgpID49IG1NYXhDYXBhY2l0eSkgeworICAgICAgICByZW1vdmVPbGRlc3QoKTsKKyAgICB9CisKKyAgICBzc2l6ZV90IGluZGV4ID0gbUNhY2hlLmluZGV4T2ZLZXkoa2V5KTsKKyAgICBpZiAoaW5kZXggPCAwKSB7CisgICAgICAgIHNwPEVudHJ5PEssIFY+ID4gZW50cnkgPSBuZXcgRW50cnk8SywgVj47CisgICAgICAgIGFkZFRvQ2FjaGUoZW50cnksIGtleSwgdmFsdWUpOworICAgIH0KK30KKwordGVtcGxhdGU8dHlwZW5hbWUgSywgdHlwZW5hbWUgVj4KK3ZvaWQgR2VuZXJhdGlvbkNhY2hlPEssIFY+OjphZGRUb0NhY2hlKHNwPEVudHJ5PEssIFY+ID4gZW50cnksIEsga2V5LCBWIHZhbHVlKSB7CisgICAgZW50cnktPmtleSA9IGtleTsKKyAgICBlbnRyeS0+dmFsdWUgPSB2YWx1ZTsKKyAgICBtQ2FjaGUuYWRkKGtleSwgZW50cnkpOworICAgIGF0dGFjaFRvQ2FjaGUoZW50cnkpOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBLLCB0eXBlbmFtZSBWPgorViBHZW5lcmF0aW9uQ2FjaGU8SywgVj46OnJlbW92ZShLIGtleSkgeworICAgIHNzaXplX3QgaW5kZXggPSBtQ2FjaGUuaW5kZXhPZktleShrZXkpOworICAgIGlmIChpbmRleCA+PSAwKSB7CisgICAgICAgIHJldHVybiByZW1vdmVBdChpbmRleCk7CisgICAgfQorCisgICAgcmV0dXJuIE5VTEw7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIEssIHR5cGVuYW1lIFY+CitWIEdlbmVyYXRpb25DYWNoZTxLLCBWPjo6cmVtb3ZlQXQoc3NpemVfdCBpbmRleCkgeworICAgIHNwPEVudHJ5PEssIFY+ID4gZW50cnkgPSBtQ2FjaGUudmFsdWVBdChpbmRleCk7CisgICAgaWYgKG1MaXN0ZW5lcikgeworICAgICAgICAoKm1MaXN0ZW5lcikoZW50cnktPmtleSwgZW50cnktPnZhbHVlKTsKKyAgICB9CisgICAgbUNhY2hlLnJlbW92ZUl0ZW1zQXQoaW5kZXgsIDEpOworICAgIGRldGFjaEZyb21DYWNoZShlbnRyeSk7CisKKyAgICByZXR1cm4gZW50cnktPnZhbHVlOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBLLCB0eXBlbmFtZSBWPgorViBHZW5lcmF0aW9uQ2FjaGU8SywgVj46OnJlbW92ZU9sZGVzdCgpIHsKKyAgICBpZiAobU9sZGVzdC5nZXQoKSkgeworICAgICAgICBzc2l6ZV90IGluZGV4ID0gbUNhY2hlLmluZGV4T2ZLZXkobU9sZGVzdC0+a2V5KTsKKyAgICAgICAgaWYgKGluZGV4ID49IDApIHsKKyAgICAgICAgICAgIHJldHVybiByZW1vdmVBdChpbmRleCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gTlVMTDsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgSywgdHlwZW5hbWUgVj4KK3ZvaWQgR2VuZXJhdGlvbkNhY2hlPEssIFY+OjphdHRhY2hUb0NhY2hlKHNwPEVudHJ5PEssIFY+ID4gZW50cnkpIHsKKyAgICBpZiAoIW1Zb3VuZ2VzdC5nZXQoKSkgeworICAgICAgICBtWW91bmdlc3QgPSBtT2xkZXN0ID0gZW50cnk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZW50cnktPnBhcmVudCA9IG1Zb3VuZ2VzdDsKKyAgICAgICAgbVlvdW5nZXN0LT5jaGlsZCA9IGVudHJ5OworICAgICAgICBtWW91bmdlc3QgPSBlbnRyeTsKKyAgICB9Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIEssIHR5cGVuYW1lIFY+Cit2b2lkIEdlbmVyYXRpb25DYWNoZTxLLCBWPjo6ZGV0YWNoRnJvbUNhY2hlKHNwPEVudHJ5PEssIFY+ID4gZW50cnkpIHsKKyAgICBpZiAoZW50cnktPnBhcmVudC5nZXQoKSkgeworICAgICAgICBlbnRyeS0+cGFyZW50LT5jaGlsZCA9IGVudHJ5LT5jaGlsZDsKKyAgICB9CisKKyAgICBpZiAoZW50cnktPmNoaWxkLmdldCgpKSB7CisgICAgICAgIGVudHJ5LT5jaGlsZC0+cGFyZW50ID0gZW50cnktPnBhcmVudDsKKyAgICB9CisKKyAgICBpZiAobU9sZGVzdCA9PSBlbnRyeSkgeworICAgICAgICBtT2xkZXN0ID0gZW50cnktPmNoaWxkOworICAgIH0KKworICAgIGlmIChtWW91bmdlc3QgPT0gZW50cnkpIHsKKyAgICAgICAgbVlvdW5nZXN0ID0gZW50cnktPnBhcmVudDsKKyAgICB9CisKKyAgICBlbnRyeS0+cGFyZW50LmNsZWFyKCk7CisgICAgZW50cnktPmNoaWxkLmNsZWFyKCk7Cit9CisKK307IC8vIG5hbWVzcGFjZSB1aXJlbmRlcmVyCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgLy8gQU5EUk9JRF9VSV9HRU5FUkFUSU9OX0NBQ0hFX0gKZGlmZiAtLWdpdCBhL2xpYnMvaHd1aS9HcmFkaWVudENhY2hlLmNwcCBiL2xpYnMvaHd1aS9HcmFkaWVudENhY2hlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OTU3MzcwCi0tLSAvZGV2L251bGwKKysrIGIvbGlicy9od3VpL0dyYWRpZW50Q2FjaGUuY3BwCkBAIC0wLDAgKzEsMTg4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJPcGVuR0xSZW5kZXJlciIKKworI2luY2x1ZGUgPEdMRVMyL2dsMi5oPgorCisjaW5jbHVkZSA8U2tDYW52YXMuaD4KKyNpbmNsdWRlIDxTa0dyYWRpZW50U2hhZGVyLmg+CisKKyNpbmNsdWRlIDx1dGlscy90aHJlYWRzLmg+CisKKyNpbmNsdWRlICJHcmFkaWVudENhY2hlLmgiCisjaW5jbHVkZSAiUHJvcGVydGllcy5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgdWlyZW5kZXJlciB7CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIENvbnN0cnVjdG9ycy9kZXN0cnVjdG9yCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK0dyYWRpZW50Q2FjaGU6OkdyYWRpZW50Q2FjaGUoKToKKyAgICAgICAgbUNhY2hlKEdlbmVyYXRpb25DYWNoZTxTa1NoYWRlciosIFRleHR1cmUqPjo6a1VubGltaXRlZENhcGFjaXR5KSwKKyAgICAgICAgbVNpemUoMCksIG1NYXhTaXplKE1CKERFRkFVTFRfR1JBRElFTlRfQ0FDSEVfU0laRSkpIHsKKyAgICBjaGFyIHByb3BlcnR5W1BST1BFUlRZX1ZBTFVFX01BWF07CisgICAgaWYgKHByb3BlcnR5X2dldChQUk9QRVJUWV9HUkFESUVOVF9DQUNIRV9TSVpFLCBwcm9wZXJ0eSwgTlVMTCkgPiAwKSB7CisgICAgICAgIExPR0QoIiAgU2V0dGluZyBncmFkaWVudCBjYWNoZSBzaXplIHRvICVzTUIiLCBwcm9wZXJ0eSk7CisgICAgICAgIHNldE1heFNpemUoTUIoYXRvZihwcm9wZXJ0eSkpKTsKKyAgICB9IGVsc2UgeworICAgICAgICBMT0dEKCIgIFVzaW5nIGRlZmF1bHQgZ3JhZGllbnQgY2FjaGUgc2l6ZSBvZiAlLjJmTUIiLCBERUZBVUxUX0dSQURJRU5UX0NBQ0hFX1NJWkUpOworICAgIH0KKworICAgIG1DYWNoZS5zZXRPbkVudHJ5UmVtb3ZlZExpc3RlbmVyKHRoaXMpOworfQorCitHcmFkaWVudENhY2hlOjpHcmFkaWVudENhY2hlKHVpbnQzMl90IG1heEJ5dGVTaXplKToKKyAgICAgICAgbUNhY2hlKEdlbmVyYXRpb25DYWNoZTxTa1NoYWRlciosIFRleHR1cmUqPjo6a1VubGltaXRlZENhcGFjaXR5KSwKKyAgICAgICAgbVNpemUoMCksIG1NYXhTaXplKG1heEJ5dGVTaXplKSB7CisgICAgbUNhY2hlLnNldE9uRW50cnlSZW1vdmVkTGlzdGVuZXIodGhpcyk7Cit9CisKK0dyYWRpZW50Q2FjaGU6On5HcmFkaWVudENhY2hlKCkgeworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgbUNhY2hlLmNsZWFyKCk7Cit9CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIFNpemUgbWFuYWdlbWVudAorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCit1aW50MzJfdCBHcmFkaWVudENhY2hlOjpnZXRTaXplKCkgeworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgcmV0dXJuIG1TaXplOworfQorCit1aW50MzJfdCBHcmFkaWVudENhY2hlOjpnZXRNYXhTaXplKCkgeworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgcmV0dXJuIG1NYXhTaXplOworfQorCit2b2lkIEdyYWRpZW50Q2FjaGU6OnNldE1heFNpemUodWludDMyX3QgbWF4U2l6ZSkgeworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgbU1heFNpemUgPSBtYXhTaXplOworICAgIHdoaWxlIChtU2l6ZSA+IG1NYXhTaXplKSB7CisgICAgICAgIG1DYWNoZS5yZW1vdmVPbGRlc3QoKTsKKyAgICB9Cit9CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIENhbGxiYWNrcworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCit2b2lkIEdyYWRpZW50Q2FjaGU6Om9wZXJhdG9yKCkoU2tTaGFkZXIqJiBzaGFkZXIsIFRleHR1cmUqJiB0ZXh0dXJlKSB7CisgICAgLy8gQWxyZWFkeSBsb2NrZWQgaGVyZQorICAgIGlmIChzaGFkZXIpIHsKKyAgICAgICAgY29uc3QgdWludDMyX3Qgc2l6ZSA9IHRleHR1cmUtPndpZHRoICogdGV4dHVyZS0+aGVpZ2h0ICogNDsKKyAgICAgICAgbVNpemUgLT0gc2l6ZTsKKyAgICB9CisKKyAgICBpZiAodGV4dHVyZSkgeworICAgICAgICBnbERlbGV0ZVRleHR1cmVzKDEsICZ0ZXh0dXJlLT5pZCk7CisgICAgICAgIGRlbGV0ZSB0ZXh0dXJlOworICAgIH0KK30KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gQ2FjaGluZworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitUZXh0dXJlKiBHcmFkaWVudENhY2hlOjpnZXQoU2tTaGFkZXIqIHNoYWRlcikgeworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgcmV0dXJuIG1DYWNoZS5nZXQoc2hhZGVyKTsKK30KKwordm9pZCBHcmFkaWVudENhY2hlOjpyZW1vdmUoU2tTaGFkZXIqIHNoYWRlcikgeworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgbUNhY2hlLnJlbW92ZShzaGFkZXIpOworfQorCit2b2lkIEdyYWRpZW50Q2FjaGU6OmNsZWFyKCkgeworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgbUNhY2hlLmNsZWFyKCk7Cit9CisKK1RleHR1cmUqIEdyYWRpZW50Q2FjaGU6OmFkZExpbmVhckdyYWRpZW50KFNrU2hhZGVyKiBzaGFkZXIsIGZsb2F0KiBib3VuZHMsIHVpbnQzMl90KiBjb2xvcnMsCisgICAgICAgIGZsb2F0KiBwb3NpdGlvbnMsIGludCBjb3VudCwgU2tTaGFkZXI6OlRpbGVNb2RlIHRpbGVNb2RlKSB7CisgICAgU2tCaXRtYXAgYml0bWFwOworICAgIGJpdG1hcC5zZXRDb25maWcoU2tCaXRtYXA6OmtBUkdCXzg4ODhfQ29uZmlnLCAxMDI0LCAxKTsKKyAgICBiaXRtYXAuYWxsb2NQaXhlbHMoKTsKKyAgICBiaXRtYXAuZXJhc2VDb2xvcigwKTsKKworICAgIFNrQ2FudmFzIGNhbnZhcyhiaXRtYXApOworCisgICAgU2tQb2ludCBwb2ludHNbMl07CisgICAgcG9pbnRzWzBdLnNldCgwLjBmLCAwLjBmKTsKKyAgICBwb2ludHNbMV0uc2V0KGJpdG1hcC53aWR0aCgpLCAwLjBmKTsKKworICAgIFNrU2hhZGVyKiBsb2NhbFNoYWRlciA9IFNrR3JhZGllbnRTaGFkZXI6OkNyZWF0ZUxpbmVhcihwb2ludHMsCisgICAgICAgICAgICByZWludGVycHJldF9jYXN0PGNvbnN0IFNrQ29sb3IqPihjb2xvcnMpLCBwb3NpdGlvbnMsIGNvdW50LCB0aWxlTW9kZSk7CisKKyAgICBTa1BhaW50IHA7CisgICAgcC5zZXRTdHlsZShTa1BhaW50OjprU3Ryb2tlQW5kRmlsbF9TdHlsZSk7CisgICAgcC5zZXRTaGFkZXIobG9jYWxTaGFkZXIpLT51bnJlZigpOworCisgICAgY2FudmFzLmRyYXdSZWN0Q29vcmRzKDAuMGYsIDAuMGYsIGJpdG1hcC53aWR0aCgpLCAxLjBmLCBwKTsKKworICAgIG1Mb2NrLmxvY2soKTsKKyAgICAvLyBBc3VtZSB0aGUgY2FjaGUgaXMgYWx3YXlzIGJpZyBlbm91Z2gKKyAgICBjb25zdCB1aW50MzJfdCBzaXplID0gYml0bWFwLnJvd0J5dGVzKCkgKiBiaXRtYXAuaGVpZ2h0KCk7CisgICAgd2hpbGUgKG1TaXplICsgc2l6ZSA+IG1NYXhTaXplKSB7CisgICAgICAgIG1DYWNoZS5yZW1vdmVPbGRlc3QoKTsKKyAgICB9CisgICAgbUxvY2sudW5sb2NrKCk7CisKKyAgICBUZXh0dXJlKiB0ZXh0dXJlID0gbmV3IFRleHR1cmU7CisgICAgZ2VuZXJhdGVUZXh0dXJlKCZiaXRtYXAsIHRleHR1cmUpOworCisgICAgbUxvY2subG9jaygpOworICAgIG1TaXplICs9IHNpemU7CisgICAgbUNhY2hlLnB1dChzaGFkZXIsIHRleHR1cmUpOworICAgIG1Mb2NrLnVubG9jaygpOworCisgICAgcmV0dXJuIHRleHR1cmU7Cit9CisKK3ZvaWQgR3JhZGllbnRDYWNoZTo6Z2VuZXJhdGVUZXh0dXJlKFNrQml0bWFwKiBiaXRtYXAsIFRleHR1cmUqIHRleHR1cmUpIHsKKyAgICBTa0F1dG9Mb2NrUGl4ZWxzIGF1dG9Mb2NrKCpiaXRtYXApOworICAgIGlmICghYml0bWFwLT5yZWFkeVRvRHJhdygpKSB7CisgICAgICAgIExPR0UoIkNhbm5vdCBnZW5lcmF0ZSB0ZXh0dXJlIGZyb20gc2hhZGVyIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICB0ZXh0dXJlLT5nZW5lcmF0aW9uID0gYml0bWFwLT5nZXRHZW5lcmF0aW9uSUQoKTsKKyAgICB0ZXh0dXJlLT53aWR0aCA9IGJpdG1hcC0+d2lkdGgoKTsKKyAgICB0ZXh0dXJlLT5oZWlnaHQgPSBiaXRtYXAtPmhlaWdodCgpOworCisgICAgZ2xHZW5UZXh0dXJlcygxLCAmdGV4dHVyZS0+aWQpOworCisgICAgZ2xCaW5kVGV4dHVyZShHTF9URVhUVVJFXzJELCB0ZXh0dXJlLT5pZCk7CisgICAgZ2xQaXhlbFN0b3JlaShHTF9VTlBBQ0tfQUxJR05NRU5ULCBiaXRtYXAtPmJ5dGVzUGVyUGl4ZWwoKSk7CisKKyAgICB0ZXh0dXJlLT5ibGVuZCA9ICFiaXRtYXAtPmlzT3BhcXVlKCk7CisgICAgZ2xUZXhJbWFnZTJEKEdMX1RFWFRVUkVfMkQsIDAsIEdMX1JHQkEsIGJpdG1hcC0+cm93Qnl0ZXNBc1BpeGVscygpLCB0ZXh0dXJlLT5oZWlnaHQsIDAsCisgICAgICAgICAgICBHTF9SR0JBLCBHTF9VTlNJR05FRF9CWVRFLCBiaXRtYXAtPmdldFBpeGVscygpKTsKKworICAgIGdsVGV4UGFyYW1ldGVyaShHTF9URVhUVVJFXzJELCBHTF9URVhUVVJFX01JTl9GSUxURVIsIEdMX0xJTkVBUik7CisgICAgZ2xUZXhQYXJhbWV0ZXJpKEdMX1RFWFRVUkVfMkQsIEdMX1RFWFRVUkVfTUFHX0ZJTFRFUiwgR0xfTElORUFSKTsKKworICAgIGdsVGV4UGFyYW1ldGVyaShHTF9URVhUVVJFXzJELCBHTF9URVhUVVJFX1dSQVBfUywgR0xfQ0xBTVBfVE9fRURHRSk7CisgICAgZ2xUZXhQYXJhbWV0ZXJpKEdMX1RFWFRVUkVfMkQsIEdMX1RFWFRVUkVfV1JBUF9ULCBHTF9DTEFNUF9UT19FREdFKTsKK30KKworfTsgLy8gbmFtZXNwYWNlIHVpcmVuZGVyZXIKK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9saWJzL2h3dWkvR3JhZGllbnRDYWNoZS5oIGIvbGlicy9od3VpL0dyYWRpZW50Q2FjaGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MWE4YzAxCi0tLSAvZGV2L251bGwKKysrIGIvbGlicy9od3VpL0dyYWRpZW50Q2FjaGUuaApAQCAtMCwwICsxLDk2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX1VJX0dSQURJRU5UX0NBQ0hFX0gKKyNkZWZpbmUgQU5EUk9JRF9VSV9HUkFESUVOVF9DQUNIRV9ICisKKyNpbmNsdWRlIDxTa1NoYWRlci5oPgorCisjaW5jbHVkZSAiVGV4dHVyZS5oIgorI2luY2x1ZGUgIkdlbmVyYXRpb25DYWNoZS5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgdWlyZW5kZXJlciB7CisKKy8qKgorICogQSBzaW1wbGUgTFJVIGdyYWRpZW50IGNhY2hlLiBUaGUgY2FjaGUgaGFzIGEgbWF4aW11bSBzaXplIGV4cHJlc3NlZCBpbiBieXRlcy4KKyAqIEFueSB0ZXh0dXJlIGFkZGVkIHRvIHRoZSBjYWNoZSBjYXVzaW5nIHRoZSBjYWNoZSB0byBncm93IGJleW9uZCB0aGUgbWF4aW11bQorICogYWxsb3dlZCBzaXplIHdpbGwgYWxzbyBjYXVzZSB0aGUgb2xkZXN0IHRleHR1cmUgdG8gYmUga2lja2VkIG91dC4KKyAqLworY2xhc3MgR3JhZGllbnRDYWNoZTogcHVibGljIE9uRW50cnlSZW1vdmVkPFNrU2hhZGVyKiwgVGV4dHVyZSo+IHsKK3B1YmxpYzoKKyAgICBHcmFkaWVudENhY2hlKCk7CisgICAgR3JhZGllbnRDYWNoZSh1aW50MzJfdCBtYXhCeXRlU2l6ZSk7CisgICAgfkdyYWRpZW50Q2FjaGUoKTsKKworICAgIC8qKgorICAgICAqIFVzZWQgYXMgYSBjYWxsYmFjayB3aGVuIGFuIGVudHJ5IGlzIHJlbW92ZWQgZnJvbSB0aGUgY2FjaGUuCisgICAgICogRG8gbm90IGludm9rZSBkaXJlY3RseS4KKyAgICAgKi8KKyAgICB2b2lkIG9wZXJhdG9yKCkoU2tTaGFkZXIqJiBzaGFkZXIsIFRleHR1cmUqJiB0ZXh0dXJlKTsKKworICAgIC8qKgorICAgICAqIEFkZHMgYSBuZXcgbGluZWFyIGdyYWRpZW50IHRvIHRoZSBjYWNoZS4gVGhlIGdlbmVyYXRlZCB0ZXh0dXJlIGlzCisgICAgICogcmV0dXJuZWQuCisgICAgICovCisgICAgVGV4dHVyZSogYWRkTGluZWFyR3JhZGllbnQoU2tTaGFkZXIqIHNoYWRlciwgZmxvYXQqIGJvdW5kcywgdWludDMyX3QqIGNvbG9ycywKKyAgICAgICAgICAgIGZsb2F0KiBwb3NpdGlvbnMsIGludCBjb3VudCwgU2tTaGFkZXI6OlRpbGVNb2RlIHRpbGVNb2RlKTsKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSB0ZXh0dXJlIGFzc29jaWF0ZWQgd2l0aCB0aGUgc3BlY2lmaWVkIHNoYWRlci4KKyAgICAgKi8KKyAgICBUZXh0dXJlKiBnZXQoU2tTaGFkZXIqIHNoYWRlcik7CisgICAgLyoqCisgICAgICogUmVtb3ZlcyB0aGUgdGV4dHVyZSBhc3NvY2lhdGVkIHdpdGggdGhlIHNwZWNpZmllZCBzaGFkZXIuIFJldHVybnMgTlVMTAorICAgICAqIGlmIHRoZSB0ZXh0dXJlIGNhbm5vdCBiZSBmb3VuZC4gVXBvbiByZW1vdmUgdGhlIHRleHR1cmUgaXMgZnJlZWQuCisgICAgICovCisgICAgdm9pZCByZW1vdmUoU2tTaGFkZXIqIHNoYWRlcik7CisgICAgLyoqCisgICAgICogQ2xlYXJzIHRoZSBjYWNoZS4gVGhpcyBjYXVzZXMgYWxsIHRleHR1cmVzIHRvIGJlIGRlbGV0ZWQuCisgICAgICovCisgICAgdm9pZCBjbGVhcigpOworCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgbWF4aW11bSBzaXplIG9mIHRoZSBjYWNoZSBpbiBieXRlcy4KKyAgICAgKi8KKyAgICB2b2lkIHNldE1heFNpemUodWludDMyX3QgbWF4U2l6ZSk7CisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgbWF4aW11bSBzaXplIG9mIHRoZSBjYWNoZSBpbiBieXRlcy4KKyAgICAgKi8KKyAgICB1aW50MzJfdCBnZXRNYXhTaXplKCk7CisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgY3VycmVudCBzaXplIG9mIHRoZSBjYWNoZSBpbiBieXRlcy4KKyAgICAgKi8KKyAgICB1aW50MzJfdCBnZXRTaXplKCk7CisKK3ByaXZhdGU6CisgICAgdm9pZCBnZW5lcmF0ZVRleHR1cmUoU2tCaXRtYXAqIGJpdG1hcCwgVGV4dHVyZSogdGV4dHVyZSk7CisKKyAgICBHZW5lcmF0aW9uQ2FjaGU8U2tTaGFkZXIqLCBUZXh0dXJlKj4gbUNhY2hlOworCisgICAgdWludDMyX3QgbVNpemU7CisgICAgdWludDMyX3QgbU1heFNpemU7CisKKyAgICAvKioKKyAgICAgKiBVc2VkIHRvIGFjY2VzcyBtQ2FjaGUgYW5kIG1TaXplLiBBbGwgbWV0aG9kcyBhcmUgYWNjZXNzZWQgZnJvbSBhIHNpbmdsZQorICAgICAqIHRocmVhZCBleGNlcHQgZm9yIHJlbW92ZSgpLgorICAgICAqLworICAgIG11dGFibGUgTXV0ZXggbUxvY2s7Cit9OyAvLyBjbGFzcyBHcmFkaWVudENhY2hlCisKK307IC8vIG5hbWVzcGFjZSB1aXJlbmRlcmVyCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgLy8gQU5EUk9JRF9VSV9HUkFESUVOVF9DQUNIRV9ICmRpZmYgLS1naXQgYS9saWJzL2h3dWkvTGF5ZXIuaCBiL2xpYnMvaHd1aS9MYXllci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM1MjcwMzgKLS0tIC9kZXYvbnVsbAorKysgYi9saWJzL2h3dWkvTGF5ZXIuaApAQCAtMCwwICsxLDkwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX1VJX0xBWUVSX0gKKyNkZWZpbmUgQU5EUk9JRF9VSV9MQVlFUl9ICisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKworI2luY2x1ZGUgPEdMRVMyL2dsMi5oPgorCisjaW5jbHVkZSA8U2tYZmVybW9kZS5oPgorCisjaW5jbHVkZSAiUmVjdC5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgdWlyZW5kZXJlciB7CisKKy8qKgorICogRGltZW5zaW9ucyBvZiBhIGxheWVyLgorICovCitzdHJ1Y3QgTGF5ZXJTaXplIHsKKyAgICBMYXllclNpemUoKTogd2lkdGgoMCksIGhlaWdodCgwKSwgaWQoMCkgeyB9CisgICAgTGF5ZXJTaXplKGNvbnN0IHVpbnQzMl90IHdpZHRoLCBjb25zdCB1aW50MzJfdCBoZWlnaHQpOiB3aWR0aCh3aWR0aCksIGhlaWdodChoZWlnaHQpLCBpZCgwKSB7IH0KKyAgICBMYXllclNpemUoY29uc3QgTGF5ZXJTaXplJiBzaXplKTogd2lkdGgoc2l6ZS53aWR0aCksIGhlaWdodChzaXplLmhlaWdodCksIGlkKHNpemUuaWQpIHsgfQorCisgICAgdWludDMyX3Qgd2lkdGg7CisgICAgdWludDMyX3QgaGVpZ2h0OworCisgICAgLy8gSW5jcmVtZW50YWwgaWQgdXNlZCBieSB0aGUgbGF5ZXIgY2FjaGUgdG8gc3RvcmUgbXVsdGlwbGUKKyAgICAvLyBMYXllclNpemUgd2l0aCB0aGUgc2FtZSBkaW1lbnNpb25zCisgICAgdWludDMyX3QgaWQ7CisKKyAgICBib29sIG9wZXJhdG9yPChjb25zdCBMYXllclNpemUmIHJocykgY29uc3QgeworICAgICAgICBpZiAoaWQgIT0gMCAmJiByaHMuaWQgIT0gMCkgeworICAgICAgICAgICAgcmV0dXJuIGlkIDwgcmhzLmlkOworICAgICAgICB9CisgICAgICAgIGlmICh3aWR0aCA9PSByaHMud2lkdGgpIHsKKyAgICAgICAgICAgIHJldHVybiBoZWlnaHQgPCByaHMuaGVpZ2h0OworICAgICAgICB9CisgICAgICAgIHJldHVybiB3aWR0aCA8IHJocy53aWR0aDsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yPT0oY29uc3QgTGF5ZXJTaXplJiByaHMpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIHdpZHRoID09IHJocy53aWR0aCAmJiBoZWlnaHQgPT0gcmhzLmhlaWdodDsKKyAgICB9Cit9OyAvLyBzdHJ1Y3QgTGF5ZXJTaXplCisKKy8qKgorICogQSBsYXllciBoYXMgZGltZW5zaW9ucyBhbmQgaXMgYmFja2VkIGJ5IGFuIE9wZW5HTCB0ZXh0dXJlLgorICovCitzdHJ1Y3QgTGF5ZXIgeworICAgIC8qKgorICAgICAqIENvb3JkaW5hdGVzIG9mIHRoZSBsYXllci4KKyAgICAgKi8KKyAgICBSZWN0IGxheWVyOworICAgIC8qKgorICAgICAqIE5hbWUgb2YgdGhlIHRleHR1cmUgdXNlZCB0byByZW5kZXIgdGhlIGxheWVyLgorICAgICAqLworICAgIEdMdWludCB0ZXh0dXJlOworICAgIC8qKgorICAgICAqIE9wYWNpdHkgb2YgdGhlIGxheWVyLgorICAgICAqLworICAgIGludCBhbHBoYTsKKyAgICAvKioKKyAgICAgKiBCbGVuZGluZyBtb2RlIG9mIHRoZSBsYXllci4KKyAgICAgKi8KKyAgICBTa1hmZXJtb2RlOjpNb2RlIG1vZGU7CisgICAgLyoqCisgICAgICogSW5kaWNhdGVzIHdoZXRoZXIgdGhpcyBsYXllciBzaG91bGQgYmUgYmxlbmRlZC4KKyAgICAgKi8KKyAgICBib29sIGJsZW5kOworfTsgLy8gc3RydWN0IExheWVyCisKK307IC8vIG5hbWVzcGFjZSB1aXJlbmRlcmVyCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgLy8gQU5EUk9JRF9VSV9MQVlFUl9ICmRpZmYgLS1naXQgYS9saWJzL2h3dWkvTGF5ZXJDYWNoZS5jcHAgYi9saWJzL2h3dWkvTGF5ZXJDYWNoZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWExODc2NgotLS0gL2Rldi9udWxsCisrKyBiL2xpYnMvaHd1aS9MYXllckNhY2hlLmNwcApAQCAtMCwwICsxLDE1MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiT3BlbkdMUmVuZGVyZXIiCisKKyNpbmNsdWRlIDxHTEVTMi9nbDIuaD4KKworI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSAiTGF5ZXJDYWNoZS5oIgorI2luY2x1ZGUgIlByb3BlcnRpZXMuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIHVpcmVuZGVyZXIgeworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBDb25zdHJ1Y3RvcnMvZGVzdHJ1Y3RvcgorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitMYXllckNhY2hlOjpMYXllckNhY2hlKCk6CisgICAgICAgIG1DYWNoZShHZW5lcmF0aW9uQ2FjaGU8TGF5ZXJTaXplLCBMYXllcio+OjprVW5saW1pdGVkQ2FwYWNpdHkpLAorICAgICAgICBtSWRHZW5lcmF0b3IoMSksIG1TaXplKDApLCBtTWF4U2l6ZShNQihERUZBVUxUX0xBWUVSX0NBQ0hFX1NJWkUpKSB7CisgICAgY2hhciBwcm9wZXJ0eVtQUk9QRVJUWV9WQUxVRV9NQVhdOworICAgIGlmIChwcm9wZXJ0eV9nZXQoUFJPUEVSVFlfTEFZRVJfQ0FDSEVfU0laRSwgcHJvcGVydHksIE5VTEwpID4gMCkgeworICAgICAgICBMT0dEKCIgIFNldHRpbmcgbGF5ZXIgY2FjaGUgc2l6ZSB0byAlc01CIiwgcHJvcGVydHkpOworICAgICAgICBzZXRNYXhTaXplKE1CKGF0b2YocHJvcGVydHkpKSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgTE9HRCgiICBVc2luZyBkZWZhdWx0IGxheWVyIGNhY2hlIHNpemUgb2YgJS4yZk1CIiwgREVGQVVMVF9MQVlFUl9DQUNIRV9TSVpFKTsKKyAgICB9Cit9CisKK0xheWVyQ2FjaGU6OkxheWVyQ2FjaGUodWludDMyX3QgbWF4Qnl0ZVNpemUpOgorICAgICAgICBtQ2FjaGUoR2VuZXJhdGlvbkNhY2hlPExheWVyU2l6ZSwgTGF5ZXIqPjo6a1VubGltaXRlZENhcGFjaXR5KSwKKyAgICAgICAgbUlkR2VuZXJhdG9yKDEpLCBtU2l6ZSgwKSwgbU1heFNpemUobWF4Qnl0ZVNpemUpIHsKK30KKworTGF5ZXJDYWNoZTo6fkxheWVyQ2FjaGUoKSB7CisgICAgY2xlYXIoKTsKK30KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gU2l6ZSBtYW5hZ2VtZW50CisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK3VpbnQzMl90IExheWVyQ2FjaGU6OmdldFNpemUoKSB7CisgICAgcmV0dXJuIG1TaXplOworfQorCit1aW50MzJfdCBMYXllckNhY2hlOjpnZXRNYXhTaXplKCkgeworICAgIHJldHVybiBtTWF4U2l6ZTsKK30KKwordm9pZCBMYXllckNhY2hlOjpzZXRNYXhTaXplKHVpbnQzMl90IG1heFNpemUpIHsKKyAgICBtTWF4U2l6ZSA9IG1heFNpemU7CisgICAgd2hpbGUgKG1TaXplID4gbU1heFNpemUpIHsKKyAgICAgICAgTGF5ZXIqIG9sZGVzdCA9IG1DYWNoZS5yZW1vdmVPbGRlc3QoKTsKKyAgICAgICAgZGVsZXRlTGF5ZXIob2xkZXN0KTsKKyAgICB9Cit9CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIENhbGxiYWNrcworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCit2b2lkIExheWVyQ2FjaGU6Om9wZXJhdG9yKCkoTGF5ZXJTaXplJiBzaXplLCBMYXllciomIGxheWVyKSB7CisgICAgZGVsZXRlTGF5ZXIobGF5ZXIpOworfQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBDYWNoaW5nCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK3ZvaWQgTGF5ZXJDYWNoZTo6ZGVsZXRlTGF5ZXIoTGF5ZXIqIGxheWVyKSB7CisgICAgaWYgKGxheWVyKSB7CisgICAgICAgIG1TaXplIC09IGxheWVyLT5sYXllci5nZXRXaWR0aCgpICogbGF5ZXItPmxheWVyLmdldEhlaWdodCgpICogNDsKKworICAgICAgICBnbERlbGV0ZVRleHR1cmVzKDEsICZsYXllci0+dGV4dHVyZSk7CisgICAgICAgIGRlbGV0ZSBsYXllcjsKKyAgICB9Cit9CisKK3ZvaWQgTGF5ZXJDYWNoZTo6Y2xlYXIoKSB7CisgICAgbUNhY2hlLnNldE9uRW50cnlSZW1vdmVkTGlzdGVuZXIodGhpcyk7CisgICAgbUNhY2hlLmNsZWFyKCk7CisgICAgbUNhY2hlLnNldE9uRW50cnlSZW1vdmVkTGlzdGVuZXIoTlVMTCk7Cit9CisKK0xheWVyKiBMYXllckNhY2hlOjpnZXQoTGF5ZXJTaXplJiBzaXplKSB7CisgICAgTGF5ZXIqIGxheWVyID0gbUNhY2hlLnJlbW92ZShzaXplKTsKKyAgICBpZiAobGF5ZXIpIHsKKyAgICAgICAgTEFZRVJfTE9HRCgiUmV1c2luZyBsYXllciIpOworCisgICAgICAgIG1TaXplIC09IGxheWVyLT5sYXllci5nZXRXaWR0aCgpICogbGF5ZXItPmxheWVyLmdldEhlaWdodCgpICogNDsKKyAgICB9IGVsc2UgeworICAgICAgICBMQVlFUl9MT0dEKCJDcmVhdGluZyBuZXcgbGF5ZXIiKTsKKworICAgICAgICBsYXllciA9IG5ldyBMYXllcjsKKyAgICAgICAgbGF5ZXItPmJsZW5kID0gdHJ1ZTsKKworICAgICAgICAvLyBHZW5lcmF0ZSB0aGUgdGV4dHVyZSBpbiB3aGljaCB0aGUgRkJPIHdpbGwgZHJhdworICAgICAgICBnbEdlblRleHR1cmVzKDEsICZsYXllci0+dGV4dHVyZSk7CisgICAgICAgIGdsQmluZFRleHR1cmUoR0xfVEVYVFVSRV8yRCwgbGF5ZXItPnRleHR1cmUpOworCisgICAgICAgIC8vIFRoZSBGQk8gd2lsbCBub3QgYmUgc2NhbGVkLCBzbyB3ZSBjYW4gdXNlIGxvd2VyIHF1YWxpdHkgZmlsdGVyaW5nCisgICAgICAgIGdsVGV4UGFyYW1ldGVyaShHTF9URVhUVVJFXzJELCBHTF9URVhUVVJFX01JTl9GSUxURVIsIEdMX05FQVJFU1QpOworICAgICAgICBnbFRleFBhcmFtZXRlcmkoR0xfVEVYVFVSRV8yRCwgR0xfVEVYVFVSRV9NQUdfRklMVEVSLCBHTF9ORUFSRVNUKTsKKworICAgICAgICBnbFRleFBhcmFtZXRlcmkoR0xfVEVYVFVSRV8yRCwgR0xfVEVYVFVSRV9XUkFQX1MsIEdMX0NMQU1QX1RPX0VER0UpOworICAgICAgICBnbFRleFBhcmFtZXRlcmkoR0xfVEVYVFVSRV8yRCwgR0xfVEVYVFVSRV9XUkFQX1QsIEdMX0NMQU1QX1RPX0VER0UpOworCisgICAgICAgIGdsVGV4SW1hZ2UyRChHTF9URVhUVVJFXzJELCAwLCBHTF9SR0JBLCBzaXplLndpZHRoLCBzaXplLmhlaWdodCwgMCwKKyAgICAgICAgICAgICAgICBHTF9SR0JBLCBHTF9VTlNJR05FRF9CWVRFLCBOVUxMKTsKKyAgICB9CisKKyAgICByZXR1cm4gbGF5ZXI7Cit9CisKK2Jvb2wgTGF5ZXJDYWNoZTo6cHV0KExheWVyU2l6ZSYgbGF5ZXJTaXplLCBMYXllciogbGF5ZXIpIHsKKyAgICBjb25zdCB1aW50MzJfdCBzaXplID0gbGF5ZXJTaXplLndpZHRoICogbGF5ZXJTaXplLmhlaWdodCAqIDQ7CisgICAgLy8gRG9uJ3QgZXZlbiB0cnkgdG8gY2FjaGUgYSBsYXllciB0aGF0J3MgYmlnZ2VyIHRoYW4gdGhlIGNhY2hlCisgICAgaWYgKHNpemUgPCBtTWF4U2l6ZSkgeworICAgICAgICB3aGlsZSAobVNpemUgKyBzaXplID4gbU1heFNpemUpIHsKKyAgICAgICAgICAgIExheWVyKiBvbGRlc3QgPSBtQ2FjaGUucmVtb3ZlT2xkZXN0KCk7CisgICAgICAgICAgICBkZWxldGVMYXllcihvbGRlc3QpOworICAgICAgICB9CisKKyAgICAgICAgbGF5ZXJTaXplLmlkID0gbUlkR2VuZXJhdG9yKys7CisgICAgICAgIG1DYWNoZS5wdXQobGF5ZXJTaXplLCBsYXllcik7CisgICAgICAgIG1TaXplICs9IHNpemU7CisKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKK30KKworfTsgLy8gbmFtZXNwYWNlIHVpcmVuZGVyZXIKK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9saWJzL2h3dWkvTGF5ZXJDYWNoZS5oIGIvbGlicy9od3VpL0xheWVyQ2FjaGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMGM3NTQyCi0tLSAvZGV2L251bGwKKysrIGIvbGlicy9od3VpL0xheWVyQ2FjaGUuaApAQCAtMCwwICsxLDEwOCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9VSV9MQVlFUl9DQUNIRV9ICisjZGVmaW5lIEFORFJPSURfVUlfTEFZRVJfQ0FDSEVfSAorCisjaW5jbHVkZSAiTGF5ZXIuaCIKKyNpbmNsdWRlICJHZW5lcmF0aW9uQ2FjaGUuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIHVpcmVuZGVyZXIgeworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBEZWZpbmVzCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKy8vIERlYnVnCisjZGVmaW5lIERFQlVHX0xBWUVSUyAwCisKKy8vIERlYnVnCisjaWYgREVCVUdfTEFZRVJTCisgICAgI2RlZmluZSBMQVlFUl9MT0dEKC4uLikgTE9HRChfX1ZBX0FSR1NfXykKKyNlbHNlCisgICAgI2RlZmluZSBMQVlFUl9MT0dEKC4uLikKKyNlbmRpZgorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBDYWNoZQorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitjbGFzcyBMYXllckNhY2hlOiBwdWJsaWMgT25FbnRyeVJlbW92ZWQ8TGF5ZXJTaXplLCBMYXllcio+IHsKK3B1YmxpYzoKKyAgICBMYXllckNhY2hlKCk7CisgICAgTGF5ZXJDYWNoZSh1aW50MzJfdCBtYXhCeXRlU2l6ZSk7CisgICAgfkxheWVyQ2FjaGUoKTsKKworICAgIC8qKgorICAgICAqIFVzZWQgYXMgYSBjYWxsYmFjayB3aGVuIGFuIGVudHJ5IGlzIHJlbW92ZWQgZnJvbSB0aGUgY2FjaGUuCisgICAgICogRG8gbm90IGludm9rZSBkaXJlY3RseS4KKyAgICAgKi8KKyAgICB2b2lkIG9wZXJhdG9yKCkoTGF5ZXJTaXplJiBzaXplLCBMYXllciomIGxheWVyKTsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIGxheWVyIG9mIHNwZWNpZmllZCBkaW1lbnNpb25zLiBJZiBub3Qgc3VpdGFibGUgbGF5ZXIKKyAgICAgKiBjYW4gYmUgZm91bmQsIGEgbmV3IG9uZSBpcyBjcmVhdGVkIGFuZCByZXR1cm5lZC4gSWYgY3JlYXRpbmcgYSBuZXcKKyAgICAgKiBsYXllciBmYWlscywgTlVMTCBpcyByZXR1cm5lZC4KKyAgICAgKgorICAgICAqIFdoZW4gYSBsYXllciBpcyBvYnRhaW5lZCBmcm9tIHRoZSBjYWNoZSwgaXQgaXMgcmVtb3ZlZCBhbmQgdGhlIHRvdGFsCisgICAgICogc2l6ZSBvZiB0aGUgY2FjaGUgZ29lcyBkb3duLgorICAgICAqCisgICAgICogQHBhcmFtIHNpemUgVGhlIGRpbWVuc2lvbnMgb2YgdGhlIGRlc2lyZWQgbGF5ZXIKKyAgICAgKi8KKyAgICBMYXllciogZ2V0KExheWVyU2l6ZSYgc2l6ZSk7CisgICAgLyoqCisgICAgICogQWRkcyB0aGUgbGF5ZXIgdG8gdGhlIGNhY2hlLiBUaGUgbGF5ZXIgd2lsbCBub3QgYmUgYWRkZWQgaWYgdGhlcmUgaXMKKyAgICAgKiBub3QgZW5vdWdoIHNwYWNlIGF2YWlsYWJsZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzaXplIFRoZSBkaW1lbnNpb25zIG9mIHRoZSBsYXllcgorICAgICAqIEBwYXJhbSBsYXllciBUaGUgbGF5ZXIgdG8gYWRkIHRvIHRoZSBjYWNoZQorICAgICAqCisgICAgICogQHJldHVybiBUcnVlIGlmIHRoZSBsYXllciB3YXMgYWRkZWQsIGZhbHNlIG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICBib29sIHB1dChMYXllclNpemUmIHNpemUsIExheWVyKiBsYXllcik7CisgICAgLyoqCisgICAgICogQ2xlYXJzIHRoZSBjYWNoZS4gVGhpcyBjYXVzZXMgYWxsIGxheWVycyB0byBiZSBkZWxldGVkLgorICAgICAqLworICAgIHZvaWQgY2xlYXIoKTsKKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIG1heGltdW0gc2l6ZSBvZiB0aGUgY2FjaGUgaW4gYnl0ZXMuCisgICAgICovCisgICAgdm9pZCBzZXRNYXhTaXplKHVpbnQzMl90IG1heFNpemUpOworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIG1heGltdW0gc2l6ZSBvZiB0aGUgY2FjaGUgaW4gYnl0ZXMuCisgICAgICovCisgICAgdWludDMyX3QgZ2V0TWF4U2l6ZSgpOworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIGN1cnJlbnQgc2l6ZSBvZiB0aGUgY2FjaGUgaW4gYnl0ZXMuCisgICAgICovCisgICAgdWludDMyX3QgZ2V0U2l6ZSgpOworCitwcml2YXRlOgorICAgIHZvaWQgZGVsZXRlTGF5ZXIoTGF5ZXIqIGxheWVyKTsKKworICAgIEdlbmVyYXRpb25DYWNoZTxMYXllclNpemUsIExheWVyKj4gbUNhY2hlOworICAgIHVpbnQzMl90IG1JZEdlbmVyYXRvcjsKKworICAgIHVpbnQzMl90IG1TaXplOworICAgIHVpbnQzMl90IG1NYXhTaXplOworfTsgLy8gY2xhc3MgTGF5ZXJDYWNoZQorCit9OyAvLyBuYW1lc3BhY2UgdWlyZW5kZXJlcgorfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmIC8vIEFORFJPSURfVUlfTEFZRVJfQ0FDSEVfSApkaWZmIC0tZ2l0IGEvbGlicy9od3VpL01PRFVMRV9MSUNFTlNFX0FQQUNIRTIgYi9saWJzL2h3dWkvTU9EVUxFX0xJQ0VOU0VfQVBBQ0hFMgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjlkZTI5Ci0tLSAvZGV2L251bGwKKysrIGIvbGlicy9od3VpL01PRFVMRV9MSUNFTlNFX0FQQUNIRTIKZGlmZiAtLWdpdCBhL2xpYnMvaHd1aS9NYXRyaXguY3BwIGIvbGlicy9od3VpL01hdHJpeC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjY0YWQzZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYnMvaHd1aS9NYXRyaXguY3BwCkBAIC0wLDAgKzEsMzA4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJPcGVuR0xSZW5kZXJlciIKKworI2luY2x1ZGUgPG1hdGguaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSA8U2tNYXRyaXguaD4KKworI2luY2x1ZGUgIk1hdHJpeC5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgdWlyZW5kZXJlciB7CisKK3ZvaWQgTWF0cml4NDo6bG9hZElkZW50aXR5KCkgeworICAgIGRhdGFba1NjYWxlWF0gICAgICAgPSAxLjBmOworICAgIGRhdGFba1NrZXdZXSAgICAgICAgPSAwLjBmOworICAgIGRhdGFbMl0gICAgICAgICAgICAgPSAwLjBmOworICAgIGRhdGFba1BlcnNwZWN0aXZlMF0gPSAwLjBmOworCisgICAgZGF0YVtrU2tld1hdICAgICAgICA9IDAuMGY7CisgICAgZGF0YVtrU2NhbGVZXSAgICAgICA9IDEuMGY7CisgICAgZGF0YVs2XSAgICAgICAgICAgICA9IDAuMGY7CisgICAgZGF0YVtrUGVyc3BlY3RpdmUxXSA9IDAuMGY7CisKKyAgICBkYXRhWzhdICAgICAgICAgICAgID0gMC4wZjsKKyAgICBkYXRhWzldICAgICAgICAgICAgID0gMC4wZjsKKyAgICBkYXRhW2tTY2FsZVpdICAgICAgID0gMS4wZjsKKyAgICBkYXRhWzExXSAgICAgICAgICAgID0gMC4wZjsKKworICAgIGRhdGFba1RyYW5zbGF0ZVhdICAgPSAwLjBmOworICAgIGRhdGFba1RyYW5zbGF0ZVldICAgPSAwLjBmOworICAgIGRhdGFba1RyYW5zbGF0ZVpdICAgPSAwLjBmOworICAgIGRhdGFba1BlcnNwZWN0aXZlMl0gPSAxLjBmOworCisgICAgbVNpbXBsZU1hdHJpeCA9IHRydWU7Cit9CisKK3ZvaWQgTWF0cml4NDo6bG9hZChjb25zdCBmbG9hdCogdikgeworICAgIG1lbWNweShkYXRhLCB2LCBzaXplb2YoZGF0YSkpOworICAgIG1TaW1wbGVNYXRyaXggPSBmYWxzZTsKK30KKwordm9pZCBNYXRyaXg0Ojpsb2FkKGNvbnN0IE1hdHJpeDQmIHYpIHsKKyAgICBtZW1jcHkoZGF0YSwgdi5kYXRhLCBzaXplb2YoZGF0YSkpOworICAgIG1TaW1wbGVNYXRyaXggPSB2Lm1TaW1wbGVNYXRyaXg7Cit9CisKK3ZvaWQgTWF0cml4NDo6bG9hZChjb25zdCBTa01hdHJpeCYgdikgeworICAgIG1lbXNldChkYXRhLCAwLCBzaXplb2YoZGF0YSkpOworCisgICAgZGF0YVtrU2NhbGVYXSAgICAgPSB2W1NrTWF0cml4OjprTVNjYWxlWF07CisgICAgZGF0YVtrU2tld1hdICAgICAgPSB2W1NrTWF0cml4OjprTVNrZXdYXTsKKyAgICBkYXRhW2tUcmFuc2xhdGVYXSA9IHZbU2tNYXRyaXg6OmtNVHJhbnNYXTsKKworICAgIGRhdGFba1NrZXdZXSAgICAgID0gdltTa01hdHJpeDo6a01Ta2V3WV07CisgICAgZGF0YVtrU2NhbGVZXSAgICAgPSB2W1NrTWF0cml4OjprTVNjYWxlWV07CisgICAgZGF0YVtrVHJhbnNsYXRlWV0gPSB2W1NrTWF0cml4OjprTVRyYW5zWV07CisKKyAgICBkYXRhW2tQZXJzcGVjdGl2ZTBdICA9IHZbU2tNYXRyaXg6OmtNUGVyc3AwXTsKKyAgICBkYXRhW2tQZXJzcGVjdGl2ZTFdICA9IHZbU2tNYXRyaXg6OmtNUGVyc3AxXTsKKyAgICBkYXRhW2tQZXJzcGVjdGl2ZTJdICA9IHZbU2tNYXRyaXg6OmtNUGVyc3AyXTsKKworICAgIGRhdGFba1NjYWxlWl0gPSAxLjBmOworCisgICAgbVNpbXBsZU1hdHJpeCA9ICh2LmdldFR5cGUoKSA8PSBTa01hdHJpeDo6a1NjYWxlX01hc2spOworfQorCit2b2lkIE1hdHJpeDQ6OmNvcHlUbyhTa01hdHJpeCYgdikgY29uc3QgeworICAgIHYucmVzZXQoKTsKKworICAgIHYuc2V0KFNrTWF0cml4OjprTVNjYWxlWCwgZGF0YVtrU2NhbGVYXSk7CisgICAgdi5zZXQoU2tNYXRyaXg6OmtNU2tld1gsICBkYXRhW2tTa2V3WF0pOworICAgIHYuc2V0KFNrTWF0cml4OjprTVRyYW5zWCwgZGF0YVtrVHJhbnNsYXRlWF0pOworCisgICAgdi5zZXQoU2tNYXRyaXg6OmtNU2tld1ksICBkYXRhW2tTa2V3WV0pOworICAgIHYuc2V0KFNrTWF0cml4OjprTVNjYWxlWSwgZGF0YVtrU2NhbGVZXSk7CisgICAgdi5zZXQoU2tNYXRyaXg6OmtNVHJhbnNZLCBkYXRhW2tUcmFuc2xhdGVZXSk7CisKKyAgICB2LnNldChTa01hdHJpeDo6a01QZXJzcDAsIGRhdGFba1BlcnNwZWN0aXZlMF0pOworICAgIHYuc2V0KFNrTWF0cml4OjprTVBlcnNwMSwgZGF0YVtrUGVyc3BlY3RpdmUxXSk7CisgICAgdi5zZXQoU2tNYXRyaXg6OmtNUGVyc3AyLCBkYXRhW2tQZXJzcGVjdGl2ZTJdKTsKK30KKwordm9pZCBNYXRyaXg0Ojpsb2FkSW52ZXJzZShjb25zdCBNYXRyaXg0JiB2KSB7CisgICAgZG91YmxlIHNjYWxlID0gMS4wIC8KKyAgICAgICAgICAgICh2LmRhdGFba1NjYWxlWF0gKiAoKGRvdWJsZSkgdi5kYXRhW2tTY2FsZVldICAqIHYuZGF0YVtrUGVyc3BlY3RpdmUyXSAtCisgICAgICAgICAgICAgICAgICAgIChkb3VibGUpIHYuZGF0YVtrVHJhbnNsYXRlWV0gKiB2LmRhdGFba1BlcnNwZWN0aXZlMV0pICsKKyAgICAgICAgICAgICB2LmRhdGFba1NrZXdYXSAqICgoZG91YmxlKSB2LmRhdGFba1RyYW5zbGF0ZVldICogdi5kYXRhW2tQZXJzcGVjdGl2ZTBdIC0KKyAgICAgICAgICAgICAgICAgICAgIChkb3VibGUpIHYuZGF0YVtrU2tld1ldICogdi5kYXRhW2tQZXJzcGVjdGl2ZTJdKSArCisgICAgICAgICAgICAgdi5kYXRhW2tUcmFuc2xhdGVYXSAqICgoZG91YmxlKSB2LmRhdGFba1NrZXdZXSAqIHYuZGF0YVtrUGVyc3BlY3RpdmUxXSAtCisgICAgICAgICAgICAgICAgICAgICAoZG91YmxlKSB2LmRhdGFba1NjYWxlWV0gKiB2LmRhdGFba1BlcnNwZWN0aXZlMF0pKTsKKworICAgIGRhdGFba1NjYWxlWF0gPSAodi5kYXRhW2tTY2FsZVldICogdi5kYXRhW2tQZXJzcGVjdGl2ZTJdIC0KKyAgICAgICAgICAgIHYuZGF0YVtrVHJhbnNsYXRlWV0gKiB2LmRhdGFba1BlcnNwZWN0aXZlMV0pICAqIHNjYWxlOworICAgIGRhdGFba1NrZXdYXSA9ICh2LmRhdGFba1RyYW5zbGF0ZVhdICogdi5kYXRhW2tQZXJzcGVjdGl2ZTFdIC0KKyAgICAgICAgICAgIHYuZGF0YVtrU2tld1hdICAqIHYuZGF0YVtrUGVyc3BlY3RpdmUyXSkgKiBzY2FsZTsKKyAgICBkYXRhW2tUcmFuc2xhdGVYXSA9ICh2LmRhdGFba1NrZXdYXSAqIHYuZGF0YVtrVHJhbnNsYXRlWV0gLQorICAgICAgICAgICAgdi5kYXRhW2tUcmFuc2xhdGVYXSAqIHYuZGF0YVtrU2NhbGVZXSkgICogc2NhbGU7CisKKyAgICBkYXRhW2tTa2V3WV0gPSAodi5kYXRhW2tUcmFuc2xhdGVZXSAqIHYuZGF0YVtrUGVyc3BlY3RpdmUwXSAtCisgICAgICAgICAgICB2LmRhdGFba1NrZXdZXSAgKiB2LmRhdGFba1BlcnNwZWN0aXZlMl0pICogc2NhbGU7CisgICAgZGF0YVtrU2NhbGVZXSA9ICh2LmRhdGFba1NjYWxlWF0gKiB2LmRhdGFba1BlcnNwZWN0aXZlMl0gLQorICAgICAgICAgICAgdi5kYXRhW2tUcmFuc2xhdGVYXSAqIHYuZGF0YVtrUGVyc3BlY3RpdmUwXSkgICogc2NhbGU7CisgICAgZGF0YVtrVHJhbnNsYXRlWV0gPSAodi5kYXRhW2tUcmFuc2xhdGVYXSAqIHYuZGF0YVtrU2tld1ldIC0KKyAgICAgICAgICAgIHYuZGF0YVtrU2NhbGVYXSAgKiB2LmRhdGFba1RyYW5zbGF0ZVldKSAqIHNjYWxlOworCisgICAgZGF0YVtrUGVyc3BlY3RpdmUwXSA9ICh2LmRhdGFba1NrZXdZXSAqIHYuZGF0YVtrUGVyc3BlY3RpdmUxXSAtCisgICAgICAgICAgICB2LmRhdGFba1NjYWxlWV0gKiB2LmRhdGFba1BlcnNwZWN0aXZlMF0pICogc2NhbGU7CisgICAgZGF0YVtrUGVyc3BlY3RpdmUxXSA9ICh2LmRhdGFba1NrZXdYXSAqIHYuZGF0YVtrUGVyc3BlY3RpdmUwXSAtCisgICAgICAgICAgICB2LmRhdGFba1NjYWxlWF0gKiB2LmRhdGFba1BlcnNwZWN0aXZlMV0pICogc2NhbGU7CisgICAgZGF0YVtrUGVyc3BlY3RpdmUyXSA9ICh2LmRhdGFba1NjYWxlWF0gKiB2LmRhdGFba1NjYWxlWV0gLQorICAgICAgICAgICAgdi5kYXRhW2tTa2V3WF0gKiB2LmRhdGFba1NrZXdZXSkgKiBzY2FsZTsKKworICAgIG1TaW1wbGVNYXRyaXggPSB2Lm1TaW1wbGVNYXRyaXg7Cit9CisKK3ZvaWQgTWF0cml4NDo6Y29weVRvKGZsb2F0KiB2KSBjb25zdCB7CisgICAgbWVtY3B5KHYsIGRhdGEsIHNpemVvZihkYXRhKSk7Cit9CisKK2Zsb2F0IE1hdHJpeDQ6OmdldFRyYW5zbGF0ZVgoKSB7CisgICAgcmV0dXJuIGRhdGFba1RyYW5zbGF0ZVhdOworfQorCitmbG9hdCBNYXRyaXg0OjpnZXRUcmFuc2xhdGVZKCkgeworICAgIHJldHVybiBkYXRhW2tUcmFuc2xhdGVZXTsKK30KKwordm9pZCBNYXRyaXg0Ojpsb2FkVHJhbnNsYXRlKGZsb2F0IHgsIGZsb2F0IHksIGZsb2F0IHopIHsKKyAgICBsb2FkSWRlbnRpdHkoKTsKKyAgICBkYXRhW2tUcmFuc2xhdGVYXSA9IHg7CisgICAgZGF0YVtrVHJhbnNsYXRlWV0gPSB5OworICAgIGRhdGFba1RyYW5zbGF0ZVpdID0gejsKK30KKwordm9pZCBNYXRyaXg0Ojpsb2FkU2NhbGUoZmxvYXQgc3gsIGZsb2F0IHN5LCBmbG9hdCBzeikgeworICAgIGxvYWRJZGVudGl0eSgpOworICAgIGRhdGFba1NjYWxlWF0gPSBzeDsKKyAgICBkYXRhW2tTY2FsZVldID0gc3k7CisgICAgZGF0YVtrU2NhbGVaXSA9IHN6OworfQorCit2b2lkIE1hdHJpeDQ6OmxvYWRSb3RhdGUoZmxvYXQgYW5nbGUsIGZsb2F0IHgsIGZsb2F0IHksIGZsb2F0IHopIHsKKyAgICBkYXRhW2tQZXJzcGVjdGl2ZTBdICA9IDAuMGY7CisgICAgZGF0YVtrUGVyc3BlY3RpdmUxXSAgPSAwLjBmOworICAgIGRhdGFbMTFdICAgICAgICAgICAgID0gMC4wZjsKKyAgICBkYXRhW2tUcmFuc2xhdGVYXSAgICA9IDAuMGY7CisgICAgZGF0YVtrVHJhbnNsYXRlWV0gICAgPSAwLjBmOworICAgIGRhdGFba1RyYW5zbGF0ZVpdICAgID0gMC4wZjsKKyAgICBkYXRhW2tQZXJzcGVjdGl2ZTJdICA9IDEuMGY7CisKKyAgICBhbmdsZSAqPSBmbG9hdChNX1BJIC8gMTgwLjBmKTsKKyAgICBmbG9hdCBjID0gY29zZihhbmdsZSk7CisgICAgZmxvYXQgcyA9IHNpbmYoYW5nbGUpOworCisgICAgY29uc3QgZmxvYXQgbGVuZ3RoID0gc3FydGYoeCAqIHggKyB5ICogeSArIHogKiB6KTsKKyAgICBmbG9hdCByZWNpcExlbiA9IDEuMGYgLyBsZW5ndGg7CisgICAgeCAqPSByZWNpcExlbjsKKyAgICB5ICo9IHJlY2lwTGVuOworICAgIHogKj0gcmVjaXBMZW47CisKKyAgICBjb25zdCBmbG9hdCBuYyA9IDEuMGYgLSBjOworICAgIGNvbnN0IGZsb2F0IHh5ID0geCAqIHk7CisgICAgY29uc3QgZmxvYXQgeXogPSB5ICogejsKKyAgICBjb25zdCBmbG9hdCB6eCA9IHogKiB4OworICAgIGNvbnN0IGZsb2F0IHhzID0geCAqIHM7CisgICAgY29uc3QgZmxvYXQgeXMgPSB5ICogczsKKyAgICBjb25zdCBmbG9hdCB6cyA9IHogKiBzOworCisgICAgZGF0YVtrU2NhbGVYXSA9IHggKiB4ICogbmMgKyAgYzsKKyAgICBkYXRhW2tTa2V3WF0gID0gICAgeHkgKiBuYyAtIHpzOworICAgIGRhdGFbOF0gICAgICAgPSAgICB6eCAqIG5jICsgeXM7CisgICAgZGF0YVtrU2tld1ldICA9ICAgIHh5ICogbmMgKyB6czsKKyAgICBkYXRhW2tTY2FsZVldID0geSAqIHkgKiBuYyArICBjOworICAgIGRhdGFbOV0gICAgICAgPSAgICB5eiAqIG5jIC0geHM7CisgICAgZGF0YVsyXSAgICAgICA9ICAgIHp4ICogbmMgLSB5czsKKyAgICBkYXRhWzZdICAgICAgID0gICAgeXogKiBuYyArIHhzOworICAgIGRhdGFba1NjYWxlWl0gPSB6ICogeiAqIG5jICsgIGM7CisKKyAgICBtU2ltcGxlTWF0cml4ID0gZmFsc2U7Cit9CisKK3ZvaWQgTWF0cml4NDo6bG9hZE11bHRpcGx5KGNvbnN0IE1hdHJpeDQmIHUsIGNvbnN0IE1hdHJpeDQmIHYpIHsKKyAgICBmb3IgKGludCBpID0gMCA7IGkgPCA0IDsgaSsrKSB7CisgICAgICAgIGZsb2F0IHggPSAwOworICAgICAgICBmbG9hdCB5ID0gMDsKKyAgICAgICAgZmxvYXQgeiA9IDA7CisgICAgICAgIGZsb2F0IHcgPSAwOworCisgICAgICAgIGZvciAoaW50IGogPSAwIDsgaiA8IDQgOyBqKyspIHsKKyAgICAgICAgICAgIGNvbnN0IGZsb2F0IGUgPSB2LmdldChpLCBqKTsKKyAgICAgICAgICAgIHggKz0gdS5nZXQoaiwgMCkgKiBlOworICAgICAgICAgICAgeSArPSB1LmdldChqLCAxKSAqIGU7CisgICAgICAgICAgICB6ICs9IHUuZ2V0KGosIDIpICogZTsKKyAgICAgICAgICAgIHcgKz0gdS5nZXQoaiwgMykgKiBlOworICAgICAgICB9CisKKyAgICAgICAgc2V0KGksIDAsIHgpOworICAgICAgICBzZXQoaSwgMSwgeSk7CisgICAgICAgIHNldChpLCAyLCB6KTsKKyAgICAgICAgc2V0KGksIDMsIHcpOworICAgIH0KKworICAgIG1TaW1wbGVNYXRyaXggPSB1Lm1TaW1wbGVNYXRyaXggJiYgdi5tU2ltcGxlTWF0cml4OworfQorCit2b2lkIE1hdHJpeDQ6OmxvYWRPcnRobyhmbG9hdCBsZWZ0LCBmbG9hdCByaWdodCwgZmxvYXQgYm90dG9tLCBmbG9hdCB0b3AsIGZsb2F0IG5lYXIsIGZsb2F0IGZhcikgeworICAgIGxvYWRJZGVudGl0eSgpOworICAgIGRhdGFba1NjYWxlWF0gPSAyLjBmIC8gKHJpZ2h0IC0gbGVmdCk7CisgICAgZGF0YVtrU2NhbGVZXSA9IDIuMGYgLyAodG9wIC0gYm90dG9tKTsKKyAgICBkYXRhW2tTY2FsZVpdID0gLTIuMGYgLyAoZmFyIC0gbmVhcik7CisgICAgZGF0YVtrVHJhbnNsYXRlWF0gPSAtKHJpZ2h0ICsgbGVmdCkgLyAocmlnaHQgLSBsZWZ0KTsKKyAgICBkYXRhW2tUcmFuc2xhdGVZXSA9IC0odG9wICsgYm90dG9tKSAvICh0b3AgLSBib3R0b20pOworICAgIGRhdGFba1RyYW5zbGF0ZVpdID0gLShmYXIgKyBuZWFyKSAvIChmYXIgLSBuZWFyKTsKK30KKworI2RlZmluZSBNVUxfQUREX1NUT1JFKGEsIGIsIGMpIGEgPSAoYSkgKiAoYikgKyAoYykKKwordm9pZCBNYXRyaXg0OjptYXBQb2ludChmbG9hdCYgeCwgZmxvYXQmIHkpIGNvbnN0IHsKKyAgICBpZiAobVNpbXBsZU1hdHJpeCkgeworICAgICAgICBNVUxfQUREX1NUT1JFKHgsIGRhdGFba1NjYWxlWF0sIGRhdGFba1RyYW5zbGF0ZVhdKTsKKyAgICAgICAgTVVMX0FERF9TVE9SRSh5LCBkYXRhW2tTY2FsZVldLCBkYXRhW2tUcmFuc2xhdGVZXSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBmbG9hdCBkeCA9IHggKiBkYXRhW2tTY2FsZVhdICsgeSAqIGRhdGFba1NrZXdYXSArIGRhdGFba1RyYW5zbGF0ZVhdOworICAgIGZsb2F0IGR5ID0geCAqIGRhdGFba1NrZXdZXSArIHkgKiBkYXRhW2tTY2FsZVldICsgZGF0YVtrVHJhbnNsYXRlWV07CisgICAgZmxvYXQgZHogPSB4ICogZGF0YVtrUGVyc3BlY3RpdmUwXSArIHkgKiBkYXRhW2tQZXJzcGVjdGl2ZTFdICsgZGF0YVtrUGVyc3BlY3RpdmUyXTsKKyAgICBpZiAoZHopIGR6ID0gMS4wZiAvIGR6OworCisgICAgeCA9IGR4ICogZHo7CisgICAgeSA9IGR5ICogZHo7Cit9CisKK3ZvaWQgTWF0cml4NDo6bWFwUmVjdChSZWN0JiByKSBjb25zdCB7CisgICAgaWYgKG1TaW1wbGVNYXRyaXgpIHsKKyAgICAgICAgTVVMX0FERF9TVE9SRShyLmxlZnQsIGRhdGFba1NjYWxlWF0sIGRhdGFba1RyYW5zbGF0ZVhdKTsKKyAgICAgICAgTVVMX0FERF9TVE9SRShyLnJpZ2h0LCBkYXRhW2tTY2FsZVhdLCBkYXRhW2tUcmFuc2xhdGVYXSk7CisgICAgICAgIE1VTF9BRERfU1RPUkUoci50b3AsIGRhdGFba1NjYWxlWV0sIGRhdGFba1RyYW5zbGF0ZVldKTsKKyAgICAgICAgTVVMX0FERF9TVE9SRShyLmJvdHRvbSwgZGF0YVtrU2NhbGVZXSwgZGF0YVtrVHJhbnNsYXRlWV0pOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgZmxvYXQgdmVydGljZXNbXSA9IHsKKyAgICAgICAgci5sZWZ0LCByLnRvcCwKKyAgICAgICAgci5yaWdodCwgci50b3AsCisgICAgICAgIHIucmlnaHQsIHIuYm90dG9tLAorICAgICAgICByLmxlZnQsIHIuYm90dG9tCisgICAgfTsKKworICAgIGZsb2F0IHgsIHksIHo7CisKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IDg7IGkrPSAyKSB7CisgICAgICAgIGZsb2F0IHB4ID0gdmVydGljZXNbaV07CisgICAgICAgIGZsb2F0IHB5ID0gdmVydGljZXNbaSArIDFdOworCisgICAgICAgIHggPSBweCAqIGRhdGFba1NjYWxlWF0gKyBweSAqIGRhdGFba1NrZXdYXSArIGRhdGFba1RyYW5zbGF0ZVhdOworICAgICAgICB5ID0gcHggKiBkYXRhW2tTa2V3WV0gKyBweSAqIGRhdGFba1NjYWxlWV0gKyBkYXRhW2tUcmFuc2xhdGVZXTsKKyAgICAgICAgeiA9IHB4ICogZGF0YVtrUGVyc3BlY3RpdmUwXSArIHB5ICogZGF0YVtrUGVyc3BlY3RpdmUxXSArIGRhdGFba1BlcnNwZWN0aXZlMl07CisgICAgICAgIGlmICh6KSB6ID0gMS4wZiAvIHo7CisKKyAgICAgICAgdmVydGljZXNbaV0gPSB4ICogejsKKyAgICAgICAgdmVydGljZXNbaSArIDFdID0geSAqIHo7CisgICAgfQorCisgICAgci5sZWZ0ID0gci5yaWdodCA9IHZlcnRpY2VzWzBdOworICAgIHIudG9wID0gci5ib3R0b20gPSB2ZXJ0aWNlc1sxXTsKKworICAgIGZvciAoaW50IGkgPSAyOyBpIDwgODsgaSArPSAyKSB7CisgICAgICAgIHggPSB2ZXJ0aWNlc1tpXTsKKyAgICAgICAgeSA9IHZlcnRpY2VzW2kgKyAxXTsKKworICAgICAgICBpZiAoeCA8IHIubGVmdCkgci5sZWZ0ID0geDsKKyAgICAgICAgZWxzZSBpZiAoeCA+IHIucmlnaHQpIHIucmlnaHQgPSB4OworICAgICAgICBpZiAoeSA8IHIudG9wKSByLnRvcCA9IHk7CisgICAgICAgIGVsc2UgaWYgKHkgPiByLmJvdHRvbSkgci5ib3R0b20gPSB5OworICAgIH0KK30KKwordm9pZCBNYXRyaXg0OjpkdW1wKCkgY29uc3QgeworICAgIExPR0QoIk1hdHJpeDRbc2ltcGxlPSVkIiwgbVNpbXBsZU1hdHJpeCk7CisgICAgTE9HRCgiICAlZiAlZiAlZiAlZiIsIGRhdGFba1NjYWxlWF0sIGRhdGFba1NrZXdYXSwgZGF0YVs4XSwgZGF0YVtrVHJhbnNsYXRlWF0pOworICAgIExPR0QoIiAgJWYgJWYgJWYgJWYiLCBkYXRhW2tTa2V3WV0sIGRhdGFba1NjYWxlWV0sIGRhdGFbOV0sIGRhdGFba1RyYW5zbGF0ZVldKTsKKyAgICBMT0dEKCIgICVmICVmICVmICVmIiwgZGF0YVsyXSwgZGF0YVs2XSwgZGF0YVtrU2NhbGVaXSwgZGF0YVtrVHJhbnNsYXRlWl0pOworICAgIExPR0QoIiAgJWYgJWYgJWYgJWYiLCBkYXRhW2tQZXJzcGVjdGl2ZTBdLCBkYXRhW2tQZXJzcGVjdGl2ZTFdLCBkYXRhWzExXSwgZGF0YVtrUGVyc3BlY3RpdmUyXSk7CisgICAgTE9HRCgiXSIpOworfQorCit9OyAvLyBuYW1lc3BhY2UgdWlyZW5kZXJlcgorfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2xpYnMvaHd1aS9NYXRyaXguaCBiL2xpYnMvaHd1aS9NYXRyaXguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMjQ3YTY3Ci0tLSAvZGV2L251bGwKKysrIGIvbGlicy9od3VpL01hdHJpeC5oCkBAIC0wLDAgKzEsMTM2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX1VJX01BVFJJWF9ICisjZGVmaW5lIEFORFJPSURfVUlfTUFUUklYX0gKKworI2luY2x1ZGUgPFNrTWF0cml4Lmg+CisKKyNpbmNsdWRlICJSZWN0LmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSB1aXJlbmRlcmVyIHsKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gQ2xhc3NlcworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitjbGFzcyBNYXRyaXg0IHsKK3B1YmxpYzoKKyAgICBmbG9hdCBkYXRhWzE2XTsKKworICAgIGVudW0gRW50cnkgeworICAgICAgICBrU2NhbGVYID0gMCwKKyAgICAgICAga1NrZXdZID0gMSwKKyAgICAgICAga1BlcnNwZWN0aXZlMCA9IDMsCisgICAgICAgIGtTa2V3WCA9IDQsCisgICAgICAgIGtTY2FsZVkgPSA1LAorICAgICAgICBrUGVyc3BlY3RpdmUxID0gNywKKyAgICAgICAga1NjYWxlWiA9IDEwLAorICAgICAgICBrVHJhbnNsYXRlWCA9IDEyLAorICAgICAgICBrVHJhbnNsYXRlWSA9IDEzLAorICAgICAgICBrVHJhbnNsYXRlWiA9IDE0LAorICAgICAgICBrUGVyc3BlY3RpdmUyID0gMTUKKyAgICB9OworCisgICAgTWF0cml4NCgpIHsKKyAgICAgICAgbG9hZElkZW50aXR5KCk7CisgICAgfQorCisgICAgTWF0cml4NChjb25zdCBmbG9hdCogdikgeworICAgICAgICBsb2FkKHYpOworICAgIH0KKworICAgIE1hdHJpeDQoY29uc3QgTWF0cml4NCYgdikgeworICAgICAgICBsb2FkKHYpOworICAgIH0KKworICAgIE1hdHJpeDQoY29uc3QgU2tNYXRyaXgmIHYpIHsKKyAgICAgICAgbG9hZCh2KTsKKyAgICB9CisKKyAgICB2b2lkIGxvYWRJZGVudGl0eSgpOworCisgICAgdm9pZCBsb2FkKGNvbnN0IGZsb2F0KiB2KTsKKyAgICB2b2lkIGxvYWQoY29uc3QgTWF0cml4NCYgdik7CisgICAgdm9pZCBsb2FkKGNvbnN0IFNrTWF0cml4JiB2KTsKKworICAgIHZvaWQgbG9hZEludmVyc2UoY29uc3QgTWF0cml4NCYgdik7CisKKyAgICB2b2lkIGxvYWRUcmFuc2xhdGUoZmxvYXQgeCwgZmxvYXQgeSwgZmxvYXQgeik7CisgICAgdm9pZCBsb2FkU2NhbGUoZmxvYXQgc3gsIGZsb2F0IHN5LCBmbG9hdCBzeik7CisgICAgdm9pZCBsb2FkUm90YXRlKGZsb2F0IGFuZ2xlLCBmbG9hdCB4LCBmbG9hdCB5LCBmbG9hdCB6KTsKKyAgICB2b2lkIGxvYWRNdWx0aXBseShjb25zdCBNYXRyaXg0JiB1LCBjb25zdCBNYXRyaXg0JiB2KTsKKworICAgIHZvaWQgbG9hZE9ydGhvKGZsb2F0IGxlZnQsIGZsb2F0IHJpZ2h0LCBmbG9hdCBib3R0b20sIGZsb2F0IHRvcCwgZmxvYXQgbmVhciwgZmxvYXQgZmFyKTsKKworICAgIHZvaWQgbXVsdGlwbHkoY29uc3QgTWF0cml4NCYgdikgeworICAgICAgICBNYXRyaXg0IHU7CisgICAgICAgIHUubG9hZE11bHRpcGx5KCp0aGlzLCB2KTsKKyAgICAgICAgbG9hZCh1KTsKKyAgICB9CisKKyAgICB2b2lkIHRyYW5zbGF0ZShmbG9hdCB4LCBmbG9hdCB5LCBmbG9hdCB6KSB7CisgICAgICAgIE1hdHJpeDQgdTsKKyAgICAgICAgdS5sb2FkVHJhbnNsYXRlKHgsIHksIHopOworICAgICAgICBtdWx0aXBseSh1KTsKKyAgICB9CisKKyAgICB2b2lkIHNjYWxlKGZsb2F0IHN4LCBmbG9hdCBzeSwgZmxvYXQgc3opIHsKKyAgICAgICAgTWF0cml4NCB1OworICAgICAgICB1LmxvYWRTY2FsZShzeCwgc3ksIHN6KTsKKyAgICAgICAgbXVsdGlwbHkodSk7CisgICAgfQorCisgICAgdm9pZCByb3RhdGUoZmxvYXQgYW5nbGUsIGZsb2F0IHgsIGZsb2F0IHksIGZsb2F0IHopIHsKKyAgICAgICAgTWF0cml4NCB1OworICAgICAgICB1LmxvYWRSb3RhdGUoYW5nbGUsIHgsIHksIHopOworICAgICAgICBtdWx0aXBseSh1KTsKKyAgICB9CisKKyAgICB2b2lkIGNvcHlUbyhmbG9hdCogdikgY29uc3Q7CisgICAgdm9pZCBjb3B5VG8oU2tNYXRyaXgmIHYpIGNvbnN0OworCisgICAgdm9pZCBtYXBSZWN0KFJlY3QmIHIpIGNvbnN0OworICAgIHZvaWQgbWFwUG9pbnQoZmxvYXQmIHgsIGZsb2F0JiB5KSBjb25zdDsKKworICAgIGZsb2F0IGdldFRyYW5zbGF0ZVgoKTsKKyAgICBmbG9hdCBnZXRUcmFuc2xhdGVZKCk7CisKKyAgICB2b2lkIGR1bXAoKSBjb25zdDsKKworcHJpdmF0ZToKKyAgICBib29sIG1TaW1wbGVNYXRyaXg7CisKKyAgICBpbmxpbmUgZmxvYXQgZ2V0KGludCBpLCBpbnQgaikgY29uc3QgeworICAgICAgICByZXR1cm4gZGF0YVtpICogNCArIGpdOworICAgIH0KKworICAgIGlubGluZSB2b2lkIHNldChpbnQgaSwgaW50IGosIGZsb2F0IHYpIHsKKyAgICAgICAgZGF0YVtpICogNCArIGpdID0gdjsKKyAgICB9Cit9OyAvLyBjbGFzcyBNYXRyaXg0CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIFR5cGVzCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK3R5cGVkZWYgTWF0cml4NCBtYXQ0OworCit9OyAvLyBuYW1lc3BhY2UgdWlyZW5kZXJlcgorfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmIC8vIEFORFJPSURfVUlfTUFUUklYX0gKZGlmZiAtLWdpdCBhL2xpYnMvaHd1aS9OT1RJQ0UgYi9saWJzL2h3dWkvTk9USUNFCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM1YjFlZmEKLS0tIC9kZXYvbnVsbAorKysgYi9saWJzL2h3dWkvTk9USUNFCkBAIC0wLDAgKzEsMTkwIEBACisKKyAgIENvcHlyaWdodCAoYykgMjAwNS0yMDA4LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorCisgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcGFjaGUgTGljZW5zZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVyc2lvbiAyLjAsIEphbnVhcnkgMjAwNAorICAgICAgICAgICAgICAgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzLworCisgICBURVJNUyBBTkQgQ09ORElUSU9OUyBGT1IgVVNFLCBSRVBST0RVQ1RJT04sIEFORCBESVNUUklCVVRJT04KKworICAgMS4gRGVmaW5pdGlvbnMuCisKKyAgICAgICJMaWNlbnNlIiBzaGFsbCBtZWFuIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgdXNlLCByZXByb2R1Y3Rpb24sCisgICAgICBhbmQgZGlzdHJpYnV0aW9uIGFzIGRlZmluZWQgYnkgU2VjdGlvbnMgMSB0aHJvdWdoIDkgb2YgdGhpcyBkb2N1bWVudC4KKworICAgICAgIkxpY2Vuc29yIiBzaGFsbCBtZWFuIHRoZSBjb3B5cmlnaHQgb3duZXIgb3IgZW50aXR5IGF1dGhvcml6ZWQgYnkKKyAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIgdGhhdCBpcyBncmFudGluZyB0aGUgTGljZW5zZS4KKworICAgICAgIkxlZ2FsIEVudGl0eSIgc2hhbGwgbWVhbiB0aGUgdW5pb24gb2YgdGhlIGFjdGluZyBlbnRpdHkgYW5kIGFsbAorICAgICAgb3RoZXIgZW50aXRpZXMgdGhhdCBjb250cm9sLCBhcmUgY29udHJvbGxlZCBieSwgb3IgYXJlIHVuZGVyIGNvbW1vbgorICAgICAgY29udHJvbCB3aXRoIHRoYXQgZW50aXR5LiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwKKyAgICAgICJjb250cm9sIiBtZWFucyAoaSkgdGhlIHBvd2VyLCBkaXJlY3Qgb3IgaW5kaXJlY3QsIHRvIGNhdXNlIHRoZQorICAgICAgZGlyZWN0aW9uIG9yIG1hbmFnZW1lbnQgb2Ygc3VjaCBlbnRpdHksIHdoZXRoZXIgYnkgY29udHJhY3Qgb3IKKyAgICAgIG90aGVyd2lzZSwgb3IgKGlpKSBvd25lcnNoaXAgb2YgZmlmdHkgcGVyY2VudCAoNTAlKSBvciBtb3JlIG9mIHRoZQorICAgICAgb3V0c3RhbmRpbmcgc2hhcmVzLCBvciAoaWlpKSBiZW5lZmljaWFsIG93bmVyc2hpcCBvZiBzdWNoIGVudGl0eS4KKworICAgICAgIllvdSIgKG9yICJZb3VyIikgc2hhbGwgbWVhbiBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQorICAgICAgZXhlcmNpc2luZyBwZXJtaXNzaW9ucyBncmFudGVkIGJ5IHRoaXMgTGljZW5zZS4KKworICAgICAgIlNvdXJjZSIgZm9ybSBzaGFsbCBtZWFuIHRoZSBwcmVmZXJyZWQgZm9ybSBmb3IgbWFraW5nIG1vZGlmaWNhdGlvbnMsCisgICAgICBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHNvZnR3YXJlIHNvdXJjZSBjb2RlLCBkb2N1bWVudGF0aW9uCisgICAgICBzb3VyY2UsIGFuZCBjb25maWd1cmF0aW9uIGZpbGVzLgorCisgICAgICAiT2JqZWN0IiBmb3JtIHNoYWxsIG1lYW4gYW55IGZvcm0gcmVzdWx0aW5nIGZyb20gbWVjaGFuaWNhbAorICAgICAgdHJhbnNmb3JtYXRpb24gb3IgdHJhbnNsYXRpb24gb2YgYSBTb3VyY2UgZm9ybSwgaW5jbHVkaW5nIGJ1dAorICAgICAgbm90IGxpbWl0ZWQgdG8gY29tcGlsZWQgb2JqZWN0IGNvZGUsIGdlbmVyYXRlZCBkb2N1bWVudGF0aW9uLAorICAgICAgYW5kIGNvbnZlcnNpb25zIHRvIG90aGVyIG1lZGlhIHR5cGVzLgorCisgICAgICAiV29yayIgc2hhbGwgbWVhbiB0aGUgd29yayBvZiBhdXRob3JzaGlwLCB3aGV0aGVyIGluIFNvdXJjZSBvcgorICAgICAgT2JqZWN0IGZvcm0sIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBMaWNlbnNlLCBhcyBpbmRpY2F0ZWQgYnkgYQorICAgICAgY29weXJpZ2h0IG5vdGljZSB0aGF0IGlzIGluY2x1ZGVkIGluIG9yIGF0dGFjaGVkIHRvIHRoZSB3b3JrCisgICAgICAoYW4gZXhhbXBsZSBpcyBwcm92aWRlZCBpbiB0aGUgQXBwZW5kaXggYmVsb3cpLgorCisgICAgICAiRGVyaXZhdGl2ZSBXb3JrcyIgc2hhbGwgbWVhbiBhbnkgd29yaywgd2hldGhlciBpbiBTb3VyY2Ugb3IgT2JqZWN0CisgICAgICBmb3JtLCB0aGF0IGlzIGJhc2VkIG9uIChvciBkZXJpdmVkIGZyb20pIHRoZSBXb3JrIGFuZCBmb3Igd2hpY2ggdGhlCisgICAgICBlZGl0b3JpYWwgcmV2aXNpb25zLCBhbm5vdGF0aW9ucywgZWxhYm9yYXRpb25zLCBvciBvdGhlciBtb2RpZmljYXRpb25zCisgICAgICByZXByZXNlbnQsIGFzIGEgd2hvbGUsIGFuIG9yaWdpbmFsIHdvcmsgb2YgYXV0aG9yc2hpcC4gRm9yIHRoZSBwdXJwb3NlcworICAgICAgb2YgdGhpcyBMaWNlbnNlLCBEZXJpdmF0aXZlIFdvcmtzIHNoYWxsIG5vdCBpbmNsdWRlIHdvcmtzIHRoYXQgcmVtYWluCisgICAgICBzZXBhcmFibGUgZnJvbSwgb3IgbWVyZWx5IGxpbmsgKG9yIGJpbmQgYnkgbmFtZSkgdG8gdGhlIGludGVyZmFjZXMgb2YsCisgICAgICB0aGUgV29yayBhbmQgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLgorCisgICAgICAiQ29udHJpYnV0aW9uIiBzaGFsbCBtZWFuIGFueSB3b3JrIG9mIGF1dGhvcnNoaXAsIGluY2x1ZGluZworICAgICAgdGhlIG9yaWdpbmFsIHZlcnNpb24gb2YgdGhlIFdvcmsgYW5kIGFueSBtb2RpZmljYXRpb25zIG9yIGFkZGl0aW9ucworICAgICAgdG8gdGhhdCBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgdGhhdCBpcyBpbnRlbnRpb25hbGx5CisgICAgICBzdWJtaXR0ZWQgdG8gTGljZW5zb3IgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yayBieSB0aGUgY29weXJpZ2h0IG93bmVyCisgICAgICBvciBieSBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eSBhdXRob3JpemVkIHRvIHN1Ym1pdCBvbiBiZWhhbGYgb2YKKyAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLCAic3VibWl0dGVkIgorICAgICAgbWVhbnMgYW55IGZvcm0gb2YgZWxlY3Ryb25pYywgdmVyYmFsLCBvciB3cml0dGVuIGNvbW11bmljYXRpb24gc2VudAorICAgICAgdG8gdGhlIExpY2Vuc29yIG9yIGl0cyByZXByZXNlbnRhdGl2ZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8KKyAgICAgIGNvbW11bmljYXRpb24gb24gZWxlY3Ryb25pYyBtYWlsaW5nIGxpc3RzLCBzb3VyY2UgY29kZSBjb250cm9sIHN5c3RlbXMsCisgICAgICBhbmQgaXNzdWUgdHJhY2tpbmcgc3lzdGVtcyB0aGF0IGFyZSBtYW5hZ2VkIGJ5LCBvciBvbiBiZWhhbGYgb2YsIHRoZQorICAgICAgTGljZW5zb3IgZm9yIHRoZSBwdXJwb3NlIG9mIGRpc2N1c3NpbmcgYW5kIGltcHJvdmluZyB0aGUgV29yaywgYnV0CisgICAgICBleGNsdWRpbmcgY29tbXVuaWNhdGlvbiB0aGF0IGlzIGNvbnNwaWN1b3VzbHkgbWFya2VkIG9yIG90aGVyd2lzZQorICAgICAgZGVzaWduYXRlZCBpbiB3cml0aW5nIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIgYXMgIk5vdCBhIENvbnRyaWJ1dGlvbi4iCisKKyAgICAgICJDb250cmlidXRvciIgc2hhbGwgbWVhbiBMaWNlbnNvciBhbmQgYW55IGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5CisgICAgICBvbiBiZWhhbGYgb2Ygd2hvbSBhIENvbnRyaWJ1dGlvbiBoYXMgYmVlbiByZWNlaXZlZCBieSBMaWNlbnNvciBhbmQKKyAgICAgIHN1YnNlcXVlbnRseSBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrLgorCisgICAyLiBHcmFudCBvZiBDb3B5cmlnaHQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKKyAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwKKyAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlCisgICAgICBjb3B5cmlnaHQgbGljZW5zZSB0byByZXByb2R1Y2UsIHByZXBhcmUgRGVyaXZhdGl2ZSBXb3JrcyBvZiwKKyAgICAgIHB1YmxpY2x5IGRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIHN1YmxpY2Vuc2UsIGFuZCBkaXN0cmlidXRlIHRoZQorICAgICAgV29yayBhbmQgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybS4KKworICAgMy4gR3JhbnQgb2YgUGF0ZW50IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCisgICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsCisgICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQorICAgICAgKGV4Y2VwdCBhcyBzdGF0ZWQgaW4gdGhpcyBzZWN0aW9uKSBwYXRlbnQgbGljZW5zZSB0byBtYWtlLCBoYXZlIG1hZGUsCisgICAgICB1c2UsIG9mZmVyIHRvIHNlbGwsIHNlbGwsIGltcG9ydCwgYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgV29yaywKKyAgICAgIHdoZXJlIHN1Y2ggbGljZW5zZSBhcHBsaWVzIG9ubHkgdG8gdGhvc2UgcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlCisgICAgICBieSBzdWNoIENvbnRyaWJ1dG9yIHRoYXQgYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGVpcgorICAgICAgQ29udHJpYnV0aW9uKHMpIGFsb25lIG9yIGJ5IGNvbWJpbmF0aW9uIG9mIHRoZWlyIENvbnRyaWJ1dGlvbihzKQorICAgICAgd2l0aCB0aGUgV29yayB0byB3aGljaCBzdWNoIENvbnRyaWJ1dGlvbihzKSB3YXMgc3VibWl0dGVkLiBJZiBZb3UKKyAgICAgIGluc3RpdHV0ZSBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhCisgICAgICBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSBhbGxlZ2luZyB0aGF0IHRoZSBXb3JrCisgICAgICBvciBhIENvbnRyaWJ1dGlvbiBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrIGNvbnN0aXR1dGVzIGRpcmVjdAorICAgICAgb3IgY29udHJpYnV0b3J5IHBhdGVudCBpbmZyaW5nZW1lbnQsIHRoZW4gYW55IHBhdGVudCBsaWNlbnNlcworICAgICAgZ3JhbnRlZCB0byBZb3UgdW5kZXIgdGhpcyBMaWNlbnNlIGZvciB0aGF0IFdvcmsgc2hhbGwgdGVybWluYXRlCisgICAgICBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuCisKKyAgIDQuIFJlZGlzdHJpYnV0aW9uLiBZb3UgbWF5IHJlcHJvZHVjZSBhbmQgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlCisgICAgICBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiBpbiBhbnkgbWVkaXVtLCB3aXRoIG9yIHdpdGhvdXQKKyAgICAgIG1vZGlmaWNhdGlvbnMsIGFuZCBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0sIHByb3ZpZGVkIHRoYXQgWW91CisgICAgICBtZWV0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKworICAgICAgKGEpIFlvdSBtdXN0IGdpdmUgYW55IG90aGVyIHJlY2lwaWVudHMgb2YgdGhlIFdvcmsgb3IKKyAgICAgICAgICBEZXJpdmF0aXZlIFdvcmtzIGEgY29weSBvZiB0aGlzIExpY2Vuc2U7IGFuZAorCisgICAgICAoYikgWW91IG11c3QgY2F1c2UgYW55IG1vZGlmaWVkIGZpbGVzIHRvIGNhcnJ5IHByb21pbmVudCBub3RpY2VzCisgICAgICAgICAgc3RhdGluZyB0aGF0IFlvdSBjaGFuZ2VkIHRoZSBmaWxlczsgYW5kCisKKyAgICAgIChjKSBZb3UgbXVzdCByZXRhaW4sIGluIHRoZSBTb3VyY2UgZm9ybSBvZiBhbnkgRGVyaXZhdGl2ZSBXb3JrcworICAgICAgICAgIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsbCBjb3B5cmlnaHQsIHBhdGVudCwgdHJhZGVtYXJrLCBhbmQKKyAgICAgICAgICBhdHRyaWJ1dGlvbiBub3RpY2VzIGZyb20gdGhlIFNvdXJjZSBmb3JtIG9mIHRoZSBXb3JrLAorICAgICAgICAgIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90IHBlcnRhaW4gdG8gYW55IHBhcnQgb2YKKyAgICAgICAgICB0aGUgRGVyaXZhdGl2ZSBXb3JrczsgYW5kCisKKyAgICAgIChkKSBJZiB0aGUgV29yayBpbmNsdWRlcyBhICJOT1RJQ0UiIHRleHQgZmlsZSBhcyBwYXJ0IG9mIGl0cworICAgICAgICAgIGRpc3RyaWJ1dGlvbiwgdGhlbiBhbnkgRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlIG11c3QKKyAgICAgICAgICBpbmNsdWRlIGEgcmVhZGFibGUgY29weSBvZiB0aGUgYXR0cmlidXRpb24gbm90aWNlcyBjb250YWluZWQKKyAgICAgICAgICB3aXRoaW4gc3VjaCBOT1RJQ0UgZmlsZSwgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QKKyAgICAgICAgICBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpbiBhdCBsZWFzdCBvbmUKKyAgICAgICAgICBvZiB0aGUgZm9sbG93aW5nIHBsYWNlczogd2l0aGluIGEgTk9USUNFIHRleHQgZmlsZSBkaXN0cmlidXRlZAorICAgICAgICAgIGFzIHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3M7IHdpdGhpbiB0aGUgU291cmNlIGZvcm0gb3IKKyAgICAgICAgICBkb2N1bWVudGF0aW9uLCBpZiBwcm92aWRlZCBhbG9uZyB3aXRoIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBvciwKKyAgICAgICAgICB3aXRoaW4gYSBkaXNwbGF5IGdlbmVyYXRlZCBieSB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaWYgYW5kCisgICAgICAgICAgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBub3RpY2VzIG5vcm1hbGx5IGFwcGVhci4gVGhlIGNvbnRlbnRzCisgICAgICAgICAgb2YgdGhlIE5PVElDRSBmaWxlIGFyZSBmb3IgaW5mb3JtYXRpb25hbCBwdXJwb3NlcyBvbmx5IGFuZAorICAgICAgICAgIGRvIG5vdCBtb2RpZnkgdGhlIExpY2Vuc2UuIFlvdSBtYXkgYWRkIFlvdXIgb3duIGF0dHJpYnV0aW9uCisgICAgICAgICAgbm90aWNlcyB3aXRoaW4gRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbG9uZ3NpZGUKKyAgICAgICAgICBvciBhcyBhbiBhZGRlbmR1bSB0byB0aGUgTk9USUNFIHRleHQgZnJvbSB0aGUgV29yaywgcHJvdmlkZWQKKyAgICAgICAgICB0aGF0IHN1Y2ggYWRkaXRpb25hbCBhdHRyaWJ1dGlvbiBub3RpY2VzIGNhbm5vdCBiZSBjb25zdHJ1ZWQKKyAgICAgICAgICBhcyBtb2RpZnlpbmcgdGhlIExpY2Vuc2UuCisKKyAgICAgIFlvdSBtYXkgYWRkIFlvdXIgb3duIGNvcHlyaWdodCBzdGF0ZW1lbnQgdG8gWW91ciBtb2RpZmljYXRpb25zIGFuZAorICAgICAgbWF5IHByb3ZpZGUgYWRkaXRpb25hbCBvciBkaWZmZXJlbnQgbGljZW5zZSB0ZXJtcyBhbmQgY29uZGl0aW9ucworICAgICAgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLCBvciBkaXN0cmlidXRpb24gb2YgWW91ciBtb2RpZmljYXRpb25zLCBvcgorICAgICAgZm9yIGFueSBzdWNoIERlcml2YXRpdmUgV29ya3MgYXMgYSB3aG9sZSwgcHJvdmlkZWQgWW91ciB1c2UsCisgICAgICByZXByb2R1Y3Rpb24sIGFuZCBkaXN0cmlidXRpb24gb2YgdGhlIFdvcmsgb3RoZXJ3aXNlIGNvbXBsaWVzIHdpdGgKKyAgICAgIHRoZSBjb25kaXRpb25zIHN0YXRlZCBpbiB0aGlzIExpY2Vuc2UuCisKKyAgIDUuIFN1Ym1pc3Npb24gb2YgQ29udHJpYnV0aW9ucy4gVW5sZXNzIFlvdSBleHBsaWNpdGx5IHN0YXRlIG90aGVyd2lzZSwKKyAgICAgIGFueSBDb250cmlidXRpb24gaW50ZW50aW9uYWxseSBzdWJtaXR0ZWQgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yaworICAgICAgYnkgWW91IHRvIHRoZSBMaWNlbnNvciBzaGFsbCBiZSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKKyAgICAgIHRoaXMgTGljZW5zZSwgd2l0aG91dCBhbnkgYWRkaXRpb25hbCB0ZXJtcyBvciBjb25kaXRpb25zLgorICAgICAgTm90d2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgbm90aGluZyBoZXJlaW4gc2hhbGwgc3VwZXJzZWRlIG9yIG1vZGlmeQorICAgICAgdGhlIHRlcm1zIG9mIGFueSBzZXBhcmF0ZSBsaWNlbnNlIGFncmVlbWVudCB5b3UgbWF5IGhhdmUgZXhlY3V0ZWQKKyAgICAgIHdpdGggTGljZW5zb3IgcmVnYXJkaW5nIHN1Y2ggQ29udHJpYnV0aW9ucy4KKworICAgNi4gVHJhZGVtYXJrcy4gVGhpcyBMaWNlbnNlIGRvZXMgbm90IGdyYW50IHBlcm1pc3Npb24gdG8gdXNlIHRoZSB0cmFkZQorICAgICAgbmFtZXMsIHRyYWRlbWFya3MsIHNlcnZpY2UgbWFya3MsIG9yIHByb2R1Y3QgbmFtZXMgb2YgdGhlIExpY2Vuc29yLAorICAgICAgZXhjZXB0IGFzIHJlcXVpcmVkIGZvciByZWFzb25hYmxlIGFuZCBjdXN0b21hcnkgdXNlIGluIGRlc2NyaWJpbmcgdGhlCisgICAgICBvcmlnaW4gb2YgdGhlIFdvcmsgYW5kIHJlcHJvZHVjaW5nIHRoZSBjb250ZW50IG9mIHRoZSBOT1RJQ0UgZmlsZS4KKworICAgNy4gRGlzY2xhaW1lciBvZiBXYXJyYW50eS4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yCisgICAgICBhZ3JlZWQgdG8gaW4gd3JpdGluZywgTGljZW5zb3IgcHJvdmlkZXMgdGhlIFdvcmsgKGFuZCBlYWNoCisgICAgICBDb250cmlidXRvciBwcm92aWRlcyBpdHMgQ29udHJpYnV0aW9ucykgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgorICAgICAgaW1wbGllZCwgaW5jbHVkaW5nLCB3aXRob3V0IGxpbWl0YXRpb24sIGFueSB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMKKyAgICAgIG9mIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULCBNRVJDSEFOVEFCSUxJVFksIG9yIEZJVE5FU1MgRk9SIEEKKyAgICAgIFBBUlRJQ1VMQVIgUFVSUE9TRS4gWW91IGFyZSBzb2xlbHkgcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZQorICAgICAgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIG9yIHJlZGlzdHJpYnV0aW5nIHRoZSBXb3JrIGFuZCBhc3N1bWUgYW55CisgICAgICByaXNrcyBhc3NvY2lhdGVkIHdpdGggWW91ciBleGVyY2lzZSBvZiBwZXJtaXNzaW9ucyB1bmRlciB0aGlzIExpY2Vuc2UuCisKKyAgIDguIExpbWl0YXRpb24gb2YgTGlhYmlsaXR5LiBJbiBubyBldmVudCBhbmQgdW5kZXIgbm8gbGVnYWwgdGhlb3J5LAorICAgICAgd2hldGhlciBpbiB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGNvbnRyYWN0LCBvciBvdGhlcndpc2UsCisgICAgICB1bmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgKHN1Y2ggYXMgZGVsaWJlcmF0ZSBhbmQgZ3Jvc3NseQorICAgICAgbmVnbGlnZW50IGFjdHMpIG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzaGFsbCBhbnkgQ29udHJpYnV0b3IgYmUKKyAgICAgIGxpYWJsZSB0byBZb3UgZm9yIGRhbWFnZXMsIGluY2x1ZGluZyBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwKKyAgICAgIGluY2lkZW50YWwsIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcyBvZiBhbnkgY2hhcmFjdGVyIGFyaXNpbmcgYXMgYQorICAgICAgcmVzdWx0IG9mIHRoaXMgTGljZW5zZSBvciBvdXQgb2YgdGhlIHVzZSBvciBpbmFiaWxpdHkgdG8gdXNlIHRoZQorICAgICAgV29yayAoaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBkYW1hZ2VzIGZvciBsb3NzIG9mIGdvb2R3aWxsLAorICAgICAgd29yayBzdG9wcGFnZSwgY29tcHV0ZXIgZmFpbHVyZSBvciBtYWxmdW5jdGlvbiwgb3IgYW55IGFuZCBhbGwKKyAgICAgIG90aGVyIGNvbW1lcmNpYWwgZGFtYWdlcyBvciBsb3NzZXMpLCBldmVuIGlmIHN1Y2ggQ29udHJpYnV0b3IKKyAgICAgIGhhcyBiZWVuIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlcy4KKworICAgOS4gQWNjZXB0aW5nIFdhcnJhbnR5IG9yIEFkZGl0aW9uYWwgTGlhYmlsaXR5LiBXaGlsZSByZWRpc3RyaWJ1dGluZworICAgICAgdGhlIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCBZb3UgbWF5IGNob29zZSB0byBvZmZlciwKKyAgICAgIGFuZCBjaGFyZ2UgYSBmZWUgZm9yLCBhY2NlcHRhbmNlIG9mIHN1cHBvcnQsIHdhcnJhbnR5LCBpbmRlbW5pdHksCisgICAgICBvciBvdGhlciBsaWFiaWxpdHkgb2JsaWdhdGlvbnMgYW5kL29yIHJpZ2h0cyBjb25zaXN0ZW50IHdpdGggdGhpcworICAgICAgTGljZW5zZS4gSG93ZXZlciwgaW4gYWNjZXB0aW5nIHN1Y2ggb2JsaWdhdGlvbnMsIFlvdSBtYXkgYWN0IG9ubHkKKyAgICAgIG9uIFlvdXIgb3duIGJlaGFsZiBhbmQgb24gWW91ciBzb2xlIHJlc3BvbnNpYmlsaXR5LCBub3Qgb24gYmVoYWxmCisgICAgICBvZiBhbnkgb3RoZXIgQ29udHJpYnV0b3IsIGFuZCBvbmx5IGlmIFlvdSBhZ3JlZSB0byBpbmRlbW5pZnksCisgICAgICBkZWZlbmQsIGFuZCBob2xkIGVhY2ggQ29udHJpYnV0b3IgaGFybWxlc3MgZm9yIGFueSBsaWFiaWxpdHkKKyAgICAgIGluY3VycmVkIGJ5LCBvciBjbGFpbXMgYXNzZXJ0ZWQgYWdhaW5zdCwgc3VjaCBDb250cmlidXRvciBieSByZWFzb24KKyAgICAgIG9mIHlvdXIgYWNjZXB0aW5nIGFueSBzdWNoIHdhcnJhbnR5IG9yIGFkZGl0aW9uYWwgbGlhYmlsaXR5LgorCisgICBFTkQgT0YgVEVSTVMgQU5EIENPTkRJVElPTlMKKwpkaWZmIC0tZ2l0IGEvbGlicy9od3VpL09wZW5HTFJlbmRlcmVyLmNwcCBiL2xpYnMvaHd1aS9PcGVuR0xSZW5kZXJlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjFmNWY2YgotLS0gL2Rldi9udWxsCisrKyBiL2xpYnMvaHd1aS9PcGVuR0xSZW5kZXJlci5jcHAKQEAgLTAsMCArMSwxMTE2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJPcGVuR0xSZW5kZXJlciIKKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCisjaW5jbHVkZSA8U2tDYW52YXMuaD4KKyNpbmNsdWRlIDxTa1R5cGVmYWNlLmg+CisKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgIk9wZW5HTFJlbmRlcmVyLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSB1aXJlbmRlcmVyIHsKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gRGVmaW5lcworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisjZGVmaW5lIFJFUVVJUkVEX1RFWFRVUkVfVU5JVFNfQ09VTlQgMworCisvLyBHZW5lcmF0ZXMgc2ltcGxlIGFuZCB0ZXh0dXJlZCB2ZXJ0aWNlcworI2RlZmluZSBGVih4LCB5LCB1LCB2KSB7IHsgeCwgeSB9LCB7IHUsIHYgfSB9CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIEdsb2JhbHMKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworLy8gVGhpcyBhcnJheSBpcyBuZXZlciB1c2VkIGRpcmVjdGx5IGJ1dCB1c2VkIGFzIGEgbWVtY3B5IHNvdXJjZSBpbiB0aGUKKy8vIE9wZW5HTFJlbmRlcmVyIGNvbnN0cnVjdG9yCitzdGF0aWMgY29uc3QgVGV4dHVyZVZlcnRleCBnTWVzaFZlcnRpY2VzW10gPSB7CisgICAgICAgIEZWKDAuMGYsIDAuMGYsIDAuMGYsIDAuMGYpLAorICAgICAgICBGVigxLjBmLCAwLjBmLCAxLjBmLCAwLjBmKSwKKyAgICAgICAgRlYoMC4wZiwgMS4wZiwgMC4wZiwgMS4wZiksCisgICAgICAgIEZWKDEuMGYsIDEuMGYsIDEuMGYsIDEuMGYpCit9Oworc3RhdGljIGNvbnN0IEdMc2l6ZWkgZ01lc2hTdHJpZGUgPSBzaXplb2YoVGV4dHVyZVZlcnRleCk7CitzdGF0aWMgY29uc3QgR0xzaXplaSBnTWVzaENvdW50ID0gNDsKKworLyoqCisgKiBTdHJ1Y3R1cmUgbWFwcGluZyBTa2lhIHhmZXJtb2RlcyB0byBPcGVuR0wgYmxlbmRpbmcgZmFjdG9ycy4KKyAqLworc3RydWN0IEJsZW5kZXIgeworICAgIFNrWGZlcm1vZGU6Ok1vZGUgbW9kZTsKKyAgICBHTGVudW0gc3JjOworICAgIEdMZW51bSBkc3Q7Cit9OyAvLyBzdHJ1Y3QgQmxlbmRlcgorCisvLyBJbiB0aGlzIGFycmF5LCB0aGUgaW5kZXggb2YgZWFjaCBCbGVuZGVyIGVxdWFscyB0aGUgdmFsdWUgb2YgdGhlIGZpcnN0CisvLyBlbnRyeS4gRm9yIGluc3RhbmNlLCBnQmxlbmRzWzFdID09IGdCbGVuZHNbU2tYZmVybW9kZTo6a1NyY19Nb2RlXQorc3RhdGljIGNvbnN0IEJsZW5kZXIgZ0JsZW5kc1tdID0geworICAgICAgICB7IFNrWGZlcm1vZGU6OmtDbGVhcl9Nb2RlLCAgIEdMX1pFUk8sICAgICAgICAgICAgICAgICBHTF9aRVJPIH0sCisgICAgICAgIHsgU2tYZmVybW9kZTo6a1NyY19Nb2RlLCAgICAgR0xfT05FLCAgICAgICAgICAgICAgICAgIEdMX1pFUk8gfSwKKyAgICAgICAgeyBTa1hmZXJtb2RlOjprRHN0X01vZGUsICAgICBHTF9aRVJPLCAgICAgICAgICAgICAgICAgR0xfT05FIH0sCisgICAgICAgIHsgU2tYZmVybW9kZTo6a1NyY092ZXJfTW9kZSwgR0xfT05FLCAgICAgICAgICAgICAgICAgIEdMX09ORV9NSU5VU19TUkNfQUxQSEEgfSwKKyAgICAgICAgeyBTa1hmZXJtb2RlOjprRHN0T3Zlcl9Nb2RlLCBHTF9PTkVfTUlOVVNfRFNUX0FMUEhBLCAgR0xfT05FIH0sCisgICAgICAgIHsgU2tYZmVybW9kZTo6a1NyY0luX01vZGUsICAgR0xfRFNUX0FMUEhBLCAgICAgICAgICAgIEdMX1pFUk8gfSwKKyAgICAgICAgeyBTa1hmZXJtb2RlOjprRHN0SW5fTW9kZSwgICBHTF9aRVJPLCAgICAgICAgICAgICAgICAgR0xfU1JDX0FMUEhBIH0sCisgICAgICAgIHsgU2tYZmVybW9kZTo6a1NyY091dF9Nb2RlLCAgR0xfT05FX01JTlVTX0RTVF9BTFBIQSwgIEdMX1pFUk8gfSwKKyAgICAgICAgeyBTa1hmZXJtb2RlOjprRHN0T3V0X01vZGUsICBHTF9aRVJPLCAgICAgICAgICAgICAgICAgR0xfT05FX01JTlVTX1NSQ19BTFBIQSB9LAorICAgICAgICB7IFNrWGZlcm1vZGU6OmtTcmNBVG9wX01vZGUsIEdMX0RTVF9BTFBIQSwgICAgICAgICAgICBHTF9PTkVfTUlOVVNfU1JDX0FMUEhBIH0sCisgICAgICAgIHsgU2tYZmVybW9kZTo6a0RzdEFUb3BfTW9kZSwgR0xfT05FX01JTlVTX0RTVF9BTFBIQSwgIEdMX1NSQ19BTFBIQSB9LAorICAgICAgICB7IFNrWGZlcm1vZGU6OmtYb3JfTW9kZSwgICAgIEdMX09ORV9NSU5VU19EU1RfQUxQSEEsICBHTF9PTkVfTUlOVVNfU1JDX0FMUEhBIH0KK307CisKKy8vIFRoaXMgYXJyYXkgY29udGFpbnMgdGhlIHN3YXBwZWQgdmVyc2lvbiBvZiBlYWNoIFNrWGZlcm1vZGUuIEZvciBpbnN0YW5jZQorLy8gdGhpcyBhcnJheSdzIFNyY092ZXIgYmxlbmRpbmcgbW9kZSBpcyBhY3R1YWxseSBEc3RPdmVyLiBZb3UgY2FuIHJlZmVyIHRvCisvLyBjcmVhdGVMYXllcigpIGZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBwdXJwb3NlIG9mIHRoaXMgYXJyYXkuCitzdGF0aWMgY29uc3QgQmxlbmRlciBnQmxlbmRzU3dhcFtdID0geworICAgICAgICB7IFNrWGZlcm1vZGU6OmtDbGVhcl9Nb2RlLCAgIEdMX1pFUk8sICAgICAgICAgICAgICAgICBHTF9aRVJPIH0sCisgICAgICAgIHsgU2tYZmVybW9kZTo6a1NyY19Nb2RlLCAgICAgR0xfWkVSTywgICAgICAgICAgICAgICAgIEdMX09ORSB9LAorICAgICAgICB7IFNrWGZlcm1vZGU6OmtEc3RfTW9kZSwgICAgIEdMX09ORSwgICAgICAgICAgICAgICAgICBHTF9aRVJPIH0sCisgICAgICAgIHsgU2tYZmVybW9kZTo6a1NyY092ZXJfTW9kZSwgR0xfT05FX01JTlVTX0RTVF9BTFBIQSwgIEdMX09ORSB9LAorICAgICAgICB7IFNrWGZlcm1vZGU6OmtEc3RPdmVyX01vZGUsIEdMX09ORSwgICAgICAgICAgICAgICAgICBHTF9PTkVfTUlOVVNfU1JDX0FMUEhBIH0sCisgICAgICAgIHsgU2tYZmVybW9kZTo6a1NyY0luX01vZGUsICAgR0xfWkVSTywgICAgICAgICAgICAgICAgIEdMX1NSQ19BTFBIQSB9LAorICAgICAgICB7IFNrWGZlcm1vZGU6OmtEc3RJbl9Nb2RlLCAgIEdMX0RTVF9BTFBIQSwgICAgICAgICAgICBHTF9aRVJPIH0sCisgICAgICAgIHsgU2tYZmVybW9kZTo6a1NyY091dF9Nb2RlLCAgR0xfWkVSTywgICAgICAgICAgICAgICAgIEdMX09ORV9NSU5VU19TUkNfQUxQSEEgfSwKKyAgICAgICAgeyBTa1hmZXJtb2RlOjprRHN0T3V0X01vZGUsICBHTF9PTkVfTUlOVVNfRFNUX0FMUEhBLCAgR0xfWkVSTyB9LAorICAgICAgICB7IFNrWGZlcm1vZGU6OmtTcmNBVG9wX01vZGUsIEdMX09ORV9NSU5VU19EU1RfQUxQSEEsICBHTF9TUkNfQUxQSEEgfSwKKyAgICAgICAgeyBTa1hmZXJtb2RlOjprRHN0QVRvcF9Nb2RlLCBHTF9EU1RfQUxQSEEsICAgICAgICAgICAgR0xfT05FX01JTlVTX1NSQ19BTFBIQSB9LAorICAgICAgICB7IFNrWGZlcm1vZGU6OmtYb3JfTW9kZSwgICAgIEdMX09ORV9NSU5VU19EU1RfQUxQSEEsICBHTF9PTkVfTUlOVVNfU1JDX0FMUEhBIH0KK307CisKK3N0YXRpYyBjb25zdCBHTGVudW0gZ1RleHR1cmVVbml0c1tdID0geworICAgICAgICBHTF9URVhUVVJFMCwKKyAgICAgICAgR0xfVEVYVFVSRTEsCisgICAgICAgIEdMX1RFWFRVUkUyCit9OworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBDb25zdHJ1Y3RvcnMvZGVzdHJ1Y3RvcgorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitPcGVuR0xSZW5kZXJlcjo6T3BlbkdMUmVuZGVyZXIoKTogbUNhY2hlcyhDYWNoZXM6OmdldEluc3RhbmNlKCkpIHsKKyAgICBMT0dEKCJDcmVhdGUgT3BlbkdMUmVuZGVyZXIiKTsKKworICAgIG1TaGFkZXIgPSBOVUxMOworICAgIG1Db2xvckZpbHRlciA9IE5VTEw7CisgICAgbUhhc1NoYWRvdyA9IGZhbHNlOworCisgICAgbWVtY3B5KG1NZXNoVmVydGljZXMsIGdNZXNoVmVydGljZXMsIHNpemVvZihnTWVzaFZlcnRpY2VzKSk7CisKKyAgICBtRmlyc3RTbmFwc2hvdCA9IG5ldyBTbmFwc2hvdDsKKworICAgIEdMaW50IG1heFRleHR1cmVVbml0czsKKyAgICBnbEdldEludGVnZXJ2KEdMX01BWF9DT01CSU5FRF9URVhUVVJFX0lNQUdFX1VOSVRTLCAmbWF4VGV4dHVyZVVuaXRzKTsKKyAgICBpZiAobWF4VGV4dHVyZVVuaXRzIDwgUkVRVUlSRURfVEVYVFVSRV9VTklUU19DT1VOVCkgeworICAgICAgICBMT0dXKCJBdCBsZWFzdCAlZCB0ZXh0dXJlIHVuaXRzIGFyZSByZXF1aXJlZCEiLCBSRVFVSVJFRF9URVhUVVJFX1VOSVRTX0NPVU5UKTsKKyAgICB9Cit9CisKK09wZW5HTFJlbmRlcmVyOjp+T3BlbkdMUmVuZGVyZXIoKSB7CisgICAgTE9HRCgiRGVzdHJveSBPcGVuR0xSZW5kZXJlciIpOworfQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBTZXR1cAorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCit2b2lkIE9wZW5HTFJlbmRlcmVyOjpzZXRWaWV3cG9ydChpbnQgd2lkdGgsIGludCBoZWlnaHQpIHsKKyAgICBnbFZpZXdwb3J0KDAsIDAsIHdpZHRoLCBoZWlnaHQpOworICAgIG1PcnRob01hdHJpeC5sb2FkT3J0aG8oMCwgd2lkdGgsIGhlaWdodCwgMCwgLTEsIDEpOworCisgICAgbVdpZHRoID0gd2lkdGg7CisgICAgbUhlaWdodCA9IGhlaWdodDsKK30KKwordm9pZCBPcGVuR0xSZW5kZXJlcjo6cHJlcGFyZSgpIHsKKyAgICBtU25hcHNob3QgPSBuZXcgU25hcHNob3QobUZpcnN0U25hcHNob3QsCisgICAgICAgICAgICBTa0NhbnZhczo6a01hdHJpeF9TYXZlRmxhZyB8IFNrQ2FudmFzOjprQ2xpcF9TYXZlRmxhZyk7CisgICAgbVNhdmVDb3VudCA9IDE7CisKKyAgICBnbFZpZXdwb3J0KDAsIDAsIG1XaWR0aCwgbUhlaWdodCk7CisKKyAgICBnbERpc2FibGUoR0xfRElUSEVSKTsKKyAgICBnbERpc2FibGUoR0xfU0NJU1NPUl9URVNUKTsKKworICAgIGdsQ2xlYXJDb2xvcigwLjBmLCAwLjBmLCAwLjBmLCAwLjBmKTsKKyAgICBnbENsZWFyKEdMX0NPTE9SX0JVRkZFUl9CSVQpOworCisgICAgZ2xFbmFibGUoR0xfU0NJU1NPUl9URVNUKTsKKyAgICBnbFNjaXNzb3IoMCwgMCwgbVdpZHRoLCBtSGVpZ2h0KTsKKworICAgIG1TbmFwc2hvdC0+c2V0Q2xpcCgwLjBmLCAwLjBmLCBtV2lkdGgsIG1IZWlnaHQpOworfQorCit2b2lkIE9wZW5HTFJlbmRlcmVyOjphY3F1aXJlQ29udGV4dCgpIHsKKyAgICBpZiAobUNhY2hlcy5jdXJyZW50UHJvZ3JhbSkgeworICAgICAgICBpZiAobUNhY2hlcy5jdXJyZW50UHJvZ3JhbS0+aXNJblVzZSgpKSB7CisgICAgICAgICAgICBtQ2FjaGVzLmN1cnJlbnRQcm9ncmFtLT5yZW1vdmUoKTsKKyAgICAgICAgICAgIG1DYWNoZXMuY3VycmVudFByb2dyYW0gPSBOVUxMOworICAgICAgICB9CisgICAgfQorfQorCit2b2lkIE9wZW5HTFJlbmRlcmVyOjpyZWxlYXNlQ29udGV4dCgpIHsKKyAgICBnbFZpZXdwb3J0KDAsIDAsIG1XaWR0aCwgbUhlaWdodCk7CisKKyAgICBnbEVuYWJsZShHTF9TQ0lTU09SX1RFU1QpOworICAgIHNldFNjaXNzb3JGcm9tQ2xpcCgpOworCisgICAgZ2xEaXNhYmxlKEdMX0RJVEhFUik7CisKKyAgICBnbEJpbmRGcmFtZWJ1ZmZlcihHTF9GUkFNRUJVRkZFUiwgMCk7CisKKyAgICBpZiAobUNhY2hlcy5ibGVuZCkgeworICAgICAgICBnbEVuYWJsZShHTF9CTEVORCk7CisgICAgICAgIGdsQmxlbmRGdW5jKG1DYWNoZXMubGFzdFNyY01vZGUsIG1DYWNoZXMubGFzdERzdE1vZGUpOworICAgICAgICBnbEJsZW5kRXF1YXRpb24oR0xfRlVOQ19BREQpOworICAgIH0gZWxzZSB7CisgICAgICAgIGdsRGlzYWJsZShHTF9CTEVORCk7CisgICAgfQorfQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBTdGF0ZSBtYW5hZ2VtZW50CisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK2ludCBPcGVuR0xSZW5kZXJlcjo6Z2V0U2F2ZUNvdW50KCkgY29uc3QgeworICAgIHJldHVybiBtU2F2ZUNvdW50OworfQorCitpbnQgT3BlbkdMUmVuZGVyZXI6OnNhdmUoaW50IGZsYWdzKSB7CisgICAgcmV0dXJuIHNhdmVTbmFwc2hvdChmbGFncyk7Cit9CisKK3ZvaWQgT3BlbkdMUmVuZGVyZXI6OnJlc3RvcmUoKSB7CisgICAgaWYgKG1TYXZlQ291bnQgPiAxKSB7CisgICAgICAgIHJlc3RvcmVTbmFwc2hvdCgpOworICAgIH0KK30KKwordm9pZCBPcGVuR0xSZW5kZXJlcjo6cmVzdG9yZVRvQ291bnQoaW50IHNhdmVDb3VudCkgeworICAgIGlmIChzYXZlQ291bnQgPCAxKSBzYXZlQ291bnQgPSAxOworCisgICAgd2hpbGUgKG1TYXZlQ291bnQgPiBzYXZlQ291bnQpIHsKKyAgICAgICAgcmVzdG9yZVNuYXBzaG90KCk7CisgICAgfQorfQorCitpbnQgT3BlbkdMUmVuZGVyZXI6OnNhdmVTbmFwc2hvdChpbnQgZmxhZ3MpIHsKKyAgICBtU25hcHNob3QgPSBuZXcgU25hcHNob3QobVNuYXBzaG90LCBmbGFncyk7CisgICAgcmV0dXJuIG1TYXZlQ291bnQrKzsKK30KKworYm9vbCBPcGVuR0xSZW5kZXJlcjo6cmVzdG9yZVNuYXBzaG90KCkgeworICAgIGJvb2wgcmVzdG9yZUNsaXAgPSBtU25hcHNob3QtPmZsYWdzICYgU25hcHNob3Q6OmtGbGFnQ2xpcFNldDsKKyAgICBib29sIHJlc3RvcmVMYXllciA9IG1TbmFwc2hvdC0+ZmxhZ3MgJiBTbmFwc2hvdDo6a0ZsYWdJc0xheWVyOworCisgICAgc3A8U25hcHNob3Q+IGN1cnJlbnQgPSBtU25hcHNob3Q7CisgICAgc3A8U25hcHNob3Q+IHByZXZpb3VzID0gbVNuYXBzaG90LT5wcmV2aW91czsKKworICAgIG1TYXZlQ291bnQtLTsKKyAgICBtU25hcHNob3QgPSBwcmV2aW91czsKKworICAgIGlmIChyZXN0b3JlTGF5ZXIpIHsKKyAgICAgICAgY29tcG9zZUxheWVyKGN1cnJlbnQsIHByZXZpb3VzKTsKKyAgICB9CisKKyAgICBpZiAocmVzdG9yZUNsaXApIHsKKyAgICAgICAgc2V0U2Npc3NvckZyb21DbGlwKCk7CisgICAgfQorCisgICAgcmV0dXJuIHJlc3RvcmVDbGlwOworfQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBMYXllcnMKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworaW50IE9wZW5HTFJlbmRlcmVyOjpzYXZlTGF5ZXIoZmxvYXQgbGVmdCwgZmxvYXQgdG9wLCBmbG9hdCByaWdodCwgZmxvYXQgYm90dG9tLAorICAgICAgICBjb25zdCBTa1BhaW50KiBwLCBpbnQgZmxhZ3MpIHsKKyAgICBpbnQgY291bnQgPSBzYXZlU25hcHNob3QoZmxhZ3MpOworCisgICAgaW50IGFscGhhID0gMjU1OworICAgIFNrWGZlcm1vZGU6Ok1vZGUgbW9kZTsKKworICAgIGlmIChwKSB7CisgICAgICAgIGFscGhhID0gcC0+Z2V0QWxwaGEoKTsKKyAgICAgICAgaWYgKCFtRXh0ZW5zaW9ucy5oYXNGcmFtZWJ1ZmZlckZldGNoKCkpIHsKKyAgICAgICAgICAgIGNvbnN0IGJvb2wgaXNNb2RlID0gU2tYZmVybW9kZTo6SXNNb2RlKHAtPmdldFhmZXJtb2RlKCksICZtb2RlKTsKKyAgICAgICAgICAgIGlmICghaXNNb2RlKSB7CisgICAgICAgICAgICAgICAgLy8gQXNzdW1lIFNSQ19PVkVSCisgICAgICAgICAgICAgICAgbW9kZSA9IFNrWGZlcm1vZGU6OmtTcmNPdmVyX01vZGU7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtb2RlID0gZ2V0WGZlcm1vZGUocC0+Z2V0WGZlcm1vZGUoKSk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBtb2RlID0gU2tYZmVybW9kZTo6a1NyY092ZXJfTW9kZTsKKyAgICB9CisKKyAgICBjcmVhdGVMYXllcihtU25hcHNob3QsIGxlZnQsIHRvcCwgcmlnaHQsIGJvdHRvbSwgYWxwaGEsIG1vZGUsIGZsYWdzKTsKKworICAgIHJldHVybiBjb3VudDsKK30KKworaW50IE9wZW5HTFJlbmRlcmVyOjpzYXZlTGF5ZXJBbHBoYShmbG9hdCBsZWZ0LCBmbG9hdCB0b3AsIGZsb2F0IHJpZ2h0LCBmbG9hdCBib3R0b20sCisgICAgICAgIGludCBhbHBoYSwgaW50IGZsYWdzKSB7CisgICAgaWYgKGFscGhhID09IDB4ZmYpIHsKKyAgICAgICAgcmV0dXJuIHNhdmVMYXllcihsZWZ0LCB0b3AsIHJpZ2h0LCBib3R0b20sIE5VTEwsIGZsYWdzKTsKKyAgICB9IGVsc2UgeworICAgICAgICBTa1BhaW50IHBhaW50OworICAgICAgICBwYWludC5zZXRBbHBoYShhbHBoYSk7CisgICAgICAgIHJldHVybiBzYXZlTGF5ZXIobGVmdCwgdG9wLCByaWdodCwgYm90dG9tLCAmcGFpbnQsIGZsYWdzKTsKKyAgICB9Cit9CisKKy8qKgorICogTGF5ZXJzIGFyZSB2aWV3ZWQgYnkgU2tpYSBhcmUgc2xpZ2h0bHkgZGlmZmVyZW50IHRoYW4gbGF5ZXJzIGluIGltYWdlIGVkaXRpbmcKKyAqIHByb2dyYW1zIChmb3IgaW5zdGFuY2UuKSBXaGVuIGEgbGF5ZXIgaXMgY3JlYXRlZCwgcHJldmlvdXNseSBjcmVhdGVkIGxheWVycworICogYW5kIHRoZSBmcmFtZSBidWZmZXIgc3RpbGwgcmVjZWl2ZSBldmVyeSBkcmF3aW5nIGNvbW1hbmQuIEZvciBpbnN0YW5jZSwgaWYgYQorICogbGF5ZXIgaXMgY3JlYXRlZCBhbmQgYSBzaGFwZSBpbnRlcnNlY3RpbmcgdGhlIGJvdW5kcyBvZiB0aGUgbGF5ZXJzIGFuZCB0aGUKKyAqIGZyYW1lYnVmZmVyIGlzIGRyYXcsIHRoZSBzaGFwZSB3aWxsIGJlIGRyYXduIG9uIGJvdGggKHVubGVzcyB0aGUgbGF5ZXIgd2FzCisgKiBjcmVhdGVkIHdpdGggdGhlIFNrQ2FudmFzOjprQ2xpcFRvTGF5ZXJfU2F2ZUZsYWcgZmxhZy4pCisgKgorICogQSB3YXkgdG8gaW1wbGVtZW50IGxheWVycyBpcyB0byBjcmVhdGUgYW4gRkJPIGZvciBlYWNoIGxheWVyLCBiYWNrZWQgYnkgYW4gUkdCQQorICogdGV4dHVyZS4gVW5mb3J0dW5hdGVseSwgdGhpcyBpcyBpbmVmZmljaWVudCBhcyBpdCByZXF1aXJlcyBldmVyeSBwcmltaXRpdmUgdG8KKyAqIGJlIGRyYXduIG4gKyAxIHRpbWVzLCB3aGVyZSBuIGlzIHRoZSBudW1iZXIgb2YgYWN0aXZlIGxheWVycy4gSW4gcHJhY3RpY2UgdGhpcworICogbWVhbnMsIGZvciBldmVyeSBwcmltaXRpdmU6CisgKiAgIC0gU3dpdGNoIGFjdGl2ZSBmcmFtZSBidWZmZXIKKyAqICAgLSBDaGFuZ2Ugdmlld3BvcnQsIGNsaXAgYW5kIHByb2plY3Rpb24gbWF0cml4CisgKiAgIC0gSXNzdWUgdGhlIGRyYXdpbmcKKyAqCisgKiBTd2l0Y2hpbmcgcmVuZGVyaW5nIHRhcmdldCBuICsgMSB0aW1lcyBwZXIgZHJhd24gcHJpbWl0aXZlIGlzIGV4dHJlbWVseSBjb3N0bHkuCisgKiBUbyBhdm9pZCB0aGlzLCBsYXllcnMgYXJlIGltcGxlbWVudGVkIGluIGEgZGlmZmVyZW50IHdheSBoZXJlLgorICoKKyAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmVsaWVzIG9uIHRoZSBmcmFtZSBidWZmZXIgYmVpbmcgYXQgbGVhc3QgUkdCQSA4ODg4LiBXaGVuCisgKiBhIGxheWVyIGlzIGNyZWF0ZWQsIG9ubHkgYSB0ZXh0dXJlIGlzIGNyZWF0ZWQsIG5vdCBhbiBGQk8uIFRoZSBjb250ZW50IG9mIHRoZQorICogZnJhbWUgYnVmZmVyIGNvbnRhaW5lZCB3aXRoaW4gdGhlIGxheWVyJ3MgYm91bmRzIGlzIGNvcGllZCBpbnRvIHRoaXMgdGV4dHVyZQorICogdXNpbmcgZ2xDb3B5VGV4SW1hZ2UyRCgpLiBUaGUgbGF5ZXIncyByZWdpb24gaXMgdGhlbiBjbGVhcmVkKDEpIGluIHRoZSBmcmFtZQorICogYnVmZmVyIGFuZCBkcmF3aW5nIGNvbnRpbnVlcyBhcyBub3JtYWwuIFRoaXMgdGVjaG5pcXVlIHRoZXJlZm9yZSB0cmVhdHMgdGhlCisgKiBmcmFtZSBidWZmZXIgYXMgYSBzY3JhdGNoIGJ1ZmZlciBmb3IgdGhlIGxheWVycy4KKyAqCisgKiBUbyBjb21wb3NlIHRoZSBsYXllcnMgYmFjayBvbnRvIHRoZSBmcmFtZSBidWZmZXIsIGVhY2ggbGF5ZXIgdGV4dHVyZQorICogKGNvbnRhaW5pbmcgdGhlIG9yaWdpbmFsIGZyYW1lIGJ1ZmZlciBkYXRhKSBpcyBkcmF3biBhcyBhIHNpbXBsZSBxdWFkIG92ZXIKKyAqIHRoZSBmcmFtZSBidWZmZXIuIFRoZSB0cmljayBpcyB0aGF0IHRoZSBxdWFkIGlzIHNldCBhcyB0aGUgY29tcG9zaXRpb24KKyAqIGRlc3RpbmF0aW9uIGluIHRoZSBibGVuZGluZyBlcXVhdGlvbiwgYW5kIHRoZSBmcmFtZSBidWZmZXIgYmVjb21lcyB0aGUgc291cmNlCisgKiBvZiB0aGUgY29tcG9zaXRpb24uCisgKgorICogRHJhd2luZyBsYXllcnMgd2l0aCBhbiBhbHBoYSB2YWx1ZSByZXF1aXJlcyBhbiBleHRyYSBzdGVwIGJlZm9yZSBjb21wb3NpdGlvbi4KKyAqIEFuIGVtcHR5IHF1YWQgaXMgZHJhd24gb3ZlciB0aGUgbGF5ZXIncyByZWdpb24gaW4gdGhlIGZyYW1lIGJ1ZmZlci4gVGhpcyBxdWFkCisgKiBpcyBkcmF3biB3aXRoIHRoZSByZ2JhIGNvbG9yICgwLDAsMCxhbHBoYSkuIFRoZSBhbHBoYSB2YWx1ZSBvZmZlcmVkIGJ5IHRoZQorICogcXVhZCBpcyB1c2VkIHRvIG11bHRpcGx5IHRoZSBjb2xvcnMgaW4gdGhlIGZyYW1lIGJ1ZmZlci4gVGhpcyBpcyBhY2hpZXZlZCBieQorICogY2hhbmdpbmcgdGhlIEdMIGJsZW5kIGZ1bmN0aW9ucyBmb3IgdGhlIEdMX0ZVTkNfQUREIGJsZW5kIGVxdWF0aW9uIHRvCisgKiBHTF9aRVJPLCBHTF9TUkNfQUxQSEEuCisgKgorICogQmVjYXVzZSBnbENvcHlUZXhJbWFnZTJEKCkgY2FuIGJlIHNsb3csIGFuIGFsdGVybmF0aXZlIGltcGxlbWVudGF0aW9uIG1pZ2h0CisgKiBiZSB1c2UgdG8gZHJhdyBhIHNpbmdsZSBjbGlwcGVkIGxheWVyLiBUaGUgaW1wbGVtZW50YXRpb24gZGVzY3JpYmVkIGFib3ZlCisgKiBpcyBjb3JyZWN0IGluIGV2ZXJ5IGNhc2UuCisgKgorICogKDEpIFRoZSBmcmFtZSBidWZmZXIgaXMgYWN0dWFsbHkgbm90IGNsZWFyZWQgcmlnaHQgYXdheS4gVG8gYWxsb3cgdGhlIEdQVQorICogICAgIHRvIHBvdGVudGlhbGx5IG9wdGltaXplIHNlcmllcyBvZiBjYWxscyB0byBnbENvcHlUZXhJbWFnZTJELCB0aGUgZnJhbWUKKyAqICAgICBidWZmZXIgaXMgbGVmdCB1bnRvdWNoZWQgdW50aWwgdGhlIGZpcnN0IGRyYXdpbmcgb3BlcmF0aW9uLiBPbmx5IHdoZW4KKyAqICAgICBzb21ldGhpbmcgYWN0dWFsbHkgZ2V0cyBkcmF3biBhcmUgdGhlIGxheWVycyByZWdpb25zIGNsZWFyZWQuCisgKi8KK2Jvb2wgT3BlbkdMUmVuZGVyZXI6OmNyZWF0ZUxheWVyKHNwPFNuYXBzaG90PiBzbmFwc2hvdCwgZmxvYXQgbGVmdCwgZmxvYXQgdG9wLAorICAgICAgICBmbG9hdCByaWdodCwgZmxvYXQgYm90dG9tLCBpbnQgYWxwaGEsIFNrWGZlcm1vZGU6Ok1vZGUgbW9kZSxpbnQgZmxhZ3MpIHsKKyAgICBMQVlFUl9MT0dEKCJSZXF1ZXN0aW5nIGxheWVyICVmeCVmIiwgcmlnaHQgLSBsZWZ0LCBib3R0b20gLSB0b3ApOworICAgIExBWUVSX0xPR0QoIkxheWVyIGNhY2hlIHNpemUgPSAlZCIsIG1DYWNoZXMubGF5ZXJDYWNoZS5nZXRTaXplKCkpOworCisgICAgLy8gV2luZG93IGNvb3JkaW5hdGVzIG9mIHRoZSBsYXllcgorICAgIFJlY3QgYm91bmRzKGxlZnQsIHRvcCwgcmlnaHQsIGJvdHRvbSk7CisgICAgbVNuYXBzaG90LT50cmFuc2Zvcm0tPm1hcFJlY3QoYm91bmRzKTsKKworICAgIC8vIExheWVycyBvbmx5IG1ha2Ugc2Vuc2UgaWYgdGhleSBhcmUgaW4gdGhlIGZyYW1lYnVmZmVyJ3MgYm91bmRzCisgICAgYm91bmRzLmludGVyc2VjdCgqbVNuYXBzaG90LT5jbGlwUmVjdCk7CisgICAgaWYgKGJvdW5kcy5pc0VtcHR5KCkpIHJldHVybiBmYWxzZTsKKworICAgIExheWVyU2l6ZSBzaXplKGJvdW5kcy5nZXRXaWR0aCgpLCBib3VuZHMuZ2V0SGVpZ2h0KCkpOworICAgIExheWVyKiBsYXllciA9IG1DYWNoZXMubGF5ZXJDYWNoZS5nZXQoc2l6ZSk7CisgICAgaWYgKCFsYXllcikgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgbGF5ZXItPm1vZGUgPSBtb2RlOworICAgIGxheWVyLT5hbHBoYSA9IGFscGhhOworICAgIGxheWVyLT5sYXllci5zZXQoYm91bmRzKTsKKworICAgIC8vIFNhdmUgdGhlIGxheWVyIGluIHRoZSBzbmFwc2hvdAorICAgIHNuYXBzaG90LT5mbGFncyB8PSBTbmFwc2hvdDo6a0ZsYWdJc0xheWVyOworICAgIHNuYXBzaG90LT5sYXllciA9IGxheWVyOworCisgICAgLy8gQ29weSB0aGUgZnJhbWVidWZmZXIgaW50byB0aGUgbGF5ZXIKKyAgICBnbEJpbmRUZXh0dXJlKEdMX1RFWFRVUkVfMkQsIGxheWVyLT50ZXh0dXJlKTsKKyAgICBnbENvcHlUZXhJbWFnZTJEKEdMX1RFWFRVUkVfMkQsIDAsIEdMX1JHQkEsIGJvdW5kcy5sZWZ0LCBtSGVpZ2h0IC0gYm91bmRzLmJvdHRvbSwKKyAgICAgICAgICAgIGJvdW5kcy5nZXRXaWR0aCgpLCBib3VuZHMuZ2V0SGVpZ2h0KCksIDApOworCisgICAgaWYgKGZsYWdzICYgU2tDYW52YXM6OmtDbGlwVG9MYXllcl9TYXZlRmxhZykgeworICAgICAgICBpZiAobVNuYXBzaG90LT5jbGlwVHJhbnNmb3JtZWQoYm91bmRzKSkgc2V0U2Npc3NvckZyb21DbGlwKCk7CisgICAgfQorCisgICAgLy8gRW5xdWV1ZSB0aGUgYnVmZmVyIGNvb3JkaW5hdGVzIHRvIGNsZWFyIHRoZSBjb3JyZXNwb25kaW5nIHJlZ2lvbiBsYXRlcgorICAgIG1MYXllcnMucHVzaChuZXcgUmVjdChib3VuZHMpKTsKKworICAgIHJldHVybiB0cnVlOworfQorCisvKioKKyAqIFJlYWQgdGhlIGRvY3VtZW50YXRpb24gb2YgY3JlYXRlTGF5ZXIoKSBiZWZvcmUgZG9pbmcgYW55dGhpbmcgaW4gdGhpcyBtZXRob2QuCisgKi8KK3ZvaWQgT3BlbkdMUmVuZGVyZXI6OmNvbXBvc2VMYXllcihzcDxTbmFwc2hvdD4gY3VycmVudCwgc3A8U25hcHNob3Q+IHByZXZpb3VzKSB7CisgICAgaWYgKCFjdXJyZW50LT5sYXllcikgeworICAgICAgICBMT0dFKCJBdHRlbXB0aW5nIHRvIGNvbXBvc2UgYSBsYXllciB0aGF0IGRvZXMgbm90IGV4aXN0Iik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvLyBSZXN0b3JlIHRoZSBjbGlwIGZyb20gdGhlIHByZXZpb3VzIHNuYXBzaG90CisgICAgY29uc3QgUmVjdCYgY2xpcCA9ICpwcmV2aW91cy0+Y2xpcFJlY3Q7CisgICAgZ2xTY2lzc29yKGNsaXAubGVmdCwgbUhlaWdodCAtIGNsaXAuYm90dG9tLCBjbGlwLmdldFdpZHRoKCksIGNsaXAuZ2V0SGVpZ2h0KCkpOworCisgICAgTGF5ZXIqIGxheWVyID0gY3VycmVudC0+bGF5ZXI7CisgICAgY29uc3QgUmVjdCYgcmVjdCA9IGxheWVyLT5sYXllcjsKKworICAgIGlmIChsYXllci0+YWxwaGEgPCAyNTUpIHsKKyAgICAgICAgZHJhd0NvbG9yUmVjdChyZWN0LmxlZnQsIHJlY3QudG9wLCByZWN0LnJpZ2h0LCByZWN0LmJvdHRvbSwKKyAgICAgICAgICAgICAgICBsYXllci0+YWxwaGEgPDwgMjQsIFNrWGZlcm1vZGU6OmtEc3RJbl9Nb2RlLCB0cnVlKTsKKyAgICB9CisKKyAgICAvLyBMYXllcnMgYXJlIGFscmVhZHkgZHJhd24gd2l0aCBhIHRvcC1sZWZ0IG9yaWdpbiwgZG9uJ3QgZmxpcCB0aGUgdGV4dHVyZQorICAgIHJlc2V0RHJhd1RleHR1cmVUZXhDb29yZHMoMC4wZiwgMS4wZiwgMS4wZiwgMC4wZik7CisKKyAgICBkcmF3VGV4dHVyZU1lc2gocmVjdC5sZWZ0LCByZWN0LnRvcCwgcmVjdC5yaWdodCwgcmVjdC5ib3R0b20sIGxheWVyLT50ZXh0dXJlLAorICAgICAgICAgICAgMS4wZiwgbGF5ZXItPm1vZGUsIGxheWVyLT5ibGVuZCwgJm1NZXNoVmVydGljZXNbMF0ucG9zaXRpb25bMF0sCisgICAgICAgICAgICAmbU1lc2hWZXJ0aWNlc1swXS50ZXh0dXJlWzBdLCBOVUxMLCAwLCB0cnVlLCB0cnVlKTsKKworICAgIHJlc2V0RHJhd1RleHR1cmVUZXhDb29yZHMoMC4wZiwgMC4wZiwgMS4wZiwgMS4wZik7CisKKyAgICBMYXllclNpemUgc2l6ZShyZWN0LmdldFdpZHRoKCksIHJlY3QuZ2V0SGVpZ2h0KCkpOworICAgIC8vIEZhaWxpbmcgdG8gYWRkIHRoZSBsYXllciB0byB0aGUgY2FjaGUgc2hvdWxkIGhhcHBlbiBvbmx5IGlmIHRoZQorICAgIC8vIGxheWVyIGlzIHRvbyBsYXJnZQorICAgIGlmICghbUNhY2hlcy5sYXllckNhY2hlLnB1dChzaXplLCBsYXllcikpIHsKKyAgICAgICAgTEFZRVJfTE9HRCgiRGVsZXRpbmcgbGF5ZXIiKTsKKworICAgICAgICBnbERlbGV0ZVRleHR1cmVzKDEsICZsYXllci0+dGV4dHVyZSk7CisKKyAgICAgICAgZGVsZXRlIGxheWVyOworICAgIH0KK30KKwordm9pZCBPcGVuR0xSZW5kZXJlcjo6Y2xlYXJMYXllclJlZ2lvbnMoKSB7CisgICAgaWYgKG1MYXllcnMuc2l6ZSgpID09IDApIHJldHVybjsKKworICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBtTGF5ZXJzLnNpemUoKTsgaSsrKSB7CisgICAgICAgIFJlY3QqIGJvdW5kcyA9IG1MYXllcnMuaXRlbUF0KGkpOworCisgICAgICAgIC8vIENsZWFyIHRoZSBmcmFtZWJ1ZmZlciB3aGVyZSB0aGUgbGF5ZXIgd2lsbCBkcmF3CisgICAgICAgIGdsU2Npc3Nvcihib3VuZHMtPmxlZnQsIG1IZWlnaHQgLSBib3VuZHMtPmJvdHRvbSwKKyAgICAgICAgICAgICAgICBib3VuZHMtPmdldFdpZHRoKCksIGJvdW5kcy0+Z2V0SGVpZ2h0KCkpOworICAgICAgICBnbENsZWFyQ29sb3IoMC4wZiwgMC4wZiwgMC4wZiwgMC4wZik7CisgICAgICAgIGdsQ2xlYXIoR0xfQ09MT1JfQlVGRkVSX0JJVCk7CisKKyAgICAgICAgZGVsZXRlIGJvdW5kczsKKyAgICB9CisgICAgbUxheWVycy5jbGVhcigpOworCisgICAgLy8gUmVzdG9yZSB0aGUgY2xpcAorICAgIHNldFNjaXNzb3JGcm9tQ2xpcCgpOworfQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBUcmFuc2Zvcm1zCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK3ZvaWQgT3BlbkdMUmVuZGVyZXI6OnRyYW5zbGF0ZShmbG9hdCBkeCwgZmxvYXQgZHkpIHsKKyAgICBtU25hcHNob3QtPnRyYW5zZm9ybS0+dHJhbnNsYXRlKGR4LCBkeSwgMC4wZik7Cit9CisKK3ZvaWQgT3BlbkdMUmVuZGVyZXI6OnJvdGF0ZShmbG9hdCBkZWdyZWVzKSB7CisgICAgbVNuYXBzaG90LT50cmFuc2Zvcm0tPnJvdGF0ZShkZWdyZWVzLCAwLjBmLCAwLjBmLCAxLjBmKTsKK30KKwordm9pZCBPcGVuR0xSZW5kZXJlcjo6c2NhbGUoZmxvYXQgc3gsIGZsb2F0IHN5KSB7CisgICAgbVNuYXBzaG90LT50cmFuc2Zvcm0tPnNjYWxlKHN4LCBzeSwgMS4wZik7Cit9CisKK3ZvaWQgT3BlbkdMUmVuZGVyZXI6OnNldE1hdHJpeChTa01hdHJpeCogbWF0cml4KSB7CisgICAgbVNuYXBzaG90LT50cmFuc2Zvcm0tPmxvYWQoKm1hdHJpeCk7Cit9CisKK3ZvaWQgT3BlbkdMUmVuZGVyZXI6OmdldE1hdHJpeChTa01hdHJpeCogbWF0cml4KSB7CisgICAgbVNuYXBzaG90LT50cmFuc2Zvcm0tPmNvcHlUbygqbWF0cml4KTsKK30KKwordm9pZCBPcGVuR0xSZW5kZXJlcjo6Y29uY2F0TWF0cml4KFNrTWF0cml4KiBtYXRyaXgpIHsKKyAgICBtYXQ0IG0oKm1hdHJpeCk7CisgICAgbVNuYXBzaG90LT50cmFuc2Zvcm0tPm11bHRpcGx5KG0pOworfQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBDbGlwcGluZworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCit2b2lkIE9wZW5HTFJlbmRlcmVyOjpzZXRTY2lzc29yRnJvbUNsaXAoKSB7CisgICAgY29uc3QgUmVjdCYgY2xpcCA9ICptU25hcHNob3QtPmNsaXBSZWN0OworICAgIGdsU2Npc3NvcihjbGlwLmxlZnQsIG1IZWlnaHQgLSBjbGlwLmJvdHRvbSwgY2xpcC5nZXRXaWR0aCgpLCBjbGlwLmdldEhlaWdodCgpKTsKK30KKworY29uc3QgUmVjdCYgT3BlbkdMUmVuZGVyZXI6OmdldENsaXBCb3VuZHMoKSB7CisgICAgcmV0dXJuIG1TbmFwc2hvdC0+Z2V0TG9jYWxDbGlwKCk7Cit9CisKK2Jvb2wgT3BlbkdMUmVuZGVyZXI6OnF1aWNrUmVqZWN0KGZsb2F0IGxlZnQsIGZsb2F0IHRvcCwgZmxvYXQgcmlnaHQsIGZsb2F0IGJvdHRvbSkgeworICAgIFJlY3QgcihsZWZ0LCB0b3AsIHJpZ2h0LCBib3R0b20pOworICAgIG1TbmFwc2hvdC0+dHJhbnNmb3JtLT5tYXBSZWN0KHIpOworICAgIHJldHVybiAhbVNuYXBzaG90LT5jbGlwUmVjdC0+aW50ZXJzZWN0cyhyKTsKK30KKworYm9vbCBPcGVuR0xSZW5kZXJlcjo6Y2xpcFJlY3QoZmxvYXQgbGVmdCwgZmxvYXQgdG9wLCBmbG9hdCByaWdodCwgZmxvYXQgYm90dG9tLCBTa1JlZ2lvbjo6T3Agb3ApIHsKKyAgICBib29sIGNsaXBwZWQgPSBtU25hcHNob3QtPmNsaXAobGVmdCwgdG9wLCByaWdodCwgYm90dG9tLCBvcCk7CisgICAgaWYgKGNsaXBwZWQpIHsKKyAgICAgICAgc2V0U2Npc3NvckZyb21DbGlwKCk7CisgICAgfQorICAgIHJldHVybiAhbVNuYXBzaG90LT5jbGlwUmVjdC0+aXNFbXB0eSgpOworfQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBEcmF3aW5nCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK3ZvaWQgT3BlbkdMUmVuZGVyZXI6OmRyYXdCaXRtYXAoU2tCaXRtYXAqIGJpdG1hcCwgZmxvYXQgbGVmdCwgZmxvYXQgdG9wLCBjb25zdCBTa1BhaW50KiBwYWludCkgeworICAgIGNvbnN0IGZsb2F0IHJpZ2h0ID0gbGVmdCArIGJpdG1hcC0+d2lkdGgoKTsKKyAgICBjb25zdCBmbG9hdCBib3R0b20gPSB0b3AgKyBiaXRtYXAtPmhlaWdodCgpOworCisgICAgaWYgKHF1aWNrUmVqZWN0KGxlZnQsIHRvcCwgcmlnaHQsIGJvdHRvbSkpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGdsQWN0aXZlVGV4dHVyZShHTF9URVhUVVJFMCk7CisgICAgY29uc3QgVGV4dHVyZSogdGV4dHVyZSA9IG1DYWNoZXMudGV4dHVyZUNhY2hlLmdldChiaXRtYXApOworICAgIGlmICghdGV4dHVyZSkgcmV0dXJuOworICAgIGNvbnN0IEF1dG9UZXh0dXJlIGF1dG9DbGVhbnVwKHRleHR1cmUpOworCisgICAgZHJhd1RleHR1cmVSZWN0KGxlZnQsIHRvcCwgcmlnaHQsIGJvdHRvbSwgdGV4dHVyZSwgcGFpbnQpOworfQorCit2b2lkIE9wZW5HTFJlbmRlcmVyOjpkcmF3Qml0bWFwKFNrQml0bWFwKiBiaXRtYXAsIGNvbnN0IFNrTWF0cml4KiBtYXRyaXgsIGNvbnN0IFNrUGFpbnQqIHBhaW50KSB7CisgICAgUmVjdCByKDAuMGYsIDAuMGYsIGJpdG1hcC0+d2lkdGgoKSwgYml0bWFwLT5oZWlnaHQoKSk7CisgICAgY29uc3QgbWF0NCB0cmFuc2Zvcm0oKm1hdHJpeCk7CisgICAgdHJhbnNmb3JtLm1hcFJlY3Qocik7CisKKyAgICBpZiAocXVpY2tSZWplY3Qoci5sZWZ0LCByLnRvcCwgci5yaWdodCwgci5ib3R0b20pKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBnbEFjdGl2ZVRleHR1cmUoR0xfVEVYVFVSRTApOworICAgIGNvbnN0IFRleHR1cmUqIHRleHR1cmUgPSBtQ2FjaGVzLnRleHR1cmVDYWNoZS5nZXQoYml0bWFwKTsKKyAgICBpZiAoIXRleHR1cmUpIHJldHVybjsKKyAgICBjb25zdCBBdXRvVGV4dHVyZSBhdXRvQ2xlYW51cCh0ZXh0dXJlKTsKKworICAgIGRyYXdUZXh0dXJlUmVjdChyLmxlZnQsIHIudG9wLCByLnJpZ2h0LCByLmJvdHRvbSwgdGV4dHVyZSwgcGFpbnQpOworfQorCit2b2lkIE9wZW5HTFJlbmRlcmVyOjpkcmF3Qml0bWFwKFNrQml0bWFwKiBiaXRtYXAsCisgICAgICAgICBmbG9hdCBzcmNMZWZ0LCBmbG9hdCBzcmNUb3AsIGZsb2F0IHNyY1JpZ2h0LCBmbG9hdCBzcmNCb3R0b20sCisgICAgICAgICBmbG9hdCBkc3RMZWZ0LCBmbG9hdCBkc3RUb3AsIGZsb2F0IGRzdFJpZ2h0LCBmbG9hdCBkc3RCb3R0b20sCisgICAgICAgICBjb25zdCBTa1BhaW50KiBwYWludCkgeworICAgIGlmIChxdWlja1JlamVjdChkc3RMZWZ0LCBkc3RUb3AsIGRzdFJpZ2h0LCBkc3RCb3R0b20pKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBnbEFjdGl2ZVRleHR1cmUoR0xfVEVYVFVSRTApOworICAgIGNvbnN0IFRleHR1cmUqIHRleHR1cmUgPSBtQ2FjaGVzLnRleHR1cmVDYWNoZS5nZXQoYml0bWFwKTsKKyAgICBpZiAoIXRleHR1cmUpIHJldHVybjsKKyAgICBjb25zdCBBdXRvVGV4dHVyZSBhdXRvQ2xlYW51cCh0ZXh0dXJlKTsKKworICAgIGNvbnN0IGZsb2F0IHdpZHRoID0gdGV4dHVyZS0+d2lkdGg7CisgICAgY29uc3QgZmxvYXQgaGVpZ2h0ID0gdGV4dHVyZS0+aGVpZ2h0OworCisgICAgY29uc3QgZmxvYXQgdTEgPSBzcmNMZWZ0IC8gd2lkdGg7CisgICAgY29uc3QgZmxvYXQgdjEgPSBzcmNUb3AgLyBoZWlnaHQ7CisgICAgY29uc3QgZmxvYXQgdTIgPSBzcmNSaWdodCAvIHdpZHRoOworICAgIGNvbnN0IGZsb2F0IHYyID0gc3JjQm90dG9tIC8gaGVpZ2h0OworCisgICAgcmVzZXREcmF3VGV4dHVyZVRleENvb3Jkcyh1MSwgdjEsIHUyLCB2Mik7CisKKyAgICBkcmF3VGV4dHVyZVJlY3QoZHN0TGVmdCwgZHN0VG9wLCBkc3RSaWdodCwgZHN0Qm90dG9tLCB0ZXh0dXJlLCBwYWludCk7CisKKyAgICByZXNldERyYXdUZXh0dXJlVGV4Q29vcmRzKDAuMGYsIDAuMGYsIDEuMGYsIDEuMGYpOworfQorCit2b2lkIE9wZW5HTFJlbmRlcmVyOjpkcmF3UGF0Y2goU2tCaXRtYXAqIGJpdG1hcCwgUmVzX3BuZ185cGF0Y2gqIHBhdGNoLAorICAgICAgICBmbG9hdCBsZWZ0LCBmbG9hdCB0b3AsIGZsb2F0IHJpZ2h0LCBmbG9hdCBib3R0b20sIGNvbnN0IFNrUGFpbnQqIHBhaW50KSB7CisgICAgaWYgKHF1aWNrUmVqZWN0KGxlZnQsIHRvcCwgcmlnaHQsIGJvdHRvbSkpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGdsQWN0aXZlVGV4dHVyZShHTF9URVhUVVJFMCk7CisgICAgY29uc3QgVGV4dHVyZSogdGV4dHVyZSA9IG1DYWNoZXMudGV4dHVyZUNhY2hlLmdldChiaXRtYXApOworICAgIGlmICghdGV4dHVyZSkgcmV0dXJuOworICAgIGNvbnN0IEF1dG9UZXh0dXJlIGF1dG9DbGVhbnVwKHRleHR1cmUpOworCisgICAgaW50IGFscGhhOworICAgIFNrWGZlcm1vZGU6Ok1vZGUgbW9kZTsKKyAgICBnZXRBbHBoYUFuZE1vZGUocGFpbnQsICZhbHBoYSwgJm1vZGUpOworCisgICAgUGF0Y2gqIG1lc2ggPSBtQ2FjaGVzLnBhdGNoQ2FjaGUuZ2V0KHBhdGNoKTsKKyAgICBtZXNoLT51cGRhdGVWZXJ0aWNlcyhiaXRtYXAsIGxlZnQsIHRvcCwgcmlnaHQsIGJvdHRvbSwKKyAgICAgICAgICAgICZwYXRjaC0+eERpdnNbMF0sICZwYXRjaC0+eURpdnNbMF0sIHBhdGNoLT5udW1YRGl2cywgcGF0Y2gtPm51bVlEaXZzKTsKKyAgICBtZXNoLT5kdW1wKCk7CisKKyAgICAvLyBTcGVjaWZ5IHJpZ2h0IGFuZCBib3R0b20gYXMgKzEuMGYgZnJvbSBsZWZ0L3RvcCB0byBwcmV2ZW50IHNjYWxpbmcgc2luY2UgdGhlCisgICAgLy8gcGF0Y2ggbWVzaCBhbHJlYWR5IGRlZmluZXMgdGhlIGZpbmFsIHNpemUKKyAgICBkcmF3VGV4dHVyZU1lc2gobGVmdCwgdG9wLCBsZWZ0ICsgMS4wZiwgdG9wICsgMS4wZiwgdGV4dHVyZS0+aWQsIGFscGhhIC8gMjU1LjBmLAorICAgICAgICAgICAgbW9kZSwgdGV4dHVyZS0+YmxlbmQsICZtZXNoLT52ZXJ0aWNlc1swXS5wb3NpdGlvblswXSwKKyAgICAgICAgICAgICZtZXNoLT52ZXJ0aWNlc1swXS50ZXh0dXJlWzBdLCBtZXNoLT5pbmRpY2VzLCBtZXNoLT5pbmRpY2VzQ291bnQpOworfQorCit2b2lkIE9wZW5HTFJlbmRlcmVyOjpkcmF3Q29sb3IoaW50IGNvbG9yLCBTa1hmZXJtb2RlOjpNb2RlIG1vZGUpIHsKKyAgICBjb25zdCBSZWN0JiBjbGlwID0gKm1TbmFwc2hvdC0+Y2xpcFJlY3Q7CisgICAgZHJhd0NvbG9yUmVjdChjbGlwLmxlZnQsIGNsaXAudG9wLCBjbGlwLnJpZ2h0LCBjbGlwLmJvdHRvbSwgY29sb3IsIG1vZGUsIHRydWUpOworfQorCit2b2lkIE9wZW5HTFJlbmRlcmVyOjpkcmF3UmVjdChmbG9hdCBsZWZ0LCBmbG9hdCB0b3AsIGZsb2F0IHJpZ2h0LCBmbG9hdCBib3R0b20sIGNvbnN0IFNrUGFpbnQqIHApIHsKKyAgICBpZiAocXVpY2tSZWplY3QobGVmdCwgdG9wLCByaWdodCwgYm90dG9tKSkgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgU2tYZmVybW9kZTo6TW9kZSBtb2RlOworICAgIGlmICghbUV4dGVuc2lvbnMuaGFzRnJhbWVidWZmZXJGZXRjaCgpKSB7CisgICAgICAgIGNvbnN0IGJvb2wgaXNNb2RlID0gU2tYZmVybW9kZTo6SXNNb2RlKHAtPmdldFhmZXJtb2RlKCksICZtb2RlKTsKKyAgICAgICAgaWYgKCFpc01vZGUpIHsKKyAgICAgICAgICAgIC8vIEFzc3VtZSBTUkNfT1ZFUgorICAgICAgICAgICAgbW9kZSA9IFNrWGZlcm1vZGU6OmtTcmNPdmVyX01vZGU7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBtb2RlID0gZ2V0WGZlcm1vZGUocC0+Z2V0WGZlcm1vZGUoKSk7CisgICAgfQorCisgICAgLy8gU2tpYSBkcmF3cyB1c2luZyB0aGUgY29sb3IncyBhbHBoYSBjaGFubmVsIGlmIDwgMjU1CisgICAgLy8gT3RoZXJ3aXNlLCBpdCB1c2VzIHRoZSBwYWludCdzIGFscGhhCisgICAgaW50IGNvbG9yID0gcC0+Z2V0Q29sb3IoKTsKKyAgICBpZiAoKChjb2xvciA+PiAyNCkgJiAweGZmKSA9PSAyNTUpIHsKKyAgICAgICAgY29sb3IgfD0gcC0+Z2V0QWxwaGEoKSA8PCAyNDsKKyAgICB9CisKKyAgICBkcmF3Q29sb3JSZWN0KGxlZnQsIHRvcCwgcmlnaHQsIGJvdHRvbSwgY29sb3IsIG1vZGUpOworfQorCit2b2lkIE9wZW5HTFJlbmRlcmVyOjpkcmF3VGV4dChjb25zdCBjaGFyKiB0ZXh0LCBpbnQgYnl0ZXNDb3VudCwgaW50IGNvdW50LAorICAgICAgICBmbG9hdCB4LCBmbG9hdCB5LCBTa1BhaW50KiBwYWludCkgeworICAgIGlmICh0ZXh0ID09IE5VTEwgfHwgY291bnQgPT0gMCB8fCAocGFpbnQtPmdldEFscGhhKCkgPT0gMCAmJiBwYWludC0+Z2V0WGZlcm1vZGUoKSA9PSBOVUxMKSkgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIHBhaW50LT5zZXRBbnRpQWxpYXModHJ1ZSk7CisKKyAgICBmbG9hdCBsZW5ndGggPSAtMS4wZjsKKyAgICBzd2l0Y2ggKHBhaW50LT5nZXRUZXh0QWxpZ24oKSkgeworICAgICAgICBjYXNlIFNrUGFpbnQ6OmtDZW50ZXJfQWxpZ246CisgICAgICAgICAgICBsZW5ndGggPSBwYWludC0+bWVhc3VyZVRleHQodGV4dCwgYnl0ZXNDb3VudCk7CisgICAgICAgICAgICB4IC09IGxlbmd0aCAvIDIuMGY7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBTa1BhaW50OjprUmlnaHRfQWxpZ246CisgICAgICAgICAgICBsZW5ndGggPSBwYWludC0+bWVhc3VyZVRleHQodGV4dCwgYnl0ZXNDb3VudCk7CisgICAgICAgICAgICB4IC09IGxlbmd0aDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgaW50IGFscGhhOworICAgIFNrWGZlcm1vZGU6Ok1vZGUgbW9kZTsKKyAgICBnZXRBbHBoYUFuZE1vZGUocGFpbnQsICZhbHBoYSwgJm1vZGUpOworCisgICAgdWludDMyX3QgY29sb3IgPSBwYWludC0+Z2V0Q29sb3IoKTsKKyAgICBjb25zdCBHTGZsb2F0IGEgPSBhbHBoYSAvIDI1NS4wZjsKKyAgICBjb25zdCBHTGZsb2F0IHIgPSBhICogKChjb2xvciA+PiAxNikgJiAweEZGKSAvIDI1NS4wZjsKKyAgICBjb25zdCBHTGZsb2F0IGcgPSBhICogKChjb2xvciA+PiAgOCkgJiAweEZGKSAvIDI1NS4wZjsKKyAgICBjb25zdCBHTGZsb2F0IGIgPSBhICogKChjb2xvciAgICAgICkgJiAweEZGKSAvIDI1NS4wZjsKKworICAgIEZvbnRSZW5kZXJlciYgZm9udFJlbmRlcmVyID0gbUNhY2hlcy5mb250UmVuZGVyZXIuZ2V0Rm9udFJlbmRlcmVyKHBhaW50KTsKKyAgICBmb250UmVuZGVyZXIuc2V0Rm9udChwYWludCwgU2tUeXBlZmFjZTo6VW5pcXVlSUQocGFpbnQtPmdldFR5cGVmYWNlKCkpLAorICAgICAgICAgICAgcGFpbnQtPmdldFRleHRTaXplKCkpOworICAgIGlmIChtSGFzU2hhZG93KSB7CisgICAgICAgIGdsQWN0aXZlVGV4dHVyZShnVGV4dHVyZVVuaXRzWzBdKTsKKyAgICAgICAgbUNhY2hlcy5kcm9wU2hhZG93Q2FjaGUuc2V0Rm9udFJlbmRlcmVyKGZvbnRSZW5kZXJlcik7CisgICAgICAgIGNvbnN0IFNoYWRvd1RleHR1cmUqIHNoYWRvdyA9IG1DYWNoZXMuZHJvcFNoYWRvd0NhY2hlLmdldChwYWludCwgdGV4dCwgYnl0ZXNDb3VudCwKKyAgICAgICAgICAgICAgICBjb3VudCwgbVNoYWRvd1JhZGl1cyk7CisgICAgICAgIGNvbnN0IEF1dG9UZXh0dXJlIGF1dG9DbGVhbnVwKHNoYWRvdyk7CisKKyAgICAgICAgc2V0dXBTaGFkb3coc2hhZG93LCB4LCB5LCBtb2RlLCBhKTsKKworICAgICAgICAvLyBEcmF3IHRoZSBtZXNoCisgICAgICAgIGdsRHJhd0FycmF5cyhHTF9UUklBTkdMRV9TVFJJUCwgMCwgZ01lc2hDb3VudCk7CisgICAgICAgIGdsRGlzYWJsZVZlcnRleEF0dHJpYkFycmF5KG1DYWNoZXMuY3VycmVudFByb2dyYW0tPmdldEF0dHJpYigidGV4Q29vcmRzIikpOworICAgIH0KKworICAgIEdMdWludCB0ZXh0dXJlVW5pdCA9IDA7CisgICAgZ2xBY3RpdmVUZXh0dXJlKGdUZXh0dXJlVW5pdHNbdGV4dHVyZVVuaXRdKTsKKworICAgIHNldHVwVGV4dHVyZUFscGhhOChmb250UmVuZGVyZXIuZ2V0VGV4dHVyZSgpLCAwLCAwLCB0ZXh0dXJlVW5pdCwgeCwgeSwgciwgZywgYiwgYSwKKyAgICAgICAgICAgIG1vZGUsIGZhbHNlLCB0cnVlKTsKKworICAgIGNvbnN0IFJlY3QmIGNsaXAgPSBtU25hcHNob3QtPmdldExvY2FsQ2xpcCgpOworICAgIGNsZWFyTGF5ZXJSZWdpb25zKCk7CisgICAgZm9udFJlbmRlcmVyLnJlbmRlclRleHQocGFpbnQsICZjbGlwLCB0ZXh0LCAwLCBieXRlc0NvdW50LCBjb3VudCwgeCwgeSk7CisKKyAgICBnbEJpbmRCdWZmZXIoR0xfRUxFTUVOVF9BUlJBWV9CVUZGRVIsIDApOworICAgIGdsRGlzYWJsZVZlcnRleEF0dHJpYkFycmF5KG1DYWNoZXMuY3VycmVudFByb2dyYW0tPmdldEF0dHJpYigidGV4Q29vcmRzIikpOworCisgICAgZHJhd1RleHREZWNvcmF0aW9ucyh0ZXh0LCBieXRlc0NvdW50LCBsZW5ndGgsIHgsIHksIHBhaW50KTsKK30KKwordm9pZCBPcGVuR0xSZW5kZXJlcjo6ZHJhd1BhdGgoU2tQYXRoKiBwYXRoLCBTa1BhaW50KiBwYWludCkgeworICAgIEdMdWludCB0ZXh0dXJlVW5pdCA9IDA7CisgICAgZ2xBY3RpdmVUZXh0dXJlKGdUZXh0dXJlVW5pdHNbdGV4dHVyZVVuaXRdKTsKKworICAgIGNvbnN0IFBhdGhUZXh0dXJlKiB0ZXh0dXJlID0gbUNhY2hlcy5wYXRoQ2FjaGUuZ2V0KHBhdGgsIHBhaW50KTsKKyAgICBpZiAoIXRleHR1cmUpIHJldHVybjsKKyAgICBjb25zdCBBdXRvVGV4dHVyZSBhdXRvQ2xlYW51cCh0ZXh0dXJlKTsKKworICAgIGNvbnN0IGZsb2F0IHggPSB0ZXh0dXJlLT5sZWZ0IC0gdGV4dHVyZS0+b2Zmc2V0OworICAgIGNvbnN0IGZsb2F0IHkgPSB0ZXh0dXJlLT50b3AgLSB0ZXh0dXJlLT5vZmZzZXQ7CisKKyAgICBpZiAocXVpY2tSZWplY3QoeCwgeSwgeCArIHRleHR1cmUtPndpZHRoLCB5ICsgdGV4dHVyZS0+aGVpZ2h0KSkgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaW50IGFscGhhOworICAgIFNrWGZlcm1vZGU6Ok1vZGUgbW9kZTsKKyAgICBnZXRBbHBoYUFuZE1vZGUocGFpbnQsICZhbHBoYSwgJm1vZGUpOworCisgICAgdWludDMyX3QgY29sb3IgPSBwYWludC0+Z2V0Q29sb3IoKTsKKyAgICBjb25zdCBHTGZsb2F0IGEgPSBhbHBoYSAvIDI1NS4wZjsKKyAgICBjb25zdCBHTGZsb2F0IHIgPSBhICogKChjb2xvciA+PiAxNikgJiAweEZGKSAvIDI1NS4wZjsKKyAgICBjb25zdCBHTGZsb2F0IGcgPSBhICogKChjb2xvciA+PiAgOCkgJiAweEZGKSAvIDI1NS4wZjsKKyAgICBjb25zdCBHTGZsb2F0IGIgPSBhICogKChjb2xvciAgICAgICkgJiAweEZGKSAvIDI1NS4wZjsKKworICAgIHNldHVwVGV4dHVyZUFscGhhOCh0ZXh0dXJlLCB0ZXh0dXJlVW5pdCwgeCwgeSwgciwgZywgYiwgYSwgbW9kZSwgdHJ1ZSwgdHJ1ZSk7CisKKyAgICBjbGVhckxheWVyUmVnaW9ucygpOworCisgICAgLy8gRHJhdyB0aGUgbWVzaAorICAgIGdsRHJhd0FycmF5cyhHTF9UUklBTkdMRV9TVFJJUCwgMCwgZ01lc2hDb3VudCk7CisgICAgZ2xEaXNhYmxlVmVydGV4QXR0cmliQXJyYXkobUNhY2hlcy5jdXJyZW50UHJvZ3JhbS0+Z2V0QXR0cmliKCJ0ZXhDb29yZHMiKSk7Cit9CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIFNoYWRlcnMKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwordm9pZCBPcGVuR0xSZW5kZXJlcjo6cmVzZXRTaGFkZXIoKSB7CisgICAgbVNoYWRlciA9IE5VTEw7Cit9CisKK3ZvaWQgT3BlbkdMUmVuZGVyZXI6OnNldHVwU2hhZGVyKFNraWFTaGFkZXIqIHNoYWRlcikgeworICAgIG1TaGFkZXIgPSBzaGFkZXI7CisgICAgaWYgKG1TaGFkZXIpIHsKKyAgICAgICAgbVNoYWRlci0+c2V0KCZtQ2FjaGVzLnRleHR1cmVDYWNoZSwgJm1DYWNoZXMuZ3JhZGllbnRDYWNoZSk7CisgICAgfQorfQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBDb2xvciBmaWx0ZXJzCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK3ZvaWQgT3BlbkdMUmVuZGVyZXI6OnJlc2V0Q29sb3JGaWx0ZXIoKSB7CisgICAgbUNvbG9yRmlsdGVyID0gTlVMTDsKK30KKwordm9pZCBPcGVuR0xSZW5kZXJlcjo6c2V0dXBDb2xvckZpbHRlcihTa2lhQ29sb3JGaWx0ZXIqIGZpbHRlcikgeworICAgIG1Db2xvckZpbHRlciA9IGZpbHRlcjsKK30KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gRHJvcCBzaGFkb3cKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwordm9pZCBPcGVuR0xSZW5kZXJlcjo6cmVzZXRTaGFkb3coKSB7CisgICAgbUhhc1NoYWRvdyA9IGZhbHNlOworfQorCit2b2lkIE9wZW5HTFJlbmRlcmVyOjpzZXR1cFNoYWRvdyhmbG9hdCByYWRpdXMsIGZsb2F0IGR4LCBmbG9hdCBkeSwgaW50IGNvbG9yKSB7CisgICAgbUhhc1NoYWRvdyA9IHRydWU7CisgICAgbVNoYWRvd1JhZGl1cyA9IHJhZGl1czsKKyAgICBtU2hhZG93RHggPSBkeDsKKyAgICBtU2hhZG93RHkgPSBkeTsKKyAgICBtU2hhZG93Q29sb3IgPSBjb2xvcjsKK30KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gRHJhd2luZyBpbXBsZW1lbnRhdGlvbgorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCit2b2lkIE9wZW5HTFJlbmRlcmVyOjpzZXR1cFNoYWRvdyhjb25zdCBTaGFkb3dUZXh0dXJlKiB0ZXh0dXJlLCBmbG9hdCB4LCBmbG9hdCB5LAorICAgICAgICBTa1hmZXJtb2RlOjpNb2RlIG1vZGUsIGZsb2F0IGFscGhhKSB7CisgICAgY29uc3QgZmxvYXQgc3ggPSB4IC0gdGV4dHVyZS0+bGVmdCArIG1TaGFkb3dEeDsKKyAgICBjb25zdCBmbG9hdCBzeSA9IHkgLSB0ZXh0dXJlLT50b3AgKyBtU2hhZG93RHk7CisKKyAgICBjb25zdCBpbnQgc2hhZG93QWxwaGEgPSAoKG1TaGFkb3dDb2xvciA+PiAyNCkgJiAweEZGKTsKKyAgICBjb25zdCBHTGZsb2F0IGEgPSBzaGFkb3dBbHBoYSA8IDI1NSA/IHNoYWRvd0FscGhhIC8gMjU1LjBmIDogYWxwaGE7CisgICAgY29uc3QgR0xmbG9hdCByID0gYSAqICgobVNoYWRvd0NvbG9yID4+IDE2KSAmIDB4RkYpIC8gMjU1LjBmOworICAgIGNvbnN0IEdMZmxvYXQgZyA9IGEgKiAoKG1TaGFkb3dDb2xvciA+PiAgOCkgJiAweEZGKSAvIDI1NS4wZjsKKyAgICBjb25zdCBHTGZsb2F0IGIgPSBhICogKChtU2hhZG93Q29sb3IgICAgICApICYgMHhGRikgLyAyNTUuMGY7CisKKyAgICBHTHVpbnQgdGV4dHVyZVVuaXQgPSAwOworICAgIHNldHVwVGV4dHVyZUFscGhhOCh0ZXh0dXJlLCB0ZXh0dXJlVW5pdCwgc3gsIHN5LCByLCBnLCBiLCBhLCBtb2RlLCB0cnVlLCBmYWxzZSk7Cit9CisKK3ZvaWQgT3BlbkdMUmVuZGVyZXI6OnNldHVwVGV4dHVyZUFscGhhOChjb25zdCBUZXh0dXJlKiB0ZXh0dXJlLCBHTHVpbnQmIHRleHR1cmVVbml0LAorICAgICAgICBmbG9hdCB4LCBmbG9hdCB5LCBmbG9hdCByLCBmbG9hdCBnLCBmbG9hdCBiLCBmbG9hdCBhLCBTa1hmZXJtb2RlOjpNb2RlIG1vZGUsCisgICAgICAgIGJvb2wgdHJhbnNmb3JtcywgYm9vbCBhcHBseUZpbHRlcnMpIHsKKyAgICBzZXR1cFRleHR1cmVBbHBoYTgodGV4dHVyZS0+aWQsIHRleHR1cmUtPndpZHRoLCB0ZXh0dXJlLT5oZWlnaHQsIHRleHR1cmVVbml0LAorICAgICAgICAgICAgeCwgeSwgciwgZywgYiwgYSwgbW9kZSwgdHJhbnNmb3JtcywgYXBwbHlGaWx0ZXJzKTsKK30KKwordm9pZCBPcGVuR0xSZW5kZXJlcjo6c2V0dXBUZXh0dXJlQWxwaGE4KEdMdWludCB0ZXh0dXJlLCB1aW50MzJfdCB3aWR0aCwgdWludDMyX3QgaGVpZ2h0LAorICAgICAgICBHTHVpbnQmIHRleHR1cmVVbml0LCBmbG9hdCB4LCBmbG9hdCB5LCBmbG9hdCByLCBmbG9hdCBnLCBmbG9hdCBiLCBmbG9hdCBhLAorICAgICAgICBTa1hmZXJtb2RlOjpNb2RlIG1vZGUsIGJvb2wgdHJhbnNmb3JtcywgYm9vbCBhcHBseUZpbHRlcnMpIHsKKyAgICAgLy8gRGVzY3JpYmUgdGhlIHJlcXVpcmVkIHNoYWRlcnMKKyAgICAgUHJvZ3JhbURlc2NyaXB0aW9uIGRlc2NyaXB0aW9uOworICAgICBkZXNjcmlwdGlvbi5oYXNUZXh0dXJlID0gdHJ1ZTsKKyAgICAgZGVzY3JpcHRpb24uaGFzQWxwaGE4VGV4dHVyZSA9IHRydWU7CisKKyAgICAgaWYgKGFwcGx5RmlsdGVycykgeworICAgICAgICAgaWYgKG1TaGFkZXIpIHsKKyAgICAgICAgICAgICBtU2hhZGVyLT5kZXNjcmliZShkZXNjcmlwdGlvbiwgbUV4dGVuc2lvbnMpOworICAgICAgICAgfQorICAgICAgICAgaWYgKG1Db2xvckZpbHRlcikgeworICAgICAgICAgICAgIG1Db2xvckZpbHRlci0+ZGVzY3JpYmUoZGVzY3JpcHRpb24sIG1FeHRlbnNpb25zKTsKKyAgICAgICAgIH0KKyAgICAgfQorCisgICAgIC8vIFNldHVwIHRoZSBibGVuZGluZyBtb2RlCisgICAgIGNob29zZUJsZW5kaW5nKHRydWUsIG1vZGUsIGRlc2NyaXB0aW9uKTsKKworICAgICAvLyBCdWlsZCBhbmQgdXNlIHRoZSBhcHByb3ByaWF0ZSBzaGFkZXIKKyAgICAgdXNlUHJvZ3JhbShtQ2FjaGVzLnByb2dyYW1DYWNoZS5nZXQoZGVzY3JpcHRpb24pKTsKKworICAgICBiaW5kVGV4dHVyZSh0ZXh0dXJlLCBHTF9DTEFNUF9UT19FREdFLCBHTF9DTEFNUF9UT19FREdFLCB0ZXh0dXJlVW5pdCk7CisgICAgIGdsVW5pZm9ybTFpKG1DYWNoZXMuY3VycmVudFByb2dyYW0tPmdldFVuaWZvcm0oInNhbXBsZXIiKSwgdGV4dHVyZVVuaXQpOworCisgICAgIGludCB0ZXhDb29yZHNTbG90ID0gbUNhY2hlcy5jdXJyZW50UHJvZ3JhbS0+Z2V0QXR0cmliKCJ0ZXhDb29yZHMiKTsKKyAgICAgZ2xFbmFibGVWZXJ0ZXhBdHRyaWJBcnJheSh0ZXhDb29yZHNTbG90KTsKKworICAgICAvLyBTZXR1cCBhdHRyaWJ1dGVzCisgICAgIGdsVmVydGV4QXR0cmliUG9pbnRlcihtQ2FjaGVzLmN1cnJlbnRQcm9ncmFtLT5wb3NpdGlvbiwgMiwgR0xfRkxPQVQsIEdMX0ZBTFNFLAorICAgICAgICAgICAgIGdNZXNoU3RyaWRlLCAmbU1lc2hWZXJ0aWNlc1swXS5wb3NpdGlvblswXSk7CisgICAgIGdsVmVydGV4QXR0cmliUG9pbnRlcih0ZXhDb29yZHNTbG90LCAyLCBHTF9GTE9BVCwgR0xfRkFMU0UsCisgICAgICAgICAgICAgZ01lc2hTdHJpZGUsICZtTWVzaFZlcnRpY2VzWzBdLnRleHR1cmVbMF0pOworCisgICAgIC8vIFNldHVwIHVuaWZvcm1zCisgICAgIGlmICh0cmFuc2Zvcm1zKSB7CisgICAgICAgICBtTW9kZWxWaWV3LmxvYWRUcmFuc2xhdGUoeCwgeSwgMC4wZik7CisgICAgICAgICBtTW9kZWxWaWV3LnNjYWxlKHdpZHRoLCBoZWlnaHQsIDEuMGYpOworICAgICB9IGVsc2UgeworICAgICAgICAgbU1vZGVsVmlldy5sb2FkSWRlbnRpdHkoKTsKKyAgICAgfQorICAgICBtQ2FjaGVzLmN1cnJlbnRQcm9ncmFtLT5zZXQobU9ydGhvTWF0cml4LCBtTW9kZWxWaWV3LCAqbVNuYXBzaG90LT50cmFuc2Zvcm0pOworICAgICBnbFVuaWZvcm00ZihtQ2FjaGVzLmN1cnJlbnRQcm9ncmFtLT5jb2xvciwgciwgZywgYiwgYSk7CisKKyAgICAgdGV4dHVyZVVuaXQrKzsKKyAgICAgaWYgKGFwcGx5RmlsdGVycykgeworICAgICAgICAgLy8gU2V0dXAgYXR0cmlidXRlcyBhbmQgdW5pZm9ybXMgcmVxdWlyZWQgYnkgdGhlIHNoYWRlcnMKKyAgICAgICAgIGlmIChtU2hhZGVyKSB7CisgICAgICAgICAgICAgbVNoYWRlci0+c2V0dXBQcm9ncmFtKG1DYWNoZXMuY3VycmVudFByb2dyYW0sIG1Nb2RlbFZpZXcsICptU25hcHNob3QsICZ0ZXh0dXJlVW5pdCk7CisgICAgICAgICB9CisgICAgICAgICBpZiAobUNvbG9yRmlsdGVyKSB7CisgICAgICAgICAgICAgbUNvbG9yRmlsdGVyLT5zZXR1cFByb2dyYW0obUNhY2hlcy5jdXJyZW50UHJvZ3JhbSk7CisgICAgICAgICB9CisgICAgIH0KK30KKworLy8gU2FtZSB2YWx1ZXMgdXNlZCBieSBTa2lhCisjZGVmaW5lIGtTdGRTdHJpa2VUaHJ1X09mZnNldCAgICgtNi4wZiAvIDIxLjBmKQorI2RlZmluZSBrU3RkVW5kZXJsaW5lX09mZnNldCAgICAoMS4wZiAvIDkuMGYpCisjZGVmaW5lIGtTdGRVbmRlcmxpbmVfVGhpY2tuZXNzICgxLjBmIC8gMTguMGYpCisKK3ZvaWQgT3BlbkdMUmVuZGVyZXI6OmRyYXdUZXh0RGVjb3JhdGlvbnMoY29uc3QgY2hhciogdGV4dCwgaW50IGJ5dGVzQ291bnQsIGZsb2F0IGxlbmd0aCwKKyAgICAgICAgZmxvYXQgeCwgZmxvYXQgeSwgU2tQYWludCogcGFpbnQpIHsKKyAgICAvLyBIYW5kbGUgdW5kZXJsaW5lIGFuZCBzdHJpa2UtdGhyb3VnaAorICAgIHVpbnQzMl90IGZsYWdzID0gcGFpbnQtPmdldEZsYWdzKCk7CisgICAgaWYgKGZsYWdzICYgKFNrUGFpbnQ6OmtVbmRlcmxpbmVUZXh0X0ZsYWcgfCBTa1BhaW50OjprU3RyaWtlVGhydVRleHRfRmxhZykpIHsKKyAgICAgICAgZmxvYXQgdW5kZXJsaW5lV2lkdGggPSBsZW5ndGg7CisgICAgICAgIC8vIElmIGxlbmd0aCBpcyA+IDAuMGYsIHdlIGFscmVhZHkgbWVhc3VyZWQgdGhlIHRleHQgZm9yIHRoZSB0ZXh0IGFsaWdubWVudAorICAgICAgICBpZiAobGVuZ3RoIDw9IDAuMGYpIHsKKyAgICAgICAgICAgIHVuZGVybGluZVdpZHRoID0gcGFpbnQtPm1lYXN1cmVUZXh0KHRleHQsIGJ5dGVzQ291bnQpOworICAgICAgICB9CisKKyAgICAgICAgZmxvYXQgb2Zmc2V0WCA9IDA7CisgICAgICAgIHN3aXRjaCAocGFpbnQtPmdldFRleHRBbGlnbigpKSB7CisgICAgICAgICAgICBjYXNlIFNrUGFpbnQ6OmtDZW50ZXJfQWxpZ246CisgICAgICAgICAgICAgICAgb2Zmc2V0WCA9IHVuZGVybGluZVdpZHRoICogMC41ZjsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgU2tQYWludDo6a1JpZ2h0X0FsaWduOgorICAgICAgICAgICAgICAgIG9mZnNldFggPSB1bmRlcmxpbmVXaWR0aDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBpZiAodW5kZXJsaW5lV2lkdGggPiAwLjBmKSB7CisgICAgICAgICAgICBmbG9hdCB0ZXh0U2l6ZSA9IHBhaW50LT5nZXRUZXh0U2l6ZSgpOworICAgICAgICAgICAgZmxvYXQgaGVpZ2h0ID0gdGV4dFNpemUgKiBrU3RkVW5kZXJsaW5lX1RoaWNrbmVzczsKKworICAgICAgICAgICAgZmxvYXQgbGVmdCA9IHggLSBvZmZzZXRYOworICAgICAgICAgICAgZmxvYXQgdG9wID0gMC4wZjsKKyAgICAgICAgICAgIGZsb2F0IHJpZ2h0ID0gbGVmdCArIHVuZGVybGluZVdpZHRoOworICAgICAgICAgICAgZmxvYXQgYm90dG9tID0gMC4wZjsKKworICAgICAgICAgICAgaWYgKGZsYWdzICYgU2tQYWludDo6a1VuZGVybGluZVRleHRfRmxhZykgeworICAgICAgICAgICAgICAgIHRvcCA9IHkgKyB0ZXh0U2l6ZSAqIGtTdGRVbmRlcmxpbmVfT2Zmc2V0OworICAgICAgICAgICAgICAgIGJvdHRvbSA9IHRvcCArIGhlaWdodDsKKyAgICAgICAgICAgICAgICBkcmF3UmVjdChsZWZ0LCB0b3AsIHJpZ2h0LCBib3R0b20sIHBhaW50KTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGZsYWdzICYgU2tQYWludDo6a1N0cmlrZVRocnVUZXh0X0ZsYWcpIHsKKyAgICAgICAgICAgICAgICB0b3AgPSB5ICsgdGV4dFNpemUgKiBrU3RkU3RyaWtlVGhydV9PZmZzZXQ7CisgICAgICAgICAgICAgICAgYm90dG9tID0gdG9wICsgaGVpZ2h0OworICAgICAgICAgICAgICAgIGRyYXdSZWN0KGxlZnQsIHRvcCwgcmlnaHQsIGJvdHRvbSwgcGFpbnQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCit2b2lkIE9wZW5HTFJlbmRlcmVyOjpkcmF3Q29sb3JSZWN0KGZsb2F0IGxlZnQsIGZsb2F0IHRvcCwgZmxvYXQgcmlnaHQsIGZsb2F0IGJvdHRvbSwKKyAgICAgICAgaW50IGNvbG9yLCBTa1hmZXJtb2RlOjpNb2RlIG1vZGUsIGJvb2wgaWdub3JlVHJhbnNmb3JtKSB7CisgICAgY2xlYXJMYXllclJlZ2lvbnMoKTsKKworICAgIC8vIElmIGEgc2hhZGVyIGlzIHNldCwgcHJlc2VydmUgb25seSB0aGUgYWxwaGEKKyAgICBpZiAobVNoYWRlcikgeworICAgICAgICBjb2xvciB8PSAweDAwZmZmZmZmOworICAgIH0KKworICAgIC8vIFJlbmRlciB1c2luZyBwcmUtbXVsdGlwbGllZCBhbHBoYQorICAgIGNvbnN0IGludCBhbHBoYSA9IChjb2xvciA+PiAyNCkgJiAweEZGOworICAgIGNvbnN0IEdMZmxvYXQgYSA9IGFscGhhIC8gMjU1LjBmOworICAgIGNvbnN0IEdMZmxvYXQgciA9IGEgKiAoKGNvbG9yID4+IDE2KSAmIDB4RkYpIC8gMjU1LjBmOworICAgIGNvbnN0IEdMZmxvYXQgZyA9IGEgKiAoKGNvbG9yID4+ICA4KSAmIDB4RkYpIC8gMjU1LjBmOworICAgIGNvbnN0IEdMZmxvYXQgYiA9IGEgKiAoKGNvbG9yICAgICAgKSAmIDB4RkYpIC8gMjU1LjBmOworCisgICAgR0x1aW50IHRleHR1cmVVbml0ID0gMDsKKworICAgIC8vIERlc2NyaWJlIHRoZSByZXF1aXJlZCBzaGFkZXJzCisgICAgUHJvZ3JhbURlc2NyaXB0aW9uIGRlc2NyaXB0aW9uOworICAgIGlmIChtU2hhZGVyKSB7CisgICAgICAgIG1TaGFkZXItPmRlc2NyaWJlKGRlc2NyaXB0aW9uLCBtRXh0ZW5zaW9ucyk7CisgICAgfQorICAgIGlmIChtQ29sb3JGaWx0ZXIpIHsKKyAgICAgICAgbUNvbG9yRmlsdGVyLT5kZXNjcmliZShkZXNjcmlwdGlvbiwgbUV4dGVuc2lvbnMpOworICAgIH0KKworICAgIC8vIFNldHVwIHRoZSBibGVuZGluZyBtb2RlCisgICAgY2hvb3NlQmxlbmRpbmcoYWxwaGEgPCAyNTUgfHwgKG1TaGFkZXIgJiYgbVNoYWRlci0+YmxlbmQoKSksIG1vZGUsIGRlc2NyaXB0aW9uKTsKKworICAgIC8vIEJ1aWxkIGFuZCB1c2UgdGhlIGFwcHJvcHJpYXRlIHNoYWRlcgorICAgIHVzZVByb2dyYW0obUNhY2hlcy5wcm9ncmFtQ2FjaGUuZ2V0KGRlc2NyaXB0aW9uKSk7CisKKyAgICAvLyBTZXR1cCBhdHRyaWJ1dGVzCisgICAgZ2xWZXJ0ZXhBdHRyaWJQb2ludGVyKG1DYWNoZXMuY3VycmVudFByb2dyYW0tPnBvc2l0aW9uLCAyLCBHTF9GTE9BVCwgR0xfRkFMU0UsCisgICAgICAgICAgICBnTWVzaFN0cmlkZSwgJm1NZXNoVmVydGljZXNbMF0ucG9zaXRpb25bMF0pOworCisgICAgLy8gU2V0dXAgdW5pZm9ybXMKKyAgICBtTW9kZWxWaWV3LmxvYWRUcmFuc2xhdGUobGVmdCwgdG9wLCAwLjBmKTsKKyAgICBtTW9kZWxWaWV3LnNjYWxlKHJpZ2h0IC0gbGVmdCwgYm90dG9tIC0gdG9wLCAxLjBmKTsKKyAgICBpZiAoIWlnbm9yZVRyYW5zZm9ybSkgeworICAgICAgICBtQ2FjaGVzLmN1cnJlbnRQcm9ncmFtLT5zZXQobU9ydGhvTWF0cml4LCBtTW9kZWxWaWV3LCAqbVNuYXBzaG90LT50cmFuc2Zvcm0pOworICAgIH0gZWxzZSB7CisgICAgICAgIG1hdDQgaWRlbnRpdHk7CisgICAgICAgIG1DYWNoZXMuY3VycmVudFByb2dyYW0tPnNldChtT3J0aG9NYXRyaXgsIG1Nb2RlbFZpZXcsIGlkZW50aXR5KTsKKyAgICB9CisgICAgZ2xVbmlmb3JtNGYobUNhY2hlcy5jdXJyZW50UHJvZ3JhbS0+Y29sb3IsIHIsIGcsIGIsIGEpOworCisgICAgLy8gU2V0dXAgYXR0cmlidXRlcyBhbmQgdW5pZm9ybXMgcmVxdWlyZWQgYnkgdGhlIHNoYWRlcnMKKyAgICBpZiAobVNoYWRlcikgeworICAgICAgICBtU2hhZGVyLT5zZXR1cFByb2dyYW0obUNhY2hlcy5jdXJyZW50UHJvZ3JhbSwgbU1vZGVsVmlldywgKm1TbmFwc2hvdCwgJnRleHR1cmVVbml0KTsKKyAgICB9CisgICAgaWYgKG1Db2xvckZpbHRlcikgeworICAgICAgICBtQ29sb3JGaWx0ZXItPnNldHVwUHJvZ3JhbShtQ2FjaGVzLmN1cnJlbnRQcm9ncmFtKTsKKyAgICB9CisKKyAgICAvLyBEcmF3IHRoZSBtZXNoCisgICAgZ2xEcmF3QXJyYXlzKEdMX1RSSUFOR0xFX1NUUklQLCAwLCBnTWVzaENvdW50KTsKK30KKwordm9pZCBPcGVuR0xSZW5kZXJlcjo6ZHJhd1RleHR1cmVSZWN0KGZsb2F0IGxlZnQsIGZsb2F0IHRvcCwgZmxvYXQgcmlnaHQsIGZsb2F0IGJvdHRvbSwKKyAgICAgICAgY29uc3QgVGV4dHVyZSogdGV4dHVyZSwgY29uc3QgU2tQYWludCogcGFpbnQpIHsKKyAgICBpbnQgYWxwaGE7CisgICAgU2tYZmVybW9kZTo6TW9kZSBtb2RlOworICAgIGdldEFscGhhQW5kTW9kZShwYWludCwgJmFscGhhLCAmbW9kZSk7CisKKyAgICBkcmF3VGV4dHVyZU1lc2gobGVmdCwgdG9wLCByaWdodCwgYm90dG9tLCB0ZXh0dXJlLT5pZCwgYWxwaGEgLyAyNTUuMGYsIG1vZGUsIHRleHR1cmUtPmJsZW5kLAorICAgICAgICAgICAgJm1NZXNoVmVydGljZXNbMF0ucG9zaXRpb25bMF0sICZtTWVzaFZlcnRpY2VzWzBdLnRleHR1cmVbMF0sIE5VTEwpOworfQorCit2b2lkIE9wZW5HTFJlbmRlcmVyOjpkcmF3VGV4dHVyZVJlY3QoZmxvYXQgbGVmdCwgZmxvYXQgdG9wLCBmbG9hdCByaWdodCwgZmxvYXQgYm90dG9tLAorICAgICAgICBHTHVpbnQgdGV4dHVyZSwgZmxvYXQgYWxwaGEsIFNrWGZlcm1vZGU6Ok1vZGUgbW9kZSwgYm9vbCBibGVuZCkgeworICAgIGRyYXdUZXh0dXJlTWVzaChsZWZ0LCB0b3AsIHJpZ2h0LCBib3R0b20sIHRleHR1cmUsIGFscGhhLCBtb2RlLCBibGVuZCwKKyAgICAgICAgICAgICZtTWVzaFZlcnRpY2VzWzBdLnBvc2l0aW9uWzBdLCAmbU1lc2hWZXJ0aWNlc1swXS50ZXh0dXJlWzBdLCBOVUxMKTsKK30KKwordm9pZCBPcGVuR0xSZW5kZXJlcjo6ZHJhd1RleHR1cmVNZXNoKGZsb2F0IGxlZnQsIGZsb2F0IHRvcCwgZmxvYXQgcmlnaHQsIGZsb2F0IGJvdHRvbSwKKyAgICAgICAgR0x1aW50IHRleHR1cmUsIGZsb2F0IGFscGhhLCBTa1hmZXJtb2RlOjpNb2RlIG1vZGUsIGJvb2wgYmxlbmQsCisgICAgICAgIEdMdm9pZCogdmVydGljZXMsIEdMdm9pZCogdGV4Q29vcmRzLCBHTHZvaWQqIGluZGljZXMsIEdMc2l6ZWkgZWxlbWVudHNDb3VudCwKKyAgICAgICAgYm9vbCBzd2FwU3JjRHN0LCBib29sIGlnbm9yZVRyYW5zZm9ybSkgeworICAgIGNsZWFyTGF5ZXJSZWdpb25zKCk7CisKKyAgICBQcm9ncmFtRGVzY3JpcHRpb24gZGVzY3JpcHRpb247CisgICAgZGVzY3JpcHRpb24uaGFzVGV4dHVyZSA9IHRydWU7CisgICAgaWYgKG1Db2xvckZpbHRlcikgeworICAgICAgICBtQ29sb3JGaWx0ZXItPmRlc2NyaWJlKGRlc2NyaXB0aW9uLCBtRXh0ZW5zaW9ucyk7CisgICAgfQorCisgICAgbU1vZGVsVmlldy5sb2FkVHJhbnNsYXRlKGxlZnQsIHRvcCwgMC4wZik7CisgICAgbU1vZGVsVmlldy5zY2FsZShyaWdodCAtIGxlZnQsIGJvdHRvbSAtIHRvcCwgMS4wZik7CisKKyAgICBjaG9vc2VCbGVuZGluZyhibGVuZCB8fCBhbHBoYSA8IDEuMGYsIG1vZGUsIGRlc2NyaXB0aW9uLCBzd2FwU3JjRHN0KTsKKworICAgIHVzZVByb2dyYW0obUNhY2hlcy5wcm9ncmFtQ2FjaGUuZ2V0KGRlc2NyaXB0aW9uKSk7CisgICAgaWYgKCFpZ25vcmVUcmFuc2Zvcm0pIHsKKyAgICAgICAgbUNhY2hlcy5jdXJyZW50UHJvZ3JhbS0+c2V0KG1PcnRob01hdHJpeCwgbU1vZGVsVmlldywgKm1TbmFwc2hvdC0+dHJhbnNmb3JtKTsKKyAgICB9IGVsc2UgeworICAgICAgICBtYXQ0IG07CisgICAgICAgIG1DYWNoZXMuY3VycmVudFByb2dyYW0tPnNldChtT3J0aG9NYXRyaXgsIG1Nb2RlbFZpZXcsIG0pOworICAgIH0KKworICAgIC8vIFRleHR1cmUKKyAgICBiaW5kVGV4dHVyZSh0ZXh0dXJlLCBHTF9DTEFNUF9UT19FREdFLCBHTF9DTEFNUF9UT19FREdFLCAwKTsKKyAgICBnbFVuaWZvcm0xaShtQ2FjaGVzLmN1cnJlbnRQcm9ncmFtLT5nZXRVbmlmb3JtKCJzYW1wbGVyIiksIDApOworCisgICAgLy8gQWx3YXlzIHByZW11bHRpcGxpZWQKKyAgICBnbFVuaWZvcm00ZihtQ2FjaGVzLmN1cnJlbnRQcm9ncmFtLT5jb2xvciwgYWxwaGEsIGFscGhhLCBhbHBoYSwgYWxwaGEpOworCisgICAgLy8gTWVzaAorICAgIGludCB0ZXhDb29yZHNTbG90ID0gbUNhY2hlcy5jdXJyZW50UHJvZ3JhbS0+Z2V0QXR0cmliKCJ0ZXhDb29yZHMiKTsKKyAgICBnbEVuYWJsZVZlcnRleEF0dHJpYkFycmF5KHRleENvb3Jkc1Nsb3QpOworICAgIGdsVmVydGV4QXR0cmliUG9pbnRlcihtQ2FjaGVzLmN1cnJlbnRQcm9ncmFtLT5wb3NpdGlvbiwgMiwgR0xfRkxPQVQsIEdMX0ZBTFNFLAorICAgICAgICAgICAgZ01lc2hTdHJpZGUsIHZlcnRpY2VzKTsKKyAgICBnbFZlcnRleEF0dHJpYlBvaW50ZXIodGV4Q29vcmRzU2xvdCwgMiwgR0xfRkxPQVQsIEdMX0ZBTFNFLCBnTWVzaFN0cmlkZSwgdGV4Q29vcmRzKTsKKworICAgIC8vIENvbG9yIGZpbHRlcgorICAgIGlmIChtQ29sb3JGaWx0ZXIpIHsKKyAgICAgICAgbUNvbG9yRmlsdGVyLT5zZXR1cFByb2dyYW0obUNhY2hlcy5jdXJyZW50UHJvZ3JhbSk7CisgICAgfQorCisgICAgaWYgKCFpbmRpY2VzKSB7CisgICAgICAgIGdsRHJhd0FycmF5cyhHTF9UUklBTkdMRV9TVFJJUCwgMCwgZ01lc2hDb3VudCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZ2xEcmF3RWxlbWVudHMoR0xfVFJJQU5HTEVTLCBlbGVtZW50c0NvdW50LCBHTF9VTlNJR05FRF9TSE9SVCwgaW5kaWNlcyk7CisgICAgfQorICAgIGdsRGlzYWJsZVZlcnRleEF0dHJpYkFycmF5KHRleENvb3Jkc1Nsb3QpOworfQorCit2b2lkIE9wZW5HTFJlbmRlcmVyOjpjaG9vc2VCbGVuZGluZyhib29sIGJsZW5kLCBTa1hmZXJtb2RlOjpNb2RlIG1vZGUsCisgICAgICAgIFByb2dyYW1EZXNjcmlwdGlvbiYgZGVzY3JpcHRpb24sIGJvb2wgc3dhcFNyY0RzdCkgeworICAgIGJsZW5kID0gYmxlbmQgfHwgbW9kZSAhPSBTa1hmZXJtb2RlOjprU3JjT3Zlcl9Nb2RlOworICAgIGlmIChibGVuZCkgeworICAgICAgICBpZiAobW9kZSA8IFNrWGZlcm1vZGU6OmtQbHVzX01vZGUpIHsKKyAgICAgICAgICAgIGlmICghbUNhY2hlcy5ibGVuZCkgeworICAgICAgICAgICAgICAgIGdsRW5hYmxlKEdMX0JMRU5EKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgR0xlbnVtIHNvdXJjZU1vZGUgPSBzd2FwU3JjRHN0ID8gZ0JsZW5kc1N3YXBbbW9kZV0uc3JjIDogZ0JsZW5kc1ttb2RlXS5zcmM7CisgICAgICAgICAgICBHTGVudW0gZGVzdE1vZGUgPSBzd2FwU3JjRHN0ID8gZ0JsZW5kc1N3YXBbbW9kZV0uZHN0IDogZ0JsZW5kc1ttb2RlXS5kc3Q7CisKKyAgICAgICAgICAgIGlmIChzb3VyY2VNb2RlICE9IG1DYWNoZXMubGFzdFNyY01vZGUgfHwgZGVzdE1vZGUgIT0gbUNhY2hlcy5sYXN0RHN0TW9kZSkgeworICAgICAgICAgICAgICAgIGdsQmxlbmRGdW5jKHNvdXJjZU1vZGUsIGRlc3RNb2RlKTsKKyAgICAgICAgICAgICAgICBtQ2FjaGVzLmxhc3RTcmNNb2RlID0gc291cmNlTW9kZTsKKyAgICAgICAgICAgICAgICBtQ2FjaGVzLmxhc3REc3RNb2RlID0gZGVzdE1vZGU7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBUaGVzZSBibGVuZCBtb2RlcyBhcmUgbm90IHN1cHBvcnRlZCBieSBPcGVuR0wgZGlyZWN0bHkgYW5kIGhhdmUKKyAgICAgICAgICAgIC8vIHRvIGJlIGltcGxlbWVudGVkIHVzaW5nIHNoYWRlcnMuIFNpbmNlIHRoZSBzaGFkZXIgd2lsbCBwZXJmb3JtCisgICAgICAgICAgICAvLyB0aGUgYmxlbmRpbmcsIHR1cm4gYmxlbmRpbmcgb2ZmIGhlcmUKKyAgICAgICAgICAgIGlmIChtRXh0ZW5zaW9ucy5oYXNGcmFtZWJ1ZmZlckZldGNoKCkpIHsKKyAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbi5mcmFtZWJ1ZmZlck1vZGUgPSBtb2RlOworICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uLnN3YXBTcmNEc3QgPSBzd2FwU3JjRHN0OworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAobUNhY2hlcy5ibGVuZCkgeworICAgICAgICAgICAgICAgIGdsRGlzYWJsZShHTF9CTEVORCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBibGVuZCA9IGZhbHNlOworICAgICAgICB9CisgICAgfSBlbHNlIGlmIChtQ2FjaGVzLmJsZW5kKSB7CisgICAgICAgIGdsRGlzYWJsZShHTF9CTEVORCk7CisgICAgfQorICAgIG1DYWNoZXMuYmxlbmQgPSBibGVuZDsKK30KKworYm9vbCBPcGVuR0xSZW5kZXJlcjo6dXNlUHJvZ3JhbShQcm9ncmFtKiBwcm9ncmFtKSB7CisgICAgaWYgKCFwcm9ncmFtLT5pc0luVXNlKCkpIHsKKyAgICAgICAgaWYgKG1DYWNoZXMuY3VycmVudFByb2dyYW0gIT0gTlVMTCkgbUNhY2hlcy5jdXJyZW50UHJvZ3JhbS0+cmVtb3ZlKCk7CisgICAgICAgIHByb2dyYW0tPnVzZSgpOworICAgICAgICBtQ2FjaGVzLmN1cnJlbnRQcm9ncmFtID0gcHJvZ3JhbTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBPcGVuR0xSZW5kZXJlcjo6cmVzZXREcmF3VGV4dHVyZVRleENvb3JkcyhmbG9hdCB1MSwgZmxvYXQgdjEsIGZsb2F0IHUyLCBmbG9hdCB2MikgeworICAgIFRleHR1cmVWZXJ0ZXgqIHYgPSAmbU1lc2hWZXJ0aWNlc1swXTsKKyAgICBUZXh0dXJlVmVydGV4OjpzZXRVVih2KyssIHUxLCB2MSk7CisgICAgVGV4dHVyZVZlcnRleDo6c2V0VVYodisrLCB1MiwgdjEpOworICAgIFRleHR1cmVWZXJ0ZXg6OnNldFVWKHYrKywgdTEsIHYyKTsKKyAgICBUZXh0dXJlVmVydGV4OjpzZXRVVih2KyssIHUyLCB2Mik7Cit9CisKK3ZvaWQgT3BlbkdMUmVuZGVyZXI6OmdldEFscGhhQW5kTW9kZShjb25zdCBTa1BhaW50KiBwYWludCwgaW50KiBhbHBoYSwgU2tYZmVybW9kZTo6TW9kZSogbW9kZSkgeworICAgIGlmIChwYWludCkgeworICAgICAgICBpZiAoIW1FeHRlbnNpb25zLmhhc0ZyYW1lYnVmZmVyRmV0Y2goKSkgeworICAgICAgICAgICAgY29uc3QgYm9vbCBpc01vZGUgPSBTa1hmZXJtb2RlOjpJc01vZGUocGFpbnQtPmdldFhmZXJtb2RlKCksIG1vZGUpOworICAgICAgICAgICAgaWYgKCFpc01vZGUpIHsKKyAgICAgICAgICAgICAgICAvLyBBc3N1bWUgU1JDX09WRVIKKyAgICAgICAgICAgICAgICAqbW9kZSA9IFNrWGZlcm1vZGU6OmtTcmNPdmVyX01vZGU7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAqbW9kZSA9IGdldFhmZXJtb2RlKHBhaW50LT5nZXRYZmVybW9kZSgpKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFNraWEgZHJhd3MgdXNpbmcgdGhlIGNvbG9yJ3MgYWxwaGEgY2hhbm5lbCBpZiA8IDI1NQorICAgICAgICAvLyBPdGhlcndpc2UsIGl0IHVzZXMgdGhlIHBhaW50J3MgYWxwaGEKKyAgICAgICAgaW50IGNvbG9yID0gcGFpbnQtPmdldENvbG9yKCk7CisgICAgICAgICphbHBoYSA9IChjb2xvciA+PiAyNCkgJiAweEZGOworICAgICAgICBpZiAoKmFscGhhID09IDI1NSkgeworICAgICAgICAgICAgKmFscGhhID0gcGFpbnQtPmdldEFscGhhKCk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICAqbW9kZSA9IFNrWGZlcm1vZGU6OmtTcmNPdmVyX01vZGU7CisgICAgICAgICphbHBoYSA9IDI1NTsKKyAgICB9Cit9CisKK1NrWGZlcm1vZGU6Ok1vZGUgT3BlbkdMUmVuZGVyZXI6OmdldFhmZXJtb2RlKFNrWGZlcm1vZGUqIG1vZGUpIHsKKyAgICBpZiAobW9kZSA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBTa1hmZXJtb2RlOjprU3JjT3Zlcl9Nb2RlOworICAgIH0KKyAgICByZXR1cm4gbW9kZS0+Zk1vZGU7Cit9CisKK3ZvaWQgT3BlbkdMUmVuZGVyZXI6OmJpbmRUZXh0dXJlKEdMdWludCB0ZXh0dXJlLCBHTGVudW0gd3JhcFMsIEdMZW51bSB3cmFwVCwgR0x1aW50IHRleHR1cmVVbml0KSB7CisgICAgZ2xBY3RpdmVUZXh0dXJlKGdUZXh0dXJlVW5pdHNbdGV4dHVyZVVuaXRdKTsKKyAgICBnbEJpbmRUZXh0dXJlKEdMX1RFWFRVUkVfMkQsIHRleHR1cmUpOworICAgIGdsVGV4UGFyYW1ldGVyaShHTF9URVhUVVJFXzJELCBHTF9URVhUVVJFX1dSQVBfUywgd3JhcFMpOworICAgIGdsVGV4UGFyYW1ldGVyaShHTF9URVhUVVJFXzJELCBHTF9URVhUVVJFX1dSQVBfVCwgd3JhcFQpOworfQorCit9OyAvLyBuYW1lc3BhY2UgdWlyZW5kZXJlcgorfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2xpYnMvaHd1aS9PcGVuR0xSZW5kZXJlci5oIGIvbGlicy9od3VpL09wZW5HTFJlbmRlcmVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzEyNjc1NAotLS0gL2Rldi9udWxsCisrKyBiL2xpYnMvaHd1aS9PcGVuR0xSZW5kZXJlci5oCkBAIC0wLDAgKzEsNDAzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX1VJX09QRU5HTF9SRU5ERVJFUl9ICisjZGVmaW5lIEFORFJPSURfVUlfT1BFTkdMX1JFTkRFUkVSX0gKKworI2luY2x1ZGUgPEdMRVMyL2dsMi5oPgorI2luY2x1ZGUgPEdMRVMyL2dsMmV4dC5oPgorCisjaW5jbHVkZSA8U2tCaXRtYXAuaD4KKyNpbmNsdWRlIDxTa01hdHJpeC5oPgorI2luY2x1ZGUgPFNrUGFpbnQuaD4KKyNpbmNsdWRlIDxTa1JlZ2lvbi5oPgorI2luY2x1ZGUgPFNrU2hhZGVyLmg+CisjaW5jbHVkZSA8U2tYZmVybW9kZS5oPgorCisjaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgorI2luY2x1ZGUgPHV0aWxzL1Jlc291cmNlVHlwZXMuaD4KKyNpbmNsdWRlIDx1dGlscy9WZWN0b3IuaD4KKworI2luY2x1ZGUgIkV4dGVuc2lvbnMuaCIKKyNpbmNsdWRlICJNYXRyaXguaCIKKyNpbmNsdWRlICJQcm9ncmFtLmgiCisjaW5jbHVkZSAiUmVjdC5oIgorI2luY2x1ZGUgIlNuYXBzaG90LmgiCisjaW5jbHVkZSAiVmVydGV4LmgiCisjaW5jbHVkZSAiU2tpYVNoYWRlci5oIgorI2luY2x1ZGUgIlNraWFDb2xvckZpbHRlci5oIgorI2luY2x1ZGUgIkNhY2hlcy5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgdWlyZW5kZXJlciB7CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIFJlbmRlcmVyCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKy8qKgorICogT3BlbkdMIHJlbmRlcmVyIHVzZWQgdG8gZHJhdyBhY2NlbGVyYXRlZCAyRCBncmFwaGljcy4gVGhlIEFQSSBpcyBhCisgKiBzaW1wbGlmaWVkIHZlcnNpb24gb2YgU2tpYSdzIENhbnZhcyBBUEkuCisgKi8KK2NsYXNzIE9wZW5HTFJlbmRlcmVyIHsKK3B1YmxpYzoKKyAgICBPcGVuR0xSZW5kZXJlcigpOworICAgIH5PcGVuR0xSZW5kZXJlcigpOworCisgICAgdm9pZCBzZXRWaWV3cG9ydChpbnQgd2lkdGgsIGludCBoZWlnaHQpOworICAgIHZvaWQgcHJlcGFyZSgpOworICAgIHZvaWQgYWNxdWlyZUNvbnRleHQoKTsKKyAgICB2b2lkIHJlbGVhc2VDb250ZXh0KCk7CisKKyAgICBpbnQgZ2V0U2F2ZUNvdW50KCkgY29uc3Q7CisgICAgaW50IHNhdmUoaW50IGZsYWdzKTsKKyAgICB2b2lkIHJlc3RvcmUoKTsKKyAgICB2b2lkIHJlc3RvcmVUb0NvdW50KGludCBzYXZlQ291bnQpOworCisgICAgaW50IHNhdmVMYXllcihmbG9hdCBsZWZ0LCBmbG9hdCB0b3AsIGZsb2F0IHJpZ2h0LCBmbG9hdCBib3R0b20sIGNvbnN0IFNrUGFpbnQqIHAsIGludCBmbGFncyk7CisgICAgaW50IHNhdmVMYXllckFscGhhKGZsb2F0IGxlZnQsIGZsb2F0IHRvcCwgZmxvYXQgcmlnaHQsIGZsb2F0IGJvdHRvbSwgaW50IGFscGhhLCBpbnQgZmxhZ3MpOworCisgICAgdm9pZCB0cmFuc2xhdGUoZmxvYXQgZHgsIGZsb2F0IGR5KTsKKyAgICB2b2lkIHJvdGF0ZShmbG9hdCBkZWdyZWVzKTsKKyAgICB2b2lkIHNjYWxlKGZsb2F0IHN4LCBmbG9hdCBzeSk7CisKKyAgICB2b2lkIHNldE1hdHJpeChTa01hdHJpeCogbWF0cml4KTsKKyAgICB2b2lkIGdldE1hdHJpeChTa01hdHJpeCogbWF0cml4KTsKKyAgICB2b2lkIGNvbmNhdE1hdHJpeChTa01hdHJpeCogbWF0cml4KTsKKworICAgIGNvbnN0IFJlY3QmIGdldENsaXBCb3VuZHMoKTsKKyAgICBib29sIHF1aWNrUmVqZWN0KGZsb2F0IGxlZnQsIGZsb2F0IHRvcCwgZmxvYXQgcmlnaHQsIGZsb2F0IGJvdHRvbSk7CisgICAgYm9vbCBjbGlwUmVjdChmbG9hdCBsZWZ0LCBmbG9hdCB0b3AsIGZsb2F0IHJpZ2h0LCBmbG9hdCBib3R0b20sIFNrUmVnaW9uOjpPcCBvcCk7CisKKyAgICB2b2lkIGRyYXdCaXRtYXAoU2tCaXRtYXAqIGJpdG1hcCwgZmxvYXQgbGVmdCwgZmxvYXQgdG9wLCBjb25zdCBTa1BhaW50KiBwYWludCk7CisgICAgdm9pZCBkcmF3Qml0bWFwKFNrQml0bWFwKiBiaXRtYXAsIGNvbnN0IFNrTWF0cml4KiBtYXRyaXgsIGNvbnN0IFNrUGFpbnQqIHBhaW50KTsKKyAgICB2b2lkIGRyYXdCaXRtYXAoU2tCaXRtYXAqIGJpdG1hcCwgZmxvYXQgc3JjTGVmdCwgZmxvYXQgc3JjVG9wLCBmbG9hdCBzcmNSaWdodCwgZmxvYXQgc3JjQm90dG9tLAorICAgICAgICAgICAgZmxvYXQgZHN0TGVmdCwgZmxvYXQgZHN0VG9wLCBmbG9hdCBkc3RSaWdodCwgZmxvYXQgZHN0Qm90dG9tLCBjb25zdCBTa1BhaW50KiBwYWludCk7CisgICAgdm9pZCBkcmF3UGF0Y2goU2tCaXRtYXAqIGJpdG1hcCwgUmVzX3BuZ185cGF0Y2gqIHBhdGNoLCBmbG9hdCBsZWZ0LCBmbG9hdCB0b3AsCisgICAgICAgICAgICBmbG9hdCByaWdodCwgZmxvYXQgYm90dG9tLCBjb25zdCBTa1BhaW50KiBwYWludCk7CisgICAgdm9pZCBkcmF3Q29sb3IoaW50IGNvbG9yLCBTa1hmZXJtb2RlOjpNb2RlIG1vZGUpOworICAgIHZvaWQgZHJhd1JlY3QoZmxvYXQgbGVmdCwgZmxvYXQgdG9wLCBmbG9hdCByaWdodCwgZmxvYXQgYm90dG9tLCBjb25zdCBTa1BhaW50KiBwYWludCk7CisgICAgdm9pZCBkcmF3UGF0aChTa1BhdGgqIHBhdGgsIFNrUGFpbnQqIHBhaW50KTsKKworICAgIHZvaWQgcmVzZXRTaGFkZXIoKTsKKyAgICB2b2lkIHNldHVwU2hhZGVyKFNraWFTaGFkZXIqIHNoYWRlcik7CisKKyAgICB2b2lkIHJlc2V0Q29sb3JGaWx0ZXIoKTsKKyAgICB2b2lkIHNldHVwQ29sb3JGaWx0ZXIoU2tpYUNvbG9yRmlsdGVyKiBmaWx0ZXIpOworCisgICAgdm9pZCByZXNldFNoYWRvdygpOworICAgIHZvaWQgc2V0dXBTaGFkb3coZmxvYXQgcmFkaXVzLCBmbG9hdCBkeCwgZmxvYXQgZHksIGludCBjb2xvcik7CisKKyAgICB2b2lkIGRyYXdUZXh0KGNvbnN0IGNoYXIqIHRleHQsIGludCBieXRlc0NvdW50LCBpbnQgY291bnQsIGZsb2F0IHgsIGZsb2F0IHksIFNrUGFpbnQqIHBhaW50KTsKKworcHJpdmF0ZToKKyAgICAvKioKKyAgICAgKiBTYXZlcyB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgcmVuZGVyZXIgYXMgYSBuZXcgc25hcHNob3QuCisgICAgICogVGhlIG5ldyBzbmFwc2hvdCBpcyBzYXZlZCBpbiBtU25hcHNob3QgYW5kIHRoZSBwcmV2aW91cyBzbmFwc2hvdAorICAgICAqIGlzIGxpbmtlZCBmcm9tIG1TbmFwc2hvdC0+cHJldmlvdXMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZmxhZ3MgVGhlIHNhdmUgZmxhZ3M7IHNlZSBTa0NhbnZhcyBmb3IgbW9yZSBpbmZvcm1hdGlvbgorICAgICAqCisgICAgICogQHJldHVybiBUaGUgbmV3IHNhdmUgY291bnQuIFRoaXMgdmFsdWUgY2FuIGJlIHBhc3NlZCB0byAjcmVzdG9yZVRvQ291bnQoKQorICAgICAqLworICAgIGludCBzYXZlU25hcHNob3QoaW50IGZsYWdzKTsKKworICAgIC8qKgorICAgICAqIFJlc3RvcmVzIHRoZSBjdXJyZW50IHNuYXBzaG90OyBtU25hcHNob3QgYmVjb21lcyBtU25hcHNob3QtPnByZXZpb3VzLgorICAgICAqCisgICAgICogQHJldHVybiBUcnVlIGlmIHRoZSBjbGlwIHdhcyBtb2RpZmllZC4KKyAgICAgKi8KKyAgICBib29sIHJlc3RvcmVTbmFwc2hvdCgpOworCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgY2xpcHBpbmcgcmVjdGFuZ2xlIHVzaW5nIGdsU2Npc3Nvci4gVGhlIGNsaXAgaXMgZGVmaW5lZCBieQorICAgICAqIHRoZSBjdXJyZW50IHNuYXBzaG90J3MgY2xpcFJlY3QgbWVtYmVyLgorICAgICAqLworICAgIHZvaWQgc2V0U2Npc3NvckZyb21DbGlwKCk7CisKKyAgICAvKioKKyAgICAgKiBDb21wb3NlIHRoZSBsYXllciBkZWZpbmVkIGluIHRoZSBjdXJyZW50IHNuYXBzaG90IHdpdGggdGhlIGxheWVyCisgICAgICogZGVmaW5lZCBieSB0aGUgcHJldmlvdXMgc25hcHNob3QuCisgICAgICoKKyAgICAgKiBUaGUgY3VycmVudCBzbmFwc2hvdCAqbXVzdCogYmUgYSBsYXllciAoZmxhZyBrRmxhZ0lzTGF5ZXIgc2V0LikKKyAgICAgKgorICAgICAqIEBwYXJhbSBjdXJlbnQgVGhlIGN1cnJlbnQgc25hcHNob3QgY29udGFpbmluZyB0aGUgbGF5ZXIgdG8gY29tcG9zZQorICAgICAqIEBwYXJhbSBwcmV2aW91cyBUaGUgcHJldmlvdXMgc25hcHNob3QgdG8gY29tcG9zZSB0aGUgY3VycmVudCBsYXllciB3aXRoCisgICAgICovCisgICAgdm9pZCBjb21wb3NlTGF5ZXIoc3A8U25hcHNob3Q+IGN1cnJlbnQsIHNwPFNuYXBzaG90PiBwcmV2aW91cyk7CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgbmV3IGxheWVyIHN0b3JlZCBpbiB0aGUgc3BlY2lmaWVkIHNuYXBzaG90LgorICAgICAqCisgICAgICogQHBhcmFtIHNuYXBzaG90IFRoZSBzbmFwc2hvdCBhc3NvY2lhdGVkIHdpdGggdGhlIG5ldyBsYXllcgorICAgICAqIEBwYXJhbSBsZWZ0IFRoZSBsZWZ0IGNvb3JkaW5hdGUgb2YgdGhlIGxheWVyCisgICAgICogQHBhcmFtIHRvcCBUaGUgdG9wIGNvb3JkaW5hdGUgb2YgdGhlIGxheWVyCisgICAgICogQHBhcmFtIHJpZ2h0IFRoZSByaWdodCBjb29yZGluYXRlIG9mIHRoZSBsYXllcgorICAgICAqIEBwYXJhbSBib3R0b20gVGhlIGJvdHRvbSBjb29yZGluYXRlIG9mIHRoZSBsYXllcgorICAgICAqIEBwYXJhbSBhbHBoYSBUaGUgdHJhbnNsdWNlbmN5IG9mIHRoZSBsYXllcgorICAgICAqIEBwYXJhbSBtb2RlIFRoZSBibGVuZGluZyBtb2RlIG9mIHRoZSBsYXllcgorICAgICAqIEBwYXJhbSBmbGFncyBUaGUgbGF5ZXIgc2F2ZSBmbGFncworICAgICAqCisgICAgICogQHJldHVybiBUcnVlIGlmIHRoZSBsYXllciB3YXMgc3VjY2Vzc2Z1bGx5IGNyZWF0ZWQsIGZhbHNlIG90aGVyd2lzZQorICAgICAqLworICAgIGJvb2wgY3JlYXRlTGF5ZXIoc3A8U25hcHNob3Q+IHNuYXBzaG90LCBmbG9hdCBsZWZ0LCBmbG9hdCB0b3AsIGZsb2F0IHJpZ2h0LCBmbG9hdCBib3R0b20sCisgICAgICAgICAgICBpbnQgYWxwaGEsIFNrWGZlcm1vZGU6Ok1vZGUgbW9kZSwgaW50IGZsYWdzKTsKKworICAgIC8qKgorICAgICAqIENsZWFycyBhbGwgdGhlIHJlZ2lvbnMgY29ycmVzcG9uZGluZyB0byB0aGUgY3VycmVudCBsaXN0IG9mIGxheWVycy4KKyAgICAgKiBUaGlzIG1ldGhvZCBNVVNUIGJlIGludm9rZWQgYmVmb3JlIGFueSBkcmF3aW5nIG9wZXJhdGlvbi4KKyAgICAgKi8KKyAgICB2b2lkIGNsZWFyTGF5ZXJSZWdpb25zKCk7CisKKyAgICAvKioKKyAgICAgKiBEcmF3cyBhIGNvbG9yZWQgcmVjdGFuZ2xlIHdpdGggdGhlIHNwZWNpZmllZCBjb2xvci4gVGhlIHNwZWNpZmllZCBjb29yZGluYXRlcworICAgICAqIGFyZSB0cmFuc2Zvcm1lZCBieSB0aGUgY3VycmVudCBzbmFwc2hvdCdzIHRyYW5zZm9ybSBtYXRyaXguCisgICAgICoKKyAgICAgKiBAcGFyYW0gbGVmdCBUaGUgbGVmdCBjb29yZGluYXRlIG9mIHRoZSByZWN0YW5nbGUKKyAgICAgKiBAcGFyYW0gdG9wIFRoZSB0b3AgY29vcmRpbmF0ZSBvZiB0aGUgcmVjdGFuZ2xlCisgICAgICogQHBhcmFtIHJpZ2h0IFRoZSByaWdodCBjb29yZGluYXRlIG9mIHRoZSByZWN0YW5nbGUKKyAgICAgKiBAcGFyYW0gYm90dG9tIFRoZSBib3R0b20gY29vcmRpbmF0ZSBvZiB0aGUgcmVjdGFuZ2xlCisgICAgICogQHBhcmFtIGNvbG9yIFRoZSByZWN0YW5nbGUncyBBUkdCIGNvbG9yLCBkZWZpbmVkIGFzIGEgcGFja2VkIDMyIGJpdHMgd29yZAorICAgICAqIEBwYXJhbSBtb2RlIFRoZSBTa2lhIHhmZXJtb2RlIHRvIHVzZQorICAgICAqIEBwYXJhbSBpZ25vcmVUcmFuc2Zvcm0gVHJ1ZSBpZiB0aGUgY3VycmVudCB0cmFuc2Zvcm0gc2hvdWxkIGJlIGlnbm9yZWQKKyAgICAgKiBAcGFyYW4gaWdub3JlQmxlbmRpbmcgVHJ1ZSBpZiB0aGUgYmxlbmRpbmcgaXMgc2V0IGJ5IHRoZSBjYWxsZXIKKyAgICAgKi8KKyAgICB2b2lkIGRyYXdDb2xvclJlY3QoZmxvYXQgbGVmdCwgZmxvYXQgdG9wLCBmbG9hdCByaWdodCwgZmxvYXQgYm90dG9tLAorICAgICAgICAgICAgaW50IGNvbG9yLCBTa1hmZXJtb2RlOjpNb2RlIG1vZGUsIGJvb2wgaWdub3JlVHJhbnNmb3JtID0gZmFsc2UpOworCisgICAgLyoqCisgICAgICogRHJhd3MgYSB0ZXh0dXJlZCByZWN0YW5nbGUgd2l0aCB0aGUgc3BlY2lmaWVkIHRleHR1cmUuIFRoZSBzcGVjaWZpZWQgY29vcmRpbmF0ZXMKKyAgICAgKiBhcmUgdHJhbnNmb3JtZWQgYnkgdGhlIGN1cnJlbnQgc25hcHNob3QncyB0cmFuc2Zvcm0gbWF0cml4LgorICAgICAqCisgICAgICogQHBhcmFtIGxlZnQgVGhlIGxlZnQgY29vcmRpbmF0ZSBvZiB0aGUgcmVjdGFuZ2xlCisgICAgICogQHBhcmFtIHRvcCBUaGUgdG9wIGNvb3JkaW5hdGUgb2YgdGhlIHJlY3RhbmdsZQorICAgICAqIEBwYXJhbSByaWdodCBUaGUgcmlnaHQgY29vcmRpbmF0ZSBvZiB0aGUgcmVjdGFuZ2xlCisgICAgICogQHBhcmFtIGJvdHRvbSBUaGUgYm90dG9tIGNvb3JkaW5hdGUgb2YgdGhlIHJlY3RhbmdsZQorICAgICAqIEBwYXJhbSB0ZXh0dXJlIFRoZSB0ZXh0dXJlIG5hbWUgdG8gbWFwIG9udG8gdGhlIHJlY3RhbmdsZQorICAgICAqIEBwYXJhbSBhbHBoYSBBbiBhZGRpdGlvbmFsIHRyYW5zbHVjZW5jeSBwYXJhbWV0ZXIsIGJldHdlZW4gMC4wZiBhbmQgMS4wZgorICAgICAqIEBwYXJhbSBtb2RlIFRoZSBibGVuZGluZyBtb2RlCisgICAgICogQHBhcmFtIGJsZW5kIFRydWUgaWYgdGhlIHRleHR1cmUgY29udGFpbnMgYW4gYWxwaGEgY2hhbm5lbAorICAgICAqLworICAgIHZvaWQgZHJhd1RleHR1cmVSZWN0KGZsb2F0IGxlZnQsIGZsb2F0IHRvcCwgZmxvYXQgcmlnaHQsIGZsb2F0IGJvdHRvbSwgR0x1aW50IHRleHR1cmUsCisgICAgICAgICAgICBmbG9hdCBhbHBoYSwgU2tYZmVybW9kZTo6TW9kZSBtb2RlLCBib29sIGJsZW5kKTsKKworICAgIC8qKgorICAgICAqIERyYXdzIGEgdGV4dHVyZWQgcmVjdGFuZ2xlIHdpdGggdGhlIHNwZWNpZmllZCB0ZXh0dXJlLiBUaGUgc3BlY2lmaWVkIGNvb3JkaW5hdGVzCisgICAgICogYXJlIHRyYW5zZm9ybWVkIGJ5IHRoZSBjdXJyZW50IHNuYXBzaG90J3MgdHJhbnNmb3JtIG1hdHJpeC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBsZWZ0IFRoZSBsZWZ0IGNvb3JkaW5hdGUgb2YgdGhlIHJlY3RhbmdsZQorICAgICAqIEBwYXJhbSB0b3AgVGhlIHRvcCBjb29yZGluYXRlIG9mIHRoZSByZWN0YW5nbGUKKyAgICAgKiBAcGFyYW0gcmlnaHQgVGhlIHJpZ2h0IGNvb3JkaW5hdGUgb2YgdGhlIHJlY3RhbmdsZQorICAgICAqIEBwYXJhbSBib3R0b20gVGhlIGJvdHRvbSBjb29yZGluYXRlIG9mIHRoZSByZWN0YW5nbGUKKyAgICAgKiBAcGFyYW0gdGV4dHVyZSBUaGUgdGV4dHVyZSB0byB1c2UKKyAgICAgKiBAcGFyYW0gcGFpbnQgVGhlIHBhaW50IGNvbnRhaW5pbmcgdGhlIGFscGhhLCBibGVuZGluZyBtb2RlLCBldGMuCisgICAgICovCisgICAgdm9pZCBkcmF3VGV4dHVyZVJlY3QoZmxvYXQgbGVmdCwgZmxvYXQgdG9wLCBmbG9hdCByaWdodCwgZmxvYXQgYm90dG9tLAorICAgICAgICAgICAgY29uc3QgVGV4dHVyZSogdGV4dHVyZSwgY29uc3QgU2tQYWludCogcGFpbnQpOworCisgICAgLyoqCisgICAgICogRHJhd3MgYSB0ZXh0dXJlZCBtZXNoIHdpdGggdGhlIHNwZWNpZmllZCB0ZXh0dXJlLiBJZiB0aGUgaW5kaWNlcyBhcmUgb21pdHRlZCwgdGhlCisgICAgICogbWVzaCBpcyBkcmF3biBhcyBhIHNpbXBsZSBxdWFkLgorICAgICAqCisgICAgICogQHBhcmFtIGxlZnQgVGhlIGxlZnQgY29vcmRpbmF0ZSBvZiB0aGUgcmVjdGFuZ2xlCisgICAgICogQHBhcmFtIHRvcCBUaGUgdG9wIGNvb3JkaW5hdGUgb2YgdGhlIHJlY3RhbmdsZQorICAgICAqIEBwYXJhbSByaWdodCBUaGUgcmlnaHQgY29vcmRpbmF0ZSBvZiB0aGUgcmVjdGFuZ2xlCisgICAgICogQHBhcmFtIGJvdHRvbSBUaGUgYm90dG9tIGNvb3JkaW5hdGUgb2YgdGhlIHJlY3RhbmdsZQorICAgICAqIEBwYXJhbSB0ZXh0dXJlIFRoZSB0ZXh0dXJlIG5hbWUgdG8gbWFwIG9udG8gdGhlIHJlY3RhbmdsZQorICAgICAqIEBwYXJhbSBhbHBoYSBBbiBhZGRpdGlvbmFsIHRyYW5zbHVjZW5jeSBwYXJhbWV0ZXIsIGJldHdlZW4gMC4wZiBhbmQgMS4wZgorICAgICAqIEBwYXJhbSBtb2RlIFRoZSBibGVuZGluZyBtb2RlCisgICAgICogQHBhcmFtIGJsZW5kIFRydWUgaWYgdGhlIHRleHR1cmUgY29udGFpbnMgYW4gYWxwaGEgY2hhbm5lbAorICAgICAqIEBwYXJhbSB2ZXJ0aWNlcyBUaGUgdmVydGljZXMgdGhhdCBkZWZpbmUgdGhlIG1lc2gKKyAgICAgKiBAcGFyYW0gdGV4Q29vcmRzIFRoZSB0ZXh0dXJlIGNvb3JkaW5hdGVzIG9mIGVhY2ggdmVydGV4CisgICAgICogQHBhcmFtIGluZGljZXMgVGhlIGluZGljZXMgb2YgdGhlIHZlcnRpY2VzLCBjYW4gYmUgTlVMTAorICAgICAqIEBwYXJhbSBlbGVtZW50c0NvdW50IFRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIG1lc2gsIHJlcXVpcmVkIGJ5IGluZGljZXMKKyAgICAgKiBAcGFyYW0gc3dhcFNyY0RzdCBXaGV0aGVyIG9yIG5vdCB0aGUgc3JjIGFuZCBkc3QgYmxlbmRpbmcgb3BlcmF0aW9ucyBzaG91bGQgYmUgc3dhcHBlZAorICAgICAqIEBwYXJhbSBpZ25vcmVUcmFuc2Zvcm0gVHJ1ZSBpZiB0aGUgY3VycmVudCB0cmFuc2Zvcm0gc2hvdWxkIGJlIGlnbm9yZWQKKyAgICAgKi8KKyAgICB2b2lkIGRyYXdUZXh0dXJlTWVzaChmbG9hdCBsZWZ0LCBmbG9hdCB0b3AsIGZsb2F0IHJpZ2h0LCBmbG9hdCBib3R0b20sIEdMdWludCB0ZXh0dXJlLAorICAgICAgICAgICAgZmxvYXQgYWxwaGEsIFNrWGZlcm1vZGU6Ok1vZGUgbW9kZSwgYm9vbCBibGVuZCwKKyAgICAgICAgICAgIEdMdm9pZCogdmVydGljZXMsIEdMdm9pZCogdGV4Q29vcmRzLCBHTHZvaWQqIGluZGljZXMsIEdMc2l6ZWkgZWxlbWVudHNDb3VudCA9IDAsCisgICAgICAgICAgICBib29sIHN3YXBTcmNEc3QgPSBmYWxzZSwgYm9vbCBpZ25vcmVUcmFuc2Zvcm0gPSBmYWxzZSk7CisKKyAgICAvKioKKyAgICAgKiBQcmVwYXJlcyB0aGUgcmVuZGVyZXIgdG8gZHJhdyB0aGUgc3BlY2lmaWVkIHNoYWRvdy4KKyAgICAgKgorICAgICAqIEBwYXJhbSB0ZXh0dXJlIFRoZSBzaGFkb3cgdGV4dHVyZQorICAgICAqIEBwYXJhbSB4IFRoZSB4IGNvb3JkaW5hdGUgb2YgdGhlIHNoYWRvdworICAgICAqIEBwYXJhbSB5IFRoZSB5IGNvb3JkaW5hdGUgb2YgdGhlIHNoYWRvdworICAgICAqIEBwYXJhbSBtb2RlIFRoZSBibGVuZGluZyBtb2RlCisgICAgICogQHBhcmFtIGFscGhhIFRoZSBhbHBoYSB2YWx1ZQorICAgICAqLworICAgIHZvaWQgc2V0dXBTaGFkb3coY29uc3QgU2hhZG93VGV4dHVyZSogdGV4dHVyZSwgZmxvYXQgeCwgZmxvYXQgeSwgU2tYZmVybW9kZTo6TW9kZSBtb2RlLAorICAgICAgICAgICAgZmxvYXQgYWxwaGEpOworCisgICAgLyoqCisgICAgICogUHJlcGFyZXMgdGhlIHJlbmRlcmVyIHRvIGRyYXcgdGhlIHNwZWNpZmllZCBBbHBoYTggdGV4dHVyZSBhcyBhIHJlY3RhbmdsZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSB0ZXh0dXJlIFRoZSB0ZXh0dXJlIHRvIHJlbmRlciB3aXRoCisgICAgICogQHBhcmFtIHRleHR1cmVVbml0IFRoZSB0ZXh0dXJlIHVuaXQgdG8gdXNlLCBtYXkgYmUgbW9kaWZpZWQKKyAgICAgKiBAcGFyYW0geCBUaGUgeCBjb29yZGluYXRlIG9mIHRoZSByZWN0YW5nbGUgdG8gZHJhdworICAgICAqIEBwYXJhbSB5IFRoZSB5IGNvb3JkaW5hdGUgb2YgdGhlIHJlY3RhbmdsZSB0byBkcmF3CisgICAgICogQHBhcmFtIHIgVGhlIHJlZCBjb21wb25lbnQgb2YgdGhlIGNvbG9yCisgICAgICogQHBhcmFtIGcgVGhlIGdyZWVuIGNvbXBvbmVudCBvZiB0aGUgY29sb3IKKyAgICAgKiBAcGFyYW0gYiBUaGUgYmx1ZSBjb21wb25lbnQgb2YgdGhlIGNvbG9yCisgICAgICogQHBhcmFtIGEgVGhlIGFscGhhIGNvbXBvbmVudCBvZiB0aGUgY29sb3IKKyAgICAgKiBAcGFyYW0gbW9kZSBUaGUgYmxlbmRpbmcgbW9kZQorICAgICAqIEBwYXJhbSB0cmFuc2Zvcm1zIFRydWUgaWYgdGhlIG1hdHJpeCBwYXNzZWQgdG8gdGhlIHNoYWRlciBzaG91bGQgYmUgbXVsdGlwbGllZAorICAgICAqICAgICAgICBieSB0aGUgbW9kZWwtdmlldyBtYXRyaXgKKyAgICAgKiBAcGFyYW0gYXBwbHlGaWx0ZXJzIFdoZXRoZXIgb3Igbm90IHRvIHRha2UgY29sb3IgZmlsdGVycyBhbmQKKyAgICAgKiAgICAgICAgc2hhZGVycyBpbnRvIGFjY291bnQKKyAgICAgKi8KKyAgICB2b2lkIHNldHVwVGV4dHVyZUFscGhhOChjb25zdCBUZXh0dXJlKiB0ZXh0dXJlLCBHTHVpbnQmIHRleHR1cmVVbml0LCBmbG9hdCB4LCBmbG9hdCB5LAorICAgICAgICAgICAgZmxvYXQgciwgZmxvYXQgZywgZmxvYXQgYiwgZmxvYXQgYSwgU2tYZmVybW9kZTo6TW9kZSBtb2RlLCBib29sIHRyYW5zZm9ybXMsCisgICAgICAgICAgICBib29sIGFwcGx5RmlsdGVycyk7CisKKyAgICAvKioKKyAgICAgKiBQcmVwYXJlcyB0aGUgcmVuZGVyZXIgdG8gZHJhdyB0aGUgc3BlY2lmaWVkIEFscGhhOCB0ZXh0dXJlIGFzIGEgcmVjdGFuZ2xlLgorICAgICAqCisgICAgICogQHBhcmFtIHRleHR1cmUgVGhlIHRleHR1cmUgdG8gcmVuZGVyIHdpdGgKKyAgICAgKiBAcGFyYW0gd2lkdGggVGhlIHdpZHRoIG9mIHRoZSB0ZXh0dXJlCisgICAgICogQHBhcmFtIGhlaWdodCBUaGUgaGVpZ2h0IG9mIHRoZSB0ZXh0dXJlCisgICAgICogQHBhcmFtIHRleHR1cmVVbml0IFRoZSB0ZXh0dXJlIHVuaXQgdG8gdXNlLCBtYXkgYmUgbW9kaWZpZWQKKyAgICAgKiBAcGFyYW0geCBUaGUgeCBjb29yZGluYXRlIG9mIHRoZSByZWN0YW5nbGUgdG8gZHJhdworICAgICAqIEBwYXJhbSB5IFRoZSB5IGNvb3JkaW5hdGUgb2YgdGhlIHJlY3RhbmdsZSB0byBkcmF3CisgICAgICogQHBhcmFtIHIgVGhlIHJlZCBjb21wb25lbnQgb2YgdGhlIGNvbG9yCisgICAgICogQHBhcmFtIGcgVGhlIGdyZWVuIGNvbXBvbmVudCBvZiB0aGUgY29sb3IKKyAgICAgKiBAcGFyYW0gYiBUaGUgYmx1ZSBjb21wb25lbnQgb2YgdGhlIGNvbG9yCisgICAgICogQHBhcmFtIGEgVGhlIGFscGhhIGNvbXBvbmVudCBvZiB0aGUgY29sb3IKKyAgICAgKiBAcGFyYW0gbW9kZSBUaGUgYmxlbmRpbmcgbW9kZQorICAgICAqIEBwYXJhbSB0cmFuc2Zvcm1zIFRydWUgaWYgdGhlIG1hdHJpeCBwYXNzZWQgdG8gdGhlIHNoYWRlciBzaG91bGQgYmUgbXVsdGlwbGllZAorICAgICAqICAgICAgICBieSB0aGUgbW9kZWwtdmlldyBtYXRyaXgKKyAgICAgKiBAcGFyYW0gYXBwbHlGaWx0ZXJzIFdoZXRoZXIgb3Igbm90IHRvIHRha2UgY29sb3IgZmlsdGVycyBhbmQKKyAgICAgKiAgICAgICAgc2hhZGVycyBpbnRvIGFjY291bnQKKyAgICAgKi8KKyAgICB2b2lkIHNldHVwVGV4dHVyZUFscGhhOChHTHVpbnQgdGV4dHVyZSwgdWludDMyX3Qgd2lkdGgsIHVpbnQzMl90IGhlaWdodCwKKyAgICAgICAgICAgIEdMdWludCYgdGV4dHVyZVVuaXQsIGZsb2F0IHgsIGZsb2F0IHksIGZsb2F0IHIsIGZsb2F0IGcsIGZsb2F0IGIsIGZsb2F0IGEsCisgICAgICAgICAgICBTa1hmZXJtb2RlOjpNb2RlIG1vZGUsIGJvb2wgdHJhbnNmb3JtcywgYm9vbCBhcHBseUZpbHRlcnMpOworCisgICAgLyoqCisgICAgICogRHJhd3MgdGV4dCB1bmRlcmxpbmUgYW5kIHN0cmlrZS10aHJvdWdoIGlmIG5lZWRlZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSB0ZXh0IFRoZSB0ZXh0IHRvIGRlY29yCisgICAgICogQHBhcmFtIGJ5dGVzQ291bnQgVGhlIG51bWJlciBvZiBieXRlcyBpbiB0aGUgdGV4dAorICAgICAqIEBwYXJhbSBsZW5ndGggVGhlIGxlbmd0aCBpbiBwaXhlbHMgb2YgdGhlIHRleHQsIGNhbiBiZSA8PSAwLjBmIHRvIGZvcmNlIGEgbWVhc3VyZW1lbnQKKyAgICAgKiBAcGFyYW0geCBUaGUgeCBjb29yZGluYXRlIHdoZXJlIHRoZSB0ZXh0IHdpbGwgYmUgZHJhd24KKyAgICAgKiBAcGFyYW0geSBUaGUgeSBjb29yZGluYXRlIHdoZXJlIHRoZSB0ZXh0IHdpbGwgYmUgZHJhd24KKyAgICAgKiBAcGFyYW0gcGFpbnQgVGhlIHBhaW50IHRvIGRyYXcgdGhlIHRleHQgd2l0aAorICAgICAqLworICAgIHZvaWQgZHJhd1RleHREZWNvcmF0aW9ucyhjb25zdCBjaGFyKiB0ZXh0LCBpbnQgYnl0ZXNDb3VudCwgZmxvYXQgbGVuZ3RoLAorICAgICAgICAgICAgZmxvYXQgeCwgZmxvYXQgeSwgU2tQYWludCogcGFpbnQpOworCisgICAgLyoqCisgICAgICogUmVzZXRzIHRoZSB0ZXh0dXJlIGNvb3JkaW5hdGVzIHN0b3JlZCBpbiBtTWVzaFZlcnRpY2VzLiBTZXR0aW5nIHRoZSB2YWx1ZXMKKyAgICAgKiBiYWNrIHRvIGRlZmF1bHQgaXMgYWNoaWV2ZWQgYnkgY2FsbGluZzoKKyAgICAgKgorICAgICAqIHJlc2V0RHJhd1RleHR1cmVUZXhDb29yZHMoMC4wZiwgMC4wZiwgMS4wZiwgMS4wZik7CisgICAgICoKKyAgICAgKiBAcGFyYW0gdTEgVGhlIGxlZnQgY29vcmRpbmF0ZSBvZiB0aGUgdGV4dHVyZQorICAgICAqIEBwYXJhbSB2MSBUaGUgYm90dG9tIGNvb3JkaW5hdGUgb2YgdGhlIHRleHR1cmUKKyAgICAgKiBAcGFyYW0gdTIgVGhlIHJpZ2h0IGNvb3JkaW5hdGUgb2YgdGhlIHRleHR1cmUKKyAgICAgKiBAcGFyYW0gdjIgVGhlIHRvcCBjb29yZGluYXRlIG9mIHRoZSB0ZXh0dXJlCisgICAgICovCisgICAgdm9pZCByZXNldERyYXdUZXh0dXJlVGV4Q29vcmRzKGZsb2F0IHUxLCBmbG9hdCB2MSwgZmxvYXQgdTIsIGZsb2F0IHYyKTsKKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIGFscGhhIGFuZCB4ZmVybW9kZSBvdXQgb2YgYSBwYWludCBvYmplY3QuIElmIHRoZSBwYWludCBpcyBudWxsCisgICAgICogYWxwaGEgd2lsbCBiZSAyNTUgYW5kIHRoZSB4ZmVybW9kZSB3aWxsIGJlIFNSQ19PVkVSLgorICAgICAqCisgICAgICogQHBhcmFtIHBhaW50IFRoZSBwYWludCB0byBleHRyYWN0IHZhbHVlcyBmcm9tCisgICAgICogQHBhcmFtIGFscGhhIFdoZXJlIHRvIHN0b3JlIHRoZSByZXN1bHRpbmcgYWxwaGEKKyAgICAgKiBAcGFyYW0gbW9kZSBXaGVyZSB0byBzdG9yZSB0aGUgcmVzdWx0aW5nIHhmZXJtb2RlCisgICAgICovCisgICAgaW5saW5lIHZvaWQgZ2V0QWxwaGFBbmRNb2RlKGNvbnN0IFNrUGFpbnQqIHBhaW50LCBpbnQqIGFscGhhLCBTa1hmZXJtb2RlOjpNb2RlKiBtb2RlKTsKKworICAgIC8qKgorICAgICAqIEJpbmRzIHRoZSBzcGVjaWZpZWQgdGV4dHVyZSB3aXRoIHRoZSBzcGVjaWZpZWQgd3JhcCBtb2Rlcy4KKyAgICAgKi8KKyAgICBpbmxpbmUgdm9pZCBiaW5kVGV4dHVyZShHTHVpbnQgdGV4dHVyZSwgR0xlbnVtIHdyYXBTLCBHTGVudW0gd3JhcFQsIEdMdWludCB0ZXh0dXJlVW5pdCA9IDApOworCisgICAgLyoqCisgICAgICogRW5hYmxlIG9yIGRpc2FibGUgYmxlbmRpbmcgYXMgbmVjZXNzYXJ5LiBUaGlzIGZ1bmN0aW9uIHNldHMgdGhlIGFwcHJvcHJpYXRlCisgICAgICogYmxlbmQgZnVuY3Rpb24gYmFzZWQgb24gdGhlIHNwZWNpZmllZCB4ZmVybW9kZS4KKyAgICAgKi8KKyAgICBpbmxpbmUgdm9pZCBjaG9vc2VCbGVuZGluZyhib29sIGJsZW5kLCBTa1hmZXJtb2RlOjpNb2RlIG1vZGUsIFByb2dyYW1EZXNjcmlwdGlvbiYgZGVzY3JpcHRpb24sCisgICAgICAgICAgICBib29sIHN3YXBTcmNEc3QgPSBmYWxzZSk7CisKKyAgICAvKioKKyAgICAgKiBTYWZlbHkgcmV0cmlldmVzIHRoZSBtb2RlIGZyb20gdGhlIHNwZWNpZmllZCB4ZmVybW9kZS4gSWYgdGhlIHNwZWNpZmllZAorICAgICAqIHhmZXJtb2RlIGlzIG51bGwsIHRoZSBtb2RlIGlzIGFzc3VtZWQgdG8gYmUgU2tYZmVybW9kZTo6a1NyY092ZXJfTW9kZS4KKyAgICAgKi8KKyAgICBpbmxpbmUgU2tYZmVybW9kZTo6TW9kZSBnZXRYZmVybW9kZShTa1hmZXJtb2RlKiBtb2RlKTsKKworICAgIC8qKgorICAgICAqIFVzZSB0aGUgc3BlY2lmaWVkIHByb2dyYW0gd2l0aCB0aGUgY3VycmVudCBHTCBjb250ZXh0LiBJZiB0aGUgcHJvZ3JhbSBpcyBhbHJlYWR5CisgICAgICogaW4gdXNlLCBpdCB3aWxsIG5vdCBiZSBib3VuZCBhZ2Fpbi4gSWYgaXQgaXMgbm90IGluIHVzZSwgdGhlIGN1cnJlbnQgcHJvZ3JhbSBpcworICAgICAqIG1hcmtlZCB1bnVzZWQgYW5kIHRoZSBzcGVjaWZpZWQgcHJvZ3JhbSBiZWNvbWVzIHVzZWQgYW5kIGJlY29tZXMgdGhlIG5ldworICAgICAqIGN1cnJlbnQgcHJvZ3JhbS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwcm9ncmFtIFRoZSBwcm9ncmFtIHRvIHVzZQorICAgICAqCisgICAgICogQHJldHVybiB0cnVlIElmIHRoZSBzcGVjaWZpZWQgcHJvZ3JhbSB3YXMgYWxyZWFkeSBpbiB1c2UsIGZhbHNlIG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICBpbmxpbmUgYm9vbCB1c2VQcm9ncmFtKFByb2dyYW0qIHByb2dyYW0pOworCisgICAgLy8gRGltZW5zaW9ucyBvZiB0aGUgZHJhd2luZyBzdXJmYWNlCisgICAgaW50IG1XaWR0aCwgbUhlaWdodDsKKworICAgIC8vIE1hdHJpeCB1c2VkIGZvciBvcnRobyBwcm9qZWN0aW9uIGluIHNoYWRlcnMKKyAgICBtYXQ0IG1PcnRob01hdHJpeDsKKworICAgIC8vIE1vZGVsLXZpZXcgbWF0cml4IHVzZWQgdG8gcG9zaXRpb24vc2l6ZSBvYmplY3RzCisgICAgbWF0NCBtTW9kZWxWaWV3OworCisgICAgLy8gTnVtYmVyIG9mIHNhdmVkIHN0YXRlcworICAgIGludCBtU2F2ZUNvdW50OworICAgIC8vIEJhc2Ugc3RhdGUKKyAgICBzcDxTbmFwc2hvdD4gbUZpcnN0U25hcHNob3Q7CisgICAgLy8gQ3VycmVudCBzdGF0ZQorICAgIHNwPFNuYXBzaG90PiBtU25hcHNob3Q7CisKKyAgICAvLyBTaGFkZXJzCisgICAgU2tpYVNoYWRlciogbVNoYWRlcjsKKworICAgIC8vIENvbG9yIGZpbHRlcnMKKyAgICBTa2lhQ29sb3JGaWx0ZXIqIG1Db2xvckZpbHRlcjsKKworICAgIC8vIFVzZWQgdG8gZHJhdyB0ZXh0dXJlZCBxdWFkcworICAgIFRleHR1cmVWZXJ0ZXggbU1lc2hWZXJ0aWNlc1s0XTsKKworICAgIC8vIEdMIGV4dGVuc2lvbnMKKyAgICBFeHRlbnNpb25zIG1FeHRlbnNpb25zOworCisgICAgLy8gRHJvcCBzaGFkb3cKKyAgICBib29sIG1IYXNTaGFkb3c7CisgICAgZmxvYXQgbVNoYWRvd1JhZGl1czsKKyAgICBmbG9hdCBtU2hhZG93RHg7CisgICAgZmxvYXQgbVNoYWRvd0R5OworICAgIGludCBtU2hhZG93Q29sb3I7CisKKyAgICAvLyBWYXJpb3VzIGNhY2hlcworICAgIENhY2hlcyYgbUNhY2hlczsKKworICAgIC8vIExpc3Qgb2YgcmVjdGFuZ2xlcyB0byBjbGVhciBkdWUgdG8gY2FsbHMgdG8gc2F2ZUxheWVyKCkKKyAgICBWZWN0b3I8UmVjdCo+IG1MYXllcnM7CisKK307IC8vIGNsYXNzIE9wZW5HTFJlbmRlcmVyCisKK307IC8vIG5hbWVzcGFjZSB1aXJlbmRlcmVyCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgLy8gQU5EUk9JRF9VSV9PUEVOR0xfUkVOREVSRVJfSApkaWZmIC0tZ2l0IGEvbGlicy9od3VpL1BhdGNoLmNwcCBiL2xpYnMvaHd1aS9QYXRjaC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGI2YmIzNwotLS0gL2Rldi9udWxsCisrKyBiL2xpYnMvaHd1aS9QYXRjaC5jcHAKQEAgLTAsMCArMSwxODggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIk9wZW5HTFJlbmRlcmVyIgorCisjaW5jbHVkZSA8Y3N0cmluZz4KKworI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSAiUGF0Y2guaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIHVpcmVuZGVyZXIgeworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBDb25zdHJ1Y3RvcnMvZGVzdHJ1Y3RvcgorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitQYXRjaDo6UGF0Y2goY29uc3QgdWludDMyX3QgeENvdW50LCBjb25zdCB1aW50MzJfdCB5Q291bnQpOgorICAgICAgICB4Q291bnQoeENvdW50ICsgMiksIHlDb3VudCh5Q291bnQgKyAyKSB7CisgICAgdmVydGljZXNDb3VudCA9ICh4Q291bnQgKyAyKSAqICh5Q291bnQgKyAyKTsKKyAgICB2ZXJ0aWNlcyA9IG5ldyBUZXh0dXJlVmVydGV4W3ZlcnRpY2VzQ291bnRdOworCisgICAgLy8gMiB0cmlhbmdsZXMgcGVyIHBhdGNoLCAzIHZlcnRpY2VzIHBlciB0cmlhbmdsZQorICAgIGluZGljZXNDb3VudCA9ICh4Q291bnQgKyAxKSAqICh5Q291bnQgKyAxKSAqIDIgKiAzOworICAgIGluZGljZXMgPSBuZXcgdWludDE2X3RbaW5kaWNlc0NvdW50XTsKKworICAgIGNvbnN0IHVpbnQzMl90IHhOdW0gPSB4Q291bnQgKyAxOworICAgIGNvbnN0IHVpbnQzMl90IHlOdW0gPSB5Q291bnQgKyAxOworCisgICAgdWludDE2X3QqIHN0YXJ0SW5kaWNlcyA9IGluZGljZXM7CisgICAgdWludDMyX3QgbiA9IDA7CisgICAgZm9yICh1aW50MzJfdCB5ID0gMDsgeSA8IHlOdW07IHkrKykgeworICAgICAgICBmb3IgKHVpbnQzMl90IHggPSAwOyB4IDwgeE51bTsgeCsrKSB7CisgICAgICAgICAgICAqc3RhcnRJbmRpY2VzKysgPSBuOworICAgICAgICAgICAgKnN0YXJ0SW5kaWNlcysrID0gbiArIDE7CisgICAgICAgICAgICAqc3RhcnRJbmRpY2VzKysgPSBuICsgeE51bSArIDI7CisKKyAgICAgICAgICAgICpzdGFydEluZGljZXMrKyA9IG47CisgICAgICAgICAgICAqc3RhcnRJbmRpY2VzKysgPSBuICsgeE51bSArIDI7CisgICAgICAgICAgICAqc3RhcnRJbmRpY2VzKysgPSBuICsgeE51bSArIDE7CisKKyAgICAgICAgICAgIG4gKz0gMTsKKyAgICAgICAgfQorICAgICAgICBuICs9IDE7CisgICAgfQorfQorCitQYXRjaDo6flBhdGNoKCkgeworICAgIGRlbGV0ZSBpbmRpY2VzOworICAgIGRlbGV0ZSB2ZXJ0aWNlczsKK30KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gVmVydGljZXMgbWFuYWdlbWVudAorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCit2b2lkIFBhdGNoOjp1cGRhdGVWZXJ0aWNlcyhjb25zdCBTa0JpdG1hcCogYml0bWFwLCBmbG9hdCBsZWZ0LCBmbG9hdCB0b3AsIGZsb2F0IHJpZ2h0LAorICAgICAgICBmbG9hdCBib3R0b20sIGNvbnN0IGludDMyX3QqIHhEaXZzLCAgY29uc3QgaW50MzJfdCogeURpdnMsIGNvbnN0IHVpbnQzMl90IHdpZHRoLAorICAgICAgICBjb25zdCB1aW50MzJfdCBoZWlnaHQpIHsKKyAgICBjb25zdCB1aW50MzJfdCB4U3RyZXRjaENvdW50ID0gKHdpZHRoICsgMSkgPj4gMTsKKyAgICBjb25zdCB1aW50MzJfdCB5U3RyZXRjaENvdW50ID0gKGhlaWdodCArIDEpID4+IDE7CisKKyAgICBmbG9hdCB4U3RyZXRjaCA9IDA7CisgICAgZmxvYXQgeVN0cmV0Y2ggPSAwOworICAgIGZsb2F0IHhTdHJldGNoVGV4ID0gMDsKKyAgICBmbG9hdCB5U3RyZXRjaFRleCA9IDA7CisKKyAgICBjb25zdCBmbG9hdCBtZXNoV2lkdGggPSByaWdodCAtIGxlZnQ7CisKKyAgICBjb25zdCBmbG9hdCBiaXRtYXBXaWR0aCA9IGZsb2F0KGJpdG1hcC0+d2lkdGgoKSk7CisgICAgY29uc3QgZmxvYXQgYml0bWFwSGVpZ2h0ID0gZmxvYXQoYml0bWFwLT5oZWlnaHQoKSk7CisKKyAgICBpZiAoeFN0cmV0Y2hDb3VudCA+IDApIHsKKyAgICAgICAgdWludDMyX3Qgc3RyZXRjaFNpemUgPSAwOworICAgICAgICBmb3IgKHVpbnQzMl90IGkgPSAxOyBpIDwgd2lkdGg7IGkgKz0gMikgeworICAgICAgICAgICAgc3RyZXRjaFNpemUgKz0geERpdnNbaV0gLSB4RGl2c1tpIC0gMV07CisgICAgICAgIH0KKyAgICAgICAgeFN0cmV0Y2hUZXggPSAoc3RyZXRjaFNpemUgLyBiaXRtYXBXaWR0aCkgLyB4U3RyZXRjaENvdW50OworICAgICAgICBjb25zdCBmbG9hdCBmaXhlZCA9IGJpdG1hcFdpZHRoIC0gc3RyZXRjaFNpemU7CisgICAgICAgIHhTdHJldGNoID0gKHJpZ2h0IC0gbGVmdCAtIGZpeGVkKSAvIHhTdHJldGNoQ291bnQ7CisgICAgfQorCisgICAgaWYgKHlTdHJldGNoQ291bnQgPiAwKSB7CisgICAgICAgIHVpbnQzMl90IHN0cmV0Y2hTaXplID0gMDsKKyAgICAgICAgZm9yICh1aW50MzJfdCBpID0gMTsgaSA8IGhlaWdodDsgaSArPSAyKSB7CisgICAgICAgICAgICBzdHJldGNoU2l6ZSArPSB5RGl2c1tpXSAtIHlEaXZzW2kgLSAxXTsKKyAgICAgICAgfQorICAgICAgICB5U3RyZXRjaFRleCA9IChzdHJldGNoU2l6ZSAvIGJpdG1hcEhlaWdodCkgLyB5U3RyZXRjaENvdW50OworICAgICAgICBjb25zdCBmbG9hdCBmaXhlZCA9IGJpdG1hcEhlaWdodCAtIHN0cmV0Y2hTaXplOworICAgICAgICB5U3RyZXRjaCA9IChib3R0b20gLSB0b3AgLSBmaXhlZCkgLyB5U3RyZXRjaENvdW50OworICAgIH0KKworICAgIGZsb2F0IHZ5ID0gMC4wZjsKKyAgICBmbG9hdCB0eSA9IDAuMGY7CisgICAgVGV4dHVyZVZlcnRleCogdmVydGV4ID0gdmVydGljZXM7CisKKyAgICBnZW5lcmF0ZVZlcnRpY2VzKHZlcnRleCwgMC4wZiwgMC4wZiwgeERpdnMsIHdpZHRoLCB4U3RyZXRjaCwgeFN0cmV0Y2hUZXgsCisgICAgICAgICAgICBtZXNoV2lkdGgsIGJpdG1hcFdpZHRoKTsKKyAgICB2ZXJ0ZXggKz0gd2lkdGggKyAyOworCisgICAgZm9yICh1aW50MzJfdCB5ID0gMDsgeSA8IGhlaWdodDsgeSsrKSB7CisgICAgICAgIGlmICh5ICYgMSkgeworICAgICAgICAgICAgdnkgKz0geVN0cmV0Y2g7CisgICAgICAgICAgICB0eSArPSB5U3RyZXRjaFRleDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGNvbnN0IGZsb2F0IHN0ZXAgPSBmbG9hdCh5RGl2c1t5XSk7CisgICAgICAgICAgICB2eSArPSBzdGVwOworICAgICAgICAgICAgdHkgKz0gc3RlcCAvIGJpdG1hcEhlaWdodDsKKyAgICAgICAgfQorICAgICAgICBnZW5lcmF0ZVZlcnRpY2VzKHZlcnRleCwgdnksIHR5LCB4RGl2cywgd2lkdGgsIHhTdHJldGNoLCB4U3RyZXRjaFRleCwKKyAgICAgICAgICAgICAgICBtZXNoV2lkdGgsIGJpdG1hcFdpZHRoKTsKKyAgICAgICAgdmVydGV4ICs9IHdpZHRoICsgMjsKKyAgICB9CisKKyAgICBnZW5lcmF0ZVZlcnRpY2VzKHZlcnRleCwgYm90dG9tIC0gdG9wLCAxLjBmLCB4RGl2cywgd2lkdGgsIHhTdHJldGNoLCB4U3RyZXRjaFRleCwKKyAgICAgICAgICAgIG1lc2hXaWR0aCwgYml0bWFwV2lkdGgpOworfQorCitpbmxpbmUgdm9pZCBQYXRjaDo6Z2VuZXJhdGVWZXJ0aWNlcyhUZXh0dXJlVmVydGV4KiB2ZXJ0ZXgsIGZsb2F0IHksIGZsb2F0IHYsCisgICAgICAgIGNvbnN0IGludDMyX3QgeERpdnNbXSwgdWludDMyX3QgeENvdW50LCBmbG9hdCB4U3RyZXRjaCwgZmxvYXQgeFN0cmV0Y2hUZXgsCisgICAgICAgIGZsb2F0IHdpZHRoLCBmbG9hdCB3aWR0aFRleCkgeworICAgIGZsb2F0IHZ4ID0gMC4wZjsKKyAgICBmbG9hdCB0eCA9IDAuMGY7CisKKyAgICBUZXh0dXJlVmVydGV4OjpzZXQodmVydGV4LCB2eCwgeSwgdHgsIHYpOworICAgIHZlcnRleCsrOworCisgICAgZm9yICh1aW50MzJfdCB4ID0gMDsgeCA8IHhDb3VudDsgeCsrKSB7CisgICAgICAgIGlmICh4ICYgMSkgeworICAgICAgICAgICAgdnggKz0geFN0cmV0Y2g7CisgICAgICAgICAgICB0eCArPSB4U3RyZXRjaFRleDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGNvbnN0IGZsb2F0IHN0ZXAgPSBmbG9hdCh4RGl2c1t4XSk7CisgICAgICAgICAgICB2eCArPSBzdGVwOworICAgICAgICAgICAgdHggKz0gc3RlcCAvIHdpZHRoVGV4OworICAgICAgICB9CisKKyAgICAgICAgVGV4dHVyZVZlcnRleDo6c2V0KHZlcnRleCwgdngsIHksIHR4LCB2KTsKKyAgICAgICAgdmVydGV4Kys7CisgICAgfQorCisgICAgVGV4dHVyZVZlcnRleDo6c2V0KHZlcnRleCwgd2lkdGgsIHksIDEuMGYsIHYpOworICAgIHZlcnRleCsrOworfQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBEZWJ1ZyB0b29scworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCit2b2lkIFBhdGNoOjpkdW1wKCkgeworICAgIExPR0QoIlZlcnRpY2VzIFsiKTsKKyAgICBmb3IgKHVpbnQzMl90IHkgPSAwOyB5IDwgeUNvdW50OyB5KyspIHsKKyAgICAgICAgY2hhciBidWZmZXJbNTEyXTsKKyAgICAgICAgYnVmZmVyWzBdID0gJ1wwJzsKKyAgICAgICAgdWludDMyX3Qgb2Zmc2V0ID0gMDsKKyAgICAgICAgZm9yICh1aW50MzJfdCB4ID0gMDsgeCA8IHhDb3VudDsgeCsrKSB7CisgICAgICAgICAgICBUZXh0dXJlVmVydGV4KiB2ID0gJnZlcnRpY2VzW3kgKiB4Q291bnQgKyB4XTsKKyAgICAgICAgICAgIG9mZnNldCArPSBzcHJpbnRmKCZidWZmZXJbb2Zmc2V0XSwgIiAoJS40ZiwlLjRmKS0oJS40ZiwlLjRmKSIsCisgICAgICAgICAgICAgICAgICAgIHYtPnBvc2l0aW9uWzBdLCB2LT5wb3NpdGlvblsxXSwgdi0+dGV4dHVyZVswXSwgdi0+dGV4dHVyZVsxXSk7CisgICAgICAgIH0KKyAgICAgICAgTE9HRCgiICBbJXMgXSIsIGJ1ZmZlcik7CisgICAgfQorICAgIExPR0QoIl1cbkluZGljZXMgWyAiKTsKKyAgICBjaGFyIGJ1ZmZlcls0MDk2XTsKKyAgICBidWZmZXJbMF0gPSAnXDAnOworICAgIHVpbnQzMl90IG9mZnNldCA9IDA7CisgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IGluZGljZXNDb3VudDsgaSsrKSB7CisgICAgICAgIG9mZnNldCArPSBzcHJpbnRmKCZidWZmZXJbb2Zmc2V0XSwgIiVkICIsIGluZGljZXNbaV0pOworICAgIH0KKyAgICBMT0dEKCIgICVzXG5dIiwgYnVmZmVyKTsKK30KKworfTsgLy8gbmFtZXNwYWNlIHVpcmVuZGVyZXIKK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9saWJzL2h3dWkvUGF0Y2guaCBiL2xpYnMvaHd1aS9QYXRjaC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVkM2FkMDMKLS0tIC9kZXYvbnVsbAorKysgYi9saWJzL2h3dWkvUGF0Y2guaApAQCAtMCwwICsxLDg1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX1VJX1BBVENIX0gKKyNkZWZpbmUgQU5EUk9JRF9VSV9QQVRDSF9ICisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKworI2luY2x1ZGUgPFNrQml0bWFwLmg+CisKKyNpbmNsdWRlICJWZXJ0ZXguaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIHVpcmVuZGVyZXIgeworCisvKioKKyAqIERlc2NyaXB0aW9uIG9mIGEgcGF0Y2guCisgKi8KK3N0cnVjdCBQYXRjaERlc2NyaXB0aW9uIHsKKyAgICBQYXRjaERlc2NyaXB0aW9uKCk6IHhDb3VudCgwKSwgeUNvdW50KDApIHsgfQorICAgIFBhdGNoRGVzY3JpcHRpb24oY29uc3QgdWludDMyX3QgeENvdW50LCBjb25zdCB1aW50MzJfdCB5Q291bnQpOgorICAgICAgICAgICAgeENvdW50KHhDb3VudCksIHlDb3VudCh5Q291bnQpIHsgfQorICAgIFBhdGNoRGVzY3JpcHRpb24oY29uc3QgUGF0Y2hEZXNjcmlwdGlvbiYgZGVzY3JpcHRpb24pOgorICAgICAgICAgICAgeENvdW50KGRlc2NyaXB0aW9uLnhDb3VudCksIHlDb3VudChkZXNjcmlwdGlvbi55Q291bnQpIHsgfQorCisgICAgdWludDMyX3QgeENvdW50OworICAgIHVpbnQzMl90IHlDb3VudDsKKworICAgIGJvb2wgb3BlcmF0b3I8KGNvbnN0IFBhdGNoRGVzY3JpcHRpb24mIHJocykgY29uc3QgeworICAgICAgICBpZiAoeENvdW50ID09IHJocy54Q291bnQpIHsKKyAgICAgICAgICAgIHJldHVybiB5Q291bnQgPCByaHMueUNvdW50OworICAgICAgICB9CisgICAgICAgIHJldHVybiB4Q291bnQgPCByaHMueENvdW50OworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBQYXRjaERlc2NyaXB0aW9uJiByaHMpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIHhDb3VudCA9PSByaHMueENvdW50ICYmIHlDb3VudCA9PSByaHMueUNvdW50OworICAgIH0KK307IC8vIHN0cnVjdCBQYXRjaERlc2NyaXB0aW9uCisKKy8qKgorICogQW4gT3BlbkdMIHBhdGNoLiBUaGlzIGNvbnRhaW5zIGFuIGFycmF5IG9mIHZlcnRpY2VzIGFuZCBhbiBhcnJheSBvZgorICogaW5kaWNlcyB0byByZW5kZXIgdGhlIHZlcnRpY2VzLgorICovCitzdHJ1Y3QgUGF0Y2ggeworICAgIFBhdGNoKGNvbnN0IHVpbnQzMl90IHhDb3VudCwgY29uc3QgdWludDMyX3QgeUNvdW50KTsKKyAgICB+UGF0Y2goKTsKKworICAgIHZvaWQgdXBkYXRlVmVydGljZXMoY29uc3QgU2tCaXRtYXAqIGJpdG1hcCwgZmxvYXQgbGVmdCwgZmxvYXQgdG9wLCBmbG9hdCByaWdodCwgZmxvYXQgYm90dG9tLAorICAgICAgICAgICAgY29uc3QgaW50MzJfdCogeERpdnMsICBjb25zdCBpbnQzMl90KiB5RGl2cywKKyAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90IHdpZHRoLCBjb25zdCB1aW50MzJfdCBoZWlnaHQpOworICAgIHZvaWQgZHVtcCgpOworCisgICAgdWludDMyX3QgeENvdW50OworICAgIHVpbnQzMl90IHlDb3VudDsKKworICAgIHVpbnQxNl90KiBpbmRpY2VzOworICAgIHVpbnQzMl90IGluZGljZXNDb3VudDsKKworICAgIFRleHR1cmVWZXJ0ZXgqIHZlcnRpY2VzOworICAgIHVpbnQzMl90IHZlcnRpY2VzQ291bnQ7CisKK3ByaXZhdGU6CisgICAgc3RhdGljIGlubGluZSB2b2lkIGdlbmVyYXRlVmVydGljZXMoVGV4dHVyZVZlcnRleCogdmVydGV4LCBmbG9hdCB5LCBmbG9hdCB2LAorICAgICAgICAgICAgY29uc3QgaW50MzJfdCB4RGl2c1tdLCB1aW50MzJfdCB4Q291bnQsIGZsb2F0IHhTdHJldGNoLCBmbG9hdCB4U3RyZXRjaFRleCwKKyAgICAgICAgICAgIGZsb2F0IHdpZHRoLCBmbG9hdCB3aWR0aFRleCk7Cit9OyAvLyBzdHJ1Y3QgUGF0Y2gKKworfTsgLy8gbmFtZXNwYWNlIHVpcmVuZGVyZXIKK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAvLyBBTkRST0lEX1VJX1BBVENIX0gKZGlmZiAtLWdpdCBhL2xpYnMvaHd1aS9QYXRjaENhY2hlLmNwcCBiL2xpYnMvaHd1aS9QYXRjaENhY2hlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hN2MwY2NlCi0tLSAvZGV2L251bGwKKysrIGIvbGlicy9od3VpL1BhdGNoQ2FjaGUuY3BwCkBAIC0wLDAgKzEsNzYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIk9wZW5HTFJlbmRlcmVyIgorCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisjaW5jbHVkZSA8dXRpbHMvUmVzb3VyY2VUeXBlcy5oPgorCisjaW5jbHVkZSAiUGF0Y2hDYWNoZS5oIgorI2luY2x1ZGUgIlByb3BlcnRpZXMuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIHVpcmVuZGVyZXIgeworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBDb25zdHJ1Y3RvcnMvZGVzdHJ1Y3RvcgorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitQYXRjaENhY2hlOjpQYXRjaENhY2hlKCk6IG1DYWNoZShERUZBVUxUX1BBVENIX0NBQ0hFX1NJWkUpIHsKK30KKworUGF0Y2hDYWNoZTo6UGF0Y2hDYWNoZSh1aW50MzJfdCBtYXhFbnRyaWVzKTogbUNhY2hlKG1heEVudHJpZXMpIHsKK30KKworUGF0Y2hDYWNoZTo6flBhdGNoQ2FjaGUoKSB7CisgICAgY2xlYXIoKTsKK30KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gQ2FsbGJhY2tzCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK3ZvaWQgUGF0Y2hDYWNoZTo6b3BlcmF0b3IoKShQYXRjaERlc2NyaXB0aW9uJiBkZXNjcmlwdGlvbiwgUGF0Y2gqJiBtZXNoKSB7CisgICAgaWYgKG1lc2gpIGRlbGV0ZSBtZXNoOworfQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBDYWNoaW5nCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK3ZvaWQgUGF0Y2hDYWNoZTo6Y2xlYXIoKSB7CisgICAgbUNhY2hlLnNldE9uRW50cnlSZW1vdmVkTGlzdGVuZXIodGhpcyk7CisgICAgbUNhY2hlLmNsZWFyKCk7CisgICAgbUNhY2hlLnNldE9uRW50cnlSZW1vdmVkTGlzdGVuZXIoTlVMTCk7Cit9CisKK1BhdGNoKiBQYXRjaENhY2hlOjpnZXQoY29uc3QgUmVzX3BuZ185cGF0Y2gqIHBhdGNoKSB7CisgICAgY29uc3QgdWludDMyX3Qgd2lkdGggPSBwYXRjaC0+bnVtWERpdnM7CisgICAgY29uc3QgdWludDMyX3QgaGVpZ2h0ID0gcGF0Y2gtPm51bVlEaXZzOworICAgIGNvbnN0IFBhdGNoRGVzY3JpcHRpb24gZGVzY3JpcHRpb24od2lkdGgsIGhlaWdodCk7CisKKyAgICBQYXRjaCogbWVzaCA9IG1DYWNoZS5nZXQoZGVzY3JpcHRpb24pOworICAgIGlmICghbWVzaCkgeworICAgICAgICBQQVRDSF9MT0dEKCJDcmVhdGluZyBuZXcgcGF0Y2ggbWVzaCwgdz0lZCBoPSVkIiwgd2lkdGgsIGhlaWdodCk7CisgICAgICAgIG1lc2ggPSBuZXcgUGF0Y2god2lkdGgsIGhlaWdodCk7CisgICAgICAgIG1DYWNoZS5wdXQoZGVzY3JpcHRpb24sIG1lc2gpOworICAgIH0KKworICAgIHJldHVybiBtZXNoOworfQorCit9OyAvLyBuYW1lc3BhY2UgdWlyZW5kZXJlcgorfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2xpYnMvaHd1aS9QYXRjaENhY2hlLmggYi9saWJzL2h3dWkvUGF0Y2hDYWNoZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZkYWQ4MzEKLS0tIC9kZXYvbnVsbAorKysgYi9saWJzL2h3dWkvUGF0Y2hDYWNoZS5oCkBAIC0wLDAgKzEsNjggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfVUlfUEFUQ0hfQ0FDSEVfSAorI2RlZmluZSBBTkRST0lEX1VJX1BBVENIX0NBQ0hFX0gKKworI2luY2x1ZGUgPHV0aWxzL1Jlc291cmNlVHlwZXMuaD4KKworI2luY2x1ZGUgIlBhdGNoLmgiCisjaW5jbHVkZSAiR2VuZXJhdGlvbkNhY2hlLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSB1aXJlbmRlcmVyIHsKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gRGVmaW5lcworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisvLyBEZWJ1ZworI2RlZmluZSBERUJVR19QQVRDSEVTIDAKKworLy8gRGVidWcKKyNpZiBERUJVR19QQVRDSEVTCisgICAgI2RlZmluZSBQQVRDSF9MT0dEKC4uLikgTE9HRChfX1ZBX0FSR1NfXykKKyNlbHNlCisgICAgI2RlZmluZSBQQVRDSF9MT0dEKC4uLikKKyNlbmRpZgorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBDYWNoZQorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitjbGFzcyBQYXRjaENhY2hlOiBwdWJsaWMgT25FbnRyeVJlbW92ZWQ8UGF0Y2hEZXNjcmlwdGlvbiwgUGF0Y2gqPiB7CitwdWJsaWM6CisgICAgUGF0Y2hDYWNoZSgpOworICAgIFBhdGNoQ2FjaGUodWludDMyX3QgbWF4Q2FwYWNpdHkpOworICAgIH5QYXRjaENhY2hlKCk7CisKKyAgICAvKioKKyAgICAgKiBVc2VkIGFzIGEgY2FsbGJhY2sgd2hlbiBhbiBlbnRyeSBpcyByZW1vdmVkIGZyb20gdGhlIGNhY2hlLgorICAgICAqIERvIG5vdCBpbnZva2UgZGlyZWN0bHkuCisgICAgICovCisgICAgdm9pZCBvcGVyYXRvcigpKFBhdGNoRGVzY3JpcHRpb24mIGRlc2NyaXB0aW9uLCBQYXRjaComIG1lc2gpOworCisgICAgUGF0Y2gqIGdldChjb25zdCBSZXNfcG5nXzlwYXRjaCogcGF0Y2gpOworICAgIHZvaWQgY2xlYXIoKTsKKworcHJpdmF0ZToKKyAgICBHZW5lcmF0aW9uQ2FjaGU8UGF0Y2hEZXNjcmlwdGlvbiwgUGF0Y2gqPiBtQ2FjaGU7Cit9OyAvLyBjbGFzcyBQYXRjaENhY2hlCisKK307IC8vIG5hbWVzcGFjZSB1aXJlbmRlcmVyCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgLy8gQU5EUk9JRF9VSV9QQVRDSF9DQUNIRV9ICmRpZmYgLS1naXQgYS9saWJzL2h3dWkvUGF0aENhY2hlLmNwcCBiL2xpYnMvaHd1aS9QYXRoQ2FjaGUuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcwZTA2YTEKLS0tIC9kZXYvbnVsbAorKysgYi9saWJzL2h3dWkvUGF0aENhY2hlLmNwcApAQCAtMCwwICsxLDIyNCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiT3BlbkdMUmVuZGVyZXIiCisKKyNpbmNsdWRlIDxHTEVTMi9nbDIuaD4KKworI2luY2x1ZGUgPFNrQ2FudmFzLmg+CisjaW5jbHVkZSA8U2tSZWN0Lmg+CisKKyNpbmNsdWRlIDx1dGlscy90aHJlYWRzLmg+CisKKyNpbmNsdWRlICJQYXRoQ2FjaGUuaCIKKyNpbmNsdWRlICJQcm9wZXJ0aWVzLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSB1aXJlbmRlcmVyIHsKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gQ29uc3RydWN0b3JzL2Rlc3RydWN0b3IKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworUGF0aENhY2hlOjpQYXRoQ2FjaGUoKToKKyAgICAgICAgbUNhY2hlKEdlbmVyYXRpb25DYWNoZTxQYXRoQ2FjaGVFbnRyeSwgUGF0aFRleHR1cmUqPjo6a1VubGltaXRlZENhcGFjaXR5KSwKKyAgICAgICAgbVNpemUoMCksIG1NYXhTaXplKE1CKERFRkFVTFRfUEFUSF9DQUNIRV9TSVpFKSkgeworICAgIGNoYXIgcHJvcGVydHlbUFJPUEVSVFlfVkFMVUVfTUFYXTsKKyAgICBpZiAocHJvcGVydHlfZ2V0KFBST1BFUlRZX1BBVEhfQ0FDSEVfU0laRSwgcHJvcGVydHksIE5VTEwpID4gMCkgeworICAgICAgICBMT0dEKCIgIFNldHRpbmcgcGF0aCBjYWNoZSBzaXplIHRvICVzTUIiLCBwcm9wZXJ0eSk7CisgICAgICAgIHNldE1heFNpemUoTUIoYXRvZihwcm9wZXJ0eSkpKTsKKyAgICB9IGVsc2UgeworICAgICAgICBMT0dEKCIgIFVzaW5nIGRlZmF1bHQgcGF0aCBjYWNoZSBzaXplIG9mICUuMmZNQiIsIERFRkFVTFRfUEFUSF9DQUNIRV9TSVpFKTsKKyAgICB9CisgICAgaW5pdCgpOworfQorCitQYXRoQ2FjaGU6OlBhdGhDYWNoZSh1aW50MzJfdCBtYXhCeXRlU2l6ZSk6CisgICAgICAgIG1DYWNoZShHZW5lcmF0aW9uQ2FjaGU8UGF0aENhY2hlRW50cnksIFBhdGhUZXh0dXJlKj46OmtVbmxpbWl0ZWRDYXBhY2l0eSksCisgICAgICAgIG1TaXplKDApLCBtTWF4U2l6ZShtYXhCeXRlU2l6ZSkgeworICAgIGluaXQoKTsKK30KKworUGF0aENhY2hlOjp+UGF0aENhY2hlKCkgeworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgbUNhY2hlLmNsZWFyKCk7Cit9CisKK3ZvaWQgUGF0aENhY2hlOjppbml0KCkgeworICAgIG1DYWNoZS5zZXRPbkVudHJ5UmVtb3ZlZExpc3RlbmVyKHRoaXMpOworCisgICAgR0xpbnQgbWF4VGV4dHVyZVNpemU7CisgICAgZ2xHZXRJbnRlZ2VydihHTF9NQVhfVEVYVFVSRV9TSVpFLCAmbWF4VGV4dHVyZVNpemUpOworICAgIG1NYXhUZXh0dXJlU2l6ZSA9IG1heFRleHR1cmVTaXplOworfQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBTaXplIG1hbmFnZW1lbnQKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwordWludDMyX3QgUGF0aENhY2hlOjpnZXRTaXplKCkgeworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgcmV0dXJuIG1TaXplOworfQorCit1aW50MzJfdCBQYXRoQ2FjaGU6OmdldE1heFNpemUoKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICByZXR1cm4gbU1heFNpemU7Cit9CisKK3ZvaWQgUGF0aENhY2hlOjpzZXRNYXhTaXplKHVpbnQzMl90IG1heFNpemUpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIG1NYXhTaXplID0gbWF4U2l6ZTsKKyAgICB3aGlsZSAobVNpemUgPiBtTWF4U2l6ZSkgeworICAgICAgICBtQ2FjaGUucmVtb3ZlT2xkZXN0KCk7CisgICAgfQorfQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBDYWxsYmFja3MKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwordm9pZCBQYXRoQ2FjaGU6Om9wZXJhdG9yKCkoUGF0aENhY2hlRW50cnkmIHBhdGgsIFBhdGhUZXh0dXJlKiYgdGV4dHVyZSkgeworICAgIGNvbnN0IHVpbnQzMl90IHNpemUgPSB0ZXh0dXJlLT53aWR0aCAqIHRleHR1cmUtPmhlaWdodDsKKyAgICBtU2l6ZSAtPSBzaXplOworCisgICAgaWYgKHRleHR1cmUpIHsKKyAgICAgICAgZ2xEZWxldGVUZXh0dXJlcygxLCAmdGV4dHVyZS0+aWQpOworICAgICAgICBkZWxldGUgdGV4dHVyZTsKKyAgICB9Cit9CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIENhY2hpbmcKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwordm9pZCBQYXRoQ2FjaGU6OnJlbW92ZShTa1BhdGgqIHBhdGgpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIC8vIFRPRE86IExpbmVhciBzZWFyY2guLi4KKyAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgbUNhY2hlLnNpemUoKTsgaSsrKSB7CisgICAgICAgIGlmIChtQ2FjaGUuZ2V0S2V5QXQoaSkucGF0aCA9PSBwYXRoKSB7CisgICAgICAgICAgICBtQ2FjaGUucmVtb3ZlQXQoaSk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK1BhdGhUZXh0dXJlKiBQYXRoQ2FjaGU6OmdldChTa1BhdGgqIHBhdGgsIFNrUGFpbnQqIHBhaW50KSB7CisgICAgUGF0aENhY2hlRW50cnkgZW50cnkocGF0aCwgcGFpbnQpOworCisgICAgbUxvY2subG9jaygpOworICAgIFBhdGhUZXh0dXJlKiB0ZXh0dXJlID0gbUNhY2hlLmdldChlbnRyeSk7CisgICAgbUxvY2sudW5sb2NrKCk7CisKKyAgICBpZiAoIXRleHR1cmUpIHsKKyAgICAgICAgdGV4dHVyZSA9IGFkZFRleHR1cmUoZW50cnksIHBhdGgsIHBhaW50KTsKKyAgICB9IGVsc2UgaWYgKHBhdGgtPmdldEdlbmVyYXRpb25JRCgpICE9IHRleHR1cmUtPmdlbmVyYXRpb24pIHsKKyAgICAgICAgbUxvY2subG9jaygpOworICAgICAgICBtQ2FjaGUucmVtb3ZlKGVudHJ5KTsKKyAgICAgICAgbUxvY2sudW5sb2NrKCk7CisgICAgICAgIHRleHR1cmUgPSBhZGRUZXh0dXJlKGVudHJ5LCBwYXRoLCBwYWludCk7CisgICAgfQorCisgICAgcmV0dXJuIHRleHR1cmU7Cit9CisKK1BhdGhUZXh0dXJlKiBQYXRoQ2FjaGU6OmFkZFRleHR1cmUoY29uc3QgUGF0aENhY2hlRW50cnkmIGVudHJ5LAorICAgICAgICBjb25zdCBTa1BhdGggKnBhdGgsIGNvbnN0IFNrUGFpbnQqIHBhaW50KSB7CisgICAgY29uc3QgU2tSZWN0JiBib3VuZHMgPSBwYXRoLT5nZXRCb3VuZHMoKTsKKworICAgIGNvbnN0IGZsb2F0IHBhdGhXaWR0aCA9IGJvdW5kcy53aWR0aCgpOworICAgIGNvbnN0IGZsb2F0IHBhdGhIZWlnaHQgPSBib3VuZHMuaGVpZ2h0KCk7CisKKyAgICBpZiAocGF0aFdpZHRoID4gbU1heFRleHR1cmVTaXplIHx8IHBhdGhIZWlnaHQgPiBtTWF4VGV4dHVyZVNpemUpIHsKKyAgICAgICAgTE9HVygiUGF0aCB0b28gbGFyZ2UgdG8gYmUgcmVuZGVyZWQgaW50byBhIHRleHR1cmUiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgY29uc3QgZmxvYXQgb2Zmc2V0ID0gZW50cnkuc3Ryb2tlV2lkdGggKiAxLjVmOworICAgIGNvbnN0IHVpbnQzMl90IHdpZHRoID0gdWludDMyX3QocGF0aFdpZHRoICsgb2Zmc2V0ICogMi4wICsgMC41KTsKKyAgICBjb25zdCB1aW50MzJfdCBoZWlnaHQgPSB1aW50MzJfdChwYXRoSGVpZ2h0ICsgb2Zmc2V0ICogMi4wICsgMC41KTsKKworICAgIGNvbnN0IHVpbnQzMl90IHNpemUgPSB3aWR0aCAqIGhlaWdodDsKKyAgICAvLyBEb24ndCBldmVuIHRyeSB0byBjYWNoZSBhIGJpdG1hcCB0aGF0J3MgYmlnZ2VyIHRoYW4gdGhlIGNhY2hlCisgICAgaWYgKHNpemUgPCBtTWF4U2l6ZSkgeworICAgICAgICBtTG9jay5sb2NrKCk7CisgICAgICAgIHdoaWxlIChtU2l6ZSArIHNpemUgPiBtTWF4U2l6ZSkgeworICAgICAgICAgICAgbUNhY2hlLnJlbW92ZU9sZGVzdCgpOworICAgICAgICB9CisgICAgICAgIG1Mb2NrLnVubG9jaygpOworICAgIH0KKworICAgIFBhdGhUZXh0dXJlKiB0ZXh0dXJlID0gbmV3IFBhdGhUZXh0dXJlOworICAgIHRleHR1cmUtPmxlZnQgPSBib3VuZHMuZkxlZnQ7CisgICAgdGV4dHVyZS0+dG9wID0gYm91bmRzLmZUb3A7CisgICAgdGV4dHVyZS0+b2Zmc2V0ID0gb2Zmc2V0OworICAgIHRleHR1cmUtPndpZHRoID0gd2lkdGg7CisgICAgdGV4dHVyZS0+aGVpZ2h0ID0gaGVpZ2h0OworICAgIHRleHR1cmUtPmdlbmVyYXRpb24gPSBwYXRoLT5nZXRHZW5lcmF0aW9uSUQoKTsKKworICAgIFNrQml0bWFwIGJpdG1hcDsKKyAgICBiaXRtYXAuc2V0Q29uZmlnKFNrQml0bWFwOjprQThfQ29uZmlnLCB3aWR0aCwgaGVpZ2h0KTsKKyAgICBiaXRtYXAuYWxsb2NQaXhlbHMoKTsKKyAgICBiaXRtYXAuZXJhc2VDb2xvcigwKTsKKworICAgIFNrQ2FudmFzIGNhbnZhcyhiaXRtYXApOworICAgIGNhbnZhcy50cmFuc2xhdGUoLWJvdW5kcy5mTGVmdCArIG9mZnNldCwgLWJvdW5kcy5mVG9wICsgb2Zmc2V0KTsKKyAgICBjYW52YXMuZHJhd1BhdGgoKnBhdGgsICpwYWludCk7CisKKyAgICBnZW5lcmF0ZVRleHR1cmUoYml0bWFwLCB0ZXh0dXJlKTsKKworICAgIGlmIChzaXplIDwgbU1heFNpemUpIHsKKyAgICAgICAgbUxvY2subG9jaygpOworICAgICAgICBtU2l6ZSArPSBzaXplOworICAgICAgICBtQ2FjaGUucHV0KGVudHJ5LCB0ZXh0dXJlKTsKKyAgICAgICAgbUxvY2sudW5sb2NrKCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgdGV4dHVyZS0+Y2xlYW51cCA9IHRydWU7CisgICAgfQorCisgICAgcmV0dXJuIHRleHR1cmU7Cit9CisKK3ZvaWQgUGF0aENhY2hlOjpjbGVhcigpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIG1DYWNoZS5jbGVhcigpOworfQorCit2b2lkIFBhdGhDYWNoZTo6Z2VuZXJhdGVUZXh0dXJlKFNrQml0bWFwJiBiaXRtYXAsIFRleHR1cmUqIHRleHR1cmUpIHsKKyAgICBTa0F1dG9Mb2NrUGl4ZWxzIGFscChiaXRtYXApOworICAgIGlmICghYml0bWFwLnJlYWR5VG9EcmF3KCkpIHsKKyAgICAgICAgTE9HRSgiQ2Fubm90IGdlbmVyYXRlIHRleHR1cmUgZnJvbSBiaXRtYXAiKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGdsR2VuVGV4dHVyZXMoMSwgJnRleHR1cmUtPmlkKTsKKworICAgIGdsQmluZFRleHR1cmUoR0xfVEVYVFVSRV8yRCwgdGV4dHVyZS0+aWQpOworICAgIC8vIFRleHR1cmVzIGFyZSBBbHBoYTgKKyAgICBnbFBpeGVsU3RvcmVpKEdMX1VOUEFDS19BTElHTk1FTlQsIDEpOworCisgICAgdGV4dHVyZS0+YmxlbmQgPSB0cnVlOworICAgIGdsVGV4SW1hZ2UyRChHTF9URVhUVVJFXzJELCAwLCBHTF9BTFBIQSwgdGV4dHVyZS0+d2lkdGgsIHRleHR1cmUtPmhlaWdodCwgMCwKKyAgICAgICAgICAgIEdMX0FMUEhBLCBHTF9VTlNJR05FRF9CWVRFLCBiaXRtYXAuZ2V0UGl4ZWxzKCkpOworCisgICAgZ2xUZXhQYXJhbWV0ZXJpKEdMX1RFWFRVUkVfMkQsIEdMX1RFWFRVUkVfTUlOX0ZJTFRFUiwgR0xfTElORUFSKTsKKyAgICBnbFRleFBhcmFtZXRlcmkoR0xfVEVYVFVSRV8yRCwgR0xfVEVYVFVSRV9NQUdfRklMVEVSLCBHTF9MSU5FQVIpOworCisgICAgZ2xUZXhQYXJhbWV0ZXJpKEdMX1RFWFRVUkVfMkQsIEdMX1RFWFRVUkVfV1JBUF9TLCBHTF9DTEFNUF9UT19FREdFKTsKKyAgICBnbFRleFBhcmFtZXRlcmkoR0xfVEVYVFVSRV8yRCwgR0xfVEVYVFVSRV9XUkFQX1QsIEdMX0NMQU1QX1RPX0VER0UpOworfQorCit9OyAvLyBuYW1lc3BhY2UgdWlyZW5kZXJlcgorfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2xpYnMvaHd1aS9QYXRoQ2FjaGUuaCBiL2xpYnMvaHd1aS9QYXRoQ2FjaGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZGUwZTdkCi0tLSAvZGV2L251bGwKKysrIGIvbGlicy9od3VpL1BhdGhDYWNoZS5oCkBAIC0wLDAgKzEsMTYxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX1VJX1BBVEhfQ0FDSEVfSAorI2RlZmluZSBBTkRST0lEX1VJX1BBVEhfQ0FDSEVfSAorCisjaW5jbHVkZSA8U2tCaXRtYXAuaD4KKyNpbmNsdWRlIDxTa1BhaW50Lmg+CisjaW5jbHVkZSA8U2tQYXRoLmg+CisKKyNpbmNsdWRlICJUZXh0dXJlLmgiCisjaW5jbHVkZSAiR2VuZXJhdGlvbkNhY2hlLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSB1aXJlbmRlcmVyIHsKKworLyoqCisgKiBEZXNjcmliZSBhIHBhdGggaW4gdGhlIHBhdGggY2FjaGUuCisgKi8KK3N0cnVjdCBQYXRoQ2FjaGVFbnRyeSB7CisgICAgUGF0aENhY2hlRW50cnkoKSB7CisgICAgICAgIHBhdGggPSBOVUxMOworICAgICAgICBqb2luID0gU2tQYWludDo6a0RlZmF1bHRfSm9pbjsKKyAgICAgICAgY2FwID0gU2tQYWludDo6a0RlZmF1bHRfQ2FwOworICAgICAgICBzdHlsZSA9IFNrUGFpbnQ6OmtGaWxsX1N0eWxlOworICAgICAgICBtaXRlciA9IDQuMGY7CisgICAgICAgIHN0cm9rZVdpZHRoID0gMS4wZjsKKyAgICB9CisKKyAgICBQYXRoQ2FjaGVFbnRyeShjb25zdCBQYXRoQ2FjaGVFbnRyeSYgZW50cnkpOgorICAgICAgICBwYXRoKGVudHJ5LnBhdGgpLCBqb2luKGVudHJ5LmpvaW4pLCBjYXAoZW50cnkuY2FwKSwKKyAgICAgICAgc3R5bGUoZW50cnkuc3R5bGUpLCBtaXRlcihlbnRyeS5taXRlciksCisgICAgICAgIHN0cm9rZVdpZHRoKGVudHJ5LnN0cm9rZVdpZHRoKSB7CisgICAgfQorCisgICAgUGF0aENhY2hlRW50cnkoU2tQYXRoKiBwYXRoLCBTa1BhaW50KiBwYWludCkgeworICAgICAgICB0aGlzLT5wYXRoID0gcGF0aDsKKyAgICAgICAgam9pbiA9IHBhaW50LT5nZXRTdHJva2VKb2luKCk7CisgICAgICAgIGNhcCA9IHBhaW50LT5nZXRTdHJva2VDYXAoKTsKKyAgICAgICAgbWl0ZXIgPSBwYWludC0+Z2V0U3Ryb2tlTWl0ZXIoKTsKKyAgICAgICAgc3Ryb2tlV2lkdGggPSBwYWludC0+Z2V0U3Ryb2tlV2lkdGgoKTsKKyAgICAgICAgc3R5bGUgPSBwYWludC0+Z2V0U3R5bGUoKTsKKyAgICB9CisKKyAgICBTa1BhdGgqIHBhdGg7CisgICAgU2tQYWludDo6Sm9pbiBqb2luOworICAgIFNrUGFpbnQ6OkNhcCBjYXA7CisgICAgU2tQYWludDo6U3R5bGUgc3R5bGU7CisgICAgZmxvYXQgbWl0ZXI7CisgICAgZmxvYXQgc3Ryb2tlV2lkdGg7CisKKyAgICBib29sIG9wZXJhdG9yPChjb25zdCBQYXRoQ2FjaGVFbnRyeSYgcmhzKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtZW1jbXAodGhpcywgJnJocywgc2l6ZW9mKFBhdGhDYWNoZUVudHJ5KSkgPCAwOworICAgIH0KK307IC8vIHN0cnVjdCBQYXRoQ2FjaGVFbnRyeQorCisvKioKKyAqIEFscGhhIHRleHR1cmUgdXNlZCB0byByZXByZXNlbnQgYSBwYXRoLgorICovCitzdHJ1Y3QgUGF0aFRleHR1cmU6IHB1YmxpYyBUZXh0dXJlIHsKKyAgICBQYXRoVGV4dHVyZSgpOiBUZXh0dXJlKCkgeworICAgIH0KKworICAgIC8qKgorICAgICAqIExlZnQgY29vcmRpbmF0ZSBvZiB0aGUgcGF0aCBib3VuZHMuCisgICAgICovCisgICAgZmxvYXQgbGVmdDsKKyAgICAvKioKKyAgICAgKiBUb3AgY29vcmRpbmF0ZSBvZiB0aGUgcGF0aCBib3VuZHMuCisgICAgICovCisgICAgZmxvYXQgdG9wOworICAgIC8qKgorICAgICAqIE9mZnNldCB0byBkcmF3IHRoZSBwYXRoIGF0IHRoZSBjb3JyZWN0IG9yaWdpbi4KKyAgICAgKi8KKyAgICBmbG9hdCBvZmZzZXQ7Cit9OyAvLyBzdHJ1Y3QgUGF0aFRleHR1cmUKKworLyoqCisgKiBBIHNpbXBsZSBMUlUgcGF0aCBjYWNoZS4gVGhlIGNhY2hlIGhhcyBhIG1heGltdW0gc2l6ZSBleHByZXNzZWQgaW4gYnl0ZXMuCisgKiBBbnkgdGV4dHVyZSBhZGRlZCB0byB0aGUgY2FjaGUgY2F1c2luZyB0aGUgY2FjaGUgdG8gZ3JvdyBiZXlvbmQgdGhlIG1heGltdW0KKyAqIGFsbG93ZWQgc2l6ZSB3aWxsIGFsc28gY2F1c2UgdGhlIG9sZGVzdCB0ZXh0dXJlIHRvIGJlIGtpY2tlZCBvdXQuCisgKi8KK2NsYXNzIFBhdGhDYWNoZTogcHVibGljIE9uRW50cnlSZW1vdmVkPFBhdGhDYWNoZUVudHJ5LCBQYXRoVGV4dHVyZSo+IHsKK3B1YmxpYzoKKyAgICBQYXRoQ2FjaGUoKTsKKyAgICBQYXRoQ2FjaGUodWludDMyX3QgbWF4Qnl0ZVNpemUpOworICAgIH5QYXRoQ2FjaGUoKTsKKworICAgIC8qKgorICAgICAqIFVzZWQgYXMgYSBjYWxsYmFjayB3aGVuIGFuIGVudHJ5IGlzIHJlbW92ZWQgZnJvbSB0aGUgY2FjaGUuCisgICAgICogRG8gbm90IGludm9rZSBkaXJlY3RseS4KKyAgICAgKi8KKyAgICB2b2lkIG9wZXJhdG9yKCkoUGF0aENhY2hlRW50cnkmIHBhdGgsIFBhdGhUZXh0dXJlKiYgdGV4dHVyZSk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSB0ZXh0dXJlIGFzc29jaWF0ZWQgd2l0aCB0aGUgc3BlY2lmaWVkIHBhdGguIElmIHRoZSB0ZXh0dXJlCisgICAgICogY2Fubm90IGJlIGZvdW5kIGluIHRoZSBjYWNoZSwgYSBuZXcgdGV4dHVyZSBpcyBnZW5lcmF0ZWQuCisgICAgICovCisgICAgUGF0aFRleHR1cmUqIGdldChTa1BhdGgqIHBhdGgsIFNrUGFpbnQqIHBhaW50KTsKKyAgICAvKioKKyAgICAgKiBDbGVhcnMgdGhlIGNhY2hlLiBUaGlzIGNhdXNlcyBhbGwgdGV4dHVyZXMgdG8gYmUgZGVsZXRlZC4KKyAgICAgKi8KKyAgICB2b2lkIGNsZWFyKCk7CisgICAgLyoqCisgICAgICogUmVtb3ZlcyBhbiBlbnRyeS4KKyAgICAgKi8KKyAgICB2b2lkIHJlbW92ZShTa1BhdGgqIHBhdGgpOworCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgbWF4aW11bSBzaXplIG9mIHRoZSBjYWNoZSBpbiBieXRlcy4KKyAgICAgKi8KKyAgICB2b2lkIHNldE1heFNpemUodWludDMyX3QgbWF4U2l6ZSk7CisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgbWF4aW11bSBzaXplIG9mIHRoZSBjYWNoZSBpbiBieXRlcy4KKyAgICAgKi8KKyAgICB1aW50MzJfdCBnZXRNYXhTaXplKCk7CisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgY3VycmVudCBzaXplIG9mIHRoZSBjYWNoZSBpbiBieXRlcy4KKyAgICAgKi8KKyAgICB1aW50MzJfdCBnZXRTaXplKCk7CisKK3ByaXZhdGU6CisgICAgLyoqCisgICAgICogR2VuZXJhdGVzIHRoZSB0ZXh0dXJlIGZyb20gYSBiaXRtYXAgaW50byB0aGUgc3BlY2lmaWVkIHRleHR1cmUgc3RydWN0dXJlLgorICAgICAqLworICAgIHZvaWQgZ2VuZXJhdGVUZXh0dXJlKFNrQml0bWFwJiBiaXRtYXAsIFRleHR1cmUqIHRleHR1cmUpOworCisgICAgUGF0aFRleHR1cmUqIGFkZFRleHR1cmUoY29uc3QgUGF0aENhY2hlRW50cnkmIGVudHJ5LCBjb25zdCBTa1BhdGggKnBhdGgsIGNvbnN0IFNrUGFpbnQqIHBhaW50KTsKKworICAgIHZvaWQgaW5pdCgpOworCisgICAgR2VuZXJhdGlvbkNhY2hlPFBhdGhDYWNoZUVudHJ5LCBQYXRoVGV4dHVyZSo+IG1DYWNoZTsKKworICAgIHVpbnQzMl90IG1TaXplOworICAgIHVpbnQzMl90IG1NYXhTaXplOworICAgIEdMdWludCBtTWF4VGV4dHVyZVNpemU7CisKKyAgICAvKioKKyAgICAgKiBVc2VkIHRvIGFjY2VzcyBtQ2FjaGUgYW5kIG1TaXplLiBBbGwgbWV0aG9kcyBhcmUgYWNjZXNzZWQgZnJvbSBhIHNpbmdsZQorICAgICAqIHRocmVhZCBleGNlcHQgZm9yIHJlbW92ZSgpLgorICAgICAqLworICAgIG11dGFibGUgTXV0ZXggbUxvY2s7Cit9OyAvLyBjbGFzcyBQYXRoQ2FjaGUKKworfTsgLy8gbmFtZXNwYWNlIHVpcmVuZGVyZXIKK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAvLyBBTkRST0lEX1VJX1BBVEhfQ0FDSEVfSApkaWZmIC0tZ2l0IGEvbGlicy9od3VpL1Byb2dyYW0uY3BwIGIvbGlicy9od3VpL1Byb2dyYW0uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY1MjhkOTEKLS0tIC9kZXYvbnVsbAorKysgYi9saWJzL2h3dWkvUHJvZ3JhbS5jcHAKQEAgLTAsMCArMSwxNDIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIk9wZW5HTFJlbmRlcmVyIgorCisjaW5jbHVkZSAiUHJvZ3JhbS5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgdWlyZW5kZXJlciB7CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIFNoYWRlcnMKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworI2RlZmluZSBTSEFERVJfU09VUkNFKG5hbWUsIHNvdXJjZSkgY29uc3QgY2hhciogbmFtZSA9ICNzb3VyY2UKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gQmFzZSBwcm9ncmFtCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK1Byb2dyYW06OlByb2dyYW0oY29uc3QgY2hhciogdmVydGV4LCBjb25zdCBjaGFyKiBmcmFnbWVudCkgeworICAgIHZlcnRleFNoYWRlciA9IGJ1aWxkU2hhZGVyKHZlcnRleCwgR0xfVkVSVEVYX1NIQURFUik7CisgICAgZnJhZ21lbnRTaGFkZXIgPSBidWlsZFNoYWRlcihmcmFnbWVudCwgR0xfRlJBR01FTlRfU0hBREVSKTsKKworICAgIGlkID0gZ2xDcmVhdGVQcm9ncmFtKCk7CisgICAgZ2xBdHRhY2hTaGFkZXIoaWQsIHZlcnRleFNoYWRlcik7CisgICAgZ2xBdHRhY2hTaGFkZXIoaWQsIGZyYWdtZW50U2hhZGVyKTsKKyAgICBnbExpbmtQcm9ncmFtKGlkKTsKKworICAgIEdMaW50IHN0YXR1czsKKyAgICBnbEdldFByb2dyYW1pdihpZCwgR0xfTElOS19TVEFUVVMsICZzdGF0dXMpOworICAgIGlmIChzdGF0dXMgIT0gR0xfVFJVRSkgeworICAgICAgICBHTGludCBpbmZvTGVuID0gMDsKKyAgICAgICAgZ2xHZXRQcm9ncmFtaXYoaWQsIEdMX0lORk9fTE9HX0xFTkdUSCwgJmluZm9MZW4pOworICAgICAgICBpZiAoaW5mb0xlbiA+IDEpIHsKKyAgICAgICAgICAgIGNoYXIqIGxvZyA9IChjaGFyKikgbWFsbG9jKHNpemVvZihjaGFyKSAqIGluZm9MZW4pOworICAgICAgICAgICAgZ2xHZXRQcm9ncmFtSW5mb0xvZyhpZCwgaW5mb0xlbiwgMCwgbG9nKTsKKyAgICAgICAgICAgIExPR0UoIkVycm9yIHdoaWxlIGxpbmtpbmcgc2hhZGVyczogJXMiLCBsb2cpOworICAgICAgICAgICAgZGVsZXRlIGxvZzsKKyAgICAgICAgfQorICAgICAgICBnbERlbGV0ZVNoYWRlcih2ZXJ0ZXhTaGFkZXIpOworICAgICAgICBnbERlbGV0ZVNoYWRlcihmcmFnbWVudFNoYWRlcik7CisgICAgICAgIGdsRGVsZXRlUHJvZ3JhbShpZCk7CisgICAgfQorCisgICAgbVVzZSA9IGZhbHNlOworCisgICAgcG9zaXRpb24gPSBhZGRBdHRyaWIoInBvc2l0aW9uIik7CisgICAgY29sb3IgPSBhZGRVbmlmb3JtKCJjb2xvciIpOworICAgIHRyYW5zZm9ybSA9IGFkZFVuaWZvcm0oInRyYW5zZm9ybSIpOworfQorCitQcm9ncmFtOjp+UHJvZ3JhbSgpIHsKKyAgICBnbERlbGV0ZVNoYWRlcih2ZXJ0ZXhTaGFkZXIpOworICAgIGdsRGVsZXRlU2hhZGVyKGZyYWdtZW50U2hhZGVyKTsKKyAgICBnbERlbGV0ZVByb2dyYW0oaWQpOworfQorCitpbnQgUHJvZ3JhbTo6YWRkQXR0cmliKGNvbnN0IGNoYXIqIG5hbWUpIHsKKyAgICBpbnQgc2xvdCA9IGdsR2V0QXR0cmliTG9jYXRpb24oaWQsIG5hbWUpOworICAgIGF0dHJpYnV0ZXMuYWRkKG5hbWUsIHNsb3QpOworICAgIHJldHVybiBzbG90OworfQorCitpbnQgUHJvZ3JhbTo6Z2V0QXR0cmliKGNvbnN0IGNoYXIqIG5hbWUpIHsKKyAgICBzc2l6ZV90IGluZGV4ID0gYXR0cmlidXRlcy5pbmRleE9mS2V5KG5hbWUpOworICAgIGlmIChpbmRleCA+PSAwKSB7CisgICAgICAgIHJldHVybiBhdHRyaWJ1dGVzLnZhbHVlQXQoaW5kZXgpOworICAgIH0KKyAgICByZXR1cm4gYWRkQXR0cmliKG5hbWUpOworfQorCitpbnQgUHJvZ3JhbTo6YWRkVW5pZm9ybShjb25zdCBjaGFyKiBuYW1lKSB7CisgICAgaW50IHNsb3QgPSBnbEdldFVuaWZvcm1Mb2NhdGlvbihpZCwgbmFtZSk7CisgICAgdW5pZm9ybXMuYWRkKG5hbWUsIHNsb3QpOworICAgIHJldHVybiBzbG90OworfQorCitpbnQgUHJvZ3JhbTo6Z2V0VW5pZm9ybShjb25zdCBjaGFyKiBuYW1lKSB7CisgICAgc3NpemVfdCBpbmRleCA9IHVuaWZvcm1zLmluZGV4T2ZLZXkobmFtZSk7CisgICAgaWYgKGluZGV4ID49IDApIHsKKyAgICAgICAgcmV0dXJuIHVuaWZvcm1zLnZhbHVlQXQoaW5kZXgpOworICAgIH0KKyAgICByZXR1cm4gYWRkVW5pZm9ybShuYW1lKTsKK30KKworR0x1aW50IFByb2dyYW06OmJ1aWxkU2hhZGVyKGNvbnN0IGNoYXIqIHNvdXJjZSwgR0xlbnVtIHR5cGUpIHsKKyAgICBHTHVpbnQgc2hhZGVyID0gZ2xDcmVhdGVTaGFkZXIodHlwZSk7CisgICAgZ2xTaGFkZXJTb3VyY2Uoc2hhZGVyLCAxLCAmc291cmNlLCAwKTsKKyAgICBnbENvbXBpbGVTaGFkZXIoc2hhZGVyKTsKKworICAgIEdMaW50IHN0YXR1czsKKyAgICBnbEdldFNoYWRlcml2KHNoYWRlciwgR0xfQ09NUElMRV9TVEFUVVMsICZzdGF0dXMpOworICAgIGlmIChzdGF0dXMgIT0gR0xfVFJVRSkgeworICAgICAgICAvLyBTb21lIGRyaXZlcnMgcmV0dXJuIHdyb25nIHZhbHVlcyBmb3IgR0xfSU5GT19MT0dfTEVOR1RICisgICAgICAgIC8vIHVzZSBhIGZpeGVkIHNpemUgaW5zdGVhZAorICAgICAgICBHTGNoYXIgbG9nWzUxMl07CisgICAgICAgIGdsR2V0U2hhZGVySW5mb0xvZyhzaGFkZXIsIHNpemVvZihsb2cpLCAwLCAmbG9nWzBdKTsKKyAgICAgICAgTE9HRSgiRXJyb3Igd2hpbGUgY29tcGlsaW5nIHNoYWRlcjogJXMiLCBsb2cpOworICAgICAgICBnbERlbGV0ZVNoYWRlcihzaGFkZXIpOworICAgIH0KKworICAgIHJldHVybiBzaGFkZXI7Cit9CisKK3ZvaWQgUHJvZ3JhbTo6c2V0KGNvbnN0IG1hdDQmIHByb2plY3Rpb25NYXRyaXgsIGNvbnN0IG1hdDQmIG1vZGVsVmlld01hdHJpeCwKKyAgICAgICAgY29uc3QgbWF0NCYgdHJhbnNmb3JtTWF0cml4KSB7CisgICAgbWF0NCB0KHByb2plY3Rpb25NYXRyaXgpOworICAgIHQubXVsdGlwbHkodHJhbnNmb3JtTWF0cml4KTsKKyAgICB0Lm11bHRpcGx5KG1vZGVsVmlld01hdHJpeCk7CisKKyAgICBnbFVuaWZvcm1NYXRyaXg0ZnYodHJhbnNmb3JtLCAxLCBHTF9GQUxTRSwgJnQuZGF0YVswXSk7Cit9CisKK3ZvaWQgUHJvZ3JhbTo6dXNlKCkgeworICAgIGdsVXNlUHJvZ3JhbShpZCk7CisgICAgbVVzZSA9IHRydWU7CisKKyAgICBnbEVuYWJsZVZlcnRleEF0dHJpYkFycmF5KHBvc2l0aW9uKTsKK30KKwordm9pZCBQcm9ncmFtOjpyZW1vdmUoKSB7CisgICAgbVVzZSA9IGZhbHNlOworCisgICAgZ2xEaXNhYmxlVmVydGV4QXR0cmliQXJyYXkocG9zaXRpb24pOworfQorCit9OyAvLyBuYW1lc3BhY2UgdWlyZW5kZXJlcgorfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2xpYnMvaHd1aS9Qcm9ncmFtLmggYi9saWJzL2h3dWkvUHJvZ3JhbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY1MzFjNzQKLS0tIC9kZXYvbnVsbAorKysgYi9saWJzL2h3dWkvUHJvZ3JhbS5oCkBAIC0wLDAgKzEsMTM0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX1VJX1BST0dSQU1fSAorI2RlZmluZSBBTkRST0lEX1VJX1BST0dSQU1fSAorCisjaW5jbHVkZSA8R0xFUzIvZ2wyLmg+CisjaW5jbHVkZSA8R0xFUzIvZ2wyZXh0Lmg+CisKKyNpbmNsdWRlIDx1dGlscy9LZXllZFZlY3Rvci5oPgorCisjaW5jbHVkZSAiTWF0cml4LmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSB1aXJlbmRlcmVyIHsKKworLyoqCisgKiBBIHByb2dyYW0gaG9sZHMgYSB2ZXJ0ZXggYW5kIGEgZnJhZ21lbnQgc2hhZGVyLiBJdCBvZmZlcnMgc2V2ZXJhbCB1dGlsaXR5CisgKiBtZXRob2RzIHRvIHF1ZXJ5IGF0dHJpYnV0ZXMgYW5kIHVuaWZvcm1zLgorICovCitjbGFzcyBQcm9ncmFtIHsKK3B1YmxpYzoKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgbmV3IHByb2dyYW0gd2l0aCB0aGUgc3BlY2lmaWVkIHZlcnRleCBhbmQgZnJhZ21lbnQKKyAgICAgKiBzaGFkZXJzIHNvdXJjZXMuCisgICAgICovCisgICAgUHJvZ3JhbShjb25zdCBjaGFyKiB2ZXJ0ZXgsIGNvbnN0IGNoYXIqIGZyYWdtZW50KTsKKyAgICB2aXJ0dWFsIH5Qcm9ncmFtKCk7CisKKyAgICAvKioKKyAgICAgKiBCaW5kcyB0aGlzIHByb2dyYW0gdG8gdGhlIEdMIGNvbnRleHQuCisgICAgICovCisgICAgdmlydHVhbCB2b2lkIHVzZSgpOworCisgICAgLyoqCisgICAgICogTWFya3MgdGhpcyBwcm9ncmFtIGFzIHVudXNlZC4gVGhpcyB3aWxsIG5vdCB1bmJpbmQKKyAgICAgKiB0aGUgcHJvZ3JhbSBmcm9tIHRoZSBHTCBjb250ZXh0LgorICAgICAqLworICAgIHZpcnR1YWwgdm9pZCByZW1vdmUoKTsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIE9wZW5HTCBuYW1lIG9mIHRoZSBzcGVjaWZpZWQgYXR0cmlidXRlLgorICAgICAqLworICAgIGludCBnZXRBdHRyaWIoY29uc3QgY2hhciogbmFtZSk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBPcGVuR0wgbmFtZSBvZiB0aGUgc3BlY2lmaWVkIHVuaWZvcm0uCisgICAgICovCisgICAgaW50IGdldFVuaWZvcm0oY29uc3QgY2hhciogbmFtZSk7CisKKyAgICAvKioKKyAgICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGlzIHByb2dyYW0gaXMgY3VycmVudGx5IGluIHVzZSB3aXRoCisgICAgICogdGhlIEdMIGNvbnRleHQuCisgICAgICovCisgICAgaW5saW5lIGJvb2wgaXNJblVzZSgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1Vc2U7CisgICAgfQorCisgICAgLyoqCisgICAgICogQmluZHMgdGhlIHByb2dyYW0gd2l0aCB0aGUgc3BlY2lmaWVkIHByb2plY3Rpb24sIG1vZGVsVmlldyBhbmQKKyAgICAgKiB0cmFuc2Zvcm0gbWF0cmljZXMuCisgICAgICovCisgICAgdm9pZCBzZXQoY29uc3QgbWF0NCYgcHJvamVjdGlvbk1hdHJpeCwgY29uc3QgbWF0NCYgbW9kZWxWaWV3TWF0cml4LAorICAgICAgICAgICAgIGNvbnN0IG1hdDQmIHRyYW5zZm9ybU1hdHJpeCk7CisKKyAgICAvKioKKyAgICAgKiBOYW1lIG9mIHRoZSBwb3NpdGlvbiBhdHRyaWJ1dGUuCisgICAgICovCisgICAgaW50IHBvc2l0aW9uOworCisgICAgLyoqCisgICAgICogTmFtZSBvZiB0aGUgY29sb3IgdW5pZm9ybS4KKyAgICAgKi8KKyAgICBpbnQgY29sb3I7CisKKyAgICAvKioKKyAgICAgKiBOYW1lIG9mIHRoZSB0cmFuc2Zvcm0gdW5pZm9ybS4KKyAgICAgKi8KKyAgICBpbnQgdHJhbnNmb3JtOworCitwcm90ZWN0ZWQ6CisgICAgLyoqCisgICAgICogQWRkcyBhbiBhdHRyaWJ1dGUgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFRoZSBPcGVuR0wgbmFtZSBvZiB0aGUgYXR0cmlidXRlLgorICAgICAqLworICAgIGludCBhZGRBdHRyaWIoY29uc3QgY2hhciogbmFtZSk7CisKKyAgICAvKioKKyAgICAgKiBBZGRzIGEgdW5pZm9ybSB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gVGhlIE9wZW5HTCBuYW1lIG9mIHRoZSB1bmlmb3JtLgorICAgICAqLworICAgIGludCBhZGRVbmlmb3JtKGNvbnN0IGNoYXIqIG5hbWUpOworCitwcml2YXRlOgorICAgIC8qKgorICAgICAqIENvbXBpbGVzIHRoZSBzcGVjaWZpZWQgc2hhZGVyIG9mIHRoZSBzcGVjaWZpZWQgdHlwZS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gVGhlIG5hbWUgb2YgdGhlIGNvbXBpbGVkIHNoYWRlci4KKyAgICAgKi8KKyAgICBHTHVpbnQgYnVpbGRTaGFkZXIoY29uc3QgY2hhciogc291cmNlLCBHTGVudW0gdHlwZSk7CisKKyAgICAvLyBOYW1lIG9mIHRoZSBPcGVuR0wgcHJvZ3JhbQorICAgIEdMdWludCBpZDsKKworICAgIC8vIE5hbWUgb2YgdGhlIHNoYWRlcnMKKyAgICBHTHVpbnQgdmVydGV4U2hhZGVyOworICAgIEdMdWludCBmcmFnbWVudFNoYWRlcjsKKworICAgIC8vIEtlZXBzIHRyYWNrIG9mIGF0dHJpYnV0ZXMgYW5kIHVuaWZvcm1zIHNsb3RzCisgICAgS2V5ZWRWZWN0b3I8Y29uc3QgY2hhciosIGludD4gYXR0cmlidXRlczsKKyAgICBLZXllZFZlY3Rvcjxjb25zdCBjaGFyKiwgaW50PiB1bmlmb3JtczsKKworICAgIGJvb2wgbVVzZTsKK307IC8vIGNsYXNzIFByb2dyYW0KKworfTsgLy8gbmFtZXNwYWNlIHVpcmVuZGVyZXIKK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAvLyBBTkRST0lEX1VJX1BST0dSQU1fSApkaWZmIC0tZ2l0IGEvbGlicy9od3VpL1Byb2dyYW1DYWNoZS5jcHAgYi9saWJzL2h3dWkvUHJvZ3JhbUNhY2hlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZWNiYzIyCi0tLSAvZGV2L251bGwKKysrIGIvbGlicy9od3VpL1Byb2dyYW1DYWNoZS5jcHAKQEAgLTAsMCArMSw0NTggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIk9wZW5HTFJlbmRlcmVyIgorCisjaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgorCisjaW5jbHVkZSAiUHJvZ3JhbUNhY2hlLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSB1aXJlbmRlcmVyIHsKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gVmVydGV4IHNoYWRlcnMgc25pcHBldHMKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworY29uc3QgY2hhciogZ1ZTX0hlYWRlcl9BdHRyaWJ1dGVzID0KKyAgICAgICAgImF0dHJpYnV0ZSB2ZWM0IHBvc2l0aW9uO1xuIjsKK2NvbnN0IGNoYXIqIGdWU19IZWFkZXJfQXR0cmlidXRlc19UZXhDb29yZHMgPQorICAgICAgICAiYXR0cmlidXRlIHZlYzIgdGV4Q29vcmRzO1xuIjsKK2NvbnN0IGNoYXIqIGdWU19IZWFkZXJfVW5pZm9ybXMgPQorICAgICAgICAidW5pZm9ybSBtYXQ0IHRyYW5zZm9ybTtcbiI7Citjb25zdCBjaGFyKiBnVlNfSGVhZGVyX1VuaWZvcm1zX0hhc0dyYWRpZW50ID0KKyAgICAgICAgInVuaWZvcm0gZmxvYXQgZ3JhZGllbnRMZW5ndGg7XG4iCisgICAgICAgICJ1bmlmb3JtIHZlYzIgZ3JhZGllbnQ7XG4iCisgICAgICAgICJ1bmlmb3JtIHZlYzIgZ3JhZGllbnRTdGFydDtcbiIKKyAgICAgICAgInVuaWZvcm0gbWF0NCBzY3JlZW5TcGFjZTtcbiI7Citjb25zdCBjaGFyKiBnVlNfSGVhZGVyX1VuaWZvcm1zX0hhc0JpdG1hcCA9CisgICAgICAgICJ1bmlmb3JtIG1hdDQgdGV4dHVyZVRyYW5zZm9ybTtcbiIKKyAgICAgICAgInVuaWZvcm0gdmVjMiB0ZXh0dXJlRGltZW5zaW9uO1xuIjsKK2NvbnN0IGNoYXIqIGdWU19IZWFkZXJfVmFyeWluZ3NfSGFzVGV4dHVyZSA9CisgICAgICAgICJ2YXJ5aW5nIHZlYzIgb3V0VGV4Q29vcmRzO1xuIjsKK2NvbnN0IGNoYXIqIGdWU19IZWFkZXJfVmFyeWluZ3NfSGFzQml0bWFwID0KKyAgICAgICAgInZhcnlpbmcgdmVjMiBvdXRCaXRtYXBUZXhDb29yZHM7XG4iOworY29uc3QgY2hhciogZ1ZTX0hlYWRlcl9WYXJ5aW5nc19IYXNHcmFkaWVudCA9CisgICAgICAgICJ2YXJ5aW5nIGZsb2F0IGluZGV4O1xuIjsKK2NvbnN0IGNoYXIqIGdWU19NYWluID0KKyAgICAgICAgIlxudm9pZCBtYWluKHZvaWQpIHtcbiI7Citjb25zdCBjaGFyKiBnVlNfTWFpbl9PdXRUZXhDb29yZHMgPQorICAgICAgICAiICAgIG91dFRleENvb3JkcyA9IHRleENvb3JkcztcbiI7Citjb25zdCBjaGFyKiBnVlNfTWFpbl9PdXRHcmFkaWVudEluZGV4ID0KKyAgICAgICAgIiAgICB2ZWM0IGxvY2F0aW9uID0gc2NyZWVuU3BhY2UgKiBwb3NpdGlvbjtcbiIKKyAgICAgICAgIiAgICBpbmRleCA9IGRvdChsb2NhdGlvbi54eSAtIGdyYWRpZW50U3RhcnQsIGdyYWRpZW50KSAqIGdyYWRpZW50TGVuZ3RoO1xuIjsKK2NvbnN0IGNoYXIqIGdWU19NYWluX091dEJpdG1hcFRleENvb3JkcyA9CisgICAgICAgICIgICAgdmVjNCBiaXRtYXBDb29yZHMgPSB0ZXh0dXJlVHJhbnNmb3JtICogcG9zaXRpb247XG4iCisgICAgICAgICIgICAgb3V0Qml0bWFwVGV4Q29vcmRzID0gYml0bWFwQ29vcmRzLnh5ICogdGV4dHVyZURpbWVuc2lvbjtcbiI7Citjb25zdCBjaGFyKiBnVlNfTWFpbl9Qb3NpdGlvbiA9CisgICAgICAgICIgICAgZ2xfUG9zaXRpb24gPSB0cmFuc2Zvcm0gKiBwb3NpdGlvbjtcbiI7Citjb25zdCBjaGFyKiBnVlNfRm9vdGVyID0KKyAgICAgICAgIn1cblxuIjsKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gRnJhZ21lbnQgc2hhZGVycyBzbmlwcGV0cworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitjb25zdCBjaGFyKiBnRlNfSGVhZGVyX0V4dGVuc2lvbl9GcmFtZWJ1ZmZlckZldGNoID0KKyAgICAgICAgIiNleHRlbnNpb24gR0xfTlZfc2hhZGVyX2ZyYW1lYnVmZmVyX2ZldGNoIDogZW5hYmxlXG5cbiI7Citjb25zdCBjaGFyKiBnRlNfSGVhZGVyID0KKyAgICAgICAgInByZWNpc2lvbiBtZWRpdW1wIGZsb2F0O1xuXG4iOworY29uc3QgY2hhciogZ0ZTX1VuaWZvcm1zX0NvbG9yID0KKyAgICAgICAgInVuaWZvcm0gdmVjNCBjb2xvcjtcbiI7Citjb25zdCBjaGFyKiBnRlNfVW5pZm9ybXNfVGV4dHVyZVNhbXBsZXIgPQorICAgICAgICAidW5pZm9ybSBzYW1wbGVyMkQgc2FtcGxlcjtcbiI7Citjb25zdCBjaGFyKiBnRlNfVW5pZm9ybXNfR3JhZGllbnRTYW1wbGVyID0KKyAgICAgICAgInVuaWZvcm0gc2FtcGxlcjJEIGdyYWRpZW50U2FtcGxlcjtcbiI7Citjb25zdCBjaGFyKiBnRlNfVW5pZm9ybXNfQml0bWFwU2FtcGxlciA9CisgICAgICAgICJ1bmlmb3JtIHNhbXBsZXIyRCBiaXRtYXBTYW1wbGVyO1xuIjsKK2NvbnN0IGNoYXIqIGdGU19Vbmlmb3Jtc19Db2xvck9wWzRdID0geworICAgICAgICAvLyBOb25lCisgICAgICAgICIiLAorICAgICAgICAvLyBNYXRyaXgKKyAgICAgICAgInVuaWZvcm0gbWF0NCBjb2xvck1hdHJpeDtcbiIKKyAgICAgICAgInVuaWZvcm0gdmVjNCBjb2xvck1hdHJpeFZlY3RvcjtcbiIsCisgICAgICAgIC8vIExpZ2h0aW5nCisgICAgICAgICJ1bmlmb3JtIHZlYzQgbGlnaHRpbmdNdWw7XG4iCisgICAgICAgICJ1bmlmb3JtIHZlYzQgbGlnaHRpbmdBZGQ7XG4iLAorICAgICAgICAvLyBQb3J0ZXJEdWZmCisgICAgICAgICJ1bmlmb3JtIHZlYzQgY29sb3JCbGVuZDtcbiIKK307Citjb25zdCBjaGFyKiBnRlNfTWFpbiA9CisgICAgICAgICJcbnZvaWQgbWFpbih2b2lkKSB7XG4iCisgICAgICAgICIgICAgbG93cCB2ZWM0IGZyYWdDb2xvcjtcbiI7Citjb25zdCBjaGFyKiBnRlNfTWFpbl9GZXRjaENvbG9yID0KKyAgICAgICAgIiAgICBmcmFnQ29sb3IgPSBjb2xvcjtcbiI7Citjb25zdCBjaGFyKiBnRlNfTWFpbl9GZXRjaFRleHR1cmUgPQorICAgICAgICAiICAgIGZyYWdDb2xvciA9IGNvbG9yICogdGV4dHVyZTJEKHNhbXBsZXIsIG91dFRleENvb3Jkcyk7XG4iOworY29uc3QgY2hhciogZ0ZTX01haW5fRmV0Y2hBOFRleHR1cmUgPQorICAgICAgICAiICAgIGZyYWdDb2xvciA9IGNvbG9yICogdGV4dHVyZTJEKHNhbXBsZXIsIG91dFRleENvb3JkcykuYTtcbiI7Citjb25zdCBjaGFyKiBnRlNfTWFpbl9GZXRjaEdyYWRpZW50ID0KKyAgICAgICAgIiAgICB2ZWM0IGdyYWRpZW50Q29sb3IgPSB0ZXh0dXJlMkQoZ3JhZGllbnRTYW1wbGVyLCB2ZWMyKGluZGV4LCAwLjUpKTtcbiI7Citjb25zdCBjaGFyKiBnRlNfTWFpbl9GZXRjaEJpdG1hcCA9CisgICAgICAgICIgICAgdmVjNCBiaXRtYXBDb2xvciA9IHRleHR1cmUyRChiaXRtYXBTYW1wbGVyLCBvdXRCaXRtYXBUZXhDb29yZHMpO1xuIjsKK2NvbnN0IGNoYXIqIGdGU19NYWluX0ZldGNoQml0bWFwTnBvdCA9CisgICAgICAgICIgICAgdmVjNCBiaXRtYXBDb2xvciA9IHRleHR1cmUyRChiaXRtYXBTYW1wbGVyLCB3cmFwKG91dEJpdG1hcFRleENvb3JkcykpO1xuIjsKK2NvbnN0IGNoYXIqIGdGU19NYWluX0JsZW5kU2hhZGVyc0JHID0KKyAgICAgICAgIiAgICBmcmFnQ29sb3IgPSBibGVuZFNoYWRlcnMoZ3JhZGllbnRDb2xvciwgYml0bWFwQ29sb3IpIjsKK2NvbnN0IGNoYXIqIGdGU19NYWluX0JsZW5kU2hhZGVyc0dCID0KKyAgICAgICAgIiAgICBmcmFnQ29sb3IgPSBibGVuZFNoYWRlcnMoYml0bWFwQ29sb3IsIGdyYWRpZW50Q29sb3IpIjsKK2NvbnN0IGNoYXIqIGdGU19NYWluX0JsZW5kU2hhZGVyc19Nb2R1bGF0ZSA9CisgICAgICAgICIgKiBmcmFnQ29sb3IuYTtcbiI7Citjb25zdCBjaGFyKiBnRlNfTWFpbl9HcmFkaWVudFNoYWRlcl9Nb2R1bGF0ZSA9CisgICAgICAgICIgICAgZnJhZ0NvbG9yID0gZ3JhZGllbnRDb2xvciAqIGZyYWdDb2xvci5hO1xuIjsKK2NvbnN0IGNoYXIqIGdGU19NYWluX0JpdG1hcFNoYWRlcl9Nb2R1bGF0ZSA9CisgICAgICAgICIgICAgZnJhZ0NvbG9yID0gYml0bWFwQ29sb3IgKiBmcmFnQ29sb3IuYTtcbiI7Citjb25zdCBjaGFyKiBnRlNfTWFpbl9GcmFnQ29sb3IgPQorICAgICAgICAiICAgIGdsX0ZyYWdDb2xvciA9IGZyYWdDb2xvcjtcbiI7Citjb25zdCBjaGFyKiBnRlNfTWFpbl9GcmFnQ29sb3JfQmxlbmQgPQorICAgICAgICAiICAgIGdsX0ZyYWdDb2xvciA9IGJsZW5kRnJhbWVidWZmZXIoZnJhZ0NvbG9yLCBnbF9MYXN0RnJhZ0NvbG9yKTtcbiI7Citjb25zdCBjaGFyKiBnRlNfTWFpbl9GcmFnQ29sb3JfQmxlbmRfU3dhcCA9CisgICAgICAgICIgICAgZ2xfRnJhZ0NvbG9yID0gYmxlbmRGcmFtZWJ1ZmZlcihnbF9MYXN0RnJhZ0NvbG9yLCBmcmFnQ29sb3IpO1xuIjsKK2NvbnN0IGNoYXIqIGdGU19NYWluX0FwcGx5Q29sb3JPcFs0XSA9IHsKKyAgICAgICAgLy8gTm9uZQorICAgICAgICAiIiwKKyAgICAgICAgLy8gTWF0cml4CisgICAgICAgIC8vIFRPRE86IEZpeCBwcmVtdWx0aXBsaWVkIGFscGhhIGNvbXB1dGF0aW9ucyBmb3IgY29sb3IgbWF0cml4CisgICAgICAgICIgICAgZnJhZ0NvbG9yICo9IGNvbG9yTWF0cml4O1xuIgorICAgICAgICAiICAgIGZyYWdDb2xvciArPSBjb2xvck1hdHJpeFZlY3RvcjtcbiIKKyAgICAgICAgIiAgICBmcmFnQ29sb3IucmdiICo9IGZyYWdDb2xvci5hO1xuIiwKKyAgICAgICAgLy8gTGlnaHRpbmcKKyAgICAgICAgIiAgICBmbG9hdCBsaWdodGluZ0FscGhhID0gZnJhZ0NvbG9yLmE7XG4iCisgICAgICAgICIgICAgZnJhZ0NvbG9yID0gbWluKGZyYWdDb2xvciAqIGxpZ2h0aW5nTXVsICsgKGxpZ2h0aW5nQWRkICogbGlnaHRpbmdBbHBoYSksIGxpZ2h0aW5nQWxwaGEpO1xuIgorICAgICAgICAiICAgIGZyYWdDb2xvci5hID0gbGlnaHRpbmdBbHBoYTtcbiIsCisgICAgICAgIC8vIFBvcnRlckR1ZmYKKyAgICAgICAgIiAgICBmcmFnQ29sb3IgPSBibGVuZENvbG9ycyhjb2xvckJsZW5kLCBmcmFnQ29sb3IpO1xuIgorfTsKK2NvbnN0IGNoYXIqIGdGU19Gb290ZXIgPQorICAgICAgICAifVxuXG4iOworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBQb3J0ZXJEdWZmIHNuaXBwZXRzCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK2NvbnN0IGNoYXIqIGdCbGVuZE9wc1sxOF0gPSB7CisgICAgICAgIC8vIENsZWFyCisgICAgICAgICJyZXR1cm4gdmVjNCgwLjAsIDAuMCwgMC4wLCAwLjApO1xuIiwKKyAgICAgICAgLy8gU3JjCisgICAgICAgICJyZXR1cm4gc3JjO1xuIiwKKyAgICAgICAgLy8gRHN0CisgICAgICAgICJyZXR1cm4gZHN0O1xuIiwKKyAgICAgICAgLy8gU3JjT3ZlcgorICAgICAgICAicmV0dXJuIHNyYyArIGRzdCAqICgxLjAgLSBzcmMuYSk7XG4iLAorICAgICAgICAvLyBEc3RPdmVyCisgICAgICAgICJyZXR1cm4gZHN0ICsgc3JjICogKDEuMCAtIGRzdC5hKTtcbiIsCisgICAgICAgIC8vIFNyY0luCisgICAgICAgICJyZXR1cm4gc3JjICogZHN0LmE7XG4iLAorICAgICAgICAvLyBEc3RJbgorICAgICAgICAicmV0dXJuIGRzdCAqIHNyYy5hO1xuIiwKKyAgICAgICAgLy8gU3JjT3V0CisgICAgICAgICJyZXR1cm4gc3JjICogKDEuMCAtIGRzdC5hKTtcbiIsCisgICAgICAgIC8vIERzdE91dAorICAgICAgICAicmV0dXJuIGRzdCAqICgxLjAgLSBzcmMuYSk7XG4iLAorICAgICAgICAvLyBTcmNBdG9wCisgICAgICAgICJyZXR1cm4gdmVjNChzcmMucmdiICogZHN0LmEgKyAoMS4wIC0gc3JjLmEpICogZHN0LnJnYiwgZHN0LmEpO1xuIiwKKyAgICAgICAgLy8gRHN0QXRvcAorICAgICAgICAicmV0dXJuIHZlYzQoZHN0LnJnYiAqIHNyYy5hICsgKDEuMCAtIGRzdC5hKSAqIHNyYy5yZ2IsIHNyYy5hKTtcbiIsCisgICAgICAgIC8vIFhvcgorICAgICAgICAicmV0dXJuIHZlYzQoc3JjLnJnYiAqICgxLjAgLSBkc3QuYSkgKyAoMS4wIC0gc3JjLmEpICogZHN0LnJnYiwgIgorICAgICAgICAgICAgICAgICJzcmMuYSArIGRzdC5hIC0gMi4wICogc3JjLmEgKiBkc3QuYSk7XG4iLAorICAgICAgICAvLyBBZGQKKyAgICAgICAgInJldHVybiBtaW4oc3JjICsgZHN0LCAxLjApO1xuIiwKKyAgICAgICAgLy8gTXVsdGlwbHkKKyAgICAgICAgInJldHVybiBzcmMgKiBkc3Q7XG4iLAorICAgICAgICAvLyBTY3JlZW4KKyAgICAgICAgInJldHVybiBzcmMgKyBkc3QgLSBzcmMgKiBkc3Q7XG4iLAorICAgICAgICAvLyBPdmVybGF5CisgICAgICAgICJyZXR1cm4gY2xhbXAodmVjNChtaXgoIgorICAgICAgICAgICAgICAgICIyLjAgKiBzcmMucmdiICogZHN0LnJnYiArIHNyYy5yZ2IgKiAoMS4wIC0gZHN0LmEpICsgZHN0LnJnYiAqICgxLjAgLSBzcmMuYSksICIKKyAgICAgICAgICAgICAgICAic3JjLmEgKiBkc3QuYSAtIDIuMCAqIChkc3QuYSAtIGRzdC5yZ2IpICogKHNyYy5hIC0gc3JjLnJnYikgKyBzcmMucmdiICogKDEuMCAtIGRzdC5hKSArIGRzdC5yZ2IgKiAoMS4wIC0gc3JjLmEpLCAiCisgICAgICAgICAgICAgICAgInN0ZXAoZHN0LmEsIDIuMCAqIGRzdC5yZ2IpKSwgIgorICAgICAgICAgICAgICAgICJzcmMuYSArIGRzdC5hIC0gc3JjLmEgKiBkc3QuYSksIDAuMCwgMS4wKTtcbiIsCisgICAgICAgIC8vIERhcmtlbgorICAgICAgICAicmV0dXJuIHZlYzQoc3JjLnJnYiAqICgxLjAgLSBkc3QuYSkgKyAoMS4wIC0gc3JjLmEpICogZHN0LnJnYiArICIKKyAgICAgICAgICAgICAgICAibWluKHNyYy5yZ2IgKiBkc3QuYSwgZHN0LnJnYiAqIHNyYy5hKSwgc3JjLmEgKyBkc3QuYSAtIHNyYy5hICogZHN0LmEpO1xuIiwKKyAgICAgICAgLy8gTGlnaHRlbgorICAgICAgICAicmV0dXJuIHZlYzQoc3JjLnJnYiAqICgxLjAgLSBkc3QuYSkgKyAoMS4wIC0gc3JjLmEpICogZHN0LnJnYiArICIKKyAgICAgICAgICAgICAgICAibWF4KHNyYy5yZ2IgKiBkc3QuYSwgZHN0LnJnYiAqIHNyYy5hKSwgc3JjLmEgKyBkc3QuYSAtIHNyYy5hICogZHN0LmEpO1xuIiwKK307CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIENvbnN0cnVjdG9ycy9kZXN0cnVjdG9ycworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitQcm9ncmFtQ2FjaGU6OlByb2dyYW1DYWNoZSgpIHsKK30KKworUHJvZ3JhbUNhY2hlOjp+UHJvZ3JhbUNhY2hlKCkgeworICAgIGNsZWFyKCk7Cit9CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIENhY2hlIG1hbmFnZW1lbnQKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwordm9pZCBQcm9ncmFtQ2FjaGU6OmNsZWFyKCkgeworICAgIHNpemVfdCBjb3VudCA9IG1DYWNoZS5zaXplKCk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisgICAgICAgIGRlbGV0ZSBtQ2FjaGUudmFsdWVBdChpKTsKKyAgICB9CisgICAgbUNhY2hlLmNsZWFyKCk7Cit9CisKK1Byb2dyYW0qIFByb2dyYW1DYWNoZTo6Z2V0KGNvbnN0IFByb2dyYW1EZXNjcmlwdGlvbiYgZGVzY3JpcHRpb24pIHsKKyAgICBwcm9ncmFtaWQga2V5ID0gZGVzY3JpcHRpb24ua2V5KCk7CisgICAgc3NpemVfdCBpbmRleCA9IG1DYWNoZS5pbmRleE9mS2V5KGtleSk7CisgICAgUHJvZ3JhbSogcHJvZ3JhbSA9IE5VTEw7CisgICAgaWYgKGluZGV4IDwgMCkgeworICAgICAgICBQUk9HUkFNX0xPR0QoIkNvdWxkIG5vdCBmaW5kIHByb2dyYW0gd2l0aCBrZXkgMHgleCIsIGtleSk7CisgICAgICAgIHByb2dyYW0gPSBnZW5lcmF0ZVByb2dyYW0oZGVzY3JpcHRpb24sIGtleSk7CisgICAgICAgIG1DYWNoZS5hZGQoa2V5LCBwcm9ncmFtKTsKKyAgICB9IGVsc2UgeworICAgICAgICBwcm9ncmFtID0gbUNhY2hlLnZhbHVlQXQoaW5kZXgpOworICAgIH0KKyAgICByZXR1cm4gcHJvZ3JhbTsKK30KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gUHJvZ3JhbSBnZW5lcmF0aW9uCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK1Byb2dyYW0qIFByb2dyYW1DYWNoZTo6Z2VuZXJhdGVQcm9ncmFtKGNvbnN0IFByb2dyYW1EZXNjcmlwdGlvbiYgZGVzY3JpcHRpb24sIHByb2dyYW1pZCBrZXkpIHsKKyAgICBTdHJpbmc4IHZlcnRleFNoYWRlciA9IGdlbmVyYXRlVmVydGV4U2hhZGVyKGRlc2NyaXB0aW9uKTsKKyAgICBTdHJpbmc4IGZyYWdtZW50U2hhZGVyID0gZ2VuZXJhdGVGcmFnbWVudFNoYWRlcihkZXNjcmlwdGlvbik7CisKKyAgICBQcm9ncmFtKiBwcm9ncmFtID0gbmV3IFByb2dyYW0odmVydGV4U2hhZGVyLnN0cmluZygpLCBmcmFnbWVudFNoYWRlci5zdHJpbmcoKSk7CisgICAgcmV0dXJuIHByb2dyYW07Cit9CisKK1N0cmluZzggUHJvZ3JhbUNhY2hlOjpnZW5lcmF0ZVZlcnRleFNoYWRlcihjb25zdCBQcm9ncmFtRGVzY3JpcHRpb24mIGRlc2NyaXB0aW9uKSB7CisgICAgLy8gQWRkIGF0dHJpYnV0ZXMKKyAgICBTdHJpbmc4IHNoYWRlcihnVlNfSGVhZGVyX0F0dHJpYnV0ZXMpOworICAgIGlmIChkZXNjcmlwdGlvbi5oYXNUZXh0dXJlKSB7CisgICAgICAgIHNoYWRlci5hcHBlbmQoZ1ZTX0hlYWRlcl9BdHRyaWJ1dGVzX1RleENvb3Jkcyk7CisgICAgfQorICAgIC8vIFVuaWZvcm1zCisgICAgc2hhZGVyLmFwcGVuZChnVlNfSGVhZGVyX1VuaWZvcm1zKTsKKyAgICBpZiAoZGVzY3JpcHRpb24uaGFzR3JhZGllbnQpIHsKKyAgICAgICAgc2hhZGVyLmFwcGVuZChnVlNfSGVhZGVyX1VuaWZvcm1zX0hhc0dyYWRpZW50KTsKKyAgICB9CisgICAgaWYgKGRlc2NyaXB0aW9uLmhhc0JpdG1hcCkgeworICAgICAgICBzaGFkZXIuYXBwZW5kKGdWU19IZWFkZXJfVW5pZm9ybXNfSGFzQml0bWFwKTsKKyAgICB9CisgICAgLy8gVmFyeWluZ3MKKyAgICBpZiAoZGVzY3JpcHRpb24uaGFzVGV4dHVyZSkgeworICAgICAgICBzaGFkZXIuYXBwZW5kKGdWU19IZWFkZXJfVmFyeWluZ3NfSGFzVGV4dHVyZSk7CisgICAgfQorICAgIGlmIChkZXNjcmlwdGlvbi5oYXNHcmFkaWVudCkgeworICAgICAgICBzaGFkZXIuYXBwZW5kKGdWU19IZWFkZXJfVmFyeWluZ3NfSGFzR3JhZGllbnQpOworICAgIH0KKyAgICBpZiAoZGVzY3JpcHRpb24uaGFzQml0bWFwKSB7CisgICAgICAgIHNoYWRlci5hcHBlbmQoZ1ZTX0hlYWRlcl9WYXJ5aW5nc19IYXNCaXRtYXApOworICAgIH0KKworICAgIC8vIEJlZ2luIHRoZSBzaGFkZXIKKyAgICBzaGFkZXIuYXBwZW5kKGdWU19NYWluKTsgeworICAgICAgICBpZiAoZGVzY3JpcHRpb24uaGFzVGV4dHVyZSkgeworICAgICAgICAgICAgc2hhZGVyLmFwcGVuZChnVlNfTWFpbl9PdXRUZXhDb29yZHMpOworICAgICAgICB9CisgICAgICAgIGlmIChkZXNjcmlwdGlvbi5oYXNHcmFkaWVudCkgeworICAgICAgICAgICAgc2hhZGVyLmFwcGVuZChnVlNfTWFpbl9PdXRHcmFkaWVudEluZGV4KTsKKyAgICAgICAgfQorICAgICAgICBpZiAoZGVzY3JpcHRpb24uaGFzQml0bWFwKSB7CisgICAgICAgICAgICBzaGFkZXIuYXBwZW5kKGdWU19NYWluX091dEJpdG1hcFRleENvb3Jkcyk7CisgICAgICAgIH0KKyAgICAgICAgLy8gT3V0cHV0IHRyYW5zZm9ybWVkIHBvc2l0aW9uCisgICAgICAgIHNoYWRlci5hcHBlbmQoZ1ZTX01haW5fUG9zaXRpb24pOworICAgIH0KKyAgICAvLyBFbmQgdGhlIHNoYWRlcgorICAgIHNoYWRlci5hcHBlbmQoZ1ZTX0Zvb3Rlcik7CisKKyAgICBQUk9HUkFNX0xPR0QoIioqKiBHZW5lcmF0ZWQgdmVydGV4IHNoYWRlcjpcblxuJXMiLCBzaGFkZXIuc3RyaW5nKCkpOworCisgICAgcmV0dXJuIHNoYWRlcjsKK30KKworU3RyaW5nOCBQcm9ncmFtQ2FjaGU6OmdlbmVyYXRlRnJhZ21lbnRTaGFkZXIoY29uc3QgUHJvZ3JhbURlc2NyaXB0aW9uJiBkZXNjcmlwdGlvbikgeworICAgIC8vIFNldCB0aGUgZGVmYXVsdCBwcmVjaXNpb24KKyAgICBTdHJpbmc4IHNoYWRlcjsKKworICAgIGJvb2wgYmxlbmRGcmFtZWJ1ZmZlciA9IGRlc2NyaXB0aW9uLmZyYW1lYnVmZmVyTW9kZSA+PSBTa1hmZXJtb2RlOjprUGx1c19Nb2RlOworICAgIGlmIChibGVuZEZyYW1lYnVmZmVyKSB7CisgICAgICAgIHNoYWRlci5hcHBlbmQoZ0ZTX0hlYWRlcl9FeHRlbnNpb25fRnJhbWVidWZmZXJGZXRjaCk7CisgICAgfQorCisgICAgc2hhZGVyLmFwcGVuZChnRlNfSGVhZGVyKTsKKworICAgIC8vIFZhcnlpbmdzCisgICAgaWYgKGRlc2NyaXB0aW9uLmhhc1RleHR1cmUpIHsKKyAgICAgICAgc2hhZGVyLmFwcGVuZChnVlNfSGVhZGVyX1ZhcnlpbmdzX0hhc1RleHR1cmUpOworICAgIH0KKyAgICBpZiAoZGVzY3JpcHRpb24uaGFzR3JhZGllbnQpIHsKKyAgICAgICAgc2hhZGVyLmFwcGVuZChnVlNfSGVhZGVyX1ZhcnlpbmdzX0hhc0dyYWRpZW50KTsKKyAgICB9CisgICAgaWYgKGRlc2NyaXB0aW9uLmhhc0JpdG1hcCkgeworICAgICAgICBzaGFkZXIuYXBwZW5kKGdWU19IZWFkZXJfVmFyeWluZ3NfSGFzQml0bWFwKTsKKyAgICB9CisKKworICAgIC8vIFVuaWZvcm1zCisgICAgc2hhZGVyLmFwcGVuZChnRlNfVW5pZm9ybXNfQ29sb3IpOworICAgIGlmIChkZXNjcmlwdGlvbi5oYXNUZXh0dXJlKSB7CisgICAgICAgIHNoYWRlci5hcHBlbmQoZ0ZTX1VuaWZvcm1zX1RleHR1cmVTYW1wbGVyKTsKKyAgICB9CisgICAgaWYgKGRlc2NyaXB0aW9uLmhhc0dyYWRpZW50KSB7CisgICAgICAgIHNoYWRlci5hcHBlbmQoZ0ZTX1VuaWZvcm1zX0dyYWRpZW50U2FtcGxlcik7CisgICAgfQorICAgIGlmIChkZXNjcmlwdGlvbi5oYXNCaXRtYXApIHsKKyAgICAgICAgc2hhZGVyLmFwcGVuZChnRlNfVW5pZm9ybXNfQml0bWFwU2FtcGxlcik7CisgICAgfQorICAgIHNoYWRlci5hcHBlbmQoZ0ZTX1VuaWZvcm1zX0NvbG9yT3BbZGVzY3JpcHRpb24uY29sb3JPcF0pOworCisgICAgLy8gR2VuZXJhdGUgcmVxdWlyZWQgZnVuY3Rpb25zCisgICAgaWYgKGRlc2NyaXB0aW9uLmhhc0dyYWRpZW50ICYmIGRlc2NyaXB0aW9uLmhhc0JpdG1hcCkgeworICAgICAgICBnZW5lcmF0ZUJsZW5kKHNoYWRlciwgImJsZW5kU2hhZGVycyIsIGRlc2NyaXB0aW9uLnNoYWRlcnNNb2RlKTsKKyAgICB9CisgICAgaWYgKGRlc2NyaXB0aW9uLmNvbG9yT3AgPT0gUHJvZ3JhbURlc2NyaXB0aW9uOjprQ29sb3JCbGVuZCkgeworICAgICAgICBnZW5lcmF0ZUJsZW5kKHNoYWRlciwgImJsZW5kQ29sb3JzIiwgZGVzY3JpcHRpb24uY29sb3JNb2RlKTsKKyAgICB9CisgICAgaWYgKGJsZW5kRnJhbWVidWZmZXIpIHsKKyAgICAgICAgZ2VuZXJhdGVCbGVuZChzaGFkZXIsICJibGVuZEZyYW1lYnVmZmVyIiwgZGVzY3JpcHRpb24uZnJhbWVidWZmZXJNb2RlKTsKKyAgICB9CisgICAgaWYgKGRlc2NyaXB0aW9uLmlzQml0bWFwTnBvdCkgeworICAgICAgICBnZW5lcmF0ZVRleHR1cmVXcmFwKHNoYWRlciwgZGVzY3JpcHRpb24uYml0bWFwV3JhcFMsIGRlc2NyaXB0aW9uLmJpdG1hcFdyYXBUKTsKKyAgICB9CisKKyAgICAvLyBCZWdpbiB0aGUgc2hhZGVyCisgICAgc2hhZGVyLmFwcGVuZChnRlNfTWFpbik7IHsKKyAgICAgICAgLy8gU3RvcmVzIHRoZSByZXN1bHQgaW4gZnJhZ0NvbG9yIGRpcmVjdGx5CisgICAgICAgIGlmIChkZXNjcmlwdGlvbi5oYXNUZXh0dXJlKSB7CisgICAgICAgICAgICBpZiAoZGVzY3JpcHRpb24uaGFzQWxwaGE4VGV4dHVyZSkgeworICAgICAgICAgICAgICAgIHNoYWRlci5hcHBlbmQoZ0ZTX01haW5fRmV0Y2hBOFRleHR1cmUpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBzaGFkZXIuYXBwZW5kKGdGU19NYWluX0ZldGNoVGV4dHVyZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzaGFkZXIuYXBwZW5kKGdGU19NYWluX0ZldGNoQ29sb3IpOworICAgICAgICB9CisgICAgICAgIGlmIChkZXNjcmlwdGlvbi5oYXNHcmFkaWVudCkgeworICAgICAgICAgICAgc2hhZGVyLmFwcGVuZChnRlNfTWFpbl9GZXRjaEdyYWRpZW50KTsKKyAgICAgICAgfQorICAgICAgICBpZiAoZGVzY3JpcHRpb24uaGFzQml0bWFwKSB7CisgICAgICAgICAgICBpZiAoIWRlc2NyaXB0aW9uLmlzQml0bWFwTnBvdCkgeworICAgICAgICAgICAgICAgIHNoYWRlci5hcHBlbmQoZ0ZTX01haW5fRmV0Y2hCaXRtYXApOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBzaGFkZXIuYXBwZW5kKGdGU19NYWluX0ZldGNoQml0bWFwTnBvdCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLy8gQ2FzZSB3aGVuIHdlIGhhdmUgdHdvIHNoYWRlcnMgc2V0CisgICAgICAgIGlmIChkZXNjcmlwdGlvbi5oYXNHcmFkaWVudCAmJiBkZXNjcmlwdGlvbi5oYXNCaXRtYXApIHsKKyAgICAgICAgICAgIGlmIChkZXNjcmlwdGlvbi5pc0JpdG1hcEZpcnN0KSB7CisgICAgICAgICAgICAgICAgc2hhZGVyLmFwcGVuZChnRlNfTWFpbl9CbGVuZFNoYWRlcnNCRyk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHNoYWRlci5hcHBlbmQoZ0ZTX01haW5fQmxlbmRTaGFkZXJzR0IpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2hhZGVyLmFwcGVuZChnRlNfTWFpbl9CbGVuZFNoYWRlcnNfTW9kdWxhdGUpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKGRlc2NyaXB0aW9uLmhhc0dyYWRpZW50KSB7CisgICAgICAgICAgICAgICAgc2hhZGVyLmFwcGVuZChnRlNfTWFpbl9HcmFkaWVudFNoYWRlcl9Nb2R1bGF0ZSk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGRlc2NyaXB0aW9uLmhhc0JpdG1hcCkgeworICAgICAgICAgICAgICAgIHNoYWRlci5hcHBlbmQoZ0ZTX01haW5fQml0bWFwU2hhZGVyX01vZHVsYXRlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvLyBBcHBseSB0aGUgY29sb3Igb3AgaWYgbmVlZGVkCisgICAgICAgIHNoYWRlci5hcHBlbmQoZ0ZTX01haW5fQXBwbHlDb2xvck9wW2Rlc2NyaXB0aW9uLmNvbG9yT3BdKTsKKyAgICAgICAgLy8gT3V0cHV0IHRoZSBmcmFnbWVudAorICAgICAgICBpZiAoIWJsZW5kRnJhbWVidWZmZXIpIHsKKyAgICAgICAgICAgIHNoYWRlci5hcHBlbmQoZ0ZTX01haW5fRnJhZ0NvbG9yKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHNoYWRlci5hcHBlbmQoIWRlc2NyaXB0aW9uLnN3YXBTcmNEc3QgPworICAgICAgICAgICAgICAgICAgICBnRlNfTWFpbl9GcmFnQ29sb3JfQmxlbmQgOiBnRlNfTWFpbl9GcmFnQ29sb3JfQmxlbmRfU3dhcCk7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gRW5kIHRoZSBzaGFkZXIKKyAgICBzaGFkZXIuYXBwZW5kKGdGU19Gb290ZXIpOworCisgICAgaWYgKERFQlVHX1BST0dSQU1fQ0FDSEUpIHsKKyAgICAgICAgUFJPR1JBTV9MT0dEKCIqKiogR2VuZXJhdGVkIGZyYWdtZW50IHNoYWRlcjpcblxuIik7CisgICAgICAgIHByaW50TG9uZ1N0cmluZyhzaGFkZXIpOworICAgIH0KKworICAgIHJldHVybiBzaGFkZXI7Cit9CisKK3ZvaWQgUHJvZ3JhbUNhY2hlOjpnZW5lcmF0ZUJsZW5kKFN0cmluZzgmIHNoYWRlciwgY29uc3QgY2hhciogbmFtZSwgU2tYZmVybW9kZTo6TW9kZSBtb2RlKSB7CisgICAgc2hhZGVyLmFwcGVuZCgiXG52ZWM0ICIpOworICAgIHNoYWRlci5hcHBlbmQobmFtZSk7CisgICAgc2hhZGVyLmFwcGVuZCgiKHZlYzQgc3JjLCB2ZWM0IGRzdCkge1xuIik7CisgICAgc2hhZGVyLmFwcGVuZCgiICAgICIpOworICAgIHNoYWRlci5hcHBlbmQoZ0JsZW5kT3BzW21vZGVdKTsKKyAgICBzaGFkZXIuYXBwZW5kKCJ9XG4iKTsKK30KKwordm9pZCBQcm9ncmFtQ2FjaGU6OmdlbmVyYXRlVGV4dHVyZVdyYXAoU3RyaW5nOCYgc2hhZGVyLCBHTGVudW0gd3JhcFMsIEdMZW51bSB3cmFwVCkgeworICAgIHNoYWRlci5hcHBlbmQoIlxudmVjMiB3cmFwKHZlYzIgdGV4Q29vcmRzKSB7XG4iKTsKKyAgICBpZiAod3JhcFMgPT0gR0xfTUlSUk9SRURfUkVQRUFUKSB7CisgICAgICAgIHNoYWRlci5hcHBlbmQoIiAgICBmbG9hdCB4TW9kMiA9IG1vZCh0ZXhDb29yZHMueCwgMi4wKTtcbiIpOworICAgICAgICBzaGFkZXIuYXBwZW5kKCIgICAgaWYgKHhNb2QyID4gMS4wKSB4TW9kMiA9IDIuMCAtIHhNb2QyO1xuIik7CisgICAgfQorICAgIGlmICh3cmFwVCA9PSBHTF9NSVJST1JFRF9SRVBFQVQpIHsKKyAgICAgICAgc2hhZGVyLmFwcGVuZCgiICAgIGZsb2F0IHlNb2QyID0gbW9kKHRleENvb3Jkcy55LCAyLjApO1xuIik7CisgICAgICAgIHNoYWRlci5hcHBlbmQoIiAgICBpZiAoeU1vZDIgPiAxLjApIHlNb2QyID0gMi4wIC0geU1vZDI7XG4iKTsKKyAgICB9CisgICAgc2hhZGVyLmFwcGVuZCgiICAgIHJldHVybiB2ZWMyKCIpOworICAgIHN3aXRjaCAod3JhcFMpIHsKKyAgICAgICAgY2FzZSBHTF9DTEFNUF9UT19FREdFOgorICAgICAgICAgICAgc2hhZGVyLmFwcGVuZCgidGV4Q29vcmRzLngiKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEdMX1JFUEVBVDoKKyAgICAgICAgICAgIHNoYWRlci5hcHBlbmQoIm1vZCh0ZXhDb29yZHMueCwgMS4wKSIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgR0xfTUlSUk9SRURfUkVQRUFUOgorICAgICAgICAgICAgc2hhZGVyLmFwcGVuZCgieE1vZDIiKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBzaGFkZXIuYXBwZW5kKCIsICIpOworICAgIHN3aXRjaCAod3JhcFQpIHsKKyAgICAgICAgY2FzZSBHTF9DTEFNUF9UT19FREdFOgorICAgICAgICAgICAgc2hhZGVyLmFwcGVuZCgidGV4Q29vcmRzLnkiKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEdMX1JFUEVBVDoKKyAgICAgICAgICAgIHNoYWRlci5hcHBlbmQoIm1vZCh0ZXhDb29yZHMueSwgMS4wKSIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgR0xfTUlSUk9SRURfUkVQRUFUOgorICAgICAgICAgICAgc2hhZGVyLmFwcGVuZCgieU1vZDIiKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBzaGFkZXIuYXBwZW5kKCIpO1xuIik7CisgICAgc2hhZGVyLmFwcGVuZCgifVxuIik7Cit9CisKK3ZvaWQgUHJvZ3JhbUNhY2hlOjpwcmludExvbmdTdHJpbmcoY29uc3QgU3RyaW5nOCYgc2hhZGVyKSBjb25zdCB7CisgICAgc3NpemVfdCBpbmRleCA9IDA7CisgICAgc3NpemVfdCBsYXN0SW5kZXggPSAwOworICAgIGNvbnN0IGNoYXIqIHN0ciA9IHNoYWRlci5zdHJpbmcoKTsKKyAgICB3aGlsZSAoKGluZGV4ID0gc2hhZGVyLmZpbmQoIlxuIiwgaW5kZXgpKSA+IC0xKSB7CisgICAgICAgIFN0cmluZzggbGluZShzdHIsIGluZGV4IC0gbGFzdEluZGV4KTsKKyAgICAgICAgaWYgKGxpbmUubGVuZ3RoKCkgPT0gMCkgbGluZS5hcHBlbmQoIlxuIik7CisgICAgICAgIFBST0dSQU1fTE9HRCgiJXMiLCBsaW5lLnN0cmluZygpKTsKKyAgICAgICAgaW5kZXgrKzsKKyAgICAgICAgc3RyICs9IChpbmRleCAtIGxhc3RJbmRleCk7CisgICAgICAgIGxhc3RJbmRleCA9IGluZGV4OworICAgIH0KK30KKworfTsgLy8gbmFtZXNwYWNlIHVpcmVuZGVyZXIKK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9saWJzL2h3dWkvUHJvZ3JhbUNhY2hlLmggYi9saWJzL2h3dWkvUHJvZ3JhbUNhY2hlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGExNzA1MgotLS0gL2Rldi9udWxsCisrKyBiL2xpYnMvaHd1aS9Qcm9ncmFtQ2FjaGUuaApAQCAtMCwwICsxLDIwNyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9VSV9QUk9HUkFNX0NBQ0hFX0gKKyNkZWZpbmUgQU5EUk9JRF9VSV9QUk9HUkFNX0NBQ0hFX0gKKworI2luY2x1ZGUgPHV0aWxzL0tleWVkVmVjdG9yLmg+CisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisjaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgorCisjaW5jbHVkZSA8R0xFUzIvZ2wyLmg+CisKKyNpbmNsdWRlIDxTa1hmZXJtb2RlLmg+CisKKyNpbmNsdWRlICJQcm9ncmFtLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSB1aXJlbmRlcmVyIHsKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gRGVmaW5lcworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisvLyBEZWJ1ZworI2RlZmluZSBERUJVR19QUk9HUkFNX0NBQ0hFIDAKKworLy8gRGVidWcKKyNpZiBERUJVR19QUk9HUkFNX0NBQ0hFCisgICAgI2RlZmluZSBQUk9HUkFNX0xPR0QoLi4uKSBMT0dEKF9fVkFfQVJHU19fKQorI2Vsc2UKKyAgICAjZGVmaW5lIFBST0dSQU1fTE9HRCguLi4pCisjZW5kaWYKKworLyoKKyAqIElNUE9SVEFOVDogQWxsIDMyIGJpdHMgYXJlIHVzZWQsIHN3aXRjaCB0byBhIGxvbmcuCisgKi8KKyNkZWZpbmUgUFJPR1JBTV9LRVlfVEVYVFVSRSAweDEKKyNkZWZpbmUgUFJPR1JBTV9LRVlfQThfVEVYVFVSRSAweDIKKyNkZWZpbmUgUFJPR1JBTV9LRVlfQklUTUFQIDB4NAorI2RlZmluZSBQUk9HUkFNX0tFWV9HUkFESUVOVCAweDgKKyNkZWZpbmUgUFJPR1JBTV9LRVlfQklUTUFQX0ZJUlNUIDB4MTAKKyNkZWZpbmUgUFJPR1JBTV9LRVlfQ09MT1JfTUFUUklYIDB4MjAKKyNkZWZpbmUgUFJPR1JBTV9LRVlfQ09MT1JfTElHSFRJTkcgMHg0MAorI2RlZmluZSBQUk9HUkFNX0tFWV9DT0xPUl9CTEVORCAweDgwCisjZGVmaW5lIFBST0dSQU1fS0VZX0JJVE1BUF9OUE9UIDB4MTAwCisjZGVmaW5lIFBST0dSQU1fS0VZX1NXQVBfU1JDX0RTVCAweDIwMDAKKworI2RlZmluZSBQUk9HUkFNX0tFWV9CSVRNQVBfV1JBUFNfTUFTSyAweDYwMAorI2RlZmluZSBQUk9HUkFNX0tFWV9CSVRNQVBfV1JBUFRfTUFTSyAweDE4MDAKKworLy8gRW5jb2RlIHRoZSB4ZmVybW9kZXMgb24gNiBiaXRzCisjZGVmaW5lIFBST0dSQU1fTUFYX1hGRVJNT0RFIDB4MWYKKyNkZWZpbmUgUFJPR1JBTV9YRkVSTU9ERV9TSEFERVJfU0hJRlQgMjYKKyNkZWZpbmUgUFJPR1JBTV9YRkVSTU9ERV9DT0xPUl9PUF9TSElGVCAyMAorI2RlZmluZSBQUk9HUkFNX1hGRVJNT0RFX0ZSQU1FQlVGRkVSX1NISUZUIDE0CisKKyNkZWZpbmUgUFJPR1JBTV9CSVRNQVBfV1JBUFNfU0hJRlQgOQorI2RlZmluZSBQUk9HUkFNX0JJVE1BUF9XUkFQVF9TSElGVCAxMQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBUeXBlcworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisvKgorICogSU1QT1JUQU5UOiBBbGwgMzIgYml0cyBhcmUgdXNlZCwgc3dpdGNoIHRvIGEgbG9uZy4KKyAqLwordHlwZWRlZiB1aW50MzJfdCBwcm9ncmFtaWQ7CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIENhY2hlCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKy8qKgorICogRGVzY3JpYmUgdGhlIGZlYXR1cmVzIHJlcXVpcmVkIGZvciBhIGdpdmVuIHByb2dyYW0uIFRoZSBmZWF0dXJlcworICogZGV0ZXJtaW5lIHRoZSBnZW5lcmF0aW9uIG9mIGJvdGggdGhlIHZlcnRleCBhbmQgZnJhZ21lbnQgc2hhZGVycy4KKyAqIEEgUHJvZ3JhbURlc2NyaXB0aW9uIG11c3QgYmUgdXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIGEgUHJvZ3JhbUNhY2hlLgorICovCitzdHJ1Y3QgUHJvZ3JhbURlc2NyaXB0aW9uIHsKKyAgICBlbnVtIENvbG9yTW9kaWZpZXIgeworICAgICAgICBrQ29sb3JOb25lLAorICAgICAgICBrQ29sb3JNYXRyaXgsCisgICAgICAgIGtDb2xvckxpZ2h0aW5nLAorICAgICAgICBrQ29sb3JCbGVuZAorICAgIH07CisKKyAgICBQcm9ncmFtRGVzY3JpcHRpb24oKToKKyAgICAgICAgaGFzVGV4dHVyZShmYWxzZSksIGhhc0FscGhhOFRleHR1cmUoZmFsc2UpLAorICAgICAgICBoYXNCaXRtYXAoZmFsc2UpLCBpc0JpdG1hcE5wb3QoZmFsc2UpLCBoYXNHcmFkaWVudChmYWxzZSksCisgICAgICAgIHNoYWRlcnNNb2RlKFNrWGZlcm1vZGU6OmtDbGVhcl9Nb2RlKSwgaXNCaXRtYXBGaXJzdChmYWxzZSksCisgICAgICAgIGJpdG1hcFdyYXBTKEdMX0NMQU1QX1RPX0VER0UpLCBiaXRtYXBXcmFwVChHTF9DTEFNUF9UT19FREdFKSwKKyAgICAgICAgY29sb3JPcChrQ29sb3JOb25lKSwgY29sb3JNb2RlKFNrWGZlcm1vZGU6OmtDbGVhcl9Nb2RlKSwKKyAgICAgICAgZnJhbWVidWZmZXJNb2RlKFNrWGZlcm1vZGU6OmtDbGVhcl9Nb2RlKSwgc3dhcFNyY0RzdChmYWxzZSkgeworICAgIH0KKworICAgIC8vIFRleHR1cmluZworICAgIGJvb2wgaGFzVGV4dHVyZTsKKyAgICBib29sIGhhc0FscGhhOFRleHR1cmU7CisKKyAgICAvLyBTaGFkZXJzCisgICAgYm9vbCBoYXNCaXRtYXA7CisgICAgYm9vbCBpc0JpdG1hcE5wb3Q7CisgICAgYm9vbCBoYXNHcmFkaWVudDsKKyAgICBTa1hmZXJtb2RlOjpNb2RlIHNoYWRlcnNNb2RlOworICAgIGJvb2wgaXNCaXRtYXBGaXJzdDsKKyAgICBHTGVudW0gYml0bWFwV3JhcFM7CisgICAgR0xlbnVtIGJpdG1hcFdyYXBUOworCisgICAgLy8gQ29sb3Igb3BlcmF0aW9ucworICAgIGludCBjb2xvck9wOworICAgIFNrWGZlcm1vZGU6Ok1vZGUgY29sb3JNb2RlOworCisgICAgLy8gRnJhbWVidWZmZXIgYmxlbmRpbmcgKHJlcXVpcmVzIEV4dGVuc2lvbnMuaGFzRnJhbWVidWZmZXJGZXRjaCgpKQorICAgIC8vIElnbm9yZWQgZm9yIGFsbCB2YWx1ZXMgPCBTa1hmZXJtb2RlOjprUGx1c19Nb2RlCisgICAgU2tYZmVybW9kZTo6TW9kZSBmcmFtZWJ1ZmZlck1vZGU7CisgICAgYm9vbCBzd2FwU3JjRHN0OworCisgICAgaW5saW5lIHVpbnQzMl90IGdldEVudW1Gb3JXcmFwKEdMZW51bSB3cmFwKSBjb25zdCB7CisgICAgICAgIHN3aXRjaCAod3JhcCkgeworICAgICAgICAgICAgY2FzZSBHTF9DTEFNUF9UT19FREdFOgorICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgY2FzZSBHTF9SRVBFQVQ6CisgICAgICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgICAgICBjYXNlIEdMX01JUlJPUkVEX1JFUEVBVDoKKyAgICAgICAgICAgICAgICByZXR1cm4gMjsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBwcm9ncmFtaWQga2V5KCkgY29uc3QgeworICAgICAgICBwcm9ncmFtaWQga2V5ID0gMDsKKyAgICAgICAgaWYgKGhhc1RleHR1cmUpIGtleSB8PSBQUk9HUkFNX0tFWV9URVhUVVJFOworICAgICAgICBpZiAoaGFzQWxwaGE4VGV4dHVyZSkga2V5IHw9IFBST0dSQU1fS0VZX0E4X1RFWFRVUkU7CisgICAgICAgIGlmIChoYXNCaXRtYXApIHsKKyAgICAgICAgICAgIGtleSB8PSBQUk9HUkFNX0tFWV9CSVRNQVA7CisgICAgICAgICAgICBpZiAoaXNCaXRtYXBOcG90KSB7CisgICAgICAgICAgICAgICAga2V5IHw9IFBST0dSQU1fS0VZX0JJVE1BUF9OUE9UOworICAgICAgICAgICAgICAgIGtleSB8PSBnZXRFbnVtRm9yV3JhcChiaXRtYXBXcmFwUykgPDwgUFJPR1JBTV9CSVRNQVBfV1JBUFNfU0hJRlQ7CisgICAgICAgICAgICAgICAga2V5IHw9IGdldEVudW1Gb3JXcmFwKGJpdG1hcFdyYXBUKSA8PCBQUk9HUkFNX0JJVE1BUF9XUkFQVF9TSElGVDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoaGFzR3JhZGllbnQpIGtleSB8PSBQUk9HUkFNX0tFWV9HUkFESUVOVDsKKyAgICAgICAgaWYgKGlzQml0bWFwRmlyc3QpIGtleSAgfD0gUFJPR1JBTV9LRVlfQklUTUFQX0ZJUlNUOworICAgICAgICBpZiAoaGFzQml0bWFwICYmIGhhc0dyYWRpZW50KSB7CisgICAgICAgICAgICBrZXkgfD0gKHNoYWRlcnNNb2RlICYgUFJPR1JBTV9NQVhfWEZFUk1PREUpIDw8IFBST0dSQU1fWEZFUk1PREVfU0hBREVSX1NISUZUOworICAgICAgICB9CisgICAgICAgIHN3aXRjaCAoY29sb3JPcCkgeworICAgICAgICAgICAgY2FzZSBrQ29sb3JNYXRyaXg6CisgICAgICAgICAgICAgICAga2V5IHw9IFBST0dSQU1fS0VZX0NPTE9SX01BVFJJWDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2Uga0NvbG9yTGlnaHRpbmc6CisgICAgICAgICAgICAgICAga2V5IHw9IFBST0dSQU1fS0VZX0NPTE9SX0xJR0hUSU5HOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBrQ29sb3JCbGVuZDoKKyAgICAgICAgICAgICAgICBrZXkgfD0gUFJPR1JBTV9LRVlfQ09MT1JfQkxFTkQ7CisgICAgICAgICAgICAgICAga2V5IHw9IChjb2xvck1vZGUgJiBQUk9HUkFNX01BWF9YRkVSTU9ERSkgPDwgUFJPR1JBTV9YRkVSTU9ERV9DT0xPUl9PUF9TSElGVDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2Uga0NvbG9yTm9uZToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBrZXkgfD0gKGZyYW1lYnVmZmVyTW9kZSAmIFBST0dSQU1fTUFYX1hGRVJNT0RFKSA8PCBQUk9HUkFNX1hGRVJNT0RFX0ZSQU1FQlVGRkVSX1NISUZUOworICAgICAgICBpZiAoc3dhcFNyY0RzdCkga2V5IHw9IFBST0dSQU1fS0VZX1NXQVBfU1JDX0RTVDsKKyAgICAgICAgcmV0dXJuIGtleTsKKyAgICB9Cit9OyAvLyBzdHJ1Y3QgUHJvZ3JhbURlc2NyaXB0aW9uCisKKy8qKgorICogR2VuZXJhdGVzIGFuZCBjYWNoZXMgcHJvZ3JhbS4gUHJvZ3JhbXMgYXJlIGdlbmVyYXRlZCBiYXNlZCBvbgorICogUHJvZ3JhbURlc2NyaXB0aW9ucy4KKyAqLworY2xhc3MgUHJvZ3JhbUNhY2hlIHsKK3B1YmxpYzoKKyAgICBQcm9ncmFtQ2FjaGUoKTsKKyAgICB+UHJvZ3JhbUNhY2hlKCk7CisKKyAgICBQcm9ncmFtKiBnZXQoY29uc3QgUHJvZ3JhbURlc2NyaXB0aW9uJiBkZXNjcmlwdGlvbik7CisKKyAgICB2b2lkIGNsZWFyKCk7CisKK3ByaXZhdGU6CisgICAgUHJvZ3JhbSogZ2VuZXJhdGVQcm9ncmFtKGNvbnN0IFByb2dyYW1EZXNjcmlwdGlvbiYgZGVzY3JpcHRpb24sIHByb2dyYW1pZCBrZXkpOworICAgIFN0cmluZzggZ2VuZXJhdGVWZXJ0ZXhTaGFkZXIoY29uc3QgUHJvZ3JhbURlc2NyaXB0aW9uJiBkZXNjcmlwdGlvbik7CisgICAgU3RyaW5nOCBnZW5lcmF0ZUZyYWdtZW50U2hhZGVyKGNvbnN0IFByb2dyYW1EZXNjcmlwdGlvbiYgZGVzY3JpcHRpb24pOworICAgIHZvaWQgZ2VuZXJhdGVCbGVuZChTdHJpbmc4JiBzaGFkZXIsIGNvbnN0IGNoYXIqIG5hbWUsIFNrWGZlcm1vZGU6Ok1vZGUgbW9kZSk7CisgICAgdm9pZCBnZW5lcmF0ZVRleHR1cmVXcmFwKFN0cmluZzgmIHNoYWRlciwgR0xlbnVtIHdyYXBTLCBHTGVudW0gd3JhcFQpOworCisgICAgdm9pZCBwcmludExvbmdTdHJpbmcoY29uc3QgU3RyaW5nOCYgc2hhZGVyKSBjb25zdDsKKworICAgIEtleWVkVmVjdG9yPHByb2dyYW1pZCwgUHJvZ3JhbSo+IG1DYWNoZTsKK307IC8vIGNsYXNzIFByb2dyYW1DYWNoZQorCit9OyAvLyBuYW1lc3BhY2UgdWlyZW5kZXJlcgorfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmIC8vIEFORFJPSURfVUlfUFJPR1JBTV9DQUNIRV9ICmRpZmYgLS1naXQgYS9saWJzL2h3dWkvUHJvcGVydGllcy5oIGIvbGlicy9od3VpL1Byb3BlcnRpZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZTJmMDkxCi0tLSAvZGV2L251bGwKKysrIGIvbGlicy9od3VpL1Byb3BlcnRpZXMuaApAQCAtMCwwICsxLDU3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX1VJX1BST1BFUlRJRVNfSAorI2RlZmluZSBBTkRST0lEX1VJX1BST1BFUlRJRVNfSAorCisjaW5jbHVkZSA8Y3V0aWxzL3Byb3BlcnRpZXMuaD4KKworLyoqCisgKiBUaGlzIGZpbGUgY29udGFpbnMgdGhlIGxpc3Qgb2Ygc3lzdGVtIHByb3BlcnRpZXMgdXNlZCB0byBjb25maWd1cmUKKyAqIHRoZSBPcGVuR0xSZW5kZXJlci4KKyAqLworCisvLyBUaGVzZSBwcm9wZXJ0aWVzIGFyZSBkZWZpbmVkIGluIG1lZ2EtYnl0ZXMKKyNkZWZpbmUgUFJPUEVSVFlfVEVYVFVSRV9DQUNIRV9TSVpFICJyby5od3VpLnRleHR1cmVfY2FjaGVfc2l6ZSIKKyNkZWZpbmUgUFJPUEVSVFlfTEFZRVJfQ0FDSEVfU0laRSAicm8uaHd1aS5sYXllcl9jYWNoZV9zaXplIgorI2RlZmluZSBQUk9QRVJUWV9HUkFESUVOVF9DQUNIRV9TSVpFICJyby5od3VpLmdyYWRpZW50X2NhY2hlX3NpemUiCisjZGVmaW5lIFBST1BFUlRZX1BBVEhfQ0FDSEVfU0laRSAicm8uaHd1aS5wYXRoX2NhY2hlX3NpemUiCisjZGVmaW5lIFBST1BFUlRZX0RST1BfU0hBRE9XX0NBQ0hFX1NJWkUgInJvLmh3dWkuZHJvcF9zaGFkb3dfY2FjaGVfc2l6ZSIKKworLy8gVGhlc2UgcHJvcGVydGllcyBhcmUgZGVmaW5lZCBpbiBwaXhlbHMKKyNkZWZpbmUgUFJPUEVSVFlfVEVYVF9DQUNIRV9XSURUSCAicm8uaHd1aS50ZXh0X2NhY2hlX3dpZHRoIgorI2RlZmluZSBQUk9QRVJUWV9URVhUX0NBQ0hFX0hFSUdIVCAicm8uaHd1aS50ZXh0X2NhY2hlX2hlaWdodCIKKworLy8gR2FtbWEgKD49IDEuMCwgPD0gMTAuMCkKKyNkZWZpbmUgUFJPUEVSVFlfVEVYVF9HQU1NQSAicm8udGV4dF9nYW1tYSIKKyNkZWZpbmUgUFJPUEVSVFlfVEVYVF9CTEFDS19HQU1NQV9USFJFU0hPTEQgInJvLnRleHRfZ2FtbWEuYmxhY2tfdGhyZXNob2xkIgorI2RlZmluZSBQUk9QRVJUWV9URVhUX1dISVRFX0dBTU1BX1RIUkVTSE9MRCAicm8udGV4dF9nYW1tYS53aGl0ZV90aHJlc2hvbGQiCisKKy8vIENvbnZlcnRzIGEgbnVtYmVyIG9mIG1lZ2EtYnl0ZXMgaW50byBieXRlcworI2RlZmluZSBNQihzKSBzICogMTAyNCAqIDEwMjQKKworI2RlZmluZSBERUZBVUxUX1RFWFRVUkVfQ0FDSEVfU0laRSAyMC4wZgorI2RlZmluZSBERUZBVUxUX0xBWUVSX0NBQ0hFX1NJWkUgNi4wZgorI2RlZmluZSBERUZBVUxUX1BBVEhfQ0FDSEVfU0laRSA2LjBmCisjZGVmaW5lIERFRkFVTFRfUEFUQ0hfQ0FDSEVfU0laRSAxMDAKKyNkZWZpbmUgREVGQVVMVF9HUkFESUVOVF9DQUNIRV9TSVpFIDAuNWYKKyNkZWZpbmUgREVGQVVMVF9EUk9QX1NIQURPV19DQUNIRV9TSVpFIDIuMGYKKworI2RlZmluZSBERUZBVUxUX1RFWFRfR0FNTUEgMS40ZgorI2RlZmluZSBERUZBVUxUX1RFWFRfQkxBQ0tfR0FNTUFfVEhSRVNIT0xEIDY0CisjZGVmaW5lIERFRkFVTFRfVEVYVF9XSElURV9HQU1NQV9USFJFU0hPTEQgMTkyCisKKyNlbmRpZiAvLyBBTkRST0lEX1VJX1BST1BFUlRJRVNfSApkaWZmIC0tZ2l0IGEvbGlicy9od3VpL1JlY3QuaCBiL2xpYnMvaHd1aS9SZWN0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmIyMmMyYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYnMvaHd1aS9SZWN0LmgKQEAgLTAsMCArMSwxNjAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfVUlfUkVDVF9ICisjZGVmaW5lIEFORFJPSURfVUlfUkVDVF9ICisKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIHVpcmVuZGVyZXIgeworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBTdHJ1Y3RzCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK3N0cnVjdCBSZWN0IHsKKyAgICBmbG9hdCBsZWZ0OworICAgIGZsb2F0IHRvcDsKKyAgICBmbG9hdCByaWdodDsKKyAgICBmbG9hdCBib3R0b207CisKKyAgICBSZWN0KCk6CisgICAgICAgICAgICBsZWZ0KDApLAorICAgICAgICAgICAgdG9wKDApLAorICAgICAgICAgICAgcmlnaHQoMCksCisgICAgICAgICAgICBib3R0b20oMCkgeworICAgIH0KKworICAgIFJlY3QoZmxvYXQgbGVmdCwgZmxvYXQgdG9wLCBmbG9hdCByaWdodCwgZmxvYXQgYm90dG9tKToKKyAgICAgICAgICAgIGxlZnQobGVmdCksCisgICAgICAgICAgICB0b3AodG9wKSwKKyAgICAgICAgICAgIHJpZ2h0KHJpZ2h0KSwKKyAgICAgICAgICAgIGJvdHRvbShib3R0b20pIHsKKyAgICB9CisKKyAgICBSZWN0KGNvbnN0IFJlY3QmIHIpIHsKKyAgICAgICAgc2V0KHIpOworICAgIH0KKworICAgIFJlY3QoUmVjdCYgcikgeworICAgICAgICBzZXQocik7CisgICAgfQorCisgICAgUmVjdCYgb3BlcmF0b3I9KGNvbnN0IFJlY3QmIHIpIHsKKyAgICAgICAgc2V0KHIpOworICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgUmVjdCYgb3BlcmF0b3I9KFJlY3QmIHIpIHsKKyAgICAgICAgc2V0KHIpOworICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgZnJpZW5kIGludCBvcGVyYXRvcj09KGNvbnN0IFJlY3QmIGEsIGNvbnN0IFJlY3QmIGIpIHsKKyAgICAgICAgcmV0dXJuICFtZW1jbXAoJmEsICZiLCBzaXplb2YoYSkpOworICAgIH0KKworICAgIGZyaWVuZCBpbnQgb3BlcmF0b3IhPShjb25zdCBSZWN0JiBhLCBjb25zdCBSZWN0JiBiKSB7CisgICAgICAgIHJldHVybiBtZW1jbXAoJmEsICZiLCBzaXplb2YoYSkpOworICAgIH0KKworICAgIGJvb2wgaXNFbXB0eSgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIGxlZnQgPj0gcmlnaHQgfHwgdG9wID49IGJvdHRvbTsKKyAgICB9CisKKyAgICB2b2lkIHNldEVtcHR5KCkgeworICAgICAgICBtZW1zZXQodGhpcywgMCwgc2l6ZW9mKCp0aGlzKSk7CisgICAgfQorCisgICAgdm9pZCBzZXQoZmxvYXQgbGVmdCwgZmxvYXQgdG9wLCBmbG9hdCByaWdodCwgZmxvYXQgYm90dG9tKSB7CisgICAgICAgIHRoaXMtPmxlZnQgPSBsZWZ0OworICAgICAgICB0aGlzLT5yaWdodCA9IHJpZ2h0OworICAgICAgICB0aGlzLT50b3AgPSB0b3A7CisgICAgICAgIHRoaXMtPmJvdHRvbSA9IGJvdHRvbTsKKyAgICB9CisKKyAgICB2b2lkIHNldChjb25zdCBSZWN0JiByKSB7CisgICAgICAgIHNldChyLmxlZnQsIHIudG9wLCByLnJpZ2h0LCByLmJvdHRvbSk7CisgICAgfQorCisgICAgaW5saW5lIGZsb2F0IGdldFdpZHRoKCkgY29uc3QgeworICAgICAgICByZXR1cm4gcmlnaHQgLSBsZWZ0OworICAgIH0KKworICAgIGlubGluZSBmbG9hdCBnZXRIZWlnaHQoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBib3R0b20gLSB0b3A7CisgICAgfQorCisgICAgYm9vbCBpbnRlcnNlY3RzKGZsb2F0IGxlZnQsIGZsb2F0IHRvcCwgZmxvYXQgcmlnaHQsIGZsb2F0IGJvdHRvbSkgY29uc3QgeworICAgICAgICByZXR1cm4gbGVmdCA8IHJpZ2h0ICYmIHRvcCA8IGJvdHRvbSAmJgorICAgICAgICAgICAgICAgIHRoaXMtPmxlZnQgPCB0aGlzLT5yaWdodCAmJiB0aGlzLT50b3AgPCB0aGlzLT5ib3R0b20gJiYKKyAgICAgICAgICAgICAgICB0aGlzLT5sZWZ0IDwgcmlnaHQgJiYgbGVmdCA8IHRoaXMtPnJpZ2h0ICYmCisgICAgICAgICAgICAgICAgdGhpcy0+dG9wIDwgYm90dG9tICYmIHRvcCA8IHRoaXMtPmJvdHRvbTsKKyAgICB9CisKKyAgICBib29sIGludGVyc2VjdHMoY29uc3QgUmVjdCYgcikgY29uc3QgeworICAgICAgICByZXR1cm4gaW50ZXJzZWN0cyhyLmxlZnQsIHIudG9wLCByLnJpZ2h0LCByLmJvdHRvbSk7CisgICAgfQorCisgICAgYm9vbCBpbnRlcnNlY3QoZmxvYXQgbGVmdCwgZmxvYXQgdG9wLCBmbG9hdCByaWdodCwgZmxvYXQgYm90dG9tKSB7CisgICAgICAgIGlmIChsZWZ0IDwgcmlnaHQgJiYgdG9wIDwgYm90dG9tICYmICF0aGlzLT5pc0VtcHR5KCkgJiYKKyAgICAgICAgICAgICAgICB0aGlzLT5sZWZ0IDwgcmlnaHQgJiYgbGVmdCA8IHRoaXMtPnJpZ2h0ICYmCisgICAgICAgICAgICAgICAgdGhpcy0+dG9wIDwgYm90dG9tICYmIHRvcCA8IHRoaXMtPmJvdHRvbSkgeworCisgICAgICAgICAgICBpZiAodGhpcy0+bGVmdCA8IGxlZnQpIHRoaXMtPmxlZnQgPSBsZWZ0OworICAgICAgICAgICAgaWYgKHRoaXMtPnRvcCA8IHRvcCkgdGhpcy0+dG9wID0gdG9wOworICAgICAgICAgICAgaWYgKHRoaXMtPnJpZ2h0ID4gcmlnaHQpIHRoaXMtPnJpZ2h0ID0gcmlnaHQ7CisgICAgICAgICAgICBpZiAodGhpcy0+Ym90dG9tID4gYm90dG9tKSB0aGlzLT5ib3R0b20gPSBib3R0b207CisKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBib29sIGludGVyc2VjdChjb25zdCBSZWN0JiByKSB7CisgICAgICAgIHJldHVybiBpbnRlcnNlY3Qoci5sZWZ0LCByLnRvcCwgci5yaWdodCwgci5ib3R0b20pOworICAgIH0KKworICAgIGJvb2wgdW5pb25XaXRoKGNvbnN0IFJlY3QmIHIpIHsKKyAgICAgICAgaWYgKHIubGVmdCA8IHIucmlnaHQgJiYgci50b3AgPCByLmJvdHRvbSkgeworICAgICAgICAgICAgaWYgKGxlZnQgPCByaWdodCAmJiB0b3AgPCBib3R0b20pIHsKKyAgICAgICAgICAgICAgICBpZiAobGVmdCA+IHIubGVmdCkgbGVmdCA9IHIubGVmdDsKKyAgICAgICAgICAgICAgICBpZiAodG9wID4gci50b3ApIHRvcCA9IHIudG9wOworICAgICAgICAgICAgICAgIGlmIChyaWdodCA8IHIucmlnaHQpIHJpZ2h0ID0gci5yaWdodDsKKyAgICAgICAgICAgICAgICBpZiAoYm90dG9tIDwgci5ib3R0b20pIGJvdHRvbSA9IHIuYm90dG9tOworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBsZWZ0ID0gci5sZWZ0OworICAgICAgICAgICAgICAgIHRvcCA9IHIudG9wOworICAgICAgICAgICAgICAgIHJpZ2h0ID0gci5yaWdodDsKKyAgICAgICAgICAgICAgICBib3R0b20gPSByLmJvdHRvbTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgdm9pZCBkdW1wKCkgY29uc3QgeworICAgICAgICBMT0dEKCJSZWN0W2w9JWYgdD0lZiByPSVmIGI9JWZdIiwgbGVmdCwgdG9wLCByaWdodCwgYm90dG9tKTsKKyAgICB9CisKK307IC8vIHN0cnVjdCBSZWN0CisKK307IC8vIG5hbWVzcGFjZSB1aXJlbmRlcmVyCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgLy8gQU5EUk9JRF9SRUNUX0gKZGlmZiAtLWdpdCBhL2xpYnMvaHd1aS9Ta2lhQ29sb3JGaWx0ZXIuY3BwIGIvbGlicy9od3VpL1NraWFDb2xvckZpbHRlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmU1N2FlNwotLS0gL2Rldi9udWxsCisrKyBiL2xpYnMvaHd1aS9Ta2lhQ29sb3JGaWx0ZXIuY3BwCkBAIC0wLDAgKzEsMTAyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgIlNraWFDb2xvckZpbHRlci5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgdWlyZW5kZXJlciB7CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIEJhc2UgY29sb3IgZmlsdGVyCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK1NraWFDb2xvckZpbHRlcjo6U2tpYUNvbG9yRmlsdGVyKFR5cGUgdHlwZSwgYm9vbCBibGVuZCk6IG1UeXBlKHR5cGUpLCBtQmxlbmQoYmxlbmQpIHsKK30KKworU2tpYUNvbG9yRmlsdGVyOjp+U2tpYUNvbG9yRmlsdGVyKCkgeworfQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBDb2xvciBtYXRyaXggZmlsdGVyCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK1NraWFDb2xvck1hdHJpeEZpbHRlcjo6U2tpYUNvbG9yTWF0cml4RmlsdGVyKGZsb2F0KiBtYXRyaXgsIGZsb2F0KiB2ZWN0b3IpOgorICAgICAgICBTa2lhQ29sb3JGaWx0ZXIoa0NvbG9yTWF0cml4LCB0cnVlKSwgbU1hdHJpeChtYXRyaXgpLCBtVmVjdG9yKHZlY3RvcikgeworfQorCitTa2lhQ29sb3JNYXRyaXhGaWx0ZXI6On5Ta2lhQ29sb3JNYXRyaXhGaWx0ZXIoKSB7CisgICAgZGVsZXRlW10gbU1hdHJpeDsKKyAgICBkZWxldGVbXSBtVmVjdG9yOworfQorCit2b2lkIFNraWFDb2xvck1hdHJpeEZpbHRlcjo6ZGVzY3JpYmUoUHJvZ3JhbURlc2NyaXB0aW9uJiBkZXNjcmlwdGlvbiwKKyAgICAgICAgY29uc3QgRXh0ZW5zaW9ucyYgZXh0ZW5zaW9ucykgeworICAgIGRlc2NyaXB0aW9uLmNvbG9yT3AgPSBQcm9ncmFtRGVzY3JpcHRpb246OmtDb2xvck1hdHJpeDsKK30KKwordm9pZCBTa2lhQ29sb3JNYXRyaXhGaWx0ZXI6OnNldHVwUHJvZ3JhbShQcm9ncmFtKiBwcm9ncmFtKSB7CisgICAgZ2xVbmlmb3JtTWF0cml4NGZ2KHByb2dyYW0tPmdldFVuaWZvcm0oImNvbG9yTWF0cml4IiksIDEsIEdMX0ZBTFNFLCAmbU1hdHJpeFswXSk7CisgICAgZ2xVbmlmb3JtNGZ2KHByb2dyYW0tPmdldFVuaWZvcm0oImNvbG9yTWF0cml4VmVjdG9yIiksIDEsIG1WZWN0b3IpOworfQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBMaWdodGluZyBjb2xvciBmaWx0ZXIKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworU2tpYUxpZ2h0aW5nRmlsdGVyOjpTa2lhTGlnaHRpbmdGaWx0ZXIoaW50IG11bHRpcGx5LCBpbnQgYWRkKToKKyAgICAgICAgU2tpYUNvbG9yRmlsdGVyKGtMaWdodGluZywgdHJ1ZSkgeworICAgIG1NdWxSID0gKChtdWx0aXBseSA+PiAxNikgJiAweEZGKSAvIDI1NS4wZjsKKyAgICBtTXVsRyA9ICgobXVsdGlwbHkgPj4gIDgpICYgMHhGRikgLyAyNTUuMGY7CisgICAgbU11bEIgPSAoKG11bHRpcGx5ICAgICAgKSAmIDB4RkYpIC8gMjU1LjBmOworCisgICAgbUFkZFIgPSAoKGFkZCA+PiAxNikgJiAweEZGKSAvIDI1NS4wZjsKKyAgICBtQWRkRyA9ICgoYWRkID4+ICA4KSAmIDB4RkYpIC8gMjU1LjBmOworICAgIG1BZGRCID0gKChhZGQgICAgICApICYgMHhGRikgLyAyNTUuMGY7Cit9CisKK3ZvaWQgU2tpYUxpZ2h0aW5nRmlsdGVyOjpkZXNjcmliZShQcm9ncmFtRGVzY3JpcHRpb24mIGRlc2NyaXB0aW9uLCBjb25zdCBFeHRlbnNpb25zJiBleHRlbnNpb25zKSB7CisgICAgZGVzY3JpcHRpb24uY29sb3JPcCA9IFByb2dyYW1EZXNjcmlwdGlvbjo6a0NvbG9yTGlnaHRpbmc7Cit9CisKK3ZvaWQgU2tpYUxpZ2h0aW5nRmlsdGVyOjpzZXR1cFByb2dyYW0oUHJvZ3JhbSogcHJvZ3JhbSkgeworICAgIGdsVW5pZm9ybTRmKHByb2dyYW0tPmdldFVuaWZvcm0oImxpZ2h0aW5nTXVsIiksIG1NdWxSLCBtTXVsRywgbU11bEIsIDEuMGYpOworICAgIGdsVW5pZm9ybTRmKHByb2dyYW0tPmdldFVuaWZvcm0oImxpZ2h0aW5nQWRkIiksIG1BZGRSLCBtQWRkRywgbUFkZEIsIDAuMGYpOworfQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBCbGVuZCBjb2xvciBmaWx0ZXIKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworU2tpYUJsZW5kRmlsdGVyOjpTa2lhQmxlbmRGaWx0ZXIoaW50IGNvbG9yLCBTa1hmZXJtb2RlOjpNb2RlIG1vZGUpOgorICAgICAgICBTa2lhQ29sb3JGaWx0ZXIoa0JsZW5kLCB0cnVlKSwgbU1vZGUobW9kZSkgeworICAgIGNvbnN0IGludCBhbHBoYSA9IChjb2xvciA+PiAyNCkgJiAweEZGOworICAgIG1BID0gYWxwaGEgLyAyNTUuMGY7CisgICAgbVIgPSBtQSAqICgoY29sb3IgPj4gMTYpICYgMHhGRikgLyAyNTUuMGY7CisgICAgbUcgPSBtQSAqICgoY29sb3IgPj4gIDgpICYgMHhGRikgLyAyNTUuMGY7CisgICAgbUIgPSBtQSAqICgoY29sb3IgICAgICApICYgMHhGRikgLyAyNTUuMGY7Cit9CisKK3ZvaWQgU2tpYUJsZW5kRmlsdGVyOjpkZXNjcmliZShQcm9ncmFtRGVzY3JpcHRpb24mIGRlc2NyaXB0aW9uLCBjb25zdCBFeHRlbnNpb25zJiBleHRlbnNpb25zKSB7CisgICAgZGVzY3JpcHRpb24uY29sb3JPcCA9IFByb2dyYW1EZXNjcmlwdGlvbjo6a0NvbG9yQmxlbmQ7CisgICAgZGVzY3JpcHRpb24uY29sb3JNb2RlID0gbU1vZGU7Cit9CisKK3ZvaWQgU2tpYUJsZW5kRmlsdGVyOjpzZXR1cFByb2dyYW0oUHJvZ3JhbSogcHJvZ3JhbSkgeworICAgIGdsVW5pZm9ybTRmKHByb2dyYW0tPmdldFVuaWZvcm0oImNvbG9yQmxlbmQiKSwgbVIsIG1HLCBtQiwgbUEpOworfQorCit9OyAvLyBuYW1lc3BhY2UgdWlyZW5kZXJlcgorfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2xpYnMvaHd1aS9Ta2lhQ29sb3JGaWx0ZXIuaCBiL2xpYnMvaHd1aS9Ta2lhQ29sb3JGaWx0ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NjViNmYwCi0tLSAvZGV2L251bGwKKysrIGIvbGlicy9od3VpL1NraWFDb2xvckZpbHRlci5oCkBAIC0wLDAgKzEsMTE4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX1VJX1NLSUFfQ09MT1JfRklMVEVSX0gKKyNkZWZpbmUgQU5EUk9JRF9VSV9TS0lBX0NPTE9SX0ZJTFRFUl9ICisKKyNpbmNsdWRlIDxHTEVTMi9nbDIuaD4KKworI2luY2x1ZGUgIlByb2dyYW1DYWNoZS5oIgorI2luY2x1ZGUgIkV4dGVuc2lvbnMuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIHVpcmVuZGVyZXIgeworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBCYXNlIGNvbG9yIGZpbHRlcgorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisvKioKKyAqIFJlcHJlc2VudHMgYSBTa2lhIGNvbG9yIGZpbHRlci4gQSBjb2xvciBmaWx0ZXIgbW9kaWZpZXMgYSBQcm9ncmFtRGVzY3JpcHRpb24KKyAqIGFuZCBzZXRzIHVuaWZvcm1zIG9uIHRoZSByZXN1bHRpbmcgc2hhZGVycy4KKyAqLworc3RydWN0IFNraWFDb2xvckZpbHRlciB7CisgICAgLyoqCisgICAgICogVHlwZSBvZiBTa2lhIGNvbG9yIGZpbHRlciBpbiB1c2UuCisgICAgICovCisgICAgZW51bSBUeXBlIHsKKyAgICAgICAga05vbmUsCisgICAgICAgIGtDb2xvck1hdHJpeCwKKyAgICAgICAga0xpZ2h0aW5nLAorICAgICAgICBrQmxlbmQsCisgICAgfTsKKworICAgIFNraWFDb2xvckZpbHRlcihUeXBlIHR5cGUsIGJvb2wgYmxlbmQpOworICAgIHZpcnR1YWwgflNraWFDb2xvckZpbHRlcigpOworCisgICAgdmlydHVhbCB2b2lkIGRlc2NyaWJlKFByb2dyYW1EZXNjcmlwdGlvbiYgZGVzY3JpcHRpb24sIGNvbnN0IEV4dGVuc2lvbnMmIGV4dGVuc2lvbnMpID0gMDsKKyAgICB2aXJ0dWFsIHZvaWQgc2V0dXBQcm9ncmFtKFByb2dyYW0qIHByb2dyYW0pID0gMDsKKworICAgIGlubGluZSBib29sIGJsZW5kKCkgY29uc3QgeworICAgICAgICByZXR1cm4gbUJsZW5kOworICAgIH0KKworICAgIFR5cGUgdHlwZSgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1UeXBlOworICAgIH0KKworcHJvdGVjdGVkOgorICAgIFR5cGUgbVR5cGU7CisgICAgYm9vbCBtQmxlbmQ7Cit9OyAvLyBzdHJ1Y3QgU2tpYUNvbG9yRmlsdGVyCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIEltcGxlbWVudGF0aW9ucworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisvKioKKyAqIEEgY29sb3IgZmlsdGVyIHRoYXQgbXVsdGlwbGllcyB0aGUgc291cmNlIGNvbG9yIHdpdGggYSBtYXRyaXggYW5kIGFkZHMgYSB2ZWN0b3IuCisgKi8KK3N0cnVjdCBTa2lhQ29sb3JNYXRyaXhGaWx0ZXI6IHB1YmxpYyBTa2lhQ29sb3JGaWx0ZXIgeworICAgIFNraWFDb2xvck1hdHJpeEZpbHRlcihmbG9hdCogbWF0cml4LCBmbG9hdCogdmVjdG9yKTsKKyAgICB+U2tpYUNvbG9yTWF0cml4RmlsdGVyKCk7CisKKyAgICB2b2lkIGRlc2NyaWJlKFByb2dyYW1EZXNjcmlwdGlvbiYgZGVzY3JpcHRpb24sIGNvbnN0IEV4dGVuc2lvbnMmIGV4dGVuc2lvbnMpOworICAgIHZvaWQgc2V0dXBQcm9ncmFtKFByb2dyYW0qIHByb2dyYW0pOworCitwcml2YXRlOgorICAgIGZsb2F0KiBtTWF0cml4OworICAgIGZsb2F0KiBtVmVjdG9yOworfTsgLy8gc3RydWN0IFNraWFDb2xvck1hdHJpeEZpbHRlcgorCisvKioKKyAqIEEgY29sb3IgZmlsdGVycyB0aGF0IG11bHRpcGxpZXMgdGhlIHNvdXJjZSBjb2xvciB3aXRoIGEgZml4ZWQgdmFsdWUgYW5kIGFkZHMKKyAqIGFub3RoZXIgZml4ZWQgdmFsdWUuIElnbm9yZXMgdGhlIGFscGhhIGNoYW5uZWwgb2YgYm90aCBhcmd1bWVudHMuCisgKi8KK3N0cnVjdCBTa2lhTGlnaHRpbmdGaWx0ZXI6IHB1YmxpYyBTa2lhQ29sb3JGaWx0ZXIgeworICAgIFNraWFMaWdodGluZ0ZpbHRlcihpbnQgbXVsdGlwbHksIGludCBhZGQpOworCisgICAgdm9pZCBkZXNjcmliZShQcm9ncmFtRGVzY3JpcHRpb24mIGRlc2NyaXB0aW9uLCBjb25zdCBFeHRlbnNpb25zJiBleHRlbnNpb25zKTsKKyAgICB2b2lkIHNldHVwUHJvZ3JhbShQcm9ncmFtKiBwcm9ncmFtKTsKKworcHJpdmF0ZToKKyAgICBHTGZsb2F0IG1NdWxSLCBtTXVsRywgbU11bEI7CisgICAgR0xmbG9hdCBtQWRkUiwgbUFkZEcsIG1BZGRCOworfTsgLy8gc3RydWN0IFNraWFMaWdodGluZ0ZpbHRlcgorCisvKioKKyAqIEEgY29sb3IgZmlsdGVycyB0aGF0IGJsZW5kcyB0aGUgc291cmNlIGNvbG9yIHdpdGggYSBzcGVjaWZpZWQgZGVzdGluYXRpb24gY29sb3IKKyAqIGFuZCBQb3J0ZXJEdWZmIGJsZW5kaW5nIG1vZGUuCisgKi8KK3N0cnVjdCBTa2lhQmxlbmRGaWx0ZXI6IHB1YmxpYyBTa2lhQ29sb3JGaWx0ZXIgeworICAgIFNraWFCbGVuZEZpbHRlcihpbnQgY29sb3IsIFNrWGZlcm1vZGU6Ok1vZGUgbW9kZSk7CisKKyAgICB2b2lkIGRlc2NyaWJlKFByb2dyYW1EZXNjcmlwdGlvbiYgZGVzY3JpcHRpb24sIGNvbnN0IEV4dGVuc2lvbnMmIGV4dGVuc2lvbnMpOworICAgIHZvaWQgc2V0dXBQcm9ncmFtKFByb2dyYW0qIHByb2dyYW0pOworCitwcml2YXRlOgorICAgIFNrWGZlcm1vZGU6Ok1vZGUgbU1vZGU7CisgICAgR0xmbG9hdCBtUiwgbUcsIG1CLCBtQTsKK307IC8vIHN0cnVjdCBTa2lhQmxlbmRGaWx0ZXIKKworfTsgLy8gbmFtZXNwYWNlIHVpcmVuZGVyZXIKK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAvLyBBTkRST0lEX1VJX1NLSUFfQ09MT1JfRklMVEVSX0gKZGlmZiAtLWdpdCBhL2xpYnMvaHd1aS9Ta2lhU2hhZGVyLmNwcCBiL2xpYnMvaHd1aS9Ta2lhU2hhZGVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNWUwZjc4Ci0tLSAvZGV2L251bGwKKysrIGIvbGlicy9od3VpL1NraWFTaGFkZXIuY3BwCkBAIC0wLDAgKzEsMjIwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJPcGVuR0xSZW5kZXJlciIKKworI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSA8U2tNYXRyaXguaD4KKworI2luY2x1ZGUgIlNraWFTaGFkZXIuaCIKKyNpbmNsdWRlICJUZXh0dXJlLmgiCisjaW5jbHVkZSAiTWF0cml4LmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSB1aXJlbmRlcmVyIHsKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gU3VwcG9ydAorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitzdGF0aWMgY29uc3QgR0xlbnVtIGdUZXh0dXJlVW5pdHNNYXBbXSA9IHsKKyAgICAgICAgR0xfVEVYVFVSRTAsCisgICAgICAgIEdMX1RFWFRVUkUxLAorICAgICAgICBHTF9URVhUVVJFMgorfTsKKworc3RhdGljIGNvbnN0IEdMaW50IGdUaWxlTW9kZXNbXSA9IHsKKyAgICAgICAgR0xfQ0xBTVBfVE9fRURHRSwgICAvLyA9PSBTa1NoYWRlcjo6a0NsYW1wX1RpbGVNb2RlCisgICAgICAgIEdMX1JFUEVBVCwgICAgICAgICAgLy8gPT0gU2tTaGFkZXI6OmtSZXBlYXRfTW9kZQorICAgICAgICBHTF9NSVJST1JFRF9SRVBFQVQgIC8vID09IFNrU2hhZGVyOjprTWlycm9yX1RpbGVNb2RlCit9OworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBCYXNlIHNoYWRlcgorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitTa2lhU2hhZGVyOjpTa2lhU2hhZGVyKFR5cGUgdHlwZSwgU2tTaGFkZXIqIGtleSwgU2tTaGFkZXI6OlRpbGVNb2RlIHRpbGVYLAorICAgICAgICBTa1NoYWRlcjo6VGlsZU1vZGUgdGlsZVksIFNrTWF0cml4KiBtYXRyaXgsIGJvb2wgYmxlbmQpOgorICAgICAgICBtVHlwZSh0eXBlKSwgbUtleShrZXkpLCBtVGlsZVgodGlsZVgpLCBtVGlsZVkodGlsZVkpLCBtTWF0cml4KG1hdHJpeCksIG1CbGVuZChibGVuZCkgeworfQorCitTa2lhU2hhZGVyOjp+U2tpYVNoYWRlcigpIHsKK30KKwordm9pZCBTa2lhU2hhZGVyOjpkZXNjcmliZShQcm9ncmFtRGVzY3JpcHRpb24mIGRlc2NyaXB0aW9uLCBjb25zdCBFeHRlbnNpb25zJiBleHRlbnNpb25zKSB7Cit9CisKK3ZvaWQgU2tpYVNoYWRlcjo6c2V0dXBQcm9ncmFtKFByb2dyYW0qIHByb2dyYW0sIGNvbnN0IG1hdDQmIG1vZGVsVmlldywgY29uc3QgU25hcHNob3QmIHNuYXBzaG90LAorICAgICAgICBHTHVpbnQqIHRleHR1cmVVbml0KSB7Cit9CisKK3ZvaWQgU2tpYVNoYWRlcjo6YmluZFRleHR1cmUoR0x1aW50IHRleHR1cmUsIEdMZW51bSB3cmFwUywgR0xlbnVtIHdyYXBULCBHTHVpbnQgdGV4dHVyZVVuaXQpIHsKKyAgICBnbEFjdGl2ZVRleHR1cmUoZ1RleHR1cmVVbml0c01hcFt0ZXh0dXJlVW5pdF0pOworICAgIGdsQmluZFRleHR1cmUoR0xfVEVYVFVSRV8yRCwgdGV4dHVyZSk7CisgICAgZ2xUZXhQYXJhbWV0ZXJpKEdMX1RFWFRVUkVfMkQsIEdMX1RFWFRVUkVfV1JBUF9TLCB3cmFwUyk7CisgICAgZ2xUZXhQYXJhbWV0ZXJpKEdMX1RFWFRVUkVfMkQsIEdMX1RFWFRVUkVfV1JBUF9ULCB3cmFwVCk7Cit9CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIEJpdG1hcCBzaGFkZXIKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworU2tpYUJpdG1hcFNoYWRlcjo6U2tpYUJpdG1hcFNoYWRlcihTa0JpdG1hcCogYml0bWFwLCBTa1NoYWRlcioga2V5LCBTa1NoYWRlcjo6VGlsZU1vZGUgdGlsZVgsCisgICAgICAgIFNrU2hhZGVyOjpUaWxlTW9kZSB0aWxlWSwgU2tNYXRyaXgqIG1hdHJpeCwgYm9vbCBibGVuZCk6CisgICAgICAgIFNraWFTaGFkZXIoa0JpdG1hcCwga2V5LCB0aWxlWCwgdGlsZVksIG1hdHJpeCwgYmxlbmQpLCBtQml0bWFwKGJpdG1hcCksIG1UZXh0dXJlKE5VTEwpIHsKK30KKwordm9pZCBTa2lhQml0bWFwU2hhZGVyOjpkZXNjcmliZShQcm9ncmFtRGVzY3JpcHRpb24mIGRlc2NyaXB0aW9uLCBjb25zdCBFeHRlbnNpb25zJiBleHRlbnNpb25zKSB7CisgICAgY29uc3QgVGV4dHVyZSogdGV4dHVyZSA9IG1UZXh0dXJlQ2FjaGUtPmdldChtQml0bWFwKTsKKyAgICBpZiAoIXRleHR1cmUpIHJldHVybjsKKyAgICBtVGV4dHVyZSA9IHRleHR1cmU7CisKKyAgICBjb25zdCBmbG9hdCB3aWR0aCA9IHRleHR1cmUtPndpZHRoOworICAgIGNvbnN0IGZsb2F0IGhlaWdodCA9IHRleHR1cmUtPmhlaWdodDsKKworICAgIGRlc2NyaXB0aW9uLmhhc0JpdG1hcCA9IHRydWU7CisgICAgLy8gVGhlIGRyaXZlciBkb2VzIG5vdCBzdXBwb3J0IG5vbi1wb3dlciBvZiB0d28gbWlycm9yZWQvcmVwZWF0ZWQKKyAgICAvLyB0ZXh0dXJlcywgc28gZG8gaXQgb3Vyc2VsdmVzCisgICAgaWYgKCFleHRlbnNpb25zLmhhc05Qb3QoKSAmJiAoIWlzUG93ZXJPZlR3byh3aWR0aCkgfHwgIWlzUG93ZXJPZlR3byhoZWlnaHQpKSAmJgorICAgICAgICAgICAgKG1UaWxlWCAhPSBTa1NoYWRlcjo6a0NsYW1wX1RpbGVNb2RlIHx8IG1UaWxlWSAhPSBTa1NoYWRlcjo6a0NsYW1wX1RpbGVNb2RlKSkgeworICAgICAgICBkZXNjcmlwdGlvbi5pc0JpdG1hcE5wb3QgPSB0cnVlOworICAgICAgICBkZXNjcmlwdGlvbi5iaXRtYXBXcmFwUyA9IGdUaWxlTW9kZXNbbVRpbGVYXTsKKyAgICAgICAgZGVzY3JpcHRpb24uYml0bWFwV3JhcFQgPSBnVGlsZU1vZGVzW21UaWxlWV07CisgICAgfQorfQorCit2b2lkIFNraWFCaXRtYXBTaGFkZXI6OnNldHVwUHJvZ3JhbShQcm9ncmFtKiBwcm9ncmFtLCBjb25zdCBtYXQ0JiBtb2RlbFZpZXcsCisgICAgICAgIGNvbnN0IFNuYXBzaG90JiBzbmFwc2hvdCwgR0x1aW50KiB0ZXh0dXJlVW5pdCkgeworICAgIEdMdWludCB0ZXh0dXJlU2xvdCA9ICgqdGV4dHVyZVVuaXQpKys7CisgICAgZ2xBY3RpdmVUZXh0dXJlKGdUZXh0dXJlVW5pdHNNYXBbdGV4dHVyZVNsb3RdKTsKKworICAgIGNvbnN0IFRleHR1cmUqIHRleHR1cmUgPSBtVGV4dHVyZTsKKyAgICBtVGV4dHVyZSA9IE5VTEw7CisgICAgaWYgKCF0ZXh0dXJlKSByZXR1cm47CisgICAgY29uc3QgQXV0b1RleHR1cmUgYXV0b0NsZWFudXAodGV4dHVyZSk7CisKKyAgICBjb25zdCBmbG9hdCB3aWR0aCA9IHRleHR1cmUtPndpZHRoOworICAgIGNvbnN0IGZsb2F0IGhlaWdodCA9IHRleHR1cmUtPmhlaWdodDsKKworICAgIG1hdDQgdGV4dHVyZVRyYW5zZm9ybTsKKyAgICBpZiAobU1hdHJpeCkgeworICAgICAgICBTa01hdHJpeCBpbnZlcnNlOworICAgICAgICBtTWF0cml4LT5pbnZlcnQoJmludmVyc2UpOworICAgICAgICB0ZXh0dXJlVHJhbnNmb3JtLmxvYWQoaW52ZXJzZSk7CisgICAgICAgIHRleHR1cmVUcmFuc2Zvcm0ubXVsdGlwbHkobW9kZWxWaWV3KTsKKyAgICB9IGVsc2UgeworICAgICAgICB0ZXh0dXJlVHJhbnNmb3JtLmxvYWQobW9kZWxWaWV3KTsKKyAgICB9CisKKyAgICAvLyBVbmlmb3JtcworICAgIGJpbmRUZXh0dXJlKHRleHR1cmUtPmlkLCBnVGlsZU1vZGVzW21UaWxlWF0sIGdUaWxlTW9kZXNbbVRpbGVZXSwgdGV4dHVyZVNsb3QpOworICAgIGdsVW5pZm9ybTFpKHByb2dyYW0tPmdldFVuaWZvcm0oImJpdG1hcFNhbXBsZXIiKSwgdGV4dHVyZVNsb3QpOworICAgIGdsVW5pZm9ybU1hdHJpeDRmdihwcm9ncmFtLT5nZXRVbmlmb3JtKCJ0ZXh0dXJlVHJhbnNmb3JtIiksIDEsCisgICAgICAgICAgICBHTF9GQUxTRSwgJnRleHR1cmVUcmFuc2Zvcm0uZGF0YVswXSk7CisgICAgZ2xVbmlmb3JtMmYocHJvZ3JhbS0+Z2V0VW5pZm9ybSgidGV4dHVyZURpbWVuc2lvbiIpLCAxLjBmIC8gd2lkdGgsIDEuMGYgLyBoZWlnaHQpOworfQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBMaW5lYXIgZ3JhZGllbnQgc2hhZGVyCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK1NraWFMaW5lYXJHcmFkaWVudFNoYWRlcjo6U2tpYUxpbmVhckdyYWRpZW50U2hhZGVyKGZsb2F0KiBib3VuZHMsIHVpbnQzMl90KiBjb2xvcnMsCisgICAgICAgIGZsb2F0KiBwb3NpdGlvbnMsIGludCBjb3VudCwgU2tTaGFkZXIqIGtleSwgU2tTaGFkZXI6OlRpbGVNb2RlIHRpbGVNb2RlLAorICAgICAgICBTa01hdHJpeCogbWF0cml4LCBib29sIGJsZW5kKToKKyAgICAgICAgU2tpYVNoYWRlcihrTGluZWFyR3JhZGllbnQsIGtleSwgdGlsZU1vZGUsIHRpbGVNb2RlLCBtYXRyaXgsIGJsZW5kKSwKKyAgICAgICAgbUJvdW5kcyhib3VuZHMpLCBtQ29sb3JzKGNvbG9ycyksIG1Qb3NpdGlvbnMocG9zaXRpb25zKSwgbUNvdW50KGNvdW50KSB7Cit9CisKK1NraWFMaW5lYXJHcmFkaWVudFNoYWRlcjo6flNraWFMaW5lYXJHcmFkaWVudFNoYWRlcigpIHsKKyAgICBkZWxldGVbXSBtQm91bmRzOworICAgIGRlbGV0ZVtdIG1Db2xvcnM7CisgICAgZGVsZXRlW10gbVBvc2l0aW9uczsKK30KKwordm9pZCBTa2lhTGluZWFyR3JhZGllbnRTaGFkZXI6OmRlc2NyaWJlKFByb2dyYW1EZXNjcmlwdGlvbiYgZGVzY3JpcHRpb24sCisgICAgICAgIGNvbnN0IEV4dGVuc2lvbnMmIGV4dGVuc2lvbnMpIHsKKyAgICBkZXNjcmlwdGlvbi5oYXNHcmFkaWVudCA9IHRydWU7Cit9CisKK3ZvaWQgU2tpYUxpbmVhckdyYWRpZW50U2hhZGVyOjpzZXR1cFByb2dyYW0oUHJvZ3JhbSogcHJvZ3JhbSwgY29uc3QgbWF0NCYgbW9kZWxWaWV3LAorICAgICAgICBjb25zdCBTbmFwc2hvdCYgc25hcHNob3QsIEdMdWludCogdGV4dHVyZVVuaXQpIHsKKyAgICBHTHVpbnQgdGV4dHVyZVNsb3QgPSAoKnRleHR1cmVVbml0KSsrOworICAgIGdsQWN0aXZlVGV4dHVyZShnVGV4dHVyZVVuaXRzTWFwW3RleHR1cmVTbG90XSk7CisKKyAgICBUZXh0dXJlKiB0ZXh0dXJlID0gbUdyYWRpZW50Q2FjaGUtPmdldChtS2V5KTsKKyAgICBpZiAoIXRleHR1cmUpIHsKKyAgICAgICAgdGV4dHVyZSA9IG1HcmFkaWVudENhY2hlLT5hZGRMaW5lYXJHcmFkaWVudChtS2V5LCBtQm91bmRzLCBtQ29sb3JzLCBtUG9zaXRpb25zLAorICAgICAgICAgICAgICAgIG1Db3VudCwgbVRpbGVYKTsKKyAgICB9CisKKyAgICBSZWN0IHN0YXJ0KG1Cb3VuZHNbMF0sIG1Cb3VuZHNbMV0sIG1Cb3VuZHNbMl0sIG1Cb3VuZHNbM10pOworICAgIGlmIChtTWF0cml4KSB7CisgICAgICAgIG1hdDQgc2hhZGVyTWF0cml4KCptTWF0cml4KTsKKyAgICAgICAgc2hhZGVyTWF0cml4Lm1hcFBvaW50KHN0YXJ0LmxlZnQsIHN0YXJ0LnRvcCk7CisgICAgICAgIHNoYWRlck1hdHJpeC5tYXBQb2ludChzdGFydC5yaWdodCwgc3RhcnQuYm90dG9tKTsKKyAgICB9CisgICAgc25hcHNob3QudHJhbnNmb3JtLT5tYXBSZWN0KHN0YXJ0KTsKKworICAgIGNvbnN0IGZsb2F0IGdyYWRpZW50WCA9IHN0YXJ0LnJpZ2h0IC0gc3RhcnQubGVmdDsKKyAgICBjb25zdCBmbG9hdCBncmFkaWVudFkgPSBzdGFydC5ib3R0b20gLSBzdGFydC50b3A7CisKKyAgICBtYXQ0IHNjcmVlblNwYWNlKCpzbmFwc2hvdC50cmFuc2Zvcm0pOworICAgIHNjcmVlblNwYWNlLm11bHRpcGx5KG1vZGVsVmlldyk7CisKKyAgICAvLyBVbmlmb3JtcworICAgIGJpbmRUZXh0dXJlKHRleHR1cmUtPmlkLCBnVGlsZU1vZGVzW21UaWxlWF0sIGdUaWxlTW9kZXNbbVRpbGVZXSwgdGV4dHVyZVNsb3QpOworICAgIGdsVW5pZm9ybTFpKHByb2dyYW0tPmdldFVuaWZvcm0oImdyYWRpZW50U2FtcGxlciIpLCB0ZXh0dXJlU2xvdCk7CisgICAgZ2xVbmlmb3JtMmYocHJvZ3JhbS0+Z2V0VW5pZm9ybSgiZ3JhZGllbnRTdGFydCIpLCBzdGFydC5sZWZ0LCBzdGFydC50b3ApOworICAgIGdsVW5pZm9ybTJmKHByb2dyYW0tPmdldFVuaWZvcm0oImdyYWRpZW50IiksIGdyYWRpZW50WCwgZ3JhZGllbnRZKTsKKyAgICBnbFVuaWZvcm0xZihwcm9ncmFtLT5nZXRVbmlmb3JtKCJncmFkaWVudExlbmd0aCIpLAorICAgICAgICAgICAgMS4wZiAvIChncmFkaWVudFggKiBncmFkaWVudFggKyBncmFkaWVudFkgKiBncmFkaWVudFkpKTsKKyAgICBnbFVuaWZvcm1NYXRyaXg0ZnYocHJvZ3JhbS0+Z2V0VW5pZm9ybSgic2NyZWVuU3BhY2UiKSwgMSwgR0xfRkFMU0UsICZzY3JlZW5TcGFjZS5kYXRhWzBdKTsKK30KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gQ29tcG9zZSBzaGFkZXIKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworU2tpYUNvbXBvc2VTaGFkZXI6OlNraWFDb21wb3NlU2hhZGVyKFNraWFTaGFkZXIqIGZpcnN0LCBTa2lhU2hhZGVyKiBzZWNvbmQsCisgICAgICAgIFNrWGZlcm1vZGU6Ok1vZGUgbW9kZSwgU2tTaGFkZXIqIGtleSk6CisgICAgICAgIFNraWFTaGFkZXIoa0NvbXBvc2UsIGtleSwgU2tTaGFkZXI6OmtDbGFtcF9UaWxlTW9kZSwgU2tTaGFkZXI6OmtDbGFtcF9UaWxlTW9kZSwKKyAgICAgICAgTlVMTCwgZmlyc3QtPmJsZW5kKCkgfHwgc2Vjb25kLT5ibGVuZCgpKSwgbUZpcnN0KGZpcnN0KSwgbVNlY29uZChzZWNvbmQpLCBtTW9kZShtb2RlKSB7Cit9CisKK3ZvaWQgU2tpYUNvbXBvc2VTaGFkZXI6OnNldChUZXh0dXJlQ2FjaGUqIHRleHR1cmVDYWNoZSwgR3JhZGllbnRDYWNoZSogZ3JhZGllbnRDYWNoZSkgeworICAgIFNraWFTaGFkZXI6OnNldCh0ZXh0dXJlQ2FjaGUsIGdyYWRpZW50Q2FjaGUpOworICAgIG1GaXJzdC0+c2V0KHRleHR1cmVDYWNoZSwgZ3JhZGllbnRDYWNoZSk7CisgICAgbVNlY29uZC0+c2V0KHRleHR1cmVDYWNoZSwgZ3JhZGllbnRDYWNoZSk7Cit9CisKK3ZvaWQgU2tpYUNvbXBvc2VTaGFkZXI6OmRlc2NyaWJlKFByb2dyYW1EZXNjcmlwdGlvbiYgZGVzY3JpcHRpb24sIGNvbnN0IEV4dGVuc2lvbnMmIGV4dGVuc2lvbnMpIHsKKyAgICBtRmlyc3QtPmRlc2NyaWJlKGRlc2NyaXB0aW9uLCBleHRlbnNpb25zKTsKKyAgICBtU2Vjb25kLT5kZXNjcmliZShkZXNjcmlwdGlvbiwgZXh0ZW5zaW9ucyk7CisgICAgaWYgKG1GaXJzdC0+dHlwZSgpID09IGtCaXRtYXApIHsKKyAgICAgICAgZGVzY3JpcHRpb24uaXNCaXRtYXBGaXJzdCA9IHRydWU7CisgICAgfQorICAgIGRlc2NyaXB0aW9uLnNoYWRlcnNNb2RlID0gbU1vZGU7Cit9CisKK3ZvaWQgU2tpYUNvbXBvc2VTaGFkZXI6OnNldHVwUHJvZ3JhbShQcm9ncmFtKiBwcm9ncmFtLCBjb25zdCBtYXQ0JiBtb2RlbFZpZXcsCisgICAgICAgIGNvbnN0IFNuYXBzaG90JiBzbmFwc2hvdCwgR0x1aW50KiB0ZXh0dXJlVW5pdCkgeworICAgIG1GaXJzdC0+c2V0dXBQcm9ncmFtKHByb2dyYW0sIG1vZGVsVmlldywgc25hcHNob3QsIHRleHR1cmVVbml0KTsKKyAgICBtU2Vjb25kLT5zZXR1cFByb2dyYW0ocHJvZ3JhbSwgbW9kZWxWaWV3LCBzbmFwc2hvdCwgdGV4dHVyZVVuaXQpOworfQorCit9OyAvLyBuYW1lc3BhY2UgdWlyZW5kZXJlcgorfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2xpYnMvaHd1aS9Ta2lhU2hhZGVyLmggYi9saWJzL2h3dWkvU2tpYVNoYWRlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ5NWUzYjAKLS0tIC9kZXYvbnVsbAorKysgYi9saWJzL2h3dWkvU2tpYVNoYWRlci5oCkBAIC0wLDAgKzEsMTYyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX1VJX1NLSUFfU0hBREVSX0gKKyNkZWZpbmUgQU5EUk9JRF9VSV9TS0lBX1NIQURFUl9ICisKKyNpbmNsdWRlIDxTa1NoYWRlci5oPgorI2luY2x1ZGUgPFNrWGZlcm1vZGUuaD4KKworI2luY2x1ZGUgPEdMRVMyL2dsMi5oPgorCisjaW5jbHVkZSAiRXh0ZW5zaW9ucy5oIgorI2luY2x1ZGUgIlByb2dyYW1DYWNoZS5oIgorI2luY2x1ZGUgIlRleHR1cmVDYWNoZS5oIgorI2luY2x1ZGUgIkdyYWRpZW50Q2FjaGUuaCIKKyNpbmNsdWRlICJTbmFwc2hvdC5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgdWlyZW5kZXJlciB7CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIEJhc2Ugc2hhZGVyCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKy8qKgorICogUmVwcmVzZW50cyBhIFNraWEgc2hhZGVyLiBBIHNoYWRlciB3aWxsIG1vZGlmeSB0aGUgR0wgY29udGV4dCBhbmQgYWN0aXZlCisgKiBwcm9ncmFtIHRvIHJlY3JlYXRlIHRoZSBvcmlnaW5hbCBlZmZlY3QuCisgKi8KK3N0cnVjdCBTa2lhU2hhZGVyIHsKKyAgICAvKioKKyAgICAgKiBUeXBlIG9mIFNraWEgc2hhZGVyIGluIHVzZS4KKyAgICAgKi8KKyAgICBlbnVtIFR5cGUgeworICAgICAgICBrTm9uZSwKKyAgICAgICAga0JpdG1hcCwKKyAgICAgICAga0xpbmVhckdyYWRpZW50LAorICAgICAgICBrQ2lyY3VsYXJHcmFkaWVudCwKKyAgICAgICAga1N3ZWVwR3JhZGllbnQsCisgICAgICAgIGtDb21wb3NlCisgICAgfTsKKworICAgIFNraWFTaGFkZXIoVHlwZSB0eXBlLCBTa1NoYWRlcioga2V5LCBTa1NoYWRlcjo6VGlsZU1vZGUgdGlsZVgsIFNrU2hhZGVyOjpUaWxlTW9kZSB0aWxlWSwKKyAgICAgICAgICAgIFNrTWF0cml4KiBtYXRyaXgsIGJvb2wgYmxlbmQpOworICAgIHZpcnR1YWwgflNraWFTaGFkZXIoKTsKKworICAgIHZpcnR1YWwgdm9pZCBkZXNjcmliZShQcm9ncmFtRGVzY3JpcHRpb24mIGRlc2NyaXB0aW9uLCBjb25zdCBFeHRlbnNpb25zJiBleHRlbnNpb25zKTsKKyAgICB2aXJ0dWFsIHZvaWQgc2V0dXBQcm9ncmFtKFByb2dyYW0qIHByb2dyYW0sIGNvbnN0IG1hdDQmIG1vZGVsVmlldywgY29uc3QgU25hcHNob3QmIHNuYXBzaG90LAorICAgICAgICAgICAgR0x1aW50KiB0ZXh0dXJlVW5pdCk7CisKKyAgICBpbmxpbmUgYm9vbCBibGVuZCgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1CbGVuZDsKKyAgICB9CisKKyAgICBUeXBlIHR5cGUoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtVHlwZTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHZvaWQgc2V0KFRleHR1cmVDYWNoZSogdGV4dHVyZUNhY2hlLCBHcmFkaWVudENhY2hlKiBncmFkaWVudENhY2hlKSB7CisgICAgICAgIG1UZXh0dXJlQ2FjaGUgPSB0ZXh0dXJlQ2FjaGU7CisgICAgICAgIG1HcmFkaWVudENhY2hlID0gZ3JhZGllbnRDYWNoZTsKKyAgICB9CisKKyAgICB2b2lkIHNldE1hdHJpeChTa01hdHJpeCogbWF0cml4KSB7CisgICAgICAgIG1NYXRyaXggPSBtYXRyaXg7CisgICAgfQorCitwcm90ZWN0ZWQ6CisgICAgaW5saW5lIHZvaWQgYmluZFRleHR1cmUoR0x1aW50IHRleHR1cmUsIEdMZW51bSB3cmFwUywgR0xlbnVtIHdyYXBULCBHTHVpbnQgdGV4dHVyZVVuaXQpOworCisgICAgVHlwZSBtVHlwZTsKKyAgICBTa1NoYWRlciogbUtleTsKKyAgICBTa1NoYWRlcjo6VGlsZU1vZGUgbVRpbGVYOworICAgIFNrU2hhZGVyOjpUaWxlTW9kZSBtVGlsZVk7CisgICAgU2tNYXRyaXgqIG1NYXRyaXg7CisgICAgYm9vbCBtQmxlbmQ7CisKKyAgICBUZXh0dXJlQ2FjaGUqIG1UZXh0dXJlQ2FjaGU7CisgICAgR3JhZGllbnRDYWNoZSogbUdyYWRpZW50Q2FjaGU7Cit9OyAvLyBzdHJ1Y3QgU2tpYVNoYWRlcgorCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIEltcGxlbWVudGF0aW9ucworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisvKioKKyAqIEEgc2hhZGVyIHRoYXQgZHJhd3MgYSBiaXRtYXAuCisgKi8KK3N0cnVjdCBTa2lhQml0bWFwU2hhZGVyOiBwdWJsaWMgU2tpYVNoYWRlciB7CisgICAgU2tpYUJpdG1hcFNoYWRlcihTa0JpdG1hcCogYml0bWFwLCBTa1NoYWRlcioga2V5LCBTa1NoYWRlcjo6VGlsZU1vZGUgdGlsZVgsCisgICAgICAgICAgICBTa1NoYWRlcjo6VGlsZU1vZGUgdGlsZVksIFNrTWF0cml4KiBtYXRyaXgsIGJvb2wgYmxlbmQpOworCisgICAgdm9pZCBkZXNjcmliZShQcm9ncmFtRGVzY3JpcHRpb24mIGRlc2NyaXB0aW9uLCBjb25zdCBFeHRlbnNpb25zJiBleHRlbnNpb25zKTsKKyAgICB2b2lkIHNldHVwUHJvZ3JhbShQcm9ncmFtKiBwcm9ncmFtLCBjb25zdCBtYXQ0JiBtb2RlbFZpZXcsIGNvbnN0IFNuYXBzaG90JiBzbmFwc2hvdCwKKyAgICAgICAgICAgIEdMdWludCogdGV4dHVyZVVuaXQpOworCitwcml2YXRlOgorICAgIC8qKgorICAgICAqIFRoaXMgbWV0aG9kIGRvZXMgbm90IHdvcmsgZm9yIG4gPT0gMC4KKyAgICAgKi8KKyAgICBpbmxpbmUgYm9vbCBpc1Bvd2VyT2ZUd28odW5zaWduZWQgaW50IG4pIHsKKyAgICAgICAgcmV0dXJuICEobiAmIChuIC0gMSkpOworICAgIH0KKworICAgIFNrQml0bWFwKiBtQml0bWFwOworICAgIGNvbnN0IFRleHR1cmUqIG1UZXh0dXJlOworfTsgLy8gc3RydWN0IFNraWFCaXRtYXBTaGFkZXIKKworLyoqCisgKiBBIHNoYWRlciB0aGF0IGRyYXdzIGEgbGluZWFyIGdyYWRpZW50LgorICovCitzdHJ1Y3QgU2tpYUxpbmVhckdyYWRpZW50U2hhZGVyOiBwdWJsaWMgU2tpYVNoYWRlciB7CisgICAgU2tpYUxpbmVhckdyYWRpZW50U2hhZGVyKGZsb2F0KiBib3VuZHMsIHVpbnQzMl90KiBjb2xvcnMsIGZsb2F0KiBwb3NpdGlvbnMsIGludCBjb3VudCwKKyAgICAgICAgICAgIFNrU2hhZGVyKiBrZXksIFNrU2hhZGVyOjpUaWxlTW9kZSB0aWxlTW9kZSwgU2tNYXRyaXgqIG1hdHJpeCwgYm9vbCBibGVuZCk7CisgICAgflNraWFMaW5lYXJHcmFkaWVudFNoYWRlcigpOworCisgICAgdm9pZCBkZXNjcmliZShQcm9ncmFtRGVzY3JpcHRpb24mIGRlc2NyaXB0aW9uLCBjb25zdCBFeHRlbnNpb25zJiBleHRlbnNpb25zKTsKKyAgICB2b2lkIHNldHVwUHJvZ3JhbShQcm9ncmFtKiBwcm9ncmFtLCBjb25zdCBtYXQ0JiBtb2RlbFZpZXcsIGNvbnN0IFNuYXBzaG90JiBzbmFwc2hvdCwKKyAgICAgICAgICAgIEdMdWludCogdGV4dHVyZVVuaXQpOworCitwcml2YXRlOgorICAgIGZsb2F0KiBtQm91bmRzOworICAgIHVpbnQzMl90KiBtQ29sb3JzOworICAgIGZsb2F0KiBtUG9zaXRpb25zOworICAgIGludCBtQ291bnQ7Cit9OyAvLyBzdHJ1Y3QgU2tpYUxpbmVhckdyYWRpZW50U2hhZGVyCisKKy8qKgorICogQSBzaGFkZXIgdGhhdCBkcmF3cyB0d28gc2hhZGVycywgY29tcG9zaXRlZCB3aXRoIGFuIHhmZXJtb2RlLgorICovCitzdHJ1Y3QgU2tpYUNvbXBvc2VTaGFkZXI6IHB1YmxpYyBTa2lhU2hhZGVyIHsKKyAgICBTa2lhQ29tcG9zZVNoYWRlcihTa2lhU2hhZGVyKiBmaXJzdCwgU2tpYVNoYWRlciogc2Vjb25kLCBTa1hmZXJtb2RlOjpNb2RlIG1vZGUsIFNrU2hhZGVyKiBrZXkpOworCisgICAgdm9pZCBzZXQoVGV4dHVyZUNhY2hlKiB0ZXh0dXJlQ2FjaGUsIEdyYWRpZW50Q2FjaGUqIGdyYWRpZW50Q2FjaGUpOworCisgICAgdm9pZCBkZXNjcmliZShQcm9ncmFtRGVzY3JpcHRpb24mIGRlc2NyaXB0aW9uLCBjb25zdCBFeHRlbnNpb25zJiBleHRlbnNpb25zKTsKKyAgICB2b2lkIHNldHVwUHJvZ3JhbShQcm9ncmFtKiBwcm9ncmFtLCBjb25zdCBtYXQ0JiBtb2RlbFZpZXcsIGNvbnN0IFNuYXBzaG90JiBzbmFwc2hvdCwKKyAgICAgICAgICAgIEdMdWludCogdGV4dHVyZVVuaXQpOworCitwcml2YXRlOgorICAgIFNraWFTaGFkZXIqIG1GaXJzdDsKKyAgICBTa2lhU2hhZGVyKiBtU2Vjb25kOworICAgIFNrWGZlcm1vZGU6Ok1vZGUgbU1vZGU7Cit9OyAvLyBzdHJ1Y3QgU2tpYUNvbXBvc2VTaGFkZXIKKworfTsgLy8gbmFtZXNwYWNlIHVpcmVuZGVyZXIKK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAvLyBBTkRST0lEX1VJX1NLSUFfU0hBREVSX0gKZGlmZiAtLWdpdCBhL2xpYnMvaHd1aS9TbmFwc2hvdC5oIGIvbGlicy9od3VpL1NuYXBzaG90LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDYyYzk4NgotLS0gL2Rldi9udWxsCisrKyBiL2xpYnMvaHd1aS9TbmFwc2hvdC5oCkBAIC0wLDAgKzEsMjA4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX1VJX1NOQVBTSE9UX0gKKyNkZWZpbmUgQU5EUk9JRF9VSV9TTkFQU0hPVF9ICisKKyNpbmNsdWRlIDxHTEVTMi9nbDIuaD4KKyNpbmNsdWRlIDxHTEVTMi9nbDJleHQuaD4KKworI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KKworI2luY2x1ZGUgPFNrQ2FudmFzLmg+CisjaW5jbHVkZSA8U2tSZWdpb24uaD4KKworI2luY2x1ZGUgIkxheWVyLmgiCisjaW5jbHVkZSAiTWF0cml4LmgiCisjaW5jbHVkZSAiUmVjdC5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgdWlyZW5kZXJlciB7CisKKy8qKgorICogQSBzbmFwc2hvdCBob2xkcyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgcmVuZGVyaW5nCisgKiBzdXJmYWNlLiBBIHNuYXBzaG90IGlzIHVzdWFsbHkgY3JlYXRlZCB3aGVuZXZlciB0aGUgdXNlciBjYWxscyBzYXZlKCkKKyAqIGFuZCBkaXNjYXJkZWQgd2hlbiB0aGUgdXNlciBjYWxscyByZXN0b3JlKCkuIE9uY2UgYSBzbmFwc2hvdCBpcyBjcmVhdGVkLAorICogaXQgY2FuIGhvbGQgaW5mb3JtYXRpb24gZm9yIGRlZmVycmVkIHJlbmRlcmluZy4KKyAqCisgKiBFYWNoIHNuYXBzaG90IGhhcyBhIGxpbmsgdG8gYSBwcmV2aW91cyBzbmFwc2hvdCwgaW5kaWNhdGluZyB0aGUgcHJldmlvdXMKKyAqIHN0YXRlIG9mIHRoZSByZW5kZXJlci4KKyAqLworY2xhc3MgU25hcHNob3Q6IHB1YmxpYyBMaWdodFJlZkJhc2U8U25hcHNob3Q+IHsKK3B1YmxpYzoKKyAgICBTbmFwc2hvdCgpOiBmbGFncygwKSwgcHJldmlvdXMoTlVMTCksIGxheWVyKE5VTEwpIHsKKyAgICAgICAgdHJhbnNmb3JtID0gJm1UcmFuc2Zvcm1Sb290OworICAgICAgICBjbGlwUmVjdCA9ICZtQ2xpcFJlY3RSb290OworICAgIH0KKworICAgIC8qKgorICAgICAqIENvcGllcyB0aGUgc3BlY2lmaWVkIHNuYXBzaG90LyBUaGUgc3BlY2lmaWVkIHNuYXBzaG90IGlzIHN0b3JlZCBhcworICAgICAqIHRoZSBwcmV2aW91cyBzbmFwc2hvdC4KKyAgICAgKi8KKyAgICBTbmFwc2hvdChjb25zdCBzcDxTbmFwc2hvdD4mIHMsIGludCBzYXZlRmxhZ3MpOgorICAgICAgICAgICAgZmxhZ3MoMCksIHByZXZpb3VzKHMpLCBsYXllcihOVUxMKSB7CisgICAgICAgIGlmIChzYXZlRmxhZ3MgJiBTa0NhbnZhczo6a01hdHJpeF9TYXZlRmxhZykgeworICAgICAgICAgICAgbVRyYW5zZm9ybVJvb3QubG9hZCgqcy0+dHJhbnNmb3JtKTsKKyAgICAgICAgICAgIHRyYW5zZm9ybSA9ICZtVHJhbnNmb3JtUm9vdDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHRyYW5zZm9ybSA9IHMtPnRyYW5zZm9ybTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChzYXZlRmxhZ3MgJiBTa0NhbnZhczo6a0NsaXBfU2F2ZUZsYWcpIHsKKyAgICAgICAgICAgIG1DbGlwUmVjdFJvb3Quc2V0KCpzLT5jbGlwUmVjdCk7CisgICAgICAgICAgICBjbGlwUmVjdCA9ICZtQ2xpcFJlY3RSb290OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgY2xpcFJlY3QgPSBzLT5jbGlwUmVjdDsKKyAgICAgICAgfQorCisgICAgICAgIGlmICgocy0+ZmxhZ3MgJiBTbmFwc2hvdDo6a0ZsYWdDbGlwU2V0KSAmJgorICAgICAgICAgICAgICAgICEocy0+ZmxhZ3MgJiBTbmFwc2hvdDo6a0ZsYWdEaXJ0eUxvY2FsQ2xpcCkpIHsKKyAgICAgICAgICAgIG1Mb2NhbENsaXAuc2V0KHMtPm1Mb2NhbENsaXApOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZmxhZ3MgfD0gU25hcHNob3Q6OmtGbGFnRGlydHlMb2NhbENsaXA7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBWYXJpb3VzIGZsYWdzIHNldCBvbiAjZmxhZ3MuCisgICAgICovCisgICAgZW51bSBGbGFncyB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBJbmRpY2F0ZXMgdGhhdCB0aGUgY2xpcCByZWdpb24gd2FzIG1vZGlmaWVkLiBXaGVuIHRoaXMKKyAgICAgICAgICogc25hcHNob3QgaXMgcmVzdG9yZWQgc28gbXVzdCB0aGUgY2xpcC4KKyAgICAgICAgICovCisgICAgICAgIGtGbGFnQ2xpcFNldCA9IDB4MSwKKyAgICAgICAgLyoqCisgICAgICAgICAqIEluZGljYXRlcyB0aGF0IHRoaXMgc25hcHNob3Qgd2FzIGNyZWF0ZWQgd2hlbiBzYXZpbmcKKyAgICAgICAgICogYSBuZXcgbGF5ZXIuCisgICAgICAgICAqLworICAgICAgICBrRmxhZ0lzTGF5ZXIgPSAweDIsCisgICAgICAgIC8qKgorICAgICAgICAgKiBJbmRpY2F0ZXMgdGhhdCB0aGUgbG9jYWwgY2xpcCBzaG91bGQgYmUgcmVjb21wdXRlZC4KKyAgICAgICAgICovCisgICAgICAgIGtGbGFnRGlydHlMb2NhbENsaXAgPSAweDQsCisgICAgfTsKKworICAgIC8qKgorICAgICAqIE1vZGlmaWVzIHRoZSBjdXJyZW50IGNsaXAgd2l0aCB0aGUgbmV3IGNsaXAgcmVjdGFuZ2xlIGFuZAorICAgICAqIHRoZSBzcGVjaWZpZWQgb3BlcmF0aW9uLiBUaGUgc3BlY2lmaWVkIHJlY3RhbmdsZSBpcyB0cmFuc2Zvcm1lZAorICAgICAqIGJ5IHRoaXMgc25hcHNob3QncyB0cmFzbmZvcm1hdGlvbi4KKyAgICAgKi8KKyAgICBib29sIGNsaXAoZmxvYXQgbGVmdCwgZmxvYXQgdG9wLCBmbG9hdCByaWdodCwgZmxvYXQgYm90dG9tLAorICAgICAgICAgICAgU2tSZWdpb246Ok9wIG9wID0gU2tSZWdpb246OmtJbnRlcnNlY3RfT3ApIHsKKyAgICAgICAgUmVjdCByKGxlZnQsIHRvcCwgcmlnaHQsIGJvdHRvbSk7CisgICAgICAgIHRyYW5zZm9ybS0+bWFwUmVjdChyKTsKKyAgICAgICAgcmV0dXJuIGNsaXBUcmFuc2Zvcm1lZChyLCBvcCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogTW9kaWZpZXMgdGhlIGN1cnJlbnQgY2xpcCB3aXRoIHRoZSBuZXcgY2xpcCByZWN0YW5nbGUgYW5kCisgICAgICogdGhlIHNwZWNpZmllZCBvcGVyYXRpb24uIFRoZSBzcGVjaWZpZWQgcmVjdGFuZ2xlIGlzIGNvbnNpZGVyZWQKKyAgICAgKiBhbHJlYWR5IHRyYW5zZm9ybWVkLgorICAgICAqLworICAgIGJvb2wgY2xpcFRyYW5zZm9ybWVkKGNvbnN0IFJlY3QmIHIsIFNrUmVnaW9uOjpPcCBvcCA9IFNrUmVnaW9uOjprSW50ZXJzZWN0X09wKSB7CisgICAgICAgIGJvb2wgY2xpcHBlZCA9IGZhbHNlOworCisgICAgICAgIC8vIE5PVEU6IFRoZSB1bmltcGxlbWVudGVkIG9wZXJhdGlvbnMgcmVxdWlyZSBzdXBwb3J0IGZvciByZWdpb25zCisgICAgICAgIC8vIFN1cHBvcnRpbmcgcmVnaW9ucyB3b3VsZCByZXF1aXJlIHVzaW5nIGEgc3RlbmNpbCBidWZmZXIgaW5zdGVhZAorICAgICAgICAvLyBvZiB0aGUgc2Npc3Nvci4gVGhlIHN0ZW5jaWwgYnVmZmVyIGl0c2VsZiBpcyBub3QgdG9vIGV4cGVuc2l2ZQorICAgICAgICAvLyAobWVtb3J5IGNvc3QgZXhjbHVkZWQpIGJ1dCBvbiBmaWxscmF0ZSBsaW1pdGVkIGRldmljZXMsIG1hbmFnaW5nCisgICAgICAgIC8vIHRoZSBzdGVuY2lsIG1pZ2h0IGhhdmUgYSBuZWdhdGl2ZSBpbXBhY3Qgb24gdGhlIGZyYW1lcmF0ZS4KKyAgICAgICAgc3dpdGNoIChvcCkgeworICAgICAgICAgICAgY2FzZSBTa1JlZ2lvbjo6a0RpZmZlcmVuY2VfT3A6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFNrUmVnaW9uOjprSW50ZXJzZWN0X09wOgorICAgICAgICAgICAgICAgIGNsaXBwZWQgPSBjbGlwUmVjdC0+aW50ZXJzZWN0KHIpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBTa1JlZ2lvbjo6a1VuaW9uX09wOgorICAgICAgICAgICAgICAgIGNsaXBwZWQgPSBjbGlwUmVjdC0+dW5pb25XaXRoKHIpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBTa1JlZ2lvbjo6a1hPUl9PcDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgU2tSZWdpb246OmtSZXZlcnNlRGlmZmVyZW5jZV9PcDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgU2tSZWdpb246OmtSZXBsYWNlX09wOgorICAgICAgICAgICAgICAgIGNsaXBSZWN0LT5zZXQocik7CisgICAgICAgICAgICAgICAgY2xpcHBlZCA9IHRydWU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBpZiAoY2xpcHBlZCkgeworICAgICAgICAgICAgZmxhZ3MgfD0gU25hcHNob3Q6OmtGbGFnQ2xpcFNldCB8IFNuYXBzaG90OjprRmxhZ0RpcnR5TG9jYWxDbGlwOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGNsaXBwZWQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgY3VycmVudCBjbGlwLgorICAgICAqLworICAgIHZvaWQgc2V0Q2xpcChmbG9hdCBsZWZ0LCBmbG9hdCB0b3AsIGZsb2F0IHJpZ2h0LCBmbG9hdCBib3R0b20pIHsKKyAgICAgICAgY2xpcFJlY3QtPnNldChsZWZ0LCB0b3AsIHJpZ2h0LCBib3R0b20pOworICAgICAgICBmbGFncyB8PSBTbmFwc2hvdDo6a0ZsYWdDbGlwU2V0IHwgU25hcHNob3Q6OmtGbGFnRGlydHlMb2NhbENsaXA7CisgICAgfQorCisgICAgY29uc3QgUmVjdCYgZ2V0TG9jYWxDbGlwKCkgeworICAgICAgICBpZiAoZmxhZ3MgJiBTbmFwc2hvdDo6a0ZsYWdEaXJ0eUxvY2FsQ2xpcCkgeworICAgICAgICAgICAgbWF0NCBpbnZlcnNlOworICAgICAgICAgICAgaW52ZXJzZS5sb2FkSW52ZXJzZSgqdHJhbnNmb3JtKTsKKworICAgICAgICAgICAgbUxvY2FsQ2xpcC5zZXQoKmNsaXBSZWN0KTsKKyAgICAgICAgICAgIGludmVyc2UubWFwUmVjdChtTG9jYWxDbGlwKTsKKworICAgICAgICAgICAgZmxhZ3MgJj0gflNuYXBzaG90OjprRmxhZ0RpcnR5TG9jYWxDbGlwOworICAgICAgICB9CisgICAgICAgIHJldHVybiBtTG9jYWxDbGlwOworICAgIH0KKworICAgIC8qKgorICAgICAqIERpcnR5IGZsYWdzLgorICAgICAqLworICAgIGludCBmbGFnczsKKworICAgIC8qKgorICAgICAqIFByZXZpb3VzIHNuYXBzaG90LgorICAgICAqLworICAgIHNwPFNuYXBzaG90PiBwcmV2aW91czsKKworICAgIC8qKgorICAgICAqIE9ubHkgc2V0IHdoZW4gdGhlIGZsYWcga0ZsYWdJc0xheWVyIGlzIHNldC4KKyAgICAgKi8KKyAgICBMYXllciogbGF5ZXI7CisKKyAgICAvKioKKyAgICAgKiBMb2NhbCB0cmFuc2Zvcm1hdGlvbi4gSG9sZHMgdGhlIGN1cnJlbnQgdHJhbnNsYXRpb24sIHNjYWxlIGFuZAorICAgICAqIHJvdGF0aW9uIHZhbHVlcy4KKyAgICAgKi8KKyAgICBtYXQ0KiB0cmFuc2Zvcm07CisKKyAgICAvKioKKyAgICAgKiBDdXJyZW50IGNsaXAgcmVnaW9uLiBUaGUgY2xpcCBpcyBzdG9yZWQgaW4gY2FudmFzLXNwYWNlIGNvb3JkaW5hdGVzLAorICAgICAqIChzY3JlZW4tc3BhY2UgY29vcmRpbmF0ZXMgaW4gdGhlIHJlZ3VsYXIgY2FzZS4pCisgICAgICovCisgICAgUmVjdCogY2xpcFJlY3Q7CisKK3ByaXZhdGU6CisgICAgbWF0NCBtVHJhbnNmb3JtUm9vdDsKKyAgICBSZWN0IG1DbGlwUmVjdFJvb3Q7CisgICAgUmVjdCBtTG9jYWxDbGlwOworCit9OyAvLyBjbGFzcyBTbmFwc2hvdAorCit9OyAvLyBuYW1lc3BhY2UgdWlyZW5kZXJlcgorfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmIC8vIEFORFJPSURfVUlfU05BUFNIT1RfSApkaWZmIC0tZ2l0IGEvbGlicy9od3VpL1RleHREcm9wU2hhZG93Q2FjaGUuY3BwIGIvbGlicy9od3VpL1RleHREcm9wU2hhZG93Q2FjaGUuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlkNTQyNzcKLS0tIC9kZXYvbnVsbAorKysgYi9saWJzL2h3dWkvVGV4dERyb3BTaGFkb3dDYWNoZS5jcHAKQEAgLTAsMCArMSwxNDkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIk9wZW5HTFJlbmRlcmVyIgorCisjaW5jbHVkZSAiVGV4dERyb3BTaGFkb3dDYWNoZS5oIgorI2luY2x1ZGUgIlByb3BlcnRpZXMuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIHVpcmVuZGVyZXIgeworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBDb25zdHJ1Y3RvcnMvZGVzdHJ1Y3RvcgorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitUZXh0RHJvcFNoYWRvd0NhY2hlOjpUZXh0RHJvcFNoYWRvd0NhY2hlKCk6CisgICAgICAgIG1DYWNoZShHZW5lcmF0aW9uQ2FjaGU8U2hhZG93VGV4dCwgU2hhZG93VGV4dHVyZSo+OjprVW5saW1pdGVkQ2FwYWNpdHkpLAorICAgICAgICBtU2l6ZSgwKSwgbU1heFNpemUoTUIoREVGQVVMVF9EUk9QX1NIQURPV19DQUNIRV9TSVpFKSkgeworICAgIGNoYXIgcHJvcGVydHlbUFJPUEVSVFlfVkFMVUVfTUFYXTsKKyAgICBpZiAocHJvcGVydHlfZ2V0KFBST1BFUlRZX0RST1BfU0hBRE9XX0NBQ0hFX1NJWkUsIHByb3BlcnR5LCBOVUxMKSA+IDApIHsKKyAgICAgICAgTE9HRCgiICBTZXR0aW5nIGRyb3Agc2hhZG93IGNhY2hlIHNpemUgdG8gJXNNQiIsIHByb3BlcnR5KTsKKyAgICAgICAgc2V0TWF4U2l6ZShNQihhdG9mKHByb3BlcnR5KSkpOworICAgIH0gZWxzZSB7CisgICAgICAgIExPR0QoIiAgVXNpbmcgZGVmYXVsdCBkcm9wIHNoYWRvdyBjYWNoZSBzaXplIG9mICUuMmZNQiIsIERFRkFVTFRfRFJPUF9TSEFET1dfQ0FDSEVfU0laRSk7CisgICAgfQorCisgICAgbUNhY2hlLnNldE9uRW50cnlSZW1vdmVkTGlzdGVuZXIodGhpcyk7Cit9CisKK1RleHREcm9wU2hhZG93Q2FjaGU6OlRleHREcm9wU2hhZG93Q2FjaGUodWludDMyX3QgbWF4Qnl0ZVNpemUpOgorICAgICAgICBtQ2FjaGUoR2VuZXJhdGlvbkNhY2hlPFNoYWRvd1RleHQsIFNoYWRvd1RleHR1cmUqPjo6a1VubGltaXRlZENhcGFjaXR5KSwKKyAgICAgICAgbVNpemUoMCksIG1NYXhTaXplKG1heEJ5dGVTaXplKSB7CisgICAgbUNhY2hlLnNldE9uRW50cnlSZW1vdmVkTGlzdGVuZXIodGhpcyk7Cit9CisKK1RleHREcm9wU2hhZG93Q2FjaGU6On5UZXh0RHJvcFNoYWRvd0NhY2hlKCkgeworICAgIG1DYWNoZS5jbGVhcigpOworfQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBTaXplIG1hbmFnZW1lbnQKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwordWludDMyX3QgVGV4dERyb3BTaGFkb3dDYWNoZTo6Z2V0U2l6ZSgpIHsKKyAgICByZXR1cm4gbVNpemU7Cit9CisKK3VpbnQzMl90IFRleHREcm9wU2hhZG93Q2FjaGU6OmdldE1heFNpemUoKSB7CisgICAgcmV0dXJuIG1NYXhTaXplOworfQorCit2b2lkIFRleHREcm9wU2hhZG93Q2FjaGU6OnNldE1heFNpemUodWludDMyX3QgbWF4U2l6ZSkgeworICAgIG1NYXhTaXplID0gbWF4U2l6ZTsKKyAgICB3aGlsZSAobVNpemUgPiBtTWF4U2l6ZSkgeworICAgICAgICBtQ2FjaGUucmVtb3ZlT2xkZXN0KCk7CisgICAgfQorfQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBDYWxsYmFja3MKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwordm9pZCBUZXh0RHJvcFNoYWRvd0NhY2hlOjpvcGVyYXRvcigpKFNoYWRvd1RleHQmIHRleHQsIFNoYWRvd1RleHR1cmUqJiB0ZXh0dXJlKSB7CisgICAgY29uc3QgdWludDMyX3Qgc2l6ZSA9IHRleHR1cmUtPndpZHRoICogdGV4dHVyZS0+aGVpZ2h0OworICAgIG1TaXplIC09IHNpemU7CisKKyAgICBpZiAodGV4dHVyZSkgeworICAgICAgICBnbERlbGV0ZVRleHR1cmVzKDEsICZ0ZXh0dXJlLT5pZCk7CisgICAgICAgIGRlbGV0ZSB0ZXh0dXJlOworICAgIH0KK30KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gQ2FjaGluZworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCit2b2lkIFRleHREcm9wU2hhZG93Q2FjaGU6OmNsZWFyKCkgeworICAgIG1DYWNoZS5jbGVhcigpOworfQorCitTaGFkb3dUZXh0dXJlKiBUZXh0RHJvcFNoYWRvd0NhY2hlOjpnZXQoU2tQYWludCogcGFpbnQsIGNvbnN0IGNoYXIqIHRleHQsIHVpbnQzMl90IGxlbiwKKyAgICAgICAgaW50IG51bUdseXBocywgdWludDMyX3QgcmFkaXVzKSB7CisgICAgU2hhZG93VGV4dCBlbnRyeShwYWludCwgcmFkaXVzLCBsZW4sIHRleHQpOworICAgIFNoYWRvd1RleHR1cmUqIHRleHR1cmUgPSBtQ2FjaGUuZ2V0KGVudHJ5KTsKKworICAgIGlmICghdGV4dHVyZSkgeworICAgICAgICBGb250UmVuZGVyZXI6OkRyb3BTaGFkb3cgc2hhZG93ID0gbVJlbmRlcmVyLT5yZW5kZXJEcm9wU2hhZG93KHBhaW50LCB0ZXh0LCAwLAorICAgICAgICAgICAgICAgIGxlbiwgbnVtR2x5cGhzLCByYWRpdXMpOworCisgICAgICAgIHRleHR1cmUgPSBuZXcgU2hhZG93VGV4dHVyZTsKKyAgICAgICAgdGV4dHVyZS0+bGVmdCA9IHNoYWRvdy5wZW5YOworICAgICAgICB0ZXh0dXJlLT50b3AgPSBzaGFkb3cucGVuWTsKKyAgICAgICAgdGV4dHVyZS0+d2lkdGggPSBzaGFkb3cud2lkdGg7CisgICAgICAgIHRleHR1cmUtPmhlaWdodCA9IHNoYWRvdy5oZWlnaHQ7CisgICAgICAgIHRleHR1cmUtPmdlbmVyYXRpb24gPSAwOworICAgICAgICB0ZXh0dXJlLT5ibGVuZCA9IHRydWU7CisKKyAgICAgICAgY29uc3QgdWludDMyX3Qgc2l6ZSA9IHNoYWRvdy53aWR0aCAqIHNoYWRvdy5oZWlnaHQ7CisgICAgICAgIC8vIERvbid0IGV2ZW4gdHJ5IHRvIGNhY2hlIGEgYml0bWFwIHRoYXQncyBiaWdnZXIgdGhhbiB0aGUgY2FjaGUKKyAgICAgICAgaWYgKHNpemUgPCBtTWF4U2l6ZSkgeworICAgICAgICAgICAgd2hpbGUgKG1TaXplICsgc2l6ZSA+IG1NYXhTaXplKSB7CisgICAgICAgICAgICAgICAgbUNhY2hlLnJlbW92ZU9sZGVzdCgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgZ2xHZW5UZXh0dXJlcygxLCAmdGV4dHVyZS0+aWQpOworCisgICAgICAgIGdsQmluZFRleHR1cmUoR0xfVEVYVFVSRV8yRCwgdGV4dHVyZS0+aWQpOworICAgICAgICAvLyBUZXh0dXJlcyBhcmUgQWxwaGE4CisgICAgICAgIGdsUGl4ZWxTdG9yZWkoR0xfVU5QQUNLX0FMSUdOTUVOVCwgMSk7CisKKyAgICAgICAgZ2xUZXhJbWFnZTJEKEdMX1RFWFRVUkVfMkQsIDAsIEdMX0FMUEhBLCB0ZXh0dXJlLT53aWR0aCwgdGV4dHVyZS0+aGVpZ2h0LCAwLAorICAgICAgICAgICAgICAgIEdMX0FMUEhBLCBHTF9VTlNJR05FRF9CWVRFLCBzaGFkb3cuaW1hZ2UpOworCisgICAgICAgIGdsVGV4UGFyYW1ldGVyaShHTF9URVhUVVJFXzJELCBHTF9URVhUVVJFX01JTl9GSUxURVIsIEdMX0xJTkVBUik7CisgICAgICAgIGdsVGV4UGFyYW1ldGVyaShHTF9URVhUVVJFXzJELCBHTF9URVhUVVJFX01BR19GSUxURVIsIEdMX0xJTkVBUik7CisKKyAgICAgICAgZ2xUZXhQYXJhbWV0ZXJpKEdMX1RFWFRVUkVfMkQsIEdMX1RFWFRVUkVfV1JBUF9TLCBHTF9DTEFNUF9UT19FREdFKTsKKyAgICAgICAgZ2xUZXhQYXJhbWV0ZXJpKEdMX1RFWFRVUkVfMkQsIEdMX1RFWFRVUkVfV1JBUF9ULCBHTF9DTEFNUF9UT19FREdFKTsKKworICAgICAgICBpZiAoc2l6ZSA8IG1NYXhTaXplKSB7CisgICAgICAgICAgICBtU2l6ZSArPSBzaXplOworICAgICAgICAgICAgbUNhY2hlLnB1dChlbnRyeSwgdGV4dHVyZSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB0ZXh0dXJlLT5jbGVhbnVwID0gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIENsZWFudXAgc2hhZG93CisgICAgICAgIGRlbGV0ZVtdIHNoYWRvdy5pbWFnZTsKKyAgICB9CisKKyAgICByZXR1cm4gdGV4dHVyZTsKK30KKworfTsgLy8gbmFtZXNwYWNlIHVpcmVuZGVyZXIKK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9saWJzL2h3dWkvVGV4dERyb3BTaGFkb3dDYWNoZS5oIGIvbGlicy9od3VpL1RleHREcm9wU2hhZG93Q2FjaGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNjVkNjJhCi0tLSAvZGV2L251bGwKKysrIGIvbGlicy9od3VpL1RleHREcm9wU2hhZG93Q2FjaGUuaApAQCAtMCwwICsxLDE1MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9VSV9URVhUX0RST1BfU0hBRE9XX0NBQ0hFX0gKKyNkZWZpbmUgQU5EUk9JRF9VSV9URVhUX0RST1BfU0hBRE9XX0NBQ0hFX0gKKworI2luY2x1ZGUgPEdMRVMyL2dsMi5oPgorCisjaW5jbHVkZSA8U2tQYWludC5oPgorCisjaW5jbHVkZSAiR2VuZXJhdGlvbkNhY2hlLmgiCisjaW5jbHVkZSAiRm9udFJlbmRlcmVyLmgiCisjaW5jbHVkZSAiVGV4dHVyZS5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgdWlyZW5kZXJlciB7CisKK3N0cnVjdCBTaGFkb3dUZXh0IHsKKyAgICBTaGFkb3dUZXh0KCkgeworICAgICAgICB0ZXh0ID0gTlVMTDsKKyAgICB9CisKKyAgICBTaGFkb3dUZXh0KFNrUGFpbnQqIHBhaW50LCB1aW50MzJfdCByYWRpdXMsIHVpbnQzMl90IGxlbiwgY29uc3QgY2hhciogc3JjVGV4dCk6CisgICAgICAgICAgICByYWRpdXMocmFkaXVzKSwgbGVuKGxlbikgeworICAgICAgICB0ZXh0ID0gbmV3IGNoYXJbbGVuXTsKKyAgICAgICAgbWVtY3B5KHRleHQsIHNyY1RleHQsIGxlbik7CisKKyAgICAgICAgdGV4dFNpemUgPSBwYWludC0+Z2V0VGV4dFNpemUoKTsKKyAgICAgICAgdHlwZWZhY2UgPSBwYWludC0+Z2V0VHlwZWZhY2UoKTsKKworICAgICAgICBoYXNoID0gMDsKKyAgICAgICAgdWludDMyX3QgbXVsdGlwbGllciA9IDE7CisgICAgICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBsZW47IGkrKykgeworICAgICAgICAgICAgaGFzaCArPSB0ZXh0W2ldICogbXVsdGlwbGllcjsKKyAgICAgICAgICAgIHVpbnQzMl90IHNoaWZ0ZWQgPSBtdWx0aXBsaWVyIDw8IDU7CisgICAgICAgICAgICBtdWx0aXBsaWVyID0gc2hpZnRlZCAtIG11bHRpcGxpZXI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBTaGFkb3dUZXh0KGNvbnN0IFNoYWRvd1RleHQmIHNoYWRvdyk6CisgICAgICAgICAgICByYWRpdXMoc2hhZG93LnJhZGl1cyksIGxlbihzaGFkb3cubGVuKSwgaGFzaChzaGFkb3cuaGFzaCksCisgICAgICAgICAgICB0ZXh0U2l6ZShzaGFkb3cudGV4dFNpemUpLCB0eXBlZmFjZShzaGFkb3cudHlwZWZhY2UpIHsKKyAgICAgICAgdGV4dCA9IG5ldyBjaGFyW3NoYWRvdy5sZW5dOworICAgICAgICBtZW1jcHkodGV4dCwgc2hhZG93LnRleHQsIHNoYWRvdy5sZW4pOworICAgIH0KKworICAgIH5TaGFkb3dUZXh0KCkgeworICAgICAgICBkZWxldGVbXSB0ZXh0OworICAgIH0KKworICAgIHVpbnQzMl90IHJhZGl1czsKKyAgICB1aW50MzJfdCBsZW47CisgICAgdWludDMyX3QgaGFzaDsKKyAgICBmbG9hdCB0ZXh0U2l6ZTsKKyAgICBTa1R5cGVmYWNlKiB0eXBlZmFjZTsKKyAgICBjaGFyICp0ZXh0OworCisgICAgYm9vbCBvcGVyYXRvcjwoY29uc3QgU2hhZG93VGV4dCYgcmhzKSBjb25zdCB7CisgICAgICAgIGlmIChoYXNoIDwgcmhzLmhhc2gpIHJldHVybiB0cnVlOworICAgICAgICBlbHNlIGlmIChoYXNoID09IHJocy5oYXNoKSB7CisgICAgICAgICAgICBpZiAobGVuIDwgcmhzLmxlbikgcmV0dXJuIHRydWU7CisgICAgICAgICAgICBlbHNlIGlmIChsZW4gPT0gcmhzLmxlbikgeworICAgICAgICAgICAgICAgIGlmIChyYWRpdXMgPCByaHMucmFkaXVzKSByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICBlbHNlIGlmIChyYWRpdXMgPT0gcmhzLnJhZGl1cykgeworICAgICAgICAgICAgICAgICAgICBpZiAodGV4dFNpemUgPCByaHMudGV4dFNpemUpIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICh0ZXh0U2l6ZSA9PSByaHMudGV4dFNpemUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlZmFjZSA8IHJocy50eXBlZmFjZSkgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICh0eXBlZmFjZSA9PSByaHMudHlwZWZhY2UpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3RybmNtcCh0ZXh0LCByaHMudGV4dCwgbGVuKSA8IDA7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KK307IC8vIHN0cnVjdCBTaGFkb3dUZXh0CisKKy8qKgorICogQWxwaGEgdGV4dHVyZSB1c2VkIHRvIHJlcHJlc2VudCBhIHNoYWRvdy4KKyAqLworc3RydWN0IFNoYWRvd1RleHR1cmU6IHB1YmxpYyBUZXh0dXJlIHsKKyAgICBTaGFkb3dUZXh0dXJlKCk6IFRleHR1cmUoKSB7CisgICAgfQorCisgICAgZmxvYXQgbGVmdDsKKyAgICBmbG9hdCB0b3A7Cit9OyAvLyBzdHJ1Y3QgU2hhZG93VGV4dHVyZQorCitjbGFzcyBUZXh0RHJvcFNoYWRvd0NhY2hlOiBwdWJsaWMgT25FbnRyeVJlbW92ZWQ8U2hhZG93VGV4dCwgU2hhZG93VGV4dHVyZSo+IHsKK3B1YmxpYzoKKyAgICBUZXh0RHJvcFNoYWRvd0NhY2hlKCk7CisgICAgVGV4dERyb3BTaGFkb3dDYWNoZSh1aW50MzJfdCBtYXhCeXRlU2l6ZSk7CisgICAgflRleHREcm9wU2hhZG93Q2FjaGUoKTsKKworICAgIC8qKgorICAgICAqIFVzZWQgYXMgYSBjYWxsYmFjayB3aGVuIGFuIGVudHJ5IGlzIHJlbW92ZWQgZnJvbSB0aGUgY2FjaGUuCisgICAgICogRG8gbm90IGludm9rZSBkaXJlY3RseS4KKyAgICAgKi8KKyAgICB2b2lkIG9wZXJhdG9yKCkoU2hhZG93VGV4dCYgdGV4dCwgU2hhZG93VGV4dHVyZSomIHRleHR1cmUpOworCisgICAgU2hhZG93VGV4dHVyZSogZ2V0KFNrUGFpbnQqIHBhaW50LCBjb25zdCBjaGFyKiB0ZXh0LCB1aW50MzJfdCBsZW4sCisgICAgICAgICAgICBpbnQgbnVtR2x5cGhzLCB1aW50MzJfdCByYWRpdXMpOworCisgICAgLyoqCisgICAgICogQ2xlYXJzIHRoZSBjYWNoZS4gVGhpcyBjYXVzZXMgYWxsIHRleHR1cmVzIHRvIGJlIGRlbGV0ZWQuCisgICAgICovCisgICAgdm9pZCBjbGVhcigpOworCisgICAgdm9pZCBzZXRGb250UmVuZGVyZXIoRm9udFJlbmRlcmVyJiBmb250UmVuZGVyZXIpIHsKKyAgICAgICAgbVJlbmRlcmVyID0gJmZvbnRSZW5kZXJlcjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBtYXhpbXVtIHNpemUgb2YgdGhlIGNhY2hlIGluIGJ5dGVzLgorICAgICAqLworICAgIHZvaWQgc2V0TWF4U2l6ZSh1aW50MzJfdCBtYXhTaXplKTsKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBtYXhpbXVtIHNpemUgb2YgdGhlIGNhY2hlIGluIGJ5dGVzLgorICAgICAqLworICAgIHVpbnQzMl90IGdldE1heFNpemUoKTsKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBjdXJyZW50IHNpemUgb2YgdGhlIGNhY2hlIGluIGJ5dGVzLgorICAgICAqLworICAgIHVpbnQzMl90IGdldFNpemUoKTsKKworcHJpdmF0ZToKKyAgICBHZW5lcmF0aW9uQ2FjaGU8U2hhZG93VGV4dCwgU2hhZG93VGV4dHVyZSo+IG1DYWNoZTsKKworICAgIHVpbnQzMl90IG1TaXplOworICAgIHVpbnQzMl90IG1NYXhTaXplOworICAgIEZvbnRSZW5kZXJlciogbVJlbmRlcmVyOworfTsgLy8gY2xhc3MgVGV4dERyb3BTaGFkb3dDYWNoZQorCit9OyAvLyBuYW1lc3BhY2UgdWlyZW5kZXJlcgorfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmIC8vIEFORFJPSURfVUlfVEVYVF9EUk9QX1NIQURPV19DQUNIRV9ICmRpZmYgLS1naXQgYS9saWJzL2h3dWkvVGV4dHVyZS5oIGIvbGlicy9od3VpL1RleHR1cmUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MTdmMTQzCi0tLSAvZGV2L251bGwKKysrIGIvbGlicy9od3VpL1RleHR1cmUuaApAQCAtMCwwICsxLDgxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX1VJX1RFWFRVUkVfSAorI2RlZmluZSBBTkRST0lEX1VJX1RFWFRVUkVfSAorCisjaW5jbHVkZSA8R0xFUzIvZ2wyLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSB1aXJlbmRlcmVyIHsKKworLyoqCisgKiBSZXByZXNlbnRzIGFuIE9wZW5HTCB0ZXh0dXJlLgorICovCitzdHJ1Y3QgVGV4dHVyZSB7CisgICAgVGV4dHVyZSgpIHsKKyAgICAgICAgY2xlYW51cCA9IGZhbHNlOworICAgICAgICBiaXRtYXBTaXplID0gMDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBOYW1lIG9mIHRoZSB0ZXh0dXJlLgorICAgICAqLworICAgIEdMdWludCBpZDsKKyAgICAvKioKKyAgICAgKiBHZW5lcmF0aW9uIG9mIHRoZSBiYWNraW5nIGJpdG1hcCwKKyAgICAgKi8KKyAgICB1aW50MzJfdCBnZW5lcmF0aW9uOworICAgIC8qKgorICAgICAqIEluZGljYXRlcyB3aGV0aGVyIHRoZSB0ZXh0dXJlIHJlcXVpcmVzIGJsZW5kaW5nLgorICAgICAqLworICAgIGJvb2wgYmxlbmQ7CisgICAgLyoqCisgICAgICogV2lkdGggb2YgdGhlIGJhY2tpbmcgYml0bWFwLgorICAgICAqLworICAgIHVpbnQzMl90IHdpZHRoOworICAgIC8qKgorICAgICAqIEhlaWdodCBvZiB0aGUgYmFja2luZyBiaXRtYXAuCisgICAgICovCisgICAgdWludDMyX3QgaGVpZ2h0OworICAgIC8qKgorICAgICAqIEluZGljYXRlcyB3aGV0aGVyIHRoaXMgdGV4dHVyZSBzaG91bGQgYmUgY2xlYW5lZCB1cCBhZnRlciB1c2UuCisgICAgICovCisgICAgYm9vbCBjbGVhbnVwOworICAgIC8qKgorICAgICAqIE9wdGlvbmFsLCBzaXplIG9mIHRoZSBvcmlnaW5hbCBiaXRtYXAuCisgICAgICovCisgICAgdWludDMyX3QgYml0bWFwU2l6ZTsKK307IC8vIHN0cnVjdCBUZXh0dXJlCisKK2NsYXNzIEF1dG9UZXh0dXJlIHsKK3B1YmxpYzoKKyAgICBBdXRvVGV4dHVyZShjb25zdCBUZXh0dXJlKiB0ZXh0dXJlKTogbVRleHR1cmUodGV4dHVyZSkgeyB9CisgICAgfkF1dG9UZXh0dXJlKCkgeworICAgICAgICBpZiAobVRleHR1cmUgJiYgbVRleHR1cmUtPmNsZWFudXApIHsKKyAgICAgICAgICAgIGdsRGVsZXRlVGV4dHVyZXMoMSwgJm1UZXh0dXJlLT5pZCk7CisgICAgICAgICAgICBkZWxldGUgbVRleHR1cmU7CisgICAgICAgIH0KKyAgICB9CisKK3ByaXZhdGU6CisgICAgY29uc3QgVGV4dHVyZSogbVRleHR1cmU7Cit9OyAvLyBjbGFzcyBBdXRvVGV4dHVyZQorCit9OyAvLyBuYW1lc3BhY2UgdWlyZW5kZXJlcgorfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmIC8vIEFORFJPSURfVUlfVEVYVFVSRV9ICmRpZmYgLS1naXQgYS9saWJzL2h3dWkvVGV4dHVyZUNhY2hlLmNwcCBiL2xpYnMvaHd1aS9UZXh0dXJlQ2FjaGUuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkyNzA3MGEKLS0tIC9kZXYvbnVsbAorKysgYi9saWJzL2h3dWkvVGV4dHVyZUNhY2hlLmNwcApAQCAtMCwwICsxLDIwNSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiT3BlbkdMUmVuZGVyZXIiCisKKyNpbmNsdWRlIDxHTEVTMi9nbDIuaD4KKworI2luY2x1ZGUgPHV0aWxzL3RocmVhZHMuaD4KKworI2luY2x1ZGUgIlRleHR1cmVDYWNoZS5oIgorI2luY2x1ZGUgIlByb3BlcnRpZXMuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIHVpcmVuZGVyZXIgeworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBDb25zdHJ1Y3RvcnMvZGVzdHJ1Y3RvcgorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitUZXh0dXJlQ2FjaGU6OlRleHR1cmVDYWNoZSgpOgorICAgICAgICBtQ2FjaGUoR2VuZXJhdGlvbkNhY2hlPFNrQml0bWFwKiwgVGV4dHVyZSo+OjprVW5saW1pdGVkQ2FwYWNpdHkpLAorICAgICAgICBtU2l6ZSgwKSwgbU1heFNpemUoTUIoREVGQVVMVF9URVhUVVJFX0NBQ0hFX1NJWkUpKSB7CisgICAgY2hhciBwcm9wZXJ0eVtQUk9QRVJUWV9WQUxVRV9NQVhdOworICAgIGlmIChwcm9wZXJ0eV9nZXQoUFJPUEVSVFlfVEVYVFVSRV9DQUNIRV9TSVpFLCBwcm9wZXJ0eSwgTlVMTCkgPiAwKSB7CisgICAgICAgIExPR0QoIiAgU2V0dGluZyB0ZXh0dXJlIGNhY2hlIHNpemUgdG8gJXNNQiIsIHByb3BlcnR5KTsKKyAgICAgICAgc2V0TWF4U2l6ZShNQihhdG9mKHByb3BlcnR5KSkpOworICAgIH0gZWxzZSB7CisgICAgICAgIExPR0QoIiAgVXNpbmcgZGVmYXVsdCB0ZXh0dXJlIGNhY2hlIHNpemUgb2YgJS4yZk1CIiwgREVGQVVMVF9URVhUVVJFX0NBQ0hFX1NJWkUpOworICAgIH0KKworICAgIGluaXQoKTsKK30KKworVGV4dHVyZUNhY2hlOjpUZXh0dXJlQ2FjaGUodWludDMyX3QgbWF4Qnl0ZVNpemUpOgorICAgICAgICBtQ2FjaGUoR2VuZXJhdGlvbkNhY2hlPFNrQml0bWFwKiwgVGV4dHVyZSo+OjprVW5saW1pdGVkQ2FwYWNpdHkpLAorICAgICAgICBtU2l6ZSgwKSwgbU1heFNpemUobWF4Qnl0ZVNpemUpIHsKKyAgICBpbml0KCk7Cit9CisKK1RleHR1cmVDYWNoZTo6flRleHR1cmVDYWNoZSgpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIG1DYWNoZS5jbGVhcigpOworfQorCit2b2lkIFRleHR1cmVDYWNoZTo6aW5pdCgpIHsKKyAgICBtQ2FjaGUuc2V0T25FbnRyeVJlbW92ZWRMaXN0ZW5lcih0aGlzKTsKKworICAgIGdsR2V0SW50ZWdlcnYoR0xfTUFYX1RFWFRVUkVfU0laRSwgJm1NYXhUZXh0dXJlU2l6ZSk7CisgICAgTE9HRCgiICAgIE1heGltdW0gdGV4dHVyZSBkaW1lbnNpb24gaXMgJWQgcGl4ZWxzIiwgbU1heFRleHR1cmVTaXplKTsKK30KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gU2l6ZSBtYW5hZ2VtZW50CisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK3VpbnQzMl90IFRleHR1cmVDYWNoZTo6Z2V0U2l6ZSgpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIHJldHVybiBtU2l6ZTsKK30KKwordWludDMyX3QgVGV4dHVyZUNhY2hlOjpnZXRNYXhTaXplKCkgeworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgcmV0dXJuIG1NYXhTaXplOworfQorCit2b2lkIFRleHR1cmVDYWNoZTo6c2V0TWF4U2l6ZSh1aW50MzJfdCBtYXhTaXplKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBtTWF4U2l6ZSA9IG1heFNpemU7CisgICAgd2hpbGUgKG1TaXplID4gbU1heFNpemUpIHsKKyAgICAgICAgbUNhY2hlLnJlbW92ZU9sZGVzdCgpOworICAgIH0KK30KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gQ2FsbGJhY2tzCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK3ZvaWQgVGV4dHVyZUNhY2hlOjpvcGVyYXRvcigpKFNrQml0bWFwKiYgYml0bWFwLCBUZXh0dXJlKiYgdGV4dHVyZSkgeworICAgIC8vIFRoaXMgd2lsbCBiZSBjYWxsZWQgYWxyZWFkeSBsb2NrZWQKKyAgICBpZiAodGV4dHVyZSkgeworICAgICAgICBtU2l6ZSAtPSB0ZXh0dXJlLT5iaXRtYXBTaXplOworICAgICAgICBnbERlbGV0ZVRleHR1cmVzKDEsICZ0ZXh0dXJlLT5pZCk7CisgICAgICAgIGRlbGV0ZSB0ZXh0dXJlOworICAgIH0KK30KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gQ2FjaGluZworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitUZXh0dXJlKiBUZXh0dXJlQ2FjaGU6OmdldChTa0JpdG1hcCogYml0bWFwKSB7CisgICAgbUxvY2subG9jaygpOworICAgIFRleHR1cmUqIHRleHR1cmUgPSBtQ2FjaGUuZ2V0KGJpdG1hcCk7CisgICAgbUxvY2sudW5sb2NrKCk7CisKKyAgICBpZiAoIXRleHR1cmUpIHsKKyAgICAgICAgaWYgKGJpdG1hcC0+d2lkdGgoKSA+IG1NYXhUZXh0dXJlU2l6ZSB8fCBiaXRtYXAtPmhlaWdodCgpID4gbU1heFRleHR1cmVTaXplKSB7CisgICAgICAgICAgICBMT0dXKCJCaXRtYXAgdG9vIGxhcmdlIHRvIGJlIHVwbG9hZGVkIGludG8gYSB0ZXh0dXJlIik7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorCisgICAgICAgIGNvbnN0IHVpbnQzMl90IHNpemUgPSBiaXRtYXAtPnJvd0J5dGVzKCkgKiBiaXRtYXAtPmhlaWdodCgpOworICAgICAgICAvLyBEb24ndCBldmVuIHRyeSB0byBjYWNoZSBhIGJpdG1hcCB0aGF0J3MgYmlnZ2VyIHRoYW4gdGhlIGNhY2hlCisgICAgICAgIGlmIChzaXplIDwgbU1heFNpemUpIHsKKyAgICAgICAgICAgIG1Mb2NrLmxvY2soKTsKKyAgICAgICAgICAgIHdoaWxlIChtU2l6ZSArIHNpemUgPiBtTWF4U2l6ZSkgeworICAgICAgICAgICAgICAgIG1DYWNoZS5yZW1vdmVPbGRlc3QoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1Mb2NrLnVubG9jaygpOworICAgICAgICB9CisKKyAgICAgICAgdGV4dHVyZSA9IG5ldyBUZXh0dXJlOworICAgICAgICB0ZXh0dXJlLT5iaXRtYXBTaXplID0gc2l6ZTsKKyAgICAgICAgZ2VuZXJhdGVUZXh0dXJlKGJpdG1hcCwgdGV4dHVyZSwgZmFsc2UpOworCisgICAgICAgIGlmIChzaXplIDwgbU1heFNpemUpIHsKKyAgICAgICAgICAgIG1Mb2NrLmxvY2soKTsKKyAgICAgICAgICAgIG1TaXplICs9IHNpemU7CisgICAgICAgICAgICBtQ2FjaGUucHV0KGJpdG1hcCwgdGV4dHVyZSk7CisgICAgICAgICAgICBtTG9jay51bmxvY2soKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHRleHR1cmUtPmNsZWFudXAgPSB0cnVlOworICAgICAgICB9CisgICAgfSBlbHNlIGlmIChiaXRtYXAtPmdldEdlbmVyYXRpb25JRCgpICE9IHRleHR1cmUtPmdlbmVyYXRpb24pIHsKKyAgICAgICAgZ2VuZXJhdGVUZXh0dXJlKGJpdG1hcCwgdGV4dHVyZSwgdHJ1ZSk7CisgICAgfQorCisgICAgcmV0dXJuIHRleHR1cmU7Cit9CisKK3ZvaWQgVGV4dHVyZUNhY2hlOjpyZW1vdmUoU2tCaXRtYXAqIGJpdG1hcCkgeworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgbUNhY2hlLnJlbW92ZShiaXRtYXApOworfQorCit2b2lkIFRleHR1cmVDYWNoZTo6Y2xlYXIoKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBtQ2FjaGUuY2xlYXIoKTsKK30KKwordm9pZCBUZXh0dXJlQ2FjaGU6OmdlbmVyYXRlVGV4dHVyZShTa0JpdG1hcCogYml0bWFwLCBUZXh0dXJlKiB0ZXh0dXJlLCBib29sIHJlZ2VuZXJhdGUpIHsKKyAgICBTa0F1dG9Mb2NrUGl4ZWxzIGFscCgqYml0bWFwKTsKKworICAgIGlmICghYml0bWFwLT5yZWFkeVRvRHJhdygpKSB7CisgICAgICAgIExPR0UoIkNhbm5vdCBnZW5lcmF0ZSB0ZXh0dXJlIGZyb20gYml0bWFwIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAoIXJlZ2VuZXJhdGUpIHsKKyAgICAgICAgdGV4dHVyZS0+Z2VuZXJhdGlvbiA9IGJpdG1hcC0+Z2V0R2VuZXJhdGlvbklEKCk7CisgICAgICAgIHRleHR1cmUtPndpZHRoID0gYml0bWFwLT53aWR0aCgpOworICAgICAgICB0ZXh0dXJlLT5oZWlnaHQgPSBiaXRtYXAtPmhlaWdodCgpOworCisgICAgICAgIGdsR2VuVGV4dHVyZXMoMSwgJnRleHR1cmUtPmlkKTsKKyAgICB9CisKKyAgICBnbEJpbmRUZXh0dXJlKEdMX1RFWFRVUkVfMkQsIHRleHR1cmUtPmlkKTsKKyAgICBnbFBpeGVsU3RvcmVpKEdMX1VOUEFDS19BTElHTk1FTlQsIGJpdG1hcC0+Ynl0ZXNQZXJQaXhlbCgpKTsKKworICAgIHN3aXRjaCAoYml0bWFwLT5nZXRDb25maWcoKSkgeworICAgIGNhc2UgU2tCaXRtYXA6OmtBOF9Db25maWc6CisgICAgICAgIHRleHR1cmUtPmJsZW5kID0gdHJ1ZTsKKyAgICAgICAgZ2xQaXhlbFN0b3JlaShHTF9VTlBBQ0tfQUxJR05NRU5ULCAxKTsKKyAgICAgICAgZ2xUZXhJbWFnZTJEKEdMX1RFWFRVUkVfMkQsIDAsIEdMX0FMUEhBLCBiaXRtYXAtPnJvd0J5dGVzQXNQaXhlbHMoKSwgdGV4dHVyZS0+aGVpZ2h0LCAwLAorICAgICAgICAgICAgICAgIEdMX0FMUEhBLCBHTF9VTlNJR05FRF9CWVRFLCBiaXRtYXAtPmdldFBpeGVscygpKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBTa0JpdG1hcDo6a1JHQl81NjVfQ29uZmlnOgorICAgICAgICB0ZXh0dXJlLT5ibGVuZCA9IGZhbHNlOworICAgICAgICBnbFRleEltYWdlMkQoR0xfVEVYVFVSRV8yRCwgMCwgR0xfUkdCLCBiaXRtYXAtPnJvd0J5dGVzQXNQaXhlbHMoKSwgdGV4dHVyZS0+aGVpZ2h0LCAwLAorICAgICAgICAgICAgICAgIEdMX1JHQiwgR0xfVU5TSUdORURfU0hPUlRfNV82XzUsIGJpdG1hcC0+Z2V0UGl4ZWxzKCkpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFNrQml0bWFwOjprQVJHQl84ODg4X0NvbmZpZzoKKyAgICAgICAgZ2xUZXhJbWFnZTJEKEdMX1RFWFRVUkVfMkQsIDAsIEdMX1JHQkEsIGJpdG1hcC0+cm93Qnl0ZXNBc1BpeGVscygpLCB0ZXh0dXJlLT5oZWlnaHQsIDAsCisgICAgICAgICAgICAgICAgR0xfUkdCQSwgR0xfVU5TSUdORURfQllURSwgYml0bWFwLT5nZXRQaXhlbHMoKSk7CisgICAgICAgIC8vIERvIHRoaXMgYWZ0ZXIgY2FsbGluZyBnZXRQaXhlbHMoKSB0byBtYWtlIHN1cmUgU2tpYSdzIGRlZmVycmVkCisgICAgICAgIC8vIGRlY29kaW5nIGhhcHBlbmVkCisgICAgICAgIHRleHR1cmUtPmJsZW5kID0gIWJpdG1hcC0+aXNPcGFxdWUoKTsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgTE9HVygiVW5zdXBwb3J0ZWQgYml0bWFwIGNvbmZpZyIpOworICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBnbFRleFBhcmFtZXRlcmkoR0xfVEVYVFVSRV8yRCwgR0xfVEVYVFVSRV9NSU5fRklMVEVSLCBHTF9MSU5FQVIpOworICAgIGdsVGV4UGFyYW1ldGVyaShHTF9URVhUVVJFXzJELCBHTF9URVhUVVJFX01BR19GSUxURVIsIEdMX0xJTkVBUik7CisKKyAgICBnbFRleFBhcmFtZXRlcmkoR0xfVEVYVFVSRV8yRCwgR0xfVEVYVFVSRV9XUkFQX1MsIEdMX0NMQU1QX1RPX0VER0UpOworICAgIGdsVGV4UGFyYW1ldGVyaShHTF9URVhUVVJFXzJELCBHTF9URVhUVVJFX1dSQVBfVCwgR0xfQ0xBTVBfVE9fRURHRSk7Cit9CisKK307IC8vIG5hbWVzcGFjZSB1aXJlbmRlcmVyCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbGlicy9od3VpL1RleHR1cmVDYWNoZS5oIGIvbGlicy9od3VpL1RleHR1cmVDYWNoZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE2Mzc4OWEKLS0tIC9kZXYvbnVsbAorKysgYi9saWJzL2h3dWkvVGV4dHVyZUNhY2hlLmgKQEAgLTAsMCArMSwxMDAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfVUlfVEVYVFVSRV9DQUNIRV9ICisjZGVmaW5lIEFORFJPSURfVUlfVEVYVFVSRV9DQUNIRV9ICisKKyNpbmNsdWRlIDxTa0JpdG1hcC5oPgorCisjaW5jbHVkZSAiVGV4dHVyZS5oIgorI2luY2x1ZGUgIkdlbmVyYXRpb25DYWNoZS5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgdWlyZW5kZXJlciB7CisKKy8qKgorICogQSBzaW1wbGUgTFJVIHRleHR1cmUgY2FjaGUuIFRoZSBjYWNoZSBoYXMgYSBtYXhpbXVtIHNpemUgZXhwcmVzc2VkIGluIGJ5dGVzLgorICogQW55IHRleHR1cmUgYWRkZWQgdG8gdGhlIGNhY2hlIGNhdXNpbmcgdGhlIGNhY2hlIHRvIGdyb3cgYmV5b25kIHRoZSBtYXhpbXVtCisgKiBhbGxvd2VkIHNpemUgd2lsbCBhbHNvIGNhdXNlIHRoZSBvbGRlc3QgdGV4dHVyZSB0byBiZSBraWNrZWQgb3V0LgorICovCitjbGFzcyBUZXh0dXJlQ2FjaGU6IHB1YmxpYyBPbkVudHJ5UmVtb3ZlZDxTa0JpdG1hcCosIFRleHR1cmUqPiB7CitwdWJsaWM6CisgICAgVGV4dHVyZUNhY2hlKCk7CisgICAgVGV4dHVyZUNhY2hlKHVpbnQzMl90IG1heEJ5dGVTaXplKTsKKyAgICB+VGV4dHVyZUNhY2hlKCk7CisKKyAgICAvKioKKyAgICAgKiBVc2VkIGFzIGEgY2FsbGJhY2sgd2hlbiBhbiBlbnRyeSBpcyByZW1vdmVkIGZyb20gdGhlIGNhY2hlLgorICAgICAqIERvIG5vdCBpbnZva2UgZGlyZWN0bHkuCisgICAgICovCisgICAgdm9pZCBvcGVyYXRvcigpKFNrQml0bWFwKiYgYml0bWFwLCBUZXh0dXJlKiYgdGV4dHVyZSk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSB0ZXh0dXJlIGFzc29jaWF0ZWQgd2l0aCB0aGUgc3BlY2lmaWVkIGJpdG1hcC4gSWYgdGhlIHRleHR1cmUKKyAgICAgKiBjYW5ub3QgYmUgZm91bmQgaW4gdGhlIGNhY2hlLCBhIG5ldyB0ZXh0dXJlIGlzIGdlbmVyYXRlZC4KKyAgICAgKi8KKyAgICBUZXh0dXJlKiBnZXQoU2tCaXRtYXAqIGJpdG1hcCk7CisgICAgLyoqCisgICAgICogUmVtb3ZlcyB0aGUgdGV4dHVyZSBhc3NvY2lhdGVkIHdpdGggdGhlIHNwZWNpZmllZCBiaXRtYXAuIFJldHVybnMgTlVMTAorICAgICAqIGlmIHRoZSB0ZXh0dXJlIGNhbm5vdCBiZSBmb3VuZC4gVXBvbiByZW1vdmUgdGhlIHRleHR1cmUgaXMgZnJlZWQuCisgICAgICovCisgICAgdm9pZCByZW1vdmUoU2tCaXRtYXAqIGJpdG1hcCk7CisgICAgLyoqCisgICAgICogQ2xlYXJzIHRoZSBjYWNoZS4gVGhpcyBjYXVzZXMgYWxsIHRleHR1cmVzIHRvIGJlIGRlbGV0ZWQuCisgICAgICovCisgICAgdm9pZCBjbGVhcigpOworCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgbWF4aW11bSBzaXplIG9mIHRoZSBjYWNoZSBpbiBieXRlcy4KKyAgICAgKi8KKyAgICB2b2lkIHNldE1heFNpemUodWludDMyX3QgbWF4U2l6ZSk7CisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgbWF4aW11bSBzaXplIG9mIHRoZSBjYWNoZSBpbiBieXRlcy4KKyAgICAgKi8KKyAgICB1aW50MzJfdCBnZXRNYXhTaXplKCk7CisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgY3VycmVudCBzaXplIG9mIHRoZSBjYWNoZSBpbiBieXRlcy4KKyAgICAgKi8KKyAgICB1aW50MzJfdCBnZXRTaXplKCk7CisKK3ByaXZhdGU6CisgICAgLyoqCisgICAgICogR2VuZXJhdGVzIHRoZSB0ZXh0dXJlIGZyb20gYSBiaXRtYXAgaW50byB0aGUgc3BlY2lmaWVkIHRleHR1cmUgc3RydWN0dXJlLgorICAgICAqCisgICAgICogQHBhcmFtIHJlZ2VuZXJhdGUgSWYgdHJ1ZSwgdGhlIGJpdG1hcCBkYXRhIGlzIHJldXBsb2FkZWQgaW50byB0aGUgdGV4dHVyZSwgYnV0CisgICAgICogICAgICAgIG5vIG5ldyB0ZXh0dXJlIGlzIGdlbmVyYXRlZC4KKyAgICAgKi8KKyAgICB2b2lkIGdlbmVyYXRlVGV4dHVyZShTa0JpdG1hcCogYml0bWFwLCBUZXh0dXJlKiB0ZXh0dXJlLCBib29sIHJlZ2VuZXJhdGUgPSBmYWxzZSk7CisKKyAgICB2b2lkIGluaXQoKTsKKworICAgIEdlbmVyYXRpb25DYWNoZTxTa0JpdG1hcCosIFRleHR1cmUqPiBtQ2FjaGU7CisKKyAgICB1aW50MzJfdCBtU2l6ZTsKKyAgICB1aW50MzJfdCBtTWF4U2l6ZTsKKyAgICBHTGludCBtTWF4VGV4dHVyZVNpemU7CisKKyAgICAvKioKKyAgICAgKiBVc2VkIHRvIGFjY2VzcyBtQ2FjaGUgYW5kIG1TaXplLiBBbGwgbWV0aG9kcyBhcmUgYWNjZXNzZWQgZnJvbSBhIHNpbmdsZQorICAgICAqIHRocmVhZCBleGNlcHQgZm9yIHJlbW92ZSgpLgorICAgICAqLworICAgIG11dGFibGUgTXV0ZXggbUxvY2s7Cit9OyAvLyBjbGFzcyBUZXh0dXJlQ2FjaGUKKworfTsgLy8gbmFtZXNwYWNlIHVpcmVuZGVyZXIKK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAvLyBBTkRST0lEX1VJX1RFWFRVUkVfQ0FDSEVfSApkaWZmIC0tZ2l0IGEvbGlicy9od3VpL1ZlcnRleC5oIGIvbGlicy9od3VpL1ZlcnRleC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFmNTQwODYKLS0tIC9kZXYvbnVsbAorKysgYi9saWJzL2h3dWkvVmVydGV4LmgKQEAgLTAsMCArMSw0NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9VSV9WRVJURVhfSAorI2RlZmluZSBBTkRST0lEX1VJX1ZFUlRFWF9ICisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSB1aXJlbmRlcmVyIHsKKworLyoqCisgKiBTaW1wbGUgc3RydWN0dXJlIHRvIGRlc2NyaWJlIGEgdmVydGV4IHdpdGggYSBwb3NpdGlvbiBhbmQgYSB0ZXh0dXJlLgorICovCitzdHJ1Y3QgVGV4dHVyZVZlcnRleCB7CisgICAgZmxvYXQgcG9zaXRpb25bMl07CisgICAgZmxvYXQgdGV4dHVyZVsyXTsKKworICAgIHN0YXRpYyBpbmxpbmUgdm9pZCBzZXQoVGV4dHVyZVZlcnRleCogdmVydGV4LCBmbG9hdCB4LCBmbG9hdCB5LCBmbG9hdCB1LCBmbG9hdCB2KSB7CisgICAgICAgIHZlcnRleFswXS5wb3NpdGlvblswXSA9IHg7CisgICAgICAgIHZlcnRleFswXS5wb3NpdGlvblsxXSA9IHk7CisgICAgICAgIHZlcnRleFswXS50ZXh0dXJlWzBdID0gdTsKKyAgICAgICAgdmVydGV4WzBdLnRleHR1cmVbMV0gPSB2OworICAgIH0KKworICAgIHN0YXRpYyBpbmxpbmUgdm9pZCBzZXRVVihUZXh0dXJlVmVydGV4KiB2ZXJ0ZXgsIGZsb2F0IHUsIGZsb2F0IHYpIHsKKyAgICAgICAgdmVydGV4WzBdLnRleHR1cmVbMF0gPSB1OworICAgICAgICB2ZXJ0ZXhbMF0udGV4dHVyZVsxXSA9IHY7CisgICAgfQorfTsgLy8gc3RydWN0IFRleHR1cmVWZXJ0ZXgKKworfTsgLy8gbmFtZXNwYWNlIHVpcmVuZGVyZXIKK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAvLyBBTkRST0lEX1VJX1ZFUlRFWF9ICmRpZmYgLS1naXQgYS9saWJzL3JzL0FuZHJvaWQubWsgYi9saWJzL3JzL0FuZHJvaWQubWsKaW5kZXggOTg0NjRhMC4uMzdjNDE4YiAxMDA2NDQKLS0tIGEvbGlicy9ycy9BbmRyb2lkLm1rCisrKyBiL2xpYnMvcnMvQW5kcm9pZC5tawpAQCAtNzYsMzQgKzc2LDQ0IEBACiBMT0NBTF9TUkNfRklMRVM6PSBcCiAJcnNBZGFwdGVyLmNwcCBcCiAJcnNBbGxvY2F0aW9uLmNwcCBcCisJcnNBbmltYXRpb24uY3BwIFwKIAlyc0NvbXBvbmVudC5jcHAgXAogCXJzQ29udGV4dC5jcHAgXAogCXJzRGV2aWNlLmNwcCBcCiAJcnNFbGVtZW50LmNwcCBcCi0gICAgICAgIHJzRmlsZUEzRC5jcHAgXAorCXJzRmlsZUEzRC5jcHAgXAorCXJzRm9udC5jcHAgXAogCXJzTGlnaHQuY3BwIFwKIAlyc0xvY2tsZXNzRmlmby5jcHAgXAogCXJzT2JqZWN0QmFzZS5jcHAgXAogCXJzTWF0cml4LmNwcCBcCi0gICAgICAgIHJzTWVzaC5jcHAgXAotCXJzTm9pc2UuY3BwIFwKKwlyc01lc2guY3BwIFwKKwlyc011dGV4LmNwcCBcCiAJcnNQcm9ncmFtLmNwcCBcCiAJcnNQcm9ncmFtRnJhZ21lbnQuY3BwIFwKLQlyc1Byb2dyYW1GcmFnbWVudFN0b3JlLmNwcCBcCisJcnNQcm9ncmFtU3RvcmUuY3BwIFwKIAlyc1Byb2dyYW1SYXN0ZXIuY3BwIFwKIAlyc1Byb2dyYW1WZXJ0ZXguY3BwIFwKIAlyc1NhbXBsZXIuY3BwIFwKIAlyc1NjcmlwdC5jcHAgXAogCXJzU2NyaXB0Qy5jcHAgXAogCXJzU2NyaXB0Q19MaWIuY3BwIFwKLSAgICAgICAgcnNTaGFkZXJDYWNoZS5jcHAgXAotCXJzU2ltcGxlTWVzaC5jcHAgXAorCXJzU2NyaXB0Q19MaWJDTC5jcHAgXAorCXJzU2NyaXB0Q19MaWJHTC5jcHAgXAorCXJzU2hhZGVyQ2FjaGUuY3BwIFwKKwlyc1NpZ25hbC5jcHAgXAorCXJzU3RyZWFtLmNwcCBcCiAJcnNUaHJlYWRJTy5jcHAgXAogCXJzVHlwZS5jcHAgXAogCXJzVmVydGV4QXJyYXkuY3BwCiAKIAotTE9DQUxfU0hBUkVEX0xJQlJBUklFUyArPSBsaWJjdXRpbHMgbGlidXRpbHMgbGliRUdMIGxpYkdMRVN2MV9DTSBsaWJHTEVTdjIgbGlidWkgbGliYWNjCitMT0NBTF9TSEFSRURfTElCUkFSSUVTICs9IGxpYmN1dGlscyBsaWJ1dGlscyBsaWJFR0wgbGliR0xFU3YxX0NNIGxpYkdMRVN2MiBsaWJ1aSBsaWJiY2MKKworTE9DQUxfU1RBVElDX0xJQlJBUklFUyA6PSBsaWJmdDIKKworTE9DQUxfQ19JTkNMVURFUyArPSBleHRlcm5hbC9mcmVldHlwZS9pbmNsdWRlCisKIExPQ0FMX0xETElCUyA6PSAtbHB0aHJlYWQgLWxkbAogTE9DQUxfTU9EVUxFOj0gbGliUlMKIExPQ0FMX01PRFVMRV9UQUdTIDo9IG9wdGlvbmFsCmRpZmYgLS1naXQgYS9saWJzL3JzL1JlbmRlclNjcmlwdC5oIGIvbGlicy9ycy9SZW5kZXJTY3JpcHQuaAppbmRleCBkMjgwZjUwLi43OTAyYjlhIDEwMDY0NAotLS0gYS9saWJzL3JzL1JlbmRlclNjcmlwdC5oCisrKyBiL2xpYnMvcnMvUmVuZGVyU2NyaXB0LmgKQEAgLTMwLDIwICszMCwyMyBAQAogdHlwZWRlZiB2b2lkICogUnNBZGFwdGVyMUQ7CiB0eXBlZGVmIHZvaWQgKiBSc0FkYXB0ZXIyRDsKIHR5cGVkZWYgdm9pZCAqIFJzQWxsb2NhdGlvbjsKK3R5cGVkZWYgdm9pZCAqIFJzQW5pbWF0aW9uOwogdHlwZWRlZiB2b2lkICogUnNDb250ZXh0OwogdHlwZWRlZiB2b2lkICogUnNEZXZpY2U7CiB0eXBlZGVmIHZvaWQgKiBSc0VsZW1lbnQ7CiB0eXBlZGVmIHZvaWQgKiBSc0ZpbGU7Cit0eXBlZGVmIHZvaWQgKiBSc0ZvbnQ7CiB0eXBlZGVmIHZvaWQgKiBSc1NhbXBsZXI7CiB0eXBlZGVmIHZvaWQgKiBSc1NjcmlwdDsKLXR5cGVkZWYgdm9pZCAqIFJzU2ltcGxlTWVzaDsKK3R5cGVkZWYgdm9pZCAqIFJzTWVzaDsKIHR5cGVkZWYgdm9pZCAqIFJzVHlwZTsKIHR5cGVkZWYgdm9pZCAqIFJzTGlnaHQ7Cit0eXBlZGVmIHZvaWQgKiBSc09iamVjdEJhc2U7CiAKIHR5cGVkZWYgdm9pZCAqIFJzUHJvZ3JhbTsKIHR5cGVkZWYgdm9pZCAqIFJzUHJvZ3JhbVZlcnRleDsKIHR5cGVkZWYgdm9pZCAqIFJzUHJvZ3JhbUZyYWdtZW50OwotdHlwZWRlZiB2b2lkICogUnNQcm9ncmFtRnJhZ21lbnRTdG9yZTsKK3R5cGVkZWYgdm9pZCAqIFJzUHJvZ3JhbVN0b3JlOwogdHlwZWRlZiB2b2lkICogUnNQcm9ncmFtUmFzdGVyOwogCiB0eXBlZGVmIHZvaWQgKCogUnNCaXRtYXBDYWxsYmFja190KSh2b2lkICopOwpAQCAtNjAsNyArNjMsNiBAQAogUnNDb250ZXh0IHJzQ29udGV4dENyZWF0ZShSc0RldmljZSwgdWludDMyX3QgdmVyc2lvbik7CiBSc0NvbnRleHQgcnNDb250ZXh0Q3JlYXRlR0woUnNEZXZpY2UsIHVpbnQzMl90IHZlcnNpb24sIGJvb2wgdXNlRGVwdGgpOwogdm9pZCByc0NvbnRleHREZXN0cm95KFJzQ29udGV4dCk7Ci12b2lkIHJzT2JqRGVzdHJveU9PQihSc0NvbnRleHQsIHZvaWQgKik7CiAKIHVpbnQzMl90IHJzQ29udGV4dEdldE1lc3NhZ2UoUnNDb250ZXh0LCB2b2lkICpkYXRhLCBzaXplX3QgKnJlY2VpdmVMZW4sIHNpemVfdCBidWZmZXJMZW4sIGJvb2wgd2FpdCk7CiB2b2lkIHJzQ29udGV4dEluaXRUb0NsaWVudChSc0NvbnRleHQpOwpAQCAtODMsMTEgKzg1LDE3IEBACiAgICAgUlNfVFlQRV9VTlNJR05FRF8zMiwKICAgICBSU19UWVBFX1VOU0lHTkVEXzY0LAogCisgICAgUlNfVFlQRV9CT09MRUFOLAorCiAgICAgUlNfVFlQRV9VTlNJR05FRF81XzZfNSwKICAgICBSU19UWVBFX1VOU0lHTkVEXzVfNV81XzEsCiAgICAgUlNfVFlQRV9VTlNJR05FRF80XzRfNF80LAogCi0gICAgUlNfVFlQRV9FTEVNRU5ULAorICAgIFJTX1RZUEVfTUFUUklYXzRYNCwKKyAgICBSU19UWVBFX01BVFJJWF8zWDMsCisgICAgUlNfVFlQRV9NQVRSSVhfMlgyLAorCisgICAgUlNfVFlQRV9FTEVNRU5UID0gMTAwMCwKICAgICBSU19UWVBFX1RZUEUsCiAgICAgUlNfVFlQRV9BTExPQ0FUSU9OLAogICAgIFJTX1RZUEVfU0FNUExFUiwKQEAgLTk2LDI0ICsxMDQsMTcgQEAKICAgICBSU19UWVBFX1BST0dSQU1fRlJBR01FTlQsCiAgICAgUlNfVFlQRV9QUk9HUkFNX1ZFUlRFWCwKICAgICBSU19UWVBFX1BST0dSQU1fUkFTVEVSLAotICAgIFJTX1RZUEVfUFJPR1JBTV9TVE9SRQorICAgIFJTX1RZUEVfUFJPR1JBTV9TVE9SRSwKIH07CiAKIGVudW0gUnNEYXRhS2luZCB7CiAgICAgUlNfS0lORF9VU0VSLAotICAgIFJTX0tJTkRfQ09MT1IsCi0gICAgUlNfS0lORF9QT1NJVElPTiwKLSAgICBSU19LSU5EX1RFWFRVUkUsCi0gICAgUlNfS0lORF9OT1JNQUwsCi0gICAgUlNfS0lORF9JTkRFWCwKLSAgICBSU19LSU5EX1BPSU5UX1NJWkUsCiAKLSAgICBSU19LSU5EX1BJWEVMX0wsCisgICAgUlNfS0lORF9QSVhFTF9MID0gNywKICAgICBSU19LSU5EX1BJWEVMX0EsCiAgICAgUlNfS0lORF9QSVhFTF9MQSwKICAgICBSU19LSU5EX1BJWEVMX1JHQiwKICAgICBSU19LSU5EX1BJWEVMX1JHQkEsCi0KIH07CiAKIGVudW0gUnNTYW1wbGVyUGFyYW0gewpAQCAtMjA1LDkgKzIwNiw3MSBAQAogZW51bSBSc0Vycm9yIHsKICAgICBSU19FUlJPUl9OT05FLAogICAgIFJTX0VSUk9SX0JBRF9TSEFERVIsCi0gICAgUlNfRVJST1JfQkFEX1NDUklQVAorICAgIFJTX0VSUk9SX0JBRF9TQ1JJUFQsCisgICAgUlNfRVJST1JfQkFEX1ZBTFVFLAorICAgIFJTX0VSUk9SX09VVF9PRl9NRU1PUlkKIH07CiAKK2VudW0gUnNBbmltYXRpb25JbnRlcnBvbGF0aW9uIHsKKyAgICBSU19BTklNQVRJT05fSU5URVJQT0xBVElPTl9TVEVQLAorICAgIFJTX0FOSU1BVElPTl9JTlRFUlBPTEFUSU9OX0xJTkVBUiwKKyAgICBSU19BTklNQVRJT05fSU5URVJQT0xBVElPTl9CRVpJRVIsCisgICAgUlNfQU5JTUFUSU9OX0lOVEVSUE9MQVRJT05fQ0FSRElOQUwsCisgICAgUlNfQU5JTUFUSU9OX0lOVEVSUE9MQVRJT05fSEVSTUlURSwKKyAgICBSU19BTklNQVRJT05fSU5URVJQT0xBVElPTl9CU1BMSU5FCit9OworCitlbnVtIFJzQW5pbWF0aW9uRWRnZSB7CisgICAgUlNfQU5JTUFUSU9OX0VER0VfVU5ERUZJTkVELAorICAgIFJTX0FOSU1BVElPTl9FREdFX0NPTlNUQU5ULAorICAgIFJTX0FOSU1BVElPTl9FREdFX0dSQURJRU5ULAorICAgIFJTX0FOSU1BVElPTl9FREdFX0NZQ0xFLAorICAgIFJTX0FOSU1BVElPTl9FREdFX09TQ0lMTEFURSwKKyAgICBSU19BTklNQVRJT05fRURHRV9DWUxFX1JFTEFUSVZFCit9OworCitlbnVtIFJzQTNEQ2xhc3NJRCB7CisgICAgUlNfQTNEX0NMQVNTX0lEX1VOS05PV04sCisgICAgUlNfQTNEX0NMQVNTX0lEX01FU0gsCisgICAgUlNfQTNEX0NMQVNTX0lEX1RZUEUsCisgICAgUlNfQTNEX0NMQVNTX0lEX0VMRU1FTlQsCisgICAgUlNfQTNEX0NMQVNTX0lEX0FMTE9DQVRJT04sCisgICAgUlNfQTNEX0NMQVNTX0lEX1BST0dSQU1fVkVSVEVYLAorICAgIFJTX0EzRF9DTEFTU19JRF9QUk9HUkFNX1JBU1RFUiwKKyAgICBSU19BM0RfQ0xBU1NfSURfUFJPR1JBTV9GUkFHTUVOVCwKKyAgICBSU19BM0RfQ0xBU1NfSURfUFJPR1JBTV9TVE9SRSwKKyAgICBSU19BM0RfQ0xBU1NfSURfU0FNUExFUiwKKyAgICBSU19BM0RfQ0xBU1NfSURfQU5JTUFUSU9OLAorICAgIFJTX0EzRF9DTEFTU19JRF9MSUdIVCwKKyAgICBSU19BM0RfQ0xBU1NfSURfQURBUFRFUl8xRCwKKyAgICBSU19BM0RfQ0xBU1NfSURfQURBUFRFUl8yRCwKKyAgICBSU19BM0RfQ0xBU1NfSURfU0NSSVBUX0MKK307CisKK2VudW0gUnNDdWxsTW9kZSB7CisgICAgUlNfQ1VMTF9CQUNLLAorICAgIFJTX0NVTExfRlJPTlQsCisgICAgUlNfQ1VMTF9OT05FCit9OworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgUnNBM0RDbGFzc0lEIGNsYXNzSUQ7CisgICAgY29uc3QgY2hhciogb2JqZWN0TmFtZTsKK30gUnNGaWxlSW5kZXhFbnRyeTsKKworLy8gU2NyaXB0IHRvIFNjcmlwdAordHlwZWRlZiBzdHJ1Y3QgeworICAgIHVpbnQzMl90IHhTdGFydDsKKyAgICB1aW50MzJfdCB4RW5kOworICAgIHVpbnQzMl90IHlTdGFydDsKKyAgICB1aW50MzJfdCB5RW5kOworICAgIHVpbnQzMl90IHpTdGFydDsKKyAgICB1aW50MzJfdCB6RW5kOworICAgIHVpbnQzMl90IGFycmF5U3RhcnQ7CisgICAgdWludDMyX3QgYXJyYXlFbmQ7CisKK30gUnNTY3JpcHRDYWxsOworCiAjaWZuZGVmIE5PX1JTX0ZVTkNTCiAjaW5jbHVkZSAicnNnQXBpRnVuY0RlY2wuaCIKICNlbmRpZgpkaWZmIC0tZ2l0IGEvbGlicy9ycy9SZW5kZXJTY3JpcHRFbnYuaCBiL2xpYnMvcnMvUmVuZGVyU2NyaXB0RW52LmgKaW5kZXggOTliOGMwNC4uYzgzZWNlNCAxMDA2NDQKLS0tIGEvbGlicy9ycy9SZW5kZXJTY3JpcHRFbnYuaAorKysgYi9saWJzL3JzL1JlbmRlclNjcmlwdEVudi5oCkBAIC05LDEwICs5LDEwIEBACiB0eXBlZGVmIHZvaWQgKiBSc0VsZW1lbnQ7CiB0eXBlZGVmIHZvaWQgKiBSc1NhbXBsZXI7CiB0eXBlZGVmIHZvaWQgKiBSc1NjcmlwdDsKLXR5cGVkZWYgdm9pZCAqIFJzU2ltcGxlTWVzaDsKK3R5cGVkZWYgdm9pZCAqIFJzTWVzaDsKIHR5cGVkZWYgdm9pZCAqIFJzVHlwZTsKIHR5cGVkZWYgdm9pZCAqIFJzUHJvZ3JhbUZyYWdtZW50OwotdHlwZWRlZiB2b2lkICogUnNQcm9ncmFtRnJhZ21lbnRTdG9yZTsKK3R5cGVkZWYgdm9pZCAqIFJzUHJvZ3JhbVN0b3JlOwogdHlwZWRlZiB2b2lkICogUnNMaWdodDsKIAogCkBAIC0yOCw0ICsyOCw0IEBACiAjZGVmaW5lIFJTX1BST0dSQU1fVkVSVEVYX01PREVMVklFV19PRkZTRVQgMAogI2RlZmluZSBSU19QUk9HUkFNX1ZFUlRFWF9QUk9KRUNUSU9OX09GRlNFVCAxNgogI2RlZmluZSBSU19QUk9HUkFNX1ZFUlRFWF9URVhUVVJFX09GRlNFVCAzMgotCisjZGVmaW5lIFJTX1BST0dSQU1fVkVSVEVYX01WUF9PRkZTRVQgNDgKZGlmZiAtLWdpdCBhL2xpYnMvcnMvamF2YS9GaWxtL0FuZHJvaWQubWsgYi9saWJzL3JzL2phdmEvRmlsbS9BbmRyb2lkLm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZTZlZDdlLi4wMDAwMDAwCi0tLSBhL2xpYnMvcnMvamF2YS9GaWxtL0FuZHJvaWQubWsKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi0jCi0jIENvcHlyaWdodCAoQykgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0jCi0jIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0jIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0jIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0jIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0jIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIwotCi1MT0NBTF9QQVRIIDo9ICQoY2FsbCBteS1kaXIpCi1pbmNsdWRlICQoQ0xFQVJfVkFSUykKLQotTE9DQUxfTU9EVUxFX1RBR1MgOj0gb3B0aW9uYWwKLQotTE9DQUxfU1JDX0ZJTEVTIDo9ICQoY2FsbCBhbGwtamF2YS1maWxlcy11bmRlciwgc3JjKQotI0xPQ0FMX1NUQVRJQ19KQVZBX0xJQlJBUklFUyA6PSBhbmRyb2lkLnJlbmRlcnNjcmlwdAotCi1MT0NBTF9QQUNLQUdFX05BTUUgOj0gRmlsbQotCi1pbmNsdWRlICQoQlVJTERfUEFDS0FHRSkKZGlmZiAtLWdpdCBhL2xpYnMvcnMvamF2YS9GaWxtL0FuZHJvaWRNYW5pZmVzdC54bWwgYi9saWJzL3JzL2phdmEvRmlsbS9BbmRyb2lkTWFuaWZlc3QueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNWNlOGExLi4wMDAwMDAwCi0tLSBhL2xpYnMvcnMvamF2YS9GaWxtL0FuZHJvaWRNYW5pZmVzdC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPG1hbmlmZXN0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICBwYWNrYWdlPSJjb20uYW5kcm9pZC5maWxtIj4KLSAgICA8YXBwbGljYXRpb24gYW5kcm9pZDpsYWJlbD0iRmlsbSI+Ci0gICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9IkZpbG0iCi0gICAgICAgICAgICAgICAgICBhbmRyb2lkOnNjcmVlbk9yaWVudGF0aW9uPSJwb3J0cmFpdCIKLSAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGhlbWU9IkBhbmRyb2lkOnN0eWxlL1RoZW1lLkJsYWNrLk5vVGl0bGVCYXIiPgotICAgICAgICAgICAgPGludGVudC1maWx0ZXI+Ci0gICAgICAgICAgICAgICAgPGFjdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmFjdGlvbi5NQUlOIiAvPgotICAgICAgICAgICAgICAgIDxjYXRlZ29yeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmNhdGVnb3J5LkxBVU5DSEVSIiAvPgotICAgICAgICAgICAgPC9pbnRlbnQtZmlsdGVyPgotICAgICAgICA8L2FjdGl2aXR5PgotICAgIDwvYXBwbGljYXRpb24+Ci08L21hbmlmZXN0PgpkaWZmIC0tZ2l0IGEvbGlicy9ycy9qYXZhL0ZpbG0vcmVzL2RyYXdhYmxlL3AwMS5wbmcgYi9saWJzL3JzL2phdmEvRmlsbS9yZXMvZHJhd2FibGUvcDAxLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTliOWJkYi4uMDAwMDAwMAotLS0gYS9saWJzL3JzL2phdmEvRmlsbS9yZXMvZHJhd2FibGUvcDAxLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYnMvcnMvamF2YS9GaWxtL3Jlcy9kcmF3YWJsZS9wMDIucG5nIGIvbGlicy9ycy9qYXZhL0ZpbG0vcmVzL2RyYXdhYmxlL3AwMi5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgxNjJjODIuLjAwMDAwMDAKLS0tIGEvbGlicy9ycy9qYXZhL0ZpbG0vcmVzL2RyYXdhYmxlL3AwMi5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWJzL3JzL2phdmEvRmlsbS9yZXMvZHJhd2FibGUvcDAzLnBuZyBiL2xpYnMvcnMvamF2YS9GaWxtL3Jlcy9kcmF3YWJsZS9wMDMucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlM2UyNmMwLi4wMDAwMDAwCi0tLSBhL2xpYnMvcnMvamF2YS9GaWxtL3Jlcy9kcmF3YWJsZS9wMDMucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGlicy9ycy9qYXZhL0ZpbG0vcmVzL2RyYXdhYmxlL3AwNC5wbmcgYi9saWJzL3JzL2phdmEvRmlsbS9yZXMvZHJhd2FibGUvcDA0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGFlZTYwMy4uMDAwMDAwMAotLS0gYS9saWJzL3JzL2phdmEvRmlsbS9yZXMvZHJhd2FibGUvcDA0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYnMvcnMvamF2YS9GaWxtL3Jlcy9kcmF3YWJsZS9wMDUucG5nIGIvbGlicy9ycy9qYXZhL0ZpbG0vcmVzL2RyYXdhYmxlL3AwNS5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZhYzUyNDguLjAwMDAwMDAKLS0tIGEvbGlicy9ycy9qYXZhL0ZpbG0vcmVzL2RyYXdhYmxlL3AwNS5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWJzL3JzL2phdmEvRmlsbS9yZXMvZHJhd2FibGUvcDA2LnBuZyBiL2xpYnMvcnMvamF2YS9GaWxtL3Jlcy9kcmF3YWJsZS9wMDYucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYjUxMjYxLi4wMDAwMDAwCi0tLSBhL2xpYnMvcnMvamF2YS9GaWxtL3Jlcy9kcmF3YWJsZS9wMDYucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGlicy9ycy9qYXZhL0ZpbG0vcmVzL2RyYXdhYmxlL3AwNy5wbmcgYi9saWJzL3JzL2phdmEvRmlsbS9yZXMvZHJhd2FibGUvcDA3LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDhiZDkzOC4uMDAwMDAwMAotLS0gYS9saWJzL3JzL2phdmEvRmlsbS9yZXMvZHJhd2FibGUvcDA3LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYnMvcnMvamF2YS9GaWxtL3Jlcy9kcmF3YWJsZS9wMDgucG5nIGIvbGlicy9ycy9qYXZhL0ZpbG0vcmVzL2RyYXdhYmxlL3AwOC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVmMTc1ZTguLjAwMDAwMDAKLS0tIGEvbGlicy9ycy9qYXZhL0ZpbG0vcmVzL2RyYXdhYmxlL3AwOC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWJzL3JzL2phdmEvRmlsbS9yZXMvZHJhd2FibGUvcDA5LnBuZyBiL2xpYnMvcnMvamF2YS9GaWxtL3Jlcy9kcmF3YWJsZS9wMDkucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YmYzODc0Li4wMDAwMDAwCi0tLSBhL2xpYnMvcnMvamF2YS9GaWxtL3Jlcy9kcmF3YWJsZS9wMDkucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGlicy9ycy9qYXZhL0ZpbG0vcmVzL2RyYXdhYmxlL3AxMC5wbmcgYi9saWJzL3JzL2phdmEvRmlsbS9yZXMvZHJhd2FibGUvcDEwLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTA4ODI3ZC4uMDAwMDAwMAotLS0gYS9saWJzL3JzL2phdmEvRmlsbS9yZXMvZHJhd2FibGUvcDEwLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYnMvcnMvamF2YS9GaWxtL3Jlcy9kcmF3YWJsZS9wMTEucG5nIGIvbGlicy9ycy9qYXZhL0ZpbG0vcmVzL2RyYXdhYmxlL3AxMS5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEyODlmNzEuLjAwMDAwMDAKLS0tIGEvbGlicy9ycy9qYXZhL0ZpbG0vcmVzL2RyYXdhYmxlL3AxMS5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWJzL3JzL2phdmEvRmlsbS9yZXMvZHJhd2FibGUvcDEyLnBuZyBiL2xpYnMvcnMvamF2YS9GaWxtL3Jlcy9kcmF3YWJsZS9wMTIucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMWFmMTZhLi4wMDAwMDAwCi0tLSBhL2xpYnMvcnMvamF2YS9GaWxtL3Jlcy9kcmF3YWJsZS9wMTIucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGlicy9ycy9qYXZhL0ZpbG0vcmVzL2RyYXdhYmxlL3AxMy5wbmcgYi9saWJzL3JzL2phdmEvRmlsbS9yZXMvZHJhd2FibGUvcDEzLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDA4YmNiZS4uMDAwMDAwMAotLS0gYS9saWJzL3JzL2phdmEvRmlsbS9yZXMvZHJhd2FibGUvcDEzLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYnMvcnMvamF2YS9GaWxtL3Jlcy9yYXcvZmlsbWltYWdlLmMgYi9saWJzL3JzL2phdmEvRmlsbS9yZXMvcmF3L2ZpbG1pbWFnZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMTU0YzY4Li4wMDAwMDAwCi0tLSBhL2xpYnMvcnMvamF2YS9GaWxtL3Jlcy9yYXcvZmlsbWltYWdlLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMTAgKzAsMCBAQAotLy8gRm91bnRhaW4gdGVzdCBzY3JpcHQKLQotI3ByYWdtYSB2ZXJzaW9uKDEpCi0jcHJhZ21hIHN0YXRlVmVydGV4KG9ydGhvV2luZG93KQotI3ByYWdtYSBzdGF0ZVJhc3RlcihmbGF0KQotI3ByYWdtYSBzdGF0ZUZyYWdtZW50KFBnbUZyYWdCYWNrZ3JvdW5kKQotI3ByYWdtYSBzdGF0ZVN0b3JlKE15QmxlbmQpCi0KLQotaW50IG1haW4odm9pZCogY29uLCBpbnQgZnQsIGludCBsYXVuY2hJRCkgewotICAgIGludCBjb3VudCwgdG91Y2gsIHgsIHksIHJhdGUsIG1heExpZmUsIGxpZmVTaGlmdDsKLSAgICBpbnQgbGlmZTsKLSAgICBpbnQgY3QsIGN0MjsKLSAgICBpbnQgbmV3UGFydDsKLSAgICBpbnQgZHJhd0NvdW50OwotICAgIGludCBkeCwgZHksIGlkeDsKLSAgICBpbnQgcG9zeCxwb3N5OwotICAgIGludCBjOwotICAgIGludCBzcmNJZHg7Ci0gICAgaW50IGRzdElkeDsKLQotICAgIGNvdW50ID0gbG9hZEkzMihjb24sIDAsIDEpOwotICAgIHRvdWNoID0gbG9hZEkzMihjb24sIDAsIDIpOwotICAgIHggPSBsb2FkSTMyKGNvbiwgMCwgMyk7Ci0gICAgeSA9IGxvYWRJMzIoY29uLCAwLCA0KTsKLQotICAgIHJhdGUgPSA0OwotICAgIG1heExpZmUgPSAoY291bnQgLyByYXRlKSAtIDE7Ci0gICAgbGlmZVNoaWZ0ID0gMDsKLSAgICB7Ci0gICAgICAgIGxpZmUgPSBtYXhMaWZlOwotICAgICAgICB3aGlsZSAobGlmZSA+IDI1NSkgewotICAgICAgICAgICAgbGlmZSA9IGxpZmUgPj4gMTsKLSAgICAgICAgICAgIGxpZmVTaGlmdCArKzsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGRyYXdSZWN0KGNvbiwgMCwgMjU2LCAwLCA1MTIpOwotICAgIGNvbnRleHRCaW5kUHJvZ3JhbUZyYWdtZW50KGNvbiwgTkFNRURfUGdtRnJhZ1BhcnRzKTsKLQotICAgIGlmICh0b3VjaCkgewotICAgICAgICBuZXdQYXJ0ID0gbG9hZEkzMihjb24sIDIsIDApOwotICAgICAgICBmb3IgKGN0Mj0wOyBjdDI8cmF0ZTsgY3QyKyspIHsKLSAgICAgICAgICAgIGR4ID0gc2NyaXB0UmFuZChjb24sIDB4MTAwMDApIC0gMHg4MDAwOwotICAgICAgICAgICAgZHkgPSBzY3JpcHRSYW5kKGNvbiwgMHgxMDAwMCkgLSAweDgwMDA7Ci0KLSAgICAgICAgICAgIGlkeCA9IG5ld1BhcnQgKiA1ICsgMTsKLSAgICAgICAgICAgIHN0b3JlSTMyKGNvbiwgMiwgaWR4LCBkeCk7Ci0gICAgICAgICAgICBzdG9yZUkzMihjb24sIDIsIGlkeCArIDEsIGR5KTsKLSAgICAgICAgICAgIHN0b3JlSTMyKGNvbiwgMiwgaWR4ICsgMiwgbWF4TGlmZSk7Ci0gICAgICAgICAgICBzdG9yZUkzMihjb24sIDIsIGlkeCArIDMsIHggPDwgMTYpOwotICAgICAgICAgICAgc3RvcmVJMzIoY29uLCAyLCBpZHggKyA0LCB5IDw8IDE2KTsKLQotICAgICAgICAgICAgbmV3UGFydCsrOwotICAgICAgICAgICAgaWYgKG5ld1BhcnQgPj0gY291bnQpIHsKLSAgICAgICAgICAgICAgICBuZXdQYXJ0ID0gMDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBzdG9yZUkzMihjb24sIDIsIDAsIG5ld1BhcnQpOwotICAgIH0KLQotICAgIGRyYXdDb3VudCA9IDA7Ci0gICAgZm9yIChjdD0wOyBjdCA8IGNvdW50OyBjdCsrKSB7Ci0gICAgICAgIHNyY0lkeCA9IGN0ICogNSArIDE7Ci0KLSAgICAgICAgZHggPSBsb2FkSTMyKGNvbiwgMiwgc3JjSWR4KTsKLSAgICAgICAgZHkgPSBsb2FkSTMyKGNvbiwgMiwgc3JjSWR4ICsgMSk7Ci0gICAgICAgIGxpZmUgPSBsb2FkSTMyKGNvbiwgMiwgc3JjSWR4ICsgMik7Ci0gICAgICAgIHBvc3ggPSBsb2FkSTMyKGNvbiwgMiwgc3JjSWR4ICsgMyk7Ci0gICAgICAgIHBvc3kgPSBsb2FkSTMyKGNvbiwgMiwgc3JjSWR4ICsgNCk7Ci0KLSAgICAgICAgaWYgKGxpZmUpIHsKLSAgICAgICAgICAgIGlmIChwb3N5IDwgKDQ4MCA8PCAxNikpIHsKLSAgICAgICAgICAgICAgICBkc3RJZHggPSBkcmF3Q291bnQgKiA5OwotICAgICAgICAgICAgICAgIGMgPSAweGZmYWZjZiB8ICgobGlmZSA+PiBsaWZlU2hpZnQpIDw8IDI0KTsKLQotICAgICAgICAgICAgICAgIHN0b3JlVTMyKGNvbiwgMSwgZHN0SWR4LCBjKTsKLSAgICAgICAgICAgICAgICBzdG9yZUkzMihjb24sIDEsIGRzdElkeCArIDEsIHBvc3gpOwotICAgICAgICAgICAgICAgIHN0b3JlSTMyKGNvbiwgMSwgZHN0SWR4ICsgMiwgcG9zeSk7Ci0KLSAgICAgICAgICAgICAgICBzdG9yZVUzMihjb24sIDEsIGRzdElkeCArIDMsIGMpOwotICAgICAgICAgICAgICAgIHN0b3JlSTMyKGNvbiwgMSwgZHN0SWR4ICsgNCwgcG9zeCArIDB4MTAwMDApOwotICAgICAgICAgICAgICAgIHN0b3JlSTMyKGNvbiwgMSwgZHN0SWR4ICsgNSwgcG9zeSArIGR5ICogNCk7Ci0KLSAgICAgICAgICAgICAgICBzdG9yZVUzMihjb24sIDEsIGRzdElkeCArIDYsIGMpOwotICAgICAgICAgICAgICAgIHN0b3JlSTMyKGNvbiwgMSwgZHN0SWR4ICsgNywgcG9zeCAtIDB4MTAwMDApOwotICAgICAgICAgICAgICAgIHN0b3JlSTMyKGNvbiwgMSwgZHN0SWR4ICsgOCwgcG9zeSArIGR5ICogNCk7Ci0gICAgICAgICAgICAgICAgZHJhd0NvdW50ICsrOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBpZiAoZHkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGR5ID0gKC1keSkgPj4gMTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHBvc3ggPSBwb3N4ICsgZHg7Ci0gICAgICAgICAgICBwb3N5ID0gcG9zeSArIGR5OwotICAgICAgICAgICAgZHkgPSBkeSArIDB4NDAwOwotICAgICAgICAgICAgbGlmZSAtLTsKLQotICAgICAgICAgICAgLy9zdG9yZUkzMihjb24sIDIsIHNyY0lkeCwgZHgpOwotICAgICAgICAgICAgc3RvcmVJMzIoY29uLCAyLCBzcmNJZHggKyAxLCBkeSk7Ci0gICAgICAgICAgICBzdG9yZUkzMihjb24sIDIsIHNyY0lkeCArIDIsIGxpZmUpOwotICAgICAgICAgICAgc3RvcmVJMzIoY29uLCAyLCBzcmNJZHggKyAzLCBwb3N4KTsKLSAgICAgICAgICAgIHN0b3JlSTMyKGNvbiwgMiwgc3JjSWR4ICsgNCwgcG9zeSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBkcmF3VHJpYW5nbGVBcnJheShjb24sIE5BTUVEX1BhcnRCdWZmZXIsIGRyYXdDb3VudCk7Ci0gICAgcmV0dXJuIDE7Ci19CmRpZmYgLS1naXQgYS9saWJzL3JzL2phdmEvRmlsbS9yZXMvcmF3L2ZpbG1zdHJpcC5jIGIvbGlicy9ycy9qYXZhL0ZpbG0vcmVzL3Jhdy9maWxtc3RyaXAuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmY3NTY3NS4uMDAwMDAwMAotLS0gYS9saWJzL3JzL2phdmEvRmlsbS9yZXMvcmF3L2ZpbG1zdHJpcC5jCisrKyAvZGV2L251bGwKQEAgLTEsOTQgKzAsMCBAQAotLy8gRm91bnRhaW4gdGVzdCBzY3JpcHQKLQotI3ByYWdtYSB2ZXJzaW9uKDEpCi0jcHJhZ21hIHN0YXRlVmVydGV4KFBWQmFja2dyb3VuZCkKLSNwcmFnbWEgc3RhdGVGcmFnbWVudChQRkJhY2tncm91bmQpCi0jcHJhZ21hIHN0YXRlU3RvcmUoUFNCYWNrZ3JvdW5kKQotCi0jZGVmaW5lIFNUQVRFX1RSSUFOR0xFX09GRlNFVF9DT1VOVCAwCi0jZGVmaW5lIFNUQVRFX0xBU1RfRk9DVVMgMQotCi0KLS8vIFRoZSBzY3JpcHQgZW52aXJvbWVudCBoYXMgMyBlbnYgYWxsb2NhdGlvbnMuCi0vLyBiYW5rMDogKHIpIFRoZSBlbnZpcm9tZW50IHN0cnVjdHVyZQotLy8gYmFuazE6IChyKSBUaGUgcG9zaXRpb24gaW5mb3JtYXRpb24KLS8vIGJhbmsyOiAocncpIFRoZSB0ZW1wb3JhcnkgdGV4dHVyZSBzdGF0ZQotCi1pbnQgbGFzdEZvY3VzOwotCi1pbnQgbWFpbihpbnQgaW5kZXgpCi17Ci0gICAgZmxvYXQgbWF0MVsxNl07Ci0KLSAgICBmbG9hdCB0cmFucyA9IFBvcy0+dHJhbnNsYXRlOwotICAgIGZsb2F0IHJvdCA9IFBvcy0+cm90YXRlOwotCi0gICAgbWF0cml4TG9hZFNjYWxlKG1hdDEsIDIuZiwgMi5mLCAyLmYpOwotICAgIG1hdHJpeFRyYW5zbGF0ZShtYXQxLCAwLmYsIDAuZiwgdHJhbnMpOwotICAgIG1hdHJpeFJvdGF0ZShtYXQxLCA5MC5mLCAwLmYsIDAuZiwgMS5mKTsKLSAgICBtYXRyaXhSb3RhdGUobWF0MSwgcm90LCAxLmYsIDAuZiwgMC5mKTsKLSAgICB2cExvYWRNb2RlbE1hdHJpeChtYXQxKTsKLQotICAgIC8vIERyYXcgdGhlIGxpZ2h0aW5nIGVmZmVjdCBpbiB0aGUgc3RyaXAgYW5kIGZpbGwgdGhlIFogYnVmZmVyLgotICAgIGRyYXdTaW1wbGVNZXNoKE5BTUVEX21lc2gpOwotCi0gICAgLy8gU3RhcnQgb2YgaW1hZ2VzLgotICAgIGJpbmRQcm9ncmFtU3RvcmUoTkFNRURfUFNJbWFnZXMpOwotICAgIGJpbmRQcm9ncmFtRnJhZ21lbnQoTkFNRURfUEZJbWFnZXMpOwotICAgIGJpbmRQcm9ncmFtVmVydGV4KE5BTUVEX1BWSW1hZ2VzKTsKLQotICAgIGZsb2F0IGZvY3VzUG9zID0gUG9zLT5mb2N1czsKLSAgICBpbnQgZm9jdXNJRCA9IDA7Ci0gICAgaW50IGxhc3RGb2N1c0lEID0gbG9hZEkzMigyLCBTVEFURV9MQVNUX0ZPQ1VTKTsKLSAgICBpbnQgaW1nQ291bnQgPSAxMzsKLQotICAgIGlmICh0cmFucyA+ICgtLjNmKSkgewotICAgICAgICBmb2N1c0lEID0gLTEuMGYgLSBmb2N1c1BvczsKLSAgICAgICAgaWYgKGZvY3VzSUQgPj0gaW1nQ291bnQpIHsKLSAgICAgICAgICAgIGZvY3VzSUQgPSAtMTsKLSAgICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAgIGZvY3VzSUQgPSAtMTsKLSAgICB9Ci0KLSAgICAvKgotICAgIGlmIChmb2N1c0lEICE9IGxhc3RGb2N1c0lEKSB7Ci0gICAgICAgIGlmIChsYXN0Rm9jdXNJRCA+PSAwKSB7Ci0gICAgICAgICAgICB1cGxvYWRUb1RleHR1cmUoY29uLCBlbnYtPnRleFtsYXN0Rm9jdXNJRF0sIDEpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChmb2N1c0lEID49IDApIHsKLSAgICAgICAgICAgIHVwbG9hZFRvVGV4dHVyZShjb24sIGVudi0+dGV4W2ZvY3VzSURdLCAwKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAqLwotICAgIGxhc3RGb2N1cyA9IGZvY3VzSUQ7Ci0KLSAgICBpbnQgdHJpYW5nbGVPZmZzZXRzQ291bnQgPSBQb3MtPnRyaWFuZ2xlT2Zmc2V0Q291bnQ7Ci0KLSAgICBpbnQgaW1nSWQgPSAwOwotICAgIGZvciAoaW1nSWQ9MTsgaW1nSWQgPD0gaW1nQ291bnQ7IGltZ0lkKyspIHsKLSAgICAgICAgZmxvYXQgcG9zID0gZm9jdXNQb3MgKyBpbWdJZCArIDAuNGY7Ci0gICAgICAgIGludCBvZmZzZXQgPSAoaW50KWZsb29yZihwb3MgKiAyLmYpOwotICAgICAgICBwb3MgPSBwb3MgLSAwLjc1ZjsKLQotICAgICAgICBvZmZzZXQgPSBvZmZzZXQgKyB0cmlhbmdsZU9mZnNldHNDb3VudCAvIDI7Ci0gICAgICAgIGlmICghKChvZmZzZXQgPCAwKSB8fCAob2Zmc2V0ID49IHRyaWFuZ2xlT2Zmc2V0c0NvdW50KSkpIHsKLSAgICAgICAgICAgIGludCBzdGFydCA9IG9mZnNldCAtMjsKLSAgICAgICAgICAgIGludCBlbmQgPSBvZmZzZXQgKyAyOwotCi0gICAgICAgICAgICBpZiAoc3RhcnQgPCAwKSB7Ci0gICAgICAgICAgICAgICAgc3RhcnQgPSAwOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGVuZCA+PSB0cmlhbmdsZU9mZnNldHNDb3VudCkgewotICAgICAgICAgICAgICAgIGVuZCA9IHRyaWFuZ2xlT2Zmc2V0c0NvdW50LTE7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGJpbmRUZXh0dXJlKE5BTUVEX1BGSW1hZ2VzLCAwLCBsb2FkSTMyKDAsIGltZ0lkIC0gMSkpOwotICAgICAgICAgICAgbWF0cml4TG9hZFRyYW5zbGF0ZShtYXQxLCAtcG9zIC0gbG9hZEYoNSwgdHJpYW5nbGVPZmZzZXRzQ291bnQgLyAyKSwgMCwgMCk7Ci0gICAgICAgICAgICB2cExvYWRUZXh0dXJlTWF0cml4KG1hdDEpOwotICAgICAgICAgICAgZHJhd1NpbXBsZU1lc2hSYW5nZShOQU1FRF9tZXNoLCBsb2FkSTMyKDQsIHN0YXJ0KSwgKGxvYWRJMzIoNCwgZW5kKSAtIGxvYWRJMzIoNCwgc3RhcnQpKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIDA7Ci19Ci0KZGlmZiAtLWdpdCBhL2xpYnMvcnMvamF2YS9GaWxtL3NyYy9jb20vYW5kcm9pZC9maWxtL0ZpbG0uamF2YSBiL2xpYnMvcnMvamF2YS9GaWxtL3NyYy9jb20vYW5kcm9pZC9maWxtL0ZpbG0uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmU5OTgxNi4uMDAwMDAwMAotLS0gYS9saWJzL3JzL2phdmEvRmlsbS9zcmMvY29tL2FuZHJvaWQvZmlsbS9GaWxtLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5maWxtOwotCi1pbXBvcnQgYW5kcm9pZC5yZW5kZXJzY3JpcHQuUlNTdXJmYWNlVmlldzsKLWltcG9ydCBhbmRyb2lkLnJlbmRlcnNjcmlwdC5SZW5kZXJTY3JpcHQ7Ci0KLWltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eTsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLkNvbmZpZ3VyYXRpb247Ci1pbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7Ci1pbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyOwotaW1wb3J0IGFuZHJvaWQub3MuTG9vcGVyOwotaW1wb3J0IGFuZHJvaWQub3MuTWVzc2FnZTsKLWltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLlNldHRpbmdzLlN5c3RlbTsKLWltcG9ydCBhbmRyb2lkLnV0aWwuQ29uZmlnOwotaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7Ci1pbXBvcnQgYW5kcm9pZC52aWV3Lk1lbnU7Ci1pbXBvcnQgYW5kcm9pZC52aWV3Lk1lbnVJdGVtOwotaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OwotaW1wb3J0IGFuZHJvaWQudmlldy5XaW5kb3c7Ci1pbXBvcnQgYW5kcm9pZC53aWRnZXQuQnV0dG9uOwotaW1wb3J0IGFuZHJvaWQud2lkZ2V0Lkxpc3RWaWV3OwotCi1pbXBvcnQgamF2YS5sYW5nLlJ1bnRpbWU7Ci0KLXB1YmxpYyBjbGFzcyBGaWxtIGV4dGVuZHMgQWN0aXZpdHkgewotICAgIC8vRXZlbnRMaXN0ZW5lciBtTGlzdGVuZXIgPSBuZXcgRXZlbnRMaXN0ZW5lcigpOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIExPR19UQUcgPSAibGliUlNfam5pIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIERFQlVHICA9IGZhbHNlOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gTE9HX0VOQUJMRUQgPSBERUJVRyA/IENvbmZpZy5MT0dEIDogQ29uZmlnLkxPR1Y7Ci0KLSAgICBwcml2YXRlIEZpbG1WaWV3IG1WaWV3OwotCi0gICAgLy8gZ2V0IHRoZSBjdXJyZW50IGxvb3BlciAoZnJvbSB5b3VyIEFjdGl2aXR5IFVJIHRocmVhZCBmb3IgaW5zdGFuY2UKLQotCi0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBvbkNyZWF0ZShCdW5kbGUgaWNpY2xlKSB7Ci0gICAgICAgIHN1cGVyLm9uQ3JlYXRlKGljaWNsZSk7Ci0KLSAgICAgICAgLy8gQ3JlYXRlIG91ciBQcmV2aWV3IHZpZXcgYW5kIHNldCBpdCBhcyB0aGUgY29udGVudCBvZiBvdXIKLSAgICAgICAgLy8gQWN0aXZpdHkKLSAgICAgICAgbVZpZXcgPSBuZXcgRmlsbVZpZXcodGhpcyk7Ci0gICAgICAgIHNldENvbnRlbnRWaWV3KG1WaWV3KTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCBvblJlc3VtZSgpIHsKLSAgICAgICAgLy8gSWRlYWxseSBhIGdhbWUgc2hvdWxkIGltcGxlbWVudCBvblJlc3VtZSgpIGFuZCBvblBhdXNlKCkKLSAgICAgICAgLy8gdG8gdGFrZSBhcHByb3ByaWF0ZSBhY3Rpb24gd2hlbiB0aGUgYWN0aXZpdHkgbG9vc2VzIGZvY3VzCi0gICAgICAgIHN1cGVyLm9uUmVzdW1lKCk7Ci0gICAgICAgIG1WaWV3Lm9uUmVzdW1lKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgb25QYXVzZSgpIHsKLSAgICAgICAgLy8gSWRlYWxseSBhIGdhbWUgc2hvdWxkIGltcGxlbWVudCBvblJlc3VtZSgpIGFuZCBvblBhdXNlKCkKLSAgICAgICAgLy8gdG8gdGFrZSBhcHByb3ByaWF0ZSBhY3Rpb24gd2hlbiB0aGUgYWN0aXZpdHkgbG9vc2VzIGZvY3VzCi0gICAgICAgIHN1cGVyLm9uUGF1c2UoKTsKLSAgICAgICAgbVZpZXcub25QYXVzZSgpOwotCi0gICAgICAgIFJ1bnRpbWUuZ2V0UnVudGltZSgpLmV4aXQoMCk7Ci0gICAgfQotCi0KLSAgICBzdGF0aWMgdm9pZCBsb2coU3RyaW5nIG1lc3NhZ2UpIHsKLSAgICAgICAgaWYgKExPR19FTkFCTEVEKSB7Ci0gICAgICAgICAgICBMb2cudihMT0dfVEFHLCBtZXNzYWdlKTsKLSAgICAgICAgfQotICAgIH0KLQotCi19Ci0KZGlmZiAtLWdpdCBhL2xpYnMvcnMvamF2YS9GaWxtL3NyYy9jb20vYW5kcm9pZC9maWxtL0ZpbG1SUy5qYXZhIGIvbGlicy9ycy9qYXZhL0ZpbG0vc3JjL2NvbS9hbmRyb2lkL2ZpbG0vRmlsbVJTLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdkMDQ1MDIuLjAwMDAwMDAKLS0tIGEvbGlicy9ycy9qYXZhL0ZpbG0vc3JjL2NvbS9hbmRyb2lkL2ZpbG0vRmlsbVJTLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNTggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuZmlsbTsKLQotaW1wb3J0IGphdmEuaW8uV3JpdGVyOwotCi1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5SZXNvdXJjZXM7Ci1pbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5CaXRtYXA7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKLQotaW1wb3J0IGFuZHJvaWQucmVuZGVyc2NyaXB0Lio7Ci0KLXB1YmxpYyBjbGFzcyBGaWxtUlMgewotICAgIGNsYXNzIFN0cmlwUG9zaXRpb24gewotICAgICAgICBwdWJsaWMgZmxvYXQgdHJhbnNsYXRlOwotICAgICAgICBwdWJsaWMgZmxvYXQgcm90YXRlOwotICAgICAgICBwdWJsaWMgZmxvYXQgZm9jdXM7Ci0gICAgICAgIHB1YmxpYyBpbnQgdHJpYW5nbGVPZmZzZXRDb3VudDsKLSAgICB9Ci0gICAgU3RyaXBQb3NpdGlvbiBtUG9zID0gbmV3IFN0cmlwUG9zaXRpb24oKTsKLQotCi0gICAgcHJpdmF0ZSBmaW5hbCBpbnQgU1RBVEVfTEFTVF9GT0NVUyA9IDE7Ci0KLSAgICBwdWJsaWMgRmlsbVJTKCkgewotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGluaXQoUmVuZGVyU2NyaXB0R0wgcnMsIFJlc291cmNlcyByZXMsIGludCB3aWR0aCwgaW50IGhlaWdodCkgewotICAgICAgICBtUlMgPSByczsKLSAgICAgICAgbVJlcyA9IHJlczsKLSAgICAgICAgaW5pdFJTKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0RmlsbVN0cmlwUG9zaXRpb24oaW50IHgsIGludCB5KQotICAgIHsKLSAgICAgICAgaWYgKHggPCA1MCkgewotICAgICAgICAgICAgeCA9IDUwOwotICAgICAgICB9Ci0gICAgICAgIGlmICh4ID4gMjcwKSB7Ci0gICAgICAgICAgICB4ID0gMjcwOwotICAgICAgICB9Ci0KLSAgICAgICAgZmxvYXQgYW5pbSA9ICgoZmxvYXQpeC01MCkgLyAyNzAuZjsKLSAgICAgICAgbVBvcy50cmFuc2xhdGUgPSAyZiAqIGFuaW0gKyAwLjVmOyAgIC8vIHRyYW5zbGF0aW9uCi0gICAgICAgIG1Qb3Mucm90YXRlID0gKGFuaW0gKiA0MCk7ICAvLyByb3RhdGlvbgotICAgICAgICBtUG9zLmZvY3VzID0gKChmbG9hdCl5KSAvIDE2LmYgLSAxMC5mOyAgLy8gZm9jdXNQb3MKLSAgICAgICAgbVBvcy50cmlhbmdsZU9mZnNldENvdW50ID0gbUZTTS5tVHJpYW5nbGVPZmZzZXRzQ291bnQ7Ci0gICAgICAgIG1BbGxvY1Bvcy5kYXRhKG1Qb3MpOwotICAgIH0KLQotCi0gICAgcHJpdmF0ZSBSZXNvdXJjZXMgbVJlczsKLSAgICBwcml2YXRlIFJlbmRlclNjcmlwdEdMIG1SUzsKLSAgICBwcml2YXRlIFNjcmlwdCBtU2NyaXB0U3RyaXA7Ci0gICAgcHJpdmF0ZSBTY3JpcHQgbVNjcmlwdEltYWdlOwotICAgIHByaXZhdGUgU2FtcGxlciBtU2FtcGxlcjsKLSAgICBwcml2YXRlIFByb2dyYW1TdG9yZSBtUFNCYWNrZ3JvdW5kOwotICAgIHByaXZhdGUgUHJvZ3JhbVN0b3JlIG1QU0ltYWdlczsKLSAgICBwcml2YXRlIFByb2dyYW1GcmFnbWVudCBtUEZCYWNrZ3JvdW5kOwotICAgIHByaXZhdGUgUHJvZ3JhbUZyYWdtZW50IG1QRkltYWdlczsKLSAgICBwcml2YXRlIFByb2dyYW1WZXJ0ZXggbVBWQmFja2dyb3VuZDsKLSAgICBwcml2YXRlIFByb2dyYW1WZXJ0ZXggbVBWSW1hZ2VzOwotICAgIHByaXZhdGUgUHJvZ3JhbVZlcnRleC5NYXRyaXhBbGxvY2F0aW9uIG1QVkE7Ci0gICAgcHJpdmF0ZSBUeXBlIG1TdHJpcFBvc2l0aW9uVHlwZTsKLQotICAgIHByaXZhdGUgQWxsb2NhdGlvbiBtSW1hZ2VzW107Ci0gICAgcHJpdmF0ZSBBbGxvY2F0aW9uIG1BbGxvY0lEczsKLSAgICBwcml2YXRlIEFsbG9jYXRpb24gbUFsbG9jUG9zOwotICAgIHByaXZhdGUgQWxsb2NhdGlvbiBtQWxsb2NTdGF0ZTsKLSAgICBwcml2YXRlIEFsbG9jYXRpb24gbUFsbG9jUFY7Ci0gICAgcHJpdmF0ZSBBbGxvY2F0aW9uIG1BbGxvY09mZnNldHNUZXg7Ci0gICAgcHJpdmF0ZSBBbGxvY2F0aW9uIG1BbGxvY09mZnNldHM7Ci0KLSAgICBwcml2YXRlIFNpbXBsZU1lc2ggbU1lc2g7Ci0gICAgcHJpdmF0ZSBMaWdodCBtTGlnaHQ7Ci0KLSAgICBwcml2YXRlIEZpbG1TdHJpcE1lc2ggbUZTTTsKLQotICAgIHByaXZhdGUgaW50W10gbUJ1ZmZlcklEczsKLSAgICBwcml2YXRlIGZsb2F0W10gbUJ1ZmZlclBvcyA9IG5ldyBmbG9hdFszXTsKLSAgICBwcml2YXRlIGludFtdIG1CdWZmZXJTdGF0ZTsKLQotICAgIHByaXZhdGUgdm9pZCBpbml0UEZTKCkgewotICAgICAgICBQcm9ncmFtU3RvcmUuQnVpbGRlciBiID0gbmV3IFByb2dyYW1TdG9yZS5CdWlsZGVyKG1SUywgbnVsbCwgbnVsbCk7Ci0KLSAgICAgICAgYi5zZXREZXB0aEZ1bmMoUHJvZ3JhbVN0b3JlLkRlcHRoRnVuYy5MRVNTKTsKLSAgICAgICAgYi5zZXREaXRoZXJFbmFibGUodHJ1ZSk7Ci0gICAgICAgIGIuc2V0RGVwdGhNYXNrKHRydWUpOwotICAgICAgICBtUFNCYWNrZ3JvdW5kID0gYi5jcmVhdGUoKTsKLSAgICAgICAgbVBTQmFja2dyb3VuZC5zZXROYW1lKCJQU0JhY2tncm91bmQiKTsKLQotICAgICAgICBiLnNldERlcHRoRnVuYyhQcm9ncmFtU3RvcmUuRGVwdGhGdW5jLkVRVUFMKTsKLSAgICAgICAgYi5zZXREaXRoZXJFbmFibGUoZmFsc2UpOwotICAgICAgICBiLnNldERlcHRoTWFzayhmYWxzZSk7Ci0gICAgICAgIGIuc2V0QmxlbmRGdW5jKFByb2dyYW1TdG9yZS5CbGVuZFNyY0Z1bmMuT05FLAotICAgICAgICAgICAgICAgICAgICAgICBQcm9ncmFtU3RvcmUuQmxlbmREc3RGdW5jLk9ORSk7Ci0gICAgICAgIG1QU0ltYWdlcyA9IGIuY3JlYXRlKCk7Ci0gICAgICAgIG1QU0ltYWdlcy5zZXROYW1lKCJQU0ltYWdlcyIpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBpbml0UEYoKSB7Ci0gICAgICAgIFNhbXBsZXIuQnVpbGRlciBicyA9IG5ldyBTYW1wbGVyLkJ1aWxkZXIobVJTKTsKLSAgICAgICAgYnMuc2V0TWluKFNhbXBsZXIuVmFsdWUuTElORUFSKTsvL19NSVBfTElORUFSKTsKLSAgICAgICAgYnMuc2V0TWFnKFNhbXBsZXIuVmFsdWUuTElORUFSKTsKLSAgICAgICAgYnMuc2V0V3JhcFMoU2FtcGxlci5WYWx1ZS5DTEFNUCk7Ci0gICAgICAgIGJzLnNldFdyYXBUKFNhbXBsZXIuVmFsdWUuV1JBUCk7Ci0gICAgICAgIG1TYW1wbGVyID0gYnMuY3JlYXRlKCk7Ci0KLSAgICAgICAgUHJvZ3JhbUZyYWdtZW50LkJ1aWxkZXIgYiA9IG5ldyBQcm9ncmFtRnJhZ21lbnQuQnVpbGRlcihtUlMpOwotICAgICAgICBtUEZCYWNrZ3JvdW5kID0gYi5jcmVhdGUoKTsKLSAgICAgICAgbVBGQmFja2dyb3VuZC5zZXROYW1lKCJQRkJhY2tncm91bmQiKTsKLQotICAgICAgICBiID0gbmV3IFByb2dyYW1GcmFnbWVudC5CdWlsZGVyKG1SUyk7Ci0gICAgICAgIGIuc2V0VGV4dHVyZShQcm9ncmFtRnJhZ21lbnQuQnVpbGRlci5FbnZNb2RlLlJFUExBQ0UsCi0gICAgICAgICAgICAgICAgICAgICBQcm9ncmFtRnJhZ21lbnQuQnVpbGRlci5Gb3JtYXQuUkdCQSwgMCk7Ci0gICAgICAgIG1QRkltYWdlcyA9IGIuY3JlYXRlKCk7Ci0gICAgICAgIG1QRkltYWdlcy5iaW5kU2FtcGxlcihtU2FtcGxlciwgMCk7Ci0gICAgICAgIG1QRkltYWdlcy5zZXROYW1lKCJQRkltYWdlcyIpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBpbml0UFYoKSB7Ci0gICAgICAgIG1MaWdodCA9IChuZXcgTGlnaHQuQnVpbGRlcihtUlMpKS5jcmVhdGUoKTsKLSAgICAgICAgbUxpZ2h0LnNldFBvc2l0aW9uKDAsIC0wLjVmLCAtMS4wZik7Ci0KLSAgICAgICAgUHJvZ3JhbVZlcnRleC5CdWlsZGVyIHB2YiA9IG5ldyBQcm9ncmFtVmVydGV4LkJ1aWxkZXIobVJTLCBudWxsLCBudWxsKTsKLSAgICAgICAgLy9wdmIuYWRkTGlnaHQobUxpZ2h0KTsKLSAgICAgICAgbVBWQmFja2dyb3VuZCA9IHB2Yi5jcmVhdGUoKTsKLSAgICAgICAgbVBWQmFja2dyb3VuZC5zZXROYW1lKCJQVkJhY2tncm91bmQiKTsKLQotICAgICAgICBwdmIgPSBuZXcgUHJvZ3JhbVZlcnRleC5CdWlsZGVyKG1SUywgbnVsbCwgbnVsbCk7Ci0gICAgICAgIHB2Yi5zZXRUZXh0dXJlTWF0cml4RW5hYmxlKHRydWUpOwotICAgICAgICBtUFZJbWFnZXMgPSBwdmIuY3JlYXRlKCk7Ci0gICAgICAgIG1QVkltYWdlcy5zZXROYW1lKCJQVkltYWdlcyIpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBsb2FkSW1hZ2VzKCkgewotICAgICAgICBtQnVmZmVySURzID0gbmV3IGludFsxM107Ci0gICAgICAgIG1JbWFnZXMgPSBuZXcgQWxsb2NhdGlvblsxM107Ci0gICAgICAgIG1BbGxvY0lEcyA9IEFsbG9jYXRpb24uY3JlYXRlU2l6ZWQobVJTLAotICAgICAgICAgICAgRWxlbWVudC5jcmVhdGVVc2VyKG1SUywgRWxlbWVudC5EYXRhVHlwZS5GTE9BVF8zMiksCi0gICAgICAgICAgICBtQnVmZmVySURzLmxlbmd0aCk7Ci0KLSAgICAgICAgRWxlbWVudCBpZSA9IEVsZW1lbnQuY3JlYXRlUGl4ZWwobVJTLCBFbGVtZW50LkRhdGFUeXBlLlVOU0lHTkVEXzVfNl81LCBFbGVtZW50LkRhdGFLaW5kLlBJWEVMX1JHQik7Ci0gICAgICAgIG1JbWFnZXNbMF0gPSBBbGxvY2F0aW9uLmNyZWF0ZUZyb21CaXRtYXBSZXNvdXJjZUJveGVkKG1SUywgbVJlcywgUi5kcmF3YWJsZS5wMDEsIGllLCB0cnVlKTsKLSAgICAgICAgbUltYWdlc1sxXSA9IEFsbG9jYXRpb24uY3JlYXRlRnJvbUJpdG1hcFJlc291cmNlQm94ZWQobVJTLCBtUmVzLCBSLmRyYXdhYmxlLnAwMiwgaWUsIHRydWUpOwotICAgICAgICBtSW1hZ2VzWzJdID0gQWxsb2NhdGlvbi5jcmVhdGVGcm9tQml0bWFwUmVzb3VyY2VCb3hlZChtUlMsIG1SZXMsIFIuZHJhd2FibGUucDAzLCBpZSwgdHJ1ZSk7Ci0gICAgICAgIG1JbWFnZXNbM10gPSBBbGxvY2F0aW9uLmNyZWF0ZUZyb21CaXRtYXBSZXNvdXJjZUJveGVkKG1SUywgbVJlcywgUi5kcmF3YWJsZS5wMDQsIGllLCB0cnVlKTsKLSAgICAgICAgbUltYWdlc1s0XSA9IEFsbG9jYXRpb24uY3JlYXRlRnJvbUJpdG1hcFJlc291cmNlQm94ZWQobVJTLCBtUmVzLCBSLmRyYXdhYmxlLnAwNSwgaWUsIHRydWUpOwotICAgICAgICBtSW1hZ2VzWzVdID0gQWxsb2NhdGlvbi5jcmVhdGVGcm9tQml0bWFwUmVzb3VyY2VCb3hlZChtUlMsIG1SZXMsIFIuZHJhd2FibGUucDA2LCBpZSwgdHJ1ZSk7Ci0gICAgICAgIG1JbWFnZXNbNl0gPSBBbGxvY2F0aW9uLmNyZWF0ZUZyb21CaXRtYXBSZXNvdXJjZUJveGVkKG1SUywgbVJlcywgUi5kcmF3YWJsZS5wMDcsIGllLCB0cnVlKTsKLSAgICAgICAgbUltYWdlc1s3XSA9IEFsbG9jYXRpb24uY3JlYXRlRnJvbUJpdG1hcFJlc291cmNlQm94ZWQobVJTLCBtUmVzLCBSLmRyYXdhYmxlLnAwOCwgaWUsIHRydWUpOwotICAgICAgICBtSW1hZ2VzWzhdID0gQWxsb2NhdGlvbi5jcmVhdGVGcm9tQml0bWFwUmVzb3VyY2VCb3hlZChtUlMsIG1SZXMsIFIuZHJhd2FibGUucDA5LCBpZSwgdHJ1ZSk7Ci0gICAgICAgIG1JbWFnZXNbOV0gPSBBbGxvY2F0aW9uLmNyZWF0ZUZyb21CaXRtYXBSZXNvdXJjZUJveGVkKG1SUywgbVJlcywgUi5kcmF3YWJsZS5wMTAsIGllLCB0cnVlKTsKLSAgICAgICAgbUltYWdlc1sxMF0gPSBBbGxvY2F0aW9uLmNyZWF0ZUZyb21CaXRtYXBSZXNvdXJjZUJveGVkKG1SUywgbVJlcywgUi5kcmF3YWJsZS5wMTEsIGllLCB0cnVlKTsKLSAgICAgICAgbUltYWdlc1sxMV0gPSBBbGxvY2F0aW9uLmNyZWF0ZUZyb21CaXRtYXBSZXNvdXJjZUJveGVkKG1SUywgbVJlcywgUi5kcmF3YWJsZS5wMTIsIGllLCB0cnVlKTsKLSAgICAgICAgbUltYWdlc1sxMl0gPSBBbGxvY2F0aW9uLmNyZWF0ZUZyb21CaXRtYXBSZXNvdXJjZUJveGVkKG1SUywgbVJlcywgUi5kcmF3YWJsZS5wMTMsIGllLCB0cnVlKTsKLQotICAgICAgICBpbnQgYmxhY2tbXSA9IG5ldyBpbnRbMTAyNF07Ci0gICAgICAgIGZvcihpbnQgY3Q9MDsgY3QgPCBtSW1hZ2VzLmxlbmd0aDsgY3QrKykgewotICAgICAgICAgICAgQWxsb2NhdGlvbi5BZGFwdGVyMkQgYSA9IG1JbWFnZXNbY3RdLmNyZWF0ZUFkYXB0ZXIyRCgpOwotCi0gICAgICAgICAgICBpbnQgc2l6ZSA9IDUxMjsKLSAgICAgICAgICAgIGludCBtaXAgPSAwOwotICAgICAgICAgICAgd2hpbGUoc2l6ZSA+PSAyKSB7Ci0gICAgICAgICAgICAgICAgYS5zdWJEYXRhKDAsIDAsIDIsIHNpemUsIGJsYWNrKTsKLSAgICAgICAgICAgICAgICBhLnN1YkRhdGEoc2l6ZS0yLCAwLCAyLCBzaXplLCBibGFjayk7Ci0gICAgICAgICAgICAgICAgYS5zdWJEYXRhKDAsIDAsIHNpemUsIDIsIGJsYWNrKTsKLSAgICAgICAgICAgICAgICBhLnN1YkRhdGEoMCwgc2l6ZS0yLCBzaXplLCAyLCBibGFjayk7Ci0gICAgICAgICAgICAgICAgc2l6ZSA+Pj0gMTsKLSAgICAgICAgICAgICAgICBtaXArKzsKLSAgICAgICAgICAgICAgICBhLnNldENvbnN0cmFpbnQoRGltZW5zaW9uLkxPRCwgbWlwKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgbUltYWdlc1tjdF0udXBsb2FkVG9UZXh0dXJlKDEpOwotICAgICAgICAgICAgbUJ1ZmZlcklEc1tjdF0gPSBtSW1hZ2VzW2N0XS5nZXRJRCgpOwotICAgICAgICB9Ci0gICAgICAgIG1BbGxvY0lEcy5kYXRhKG1CdWZmZXJJRHMpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBpbml0U3RhdGUoKQotICAgIHsKLSAgICAgICAgbUJ1ZmZlclN0YXRlID0gbmV3IGludFsxMF07Ci0gICAgICAgIG1BbGxvY1N0YXRlID0gQWxsb2NhdGlvbi5jcmVhdGVTaXplZChtUlMsCi0gICAgICAgICAgICBFbGVtZW50LmNyZWF0ZVVzZXIobVJTLCBFbGVtZW50LkRhdGFUeXBlLkZMT0FUXzMyKSwKLSAgICAgICAgICAgIG1CdWZmZXJTdGF0ZS5sZW5ndGgpOwotICAgICAgICBtQnVmZmVyU3RhdGVbU1RBVEVfTEFTVF9GT0NVU10gPSAtMTsKLSAgICAgICAgbUFsbG9jU3RhdGUuZGF0YShtQnVmZmVyU3RhdGUpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBpbml0UlMoKSB7Ci0gICAgICAgIG1GU00gPSBuZXcgRmlsbVN0cmlwTWVzaCgpOwotICAgICAgICBtTWVzaCA9IG1GU00uaW5pdChtUlMpOwotICAgICAgICBtTWVzaC5zZXROYW1lKCJtZXNoIik7Ci0KLSAgICAgICAgaW5pdFBGUygpOwotICAgICAgICBpbml0UEYoKTsKLSAgICAgICAgaW5pdFBWKCk7Ci0KLSAgICAgICAgTG9nLmUoInJzIiwgIkRvbmUgbG9hZGluZyBuYW1lZCIpOwotCi0gICAgICAgIG1TdHJpcFBvc2l0aW9uVHlwZSA9IFR5cGUuY3JlYXRlRnJvbUNsYXNzKG1SUywgU3RyaXBQb3NpdGlvbi5jbGFzcywgMSk7Ci0KLSAgICAgICAgU2NyaXB0Qy5CdWlsZGVyIHNiID0gbmV3IFNjcmlwdEMuQnVpbGRlcihtUlMpOwotICAgICAgICBzYi5zZXRTY3JpcHQobVJlcywgUi5yYXcuZmlsbXN0cmlwKTsKLSAgICAgICAgc2Iuc2V0Um9vdCh0cnVlKTsKLSAgICAgICAgc2Iuc2V0VHlwZShtU3RyaXBQb3NpdGlvblR5cGUsICJQb3MiLCAxKTsKLSAgICAgICAgbVNjcmlwdFN0cmlwID0gc2IuY3JlYXRlKCk7Ci0gICAgICAgIG1TY3JpcHRTdHJpcC5zZXRDbGVhckNvbG9yKDAuMGYsIDAuMGYsIDAuMGYsIDEuMGYpOwotCi0gICAgICAgIG1BbGxvY1BvcyA9IEFsbG9jYXRpb24uY3JlYXRlVHlwZWQobVJTLCBtU3RyaXBQb3NpdGlvblR5cGUpOwotCi0gICAgICAgIGxvYWRJbWFnZXMoKTsKLSAgICAgICAgaW5pdFN0YXRlKCk7Ci0KLSAgICAgICAgbVBWQSA9IG5ldyBQcm9ncmFtVmVydGV4Lk1hdHJpeEFsbG9jYXRpb24obVJTKTsKLSAgICAgICAgbVBWQmFja2dyb3VuZC5iaW5kQWxsb2NhdGlvbihtUFZBKTsKLSAgICAgICAgbVBWSW1hZ2VzLmJpbmRBbGxvY2F0aW9uKG1QVkEpOwotICAgICAgICBtUFZBLnNldHVwUHJvamVjdGlvbk5vcm1hbGl6ZWQoMzIwLCA0ODApOwotCi0KLSAgICAgICAgbVNjcmlwdFN0cmlwLmJpbmRBbGxvY2F0aW9uKG1BbGxvY0lEcywgMCk7Ci0gICAgICAgIG1TY3JpcHRTdHJpcC5iaW5kQWxsb2NhdGlvbihtQWxsb2NQb3MsIDEpOwotICAgICAgICBtU2NyaXB0U3RyaXAuYmluZEFsbG9jYXRpb24obUFsbG9jU3RhdGUsIDIpOwotICAgICAgICBtU2NyaXB0U3RyaXAuYmluZEFsbG9jYXRpb24obVBWQS5tQWxsb2MsIDMpOwotCi0KLSAgICAgICAgbUFsbG9jT2Zmc2V0cyA9IEFsbG9jYXRpb24uY3JlYXRlU2l6ZWQobVJTLAotICAgICAgICAgICAgRWxlbWVudC5jcmVhdGVVc2VyKG1SUywgRWxlbWVudC5EYXRhVHlwZS5TSUdORURfMzIpLCBtRlNNLm1UcmlhbmdsZU9mZnNldHMubGVuZ3RoKTsKLSAgICAgICAgbUFsbG9jT2Zmc2V0cy5kYXRhKG1GU00ubVRyaWFuZ2xlT2Zmc2V0cyk7Ci0gICAgICAgIG1TY3JpcHRTdHJpcC5iaW5kQWxsb2NhdGlvbihtQWxsb2NPZmZzZXRzLCA0KTsKLQotICAgICAgICBtQWxsb2NPZmZzZXRzVGV4ID0gQWxsb2NhdGlvbi5jcmVhdGVTaXplZChtUlMsCi0gICAgICAgICAgICBFbGVtZW50LmNyZWF0ZVVzZXIobVJTLCBFbGVtZW50LkRhdGFUeXBlLkZMT0FUXzMyKSwgbUZTTS5tVHJpYW5nbGVPZmZzZXRzVGV4Lmxlbmd0aCk7Ci0gICAgICAgIG1BbGxvY09mZnNldHNUZXguZGF0YShtRlNNLm1UcmlhbmdsZU9mZnNldHNUZXgpOwotICAgICAgICBtU2NyaXB0U3RyaXAuYmluZEFsbG9jYXRpb24obUFsbG9jT2Zmc2V0c1RleCwgNSk7Ci0KLSAgICAgICAgc2V0RmlsbVN0cmlwUG9zaXRpb24oMCwgMCk7Ci0gICAgICAgIG1SUy5jb250ZXh0QmluZFJvb3RTY3JpcHQobVNjcmlwdFN0cmlwKTsKLSAgICB9Ci19Ci0KLQotCmRpZmYgLS1naXQgYS9saWJzL3JzL2phdmEvRmlsbS9zcmMvY29tL2FuZHJvaWQvZmlsbS9GaWxtU3RyaXBNZXNoLmphdmEgYi9saWJzL3JzL2phdmEvRmlsbS9zcmMvY29tL2FuZHJvaWQvZmlsbS9GaWxtU3RyaXBNZXNoLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ0OGNjZTAuLjAwMDAwMDAKLS0tIGEvbGlicy9ycy9qYXZhL0ZpbG0vc3JjL2NvbS9hbmRyb2lkL2ZpbG0vRmlsbVN0cmlwTWVzaC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjU5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuZmlsbTsKLQotaW1wb3J0IGphdmEuaW8uV3JpdGVyOwotaW1wb3J0IGphdmEubGFuZy5NYXRoOwotaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7Ci0KLWltcG9ydCBhbmRyb2lkLnJlbmRlcnNjcmlwdC5SZW5kZXJTY3JpcHQ7Ci1pbXBvcnQgYW5kcm9pZC5yZW5kZXJzY3JpcHQuU2ltcGxlTWVzaDsKLQotCi1jbGFzcyBGaWxtU3RyaXBNZXNoIHsKLQotICAgIGNsYXNzIFZlcnRleCB7Ci0gICAgICAgIGZsb2F0IG54OwotICAgICAgICBmbG9hdCBueTsKLSAgICAgICAgZmxvYXQgbno7Ci0gICAgICAgIGZsb2F0IHM7Ci0gICAgICAgIGZsb2F0IHQ7Ci0gICAgICAgIGZsb2F0IHg7Ci0gICAgICAgIGZsb2F0IHk7Ci0gICAgICAgIGZsb2F0IHo7Ci0KLSAgICAgICAgVmVydGV4KCkgewotICAgICAgICAgICAgbnggPSAwOwotICAgICAgICAgICAgbnkgPSAwOwotICAgICAgICAgICAgbnogPSAwOwotICAgICAgICAgICAgcyA9IDA7Ci0gICAgICAgICAgICB0ID0gMDsKLSAgICAgICAgICAgIHggPSAwOwotICAgICAgICAgICAgeSA9IDA7Ci0gICAgICAgICAgICB6ID0gMDsKLSAgICAgICAgfQotCi0gICAgICAgIHZvaWQgeHl6KGZsb2F0IF94LCBmbG9hdCBfeSwgZmxvYXQgX3opIHsKLSAgICAgICAgICAgIHggPSBfeDsKLSAgICAgICAgICAgIHkgPSBfeTsKLSAgICAgICAgICAgIHogPSBfejsKLSAgICAgICAgfQotCi0gICAgICAgIHZvaWQgbnh5eihmbG9hdCBfeCwgZmxvYXQgX3ksIGZsb2F0IF96KSB7Ci0gICAgICAgICAgICBueCA9IF94OwotICAgICAgICAgICAgbnkgPSBfeTsKLSAgICAgICAgICAgIG56ID0gX3o7Ci0gICAgICAgIH0KLQotICAgICAgICB2b2lkIHN0KGZsb2F0IF9zLCBmbG9hdCBfdCkgewotICAgICAgICAgICAgcyA9IF9zOwotICAgICAgICAgICAgdCA9IF90OwotICAgICAgICB9Ci0KLSAgICAgICAgdm9pZCBjb21wdXRlTm9ybShWZXJ0ZXggdjEsIFZlcnRleCB2MikgewotICAgICAgICAgICAgZmxvYXQgZHggPSB2MS54IC0gdjIueDsKLSAgICAgICAgICAgIGZsb2F0IGR5ID0gdjEueSAtIHYyLnk7Ci0gICAgICAgICAgICBmbG9hdCBkeiA9IHYxLnogLSB2Mi56OwotICAgICAgICAgICAgZmxvYXQgbGVuID0gKGZsb2F0KWphdmEubGFuZy5NYXRoLnNxcnQoZHgqZHggKyBkeSpkeSArIGR6KmR6KTsKLSAgICAgICAgICAgIGR4IC89IGxlbjsKLSAgICAgICAgICAgIGR5IC89IGxlbjsKLSAgICAgICAgICAgIGR6IC89IGxlbjsKLQotICAgICAgICAgICAgbnggPSBkeCAqIGR6OwotICAgICAgICAgICAgbnkgPSBkeSAqIGR6OwotICAgICAgICAgICAgbnogPSAoZmxvYXQpamF2YS5sYW5nLk1hdGguc3FydChkeCpkeCArIGR5KmR5KTsKLQotICAgICAgICAgICAgbGVuID0gKGZsb2F0KWphdmEubGFuZy5NYXRoLnNxcnQobngqbnggKyBueSpueSArIG56Km56KTsKLSAgICAgICAgICAgIG54IC89IGxlbjsKLSAgICAgICAgICAgIG55IC89IGxlbjsKLSAgICAgICAgICAgIG56IC89IGxlbjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGludFtdIG1UcmlhbmdsZU9mZnNldHM7Ci0gICAgZmxvYXRbXSBtVHJpYW5nbGVPZmZzZXRzVGV4OwotICAgIGludCBtVHJpYW5nbGVPZmZzZXRzQ291bnQ7Ci0KLSAgICBTaW1wbGVNZXNoIGluaXQoUmVuZGVyU2NyaXB0IHJzKQotICAgIHsKLSAgICAgICAgZmxvYXQgdnR4W10gPSBuZXcgZmxvYXRbXSB7Ci0gICAgICAgICAgICA2MC40MzEwMDNmLCAxMjQuNDgyMDUwZiwKLSAgICAgICAgICAgIDYwLjg2MjA3NGYsIDEyMC44NzI2MDRmLAotICAgICAgICAgICAgNjEuNzA1MzAzZiwgMTE3LjMzNjY2MmYsCi0gICAgICAgICAgICA2Mi45NDk1MDVmLCAxMTMuOTIxMTI3ZiwKLSAgICAgICAgICAgIDY0LjU3ODE3N2YsIDExMC42NzEzMDRmLAotICAgICAgICAgICAgNjYuNTY5NzE2ZiwgMTA3LjYzMDMwMmYsCi0gICAgICAgICAgICA2OC44OTc3MDNmLCAxMDQuODM4NDU3ZiwKLSAgICAgICAgICAgIDcxLjUzMTI1OWYsIDEwMi4zMzI4MDNmLAotICAgICAgICAgICAgNzQuNDM1NDUyZiwgMTAwLjE0NjU3N2YsCi0gICAgICAgICAgICA3Ny41NzE3NTdmLCA5OC4zMDg3NzdmLAotICAgICAgICAgICAgODAuODk4NTc0ZiwgOTYuODQzNzgxZiwKLSAgICAgICAgICAgIDg0LjM3MTc3M2YsIDk1Ljc3MTAyM2YsCi0gICAgICAgICAgICA4Ny45NDUyODNmLCA5NS4xMDQ3MzFmLAotICAgICAgICAgICAgOTguOTU4OTk0ZiwgOTUuMjY3MDk4ZiwKLSAgICAgICAgICAgIDEwOS40ODk1MjNmLCA5OC40OTc1OTZmLAotICAgICAgICAgICAgMTE4LjY5OTU4MmYsIDEwNC41MzkzNjZmLAotICAgICAgICAgICAgMTI1Ljg1Njg3MmYsIDExMi45MTIwMjJmLAotICAgICAgICAgICAgMTMwLjM5MjMxMWYsIDEyMi45NDk4NDlmLAotICAgICAgICAgICAgMTMxLjk0NTI4M2YsIDEzMy44NTQ3MzFmLAotICAgICAgICAgICAgMTMwLjM5MjMxMWYsIDE0NC43NTk2MTNmLAotICAgICAgICAgICAgMTI1Ljg1Njg3MmYsIDE1NC43OTc0MzlmLAotICAgICAgICAgICAgMTE4LjY5OTU4MmYsIDE2My4xNzAwOTZmLAotICAgICAgICAgICAgMTA5LjQ4OTUyM2YsIDE2OS4yMTE4NjZmLAotICAgICAgICAgICAgOTguOTU4OTk0ZiwgMTcyLjQ0MjM2NGYsCi0gICAgICAgICAgICA4Ny45NDUyODNmLCAxNzIuNjA0NzMxZiwKLSAgICAgICAgICAgIDcyLjUwNzMxM2YsIDE3Mi42NzI5MjdmLAotICAgICAgICAgICAgNTcuNjc4OTIwZiwgMTY4LjM3NzA3MWYsCi0gICAgICAgICAgICA0NC42NjgxMzVmLCAxNjAuMDY3MTM0ZiwKLSAgICAgICAgICAgIDM0LjUzNDkwOGYsIDE0OC40MjAxMDRmLAotICAgICAgICAgICAgMjguMTA0NzY3ZiwgMTM0LjM4NDgzMWYsCi0gICAgICAgICAgICAyNS45MDE1NTdmLCAxMTkuMTA0NzMxZiwKLSAgICAgICAgICAgIDI4LjEwNDc2N2YsIDEwMy44MjQ2MzFmLAotICAgICAgICAgICAgMzQuNTM0OTA4ZiwgODkuNzg5MzU4ZiwKLSAgICAgICAgICAgIDQ0LjY2ODEzNWYsIDc4LjE0MjMyN2YsCi0gICAgICAgICAgICA1Ny42Nzg5MjBmLCA2OS44MzIzOTBmLAotICAgICAgICAgICAgNzIuNTA3MzEzZiwgNjUuNTM2NTM0ZiwKLSAgICAgICAgICAgIDg3Ljk0NTI4M2YsIDY1LjYwNDczMWYsCi0gICAgICAgICAgICAxMDYuOTE4MTE3ZiwgNjUuNjg4NTQyZiwKLSAgICAgICAgICAgIDEyNS4xNDE3OTVmLCA2MC40MDkwNTZmLAotICAgICAgICAgICAgMTQxLjEzMTY4NmYsIDUwLjE5NjM3NmYsCi0gICAgICAgICAgICAxNTMuNTg1MTM3ZiwgMzUuODgyNTAyZiwKLSAgICAgICAgICAgIDE2MS40ODc2MDBmLCAxOC42MzM1NDVmLAotICAgICAgICAgICAgMTY0LjE5NTI4M2YsIC0wLjE0NTI2OWYsCi0gICAgICAgICAgICAxNjEuNDg3NjAwZiwgLTE4LjkyNDA4NGYsCi0gICAgICAgICAgICAxNTMuNTg1MTM3ZiwgLTM2LjE3MzA0MGYsCi0gICAgICAgICAgICAxNDEuMTMxNjg2ZiwgLTUwLjQ4NjkxNGYsCi0gICAgICAgICAgICAxMjUuMTQxNzk1ZiwgLTYwLjY5OTU5NGYsCi0gICAgICAgICAgICAxMDYuOTE4MTE3ZiwgLTY1Ljk3OTA4MWYsCi0gICAgICAgICAgICA4Ny45NDUyODNmLCAtNjUuODk1MjY5ZiwKLSAgICAgICAgICAgIDgwZiwgLTY1Ljg5NTI2OWYsCi0gICAgICAgICAgICA2MGYsIC02NS44OTUyNjlmLAotICAgICAgICAgICAgNDBmLCAtNjUuODk1MjY5ZiwKLSAgICAgICAgICAgIDIwZiwgLTY1Ljg5NTI2OWYsCi0gICAgICAgICAgICAwZiwgLTY1Ljg5NTI2OWYsCi0gICAgICAgICAgICAtMjBmLCAtNjUuODk1MjY5ZiwKLSAgICAgICAgICAgIC00MGYsIC02NS44OTUyNjlmLAotICAgICAgICAgICAgLTYwZiwgLTY1Ljg5NTI2OWYsCi0gICAgICAgICAgICAtODBmLCAtNjUuODk1MjY5ZiwKLSAgICAgICAgICAgIC04Ny45NDUyODNmLCAtNjUuODk1MjY5ZiwKLSAgICAgICAgICAgIC0xMDYuOTE4MTE3ZiwgLTY1Ljk3OTA4MWYsCi0gICAgICAgICAgICAtMTI1LjE0MTc5NWYsIC02MC42OTk1OTRmLAotICAgICAgICAgICAgLTE0MS4xMzE2ODZmLCAtNTAuNDg2OTE0ZiwKLSAgICAgICAgICAgIC0xNTMuNTg1MTM3ZiwgLTM2LjE3MzA0MGYsCi0gICAgICAgICAgICAtMTYxLjQ4NzYwMGYsIC0xOC45MjQwODRmLAotICAgICAgICAgICAgLTE2NC4xOTUyODNmLCAtMC4xNDUyNjlmLAotICAgICAgICAgICAgLTE2MS40ODc2MDBmLCAxOC42MzM1NDVmLAotICAgICAgICAgICAgIC0xNTMuNTg1MTM3ZiwgMzUuODgyNTAyZiwKLSAgICAgICAgICAgICAtMTQxLjEzMTY4NmYsIDUwLjE5NjM3NmYsCi0gICAgICAgICAgICAgLTEyNS4xNDE3OTVmLCA2MC40MDkwNTZmLAotICAgICAgICAgICAgIC0xMDYuOTE4MTE3ZiwgNjUuNjg4NTQyZiwKLSAgICAgICAgICAgICAtODcuOTQ1MjgzZiwgNjUuNjA0NzMxZiwKLSAgICAgICAgICAgICAtNzIuNTA3MzEzZiwgNjUuNTM2NTM0ZiwKLSAgICAgICAgICAgICAtNTcuNjc4OTIwZiwgNjkuODMyMzkwZiwKLSAgICAgICAgICAgICAtNDQuNjY4MTM1ZiwgNzguMTQyMzI3ZiwKLSAgICAgICAgICAgICAtMzQuNTM0OTA4ZiwgODkuNzg5MzU4ZiwKLSAgICAgICAgICAgICAtMjguMTA0NzY3ZiwgMTAzLjgyNDYzMWYsCi0gICAgICAgICAgICAgLTI1LjkwMTU1N2YsIDExOS4xMDQ3MzFmLAotICAgICAgICAgICAgIC0yOC4xMDQ3NjdmLCAxMzQuMzg0ODMxZiwKLSAgICAgICAgICAgICAtMzQuNTM0OTA4ZiwgMTQ4LjQyMDEwNGYsCi0gICAgICAgICAgICAgLTQ0LjY2ODEzNWYsIDE2MC4wNjcxMzRmLAotICAgICAgICAgICAgIC01Ny42Nzg5MjBmLCAxNjguMzc3MDcxZiwKLSAgICAgICAgICAgICAtNzIuNTA3MzEzZiwgMTcyLjY3MjkyN2YsCi0gICAgICAgICAgICAgLTg3Ljk0NTI4M2YsIDE3Mi42MDQ3MzFmLAotICAgICAgICAgICAgIC05OC45NTg5OTRmLCAxNzIuNDQyMzY0ZiwKLSAgICAgICAgICAgICAtMTA5LjQ4OTUyM2YsIDE2OS4yMTE4NjZmLAotICAgICAgICAgICAgIC0xMTguNjk5NTgyZiwgMTYzLjE3MDA5NmYsCi0gICAgICAgICAgICAgLTEyNS44NTY4NzJmLCAxNTQuNzk3NDM5ZiwKLSAgICAgICAgICAgICAtMTMwLjM5MjMxMWYsIDE0NC43NTk2MTNmLAotICAgICAgICAgICAgIC0xMzEuOTQ1MjgzZiwgMTMzLjg1NDczMWYsCi0gICAgICAgICAgICAgLTEzMC4zOTIzMTFmLCAxMjIuOTQ5ODQ5ZiwKLSAgICAgICAgICAgICAtMTI1Ljg1Njg3MmYsIDExMi45MTIwMjJmLAotICAgICAgICAgICAgIC0xMTguNjk5NTgyZiwgMTA0LjUzOTM2NmYsCi0gICAgICAgICAgICAgLTEwOS40ODk1MjNmLCA5OC40OTc1OTZmLAotICAgICAgICAgICAgIC05OC45NTg5OTRmLCA5NS4yNjcwOThmLAotICAgICAgICAgICAgIC04Ny45NDUyODNmLCA5NS4xMDQ3MzFmLAotICAgICAgICAgICAgIC04NC4zNzE3NzNmLCA5NS43NzEwMjNmLAotICAgICAgICAgICAgIC04MC44OTg1NzRmLCA5Ni44NDM3ODFmLAotICAgICAgICAgICAgIC03Ny41NzE3NTdmLCA5OC4zMDg3NzdmLAotICAgICAgICAgICAgIC03NC40MzU0NTJmLCAxMDAuMTQ2NTc3ZiwKLSAgICAgICAgICAgICAtNzEuNTMxMjU5ZiwgMTAyLjMzMjgwM2YsCi0gICAgICAgICAgICAgLTY4Ljg5NzcwM2YsIDEwNC44Mzg0NTdmLAotICAgICAgICAgICAgIC02Ni41Njk3MTZmLCAxMDcuNjMwMzAyZiwKLSAgICAgICAgICAgICAtNjQuNTc4MTc3ZiwgMTEwLjY3MTMwNGYsCi0gICAgICAgICAgICAgLTYyLjk0OTUwNWYsIDExMy45MjExMjdmLAotICAgICAgICAgICAgIC02MS43MDUzMDNmLCAxMTcuMzM2NjYyZiwKLSAgICAgICAgICAgICAtNjAuODYyMDc0ZiwgMTIwLjg3MjYwNGYsCi0gICAgICAgICAgICAgLTYwLjQzMTAwM2YsIDEyNC40ODIwNTBmCi0gICAgICAgIH07Ci0KLQotICAgICAgICBtVHJpYW5nbGVPZmZzZXRzID0gbmV3IGludFs2NF07Ci0gICAgICAgIG1UcmlhbmdsZU9mZnNldHNUZXggPSBuZXcgZmxvYXRbNjRdOwotCi0gICAgICAgIG1UcmlhbmdsZU9mZnNldHNbMF0gPSAwOwotICAgICAgICBtVHJpYW5nbGVPZmZzZXRzQ291bnQgPSAxOwotCi0gICAgICAgIFZlcnRleCB0ID0gbmV3IFZlcnRleCgpOwotICAgICAgICB0Lm54eXooMSwgMCwgMCk7Ci0gICAgICAgIGludCBjb3VudCA9IHZ0eC5sZW5ndGggLyAyOwotCi0gICAgICAgIFNpbXBsZU1lc2guVHJpYW5nbGVNZXNoQnVpbGRlciB0bSA9IG5ldyBTaW1wbGVNZXNoLlRyaWFuZ2xlTWVzaEJ1aWxkZXIoCi0gICAgICAgICAgICBycywgMywKLSAgICAgICAgICAgIFNpbXBsZU1lc2guVHJpYW5nbGVNZXNoQnVpbGRlci5OT1JNQUwgfCBTaW1wbGVNZXNoLlRyaWFuZ2xlTWVzaEJ1aWxkZXIuVEVYVFVSRV8wKTsKLQotICAgICAgICBmbG9hdCBydW5uaW5nUyA9IDA7Ci0gICAgICAgIGZvciAoaW50IGN0PTA7IGN0IDwgKGNvdW50LTEpOyBjdCsrKSB7Ci0gICAgICAgICAgICB0LnggPSAtdnR4W2N0KjJdIC8gMTAwLmY7Ci0gICAgICAgICAgICB0LnogPSB2dHhbY3QqMisxXSAvIDEwMC5mOwotICAgICAgICAgICAgdC5zID0gcnVubmluZ1M7Ci0gICAgICAgICAgICB0Lm54ID0gICh2dHhbY3QqMiszXSAtIHZ0eFtjdCoyICsxXSk7Ci0gICAgICAgICAgICB0Lm55ID0gICh2dHhbY3QqMisyXSAtIHZ0eFtjdCoyICAgXSk7Ci0gICAgICAgICAgICBmbG9hdCBsZW4gPSAoZmxvYXQpamF2YS5sYW5nLk1hdGguc3FydCh0Lm54ICogdC5ueCArIHQubnkgKiB0Lm55KTsKLSAgICAgICAgICAgIHJ1bm5pbmdTICs9IGxlbiAvIDEwMDsKLSAgICAgICAgICAgIHQubnggLz0gbGVuOwotICAgICAgICAgICAgdC5ueSAvPSBsZW47Ci0gICAgICAgICAgICB0LnkgPSAtMC41ZjsKLSAgICAgICAgICAgIHQudCA9IDA7Ci0gICAgICAgICAgICB0bS5zZXROb3JtYWwodC5ueCwgdC5ueSwgdC5ueik7Ci0gICAgICAgICAgICB0bS5zZXRUZXh0dXJlKHQucywgdC50KTsKLSAgICAgICAgICAgIHRtLmFkZFZlcnRleCh0LngsIHQueSwgdC56KTsKLSAgICAgICAgICAgIC8vYW5kcm9pZC51dGlsLkxvZy5lKCJycyIsICJ2dHggeD0iK3QueCsiIHk9Iit0LnkrIiB6PSIrdC56KyIgcz0iK3QucysiIHQ9Iit0LnQpOwotICAgICAgICAgICAgdC55ID0gLjVmOwotICAgICAgICAgICAgdC50ID0gMTsKLSAgICAgICAgICAgIHRtLnNldFRleHR1cmUodC5zLCB0LnQpOwotICAgICAgICAgICAgdG0uYWRkVmVydGV4KHQueCwgdC55LCB0LnopOwotICAgICAgICAgICAgLy9hbmRyb2lkLnV0aWwuTG9nLmUoInJzIiwgInZ0eCB4PSIrdC54KyIgeT0iK3QueSsiIHo9Iit0LnorIiBzPSIrdC5zKyIgdD0iK3QudCk7Ci0KLSAgICAgICAgICAgIGlmKChydW5uaW5nUyoyKSA+IG1UcmlhbmdsZU9mZnNldHNDb3VudCkgewotICAgICAgICAgICAgICAgIG1UcmlhbmdsZU9mZnNldHNbbVRyaWFuZ2xlT2Zmc2V0c0NvdW50XSA9IGN0KjIgKiAzOwotICAgICAgICAgICAgICAgIG1UcmlhbmdsZU9mZnNldHNUZXhbbVRyaWFuZ2xlT2Zmc2V0c0NvdW50XSA9IHQuczsKLSAgICAgICAgICAgICAgICBtVHJpYW5nbGVPZmZzZXRzQ291bnQgKys7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBjb3VudCA9IChjb3VudCAqIDIgLSAyKTsKLSAgICAgICAgZm9yIChpbnQgY3Q9MDsgY3QgPCAoY291bnQtMik7IGN0Kz0gMikgewotICAgICAgICAgICAgdG0uYWRkVHJpYW5nbGUoY3QsIGN0KzEsIGN0KzIpOwotICAgICAgICAgICAgdG0uYWRkVHJpYW5nbGUoY3QrMSwgY3QrMywgY3QrMik7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRtLmNyZWF0ZSgpOwotICAgIH0KLQotCi19Ci0KZGlmZiAtLWdpdCBhL2xpYnMvcnMvamF2YS9GaWxtL3NyYy9jb20vYW5kcm9pZC9maWxtL0ZpbG1WaWV3LmphdmEgYi9saWJzL3JzL2phdmEvRmlsbS9zcmMvY29tL2FuZHJvaWQvZmlsbS9GaWxtVmlldy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YmMyODExLi4wMDAwMDAwCi0tLSBhL2xpYnMvcnMvamF2YS9GaWxtL3NyYy9jb20vYW5kcm9pZC9maWxtL0ZpbG1WaWV3LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5maWxtOwotCi1pbXBvcnQgamF2YS5pby5Xcml0ZXI7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5TZW1hcGhvcmU7Ci0KLWltcG9ydCBhbmRyb2lkLnJlbmRlcnNjcmlwdC5SU1N1cmZhY2VWaWV3OwotaW1wb3J0IGFuZHJvaWQucmVuZGVyc2NyaXB0LlJlbmRlclNjcmlwdDsKLWltcG9ydCBhbmRyb2lkLnJlbmRlcnNjcmlwdC5SZW5kZXJTY3JpcHRHTDsKLQotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuUmVzb3VyY2VzOwotaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwOwotaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuQml0bWFwRHJhd2FibGU7Ci1pbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZTsKLWltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXI7Ci1pbXBvcnQgYW5kcm9pZC5vcy5NZXNzYWdlOwotaW1wb3J0IGFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQ7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKLWltcG9ydCBhbmRyb2lkLnZpZXcuU3VyZmFjZTsKLWltcG9ydCBhbmRyb2lkLnZpZXcuU3VyZmFjZUhvbGRlcjsKLWltcG9ydCBhbmRyb2lkLnZpZXcuU3VyZmFjZVZpZXc7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LktleUV2ZW50OwotaW1wb3J0IGFuZHJvaWQudmlldy5Nb3Rpb25FdmVudDsKLQotcHVibGljIGNsYXNzIEZpbG1WaWV3IGV4dGVuZHMgUlNTdXJmYWNlVmlldyB7Ci0KLSAgICBwdWJsaWMgRmlsbVZpZXcoQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgIHN1cGVyKGNvbnRleHQpOwotICAgICAgICAvL3NldEZvY3VzYWJsZSh0cnVlKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIFJlbmRlclNjcmlwdEdMIG1SUzsKLSAgICBwcml2YXRlIEZpbG1SUyBtUmVuZGVyOwotCi0KLSAgICBwdWJsaWMgdm9pZCBzdXJmYWNlQ2hhbmdlZChTdXJmYWNlSG9sZGVyIGhvbGRlciwgaW50IGZvcm1hdCwgaW50IHcsIGludCBoKSB7Ci0gICAgICAgIHN1cGVyLnN1cmZhY2VDaGFuZ2VkKGhvbGRlciwgZm9ybWF0LCB3LCBoKTsKLSAgICAgICAgaWYgKG1SUyA9PSBudWxsKSB7Ci0gICAgICAgICAgICBtUlMgPSBjcmVhdGVSZW5kZXJTY3JpcHQodHJ1ZSk7Ci0gICAgICAgICAgICBtUlMuY29udGV4dFNldFN1cmZhY2UodywgaCwgaG9sZGVyLmdldFN1cmZhY2UoKSk7Ci0gICAgICAgICAgICBtUmVuZGVyID0gbmV3IEZpbG1SUygpOwotICAgICAgICAgICAgbVJlbmRlci5pbml0KG1SUywgZ2V0UmVzb3VyY2VzKCksIHcsIGgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgb25EZXRhY2hlZEZyb21XaW5kb3coKSB7Ci0gICAgICAgIGlmKG1SUyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtUlMgPSBudWxsOwotICAgICAgICAgICAgZGVzdHJveVJlbmRlclNjcmlwdCgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gb25LZXlEb3duKGludCBrZXlDb2RlLCBLZXlFdmVudCBldmVudCkKLSAgICB7Ci0gICAgICAgIC8vIGJyZWFrIHBvaW50IGF0IGhlcmUKLSAgICAgICAgLy8gdGhpcyBtZXRob2QgZG9lc24ndCB3b3JrIHdoZW4gJ2V4dGVuZHMgVmlldycgaW5jbHVkZSAnZXh0ZW5kcyBTY3JvbGxWaWV3Jy4KLSAgICAgICAgcmV0dXJuIHN1cGVyLm9uS2V5RG93bihrZXlDb2RlLCBldmVudCk7Ci0gICAgfQotCi0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBvblRvdWNoRXZlbnQoTW90aW9uRXZlbnQgZXYpCi0gICAgewotICAgICAgICBib29sZWFuIHJldCA9IHRydWU7Ci0gICAgICAgIGludCBhY3QgPSBldi5nZXRBY3Rpb24oKTsKLSAgICAgICAgaWYgKGFjdCA9PSBldi5BQ1RJT05fVVApIHsKLSAgICAgICAgICAgIHJldCA9IGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIG1SZW5kZXIuc2V0RmlsbVN0cmlwUG9zaXRpb24oKGludClldi5nZXRYKCksIChpbnQpZXYuZ2V0WSgpIC8gNSk7Ci0gICAgICAgIHJldHVybiByZXQ7Ci0gICAgfQotfQotCi0KZGlmZiAtLWdpdCBhL2xpYnMvcnMvamF2YS9Gb3VudGFpbi9BbmRyb2lkLm1rIGIvbGlicy9ycy9qYXZhL0ZvdW50YWluL0FuZHJvaWQubWsKaW5kZXggZjdlNTNhOC4uNzE5NDRiMiAxMDA2NDQKLS0tIGEvbGlicy9ycy9qYXZhL0ZvdW50YWluL0FuZHJvaWQubWsKKysrIGIvbGlicy9ycy9qYXZhL0ZvdW50YWluL0FuZHJvaWQubWsKQEAgLTE0LDE0ICsxNCwxOCBAQAogIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICMKIAoraWZuZXEgKCQoVEFSR0VUX1NJTVVMQVRPUiksdHJ1ZSkKKwogTE9DQUxfUEFUSCA6PSAkKGNhbGwgbXktZGlyKQogaW5jbHVkZSAkKENMRUFSX1ZBUlMpCiAKIExPQ0FMX01PRFVMRV9UQUdTIDo9IG9wdGlvbmFsCiAKLUxPQ0FMX1NSQ19GSUxFUyA6PSAkKGNhbGwgYWxsLWphdmEtZmlsZXMtdW5kZXIsIHNyYykKK0xPQ0FMX1NSQ19GSUxFUyA6PSAkKGNhbGwgYWxsLWphdmEtZmlsZXMtdW5kZXIsIHNyYykgJChjYWxsIGFsbC1yZW5kZXJzY3JpcHQtZmlsZXMtdW5kZXIsIHNyYykKICNMT0NBTF9TVEFUSUNfSkFWQV9MSUJSQVJJRVMgOj0gYW5kcm9pZC5yZW5kZXJzY3JpcHQKIAogTE9DQUxfUEFDS0FHRV9OQU1FIDo9IEZvdW50YWluCiAKIGluY2x1ZGUgJChCVUlMRF9QQUNLQUdFKQorCitlbmRpZgpkaWZmIC0tZ2l0IGEvbGlicy9ycy9qYXZhL0ZvdW50YWluL3Jlcy9kcmF3YWJsZS9nYWRnZXRzX2Nsb2NrX21wMy5wbmcgYi9saWJzL3JzL2phdmEvRm91bnRhaW4vcmVzL2RyYXdhYmxlL2dhZGdldHNfY2xvY2tfbXAzLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZTkxYmZiNC4uMDAwMDAwMAotLS0gYS9saWJzL3JzL2phdmEvRm91bnRhaW4vcmVzL2RyYXdhYmxlL2dhZGdldHNfY2xvY2tfbXAzLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYnMvcnMvamF2YS9Gb3VudGFpbi9yZXMvcmF3L2ZvdW50YWluLmMgYi9saWJzL3JzL2phdmEvRm91bnRhaW4vcmVzL3Jhdy9mb3VudGFpbi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3M2I4MTliLi4wMDAwMDAwCi0tLSBhL2xpYnMvcnMvamF2YS9Gb3VudGFpbi9yZXMvcmF3L2ZvdW50YWluLmMKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi0vLyBGb3VudGFpbiB0ZXN0IHNjcmlwdAotI3ByYWdtYSB2ZXJzaW9uKDEpCi0KLWludCBuZXdQYXJ0ID0gMDsKLQotaW50IG1haW4oaW50IGxhdW5jaElEKSB7Ci0gICAgaW50IGN0OwotICAgIGludCBjb3VudCA9IENvbnRyb2wtPmNvdW50OwotICAgIGludCByYXRlID0gQ29udHJvbC0+cmF0ZTsKLSAgICBmbG9hdCBoZWlnaHQgPSBnZXRIZWlnaHQoKTsKLSAgICBzdHJ1Y3QgcG9pbnRfcyAqIHAgPSAoc3RydWN0IHBvaW50X3MgKilwb2ludDsKLQotICAgIGlmIChyYXRlKSB7Ci0gICAgICAgIGZsb2F0IHJNYXggPSAoKGZsb2F0KXJhdGUpICogMC4wMDVmOwotICAgICAgICBpbnQgeCA9IENvbnRyb2wtPng7Ci0gICAgICAgIGludCB5ID0gQ29udHJvbC0+eTsKLSAgICAgICAgaW50IGNvbG9yID0gKChpbnQpKENvbnRyb2wtPnIgKiAyNTUuZikpIHwKLSAgICAgICAgICAgICAgICAgICAgKChpbnQpKENvbnRyb2wtPmcgKiAyNTUuZikpIDw8IDggfAotICAgICAgICAgICAgICAgICAgICAoKGludCkoQ29udHJvbC0+YiAqIDI1NS5mKSkgPDwgMTYgfAotICAgICAgICAgICAgICAgICAgICAoMHhmMCA8PCAyNCk7Ci0gICAgICAgIHN0cnVjdCBwb2ludF9zICogbnAgPSAmcFtuZXdQYXJ0XTsKLQotICAgICAgICB3aGlsZSAocmF0ZS0tKSB7Ci0gICAgICAgICAgICB2ZWMyUmFuZCgoZmxvYXQgKikmbnAtPmRlbHRhLngsIHJNYXgpOwotICAgICAgICAgICAgbnAtPnBvc2l0aW9uLnggPSB4OwotICAgICAgICAgICAgbnAtPnBvc2l0aW9uLnkgPSB5OwotICAgICAgICAgICAgbnAtPmNvbG9yID0gY29sb3I7Ci0gICAgICAgICAgICBuZXdQYXJ0Kys7Ci0gICAgICAgICAgICBucCsrOwotICAgICAgICAgICAgaWYgKG5ld1BhcnQgPj0gY291bnQpIHsKLSAgICAgICAgICAgICAgICBuZXdQYXJ0ID0gMDsKLSAgICAgICAgICAgICAgICBucCA9ICZwW25ld1BhcnRdOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgZm9yIChjdD0wOyBjdCA8IGNvdW50OyBjdCsrKSB7Ci0gICAgICAgIGZsb2F0IGR5ID0gcC0+ZGVsdGEueSArIDAuMTVmOwotICAgICAgICBmbG9hdCBwb3N5ID0gcC0+cG9zaXRpb24ueSArIGR5OwotICAgICAgICBpZiAoKHBvc3kgPiBoZWlnaHQpICYmIChkeSA+IDApKSB7Ci0gICAgICAgICAgICBkeSAqPSAtMC4zZjsKLSAgICAgICAgfQotICAgICAgICBwLT5kZWx0YS55ID0gZHk7Ci0gICAgICAgIHAtPnBvc2l0aW9uLnggKz0gcC0+ZGVsdGEueDsKLSAgICAgICAgcC0+cG9zaXRpb24ueSA9IHBvc3k7Ci0gICAgICAgIHArKzsKLSAgICB9Ci0KLSAgICB1cGxvYWRUb0J1ZmZlck9iamVjdChOQU1FRF9QYXJ0QnVmZmVyKTsKLSAgICBkcmF3U2ltcGxlTWVzaChOQU1FRF9QYXJ0TWVzaCk7Ci0gICAgcmV0dXJuIDE7Ci19CmRpZmYgLS1naXQgYS9saWJzL3JzL2phdmEvRm91bnRhaW4vcmVzL3Jhdy9mb3VudGFpbjIucnMgYi9saWJzL3JzL2phdmEvRm91bnRhaW4vcmVzL3Jhdy9mb3VudGFpbjIucnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMzMDExNDAuLjAwMDAwMDAKLS0tIGEvbGlicy9ycy9qYXZhL0ZvdW50YWluL3Jlcy9yYXcvZm91bnRhaW4yLnJzCisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAotLy8gRm91bnRhaW4gdGVzdCBzY3JpcHQKLSNwcmFnbWEgdmVyc2lvbigxKQotCi0jaW5jbHVkZSAicnNfdHlwZXMucnNoIgotI2luY2x1ZGUgInJzX21hdGgucnNoIgotI2luY2x1ZGUgInJzX2dyYXBoaWNzLnJzaCIKLQotc3RhdGljIGludCBuZXdQYXJ0ID0gMDsKLQotdHlwZWRlZiBzdHJ1Y3QgQ29udHJvbF9zIHsKLSAgICBpbnQgeCwgeTsKLSAgICBpbnQgcmF0ZTsKLSAgICBpbnQgY291bnQ7Ci0gICAgZmxvYXQgciwgZywgYjsKLSAgICByc19hbGxvY2F0aW9uIHBhcnRCdWZmZXI7Ci0gICAgcnNfbWVzaCBwYXJ0TWVzaDsKLX0gQ29udHJvbF90OwotQ29udHJvbF90ICpDb250cm9sOwotCi10eXBlZGVmIHN0cnVjdCBQb2ludF9zewotICAgIGZsb2F0MiBkZWx0YTsKLSAgICBmbG9hdDIgcG9zaXRpb247Ci0gICAgdW5zaWduZWQgaW50IGNvbG9yOwotfSBQb2ludF90OwotUG9pbnRfdCAqcG9pbnQ7Ci0KLWludCBtYWluKGludCBsYXVuY2hJRCkgewotICAgIGludCBjdDsKLSAgICBpbnQgY291bnQgPSBDb250cm9sLT5jb3VudDsKLSAgICBpbnQgcmF0ZSA9IENvbnRyb2wtPnJhdGU7Ci0gICAgZmxvYXQgaGVpZ2h0ID0gZ2V0SGVpZ2h0KCk7Ci0gICAgUG9pbnRfdCAqIHAgPSBwb2ludDsKLQotICAgIGlmIChyYXRlKSB7Ci0gICAgICAgIGZsb2F0IHJNYXggPSAoKGZsb2F0KXJhdGUpICogMC4wMDVmOwotICAgICAgICBpbnQgeCA9IENvbnRyb2wtPng7Ci0gICAgICAgIGludCB5ID0gQ29udHJvbC0+eTsKLSAgICAgICAgaW50IGNvbG9yID0gKChpbnQpKENvbnRyb2wtPnIgKiAyNTUuZikpIHwKLSAgICAgICAgICAgICAgICAgICAgKChpbnQpKENvbnRyb2wtPmcgKiAyNTUuZikpIDw8IDggfAotICAgICAgICAgICAgICAgICAgICAoKGludCkoQ29udHJvbC0+YiAqIDI1NS5mKSkgPDwgMTYgfAotICAgICAgICAgICAgICAgICAgICAoMHhmMCA8PCAyNCk7Ci0gICAgICAgIFBvaW50X3QgKiBucCA9ICZwW25ld1BhcnRdOwotCi0gICAgICAgIHdoaWxlIChyYXRlLS0pIHsKLSAgICAgICAgICAgIG5wLT5kZWx0YSA9IHZlYzJSYW5kKHJNYXgpOwotICAgICAgICAgICAgbnAtPnBvc2l0aW9uLnggPSB4OwotICAgICAgICAgICAgbnAtPnBvc2l0aW9uLnkgPSB5OwotICAgICAgICAgICAgbnAtPmNvbG9yID0gY29sb3I7Ci0gICAgICAgICAgICBuZXdQYXJ0Kys7Ci0gICAgICAgICAgICBucCsrOwotICAgICAgICAgICAgaWYgKG5ld1BhcnQgPj0gY291bnQpIHsKLSAgICAgICAgICAgICAgICBuZXdQYXJ0ID0gMDsKLSAgICAgICAgICAgICAgICBucCA9ICZwW25ld1BhcnRdOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgZm9yIChjdD0wOyBjdCA8IGNvdW50OyBjdCsrKSB7Ci0gICAgICAgIGZsb2F0IGR5ID0gcC0+ZGVsdGEueSArIDAuMTVmOwotICAgICAgICBmbG9hdCBwb3N5ID0gcC0+cG9zaXRpb24ueSArIGR5OwotICAgICAgICBpZiAoKHBvc3kgPiBoZWlnaHQpICYmIChkeSA+IDApKSB7Ci0gICAgICAgICAgICBkeSAqPSAtMC4zZjsKLSAgICAgICAgfQotICAgICAgICBwLT5kZWx0YS55ID0gZHk7Ci0gICAgICAgIHAtPnBvc2l0aW9uLnggKz0gcC0+ZGVsdGEueDsKLSAgICAgICAgcC0+cG9zaXRpb24ueSA9IHBvc3k7Ci0gICAgICAgIHArKzsKLSAgICB9Ci0KLSAgICB1cGxvYWRUb0J1ZmZlck9iamVjdChDb250cm9sLT5wYXJ0QnVmZmVyKTsKLSAgICBkcmF3U2ltcGxlTWVzaChDb250cm9sLT5wYXJ0TWVzaCk7Ci0gICAgcmV0dXJuIDE7Ci19CmRpZmYgLS1naXQgYS9saWJzL3JzL2phdmEvRm91bnRhaW4vc3JjL2NvbS9hbmRyb2lkL2ZvdW50YWluL0ZvdW50YWluUlMuamF2YSBiL2xpYnMvcnMvamF2YS9Gb3VudGFpbi9zcmMvY29tL2FuZHJvaWQvZm91bnRhaW4vRm91bnRhaW5SUy5qYXZhCmluZGV4IDkzNTY1NzkuLjI5N2VhMDcgMTAwNjQ0Ci0tLSBhL2xpYnMvcnMvamF2YS9Gb3VudGFpbi9zcmMvY29tL2FuZHJvaWQvZm91bnRhaW4vRm91bnRhaW5SUy5qYXZhCisrKyBiL2xpYnMvcnMvamF2YS9Gb3VudGFpbi9zcmMvY29tL2FuZHJvaWQvZm91bnRhaW4vRm91bnRhaW5SUy5qYXZhCkBAIC0yMiw5NCArMjIsNTAgQEAKIAogCiBwdWJsaWMgY2xhc3MgRm91bnRhaW5SUyB7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUEFSVF9DT1VOVCA9IDIwMDAwOwotCi0gICAgc3RhdGljIGNsYXNzIFNvbWVEYXRhIHsKLSAgICAgICAgcHVibGljIGludCB4OwotICAgICAgICBwdWJsaWMgaW50IHk7Ci0gICAgICAgIHB1YmxpYyBpbnQgcmF0ZTsKLSAgICAgICAgcHVibGljIGludCBjb3VudDsKLSAgICAgICAgcHVibGljIGZsb2F0IHI7Ci0gICAgICAgIHB1YmxpYyBmbG9hdCBnOwotICAgICAgICBwdWJsaWMgZmxvYXQgYjsKLSAgICB9CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUEFSVF9DT1VOVCA9IDUwMDAwOwogCiAgICAgcHVibGljIEZvdW50YWluUlMoKSB7CiAgICAgfQogCisgICAgcHJpdmF0ZSBSZXNvdXJjZXMgbVJlczsKKyAgICBwcml2YXRlIFJlbmRlclNjcmlwdEdMIG1SUzsKKyAgICBwcml2YXRlIFNjcmlwdENfRm91bnRhaW4gbVNjcmlwdDsKICAgICBwdWJsaWMgdm9pZCBpbml0KFJlbmRlclNjcmlwdEdMIHJzLCBSZXNvdXJjZXMgcmVzLCBpbnQgd2lkdGgsIGludCBoZWlnaHQpIHsKICAgICAgICAgbVJTID0gcnM7CiAgICAgICAgIG1SZXMgPSByZXM7Ci0gICAgICAgIGluaXRSUygpOworCisgICAgICAgIFByb2dyYW1GcmFnbWVudC5CdWlsZGVyIHBmYiA9IG5ldyBQcm9ncmFtRnJhZ21lbnQuQnVpbGRlcihycyk7CisgICAgICAgIHBmYi5zZXRWYXJ5aW5nQ29sb3IodHJ1ZSk7CisgICAgICAgIHJzLmNvbnRleHRCaW5kUHJvZ3JhbUZyYWdtZW50KHBmYi5jcmVhdGUoKSk7CisKKyAgICAgICAgU2NyaXB0RmllbGRfUG9pbnQgcG9pbnRzID0gbmV3IFNjcmlwdEZpZWxkX1BvaW50KG1SUywgUEFSVF9DT1VOVCk7CisKKyAgICAgICAgTWVzaC5BbGxvY2F0aW9uQnVpbGRlciBzbWIgPSBuZXcgTWVzaC5BbGxvY2F0aW9uQnVpbGRlcihtUlMpOworICAgICAgICBzbWIuYWRkVmVydGV4QWxsb2NhdGlvbihwb2ludHMuZ2V0QWxsb2NhdGlvbigpKTsKKyAgICAgICAgc21iLmFkZEluZGV4VHlwZShQcmltaXRpdmUuUE9JTlQpOworICAgICAgICBNZXNoIHNtID0gc21iLmNyZWF0ZSgpOworCisgICAgICAgIG1TY3JpcHQgPSBuZXcgU2NyaXB0Q19Gb3VudGFpbihtUlMsIG1SZXMsIFIucmF3LmZvdW50YWluLCB0cnVlKTsKKyAgICAgICAgbVNjcmlwdC5zZXRfcGFydE1lc2goc20pOworICAgICAgICBtU2NyaXB0LmJpbmRfcG9pbnQocG9pbnRzKTsKKyAgICAgICAgbVJTLmNvbnRleHRCaW5kUm9vdFNjcmlwdChtU2NyaXB0KTsKICAgICB9CiAKLSAgICBwdWJsaWMgdm9pZCBuZXdUb3VjaFBvc2l0aW9uKGludCB4LCBpbnQgeSwgaW50IHJhdGUpIHsKLSAgICAgICAgaWYgKG1TRC5yYXRlID09IDApIHsKLSAgICAgICAgICAgIG1TRC5yID0gKCh4ICYgMHgxKSAhPSAwKSA/IDAuZiA6IDEuZjsKLSAgICAgICAgICAgIG1TRC5nID0gKCh4ICYgMHgyKSAhPSAwKSA/IDAuZiA6IDEuZjsKLSAgICAgICAgICAgIG1TRC5iID0gKCh4ICYgMHg0KSAhPSAwKSA/IDAuZiA6IDEuZjsKLSAgICAgICAgICAgIGlmICgobVNELnIgKyBtU0QuZyArIG1TRC5iKSA8IDAuOWYpIHsKLSAgICAgICAgICAgICAgICBtU0QuciA9IDAuOGY7Ci0gICAgICAgICAgICAgICAgbVNELmcgPSAwLjVmOwotICAgICAgICAgICAgICAgIG1TRC5iID0gMS5mOwotICAgICAgICAgICAgfQorICAgIGJvb2xlYW4gaG9sZGluZ0NvbG9yW10gPSBuZXcgYm9vbGVhblsxMF07CisgICAgcHVibGljIHZvaWQgbmV3VG91Y2hQb3NpdGlvbihmbG9hdCB4LCBmbG9hdCB5LCBmbG9hdCBwcmVzc3VyZSwgaW50IGlkKSB7CisgICAgICAgIGlmIChpZCA+IGhvbGRpbmdDb2xvci5sZW5ndGgpIHsKKyAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQotICAgICAgICBtU0QucmF0ZSA9IHJhdGU7Ci0gICAgICAgIG1TRC54ID0geDsKLSAgICAgICAgbVNELnkgPSB5OwotICAgICAgICBtSW50QWxsb2MuZGF0YShtU0QpOworICAgICAgICBpbnQgcmF0ZSA9IChpbnQpKHByZXNzdXJlICogcHJlc3N1cmUgKiA1MDAuZik7CisgICAgICAgIGlmKHJhdGUgPiA1MDApIHsKKyAgICAgICAgICAgIHJhdGUgPSA1MDA7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHJhdGUgPiAwKSB7CisgICAgICAgICAgICBtU2NyaXB0Lmludm9rZV9hZGRQYXJ0aWNsZXMocmF0ZSwgeCwgeSwgaWQsICFob2xkaW5nQ29sb3JbaWRdKTsKKyAgICAgICAgICAgIGhvbGRpbmdDb2xvcltpZF0gPSB0cnVlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaG9sZGluZ0NvbG9yW2lkXSA9IGZhbHNlOworICAgICAgICB9CisKICAgICB9Ci0KLQotICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0KLSAgICBwcml2YXRlIFJlc291cmNlcyBtUmVzOwotCi0gICAgcHJpdmF0ZSBSZW5kZXJTY3JpcHRHTCBtUlM7Ci0gICAgcHJpdmF0ZSBBbGxvY2F0aW9uIG1JbnRBbGxvYzsKLSAgICBwcml2YXRlIFNpbXBsZU1lc2ggbVNNOwotICAgIHByaXZhdGUgU29tZURhdGEgbVNEOwotICAgIHByaXZhdGUgVHlwZSBtU0RUeXBlOwotCi0gICAgcHJpdmF0ZSB2b2lkIGluaXRSUygpIHsKLSAgICAgICAgbVNEID0gbmV3IFNvbWVEYXRhKCk7Ci0gICAgICAgIG1TRFR5cGUgPSBUeXBlLmNyZWF0ZUZyb21DbGFzcyhtUlMsIFNvbWVEYXRhLmNsYXNzLCAxLCAiU29tZURhdGEiKTsKLSAgICAgICAgbUludEFsbG9jID0gQWxsb2NhdGlvbi5jcmVhdGVUeXBlZChtUlMsIG1TRFR5cGUpOwotICAgICAgICBtU0QuY291bnQgPSBQQVJUX0NPVU5UOwotICAgICAgICBtSW50QWxsb2MuZGF0YShtU0QpOwotCi0gICAgICAgIEVsZW1lbnQuQnVpbGRlciBlYiA9IG5ldyBFbGVtZW50LkJ1aWxkZXIobVJTKTsKLSAgICAgICAgZWIuYWRkKEVsZW1lbnQuY3JlYXRlVmVjdG9yKG1SUywgRWxlbWVudC5EYXRhVHlwZS5GTE9BVF8zMiwgMiksICJkZWx0YSIpOwotICAgICAgICBlYi5hZGQoRWxlbWVudC5jcmVhdGVBdHRyaWIobVJTLCBFbGVtZW50LkRhdGFUeXBlLkZMT0FUXzMyLCBFbGVtZW50LkRhdGFLaW5kLlBPU0lUSU9OLCAyKSwgInBvc2l0aW9uIik7Ci0gICAgICAgIGViLmFkZChFbGVtZW50LmNyZWF0ZUF0dHJpYihtUlMsIEVsZW1lbnQuRGF0YVR5cGUuVU5TSUdORURfOCwgRWxlbWVudC5EYXRhS2luZC5DT0xPUiwgNCksICJjb2xvciIpOwotICAgICAgICBFbGVtZW50IHByaW1FbGVtZW50ID0gZWIuY3JlYXRlKCk7Ci0KLQotICAgICAgICBTaW1wbGVNZXNoLkJ1aWxkZXIgc21iID0gbmV3IFNpbXBsZU1lc2guQnVpbGRlcihtUlMpOwotICAgICAgICBpbnQgdnR4U2xvdCA9IHNtYi5hZGRWZXJ0ZXhUeXBlKHByaW1FbGVtZW50LCBQQVJUX0NPVU5UKTsKLSAgICAgICAgc21iLnNldFByaW1pdGl2ZShQcmltaXRpdmUuUE9JTlQpOwotICAgICAgICBtU00gPSBzbWIuY3JlYXRlKCk7Ci0gICAgICAgIG1TTS5zZXROYW1lKCJQYXJ0TWVzaCIpOwotCi0gICAgICAgIEFsbG9jYXRpb24gcGFydEFsbG9jID0gbVNNLmNyZWF0ZVZlcnRleEFsbG9jYXRpb24odnR4U2xvdCk7Ci0gICAgICAgIHBhcnRBbGxvYy5zZXROYW1lKCJQYXJ0QnVmZmVyIik7Ci0gICAgICAgIG1TTS5iaW5kVmVydGV4QWxsb2NhdGlvbihwYXJ0QWxsb2MsIDApOwotCi0gICAgICAgIC8vIEFsbCBzZXR1cCBvZiBuYW1lZCBvYmplY3RzIHNob3VsZCBiZSBkb25lIGJ5IHRoaXMgcG9pbnQKLSAgICAgICAgLy8gYmVjYXVzZSB3ZSBhcmUgYWJvdXQgdG8gY29tcGlsZSB0aGUgc2NyaXB0LgotICAgICAgICBTY3JpcHRDLkJ1aWxkZXIgc2IgPSBuZXcgU2NyaXB0Qy5CdWlsZGVyKG1SUyk7Ci0gICAgICAgIHNiLnNldFNjcmlwdChtUmVzLCBSLnJhdy5mb3VudGFpbik7Ci0gICAgICAgIHNiLnNldFJvb3QodHJ1ZSk7Ci0gICAgICAgIHNiLnNldFR5cGUobVNEVHlwZSwgIkNvbnRyb2wiLCAwKTsKLSAgICAgICAgc2Iuc2V0VHlwZShtU00uZ2V0VmVydGV4VHlwZSgwKSwgInBvaW50IiwgMSk7Ci0gICAgICAgIFNjcmlwdCBzY3JpcHQgPSBzYi5jcmVhdGUoKTsKLSAgICAgICAgc2NyaXB0LnNldENsZWFyQ29sb3IoMC4wZiwgMC4wZiwgMC4wZiwgMS4wZik7Ci0KLSAgICAgICAgc2NyaXB0LmJpbmRBbGxvY2F0aW9uKG1JbnRBbGxvYywgMCk7Ci0gICAgICAgIHNjcmlwdC5iaW5kQWxsb2NhdGlvbihwYXJ0QWxsb2MsIDEpOwotICAgICAgICBtUlMuY29udGV4dEJpbmRSb290U2NyaXB0KHNjcmlwdCk7Ci0gICAgfQotCiB9Ci0KLQpkaWZmIC0tZ2l0IGEvbGlicy9ycy9qYXZhL0ZvdW50YWluL3NyYy9jb20vYW5kcm9pZC9mb3VudGFpbi9Gb3VudGFpblZpZXcuamF2YSBiL2xpYnMvcnMvamF2YS9Gb3VudGFpbi9zcmMvY29tL2FuZHJvaWQvZm91bnRhaW4vRm91bnRhaW5WaWV3LmphdmEKaW5kZXggZGZkNmE0OS4uYzE0MTE2NTZiIDEwMDY0NAotLS0gYS9saWJzL3JzL2phdmEvRm91bnRhaW4vc3JjL2NvbS9hbmRyb2lkL2ZvdW50YWluL0ZvdW50YWluVmlldy5qYXZhCisrKyBiL2xpYnMvcnMvamF2YS9Gb3VudGFpbi9zcmMvY29tL2FuZHJvaWQvZm91bnRhaW4vRm91bnRhaW5WaWV3LmphdmEKQEAgLTcxLDE3ICs3MSwzMyBAQAogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBib29sZWFuIG9uVG91Y2hFdmVudChNb3Rpb25FdmVudCBldikKICAgICB7Ci0gICAgICAgIGludCBhY3QgPSBldi5nZXRBY3Rpb24oKTsKKyAgICAgICAgaW50IGFjdCA9IGV2LmdldEFjdGlvbk1hc2tlZCgpOwogICAgICAgICBpZiAoYWN0ID09IGV2LkFDVElPTl9VUCkgewotICAgICAgICAgICAgbVJlbmRlci5uZXdUb3VjaFBvc2l0aW9uKDAsIDAsIDApOworICAgICAgICAgICAgbVJlbmRlci5uZXdUb3VjaFBvc2l0aW9uKDAsIDAsIDAsIGV2LmdldFBvaW50ZXJJZCgwKSk7CiAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0gZWxzZSBpZiAoYWN0ID09IE1vdGlvbkV2ZW50LkFDVElPTl9QT0lOVEVSX1VQKSB7CisgICAgICAgICAgICAvLyBvbmx5IG9uZSBwb2ludGVyIGdvaW5nIHVwLCB3ZSBjYW4gZ2V0IHRoZSBpbmRleCBsaWtlIHRoaXMKKyAgICAgICAgICAgIGludCBwb2ludGVySW5kZXggPSBldi5nZXRBY3Rpb25JbmRleCgpOworICAgICAgICAgICAgaW50IHBvaW50ZXJJZCA9IGV2LmdldFBvaW50ZXJJZChwb2ludGVySW5kZXgpOworICAgICAgICAgICAgbVJlbmRlci5uZXdUb3VjaFBvc2l0aW9uKDAsIDAsIDAsIHBvaW50ZXJJZCk7CiAgICAgICAgIH0KLSAgICAgICAgZmxvYXQgcmF0ZSA9IChldi5nZXRQcmVzc3VyZSgpICogNTAuZik7Ci0gICAgICAgIHJhdGUgKj0gcmF0ZTsKLSAgICAgICAgaWYocmF0ZSA+IDIwMDAuZikgewotICAgICAgICAgICAgcmF0ZSA9IDIwMDAuZjsKKyAgICAgICAgaW50IGNvdW50ID0gZXYuZ2V0SGlzdG9yeVNpemUoKTsKKyAgICAgICAgaW50IHBjb3VudCA9IGV2LmdldFBvaW50ZXJDb3VudCgpOworCisgICAgICAgIGZvciAoaW50IHA9MDsgcCA8IHBjb3VudDsgcCsrKSB7CisgICAgICAgICAgICBpbnQgaWQgPSBldi5nZXRQb2ludGVySWQocCk7CisgICAgICAgICAgICBtUmVuZGVyLm5ld1RvdWNoUG9zaXRpb24oZXYuZ2V0WChwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldi5nZXRZKHApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2LmdldFByZXNzdXJlKHApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkKTsKKworICAgICAgICAgICAgZm9yIChpbnQgaT0wOyBpIDwgY291bnQ7IGkrKykgeworICAgICAgICAgICAgICAgIG1SZW5kZXIubmV3VG91Y2hQb3NpdGlvbihldi5nZXRIaXN0b3JpY2FsWChwLCBpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXYuZ2V0SGlzdG9yaWNhbFkocCwgaSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2LmdldEhpc3RvcmljYWxQcmVzc3VyZShwLCBpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQpOworICAgICAgICAgICAgfQogICAgICAgICB9Ci0gICAgICAgIG1SZW5kZXIubmV3VG91Y2hQb3NpdGlvbigoaW50KWV2LmdldFgoKSwgKGludClldi5nZXRZKCksIChpbnQpcmF0ZSk7CiAgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KIH0KZGlmZiAtLWdpdCBhL2xpYnMvcnMvamF2YS9Gb3VudGFpbi9zcmMvY29tL2FuZHJvaWQvZm91bnRhaW4vZm91bnRhaW4ucnMgYi9saWJzL3JzL2phdmEvRm91bnRhaW4vc3JjL2NvbS9hbmRyb2lkL2ZvdW50YWluL2ZvdW50YWluLnJzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgxMmNiN2EKLS0tIC9kZXYvbnVsbAorKysgYi9saWJzL3JzL2phdmEvRm91bnRhaW4vc3JjL2NvbS9hbmRyb2lkL2ZvdW50YWluL2ZvdW50YWluLnJzCkBAIC0wLDAgKzEsNzIgQEAKKy8vIEZvdW50YWluIHRlc3Qgc2NyaXB0CisjcHJhZ21hIHZlcnNpb24oMSkKKworI3ByYWdtYSBycyBqYXZhX3BhY2thZ2VfbmFtZShjb20uYW5kcm9pZC5mb3VudGFpbikKKworI3ByYWdtYSBzdGF0ZUZyYWdtZW50KHBhcmVudCkKKworI2luY2x1ZGUgInJzX2dyYXBoaWNzLnJzaCIKKworc3RhdGljIGludCBuZXdQYXJ0ID0gMDsKK3JzX21lc2ggcGFydE1lc2g7CisKK3R5cGVkZWYgc3RydWN0IF9fYXR0cmlidXRlX18oKHBhY2tlZCwgYWxpZ25lZCg0KSkpIFBvaW50IHsKKyAgICBmbG9hdDIgZGVsdGE7CisgICAgZmxvYXQyIHBvc2l0aW9uOworICAgIHVjaGFyNCBjb2xvcjsKK30gUG9pbnRfdDsKK1BvaW50X3QgKnBvaW50OworCisjcHJhZ21hIHJzIGV4cG9ydF92YXIocG9pbnQsIHBhcnRNZXNoKQorI3ByYWdtYSBycyBleHBvcnRfZnVuYyhhZGRQYXJ0aWNsZXMpCisKK2ludCByb290KCkgeworICAgIGZsb2F0IGR0ID0gbWluKHJzR2V0RHQoKSwgMC4xZik7CisgICAgcnNnQ2xlYXJDb2xvcigwLmYsIDAuZiwgMC5mLCAxLmYpOworICAgIGNvbnN0IGZsb2F0IGhlaWdodCA9IHJzZ0dldEhlaWdodCgpOworICAgIGNvbnN0IGludCBzaXplID0gcnNBbGxvY2F0aW9uR2V0RGltWChyc0dldEFsbG9jYXRpb24ocG9pbnQpKTsKKyAgICBmbG9hdCBkeTIgPSBkdCAqICgxMC5mKTsKKyAgICBQb2ludF90ICogcCA9IHBvaW50OworICAgIGZvciAoaW50IGN0PTA7IGN0IDwgc2l6ZTsgY3QrKykgeworICAgICAgICBwLT5kZWx0YS55ICs9IGR5MjsKKyAgICAgICAgcC0+cG9zaXRpb24gKz0gcC0+ZGVsdGE7CisgICAgICAgIGlmICgocC0+cG9zaXRpb24ueSA+IGhlaWdodCkgJiYgKHAtPmRlbHRhLnkgPiAwKSkgeworICAgICAgICAgICAgcC0+ZGVsdGEueSAqPSAtMC4zZjsKKyAgICAgICAgfQorICAgICAgICBwKys7CisgICAgfQorCisgICAgcnNnRHJhd01lc2gocGFydE1lc2gpOworICAgIHJldHVybiAxOworfQorCitzdGF0aWMgZmxvYXQ0IHBhcnRDb2xvclsxMF07Cit2b2lkIGFkZFBhcnRpY2xlcyhpbnQgcmF0ZSwgZmxvYXQgeCwgZmxvYXQgeSwgaW50IGluZGV4LCBib29sIG5ld0NvbG9yKQoreworICAgIGlmIChuZXdDb2xvcikgeworICAgICAgICBwYXJ0Q29sb3JbaW5kZXhdLnggPSByc1JhbmQoMC41ZiwgMS4wZik7CisgICAgICAgIHBhcnRDb2xvcltpbmRleF0ueSA9IHJzUmFuZCgxLjBmKTsKKyAgICAgICAgcGFydENvbG9yW2luZGV4XS56ID0gcnNSYW5kKDEuMGYpOworICAgIH0KKyAgICBmbG9hdCByTWF4ID0gKChmbG9hdClyYXRlKSAqIDAuMDJmOworICAgIGludCBzaXplID0gcnNBbGxvY2F0aW9uR2V0RGltWChyc0dldEFsbG9jYXRpb24ocG9pbnQpKTsKKyAgICB1Y2hhcjQgYyA9IHJzUGFja0NvbG9yVG84ODg4KHBhcnRDb2xvcltpbmRleF0pOworCisgICAgUG9pbnRfdCAqIG5wID0gJnBvaW50W25ld1BhcnRdOworICAgIGZsb2F0MiBwID0ge3gsIHl9OworICAgIHdoaWxlIChyYXRlLS0pIHsKKyAgICAgICAgZmxvYXQgYW5nbGUgPSByc1JhbmQoMy4xNGYgKiAyLmYpOworICAgICAgICBmbG9hdCBsZW4gPSByc1JhbmQock1heCk7CisgICAgICAgIG5wLT5kZWx0YS54ID0gbGVuICogc2luKGFuZ2xlKTsKKyAgICAgICAgbnAtPmRlbHRhLnkgPSBsZW4gKiBjb3MoYW5nbGUpOworICAgICAgICBucC0+cG9zaXRpb24gPSBwOworICAgICAgICBucC0+Y29sb3IgPSBjOworICAgICAgICBuZXdQYXJ0Kys7CisgICAgICAgIG5wKys7CisgICAgICAgIGlmIChuZXdQYXJ0ID49IHNpemUpIHsKKyAgICAgICAgICAgIG5ld1BhcnQgPSAwOworICAgICAgICAgICAgbnAgPSAmcG9pbnRbbmV3UGFydF07CisgICAgICAgIH0KKyAgICB9Cit9CisKZGlmZiAtLWdpdCBhL2xpYnMvcnMvamF2YS9JbWFnZVByb2Nlc3NpbmcvQW5kcm9pZC5tayBiL2xpYnMvcnMvamF2YS9JbWFnZVByb2Nlc3NpbmcvQW5kcm9pZC5tawppbmRleCA4MzM0MjdiLi43ZmEzMGQwIDEwMDY0NAotLS0gYS9saWJzL3JzL2phdmEvSW1hZ2VQcm9jZXNzaW5nL0FuZHJvaWQubWsKKysrIGIvbGlicy9ycy9qYXZhL0ltYWdlUHJvY2Vzc2luZy9BbmRyb2lkLm1rCkBAIC0xNCwxNCArMTQsMTkgQEAKICMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAjCiAKK2lmbmVxICgkKFRBUkdFVF9TSU1VTEFUT1IpLHRydWUpCisKIExPQ0FMX1BBVEggOj0gJChjYWxsIG15LWRpcikKIGluY2x1ZGUgJChDTEVBUl9WQVJTKQogCiBMT0NBTF9NT0RVTEVfVEFHUyA6PSBvcHRpb25hbAogCi1MT0NBTF9TUkNfRklMRVMgOj0gJChjYWxsIGFsbC1qYXZhLWZpbGVzLXVuZGVyLCBzcmMpCitMT0NBTF9TUkNfRklMRVMgOj0gJChjYWxsIGFsbC1qYXZhLWZpbGVzLXVuZGVyLCBzcmMpIFwKKyAgICAgICAgICAgICAgICAgICAkKGNhbGwgYWxsLXJlbmRlcnNjcmlwdC1maWxlcy11bmRlciwgc3JjKQogI0xPQ0FMX1NUQVRJQ19KQVZBX0xJQlJBUklFUyA6PSBhbmRyb2lkLnJlbmRlcnNjcmlwdAogCiBMT0NBTF9QQUNLQUdFX05BTUUgOj0gSW1hZ2VQcm9jZXNzaW5nCiAKIGluY2x1ZGUgJChCVUlMRF9QQUNLQUdFKQorCitlbmRpZgpkaWZmIC0tZ2l0IGEvbGlicy9ycy9qYXZhL0ltYWdlUHJvY2Vzc2luZy9BbmRyb2lkTWFuaWZlc3QueG1sIGIvbGlicy9ycy9qYXZhL0ltYWdlUHJvY2Vzc2luZy9BbmRyb2lkTWFuaWZlc3QueG1sCmluZGV4IGI0OGQyMDguLmQ2YTJkYjQgMTAwNjQ0Ci0tLSBhL2xpYnMvcnMvamF2YS9JbWFnZVByb2Nlc3NpbmcvQW5kcm9pZE1hbmlmZXN0LnhtbAorKysgYi9saWJzL3JzL2phdmEvSW1hZ2VQcm9jZXNzaW5nL0FuZHJvaWRNYW5pZmVzdC54bWwKQEAgLTYsNyArNiw4IEBACiAgICAgPHVzZXMtcGVybWlzc2lvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQucGVybWlzc2lvbi5XUklURV9FWFRFUk5BTF9TVE9SQUdFIiAvPgogCiAgICAgPGFwcGxpY2F0aW9uIGFuZHJvaWQ6bGFiZWw9IkltYWdlIFByb2Nlc3NpbmciPgotICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSJJbWFnZVByb2Nlc3NpbmdBY3Rpdml0eSI+CisgICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9IkltYWdlUHJvY2Vzc2luZ0FjdGl2aXR5IgorICAgICAgICAgICAgICAgICAgYW5kcm9pZDpzY3JlZW5PcmllbnRhdGlvbj0icG9ydHJhaXQiPgogICAgICAgICAgICAgPGludGVudC1maWx0ZXI+CiAgICAgICAgICAgICAgICAgPGFjdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmFjdGlvbi5NQUlOIiAvPgogICAgICAgICAgICAgICAgIDxjYXRlZ29yeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmNhdGVnb3J5LkxBVU5DSEVSIiAvPgpkaWZmIC0tZ2l0IGEvbGlicy9ycy9qYXZhL0ltYWdlUHJvY2Vzc2luZy9yZXMvZHJhd2FibGUvZGF0YS5qcGcgYi9saWJzL3JzL2phdmEvSW1hZ2VQcm9jZXNzaW5nL3Jlcy9kcmF3YWJsZS9kYXRhLmpwZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MWE4N2IxCi0tLSAvZGV2L251bGwKKysrIGIvbGlicy9ycy9qYXZhL0ltYWdlUHJvY2Vzc2luZy9yZXMvZHJhd2FibGUvZGF0YS5qcGcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGlicy9ycy9qYXZhL0ltYWdlUHJvY2Vzc2luZy9yZXMvbGF5b3V0L21haW4ueG1sIGIvbGlicy9ycy9qYXZhL0ltYWdlUHJvY2Vzc2luZy9yZXMvbGF5b3V0L21haW4ueG1sCmluZGV4IDY3NzBjMTguLmM2ZWM3MjkgMTAwNjQ0Ci0tLSBhL2xpYnMvcnMvamF2YS9JbWFnZVByb2Nlc3NpbmcvcmVzL2xheW91dC9tYWluLnhtbAorKysgYi9saWJzL3JzL2phdmEvSW1hZ2VQcm9jZXNzaW5nL3Jlcy9sYXlvdXQvbWFpbi54bWwKQEAgLTI1LDkgKzI1LDE0NyBAQAogICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL2Rpc3BsYXkiCiAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSIzMjBkaXAiCiAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iMjY2ZGlwIiAvPgotICAgIAorCisgICAgPEJ1dHRvbgorICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5Cb3R0b209IjE3MGRpcCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSI0MGRpcCIKKyAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL2JlbmNobWFyayIKKyAgICAgICAgYW5kcm9pZDpvbkNsaWNrPSJiZW5jaG1hcmsiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2dyYXZpdHk9ImJvdHRvbSIvPgorCisgICAgPFRleHRWaWV3CisgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvYmVuY2htYXJrVGV4dCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6dGV4dFNpemU9IjE4c3AiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpbkxlZnQ9IjEwMGRpcCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luQm90dG9tPSIxNzVkaXAiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2dyYXZpdHk9ImJvdHRvbSIKKyAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL3NhdHVyYXRpb24iLz4KKworICAgICA8U2Vla0JhcgorICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL2luU2F0dXJhdGlvbiIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luQm90dG9tPSIxNDBkaXAiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpbkxlZnQ9IjEwZGlwIgorICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5SaWdodD0iMTBkaXAiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9ncmF2aXR5PSJib3R0b20iIC8+CisKKyAgICA8VGV4dFZpZXcKKyAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9pblNhdHVyYXRpb25UZXh0IgorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgYW5kcm9pZDp0ZXh0U2l6ZT0iMThzcCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luTGVmdD0iNTBkaXAiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpbkJvdHRvbT0iMTQyZGlwIgorICAgICAgICBhbmRyb2lkOnRleHRDb2xvcj0iIzAwMCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfZ3Jhdml0eT0iYm90dG9tIgorICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvc2F0dXJhdGlvbiIvPgorCiAgICAgPFNlZWtCYXIKLSAgICAgICAgYW5kcm9pZDppZD0iQCtpZC90aHJlc2hvbGQiCisgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvaW5HYW1tYSIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luQm90dG9tPSIxMTBkaXAiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpbkxlZnQ9IjEwZGlwIgorICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5SaWdodD0iMTBkaXAiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9ncmF2aXR5PSJib3R0b20iIC8+CisKKyAgICA8VGV4dFZpZXcKKyAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9pbkdhbW1hVGV4dCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6dGV4dFNpemU9IjE4c3AiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpbkxlZnQ9IjUwZGlwIgorICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5Cb3R0b209IjExMmRpcCIKKyAgICAgICAgYW5kcm9pZDp0ZXh0Q29sb3I9IiMwMDAiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2dyYXZpdHk9ImJvdHRvbSIKKyAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL2dhbW1hIi8+CisKKyAgICA8U2Vla0JhcgorICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL291dFdoaXRlIgorICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5Cb3R0b209IjgwZGlwIgorICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5MZWZ0PSIxNzBkaXAiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpblJpZ2h0PSIxMGRpcCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2dyYXZpdHk9ImJvdHRvbSIgLz4KKworICAgIDxUZXh0VmlldworICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL291dFdoaXRlVGV4dCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6dGV4dFNpemU9IjE4c3AiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpbkxlZnQ9IjIyMGRpcCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luQm90dG9tPSI4MmRpcCIKKyAgICAgICAgYW5kcm9pZDp0ZXh0Q29sb3I9IiMwMDAiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2dyYXZpdHk9ImJvdHRvbSIKKyAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL291dF93aGl0ZSIvPgorCisgICAgPFNlZWtCYXIKKyAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9pbldoaXRlIgorICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5Cb3R0b209IjgwZGlwIgorICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5MZWZ0PSIxMGRpcCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luUmlnaHQ9IjE3MGRpcCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2dyYXZpdHk9ImJvdHRvbSIgLz4KKworICAgIDxUZXh0VmlldworICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL2luV2hpdGVUZXh0IgorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgYW5kcm9pZDp0ZXh0U2l6ZT0iMThzcCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luTGVmdD0iNTBkaXAiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpbkJvdHRvbT0iODJkaXAiCisgICAgICAgIGFuZHJvaWQ6dGV4dENvbG9yPSIjMDAwIgorICAgICAgICBhbmRyb2lkOmxheW91dF9ncmF2aXR5PSJib3R0b20iCisgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy9pbl93aGl0ZSIvPgorCisgICAgPFNlZWtCYXIKKyAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9vdXRCbGFjayIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luQm90dG9tPSI1MGRpcCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luTGVmdD0iMTcwZGlwIgorICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5SaWdodD0iMTBkaXAiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9ncmF2aXR5PSJib3R0b20iIC8+CisKKyAgICA8VGV4dFZpZXcKKyAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9vdXRCbGFja1RleHQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICBhbmRyb2lkOnRleHRTaXplPSIxOHNwIgorICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5MZWZ0PSIyMjBkaXAiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpbkJvdHRvbT0iNTJkaXAiCisgICAgICAgIGFuZHJvaWQ6dGV4dENvbG9yPSIjMDAwIgorICAgICAgICBhbmRyb2lkOmxheW91dF9ncmF2aXR5PSJib3R0b20iCisgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy9vdXRfYmxhY2siLz4KKworICAgIDxTZWVrQmFyCisgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvaW5CbGFjayIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luQm90dG9tPSI1MGRpcCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luTGVmdD0iMTBkaXAiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpblJpZ2h0PSIxNzBkaXAiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9ncmF2aXR5PSJib3R0b20iIC8+CisKKyAgICA8VGV4dFZpZXcKKyAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9pbkJsYWNrVGV4dCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6dGV4dFNpemU9IjE4c3AiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpbkxlZnQ9IjUwZGlwIgorICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5Cb3R0b209IjUyZGlwIgorICAgICAgICBhbmRyb2lkOnRleHRDb2xvcj0iIzAwMCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfZ3Jhdml0eT0iYm90dG9tIgorICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvaW5fYmxhY2siLz4KKworICAgIDxTZWVrQmFyCisgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvcmFkaXVzIgogICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5Cb3R0b209IjEwZGlwIgogICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5MZWZ0PSIxMGRpcCIKICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luUmlnaHQ9IjEwZGlwIgpAQCAtMzUsNCArMTczLDE1IEBACiAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgogICAgICAgICBhbmRyb2lkOmxheW91dF9ncmF2aXR5PSJib3R0b20iIC8+CiAKKyAgICAgPFRleHRWaWV3CisgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvYmx1clRleHQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICBhbmRyb2lkOnRleHRTaXplPSIxOHNwIgorICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5MZWZ0PSI1MGRpcCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luQm90dG9tPSIxMmRpcCIKKyAgICAgICAgYW5kcm9pZDp0ZXh0Q29sb3I9IiMwMDAiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2dyYXZpdHk9ImJvdHRvbSIKKyAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL2JsdXJfZGVzY3JpcHRpb24iLz4KKwogPC9tZXJnZT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWJzL3JzL2phdmEvSW1hZ2VQcm9jZXNzaW5nL3Jlcy9yYXcvdGhyZXNob2xkLnJzIGIvbGlicy9ycy9qYXZhL0ltYWdlUHJvY2Vzc2luZy9yZXMvcmF3L3RocmVzaG9sZC5ycwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODg4ZjBjZC4uMDAwMDAwMAotLS0gYS9saWJzL3JzL2phdmEvSW1hZ2VQcm9jZXNzaW5nL3Jlcy9yYXcvdGhyZXNob2xkLnJzCisrKyAvZGV2L251bGwKQEAgLTEsNjIgKzAsMCBAQAotLyoKLS8vIGJsb2NrIG9mIGRlZmluZXMgbWF0Y2hpbmcgd2hhdCBSUyB3aWxsIGluc2VydCBhdCBydW50aW1lLgotc3RydWN0IFBhcmFtc19zewotICAgIGludCBpbkhlaWdodDsKLSAgICBpbnQgaW5XaWR0aDsKLSAgICBpbnQgb3V0SGVpZ2h0OwotICAgIGludCBvdXRXaWR0aDsKLSAgICBmbG9hdCB0aHJlc2hvbGQ7Ci19Owotc3RydWN0IFBhcmFtc19zICogUGFyYW1zOwotc3RydWN0IEluUGl4ZWxfc3sKLSAgICBjaGFyIGE7Ci0gICAgY2hhciBiOwotICAgIGNoYXIgZzsKLSAgICBjaGFyIHI7Ci19Owotc3RydWN0IEluUGl4ZWxfcyAqIEluUGl4ZWw7Ci1zdHJ1Y3QgT3V0UGl4ZWxfc3sKLSAgICBjaGFyIGE7Ci0gICAgY2hhciBiOwotICAgIGNoYXIgZzsKLSAgICBjaGFyIHI7Ci19Owotc3RydWN0IE91dFBpeGVsX3MgKiBPdXRQaXhlbDsKLSovCi0KLXN0cnVjdCBjb2xvcl9zIHsKLSAgICBjaGFyIGI7Ci0gICAgY2hhciBnOwotICAgIGNoYXIgcjsKLSAgICBjaGFyIGE7Ci19OwotCi12b2lkIG1haW4oKSB7Ci0gICAgaW50IHQgPSB1cHRpbWVNaWxsaXMoKTsKLQotICAgIHN0cnVjdCBjb2xvcl9zICppbiA9IChzdHJ1Y3QgY29sb3JfcyAqKSBJblBpeGVsOwotICAgIHN0cnVjdCBjb2xvcl9zICpvdXQgPSAoc3RydWN0IGNvbG9yX3MgKikgT3V0UGl4ZWw7Ci0KLSAgICBpbnQgY291bnQgPSBQYXJhbXMtPmluV2lkdGggKiBQYXJhbXMtPmluSGVpZ2h0OwotICAgIGludCBpOwotICAgIGZsb2F0IHRocmVzaG9sZCA9IChQYXJhbXMtPnRocmVzaG9sZCAqIDI1NS5mKTsKLQotICAgIGZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7Ci0gICAgICAgIGZsb2F0IGx1bWluYW5jZSA9IDAuMjEyNWYgKiBpbi0+ciArCi0gICAgICAgICAgICAgICAgICAgICAgICAgIDAuNzE1NGYgKiBpbi0+ZyArCi0gICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDcyMWYgKiBpbi0+YjsKLSAgICAgICAgaWYgKGx1bWluYW5jZSA+IHRocmVzaG9sZCkgewotICAgICAgICAgICAgKm91dCA9ICppbjsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICooKGludCAqKW91dCkgPSAqKChpbnQgKilpbikgJiAweGZmMDAwMDAwOwotICAgICAgICB9Ci0KLSAgICAgICAgaW4rKzsKLSAgICAgICAgb3V0Kys7Ci0gICAgfQotCi0gICAgdD0gdXB0aW1lTWlsbGlzKCkgLSB0OwotICAgIGRlYnVnSTMyKCJGaWx0ZXIgdGltZSIsIHQpOwotCi0gICAgc2VuZFRvQ2xpZW50KCZjb3VudCwgMSwgNCwgMCk7Ci19CmRpZmYgLS1naXQgYS9saWJzL3JzL2phdmEvSW1hZ2VQcm9jZXNzaW5nL3Jlcy92YWx1ZXMvc3RyaW5ncy54bWwgYi9saWJzL3JzL2phdmEvSW1hZ2VQcm9jZXNzaW5nL3Jlcy92YWx1ZXMvc3RyaW5ncy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2M1Y2M0ZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYnMvcnMvamF2YS9JbWFnZVByb2Nlc3NpbmcvcmVzL3ZhbHVlcy9zdHJpbmdzLnhtbApAQCAtMCwwICsxLDMzIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLQorLyoKKyogQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoKKyogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqCisqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqCisqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworLS0+CisKKzxyZXNvdXJjZXMgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgorICAgIDwhLS0gR2VuZXJhbCAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS1zbGlkZXIgbGFiZWwgLS0+CisgICAgPHN0cmluZyBuYW1lPSJibHVyX2Rlc2NyaXB0aW9uIj5CbHVyIFJhZGl1czwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iaW5fd2hpdGUiPkluIFdoaXRlPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJvdXRfd2hpdGUiPk91dCBXaGl0ZTwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iaW5fYmxhY2siPkluIEJsYWNrPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJvdXRfYmxhY2siPk91dCBCbGFjazwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZ2FtbWEiPkdhbW1hPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJzYXR1cmF0aW9uIj5TYXR1cmF0aW9uPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJiZW5jaG1hcmsiPkJlbmNobWFyazwvc3RyaW5nPgorCis8L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL2xpYnMvcnMvamF2YS9JbWFnZVByb2Nlc3Npbmcvc3JjL2NvbS9hbmRyb2lkL3JzL2ltYWdlL0ltYWdlUHJvY2Vzc2luZ0FjdGl2aXR5LmphdmEgYi9saWJzL3JzL2phdmEvSW1hZ2VQcm9jZXNzaW5nL3NyYy9jb20vYW5kcm9pZC9ycy9pbWFnZS9JbWFnZVByb2Nlc3NpbmdBY3Rpdml0eS5qYXZhCmluZGV4IDljZTUzZDguLjc1YjhkMzMgMTAwNjQ0Ci0tLSBhL2xpYnMvcnMvamF2YS9JbWFnZVByb2Nlc3Npbmcvc3JjL2NvbS9hbmRyb2lkL3JzL2ltYWdlL0ltYWdlUHJvY2Vzc2luZ0FjdGl2aXR5LmphdmEKKysrIGIvbGlicy9ycy9qYXZhL0ltYWdlUHJvY2Vzc2luZy9zcmMvY29tL2FuZHJvaWQvcnMvaW1hZ2UvSW1hZ2VQcm9jZXNzaW5nQWN0aXZpdHkuamF2YQpAQCAtMzEsNTMgKzMxLDU2IEBACiBpbXBvcnQgYW5kcm9pZC52aWV3LlN1cmZhY2VIb2xkZXI7CiBpbXBvcnQgYW5kcm9pZC53aWRnZXQuSW1hZ2VWaWV3OwogaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlNlZWtCYXI7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuVGV4dFZpZXc7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CiBpbXBvcnQgamF2YS5sYW5nLk1hdGg7CiAKLXB1YmxpYyBjbGFzcyBJbWFnZVByb2Nlc3NpbmdBY3Rpdml0eSBleHRlbmRzIEFjdGl2aXR5IGltcGxlbWVudHMgU3VyZmFjZUhvbGRlci5DYWxsYmFjayB7Ci0gICAgcHJpdmF0ZSBCaXRtYXAgbUJpdG1hcDsKLSAgICBwcml2YXRlIFBhcmFtcyBtUGFyYW1zOwotICAgIHByaXZhdGUgU2NyaXB0Lkludm9rYWJsZSBtSW52b2thYmxlOwotICAgIHByaXZhdGUgaW50W10gbUluRGF0YTsKLSAgICBwcml2YXRlIGludFtdIG1PdXREYXRhOworcHVibGljIGNsYXNzIEltYWdlUHJvY2Vzc2luZ0FjdGl2aXR5IGV4dGVuZHMgQWN0aXZpdHkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltcGxlbWVudHMgU3VyZmFjZUhvbGRlci5DYWxsYmFjaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlZWtCYXIuT25TZWVrQmFyQ2hhbmdlTGlzdGVuZXIgeworICAgIHByaXZhdGUgQml0bWFwIG1CaXRtYXBJbjsKKyAgICBwcml2YXRlIEJpdG1hcCBtQml0bWFwT3V0OworICAgIHByaXZhdGUgQml0bWFwIG1CaXRtYXBTY3JhdGNoOworICAgIHByaXZhdGUgU2NyaXB0Q19UaHJlc2hvbGQgbVNjcmlwdDsKKyAgICBwcml2YXRlIFNjcmlwdENfVmVydGljYWxCbHVyIG1TY3JpcHRWQmx1cjsKKyAgICBwcml2YXRlIFNjcmlwdENfSG9yaXpvbnRhbEJsdXIgbVNjcmlwdEhCbHVyOworICAgIHByaXZhdGUgaW50IG1SYWRpdXMgPSAwOworICAgIHByaXZhdGUgU2Vla0JhciBtUmFkaXVzU2Vla0JhcjsKKworICAgIHByaXZhdGUgZmxvYXQgbUluQmxhY2sgPSAwLjBmOworICAgIHByaXZhdGUgU2Vla0JhciBtSW5CbGFja1NlZWtCYXI7CisgICAgcHJpdmF0ZSBmbG9hdCBtT3V0QmxhY2sgPSAwLjBmOworICAgIHByaXZhdGUgU2Vla0JhciBtT3V0QmxhY2tTZWVrQmFyOworICAgIHByaXZhdGUgZmxvYXQgbUluV2hpdGUgPSAyNTUuMGY7CisgICAgcHJpdmF0ZSBTZWVrQmFyIG1JbldoaXRlU2Vla0JhcjsKKyAgICBwcml2YXRlIGZsb2F0IG1PdXRXaGl0ZSA9IDI1NS4wZjsKKyAgICBwcml2YXRlIFNlZWtCYXIgbU91dFdoaXRlU2Vla0JhcjsKKyAgICBwcml2YXRlIGZsb2F0IG1HYW1tYSA9IDEuMGY7CisgICAgcHJpdmF0ZSBTZWVrQmFyIG1HYW1tYVNlZWtCYXI7CisKKyAgICBwcml2YXRlIGZsb2F0IG1TYXR1cmF0aW9uID0gMS4wZjsKKyAgICBwcml2YXRlIFNlZWtCYXIgbVNhdHVyYXRpb25TZWVrQmFyOworCisgICAgcHJpdmF0ZSBUZXh0VmlldyBtQmVuY2htYXJrUmVzdWx0OwogCiAgICAgQFN1cHByZXNzV2FybmluZ3MoeyJGaWVsZENhbkJlTG9jYWwifSkKICAgICBwcml2YXRlIFJlbmRlclNjcmlwdCBtUlM7CiAgICAgQFN1cHByZXNzV2FybmluZ3MoeyJGaWVsZENhbkJlTG9jYWwifSkKLSAgICBwcml2YXRlIFR5cGUgbVBhcmFtc1R5cGU7Ci0gICAgQFN1cHByZXNzV2FybmluZ3MoeyJGaWVsZENhbkJlTG9jYWwifSkKLSAgICBwcml2YXRlIEFsbG9jYXRpb24gbVBhcmFtc0FsbG9jYXRpb247Ci0gICAgQFN1cHByZXNzV2FybmluZ3MoeyJGaWVsZENhbkJlTG9jYWwifSkKICAgICBwcml2YXRlIFR5cGUgbVBpeGVsVHlwZTsKICAgICBAU3VwcHJlc3NXYXJuaW5ncyh7IkZpZWxkQ2FuQmVMb2NhbCJ9KQogICAgIHByaXZhdGUgQWxsb2NhdGlvbiBtSW5QaXhlbHNBbGxvY2F0aW9uOwogICAgIEBTdXBwcmVzc1dhcm5pbmdzKHsiRmllbGRDYW5CZUxvY2FsIn0pCiAgICAgcHJpdmF0ZSBBbGxvY2F0aW9uIG1PdXRQaXhlbHNBbGxvY2F0aW9uOworICAgIEBTdXBwcmVzc1dhcm5pbmdzKHsiRmllbGRDYW5CZUxvY2FsIn0pCisgICAgcHJpdmF0ZSBBbGxvY2F0aW9uIG1TY3JhdGNoUGl4ZWxzQWxsb2NhdGlvbjE7CisgICAgcHJpdmF0ZSBBbGxvY2F0aW9uIG1TY3JhdGNoUGl4ZWxzQWxsb2NhdGlvbjI7CiAKICAgICBwcml2YXRlIFN1cmZhY2VWaWV3IG1TdXJmYWNlVmlldzsKICAgICBwcml2YXRlIEltYWdlVmlldyBtRGlzcGxheVZpZXc7CiAKLSAgICBzdGF0aWMgY2xhc3MgUGFyYW1zIHsKLSAgICAgICAgcHVibGljIGludCBpbldpZHRoOwotICAgICAgICBwdWJsaWMgaW50IG91dFdpZHRoOwotICAgICAgICBwdWJsaWMgaW50IGluSGVpZ2h0OwotICAgICAgICBwdWJsaWMgaW50IG91dEhlaWdodDsKLQotICAgICAgICBwdWJsaWMgZmxvYXQgdGhyZXNob2xkOwotICAgIH0KLQotICAgIHN0YXRpYyBjbGFzcyBQaXhlbCB7Ci0gICAgICAgIHB1YmxpYyBieXRlIGE7Ci0gICAgICAgIHB1YmxpYyBieXRlIHI7Ci0gICAgICAgIHB1YmxpYyBieXRlIGc7Ci0gICAgICAgIHB1YmxpYyBieXRlIGI7Ci0gICAgfQotCiAgICAgY2xhc3MgRmlsdGVyQ2FsbGJhY2sgZXh0ZW5kcyBSZW5kZXJTY3JpcHQuUlNNZXNzYWdlIHsKICAgICAgICAgcHJpdmF0ZSBSdW5uYWJsZSBtQWN0aW9uID0gbmV3IFJ1bm5hYmxlKCkgewogICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgewotICAgICAgICAgICAgICAgIG1PdXRQaXhlbHNBbGxvY2F0aW9uLnJlYWREYXRhKG1PdXREYXRhKTsKLSAgICAgICAgICAgICAgICBtQml0bWFwLnNldFBpeGVscyhtT3V0RGF0YSwgMCwgbVBhcmFtcy5vdXRXaWR0aCwgMCwgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgIG1QYXJhbXMub3V0V2lkdGgsIG1QYXJhbXMub3V0SGVpZ2h0KTsKICAgICAgICAgICAgICAgICBtRGlzcGxheVZpZXcuaW52YWxpZGF0ZSgpOwogICAgICAgICAgICAgfQogICAgICAgICB9OwpAQCAtODksMjkgKzkyLDIxOCBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgcHJpdmF0ZSB2b2lkIGphdmFGaWx0ZXIoKSB7CisgICAgaW50IGluW107CisgICAgaW50IGludGVybVtdOworICAgIGludCBvdXRbXTsKKyAgICBpbnQgTUFYX1JBRElVUyA9IDI1OworICAgIC8vIFN0b3JlIG91ciBjb2VmZmljaWVudHMgaGVyZQorICAgIGZsb2F0IGdhdXNzaWFuW107CisKKyAgICBwcml2YXRlIGxvbmcgamF2YUZpbHRlcigpIHsKKyAgICAgICAgZmluYWwgaW50IHdpZHRoID0gbUJpdG1hcEluLmdldFdpZHRoKCk7CisgICAgICAgIGZpbmFsIGludCBoZWlnaHQgPSBtQml0bWFwSW4uZ2V0SGVpZ2h0KCk7CisgICAgICAgIGZpbmFsIGludCBjb3VudCA9IHdpZHRoICogaGVpZ2h0OworCisgICAgICAgIGlmIChpbiA9PSBudWxsKSB7CisgICAgICAgICAgICBpbiA9IG5ldyBpbnRbY291bnRdOworICAgICAgICAgICAgaW50ZXJtID0gbmV3IGludFtjb3VudF07CisgICAgICAgICAgICBvdXQgPSBuZXcgaW50W2NvdW50XTsKKyAgICAgICAgICAgIGdhdXNzaWFuID0gbmV3IGZsb2F0W01BWF9SQURJVVMgKiAyICsgMV07CisgICAgICAgICAgICBtQml0bWFwSW4uZ2V0UGl4ZWxzKGluLCAwLCB3aWR0aCwgMCwgMCwgd2lkdGgsIGhlaWdodCk7CisgICAgICAgIH0KKwogICAgICAgICBsb25nIHQgPSBqYXZhLmxhbmcuU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0gICAgICAgIGludCBjb3VudCA9IG1QYXJhbXMuaW5XaWR0aCAqIG1QYXJhbXMuaW5IZWlnaHQ7Ci0gICAgICAgIGZsb2F0IHRocmVzaG9sZCA9IG1QYXJhbXMudGhyZXNob2xkICogMjU1LmY7CiAKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7Ci0gICAgICAgICAgICBmaW5hbCBmbG9hdCByID0gKGZsb2F0KSgobUluRGF0YVtpXSA+PiAwKSAmIDB4ZmYpOwotICAgICAgICAgICAgZmluYWwgZmxvYXQgZyA9IChmbG9hdCkoKG1JbkRhdGFbaV0gPj4gOCkgJiAweGZmKTsKLSAgICAgICAgICAgIGZpbmFsIGZsb2F0IGIgPSAoZmxvYXQpKChtSW5EYXRhW2ldID4+IDE2KSAmIDB4ZmYpOworICAgICAgICBpbnQgdywgaCwgcjsKIAotICAgICAgICAgICAgZmluYWwgZmxvYXQgbHVtaW5hbmNlID0gMC4yMTI1ZiAqIHIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC43MTU0ZiAqIGcgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wNzIxZiAqIGI7Ci0gICAgICAgICAgICBpZiAobHVtaW5hbmNlID4gdGhyZXNob2xkKSB7Ci0gICAgICAgICAgICAgICAgbU91dERhdGFbaV0gPSBtSW5EYXRhW2ldOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBtT3V0RGF0YVtpXSA9IG1JbkRhdGFbaV0gJiAweGZmMDAwMDAwOworICAgICAgICBmbG9hdCBmUmFkaXVzID0gKGZsb2F0KW1SYWRpdXM7CisgICAgICAgIGludCByYWRpdXMgPSAoaW50KW1SYWRpdXM7CisKKyAgICAgICAgLy8gQ29tcHV0ZSBnYXVzc2lhbiB3ZWlnaHRzIGZvciB0aGUgYmx1cgorICAgICAgICAvLyBlIGlzIHRoZSBldWxlcidzIG51bWJlcgorICAgICAgICBmbG9hdCBlID0gMi43MTgyODE4Mjg0NTkwNDVmOworICAgICAgICBmbG9hdCBwaSA9IDMuMTQxNTkyNjUzNTg5NzkzMmY7CisgICAgICAgIC8vIGcoeCkgPSAoIDEgLyBzcXJ0KCAyICogcGkgKSAqIHNpZ21hKSAqIGUgXiAoIC14XjIgLyAyICogc2lnbWFeMiApCisgICAgICAgIC8vIHggaXMgb2YgdGhlIGZvcm0gWy1yYWRpdXMgLi4gMCAuLiByYWRpdXNdCisgICAgICAgIC8vIGFuZCBzaWdtYSB2YXJpZXMgd2l0aCByYWRpdXMuCisgICAgICAgIC8vIEJhc2VkIG9uIHNvbWUgZXhwZXJpbWVudGFsIHJhZGl1cyB2YWx1ZXMgYW5kIHNpZ21hJ3MKKyAgICAgICAgLy8gd2UgYXBwcm94aW1hdGVseSBmaXQgc2lnbWEgPSBmKHJhZGl1cykgYXMKKyAgICAgICAgLy8gc2lnbWEgPSByYWRpdXMgKiAwLjQgICsgMC42CisgICAgICAgIC8vIFRoZSBsYXJnZXIgdGhlIHJhZGl1cyBnZXRzLCB0aGUgbW9yZSBvdXIgZ2F1c3NpYW4gYmx1cgorICAgICAgICAvLyB3aWxsIHJlc2VtYmxlIGEgYm94IGJsdXIgc2luY2Ugd2l0aCBsYXJnZSBzaWdtYQorICAgICAgICAvLyB0aGUgZ2F1c3NpYW4gY3VydmUgYmVnaW5zIHRvIGxvc2UgaXRzIHNoYXBlCisgICAgICAgIGZsb2F0IHNpZ21hID0gMC40ZiAqIGZSYWRpdXMgKyAwLjZmOworICAgICAgICAvLyBOb3cgY29tcHV0ZSB0aGUgY29lZmZpY2ludHMKKyAgICAgICAgLy8gV2Ugd2lsbCBzdG9yZSBzb21lIHJlZHVuZGFudCB2YWx1ZXMgdG8gc2F2ZSBzb21lIG1hdGggZHVyaW5nCisgICAgICAgIC8vIHRoZSBibHVyIGNhbGN1bGF0aW9ucworICAgICAgICAvLyBwcmVjb21wdXRlIHNvbWUgdmFsdWVzCisgICAgICAgIGZsb2F0IGNvZWZmMSA9IDEuMGYgLyAoZmxvYXQpKE1hdGguc3FydCggMi4wZiAqIHBpICkgKiBzaWdtYSk7CisgICAgICAgIGZsb2F0IGNvZWZmMiA9IC0gMS4wZiAvICgyLjBmICogc2lnbWEgKiBzaWdtYSk7CisgICAgICAgIGZsb2F0IG5vcm1hbGl6ZUZhY3RvciA9IDAuMGY7CisgICAgICAgIGZsb2F0IGZsb2F0UiA9IDAuMGY7CisgICAgICAgIGZvcihyID0gLXJhZGl1czsgciA8PSByYWRpdXM7IHIgKyspIHsKKyAgICAgICAgICAgIGZsb2F0UiA9IChmbG9hdClyOworICAgICAgICAgICAgZ2F1c3NpYW5bciArIHJhZGl1c10gPSBjb2VmZjEgKiAoZmxvYXQpTWF0aC5wb3coZSwgZmxvYXRSICogZmxvYXRSICogY29lZmYyKTsKKyAgICAgICAgICAgIG5vcm1hbGl6ZUZhY3RvciArPSBnYXVzc2lhbltyICsgcmFkaXVzXTsKKyAgICAgICAgfQorCisgICAgICAgIC8vTm93IHdlIG5lZWQgdG8gbm9ybWFsaXplIHRoZSB3ZWlnaHRzIGJlY2F1c2UgYWxsIG91ciBjb2VmZmljaWVudHMgbmVlZCB0byBhZGQgdXAgdG8gb25lCisgICAgICAgIG5vcm1hbGl6ZUZhY3RvciA9IDEuMGYgLyBub3JtYWxpemVGYWN0b3I7CisgICAgICAgIGZvcihyID0gLXJhZGl1czsgciA8PSByYWRpdXM7IHIgKyspIHsKKyAgICAgICAgICAgIGZsb2F0UiA9IChmbG9hdClyOworICAgICAgICAgICAgZ2F1c3NpYW5bciArIHJhZGl1c10gKj0gbm9ybWFsaXplRmFjdG9yOworICAgICAgICB9CisKKyAgICAgICAgZmxvYXQgYmx1cnJlZFBpeGVsUiA9IDAuMGY7CisgICAgICAgIGZsb2F0IGJsdXJyZWRQaXhlbEcgPSAwLjBmOworICAgICAgICBmbG9hdCBibHVycmVkUGl4ZWxCID0gMC4wZjsKKyAgICAgICAgZmxvYXQgYmx1cnJlZFBpeGVsQSA9IDAuMGY7CisKKyAgICAgICAgZm9yKGggPSAwOyBoIDwgaGVpZ2h0OyBoICsrKSB7CisgICAgICAgICAgICBmb3IodyA9IDA7IHcgPCB3aWR0aDsgdyArKykgeworCisgICAgICAgICAgICAgICAgYmx1cnJlZFBpeGVsUiA9IDAuMGY7CisgICAgICAgICAgICAgICAgYmx1cnJlZFBpeGVsRyA9IDAuMGY7CisgICAgICAgICAgICAgICAgYmx1cnJlZFBpeGVsQiA9IDAuMGY7CisgICAgICAgICAgICAgICAgYmx1cnJlZFBpeGVsQSA9IDAuMGY7CisKKyAgICAgICAgICAgICAgICBmb3IociA9IC1yYWRpdXM7IHIgPD0gcmFkaXVzOyByICsrKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIFN0ZXBwaW5nIGxlZnQgYW5kIHJpZ2h0IGF3YXkgZnJvbSB0aGUgcGl4ZWwKKyAgICAgICAgICAgICAgICAgICAgaW50IHZhbGlkVyA9IHcgKyByOworICAgICAgICAgICAgICAgICAgICAvLyBDbGFtcCB0byB6ZXJvIGFuZCB3aWR0aCBtYXgoKSBpc24ndCBleHBvc2VkIGZvciBpbnRzIHlldAorICAgICAgICAgICAgICAgICAgICBpZih2YWxpZFcgPCAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB2YWxpZFcgPSAwOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmKHZhbGlkVyA+IHdpZHRoIC0gMSkgeworICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWRXID0gd2lkdGggLSAxOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgaW50IGlucHV0ID0gaW5baCp3aWR0aCArIHZhbGlkV107CisKKyAgICAgICAgICAgICAgICAgICAgaW50IFIgPSAoKGlucHV0ID4+IDI0KSAmIDB4ZmYpOworICAgICAgICAgICAgICAgICAgICBpbnQgRyA9ICgoaW5wdXQgPj4gMTYpICYgMHhmZik7CisgICAgICAgICAgICAgICAgICAgIGludCBCID0gKChpbnB1dCA+PiA4KSAmIDB4ZmYpOworICAgICAgICAgICAgICAgICAgICBpbnQgQSA9IChpbnB1dCAmIDB4ZmYpOworCisgICAgICAgICAgICAgICAgICAgIGZsb2F0IHdlaWdodCA9IGdhdXNzaWFuW3IgKyByYWRpdXNdOworCisgICAgICAgICAgICAgICAgICAgIGJsdXJyZWRQaXhlbFIgKz0gKGZsb2F0KShSKSp3ZWlnaHQ7CisgICAgICAgICAgICAgICAgICAgIGJsdXJyZWRQaXhlbEcgKz0gKGZsb2F0KShHKSp3ZWlnaHQ7CisgICAgICAgICAgICAgICAgICAgIGJsdXJyZWRQaXhlbEIgKz0gKGZsb2F0KShCKSp3ZWlnaHQ7CisgICAgICAgICAgICAgICAgICAgIGJsdXJyZWRQaXhlbEEgKz0gKGZsb2F0KShBKSp3ZWlnaHQ7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaW50IFIgPSAoaW50KWJsdXJyZWRQaXhlbFI7CisgICAgICAgICAgICAgICAgaW50IEcgPSAoaW50KWJsdXJyZWRQaXhlbEc7CisgICAgICAgICAgICAgICAgaW50IEIgPSAoaW50KWJsdXJyZWRQaXhlbEI7CisgICAgICAgICAgICAgICAgaW50IEEgPSAoaW50KWJsdXJyZWRQaXhlbEE7CisKKyAgICAgICAgICAgICAgICBpbnRlcm1baCp3aWR0aCArIHddID0gKFIgPDwgMjQpIHwgKEcgPDwgMTYpIHwgKEIgPDwgOCkgfCAoQSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBmb3IoaCA9IDA7IGggPCBoZWlnaHQ7IGggKyspIHsKKyAgICAgICAgICAgIGZvcih3ID0gMDsgdyA8IHdpZHRoOyB3ICsrKSB7CisKKyAgICAgICAgICAgICAgICBibHVycmVkUGl4ZWxSID0gMC4wZjsKKyAgICAgICAgICAgICAgICBibHVycmVkUGl4ZWxHID0gMC4wZjsKKyAgICAgICAgICAgICAgICBibHVycmVkUGl4ZWxCID0gMC4wZjsKKyAgICAgICAgICAgICAgICBibHVycmVkUGl4ZWxBID0gMC4wZjsKKyAgICAgICAgICAgICAgICBmb3IociA9IC1yYWRpdXM7IHIgPD0gcmFkaXVzOyByICsrKSB7CisgICAgICAgICAgICAgICAgICAgIGludCB2YWxpZEggPSBoICsgcjsKKyAgICAgICAgICAgICAgICAgICAgLy8gQ2xhbXAgdG8gemVybyBhbmQgd2lkdGgKKyAgICAgICAgICAgICAgICAgICAgaWYodmFsaWRIIDwgMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWRIID0gMDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZih2YWxpZEggPiBoZWlnaHQgLSAxKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB2YWxpZEggPSBoZWlnaHQgLSAxOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgaW50IGlucHV0ID0gaW50ZXJtW3ZhbGlkSCp3aWR0aCArIHddOworCisgICAgICAgICAgICAgICAgICAgIGludCBSID0gKChpbnB1dCA+PiAyNCkgJiAweGZmKTsKKyAgICAgICAgICAgICAgICAgICAgaW50IEcgPSAoKGlucHV0ID4+IDE2KSAmIDB4ZmYpOworICAgICAgICAgICAgICAgICAgICBpbnQgQiA9ICgoaW5wdXQgPj4gOCkgJiAweGZmKTsKKyAgICAgICAgICAgICAgICAgICAgaW50IEEgPSAoaW5wdXQgJiAweGZmKTsKKworICAgICAgICAgICAgICAgICAgICBmbG9hdCB3ZWlnaHQgPSBnYXVzc2lhbltyICsgcmFkaXVzXTsKKworICAgICAgICAgICAgICAgICAgICBibHVycmVkUGl4ZWxSICs9IChmbG9hdCkoUikqd2VpZ2h0OworICAgICAgICAgICAgICAgICAgICBibHVycmVkUGl4ZWxHICs9IChmbG9hdCkoRykqd2VpZ2h0OworICAgICAgICAgICAgICAgICAgICBibHVycmVkUGl4ZWxCICs9IChmbG9hdCkoQikqd2VpZ2h0OworICAgICAgICAgICAgICAgICAgICBibHVycmVkUGl4ZWxBICs9IChmbG9hdCkoQSkqd2VpZ2h0OworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGludCBSID0gKGludClibHVycmVkUGl4ZWxSOworICAgICAgICAgICAgICAgIGludCBHID0gKGludClibHVycmVkUGl4ZWxHOworICAgICAgICAgICAgICAgIGludCBCID0gKGludClibHVycmVkUGl4ZWxCOworICAgICAgICAgICAgICAgIGludCBBID0gKGludClibHVycmVkUGl4ZWxBOworCisgICAgICAgICAgICAgICAgb3V0W2gqd2lkdGggKyB3XSA9IChSIDw8IDI0KSB8IChHIDw8IDE2KSB8IChCIDw8IDgpIHwgKEEpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAKICAgICAgICAgdCA9IGphdmEubGFuZy5TeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAtIHQ7CisgICAgICAgIGFuZHJvaWQudXRpbC5Mb2cudigiSW1nIiwgIkphdmEgZnJhbWUgdGltZSBtcyAiICsgdCk7CisgICAgICAgIG1CaXRtYXBPdXQuc2V0UGl4ZWxzKG91dCwgMCwgd2lkdGgsIDAsIDAsIHdpZHRoLCBoZWlnaHQpOworICAgICAgICByZXR1cm4gdDsKKyAgICB9CiAKLSAgICAgICAgYW5kcm9pZC51dGlsLkxvZy52KCJJbWciLCAiZnJhbWUgdGltZSBtcyAiICsgdCk7CisgICAgcHVibGljIHZvaWQgb25Qcm9ncmVzc0NoYW5nZWQoU2Vla0JhciBzZWVrQmFyLCBpbnQgcHJvZ3Jlc3MsIGJvb2xlYW4gZnJvbVVzZXIpIHsKKyAgICAgICAgaWYgKGZyb21Vc2VyKSB7CisKKyAgICAgICAgICAgIGlmKHNlZWtCYXIgPT0gbVJhZGl1c1NlZWtCYXIpIHsKKyAgICAgICAgICAgICAgICBmbG9hdCBmUmFkaXVzID0gcHJvZ3Jlc3MgLyAxMDAuMGY7CisgICAgICAgICAgICAgICAgZlJhZGl1cyAqPSAoZmxvYXQpKE1BWF9SQURJVVMpOworICAgICAgICAgICAgICAgIG1SYWRpdXMgPSAoaW50KWZSYWRpdXM7CisKKyAgICAgICAgICAgICAgICBtU2NyaXB0LnNldF9yYWRpdXMobVJhZGl1cyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmKHNlZWtCYXIgPT0gbUluQmxhY2tTZWVrQmFyKSB7CisgICAgICAgICAgICAgICAgbUluQmxhY2sgPSAoZmxvYXQpcHJvZ3Jlc3M7CisgICAgICAgICAgICAgICAgbVNjcmlwdFZCbHVyLmludm9rZV9zZXRMZXZlbHMobUluQmxhY2ssIG1PdXRCbGFjaywgbUluV2hpdGUsIG1PdXRXaGl0ZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmKHNlZWtCYXIgPT0gbU91dEJsYWNrU2Vla0JhcikgeworICAgICAgICAgICAgICAgIG1PdXRCbGFjayA9IChmbG9hdClwcm9ncmVzczsKKyAgICAgICAgICAgICAgICBtU2NyaXB0VkJsdXIuaW52b2tlX3NldExldmVscyhtSW5CbGFjaywgbU91dEJsYWNrLCBtSW5XaGl0ZSwgbU91dFdoaXRlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYoc2Vla0JhciA9PSBtSW5XaGl0ZVNlZWtCYXIpIHsKKyAgICAgICAgICAgICAgICBtSW5XaGl0ZSA9IChmbG9hdClwcm9ncmVzcyArIDEyNy4wZjsKKyAgICAgICAgICAgICAgICBtU2NyaXB0VkJsdXIuaW52b2tlX3NldExldmVscyhtSW5CbGFjaywgbU91dEJsYWNrLCBtSW5XaGl0ZSwgbU91dFdoaXRlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYoc2Vla0JhciA9PSBtT3V0V2hpdGVTZWVrQmFyKSB7CisgICAgICAgICAgICAgICAgbU91dFdoaXRlID0gKGZsb2F0KXByb2dyZXNzICsgMTI3LjBmOworICAgICAgICAgICAgICAgIG1TY3JpcHRWQmx1ci5pbnZva2Vfc2V0TGV2ZWxzKG1JbkJsYWNrLCBtT3V0QmxhY2ssIG1JbldoaXRlLCBtT3V0V2hpdGUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZihzZWVrQmFyID09IG1HYW1tYVNlZWtCYXIpIHsKKyAgICAgICAgICAgICAgICBtR2FtbWEgPSAoZmxvYXQpcHJvZ3Jlc3MvMTAwLjBmOworICAgICAgICAgICAgICAgIG1HYW1tYSA9IE1hdGgubWF4KG1HYW1tYSwgMC4xZik7CisgICAgICAgICAgICAgICAgbUdhbW1hID0gMS4wZiAvIG1HYW1tYTsKKyAgICAgICAgICAgICAgICBtU2NyaXB0VkJsdXIuaW52b2tlX3NldEdhbW1hKG1HYW1tYSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmKHNlZWtCYXIgPT0gbVNhdHVyYXRpb25TZWVrQmFyKSB7CisgICAgICAgICAgICAgICAgbVNhdHVyYXRpb24gPSAoZmxvYXQpcHJvZ3Jlc3MgLyA1MC4wZjsKKyAgICAgICAgICAgICAgICBtU2NyaXB0VkJsdXIuaW52b2tlX3NldFNhdHVyYXRpb24obVNhdHVyYXRpb24pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBsb25nIHQgPSBqYXZhLmxhbmcuU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisgICAgICAgICAgICBpZiAodHJ1ZSkgeworICAgICAgICAgICAgICAgIG1TY3JpcHQuaW52b2tlX2ZpbHRlcigpOworICAgICAgICAgICAgICAgIG1SUy5maW5pc2goKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgamF2YUZpbHRlcigpOworICAgICAgICAgICAgICAgIG1EaXNwbGF5Vmlldy5pbnZhbGlkYXRlKCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHQgPSBqYXZhLmxhbmcuU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLSB0OworICAgICAgICAgICAgYW5kcm9pZC51dGlsLkxvZy52KCJJbWciLCAiUmVuZGVyc2NyaXB0IGZyYW1lIHRpbWUgY29yZSBtcyAiICsgdCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBvblN0YXJ0VHJhY2tpbmdUb3VjaChTZWVrQmFyIHNlZWtCYXIpIHsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBvblN0b3BUcmFja2luZ1RvdWNoKFNlZWtCYXIgc2Vla0JhcikgewogICAgIH0KIAogICAgIEBPdmVycmlkZQpAQCAtMTE5LDQ1ICszMTEsNTQgQEAKICAgICAgICAgc3VwZXIub25DcmVhdGUoc2F2ZWRJbnN0YW5jZVN0YXRlKTsKICAgICAgICAgc2V0Q29udGVudFZpZXcoUi5sYXlvdXQubWFpbik7CiAKLSAgICAgICAgbUJpdG1hcCA9IGxvYWRCaXRtYXAoUi5kcmF3YWJsZS5kYXRhKTsKKyAgICAgICAgbUJpdG1hcEluID0gbG9hZEJpdG1hcChSLmRyYXdhYmxlLmRhdGEpOworICAgICAgICBtQml0bWFwT3V0ID0gbG9hZEJpdG1hcChSLmRyYXdhYmxlLmRhdGEpOworICAgICAgICBtQml0bWFwU2NyYXRjaCA9IGxvYWRCaXRtYXAoUi5kcmF3YWJsZS5kYXRhKTsKIAogICAgICAgICBtU3VyZmFjZVZpZXcgPSAoU3VyZmFjZVZpZXcpIGZpbmRWaWV3QnlJZChSLmlkLnN1cmZhY2UpOwogICAgICAgICBtU3VyZmFjZVZpZXcuZ2V0SG9sZGVyKCkuYWRkQ2FsbGJhY2sodGhpcyk7CiAKICAgICAgICAgbURpc3BsYXlWaWV3ID0gKEltYWdlVmlldykgZmluZFZpZXdCeUlkKFIuaWQuZGlzcGxheSk7Ci0gICAgICAgIG1EaXNwbGF5Vmlldy5zZXRJbWFnZUJpdG1hcChtQml0bWFwKTsKKyAgICAgICAgbURpc3BsYXlWaWV3LnNldEltYWdlQml0bWFwKG1CaXRtYXBPdXQpOwogCi0gICAgICAgICgoU2Vla0JhcikgZmluZFZpZXdCeUlkKFIuaWQudGhyZXNob2xkKSkuc2V0T25TZWVrQmFyQ2hhbmdlTGlzdGVuZXIoCi0gICAgICAgICAgICAgICAgbmV3IFNlZWtCYXIuT25TZWVrQmFyQ2hhbmdlTGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCBvblByb2dyZXNzQ2hhbmdlZChTZWVrQmFyIHNlZWtCYXIsIGludCBwcm9ncmVzcywgYm9vbGVhbiBmcm9tVXNlcikgewotICAgICAgICAgICAgICAgIGlmIChmcm9tVXNlcikgewotICAgICAgICAgICAgICAgICAgICBtUGFyYW1zLnRocmVzaG9sZCA9IHByb2dyZXNzIC8gMTAwLjBmOwotICAgICAgICAgICAgICAgICAgICBtUGFyYW1zQWxsb2NhdGlvbi5kYXRhKG1QYXJhbXMpOworICAgICAgICBtUmFkaXVzU2Vla0JhciA9IChTZWVrQmFyKSBmaW5kVmlld0J5SWQoUi5pZC5yYWRpdXMpOworICAgICAgICBtUmFkaXVzU2Vla0Jhci5zZXRPblNlZWtCYXJDaGFuZ2VMaXN0ZW5lcih0aGlzKTsKIAotICAgICAgICAgICAgICAgICAgICBpZiAodHJ1ZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgbUludm9rYWJsZS5leGVjdXRlKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBqYXZhRmlsdGVyKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtQml0bWFwLnNldFBpeGVscyhtT3V0RGF0YSwgMCwgbVBhcmFtcy5vdXRXaWR0aCwgMCwgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVBhcmFtcy5vdXRXaWR0aCwgbVBhcmFtcy5vdXRIZWlnaHQpOwotICAgICAgICAgICAgICAgICAgICAgICAgbURpc3BsYXlWaWV3LmludmFsaWRhdGUoKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KKyAgICAgICAgbUluQmxhY2tTZWVrQmFyID0gKFNlZWtCYXIpZmluZFZpZXdCeUlkKFIuaWQuaW5CbGFjayk7CisgICAgICAgIG1JbkJsYWNrU2Vla0Jhci5zZXRPblNlZWtCYXJDaGFuZ2VMaXN0ZW5lcih0aGlzKTsKKyAgICAgICAgbUluQmxhY2tTZWVrQmFyLnNldE1heCgxMjgpOworICAgICAgICBtSW5CbGFja1NlZWtCYXIuc2V0UHJvZ3Jlc3MoMCk7CisgICAgICAgIG1PdXRCbGFja1NlZWtCYXIgPSAoU2Vla0JhcilmaW5kVmlld0J5SWQoUi5pZC5vdXRCbGFjayk7CisgICAgICAgIG1PdXRCbGFja1NlZWtCYXIuc2V0T25TZWVrQmFyQ2hhbmdlTGlzdGVuZXIodGhpcyk7CisgICAgICAgIG1PdXRCbGFja1NlZWtCYXIuc2V0TWF4KDEyOCk7CisgICAgICAgIG1PdXRCbGFja1NlZWtCYXIuc2V0UHJvZ3Jlc3MoMCk7CiAKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uU3RhcnRUcmFja2luZ1RvdWNoKFNlZWtCYXIgc2Vla0JhcikgewotICAgICAgICAgICAgfQorICAgICAgICBtSW5XaGl0ZVNlZWtCYXIgPSAoU2Vla0JhcilmaW5kVmlld0J5SWQoUi5pZC5pbldoaXRlKTsKKyAgICAgICAgbUluV2hpdGVTZWVrQmFyLnNldE9uU2Vla0JhckNoYW5nZUxpc3RlbmVyKHRoaXMpOworICAgICAgICBtSW5XaGl0ZVNlZWtCYXIuc2V0TWF4KDEyOCk7CisgICAgICAgIG1JbldoaXRlU2Vla0Jhci5zZXRQcm9ncmVzcygxMjgpOworICAgICAgICBtT3V0V2hpdGVTZWVrQmFyID0gKFNlZWtCYXIpZmluZFZpZXdCeUlkKFIuaWQub3V0V2hpdGUpOworICAgICAgICBtT3V0V2hpdGVTZWVrQmFyLnNldE9uU2Vla0JhckNoYW5nZUxpc3RlbmVyKHRoaXMpOworICAgICAgICBtT3V0V2hpdGVTZWVrQmFyLnNldE1heCgxMjgpOworICAgICAgICBtT3V0V2hpdGVTZWVrQmFyLnNldFByb2dyZXNzKDEyOCk7CiAKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uU3RvcFRyYWNraW5nVG91Y2goU2Vla0JhciBzZWVrQmFyKSB7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOworICAgICAgICBtR2FtbWFTZWVrQmFyID0gKFNlZWtCYXIpZmluZFZpZXdCeUlkKFIuaWQuaW5HYW1tYSk7CisgICAgICAgIG1HYW1tYVNlZWtCYXIuc2V0T25TZWVrQmFyQ2hhbmdlTGlzdGVuZXIodGhpcyk7CisgICAgICAgIG1HYW1tYVNlZWtCYXIuc2V0TWF4KDE1MCk7CisgICAgICAgIG1HYW1tYVNlZWtCYXIuc2V0UHJvZ3Jlc3MoMTAwKTsKKworICAgICAgICBtU2F0dXJhdGlvblNlZWtCYXIgPSAoU2Vla0JhcilmaW5kVmlld0J5SWQoUi5pZC5pblNhdHVyYXRpb24pOworICAgICAgICBtU2F0dXJhdGlvblNlZWtCYXIuc2V0T25TZWVrQmFyQ2hhbmdlTGlzdGVuZXIodGhpcyk7CisgICAgICAgIG1TYXR1cmF0aW9uU2Vla0Jhci5zZXRQcm9ncmVzcyg1MCk7CisKKyAgICAgICAgbUJlbmNobWFya1Jlc3VsdCA9IChUZXh0VmlldykgZmluZFZpZXdCeUlkKFIuaWQuYmVuY2htYXJrVGV4dCk7CisgICAgICAgIG1CZW5jaG1hcmtSZXN1bHQuc2V0VGV4dCgiQmVuY2htYXJrIG5vIHlldCBydW4iKTsKICAgICB9CiAKICAgICBwdWJsaWMgdm9pZCBzdXJmYWNlQ3JlYXRlZChTdXJmYWNlSG9sZGVyIGhvbGRlcikgewotICAgICAgICBtUGFyYW1zID0gY3JlYXRlUGFyYW1zKCk7Ci0gICAgICAgIG1JbnZva2FibGUgPSBjcmVhdGVTY3JpcHQoKTsKLQotICAgICAgICBtSW52b2thYmxlLmV4ZWN1dGUoKTsKKyAgICAgICAgY3JlYXRlU2NyaXB0KCk7CisgICAgICAgIG1TY3JpcHQuaW52b2tlX2ZpbHRlcigpOworICAgICAgICBtUlMuZmluaXNoKCk7CiAgICAgfQogCiAgICAgcHVibGljIHZvaWQgc3VyZmFjZUNoYW5nZWQoU3VyZmFjZUhvbGRlciBob2xkZXIsIGludCBmb3JtYXQsIGludCB3aWR0aCwgaW50IGhlaWdodCkgewpAQCAtMTY2LDU0ICszNjcsMzggQEAKICAgICBwdWJsaWMgdm9pZCBzdXJmYWNlRGVzdHJveWVkKFN1cmZhY2VIb2xkZXIgaG9sZGVyKSB7CiAgICAgfQogCi0gICAgcHJpdmF0ZSBTY3JpcHQuSW52b2thYmxlIGNyZWF0ZVNjcmlwdCgpIHsKKyAgICBwcml2YXRlIHZvaWQgY3JlYXRlU2NyaXB0KCkgewogICAgICAgICBtUlMgPSBSZW5kZXJTY3JpcHQuY3JlYXRlKCk7CiAgICAgICAgIG1SUy5tTWVzc2FnZUNhbGxiYWNrID0gbmV3IEZpbHRlckNhbGxiYWNrKCk7CiAKLSAgICAgICAgbVBhcmFtc1R5cGUgPSBUeXBlLmNyZWF0ZUZyb21DbGFzcyhtUlMsIFBhcmFtcy5jbGFzcywgMSwgIlBhcmFtZXRlcnMiKTsKLSAgICAgICAgbVBhcmFtc0FsbG9jYXRpb24gPSBBbGxvY2F0aW9uLmNyZWF0ZVR5cGVkKG1SUywgbVBhcmFtc1R5cGUpOwotICAgICAgICBtUGFyYW1zQWxsb2NhdGlvbi5kYXRhKG1QYXJhbXMpOworICAgICAgICBtSW5QaXhlbHNBbGxvY2F0aW9uID0gQWxsb2NhdGlvbi5jcmVhdGVCaXRtYXBSZWYobVJTLCBtQml0bWFwSW4pOworICAgICAgICBtT3V0UGl4ZWxzQWxsb2NhdGlvbiA9IEFsbG9jYXRpb24uY3JlYXRlQml0bWFwUmVmKG1SUywgbUJpdG1hcE91dCk7CiAKLSAgICAgICAgZmluYWwgaW50IHBpeGVsQ291bnQgPSBtUGFyYW1zLmluV2lkdGggKiBtUGFyYW1zLmluSGVpZ2h0OworICAgICAgICBUeXBlLkJ1aWxkZXIgdGIgPSBuZXcgVHlwZS5CdWlsZGVyKG1SUywgRWxlbWVudC5GMzJfNChtUlMpKTsKKyAgICAgICAgdGIuYWRkKGFuZHJvaWQucmVuZGVyc2NyaXB0LkRpbWVuc2lvbi5YLCBtQml0bWFwSW4uZ2V0V2lkdGgoKSk7CisgICAgICAgIHRiLmFkZChhbmRyb2lkLnJlbmRlcnNjcmlwdC5EaW1lbnNpb24uWSwgbUJpdG1hcEluLmdldEhlaWdodCgpKTsKKyAgICAgICAgbVNjcmF0Y2hQaXhlbHNBbGxvY2F0aW9uMSA9IEFsbG9jYXRpb24uY3JlYXRlVHlwZWQobVJTLCB0Yi5jcmVhdGUoKSk7CisgICAgICAgIG1TY3JhdGNoUGl4ZWxzQWxsb2NhdGlvbjIgPSBBbGxvY2F0aW9uLmNyZWF0ZVR5cGVkKG1SUywgdGIuY3JlYXRlKCkpOwogCi0gICAgICAgIG1QaXhlbFR5cGUgPSBUeXBlLmNyZWF0ZUZyb21DbGFzcyhtUlMsIFBpeGVsLmNsYXNzLCAxLCAiUGl4ZWwiKTsKLSAgICAgICAgbUluUGl4ZWxzQWxsb2NhdGlvbiA9IEFsbG9jYXRpb24uY3JlYXRlU2l6ZWQobVJTLAotICAgICAgICAgICAgICAgIEVsZW1lbnQuY3JlYXRlVXNlcihtUlMsIEVsZW1lbnQuRGF0YVR5cGUuU0lHTkVEXzMyKSwKLSAgICAgICAgICAgICAgICBwaXhlbENvdW50KTsKLSAgICAgICAgbU91dFBpeGVsc0FsbG9jYXRpb24gPSBBbGxvY2F0aW9uLmNyZWF0ZVNpemVkKG1SUywKLSAgICAgICAgICAgICAgICBFbGVtZW50LmNyZWF0ZVVzZXIobVJTLCBFbGVtZW50LkRhdGFUeXBlLlNJR05FRF8zMiksCi0gICAgICAgICAgICAgICAgcGl4ZWxDb3VudCk7CisgICAgICAgIG1TY3JpcHRWQmx1ciA9IG5ldyBTY3JpcHRDX1ZlcnRpY2FsQmx1cihtUlMsIGdldFJlc291cmNlcygpLCBSLnJhdy52ZXJ0aWNhbGJsdXIsIGZhbHNlKTsKKyAgICAgICAgbVNjcmlwdEhCbHVyID0gbmV3IFNjcmlwdENfSG9yaXpvbnRhbEJsdXIobVJTLCBnZXRSZXNvdXJjZXMoKSwgUi5yYXcuaG9yaXpvbnRhbGJsdXIsIGZhbHNlKTsKIAotICAgICAgICBtSW5EYXRhID0gbmV3IGludFtwaXhlbENvdW50XTsKLSAgICAgICAgbUJpdG1hcC5nZXRQaXhlbHMobUluRGF0YSwgMCwgbVBhcmFtcy5pbldpZHRoLCAwLCAwLCBtUGFyYW1zLmluV2lkdGgsIG1QYXJhbXMuaW5IZWlnaHQpOwotICAgICAgICBtSW5QaXhlbHNBbGxvY2F0aW9uLmRhdGEobUluRGF0YSk7CisgICAgICAgIG1TY3JpcHQgPSBuZXcgU2NyaXB0Q19UaHJlc2hvbGQobVJTLCBnZXRSZXNvdXJjZXMoKSwgUi5yYXcudGhyZXNob2xkLCBmYWxzZSk7CisgICAgICAgIG1TY3JpcHQuc2V0X3dpZHRoKG1CaXRtYXBJbi5nZXRXaWR0aCgpKTsKKyAgICAgICAgbVNjcmlwdC5zZXRfaGVpZ2h0KG1CaXRtYXBJbi5nZXRIZWlnaHQoKSk7CisgICAgICAgIG1TY3JpcHQuc2V0X3JhZGl1cyhtUmFkaXVzKTsKIAotICAgICAgICBtT3V0RGF0YSA9IG5ldyBpbnRbcGl4ZWxDb3VudF07Ci0gICAgICAgIG1PdXRQaXhlbHNBbGxvY2F0aW9uLmRhdGEobU91dERhdGEpOworICAgICAgICBtU2NyaXB0VkJsdXIuaW52b2tlX3NldExldmVscyhtSW5CbGFjaywgbU91dEJsYWNrLCBtSW5XaGl0ZSwgbU91dFdoaXRlKTsKKyAgICAgICAgbVNjcmlwdFZCbHVyLmludm9rZV9zZXRHYW1tYShtR2FtbWEpOworICAgICAgICBtU2NyaXB0VkJsdXIuaW52b2tlX3NldFNhdHVyYXRpb24obVNhdHVyYXRpb24pOwogCi0gICAgICAgIFNjcmlwdEMuQnVpbGRlciBzYiA9IG5ldyBTY3JpcHRDLkJ1aWxkZXIobVJTKTsKLSAgICAgICAgc2Iuc2V0VHlwZShtUGFyYW1zVHlwZSwgIlBhcmFtcyIsIDApOwotICAgICAgICBzYi5zZXRUeXBlKG1QaXhlbFR5cGUsICJJblBpeGVsIiwgMSk7Ci0gICAgICAgIHNiLnNldFR5cGUobVBpeGVsVHlwZSwgIk91dFBpeGVsIiwgMik7Ci0gICAgICAgIHNiLnNldFR5cGUodHJ1ZSwgMik7Ci0gICAgICAgIFNjcmlwdC5JbnZva2FibGUgaW52b2thYmxlID0gc2IuYWRkSW52b2thYmxlKCJtYWluIik7Ci0gICAgICAgIHNiLnNldFNjcmlwdChnZXRSZXNvdXJjZXMoKSwgUi5yYXcudGhyZXNob2xkKTsKLSAgICAgICAgLy9zYi5zZXRSb290KHRydWUpOworICAgICAgICBtU2NyaXB0LmJpbmRfSW5QaXhlbChtSW5QaXhlbHNBbGxvY2F0aW9uKTsKKyAgICAgICAgbVNjcmlwdC5iaW5kX091dFBpeGVsKG1PdXRQaXhlbHNBbGxvY2F0aW9uKTsKKyAgICAgICAgbVNjcmlwdC5iaW5kX1NjcmF0Y2hQaXhlbDEobVNjcmF0Y2hQaXhlbHNBbGxvY2F0aW9uMSk7CisgICAgICAgIG1TY3JpcHQuYmluZF9TY3JhdGNoUGl4ZWwyKG1TY3JhdGNoUGl4ZWxzQWxsb2NhdGlvbjIpOwogCi0gICAgICAgIFNjcmlwdEMgc2NyaXB0ID0gc2IuY3JlYXRlKCk7Ci0gICAgICAgIHNjcmlwdC5iaW5kQWxsb2NhdGlvbihtUGFyYW1zQWxsb2NhdGlvbiwgMCk7Ci0gICAgICAgIHNjcmlwdC5iaW5kQWxsb2NhdGlvbihtSW5QaXhlbHNBbGxvY2F0aW9uLCAxKTsKLSAgICAgICAgc2NyaXB0LmJpbmRBbGxvY2F0aW9uKG1PdXRQaXhlbHNBbGxvY2F0aW9uLCAyKTsKLQotICAgICAgICByZXR1cm4gaW52b2thYmxlOwotICAgIH0KLQotICAgIHByaXZhdGUgUGFyYW1zIGNyZWF0ZVBhcmFtcygpIHsKLSAgICAgICAgZmluYWwgUGFyYW1zIHBhcmFtcyA9IG5ldyBQYXJhbXMoKTsKLSAgICAgICAgcGFyYW1zLmluV2lkdGggPSBwYXJhbXMub3V0V2lkdGggPSBtQml0bWFwLmdldFdpZHRoKCk7Ci0gICAgICAgIHBhcmFtcy5pbkhlaWdodCA9IHBhcmFtcy5vdXRIZWlnaHQgPSBtQml0bWFwLmdldEhlaWdodCgpOwotICAgICAgICBwYXJhbXMudGhyZXNob2xkID0gMC41ZjsKLSAgICAgICAgcmV0dXJuIHBhcmFtczsKKyAgICAgICAgbVNjcmlwdC5zZXRfdkJsdXJTY3JpcHQobVNjcmlwdFZCbHVyKTsKKyAgICAgICAgbVNjcmlwdC5zZXRfaEJsdXJTY3JpcHQobVNjcmlwdEhCbHVyKTsKICAgICB9CiAKICAgICBwcml2YXRlIEJpdG1hcCBsb2FkQml0bWFwKGludCByZXNvdXJjZSkgewpAQCAtMjI5LDQgKzQxNCwzMCBAQAogICAgICAgICBzb3VyY2UucmVjeWNsZSgpOwogICAgICAgICByZXR1cm4gYjsKICAgICB9CisKKyAgICAvLyBidXR0b24gaG9vaworICAgIHB1YmxpYyB2b2lkIGJlbmNobWFyayhWaWV3IHYpIHsKKyAgICAgICAgYW5kcm9pZC51dGlsLkxvZy52KCJJbWciLCAiQmVuY2htYXJraW5nIik7CisgICAgICAgIGludCBvbGRSYWRpdXMgPSBtUmFkaXVzOworICAgICAgICBtUmFkaXVzID0gTUFYX1JBRElVUzsKKyAgICAgICAgbVNjcmlwdC5zZXRfcmFkaXVzKG1SYWRpdXMpOworCisgICAgICAgIGxvbmcgdCA9IGphdmEubGFuZy5TeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKworICAgICAgICBtU2NyaXB0Lmludm9rZV9maWx0ZXIoKTsKKyAgICAgICAgbVJTLmZpbmlzaCgpOworCisgICAgICAgIHQgPSBqYXZhLmxhbmcuU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLSB0OworICAgICAgICBhbmRyb2lkLnV0aWwuTG9nLnYoIkltZyIsICJSZW5kZXJzY3JpcHQgZnJhbWUgdGltZSBjb3JlIG1zICIgKyB0KTsKKworICAgICAgICAvL2xvbmcgamF2YVRpbWUgPSBqYXZhRmlsdGVyKCk7CisgICAgICAgIC8vbUJlbmNobWFya1Jlc3VsdC5zZXRUZXh0KCJSUzogIiArIHQgKyAiIG1zICBKYXZhOiAiICsgamF2YVRpbWUgKyAiIG1zIik7CisgICAgICAgIG1CZW5jaG1hcmtSZXN1bHQuc2V0VGV4dCgiUlM6ICIgKyB0ICsgIiBtcyIpOworCisgICAgICAgIG1SYWRpdXMgPSBvbGRSYWRpdXM7CisgICAgICAgIG1TY3JpcHQuc2V0X3JhZGl1cyhtUmFkaXVzKTsKKworICAgICAgICBtU2NyaXB0Lmludm9rZV9maWx0ZXIoKTsKKyAgICAgICAgbVJTLmZpbmlzaCgpOworICAgIH0KIH0KZGlmZiAtLWdpdCBhL2xpYnMvcnMvamF2YS9JbWFnZVByb2Nlc3Npbmcvc3JjL2NvbS9hbmRyb2lkL3JzL2ltYWdlL2hvcml6b250YWxfYmx1ci5ycyBiL2xpYnMvcnMvamF2YS9JbWFnZVByb2Nlc3Npbmcvc3JjL2NvbS9hbmRyb2lkL3JzL2ltYWdlL2hvcml6b250YWxfYmx1ci5ycwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZmZmYWM4Ci0tLSAvZGV2L251bGwKKysrIGIvbGlicy9ycy9qYXZhL0ltYWdlUHJvY2Vzc2luZy9zcmMvY29tL2FuZHJvaWQvcnMvaW1hZ2UvaG9yaXpvbnRhbF9ibHVyLnJzCkBAIC0wLDAgKzEsMzAgQEAKKyNwcmFnbWEgdmVyc2lvbigxKQorCisjaW5jbHVkZSAiaXAucnNoIgorCit2b2lkIHJvb3QoY29uc3Qgdm9pZCAqdl9pbiwgdm9pZCAqdl9vdXQsIGNvbnN0IHZvaWQgKnVzckRhdGEsIHVpbnQzMl90IHgsIHVpbnQzMl90IHkpIHsKKyAgICBmbG9hdDQgKm91dHB1dCA9IChmbG9hdDQgKil2X291dDsKKyAgICBjb25zdCBGaWx0ZXJTdHJ1Y3QgKmZzID0gKGNvbnN0IEZpbHRlclN0cnVjdCAqKXVzckRhdGE7CisgICAgY29uc3QgZmxvYXQ0ICppbnB1dCA9IChjb25zdCBmbG9hdDQgKilyc0dldEVsZW1lbnRBdChmcy0+YWluLCAwLCB5KTsKKworICAgIGZsb2F0MyBibHVycmVkUGl4ZWwgPSAwOworICAgIGNvbnN0IGZsb2F0ICpnUHRyID0gZnMtPmdhdXNzaWFuOworICAgIGlmICgoeCA+IGZzLT5yYWRpdXMpICYmICh4IDwgKGZzLT53aWR0aCAtIGZzLT5yYWRpdXMpKSkgeworICAgICAgICBjb25zdCBmbG9hdDQgKmkgPSBpbnB1dCArICh4IC0gZnMtPnJhZGl1cyk7CisgICAgICAgIGZvcihpbnQgciA9IC1mcy0+cmFkaXVzOyByIDw9IGZzLT5yYWRpdXM7IHIgKyspIHsKKyAgICAgICAgICAgIGJsdXJyZWRQaXhlbCArPSBpLT54eXogKiBnUHRyWzBdOworICAgICAgICAgICAgZ1B0cisrOworICAgICAgICAgICAgaSsrOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgZm9yKGludCByID0gLWZzLT5yYWRpdXM7IHIgPD0gZnMtPnJhZGl1czsgciArKykgeworICAgICAgICAgICAgLy8gU3RlcHBpbmcgbGVmdCBhbmQgcmlnaHQgYXdheSBmcm9tIHRoZSBwaXhlbAorICAgICAgICAgICAgaW50IHZhbGlkVyA9IHJzQ2xhbXAoeCArIHIsICh1aW50KTAsICh1aW50KShmcy0+d2lkdGggLSAxKSk7CisgICAgICAgICAgICBibHVycmVkUGl4ZWwgKz0gaW5wdXRbdmFsaWRXXS54eXogKiBnUHRyWzBdOworICAgICAgICAgICAgZ1B0cisrOworICAgICAgICB9CisgICAgfQorCisgICAgb3V0cHV0LT54eXogPSBibHVycmVkUGl4ZWw7Cit9CisKZGlmZiAtLWdpdCBhL2xpYnMvcnMvamF2YS9JbWFnZVByb2Nlc3Npbmcvc3JjL2NvbS9hbmRyb2lkL3JzL2ltYWdlL2lwLnJzaCBiL2xpYnMvcnMvamF2YS9JbWFnZVByb2Nlc3Npbmcvc3JjL2NvbS9hbmRyb2lkL3JzL2ltYWdlL2lwLnJzaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZDdhNzE5Ci0tLSAvZGV2L251bGwKKysrIGIvbGlicy9ycy9qYXZhL0ltYWdlUHJvY2Vzc2luZy9zcmMvY29tL2FuZHJvaWQvcnMvaW1hZ2UvaXAucnNoCkBAIC0wLDAgKzEsMTUgQEAKKyNwcmFnbWEgcnMgamF2YV9wYWNrYWdlX25hbWUoY29tLmFuZHJvaWQucnMuaW1hZ2UpCisKKyNkZWZpbmUgTUFYX1JBRElVUyAyNQorCit0eXBlZGVmIHN0cnVjdCBGaWx0ZXJTdHJ1Y3RfcyB7CisgICAgcnNfYWxsb2NhdGlvbiBhaW47CisKKyAgICBmbG9hdCAqZ2F1c3NpYW47IC8vW01BWF9SQURJVVMgKiAyICsgMV07CisgICAgaW50IGhlaWdodDsKKyAgICBpbnQgd2lkdGg7CisgICAgaW50IHJhZGl1czsKKworfSBGaWx0ZXJTdHJ1Y3Q7CisKKwpkaWZmIC0tZ2l0IGEvbGlicy9ycy9qYXZhL0ltYWdlUHJvY2Vzc2luZy9zcmMvY29tL2FuZHJvaWQvcnMvaW1hZ2UvdGhyZXNob2xkLnJzIGIvbGlicy9ycy9qYXZhL0ltYWdlUHJvY2Vzc2luZy9zcmMvY29tL2FuZHJvaWQvcnMvaW1hZ2UvdGhyZXNob2xkLnJzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMzOTQ1YTUKLS0tIC9kZXYvbnVsbAorKysgYi9saWJzL3JzL2phdmEvSW1hZ2VQcm9jZXNzaW5nL3NyYy9jb20vYW5kcm9pZC9ycy9pbWFnZS90aHJlc2hvbGQucnMKQEAgLTAsMCArMSw5NyBAQAorI3ByYWdtYSB2ZXJzaW9uKDEpCisKKyNpbmNsdWRlICJpcC5yc2giCisKK2ludCBoZWlnaHQ7CitpbnQgd2lkdGg7CitpbnQgcmFkaXVzOworCit1Y2hhcjQgKiBJblBpeGVsOwordWNoYXI0ICogT3V0UGl4ZWw7CitmbG9hdDQgKiBTY3JhdGNoUGl4ZWwxOworZmxvYXQ0ICogU2NyYXRjaFBpeGVsMjsKKworI3ByYWdtYSBycyBleHBvcnRfdmFyKGhlaWdodCwgd2lkdGgsIHJhZGl1cywgSW5QaXhlbCwgT3V0UGl4ZWwsIFNjcmF0Y2hQaXhlbDEsIFNjcmF0Y2hQaXhlbDIsIHZCbHVyU2NyaXB0LCBoQmx1clNjcmlwdCkKKyNwcmFnbWEgcnMgZXhwb3J0X2Z1bmMoZmlsdGVyKTsKKworcnNfc2NyaXB0IHZCbHVyU2NyaXB0OworcnNfc2NyaXB0IGhCbHVyU2NyaXB0OworCitjb25zdCBpbnQgQ01EX0ZJTklTSEVEID0gMTsKKworLy8gU3RvcmUgb3VyIGNvZWZmaWNpZW50cyBoZXJlCitzdGF0aWMgZmxvYXQgZ2F1c3NpYW5bTUFYX1JBRElVUyAqIDIgKyAxXTsKKworCitzdGF0aWMgdm9pZCBjb21wdXRlR2F1c3NpYW5XZWlnaHRzKCkgeworICAgIC8vIENvbXB1dGUgZ2F1c3NpYW4gd2VpZ2h0cyBmb3IgdGhlIGJsdXIKKyAgICAvLyBlIGlzIHRoZSBldWxlcidzIG51bWJlcgorICAgIGZsb2F0IGUgPSAyLjcxODI4MTgyODQ1OTA0NWY7CisgICAgZmxvYXQgcGkgPSAzLjE0MTU5MjY1MzU4OTc5MzJmOworICAgIC8vIGcoeCkgPSAoIDEgLyBzcXJ0KCAyICogcGkgKSAqIHNpZ21hKSAqIGUgXiAoIC14XjIgLyAyICogc2lnbWFeMiApCisgICAgLy8geCBpcyBvZiB0aGUgZm9ybSBbLXJhZGl1cyAuLiAwIC4uIHJhZGl1c10KKyAgICAvLyBhbmQgc2lnbWEgdmFyaWVzIHdpdGggcmFkaXVzLgorICAgIC8vIEJhc2VkIG9uIHNvbWUgZXhwZXJpbWVudGFsIHJhZGl1cyB2YWx1ZXMgYW5kIHNpZ21hJ3MKKyAgICAvLyB3ZSBhcHByb3hpbWF0ZWx5IGZpdCBzaWdtYSA9IGYocmFkaXVzKSBhcworICAgIC8vIHNpZ21hID0gcmFkaXVzICogMC40ICArIDAuNgorICAgIC8vIFRoZSBsYXJnZXIgdGhlIHJhZGl1cyBnZXRzLCB0aGUgbW9yZSBvdXIgZ2F1c3NpYW4gYmx1cgorICAgIC8vIHdpbGwgcmVzZW1ibGUgYSBib3ggYmx1ciBzaW5jZSB3aXRoIGxhcmdlIHNpZ21hCisgICAgLy8gdGhlIGdhdXNzaWFuIGN1cnZlIGJlZ2lucyB0byBsb3NlIGl0cyBzaGFwZQorICAgIGZsb2F0IHNpZ21hID0gMC40ZiAqIChmbG9hdClyYWRpdXMgKyAwLjZmOworCisgICAgLy8gTm93IGNvbXB1dGUgdGhlIGNvZWZmaWNpbnRzCisgICAgLy8gV2Ugd2lsbCBzdG9yZSBzb21lIHJlZHVuZGFudCB2YWx1ZXMgdG8gc2F2ZSBzb21lIG1hdGggZHVyaW5nCisgICAgLy8gdGhlIGJsdXIgY2FsY3VsYXRpb25zCisgICAgLy8gcHJlY29tcHV0ZSBzb21lIHZhbHVlcworICAgIGZsb2F0IGNvZWZmMSA9IDEuMGYgLyAoc3FydCggMi4wZiAqIHBpICkgKiBzaWdtYSk7CisgICAgZmxvYXQgY29lZmYyID0gLSAxLjBmIC8gKDIuMGYgKiBzaWdtYSAqIHNpZ21hKTsKKworICAgIGZsb2F0IG5vcm1hbGl6ZUZhY3RvciA9IDAuMGY7CisgICAgZmxvYXQgZmxvYXRSID0gMC4wZjsKKyAgICBpbnQgcjsKKyAgICBmb3IociA9IC1yYWRpdXM7IHIgPD0gcmFkaXVzOyByICsrKSB7CisgICAgICAgIGZsb2F0UiA9IChmbG9hdClyOworICAgICAgICBnYXVzc2lhbltyICsgcmFkaXVzXSA9IGNvZWZmMSAqIHBvdyhlLCBmbG9hdFIgKiBmbG9hdFIgKiBjb2VmZjIpOworICAgICAgICBub3JtYWxpemVGYWN0b3IgKz0gZ2F1c3NpYW5bciArIHJhZGl1c107CisgICAgfQorCisgICAgLy9Ob3cgd2UgbmVlZCB0byBub3JtYWxpemUgdGhlIHdlaWdodHMgYmVjYXVzZSBhbGwgb3VyIGNvZWZmaWNpZW50cyBuZWVkIHRvIGFkZCB1cCB0byBvbmUKKyAgICBub3JtYWxpemVGYWN0b3IgPSAxLjBmIC8gbm9ybWFsaXplRmFjdG9yOworICAgIGZvcihyID0gLXJhZGl1czsgciA8PSByYWRpdXM7IHIgKyspIHsKKyAgICAgICAgZmxvYXRSID0gKGZsb2F0KXI7CisgICAgICAgIGdhdXNzaWFuW3IgKyByYWRpdXNdICo9IG5vcm1hbGl6ZUZhY3RvcjsKKyAgICB9Cit9CisKKworc3RhdGljIHZvaWQgY29weUlucHV0KCkgeworICAgIFJTX0RFQlVHX01BUktFUjsKKyAgICByc19hbGxvY2F0aW9uIGFpbiA9IHJzR2V0QWxsb2NhdGlvbihJblBpeGVsKTsKKyAgICB1aW50MzJfdCBkaW14ID0gcnNBbGxvY2F0aW9uR2V0RGltWChhaW4pOworICAgIHVpbnQzMl90IGRpbXkgPSByc0FsbG9jYXRpb25HZXREaW1ZKGFpbik7CisgICAgZm9yKHVpbnQzMl90IHkgPSAwOyB5IDwgZGlteTsgeSsrKSB7CisgICAgICAgIGZvcih1aW50MzJfdCB4ID0gMDsgeCA8IGRpbXg7IHgrKykgeworICAgICAgICAgICAgU2NyYXRjaFBpeGVsMVt4ICsgeSAqIGRpbXhdID0gY29udmVydF9mbG9hdDQoSW5QaXhlbFt4ICsgeSAqIGRpbXhdKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBSU19ERUJVR19NQVJLRVI7Cit9CisKK3ZvaWQgZmlsdGVyKCkgeworICAgIGNvcHlJbnB1dCgpOworICAgIGNvbXB1dGVHYXVzc2lhbldlaWdodHMoKTsKKworICAgIEZpbHRlclN0cnVjdCBmczsKKyAgICBmcy5nYXVzc2lhbiA9IGdhdXNzaWFuOworICAgIGZzLndpZHRoID0gd2lkdGg7CisgICAgZnMuaGVpZ2h0ID0gaGVpZ2h0OworICAgIGZzLnJhZGl1cyA9IHJhZGl1czsKKworICAgIGZzLmFpbiA9IHJzR2V0QWxsb2NhdGlvbihTY3JhdGNoUGl4ZWwxKTsKKyAgICByc0ZvckVhY2goaEJsdXJTY3JpcHQsIGZzLmFpbiwgcnNHZXRBbGxvY2F0aW9uKFNjcmF0Y2hQaXhlbDIpLCAmZnMpOworCisgICAgZnMuYWluID0gcnNHZXRBbGxvY2F0aW9uKFNjcmF0Y2hQaXhlbDIpOworICAgIHJzRm9yRWFjaCh2Qmx1clNjcmlwdCwgZnMuYWluLCByc0dldEFsbG9jYXRpb24oT3V0UGl4ZWwpLCAmZnMpOworICAgIHJzU2VuZFRvQ2xpZW50QmxvY2tpbmcoQ01EX0ZJTklTSEVEKTsKK30KKwpkaWZmIC0tZ2l0IGEvbGlicy9ycy9qYXZhL0ltYWdlUHJvY2Vzc2luZy9zcmMvY29tL2FuZHJvaWQvcnMvaW1hZ2UvdmVydGljYWxfYmx1ci5ycyBiL2xpYnMvcnMvamF2YS9JbWFnZVByb2Nlc3Npbmcvc3JjL2NvbS9hbmRyb2lkL3JzL2ltYWdlL3ZlcnRpY2FsX2JsdXIucnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDkwMWQyYQotLS0gL2Rldi9udWxsCisrKyBiL2xpYnMvcnMvamF2YS9JbWFnZVByb2Nlc3Npbmcvc3JjL2NvbS9hbmRyb2lkL3JzL2ltYWdlL3ZlcnRpY2FsX2JsdXIucnMKQEAgLTAsMCArMSw5MiBAQAorI3ByYWdtYSB2ZXJzaW9uKDEpCisKKyNpbmNsdWRlICJpcC5yc2giCisKK3N0YXRpYyBmbG9hdCBpbkJsYWNrOworc3RhdGljIGZsb2F0IG91dEJsYWNrOworc3RhdGljIGZsb2F0IGluV2hpdGU7CitzdGF0aWMgZmxvYXQgb3V0V2hpdGU7CitzdGF0aWMgZmxvYXQzIGdhbW1hOworc3RhdGljIGZsb2F0IHNhdHVyYXRpb247CisKK3N0YXRpYyBmbG9hdCBpbldNaW5JbkI7CitzdGF0aWMgZmxvYXQgb3V0V01pbk91dEI7CitzdGF0aWMgZmxvYXQgb3ZlckluV01pbkluQjsKK3N0YXRpYyByc19tYXRyaXgzeDMgY29sb3JNYXQ7CisKKyNwcmFnbWEgcnMgZXhwb3J0X2Z1bmMoc2V0TGV2ZWxzLCBzZXRTYXR1cmF0aW9uLCBzZXRHYW1tYSk7CisKK3ZvaWQgc2V0TGV2ZWxzKGZsb2F0IGlCbGssIGZsb2F0IG9CbGssIGZsb2F0IGlXaHQsIGZsb2F0IG9XaHQpIHsKKyAgICBpbkJsYWNrID0gaUJsazsKKyAgICBvdXRCbGFjayA9IG9CbGs7CisgICAgaW5XaGl0ZSA9IGlXaHQ7CisgICAgb3V0V2hpdGUgPSBvV2h0OworCisgICAgaW5XTWluSW5CID0gaW5XaGl0ZSAtIGluQmxhY2s7CisgICAgb3V0V01pbk91dEIgPSBvdXRXaGl0ZSAtIG91dEJsYWNrOworICAgIG92ZXJJbldNaW5JbkIgPSAxLmYgLyBpbldNaW5JbkI7Cit9CisKK3ZvaWQgc2V0U2F0dXJhdGlvbihmbG9hdCBzYXQpIHsKKyAgICBzYXR1cmF0aW9uID0gc2F0OworCisgICAgLy8gU2F0dXJhdGlvbgorICAgIC8vIExpbmVhciB3ZWlnaHRzCisgICAgLy9mbG9hdCByV2VpZ2h0ID0gMC4zMDg2ZjsKKyAgICAvL2Zsb2F0IGdXZWlnaHQgPSAwLjYwOTRmOworICAgIC8vZmxvYXQgYldlaWdodCA9IDAuMDgyMGY7CisKKyAgICAvLyBHYW1tYSAyLjIgd2VpZ2h0cyAod2UgaGF2ZW4ndCBjb252ZXJ0ZWQgb3VyIGltYWdlIHRvIGxpbmVhciBzcGFjZSB5ZXQgZm9yIHBlcmYgcmVhc29ucykKKyAgICBmbG9hdCByV2VpZ2h0ID0gMC4yOTlmOworICAgIGZsb2F0IGdXZWlnaHQgPSAwLjU4N2Y7CisgICAgZmxvYXQgYldlaWdodCA9IDAuMTE0ZjsKKworICAgIGZsb2F0IG9uZU1pbnVzUyA9IDEuMGYgLSBzYXR1cmF0aW9uOworICAgIHJzTWF0cml4U2V0KCZjb2xvck1hdCwgMCwgMCwgb25lTWludXNTICogcldlaWdodCArIHNhdHVyYXRpb24pOworICAgIHJzTWF0cml4U2V0KCZjb2xvck1hdCwgMCwgMSwgb25lTWludXNTICogcldlaWdodCk7CisgICAgcnNNYXRyaXhTZXQoJmNvbG9yTWF0LCAwLCAyLCBvbmVNaW51c1MgKiByV2VpZ2h0KTsKKyAgICByc01hdHJpeFNldCgmY29sb3JNYXQsIDEsIDAsIG9uZU1pbnVzUyAqIGdXZWlnaHQpOworICAgIHJzTWF0cml4U2V0KCZjb2xvck1hdCwgMSwgMSwgb25lTWludXNTICogZ1dlaWdodCArIHNhdHVyYXRpb24pOworICAgIHJzTWF0cml4U2V0KCZjb2xvck1hdCwgMSwgMiwgb25lTWludXNTICogZ1dlaWdodCk7CisgICAgcnNNYXRyaXhTZXQoJmNvbG9yTWF0LCAyLCAwLCBvbmVNaW51c1MgKiBiV2VpZ2h0KTsKKyAgICByc01hdHJpeFNldCgmY29sb3JNYXQsIDIsIDEsIG9uZU1pbnVzUyAqIGJXZWlnaHQpOworICAgIHJzTWF0cml4U2V0KCZjb2xvck1hdCwgMiwgMiwgb25lTWludXNTICogYldlaWdodCArIHNhdHVyYXRpb24pOworfQorCit2b2lkIHNldEdhbW1hKGZsb2F0IGcpIHsKKyAgICBnYW1tYSA9IChmbG9hdDMpZzsKK30KKwordm9pZCByb290KGNvbnN0IHZvaWQgKnZfaW4sIHZvaWQgKnZfb3V0LCBjb25zdCB2b2lkICp1c3JEYXRhLCB1aW50MzJfdCB4LCB1aW50MzJfdCB5KSB7CisgICAgdWNoYXI0ICpvdXRwdXQgPSAodWNoYXI0ICopdl9vdXQ7CisgICAgY29uc3QgRmlsdGVyU3RydWN0ICpmcyA9IChjb25zdCBGaWx0ZXJTdHJ1Y3QgKil1c3JEYXRhOworICAgIGNvbnN0IGZsb2F0NCAqaW5wdXQgPSAoY29uc3QgZmxvYXQ0ICopcnNHZXRFbGVtZW50QXQoZnMtPmFpbiwgeCwgMCk7CisKKyAgICBmbG9hdDMgYmx1cnJlZFBpeGVsID0gMDsKKyAgICBjb25zdCBmbG9hdCAqZ1B0ciA9IGZzLT5nYXVzc2lhbjsKKyAgICBpZiAoKHkgPiBmcy0+cmFkaXVzKSAmJiAoeSA8IChmcy0+aGVpZ2h0IC0gZnMtPnJhZGl1cykpKSB7CisgICAgICAgIGNvbnN0IGZsb2F0NCAqaSA9IGlucHV0ICsgKCh5IC0gZnMtPnJhZGl1cykgKiBmcy0+d2lkdGgpOworICAgICAgICBmb3IoaW50IHIgPSAtZnMtPnJhZGl1czsgciA8PSBmcy0+cmFkaXVzOyByICsrKSB7CisgICAgICAgICAgICBibHVycmVkUGl4ZWwgKz0gaS0+eHl6ICogZ1B0clswXTsKKyAgICAgICAgICAgIGdQdHIrKzsKKyAgICAgICAgICAgIGkgKz0gZnMtPndpZHRoOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgZm9yKGludCByID0gLWZzLT5yYWRpdXM7IHIgPD0gZnMtPnJhZGl1czsgciArKykgeworICAgICAgICAgICAgaW50IHZhbGlkSCA9IHJzQ2xhbXAoeSArIHIsICh1aW50KTAsICh1aW50KShmcy0+aGVpZ2h0IC0gMSkpOworICAgICAgICAgICAgY29uc3QgZmxvYXQ0ICppID0gaW5wdXQgKyB2YWxpZEggKiBmcy0+d2lkdGg7CisgICAgICAgICAgICBibHVycmVkUGl4ZWwgKz0gaS0+eHl6ICogZ1B0clswXTsKKyAgICAgICAgICAgIGdQdHIrKzsKKyAgICAgICAgfQorICAgIH0KKworICAgIGZsb2F0MyB0ZW1wID0gcnNNYXRyaXhNdWx0aXBseSgmY29sb3JNYXQsIGJsdXJyZWRQaXhlbCk7CisgICAgdGVtcCA9IChjbGFtcCh0ZW1wLCAwLmYsIDI1NS5mKSAtIGluQmxhY2spICogb3ZlckluV01pbkluQjsKKyAgICBpZiAoZ2FtbWEueCAhPSAxLjBmKQorICAgICAgICB0ZW1wID0gcG93KHRlbXAsIChmbG9hdDMpZ2FtbWEpOworICAgIHRlbXAgPSBjbGFtcCh0ZW1wICogb3V0V01pbk91dEIgKyBvdXRCbGFjaywgMC5mLCAyNTUuZik7CisKKyAgICBvdXRwdXQtPnh5eiA9IGNvbnZlcnRfdWNoYXIzKHRlbXApOworICAgIC8vb3V0cHV0LT53ID0gaW5wdXQtPnc7Cit9CisKZGlmZiAtLWdpdCBhL2xpYnMvcnMvamF2YS9Nb2RlbFZpZXdlci9BbmRyb2lkLm1rIGIvbGlicy9ycy9qYXZhL01vZGVsVmlld2VyL0FuZHJvaWQubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWZlNzdkNwotLS0gL2Rldi9udWxsCisrKyBiL2xpYnMvcnMvamF2YS9Nb2RlbFZpZXdlci9BbmRyb2lkLm1rCkBAIC0wLDAgKzEsMzEgQEAKKyMKKyMgQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKK2lmbmVxICgkKFRBUkdFVF9TSU1VTEFUT1IpLHRydWUpCisKK0xPQ0FMX1BBVEggOj0gJChjYWxsIG15LWRpcikKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorCitMT0NBTF9NT0RVTEVfVEFHUyA6PSBvcHRpb25hbAorCitMT0NBTF9TUkNfRklMRVMgOj0gJChjYWxsIGFsbC1qYXZhLWZpbGVzLXVuZGVyLCBzcmMpICQoY2FsbCBhbGwtcmVuZGVyc2NyaXB0LWZpbGVzLXVuZGVyLCBzcmMpCisjTE9DQUxfU1RBVElDX0pBVkFfTElCUkFSSUVTIDo9IGFuZHJvaWQucmVuZGVyc2NyaXB0CisKK0xPQ0FMX1BBQ0tBR0VfTkFNRSA6PSBNb2RlbFZpZXdlcgorCitpbmNsdWRlICQoQlVJTERfUEFDS0FHRSkKKworZW5kaWYKZGlmZiAtLWdpdCBhL2xpYnMvcnMvamF2YS9Nb2RlbFZpZXdlci9BbmRyb2lkTWFuaWZlc3QueG1sIGIvbGlicy9ycy9qYXZhL01vZGVsVmlld2VyL0FuZHJvaWRNYW5pZmVzdC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTU5ZmU1MwotLS0gL2Rldi9udWxsCisrKyBiL2xpYnMvcnMvamF2YS9Nb2RlbFZpZXdlci9BbmRyb2lkTWFuaWZlc3QueG1sCkBAIC0wLDAgKzEsMjMgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8bWFuaWZlc3QgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgIHBhY2thZ2U9ImNvbS5hbmRyb2lkLm1vZGVsdmlld2VyIj4KKyAgICA8YXBwbGljYXRpb24gYW5kcm9pZDpsYWJlbD0iTW9kZWxWaWV3ZXIiPgorICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSJTaW1wbGVNb2RlbCIKKyAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGFiZWw9IlNpbXBsZU1vZGVsIgorICAgICAgICAgICAgICAgICAgYW5kcm9pZDpzY3JlZW5PcmllbnRhdGlvbj0icG9ydHJhaXQiCisgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRoZW1lPSJAYW5kcm9pZDpzdHlsZS9UaGVtZS5CbGFjay5Ob1RpdGxlQmFyIj4KKyAgICAgICAgICAgIDxpbnRlbnQtZmlsdGVyPgorICAgICAgICAgICAgICAgIDxhY3Rpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5hY3Rpb24uTUFJTiIgLz4KKyAgICAgICAgICAgICAgICA8Y2F0ZWdvcnkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5jYXRlZ29yeS5MQVVOQ0hFUiIgLz4KKyAgICAgICAgICAgIDwvaW50ZW50LWZpbHRlcj4KKyAgICAgICAgPC9hY3Rpdml0eT4KKyAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iU2NlbmVHcmFwaCIKKyAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGFiZWw9IlNjZW5lR3JhcGgiCisgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRoZW1lPSJAYW5kcm9pZDpzdHlsZS9UaGVtZS5CbGFjay5Ob1RpdGxlQmFyIj4KKyAgICAgICAgICAgIDxpbnRlbnQtZmlsdGVyPgorICAgICAgICAgICAgICAgIDxhY3Rpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5hY3Rpb24uTUFJTiIgLz4KKyAgICAgICAgICAgICAgICA8Y2F0ZWdvcnkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5jYXRlZ29yeS5MQVVOQ0hFUiIgLz4KKyAgICAgICAgICAgIDwvaW50ZW50LWZpbHRlcj4KKyAgICAgICAgPC9hY3Rpdml0eT4KKyAgICA8L2FwcGxpY2F0aW9uPgorPC9tYW5pZmVzdD4KZGlmZiAtLWdpdCBhL2xpYnMvcnMvamF2YS9Nb2RlbFZpZXdlci9yZXMvZHJhd2FibGUvcm9ib3QucG5nIGIvbGlicy9ycy9qYXZhL01vZGVsVmlld2VyL3Jlcy9kcmF3YWJsZS9yb2JvdC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjczNTNmZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYnMvcnMvamF2YS9Nb2RlbFZpZXdlci9yZXMvZHJhd2FibGUvcm9ib3QucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYnMvcnMvamF2YS9Nb2RlbFZpZXdlci9yZXMvcmF3L3JvYm90LmEzZCBiL2xpYnMvcnMvamF2YS9Nb2RlbFZpZXdlci9yZXMvcmF3L3JvYm90LmEzZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNDg4OTVjCi0tLSAvZGV2L251bGwKKysrIGIvbGlicy9ycy9qYXZhL01vZGVsVmlld2VyL3Jlcy9yYXcvcm9ib3QuYTNkCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYnMvcnMvamF2YS9Nb2RlbFZpZXdlci9zcmMvY29tL2FuZHJvaWQvbW9kZWx2aWV3ZXIvU2NlbmVHcmFwaC5qYXZhIGIvbGlicy9ycy9qYXZhL01vZGVsVmlld2VyL3NyYy9jb20vYW5kcm9pZC9tb2RlbHZpZXdlci9TY2VuZUdyYXBoLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTU3ZTBjYwotLS0gL2Rldi9udWxsCisrKyBiL2xpYnMvcnMvamF2YS9Nb2RlbFZpZXdlci9zcmMvY29tL2FuZHJvaWQvbW9kZWx2aWV3ZXIvU2NlbmVHcmFwaC5qYXZhCkBAIC0wLDAgKzEsNzEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLm1vZGVsdmlld2VyOworCitpbXBvcnQgYW5kcm9pZC5yZW5kZXJzY3JpcHQuUlNTdXJmYWNlVmlldzsKK2ltcG9ydCBhbmRyb2lkLnJlbmRlcnNjcmlwdC5SZW5kZXJTY3JpcHQ7CisKK2ltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eTsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLkNvbmZpZ3VyYXRpb247CitpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CitpbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyOworaW1wb3J0IGFuZHJvaWQub3MuTG9vcGVyOworaW1wb3J0IGFuZHJvaWQub3MuTWVzc2FnZTsKK2ltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLlNldHRpbmdzLlN5c3RlbTsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuQ29uZmlnOworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CitpbXBvcnQgYW5kcm9pZC52aWV3Lk1lbnU7CitpbXBvcnQgYW5kcm9pZC52aWV3Lk1lbnVJdGVtOworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OworaW1wb3J0IGFuZHJvaWQudmlldy5XaW5kb3c7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuQnV0dG9uOworaW1wb3J0IGFuZHJvaWQud2lkZ2V0Lkxpc3RWaWV3OworCitpbXBvcnQgamF2YS5sYW5nLlJ1bnRpbWU7CisKK3B1YmxpYyBjbGFzcyBTY2VuZUdyYXBoIGV4dGVuZHMgQWN0aXZpdHkgeworCisgICAgcHJpdmF0ZSBTY2VuZUdyYXBoVmlldyBtVmlldzsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9uQ3JlYXRlKEJ1bmRsZSBpY2ljbGUpIHsKKyAgICAgICAgc3VwZXIub25DcmVhdGUoaWNpY2xlKTsKKworICAgICAgICAvLyBDcmVhdGUgb3VyIFByZXZpZXcgdmlldyBhbmQgc2V0IGl0IGFzIHRoZSBjb250ZW50IG9mIG91cgorICAgICAgICAvLyBBY3Rpdml0eQorICAgICAgICBtVmlldyA9IG5ldyBTY2VuZUdyYXBoVmlldyh0aGlzKTsKKyAgICAgICAgc2V0Q29udGVudFZpZXcobVZpZXcpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG9uUmVzdW1lKCkgeworICAgICAgICAvLyBJZGVhbGx5IGEgZ2FtZSBzaG91bGQgaW1wbGVtZW50IG9uUmVzdW1lKCkgYW5kIG9uUGF1c2UoKQorICAgICAgICAvLyB0byB0YWtlIGFwcHJvcHJpYXRlIGFjdGlvbiB3aGVuIHRoZSBhY3Rpdml0eSBsb29zZXMgZm9jdXMKKyAgICAgICAgc3VwZXIub25SZXN1bWUoKTsKKyAgICAgICAgbVZpZXcub25SZXN1bWUoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvblBhdXNlKCkgeworICAgICAgICAvLyBJZGVhbGx5IGEgZ2FtZSBzaG91bGQgaW1wbGVtZW50IG9uUmVzdW1lKCkgYW5kIG9uUGF1c2UoKQorICAgICAgICAvLyB0byB0YWtlIGFwcHJvcHJpYXRlIGFjdGlvbiB3aGVuIHRoZSBhY3Rpdml0eSBsb29zZXMgZm9jdXMKKyAgICAgICAgc3VwZXIub25QYXVzZSgpOworICAgICAgICBtVmlldy5vblBhdXNlKCk7CisgICAgfQorCit9CisKZGlmZiAtLWdpdCBhL2xpYnMvcnMvamF2YS9Nb2RlbFZpZXdlci9zcmMvY29tL2FuZHJvaWQvbW9kZWx2aWV3ZXIvU2NlbmVHcmFwaFJTLmphdmEgYi9saWJzL3JzL2phdmEvTW9kZWxWaWV3ZXIvc3JjL2NvbS9hbmRyb2lkL21vZGVsdmlld2VyL1NjZW5lR3JhcGhSUy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg1YzFkNDIKLS0tIC9kZXYvbnVsbAorKysgYi9saWJzL3JzL2phdmEvTW9kZWxWaWV3ZXIvc3JjL2NvbS9hbmRyb2lkL21vZGVsdmlld2VyL1NjZW5lR3JhcGhSUy5qYXZhCkBAIC0wLDAgKzEsMjE5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5tb2RlbHZpZXdlcjsKKworaW1wb3J0IGphdmEuaW8uV3JpdGVyOworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKKworaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuUmVzb3VyY2VzOworaW1wb3J0IGFuZHJvaWQucmVuZGVyc2NyaXB0Lio7CitpbXBvcnQgYW5kcm9pZC5yZW5kZXJzY3JpcHQuRWxlbWVudC5CdWlsZGVyOworaW1wb3J0IGFuZHJvaWQucmVuZGVyc2NyaXB0LlByb2dyYW1TdG9yZS5EZXB0aEZ1bmM7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKKworCitwdWJsaWMgY2xhc3MgU2NlbmVHcmFwaFJTIHsKKworICAgIHByaXZhdGUgZmluYWwgaW50IFNUQVRFX0xBU1RfRk9DVVMgPSAxOworCisgICAgaW50IG1XaWR0aDsKKyAgICBpbnQgbUhlaWdodDsKKyAgICBpbnQgbVJvdGF0aW9uOworCisgICAgcHVibGljIFNjZW5lR3JhcGhSUygpIHsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBpbml0KFJlbmRlclNjcmlwdEdMIHJzLCBSZXNvdXJjZXMgcmVzLCBpbnQgd2lkdGgsIGludCBoZWlnaHQpIHsKKyAgICAgICAgbVJTID0gcnM7CisgICAgICAgIG1SZXMgPSByZXM7CisgICAgICAgIG1XaWR0aCA9IHdpZHRoOworICAgICAgICBtSGVpZ2h0ID0gaGVpZ2h0OworICAgICAgICBtUm90YXRpb24gPSAwOworICAgICAgICBpbml0UlMoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIFJlc291cmNlcyBtUmVzOworICAgIHByaXZhdGUgUmVuZGVyU2NyaXB0R0wgbVJTOworICAgIHByaXZhdGUgU2FtcGxlciBtU2FtcGxlcjsKKyAgICBwcml2YXRlIFByb2dyYW1TdG9yZSBtUFNCYWNrZ3JvdW5kOworICAgIHByaXZhdGUgUHJvZ3JhbUZyYWdtZW50IG1QRkJhY2tncm91bmQ7CisgICAgcHJpdmF0ZSBQcm9ncmFtVmVydGV4IG1QVkJhY2tncm91bmQ7CisgICAgcHJpdmF0ZSBQcm9ncmFtVmVydGV4Lk1hdHJpeEFsbG9jYXRpb24gbVBWQTsKKworICAgIHByaXZhdGUgQWxsb2NhdGlvbiBtR3JpZEltYWdlOworICAgIHByaXZhdGUgQWxsb2NhdGlvbiBtQWxsb2NQVjsKKworICAgIHByaXZhdGUgTWVzaCBtTWVzaDsKKworICAgIHByaXZhdGUgRm9udCBtSXRhbGljOworICAgIHByaXZhdGUgQWxsb2NhdGlvbiBtVGV4dEFsbG9jOworCisgICAgcHJpdmF0ZSBTY3JpcHRDX1NjZW5lZ3JhcGggbVNjcmlwdDsKKyAgICBwcml2YXRlIFNjcmlwdENfVHJhbnNmb3JtIG1UcmFuc2Zvcm1TY3JpcHQ7CisKKyAgICBpbnQgbUxhc3RYOworICAgIGludCBtTGFzdFk7CisKKyAgICBwdWJsaWMgdm9pZCB0b3VjaEV2ZW50KGludCB4LCBpbnQgeSkgeworICAgICAgICBpbnQgZHggPSBtTGFzdFggLSB4OworICAgICAgICBpZihNYXRoLmFicyhkeCkgPiA1MCB8fCBNYXRoLmFicyhkeCkgPCAzKSB7CisgICAgICAgICAgICBkeCA9IDA7CisgICAgICAgIH0KKworICAgICAgICBtUm90YXRpb24gLT0gZHg7CisgICAgICAgIGlmKG1Sb3RhdGlvbiA+IDM2MCkgeworICAgICAgICAgICAgbVJvdGF0aW9uIC09IDM2MDsKKyAgICAgICAgfQorICAgICAgICBpZihtUm90YXRpb24gPCAwKSB7CisgICAgICAgICAgICBtUm90YXRpb24gKz0gMzYwOworICAgICAgICB9CisKKyAgICAgICAgbVNjcmlwdC5zZXRfZ1JvdGF0ZSgtKGZsb2F0KW1Sb3RhdGlvbik7CisKKyAgICAgICAgbUxhc3RYID0geDsKKyAgICAgICAgbUxhc3RZID0geTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgaW5pdFBGUygpIHsKKyAgICAgICAgUHJvZ3JhbVN0b3JlLkJ1aWxkZXIgYiA9IG5ldyBQcm9ncmFtU3RvcmUuQnVpbGRlcihtUlMpOworCisgICAgICAgIGIuc2V0RGVwdGhGdW5jKFByb2dyYW1TdG9yZS5EZXB0aEZ1bmMuTEVTUyk7CisgICAgICAgIGIuc2V0RGl0aGVyRW5hYmxlKGZhbHNlKTsKKyAgICAgICAgYi5zZXREZXB0aE1hc2sodHJ1ZSk7CisgICAgICAgIG1QU0JhY2tncm91bmQgPSBiLmNyZWF0ZSgpOworCisgICAgICAgIG1TY3JpcHQuc2V0X2dQRlNCYWNrZ3JvdW5kKG1QU0JhY2tncm91bmQpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBpbml0UEYoKSB7CisgICAgICAgIFNhbXBsZXIuQnVpbGRlciBicyA9IG5ldyBTYW1wbGVyLkJ1aWxkZXIobVJTKTsKKyAgICAgICAgYnMuc2V0TWluKFNhbXBsZXIuVmFsdWUuTElORUFSKTsKKyAgICAgICAgYnMuc2V0TWFnKFNhbXBsZXIuVmFsdWUuTElORUFSKTsKKyAgICAgICAgYnMuc2V0V3JhcFMoU2FtcGxlci5WYWx1ZS5DTEFNUCk7CisgICAgICAgIGJzLnNldFdyYXBUKFNhbXBsZXIuVmFsdWUuQ0xBTVApOworICAgICAgICBtU2FtcGxlciA9IGJzLmNyZWF0ZSgpOworCisgICAgICAgIFByb2dyYW1GcmFnbWVudC5CdWlsZGVyIGIgPSBuZXcgUHJvZ3JhbUZyYWdtZW50LkJ1aWxkZXIobVJTKTsKKyAgICAgICAgYi5zZXRUZXh0dXJlKFByb2dyYW1GcmFnbWVudC5CdWlsZGVyLkVudk1vZGUuUkVQTEFDRSwKKyAgICAgICAgICAgICAgICAgICAgIFByb2dyYW1GcmFnbWVudC5CdWlsZGVyLkZvcm1hdC5SR0JBLCAwKTsKKyAgICAgICAgbVBGQmFja2dyb3VuZCA9IGIuY3JlYXRlKCk7CisgICAgICAgIG1QRkJhY2tncm91bmQuYmluZFNhbXBsZXIobVNhbXBsZXIsIDApOworCisgICAgICAgIG1TY3JpcHQuc2V0X2dQRkJhY2tncm91bmQobVBGQmFja2dyb3VuZCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGluaXRQVigpIHsKKyAgICAgICAgUHJvZ3JhbVZlcnRleC5CdWlsZGVyIHB2YiA9IG5ldyBQcm9ncmFtVmVydGV4LkJ1aWxkZXIobVJTKTsKKyAgICAgICAgbVBWQmFja2dyb3VuZCA9IHB2Yi5jcmVhdGUoKTsKKworICAgICAgICBtUFZBID0gbmV3IFByb2dyYW1WZXJ0ZXguTWF0cml4QWxsb2NhdGlvbihtUlMpOworICAgICAgICBtUFZCYWNrZ3JvdW5kLmJpbmRBbGxvY2F0aW9uKG1QVkEpOworCisgICAgICAgIG1TY3JpcHQuc2V0X2dQVkJhY2tncm91bmQobVBWQmFja2dyb3VuZCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGxvYWRJbWFnZSgpIHsKKyAgICAgICAgbUdyaWRJbWFnZSA9IEFsbG9jYXRpb24uY3JlYXRlRnJvbUJpdG1hcFJlc291cmNlQm94ZWQobVJTLCBtUmVzLCBSLmRyYXdhYmxlLnJvYm90LCBFbGVtZW50LlJHQl81NjUobVJTKSwgdHJ1ZSk7CisgICAgICAgIG1HcmlkSW1hZ2UudXBsb2FkVG9UZXh0dXJlKDApOworCisgICAgICAgIG1TY3JpcHQuc2V0X2dUR3JpZChtR3JpZEltYWdlKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgaW5pdFRleHRBbGxvY2F0aW9uKCkgeworICAgICAgICBTdHJpbmcgYWxsb2NTdHJpbmcgPSAiRGlzcGxheWluZyBmaWxlOiBSLnJhdy5yb2JvdCI7CisgICAgICAgIG1UZXh0QWxsb2MgPSBBbGxvY2F0aW9uLmNyZWF0ZUZyb21TdHJpbmcobVJTLCBhbGxvY1N0cmluZyk7CisgICAgICAgIG1TY3JpcHQuc2V0X2dUZXh0QWxsb2MobVRleHRBbGxvYyk7CisgICAgfQorCisgICAgU2dUcmFuc2Zvcm0gbVJvb3RUcmFuc2Zvcm07CisgICAgU2dUcmFuc2Zvcm0gbUdyb3VwMTsKKworICAgIFNnVHJhbnNmb3JtIG1Sb2JvdDE7CisgICAgU2dUcmFuc2Zvcm0gbVJvYm90MjsKKworICAgIHZvaWQgaW5pdFRyYW5zZm9ybUhpZXJhcmNoeSgpIHsKKyAgICAgICAgbVJvb3RUcmFuc2Zvcm0gPSBuZXcgU2dUcmFuc2Zvcm0obVJTKTsKKworICAgICAgICBtR3JvdXAxID0gbmV3IFNnVHJhbnNmb3JtKG1SUyk7CisgICAgICAgIG1Sb290VHJhbnNmb3JtLmFkZENoaWxkKG1Hcm91cDEpOworCisgICAgICAgIG1Sb2JvdDEgPSBuZXcgU2dUcmFuc2Zvcm0obVJTKTsKKyAgICAgICAgbVJvYm90MiA9IG5ldyBTZ1RyYW5zZm9ybShtUlMpOworCisgICAgICAgIG1Hcm91cDEuYWRkQ2hpbGQobVJvYm90MSk7CisgICAgICAgIG1Hcm91cDEuYWRkQ2hpbGQobVJvYm90Mik7CisKKyAgICAgICAgbUdyb3VwMS5zZXRUcmFuc2Zvcm0oMCwgbmV3IEZsb2F0NCgwLjBmLCAwLjBmLCAtMTUuMGYsIDAuMGYpLCBUcmFuc2Zvcm1UeXBlLlRSQU5TTEFURSk7CisgICAgICAgIG1Hcm91cDEuc2V0VHJhbnNmb3JtKDEsIG5ldyBGbG9hdDQoMC4wZiwgMS4wZiwgMC4wZiwgMTUuMGYpLCBUcmFuc2Zvcm1UeXBlLlJPVEFURSk7CisKKyAgICAgICAgbVJvYm90MS5zZXRUcmFuc2Zvcm0oMCwgbmV3IEZsb2F0NCgtMy4wZiwgLTAuNWYsIDAuMGYsIDAuMGYpLCBUcmFuc2Zvcm1UeXBlLlRSQU5TTEFURSk7CisgICAgICAgIG1Sb2JvdDEuc2V0VHJhbnNmb3JtKDEsIG5ldyBGbG9hdDQoMC4wZiwgMS4wZiwgMC4wZiwgMjAuMGYpLCBUcmFuc2Zvcm1UeXBlLlJPVEFURSk7CisgICAgICAgIG1Sb2JvdDEuc2V0VHJhbnNmb3JtKDIsIG5ldyBGbG9hdDQoMC4yZiwgMC4yZiwgMC4yZiwgMC4wZiksIFRyYW5zZm9ybVR5cGUuU0NBTEUpOworCisgICAgICAgIG1Sb2JvdDIuc2V0VHJhbnNmb3JtKDAsIG5ldyBGbG9hdDQoMy4wZiwgMC4wZiwgMC4wZiwgMC4wZiksIFRyYW5zZm9ybVR5cGUuVFJBTlNMQVRFKTsKKyAgICAgICAgbVJvYm90Mi5zZXRUcmFuc2Zvcm0oMSwgbmV3IEZsb2F0NCgwLjBmLCAxLjBmLCAwLjBmLCAtMjAuMGYpLCBUcmFuc2Zvcm1UeXBlLlJPVEFURSk7CisgICAgICAgIG1Sb2JvdDIuc2V0VHJhbnNmb3JtKDIsIG5ldyBGbG9hdDQoMC4zZiwgMC4zZiwgMC4zZiwgMC4wZiksIFRyYW5zZm9ybVR5cGUuU0NBTEUpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBpbml0UlMoKSB7CisKKyAgICAgICAgbVNjcmlwdCA9IG5ldyBTY3JpcHRDX1NjZW5lZ3JhcGgobVJTLCBtUmVzLCBSLnJhdy5zY2VuZWdyYXBoLCB0cnVlKTsKKyAgICAgICAgbVRyYW5zZm9ybVNjcmlwdCA9IG5ldyBTY3JpcHRDX1RyYW5zZm9ybShtUlMsIG1SZXMsIFIucmF3LnRyYW5zZm9ybSwgZmFsc2UpOworICAgICAgICBtVHJhbnNmb3JtU2NyaXB0LnNldF90cmFuc2Zvcm1TY3JpcHQobVRyYW5zZm9ybVNjcmlwdCk7CisKKyAgICAgICAgbVNjcmlwdC5zZXRfZ1RyYW5zZm9ybVJTKG1UcmFuc2Zvcm1TY3JpcHQpOworCisgICAgICAgIGluaXRQRlMoKTsKKyAgICAgICAgaW5pdFBGKCk7CisgICAgICAgIGluaXRQVigpOworCisgICAgICAgIGxvYWRJbWFnZSgpOworCisgICAgICAgIEZpbGVBM0QgbW9kZWwgPSBGaWxlQTNELmNyZWF0ZUZyb21SZXNvdXJjZShtUlMsIG1SZXMsIFIucmF3LnJvYm90KTsKKyAgICAgICAgRmlsZUEzRC5JbmRleEVudHJ5IGVudHJ5ID0gbW9kZWwuZ2V0SW5kZXhFbnRyeSgwKTsKKyAgICAgICAgaWYoZW50cnkgPT0gbnVsbCB8fCBlbnRyeS5nZXRDbGFzc0lEKCkgIT0gRmlsZUEzRC5DbGFzc0lELk1FU0gpIHsKKyAgICAgICAgICAgIExvZy5lKCJycyIsICJjb3VsZCBub3QgbG9hZCBtb2RlbCIpOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgbU1lc2ggPSAoTWVzaCllbnRyeS5nZXRPYmplY3QoKTsKKyAgICAgICAgICAgIG1TY3JpcHQuc2V0X2dUZXN0TWVzaChtTWVzaCk7CisgICAgICAgIH0KKworICAgICAgICBtSXRhbGljID0gRm9udC5jcmVhdGUobVJTLCBtUmVzLCAiRHJvaWRTZXJpZi1JdGFsaWMudHRmIiwgOCk7CisgICAgICAgIG1TY3JpcHQuc2V0X2dJdGFsaWMobUl0YWxpYyk7CisKKyAgICAgICAgaW5pdFRleHRBbGxvY2F0aW9uKCk7CisKKyAgICAgICAgaW5pdFRyYW5zZm9ybUhpZXJhcmNoeSgpOworCisgICAgICAgIExvZy52KCI9PT09PT09PVNjZW5lR3JhcGg9PT09PT09PSIsICJ0cmFuc2Zvcm0gaGllcmFyY2h5IGluaXRpYWxpemVkIik7CisKKyAgICAgICAgbVNjcmlwdC5iaW5kX2dSb290Tm9kZShtUm9vdFRyYW5zZm9ybS5nZXRGaWVsZCgpKTsKKworICAgICAgICBtU2NyaXB0LmJpbmRfZ0dyb3VwKG1Hcm91cDEubVBhcmVudC5tQ2hpbGRGaWVsZCk7CisgICAgICAgIG1TY3JpcHQuYmluZF9nUm9ib3QxKG1Sb2JvdDEubVBhcmVudC5tQ2hpbGRGaWVsZCk7CisgICAgICAgIG1TY3JpcHQuc2V0X2dSb2JvdDFJbmRleChtUm9ib3QxLm1JbmRleEluUGFyZW50R3JvdXApOworICAgICAgICBtU2NyaXB0LmJpbmRfZ1JvYm90MihtUm9ib3QyLm1QYXJlbnQubUNoaWxkRmllbGQpOworICAgICAgICBtU2NyaXB0LnNldF9nUm9ib3QySW5kZXgobVJvYm90Mi5tSW5kZXhJblBhcmVudEdyb3VwKTsKKworICAgICAgICBtUlMuY29udGV4dEJpbmRSb290U2NyaXB0KG1TY3JpcHQpOworICAgIH0KK30KKworCisKZGlmZiAtLWdpdCBhL2xpYnMvcnMvamF2YS9Nb2RlbFZpZXdlci9zcmMvY29tL2FuZHJvaWQvbW9kZWx2aWV3ZXIvU2NlbmVHcmFwaFZpZXcuamF2YSBiL2xpYnMvcnMvamF2YS9Nb2RlbFZpZXdlci9zcmMvY29tL2FuZHJvaWQvbW9kZWx2aWV3ZXIvU2NlbmVHcmFwaFZpZXcuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NGE1OWIyCi0tLSAvZGV2L251bGwKKysrIGIvbGlicy9ycy9qYXZhL01vZGVsVmlld2VyL3NyYy9jb20vYW5kcm9pZC9tb2RlbHZpZXdlci9TY2VuZUdyYXBoVmlldy5qYXZhCkBAIC0wLDAgKzEsOTQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLm1vZGVsdmlld2VyOworCitpbXBvcnQgamF2YS5pby5Xcml0ZXI7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5TZW1hcGhvcmU7CisKK2ltcG9ydCBhbmRyb2lkLnJlbmRlcnNjcmlwdC5SU1N1cmZhY2VWaWV3OworaW1wb3J0IGFuZHJvaWQucmVuZGVyc2NyaXB0LlJlbmRlclNjcmlwdDsKK2ltcG9ydCBhbmRyb2lkLnJlbmRlcnNjcmlwdC5SZW5kZXJTY3JpcHRHTDsKKworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuUmVzb3VyY2VzOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuQml0bWFwRHJhd2FibGU7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZTsKK2ltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5NZXNzYWdlOworaW1wb3J0IGFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQ7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuU3VyZmFjZTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuU3VyZmFjZUhvbGRlcjsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuU3VyZmFjZVZpZXc7CitpbXBvcnQgYW5kcm9pZC52aWV3LktleUV2ZW50OworaW1wb3J0IGFuZHJvaWQudmlldy5Nb3Rpb25FdmVudDsKKworcHVibGljIGNsYXNzIFNjZW5lR3JhcGhWaWV3IGV4dGVuZHMgUlNTdXJmYWNlVmlldyB7CisKKyAgICBwdWJsaWMgU2NlbmVHcmFwaFZpZXcoQ29udGV4dCBjb250ZXh0KSB7CisgICAgICAgIHN1cGVyKGNvbnRleHQpOworICAgICAgICAvL3NldEZvY3VzYWJsZSh0cnVlKTsKKyAgICB9CisKKyAgICBwcml2YXRlIFJlbmRlclNjcmlwdEdMIG1SUzsKKyAgICBwcml2YXRlIFNjZW5lR3JhcGhSUyBtUmVuZGVyOworCisKKyAgICBwdWJsaWMgdm9pZCBzdXJmYWNlQ2hhbmdlZChTdXJmYWNlSG9sZGVyIGhvbGRlciwgaW50IGZvcm1hdCwgaW50IHcsIGludCBoKSB7CisgICAgICAgIHN1cGVyLnN1cmZhY2VDaGFuZ2VkKGhvbGRlciwgZm9ybWF0LCB3LCBoKTsKKyAgICAgICAgaWYgKG1SUyA9PSBudWxsKSB7CisgICAgICAgICAgICBtUlMgPSBjcmVhdGVSZW5kZXJTY3JpcHQodHJ1ZSk7CisgICAgICAgICAgICBtUlMuY29udGV4dFNldFN1cmZhY2UodywgaCwgaG9sZGVyLmdldFN1cmZhY2UoKSk7CisgICAgICAgICAgICBtUmVuZGVyID0gbmV3IFNjZW5lR3JhcGhSUygpOworICAgICAgICAgICAgbVJlbmRlci5pbml0KG1SUywgZ2V0UmVzb3VyY2VzKCksIHcsIGgpOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25EZXRhY2hlZEZyb21XaW5kb3coKSB7CisgICAgICAgIGlmKG1SUyAhPSBudWxsKSB7CisgICAgICAgICAgICBtUlMgPSBudWxsOworICAgICAgICAgICAgZGVzdHJveVJlbmRlclNjcmlwdCgpOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gb25LZXlEb3duKGludCBrZXlDb2RlLCBLZXlFdmVudCBldmVudCkKKyAgICB7CisgICAgICAgIC8vIGJyZWFrIHBvaW50IGF0IGhlcmUKKyAgICAgICAgLy8gdGhpcyBtZXRob2QgZG9lc24ndCB3b3JrIHdoZW4gJ2V4dGVuZHMgVmlldycgaW5jbHVkZSAnZXh0ZW5kcyBTY3JvbGxWaWV3Jy4KKyAgICAgICAgcmV0dXJuIHN1cGVyLm9uS2V5RG93bihrZXlDb2RlLCBldmVudCk7CisgICAgfQorCisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBvblRvdWNoRXZlbnQoTW90aW9uRXZlbnQgZXYpCisgICAgeworICAgICAgICBib29sZWFuIHJldCA9IHRydWU7CisgICAgICAgIGludCBhY3QgPSBldi5nZXRBY3Rpb24oKTsKKyAgICAgICAgaWYgKGFjdCA9PSBldi5BQ1RJT05fVVApIHsKKyAgICAgICAgICAgIHJldCA9IGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgbVJlbmRlci50b3VjaEV2ZW50KChpbnQpZXYuZ2V0WCgpLCAoaW50KWV2LmdldFkoKSk7CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorfQorCisKZGlmZiAtLWdpdCBhL2xpYnMvcnMvamF2YS9Nb2RlbFZpZXdlci9zcmMvY29tL2FuZHJvaWQvbW9kZWx2aWV3ZXIvU2dUcmFuc2Zvcm0uamF2YSBiL2xpYnMvcnMvamF2YS9Nb2RlbFZpZXdlci9zcmMvY29tL2FuZHJvaWQvbW9kZWx2aWV3ZXIvU2dUcmFuc2Zvcm0uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNzBlODExCi0tLSAvZGV2L251bGwKKysrIGIvbGlicy9ycy9qYXZhL01vZGVsVmlld2VyL3NyYy9jb20vYW5kcm9pZC9tb2RlbHZpZXdlci9TZ1RyYW5zZm9ybS5qYXZhCkBAIC0wLDAgKzEsMTU4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5tb2RlbHZpZXdlcjsKKworaW1wb3J0IGphdmEuaW8uV3JpdGVyOworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKKworaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuUmVzb3VyY2VzOworaW1wb3J0IGFuZHJvaWQucmVuZGVyc2NyaXB0Lio7CitpbXBvcnQgYW5kcm9pZC5yZW5kZXJzY3JpcHQuRWxlbWVudC5CdWlsZGVyOworaW1wb3J0IGFuZHJvaWQucmVuZGVyc2NyaXB0LlByb2dyYW1TdG9yZS5EZXB0aEZ1bmM7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKKworZW51bSBUcmFuc2Zvcm1UeXBlIHsKKworICAgIE5PTkUoMCksCisgICAgVFJBTlNMQVRFKDEpLAorICAgIFJPVEFURSgyKSwKKyAgICBTQ0FMRSgzKTsKKworICAgIGludCBtSUQ7CisgICAgVHJhbnNmb3JtVHlwZShpbnQgaWQpIHsKKyAgICAgICAgbUlEID0gaWQ7CisgICAgfQorfQorCitwdWJsaWMgY2xhc3MgU2dUcmFuc2Zvcm0geworCisKKyAgICBTY3JpcHRGaWVsZF9TZ1RyYW5zZm9ybSBtVHJhbnNmb3JtRmllbGQ7CisgICAgU2NyaXB0RmllbGRfU2dUcmFuc2Zvcm0gbUNoaWxkRmllbGQ7CisgICAgcHVibGljIFNjcmlwdEZpZWxkX1NnVHJhbnNmb3JtLkl0ZW0gbVRyYW5zZm9ybURhdGE7CisKKyAgICBGbG9hdDRbXSBtVHJhbnNmb3JtczsKKyAgICBUcmFuc2Zvcm1UeXBlW10gbVRyYW5zZm9ybVR5cGVzOworCisgICAgUmVuZGVyU2NyaXB0IG1SUzsKKworICAgIFZlY3RvciBtQ2hpbGRyZW47CisgICAgU2dUcmFuc2Zvcm0gbVBhcmVudDsKKyAgICBpbnQgbUluZGV4SW5QYXJlbnRHcm91cDsKKworICAgIHB1YmxpYyB2b2lkIHNldFBhcmVudChTZ1RyYW5zZm9ybSBwYXJlbnQsIGludCBwYXJlbnRJbmRleCkgeworICAgICAgICBtUGFyZW50ID0gcGFyZW50OworICAgICAgICBtSW5kZXhJblBhcmVudEdyb3VwID0gcGFyZW50SW5kZXg7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgYWRkQ2hpbGQoU2dUcmFuc2Zvcm0gY2hpbGQpIHsKKyAgICAgICAgbUNoaWxkcmVuLmFkZChjaGlsZCk7CisgICAgICAgIGNoaWxkLnNldFBhcmVudCh0aGlzLCBtQ2hpbGRyZW4uc2l6ZSgpIC0gMSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0VHJhbnNmb3JtKGludCBpbmRleCwgRmxvYXQ0IHZhbHVlLCBUcmFuc2Zvcm1UeXBlIHR5cGUpIHsKKyAgICAgICAgbVRyYW5zZm9ybXNbaW5kZXhdID0gdmFsdWU7CisgICAgICAgIG1UcmFuc2Zvcm1UeXBlc1tpbmRleF0gPSB0eXBlOworICAgIH0KKworICAgIHZvaWQgaW5pdERhdGEoKSB7CisgICAgICAgIGludCBudW1UcmFuc2Zvcm1zID0gMTY7CisgICAgICAgIG1UcmFuc2Zvcm1zID0gbmV3IEZsb2F0NFtudW1UcmFuc2Zvcm1zXTsKKyAgICAgICAgbVRyYW5zZm9ybVR5cGVzID0gbmV3IFRyYW5zZm9ybVR5cGVbbnVtVHJhbnNmb3Jtc107CisgICAgICAgIGZvcihpbnQgaSA9IDA7IGkgPCBudW1UcmFuc2Zvcm1zOyBpICsrKSB7CisgICAgICAgICAgICBtVHJhbnNmb3Jtc1tpXSA9IG5ldyBGbG9hdDQoMCwgMCwgMCwgMCk7CisgICAgICAgICAgICBtVHJhbnNmb3JtVHlwZXNbaV0gPSBUcmFuc2Zvcm1UeXBlLk5PTkU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICB2b2lkIHNldERhdGEoKSB7CisKKyAgICAgICAgbVRyYW5zZm9ybURhdGEuZ2xvYmFsTWF0ID0gbmV3IE1hdHJpeDRmKCk7CisgICAgICAgIG1UcmFuc2Zvcm1EYXRhLmxvY2FsTWF0ID0gbmV3IE1hdHJpeDRmKCk7CisKKyAgICAgICAgbVRyYW5zZm9ybURhdGEudHJhbnNmb3JtczAgPSBtVHJhbnNmb3Jtc1swXTsKKyAgICAgICAgbVRyYW5zZm9ybURhdGEudHJhbnNmb3JtczEgPSBtVHJhbnNmb3Jtc1sxXTsKKyAgICAgICAgbVRyYW5zZm9ybURhdGEudHJhbnNmb3JtczIgPSBtVHJhbnNmb3Jtc1syXTsKKyAgICAgICAgbVRyYW5zZm9ybURhdGEudHJhbnNmb3JtczMgPSBtVHJhbnNmb3Jtc1szXTsKKyAgICAgICAgbVRyYW5zZm9ybURhdGEudHJhbnNmb3JtczQgPSBtVHJhbnNmb3Jtc1s0XTsKKyAgICAgICAgbVRyYW5zZm9ybURhdGEudHJhbnNmb3JtczUgPSBtVHJhbnNmb3Jtc1s1XTsKKyAgICAgICAgbVRyYW5zZm9ybURhdGEudHJhbnNmb3JtczYgPSBtVHJhbnNmb3Jtc1s2XTsKKyAgICAgICAgbVRyYW5zZm9ybURhdGEudHJhbnNmb3JtczcgPSBtVHJhbnNmb3Jtc1s3XTsKKyAgICAgICAgbVRyYW5zZm9ybURhdGEudHJhbnNmb3JtczggPSBtVHJhbnNmb3Jtc1s4XTsKKyAgICAgICAgbVRyYW5zZm9ybURhdGEudHJhbnNmb3JtczkgPSBtVHJhbnNmb3Jtc1s5XTsKKyAgICAgICAgbVRyYW5zZm9ybURhdGEudHJhbnNmb3JtczEwID0gbVRyYW5zZm9ybXNbMTBdOworICAgICAgICBtVHJhbnNmb3JtRGF0YS50cmFuc2Zvcm1zMTEgPSBtVHJhbnNmb3Jtc1sxMV07CisgICAgICAgIG1UcmFuc2Zvcm1EYXRhLnRyYW5zZm9ybXMxMiA9IG1UcmFuc2Zvcm1zWzEyXTsKKyAgICAgICAgbVRyYW5zZm9ybURhdGEudHJhbnNmb3JtczEzID0gbVRyYW5zZm9ybXNbMTNdOworICAgICAgICBtVHJhbnNmb3JtRGF0YS50cmFuc2Zvcm1zMTQgPSBtVHJhbnNmb3Jtc1sxNF07CisgICAgICAgIG1UcmFuc2Zvcm1EYXRhLnRyYW5zZm9ybXMxNSA9IG1UcmFuc2Zvcm1zWzE1XTsKKworICAgICAgICBtVHJhbnNmb3JtRGF0YS50cmFuc2Zvcm1UeXBlMCA9IG1UcmFuc2Zvcm1UeXBlc1swXS5tSUQ7CisgICAgICAgIG1UcmFuc2Zvcm1EYXRhLnRyYW5zZm9ybVR5cGUxID0gbVRyYW5zZm9ybVR5cGVzWzFdLm1JRDsKKyAgICAgICAgbVRyYW5zZm9ybURhdGEudHJhbnNmb3JtVHlwZTIgPSBtVHJhbnNmb3JtVHlwZXNbMl0ubUlEOworICAgICAgICBtVHJhbnNmb3JtRGF0YS50cmFuc2Zvcm1UeXBlMyA9IG1UcmFuc2Zvcm1UeXBlc1szXS5tSUQ7CisgICAgICAgIG1UcmFuc2Zvcm1EYXRhLnRyYW5zZm9ybVR5cGU0ID0gbVRyYW5zZm9ybVR5cGVzWzRdLm1JRDsKKyAgICAgICAgbVRyYW5zZm9ybURhdGEudHJhbnNmb3JtVHlwZTUgPSBtVHJhbnNmb3JtVHlwZXNbNV0ubUlEOworICAgICAgICBtVHJhbnNmb3JtRGF0YS50cmFuc2Zvcm1UeXBlNiA9IG1UcmFuc2Zvcm1UeXBlc1s2XS5tSUQ7CisgICAgICAgIG1UcmFuc2Zvcm1EYXRhLnRyYW5zZm9ybVR5cGU3ID0gbVRyYW5zZm9ybVR5cGVzWzddLm1JRDsKKyAgICAgICAgbVRyYW5zZm9ybURhdGEudHJhbnNmb3JtVHlwZTggPSBtVHJhbnNmb3JtVHlwZXNbOF0ubUlEOworICAgICAgICBtVHJhbnNmb3JtRGF0YS50cmFuc2Zvcm1UeXBlOSA9IG1UcmFuc2Zvcm1UeXBlc1s5XS5tSUQ7CisgICAgICAgIG1UcmFuc2Zvcm1EYXRhLnRyYW5zZm9ybVR5cGUxMCA9IG1UcmFuc2Zvcm1UeXBlc1sxMF0ubUlEOworICAgICAgICBtVHJhbnNmb3JtRGF0YS50cmFuc2Zvcm1UeXBlMTEgPSBtVHJhbnNmb3JtVHlwZXNbMTFdLm1JRDsKKyAgICAgICAgbVRyYW5zZm9ybURhdGEudHJhbnNmb3JtVHlwZTEyID0gbVRyYW5zZm9ybVR5cGVzWzEyXS5tSUQ7CisgICAgICAgIG1UcmFuc2Zvcm1EYXRhLnRyYW5zZm9ybVR5cGUxMyA9IG1UcmFuc2Zvcm1UeXBlc1sxM10ubUlEOworICAgICAgICBtVHJhbnNmb3JtRGF0YS50cmFuc2Zvcm1UeXBlMTQgPSBtVHJhbnNmb3JtVHlwZXNbMTRdLm1JRDsKKyAgICAgICAgbVRyYW5zZm9ybURhdGEudHJhbnNmb3JtVHlwZTE1ID0gbVRyYW5zZm9ybVR5cGVzWzE1XS5tSUQ7CisKKyAgICAgICAgbVRyYW5zZm9ybURhdGEuaXNEaXJ0eSA9IDE7CisgICAgICAgIG1UcmFuc2Zvcm1EYXRhLmNoaWxkcmVuID0gbnVsbDsKKworICAgIH0KKworICAgIHB1YmxpYyBTZ1RyYW5zZm9ybShSZW5kZXJTY3JpcHQgcnMpIHsKKyAgICAgICAgbVJTID0gcnM7CisgICAgICAgIG1UcmFuc2Zvcm1EYXRhID0gbmV3IFNjcmlwdEZpZWxkX1NnVHJhbnNmb3JtLkl0ZW0oKTsKKyAgICAgICAgbUNoaWxkcmVuID0gbmV3IFZlY3RvcigpOworICAgICAgICBpbml0RGF0YSgpOworICAgIH0KKworICAgIHB1YmxpYyBTY3JpcHRGaWVsZF9TZ1RyYW5zZm9ybS5JdGVtIGdldERhdGEoKSB7CisgICAgICAgIHNldERhdGEoKTsKKyAgICAgICAgaWYobUNoaWxkcmVuLnNpemUoKSAhPSAwKSB7CisgICAgICAgICAgICBtQ2hpbGRGaWVsZCA9IG5ldyBTY3JpcHRGaWVsZF9TZ1RyYW5zZm9ybShtUlMsIG1DaGlsZHJlbi5zaXplKCkpOworICAgICAgICAgICAgbVRyYW5zZm9ybURhdGEuY2hpbGRyZW4gPSBtQ2hpbGRGaWVsZC5nZXRBbGxvY2F0aW9uKCk7CisKKyAgICAgICAgICAgIGZvcihpbnQgaSA9IDA7IGkgPCBtQ2hpbGRyZW4uc2l6ZSgpOyBpICsrKSB7CisgICAgICAgICAgICAgICAgU2dUcmFuc2Zvcm0gY2hpbGQgPSAoU2dUcmFuc2Zvcm0pbUNoaWxkcmVuLmdldChpKTsKKyAgICAgICAgICAgICAgICBtQ2hpbGRGaWVsZC5zZXQoY2hpbGQuZ2V0RGF0YSgpLCBpLCBmYWxzZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtQ2hpbGRGaWVsZC5jb3B5QWxsKCk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gbVRyYW5zZm9ybURhdGE7CisgICAgfQorCisgICAgcHVibGljIFNjcmlwdEZpZWxkX1NnVHJhbnNmb3JtIGdldEZpZWxkKCkgeworICAgICAgICBtVHJhbnNmb3JtRmllbGQgPSBuZXcgU2NyaXB0RmllbGRfU2dUcmFuc2Zvcm0obVJTLCAxKTsKKyAgICAgICAgbVRyYW5zZm9ybUZpZWxkLnNldChnZXREYXRhKCksIDAsIHRydWUpOworICAgICAgICByZXR1cm4gbVRyYW5zZm9ybUZpZWxkOworICAgIH0KK30KKworCisKZGlmZiAtLWdpdCBhL2xpYnMvcnMvamF2YS9Nb2RlbFZpZXdlci9zcmMvY29tL2FuZHJvaWQvbW9kZWx2aWV3ZXIvU2ltcGxlTW9kZWwuamF2YSBiL2xpYnMvcnMvamF2YS9Nb2RlbFZpZXdlci9zcmMvY29tL2FuZHJvaWQvbW9kZWx2aWV3ZXIvU2ltcGxlTW9kZWwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYjdjMzljCi0tLSAvZGV2L251bGwKKysrIGIvbGlicy9ycy9qYXZhL01vZGVsVmlld2VyL3NyYy9jb20vYW5kcm9pZC9tb2RlbHZpZXdlci9TaW1wbGVNb2RlbC5qYXZhCkBAIC0wLDAgKzEsNzEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLm1vZGVsdmlld2VyOworCitpbXBvcnQgYW5kcm9pZC5yZW5kZXJzY3JpcHQuUlNTdXJmYWNlVmlldzsKK2ltcG9ydCBhbmRyb2lkLnJlbmRlcnNjcmlwdC5SZW5kZXJTY3JpcHQ7CisKK2ltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eTsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLkNvbmZpZ3VyYXRpb247CitpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CitpbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyOworaW1wb3J0IGFuZHJvaWQub3MuTG9vcGVyOworaW1wb3J0IGFuZHJvaWQub3MuTWVzc2FnZTsKK2ltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLlNldHRpbmdzLlN5c3RlbTsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuQ29uZmlnOworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CitpbXBvcnQgYW5kcm9pZC52aWV3Lk1lbnU7CitpbXBvcnQgYW5kcm9pZC52aWV3Lk1lbnVJdGVtOworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OworaW1wb3J0IGFuZHJvaWQudmlldy5XaW5kb3c7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuQnV0dG9uOworaW1wb3J0IGFuZHJvaWQud2lkZ2V0Lkxpc3RWaWV3OworCitpbXBvcnQgamF2YS5sYW5nLlJ1bnRpbWU7CisKK3B1YmxpYyBjbGFzcyBTaW1wbGVNb2RlbCBleHRlbmRzIEFjdGl2aXR5IHsKKworICAgIHByaXZhdGUgU2ltcGxlTW9kZWxWaWV3IG1WaWV3OworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb25DcmVhdGUoQnVuZGxlIGljaWNsZSkgeworICAgICAgICBzdXBlci5vbkNyZWF0ZShpY2ljbGUpOworCisgICAgICAgIC8vIENyZWF0ZSBvdXIgUHJldmlldyB2aWV3IGFuZCBzZXQgaXQgYXMgdGhlIGNvbnRlbnQgb2Ygb3VyCisgICAgICAgIC8vIEFjdGl2aXR5CisgICAgICAgIG1WaWV3ID0gbmV3IFNpbXBsZU1vZGVsVmlldyh0aGlzKTsKKyAgICAgICAgc2V0Q29udGVudFZpZXcobVZpZXcpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG9uUmVzdW1lKCkgeworICAgICAgICAvLyBJZGVhbGx5IGEgZ2FtZSBzaG91bGQgaW1wbGVtZW50IG9uUmVzdW1lKCkgYW5kIG9uUGF1c2UoKQorICAgICAgICAvLyB0byB0YWtlIGFwcHJvcHJpYXRlIGFjdGlvbiB3aGVuIHRoZSBhY3Rpdml0eSBsb29zZXMgZm9jdXMKKyAgICAgICAgc3VwZXIub25SZXN1bWUoKTsKKyAgICAgICAgbVZpZXcub25SZXN1bWUoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvblBhdXNlKCkgeworICAgICAgICAvLyBJZGVhbGx5IGEgZ2FtZSBzaG91bGQgaW1wbGVtZW50IG9uUmVzdW1lKCkgYW5kIG9uUGF1c2UoKQorICAgICAgICAvLyB0byB0YWtlIGFwcHJvcHJpYXRlIGFjdGlvbiB3aGVuIHRoZSBhY3Rpdml0eSBsb29zZXMgZm9jdXMKKyAgICAgICAgc3VwZXIub25QYXVzZSgpOworICAgICAgICBtVmlldy5vblBhdXNlKCk7CisgICAgfQorCit9CisKZGlmZiAtLWdpdCBhL2xpYnMvcnMvamF2YS9Nb2RlbFZpZXdlci9zcmMvY29tL2FuZHJvaWQvbW9kZWx2aWV3ZXIvU2ltcGxlTW9kZWxSUy5qYXZhIGIvbGlicy9ycy9qYXZhL01vZGVsVmlld2VyL3NyYy9jb20vYW5kcm9pZC9tb2RlbHZpZXdlci9TaW1wbGVNb2RlbFJTLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDhkMWE2ZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYnMvcnMvamF2YS9Nb2RlbFZpZXdlci9zcmMvY29tL2FuZHJvaWQvbW9kZWx2aWV3ZXIvU2ltcGxlTW9kZWxSUy5qYXZhCkBAIC0wLDAgKzEsMTY5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5tb2RlbHZpZXdlcjsKKworaW1wb3J0IGphdmEuaW8uV3JpdGVyOworCitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5SZXNvdXJjZXM7CitpbXBvcnQgYW5kcm9pZC5yZW5kZXJzY3JpcHQuKjsKK2ltcG9ydCBhbmRyb2lkLnJlbmRlcnNjcmlwdC5Qcm9ncmFtU3RvcmUuRGVwdGhGdW5jOworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CisKKworcHVibGljIGNsYXNzIFNpbXBsZU1vZGVsUlMgeworCisgICAgcHJpdmF0ZSBmaW5hbCBpbnQgU1RBVEVfTEFTVF9GT0NVUyA9IDE7CisKKyAgICBpbnQgbVdpZHRoOworICAgIGludCBtSGVpZ2h0OworICAgIGludCBtUm90YXRpb247CisKKyAgICBwdWJsaWMgU2ltcGxlTW9kZWxSUygpIHsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBpbml0KFJlbmRlclNjcmlwdEdMIHJzLCBSZXNvdXJjZXMgcmVzLCBpbnQgd2lkdGgsIGludCBoZWlnaHQpIHsKKyAgICAgICAgbVJTID0gcnM7CisgICAgICAgIG1SZXMgPSByZXM7CisgICAgICAgIG1XaWR0aCA9IHdpZHRoOworICAgICAgICBtSGVpZ2h0ID0gaGVpZ2h0OworICAgICAgICBtUm90YXRpb24gPSAwOworICAgICAgICBpbml0UlMoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIFJlc291cmNlcyBtUmVzOworICAgIHByaXZhdGUgUmVuZGVyU2NyaXB0R0wgbVJTOworICAgIHByaXZhdGUgU2FtcGxlciBtU2FtcGxlcjsKKyAgICBwcml2YXRlIFByb2dyYW1TdG9yZSBtUFNCYWNrZ3JvdW5kOworICAgIHByaXZhdGUgUHJvZ3JhbUZyYWdtZW50IG1QRkJhY2tncm91bmQ7CisgICAgcHJpdmF0ZSBQcm9ncmFtVmVydGV4IG1QVkJhY2tncm91bmQ7CisgICAgcHJpdmF0ZSBQcm9ncmFtVmVydGV4Lk1hdHJpeEFsbG9jYXRpb24gbVBWQTsKKworICAgIHByaXZhdGUgQWxsb2NhdGlvbiBtR3JpZEltYWdlOworICAgIHByaXZhdGUgQWxsb2NhdGlvbiBtQWxsb2NQVjsKKworICAgIHByaXZhdGUgTWVzaCBtTWVzaDsKKworICAgIHByaXZhdGUgRm9udCBtSXRhbGljOworICAgIHByaXZhdGUgQWxsb2NhdGlvbiBtVGV4dEFsbG9jOworCisgICAgcHJpdmF0ZSBTY3JpcHRDX1NpbXBsZW1vZGVsIG1TY3JpcHQ7CisKKyAgICBpbnQgbUxhc3RYOworICAgIGludCBtTGFzdFk7CisKKyAgICBwdWJsaWMgdm9pZCB0b3VjaEV2ZW50KGludCB4LCBpbnQgeSkgeworICAgICAgICBpbnQgZHggPSBtTGFzdFggLSB4OworICAgICAgICBpZihNYXRoLmFicyhkeCkgPiA1MCB8fCBNYXRoLmFicyhkeCkgPCAzKSB7CisgICAgICAgICAgICBkeCA9IDA7CisgICAgICAgIH0KKworICAgICAgICBtUm90YXRpb24gLT0gZHg7CisgICAgICAgIGlmKG1Sb3RhdGlvbiA+IDM2MCkgeworICAgICAgICAgICAgbVJvdGF0aW9uIC09IDM2MDsKKyAgICAgICAgfQorICAgICAgICBpZihtUm90YXRpb24gPCAwKSB7CisgICAgICAgICAgICBtUm90YXRpb24gKz0gMzYwOworICAgICAgICB9CisKKyAgICAgICAgbVNjcmlwdC5zZXRfZ1JvdGF0ZSgoZmxvYXQpbVJvdGF0aW9uKTsKKworICAgICAgICBtTGFzdFggPSB4OworICAgICAgICBtTGFzdFkgPSB5OworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBpbml0UEZTKCkgeworICAgICAgICBQcm9ncmFtU3RvcmUuQnVpbGRlciBiID0gbmV3IFByb2dyYW1TdG9yZS5CdWlsZGVyKG1SUyk7CisKKyAgICAgICAgYi5zZXREZXB0aEZ1bmMoUHJvZ3JhbVN0b3JlLkRlcHRoRnVuYy5MRVNTKTsKKyAgICAgICAgYi5zZXREaXRoZXJFbmFibGUoZmFsc2UpOworICAgICAgICBiLnNldERlcHRoTWFzayh0cnVlKTsKKyAgICAgICAgbVBTQmFja2dyb3VuZCA9IGIuY3JlYXRlKCk7CisKKyAgICAgICAgbVNjcmlwdC5zZXRfZ1BGU0JhY2tncm91bmQobVBTQmFja2dyb3VuZCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGluaXRQRigpIHsKKyAgICAgICAgU2FtcGxlci5CdWlsZGVyIGJzID0gbmV3IFNhbXBsZXIuQnVpbGRlcihtUlMpOworICAgICAgICBicy5zZXRNaW4oU2FtcGxlci5WYWx1ZS5MSU5FQVIpOworICAgICAgICBicy5zZXRNYWcoU2FtcGxlci5WYWx1ZS5MSU5FQVIpOworICAgICAgICBicy5zZXRXcmFwUyhTYW1wbGVyLlZhbHVlLkNMQU1QKTsKKyAgICAgICAgYnMuc2V0V3JhcFQoU2FtcGxlci5WYWx1ZS5DTEFNUCk7CisgICAgICAgIG1TYW1wbGVyID0gYnMuY3JlYXRlKCk7CisKKyAgICAgICAgUHJvZ3JhbUZyYWdtZW50LkJ1aWxkZXIgYiA9IG5ldyBQcm9ncmFtRnJhZ21lbnQuQnVpbGRlcihtUlMpOworICAgICAgICBiLnNldFRleHR1cmUoUHJvZ3JhbUZyYWdtZW50LkJ1aWxkZXIuRW52TW9kZS5SRVBMQUNFLAorICAgICAgICAgICAgICAgICAgICAgUHJvZ3JhbUZyYWdtZW50LkJ1aWxkZXIuRm9ybWF0LlJHQkEsIDApOworICAgICAgICBtUEZCYWNrZ3JvdW5kID0gYi5jcmVhdGUoKTsKKyAgICAgICAgbVBGQmFja2dyb3VuZC5iaW5kU2FtcGxlcihtU2FtcGxlciwgMCk7CisKKyAgICAgICAgbVNjcmlwdC5zZXRfZ1BGQmFja2dyb3VuZChtUEZCYWNrZ3JvdW5kKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgaW5pdFBWKCkgeworICAgICAgICBQcm9ncmFtVmVydGV4LkJ1aWxkZXIgcHZiID0gbmV3IFByb2dyYW1WZXJ0ZXguQnVpbGRlcihtUlMpOworICAgICAgICBtUFZCYWNrZ3JvdW5kID0gcHZiLmNyZWF0ZSgpOworCisgICAgICAgIG1QVkEgPSBuZXcgUHJvZ3JhbVZlcnRleC5NYXRyaXhBbGxvY2F0aW9uKG1SUyk7CisgICAgICAgIG1QVkJhY2tncm91bmQuYmluZEFsbG9jYXRpb24obVBWQSk7CisKKyAgICAgICAgbVNjcmlwdC5zZXRfZ1BWQmFja2dyb3VuZChtUFZCYWNrZ3JvdW5kKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgbG9hZEltYWdlKCkgeworICAgICAgICBtR3JpZEltYWdlID0gQWxsb2NhdGlvbi5jcmVhdGVGcm9tQml0bWFwUmVzb3VyY2VCb3hlZChtUlMsIG1SZXMsIFIuZHJhd2FibGUucm9ib3QsIEVsZW1lbnQuUkdCXzU2NShtUlMpLCB0cnVlKTsKKyAgICAgICAgbUdyaWRJbWFnZS51cGxvYWRUb1RleHR1cmUoMCk7CisKKyAgICAgICAgbVNjcmlwdC5zZXRfZ1RHcmlkKG1HcmlkSW1hZ2UpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBpbml0VGV4dEFsbG9jYXRpb24oKSB7CisgICAgICAgIFN0cmluZyBhbGxvY1N0cmluZyA9ICJEaXNwbGF5aW5nIGZpbGU6IFIucmF3LnJvYm90IjsKKyAgICAgICAgbVRleHRBbGxvYyA9IEFsbG9jYXRpb24uY3JlYXRlRnJvbVN0cmluZyhtUlMsIGFsbG9jU3RyaW5nKTsKKyAgICAgICAgbVNjcmlwdC5zZXRfZ1RleHRBbGxvYyhtVGV4dEFsbG9jKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgaW5pdFJTKCkgeworCisgICAgICAgIG1TY3JpcHQgPSBuZXcgU2NyaXB0Q19TaW1wbGVtb2RlbChtUlMsIG1SZXMsIFIucmF3LnNpbXBsZW1vZGVsLCB0cnVlKTsKKworICAgICAgICBpbml0UEZTKCk7CisgICAgICAgIGluaXRQRigpOworICAgICAgICBpbml0UFYoKTsKKworICAgICAgICBsb2FkSW1hZ2UoKTsKKworICAgICAgICBGaWxlQTNEIG1vZGVsID0gRmlsZUEzRC5jcmVhdGVGcm9tUmVzb3VyY2UobVJTLCBtUmVzLCBSLnJhdy5yb2JvdCk7CisgICAgICAgIEZpbGVBM0QuSW5kZXhFbnRyeSBlbnRyeSA9IG1vZGVsLmdldEluZGV4RW50cnkoMCk7CisgICAgICAgIGlmKGVudHJ5ID09IG51bGwgfHwgZW50cnkuZ2V0Q2xhc3NJRCgpICE9IEZpbGVBM0QuQ2xhc3NJRC5NRVNIKSB7CisgICAgICAgICAgICBMb2cuZSgicnMiLCAiY291bGQgbm90IGxvYWQgbW9kZWwiKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIG1NZXNoID0gKE1lc2gpZW50cnkuZ2V0T2JqZWN0KCk7CisgICAgICAgICAgICBtU2NyaXB0LnNldF9nVGVzdE1lc2gobU1lc2gpOworICAgICAgICB9CisKKyAgICAgICAgbUl0YWxpYyA9IEZvbnQuY3JlYXRlKG1SUywgbVJlcywgIkRyb2lkU2VyaWYtSXRhbGljLnR0ZiIsIDgpOworICAgICAgICBtU2NyaXB0LnNldF9nSXRhbGljKG1JdGFsaWMpOworCisgICAgICAgIGluaXRUZXh0QWxsb2NhdGlvbigpOworCisgICAgICAgIG1SUy5jb250ZXh0QmluZFJvb3RTY3JpcHQobVNjcmlwdCk7CisgICAgfQorfQorCisKKwpkaWZmIC0tZ2l0IGEvbGlicy9ycy9qYXZhL01vZGVsVmlld2VyL3NyYy9jb20vYW5kcm9pZC9tb2RlbHZpZXdlci9TaW1wbGVNb2RlbFZpZXcuamF2YSBiL2xpYnMvcnMvamF2YS9Nb2RlbFZpZXdlci9zcmMvY29tL2FuZHJvaWQvbW9kZWx2aWV3ZXIvU2ltcGxlTW9kZWxWaWV3LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjU3NGZkZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYnMvcnMvamF2YS9Nb2RlbFZpZXdlci9zcmMvY29tL2FuZHJvaWQvbW9kZWx2aWV3ZXIvU2ltcGxlTW9kZWxWaWV3LmphdmEKQEAgLTAsMCArMSw5NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQubW9kZWx2aWV3ZXI7CisKK2ltcG9ydCBqYXZhLmlvLldyaXRlcjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlNlbWFwaG9yZTsKKworaW1wb3J0IGFuZHJvaWQucmVuZGVyc2NyaXB0LlJTU3VyZmFjZVZpZXc7CitpbXBvcnQgYW5kcm9pZC5yZW5kZXJzY3JpcHQuUmVuZGVyU2NyaXB0OworaW1wb3J0IGFuZHJvaWQucmVuZGVyc2NyaXB0LlJlbmRlclNjcmlwdEdMOworCitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5SZXNvdXJjZXM7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5CaXRtYXA7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5CaXRtYXBEcmF3YWJsZTsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlOworaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLk1lc3NhZ2U7CitpbXBvcnQgYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldDsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworaW1wb3J0IGFuZHJvaWQudmlldy5TdXJmYWNlOworaW1wb3J0IGFuZHJvaWQudmlldy5TdXJmYWNlSG9sZGVyOworaW1wb3J0IGFuZHJvaWQudmlldy5TdXJmYWNlVmlldzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuS2V5RXZlbnQ7CitpbXBvcnQgYW5kcm9pZC52aWV3Lk1vdGlvbkV2ZW50OworCitwdWJsaWMgY2xhc3MgU2ltcGxlTW9kZWxWaWV3IGV4dGVuZHMgUlNTdXJmYWNlVmlldyB7CisKKyAgICBwdWJsaWMgU2ltcGxlTW9kZWxWaWV3KENvbnRleHQgY29udGV4dCkgeworICAgICAgICBzdXBlcihjb250ZXh0KTsKKyAgICAgICAgLy9zZXRGb2N1c2FibGUodHJ1ZSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBSZW5kZXJTY3JpcHRHTCBtUlM7CisgICAgcHJpdmF0ZSBTaW1wbGVNb2RlbFJTIG1SZW5kZXI7CisKKworICAgIHB1YmxpYyB2b2lkIHN1cmZhY2VDaGFuZ2VkKFN1cmZhY2VIb2xkZXIgaG9sZGVyLCBpbnQgZm9ybWF0LCBpbnQgdywgaW50IGgpIHsKKyAgICAgICAgc3VwZXIuc3VyZmFjZUNoYW5nZWQoaG9sZGVyLCBmb3JtYXQsIHcsIGgpOworICAgICAgICBpZiAobVJTID09IG51bGwpIHsKKyAgICAgICAgICAgIG1SUyA9IGNyZWF0ZVJlbmRlclNjcmlwdCh0cnVlKTsKKyAgICAgICAgICAgIG1SUy5jb250ZXh0U2V0U3VyZmFjZSh3LCBoLCBob2xkZXIuZ2V0U3VyZmFjZSgpKTsKKyAgICAgICAgICAgIG1SZW5kZXIgPSBuZXcgU2ltcGxlTW9kZWxSUygpOworICAgICAgICAgICAgbVJlbmRlci5pbml0KG1SUywgZ2V0UmVzb3VyY2VzKCksIHcsIGgpOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25EZXRhY2hlZEZyb21XaW5kb3coKSB7CisgICAgICAgIGlmKG1SUyAhPSBudWxsKSB7CisgICAgICAgICAgICBtUlMgPSBudWxsOworICAgICAgICAgICAgZGVzdHJveVJlbmRlclNjcmlwdCgpOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gb25LZXlEb3duKGludCBrZXlDb2RlLCBLZXlFdmVudCBldmVudCkKKyAgICB7CisgICAgICAgIC8vIGJyZWFrIHBvaW50IGF0IGhlcmUKKyAgICAgICAgLy8gdGhpcyBtZXRob2QgZG9lc24ndCB3b3JrIHdoZW4gJ2V4dGVuZHMgVmlldycgaW5jbHVkZSAnZXh0ZW5kcyBTY3JvbGxWaWV3Jy4KKyAgICAgICAgcmV0dXJuIHN1cGVyLm9uS2V5RG93bihrZXlDb2RlLCBldmVudCk7CisgICAgfQorCisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBvblRvdWNoRXZlbnQoTW90aW9uRXZlbnQgZXYpCisgICAgeworICAgICAgICBib29sZWFuIHJldCA9IHRydWU7CisgICAgICAgIGludCBhY3QgPSBldi5nZXRBY3Rpb24oKTsKKyAgICAgICAgaWYgKGFjdCA9PSBldi5BQ1RJT05fVVApIHsKKyAgICAgICAgICAgIHJldCA9IGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgbVJlbmRlci50b3VjaEV2ZW50KChpbnQpZXYuZ2V0WCgpLCAoaW50KWV2LmdldFkoKSk7CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorfQorCisKZGlmZiAtLWdpdCBhL2xpYnMvcnMvamF2YS9Nb2RlbFZpZXdlci9zcmMvY29tL2FuZHJvaWQvbW9kZWx2aWV3ZXIvc2NlbmVncmFwaC5ycyBiL2xpYnMvcnMvamF2YS9Nb2RlbFZpZXdlci9zcmMvY29tL2FuZHJvaWQvbW9kZWx2aWV3ZXIvc2NlbmVncmFwaC5ycwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZTZiYjFlCi0tLSAvZGV2L251bGwKKysrIGIvbGlicy9ycy9qYXZhL01vZGVsVmlld2VyL3NyYy9jb20vYW5kcm9pZC9tb2RlbHZpZXdlci9zY2VuZWdyYXBoLnJzCkBAIC0wLDAgKzEsOTYgQEAKKy8vIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjcHJhZ21hIHZlcnNpb24oMSkKKworI3ByYWdtYSBycyBqYXZhX3BhY2thZ2VfbmFtZShjb20uYW5kcm9pZC5tb2RlbHZpZXdlcikKKworI2luY2x1ZGUgInJzX2dyYXBoaWNzLnJzaCIKKyNpbmNsdWRlICJ0cmFuc2Zvcm1fZGVmLnJzaCIKKworcnNfcHJvZ3JhbV92ZXJ0ZXggZ1BWQmFja2dyb3VuZDsKK3JzX3Byb2dyYW1fZnJhZ21lbnQgZ1BGQmFja2dyb3VuZDsKKworcnNfYWxsb2NhdGlvbiBnVEdyaWQ7Cityc19tZXNoIGdUZXN0TWVzaDsKKworcnNfcHJvZ3JhbV9zdG9yZSBnUEZTQmFja2dyb3VuZDsKKworZmxvYXQgZ1JvdGF0ZTsKKworcnNfZm9udCBnSXRhbGljOworcnNfYWxsb2NhdGlvbiBnVGV4dEFsbG9jOworCityc19zY3JpcHQgZ1RyYW5zZm9ybVJTOworCitTZ1RyYW5zZm9ybSAqZ0dyb3VwOworU2dUcmFuc2Zvcm0gKmdSb2JvdDE7CitpbnQgZ1JvYm90MUluZGV4OworU2dUcmFuc2Zvcm0gKmdSb2JvdDI7CitpbnQgZ1JvYm90MkluZGV4OworCitTZ1RyYW5zZm9ybSAqZ1Jvb3ROb2RlOworCisjcHJhZ21hIHJzIGV4cG9ydF92YXIoZ1BWQmFja2dyb3VuZCwgZ1BGQmFja2dyb3VuZCwgZ1RHcmlkLCBnVGVzdE1lc2gsIGdQRlNCYWNrZ3JvdW5kLCBnUm90YXRlLCBnSXRhbGljLCBnVGV4dEFsbG9jLCBnVHJhbnNmb3JtUlMsIGdHcm91cCwgZ1JvYm90MSwgZ1JvYm90MUluZGV4LCBnUm9ib3QyLCBnUm9ib3QySW5kZXgsIGdSb290Tm9kZSkKKworZmxvYXQgZ0RUOworaW50NjRfdCBnTGFzdFRpbWU7CisKK3ZvaWQgaW5pdCgpIHsKKyAgICBnUm90YXRlID0gMC4wZjsKK30KKworaW50IHJvb3QoaW50IGxhdW5jaElEKSB7CisKKyAgICBnR3JvdXAtPnRyYW5zZm9ybXMxLncgKz0gMC41ZjsKKyAgICBnR3JvdXAtPmlzRGlydHkgPSAxOworCisgICAgU2dUcmFuc2Zvcm0gKnJvYm90MVB0ciA9IGdSb2JvdDEgKyBnUm9ib3QxSW5kZXg7CisKKyAgICByb2JvdDFQdHItPnRyYW5zZm9ybXMxLncgLT0gMS41ZjsKKyAgICByb2JvdDFQdHItPmlzRGlydHkgPSAxOworCisgICAgU2dUcmFuc2Zvcm0gKnJvYm90MlB0ciA9IGdSb2JvdDIgKyBnUm9ib3QySW5kZXg7CisgICAgcm9ib3QyUHRyLT50cmFuc2Zvcm1zMS53ICs9IDIuNWY7CisgICAgcm9ib3QyUHRyLT5pc0RpcnR5ID0gMTsKKworICAgIHJzRm9yRWFjaChnVHJhbnNmb3JtUlMsIGdSb290Tm9kZS0+Y2hpbGRyZW4sIGdSb290Tm9kZS0+Y2hpbGRyZW4sIDApOworCisgICAgcnNnQ2xlYXJDb2xvcigxLjBmLCAxLjBmLCAxLjBmLCAxLjBmKTsKKyAgICByc2dDbGVhckRlcHRoKDEuMGYpOworCisgICAgcnNnQmluZFByb2dyYW1WZXJ0ZXgoZ1BWQmFja2dyb3VuZCk7CisgICAgcnNfbWF0cml4NHg0IHByb2o7CisgICAgZmxvYXQgYXNwZWN0ID0gKGZsb2F0KXJzZ0dldFdpZHRoKCkgLyAoZmxvYXQpcnNnR2V0SGVpZ2h0KCk7CisgICAgcnNNYXRyaXhMb2FkUGVyc3BlY3RpdmUoJnByb2osIDMwLjBmLCBhc3BlY3QsIDAuMWYsIDEwMC4wZik7CisgICAgcnNnUHJvZ3JhbVZlcnRleExvYWRQcm9qZWN0aW9uTWF0cml4KCZwcm9qKTsKKworICAgIHJzZ0JpbmRQcm9ncmFtRnJhZ21lbnQoZ1BGQmFja2dyb3VuZCk7CisgICAgcnNnQmluZFByb2dyYW1TdG9yZShnUEZTQmFja2dyb3VuZCk7CisgICAgcnNnQmluZFRleHR1cmUoZ1BGQmFja2dyb3VuZCwgMCwgZ1RHcmlkKTsKKworICAgIHJzZ1Byb2dyYW1WZXJ0ZXhMb2FkTW9kZWxNYXRyaXgoJnJvYm90MVB0ci0+Z2xvYmFsTWF0KTsKKyAgICByc2dEcmF3TWVzaChnVGVzdE1lc2gpOworCisgICAgcnNnUHJvZ3JhbVZlcnRleExvYWRNb2RlbE1hdHJpeCgmcm9ib3QyUHRyLT5nbG9iYWxNYXQpOworICAgIHJzZ0RyYXdNZXNoKGdUZXN0TWVzaCk7CisKKyAgICBjb2xvcigwLjNmLCAwLjNmLCAwLjNmLCAxLjBmKTsKKyAgICByc2dEcmF3VGV4dCgiUmVuZGVyc2NyaXB0IHRyYW5zZm9ybSB0ZXN0IiwgMzAsIDY5NSk7CisKKyAgICByc2dCaW5kRm9udChnSXRhbGljKTsKKyAgICByc2dEcmF3VGV4dChnVGV4dEFsbG9jLCAzMCwgNzMwKTsKKworICAgIHJldHVybiAxMDsKK30KZGlmZiAtLWdpdCBhL2xpYnMvcnMvamF2YS9Nb2RlbFZpZXdlci9zcmMvY29tL2FuZHJvaWQvbW9kZWx2aWV3ZXIvc2ltcGxlbW9kZWwucnMgYi9saWJzL3JzL2phdmEvTW9kZWxWaWV3ZXIvc3JjL2NvbS9hbmRyb2lkL21vZGVsdmlld2VyL3NpbXBsZW1vZGVsLnJzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQzYmUyNjYKLS0tIC9kZXYvbnVsbAorKysgYi9saWJzL3JzL2phdmEvTW9kZWxWaWV3ZXIvc3JjL2NvbS9hbmRyb2lkL21vZGVsdmlld2VyL3NpbXBsZW1vZGVsLnJzCkBAIC0wLDAgKzEsNzYgQEAKKy8vIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjcHJhZ21hIHZlcnNpb24oMSkKKworI3ByYWdtYSBycyBqYXZhX3BhY2thZ2VfbmFtZShjb20uYW5kcm9pZC5tb2RlbHZpZXdlcikKKworI2luY2x1ZGUgInJzX2dyYXBoaWNzLnJzaCIKKworcnNfcHJvZ3JhbV92ZXJ0ZXggZ1BWQmFja2dyb3VuZDsKK3JzX3Byb2dyYW1fZnJhZ21lbnQgZ1BGQmFja2dyb3VuZDsKKworcnNfYWxsb2NhdGlvbiBnVEdyaWQ7Cityc19tZXNoIGdUZXN0TWVzaDsKKworcnNfcHJvZ3JhbV9zdG9yZSBnUEZTQmFja2dyb3VuZDsKKworZmxvYXQgZ1JvdGF0ZTsKKworcnNfZm9udCBnSXRhbGljOworcnNfYWxsb2NhdGlvbiBnVGV4dEFsbG9jOworCisjcHJhZ21hIHJzIGV4cG9ydF92YXIoZ1BWQmFja2dyb3VuZCwgZ1BGQmFja2dyb3VuZCwgZ1RHcmlkLCBnVGVzdE1lc2gsIGdQRlNCYWNrZ3JvdW5kLCBnUm90YXRlLCBnSXRhbGljLCBnVGV4dEFsbG9jKQorCitmbG9hdCBnRFQ7CitpbnQ2NF90IGdMYXN0VGltZTsKKwordm9pZCBpbml0KCkgeworICAgIGdSb3RhdGUgPSAwLjBmOworfQorCitpbnQgcm9vdChpbnQgbGF1bmNoSUQpIHsKKworICAgIHJzZ0NsZWFyQ29sb3IoMS4wZiwgMS4wZiwgMS4wZiwgMS4wZik7CisgICAgcnNnQ2xlYXJEZXB0aCgxLjBmKTsKKworICAgIHJzZ0JpbmRQcm9ncmFtVmVydGV4KGdQVkJhY2tncm91bmQpOworICAgIHJzX21hdHJpeDR4NCBwcm9qOworICAgIGZsb2F0IGFzcGVjdCA9IChmbG9hdClyc2dHZXRXaWR0aCgpIC8gKGZsb2F0KXJzZ0dldEhlaWdodCgpOworICAgIHJzTWF0cml4TG9hZFBlcnNwZWN0aXZlKCZwcm9qLCAzMC4wZiwgYXNwZWN0LCAwLjFmLCAxMDAuMGYpOworICAgIHJzZ1Byb2dyYW1WZXJ0ZXhMb2FkUHJvamVjdGlvbk1hdHJpeCgmcHJvaik7CisKKyAgICByc2dCaW5kUHJvZ3JhbUZyYWdtZW50KGdQRkJhY2tncm91bmQpOworICAgIHJzZ0JpbmRQcm9ncmFtU3RvcmUoZ1BGU0JhY2tncm91bmQpOworICAgIHJzZ0JpbmRUZXh0dXJlKGdQRkJhY2tncm91bmQsIDAsIGdUR3JpZCk7CisKKyAgICByc19tYXRyaXg0eDQgbWF0cml4OworICAgIHJzTWF0cml4TG9hZElkZW50aXR5KCZtYXRyaXgpOworICAgIC8vIFBvc2l0aW9uIG91ciBtb2RlbCBvbiB0aGUgc2NyZWVuCisgICAgcnNNYXRyaXhUcmFuc2xhdGUoJm1hdHJpeCwgMC4wZiwgLTAuM2YsIC0xMC4wZik7CisgICAgcnNNYXRyaXhTY2FsZSgmbWF0cml4LCAwLjJmLCAwLjJmLCAwLjJmKTsKKyAgICByc01hdHJpeFJvdGF0ZSgmbWF0cml4LCAyNS4wZiwgMS4wZiwgMC4wZiwgMC4wZik7CisgICAgcnNNYXRyaXhSb3RhdGUoJm1hdHJpeCwgZ1JvdGF0ZSwgMC4wZiwgMS4wZiwgMC4wZik7CisgICAgcnNnUHJvZ3JhbVZlcnRleExvYWRNb2RlbE1hdHJpeCgmbWF0cml4KTsKKworICAgIHJzZ0RyYXdNZXNoKGdUZXN0TWVzaCk7CisKKyAgICByc2dGb250Q29sb3IoMC4zZiwgMC4zZiwgMC4zZiwgMS4wZik7CisgICAgcnNnRHJhd1RleHQoIlJlbmRlcnNjcmlwdCBtb2RlbCB0ZXN0IiwgMzAsIDY5NSk7CisKKyAgICByc2dCaW5kRm9udChnSXRhbGljKTsKKyAgICByc2dEcmF3VGV4dChnVGV4dEFsbG9jLCAzMCwgNzMwKTsKKworICAgIHJldHVybiAxMDsKK30KZGlmZiAtLWdpdCBhL2xpYnMvcnMvamF2YS9Nb2RlbFZpZXdlci9zcmMvY29tL2FuZHJvaWQvbW9kZWx2aWV3ZXIvdHJhbnNmb3JtLnJzIGIvbGlicy9ycy9qYXZhL01vZGVsVmlld2VyL3NyYy9jb20vYW5kcm9pZC9tb2RlbHZpZXdlci90cmFuc2Zvcm0ucnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmVmMjljZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYnMvcnMvamF2YS9Nb2RlbFZpZXdlci9zcmMvY29tL2FuZHJvaWQvbW9kZWx2aWV3ZXIvdHJhbnNmb3JtLnJzCkBAIC0wLDAgKzEsMTAyIEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworI3ByYWdtYSB2ZXJzaW9uKDEpCisKKyNwcmFnbWEgcnMgamF2YV9wYWNrYWdlX25hbWUoY29tLmFuZHJvaWQubW9kZWx2aWV3ZXIpCisKKyNpbmNsdWRlICJ0cmFuc2Zvcm1fZGVmLnJzaCIKKworcnNfc2NyaXB0IHRyYW5zZm9ybVNjcmlwdDsKKworI3ByYWdtYSBycyBleHBvcnRfdmFyKHRyYW5zZm9ybVNjcmlwdCkKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIGludCBjaGFuZ2VkOworICAgIHJzX21hdHJpeDR4NCAqbWF0OworfSBQYXJlbnREYXRhOworCit2b2lkIGFwcGVuZFRyYW5zZm9ybWF0aW9uKGludCB0eXBlLCBmbG9hdDQgZGF0YSwgcnNfbWF0cml4NHg0ICptYXQpIHsKKyAgICByc19tYXRyaXg0eDQgdGVtcDsKKworICAgIHN3aXRjaCh0eXBlKSB7CisgICAgY2FzZSBUUkFOU0ZPUk1fVFJBTlNMQVRFOgorICAgICAgICByc01hdHJpeExvYWRUcmFuc2xhdGUoJnRlbXAsIGRhdGEueCwgZGF0YS55LCBkYXRhLnopOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFRSQU5TRk9STV9ST1RBVEU6CisgICAgICAgIHJzTWF0cml4TG9hZFJvdGF0ZSgmdGVtcCwgZGF0YS53LCBkYXRhLngsIGRhdGEueSwgZGF0YS56KTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBUUkFOU0ZPUk1fU0NBTEU6CisgICAgICAgIHJzTWF0cml4TG9hZFNjYWxlKCZ0ZW1wLCBkYXRhLngsIGRhdGEueSwgZGF0YS56KTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIHJzTWF0cml4TXVsdGlwbHkobWF0LCAmdGVtcCk7Cit9CisKK3ZvaWQgcm9vdChjb25zdCB2b2lkICp2X2luLCB2b2lkICp2X291dCwgY29uc3Qgdm9pZCAqdXNyRGF0YSwgdWludDMyX3QgeCwgdWludDMyX3QgeSkgeworCisgICAgU2dUcmFuc2Zvcm0gKmRhdGEgPSAoU2dUcmFuc2Zvcm0gKil2X291dDsKKyAgICBjb25zdCBQYXJlbnREYXRhICpwYXJlbnQgPSAoY29uc3QgUGFyZW50RGF0YSAqKXVzckRhdGE7CisKKyAgICAvL3JzRGVidWcoIlRyYW5zZm9ybSBkYXRhIiwgKGludClkYXRhKTsKKyAgICAvL3JzRGVidWcoIkVudGVyaW5nIHBhcmVudCIsIChpbnQpcGFyZW50KTsKKworICAgIHJzX21hdHJpeDR4NCAqbG9jYWxNYXQgPSAmZGF0YS0+bG9jYWxNYXQ7CisgICAgcnNfbWF0cml4NHg0ICpnbG9iYWxNYXQgPSAmZGF0YS0+Z2xvYmFsTWF0OworCisgICAgUGFyZW50RGF0YSB0b0NoaWxkOworICAgIHRvQ2hpbGQuY2hhbmdlZCA9IDA7CisgICAgdG9DaGlsZC5tYXQgPSBnbG9iYWxNYXQ7CisKKyAgICAvL3JzRGVidWcoIlRyYW5zZm9ybSBpcyBkaXJ0eSIsIGRhdGEtPmlzRGlydHkpOworCisgICAgLy8gUmVmcmVzaCBtYXRyaWNlcyBpZiBkaXJ0eQorICAgIGlmKGRhdGEtPmlzRGlydHkpIHsKKyAgICAgICAgZGF0YS0+aXNEaXJ0eSA9IDA7CisgICAgICAgIHRvQ2hpbGQuY2hhbmdlZCA9IDE7CisKKyAgICAgICAgLy8gUmVzZXQgb3VyIGxvY2FsIG1hdHJpeAorICAgICAgICByc01hdHJpeExvYWRJZGVudGl0eShsb2NhbE1hdCk7CisKKyAgICAgICAgZmxvYXQ0ICp0cmFuc2Zvcm1Tb3VyY2UgPSAmZGF0YS0+dHJhbnNmb3JtczA7CisgICAgICAgIGludCAqdHJhbnNmb3JtVHlwZXMgPSAmZGF0YS0+dHJhbnNmb3JtVHlwZTA7CisKKyAgICAgICAgZm9yKGludCBpID0gMDsgaSA8IDE2OyBpICsrKSB7CisgICAgICAgICAgICBpZih0cmFuc2Zvcm1UeXBlc1tpXSA9PSBUUkFOU0ZPUk1fTk9ORSkgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy9yc0RlYnVnKCJUcmFuc2Zvcm0gYWRkaW5nIHRyYW5zZm9ybWF0aW9uIiwgdHJhbnNmb3JtVHlwZXNbaV0pOworICAgICAgICAgICAgYXBwZW5kVHJhbnNmb3JtYXRpb24odHJhbnNmb3JtVHlwZXNbaV0sIHRyYW5zZm9ybVNvdXJjZVtpXSwgbG9jYWxNYXQpOworICAgICAgICB9CisgICAgfQorCisgICAgLy9yc0RlYnVnKCJUcmFuc2Zvcm0gY2hlY2tpbmcgcGFyZW50IiwgKGludCkwKTsKKworICAgIGlmKHBhcmVudCkgeworICAgICAgICBpZihwYXJlbnQtPmNoYW5nZWQpIHsKKyAgICAgICAgICAgIHRvQ2hpbGQuY2hhbmdlZCA9IDE7CisKKyAgICAgICAgICAgIHJzTWF0cml4TG9hZChnbG9iYWxNYXQsIHBhcmVudC0+bWF0KTsKKyAgICAgICAgICAgIHJzTWF0cml4TXVsdGlwbHkoZ2xvYmFsTWF0LCBsb2NhbE1hdCk7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIHJzTWF0cml4TG9hZChnbG9iYWxNYXQsIGxvY2FsTWF0KTsKKyAgICB9CisKKyAgICAvL3JzRGVidWcoIlRyYW5zZm9ybSBjYWxsaW5nIHNlbGYgd2l0aCBjaGlsZCAiLCAoaW50KWRhdGEtPmNoaWxkcmVuLnApOworICAgIGlmKGRhdGEtPmNoaWxkcmVuLnApIHsKKyAgICAgICAgcnNGb3JFYWNoKHRyYW5zZm9ybVNjcmlwdCwgZGF0YS0+Y2hpbGRyZW4sIGRhdGEtPmNoaWxkcmVuLCAodm9pZCopJnRvQ2hpbGQpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYnMvcnMvamF2YS9Nb2RlbFZpZXdlci9zcmMvY29tL2FuZHJvaWQvbW9kZWx2aWV3ZXIvdHJhbnNmb3JtX2RlZi5yc2ggYi9saWJzL3JzL2phdmEvTW9kZWxWaWV3ZXIvc3JjL2NvbS9hbmRyb2lkL21vZGVsdmlld2VyL3RyYW5zZm9ybV9kZWYucnNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVjODcyYTcKLS0tIC9kZXYvbnVsbAorKysgYi9saWJzL3JzL2phdmEvTW9kZWxWaWV3ZXIvc3JjL2NvbS9hbmRyb2lkL21vZGVsdmlld2VyL3RyYW5zZm9ybV9kZWYucnNoCkBAIC0wLDAgKzEsNjYgQEAKKy8vIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjcHJhZ21hIHZlcnNpb24oMSkKKworI3ByYWdtYSBycyBqYXZhX3BhY2thZ2VfbmFtZShjb20uYW5kcm9pZC5tb2RlbHZpZXdlcikKKworI2RlZmluZSBUUkFOU0ZPUk1fTk9ORSAwCisjZGVmaW5lIFRSQU5TRk9STV9UUkFOU0xBVEUgMQorI2RlZmluZSBUUkFOU0ZPUk1fUk9UQVRFIDIKKyNkZWZpbmUgVFJBTlNGT1JNX1NDQUxFIDMKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIHJzX21hdHJpeDR4NCBnbG9iYWxNYXQ7CisgICAgcnNfbWF0cml4NHg0IGxvY2FsTWF0OworCisgICAgZmxvYXQ0IHRyYW5zZm9ybXMwOworICAgIGZsb2F0NCB0cmFuc2Zvcm1zMTsKKyAgICBmbG9hdDQgdHJhbnNmb3JtczI7CisgICAgZmxvYXQ0IHRyYW5zZm9ybXMzOworICAgIGZsb2F0NCB0cmFuc2Zvcm1zNDsKKyAgICBmbG9hdDQgdHJhbnNmb3JtczU7CisgICAgZmxvYXQ0IHRyYW5zZm9ybXM2OworICAgIGZsb2F0NCB0cmFuc2Zvcm1zNzsKKyAgICBmbG9hdDQgdHJhbnNmb3Jtczg7CisgICAgZmxvYXQ0IHRyYW5zZm9ybXM5OworICAgIGZsb2F0NCB0cmFuc2Zvcm1zMTA7CisgICAgZmxvYXQ0IHRyYW5zZm9ybXMxMTsKKyAgICBmbG9hdDQgdHJhbnNmb3JtczEyOworICAgIGZsb2F0NCB0cmFuc2Zvcm1zMTM7CisgICAgZmxvYXQ0IHRyYW5zZm9ybXMxNDsKKyAgICBmbG9hdDQgdHJhbnNmb3JtczE1OworCisgICAgaW50IHRyYW5zZm9ybVR5cGUwOworICAgIGludCB0cmFuc2Zvcm1UeXBlMTsKKyAgICBpbnQgdHJhbnNmb3JtVHlwZTI7CisgICAgaW50IHRyYW5zZm9ybVR5cGUzOworICAgIGludCB0cmFuc2Zvcm1UeXBlNDsKKyAgICBpbnQgdHJhbnNmb3JtVHlwZTU7CisgICAgaW50IHRyYW5zZm9ybVR5cGU2OworICAgIGludCB0cmFuc2Zvcm1UeXBlNzsKKyAgICBpbnQgdHJhbnNmb3JtVHlwZTg7CisgICAgaW50IHRyYW5zZm9ybVR5cGU5OworICAgIGludCB0cmFuc2Zvcm1UeXBlMTA7CisgICAgaW50IHRyYW5zZm9ybVR5cGUxMTsKKyAgICBpbnQgdHJhbnNmb3JtVHlwZTEyOworICAgIGludCB0cmFuc2Zvcm1UeXBlMTM7CisgICAgaW50IHRyYW5zZm9ybVR5cGUxNDsKKyAgICBpbnQgdHJhbnNmb3JtVHlwZTE1OworCisgICAgaW50IGlzRGlydHk7CisKKyAgICByc19hbGxvY2F0aW9uIGNoaWxkcmVuOworCit9IFNnVHJhbnNmb3JtOwpkaWZmIC0tZ2l0IGEvbGlicy9ycy9qYXZhL1NhbXBsZXMvQW5kcm9pZC5tayBiL2xpYnMvcnMvamF2YS9TYW1wbGVzL0FuZHJvaWQubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjVhZTczNAotLS0gL2Rldi9udWxsCisrKyBiL2xpYnMvcnMvamF2YS9TYW1wbGVzL0FuZHJvaWQubWsKQEAgLTAsMCArMSwzMSBAQAorIworIyBDb3B5cmlnaHQgKEMpIDIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworaWZuZXEgKCQoVEFSR0VUX1NJTVVMQVRPUiksdHJ1ZSkKKworTE9DQUxfUEFUSCA6PSAkKGNhbGwgbXktZGlyKQoraW5jbHVkZSAkKENMRUFSX1ZBUlMpCisKK0xPQ0FMX01PRFVMRV9UQUdTIDo9IG9wdGlvbmFsCisKK0xPQ0FMX1NSQ19GSUxFUyA6PSAkKGNhbGwgYWxsLWphdmEtZmlsZXMtdW5kZXIsIHNyYykgJChjYWxsIGFsbC1yZW5kZXJzY3JpcHQtZmlsZXMtdW5kZXIsIHNyYykKKyNMT0NBTF9TVEFUSUNfSkFWQV9MSUJSQVJJRVMgOj0gYW5kcm9pZC5yZW5kZXJzY3JpcHQKKworTE9DQUxfUEFDS0FHRV9OQU1FIDo9IFNhbXBsZXMKKworaW5jbHVkZSAkKEJVSUxEX1BBQ0tBR0UpCisKK2VuZGlmCmRpZmYgLS1naXQgYS9saWJzL3JzL2phdmEvU2FtcGxlcy9BbmRyb2lkTWFuaWZlc3QueG1sIGIvbGlicy9ycy9qYXZhL1NhbXBsZXMvQW5kcm9pZE1hbmlmZXN0LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZTE5MWYyCi0tLSAvZGV2L251bGwKKysrIGIvbGlicy9ycy9qYXZhL1NhbXBsZXMvQW5kcm9pZE1hbmlmZXN0LnhtbApAQCAtMCwwICsxLDI0IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPG1hbmlmZXN0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICBwYWNrYWdlPSJjb20uYW5kcm9pZC5zYW1wbGVzIj4KKyAgICA8YXBwbGljYXRpb24gYW5kcm9pZDpsYWJlbD0iU2FtcGxlcyIKKyAgICBhbmRyb2lkOmljb249IkBkcmF3YWJsZS90ZXN0X3BhdHRlcm4iPgorICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSJSc0xpc3QiCisgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxhYmVsPSJSc0xpc3QiICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRoZW1lPSJAYW5kcm9pZDpzdHlsZS9UaGVtZS5CbGFjay5Ob1RpdGxlQmFyIj4KKyAgICAgICAgICAgIDxpbnRlbnQtZmlsdGVyPgorICAgICAgICAgICAgICAgIDxhY3Rpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5hY3Rpb24uTUFJTiIgLz4KKyAgICAgICAgICAgICAgICA8Y2F0ZWdvcnkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5jYXRlZ29yeS5MQVVOQ0hFUiIgLz4KKyAgICAgICAgICAgIDwvaW50ZW50LWZpbHRlcj4KKyAgICAgICAgPC9hY3Rpdml0eT4KKyAgICAgICAgCisgICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9IlJzUmVuZGVyU3RhdGVzIgorICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYWJlbD0iUnNTdGF0ZXMiICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRoZW1lPSJAYW5kcm9pZDpzdHlsZS9UaGVtZS5CbGFjay5Ob1RpdGxlQmFyIj4KKyAgICAgICAgICAgIDxpbnRlbnQtZmlsdGVyPgorICAgICAgICAgICAgICAgIDxhY3Rpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5hY3Rpb24uTUFJTiIgLz4KKyAgICAgICAgICAgICAgICA8Y2F0ZWdvcnkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5jYXRlZ29yeS5MQVVOQ0hFUiIgLz4KKyAgICAgICAgICAgIDwvaW50ZW50LWZpbHRlcj4KKyAgICAgICAgPC9hY3Rpdml0eT4KKyAgICA8L2FwcGxpY2F0aW9uPgorPC9tYW5pZmVzdD4KZGlmZiAtLWdpdCBhL2xpYnMvcnMvamF2YS9TYW1wbGVzL3Jlcy9kcmF3YWJsZS9kYXRhLnBuZyBiL2xpYnMvcnMvamF2YS9TYW1wbGVzL3Jlcy9kcmF3YWJsZS9kYXRhLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZTM0NzE0Ci0tLSAvZGV2L251bGwKKysrIGIvbGlicy9ycy9qYXZhL1NhbXBsZXMvcmVzL2RyYXdhYmxlL2RhdGEucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYnMvcnMvamF2YS9TYW1wbGVzL3Jlcy9kcmF3YWJsZS9sZWFmLnBuZyBiL2xpYnMvcnMvamF2YS9TYW1wbGVzL3Jlcy9kcmF3YWJsZS9sZWFmLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zY2QzNzc1Ci0tLSAvZGV2L251bGwKKysrIGIvbGlicy9ycy9qYXZhL1NhbXBsZXMvcmVzL2RyYXdhYmxlL2xlYWYucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYnMvcnMvamF2YS9TYW1wbGVzL3Jlcy9kcmF3YWJsZS90ZXN0X3BhdHRlcm4ucG5nIGIvbGlicy9ycy9qYXZhL1NhbXBsZXMvcmVzL2RyYXdhYmxlL3Rlc3RfcGF0dGVybi5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTdkMTQ1NQotLS0gL2Rldi9udWxsCisrKyBiL2xpYnMvcnMvamF2YS9TYW1wbGVzL3Jlcy9kcmF3YWJsZS90ZXN0X3BhdHRlcm4ucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYnMvcnMvamF2YS9TYW1wbGVzL3Jlcy9kcmF3YWJsZS90b3J1c21hcC5wbmcgYi9saWJzL3JzL2phdmEvU2FtcGxlcy9yZXMvZHJhd2FibGUvdG9ydXNtYXAucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFlMDhmM2IKLS0tIC9kZXYvbnVsbAorKysgYi9saWJzL3JzL2phdmEvU2FtcGxlcy9yZXMvZHJhd2FibGUvdG9ydXNtYXAucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYnMvcnMvamF2YS9TYW1wbGVzL3Jlcy9yYXcvc2hhZGVyZi5nbHNsIGIvbGlicy9ycy9qYXZhL1NhbXBsZXMvcmVzL3Jhdy9zaGFkZXJmLmdsc2wKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmNiZTdlZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYnMvcnMvamF2YS9TYW1wbGVzL3Jlcy9yYXcvc2hhZGVyZi5nbHNsCkBAIC0wLDAgKzEsMTYgQEAKKwordmFyeWluZyBsb3dwIGZsb2F0IGxpZ2h0MF9EaWZmdXNlOwordmFyeWluZyBsb3dwIGZsb2F0IGxpZ2h0MF9TcGVjdWxhcjsKK3ZhcnlpbmcgbG93cCBmbG9hdCBsaWdodDFfRGlmZnVzZTsKK3ZhcnlpbmcgbG93cCBmbG9hdCBsaWdodDFfU3BlY3VsYXI7Cit2YXJ5aW5nIHZlYzIgdmFyVGV4MDsKKwordm9pZCBtYWluKCkgeworICAgdmVjMiB0MCA9IHZhclRleDAueHk7CisgICBsb3dwIHZlYzQgY29sID0gdGV4dHVyZTJEKFVOSV9UZXgwLCB0MCkucmdiYTsKKyAgIGNvbC54eXogPSBjb2wueHl6ICogKGxpZ2h0MF9EaWZmdXNlICogVU5JX2xpZ2h0MF9EaWZmdXNlQ29sb3IgKyBsaWdodDFfRGlmZnVzZSAqIFVOSV9saWdodDFfRGlmZnVzZUNvbG9yKTsKKyAgIGNvbC54eXogKz0gbGlnaHQwX1NwZWN1bGFyICogVU5JX2xpZ2h0MF9TcGVjdWxhckNvbG9yOworICAgY29sLnh5eiArPSBsaWdodDFfU3BlY3VsYXIgKiBVTklfbGlnaHQxX1NwZWN1bGFyQ29sb3I7CisgICBnbF9GcmFnQ29sb3IgPSBjb2w7Cit9CisKZGlmZiAtLWdpdCBhL2xpYnMvcnMvamF2YS9TYW1wbGVzL3Jlcy9yYXcvc2hhZGVydi5nbHNsIGIvbGlicy9ycy9qYXZhL1NhbXBsZXMvcmVzL3Jhdy9zaGFkZXJ2Lmdsc2wKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODY3NTg5Y2YKLS0tIC9kZXYvbnVsbAorKysgYi9saWJzL3JzL2phdmEvU2FtcGxlcy9yZXMvcmF3L3NoYWRlcnYuZ2xzbApAQCAtMCwwICsxLDMwIEBACit2YXJ5aW5nIGZsb2F0IGxpZ2h0MF9EaWZmdXNlOwordmFyeWluZyBmbG9hdCBsaWdodDBfU3BlY3VsYXI7Cit2YXJ5aW5nIGZsb2F0IGxpZ2h0MV9EaWZmdXNlOwordmFyeWluZyBmbG9hdCBsaWdodDFfU3BlY3VsYXI7Cit2YXJ5aW5nIHZlYzIgdmFyVGV4MDsKKworLy8gVGhpcyBpcyB3aGVyZSBhY3R1YWwgc2hhZGVyIGNvZGUgYmVnaW5zCit2b2lkIG1haW4oKSB7CisgICB2ZWM0IHdvcmxkUG9zID0gVU5JX21vZGVsICogQVRUUklCX3Bvc2l0aW9uOworICAgZ2xfUG9zaXRpb24gPSBVTklfcHJvaiAqIHdvcmxkUG9zOworCisgICBtYXQzIG1vZGVsMyA9IG1hdDMoVU5JX21vZGVsWzBdLnh5eiwgVU5JX21vZGVsWzFdLnh5eiwgVU5JX21vZGVsWzJdLnh5eik7CisgICB2ZWMzIHdvcmxkTm9ybSA9IG1vZGVsMyAqIEFUVFJJQl9ub3JtYWw7CisgICB2ZWMzIFYgPSBub3JtYWxpemUoLXdvcmxkUG9zLnh5eik7CisKKyAgIHZlYzMgbGlnaHQwVmVjID0gbm9ybWFsaXplKFVOSV9saWdodDBfUG9zaXNpb24gLSB3b3JsZFBvcy54eXopOworICAgdmVjMyBsaWdodDBSID0gcmVmbGVjdChsaWdodDBWZWMsIHdvcmxkTm9ybSk7CisgICBsaWdodDBfRGlmZnVzZSA9IGNsYW1wKGRvdCh3b3JsZE5vcm0sIGxpZ2h0MFZlYyksIDAuMCwgMS4wKSAqIFVOSV9saWdodDBfRGlmZnVzZTsKKyAgIGZsb2F0IGxpZ2h0MFNwZWMgPSBjbGFtcChkb3QobGlnaHQwUiwgViksIDAuMDAxLCAxLjApOworICAgbGlnaHQwX1NwZWN1bGFyID0gcG93KGxpZ2h0MFNwZWMsIFVOSV9saWdodDBfQ29zaW5lUG93ZXIpICogVU5JX2xpZ2h0MF9TcGVjdWxhcjsKKworICAgdmVjMyBsaWdodDFWZWMgPSBub3JtYWxpemUoVU5JX2xpZ2h0MV9Qb3Npc2lvbiAtIHdvcmxkUG9zLnh5eik7CisgICB2ZWMzIGxpZ2h0MVIgPSByZWZsZWN0KGxpZ2h0MVZlYywgd29ybGROb3JtKTsKKyAgIGxpZ2h0MV9EaWZmdXNlID0gY2xhbXAoZG90KHdvcmxkTm9ybSwgbGlnaHQxVmVjKSwgMC4wLCAxLjApICogVU5JX2xpZ2h0MV9EaWZmdXNlOworICAgZmxvYXQgbGlnaHQxU3BlYyA9IGNsYW1wKGRvdChsaWdodDFSLCBWKSwgMC4wMDEsIDEuMCk7CisgICBsaWdodDFfU3BlY3VsYXIgPSBwb3cobGlnaHQxU3BlYywgVU5JX2xpZ2h0MV9Db3NpbmVQb3dlcikgKiBVTklfbGlnaHQxX1NwZWN1bGFyOworCisgICBnbF9Qb2ludFNpemUgPSAxLjA7CisgICB2YXJUZXgwID0gQVRUUklCX3RleHR1cmUwOworfQpkaWZmIC0tZ2l0IGEvbGlicy9ycy9qYXZhL1NhbXBsZXMvcmVzL3Jhdy90b3J1cy5hM2QgYi9saWJzL3JzL2phdmEvU2FtcGxlcy9yZXMvcmF3L3RvcnVzLmEzZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMzIyYjAxCi0tLSAvZGV2L251bGwKKysrIGIvbGlicy9ycy9qYXZhL1NhbXBsZXMvcmVzL3Jhdy90b3J1cy5hM2QKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGlicy9ycy9qYXZhL1NhbXBsZXMvc3JjL2NvbS9hbmRyb2lkL3NhbXBsZXMvUnNMaXN0LmphdmEgYi9saWJzL3JzL2phdmEvU2FtcGxlcy9zcmMvY29tL2FuZHJvaWQvc2FtcGxlcy9Sc0xpc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOGM3MzNkCi0tLSAvZGV2L251bGwKKysrIGIvbGlicy9ycy9qYXZhL1NhbXBsZXMvc3JjL2NvbS9hbmRyb2lkL3NhbXBsZXMvUnNMaXN0LmphdmEKQEAgLTAsMCArMSw3MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQuc2FtcGxlczsKKworaW1wb3J0IGFuZHJvaWQucmVuZGVyc2NyaXB0LlJTU3VyZmFjZVZpZXc7CitpbXBvcnQgYW5kcm9pZC5yZW5kZXJzY3JpcHQuUmVuZGVyU2NyaXB0OworCitpbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHk7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5Db25maWd1cmF0aW9uOworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLkxvb3BlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLk1lc3NhZ2U7CitpbXBvcnQgYW5kcm9pZC5wcm92aWRlci5TZXR0aW5ncy5TeXN0ZW07CitpbXBvcnQgYW5kcm9pZC51dGlsLkNvbmZpZzsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworaW1wb3J0IGFuZHJvaWQudmlldy5NZW51OworaW1wb3J0IGFuZHJvaWQudmlldy5NZW51SXRlbTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuV2luZG93OworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkJ1dHRvbjsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5MaXN0VmlldzsKKworaW1wb3J0IGphdmEubGFuZy5SdW50aW1lOworCitwdWJsaWMgY2xhc3MgUnNMaXN0IGV4dGVuZHMgQWN0aXZpdHkgeworCisgICAgcHJpdmF0ZSBSc0xpc3RWaWV3IG1WaWV3OworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb25DcmVhdGUoQnVuZGxlIGljaWNsZSkgeworICAgICAgICBzdXBlci5vbkNyZWF0ZShpY2ljbGUpOworCisgICAgICAgIC8vIENyZWF0ZSBvdXIgUHJldmlldyB2aWV3IGFuZCBzZXQgaXQgYXMgdGhlIGNvbnRlbnQgb2Ygb3VyCisgICAgICAgIC8vIEFjdGl2aXR5CisgICAgICAgIG1WaWV3ID0gbmV3IFJzTGlzdFZpZXcodGhpcyk7CisgICAgICAgIHNldENvbnRlbnRWaWV3KG1WaWV3KTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvblJlc3VtZSgpIHsKKyAgICAgICAgLy8gSWRlYWxseSBhIGdhbWUgc2hvdWxkIGltcGxlbWVudCBvblJlc3VtZSgpIGFuZCBvblBhdXNlKCkKKyAgICAgICAgLy8gdG8gdGFrZSBhcHByb3ByaWF0ZSBhY3Rpb24gd2hlbiB0aGUgYWN0aXZpdHkgbG9vc2VzIGZvY3VzCisgICAgICAgIHN1cGVyLm9uUmVzdW1lKCk7CisgICAgICAgIG1WaWV3Lm9uUmVzdW1lKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25QYXVzZSgpIHsKKyAgICAgICAgLy8gSWRlYWxseSBhIGdhbWUgc2hvdWxkIGltcGxlbWVudCBvblJlc3VtZSgpIGFuZCBvblBhdXNlKCkKKyAgICAgICAgLy8gdG8gdGFrZSBhcHByb3ByaWF0ZSBhY3Rpb24gd2hlbiB0aGUgYWN0aXZpdHkgbG9vc2VzIGZvY3VzCisgICAgICAgIHN1cGVyLm9uUGF1c2UoKTsKKyAgICAgICAgbVZpZXcub25QYXVzZSgpOworICAgIH0KKworfQorCmRpZmYgLS1naXQgYS9saWJzL3JzL2phdmEvU2FtcGxlcy9zcmMvY29tL2FuZHJvaWQvc2FtcGxlcy9Sc0xpc3RSUy5qYXZhIGIvbGlicy9ycy9qYXZhL1NhbXBsZXMvc3JjL2NvbS9hbmRyb2lkL3NhbXBsZXMvUnNMaXN0UlMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNzgyZTBlCi0tLSAvZGV2L251bGwKKysrIGIvbGlicy9ycy9qYXZhL1NhbXBsZXMvc3JjL2NvbS9hbmRyb2lkL3NhbXBsZXMvUnNMaXN0UlMuamF2YQpAQCAtMCwwICsxLDE0NSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQuc2FtcGxlczsKKworaW1wb3J0IGphdmEuaW8uV3JpdGVyOworaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7CisKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlJlc291cmNlczsKK2ltcG9ydCBhbmRyb2lkLnJlbmRlcnNjcmlwdC4qOworaW1wb3J0IGFuZHJvaWQucmVuZGVyc2NyaXB0LlByb2dyYW1TdG9yZS5EZXB0aEZ1bmM7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKKworCitwdWJsaWMgY2xhc3MgUnNMaXN0UlMgeworCisgICAgcHJpdmF0ZSBmaW5hbCBpbnQgU1RBVEVfTEFTVF9GT0NVUyA9IDE7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBEQVRBX0xJU1QgPSB7CisgICAgIkFmZ2hhbmlzdGFuIiwgIkFsYmFuaWEiLCAiQWxnZXJpYSIsICJBbWVyaWNhbiBTYW1vYSIsICJBbmRvcnJhIiwKKyAgICAiQW5nb2xhIiwgIkFuZ3VpbGxhIiwgIkFudGFyY3RpY2EiLCAiQW50aWd1YSBhbmQgQmFyYnVkYSIsICJBcmdlbnRpbmEiLAorICAgICJBcm1lbmlhIiwgIkFydWJhIiwgIkF1c3RyYWxpYSIsICJBdXN0cmlhIiwgIkF6ZXJiYWlqYW4iLAorICAgICJCYWhyYWluIiwgIkJhbmdsYWRlc2giLCAiQmFyYmFkb3MiLCAiQmVsYXJ1cyIsICJCZWxnaXVtIiwKKyAgICAiQmVsaXplIiwgIkJlbmluIiwgIkJlcm11ZGEiLCAiQmh1dGFuIiwgIkJvbGl2aWEiLAorICAgICJCb3NuaWEgYW5kIEhlcnplZ292aW5hIiwgIkJvdHN3YW5hIiwgIkJvdXZldCBJc2xhbmQiLCAiQnJhemlsIiwKKyAgICAiQnJpdGlzaCBJbmRpYW4gT2NlYW4gVGVycml0b3J5IiwgIkJyaXRpc2ggVmlyZ2luIElzbGFuZHMiLCAiQnJ1bmVpIiwgIkJ1bGdhcmlhIiwKKyAgICAiQnVya2luYSBGYXNvIiwgIkJ1cnVuZGkiLCAiQ290ZSBkJ0l2b2lyZSIsICJDYW1ib2RpYSIsICJDYW1lcm9vbiIsICJDYW5hZGEiLCAiQ2FwZSBWZXJkZSIsCisgICAgIkNheW1hbiBJc2xhbmRzIiwgIkNlbnRyYWwgQWZyaWNhbiBSZXB1YmxpYyIsICJDaGFkIiwgIkNoaWxlIiwgIkNoaW5hIiwKKyAgICAiQ2hyaXN0bWFzIElzbGFuZCIsICJDb2NvcyAoS2VlbGluZykgSXNsYW5kcyIsICJDb2xvbWJpYSIsICJDb21vcm9zIiwgIkNvbmdvIiwKKyAgICAiQ29vayBJc2xhbmRzIiwgIkNvc3RhIFJpY2EiLCAiQ3JvYXRpYSIsICJDdWJhIiwgIkN5cHJ1cyIsICJDemVjaCBSZXB1YmxpYyIsCisgICAgIkRlbW9jcmF0aWMgUmVwdWJsaWMgb2YgdGhlIENvbmdvIiwgIkRlbm1hcmsiLCAiRGppYm91dGkiLCAiRG9taW5pY2EiLCAiRG9taW5pY2FuIFJlcHVibGljIiwKKyAgICAiRWFzdCBUaW1vciIsICJFY3VhZG9yIiwgIkVneXB0IiwgIkVsIFNhbHZhZG9yIiwgIkVxdWF0b3JpYWwgR3VpbmVhIiwgIkVyaXRyZWEiLAorICAgICJFc3RvbmlhIiwgIkV0aGlvcGlhIiwgIkZhZXJvZSBJc2xhbmRzIiwgIkZhbGtsYW5kIElzbGFuZHMiLCAiRmlqaSIsICJGaW5sYW5kIiwKKyAgICAiRm9ybWVyIFl1Z29zbGF2IFJlcHVibGljIG9mIE1hY2Vkb25pYSIsICJGcmFuY2UiLCAiRnJlbmNoIEd1aWFuYSIsICJGcmVuY2ggUG9seW5lc2lhIiwKKyAgICAiRnJlbmNoIFNvdXRoZXJuIFRlcnJpdG9yaWVzIiwgIkdhYm9uIiwgIkdlb3JnaWEiLCAiR2VybWFueSIsICJHaGFuYSIsICJHaWJyYWx0YXIiLAorICAgICJHcmVlY2UiLCAiR3JlZW5sYW5kIiwgIkdyZW5hZGEiLCAiR3VhZGVsb3VwZSIsICJHdWFtIiwgIkd1YXRlbWFsYSIsICJHdWluZWEiLCAiR3VpbmVhLUJpc3NhdSIsCisgICAgIkd1eWFuYSIsICJIYWl0aSIsICJIZWFyZCBJc2xhbmQgYW5kIE1jRG9uYWxkIElzbGFuZHMiLCAiSG9uZHVyYXMiLCAiSG9uZyBLb25nIiwgIkh1bmdhcnkiLAorICAgICJJY2VsYW5kIiwgIkluZGlhIiwgIkluZG9uZXNpYSIsICJJcmFuIiwgIklyYXEiLCAiSXJlbGFuZCIsICJJc3JhZWwiLCAiSXRhbHkiLCAiSmFtYWljYSIsCisgICAgIkphcGFuIiwgIkpvcmRhbiIsICJLYXpha2hzdGFuIiwgIktlbnlhIiwgIktpcmliYXRpIiwgIkt1d2FpdCIsICJLeXJneXpzdGFuIiwgIkxhb3MiLAorICAgICJMYXR2aWEiLCAiTGViYW5vbiIsICJMZXNvdGhvIiwgIkxpYmVyaWEiLCAiTGlieWEiLCAiTGllY2h0ZW5zdGVpbiIsICJMaXRodWFuaWEiLCAiTHV4ZW1ib3VyZyIsCisgICAgIk1hY2F1IiwgIk1hZGFnYXNjYXIiLCAiTWFsYXdpIiwgIk1hbGF5c2lhIiwgIk1hbGRpdmVzIiwgIk1hbGkiLCAiTWFsdGEiLCAiTWFyc2hhbGwgSXNsYW5kcyIsCisgICAgIk1hcnRpbmlxdWUiLCAiTWF1cml0YW5pYSIsICJNYXVyaXRpdXMiLCAiTWF5b3R0ZSIsICJNZXhpY28iLCAiTWljcm9uZXNpYSIsICJNb2xkb3ZhIiwKKyAgICAiTW9uYWNvIiwgIk1vbmdvbGlhIiwgIk1vbnRzZXJyYXQiLCAiTW9yb2NjbyIsICJNb3phbWJpcXVlIiwgIk15YW5tYXIiLCAiTmFtaWJpYSIsCisgICAgIk5hdXJ1IiwgIk5lcGFsIiwgIk5ldGhlcmxhbmRzIiwgIk5ldGhlcmxhbmRzIEFudGlsbGVzIiwgIk5ldyBDYWxlZG9uaWEiLCAiTmV3IFplYWxhbmQiLAorICAgICJOaWNhcmFndWEiLCAiTmlnZXIiLCAiTmlnZXJpYSIsICJOaXVlIiwgIk5vcmZvbGsgSXNsYW5kIiwgIk5vcnRoIEtvcmVhIiwgIk5vcnRoZXJuIE1hcmlhbmFzIiwKKyAgICAiTm9yd2F5IiwgIk9tYW4iLCAiUGFraXN0YW4iLCAiUGFsYXUiLCAiUGFuYW1hIiwgIlBhcHVhIE5ldyBHdWluZWEiLCAiUGFyYWd1YXkiLCAiUGVydSIsCisgICAgIlBoaWxpcHBpbmVzIiwgIlBpdGNhaXJuIElzbGFuZHMiLCAiUG9sYW5kIiwgIlBvcnR1Z2FsIiwgIlB1ZXJ0byBSaWNvIiwgIlFhdGFyIiwKKyAgICAiUmV1bmlvbiIsICJSb21hbmlhIiwgIlJ1c3NpYSIsICJSd2FuZGEiLCAiU3FvIFRvbWUgYW5kIFByaW5jaXBlIiwgIlNhaW50IEhlbGVuYSIsCisgICAgIlNhaW50IEtpdHRzIGFuZCBOZXZpcyIsICJTYWludCBMdWNpYSIsICJTYWludCBQaWVycmUgYW5kIE1pcXVlbG9uIiwKKyAgICAiU2FpbnQgVmluY2VudCBhbmQgdGhlIEdyZW5hZGluZXMiLCAiU2Ftb2EiLCAiU2FuIE1hcmlubyIsICJTYXVkaSBBcmFiaWEiLCAiU2VuZWdhbCIsCisgICAgIlNleWNoZWxsZXMiLCAiU2llcnJhIExlb25lIiwgIlNpbmdhcG9yZSIsICJTbG92YWtpYSIsICJTbG92ZW5pYSIsICJTb2xvbW9uIElzbGFuZHMiLAorICAgICJTb21hbGlhIiwgIlNvdXRoIEFmcmljYSIsICJTb3V0aCBHZW9yZ2lhIGFuZCB0aGUgU291dGggU2FuZHdpY2ggSXNsYW5kcyIsICJTb3V0aCBLb3JlYSIsCisgICAgIlNwYWluIiwgIlNyaSBMYW5rYSIsICJTdWRhbiIsICJTdXJpbmFtZSIsICJTdmFsYmFyZCBhbmQgSmFuIE1heWVuIiwgIlN3YXppbGFuZCIsICJTd2VkZW4iLAorICAgICJTd2l0emVybGFuZCIsICJTeXJpYSIsICJUYWl3YW4iLCAiVGFqaWtpc3RhbiIsICJUYW56YW5pYSIsICJUaGFpbGFuZCIsICJUaGUgQmFoYW1hcyIsCisgICAgIlRoZSBHYW1iaWEiLCAiVG9nbyIsICJUb2tlbGF1IiwgIlRvbmdhIiwgIlRyaW5pZGFkIGFuZCBUb2JhZ28iLCAiVHVuaXNpYSIsICJUdXJrZXkiLAorICAgICJUdXJrbWVuaXN0YW4iLCAiVHVya3MgYW5kIENhaWNvcyBJc2xhbmRzIiwgIlR1dmFsdSIsICJWaXJnaW4gSXNsYW5kcyIsICJVZ2FuZGEiLAorICAgICJVa3JhaW5lIiwgIlVuaXRlZCBBcmFiIEVtaXJhdGVzIiwgIlVuaXRlZCBLaW5nZG9tIiwKKyAgICAiVW5pdGVkIFN0YXRlcyIsICJVbml0ZWQgU3RhdGVzIE1pbm9yIE91dGx5aW5nIElzbGFuZHMiLCAiVXJ1Z3VheSIsICJVemJla2lzdGFuIiwKKyAgICAiVmFudWF0dSIsICJWYXRpY2FuIENpdHkiLCAiVmVuZXp1ZWxhIiwgIlZpZXRuYW0iLCAiV2FsbGlzIGFuZCBGdXR1bmEiLCAiV2VzdGVybiBTYWhhcmEiLAorICAgICJZZW1lbiIsICJZdWdvc2xhdmlhIiwgIlphbWJpYSIsICJaaW1iYWJ3ZSIKKyAgICB9OworCisgICAgaW50IG1XaWR0aDsKKyAgICBpbnQgbUhlaWdodDsKKworICAgIHB1YmxpYyBSc0xpc3RSUygpIHsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBpbml0KFJlbmRlclNjcmlwdEdMIHJzLCBSZXNvdXJjZXMgcmVzLCBpbnQgd2lkdGgsIGludCBoZWlnaHQpIHsKKyAgICAgICAgbVJTID0gcnM7CisgICAgICAgIG1SZXMgPSByZXM7CisgICAgICAgIG1XaWR0aCA9IHdpZHRoOworICAgICAgICBtSGVpZ2h0ID0gaGVpZ2h0OworICAgICAgICBpbml0UlMoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIFJlc291cmNlcyBtUmVzOworICAgIHByaXZhdGUgUmVuZGVyU2NyaXB0R0wgbVJTOworICAgIHByaXZhdGUgRm9udCBtSXRhbGljOworCisgICAgU2NyaXB0RmllbGRfTGlzdEFsbG9jc19zIG1MaXN0QWxsb2NzOworCisgICAgcHJpdmF0ZSBTY3JpcHRDX1JzbGlzdCBtU2NyaXB0OworCisgICAgaW50IG1MYXN0WDsKKyAgICBpbnQgbUxhc3RZOworCisgICAgcHVibGljIHZvaWQgb25BY3Rpb25Eb3duKGludCB4LCBpbnQgeSkgeworICAgICAgICBtU2NyaXB0LnNldF9nRFkoMC4wZik7CisKKyAgICAgICAgbUxhc3RYID0geDsKKyAgICAgICAgbUxhc3RZID0geTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBvbkFjdGlvbk1vdmUoaW50IHgsIGludCB5KSB7CisgICAgICAgIGludCBkeCA9IG1MYXN0WCAtIHg7CisgICAgICAgIGludCBkeSA9IG1MYXN0WSAtIHk7CisKKyAgICAgICAgaWYoTWF0aC5hYnMoZHkpIDw9IDIpIHsKKyAgICAgICAgICAgIGR5ID0gMDsKKyAgICAgICAgfQorCisgICAgICAgIG1TY3JpcHQuc2V0X2dEWShkeSk7CisKKyAgICAgICAgbUxhc3RYID0geDsKKyAgICAgICAgbUxhc3RZID0geTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgaW5pdFJTKCkgeworCisgICAgICAgIG1TY3JpcHQgPSBuZXcgU2NyaXB0Q19Sc2xpc3QobVJTLCBtUmVzLCBSLnJhdy5yc2xpc3QsIHRydWUpOworCisgICAgICAgIG1MaXN0QWxsb2NzID0gbmV3IFNjcmlwdEZpZWxkX0xpc3RBbGxvY3NfcyhtUlMsIERBVEFfTElTVC5sZW5ndGgpOworICAgICAgICBmb3IoaW50IGkgPSAwOyBpIDwgREFUQV9MSVNULmxlbmd0aDsgaSArKykgeworICAgICAgICAgICAgU2NyaXB0RmllbGRfTGlzdEFsbG9jc19zLkl0ZW0gbGlzdEVsZW0gPSBuZXcgU2NyaXB0RmllbGRfTGlzdEFsbG9jc19zLkl0ZW0oKTsKKyAgICAgICAgICAgIGxpc3RFbGVtLnRleHQgPSBBbGxvY2F0aW9uLmNyZWF0ZUZyb21TdHJpbmcobVJTLCBEQVRBX0xJU1RbaV0pOworICAgICAgICAgICAgbUxpc3RBbGxvY3Muc2V0KGxpc3RFbGVtLCBpLCBmYWxzZSk7CisgICAgICAgIH0KKworICAgICAgICBtTGlzdEFsbG9jcy5jb3B5QWxsKCk7CisKKyAgICAgICAgbVNjcmlwdC5iaW5kX2dMaXN0KG1MaXN0QWxsb2NzKTsKKworICAgICAgICBtSXRhbGljID0gRm9udC5jcmVhdGVGcm9tRmFtaWx5KG1SUywgbVJlcywgInNlcmlmIiwgRm9udC5TdHlsZS5CT0xEX0lUQUxJQywgOCk7CisgICAgICAgIG1TY3JpcHQuc2V0X2dJdGFsaWMobUl0YWxpYyk7CisKKyAgICAgICAgbVJTLmNvbnRleHRCaW5kUm9vdFNjcmlwdChtU2NyaXB0KTsKKyAgICB9Cit9CisKKworCmRpZmYgLS1naXQgYS9saWJzL3JzL2phdmEvU2FtcGxlcy9zcmMvY29tL2FuZHJvaWQvc2FtcGxlcy9Sc0xpc3RWaWV3LmphdmEgYi9saWJzL3JzL2phdmEvU2FtcGxlcy9zcmMvY29tL2FuZHJvaWQvc2FtcGxlcy9Sc0xpc3RWaWV3LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjk4ZWEwOAotLS0gL2Rldi9udWxsCisrKyBiL2xpYnMvcnMvamF2YS9TYW1wbGVzL3NyYy9jb20vYW5kcm9pZC9zYW1wbGVzL1JzTGlzdFZpZXcuamF2YQpAQCAtMCwwICsxLDk4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5zYW1wbGVzOworCitpbXBvcnQgamF2YS5pby5Xcml0ZXI7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5TZW1hcGhvcmU7CisKK2ltcG9ydCBhbmRyb2lkLnJlbmRlcnNjcmlwdC5SU1N1cmZhY2VWaWV3OworaW1wb3J0IGFuZHJvaWQucmVuZGVyc2NyaXB0LlJlbmRlclNjcmlwdDsKK2ltcG9ydCBhbmRyb2lkLnJlbmRlcnNjcmlwdC5SZW5kZXJTY3JpcHRHTDsKKworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuUmVzb3VyY2VzOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuQml0bWFwRHJhd2FibGU7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZTsKK2ltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5NZXNzYWdlOworaW1wb3J0IGFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQ7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuU3VyZmFjZTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuU3VyZmFjZUhvbGRlcjsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuU3VyZmFjZVZpZXc7CitpbXBvcnQgYW5kcm9pZC52aWV3LktleUV2ZW50OworaW1wb3J0IGFuZHJvaWQudmlldy5Nb3Rpb25FdmVudDsKKworcHVibGljIGNsYXNzIFJzTGlzdFZpZXcgZXh0ZW5kcyBSU1N1cmZhY2VWaWV3IHsKKworICAgIHB1YmxpYyBSc0xpc3RWaWV3KENvbnRleHQgY29udGV4dCkgeworICAgICAgICBzdXBlcihjb250ZXh0KTsKKyAgICAgICAgLy9zZXRGb2N1c2FibGUodHJ1ZSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBSZW5kZXJTY3JpcHRHTCBtUlM7CisgICAgcHJpdmF0ZSBSc0xpc3RSUyBtUmVuZGVyOworCisKKyAgICBwdWJsaWMgdm9pZCBzdXJmYWNlQ2hhbmdlZChTdXJmYWNlSG9sZGVyIGhvbGRlciwgaW50IGZvcm1hdCwgaW50IHcsIGludCBoKSB7CisgICAgICAgIHN1cGVyLnN1cmZhY2VDaGFuZ2VkKGhvbGRlciwgZm9ybWF0LCB3LCBoKTsKKyAgICAgICAgaWYgKG1SUyA9PSBudWxsKSB7CisgICAgICAgICAgICBtUlMgPSBjcmVhdGVSZW5kZXJTY3JpcHQodHJ1ZSk7CisgICAgICAgICAgICBtUlMuY29udGV4dFNldFN1cmZhY2UodywgaCwgaG9sZGVyLmdldFN1cmZhY2UoKSk7CisgICAgICAgICAgICBtUmVuZGVyID0gbmV3IFJzTGlzdFJTKCk7CisgICAgICAgICAgICBtUmVuZGVyLmluaXQobVJTLCBnZXRSZXNvdXJjZXMoKSwgdywgaCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvbkRldGFjaGVkRnJvbVdpbmRvdygpIHsKKyAgICAgICAgaWYobVJTICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1SUyA9IG51bGw7CisgICAgICAgICAgICBkZXN0cm95UmVuZGVyU2NyaXB0KCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBvbktleURvd24oaW50IGtleUNvZGUsIEtleUV2ZW50IGV2ZW50KQorICAgIHsKKyAgICAgICAgLy8gYnJlYWsgcG9pbnQgYXQgaGVyZQorICAgICAgICAvLyB0aGlzIG1ldGhvZCBkb2Vzbid0IHdvcmsgd2hlbiAnZXh0ZW5kcyBWaWV3JyBpbmNsdWRlICdleHRlbmRzIFNjcm9sbFZpZXcnLgorICAgICAgICByZXR1cm4gc3VwZXIub25LZXlEb3duKGtleUNvZGUsIGV2ZW50KTsKKyAgICB9CisKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIG9uVG91Y2hFdmVudChNb3Rpb25FdmVudCBldikKKyAgICB7CisgICAgICAgIGJvb2xlYW4gcmV0ID0gZmFsc2U7CisgICAgICAgIGludCBhY3QgPSBldi5nZXRBY3Rpb24oKTsKKyAgICAgICAgaWYgKGFjdCA9PSBldi5BQ1RJT05fRE9XTikgeworICAgICAgICAgICAgbVJlbmRlci5vbkFjdGlvbkRvd24oKGludClldi5nZXRYKCksIChpbnQpZXYuZ2V0WSgpKTsKKyAgICAgICAgICAgIHJldCA9IHRydWU7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoYWN0ID09IGV2LkFDVElPTl9NT1ZFKSB7CisgICAgICAgICAgICBtUmVuZGVyLm9uQWN0aW9uTW92ZSgoaW50KWV2LmdldFgoKSwgKGludClldi5nZXRZKCkpOworICAgICAgICAgICAgcmV0ID0gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorfQorCisKZGlmZiAtLWdpdCBhL2xpYnMvcnMvamF2YS9TYW1wbGVzL3NyYy9jb20vYW5kcm9pZC9zYW1wbGVzL1JzUmVuZGVyU3RhdGVzLmphdmEgYi9saWJzL3JzL2phdmEvU2FtcGxlcy9zcmMvY29tL2FuZHJvaWQvc2FtcGxlcy9Sc1JlbmRlclN0YXRlcy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5MTAwN2UKLS0tIC9kZXYvbnVsbAorKysgYi9saWJzL3JzL2phdmEvU2FtcGxlcy9zcmMvY29tL2FuZHJvaWQvc2FtcGxlcy9Sc1JlbmRlclN0YXRlcy5qYXZhCkBAIC0wLDAgKzEsNzEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLnNhbXBsZXM7CisKK2ltcG9ydCBhbmRyb2lkLnJlbmRlcnNjcmlwdC5SU1N1cmZhY2VWaWV3OworaW1wb3J0IGFuZHJvaWQucmVuZGVyc2NyaXB0LlJlbmRlclNjcmlwdDsKKworaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuQ29uZmlndXJhdGlvbjsKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKK2ltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5Mb29wZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5NZXNzYWdlOworaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuU2V0dGluZ3MuU3lzdGVtOworaW1wb3J0IGFuZHJvaWQudXRpbC5Db25maWc7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuTWVudTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuTWVudUl0ZW07CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CitpbXBvcnQgYW5kcm9pZC52aWV3LldpbmRvdzsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5CdXR0b247CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuTGlzdFZpZXc7CisKK2ltcG9ydCBqYXZhLmxhbmcuUnVudGltZTsKKworcHVibGljIGNsYXNzIFJzUmVuZGVyU3RhdGVzIGV4dGVuZHMgQWN0aXZpdHkgeworCisgICAgcHJpdmF0ZSBSc1JlbmRlclN0YXRlc1ZpZXcgbVZpZXc7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvbkNyZWF0ZShCdW5kbGUgaWNpY2xlKSB7CisgICAgICAgIHN1cGVyLm9uQ3JlYXRlKGljaWNsZSk7CisKKyAgICAgICAgLy8gQ3JlYXRlIG91ciBQcmV2aWV3IHZpZXcgYW5kIHNldCBpdCBhcyB0aGUgY29udGVudCBvZiBvdXIKKyAgICAgICAgLy8gQWN0aXZpdHkKKyAgICAgICAgbVZpZXcgPSBuZXcgUnNSZW5kZXJTdGF0ZXNWaWV3KHRoaXMpOworICAgICAgICBzZXRDb250ZW50VmlldyhtVmlldyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25SZXN1bWUoKSB7CisgICAgICAgIC8vIElkZWFsbHkgYSBnYW1lIHNob3VsZCBpbXBsZW1lbnQgb25SZXN1bWUoKSBhbmQgb25QYXVzZSgpCisgICAgICAgIC8vIHRvIHRha2UgYXBwcm9wcmlhdGUgYWN0aW9uIHdoZW4gdGhlIGFjdGl2aXR5IGxvb3NlcyBmb2N1cworICAgICAgICBzdXBlci5vblJlc3VtZSgpOworICAgICAgICBtVmlldy5vblJlc3VtZSgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG9uUGF1c2UoKSB7CisgICAgICAgIC8vIElkZWFsbHkgYSBnYW1lIHNob3VsZCBpbXBsZW1lbnQgb25SZXN1bWUoKSBhbmQgb25QYXVzZSgpCisgICAgICAgIC8vIHRvIHRha2UgYXBwcm9wcmlhdGUgYWN0aW9uIHdoZW4gdGhlIGFjdGl2aXR5IGxvb3NlcyBmb2N1cworICAgICAgICBzdXBlci5vblBhdXNlKCk7CisgICAgICAgIG1WaWV3Lm9uUGF1c2UoKTsKKyAgICB9CisKK30KKwpkaWZmIC0tZ2l0IGEvbGlicy9ycy9qYXZhL1NhbXBsZXMvc3JjL2NvbS9hbmRyb2lkL3NhbXBsZXMvUnNSZW5kZXJTdGF0ZXNSUy5qYXZhIGIvbGlicy9ycy9qYXZhL1NhbXBsZXMvc3JjL2NvbS9hbmRyb2lkL3NhbXBsZXMvUnNSZW5kZXJTdGF0ZXNSUy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ5MjA1MjcKLS0tIC9kZXYvbnVsbAorKysgYi9saWJzL3JzL2phdmEvU2FtcGxlcy9zcmMvY29tL2FuZHJvaWQvc2FtcGxlcy9Sc1JlbmRlclN0YXRlc1JTLmphdmEKQEAgLTAsMCArMSwzMjQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLnNhbXBsZXM7CisKK2ltcG9ydCBqYXZhLmlvLldyaXRlcjsKKworaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuUmVzb3VyY2VzOworaW1wb3J0IGFuZHJvaWQucmVuZGVyc2NyaXB0Lio7CitpbXBvcnQgYW5kcm9pZC5yZW5kZXJzY3JpcHQuUHJvZ3JhbVN0b3JlLkRlcHRoRnVuYzsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwRmFjdG9yeTsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkJpdG1hcDsKKworCitwdWJsaWMgY2xhc3MgUnNSZW5kZXJTdGF0ZXNSUyB7CisKKyAgICBpbnQgbVdpZHRoOworICAgIGludCBtSGVpZ2h0OworCisgICAgcHVibGljIFJzUmVuZGVyU3RhdGVzUlMoKSB7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgaW5pdChSZW5kZXJTY3JpcHRHTCBycywgUmVzb3VyY2VzIHJlcywgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KSB7CisgICAgICAgIG1SUyA9IHJzOworICAgICAgICBtUmVzID0gcmVzOworICAgICAgICBtV2lkdGggPSB3aWR0aDsKKyAgICAgICAgbUhlaWdodCA9IGhlaWdodDsKKyAgICAgICAgbU9wdGlvbnNBUkdCLmluU2NhbGVkID0gZmFsc2U7CisgICAgICAgIG1PcHRpb25zQVJHQi5pblByZWZlcnJlZENvbmZpZyA9IEJpdG1hcC5Db25maWcuQVJHQl84ODg4OworICAgICAgICBtTW9kZSA9IDA7CisgICAgICAgIG1NYXhNb2RlcyA9IDc7CisgICAgICAgIGluaXRSUygpOworICAgIH0KKworICAgIHByaXZhdGUgUmVzb3VyY2VzIG1SZXM7CisgICAgcHJpdmF0ZSBSZW5kZXJTY3JpcHRHTCBtUlM7CisKKyAgICBwcml2YXRlIFNhbXBsZXIgbUxpbmVhckNsYW1wOworICAgIHByaXZhdGUgU2FtcGxlciBtTGluZWFyV3JhcDsKKyAgICBwcml2YXRlIFNhbXBsZXIgbU1pcExpbmVhcldyYXA7CisgICAgcHJpdmF0ZSBTYW1wbGVyIG1OZWFyZXN0Q2xhbXA7CisKKyAgICBwcml2YXRlIFByb2dyYW1TdG9yZSBtUHJvZ1N0b3JlQmxlbmROb25lRGVwdGg7CisgICAgcHJpdmF0ZSBQcm9ncmFtU3RvcmUgbVByb2dTdG9yZUJsZW5kTm9uZTsKKyAgICBwcml2YXRlIFByb2dyYW1TdG9yZSBtUHJvZ1N0b3JlQmxlbmRBbHBoYTsKKyAgICBwcml2YXRlIFByb2dyYW1TdG9yZSBtUHJvZ1N0b3JlQmxlbmRBZGQ7CisKKyAgICBwcml2YXRlIFByb2dyYW1GcmFnbWVudCBtUHJvZ0ZyYWdtZW50VGV4dHVyZTsKKyAgICBwcml2YXRlIFByb2dyYW1GcmFnbWVudCBtUHJvZ0ZyYWdtZW50Q29sb3I7CisKKyAgICBwcml2YXRlIFByb2dyYW1WZXJ0ZXggbVByb2dWZXJ0ZXg7CisgICAgcHJpdmF0ZSBQcm9ncmFtVmVydGV4Lk1hdHJpeEFsbG9jYXRpb24gbVBWQTsKKworICAgIC8vIEN1c3RvbSBzaGFkZXJzCisgICAgcHJpdmF0ZSBQcm9ncmFtVmVydGV4IG1Qcm9nVmVydGV4Q3VzdG9tOworICAgIHByaXZhdGUgUHJvZ3JhbUZyYWdtZW50IG1Qcm9nRnJhZ21lbnRDdXN0b207CisgICAgcHJpdmF0ZSBTY3JpcHRGaWVsZF9WZXJ0ZXhTaGFkZXJDb25zdGFudHNfcyBtVlNDb25zdDsKKyAgICBwcml2YXRlIFNjcmlwdEZpZWxkX0ZyYWdlbnRTaGFkZXJDb25zdGFudHNfcyBtRlNDb25zdDsKKworICAgIHByaXZhdGUgUHJvZ3JhbVJhc3RlciBtQ3VsbEJhY2s7CisgICAgcHJpdmF0ZSBQcm9ncmFtUmFzdGVyIG1DdWxsRnJvbnQ7CisKKyAgICBwcml2YXRlIEFsbG9jYXRpb24gbVRleFRvcnVzOworICAgIHByaXZhdGUgQWxsb2NhdGlvbiBtVGV4T3BhcXVlOworICAgIHByaXZhdGUgQWxsb2NhdGlvbiBtVGV4VHJhbnNwYXJlbnQ7CisKKyAgICBwcml2YXRlIEFsbG9jYXRpb24gbUFsbG9jUFY7CisKKyAgICBwcml2YXRlIE1lc2ggbU1ieU5NZXNoOworICAgIHByaXZhdGUgTWVzaCBtVG9ydXM7CisKKyAgICBGb250IG1Gb250U2FuczsKKyAgICBGb250IG1Gb250U2VyaWY7CisgICAgRm9udCBtRm9udFNlcmlmQm9sZDsKKyAgICBGb250IG1Gb250U2VyaWZJdGFsaWM7CisgICAgRm9udCBtRm9udFNlcmlmQm9sZEl0YWxpYzsKKyAgICBGb250IG1Gb250TW9ubzsKKworICAgIHByaXZhdGUgQWxsb2NhdGlvbiBtVGV4dEFsbG9jOworCisgICAgcHJpdmF0ZSBTY3JpcHRDX1JzcmVuZGVyc3RhdGVzIG1TY3JpcHQ7CisKKyAgICBwcml2YXRlIGZpbmFsIEJpdG1hcEZhY3RvcnkuT3B0aW9ucyBtT3B0aW9uc0FSR0IgPSBuZXcgQml0bWFwRmFjdG9yeS5PcHRpb25zKCk7CisKKyAgICBpbnQgbU1vZGU7CisgICAgaW50IG1NYXhNb2RlczsKKworICAgIHB1YmxpYyB2b2lkIG9uQWN0aW9uRG93bihpbnQgeCwgaW50IHkpIHsKKyAgICAgICAgbU1vZGUgKys7CisgICAgICAgIG1Nb2RlID0gbU1vZGUgJSBtTWF4TW9kZXM7CisgICAgICAgIG1TY3JpcHQuc2V0X2dEaXNwbGF5TW9kZShtTW9kZSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBNZXNoIGdldE1ieU5NZXNoKGZsb2F0IHdpZHRoLCBmbG9hdCBoZWlnaHQsIGludCB3UmVzb2x1dGlvbiwgaW50IGhSZXNvbHV0aW9uKSB7CisKKyAgICAgICAgTWVzaC5UcmlhbmdsZU1lc2hCdWlsZGVyIHRtYiA9IG5ldyBNZXNoLlRyaWFuZ2xlTWVzaEJ1aWxkZXIobVJTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIsIE1lc2guVHJpYW5nbGVNZXNoQnVpbGRlci5URVhUVVJFXzApOworCisgICAgICAgIGZvciAoaW50IHkgPSAwOyB5IDw9IGhSZXNvbHV0aW9uOyB5KyspIHsKKyAgICAgICAgICAgIGZpbmFsIGZsb2F0IG5vcm1hbGl6ZWRZID0gKGZsb2F0KXkgLyBoUmVzb2x1dGlvbjsKKyAgICAgICAgICAgIGZpbmFsIGZsb2F0IHlPZmZzZXQgPSAobm9ybWFsaXplZFkgLSAwLjVmKSAqIGhlaWdodDsKKyAgICAgICAgICAgIGZvciAoaW50IHggPSAwOyB4IDw9IHdSZXNvbHV0aW9uOyB4KyspIHsKKyAgICAgICAgICAgICAgICBmbG9hdCBub3JtYWxpemVkWCA9IChmbG9hdCl4IC8gd1Jlc29sdXRpb247CisgICAgICAgICAgICAgICAgZmxvYXQgeE9mZnNldCA9IChub3JtYWxpemVkWCAtIDAuNWYpICogd2lkdGg7CisgICAgICAgICAgICAgICAgdG1iLnNldFRleHR1cmUobm9ybWFsaXplZFgsIG5vcm1hbGl6ZWRZKTsKKyAgICAgICAgICAgICAgICB0bWIuYWRkVmVydGV4KHhPZmZzZXQsIHlPZmZzZXQpOworICAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGZvciAoaW50IHkgPSAwOyB5IDwgaFJlc29sdXRpb247IHkrKykgeworICAgICAgICAgICAgZmluYWwgaW50IGN1clkgPSB5ICogKHdSZXNvbHV0aW9uICsgMSk7CisgICAgICAgICAgICBmaW5hbCBpbnQgYmVsb3dZID0gKHkgKyAxKSAqICh3UmVzb2x1dGlvbiArIDEpOworICAgICAgICAgICAgZm9yIChpbnQgeCA9IDA7IHggPCB3UmVzb2x1dGlvbjsgeCsrKSB7CisgICAgICAgICAgICAgICAgaW50IGN1clYgPSBjdXJZICsgeDsKKyAgICAgICAgICAgICAgICBpbnQgYmVsb3dWID0gYmVsb3dZICsgeDsKKyAgICAgICAgICAgICAgICB0bWIuYWRkVHJpYW5nbGUoY3VyViwgYmVsb3dWLCBjdXJWICsgMSk7CisgICAgICAgICAgICAgICAgdG1iLmFkZFRyaWFuZ2xlKGJlbG93ViwgYmVsb3dWICsgMSwgY3VyViArIDEpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHRtYi5jcmVhdGUodHJ1ZSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGluaXRQcm9ncmFtU3RvcmUoKSB7CisgICAgICAgIC8vIFVzZSBzdG9jayB0aGUgc3RvY2sgcHJvZ3JhbSBzdG9yZSBvYmplY3QKKyAgICAgICAgbVByb2dTdG9yZUJsZW5kTm9uZURlcHRoID0gUHJvZ3JhbVN0b3JlLkJMRU5EX05PTkVfREVQVEhfVEVTVChtUlMpOworICAgICAgICBtUHJvZ1N0b3JlQmxlbmROb25lID0gUHJvZ3JhbVN0b3JlLkJMRU5EX05PTkVfREVQVEhfTk9fREVQVEgobVJTKTsKKworICAgICAgICAvLyBDcmVhdGUgYSBjdXN0b20gcHJvZ3JhbSBzdG9yZQorICAgICAgICBQcm9ncmFtU3RvcmUuQnVpbGRlciBidWlsZGVyID0gbmV3IFByb2dyYW1TdG9yZS5CdWlsZGVyKG1SUyk7CisgICAgICAgIGJ1aWxkZXIuc2V0RGVwdGhGdW5jKFByb2dyYW1TdG9yZS5EZXB0aEZ1bmMuQUxXQVlTKTsKKyAgICAgICAgYnVpbGRlci5zZXRCbGVuZEZ1bmMoUHJvZ3JhbVN0b3JlLkJsZW5kU3JjRnVuYy5TUkNfQUxQSEEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb2dyYW1TdG9yZS5CbGVuZERzdEZ1bmMuT05FX01JTlVTX1NSQ19BTFBIQSk7CisgICAgICAgIGJ1aWxkZXIuc2V0RGl0aGVyRW5hYmxlKGZhbHNlKTsKKyAgICAgICAgYnVpbGRlci5zZXREZXB0aE1hc2soZmFsc2UpOworICAgICAgICBtUHJvZ1N0b3JlQmxlbmRBbHBoYSA9IGJ1aWxkZXIuY3JlYXRlKCk7CisKKyAgICAgICAgbVByb2dTdG9yZUJsZW5kQWRkID0gUHJvZ3JhbVN0b3JlLkJMRU5EX0FERF9ERVBUSF9OT19ERVBUSChtUlMpOworCisgICAgICAgIG1TY3JpcHQuc2V0X2dQcm9nU3RvcmVCbGVuZE5vbmVEZXB0aChtUHJvZ1N0b3JlQmxlbmROb25lRGVwdGgpOworICAgICAgICBtU2NyaXB0LnNldF9nUHJvZ1N0b3JlQmxlbmROb25lKG1Qcm9nU3RvcmVCbGVuZE5vbmUpOworICAgICAgICBtU2NyaXB0LnNldF9nUHJvZ1N0b3JlQmxlbmRBbHBoYShtUHJvZ1N0b3JlQmxlbmRBbHBoYSk7CisgICAgICAgIG1TY3JpcHQuc2V0X2dQcm9nU3RvcmVCbGVuZEFkZChtUHJvZ1N0b3JlQmxlbmRBZGQpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBpbml0UHJvZ3JhbUZyYWdtZW50KCkgeworCisgICAgICAgIFByb2dyYW1GcmFnbWVudC5CdWlsZGVyIHRleEJ1aWxkZXIgPSBuZXcgUHJvZ3JhbUZyYWdtZW50LkJ1aWxkZXIobVJTKTsKKyAgICAgICAgdGV4QnVpbGRlci5zZXRUZXh0dXJlKFByb2dyYW1GcmFnbWVudC5CdWlsZGVyLkVudk1vZGUuUkVQTEFDRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb2dyYW1GcmFnbWVudC5CdWlsZGVyLkZvcm1hdC5SR0JBLCAwKTsKKyAgICAgICAgbVByb2dGcmFnbWVudFRleHR1cmUgPSB0ZXhCdWlsZGVyLmNyZWF0ZSgpOworICAgICAgICBtUHJvZ0ZyYWdtZW50VGV4dHVyZS5iaW5kU2FtcGxlcihtTGluZWFyQ2xhbXAsIDApOworCisgICAgICAgIFByb2dyYW1GcmFnbWVudC5CdWlsZGVyIGNvbEJ1aWxkZXIgPSBuZXcgUHJvZ3JhbUZyYWdtZW50LkJ1aWxkZXIobVJTKTsKKyAgICAgICAgY29sQnVpbGRlci5zZXRWYXJ5aW5nQ29sb3IoZmFsc2UpOworICAgICAgICBtUHJvZ0ZyYWdtZW50Q29sb3IgPSBjb2xCdWlsZGVyLmNyZWF0ZSgpOworCisgICAgICAgIG1TY3JpcHQuc2V0X2dQcm9nRnJhZ21lbnRDb2xvcihtUHJvZ0ZyYWdtZW50Q29sb3IpOworICAgICAgICBtU2NyaXB0LnNldF9nUHJvZ0ZyYWdtZW50VGV4dHVyZShtUHJvZ0ZyYWdtZW50VGV4dHVyZSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGluaXRQcm9ncmFtVmVydGV4KCkgeworICAgICAgICBQcm9ncmFtVmVydGV4LkJ1aWxkZXIgcHZiID0gbmV3IFByb2dyYW1WZXJ0ZXguQnVpbGRlcihtUlMpOworICAgICAgICBtUHJvZ1ZlcnRleCA9IHB2Yi5jcmVhdGUoKTsKKworICAgICAgICBtUFZBID0gbmV3IFByb2dyYW1WZXJ0ZXguTWF0cml4QWxsb2NhdGlvbihtUlMpOworICAgICAgICBtUHJvZ1ZlcnRleC5iaW5kQWxsb2NhdGlvbihtUFZBKTsKKyAgICAgICAgbVBWQS5zZXR1cE9ydGhvV2luZG93KG1XaWR0aCwgbUhlaWdodCk7CisKKyAgICAgICAgbVNjcmlwdC5zZXRfZ1Byb2dWZXJ0ZXgobVByb2dWZXJ0ZXgpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBpbml0Q3VzdG9tU2hhZGVycygpIHsKKyAgICAgICAgbVZTQ29uc3QgPSBuZXcgU2NyaXB0RmllbGRfVmVydGV4U2hhZGVyQ29uc3RhbnRzX3MobVJTLCAxKTsKKyAgICAgICAgbUZTQ29uc3QgPSBuZXcgU2NyaXB0RmllbGRfRnJhZ2VudFNoYWRlckNvbnN0YW50c19zKG1SUywgMSk7CisKKyAgICAgICAgbVNjcmlwdC5iaW5kX2dWU0NvbnN0YW50cyhtVlNDb25zdCk7CisgICAgICAgIG1TY3JpcHQuYmluZF9nRlNDb25zdGFudHMobUZTQ29uc3QpOworCisgICAgICAgIC8vIEluaXRpYWxpemUgdGhlIHNoYWRlciBidWlsZGVyCisgICAgICAgIFByb2dyYW1WZXJ0ZXguU2hhZGVyQnVpbGRlciBwdmJDdXN0b20gPSBuZXcgUHJvZ3JhbVZlcnRleC5TaGFkZXJCdWlsZGVyKG1SUyk7CisgICAgICAgIC8vIFNwZWNpZnkgdGhlIHJlc291cmNlIHRoYXQgY29udGFpbnMgdGhlIHNoYWRlciBzdHJpbmcKKyAgICAgICAgcHZiQ3VzdG9tLnNldFNoYWRlcihtUmVzLCBSLnJhdy5zaGFkZXJ2KTsKKyAgICAgICAgLy8gVXNlIGEgc2NyaXB0IGZpZWxkIHRvIHNwY2lmeSB0aGUgaW5wdXQgbGF5b3V0CisgICAgICAgIHB2YkN1c3RvbS5hZGRJbnB1dChTY3JpcHRGaWVsZF9WZXJ0ZXhTaGFkZXJJbnB1dHNfcy5jcmVhdGVFbGVtZW50KG1SUykpOworICAgICAgICAvLyBEZWZpbmUgdGhlIGNvbnN0YW50IGlucHV0IGxheW91dAorICAgICAgICBwdmJDdXN0b20uYWRkQ29uc3RhbnQobVZTQ29uc3QuZ2V0QWxsb2NhdGlvbigpLmdldFR5cGUoKSk7CisgICAgICAgIG1Qcm9nVmVydGV4Q3VzdG9tID0gcHZiQ3VzdG9tLmNyZWF0ZSgpOworICAgICAgICAvLyBCaW5kIHRoZSBzb3VyY2Ugb2YgY29uc3RhbnQgZGF0YQorICAgICAgICBtUHJvZ1ZlcnRleEN1c3RvbS5iaW5kQ29uc3RhbnRzKG1WU0NvbnN0LmdldEFsbG9jYXRpb24oKSwgMCk7CisKKyAgICAgICAgUHJvZ3JhbUZyYWdtZW50LlNoYWRlckJ1aWxkZXIgcGZiQ3VzdG9tID0gbmV3IFByb2dyYW1GcmFnbWVudC5TaGFkZXJCdWlsZGVyKG1SUyk7CisgICAgICAgIC8vIFNwZWNpZnkgdGhlIHJlc291cmNlIHRoYXQgY29udGFpbnMgdGhlIHNoYWRlciBzdHJpbmcKKyAgICAgICAgcGZiQ3VzdG9tLnNldFNoYWRlcihtUmVzLCBSLnJhdy5zaGFkZXJmKTsKKyAgICAgICAgLy9UZWxsIHRoZSBidWlsZGVyIGhvdyBtYW55IHRleHR1cmVzIHdlIGhhdmUKKyAgICAgICAgcGZiQ3VzdG9tLnNldFRleHR1cmVDb3VudCgxKTsKKyAgICAgICAgLy8gRGVmaW5lIHRoZSBjb25zdGFudCBpbnB1dCBsYXlvdXQKKyAgICAgICAgcGZiQ3VzdG9tLmFkZENvbnN0YW50KG1GU0NvbnN0LmdldEFsbG9jYXRpb24oKS5nZXRUeXBlKCkpOworICAgICAgICBtUHJvZ0ZyYWdtZW50Q3VzdG9tID0gcGZiQ3VzdG9tLmNyZWF0ZSgpOworICAgICAgICAvLyBCaW5kIHRoZSBzb3VyY2Ugb2YgY29uc3RhbnQgZGF0YQorICAgICAgICBtUHJvZ0ZyYWdtZW50Q3VzdG9tLmJpbmRDb25zdGFudHMobUZTQ29uc3QuZ2V0QWxsb2NhdGlvbigpLCAwKTsKKworICAgICAgICBtU2NyaXB0LnNldF9nUHJvZ1ZlcnRleEN1c3RvbShtUHJvZ1ZlcnRleEN1c3RvbSk7CisgICAgICAgIG1TY3JpcHQuc2V0X2dQcm9nRnJhZ21lbnRDdXN0b20obVByb2dGcmFnbWVudEN1c3RvbSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBBbGxvY2F0aW9uIGxvYWRUZXh0dXJlUkdCKGludCBpZCkgeworICAgICAgICBmaW5hbCBBbGxvY2F0aW9uIGFsbG9jYXRpb24gPSBBbGxvY2F0aW9uLmNyZWF0ZUZyb21CaXRtYXBSZXNvdXJjZShtUlMsIG1SZXMsCisgICAgICAgICAgICAgICAgaWQsIEVsZW1lbnQuUkdCXzU2NShtUlMpLCB0cnVlKTsKKyAgICAgICAgYWxsb2NhdGlvbi51cGxvYWRUb1RleHR1cmUoMCk7CisgICAgICAgIHJldHVybiBhbGxvY2F0aW9uOworICAgIH0KKworICAgIHByaXZhdGUgQWxsb2NhdGlvbiBsb2FkVGV4dHVyZUFSR0IoaW50IGlkKSB7CisgICAgICAgIEJpdG1hcCBiID0gQml0bWFwRmFjdG9yeS5kZWNvZGVSZXNvdXJjZShtUmVzLCBpZCwgbU9wdGlvbnNBUkdCKTsKKyAgICAgICAgZmluYWwgQWxsb2NhdGlvbiBhbGxvY2F0aW9uID0gQWxsb2NhdGlvbi5jcmVhdGVGcm9tQml0bWFwKG1SUywgYiwgRWxlbWVudC5SR0JBXzg4ODgobVJTKSwgdHJ1ZSk7CisgICAgICAgIGFsbG9jYXRpb24udXBsb2FkVG9UZXh0dXJlKDApOworICAgICAgICByZXR1cm4gYWxsb2NhdGlvbjsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgbG9hZEltYWdlcygpIHsKKyAgICAgICAgbVRleFRvcnVzID0gbG9hZFRleHR1cmVSR0IoUi5kcmF3YWJsZS50b3J1c21hcCk7CisgICAgICAgIG1UZXhPcGFxdWUgPSBsb2FkVGV4dHVyZVJHQihSLmRyYXdhYmxlLmRhdGEpOworICAgICAgICBtVGV4VHJhbnNwYXJlbnQgPSBsb2FkVGV4dHVyZUFSR0IoUi5kcmF3YWJsZS5sZWFmKTsKKworICAgICAgICBtU2NyaXB0LnNldF9nVGV4VG9ydXMobVRleFRvcnVzKTsKKyAgICAgICAgbVNjcmlwdC5zZXRfZ1RleE9wYXF1ZShtVGV4T3BhcXVlKTsKKyAgICAgICAgbVNjcmlwdC5zZXRfZ1RleFRyYW5zcGFyZW50KG1UZXhUcmFuc3BhcmVudCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGluaXRGb250cygpIHsKKyAgICAgICAgLy8gU2FucyBmb250IGJ5IGZhbWlseSBuYW1lCisgICAgICAgIG1Gb250U2FucyA9IEZvbnQuY3JlYXRlRnJvbUZhbWlseShtUlMsIG1SZXMsICJzYW5zLXNlcmlmIiwgRm9udC5TdHlsZS5OT1JNQUwsIDgpOworICAgICAgICAvLyBDcmVhdGUgZm9udCBieSBmaWxlIG5hbWUKKyAgICAgICAgbUZvbnRTZXJpZiA9IEZvbnQuY3JlYXRlKG1SUywgbVJlcywgIkRyb2lkU2VyaWYtUmVndWxhci50dGYiLCA4KTsKKyAgICAgICAgLy8gQ3JlYXRlIGZvbnRzIGJ5IGZhbWlseSBhbmQgc3R5bGUKKyAgICAgICAgbUZvbnRTZXJpZkJvbGQgPSBGb250LmNyZWF0ZUZyb21GYW1pbHkobVJTLCBtUmVzLCAic2VyaWYiLCBGb250LlN0eWxlLkJPTEQsIDgpOworICAgICAgICBtRm9udFNlcmlmSXRhbGljID0gRm9udC5jcmVhdGVGcm9tRmFtaWx5KG1SUywgbVJlcywgInNlcmlmIiwgRm9udC5TdHlsZS5JVEFMSUMsIDgpOworICAgICAgICBtRm9udFNlcmlmQm9sZEl0YWxpYyA9IEZvbnQuY3JlYXRlRnJvbUZhbWlseShtUlMsIG1SZXMsICJzZXJpZiIsIEZvbnQuU3R5bGUuQk9MRF9JVEFMSUMsIDgpOworICAgICAgICBtRm9udE1vbm8gPSBGb250LmNyZWF0ZUZyb21GYW1pbHkobVJTLCBtUmVzLCAibW9ubyIsIEZvbnQuU3R5bGUuTk9STUFMLCA4KTsKKworICAgICAgICBtU2NyaXB0LnNldF9nRm9udFNhbnMobUZvbnRTYW5zKTsKKyAgICAgICAgbVNjcmlwdC5zZXRfZ0ZvbnRTZXJpZihtRm9udFNlcmlmKTsKKyAgICAgICAgbVNjcmlwdC5zZXRfZ0ZvbnRTZXJpZkJvbGQobUZvbnRTZXJpZkJvbGQpOworICAgICAgICBtU2NyaXB0LnNldF9nRm9udFNlcmlmSXRhbGljKG1Gb250U2VyaWZJdGFsaWMpOworICAgICAgICBtU2NyaXB0LnNldF9nRm9udFNlcmlmQm9sZEl0YWxpYyhtRm9udFNlcmlmQm9sZEl0YWxpYyk7CisgICAgICAgIG1TY3JpcHQuc2V0X2dGb250TW9ubyhtRm9udE1vbm8pOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBpbml0TWVzaCgpIHsKKyAgICAgICAgbU1ieU5NZXNoID0gZ2V0TWJ5Tk1lc2goMjU2LCAyNTYsIDEwLCAxMCk7CisgICAgICAgIG1TY3JpcHQuc2V0X2dNYnlOTWVzaChtTWJ5Tk1lc2gpOworCisgICAgICAgIEZpbGVBM0QgbW9kZWwgPSBGaWxlQTNELmNyZWF0ZUZyb21SZXNvdXJjZShtUlMsIG1SZXMsIFIucmF3LnRvcnVzKTsKKyAgICAgICAgRmlsZUEzRC5JbmRleEVudHJ5IGVudHJ5ID0gbW9kZWwuZ2V0SW5kZXhFbnRyeSgwKTsKKyAgICAgICAgaWYoZW50cnkgPT0gbnVsbCB8fCBlbnRyeS5nZXRDbGFzc0lEKCkgIT0gRmlsZUEzRC5DbGFzc0lELk1FU0gpIHsKKyAgICAgICAgICAgIExvZy5lKCJycyIsICJjb3VsZCBub3QgbG9hZCBtb2RlbCIpOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgbVRvcnVzID0gKE1lc2gpZW50cnkuZ2V0T2JqZWN0KCk7CisgICAgICAgICAgICBtU2NyaXB0LnNldF9nVG9ydXNNZXNoKG1Ub3J1cyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgaW5pdFNhbXBsZXJzKCkgeworICAgICAgICBTYW1wbGVyLkJ1aWxkZXIgYnMgPSBuZXcgU2FtcGxlci5CdWlsZGVyKG1SUyk7CisgICAgICAgIGJzLnNldE1pbihTYW1wbGVyLlZhbHVlLkxJTkVBUik7CisgICAgICAgIGJzLnNldE1hZyhTYW1wbGVyLlZhbHVlLkxJTkVBUik7CisgICAgICAgIGJzLnNldFdyYXBTKFNhbXBsZXIuVmFsdWUuV1JBUCk7CisgICAgICAgIGJzLnNldFdyYXBUKFNhbXBsZXIuVmFsdWUuV1JBUCk7CisgICAgICAgIG1MaW5lYXJXcmFwID0gYnMuY3JlYXRlKCk7CisKKyAgICAgICAgbUxpbmVhckNsYW1wID0gU2FtcGxlci5DTEFNUF9MSU5FQVIobVJTKTsKKyAgICAgICAgbU5lYXJlc3RDbGFtcCA9IFNhbXBsZXIuQ0xBTVBfTkVBUkVTVChtUlMpOworICAgICAgICBtTWlwTGluZWFyV3JhcCA9IFNhbXBsZXIuV1JBUF9MSU5FQVJfTUlQX0xJTkVBUihtUlMpOworCisgICAgICAgIG1TY3JpcHQuc2V0X2dMaW5lYXJDbGFtcChtTGluZWFyQ2xhbXApOworICAgICAgICBtU2NyaXB0LnNldF9nTGluZWFyV3JhcChtTGluZWFyV3JhcCk7CisgICAgICAgIG1TY3JpcHQuc2V0X2dNaXBMaW5lYXJXcmFwKG1NaXBMaW5lYXJXcmFwKTsKKyAgICAgICAgbVNjcmlwdC5zZXRfZ05lYXJlc3RDbGFtcChtTmVhcmVzdENsYW1wKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgaW5pdFByb2dyYW1SYXN0ZXIoKSB7CisgICAgICAgIG1DdWxsQmFjayA9IFByb2dyYW1SYXN0ZXIuQ1VMTF9CQUNLKG1SUyk7CisgICAgICAgIG1DdWxsRnJvbnQgPSBQcm9ncmFtUmFzdGVyLkNVTExfRlJPTlQobVJTKTsKKworICAgICAgICBtU2NyaXB0LnNldF9nQ3VsbEJhY2sobUN1bGxCYWNrKTsKKyAgICAgICAgbVNjcmlwdC5zZXRfZ0N1bGxGcm9udChtQ3VsbEZyb250KTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgaW5pdFJTKCkgeworCisgICAgICAgIG1TY3JpcHQgPSBuZXcgU2NyaXB0Q19Sc3JlbmRlcnN0YXRlcyhtUlMsIG1SZXMsIFIucmF3LnJzcmVuZGVyc3RhdGVzLCB0cnVlKTsKKworICAgICAgICBpbml0U2FtcGxlcnMoKTsKKyAgICAgICAgaW5pdFByb2dyYW1TdG9yZSgpOworICAgICAgICBpbml0UHJvZ3JhbUZyYWdtZW50KCk7CisgICAgICAgIGluaXRQcm9ncmFtVmVydGV4KCk7CisgICAgICAgIGluaXRGb250cygpOworICAgICAgICBsb2FkSW1hZ2VzKCk7CisgICAgICAgIGluaXRNZXNoKCk7CisgICAgICAgIGluaXRQcm9ncmFtUmFzdGVyKCk7CisgICAgICAgIGluaXRDdXN0b21TaGFkZXJzKCk7CisKKyAgICAgICAgbVJTLmNvbnRleHRCaW5kUm9vdFNjcmlwdChtU2NyaXB0KTsKKyAgICB9Cit9CisKKworCmRpZmYgLS1naXQgYS9saWJzL3JzL2phdmEvU2FtcGxlcy9zcmMvY29tL2FuZHJvaWQvc2FtcGxlcy9Sc1JlbmRlclN0YXRlc1ZpZXcuamF2YSBiL2xpYnMvcnMvamF2YS9TYW1wbGVzL3NyYy9jb20vYW5kcm9pZC9zYW1wbGVzL1JzUmVuZGVyU3RhdGVzVmlldy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU1NDhkZTMKLS0tIC9kZXYvbnVsbAorKysgYi9saWJzL3JzL2phdmEvU2FtcGxlcy9zcmMvY29tL2FuZHJvaWQvc2FtcGxlcy9Sc1JlbmRlclN0YXRlc1ZpZXcuamF2YQpAQCAtMCwwICsxLDk0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5zYW1wbGVzOworCitpbXBvcnQgamF2YS5pby5Xcml0ZXI7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5TZW1hcGhvcmU7CisKK2ltcG9ydCBhbmRyb2lkLnJlbmRlcnNjcmlwdC5SU1N1cmZhY2VWaWV3OworaW1wb3J0IGFuZHJvaWQucmVuZGVyc2NyaXB0LlJlbmRlclNjcmlwdDsKK2ltcG9ydCBhbmRyb2lkLnJlbmRlcnNjcmlwdC5SZW5kZXJTY3JpcHRHTDsKKworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuUmVzb3VyY2VzOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuQml0bWFwRHJhd2FibGU7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZTsKK2ltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5NZXNzYWdlOworaW1wb3J0IGFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQ7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuU3VyZmFjZTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuU3VyZmFjZUhvbGRlcjsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuU3VyZmFjZVZpZXc7CitpbXBvcnQgYW5kcm9pZC52aWV3LktleUV2ZW50OworaW1wb3J0IGFuZHJvaWQudmlldy5Nb3Rpb25FdmVudDsKKworcHVibGljIGNsYXNzIFJzUmVuZGVyU3RhdGVzVmlldyBleHRlbmRzIFJTU3VyZmFjZVZpZXcgeworCisgICAgcHVibGljIFJzUmVuZGVyU3RhdGVzVmlldyhDb250ZXh0IGNvbnRleHQpIHsKKyAgICAgICAgc3VwZXIoY29udGV4dCk7CisgICAgICAgIC8vc2V0Rm9jdXNhYmxlKHRydWUpOworICAgIH0KKworICAgIHByaXZhdGUgUmVuZGVyU2NyaXB0R0wgbVJTOworICAgIHByaXZhdGUgUnNSZW5kZXJTdGF0ZXNSUyBtUmVuZGVyOworCisKKyAgICBwdWJsaWMgdm9pZCBzdXJmYWNlQ2hhbmdlZChTdXJmYWNlSG9sZGVyIGhvbGRlciwgaW50IGZvcm1hdCwgaW50IHcsIGludCBoKSB7CisgICAgICAgIHN1cGVyLnN1cmZhY2VDaGFuZ2VkKGhvbGRlciwgZm9ybWF0LCB3LCBoKTsKKyAgICAgICAgaWYgKG1SUyA9PSBudWxsKSB7CisgICAgICAgICAgICBtUlMgPSBjcmVhdGVSZW5kZXJTY3JpcHQodHJ1ZSk7CisgICAgICAgICAgICBtUlMuY29udGV4dFNldFN1cmZhY2UodywgaCwgaG9sZGVyLmdldFN1cmZhY2UoKSk7CisgICAgICAgICAgICBtUmVuZGVyID0gbmV3IFJzUmVuZGVyU3RhdGVzUlMoKTsKKyAgICAgICAgICAgIG1SZW5kZXIuaW5pdChtUlMsIGdldFJlc291cmNlcygpLCB3LCBoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG9uRGV0YWNoZWRGcm9tV2luZG93KCkgeworICAgICAgICBpZihtUlMgIT0gbnVsbCkgeworICAgICAgICAgICAgbVJTID0gbnVsbDsKKyAgICAgICAgICAgIGRlc3Ryb3lSZW5kZXJTY3JpcHQoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIG9uS2V5RG93bihpbnQga2V5Q29kZSwgS2V5RXZlbnQgZXZlbnQpCisgICAgeworICAgICAgICAvLyBicmVhayBwb2ludCBhdCBoZXJlCisgICAgICAgIC8vIHRoaXMgbWV0aG9kIGRvZXNuJ3Qgd29yayB3aGVuICdleHRlbmRzIFZpZXcnIGluY2x1ZGUgJ2V4dGVuZHMgU2Nyb2xsVmlldycuCisgICAgICAgIHJldHVybiBzdXBlci5vbktleURvd24oa2V5Q29kZSwgZXZlbnQpOworICAgIH0KKworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gb25Ub3VjaEV2ZW50KE1vdGlvbkV2ZW50IGV2KQorICAgIHsKKyAgICAgICAgYm9vbGVhbiByZXQgPSBmYWxzZTsKKyAgICAgICAgaW50IGFjdCA9IGV2LmdldEFjdGlvbigpOworICAgICAgICBpZiAoYWN0ID09IGV2LkFDVElPTl9ET1dOKSB7CisgICAgICAgICAgICBtUmVuZGVyLm9uQWN0aW9uRG93bigoaW50KWV2LmdldFgoKSwgKGludClldi5nZXRZKCkpOworICAgICAgICAgICAgcmV0ID0gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorfQorCisKZGlmZiAtLWdpdCBhL2xpYnMvcnMvamF2YS9TYW1wbGVzL3NyYy9jb20vYW5kcm9pZC9zYW1wbGVzL3JzbGlzdC5ycyBiL2xpYnMvcnMvamF2YS9TYW1wbGVzL3NyYy9jb20vYW5kcm9pZC9zYW1wbGVzL3JzbGlzdC5ycwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYzNmNDYzCi0tLSAvZGV2L251bGwKKysrIGIvbGlicy9ycy9qYXZhL1NhbXBsZXMvc3JjL2NvbS9hbmRyb2lkL3NhbXBsZXMvcnNsaXN0LnJzCkBAIC0wLDAgKzEsNzMgQEAKKy8vIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjcHJhZ21hIHZlcnNpb24oMSkKKworI3ByYWdtYSBycyBqYXZhX3BhY2thZ2VfbmFtZShjb20uYW5kcm9pZC5zYW1wbGVzKQorCisjaW5jbHVkZSAicnNfZ3JhcGhpY3MucnNoIgorCitmbG9hdCBnRFk7CisKK3JzX2ZvbnQgZ0l0YWxpYzsKKwordHlwZWRlZiBzdHJ1Y3QgTGlzdEFsbG9jc19zIHsKKyAgICByc19hbGxvY2F0aW9uIHRleHQ7Cit9IExpc3RBbGxvY3M7CisKK0xpc3RBbGxvY3MgKmdMaXN0OworCisjcHJhZ21hIHJzIGV4cG9ydF92YXIoZ0RZLCBnSXRhbGljLCBnTGlzdCkKKwordm9pZCBpbml0KCkgeworICAgIGdEWSA9IDAuMGY7Cit9CisKK2ludCB0ZXh0UG9zID0gMDsKKworaW50IHJvb3QoaW50IGxhdW5jaElEKSB7CisKKyAgICByc2dDbGVhckNvbG9yKDAuMGYsIDAuMGYsIDAuMGYsIDAuMGYpOworICAgIHJzZ0NsZWFyRGVwdGgoMS4wZik7CisKKyAgICB0ZXh0UG9zIC09IChpbnQpZ0RZKjI7CisgICAgZ0RZICo9IDAuOTU7CisKKyAgICByc2dGb250Q29sb3IoMC45ZiwgMC45ZiwgMC45ZiwgMS4wZik7CisgICAgcnNnQmluZEZvbnQoZ0l0YWxpYyk7CisgICAgY29sb3IoMC4yLCAwLjIsIDAuMiwgMCk7CisKKyAgICByc19hbGxvY2F0aW9uIGxpc3RBbGxvYyA9IHJzR2V0QWxsb2NhdGlvbihnTGlzdCk7CisgICAgaW50IGFsbG9jU2l6ZSA9IHJzQWxsb2NhdGlvbkdldERpbVgobGlzdEFsbG9jKTsKKworICAgIGludCB3aWR0aCA9IHJzZ0dldFdpZHRoKCk7CisgICAgaW50IGhlaWdodCA9IHJzZ0dldEhlaWdodCgpOworCisgICAgaW50IGl0ZW1IZWlnaHQgPSA4MDsKKyAgICBpbnQgY3VycmVudFlQb3MgPSBpdGVtSGVpZ2h0ICsgdGV4dFBvczsKKworICAgIGZvcihpbnQgaSA9IDA7IGkgPCBhbGxvY1NpemU7IGkgKyspIHsKKyAgICAgICAgaWYoY3VycmVudFlQb3MgLSBpdGVtSGVpZ2h0ID4gaGVpZ2h0KSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGlmKGN1cnJlbnRZUG9zID4gMCkgeworICAgICAgICAgICAgcnNnRHJhd1JlY3QoMCwgY3VycmVudFlQb3MgLSAxLCB3aWR0aCwgY3VycmVudFlQb3MsIDApOworICAgICAgICAgICAgcnNnRHJhd1RleHQoZ0xpc3RbaV0udGV4dCwgMzAsIGN1cnJlbnRZUG9zIC0gMzIpOworICAgICAgICB9CisgICAgICAgIGN1cnJlbnRZUG9zICs9IGl0ZW1IZWlnaHQ7CisgICAgfQorCisgICAgcmV0dXJuIDEwOworfQpkaWZmIC0tZ2l0IGEvbGlicy9ycy9qYXZhL1NhbXBsZXMvc3JjL2NvbS9hbmRyb2lkL3NhbXBsZXMvcnNyZW5kZXJzdGF0ZXMucnMgYi9saWJzL3JzL2phdmEvU2FtcGxlcy9zcmMvY29tL2FuZHJvaWQvc2FtcGxlcy9yc3JlbmRlcnN0YXRlcy5ycwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jN2JlYTkzCi0tLSAvZGV2L251bGwKKysrIGIvbGlicy9ycy9qYXZhL1NhbXBsZXMvc3JjL2NvbS9hbmRyb2lkL3NhbXBsZXMvcnNyZW5kZXJzdGF0ZXMucnMKQEAgLTAsMCArMSw0NTIgQEAKKy8vIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjcHJhZ21hIHZlcnNpb24oMSkKKworI3ByYWdtYSBycyBqYXZhX3BhY2thZ2VfbmFtZShjb20uYW5kcm9pZC5zYW1wbGVzKQorCisjaW5jbHVkZSAicnNfZ3JhcGhpY3MucnNoIgorI2luY2x1ZGUgInNoYWRlcl9kZWYucnNoIgorCityc19wcm9ncmFtX3ZlcnRleCBnUHJvZ1ZlcnRleDsKK3JzX3Byb2dyYW1fZnJhZ21lbnQgZ1Byb2dGcmFnbWVudENvbG9yOworcnNfcHJvZ3JhbV9mcmFnbWVudCBnUHJvZ0ZyYWdtZW50VGV4dHVyZTsKKworcnNfcHJvZ3JhbV9zdG9yZSBnUHJvZ1N0b3JlQmxlbmROb25lRGVwdGg7Cityc19wcm9ncmFtX3N0b3JlIGdQcm9nU3RvcmVCbGVuZE5vbmU7Cityc19wcm9ncmFtX3N0b3JlIGdQcm9nU3RvcmVCbGVuZEFscGhhOworcnNfcHJvZ3JhbV9zdG9yZSBnUHJvZ1N0b3JlQmxlbmRBZGQ7CisKK3JzX2FsbG9jYXRpb24gZ1RleE9wYXF1ZTsKK3JzX2FsbG9jYXRpb24gZ1RleFRvcnVzOworcnNfYWxsb2NhdGlvbiBnVGV4VHJhbnNwYXJlbnQ7CisKK3JzX21lc2ggZ01ieU5NZXNoOworcnNfbWVzaCBnVG9ydXNNZXNoOworCityc19mb250IGdGb250U2FuczsKK3JzX2ZvbnQgZ0ZvbnRTZXJpZjsKK3JzX2ZvbnQgZ0ZvbnRTZXJpZkJvbGQ7Cityc19mb250IGdGb250U2VyaWZJdGFsaWM7Cityc19mb250IGdGb250U2VyaWZCb2xkSXRhbGljOworcnNfZm9udCBnRm9udE1vbm87CisKK2ludCBnRGlzcGxheU1vZGU7CisKK3JzX3NhbXBsZXIgZ0xpbmVhckNsYW1wOworcnNfc2FtcGxlciBnTGluZWFyV3JhcDsKK3JzX3NhbXBsZXIgZ01pcExpbmVhcldyYXA7Cityc19zYW1wbGVyIGdOZWFyZXN0Q2xhbXA7CisKK3JzX3Byb2dyYW1fcmFzdGVyIGdDdWxsQmFjazsKK3JzX3Byb2dyYW1fcmFzdGVyIGdDdWxsRnJvbnQ7CisKKy8vIEN1c3RvbSB2ZXJ0ZXggc2hhZGVyIGNvbXB1bmVudHMKK1ZlcnRleFNoYWRlckNvbnN0YW50cyAqZ1ZTQ29uc3RhbnRzOworRnJhZ2VudFNoYWRlckNvbnN0YW50cyAqZ0ZTQ29uc3RhbnRzOworLy8gRXhwb3J0IHRoZXNlIG91dCB0byBlYXNpbHkgc2V0IHRoZSBpbnB1dHMgdG8gc2hhZGVyCitWZXJ0ZXhTaGFkZXJJbnB1dHMgKmdWU0lucHV0czsKKy8vIEN1c3RvbSBzaGFkZXJzIHdlIHVzZSBmb3IgbGlnaHRpbmcKK3JzX3Byb2dyYW1fdmVydGV4IGdQcm9nVmVydGV4Q3VzdG9tOworcnNfcHJvZ3JhbV9mcmFnbWVudCBnUHJvZ0ZyYWdtZW50Q3VzdG9tOworCisjcHJhZ21hIHJzIGV4cG9ydF92YXIoZ1Byb2dWZXJ0ZXgsIGdQcm9nRnJhZ21lbnRDb2xvciwgZ1Byb2dGcmFnbWVudFRleHR1cmUpCisjcHJhZ21hIHJzIGV4cG9ydF92YXIoZ1Byb2dTdG9yZUJsZW5kTm9uZURlcHRoLCBnUHJvZ1N0b3JlQmxlbmROb25lLCBnUHJvZ1N0b3JlQmxlbmRBbHBoYSwgZ1Byb2dTdG9yZUJsZW5kQWRkKQorI3ByYWdtYSBycyBleHBvcnRfdmFyKGdUZXhPcGFxdWUsIGdUZXhUb3J1cywgZ1RleFRyYW5zcGFyZW50KQorI3ByYWdtYSBycyBleHBvcnRfdmFyKGdNYnlOTWVzaCwgZ1RvcnVzTWVzaCkKKyNwcmFnbWEgcnMgZXhwb3J0X3ZhcihnRm9udFNhbnMsIGdGb250U2VyaWYsIGdGb250U2VyaWZCb2xkLCBnRm9udFNlcmlmSXRhbGljLCBnRm9udFNlcmlmQm9sZEl0YWxpYywgZ0ZvbnRNb25vKQorI3ByYWdtYSBycyBleHBvcnRfdmFyKGdMaW5lYXJDbGFtcCwgZ0xpbmVhcldyYXAsIGdNaXBMaW5lYXJXcmFwLCBnTmVhcmVzdENsYW1wKQorI3ByYWdtYSBycyBleHBvcnRfdmFyKGdDdWxsQmFjaywgZ0N1bGxGcm9udCkKKyNwcmFnbWEgcnMgZXhwb3J0X3ZhcihnVlNDb25zdGFudHMsIGdGU0NvbnN0YW50cywgZ1ZTSW5wdXRzLCBnUHJvZ1ZlcnRleEN1c3RvbSwgZ1Byb2dGcmFnbWVudEN1c3RvbSkKKworLy9XaGF0IHdlIGFyZSBzaG93aW5nCisjcHJhZ21hIHJzIGV4cG9ydF92YXIoZ0Rpc3BsYXlNb2RlKQorCitmbG9hdCBnRHQgPSAwOworCit2b2lkIGluaXQoKSB7Cit9CisKK3ZvaWQgZGlzcGxheUZvbnRTYW1wbGVzKCkgeworICAgIHJzZ0ZvbnRDb2xvcigxLjBmLCAxLjBmLCAxLjBmLCAxLjBmKTsKKyAgICBpbnQgeVBvcyA9IDMwOworICAgIHJzZ0JpbmRGb250KGdGb250U2Fucyk7CisgICAgcnNnRHJhd1RleHQoIlNhbnMgZm9udCBzYW1wbGUiLCAzMCwgeVBvcyk7CisgICAgeVBvcyArPSAzMDsKKyAgICByc2dGb250Q29sb3IoMC41ZiwgMC45ZiwgMC41ZiwgMS4wZik7CisgICAgcnNnQmluZEZvbnQoZ0ZvbnRTZXJpZik7CisgICAgcnNnRHJhd1RleHQoIlNlcmlmIGZvbnQgc2FtcGxlIiwgMzAsIHlQb3MpOworICAgIHlQb3MgKz0gMzA7CisgICAgcnNnRm9udENvbG9yKDAuN2YsIDAuN2YsIDAuN2YsIDEuMGYpOworICAgIHJzZ0JpbmRGb250KGdGb250U2VyaWZCb2xkKTsKKyAgICByc2dEcmF3VGV4dCgiU2VyaWYgQm9sZCBmb250IHNhbXBsZSIsIDMwLCB5UG9zKTsKKyAgICB5UG9zICs9IDMwOworICAgIHJzZ0ZvbnRDb2xvcigwLjVmLCAwLjVmLCAwLjlmLCAxLjBmKTsKKyAgICByc2dCaW5kRm9udChnRm9udFNlcmlmSXRhbGljKTsKKyAgICByc2dEcmF3VGV4dCgiU2VyaWYgSXRhbGljIGZvbnQgc2FtcGxlIiwgMzAsIHlQb3MpOworICAgIHlQb3MgKz0gMzA7CisgICAgcnNnRm9udENvbG9yKDEuMGYsIDEuMGYsIDEuMGYsIDEuMGYpOworICAgIHJzZ0JpbmRGb250KGdGb250U2VyaWZCb2xkSXRhbGljKTsKKyAgICByc2dEcmF3VGV4dCgiU2VyaWYgQm9sZCBJdGFsaWMgZm9udCBzYW1wbGUiLCAzMCwgeVBvcyk7CisgICAgeVBvcyArPSAzMDsKKyAgICByc2dCaW5kRm9udChnRm9udE1vbm8pOworICAgIHJzZ0RyYXdUZXh0KCJNb25vc3BhY2UgZm9udCBzYW1wbGUiLCAzMCwgeVBvcyk7Cit9CisKK3ZvaWQgYmluZFByb2dyYW1WZXJ0ZXhPcnRobygpIHsKKyAgICAvLyBEZWZhdWx0IHZlcnRleCBzYWhkZXIKKyAgICByc2dCaW5kUHJvZ3JhbVZlcnRleChnUHJvZ1ZlcnRleCk7CisgICAgLy8gU2V0dXAgdGhlIHByb2plY3Rpb25pIG1hdHJpeAorICAgIHJzX21hdHJpeDR4NCBwcm9qOworICAgIHJzTWF0cml4TG9hZE9ydGhvKCZwcm9qLCAwLCByc2dHZXRXaWR0aCgpLCByc2dHZXRIZWlnaHQoKSwgMCwgLTEsMSk7CisgICAgcnNnUHJvZ3JhbVZlcnRleExvYWRQcm9qZWN0aW9uTWF0cml4KCZwcm9qKTsKK30KKwordm9pZCBkaXNwbGF5U2hhZGVyU2FtcGxlcygpIHsKKyAgICBiaW5kUHJvZ3JhbVZlcnRleE9ydGhvKCk7CisgICAgcnNfbWF0cml4NHg0IG1hdHJpeDsKKyAgICByc01hdHJpeExvYWRJZGVudGl0eSgmbWF0cml4KTsKKyAgICByc2dQcm9ncmFtVmVydGV4TG9hZE1vZGVsTWF0cml4KCZtYXRyaXgpOworCisgICAgLy8gRnJhZ21lbnQgc2hhZGVyIHdpdGggdGV4dHVyZQorICAgIHJzZ0JpbmRQcm9ncmFtU3RvcmUoZ1Byb2dTdG9yZUJsZW5kTm9uZSk7CisgICAgcnNnQmluZFByb2dyYW1GcmFnbWVudChnUHJvZ0ZyYWdtZW50VGV4dHVyZSk7CisgICAgcnNnQmluZFNhbXBsZXIoZ1Byb2dGcmFnbWVudFRleHR1cmUsIDAsIGdMaW5lYXJDbGFtcCk7CisgICAgcnNnQmluZFRleHR1cmUoZ1Byb2dGcmFnbWVudFRleHR1cmUsIDAsIGdUZXhPcGFxdWUpOworCisgICAgZmxvYXQgc3RhcnRYID0gMCwgc3RhcnRZID0gMDsKKyAgICBmbG9hdCB3aWR0aCA9IDI1NiwgaGVpZ2h0ID0gMjU2OworICAgIHJzZ0RyYXdRdWFkVGV4Q29vcmRzKHN0YXJ0WCwgc3RhcnRZLCAwLCAwLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0WCwgc3RhcnRZICsgaGVpZ2h0LCAwLCAwLCAxLAorICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0WCArIHdpZHRoLCBzdGFydFkgKyBoZWlnaHQsIDAsIDEsIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRYICsgd2lkdGgsIHN0YXJ0WSwgMCwgMSwgMCk7CisKKyAgICBzdGFydFggPSAyMDA7IHN0YXJ0WSA9IDA7CisgICAgd2lkdGggPSAxMjg7IGhlaWdodCA9IDEyODsKKyAgICByc2dEcmF3UXVhZFRleENvb3JkcyhzdGFydFgsIHN0YXJ0WSwgMCwgMCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydFgsIHN0YXJ0WSArIGhlaWdodCwgMCwgMCwgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydFggKyB3aWR0aCwgc3RhcnRZICsgaGVpZ2h0LCAwLCAxLCAxLAorICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0WCArIHdpZHRoLCBzdGFydFksIDAsIDEsIDApOworCisgICAgcnNnQmluZFByb2dyYW1TdG9yZShnUHJvZ1N0b3JlQmxlbmRBbHBoYSk7CisgICAgcnNnQmluZFRleHR1cmUoZ1Byb2dGcmFnbWVudFRleHR1cmUsIDAsIGdUZXhUcmFuc3BhcmVudCk7CisgICAgc3RhcnRYID0gMDsgc3RhcnRZID0gMjAwOworICAgIHdpZHRoID0gMTI4OyBoZWlnaHQgPSAxMjg7CisgICAgcnNnRHJhd1F1YWRUZXhDb29yZHMoc3RhcnRYLCBzdGFydFksIDAsIDAsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRYLCBzdGFydFkgKyBoZWlnaHQsIDAsIDAsIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRYICsgd2lkdGgsIHN0YXJ0WSArIGhlaWdodCwgMCwgMSwgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydFggKyB3aWR0aCwgc3RhcnRZLCAwLCAxLCAwKTsKKworICAgIC8vIEZyYWdtZW50IHByb2dyYW0gd2l0aCBzaW1wbGUgY29sb3IKKyAgICByc2dCaW5kUHJvZ3JhbUZyYWdtZW50KGdQcm9nRnJhZ21lbnRDb2xvcik7CisgICAgcnNnUHJvZ3JhbUZyYWdtZW50Q29uc3RhbnRDb2xvcihnUHJvZ0ZyYWdtZW50Q29sb3IsIDAuOSwgMC4zLCAwLjMsIDEpOworICAgIHJzZ0RyYXdSZWN0KDIwMCwgMzAwLCAzNTAsIDQ1MCwgMCk7CisgICAgcnNnUHJvZ3JhbUZyYWdtZW50Q29uc3RhbnRDb2xvcihnUHJvZ0ZyYWdtZW50Q29sb3IsIDAuMywgMC45LCAwLjMsIDEpOworICAgIHJzZ0RyYXdSZWN0KDUwLCA0MDAsIDQwMCwgNjAwLCAwKTsKKworICAgIHJzZ0ZvbnRDb2xvcigxLjBmLCAxLjBmLCAxLjBmLCAxLjBmKTsKKyAgICByc2dCaW5kRm9udChnRm9udE1vbm8pOworICAgIHJzZ0RyYXdUZXh0KCJUZXh0dXJlIHNoYWRlciIsIDEwLCA1MCk7CisgICAgcnNnRHJhd1RleHQoIkFscGhhLWJsZW5kZWQgdGV4dHVyZSBzaGFkZXIiLCAxMCwgMjgwKTsKKyAgICByc2dEcmF3VGV4dCgiRmxhdCBjb2xvciBzaGFkZXIiLCAxMDAsIDQ1MCk7Cit9CisKK3ZvaWQgZGlzcGxheUJsZW5kaW5nU2FtcGxlcygpIHsKKyAgICBpbnQgaTsKKworICAgIGJpbmRQcm9ncmFtVmVydGV4T3J0aG8oKTsKKyAgICByc19tYXRyaXg0eDQgbWF0cml4OworICAgIHJzTWF0cml4TG9hZElkZW50aXR5KCZtYXRyaXgpOworICAgIHJzZ1Byb2dyYW1WZXJ0ZXhMb2FkTW9kZWxNYXRyaXgoJm1hdHJpeCk7CisKKyAgICByc2dCaW5kUHJvZ3JhbUZyYWdtZW50KGdQcm9nRnJhZ21lbnRDb2xvcik7CisKKyAgICByc2dCaW5kUHJvZ3JhbVN0b3JlKGdQcm9nU3RvcmVCbGVuZE5vbmUpOworICAgIGZvcihpID0gMDsgaSA8IDM7IGkgKyspIHsKKyAgICAgICAgZmxvYXQgaVBsdXNPbmUgPSAoZmxvYXQpKGkgKyAxKTsKKyAgICAgICAgcnNnUHJvZ3JhbUZyYWdtZW50Q29uc3RhbnRDb2xvcihnUHJvZ0ZyYWdtZW50Q29sb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4xZippUGx1c09uZSwgMC4yZippUGx1c09uZSwgMC4zZippUGx1c09uZSwgMSk7CisgICAgICAgIGZsb2F0IHlQb3MgPSAxNTAgKiAoZmxvYXQpaTsKKyAgICAgICAgcnNnRHJhd1JlY3QoMCwgeVBvcywgMjAwLCB5UG9zICsgMjAwLCAwKTsKKyAgICB9CisKKyAgICByc2dCaW5kUHJvZ3JhbVN0b3JlKGdQcm9nU3RvcmVCbGVuZEFscGhhKTsKKyAgICBmb3IoaSA9IDA7IGkgPCAzOyBpICsrKSB7CisgICAgICAgIGZsb2F0IGlQbHVzT25lID0gKGZsb2F0KShpICsgMSk7CisgICAgICAgIHJzZ1Byb2dyYW1GcmFnbWVudENvbnN0YW50Q29sb3IoZ1Byb2dGcmFnbWVudENvbG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMmYqaVBsdXNPbmUsIDAuM2YqaVBsdXNPbmUsIDAuMWYqaVBsdXNPbmUsIDAuNSk7CisgICAgICAgIGZsb2F0IHlQb3MgPSAxNTAgKiAoZmxvYXQpaTsKKyAgICAgICAgcnNnRHJhd1JlY3QoMTUwLCB5UG9zLCAzNTAsIHlQb3MgKyAyMDAsIDApOworICAgIH0KKworICAgIHJzZ0JpbmRQcm9ncmFtU3RvcmUoZ1Byb2dTdG9yZUJsZW5kQWRkKTsKKyAgICBmb3IoaSA9IDA7IGkgPCAzOyBpICsrKSB7CisgICAgICAgIGZsb2F0IGlQbHVzT25lID0gKGZsb2F0KShpICsgMSk7CisgICAgICAgIHJzZ1Byb2dyYW1GcmFnbWVudENvbnN0YW50Q29sb3IoZ1Byb2dGcmFnbWVudENvbG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuM2YqaVBsdXNPbmUsIDAuMWYqaVBsdXNPbmUsIDAuMmYqaVBsdXNPbmUsIDAuNSk7CisgICAgICAgIGZsb2F0IHlQb3MgPSAxNTAgKiAoZmxvYXQpaTsKKyAgICAgICAgcnNnRHJhd1JlY3QoMzAwLCB5UG9zLCA1MDAsIHlQb3MgKyAyMDAsIDApOworICAgIH0KKworCisgICAgcnNnRm9udENvbG9yKDEuMGYsIDEuMGYsIDEuMGYsIDEuMGYpOworICAgIHJzZ0JpbmRGb250KGdGb250TW9ubyk7CisgICAgcnNnRHJhd1RleHQoIk5vIEJsZW5kaW5nIiwgMTAsIDUwKTsKKyAgICByc2dEcmF3VGV4dCgiQWxwaGEgQmxlbmRpbmciLCAxNjAsIDE1MCk7CisgICAgcnNnRHJhd1RleHQoIkFkZGl0aXZlIEJsZW5kaW5nIiwgMzIwLCAyNTApOworCit9CisKK3ZvaWQgZGlzcGxheU1lc2hTYW1wbGVzKCkgeworCisgICAgYmluZFByb2dyYW1WZXJ0ZXhPcnRobygpOworICAgIHJzX21hdHJpeDR4NCBtYXRyaXg7CisgICAgcnNNYXRyaXhMb2FkVHJhbnNsYXRlKCZtYXRyaXgsIDEyOCwgMTI4LCAwKTsKKyAgICByc2dQcm9ncmFtVmVydGV4TG9hZE1vZGVsTWF0cml4KCZtYXRyaXgpOworCisgICAgLy8gRnJhZ21lbnQgc2hhZGVyIHdpdGggdGV4dHVyZQorICAgIHJzZ0JpbmRQcm9ncmFtU3RvcmUoZ1Byb2dTdG9yZUJsZW5kTm9uZSk7CisgICAgcnNnQmluZFByb2dyYW1GcmFnbWVudChnUHJvZ0ZyYWdtZW50VGV4dHVyZSk7CisgICAgcnNnQmluZFNhbXBsZXIoZ1Byb2dGcmFnbWVudFRleHR1cmUsIDAsIGdMaW5lYXJDbGFtcCk7CisgICAgcnNnQmluZFRleHR1cmUoZ1Byb2dGcmFnbWVudFRleHR1cmUsIDAsIGdUZXhPcGFxdWUpOworCisgICAgcnNnRHJhd01lc2goZ01ieU5NZXNoKTsKKworICAgIHJzZ0ZvbnRDb2xvcigxLjBmLCAxLjBmLCAxLjBmLCAxLjBmKTsKKyAgICByc2dCaW5kRm9udChnRm9udE1vbm8pOworICAgIHJzZ0RyYXdUZXh0KCJVc2VyIGdlbiAxMCBieSAxMCBncmlkIG1lc2giLCAxMCwgMjUwKTsKK30KKwordm9pZCBkaXNwbGF5VGV4dHVyZVNhbXBsZXJzKCkgeworCisgICAgYmluZFByb2dyYW1WZXJ0ZXhPcnRobygpOworICAgIHJzX21hdHJpeDR4NCBtYXRyaXg7CisgICAgcnNNYXRyaXhMb2FkSWRlbnRpdHkoJm1hdHJpeCk7CisgICAgcnNnUHJvZ3JhbVZlcnRleExvYWRNb2RlbE1hdHJpeCgmbWF0cml4KTsKKworICAgIC8vIEZyYWdtZW50IHNoYWRlciB3aXRoIHRleHR1cmUKKyAgICByc2dCaW5kUHJvZ3JhbVN0b3JlKGdQcm9nU3RvcmVCbGVuZE5vbmUpOworICAgIHJzZ0JpbmRQcm9ncmFtRnJhZ21lbnQoZ1Byb2dGcmFnbWVudFRleHR1cmUpOworICAgIHJzZ0JpbmRUZXh0dXJlKGdQcm9nRnJhZ21lbnRUZXh0dXJlLCAwLCBnVGV4T3BhcXVlKTsKKworICAgIC8vIExpbmVhciBjbGFtcAorICAgIHJzZ0JpbmRTYW1wbGVyKGdQcm9nRnJhZ21lbnRUZXh0dXJlLCAwLCBnTGluZWFyQ2xhbXApOworICAgIGZsb2F0IHN0YXJ0WCA9IDAsIHN0YXJ0WSA9IDA7CisgICAgZmxvYXQgd2lkdGggPSAzMDAsIGhlaWdodCA9IDMwMDsKKyAgICByc2dEcmF3UXVhZFRleENvb3JkcyhzdGFydFgsIHN0YXJ0WSwgMCwgMCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydFgsIHN0YXJ0WSArIGhlaWdodCwgMCwgMCwgMS4xLAorICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0WCArIHdpZHRoLCBzdGFydFkgKyBoZWlnaHQsIDAsIDEuMSwgMS4xLAorICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0WCArIHdpZHRoLCBzdGFydFksIDAsIDEuMSwgMCk7CisKKyAgICAvLyBMaW5lYXIgV3JhcAorICAgIHJzZ0JpbmRTYW1wbGVyKGdQcm9nRnJhZ21lbnRUZXh0dXJlLCAwLCBnTGluZWFyV3JhcCk7CisgICAgc3RhcnRYID0gMDsgc3RhcnRZID0gMzAwOworICAgIHdpZHRoID0gMzAwOyBoZWlnaHQgPSAzMDA7CisgICAgcnNnRHJhd1F1YWRUZXhDb29yZHMoc3RhcnRYLCBzdGFydFksIDAsIDAsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRYLCBzdGFydFkgKyBoZWlnaHQsIDAsIDAsIDEuMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydFggKyB3aWR0aCwgc3RhcnRZICsgaGVpZ2h0LCAwLCAxLjEsIDEuMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydFggKyB3aWR0aCwgc3RhcnRZLCAwLCAxLjEsIDApOworCisgICAgLy8gTmVhcmVzdAorICAgIHJzZ0JpbmRTYW1wbGVyKGdQcm9nRnJhZ21lbnRUZXh0dXJlLCAwLCBnTmVhcmVzdENsYW1wKTsKKyAgICBzdGFydFggPSAzMDA7IHN0YXJ0WSA9IDA7CisgICAgd2lkdGggPSAzMDA7IGhlaWdodCA9IDMwMDsKKyAgICByc2dEcmF3UXVhZFRleENvb3JkcyhzdGFydFgsIHN0YXJ0WSwgMCwgMCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydFgsIHN0YXJ0WSArIGhlaWdodCwgMCwgMCwgMS4xLAorICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0WCArIHdpZHRoLCBzdGFydFkgKyBoZWlnaHQsIDAsIDEuMSwgMS4xLAorICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0WCArIHdpZHRoLCBzdGFydFksIDAsIDEuMSwgMCk7CisKKyAgICByc2dCaW5kU2FtcGxlcihnUHJvZ0ZyYWdtZW50VGV4dHVyZSwgMCwgZ01pcExpbmVhcldyYXApOworICAgIHN0YXJ0WCA9IDMwMDsgc3RhcnRZID0gMzAwOworICAgIHdpZHRoID0gMzAwOyBoZWlnaHQgPSAzMDA7CisgICAgcnNnRHJhd1F1YWRUZXhDb29yZHMoc3RhcnRYLCBzdGFydFksIDAsIDAsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRYLCBzdGFydFkgKyBoZWlnaHQsIDAsIDAsIDEuNSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydFggKyB3aWR0aCwgc3RhcnRZICsgaGVpZ2h0LCAwLCAxLjUsIDEuNSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydFggKyB3aWR0aCwgc3RhcnRZLCAwLCAxLjUsIDApOworCisKKyAgICByc2dGb250Q29sb3IoMS4wZiwgMS4wZiwgMS4wZiwgMS4wZik7CisgICAgcnNnQmluZEZvbnQoZ0ZvbnRNb25vKTsKKyAgICByc2dEcmF3VGV4dCgiRmlsdGVyaW5nOiBsaW5lYXIgY2xhbXAiLCAxMCwgMjkwKTsKKyAgICByc2dEcmF3VGV4dCgiRmlsdGVyaW5nOiBsaW5lYXIgd3JhcCIsIDEwLCA1OTApOworICAgIHJzZ0RyYXdUZXh0KCJGaWx0ZXJpbmc6IG5lYXJlc3QgY2xhbXAiLCAzMTAsIDI5MCk7CisgICAgcnNnRHJhd1RleHQoIkZpbHRlcmluZzogbWlwbGluZWFyIHdyYXAiLCAzMTAsIDU5MCk7CisKK30KKworZmxvYXQgZ1RvcnVzUm90YXRpb24gPSAwOworCit2b2lkIGRpc3BsYXlDdWxsaW5nU2FtcGxlcygpIHsKKyAgICByc2dCaW5kUHJvZ3JhbVZlcnRleChnUHJvZ1ZlcnRleCk7CisgICAgLy8gU2V0dXAgdGhlIHByb2plY3Rpb25pIG1hdHJpeCB3aXRoIDYwIGRlZ3JlZSBmaWVsZCBvZiB2aWV3CisgICAgcnNfbWF0cml4NHg0IHByb2o7CisgICAgZmxvYXQgYXNwZWN0ID0gKGZsb2F0KXJzZ0dldFdpZHRoKCkgLyAoZmxvYXQpcnNnR2V0SGVpZ2h0KCk7CisgICAgcnNNYXRyaXhMb2FkUGVyc3BlY3RpdmUoJnByb2osIDMwLjBmLCBhc3BlY3QsIDAuMWYsIDEwMC4wZik7CisgICAgcnNnUHJvZ3JhbVZlcnRleExvYWRQcm9qZWN0aW9uTWF0cml4KCZwcm9qKTsKKworICAgIC8vIEZyYWdtZW50IHNoYWRlciB3aXRoIHRleHR1cmUKKyAgICByc2dCaW5kUHJvZ3JhbVN0b3JlKGdQcm9nU3RvcmVCbGVuZE5vbmVEZXB0aCk7CisgICAgcnNnQmluZFByb2dyYW1GcmFnbWVudChnUHJvZ0ZyYWdtZW50VGV4dHVyZSk7CisgICAgcnNnQmluZFNhbXBsZXIoZ1Byb2dGcmFnbWVudFRleHR1cmUsIDAsIGdMaW5lYXJDbGFtcCk7CisgICAgcnNnQmluZFRleHR1cmUoZ1Byb2dGcmFnbWVudFRleHR1cmUsIDAsIGdUZXhUb3J1cyk7CisKKyAgICAvLyBBcGxseSBhIHJvdGF0aW9uIHRvIG91ciBtZXNoCisgICAgZ1RvcnVzUm90YXRpb24gKz0gNTAuMGYgKiBnRHQ7CisgICAgaWYoZ1RvcnVzUm90YXRpb24gPiAzNjAuMGYpIHsKKyAgICAgICAgZ1RvcnVzUm90YXRpb24gLT0gMzYwLjBmOworICAgIH0KKworICAgIHJzX21hdHJpeDR4NCBtYXRyaXg7CisgICAgLy8gUG9zaXRpb24gb3VyIG1vZGVsIG9uIHRoZSBzY3JlZW4KKyAgICByc01hdHJpeExvYWRUcmFuc2xhdGUoJm1hdHJpeCwgLTIuMGYsIDAuMGYsIC0xMC4wZik7CisgICAgcnNNYXRyaXhSb3RhdGUoJm1hdHJpeCwgZ1RvcnVzUm90YXRpb24sIDEuMGYsIDAuMGYsIDAuMGYpOworICAgIHJzZ1Byb2dyYW1WZXJ0ZXhMb2FkTW9kZWxNYXRyaXgoJm1hdHJpeCk7CisgICAgLy8gVXNlIGZyb250IGZhY2UgY3VsbGluZworICAgIHJzZ0JpbmRQcm9ncmFtUmFzdGVyKGdDdWxsRnJvbnQpOworICAgIHJzZ0RyYXdNZXNoKGdUb3J1c01lc2gpOworCisgICAgcnNNYXRyaXhMb2FkVHJhbnNsYXRlKCZtYXRyaXgsIDIuMGYsIDAuMGYsIC0xMC4wZik7CisgICAgcnNNYXRyaXhSb3RhdGUoJm1hdHJpeCwgZ1RvcnVzUm90YXRpb24sIDEuMGYsIDAuMGYsIDAuMGYpOworICAgIHJzZ1Byb2dyYW1WZXJ0ZXhMb2FkTW9kZWxNYXRyaXgoJm1hdHJpeCk7CisgICAgLy8gVXNlIGJhY2sgZmFjZSBjdWxsaW5nCisgICAgcnNnQmluZFByb2dyYW1SYXN0ZXIoZ0N1bGxCYWNrKTsKKyAgICByc2dEcmF3TWVzaChnVG9ydXNNZXNoKTsKKworICAgIHJzZ0ZvbnRDb2xvcigxLjBmLCAxLjBmLCAxLjBmLCAxLjBmKTsKKyAgICByc2dCaW5kRm9udChnRm9udE1vbm8pOworICAgIHJzZ0RyYXdUZXh0KCJEaXNwbGF5aW5nIG1lc2ggZnJvbnQvYmFjayBmYWNlIGN1bGxpbmciLCAxMCwgcnNnR2V0SGVpZ2h0KCkgLSAxMCk7Cit9CisKK2Zsb2F0IGdMaWdodDBSb3RhdGlvbiA9IDA7CitmbG9hdCBnTGlnaHQxUm90YXRpb24gPSAwOworCit2b2lkIHNldHVwQ3VzdG9tU2hhZGVyTGlnaHRzKCkgeworICAgIGZsb2F0NCBsaWdodDBQb3MgPSB7LTUuMGYsIDUuMGYsIC0xMC4wZiwgMS4wZn07CisgICAgZmxvYXQ0IGxpZ2h0MVBvcyA9IHsyLjBmLCA1LjBmLCAxNS4wZiwgMS4wZn07CisgICAgZmxvYXQzIGxpZ2h0MERpZmZDb2wgPSB7MC45ZiwgMC43ZiwgMC43Zn07CisgICAgZmxvYXQzIGxpZ2h0MFNwZWNDb2wgPSB7MC45ZiwgMC42ZiwgMC42Zn07CisgICAgZmxvYXQzIGxpZ2h0MURpZmZDb2wgPSB7MC41ZiwgMC41ZiwgMC45Zn07CisgICAgZmxvYXQzIGxpZ2h0MVNwZWNDb2wgPSB7MC41ZiwgMC41ZiwgMC45Zn07CisKKyAgICBnTGlnaHQwUm90YXRpb24gKz0gNTAuMGYgKiBnRHQ7CisgICAgaWYoZ0xpZ2h0MFJvdGF0aW9uID4gMzYwLjBmKSB7CisgICAgICAgIGdMaWdodDBSb3RhdGlvbiAtPSAzNjAuMGY7CisgICAgfQorICAgIGdMaWdodDFSb3RhdGlvbiAtPSA1MC4wZiAqIGdEdDsKKyAgICBpZihnTGlnaHQxUm90YXRpb24gPiAzNjAuMGYpIHsKKyAgICAgICAgZ0xpZ2h0MVJvdGF0aW9uIC09IDM2MC4wZjsKKyAgICB9CisKKyAgICByc19tYXRyaXg0eDQgbDBNYXQ7CisgICAgcnNNYXRyaXhMb2FkUm90YXRlKCZsME1hdCwgZ0xpZ2h0MFJvdGF0aW9uLCAxLjBmLCAwLjBmLCAwLjBmKTsKKyAgICBsaWdodDBQb3MgPSByc01hdHJpeE11bHRpcGx5KCZsME1hdCwgbGlnaHQwUG9zKTsKKyAgICByc19tYXRyaXg0eDQgbDFNYXQ7CisgICAgcnNNYXRyaXhMb2FkUm90YXRlKCZsMU1hdCwgZ0xpZ2h0MVJvdGF0aW9uLCAwLjBmLCAwLjBmLCAxLjBmKTsKKyAgICBsaWdodDFQb3MgPSByc01hdHJpeE11bHRpcGx5KCZsMU1hdCwgbGlnaHQxUG9zKTsKKworICAgIC8vIFNldCBsaWdodCAwIHByb3BlcnRpZXMKKyAgICBnVlNDb25zdGFudHMtPmxpZ2h0MF9Qb3Npc2lvbi54ID0gbGlnaHQwUG9zLng7CisgICAgZ1ZTQ29uc3RhbnRzLT5saWdodDBfUG9zaXNpb24ueSA9IGxpZ2h0MFBvcy55OworICAgIGdWU0NvbnN0YW50cy0+bGlnaHQwX1Bvc2lzaW9uLnogPSBsaWdodDBQb3MuejsKKyAgICBnVlNDb25zdGFudHMtPmxpZ2h0MF9EaWZmdXNlID0gMS4wZjsKKyAgICBnVlNDb25zdGFudHMtPmxpZ2h0MF9TcGVjdWxhciA9IDAuNWY7CisgICAgZ1ZTQ29uc3RhbnRzLT5saWdodDBfQ29zaW5lUG93ZXIgPSA0MC4wZjsKKyAgICAvLyBTZXQgbGlnaHQgMSBwcm9wZXJ0aWVzCisgICAgZ1ZTQ29uc3RhbnRzLT5saWdodDFfUG9zaXNpb24ueCA9IGxpZ2h0MVBvcy54OworICAgIGdWU0NvbnN0YW50cy0+bGlnaHQxX1Bvc2lzaW9uLnkgPSBsaWdodDFQb3MueTsKKyAgICBnVlNDb25zdGFudHMtPmxpZ2h0MV9Qb3Npc2lvbi56ID0gbGlnaHQxUG9zLno7CisgICAgZ1ZTQ29uc3RhbnRzLT5saWdodDFfRGlmZnVzZSA9IDEuMGY7CisgICAgZ1ZTQ29uc3RhbnRzLT5saWdodDFfU3BlY3VsYXIgPSAwLjdmOworICAgIGdWU0NvbnN0YW50cy0+bGlnaHQxX0Nvc2luZVBvd2VyID0gNTAuMGY7CisgICAgcnNBbGxvY2F0aW9uTWFya0RpcnR5KHJzR2V0QWxsb2NhdGlvbihnVlNDb25zdGFudHMpKTsKKworICAgIC8vIFVwZGF0ZSBmcmFnbWV0biBzaGFkZXIgY29uc3RhbnRzCisgICAgLy8gU2V0IGxpZ2h0IDAgY29sb3JzCisgICAgZ0ZTQ29uc3RhbnRzLT5saWdodDBfRGlmZnVzZUNvbG9yID0gbGlnaHQwRGlmZkNvbDsKKyAgICBnRlNDb25zdGFudHMtPmxpZ2h0MF9TcGVjdWxhckNvbG9yID0gbGlnaHQwU3BlY0NvbDsKKyAgICAvLyBTZXQgbGlnaHQgMSBjb2xvcnMKKyAgICBnRlNDb25zdGFudHMtPmxpZ2h0MV9EaWZmdXNlQ29sb3IgPSBsaWdodDFEaWZmQ29sOworICAgIGdGU0NvbnN0YW50cy0+bGlnaHQxX1NwZWN1bGFyQ29sb3IgPSBsaWdodDFTcGVjQ29sOworICAgIHJzQWxsb2NhdGlvbk1hcmtEaXJ0eShyc0dldEFsbG9jYXRpb24oZ0ZTQ29uc3RhbnRzKSk7Cit9CisKK3ZvaWQgZGlzcGxheUN1c3RvbVNoYWRlclNhbXBsZXMoKSB7CisKKyAgICAvLyBVcGRhdGUgdmVydGV4IHNoYWRlciBjb25zdGFudHMKKyAgICAvLyBMb2FkIG1vZGVsIG1hdHJpeAorICAgIC8vIEFwbGx5IGEgcm90YXRpb24gdG8gb3VyIG1lc2gKKyAgICBnVG9ydXNSb3RhdGlvbiArPSA1MC4wZiAqIGdEdDsKKyAgICBpZihnVG9ydXNSb3RhdGlvbiA+IDM2MC4wZikgeworICAgICAgICBnVG9ydXNSb3RhdGlvbiAtPSAzNjAuMGY7CisgICAgfQorCisgICAgLy8gUG9zaXRpb24gb3VyIG1vZGVsIG9uIHRoZSBzY3JlZW4KKyAgICByc01hdHJpeExvYWRUcmFuc2xhdGUoJmdWU0NvbnN0YW50cy0+bW9kZWwsIDAuMGYsIDAuMGYsIC0xMC4wZik7CisgICAgcnNNYXRyaXhSb3RhdGUoJmdWU0NvbnN0YW50cy0+bW9kZWwsIGdUb3J1c1JvdGF0aW9uLCAxLjBmLCAwLjBmLCAwLjBmKTsKKyAgICByc01hdHJpeFJvdGF0ZSgmZ1ZTQ29uc3RhbnRzLT5tb2RlbCwgZ1RvcnVzUm90YXRpb24sIDAuMGYsIDAuMGYsIDEuMGYpOworICAgIC8vIFNldHVwIHRoZSBwcm9qZWN0aW9uaSBtYXRyaXgKKyAgICBmbG9hdCBhc3BlY3QgPSAoZmxvYXQpcnNnR2V0V2lkdGgoKSAvIChmbG9hdClyc2dHZXRIZWlnaHQoKTsKKyAgICByc01hdHJpeExvYWRQZXJzcGVjdGl2ZSgmZ1ZTQ29uc3RhbnRzLT5wcm9qLCAzMC4wZiwgYXNwZWN0LCAwLjFmLCAxMDAuMGYpOworICAgIHNldHVwQ3VzdG9tU2hhZGVyTGlnaHRzKCk7CisKKyAgICByc2dCaW5kUHJvZ3JhbVZlcnRleChnUHJvZ1ZlcnRleEN1c3RvbSk7CisKKyAgICAvLyBGcmFnbWVudCBzaGFkZXIgd2l0aCB0ZXh0dXJlCisgICAgcnNnQmluZFByb2dyYW1TdG9yZShnUHJvZ1N0b3JlQmxlbmROb25lRGVwdGgpOworICAgIHJzZ0JpbmRQcm9ncmFtRnJhZ21lbnQoZ1Byb2dGcmFnbWVudEN1c3RvbSk7CisgICAgcnNnQmluZFNhbXBsZXIoZ1Byb2dGcmFnbWVudEN1c3RvbSwgMCwgZ0xpbmVhckNsYW1wKTsKKyAgICByc2dCaW5kVGV4dHVyZShnUHJvZ0ZyYWdtZW50Q3VzdG9tLCAwLCBnVGV4VG9ydXMpOworCisgICAgLy8gVXNlIGJhY2sgZmFjZSBjdWxsaW5nCisgICAgcnNnQmluZFByb2dyYW1SYXN0ZXIoZ0N1bGxCYWNrKTsKKyAgICByc2dEcmF3TWVzaChnVG9ydXNNZXNoKTsKKworICAgIHJzZ0ZvbnRDb2xvcigxLjBmLCAxLjBmLCAxLjBmLCAxLjBmKTsKKyAgICByc2dCaW5kRm9udChnRm9udE1vbm8pOworICAgIC8vcnNnRHJhd1RleHQoIkN1c3RvbSBzaGFkZXIgc2FtcGxlIiwgMTAsIHJzZ0dldEhlaWdodCgpIC0gMTApOworfQorCitpbnQgcm9vdChpbnQgbGF1bmNoSUQpIHsKKworICAgIGdEdCA9IHJzR2V0RHQoKTsKKworICAgIHJzZ0NsZWFyQ29sb3IoMC4yZiwgMC4yZiwgMC4yZiwgMC4wZik7CisgICAgcnNnQ2xlYXJEZXB0aCgxLjBmKTsKKworICAgIHN3aXRjaChnRGlzcGxheU1vZGUpIHsKKyAgICBjYXNlIDA6CisgICAgICAgIGRpc3BsYXlGb250U2FtcGxlcygpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDE6CisgICAgICAgIGRpc3BsYXlTaGFkZXJTYW1wbGVzKCk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMjoKKyAgICAgICAgZGlzcGxheUJsZW5kaW5nU2FtcGxlcygpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDM6CisgICAgICAgIGRpc3BsYXlNZXNoU2FtcGxlcygpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDQ6CisgICAgICAgIGRpc3BsYXlUZXh0dXJlU2FtcGxlcnMoKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSA1OgorICAgICAgICBkaXNwbGF5Q3VsbGluZ1NhbXBsZXMoKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSA2OgorICAgICAgICBkaXNwbGF5Q3VzdG9tU2hhZGVyU2FtcGxlcygpOworICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gMTA7Cit9CmRpZmYgLS1naXQgYS9saWJzL3JzL2phdmEvU2FtcGxlcy9zcmMvY29tL2FuZHJvaWQvc2FtcGxlcy9zaGFkZXJfZGVmLnJzaCBiL2xpYnMvcnMvamF2YS9TYW1wbGVzL3NyYy9jb20vYW5kcm9pZC9zYW1wbGVzL3NoYWRlcl9kZWYucnNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUzZjYyMDYKLS0tIC9kZXYvbnVsbAorKysgYi9saWJzL3JzL2phdmEvU2FtcGxlcy9zcmMvY29tL2FuZHJvaWQvc2FtcGxlcy9zaGFkZXJfZGVmLnJzaApAQCAtMCwwICsxLDQ3IEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworI3ByYWdtYSB2ZXJzaW9uKDEpCisKKyNwcmFnbWEgcnMgamF2YV9wYWNrYWdlX25hbWUoY29tLmFuZHJvaWQuc2FtcGxlcykKKwordHlwZWRlZiBzdHJ1Y3QgVmVydGV4U2hhZGVyQ29uc3RhbnRzX3MgeworICAgIHJzX21hdHJpeDR4NCBtb2RlbDsKKyAgICByc19tYXRyaXg0eDQgcHJvajsKKyAgICBmbG9hdDMgbGlnaHQwX1Bvc2lzaW9uOworICAgIGZsb2F0IGxpZ2h0MF9EaWZmdXNlOworICAgIGZsb2F0IGxpZ2h0MF9TcGVjdWxhcjsKKyAgICBmbG9hdCBsaWdodDBfQ29zaW5lUG93ZXI7CisKKyAgICBmbG9hdDMgbGlnaHQxX1Bvc2lzaW9uOworICAgIGZsb2F0IGxpZ2h0MV9EaWZmdXNlOworICAgIGZsb2F0IGxpZ2h0MV9TcGVjdWxhcjsKKyAgICBmbG9hdCBsaWdodDFfQ29zaW5lUG93ZXI7Cit9IFZlcnRleFNoYWRlckNvbnN0YW50czsKKwordHlwZWRlZiBzdHJ1Y3QgRnJhZ2VudFNoYWRlckNvbnN0YW50c19zIHsKKyAgICBmbG9hdDMgbGlnaHQwX0RpZmZ1c2VDb2xvcjsKKyAgICBmbG9hdDMgbGlnaHQwX1NwZWN1bGFyQ29sb3I7CisKKyAgICBmbG9hdDMgbGlnaHQxX0RpZmZ1c2VDb2xvcjsKKyAgICBmbG9hdDMgbGlnaHQxX1NwZWN1bGFyQ29sb3I7CisKK30gRnJhZ2VudFNoYWRlckNvbnN0YW50czsKKwordHlwZWRlZiBzdHJ1Y3QgVmVydGV4U2hhZGVySW5wdXRzX3MgeworICAgIGZsb2F0NCBwb3NpdGlvbjsKKyAgICBmbG9hdDMgbm9ybWFsOworICAgIGZsb2F0MiB0ZXh0dXJlMDsKK30gVmVydGV4U2hhZGVySW5wdXRzOworCmRpZmYgLS1naXQgYS9saWJzL3JzL2phdmEvdGVzdHMvQW5kcm9pZC5tayBiL2xpYnMvcnMvamF2YS90ZXN0cy9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZjOTkyZDUKLS0tIC9kZXYvbnVsbAorKysgYi9saWJzL3JzL2phdmEvdGVzdHMvQW5kcm9pZC5tawpAQCAtMCwwICsxLDMwIEBACisjCisjIENvcHlyaWdodCAoQykgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCitpZm5lcSAoJChUQVJHRVRfU0lNVUxBVE9SKSx0cnVlKQorCitMT0NBTF9QQVRIIDo9ICQoY2FsbCBteS1kaXIpCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKKworTE9DQUxfTU9EVUxFX1RBR1MgOj0gb3B0aW9uYWwKKworTE9DQUxfU1JDX0ZJTEVTIDo9ICQoY2FsbCBhbGwtamF2YS1maWxlcy11bmRlciwgc3JjKSAkKGNhbGwgYWxsLXJlbmRlcnNjcmlwdC1maWxlcy11bmRlciwgc3JjKQorCitMT0NBTF9QQUNLQUdFX05BTUUgOj0gUlNUZXN0CisKK2luY2x1ZGUgJChCVUlMRF9QQUNLQUdFKQorCitlbmRpZgpkaWZmIC0tZ2l0IGEvbGlicy9ycy9qYXZhL3Rlc3RzL0FuZHJvaWRNYW5pZmVzdC54bWwgYi9saWJzL3JzL2phdmEvdGVzdHMvQW5kcm9pZE1hbmlmZXN0LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYzE0NGFiCi0tLSAvZGV2L251bGwKKysrIGIvbGlicy9ycy9qYXZhL3Rlc3RzL0FuZHJvaWRNYW5pZmVzdC54bWwKQEAgLTAsMCArMSwxNCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzxtYW5pZmVzdCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgcGFja2FnZT0iY29tLmFuZHJvaWQucnMudGVzdCI+CisgICAgPGFwcGxpY2F0aW9uIAorICAgICAgICBhbmRyb2lkOmxhYmVsPSJfUlNfVGVzdCIKKyAgICAgICAgYW5kcm9pZDppY29uPSJAZHJhd2FibGUvdGVzdF9wYXR0ZXJuIj4KKyAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iUlNUZXN0Ij4KKyAgICAgICAgICAgIDxpbnRlbnQtZmlsdGVyPgorICAgICAgICAgICAgICAgIDxhY3Rpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5hY3Rpb24uTUFJTiIgLz4KKyAgICAgICAgICAgICAgICA8Y2F0ZWdvcnkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5jYXRlZ29yeS5MQVVOQ0hFUiIgLz4KKyAgICAgICAgICAgIDwvaW50ZW50LWZpbHRlcj4KKyAgICAgICAgPC9hY3Rpdml0eT4KKyAgICA8L2FwcGxpY2F0aW9uPgorPC9tYW5pZmVzdD4KZGlmZiAtLWdpdCBhL2xpYnMvcnMvamF2YS90ZXN0cy9yZXMvZHJhd2FibGUvdGVzdF9wYXR0ZXJuLnBuZyBiL2xpYnMvcnMvamF2YS90ZXN0cy9yZXMvZHJhd2FibGUvdGVzdF9wYXR0ZXJuLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lN2QxNDU1Ci0tLSAvZGV2L251bGwKKysrIGIvbGlicy9ycy9qYXZhL3Rlc3RzL3Jlcy9kcmF3YWJsZS90ZXN0X3BhdHRlcm4ucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYnMvcnMvamF2YS90ZXN0cy9zcmMvY29tL2FuZHJvaWQvcnMvdGVzdC9SU1Rlc3QuamF2YSBiL2xpYnMvcnMvamF2YS90ZXN0cy9zcmMvY29tL2FuZHJvaWQvcnMvdGVzdC9SU1Rlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMjE3OTNkCi0tLSAvZGV2L251bGwKKysrIGIvbGlicy9ycy9qYXZhL3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9ycy90ZXN0L1JTVGVzdC5qYXZhCkBAIC0wLDAgKzEsODUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLnJzLnRlc3Q7CisKK2ltcG9ydCBhbmRyb2lkLnJlbmRlcnNjcmlwdC5SU1N1cmZhY2VWaWV3OworaW1wb3J0IGFuZHJvaWQucmVuZGVyc2NyaXB0LlJlbmRlclNjcmlwdDsKKworaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuQ29uZmlndXJhdGlvbjsKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKK2ltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5Mb29wZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5NZXNzYWdlOworaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuU2V0dGluZ3MuU3lzdGVtOworaW1wb3J0IGFuZHJvaWQudXRpbC5Db25maWc7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuTWVudTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuTWVudUl0ZW07CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CitpbXBvcnQgYW5kcm9pZC52aWV3LldpbmRvdzsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5CdXR0b247CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuTGlzdFZpZXc7CisKK2ltcG9ydCBqYXZhLmxhbmcuUnVudGltZTsKKworcHVibGljIGNsYXNzIFJTVGVzdCBleHRlbmRzIEFjdGl2aXR5IHsKKyAgICAvL0V2ZW50TGlzdGVuZXIgbUxpc3RlbmVyID0gbmV3IEV2ZW50TGlzdGVuZXIoKTsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMT0dfVEFHID0gImxpYlJTX2puaSI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVRyAgPSBmYWxzZTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIExPR19FTkFCTEVEID0gREVCVUcgPyBDb25maWcuTE9HRCA6IENvbmZpZy5MT0dWOworCisgICAgcHJpdmF0ZSBSU1Rlc3RWaWV3IG1WaWV3OworCisgICAgLy8gZ2V0IHRoZSBjdXJyZW50IGxvb3BlciAoZnJvbSB5b3VyIEFjdGl2aXR5IFVJIHRocmVhZCBmb3IgaW5zdGFuY2UKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9uQ3JlYXRlKEJ1bmRsZSBpY2ljbGUpIHsKKyAgICAgICAgc3VwZXIub25DcmVhdGUoaWNpY2xlKTsKKworICAgICAgICAvLyBDcmVhdGUgb3VyIFByZXZpZXcgdmlldyBhbmQgc2V0IGl0IGFzIHRoZSBjb250ZW50IG9mIG91cgorICAgICAgICAvLyBBY3Rpdml0eQorICAgICAgICBtVmlldyA9IG5ldyBSU1Rlc3RWaWV3KHRoaXMpOworICAgICAgICBzZXRDb250ZW50VmlldyhtVmlldyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25SZXN1bWUoKSB7CisgICAgICAgIC8vIElkZWFsbHkgYSBnYW1lIHNob3VsZCBpbXBsZW1lbnQgb25SZXN1bWUoKSBhbmQgb25QYXVzZSgpCisgICAgICAgIC8vIHRvIHRha2UgYXBwcm9wcmlhdGUgYWN0aW9uIHdoZW4gdGhlIGFjdGl2aXR5IGxvb3NlcyBmb2N1cworICAgICAgICBzdXBlci5vblJlc3VtZSgpOworICAgICAgICBtVmlldy5vblJlc3VtZSgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG9uUGF1c2UoKSB7CisgICAgICAgIC8vIElkZWFsbHkgYSBnYW1lIHNob3VsZCBpbXBsZW1lbnQgb25SZXN1bWUoKSBhbmQgb25QYXVzZSgpCisgICAgICAgIC8vIHRvIHRha2UgYXBwcm9wcmlhdGUgYWN0aW9uIHdoZW4gdGhlIGFjdGl2aXR5IGxvb3NlcyBmb2N1cworICAgICAgICBzdXBlci5vblBhdXNlKCk7CisgICAgICAgIG1WaWV3Lm9uUGF1c2UoKTsKKyAgICB9CisKKyAgICBzdGF0aWMgdm9pZCBsb2coU3RyaW5nIG1lc3NhZ2UpIHsKKyAgICAgICAgaWYgKExPR19FTkFCTEVEKSB7CisgICAgICAgICAgICBMb2cudihMT0dfVEFHLCBtZXNzYWdlKTsKKyAgICAgICAgfQorICAgIH0KKworCit9CisKZGlmZiAtLWdpdCBhL2xpYnMvcnMvamF2YS90ZXN0cy9zcmMvY29tL2FuZHJvaWQvcnMvdGVzdC9SU1Rlc3RDb3JlLmphdmEgYi9saWJzL3JzL2phdmEvdGVzdHMvc3JjL2NvbS9hbmRyb2lkL3JzL3Rlc3QvUlNUZXN0Q29yZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmViMWU0OGIKLS0tIC9kZXYvbnVsbAorKysgYi9saWJzL3JzL2phdmEvdGVzdHMvc3JjL2NvbS9hbmRyb2lkL3JzL3Rlc3QvUlNUZXN0Q29yZS5qYXZhCkBAIC0wLDAgKzEsNzIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLnJzLnRlc3Q7CisKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlJlc291cmNlczsKK2ltcG9ydCBhbmRyb2lkLnJlbmRlcnNjcmlwdC4qOworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CisKKworcHVibGljIGNsYXNzIFJTVGVzdENvcmUgeworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBBUlRfQ09VTlQgPSA1MDAwMDsKKworICAgIHB1YmxpYyBSU1Rlc3RDb3JlKCkgeworICAgIH0KKworICAgIHByaXZhdGUgUmVzb3VyY2VzIG1SZXM7CisgICAgcHJpdmF0ZSBSZW5kZXJTY3JpcHRHTCBtUlM7CisKKyAgICBwcml2YXRlIFNjcmlwdENfVGVzdFJvb3QgbVJvb3RTY3JpcHQ7CisKKyAgICBwcml2YXRlIGJvb2xlYW4gZnBfbWFkKCkgeworICAgICAgICBTY3JpcHRDX0ZwTWFkIHMgPSBuZXcgU2NyaXB0Q19GcE1hZChtUlMsIG1SZXMsIFIucmF3LmZwbWFkLCB0cnVlKTsKKyAgICAgICAgcy5pbnZva2VfZG9UZXN0KDAsIDApOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICAvL3ByaXZhdGUgU2NyaXB0Q19Gb3VudGFpbiBtU2NyaXB0OworICAgIHB1YmxpYyB2b2lkIGluaXQoUmVuZGVyU2NyaXB0R0wgcnMsIFJlc291cmNlcyByZXMsIGludCB3aWR0aCwgaW50IGhlaWdodCkgeworICAgICAgICBtUlMgPSByczsKKyAgICAgICAgbVJlcyA9IHJlczsKKworICAgICAgICBtUm9vdFNjcmlwdCA9IG5ldyBTY3JpcHRDX1Rlc3RSb290KG1SUywgbVJlcywgUi5yYXcudGVzdHJvb3QsIHRydWUpOworCisgICAgICAgIGZwX21hZCgpOworCisKKyAgICAgICAgLyoKKyAgICAgICAgUHJvZ3JhbUZyYWdtZW50LkJ1aWxkZXIgcGZiID0gbmV3IFByb2dyYW1GcmFnbWVudC5CdWlsZGVyKHJzKTsKKyAgICAgICAgcGZiLnNldFZhcnlpbmdDb2xvcih0cnVlKTsKKyAgICAgICAgcnMuY29udGV4dEJpbmRQcm9ncmFtRnJhZ21lbnQocGZiLmNyZWF0ZSgpKTsKKworICAgICAgICBTY3JpcHRGaWVsZF9Qb2ludCBwb2ludHMgPSBuZXcgU2NyaXB0RmllbGRfUG9pbnQobVJTLCBQQVJUX0NPVU5UKTsKKworICAgICAgICBNZXNoLkFsbG9jYXRpb25CdWlsZGVyIHNtYiA9IG5ldyBNZXNoLkFsbG9jYXRpb25CdWlsZGVyKG1SUyk7CisgICAgICAgIHNtYi5hZGRWZXJ0ZXhBbGxvY2F0aW9uKHBvaW50cy5nZXRBbGxvY2F0aW9uKCkpOworICAgICAgICBzbWIuYWRkSW5kZXhUeXBlKFByaW1pdGl2ZS5QT0lOVCk7CisgICAgICAgIE1lc2ggc20gPSBzbWIuY3JlYXRlKCk7CisKKyAgICAgICAgbVNjcmlwdCA9IG5ldyBTY3JpcHRDX0ZvdW50YWluKG1SUywgbVJlcywgUi5yYXcuZm91bnRhaW4sIHRydWUpOworICAgICAgICBtU2NyaXB0LnNldF9wYXJ0TWVzaChzbSk7CisgICAgICAgIG1TY3JpcHQuYmluZF9wb2ludChwb2ludHMpOworICAgICAgICBtUlMuY29udGV4dEJpbmRSb290U2NyaXB0KG1TY3JpcHQpOworICAgICAgICAqLworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIG5ld1RvdWNoUG9zaXRpb24oZmxvYXQgeCwgZmxvYXQgeSwgZmxvYXQgcHJlc3N1cmUsIGludCBpZCkgeworICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYnMvcnMvamF2YS90ZXN0cy9zcmMvY29tL2FuZHJvaWQvcnMvdGVzdC9SU1Rlc3RWaWV3LmphdmEgYi9saWJzL3JzL2phdmEvdGVzdHMvc3JjL2NvbS9hbmRyb2lkL3JzL3Rlc3QvUlNUZXN0Vmlldy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdhZTBjMDgKLS0tIC9kZXYvbnVsbAorKysgYi9saWJzL3JzL2phdmEvdGVzdHMvc3JjL2NvbS9hbmRyb2lkL3JzL3Rlc3QvUlNUZXN0Vmlldy5qYXZhCkBAIC0wLDAgKzEsMTA2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5ycy50ZXN0OworCitpbXBvcnQgamF2YS5pby5Xcml0ZXI7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5TZW1hcGhvcmU7CisKK2ltcG9ydCBhbmRyb2lkLnJlbmRlcnNjcmlwdC5SU1N1cmZhY2VWaWV3OworaW1wb3J0IGFuZHJvaWQucmVuZGVyc2NyaXB0LlJlbmRlclNjcmlwdDsKK2ltcG9ydCBhbmRyb2lkLnJlbmRlcnNjcmlwdC5SZW5kZXJTY3JpcHRHTDsKKworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuUmVzb3VyY2VzOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuQml0bWFwRHJhd2FibGU7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZTsKK2ltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5NZXNzYWdlOworaW1wb3J0IGFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQ7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuU3VyZmFjZTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuU3VyZmFjZUhvbGRlcjsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuU3VyZmFjZVZpZXc7CitpbXBvcnQgYW5kcm9pZC52aWV3LktleUV2ZW50OworaW1wb3J0IGFuZHJvaWQudmlldy5Nb3Rpb25FdmVudDsKKworcHVibGljIGNsYXNzIFJTVGVzdFZpZXcgZXh0ZW5kcyBSU1N1cmZhY2VWaWV3IHsKKworICAgIHB1YmxpYyBSU1Rlc3RWaWV3KENvbnRleHQgY29udGV4dCkgeworICAgICAgICBzdXBlcihjb250ZXh0KTsKKyAgICAgICAgLy9zZXRGb2N1c2FibGUodHJ1ZSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBSZW5kZXJTY3JpcHRHTCBtUlM7CisgICAgcHJpdmF0ZSBSU1Rlc3RDb3JlIG1SZW5kZXI7CisKKyAgICBwdWJsaWMgdm9pZCBzdXJmYWNlQ2hhbmdlZChTdXJmYWNlSG9sZGVyIGhvbGRlciwgaW50IGZvcm1hdCwgaW50IHcsIGludCBoKSB7CisgICAgICAgIHN1cGVyLnN1cmZhY2VDaGFuZ2VkKGhvbGRlciwgZm9ybWF0LCB3LCBoKTsKKyAgICAgICAgaWYgKG1SUyA9PSBudWxsKSB7CisgICAgICAgICAgICBtUlMgPSBjcmVhdGVSZW5kZXJTY3JpcHQoZmFsc2UpOworICAgICAgICAgICAgbVJTLmNvbnRleHRTZXRTdXJmYWNlKHcsIGgsIGhvbGRlci5nZXRTdXJmYWNlKCkpOworICAgICAgICAgICAgbVJlbmRlciA9IG5ldyBSU1Rlc3RDb3JlKCk7CisgICAgICAgICAgICBtUmVuZGVyLmluaXQobVJTLCBnZXRSZXNvdXJjZXMoKSwgdywgaCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvbkRldGFjaGVkRnJvbVdpbmRvdygpIHsKKyAgICAgICAgaWYobVJTICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1SUyA9IG51bGw7CisgICAgICAgICAgICBkZXN0cm95UmVuZGVyU2NyaXB0KCk7CisgICAgICAgIH0KKyAgICB9CisKKy8qCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gb25Ub3VjaEV2ZW50KE1vdGlvbkV2ZW50IGV2KQorICAgIHsKKyAgICAgICAgaW50IGFjdCA9IGV2LmdldEFjdGlvbk1hc2tlZCgpOworICAgICAgICBpZiAoYWN0ID09IGV2LkFDVElPTl9VUCkgeworICAgICAgICAgICAgbVJlbmRlci5uZXdUb3VjaFBvc2l0aW9uKDAsIDAsIDAsIGV2LmdldFBvaW50ZXJJZCgwKSk7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0gZWxzZSBpZiAoYWN0ID09IE1vdGlvbkV2ZW50LkFDVElPTl9QT0lOVEVSX1VQKSB7CisgICAgICAgICAgICAvLyBvbmx5IG9uZSBwb2ludGVyIGdvaW5nIHVwLCB3ZSBjYW4gZ2V0IHRoZSBpbmRleCBsaWtlIHRoaXMKKyAgICAgICAgICAgIGludCBwb2ludGVySW5kZXggPSBldi5nZXRBY3Rpb25JbmRleCgpOworICAgICAgICAgICAgaW50IHBvaW50ZXJJZCA9IGV2LmdldFBvaW50ZXJJZChwb2ludGVySW5kZXgpOworICAgICAgICAgICAgbVJlbmRlci5uZXdUb3VjaFBvc2l0aW9uKDAsIDAsIDAsIHBvaW50ZXJJZCk7CisgICAgICAgIH0KKyAgICAgICAgaW50IGNvdW50ID0gZXYuZ2V0SGlzdG9yeVNpemUoKTsKKyAgICAgICAgaW50IHBjb3VudCA9IGV2LmdldFBvaW50ZXJDb3VudCgpOworCisgICAgICAgIGZvciAoaW50IHA9MDsgcCA8IHBjb3VudDsgcCsrKSB7CisgICAgICAgICAgICBpbnQgaWQgPSBldi5nZXRQb2ludGVySWQocCk7CisgICAgICAgICAgICBtUmVuZGVyLm5ld1RvdWNoUG9zaXRpb24oZXYuZ2V0WChwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldi5nZXRZKHApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2LmdldFByZXNzdXJlKHApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkKTsKKworICAgICAgICAgICAgZm9yIChpbnQgaT0wOyBpIDwgY291bnQ7IGkrKykgeworICAgICAgICAgICAgICAgIG1SZW5kZXIubmV3VG91Y2hQb3NpdGlvbihldi5nZXRIaXN0b3JpY2FsWChwLCBpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXYuZ2V0SGlzdG9yaWNhbFkocCwgaSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2LmdldEhpc3RvcmljYWxQcmVzc3VyZShwLCBpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICAqLworfQorCisKZGlmZiAtLWdpdCBhL2xpYnMvcnMvamF2YS90ZXN0cy9zcmMvY29tL2FuZHJvaWQvcnMvdGVzdC9mcF9tYWQucnMgYi9saWJzL3JzL2phdmEvdGVzdHMvc3JjL2NvbS9hbmRyb2lkL3JzL3Rlc3QvZnBfbWFkLnJzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ5NGZmMzUKLS0tIC9kZXYvbnVsbAorKysgYi9saWJzL3JzL2phdmEvdGVzdHMvc3JjL2NvbS9hbmRyb2lkL3JzL3Rlc3QvZnBfbWFkLnJzCkBAIC0wLDAgKzEsMTczIEBACisjaW5jbHVkZSAic2hhcmVkLnJzaCIKKworY29uc3QgaW50IFRFU1RfQ09VTlQgPSAxOworCisjcHJhZ21hIHJzIGV4cG9ydF92YXIoZ19yZXN1bHRzKQorI3ByYWdtYSBycyBleHBvcnRfZnVuYyhkb1Rlc3QpCisKKworc3RhdGljIGZsb2F0IGRhdGFfZjFbMTAyNV07CitzdGF0aWMgZmxvYXQ0IGRhdGFfZjRbMTAyNV07CisKK3N0YXRpYyB2b2lkIHRlc3RfbWFkNCh1aW50MzJfdCBpbmRleCkgeworICAgIHN0YXJ0KCk7CisKKyAgICBmbG9hdCB0b3RhbCA9IDA7CisgICAgLy8gRG8gfjEgYmlsbGlvbiBvcHMKKyAgICBmb3IgKGludCBjdD0wOyBjdCA8IDEwMDAgKiAoMTAwMCAvIDgwKTsgY3QrKykgeworICAgICAgICBmb3IgKGludCBpPTA7IGkgPCAoMTAwMCk7IGkrKykgeworICAgICAgICAgICAgZGF0YV9mNFtpXSA9IChkYXRhX2Y0W2ldICogMC4wMmYgKworICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhX2Y0W2krMV0gKiAwLjA0ZiArCisgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFfZjRbaSsyXSAqIDAuMDVmICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YV9mNFtpKzNdICogMC4xZiArCisgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFfZjRbaSs0XSAqIDAuMmYgKworICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhX2Y0W2krNV0gKiAwLjJmICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YV9mNFtpKzZdICogMC4xZiArCisgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFfZjRbaSs3XSAqIDAuMDVmICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YV9mNFtpKzhdICogMC4wNGYgKworICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhX2Y0W2krOV0gKiAwLjAyZiArIDEuZik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBmbG9hdCB0aW1lID0gZW5kKGluZGV4KTsKKyAgICByc0RlYnVnKCJmcF9tYWQ0IE0gb3BzIiwgMTAwMC5mIC8gdGltZSk7Cit9CisKK3N0YXRpYyB2b2lkIHRlc3RfbWFkKHVpbnQzMl90IGluZGV4KSB7CisgICAgc3RhcnQoKTsKKworICAgIGZsb2F0IHRvdGFsID0gMDsKKyAgICAvLyBEbyB+MSBiaWxsaW9uIG9wcworICAgIGZvciAoaW50IGN0PTA7IGN0IDwgMTAwMCAqICgxMDAwIC8gMjApOyBjdCsrKSB7CisgICAgICAgIGZvciAoaW50IGk9MDsgaSA8ICgxMDAwKTsgaSsrKSB7CisgICAgICAgICAgICBkYXRhX2YxW2ldID0gKGRhdGFfZjFbaV0gKiAwLjAyZiArCisgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFfZjFbaSsxXSAqIDAuMDRmICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YV9mMVtpKzJdICogMC4wNWYgKworICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhX2YxW2krM10gKiAwLjFmICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YV9mMVtpKzRdICogMC4yZiArCisgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFfZjFbaSs1XSAqIDAuMmYgKworICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhX2YxW2krNl0gKiAwLjFmICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YV9mMVtpKzddICogMC4wNWYgKworICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhX2YxW2krOF0gKiAwLjA0ZiArCisgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFfZjFbaSs5XSAqIDAuMDJmICsgMS5mKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGZsb2F0IHRpbWUgPSBlbmQoaW5kZXgpOworICAgIHJzRGVidWcoImZwX21hZCBNIG9wcyIsIDEwMDAuZiAvIHRpbWUpOworfQorCitzdGF0aWMgdm9pZCB0ZXN0X25vcm0odWludDMyX3QgaW5kZXgpIHsKKyAgICBzdGFydCgpOworCisgICAgZmxvYXQgdG90YWwgPSAwOworICAgIC8vIERvIH4xMCBNIG9wcworICAgIGZvciAoaW50IGN0PTA7IGN0IDwgMTAwMCAqIDEwOyBjdCsrKSB7CisgICAgICAgIGZvciAoaW50IGk9MDsgaSA8ICgxMDAwKTsgaSsrKSB7CisgICAgICAgICAgICBkYXRhX2Y0W2ldID0gbm9ybWFsaXplKGRhdGFfZjRbaV0pOworICAgICAgICB9CisgICAgfQorCisgICAgZmxvYXQgdGltZSA9IGVuZChpbmRleCk7CisgICAgcnNEZWJ1ZygiZnBfbm9ybSBNIG9wcyIsIDEwLmYgLyB0aW1lKTsKK30KKworc3RhdGljIHZvaWQgdGVzdF9zaW5jb3M0KHVpbnQzMl90IGluZGV4KSB7CisgICAgc3RhcnQoKTsKKworICAgIGZsb2F0IHRvdGFsID0gMDsKKyAgICAvLyBEbyB+MTAgTSBvcHMKKyAgICBmb3IgKGludCBjdD0wOyBjdCA8IDEwMDAgKiAxMCAvIDQ7IGN0KyspIHsKKyAgICAgICAgZm9yIChpbnQgaT0wOyBpIDwgKDEwMDApOyBpKyspIHsKKyAgICAgICAgICAgIGRhdGFfZjRbaV0gPSBzaW4oZGF0YV9mNFtpXSkgKiBjb3MoZGF0YV9mNFtpXSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBmbG9hdCB0aW1lID0gZW5kKGluZGV4KTsKKyAgICByc0RlYnVnKCJmcF9zaW5jb3M0IE0gb3BzIiwgMTAuZiAvIHRpbWUpOworfQorCitzdGF0aWMgdm9pZCB0ZXN0X3NpbmNvcyh1aW50MzJfdCBpbmRleCkgeworICAgIHN0YXJ0KCk7CisKKyAgICBmbG9hdCB0b3RhbCA9IDA7CisgICAgLy8gRG8gfjEwIE0gb3BzCisgICAgZm9yIChpbnQgY3Q9MDsgY3QgPCAxMDAwICogMTA7IGN0KyspIHsKKyAgICAgICAgZm9yIChpbnQgaT0wOyBpIDwgKDEwMDApOyBpKyspIHsKKyAgICAgICAgICAgIGRhdGFfZjFbaV0gPSBzaW4oZGF0YV9mMVtpXSkgKiBjb3MoZGF0YV9mMVtpXSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBmbG9hdCB0aW1lID0gZW5kKGluZGV4KTsKKyAgICByc0RlYnVnKCJmcF9zaW5jb3MgTSBvcHMiLCAxMC5mIC8gdGltZSk7Cit9CisKK3N0YXRpYyB2b2lkIHRlc3RfY2xhbXAodWludDMyX3QgaW5kZXgpIHsKKyAgICBzdGFydCgpOworCisgICAgLy8gRG8gfjEwMCBNIG9wcworICAgIGZvciAoaW50IGN0PTA7IGN0IDwgMTAwMCAqIDEwMDsgY3QrKykgeworICAgICAgICBmb3IgKGludCBpPTA7IGkgPCAoMTAwMCk7IGkrKykgeworICAgICAgICAgICAgZGF0YV9mMVtpXSA9IGNsYW1wKGRhdGFfZjFbaV0sIC0xLmYsIDEuZik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBmbG9hdCB0aW1lID0gZW5kKGluZGV4KTsKKyAgICByc0RlYnVnKCJmcF9jbGFtcCBNIG9wcyIsIDEwMC5mIC8gdGltZSk7CisKKyAgICBzdGFydCgpOworICAgIC8vIERvIH4xMDAgTSBvcHMKKyAgICBmb3IgKGN0PTA7IGN0IDwgMTAwMCAqIDEwMDsgY3QrKykgeworICAgICAgICBmb3IgKGludCBpPTA7IGkgPCAoMTAwMCk7IGkrKykgeworICAgICAgICAgICAgaWYgKGRhdGFfZjFbaV0gPCAtMS5mKSBkYXRhX2YxW2ldID0gLTEuZjsKKyAgICAgICAgICAgIGlmIChkYXRhX2YxW2ldID4gLTEuZikgZGF0YV9mMVtpXSA9IDEuZjsKKyAgICAgICAgfQorICAgIH0KKworICAgIHRpbWUgPSBlbmQoaW5kZXgpOworICAgIHJzRGVidWcoImZwX2NsYW1wIHJlZiBNIG9wcyIsIDEwMC5mIC8gdGltZSk7Cit9CisKK3N0YXRpYyB2b2lkIHRlc3RfY2xhbXA0KHVpbnQzMl90IGluZGV4KSB7CisgICAgc3RhcnQoKTsKKworICAgIGZsb2F0IHRvdGFsID0gMDsKKyAgICAvLyBEbyB+MTAwIE0gb3BzCisgICAgZm9yIChpbnQgY3Q9MDsgY3QgPCAxMDAwICogMTAwIC80OyBjdCsrKSB7CisgICAgICAgIGZvciAoaW50IGk9MDsgaSA8ICgxMDAwKTsgaSsrKSB7CisgICAgICAgICAgICBkYXRhX2Y0W2ldID0gY2xhbXAoZGF0YV9mNFtpXSwgLTEuZiwgMS5mKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGZsb2F0IHRpbWUgPSBlbmQoaW5kZXgpOworICAgIHJzRGVidWcoImZwX2NsYW1wNCBNIG9wcyIsIDEwMC5mIC8gdGltZSk7Cit9CisKK3ZvaWQgZG9UZXN0KHVpbnQzMl90IGluZGV4LCBpbnQgdGVzdF9udW0pIHsKKyAgICBmb3IgKGludCB4PTA7IHggPCAxMDI1OyB4KyspIHsKKyAgICAgICAgZGF0YV9mMVt4XSA9ICh4ICYgMHhmKSAqIDAuMWY7CisgICAgICAgIGRhdGFfZjRbeF0ueCA9ICh4ICYgMHhmKSAqIDAuMWY7CisgICAgICAgIGRhdGFfZjRbeF0ueSA9ICh4ICYgMHhmMCkgKiAwLjFmOworICAgICAgICBkYXRhX2Y0W3hdLnogPSAoeCAmIDB4MzMpICogMC4xZjsKKyAgICAgICAgZGF0YV9mNFt4XS53ID0gKHggJiAweDc3KSAqIDAuMWY7CisgICAgfQorCisgICAgdGVzdF9tYWQ0KGluZGV4KTsKKyAgICB0ZXN0X21hZChpbmRleCk7CisKKyAgICBmb3IgKHg9MDsgeCA8IDEwMjU7IHgrKykgeworICAgICAgICBkYXRhX2YxW3hdID0gKHggJiAweGYpICogMC4xZiArIDEuZjsKKyAgICAgICAgZGF0YV9mNFt4XS54ID0gKHggJiAweGYpICogMC4xZiArIDEuZjsKKyAgICAgICAgZGF0YV9mNFt4XS55ID0gKHggJiAweGYwKSAqIDAuMWYgKyAxLmY7CisgICAgICAgIGRhdGFfZjRbeF0ueiA9ICh4ICYgMHgzMykgKiAwLjFmICsgMS5mOworICAgICAgICBkYXRhX2Y0W3hdLncgPSAoeCAmIDB4NzcpICogMC4xZiArIDEuZjsKKyAgICB9CisKKyAgICB0ZXN0X25vcm0oaW5kZXgpOworICAgIHRlc3Rfc2luY29zNChpbmRleCk7CisgICAgdGVzdF9zaW5jb3MoaW5kZXgpOworICAgIHRlc3RfY2xhbXA0KGluZGV4KTsKKyAgICB0ZXN0X2NsYW1wKGluZGV4KTsKK30KKworCmRpZmYgLS1naXQgYS9saWJzL3JzL2phdmEvdGVzdHMvc3JjL2NvbS9hbmRyb2lkL3JzL3Rlc3Qvc2hhcmVkLnJzaCBiL2xpYnMvcnMvamF2YS90ZXN0cy9zcmMvY29tL2FuZHJvaWQvcnMvdGVzdC9zaGFyZWQucnNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE3NzNlNDcKLS0tIC9kZXYvbnVsbAorKysgYi9saWJzL3JzL2phdmEvdGVzdHMvc3JjL2NvbS9hbmRyb2lkL3JzL3Rlc3Qvc2hhcmVkLnJzaApAQCAtMCwwICsxLDI1IEBACisjcHJhZ21hIHZlcnNpb24oMSkKKworI3ByYWdtYSBycyBqYXZhX3BhY2thZ2VfbmFtZShjb20uYW5kcm9pZC5ycy50ZXN0KQorCit0eXBlZGVmIHN0cnVjdCBUZXN0UmVzdWx0X3MgeworICAgIHJzX2FsbG9jYXRpb24gbmFtZTsKKyAgICBib29sIHBhc3M7CisgICAgZmxvYXQgc2NvcmU7CisgICAgaW50NjRfdCB0aW1lOworfSBUZXN0UmVzdWx0OworVGVzdFJlc3VsdCAqZ19yZXN1bHRzOworCitzdGF0aWMgaW50NjRfdCBnX3RpbWU7CisKK3N0YXRpYyB2b2lkIHN0YXJ0KHZvaWQpIHsKKyAgICBnX3RpbWUgPSByc1VwdGltZU1pbGxpcygpOworfQorCitzdGF0aWMgZmxvYXQgZW5kKHVpbnQzMl90IGlkeCkgeworICAgIGludDY0X3QgdCA9IHJzVXB0aW1lTWlsbGlzKCkgLSBnX3RpbWU7CisgICAgLy9nX3Jlc3VsdHNbaWR4XS50aW1lID0gdDsKKyAgICAvL3JzRGVidWcoInRlc3QgdGltZSIsIChpbnQpdCk7CisgICAgcmV0dXJuICgoZmxvYXQpdCkgLyAxMDAwLmY7Cit9CisKZGlmZiAtLWdpdCBhL2xpYnMvcnMvamF2YS90ZXN0cy9zcmMvY29tL2FuZHJvaWQvcnMvdGVzdC90ZXN0X3Jvb3QucnMgYi9saWJzL3JzL2phdmEvdGVzdHMvc3JjL2NvbS9hbmRyb2lkL3JzL3Rlc3QvdGVzdF9yb290LnJzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcyYjM5MWRkCi0tLSAvZGV2L251bGwKKysrIGIvbGlicy9ycy9qYXZhL3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9ycy90ZXN0L3Rlc3Rfcm9vdC5ycwpAQCAtMCwwICsxLDI2IEBACisvLyBGb3VudGFpbiB0ZXN0IHNjcmlwdAorI3ByYWdtYSB2ZXJzaW9uKDEpCisKKyNwcmFnbWEgcnMgamF2YV9wYWNrYWdlX25hbWUoY29tLmFuZHJvaWQucnMudGVzdCkKKworI3ByYWdtYSBzdGF0ZUZyYWdtZW50KHBhcmVudCkKKworI2luY2x1ZGUgInJzX2dyYXBoaWNzLnJzaCIKKworCit0eXBlZGVmIHN0cnVjdCBUZXN0UmVzdWx0IHsKKyAgICByc19hbGxvY2F0aW9uIG5hbWU7CisgICAgYm9vbCBwYXNzOworICAgIGZsb2F0IHNjb3JlOworfSBUZXN0UmVzdWx0X3Q7CitUZXN0UmVzdWx0X3QgKnJlc3VsdHM7CisKKyNwcmFnbWEgcnMgZXhwb3J0X3ZhcihyZXN1bHRzKQorLy8jcHJhZ21hIHJzIGV4cG9ydF9mdW5jKGFkZFBhcnRpY2xlcykKKworaW50IHJvb3QoKSB7CisKKyAgICByZXR1cm4gMDsKK30KKworCmRpZmYgLS1naXQgYS9saWJzL3JzL3JzLnNwZWMgYi9saWJzL3JzL3JzLnNwZWMKaW5kZXggNWFlOGQwMS4uYzdmYjJhZiAxMDA2NDQKLS0tIGEvbGlicy9ycy9ycy5zcGVjCisrKyBiL2xpYnMvcnMvcnMuc3BlYwpAQCAtMSwxMSArMSwxNCBAQAogCitDb250ZXh0RmluaXNoIHsKKwloYW5kY29kZUFwaQorCX0KIAogQ29udGV4dEJpbmRSb290U2NyaXB0IHsKIAlwYXJhbSBSc1NjcmlwdCBzYW1wbGVyCiAJfQogCi1Db250ZXh0QmluZFByb2dyYW1GcmFnbWVudFN0b3JlIHsKLQlwYXJhbSBSc1Byb2dyYW1GcmFnbWVudFN0b3JlIHBnbQorQ29udGV4dEJpbmRQcm9ncmFtU3RvcmUgeworCXBhcmFtIFJzUHJvZ3JhbVN0b3JlIHBnbQogCX0KIAogQ29udGV4dEJpbmRQcm9ncmFtRnJhZ21lbnQgewpAQCAtMjAsNiArMjMsMTAgQEAKIAlwYXJhbSBSc1Byb2dyYW1SYXN0ZXIgcGdtCiAJfQogCitDb250ZXh0QmluZEZvbnQgeworCXBhcmFtIFJzRm9udCBwZ20KKwl9CisKIENvbnRleHRQYXVzZSB7CiAJfQogCkBAIC01MSw2ICs1OCwxMSBAQAogCXBhcmFtIHNpemVfdCBsZW4KIAl9CiAKK0dldE5hbWUgeworCXBhcmFtIHZvaWQgKm9iagorCXBhcmFtIGNvbnN0IGNoYXIgKipuYW1lCisJfQorCiBPYmpEZXN0cm95IHsKIAlwYXJhbSB2b2lkICpvYmoKIAl9CkBAIC02OCw5ICs4MCwyMyBAQAogCXBhcmFtIGNvbnN0IFJzRWxlbWVudCAqIGVsZW1lbnRzCiAJcGFyYW0gY29uc3QgY2hhciAqKiBuYW1lcwogCXBhcmFtIGNvbnN0IHNpemVfdCAqIG5hbWVMZW5ndGhzCisJcGFyYW0gY29uc3QgdWludDMyX3QgKiBhcnJheVNpemUKIAlyZXQgUnNFbGVtZW50CiAJfQogCitFbGVtZW50R2V0TmF0aXZlRGF0YSB7CisJcGFyYW0gUnNFbGVtZW50IGVsZW0KKwlwYXJhbSB1aW50MzJfdCAqZWxlbURhdGEKKwlwYXJhbSB1aW50MzJfdCBlbGVtRGF0YVNpemUKKwl9CisKK0VsZW1lbnRHZXRTdWJFbGVtZW50cyB7CisJcGFyYW0gUnNFbGVtZW50IGVsZW0KKwlwYXJhbSB1aW50MzJfdCAqaWRzCisJcGFyYW0gY29uc3QgY2hhciAqKm5hbWVzCisJcGFyYW0gdWludDMyX3QgZGF0YVNpemUKKwl9CisKIFR5cGVCZWdpbiB7CiAJcGFyYW0gUnNFbGVtZW50IHR5cGUKIAl9CkBAIC04NCw2ICsxMTAsMTIgQEAKIAlyZXQgUnNUeXBlCiAJfQogCitUeXBlR2V0TmF0aXZlRGF0YSB7CisJcGFyYW0gUnNUeXBlIHR5cGUKKwlwYXJhbSB1aW50MzJfdCAqIHR5cGVEYXRhCisJcGFyYW0gdWludDMyX3QgdHlwZURhdGFTaXplCisJfQorCiBBbGxvY2F0aW9uQ3JlYXRlVHlwZWQgewogCXBhcmFtIFJzVHlwZSB0eXBlCiAJcmV0IFJzQWxsb2NhdGlvbgpAQCAtMTUzLDYgKzE4NSwxNiBAQAogCXRvZ2dsZVBsYXkKIAl9CiAKK0FsbG9jYXRpb24xRFN1YkVsZW1lbnREYXRhIHsKKwlwYXJhbSBSc0FsbG9jYXRpb24gdmEKKwlwYXJhbSB1aW50MzJfdCB4CisJcGFyYW0gY29uc3Qgdm9pZCAqZGF0YQorCXBhcmFtIHVpbnQzMl90IGNvbXBfb2Zmc2V0CisJcGFyYW0gdWludDMyX3QgYnl0ZXMKKwloYW5kY29kZUFwaQorCXRvZ2dsZVBsYXkKKwl9CisKIEFsbG9jYXRpb24yRFN1YkRhdGEgewogCXBhcmFtIFJzQWxsb2NhdGlvbiB2YQogCXBhcmFtIHVpbnQzMl90IHhvZmYKQEAgLTE2Myw2ICsyMDUsMTUgQEAKIAlwYXJhbSB1aW50MzJfdCBieXRlcwogCX0KIAorQWxsb2NhdGlvbjJEU3ViRWxlbWVudERhdGEgeworCXBhcmFtIFJzQWxsb2NhdGlvbiB2YQorCXBhcmFtIHVpbnQzMl90IHgKKwlwYXJhbSB1aW50MzJfdCB5CisJcGFyYW0gY29uc3Qgdm9pZCAqZGF0YQorCXBhcmFtIHVpbnQzMl90IGVsZW1lbnRfb2Zmc2V0CisJcGFyYW0gdWludDMyX3QgYnl0ZXMKKwl9CisKIEFsbG9jYXRpb25SZWFkIHsKIAlwYXJhbSBSc0FsbG9jYXRpb24gdmEKIAlwYXJhbSB2b2lkICogZGF0YQpAQCAtMjI0LDYgKzI3NSwxMSBAQAogCXBhcmFtIGNvbnN0IHZvaWQgKmRhdGEKIAl9CiAKK0FsbG9jYXRpb25HZXRUeXBlIHsKKwlwYXJhbSBSc0FsbG9jYXRpb24gdmEKKwlyZXQgY29uc3Qgdm9pZCoKKwl9CisKIFNhbXBsZXJCZWdpbiB7CiAJfQogCkBAIC0yNDgsMTMgKzMwNCw2IEBACiBTY3JpcHRDQmVnaW4gewogCX0KIAotU2NyaXB0U2V0Q2xlYXJDb2xvciB7Ci0JcGFyYW0gUnNTY3JpcHQgcwotCXBhcmFtIGZsb2F0IHIKLQlwYXJhbSBmbG9hdCBnCi0JcGFyYW0gZmxvYXQgYgotCXBhcmFtIGZsb2F0IGEKLQl9CiAKIFNjcmlwdFNldFRpbWVab25lIHsKIAlwYXJhbSBSc1NjcmlwdCBzCkBAIC0yNjIsMzcgKzMxMSw0MSBAQAogCXBhcmFtIHVpbnQzMl90IGxlbmd0aAogCX0KIAotU2NyaXB0U2V0Q2xlYXJEZXB0aCB7Ci0JcGFyYW0gUnNTY3JpcHQgcwotCXBhcmFtIGZsb2F0IGRlcHRoCi0JfQotCi1TY3JpcHRTZXRDbGVhclN0ZW5jaWwgewotCXBhcmFtIFJzU2NyaXB0IHMKLQlwYXJhbSB1aW50MzJfdCBzdGVuY2lsCi0JfQotCi1TY3JpcHRTZXRUeXBlIHsKLQlwYXJhbSBSc1R5cGUgdHlwZQotCXBhcmFtIHVpbnQzMl90IHNsb3QKLQlwYXJhbSBib29sIGlzV3JpdGFibGUKLQlwYXJhbSBjb25zdCBjaGFyICogbmFtZQotCX0KLQotU2NyaXB0U2V0SW52b2tlIHsKLQlwYXJhbSBjb25zdCBjaGFyICogbmFtZQotCXBhcmFtIHVpbnQzMl90IHNsb3QKLQl9CiAKIFNjcmlwdEludm9rZSB7CiAJcGFyYW0gUnNTY3JpcHQgcwogCXBhcmFtIHVpbnQzMl90IHNsb3QKIAl9CiAKLVNjcmlwdFNldFJvb3QgewotCXBhcmFtIGJvb2wgaXNSb290CitTY3JpcHRJbnZva2VWIHsKKwlwYXJhbSBSc1NjcmlwdCBzCisJcGFyYW0gdWludDMyX3Qgc2xvdAorCXBhcmFtIGNvbnN0IHZvaWQgKiBkYXRhCisJcGFyYW0gdWludDMyX3QgZGF0YUxlbgorCWhhbmRjb2RlQXBpCisJdG9nZ2xlUGxheQogCX0KIAorU2NyaXB0U2V0VmFySSB7CisJcGFyYW0gUnNTY3JpcHQgcworCXBhcmFtIHVpbnQzMl90IHNsb3QKKwlwYXJhbSBpbnQgdmFsdWUKKwl9CisKK1NjcmlwdFNldFZhckYgeworCXBhcmFtIFJzU2NyaXB0IHMKKwlwYXJhbSB1aW50MzJfdCBzbG90CisJcGFyYW0gZmxvYXQgdmFsdWUKKwl9CisKK1NjcmlwdFNldFZhclYgeworCXBhcmFtIFJzU2NyaXB0IHMKKwlwYXJhbSB1aW50MzJfdCBzbG90CisJcGFyYW0gY29uc3Qgdm9pZCAqIGRhdGEKKwlwYXJhbSB1aW50MzJfdCBkYXRhTGVuCisJaGFuZGNvZGVBcGkKKwl0b2dnbGVQbGF5CisJfQogCiAKIFNjcmlwdENTZXRTY3JpcHQgewpAQCAtMzA4LDUyICszNjEsNDEgQEAKIAlyZXQgUnNTY3JpcHQKIAl9CiAKLVNjcmlwdENTZXREZWZpbmVGIHsKLSAgICBwYXJhbSBjb25zdCBjaGFyKiBuYW1lCi0gICAgcGFyYW0gZmxvYXQgdmFsdWUKLSAgICB9CiAKLVNjcmlwdENTZXREZWZpbmVJMzIgewotICAgIHBhcmFtIGNvbnN0IGNoYXIqIG5hbWUKLSAgICBwYXJhbSBpbnQzMl90IHZhbHVlCi0gICAgfQotCi1Qcm9ncmFtRnJhZ21lbnRTdG9yZUJlZ2luIHsKK1Byb2dyYW1TdG9yZUJlZ2luIHsKIAlwYXJhbSBSc0VsZW1lbnQgaW4KIAlwYXJhbSBSc0VsZW1lbnQgb3V0CiAJfQogCi1Qcm9ncmFtRnJhZ21lbnRTdG9yZUNvbG9yTWFzayB7CitQcm9ncmFtU3RvcmVDb2xvck1hc2sgewogCXBhcmFtIGJvb2wgcgogCXBhcmFtIGJvb2wgZwogCXBhcmFtIGJvb2wgYgogCXBhcmFtIGJvb2wgYQogCX0KIAotUHJvZ3JhbUZyYWdtZW50U3RvcmVCbGVuZEZ1bmMgeworUHJvZ3JhbVN0b3JlQmxlbmRGdW5jIHsKIAlwYXJhbSBSc0JsZW5kU3JjRnVuYyBzcmNGdW5jCiAJcGFyYW0gUnNCbGVuZERzdEZ1bmMgZGVzdEZ1bmMKIAl9CiAKLVByb2dyYW1GcmFnbWVudFN0b3JlRGVwdGhNYXNrIHsKK1Byb2dyYW1TdG9yZURlcHRoTWFzayB7CiAJcGFyYW0gYm9vbCBlbmFibGUKIH0KIAotUHJvZ3JhbUZyYWdtZW50U3RvcmVEaXRoZXIgeworUHJvZ3JhbVN0b3JlRGl0aGVyIHsKIAlwYXJhbSBib29sIGVuYWJsZQogfQogCi1Qcm9ncmFtRnJhZ21lbnRTdG9yZURlcHRoRnVuYyB7CitQcm9ncmFtU3RvcmVEZXB0aEZ1bmMgewogCXBhcmFtIFJzRGVwdGhGdW5jIGZ1bmMKIH0KIAotUHJvZ3JhbUZyYWdtZW50U3RvcmVDcmVhdGUgewotCXJldCBSc1Byb2dyYW1GcmFnbWVudFN0b3JlCitQcm9ncmFtU3RvcmVDcmVhdGUgeworCXJldCBSc1Byb2dyYW1TdG9yZQogCX0KIAogUHJvZ3JhbVJhc3RlckNyZWF0ZSB7Ci0JcGFyYW0gUnNFbGVtZW50IGluCi0JcGFyYW0gUnNFbGVtZW50IG91dAogCXBhcmFtIGJvb2wgcG9pbnRTbW9vdGgKIAlwYXJhbSBib29sIGxpbmVTbW9vdGgKIAlwYXJhbSBib29sIHBvaW50U3ByaXRlCkBAIC0zNjUsMTIgKzQwNywxMSBAQAogCXBhcmFtIGZsb2F0IGx3CiB9CiAKLVByb2dyYW1SYXN0ZXJTZXRQb2ludFNpemV7CitQcm9ncmFtUmFzdGVyU2V0Q3VsbE1vZGUgewogCXBhcmFtIFJzUHJvZ3JhbVJhc3RlciBwcgotCXBhcmFtIGZsb2F0IHBzCisJcGFyYW0gUnNDdWxsTW9kZSBtb2RlCiB9CiAKLQogUHJvZ3JhbUJpbmRDb25zdGFudHMgewogCXBhcmFtIFJzUHJvZ3JhbSB2cAogCXBhcmFtIHVpbnQzMl90IHNsb3QKQEAgLTQxNywzNCArNDU4LDEwIEBACiAJcmV0IFJzUHJvZ3JhbVZlcnRleAogCX0KIAotTGlnaHRCZWdpbiB7Ci0JfQotCi1MaWdodFNldExvY2FsIHsKLQlwYXJhbSBib29sIGlzTG9jYWwKLQl9Ci0KLUxpZ2h0U2V0TW9ub2Nocm9tYXRpYyB7Ci0JcGFyYW0gYm9vbCBpc01vbm8KLQl9Ci0KLUxpZ2h0Q3JlYXRlIHsKLQlyZXQgUnNMaWdodCBsaWdodAotCX0KLQotCi1MaWdodFNldFBvc2l0aW9uIHsKLQlwYXJhbSBSc0xpZ2h0IGxpZ2h0Ci0JcGFyYW0gZmxvYXQgeAotCXBhcmFtIGZsb2F0IHkKLQlwYXJhbSBmbG9hdCB6Ci0JfQotCi1MaWdodFNldENvbG9yIHsKLQlwYXJhbSBSc0xpZ2h0IGxpZ2h0Ci0JcGFyYW0gZmxvYXQgcgotCXBhcmFtIGZsb2F0IGcKLQlwYXJhbSBmbG9hdCBiCitGaWxlQTNEQ3JlYXRlRnJvbUFzc2V0U3RyZWFtIHsKKwlwYXJhbSBjb25zdCB2b2lkICogZGF0YQorCXBhcmFtIHNpemVfdCBsZW4KKwlyZXQgUnNGaWxlCiAJfQogCiBGaWxlT3BlbiB7CkBAIC00NTMsMzAgKzQ3MCw3OSBAQAogCXBhcmFtIHNpemVfdCBsZW4KIAl9CiAKK0ZpbGVBM0RHZXROdW1JbmRleEVudHJpZXMgeworCXBhcmFtIGludDMyX3QgKiBudW1FbnRyaWVzCisJcGFyYW0gUnNGaWxlIGZpbGUKKwl9CiAKLVNpbXBsZU1lc2hDcmVhdGUgewotCXJldCBSc1NpbXBsZU1lc2gKLQlwYXJhbSBSc0FsbG9jYXRpb24gcHJpbQotCXBhcmFtIFJzQWxsb2NhdGlvbiBpbmRleAotCXBhcmFtIFJzQWxsb2NhdGlvbiAqdnR4CitGaWxlQTNER2V0SW5kZXhFbnRyaWVzIHsKKwlwYXJhbSBSc0ZpbGVJbmRleEVudHJ5ICogZmlsZUVudHJpZXMKKwlwYXJhbSB1aW50MzJfdCBudW1FbnRyaWVzCisJcGFyYW0gUnNGaWxlIGZpbGVBM0QKKwl9CisKK0ZpbGVBM0RHZXRFbnRyeUJ5SW5kZXggeworCXBhcmFtIHVpbnQzMl90IGluZGV4CisJcGFyYW0gUnNGaWxlIGZpbGUKKwlyZXQgUnNPYmplY3RCYXNlCisJfQorCitGb250Q3JlYXRlRnJvbUZpbGUgeworCXBhcmFtIGNvbnN0IGNoYXIgKm5hbWUKKwlwYXJhbSB1aW50MzJfdCBmb250U2l6ZQorCXBhcmFtIHVpbnQzMl90IGRwaQorCXJldCBSc0ZvbnQKKwl9CisKK01lc2hDcmVhdGUgeworCXJldCBSc01lc2gKIAlwYXJhbSB1aW50MzJfdCB2dHhDb3VudAotCXBhcmFtIHVpbnQzMl90IHByaW1UeXBlCisJcGFyYW0gdWludDMyX3QgaWR4Q291bnQKIAl9CiAKLQotU2ltcGxlTWVzaEJpbmRJbmRleCB7Ci0JcGFyYW0gUnNTaW1wbGVNZXNoIG1lc2gKK01lc2hCaW5kSW5kZXggeworCXBhcmFtIFJzTWVzaCBtZXNoCiAJcGFyYW0gUnNBbGxvY2F0aW9uIGlkeAorCXBhcmFtIHVpbnQzMl90IHByaW1UeXBlCisJcGFyYW0gdWludDMyX3Qgc2xvdAogCX0KIAotU2ltcGxlTWVzaEJpbmRQcmltaXRpdmUgewotCXBhcmFtIFJzU2ltcGxlTWVzaCBtZXNoCi0JcGFyYW0gUnNBbGxvY2F0aW9uIHByaW0KLQl9Ci0KLVNpbXBsZU1lc2hCaW5kVmVydGV4IHsKLQlwYXJhbSBSc1NpbXBsZU1lc2ggbWVzaAorTWVzaEJpbmRWZXJ0ZXggeworCXBhcmFtIFJzTWVzaCBtZXNoCiAJcGFyYW0gUnNBbGxvY2F0aW9uIHZ0eAogCXBhcmFtIHVpbnQzMl90IHNsb3QKIAl9CiAKK01lc2hHZXRWZXJ0ZXhCdWZmZXJDb3VudCB7CisJcGFyYW0gUnNNZXNoIG1lc2gKKwlwYXJhbSBpbnQzMl90ICpudW1WdHgKKwl9CisKK01lc2hHZXRJbmRleENvdW50IHsKKwlwYXJhbSBSc01lc2ggbWVzaAorCXBhcmFtIGludDMyX3QgKm51bUlkeAorCX0KKworTWVzaEdldFZlcnRpY2VzIHsKKwlwYXJhbSBSc01lc2ggbXYKKwlwYXJhbSBSc0FsbG9jYXRpb24gKnZ0eERhdGEKKwlwYXJhbSB1aW50MzJfdCB2dHhEYXRhQ291bnQKKwl9CisKK01lc2hHZXRJbmRpY2VzIHsKKwlwYXJhbSBSc01lc2ggbXYKKwlwYXJhbSBSc0FsbG9jYXRpb24gKnZhCisJcGFyYW0gdWludDMyX3QgKnByaW1UeXBlCisJcGFyYW0gdWludDMyX3QgaWR4RGF0YUNvdW50CisJfQorCitBbmltYXRpb25DcmVhdGUgeworCXBhcmFtIGNvbnN0IGZsb2F0ICppblZhbHVlcworCXBhcmFtIGNvbnN0IGZsb2F0ICpvdXRWYWx1ZXMKKwlwYXJhbSB1aW50MzJfdCB2YWx1ZUNvdW50CisJcGFyYW0gUnNBbmltYXRpb25JbnRlcnBvbGF0aW9uIGludGVycAorCXBhcmFtIFJzQW5pbWF0aW9uRWRnZSBwcmUKKwlwYXJhbSBSc0FuaW1hdGlvbkVkZ2UgcG9zdAorCXJldCBSc0FuaW1hdGlvbgorCX0KKwpkaWZmIC0tZ2l0IGEvbGlicy9ycy9yc0FkYXB0ZXIuY3BwIGIvbGlicy9ycy9yc0FkYXB0ZXIuY3BwCmluZGV4IDBkMzFmYWMuLmI0ZWMyNTAgMTAwNjQ0Ci0tLSBhL2xpYnMvcnMvcnNBZGFwdGVyLmNwcAorKysgYi9saWJzL3JzL3JzQWRhcHRlci5jcHAKQEAgLTE1LDcgKzE1LDExIEBACiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCisjaWZuZGVmIEFORFJPSURfUlNfQlVJTERfRk9SX0hPU1QKICNpbmNsdWRlICJyc0NvbnRleHQuaCIKKyNlbHNlCisjaW5jbHVkZSAicnNDb250ZXh0SG9zdFN0dWIuaCIKKyNlbmRpZgogCiB1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKIHVzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOjpyZW5kZXJzY3JpcHQ7CkBAIC03MCw2ICs3NCwxNiBAQAogICAgICAgICAgICBtQWxsb2NhdGlvbi5nZXQoKS0+Z2V0VHlwZSgpLT5nZXRTaXplQnl0ZXMoKSk7CiB9CiAKK3ZvaWQgQWRhcHRlcjFEOjpzZXJpYWxpemUoT1N0cmVhbSAqc3RyZWFtKSBjb25zdAoreworICAgIAorfQorCitBZGFwdGVyMUQgKkFkYXB0ZXIxRDo6Y3JlYXRlRnJvbVN0cmVhbShDb250ZXh0ICpyc2MsIElTdHJlYW0gKnN0cmVhbSkKK3sKKyAgICByZXR1cm4gTlVMTDsKK30KKwogbmFtZXNwYWNlIGFuZHJvaWQgewogbmFtZXNwYWNlIHJlbmRlcnNjcmlwdCB7CiAKQEAgLTE4NSw2ICsxOTksMTUgQEAKICAgICAgICAgICAgbUFsbG9jYXRpb24uZ2V0KCktPmdldFR5cGUoKS0+Z2V0U2l6ZUJ5dGVzKCkpOwogfQogCit2b2lkIEFkYXB0ZXIyRDo6c2VyaWFsaXplKE9TdHJlYW0gKnN0cmVhbSkgY29uc3QKK3sKKyAgICAKK30KKworQWRhcHRlcjJEICpBZGFwdGVyMkQ6OmNyZWF0ZUZyb21TdHJlYW0oQ29udGV4dCAqcnNjLCBJU3RyZWFtICpzdHJlYW0pCit7CisgICAgcmV0dXJuIE5VTEw7Cit9CiAKIAogbmFtZXNwYWNlIGFuZHJvaWQgewpkaWZmIC0tZ2l0IGEvbGlicy9ycy9yc0FkYXB0ZXIuaCBiL2xpYnMvcnMvcnNBZGFwdGVyLmgKaW5kZXggY2IyODcyZS4uNDQ5ZTdhZCAxMDA2NDQKLS0tIGEvbGlicy9ycy9yc0FkYXB0ZXIuaAorKysgYi9saWJzL3JzL3JzQWRhcHRlci5oCkBAIC01MCw2ICs1MCwxMCBAQAogICAgIHZvaWQgc3ViRGF0YSh1aW50MzJfdCB4b2ZmLCB1aW50MzJfdCBjb3VudCwgY29uc3Qgdm9pZCAqZGF0YSk7CiAgICAgdm9pZCBkYXRhKGNvbnN0IHZvaWQgKmRhdGEpOwogCisgICAgdmlydHVhbCB2b2lkIHNlcmlhbGl6ZShPU3RyZWFtICpzdHJlYW0pIGNvbnN0OworICAgIHZpcnR1YWwgUnNBM0RDbGFzc0lEIGdldENsYXNzSWQoKSBjb25zdCB7IHJldHVybiBSU19BM0RfQ0xBU1NfSURfQURBUFRFUl8xRDsgfQorICAgIHN0YXRpYyBBZGFwdGVyMUQgKmNyZWF0ZUZyb21TdHJlYW0oQ29udGV4dCAqcnNjLCBJU3RyZWFtICpzdHJlYW0pOworCiBwcm90ZWN0ZWQ6CiAgICAgT2JqZWN0QmFzZVJlZjxBbGxvY2F0aW9uPiBtQWxsb2NhdGlvbjsKICAgICB1aW50MzJfdCBtWTsKQEAgLTgyLDYgKzg2LDEwIEBACiAgICAgdm9pZCBkYXRhKGNvbnN0IHZvaWQgKmRhdGEpOwogICAgIHZvaWQgc3ViRGF0YSh1aW50MzJfdCB4b2ZmLCB1aW50MzJfdCB5b2ZmLCB1aW50MzJfdCB3LCB1aW50MzJfdCBoLCBjb25zdCB2b2lkICpkYXRhKTsKIAorICAgIHZpcnR1YWwgdm9pZCBzZXJpYWxpemUoT1N0cmVhbSAqc3RyZWFtKSBjb25zdDsKKyAgICB2aXJ0dWFsIFJzQTNEQ2xhc3NJRCBnZXRDbGFzc0lkKCkgY29uc3QgeyByZXR1cm4gUlNfQTNEX0NMQVNTX0lEX0FEQVBURVJfMkQ7IH0KKyAgICBzdGF0aWMgQWRhcHRlcjJEICpjcmVhdGVGcm9tU3RyZWFtKENvbnRleHQgKnJzYywgSVN0cmVhbSAqc3RyZWFtKTsKKwogcHJvdGVjdGVkOgogICAgIE9iamVjdEJhc2VSZWY8QWxsb2NhdGlvbj4gbUFsbG9jYXRpb247CiAgICAgdWludDMyX3QgbVo7CmRpZmYgLS1naXQgYS9saWJzL3JzL3JzQWxsb2NhdGlvbi5jcHAgYi9saWJzL3JzL3JzQWxsb2NhdGlvbi5jcHAKaW5kZXggNGU4Mjc4ZC4uNjA5OThjMzEgMTAwNjQ0Ci0tLSBhL2xpYnMvcnMvcnNBbGxvY2F0aW9uLmNwcAorKysgYi9saWJzL3JzL3JzQWxsb2NhdGlvbi5jcHAKQEAgLTEzLDEyICsxMywxOCBAQAogICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KLQorI2lmbmRlZiBBTkRST0lEX1JTX0JVSUxEX0ZPUl9IT1NUCiAjaW5jbHVkZSAicnNDb250ZXh0LmgiCiAKICNpbmNsdWRlIDxHTEVTL2dsLmg+CiAjaW5jbHVkZSA8R0xFUzIvZ2wyLmg+CiAjaW5jbHVkZSA8R0xFUy9nbGV4dC5oPgorI2Vsc2UKKyNpbmNsdWRlICJyc0NvbnRleHRIb3N0U3R1Yi5oIgorCisjaW5jbHVkZSA8T3BlbkdML2dsLmg+CisjaW5jbHVkZSA8T3BlbkdsL2dsZXh0Lmg+CisjZW5kaWYKIAogdXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7CiB1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDo6cmVuZGVyc2NyaXB0OwpAQCAtMjgsNiArMzQsOSBAQAogICAgIGluaXQocnNjLCB0eXBlKTsKIAogICAgIG1QdHIgPSBtYWxsb2MobVR5cGUtPmdldFNpemVCeXRlcygpKTsKKyAgICBpZiAobVR5cGUtPmdldEVsZW1lbnQoKS0+Z2V0SGFzUmVmZXJlbmNlcygpKSB7CisgICAgICAgIG1lbXNldChtUHRyLCAwLCBtVHlwZS0+Z2V0U2l6ZUJ5dGVzKCkpOworICAgIH0KICAgICBpZiAoIW1QdHIpIHsKICAgICAgICAgTE9HRSgiQWxsb2NhdGlvbjo6QWxsb2NhdGlvbiwgYWxsb2MgZmFpbHVyZSIpOwogICAgIH0KQEAgLTE2Nyw5ICsxNzYsMTIgQEAKICAgICAgICAgICAgICAgICAgICAgIDAsIGZvcm1hdCwgdHlwZSwgcHRyKTsKICAgICB9CiAgICAgaWYgKG1UZXh0dXJlR2VuTWlwbWFwKSB7CisjaWZuZGVmIEFORFJPSURfUlNfQlVJTERfRk9SX0hPU1QKICAgICAgICAgZ2xHZW5lcmF0ZU1pcG1hcChHTF9URVhUVVJFXzJEKTsKKyNlbmRpZiAvL0FORFJPSURfUlNfQlVJTERfRk9SX0hPU1QKICAgICB9CiAKKyAgICByc2MtPmNoZWNrRXJyb3IoIkFsbG9jYXRpb246OnVwbG9hZFRvVGV4dHVyZSIpOwogfQogCiB2b2lkIEFsbG9jYXRpb246OmRlZmVyZWRVcGxvYWRUb0J1ZmZlck9iamVjdChjb25zdCBDb250ZXh0ICpyc2MpCkBAIC0yMDEsNiArMjEzLDcgQEAKICAgICBnbEJpbmRCdWZmZXIoR0xfQVJSQVlfQlVGRkVSLCBtQnVmZmVySUQpOwogICAgIGdsQnVmZmVyRGF0YShHTF9BUlJBWV9CVUZGRVIsIG1UeXBlLT5nZXRTaXplQnl0ZXMoKSwgZ2V0UHRyKCksIEdMX0RZTkFNSUNfRFJBVyk7CiAgICAgZ2xCaW5kQnVmZmVyKEdMX0FSUkFZX0JVRkZFUiwgMCk7CisgICAgcnNjLT5jaGVja0Vycm9yKCJBbGxvY2F0aW9uOjp1cGxvYWRUb0J1ZmZlck9iamVjdCIpOwogfQogCiB2b2lkIEFsbG9jYXRpb246OnVwbG9hZENoZWNrKGNvbnN0IENvbnRleHQgKnJzYykKQEAgLTIxNywxMyArMjMwLDE5IEBACiB9CiAKIAotdm9pZCBBbGxvY2F0aW9uOjpkYXRhKGNvbnN0IHZvaWQgKmRhdGEsIHVpbnQzMl90IHNpemVCeXRlcykKK3ZvaWQgQWxsb2NhdGlvbjo6ZGF0YShDb250ZXh0ICpyc2MsIGNvbnN0IHZvaWQgKmRhdGEsIHVpbnQzMl90IHNpemVCeXRlcykKIHsKICAgICB1aW50MzJfdCBzaXplID0gbVR5cGUtPmdldFNpemVCeXRlcygpOwogICAgIGlmIChzaXplICE9IHNpemVCeXRlcykgewogICAgICAgICBMT0dFKCJBbGxvY2F0aW9uOjpkYXRhIGNhbGxlZCB3aXRoIG1pc21hdGNoZWQgc2l6ZSBleHBlY3RlZCAlaSwgZ290ICVpIiwgc2l6ZSwgc2l6ZUJ5dGVzKTsKICAgICAgICAgcmV0dXJuOwogICAgIH0KKworICAgIGlmIChtVHlwZS0+Z2V0RWxlbWVudCgpLT5nZXRIYXNSZWZlcmVuY2VzKCkpIHsKKyAgICAgICAgaW5jUmVmcyhkYXRhLCBzaXplQnl0ZXMgLyBtVHlwZS0+Z2V0RWxlbWVudCgpLT5nZXRTaXplQnl0ZXMoKSk7CisgICAgICAgIGRlY1JlZnMobVB0ciwgc2l6ZUJ5dGVzIC8gbVR5cGUtPmdldEVsZW1lbnQoKS0+Z2V0U2l6ZUJ5dGVzKCkpOworICAgIH0KKwogICAgIG1lbWNweShtUHRyLCBkYXRhLCBzaXplKTsKICAgICBzZW5kRGlydHkoKTsKICAgICBtVXBsb2FkRGVmZXJlZCA9IHRydWU7CkBAIC0yMzQsNyArMjUzLDcgQEAKICAgICBtZW1jcHkoZGF0YSwgbVB0ciwgbVR5cGUtPmdldFNpemVCeXRlcygpKTsKIH0KIAotdm9pZCBBbGxvY2F0aW9uOjpzdWJEYXRhKHVpbnQzMl90IHhvZmYsIHVpbnQzMl90IGNvdW50LCBjb25zdCB2b2lkICpkYXRhLCB1aW50MzJfdCBzaXplQnl0ZXMpCit2b2lkIEFsbG9jYXRpb246OnN1YkRhdGEoQ29udGV4dCAqcnNjLCB1aW50MzJfdCB4b2ZmLCB1aW50MzJfdCBjb3VudCwgY29uc3Qgdm9pZCAqZGF0YSwgdWludDMyX3Qgc2l6ZUJ5dGVzKQogewogICAgIHVpbnQzMl90IGVTaXplID0gbVR5cGUtPmdldEVsZW1lbnRTaXplQnl0ZXMoKTsKICAgICB1aW50OF90ICogcHRyID0gc3RhdGljX2Nhc3Q8dWludDhfdCAqPihtUHRyKTsKQEAgLTI0NiwxMiArMjY1LDE4IEBACiAgICAgICAgIG1UeXBlLT5kdW1wTE9HVigidHlwZSBpbmZvIik7CiAgICAgICAgIHJldHVybjsKICAgICB9CisKKyAgICBpZiAobVR5cGUtPmdldEVsZW1lbnQoKS0+Z2V0SGFzUmVmZXJlbmNlcygpKSB7CisgICAgICAgIGluY1JlZnMoZGF0YSwgY291bnQpOworICAgICAgICBkZWNSZWZzKHB0ciwgY291bnQpOworICAgIH0KKwogICAgIG1lbWNweShwdHIsIGRhdGEsIHNpemUpOwogICAgIHNlbmREaXJ0eSgpOwogICAgIG1VcGxvYWREZWZlcmVkID0gdHJ1ZTsKIH0KIAotdm9pZCBBbGxvY2F0aW9uOjpzdWJEYXRhKHVpbnQzMl90IHhvZmYsIHVpbnQzMl90IHlvZmYsCit2b2lkIEFsbG9jYXRpb246OnN1YkRhdGEoQ29udGV4dCAqcnNjLCB1aW50MzJfdCB4b2ZmLCB1aW50MzJfdCB5b2ZmLAogICAgICAgICAgICAgIHVpbnQzMl90IHcsIHVpbnQzMl90IGgsIGNvbnN0IHZvaWQgKmRhdGEsIHVpbnQzMl90IHNpemVCeXRlcykKIHsKICAgICB1aW50MzJfdCBlU2l6ZSA9IG1UeXBlLT5nZXRFbGVtZW50U2l6ZUJ5dGVzKCk7CkBAIC0yNjksNiArMjk0LDEwIEBACiAKICAgICBmb3IgKHVpbnQzMl90IGxpbmU9eW9mZjsgbGluZSA8ICh5b2ZmK2gpOyBsaW5lKyspIHsKICAgICAgICAgdWludDhfdCAqIHB0ciA9IHN0YXRpY19jYXN0PHVpbnQ4X3QgKj4obVB0cik7CisgICAgICAgIGlmIChtVHlwZS0+Z2V0RWxlbWVudCgpLT5nZXRIYXNSZWZlcmVuY2VzKCkpIHsKKyAgICAgICAgICAgIGluY1JlZnMoc3JjLCB3KTsKKyAgICAgICAgICAgIGRlY1JlZnMoZHN0LCB3KTsKKyAgICAgICAgfQogICAgICAgICBtZW1jcHkoZHN0LCBzcmMsIGxpbmVTaXplKTsKICAgICAgICAgc3JjICs9IGxpbmVTaXplOwogICAgICAgICBkc3QgKz0gZGVzdFcgKiBlU2l6ZTsKQEAgLTI3NywxNCArMzA2LDk2IEBACiAgICAgbVVwbG9hZERlZmVyZWQgPSB0cnVlOwogfQogCi12b2lkIEFsbG9jYXRpb246OnN1YkRhdGEodWludDMyX3QgeG9mZiwgdWludDMyX3QgeW9mZiwgdWludDMyX3Qgem9mZiwKK3ZvaWQgQWxsb2NhdGlvbjo6c3ViRGF0YShDb250ZXh0ICpyc2MsIHVpbnQzMl90IHhvZmYsIHVpbnQzMl90IHlvZmYsIHVpbnQzMl90IHpvZmYsCiAgICAgICAgICAgICAgdWludDMyX3QgdywgdWludDMyX3QgaCwgdWludDMyX3QgZCwgY29uc3Qgdm9pZCAqZGF0YSwgdWludDMyX3Qgc2l6ZUJ5dGVzKQogewogfQogCit2b2lkIEFsbG9jYXRpb246OnN1YkVsZW1lbnREYXRhKENvbnRleHQgKnJzYywgdWludDMyX3QgeCwgY29uc3Qgdm9pZCAqZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgY0lkeCwgdWludDMyX3Qgc2l6ZUJ5dGVzKQoreworICAgIHVpbnQzMl90IGVTaXplID0gbVR5cGUtPmdldEVsZW1lbnRTaXplQnl0ZXMoKTsKKyAgICB1aW50OF90ICogcHRyID0gc3RhdGljX2Nhc3Q8dWludDhfdCAqPihtUHRyKTsKKyAgICBwdHIgKz0gZVNpemUgKiB4OworCisgICAgaWYgKGNJZHggPj0gbVR5cGUtPmdldEVsZW1lbnQoKS0+Z2V0RmllbGRDb3VudCgpKSB7CisgICAgICAgIExPR0UoIkVycm9yIEFsbG9jYXRpb246OnN1YkVsZW1lbnREYXRhIGNvbXBvbmVudCAlaSBvdXQgb2YgcmFuZ2UuIiwgY0lkeCk7CisgICAgICAgIHJzYy0+c2V0RXJyb3IoUlNfRVJST1JfQkFEX1ZBTFVFLCAic3ViRWxlbWVudERhdGEgY29tcG9uZW50IG91dCBvZiByYW5nZS4iKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmICh4ID49IG1UeXBlLT5nZXREaW1YKCkpIHsKKyAgICAgICAgTE9HRSgiRXJyb3IgQWxsb2NhdGlvbjo6c3ViRWxlbWVudERhdGEgWCBvZmZzZXQgJWkgb3V0IG9mIHJhbmdlLiIsIHgpOworICAgICAgICByc2MtPnNldEVycm9yKFJTX0VSUk9SX0JBRF9WQUxVRSwgInN1YkVsZW1lbnREYXRhIFggb2Zmc2V0IG91dCBvZiByYW5nZS4iKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGNvbnN0IEVsZW1lbnQgKiBlID0gbVR5cGUtPmdldEVsZW1lbnQoKS0+Z2V0RmllbGQoY0lkeCk7CisgICAgcHRyICs9IG1UeXBlLT5nZXRFbGVtZW50KCktPmdldEZpZWxkT2Zmc2V0Qnl0ZXMoY0lkeCk7CisKKyAgICBpZiAoc2l6ZUJ5dGVzICE9IGUtPmdldFNpemVCeXRlcygpKSB7CisgICAgICAgIExPR0UoIkVycm9yIEFsbG9jYXRpb246OnN1YkVsZW1lbnREYXRhIGRhdGEgc2l6ZSAlaSBkb2VzIG5vdCBtYXRjaCBmaWVsZCBzaXplICVpLiIsIHNpemVCeXRlcywgZS0+Z2V0U2l6ZUJ5dGVzKCkpOworICAgICAgICByc2MtPnNldEVycm9yKFJTX0VSUk9SX0JBRF9WQUxVRSwgInN1YkVsZW1lbnREYXRhIGJhZCBzaXplLiIpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKGUtPmdldEhhc1JlZmVyZW5jZXMoKSkgeworICAgICAgICBlLT5pbmNSZWZzKGRhdGEpOworICAgICAgICBlLT5kZWNSZWZzKHB0cik7CisgICAgfQorCisgICAgbWVtY3B5KHB0ciwgZGF0YSwgc2l6ZUJ5dGVzKTsKKyAgICBzZW5kRGlydHkoKTsKKyAgICBtVXBsb2FkRGVmZXJlZCA9IHRydWU7Cit9CisKK3ZvaWQgQWxsb2NhdGlvbjo6c3ViRWxlbWVudERhdGEoQ29udGV4dCAqcnNjLCB1aW50MzJfdCB4LCB1aW50MzJfdCB5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkICpkYXRhLCB1aW50MzJfdCBjSWR4LCB1aW50MzJfdCBzaXplQnl0ZXMpCit7CisgICAgdWludDMyX3QgZVNpemUgPSBtVHlwZS0+Z2V0RWxlbWVudFNpemVCeXRlcygpOworICAgIHVpbnQ4X3QgKiBwdHIgPSBzdGF0aWNfY2FzdDx1aW50OF90ICo+KG1QdHIpOworICAgIHB0ciArPSBlU2l6ZSAqICh4ICsgeSAqIG1UeXBlLT5nZXREaW1YKCkpOworCisgICAgaWYgKHggPj0gbVR5cGUtPmdldERpbVgoKSkgeworICAgICAgICBMT0dFKCJFcnJvciBBbGxvY2F0aW9uOjpzdWJFbGVtZW50RGF0YSBYIG9mZnNldCAlaSBvdXQgb2YgcmFuZ2UuIiwgeCk7CisgICAgICAgIHJzYy0+c2V0RXJyb3IoUlNfRVJST1JfQkFEX1ZBTFVFLCAic3ViRWxlbWVudERhdGEgWCBvZmZzZXQgb3V0IG9mIHJhbmdlLiIpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKHkgPj0gbVR5cGUtPmdldERpbVkoKSkgeworICAgICAgICBMT0dFKCJFcnJvciBBbGxvY2F0aW9uOjpzdWJFbGVtZW50RGF0YSBYIG9mZnNldCAlaSBvdXQgb2YgcmFuZ2UuIiwgeCk7CisgICAgICAgIHJzYy0+c2V0RXJyb3IoUlNfRVJST1JfQkFEX1ZBTFVFLCAic3ViRWxlbWVudERhdGEgWCBvZmZzZXQgb3V0IG9mIHJhbmdlLiIpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKGNJZHggPj0gbVR5cGUtPmdldEVsZW1lbnQoKS0+Z2V0RmllbGRDb3VudCgpKSB7CisgICAgICAgIExPR0UoIkVycm9yIEFsbG9jYXRpb246OnN1YkVsZW1lbnREYXRhIGNvbXBvbmVudCAlaSBvdXQgb2YgcmFuZ2UuIiwgY0lkeCk7CisgICAgICAgIHJzYy0+c2V0RXJyb3IoUlNfRVJST1JfQkFEX1ZBTFVFLCAic3ViRWxlbWVudERhdGEgY29tcG9uZW50IG91dCBvZiByYW5nZS4iKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGNvbnN0IEVsZW1lbnQgKiBlID0gbVR5cGUtPmdldEVsZW1lbnQoKS0+Z2V0RmllbGQoY0lkeCk7CisgICAgcHRyICs9IG1UeXBlLT5nZXRFbGVtZW50KCktPmdldEZpZWxkT2Zmc2V0Qnl0ZXMoY0lkeCk7CisKKyAgICBpZiAoc2l6ZUJ5dGVzICE9IGUtPmdldFNpemVCeXRlcygpKSB7CisgICAgICAgIExPR0UoIkVycm9yIEFsbG9jYXRpb246OnN1YkVsZW1lbnREYXRhIGRhdGEgc2l6ZSAlaSBkb2VzIG5vdCBtYXRjaCBmaWVsZCBzaXplICVpLiIsIHNpemVCeXRlcywgZS0+Z2V0U2l6ZUJ5dGVzKCkpOworICAgICAgICByc2MtPnNldEVycm9yKFJTX0VSUk9SX0JBRF9WQUxVRSwgInN1YkVsZW1lbnREYXRhIGJhZCBzaXplLiIpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKGUtPmdldEhhc1JlZmVyZW5jZXMoKSkgeworICAgICAgICBlLT5pbmNSZWZzKGRhdGEpOworICAgICAgICBlLT5kZWNSZWZzKHB0cik7CisgICAgfQorCisgICAgbWVtY3B5KHB0ciwgZGF0YSwgc2l6ZUJ5dGVzKTsKKyAgICBzZW5kRGlydHkoKTsKKyAgICBtVXBsb2FkRGVmZXJlZCA9IHRydWU7Cit9CisKIHZvaWQgQWxsb2NhdGlvbjo6YWRkUHJvZ3JhbVRvRGlydHkoY29uc3QgUHJvZ3JhbSAqcCkKIHsKLSAgICBtVG9EaXJ0eUxpc3QuYWRkKHApOworICAgIG1Ub0RpcnR5TGlzdC5wdXNoKHApOwogfQogCiB2b2lkIEFsbG9jYXRpb246OnJlbW92ZVByb2dyYW1Ub0RpcnR5KGNvbnN0IFByb2dyYW0gKnApCkBAIC0zMTYsNiArNDI3LDYxIEBACiAKIH0KIAordm9pZCBBbGxvY2F0aW9uOjpzZXJpYWxpemUoT1N0cmVhbSAqc3RyZWFtKSBjb25zdAoreworICAgIC8vIE5lZWQgdG8gaWRlbnRpZnkgb3Vyc2VsdmVzCisgICAgc3RyZWFtLT5hZGRVMzIoKHVpbnQzMl90KWdldENsYXNzSWQoKSk7CisKKyAgICBTdHJpbmc4IG5hbWUoZ2V0TmFtZSgpKTsKKyAgICBzdHJlYW0tPmFkZFN0cmluZygmbmFtZSk7CisKKyAgICAvLyBGaXJzdCB0aGluZyB3ZSBuZWVkIHRvIHNlcmlhbGl6ZSBpcyB0aGUgdHlwZSBvYmplY3Qgc2luY2UgaXQgd2lsbCBiZSBuZWVkZWQKKyAgICAvLyB0byBpbml0aWFsaXplIHRoZSBjbGFzcworICAgIG1UeXBlLT5zZXJpYWxpemUoc3RyZWFtKTsKKworICAgIHVpbnQzMl90IGRhdGFTaXplID0gbVR5cGUtPmdldFNpemVCeXRlcygpOworICAgIC8vIFdyaXRlIGhvdyBtdWNoIGRhdGEgd2UgYXJlIHN0b3JpbmcKKyAgICBzdHJlYW0tPmFkZFUzMihkYXRhU2l6ZSk7CisgICAgLy8gTm93IHdyaXRlIHRoZSBkYXRhCisgICAgc3RyZWFtLT5hZGRCeXRlQXJyYXkobVB0ciwgZGF0YVNpemUpOworfQorCitBbGxvY2F0aW9uICpBbGxvY2F0aW9uOjpjcmVhdGVGcm9tU3RyZWFtKENvbnRleHQgKnJzYywgSVN0cmVhbSAqc3RyZWFtKQoreworICAgIC8vIEZpcnN0IG1ha2Ugc3VyZSB3ZSBhcmUgcmVhZGluZyB0aGUgY29ycmVjdCBvYmplY3QKKyAgICBSc0EzRENsYXNzSUQgY2xhc3NJRCA9IChSc0EzRENsYXNzSUQpc3RyZWFtLT5sb2FkVTMyKCk7CisgICAgaWYoY2xhc3NJRCAhPSBSU19BM0RfQ0xBU1NfSURfQUxMT0NBVElPTikgeworICAgICAgICBMT0dFKCJhbGxvY2F0aW9uIGxvYWRpbmcgc2tpcHBlZCBkdWUgdG8gaW52YWxpZCBjbGFzcyBpZFxuIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIFN0cmluZzggbmFtZTsKKyAgICBzdHJlYW0tPmxvYWRTdHJpbmcoJm5hbWUpOworCisgICAgVHlwZSAqdHlwZSA9IFR5cGU6OmNyZWF0ZUZyb21TdHJlYW0ocnNjLCBzdHJlYW0pOworICAgIGlmKCF0eXBlKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICB0eXBlLT5jb21wdXRlKCk7CisKKyAgICAvLyBOdW1iZXIgb2YgYnl0ZXMgd2Ugd3JvdGUgb3V0IGZvciB0aGlzIGFsbG9jYXRpb24KKyAgICB1aW50MzJfdCBkYXRhU2l6ZSA9IHN0cmVhbS0+bG9hZFUzMigpOworICAgIGlmKGRhdGFTaXplICE9IHR5cGUtPmdldFNpemVCeXRlcygpKSB7CisgICAgICAgIExPR0UoImZhaWxlZCB0byByZWFkIGFsbG9jYXRpb24gYmVjYXVzZSBudW1ieXRlcyB3cml0dGVuIGlzIG5vdCB0aGUgc2FtZSBsb2FkZWQgdHlwZSB3YW50c1xuIik7CisgICAgICAgIGRlbGV0ZSB0eXBlOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBBbGxvY2F0aW9uICphbGxvYyA9IG5ldyBBbGxvY2F0aW9uKHJzYywgdHlwZSk7CisgICAgYWxsb2MtPnNldE5hbWUobmFtZS5zdHJpbmcoKSwgbmFtZS5zaXplKCkpOworCisgICAgLy8gUmVhZCBpbiBhbGwgb2Ygb3VyIGFsbG9jYXRpb24gZGF0YQorICAgIGFsbG9jLT5kYXRhKHJzYywgc3RyZWFtLT5nZXRQdHIoKSArIHN0cmVhbS0+Z2V0UG9zKCksIGRhdGFTaXplKTsKKyAgICBzdHJlYW0tPnJlc2V0KHN0cmVhbS0+Z2V0UG9zKCkgKyBkYXRhU2l6ZSk7CisKKyAgICByZXR1cm4gYWxsb2M7Cit9CisKIHZvaWQgQWxsb2NhdGlvbjo6c2VuZERpcnR5KCkgY29uc3QKIHsKICAgICBmb3IgKHNpemVfdCBjdD0wOyBjdCA8IG1Ub0RpcnR5TGlzdC5zaXplKCk7IGN0KyspIHsKQEAgLTMyMyw2ICs0ODksMzIgQEAKICAgICB9CiB9CiAKK3ZvaWQgQWxsb2NhdGlvbjo6aW5jUmVmcyhjb25zdCB2b2lkICpwdHIsIHNpemVfdCBjdCkgY29uc3QKK3sKKyAgICBjb25zdCB1aW50OF90ICpwID0gc3RhdGljX2Nhc3Q8Y29uc3QgdWludDhfdCAqPihwdHIpOworICAgIGNvbnN0IEVsZW1lbnQgKmUgPSBtVHlwZS0+Z2V0RWxlbWVudCgpOworICAgIHVpbnQzMl90IHN0cmlkZSA9IGUtPmdldFNpemVCeXRlcygpOworCisgICAgd2hpbGUgKGN0ID4gMCkgeworICAgICAgICBlLT5pbmNSZWZzKHApOworICAgICAgICBjdCAtLTsKKyAgICAgICAgcCArPSBzdHJpZGU7CisgICAgfQorfQorCit2b2lkIEFsbG9jYXRpb246OmRlY1JlZnMoY29uc3Qgdm9pZCAqcHRyLCBzaXplX3QgY3QpIGNvbnN0Cit7CisgICAgY29uc3QgdWludDhfdCAqcCA9IHN0YXRpY19jYXN0PGNvbnN0IHVpbnQ4X3QgKj4ocHRyKTsKKyAgICBjb25zdCBFbGVtZW50ICplID0gbVR5cGUtPmdldEVsZW1lbnQoKTsKKyAgICB1aW50MzJfdCBzdHJpZGUgPSBlLT5nZXRTaXplQnl0ZXMoKTsKKworICAgIHdoaWxlIChjdCA+IDApIHsKKyAgICAgICAgZS0+ZGVjUmVmcyhwKTsKKyAgICAgICAgY3QgLS07CisgICAgICAgIHAgKz0gc3RyaWRlOworICAgIH0KK30KKwogLy8vLy8vLy8vLy8vLy8vLy8KIC8vCiAKQEAgLTQ5NSw3ICs2ODcsNyBAQAogICAgIGlmIChzcmNHTFR5cGUgPT0gR0xfVU5TSUdORURfQllURSAmJgogICAgICAgICBzcmNHTEZtdCA9PSBHTF9SR0IgJiYKICAgICAgICAgZHN0R0xUeXBlID09IEdMX1VOU0lHTkVEX1NIT1JUXzVfNl81ICYmCi0gICAgICAgIGRzdEdMVHlwZSA9PSBHTF9SR0IpIHsKKyAgICAgICAgZHN0R0xGbXQgPT0gR0xfUkdCKSB7CiAKICAgICAgICAgcmV0dXJuIGVsZW1lbnRDb252ZXJ0ZXJfODg4X3RvXzU2NTsKICAgICB9CkBAIC01MDMsMTUgKzY5NSwyMSBAQAogICAgIGlmIChzcmNHTFR5cGUgPT0gR0xfVU5TSUdORURfQllURSAmJgogICAgICAgICBzcmNHTEZtdCA9PSBHTF9SR0JBICYmCiAgICAgICAgIGRzdEdMVHlwZSA9PSBHTF9VTlNJR05FRF9TSE9SVF81XzZfNSAmJgotICAgICAgICBkc3RHTFR5cGUgPT0gR0xfUkdCKSB7CisgICAgICAgIGRzdEdMRm10ID09IEdMX1JHQikgewogCiAgICAgICAgIHJldHVybiBlbGVtZW50Q29udmVydGVyXzg4ODhfdG9fNTY1OwogICAgIH0KIAogICAgIExPR0UoInBpY2tDb252ZXJ0ZXIsIHVuc3Vwb3J0ZWQgY29tYm8sIHNyYyAlcCwgIGRzdCAlcCIsIHNyYywgZHN0KTsKKyAgICBMT0dFKCJwaWNrQ29udmVydGVyLCBzcmNHTFR5cGUgPSAleCwgIHNyY0dMRm10ID0gJXgiLCBzcmNHTFR5cGUsIHNyY0dMRm10KTsKKyAgICBMT0dFKCJwaWNrQ29udmVydGVyLCBkc3RHTFR5cGUgPSAleCwgIGRzdEdMRm10ID0gJXgiLCBkc3RHTFR5cGUsIGRzdEdMRm10KTsKKyAgICBzcmMtPmR1bXBMT0dWKCJTUkMgIik7CisgICAgZHN0LT5kdW1wTE9HVigiRFNUICIpOwogICAgIHJldHVybiAwOwogfQogCisjaWZuZGVmIEFORFJPSURfUlNfQlVJTERfRk9SX0hPU1QKKwogUnNBbGxvY2F0aW9uIHJzaV9BbGxvY2F0aW9uQ3JlYXRlQml0bWFwUmVmKENvbnRleHQgKnJzYywgUnNUeXBlIHZ0eXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmJtcCwgdm9pZCAqY2FsbGJhY2tEYXRhLCBSc0JpdG1hcENhbGxiYWNrX3QgY2FsbGJhY2spCiB7CkBAIC01NDYsMTYgKzc0NCwxOSBAQAogICAgIH0KIAogICAgIEVsZW1lbnRDb252ZXJ0ZXJfdCBjdnQgPSBwaWNrQ29udmVydGVyKGRzdCwgc3JjKTsKLSAgICBjdnQodGV4QWxsb2MtPmdldFB0cigpLCBkYXRhLCB3ICogaCk7Ci0KLSAgICBpZiAoZ2VuTWlwcykgewotICAgICAgICBBZGFwdGVyMkQgYWRhcHQocnNjLCB0ZXhBbGxvYyk7Ci0gICAgICAgIEFkYXB0ZXIyRCBhZGFwdDIocnNjLCB0ZXhBbGxvYyk7Ci0gICAgICAgIGZvcih1aW50MzJfdCBsb2Q9MDsgbG9kIDwgKHRleEFsbG9jLT5nZXRUeXBlKCktPmdldExPRENvdW50KCkgLTEpOyBsb2QrKykgewotICAgICAgICAgICAgYWRhcHQuc2V0TE9EKGxvZCk7Ci0gICAgICAgICAgICBhZGFwdDIuc2V0TE9EKGxvZCArIDEpOwotICAgICAgICAgICAgbWlwKGFkYXB0MiwgYWRhcHQpOworICAgIGlmIChjdnQpIHsKKyAgICAgICAgY3Z0KHRleEFsbG9jLT5nZXRQdHIoKSwgZGF0YSwgdyAqIGgpOworICAgICAgICBpZiAoZ2VuTWlwcykgeworICAgICAgICAgICAgQWRhcHRlcjJEIGFkYXB0KHJzYywgdGV4QWxsb2MpOworICAgICAgICAgICAgQWRhcHRlcjJEIGFkYXB0Mihyc2MsIHRleEFsbG9jKTsKKyAgICAgICAgICAgIGZvcih1aW50MzJfdCBsb2Q9MDsgbG9kIDwgKHRleEFsbG9jLT5nZXRUeXBlKCktPmdldExPRENvdW50KCkgLTEpOyBsb2QrKykgeworICAgICAgICAgICAgICAgIGFkYXB0LnNldExPRChsb2QpOworICAgICAgICAgICAgICAgIGFkYXB0Mi5zZXRMT0QobG9kICsgMSk7CisgICAgICAgICAgICAgICAgbWlwKGFkYXB0MiwgYWRhcHQpOworICAgICAgICAgICAgfQogICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgcnNjLT5zZXRFcnJvcihSU19FUlJPUl9CQURfVkFMVUUsICJVbnN1cHBvcnRlZCBiaXRtYXAgZm9ybWF0Iik7CiAgICAgfQogCiAgICAgcmV0dXJuIHRleEFsbG9jOwpAQCAtNTkyLDE5ICs3OTMsMzEgQEAKIHZvaWQgcnNpX0FsbG9jYXRpb25EYXRhKENvbnRleHQgKnJzYywgUnNBbGxvY2F0aW9uIHZhLCBjb25zdCB2b2lkICpkYXRhLCB1aW50MzJfdCBzaXplQnl0ZXMpCiB7CiAgICAgQWxsb2NhdGlvbiAqYSA9IHN0YXRpY19jYXN0PEFsbG9jYXRpb24gKj4odmEpOwotICAgIGEtPmRhdGEoZGF0YSwgc2l6ZUJ5dGVzKTsKKyAgICBhLT5kYXRhKHJzYywgZGF0YSwgc2l6ZUJ5dGVzKTsKIH0KIAogdm9pZCByc2lfQWxsb2NhdGlvbjFEU3ViRGF0YShDb250ZXh0ICpyc2MsIFJzQWxsb2NhdGlvbiB2YSwgdWludDMyX3QgeG9mZiwgdWludDMyX3QgY291bnQsIGNvbnN0IHZvaWQgKmRhdGEsIHVpbnQzMl90IHNpemVCeXRlcykKIHsKICAgICBBbGxvY2F0aW9uICphID0gc3RhdGljX2Nhc3Q8QWxsb2NhdGlvbiAqPih2YSk7Ci0gICAgYS0+c3ViRGF0YSh4b2ZmLCBjb3VudCwgZGF0YSwgc2l6ZUJ5dGVzKTsKKyAgICBhLT5zdWJEYXRhKHJzYywgeG9mZiwgY291bnQsIGRhdGEsIHNpemVCeXRlcyk7Cit9CisKK3ZvaWQgcnNpX0FsbG9jYXRpb24yRFN1YkVsZW1lbnREYXRhKENvbnRleHQgKnJzYywgUnNBbGxvY2F0aW9uIHZhLCB1aW50MzJfdCB4LCB1aW50MzJfdCB5LCBjb25zdCB2b2lkICpkYXRhLCB1aW50MzJfdCBlb2ZmLCB1aW50MzJfdCBzaXplQnl0ZXMpCit7CisgICAgQWxsb2NhdGlvbiAqYSA9IHN0YXRpY19jYXN0PEFsbG9jYXRpb24gKj4odmEpOworICAgIGEtPnN1YkVsZW1lbnREYXRhKHJzYywgeCwgeSwgZGF0YSwgZW9mZiwgc2l6ZUJ5dGVzKTsKK30KKwordm9pZCByc2lfQWxsb2NhdGlvbjFEU3ViRWxlbWVudERhdGEoQ29udGV4dCAqcnNjLCBSc0FsbG9jYXRpb24gdmEsIHVpbnQzMl90IHgsIGNvbnN0IHZvaWQgKmRhdGEsIHVpbnQzMl90IGVvZmYsIHVpbnQzMl90IHNpemVCeXRlcykKK3sKKyAgICBBbGxvY2F0aW9uICphID0gc3RhdGljX2Nhc3Q8QWxsb2NhdGlvbiAqPih2YSk7CisgICAgYS0+c3ViRWxlbWVudERhdGEocnNjLCB4LCBkYXRhLCBlb2ZmLCBzaXplQnl0ZXMpOwogfQogCiB2b2lkIHJzaV9BbGxvY2F0aW9uMkRTdWJEYXRhKENvbnRleHQgKnJzYywgUnNBbGxvY2F0aW9uIHZhLCB1aW50MzJfdCB4b2ZmLCB1aW50MzJfdCB5b2ZmLCB1aW50MzJfdCB3LCB1aW50MzJfdCBoLCBjb25zdCB2b2lkICpkYXRhLCB1aW50MzJfdCBzaXplQnl0ZXMpCiB7CiAgICAgQWxsb2NhdGlvbiAqYSA9IHN0YXRpY19jYXN0PEFsbG9jYXRpb24gKj4odmEpOwotICAgIGEtPnN1YkRhdGEoeG9mZiwgeW9mZiwgdywgaCwgZGF0YSwgc2l6ZUJ5dGVzKTsKKyAgICBhLT5zdWJEYXRhKHJzYywgeG9mZiwgeW9mZiwgdywgaCwgZGF0YSwgc2l6ZUJ5dGVzKTsKIH0KIAogdm9pZCByc2lfQWxsb2NhdGlvblJlYWQoQ29udGV4dCAqcnNjLCBSc0FsbG9jYXRpb24gdmEsIHZvaWQgKmRhdGEpCkBAIC02MTMsNiArODI2LDE1IEBACiAgICAgYS0+cmVhZChkYXRhKTsKIH0KIAorY29uc3Qgdm9pZCogcnNpX0FsbG9jYXRpb25HZXRUeXBlKENvbnRleHQgKnJzYywgUnNBbGxvY2F0aW9uIHZhKQoreworICAgIEFsbG9jYXRpb24gKmEgPSBzdGF0aWNfY2FzdDxBbGxvY2F0aW9uICo+KHZhKTsKKyAgICBhLT5nZXRUeXBlKCktPmluY1VzZXJSZWYoKTsKKworICAgIHJldHVybiBhLT5nZXRUeXBlKCk7Cit9CisKKyNlbmRpZiAvL0FORFJPSURfUlNfQlVJTERfRk9SX0hPU1QKIAogfQogfQpkaWZmIC0tZ2l0IGEvbGlicy9ycy9yc0FsbG9jYXRpb24uaCBiL2xpYnMvcnMvcnNBbGxvY2F0aW9uLmgKaW5kZXggNTE2ZjhiNy4uYjZiNWQyZiAxMDA2NDQKLS0tIGEvbGlicy9ycy9yc0FsbG9jYXRpb24uaAorKysgYi9saWJzL3JzL3JzQWxsb2NhdGlvbi5oCkBAIC01NiwxMyArNTYsMTggQEAKICAgICB1aW50MzJfdCBnZXRCdWZmZXJPYmplY3RJRCgpIGNvbnN0IHtyZXR1cm4gbUJ1ZmZlcklEO30KIAogCi0gICAgdm9pZCBkYXRhKGNvbnN0IHZvaWQgKmRhdGEsIHVpbnQzMl90IHNpemVCeXRlcyk7Ci0gICAgdm9pZCBzdWJEYXRhKHVpbnQzMl90IHhvZmYsIHVpbnQzMl90IGNvdW50LCBjb25zdCB2b2lkICpkYXRhLCB1aW50MzJfdCBzaXplQnl0ZXMpOwotICAgIHZvaWQgc3ViRGF0YSh1aW50MzJfdCB4b2ZmLCB1aW50MzJfdCB5b2ZmLAorICAgIHZvaWQgZGF0YShDb250ZXh0ICpyc2MsIGNvbnN0IHZvaWQgKmRhdGEsIHVpbnQzMl90IHNpemVCeXRlcyk7CisgICAgdm9pZCBzdWJEYXRhKENvbnRleHQgKnJzYywgdWludDMyX3QgeG9mZiwgdWludDMyX3QgY291bnQsIGNvbnN0IHZvaWQgKmRhdGEsIHVpbnQzMl90IHNpemVCeXRlcyk7CisgICAgdm9pZCBzdWJEYXRhKENvbnRleHQgKnJzYywgdWludDMyX3QgeG9mZiwgdWludDMyX3QgeW9mZiwKICAgICAgICAgICAgICAgICAgdWludDMyX3QgdywgdWludDMyX3QgaCwgY29uc3Qgdm9pZCAqZGF0YSwgdWludDMyX3Qgc2l6ZUJ5dGVzKTsKLSAgICB2b2lkIHN1YkRhdGEodWludDMyX3QgeG9mZiwgdWludDMyX3QgeW9mZiwgdWludDMyX3Qgem9mZiwKKyAgICB2b2lkIHN1YkRhdGEoQ29udGV4dCAqcnNjLCB1aW50MzJfdCB4b2ZmLCB1aW50MzJfdCB5b2ZmLCB1aW50MzJfdCB6b2ZmLAogICAgICAgICAgICAgICAgICB1aW50MzJfdCB3LCB1aW50MzJfdCBoLCB1aW50MzJfdCBkLCBjb25zdCB2b2lkICpkYXRhLCB1aW50MzJfdCBzaXplQnl0ZXMpOwogCisgICAgdm9pZCBzdWJFbGVtZW50RGF0YShDb250ZXh0ICpyc2MsIHVpbnQzMl90IHgsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkICpkYXRhLCB1aW50MzJfdCBlbGVtZW50T2ZmLCB1aW50MzJfdCBzaXplQnl0ZXMpOworICAgIHZvaWQgc3ViRWxlbWVudERhdGEoQ29udGV4dCAqcnNjLCB1aW50MzJfdCB4LCB1aW50MzJfdCB5LAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCAqZGF0YSwgdWludDMyX3QgZWxlbWVudE9mZiwgdWludDMyX3Qgc2l6ZUJ5dGVzKTsKKwogICAgIHZvaWQgcmVhZCh2b2lkICpkYXRhKTsKIAogICAgIHZvaWQgZW5hYmxlR0xWZXJ0ZXhCdWZmZXJzKCkgY29uc3Q7CkBAIC03MiwxMiArNzcsMjEgQEAKICAgICB2b2lkIHJlbW92ZVByb2dyYW1Ub0RpcnR5KGNvbnN0IFByb2dyYW0gKik7CiAKICAgICB2aXJ0dWFsIHZvaWQgZHVtcExPR1YoY29uc3QgY2hhciAqcHJlZml4KSBjb25zdDsKKyAgICB2aXJ0dWFsIHZvaWQgc2VyaWFsaXplKE9TdHJlYW0gKnN0cmVhbSkgY29uc3Q7CisgICAgdmlydHVhbCBSc0EzRENsYXNzSUQgZ2V0Q2xhc3NJZCgpIGNvbnN0IHsgcmV0dXJuIFJTX0EzRF9DTEFTU19JRF9BTExPQ0FUSU9OOyB9CisgICAgc3RhdGljIEFsbG9jYXRpb24gKmNyZWF0ZUZyb21TdHJlYW0oQ29udGV4dCAqcnNjLCBJU3RyZWFtICpzdHJlYW0pOwogCiAgICAgdmlydHVhbCB2b2lkIHVwbG9hZENoZWNrKGNvbnN0IENvbnRleHQgKnJzYyk7CiAKLXByb3RlY3RlZDoKKyAgICBib29sIGdldElzVGV4dHVyZSgpIGNvbnN0IHtyZXR1cm4gbUlzVGV4dHVyZTt9CisgICAgYm9vbCBnZXRJc0J1ZmZlck9iamVjdCgpIGNvbnN0IHtyZXR1cm4gbUlzVmVydGV4QnVmZmVyO30KKworICAgIHZvaWQgaW5jUmVmcyhjb25zdCB2b2lkICpwdHIsIHNpemVfdCBjdCkgY29uc3Q7CisgICAgdm9pZCBkZWNSZWZzKGNvbnN0IHZvaWQgKnB0ciwgc2l6ZV90IGN0KSBjb25zdDsKKwogICAgIHZvaWQgc2VuZERpcnR5KCkgY29uc3Q7CiAKK3Byb3RlY3RlZDoKICAgICBPYmplY3RCYXNlUmVmPGNvbnN0IFR5cGU+IG1UeXBlOwogICAgIHZvaWQgKiBtUHRyOwogCmRpZmYgLS1naXQgYS9saWJzL3JzL3JzQW5pbWF0aW9uLmNwcCBiL2xpYnMvcnMvcnNBbmltYXRpb24uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYyMDA3MTUKLS0tIC9kZXYvbnVsbAorKysgYi9saWJzL3JzL3JzQW5pbWF0aW9uLmNwcApAQCAtMCwwICsxLDE0OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9SU19CVUlMRF9GT1JfSE9TVAorI2luY2x1ZGUgInJzQ29udGV4dC5oIgorI2Vsc2UKKyNpbmNsdWRlICJyc0NvbnRleHRIb3N0U3R1Yi5oIgorI2VuZGlmIC8vQU5EUk9JRF9SU19CVUlMRF9GT1JfSE9TVAorCisjaW5jbHVkZSAicnNBbmltYXRpb24uaCIKKworCit1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKK3VzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOjpyZW5kZXJzY3JpcHQ7CisKK3ZvaWQgQW5pbWF0aW9uOjpzZXJpYWxpemUoT1N0cmVhbSAqc3RyZWFtKSBjb25zdAoreworICAgIAorfQorCitBbmltYXRpb24gKkFuaW1hdGlvbjo6Y3JlYXRlRnJvbVN0cmVhbShDb250ZXh0ICpyc2MsIElTdHJlYW0gKnN0cmVhbSkKK3sKKyAgICByZXR1cm4gTlVMTDsKK30KKworLyoKK0FuaW1hdGlvbjo6QW5pbWF0aW9uKENvbnRleHQgKnJzYykgOiBPYmplY3RCYXNlKHJzYykKK3sKKyAgICBtQWxsb2NGaWxlID0gX19GSUxFX187CisgICAgbUFsbG9jTGluZSA9IF9fTElORV9fOworCisgICAgbVZhbHVlc0lucHV0ID0gTlVMTDsKKyAgICBtVmFsdWVzT3V0cHV0ID0gTlVMTDsKKyAgICBtVmFsdWVDb3VudCA9IDA7CisgICAgbUludGVycG9sYXRpb24gPSBSU19BTklNQVRJT05fSU5URVJQT0xBVElPTl9TVEVQOworICAgIG1FZGdlUHJlID0gUlNfQU5JTUFUSU9OX0VER0VfVU5ERUZJTkVEOworICAgIG1FZGdlUG9zdCA9IFJTX0FOSU1BVElPTl9FREdFX1VOREVGSU5FRDsKKyAgICBtSW5wdXRNaW4gPSAwOworICAgIG1JbnB1dE1heCA9IDA7Cit9CisKK0FuaW1hdGlvbiAqIEFuaW1hdGlvbjo6Y3JlYXRlKENvbnRleHQgKnJzYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0ICppblZhbHVlcywgY29uc3QgZmxvYXQgKm91dFZhbHVlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHZhbHVlQ291bnQsIFJzQW5pbWF0aW9uSW50ZXJwb2xhdGlvbiBpbnRlcnAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSc0FuaW1hdGlvbkVkZ2UgcHJlLCBSc0FuaW1hdGlvbkVkZ2UgcG9zdCkKK3sKKyAgICBpZiAodmFsdWVDb3VudCA8IDIpIHsKKyAgICAgICAgcnNjLT5zZXRFcnJvcihSU19FUlJPUl9CQURfVkFMVUUsICJBbmltYXRpb25zIHJlcXVpcmUgbW9yZSB0aGFuIDIgdmFsdWVzLiIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgQW5pbWF0aW9uICphID0gbmV3IEFuaW1hdGlvbihyc2MpOworICAgIGlmICghYSkgeworICAgICAgICByc2MtPnNldEVycm9yKFJTX0VSUk9SX09VVF9PRl9NRU1PUlkpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBmbG9hdCAqdmluID0gKGZsb2F0ICopbWFsbG9jKHZhbHVlQ291bnQgKiBzaXplb2YoZmxvYXQpKTsKKyAgICBmbG9hdCAqdm91dCA9IChmbG9hdCAqKW1hbGxvYyh2YWx1ZUNvdW50ICogc2l6ZW9mKGZsb2F0KSk7CisgICAgYS0+bVZhbHVlc0lucHV0ID0gdmluOworICAgIGEtPm1WYWx1ZXNPdXRwdXQgPSB2b3V0OworICAgIGlmIChhLT5tVmFsdWVzSW5wdXQgPT0gTlVMTCB8fCBhLT5tVmFsdWVzT3V0cHV0ID09IE5VTEwpIHsKKyAgICAgICAgZGVsZXRlIGE7CisgICAgICAgIHJzYy0+c2V0RXJyb3IoUlNfRVJST1JfT1VUX09GX01FTU9SWSk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIGEtPm1FZGdlUHJlID0gcHJlOworICAgIGEtPm1FZGdlUG9zdCA9IHBvc3Q7CisgICAgYS0+bUludGVycG9sYXRpb24gPSBpbnRlcnA7CisgICAgYS0+bVZhbHVlQ291bnQgPSB2YWx1ZUNvdW50OworCisgICAgbWVtY3B5KHZpbiwgaW5WYWx1ZXMsIHZhbHVlQ291bnQgKiBzaXplb2YoZmxvYXQpKTsKKyAgICBtZW1jcHkodm91dCwgb3V0VmFsdWVzLCB2YWx1ZUNvdW50ICogc2l6ZW9mKGZsb2F0KSk7CisgICAgYS0+bUlucHV0TWluID0gaW5WYWx1ZXNbMF07CisgICAgYS0+bUlucHV0TWF4ID0gaW5WYWx1ZXNbMF07CisKKyAgICBib29sIG5lZWRTb3J0ID0gZmFsc2U7CisgICAgZm9yICh1aW50MzJfdCBjdD0xOyBjdCA8IHZhbHVlQ291bnQ7IGN0KyspIHsKKyAgICAgICAgaWYgKGEtPm1JbnB1dE1pbiA+IHZpbltjdF0pIHsKKyAgICAgICAgICAgIG5lZWRTb3J0ID0gdHJ1ZTsKKyAgICAgICAgICAgIGEtPm1JbnB1dE1pbiA9IHZpbltjdF07CisgICAgICAgIH0KKyAgICAgICAgaWYgKGEtPm1JbnB1dE1heCA8IHZpbltjdF0pIHsKKyAgICAgICAgICAgIGEtPm1JbnB1dE1heCA9IHZpbltjdF07CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBuZWVkU29ydCA9IHRydWU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICB3aGlsZSAoMSkgeworICAgICAgICBib29sIGNoYW5nZWQgPSBmYWxzZTsKKyAgICAgICAgZm9yICh1aW50MzJfdCBjdD0xOyBjdCA8IHZhbHVlQ291bnQ7IGN0KyspIHsKKyAgICAgICAgICAgIGlmICh2aW5bY3QtMV0gPiB2aW5bY3RdKSB7CisgICAgICAgICAgICAgICAgZmxvYXQgdCA9IHZpbltjdC0xXTsKKyAgICAgICAgICAgICAgICB2aW5bY3QtMV0gPSB2aW5bY3RdOworICAgICAgICAgICAgICAgIHZpbltjdF0gPSB0OworICAgICAgICAgICAgICAgIHQgPSB2b3V0W2N0LTFdOworICAgICAgICAgICAgICAgIHZvdXRbY3QtMV0gPSB2b3V0W2N0XTsKKyAgICAgICAgICAgICAgICB2b3V0W2N0XSA9IHQ7CisgICAgICAgICAgICAgICAgY2hhbmdlZCA9IHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFjaGFuZ2VkKSBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gYTsKK30KKyovCisKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSByZW5kZXJzY3JpcHQgeworCitSc0FuaW1hdGlvbiByc2lfQW5pbWF0aW9uQ3JlYXRlKENvbnRleHQgKnJzYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQgKmluVmFsdWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmbG9hdCAqb3V0VmFsdWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCB2YWx1ZUNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSc0FuaW1hdGlvbkludGVycG9sYXRpb24gaW50ZXJwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSc0FuaW1hdGlvbkVkZ2UgcHJlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSc0FuaW1hdGlvbkVkZ2UgcG9zdCkKK3sKKyAgICAvL0xPR0UoInJzaV9FbGVtZW50Q3JlYXRlICVpICVpICVpICVpIiwgZHQsIGRrLCBub3JtLCB2ZWNTaXplKTsKKyAgICBBbmltYXRpb24gKmEgPSBOVUxMOy8vQW5pbWF0aW9uOjpjcmVhdGUocnNjLCBpblZhbHVlcywgb3V0VmFsdWVzLCB2YWx1ZUNvdW50LCBpbnRlcnAsIHByZSwgcG9zdCk7CisgICAgaWYgKGEgIT0gTlVMTCkgeworICAgICAgICBhLT5pbmNVc2VyUmVmKCk7CisgICAgfQorICAgIHJldHVybiAoUnNBbmltYXRpb24pYTsKK30KKworCit9Cit9CisKZGlmZiAtLWdpdCBhL2xpYnMvcnMvcnNBbmltYXRpb24uaCBiL2xpYnMvcnMvcnNBbmltYXRpb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNDAzMTRlCi0tLSAvZGV2L251bGwKKysrIGIvbGlicy9ycy9yc0FuaW1hdGlvbi5oCkBAIC0wLDAgKzEsNzEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfUlNfQU5JTUFUSU9OX0gKKyNkZWZpbmUgQU5EUk9JRF9SU19BTklNQVRJT05fSAorCisjaW5jbHVkZSAicnNVdGlscy5oIgorI2luY2x1ZGUgInJzT2JqZWN0QmFzZS5oIgorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSByZW5kZXJzY3JpcHQgeworCisKK2NsYXNzIEFuaW1hdGlvbiA6IHB1YmxpYyBPYmplY3RCYXNlCit7CitwdWJsaWM6CisgICAgfkFuaW1hdGlvbigpOworCisgICAgc3RhdGljIEFuaW1hdGlvbiAqIGNyZWF0ZShDb250ZXh0ICpyc2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmbG9hdCAqaW5WYWx1ZXMsIGNvbnN0IGZsb2F0ICpvdXRWYWx1ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCB2YWx1ZUNvdW50LCBSc0FuaW1hdGlvbkludGVycG9sYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSc0FuaW1hdGlvbkVkZ2UgcHJlLCBSc0FuaW1hdGlvbkVkZ2UgcG9zdCk7CisKKyAgICBmbG9hdCBldmFsKGZsb2F0KSBjb25zdDsKKworICAgIHZpcnR1YWwgdm9pZCBzZXJpYWxpemUoT1N0cmVhbSAqc3RyZWFtKSBjb25zdDsKKyAgICB2aXJ0dWFsIFJzQTNEQ2xhc3NJRCBnZXRDbGFzc0lkKCkgY29uc3QgeyByZXR1cm4gUlNfQTNEX0NMQVNTX0lEX0FOSU1BVElPTjsgfQorICAgIHN0YXRpYyBBbmltYXRpb24gKmNyZWF0ZUZyb21TdHJlYW0oQ29udGV4dCAqcnNjLCBJU3RyZWFtICpzdHJlYW0pOworCitwcm90ZWN0ZWQ6CisgICAgQW5pbWF0aW9uKENvbnRleHQgKnJzYyk7CisKKworCisgICAgZmxvYXQgZXZhbEluUmFuZ2UoZmxvYXQpIGNvbnN0OworCisKKworICAgIGNvbnN0IGZsb2F0ICptVmFsdWVzSW5wdXQ7CisgICAgY29uc3QgZmxvYXQgKm1WYWx1ZXNPdXRwdXQ7CisgICAgdWludDMyX3QgbVZhbHVlQ291bnQ7CisgICAgUnNBbmltYXRpb25JbnRlcnBvbGF0aW9uIG1JbnRlcnBvbGF0aW9uOworICAgIFJzQW5pbWF0aW9uRWRnZSBtRWRnZVByZTsKKyAgICBSc0FuaW1hdGlvbkVkZ2UgbUVkZ2VQb3N0OworCisgICAgLy8gZGVyaXZlZAorICAgIGZsb2F0IG1JbnB1dE1pbjsKKyAgICBmbG9hdCBtSW5wdXRNYXg7Cit9OworCisKKworCit9Cit9CisjZW5kaWYgLy9BTkRST0lEX1NUUlVDVFVSRURfRUxFTUVOVF9ICisKZGlmZiAtLWdpdCBhL2xpYnMvcnMvcnNDb21wb25lbnQuY3BwIGIvbGlicy9ycy9yc0NvbXBvbmVudC5jcHAKaW5kZXggMTVhNTZmNy4uZjUxYjIzZSAxMDA2NDQKLS0tIGEvbGlicy9ycy9yc0NvbXBvbmVudC5jcHAKKysrIGIvbGlicy9ycy9yc0NvbXBvbmVudC5jcHAKQEAgLTE2LDcgKzE2LDExIEBACiAKICNpbmNsdWRlICJyc0NvbXBvbmVudC5oIgogCisjaWZuZGVmIEFORFJPSURfUlNfQlVJTERfRk9SX0hPU1QKICNpbmNsdWRlIDxHTEVTL2dsLmg+CisjZWxzZQorI2luY2x1ZGUgPE9wZW5HTC9nbC5oPgorI2VuZGlmCiAKIHVzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOwogdXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ6OnJlbmRlcnNjcmlwdDsKQEAgLTkxLDYgKzk1LDI2IEBACiAgICAgICAgIG1Ob3JtYWxpemVkID0gdHJ1ZTsKICAgICAgICAgcnNBc3NlcnQobUtpbmQgPT0gUlNfS0lORF9QSVhFTF9SR0JBKTsKICAgICAgICAgcmV0dXJuOworCisgICAgY2FzZSBSU19UWVBFX01BVFJJWF80WDQ6CisgICAgICAgIG1UeXBlQml0cyA9IDE2ICogMzI7CisgICAgICAgIHJzQXNzZXJ0KG1WZWN0b3JTaXplID09IDEpOworICAgICAgICByc0Fzc2VydChtTm9ybWFsaXplZCA9PSBmYWxzZSk7CisgICAgICAgIHJzQXNzZXJ0KG1LaW5kID09IFJTX0tJTkRfVVNFUik7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgUlNfVFlQRV9NQVRSSVhfM1gzOgorICAgICAgICBtVHlwZUJpdHMgPSA5ICogMzI7CisgICAgICAgIHJzQXNzZXJ0KG1WZWN0b3JTaXplID09IDEpOworICAgICAgICByc0Fzc2VydChtTm9ybWFsaXplZCA9PSBmYWxzZSk7CisgICAgICAgIHJzQXNzZXJ0KG1LaW5kID09IFJTX0tJTkRfVVNFUik7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgUlNfVFlQRV9NQVRSSVhfMlgyOgorICAgICAgICBtVHlwZUJpdHMgPSA0ICogMzI7CisgICAgICAgIHJzQXNzZXJ0KG1WZWN0b3JTaXplID09IDEpOworICAgICAgICByc0Fzc2VydChtTm9ybWFsaXplZCA9PSBmYWxzZSk7CisgICAgICAgIHJzQXNzZXJ0KG1LaW5kID09IFJTX0tJTkRfVVNFUik7CisgICAgICAgIGJyZWFrOworCiAgICAgY2FzZSBSU19UWVBFX0VMRU1FTlQ6CiAgICAgY2FzZSBSU19UWVBFX1RZUEU6CiAgICAgY2FzZSBSU19UWVBFX0FMTE9DQVRJT046CkBAIC0xNDgsMTEgKzE3MiwxOSBAQAogICAgIGNhc2UgUlNfVFlQRV9VTlNJR05FRF82NDoKICAgICAgICAgbVR5cGVCaXRzID0gNjQ7CiAgICAgICAgIGJyZWFrOworCisgICAgY2FzZSBSU19UWVBFX0JPT0xFQU46CisgICAgICAgIG1UeXBlQml0cyA9IDg7CisgICAgICAgIGJyZWFrOwogICAgIH0KIAogICAgIG1CaXRzID0gbVR5cGVCaXRzICogbVZlY3RvclNpemU7CiB9CiAKK2Jvb2wgQ29tcG9uZW50Ojppc1JlZmVyZW5jZSgpIGNvbnN0Cit7CisgICAgcmV0dXJuIChtVHlwZSA+PSBSU19UWVBFX0VMRU1FTlQpOworfQogCiAKIApAQCAtMTg4LDgyICsyMjAsNiBAQAogICAgIHJldHVybiAwOwogfQogCi1zdGF0aWMgY29uc3QgY2hhciAqIGdDVHlwZVN0cmluZ3NbXSA9IHsKLSAgICAwLAotICAgIDAsLy8iRjE2IiwKLSAgICAiZmxvYXQiLAotICAgICJkb3VibGUiLAotICAgICJjaGFyIiwKLSAgICAic2hvcnQiLAotICAgICJpbnQiLAotICAgIDAsLy8iUzY0IiwKLSAgICAiY2hhciIsLy9VOCIsCi0gICAgInNob3J0IiwvL1UxNiIsCi0gICAgImludCIsLy9VMzIiLAotICAgIDAsLy8iVTY0IiwKLSAgICAwLC8vIlVQXzU2NSIsCi0gICAgMCwvLyJVUF81NTUxIiwKLSAgICAwLC8vIlVQXzQ0NDQiLAotICAgIDAsLy8iRUxFTUVOVCIsCi0gICAgMCwvLyJUWVBFIiwKLSAgICAwLC8vIkFMTE9DQVRJT04iLAotICAgIDAsLy8iU0FNUExFUiIsCi0gICAgMCwvLyJTQ1JJUFQiLAotICAgIDAsLy8iTUVTSCIsCi0gICAgMCwvLyJQUk9HUkFNX0ZSQUdNRU5UIiwKLSAgICAwLC8vIlBST0dSQU1fVkVSVEVYIiwKLSAgICAwLC8vIlBST0dSQU1fUkFTVEVSIiwKLSAgICAwLC8vIlBST0dSQU1fU1RPUkUiLAotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBnQ1ZlY1R5cGVTdHJpbmdzW10gPSB7Ci0gICAgMCwKLSAgICAwLC8vIkYxNiIsCi0gICAgInZlY0YzMiIsCi0gICAgInZlY0Y2NCIsCi0gICAgInZlY0k4IiwKLSAgICAidmVjSTE2IiwKLSAgICAidmVjSTMyIiwKLSAgICAwLC8vIlM2NCIsCi0gICAgInZlY1U4IiwvL1U4IiwKLSAgICAidmVjVTE2IiwvL1UxNiIsCi0gICAgInZlY1UzMiIsLy9VMzIiLAotICAgIDAsLy8iVTY0IiwKLSAgICAwLC8vIlVQXzU2NSIsCi0gICAgMCwvLyJVUF81NTUxIiwKLSAgICAwLC8vIlVQXzQ0NDQiLAotICAgIDAsLy8iRUxFTUVOVCIsCi0gICAgMCwvLyJUWVBFIiwKLSAgICAwLC8vIkFMTE9DQVRJT04iLAotICAgIDAsLy8iU0FNUExFUiIsCi0gICAgMCwvLyJTQ1JJUFQiLAotICAgIDAsLy8iTUVTSCIsCi0gICAgMCwvLyJQUk9HUkFNX0ZSQUdNRU5UIiwKLSAgICAwLC8vIlBST0dSQU1fVkVSVEVYIiwKLSAgICAwLC8vIlBST0dSQU1fUkFTVEVSIiwKLSAgICAwLC8vIlBST0dSQU1fU1RPUkUiLAotfTsKLQotU3RyaW5nOCBDb21wb25lbnQ6OmdldENUeXBlKCkgY29uc3QKLXsKLSAgICBjaGFyIGJ1Zls2NF07Ci0gICAgaWYgKG1WZWN0b3JTaXplID09IDEpIHsKLSAgICAgICAgcmV0dXJuIFN0cmluZzgoZ0NUeXBlU3RyaW5nc1ttVHlwZV0pOwotICAgIH0KLQotICAgIC8vIFl1Y2ssIGFjYyBXQVIKLSAgICAvLyBBcHBlYXJzIHRvIGhhdmUgcHJvYmxlbXMgcGFja2luZyBjaGFycwotICAgIGlmIChtVmVjdG9yU2l6ZSA9PSA0ICYmIG1UeXBlID09IFJTX1RZUEVfVU5TSUdORURfOCkgewotICAgICAgICByZXR1cm4gU3RyaW5nOCgiaW50Iik7Ci0gICAgfQotCi0KLSAgICBTdHJpbmc4IHMoZ0NWZWNUeXBlU3RyaW5nc1ttVHlwZV0pOwotICAgIHNwcmludGYoYnVmLCAiXyVpX3QiLCBtVmVjdG9yU2l6ZSk7Ci0gICAgcy5hcHBlbmQoYnVmKTsKLSAgICByZXR1cm4gczsKLX0KLQogU3RyaW5nOCBDb21wb25lbnQ6OmdldEdMU0xUeXBlKCkgY29uc3QKIHsKICAgICBpZiAobVR5cGUgPT0gUlNfVFlQRV9TSUdORURfMzIpIHsKQEAgLTI4MiwxMCArMjM4LDE5IEBACiAgICAgICAgIGNhc2UgNDogcmV0dXJuIFN0cmluZzgoInZlYzQiKTsKICAgICAgICAgfQogICAgIH0KKyAgICBpZiAoKG1UeXBlID09IFJTX1RZUEVfTUFUUklYXzRYNCkgJiYgKG1WZWN0b3JTaXplID09IDEpKSB7CisgICAgICAgIHJldHVybiBTdHJpbmc4KCJtYXQ0Iik7CisgICAgfQorICAgIGlmICgobVR5cGUgPT0gUlNfVFlQRV9NQVRSSVhfM1gzKSAmJiAobVZlY3RvclNpemUgPT0gMSkpIHsKKyAgICAgICAgcmV0dXJuIFN0cmluZzgoIm1hdDMiKTsKKyAgICB9CisgICAgaWYgKChtVHlwZSA9PSBSU19UWVBFX01BVFJJWF8yWDIpICYmIChtVmVjdG9yU2l6ZSA9PSAxKSkgeworICAgICAgICByZXR1cm4gU3RyaW5nOCgibWF0MiIpOworICAgIH0KICAgICByZXR1cm4gU3RyaW5nOCgpOwogfQogCi1zdGF0aWMgY29uc3QgY2hhciAqIGdUeXBlU3RyaW5nc1tdID0geworc3RhdGljIGNvbnN0IGNoYXIgKiBnVHlwZUJhc2ljU3RyaW5nc1tdID0gewogICAgICJOT05FIiwKICAgICAiRjE2IiwKICAgICAiRjMyIiwKQEAgLTI5OCw5ICsyNjMsMTYgQEAKICAgICAiVTE2IiwKICAgICAiVTMyIiwKICAgICAiVTY0IiwKKyAgICAiQk9PTEVBTiIsCiAgICAgIlVQXzU2NSIsCiAgICAgIlVQXzU1NTEiLAogICAgICJVUF80NDQ0IiwKKyAgICAiTUFUUklYXzRYNCIsCisgICAgIk1BVFJJWF8zWDMiLAorICAgICJNQVRSSVhfMlgyIiwKK307CisKK3N0YXRpYyBjb25zdCBjaGFyICogZ1R5cGVPYmpTdHJpbmdzW10gPSB7CiAgICAgIkVMRU1FTlQiLAogICAgICJUWVBFIiwKICAgICAiQUxMT0NBVElPTiIsCkBAIC0zMzAsOCArMzAyLDM0IEBACiAKIHZvaWQgQ29tcG9uZW50OjpkdW1wTE9HVihjb25zdCBjaGFyICpwcmVmaXgpIGNvbnN0CiB7Ci0gICAgTE9HVigiJXMgICBDb21wb25lbnQ6ICVzLCAlcywgdmVjdG9yU2l6ZT0laSwgYml0cz0laSIsCi0gICAgICAgICBwcmVmaXgsIGdUeXBlU3RyaW5nc1ttVHlwZV0sIGdLaW5kU3RyaW5nc1ttS2luZF0sIG1WZWN0b3JTaXplLCBtQml0cyk7CisgICAgaWYgKG1UeXBlID49IFJTX1RZUEVfRUxFTUVOVCkgeworICAgICAgICBMT0dWKCIlcyAgIENvbXBvbmVudDogJXMsICVzLCB2ZWN0b3JTaXplPSVpLCBiaXRzPSVpIiwKKyAgICAgICAgICAgICBwcmVmaXgsIGdUeXBlT2JqU3RyaW5nc1ttVHlwZSAtIFJTX1RZUEVfRUxFTUVOVF0sIGdLaW5kU3RyaW5nc1ttS2luZF0sIG1WZWN0b3JTaXplLCBtQml0cyk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgTE9HVigiJXMgICBDb21wb25lbnQ6ICVzLCAlcywgdmVjdG9yU2l6ZT0laSwgYml0cz0laSIsCisgICAgICAgICAgICAgcHJlZml4LCBnVHlwZUJhc2ljU3RyaW5nc1ttVHlwZV0sIGdLaW5kU3RyaW5nc1ttS2luZF0sIG1WZWN0b3JTaXplLCBtQml0cyk7CisgICAgfQogfQogCit2b2lkIENvbXBvbmVudDo6c2VyaWFsaXplKE9TdHJlYW0gKnN0cmVhbSkgY29uc3QKK3sKKyAgICBzdHJlYW0tPmFkZFU4KCh1aW50OF90KW1UeXBlKTsKKyAgICBzdHJlYW0tPmFkZFU4KCh1aW50OF90KW1LaW5kKTsKKyAgICBzdHJlYW0tPmFkZFU4KCh1aW50OF90KShtTm9ybWFsaXplZCA/IDEgOiAwKSk7CisgICAgc3RyZWFtLT5hZGRVMzIobVZlY3RvclNpemUpOworfQorCit2b2lkIENvbXBvbmVudDo6bG9hZEZyb21TdHJlYW0oSVN0cmVhbSAqc3RyZWFtKQoreworICAgIG1UeXBlID0gKFJzRGF0YVR5cGUpc3RyZWFtLT5sb2FkVTgoKTsKKyAgICBtS2luZCA9IChSc0RhdGFLaW5kKXN0cmVhbS0+bG9hZFU4KCk7CisgICAgdWludDhfdCB0ZW1wID0gc3RyZWFtLT5sb2FkVTgoKTsKKyAgICBtTm9ybWFsaXplZCA9IHRlbXAgIT0gMDsKKyAgICBtVmVjdG9yU2l6ZSA9IHN0cmVhbS0+bG9hZFUzMigpOworCisgICAgc2V0KG1UeXBlLCBtS2luZCwgbU5vcm1hbGl6ZWQsIG1WZWN0b3JTaXplKTsKK30KKworCisKIApkaWZmIC0tZ2l0IGEvbGlicy9ycy9yc0NvbXBvbmVudC5oIGIvbGlicy9ycy9yc0NvbXBvbmVudC5oCmluZGV4IDcxZGUzMjQuLmE3NzUwNTEgMTAwNjQ0Ci0tLSBhL2xpYnMvcnMvcnNDb21wb25lbnQuaAorKysgYi9saWJzL3JzL3JzQ29tcG9uZW50LmgKQEAgLTM1LDcgKzM1LDYgQEAKIAogICAgIHVpbnQzMl90IGdldEdMVHlwZSgpIGNvbnN0OwogICAgIHVpbnQzMl90IGdldEdMRm9ybWF0KCkgY29uc3Q7Ci0gICAgU3RyaW5nOCBnZXRDVHlwZSgpIGNvbnN0OwogICAgIFN0cmluZzggZ2V0R0xTTFR5cGUoKSBjb25zdDsKICAgICB2b2lkIGR1bXBMT0dWKGNvbnN0IGNoYXIgKnByZWZpeCkgY29uc3Q7CiAKQEAgLTQ4LDYgKzQ3LDEyIEBACiAgICAgYm9vbCBnZXRJc1NpZ25lZCgpIGNvbnN0IHtyZXR1cm4gbUlzU2lnbmVkO30KICAgICB1aW50MzJfdCBnZXRCaXRzKCkgY29uc3Qge3JldHVybiBtQml0czt9CiAKKyAgICAvLyBIZWxwZXJzIGZvciByZWFkaW5nIC8gd3JpdGluZyB0aGlzIGNsYXNzIG91dAorICAgIHZvaWQgc2VyaWFsaXplKE9TdHJlYW0gKnN0cmVhbSkgY29uc3Q7CisgICAgdm9pZCBsb2FkRnJvbVN0cmVhbShJU3RyZWFtICpzdHJlYW0pOworCisgICAgYm9vbCBpc1JlZmVyZW5jZSgpIGNvbnN0OworCiBwcm90ZWN0ZWQ6CiAgICAgUnNEYXRhVHlwZSBtVHlwZTsKICAgICBSc0RhdGFLaW5kIG1LaW5kOwpkaWZmIC0tZ2l0IGEvbGlicy9ycy9yc0NvbnRleHQuY3BwIGIvbGlicy9ycy9yc0NvbnRleHQuY3BwCmluZGV4IDU5NmY1MzMuLjUzMjdhYWMgMTAwNjQ0Ci0tLSBhL2xpYnMvcnMvcnNDb250ZXh0LmNwcAorKysgYi9saWJzL3JzL3JzQ29udGV4dC5jcHAKQEAgLTIzLDYgKzIzLDcgQEAKIAogI2luY2x1ZGUgPHN5cy90eXBlcy5oPgogI2luY2x1ZGUgPHN5cy9yZXNvdXJjZS5oPgorI2luY2x1ZGUgPHNjaGVkLmg+CiAKICNpbmNsdWRlIDxjdXRpbHMvcHJvcGVydGllcy5oPgogCkBAIC04Nyw3ICs4OCw3IEBACiAgICAgY29uZmlnQXR0cmlic1B0clswXSA9IEVHTF9OT05FOwogICAgIHJzQXNzZXJ0KGNvbmZpZ0F0dHJpYnNQdHIgPCAoY29uZmlnQXR0cmlicyArIChzaXplb2YoY29uZmlnQXR0cmlicykgLyBzaXplb2YoRUdMaW50KSkpKTsKIAotICAgIExPR1YoImluaXRFR0wgc3RhcnQiKTsKKyAgICBMT0dWKCIlcCBpbml0RUdMIHN0YXJ0IiwgdGhpcyk7CiAgICAgbUVHTC5tRGlzcGxheSA9IGVnbEdldERpc3BsYXkoRUdMX0RFRkFVTFRfRElTUExBWSk7CiAgICAgY2hlY2tFZ2xFcnJvcigiZWdsR2V0RGlzcGxheSIpOwogCkBAIC05Niw3ICs5Nyw3IEBACiAKICAgICBzdGF0dXNfdCBlcnIgPSBFR0xVdGlsczo6c2VsZWN0Q29uZmlnRm9yTmF0aXZlV2luZG93KG1FR0wubURpc3BsYXksIGNvbmZpZ0F0dHJpYnMsIG1XbmRTdXJmYWNlLCAmbUVHTC5tQ29uZmlnKTsKICAgICBpZiAoZXJyKSB7Ci0gICAgICAgTE9HRSgiY291bGRuJ3QgZmluZCBhbiBFR0xDb25maWcgbWF0Y2hpbmcgdGhlIHNjcmVlbiBmb3JtYXRcbiIpOworICAgICAgIExPR0UoIiVwLCBjb3VsZG4ndCBmaW5kIGFuIEVHTENvbmZpZyBtYXRjaGluZyB0aGUgc2NyZWVuIGZvcm1hdFxuIiwgdGhpcyk7CiAgICAgfQogICAgIC8vZWdsQ2hvb3NlQ29uZmlnKG1FR0wubURpc3BsYXksIGNvbmZpZ0F0dHJpYnMsICZtRUdMLm1Db25maWcsIDEsICZtRUdMLm1OdW1Db25maWdzKTsKIApAQCAtMTA4LDE0ICsxMDksMTQgQEAKICAgICB9CiAgICAgY2hlY2tFZ2xFcnJvcigiZWdsQ3JlYXRlQ29udGV4dCIpOwogICAgIGlmIChtRUdMLm1Db250ZXh0ID09IEVHTF9OT19DT05URVhUKSB7Ci0gICAgICAgIExPR0UoImVnbENyZWF0ZUNvbnRleHQgcmV0dXJuZWQgRUdMX05PX0NPTlRFWFQiKTsKKyAgICAgICAgTE9HRSgiJXAsIGVnbENyZWF0ZUNvbnRleHQgcmV0dXJuZWQgRUdMX05PX0NPTlRFWFQiLCB0aGlzKTsKICAgICB9CiAgICAgZ0dMQ29udGV4dENvdW50Kys7CiB9CiAKIHZvaWQgQ29udGV4dDo6ZGVpbml0RUdMKCkKIHsKLSAgICBMT0dWKCJkZWluaXRFR0wiKTsKKyAgICBMT0dWKCIlcCwgZGVpbml0RUdMIiwgdGhpcyk7CiAgICAgc2V0U3VyZmFjZSgwLCAwLCBOVUxMKTsKICAgICBlZ2xEZXN0cm95Q29udGV4dChtRUdMLm1EaXNwbGF5LCBtRUdMLm1Db250ZXh0KTsKICAgICBjaGVja0VnbEVycm9yKCJlZ2xEZXN0cm95Q29udGV4dCIpOwpAQCAtMTI3LDE5ICsxMjgsMjEgQEAKIH0KIAogCi11aW50MzJfdCBDb250ZXh0OjpydW5TY3JpcHQoU2NyaXB0ICpzLCB1aW50MzJfdCBsYXVuY2hJRCkKK3VpbnQzMl90IENvbnRleHQ6OnJ1blNjcmlwdChTY3JpcHQgKnMpCiB7CiAgICAgT2JqZWN0QmFzZVJlZjxQcm9ncmFtRnJhZ21lbnQ+IGZyYWcobUZyYWdtZW50KTsKICAgICBPYmplY3RCYXNlUmVmPFByb2dyYW1WZXJ0ZXg+IHZ0eChtVmVydGV4KTsKLSAgICBPYmplY3RCYXNlUmVmPFByb2dyYW1GcmFnbWVudFN0b3JlPiBzdG9yZShtRnJhZ21lbnRTdG9yZSk7CisgICAgT2JqZWN0QmFzZVJlZjxQcm9ncmFtU3RvcmU+IHN0b3JlKG1GcmFnbWVudFN0b3JlKTsKICAgICBPYmplY3RCYXNlUmVmPFByb2dyYW1SYXN0ZXI+IHJhc3RlcihtUmFzdGVyKTsKKyAgICBPYmplY3RCYXNlUmVmPEZvbnQ+IGZvbnQobUZvbnQpOwogCi0gICAgdWludDMyX3QgcmV0ID0gcy0+cnVuKHRoaXMsIGxhdW5jaElEKTsKKyAgICB1aW50MzJfdCByZXQgPSBzLT5ydW4odGhpcyk7CiAKICAgICBtRnJhZ21lbnQuc2V0KGZyYWcpOwogICAgIG1WZXJ0ZXguc2V0KHZ0eCk7CiAgICAgbUZyYWdtZW50U3RvcmUuc2V0KHN0b3JlKTsKICAgICBtUmFzdGVyLnNldChyYXN0ZXIpOworICAgIG1Gb250LnNldChmb250KTsKICAgICByZXR1cm4gcmV0OwogfQogCkBAIC0xNDcsMzUgKzE1MCwxNyBAQAogewogICAgIEdMZW51bSBlcnIgPSBnbEdldEVycm9yKCk7CiAgICAgaWYgKGVyciAhPSBHTF9OT19FUlJPUikgewotICAgICAgICBMT0dFKCJHTCBFcnJvciwgMHgleCwgZnJvbSAlcyIsIGVyciwgbXNnKTsKKyAgICAgICAgTE9HRSgiJXAsIEdMIEVycm9yLCAweCV4LCBmcm9tICVzIiwgdGhpcywgZXJyLCBtc2cpOwogICAgIH0KIH0KIAogdWludDMyX3QgQ29udGV4dDo6cnVuUm9vdFNjcmlwdCgpCiB7Ci0gICAgdGltZXJTZXQoUlNfVElNRVJfQ0xFQVJfU1dBUCk7Ci0gICAgcnNBc3NlcnQobVJvb3RTY3JpcHQtPm1FbnZpcm9tZW50Lm1Jc1Jvb3QpOwotCi0gICAgZWdsUXVlcnlTdXJmYWNlKG1FR0wubURpc3BsYXksIG1FR0wubVN1cmZhY2UsIEVHTF9XSURUSCwgJm1FR0wubVdpZHRoKTsKLSAgICBlZ2xRdWVyeVN1cmZhY2UobUVHTC5tRGlzcGxheSwgbUVHTC5tU3VyZmFjZSwgRUdMX0hFSUdIVCwgJm1FR0wubUhlaWdodCk7Ci0gICAgZ2xWaWV3cG9ydCgwLCAwLCBtRUdMLm1XaWR0aCwgbUVHTC5tSGVpZ2h0KTsKLSAgICBnbENvbG9yTWFzayhHTF9UUlVFLCBHTF9UUlVFLCBHTF9UUlVFLCBHTF9UUlVFKTsKLQotICAgIGdsQ2xlYXJDb2xvcihtUm9vdFNjcmlwdC0+bUVudmlyb21lbnQubUNsZWFyQ29sb3JbMF0sCi0gICAgICAgICAgICAgICAgIG1Sb290U2NyaXB0LT5tRW52aXJvbWVudC5tQ2xlYXJDb2xvclsxXSwKLSAgICAgICAgICAgICAgICAgbVJvb3RTY3JpcHQtPm1FbnZpcm9tZW50Lm1DbGVhckNvbG9yWzJdLAotICAgICAgICAgICAgICAgICBtUm9vdFNjcmlwdC0+bUVudmlyb21lbnQubUNsZWFyQ29sb3JbM10pOwotICAgIGlmIChtVXNlRGVwdGgpIHsKLSAgICAgICAgZ2xEZXB0aE1hc2soR0xfVFJVRSk7Ci0gICAgICAgIGdsQ2xlYXJEZXB0aGYobVJvb3RTY3JpcHQtPm1FbnZpcm9tZW50Lm1DbGVhckRlcHRoKTsKLSAgICAgICAgZ2xDbGVhcihHTF9DT0xPUl9CVUZGRVJfQklUIHwgR0xfREVQVEhfQlVGRkVSX0JJVCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgZ2xDbGVhcihHTF9DT0xPUl9CVUZGRVJfQklUKTsKLSAgICB9CisgICAgZ2xWaWV3cG9ydCgwLCAwLCBtV2lkdGgsIG1IZWlnaHQpOwogCiAgICAgdGltZXJTZXQoUlNfVElNRVJfU0NSSVBUKTsKICAgICBtU3RhdGVGcmFnbWVudFN0b3JlLm1MYXN0LmNsZWFyKCk7Ci0gICAgdWludDMyX3QgcmV0ID0gcnVuU2NyaXB0KG1Sb290U2NyaXB0LmdldCgpLCAwKTsKKyAgICB1aW50MzJfdCByZXQgPSBydW5TY3JpcHQobVJvb3RTY3JpcHQuZ2V0KCkpOwogCiAgICAgY2hlY2tFcnJvcigicnVuUm9vdFNjcmlwdCIpOwogICAgIGlmIChtRXJyb3IgIT0gUlNfRVJST1JfTk9ORSkgewpAQCAtMjc0LDYgKzI1OSwyNCBAQAogICAgIHJldHVybiAwICE9IHN0cmNtcChidWYsICIwIik7CiB9CiAKK3ZvaWQgQ29udGV4dDo6ZGlzcGxheURlYnVnU3RhdHMoKQoreworICAgIGNoYXIgYnVmZmVyWzEyOF07CisgICAgc3ByaW50ZihidWZmZXIsICJGcmFtZSAlaSBtcywgU2NyaXB0ICVpIG1zIiwgbVRpbWVNU0xhc3RGcmFtZSwgbVRpbWVNU0xhc3RTY3JpcHQpOworICAgIGZsb2F0IG9sZFIsIG9sZEcsIG9sZEIsIG9sZEE7CisgICAgbVN0YXRlRm9udC5nZXRGb250Q29sb3IoJm9sZFIsICZvbGRHLCAmb2xkQiwgJm9sZEEpOworCisgICAgZmxvYXQgc2hhZG93Q29sID0gMC4yZjsKKyAgICBtU3RhdGVGb250LnNldEZvbnRDb2xvcihzaGFkb3dDb2wsIHNoYWRvd0NvbCwgc2hhZG93Q29sLCAxLjBmKTsKKyAgICBtU3RhdGVGb250LnJlbmRlclRleHQoYnVmZmVyLCA1LCBnZXRIZWlnaHQoKSAtIDUpOworCisgICAgZmxvYXQgdGV4dENvbCA9IDAuOWY7CisgICAgbVN0YXRlRm9udC5zZXRGb250Q29sb3IodGV4dENvbCwgdGV4dENvbCwgdGV4dENvbCwgMS4wZik7CisgICAgbVN0YXRlRm9udC5yZW5kZXJUZXh0KGJ1ZmZlciwgNCwgZ2V0SGVpZ2h0KCkgLSA2KTsKKworICAgIG1TdGF0ZUZvbnQuc2V0Rm9udENvbG9yKG9sZFIsIG9sZEcsIG9sZEIsIG9sZEEpOworfQorCiB2b2lkICogQ29udGV4dDo6dGhyZWFkUHJvYyh2b2lkICp2cnNjKQogewogICAgICBDb250ZXh0ICpyc2MgPSBzdGF0aWNfY2FzdDxDb250ZXh0ICo+KHZyc2MpOwpAQCAtMjg2LDYgKzI4OSw3IEBACiAgICAgIHJzYy0+cHJvcHMubUxvZ1NjcmlwdHMgPSBnZXRQcm9wKCJkZWJ1Zy5ycy5zY3JpcHQiKTsKICAgICAgcnNjLT5wcm9wcy5tTG9nT2JqZWN0cyA9IGdldFByb3AoImRlYnVnLnJzLm9iamVjdCIpOwogICAgICByc2MtPnByb3BzLm1Mb2dTaGFkZXJzID0gZ2V0UHJvcCgiZGVidWcucnMuc2hhZGVyIik7CisgICAgIHJzYy0+cHJvcHMubUxvZ1Zpc3VhbCA9IGdldFByb3AoImRlYnVnLnJzLnZpc3VhbCIpOwogCiAgICAgIFNjcmlwdFRMU1N0cnVjdCAqdGxzU3RydWN0ID0gbmV3IFNjcmlwdFRMU1N0cnVjdDsKICAgICAgaWYgKCF0bHNTdHJ1Y3QpIHsKQEAgLTMwMCwxNCArMzA0LDE2IEBACiAgICAgIH0KIAogICAgICBpZiAocnNjLT5tSXNHcmFwaGljc0NvbnRleHQpIHsKLSAgICAgICAgIHJzYy0+bVN0YXRlUmFzdGVyLmluaXQocnNjLCByc2MtPm1FR0wubVdpZHRoLCByc2MtPm1FR0wubUhlaWdodCk7CisgICAgICAgICByc2MtPm1TdGF0ZVJhc3Rlci5pbml0KHJzYyk7CiAgICAgICAgICByc2MtPnNldFJhc3RlcihOVUxMKTsKLSAgICAgICAgIHJzYy0+bVN0YXRlVmVydGV4LmluaXQocnNjLCByc2MtPm1FR0wubVdpZHRoLCByc2MtPm1FR0wubUhlaWdodCk7CisgICAgICAgICByc2MtPm1TdGF0ZVZlcnRleC5pbml0KHJzYyk7CiAgICAgICAgICByc2MtPnNldFZlcnRleChOVUxMKTsKLSAgICAgICAgIHJzYy0+bVN0YXRlRnJhZ21lbnQuaW5pdChyc2MsIHJzYy0+bUVHTC5tV2lkdGgsIHJzYy0+bUVHTC5tSGVpZ2h0KTsKKyAgICAgICAgIHJzYy0+bVN0YXRlRnJhZ21lbnQuaW5pdChyc2MpOwogICAgICAgICAgcnNjLT5zZXRGcmFnbWVudChOVUxMKTsKLSAgICAgICAgIHJzYy0+bVN0YXRlRnJhZ21lbnRTdG9yZS5pbml0KHJzYywgcnNjLT5tRUdMLm1XaWR0aCwgcnNjLT5tRUdMLm1IZWlnaHQpOworICAgICAgICAgcnNjLT5tU3RhdGVGcmFnbWVudFN0b3JlLmluaXQocnNjKTsKICAgICAgICAgIHJzYy0+c2V0RnJhZ21lbnRTdG9yZShOVUxMKTsKKyAgICAgICAgIHJzYy0+bVN0YXRlRm9udC5pbml0KHJzYyk7CisgICAgICAgICByc2MtPnNldEZvbnQoTlVMTCk7CiAgICAgICAgICByc2MtPm1TdGF0ZVZlcnRleEFycmF5LmluaXQocnNjKTsKICAgICAgfQogCkBAIC0zMjEsNiArMzI3LDExIEBACiAgICAgICAgICB1aW50MzJfdCB0YXJnZXRUaW1lID0gMDsKICAgICAgICAgIGlmIChtRHJhdyAmJiByc2MtPm1Jc0dyYXBoaWNzQ29udGV4dCkgewogICAgICAgICAgICAgIHRhcmdldFRpbWUgPSByc2MtPnJ1blJvb3RTY3JpcHQoKTsKKworICAgICAgICAgICAgIGlmKHJzYy0+cHJvcHMubUxvZ1Zpc3VhbCkgeworICAgICAgICAgICAgICAgICByc2MtPmRpc3BsYXlEZWJ1Z1N0YXRzKCk7CisgICAgICAgICAgICAgfQorCiAgICAgICAgICAgICAgbURyYXcgPSB0YXJnZXRUaW1lICYmICFyc2MtPm1QYXVzZWQ7CiAgICAgICAgICAgICAgcnNjLT50aW1lclNldChSU19USU1FUl9DTEVBUl9TV0FQKTsKICAgICAgICAgICAgICBlZ2xTd2FwQnVmZmVycyhyc2MtPm1FR0wubURpc3BsYXksIHJzYy0+bUVHTC5tU3VyZmFjZSk7CkBAIC0zMjksOSArMzQwLDYgQEAKICAgICAgICAgICAgICByc2MtPnRpbWVyUHJpbnQoKTsKICAgICAgICAgICAgICByc2MtPnRpbWVyUmVzZXQoKTsKICAgICAgICAgIH0KLSAgICAgICAgIGlmIChyc2MtPm1PYmpEZXN0cm95Lm1OZWVkVG9FbXB0eSkgewotICAgICAgICAgICAgIHJzYy0+b2JqRGVzdHJveU9PQlJ1bigpOwotICAgICAgICAgfQogICAgICAgICAgaWYgKHJzYy0+bVRocmVhZFByaW9yaXR5ID4gMCAmJiB0YXJnZXRUaW1lKSB7CiAgICAgICAgICAgICAgaW50MzJfdCB0ID0gKHRhcmdldFRpbWUgLSAoaW50MzJfdCkocnNjLT5tVGltZU1TTGFzdFNjcmlwdCArIHJzYy0+bVRpbWVNU0xhc3RTd2FwKSkgKiAxMDAwOwogICAgICAgICAgICAgIGlmICh0ID4gMCkgewpAQCAtMzQwLDMzICszNDgsNzUgQEAKICAgICAgICAgIH0KICAgICAgfQogCi0gICAgIExPR1YoIlJTIFRocmVhZCBleGl0aW5nIik7CisgICAgIExPR1YoIiVwLCBSUyBUaHJlYWQgZXhpdGluZyIsIHJzYyk7CiAgICAgIGlmIChyc2MtPm1Jc0dyYXBoaWNzQ29udGV4dCkgewogICAgICAgICAgcnNjLT5tUmFzdGVyLmNsZWFyKCk7CiAgICAgICAgICByc2MtPm1GcmFnbWVudC5jbGVhcigpOwogICAgICAgICAgcnNjLT5tVmVydGV4LmNsZWFyKCk7CiAgICAgICAgICByc2MtPm1GcmFnbWVudFN0b3JlLmNsZWFyKCk7CisgICAgICAgICByc2MtPm1Gb250LmNsZWFyKCk7CiAgICAgICAgICByc2MtPm1Sb290U2NyaXB0LmNsZWFyKCk7CiAgICAgICAgICByc2MtPm1TdGF0ZVJhc3Rlci5kZWluaXQocnNjKTsKICAgICAgICAgIHJzYy0+bVN0YXRlVmVydGV4LmRlaW5pdChyc2MpOwogICAgICAgICAgcnNjLT5tU3RhdGVGcmFnbWVudC5kZWluaXQocnNjKTsKICAgICAgICAgIHJzYy0+bVN0YXRlRnJhZ21lbnRTdG9yZS5kZWluaXQocnNjKTsKKyAgICAgICAgIHJzYy0+bVN0YXRlRm9udC5kZWluaXQocnNjKTsKICAgICAgfQogICAgICBPYmplY3RCYXNlOjp6ZXJvQWxsVXNlclJlZihyc2MpOwogCi0gICAgIHJzYy0+bU9iakRlc3Ryb3kubU5lZWRUb0VtcHR5ID0gdHJ1ZTsKLSAgICAgcnNjLT5vYmpEZXN0cm95T09CUnVuKCk7Ci0KICAgICAgaWYgKHJzYy0+bUlzR3JhcGhpY3NDb250ZXh0KSB7CiAgICAgICAgICBwdGhyZWFkX211dGV4X2xvY2soJmdJbml0TXV0ZXgpOwogICAgICAgICAgcnNjLT5kZWluaXRFR0woKTsKICAgICAgICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZnSW5pdE11dGV4KTsKICAgICAgfQogCi0gICAgIExPR1YoIlJTIFRocmVhZCBleGl0ZWQiKTsKKyAgICAgTE9HVigiJXAsIFJTIFRocmVhZCBleGl0ZWQiLCByc2MpOwogICAgICByZXR1cm4gTlVMTDsKIH0KIAordm9pZCAqIENvbnRleHQ6OmhlbHBlclRocmVhZFByb2Modm9pZCAqdnJzYykKK3sKKyAgICAgQ29udGV4dCAqcnNjID0gc3RhdGljX2Nhc3Q8Q29udGV4dCAqPih2cnNjKTsKKyAgICAgdWludDMyX3QgaWR4ID0gKHVpbnQzMl90KWFuZHJvaWRfYXRvbWljX2luYygmcnNjLT5tV29ya2Vycy5tTGF1bmNoQ291bnQpOworCisgICAgIExPR1YoIlJTIGhlbHBlclRocmVhZCBzdGFydGluZyAlcCBpZHg9JWkiLCByc2MsIGlkeCk7CisKKyAgICAgcnNjLT5tV29ya2Vycy5tTGF1bmNoU2lnbmFsc1tpZHhdLmluaXQoKTsKKyAgICAgcnNjLT5tV29ya2Vycy5tTmF0aXZlVGhyZWFkSWRbaWR4XSA9IGdldHRpZCgpOworCisgICAgIC8vY3B1X3NldF90IGNwc2V0WzE2XTsKKyAgICAgLy9pbnQgcmV0ID0gc2NoZWRfZ2V0YWZmaW5pdHkocnNjLT5tV29ya2Vycy5tTmF0aXZlVGhyZWFkSWRbaWR4XSwgc2l6ZW9mKGNwc2V0KSwgJmNwc2V0KTsKKyAgICAgLy9MT0dFKCJyZXQgPSAlaSIsIHJldCk7CisKKy8vc2NoZWRfc2V0YWZmaW5pdHkKKworICAgICBzZXRwcmlvcml0eShQUklPX1BST0NFU1MsIHJzYy0+bVdvcmtlcnMubU5hdGl2ZVRocmVhZElkW2lkeF0sIHJzYy0+bVRocmVhZFByaW9yaXR5KTsKKyAgICAgd2hpbGUocnNjLT5tUnVubmluZykgeworICAgICAgICAgcnNjLT5tV29ya2Vycy5tTGF1bmNoU2lnbmFsc1tpZHhdLndhaXQoKTsKKyAgICAgICAgIGlmIChyc2MtPm1Xb3JrZXJzLm1MYXVuY2hDYWxsYmFjaykgeworICAgICAgICAgICAgcnNjLT5tV29ya2Vycy5tTGF1bmNoQ2FsbGJhY2socnNjLT5tV29ya2Vycy5tTGF1bmNoRGF0YSwgaWR4KTsKKyAgICAgICAgIH0KKyAgICAgICAgIGFuZHJvaWRfYXRvbWljX2RlYygmcnNjLT5tV29ya2Vycy5tUnVubmluZ0NvdW50KTsKKyAgICAgICAgIHJzYy0+bVdvcmtlcnMubUNvbXBsZXRlU2lnbmFsLnNldCgpOworICAgICB9CisKKyAgICAgTE9HVigiUlMgaGVscGVyVGhyZWFkIGV4aXRpbmcgJXAgaWR4PSVpIiwgcnNjLCBpZHgpOworICAgICByZXR1cm4gTlVMTDsKK30KKwordm9pZCBDb250ZXh0OjpsYXVuY2hUaHJlYWRzKFdvcmtlckNhbGxiYWNrX3QgY2JrLCB2b2lkICpkYXRhKQoreworICAgIG1Xb3JrZXJzLm1MYXVuY2hEYXRhID0gZGF0YTsKKyAgICBtV29ya2Vycy5tTGF1bmNoQ2FsbGJhY2sgPSBjYms7CisgICAgbVdvcmtlcnMubVJ1bm5pbmdDb3VudCA9IChpbnQpbVdvcmtlcnMubUNvdW50OworICAgIGZvciAodWludDMyX3QgY3QgPSAwOyBjdCA8IG1Xb3JrZXJzLm1Db3VudDsgY3QrKykgeworICAgICAgICBtV29ya2Vycy5tTGF1bmNoU2lnbmFsc1tjdF0uc2V0KCk7CisgICAgfQorICAgIHdoaWxlKG1Xb3JrZXJzLm1SdW5uaW5nQ291bnQpIHsKKyAgICAgICAgbVdvcmtlcnMubUNvbXBsZXRlU2lnbmFsLndhaXQoKTsKKyAgICB9Cit9CisKIHZvaWQgQ29udGV4dDo6c2V0UHJpb3JpdHkoaW50MzJfdCBwKQogewogICAgIC8vIE5vdGU6IElmIHdlIHB1dCB0aGlzIGluIHRoZSBwcm9wZXIgImJhY2tncm91bmQiIHBvbGljeQpAQCAtMzgzLDcgKzQzMywxMCBAQAogICAgICAgICAvLyBzdWNjZXNzOyByZXNldCB0aGUgcHJpb3JpdHkgYXMgd2VsbAogICAgIH0KICNlbHNlCi0gICAgICAgIHNldHByaW9yaXR5KFBSSU9fUFJPQ0VTUywgbU5hdGl2ZVRocmVhZElkLCBwKTsKKyAgICBzZXRwcmlvcml0eShQUklPX1BST0NFU1MsIG1OYXRpdmVUaHJlYWRJZCwgcCk7CisgICAgZm9yICh1aW50MzJfdCBjdD0wOyBjdCA8IG1Xb3JrZXJzLm1Db3VudDsgY3QrKykgeworICAgICAgICBzZXRwcmlvcml0eShQUklPX1BST0NFU1MsIG1Xb3JrZXJzLm1OYXRpdmVUaHJlYWRJZFtjdF0sIHApOworICAgIH0KICNlbmRpZgogfQogCkBAIC00MjksMjAgKzQ4MiwzOSBAQAogCiAgICAgbVduZFN1cmZhY2UgPSBOVUxMOwogCi0gICAgb2JqRGVzdHJveU9PQkluaXQoKTsKICAgICB0aW1lckluaXQoKTsKICAgICB0aW1lclNldChSU19USU1FUl9JTlRFUk5BTCk7CiAKLSAgICBMT0dWKCJSUyBMYXVuY2hpbmcgdGhyZWFkIik7CisgICAgaW50IGNwdSA9IHN5c2NvbmYoX1NDX05QUk9DRVNTT1JTX09OTE4pOworICAgIExPR1YoIlJTIExhdW5jaGluZyB0aHJlYWQocyksIHJlcG9ydGVkIENQVSBjb3VudCAlaSIsIGNwdSk7CisgICAgaWYgKGNwdSA8IDIpIGNwdSA9IDA7CisKKyAgICBtV29ya2Vycy5tQ291bnQgPSAodWludDMyX3QpY3B1OworICAgIG1Xb3JrZXJzLm1UaHJlYWRJZCA9IChwdGhyZWFkX3QgKikgY2FsbG9jKG1Xb3JrZXJzLm1Db3VudCwgc2l6ZW9mKHB0aHJlYWRfdCkpOworICAgIG1Xb3JrZXJzLm1OYXRpdmVUaHJlYWRJZCA9IChwaWRfdCAqKSBjYWxsb2MobVdvcmtlcnMubUNvdW50LCBzaXplb2YocGlkX3QpKTsKKyAgICBtV29ya2Vycy5tTGF1bmNoU2lnbmFscyA9IG5ldyBTaWduYWxbbVdvcmtlcnMubUNvdW50XTsKKyAgICBtV29ya2Vycy5tTGF1bmNoQ2FsbGJhY2sgPSBOVUxMOwogICAgIHN0YXR1cyA9IHB0aHJlYWRfY3JlYXRlKCZtVGhyZWFkSWQsICZ0aHJlYWRBdHRyLCB0aHJlYWRQcm9jLCB0aGlzKTsKICAgICBpZiAoc3RhdHVzKSB7CiAgICAgICAgIExPR0UoIkZhaWxlZCB0byBzdGFydCBycyBjb250ZXh0IHRocmVhZC4iKTsKKyAgICAgICAgcmV0dXJuOwogICAgIH0KLQogICAgIHdoaWxlKCFtUnVubmluZykgewogICAgICAgICB1c2xlZXAoMTAwKTsKICAgICB9CiAKKyAgICBtV29ya2Vycy5tUnVubmluZ0NvdW50ID0gMDsKKyAgICBtV29ya2Vycy5tTGF1bmNoQ291bnQgPSAwOworICAgIGZvciAodWludDMyX3QgY3Q9MDsgY3QgPCBtV29ya2Vycy5tQ291bnQ7IGN0KyspIHsKKyAgICAgICAgc3RhdHVzID0gcHRocmVhZF9jcmVhdGUoJm1Xb3JrZXJzLm1UaHJlYWRJZFtjdF0sICZ0aHJlYWRBdHRyLCBoZWxwZXJUaHJlYWRQcm9jLCB0aGlzKTsKKyAgICAgICAgaWYgKHN0YXR1cykgeworICAgICAgICAgICAgbVdvcmtlcnMubUNvdW50ID0gY3Q7CisgICAgICAgICAgICBMT0dFKCJDcmVhdGVkIGZld2VyIHRoYW4gZXhwZWN0ZWQgbnVtYmVyIG9mIFJTIHRocmVhZHMuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworCiAgICAgcHRocmVhZF9hdHRyX2Rlc3Ryb3koJnRocmVhZEF0dHIpOwogfQogCkBAIC00NTUsOCArNTI3LDYgQEAKIAogICAgIG1JTy5zaHV0ZG93bigpOwogICAgIGludCBzdGF0dXMgPSBwdGhyZWFkX2pvaW4obVRocmVhZElkLCAmcmVzKTsKLSAgICBtT2JqRGVzdHJveS5tTmVlZFRvRW1wdHkgPSB0cnVlOwotICAgIG9iakRlc3Ryb3lPT0JSdW4oKTsKIAogICAgIC8vIEdsb2JhbCBzdHJ1Y3R1cmUgY2xlYW51cC4KICAgICBwdGhyZWFkX211dGV4X2xvY2soJmdJbml0TXV0ZXgpOwpAQCAtNDY5LDggKzUzOSw2IEBACiAgICAgICAgIG1EZXYgPSBOVUxMOwogICAgIH0KICAgICBwdGhyZWFkX211dGV4X3VubG9jaygmZ0luaXRNdXRleCk7Ci0KLSAgICBvYmpEZXN0cm95T09CRGVzdHJveSgpOwogfQogCiB2b2lkIENvbnRleHQ6OnNldFN1cmZhY2UodWludDMyX3QgdywgdWludDMyX3QgaCwgQU5hdGl2ZVdpbmRvdyAqc3VyKQpAQCAtNDg2LDE0ICs1NTQsMTQgQEAKICAgICAgICAgY2hlY2tFZ2xFcnJvcigiZWdsRGVzdHJveVN1cmZhY2UiLCByZXQpOwogCiAgICAgICAgIG1FR0wubVN1cmZhY2UgPSBOVUxMOwotICAgICAgICBtRUdMLm1XaWR0aCA9IDA7Ci0gICAgICAgIG1FR0wubUhlaWdodCA9IDA7CiAgICAgICAgIG1XaWR0aCA9IDA7CiAgICAgICAgIG1IZWlnaHQgPSAwOwogICAgIH0KIAogICAgIG1XbmRTdXJmYWNlID0gc3VyOwogICAgIGlmIChtV25kU3VyZmFjZSAhPSBOVUxMKSB7CisgICAgICAgIG1XaWR0aCA9IHc7CisgICAgICAgIG1IZWlnaHQgPSBoOwogICAgICAgICBib29sIGZpcnN0ID0gZmFsc2U7CiAgICAgICAgIGlmICghbUVHTC5tQ29udGV4dCkgewogICAgICAgICAgICAgZmlyc3QgPSB0cnVlOwpAQCAtNTExLDE1ICs1NzksNyBAQAogICAgICAgICByZXQgPSBlZ2xNYWtlQ3VycmVudChtRUdMLm1EaXNwbGF5LCBtRUdMLm1TdXJmYWNlLCBtRUdMLm1TdXJmYWNlLCBtRUdMLm1Db250ZXh0KTsKICAgICAgICAgY2hlY2tFZ2xFcnJvcigiZWdsTWFrZUN1cnJlbnQiLCByZXQpOwogCi0gICAgICAgIGVnbFF1ZXJ5U3VyZmFjZShtRUdMLm1EaXNwbGF5LCBtRUdMLm1TdXJmYWNlLCBFR0xfV0lEVEgsICZtRUdMLm1XaWR0aCk7Ci0gICAgICAgIGVnbFF1ZXJ5U3VyZmFjZShtRUdMLm1EaXNwbGF5LCBtRUdMLm1TdXJmYWNlLCBFR0xfSEVJR0hULCAmbUVHTC5tSGVpZ2h0KTsKLSAgICAgICAgbVdpZHRoID0gdzsKLSAgICAgICAgbUhlaWdodCA9IGg7Ci0gICAgICAgIG1TdGF0ZVZlcnRleC51cGRhdGVTaXplKHRoaXMsIHcsIGgpOwotCi0gICAgICAgIGlmICgoaW50KW1XaWR0aCAhPSBtRUdMLm1XaWR0aCB8fCAoaW50KW1IZWlnaHQgIT0gbUVHTC5tSGVpZ2h0KSB7Ci0gICAgICAgICAgICBMT0dFKCJFR0wvU3VyZmFjZSBtaXNtYXRjaCAgRUdMICglaSB4ICVpKSAgU0YgKCVpIHggJWkpIiwgbUVHTC5tV2lkdGgsIG1FR0wubUhlaWdodCwgbVdpZHRoLCBtSGVpZ2h0KTsKLSAgICAgICAgfQorICAgICAgICBtU3RhdGVWZXJ0ZXgudXBkYXRlU2l6ZSh0aGlzKTsKIAogICAgICAgICBpZiAoZmlyc3QpIHsKICAgICAgICAgICAgIG1HTC5tVmVyc2lvbiA9IGdsR2V0U3RyaW5nKEdMX1ZFUlNJT04pOwpAQCAtNTgzLDcgKzY0Myw3IEBACiAgICAgbVJvb3RTY3JpcHQuc2V0KHMpOwogfQogCi12b2lkIENvbnRleHQ6OnNldEZyYWdtZW50U3RvcmUoUHJvZ3JhbUZyYWdtZW50U3RvcmUgKnBmcykKK3ZvaWQgQ29udGV4dDo6c2V0RnJhZ21lbnRTdG9yZShQcm9ncmFtU3RvcmUgKnBmcykKIHsKICAgICByc0Fzc2VydChtSXNHcmFwaGljc0NvbnRleHQpOwogICAgIGlmIChwZnMgPT0gTlVMTCkgewpAQCAtNjIzLDYgKzY4MywxNiBAQAogICAgIH0KIH0KIAordm9pZCBDb250ZXh0OjpzZXRGb250KEZvbnQgKmYpCit7CisgICAgcnNBc3NlcnQobUlzR3JhcGhpY3NDb250ZXh0KTsKKyAgICBpZiAoZiA9PSBOVUxMKSB7CisgICAgICAgIG1Gb250LnNldChtU3RhdGVGb250Lm1EZWZhdWx0KTsKKyAgICB9IGVsc2UgeworICAgICAgICBtRm9udC5zZXQoZik7CisgICAgfQorfQorCiB2b2lkIENvbnRleHQ6OmFzc2lnbk5hbWUoT2JqZWN0QmFzZSAqb2JqLCBjb25zdCBjaGFyICpuYW1lLCB1aW50MzJfdCBsZW4pCiB7CiAgICAgcnNBc3NlcnQoIW9iai0+Z2V0TmFtZSgpKTsKQEAgLTY0MCw5MCArNzEwLDEzIEBACiAgICAgfQogfQogCi1PYmplY3RCYXNlICogQ29udGV4dDo6bG9va3VwTmFtZShjb25zdCBjaGFyICpuYW1lKSBjb25zdAotewotICAgIGZvcihzaXplX3QgY3Q9MDsgY3QgPCBtTmFtZXMuc2l6ZSgpOyBjdCsrKSB7Ci0gICAgICAgIGlmICghc3RyY21wKG5hbWUsIG1OYW1lc1tjdF0tPmdldE5hbWUoKSkpIHsKLSAgICAgICAgICAgIHJldHVybiBtTmFtZXNbY3RdOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBOVUxMOwotfQotCi12b2lkIENvbnRleHQ6OmFwcGVuZE5hbWVEZWZpbmVzKFN0cmluZzggKnN0cikgY29uc3QKLXsKLSAgICBjaGFyIGJ1ZlsyNTZdOwotICAgIGZvciAoc2l6ZV90IGN0PTA7IGN0IDwgbU5hbWVzLnNpemUoKTsgY3QrKykgewotICAgICAgICBzdHItPmFwcGVuZCgiI2RlZmluZSBOQU1FRF8iKTsKLSAgICAgICAgc3RyLT5hcHBlbmQobU5hbWVzW2N0XS0+Z2V0TmFtZSgpKTsKLSAgICAgICAgc3RyLT5hcHBlbmQoIiAiKTsKLSAgICAgICAgc3ByaW50ZihidWYsICIlaVxuIiwgKGludCltTmFtZXNbY3RdKTsKLSAgICAgICAgc3RyLT5hcHBlbmQoYnVmKTsKLSAgICB9Ci19Ci0KLWJvb2wgQ29udGV4dDo6b2JqRGVzdHJveU9PQkluaXQoKQotewotICAgIGludCBzdGF0dXMgPSBwdGhyZWFkX211dGV4X2luaXQoJm1PYmpEZXN0cm95Lm1NdXRleCwgTlVMTCk7Ci0gICAgaWYgKHN0YXR1cykgewotICAgICAgICBMT0dFKCJDb250ZXh0OjpPYmpEZXN0cm95T09CSW5pdCBtdXRleCBpbml0IGZhaWx1cmUiKTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotdm9pZCBDb250ZXh0OjpvYmpEZXN0cm95T09CUnVuKCkKLXsKLSAgICBpZiAobU9iakRlc3Ryb3kubU5lZWRUb0VtcHR5KSB7Ci0gICAgICAgIGludCBzdGF0dXMgPSBwdGhyZWFkX211dGV4X2xvY2soJm1PYmpEZXN0cm95Lm1NdXRleCk7Ci0gICAgICAgIGlmIChzdGF0dXMpIHsKLSAgICAgICAgICAgIExPR0UoIkNvbnRleHQ6Ok9iakRlc3Ryb3lPT0JSdW46IGVycm9yICVpIGxvY2tpbmcgZm9yIE9PQlJ1bi4iLCBzdGF0dXMpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgZm9yIChzaXplX3QgY3QgPSAwOyBjdCA8IG1PYmpEZXN0cm95Lm1EZXN0cm95TGlzdC5zaXplKCk7IGN0KyspIHsKLSAgICAgICAgICAgIG1PYmpEZXN0cm95Lm1EZXN0cm95TGlzdFtjdF0tPmRlY1VzZXJSZWYoKTsKLSAgICAgICAgfQotICAgICAgICBtT2JqRGVzdHJveS5tRGVzdHJveUxpc3QuY2xlYXIoKTsKLSAgICAgICAgbU9iakRlc3Ryb3kubU5lZWRUb0VtcHR5ID0gZmFsc2U7Ci0KLSAgICAgICAgc3RhdHVzID0gcHRocmVhZF9tdXRleF91bmxvY2soJm1PYmpEZXN0cm95Lm1NdXRleCk7Ci0gICAgICAgIGlmIChzdGF0dXMpIHsKLSAgICAgICAgICAgIExPR0UoIkNvbnRleHQ6Ok9iakRlc3Ryb3lPT0JSdW46IGVycm9yICVpIHVubG9ja2luZyBmb3Igc2V0IGNvbmRpdGlvbi4iLCBzdGF0dXMpOwotICAgICAgICB9Ci0gICAgfQotfQotCi12b2lkIENvbnRleHQ6Om9iakRlc3Ryb3lPT0JEZXN0cm95KCkKLXsKLSAgICByc0Fzc2VydCghbU9iakRlc3Ryb3kubU5lZWRUb0VtcHR5KTsKLSAgICBwdGhyZWFkX211dGV4X2Rlc3Ryb3koJm1PYmpEZXN0cm95Lm1NdXRleCk7Ci19Ci0KLXZvaWQgQ29udGV4dDo6b2JqRGVzdHJveUFkZChPYmplY3RCYXNlICpvYmopCi17Ci0gICAgaW50IHN0YXR1cyA9IHB0aHJlYWRfbXV0ZXhfbG9jaygmbU9iakRlc3Ryb3kubU11dGV4KTsKLSAgICBpZiAoc3RhdHVzKSB7Ci0gICAgICAgIExPR0UoIkNvbnRleHQ6Ok9iakRlc3Ryb3lPT0JSdW46IGVycm9yICVpIGxvY2tpbmcgZm9yIE9PQlJ1bi4iLCBzdGF0dXMpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgbU9iakRlc3Ryb3kubU5lZWRUb0VtcHR5ID0gdHJ1ZTsKLSAgICBtT2JqRGVzdHJveS5tRGVzdHJveUxpc3QuYWRkKG9iaik7Ci0KLSAgICBzdGF0dXMgPSBwdGhyZWFkX211dGV4X3VubG9jaygmbU9iakRlc3Ryb3kubU11dGV4KTsKLSAgICBpZiAoc3RhdHVzKSB7Ci0gICAgICAgIExPR0UoIkNvbnRleHQ6Ok9iakRlc3Ryb3lPT0JSdW46IGVycm9yICVpIHVubG9ja2luZyBmb3Igc2V0IGNvbmRpdGlvbi4iLCBzdGF0dXMpOwotICAgIH0KLX0KLQogdWludDMyX3QgQ29udGV4dDo6Z2V0TWVzc2FnZVRvQ2xpZW50KHZvaWQgKmRhdGEsIHNpemVfdCAqcmVjZWl2ZUxlbiwgc2l6ZV90IGJ1ZmZlckxlbiwgYm9vbCB3YWl0KQogewogICAgIC8vTE9HRSgiZ2V0TWVzc2FnZVRvQ2xpZW50ICVpICVpIiwgYnVmZmVyTGVuLCB3YWl0KTsKKyAgICAqcmVjZWl2ZUxlbiA9IDA7CiAgICAgaWYgKCF3YWl0KSB7CiAgICAgICAgIGlmIChtSU8ubVRvQ2xpZW50LmlzRW1wdHkoKSkgewogICAgICAgICAgICAgLy8gTm8gbWVzc2FnZSB0byBnZXQgYW5kIG5vdCBnb2luZyB0byB3YWl0IGZvciBvbmUuCi0gICAgICAgICAgICByZWNlaXZlTGVuID0gMDsKICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICB9CiAgICAgfQpAQCAtNzUxLDE1ICs3NDQsMTkgQEAKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBpZiAoIXdhaXRGb3JTcGFjZSkgewotICAgICAgICBpZiAobUlPLm1Ub0NsaWVudC5nZXRGcmVlU3BhY2UoKSA8IGxlbikgeworICAgICAgICBpZiAoIW1JTy5tVG9DbGllbnQubWFrZVNwYWNlTm9uQmxvY2tpbmcobGVuICsgOCkpIHsKICAgICAgICAgICAgIC8vIE5vdCBlbm91Z2ggcm9vbSwgYW5kIG5vdCB3YWl0aW5nLgogICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9CiAgICAgfQogICAgIC8vTE9HRSgic2VuZE1lc3NhZ2VUb0NsaWVudCAyIik7Ci0gICAgdm9pZCAqcCA9IG1JTy5tVG9DbGllbnQucmVzZXJ2ZShsZW4pOwotICAgIG1lbWNweShwLCBkYXRhLCBsZW4pOwotICAgIG1JTy5tVG9DbGllbnQuY29tbWl0KGNtZElELCBsZW4pOworICAgIGlmIChsZW4gPiAwKSB7CisgICAgICAgIHZvaWQgKnAgPSBtSU8ubVRvQ2xpZW50LnJlc2VydmUobGVuKTsKKyAgICAgICAgbWVtY3B5KHAsIGRhdGEsIGxlbik7CisgICAgICAgIG1JTy5tVG9DbGllbnQuY29tbWl0KGNtZElELCBsZW4pOworICAgIH0gZWxzZSB7CisgICAgICAgIG1JTy5tVG9DbGllbnQuY29tbWl0KGNtZElELCAwKTsKKyAgICB9CiAgICAgLy9MT0dFKCJzZW5kTWVzc2FnZVRvQ2xpZW50IDMiKTsKICAgICByZXR1cm4gdHJ1ZTsKIH0KQEAgLTc5OSw4ICs3OTYsNyBAQAogICAgIExPR0UoIlJTIENvbnRleHQgZGVidWciKTsKIAogICAgIExPR0UoIiBFR0wgdmVyICVpICVpIiwgbUVHTC5tTWFqb3JWZXJzaW9uLCBtRUdMLm1NaW5vclZlcnNpb24pOwotICAgIExPR0UoIiBFR0wgY29udGV4dCAlcCAgc3VyZmFjZSAlcCwgIHc9JWkgaD0laSAgRGlzcGxheT0lcCIsIG1FR0wubUNvbnRleHQsCi0gICAgICAgICBtRUdMLm1TdXJmYWNlLCBtRUdMLm1XaWR0aCwgbUVHTC5tSGVpZ2h0LCBtRUdMLm1EaXNwbGF5KTsKKyAgICBMT0dFKCIgRUdMIGNvbnRleHQgJXAgIHN1cmZhY2UgJXAsICBEaXNwbGF5PSVwIiwgbUVHTC5tQ29udGV4dCwgbUVHTC5tU3VyZmFjZSwgbUVHTC5tRGlzcGxheSk7CiAgICAgTE9HRSgiIEdMIHZlbmRvcjogJXMiLCBtR0wubVZlbmRvcik7CiAgICAgTE9HRSgiIEdMIHJlbmRlcmVyOiAlcyIsIG1HTC5tUmVuZGVyZXIpOwogICAgIExPR0UoIiBHTCBWZXJzaW9uOiAlcyIsIG1HTC5tVmVyc2lvbik7CkBAIC04MjIsNiArODE4LDkgQEAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIG5hbWVzcGFjZSByZW5kZXJzY3JpcHQgewogCit2b2lkIHJzaV9Db250ZXh0RmluaXNoKENvbnRleHQgKnJzYykKK3sKK30KIAogdm9pZCByc2lfQ29udGV4dEJpbmRSb290U2NyaXB0KENvbnRleHQgKnJzYywgUnNTY3JpcHQgdnMpCiB7CkBAIC04NDEsOSArODQwLDkgQEAKICAgICBzLT5iaW5kVG9Db250ZXh0KCZyc2MtPm1TdGF0ZVNhbXBsZXIsIHNsb3QpOwogfQogCi12b2lkIHJzaV9Db250ZXh0QmluZFByb2dyYW1GcmFnbWVudFN0b3JlKENvbnRleHQgKnJzYywgUnNQcm9ncmFtRnJhZ21lbnRTdG9yZSB2cGZzKQordm9pZCByc2lfQ29udGV4dEJpbmRQcm9ncmFtU3RvcmUoQ29udGV4dCAqcnNjLCBSc1Byb2dyYW1TdG9yZSB2cGZzKQogewotICAgIFByb2dyYW1GcmFnbWVudFN0b3JlICpwZnMgPSBzdGF0aWNfY2FzdDxQcm9ncmFtRnJhZ21lbnRTdG9yZSAqPih2cGZzKTsKKyAgICBQcm9ncmFtU3RvcmUgKnBmcyA9IHN0YXRpY19jYXN0PFByb2dyYW1TdG9yZSAqPih2cGZzKTsKICAgICByc2MtPnNldEZyYWdtZW50U3RvcmUocGZzKTsKIH0KIApAQCAtODY1LDEyICs4NjQsMjQgQEAKICAgICByc2MtPnNldFZlcnRleChwdik7CiB9CiAKK3ZvaWQgcnNpX0NvbnRleHRCaW5kRm9udChDb250ZXh0ICpyc2MsIFJzRm9udCB2Zm9udCkKK3sKKyAgICBGb250ICpmb250ID0gc3RhdGljX2Nhc3Q8Rm9udCAqPih2Zm9udCk7CisgICAgcnNjLT5zZXRGb250KGZvbnQpOworfQorCiB2b2lkIHJzaV9Bc3NpZ25OYW1lKENvbnRleHQgKnJzYywgdm9pZCAqIG9iaiwgY29uc3QgY2hhciAqbmFtZSwgdWludDMyX3QgbGVuKQogewogICAgIE9iamVjdEJhc2UgKm9iID0gc3RhdGljX2Nhc3Q8T2JqZWN0QmFzZSAqPihvYmopOwogICAgIHJzYy0+YXNzaWduTmFtZShvYiwgbmFtZSwgbGVuKTsKIH0KIAordm9pZCByc2lfR2V0TmFtZShDb250ZXh0ICpyc2MsIHZvaWQgKiBvYmosIGNvbnN0IGNoYXIgKipuYW1lKQoreworICAgIE9iamVjdEJhc2UgKm9iID0gc3RhdGljX2Nhc3Q8T2JqZWN0QmFzZSAqPihvYmopOworICAgICgqbmFtZSkgPSBvYi0+Z2V0TmFtZSgpOworfQorCiB2b2lkIHJzaV9PYmpEZXN0cm95KENvbnRleHQgKnJzYywgdm9pZCAqb2JqKQogewogICAgIE9iamVjdEJhc2UgKm9iID0gc3RhdGljX2Nhc3Q8T2JqZWN0QmFzZSAqPihvYmopOwpAQCAtOTM4LDEyICs5NDksNiBAQAogICAgIGRlbGV0ZSByc2M7CiB9CiAKLXZvaWQgcnNPYmpEZXN0cm95T09CKFJzQ29udGV4dCB2cnNjLCB2b2lkICpvYmopCi17Ci0gICAgQ29udGV4dCAqIHJzYyA9IHN0YXRpY19jYXN0PENvbnRleHQgKj4odnJzYyk7Ci0gICAgcnNjLT5vYmpEZXN0cm95QWRkKHN0YXRpY19jYXN0PE9iamVjdEJhc2UgKj4ob2JqKSk7Ci19Ci0KIHVpbnQzMl90IHJzQ29udGV4dEdldE1lc3NhZ2UoUnNDb250ZXh0IHZyc2MsIHZvaWQgKmRhdGEsIHNpemVfdCAqcmVjZWl2ZUxlbiwgc2l6ZV90IGJ1ZmZlckxlbiwgYm9vbCB3YWl0KQogewogICAgIENvbnRleHQgKiByc2MgPSBzdGF0aWNfY2FzdDxDb250ZXh0ICo+KHZyc2MpOwpkaWZmIC0tZ2l0IGEvbGlicy9ycy9yc0NvbnRleHQuaCBiL2xpYnMvcnMvcnNDb250ZXh0LmgKaW5kZXggNzA5NzMwZS4uNmQxYTQxZCAxMDA2NDQKLS0tIGEvbGlicy9ycy9yc0NvbnRleHQuaAorKysgYi9saWJzL3JzL3JzQ29udGV4dC5oCkBAIC0xOCwxMiArMTgsMTIgQEAKICNkZWZpbmUgQU5EUk9JRF9SU19DT05URVhUX0gKIAogI2luY2x1ZGUgInJzVXRpbHMuaCIKKyNpbmNsdWRlICJyc011dGV4LmgiCiAKICNpbmNsdWRlICJyc1RocmVhZElPLmgiCiAjaW5jbHVkZSAicnNUeXBlLmgiCiAjaW5jbHVkZSAicnNNYXRyaXguaCIKICNpbmNsdWRlICJyc0FsbG9jYXRpb24uaCIKLSNpbmNsdWRlICJyc1NpbXBsZU1lc2guaCIKICNpbmNsdWRlICJyc01lc2guaCIKICNpbmNsdWRlICJyc0RldmljZS5oIgogI2luY2x1ZGUgInJzU2NyaXB0Qy5oIgpAQCAtMzEsOCArMzEsOSBAQAogI2luY2x1ZGUgInJzQWRhcHRlci5oIgogI2luY2x1ZGUgInJzU2FtcGxlci5oIgogI2luY2x1ZGUgInJzTGlnaHQuaCIKKyNpbmNsdWRlICJyc0ZvbnQuaCIKICNpbmNsdWRlICJyc1Byb2dyYW1GcmFnbWVudC5oIgotI2luY2x1ZGUgInJzUHJvZ3JhbUZyYWdtZW50U3RvcmUuaCIKKyNpbmNsdWRlICJyc1Byb2dyYW1TdG9yZS5oIgogI2luY2x1ZGUgInJzUHJvZ3JhbVJhc3Rlci5oIgogI2luY2x1ZGUgInJzUHJvZ3JhbVZlcnRleC5oIgogI2luY2x1ZGUgInJzU2hhZGVyQ2FjaGUuaCIKQEAgLTY0LDE3ICs2NSwxOSBAQAogICAgICAgICBTY3JpcHQgKiBtU2NyaXB0OwogICAgIH07CiAKKyAgICB0eXBlZGVmIHZvaWQgKCpXb3JrZXJDYWxsYmFja190KSh2b2lkICp1c3IsIHVpbnQzMl90IGlkeCk7CiAKICAgICAvL1N0cnVjdHVyZWRBbGxvY2F0aW9uQ29udGV4dCBtU3RhdGVBbGxvY2F0aW9uOwogICAgIEVsZW1lbnRTdGF0ZSBtU3RhdGVFbGVtZW50OwogICAgIFR5cGVTdGF0ZSBtU3RhdGVUeXBlOwogICAgIFNhbXBsZXJTdGF0ZSBtU3RhdGVTYW1wbGVyOwogICAgIFByb2dyYW1GcmFnbWVudFN0YXRlIG1TdGF0ZUZyYWdtZW50OwotICAgIFByb2dyYW1GcmFnbWVudFN0b3JlU3RhdGUgbVN0YXRlRnJhZ21lbnRTdG9yZTsKKyAgICBQcm9ncmFtU3RvcmVTdGF0ZSBtU3RhdGVGcmFnbWVudFN0b3JlOwogICAgIFByb2dyYW1SYXN0ZXJTdGF0ZSBtU3RhdGVSYXN0ZXI7CiAgICAgUHJvZ3JhbVZlcnRleFN0YXRlIG1TdGF0ZVZlcnRleDsKICAgICBMaWdodFN0YXRlIG1TdGF0ZUxpZ2h0OwogICAgIFZlcnRleEFycmF5U3RhdGUgbVN0YXRlVmVydGV4QXJyYXk7CisgICAgRm9udFN0YXRlIG1TdGF0ZUZvbnQ7CiAKICAgICBTY3JpcHRDU3RhdGUgbVNjcmlwdEM7CiAgICAgU2hhZGVyQ2FjaGUgbVNoYWRlckNhY2hlOwpAQCAtODQsMTQgKzg3LDE2IEBACiAgICAgdm9pZCBzZXRSYXN0ZXIoUHJvZ3JhbVJhc3RlciAqKTsKICAgICB2b2lkIHNldFZlcnRleChQcm9ncmFtVmVydGV4ICopOwogICAgIHZvaWQgc2V0RnJhZ21lbnQoUHJvZ3JhbUZyYWdtZW50ICopOwotICAgIHZvaWQgc2V0RnJhZ21lbnRTdG9yZShQcm9ncmFtRnJhZ21lbnRTdG9yZSAqKTsKKyAgICB2b2lkIHNldEZyYWdtZW50U3RvcmUoUHJvZ3JhbVN0b3JlICopOworICAgIHZvaWQgc2V0Rm9udChGb250ICopOwogCiAgICAgdm9pZCB1cGRhdGVTdXJmYWNlKHZvaWQgKnN1cik7CiAKICAgICBjb25zdCBQcm9ncmFtRnJhZ21lbnQgKiBnZXRGcmFnbWVudCgpIHtyZXR1cm4gbUZyYWdtZW50LmdldCgpO30KLSAgICBjb25zdCBQcm9ncmFtRnJhZ21lbnRTdG9yZSAqIGdldEZyYWdtZW50U3RvcmUoKSB7cmV0dXJuIG1GcmFnbWVudFN0b3JlLmdldCgpO30KKyAgICBjb25zdCBQcm9ncmFtU3RvcmUgKiBnZXRGcmFnbWVudFN0b3JlKCkge3JldHVybiBtRnJhZ21lbnRTdG9yZS5nZXQoKTt9CiAgICAgY29uc3QgUHJvZ3JhbVJhc3RlciAqIGdldFJhc3RlcigpIHtyZXR1cm4gbVJhc3Rlci5nZXQoKTt9CiAgICAgY29uc3QgUHJvZ3JhbVZlcnRleCAqIGdldFZlcnRleCgpIHtyZXR1cm4gbVZlcnRleC5nZXQoKTt9CisgICAgRm9udCAqIGdldEZvbnQoKSB7cmV0dXJuIG1Gb250LmdldCgpO30KIAogICAgIGJvb2wgc2V0dXBDaGVjaygpOwogICAgIGJvb2wgY2hlY2tEcml2ZXIoKSBjb25zdCB7cmV0dXJuIG1FR0wubVN1cmZhY2UgIT0gMDt9CkBAIC0xMDMsMTIgKzEwOCwxMCBAQAogCiAgICAgdm9pZCBhc3NpZ25OYW1lKE9iamVjdEJhc2UgKm9iaiwgY29uc3QgY2hhciAqbmFtZSwgdWludDMyX3QgbGVuKTsKICAgICB2b2lkIHJlbW92ZU5hbWUoT2JqZWN0QmFzZSAqb2JqKTsKLSAgICBPYmplY3RCYXNlICogbG9va3VwTmFtZShjb25zdCBjaGFyICpuYW1lKSBjb25zdDsKLSAgICB2b2lkIGFwcGVuZE5hbWVEZWZpbmVzKFN0cmluZzggKnN0cikgY29uc3Q7CiAKICAgICB1aW50MzJfdCBnZXRNZXNzYWdlVG9DbGllbnQodm9pZCAqZGF0YSwgc2l6ZV90ICpyZWNlaXZlTGVuLCBzaXplX3QgYnVmZmVyTGVuLCBib29sIHdhaXQpOwogICAgIGJvb2wgc2VuZE1lc3NhZ2VUb0NsaWVudCh2b2lkICpkYXRhLCB1aW50MzJfdCBjbWRJRCwgc2l6ZV90IGxlbiwgYm9vbCB3YWl0Rm9yU3BhY2UpOwotICAgIHVpbnQzMl90IHJ1blNjcmlwdChTY3JpcHQgKnMsIHVpbnQzMl90IGxhdW5jaElEKTsKKyAgICB1aW50MzJfdCBydW5TY3JpcHQoU2NyaXB0ICpzKTsKIAogICAgIHZvaWQgaW5pdFRvQ2xpZW50KCk7CiAgICAgdm9pZCBkZWluaXRUb0NsaWVudCgpOwpAQCAtMTE5LDE5ICsxMjIsMjEgQEAKICAgICBQcm9ncmFtVmVydGV4ICogZ2V0RGVmYXVsdFByb2dyYW1WZXJ0ZXgoKSBjb25zdCB7CiAgICAgICAgIHJldHVybiBtU3RhdGVWZXJ0ZXgubURlZmF1bHQuZ2V0KCk7CiAgICAgfQotICAgIFByb2dyYW1GcmFnbWVudFN0b3JlICogZ2V0RGVmYXVsdFByb2dyYW1GcmFnbWVudFN0b3JlKCkgY29uc3QgeworICAgIFByb2dyYW1TdG9yZSAqIGdldERlZmF1bHRQcm9ncmFtU3RvcmUoKSBjb25zdCB7CiAgICAgICAgIHJldHVybiBtU3RhdGVGcmFnbWVudFN0b3JlLm1EZWZhdWx0LmdldCgpOwogICAgIH0KICAgICBQcm9ncmFtUmFzdGVyICogZ2V0RGVmYXVsdFByb2dyYW1SYXN0ZXIoKSBjb25zdCB7CiAgICAgICAgIHJldHVybiBtU3RhdGVSYXN0ZXIubURlZmF1bHQuZ2V0KCk7CiAgICAgfQorICAgIEZvbnQqIGdldERlZmF1bHRGb250KCkgY29uc3QgeworICAgICAgICByZXR1cm4gbVN0YXRlRm9udC5tRGVmYXVsdC5nZXQoKTsKKyAgICB9CiAKLSAgICB1aW50MzJfdCBnZXRXaWR0aCgpIGNvbnN0IHtyZXR1cm4gbUVHTC5tV2lkdGg7fQotICAgIHVpbnQzMl90IGdldEhlaWdodCgpIGNvbnN0IHtyZXR1cm4gbUVHTC5tSGVpZ2h0O30KKyAgICB1aW50MzJfdCBnZXRXaWR0aCgpIGNvbnN0IHtyZXR1cm4gbVdpZHRoO30KKyAgICB1aW50MzJfdCBnZXRIZWlnaHQoKSBjb25zdCB7cmV0dXJuIG1IZWlnaHQ7fQogCiAKICAgICBUaHJlYWRJTyBtSU87Ci0gICAgdm9pZCBvYmpEZXN0cm95QWRkKE9iamVjdEJhc2UgKik7CiAKICAgICAvLyBUaW1lcnMKICAgICBlbnVtIFRpbWVycyB7CkBAIC0xNTYsMTcgKzE2MSwyMSBAQAogICAgICAgICBib29sIG1Mb2dTY3JpcHRzOwogICAgICAgICBib29sIG1Mb2dPYmplY3RzOwogICAgICAgICBib29sIG1Mb2dTaGFkZXJzOworICAgICAgICBib29sIG1Mb2dWaXN1YWw7CiAgICAgfSBwcm9wczsKIAogICAgIHZvaWQgZHVtcERlYnVnKCkgY29uc3Q7CiAgICAgdm9pZCBjaGVja0Vycm9yKGNvbnN0IGNoYXIgKikgY29uc3Q7CiAgICAgY29uc3QgY2hhciAqIGdldEVycm9yKFJzRXJyb3IgKik7Ci0gICAgdm9pZCBzZXRFcnJvcihSc0Vycm9yIGUsIGNvbnN0IGNoYXIgKm1zZyk7CisgICAgdm9pZCBzZXRFcnJvcihSc0Vycm9yIGUsIGNvbnN0IGNoYXIgKm1zZyA9IE5VTEwpOwogCiAgICAgbXV0YWJsZSBjb25zdCBPYmplY3RCYXNlICogbU9iakhlYWQ7CiAKICAgICBib29sIGV4dF9PRVNfdGV4dHVyZV9ucG90KCkgY29uc3Qge3JldHVybiBtR0wuT0VTX3RleHR1cmVfbnBvdDt9CiAKKyAgICB2b2lkIGxhdW5jaFRocmVhZHMoV29ya2VyQ2FsbGJhY2tfdCBjYmssIHZvaWQgKmRhdGEpOworICAgIHVpbnQzMl90IGdldFdvcmtlclBvb2xTaXplKCkgY29uc3Qge3JldHVybiAodWludDMyX3QpbVdvcmtlcnMubVJ1bm5pbmdDb3VudDt9CisKIHByb3RlY3RlZDoKICAgICBEZXZpY2UgKm1EZXY7CiAKQEAgLTE3Nyw4ICsxODYsNiBAQAogICAgICAgICBFR0xDb25maWcgbUNvbmZpZzsKICAgICAgICAgRUdMQ29udGV4dCBtQ29udGV4dDsKICAgICAgICAgRUdMU3VyZmFjZSBtU3VyZmFjZTsKLSAgICAgICAgRUdMaW50IG1XaWR0aDsKLSAgICAgICAgRUdMaW50IG1IZWlnaHQ7CiAgICAgICAgIEVHTERpc3BsYXkgbURpc3BsYXk7CiAgICAgfSBtRUdMOwogCkBAIC0yMTksMjIgKzIyNiwyOCBAQAogICAgIHB0aHJlYWRfdCBtVGhyZWFkSWQ7CiAgICAgcGlkX3QgbU5hdGl2ZVRocmVhZElkOwogCisgICAgc3RydWN0IFdvcmtlcnMgeworICAgICAgICB2b2xhdGlsZSBpbnQgbVJ1bm5pbmdDb3VudDsKKyAgICAgICAgdm9sYXRpbGUgaW50IG1MYXVuY2hDb3VudDsKKyAgICAgICAgdWludDMyX3QgbUNvdW50OworICAgICAgICBwdGhyZWFkX3QgKm1UaHJlYWRJZDsKKyAgICAgICAgcGlkX3QgKm1OYXRpdmVUaHJlYWRJZDsKKyAgICAgICAgU2lnbmFsIG1Db21wbGV0ZVNpZ25hbDsKKworICAgICAgICBTaWduYWwgKm1MYXVuY2hTaWduYWxzOworICAgICAgICBXb3JrZXJDYWxsYmFja190IG1MYXVuY2hDYWxsYmFjazsKKyAgICAgICAgdm9pZCAqbUxhdW5jaERhdGE7CisgICAgfTsKKyAgICBXb3JrZXJzIG1Xb3JrZXJzOworCiAgICAgT2JqZWN0QmFzZVJlZjxTY3JpcHQ+IG1Sb290U2NyaXB0OwogICAgIE9iamVjdEJhc2VSZWY8UHJvZ3JhbUZyYWdtZW50PiBtRnJhZ21lbnQ7CiAgICAgT2JqZWN0QmFzZVJlZjxQcm9ncmFtVmVydGV4PiBtVmVydGV4OwotICAgIE9iamVjdEJhc2VSZWY8UHJvZ3JhbUZyYWdtZW50U3RvcmU+IG1GcmFnbWVudFN0b3JlOworICAgIE9iamVjdEJhc2VSZWY8UHJvZ3JhbVN0b3JlPiBtRnJhZ21lbnRTdG9yZTsKICAgICBPYmplY3RCYXNlUmVmPFByb2dyYW1SYXN0ZXI+IG1SYXN0ZXI7CisgICAgT2JqZWN0QmFzZVJlZjxGb250PiBtRm9udDsKIAotCi0gICAgc3RydWN0IE9iakRlc3Ryb3lPT0IgewotICAgICAgICBwdGhyZWFkX211dGV4X3QgbU11dGV4OwotICAgICAgICBWZWN0b3I8T2JqZWN0QmFzZSAqPiBtRGVzdHJveUxpc3Q7Ci0gICAgICAgIGJvb2wgbU5lZWRUb0VtcHR5OwotICAgIH07Ci0gICAgT2JqRGVzdHJveU9PQiBtT2JqRGVzdHJveTsKLSAgICBib29sIG9iakRlc3Ryb3lPT0JJbml0KCk7Ci0gICAgdm9pZCBvYmpEZXN0cm95T09CUnVuKCk7Ci0gICAgdm9pZCBvYmpEZXN0cm95T09CRGVzdHJveSgpOworICAgIHZvaWQgZGlzcGxheURlYnVnU3RhdHMoKTsKIAogcHJpdmF0ZToKICAgICBDb250ZXh0KCk7CkBAIC0yNDUsNiArMjU4LDcgQEAKICAgICB1aW50MzJfdCBydW5Sb290U2NyaXB0KCk7CiAKICAgICBzdGF0aWMgdm9pZCAqIHRocmVhZFByb2Modm9pZCAqKTsKKyAgICBzdGF0aWMgdm9pZCAqIGhlbHBlclRocmVhZFByb2Modm9pZCAqKTsKIAogICAgIEFOYXRpdmVXaW5kb3cgKm1XbmRTdXJmYWNlOwogCmRpZmYgLS1naXQgYS9saWJzL3JzL3JzQ29udGV4dEhvc3RTdHViLmggYi9saWJzL3JzL3JzQ29udGV4dEhvc3RTdHViLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzQzNzYwNgotLS0gL2Rldi9udWxsCisrKyBiL2xpYnMvcnMvcnNDb250ZXh0SG9zdFN0dWIuaApAQCAtMCwwICsxLDE1MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9SU19DT05URVhUX0hPU1RfU1RVQl9ICisjZGVmaW5lIEFORFJPSURfUlNfQ09OVEVYVF9IT1NUX1NUVUJfSAorCisjaW5jbHVkZSAicnNVdGlscy5oIgorLy8jaW5jbHVkZSAicnNNdXRleC5oIgorCisvLyNpbmNsdWRlICJyc1RocmVhZElPLmgiCisjaW5jbHVkZSAicnNUeXBlLmgiCisjaW5jbHVkZSAicnNNYXRyaXguaCIKKyNpbmNsdWRlICJyc0FsbG9jYXRpb24uaCIKKyNpbmNsdWRlICJyc01lc2guaCIKKy8vI2luY2x1ZGUgInJzRGV2aWNlLmgiCisjaW5jbHVkZSAicnNTY3JpcHRDLmgiCisjaW5jbHVkZSAicnNBbGxvY2F0aW9uLmgiCisjaW5jbHVkZSAicnNBZGFwdGVyLmgiCisjaW5jbHVkZSAicnNTYW1wbGVyLmgiCisjaW5jbHVkZSAicnNMaWdodC5oIgorI2luY2x1ZGUgInJzUHJvZ3JhbUZyYWdtZW50LmgiCisjaW5jbHVkZSAicnNQcm9ncmFtU3RvcmUuaCIKKyNpbmNsdWRlICJyc1Byb2dyYW1SYXN0ZXIuaCIKKyNpbmNsdWRlICJyc1Byb2dyYW1WZXJ0ZXguaCIKKyNpbmNsdWRlICJyc1NoYWRlckNhY2hlLmgiCisjaW5jbHVkZSAicnNWZXJ0ZXhBcnJheS5oIgorCisvLyNpbmNsdWRlICJyc2dBcGlTdHJ1Y3RzLmgiCisvLyNpbmNsdWRlICJyc0xvY2tsZXNzRmlmby5oIgorCisvLyNpbmNsdWRlIDx1aS9lZ2wvYW5kcm9pZF9uYXRpdmVzLmg+CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorbmFtZXNwYWNlIGFuZHJvaWQgeworCituYW1lc3BhY2UgcmVuZGVyc2NyaXB0IHsKKworY2xhc3MgRGV2aWNlOworCitjbGFzcyBDb250ZXh0Cit7CitwdWJsaWM6CisgICAgQ29udGV4dChEZXZpY2UgKiwgYm9vbCBpc0dyYXBoaWNzLCBib29sIHVzZURlcHRoKSB7CisgICAgICAgIG1PYmpIZWFkID0gTlVMTDsKKyAgICB9CisgICAgfkNvbnRleHQoKSB7CisgICAgfQorCisKKyAgICAvL1N0cnVjdHVyZWRBbGxvY2F0aW9uQ29udGV4dCBtU3RhdGVBbGxvY2F0aW9uOworICAgIEVsZW1lbnRTdGF0ZSBtU3RhdGVFbGVtZW50OworICAgIFR5cGVTdGF0ZSBtU3RhdGVUeXBlOworICAgIFNhbXBsZXJTdGF0ZSBtU3RhdGVTYW1wbGVyOworICAgIC8vUHJvZ3JhbUZyYWdtZW50U3RhdGUgbVN0YXRlRnJhZ21lbnQ7CisgICAgUHJvZ3JhbVN0b3JlU3RhdGUgbVN0YXRlRnJhZ21lbnRTdG9yZTsKKyAgICAvL1Byb2dyYW1SYXN0ZXJTdGF0ZSBtU3RhdGVSYXN0ZXI7CisgICAgLy9Qcm9ncmFtVmVydGV4U3RhdGUgbVN0YXRlVmVydGV4OworICAgIExpZ2h0U3RhdGUgbVN0YXRlTGlnaHQ7CisgICAgVmVydGV4QXJyYXlTdGF0ZSBtU3RhdGVWZXJ0ZXhBcnJheTsKKworICAgIC8vU2NyaXB0Q1N0YXRlIG1TY3JpcHRDOworICAgIFNoYWRlckNhY2hlIG1TaGFkZXJDYWNoZTsKKworCisgICAgLy9ib29sIHNldHVwQ2hlY2soKTsKKyAgICBib29sIGNoZWNrRHJpdmVyKCkgY29uc3Qge3JldHVybiBmYWxzZTt9CisKKyAgICBQcm9ncmFtRnJhZ21lbnQgKiBnZXREZWZhdWx0UHJvZ3JhbUZyYWdtZW50KCkgY29uc3QgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgUHJvZ3JhbVZlcnRleCAqIGdldERlZmF1bHRQcm9ncmFtVmVydGV4KCkgY29uc3QgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgUHJvZ3JhbVN0b3JlICogZ2V0RGVmYXVsdFByb2dyYW1TdG9yZSgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIFByb2dyYW1SYXN0ZXIgKiBnZXREZWZhdWx0UHJvZ3JhbVJhc3RlcigpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgdWludDMyX3QgZ2V0V2lkdGgoKSBjb25zdCB7cmV0dXJuIDA7fQorICAgIHVpbnQzMl90IGdldEhlaWdodCgpIGNvbnN0IHtyZXR1cm4gMDt9CisKKyAgICAvLyBUaW1lcnMKKyAgICBlbnVtIFRpbWVycyB7CisgICAgICAgIFJTX1RJTUVSX0lETEUsCisgICAgICAgIFJTX1RJTUVSX0lOVEVSTkFMLAorICAgICAgICBSU19USU1FUl9TQ1JJUFQsCisgICAgICAgIFJTX1RJTUVSX0NMRUFSX1NXQVAsCisgICAgICAgIF9SU19USU1FUl9UT1RBTAorICAgIH07CisKKyAgICBib29sIGNoZWNrVmVyc2lvbjFfMSgpIGNvbnN0IHtyZXR1cm4gZmFsc2U7IH0KKyAgICBib29sIGNoZWNrVmVyc2lvbjJfMCgpIGNvbnN0IHtyZXR1cm4gZmFsc2U7IH0KKworICAgIHN0cnVjdCB7CisgICAgICAgIGJvb2wgbUxvZ1RpbWVzOworICAgICAgICBib29sIG1Mb2dTY3JpcHRzOworICAgICAgICBib29sIG1Mb2dPYmplY3RzOworICAgICAgICBib29sIG1Mb2dTaGFkZXJzOworICAgIH0gcHJvcHM7CisKKyAgICB2b2lkIGR1bXBEZWJ1ZygpIGNvbnN0IHsgICAgfQorICAgIHZvaWQgY2hlY2tFcnJvcihjb25zdCBjaGFyICopIGNvbnN0IHsgIH07CisgICAgdm9pZCBzZXRFcnJvcihSc0Vycm9yIGUsIGNvbnN0IGNoYXIgKm1zZyA9IE5VTEwpIHsgIH0KKworICAgIG11dGFibGUgY29uc3QgT2JqZWN0QmFzZSAqIG1PYmpIZWFkOworCisgICAgYm9vbCBleHRfT0VTX3RleHR1cmVfbnBvdCgpIGNvbnN0IHtyZXR1cm4gbUdMLk9FU190ZXh0dXJlX25wb3Q7fQorCitwcm90ZWN0ZWQ6CisKKyAgICBzdHJ1Y3QgeworICAgICAgICBjb25zdCB1aW50OF90ICogbVZlbmRvcjsKKyAgICAgICAgY29uc3QgdWludDhfdCAqIG1SZW5kZXJlcjsKKyAgICAgICAgY29uc3QgdWludDhfdCAqIG1WZXJzaW9uOworICAgICAgICBjb25zdCB1aW50OF90ICogbUV4dGVuc2lvbnM7CisKKyAgICAgICAgdWludDMyX3QgbU1ham9yVmVyc2lvbjsKKyAgICAgICAgdWludDMyX3QgbU1pbm9yVmVyc2lvbjsKKworICAgICAgICBpbnQzMl90IG1NYXhWYXJ5aW5nVmVjdG9yczsKKyAgICAgICAgaW50MzJfdCBtTWF4VGV4dHVyZUltYWdlVW5pdHM7CisKKyAgICAgICAgaW50MzJfdCBtTWF4RnJhZ21lbnRUZXh0dXJlSW1hZ2VVbml0czsKKyAgICAgICAgaW50MzJfdCBtTWF4RnJhZ21lbnRVbmlmb3JtVmVjdG9yczsKKworICAgICAgICBpbnQzMl90IG1NYXhWZXJ0ZXhBdHRyaWJzOworICAgICAgICBpbnQzMl90IG1NYXhWZXJ0ZXhVbmlmb3JtVmVjdG9yczsKKyAgICAgICAgaW50MzJfdCBtTWF4VmVydGV4VGV4dHVyZVVuaXRzOworCisgICAgICAgIGJvb2wgT0VTX3RleHR1cmVfbnBvdDsKKyAgICB9IG1HTDsKKworfTsKKworfQorfQorI2VuZGlmCmRpZmYgLS1naXQgYS9saWJzL3JzL3JzRGV2aWNlLmNwcCBiL2xpYnMvcnMvcnNEZXZpY2UuY3BwCmluZGV4IGI2NzBhZDQuLmE5NmIxMTQgMTAwNjQ0Ci0tLSBhL2xpYnMvcnMvcnNEZXZpY2UuY3BwCisrKyBiL2xpYnMvcnMvcnNEZXZpY2UuY3BwCkBAIC0xNSw3ICsxNSwxMSBAQAogICovCiAKICNpbmNsdWRlICJyc0RldmljZS5oIgorI2lmbmRlZiBBTkRST0lEX1JTX0JVSUxEX0ZPUl9IT1NUCiAjaW5jbHVkZSAicnNDb250ZXh0LmgiCisjZWxzZQorI2luY2x1ZGUgInJzQ29udGV4dEhvc3RTdHViLmgiCisjZW5kaWYKIAogdXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7CiB1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDo6cmVuZGVyc2NyaXB0OwpAQCAtMzMsNyArMzcsNyBAQAogCiB2b2lkIERldmljZTo6YWRkQ29udGV4dChDb250ZXh0ICpyc2MpCiB7Ci0gICAgbUNvbnRleHRzLmFkZChyc2MpOworICAgIG1Db250ZXh0cy5wdXNoKHJzYyk7CiB9CiAKIHZvaWQgRGV2aWNlOjpyZW1vdmVDb250ZXh0KENvbnRleHQgKnJzYykKZGlmZiAtLWdpdCBhL2xpYnMvcnMvcnNFbGVtZW50LmNwcCBiL2xpYnMvcnMvcnNFbGVtZW50LmNwcAppbmRleCA2Mjg4YmM0Li5kMDkwOWM4IDEwMDY0NAotLS0gYS9saWJzL3JzL3JzRWxlbWVudC5jcHAKKysrIGIvbGlicy9ycy9yc0VsZW1lbnQuY3BwCkBAIC0xNCw5ICsxNCwxNCBAQAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAotI2luY2x1ZGUgInJzQ29udGV4dC5oIgogCisjaWZuZGVmIEFORFJPSURfUlNfQlVJTERfRk9SX0hPU1QKKyNpbmNsdWRlICJyc0NvbnRleHQuaCIKICNpbmNsdWRlIDxHTEVTL2dsLmg+CisjZWxzZQorI2luY2x1ZGUgInJzQ29udGV4dEhvc3RTdHViLmgiCisjaW5jbHVkZSA8T3BlbkdML2dsLmg+CisjZW5kaWYKIAogdXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7CiB1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDo6cmVuZGVyc2NyaXB0OwpAQCAtMjksNiArMzQsNyBAQAogICAgIG1BbGxvY0xpbmUgPSBfX0xJTkVfXzsKICAgICBtRmllbGRzID0gTlVMTDsKICAgICBtRmllbGRDb3VudCA9IDA7CisgICAgbUhhc1JlZmVyZW5jZSA9IGZhbHNlOwogfQogCiAKQEAgLTQ4LDYgKzU0LDcgQEAKICAgICBkZWxldGUgW10gbUZpZWxkczsKICAgICBtRmllbGRzID0gTlVMTDsKICAgICBtRmllbGRDb3VudCA9IDA7CisgICAgbUhhc1JlZmVyZW5jZSA9IGZhbHNlOwogfQogCiBzaXplX3QgRWxlbWVudDo6Z2V0U2l6ZUJpdHMoKSBjb25zdApAQCAtNTgsMjAgKzY1LDExIEBACiAKICAgICBzaXplX3QgdG90YWwgPSAwOwogICAgIGZvciAoc2l6ZV90IGN0PTA7IGN0IDwgbUZpZWxkQ291bnQ7IGN0KyspIHsKLSAgICAgICAgdG90YWwgKz0gbUZpZWxkc1tjdF0uZS0+bUJpdHM7CisgICAgICAgIHRvdGFsICs9IG1GaWVsZHNbY3RdLmUtPm1CaXRzICogbUZpZWxkc1tjdF0uYXJyYXlTaXplOzsKICAgICB9CiAgICAgcmV0dXJuIHRvdGFsOwogfQogCi1zaXplX3QgRWxlbWVudDo6Z2V0RmllbGRPZmZzZXRCaXRzKHVpbnQzMl90IGNvbXBvbmVudE51bWJlcikgY29uc3QKLXsKLSAgICBzaXplX3Qgb2Zmc2V0ID0gMDsKLSAgICBmb3IgKHVpbnQzMl90IGN0ID0gMDsgY3QgPCBjb21wb25lbnROdW1iZXI7IGN0KyspIHsKLSAgICAgICAgb2Zmc2V0ICs9IG1GaWVsZHNbY3RdLmUtPm1CaXRzOwotICAgIH0KLSAgICByZXR1cm4gb2Zmc2V0OwotfQotCiB2b2lkIEVsZW1lbnQ6OmR1bXBMT0dWKGNvbnN0IGNoYXIgKnByZWZpeCkgY29uc3QKIHsKICAgICBPYmplY3RCYXNlOjpkdW1wTE9HVihwcmVmaXgpOwpAQCAtODMsNiArODEsMTAxIEBACiAgICAgfQogfQogCit2b2lkIEVsZW1lbnQ6OnNlcmlhbGl6ZShPU3RyZWFtICpzdHJlYW0pIGNvbnN0Cit7CisgICAgLy8gTmVlZCB0byBpZGVudGlmeSBvdXJzZWx2ZXMKKyAgICBzdHJlYW0tPmFkZFUzMigodWludDMyX3QpZ2V0Q2xhc3NJZCgpKTsKKworICAgIFN0cmluZzggbmFtZShnZXROYW1lKCkpOworICAgIHN0cmVhbS0+YWRkU3RyaW5nKCZuYW1lKTsKKworICAgIG1Db21wb25lbnQuc2VyaWFsaXplKHN0cmVhbSk7CisKKyAgICAvLyBOb3cgc2VyaWFsaXplIGFsbCB0aGUgZmllbGRzCisgICAgc3RyZWFtLT5hZGRVMzIobUZpZWxkQ291bnQpOworICAgIGZvcih1aW50MzJfdCBjdCA9IDA7IGN0IDwgbUZpZWxkQ291bnQ7IGN0KyspIHsKKyAgICAgICAgc3RyZWFtLT5hZGRTdHJpbmcoJm1GaWVsZHNbY3RdLm5hbWUpOworICAgICAgICBzdHJlYW0tPmFkZFUzMihtRmllbGRzW2N0XS5hcnJheVNpemUpOworICAgICAgICBtRmllbGRzW2N0XS5lLT5zZXJpYWxpemUoc3RyZWFtKTsKKyAgICB9Cit9CisKK0VsZW1lbnQgKkVsZW1lbnQ6OmNyZWF0ZUZyb21TdHJlYW0oQ29udGV4dCAqcnNjLCBJU3RyZWFtICpzdHJlYW0pCit7CisgICAgLy8gRmlyc3QgbWFrZSBzdXJlIHdlIGFyZSByZWFkaW5nIHRoZSBjb3JyZWN0IG9iamVjdAorICAgIFJzQTNEQ2xhc3NJRCBjbGFzc0lEID0gKFJzQTNEQ2xhc3NJRClzdHJlYW0tPmxvYWRVMzIoKTsKKyAgICBpZihjbGFzc0lEICE9IFJTX0EzRF9DTEFTU19JRF9FTEVNRU5UKSB7CisgICAgICAgIExPR0UoImVsZW1lbnQgbG9hZGluZyBza2lwcGVkIGR1ZSB0byBpbnZhbGlkIGNsYXNzIGlkXG4iKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgU3RyaW5nOCBuYW1lOworICAgIHN0cmVhbS0+bG9hZFN0cmluZygmbmFtZSk7CisKKyAgICBFbGVtZW50ICplbGVtID0gbmV3IEVsZW1lbnQocnNjKTsKKyAgICBlbGVtLT5tQ29tcG9uZW50LmxvYWRGcm9tU3RyZWFtKHN0cmVhbSk7CisgICAgZWxlbS0+bUJpdHMgPSBlbGVtLT5tQ29tcG9uZW50LmdldEJpdHMoKTsKKyAgICBlbGVtLT5tSGFzUmVmZXJlbmNlID0gZWxlbS0+bUNvbXBvbmVudC5pc1JlZmVyZW5jZSgpOworCisgICAgZWxlbS0+bUZpZWxkQ291bnQgPSBzdHJlYW0tPmxvYWRVMzIoKTsKKyAgICBpZihlbGVtLT5tRmllbGRDb3VudCkgeworICAgICAgICB1aW50MzJfdCBvZmZzZXQgPSAwOworICAgICAgICBlbGVtLT5tRmllbGRzID0gbmV3IEVsZW1lbnRGaWVsZF90IFtlbGVtLT5tRmllbGRDb3VudF07CisgICAgICAgIGZvcih1aW50MzJfdCBjdCA9IDA7IGN0IDwgZWxlbS0+bUZpZWxkQ291bnQ7IGN0ICsrKSB7CisgICAgICAgICAgICBzdHJlYW0tPmxvYWRTdHJpbmcoJmVsZW0tPm1GaWVsZHNbY3RdLm5hbWUpOworICAgICAgICAgICAgZWxlbS0+bUZpZWxkc1tjdF0uYXJyYXlTaXplID0gc3RyZWFtLT5sb2FkVTMyKCk7CisgICAgICAgICAgICBFbGVtZW50ICpmaWVsZEVsZW0gPSBFbGVtZW50OjpjcmVhdGVGcm9tU3RyZWFtKHJzYywgc3RyZWFtKTsKKyAgICAgICAgICAgIGVsZW0tPm1GaWVsZHNbY3RdLmUuc2V0KGZpZWxkRWxlbSk7CisgICAgICAgICAgICBlbGVtLT5tRmllbGRzW2N0XS5vZmZzZXRCaXRzID0gb2Zmc2V0OworICAgICAgICAgICAgb2Zmc2V0ICs9IGZpZWxkRWxlbS0+Z2V0U2l6ZUJpdHMoKTsKKyAgICAgICAgICAgIC8vIENoZWNrIGlmIG91ciBzdWItZWxlbWVudHMgaGF2ZSByZWZlcmVuY2VzCisgICAgICAgICAgICBpZihmaWVsZEVsZW0tPm1IYXNSZWZlcmVuY2UpIHsKKyAgICAgICAgICAgICAgICBlbGVtLT5tSGFzUmVmZXJlbmNlID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIFdlIG5lZWQgdG8gY2hlY2sgaWYgdGhpcyBhbHJlYWR5IGV4aXN0cworICAgIGZvciAodWludDMyX3QgY3Q9MDsgY3QgPCByc2MtPm1TdGF0ZUVsZW1lbnQubUVsZW1lbnRzLnNpemUoKTsgY3QrKykgeworICAgICAgICBFbGVtZW50ICplZSA9IHJzYy0+bVN0YXRlRWxlbWVudC5tRWxlbWVudHNbY3RdOworCisgICAgICAgIGlmICghZWUtPmdldEZpZWxkQ291bnQoKSApIHsKKworICAgICAgICAgICAgaWYoKGVlLT5nZXRDb21wb25lbnQoKS5nZXRUeXBlKCkgPT0gZWxlbS0+Z2V0Q29tcG9uZW50KCkuZ2V0VHlwZSgpKSAmJgorICAgICAgICAgICAgICAgKGVlLT5nZXRDb21wb25lbnQoKS5nZXRLaW5kKCkgPT0gZWxlbS0+Z2V0Q29tcG9uZW50KCkuZ2V0S2luZCgpKSAmJgorICAgICAgICAgICAgICAgKGVlLT5nZXRDb21wb25lbnQoKS5nZXRJc05vcm1hbGl6ZWQoKSA9PSBlbGVtLT5nZXRDb21wb25lbnQoKS5nZXRJc05vcm1hbGl6ZWQoKSkgJiYKKyAgICAgICAgICAgICAgIChlZS0+Z2V0Q29tcG9uZW50KCkuZ2V0VmVjdG9yU2l6ZSgpID09IGVsZW0tPmdldENvbXBvbmVudCgpLmdldFZlY3RvclNpemUoKSkpIHsKKyAgICAgICAgICAgICAgICAvLyBNYXRjaAorICAgICAgICAgICAgICAgIGRlbGV0ZSBlbGVtOworICAgICAgICAgICAgICAgIGVlLT5pbmNVc2VyUmVmKCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIGVlOworICAgICAgICAgICAgfQorCisgICAgICAgIH0gZWxzZSBpZiAoZWUtPmdldEZpZWxkQ291bnQoKSA9PSBlbGVtLT5tRmllbGRDb3VudCkgeworCisgICAgICAgICAgICBib29sIG1hdGNoID0gdHJ1ZTsKKyAgICAgICAgICAgIGZvciAodWludDMyX3QgaT0wOyBpIDwgZWxlbS0+bUZpZWxkQ291bnQ7IGkrKykgeworICAgICAgICAgICAgICAgIGlmICgoZWUtPm1GaWVsZHNbaV0uZS5nZXQoKSAhPSBlbGVtLT5tRmllbGRzW2ldLmUuZ2V0KCkpIHx8CisgICAgICAgICAgICAgICAgICAgIChlZS0+bUZpZWxkc1tpXS5uYW1lLmxlbmd0aCgpICE9IGVsZW0tPm1GaWVsZHNbaV0ubmFtZS5sZW5ndGgoKSkgfHwKKyAgICAgICAgICAgICAgICAgICAgKGVlLT5tRmllbGRzW2ldLm5hbWUgIT0gZWxlbS0+bUZpZWxkc1tpXS5uYW1lKSB8fAorICAgICAgICAgICAgICAgICAgICAoZWUtPm1GaWVsZHNbaV0uYXJyYXlTaXplICE9IGVsZW0tPm1GaWVsZHNbaV0uYXJyYXlTaXplKSkgeworICAgICAgICAgICAgICAgICAgICBtYXRjaCA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobWF0Y2gpIHsKKyAgICAgICAgICAgICAgICBkZWxldGUgZWxlbTsKKyAgICAgICAgICAgICAgICBlZS0+aW5jVXNlclJlZigpOworICAgICAgICAgICAgICAgIHJldHVybiBlZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgfQorCisgICAgcnNjLT5tU3RhdGVFbGVtZW50Lm1FbGVtZW50cy5wdXNoKGVsZW0pOworICAgIHJldHVybiBlbGVtOworfQorCiAKIGNvbnN0IEVsZW1lbnQgKiBFbGVtZW50OjpjcmVhdGUoQ29udGV4dCAqcnNjLCBSc0RhdGFUeXBlIGR0LCBSc0RhdGFLaW5kIGRrLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNOb3JtLCB1aW50MzJfdCB2ZWNTaXplKQpAQCAtMTA0LDEyICsxOTcsMTMgQEAKICAgICBFbGVtZW50ICplID0gbmV3IEVsZW1lbnQocnNjKTsKICAgICBlLT5tQ29tcG9uZW50LnNldChkdCwgZGssIGlzTm9ybSwgdmVjU2l6ZSk7CiAgICAgZS0+bUJpdHMgPSBlLT5tQ29tcG9uZW50LmdldEJpdHMoKTsKKyAgICBlLT5tSGFzUmVmZXJlbmNlID0gZS0+bUNvbXBvbmVudC5pc1JlZmVyZW5jZSgpOwogICAgIHJzYy0+bVN0YXRlRWxlbWVudC5tRWxlbWVudHMucHVzaChlKTsKICAgICByZXR1cm4gZTsKIH0KIAogY29uc3QgRWxlbWVudCAqIEVsZW1lbnQ6OmNyZWF0ZShDb250ZXh0ICpyc2MsIHNpemVfdCBjb3VudCwgY29uc3QgRWxlbWVudCAqKmVpbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICoqbmluLCBjb25zdCBzaXplX3QgKiBsZW5ndGhzKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKipuaW4sIGNvbnN0IHNpemVfdCAqIGxlbmd0aHMsIGNvbnN0IHVpbnQzMl90ICphc2luKQogewogICAgIC8vIExvb2sgZm9yIGFuIGV4aXN0aW5nIG1hdGNoLgogICAgIGZvciAodWludDMyX3QgY3Q9MDsgY3QgPCByc2MtPm1TdGF0ZUVsZW1lbnQubUVsZW1lbnRzLnNpemUoKTsgY3QrKykgewpAQCAtMTE5LDcgKzIxMyw4IEBACiAgICAgICAgICAgICBmb3IgKHVpbnQzMl90IGk9MDsgaSA8IGNvdW50OyBpKyspIHsKICAgICAgICAgICAgICAgICBpZiAoKGVlLT5tRmllbGRzW2ldLmUuZ2V0KCkgIT0gZWluW2ldKSB8fAogICAgICAgICAgICAgICAgICAgICAoZWUtPm1GaWVsZHNbaV0ubmFtZS5sZW5ndGgoKSAhPSBsZW5ndGhzW2ldKSB8fAotICAgICAgICAgICAgICAgICAgICAoZWUtPm1GaWVsZHNbaV0ubmFtZSAhPSBuaW5baV0pKSB7CisgICAgICAgICAgICAgICAgICAgIChlZS0+bUZpZWxkc1tpXS5uYW1lICE9IG5pbltpXSkgfHwKKyAgICAgICAgICAgICAgICAgICAgKGVlLT5tRmllbGRzW2ldLmFycmF5U2l6ZSAhPSBhc2luW2ldKSkgewogICAgICAgICAgICAgICAgICAgICBtYXRjaCA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICB9CkBAIC0xMzQsNTQgKzIyOSwyMyBAQAogICAgIEVsZW1lbnQgKmUgPSBuZXcgRWxlbWVudChyc2MpOwogICAgIGUtPm1GaWVsZHMgPSBuZXcgRWxlbWVudEZpZWxkX3QgW2NvdW50XTsKICAgICBlLT5tRmllbGRDb3VudCA9IGNvdW50OworICAgIHNpemVfdCBiaXRzID0gMDsKICAgICBmb3IgKHNpemVfdCBjdD0wOyBjdCA8IGNvdW50OyBjdCsrKSB7CiAgICAgICAgIGUtPm1GaWVsZHNbY3RdLmUuc2V0KGVpbltjdF0pOwogICAgICAgICBlLT5tRmllbGRzW2N0XS5uYW1lLnNldFRvKG5pbltjdF0sIGxlbmd0aHNbY3RdKTsKKyAgICAgICAgZS0+bUZpZWxkc1tjdF0ub2Zmc2V0Qml0cyA9IGJpdHM7CisgICAgICAgIGUtPm1GaWVsZHNbY3RdLmFycmF5U2l6ZSA9IGFzaW5bY3RdOworICAgICAgICBiaXRzICs9IGVpbltjdF0tPmdldFNpemVCaXRzKCk7CisKKyAgICAgICAgaWYgKGVpbltjdF0tPm1IYXNSZWZlcmVuY2UpIHsKKyAgICAgICAgICAgIGUtPm1IYXNSZWZlcmVuY2UgPSB0cnVlOworICAgICAgICB9CiAgICAgfQogCiAgICAgcnNjLT5tU3RhdGVFbGVtZW50Lm1FbGVtZW50cy5wdXNoKGUpOwogICAgIHJldHVybiBlOwogfQogCi1TdHJpbmc4IEVsZW1lbnQ6OmdldENTdHJ1Y3RCb2R5KHVpbnQzMl90IGluZGVudCkgY29uc3QKLXsKLSAgICBTdHJpbmc4IHNpOwotICAgIGZvciAodWludDMyX3QgY3Q9MDsgY3QgPCBpbmRlbnQ7IGN0KyspIHsKLSAgICAgICAgc2kuYXBwZW5kKCIgIik7Ci0gICAgfQotCi0gICAgU3RyaW5nOCBzKHNpKTsKLSAgICBzLmFwcGVuZCgie1xuIik7Ci0gICAgZm9yICh1aW50MzJfdCBjdCA9IDA7IGN0IDwgbUZpZWxkQ291bnQ7IGN0KyspIHsKLSAgICAgICAgcy5hcHBlbmQoc2kpOwotICAgICAgICBzLmFwcGVuZChtRmllbGRzW2N0XS5lLT5nZXRDVHlwZShpbmRlbnQrNCkpOwotICAgICAgICBzLmFwcGVuZCgiICIpOwotICAgICAgICBzLmFwcGVuZChtRmllbGRzW2N0XS5uYW1lKTsKLSAgICAgICAgcy5hcHBlbmQoIjtcbiIpOwotICAgIH0KLSAgICBzLmFwcGVuZChzaSk7Ci0gICAgcy5hcHBlbmQoIn0iKTsKLSAgICByZXR1cm4gczsKLX0KLQotU3RyaW5nOCBFbGVtZW50OjpnZXRDVHlwZSh1aW50MzJfdCBpbmRlbnQpIGNvbnN0Ci17Ci0gICAgU3RyaW5nOCBzOwotICAgIGZvciAodWludDMyX3QgY3Q9MDsgY3QgPCBpbmRlbnQ7IGN0KyspIHsKLSAgICAgICAgcy5hcHBlbmQoIiAiKTsKLSAgICB9Ci0KLSAgICBpZiAoIW1GaWVsZENvdW50KSB7Ci0gICAgICAgIC8vIEJhc2ljIGNvbXBvbmVudC4KLSAgICAgICAgcy5hcHBlbmQobUNvbXBvbmVudC5nZXRDVHlwZSgpKTsKLSAgICB9IGVsc2UgewotICAgICAgICBzLmFwcGVuZCgic3RydWN0ICIpOwotICAgICAgICBzLmFwcGVuZChnZXRDU3RydWN0Qm9keShpbmRlbnQpKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gczsKLX0KLQogU3RyaW5nOCBFbGVtZW50OjpnZXRHTFNMVHlwZSh1aW50MzJfdCBpbmRlbnQpIGNvbnN0CiB7CiAgICAgU3RyaW5nOCBzOwpAQCAtMjAxLDEwICsyNjUsNjAgQEAKICAgICByZXR1cm4gczsKIH0KIAordm9pZCBFbGVtZW50OjppbmNSZWZzKGNvbnN0IHZvaWQgKnB0cikgY29uc3QKK3sKKyAgICBpZiAoIW1GaWVsZENvdW50KSB7CisgICAgICAgIGlmIChtQ29tcG9uZW50LmlzUmVmZXJlbmNlKCkpIHsKKyAgICAgICAgICAgIE9iamVjdEJhc2UgKmNvbnN0Km9icCA9IHN0YXRpY19jYXN0PE9iamVjdEJhc2UgKmNvbnN0Kj4ocHRyKTsKKyAgICAgICAgICAgIE9iamVjdEJhc2UgKm9iID0gb2JwWzBdOworICAgICAgICAgICAgaWYgKG9iKSBvYi0+aW5jU3lzUmVmKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGNvbnN0IHVpbnQ4X3QgKnAgPSBzdGF0aWNfY2FzdDxjb25zdCB1aW50OF90ICo+KHB0cik7CisgICAgZm9yICh1aW50MzJfdCBpPTA7IGkgPCBtRmllbGRDb3VudDsgaSsrKSB7CisgICAgICAgIGlmIChtRmllbGRzW2ldLmUtPm1IYXNSZWZlcmVuY2UpIHsKKyAgICAgICAgICAgIHAgPSAmcFttRmllbGRzW2ldLm9mZnNldEJpdHMgPj4gM107CisgICAgICAgICAgICBmb3IgKHVpbnQzMl90IGN0PTA7IGN0IDwgbUZpZWxkc1tpXS5hcnJheVNpemU7IGN0KyspIHsKKyAgICAgICAgICAgICAgICBtRmllbGRzW2ldLmUtPmluY1JlZnMocCk7CisgICAgICAgICAgICAgICAgcCArPSBtRmllbGRzW2ldLmUtPmdldFNpemVCeXRlcygpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCit2b2lkIEVsZW1lbnQ6OmRlY1JlZnMoY29uc3Qgdm9pZCAqcHRyKSBjb25zdAoreworICAgIGlmICghbUZpZWxkQ291bnQpIHsKKyAgICAgICAgaWYgKG1Db21wb25lbnQuaXNSZWZlcmVuY2UoKSkgeworICAgICAgICAgICAgT2JqZWN0QmFzZSAqY29uc3Qqb2JwID0gc3RhdGljX2Nhc3Q8T2JqZWN0QmFzZSAqY29uc3QqPihwdHIpOworICAgICAgICAgICAgT2JqZWN0QmFzZSAqb2IgPSBvYnBbMF07CisgICAgICAgICAgICBpZiAob2IpIG9iLT5kZWNTeXNSZWYoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgY29uc3QgdWludDhfdCAqcCA9IHN0YXRpY19jYXN0PGNvbnN0IHVpbnQ4X3QgKj4ocHRyKTsKKyAgICBmb3IgKHVpbnQzMl90IGk9MDsgaSA8IG1GaWVsZENvdW50OyBpKyspIHsKKyAgICAgICAgaWYgKG1GaWVsZHNbaV0uZS0+bUhhc1JlZmVyZW5jZSkgeworICAgICAgICAgICAgcCA9ICZwW21GaWVsZHNbaV0ub2Zmc2V0Qml0cyA+PiAzXTsKKyAgICAgICAgICAgIGZvciAodWludDMyX3QgY3Q9MDsgY3QgPCBtRmllbGRzW2ldLmFycmF5U2l6ZTsgY3QrKykgeworICAgICAgICAgICAgICAgIG1GaWVsZHNbaV0uZS0+ZGVjUmVmcyhwKTsKKyAgICAgICAgICAgICAgICBwICs9IG1GaWVsZHNbaV0uZS0+Z2V0U2l6ZUJ5dGVzKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CiAKIAogRWxlbWVudFN0YXRlOjpFbGVtZW50U3RhdGUoKQogeworICAgIGNvbnN0IHVpbnQzMl90IGluaXRpYWxDYXBhY2l0eSA9IDMyOworICAgIG1CdWlsZGVyRWxlbWVudHMuc2V0Q2FwYWNpdHkoaW5pdGlhbENhcGFjaXR5KTsKKyAgICBtQnVpbGRlck5hbWVTdHJpbmdzLnNldENhcGFjaXR5KGluaXRpYWxDYXBhY2l0eSk7CisgICAgbUJ1aWxkZXJOYW1lTGVuZ3Rocy5zZXRDYXBhY2l0eShpbml0aWFsQ2FwYWNpdHkpOworICAgIG1CdWlsZGVyQXJyYXlzLnNldENhcGFjaXR5KGluaXRpYWxDYXBhY2l0eSk7CiB9CiAKIEVsZW1lbnRTdGF0ZTo6fkVsZW1lbnRTdGF0ZSgpCkBAIC0yMTIsNiArMzI2LDI5IEBACiAgICAgcnNBc3NlcnQoIW1FbGVtZW50cy5zaXplKCkpOwogfQogCit2b2lkIEVsZW1lbnRTdGF0ZTo6ZWxlbWVudEJ1aWxkZXJCZWdpbigpIHsKKyAgICBtQnVpbGRlckVsZW1lbnRzLmNsZWFyKCk7CisgICAgbUJ1aWxkZXJOYW1lU3RyaW5ncy5jbGVhcigpOworICAgIG1CdWlsZGVyTmFtZUxlbmd0aHMuY2xlYXIoKTsKKyAgICBtQnVpbGRlckFycmF5cy5jbGVhcigpOworfQorCit2b2lkIEVsZW1lbnRTdGF0ZTo6ZWxlbWVudEJ1aWxkZXJBZGQoY29uc3QgRWxlbWVudCAqZSwgY29uc3QgY2hhciAqbmFtZVN0ciwgdWludDMyX3QgYXJyYXlTaXplKSB7CisgICAgbUJ1aWxkZXJFbGVtZW50cy5wdXNoKGUpOworICAgIG1CdWlsZGVyTmFtZVN0cmluZ3MucHVzaChuYW1lU3RyKTsKKyAgICBtQnVpbGRlck5hbWVMZW5ndGhzLnB1c2goc3RybGVuKG5hbWVTdHIpKTsKKyAgICBtQnVpbGRlckFycmF5cy5wdXNoKGFycmF5U2l6ZSk7CisKK30KKworY29uc3QgRWxlbWVudCAqRWxlbWVudFN0YXRlOjplbGVtZW50QnVpbGRlckNyZWF0ZShDb250ZXh0ICpyc2MpIHsKKyAgICByZXR1cm4gRWxlbWVudDo6Y3JlYXRlKHJzYywgbUJ1aWxkZXJFbGVtZW50cy5zaXplKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYobUJ1aWxkZXJFbGVtZW50cy5lZGl0QXJyYXkoKVswXSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYobUJ1aWxkZXJOYW1lU3RyaW5ncy5lZGl0QXJyYXkoKVswXSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1CdWlsZGVyTmFtZUxlbmd0aHMuZWRpdEFycmF5KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1CdWlsZGVyQXJyYXlzLmVkaXRBcnJheSgpKTsKK30KKwogCiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogLy8KQEAgLTIzNSwxNCArMzcyLDQxIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBjb3VudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUnNFbGVtZW50ICogZWluLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICoqIG5hbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzaXplX3QgKiBuYW1lTGVuZ3RocykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2l6ZV90ICogbmFtZUxlbmd0aHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90ICogYXJyYXlTaXplcykKIHsKICAgICAvL0xPR0UoInJzaV9FbGVtZW50Q3JlYXRlMiAlaSIsIGNvdW50KTsKLSAgICBjb25zdCBFbGVtZW50ICplID0gRWxlbWVudDo6Y3JlYXRlKHJzYywgY291bnQsIChjb25zdCBFbGVtZW50ICoqKWVpbiwgbmFtZXMsIG5hbWVMZW5ndGhzKTsKKyAgICBjb25zdCBFbGVtZW50ICplID0gRWxlbWVudDo6Y3JlYXRlKHJzYywgY291bnQsIChjb25zdCBFbGVtZW50ICoqKWVpbiwgbmFtZXMsIG5hbWVMZW5ndGhzLCBhcnJheVNpemVzKTsKICAgICBlLT5pbmNVc2VyUmVmKCk7CiAgICAgcmV0dXJuIChSc0VsZW1lbnQpZTsKIH0KIAordm9pZCByc2lfRWxlbWVudEdldE5hdGl2ZURhdGEoQ29udGV4dCAqcnNjLCBSc0VsZW1lbnQgZWxlbSwgdWludDMyX3QgKmVsZW1EYXRhLCB1aW50MzJfdCBlbGVtRGF0YVNpemUpCit7CisgICAgcnNBc3NlcnQoZWxlbURhdGFTaXplID09IDUpOworICAgIC8vIHdlIHdpbGwgcGFjayBtVHlwZTsgbUtpbmQ7IG1Ob3JtYWxpemVkOyBtVmVjdG9yU2l6ZTsgTnVtU3ViRWxlbWVudHMKKyAgICBFbGVtZW50ICplID0gc3RhdGljX2Nhc3Q8RWxlbWVudCAqPihlbGVtKTsKKworICAgICgqZWxlbURhdGErKykgPSAodWludDMyX3QpZS0+Z2V0VHlwZSgpOworICAgICgqZWxlbURhdGErKykgPSAodWludDMyX3QpZS0+Z2V0S2luZCgpOworICAgICgqZWxlbURhdGErKykgPSBlLT5nZXRDb21wb25lbnQoKS5nZXRJc05vcm1hbGl6ZWQoKSA/IDEgOiAwOworICAgICgqZWxlbURhdGErKykgPSBlLT5nZXRDb21wb25lbnQoKS5nZXRWZWN0b3JTaXplKCk7CisgICAgKCplbGVtRGF0YSsrKSA9IGUtPmdldEZpZWxkQ291bnQoKTsKKworfQorCit2b2lkIHJzaV9FbGVtZW50R2V0U3ViRWxlbWVudHMoQ29udGV4dCAqcnNjLCBSc0VsZW1lbnQgZWxlbSwgdWludDMyX3QgKmlkcywgY29uc3QgY2hhciAqKm5hbWVzLCB1aW50MzJfdCBkYXRhU2l6ZSkKK3sKKyAgICBFbGVtZW50ICplID0gc3RhdGljX2Nhc3Q8RWxlbWVudCAqPihlbGVtKTsKKyAgICByc0Fzc2VydChlLT5nZXRGaWVsZENvdW50KCkgPT0gZGF0YVNpemUpOworCisgICAgZm9yKHVpbnQzMl90IGkgPSAwOyBpIDwgZGF0YVNpemU7IGkgKyspIHsKKyAgICAgICAgaWRzW2ldID0gKHVpbnQzMl90KWUtPmdldEZpZWxkKGkpOworICAgICAgICBuYW1lc1tpXSA9IGUtPmdldEZpZWxkTmFtZShpKTsKKyAgICB9CisKK30KKwogCiB9CiB9CmRpZmYgLS1naXQgYS9saWJzL3JzL3JzRWxlbWVudC5oIGIvbGlicy9ycy9yc0VsZW1lbnQuaAppbmRleCAwMmExY2EyLi5hZTZhNmNjIDEwMDY0NAotLS0gYS9saWJzL3JzL3JzRWxlbWVudC5oCisrKyBiL2xpYnMvcnMvcnNFbGVtZW50LmgKQEAgLTQwLDkgKzQwLDExIEBACiAgICAgICAgIHJldHVybiAoZ2V0U2l6ZUJpdHMoKSArIDcpID4+IDM7CiAgICAgfQogCi0gICAgc2l6ZV90IGdldEZpZWxkT2Zmc2V0Qml0cyh1aW50MzJfdCBjb21wb25lbnROdW1iZXIpIGNvbnN0OworICAgIHNpemVfdCBnZXRGaWVsZE9mZnNldEJpdHModWludDMyX3QgY29tcG9uZW50TnVtYmVyKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtRmllbGRzW2NvbXBvbmVudE51bWJlcl0ub2Zmc2V0Qml0czsKKyAgICB9CiAgICAgc2l6ZV90IGdldEZpZWxkT2Zmc2V0Qnl0ZXModWludDMyX3QgY29tcG9uZW50TnVtYmVyKSBjb25zdCB7Ci0gICAgICAgIHJldHVybiAoZ2V0RmllbGRPZmZzZXRCaXRzKGNvbXBvbmVudE51bWJlcikgKyA3KSA+PiAzOworICAgICAgICByZXR1cm4gbUZpZWxkc1tjb21wb25lbnROdW1iZXJdLm9mZnNldEJpdHMgPj4gMzsKICAgICB9CiAKICAgICB1aW50MzJfdCBnZXRGaWVsZENvdW50KCkgY29uc3Qge3JldHVybiBtRmllbGRDb3VudDt9CkBAIC01NCwxNiArNTYsMjEgQEAKICAgICBSc0RhdGFLaW5kIGdldEtpbmQoKSBjb25zdCB7cmV0dXJuIG1Db21wb25lbnQuZ2V0S2luZCgpO30KICAgICB1aW50MzJfdCBnZXRCaXRzKCkgY29uc3Qge3JldHVybiBtQml0czt9CiAKLSAgICBTdHJpbmc4IGdldENUeXBlKHVpbnQzMl90IGluZGVudD0wKSBjb25zdDsKLSAgICBTdHJpbmc4IGdldENTdHJ1Y3RCb2R5KHVpbnQzMl90IGluZGVudD0wKSBjb25zdDsKICAgICBTdHJpbmc4IGdldEdMU0xUeXBlKHVpbnQzMl90IGluZGVudD0wKSBjb25zdDsKIAogICAgIHZvaWQgZHVtcExPR1YoY29uc3QgY2hhciAqcHJlZml4KSBjb25zdDsKKyAgICB2aXJ0dWFsIHZvaWQgc2VyaWFsaXplKE9TdHJlYW0gKnN0cmVhbSkgY29uc3Q7CisgICAgdmlydHVhbCBSc0EzRENsYXNzSUQgZ2V0Q2xhc3NJZCgpIGNvbnN0IHsgcmV0dXJuIFJTX0EzRF9DTEFTU19JRF9FTEVNRU5UOyB9CisgICAgc3RhdGljIEVsZW1lbnQgKmNyZWF0ZUZyb21TdHJlYW0oQ29udGV4dCAqcnNjLCBJU3RyZWFtICpzdHJlYW0pOwogCiAgICAgc3RhdGljIGNvbnN0IEVsZW1lbnQgKiBjcmVhdGUoQ29udGV4dCAqcnNjLCBSc0RhdGFUeXBlIGR0LCBSc0RhdGFLaW5kIGRrLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNOb3JtLCB1aW50MzJfdCB2ZWNTaXplKTsKICAgICBzdGF0aWMgY29uc3QgRWxlbWVudCAqIGNyZWF0ZShDb250ZXh0ICpyc2MsIHNpemVfdCBjb3VudCwgY29uc3QgRWxlbWVudCAqKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICoqLCBjb25zdCBzaXplX3QgKiBsZW5ndGhzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICoqLCBjb25zdCBzaXplX3QgKiBsZW5ndGhzLCBjb25zdCB1aW50MzJfdCAqYXNpbik7CisKKyAgICB2b2lkIGluY1JlZnMoY29uc3Qgdm9pZCAqKSBjb25zdDsKKyAgICB2b2lkIGRlY1JlZnMoY29uc3Qgdm9pZCAqKSBjb25zdDsKKyAgICBib29sIGdldEhhc1JlZmVyZW5jZXMoKSBjb25zdCB7cmV0dXJuIG1IYXNSZWZlcmVuY2U7fQogCiBwcm90ZWN0ZWQ6CiAgICAgLy8gZGVhbGxvY2F0ZSBhbnkgY29tcG9uZW50cyB0aGF0IGFyZSBwYXJ0IG9mIHRoaXMgZWxlbWVudC4KQEAgLTcyLDkgKzc5LDEyIEBACiAgICAgdHlwZWRlZiBzdHJ1Y3QgewogICAgICAgICBTdHJpbmc4IG5hbWU7CiAgICAgICAgIE9iamVjdEJhc2VSZWY8Y29uc3QgRWxlbWVudD4gZTsKKyAgICAgICAgdWludDMyX3Qgb2Zmc2V0Qml0czsKKyAgICAgICAgdWludDMyX3QgYXJyYXlTaXplOwogICAgIH0gRWxlbWVudEZpZWxkX3Q7CiAgICAgRWxlbWVudEZpZWxkX3QgKm1GaWVsZHM7CiAgICAgc2l6ZV90IG1GaWVsZENvdW50OworICAgIGJvb2wgbUhhc1JlZmVyZW5jZTsKIAogCiAgICAgRWxlbWVudChDb250ZXh0ICopOwpAQCAtODksOCArOTksMTcgQEAKICAgICBFbGVtZW50U3RhdGUoKTsKICAgICB+RWxlbWVudFN0YXRlKCk7CiAKKyAgICB2b2lkIGVsZW1lbnRCdWlsZGVyQmVnaW4oKTsKKyAgICB2b2lkIGVsZW1lbnRCdWlsZGVyQWRkKGNvbnN0IEVsZW1lbnQgKmUsIGNvbnN0IGNoYXIgKm5hbWVTdHIsIHVpbnQzMl90IGFycmF5U2l6ZSk7CisgICAgY29uc3QgRWxlbWVudCAqZWxlbWVudEJ1aWxkZXJDcmVhdGUoQ29udGV4dCAqcnNjKTsKKwogICAgIC8vIENhY2hlIG9mIGFsbCBleGlzdGluZyBlbGVtZW50cy4KLSAgICBWZWN0b3I8Y29uc3QgRWxlbWVudCAqPiBtRWxlbWVudHM7CisgICAgVmVjdG9yPEVsZW1lbnQgKj4gbUVsZW1lbnRzOworcHJpdmF0ZToKKyAgICBWZWN0b3I8Y29uc3QgRWxlbWVudCAqPiBtQnVpbGRlckVsZW1lbnRzOworICAgIFZlY3Rvcjxjb25zdCBjaGFyKj4gbUJ1aWxkZXJOYW1lU3RyaW5nczsKKyAgICBWZWN0b3I8c2l6ZV90PiBtQnVpbGRlck5hbWVMZW5ndGhzOworICAgIFZlY3Rvcjx1aW50MzJfdD4gbUJ1aWxkZXJBcnJheXM7CiB9OwogCiAKZGlmZiAtLWdpdCBhL2xpYnMvcnMvcnNGaWxlQTNELmNwcCBiL2xpYnMvcnMvcnNGaWxlQTNELmNwcAppbmRleCBlMzI3MmM1Li41NzA5ZjJhIDEwMDY0NAotLS0gYS9saWJzL3JzL3JzRmlsZUEzRC5jcHAKKysrIGIvbGlicy9ycy9yc0ZpbGVBM0QuY3BwCkBAIC0xNSwyOSArMTUsMTU2IEBACiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCisjaWZuZGVmIEFORFJPSURfUlNfQlVJTERfRk9SX0hPU1QKICNpbmNsdWRlICJyc0NvbnRleHQuaCIKKyNlbHNlCisjaW5jbHVkZSAicnNDb250ZXh0SG9zdFN0dWIuaCIKKyNlbmRpZgogCi0KLSNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+CiAjaW5jbHVkZSAicnNGaWxlQTNELmgiCiAKICNpbmNsdWRlICJyc01lc2guaCIKKyNpbmNsdWRlICJyc0FuaW1hdGlvbi5oIgorCiAKIHVzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOwogdXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ6OnJlbmRlcnNjcmlwdDsKIAotCi0KLUZpbGVBM0Q6OkZpbGVBM0QoKQorRmlsZUEzRDo6RmlsZUEzRChDb250ZXh0ICpyc2MpIDogT2JqZWN0QmFzZShyc2MpCiB7Ci0gICAgbVJzYyA9IE5VTEw7CisgICAgbUFsbG9jID0gTlVMTDsKKyAgICBtRGF0YSA9IE5VTEw7CisgICAgbVdyaXRlU3RyZWFtID0gTlVMTDsKKyAgICBtUmVhZFN0cmVhbSA9IE5VTEw7CisKKyAgICBtTWFqb3JWZXJzaW9uID0gMDsKKyAgICBtTWlub3JWZXJzaW9uID0gMTsKKyAgICBtRGF0YVNpemUgPSAwOwogfQogCiBGaWxlQTNEOjp+RmlsZUEzRCgpCiB7CisgICAgZm9yKHNpemVfdCBpID0gMDsgaSA8IG1JbmRleC5zaXplKCk7IGkgKyspIHsKKyAgICAgICAgZGVsZXRlIG1JbmRleFtpXTsKKyAgICB9CisgICAgZm9yKHNpemVfdCBpID0gMDsgaSA8IG1Xcml0ZUluZGV4LnNpemUoKTsgaSArKykgeworICAgICAgICBkZWxldGUgbVdyaXRlSW5kZXhbaV07CisgICAgfQorICAgIGlmKG1Xcml0ZVN0cmVhbSkgeworICAgICAgICBkZWxldGUgbVdyaXRlU3RyZWFtOworICAgIH0KKyAgICBpZihtUmVhZFN0cmVhbSkgeworICAgICAgICBkZWxldGUgbVdyaXRlU3RyZWFtOworICAgIH0KKyAgICBpZihtQWxsb2MpIHsKKyAgICAgICAgZnJlZShtQWxsb2MpOworICAgIH0KIH0KIAotYm9vbCBGaWxlQTNEOjpsb2FkKENvbnRleHQgKnJzYywgRklMRSAqZikKK3ZvaWQgRmlsZUEzRDo6cGFyc2VIZWFkZXIoSVN0cmVhbSAqaGVhZGVyU3RyZWFtKQoreworICAgIG1NYWpvclZlcnNpb24gPSBoZWFkZXJTdHJlYW0tPmxvYWRVMzIoKTsKKyAgICBtTWlub3JWZXJzaW9uID0gaGVhZGVyU3RyZWFtLT5sb2FkVTMyKCk7CisgICAgdWludDMyX3QgZmxhZ3MgPSBoZWFkZXJTdHJlYW0tPmxvYWRVMzIoKTsKKyAgICBtVXNlNjRCaXRPZmZzZXRzID0gKGZsYWdzICYgMSkgIT0gMDsKKworICAgIExPR0UoImZpbGUgb3BlbiA2NGJpdCA9ICVpIiwgbVVzZTY0Qml0T2Zmc2V0cyk7CisKKyAgICB1aW50MzJfdCBudW1JbmRleEVudHJpZXMgPSBoZWFkZXJTdHJlYW0tPmxvYWRVMzIoKTsKKyAgICBmb3IodWludDMyX3QgaSA9IDA7IGkgPCBudW1JbmRleEVudHJpZXM7IGkgKyspIHsKKyAgICAgICAgQTNESW5kZXhFbnRyeSAqZW50cnkgPSBuZXcgQTNESW5kZXhFbnRyeSgpOworICAgICAgICBoZWFkZXJTdHJlYW0tPmxvYWRTdHJpbmcoJmVudHJ5LT5tT2JqZWN0TmFtZSk7CisgICAgICAgIExPR0UoIkhlYWRlciBkYXRhLCBlbnRyeSBuYW1lID0gJXMiLCBlbnRyeS0+bU9iamVjdE5hbWUuc3RyaW5nKCkpOworICAgICAgICBlbnRyeS0+bVR5cGUgPSAoUnNBM0RDbGFzc0lEKWhlYWRlclN0cmVhbS0+bG9hZFUzMigpOworICAgICAgICBpZihtVXNlNjRCaXRPZmZzZXRzKXsKKyAgICAgICAgICAgIGVudHJ5LT5tT2Zmc2V0ID0gaGVhZGVyU3RyZWFtLT5sb2FkT2Zmc2V0KCk7CisgICAgICAgICAgICBlbnRyeS0+bUxlbmd0aCA9IGhlYWRlclN0cmVhbS0+bG9hZE9mZnNldCgpOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgZW50cnktPm1PZmZzZXQgPSBoZWFkZXJTdHJlYW0tPmxvYWRVMzIoKTsKKyAgICAgICAgICAgIGVudHJ5LT5tTGVuZ3RoID0gaGVhZGVyU3RyZWFtLT5sb2FkVTMyKCk7CisgICAgICAgIH0KKyAgICAgICAgZW50cnktPm1Sc09iaiA9IE5VTEw7CisgICAgICAgIG1JbmRleC5wdXNoKGVudHJ5KTsKKyAgICB9Cit9CisKK2Jvb2wgRmlsZUEzRDo6bG9hZChjb25zdCB2b2lkICpkYXRhLCBzaXplX3QgbGVuZ3RoKQoreworICAgIExPR0UoIkxvYWRpbmcgZGF0YS4gU2l6ZTogJXUiLCBsZW5ndGgpOworICAgIGNvbnN0IHVpbnQ4X3QgKmxvY2FsRGF0YSA9IChjb25zdCB1aW50OF90ICopZGF0YTsKKworICAgIHNpemVfdCBsZW5ndGhSZW1haW5pbmcgPSBsZW5ndGg7CisgICAgc2l6ZV90IG1hZ2ljU3RyTGVuID0gMTI7CisgICAgaWYgKChsZW5ndGggPCBtYWdpY1N0ckxlbikgfHwKKyAgICAgICAgbWVtY21wKGRhdGEsICJBbmRyb2lkM0RfZmYiLCBtYWdpY1N0ckxlbikpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGxvY2FsRGF0YSArPSBtYWdpY1N0ckxlbjsKKyAgICBsZW5ndGhSZW1haW5pbmcgLT0gbWFnaWNTdHJMZW47CisKKyAgICAvLyBOZXh0IHdlIGdldCBvdXIgaGVhZGVyIHNpemUKKyAgICB1aW50NjRfdCBoZWFkZXJTaXplID0gMDsKKyAgICBpZihsZW5ndGhSZW1haW5pbmcgPCBzaXplb2YoaGVhZGVyU2l6ZSkpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIG1lbWNweSgmaGVhZGVyU2l6ZSwgbG9jYWxEYXRhLCBzaXplb2YoaGVhZGVyU2l6ZSkpOworICAgIGxvY2FsRGF0YSArPSBzaXplb2YoaGVhZGVyU2l6ZSk7CisgICAgbGVuZ3RoUmVtYWluaW5nIC09IHNpemVvZihoZWFkZXJTaXplKTsKKworICAgIExPR0UoIkxvYWRpbmcgZGF0YSwgaGVhZGVyU2l6ZSA9ICVsbGkiLCBoZWFkZXJTaXplKTsKKworICAgIGlmKGxlbmd0aFJlbWFpbmluZyA8IGhlYWRlclNpemUpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHVpbnQ4X3QgKmhlYWRlckRhdGEgPSAodWludDhfdCAqKW1hbGxvYyhoZWFkZXJTaXplKTsKKyAgICBpZighaGVhZGVyRGF0YSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgbWVtY3B5KGhlYWRlckRhdGEsIGxvY2FsRGF0YSwgaGVhZGVyU2l6ZSk7CisKKyAgICAvLyBOb3cgb3BlbiB0aGUgc3RyZWFtIHRvIHBhcnNlIHRoZSBoZWFkZXIKKyAgICBJU3RyZWFtIGhlYWRlclN0cmVhbShoZWFkZXJEYXRhLCBmYWxzZSk7CisgICAgcGFyc2VIZWFkZXIoJmhlYWRlclN0cmVhbSk7CisKKyAgICBmcmVlKGhlYWRlckRhdGEpOworCisgICAgbG9jYWxEYXRhICs9IGhlYWRlclNpemU7CisgICAgbGVuZ3RoUmVtYWluaW5nIC09IGhlYWRlclNpemU7CisKKyAgICBpZihsZW5ndGhSZW1haW5pbmcgPCBzaXplb2YobURhdGFTaXplKSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLy8gUmVhZCB0aGUgc2l6ZSBvZiB0aGUgZGF0YQorICAgIG1lbWNweSgmbURhdGFTaXplLCBsb2NhbERhdGEsIHNpemVvZihtRGF0YVNpemUpKTsKKyAgICBsb2NhbERhdGEgKz0gc2l6ZW9mKG1EYXRhU2l6ZSk7CisgICAgbGVuZ3RoUmVtYWluaW5nIC09IHNpemVvZihtRGF0YVNpemUpOworCisgICAgTE9HRSgiTG9hZGluZyBkYXRhLCBtRGF0YVNpemUgPSAlbGxpIiwgbURhdGFTaXplKTsKKworICAgIGlmKGxlbmd0aFJlbWFpbmluZyA8IG1EYXRhU2l6ZSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLy8gV2Ugc2hvdWxkIGtub3cgZW5vdWdoIHRvIHJlYWQgdGhlIGZpbGUgaW4gYXQgdGhpcyBwb2ludC4KKyAgICBtQWxsb2MgPSBtYWxsb2MobURhdGFTaXplKTsKKyAgICBpZiAoIW1BbGxvYykgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIG1EYXRhID0gKHVpbnQ4X3QgKiltQWxsb2M7CisgICAgbWVtY3B5KG1BbGxvYywgbG9jYWxEYXRhLCBtRGF0YVNpemUpOworCisgICAgbVJlYWRTdHJlYW0gPSBuZXcgSVN0cmVhbShtRGF0YSwgbVVzZTY0Qml0T2Zmc2V0cyk7CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBGaWxlQTNEOjpsb2FkKEZJTEUgKmYpCiB7CiAgICAgY2hhciBtYWdpY1N0cmluZ1sxMl07CiAgICAgc2l6ZV90IGxlbjsKQEAgLTQ5LDQ3ICsxNzYsMzkgQEAKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIAotICAgIExPR0UoImZpbGUgb3BlbiAyIik7Ci0gICAgbGVuID0gZnJlYWQoJm1NYWpvclZlcnNpb24sIDEsIHNpemVvZihtTWFqb3JWZXJzaW9uKSwgZik7Ci0gICAgaWYgKGxlbiAhPSBzaXplb2YobU1ham9yVmVyc2lvbikpIHsKKyAgICAvLyBOZXh0IHRoaW5nIGlzIHRoZSBzaXplIG9mIHRoZSBoZWFkZXIKKyAgICB1aW50NjRfdCBoZWFkZXJTaXplID0gMDsKKyAgICBsZW4gPSBmcmVhZCgmaGVhZGVyU2l6ZSwgMSwgc2l6ZW9mKGhlYWRlclNpemUpLCBmKTsKKyAgICBpZiAobGVuICE9IHNpemVvZihoZWFkZXJTaXplKSB8fCBoZWFkZXJTaXplID09IDApIHsKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIAotICAgIExPR0UoImZpbGUgb3BlbiAzIik7Ci0gICAgbGVuID0gZnJlYWQoJm1NaW5vclZlcnNpb24sIDEsIHNpemVvZihtTWlub3JWZXJzaW9uKSwgZik7Ci0gICAgaWYgKGxlbiAhPSBzaXplb2YobU1pbm9yVmVyc2lvbikpIHsKKyAgICB1aW50OF90ICpoZWFkZXJEYXRhID0gKHVpbnQ4X3QgKiltYWxsb2MoaGVhZGVyU2l6ZSk7CisgICAgaWYoIWhlYWRlckRhdGEpIHsKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIAotICAgIExPR0UoImZpbGUgb3BlbiA0Iik7Ci0gICAgdWludDMyX3QgZmxhZ3M7Ci0gICAgbGVuID0gZnJlYWQoJmZsYWdzLCAxLCBzaXplb2YoZmxhZ3MpLCBmKTsKLSAgICBpZiAobGVuICE9IHNpemVvZihmbGFncykpIHsKKyAgICBsZW4gPSBmcmVhZChoZWFkZXJEYXRhLCAxLCBoZWFkZXJTaXplLCBmKTsKKyAgICBpZiAobGVuICE9IGhlYWRlclNpemUpIHsKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KLSAgICBtVXNlNjRCaXRPZmZzZXRzID0gKGZsYWdzICYgMSkgIT0gMDsKIAotICAgIExPR0UoImZpbGUgb3BlbiA2NGJpdCA9ICVpIiwgbVVzZTY0Qml0T2Zmc2V0cyk7CisgICAgLy8gTm93IG9wZW4gdGhlIHN0cmVhbSB0byBwYXJzZSB0aGUgaGVhZGVyCisgICAgSVN0cmVhbSBoZWFkZXJTdHJlYW0oaGVhZGVyRGF0YSwgZmFsc2UpOworICAgIHBhcnNlSGVhZGVyKCZoZWFkZXJTdHJlYW0pOwogCi0gICAgaWYgKG1Vc2U2NEJpdE9mZnNldHMpIHsKLSAgICAgICAgbGVuID0gZnJlYWQoJm1EYXRhU2l6ZSwgMSwgc2l6ZW9mKG1EYXRhU2l6ZSksIGYpOwotICAgICAgICBpZiAobGVuICE9IHNpemVvZihtRGF0YVNpemUpKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgICB1aW50MzJfdCB0bXA7Ci0gICAgICAgIGxlbiA9IGZyZWFkKCZ0bXAsIDEsIHNpemVvZih0bXApLCBmKTsKLSAgICAgICAgaWYgKGxlbiAhPSBzaXplb2YodG1wKSkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIG1EYXRhU2l6ZSA9IHRtcDsKKyAgICBmcmVlKGhlYWRlckRhdGEpOworCisgICAgLy8gTmV4dCB0aGluZyBpcyB0aGUgc2l6ZSBvZiB0aGUgaGVhZGVyCisgICAgbGVuID0gZnJlYWQoJm1EYXRhU2l6ZSwgMSwgc2l6ZW9mKG1EYXRhU2l6ZSksIGYpOworICAgIGlmIChsZW4gIT0gc2l6ZW9mKG1EYXRhU2l6ZSkgfHwgbURhdGFTaXplID09IDApIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIAogICAgIExPR0UoImZpbGUgb3BlbiBzaXplID0gJWxsaSIsIG1EYXRhU2l6ZSk7CiAKICAgICAvLyBXZSBzaG91bGQga25vdyBlbm91Z2ggdG8gcmVhZCB0aGUgZmlsZSBpbiBhdCB0aGlzIHBvaW50LgotICAgIGZzZWVrKGYsIFNFRUtfU0VULCAwKTsKLSAgICBtQWxsb2M9IG1hbGxvYyhtRGF0YVNpemUpOworICAgIG1BbGxvYyA9IG1hbGxvYyhtRGF0YVNpemUpOwogICAgIGlmICghbUFsbG9jKSB7CiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CkBAIC05OSwyODIgKzIxOCwyNTUgQEAKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIAotICAgIExPR0UoImZpbGUgc3RhcnQgcHJvY2Vzc2luZyIpOwotICAgIHJldHVybiBwcm9jZXNzKHJzYyk7CisgICAgbVJlYWRTdHJlYW0gPSBuZXcgSVN0cmVhbShtRGF0YSwgbVVzZTY0Qml0T2Zmc2V0cyk7CisKKyAgICBMT0dFKCJIZWFkZXIgaXMgcmVhZCBhbiBzdHJlYW0gaW5pdGlhbGl6ZWQiKTsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KIAotYm9vbCBGaWxlQTNEOjpwcm9jZXNzSW5kZXgoQ29udGV4dCAqcnNjLCBBM0RJbmRleEVudHJ5ICppZSkKLXsKLSAgICBib29sIHJldCA9IGZhbHNlOwotICAgIElPIGlvKG1EYXRhICsgaWUtPm1PZmZzZXQsIG1Vc2U2NEJpdE9mZnNldHMpOworc2l6ZV90IEZpbGVBM0Q6OmdldE51bUluZGV4RW50cmllcygpIGNvbnN0IHsKKyAgICByZXR1cm4gbUluZGV4LnNpemUoKTsKK30KIAotICAgIExPR0UoInByb2Nlc3MgaW5kZXgsIHR5cGUgJWkiLCBpZS0+bVR5cGUpOwotCi0gICAgc3dpdGNoKGllLT5tVHlwZSkgewotICAgIGNhc2UgQ0hVTktfRUxFTUVOVDoKLSAgICAgICAgcHJvY2Vzc0NodW5rX0VsZW1lbnQocnNjLCAmaW8sIGllKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBDSFVOS19FTEVNRU5UX1NPVVJDRToKLSAgICAgICAgcHJvY2Vzc0NodW5rX0VsZW1lbnRTb3VyY2UocnNjLCAmaW8sIGllKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBDSFVOS19WRVJUSUNJRVM6Ci0gICAgICAgIHByb2Nlc3NDaHVua19WZXJ0aWNpZXMocnNjLCAmaW8sIGllKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBDSFVOS19NRVNIOgotICAgICAgICBwcm9jZXNzQ2h1bmtfTWVzaChyc2MsICZpbywgaWUpOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIENIVU5LX1BSSU1JVElWRToKLSAgICAgICAgcHJvY2Vzc0NodW5rX1ByaW1pdGl2ZShyc2MsICZpbywgaWUpOwotICAgICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgICBMT0dFKCJGaWxlQTNEIFVua25vd24gY2h1bmsgdHlwZSIpOwotICAgICAgICBicmVhazsKK2NvbnN0IEZpbGVBM0Q6OkEzREluZGV4RW50cnkgKkZpbGVBM0Q6OmdldEluZGV4RW50cnkoc2l6ZV90IGluZGV4KSBjb25zdCB7CisgICAgaWYoaW5kZXggPCBtSW5kZXguc2l6ZSgpKSB7CisgICAgICAgIHJldHVybiBtSW5kZXhbaW5kZXhdOwogICAgIH0KLSAgICByZXR1cm4gKGllLT5tUnNPYmogIT0gTlVMTCk7CisgICAgcmV0dXJuIE5VTEw7CiB9CiAKLWJvb2wgRmlsZUEzRDo6cHJvY2VzcyhDb250ZXh0ICpyc2MpCi17Ci0gICAgTE9HRSgicHJvY2VzcyIpOwotICAgIElPIGlvKG1EYXRhICsgMTIsIG1Vc2U2NEJpdE9mZnNldHMpOwotICAgIGJvb2wgcmV0ID0gdHJ1ZTsKLQotICAgIC8vIEJ1aWxkIHRoZSBpbmRleCBmaXJzdAotICAgIExPR0UoInByb2Nlc3MgMSIpOwotICAgIGlvLmxvYWRVMzIoKTsgLy8gbWFqb3IgdmVyc2lvbiwgYWxyZWFkeSBsb2FkZWQKLSAgICBpby5sb2FkVTMyKCk7IC8vIG1pbm9yIHZlcnNpb24sIGFscmVhZHkgbG9hZGVkCi0gICAgTE9HRSgicHJvY2VzcyAyIik7Ci0KLSAgICBpby5sb2FkVTMyKCk7ICAvLyBmbGFncwotICAgIGlvLmxvYWRPZmZzZXQoKTsgLy8gZmlsZXNpemUsIGFscmVhZHkgbG9hZGVkLgotICAgIExPR0UoInByb2Nlc3MgNCIpOwotICAgIHVpbnQ2NF90IG1JbmRleE9mZnNldCA9IGlvLmxvYWRPZmZzZXQoKTsKLSAgICB1aW50NjRfdCBtU3RyaW5nT2Zmc2V0ID0gaW8ubG9hZE9mZnNldCgpOwotCi0gICAgTE9HRSgicHJvY2VzcyBtSW5kZXhPZmZzZXQ9IDB4JTAxNmxseCIsIG1JbmRleE9mZnNldCk7Ci0gICAgTE9HRSgicHJvY2VzcyBtU3RyaW5nT2Zmc2V0PSAweCUwMTZsbHgiLCBtU3RyaW5nT2Zmc2V0KTsKLQotICAgIElPIGluZGV4KG1EYXRhICsgbUluZGV4T2Zmc2V0LCBtVXNlNjRCaXRPZmZzZXRzKTsKLSAgICBJTyBzdHJpbmdUYWJsZShtRGF0YSArIG1TdHJpbmdPZmZzZXQsIG1Vc2U2NEJpdE9mZnNldHMpOwotCi0gICAgdWludDMyX3Qgc3RyaW5nRW50cnlDb3VudCA9IHN0cmluZ1RhYmxlLmxvYWRVMzIoKTsKLSAgICBMT0dFKCJzdHJpbmdFbnRyeUNvdW50ICVpIiwgc3RyaW5nRW50cnlDb3VudCk7Ci0gICAgbVN0cmluZ3Muc2V0Q2FwYWNpdHkoc3RyaW5nRW50cnlDb3VudCk7Ci0gICAgbVN0cmluZ0luZGV4VmFsdWVzLnNldENhcGFjaXR5KHN0cmluZ0VudHJ5Q291bnQpOwotICAgIGlmIChzdHJpbmdFbnRyeUNvdW50KSB7Ci0gICAgICAgIHVpbnQzMl90IHN0cmluZ1R5cGUgPSBzdHJpbmdUYWJsZS5sb2FkVTMyKCk7Ci0gICAgICAgIExPR0UoInN0cmluZ1R5cGUgJWkiLCBzdHJpbmdUeXBlKTsKLSAgICAgICAgcnNBc3NlcnQoc3RyaW5nVHlwZT09MCk7Ci0gICAgICAgIGZvciAodWludDMyX3QgY3QgPSAwOyBjdCA8IHN0cmluZ0VudHJ5Q291bnQ7IGN0KyspIHsKLSAgICAgICAgICAgIHVpbnQ2NF90IG9mZnNldCA9IHN0cmluZ1RhYmxlLmxvYWRPZmZzZXQoKTsKLSAgICAgICAgICAgIExPR0UoInN0cmluZyBvZmZzZXQgMHglMDE2bGx4Iiwgb2Zmc2V0KTsKLSAgICAgICAgICAgIElPIHRtcChtRGF0YSArIG9mZnNldCwgbVVzZTY0Qml0T2Zmc2V0cyk7Ci0gICAgICAgICAgICBTdHJpbmc4IHM7Ci0gICAgICAgICAgICB0bXAubG9hZFN0cmluZygmcyk7Ci0gICAgICAgICAgICBMT0dFKCJzdHJpbmcgJXMiLCBzLnN0cmluZygpKTsKLSAgICAgICAgICAgIG1TdHJpbmdzLnB1c2gocyk7Ci0gICAgICAgIH0KK09iamVjdEJhc2UgKkZpbGVBM0Q6OmluaXRpYWxpemVGcm9tRW50cnkoc2l6ZV90IGluZGV4KSB7CisgICAgaWYoaW5kZXggPj0gbUluZGV4LnNpemUoKSkgeworICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9CiAKLSAgICBMT0dFKCJzdHJpbmdzIGRvbmUiKTsKLSAgICB1aW50MzJfdCBpbmRleEVudHJ5Q291bnQgPSBpbmRleC5sb2FkVTMyKCk7Ci0gICAgTE9HRSgiaW5kZXggY291bnQgJWkiLCBpbmRleEVudHJ5Q291bnQpOwotICAgIG1JbmRleC5zZXRDYXBhY2l0eShpbmRleEVudHJ5Q291bnQpOwotICAgIGZvciAodWludDMyX3QgY3QgPSAwOyBjdCA8IGluZGV4RW50cnlDb3VudDsgY3QrKykgewotICAgICAgICBBM0RJbmRleEVudHJ5IGU7Ci0gICAgICAgIHVpbnQzMl90IHN0cmluZ0luZGV4ID0gaW5kZXgubG9hZFUzMigpOwotICAgICAgICBMT0dFKCJpbmRleCAlaSIsIGN0KTsKLSAgICAgICAgTE9HRSgiICBzdHJpbmcgaW5kZXggJWkiLCBzdHJpbmdJbmRleCk7Ci0gICAgICAgIGUubVR5cGUgPSAoQTNEQ2h1bmtUeXBlKWluZGV4LmxvYWRVMzIoKTsKLSAgICAgICAgTE9HRSgiICB0eXBlICVpIiwgZS5tVHlwZSk7Ci0gICAgICAgIGUubU9mZnNldCA9IGluZGV4LmxvYWRPZmZzZXQoKTsKLSAgICAgICAgTE9HRSgiICBvZmZzZXQgMHglMDE2bGx4IiwgZS5tT2Zmc2V0KTsKLQotICAgICAgICBpZiAoc3RyaW5nSW5kZXggJiYgKHN0cmluZ0luZGV4IDwgbVN0cmluZ3Muc2l6ZSgpKSkgewotICAgICAgICAgICAgZS5tSUQgPSBtU3RyaW5nc1tzdHJpbmdJbmRleF07Ci0gICAgICAgICAgICBtU3RyaW5nSW5kZXhWYWx1ZXMuZWRpdEl0ZW1BdChzdHJpbmdJbmRleCkgPSBjdDsKLSAgICAgICAgICAgIExPR0UoIiAgaWQgJXMiLCBlLm1JRC5zdHJpbmcoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBtSW5kZXgucHVzaChlKTsKLSAgICB9Ci0gICAgTE9HRSgiaW5kZXggZG9uZSIpOwotCi0gICAgLy8gQXQgdGhpcyBwb2ludCB0aGUgaW5kZXggc2hvdWxkIGJlIGZ1bGx5IHBvcHVsYXRlZC4KLSAgICAvLyBXZSBjYW4gbm93IHdhbGsgdGhvdWdoIGl0IGFuZCBsb2FkIGFsbCB0aGUgb2JqZWN0cy4KLSAgICBmb3IgKHVpbnQzMl90IGN0ID0gMDsgY3QgPCBpbmRleEVudHJ5Q291bnQ7IGN0KyspIHsKLSAgICAgICAgTE9HRSgicHJvY2Vzc2luZyBpbmRleCBlbnRyeSAlaSIsIGN0KTsKLSAgICAgICAgcHJvY2Vzc0luZGV4KHJzYywgJm1JbmRleC5lZGl0SXRlbUF0KGN0KSk7CisgICAgRmlsZUEzRDo6QTNESW5kZXhFbnRyeSAqZW50cnkgPSBtSW5kZXhbaW5kZXhdOworICAgIGlmKCFlbnRyeSkgeworICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9CiAKLSAgICByZXR1cm4gcmV0OwotfQotCi0KLUZpbGVBM0Q6OklPOjpJTyhjb25zdCB1aW50OF90ICpidWYsIGJvb2wgdXNlNjQpCi17Ci0gICAgbURhdGEgPSBidWY7Ci0gICAgbVBvcyA9IDA7Ci0gICAgbVVzZTY0ID0gdXNlNjQ7Ci19Ci0KLXVpbnQ2NF90IEZpbGVBM0Q6OklPOjpsb2FkT2Zmc2V0KCkKLXsKLSAgICB1aW50NjRfdCB0bXA7Ci0gICAgaWYgKG1Vc2U2NCkgewotICAgICAgICBtUG9zID0gKG1Qb3MgKyA3KSAmICh+Nyk7Ci0gICAgICAgIHRtcCA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDY0X3QgKj4oJm1EYXRhW21Qb3NdKVswXTsKLSAgICAgICAgbVBvcyArPSBzaXplb2YodWludDY0X3QpOwotICAgICAgICByZXR1cm4gdG1wOworICAgIGlmKGVudHJ5LT5tUnNPYmopIHsKKyAgICAgICAgZW50cnktPm1Sc09iai0+aW5jVXNlclJlZigpOworICAgICAgICByZXR1cm4gZW50cnktPm1Sc09iajsKICAgICB9Ci0gICAgcmV0dXJuIGxvYWRVMzIoKTsKLX0KIAotdm9pZCBGaWxlQTNEOjpJTzo6bG9hZFN0cmluZyhTdHJpbmc4ICpzKQotewotICAgIExPR0UoImxvYWRTdHJpbmciKTsKLSAgICB1aW50MzJfdCBsZW4gPSBsb2FkVTMyKCk7Ci0gICAgTE9HRSgibG9hZFN0cmluZyBsZW4gJWkiLCBsZW4pOwotICAgIHMtPnNldFRvKChjb25zdCBjaGFyICopJm1EYXRhW21Qb3NdLCBsZW4pOwotICAgIG1Qb3MgKz0gbGVuOwotfQotCi0KLXZvaWQgRmlsZUEzRDo6cHJvY2Vzc0NodW5rX01lc2goQ29udGV4dCAqcnNjLCBJTyAqaW8sIEEzREluZGV4RW50cnkgKmllKQotewotICAgIE1lc2ggKiBtID0gbmV3IE1lc2gocnNjKTsKLQotICAgIG0tPm1QcmltaXRpdmVzQ291bnQgPSBpby0+bG9hZFUzMigpOwotICAgIG0tPm1QcmltaXRpdmVzID0gbmV3IE1lc2g6OlByaW1pdGl2ZV90ICpbbS0+bVByaW1pdGl2ZXNDb3VudF07Ci0KLSAgICBmb3IgKHVpbnQzMl90IGN0ID0gMDsgY3QgPCBtLT5tUHJpbWl0aXZlc0NvdW50OyBjdCsrKSB7Ci0gICAgICAgIHVpbnQzMl90IGluZGV4ID0gaW8tPmxvYWRVMzIoKTsKLQotICAgICAgICBtLT5tUHJpbWl0aXZlc1tjdF0gPSAoTWVzaDo6UHJpbWl0aXZlX3QgKiltSW5kZXhbaW5kZXhdLm1Sc09iajsKLSAgICB9Ci0gICAgaWUtPm1Sc09iaiA9IG07Ci19Ci0KLXZvaWQgRmlsZUEzRDo6cHJvY2Vzc0NodW5rX1ByaW1pdGl2ZShDb250ZXh0ICpyc2MsIElPICppbywgQTNESW5kZXhFbnRyeSAqaWUpCi17Ci0gICAgTWVzaDo6UHJpbWl0aXZlX3QgKiBwID0gbmV3IE1lc2g6OlByaW1pdGl2ZV90OwotCi0gICAgcC0+bUluZGV4Q291bnQgPSBpby0+bG9hZFUzMigpOwotICAgIHVpbnQzMl90IHZlcnRJZHggPSBpby0+bG9hZFUzMigpOwotICAgIHAtPm1SZXN0YXJ0Q291bnRzID0gaW8tPmxvYWRVMTYoKTsKLSAgICB1aW50MzJfdCBiaXRzID0gaW8tPmxvYWRVOCgpOwotICAgIHAtPm1UeXBlID0gKFJzUHJpbWl0aXZlKWlvLT5sb2FkVTgoKTsKLQotICAgIExPR0UoInByb2Nlc3NDaHVua19QcmltaXRpdmUgY291bnQgJWksIGJpdHMgJWkiLCBwLT5tSW5kZXhDb3VudCwgYml0cyk7Ci0KLSAgICBwLT5tVmVydGljaWVzID0gKE1lc2g6OlZlcnRpY2llc190ICopbUluZGV4W3ZlcnRJZHhdLm1Sc09iajsKLQotICAgIHAtPm1JbmRpY2llcyA9IG5ldyB1aW50MTZfdFtwLT5tSW5kZXhDb3VudF07Ci0gICAgZm9yICh1aW50MzJfdCBjdCA9IDA7IGN0IDwgcC0+bUluZGV4Q291bnQ7IGN0KyspIHsKLSAgICAgICAgc3dpdGNoKGJpdHMpIHsKLSAgICAgICAgY2FzZSA4OgotICAgICAgICAgICAgcC0+bUluZGljaWVzW2N0XSA9IGlvLT5sb2FkVTgoKTsKKyAgICAvLyBTZWVrIHRvIHRoZSBiZWdpbm5pbmcgb2Ygb2JqZWN0CisgICAgbVJlYWRTdHJlYW0tPnJlc2V0KGVudHJ5LT5tT2Zmc2V0KTsKKyAgICBzd2l0Y2ggKGVudHJ5LT5tVHlwZSkgeworICAgICAgICBjYXNlIFJTX0EzRF9DTEFTU19JRF9VTktOT1dOOgorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIGNhc2UgUlNfQTNEX0NMQVNTX0lEX01FU0g6CisgICAgICAgICAgICBlbnRyeS0+bVJzT2JqID0gTWVzaDo6Y3JlYXRlRnJvbVN0cmVhbShtUlNDLCBtUmVhZFN0cmVhbSk7CiAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAxNjoKLSAgICAgICAgICAgIHAtPm1JbmRpY2llc1tjdF0gPSBpby0+bG9hZFUxNigpOworICAgICAgICBjYXNlIFJTX0EzRF9DTEFTU19JRF9UWVBFOgorICAgICAgICAgICAgZW50cnktPm1Sc09iaiA9IFR5cGU6OmNyZWF0ZUZyb21TdHJlYW0obVJTQywgbVJlYWRTdHJlYW0pOwogICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMzI6Ci0gICAgICAgICAgICBwLT5tSW5kaWNpZXNbY3RdID0gaW8tPmxvYWRVMzIoKTsKKyAgICAgICAgY2FzZSBSU19BM0RfQ0xBU1NfSURfRUxFTUVOVDoKKyAgICAgICAgICAgIGVudHJ5LT5tUnNPYmogPSBFbGVtZW50OjpjcmVhdGVGcm9tU3RyZWFtKG1SU0MsIG1SZWFkU3RyZWFtKTsKICAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFJTX0EzRF9DTEFTU19JRF9BTExPQ0FUSU9OOgorICAgICAgICAgICAgZW50cnktPm1Sc09iaiA9IEFsbG9jYXRpb246OmNyZWF0ZUZyb21TdHJlYW0obVJTQywgbVJlYWRTdHJlYW0pOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgUlNfQTNEX0NMQVNTX0lEX1BST0dSQU1fVkVSVEVYOgorICAgICAgICAgICAgZW50cnktPm1Sc09iaiA9IFByb2dyYW1WZXJ0ZXg6OmNyZWF0ZUZyb21TdHJlYW0obVJTQywgbVJlYWRTdHJlYW0pOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgUlNfQTNEX0NMQVNTX0lEX1BST0dSQU1fUkFTVEVSOgorICAgICAgICAgICAgZW50cnktPm1Sc09iaiA9IFByb2dyYW1SYXN0ZXI6OmNyZWF0ZUZyb21TdHJlYW0obVJTQywgbVJlYWRTdHJlYW0pOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgUlNfQTNEX0NMQVNTX0lEX1BST0dSQU1fRlJBR01FTlQ6CisgICAgICAgICAgICBlbnRyeS0+bVJzT2JqID0gUHJvZ3JhbUZyYWdtZW50OjpjcmVhdGVGcm9tU3RyZWFtKG1SU0MsIG1SZWFkU3RyZWFtKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFJTX0EzRF9DTEFTU19JRF9QUk9HUkFNX1NUT1JFOgorICAgICAgICAgICAgZW50cnktPm1Sc09iaiA9IFByb2dyYW1TdG9yZTo6Y3JlYXRlRnJvbVN0cmVhbShtUlNDLCBtUmVhZFN0cmVhbSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBSU19BM0RfQ0xBU1NfSURfU0FNUExFUjoKKyAgICAgICAgICAgIGVudHJ5LT5tUnNPYmogPSBTYW1wbGVyOjpjcmVhdGVGcm9tU3RyZWFtKG1SU0MsIG1SZWFkU3RyZWFtKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFJTX0EzRF9DTEFTU19JRF9BTklNQVRJT046CisgICAgICAgICAgICBlbnRyeS0+bVJzT2JqID0gQW5pbWF0aW9uOjpjcmVhdGVGcm9tU3RyZWFtKG1SU0MsIG1SZWFkU3RyZWFtKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFJTX0EzRF9DTEFTU19JRF9MSUdIVDoKKyAgICAgICAgICAgIGVudHJ5LT5tUnNPYmogPSBMaWdodDo6Y3JlYXRlRnJvbVN0cmVhbShtUlNDLCBtUmVhZFN0cmVhbSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBSU19BM0RfQ0xBU1NfSURfQURBUFRFUl8xRDoKKyAgICAgICAgICAgIGVudHJ5LT5tUnNPYmogPSBBZGFwdGVyMUQ6OmNyZWF0ZUZyb21TdHJlYW0obVJTQywgbVJlYWRTdHJlYW0pOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgUlNfQTNEX0NMQVNTX0lEX0FEQVBURVJfMkQ6CisgICAgICAgICAgICBlbnRyeS0+bVJzT2JqID0gQWRhcHRlcjJEOjpjcmVhdGVGcm9tU3RyZWFtKG1SU0MsIG1SZWFkU3RyZWFtKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFJTX0EzRF9DTEFTU19JRF9TQ1JJUFRfQzoKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBpZihlbnRyeS0+bVJzT2JqKSB7CisgICAgICAgIGVudHJ5LT5tUnNPYmotPmluY1VzZXJSZWYoKTsKKyAgICB9CisgICAgcmV0dXJuIGVudHJ5LT5tUnNPYmo7Cit9CisKK2Jvb2wgRmlsZUEzRDo6d3JpdGVGaWxlKGNvbnN0IGNoYXIgKmZpbGVuYW1lKQoreworICAgIGlmKCFtV3JpdGVTdHJlYW0pIHsKKyAgICAgICAgTE9HRSgiTm8gb2JqZWN0cyB0byB3cml0ZVxuIik7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgaWYobVdyaXRlU3RyZWFtLT5nZXRQb3MoKSA9PSAwKSB7CisgICAgICAgIExPR0UoIk5vIG9iamVjdHMgdG8gd3JpdGVcbiIpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgRklMRSAqd3JpdGVIYW5kbGUgPSBmb3BlbihmaWxlbmFtZSwgIndiIik7CisgICAgaWYoIXdyaXRlSGFuZGxlKSB7CisgICAgICAgIExPR0UoIkNvdWxkbid0IG9wZW4gdGhlIGZpbGUgZm9yIHdyaXRpbmdcbiIpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLy8gT3BlbiBhIG5ldyBzdHJlYW0gdG8gbWFrZSB3cml0aW5nIHRoZSBoZWFkZXIgZWFzaWVyCisgICAgT1N0cmVhbSBoZWFkZXJTdHJlYW0oNSoxMDI0LCBmYWxzZSk7CisgICAgaGVhZGVyU3RyZWFtLmFkZFUzMihtTWFqb3JWZXJzaW9uKTsKKyAgICBoZWFkZXJTdHJlYW0uYWRkVTMyKG1NaW5vclZlcnNpb24pOworICAgIHVpbnQzMl90IGlzNjRCaXQgPSAwOworICAgIGhlYWRlclN0cmVhbS5hZGRVMzIoaXM2NEJpdCk7CisKKyAgICB1aW50MzJfdCB3cml0ZUluZGV4U2l6ZSA9IG1Xcml0ZUluZGV4LnNpemUoKTsKKyAgICBoZWFkZXJTdHJlYW0uYWRkVTMyKHdyaXRlSW5kZXhTaXplKTsKKyAgICBmb3IodWludDMyX3QgaSA9IDA7IGkgPCB3cml0ZUluZGV4U2l6ZTsgaSArKykgeworICAgICAgICBoZWFkZXJTdHJlYW0uYWRkU3RyaW5nKCZtV3JpdGVJbmRleFtpXS0+bU9iamVjdE5hbWUpOworICAgICAgICBoZWFkZXJTdHJlYW0uYWRkVTMyKCh1aW50MzJfdCltV3JpdGVJbmRleFtpXS0+bVR5cGUpOworICAgICAgICBpZihtVXNlNjRCaXRPZmZzZXRzKXsKKyAgICAgICAgICAgIGhlYWRlclN0cmVhbS5hZGRPZmZzZXQobVdyaXRlSW5kZXhbaV0tPm1PZmZzZXQpOworICAgICAgICAgICAgaGVhZGVyU3RyZWFtLmFkZE9mZnNldChtV3JpdGVJbmRleFtpXS0+bUxlbmd0aCk7CiAgICAgICAgIH0KLSAgICAgICAgTE9HRSgiICBpZHggJWkiLCBwLT5tSW5kaWNpZXNbY3RdKTsKLSAgICB9Ci0KLSAgICBpZiAocC0+bVJlc3RhcnRDb3VudHMpIHsKLSAgICAgICAgcC0+bVJlc3RhcnRzID0gbmV3IHVpbnQxNl90W3AtPm1SZXN0YXJ0Q291bnRzXTsKLSAgICAgICAgZm9yICh1aW50MzJfdCBjdCA9IDA7IGN0IDwgcC0+bVJlc3RhcnRDb3VudHM7IGN0KyspIHsKLSAgICAgICAgICAgIHN3aXRjaChiaXRzKSB7Ci0gICAgICAgICAgICBjYXNlIDg6Ci0gICAgICAgICAgICAgICAgcC0+bVJlc3RhcnRzW2N0XSA9IGlvLT5sb2FkVTgoKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgMTY6Ci0gICAgICAgICAgICAgICAgcC0+bVJlc3RhcnRzW2N0XSA9IGlvLT5sb2FkVTE2KCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIDMyOgotICAgICAgICAgICAgICAgIHAtPm1SZXN0YXJ0c1tjdF0gPSBpby0+bG9hZFUzMigpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgTE9HRSgiICBpZHggJWkiLCBwLT5tUmVzdGFydHNbY3RdKTsKKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICB1aW50MzJfdCBvZmZzZXQgPSAodWludDMyX3QpbVdyaXRlSW5kZXhbaV0tPm1PZmZzZXQ7CisgICAgICAgICAgICBoZWFkZXJTdHJlYW0uYWRkVTMyKG9mZnNldCk7CisgICAgICAgICAgICBvZmZzZXQgPSAodWludDMyX3QpbVdyaXRlSW5kZXhbaV0tPm1MZW5ndGg7CisgICAgICAgICAgICBoZWFkZXJTdHJlYW0uYWRkVTMyKG9mZnNldCk7CiAgICAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgICBwLT5tUmVzdGFydHMgPSBOVUxMOwogICAgIH0KIAotICAgIGllLT5tUnNPYmogPSBwOworICAgIC8vIFdyaXRlIG91ciBtYWdpYyBzdHJpbmcgc28gd2Uga25vdyB3ZSBhcmUgcmVhZGluZyB0aGUgcmlnaHQgZmlsZQorICAgIFN0cmluZzggbWFnaWNTdHJpbmcoQTNEX01BR0lDX0tFWSk7CisgICAgZndyaXRlKG1hZ2ljU3RyaW5nLnN0cmluZygpLCBzaXplb2YoY2hhciksIG1hZ2ljU3RyaW5nLnNpemUoKSwgd3JpdGVIYW5kbGUpOworCisgICAgLy8gU3RvcmUgdGhlIHNpemUgb2YgdGhlIGhlYWRlciB0byBtYWtlIGl0IGVhc2llciB0byBwYXJzZSB3aGVuIHdlIHJlYWQgaXQKKyAgICB1aW50NjRfdCBoZWFkZXJTaXplID0gaGVhZGVyU3RyZWFtLmdldFBvcygpOworICAgIGZ3cml0ZSgmaGVhZGVyU2l6ZSwgc2l6ZW9mKGhlYWRlclNpemUpLCAxLCB3cml0ZUhhbmRsZSk7CisKKyAgICAvLyBOb3cgd3JpdGUgb3VyIGhlYWRlcgorICAgIGZ3cml0ZShoZWFkZXJTdHJlYW0uZ2V0UHRyKCksIHNpemVvZih1aW50OF90KSwgaGVhZGVyU3RyZWFtLmdldFBvcygpLCB3cml0ZUhhbmRsZSk7CisKKyAgICAvLyBOb3cgd3JpdGUgdGhlIHNpemUgb2YgdGhlIGRhdGEgcGFydCBvZiB0aGUgZmlsZSBmb3IgZWFzaWVyIHBhcnNpbmcgbGF0ZXIKKyAgICB1aW50NjRfdCBmaWxlRGF0YVNpemUgPSBtV3JpdGVTdHJlYW0tPmdldFBvcygpOworICAgIGZ3cml0ZSgmZmlsZURhdGFTaXplLCBzaXplb2YoZmlsZURhdGFTaXplKSwgMSwgd3JpdGVIYW5kbGUpOworCisgICAgZndyaXRlKG1Xcml0ZVN0cmVhbS0+Z2V0UHRyKCksIHNpemVvZih1aW50OF90KSwgbVdyaXRlU3RyZWFtLT5nZXRQb3MoKSwgd3JpdGVIYW5kbGUpOworCisgICAgaW50IHN0YXR1cyA9IGZjbG9zZSh3cml0ZUhhbmRsZSk7CisKKyAgICBpZihzdGF0dXMgIT0gMCkgeworICAgICAgICBMT0dFKCJDb3VsZG4ndCBjbG9zZSBmaWxlXG4iKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHJldHVybiB0cnVlOwogfQogCi12b2lkIEZpbGVBM0Q6OnByb2Nlc3NDaHVua19WZXJ0aWNpZXMoQ29udGV4dCAqcnNjLCBJTyAqaW8sIEEzREluZGV4RW50cnkgKmllKQotewotICAgIE1lc2g6OlZlcnRpY2llc190ICpjdiA9IG5ldyBNZXNoOjpWZXJ0aWNpZXNfdDsKLSAgICBjdi0+bUFsbG9jYXRpb25Db3VudCA9IGlvLT5sb2FkVTMyKCk7Ci0gICAgY3YtPm1BbGxvY2F0aW9ucyA9IG5ldyBBbGxvY2F0aW9uICpbY3YtPm1BbGxvY2F0aW9uQ291bnRdOwotICAgIExPR0UoInByb2Nlc3NDaHVua19WZXJ0aWNpZXMgY291bnQgJWkiLCBjdi0+bUFsbG9jYXRpb25Db3VudCk7Ci0gICAgZm9yICh1aW50MzJfdCBjdCA9IDA7IGN0IDwgY3YtPm1BbGxvY2F0aW9uQ291bnQ7IGN0KyspIHsKLSAgICAgICAgdWludDMyX3QgaSA9IGlvLT5sb2FkVTMyKCk7Ci0gICAgICAgIGN2LT5tQWxsb2NhdGlvbnNbY3RdID0gKEFsbG9jYXRpb24gKiltSW5kZXhbaV0ubVJzT2JqOwotICAgICAgICBMT0dFKCIgIGlkeCAlaSIsIGkpOwordm9pZCBGaWxlQTNEOjphcHBlbmRUb0ZpbGUoT2JqZWN0QmFzZSAqb2JqKSB7CisgICAgaWYoIW9iaikgeworICAgICAgICByZXR1cm47CiAgICAgfQotICAgIGllLT5tUnNPYmogPSBjdjsKLX0KLQotdm9pZCBGaWxlQTNEOjpwcm9jZXNzQ2h1bmtfRWxlbWVudChDb250ZXh0ICpyc2MsIElPICppbywgQTNESW5kZXhFbnRyeSAqaWUpCi17Ci0gICAgLyoKLSAgICByc2lfRWxlbWVudEJlZ2luKHJzYyk7Ci0KLSAgICB1aW50MzJfdCBjb3VudCA9IGlvLT5sb2FkVTMyKCk7Ci0gICAgTE9HRSgicHJvY2Vzc0NodW5rX0VsZW1lbnQgY291bnQgJWkiLCBjb3VudCk7Ci0gICAgd2hpbGUgKGNvdW50LS0pIHsKLSAgICAgICAgUnNEYXRhS2luZCBkayA9IChSc0RhdGFLaW5kKWlvLT5sb2FkVTgoKTsKLSAgICAgICAgUnNEYXRhVHlwZSBkdCA9IChSc0RhdGFUeXBlKWlvLT5sb2FkVTgoKTsKLSAgICAgICAgdWludDMyX3QgYml0cyA9IGlvLT5sb2FkVTgoKTsKLSAgICAgICAgYm9vbCBpc05vcm0gPSBpby0+bG9hZFU4KCkgIT0gMDsKLSAgICAgICAgTE9HRSgiICAlaSAlaSAlaSAlaSIsIGRrLCBkdCwgYml0cywgaXNOb3JtKTsKLSAgICAgICAgcnNpX0VsZW1lbnRBZGQocnNjLCBkaywgZHQsIGlzTm9ybSwgYml0cywgMCk7CisgICAgaWYoIW1Xcml0ZVN0cmVhbSkgeworICAgICAgICBjb25zdCB1aW50NjRfdCBpbml0aWFsU3RyZWFtU2l6ZSA9IDI1NioxMDI0OworICAgICAgICBtV3JpdGVTdHJlYW0gPSBuZXcgT1N0cmVhbShpbml0aWFsU3RyZWFtU2l6ZSwgZmFsc2UpOwogICAgIH0KLSAgICBMT0dFKCJwcm9jZXNzQ2h1bmtfRWxlbWVudCBjcmVhdGUiKTsKLSAgICBpZS0+bVJzT2JqID0gcnNpX0VsZW1lbnRDcmVhdGUocnNjKTsKLSAgICAqLwotfQotCi12b2lkIEZpbGVBM0Q6OnByb2Nlc3NDaHVua19FbGVtZW50U291cmNlKENvbnRleHQgKnJzYywgSU8gKmlvLCBBM0RJbmRleEVudHJ5ICppZSkKLXsKLSAgICB1aW50MzJfdCBpbmRleCA9IGlvLT5sb2FkVTMyKCk7Ci0gICAgdWludDMyX3QgY291bnQgPSBpby0+bG9hZFUzMigpOwotCi0gICAgTE9HRSgicHJvY2Vzc0NodW5rX0VsZW1lbnRTb3VyY2UgY291bnQgJWksIGluZGV4ICVpIiwgY291bnQsIGluZGV4KTsKLQotICAgIFJzRWxlbWVudCBlID0gKFJzRWxlbWVudCltSW5kZXhbaW5kZXhdLm1Sc09iajsKLQotICAgIFJzQWxsb2NhdGlvbiBhID0gcnNpX0FsbG9jYXRpb25DcmVhdGVTaXplZChyc2MsIGUsIGNvdW50KTsKLSAgICBBbGxvY2F0aW9uICogYWxsb2MgPSBzdGF0aWNfY2FzdDxBbGxvY2F0aW9uICo+KGEpOwotCi0gICAgZmxvYXQgKiBkYXRhID0gKGZsb2F0ICopYWxsb2MtPmdldFB0cigpOwotICAgIHdoaWxlKGNvdW50LS0pIHsKLSAgICAgICAgKmRhdGEgPSBpby0+bG9hZEYoKTsKLSAgICAgICAgTE9HRSgiICAlZiIsICpkYXRhKTsKLSAgICAgICAgZGF0YSsrOwotICAgIH0KLSAgICBpZS0+bVJzT2JqID0gYWxsb2M7CisgICAgQTNESW5kZXhFbnRyeSAqaW5kZXhFbnRyeSA9IG5ldyBBM0RJbmRleEVudHJ5KCk7CisgICAgaW5kZXhFbnRyeS0+bU9iamVjdE5hbWUuc2V0VG8ob2JqLT5nZXROYW1lKCkpOworICAgIGluZGV4RW50cnktPm1UeXBlID0gb2JqLT5nZXRDbGFzc0lkKCk7CisgICAgaW5kZXhFbnRyeS0+bU9mZnNldCA9IG1Xcml0ZVN0cmVhbS0+Z2V0UG9zKCk7CisgICAgaW5kZXhFbnRyeS0+bVJzT2JqID0gb2JqOworICAgIG1Xcml0ZUluZGV4LnB1c2goaW5kZXhFbnRyeSk7CisgICAgb2JqLT5zZXJpYWxpemUobVdyaXRlU3RyZWFtKTsKKyAgICBpbmRleEVudHJ5LT5tTGVuZ3RoID0gbVdyaXRlU3RyZWFtLT5nZXRQb3MoKSAtIGluZGV4RW50cnktPm1PZmZzZXQ7CisgICAgbVdyaXRlU3RyZWFtLT5hbGlnbig0KTsKIH0KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogbmFtZXNwYWNlIHJlbmRlcnNjcmlwdCB7CiAKK3ZvaWQgcnNpX0ZpbGVBM0RHZXROdW1JbmRleEVudHJpZXMoQ29udGV4dCAqcnNjLCBpbnQzMl90ICpudW1FbnRyaWVzLCBSc0ZpbGUgZmlsZSkKK3sKKyAgICBGaWxlQTNEICpmYTNkID0gc3RhdGljX2Nhc3Q8RmlsZUEzRCAqPihmaWxlKTsKKworICAgIGlmKGZhM2QpIHsKKyAgICAgICAgKm51bUVudHJpZXMgPSBmYTNkLT5nZXROdW1JbmRleEVudHJpZXMoKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgICpudW1FbnRyaWVzID0gMDsKKyAgICB9Cit9CisKK3ZvaWQgcnNpX0ZpbGVBM0RHZXRJbmRleEVudHJpZXMoQ29udGV4dCAqcnNjLCBSc0ZpbGVJbmRleEVudHJ5ICpmaWxlRW50cmllcywgdWludDMyX3QgbnVtRW50cmllcywgUnNGaWxlIGZpbGUpCit7CisgICAgRmlsZUEzRCAqZmEzZCA9IHN0YXRpY19jYXN0PEZpbGVBM0QgKj4oZmlsZSk7CisKKyAgICBpZighZmEzZCkgeworICAgICAgICBMT0dFKCJDYW4ndCBsb2FkIGluZGV4IGVudHJpZXMuIE5vIHZhbGlkIGZpbGUiKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHVpbnQzMl90IG51bUZpbGVFbnRyaWVzID0gZmEzZC0+Z2V0TnVtSW5kZXhFbnRyaWVzKCk7CisgICAgaWYobnVtRmlsZUVudHJpZXMgIT0gbnVtRW50cmllcyB8fCBudW1FbnRyaWVzID09IDAgfHwgZmlsZUVudHJpZXMgPT0gTlVMTCkgeworICAgICAgICBMT0dFKCJDYW4ndCBsb2FkIGluZGV4IGVudHJpZXMuIEludmFsaWQgbnVtYmVyIHJlcXVlc3RlZCIpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgZm9yKHVpbnQzMl90IGkgPSAwOyBpIDwgbnVtRmlsZUVudHJpZXM7IGkgKyspIHsKKyAgICAgICAgY29uc3QgRmlsZUEzRDo6QTNESW5kZXhFbnRyeSAqZW50cnkgPSBmYTNkLT5nZXRJbmRleEVudHJ5KGkpOworICAgICAgICBmaWxlRW50cmllc1tpXS5jbGFzc0lEID0gZW50cnktPmdldFR5cGUoKTsKKyAgICAgICAgZmlsZUVudHJpZXNbaV0ub2JqZWN0TmFtZSA9IGVudHJ5LT5nZXRPYmplY3ROYW1lKCkuc3RyaW5nKCk7CisgICAgfQorCit9CisKK1JzT2JqZWN0QmFzZSByc2lfRmlsZUEzREdldEVudHJ5QnlJbmRleChDb250ZXh0ICpyc2MsIHVpbnQzMl90IGluZGV4LCBSc0ZpbGUgZmlsZSkKK3sKKyAgICBGaWxlQTNEICpmYTNkID0gc3RhdGljX2Nhc3Q8RmlsZUEzRCAqPihmaWxlKTsKKyAgICBpZighZmEzZCkgeworICAgICAgICBMT0dFKCJDYW4ndCBsb2FkIGVudHJ5LiBObyB2YWxpZCBmaWxlIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIE9iamVjdEJhc2UgKm9iaiA9IGZhM2QtPmluaXRpYWxpemVGcm9tRW50cnkoaW5kZXgpOworICAgIExPR0UoIlJldHVybmluZyBvYmplY3Qgd2l0aCBuYW1lICVzIiwgb2JqLT5nZXROYW1lKCkpOworCisgICAgcmV0dXJuIG9iajsKK30KKworUnNGaWxlIHJzaV9GaWxlQTNEQ3JlYXRlRnJvbUFzc2V0U3RyZWFtKENvbnRleHQgKnJzYywgY29uc3Qgdm9pZCAqZGF0YSwgdWludDMyX3QgbGVuKQoreworICAgIGlmIChkYXRhID09IE5VTEwpIHsKKyAgICAgICAgTE9HRSgiRmlsZSBsb2FkIGZhaWxlZC4gQXNzZXQgc3RyZWFtIGlzIE5VTEwiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgRmlsZUEzRCAqZmEzZCA9IG5ldyBGaWxlQTNEKHJzYyk7CisKKyAgICBmYTNkLT5sb2FkKGRhdGEsIGxlbik7CisgICAgZmEzZC0+aW5jVXNlclJlZigpOworCisgICAgcmV0dXJuIGZhM2Q7Cit9CisKIAogUnNGaWxlIHJzaV9GaWxlT3BlbihDb250ZXh0ICpyc2MsIGNoYXIgY29uc3QgKnBhdGgsIHVuc2lnbmVkIGludCBsZW4pCiB7Ci0gICAgRmlsZUEzRCAqZmEzZCA9IG5ldyBGaWxlQTNEOworICAgIEZpbGVBM0QgKmZhM2QgPSBuZXcgRmlsZUEzRChyc2MpOwogCiAgICAgRklMRSAqZiA9IGZvcGVuKCIvc2RjYXJkL3Rlc3QuYTNkIiwgInJiIik7CiAgICAgaWYgKGYpIHsKLSAgICAgICAgZmEzZC0+bG9hZChyc2MsIGYpOworICAgICAgICBmYTNkLT5sb2FkKGYpOwogICAgICAgICBmY2xvc2UoZik7CisgICAgICAgIGZhM2QtPmluY1VzZXJSZWYoKTsKICAgICAgICAgcmV0dXJuIGZhM2Q7CiAgICAgfQogICAgIGRlbGV0ZSBmYTNkOwpkaWZmIC0tZ2l0IGEvbGlicy9ycy9yc0ZpbGVBM0QuaCBiL2xpYnMvcnMvcnNGaWxlQTNELmgKaW5kZXggOWVlMDhlYy4uYjk4NTkwNyAxMDA2NDQKLS0tIGEvbGlicy9ycy9yc0ZpbGVBM0QuaAorKysgYi9saWJzL3JzL3JzRmlsZUEzRC5oCkBAIC0xOCwyMCArMTgsMjMgQEAKICNkZWZpbmUgQU5EUk9JRF9SU19GSUxFX0EzRF9ICiAKICNpbmNsdWRlICJSZW5kZXJTY3JpcHQuaCIKLSNpbmNsdWRlICJyc0ZpbGVBM0REZWNscy5oIgogI2luY2x1ZGUgInJzTWVzaC5oIgogCiAjaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgorI2luY2x1ZGUgInJzU3RyZWFtLmgiCiAjaW5jbHVkZSA8c3RkaW8uaD4KIAorI2RlZmluZSBBM0RfTUFHSUNfS0VZICJBbmRyb2lkM0RfZmYiCisKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogbmFtZXNwYWNlIGFuZHJvaWQgeworCiBuYW1lc3BhY2UgcmVuZGVyc2NyaXB0IHsKIAotY2xhc3MgRmlsZUEzRAorY2xhc3MgRmlsZUEzRCA6IHB1YmxpYyBPYmplY3RCYXNlCiB7CiBwdWJsaWM6Ci0gICAgRmlsZUEzRCgpOworICAgIEZpbGVBM0QoQ29udGV4dCAqcnNjKTsKICAgICB+RmlsZUEzRCgpOwogCiAgICAgdWludDMyX3QgbU1ham9yVmVyc2lvbjsKQEAgLTQwLDc4ICs0Myw1MyBAQAogICAgIHVpbnQ2NF90IG1TdHJpbmdUYWJsZU9mZnNldDsKICAgICBib29sIG1Vc2U2NEJpdE9mZnNldHM7CiAKLSAgICBzdHJ1Y3QgQTNESW5kZXhFbnRyeSB7Ci0gICAgICAgIFN0cmluZzggbUlEOwotICAgICAgICBBM0RDaHVua1R5cGUgbVR5cGU7CisgICAgY2xhc3MgQTNESW5kZXhFbnRyeSB7CisgICAgICAgIFN0cmluZzggbU9iamVjdE5hbWU7CisgICAgICAgIFJzQTNEQ2xhc3NJRCBtVHlwZTsKICAgICAgICAgdWludDY0X3QgbU9mZnNldDsKLSAgICAgICAgdm9pZCAqIG1Sc09iajsKKyAgICAgICAgdWludDY0X3QgbUxlbmd0aDsKKyAgICAgICAgT2JqZWN0QmFzZSAqbVJzT2JqOworICAgIHB1YmxpYzoKKyAgICAgICAgZnJpZW5kIGNsYXNzIEZpbGVBM0Q7CisgICAgICAgIGNvbnN0IFN0cmluZzggJmdldE9iamVjdE5hbWUoKSBjb25zdCB7CisgICAgICAgICAgICByZXR1cm4gbU9iamVjdE5hbWU7CisgICAgICAgIH0KKyAgICAgICAgUnNBM0RDbGFzc0lEIGdldFR5cGUoKSBjb25zdCB7CisgICAgICAgICAgICByZXR1cm4gbVR5cGU7CisgICAgICAgIH0KICAgICB9OwogCi0gICAgYm9vbCBsb2FkKENvbnRleHQgKnJzYywgRklMRSAqZik7CisgICAgYm9vbCBsb2FkKEZJTEUgKmYpOworICAgIGJvb2wgbG9hZChjb25zdCB2b2lkICpkYXRhLCBzaXplX3QgbGVuZ3RoKTsKKworICAgIHNpemVfdCBnZXROdW1JbmRleEVudHJpZXMoKSBjb25zdDsKKyAgICBjb25zdCBBM0RJbmRleEVudHJ5KiBnZXRJbmRleEVudHJ5KHNpemVfdCBpbmRleCkgY29uc3Q7CisgICAgT2JqZWN0QmFzZSAqaW5pdGlhbGl6ZUZyb21FbnRyeShzaXplX3QgaW5kZXgpOworCisgICAgdm9pZCBhcHBlbmRUb0ZpbGUoT2JqZWN0QmFzZSAqb2JqKTsKKyAgICBib29sIHdyaXRlRmlsZShjb25zdCBjaGFyICpmaWxlbmFtZSk7CisKKyAgICAvLyBDdXJyZW50bHkgZmlsZXMgZG8gbm90IGdldCBzZXJpYWxpemVkLAorICAgIC8vIGJ1dCB3ZSBuZWVkIHRvIGluaGVyaXQgZnJvbSBPYmplY3RCYXNlIGZvciByZWYgdHJhY2tpbmcKKyAgICB2aXJ0dWFsIHZvaWQgc2VyaWFsaXplKE9TdHJlYW0gKnN0cmVhbSkgY29uc3QgeworICAgIH0KKyAgICB2aXJ0dWFsIFJzQTNEQ2xhc3NJRCBnZXRDbGFzc0lkKCkgY29uc3QgeworICAgICAgICByZXR1cm4gUlNfQTNEX0NMQVNTX0lEX1VOS05PV047CisgICAgfQogCiBwcm90ZWN0ZWQ6Ci0gICAgY2xhc3MgSU8KLSAgICB7Ci0gICAgcHVibGljOgotICAgICAgICBJTyhjb25zdCB1aW50OF90ICosIGJvb2wgdXNlNjQpOwotICAgIAotICAgICAgICBmbG9hdCBsb2FkRigpIHsKLSAgICAgICAgICAgIG1Qb3MgPSAobVBvcyArIDMpICYgKH4zKTsKLSAgICAgICAgICAgIGZsb2F0IHRtcCA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgZmxvYXQgKj4oJm1EYXRhW21Qb3NdKVswXTsKLSAgICAgICAgICAgIG1Qb3MgKz0gc2l6ZW9mKGZsb2F0KTsKLSAgICAgICAgICAgIHJldHVybiB0bXA7Ci0gICAgICAgIH0KLSAgICAgICAgaW50MzJfdCBsb2FkSTMyKCkgewotICAgICAgICAgICAgbVBvcyA9IChtUG9zICsgMykgJiAofjMpOwotICAgICAgICAgICAgaW50MzJfdCB0bXAgPSByZWludGVycHJldF9jYXN0PGNvbnN0IGludDMyX3QgKj4oJm1EYXRhW21Qb3NdKVswXTsKLSAgICAgICAgICAgIG1Qb3MgKz0gc2l6ZW9mKGludDMyX3QpOwotICAgICAgICAgICAgcmV0dXJuIHRtcDsKLSAgICAgICAgfQotICAgICAgICB1aW50MzJfdCBsb2FkVTMyKCkgewotICAgICAgICAgICAgbVBvcyA9IChtUG9zICsgMykgJiAofjMpOwotICAgICAgICAgICAgdWludDMyX3QgdG1wID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50MzJfdCAqPigmbURhdGFbbVBvc10pWzBdOwotICAgICAgICAgICAgbVBvcyArPSBzaXplb2YodWludDMyX3QpOwotICAgICAgICAgICAgcmV0dXJuIHRtcDsKLSAgICAgICAgfQotICAgICAgICB1aW50MTZfdCBsb2FkVTE2KCkgewotICAgICAgICAgICAgbVBvcyA9IChtUG9zICsgMSkgJiAofjEpOwotICAgICAgICAgICAgdWludDE2X3QgdG1wID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50MTZfdCAqPigmbURhdGFbbVBvc10pWzBdOwotICAgICAgICAgICAgbVBvcyArPSBzaXplb2YodWludDE2X3QpOwotICAgICAgICAgICAgcmV0dXJuIHRtcDsKLSAgICAgICAgfQotICAgICAgICB1aW50OF90IGxvYWRVOCgpIHsKLSAgICAgICAgICAgIHVpbnQ4X3QgdG1wID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OF90ICo+KCZtRGF0YVttUG9zXSlbMF07Ci0gICAgICAgICAgICBtUG9zICs9IHNpemVvZih1aW50OF90KTsKLSAgICAgICAgICAgIHJldHVybiB0bXA7Ci0gICAgICAgIH0KLSAgICAgICAgdWludDY0X3QgbG9hZE9mZnNldCgpOwotICAgICAgICB2b2lkIGxvYWRTdHJpbmcoU3RyaW5nOCAqcyk7Ci0gICAgICAgIHVpbnQ2NF90IGdldFBvcygpIGNvbnN0IHtyZXR1cm4gbVBvczt9Ci0gICAgICAgIGNvbnN0IHVpbnQ4X3QgKiBnZXRQdHIoKSBjb25zdDsKLSAgICBwcm90ZWN0ZWQ6Ci0gICAgICAgIGNvbnN0IHVpbnQ4X3QgKiBtRGF0YTsKLSAgICAgICAgdWludDY0X3QgbVBvczsKLSAgICAgICAgYm9vbCBtVXNlNjQ7Ci0gICAgfTsKIAotCi0gICAgYm9vbCBwcm9jZXNzKENvbnRleHQgKnJzYyk7Ci0gICAgYm9vbCBwcm9jZXNzSW5kZXgoQ29udGV4dCAqcnNjLCBBM0RJbmRleEVudHJ5ICopOwotICAgIHZvaWQgcHJvY2Vzc0NodW5rX01lc2goQ29udGV4dCAqcnNjLCBJTyAqaW8sIEEzREluZGV4RW50cnkgKmllKTsKLSAgICB2b2lkIHByb2Nlc3NDaHVua19QcmltaXRpdmUoQ29udGV4dCAqcnNjLCBJTyAqaW8sIEEzREluZGV4RW50cnkgKmllKTsKLSAgICB2b2lkIHByb2Nlc3NDaHVua19WZXJ0aWNpZXMoQ29udGV4dCAqcnNjLCBJTyAqaW8sIEEzREluZGV4RW50cnkgKmllKTsKLSAgICB2b2lkIHByb2Nlc3NDaHVua19FbGVtZW50KENvbnRleHQgKnJzYywgSU8gKmlvLCBBM0RJbmRleEVudHJ5ICppZSk7Ci0gICAgdm9pZCBwcm9jZXNzQ2h1bmtfRWxlbWVudFNvdXJjZShDb250ZXh0ICpyc2MsIElPICppbywgQTNESW5kZXhFbnRyeSAqaWUpOworICAgIHZvaWQgcGFyc2VIZWFkZXIoSVN0cmVhbSAqaGVhZGVyU3RyZWFtKTsKIAogICAgIGNvbnN0IHVpbnQ4X3QgKiBtRGF0YTsKICAgICB2b2lkICogbUFsbG9jOwogICAgIHVpbnQ2NF90IG1EYXRhU2l6ZTsKLSAgICBDb250ZXh0ICogbVJzYzsKIAotICAgIFZlY3RvcjxBM0RJbmRleEVudHJ5PiBtSW5kZXg7Ci0gICAgVmVjdG9yPFN0cmluZzg+IG1TdHJpbmdzOwotICAgIFZlY3Rvcjx1aW50MzJfdD4gbVN0cmluZ0luZGV4VmFsdWVzOworICAgIE9TdHJlYW0gKm1Xcml0ZVN0cmVhbTsKKyAgICBWZWN0b3I8QTNESW5kZXhFbnRyeSo+IG1Xcml0ZUluZGV4OwogCisgICAgSVN0cmVhbSAqbVJlYWRTdHJlYW07CisgICAgVmVjdG9yPEEzREluZGV4RW50cnkqPiBtSW5kZXg7CiB9OwogCiAKZGlmZiAtLWdpdCBhL2xpYnMvcnMvcnNGaWxlQTNERGVjbHMuaCBiL2xpYnMvcnMvcnNGaWxlQTNERGVjbHMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmEwOGJkMy4uMDAwMDAwMAotLS0gYS9saWJzL3JzL3JzRmlsZUEzRERlY2xzLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBBTkRST0lEX1JTX0ZJTEVfQTNEX0RFQ0xTX0gKLSNkZWZpbmUgQU5EUk9JRF9SU19GSUxFX0EzRF9ERUNMU19ICi0KLQotI2RlZmluZSBBM0RfTUFHSUNfS0VZICJBbmRyb2lkM0RfZmYiCi0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLW5hbWVzcGFjZSByZW5kZXJzY3JpcHQgewotCi0gICAgZW51bSBBM0RDaHVua1R5cGUgewotICAgICAgICBDSFVOS19FTVBUWSwKLQotICAgICAgICBDSFVOS19FTEVNRU5ULAotICAgICAgICBDSFVOS19FTEVNRU5UX1NPVVJDRSwKLSAgICAgICAgQ0hVTktfVkVSVElDSUVTLAotICAgICAgICBDSFVOS19NRVNILAotICAgICAgICBDSFVOS19QUklNSVRJVkUsCi0KLSAgICAgICAgQ0hVTktfTEFTVAotICAgIH07Ci0KLQotfQotfQotI2VuZGlmIC8vQU5EUk9JRF9SU19GSUxFX0EzRF9ICi0KLQotCmRpZmYgLS1naXQgYS9saWJzL3JzL3JzRm9udC5jcHAgYi9saWJzL3JzL3JzRm9udC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGY4MTVhMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYnMvcnMvcnNGb250LmNwcApAQCAtMCwwICsxLDc4NSBAQAorCisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX1JTX0JVSUxEX0ZPUl9IT1NUCisjaW5jbHVkZSAicnNDb250ZXh0LmgiCisjZWxzZQorI2luY2x1ZGUgInJzQ29udGV4dEhvc3RTdHViLmgiCisjZW5kaWYKKworI2luY2x1ZGUgInJzRm9udC5oIgorI2luY2x1ZGUgInJzUHJvZ3JhbUZyYWdtZW50LmgiCisjaW5jbHVkZSBGVF9CSVRNQVBfSAorCisjaW5jbHVkZSA8R0xFUy9nbC5oPgorI2luY2x1ZGUgPEdMRVMvZ2xleHQuaD4KKyNpbmNsdWRlIDxHTEVTMi9nbDIuaD4KKyNpbmNsdWRlIDxHTEVTMi9nbDJleHQuaD4KKwordXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7Cit1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDo6cmVuZGVyc2NyaXB0OworCitGb250OjpGb250KENvbnRleHQgKnJzYykgOiBPYmplY3RCYXNlKHJzYyksIG1DYWNoZWRHbHlwaHMoTlVMTCkKK3sKKyAgICBtQWxsb2NGaWxlID0gX19GSUxFX187CisgICAgbUFsbG9jTGluZSA9IF9fTElORV9fOworICAgIG1Jbml0aWFsaXplZCA9IGZhbHNlOworICAgIG1IYXNLZXJuaW5nID0gZmFsc2U7CisgICAgbUZhY2UgPSBOVUxMOworfQorCitib29sIEZvbnQ6OmluaXQoY29uc3QgY2hhciAqbmFtZSwgdWludDMyX3QgZm9udFNpemUsIHVpbnQzMl90IGRwaSkKK3sKKyAgICBpZihtSW5pdGlhbGl6ZWQpIHsKKyAgICAgICAgTE9HRSgiUmVpbml0aWFsaXphdGlvbiBvZiBmb250cyBub3Qgc3VwcG9ydGVkIik7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBTdHJpbmc4IGZvbnRzRGlyKCIvZm9udHMvIik7CisgICAgU3RyaW5nOCBmdWxsUGF0aChnZXRlbnYoIkFORFJPSURfUk9PVCIpKTsKKyAgICBmdWxsUGF0aCArPSBmb250c0RpcjsKKyAgICBmdWxsUGF0aCArPSBuYW1lOworCisgICAgRlRfRXJyb3IgZXJyb3IgPSBGVF9OZXdfRmFjZShtUlNDLT5tU3RhdGVGb250LmdldExpYigpLCBmdWxsUGF0aC5zdHJpbmcoKSwgMCwgJm1GYWNlKTsKKyAgICBpZihlcnJvcikgeworICAgICAgICBMT0dFKCJVbmFibGUgdG8gaW5pdGlhbGl6ZSBmb250ICVzIiwgZnVsbFBhdGguc3RyaW5nKCkpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgbUZvbnROYW1lID0gbmFtZTsKKyAgICBtRm9udFNpemUgPSBmb250U2l6ZTsKKyAgICBtRHBpID0gZHBpOworCisgICAgZXJyb3IgPSBGVF9TZXRfQ2hhcl9TaXplKG1GYWNlLCBmb250U2l6ZSAqIDY0LCAwLCBkcGksIDApOworICAgIGlmKGVycm9yKSB7CisgICAgICAgIExPR0UoIlVuYWJsZSB0byBzZXQgZm9udCBzaXplIG9uICVzIiwgZnVsbFBhdGguc3RyaW5nKCkpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgbUhhc0tlcm5pbmcgPSBGVF9IQVNfS0VSTklORyhtRmFjZSk7CisKKyAgICBtSW5pdGlhbGl6ZWQgPSB0cnVlOworICAgIHJldHVybiB0cnVlOworfQorCit2b2lkIEZvbnQ6OmludmFsaWRhdGVUZXh0dXJlQ2FjaGUoKQoreworICAgIGZvcih1aW50MzJfdCBpID0gMDsgaSA8IG1DYWNoZWRHbHlwaHMuc2l6ZSgpOyBpICsrKSB7CisgICAgICAgIG1DYWNoZWRHbHlwaHMudmFsdWVBdChpKS0+bUlzVmFsaWQgPSBmYWxzZTsKKyAgICB9Cit9CisKK3ZvaWQgRm9udDo6ZHJhd0NhY2hlZEdseXBoKENhY2hlZEdseXBoSW5mbyAqZ2x5cGgsIGludCB4LCBpbnQgeSkKK3sKKyAgICBGb250U3RhdGUgKnN0YXRlID0gJm1SU0MtPm1TdGF0ZUZvbnQ7CisKKyAgICBpbnQgblBlblggPSB4ICsgZ2x5cGgtPm1CaXRtYXBMZWZ0OworICAgIGludCBuUGVuWSA9IHkgLSBnbHlwaC0+bUJpdG1hcFRvcCArIGdseXBoLT5tQml0bWFwSGVpZ2h0OworCisgICAgc3RhdGUtPmFwcGVuZE1lc2hRdWFkKG5QZW5YLCBuUGVuWSwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBnbHlwaC0+bUJpdG1hcE1pblUsIGdseXBoLT5tQml0bWFwTWF4ViwKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5QZW5YICsgKGludClnbHlwaC0+bUJpdG1hcFdpZHRoLCBuUGVuWSwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBnbHlwaC0+bUJpdG1hcE1heFUsIGdseXBoLT5tQml0bWFwTWF4ViwKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5QZW5YICsgKGludClnbHlwaC0+bUJpdG1hcFdpZHRoLCBuUGVuWSAtIChpbnQpZ2x5cGgtPm1CaXRtYXBIZWlnaHQsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2x5cGgtPm1CaXRtYXBNYXhVLCBnbHlwaC0+bUJpdG1hcE1pblYsCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuUGVuWCwgblBlblkgLSAoaW50KWdseXBoLT5tQml0bWFwSGVpZ2h0LCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdseXBoLT5tQml0bWFwTWluVSwgZ2x5cGgtPm1CaXRtYXBNaW5WKTsKK30KKwordm9pZCBGb250OjpyZW5kZXJVVEYoY29uc3QgY2hhciAqdGV4dCwgdWludDMyX3QgbGVuLCB1aW50MzJfdCBzdGFydCwgaW50IG51bUdseXBocywgaW50IHgsIGludCB5KQoreworICAgIGlmKCFtSW5pdGlhbGl6ZWQgfHwgbnVtR2x5cGhzID09IDAgfHwgdGV4dCA9PSBOVUxMIHx8IGxlbiA9PSAwKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpbnQgcGVuWCA9IHgsIHBlblkgPSB5OworICAgIGludCBnbHlwaHNMZWZ0ID0gMTsKKyAgICBpZihudW1HbHlwaHMgPiAwKSB7CisgICAgICAgIGdseXBoc0xlZnQgPSBudW1HbHlwaHM7CisgICAgfQorCisgICAgc2l6ZV90IGluZGV4ID0gc3RhcnQ7CisgICAgc2l6ZV90IG5leHRJbmRleCA9IDA7CisKKyAgICB3aGlsZSAoZ2x5cGhzTGVmdCA+IDApIHsKKworICAgICAgICBpbnQzMl90IHV0ZkNoYXIgPSB1dGYzMl9hdCh0ZXh0LCBsZW4sIGluZGV4LCAmbmV4dEluZGV4KTsKKworICAgICAgICAvLyBSZWFjaGVkIHRoZSBlbmQgb2YgdGhlIHN0cmluZyBvciBlbmNvdW50ZXJlZAorICAgICAgICBpZih1dGZDaGFyIDwgMCkgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICAvLyBNb3ZlIHRvIHRoZSBuZXh0IGNoYXJhY3RlciBpbiB0aGUgYXJyYXkKKyAgICAgICAgaW5kZXggPSBuZXh0SW5kZXg7CisKKyAgICAgICAgQ2FjaGVkR2x5cGhJbmZvICpjYWNoZWRHbHlwaCA9IGdldENhY2hlZFVURkNoYXIodXRmQ2hhcik7CisKKyAgICAgICAgLy8gSWYgaXQncyBzdGlsbCBub3QgdmFsaWQsIHdlIGNvdWxkbid0IGNhY2hlIGl0LCBzbyB3ZSBzaG91bGRuJ3QgZHJhdyBnYXJiYWdlCisgICAgICAgIGlmKGNhY2hlZEdseXBoLT5tSXNWYWxpZCkgeworICAgICAgICAgICAgZHJhd0NhY2hlZEdseXBoKGNhY2hlZEdseXBoLCBwZW5YLCBwZW5ZKTsKKyAgICAgICAgfQorCisgICAgICAgIHBlblggKz0gKGNhY2hlZEdseXBoLT5tQWR2YW5jZS54ID4+IDYpOworCisgICAgICAgIC8vIElmIHdlIHdlcmUgZ2l2ZW4gYSBzcGVjaWZpYyBudW1iZXIgb2YgZ2x5cGhzLCBkZWNyZW1lbnQKKyAgICAgICAgaWYobnVtR2x5cGhzID4gMCkgeworICAgICAgICAgICAgZ2x5cGhzTGVmdCAtLTsKKyAgICAgICAgfQorICAgIH0KK30KKworRm9udDo6Q2FjaGVkR2x5cGhJbmZvKiBGb250OjpnZXRDYWNoZWRVVEZDaGFyKGludDMyX3QgdXRmQ2hhcikgeworCisgICAgQ2FjaGVkR2x5cGhJbmZvICpjYWNoZWRHbHlwaCA9IG1DYWNoZWRHbHlwaHMudmFsdWVGb3IoKHVpbnQzMl90KXV0ZkNoYXIpOworICAgIGlmKGNhY2hlZEdseXBoID09IE5VTEwpIHsKKyAgICAgICAgY2FjaGVkR2x5cGggPSBjYWNoZUdseXBoKCh1aW50MzJfdCl1dGZDaGFyKTsKKyAgICB9CisgICAgLy8gSXMgdGhlIGdseXBoIHN0aWxsIGluIHRleHR1cmUgY2FjaGU/CisgICAgaWYoIWNhY2hlZEdseXBoLT5tSXNWYWxpZCkgeworICAgICAgICB1cGRhdGVHbHlwaENhY2hlKGNhY2hlZEdseXBoKTsKKyAgICB9CisKKyAgICByZXR1cm4gY2FjaGVkR2x5cGg7Cit9CisKK3ZvaWQgRm9udDo6dXBkYXRlR2x5cGhDYWNoZShDYWNoZWRHbHlwaEluZm8gKmdseXBoKQoreworICAgIEZUX0Vycm9yIGVycm9yID0gRlRfTG9hZF9HbHlwaCggbUZhY2UsIGdseXBoLT5tR2x5cGhJbmRleCwgRlRfTE9BRF9SRU5ERVIgKTsKKyAgICBpZihlcnJvcikgeworICAgICAgICBMT0dFKCJDb3VsZG4ndCBsb2FkIGdseXBoLiIpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgZ2x5cGgtPm1BZHZhbmNlID0gbUZhY2UtPmdseXBoLT5hZHZhbmNlOworICAgIGdseXBoLT5tQml0bWFwTGVmdCA9IG1GYWNlLT5nbHlwaC0+Yml0bWFwX2xlZnQ7CisgICAgZ2x5cGgtPm1CaXRtYXBUb3AgPSBtRmFjZS0+Z2x5cGgtPmJpdG1hcF90b3A7CisKKyAgICBGVF9CaXRtYXAgKmJpdG1hcCA9ICZtRmFjZS0+Z2x5cGgtPmJpdG1hcDsKKworICAgIC8vIE5vdyBjb3B5IHRoZSBiaXRtYXAgaW50byB0aGUgY2FjaGUgdGV4dHVyZQorICAgIHVpbnQzMl90IHN0YXJ0WCA9IDA7CisgICAgdWludDMyX3Qgc3RhcnRZID0gMDsKKworICAgIC8vIExldCB0aGUgZm9udCBzdGF0ZSBmaWd1cmUgb3V0IHdoZXJlIHRvIHB1dCB0aGUgYml0bWFwCisgICAgRm9udFN0YXRlICpzdGF0ZSA9ICZtUlNDLT5tU3RhdGVGb250OworICAgIGdseXBoLT5tSXNWYWxpZCA9IHN0YXRlLT5jYWNoZUJpdG1hcChiaXRtYXAsICZzdGFydFgsICZzdGFydFkpOworCisgICAgaWYoIWdseXBoLT5tSXNWYWxpZCkgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgdWludDMyX3QgZW5kWCA9IHN0YXJ0WCArIGJpdG1hcC0+d2lkdGg7CisgICAgdWludDMyX3QgZW5kWSA9IHN0YXJ0WSArIGJpdG1hcC0+cm93czsKKworICAgIGdseXBoLT5tQml0bWFwTWluWCA9IHN0YXJ0WDsKKyAgICBnbHlwaC0+bUJpdG1hcE1pblkgPSBzdGFydFk7CisgICAgZ2x5cGgtPm1CaXRtYXBXaWR0aCA9IGJpdG1hcC0+d2lkdGg7CisgICAgZ2x5cGgtPm1CaXRtYXBIZWlnaHQgPSBiaXRtYXAtPnJvd3M7CisKKyAgICB1aW50MzJfdCBjYWNoZVdpZHRoID0gc3RhdGUtPmdldENhY2hlVGV4dHVyZVR5cGUoKS0+Z2V0RGltWCgpOworICAgIHVpbnQzMl90IGNhY2hlSGVpZ2h0ID0gc3RhdGUtPmdldENhY2hlVGV4dHVyZVR5cGUoKS0+Z2V0RGltWSgpOworCisgICAgZ2x5cGgtPm1CaXRtYXBNaW5VID0gKGZsb2F0KXN0YXJ0WCAvIChmbG9hdCljYWNoZVdpZHRoOworICAgIGdseXBoLT5tQml0bWFwTWluViA9IChmbG9hdClzdGFydFkgLyAoZmxvYXQpY2FjaGVIZWlnaHQ7CisgICAgZ2x5cGgtPm1CaXRtYXBNYXhVID0gKGZsb2F0KWVuZFggLyAoZmxvYXQpY2FjaGVXaWR0aDsKKyAgICBnbHlwaC0+bUJpdG1hcE1heFYgPSAoZmxvYXQpZW5kWSAvIChmbG9hdCljYWNoZUhlaWdodDsKK30KKworRm9udDo6Q2FjaGVkR2x5cGhJbmZvICpGb250OjpjYWNoZUdseXBoKHVpbnQzMl90IGdseXBoKQoreworICAgIENhY2hlZEdseXBoSW5mbyAqbmV3R2x5cGggPSBuZXcgQ2FjaGVkR2x5cGhJbmZvKCk7CisgICAgbUNhY2hlZEdseXBocy5hZGQoZ2x5cGgsIG5ld0dseXBoKTsKKworICAgIG5ld0dseXBoLT5tR2x5cGhJbmRleCA9IEZUX0dldF9DaGFyX0luZGV4KG1GYWNlLCBnbHlwaCk7CisgICAgbmV3R2x5cGgtPm1Jc1ZhbGlkID0gZmFsc2U7CisKKyAgICB1cGRhdGVHbHlwaENhY2hlKG5ld0dseXBoKTsKKworICAgIHJldHVybiBuZXdHbHlwaDsKK30KKworRm9udCAqIEZvbnQ6OmNyZWF0ZShDb250ZXh0ICpyc2MsIGNvbnN0IGNoYXIgKm5hbWUsIHVpbnQzMl90IGZvbnRTaXplLCB1aW50MzJfdCBkcGkpCit7CisgICAgcnNjLT5tU3RhdGVGb250LmNoZWNrSW5pdCgpOworICAgIFZlY3RvcjxGb250Kj4gJmFjdGl2ZUZvbnRzID0gcnNjLT5tU3RhdGVGb250Lm1BY3RpdmVGb250czsKKworICAgIGZvcih1aW50MzJfdCBpID0gMDsgaSA8IGFjdGl2ZUZvbnRzLnNpemUoKTsgaSArKykgeworICAgICAgICBGb250ICppdGhGb250ID0gYWN0aXZlRm9udHNbaV07CisgICAgICAgIGlmKGl0aEZvbnQtPm1Gb250TmFtZSA9PSBuYW1lICYmIGl0aEZvbnQtPm1Gb250U2l6ZSA9PSBmb250U2l6ZSAmJiBpdGhGb250LT5tRHBpID09IGRwaSkgeworICAgICAgICAgICAgcmV0dXJuIGl0aEZvbnQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBGb250ICpuZXdGb250ID0gbmV3IEZvbnQocnNjKTsKKyAgICBib29sIGlzSW5pdGlhbGl6ZWQgPSBuZXdGb250LT5pbml0KG5hbWUsIGZvbnRTaXplLCBkcGkpOworICAgIGlmKGlzSW5pdGlhbGl6ZWQpIHsKKyAgICAgICAgYWN0aXZlRm9udHMucHVzaChuZXdGb250KTsKKyAgICAgICAgcnNjLT5tU3RhdGVGb250LnByZWNhY2hlTGF0aW4obmV3Rm9udCk7CisgICAgICAgIHJldHVybiBuZXdGb250OworICAgIH0KKworICAgIGRlbGV0ZSBuZXdGb250OworICAgIHJldHVybiBOVUxMOworCit9CisKK0ZvbnQ6On5Gb250KCkKK3sKKyAgICBpZihtRmFjZSkgeworICAgICAgICBGVF9Eb25lX0ZhY2UobUZhY2UpOworICAgIH0KKworICAgIGZvciAodWludDMyX3QgY3QgPSAwOyBjdCA8IG1SU0MtPm1TdGF0ZUZvbnQubUFjdGl2ZUZvbnRzLnNpemUoKTsgY3QrKykgeworICAgICAgICBpZiAobVJTQy0+bVN0YXRlRm9udC5tQWN0aXZlRm9udHNbY3RdID09IHRoaXMpIHsKKyAgICAgICAgICAgIG1SU0MtPm1TdGF0ZUZvbnQubUFjdGl2ZUZvbnRzLnJlbW92ZUF0KGN0KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgZm9yKHVpbnQzMl90IGkgPSAwOyBpIDwgbUNhY2hlZEdseXBocy5zaXplKCk7IGkgKyspIHsKKyAgICAgICAgQ2FjaGVkR2x5cGhJbmZvICpnbHlwaCA9IG1DYWNoZWRHbHlwaHMudmFsdWVBdChpKTsKKyAgICAgICAgZGVsZXRlIGdseXBoOworICAgIH0KK30KKworRm9udFN0YXRlOjpGb250U3RhdGUoKQoreworICAgIG1Jbml0aWFsaXplZCA9IGZhbHNlOworICAgIG1NYXhOdW1iZXJPZlF1YWRzID0gMTAyNDsKKyAgICBtQ3VycmVudFF1YWRJbmRleCA9IDA7CisgICAgbVJTQyA9IE5VTEw7CisgICAgbUxpYnJhcnkgPSBOVUxMOworICAgIHNldEZvbnRDb2xvcigwLjFmLCAwLjFmLCAwLjFmLCAxLjBmKTsKK30KKworRm9udFN0YXRlOjp+Rm9udFN0YXRlKCkKK3sKKyAgICBmb3IodWludDMyX3QgaSA9IDA7IGkgPCBtQ2FjaGVMaW5lcy5zaXplKCk7IGkgKyspIHsKKyAgICAgICAgZGVsZXRlIG1DYWNoZUxpbmVzW2ldOworICAgIH0KKworICAgIHJzQXNzZXJ0KCFtQWN0aXZlRm9udHMuc2l6ZSgpKTsKK30KKworRlRfTGlicmFyeSBGb250U3RhdGU6OmdldExpYigpCit7CisgICAgaWYoIW1MaWJyYXJ5KSB7CisgICAgICAgIEZUX0Vycm9yIGVycm9yID0gRlRfSW5pdF9GcmVlVHlwZSgmbUxpYnJhcnkpOworICAgICAgICBpZihlcnJvcikgeworICAgICAgICAgICAgTE9HRSgiVW5hYmxlIHRvIGluaXRpYWxpemUgZnJlZXR5cGUiKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIG1MaWJyYXJ5OworfQorCit2b2lkIEZvbnRTdGF0ZTo6aW5pdChDb250ZXh0ICpyc2MpCit7CisgICAgbVJTQyA9IHJzYzsKK30KKwordm9pZCBGb250U3RhdGU6OmZsdXNoQWxsQW5kSW52YWxpZGF0ZSgpCit7CisgICAgaWYobUN1cnJlbnRRdWFkSW5kZXggIT0gMCkgeworICAgICAgICBpc3N1ZURyYXdDb21tYW5kKCk7CisgICAgICAgIG1DdXJyZW50UXVhZEluZGV4ID0gMDsKKyAgICB9CisgICAgZm9yKHVpbnQzMl90IGkgPSAwOyBpIDwgbUFjdGl2ZUZvbnRzLnNpemUoKTsgaSArKykgeworICAgICAgICBtQWN0aXZlRm9udHNbaV0tPmludmFsaWRhdGVUZXh0dXJlQ2FjaGUoKTsKKyAgICB9CisgICAgZm9yKHVpbnQzMl90IGkgPSAwOyBpIDwgbUNhY2hlTGluZXMuc2l6ZSgpOyBpICsrKSB7CisgICAgICAgIG1DYWNoZUxpbmVzW2ldLT5tQ3VycmVudENvbCA9IDA7CisgICAgfQorfQorCitib29sIEZvbnRTdGF0ZTo6Y2FjaGVCaXRtYXAoRlRfQml0bWFwICpiaXRtYXAsIHVpbnQzMl90ICpyZXRPcmlnaW5YLCB1aW50MzJfdCAqcmV0T3JpZ2luWSkKK3sKKyAgICAvLyBJZiB0aGUgZ2x5cGggaXMgdG9vIHRhbGwsIGRvbid0IGNhY2hlIGl0CisgICAgaWYoKHVpbnQzMl90KWJpdG1hcC0+cm93cyA+IG1DYWNoZUxpbmVzW21DYWNoZUxpbmVzLnNpemUoKS0xXS0+bU1heEhlaWdodCkgeworICAgICAgICBMT0dFKCJGb250IHNpemUgdG8gbGFyZ2UgdG8gZml0IGluIGNhY2hlLiB3aWR0aCwgaGVpZ2h0ID0gJWksICVpIiwgKGludCliaXRtYXAtPndpZHRoLCAoaW50KWJpdG1hcC0+cm93cyk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvLyBOb3cgY29weSB0aGUgYml0bWFwIGludG8gdGhlIGNhY2hlIHRleHR1cmUKKyAgICB1aW50MzJfdCBzdGFydFggPSAwOworICAgIHVpbnQzMl90IHN0YXJ0WSA9IDA7CisKKyAgICBib29sIGJpdG1hcEZpdCA9IGZhbHNlOworICAgIGZvcih1aW50MzJfdCBpID0gMDsgaSA8IG1DYWNoZUxpbmVzLnNpemUoKTsgaSArKykgeworICAgICAgICBiaXRtYXBGaXQgPSBtQ2FjaGVMaW5lc1tpXS0+Zml0Qml0bWFwKGJpdG1hcCwgJnN0YXJ0WCwgJnN0YXJ0WSk7CisgICAgICAgIGlmKGJpdG1hcEZpdCkgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBJZiB0aGUgbmV3IGdseXBoIGRpZG4ndCBmaXQsIGZsdXNoIHRoZSBzdGF0ZSBzbyBmYXIgYW5kIGludmFsaWRhdGUgZXZlcnl0aGluZworICAgIGlmKCFiaXRtYXBGaXQpIHsKKyAgICAgICAgZmx1c2hBbGxBbmRJbnZhbGlkYXRlKCk7CisKKyAgICAgICAgLy8gVHJ5IHRvIGZpdCBpdCBhZ2FpbgorICAgICAgICBmb3IodWludDMyX3QgaSA9IDA7IGkgPCBtQ2FjaGVMaW5lcy5zaXplKCk7IGkgKyspIHsKKyAgICAgICAgICAgIGJpdG1hcEZpdCA9IG1DYWNoZUxpbmVzW2ldLT5maXRCaXRtYXAoYml0bWFwLCAmc3RhcnRYLCAmc3RhcnRZKTsKKyAgICAgICAgICAgIGlmKGJpdG1hcEZpdCkgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gaWYgd2Ugc3RpbGwgZG9uJ3QgZml0LCBzb21ldGhpbmcgaXMgd3JvbmcgYW5kIHdlIHNob3VsZG4ndCBkcmF3CisgICAgICAgIGlmKCFiaXRtYXBGaXQpIHsKKyAgICAgICAgICAgIExPR0UoIkJpdG1hcCBkb2Vzbid0IGZpdCBpbiBjYWNoZS4gd2lkdGgsIGhlaWdodCA9ICVpLCAlaSIsIChpbnQpYml0bWFwLT53aWR0aCwgKGludCliaXRtYXAtPnJvd3MpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorCisgICAgKnJldE9yaWdpblggPSBzdGFydFg7CisgICAgKnJldE9yaWdpblkgPSBzdGFydFk7CisKKyAgICB1aW50MzJfdCBlbmRYID0gc3RhcnRYICsgYml0bWFwLT53aWR0aDsKKyAgICB1aW50MzJfdCBlbmRZID0gc3RhcnRZICsgYml0bWFwLT5yb3dzOworCisgICAgdWludDMyX3QgY2FjaGVXaWR0aCA9IGdldENhY2hlVGV4dHVyZVR5cGUoKS0+Z2V0RGltWCgpOworCisgICAgdW5zaWduZWQgY2hhciAqY2FjaGVCdWZmZXIgPSAodW5zaWduZWQgY2hhciopbVRleHRUZXh0dXJlLT5nZXRQdHIoKTsKKyAgICB1bnNpZ25lZCBjaGFyICpiaXRtYXBCdWZmZXIgPSBiaXRtYXAtPmJ1ZmZlcjsKKworICAgIHVpbnQzMl90IGNhY2hlWCA9IDAsIGJYID0gMCwgY2FjaGVZID0gMCwgYlkgPSAwOworICAgIGZvcihjYWNoZVggPSBzdGFydFgsIGJYID0gMDsgY2FjaGVYIDwgZW5kWDsgY2FjaGVYICsrLCBiWCArKykgeworICAgICAgICBmb3IoY2FjaGVZID0gc3RhcnRZLCBiWSA9IDA7IGNhY2hlWSA8IGVuZFk7IGNhY2hlWSArKywgYlkgKyspIHsKKyAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgdGVtcENvbCA9IGJpdG1hcEJ1ZmZlcltiWSAqIGJpdG1hcC0+d2lkdGggKyBiWF07CisgICAgICAgICAgICBjYWNoZUJ1ZmZlcltjYWNoZVkqY2FjaGVXaWR0aCArIGNhY2hlWF0gPSB0ZW1wQ29sOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gVGhpcyB3aWxsIGRpcnR5IHRoZSB0ZXh0dXJlIGFuZCB0aGUgc2hhZGVyIHNvIG5leHQgdGltZQorICAgIC8vIHdlIGRyYXcgaXQgd2lsbCB1cGxvYWQgdGhlIGRhdGEKKyAgICBtVGV4dFRleHR1cmUtPmRlZmVyZWRVcGxvYWRUb1RleHR1cmUobVJTQywgZmFsc2UsIDApOworICAgIG1Gb250U2hhZGVyRi0+YmluZFRleHR1cmUoMCwgbVRleHRUZXh0dXJlLmdldCgpKTsKKworICAgIC8vIFNvbWUgZGVidWcgY29kZQorICAgIC8qZm9yKHVpbnQzMl90IGkgPSAwOyBpIDwgbUNhY2hlTGluZXMuc2l6ZSgpOyBpICsrKSB7CisgICAgICAgIExPR0UoIkNhY2hlIExpbmU6IEg6ICV1IEVtcHR5IFNwYWNlOiAlZiIsCisgICAgICAgICAgICAgbUNhY2hlTGluZXNbaV0tPm1NYXhIZWlnaHQsCisgICAgICAgICAgICAgICgxLjBmIC0gKGZsb2F0KW1DYWNoZUxpbmVzW2ldLT5tQ3VycmVudENvbC8oZmxvYXQpbUNhY2hlTGluZXNbaV0tPm1NYXhXaWR0aCkqMTAwLjBmKTsKKworICAgIH0qLworCisgICAgcmV0dXJuIHRydWU7Cit9CisKK3ZvaWQgRm9udFN0YXRlOjppbml0UmVuZGVyU3RhdGUoKQoreworICAgIFN0cmluZzggc2hhZGVyU3RyaW5nKCJ2YXJ5aW5nIHZlYzQgdmFyVGV4MDtcbiIpOworICAgIHNoYWRlclN0cmluZy5hcHBlbmQoInZvaWQgbWFpbigpIHtcbiIpOworICAgIHNoYWRlclN0cmluZy5hcHBlbmQoIiAgbG93cCB2ZWM0IGNvbCA9IFVOSV9Db2xvcjtcbiIpOworICAgIHNoYWRlclN0cmluZy5hcHBlbmQoIiAgY29sLmEgPSB0ZXh0dXJlMkQoVU5JX1RleDAsIHZhclRleDAueHkpLmE7XG4iKTsKKyAgICBzaGFkZXJTdHJpbmcuYXBwZW5kKCIgIGdsX0ZyYWdDb2xvciA9IGNvbDtcbiIpOworICAgIHNoYWRlclN0cmluZy5hcHBlbmQoIn1cbiIpOworCisgICAgY29uc3QgRWxlbWVudCAqY29sb3JFbGVtID0gRWxlbWVudDo6Y3JlYXRlKG1SU0MsIFJTX1RZUEVfRkxPQVRfMzIsIFJTX0tJTkRfVVNFUiwgZmFsc2UsIDQpOworICAgIG1SU0MtPm1TdGF0ZUVsZW1lbnQuZWxlbWVudEJ1aWxkZXJCZWdpbigpOworICAgIG1SU0MtPm1TdGF0ZUVsZW1lbnQuZWxlbWVudEJ1aWxkZXJBZGQoY29sb3JFbGVtLCAiQ29sb3IiLCAxKTsKKyAgICBjb25zdCBFbGVtZW50ICpjb25zdElucHV0ID0gbVJTQy0+bVN0YXRlRWxlbWVudC5lbGVtZW50QnVpbGRlckNyZWF0ZShtUlNDKTsKKworICAgIFR5cGUgKmlucHV0VHlwZSA9IG5ldyBUeXBlKG1SU0MpOworICAgIGlucHV0VHlwZS0+c2V0RWxlbWVudChjb25zdElucHV0KTsKKyAgICBpbnB1dFR5cGUtPnNldERpbVgoMSk7CisgICAgaW5wdXRUeXBlLT5jb21wdXRlKCk7CisKKyAgICB1aW50MzJfdCB0bXBbNF07CisgICAgdG1wWzBdID0gUlNfUFJPR1JBTV9QQVJBTV9DT05TVEFOVDsKKyAgICB0bXBbMV0gPSAodWludDMyX3QpaW5wdXRUeXBlOworICAgIHRtcFsyXSA9IFJTX1BST0dSQU1fUEFSQU1fVEVYVFVSRV9DT1VOVDsKKyAgICB0bXBbM10gPSAxOworCisgICAgbUZvbnRTaGFkZXJGQ29uc3RhbnQuc2V0KG5ldyBBbGxvY2F0aW9uKG1SU0MsIGlucHV0VHlwZSkpOworICAgIFByb2dyYW1GcmFnbWVudCAqcGYgPSBuZXcgUHJvZ3JhbUZyYWdtZW50KG1SU0MsIHNoYWRlclN0cmluZy5zdHJpbmcoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaGFkZXJTdHJpbmcubGVuZ3RoKCksIHRtcCwgNCk7CisgICAgbUZvbnRTaGFkZXJGLnNldChwZik7CisgICAgbUZvbnRTaGFkZXJGLT5iaW5kQWxsb2NhdGlvbihtRm9udFNoYWRlckZDb25zdGFudC5nZXQoKSwgMCk7CisKKyAgICBTYW1wbGVyICpzYW1wbGVyID0gbmV3IFNhbXBsZXIobVJTQywgUlNfU0FNUExFUl9ORUFSRVNULCBSU19TQU1QTEVSX05FQVJFU1QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJTX1NBTVBMRVJfQ0xBTVAsIFJTX1NBTVBMRVJfQ0xBTVAsIFJTX1NBTVBMRVJfQ0xBTVApOworICAgIG1Gb250U2FtcGxlci5zZXQoc2FtcGxlcik7CisgICAgbUZvbnRTaGFkZXJGLT5iaW5kU2FtcGxlcigwLCBzYW1wbGVyKTsKKworICAgIFByb2dyYW1TdG9yZSAqZm9udFN0b3JlID0gbmV3IFByb2dyYW1TdG9yZShtUlNDKTsKKyAgICBtRm9udFByb2dyYW1TdG9yZS5zZXQoZm9udFN0b3JlKTsKKyAgICBtRm9udFByb2dyYW1TdG9yZS0+c2V0RGVwdGhGdW5jKFJTX0RFUFRIX0ZVTkNfQUxXQVlTKTsKKyAgICBtRm9udFByb2dyYW1TdG9yZS0+c2V0QmxlbmRGdW5jKFJTX0JMRU5EX1NSQ19TUkNfQUxQSEEsIFJTX0JMRU5EX0RTVF9PTkVfTUlOVVNfU1JDX0FMUEhBKTsKKyAgICBtRm9udFByb2dyYW1TdG9yZS0+c2V0RGl0aGVyRW5hYmxlKGZhbHNlKTsKKyAgICBtRm9udFByb2dyYW1TdG9yZS0+c2V0RGVwdGhNYXNrKGZhbHNlKTsKK30KKwordm9pZCBGb250U3RhdGU6OmluaXRUZXh0VGV4dHVyZSgpCit7CisgICAgY29uc3QgRWxlbWVudCAqYWxwaGFFbGVtID0gRWxlbWVudDo6Y3JlYXRlKG1SU0MsIFJTX1RZUEVfVU5TSUdORURfOCwgUlNfS0lORF9QSVhFTF9BLCB0cnVlLCAxKTsKKworICAgIC8vIFdlIHdpbGwgYWxsb2NhdGUgYSB0ZXh0dXJlIHRvIGluaXRpYWxseSBob2xkIDMyIGNoYXJhY3RlciBiaXRtYXBzCisgICAgVHlwZSAqdGV4VHlwZSA9IG5ldyBUeXBlKG1SU0MpOworICAgIHRleFR5cGUtPnNldEVsZW1lbnQoYWxwaGFFbGVtKTsKKyAgICB0ZXhUeXBlLT5zZXREaW1YKDEwMjQpOworICAgIHRleFR5cGUtPnNldERpbVkoMjU2KTsKKyAgICB0ZXhUeXBlLT5jb21wdXRlKCk7CisKKyAgICBBbGxvY2F0aW9uICpjYWNoZUFsbG9jID0gbmV3IEFsbG9jYXRpb24obVJTQywgdGV4VHlwZSk7CisgICAgbVRleHRUZXh0dXJlLnNldChjYWNoZUFsbG9jKTsKKyAgICBtVGV4dFRleHR1cmUtPmRlZmVyZWRVcGxvYWRUb1RleHR1cmUobVJTQywgZmFsc2UsIDApOworCisgICAgLy8gU3BsaXQgdXAgb3VyIGNhY2hlIHRleHR1cmUgaW50byBsaW5lcyBvZiBjZXJ0YWluIHdpZHRocworICAgIGludCBuZXh0TGluZSA9IDA7CisgICAgbUNhY2hlTGluZXMucHVzaChuZXcgQ2FjaGVUZXh0dXJlTGluZSgxNiwgdGV4VHlwZS0+Z2V0RGltWCgpLCBuZXh0TGluZSwgMCkpOworICAgIG5leHRMaW5lICs9IG1DYWNoZUxpbmVzLnRvcCgpLT5tTWF4SGVpZ2h0OworICAgIG1DYWNoZUxpbmVzLnB1c2gobmV3IENhY2hlVGV4dHVyZUxpbmUoMjQsIHRleFR5cGUtPmdldERpbVgoKSwgbmV4dExpbmUsIDApKTsKKyAgICBuZXh0TGluZSArPSBtQ2FjaGVMaW5lcy50b3AoKS0+bU1heEhlaWdodDsKKyAgICBtQ2FjaGVMaW5lcy5wdXNoKG5ldyBDYWNoZVRleHR1cmVMaW5lKDI0LCB0ZXhUeXBlLT5nZXREaW1YKCksIG5leHRMaW5lLCAwKSk7CisgICAgbmV4dExpbmUgKz0gbUNhY2hlTGluZXMudG9wKCktPm1NYXhIZWlnaHQ7CisgICAgbUNhY2hlTGluZXMucHVzaChuZXcgQ2FjaGVUZXh0dXJlTGluZSgzMiwgdGV4VHlwZS0+Z2V0RGltWCgpLCBuZXh0TGluZSwgMCkpOworICAgIG5leHRMaW5lICs9IG1DYWNoZUxpbmVzLnRvcCgpLT5tTWF4SGVpZ2h0OworICAgIG1DYWNoZUxpbmVzLnB1c2gobmV3IENhY2hlVGV4dHVyZUxpbmUoMzIsIHRleFR5cGUtPmdldERpbVgoKSwgbmV4dExpbmUsIDApKTsKKyAgICBuZXh0TGluZSArPSBtQ2FjaGVMaW5lcy50b3AoKS0+bU1heEhlaWdodDsKKyAgICBtQ2FjaGVMaW5lcy5wdXNoKG5ldyBDYWNoZVRleHR1cmVMaW5lKDQwLCB0ZXhUeXBlLT5nZXREaW1YKCksIG5leHRMaW5lLCAwKSk7CisgICAgbmV4dExpbmUgKz0gbUNhY2hlTGluZXMudG9wKCktPm1NYXhIZWlnaHQ7CisgICAgbUNhY2hlTGluZXMucHVzaChuZXcgQ2FjaGVUZXh0dXJlTGluZSh0ZXhUeXBlLT5nZXREaW1ZKCkgLSBuZXh0TGluZSwgdGV4VHlwZS0+Z2V0RGltWCgpLCBuZXh0TGluZSwgMCkpOworfQorCisvLyBBdm9pZCBoYXZpbmcgdG8gcmVhbGxvY2F0ZSBtZW1vcnkgYW5kIHJlbmRlciBxdWFkIGJ5IHF1YWQKK3ZvaWQgRm9udFN0YXRlOjppbml0VmVydGV4QXJyYXlCdWZmZXJzKCkKK3sKKyAgICAvLyBOb3cgbGV0cyB3cml0ZSBpbmRleCBkYXRhCisgICAgY29uc3QgRWxlbWVudCAqaW5kZXhFbGVtID0gRWxlbWVudDo6Y3JlYXRlKG1SU0MsIFJTX1RZUEVfVU5TSUdORURfMTYsIFJTX0tJTkRfVVNFUiwgZmFsc2UsIDEpOworICAgIFR5cGUgKmluZGV4VHlwZSA9IG5ldyBUeXBlKG1SU0MpOworICAgIHVpbnQzMl90IG51bUluZGljaWVzID0gbU1heE51bWJlck9mUXVhZHMgKiA2OworICAgIGluZGV4VHlwZS0+c2V0RGltWChudW1JbmRpY2llcyk7CisgICAgaW5kZXhUeXBlLT5zZXRFbGVtZW50KGluZGV4RWxlbSk7CisgICAgaW5kZXhUeXBlLT5jb21wdXRlKCk7CisKKyAgICBBbGxvY2F0aW9uICppbmRleEFsbG9jID0gbmV3IEFsbG9jYXRpb24obVJTQywgaW5kZXhUeXBlKTsKKyAgICB1aW50MTZfdCAqaW5kZXhQdHIgPSAodWludDE2X3QqKWluZGV4QWxsb2MtPmdldFB0cigpOworCisgICAgLy8gRm91ciB2ZXJ0cywgdHdvIHRyaWFuZ2xlcyAsIHNpeCBpbmRpY2VzIHBlciBxdWFkCisgICAgZm9yKHVpbnQzMl90IGkgPSAwOyBpIDwgbU1heE51bWJlck9mUXVhZHM7IGkgKyspIHsKKyAgICAgICAgaW50IGk2ID0gaSAqIDY7CisgICAgICAgIGludCBpNCA9IGkgKiA0OworCisgICAgICAgIGluZGV4UHRyW2k2ICsgMF0gPSBpNCArIDA7CisgICAgICAgIGluZGV4UHRyW2k2ICsgMV0gPSBpNCArIDE7CisgICAgICAgIGluZGV4UHRyW2k2ICsgMl0gPSBpNCArIDI7CisKKyAgICAgICAgaW5kZXhQdHJbaTYgKyAzXSA9IGk0ICsgMDsKKyAgICAgICAgaW5kZXhQdHJbaTYgKyA0XSA9IGk0ICsgMjsKKyAgICAgICAgaW5kZXhQdHJbaTYgKyA1XSA9IGk0ICsgMzsKKyAgICB9CisKKyAgICBpbmRleEFsbG9jLT5kZWZlcmVkVXBsb2FkVG9CdWZmZXJPYmplY3QobVJTQyk7CisgICAgbUluZGV4QnVmZmVyLnNldChpbmRleEFsbG9jKTsKKworICAgIGNvbnN0IEVsZW1lbnQgKnBvc0VsZW0gPSBFbGVtZW50OjpjcmVhdGUobVJTQywgUlNfVFlQRV9GTE9BVF8zMiwgUlNfS0lORF9VU0VSLCBmYWxzZSwgMyk7CisgICAgY29uc3QgRWxlbWVudCAqdGV4RWxlbSA9IEVsZW1lbnQ6OmNyZWF0ZShtUlNDLCBSU19UWVBFX0ZMT0FUXzMyLCBSU19LSU5EX1VTRVIsIGZhbHNlLCAyKTsKKworICAgIGNvbnN0IEVsZW1lbnQgKmVsZW1BcnJheVsyXTsKKyAgICBlbGVtQXJyYXlbMF0gPSBwb3NFbGVtOworICAgIGVsZW1BcnJheVsxXSA9IHRleEVsZW07CisKKyAgICBTdHJpbmc4IHBvc05hbWUoInBvc2l0aW9uIik7CisgICAgU3RyaW5nOCB0ZXhOYW1lKCJ0ZXh0dXJlMCIpOworCisgICAgY29uc3QgY2hhciAqbmFtZUFycmF5WzJdOworICAgIG5hbWVBcnJheVswXSA9IHBvc05hbWUuc3RyaW5nKCk7CisgICAgbmFtZUFycmF5WzFdID0gdGV4TmFtZS5zdHJpbmcoKTsKKyAgICBzaXplX3QgbGVuZ3Roc1syXTsKKyAgICBsZW5ndGhzWzBdID0gcG9zTmFtZS5zaXplKCk7CisgICAgbGVuZ3Roc1sxXSA9IHRleE5hbWUuc2l6ZSgpOworICAgIHVpbnQzMl90IGFycmF5U2l6ZXNbMl0gPSB7MSwgMX07CisKKyAgICBjb25zdCBFbGVtZW50ICp2ZXJ0ZXhEYXRhRWxlbSA9IEVsZW1lbnQ6OmNyZWF0ZShtUlNDLCAyLCBlbGVtQXJyYXksIG5hbWVBcnJheSwgbGVuZ3RocywgYXJyYXlTaXplcyk7CisKKyAgICBUeXBlICp2ZXJ0ZXhEYXRhVHlwZSA9IG5ldyBUeXBlKG1SU0MpOworICAgIHZlcnRleERhdGFUeXBlLT5zZXREaW1YKG1NYXhOdW1iZXJPZlF1YWRzICogNCk7CisgICAgdmVydGV4RGF0YVR5cGUtPnNldEVsZW1lbnQodmVydGV4RGF0YUVsZW0pOworICAgIHZlcnRleERhdGFUeXBlLT5jb21wdXRlKCk7CisKKyAgICBBbGxvY2F0aW9uICp2ZXJ0ZXhBbGxvYyA9IG5ldyBBbGxvY2F0aW9uKG1SU0MsIHZlcnRleERhdGFUeXBlKTsKKyAgICBtVGV4dE1lc2hQdHIgPSAoZmxvYXQqKXZlcnRleEFsbG9jLT5nZXRQdHIoKTsKKworICAgIG1WZXJ0ZXhBcnJheS5zZXQodmVydGV4QWxsb2MpOworfQorCisvLyBXZSBkb24ndCB3YW50IHRvIGFsbG9jYXRlIGFueXRoaW5nIHVubGVzcyB3ZSBhY3R1YWxseSBkcmF3IHRleHQKK3ZvaWQgRm9udFN0YXRlOjpjaGVja0luaXQoKQoreworICAgIGlmKG1Jbml0aWFsaXplZCkgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaW5pdFRleHRUZXh0dXJlKCk7CisgICAgaW5pdFJlbmRlclN0YXRlKCk7CisKKyAgICBpbml0VmVydGV4QXJyYXlCdWZmZXJzKCk7CisKKyAgICAvLyBXZSBzdG9yZSBhIHN0cmluZyB3aXRoIGxldHRlcnMgaW4gYSByb3VnaCBmcmVxdWVuY3kgb2Ygb2NjdXJyZW5jZQorICAgIG1MYXRpblByZWNhY2hlID0gU3RyaW5nOCgiIGVpc2FybnRvbGNkdWdwbWhieWZ2a3d6eGpxIik7CisgICAgbUxhdGluUHJlY2FjaGUgKz0gU3RyaW5nOCgiRUlTQVJOVE9MQ0RVR1BNSEJZRlZLV1pYSlEiKTsKKyAgICBtTGF0aW5QcmVjYWNoZSArPSBTdHJpbmc4KCIsLj8hKCktK0A7OmAnIik7CisgICAgbUxhdGluUHJlY2FjaGUgKz0gU3RyaW5nOCgiMDEyMzQ1Njc4OSIpOworCisgICAgbUluaXRpYWxpemVkID0gdHJ1ZTsKK30KKwordm9pZCBGb250U3RhdGU6Omlzc3VlRHJhd0NvbW1hbmQoKSB7CisKKyAgICBPYmplY3RCYXNlUmVmPGNvbnN0IFByb2dyYW1WZXJ0ZXg+IHRtcFYobVJTQy0+Z2V0VmVydGV4KCkpOworICAgIG1SU0MtPnNldFZlcnRleChtUlNDLT5nZXREZWZhdWx0UHJvZ3JhbVZlcnRleCgpKTsKKworICAgIE9iamVjdEJhc2VSZWY8Y29uc3QgUHJvZ3JhbVJhc3Rlcj4gdG1wUihtUlNDLT5nZXRSYXN0ZXIoKSk7CisgICAgbVJTQy0+c2V0UmFzdGVyKG1SU0MtPmdldERlZmF1bHRQcm9ncmFtUmFzdGVyKCkpOworCisgICAgT2JqZWN0QmFzZVJlZjxjb25zdCBQcm9ncmFtRnJhZ21lbnQ+IHRtcEYobVJTQy0+Z2V0RnJhZ21lbnQoKSk7CisgICAgbVJTQy0+c2V0RnJhZ21lbnQobUZvbnRTaGFkZXJGLmdldCgpKTsKKworICAgIE9iamVjdEJhc2VSZWY8Y29uc3QgUHJvZ3JhbVN0b3JlPiB0bXBQUyhtUlNDLT5nZXRGcmFnbWVudFN0b3JlKCkpOworICAgIG1SU0MtPnNldEZyYWdtZW50U3RvcmUobUZvbnRQcm9ncmFtU3RvcmUuZ2V0KCkpOworCisgICAgaWYobUZvbnRDb2xvckRpcnR5KSB7CisgICAgICAgIG1Gb250U2hhZGVyRkNvbnN0YW50LT5kYXRhKG1SU0MsICZtRm9udENvbG9yLCA0KnNpemVvZihmbG9hdCkpOworICAgICAgICBtRm9udENvbG9yRGlydHkgPSBmYWxzZTsKKyAgICB9CisKKyAgICBpZiAoIW1SU0MtPnNldHVwQ2hlY2soKSkgeworICAgICAgICBtUlNDLT5zZXRWZXJ0ZXgoKFByb2dyYW1WZXJ0ZXggKil0bXBWLmdldCgpKTsKKyAgICAgICAgbVJTQy0+c2V0UmFzdGVyKChQcm9ncmFtUmFzdGVyICopdG1wUi5nZXQoKSk7CisgICAgICAgIG1SU0MtPnNldEZyYWdtZW50KChQcm9ncmFtRnJhZ21lbnQgKil0bXBGLmdldCgpKTsKKyAgICAgICAgbVJTQy0+c2V0RnJhZ21lbnRTdG9yZSgoUHJvZ3JhbVN0b3JlICopdG1wUFMuZ2V0KCkpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgZmxvYXQgKnZ0eCA9IChmbG9hdCopbVZlcnRleEFycmF5LT5nZXRQdHIoKTsKKyAgICBmbG9hdCAqdGV4ID0gdnR4ICsgMzsKKworICAgIFZlcnRleEFycmF5IHZhOworICAgIHZhLmFkZChHTF9GTE9BVCwgMywgMjAsIGZhbHNlLCAodWludDMyX3QpdnR4LCAicG9zaXRpb24iKTsKKyAgICB2YS5hZGQoR0xfRkxPQVQsIDIsIDIwLCBmYWxzZSwgKHVpbnQzMl90KXRleCwgInRleHR1cmUwIik7CisgICAgdmEuc2V0dXBHTDIobVJTQywgJm1SU0MtPm1TdGF0ZVZlcnRleEFycmF5LCAmbVJTQy0+bVNoYWRlckNhY2hlKTsKKworICAgIG1JbmRleEJ1ZmZlci0+dXBsb2FkQ2hlY2sobVJTQyk7CisgICAgZ2xCaW5kQnVmZmVyKEdMX0VMRU1FTlRfQVJSQVlfQlVGRkVSLCBtSW5kZXhCdWZmZXItPmdldEJ1ZmZlck9iamVjdElEKCkpOworICAgIGdsRHJhd0VsZW1lbnRzKEdMX1RSSUFOR0xFUywgbUN1cnJlbnRRdWFkSW5kZXggKiA2LCBHTF9VTlNJR05FRF9TSE9SVCwgKHVpbnQxNl90ICopKDApKTsKKworICAgIC8vIFJlc2V0IHRoZSBzdGF0ZQorICAgIG1SU0MtPnNldFZlcnRleCgoUHJvZ3JhbVZlcnRleCAqKXRtcFYuZ2V0KCkpOworICAgIG1SU0MtPnNldFJhc3RlcigoUHJvZ3JhbVJhc3RlciAqKXRtcFIuZ2V0KCkpOworICAgIG1SU0MtPnNldEZyYWdtZW50KChQcm9ncmFtRnJhZ21lbnQgKil0bXBGLmdldCgpKTsKKyAgICBtUlNDLT5zZXRGcmFnbWVudFN0b3JlKChQcm9ncmFtU3RvcmUgKil0bXBQUy5nZXQoKSk7Cit9CisKK3ZvaWQgRm9udFN0YXRlOjphcHBlbmRNZXNoUXVhZChmbG9hdCB4MSwgZmxvYXQgeTEsIGZsb2F0IHoxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHUxLCBmbG9hdCB2MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCB4MiwgZmxvYXQgeTIsIGZsb2F0IHoyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHUyLCBmbG9hdCB2MiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCB4MywgZmxvYXQgeTMsIGZsb2F0IHozLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHUzLCBmbG9hdCB2MywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCB4NCwgZmxvYXQgeTQsIGZsb2F0IHo0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHU0LCBmbG9hdCB2NCkKK3sKKyAgICBjb25zdCB1aW50MzJfdCB2ZXJ0c1BlclF1YWQgPSA0OworICAgIGNvbnN0IHVpbnQzMl90IGZsb2F0c1BlclZlcnQgPSA1OworICAgIGZsb2F0ICpjdXJyZW50UG9zID0gbVRleHRNZXNoUHRyICsgbUN1cnJlbnRRdWFkSW5kZXggKiB2ZXJ0c1BlclF1YWQgKiBmbG9hdHNQZXJWZXJ0OworCisgICAgLy8gQ3VsbCB0aGluZ3MgdGhhdCBhcmUgb2ZmIHRoZSBzY3JlZW4KKyAgICBmbG9hdCB3aWR0aCA9IChmbG9hdCltUlNDLT5nZXRXaWR0aCgpOworICAgIGZsb2F0IGhlaWdodCA9IChmbG9hdCltUlNDLT5nZXRIZWlnaHQoKTsKKworICAgIGlmKHgxID4gd2lkdGggfHwgeTEgPCAwLjBmIHx8IHgyIDwgMCB8fCB5NCA+IGhlaWdodCkgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLypMT0dFKCJWMCB4OiAlZiB5OiAlZiB6OiAlZiIsIHgxLCB5MSwgejEpOworICAgIExPR0UoIlYxIHg6ICVmIHk6ICVmIHo6ICVmIiwgeDIsIHkyLCB6Mik7CisgICAgTE9HRSgiVjIgeDogJWYgeTogJWYgejogJWYiLCB4MywgeTMsIHozKTsKKyAgICBMT0dFKCJWMyB4OiAlZiB5OiAlZiB6OiAlZiIsIHg0LCB5NCwgejQpOyovCisKKyAgICAoKmN1cnJlbnRQb3MrKykgPSB4MTsKKyAgICAoKmN1cnJlbnRQb3MrKykgPSB5MTsKKyAgICAoKmN1cnJlbnRQb3MrKykgPSB6MTsKKyAgICAoKmN1cnJlbnRQb3MrKykgPSB1MTsKKyAgICAoKmN1cnJlbnRQb3MrKykgPSB2MTsKKworICAgICgqY3VycmVudFBvcysrKSA9IHgyOworICAgICgqY3VycmVudFBvcysrKSA9IHkyOworICAgICgqY3VycmVudFBvcysrKSA9IHoyOworICAgICgqY3VycmVudFBvcysrKSA9IHUyOworICAgICgqY3VycmVudFBvcysrKSA9IHYyOworCisgICAgKCpjdXJyZW50UG9zKyspID0geDM7CisgICAgKCpjdXJyZW50UG9zKyspID0geTM7CisgICAgKCpjdXJyZW50UG9zKyspID0gejM7CisgICAgKCpjdXJyZW50UG9zKyspID0gdTM7CisgICAgKCpjdXJyZW50UG9zKyspID0gdjM7CisKKyAgICAoKmN1cnJlbnRQb3MrKykgPSB4NDsKKyAgICAoKmN1cnJlbnRQb3MrKykgPSB5NDsKKyAgICAoKmN1cnJlbnRQb3MrKykgPSB6NDsKKyAgICAoKmN1cnJlbnRQb3MrKykgPSB1NDsKKyAgICAoKmN1cnJlbnRQb3MrKykgPSB2NDsKKworICAgIG1DdXJyZW50UXVhZEluZGV4ICsrOworCisgICAgaWYobUN1cnJlbnRRdWFkSW5kZXggPT0gbU1heE51bWJlck9mUXVhZHMpIHsKKyAgICAgICAgaXNzdWVEcmF3Q29tbWFuZCgpOworICAgICAgICBtQ3VycmVudFF1YWRJbmRleCA9IDA7CisgICAgfQorfQorCit1aW50MzJfdCBGb250U3RhdGU6OmdldFJlbWFpbmluZ0NhY2hlQ2FwYWNpdHkoKSB7CisgICAgdWludDMyX3QgcmVtYWluaW5nQ2FwYWNpdHkgPSAwOworICAgIHVpbnQzMl90IHRvdGFsUGl4ZWxzID0gMDsKKyAgICBmb3IodWludDMyX3QgaSA9IDA7IGkgPCBtQ2FjaGVMaW5lcy5zaXplKCk7IGkgKyspIHsKKyAgICAgICAgIHJlbWFpbmluZ0NhcGFjaXR5ICs9IChtQ2FjaGVMaW5lc1tpXS0+bU1heFdpZHRoIC0gbUNhY2hlTGluZXNbaV0tPm1DdXJyZW50Q29sKTsKKyAgICAgICAgIHRvdGFsUGl4ZWxzICs9IG1DYWNoZUxpbmVzW2ldLT5tTWF4V2lkdGg7CisgICAgfQorICAgIHJlbWFpbmluZ0NhcGFjaXR5ID0gKHJlbWFpbmluZ0NhcGFjaXR5ICogMTAwKSAvIHRvdGFsUGl4ZWxzOworICAgIHJldHVybiByZW1haW5pbmdDYXBhY2l0eTsKK30KKwordm9pZCBGb250U3RhdGU6OnByZWNhY2hlTGF0aW4oRm9udCAqZm9udCkgeworICAgIC8vIFJlbWFpbmluZyBjYXBhY2l0eSBpcyBtZWFzdXJlZCBpbiAlCisgICAgdWludDMyX3QgcmVtYWluaW5nQ2FwYWNpdHkgPSBnZXRSZW1haW5pbmdDYWNoZUNhcGFjaXR5KCk7CisgICAgdWludDMyX3QgcHJlY2FjaGVJZHggPSAwOworICAgIHdoaWxlKHJlbWFpbmluZ0NhcGFjaXR5ID4gMjUgJiYgcHJlY2FjaGVJZHggPCBtTGF0aW5QcmVjYWNoZS5zaXplKCkpIHsKKyAgICAgICAgZm9udC0+Z2V0Q2FjaGVkVVRGQ2hhcigoaW50MzJfdCltTGF0aW5QcmVjYWNoZVtwcmVjYWNoZUlkeF0pOworICAgICAgICByZW1haW5pbmdDYXBhY2l0eSA9IGdldFJlbWFpbmluZ0NhY2hlQ2FwYWNpdHkoKTsKKyAgICAgICAgcHJlY2FjaGVJZHggKys7CisgICAgfQorfQorCisKK3ZvaWQgRm9udFN0YXRlOjpyZW5kZXJUZXh0KGNvbnN0IGNoYXIgKnRleHQsIHVpbnQzMl90IGxlbiwgdWludDMyX3Qgc3RhcnRJbmRleCwgaW50IG51bUdseXBocywgaW50IHgsIGludCB5KQoreworICAgIGNoZWNrSW5pdCgpOworCisgICAgLy8gUmVuZGVyIGNvZGUgaGVyZQorICAgIEZvbnQgKmN1cnJlbnRGb250ID0gbVJTQy0+Z2V0Rm9udCgpOworICAgIGlmKCFjdXJyZW50Rm9udCkgeworICAgICAgICBpZighbURlZmF1bHQuZ2V0KCkpIHsKKyAgICAgICAgICAgIG1EZWZhdWx0LnNldChGb250OjpjcmVhdGUobVJTQywgIkRyb2lkU2Fucy50dGYiLCAxNiwgOTYpKTsKKyAgICAgICAgfQorICAgICAgICBjdXJyZW50Rm9udCA9IG1EZWZhdWx0LmdldCgpOworICAgIH0KKyAgICBpZighY3VycmVudEZvbnQpIHsKKyAgICAgICAgTE9HRSgiVW5hYmxlIHRvIGluaXRpYWxpemUgYW55IGZvbnRzIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBjdXJyZW50Rm9udC0+cmVuZGVyVVRGKHRleHQsIGxlbiwgc3RhcnRJbmRleCwgbnVtR2x5cGhzLCB4LCB5KTsKKworICAgIGlmKG1DdXJyZW50UXVhZEluZGV4ICE9IDApIHsKKyAgICAgICAgaXNzdWVEcmF3Q29tbWFuZCgpOworICAgICAgICBtQ3VycmVudFF1YWRJbmRleCA9IDA7CisgICAgfQorfQorCit2b2lkIEZvbnRTdGF0ZTo6cmVuZGVyVGV4dChjb25zdCBjaGFyICp0ZXh0LCBpbnQgeCwgaW50IHkpCit7CisgICAgc2l6ZV90IHRleHRMZW4gPSBzdHJsZW4odGV4dCk7CisgICAgcmVuZGVyVGV4dCh0ZXh0LCB0ZXh0TGVuLCAwLCAtMSwgeCwgeSk7Cit9CisKK3ZvaWQgRm9udFN0YXRlOjpyZW5kZXJUZXh0KEFsbG9jYXRpb24gKmFsbG9jLCBpbnQgeCwgaW50IHkpCit7CisgICAgaWYoIWFsbG9jKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBjb25zdCBjaGFyICp0ZXh0ID0gKGNvbnN0IGNoYXIgKilhbGxvYy0+Z2V0UHRyKCk7CisgICAgc2l6ZV90IGFsbG9jU2l6ZSA9IGFsbG9jLT5nZXRUeXBlKCktPmdldFNpemVCeXRlcygpOworICAgIHJlbmRlclRleHQodGV4dCwgYWxsb2NTaXplLCAwLCAtMSwgeCwgeSk7Cit9CisKK3ZvaWQgRm9udFN0YXRlOjpyZW5kZXJUZXh0KEFsbG9jYXRpb24gKmFsbG9jLCB1aW50MzJfdCBzdGFydCwgaW50IGxlbiwgaW50IHgsIGludCB5KQoreworICAgIGlmKCFhbGxvYykgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgY29uc3QgY2hhciAqdGV4dCA9IChjb25zdCBjaGFyICopYWxsb2MtPmdldFB0cigpOworICAgIHNpemVfdCBhbGxvY1NpemUgPSBhbGxvYy0+Z2V0VHlwZSgpLT5nZXRTaXplQnl0ZXMoKTsKKyAgICByZW5kZXJUZXh0KHRleHQsIGFsbG9jU2l6ZSwgc3RhcnQsIGxlbiwgeCwgeSk7Cit9CisKK3ZvaWQgRm9udFN0YXRlOjpzZXRGb250Q29sb3IoZmxvYXQgciwgZmxvYXQgZywgZmxvYXQgYiwgZmxvYXQgYSkgeworICAgIG1Gb250Q29sb3JbMF0gPSByOworICAgIG1Gb250Q29sb3JbMV0gPSBnOworICAgIG1Gb250Q29sb3JbMl0gPSBiOworICAgIG1Gb250Q29sb3JbM10gPSBhOworICAgIG1Gb250Q29sb3JEaXJ0eSA9IHRydWU7Cit9CisKK3ZvaWQgRm9udFN0YXRlOjpnZXRGb250Q29sb3IoZmxvYXQgKnIsIGZsb2F0ICpnLCBmbG9hdCAqYiwgZmxvYXQgKmEpIGNvbnN0IHsKKyAgICAqciA9IG1Gb250Q29sb3JbMF07CisgICAgKmcgPSBtRm9udENvbG9yWzFdOworICAgICpiID0gbUZvbnRDb2xvclsyXTsKKyAgICAqYSA9IG1Gb250Q29sb3JbM107Cit9CisKK3ZvaWQgRm9udFN0YXRlOjpkZWluaXQoQ29udGV4dCAqcnNjKQoreworICAgIG1Jbml0aWFsaXplZCA9IGZhbHNlOworCisgICAgbUluZGV4QnVmZmVyLmNsZWFyKCk7CisgICAgbVZlcnRleEFycmF5LmNsZWFyKCk7CisKKyAgICBtRm9udFNoYWRlckYuY2xlYXIoKTsKKyAgICBtRm9udFNhbXBsZXIuY2xlYXIoKTsKKyAgICBtRm9udFByb2dyYW1TdG9yZS5jbGVhcigpOworCisgICAgbVRleHRUZXh0dXJlLmNsZWFyKCk7CisgICAgZm9yKHVpbnQzMl90IGkgPSAwOyBpIDwgbUNhY2hlTGluZXMuc2l6ZSgpOyBpICsrKSB7CisgICAgICAgIGRlbGV0ZSBtQ2FjaGVMaW5lc1tpXTsKKyAgICB9CisgICAgbUNhY2hlTGluZXMuY2xlYXIoKTsKKworICAgIG1EZWZhdWx0LmNsZWFyKCk7CisKKyAgICBWZWN0b3I8Rm9udCo+IGZvbnRzVG9EZXJlZmVyZW5jZSA9IG1BY3RpdmVGb250czsKKyAgICBmb3IodWludDMyX3QgaSA9IDA7IGkgPCBmb250c1RvRGVyZWZlcmVuY2Uuc2l6ZSgpOyBpICsrKSB7CisgICAgICAgIGZvbnRzVG9EZXJlZmVyZW5jZVtpXS0+emVyb1VzZXJSZWYoKTsKKyAgICB9CisKKyAgICBpZihtTGlicmFyeSkgeworICAgICAgICBGVF9Eb25lX0ZyZWVUeXBlKCBtTGlicmFyeSApOworICAgICAgICBtTGlicmFyeSA9IE5VTEw7CisgICAgfQorfQorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgcmVuZGVyc2NyaXB0IHsKKworUnNGb250IHJzaV9Gb250Q3JlYXRlRnJvbUZpbGUoQ29udGV4dCAqcnNjLCBjaGFyIGNvbnN0ICpuYW1lLCB1aW50MzJfdCBmb250U2l6ZSwgdWludDMyX3QgZHBpKQoreworICAgIEZvbnQgKm5ld0ZvbnQgPSBGb250OjpjcmVhdGUocnNjLCBuYW1lLCBmb250U2l6ZSwgZHBpKTsKKyAgICBpZihuZXdGb250KSB7CisgICAgICAgIG5ld0ZvbnQtPmluY1VzZXJSZWYoKTsKKyAgICB9CisgICAgcmV0dXJuIG5ld0ZvbnQ7Cit9CisKK30gLy8gcmVuZGVyc2NyaXB0Cit9IC8vIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2xpYnMvcnMvcnNGb250LmggYi9saWJzL3JzL3JzRm9udC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAyN2VkMWQKLS0tIC9kZXYvbnVsbAorKysgYi9saWJzL3JzL3JzRm9udC5oCkBAIC0wLDAgKzEsMjIyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX1JTX0ZPTlRfSAorI2RlZmluZSBBTkRST0lEX1JTX0ZPTlRfSAorCisjaW5jbHVkZSAiUmVuZGVyU2NyaXB0LmgiCisjaW5jbHVkZSAicnNTdHJlYW0uaCIKKyNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+CisjaW5jbHVkZSA8dXRpbHMvVmVjdG9yLmg+CisjaW5jbHVkZSA8dXRpbHMvS2V5ZWRWZWN0b3IuaD4KKworI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+CisjaW5jbHVkZSBGVF9GUkVFVFlQRV9ICisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorbmFtZXNwYWNlIGFuZHJvaWQgeworCituYW1lc3BhY2UgcmVuZGVyc2NyaXB0IHsKKworY2xhc3MgRm9udFN0YXRlOworCitjbGFzcyBGb250IDogcHVibGljIE9iamVjdEJhc2UKK3sKK3B1YmxpYzoKKyAgICB+Rm9udCgpOworCisgICAgLy8gUG9pbnRlciB0byB0aGUgdXRmIGRhdGEsIGxlbmd0aCBvZiBkYXRhLCB3aGVyZSB0byBzdGFydCwgbnVtYmVyIG9mIGdseXBocyBvdCByZWFkCisgICAgLy8gKGVhY2ggZ2x5cGggbWF5IGJlIGxvbmdlciB0aGFuIGEgY2hhciBiZWNhdXNlIHdlIGFyZSBkZWFsaW5nIHdpdGggdXRmIGRhdGEpCisgICAgLy8gTGFzdCB0d28gdmFyaWFibGVzIGFyZSB0aGUgaW5pdGlhbCBwZW4gcG9zaXRpb24KKyAgICB2b2lkIHJlbmRlclVURihjb25zdCBjaGFyICp0ZXh0LCB1aW50MzJfdCBsZW4sIHVpbnQzMl90IHN0YXJ0LCBpbnQgbnVtR2x5cGhzLCBpbnQgeCwgaW50IHkpOworCisgICAgLy8gQ3VycmVudGx5IGZpbGVzIGRvIG5vdCBnZXQgc2VyaWFsaXplZCwKKyAgICAvLyBidXQgd2UgbmVlZCB0byBpbmhlcml0IGZyb20gT2JqZWN0QmFzZSBmb3IgcmVmIHRyYWNraW5nCisgICAgdmlydHVhbCB2b2lkIHNlcmlhbGl6ZShPU3RyZWFtICpzdHJlYW0pIGNvbnN0IHsKKyAgICB9CisgICAgdmlydHVhbCBSc0EzRENsYXNzSUQgZ2V0Q2xhc3NJZCgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIFJTX0EzRF9DTEFTU19JRF9VTktOT1dOOworICAgIH0KKworICAgIHN0YXRpYyBGb250ICogY3JlYXRlKENvbnRleHQgKnJzYywgY29uc3QgY2hhciAqbmFtZSwgdWludDMyX3QgZm9udFNpemUsIHVpbnQzMl90IGRwaSk7CisKK3Byb3RlY3RlZDoKKworICAgIGZyaWVuZCBjbGFzcyBGb250U3RhdGU7CisKKyAgICB2b2lkIGludmFsaWRhdGVUZXh0dXJlQ2FjaGUoKTsKKyAgICBzdHJ1Y3QgQ2FjaGVkR2x5cGhJbmZvCisgICAgeworICAgICAgICAvLyBIYXMgdGhlIGNhY2hlIGJlZW4gaW52YWxpZGF0ZWQ/CisgICAgICAgIGJvb2wgbUlzVmFsaWQ7CisgICAgICAgIC8vIExvY2F0aW9uIG9mIHRoZSBjYWNoZWQgZ2x5cGggaW4gdGhlIGJpdG1hcAorICAgICAgICAvLyBpbiBjYXNlIHdlIG5lZWQgdG8gcmVzaXplIHRoZSB0ZXh0dXJlCisgICAgICAgIHVpbnQzMl90IG1CaXRtYXBNaW5YOworICAgICAgICB1aW50MzJfdCBtQml0bWFwTWluWTsKKyAgICAgICAgdWludDMyX3QgbUJpdG1hcFdpZHRoOworICAgICAgICB1aW50MzJfdCBtQml0bWFwSGVpZ2h0OworICAgICAgICAvLyBBbHNvIGNhY2hlIHRleHR1cmUgY29vcmRzIGZvciB0aGUgcXVhZAorICAgICAgICBmbG9hdCBtQml0bWFwTWluVTsKKyAgICAgICAgZmxvYXQgbUJpdG1hcE1pblY7CisgICAgICAgIGZsb2F0IG1CaXRtYXBNYXhVOworICAgICAgICBmbG9hdCBtQml0bWFwTWF4VjsKKyAgICAgICAgLy8gTWluaW1pemUgaG93IG11Y2ggd2UgY2FsbCBmcmVldHlwZQorICAgICAgICBGVF9VSW50IG1HbHlwaEluZGV4OworICAgICAgICBGVF9WZWN0b3IgbUFkdmFuY2U7CisgICAgICAgIC8vIFZhbHVlcyBiZWxvdyBjb250YWluIGEgZ2x5cGgncyBvcmlnaW4gaW4gdGhlIGJpdG1hcAorICAgICAgICBGVF9JbnQgbUJpdG1hcExlZnQ7CisgICAgICAgIEZUX0ludCBtQml0bWFwVG9wOworICAgIH07CisKKyAgICBTdHJpbmc4IG1Gb250TmFtZTsKKyAgICB1aW50MzJfdCBtRm9udFNpemU7CisgICAgdWludDMyX3QgbURwaTsKKworICAgIEZvbnQoQ29udGV4dCAqcnNjKTsKKyAgICBib29sIGluaXQoY29uc3QgY2hhciAqbmFtZSwgdWludDMyX3QgZm9udFNpemUsIHVpbnQzMl90IGRwaSk7CisKKyAgICBGVF9GYWNlIG1GYWNlOworICAgIGJvb2wgbUluaXRpYWxpemVkOworICAgIGJvb2wgbUhhc0tlcm5pbmc7CisKKyAgICBEZWZhdWx0S2V5ZWRWZWN0b3I8dWludDMyX3QsIENhY2hlZEdseXBoSW5mbyogPiBtQ2FjaGVkR2x5cGhzOworICAgIENhY2hlZEdseXBoSW5mbyogZ2V0Q2FjaGVkVVRGQ2hhcihpbnQzMl90IHV0ZkNoYXIpOworCisgICAgQ2FjaGVkR2x5cGhJbmZvICpjYWNoZUdseXBoKHVpbnQzMl90IGdseXBoKTsKKyAgICB2b2lkIHVwZGF0ZUdseXBoQ2FjaGUoQ2FjaGVkR2x5cGhJbmZvICpnbHlwaCk7CisgICAgdm9pZCBkcmF3Q2FjaGVkR2x5cGgoQ2FjaGVkR2x5cGhJbmZvICpnbHlwaCwgaW50IHgsIGludCB5KTsKK307CisKK2NsYXNzIEZvbnRTdGF0ZQoreworcHVibGljOgorICAgIEZvbnRTdGF0ZSgpOworICAgIH5Gb250U3RhdGUoKTsKKworICAgIHZvaWQgaW5pdChDb250ZXh0ICpyc2MpOworICAgIHZvaWQgZGVpbml0KENvbnRleHQgKnJzYyk7CisKKyAgICBPYmplY3RCYXNlUmVmPEZvbnQ+IG1EZWZhdWx0OworICAgIE9iamVjdEJhc2VSZWY8Rm9udD4gbUxhc3Q7CisKKyAgICB2b2lkIHJlbmRlclRleHQoY29uc3QgY2hhciAqdGV4dCwgdWludDMyX3QgbGVuLCB1aW50MzJfdCBzdGFydEluZGV4LCBpbnQgbnVtR2x5cGhzLCBpbnQgeCwgaW50IHkpOworICAgIHZvaWQgcmVuZGVyVGV4dChjb25zdCBjaGFyICp0ZXh0LCBpbnQgeCwgaW50IHkpOworICAgIHZvaWQgcmVuZGVyVGV4dChBbGxvY2F0aW9uICphbGxvYywgaW50IHgsIGludCB5KTsKKyAgICB2b2lkIHJlbmRlclRleHQoQWxsb2NhdGlvbiAqYWxsb2MsIHVpbnQzMl90IHN0YXJ0LCBpbnQgbGVuLCBpbnQgeCwgaW50IHkpOworCisgICAgdm9pZCBzZXRGb250Q29sb3IoZmxvYXQgciwgZmxvYXQgZywgZmxvYXQgYiwgZmxvYXQgYSk7CisgICAgdm9pZCBnZXRGb250Q29sb3IoZmxvYXQgKnIsIGZsb2F0ICpnLCBmbG9hdCAqYiwgZmxvYXQgKmEpIGNvbnN0OworCitwcm90ZWN0ZWQ6CisKKyAgICBmcmllbmQgY2xhc3MgRm9udDsKKworICAgIHN0cnVjdCBDYWNoZVRleHR1cmVMaW5lCisgICAgeworICAgICAgICB1aW50MzJfdCBtTWF4SGVpZ2h0OworICAgICAgICB1aW50MzJfdCBtTWF4V2lkdGg7CisgICAgICAgIHVpbnQzMl90IG1DdXJyZW50Um93OworICAgICAgICB1aW50MzJfdCBtQ3VycmVudENvbDsKKyAgICAgICAgYm9vbCBtRGlydHk7CisKKyAgICAgICAgQ2FjaGVUZXh0dXJlTGluZSh1aW50MzJfdCBtYXhIZWlnaHQsIHVpbnQzMl90IG1heFdpZHRoLCB1aW50MzJfdCBjdXJyZW50Um93LCB1aW50MzJfdCBjdXJyZW50Q29sKSA6CisgICAgICAgICAgICBtTWF4SGVpZ2h0KG1heEhlaWdodCksIG1NYXhXaWR0aChtYXhXaWR0aCksIG1DdXJyZW50Um93KGN1cnJlbnRSb3cpLCBtQ3VycmVudENvbChjdXJyZW50Q29sKSwKKyAgICAgICAgICAgIG1EaXJ0eShmYWxzZSkgIHsKKyAgICAgICAgfQorCisgICAgICAgIGJvb2wgZml0Qml0bWFwKEZUX0JpdG1hcCAqYml0bWFwLCB1aW50MzJfdCAqcmV0T3JpZ2luWCwgdWludDMyX3QgKnJldE9yaWdpblkpIHsKKyAgICAgICAgICAgIGlmKCh1aW50MzJfdCliaXRtYXAtPnJvd3MgPiBtTWF4SGVpZ2h0KSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZihtQ3VycmVudENvbCArICh1aW50MzJfdCliaXRtYXAtPndpZHRoIDwgbU1heFdpZHRoKSB7CisgICAgICAgICAgICAgICAqcmV0T3JpZ2luWCA9IG1DdXJyZW50Q29sOworICAgICAgICAgICAgICAgKnJldE9yaWdpblkgPSBtQ3VycmVudFJvdzsKKyAgICAgICAgICAgICAgIG1DdXJyZW50Q29sICs9IGJpdG1hcC0+d2lkdGg7CisgICAgICAgICAgICAgICBtRGlydHkgPSB0cnVlOworICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH07CisKKyAgICBWZWN0b3I8Q2FjaGVUZXh0dXJlTGluZSo+IG1DYWNoZUxpbmVzOworICAgIHVpbnQzMl90IGdldFJlbWFpbmluZ0NhY2hlQ2FwYWNpdHkoKTsKKworICAgIHZvaWQgcHJlY2FjaGVMYXRpbihGb250ICpmb250KTsKKyAgICBTdHJpbmc4IG1MYXRpblByZWNhY2hlOworCisgICAgQ29udGV4dCAqbVJTQzsKKworICAgIGZsb2F0IG1Gb250Q29sb3JbNF07CisgICAgYm9vbCBtRm9udENvbG9yRGlydHk7CisKKyAgICAvLyBGcmVlIHR5cGUgbGlicmFyeSwgd2Ugb25seSBuZWVkIG9uZSBjb3B5CisgICAgRlRfTGlicmFyeSBtTGlicmFyeTsKKyAgICBGVF9MaWJyYXJ5IGdldExpYigpOworICAgIFZlY3RvcjxGb250Kj4gbUFjdGl2ZUZvbnRzOworCisgICAgLy8gUmVuZGVyIHN0YXRlIGZvciB0aGUgZm9udAorICAgIE9iamVjdEJhc2VSZWY8QWxsb2NhdGlvbj4gbUZvbnRTaGFkZXJGQ29uc3RhbnQ7CisgICAgT2JqZWN0QmFzZVJlZjxQcm9ncmFtRnJhZ21lbnQ+IG1Gb250U2hhZGVyRjsKKyAgICBPYmplY3RCYXNlUmVmPFNhbXBsZXI+IG1Gb250U2FtcGxlcjsKKyAgICBPYmplY3RCYXNlUmVmPFByb2dyYW1TdG9yZT4gbUZvbnRQcm9ncmFtU3RvcmU7CisgICAgdm9pZCBpbml0UmVuZGVyU3RhdGUoKTsKKworICAgIC8vIFRleHR1cmUgdG8gY2FjaGUgZ2x5cGggYml0bWFwcworICAgIE9iamVjdEJhc2VSZWY8QWxsb2NhdGlvbj4gbVRleHRUZXh0dXJlOworICAgIHZvaWQgaW5pdFRleHRUZXh0dXJlKCk7CisKKyAgICBib29sIGNhY2hlQml0bWFwKEZUX0JpdG1hcCAqYml0bWFwLCB1aW50MzJfdCAqcmV0T3JpZ2luWCwgdWludDMyX3QgKnJldE9yaWdpblkpOworICAgIGNvbnN0IFR5cGUqIGdldENhY2hlVGV4dHVyZVR5cGUoKSB7CisgICAgICAgIHJldHVybiBtVGV4dFRleHR1cmUtPmdldFR5cGUoKTsKKyAgICB9CisKKyAgICB2b2lkIGZsdXNoQWxsQW5kSW52YWxpZGF0ZSgpOworCisgICAgLy8gUG9pbnRlciB0byB2ZXJ0ZXggZGF0YSB0byBzcGVlZCB1cCBmcmFtZSB0byBmcmFtZSB3b3JrCisgICAgZmxvYXQgKm1UZXh0TWVzaFB0cjsKKyAgICB1aW50MzJfdCBtQ3VycmVudFF1YWRJbmRleDsKKyAgICB1aW50MzJfdCBtTWF4TnVtYmVyT2ZRdWFkczsKKworICAgIHZvaWQgaW5pdFZlcnRleEFycmF5QnVmZmVycygpOworICAgIE9iamVjdEJhc2VSZWY8QWxsb2NhdGlvbj4gbUluZGV4QnVmZmVyOworICAgIE9iamVjdEJhc2VSZWY8QWxsb2NhdGlvbj4gbVZlcnRleEFycmF5OworCisKKyAgICBib29sIG1Jbml0aWFsaXplZDsKKworICAgIHZvaWQgY2hlY2tJbml0KCk7CisKKyAgICB2b2lkIGlzc3VlRHJhd0NvbW1hbmQoKTsKKworICAgIHZvaWQgYXBwZW5kTWVzaFF1YWQoZmxvYXQgeDEsIGZsb2F0IHkxLCBmbG9hdCB6MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgdTEsIGZsb2F0IHYxLAorICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCB4MiwgZmxvYXQgeTIsIGZsb2F0IHoyLAorICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCB1MiwgZmxvYXQgdjIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHgzLCBmbG9hdCB5MywgZmxvYXQgejMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHUzLCBmbG9hdCB2MywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgeDQsIGZsb2F0IHk0LCBmbG9hdCB6NCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgdTQsIGZsb2F0IHY0KTsKKworfTsKKworCit9Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGlicy9ycy9yc0hhbmRjb2RlLmggYi9saWJzL3JzL3JzSGFuZGNvZGUuaAppbmRleCA4MDBlZGRkLi5jMDJmZDQyIDEwMDY0NAotLS0gYS9saWJzL3JzL3JzSGFuZGNvZGUuaAorKysgYi9saWJzL3JzL3JzSGFuZGNvZGUuaApAQCAtMSw2ICsxLDU3IEBACiAKICNkZWZpbmUgREFUQV9TWU5DX1NJWkUgMTAyNAogCitzdGF0aWMgaW5saW5lIHZvaWQgcnNIQ0FQSV9Db250ZXh0RmluaXNoIChSc0NvbnRleHQgcnNjKQoreworICAgIFRocmVhZElPICppbyA9ICYoKENvbnRleHQgKilyc2MpLT5tSU87CisgICAgdWludDMyX3Qgc2l6ZSA9IHNpemVvZihSU19DTURfQ29udGV4dEZpbmlzaCk7CisgICAgUlNfQ01EX0NvbnRleHRGaW5pc2ggKmNtZCA9IHN0YXRpY19jYXN0PFJTX0NNRF9Db250ZXh0RmluaXNoICo+KGlvLT5tVG9Db3JlLnJlc2VydmUoc2l6ZSkpOworICAgIGlvLT5tVG9Db3JlLmNvbW1pdFN5bmMoUlNfQ01EX0lEX0NvbnRleHRGaW5pc2gsIHNpemUpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgcnNIQ0FQSV9TY3JpcHRJbnZva2VWIChSc0NvbnRleHQgcnNjLCBSc1NjcmlwdCB2YSwgdWludDMyX3Qgc2xvdCwgY29uc3Qgdm9pZCAqIGRhdGEsIHVpbnQzMl90IHNpemVCeXRlcykKK3sKKyAgICBUaHJlYWRJTyAqaW8gPSAmKChDb250ZXh0ICopcnNjKS0+bUlPOworICAgIHVpbnQzMl90IHNpemUgPSBzaXplb2YoUlNfQ01EX1NjcmlwdEludm9rZVYpOworICAgIGlmIChzaXplQnl0ZXMgPCBEQVRBX1NZTkNfU0laRSkgeworICAgICAgICBzaXplICs9IChzaXplQnl0ZXMgKyAzKSAmIH4zOworICAgIH0KKyAgICBSU19DTURfU2NyaXB0SW52b2tlViAqY21kID0gc3RhdGljX2Nhc3Q8UlNfQ01EX1NjcmlwdEludm9rZVYgKj4oaW8tPm1Ub0NvcmUucmVzZXJ2ZShzaXplKSk7CisgICAgY21kLT5zID0gdmE7CisgICAgY21kLT5zbG90ID0gc2xvdDsKKyAgICBjbWQtPmRhdGFMZW4gPSBzaXplQnl0ZXM7CisgICAgY21kLT5kYXRhID0gZGF0YTsKKyAgICBpZiAoc2l6ZUJ5dGVzIDwgREFUQV9TWU5DX1NJWkUpIHsKKyAgICAgICAgY21kLT5kYXRhID0gKHZvaWQgKikoY21kKzEpOworICAgICAgICBtZW1jcHkoY21kKzEsIGRhdGEsIHNpemVCeXRlcyk7CisgICAgICAgIGlvLT5tVG9Db3JlLmNvbW1pdChSU19DTURfSURfU2NyaXB0SW52b2tlViwgc2l6ZSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaW8tPm1Ub0NvcmUuY29tbWl0U3luYyhSU19DTURfSURfU2NyaXB0SW52b2tlViwgc2l6ZSk7CisgICAgfQorfQorCisKK3N0YXRpYyBpbmxpbmUgdm9pZCByc0hDQVBJX1NjcmlwdFNldFZhclYgKFJzQ29udGV4dCByc2MsIFJzU2NyaXB0IHZhLCB1aW50MzJfdCBzbG90LCBjb25zdCB2b2lkICogZGF0YSwgdWludDMyX3Qgc2l6ZUJ5dGVzKQoreworICAgIFRocmVhZElPICppbyA9ICYoKENvbnRleHQgKilyc2MpLT5tSU87CisgICAgdWludDMyX3Qgc2l6ZSA9IHNpemVvZihSU19DTURfU2NyaXB0U2V0VmFyVik7CisgICAgaWYgKHNpemVCeXRlcyA8IERBVEFfU1lOQ19TSVpFKSB7CisgICAgICAgIHNpemUgKz0gKHNpemVCeXRlcyArIDMpICYgfjM7CisgICAgfQorICAgIFJTX0NNRF9TY3JpcHRTZXRWYXJWICpjbWQgPSBzdGF0aWNfY2FzdDxSU19DTURfU2NyaXB0U2V0VmFyViAqPihpby0+bVRvQ29yZS5yZXNlcnZlKHNpemUpKTsKKyAgICBjbWQtPnMgPSB2YTsKKyAgICBjbWQtPnNsb3QgPSBzbG90OworICAgIGNtZC0+ZGF0YUxlbiA9IHNpemVCeXRlczsKKyAgICBjbWQtPmRhdGEgPSBkYXRhOworICAgIGlmIChzaXplQnl0ZXMgPCBEQVRBX1NZTkNfU0laRSkgeworICAgICAgICBjbWQtPmRhdGEgPSAodm9pZCAqKShjbWQrMSk7CisgICAgICAgIG1lbWNweShjbWQrMSwgZGF0YSwgc2l6ZUJ5dGVzKTsKKyAgICAgICAgaW8tPm1Ub0NvcmUuY29tbWl0KFJTX0NNRF9JRF9TY3JpcHRTZXRWYXJWLCBzaXplKTsKKyAgICB9IGVsc2UgeworICAgICAgICBpby0+bVRvQ29yZS5jb21taXRTeW5jKFJTX0NNRF9JRF9TY3JpcHRTZXRWYXJWLCBzaXplKTsKKyAgICB9Cit9CisKIHN0YXRpYyBpbmxpbmUgdm9pZCByc0hDQVBJX0FsbG9jYXRpb25EYXRhIChSc0NvbnRleHQgcnNjLCBSc0FsbG9jYXRpb24gdmEsIGNvbnN0IHZvaWQgKiBkYXRhLCB1aW50MzJfdCBzaXplQnl0ZXMpCiB7CiAgICAgVGhyZWFkSU8gKmlvID0gJigoQ29udGV4dCAqKXJzYyktPm1JTzsKQEAgLTQ1LDMgKzk2LDI2IEBACiAKIH0KIAorc3RhdGljIGlubGluZSB2b2lkIHJzSENBUElfQWxsb2NhdGlvbjFEU3ViRWxlbWVudERhdGEgKFJzQ29udGV4dCByc2MsIFJzQWxsb2NhdGlvbiB2YSwgdWludDMyX3QgeCwgY29uc3Qgdm9pZCAqIGRhdGEsIHVpbnQzMl90IGNvbXBfb2Zmc2V0LCB1aW50MzJfdCBzaXplQnl0ZXMpCit7CisgICAgVGhyZWFkSU8gKmlvID0gJigoQ29udGV4dCAqKXJzYyktPm1JTzsKKyAgICB1aW50MzJfdCBzaXplID0gc2l6ZW9mKFJTX0NNRF9BbGxvY2F0aW9uMURTdWJFbGVtZW50RGF0YSk7CisgICAgaWYgKHNpemVCeXRlcyA8IERBVEFfU1lOQ19TSVpFKSB7CisgICAgICAgIHNpemUgKz0gKHNpemVCeXRlcyArIDMpICYgfjM7CisgICAgfQorICAgIFJTX0NNRF9BbGxvY2F0aW9uMURTdWJFbGVtZW50RGF0YSAqY21kID0gc3RhdGljX2Nhc3Q8UlNfQ01EX0FsbG9jYXRpb24xRFN1YkVsZW1lbnREYXRhICo+KGlvLT5tVG9Db3JlLnJlc2VydmUoc2l6ZSkpOworICAgIGNtZC0+dmEgPSB2YTsKKyAgICBjbWQtPnggPSB4OworICAgIGNtZC0+ZGF0YSA9IGRhdGE7CisgICAgY21kLT5jb21wX29mZnNldCA9IGNvbXBfb2Zmc2V0OworICAgIGNtZC0+Ynl0ZXMgPSBzaXplQnl0ZXM7CisgICAgaWYgKHNpemVCeXRlcyA8IERBVEFfU1lOQ19TSVpFKSB7CisgICAgICAgIGNtZC0+ZGF0YSA9ICh2b2lkICopKGNtZCsxKTsKKyAgICAgICAgbWVtY3B5KGNtZCsxLCBkYXRhLCBzaXplQnl0ZXMpOworICAgICAgICBpby0+bVRvQ29yZS5jb21taXQoUlNfQ01EX0lEX0FsbG9jYXRpb24xRFN1YkVsZW1lbnREYXRhLCBzaXplKTsKKyAgICB9IGVsc2UgeworICAgICAgICBpby0+bVRvQ29yZS5jb21taXRTeW5jKFJTX0NNRF9JRF9BbGxvY2F0aW9uMURTdWJFbGVtZW50RGF0YSwgc2l6ZSk7CisgICAgfQorCit9CisKZGlmZiAtLWdpdCBhL2xpYnMvcnMvcnNMaWdodC5jcHAgYi9saWJzL3JzL3JzTGlnaHQuY3BwCmluZGV4IDZmMmNmM2UuLmVhYjlhMDcgMTAwNjQ0Ci0tLSBhL2xpYnMvcnMvcnNMaWdodC5jcHAKKysrIGIvbGlicy9ycy9yc0xpZ2h0LmNwcApAQCAtMTQsOSArMTQsMTMgQEAKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKKyNpZm5kZWYgQU5EUk9JRF9SU19CVUlMRF9GT1JfSE9TVAogI2luY2x1ZGUgInJzQ29udGV4dC5oIgotCiAjaW5jbHVkZSA8R0xFUy9nbC5oPgorI2Vsc2UKKyNpbmNsdWRlICJyc0NvbnRleHRIb3N0U3R1Yi5oIgorI2luY2x1ZGUgPE9wZW5HTC9nbC5oPgorI2VuZGlmIC8vQU5EUk9JRF9SU19CVUlMRF9GT1JfSE9TVAogCiB1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKIHVzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOjpyZW5kZXJzY3JpcHQ7CkBAIC02NSw2ICs2OSwxNiBAQAogICAgIGdsTGlnaHRmdihHTF9MSUdIVDAgKyBudW0sIEdMX1BPU0lUSU9OLCBtUG9zaXRpb24pOwogfQogCit2b2lkIExpZ2h0OjpzZXJpYWxpemUoT1N0cmVhbSAqc3RyZWFtKSBjb25zdAoreworICAgIAorfQorCitMaWdodCAqTGlnaHQ6OmNyZWF0ZUZyb21TdHJlYW0oQ29udGV4dCAqcnNjLCBJU3RyZWFtICpzdHJlYW0pCit7CisgICAgcmV0dXJuIE5VTEw7Cit9CisKIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAKIExpZ2h0U3RhdGU6OkxpZ2h0U3RhdGUoKQpkaWZmIC0tZ2l0IGEvbGlicy9ycy9yc0xpZ2h0LmggYi9saWJzL3JzL3JzTGlnaHQuaAppbmRleCBkODc5NmU2Li5iZDU4OTc5IDEwMDY0NAotLS0gYS9saWJzL3JzL3JzTGlnaHQuaAorKysgYi9saWJzL3JzL3JzTGlnaHQuaApAQCAtMzcsNiArMzcsOSBAQAogICAgIHZvaWQgc2V0Q29sb3IoZmxvYXQgciwgZmxvYXQgZywgZmxvYXQgYik7CiAKICAgICB2b2lkIHNldHVwR0wodWludDMyX3QgbnVtKSBjb25zdDsKKyAgICB2aXJ0dWFsIHZvaWQgc2VyaWFsaXplKE9TdHJlYW0gKnN0cmVhbSkgY29uc3Q7CisgICAgdmlydHVhbCBSc0EzRENsYXNzSUQgZ2V0Q2xhc3NJZCgpIGNvbnN0IHsgcmV0dXJuIFJTX0EzRF9DTEFTU19JRF9MSUdIVDsgfQorICAgIHN0YXRpYyBMaWdodCAqY3JlYXRlRnJvbVN0cmVhbShDb250ZXh0ICpyc2MsIElTdHJlYW0gKnN0cmVhbSk7CiAKIHByb3RlY3RlZDoKICAgICBmbG9hdCBtQ29sb3JbNF07CmRpZmYgLS1naXQgYS9saWJzL3JzL3JzTG9ja2xlc3NGaWZvLmNwcCBiL2xpYnMvcnMvcnNMb2NrbGVzc0ZpZm8uY3BwCmluZGV4IGM3OTY1MjAuLjAxOWVhNzIgMTAwNjQ0Ci0tLSBhL2xpYnMvcnMvcnNMb2NrbGVzc0ZpZm8uY3BwCisrKyBiL2xpYnMvcnMvcnNMb2NrbGVzc0ZpZm8uY3BwCkBAIC0xNyw3ICsxNyw3IEBACiAjaW5jbHVkZSAicnNMb2NrbGVzc0ZpZm8uaCIKIAogdXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7Ci0KK3VzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOjpyZW5kZXJzY3JpcHQ7CiAKIExvY2tsZXNzQ29tbWFuZEZpZm86OkxvY2tsZXNzQ29tbWFuZEZpZm8oKQogewpAQCAtMTI4LDE1ICsxMjgsMTkgQEAKICAgICAvL2R1bXBTdGF0ZSgiZmx1c2ggMiIpOwogfQogCit2b2lkIExvY2tsZXNzQ29tbWFuZEZpZm86OndhaXQoKQoreworICAgIHdoaWxlKGlzRW1wdHkoKSAmJiAhbUluU2h1dGRvd24pIHsKKyAgICAgICAgbVNpZ25hbFRvQ29udHJvbC5zZXQoKTsKKyAgICAgICAgbVNpZ25hbFRvV29ya2VyLndhaXQoKTsKKyAgICB9Cit9CisKIGNvbnN0IHZvaWQgKiBMb2NrbGVzc0NvbW1hbmRGaWZvOjpnZXQodWludDMyX3QgKmNvbW1hbmQsIHVpbnQzMl90ICpieXRlc0RhdGEpCiB7CiAgICAgd2hpbGUoMSkgewogICAgICAgICAvL2R1bXBTdGF0ZSgiZ2V0Iik7Ci0gICAgICAgIHdoaWxlKGlzRW1wdHkoKSAmJiAhbUluU2h1dGRvd24pIHsKLSAgICAgICAgICAgIG1TaWduYWxUb0NvbnRyb2wuc2V0KCk7Ci0gICAgICAgICAgICBtU2lnbmFsVG9Xb3JrZXIud2FpdCgpOwotICAgICAgICB9Ci0KKyAgICAgICAgd2FpdCgpOwogICAgICAgICBpZiAobUluU2h1dGRvd24pIHsKICAgICAgICAgICAgICpjb21tYW5kID0gMDsKICAgICAgICAgICAgICpieXRlc0RhdGEgPSAwOwpAQCAtMTY1LDYgKzE2OSwzMCBAQAogICAgIC8vZHVtcFN0YXRlKCJuZXh0Iik7CiB9CiAKK2Jvb2wgTG9ja2xlc3NDb21tYW5kRmlmbzo6bWFrZVNwYWNlTm9uQmxvY2tpbmcodWludDMyX3QgYnl0ZXMpCit7CisgICAgLy9kdW1wU3RhdGUoIm1ha2Ugc3BhY2Ugbm9uLWJsb2NraW5nIik7CisgICAgaWYgKChtUHV0K2J5dGVzKSA+IG1FbmQpIHsKKyAgICAgICAgLy8gTmVlZCB0byBsb29wIHJlZ2FyZGxlc3Mgb2Ygd2hlcmUgZ2V0IGlzLgorICAgICAgICBpZigobUdldCA+IG1QdXQpICYmIChtQnVmZmVyKzQgPj0gbUdldCkpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFRvc3MgaW4gYSByZXNldCB0aGVuIHRoZSBub3JtYWwgd2FpdCBmb3Igc3BhY2Ugd2lsbCBkbyB0aGUgcmVzdC4KKyAgICAgICAgcmVpbnRlcnByZXRfY2FzdDx1aW50MTZfdCAqPihtUHV0KVswXSA9IDA7CisgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8dWludDE2X3QgKj4obVB1dClbMV0gPSAwOworICAgICAgICBtUHV0ID0gbUJ1ZmZlcjsKKyAgICAgICAgbVNpZ25hbFRvV29ya2VyLnNldCgpOworICAgIH0KKworICAgIC8vIGl0IHdpbGwgZml0IGhlcmUgc28gd2UganVzdCBuZWVkIHRvIHdhaXQgZm9yIHNwYWNlLgorICAgIGlmKGdldEZyZWVTcGFjZSgpIDwgYnl0ZXMpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHJldHVybiB0cnVlOworfQorCiB2b2lkIExvY2tsZXNzQ29tbWFuZEZpZm86Om1ha2VTcGFjZSh1aW50MzJfdCBieXRlcykKIHsKICAgICAvL2R1bXBTdGF0ZSgibWFrZSBzcGFjZSIpOwpAQCAtMTc4LDYgKzIwNiw3IEBACiAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8dWludDE2X3QgKj4obVB1dClbMF0gPSAwOwogICAgICAgICByZWludGVycHJldF9jYXN0PHVpbnQxNl90ICo+KG1QdXQpWzFdID0gMDsKICAgICAgICAgbVB1dCA9IG1CdWZmZXI7CisgICAgICAgIG1TaWduYWxUb1dvcmtlci5zZXQoKTsKICAgICB9CiAKICAgICAvLyBpdCB3aWxsIGZpdCBoZXJlIHNvIHdlIGp1c3QgbmVlZCB0byB3YWl0IGZvciBzcGFjZS4KQEAgLTE4OSw4MiArMjE4LDYgQEAKIAogdm9pZCBMb2NrbGVzc0NvbW1hbmRGaWZvOjpkdW1wU3RhdGUoY29uc3QgY2hhciAqcykgY29uc3QKIHsKLSAgICBMT0dWKCIlcyAgcHV0ICVwLCBnZXQgJXAsICBidWYgJXAsICBlbmQgJXAiLCBzLCBtUHV0LCBtR2V0LCBtQnVmZmVyLCBtRW5kKTsKLX0KLQotTG9ja2xlc3NDb21tYW5kRmlmbzo6U2lnbmFsOjpTaWduYWwoKQotewotICAgIG1TZXQgPSB0cnVlOwotfQotCi1Mb2NrbGVzc0NvbW1hbmRGaWZvOjpTaWduYWw6On5TaWduYWwoKQotewotICAgIHB0aHJlYWRfbXV0ZXhfZGVzdHJveSgmbU11dGV4KTsKLSAgICBwdGhyZWFkX2NvbmRfZGVzdHJveSgmbUNvbmRpdGlvbik7Ci19Ci0KLWJvb2wgTG9ja2xlc3NDb21tYW5kRmlmbzo6U2lnbmFsOjppbml0KCkKLXsKLSAgICBpbnQgc3RhdHVzID0gcHRocmVhZF9tdXRleF9pbml0KCZtTXV0ZXgsIE5VTEwpOwotICAgIGlmIChzdGF0dXMpIHsKLSAgICAgICAgTE9HRSgiTG9ja2xlc3NGaWZvIG11dGV4IGluaXQgZmFpbHVyZSIpOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgc3RhdHVzID0gcHRocmVhZF9jb25kX2luaXQoJm1Db25kaXRpb24sIE5VTEwpOwotICAgIGlmIChzdGF0dXMpIHsKLSAgICAgICAgTE9HRSgiTG9ja2xlc3NGaWZvIGNvbmRpdGlvbiBpbml0IGZhaWx1cmUiKTsKLSAgICAgICAgcHRocmVhZF9tdXRleF9kZXN0cm95KCZtTXV0ZXgpOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLXZvaWQgTG9ja2xlc3NDb21tYW5kRmlmbzo6U2lnbmFsOjpzZXQoKQotewotICAgIGludCBzdGF0dXM7Ci0KLSAgICBzdGF0dXMgPSBwdGhyZWFkX211dGV4X2xvY2soJm1NdXRleCk7Ci0gICAgaWYgKHN0YXR1cykgewotICAgICAgICBMT0dFKCJMb2NrbGVzc0NvbW1hbmRGaWZvOiBlcnJvciAlaSBsb2NraW5nIGZvciBzZXQgY29uZGl0aW9uLiIsIHN0YXR1cyk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBtU2V0ID0gdHJ1ZTsKLQotICAgIHN0YXR1cyA9IHB0aHJlYWRfY29uZF9zaWduYWwoJm1Db25kaXRpb24pOwotICAgIGlmIChzdGF0dXMpIHsKLSAgICAgICAgTE9HRSgiTG9ja2xlc3NDb21tYW5kRmlmbzogZXJyb3IgJWkgb24gc2V0IGNvbmRpdGlvbi4iLCBzdGF0dXMpOwotICAgIH0KLQotICAgIHN0YXR1cyA9IHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZtTXV0ZXgpOwotICAgIGlmIChzdGF0dXMpIHsKLSAgICAgICAgTE9HRSgiTG9ja2xlc3NDb21tYW5kRmlmbzogZXJyb3IgJWkgdW5sb2NraW5nIGZvciBzZXQgY29uZGl0aW9uLiIsIHN0YXR1cyk7Ci0gICAgfQotfQotCi12b2lkIExvY2tsZXNzQ29tbWFuZEZpZm86OlNpZ25hbDo6d2FpdCgpCi17Ci0gICAgaW50IHN0YXR1czsKLQotICAgIHN0YXR1cyA9IHB0aHJlYWRfbXV0ZXhfbG9jaygmbU11dGV4KTsKLSAgICBpZiAoc3RhdHVzKSB7Ci0gICAgICAgIExPR0UoIkxvY2tsZXNzQ29tbWFuZEZpZm86IGVycm9yICVpIGxvY2tpbmcgZm9yIGNvbmRpdGlvbi4iLCBzdGF0dXMpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgaWYgKCFtU2V0KSB7Ci0gICAgICAgIHN0YXR1cyA9IHB0aHJlYWRfY29uZF93YWl0KCZtQ29uZGl0aW9uLCAmbU11dGV4KTsKLSAgICAgICAgaWYgKHN0YXR1cykgewotICAgICAgICAgICAgTE9HRSgiTG9ja2xlc3NDb21tYW5kRmlmbzogZXJyb3IgJWkgd2FpdGluZyBvbiBjb25kaXRpb24uIiwgc3RhdHVzKTsKLSAgICAgICAgfQotICAgIH0KLSAgICBtU2V0ID0gZmFsc2U7Ci0KLSAgICBzdGF0dXMgPSBwdGhyZWFkX211dGV4X3VubG9jaygmbU11dGV4KTsKLSAgICBpZiAoc3RhdHVzKSB7Ci0gICAgICAgIExPR0UoIkxvY2tsZXNzQ29tbWFuZEZpZm86IGVycm9yICVpIHVubG9ja2luZyBmb3IgY29uZGl0aW9uLiIsIHN0YXR1cyk7Ci0gICAgfQorICAgIExPR1YoIiVzICVwICBwdXQgJXAsIGdldCAlcCwgIGJ1ZiAlcCwgIGVuZCAlcCIsIHMsIHRoaXMsIG1QdXQsIG1HZXQsIG1CdWZmZXIsIG1FbmQpOwogfQogCmRpZmYgLS1naXQgYS9saWJzL3JzL3JzTG9ja2xlc3NGaWZvLmggYi9saWJzL3JzL3JzTG9ja2xlc3NGaWZvLmgKaW5kZXggZDBhNDM1Ni4uYjhjZWVlZCAxMDA2NDQKLS0tIGEvbGlicy9ycy9yc0xvY2tsZXNzRmlmby5oCisrKyBiL2xpYnMvcnMvcnNMb2NrbGVzc0ZpZm8uaApAQCAtMTksOCArMTksMTAgQEAKIAogCiAjaW5jbHVkZSAicnNVdGlscy5oIgorI2luY2x1ZGUgInJzU2lnbmFsLmgiCiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSByZW5kZXJzY3JpcHQgewogCiAKIC8vIEEgc2ltcGxlIEZJRk8gdG8gYmUgdXNlZCBhcyBhIHByb2R1Y2VyIC8gY29uc3VtZXIgYmV0d2VlbiB0d28KQEAgLTM3LDI0ICszOSw3IEBACiAgICAgTG9ja2xlc3NDb21tYW5kRmlmbygpOwogICAgIH5Mb2NrbGVzc0NvbW1hbmRGaWZvKCk7CiAKLQogcHJvdGVjdGVkOgotICAgIGNsYXNzIFNpZ25hbCB7Ci0gICAgcHVibGljOgotICAgICAgICBTaWduYWwoKTsKLSAgICAgICAgflNpZ25hbCgpOwotCi0gICAgICAgIGJvb2wgaW5pdCgpOwotCi0gICAgICAgIHZvaWQgc2V0KCk7Ci0gICAgICAgIHZvaWQgd2FpdCgpOwotCi0gICAgcHJvdGVjdGVkOgotICAgICAgICBib29sIG1TZXQ7Ci0gICAgICAgIHB0aHJlYWRfbXV0ZXhfdCBtTXV0ZXg7Ci0gICAgICAgIHB0aHJlYWRfY29uZF90IG1Db25kaXRpb247Ci0gICAgfTsKLQogICAgIHVpbnQ4X3QgKiB2b2xhdGlsZSBtUHV0OwogICAgIHVpbnQ4X3QgKiB2b2xhdGlsZSBtR2V0OwogICAgIHVpbnQ4X3QgKiBtQnVmZmVyOwpAQCAtNjUsMTggKzUwLDE5IEBACiAgICAgU2lnbmFsIG1TaWduYWxUb1dvcmtlcjsKICAgICBTaWduYWwgbVNpZ25hbFRvQ29udHJvbDsKIAotCi0KIHB1YmxpYzoKICAgICB2b2lkICogcmVzZXJ2ZSh1aW50MzJfdCBieXRlcyk7CiAgICAgdm9pZCBjb21taXQodWludDMyX3QgY29tbWFuZCwgdWludDMyX3QgYnl0ZXMpOwogICAgIHZvaWQgY29tbWl0U3luYyh1aW50MzJfdCBjb21tYW5kLCB1aW50MzJfdCBieXRlcyk7CiAKICAgICB2b2lkIGZsdXNoKCk7CisgICAgdm9pZCB3YWl0KCk7CisKICAgICBjb25zdCB2b2lkICogZ2V0KHVpbnQzMl90ICpjb21tYW5kLCB1aW50MzJfdCAqYnl0ZXNEYXRhKTsKICAgICB2b2lkIG5leHQoKTsKIAogICAgIHZvaWQgbWFrZVNwYWNlKHVpbnQzMl90IGJ5dGVzKTsKKyAgICBib29sIG1ha2VTcGFjZU5vbkJsb2NraW5nKHVpbnQzMl90IGJ5dGVzKTsKIAogICAgIGJvb2wgaXNFbXB0eSgpIGNvbnN0OwogICAgIHVpbnQzMl90IGdldEZyZWVTcGFjZSgpIGNvbnN0OwpAQCAtODgsNCArNzQsNSBAQAogCiAKIH0KK30KICNlbmRpZgpkaWZmIC0tZ2l0IGEvbGlicy9ycy9yc01hdHJpeC5jcHAgYi9saWJzL3JzL3JzTWF0cml4LmNwcAppbmRleCAyZjIxNDA1Li45NGVlZjEzIDEwMDY0NAotLS0gYS9saWJzL3JzL3JzTWF0cml4LmNwcAorKysgYi9saWJzL3JzL3JzTWF0cml4LmNwcApAQCAtNzMsNyArNzMsNyBAQAogICAgIHMgPSBzaW5mKHJvdCk7CiAKICAgICBjb25zdCBmbG9hdCBsZW4gPSBzcXJ0Zih4KnggKyB5KnkgKyB6KnopOwotICAgIGlmICghKGxlbiAhPSAxKSkgeworICAgIGlmIChsZW4gIT0gMSkgewogICAgICAgICBjb25zdCBmbG9hdCByZWNpcExlbiA9IDEuZiAvIGxlbjsKICAgICAgICAgeCAqPSByZWNpcExlbjsKICAgICAgICAgeSAqPSByZWNpcExlbjsKZGlmZiAtLWdpdCBhL2xpYnMvcnMvcnNNZXNoLmNwcCBiL2xpYnMvcnMvcnNNZXNoLmNwcAppbmRleCBkNTk1YjRlLi44MTBlNGZmIDEwMDY0NAotLS0gYS9saWJzL3JzL3JzTWVzaC5jcHAKKysrIGIvbGlicy9ycy9yc01lc2guY3BwCkBAIC0xNCwyOCArMTQsMjU4IEBACiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCisjaWZuZGVmIEFORFJPSURfUlNfQlVJTERfRk9SX0hPU1QKICNpbmNsdWRlICJyc0NvbnRleHQuaCIKIAorI2luY2x1ZGUgPEdMRVMvZ2wuaD4KKyNpbmNsdWRlIDxHTEVTMi9nbDIuaD4KKyNpbmNsdWRlIDxHTEVTL2dsZXh0Lmg+CisjZWxzZQorI2luY2x1ZGUgInJzQ29udGV4dEhvc3RTdHViLmgiCisKKyNpbmNsdWRlIDxPcGVuR0wvZ2wuaD4KKyNpbmNsdWRlIDxPcGVuR2wvZ2xleHQuaD4KKyNlbmRpZgorCisKIHVzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOwogdXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ6OnJlbmRlcnNjcmlwdDsKIAotI2luY2x1ZGUgPEdMRVMvZ2wuaD4KLSNpbmNsdWRlIDxHTEVTL2dsZXh0Lmg+Ci0KIE1lc2g6Ok1lc2goQ29udGV4dCAqcnNjKSA6IE9iamVjdEJhc2UocnNjKQogewogICAgIG1BbGxvY0ZpbGUgPSBfX0ZJTEVfXzsKICAgICBtQWxsb2NMaW5lID0gX19MSU5FX187Ci0gICAgbVZlcnRpY2llcyA9IE5VTEw7Ci0gICAgbVZlcnRpY2llc0NvdW50ID0gMDsKICAgICBtUHJpbWl0aXZlcyA9IE5VTEw7CiAgICAgbVByaW1pdGl2ZXNDb3VudCA9IDA7CisgICAgbVZlcnRleEJ1ZmZlcnMgPSBOVUxMOworICAgIG1WZXJ0ZXhCdWZmZXJDb3VudCA9IDA7CiB9CiAKIE1lc2g6On5NZXNoKCkKIHsKKyAgICBpZihtVmVydGV4QnVmZmVycykgeworICAgICAgICBkZWxldGVbXSBtVmVydGV4QnVmZmVyczsKKyAgICB9CisKKyAgICBpZihtUHJpbWl0aXZlcykgeworICAgICAgICBmb3IodWludDMyX3QgaSA9IDA7IGkgPCBtUHJpbWl0aXZlc0NvdW50OyBpICsrKSB7CisgICAgICAgICAgICBkZWxldGUgbVByaW1pdGl2ZXNbaV07CisgICAgICAgIH0KKyAgICAgICAgZGVsZXRlW10gbVByaW1pdGl2ZXM7CisgICAgfQogfQogCit2b2lkIE1lc2g6OnJlbmRlcihDb250ZXh0ICpyc2MpIGNvbnN0Cit7CisgICAgZm9yKHVpbnQzMl90IGN0ID0gMDsgY3QgPCBtUHJpbWl0aXZlc0NvdW50OyBjdCArKykgeworICAgICAgICByZW5kZXJQcmltaXRpdmUocnNjLCBjdCk7CisgICAgfQorfQorCit2b2lkIE1lc2g6OnJlbmRlclByaW1pdGl2ZShDb250ZXh0ICpyc2MsIHVpbnQzMl90IHByaW1JbmRleCkgY29uc3QgeworICAgIGlmIChwcmltSW5kZXggPj0gbVByaW1pdGl2ZXNDb3VudCkgeworICAgICAgICBMT0dFKCJJbnZhbGlkIHByaW1pdGl2ZSBpbmRleCIpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgUHJpbWl0aXZlX3QgKnByaW0gPSBtUHJpbWl0aXZlc1twcmltSW5kZXhdOworCisgICAgaWYgKHByaW0tPm1JbmRleEJ1ZmZlci5nZXQoKSkgeworICAgICAgICByZW5kZXJQcmltaXRpdmVSYW5nZShyc2MsIHByaW1JbmRleCwgMCwgcHJpbS0+bUluZGV4QnVmZmVyLT5nZXRUeXBlKCktPmdldERpbVgoKSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICByZW5kZXJQcmltaXRpdmVSYW5nZShyc2MsIHByaW1JbmRleCwgMCwgbVZlcnRleEJ1ZmZlcnNbMF0tPmdldFR5cGUoKS0+Z2V0RGltWCgpKTsKK30KKwordm9pZCBNZXNoOjpyZW5kZXJQcmltaXRpdmVSYW5nZShDb250ZXh0ICpyc2MsIHVpbnQzMl90IHByaW1JbmRleCwgdWludDMyX3Qgc3RhcnQsIHVpbnQzMl90IGxlbikgY29uc3QKK3sKKyAgICBpZiAobGVuIDwgMSB8fCBwcmltSW5kZXggPj0gbVByaW1pdGl2ZXNDb3VudCkgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgcnNjLT5jaGVja0Vycm9yKCJNZXNoOjpyZW5kZXJQcmltaXRpdmVSYW5nZSAxIik7CisgICAgVmVydGV4QXJyYXkgdmE7CisgICAgZm9yICh1aW50MzJfdCBjdD0wOyBjdCA8IG1WZXJ0ZXhCdWZmZXJDb3VudDsgY3QrKykgeworICAgICAgICBtVmVydGV4QnVmZmVyc1tjdF0tPnVwbG9hZENoZWNrKHJzYyk7CisgICAgICAgIGlmIChtVmVydGV4QnVmZmVyc1tjdF0tPmdldElzQnVmZmVyT2JqZWN0KCkpIHsKKyAgICAgICAgICAgIHZhLnNldEFjdGl2ZUJ1ZmZlcihtVmVydGV4QnVmZmVyc1tjdF0tPmdldEJ1ZmZlck9iamVjdElEKCkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdmEuc2V0QWN0aXZlQnVmZmVyKG1WZXJ0ZXhCdWZmZXJzW2N0XS0+Z2V0UHRyKCkpOworICAgICAgICB9CisgICAgICAgIG1WZXJ0ZXhCdWZmZXJzW2N0XS0+Z2V0VHlwZSgpLT5lbmFibGVHTFZlcnRleEJ1ZmZlcigmdmEpOworICAgIH0KKyAgICB2YS5zZXR1cEdMMihyc2MsICZyc2MtPm1TdGF0ZVZlcnRleEFycmF5LCAmcnNjLT5tU2hhZGVyQ2FjaGUpOworCisgICAgcnNjLT5jaGVja0Vycm9yKCJNZXNoOjpyZW5kZXJQcmltaXRpdmVSYW5nZSAyIik7CisgICAgUHJpbWl0aXZlX3QgKnByaW0gPSBtUHJpbWl0aXZlc1twcmltSW5kZXhdOworICAgIGlmIChwcmltLT5tSW5kZXhCdWZmZXIuZ2V0KCkpIHsKKyAgICAgICAgcHJpbS0+bUluZGV4QnVmZmVyLT51cGxvYWRDaGVjayhyc2MpOworICAgICAgICBnbEJpbmRCdWZmZXIoR0xfRUxFTUVOVF9BUlJBWV9CVUZGRVIsIHByaW0tPm1JbmRleEJ1ZmZlci0+Z2V0QnVmZmVyT2JqZWN0SUQoKSk7CisgICAgICAgIGdsRHJhd0VsZW1lbnRzKHByaW0tPm1HTFByaW1pdGl2ZSwgbGVuLCBHTF9VTlNJR05FRF9TSE9SVCwgKHVpbnQxNl90ICopKHN0YXJ0ICogMikpOworICAgIH0gZWxzZSB7CisgICAgICAgIGdsRHJhd0FycmF5cyhwcmltLT5tR0xQcmltaXRpdmUsIHN0YXJ0LCBsZW4pOworICAgIH0KKworICAgIHJzYy0+Y2hlY2tFcnJvcigiTWVzaDo6cmVuZGVyUHJpbWl0aXZlUmFuZ2UiKTsKK30KKworCit2b2lkIE1lc2g6OnVwbG9hZEFsbChDb250ZXh0ICpyc2MpCit7CisgICAgZm9yICh1aW50MzJfdCBjdCA9IDA7IGN0IDwgbVZlcnRleEJ1ZmZlckNvdW50OyBjdCArKykgeworICAgICAgICBpZiAobVZlcnRleEJ1ZmZlcnNbY3RdLmdldCgpKSB7CisgICAgICAgICAgICBtVmVydGV4QnVmZmVyc1tjdF0tPmRlZmVyZWRVcGxvYWRUb0J1ZmZlck9iamVjdChyc2MpOworICAgICAgICB9CisgICAgfQorCisgICAgZm9yICh1aW50MzJfdCBjdCA9IDA7IGN0IDwgbVByaW1pdGl2ZXNDb3VudDsgY3QgKyspIHsKKyAgICAgICAgaWYgKG1QcmltaXRpdmVzW2N0XS0+bUluZGV4QnVmZmVyLmdldCgpKSB7CisgICAgICAgICAgICBtUHJpbWl0aXZlc1tjdF0tPm1JbmRleEJ1ZmZlci0+ZGVmZXJlZFVwbG9hZFRvQnVmZmVyT2JqZWN0KHJzYyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByc2MtPmNoZWNrRXJyb3IoIk1lc2g6OnVwbG9hZEFsbCIpOworfQorCit2b2lkIE1lc2g6OnVwZGF0ZUdMUHJpbWl0aXZlcygpCit7CisgICAgZm9yKHVpbnQzMl90IGkgPSAwOyBpIDwgbVByaW1pdGl2ZXNDb3VudDsgaSArKykgeworICAgICAgICBzd2l0Y2gobVByaW1pdGl2ZXNbaV0tPm1QcmltaXRpdmUpIHsKKyAgICAgICAgICAgIGNhc2UgUlNfUFJJTUlUSVZFX1BPSU5UOiAgICAgICAgICBtUHJpbWl0aXZlc1tpXS0+bUdMUHJpbWl0aXZlID0gR0xfUE9JTlRTOyBicmVhazsKKyAgICAgICAgICAgIGNhc2UgUlNfUFJJTUlUSVZFX0xJTkU6ICAgICAgICAgICBtUHJpbWl0aXZlc1tpXS0+bUdMUHJpbWl0aXZlID0gR0xfTElORVM7IGJyZWFrOworICAgICAgICAgICAgY2FzZSBSU19QUklNSVRJVkVfTElORV9TVFJJUDogICAgIG1QcmltaXRpdmVzW2ldLT5tR0xQcmltaXRpdmUgPSBHTF9MSU5FX1NUUklQOyBicmVhazsKKyAgICAgICAgICAgIGNhc2UgUlNfUFJJTUlUSVZFX1RSSUFOR0xFOiAgICAgICBtUHJpbWl0aXZlc1tpXS0+bUdMUHJpbWl0aXZlID0gR0xfVFJJQU5HTEVTOyBicmVhazsKKyAgICAgICAgICAgIGNhc2UgUlNfUFJJTUlUSVZFX1RSSUFOR0xFX1NUUklQOiBtUHJpbWl0aXZlc1tpXS0+bUdMUHJpbWl0aXZlID0gR0xfVFJJQU5HTEVfU1RSSVA7IGJyZWFrOworICAgICAgICAgICAgY2FzZSBSU19QUklNSVRJVkVfVFJJQU5HTEVfRkFOOiAgIG1QcmltaXRpdmVzW2ldLT5tR0xQcmltaXRpdmUgPSBHTF9UUklBTkdMRV9GQU47IGJyZWFrOworICAgICAgICB9CisgICAgfQorfQorCit2b2lkIE1lc2g6OnNlcmlhbGl6ZShPU3RyZWFtICpzdHJlYW0pIGNvbnN0Cit7CisgICAgLy8gTmVlZCB0byBpZGVudGlmeSBvdXJzZWx2ZXMKKyAgICBzdHJlYW0tPmFkZFUzMigodWludDMyX3QpZ2V0Q2xhc3NJZCgpKTsKKworICAgIFN0cmluZzggbmFtZShnZXROYW1lKCkpOworICAgIHN0cmVhbS0+YWRkU3RyaW5nKCZuYW1lKTsKKworICAgIC8vIFN0b3JlIG51bWJlciBvZiB2ZXJ0ZXggc3RyZWFtcworICAgIHN0cmVhbS0+YWRkVTMyKG1WZXJ0ZXhCdWZmZXJDb3VudCk7CisgICAgZm9yKHVpbnQzMl90IHZDb3VudCA9IDA7IHZDb3VudCA8IG1WZXJ0ZXhCdWZmZXJDb3VudDsgdkNvdW50ICsrKSB7CisgICAgICAgIG1WZXJ0ZXhCdWZmZXJzW3ZDb3VudF0tPnNlcmlhbGl6ZShzdHJlYW0pOworICAgIH0KKworICAgIHN0cmVhbS0+YWRkVTMyKG1QcmltaXRpdmVzQ291bnQpOworICAgIC8vIFN0b3JlIHRoZSBwcmltaXRpdmVzCisgICAgZm9yICh1aW50MzJfdCBwQ291bnQgPSAwOyBwQ291bnQgPCBtUHJpbWl0aXZlc0NvdW50OyBwQ291bnQgKyspIHsKKyAgICAgICAgUHJpbWl0aXZlX3QgKiBwcmltID0gbVByaW1pdGl2ZXNbcENvdW50XTsKKworICAgICAgICBzdHJlYW0tPmFkZFU4KCh1aW50OF90KXByaW0tPm1QcmltaXRpdmUpOworCisgICAgICAgIGlmKHByaW0tPm1JbmRleEJ1ZmZlci5nZXQoKSkgeworICAgICAgICAgICAgc3RyZWFtLT5hZGRVMzIoMSk7CisgICAgICAgICAgICBwcmltLT5tSW5kZXhCdWZmZXItPnNlcmlhbGl6ZShzdHJlYW0pOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgc3RyZWFtLT5hZGRVMzIoMCk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK01lc2ggKk1lc2g6OmNyZWF0ZUZyb21TdHJlYW0oQ29udGV4dCAqcnNjLCBJU3RyZWFtICpzdHJlYW0pCit7CisgICAgLy8gRmlyc3QgbWFrZSBzdXJlIHdlIGFyZSByZWFkaW5nIHRoZSBjb3JyZWN0IG9iamVjdAorICAgIFJzQTNEQ2xhc3NJRCBjbGFzc0lEID0gKFJzQTNEQ2xhc3NJRClzdHJlYW0tPmxvYWRVMzIoKTsKKyAgICBpZihjbGFzc0lEICE9IFJTX0EzRF9DTEFTU19JRF9NRVNIKSB7CisgICAgICAgIExPR0UoIm1lc2ggbG9hZGluZyBza2lwcGVkIGR1ZSB0byBpbnZhbGlkIGNsYXNzIGlkIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIE1lc2ggKiBtZXNoID0gbmV3IE1lc2gocnNjKTsKKworICAgIFN0cmluZzggbmFtZTsKKyAgICBzdHJlYW0tPmxvYWRTdHJpbmcoJm5hbWUpOworICAgIG1lc2gtPnNldE5hbWUobmFtZS5zdHJpbmcoKSwgbmFtZS5zaXplKCkpOworCisgICAgbWVzaC0+bVZlcnRleEJ1ZmZlckNvdW50ID0gc3RyZWFtLT5sb2FkVTMyKCk7CisgICAgaWYobWVzaC0+bVZlcnRleEJ1ZmZlckNvdW50KSB7CisgICAgICAgIG1lc2gtPm1WZXJ0ZXhCdWZmZXJzID0gbmV3IE9iamVjdEJhc2VSZWY8QWxsb2NhdGlvbj5bbWVzaC0+bVZlcnRleEJ1ZmZlckNvdW50XTsKKworICAgICAgICBmb3IodWludDMyX3QgdkNvdW50ID0gMDsgdkNvdW50IDwgbWVzaC0+bVZlcnRleEJ1ZmZlckNvdW50OyB2Q291bnQgKyspIHsKKyAgICAgICAgICAgIEFsbG9jYXRpb24gKnZlcnRleEFsbG9jID0gQWxsb2NhdGlvbjo6Y3JlYXRlRnJvbVN0cmVhbShyc2MsIHN0cmVhbSk7CisgICAgICAgICAgICBtZXNoLT5tVmVydGV4QnVmZmVyc1t2Q291bnRdLnNldCh2ZXJ0ZXhBbGxvYyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBtZXNoLT5tUHJpbWl0aXZlc0NvdW50ID0gc3RyZWFtLT5sb2FkVTMyKCk7CisgICAgaWYobWVzaC0+bVByaW1pdGl2ZXNDb3VudCkgeworICAgICAgICBtZXNoLT5tUHJpbWl0aXZlcyA9IG5ldyBQcmltaXRpdmVfdCAqW21lc2gtPm1QcmltaXRpdmVzQ291bnRdOworCisgICAgICAgIC8vIGxvYWQgYWxsIHByaW1pdGl2ZXMKKyAgICAgICAgZm9yICh1aW50MzJfdCBwQ291bnQgPSAwOyBwQ291bnQgPCBtZXNoLT5tUHJpbWl0aXZlc0NvdW50OyBwQ291bnQgKyspIHsKKyAgICAgICAgICAgIFByaW1pdGl2ZV90ICogcHJpbSA9IG5ldyBQcmltaXRpdmVfdDsKKyAgICAgICAgICAgIG1lc2gtPm1QcmltaXRpdmVzW3BDb3VudF0gPSBwcmltOworCisgICAgICAgICAgICBwcmltLT5tUHJpbWl0aXZlID0gKFJzUHJpbWl0aXZlKXN0cmVhbS0+bG9hZFU4KCk7CisKKyAgICAgICAgICAgIC8vIENoZWNrIHRvIHNlZSBpZiB0aGUgaW5kZXggYnVmZmVyIHdhcyBzdG9yZWQKKyAgICAgICAgICAgIHVpbnQzMl90IGlzSW5kZXhQcmVzZW50ID0gc3RyZWFtLT5sb2FkVTMyKCk7CisgICAgICAgICAgICBpZihpc0luZGV4UHJlc2VudCkgeworICAgICAgICAgICAgICAgIEFsbG9jYXRpb24gKmluZGV4QWxsb2MgPSBBbGxvY2F0aW9uOjpjcmVhdGVGcm9tU3RyZWFtKHJzYywgc3RyZWFtKTsKKyAgICAgICAgICAgICAgICBwcmltLT5tSW5kZXhCdWZmZXIuc2V0KGluZGV4QWxsb2MpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgbWVzaC0+dXBkYXRlR0xQcmltaXRpdmVzKCk7CisgICAgbWVzaC0+dXBsb2FkQWxsKHJzYyk7CisKKyAgICByZXR1cm4gbWVzaDsKK30KKwordm9pZCBNZXNoOjpjb21wdXRlQkJveCgpIHsKKyAgICBmbG9hdCAqcG9zUHRyID0gTlVMTDsKKyAgICB1aW50MzJfdCB2ZWN0b3JTaXplID0gMDsKKyAgICB1aW50MzJfdCBzdHJpZGUgPSAwOworICAgIHVpbnQzMl90IG51bVZlcnRzID0gMDsKKyAgICAvLyBGaXJzdCB3ZSBuZWVkIHRvIGZpbmQgdGhlIHBvc2l0aW9uIHB0ciBhbmQgc3RyaWRlCisgICAgZm9yICh1aW50MzJfdCBjdD0wOyBjdCA8IG1WZXJ0ZXhCdWZmZXJDb3VudDsgY3QrKykgeworICAgICAgICBjb25zdCBUeXBlICpidWZmZXJUeXBlID0gbVZlcnRleEJ1ZmZlcnNbY3RdLT5nZXRUeXBlKCk7CisgICAgICAgIGNvbnN0IEVsZW1lbnQgKmJ1ZmZlckVsZW0gPSBidWZmZXJUeXBlLT5nZXRFbGVtZW50KCk7CisKKyAgICAgICAgZm9yICh1aW50MzJfdCBjdD0wOyBjdCA8IGJ1ZmZlckVsZW0tPmdldEZpZWxkQ291bnQoKTsgY3QrKykgeworICAgICAgICAgICAgaWYoc3RyY21wKGJ1ZmZlckVsZW0tPmdldEZpZWxkTmFtZShjdCksICJwb3NpdGlvbiIpID09IDApIHsKKyAgICAgICAgICAgICAgICB2ZWN0b3JTaXplID0gYnVmZmVyRWxlbS0+Z2V0RmllbGQoY3QpLT5nZXRDb21wb25lbnQoKS5nZXRWZWN0b3JTaXplKCk7CisgICAgICAgICAgICAgICAgc3RyaWRlID0gYnVmZmVyRWxlbS0+Z2V0U2l6ZUJ5dGVzKCkgLyBzaXplb2YoZmxvYXQpOworICAgICAgICAgICAgICAgIHVpbnQzMl90IG9mZnNldCA9IGJ1ZmZlckVsZW0tPmdldEZpZWxkT2Zmc2V0Qnl0ZXMoY3QpOworICAgICAgICAgICAgICAgIHBvc1B0ciA9IChmbG9hdCopKCh1aW50OF90KiltVmVydGV4QnVmZmVyc1tjdF0tPmdldFB0cigpICsgb2Zmc2V0KTsKKyAgICAgICAgICAgICAgICBudW1WZXJ0cyA9IGJ1ZmZlclR5cGUtPmdldERpbVgoKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZihwb3NQdHIpIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgbUJCb3hNaW5bMF0gPSBtQkJveE1pblsxXSA9IG1CQm94TWluWzJdID0gMWU2OworICAgIG1CQm94TWF4WzBdID0gbUJCb3hNYXhbMV0gPSBtQkJveE1heFsyXSA9IC0xZTY7CisgICAgaWYoIXBvc1B0cikgeworICAgICAgICBMT0dFKCJVbmFibGUgdG8gY29tcHV0ZSBib3VuZGluZyBib3giKTsKKyAgICAgICAgbUJCb3hNaW5bMF0gPSBtQkJveE1pblsxXSA9IG1CQm94TWluWzJdID0gMC4wZjsKKyAgICAgICAgbUJCb3hNYXhbMF0gPSBtQkJveE1heFsxXSA9IG1CQm94TWF4WzJdID0gMC4wZjsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGZvcih1aW50MzJfdCBpID0gMDsgaSA8IG51bVZlcnRzOyBpICsrKSB7CisgICAgICAgIGZvcih1aW50MzJfdCB2ID0gMDsgdiA8IHZlY3RvclNpemU7IHYgKyspIHsKKyAgICAgICAgICAgIG1CQm94TWluW3ZdID0gcnNNaW4obUJCb3hNaW5bdl0sIHBvc1B0clt2XSk7CisgICAgICAgICAgICBtQkJveE1heFt2XSA9IHJzTWF4KG1CQm94TWF4W3ZdLCBwb3NQdHJbdl0pOworICAgICAgICB9CisgICAgICAgIHBvc1B0ciArPSBzdHJpZGU7CisgICAgfQorfQogCiAKIE1lc2hDb250ZXh0OjpNZXNoQ29udGV4dCgpCkBAIC00NiwzICsyNzYsODMgQEAKIHsKIH0KIAorbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIHJlbmRlcnNjcmlwdCB7CisKK1JzTWVzaCByc2lfTWVzaENyZWF0ZShDb250ZXh0ICpyc2MsIHVpbnQzMl90IHZ0eENvdW50LCB1aW50MzJfdCBpZHhDb3VudCkKK3sKKyAgICBNZXNoICpzbSA9IG5ldyBNZXNoKHJzYyk7CisgICAgc20tPmluY1VzZXJSZWYoKTsKKworICAgIHNtLT5tUHJpbWl0aXZlc0NvdW50ID0gaWR4Q291bnQ7CisgICAgc20tPm1QcmltaXRpdmVzID0gbmV3IE1lc2g6OlByaW1pdGl2ZV90ICpbc20tPm1QcmltaXRpdmVzQ291bnRdOworICAgIGZvcih1aW50MzJfdCBjdCA9IDA7IGN0IDwgaWR4Q291bnQ7IGN0ICsrKSB7CisgICAgICAgIHNtLT5tUHJpbWl0aXZlc1tjdF0gPSBuZXcgTWVzaDo6UHJpbWl0aXZlX3Q7CisgICAgfQorCisgICAgc20tPm1WZXJ0ZXhCdWZmZXJDb3VudCA9IHZ0eENvdW50OworICAgIHNtLT5tVmVydGV4QnVmZmVycyA9IG5ldyBPYmplY3RCYXNlUmVmPEFsbG9jYXRpb24+W3Z0eENvdW50XTsKKworICAgIHJldHVybiBzbTsKK30KKwordm9pZCByc2lfTWVzaEJpbmRWZXJ0ZXgoQ29udGV4dCAqcnNjLCBSc01lc2ggbXYsIFJzQWxsb2NhdGlvbiB2YSwgdWludDMyX3Qgc2xvdCkKK3sKKyAgICBNZXNoICpzbSA9IHN0YXRpY19jYXN0PE1lc2ggKj4obXYpOworICAgIHJzQXNzZXJ0KHNsb3QgPCBzbS0+bVZlcnRleEJ1ZmZlckNvdW50KTsKKworICAgIHNtLT5tVmVydGV4QnVmZmVyc1tzbG90XS5zZXQoKEFsbG9jYXRpb24gKil2YSk7Cit9CisKK3ZvaWQgcnNpX01lc2hCaW5kSW5kZXgoQ29udGV4dCAqcnNjLCBSc01lc2ggbXYsIFJzQWxsb2NhdGlvbiB2YSwgdWludDMyX3QgcHJpbVR5cGUsIHVpbnQzMl90IHNsb3QpCit7CisgICAgTWVzaCAqc20gPSBzdGF0aWNfY2FzdDxNZXNoICo+KG12KTsKKyAgICByc0Fzc2VydChzbG90IDwgc20tPm1QcmltaXRpdmVzQ291bnQpOworCisgICAgc20tPm1QcmltaXRpdmVzW3Nsb3RdLT5tSW5kZXhCdWZmZXIuc2V0KChBbGxvY2F0aW9uICopdmEpOworICAgIHNtLT5tUHJpbWl0aXZlc1tzbG90XS0+bVByaW1pdGl2ZSA9IChSc1ByaW1pdGl2ZSlwcmltVHlwZTsKKyAgICBzbS0+dXBkYXRlR0xQcmltaXRpdmVzKCk7Cit9CisKK3ZvaWQgcnNpX01lc2hHZXRWZXJ0ZXhCdWZmZXJDb3VudChDb250ZXh0ICpyc2MsIFJzTWVzaCBtdiwgaW50MzJfdCAqbnVtVnR4KQoreworICAgIE1lc2ggKnNtID0gc3RhdGljX2Nhc3Q8TWVzaCAqPihtdik7CisgICAgKm51bVZ0eCA9IHNtLT5tVmVydGV4QnVmZmVyQ291bnQ7Cit9CisKK3ZvaWQgcnNpX01lc2hHZXRJbmRleENvdW50KENvbnRleHQgKnJzYywgUnNNZXNoIG12LCBpbnQzMl90ICpudW1JZHgpCit7CisgICAgTWVzaCAqc20gPSBzdGF0aWNfY2FzdDxNZXNoICo+KG12KTsKKyAgICAqbnVtSWR4ID0gc20tPm1QcmltaXRpdmVzQ291bnQ7Cit9CisKK3ZvaWQgcnNpX01lc2hHZXRWZXJ0aWNlcyhDb250ZXh0ICpyc2MsIFJzTWVzaCBtdiwgUnNBbGxvY2F0aW9uICp2dHhEYXRhLCB1aW50MzJfdCB2dHhEYXRhQ291bnQpCit7CisgICAgTWVzaCAqc20gPSBzdGF0aWNfY2FzdDxNZXNoICo+KG12KTsKKyAgICByc0Fzc2VydCh2dHhEYXRhQ291bnQgPT0gc20tPm1WZXJ0ZXhCdWZmZXJDb3VudCk7CisKKyAgICBmb3IodWludDMyX3QgY3QgPSAwOyBjdCA8IHZ0eERhdGFDb3VudDsgY3QgKyspIHsKKyAgICAgICAgdnR4RGF0YVtjdF0gPSBzbS0+bVZlcnRleEJ1ZmZlcnNbY3RdLmdldCgpOworICAgICAgICBzbS0+bVZlcnRleEJ1ZmZlcnNbY3RdLT5pbmNVc2VyUmVmKCk7CisgICAgfQorfQorCit2b2lkIHJzaV9NZXNoR2V0SW5kaWNlcyhDb250ZXh0ICpyc2MsIFJzTWVzaCBtdiwgUnNBbGxvY2F0aW9uICp2YSwgdWludDMyX3QgKnByaW1UeXBlLCB1aW50MzJfdCBpZHhEYXRhQ291bnQpCit7CisgICAgTWVzaCAqc20gPSBzdGF0aWNfY2FzdDxNZXNoICo+KG12KTsKKyAgICByc0Fzc2VydChpZHhEYXRhQ291bnQgPT0gc20tPm1QcmltaXRpdmVzQ291bnQpOworCisgICAgZm9yKHVpbnQzMl90IGN0ID0gMDsgY3QgPCBpZHhEYXRhQ291bnQ7IGN0ICsrKSB7CisgICAgICAgIHZhW2N0XSA9IHNtLT5tUHJpbWl0aXZlc1tjdF0tPm1JbmRleEJ1ZmZlci5nZXQoKTsKKyAgICAgICAgcHJpbVR5cGVbY3RdID0gc20tPm1QcmltaXRpdmVzW2N0XS0+bVByaW1pdGl2ZTsKKyAgICAgICAgaWYoc20tPm1QcmltaXRpdmVzW2N0XS0+bUluZGV4QnVmZmVyLmdldCgpKSB7CisgICAgICAgICAgICBzbS0+bVByaW1pdGl2ZXNbY3RdLT5tSW5kZXhCdWZmZXItPmluY1VzZXJSZWYoKTsKKyAgICAgICAgfQorICAgIH0KKworfQorCisKKworCit9fQpkaWZmIC0tZ2l0IGEvbGlicy9ycy9yc01lc2guaCBiL2xpYnMvcnMvcnNNZXNoLmgKaW5kZXggNTIwMWFiZC4uZWQwMWMzOCAxMDA2NDQKLS0tIGEvbGlicy9ycy9yc01lc2guaAorKysgYi9saWJzL3JzL3JzTWVzaC5oCkBAIC0zMiw0NSArMzIsNDAgQEAKICAgICBNZXNoKENvbnRleHQgKik7CiAgICAgfk1lc2goKTsKIAotICAgIHN0cnVjdCBWZXJ0aWNpZXNfdAotICAgIHsKLSAgICAgICAgQWxsb2NhdGlvbiAqKiBtQWxsb2NhdGlvbnM7Ci0gICAgICAgIHVpbnQzMl90IG1BbGxvY2F0aW9uQ291bnQ7CisgICAgLy8gQ29udGFpbnMgdmVydGV4IGRhdGEKKyAgICAvLyBQb3NpdGlvbiwgbm9ybWFsLCB0ZXhjb29yZCwgZXRjIGNvdWxkIGVpdGhlciBiZSBzdHJpZGVkIGluIG9uZSBhbGxvY2F0aW9uCisgICAgLy8gb2YgcHJvdmlkZWQgc2VwYXJldGVseSBpbiBtdWx0aXBsZSBvbmVzCisgICAgT2JqZWN0QmFzZVJlZjxBbGxvY2F0aW9uPiAqbVZlcnRleEJ1ZmZlcnM7CisgICAgdWludDMyX3QgbVZlcnRleEJ1ZmZlckNvdW50OwogCi0gICAgICAgIHNpemVfdCBtVmVydGV4RGF0YVNpemU7Ci0KLSAgICAgICAgc2l6ZV90IG1PZmZzZXRDb29yZDsKLSAgICAgICAgc2l6ZV90IG1PZmZzZXRUZXg7Ci0gICAgICAgIHNpemVfdCBtT2Zmc2V0Tm9ybTsKLQotICAgICAgICBzaXplX3QgbVNpemVDb29yZDsKLSAgICAgICAgc2l6ZV90IG1TaXplVGV4OwotICAgICAgICBzaXplX3QgbVNpemVOb3JtOwotCi0gICAgICAgIHVpbnQzMl90IG1CdWZmZXJPYmplY3Q7Ci0gICAgfTsKLQorICAgIC8vIEVpdGhlciBtSW5kZXhCdWZmZXIsIG1QcmltaXRpdmVCdWZmZXIgb3IgYm90aCBjb3VsZCBoYXZlIGEgTlVMTCByZWZlcmVuY2UKKyAgICAvLyBJZiBib3RoIGFyZSBudWxsLCBtUHJpbWl0aXZlIG9ubHkgd291bGQgYmUgdXNlZCB0byByZW5kZXIgdGhlIG1lc2gKICAgICBzdHJ1Y3QgUHJpbWl0aXZlX3QKICAgICB7Ci0gICAgICAgIFJzUHJpbWl0aXZlIG1UeXBlOwotICAgICAgICBWZXJ0aWNpZXNfdCAqbVZlcnRpY2llczsKKyAgICAgICAgT2JqZWN0QmFzZVJlZjxBbGxvY2F0aW9uPiBtSW5kZXhCdWZmZXI7CiAKLSAgICAgICAgdWludDMyX3QgbUluZGV4Q291bnQ7Ci0gICAgICAgIHVpbnQxNl90ICptSW5kaWNpZXM7Ci0KLSAgICAgICAgdWludDMyX3QgbVJlc3RhcnRDb3VudHM7Ci0gICAgICAgIHVpbnQxNl90ICptUmVzdGFydHM7CisgICAgICAgIFJzUHJpbWl0aXZlIG1QcmltaXRpdmU7CisgICAgICAgIHVpbnQzMl90IG1HTFByaW1pdGl2ZTsKICAgICB9OwogCi0gICAgVmVydGljaWVzX3QgKiBtVmVydGljaWVzOwotICAgIHVpbnQzMl90IG1WZXJ0aWNpZXNDb3VudDsKLQogICAgIFByaW1pdGl2ZV90ICoqIG1QcmltaXRpdmVzOwogICAgIHVpbnQzMl90IG1QcmltaXRpdmVzQ291bnQ7CiAKKyAgICB2b2lkIHJlbmRlcihDb250ZXh0ICopIGNvbnN0OworICAgIHZvaWQgcmVuZGVyUHJpbWl0aXZlKENvbnRleHQgKiwgdWludDMyX3QgcHJpbUluZGV4KSBjb25zdDsKKyAgICB2b2lkIHJlbmRlclByaW1pdGl2ZVJhbmdlKENvbnRleHQgKiwgdWludDMyX3QgcHJpbUluZGV4LCB1aW50MzJfdCBzdGFydCwgdWludDMyX3QgbGVuKSBjb25zdDsKKyAgICB2b2lkIHVwbG9hZEFsbChDb250ZXh0ICopOworICAgIHZvaWQgdXBkYXRlR0xQcmltaXRpdmVzKCk7CiAKKyAgICB2aXJ0dWFsIHZvaWQgc2VyaWFsaXplKE9TdHJlYW0gKnN0cmVhbSkgY29uc3Q7CisgICAgdmlydHVhbCBSc0EzRENsYXNzSUQgZ2V0Q2xhc3NJZCgpIGNvbnN0IHsgcmV0dXJuIFJTX0EzRF9DTEFTU19JRF9NRVNIOyB9CisgICAgc3RhdGljIE1lc2ggKmNyZWF0ZUZyb21TdHJlYW0oQ29udGV4dCAqcnNjLCBJU3RyZWFtICpzdHJlYW0pOwogCi0gICAgdm9pZCBhbmFseXplRWxlbWVudCgpOworICAgIC8vIEJvdW5kaW5nIHZvbHVtZXMKKyAgICBmbG9hdCBtQkJveE1pblszXTsKKyAgICBmbG9hdCBtQkJveE1heFszXTsKKyAgICB2b2lkIGNvbXB1dGVCQm94KCk7CisKIHByb3RlY3RlZDoKIH07CiAKQEAgLTg4LDMgKzgzLDQgQEAKICNlbmRpZiAvL0FORFJPSURfUlNfVFJJQU5HTEVfTUVTSF9ICiAKIAorCmRpZmYgLS1naXQgYS9saWJzL3JzL3JzTXV0ZXguY3BwIGIvbGlicy9ycy9yc011dGV4LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNzc1MmYyCi0tLSAvZGV2L251bGwKKysrIGIvbGlicy9ycy9yc011dGV4LmNwcApAQCAtMCwwICsxLDY0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgInJzTXV0ZXguaCIKKwordXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7Cit1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDo6cmVuZGVyc2NyaXB0OworCisKK011dGV4OjpNdXRleCgpCit7Cit9CisKK011dGV4Ojp+TXV0ZXgoKQoreworICAgIHB0aHJlYWRfbXV0ZXhfZGVzdHJveSgmbU11dGV4KTsKK30KKworYm9vbCBNdXRleDo6aW5pdCgpCit7CisgICAgaW50IHN0YXR1cyA9IHB0aHJlYWRfbXV0ZXhfaW5pdCgmbU11dGV4LCBOVUxMKTsKKyAgICBpZiAoc3RhdHVzKSB7CisgICAgICAgIExPR0UoIk11dGV4OjpNdXRleCBpbml0IGZhaWx1cmUiKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBNdXRleDo6bG9jaygpCit7CisgICAgaW50IHN0YXR1czsKKyAgICBzdGF0dXMgPSBwdGhyZWFkX211dGV4X2xvY2soJm1NdXRleCk7CisgICAgaWYgKHN0YXR1cykgeworICAgICAgICBMT0dFKCJNdXRleDogZXJyb3IgJWkgbG9ja2luZy4iLCBzdGF0dXMpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCitib29sIE11dGV4Ojp1bmxvY2soKQoreworICAgIGludCBzdGF0dXM7CisgICAgc3RhdHVzID0gcHRocmVhZF9tdXRleF91bmxvY2soJm1NdXRleCk7CisgICAgaWYgKHN0YXR1cykgeworICAgICAgICBMT0dFKCJNdXRleCBlcnJvciAlaSB1bmxvY2tpbmcuIiwgc3RhdHVzKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKK30KKworCmRpZmYgLS1naXQgYS9saWJzL3JzL3JzTXV0ZXguaCBiL2xpYnMvcnMvcnNNdXRleC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ3NzI1ZDcKLS0tIC9kZXYvbnVsbAorKysgYi9saWJzL3JzL3JzTXV0ZXguaApAQCAtMCwwICsxLDQzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX1JTX01VVEVYX0gKKyNkZWZpbmUgQU5EUk9JRF9SU19NVVRFWF9ICisKKworI2luY2x1ZGUgInJzVXRpbHMuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIHJlbmRlcnNjcmlwdCB7CisKK2NsYXNzIE11dGV4IHsKK3B1YmxpYzoKKyAgICBNdXRleCgpOworICAgIH5NdXRleCgpOworCisgICAgYm9vbCBpbml0KCk7CisgICAgYm9vbCBsb2NrKCk7CisgICAgYm9vbCB1bmxvY2soKTsKKworcHJvdGVjdGVkOgorICAgIHB0aHJlYWRfbXV0ZXhfdCBtTXV0ZXg7Cit9OworCit9Cit9CisKKyNlbmRpZgorCmRpZmYgLS1naXQgYS9saWJzL3JzL3JzTm9pc2UuY3BwIGIvbGlicy9ycy9yc05vaXNlLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGI2NzU4Ni4uMDAwMDAwMAotLS0gYS9saWJzL3JzL3JzTm9pc2UuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMjU2ICswLDAgQEAKLS8qCi0gKiBUaGlzIGltcGxlbWVudGF0aW9uIG9mIHRoZSBub2lzZSBmdW5jdGlvbnMgd2FzIHBvcnRlZCBmcm9tIHRoZSBKYXZhCi0gKiBpbXBsZW1lbnRhdGlvbiBieSBKZXJyeSBIdXh0YWJsZSAoaHR0cDovL3d3dy5qaGxhYnMuY29tKSB1bmRlcgotICogQXBhY2hlIExpY2Vuc2UgMi4wIChzZWUgaHR0cDovL2pobGFicy5jb20vaXAvZmlsdGVycy9kb3dubG9hZC5odG1sKQotICoKLSAqIE9yaWdpbmFsIGhlYWRlcjoKLSAqCi0gKiBDb3B5cmlnaHQgMjAwNiBKZXJyeSBIdXh0YWJsZQotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSAicnNOb2lzZS5oIgotCi0jaW5jbHVkZSA8bWF0aC5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHRpbWUuaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotbmFtZXNwYWNlIHJlbmRlcnNjcmlwdCB7Ci0KLSNkZWZpbmUgQiAweDEwMAotI2RlZmluZSBCTSAweGZmCi0jZGVmaW5lIE4gMHgxMDAwCi0KLXN0YXRpYyBpbnQgcFtCICsgQiArIDJdOwotc3RhdGljIGZsb2F0IGczW0IgKyBCICsgMl1bM107Ci1zdGF0aWMgZmxvYXQgZzJbQiArIEIgKyAyXVsyXTsKLXN0YXRpYyBmbG9hdCBnMVtCICsgQiArIDJdOwotc3RhdGljIGJvb2wgbm9pc2Vfc3RhcnQgPSB0cnVlOwotCi0jZGVmaW5lIGxlcnBmKHN0YXJ0LCBzdG9wLCBhbW91bnQpIHN0YXJ0ICsgKHN0b3AgLSBzdGFydCkgKiBhbW91bnQKLQotc3RhdGljIGlubGluZSBmbG9hdCBub2lzZV9zQ3VydmUoZmxvYXQgdCkKLXsKLSAgICByZXR1cm4gdCAqIHQgKiAoMy4wZiAtIDIuMGYgKiB0KTsKLX0KLQotaW5saW5lIHZvaWQgU0Nfbm9ybWFsaXplZjIoZmxvYXQgdltdKQotewotICAgIGZsb2F0IHMgPSAoZmxvYXQpc3FydGYodlswXSAqIHZbMF0gKyB2WzFdICogdlsxXSk7Ci0gICAgdlswXSA9IHZbMF0gLyBzOwotICAgIHZbMV0gPSB2WzFdIC8gczsKLX0KLQotaW5saW5lIHZvaWQgU0Nfbm9ybWFsaXplZjMoZmxvYXQgdltdKQotewotICAgIGZsb2F0IHMgPSAoZmxvYXQpc3FydGYodlswXSAqIHZbMF0gKyB2WzFdICogdlsxXSArIHZbMl0gKiB2WzJdKTsKLSAgICB2WzBdID0gdlswXSAvIHM7Ci0gICAgdlsxXSA9IHZbMV0gLyBzOwotICAgIHZbMl0gPSB2WzJdIC8gczsKLX0KLQotc3RhdGljIHZvaWQgbm9pc2VfaW5pdCgpCi17Ci0gICAgaW50IGksIGosIGs7Ci0gICAgCi0gICAgZm9yIChpID0gMDsgaSA8IEI7IGkrKykgewotICAgICAgICBwW2ldID0gaTsKLSAgICAgICAgCi0gICAgICAgIGcxW2ldID0gKGZsb2F0KSgocmFuZCgpICUgKEIgKyBCKSkgLSBCKSAvIEI7Ci0gICAgICAgIAotICAgICAgICBmb3IgKGogPSAwOyBqIDwgMjsgaisrKQotICAgICAgICAgICAgZzJbaV1bal0gPSAoZmxvYXQpKChyYW5kKCkgJSAoQiArIEIpKSAtIEIpIC8gQjsKLSAgICAgICAgU0Nfbm9ybWFsaXplZjIoZzJbaV0pOwotICAgICAgICAKLSAgICAgICAgZm9yIChqID0gMDsgaiA8IDM7IGorKykKLSAgICAgICAgICAgIGczW2ldW2pdID0gKGZsb2F0KSgocmFuZCgpICUgKEIgKyBCKSkgLSBCKSAvIEI7Ci0gICAgICAgIFNDX25vcm1hbGl6ZWYzKGczW2ldKTsKLSAgICB9Ci0gICAgCi0gICAgZm9yIChpID0gQi0xOyBpID49IDA7IGktLSkgewotICAgICAgICBrID0gcFtpXTsKLSAgICAgICAgcFtpXSA9IHBbaiA9IHJhbmQoKSAlIEJdOwotICAgICAgICBwW2pdID0gazsKLSAgICB9Ci0gICAgCi0gICAgZm9yIChpID0gMDsgaSA8IEIgKyAyOyBpKyspIHsKLSAgICAgICAgcFtCICsgaV0gPSBwW2ldOwotICAgICAgICBnMVtCICsgaV0gPSBnMVtpXTsKLSAgICAgICAgZm9yIChqID0gMDsgaiA8IDI7IGorKykKLSAgICAgICAgICAgIGcyW0IgKyBpXVtqXSA9IGcyW2ldW2pdOwotICAgICAgICBmb3IgKGogPSAwOyBqIDwgMzsgaisrKQotICAgICAgICAgICAgZzNbQiArIGldW2pdID0gZzNbaV1bal07Ci0gICAgfQotfQotCi1mbG9hdCBTQ19ub2lzZWYoZmxvYXQgeCkKLXsKLSAgICBzcmFuZCh0aW1lKE5VTEwpKTsKLSAgICBpbnQgYngwLCBieDE7Ci0gICAgZmxvYXQgcngwLCByeDEsIHN4LCB0LCB1LCB2OwotICAgIAotICAgIGlmIChub2lzZV9zdGFydCkgewotICAgICAgICBub2lzZV9zdGFydCA9IGZhbHNlOwotICAgICAgICBub2lzZV9pbml0KCk7Ci0gICAgfQotICAgIAotICAgIHQgPSB4ICsgTjsKLSAgICBieDAgPSAoKGludCl0KSAmIEJNOwotICAgIGJ4MSA9IChieDArMSkgJiBCTTsKLSAgICByeDAgPSB0IC0gKGludCl0OwotICAgIHJ4MSA9IHJ4MCAtIDEuMGY7Ci0gICAgCi0gICAgc3ggPSBub2lzZV9zQ3VydmUocngwKTsKLSAgICAKLSAgICB1ID0gcngwICogZzFbcFtieDBdXTsKLSAgICB2ID0gcngxICogZzFbcFtieDFdXTsKLSAgICByZXR1cm4gMi4zZiAqIGxlcnBmKHUsIHYsIHN4KTsKLX0KLQotZmxvYXQgU0Nfbm9pc2VmMihmbG9hdCB4LCBmbG9hdCB5KQotewotICAgIHNyYW5kKHRpbWUoTlVMTCkpOwotICAgIGludCBieDAsIGJ4MSwgYnkwLCBieTEsIGIwMCwgYjEwLCBiMDEsIGIxMTsKLSAgICBmbG9hdCByeDAsIHJ4MSwgcnkwLCByeTEsIHN4LCBzeSwgYSwgYiwgdCwgdSwgdjsKLSAgICBmbG9hdCAqcTsKLSAgICBpbnQgaSwgajsKLSAgICAKLSAgICBpZiAobm9pc2Vfc3RhcnQpIHsKLSAgICAgICAgbm9pc2Vfc3RhcnQgPSBmYWxzZTsKLSAgICAgICAgbm9pc2VfaW5pdCgpOwotICAgIH0KLSAgICAKLSAgICB0ID0geCArIE47Ci0gICAgYngwID0gKChpbnQpdCkgJiBCTTsKLSAgICBieDEgPSAoYngwKzEpICYgQk07Ci0gICAgcngwID0gdCAtIChpbnQpdDsKLSAgICByeDEgPSByeDAgLSAxLjBmOwotCQotICAgIHQgPSB5ICsgTjsKLSAgICBieTAgPSAoKGludCl0KSAmIEJNOwotICAgIGJ5MSA9IChieTArMSkgJiBCTTsKLSAgICByeTAgPSB0IC0gKGludCl0OwotICAgIHJ5MSA9IHJ5MCAtIDEuMGY7Ci0JCi0gICAgaSA9IHBbYngwXTsKLSAgICBqID0gcFtieDFdOwotICAgIAotICAgIGIwMCA9IHBbaSArIGJ5MF07Ci0gICAgYjEwID0gcFtqICsgYnkwXTsKLSAgICBiMDEgPSBwW2kgKyBieTFdOwotICAgIGIxMSA9IHBbaiArIGJ5MV07Ci0gICAgCi0gICAgc3ggPSBub2lzZV9zQ3VydmUocngwKTsKLSAgICBzeSA9IG5vaXNlX3NDdXJ2ZShyeTApOwotICAgIAotICAgIHEgPSBnMltiMDBdOyB1ID0gcngwICogcVswXSArIHJ5MCAqIHFbMV07Ci0gICAgcSA9IGcyW2IxMF07IHYgPSByeDEgKiBxWzBdICsgcnkwICogcVsxXTsKLSAgICBhID0gbGVycGYodSwgdiwgc3gpOwotICAgIAotICAgIHEgPSBnMltiMDFdOyB1ID0gcngwICogcVswXSArIHJ5MSAqIHFbMV07Ci0gICAgcSA9IGcyW2IxMV07IHYgPSByeDEgKiBxWzBdICsgcnkxICogcVsxXTsKLSAgICBiID0gbGVycGYodSwgdiwgc3gpOwotICAgIAotICAgIHJldHVybiAxLjVmKmxlcnBmKGEsIGIsIHN5KTsKLX0KLQotZmxvYXQgU0Nfbm9pc2VmMyhmbG9hdCB4LCBmbG9hdCB5LCBmbG9hdCB6KQotewotICAgIHNyYW5kKHRpbWUoTlVMTCkpOwotICAgIGludCBieDAsIGJ4MSwgYnkwLCBieTEsIGJ6MCwgYnoxLCBiMDAsIGIxMCwgYjAxLCBiMTE7Ci0gICAgZmxvYXQgcngwLCByeDEsIHJ5MCwgcnkxLCByejAsIHJ6MSwgc3ksIHN6LCBhLCBiLCBjLCBkLCB0LCB1LCB2OwotICAgIGZsb2F0ICpxOwotICAgIGludCBpLCBqOwotICAgIAotICAgIGlmIChub2lzZV9zdGFydCkgewotICAgICAgICBub2lzZV9zdGFydCA9IGZhbHNlOwotICAgICAgICBub2lzZV9pbml0KCk7Ci0gICAgfQotICAgIAotICAgIHQgPSB4ICsgTjsKLSAgICBieDAgPSAoKGludCl0KSAmIEJNOwotICAgIGJ4MSA9IChieDArMSkgJiBCTTsKLSAgICByeDAgPSB0IC0gKGludCl0OwotICAgIHJ4MSA9IHJ4MCAtIDEuMGY7Ci0gICAgCi0gICAgdCA9IHkgKyBOOwotICAgIGJ5MCA9ICgoaW50KXQpICYgQk07Ci0gICAgYnkxID0gKGJ5MCsxKSAmIEJNOwotICAgIHJ5MCA9IHQgLSAoaW50KXQ7Ci0gICAgcnkxID0gcnkwIC0gMS4wZjsKLQkKLSAgICB0ID0geiArIE47Ci0gICAgYnowID0gKChpbnQpdCkgJiBCTTsKLSAgICBiejEgPSAoYnowKzEpICYgQk07Ci0gICAgcnowID0gdCAtIChpbnQpdDsKLSAgICByejEgPSByejAgLSAxLjBmOwotCQotICAgIGkgPSBwW2J4MF07Ci0gICAgaiA9IHBbYngxXTsKLSAgICAKLSAgICBiMDAgPSBwW2kgKyBieTBdOwotICAgIGIxMCA9IHBbaiArIGJ5MF07Ci0gICAgYjAxID0gcFtpICsgYnkxXTsKLSAgICBiMTEgPSBwW2ogKyBieTFdOwotICAgIAotICAgIHQgID0gbm9pc2Vfc0N1cnZlKHJ4MCk7Ci0gICAgc3kgPSBub2lzZV9zQ3VydmUocnkwKTsKLSAgICBzeiA9IG5vaXNlX3NDdXJ2ZShyejApOwotICAgIAotICAgIHEgPSBnM1tiMDAgKyBiejBdOyB1ID0gcngwICogcVswXSArIHJ5MCAqIHFbMV0gKyByejAgKiBxWzJdOwotICAgIHEgPSBnM1tiMTAgKyBiejBdOyB2ID0gcngxICogcVswXSArIHJ5MCAqIHFbMV0gKyByejAgKiBxWzJdOwotICAgIGEgPSBsZXJwZih1LCB2LCB0KTsKLSAgICAKLSAgICBxID0gZzNbYjAxICsgYnowXTsgdSA9IHJ4MCAqIHFbMF0gKyByeTEgKiBxWzFdICsgcnowICogcVsyXTsKLSAgICBxID0gZzNbYjExICsgYnowXTsgdiA9IHJ4MSAqIHFbMF0gKyByeTEgKiBxWzFdICsgcnowICogcVsyXTsKLSAgICBiID0gbGVycGYodSwgdiwgdCk7Ci0gICAgCi0gICAgYyA9IGxlcnBmKGEsIGIsIHN5KTsKLSAgICAKLSAgICBxID0gZzNbYjAwICsgYnoxXTsgdSA9IHJ4MCAqIHFbMF0gKyByeTAgKiBxWzFdICsgcnoxICogcVsyXTsKLSAgICBxID0gZzNbYjEwICsgYnoxXTsgdiA9IHJ4MSAqIHFbMF0gKyByeTAgKiBxWzFdICsgcnoxICogcVsyXTsKLSAgICBhID0gbGVycGYodSwgdiwgdCk7Ci0gICAgCi0gICAgcSA9IGczW2IwMSArIGJ6MV07IHUgPSByeDAgKiBxWzBdICsgcnkxICogcVsxXSArIHJ6MSAqIHFbMl07Ci0gICAgcSA9IGczW2IxMSArIGJ6MV07IHYgPSByeDEgKiBxWzBdICsgcnkxICogcVsxXSArIHJ6MSAqIHFbMl07Ci0gICAgYiA9IGxlcnBmKHUsIHYsIHQpOwotICAgIAotICAgIGQgPSBsZXJwZihhLCBiLCBzeSk7Ci0gICAgCi0gICAgcmV0dXJuIDEuNWYqbGVycGYoYywgZCwgc3opOwotfQotCi1mbG9hdCBTQ190dXJidWxlbmNlZjIoZmxvYXQgeCwgZmxvYXQgeSwgZmxvYXQgb2N0YXZlcykKLXsKLSAgICBzcmFuZCh0aW1lKE5VTEwpKTsKLSAgICBmbG9hdCB0ID0gMC4wZjsKLSAgICAKLSAgICBmb3IgKGZsb2F0IGYgPSAxLjBmOyBmIDw9IG9jdGF2ZXM7IGYgKj0gMikKLSAgICAgICAgdCArPSBmYWJzKFNDX25vaXNlZjIoZiAqIHgsIGYgKiB5KSkgLyBmOwotICAgIHJldHVybiB0OwotfQotCi1mbG9hdCBTQ190dXJidWxlbmNlZjMoZmxvYXQgeCwgZmxvYXQgeSwgZmxvYXQgeiwgZmxvYXQgb2N0YXZlcykKLXsKLSAgICBzcmFuZCh0aW1lKE5VTEwpKTsKLSAgICBmbG9hdCB0ID0gMC4wZjsKLSAgICAKLSAgICBmb3IgKGZsb2F0IGYgPSAxLjBmOyBmIDw9IG9jdGF2ZXM7IGYgKj0gMikKLSAgICAgICAgdCArPSBmYWJzKFNDX25vaXNlZjMoZiAqIHgsIGYgKiB5LCBmICogeikpIC8gZjsKLSAgICByZXR1cm4gdDsKLX0KLQotfQotfQpkaWZmIC0tZ2l0IGEvbGlicy9ycy9yc05vaXNlLmggYi9saWJzL3JzL3JzTm9pc2UuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTA0MDc1MS4uMDAwMDAwMAotLS0gYS9saWJzL3JzL3JzTm9pc2UuaAorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIEFORFJPSURfUlNfTk9JU0VfSAotI2RlZmluZSBBTkRST0lEX1JTX05PSVNFX0gKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci1uYW1lc3BhY2UgcmVuZGVyc2NyaXB0IHsKLQotdm9pZCBTQ19ub3JtYWxpemVmMihmbG9hdCB2W10pOwotdm9pZCBTQ19ub3JtYWxpemVmMyhmbG9hdCB2W10pOwotZmxvYXQgU0Nfbm9pc2VmKGZsb2F0IHgpOwotZmxvYXQgU0Nfbm9pc2VmMihmbG9hdCB4LCBmbG9hdCB5KTsKLWZsb2F0IFNDX25vaXNlZjMoZmxvYXQgeCwgZmxvYXQgeSwgZmxvYXQgeik7Ci1mbG9hdCBTQ190dXJidWxlbmNlZjIoZmxvYXQgeCwgZmxvYXQgeSwgZmxvYXQgb2N0YXZlcyk7Ci1mbG9hdCBTQ190dXJidWxlbmNlZjMoZmxvYXQgeCwgZmxvYXQgeSwgZmxvYXQgeiwgZmxvYXQgb2N0YXZlcyk7Ci0KLX0KLX0KLQotI2VuZGlmCmRpZmYgLS1naXQgYS9saWJzL3JzL3JzT2JqZWN0QmFzZS5jcHAgYi9saWJzL3JzL3JzT2JqZWN0QmFzZS5jcHAKaW5kZXggNjc3NDEzZS4uNDhmMWZlZSAxMDA2NDQKLS0tIGEvbGlicy9ycy9yc09iamVjdEJhc2UuY3BwCisrKyBiL2xpYnMvcnMvcnNPYmplY3RCYXNlLmNwcApAQCAtMTUsNyArMTUsMTIgQEAKICAqLwogCiAjaW5jbHVkZSAicnNPYmplY3RCYXNlLmgiCisKKyNpZm5kZWYgQU5EUk9JRF9SU19CVUlMRF9GT1JfSE9TVAogI2luY2x1ZGUgInJzQ29udGV4dC5oIgorI2Vsc2UKKyNpbmNsdWRlICJyc0NvbnRleHRIb3N0U3R1Yi5oIgorI2VuZGlmCiAKIHVzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOwogdXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ6OnJlbmRlcnNjcmlwdDsKQEAgLTI0LDcgKzI5LDYgQEAKIHsKICAgICBtVXNlclJlZkNvdW50ID0gMDsKICAgICBtU3lzUmVmQ291bnQgPSAwOwotICAgIG1OYW1lID0gTlVMTDsKICAgICBtUlNDID0gTlVMTDsKICAgICBtTmV4dCA9IE5VTEw7CiAgICAgbVByZXYgPSBOVUxMOwpAQCAtMzksMTQgKzQzLDEzIEBACiAgICAgcnNBc3NlcnQoIW1Vc2VyUmVmQ291bnQpOwogICAgIHJzQXNzZXJ0KCFtU3lzUmVmQ291bnQpOwogICAgIHJlbW92ZSgpOwotICAgIGRlbGV0ZVtdIG1OYW1lOwogfQogCiB2b2lkIE9iamVjdEJhc2U6OmR1bXBMT0dWKGNvbnN0IGNoYXIgKm9wKSBjb25zdAogewotICAgIGlmIChtTmFtZSkgeworICAgIGlmIChtTmFtZS5zaXplKCkpIHsKICAgICAgICAgTE9HVigiJXMgUlNvYmogJXAsIG5hbWUgJXMsIHJlZnMgJWksJWkgIGZyb20gJXMsJWkgbGlua3MgJXAsJXAsJXAiLAotICAgICAgICAgICAgIG9wLCB0aGlzLCBtTmFtZSwgbVVzZXJSZWZDb3VudCwgbVN5c1JlZkNvdW50LCBtQWxsb2NGaWxlLCBtQWxsb2NMaW5lLCBtTmV4dCwgbVByZXYsIG1SU0MpOworICAgICAgICAgICAgIG9wLCB0aGlzLCBtTmFtZS5zdHJpbmcoKSwgbVVzZXJSZWZDb3VudCwgbVN5c1JlZkNvdW50LCBtQWxsb2NGaWxlLCBtQWxsb2NMaW5lLCBtTmV4dCwgbVByZXYsIG1SU0MpOwogICAgIH0gZWxzZSB7CiAgICAgICAgIExPR1YoIiVzIFJTb2JqICVwLCBuby1uYW1lLCByZWZzICVpLCVpICBmcm9tICVzLCVpIGxpbmtzICVwLCVwLCVwIiwKICAgICAgICAgICAgICBvcCwgdGhpcywgbVVzZXJSZWZDb3VudCwgbVN5c1JlZkNvdW50LCBtQWxsb2NGaWxlLCBtQWxsb2NMaW5lLCBtTmV4dCwgbVByZXYsIG1SU0MpOwpAQCAtMTEzLDE4ICsxMTYsMTIgQEAKIAogdm9pZCBPYmplY3RCYXNlOjpzZXROYW1lKGNvbnN0IGNoYXIgKm5hbWUpCiB7Ci0gICAgc2V0TmFtZShuYW1lLCBzdHJsZW4obmFtZSkpOworICAgIG1OYW1lLnNldFRvKG5hbWUpOwogfQogCiB2b2lkIE9iamVjdEJhc2U6OnNldE5hbWUoY29uc3QgY2hhciAqbmFtZSwgdWludDMyX3QgbGVuKQogewotICAgIGRlbGV0ZSBtTmFtZTsKLSAgICBtTmFtZSA9IE5VTEw7Ci0gICAgaWYgKG5hbWUpIHsKLSAgICAgICAgbU5hbWUgPSBuZXcgY2hhcltsZW4gKyAxXTsKLSAgICAgICAgbWVtY3B5KG1OYW1lLCBuYW1lLCBsZW4pOwotICAgICAgICBtTmFtZVtsZW5dID0gMDsKLSAgICB9CisgICAgbU5hbWUuc2V0VG8obmFtZSwgbGVuKTsKIH0KIAogdm9pZCBPYmplY3RCYXNlOjphZGQoKSBjb25zdApkaWZmIC0tZ2l0IGEvbGlicy9ycy9yc09iamVjdEJhc2UuaCBiL2xpYnMvcnMvcnNPYmplY3RCYXNlLmgKaW5kZXggYmIwM2I4Ny4uYWQ5NWI4MSAxMDA2NDQKLS0tIGEvbGlicy9ycy9yc09iamVjdEJhc2UuaAorKysgYi9saWJzL3JzL3JzT2JqZWN0QmFzZS5oCkBAIC0yNCw2ICsyNCw3IEBACiBuYW1lc3BhY2UgcmVuZGVyc2NyaXB0IHsKIAogY2xhc3MgQ29udGV4dDsKK2NsYXNzIE9TdHJlYW07CiAKIC8vIEFuIGVsZW1lbnQgaXMgYSBncm91cCBvZiBDb21wb25lbnRzIHRoYXQgb2NjdXBpZXMgb25lIGNlbGwgaW4gYSBzdHJ1Y3R1cmUuCiBjbGFzcyBPYmplY3RCYXNlCkBAIC00MCw3ICs0MSw3IEBACiAgICAgYm9vbCB6ZXJvVXNlclJlZigpIGNvbnN0OwogCiAgICAgY29uc3QgY2hhciAqIGdldE5hbWUoKSBjb25zdCB7Ci0gICAgICAgIHJldHVybiBtTmFtZTsKKyAgICAgICAgcmV0dXJuIG1OYW1lLnN0cmluZygpOwogICAgIH0KICAgICB2b2lkIHNldE5hbWUoY29uc3QgY2hhciAqKTsKICAgICB2b2lkIHNldE5hbWUoY29uc3QgY2hhciAqLCB1aW50MzJfdCBsZW4pOwpAQCAtNTIsNiArNTMsOCBAQAogICAgIHN0YXRpYyB2b2lkIGR1bXBBbGwoQ29udGV4dCAqcnNjKTsKIAogICAgIHZpcnR1YWwgdm9pZCBkdW1wTE9HVihjb25zdCBjaGFyICpwcmVmaXgpIGNvbnN0OworICAgIHZpcnR1YWwgdm9pZCBzZXJpYWxpemUoT1N0cmVhbSAqc3RyZWFtKSBjb25zdCA9IDA7CisgICAgdmlydHVhbCBSc0EzRENsYXNzSUQgZ2V0Q2xhc3NJZCgpIGNvbnN0ID0gMDsKIAogcHJvdGVjdGVkOgogICAgIGNvbnN0IGNoYXIgKm1BbGxvY0ZpbGU7CkBAIC02NCw3ICs2Nyw3IEBACiAKICAgICBib29sIGNoZWNrRGVsZXRlKCkgY29uc3Q7CiAKLSAgICBjaGFyICogbU5hbWU7CisgICAgU3RyaW5nOCBtTmFtZTsKICAgICBtdXRhYmxlIGludDMyX3QgbVN5c1JlZkNvdW50OwogICAgIG11dGFibGUgaW50MzJfdCBtVXNlclJlZkNvdW50OwogCmRpZmYgLS1naXQgYS9saWJzL3JzL3JzUHJvZ3JhbS5jcHAgYi9saWJzL3JzL3JzUHJvZ3JhbS5jcHAKaW5kZXggNzBlMjg2OC4uMjQ0MTQ5MSAxMDA2NDQKLS0tIGEvbGlicy9ycy9yc1Byb2dyYW0uY3BwCisrKyBiL2xpYnMvcnMvcnNQcm9ncmFtLmNwcApAQCAtMTQsMTEgKzE0LDE3IEBACiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCisjaWZuZGVmIEFORFJPSURfUlNfQlVJTERfRk9SX0hPU1QKICNpbmNsdWRlICJyc0NvbnRleHQuaCIKLSNpbmNsdWRlICJyc1Byb2dyYW0uaCIKLQogI2luY2x1ZGUgPEdMRVMyL2dsMi5oPgogI2luY2x1ZGUgPEdMRVMyL2dsMmV4dC5oPgorI2Vsc2UKKyNpbmNsdWRlICJyc0NvbnRleHRIb3N0U3R1Yi5oIgorI2luY2x1ZGUgPE9wZW5HTC9nbC5oPgorI2luY2x1ZGUgPE9wZW5HTC9nbGV4dC5oPgorI2VuZGlmIC8vQU5EUk9JRF9SU19CVUlMRF9GT1JfSE9TVAorCisjaW5jbHVkZSAicnNQcm9ncmFtLmgiCiAKIHVzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOwogdXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ6OnJlbmRlcnNjcmlwdDsKQEAgLTQwLDYgKzQ2LDcgQEAKICAgICBtT3V0cHV0Q291bnQgPSAwOwogICAgIG1Db25zdGFudENvdW50ID0gMDsKICAgICBtSXNWYWxpZCA9IGZhbHNlOworICAgIG1Jc0ludGVybmFsID0gZmFsc2U7CiB9CiAKIFByb2dyYW06OlByb2dyYW0oQ29udGV4dCAqcnNjLCBjb25zdCBjaGFyICogc2hhZGVyVGV4dCwgdWludDMyX3Qgc2hhZGVyTGVuZ3RoLApAQCAtOTEsNiArOTgsMTQgQEAKICAgICAgICAgICAgIG1Db25zdGFudFR5cGVzW2NvbnN0YW50KytdLnNldChyZWludGVycHJldF9jYXN0PFR5cGUgKj4ocGFyYW1zW2N0KzFdKSk7CiAgICAgICAgIH0KICAgICB9CisgICAgbUlzSW50ZXJuYWwgPSBmYWxzZTsKKyAgICB1aW50MzJfdCBpbnRlcm5hbFRva2VuTGVuID0gc3RybGVuKFJTX1NIQURFUl9JTlRFUk5BTCk7CisgICAgaWYoc2hhZGVyTGVuZ3RoID4gaW50ZXJuYWxUb2tlbkxlbiAmJgorICAgICAgIHN0cm5jbXAoUlNfU0hBREVSX0lOVEVSTkFMLCBzaGFkZXJUZXh0LCBpbnRlcm5hbFRva2VuTGVuKSA9PSAwKSB7CisgICAgICAgIG1Jc0ludGVybmFsID0gdHJ1ZTsKKyAgICAgICAgc2hhZGVyVGV4dCArPSBpbnRlcm5hbFRva2VuTGVuOworICAgICAgICBzaGFkZXJMZW5ndGggLT0gaW50ZXJuYWxUb2tlbkxlbjsKKyAgICB9CiAgICAgbVVzZXJTaGFkZXIuc2V0VG8oc2hhZGVyVGV4dCwgc2hhZGVyTGVuZ3RoKTsKIH0KIApAQCAtMjM1LDcgKzI1MCwxMzIgQEAKICAgICBtVXNlclNoYWRlci5zZXRUbyh0eHQsIGxlbik7CiB9CiAKK3ZvaWQgUHJvZ3JhbTo6YXBwZW5kVXNlckNvbnN0YW50cygpIHsKKyAgICBmb3IgKHVpbnQzMl90IGN0PTA7IGN0IDwgbUNvbnN0YW50Q291bnQ7IGN0KyspIHsKKyAgICAgICAgY29uc3QgRWxlbWVudCAqZSA9IG1Db25zdGFudFR5cGVzW2N0XS0+Z2V0RWxlbWVudCgpOworICAgICAgICBmb3IgKHVpbnQzMl90IGZpZWxkPTA7IGZpZWxkIDwgZS0+Z2V0RmllbGRDb3VudCgpOyBmaWVsZCsrKSB7CisgICAgICAgICAgICBjb25zdCBFbGVtZW50ICpmID0gZS0+Z2V0RmllbGQoZmllbGQpOworICAgICAgICAgICAgY29uc3QgY2hhciAqZm4gPSBlLT5nZXRGaWVsZE5hbWUoZmllbGQpOwogCisgICAgICAgICAgICBpZiAoZm5bMF0gPT0gJyMnKSB7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIENhbm5vdCBiZSBjb21wbGV4CisgICAgICAgICAgICByc0Fzc2VydCghZi0+Z2V0RmllbGRDb3VudCgpKTsKKyAgICAgICAgICAgIGlmKGYtPmdldFR5cGUoKSA9PSBSU19UWVBFX01BVFJJWF80WDQpIHsKKyAgICAgICAgICAgICAgICBtU2hhZGVyLmFwcGVuZCgidW5pZm9ybSBtYXQ0IFVOSV8iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYoZi0+Z2V0VHlwZSgpID09IFJTX1RZUEVfTUFUUklYXzNYMykgeworICAgICAgICAgICAgICAgIG1TaGFkZXIuYXBwZW5kKCJ1bmlmb3JtIG1hdDMgVU5JXyIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZihmLT5nZXRUeXBlKCkgPT0gUlNfVFlQRV9NQVRSSVhfMlgyKSB7CisgICAgICAgICAgICAgICAgbVNoYWRlci5hcHBlbmQoInVuaWZvcm0gbWF0MiBVTklfIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBzd2l0Y2goZi0+Z2V0Q29tcG9uZW50KCkuZ2V0VmVjdG9yU2l6ZSgpKSB7CisgICAgICAgICAgICAgICAgY2FzZSAxOiBtU2hhZGVyLmFwcGVuZCgidW5pZm9ybSBmbG9hdCBVTklfIik7IGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgMjogbVNoYWRlci5hcHBlbmQoInVuaWZvcm0gdmVjMiBVTklfIik7IGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgMzogbVNoYWRlci5hcHBlbmQoInVuaWZvcm0gdmVjMyBVTklfIik7IGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgNDogbVNoYWRlci5hcHBlbmQoInVuaWZvcm0gdmVjNCBVTklfIik7IGJyZWFrOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIHJzQXNzZXJ0KDApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgbVNoYWRlci5hcHBlbmQoZm4pOworICAgICAgICAgICAgbVNoYWRlci5hcHBlbmQoIjtcbiIpOworICAgICAgICB9CisgICAgfQorfQorCit2b2lkIFByb2dyYW06OnNldHVwVXNlckNvbnN0YW50cyhTaGFkZXJDYWNoZSAqc2MsIGJvb2wgaXNGcmFnbWVudCkgeworICAgIHVpbnQzMl90IHVpZHggPSAwOworICAgIGZvciAodWludDMyX3QgY3Q9MDsgY3QgPCBtQ29uc3RhbnRDb3VudDsgY3QrKykgeworICAgICAgICBBbGxvY2F0aW9uICphbGxvYyA9IG1Db25zdGFudHNbY3RdLmdldCgpOworICAgICAgICBpZiAoIWFsbG9jKSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmRhdGEgPSBzdGF0aWNfY2FzdDxjb25zdCB1aW50OF90ICo+KGFsbG9jLT5nZXRQdHIoKSk7CisgICAgICAgIGNvbnN0IEVsZW1lbnQgKmUgPSBtQ29uc3RhbnRUeXBlc1tjdF0tPmdldEVsZW1lbnQoKTsKKyAgICAgICAgZm9yICh1aW50MzJfdCBmaWVsZD0wOyBmaWVsZCA8IGUtPmdldEZpZWxkQ291bnQoKTsgZmllbGQrKykgeworICAgICAgICAgICAgY29uc3QgRWxlbWVudCAqZiA9IGUtPmdldEZpZWxkKGZpZWxkKTsKKyAgICAgICAgICAgIGNvbnN0IGNoYXIgKmZpZWxkTmFtZSA9IGUtPmdldEZpZWxkTmFtZShmaWVsZCk7CisgICAgICAgICAgICAvLyBJZiB0aGlzIGZpZWxkIGlzIHBhZGRpbmcsIHNraXAgaXQKKyAgICAgICAgICAgIGlmKGZpZWxkTmFtZVswXSA9PSAnIycpIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdWludDMyX3Qgb2Zmc2V0ID0gZS0+Z2V0RmllbGRPZmZzZXRCeXRlcyhmaWVsZCk7CisgICAgICAgICAgICBjb25zdCBmbG9hdCAqZmQgPSByZWludGVycHJldF9jYXN0PGNvbnN0IGZsb2F0ICo+KCZkYXRhW29mZnNldF0pOworCisgICAgICAgICAgICBpbnQzMl90IHNsb3QgPSAtMTsKKyAgICAgICAgICAgIGlmKCFpc0ZyYWdtZW50KSB7CisgICAgICAgICAgICAgICAgc2xvdCA9IHNjLT52dHhVbmlmb3JtU2xvdCh1aWR4KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIHNsb3QgPSBzYy0+ZnJhZ1VuaWZvcm1TbG90KHVpZHgpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvL0xPR0UoIlVuaWZvcm0gIHNsb3Q9JWksIG9mZnNldD0laSwgY29uc3RhbnQ9JWksIGZpZWxkPSVpLCB1aWR4PSVpLCBuYW1lPSVzIiwgc2xvdCwgb2Zmc2V0LCBjdCwgZmllbGQsIHVpZHgsIGZpZWxkTmFtZSk7CisgICAgICAgICAgICBpZiAoc2xvdCA+PSAwKSB7CisgICAgICAgICAgICAgICAgaWYoZi0+Z2V0VHlwZSgpID09IFJTX1RZUEVfTUFUUklYXzRYNCkgeworICAgICAgICAgICAgICAgICAgICBnbFVuaWZvcm1NYXRyaXg0ZnYoc2xvdCwgMSwgR0xfRkFMU0UsIGZkKTsKKyAgICAgICAgICAgICAgICAgICAgLypmb3IoaW50IGkgPSAwOyBpIDwgNDsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBMT0dFKCJNYXQgPSAlZiAlZiAlZiAlZiIsIGZkW2kqNCArIDBdLCBmZFtpKjQgKyAxXSwgZmRbaSo0ICsgMl0sIGZkW2kqNCArIDNdKTsKKyAgICAgICAgICAgICAgICAgICAgfSovCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYoZi0+Z2V0VHlwZSgpID09IFJTX1RZUEVfTUFUUklYXzNYMykgeworICAgICAgICAgICAgICAgICAgICBnbFVuaWZvcm1NYXRyaXgzZnYoc2xvdCwgMSwgR0xfRkFMU0UsIGZkKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZihmLT5nZXRUeXBlKCkgPT0gUlNfVFlQRV9NQVRSSVhfMlgyKSB7CisgICAgICAgICAgICAgICAgICAgIGdsVW5pZm9ybU1hdHJpeDJmdihzbG90LCAxLCBHTF9GQUxTRSwgZmQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoKGYtPmdldENvbXBvbmVudCgpLmdldFZlY3RvclNpemUoKSkgeworICAgICAgICAgICAgICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICAgICAgICAgICAgICAvL0xPR0UoIlVuaWZvcm0gMSA9ICVmIiwgZmRbMF0pOworICAgICAgICAgICAgICAgICAgICAgICAgZ2xVbmlmb3JtMWZ2KHNsb3QsIDEsIGZkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICAgICAgICAgICAgICAvL0xPR0UoIlVuaWZvcm0gMiA9ICVmICVmIiwgZmRbMF0sIGZkWzFdKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGdsVW5pZm9ybTJmdihzbG90LCAxLCBmZCk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAzOgorICAgICAgICAgICAgICAgICAgICAgICAgLy9MT0dFKCJVbmlmb3JtIDMgPSAlZiAlZiAlZiIsIGZkWzBdLCBmZFsxXSwgZmRbMl0pOworICAgICAgICAgICAgICAgICAgICAgICAgZ2xVbmlmb3JtM2Z2KHNsb3QsIDEsIGZkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIDQ6CisgICAgICAgICAgICAgICAgICAgICAgICAvL0xPR0UoIlVuaWZvcm0gNCA9ICVmICVmICVmICVmIiwgZmRbMF0sIGZkWzFdLCBmZFsyXSwgZmRbM10pOworICAgICAgICAgICAgICAgICAgICAgICAgZ2xVbmlmb3JtNGZ2KHNsb3QsIDEsIGZkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgcnNBc3NlcnQoMCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICB1aWR4ICsrOworICAgICAgICB9CisgICAgfQorfQorCit2b2lkIFByb2dyYW06OmluaXRBZGRVc2VyRWxlbWVudChjb25zdCBFbGVtZW50ICplLCBTdHJpbmc4ICpuYW1lcywgdWludDMyX3QgKmNvdW50LCBjb25zdCBjaGFyICpwcmVmaXgpCit7CisgICAgcnNBc3NlcnQoZS0+Z2V0RmllbGRDb3VudCgpKTsKKyAgICBmb3IgKHVpbnQzMl90IGN0PTA7IGN0IDwgZS0+Z2V0RmllbGRDb3VudCgpOyBjdCsrKSB7CisgICAgICAgIGNvbnN0IEVsZW1lbnQgKmNlID0gZS0+Z2V0RmllbGQoY3QpOworICAgICAgICBpZiAoY2UtPmdldEZpZWxkQ291bnQoKSkgeworICAgICAgICAgICAgaW5pdEFkZFVzZXJFbGVtZW50KGNlLCBuYW1lcywgY291bnQsIHByZWZpeCk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZihlLT5nZXRGaWVsZE5hbWUoY3QpWzBdICE9ICcjJykgeworICAgICAgICAgICAgU3RyaW5nOCB0bXAocHJlZml4KTsKKyAgICAgICAgICAgIHRtcC5hcHBlbmQoZS0+Z2V0RmllbGROYW1lKGN0KSk7CisgICAgICAgICAgICBuYW1lc1sqY291bnRdLnNldFRvKHRtcC5zdHJpbmcoKSk7CisgICAgICAgICAgICAoKmNvdW50KSsrOworICAgICAgICB9CisgICAgfQorfQogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiBuYW1lc3BhY2UgcmVuZGVyc2NyaXB0IHsKZGlmZiAtLWdpdCBhL2xpYnMvcnMvcnNQcm9ncmFtLmggYi9saWJzL3JzL3JzUHJvZ3JhbS5oCmluZGV4IDg2Zjg1ZmIuLmU3MzI5YzIgMTAwNjQ0Ci0tLSBhL2xpYnMvcnMvcnNQcm9ncmFtLmgKKysrIGIvbGlicy9ycy9yc1Byb2dyYW0uaApAQCAtMjMsMTAgKzIzLDEwIEBACiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIG5hbWVzcGFjZSBhbmRyb2lkIHsKIG5hbWVzcGFjZSByZW5kZXJzY3JpcHQgewotCi0KIGNsYXNzIFNoYWRlckNhY2hlOwogCisjZGVmaW5lIFJTX1NIQURFUl9JTlRFUk5BTCAiLy9yc19zaGFkZXJfaW50ZXJuYWxcbiIKKwogY2xhc3MgUHJvZ3JhbSA6IHB1YmxpYyBPYmplY3RCYXNlCiB7CiBwdWJsaWM6CkBAIC00Miw3ICs0Miw3IEBACiAgICAgdm9pZCBiaW5kQWxsb2NhdGlvbihBbGxvY2F0aW9uICosIHVpbnQzMl90IHNsb3QpOwogICAgIHZpcnR1YWwgdm9pZCBjcmVhdGVTaGFkZXIoKTsKIAotICAgIGJvb2wgaXNVc2VyUHJvZ3JhbSgpIGNvbnN0IHtyZXR1cm4gbVVzZXJTaGFkZXIuc2l6ZSgpID4gMDt9CisgICAgYm9vbCBpc1VzZXJQcm9ncmFtKCkgY29uc3Qge3JldHVybiAhbUlzSW50ZXJuYWw7fQogCiAgICAgdm9pZCBiaW5kVGV4dHVyZSh1aW50MzJfdCBzbG90LCBBbGxvY2F0aW9uICopOwogICAgIHZvaWQgYmluZFNhbXBsZXIodWludDMyX3Qgc2xvdCwgU2FtcGxlciAqKTsKQEAgLTcxLDYgKzcxLDEyIEBACiAgICAgdWludDMyX3QgbU91dHB1dENvdW50OwogICAgIHVpbnQzMl90IG1Db25zdGFudENvdW50OwogICAgIGJvb2wgbUlzVmFsaWQ7CisgICAgYm9vbCBtSXNJbnRlcm5hbDsKKworICAgIC8vIEFwcGxpZXMgdG8gdmVydGV4IGFuZCBmcmFnbWVudCBzaGFkZXJzIG9ubHkKKyAgICB2b2lkIGFwcGVuZFVzZXJDb25zdGFudHMoKTsKKyAgICB2b2lkIHNldHVwVXNlckNvbnN0YW50cyhTaGFkZXJDYWNoZSAqc2MsIGJvb2wgaXNGcmFnbWVudCk7CisgICAgdm9pZCBpbml0QWRkVXNlckVsZW1lbnQoY29uc3QgRWxlbWVudCAqZSwgU3RyaW5nOCAqbmFtZXMsIHVpbnQzMl90ICpjb3VudCwgY29uc3QgY2hhciAqcHJlZml4KTsKIAogICAgIE9iamVjdEJhc2VSZWY8QWxsb2NhdGlvbj4gbUNvbnN0YW50c1tNQVhfVU5JRk9STVNdOwogCmRpZmYgLS1naXQgYS9saWJzL3JzL3JzUHJvZ3JhbUZyYWdtZW50LmNwcCBiL2xpYnMvcnMvcnNQcm9ncmFtRnJhZ21lbnQuY3BwCmluZGV4IGMxN2I5NGMuLjMxNzRlODIgMTAwNjQ0Ci0tLSBhL2xpYnMvcnMvcnNQcm9ncmFtRnJhZ21lbnQuY3BwCisrKyBiL2xpYnMvcnMvcnNQcm9ncmFtRnJhZ21lbnQuY3BwCkBAIC0xNCwxMyArMTQsMTkgQEAKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKKyNpZm5kZWYgQU5EUk9JRF9SU19CVUlMRF9GT1JfSE9TVAogI2luY2x1ZGUgInJzQ29udGV4dC5oIgotI2luY2x1ZGUgInJzUHJvZ3JhbUZyYWdtZW50LmgiCi0KICNpbmNsdWRlIDxHTEVTL2dsLmg+CiAjaW5jbHVkZSA8R0xFUy9nbGV4dC5oPgogI2luY2x1ZGUgPEdMRVMyL2dsMi5oPgogI2luY2x1ZGUgPEdMRVMyL2dsMmV4dC5oPgorI2Vsc2UKKyNpbmNsdWRlICJyc0NvbnRleHRIb3N0U3R1Yi5oIgorI2luY2x1ZGUgPE9wZW5HTC9nbC5oPgorI2luY2x1ZGUgPE9wZW5HTC9nbGV4dC5oPgorI2VuZGlmIC8vQU5EUk9JRF9SU19CVUlMRF9GT1JfSE9TVAorCisjaW5jbHVkZSAicnNQcm9ncmFtRnJhZ21lbnQuaCIKIAogdXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7CiB1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDo6cmVuZGVyc2NyaXB0OwpAQCAtMzIsMTMgKzM4LDIxIEBACiB7CiAgICAgbUFsbG9jRmlsZSA9IF9fRklMRV9fOwogICAgIG1BbGxvY0xpbmUgPSBfX0xJTkVfXzsKLSAgICByc0Fzc2VydChwYXJhbUxlbmd0aCA9IDUpOworICAgIHJzQXNzZXJ0KHBhcmFtTGVuZ3RoID09IDYpOworCisgICAgbUNvbnN0YW50Q29sb3JbMF0gPSAxLmY7CisgICAgbUNvbnN0YW50Q29sb3JbMV0gPSAxLmY7CisgICAgbUNvbnN0YW50Q29sb3JbMl0gPSAxLmY7CisgICAgbUNvbnN0YW50Q29sb3JbM10gPSAxLmY7CiAKICAgICBtRW52TW9kZXNbMF0gPSAoUnNUZXhFbnZNb2RlKXBhcmFtc1swXTsKICAgICBtVGV4dHVyZUZvcm1hdHNbMF0gPSBwYXJhbXNbMV07CiAgICAgbUVudk1vZGVzWzFdID0gKFJzVGV4RW52TW9kZSlwYXJhbXNbMl07CiAgICAgbVRleHR1cmVGb3JtYXRzWzFdID0gcGFyYW1zWzNdOwogICAgIG1Qb2ludFNwcml0ZUVuYWJsZSA9IHBhcmFtc1s0XSAhPSAwOworICAgIG1WYXJ5aW5nQ29sb3IgPSBmYWxzZTsKKyAgICBpZiAocGFyYW1MZW5ndGggPiA1KQorICAgICAgICBtVmFyeWluZ0NvbG9yID0gcGFyYW1zWzVdICE9IDA7CiAKICAgICBtVGV4dHVyZUVuYWJsZU1hc2sgPSAwOwogICAgIGlmIChtRW52TW9kZXNbMF0pIHsKQEAgLTQ3LDYgKzYxLDcgQEAKICAgICBpZiAobUVudk1vZGVzWzFdKSB7CiAgICAgICAgIG1UZXh0dXJlRW5hYmxlTWFzayB8PSAyOwogICAgIH0KKwogICAgIGluaXQocnNjKTsKIH0KIApAQCAtNTgsOCArNzMsMTYgQEAKICAgICBtQWxsb2NGaWxlID0gX19GSUxFX187CiAgICAgbUFsbG9jTGluZSA9IF9fTElORV9fOwogCi0gICAgaW5pdChyc2MpOworICAgIG1Db25zdGFudENvbG9yWzBdID0gMS5mOworICAgIG1Db25zdGFudENvbG9yWzFdID0gMS5mOworICAgIG1Db25zdGFudENvbG9yWzJdID0gMS5mOworICAgIG1Db25zdGFudENvbG9yWzNdID0gMS5mOworCisgICAgTE9HRSgiQ3VzdG9tIEZQIik7CisKICAgICBtVGV4dHVyZUVuYWJsZU1hc2sgPSAoMSA8PCBtVGV4dHVyZUNvdW50KSAtMTsKKworICAgIGluaXQocnNjKTsKIH0KIAogCkBAIC02Nyw3NiArOTAsMjEgQEAKIHsKIH0KIAotdm9pZCBQcm9ncmFtRnJhZ21lbnQ6OnNldHVwR0woY29uc3QgQ29udGV4dCAqcnNjLCBQcm9ncmFtRnJhZ21lbnRTdGF0ZSAqc3RhdGUpCit2b2lkIFByb2dyYW1GcmFnbWVudDo6c2V0Q29uc3RhbnRDb2xvcihmbG9hdCByLCBmbG9hdCBnLCBmbG9hdCBiLCBmbG9hdCBhKQogewotICAgIGlmICgoc3RhdGUtPm1MYXN0LmdldCgpID09IHRoaXMpICYmICFtRGlydHkpIHsKKyAgICBpZihpc1VzZXJQcm9ncmFtKCkpIHsKICAgICAgICAgcmV0dXJuOwogICAgIH0KLSAgICBzdGF0ZS0+bUxhc3Quc2V0KHRoaXMpOworICAgIG1Db25zdGFudENvbG9yWzBdID0gcjsKKyAgICBtQ29uc3RhbnRDb2xvclsxXSA9IGc7CisgICAgbUNvbnN0YW50Q29sb3JbMl0gPSBiOworICAgIG1Db25zdGFudENvbG9yWzNdID0gYTsKKyAgICBtZW1jcHkobUNvbnN0YW50c1swXS0+Z2V0UHRyKCksIG1Db25zdGFudENvbG9yLCA0KnNpemVvZihmbG9hdCkpOworICAgIG1EaXJ0eSA9IHRydWU7Cit9CiAKLSAgICBmb3IgKHVpbnQzMl90IGN0PTA7IGN0IDwgTUFYX1RFWFRVUkU7IGN0KyspIHsKLSAgICAgICAgZ2xBY3RpdmVUZXh0dXJlKEdMX1RFWFRVUkUwICsgY3QpOwotICAgICAgICBpZiAoIShtVGV4dHVyZUVuYWJsZU1hc2sgJiAoMSA8PCBjdCkpIHx8ICFtVGV4dHVyZXNbY3RdLmdldCgpKSB7Ci0gICAgICAgICAgICBnbERpc2FibGUoR0xfVEVYVFVSRV8yRCk7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotCi0gICAgICAgIGdsRW5hYmxlKEdMX1RFWFRVUkVfMkQpOwotICAgICAgICBpZiAocnNjLT5jaGVja1ZlcnNpb24xXzEoKSkgewotICAgICAgICAgICAgaWYgKG1Qb2ludFNwcml0ZUVuYWJsZSkgewotICAgICAgICAgICAgICAgIGdsRW5hYmxlKEdMX1BPSU5UX1NQUklURV9PRVMpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBnbERpc2FibGUoR0xfUE9JTlRfU1BSSVRFX09FUyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBnbFRleEVudmkoR0xfUE9JTlRfU1BSSVRFX09FUywgR0xfQ09PUkRfUkVQTEFDRV9PRVMsIG1Qb2ludFNwcml0ZUVuYWJsZSk7Ci0gICAgICAgIH0KLSAgICAgICAgbVRleHR1cmVzW2N0XS0+dXBsb2FkQ2hlY2socnNjKTsKLSAgICAgICAgZ2xCaW5kVGV4dHVyZShHTF9URVhUVVJFXzJELCBtVGV4dHVyZXNbY3RdLT5nZXRUZXh0dXJlSUQoKSk7Ci0KLSAgICAgICAgc3dpdGNoKG1FbnZNb2Rlc1tjdF0pIHsKLSAgICAgICAgY2FzZSBSU19URVhfRU5WX01PREVfTk9ORToKLSAgICAgICAgICAgIHJzQXNzZXJ0KDApOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgUlNfVEVYX0VOVl9NT0RFX1JFUExBQ0U6Ci0gICAgICAgICAgICBnbFRleEVudmYoR0xfVEVYVFVSRV9FTlYsIEdMX1RFWFRVUkVfRU5WX01PREUsIEdMX1JFUExBQ0UpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgUlNfVEVYX0VOVl9NT0RFX01PRFVMQVRFOgotICAgICAgICAgICAgZ2xUZXhFbnZmKEdMX1RFWFRVUkVfRU5WLCBHTF9URVhUVVJFX0VOVl9NT0RFLCBHTF9NT0RVTEFURSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBSU19URVhfRU5WX01PREVfREVDQUw6Ci0gICAgICAgICAgICBnbFRleEVudmYoR0xfVEVYVFVSRV9FTlYsIEdMX1RFWFRVUkVfRU5WX01PREUsIEdMX0RFQ0FMKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG1TYW1wbGVyc1tjdF0uZ2V0KCkpIHsKLSAgICAgICAgICAgIG1TYW1wbGVyc1tjdF0tPnNldHVwR0wocnNjLCBtVGV4dHVyZXNbY3RdLT5nZXRUeXBlKCktPmdldElzTnAyKCkpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgZ2xUZXhQYXJhbWV0ZXJpKEdMX1RFWFRVUkVfMkQsIEdMX1RFWFRVUkVfTUlOX0ZJTFRFUiwgR0xfTkVBUkVTVCk7Ci0gICAgICAgICAgICBnbFRleFBhcmFtZXRlcmkoR0xfVEVYVFVSRV8yRCwgR0xfVEVYVFVSRV9NQUdfRklMVEVSLCBHTF9ORUFSRVNUKTsKLSAgICAgICAgICAgIGdsVGV4UGFyYW1ldGVyaShHTF9URVhUVVJFXzJELCBHTF9URVhUVVJFX1dSQVBfUywgR0xfUkVQRUFUKTsKLSAgICAgICAgICAgIGdsVGV4UGFyYW1ldGVyaShHTF9URVhUVVJFXzJELCBHTF9URVhUVVJFX1dSQVBfVCwgR0xfUkVQRUFUKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIEdyb3NzIGhhY2suCi0gICAgICAgIGlmIChjdCA9PSAyKSB7Ci0gICAgICAgICAgICBnbFRleEVudmkoR0xfVEVYVFVSRV9FTlYsIEdMX1RFWFRVUkVfRU5WX01PREUsIEdMX0NPTUJJTkUpOwotCi0gICAgICAgICAgICBnbFRleEVudmkoR0xfVEVYVFVSRV9FTlYsIEdMX0NPTUJJTkVfUkdCLCBHTF9BREQpOwotICAgICAgICAgICAgZ2xUZXhFbnZpKEdMX1RFWFRVUkVfRU5WLCBHTF9TUkMwX1JHQiwgR0xfUFJFVklPVVMpOwotICAgICAgICAgICAgZ2xUZXhFbnZpKEdMX1RFWFRVUkVfRU5WLCBHTF9TUkMxX1JHQiwgR0xfVEVYVFVSRSk7Ci0gICAgICAgICAgICBnbFRleEVudmkoR0xfVEVYVFVSRV9FTlYsIEdMX09QRVJBTkQwX1JHQiwgR0xfU1JDX0NPTE9SKTsKLSAgICAgICAgICAgIGdsVGV4RW52aShHTF9URVhUVVJFX0VOViwgR0xfT1BFUkFORDFfUkdCLCBHTF9TUkNfQ09MT1IpOwotCi0gICAgICAgICAgICBnbFRleEVudmkoR0xfVEVYVFVSRV9FTlYsIEdMX0NPTUJJTkVfQUxQSEEsIEdMX0FERCk7Ci0gICAgICAgICAgICBnbFRleEVudmkoR0xfVEVYVFVSRV9FTlYsIEdMX1NSQzBfQUxQSEEsIEdMX1BSRVZJT1VTKTsKLSAgICAgICAgICAgIGdsVGV4RW52aShHTF9URVhUVVJFX0VOViwgR0xfU1JDMV9BTFBIQSwgR0xfVEVYVFVSRSk7Ci0gICAgICAgICAgICBnbFRleEVudmkoR0xfVEVYVFVSRV9FTlYsIEdMX09QRVJBTkQwX0FMUEhBLCBHTF9TUkNfQUxQSEEpOwotICAgICAgICAgICAgZ2xUZXhFbnZpKEdMX1RFWFRVUkVfRU5WLCBHTF9PUEVSQU5EMV9BTFBIQSwgR0xfU1JDX0FMUEhBKTsKLSAgICAgICAgfQotICAgIH0KLSAgICBnbEFjdGl2ZVRleHR1cmUoR0xfVEVYVFVSRTApOwotICAgIG1EaXJ0eSA9IGZhbHNlOwotICAgIHJzYy0+Y2hlY2tFcnJvcigiUHJvZ3JhbUZyYWdtZW50OjpzZXR1cEdMIik7Cit2b2lkIFByb2dyYW1GcmFnbWVudDo6c2V0dXBHTChjb25zdCBDb250ZXh0ICpyc2MsIFByb2dyYW1GcmFnbWVudFN0YXRlICpzdGF0ZSkKK3sKIH0KIAogdm9pZCBQcm9ncmFtRnJhZ21lbnQ6OnNldHVwR0wyKGNvbnN0IENvbnRleHQgKnJzYywgUHJvZ3JhbUZyYWdtZW50U3RhdGUgKnN0YXRlLCBTaGFkZXJDYWNoZSAqc2MpCkBAIC0xNDQsMTEgKzExMiwxNSBAQAogCiAgICAgLy9MT0dFKCJzZ2wyIGZyYWcxICV4IiwgZ2xHZXRFcnJvcigpKTsKICAgICBpZiAoKHN0YXRlLT5tTGFzdC5nZXQoKSA9PSB0aGlzKSAmJiAhbURpcnR5KSB7Ci0gICAgICAgIC8vcmV0dXJuOworICAgICAgICByZXR1cm47CiAgICAgfQogICAgIHN0YXRlLT5tTGFzdC5zZXQodGhpcyk7CiAKICAgICByc2MtPmNoZWNrRXJyb3IoIlByb2dyYW1GcmFnbWVudDo6c2V0dXBHTDIgc3RhcnQiKTsKKworICAgIHJzYy0+Y2hlY2tFcnJvcigiUHJvZ3JhbUZyYWdtZW50OjpzZXR1cEdMMiBiZWdpbiB1bmlmb3JtcyIpOworICAgIHNldHVwVXNlckNvbnN0YW50cyhzYywgdHJ1ZSk7CisKICAgICBmb3IgKHVpbnQzMl90IGN0PTA7IGN0IDwgTUFYX1RFWFRVUkU7IGN0KyspIHsKICAgICAgICAgZ2xBY3RpdmVUZXh0dXJlKEdMX1RFWFRVUkUwICsgY3QpOwogICAgICAgICBpZiAoIShtVGV4dHVyZUVuYWJsZU1hc2sgJiAoMSA8PCBjdCkpIHx8ICFtVGV4dHVyZXNbY3RdLmdldCgpKSB7CkBAIC0xNjgsNyArMTQwLDcgQEAKICAgICAgICAgICAgIHJzYy0+Y2hlY2tFcnJvcigiUHJvZ3JhbUZyYWdtZW50OjpzZXR1cEdMMiB0ZXggZW52Iik7CiAgICAgICAgIH0KIAotICAgICAgICBnbFVuaWZvcm0xaShzYy0+ZnJhZ1VuaWZvcm1TbG90KGN0KSwgY3QpOworICAgICAgICBnbFVuaWZvcm0xaShzYy0+ZnJhZ1VuaWZvcm1TbG90KG1UZXh0dXJlVW5pZm9ybUluZGV4U3RhcnQgKyBjdCksIGN0KTsKICAgICAgICAgcnNjLT5jaGVja0Vycm9yKCJQcm9ncmFtRnJhZ21lbnQ6OnNldHVwR0wyIHVuaWZvcm1zIik7CiAgICAgfQogCkBAIC0xODMsMTEyICsxNTUsNDYgQEAKIAogdm9pZCBQcm9ncmFtRnJhZ21lbnQ6OmNyZWF0ZVNoYWRlcigpCiB7Ci0gICAgbVNoYWRlci5zZXRUbygicHJlY2lzaW9uIG1lZGl1bXAgZmxvYXQ7XG4iKTsKLSAgICBtU2hhZGVyLmFwcGVuZCgidmFyeWluZyB2ZWM0IHZhckNvbG9yO1xuIik7Ci0gICAgbVNoYWRlci5hcHBlbmQoInZhcnlpbmcgdmVjNCB2YXJUZXgwO1xuIik7Ci0KICAgICBpZiAobVVzZXJTaGFkZXIubGVuZ3RoKCkgPiAxKSB7CisgICAgICAgIG1TaGFkZXIuYXBwZW5kKCJwcmVjaXNpb24gbWVkaXVtcCBmbG9hdDtcbiIpOworICAgICAgICBhcHBlbmRVc2VyQ29uc3RhbnRzKCk7CiAgICAgICAgIGZvciAodWludDMyX3QgY3Q9MDsgY3QgPCBtVGV4dHVyZUNvdW50OyBjdCsrKSB7CiAgICAgICAgICAgICBjaGFyIGJ1ZlsyNTZdOwotICAgICAgICAgICAgc3ByaW50ZihidWYsICJ1bmlmb3JtIHNhbXBsZXIyRCB1bmlfVGV4JWk7XG4iLCBjdCk7CisgICAgICAgICAgICBzcHJpbnRmKGJ1ZiwgInVuaWZvcm0gc2FtcGxlcjJEIFVOSV9UZXglaTtcbiIsIGN0KTsKICAgICAgICAgICAgIG1TaGFkZXIuYXBwZW5kKGJ1Zik7CiAgICAgICAgIH0KLQogICAgICAgICBtU2hhZGVyLmFwcGVuZChtVXNlclNoYWRlcik7CiAgICAgfSBlbHNlIHsKLSAgICAgICAgdWludDMyX3QgbWFzayA9IG1UZXh0dXJlRW5hYmxlTWFzazsKLSAgICAgICAgdWludDMyX3QgdGV4TnVtID0gMDsKLSAgICAgICAgd2hpbGUgKG1hc2spIHsKLSAgICAgICAgICAgIGlmIChtYXNrICYgMSkgewotICAgICAgICAgICAgICAgIGNoYXIgYnVmWzY0XTsKLSAgICAgICAgICAgICAgICBtU2hhZGVyLmFwcGVuZCgidW5pZm9ybSBzYW1wbGVyMkQgdW5pX1RleCIpOwotICAgICAgICAgICAgICAgIHNwcmludGYoYnVmLCAiJWkiLCB0ZXhOdW0pOwotICAgICAgICAgICAgICAgIG1TaGFkZXIuYXBwZW5kKGJ1Zik7Ci0gICAgICAgICAgICAgICAgbVNoYWRlci5hcHBlbmQoIjtcbiIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbWFzayA+Pj0gMTsKLSAgICAgICAgICAgIHRleE51bSsrOwotICAgICAgICB9Ci0KLQotICAgICAgICBtU2hhZGVyLmFwcGVuZCgidm9pZCBtYWluKCkge1xuIik7Ci0gICAgICAgIG1TaGFkZXIuYXBwZW5kKCIgIHZlYzQgY29sID0gdmFyQ29sb3I7XG4iKTsKLQotICAgICAgICBpZiAobVRleHR1cmVFbmFibGVNYXNrKSB7Ci0gICAgICAgICAgICBpZiAobVBvaW50U3ByaXRlRW5hYmxlKSB7Ci0gICAgICAgICAgICAgICAgbVNoYWRlci5hcHBlbmQoIiAgdmVjMiB0MCA9IGdsX1BvaW50Q29vcmQ7XG4iKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgbVNoYWRlci5hcHBlbmQoIiAgdmVjMiB0MCA9IHZhclRleDAueHk7XG4iKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIG1hc2sgPSBtVGV4dHVyZUVuYWJsZU1hc2s7Ci0gICAgICAgIHRleE51bSA9IDA7Ci0gICAgICAgIHdoaWxlIChtYXNrKSB7Ci0gICAgICAgICAgICBpZiAobWFzayAmIDEpIHsKLSAgICAgICAgICAgICAgICBzd2l0Y2gobUVudk1vZGVzW3RleE51bV0pIHsKLSAgICAgICAgICAgICAgICBjYXNlIFJTX1RFWF9FTlZfTU9ERV9OT05FOgotICAgICAgICAgICAgICAgICAgICByc0Fzc2VydCgwKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBSU19URVhfRU5WX01PREVfUkVQTEFDRToKLSAgICAgICAgICAgICAgICAgICAgc3dpdGNoKG1UZXh0dXJlRm9ybWF0c1t0ZXhOdW1dKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgMToKLSAgICAgICAgICAgICAgICAgICAgICAgIG1TaGFkZXIuYXBwZW5kKCIgIGNvbC5hID0gdGV4dHVyZTJEKHVuaV9UZXgwLCB0MCkuYTtcbiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgMjoKLSAgICAgICAgICAgICAgICAgICAgICAgIG1TaGFkZXIuYXBwZW5kKCIgIGNvbC5yZ2JhID0gdGV4dHVyZTJEKHVuaV9UZXgwLCB0MCkucmdiYTtcbiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgMzoKLSAgICAgICAgICAgICAgICAgICAgICAgIG1TaGFkZXIuYXBwZW5kKCIgIGNvbC5yZ2IgPSB0ZXh0dXJlMkQodW5pX1RleDAsIHQwKS5yZ2I7XG4iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBjYXNlIDQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICBtU2hhZGVyLmFwcGVuZCgiICBjb2wucmdiYSA9IHRleHR1cmUyRCh1bmlfVGV4MCwgdDApLnJnYmE7XG4iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgUlNfVEVYX0VOVl9NT0RFX01PRFVMQVRFOgotICAgICAgICAgICAgICAgICAgICBzd2l0Y2gobVRleHR1cmVGb3JtYXRzW3RleE51bV0pIHsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSAxOgotICAgICAgICAgICAgICAgICAgICAgICAgbVNoYWRlci5hcHBlbmQoIiAgY29sLmEgKj0gdGV4dHVyZTJEKHVuaV9UZXgwLCB0MCkuYTtcbiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgMjoKLSAgICAgICAgICAgICAgICAgICAgICAgIG1TaGFkZXIuYXBwZW5kKCIgIGNvbC5yZ2JhICo9IHRleHR1cmUyRCh1bmlfVGV4MCwgdDApLnJnYmE7XG4iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBjYXNlIDM6Ci0gICAgICAgICAgICAgICAgICAgICAgICBtU2hhZGVyLmFwcGVuZCgiICBjb2wucmdiICo9IHRleHR1cmUyRCh1bmlfVGV4MCwgdDApLnJnYjtcbiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgNDoKLSAgICAgICAgICAgICAgICAgICAgICAgIG1TaGFkZXIuYXBwZW5kKCIgIGNvbC5yZ2JhICo9IHRleHR1cmUyRCh1bmlfVGV4MCwgdDApLnJnYmE7XG4iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgUlNfVEVYX0VOVl9NT0RFX0RFQ0FMOgotICAgICAgICAgICAgICAgICAgICBtU2hhZGVyLmFwcGVuZCgiICBjb2wgPSB0ZXh0dXJlMkQodW5pX1RleDAsIHQwKTtcbiIpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1hc2sgPj49IDE7Ci0gICAgICAgICAgICB0ZXhOdW0rKzsKLSAgICAgICAgfQotCi0gICAgICAgIC8vbVNoYWRlci5hcHBlbmQoIiAgY29sLmEgPSAxLjA7XG4iKTsKLSAgICAgICAgLy9tU2hhZGVyLmFwcGVuZCgiICBjb2wuciA9IDAuNTtcbiIpOwotCi0gICAgICAgIG1TaGFkZXIuYXBwZW5kKCIgIGdsX0ZyYWdDb2xvciA9IGNvbDtcbiIpOwotICAgICAgICBtU2hhZGVyLmFwcGVuZCgifVxuIik7CisgICAgICAgIExPR0UoIlByb2dyYW1GcmFnbWVudDo6Y3JlYXRlU2hhZGVyIGNhbm5vdCBjcmVhdGUgcHJvZ3JhbSwgc2hhZGVyIGNvZGUgbm90IGRlZmluZWQiKTsKKyAgICAgICAgcnNBc3NlcnQoMCk7CiAgICAgfQogfQogCiB2b2lkIFByb2dyYW1GcmFnbWVudDo6aW5pdChDb250ZXh0ICpyc2MpCiB7Ci0gICAgbVVuaWZvcm1Db3VudCA9IDI7Ci0gICAgbVVuaWZvcm1OYW1lc1swXS5zZXRUbygidW5pX1RleDAiKTsKLSAgICBtVW5pZm9ybU5hbWVzWzFdLnNldFRvKCJ1bmlfVGV4MSIpOworICAgIG1Vbmlmb3JtQ291bnQgPSAwOworICAgIGlmIChtVXNlclNoYWRlci5zaXplKCkgPiAwKSB7CisgICAgICAgIGZvciAodWludDMyX3QgY3Q9MDsgY3QgPCBtQ29uc3RhbnRDb3VudDsgY3QrKykgeworICAgICAgICAgICAgaW5pdEFkZFVzZXJFbGVtZW50KG1Db25zdGFudFR5cGVzW2N0XS0+Z2V0RWxlbWVudCgpLCBtVW5pZm9ybU5hbWVzLCAmbVVuaWZvcm1Db3VudCwgIlVOSV8iKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBtVGV4dHVyZVVuaWZvcm1JbmRleFN0YXJ0ID0gbVVuaWZvcm1Db3VudDsKKyAgICBtVW5pZm9ybU5hbWVzW21Vbmlmb3JtQ291bnQrK10uc2V0VG8oIlVOSV9UZXgwIik7CisgICAgbVVuaWZvcm1OYW1lc1ttVW5pZm9ybUNvdW50KytdLnNldFRvKCJVTklfVGV4MSIpOwogCiAgICAgY3JlYXRlU2hhZGVyKCk7CiB9CiAKK3ZvaWQgUHJvZ3JhbUZyYWdtZW50OjpzZXJpYWxpemUoT1N0cmVhbSAqc3RyZWFtKSBjb25zdAoreworCit9CisKK1Byb2dyYW1GcmFnbWVudCAqUHJvZ3JhbUZyYWdtZW50OjpjcmVhdGVGcm9tU3RyZWFtKENvbnRleHQgKnJzYywgSVN0cmVhbSAqc3RyZWFtKQoreworICAgIHJldHVybiBOVUxMOworfQorCiBQcm9ncmFtRnJhZ21lbnRTdGF0ZTo6UHJvZ3JhbUZyYWdtZW50U3RhdGUoKQogewogICAgIG1QRiA9IE5VTEw7CkBAIC0zMDAsMTYgKzIwNiwzOSBAQAogCiB9CiAKLXZvaWQgUHJvZ3JhbUZyYWdtZW50U3RhdGU6OmluaXQoQ29udGV4dCAqcnNjLCBpbnQzMl90IHcsIGludDMyX3QgaCkKK3ZvaWQgUHJvZ3JhbUZyYWdtZW50U3RhdGU6OmluaXQoQ29udGV4dCAqcnNjKQogewotICAgIHVpbnQzMl90IHRtcFs1XSA9IHsKLSAgICAgICAgUlNfVEVYX0VOVl9NT0RFX05PTkUsIDAsCi0gICAgICAgIFJTX1RFWF9FTlZfTU9ERV9OT05FLCAwLAotICAgICAgICAwCi0gICAgfTsKLSAgICBQcm9ncmFtRnJhZ21lbnQgKnBmID0gbmV3IFByb2dyYW1GcmFnbWVudChyc2MsIHRtcCwgNSk7CisgICAgU3RyaW5nOCBzaGFkZXJTdHJpbmcoUlNfU0hBREVSX0lOVEVSTkFMKTsKKyAgICBzaGFkZXJTdHJpbmcuYXBwZW5kKCJ2YXJ5aW5nIGxvd3AgdmVjNCB2YXJDb2xvcjtcbiIpOworICAgIHNoYWRlclN0cmluZy5hcHBlbmQoInZhcnlpbmcgdmVjNCB2YXJUZXgwO1xuIik7CisgICAgc2hhZGVyU3RyaW5nLmFwcGVuZCgidm9pZCBtYWluKCkge1xuIik7CisgICAgc2hhZGVyU3RyaW5nLmFwcGVuZCgiICBsb3dwIHZlYzQgY29sID0gVU5JX0NvbG9yO1xuIik7CisgICAgc2hhZGVyU3RyaW5nLmFwcGVuZCgiICBnbF9GcmFnQ29sb3IgPSBjb2w7XG4iKTsKKyAgICBzaGFkZXJTdHJpbmcuYXBwZW5kKCJ9XG4iKTsKKworICAgIGNvbnN0IEVsZW1lbnQgKmNvbG9yRWxlbSA9IEVsZW1lbnQ6OmNyZWF0ZShyc2MsIFJTX1RZUEVfRkxPQVRfMzIsIFJTX0tJTkRfVVNFUiwgZmFsc2UsIDQpOworICAgIHJzYy0+bVN0YXRlRWxlbWVudC5lbGVtZW50QnVpbGRlckJlZ2luKCk7CisgICAgcnNjLT5tU3RhdGVFbGVtZW50LmVsZW1lbnRCdWlsZGVyQWRkKGNvbG9yRWxlbSwgIkNvbG9yIiwgMSk7CisgICAgY29uc3QgRWxlbWVudCAqY29uc3RJbnB1dCA9IHJzYy0+bVN0YXRlRWxlbWVudC5lbGVtZW50QnVpbGRlckNyZWF0ZShyc2MpOworCisgICAgVHlwZSAqaW5wdXRUeXBlID0gbmV3IFR5cGUocnNjKTsKKyAgICBpbnB1dFR5cGUtPnNldEVsZW1lbnQoY29uc3RJbnB1dCk7CisgICAgaW5wdXRUeXBlLT5zZXREaW1YKDEpOworICAgIGlucHV0VHlwZS0+Y29tcHV0ZSgpOworCisgICAgdWludDMyX3QgdG1wWzRdOworICAgIHRtcFswXSA9IFJTX1BST0dSQU1fUEFSQU1fQ09OU1RBTlQ7CisgICAgdG1wWzFdID0gKHVpbnQzMl90KWlucHV0VHlwZTsKKyAgICB0bXBbMl0gPSBSU19QUk9HUkFNX1BBUkFNX1RFWFRVUkVfQ09VTlQ7CisgICAgdG1wWzNdID0gMDsKKworICAgIEFsbG9jYXRpb24gKmNvbnN0QWxsb2MgPSBuZXcgQWxsb2NhdGlvbihyc2MsIGlucHV0VHlwZSk7CisgICAgUHJvZ3JhbUZyYWdtZW50ICpwZiA9IG5ldyBQcm9ncmFtRnJhZ21lbnQocnNjLCBzaGFkZXJTdHJpbmcuc3RyaW5nKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hhZGVyU3RyaW5nLmxlbmd0aCgpLCB0bXAsIDQpOworICAgIHBmLT5iaW5kQWxsb2NhdGlvbihjb25zdEFsbG9jLCAwKTsKKyAgICBwZi0+c2V0Q29uc3RhbnRDb2xvcigxLjBmLCAxLjBmLCAxLjBmLCAxLjBmKTsKKwogICAgIG1EZWZhdWx0LnNldChwZik7Ci0gICAgcGYtPmluaXQocnNjKTsKIH0KIAogdm9pZCBQcm9ncmFtRnJhZ21lbnRTdGF0ZTo6ZGVpbml0KENvbnRleHQgKnJzYykKQEAgLTMyOCw2ICsyNTcsNyBAQAogewogICAgIFByb2dyYW1GcmFnbWVudCAqcGYgPSBuZXcgUHJvZ3JhbUZyYWdtZW50KHJzYywgcGFyYW1zLCBwYXJhbUxlbmd0aCk7CiAgICAgcGYtPmluY1VzZXJSZWYoKTsKKyAgICAvL0xPR0UoInJzaV9Qcm9ncmFtRnJhZ21lbnRDcmVhdGUgJXAiLCBwZik7CiAgICAgcmV0dXJuIHBmOwogfQogCkBAIC0zMzcsNiArMjY3LDcgQEAKIHsKICAgICBQcm9ncmFtRnJhZ21lbnQgKnBmID0gbmV3IFByb2dyYW1GcmFnbWVudChyc2MsIHNoYWRlclRleHQsIHNoYWRlckxlbmd0aCwgcGFyYW1zLCBwYXJhbUxlbmd0aCk7CiAgICAgcGYtPmluY1VzZXJSZWYoKTsKKyAgICAvL0xPR0UoInJzaV9Qcm9ncmFtRnJhZ21lbnRDcmVhdGUyICVwIiwgcGYpOwogICAgIHJldHVybiBwZjsKIH0KIApkaWZmIC0tZ2l0IGEvbGlicy9ycy9yc1Byb2dyYW1GcmFnbWVudC5oIGIvbGlicy9ycy9yc1Byb2dyYW1GcmFnbWVudC5oCmluZGV4IDlmYTU2NWQuLmYwOGJiMjUgMTAwNjQ0Ci0tLSBhL2xpYnMvcnMvcnNQcm9ncmFtRnJhZ21lbnQuaAorKysgYi9saWJzL3JzL3JzUHJvZ3JhbUZyYWdtZW50LmgKQEAgLTQwLDYgKzQwLDExIEBACiAgICAgdmlydHVhbCB2b2lkIGNyZWF0ZVNoYWRlcigpOwogICAgIHZpcnR1YWwgdm9pZCBsb2FkU2hhZGVyKENvbnRleHQgKnJzYyk7CiAgICAgdmlydHVhbCB2b2lkIGluaXQoQ29udGV4dCAqcnNjKTsKKyAgICB2aXJ0dWFsIHZvaWQgc2VyaWFsaXplKE9TdHJlYW0gKnN0cmVhbSkgY29uc3Q7CisgICAgdmlydHVhbCBSc0EzRENsYXNzSUQgZ2V0Q2xhc3NJZCgpIGNvbnN0IHsgcmV0dXJuIFJTX0EzRF9DTEFTU19JRF9QUk9HUkFNX0ZSQUdNRU5UOyB9CisgICAgc3RhdGljIFByb2dyYW1GcmFnbWVudCAqY3JlYXRlRnJvbVN0cmVhbShDb250ZXh0ICpyc2MsIElTdHJlYW0gKnN0cmVhbSk7CisKKyAgICB2b2lkIHNldENvbnN0YW50Q29sb3IoZmxvYXQsIGZsb2F0LCBmbG9hdCwgZmxvYXQpOwogCiBwcm90ZWN0ZWQ6CiAgICAgLy8gSGFja3MgdG8gY3JlYXRlIGEgcHJvZ3JhbSBmb3Igbm93CkBAIC00OCw2ICs1MywxMSBAQAogICAgIFJzVGV4RW52TW9kZSBtRW52TW9kZXNbTUFYX1RFWFRVUkVdOwogICAgIHVpbnQzMl90IG1UZXh0dXJlRW5hYmxlTWFzazsKICAgICBib29sIG1Qb2ludFNwcml0ZUVuYWJsZTsKKyAgICBib29sIG1WYXJ5aW5nQ29sb3I7CisKKyAgICBmbG9hdCBtQ29uc3RhbnRDb2xvcls0XTsKKyAgICBpbnQzMl90IG1Db25zdGFudENvbG9yVW5pZm9ybUluZGV4OworICAgIGludDMyX3QgbVRleHR1cmVVbmlmb3JtSW5kZXhTdGFydDsKIH07CiAKIGNsYXNzIFByb2dyYW1GcmFnbWVudFN0YXRlCkBAIC01Nyw3ICs2Nyw3IEBACiAgICAgflByb2dyYW1GcmFnbWVudFN0YXRlKCk7CiAKICAgICBQcm9ncmFtRnJhZ21lbnQgKm1QRjsKLSAgICB2b2lkIGluaXQoQ29udGV4dCAqcnNjLCBpbnQzMl90IHcsIGludDMyX3QgaCk7CisgICAgdm9pZCBpbml0KENvbnRleHQgKnJzYyk7CiAgICAgdm9pZCBkZWluaXQoQ29udGV4dCAqcnNjKTsKIAogICAgIE9iamVjdEJhc2VSZWY8VHlwZT4gbVRleHR1cmVUeXBlc1tQcm9ncmFtRnJhZ21lbnQ6Ok1BWF9URVhUVVJFXTsKZGlmZiAtLWdpdCBhL2xpYnMvcnMvcnNQcm9ncmFtRnJhZ21lbnRTdG9yZS5jcHAgYi9saWJzL3JzL3JzUHJvZ3JhbUZyYWdtZW50U3RvcmUuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YTIxNTdmLi4wMDAwMDAwCi0tLSBhL2xpYnMvcnMvcnNQcm9ncmFtRnJhZ21lbnRTdG9yZS5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwzMDggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlICJyc0NvbnRleHQuaCIKLSNpbmNsdWRlICJyc1Byb2dyYW1GcmFnbWVudFN0b3JlLmgiCi0KLSNpbmNsdWRlIDxHTEVTL2dsLmg+Ci0jaW5jbHVkZSA8R0xFUy9nbGV4dC5oPgotCi11c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKLXVzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOjpyZW5kZXJzY3JpcHQ7Ci0KLQotUHJvZ3JhbUZyYWdtZW50U3RvcmU6OlByb2dyYW1GcmFnbWVudFN0b3JlKENvbnRleHQgKnJzYykgOgotICAgIFByb2dyYW0ocnNjKQotewotICAgIG1BbGxvY0ZpbGUgPSBfX0ZJTEVfXzsKLSAgICBtQWxsb2NMaW5lID0gX19MSU5FX187Ci0gICAgbURpdGhlckVuYWJsZSA9IHRydWU7Ci0gICAgbUJsZW5kRW5hYmxlID0gZmFsc2U7Ci0gICAgbUNvbG9yUldyaXRlRW5hYmxlID0gdHJ1ZTsKLSAgICBtQ29sb3JHV3JpdGVFbmFibGUgPSB0cnVlOwotICAgIG1Db2xvckJXcml0ZUVuYWJsZSA9IHRydWU7Ci0gICAgbUNvbG9yQVdyaXRlRW5hYmxlID0gdHJ1ZTsKLSAgICBtQmxlbmRTcmMgPSBHTF9PTkU7Ci0gICAgbUJsZW5kRHN0ID0gR0xfWkVSTzsKLQotCi0gICAgbURlcHRoVGVzdEVuYWJsZSA9IGZhbHNlOwotICAgIG1EZXB0aFdyaXRlRW5hYmxlID0gdHJ1ZTsKLSAgICBtRGVwdGhGdW5jID0gR0xfTEVTUzsKLQotCi19Ci0KLVByb2dyYW1GcmFnbWVudFN0b3JlOjp+UHJvZ3JhbUZyYWdtZW50U3RvcmUoKQotewotfQotCi12b2lkIFByb2dyYW1GcmFnbWVudFN0b3JlOjpzZXR1cEdMKGNvbnN0IENvbnRleHQgKnJzYywgUHJvZ3JhbUZyYWdtZW50U3RvcmVTdGF0ZSAqc3RhdGUpCi17Ci0gICAgaWYgKHN0YXRlLT5tTGFzdC5nZXQoKSA9PSB0aGlzKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgc3RhdGUtPm1MYXN0LnNldCh0aGlzKTsKLQotICAgIGdsQ29sb3JNYXNrKG1Db2xvclJXcml0ZUVuYWJsZSwKLSAgICAgICAgICAgICAgICBtQ29sb3JHV3JpdGVFbmFibGUsCi0gICAgICAgICAgICAgICAgbUNvbG9yQldyaXRlRW5hYmxlLAotICAgICAgICAgICAgICAgIG1Db2xvckFXcml0ZUVuYWJsZSk7Ci0gICAgaWYgKG1CbGVuZEVuYWJsZSkgewotICAgICAgICBnbEVuYWJsZShHTF9CTEVORCk7Ci0gICAgICAgIGdsQmxlbmRGdW5jKG1CbGVuZFNyYywgbUJsZW5kRHN0KTsKLSAgICB9IGVsc2UgewotICAgICAgICBnbERpc2FibGUoR0xfQkxFTkQpOwotICAgIH0KLQotICAgIC8vTE9HRSgicGZzICAlaSwgJWksICV4IiwgbURlcHRoV3JpdGVFbmFibGUsIG1EZXB0aFRlc3RFbmFibGUsIG1EZXB0aEZ1bmMpOwotCi0gICAgZ2xEZXB0aE1hc2sobURlcHRoV3JpdGVFbmFibGUpOwotICAgIGlmKG1EZXB0aFRlc3RFbmFibGUgfHwgbURlcHRoV3JpdGVFbmFibGUpIHsKLSAgICAgICAgZ2xFbmFibGUoR0xfREVQVEhfVEVTVCk7Ci0gICAgICAgIGdsRGVwdGhGdW5jKG1EZXB0aEZ1bmMpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGdsRGlzYWJsZShHTF9ERVBUSF9URVNUKTsKLSAgICB9Ci0KLSAgICBpZiAobURpdGhlckVuYWJsZSkgewotICAgICAgICBnbEVuYWJsZShHTF9ESVRIRVIpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGdsRGlzYWJsZShHTF9ESVRIRVIpOwotICAgIH0KLX0KLQotdm9pZCBQcm9ncmFtRnJhZ21lbnRTdG9yZTo6c2V0dXBHTDIoY29uc3QgQ29udGV4dCAqcnNjLCBQcm9ncmFtRnJhZ21lbnRTdG9yZVN0YXRlICpzdGF0ZSkKLXsKLSAgICBpZiAoc3RhdGUtPm1MYXN0LmdldCgpID09IHRoaXMpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBzdGF0ZS0+bUxhc3Quc2V0KHRoaXMpOwotCi0gICAgZ2xDb2xvck1hc2sobUNvbG9yUldyaXRlRW5hYmxlLAotICAgICAgICAgICAgICAgIG1Db2xvckdXcml0ZUVuYWJsZSwKLSAgICAgICAgICAgICAgICBtQ29sb3JCV3JpdGVFbmFibGUsCi0gICAgICAgICAgICAgICAgbUNvbG9yQVdyaXRlRW5hYmxlKTsKLSAgICBpZiAobUJsZW5kRW5hYmxlKSB7Ci0gICAgICAgIGdsRW5hYmxlKEdMX0JMRU5EKTsKLSAgICAgICAgZ2xCbGVuZEZ1bmMobUJsZW5kU3JjLCBtQmxlbmREc3QpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGdsRGlzYWJsZShHTF9CTEVORCk7Ci0gICAgfQotCi0gICAgLy9MT0dFKCJwZnMgICVpLCAlaSwgJXgiLCBtRGVwdGhXcml0ZUVuYWJsZSwgbURlcHRoVGVzdEVuYWJsZSwgbURlcHRoRnVuYyk7Ci0KLSAgICBnbERlcHRoTWFzayhtRGVwdGhXcml0ZUVuYWJsZSk7Ci0gICAgaWYobURlcHRoVGVzdEVuYWJsZSB8fCBtRGVwdGhXcml0ZUVuYWJsZSkgewotICAgICAgICBnbEVuYWJsZShHTF9ERVBUSF9URVNUKTsKLSAgICAgICAgZ2xEZXB0aEZ1bmMobURlcHRoRnVuYyk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgZ2xEaXNhYmxlKEdMX0RFUFRIX1RFU1QpOwotICAgIH0KLQotICAgIGlmIChtRGl0aGVyRW5hYmxlKSB7Ci0gICAgICAgIGdsRW5hYmxlKEdMX0RJVEhFUik7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgZ2xEaXNhYmxlKEdMX0RJVEhFUik7Ci0gICAgfQotfQotCi0KLXZvaWQgUHJvZ3JhbUZyYWdtZW50U3RvcmU6OnNldERpdGhlckVuYWJsZShib29sIGVuYWJsZSkKLXsKLSAgICBtRGl0aGVyRW5hYmxlID0gZW5hYmxlOwotfQotCi12b2lkIFByb2dyYW1GcmFnbWVudFN0b3JlOjpzZXREZXB0aEZ1bmMoUnNEZXB0aEZ1bmMgZnVuYykKLXsKLSAgICBtRGVwdGhUZXN0RW5hYmxlID0gdHJ1ZTsKLQotICAgIHN3aXRjaChmdW5jKSB7Ci0gICAgY2FzZSBSU19ERVBUSF9GVU5DX0FMV0FZUzoKLSAgICAgICAgbURlcHRoVGVzdEVuYWJsZSA9IGZhbHNlOwotICAgICAgICBtRGVwdGhGdW5jID0gR0xfQUxXQVlTOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIFJTX0RFUFRIX0ZVTkNfTEVTUzoKLSAgICAgICAgbURlcHRoRnVuYyA9IEdMX0xFU1M7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgUlNfREVQVEhfRlVOQ19MRVFVQUw6Ci0gICAgICAgIG1EZXB0aEZ1bmMgPSBHTF9MRVFVQUw7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgUlNfREVQVEhfRlVOQ19HUkVBVEVSOgotICAgICAgICBtRGVwdGhGdW5jID0gR0xfR1JFQVRFUjsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBSU19ERVBUSF9GVU5DX0dFUVVBTDoKLSAgICAgICAgbURlcHRoRnVuYyA9IEdMX0dFUVVBTDsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBSU19ERVBUSF9GVU5DX0VRVUFMOgotICAgICAgICBtRGVwdGhGdW5jID0gR0xfRVFVQUw7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgUlNfREVQVEhfRlVOQ19OT1RFUVVBTDoKLSAgICAgICAgbURlcHRoRnVuYyA9IEdMX05PVEVRVUFMOwotICAgICAgICBicmVhazsKLSAgICB9Ci19Ci0KLXZvaWQgUHJvZ3JhbUZyYWdtZW50U3RvcmU6OnNldERlcHRoTWFzayhib29sIG1hc2spCi17Ci0gICAgbURlcHRoV3JpdGVFbmFibGUgPSBtYXNrOwotfQotCi12b2lkIFByb2dyYW1GcmFnbWVudFN0b3JlOjpzZXRCbGVuZEZ1bmMoUnNCbGVuZFNyY0Z1bmMgc3JjLCBSc0JsZW5kRHN0RnVuYyBkc3QpCi17Ci0gICAgbUJsZW5kRW5hYmxlID0gdHJ1ZTsKLSAgICBpZiAoKHNyYyA9PSBSU19CTEVORF9TUkNfT05FKSAmJgotICAgICAgICAoZHN0ID09IFJTX0JMRU5EX0RTVF9aRVJPKSkgewotICAgICAgICBtQmxlbmRFbmFibGUgPSBmYWxzZTsKLSAgICB9Ci0KLSAgICBzd2l0Y2goc3JjKSB7Ci0gICAgY2FzZSBSU19CTEVORF9TUkNfWkVSTzoKLSAgICAgICAgbUJsZW5kU3JjID0gR0xfWkVSTzsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBSU19CTEVORF9TUkNfT05FOgotICAgICAgICBtQmxlbmRTcmMgPSBHTF9PTkU7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgUlNfQkxFTkRfU1JDX0RTVF9DT0xPUjoKLSAgICAgICAgbUJsZW5kU3JjID0gR0xfRFNUX0NPTE9SOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIFJTX0JMRU5EX1NSQ19PTkVfTUlOVVNfRFNUX0NPTE9SOgotICAgICAgICBtQmxlbmRTcmMgPSBHTF9PTkVfTUlOVVNfRFNUX0NPTE9SOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIFJTX0JMRU5EX1NSQ19TUkNfQUxQSEE6Ci0gICAgICAgIG1CbGVuZFNyYyA9IEdMX1NSQ19BTFBIQTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBSU19CTEVORF9TUkNfT05FX01JTlVTX1NSQ19BTFBIQToKLSAgICAgICAgbUJsZW5kU3JjID0gR0xfT05FX01JTlVTX1NSQ19BTFBIQTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBSU19CTEVORF9TUkNfRFNUX0FMUEhBOgotICAgICAgICBtQmxlbmRTcmMgPSBHTF9EU1RfQUxQSEE7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgUlNfQkxFTkRfU1JDX09ORV9NSU5VU19EU1RfQUxQSEE6Ci0gICAgICAgIG1CbGVuZFNyYyA9IEdMX09ORV9NSU5VU19EU1RfQUxQSEE7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgUlNfQkxFTkRfU1JDX1NSQ19BTFBIQV9TQVRVUkFURToKLSAgICAgICAgbUJsZW5kU3JjID0gR0xfU1JDX0FMUEhBX1NBVFVSQVRFOwotICAgICAgICBicmVhazsKLSAgICB9Ci0KLSAgICBzd2l0Y2goZHN0KSB7Ci0gICAgY2FzZSBSU19CTEVORF9EU1RfWkVSTzoKLSAgICAgICAgbUJsZW5kRHN0ID0gR0xfWkVSTzsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBSU19CTEVORF9EU1RfT05FOgotICAgICAgICBtQmxlbmREc3QgPSBHTF9PTkU7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgUlNfQkxFTkRfRFNUX1NSQ19DT0xPUjoKLSAgICAgICAgbUJsZW5kRHN0ID0gR0xfU1JDX0NPTE9SOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIFJTX0JMRU5EX0RTVF9PTkVfTUlOVVNfU1JDX0NPTE9SOgotICAgICAgICBtQmxlbmREc3QgPSBHTF9PTkVfTUlOVVNfU1JDX0NPTE9SOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIFJTX0JMRU5EX0RTVF9TUkNfQUxQSEE6Ci0gICAgICAgIG1CbGVuZERzdCA9IEdMX1NSQ19BTFBIQTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBSU19CTEVORF9EU1RfT05FX01JTlVTX1NSQ19BTFBIQToKLSAgICAgICAgbUJsZW5kRHN0ID0gR0xfT05FX01JTlVTX1NSQ19BTFBIQTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBSU19CTEVORF9EU1RfRFNUX0FMUEhBOgotICAgICAgICBtQmxlbmREc3QgPSBHTF9EU1RfQUxQSEE7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgUlNfQkxFTkRfRFNUX09ORV9NSU5VU19EU1RfQUxQSEE6Ci0gICAgICAgIG1CbGVuZERzdCA9IEdMX09ORV9NSU5VU19EU1RfQUxQSEE7Ci0gICAgICAgIGJyZWFrOwotICAgIH0KLX0KLQotdm9pZCBQcm9ncmFtRnJhZ21lbnRTdG9yZTo6c2V0Q29sb3JNYXNrKGJvb2wgciwgYm9vbCBnLCBib29sIGIsIGJvb2wgYSkKLXsKLSAgICBtQ29sb3JSV3JpdGVFbmFibGUgPSByOwotICAgIG1Db2xvckdXcml0ZUVuYWJsZSA9IGc7Ci0gICAgbUNvbG9yQldyaXRlRW5hYmxlID0gYjsKLSAgICBtQ29sb3JBV3JpdGVFbmFibGUgPSBhOwotfQotCi0KLVByb2dyYW1GcmFnbWVudFN0b3JlU3RhdGU6OlByb2dyYW1GcmFnbWVudFN0b3JlU3RhdGUoKQotewotICAgIG1QRlMgPSBOVUxMOwotfQotCi1Qcm9ncmFtRnJhZ21lbnRTdG9yZVN0YXRlOjp+UHJvZ3JhbUZyYWdtZW50U3RvcmVTdGF0ZSgpCi17Ci0gICAgZGVsZXRlIG1QRlM7Ci0KLX0KLQotdm9pZCBQcm9ncmFtRnJhZ21lbnRTdG9yZVN0YXRlOjppbml0KENvbnRleHQgKnJzYywgaW50MzJfdCB3LCBpbnQzMl90IGgpCi17Ci0gICAgUHJvZ3JhbUZyYWdtZW50U3RvcmUgKnBmcyA9IG5ldyBQcm9ncmFtRnJhZ21lbnRTdG9yZShyc2MpOwotICAgIG1EZWZhdWx0LnNldChwZnMpOwotfQotCi12b2lkIFByb2dyYW1GcmFnbWVudFN0b3JlU3RhdGU6OmRlaW5pdChDb250ZXh0ICpyc2MpCi17Ci0gICAgbURlZmF1bHQuY2xlYXIoKTsKLSAgICBtTGFzdC5jbGVhcigpOwotfQotCi0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLW5hbWVzcGFjZSByZW5kZXJzY3JpcHQgewotCi12b2lkIHJzaV9Qcm9ncmFtRnJhZ21lbnRTdG9yZUJlZ2luKENvbnRleHQgKiByc2MsIFJzRWxlbWVudCBpbiwgUnNFbGVtZW50IG91dCkKLXsKLSAgICBkZWxldGUgcnNjLT5tU3RhdGVGcmFnbWVudFN0b3JlLm1QRlM7Ci0gICAgcnNjLT5tU3RhdGVGcmFnbWVudFN0b3JlLm1QRlMgPSBuZXcgUHJvZ3JhbUZyYWdtZW50U3RvcmUocnNjKTsKLQotfQotCi12b2lkIHJzaV9Qcm9ncmFtRnJhZ21lbnRTdG9yZURlcHRoRnVuYyhDb250ZXh0ICpyc2MsIFJzRGVwdGhGdW5jIGZ1bmMpCi17Ci0gICAgcnNjLT5tU3RhdGVGcmFnbWVudFN0b3JlLm1QRlMtPnNldERlcHRoRnVuYyhmdW5jKTsKLX0KLQotdm9pZCByc2lfUHJvZ3JhbUZyYWdtZW50U3RvcmVEZXB0aE1hc2soQ29udGV4dCAqcnNjLCBib29sIG1hc2spCi17Ci0gICAgcnNjLT5tU3RhdGVGcmFnbWVudFN0b3JlLm1QRlMtPnNldERlcHRoTWFzayhtYXNrKTsKLX0KLQotdm9pZCByc2lfUHJvZ3JhbUZyYWdtZW50U3RvcmVDb2xvck1hc2soQ29udGV4dCAqcnNjLCBib29sIHIsIGJvb2wgZywgYm9vbCBiLCBib29sIGEpCi17Ci0gICAgcnNjLT5tU3RhdGVGcmFnbWVudFN0b3JlLm1QRlMtPnNldENvbG9yTWFzayhyLCBnLCBiLCBhKTsKLX0KLQotdm9pZCByc2lfUHJvZ3JhbUZyYWdtZW50U3RvcmVCbGVuZEZ1bmMoQ29udGV4dCAqcnNjLCBSc0JsZW5kU3JjRnVuYyBzcmMsIFJzQmxlbmREc3RGdW5jIGRzdCkKLXsKLSAgICByc2MtPm1TdGF0ZUZyYWdtZW50U3RvcmUubVBGUy0+c2V0QmxlbmRGdW5jKHNyYywgZHN0KTsKLX0KLQotUnNQcm9ncmFtRnJhZ21lbnRTdG9yZSByc2lfUHJvZ3JhbUZyYWdtZW50U3RvcmVDcmVhdGUoQ29udGV4dCAqcnNjKQotewotICAgIFByb2dyYW1GcmFnbWVudFN0b3JlICpwZnMgPSByc2MtPm1TdGF0ZUZyYWdtZW50U3RvcmUubVBGUzsKLSAgICBwZnMtPmluY1VzZXJSZWYoKTsKLSAgICByc2MtPm1TdGF0ZUZyYWdtZW50U3RvcmUubVBGUyA9IDA7Ci0gICAgcmV0dXJuIHBmczsKLX0KLQotdm9pZCByc2lfUHJvZ3JhbUZyYWdtZW50U3RvcmVEaXRoZXIoQ29udGV4dCAqcnNjLCBib29sIGVuYWJsZSkKLXsKLSAgICByc2MtPm1TdGF0ZUZyYWdtZW50U3RvcmUubVBGUy0+c2V0RGl0aGVyRW5hYmxlKGVuYWJsZSk7Ci19Ci0KLQotfQotfQpkaWZmIC0tZ2l0IGEvbGlicy9ycy9yc1Byb2dyYW1GcmFnbWVudFN0b3JlLmggYi9saWJzL3JzL3JzUHJvZ3JhbUZyYWdtZW50U3RvcmUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzQxMmM5OS4uMDAwMDAwMAotLS0gYS9saWJzL3JzL3JzUHJvZ3JhbUZyYWdtZW50U3RvcmUuaAorKysgL2Rldi9udWxsCkBAIC0xLDg0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIEFORFJPSURfUlNfUFJPR1JBTV9GUkFHTUVOVF9TVE9SRV9ICi0jZGVmaW5lIEFORFJPSURfUlNfUFJPR1JBTV9GUkFHTUVOVF9TVE9SRV9ICi0KLSNpbmNsdWRlICJyc1Byb2dyYW0uaCIKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci1uYW1lc3BhY2UgcmVuZGVyc2NyaXB0IHsKLQotY2xhc3MgUHJvZ3JhbUZyYWdtZW50U3RvcmVTdGF0ZTsKLQotY2xhc3MgUHJvZ3JhbUZyYWdtZW50U3RvcmUgOiBwdWJsaWMgUHJvZ3JhbQotewotcHVibGljOgotICAgIFByb2dyYW1GcmFnbWVudFN0b3JlKENvbnRleHQgKik7Ci0gICAgdmlydHVhbCB+UHJvZ3JhbUZyYWdtZW50U3RvcmUoKTsKLQotICAgIHZpcnR1YWwgdm9pZCBzZXR1cEdMKGNvbnN0IENvbnRleHQgKiwgUHJvZ3JhbUZyYWdtZW50U3RvcmVTdGF0ZSAqKTsKLSAgICB2aXJ0dWFsIHZvaWQgc2V0dXBHTDIoY29uc3QgQ29udGV4dCAqLCBQcm9ncmFtRnJhZ21lbnRTdG9yZVN0YXRlICopOwotCi0gICAgdm9pZCBzZXREZXB0aEZ1bmMoUnNEZXB0aEZ1bmMpOwotICAgIHZvaWQgc2V0RGVwdGhNYXNrKGJvb2wpOwotCi0gICAgdm9pZCBzZXRCbGVuZEZ1bmMoUnNCbGVuZFNyY0Z1bmMgc3JjLCBSc0JsZW5kRHN0RnVuYyBkc3QpOwotICAgIHZvaWQgc2V0Q29sb3JNYXNrKGJvb2wsIGJvb2wsIGJvb2wsIGJvb2wpOwotCi0gICAgdm9pZCBzZXREaXRoZXJFbmFibGUoYm9vbCk7Ci0KLXByb3RlY3RlZDoKLSAgICBib29sIG1EaXRoZXJFbmFibGU7Ci0KLSAgICBib29sIG1CbGVuZEVuYWJsZTsKLSAgICBib29sIG1Db2xvclJXcml0ZUVuYWJsZTsKLSAgICBib29sIG1Db2xvckdXcml0ZUVuYWJsZTsKLSAgICBib29sIG1Db2xvckJXcml0ZUVuYWJsZTsKLSAgICBib29sIG1Db2xvckFXcml0ZUVuYWJsZTsKLSAgICBpbnQzMl90IG1CbGVuZFNyYzsKLSAgICBpbnQzMl90IG1CbGVuZERzdDsKLQotICAgIGJvb2wgbURlcHRoVGVzdEVuYWJsZTsKLSAgICBib29sIG1EZXB0aFdyaXRlRW5hYmxlOwotICAgIGludDMyX3QgbURlcHRoRnVuYzsKLQotICAgIGJvb2wgbVN0ZW5jaWxUZXN0RW5hYmxlOwotfTsKLQotY2xhc3MgUHJvZ3JhbUZyYWdtZW50U3RvcmVTdGF0ZQotewotcHVibGljOgotICAgIFByb2dyYW1GcmFnbWVudFN0b3JlU3RhdGUoKTsKLSAgICB+UHJvZ3JhbUZyYWdtZW50U3RvcmVTdGF0ZSgpOwotICAgIHZvaWQgaW5pdChDb250ZXh0ICpyc2MsIGludDMyX3QgdywgaW50MzJfdCBoKTsKLSAgICB2b2lkIGRlaW5pdChDb250ZXh0ICpyc2MpOwotCi0gICAgT2JqZWN0QmFzZVJlZjxQcm9ncmFtRnJhZ21lbnRTdG9yZT4gbURlZmF1bHQ7Ci0gICAgT2JqZWN0QmFzZVJlZjxQcm9ncmFtRnJhZ21lbnRTdG9yZT4gbUxhc3Q7Ci0KLQotICAgIFByb2dyYW1GcmFnbWVudFN0b3JlICptUEZTOwotfTsKLQotCi19Ci19Ci0jZW5kaWYKLQotCi0KZGlmZiAtLWdpdCBhL2xpYnMvcnMvcnNQcm9ncmFtUmFzdGVyLmNwcCBiL2xpYnMvcnMvcnNQcm9ncmFtUmFzdGVyLmNwcAppbmRleCAxMzg4N2QxLi41YjY5MzcwIDEwMDY0NAotLS0gYS9saWJzL3JzL3JzUHJvZ3JhbVJhc3Rlci5jcHAKKysrIGIvbGlicy9ycy9yc1Byb2dyYW1SYXN0ZXIuY3BwCkBAIC0xNCwxMSArMTQsMTcgQEAKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKKyNpZm5kZWYgQU5EUk9JRF9SU19CVUlMRF9GT1JfSE9TVAogI2luY2x1ZGUgInJzQ29udGV4dC5oIgotI2luY2x1ZGUgInJzUHJvZ3JhbVJhc3Rlci5oIgotCiAjaW5jbHVkZSA8R0xFUy9nbC5oPgogI2luY2x1ZGUgPEdMRVMvZ2xleHQuaD4KKyNlbHNlCisjaW5jbHVkZSAicnNDb250ZXh0SG9zdFN0dWIuaCIKKyNpbmNsdWRlIDxPcGVuR0wvZ2wuaD4KKyNpbmNsdWRlIDxPcGVuR2wvZ2xleHQuaD4KKyNlbmRpZiAvL0FORFJPSURfUlNfQlVJTERfRk9SX0hPU1QKKworI2luY2x1ZGUgInJzUHJvZ3JhbVJhc3Rlci5oIgogCiB1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKIHVzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOjpyZW5kZXJzY3JpcHQ7CkBAIC0zNSw5ICs0MSw4IEBACiAgICAgbVBvaW50U21vb3RoID0gcG9pbnRTbW9vdGg7CiAgICAgbUxpbmVTbW9vdGggPSBsaW5lU21vb3RoOwogICAgIG1Qb2ludFNwcml0ZSA9IHBvaW50U3ByaXRlOwotCi0gICAgbVBvaW50U2l6ZSA9IDEuMGY7CiAgICAgbUxpbmVXaWR0aCA9IDEuMGY7CisgICAgbUN1bGwgPSBSU19DVUxMX0JBQ0s7CiB9CiAKIFByb2dyYW1SYXN0ZXI6On5Qcm9ncmFtUmFzdGVyKCkKQEAgLTQ3LDIxICs1MiwyMyBAQAogdm9pZCBQcm9ncmFtUmFzdGVyOjpzZXRMaW5lV2lkdGgoZmxvYXQgcykKIHsKICAgICBtTGluZVdpZHRoID0gczsKKyAgICBtRGlydHkgPSB0cnVlOwogfQogCi12b2lkIFByb2dyYW1SYXN0ZXI6OnNldFBvaW50U2l6ZShmbG9hdCBzKQordm9pZCBQcm9ncmFtUmFzdGVyOjpzZXRDdWxsTW9kZShSc0N1bGxNb2RlIG1vZGUpCiB7Ci0gICAgbVBvaW50U2l6ZSA9IHM7CisgICAgbUN1bGwgPSBtb2RlOworICAgIG1EaXJ0eSA9IHRydWU7CiB9CiAKIHZvaWQgUHJvZ3JhbVJhc3Rlcjo6c2V0dXBHTChjb25zdCBDb250ZXh0ICpyc2MsIFByb2dyYW1SYXN0ZXJTdGF0ZSAqc3RhdGUpCiB7Ci0gICAgaWYgKHN0YXRlLT5tTGFzdC5nZXQoKSA9PSB0aGlzKSB7CisgICAgaWYgKHN0YXRlLT5tTGFzdC5nZXQoKSA9PSB0aGlzICYmICFtRGlydHkpIHsKICAgICAgICAgcmV0dXJuOwogICAgIH0KICAgICBzdGF0ZS0+bUxhc3Quc2V0KHRoaXMpOworICAgIG1EaXJ0eSA9IGZhbHNlOwogCi0gICAgZ2xQb2ludFNpemUobVBvaW50U2l6ZSk7CiAgICAgaWYgKG1Qb2ludFNtb290aCkgewogICAgICAgICBnbEVuYWJsZShHTF9QT0lOVF9TTU9PVEgpOwogICAgIH0gZWxzZSB7CkBAIC03NiwyMyArODMsNjIgQEAKICAgICB9CiAKICAgICBpZiAocnNjLT5jaGVja1ZlcnNpb24xXzEoKSkgeworI2lmbmRlZiBBTkRST0lEX1JTX0JVSUxEX0ZPUl9IT1NUCiAgICAgICAgIGlmIChtUG9pbnRTcHJpdGUpIHsKICAgICAgICAgICAgIGdsRW5hYmxlKEdMX1BPSU5UX1NQUklURV9PRVMpOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgZ2xEaXNhYmxlKEdMX1BPSU5UX1NQUklURV9PRVMpOwogICAgICAgICB9CisjZW5kaWYgLy9BTkRST0lEX1JTX0JVSUxEX0ZPUl9IT1NUCisgICAgfQorCisgICAgc3dpdGNoKG1DdWxsKSB7CisgICAgICAgIGNhc2UgUlNfQ1VMTF9CQUNLOgorICAgICAgICAgICAgZ2xFbmFibGUoR0xfQ1VMTF9GQUNFKTsKKyAgICAgICAgICAgIGdsQ3VsbEZhY2UoR0xfQkFDSyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBSU19DVUxMX0ZST05UOgorICAgICAgICAgICAgZ2xFbmFibGUoR0xfQ1VMTF9GQUNFKTsKKyAgICAgICAgICAgIGdsQ3VsbEZhY2UoR0xfRlJPTlQpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgUlNfQ1VMTF9OT05FOgorICAgICAgICAgICAgZ2xEaXNhYmxlKEdMX0NVTExfRkFDRSk7CisgICAgICAgICAgICBicmVhazsKICAgICB9CiB9CiAKIHZvaWQgUHJvZ3JhbVJhc3Rlcjo6c2V0dXBHTDIoY29uc3QgQ29udGV4dCAqcnNjLCBQcm9ncmFtUmFzdGVyU3RhdGUgKnN0YXRlKQogewotICAgIGlmIChzdGF0ZS0+bUxhc3QuZ2V0KCkgPT0gdGhpcykgeworICAgIGlmIChzdGF0ZS0+bUxhc3QuZ2V0KCkgPT0gdGhpcyAmJiAhbURpcnR5KSB7CiAgICAgICAgIHJldHVybjsKICAgICB9CiAgICAgc3RhdGUtPm1MYXN0LnNldCh0aGlzKTsKKyAgICBtRGlydHkgPSBmYWxzZTsKKworICAgIHN3aXRjaChtQ3VsbCkgeworICAgICAgICBjYXNlIFJTX0NVTExfQkFDSzoKKyAgICAgICAgICAgIGdsRW5hYmxlKEdMX0NVTExfRkFDRSk7CisgICAgICAgICAgICBnbEN1bGxGYWNlKEdMX0JBQ0spOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgUlNfQ1VMTF9GUk9OVDoKKyAgICAgICAgICAgIGdsRW5hYmxlKEdMX0NVTExfRkFDRSk7CisgICAgICAgICAgICBnbEN1bGxGYWNlKEdMX0ZST05UKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFJTX0NVTExfTk9ORToKKyAgICAgICAgICAgIGdsRGlzYWJsZShHTF9DVUxMX0ZBQ0UpOworICAgICAgICAgICAgYnJlYWs7CisgICAgfQogfQogCit2b2lkIFByb2dyYW1SYXN0ZXI6OnNlcmlhbGl6ZShPU3RyZWFtICpzdHJlYW0pIGNvbnN0Cit7CiAKK30KKworUHJvZ3JhbVJhc3RlciAqUHJvZ3JhbVJhc3Rlcjo6Y3JlYXRlRnJvbVN0cmVhbShDb250ZXh0ICpyc2MsIElTdHJlYW0gKnN0cmVhbSkKK3sKKyAgICByZXR1cm4gTlVMTDsKK30KIAogUHJvZ3JhbVJhc3RlclN0YXRlOjpQcm9ncmFtUmFzdGVyU3RhdGUoKQogewpAQCAtMTAyLDcgKzE0OCw3IEBACiB7CiB9CiAKLXZvaWQgUHJvZ3JhbVJhc3RlclN0YXRlOjppbml0KENvbnRleHQgKnJzYywgaW50MzJfdCB3LCBpbnQzMl90IGgpCit2b2lkIFByb2dyYW1SYXN0ZXJTdGF0ZTo6aW5pdChDb250ZXh0ICpyc2MpCiB7CiAgICAgUHJvZ3JhbVJhc3RlciAqcHIgPSBuZXcgUHJvZ3JhbVJhc3Rlcihyc2MsIGZhbHNlLCBmYWxzZSwgZmFsc2UpOwogICAgIG1EZWZhdWx0LnNldChwcik7CkBAIC0xMTgsNyArMTY0LDcgQEAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIG5hbWVzcGFjZSByZW5kZXJzY3JpcHQgewogCi1Sc1Byb2dyYW1SYXN0ZXIgcnNpX1Byb2dyYW1SYXN0ZXJDcmVhdGUoQ29udGV4dCAqIHJzYywgUnNFbGVtZW50IGluLCBSc0VsZW1lbnQgb3V0LAorUnNQcm9ncmFtUmFzdGVyIHJzaV9Qcm9ncmFtUmFzdGVyQ3JlYXRlKENvbnRleHQgKiByc2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgcG9pbnRTbW9vdGgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgbGluZVNtb290aCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBwb2ludFNwcml0ZSkKQEAgLTEzMSwxOCArMTc3LDE4IEBACiAgICAgcmV0dXJuIHByOwogfQogCi12b2lkIHJzaV9Qcm9ncmFtUmFzdGVyU2V0UG9pbnRTaXplKENvbnRleHQgKiByc2MsIFJzUHJvZ3JhbVJhc3RlciB2cHIsIGZsb2F0IHMpCi17Ci0gICAgUHJvZ3JhbVJhc3RlciAqcHIgPSBzdGF0aWNfY2FzdDxQcm9ncmFtUmFzdGVyICo+KHZwcik7Ci0gICAgcHItPnNldFBvaW50U2l6ZShzKTsKLX0KLQogdm9pZCByc2lfUHJvZ3JhbVJhc3RlclNldExpbmVXaWR0aChDb250ZXh0ICogcnNjLCBSc1Byb2dyYW1SYXN0ZXIgdnByLCBmbG9hdCBzKQogewogICAgIFByb2dyYW1SYXN0ZXIgKnByID0gc3RhdGljX2Nhc3Q8UHJvZ3JhbVJhc3RlciAqPih2cHIpOwogICAgIHByLT5zZXRMaW5lV2lkdGgocyk7CiB9CiAKK3ZvaWQgcnNpX1Byb2dyYW1SYXN0ZXJTZXRDdWxsTW9kZShDb250ZXh0ICogcnNjLCBSc1Byb2dyYW1SYXN0ZXIgdnByLCBSc0N1bGxNb2RlIG1vZGUpCit7CisgICAgUHJvZ3JhbVJhc3RlciAqcHIgPSBzdGF0aWNfY2FzdDxQcm9ncmFtUmFzdGVyICo+KHZwcik7CisgICAgcHItPnNldEN1bGxNb2RlKG1vZGUpOworfQorCiAKIH0KIH0KZGlmZiAtLWdpdCBhL2xpYnMvcnMvcnNQcm9ncmFtUmFzdGVyLmggYi9saWJzL3JzL3JzUHJvZ3JhbVJhc3Rlci5oCmluZGV4IGMzYTljOTAuLjgwMWFiMmEgMTAwNjQ0Ci0tLSBhL2xpYnMvcnMvcnNQcm9ncmFtUmFzdGVyLmgKKysrIGIvbGlicy9ycy9yc1Byb2dyYW1SYXN0ZXIuaApAQCAtMzYsMTkgKzM2LDE5IEBACiAKICAgICB2aXJ0dWFsIHZvaWQgc2V0dXBHTChjb25zdCBDb250ZXh0ICosIFByb2dyYW1SYXN0ZXJTdGF0ZSAqKTsKICAgICB2aXJ0dWFsIHZvaWQgc2V0dXBHTDIoY29uc3QgQ29udGV4dCAqLCBQcm9ncmFtUmFzdGVyU3RhdGUgKik7CisgICAgdmlydHVhbCB2b2lkIHNlcmlhbGl6ZShPU3RyZWFtICpzdHJlYW0pIGNvbnN0OworICAgIHZpcnR1YWwgUnNBM0RDbGFzc0lEIGdldENsYXNzSWQoKSBjb25zdCB7IHJldHVybiBSU19BM0RfQ0xBU1NfSURfUFJPR1JBTV9SQVNURVI7IH0KKyAgICBzdGF0aWMgUHJvZ3JhbVJhc3RlciAqY3JlYXRlRnJvbVN0cmVhbShDb250ZXh0ICpyc2MsIElTdHJlYW0gKnN0cmVhbSk7CiAKICAgICB2b2lkIHNldExpbmVXaWR0aChmbG9hdCB3KTsKLSAgICB2b2lkIHNldFBvaW50U2l6ZShmbG9hdCBzKTsKKyAgICB2b2lkIHNldEN1bGxNb2RlKFJzQ3VsbE1vZGUgbW9kZSk7CiAKIHByb3RlY3RlZDoKICAgICBib29sIG1Qb2ludFNtb290aDsKICAgICBib29sIG1MaW5lU21vb3RoOwogICAgIGJvb2wgbVBvaW50U3ByaXRlOwotCi0gICAgZmxvYXQgbVBvaW50U2l6ZTsKICAgICBmbG9hdCBtTGluZVdpZHRoOwotCi0KKyAgICBSc0N1bGxNb2RlIG1DdWxsOwogfTsKIAogY2xhc3MgUHJvZ3JhbVJhc3RlclN0YXRlCkBAIC01Niw3ICs1Niw3IEBACiBwdWJsaWM6CiAgICAgUHJvZ3JhbVJhc3RlclN0YXRlKCk7CiAgICAgflByb2dyYW1SYXN0ZXJTdGF0ZSgpOwotICAgIHZvaWQgaW5pdChDb250ZXh0ICpyc2MsIGludDMyX3QgdywgaW50MzJfdCBoKTsKKyAgICB2b2lkIGluaXQoQ29udGV4dCAqcnNjKTsKICAgICB2b2lkIGRlaW5pdChDb250ZXh0ICpyc2MpOwogCiAgICAgT2JqZWN0QmFzZVJlZjxQcm9ncmFtUmFzdGVyPiBtRGVmYXVsdDsKZGlmZiAtLWdpdCBhL2xpYnMvcnMvcnNQcm9ncmFtU3RvcmUuY3BwIGIvbGlicy9ycy9yc1Byb2dyYW1TdG9yZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTc0MWMwYQotLS0gL2Rldi9udWxsCisrKyBiL2xpYnMvcnMvcnNQcm9ncmFtU3RvcmUuY3BwCkBAIC0wLDAgKzEsMzI1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX1JTX0JVSUxEX0ZPUl9IT1NUCisjaW5jbHVkZSAicnNDb250ZXh0LmgiCisjaW5jbHVkZSA8R0xFUy9nbC5oPgorI2luY2x1ZGUgPEdMRVMvZ2xleHQuaD4KKyNlbHNlCisjaW5jbHVkZSAicnNDb250ZXh0SG9zdFN0dWIuaCIKKyNpbmNsdWRlIDxPcGVuR0wvZ2wuaD4KKyNpbmNsdWRlIDxPcGVuR2wvZ2xleHQuaD4KKyNlbmRpZiAvL0FORFJPSURfUlNfQlVJTERfRk9SX0hPU1QKKworI2luY2x1ZGUgInJzUHJvZ3JhbVN0b3JlLmgiCisKK3VzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOwordXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ6OnJlbmRlcnNjcmlwdDsKKworCitQcm9ncmFtU3RvcmU6OlByb2dyYW1TdG9yZShDb250ZXh0ICpyc2MpIDoKKyAgICBQcm9ncmFtKHJzYykKK3sKKyAgICBtQWxsb2NGaWxlID0gX19GSUxFX187CisgICAgbUFsbG9jTGluZSA9IF9fTElORV9fOworICAgIG1EaXRoZXJFbmFibGUgPSB0cnVlOworICAgIG1CbGVuZEVuYWJsZSA9IGZhbHNlOworICAgIG1Db2xvclJXcml0ZUVuYWJsZSA9IHRydWU7CisgICAgbUNvbG9yR1dyaXRlRW5hYmxlID0gdHJ1ZTsKKyAgICBtQ29sb3JCV3JpdGVFbmFibGUgPSB0cnVlOworICAgIG1Db2xvckFXcml0ZUVuYWJsZSA9IHRydWU7CisgICAgbUJsZW5kU3JjID0gR0xfT05FOworICAgIG1CbGVuZERzdCA9IEdMX1pFUk87CisKKworICAgIG1EZXB0aFRlc3RFbmFibGUgPSBmYWxzZTsKKyAgICBtRGVwdGhXcml0ZUVuYWJsZSA9IHRydWU7CisgICAgbURlcHRoRnVuYyA9IEdMX0xFU1M7CisKKworfQorCitQcm9ncmFtU3RvcmU6On5Qcm9ncmFtU3RvcmUoKQoreworfQorCit2b2lkIFByb2dyYW1TdG9yZTo6c2V0dXBHTChjb25zdCBDb250ZXh0ICpyc2MsIFByb2dyYW1TdG9yZVN0YXRlICpzdGF0ZSkKK3sKKyAgICBpZiAoc3RhdGUtPm1MYXN0LmdldCgpID09IHRoaXMpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBzdGF0ZS0+bUxhc3Quc2V0KHRoaXMpOworCisgICAgZ2xDb2xvck1hc2sobUNvbG9yUldyaXRlRW5hYmxlLAorICAgICAgICAgICAgICAgIG1Db2xvckdXcml0ZUVuYWJsZSwKKyAgICAgICAgICAgICAgICBtQ29sb3JCV3JpdGVFbmFibGUsCisgICAgICAgICAgICAgICAgbUNvbG9yQVdyaXRlRW5hYmxlKTsKKyAgICBpZiAobUJsZW5kRW5hYmxlKSB7CisgICAgICAgIGdsRW5hYmxlKEdMX0JMRU5EKTsKKyAgICAgICAgZ2xCbGVuZEZ1bmMobUJsZW5kU3JjLCBtQmxlbmREc3QpOworICAgIH0gZWxzZSB7CisgICAgICAgIGdsRGlzYWJsZShHTF9CTEVORCk7CisgICAgfQorCisgICAgLy9MT0dFKCJwZnMgICVpLCAlaSwgJXgiLCBtRGVwdGhXcml0ZUVuYWJsZSwgbURlcHRoVGVzdEVuYWJsZSwgbURlcHRoRnVuYyk7CisKKyAgICBnbERlcHRoTWFzayhtRGVwdGhXcml0ZUVuYWJsZSk7CisgICAgaWYobURlcHRoVGVzdEVuYWJsZSB8fCBtRGVwdGhXcml0ZUVuYWJsZSkgeworICAgICAgICBnbEVuYWJsZShHTF9ERVBUSF9URVNUKTsKKyAgICAgICAgZ2xEZXB0aEZ1bmMobURlcHRoRnVuYyk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZ2xEaXNhYmxlKEdMX0RFUFRIX1RFU1QpOworICAgIH0KKworICAgIGlmIChtRGl0aGVyRW5hYmxlKSB7CisgICAgICAgIGdsRW5hYmxlKEdMX0RJVEhFUik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZ2xEaXNhYmxlKEdMX0RJVEhFUik7CisgICAgfQorfQorCit2b2lkIFByb2dyYW1TdG9yZTo6c2V0dXBHTDIoY29uc3QgQ29udGV4dCAqcnNjLCBQcm9ncmFtU3RvcmVTdGF0ZSAqc3RhdGUpCit7CisgICAgaWYgKHN0YXRlLT5tTGFzdC5nZXQoKSA9PSB0aGlzKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgc3RhdGUtPm1MYXN0LnNldCh0aGlzKTsKKworICAgIGdsQ29sb3JNYXNrKG1Db2xvclJXcml0ZUVuYWJsZSwKKyAgICAgICAgICAgICAgICBtQ29sb3JHV3JpdGVFbmFibGUsCisgICAgICAgICAgICAgICAgbUNvbG9yQldyaXRlRW5hYmxlLAorICAgICAgICAgICAgICAgIG1Db2xvckFXcml0ZUVuYWJsZSk7CisgICAgaWYgKG1CbGVuZEVuYWJsZSkgeworICAgICAgICBnbEVuYWJsZShHTF9CTEVORCk7CisgICAgICAgIGdsQmxlbmRGdW5jKG1CbGVuZFNyYywgbUJsZW5kRHN0KTsKKyAgICB9IGVsc2UgeworICAgICAgICBnbERpc2FibGUoR0xfQkxFTkQpOworICAgIH0KKworICAgIC8vTE9HRSgicGZzICAlaSwgJWksICV4IiwgbURlcHRoV3JpdGVFbmFibGUsIG1EZXB0aFRlc3RFbmFibGUsIG1EZXB0aEZ1bmMpOworCisgICAgZ2xEZXB0aE1hc2sobURlcHRoV3JpdGVFbmFibGUpOworICAgIGlmKG1EZXB0aFRlc3RFbmFibGUgfHwgbURlcHRoV3JpdGVFbmFibGUpIHsKKyAgICAgICAgZ2xFbmFibGUoR0xfREVQVEhfVEVTVCk7CisgICAgICAgIGdsRGVwdGhGdW5jKG1EZXB0aEZ1bmMpOworICAgIH0gZWxzZSB7CisgICAgICAgIGdsRGlzYWJsZShHTF9ERVBUSF9URVNUKTsKKyAgICB9CisKKyAgICBpZiAobURpdGhlckVuYWJsZSkgeworICAgICAgICBnbEVuYWJsZShHTF9ESVRIRVIpOworICAgIH0gZWxzZSB7CisgICAgICAgIGdsRGlzYWJsZShHTF9ESVRIRVIpOworICAgIH0KK30KKworCit2b2lkIFByb2dyYW1TdG9yZTo6c2V0RGl0aGVyRW5hYmxlKGJvb2wgZW5hYmxlKQoreworICAgIG1EaXRoZXJFbmFibGUgPSBlbmFibGU7Cit9CisKK3ZvaWQgUHJvZ3JhbVN0b3JlOjpzZXJpYWxpemUoT1N0cmVhbSAqc3RyZWFtKSBjb25zdAoreworCit9CisKK1Byb2dyYW1TdG9yZSAqUHJvZ3JhbVN0b3JlOjpjcmVhdGVGcm9tU3RyZWFtKENvbnRleHQgKnJzYywgSVN0cmVhbSAqc3RyZWFtKQoreworICAgIHJldHVybiBOVUxMOworfQorCisKK3ZvaWQgUHJvZ3JhbVN0b3JlOjpzZXREZXB0aEZ1bmMoUnNEZXB0aEZ1bmMgZnVuYykKK3sKKyAgICBtRGVwdGhUZXN0RW5hYmxlID0gdHJ1ZTsKKworICAgIHN3aXRjaChmdW5jKSB7CisgICAgY2FzZSBSU19ERVBUSF9GVU5DX0FMV0FZUzoKKyAgICAgICAgbURlcHRoVGVzdEVuYWJsZSA9IGZhbHNlOworICAgICAgICBtRGVwdGhGdW5jID0gR0xfQUxXQVlTOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFJTX0RFUFRIX0ZVTkNfTEVTUzoKKyAgICAgICAgbURlcHRoRnVuYyA9IEdMX0xFU1M7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgUlNfREVQVEhfRlVOQ19MRVFVQUw6CisgICAgICAgIG1EZXB0aEZ1bmMgPSBHTF9MRVFVQUw7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgUlNfREVQVEhfRlVOQ19HUkVBVEVSOgorICAgICAgICBtRGVwdGhGdW5jID0gR0xfR1JFQVRFUjsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBSU19ERVBUSF9GVU5DX0dFUVVBTDoKKyAgICAgICAgbURlcHRoRnVuYyA9IEdMX0dFUVVBTDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBSU19ERVBUSF9GVU5DX0VRVUFMOgorICAgICAgICBtRGVwdGhGdW5jID0gR0xfRVFVQUw7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgUlNfREVQVEhfRlVOQ19OT1RFUVVBTDoKKyAgICAgICAgbURlcHRoRnVuYyA9IEdMX05PVEVRVUFMOworICAgICAgICBicmVhazsKKyAgICB9Cit9CisKK3ZvaWQgUHJvZ3JhbVN0b3JlOjpzZXREZXB0aE1hc2soYm9vbCBtYXNrKQoreworICAgIG1EZXB0aFdyaXRlRW5hYmxlID0gbWFzazsKK30KKwordm9pZCBQcm9ncmFtU3RvcmU6OnNldEJsZW5kRnVuYyhSc0JsZW5kU3JjRnVuYyBzcmMsIFJzQmxlbmREc3RGdW5jIGRzdCkKK3sKKyAgICBtQmxlbmRFbmFibGUgPSB0cnVlOworICAgIGlmICgoc3JjID09IFJTX0JMRU5EX1NSQ19PTkUpICYmCisgICAgICAgIChkc3QgPT0gUlNfQkxFTkRfRFNUX1pFUk8pKSB7CisgICAgICAgIG1CbGVuZEVuYWJsZSA9IGZhbHNlOworICAgIH0KKworICAgIHN3aXRjaChzcmMpIHsKKyAgICBjYXNlIFJTX0JMRU5EX1NSQ19aRVJPOgorICAgICAgICBtQmxlbmRTcmMgPSBHTF9aRVJPOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFJTX0JMRU5EX1NSQ19PTkU6CisgICAgICAgIG1CbGVuZFNyYyA9IEdMX09ORTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBSU19CTEVORF9TUkNfRFNUX0NPTE9SOgorICAgICAgICBtQmxlbmRTcmMgPSBHTF9EU1RfQ09MT1I7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgUlNfQkxFTkRfU1JDX09ORV9NSU5VU19EU1RfQ09MT1I6CisgICAgICAgIG1CbGVuZFNyYyA9IEdMX09ORV9NSU5VU19EU1RfQ09MT1I7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgUlNfQkxFTkRfU1JDX1NSQ19BTFBIQToKKyAgICAgICAgbUJsZW5kU3JjID0gR0xfU1JDX0FMUEhBOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFJTX0JMRU5EX1NSQ19PTkVfTUlOVVNfU1JDX0FMUEhBOgorICAgICAgICBtQmxlbmRTcmMgPSBHTF9PTkVfTUlOVVNfU1JDX0FMUEhBOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFJTX0JMRU5EX1NSQ19EU1RfQUxQSEE6CisgICAgICAgIG1CbGVuZFNyYyA9IEdMX0RTVF9BTFBIQTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBSU19CTEVORF9TUkNfT05FX01JTlVTX0RTVF9BTFBIQToKKyAgICAgICAgbUJsZW5kU3JjID0gR0xfT05FX01JTlVTX0RTVF9BTFBIQTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBSU19CTEVORF9TUkNfU1JDX0FMUEhBX1NBVFVSQVRFOgorICAgICAgICBtQmxlbmRTcmMgPSBHTF9TUkNfQUxQSEFfU0FUVVJBVEU7CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHN3aXRjaChkc3QpIHsKKyAgICBjYXNlIFJTX0JMRU5EX0RTVF9aRVJPOgorICAgICAgICBtQmxlbmREc3QgPSBHTF9aRVJPOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFJTX0JMRU5EX0RTVF9PTkU6CisgICAgICAgIG1CbGVuZERzdCA9IEdMX09ORTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBSU19CTEVORF9EU1RfU1JDX0NPTE9SOgorICAgICAgICBtQmxlbmREc3QgPSBHTF9TUkNfQ09MT1I7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgUlNfQkxFTkRfRFNUX09ORV9NSU5VU19TUkNfQ09MT1I6CisgICAgICAgIG1CbGVuZERzdCA9IEdMX09ORV9NSU5VU19TUkNfQ09MT1I7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgUlNfQkxFTkRfRFNUX1NSQ19BTFBIQToKKyAgICAgICAgbUJsZW5kRHN0ID0gR0xfU1JDX0FMUEhBOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFJTX0JMRU5EX0RTVF9PTkVfTUlOVVNfU1JDX0FMUEhBOgorICAgICAgICBtQmxlbmREc3QgPSBHTF9PTkVfTUlOVVNfU1JDX0FMUEhBOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFJTX0JMRU5EX0RTVF9EU1RfQUxQSEE6CisgICAgICAgIG1CbGVuZERzdCA9IEdMX0RTVF9BTFBIQTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBSU19CTEVORF9EU1RfT05FX01JTlVTX0RTVF9BTFBIQToKKyAgICAgICAgbUJsZW5kRHN0ID0gR0xfT05FX01JTlVTX0RTVF9BTFBIQTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorfQorCit2b2lkIFByb2dyYW1TdG9yZTo6c2V0Q29sb3JNYXNrKGJvb2wgciwgYm9vbCBnLCBib29sIGIsIGJvb2wgYSkKK3sKKyAgICBtQ29sb3JSV3JpdGVFbmFibGUgPSByOworICAgIG1Db2xvckdXcml0ZUVuYWJsZSA9IGc7CisgICAgbUNvbG9yQldyaXRlRW5hYmxlID0gYjsKKyAgICBtQ29sb3JBV3JpdGVFbmFibGUgPSBhOworfQorCisKK1Byb2dyYW1TdG9yZVN0YXRlOjpQcm9ncmFtU3RvcmVTdGF0ZSgpCit7CisgICAgbVBGUyA9IE5VTEw7Cit9CisKK1Byb2dyYW1TdG9yZVN0YXRlOjp+UHJvZ3JhbVN0b3JlU3RhdGUoKQoreworICAgIGRlbGV0ZSBtUEZTOworCit9CisKK3ZvaWQgUHJvZ3JhbVN0b3JlU3RhdGU6OmluaXQoQ29udGV4dCAqcnNjKQoreworICAgIFByb2dyYW1TdG9yZSAqcGZzID0gbmV3IFByb2dyYW1TdG9yZShyc2MpOworICAgIG1EZWZhdWx0LnNldChwZnMpOworfQorCit2b2lkIFByb2dyYW1TdG9yZVN0YXRlOjpkZWluaXQoQ29udGV4dCAqcnNjKQoreworICAgIG1EZWZhdWx0LmNsZWFyKCk7CisgICAgbUxhc3QuY2xlYXIoKTsKK30KKworCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgcmVuZGVyc2NyaXB0IHsKKwordm9pZCByc2lfUHJvZ3JhbVN0b3JlQmVnaW4oQ29udGV4dCAqIHJzYywgUnNFbGVtZW50IGluLCBSc0VsZW1lbnQgb3V0KQoreworICAgIGRlbGV0ZSByc2MtPm1TdGF0ZUZyYWdtZW50U3RvcmUubVBGUzsKKyAgICByc2MtPm1TdGF0ZUZyYWdtZW50U3RvcmUubVBGUyA9IG5ldyBQcm9ncmFtU3RvcmUocnNjKTsKKworfQorCit2b2lkIHJzaV9Qcm9ncmFtU3RvcmVEZXB0aEZ1bmMoQ29udGV4dCAqcnNjLCBSc0RlcHRoRnVuYyBmdW5jKQoreworICAgIHJzYy0+bVN0YXRlRnJhZ21lbnRTdG9yZS5tUEZTLT5zZXREZXB0aEZ1bmMoZnVuYyk7Cit9CisKK3ZvaWQgcnNpX1Byb2dyYW1TdG9yZURlcHRoTWFzayhDb250ZXh0ICpyc2MsIGJvb2wgbWFzaykKK3sKKyAgICByc2MtPm1TdGF0ZUZyYWdtZW50U3RvcmUubVBGUy0+c2V0RGVwdGhNYXNrKG1hc2spOworfQorCit2b2lkIHJzaV9Qcm9ncmFtU3RvcmVDb2xvck1hc2soQ29udGV4dCAqcnNjLCBib29sIHIsIGJvb2wgZywgYm9vbCBiLCBib29sIGEpCit7CisgICAgcnNjLT5tU3RhdGVGcmFnbWVudFN0b3JlLm1QRlMtPnNldENvbG9yTWFzayhyLCBnLCBiLCBhKTsKK30KKwordm9pZCByc2lfUHJvZ3JhbVN0b3JlQmxlbmRGdW5jKENvbnRleHQgKnJzYywgUnNCbGVuZFNyY0Z1bmMgc3JjLCBSc0JsZW5kRHN0RnVuYyBkc3QpCit7CisgICAgcnNjLT5tU3RhdGVGcmFnbWVudFN0b3JlLm1QRlMtPnNldEJsZW5kRnVuYyhzcmMsIGRzdCk7Cit9CisKK1JzUHJvZ3JhbVN0b3JlIHJzaV9Qcm9ncmFtU3RvcmVDcmVhdGUoQ29udGV4dCAqcnNjKQoreworICAgIFByb2dyYW1TdG9yZSAqcGZzID0gcnNjLT5tU3RhdGVGcmFnbWVudFN0b3JlLm1QRlM7CisgICAgcGZzLT5pbmNVc2VyUmVmKCk7CisgICAgcnNjLT5tU3RhdGVGcmFnbWVudFN0b3JlLm1QRlMgPSAwOworICAgIHJldHVybiBwZnM7Cit9CisKK3ZvaWQgcnNpX1Byb2dyYW1TdG9yZURpdGhlcihDb250ZXh0ICpyc2MsIGJvb2wgZW5hYmxlKQoreworICAgIHJzYy0+bVN0YXRlRnJhZ21lbnRTdG9yZS5tUEZTLT5zZXREaXRoZXJFbmFibGUoZW5hYmxlKTsKK30KKworCit9Cit9CmRpZmYgLS1naXQgYS9saWJzL3JzL3JzUHJvZ3JhbVN0b3JlLmggYi9saWJzL3JzL3JzUHJvZ3JhbVN0b3JlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmU4ZDc4ZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYnMvcnMvcnNQcm9ncmFtU3RvcmUuaApAQCAtMCwwICsxLDg5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX1JTX1BST0dSQU1fRlJBR01FTlRfU1RPUkVfSAorI2RlZmluZSBBTkRST0lEX1JTX1BST0dSQU1fRlJBR01FTlRfU1RPUkVfSAorCisjaW5jbHVkZSAicnNQcm9ncmFtLmgiCisjaW5jbHVkZSAicnNTdHJlYW0uaCIKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgcmVuZGVyc2NyaXB0IHsKKworY2xhc3MgUHJvZ3JhbVN0b3JlU3RhdGU7CisKK2NsYXNzIFByb2dyYW1TdG9yZSA6IHB1YmxpYyBQcm9ncmFtCit7CitwdWJsaWM6CisgICAgUHJvZ3JhbVN0b3JlKENvbnRleHQgKik7CisgICAgdmlydHVhbCB+UHJvZ3JhbVN0b3JlKCk7CisKKyAgICB2aXJ0dWFsIHZvaWQgc2V0dXBHTChjb25zdCBDb250ZXh0ICosIFByb2dyYW1TdG9yZVN0YXRlICopOworICAgIHZpcnR1YWwgdm9pZCBzZXR1cEdMMihjb25zdCBDb250ZXh0ICosIFByb2dyYW1TdG9yZVN0YXRlICopOworCisgICAgdm9pZCBzZXREZXB0aEZ1bmMoUnNEZXB0aEZ1bmMpOworICAgIHZvaWQgc2V0RGVwdGhNYXNrKGJvb2wpOworCisgICAgdm9pZCBzZXRCbGVuZEZ1bmMoUnNCbGVuZFNyY0Z1bmMgc3JjLCBSc0JsZW5kRHN0RnVuYyBkc3QpOworICAgIHZvaWQgc2V0Q29sb3JNYXNrKGJvb2wsIGJvb2wsIGJvb2wsIGJvb2wpOworCisgICAgdm9pZCBzZXREaXRoZXJFbmFibGUoYm9vbCk7CisKKyAgICB2aXJ0dWFsIHZvaWQgc2VyaWFsaXplKE9TdHJlYW0gKnN0cmVhbSkgY29uc3Q7CisgICAgdmlydHVhbCBSc0EzRENsYXNzSUQgZ2V0Q2xhc3NJZCgpIGNvbnN0IHsgcmV0dXJuIFJTX0EzRF9DTEFTU19JRF9QUk9HUkFNX1NUT1JFOyB9CisgICAgc3RhdGljIFByb2dyYW1TdG9yZSAqY3JlYXRlRnJvbVN0cmVhbShDb250ZXh0ICpyc2MsIElTdHJlYW0gKnN0cmVhbSk7CisKK3Byb3RlY3RlZDoKKyAgICBib29sIG1EaXRoZXJFbmFibGU7CisKKyAgICBib29sIG1CbGVuZEVuYWJsZTsKKyAgICBib29sIG1Db2xvclJXcml0ZUVuYWJsZTsKKyAgICBib29sIG1Db2xvckdXcml0ZUVuYWJsZTsKKyAgICBib29sIG1Db2xvckJXcml0ZUVuYWJsZTsKKyAgICBib29sIG1Db2xvckFXcml0ZUVuYWJsZTsKKyAgICBpbnQzMl90IG1CbGVuZFNyYzsKKyAgICBpbnQzMl90IG1CbGVuZERzdDsKKworICAgIGJvb2wgbURlcHRoVGVzdEVuYWJsZTsKKyAgICBib29sIG1EZXB0aFdyaXRlRW5hYmxlOworICAgIGludDMyX3QgbURlcHRoRnVuYzsKKworICAgIGJvb2wgbVN0ZW5jaWxUZXN0RW5hYmxlOworfTsKKworY2xhc3MgUHJvZ3JhbVN0b3JlU3RhdGUKK3sKK3B1YmxpYzoKKyAgICBQcm9ncmFtU3RvcmVTdGF0ZSgpOworICAgIH5Qcm9ncmFtU3RvcmVTdGF0ZSgpOworICAgIHZvaWQgaW5pdChDb250ZXh0ICpyc2MpOworICAgIHZvaWQgZGVpbml0KENvbnRleHQgKnJzYyk7CisKKyAgICBPYmplY3RCYXNlUmVmPFByb2dyYW1TdG9yZT4gbURlZmF1bHQ7CisgICAgT2JqZWN0QmFzZVJlZjxQcm9ncmFtU3RvcmU+IG1MYXN0OworCisKKyAgICBQcm9ncmFtU3RvcmUgKm1QRlM7Cit9OworCisKK30KK30KKyNlbmRpZgorCisKKwpkaWZmIC0tZ2l0IGEvbGlicy9ycy9yc1Byb2dyYW1WZXJ0ZXguY3BwIGIvbGlicy9ycy9yc1Byb2dyYW1WZXJ0ZXguY3BwCmluZGV4IGEyYjJkZjQuLjI4MDg0ZDcgMTAwNjQ0Ci0tLSBhL2xpYnMvcnMvcnNQcm9ncmFtVmVydGV4LmNwcAorKysgYi9saWJzL3JzL3JzUHJvZ3JhbVZlcnRleC5jcHAKQEAgLTE0LDEzICsxNCwxOSBAQAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAorI2lmbmRlZiBBTkRST0lEX1JTX0JVSUxEX0ZPUl9IT1NUCiAjaW5jbHVkZSAicnNDb250ZXh0LmgiCi0jaW5jbHVkZSAicnNQcm9ncmFtVmVydGV4LmgiCi0KICNpbmNsdWRlIDxHTEVTL2dsLmg+CiAjaW5jbHVkZSA8R0xFUy9nbGV4dC5oPgogI2luY2x1ZGUgPEdMRVMyL2dsMi5oPgogI2luY2x1ZGUgPEdMRVMyL2dsMmV4dC5oPgorI2Vsc2UKKyNpbmNsdWRlICJyc0NvbnRleHRIb3N0U3R1Yi5oIgorI2luY2x1ZGUgPE9wZW5HTC9nbC5oPgorI2luY2x1ZGUgPE9wZW5HTC9nbGV4dC5oPgorI2VuZGlmIC8vQU5EUk9JRF9SU19CVUlMRF9GT1JfSE9TVAorCisjaW5jbHVkZSAicnNQcm9ncmFtVmVydGV4LmgiCiAKIHVzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOwogdXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ6OnJlbmRlcnNjcmlwdDsKQEAgLTY0LDQ4ICs3MCw3IEBACiAKIHZvaWQgUHJvZ3JhbVZlcnRleDo6c2V0dXBHTChjb25zdCBDb250ZXh0ICpyc2MsIFByb2dyYW1WZXJ0ZXhTdGF0ZSAqc3RhdGUpCiB7Ci0gICAgaWYgKChzdGF0ZS0+bUxhc3QuZ2V0KCkgPT0gdGhpcykgJiYgIW1EaXJ0eSkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIHN0YXRlLT5tTGFzdC5zZXQodGhpcyk7Ci0KLSAgICBjb25zdCBmbG9hdCAqZiA9IHN0YXRpY19jYXN0PGNvbnN0IGZsb2F0ICo+KG1Db25zdGFudHNbMF0tPmdldFB0cigpKTsKLQotICAgIGdsTWF0cml4TW9kZShHTF9URVhUVVJFKTsKLSAgICBpZiAobVRleHR1cmVNYXRyaXhFbmFibGUpIHsKLSAgICAgICAgZ2xMb2FkTWF0cml4ZigmZltSU19QUk9HUkFNX1ZFUlRFWF9URVhUVVJFX09GRlNFVF0pOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGdsTG9hZElkZW50aXR5KCk7Ci0gICAgfQotCi0gICAgZ2xNYXRyaXhNb2RlKEdMX01PREVMVklFVyk7Ci0gICAgZ2xMb2FkSWRlbnRpdHkoKTsKLSAgICBpZiAobUxpZ2h0Q291bnQpIHsKLSAgICAgICAgaW50IHYgPSAwOwotICAgICAgICBnbEVuYWJsZShHTF9MSUdIVElORyk7Ci0gICAgICAgIGdsTGlnaHRNb2RlbHh2KEdMX0xJR0hUX01PREVMX1RXT19TSURFLCAmdik7Ci0gICAgICAgIGZvciAodWludDMyX3QgY3QgPSAwOyBjdCA8IG1MaWdodENvdW50OyBjdCsrKSB7Ci0gICAgICAgICAgICBjb25zdCBMaWdodCAqbCA9IG1MaWdodHNbY3RdLmdldCgpOwotICAgICAgICAgICAgZ2xFbmFibGUoR0xfTElHSFQwICsgY3QpOwotICAgICAgICAgICAgbC0+c2V0dXBHTChjdCk7Ci0gICAgICAgIH0KLSAgICAgICAgZm9yICh1aW50MzJfdCBjdCA9IG1MaWdodENvdW50OyBjdCA8IE1BWF9MSUdIVFM7IGN0KyspIHsKLSAgICAgICAgICAgIGdsRGlzYWJsZShHTF9MSUdIVDAgKyBjdCk7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgICBnbERpc2FibGUoR0xfTElHSFRJTkcpOwotICAgIH0KLQotICAgIGlmICghZikgewotICAgICAgICBMT0dFKCJNdXN0IGJpbmQgY29uc3RhbnRzIHRvIHZlcnRleCBwcm9ncmFtIik7Ci0gICAgfQotCi0gICAgZ2xNYXRyaXhNb2RlKEdMX1BST0pFQ1RJT04pOwotICAgIGdsTG9hZE1hdHJpeGYoJmZbUlNfUFJPR1JBTV9WRVJURVhfUFJPSkVDVElPTl9PRkZTRVRdKTsKLSAgICBnbE1hdHJpeE1vZGUoR0xfTU9ERUxWSUVXKTsKLSAgICBnbExvYWRNYXRyaXhmKCZmW1JTX1BST0dSQU1fVkVSVEVYX01PREVMVklFV19PRkZTRVRdKTsKLQotICAgIG1EaXJ0eSA9IGZhbHNlOworICAgIGFzc2VydCgwKTsKIH0KIAogdm9pZCBQcm9ncmFtVmVydGV4Ojpsb2FkU2hhZGVyKENvbnRleHQgKnJzYykgewpAQCAtMTE0LDQyICs3OSwxOSBAQAogCiB2b2lkIFByb2dyYW1WZXJ0ZXg6OmNyZWF0ZVNoYWRlcigpCiB7Ci0gICAgbVNoYWRlci5zZXRUbygiIik7Ci0KLSAgICBtU2hhZGVyLmFwcGVuZCgidmFyeWluZyB2ZWM0IHZhckNvbG9yO1xuIik7Ci0gICAgbVNoYWRlci5hcHBlbmQoInZhcnlpbmcgdmVjNCB2YXJUZXgwO1xuIik7Ci0KICAgICBpZiAobVVzZXJTaGFkZXIubGVuZ3RoKCkgPiAxKSB7Ci0gICAgICAgIG1TaGFkZXIuYXBwZW5kKCJ1bmlmb3JtIG1hdDQgIik7Ci0gICAgICAgIG1TaGFkZXIuYXBwZW5kKG1Vbmlmb3JtTmFtZXNbMF0pOwotICAgICAgICBtU2hhZGVyLmFwcGVuZCgiO1xuIik7CiAKLSAgICAgICAgZm9yICh1aW50MzJfdCBjdD0wOyBjdCA8IG1Db25zdGFudENvdW50OyBjdCsrKSB7Ci0gICAgICAgICAgICBjb25zdCBFbGVtZW50ICplID0gbUNvbnN0YW50VHlwZXNbY3RdLT5nZXRFbGVtZW50KCk7Ci0gICAgICAgICAgICBmb3IgKHVpbnQzMl90IGZpZWxkPTA7IGZpZWxkIDwgZS0+Z2V0RmllbGRDb3VudCgpOyBmaWVsZCsrKSB7Ci0gICAgICAgICAgICAgICAgY29uc3QgRWxlbWVudCAqZiA9IGUtPmdldEZpZWxkKGZpZWxkKTsKLQotICAgICAgICAgICAgICAgIC8vIENhbm5vdCBiZSBjb21wbGV4Ci0gICAgICAgICAgICAgICAgcnNBc3NlcnQoIWYtPmdldEZpZWxkQ291bnQoKSk7Ci0gICAgICAgICAgICAgICAgc3dpdGNoKGYtPmdldENvbXBvbmVudCgpLmdldFZlY3RvclNpemUoKSkgewotICAgICAgICAgICAgICAgIGNhc2UgMTogbVNoYWRlci5hcHBlbmQoInVuaWZvcm0gZmxvYXQgVU5JXyIpOyBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIDI6IG1TaGFkZXIuYXBwZW5kKCJ1bmlmb3JtIHZlYzIgVU5JXyIpOyBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIDM6IG1TaGFkZXIuYXBwZW5kKCJ1bmlmb3JtIHZlYzMgVU5JXyIpOyBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIDQ6IG1TaGFkZXIuYXBwZW5kKCJ1bmlmb3JtIHZlYzQgVU5JXyIpOyBicmVhazsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICByc0Fzc2VydCgwKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBtU2hhZGVyLmFwcGVuZChlLT5nZXRGaWVsZE5hbWUoZmllbGQpKTsKLSAgICAgICAgICAgICAgICBtU2hhZGVyLmFwcGVuZCgiO1xuIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQorICAgICAgICBhcHBlbmRVc2VyQ29uc3RhbnRzKCk7CiAKICAgICAgICAgZm9yICh1aW50MzJfdCBjdD0wOyBjdCA8IG1JbnB1dENvdW50OyBjdCsrKSB7CiAgICAgICAgICAgICBjb25zdCBFbGVtZW50ICplID0gbUlucHV0RWxlbWVudHNbY3RdLmdldCgpOwogICAgICAgICAgICAgZm9yICh1aW50MzJfdCBmaWVsZD0wOyBmaWVsZCA8IGUtPmdldEZpZWxkQ291bnQoKTsgZmllbGQrKykgewogICAgICAgICAgICAgICAgIGNvbnN0IEVsZW1lbnQgKmYgPSBlLT5nZXRGaWVsZChmaWVsZCk7CisgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZm4gPSBlLT5nZXRGaWVsZE5hbWUoZmllbGQpOworCisgICAgICAgICAgICAgICAgaWYgKGZuWzBdID09ICcjJykgeworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICAvLyBDYW5ub3QgYmUgY29tcGxleAogICAgICAgICAgICAgICAgIHJzQXNzZXJ0KCFmLT5nZXRGaWVsZENvdW50KCkpOwpAQCAtMTYyLDM4ICsxMDQsMTQgQEAKICAgICAgICAgICAgICAgICAgICAgcnNBc3NlcnQoMCk7CiAgICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgbVNoYWRlci5hcHBlbmQoZS0+Z2V0RmllbGROYW1lKGZpZWxkKSk7CisgICAgICAgICAgICAgICAgbVNoYWRlci5hcHBlbmQoZm4pOwogICAgICAgICAgICAgICAgIG1TaGFkZXIuYXBwZW5kKCI7XG4iKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICBtU2hhZGVyLmFwcGVuZChtVXNlclNoYWRlcik7CiAgICAgfSBlbHNlIHsKLSAgICAgICAgbVNoYWRlci5hcHBlbmQoImF0dHJpYnV0ZSB2ZWM0IEFUVFJJQl9MZWdhY3lQb3NpdGlvbjtcbiIpOwotICAgICAgICBtU2hhZGVyLmFwcGVuZCgiYXR0cmlidXRlIHZlYzQgQVRUUklCX0xlZ2FjeUNvbG9yO1xuIik7Ci0gICAgICAgIG1TaGFkZXIuYXBwZW5kKCJhdHRyaWJ1dGUgdmVjMyBBVFRSSUJfTGVnYWN5Tm9ybWFsO1xuIik7Ci0gICAgICAgIG1TaGFkZXIuYXBwZW5kKCJhdHRyaWJ1dGUgZmxvYXQgQVRUUklCX0xlZ2FjeVBvaW50U2l6ZTtcbiIpOwotICAgICAgICBtU2hhZGVyLmFwcGVuZCgiYXR0cmlidXRlIHZlYzQgQVRUUklCX0xlZ2FjeVRleHR1cmU7XG4iKTsKLQotICAgICAgICBmb3IgKHVpbnQzMl90IGN0PTA7IGN0IDwgbVVuaWZvcm1Db3VudDsgY3QrKykgewotICAgICAgICAgICAgbVNoYWRlci5hcHBlbmQoInVuaWZvcm0gbWF0NCAiKTsKLSAgICAgICAgICAgIG1TaGFkZXIuYXBwZW5kKG1Vbmlmb3JtTmFtZXNbY3RdKTsKLSAgICAgICAgICAgIG1TaGFkZXIuYXBwZW5kKCI7XG4iKTsKLSAgICAgICAgfQotCi0gICAgICAgIG1TaGFkZXIuYXBwZW5kKCJ2b2lkIG1haW4oKSB7XG4iKTsKLSAgICAgICAgbVNoYWRlci5hcHBlbmQoIiAgZ2xfUG9zaXRpb24gPSBVTklfTVZQICogQVRUUklCX0xlZ2FjeVBvc2l0aW9uO1xuIik7Ci0gICAgICAgIG1TaGFkZXIuYXBwZW5kKCIgIGdsX1BvaW50U2l6ZSA9IEFUVFJJQl9MZWdhY3lQb2ludFNpemU7XG4iKTsKLQotICAgICAgICBtU2hhZGVyLmFwcGVuZCgiICB2YXJDb2xvciA9IEFUVFJJQl9MZWdhY3lDb2xvcjtcbiIpOwotICAgICAgICBpZiAobVRleHR1cmVNYXRyaXhFbmFibGUpIHsKLSAgICAgICAgICAgIG1TaGFkZXIuYXBwZW5kKCIgIHZhclRleDAgPSBVTklfVGV4TWF0cml4ICogQVRUUklCX0xlZ2FjeVRleHR1cmU7XG4iKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1TaGFkZXIuYXBwZW5kKCIgIHZhclRleDAgPSBBVFRSSUJfTGVnYWN5VGV4dHVyZTtcbiIpOwotICAgICAgICB9Ci0gICAgICAgIC8vbVNoYWRlci5hcHBlbmQoIiAgcG9zLnggPSBwb3MueCAvIDQ4MC4wO1xuIik7Ci0gICAgICAgIC8vbVNoYWRlci5hcHBlbmQoIiAgcG9zLnkgPSBwb3MueSAvIDgwMC4wO1xuIik7Ci0gICAgICAgIC8vbVNoYWRlci5hcHBlbmQoIiAgZ2xfUG9zaXRpb24gPSBwb3M7XG4iKTsKLSAgICAgICAgbVNoYWRlci5hcHBlbmQoIn1cbiIpOworICAgICAgICBMT0dFKCJQcm9ncmFtRnJhZ21lbnQ6OmNyZWF0ZVNoYWRlciBjYW5ub3QgY3JlYXRlIHByb2dyYW0sIHNoYWRlciBjb2RlIG5vdCBkZWZpbmVkIik7CisgICAgICAgIHJzQXNzZXJ0KDApOwogICAgIH0KIH0KIApAQCAtMjAxLDc0ICsxMTksMjUgQEAKIHsKICAgICAvL0xPR0UoInNnbDIgdnR4MSAleCIsIGdsR2V0RXJyb3IoKSk7CiAgICAgaWYgKChzdGF0ZS0+bUxhc3QuZ2V0KCkgPT0gdGhpcykgJiYgIW1EaXJ0eSkgewotICAgICAgICAvL3JldHVybjsKKyAgICAgICAgcmV0dXJuOwogICAgIH0KIAogICAgIHJzYy0+Y2hlY2tFcnJvcigiUHJvZ3JhbVZlcnRleDo6c2V0dXBHTDIgc3RhcnQiKTsKLSAgICBnbFZlcnRleEF0dHJpYjRmKDEsIHN0YXRlLT5jb2xvclswXSwgc3RhdGUtPmNvbG9yWzFdLCBzdGF0ZS0+Y29sb3JbMl0sIHN0YXRlLT5jb2xvclszXSk7CiAKLSAgICBjb25zdCBmbG9hdCAqZiA9IHN0YXRpY19jYXN0PGNvbnN0IGZsb2F0ICo+KG1Db25zdGFudHNbMF0tPmdldFB0cigpKTsKLQotICAgIE1hdHJpeCBtdnA7Ci0gICAgbXZwLmxvYWQoJmZbUlNfUFJPR1JBTV9WRVJURVhfUFJPSkVDVElPTl9PRkZTRVRdKTsKLSAgICBNYXRyaXggdDsKLSAgICB0LmxvYWQoJmZbUlNfUFJPR1JBTV9WRVJURVhfTU9ERUxWSUVXX09GRlNFVF0pOwotICAgIG12cC5tdWx0aXBseSgmdCk7Ci0KLSAgICBnbFVuaWZvcm1NYXRyaXg0ZnYoc2MtPnZ0eFVuaWZvcm1TbG90KDApLCAxLCBHTF9GQUxTRSwgbXZwLm0pOwotICAgIGlmIChtVGV4dHVyZU1hdHJpeEVuYWJsZSkgewotICAgICAgICBnbFVuaWZvcm1NYXRyaXg0ZnYoc2MtPnZ0eFVuaWZvcm1TbG90KDEpLCAxLCBHTF9GQUxTRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICZmW1JTX1BST0dSQU1fVkVSVEVYX1RFWFRVUkVfT0ZGU0VUXSk7CisgICAgaWYoIWlzVXNlclByb2dyYW0oKSkgeworICAgICAgICBmbG9hdCAqZiA9IHN0YXRpY19jYXN0PGZsb2F0ICo+KG1Db25zdGFudHNbMF0tPmdldFB0cigpKTsKKyAgICAgICAgTWF0cml4IG12cDsKKyAgICAgICAgbXZwLmxvYWQoJmZbUlNfUFJPR1JBTV9WRVJURVhfUFJPSkVDVElPTl9PRkZTRVRdKTsKKyAgICAgICAgTWF0cml4IHQ7CisgICAgICAgIHQubG9hZCgmZltSU19QUk9HUkFNX1ZFUlRFWF9NT0RFTFZJRVdfT0ZGU0VUXSk7CisgICAgICAgIG12cC5tdWx0aXBseSgmdCk7CisgICAgICAgIGZvcih1aW50MzJfdCBpID0gMDsgaSA8IDE2OyBpICsrKSB7CisgICAgICAgICAgICBmW1JTX1BST0dSQU1fVkVSVEVYX01WUF9PRkZTRVQgKyBpXSA9IG12cC5tW2ldOworICAgICAgICB9CiAgICAgfQogCiAgICAgcnNjLT5jaGVja0Vycm9yKCJQcm9ncmFtVmVydGV4OjpzZXR1cEdMMiBiZWdpbiB1bmlmb3JtcyIpOwotICAgIHVpbnQzMl90IHVpZHggPSAxOwotICAgIGZvciAodWludDMyX3QgY3Q9MDsgY3QgPCBtQ29uc3RhbnRDb3VudDsgY3QrKykgewotICAgICAgICBBbGxvY2F0aW9uICphbGxvYyA9IG1Db25zdGFudHNbY3QrMV0uZ2V0KCk7Ci0gICAgICAgIGlmICghYWxsb2MpIHsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgY29uc3QgdWludDhfdCAqZGF0YSA9IHN0YXRpY19jYXN0PGNvbnN0IHVpbnQ4X3QgKj4oYWxsb2MtPmdldFB0cigpKTsKLSAgICAgICAgY29uc3QgRWxlbWVudCAqZSA9IG1Db25zdGFudFR5cGVzW2N0XS0+Z2V0RWxlbWVudCgpOwotICAgICAgICBmb3IgKHVpbnQzMl90IGZpZWxkPTA7IGZpZWxkIDwgZS0+Z2V0RmllbGRDb3VudCgpOyBmaWVsZCsrKSB7Ci0gICAgICAgICAgICBjb25zdCBFbGVtZW50ICpmID0gZS0+Z2V0RmllbGQoZmllbGQpOwotICAgICAgICAgICAgdWludDMyX3Qgb2Zmc2V0ID0gZS0+Z2V0RmllbGRPZmZzZXRCeXRlcyhmaWVsZCk7Ci0gICAgICAgICAgICBpbnQzMl90IHNsb3QgPSBzYy0+dnR4VW5pZm9ybVNsb3QodWlkeCk7Ci0KLSAgICAgICAgICAgIGNvbnN0IGZsb2F0ICpmZCA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgZmxvYXQgKj4oJmRhdGFbb2Zmc2V0XSk7Ci0KLSAgICAgICAgICAgIC8vTE9HRSgiVW5pZm9ybSAgc2xvdD0laSwgb2Zmc2V0PSVpLCBjb25zdGFudD0laSwgZmllbGQ9JWksIHVpZHg9JWkiLCBzbG90LCBvZmZzZXQsIGN0LCBmaWVsZCwgdWlkeCk7Ci0gICAgICAgICAgICBpZiAoc2xvdCA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgc3dpdGNoKGYtPmdldENvbXBvbmVudCgpLmdldFZlY3RvclNpemUoKSkgewotICAgICAgICAgICAgICAgIGNhc2UgMToKLSAgICAgICAgICAgICAgICAgICAgLy9MT0dFKCJVbmlmb3JtIDEgPSAlZiIsIGZkWzBdKTsKLSAgICAgICAgICAgICAgICAgICAgZ2xVbmlmb3JtMWZ2KHNsb3QsIDEsIGZkKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSAyOgotICAgICAgICAgICAgICAgICAgICAvL0xPR0UoIlVuaWZvcm0gMiA9ICVmICVmIiwgZmRbMF0sIGZkWzFdKTsKLSAgICAgICAgICAgICAgICAgICAgZ2xVbmlmb3JtMmZ2KHNsb3QsIDEsIGZkKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSAzOgotICAgICAgICAgICAgICAgICAgICAvL0xPR0UoIlVuaWZvcm0gMyA9ICVmICVmICVmIiwgZmRbMF0sIGZkWzFdLCBmZFsyXSk7Ci0gICAgICAgICAgICAgICAgICAgIGdsVW5pZm9ybTNmdihzbG90LCAxLCBmZCk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgNDoKLSAgICAgICAgICAgICAgICAgICAgLy9MT0dFKCJVbmlmb3JtIDQgPSAlZiAlZiAlZiAlZiIsIGZkWzBdLCBmZFsxXSwgZmRbMl0sIGZkWzNdKTsKLSAgICAgICAgICAgICAgICAgICAgZ2xVbmlmb3JtNGZ2KHNsb3QsIDEsIGZkKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgcnNBc3NlcnQoMCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgdWlkeCArKzsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGZvciAodWludDMyX3QgY3Q9MDsgY3QgPCBtQ29uc3RhbnRDb3VudDsgY3QrKykgewotICAgICAgICB1aW50MzJfdCBnbFNsb3QgPSBzYy0+dnR4VW5pZm9ybVNsb3QoY3QgKyAxKTsKLQotICAgIH0KKyAgICBzZXR1cFVzZXJDb25zdGFudHMoc2MsIGZhbHNlKTsKIAogICAgIHN0YXRlLT5tTGFzdC5zZXQodGhpcyk7CiAgICAgcnNjLT5jaGVja0Vycm9yKCJQcm9ncmFtVmVydGV4OjpzZXR1cEdMMiIpOwpAQCAtMjg0LDYgKzE1Myw5IEBACiAKIHZvaWQgUHJvZ3JhbVZlcnRleDo6c2V0UHJvamVjdGlvbk1hdHJpeChjb25zdCByc2NfTWF0cml4ICptKSBjb25zdAogeworICAgIGlmKGlzVXNlclByb2dyYW0oKSkgeworICAgICAgICByZXR1cm47CisgICAgfQogICAgIGZsb2F0ICpmID0gc3RhdGljX2Nhc3Q8ZmxvYXQgKj4obUNvbnN0YW50c1swXS0+Z2V0UHRyKCkpOwogICAgIG1lbWNweSgmZltSU19QUk9HUkFNX1ZFUlRFWF9QUk9KRUNUSU9OX09GRlNFVF0sIG0sIHNpemVvZihyc2NfTWF0cml4KSk7CiAgICAgbURpcnR5ID0gdHJ1ZTsKQEAgLTI5MSw2ICsxNjMsOSBAQAogCiB2b2lkIFByb2dyYW1WZXJ0ZXg6OnNldE1vZGVsdmlld01hdHJpeChjb25zdCByc2NfTWF0cml4ICptKSBjb25zdAogeworICAgIGlmKGlzVXNlclByb2dyYW0oKSkgeworICAgICAgICByZXR1cm47CisgICAgfQogICAgIGZsb2F0ICpmID0gc3RhdGljX2Nhc3Q8ZmxvYXQgKj4obUNvbnN0YW50c1swXS0+Z2V0UHRyKCkpOwogICAgIG1lbWNweSgmZltSU19QUk9HUkFNX1ZFUlRFWF9NT0RFTFZJRVdfT0ZGU0VUXSwgbSwgc2l6ZW9mKHJzY19NYXRyaXgpKTsKICAgICBtRGlydHkgPSB0cnVlOwpAQCAtMjk4LDEzICsxNzMsMjggQEAKIAogdm9pZCBQcm9ncmFtVmVydGV4OjpzZXRUZXh0dXJlTWF0cml4KGNvbnN0IHJzY19NYXRyaXggKm0pIGNvbnN0CiB7CisgICAgaWYoaXNVc2VyUHJvZ3JhbSgpKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CiAgICAgZmxvYXQgKmYgPSBzdGF0aWNfY2FzdDxmbG9hdCAqPihtQ29uc3RhbnRzWzBdLT5nZXRQdHIoKSk7CiAgICAgbWVtY3B5KCZmW1JTX1BST0dSQU1fVkVSVEVYX1RFWFRVUkVfT0ZGU0VUXSwgbSwgc2l6ZW9mKHJzY19NYXRyaXgpKTsKICAgICBtRGlydHkgPSB0cnVlOwogfQogCit2b2lkIFByb2dyYW1WZXJ0ZXg6OmdldFByb2plY3Rpb25NYXRyaXgocnNjX01hdHJpeCAqbSkgY29uc3QKK3sKKyAgICBpZihpc1VzZXJQcm9ncmFtKCkpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBmbG9hdCAqZiA9IHN0YXRpY19jYXN0PGZsb2F0ICo+KG1Db25zdGFudHNbMF0tPmdldFB0cigpKTsKKyAgICBtZW1jcHkobSwgJmZbUlNfUFJPR1JBTV9WRVJURVhfUFJPSkVDVElPTl9PRkZTRVRdLCBzaXplb2YocnNjX01hdHJpeCkpOworfQorCiB2b2lkIFByb2dyYW1WZXJ0ZXg6OnRyYW5zZm9ybVRvU2NyZWVuKGNvbnN0IENvbnRleHQgKnJzYywgZmxvYXQgKnY0b3V0LCBjb25zdCBmbG9hdCAqdjNpbikgY29uc3QKIHsKKyAgICBpZihpc1VzZXJQcm9ncmFtKCkpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KICAgICBmbG9hdCAqZiA9IHN0YXRpY19jYXN0PGZsb2F0ICo+KG1Db25zdGFudHNbMF0tPmdldFB0cigpKTsKICAgICBNYXRyaXggbXZwOwogICAgIG12cC5sb2FkTXVsdGlwbHkoKE1hdHJpeCAqKSZmW1JTX1BST0dSQU1fVkVSVEVYX01PREVMVklFV19PRkZTRVRdLApAQCAtMzEyLDIzICsyMDIsNiBAQAogICAgIG12cC52ZWN0b3JNdWx0aXBseSh2NG91dCwgdjNpbik7CiB9CiAKLXZvaWQgUHJvZ3JhbVZlcnRleDo6aW5pdEFkZFVzZXJFbGVtZW50KGNvbnN0IEVsZW1lbnQgKmUsIFN0cmluZzggKm5hbWVzLCB1aW50MzJfdCAqY291bnQsIGNvbnN0IGNoYXIgKnByZWZpeCkKLXsKLSAgICByc0Fzc2VydChlLT5nZXRGaWVsZENvdW50KCkpOwotICAgIGZvciAodWludDMyX3QgY3Q9MDsgY3QgPCBlLT5nZXRGaWVsZENvdW50KCk7IGN0KyspIHsKLSAgICAgICAgY29uc3QgRWxlbWVudCAqY2UgPSBlLT5nZXRGaWVsZChjdCk7Ci0gICAgICAgIGlmIChjZS0+Z2V0RmllbGRDb3VudCgpKSB7Ci0gICAgICAgICAgICBpbml0QWRkVXNlckVsZW1lbnQoY2UsIG5hbWVzLCBjb3VudCwgcHJlZml4KTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIFN0cmluZzggdG1wKHByZWZpeCk7Ci0gICAgICAgICAgICB0bXAuYXBwZW5kKGUtPmdldEZpZWxkTmFtZShjdCkpOwotICAgICAgICAgICAgbmFtZXNbKmNvdW50XS5zZXRUbyh0bXAuc3RyaW5nKCkpOwotICAgICAgICAgICAgKCpjb3VudCkrKzsKLSAgICAgICAgfQotICAgIH0KLX0KLQotCiB2b2lkIFByb2dyYW1WZXJ0ZXg6OmluaXQoQ29udGV4dCAqcnNjKQogewogICAgIG1BdHRyaWJDb3VudCA9IDA7CkBAIC0zMzcsMjAgKzIxMCwyNCBAQAogICAgICAgICAgICAgaW5pdEFkZFVzZXJFbGVtZW50KG1JbnB1dEVsZW1lbnRzW2N0XS5nZXQoKSwgbUF0dHJpYk5hbWVzLCAmbUF0dHJpYkNvdW50LCAiQVRUUklCXyIpOwogICAgICAgICB9CiAKLSAgICAgICAgbVVuaWZvcm1Db3VudCA9IDE7Ci0gICAgICAgIG1Vbmlmb3JtTmFtZXNbMF0uc2V0VG8oIlVOSV9NVlAiKTsKKyAgICAgICAgbVVuaWZvcm1Db3VudCA9IDA7CiAgICAgICAgIGZvciAodWludDMyX3QgY3Q9MDsgY3QgPCBtQ29uc3RhbnRDb3VudDsgY3QrKykgewogICAgICAgICAgICAgaW5pdEFkZFVzZXJFbGVtZW50KG1Db25zdGFudFR5cGVzW2N0XS0+Z2V0RWxlbWVudCgpLCBtVW5pZm9ybU5hbWVzLCAmbVVuaWZvcm1Db3VudCwgIlVOSV8iKTsKICAgICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAgIG1Vbmlmb3JtQ291bnQgPSAyOwotICAgICAgICBtVW5pZm9ybU5hbWVzWzBdLnNldFRvKCJVTklfTVZQIik7Ci0gICAgICAgIG1Vbmlmb3JtTmFtZXNbMV0uc2V0VG8oIlVOSV9UZXhNYXRyaXgiKTsKICAgICB9Ci0KICAgICBjcmVhdGVTaGFkZXIoKTsKIH0KIAordm9pZCBQcm9ncmFtVmVydGV4OjpzZXJpYWxpemUoT1N0cmVhbSAqc3RyZWFtKSBjb25zdAoreworCit9CisKK1Byb2dyYW1WZXJ0ZXggKlByb2dyYW1WZXJ0ZXg6OmNyZWF0ZUZyb21TdHJlYW0oQ29udGV4dCAqcnNjLCBJU3RyZWFtICpzdHJlYW0pCit7CisgICAgcmV0dXJuIE5VTEw7Cit9CisKIAogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KIApAQCAtMzYyLDQ0ICsyMzksODAgQEAKIHsKIH0KIAotdm9pZCBQcm9ncmFtVmVydGV4U3RhdGU6OmluaXQoQ29udGV4dCAqcnNjLCBpbnQzMl90IHcsIGludDMyX3QgaCkKK3ZvaWQgUHJvZ3JhbVZlcnRleFN0YXRlOjppbml0KENvbnRleHQgKnJzYykKIHsKLSAgICBSc0VsZW1lbnQgZSA9IChSc0VsZW1lbnQpIEVsZW1lbnQ6OmNyZWF0ZShyc2MsIFJTX1RZUEVfRkxPQVRfMzIsIFJTX0tJTkRfVVNFUiwgZmFsc2UsIDEpOworICAgIGNvbnN0IEVsZW1lbnQgKm1hdHJpeEVsZW0gPSBFbGVtZW50OjpjcmVhdGUocnNjLCBSU19UWVBFX01BVFJJWF80WDQsIFJTX0tJTkRfVVNFUiwgZmFsc2UsIDEpOworICAgIGNvbnN0IEVsZW1lbnQgKmYzRWxlbSA9IEVsZW1lbnQ6OmNyZWF0ZShyc2MsIFJTX1RZUEVfRkxPQVRfMzIsIFJTX0tJTkRfVVNFUiwgZmFsc2UsIDMpOworICAgIGNvbnN0IEVsZW1lbnQgKmY0RWxlbSA9IEVsZW1lbnQ6OmNyZWF0ZShyc2MsIFJTX1RZUEVfRkxPQVRfMzIsIFJTX0tJTkRfVVNFUiwgZmFsc2UsIDQpOwogCi0gICAgcnNpX1R5cGVCZWdpbihyc2MsIGUpOwotICAgIHJzaV9UeXBlQWRkKHJzYywgUlNfRElNRU5TSU9OX1gsIDQ4KTsKLSAgICBtQWxsb2NUeXBlLnNldCgoVHlwZSAqKXJzaV9UeXBlQ3JlYXRlKHJzYykpOworICAgIHJzYy0+bVN0YXRlRWxlbWVudC5lbGVtZW50QnVpbGRlckJlZ2luKCk7CisgICAgcnNjLT5tU3RhdGVFbGVtZW50LmVsZW1lbnRCdWlsZGVyQWRkKG1hdHJpeEVsZW0sICJNViIsIDEpOworICAgIHJzYy0+bVN0YXRlRWxlbWVudC5lbGVtZW50QnVpbGRlckFkZChtYXRyaXhFbGVtLCAiUCIsIDEpOworICAgIHJzYy0+bVN0YXRlRWxlbWVudC5lbGVtZW50QnVpbGRlckFkZChtYXRyaXhFbGVtLCAiVGV4TWF0cml4IiwgMSk7CisgICAgcnNjLT5tU3RhdGVFbGVtZW50LmVsZW1lbnRCdWlsZGVyQWRkKG1hdHJpeEVsZW0sICJNVlAiLCAxKTsKKyAgICBjb25zdCBFbGVtZW50ICpjb25zdElucHV0ID0gcnNjLT5tU3RhdGVFbGVtZW50LmVsZW1lbnRCdWlsZGVyQ3JlYXRlKHJzYyk7CiAKLSAgICBQcm9ncmFtVmVydGV4ICpwdiA9IG5ldyBQcm9ncmFtVmVydGV4KHJzYywgZmFsc2UpOwotICAgIEFsbG9jYXRpb24gKmFsbG9jID0gKEFsbG9jYXRpb24gKilyc2lfQWxsb2NhdGlvbkNyZWF0ZVR5cGVkKHJzYywgbUFsbG9jVHlwZS5nZXQoKSk7Ci0gICAgbURlZmF1bHRBbGxvYy5zZXQoYWxsb2MpOwotICAgIG1EZWZhdWx0LnNldChwdik7Ci0gICAgcHYtPmluaXQocnNjKTsKKyAgICByc2MtPm1TdGF0ZUVsZW1lbnQuZWxlbWVudEJ1aWxkZXJCZWdpbigpOworICAgIHJzYy0+bVN0YXRlRWxlbWVudC5lbGVtZW50QnVpbGRlckFkZChmNEVsZW0sICJwb3NpdGlvbiIsIDEpOworICAgIHJzYy0+bVN0YXRlRWxlbWVudC5lbGVtZW50QnVpbGRlckFkZChmNEVsZW0sICJjb2xvciIsIDEpOworICAgIHJzYy0+bVN0YXRlRWxlbWVudC5lbGVtZW50QnVpbGRlckFkZChmM0VsZW0sICJub3JtYWwiLCAxKTsKKyAgICByc2MtPm1TdGF0ZUVsZW1lbnQuZWxlbWVudEJ1aWxkZXJBZGQoZjRFbGVtLCAidGV4dHVyZTAiLCAxKTsKKyAgICBjb25zdCBFbGVtZW50ICphdHRyRWxlbSA9IHJzYy0+bVN0YXRlRWxlbWVudC5lbGVtZW50QnVpbGRlckNyZWF0ZShyc2MpOworCisgICAgVHlwZSAqaW5wdXRUeXBlID0gbmV3IFR5cGUocnNjKTsKKyAgICBpbnB1dFR5cGUtPnNldEVsZW1lbnQoY29uc3RJbnB1dCk7CisgICAgaW5wdXRUeXBlLT5zZXREaW1YKDEpOworICAgIGlucHV0VHlwZS0+Y29tcHV0ZSgpOworCisgICAgU3RyaW5nOCBzaGFkZXJTdHJpbmcoUlNfU0hBREVSX0lOVEVSTkFMKTsKKyAgICBzaGFkZXJTdHJpbmcuYXBwZW5kKCJ2YXJ5aW5nIHZlYzQgdmFyQ29sb3I7XG4iKTsKKyAgICBzaGFkZXJTdHJpbmcuYXBwZW5kKCJ2YXJ5aW5nIHZlYzQgdmFyVGV4MDtcbiIpOworICAgIHNoYWRlclN0cmluZy5hcHBlbmQoInZvaWQgbWFpbigpIHtcbiIpOworICAgIHNoYWRlclN0cmluZy5hcHBlbmQoIiAgZ2xfUG9zaXRpb24gPSBVTklfTVZQICogQVRUUklCX3Bvc2l0aW9uO1xuIik7CisgICAgc2hhZGVyU3RyaW5nLmFwcGVuZCgiICBnbF9Qb2ludFNpemUgPSAxLjA7XG4iKTsKKyAgICBzaGFkZXJTdHJpbmcuYXBwZW5kKCIgIHZhckNvbG9yID0gQVRUUklCX2NvbG9yO1xuIik7CisgICAgc2hhZGVyU3RyaW5nLmFwcGVuZCgiICB2YXJUZXgwID0gQVRUUklCX3RleHR1cmUwO1xuIik7CisgICAgc2hhZGVyU3RyaW5nLmFwcGVuZCgifVxuIik7CisKKyAgICB1aW50MzJfdCB0bXBbNl07CisgICAgdG1wWzBdID0gUlNfUFJPR1JBTV9QQVJBTV9DT05TVEFOVDsKKyAgICB0bXBbMV0gPSAodWludDMyX3QpaW5wdXRUeXBlOworICAgIHRtcFsyXSA9IFJTX1BST0dSQU1fUEFSQU1fSU5QVVQ7CisgICAgdG1wWzNdID0gKHVpbnQzMl90KWF0dHJFbGVtOworICAgIHRtcFs0XSA9IFJTX1BST0dSQU1fUEFSQU1fVEVYVFVSRV9DT1VOVDsKKyAgICB0bXBbNV0gPSAwOworCisgICAgUHJvZ3JhbVZlcnRleCAqcHYgPSBuZXcgUHJvZ3JhbVZlcnRleChyc2MsIHNoYWRlclN0cmluZy5zdHJpbmcoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoYWRlclN0cmluZy5sZW5ndGgoKSwgdG1wLCA2KTsKKyAgICBBbGxvY2F0aW9uICphbGxvYyA9IG5ldyBBbGxvY2F0aW9uKHJzYywgaW5wdXRUeXBlKTsKICAgICBwdi0+YmluZEFsbG9jYXRpb24oYWxsb2MsIDApOwogCi0gICAgY29sb3JbMF0gPSAxLmY7Ci0gICAgY29sb3JbMV0gPSAxLmY7Ci0gICAgY29sb3JbMl0gPSAxLmY7Ci0gICAgY29sb3JbM10gPSAxLmY7CisgICAgbURlZmF1bHRBbGxvYy5zZXQoYWxsb2MpOworICAgIG1EZWZhdWx0LnNldChwdik7CisgICAgcHYtPmJpbmRBbGxvY2F0aW9uKGFsbG9jLCAwKTsKIAotICAgIHVwZGF0ZVNpemUocnNjLCB3LCBoKTsKKyAgICB1cGRhdGVTaXplKHJzYyk7CisKIH0KIAotdm9pZCBQcm9ncmFtVmVydGV4U3RhdGU6OnVwZGF0ZVNpemUoQ29udGV4dCAqcnNjLCBpbnQzMl90IHcsIGludDMyX3QgaCkKK3ZvaWQgUHJvZ3JhbVZlcnRleFN0YXRlOjp1cGRhdGVTaXplKENvbnRleHQgKnJzYykKIHsKKyAgICBmbG9hdCAqZiA9IHN0YXRpY19jYXN0PGZsb2F0ICo+KG1EZWZhdWx0QWxsb2MtPmdldFB0cigpKTsKKwogICAgIE1hdHJpeCBtOwotICAgIG0ubG9hZE9ydGhvKDAsdywgaCwwLCAtMSwxKTsKLSAgICBtRGVmYXVsdEFsbG9jLT5zdWJEYXRhKFJTX1BST0dSQU1fVkVSVEVYX1BST0pFQ1RJT05fT0ZGU0VULCAxNiwgJm0ubVswXSwgMTYqNCk7CisgICAgbS5sb2FkT3J0aG8oMCxyc2MtPmdldFdpZHRoKCksIHJzYy0+Z2V0SGVpZ2h0KCksMCwgLTEsMSk7CisgICAgbWVtY3B5KCZmW1JTX1BST0dSQU1fVkVSVEVYX1BST0pFQ1RJT05fT0ZGU0VUXSwgbS5tLCBzaXplb2YobSkpOworICAgIG1lbWNweSgmZltSU19QUk9HUkFNX1ZFUlRFWF9NVlBfT0ZGU0VUXSwgbS5tLCBzaXplb2YobSkpOwogCiAgICAgbS5sb2FkSWRlbnRpdHkoKTsKLSAgICBtRGVmYXVsdEFsbG9jLT5zdWJEYXRhKFJTX1BST0dSQU1fVkVSVEVYX01PREVMVklFV19PRkZTRVQsIDE2LCAmbS5tWzBdLCAxNio0KTsKKyAgICBtZW1jcHkoJmZbUlNfUFJPR1JBTV9WRVJURVhfTU9ERUxWSUVXX09GRlNFVF0sIG0ubSwgc2l6ZW9mKG0pKTsKKyAgICBtZW1jcHkoJmZbUlNfUFJPR1JBTV9WRVJURVhfVEVYVFVSRV9PRkZTRVRdLCBtLm0sIHNpemVvZihtKSk7CiB9CiAKIHZvaWQgUHJvZ3JhbVZlcnRleFN0YXRlOjpkZWluaXQoQ29udGV4dCAqcnNjKQogewogICAgIG1EZWZhdWx0QWxsb2MuY2xlYXIoKTsKICAgICBtRGVmYXVsdC5jbGVhcigpOwotICAgIG1BbGxvY1R5cGUuY2xlYXIoKTsKICAgICBtTGFzdC5jbGVhcigpOwogfQogCmRpZmYgLS1naXQgYS9saWJzL3JzL3JzUHJvZ3JhbVZlcnRleC5oIGIvbGlicy9ycy9yc1Byb2dyYW1WZXJ0ZXguaAppbmRleCAyODU1NGNjLi5kNmIzZjVhIDEwMDY0NAotLS0gYS9saWJzL3JzL3JzUHJvZ3JhbVZlcnRleC5oCisrKyBiL2xpYnMvcnMvcnNQcm9ncmFtVmVydGV4LmgKQEAgLTQzLDYgKzQzLDcgQEAKICAgICB2b2lkIGFkZExpZ2h0KGNvbnN0IExpZ2h0ICopOwogCiAgICAgdm9pZCBzZXRQcm9qZWN0aW9uTWF0cml4KGNvbnN0IHJzY19NYXRyaXggKikgY29uc3Q7CisgICAgdm9pZCBnZXRQcm9qZWN0aW9uTWF0cml4KHJzY19NYXRyaXggKikgY29uc3Q7CiAgICAgdm9pZCBzZXRNb2RlbHZpZXdNYXRyaXgoY29uc3QgcnNjX01hdHJpeCAqKSBjb25zdDsKICAgICB2b2lkIHNldFRleHR1cmVNYXRyaXgoY29uc3QgcnNjX01hdHJpeCAqKSBjb25zdDsKIApAQCAtNTIsNiArNTMsOSBAQAogICAgIHZpcnR1YWwgdm9pZCBsb2FkU2hhZGVyKENvbnRleHQgKik7CiAgICAgdmlydHVhbCB2b2lkIGluaXQoQ29udGV4dCAqKTsKIAorICAgIHZpcnR1YWwgdm9pZCBzZXJpYWxpemUoT1N0cmVhbSAqc3RyZWFtKSBjb25zdDsKKyAgICB2aXJ0dWFsIFJzQTNEQ2xhc3NJRCBnZXRDbGFzc0lkKCkgY29uc3QgeyByZXR1cm4gUlNfQTNEX0NMQVNTX0lEX1BST0dSQU1fVkVSVEVYOyB9CisgICAgc3RhdGljIFByb2dyYW1WZXJ0ZXggKmNyZWF0ZUZyb21TdHJlYW0oQ29udGV4dCAqcnNjLCBJU3RyZWFtICpzdHJlYW0pOwogCiBwcm90ZWN0ZWQ6CiAgICAgdWludDMyX3QgbUxpZ2h0Q291bnQ7CkBAIC01OSw5ICs2Myw2IEBACiAKICAgICAvLyBIYWNrcyB0byBjcmVhdGUgYSBwcm9ncmFtIGZvciBub3cKICAgICBib29sIG1UZXh0dXJlTWF0cml4RW5hYmxlOwotCi1wcml2YXRlOgotICAgIHZvaWQgaW5pdEFkZFVzZXJFbGVtZW50KGNvbnN0IEVsZW1lbnQgKmUsIFN0cmluZzggKm5hbWVzLCB1aW50MzJfdCAqY291bnQsIGNvbnN0IGNoYXIgKnByZWZpeCk7CiB9OwogCiAKQEAgLTcxLDE4ICs3MiwxMyBAQAogICAgIFByb2dyYW1WZXJ0ZXhTdGF0ZSgpOwogICAgIH5Qcm9ncmFtVmVydGV4U3RhdGUoKTsKIAotICAgIHZvaWQgaW5pdChDb250ZXh0ICpyc2MsIGludDMyX3QgdywgaW50MzJfdCBoKTsKKyAgICB2b2lkIGluaXQoQ29udGV4dCAqcnNjKTsKICAgICB2b2lkIGRlaW5pdChDb250ZXh0ICpyc2MpOwotICAgIHZvaWQgdXBkYXRlU2l6ZShDb250ZXh0ICpyc2MsIGludDMyX3QgdywgaW50MzJfdCBoKTsKKyAgICB2b2lkIHVwZGF0ZVNpemUoQ29udGV4dCAqcnNjKTsKIAogICAgIE9iamVjdEJhc2VSZWY8UHJvZ3JhbVZlcnRleD4gbURlZmF1bHQ7CiAgICAgT2JqZWN0QmFzZVJlZjxQcm9ncmFtVmVydGV4PiBtTGFzdDsKICAgICBPYmplY3RCYXNlUmVmPEFsbG9jYXRpb24+IG1EZWZhdWx0QWxsb2M7Ci0KLSAgICBPYmplY3RCYXNlUmVmPFR5cGU+IG1BbGxvY1R5cGU7Ci0KLQotICAgIGZsb2F0IGNvbG9yWzRdOwogfTsKIAogCmRpZmYgLS1naXQgYS9saWJzL3JzL3JzU2FtcGxlci5jcHAgYi9saWJzL3JzL3JzU2FtcGxlci5jcHAKaW5kZXggNzFmNTA4Zi4uNDdiOGE2MSAxMDA2NDQKLS0tIGEvbGlicy9ycy9yc1NhbXBsZXIuY3BwCisrKyBiL2xpYnMvcnMvcnNTYW1wbGVyLmNwcApAQCAtMTQsMTAgKzE0LDE2IEBACiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCisjaWZuZGVmIEFORFJPSURfUlNfQlVJTERfRk9SX0hPU1QKICNpbmNsdWRlIDxHTEVTL2dsLmg+CiAjaW5jbHVkZSA8R0xFUy9nbGV4dC5oPgotCiAjaW5jbHVkZSAicnNDb250ZXh0LmgiCisjZWxzZQorI2luY2x1ZGUgInJzQ29udGV4dEhvc3RTdHViLmgiCisjaW5jbHVkZSA8T3BlbkdML2dsLmg+CisjaW5jbHVkZSA8T3BlbkdML2dsZXh0Lmg+CisjZW5kaWYgLy9BTkRST0lEX1JTX0JVSUxEX0ZPUl9IT1NUCisKICNpbmNsdWRlICJyc1NhbXBsZXIuaCIKIAogCkBAIC02MSwyNSArNjcsMjkgQEAKICAgICAgICAgR0xfTElORUFSX01JUE1BUF9MSU5FQVIsIC8vUlNfU0FNUExFUl9MSU5FQVJfTUlQX0xJTkVBUiwKICAgICAgICAgR0xfUkVQRUFULCAvL1JTX1NBTVBMRVJfV1JBUCwKICAgICAgICAgR0xfQ0xBTVBfVE9fRURHRSwgLy9SU19TQU1QTEVSX0NMQU1QCi0KICAgICB9OwogCi0gICAgYm9vbCBmb3JjZU5vbk1pcCA9IGZhbHNlOwotICAgIGlmICghcnNjLT5leHRfT0VTX3RleHR1cmVfbnBvdCgpICYmIG5wb3QpIHsKLSAgICAgICAgZm9yY2VOb25NaXAgPSB0cnVlOwotICAgIH0KKyAgICBHTGVudW0gdHJhbnNOUFtdID0geworICAgICAgICBHTF9ORUFSRVNULCAvL1JTX1NBTVBMRVJfTkVBUkVTVCwKKyAgICAgICAgR0xfTElORUFSLCAvL1JTX1NBTVBMRVJfTElORUFSLAorICAgICAgICBHTF9MSU5FQVIsIC8vUlNfU0FNUExFUl9MSU5FQVJfTUlQX0xJTkVBUiwKKyAgICAgICAgR0xfQ0xBTVBfVE9fRURHRSwgLy9SU19TQU1QTEVSX1dSQVAsCisgICAgICAgIEdMX0NMQU1QX1RPX0VER0UsIC8vUlNfU0FNUExFUl9DTEFNUAorICAgIH07CiAKLSAgICBpZiAoKG1NaW5GaWx0ZXIgPT0gUlNfU0FNUExFUl9MSU5FQVJfTUlQX0xJTkVBUikgJiYgZm9yY2VOb25NaXApIHsKLSAgICAgICAgZ2xUZXhQYXJhbWV0ZXJpKEdMX1RFWFRVUkVfMkQsIEdMX1RFWFRVUkVfTUlOX0ZJTFRFUiwgR0xfTElORUFSKTsKKyAgICBpZiAoIXJzYy0+ZXh0X09FU190ZXh0dXJlX25wb3QoKSAmJiBucG90KSB7CisgICAgICAgIGdsVGV4UGFyYW1ldGVyaShHTF9URVhUVVJFXzJELCBHTF9URVhUVVJFX01JTl9GSUxURVIsIHRyYW5zTlBbbU1pbkZpbHRlcl0pOworICAgICAgICBnbFRleFBhcmFtZXRlcmkoR0xfVEVYVFVSRV8yRCwgR0xfVEVYVFVSRV9NQUdfRklMVEVSLCB0cmFuc05QW21NYWdGaWx0ZXJdKTsKKyAgICAgICAgZ2xUZXhQYXJhbWV0ZXJpKEdMX1RFWFRVUkVfMkQsIEdMX1RFWFRVUkVfV1JBUF9TLCB0cmFuc05QW21XcmFwU10pOworICAgICAgICBnbFRleFBhcmFtZXRlcmkoR0xfVEVYVFVSRV8yRCwgR0xfVEVYVFVSRV9XUkFQX1QsIHRyYW5zTlBbbVdyYXBUXSk7CiAgICAgfSBlbHNlIHsKICAgICAgICAgZ2xUZXhQYXJhbWV0ZXJpKEdMX1RFWFRVUkVfMkQsIEdMX1RFWFRVUkVfTUlOX0ZJTFRFUiwgdHJhbnNbbU1pbkZpbHRlcl0pOworICAgICAgICBnbFRleFBhcmFtZXRlcmkoR0xfVEVYVFVSRV8yRCwgR0xfVEVYVFVSRV9NQUdfRklMVEVSLCB0cmFuc1ttTWFnRmlsdGVyXSk7CisgICAgICAgIGdsVGV4UGFyYW1ldGVyaShHTF9URVhUVVJFXzJELCBHTF9URVhUVVJFX1dSQVBfUywgdHJhbnNbbVdyYXBTXSk7CisgICAgICAgIGdsVGV4UGFyYW1ldGVyaShHTF9URVhUVVJFXzJELCBHTF9URVhUVVJFX1dSQVBfVCwgdHJhbnNbbVdyYXBUXSk7CiAgICAgfQotICAgIGdsVGV4UGFyYW1ldGVyaShHTF9URVhUVVJFXzJELCBHTF9URVhUVVJFX01BR19GSUxURVIsIHRyYW5zW21NYWdGaWx0ZXJdKTsKLSAgICBnbFRleFBhcmFtZXRlcmkoR0xfVEVYVFVSRV8yRCwgR0xfVEVYVFVSRV9XUkFQX1MsIHRyYW5zW21XcmFwU10pOwotICAgIGdsVGV4UGFyYW1ldGVyaShHTF9URVhUVVJFXzJELCBHTF9URVhUVVJFX1dSQVBfVCwgdHJhbnNbbVdyYXBUXSk7CiAKLQotICAgIHJzYy0+Y2hlY2tFcnJvcigiUHJvZ3JhbUZyYWdtZW50OjpzZXR1cEdMMiB0ZXggZW52Iik7CisgICAgcnNjLT5jaGVja0Vycm9yKCJTYW1wbGVyOjpzZXR1cEdMMiB0ZXggZW52Iik7CiB9CiAKIHZvaWQgU2FtcGxlcjo6YmluZFRvQ29udGV4dChTYW1wbGVyU3RhdGUgKnNzLCB1aW50MzJfdCBzbG90KQpAQCAtOTQsNiArMTA0LDE3IEBACiAgICAgbUJvdW5kU2xvdCA9IC0xOwogICAgIHNzLT5tU2FtcGxlcnNbc2xvdF0uY2xlYXIoKTsKIH0KKwordm9pZCBTYW1wbGVyOjpzZXJpYWxpemUoT1N0cmVhbSAqc3RyZWFtKSBjb25zdAoreworCit9CisKK1NhbXBsZXIgKlNhbXBsZXI6OmNyZWF0ZUZyb21TdHJlYW0oQ29udGV4dCAqcnNjLCBJU3RyZWFtICpzdHJlYW0pCit7CisgICAgcmV0dXJuIE5VTEw7Cit9CisKIC8qCiB2b2lkIFNhbXBsZXJTdGF0ZTo6c2V0dXBHTCgpCiB7CmRpZmYgLS1naXQgYS9saWJzL3JzL3JzU2FtcGxlci5oIGIvbGlicy9ycy9yc1NhbXBsZXIuaAppbmRleCAwNTA2MDgxLi4zNzg2NDM5IDEwMDY0NAotLS0gYS9saWJzL3JzL3JzU2FtcGxlci5oCisrKyBiL2xpYnMvcnMvcnNTYW1wbGVyLmgKQEAgLTQ2LDYgKzQ2LDEwIEBACiAgICAgdm9pZCBiaW5kVG9Db250ZXh0KFNhbXBsZXJTdGF0ZSAqLCB1aW50MzJfdCBzbG90KTsKICAgICB2b2lkIHVuYmluZEZyb21Db250ZXh0KFNhbXBsZXJTdGF0ZSAqKTsKIAorICAgIHZpcnR1YWwgdm9pZCBzZXJpYWxpemUoT1N0cmVhbSAqc3RyZWFtKSBjb25zdDsKKyAgICB2aXJ0dWFsIFJzQTNEQ2xhc3NJRCBnZXRDbGFzc0lkKCkgY29uc3QgeyByZXR1cm4gUlNfQTNEX0NMQVNTX0lEX1NBTVBMRVI7IH0KKyAgICBzdGF0aWMgU2FtcGxlciAqY3JlYXRlRnJvbVN0cmVhbShDb250ZXh0ICpyc2MsIElTdHJlYW0gKnN0cmVhbSk7CisKIHByb3RlY3RlZDoKICAgICBSc1NhbXBsZXJWYWx1ZSBtTWFnRmlsdGVyOwogICAgIFJzU2FtcGxlclZhbHVlIG1NaW5GaWx0ZXI7CmRpZmYgLS1naXQgYS9saWJzL3JzL3JzU2NyaXB0LmNwcCBiL2xpYnMvcnMvcnNTY3JpcHQuY3BwCmluZGV4IGEzMzkzM2IuLmZjMjJmYzMgMTAwNjQ0Ci0tLSBhL2xpYnMvcnMvcnNTY3JpcHQuY3BwCisrKyBiL2xpYnMvcnMvcnNTY3JpcHQuY3BwCkBAIC0yNCwxOSArMjQsMjUgQEAKICAgICBtQWxsb2NGaWxlID0gX19GSUxFX187CiAgICAgbUFsbG9jTGluZSA9IF9fTElORV9fOwogICAgIG1lbXNldCgmbUVudmlyb21lbnQsIDAsIHNpemVvZihtRW52aXJvbWVudCkpOwotICAgIG1FbnZpcm9tZW50Lm1DbGVhckNvbG9yWzBdID0gMDsKLSAgICBtRW52aXJvbWVudC5tQ2xlYXJDb2xvclsxXSA9IDA7Ci0gICAgbUVudmlyb21lbnQubUNsZWFyQ29sb3JbMl0gPSAwOwotICAgIG1FbnZpcm9tZW50Lm1DbGVhckNvbG9yWzNdID0gMTsKLSAgICBtRW52aXJvbWVudC5tQ2xlYXJEZXB0aCA9IDE7Ci0gICAgbUVudmlyb21lbnQubUNsZWFyU3RlbmNpbCA9IDA7Ci0gICAgbUVudmlyb21lbnQubUlzUm9vdCA9IGZhbHNlOwogfQogCiBTY3JpcHQ6On5TY3JpcHQoKQogewogfQogCit2b2lkIFNjcmlwdDo6c2V0VmFyKHVpbnQzMl90IHNsb3QsIGNvbnN0IHZvaWQgKnZhbCwgdWludDMyX3QgbGVuKQoreworICAgIGludDMyX3QgKmRlc3RQdHIgPSAoKGludDMyX3QgKiopbUVudmlyb21lbnQubUZpZWxkQWRkcmVzcylbc2xvdF07CisgICAgaWYgKGRlc3RQdHIpIHsKKyAgICAgICAgLy9MT0dFKCJzZXRWYXIgZjEgICVmIiwgKChjb25zdCBmbG9hdCAqKWRlc3RQdHIpWzBdKTsKKyAgICAgICAgLy9MT0dFKCJzZXRWYXIgJXAgJWkiLCBkZXN0UHRyLCBsZW4pOworICAgICAgICBtZW1jcHkoZGVzdFB0ciwgdmFsLCBsZW4pOworICAgICAgICAvL0xPR0UoInNldFZhciBmMiAgJWYiLCAoKGNvbnN0IGZsb2F0ICopZGVzdFB0cilbMF0pOworICAgIH0gZWxzZSB7CisgICAgICAgIExPR0UoIkNhbGxpbmcgc2V0VmFyIG9uIHNsb3QgPSAlaSB3aGljaCBpcyBudWxsIiwgc2xvdCk7CisgICAgfQorfQorCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiBuYW1lc3BhY2UgcmVuZGVyc2NyaXB0IHsKIApAQCAtNDQsMTYgKzUwLDkgQEAKIHZvaWQgcnNpX1NjcmlwdEJpbmRBbGxvY2F0aW9uKENvbnRleHQgKiByc2MsIFJzU2NyaXB0IHZzLCBSc0FsbG9jYXRpb24gdmEsIHVpbnQzMl90IHNsb3QpCiB7CiAgICAgU2NyaXB0ICpzID0gc3RhdGljX2Nhc3Q8U2NyaXB0ICo+KHZzKTsKLSAgICBzLT5tU2xvdHNbc2xvdF0uc2V0KHN0YXRpY19jYXN0PEFsbG9jYXRpb24gKj4odmEpKTsKLX0KLQotdm9pZCByc2lfU2NyaXB0U2V0Q2xlYXJDb2xvcihDb250ZXh0ICogcnNjLCBSc1NjcmlwdCB2cywgZmxvYXQgciwgZmxvYXQgZywgZmxvYXQgYiwgZmxvYXQgYSkKLXsKLSAgICBTY3JpcHQgKnMgPSBzdGF0aWNfY2FzdDxTY3JpcHQgKj4odnMpOwotICAgIHMtPm1FbnZpcm9tZW50Lm1DbGVhckNvbG9yWzBdID0gcjsKLSAgICBzLT5tRW52aXJvbWVudC5tQ2xlYXJDb2xvclsxXSA9IGc7Ci0gICAgcy0+bUVudmlyb21lbnQubUNsZWFyQ29sb3JbMl0gPSBiOwotICAgIHMtPm1FbnZpcm9tZW50Lm1DbGVhckNvbG9yWzNdID0gYTsKKyAgICBBbGxvY2F0aW9uICphID0gc3RhdGljX2Nhc3Q8QWxsb2NhdGlvbiAqPih2YSk7CisgICAgcy0+bVNsb3RzW3Nsb3RdLnNldChhKTsKKyAgICAvL0xPR0UoInJzaV9TY3JpcHRCaW5kQWxsb2NhdGlvbiAlaSAgJXAgICVwIiwgc2xvdCwgYSwgYS0+Z2V0UHRyKCkpOwogfQogCiB2b2lkIHJzaV9TY3JpcHRTZXRUaW1lWm9uZShDb250ZXh0ICogcnNjLCBSc1NjcmlwdCB2cywgY29uc3QgY2hhciAqIHRpbWVab25lLCB1aW50MzJfdCBsZW5ndGgpCkBAIC02Miw1MyArNjEsNTEgQEAKICAgICBzLT5tRW52aXJvbWVudC5tVGltZVpvbmUgPSB0aW1lWm9uZTsKIH0KIAotdm9pZCByc2lfU2NyaXB0U2V0Q2xlYXJEZXB0aChDb250ZXh0ICogcnNjLCBSc1NjcmlwdCB2cywgZmxvYXQgdikKLXsKLSAgICBTY3JpcHQgKnMgPSBzdGF0aWNfY2FzdDxTY3JpcHQgKj4odnMpOwotICAgIHMtPm1FbnZpcm9tZW50Lm1DbGVhckRlcHRoID0gdjsKLX0KLQotdm9pZCByc2lfU2NyaXB0U2V0Q2xlYXJTdGVuY2lsKENvbnRleHQgKiByc2MsIFJzU2NyaXB0IHZzLCB1aW50MzJfdCB2KQotewotICAgIFNjcmlwdCAqcyA9IHN0YXRpY19jYXN0PFNjcmlwdCAqPih2cyk7Ci0gICAgcy0+bUVudmlyb21lbnQubUNsZWFyU3RlbmNpbCA9IHY7Ci19Ci0KIHZvaWQgcnNpX1NjcmlwdFNldFR5cGUoQ29udGV4dCAqIHJzYywgUnNUeXBlIHZ0LCB1aW50MzJfdCBzbG90LCBib29sIHdyaXRhYmxlLCBjb25zdCBjaGFyICpuYW1lKQogewogICAgIFNjcmlwdENTdGF0ZSAqc3MgPSAmcnNjLT5tU2NyaXB0QzsKICAgICBjb25zdCBUeXBlICp0ID0gc3RhdGljX2Nhc3Q8Y29uc3QgVHlwZSAqPih2dCk7CiAgICAgc3MtPm1Db25zdGFudEJ1ZmZlclR5cGVzW3Nsb3RdLnNldCh0KTsKICAgICBzcy0+bVNsb3RXcml0YWJsZVtzbG90XSA9IHdyaXRhYmxlOwotICAgIGlmIChuYW1lKSB7Ci0gICAgICAgIHNzLT5tU2xvdE5hbWVzW3Nsb3RdLnNldFRvKG5hbWUpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHNzLT5tU2xvdE5hbWVzW3Nsb3RdLnNldFRvKCIiKTsKLSAgICB9Ci19Ci0KLXZvaWQgcnNpX1NjcmlwdFNldEludm9rZShDb250ZXh0ICpyc2MsIGNvbnN0IGNoYXIgKm5hbWUsIHVpbnQzMl90IHNsb3QpCi17Ci0gICAgU2NyaXB0Q1N0YXRlICpzcyA9ICZyc2MtPm1TY3JpcHRDOwotICAgIHNzLT5tSW52b2thYmxlTmFtZXNbc2xvdF0gPSBuYW1lOworICAgIExPR0UoInJzaV9TY3JpcHRTZXRUeXBlIik7CiB9CiAKIHZvaWQgcnNpX1NjcmlwdEludm9rZShDb250ZXh0ICpyc2MsIFJzU2NyaXB0IHZzLCB1aW50MzJfdCBzbG90KQogewogICAgIFNjcmlwdCAqcyA9IHN0YXRpY19jYXN0PFNjcmlwdCAqPih2cyk7Ci0gICAgaWYgKHMtPm1FbnZpcm9tZW50Lm1JbnZva2FibGVzW3Nsb3RdID09IE5VTEwpIHsKLSAgICAgICAgcnNjLT5zZXRFcnJvcihSU19FUlJPUl9CQURfU0NSSVBULCAiQ2FsbGluZyBpbnZva2Ugb24gYmFkIHNjcmlwdCIpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIHMtPnNldHVwU2NyaXB0KCk7Ci0gICAgcy0+bUVudmlyb21lbnQubUludm9rYWJsZXNbc2xvdF0oKTsKKyAgICBzLT5JbnZva2UocnNjLCBzbG90LCBOVUxMLCAwKTsKIH0KIAogCi12b2lkIHJzaV9TY3JpcHRTZXRSb290KENvbnRleHQgKiByc2MsIGJvb2wgaXNSb290KQordm9pZCByc2lfU2NyaXB0SW52b2tlRGF0YShDb250ZXh0ICpyc2MsIFJzU2NyaXB0IHZzLCB1aW50MzJfdCBzbG90LCB2b2lkICpkYXRhKQogewotICAgIFNjcmlwdENTdGF0ZSAqc3MgPSAmcnNjLT5tU2NyaXB0QzsKLSAgICBzcy0+bVNjcmlwdC0+bUVudmlyb21lbnQubUlzUm9vdCA9IGlzUm9vdDsKKyAgICBTY3JpcHQgKnMgPSBzdGF0aWNfY2FzdDxTY3JpcHQgKj4odnMpOworICAgIHMtPkludm9rZShyc2MsIHNsb3QsIE5VTEwsIDApOworfQorCit2b2lkIHJzaV9TY3JpcHRJbnZva2VWKENvbnRleHQgKnJzYywgUnNTY3JpcHQgdnMsIHVpbnQzMl90IHNsb3QsIGNvbnN0IHZvaWQgKmRhdGEsIHVpbnQzMl90IGxlbikKK3sKKyAgICBTY3JpcHQgKnMgPSBzdGF0aWNfY2FzdDxTY3JpcHQgKj4odnMpOworICAgIHMtPkludm9rZShyc2MsIHNsb3QsIGRhdGEsIGxlbik7Cit9CisKK3ZvaWQgcnNpX1NjcmlwdFNldFZhckkoQ29udGV4dCAqcnNjLCBSc1NjcmlwdCB2cywgdWludDMyX3Qgc2xvdCwgaW50IHZhbHVlKQoreworICAgIFNjcmlwdCAqcyA9IHN0YXRpY19jYXN0PFNjcmlwdCAqPih2cyk7CisgICAgcy0+c2V0VmFyKHNsb3QsICZ2YWx1ZSwgc2l6ZW9mKHZhbHVlKSk7Cit9CisKK3ZvaWQgcnNpX1NjcmlwdFNldFZhckYoQ29udGV4dCAqcnNjLCBSc1NjcmlwdCB2cywgdWludDMyX3Qgc2xvdCwgZmxvYXQgdmFsdWUpCit7CisgICAgU2NyaXB0ICpzID0gc3RhdGljX2Nhc3Q8U2NyaXB0ICo+KHZzKTsKKyAgICBzLT5zZXRWYXIoc2xvdCwgJnZhbHVlLCBzaXplb2YodmFsdWUpKTsKK30KKwordm9pZCByc2lfU2NyaXB0U2V0VmFyVihDb250ZXh0ICpyc2MsIFJzU2NyaXB0IHZzLCB1aW50MzJfdCBzbG90LCBjb25zdCB2b2lkICpkYXRhLCB1aW50MzJfdCBsZW4pCit7CisgICAgY29uc3QgZmxvYXQgKmZwID0gKGNvbnN0IGZsb2F0ICopZGF0YTsKKyAgICBTY3JpcHQgKnMgPSBzdGF0aWNfY2FzdDxTY3JpcHQgKj4odnMpOworICAgIHMtPnNldFZhcihzbG90LCBkYXRhLCBsZW4pOwogfQogCiAKZGlmZiAtLWdpdCBhL2xpYnMvcnMvcnNTY3JpcHQuaCBiL2xpYnMvcnMvcnNTY3JpcHQuaAppbmRleCA1ZjRhNTM2Li4wYTIwMzQ0IDEwMDY0NAotLS0gYS9saWJzL3JzL3JzU2NyaXB0LmgKKysrIGIvbGlicy9ycy9yc1NjcmlwdC5oCkBAIC0yNyw5ICsyNyw5IEBACiBjbGFzcyBQcm9ncmFtVmVydGV4OwogY2xhc3MgUHJvZ3JhbUZyYWdtZW50OwogY2xhc3MgUHJvZ3JhbVJhc3RlcjsKLWNsYXNzIFByb2dyYW1GcmFnbWVudFN0b3JlOworY2xhc3MgUHJvZ3JhbVN0b3JlOwogCi0jZGVmaW5lIE1BWF9TQ1JJUFRfQkFOS1MgMTYKKyNkZWZpbmUgTUFYX1NDUklQVF9CQU5LUyAzMgogCiBjbGFzcyBTY3JpcHQgOiBwdWJsaWMgT2JqZWN0QmFzZQogewpAQCAtMzksMzggKzM5LDQzIEBACiAgICAgU2NyaXB0KENvbnRleHQgKik7CiAgICAgdmlydHVhbCB+U2NyaXB0KCk7CiAKLQogICAgIHN0cnVjdCBFbnZpcm9tZW50X3QgewotICAgICAgICBib29sIG1Jc1Jvb3Q7Ci0gICAgICAgIGZsb2F0IG1DbGVhckNvbG9yWzRdOwotICAgICAgICBmbG9hdCBtQ2xlYXJEZXB0aDsKLSAgICAgICAgdWludDMyX3QgbUNsZWFyU3RlbmNpbDsKLQotICAgICAgICB1aW50MzJfdCBtU3RhcnRUaW1lTWlsbGlzOworICAgICAgICBpbnQ2NF90IG1TdGFydFRpbWVNaWxsaXM7CisgICAgICAgIGludDY0X3QgbUxhc3REdFRpbWU7CiAgICAgICAgIGNvbnN0IGNoYXIqIG1UaW1lWm9uZTsKIAogICAgICAgICBPYmplY3RCYXNlUmVmPFByb2dyYW1WZXJ0ZXg+IG1WZXJ0ZXg7CiAgICAgICAgIE9iamVjdEJhc2VSZWY8UHJvZ3JhbUZyYWdtZW50PiBtRnJhZ21lbnQ7CiAgICAgICAgIE9iamVjdEJhc2VSZWY8UHJvZ3JhbVJhc3Rlcj4gbVJhc3RlcjsKLSAgICAgICAgT2JqZWN0QmFzZVJlZjxQcm9ncmFtRnJhZ21lbnRTdG9yZT4gbUZyYWdtZW50U3RvcmU7Ci0gICAgICAgIEludm9rZUZ1bmNfdCBtSW52b2thYmxlc1tNQVhfU0NSSVBUX0JBTktTXTsKKyAgICAgICAgT2JqZWN0QmFzZVJlZjxQcm9ncmFtU3RvcmU+IG1GcmFnbWVudFN0b3JlOworCisgICAgICAgIHVpbnQzMl90IG1JbnZva2VGdW5jdGlvbkNvdW50OworICAgICAgICBJbnZva2VGdW5jX3QgKm1JbnZva2VGdW5jdGlvbnM7CisgICAgICAgIHVpbnQzMl90IG1GaWVsZENvdW50OworICAgICAgICB2b2lkICoqIG1GaWVsZEFkZHJlc3M7CisKICAgICAgICAgY2hhciAqIG1TY3JpcHRUZXh0OwogICAgICAgICB1aW50MzJfdCBtU2NyaXB0VGV4dExlbmd0aDsKKworICAgICAgICBib29sIG1Jc1RocmVhZGFibGU7CiAgICAgfTsKICAgICBFbnZpcm9tZW50X3QgbUVudmlyb21lbnQ7CiAKLSAgICB1aW50MzJfdCBtQ291bnN0YW50QnVmZmVyQ291bnQ7Ci0KLQogICAgIE9iamVjdEJhc2VSZWY8QWxsb2NhdGlvbj4gbVNsb3RzW01BWF9TQ1JJUFRfQkFOS1NdOwogICAgIE9iamVjdEJhc2VSZWY8Y29uc3QgVHlwZT4gbVR5cGVzW01BWF9TQ1JJUFRfQkFOS1NdOwotICAgIFN0cmluZzggbVNsb3ROYW1lc1tNQVhfU0NSSVBUX0JBTktTXTsKICAgICBib29sIG1TbG90V3JpdGFibGVbTUFYX1NDUklQVF9CQU5LU107CiAKKyAgICB2b2lkIHNldFZhcih1aW50MzJfdCBzbG90LCBjb25zdCB2b2lkICp2YWwsIHVpbnQzMl90IGxlbik7CiAKKyAgICB2aXJ0dWFsIHZvaWQgcnVuRm9yRWFjaChDb250ZXh0ICpyc2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQWxsb2NhdGlvbiAqIGFpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBbGxvY2F0aW9uICogYW91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkICogdXNyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJzU2NyaXB0Q2FsbCAqc2MgPSBOVUxMKSA9IDA7CiAKLSAgICB2aXJ0dWFsIHZvaWQgc2V0dXBTY3JpcHQoKSA9IDA7Ci0gICAgdmlydHVhbCB1aW50MzJfdCBydW4oQ29udGV4dCAqLCB1aW50MzJfdCBsYXVuY2hJRCkgPSAwOworICAgIHZpcnR1YWwgdm9pZCBJbnZva2UoQ29udGV4dCAqcnNjLCB1aW50MzJfdCBzbG90LCBjb25zdCB2b2lkICpkYXRhLCB1aW50MzJfdCBsZW4pID0gMDsKKyAgICB2aXJ0dWFsIHZvaWQgc2V0dXBTY3JpcHQoQ29udGV4dCAqcnNjKSA9IDA7CisgICAgdmlydHVhbCB1aW50MzJfdCBydW4oQ29udGV4dCAqKSA9IDA7CiB9OwogCiAKZGlmZiAtLWdpdCBhL2xpYnMvcnMvcnNTY3JpcHRDLmNwcCBiL2xpYnMvcnMvcnNTY3JpcHRDLmNwcAppbmRleCBmNGQyNDUxLi42NjI3OTFkIDEwMDY0NAotLS0gYS9saWJzL3JzL3JzU2NyaXB0Qy5jcHAKKysrIGIvbGlicy9ycy9yc1NjcmlwdEMuY3BwCkBAIC0xNyw4ICsxNyw3IEBACiAjaW5jbHVkZSAicnNDb250ZXh0LmgiCiAjaW5jbHVkZSAicnNTY3JpcHRDLmgiCiAjaW5jbHVkZSAicnNNYXRyaXguaCIKLQotI2luY2x1ZGUgImFjYy9hY2MuaCIKKyNpbmNsdWRlICIuLi8uLi9jb21waWxlL2xpYmJjYy9pbmNsdWRlL2JjYy9iY2MuaCIKICNpbmNsdWRlICJ1dGlscy9UaW1lcnMuaCIKIAogI2luY2x1ZGUgPEdMRVMvZ2wuaD4KQEAgLTM3LDQwICszNiw3NCBAQAogewogICAgIG1BbGxvY0ZpbGUgPSBfX0ZJTEVfXzsKICAgICBtQWxsb2NMaW5lID0gX19MSU5FX187Ci0gICAgbUFjY1NjcmlwdCA9IE5VTEw7CisgICAgbUJjY1NjcmlwdCA9IE5VTEw7CiAgICAgbWVtc2V0KCZtUHJvZ3JhbSwgMCwgc2l6ZW9mKG1Qcm9ncmFtKSk7CiB9CiAKIFNjcmlwdEM6On5TY3JpcHRDKCkKIHsKLSAgICBpZiAobUFjY1NjcmlwdCkgewotICAgICAgICBhY2NEZWxldGVTY3JpcHQobUFjY1NjcmlwdCk7CisgICAgaWYgKG1CY2NTY3JpcHQpIHsKKyAgICAgICAgYmNjRGVsZXRlU2NyaXB0KG1CY2NTY3JpcHQpOwogICAgIH0KICAgICBmcmVlKG1FbnZpcm9tZW50Lm1TY3JpcHRUZXh0KTsKICAgICBtRW52aXJvbWVudC5tU2NyaXB0VGV4dCA9IE5VTEw7CiB9CiAKLXZvaWQgU2NyaXB0Qzo6c2V0dXBTY3JpcHQoKQordm9pZCBTY3JpcHRDOjpzZXR1cFNjcmlwdChDb250ZXh0ICpyc2MpCiB7Ci0gICAgZm9yIChpbnQgY3Q9MDsgY3QgPCBNQVhfU0NSSVBUX0JBTktTOyBjdCsrKSB7Ci0gICAgICAgIGlmIChtUHJvZ3JhbS5tU2xvdFBvaW50ZXJzW2N0XSkgewotICAgICAgICAgICAgKm1Qcm9ncmFtLm1TbG90UG9pbnRlcnNbY3RdID0gbVNsb3RzW2N0XS0+Z2V0UHRyKCk7CisgICAgc2V0dXBHTFN0YXRlKHJzYyk7CisgICAgbUVudmlyb21lbnQubVN0YXJ0VGltZU1pbGxpcworICAgICAgICAgICAgICAgID0gbmFub3NlY29uZHNfdG9fbWlsbGlzZWNvbmRzKHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKSk7CisKKyAgICBmb3IgKHVpbnQzMl90IGN0PTA7IGN0IDwgbUVudmlyb21lbnQubUZpZWxkQ291bnQ7IGN0KyspIHsKKyAgICAgICAgaWYgKCFtU2xvdHNbY3RdLmdldCgpKQorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIHZvaWQgKnB0ciA9IG1TbG90c1tjdF0tPmdldFB0cigpOworICAgICAgICB2b2lkICoqZGVzdCA9ICgodm9pZCAqKiopbUVudmlyb21lbnQubUZpZWxkQWRkcmVzcylbY3RdOworICAgICAgICAvL0xPR0UoInNldHVwU2NyaXB0ICVpICVwID0gJXAgICAgJXAgJWkiLCBjdCwgZGVzdCwgcHRyLCBtU2xvdHNbY3RdLT5nZXRUeXBlKCksIG1TbG90c1tjdF0tPmdldFR5cGUoKS0+Z2V0RGltWCgpKTsKKworICAgICAgICAvL2NvbnN0IHVpbnQzMl90ICpwMzIgPSAoY29uc3QgdWludDMyX3QgKilwdHI7CisgICAgICAgIC8vZm9yICh1aW50MzJfdCBjdDI9MDsgY3QyIDwgbVNsb3RzW2N0XS0+Z2V0VHlwZSgpLT5nZXREaW1YKCk7IGN0MisrKSB7CisgICAgICAgICAgICAvL0xPR0UoIiAgJWkgPSAweCUwOHggIiwgY3QyLCBwMzJbY3QyXSk7CisgICAgICAgIC8vfQorCisgICAgICAgIGlmIChkZXN0KSB7CisgICAgICAgICAgICAqZGVzdCA9IHB0cjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIExPR0UoIlNjcmlwdEM6OnNldHVwU2NyaXB0LCBOVUxMIHZhciBiaW5kaW5nIGFkZHJlc3MuIik7CiAgICAgICAgIH0KICAgICB9CiB9CiAKLQotdWludDMyX3QgU2NyaXB0Qzo6cnVuKENvbnRleHQgKnJzYywgdWludDMyX3QgbGF1bmNoSW5kZXgpCitjb25zdCBBbGxvY2F0aW9uICpTY3JpcHRDOjpwdHJUb0FsbG9jYXRpb24oY29uc3Qgdm9pZCAqcHRyKSBjb25zdAogewotICAgIGlmIChtUHJvZ3JhbS5tU2NyaXB0ID09IE5VTEwpIHsKLSAgICAgICAgcnNjLT5zZXRFcnJvcihSU19FUlJPUl9CQURfU0NSSVBULCAiQXR0ZW1wdGVkIHRvIHJ1biBiYWQgc2NyaXB0Iik7Ci0gICAgICAgIHJldHVybiAwOworICAgIGlmICghcHRyKSB7CisgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KKyAgICBmb3IgKHVpbnQzMl90IGN0PTA7IGN0IDwgbUVudmlyb21lbnQubUZpZWxkQ291bnQ7IGN0KyspIHsKKyAgICAgICAgaWYgKCFtU2xvdHNbY3RdLmdldCgpKQorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIGlmIChtU2xvdHNbY3RdLT5nZXRQdHIoKSA9PSBwdHIpIHsKKyAgICAgICAgICAgIHJldHVybiBtU2xvdHNbY3RdLmdldCgpOworICAgICAgICB9CisgICAgfQorICAgIExPR0UoIlNjcmlwdEM6OnB0clRvQWxsb2NhdGlvbiwgZmFpbGVkIHRvIGZpbmQgJXAiLCBwdHIpOworICAgIHJldHVybiBOVUxMOworfQogCi0gICAgQ29udGV4dDo6U2NyaXB0VExTU3RydWN0ICogdGxzID0KLSAgICAoQ29udGV4dDo6U2NyaXB0VExTU3RydWN0ICopcHRocmVhZF9nZXRzcGVjaWZpYyhDb250ZXh0OjpnVGhyZWFkVExTS2V5KTsKK1NjcmlwdCAqIFNjcmlwdEM6OnNldFRMUyhTY3JpcHQgKnNjKQoreworICAgIENvbnRleHQ6OlNjcmlwdFRMU1N0cnVjdCAqIHRscyA9IChDb250ZXh0OjpTY3JpcHRUTFNTdHJ1Y3QgKikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdGhyZWFkX2dldHNwZWNpZmljKENvbnRleHQ6OmdUaHJlYWRUTFNLZXkpOwogICAgIHJzQXNzZXJ0KHRscyk7CisgICAgU2NyaXB0ICpvbGQgPSB0bHMtPm1TY3JpcHQ7CisgICAgdGxzLT5tU2NyaXB0ID0gc2M7CisgICAgcmV0dXJuIG9sZDsKK30KIAorCit2b2lkIFNjcmlwdEM6OnNldHVwR0xTdGF0ZShDb250ZXh0ICpyc2MpCit7CiAgICAgaWYgKG1FbnZpcm9tZW50Lm1GcmFnbWVudFN0b3JlLmdldCgpKSB7CiAgICAgICAgIHJzYy0+c2V0RnJhZ21lbnRTdG9yZShtRW52aXJvbWVudC5tRnJhZ21lbnRTdG9yZS5nZXQoKSk7CiAgICAgfQpAQCAtODMsMjAgKzExNiwyMTQgQEAKICAgICBpZiAobUVudmlyb21lbnQubVJhc3Rlci5nZXQoKSkgewogICAgICAgICByc2MtPnNldFJhc3RlcihtRW52aXJvbWVudC5tUmFzdGVyLmdldCgpKTsKICAgICB9Cit9CiAKLSAgICBpZiAobGF1bmNoSW5kZXggPT0gMCkgewotICAgICAgICBtRW52aXJvbWVudC5tU3RhcnRUaW1lTWlsbGlzCi0gICAgICAgICAgICAgICAgPSBuYW5vc2Vjb25kc190b19taWxsaXNlY29uZHMoc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpKTsKK3VpbnQzMl90IFNjcmlwdEM6OnJ1bihDb250ZXh0ICpyc2MpCit7CisgICAgaWYgKG1Qcm9ncmFtLm1Sb290ID09IE5VTEwpIHsKKyAgICAgICAgcnNjLT5zZXRFcnJvcihSU19FUlJPUl9CQURfU0NSSVBULCAiQXR0ZW1wdGVkIHRvIHJ1biBiYWQgc2NyaXB0Iik7CisgICAgICAgIHJldHVybiAwOwogICAgIH0KLSAgICBzZXR1cFNjcmlwdCgpOworCisgICAgc2V0dXBTY3JpcHQocnNjKTsKIAogICAgIHVpbnQzMl90IHJldCA9IDA7Ci0gICAgdGxzLT5tU2NyaXB0ID0gdGhpczsKLSAgICByZXQgPSBtUHJvZ3JhbS5tU2NyaXB0KGxhdW5jaEluZGV4KTsKLSAgICB0bHMtPm1TY3JpcHQgPSBOVUxMOworICAgIFNjcmlwdCAqIG9sZFRMUyA9IHNldFRMUyh0aGlzKTsKKyAgICAvL0xPR0UoIlNjcmlwdEM6OnJ1biAlcCIsIG1Qcm9ncmFtLm1Sb290KTsKKyAgICByZXQgPSBtUHJvZ3JhbS5tUm9vdCgpOworICAgIHNldFRMUyhvbGRUTFMpOworICAgIC8vTE9HRSgiU2NyaXB0Qzo6cnVuIHJldCAlaSIsIHJldCk7CiAgICAgcmV0dXJuIHJldDsKIH0KIAorCit0eXBlZGVmIHN0cnVjdCB7CisgICAgQ29udGV4dCAqcnNjOworICAgIFNjcmlwdEMgKnNjcmlwdDsKKyAgICBjb25zdCBBbGxvY2F0aW9uICogYWluOworICAgIEFsbG9jYXRpb24gKiBhb3V0OworICAgIGNvbnN0IHZvaWQgKiB1c3I7CisKKyAgICB1aW50MzJfdCBtU2xpY2VTaXplOworICAgIHZvbGF0aWxlIGludCBtU2xpY2VOdW07CisKKyAgICBjb25zdCB1aW50OF90ICpwdHJJbjsKKyAgICB1aW50MzJfdCBlU3RyaWRlSW47CisgICAgdWludDhfdCAqcHRyT3V0OworICAgIHVpbnQzMl90IGVTdHJpZGVPdXQ7CisKKyAgICB1aW50MzJfdCB4U3RhcnQ7CisgICAgdWludDMyX3QgeEVuZDsKKyAgICB1aW50MzJfdCB5U3RhcnQ7CisgICAgdWludDMyX3QgeUVuZDsKKyAgICB1aW50MzJfdCB6U3RhcnQ7CisgICAgdWludDMyX3QgekVuZDsKKyAgICB1aW50MzJfdCBhcnJheVN0YXJ0OworICAgIHVpbnQzMl90IGFycmF5RW5kOworCisgICAgdWludDMyX3QgZGltWDsKKyAgICB1aW50MzJfdCBkaW1ZOworICAgIHVpbnQzMl90IGRpbVo7CisgICAgdWludDMyX3QgZGltQXJyYXk7Cit9IE1UTGF1bmNoU3RydWN0OwordHlwZWRlZiBpbnQgKCpyc190KShjb25zdCB2b2lkICosIHZvaWQgKiwgY29uc3Qgdm9pZCAqLCB1aW50MzJfdCwgdWludDMyX3QsIHVpbnQzMl90LCB1aW50MzJfdCk7CisKK3N0YXRpYyB2b2lkIHdjX3h5KHZvaWQgKnVzciwgdWludDMyX3QgaWR4KQoreworICAgIE1UTGF1bmNoU3RydWN0ICptdGxzID0gKE1UTGF1bmNoU3RydWN0ICopdXNyOworCisgICAgd2hpbGUgKDEpIHsKKyAgICAgICAgdWludDMyX3Qgc2xpY2UgPSAodWludDMyX3QpYW5kcm9pZF9hdG9taWNfaW5jKCZtdGxzLT5tU2xpY2VOdW0pOworICAgICAgICB1aW50MzJfdCB5U3RhcnQgPSBtdGxzLT55U3RhcnQgKyBzbGljZSAqIG10bHMtPm1TbGljZVNpemU7CisgICAgICAgIHVpbnQzMl90IHlFbmQgPSB5U3RhcnQgKyBtdGxzLT5tU2xpY2VTaXplOworICAgICAgICB5RW5kID0gcnNNaW4oeUVuZCwgbXRscy0+eUVuZCk7CisgICAgICAgIGlmICh5RW5kIDw9IHlTdGFydCkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgLy9MT0dFKCJ1c3IgaWR4ICVpLCB4ICVpLCVpICB5ICVpLCVpIiwgaWR4LCBtdGxzLT54U3RhcnQsIG10bHMtPnhFbmQsIHlTdGFydCwgeUVuZCk7CisKKyAgICAgICAgZm9yICh1aW50MzJfdCB5ID0geVN0YXJ0OyB5IDwgeUVuZDsgeSsrKSB7CisgICAgICAgICAgICB1aW50MzJfdCBvZmZzZXQgPSBtdGxzLT5kaW1YICogeTsKKyAgICAgICAgICAgIHVpbnQ4X3QgKnhQdHJPdXQgPSBtdGxzLT5wdHJPdXQgKyAobXRscy0+ZVN0cmlkZU91dCAqIG9mZnNldCk7CisgICAgICAgICAgICBjb25zdCB1aW50OF90ICp4UHRySW4gPSBtdGxzLT5wdHJJbiArIChtdGxzLT5lU3RyaWRlSW4gKiBvZmZzZXQpOworCisgICAgICAgICAgICBmb3IgKHVpbnQzMl90IHggPSBtdGxzLT54U3RhcnQ7IHggPCBtdGxzLT54RW5kOyB4KyspIHsKKyAgICAgICAgICAgICAgICAoKHJzX3QpbXRscy0+c2NyaXB0LT5tUHJvZ3JhbS5tUm9vdCkgKHhQdHJJbiwgeFB0ck91dCwgbXRscy0+dXNyLCB4LCB5LCAwLCAwKTsKKyAgICAgICAgICAgICAgICB4UHRySW4gKz0gbXRscy0+ZVN0cmlkZUluOworICAgICAgICAgICAgICAgIHhQdHJPdXQgKz0gbXRscy0+ZVN0cmlkZU91dDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworfQorCit2b2lkIFNjcmlwdEM6OnJ1bkZvckVhY2goQ29udGV4dCAqcnNjLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFsbG9jYXRpb24gKiBhaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgQWxsb2NhdGlvbiAqIGFvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCAqIHVzciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSc1NjcmlwdENhbGwgKnNjKQoreworICAgIE1UTGF1bmNoU3RydWN0IG10bHM7CisgICAgbWVtc2V0KCZtdGxzLCAwLCBzaXplb2YobXRscykpOworCisgICAgaWYgKGFpbikgeworICAgICAgICBtdGxzLmRpbVggPSBhaW4tPmdldFR5cGUoKS0+Z2V0RGltWCgpOworICAgICAgICBtdGxzLmRpbVkgPSBhaW4tPmdldFR5cGUoKS0+Z2V0RGltWSgpOworICAgICAgICBtdGxzLmRpbVogPSBhaW4tPmdldFR5cGUoKS0+Z2V0RGltWigpOworICAgICAgICAvL210bHMuZGltQXJyYXkgPSBhaW4tPmdldFR5cGUoKS0+Z2V0RGltQXJyYXkoKTsKKyAgICB9IGVsc2UgaWYgKGFvdXQpIHsKKyAgICAgICAgbXRscy5kaW1YID0gYW91dC0+Z2V0VHlwZSgpLT5nZXREaW1YKCk7CisgICAgICAgIG10bHMuZGltWSA9IGFvdXQtPmdldFR5cGUoKS0+Z2V0RGltWSgpOworICAgICAgICBtdGxzLmRpbVogPSBhb3V0LT5nZXRUeXBlKCktPmdldERpbVooKTsKKyAgICAgICAgLy9tdGxzLmRpbUFycmF5ID0gYW91dC0+Z2V0VHlwZSgpLT5nZXREaW1BcnJheSgpOworICAgIH0gZWxzZSB7CisgICAgICAgIHJzYy0+c2V0RXJyb3IoUlNfRVJST1JfQkFEX1NDUklQVCwgInJzRm9yRWFjaCBjYWxsZWQgd2l0aCBudWxsIGFsbG9jYXRpb25zIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAoIXNjIHx8IChzYy0+eEVuZCA9PSAwKSkgeworICAgICAgICBtdGxzLnhFbmQgPSBtdGxzLmRpbVg7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcnNBc3NlcnQoc2MtPnhTdGFydCA8IG10bHMuZGltWCk7CisgICAgICAgIHJzQXNzZXJ0KHNjLT54RW5kIDw9IG10bHMuZGltWCk7CisgICAgICAgIHJzQXNzZXJ0KHNjLT54U3RhcnQgPCBzYy0+eEVuZCk7CisgICAgICAgIG10bHMueFN0YXJ0ID0gcnNNaW4obXRscy5kaW1YLCBzYy0+eFN0YXJ0KTsKKyAgICAgICAgbXRscy54RW5kID0gcnNNaW4obXRscy5kaW1YLCBzYy0+eEVuZCk7CisgICAgICAgIGlmIChtdGxzLnhTdGFydCA+PSBtdGxzLnhFbmQpIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAoIXNjIHx8IChzYy0+eUVuZCA9PSAwKSkgeworICAgICAgICBtdGxzLnlFbmQgPSBtdGxzLmRpbVk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcnNBc3NlcnQoc2MtPnlTdGFydCA8IG10bHMuZGltWSk7CisgICAgICAgIHJzQXNzZXJ0KHNjLT55RW5kIDw9IG10bHMuZGltWSk7CisgICAgICAgIHJzQXNzZXJ0KHNjLT55U3RhcnQgPCBzYy0+eUVuZCk7CisgICAgICAgIG10bHMueVN0YXJ0ID0gcnNNaW4obXRscy5kaW1ZLCBzYy0+eVN0YXJ0KTsKKyAgICAgICAgbXRscy55RW5kID0gcnNNaW4obXRscy5kaW1ZLCBzYy0+eUVuZCk7CisgICAgICAgIGlmIChtdGxzLnlTdGFydCA+PSBtdGxzLnlFbmQpIHJldHVybjsKKyAgICB9CisKKyAgICBtdGxzLnhFbmQgPSByc01heCgodWludDMyX3QpMSwgbXRscy54RW5kKTsKKyAgICBtdGxzLnlFbmQgPSByc01heCgodWludDMyX3QpMSwgbXRscy55RW5kKTsKKyAgICBtdGxzLnpFbmQgPSByc01heCgodWludDMyX3QpMSwgbXRscy56RW5kKTsKKyAgICBtdGxzLmFycmF5RW5kID0gcnNNYXgoKHVpbnQzMl90KTEsIG10bHMuYXJyYXlFbmQpOworCisgICAgcnNBc3NlcnQoYWluLT5nZXRUeXBlKCktPmdldERpbVooKSA9PSAwKTsKKworICAgIHNldHVwU2NyaXB0KHJzYyk7CisgICAgU2NyaXB0ICogb2xkVExTID0gc2V0VExTKHRoaXMpOworCisKKyAgICBtdGxzLnJzYyA9IHJzYzsKKyAgICBtdGxzLmFpbiA9IGFpbjsKKyAgICBtdGxzLmFvdXQgPSBhb3V0OworICAgIG10bHMuc2NyaXB0ID0gdGhpczsKKyAgICBtdGxzLnVzciA9IHVzcjsKKyAgICBtdGxzLm1TbGljZVNpemUgPSAxMDsKKyAgICBtdGxzLm1TbGljZU51bSA9IDA7CisKKyAgICBtdGxzLnB0ckluID0gTlVMTDsKKyAgICBtdGxzLmVTdHJpZGVJbiA9IDA7CisgICAgaWYgKGFpbikgeworICAgICAgICBtdGxzLnB0ckluID0gKGNvbnN0IHVpbnQ4X3QgKilhaW4tPmdldFB0cigpOworICAgICAgICBtdGxzLmVTdHJpZGVJbiA9IGFpbi0+Z2V0VHlwZSgpLT5nZXRFbGVtZW50U2l6ZUJ5dGVzKCk7CisgICAgfQorCisgICAgbXRscy5wdHJPdXQgPSBOVUxMOworICAgIG10bHMuZVN0cmlkZU91dCA9IDA7CisgICAgaWYgKGFvdXQpIHsKKyAgICAgICAgbXRscy5wdHJPdXQgPSAodWludDhfdCAqKWFvdXQtPmdldFB0cigpOworICAgICAgICBtdGxzLmVTdHJpZGVPdXQgPSBhb3V0LT5nZXRUeXBlKCktPmdldEVsZW1lbnRTaXplQnl0ZXMoKTsKKyAgICB9CisKKworICAgIGlmICgocnNjLT5nZXRXb3JrZXJQb29sU2l6ZSgpID4gMSkgJiYgbUVudmlyb21lbnQubUlzVGhyZWFkYWJsZSAmJgorICAgICAgICAoKG10bHMuZGltWSAqIG10bHMuZGltWiAqIG10bHMuZGltQXJyYXkpID4gMSkpIHsKKworICAgICAgICAvL0xPR0UoImxhdW5jaCAxIik7CisgICAgICAgIHJzYy0+bGF1bmNoVGhyZWFkcyh3Y194eSwgJm10bHMpOworICAgICAgICAvL0xPR0UoImxhdW5jaCAyIik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZm9yICh1aW50MzJfdCBhciA9IG10bHMuYXJyYXlTdGFydDsgYXIgPCBtdGxzLmFycmF5RW5kOyBhcisrKSB7CisgICAgICAgICAgICBmb3IgKHVpbnQzMl90IHogPSBtdGxzLnpTdGFydDsgeiA8IG10bHMuekVuZDsgeisrKSB7CisgICAgICAgICAgICAgICAgZm9yICh1aW50MzJfdCB5ID0gbXRscy55U3RhcnQ7IHkgPCBtdGxzLnlFbmQ7IHkrKykgeworICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBvZmZzZXQgPSBtdGxzLmRpbVggKiBtdGxzLmRpbVkgKiBtdGxzLmRpbVogKiBhciArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG10bHMuZGltWCAqIG10bHMuZGltWSAqIHogKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtdGxzLmRpbVggKiB5OworICAgICAgICAgICAgICAgICAgICB1aW50OF90ICp4UHRyT3V0ID0gbXRscy5wdHJPdXQgKyAobXRscy5lU3RyaWRlT3V0ICogb2Zmc2V0KTsKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqeFB0ckluID0gbXRscy5wdHJJbiArIChtdGxzLmVTdHJpZGVJbiAqIG9mZnNldCk7CisKKyAgICAgICAgICAgICAgICAgICAgZm9yICh1aW50MzJfdCB4ID0gbXRscy54U3RhcnQ7IHggPCBtdGxzLnhFbmQ7IHgrKykgeworICAgICAgICAgICAgICAgICAgICAgICAgKChyc190KW1Qcm9ncmFtLm1Sb290KSAoeFB0ckluLCB4UHRyT3V0LCB1c3IsIHgsIHksIHosIGFyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHhQdHJJbiArPSBtdGxzLmVTdHJpZGVJbjsKKyAgICAgICAgICAgICAgICAgICAgICAgIHhQdHJPdXQgKz0gbXRscy5lU3RyaWRlT3V0OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgc2V0VExTKG9sZFRMUyk7Cit9CisKK3ZvaWQgU2NyaXB0Qzo6SW52b2tlKENvbnRleHQgKnJzYywgdWludDMyX3Qgc2xvdCwgY29uc3Qgdm9pZCAqZGF0YSwgdWludDMyX3QgbGVuKQoreworICAgIC8vTE9HRSgicnNpX1NjcmlwdEludm9rZSAlaSIsIHNsb3QpOworICAgIGlmICgoc2xvdCA+PSBtRW52aXJvbWVudC5tSW52b2tlRnVuY3Rpb25Db3VudCkgfHwKKyAgICAgICAgKG1FbnZpcm9tZW50Lm1JbnZva2VGdW5jdGlvbnNbc2xvdF0gPT0gTlVMTCkpIHsKKyAgICAgICAgcnNjLT5zZXRFcnJvcihSU19FUlJPUl9CQURfU0NSSVBULCAiQ2FsbGluZyBpbnZva2Ugb24gYmFkIHNjcmlwdCIpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIHNldHVwU2NyaXB0KHJzYyk7CisgICAgU2NyaXB0ICogb2xkVExTID0gc2V0VExTKHRoaXMpOworCisgICAgKCh2b2lkICgqKShjb25zdCB2b2lkICosIHVpbnQzMl90KSkKKyAgICAgICAgbUVudmlyb21lbnQubUludm9rZUZ1bmN0aW9uc1tzbG90XSkoZGF0YSwgbGVuKTsKKworICAgIHNldFRMUyhvbGRUTFMpOworfQorCiBTY3JpcHRDU3RhdGU6OlNjcmlwdENTdGF0ZSgpCiB7CiAgICAgbVNjcmlwdCA9IE5VTEw7CkBAIC0xMTMsMjEgKzM0MCwyNyBAQAogewogICAgIGZvciAodWludDMyX3QgY3Q9MDsgY3QgPCBNQVhfU0NSSVBUX0JBTktTOyBjdCsrKSB7CiAgICAgICAgIG1Db25zdGFudEJ1ZmZlclR5cGVzW2N0XS5jbGVhcigpOwotICAgICAgICBtU2xvdE5hbWVzW2N0XS5zZXRUbygiIik7Ci0gICAgICAgIG1JbnZva2FibGVOYW1lc1tjdF0uc2V0VG8oIiIpOwogICAgICAgICBtU2xvdFdyaXRhYmxlW2N0XSA9IGZhbHNlOwogICAgIH0KIAogICAgIGRlbGV0ZSBtU2NyaXB0OwogICAgIG1TY3JpcHQgPSBuZXcgU2NyaXB0QyhOVUxMKTsKLQotICAgIG1JbnQzMkRlZmluZXMuY2xlYXIoKTsKLSAgICBtRmxvYXREZWZpbmVzLmNsZWFyKCk7CiB9CiAKLXN0YXRpYyBBQ0N2b2lkKiBzeW1ib2xMb29rdXAoQUNDdm9pZCogcENvbnRleHQsIGNvbnN0IEFDQ2NoYXIqIG5hbWUpCitzdGF0aWMgQkNDdm9pZCogc3ltYm9sTG9va3VwKEJDQ3ZvaWQqIHBDb250ZXh0LCBjb25zdCBCQ0NjaGFyKiBuYW1lKQogewotICAgIGNvbnN0IFNjcmlwdENTdGF0ZTo6U3ltYm9sVGFibGVfdCAqc3ltID0gU2NyaXB0Q1N0YXRlOjpsb29rdXBTeW1ib2wobmFtZSk7CisgICAgY29uc3QgU2NyaXB0Q1N0YXRlOjpTeW1ib2xUYWJsZV90ICpzeW07CisgICAgU2NyaXB0QyAqcyA9IChTY3JpcHRDICopcENvbnRleHQ7CisgICAgc3ltID0gU2NyaXB0Q1N0YXRlOjpsb29rdXBTeW1ib2wobmFtZSk7CisgICAgaWYgKHN5bSkgeworICAgICAgICByZXR1cm4gc3ltLT5tUHRyOworICAgIH0KKyAgICBzLT5tRW52aXJvbWVudC5tSXNUaHJlYWRhYmxlID0gZmFsc2U7CisgICAgc3ltID0gU2NyaXB0Q1N0YXRlOjpsb29rdXBTeW1ib2xDTChuYW1lKTsKKyAgICBpZiAoc3ltKSB7CisgICAgICAgIHJldHVybiBzeW0tPm1QdHI7CisgICAgfQorICAgIHN5bSA9IFNjcmlwdENTdGF0ZTo6bG9va3VwU3ltYm9sR0wobmFtZSk7CiAgICAgaWYgKHN5bSkgewogICAgICAgICByZXR1cm4gc3ltLT5tUHRyOwogICAgIH0KQEAgLTEzNyw2NSArMzcwLDUzIEBACiAKIHZvaWQgU2NyaXB0Q1N0YXRlOjpydW5Db21waWxlcihDb250ZXh0ICpyc2MsIFNjcmlwdEMgKnMpCiB7Ci0gICAgcy0+bUFjY1NjcmlwdCA9IGFjY0NyZWF0ZVNjcmlwdCgpOwotICAgIFN0cmluZzggdG1wOworICAgIExPR1YoIlNjcmlwdENTdGF0ZTo6cnVuQ29tcGlsZXIgIik7CiAKLSAgICByc2MtPmFwcGVuZE5hbWVEZWZpbmVzKCZ0bXApOwotICAgIGFwcGVuZERlY2xzKCZ0bXApOwotICAgIGFwcGVuZFZhckRlZmluZXMocnNjLCAmdG1wKTsKLSAgICBhcHBlbmRUeXBlcyhyc2MsICZ0bXApOwotICAgIHRtcC5hcHBlbmQoIiNsaW5lIDFcbiIpOwotCi0gICAgY29uc3QgY2hhciogc2NyaXB0U291cmNlW10gPSB7dG1wLnN0cmluZygpLCBzLT5tRW52aXJvbWVudC5tU2NyaXB0VGV4dH07Ci0gICAgaW50IHNjcmlwdExlbmd0aFtdID0ge3RtcC5sZW5ndGgoKSwgcy0+bUVudmlyb21lbnQubVNjcmlwdFRleHRMZW5ndGh9IDsKLSAgICBhY2NTY3JpcHRTb3VyY2Uocy0+bUFjY1NjcmlwdCwgc2l6ZW9mKHNjcmlwdExlbmd0aCkgLyBzaXplb2YoaW50KSwgc2NyaXB0U291cmNlLCBzY3JpcHRMZW5ndGgpOwotICAgIGFjY1JlZ2lzdGVyU3ltYm9sQ2FsbGJhY2socy0+bUFjY1NjcmlwdCwgc3ltYm9sTG9va3VwLCBOVUxMKTsKLSAgICBhY2NDb21waWxlU2NyaXB0KHMtPm1BY2NTY3JpcHQpOwotICAgIGFjY0dldFNjcmlwdExhYmVsKHMtPm1BY2NTY3JpcHQsICJtYWluIiwgKEFDQ3ZvaWQqKikgJnMtPm1Qcm9ncmFtLm1TY3JpcHQpOwotICAgIGFjY0dldFNjcmlwdExhYmVsKHMtPm1BY2NTY3JpcHQsICJpbml0IiwgKEFDQ3ZvaWQqKikgJnMtPm1Qcm9ncmFtLm1Jbml0KTsKLSAgICByc0Fzc2VydChzLT5tUHJvZ3JhbS5tU2NyaXB0KTsKLQotICAgIGlmICghcy0+bVByb2dyYW0ubVNjcmlwdCkgewotICAgICAgICBBQ0NjaGFyIGJ1Zls0MDk2XTsKLSAgICAgICAgQUNDc2l6ZWkgbGVuOwotICAgICAgICBhY2NHZXRTY3JpcHRJbmZvTG9nKHMtPm1BY2NTY3JpcHQsIHNpemVvZihidWYpLCAmbGVuLCBidWYpOwotICAgICAgICBMT0dFKCIlcyIsIGJ1Zik7Ci0gICAgICAgIHJzYy0+c2V0RXJyb3IoUlNfRVJST1JfQkFEX1NDUklQVCwgIkVycm9yIGNvbXBpbGluZyB1c2VyIHNjcmlwdC4iKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KKyAgICBzLT5tQmNjU2NyaXB0ID0gYmNjQ3JlYXRlU2NyaXB0KCk7CisgICAgcy0+bUVudmlyb21lbnQubUlzVGhyZWFkYWJsZSA9IHRydWU7CisgICAgYmNjU2NyaXB0Qml0Y29kZShzLT5tQmNjU2NyaXB0LCBzLT5tRW52aXJvbWVudC5tU2NyaXB0VGV4dCwgcy0+bUVudmlyb21lbnQubVNjcmlwdFRleHRMZW5ndGgpOworICAgIGJjY1JlZ2lzdGVyU3ltYm9sQ2FsbGJhY2socy0+bUJjY1NjcmlwdCwgc3ltYm9sTG9va3VwLCBzKTsKKyAgICBiY2NDb21waWxlU2NyaXB0KHMtPm1CY2NTY3JpcHQpOworICAgIGJjY0dldFNjcmlwdExhYmVsKHMtPm1CY2NTY3JpcHQsICJyb290IiwgKEJDQ3ZvaWQqKikgJnMtPm1Qcm9ncmFtLm1Sb290KTsKKyAgICBiY2NHZXRTY3JpcHRMYWJlbChzLT5tQmNjU2NyaXB0LCAiaW5pdCIsIChCQ0N2b2lkKiopICZzLT5tUHJvZ3JhbS5tSW5pdCk7CisgICAgTE9HVigicm9vdCAlcCwgIGluaXQgJXAiLCBzLT5tUHJvZ3JhbS5tUm9vdCwgcy0+bVByb2dyYW0ubUluaXQpOwogCiAgICAgaWYgKHMtPm1Qcm9ncmFtLm1Jbml0KSB7CiAgICAgICAgIHMtPm1Qcm9ncmFtLm1Jbml0KCk7CiAgICAgfQogCi0gICAgZm9yIChpbnQgY3Q9MDsgY3QgPCBNQVhfU0NSSVBUX0JBTktTOyBjdCsrKSB7Ci0gICAgICAgIGlmIChtU2xvdE5hbWVzW2N0XS5sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICAgIGFjY0dldFNjcmlwdExhYmVsKHMtPm1BY2NTY3JpcHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtU2xvdE5hbWVzW2N0XS5zdHJpbmcoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChBQ0N2b2lkKiopICZzLT5tUHJvZ3JhbS5tU2xvdFBvaW50ZXJzW2N0XSk7Ci0gICAgICAgIH0KKyAgICBiY2NHZXRFeHBvcnRGdW5jcyhzLT5tQmNjU2NyaXB0LCAoQkNDc2l6ZWkqKSAmcy0+bUVudmlyb21lbnQubUludm9rZUZ1bmN0aW9uQ291bnQsIDAsIE5VTEwpOworICAgIGlmKHMtPm1FbnZpcm9tZW50Lm1JbnZva2VGdW5jdGlvbkNvdW50IDw9IDApCisgICAgICAgIHMtPm1FbnZpcm9tZW50Lm1JbnZva2VGdW5jdGlvbnMgPSBOVUxMOworICAgIGVsc2UgeworICAgICAgICBzLT5tRW52aXJvbWVudC5tSW52b2tlRnVuY3Rpb25zID0gKFNjcmlwdDo6SW52b2tlRnVuY190KikgY2FsbG9jKHMtPm1FbnZpcm9tZW50Lm1JbnZva2VGdW5jdGlvbkNvdW50LCBzaXplb2YoU2NyaXB0OjpJbnZva2VGdW5jX3QpKTsKKyAgICAgICAgYmNjR2V0RXhwb3J0RnVuY3Mocy0+bUJjY1NjcmlwdCwgTlVMTCwgcy0+bUVudmlyb21lbnQubUludm9rZUZ1bmN0aW9uQ291bnQsIChCQ0N2b2lkICoqKSBzLT5tRW52aXJvbWVudC5tSW52b2tlRnVuY3Rpb25zKTsKICAgICB9CiAKLSAgICBmb3IgKGludCBjdD0wOyBjdCA8IE1BWF9TQ1JJUFRfQkFOS1M7IGN0KyspIHsKLSAgICAgICAgaWYgKG1JbnZva2FibGVOYW1lc1tjdF0ubGVuZ3RoKCkgPiAwKSB7Ci0gICAgICAgICAgICBhY2NHZXRTY3JpcHRMYWJlbChzLT5tQWNjU2NyaXB0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUludm9rYWJsZU5hbWVzW2N0XS5zdHJpbmcoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChBQ0N2b2lkKiopICZzLT5tRW52aXJvbWVudC5tSW52b2thYmxlc1tjdF0pOwotICAgICAgICB9CisgICAgYmNjR2V0RXhwb3J0VmFycyhzLT5tQmNjU2NyaXB0LCAoQkNDc2l6ZWkqKSAmcy0+bUVudmlyb21lbnQubUZpZWxkQ291bnQsIDAsIE5VTEwpOworICAgIGlmKHMtPm1FbnZpcm9tZW50Lm1GaWVsZENvdW50IDw9IDApCisgICAgICAgIHMtPm1FbnZpcm9tZW50Lm1GaWVsZEFkZHJlc3MgPSBOVUxMOworICAgIGVsc2UgeworICAgICAgICBzLT5tRW52aXJvbWVudC5tRmllbGRBZGRyZXNzID0gKHZvaWQgKiopIGNhbGxvYyhzLT5tRW52aXJvbWVudC5tRmllbGRDb3VudCwgc2l6ZW9mKHZvaWQgKikpOworICAgICAgICBiY2NHZXRFeHBvcnRWYXJzKHMtPm1CY2NTY3JpcHQsIE5VTEwsIHMtPm1FbnZpcm9tZW50Lm1GaWVsZENvdW50LCAoQkNDdm9pZCAqKikgcy0+bUVudmlyb21lbnQubUZpZWxkQWRkcmVzcyk7CiAgICAgfQorICAgIC8vZm9yIChpbnQgY3QyPTA7IGN0MiA8IHMtPm1FbnZpcm9tZW50Lm1GaWVsZENvdW50OyBjdDIrKyApIHsKKyAgICAgICAgLy9MT0dFKCJTY3JpcHQgZmllbGQgJWkgPSAlcCIsIGN0Miwgcy0+bUVudmlyb21lbnQubUZpZWxkQWRkcmVzc1tjdDJdKTsKKyAgICAvL30KIAogICAgIHMtPm1FbnZpcm9tZW50Lm1GcmFnbWVudC5zZXQocnNjLT5nZXREZWZhdWx0UHJvZ3JhbUZyYWdtZW50KCkpOwogICAgIHMtPm1FbnZpcm9tZW50Lm1WZXJ0ZXguc2V0KHJzYy0+Z2V0RGVmYXVsdFByb2dyYW1WZXJ0ZXgoKSk7Ci0gICAgcy0+bUVudmlyb21lbnQubUZyYWdtZW50U3RvcmUuc2V0KHJzYy0+Z2V0RGVmYXVsdFByb2dyYW1GcmFnbWVudFN0b3JlKCkpOworICAgIHMtPm1FbnZpcm9tZW50Lm1GcmFnbWVudFN0b3JlLnNldChyc2MtPmdldERlZmF1bHRQcm9ncmFtU3RvcmUoKSk7CiAgICAgcy0+bUVudmlyb21lbnQubVJhc3Rlci5zZXQocnNjLT5nZXREZWZhdWx0UHJvZ3JhbVJhc3RlcigpKTsKIAotICAgIGlmIChzLT5tUHJvZ3JhbS5tU2NyaXB0KSB7CisgICAgaWYgKHMtPm1Qcm9ncmFtLm1Sb290KSB7CiAgICAgICAgIGNvbnN0IHN0YXRpYyBpbnQgcHJhZ21hTWF4ID0gMTY7Ci0gICAgICAgIEFDQ3NpemVpIHByYWdtYUNvdW50OwotICAgICAgICBBQ0NjaGFyICogc3RyW3ByYWdtYU1heF07Ci0gICAgICAgIGFjY0dldFByYWdtYXMocy0+bUFjY1NjcmlwdCwgJnByYWdtYUNvdW50LCBwcmFnbWFNYXgsICZzdHJbMF0pOworICAgICAgICBCQ0NzaXplaSBwcmFnbWFDb3VudDsKKyAgICAgICAgQkNDY2hhciAqIHN0cltwcmFnbWFNYXhdOworICAgICAgICBiY2NHZXRQcmFnbWFzKHMtPm1CY2NTY3JpcHQsICZwcmFnbWFDb3VudCwgcHJhZ21hTWF4LCAmc3RyWzBdKTsKIAogICAgICAgICBmb3IgKGludCBjdD0wOyBjdCA8IHByYWdtYUNvdW50OyBjdCs9MikgeworICAgICAgICAgICAgLy9MT0dFKCJwcmFnbWUgJXMgJXMiLCBzdHJbY3RdLCBzdHJbY3QrMV0pOwogICAgICAgICAgICAgaWYgKCFzdHJjbXAoc3RyW2N0XSwgInZlcnNpb24iKSkgewogICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgfQpAQCAtMjA4LDExICs0MjksNiBAQAogICAgICAgICAgICAgICAgICAgICBzLT5tRW52aXJvbWVudC5tVmVydGV4LmNsZWFyKCk7CiAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBQcm9ncmFtVmVydGV4ICogcHYgPSAoUHJvZ3JhbVZlcnRleCAqKXJzYy0+bG9va3VwTmFtZShzdHJbY3QrMV0pOwotICAgICAgICAgICAgICAgIGlmIChwdiAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgICAgIHMtPm1FbnZpcm9tZW50Lm1WZXJ0ZXguc2V0KHB2KTsKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIExPR0UoIlVucmVjb25pemVkIHZhbHVlICVzIHBhc3NlZCB0byBzdGF0ZVZlcnRleCIsIHN0cltjdCsxXSk7CiAgICAgICAgICAgICB9CiAKQEAgLTIyNCwxMSArNDQwLDYgQEAKICAgICAgICAgICAgICAgICAgICAgcy0+bUVudmlyb21lbnQubVJhc3Rlci5jbGVhcigpOwogICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgUHJvZ3JhbVJhc3RlciAqIHByID0gKFByb2dyYW1SYXN0ZXIgKilyc2MtPmxvb2t1cE5hbWUoc3RyW2N0KzFdKTsKLSAgICAgICAgICAgICAgICBpZiAocHIgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgICAgICBzLT5tRW52aXJvbWVudC5tUmFzdGVyLnNldChwcik7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBMT0dFKCJVbnJlY29uaXplZCB2YWx1ZSAlcyBwYXNzZWQgdG8gc3RhdGVSYXN0ZXIiLCBzdHJbY3QrMV0pOwogICAgICAgICAgICAgfQogCkBAIC0yNDAsMTEgKzQ1MSw2IEBACiAgICAgICAgICAgICAgICAgICAgIHMtPm1FbnZpcm9tZW50Lm1GcmFnbWVudC5jbGVhcigpOwogICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgUHJvZ3JhbUZyYWdtZW50ICogcGYgPSAoUHJvZ3JhbUZyYWdtZW50ICopcnNjLT5sb29rdXBOYW1lKHN0cltjdCsxXSk7Ci0gICAgICAgICAgICAgICAgaWYgKHBmICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAgICAgcy0+bUVudmlyb21lbnQubUZyYWdtZW50LnNldChwZik7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBMT0dFKCJVbnJlY29uaXplZCB2YWx1ZSAlcyBwYXNzZWQgdG8gc3RhdGVGcmFnbWVudCIsIHN0cltjdCsxXSk7CiAgICAgICAgICAgICB9CiAKQEAgLTI1NiwxMiArNDYyLDYgQEAKICAgICAgICAgICAgICAgICAgICAgcy0+bUVudmlyb21lbnQubUZyYWdtZW50U3RvcmUuY2xlYXIoKTsKICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIFByb2dyYW1GcmFnbWVudFN0b3JlICogcGZzID0KLSAgICAgICAgICAgICAgICAgICAgKFByb2dyYW1GcmFnbWVudFN0b3JlICopcnNjLT5sb29rdXBOYW1lKHN0cltjdCsxXSk7Ci0gICAgICAgICAgICAgICAgaWYgKHBmcyAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgICAgIHMtPm1FbnZpcm9tZW50Lm1GcmFnbWVudFN0b3JlLnNldChwZnMpOwotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgTE9HRSgiVW5yZWNvbml6ZWQgdmFsdWUgJXMgcGFzc2VkIHRvIHN0YXRlU3RvcmUiLCBzdHJbY3QrMV0pOwogICAgICAgICAgICAgfQogCkBAIC0yNzMsMTExICs0NzMsNiBAQAogICAgIH0KIH0KIAotc3RhdGljIHZvaWQgYXBwZW5kRWxlbWVudEJvZHkoU3RyaW5nOCAqcywgY29uc3QgRWxlbWVudCAqZSkKLXsKLSAgICBzLT5hcHBlbmQoIiB7XG4iKTsKLSAgICBmb3IgKHNpemVfdCBjdDI9MDsgY3QyIDwgZS0+Z2V0RmllbGRDb3VudCgpOyBjdDIrKykgewotICAgICAgICBjb25zdCBFbGVtZW50ICpjID0gZS0+Z2V0RmllbGQoY3QyKTsKLSAgICAgICAgcy0+YXBwZW5kKCIgICAgIik7Ci0gICAgICAgIHMtPmFwcGVuZChjLT5nZXRDVHlwZSgpKTsKLSAgICAgICAgcy0+YXBwZW5kKCIgIik7Ci0gICAgICAgIHMtPmFwcGVuZChlLT5nZXRGaWVsZE5hbWUoY3QyKSk7Ci0gICAgICAgIHMtPmFwcGVuZCgiO1xuIik7Ci0gICAgfQotICAgIHMtPmFwcGVuZCgifSIpOwotfQotCi12b2lkIFNjcmlwdENTdGF0ZTo6YXBwZW5kVmFyRGVmaW5lcyhjb25zdCBDb250ZXh0ICpyc2MsIFN0cmluZzggKnN0cikKLXsKLSAgICBjaGFyIGJ1ZlsyNTZdOwotICAgIGlmIChyc2MtPnByb3BzLm1Mb2dTY3JpcHRzKSB7Ci0gICAgICAgIExPR0QoImFwcGVuZFZhckRlZmluZXMgbUludDMyRGVmaW5lcy5zaXplKCk9JWQgbUZsb2F0RGVmaW5lcy5zaXplKCk9JWRcbiIsCi0gICAgICAgICAgICAgICAgbUludDMyRGVmaW5lcy5zaXplKCksIG1GbG9hdERlZmluZXMuc2l6ZSgpKTsKLSAgICB9Ci0gICAgZm9yIChzaXplX3QgY3Q9MDsgY3QgPCBtSW50MzJEZWZpbmVzLnNpemUoKTsgY3QrKykgewotICAgICAgICBzdHItPmFwcGVuZCgiI2RlZmluZSAiKTsKLSAgICAgICAgc3RyLT5hcHBlbmQobUludDMyRGVmaW5lcy5rZXlBdChjdCkpOwotICAgICAgICBzdHItPmFwcGVuZCgiICIpOwotICAgICAgICBzcHJpbnRmKGJ1ZiwgIiVpXG4iLCAoaW50KW1JbnQzMkRlZmluZXMudmFsdWVBdChjdCkpOwotICAgICAgICBzdHItPmFwcGVuZChidWYpOwotICAgIH0KLSAgICBmb3IgKHNpemVfdCBjdD0wOyBjdCA8IG1GbG9hdERlZmluZXMuc2l6ZSgpOyBjdCsrKSB7Ci0gICAgICAgIHN0ci0+YXBwZW5kKCIjZGVmaW5lICIpOwotICAgICAgICBzdHItPmFwcGVuZChtRmxvYXREZWZpbmVzLmtleUF0KGN0KSk7Ci0gICAgICAgIHN0ci0+YXBwZW5kKCIgIik7Ci0gICAgICAgIHNwcmludGYoYnVmLCAiJWZmXG4iLCBtRmxvYXREZWZpbmVzLnZhbHVlQXQoY3QpKTsKLSAgICAgICAgc3RyLT5hcHBlbmQoYnVmKTsKLSAgICB9Ci19Ci0KLQotCi12b2lkIFNjcmlwdENTdGF0ZTo6YXBwZW5kVHlwZXMoY29uc3QgQ29udGV4dCAqcnNjLCBTdHJpbmc4ICpzdHIpCi17Ci0gICAgY2hhciBidWZbMjU2XTsKLSAgICBTdHJpbmc4IHRtcDsKLQotICAgIHN0ci0+YXBwZW5kKCJzdHJ1Y3QgdmVjRjMyXzJfcyB7ZmxvYXQgeDsgZmxvYXQgeTt9O1xuIik7Ci0gICAgc3RyLT5hcHBlbmQoInN0cnVjdCB2ZWNGMzJfM19zIHtmbG9hdCB4OyBmbG9hdCB5OyBmbG9hdCB6O307XG4iKTsKLSAgICBzdHItPmFwcGVuZCgic3RydWN0IHZlY0YzMl80X3Mge2Zsb2F0IHg7IGZsb2F0IHk7IGZsb2F0IHo7IGZsb2F0IHc7fTtcbiIpOwotICAgIHN0ci0+YXBwZW5kKCJzdHJ1Y3QgdmVjVThfNF9zIHtjaGFyIHI7IGNoYXIgZzsgY2hhciBiOyBjaGFyIGE7fTtcbiIpOwotICAgIHN0ci0+YXBwZW5kKCIjZGVmaW5lIHZlY0YzMl8yX3Qgc3RydWN0IHZlY0YzMl8yX3NcbiIpOwotICAgIHN0ci0+YXBwZW5kKCIjZGVmaW5lIHZlY0YzMl8zX3Qgc3RydWN0IHZlY0YzMl8zX3NcbiIpOwotICAgIHN0ci0+YXBwZW5kKCIjZGVmaW5lIHZlY0YzMl80X3Qgc3RydWN0IHZlY0YzMl80X3NcbiIpOwotICAgIHN0ci0+YXBwZW5kKCIjZGVmaW5lIHZlY1U4XzRfdCBzdHJ1Y3QgdmVjVThfNF9zXG4iKTsKLSAgICBzdHItPmFwcGVuZCgiI2RlZmluZSB2ZWNJOF80X3Qgc3RydWN0IHZlY1U4XzRfc1xuIik7Ci0KLSAgICBmb3IgKHNpemVfdCBjdD0wOyBjdCA8IE1BWF9TQ1JJUFRfQkFOS1M7IGN0KyspIHsKLSAgICAgICAgY29uc3QgVHlwZSAqdCA9IG1Db25zdGFudEJ1ZmZlclR5cGVzW2N0XS5nZXQoKTsKLSAgICAgICAgaWYgKCF0KSB7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgICBjb25zdCBFbGVtZW50ICplID0gdC0+Z2V0RWxlbWVudCgpOwotICAgICAgICBpZiAoZS0+Z2V0TmFtZSgpICYmIChlLT5nZXRGaWVsZENvdW50KCkgPiAxKSkgewotICAgICAgICAgICAgU3RyaW5nOCBzKCJzdHJ1Y3Qgc3RydWN0XyIpOwotICAgICAgICAgICAgcy5hcHBlbmQoZS0+Z2V0TmFtZSgpKTsKLSAgICAgICAgICAgIHMuYXBwZW5kKGUtPmdldENTdHJ1Y3RCb2R5KCkpOwotICAgICAgICAgICAgcy5hcHBlbmQoIjtcbiIpOwotCi0gICAgICAgICAgICBzLmFwcGVuZCgiI2RlZmluZSAiKTsKLSAgICAgICAgICAgIHMuYXBwZW5kKGUtPmdldE5hbWUoKSk7Ci0gICAgICAgICAgICBzLmFwcGVuZCgiX3Qgc3RydWN0IHN0cnVjdF8iKTsKLSAgICAgICAgICAgIHMuYXBwZW5kKGUtPmdldE5hbWUoKSk7Ci0gICAgICAgICAgICBzLmFwcGVuZCgiXG5cbiIpOwotICAgICAgICAgICAgaWYgKHJzYy0+cHJvcHMubUxvZ1NjcmlwdHMpIHsKLSAgICAgICAgICAgICAgICBMT0dWKCIlcyIsIHN0YXRpY19jYXN0PGNvbnN0IGNoYXIqPihzKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzdHItPmFwcGVuZChzKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtU2xvdE5hbWVzW2N0XS5sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICAgIFN0cmluZzggczsKLSAgICAgICAgICAgIGlmIChlLT5nZXROYW1lKCkpIHsKLSAgICAgICAgICAgICAgICAvLyBVc2UgdGhlIG5hbWVkIHN0cnVjdAotICAgICAgICAgICAgICAgIHMuc2V0VG8oZS0+Z2V0TmFtZSgpKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgLy8gY3JlYXRlIGFuIHN0cnVjdCBuYW1lZCBmcm9tIHRoZSBzbG90LgotICAgICAgICAgICAgICAgIHMuc2V0VG8oInN0cnVjdCAiKTsKLSAgICAgICAgICAgICAgICBzLmFwcGVuZChtU2xvdE5hbWVzW2N0XSk7Ci0gICAgICAgICAgICAgICAgcy5hcHBlbmQoIl9zIik7Ci0gICAgICAgICAgICAgICAgcy5hcHBlbmQoZS0+Z2V0Q1N0cnVjdEJvZHkoKSk7Ci0gICAgICAgICAgICAgICAgLy9hcHBlbmRFbGVtZW50Qm9keSgmcywgZSk7Ci0gICAgICAgICAgICAgICAgcy5hcHBlbmQoIjtcbiIpOwotICAgICAgICAgICAgICAgIHMuYXBwZW5kKCJzdHJ1Y3QgIik7Ci0gICAgICAgICAgICAgICAgcy5hcHBlbmQobVNsb3ROYW1lc1tjdF0pOwotICAgICAgICAgICAgICAgIHMuYXBwZW5kKCJfcyIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBzLmFwcGVuZCgiICogIik7Ci0gICAgICAgICAgICBzLmFwcGVuZChtU2xvdE5hbWVzW2N0XSk7Ci0gICAgICAgICAgICBzLmFwcGVuZCgiO1xuIik7Ci0gICAgICAgICAgICBpZiAocnNjLT5wcm9wcy5tTG9nU2NyaXB0cykgewotICAgICAgICAgICAgICAgIExPR1YoIiVzIiwgc3RhdGljX2Nhc3Q8Y29uc3QgY2hhcio+KHMpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHN0ci0+YXBwZW5kKHMpOwotICAgICAgICB9Ci0gICAgfQotfQogCiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKQEAgLTQyMCw3ICs1MTUsNiBAQAogICAgIHMtPnNldENvbnRleHQocnNjKTsKICAgICBmb3IgKGludCBjdD0wOyBjdCA8IE1BWF9TQ1JJUFRfQkFOS1M7IGN0KyspIHsKICAgICAgICAgcy0+bVR5cGVzW2N0XS5zZXQoc3MtPm1Db25zdGFudEJ1ZmZlclR5cGVzW2N0XS5nZXQoKSk7Ci0gICAgICAgIHMtPm1TbG90TmFtZXNbY3RdID0gc3MtPm1TbG90TmFtZXNbY3RdOwogICAgICAgICBzLT5tU2xvdFdyaXRhYmxlW2N0XSA9IHNzLT5tU2xvdFdyaXRhYmxlW2N0XTsKICAgICB9CiAKQEAgLTQyOCwxOCArNTIyLDYgQEAKICAgICByZXR1cm4gczsKIH0KIAotdm9pZCByc2lfU2NyaXB0Q1NldERlZmluZUYoQ29udGV4dCAqcnNjLCBjb25zdCBjaGFyKiBuYW1lLCBmbG9hdCB2YWx1ZSkKLXsKLSAgICBTY3JpcHRDU3RhdGUgKnNzID0gJnJzYy0+bVNjcmlwdEM7Ci0gICAgc3MtPm1GbG9hdERlZmluZXMuYWRkKFN0cmluZzgobmFtZSksIHZhbHVlKTsKLX0KLQotdm9pZCByc2lfU2NyaXB0Q1NldERlZmluZUkzMihDb250ZXh0ICpyc2MsIGNvbnN0IGNoYXIqIG5hbWUsIGludDMyX3QgdmFsdWUpCi17Ci0gICAgU2NyaXB0Q1N0YXRlICpzcyA9ICZyc2MtPm1TY3JpcHRDOwotICAgIHNzLT5tSW50MzJEZWZpbmVzLmFkZChTdHJpbmc4KG5hbWUpLCB2YWx1ZSk7Ci19Ci0KIH0KIH0KIApkaWZmIC0tZ2l0IGEvbGlicy9ycy9yc1NjcmlwdEMuaCBiL2xpYnMvcnMvcnNTY3JpcHRDLmgKaW5kZXggMzVhYmFkZi4uOWQwOWIwYiAxMDA2NDQKLS0tIGEvbGlicy9ycy9yc1NjcmlwdEMuaAorKysgYi9saWJzL3JzL3JzU2NyaXB0Qy5oCkBAIC0yMSw5ICsyMSw3IEBACiAKICNpbmNsdWRlICJSZW5kZXJTY3JpcHRFbnYuaCIKIAotI2luY2x1ZGUgPHV0aWxzL0tleWVkVmVjdG9yLmg+Ci0KLXN0cnVjdCBBQ0NzY3JpcHQ7CitzdHJ1Y3QgQkNDc2NyaXB0OwogCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIG5hbWVzcGFjZSBhbmRyb2lkIHsKQEAgLTM0LDcgKzMyLDcgQEAKIGNsYXNzIFNjcmlwdEMgOiBwdWJsaWMgU2NyaXB0CiB7CiBwdWJsaWM6Ci0gICAgdHlwZWRlZiBpbnQgKCpSdW5TY3JpcHRfdCkodWludDMyX3QgbGF1bmNoSW5kZXgpOworICAgIHR5cGVkZWYgaW50ICgqUnVuU2NyaXB0X3QpKCk7CiAgICAgdHlwZWRlZiB2b2lkICgqVm9pZEZ1bmNfdCkoKTsKIAogICAgIFNjcmlwdEMoQ29udGV4dCAqKTsKQEAgLTQ0LDE4ICs0MiwzNSBAQAogICAgICAgICBpbnQgbVZlcnNpb25NYWpvcjsKICAgICAgICAgaW50IG1WZXJzaW9uTWlub3I7CiAKLSAgICAgICAgUnVuU2NyaXB0X3QgbVNjcmlwdDsKKyAgICAgICAgUnVuU2NyaXB0X3QgbVJvb3Q7CiAgICAgICAgIFZvaWRGdW5jX3QgbUluaXQ7Ci0KLSAgICAgICAgdm9pZCAqKiBtU2xvdFBvaW50ZXJzW01BWF9TQ1JJUFRfQkFOS1NdOwogICAgIH07CiAKICAgICBQcm9ncmFtX3QgbVByb2dyYW07CiAKLSAgICBBQ0NzY3JpcHQqICAgIG1BY2NTY3JpcHQ7CisgICAgQkNDc2NyaXB0KiAgICBtQmNjU2NyaXB0OwogCi0gICAgdmlydHVhbCB2b2lkIHNldHVwU2NyaXB0KCk7Ci0gICAgdmlydHVhbCB1aW50MzJfdCBydW4oQ29udGV4dCAqLCB1aW50MzJfdCBsYXVuY2hJRCk7CisgICAgY29uc3QgQWxsb2NhdGlvbiAqcHRyVG9BbGxvY2F0aW9uKGNvbnN0IHZvaWQgKikgY29uc3Q7CisKKworICAgIHZpcnR1YWwgdm9pZCBJbnZva2UoQ29udGV4dCAqcnNjLCB1aW50MzJfdCBzbG90LCBjb25zdCB2b2lkICpkYXRhLCB1aW50MzJfdCBsZW4pOworCisgICAgdmlydHVhbCB1aW50MzJfdCBydW4oQ29udGV4dCAqKTsKKworICAgIHZpcnR1YWwgdm9pZCBydW5Gb3JFYWNoKENvbnRleHQgKnJzYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBbGxvY2F0aW9uICogYWluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFsbG9jYXRpb24gKiBhb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQgKiB1c3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUnNTY3JpcHRDYWxsICpzYyA9IE5VTEwpOworCisgICAgdmlydHVhbCB2b2lkIHNlcmlhbGl6ZShPU3RyZWFtICpzdHJlYW0pIGNvbnN0IHsgICAgfQorICAgIHZpcnR1YWwgUnNBM0RDbGFzc0lEIGdldENsYXNzSWQoKSBjb25zdCB7IHJldHVybiBSU19BM0RfQ0xBU1NfSURfU0NSSVBUX0M7IH0KKyAgICBzdGF0aWMgVHlwZSAqY3JlYXRlRnJvbVN0cmVhbShDb250ZXh0ICpyc2MsIElTdHJlYW0gKnN0cmVhbSkgeyByZXR1cm4gTlVMTDsgfQorCitwcm90ZWN0ZWQ6CisgICAgdm9pZCBzZXR1cFNjcmlwdChDb250ZXh0ICopOworICAgIHZvaWQgc2V0dXBHTFN0YXRlKENvbnRleHQgKik7CisgICAgU2NyaXB0ICogc2V0VExTKFNjcmlwdCAqKTsKIH07CiAKIGNsYXNzIFNjcmlwdENTdGF0ZQpAQCAtNjcsMjcgKzgyLDIxIEBACiAgICAgU2NyaXB0QyAqbVNjcmlwdDsKIAogICAgIE9iamVjdEJhc2VSZWY8Y29uc3QgVHlwZT4gbUNvbnN0YW50QnVmZmVyVHlwZXNbTUFYX1NDUklQVF9CQU5LU107Ci0gICAgU3RyaW5nOCBtU2xvdE5hbWVzW01BWF9TQ1JJUFRfQkFOS1NdOworICAgIC8vU3RyaW5nOCBtU2xvdE5hbWVzW01BWF9TQ1JJUFRfQkFOS1NdOwogICAgIGJvb2wgbVNsb3RXcml0YWJsZVtNQVhfU0NSSVBUX0JBTktTXTsKLSAgICBTdHJpbmc4IG1JbnZva2FibGVOYW1lc1tNQVhfU0NSSVBUX0JBTktTXTsKKyAgICAvL1N0cmluZzggbUludm9rYWJsZU5hbWVzW01BWF9TQ1JJUFRfQkFOS1NdOwogCiAgICAgdm9pZCBjbGVhcigpOwogICAgIHZvaWQgcnVuQ29tcGlsZXIoQ29udGV4dCAqcnNjLCBTY3JpcHRDICpzKTsKLSAgICB2b2lkIGFwcGVuZFZhckRlZmluZXMoY29uc3QgQ29udGV4dCAqcnNjLCBTdHJpbmc4ICpzdHIpOwotICAgIHZvaWQgYXBwZW5kVHlwZXMoY29uc3QgQ29udGV4dCAqcnNjLCBTdHJpbmc4ICpzdHIpOwogCiAgICAgc3RydWN0IFN5bWJvbFRhYmxlX3QgewogICAgICAgICBjb25zdCBjaGFyICogbU5hbWU7CiAgICAgICAgIHZvaWQgKiBtUHRyOwotICAgICAgICBjb25zdCBjaGFyICogbVJldDsKLSAgICAgICAgY29uc3QgY2hhciAqIG1QYXJhbTsKICAgICB9OwotICAgIHN0YXRpYyBTeW1ib2xUYWJsZV90IGdTeW1zW107CisgICAgLy9zdGF0aWMgU3ltYm9sVGFibGVfdCBnU3ltc1tdOwogICAgIHN0YXRpYyBjb25zdCBTeW1ib2xUYWJsZV90ICogbG9va3VwU3ltYm9sKGNvbnN0IGNoYXIgKik7Ci0gICAgc3RhdGljIHZvaWQgYXBwZW5kRGVjbHMoU3RyaW5nOCAqc3RyKTsKLQotICAgIEtleWVkVmVjdG9yPFN0cmluZzgsaW50PiBtSW50MzJEZWZpbmVzOwotICAgIEtleWVkVmVjdG9yPFN0cmluZzgsZmxvYXQ+IG1GbG9hdERlZmluZXM7CisgICAgc3RhdGljIGNvbnN0IFN5bWJvbFRhYmxlX3QgKiBsb29rdXBTeW1ib2xDTChjb25zdCBjaGFyICopOworICAgIHN0YXRpYyBjb25zdCBTeW1ib2xUYWJsZV90ICogbG9va3VwU3ltYm9sR0woY29uc3QgY2hhciAqKTsKIH07CiAKIApkaWZmIC0tZ2l0IGEvbGlicy9ycy9yc1NjcmlwdENfTGliLmNwcCBiL2xpYnMvcnMvcnNTY3JpcHRDX0xpYi5jcHAKaW5kZXggMjAyY2EzZC4uNDE4MjhkYyAxMDA2NDQKLS0tIGEvbGlicy9ycy9yc1NjcmlwdENfTGliLmNwcAorKysgYi9saWJzL3JzL3JzU2NyaXB0Q19MaWIuY3BwCkBAIC0xNywxOCArMTcsOSBAQAogI2luY2x1ZGUgInJzQ29udGV4dC5oIgogI2luY2x1ZGUgInJzU2NyaXB0Qy5oIgogI2luY2x1ZGUgInJzTWF0cml4LmgiCi0jaW5jbHVkZSAicnNOb2lzZS5oIgogCi0jaW5jbHVkZSAiYWNjL2FjYy5oIgogI2luY2x1ZGUgInV0aWxzL1RpbWVycy5oIgogCi0jZGVmaW5lIEdMX0dMRVhUX1BST1RPVFlQRVMKLQotI2luY2x1ZGUgPEdMRVMvZ2wuaD4KLSNpbmNsdWRlIDxHTEVTL2dsZXh0Lmg+Ci0jaW5jbHVkZSA8R0xFUzIvZ2wyLmg+Ci0jaW5jbHVkZSA8R0xFUzIvZ2wyZXh0Lmg+Ci0KICNpbmNsdWRlIDx0aW1lLmg+CiAKIHVzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOwpAQCAtMzksMjUyICszMCwxMSBAQAogICAgIENvbnRleHQgKiByc2MgPSB0bHMtPm1Db250ZXh0OyBcCiAgICAgU2NyaXB0QyAqIHNjID0gKFNjcmlwdEMgKikgdGxzLT5tU2NyaXB0CiAKLXR5cGVkZWYgc3RydWN0IHsKLSAgICBmbG9hdCB4OwotICAgIGZsb2F0IHk7Ci0gICAgZmxvYXQgejsKLX0gdmVjM190OwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgZmxvYXQgeDsKLSAgICBmbG9hdCB5OwotICAgIGZsb2F0IHo7Ci0gICAgZmxvYXQgdzsKLX0gdmVjNF90OwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgZmxvYXQgeDsKLSAgICBmbG9hdCB5OwotfSB2ZWMyX3Q7Ci0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotLy8gSU8gcm91dGluZXMKLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotCi1zdGF0aWMgZmxvYXQgU0NfbG9hZEYodWludDMyX3QgYmFuaywgdWludDMyX3Qgb2Zmc2V0KQotewotICAgIEdFVF9UTFMoKTsKLSAgICBjb25zdCB2b2lkICp2cCA9IHNjLT5tU2xvdHNbYmFua10tPmdldFB0cigpOwotICAgIGNvbnN0IGZsb2F0ICpmID0gc3RhdGljX2Nhc3Q8Y29uc3QgZmxvYXQgKj4odnApOwotICAgIC8vTE9HRSgibG9hZEYgJWkgJWkgPSAlZiAleCIsIGJhbmssIG9mZnNldCwgZiwgKChpbnQgKikmZilbMF0pOwotICAgIHJldHVybiBmW29mZnNldF07Ci19Ci0KLXN0YXRpYyBpbnQzMl90IFNDX2xvYWRJMzIodWludDMyX3QgYmFuaywgdWludDMyX3Qgb2Zmc2V0KQotewotICAgIEdFVF9UTFMoKTsKLSAgICBjb25zdCB2b2lkICp2cCA9IHNjLT5tU2xvdHNbYmFua10tPmdldFB0cigpOwotICAgIGNvbnN0IGludDMyX3QgKmkgPSBzdGF0aWNfY2FzdDxjb25zdCBpbnQzMl90ICo+KHZwKTsKLSAgICAvL0xPR0UoImxvYWRJMzIgJWkgJWkgPSAlaSIsIGJhbmssIG9mZnNldCwgdCk7Ci0gICAgcmV0dXJuIGlbb2Zmc2V0XTsKLX0KLQotc3RhdGljIGZsb2F0KiBTQ19sb2FkQXJyYXlGKHVpbnQzMl90IGJhbmssIHVpbnQzMl90IG9mZnNldCkKLXsKLSAgICBHRVRfVExTKCk7Ci0gICAgdm9pZCAqdnAgPSBzYy0+bVNsb3RzW2JhbmtdLT5nZXRQdHIoKTsKLSAgICBmbG9hdCAqZiA9IHN0YXRpY19jYXN0PGZsb2F0ICo+KHZwKTsKLSAgICByZXR1cm4gZiArIG9mZnNldDsKLX0KLQotc3RhdGljIGludDMyX3QqIFNDX2xvYWRBcnJheUkzMih1aW50MzJfdCBiYW5rLCB1aW50MzJfdCBvZmZzZXQpCi17Ci0gICAgR0VUX1RMUygpOwotICAgIHZvaWQgKnZwID0gc2MtPm1TbG90c1tiYW5rXS0+Z2V0UHRyKCk7Ci0gICAgaW50MzJfdCAqaSA9IHN0YXRpY19jYXN0PGludDMyX3QgKj4odnApOwotICAgIHJldHVybiBpICsgb2Zmc2V0OwotfQotCi1zdGF0aWMgZmxvYXQqIFNDX2xvYWRTaW1wbGVNZXNoVmVydGljZXNGKFJzU2ltcGxlTWVzaCBtZXNoLCB1aW50MzJfdCBpZHgpCi17Ci0gICAgU2ltcGxlTWVzaCAqdG0gPSBzdGF0aWNfY2FzdDxTaW1wbGVNZXNoICo+KG1lc2gpOwotICAgIHZvaWQgKnZwID0gdG0tPm1WZXJ0ZXhCdWZmZXJzW2lkeF0tPmdldFB0cigpOzsKLSAgICByZXR1cm4gc3RhdGljX2Nhc3Q8ZmxvYXQgKj4odnApOwotfQotCi1zdGF0aWMgdm9pZCBTQ191cGRhdGVTaW1wbGVNZXNoKFJzU2ltcGxlTWVzaCBtZXNoKQotewotICAgIEdFVF9UTFMoKTsKLSAgICBTaW1wbGVNZXNoICpzbSA9IHN0YXRpY19jYXN0PFNpbXBsZU1lc2ggKj4obWVzaCk7Ci0gICAgc20tPnVwbG9hZEFsbChyc2MpOwotfQotCi1zdGF0aWMgdWludDMyX3QgU0NfbG9hZFUzMih1aW50MzJfdCBiYW5rLCB1aW50MzJfdCBvZmZzZXQpCi17Ci0gICAgR0VUX1RMUygpOwotICAgIGNvbnN0IHZvaWQgKnZwID0gc2MtPm1TbG90c1tiYW5rXS0+Z2V0UHRyKCk7Ci0gICAgY29uc3QgdWludDMyX3QgKmkgPSBzdGF0aWNfY2FzdDxjb25zdCB1aW50MzJfdCAqPih2cCk7Ci0gICAgcmV0dXJuIGlbb2Zmc2V0XTsKLX0KLQotc3RhdGljIHZvaWQgU0NfbG9hZFZlYzQodWludDMyX3QgYmFuaywgdWludDMyX3Qgb2Zmc2V0LCByc2NfVmVjdG9yNCAqdikKLXsKLSAgICBHRVRfVExTKCk7Ci0gICAgY29uc3Qgdm9pZCAqdnAgPSBzYy0+bVNsb3RzW2JhbmtdLT5nZXRQdHIoKTsKLSAgICBjb25zdCBmbG9hdCAqZiA9IHN0YXRpY19jYXN0PGNvbnN0IGZsb2F0ICo+KHZwKTsKLSAgICBtZW1jcHkodiwgJmZbb2Zmc2V0XSwgc2l6ZW9mKHJzY19WZWN0b3I0KSk7Ci19Ci0KLXN0YXRpYyB2b2lkIFNDX2xvYWRNYXRyaXgodWludDMyX3QgYmFuaywgdWludDMyX3Qgb2Zmc2V0LCByc2NfTWF0cml4ICptKQotewotICAgIEdFVF9UTFMoKTsKLSAgICBjb25zdCB2b2lkICp2cCA9IHNjLT5tU2xvdHNbYmFua10tPmdldFB0cigpOwotICAgIGNvbnN0IGZsb2F0ICpmID0gc3RhdGljX2Nhc3Q8Y29uc3QgZmxvYXQgKj4odnApOwotICAgIG1lbWNweShtLCAmZltvZmZzZXRdLCBzaXplb2YocnNjX01hdHJpeCkpOwotfQotCi0KLXN0YXRpYyB2b2lkIFNDX3N0b3JlRih1aW50MzJfdCBiYW5rLCB1aW50MzJfdCBvZmZzZXQsIGZsb2F0IHYpCi17Ci0gICAgLy9MT0dFKCJzdG9yZUYgJWkgJWkgJWYiLCBiYW5rLCBvZmZzZXQsIHYpOwotICAgIEdFVF9UTFMoKTsKLSAgICB2b2lkICp2cCA9IHNjLT5tU2xvdHNbYmFua10tPmdldFB0cigpOwotICAgIGZsb2F0ICpmID0gc3RhdGljX2Nhc3Q8ZmxvYXQgKj4odnApOwotICAgIGZbb2Zmc2V0XSA9IHY7Ci19Ci0KLXN0YXRpYyB2b2lkIFNDX3N0b3JlSTMyKHVpbnQzMl90IGJhbmssIHVpbnQzMl90IG9mZnNldCwgaW50MzJfdCB2KQotewotICAgIEdFVF9UTFMoKTsKLSAgICB2b2lkICp2cCA9IHNjLT5tU2xvdHNbYmFua10tPmdldFB0cigpOwotICAgIGludDMyX3QgKmYgPSBzdGF0aWNfY2FzdDxpbnQzMl90ICo+KHZwKTsKLSAgICBzdGF0aWNfY2FzdDxpbnQzMl90ICo+KHNjLT5tU2xvdHNbYmFua10tPmdldFB0cigpKVtvZmZzZXRdID0gdjsKLX0KLQotc3RhdGljIHZvaWQgU0Nfc3RvcmVVMzIodWludDMyX3QgYmFuaywgdWludDMyX3Qgb2Zmc2V0LCB1aW50MzJfdCB2KQotewotICAgIEdFVF9UTFMoKTsKLSAgICB2b2lkICp2cCA9IHNjLT5tU2xvdHNbYmFua10tPmdldFB0cigpOwotICAgIHVpbnQzMl90ICpmID0gc3RhdGljX2Nhc3Q8dWludDMyX3QgKj4odnApOwotICAgIHN0YXRpY19jYXN0PHVpbnQzMl90ICo+KHNjLT5tU2xvdHNbYmFua10tPmdldFB0cigpKVtvZmZzZXRdID0gdjsKLX0KLQotc3RhdGljIHZvaWQgU0Nfc3RvcmVWZWM0KHVpbnQzMl90IGJhbmssIHVpbnQzMl90IG9mZnNldCwgY29uc3QgcnNjX1ZlY3RvcjQgKnYpCi17Ci0gICAgR0VUX1RMUygpOwotICAgIHZvaWQgKnZwID0gc2MtPm1TbG90c1tiYW5rXS0+Z2V0UHRyKCk7Ci0gICAgZmxvYXQgKmYgPSBzdGF0aWNfY2FzdDxmbG9hdCAqPih2cCk7Ci0gICAgbWVtY3B5KCZmW29mZnNldF0sIHYsIHNpemVvZihyc2NfVmVjdG9yNCkpOwotfQotCi1zdGF0aWMgdm9pZCBTQ19zdG9yZU1hdHJpeCh1aW50MzJfdCBiYW5rLCB1aW50MzJfdCBvZmZzZXQsIGNvbnN0IHJzY19NYXRyaXggKm0pCi17Ci0gICAgR0VUX1RMUygpOwotICAgIHZvaWQgKnZwID0gc2MtPm1TbG90c1tiYW5rXS0+Z2V0UHRyKCk7Ci0gICAgZmxvYXQgKmYgPSBzdGF0aWNfY2FzdDxmbG9hdCAqPih2cCk7Ci0gICAgbWVtY3B5KCZmW29mZnNldF0sIG0sIHNpemVvZihyc2NfTWF0cml4KSk7Ci19Ci0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotLy8gVmVjMyByb3V0aW5lcwotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0KLXN0YXRpYyB2b2lkIFNDX3ZlYzNOb3JtKHZlYzNfdCAqdikKLXsKLSAgICBmbG9hdCBsZW4gPSBzcXJ0Zih2LT54ICogdi0+eCArIHYtPnkgKiB2LT55ICsgdi0+eiAqIHYtPnopOwotICAgIGxlbiA9IDEgLyBsZW47Ci0gICAgdi0+eCAqPSBsZW47Ci0gICAgdi0+eSAqPSBsZW47Ci0gICAgdi0+eiAqPSBsZW47Ci19Ci0KLXN0YXRpYyBmbG9hdCBTQ192ZWMzTGVuZ3RoKGNvbnN0IHZlYzNfdCAqdikKLXsKLSAgICByZXR1cm4gc3FydGYodi0+eCAqIHYtPnggKyB2LT55ICogdi0+eSArIHYtPnogKiB2LT56KTsKLX0KLQotc3RhdGljIHZvaWQgU0NfdmVjM0FkZCh2ZWMzX3QgKmRlc3QsIGNvbnN0IHZlYzNfdCAqbGhzLCBjb25zdCB2ZWMzX3QgKnJocykKLXsKLSAgICBkZXN0LT54ID0gbGhzLT54ICsgcmhzLT54OwotICAgIGRlc3QtPnkgPSBsaHMtPnkgKyByaHMtPnk7Ci0gICAgZGVzdC0+eiA9IGxocy0+eiArIHJocy0+ejsKLX0KLQotc3RhdGljIHZvaWQgU0NfdmVjM1N1Yih2ZWMzX3QgKmRlc3QsIGNvbnN0IHZlYzNfdCAqbGhzLCBjb25zdCB2ZWMzX3QgKnJocykKLXsKLSAgICBkZXN0LT54ID0gbGhzLT54IC0gcmhzLT54OwotICAgIGRlc3QtPnkgPSBsaHMtPnkgLSByaHMtPnk7Ci0gICAgZGVzdC0+eiA9IGxocy0+eiAtIHJocy0+ejsKLX0KLQotc3RhdGljIHZvaWQgU0NfdmVjM0Nyb3NzKHZlYzNfdCAqZGVzdCwgY29uc3QgdmVjM190ICpsaHMsIGNvbnN0IHZlYzNfdCAqcmhzKQotewotICAgIGZsb2F0IHggPSBsaHMtPnkgKiByaHMtPnogIC0gbGhzLT56ICogcmhzLT55OwotICAgIGZsb2F0IHkgPSBsaHMtPnogKiByaHMtPnggIC0gbGhzLT54ICogcmhzLT56OwotICAgIGZsb2F0IHogPSBsaHMtPnggKiByaHMtPnkgIC0gbGhzLT55ICogcmhzLT54OwotICAgIGRlc3QtPnggPSB4OwotICAgIGRlc3QtPnkgPSB5OwotICAgIGRlc3QtPnogPSB6OwotfQotCi1zdGF0aWMgZmxvYXQgU0NfdmVjM0RvdChjb25zdCB2ZWMzX3QgKmxocywgY29uc3QgdmVjM190ICpyaHMpCi17Ci0gICAgcmV0dXJuIGxocy0+eCAqIHJocy0+eCArIGxocy0+eSAqIHJocy0+eSArIGxocy0+eiAqIHJocy0+ejsKLX0KLQotc3RhdGljIHZvaWQgU0NfdmVjM1NjYWxlKHZlYzNfdCAqbGhzLCBmbG9hdCBzY2FsZSkKLXsKLSAgICBsaHMtPnggKj0gc2NhbGU7Ci0gICAgbGhzLT55ICo9IHNjYWxlOwotICAgIGxocy0+eiAqPSBzY2FsZTsKLX0KLQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0vLyBWZWM0IHJvdXRpbmVzCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLQotc3RhdGljIHZvaWQgU0NfdmVjNE5vcm0odmVjNF90ICp2KQotewotICAgIGZsb2F0IGxlbiA9IHNxcnRmKHYtPnggKiB2LT54ICsgdi0+eSAqIHYtPnkgKyB2LT56ICogdi0+eiArIHYtPncgKiB2LT53KTsKLSAgICBsZW4gPSAxIC8gbGVuOwotICAgIHYtPnggKj0gbGVuOwotICAgIHYtPnkgKj0gbGVuOwotICAgIHYtPnogKj0gbGVuOwotICAgIHYtPncgKj0gbGVuOwotfQotCi1zdGF0aWMgZmxvYXQgU0NfdmVjNExlbmd0aChjb25zdCB2ZWM0X3QgKnYpCi17Ci0gICAgcmV0dXJuIHNxcnRmKHYtPnggKiB2LT54ICsgdi0+eSAqIHYtPnkgKyB2LT56ICogdi0+eiArIHYtPncgKiB2LT53KTsKLX0KLQotc3RhdGljIHZvaWQgU0NfdmVjNEFkZCh2ZWM0X3QgKmRlc3QsIGNvbnN0IHZlYzRfdCAqbGhzLCBjb25zdCB2ZWM0X3QgKnJocykKLXsKLSAgICBkZXN0LT54ID0gbGhzLT54ICsgcmhzLT54OwotICAgIGRlc3QtPnkgPSBsaHMtPnkgKyByaHMtPnk7Ci0gICAgZGVzdC0+eiA9IGxocy0+eiArIHJocy0+ejsKLSAgICBkZXN0LT53ID0gbGhzLT53ICsgcmhzLT53OwotfQotCi1zdGF0aWMgdm9pZCBTQ192ZWM0U3ViKHZlYzRfdCAqZGVzdCwgY29uc3QgdmVjNF90ICpsaHMsIGNvbnN0IHZlYzRfdCAqcmhzKQotewotICAgIGRlc3QtPnggPSBsaHMtPnggLSByaHMtPng7Ci0gICAgZGVzdC0+eSA9IGxocy0+eSAtIHJocy0+eTsKLSAgICBkZXN0LT56ID0gbGhzLT56IC0gcmhzLT56OwotICAgIGRlc3QtPncgPSBsaHMtPncgLSByaHMtPnc7Ci19Ci0KLXN0YXRpYyBmbG9hdCBTQ192ZWM0RG90KGNvbnN0IHZlYzRfdCAqbGhzLCBjb25zdCB2ZWM0X3QgKnJocykKLXsKLSAgICByZXR1cm4gbGhzLT54ICogcmhzLT54ICsgbGhzLT55ICogcmhzLT55ICsgbGhzLT56ICogcmhzLT56ICsgbGhzLT53ICogcmhzLT53OwotfQotCi1zdGF0aWMgdm9pZCBTQ192ZWM0U2NhbGUodmVjNF90ICpsaHMsIGZsb2F0IHNjYWxlKQotewotICAgIGxocy0+eCAqPSBzY2FsZTsKLSAgICBsaHMtPnkgKj0gc2NhbGU7Ci0gICAgbGhzLT56ICo9IHNjYWxlOwotICAgIGxocy0+dyAqPSBzY2FsZTsKLX0KIAogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAvLyBNYXRoIHJvdXRpbmVzCiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KIAotI2RlZmluZSBQSSAzLjE0MTU5MjZmCi0jZGVmaW5lIERFR19UT19SQUQgUEkgLyAxODAuMGYKLSNkZWZpbmUgUkFEX1RPX0RFRyAxODAuMGYgLyBQSQotCiBzdGF0aWMgZmxvYXQgU0Nfc2luZl9mYXN0KGZsb2F0IHgpCiB7CiAgICAgY29uc3QgZmxvYXQgQSA9ICAgMS4wZiAvICgyLjBmICogTV9QSSk7CkBAIC0zMjMsNiArNzMsNyBAQAogICAgIHJldHVybiAwLjIyMTVmICogKHkgKiBmYWJzZih5KSAtIHkpICsgeTsKIH0KIAorCiBzdGF0aWMgZmxvYXQgU0NfcmFuZGYoZmxvYXQgbWF4KQogewogICAgIGZsb2F0IHIgPSAoZmxvYXQpcmFuZCgpOwpAQCAtMzM1LDEwNCArODYsMjAgQEAKICAgICByZXR1cm4gciAvIFJBTkRfTUFYICogKG1heCAtIG1pbikgKyBtaW47CiB9CiAKLXN0YXRpYyBpbnQgU0Nfc2lnbihpbnQgdmFsdWUpCitzdGF0aWMgaW50IFNDX3JhbmRpKGludCBtYXgpCiB7Ci0gICAgcmV0dXJuICh2YWx1ZSA+IDApIC0gKHZhbHVlIDwgMCk7CisgICAgcmV0dXJuIChpbnQpU0NfcmFuZGYobWF4KTsKIH0KIAotc3RhdGljIGZsb2F0IFNDX3NpZ25mKGZsb2F0IHZhbHVlKQorc3RhdGljIGludCBTQ19yYW5kaTIoaW50IG1pbiwgaW50IG1heCkKIHsKLSAgICByZXR1cm4gKHZhbHVlID4gMCkgLSAodmFsdWUgPCAwKTsKKyAgICByZXR1cm4gKGludClTQ19yYW5kZjIobWluLCBtYXgpOwogfQogCi1zdGF0aWMgZmxvYXQgU0NfY2xhbXBmKGZsb2F0IGFtb3VudCwgZmxvYXQgbG93LCBmbG9hdCBoaWdoKQorc3RhdGljIGZsb2F0IFNDX2ZyYWMoZmxvYXQgdikKIHsKLSAgICByZXR1cm4gYW1vdW50IDwgbG93ID8gbG93IDogKGFtb3VudCA+IGhpZ2ggPyBoaWdoIDogYW1vdW50KTsKLX0KLQotc3RhdGljIGludCBTQ19jbGFtcChpbnQgYW1vdW50LCBpbnQgbG93LCBpbnQgaGlnaCkKLXsKLSAgICByZXR1cm4gYW1vdW50IDwgbG93ID8gbG93IDogKGFtb3VudCA+IGhpZ2ggPyBoaWdoIDogYW1vdW50KTsKLX0KLQotc3RhdGljIGZsb2F0IFNDX21heGYoZmxvYXQgYSwgZmxvYXQgYikKLXsKLSAgICByZXR1cm4gYSA+IGIgPyBhIDogYjsKLX0KLQotc3RhdGljIGZsb2F0IFNDX21pbmYoZmxvYXQgYSwgZmxvYXQgYikKLXsKLSAgICByZXR1cm4gYSA8IGIgPyBhIDogYjsKLX0KLQotc3RhdGljIGZsb2F0IFNDX3NxcmYoZmxvYXQgdikKLXsKLSAgICByZXR1cm4gdiAqIHY7Ci19Ci0KLXN0YXRpYyBpbnQgU0Nfc3FyKGludCB2KQotewotICAgIHJldHVybiB2ICogdjsKLX0KLQotc3RhdGljIGZsb2F0IFNDX2ZyYWNmKGZsb2F0IHYpCi17Ci0gICAgcmV0dXJuIHYgLSBmbG9vcmYodik7Ci19Ci0KLXN0YXRpYyBmbG9hdCBTQ19yb3VuZGYoZmxvYXQgdikKLXsKLSAgICByZXR1cm4gZmxvb3JmKHYgKyAwLjQ5OTk5OTk5OTkpOwotfQotCi1zdGF0aWMgZmxvYXQgU0NfZGlzdGYyKGZsb2F0IHgxLCBmbG9hdCB5MSwgZmxvYXQgeDIsIGZsb2F0IHkyKQotewotICAgIGZsb2F0IHggPSB4MiAtIHgxOwotICAgIGZsb2F0IHkgPSB5MiAtIHkxOwotICAgIHJldHVybiBzcXJ0Zih4ICogeCArIHkgKiB5KTsKLX0KLQotc3RhdGljIGZsb2F0IFNDX2Rpc3RmMyhmbG9hdCB4MSwgZmxvYXQgeTEsIGZsb2F0IHoxLCBmbG9hdCB4MiwgZmxvYXQgeTIsIGZsb2F0IHoyKQotewotICAgIGZsb2F0IHggPSB4MiAtIHgxOwotICAgIGZsb2F0IHkgPSB5MiAtIHkxOwotICAgIGZsb2F0IHogPSB6MiAtIHoxOwotICAgIHJldHVybiBzcXJ0Zih4ICogeCArIHkgKiB5ICsgeiAqIHopOwotfQotCi1zdGF0aWMgZmxvYXQgU0NfbWFnZjIoZmxvYXQgYSwgZmxvYXQgYikKLXsKLSAgICByZXR1cm4gc3FydGYoYSAqIGEgKyBiICogYik7Ci19Ci0KLXN0YXRpYyBmbG9hdCBTQ19tYWdmMyhmbG9hdCBhLCBmbG9hdCBiLCBmbG9hdCBjKQotewotICAgIHJldHVybiBzcXJ0ZihhICogYSArIGIgKiBiICsgYyAqIGMpOwotfQotCi1zdGF0aWMgZmxvYXQgU0NfcmFkZihmbG9hdCBkZWdyZWVzKQotewotICAgIHJldHVybiBkZWdyZWVzICogREVHX1RPX1JBRDsKLX0KLQotc3RhdGljIGZsb2F0IFNDX2RlZ2YoZmxvYXQgcmFkaWFucykKLXsKLSAgICByZXR1cm4gcmFkaWFucyAqIFJBRF9UT19ERUc7Ci19Ci0KLXN0YXRpYyBmbG9hdCBTQ19sZXJwZihmbG9hdCBzdGFydCwgZmxvYXQgc3RvcCwgZmxvYXQgYW1vdW50KQotewotICAgIHJldHVybiBzdGFydCArIChzdG9wIC0gc3RhcnQpICogYW1vdW50OwotfQotCi1zdGF0aWMgZmxvYXQgU0Nfbm9ybWYoZmxvYXQgc3RhcnQsIGZsb2F0IHN0b3AsIGZsb2F0IHZhbHVlKQotewotICAgIHJldHVybiAodmFsdWUgLSBzdGFydCkgLyAoc3RvcCAtIHN0YXJ0KTsKLX0KLQotc3RhdGljIGZsb2F0IFNDX21hcGYoZmxvYXQgbWluU3RhcnQsIGZsb2F0IG1pblN0b3AsIGZsb2F0IG1heFN0YXJ0LCBmbG9hdCBtYXhTdG9wLCBmbG9hdCB2YWx1ZSkKLXsKLSAgICByZXR1cm4gbWF4U3RhcnQgKyAobWF4U3RhcnQgLSBtYXhTdG9wKSAqICgodmFsdWUgLSBtaW5TdGFydCkgLyAobWluU3RvcCAtIG1pblN0YXJ0KSk7CisgICAgaW50IGkgPSAoaW50KWZsb29yKHYpOworICAgIHJldHVybiBmbWluKHYgLSBpLCAweDEuZmZmZmZlcC0xZik7CiB9CiAKIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwpAQCAtNTExLDM0OCArMTc4LDIyIEBACiAgICAgcmV0dXJuIHRpbWVpbmZvLT50bV95ZWFyOwogfQogCi1zdGF0aWMgaW50MzJfdCBTQ191cHRpbWVNaWxsaXMoKQorc3RhdGljIGludDY0X3QgU0NfdXB0aW1lTWlsbGlzKCkKIHsKICAgICByZXR1cm4gbmFub3NlY29uZHNfdG9fbWlsbGlzZWNvbmRzKHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKSk7CiB9CiAKLXN0YXRpYyBpbnQzMl90IFNDX3N0YXJ0VGltZU1pbGxpcygpCitzdGF0aWMgaW50NjRfdCBTQ191cHRpbWVOYW5vcygpCit7CisgICAgcmV0dXJuIHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKK30KKworc3RhdGljIGZsb2F0IFNDX2dldER0KCkKIHsKICAgICBHRVRfVExTKCk7Ci0gICAgcmV0dXJuIHNjLT5tRW52aXJvbWVudC5tU3RhcnRUaW1lTWlsbGlzOwotfQotCi1zdGF0aWMgaW50MzJfdCBTQ19lbGFwc2VkVGltZU1pbGxpcygpCi17Ci0gICAgR0VUX1RMUygpOwotICAgIHJldHVybiBuYW5vc2Vjb25kc190b19taWxsaXNlY29uZHMoc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpKQotICAgICAgICAgICAgLSBzYy0+bUVudmlyb21lbnQubVN0YXJ0VGltZU1pbGxpczsKLX0KLQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0vLyBNYXRyaXggcm91dGluZXMKLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotCi0KLXN0YXRpYyB2b2lkIFNDX21hdHJpeExvYWRJZGVudGl0eShyc2NfTWF0cml4ICptYXQpCi17Ci0gICAgTWF0cml4ICptID0gcmVpbnRlcnByZXRfY2FzdDxNYXRyaXggKj4obWF0KTsKLSAgICBtLT5sb2FkSWRlbnRpdHkoKTsKLX0KLQotc3RhdGljIHZvaWQgU0NfbWF0cml4TG9hZEZsb2F0KHJzY19NYXRyaXggKm1hdCwgY29uc3QgZmxvYXQgKmYpCi17Ci0gICAgTWF0cml4ICptID0gcmVpbnRlcnByZXRfY2FzdDxNYXRyaXggKj4obWF0KTsKLSAgICBtLT5sb2FkKGYpOwotfQotCi1zdGF0aWMgdm9pZCBTQ19tYXRyaXhMb2FkTWF0KHJzY19NYXRyaXggKm1hdCwgY29uc3QgcnNjX01hdHJpeCAqbmV3bWF0KQotewotICAgIE1hdHJpeCAqbSA9IHJlaW50ZXJwcmV0X2Nhc3Q8TWF0cml4ICo+KG1hdCk7Ci0gICAgbS0+bG9hZChyZWludGVycHJldF9jYXN0PGNvbnN0IE1hdHJpeCAqPihuZXdtYXQpKTsKLX0KLQotc3RhdGljIHZvaWQgU0NfbWF0cml4TG9hZFJvdGF0ZShyc2NfTWF0cml4ICptYXQsIGZsb2F0IHJvdCwgZmxvYXQgeCwgZmxvYXQgeSwgZmxvYXQgeikKLXsKLSAgICBNYXRyaXggKm0gPSByZWludGVycHJldF9jYXN0PE1hdHJpeCAqPihtYXQpOwotICAgIG0tPmxvYWRSb3RhdGUocm90LCB4LCB5LCB6KTsKLX0KLQotc3RhdGljIHZvaWQgU0NfbWF0cml4TG9hZFNjYWxlKHJzY19NYXRyaXggKm1hdCwgZmxvYXQgeCwgZmxvYXQgeSwgZmxvYXQgeikKLXsKLSAgICBNYXRyaXggKm0gPSByZWludGVycHJldF9jYXN0PE1hdHJpeCAqPihtYXQpOwotICAgIG0tPmxvYWRTY2FsZSh4LCB5LCB6KTsKLX0KLQotc3RhdGljIHZvaWQgU0NfbWF0cml4TG9hZFRyYW5zbGF0ZShyc2NfTWF0cml4ICptYXQsIGZsb2F0IHgsIGZsb2F0IHksIGZsb2F0IHopCi17Ci0gICAgTWF0cml4ICptID0gcmVpbnRlcnByZXRfY2FzdDxNYXRyaXggKj4obWF0KTsKLSAgICBtLT5sb2FkVHJhbnNsYXRlKHgsIHksIHopOwotfQotCi1zdGF0aWMgdm9pZCBTQ19tYXRyaXhMb2FkTXVsdGlwbHkocnNjX01hdHJpeCAqbWF0LCBjb25zdCByc2NfTWF0cml4ICpsaHMsIGNvbnN0IHJzY19NYXRyaXggKnJocykKLXsKLSAgICBNYXRyaXggKm0gPSByZWludGVycHJldF9jYXN0PE1hdHJpeCAqPihtYXQpOwotICAgIG0tPmxvYWRNdWx0aXBseShyZWludGVycHJldF9jYXN0PGNvbnN0IE1hdHJpeCAqPihsaHMpLAotICAgICAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PGNvbnN0IE1hdHJpeCAqPihyaHMpKTsKLX0KLQotc3RhdGljIHZvaWQgU0NfbWF0cml4TXVsdGlwbHkocnNjX01hdHJpeCAqbWF0LCBjb25zdCByc2NfTWF0cml4ICpyaHMpCi17Ci0gICAgTWF0cml4ICptID0gcmVpbnRlcnByZXRfY2FzdDxNYXRyaXggKj4obWF0KTsKLSAgICBtLT5tdWx0aXBseShyZWludGVycHJldF9jYXN0PGNvbnN0IE1hdHJpeCAqPihyaHMpKTsKLX0KLQotc3RhdGljIHZvaWQgU0NfbWF0cml4Um90YXRlKHJzY19NYXRyaXggKm1hdCwgZmxvYXQgcm90LCBmbG9hdCB4LCBmbG9hdCB5LCBmbG9hdCB6KQotewotICAgIE1hdHJpeCAqbSA9IHJlaW50ZXJwcmV0X2Nhc3Q8TWF0cml4ICo+KG1hdCk7Ci0gICAgbS0+cm90YXRlKHJvdCwgeCwgeSwgeik7Ci19Ci0KLXN0YXRpYyB2b2lkIFNDX21hdHJpeFNjYWxlKHJzY19NYXRyaXggKm1hdCwgZmxvYXQgeCwgZmxvYXQgeSwgZmxvYXQgeikKLXsKLSAgICBNYXRyaXggKm0gPSByZWludGVycHJldF9jYXN0PE1hdHJpeCAqPihtYXQpOwotICAgIG0tPnNjYWxlKHgsIHksIHopOwotfQotCi1zdGF0aWMgdm9pZCBTQ19tYXRyaXhUcmFuc2xhdGUocnNjX01hdHJpeCAqbWF0LCBmbG9hdCB4LCBmbG9hdCB5LCBmbG9hdCB6KQotewotICAgIE1hdHJpeCAqbSA9IHJlaW50ZXJwcmV0X2Nhc3Q8TWF0cml4ICo+KG1hdCk7Ci0gICAgbS0+dHJhbnNsYXRlKHgsIHksIHopOwotfQotCi0KLXN0YXRpYyB2b2lkIFNDX3ZlYzJSYW5kKGZsb2F0ICp2ZWMsIGZsb2F0IG1heExlbikKLXsKLSAgICBmbG9hdCBhbmdsZSA9IFNDX3JhbmRmKFBJICogMik7Ci0gICAgZmxvYXQgbGVuID0gU0NfcmFuZGYobWF4TGVuKTsKLSAgICB2ZWNbMF0gPSBsZW4gKiBzaW5mKGFuZ2xlKTsKLSAgICB2ZWNbMV0gPSBsZW4gKiBjb3NmKGFuZ2xlKTsKLX0KLQotCi0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotLy8gQ29udGV4dAotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0KLXN0YXRpYyB2b2lkIFNDX2JpbmRUZXh0dXJlKFJzUHJvZ3JhbUZyYWdtZW50IHZwZiwgdWludDMyX3Qgc2xvdCwgUnNBbGxvY2F0aW9uIHZhKQotewotICAgIEdFVF9UTFMoKTsKLSAgICByc2lfUHJvZ3JhbUJpbmRUZXh0dXJlKHJzYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PFByb2dyYW1GcmFnbWVudCAqPih2cGYpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgc2xvdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PEFsbG9jYXRpb24gKj4odmEpKTsKLQotfQotCi1zdGF0aWMgdm9pZCBTQ19iaW5kU2FtcGxlcihSc1Byb2dyYW1GcmFnbWVudCB2cGYsIHVpbnQzMl90IHNsb3QsIFJzU2FtcGxlciB2cykKLXsKLSAgICBHRVRfVExTKCk7Ci0gICAgcnNpX1Byb2dyYW1CaW5kU2FtcGxlcihyc2MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxQcm9ncmFtRnJhZ21lbnQgKj4odnBmKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHNsb3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxTYW1wbGVyICo+KHZzKSk7Ci0KLX0KLQotc3RhdGljIHZvaWQgU0NfYmluZFByb2dyYW1GcmFnbWVudFN0b3JlKFJzUHJvZ3JhbUZyYWdtZW50U3RvcmUgcGZzKQotewotICAgIEdFVF9UTFMoKTsKLSAgICByc2lfQ29udGV4dEJpbmRQcm9ncmFtRnJhZ21lbnRTdG9yZShyc2MsIHBmcyk7Ci0KLX0KLQotc3RhdGljIHZvaWQgU0NfYmluZFByb2dyYW1GcmFnbWVudChSc1Byb2dyYW1GcmFnbWVudCBwZikKLXsKLSAgICBHRVRfVExTKCk7Ci0gICAgcnNpX0NvbnRleHRCaW5kUHJvZ3JhbUZyYWdtZW50KHJzYywgcGYpOwotCi19Ci0KLXN0YXRpYyB2b2lkIFNDX2JpbmRQcm9ncmFtVmVydGV4KFJzUHJvZ3JhbVZlcnRleCBwdikKLXsKLSAgICBHRVRfVExTKCk7Ci0gICAgcnNpX0NvbnRleHRCaW5kUHJvZ3JhbVZlcnRleChyc2MsIHB2KTsKLQotfQotCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLS8vIFZQCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLQotc3RhdGljIHZvaWQgU0NfdnBMb2FkTW9kZWxNYXRyaXgoY29uc3QgcnNjX01hdHJpeCAqbSkKLXsKLSAgICBHRVRfVExTKCk7Ci0gICAgcnNjLT5nZXRWZXJ0ZXgoKS0+c2V0TW9kZWx2aWV3TWF0cml4KG0pOwotfQotCi1zdGF0aWMgdm9pZCBTQ192cExvYWRUZXh0dXJlTWF0cml4KGNvbnN0IHJzY19NYXRyaXggKm0pCi17Ci0gICAgR0VUX1RMUygpOwotICAgIHJzYy0+Z2V0VmVydGV4KCktPnNldFRleHR1cmVNYXRyaXgobSk7Ci19Ci0KLQotCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLS8vIERyYXdpbmcKLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotCi1zdGF0aWMgdm9pZCBTQ19kcmF3TGluZShmbG9hdCB4MSwgZmxvYXQgeTEsIGZsb2F0IHoxLAotICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgeDIsIGZsb2F0IHkyLCBmbG9hdCB6MikKLXsKLSAgICBHRVRfVExTKCk7Ci0gICAgaWYgKCFyc2MtPnNldHVwQ2hlY2soKSkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgZmxvYXQgdnR4W10gPSB7IHgxLCB5MSwgejEsIHgyLCB5MiwgejIgfTsKLSAgICBWZXJ0ZXhBcnJheSB2YTsKLSAgICB2YS5hZGRMZWdhY3koR0xfRkxPQVQsIDMsIDEyLCBSU19LSU5EX1BPU0lUSU9OLCBmYWxzZSwgKHVpbnQzMl90KXZ0eCk7Ci0gICAgaWYgKHJzYy0+Y2hlY2tWZXJzaW9uMl8wKCkpIHsKLSAgICAgICAgdmEuc2V0dXBHTDIocnNjLCAmcnNjLT5tU3RhdGVWZXJ0ZXhBcnJheSwgJnJzYy0+bVNoYWRlckNhY2hlKTsKLSAgICB9IGVsc2UgewotICAgICAgICB2YS5zZXR1cEdMKHJzYywgJnJzYy0+bVN0YXRlVmVydGV4QXJyYXkpOwotICAgIH0KLQotICAgIGdsRHJhd0FycmF5cyhHTF9MSU5FUywgMCwgMik7Ci19Ci0KLXN0YXRpYyB2b2lkIFNDX2RyYXdQb2ludChmbG9hdCB4LCBmbG9hdCB5LCBmbG9hdCB6KQotewotICAgIEdFVF9UTFMoKTsKLSAgICBpZiAoIXJzYy0+c2V0dXBDaGVjaygpKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBmbG9hdCB2dHhbXSA9IHsgeCwgeSwgeiB9OwotCi0gICAgVmVydGV4QXJyYXkgdmE7Ci0gICAgdmEuYWRkTGVnYWN5KEdMX0ZMT0FULCAzLCAxMiwgUlNfS0lORF9QT1NJVElPTiwgZmFsc2UsICh1aW50MzJfdCl2dHgpOwotICAgIGlmIChyc2MtPmNoZWNrVmVyc2lvbjJfMCgpKSB7Ci0gICAgICAgIHZhLnNldHVwR0wyKHJzYywgJnJzYy0+bVN0YXRlVmVydGV4QXJyYXksICZyc2MtPm1TaGFkZXJDYWNoZSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgdmEuc2V0dXBHTChyc2MsICZyc2MtPm1TdGF0ZVZlcnRleEFycmF5KTsKLSAgICB9Ci0KLSAgICBnbERyYXdBcnJheXMoR0xfUE9JTlRTLCAwLCAxKTsKLX0KLQotc3RhdGljIHZvaWQgU0NfZHJhd1F1YWRUZXhDb29yZHMoZmxvYXQgeDEsIGZsb2F0IHkxLCBmbG9hdCB6MSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHUxLCBmbG9hdCB2MSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHgyLCBmbG9hdCB5MiwgZmxvYXQgejIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCB1MiwgZmxvYXQgdjIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCB4MywgZmxvYXQgeTMsIGZsb2F0IHozLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgdTMsIGZsb2F0IHYzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgeDQsIGZsb2F0IHk0LCBmbG9hdCB6NCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHU0LCBmbG9hdCB2NCkKLXsKLSAgICBHRVRfVExTKCk7Ci0gICAgaWYgKCFyc2MtPnNldHVwQ2hlY2soKSkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgLy9MT0dFKCJRdWFkIik7Ci0gICAgLy9MT0dFKCIlNC4yZiwgJTQuMmYsICU0LjJmIiwgeDEsIHkxLCB6MSk7Ci0gICAgLy9MT0dFKCIlNC4yZiwgJTQuMmYsICU0LjJmIiwgeDIsIHkyLCB6Mik7Ci0gICAgLy9MT0dFKCIlNC4yZiwgJTQuMmYsICU0LjJmIiwgeDMsIHkzLCB6Myk7Ci0gICAgLy9MT0dFKCIlNC4yZiwgJTQuMmYsICU0LjJmIiwgeDQsIHk0LCB6NCk7Ci0KLSAgICBmbG9hdCB2dHhbXSA9IHt4MSx5MSx6MSwgeDIseTIsejIsIHgzLHkzLHozLCB4NCx5NCx6NH07Ci0gICAgY29uc3QgZmxvYXQgdGV4W10gPSB7dTEsdjEsIHUyLHYyLCB1Myx2MywgdTQsdjR9OwotCi0gICAgVmVydGV4QXJyYXkgdmE7Ci0gICAgdmEuYWRkTGVnYWN5KEdMX0ZMT0FULCAzLCAxMiwgUlNfS0lORF9QT1NJVElPTiwgZmFsc2UsICh1aW50MzJfdCl2dHgpOwotICAgIHZhLmFkZExlZ2FjeShHTF9GTE9BVCwgMiwgOCwgUlNfS0lORF9URVhUVVJFLCBmYWxzZSwgKHVpbnQzMl90KXRleCk7Ci0gICAgaWYgKHJzYy0+Y2hlY2tWZXJzaW9uMl8wKCkpIHsKLSAgICAgICAgdmEuc2V0dXBHTDIocnNjLCAmcnNjLT5tU3RhdGVWZXJ0ZXhBcnJheSwgJnJzYy0+bVNoYWRlckNhY2hlKTsKLSAgICB9IGVsc2UgewotICAgICAgICB2YS5zZXR1cEdMKHJzYywgJnJzYy0+bVN0YXRlVmVydGV4QXJyYXkpOwotICAgIH0KLQotCi0gICAgZ2xEcmF3QXJyYXlzKEdMX1RSSUFOR0xFX0ZBTiwgMCwgNCk7Ci19Ci0KLXN0YXRpYyB2b2lkIFNDX2RyYXdRdWFkKGZsb2F0IHgxLCBmbG9hdCB5MSwgZmxvYXQgejEsCi0gICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCB4MiwgZmxvYXQgeTIsIGZsb2F0IHoyLAotICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgeDMsIGZsb2F0IHkzLCBmbG9hdCB6MywKLSAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHg0LCBmbG9hdCB5NCwgZmxvYXQgejQpCi17Ci0gICAgU0NfZHJhd1F1YWRUZXhDb29yZHMoeDEsIHkxLCB6MSwgMCwgMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICB4MiwgeTIsIHoyLCAxLCAxLAotICAgICAgICAgICAgICAgICAgICAgICAgIHgzLCB5MywgejMsIDEsIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgeDQsIHk0LCB6NCwgMCwgMCk7Ci19Ci0KLXN0YXRpYyB2b2lkIFNDX2RyYXdTcHJpdGVTY3JlZW5zcGFjZShmbG9hdCB4LCBmbG9hdCB5LCBmbG9hdCB6LCBmbG9hdCB3LCBmbG9hdCBoKQotewotICAgIEdFVF9UTFMoKTsKLSAgICBPYmplY3RCYXNlUmVmPGNvbnN0IFByb2dyYW1WZXJ0ZXg+IHRtcChyc2MtPmdldFZlcnRleCgpKTsKLSAgICByc2MtPnNldFZlcnRleChyc2MtPmdldERlZmF1bHRQcm9ncmFtVmVydGV4KCkpOwotICAgIC8vcnNjLT5zZXR1cENoZWNrKCk7Ci0KLSAgICAvL0dMaW50IGNyb3BbNF0gPSB7MCwgaCwgdywgLWh9OwotCi0gICAgZmxvYXQgc2ggPSByc2MtPmdldEhlaWdodCgpOwotCi0gICAgU0NfZHJhd1F1YWQoeCwgICBzaCAtIHksICAgICB6LAotICAgICAgICAgICAgICAgIHgrdywgc2ggLSB5LCAgICAgeiwKLSAgICAgICAgICAgICAgICB4K3csIHNoIC0gKHkraCksIHosCi0gICAgICAgICAgICAgICAgeCwgICBzaCAtICh5K2gpLCB6KTsKLSAgICByc2MtPnNldFZlcnRleCgoUHJvZ3JhbVZlcnRleCAqKXRtcC5nZXQoKSk7Ci19Ci0KLXN0YXRpYyB2b2lkIFNDX2RyYXdTcHJpdGVTY3JlZW5zcGFjZUNyb3BwZWQoZmxvYXQgeCwgZmxvYXQgeSwgZmxvYXQgeiwgZmxvYXQgdywgZmxvYXQgaCwKLSAgICAgICAgZmxvYXQgY3gwLCBmbG9hdCBjeTAsIGZsb2F0IGN4MSwgZmxvYXQgY3kxKQotewotICAgIEdFVF9UTFMoKTsKLSAgICBpZiAoIXJzYy0+c2V0dXBDaGVjaygpKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBHTGludCBjcm9wWzRdID0ge2N4MCwgY3kwLCBjeDEsIGN5MX07Ci0gICAgZ2xUZXhQYXJhbWV0ZXJpdihHTF9URVhUVVJFXzJELCBHTF9URVhUVVJFX0NST1BfUkVDVF9PRVMsIGNyb3ApOwotICAgIGdsRHJhd1RleGZPRVMoeCwgeSwgeiwgdywgaCk7Ci19Ci0KLXN0YXRpYyB2b2lkIFNDX2RyYXdTcHJpdGUoZmxvYXQgeCwgZmxvYXQgeSwgZmxvYXQgeiwgZmxvYXQgdywgZmxvYXQgaCkKLXsKLSAgICBHRVRfVExTKCk7Ci0gICAgZmxvYXQgdmluWzNdID0ge3gsIHksIHp9OwotICAgIGZsb2F0IHZvdXRbNF07Ci0KLSAgICAvL0xPR0UoImRzICBpbiAlZiAlZiAlZiIsIHgsIHksIHopOwotICAgIHJzYy0+Z2V0VmVydGV4KCktPnRyYW5zZm9ybVRvU2NyZWVuKHJzYywgdm91dCwgdmluKTsKLSAgICAvL0xPR0UoImRzICBvdXQgJWYgJWYgJWYgJWYiLCB2b3V0WzBdLCB2b3V0WzFdLCB2b3V0WzJdLCB2b3V0WzNdKTsKLSAgICB2b3V0WzBdIC89IHZvdXRbM107Ci0gICAgdm91dFsxXSAvPSB2b3V0WzNdOwotICAgIHZvdXRbMl0gLz0gdm91dFszXTsKLQotICAgIHZvdXRbMF0gKj0gcnNjLT5nZXRXaWR0aCgpIC8gMjsKLSAgICB2b3V0WzFdICo9IHJzYy0+Z2V0SGVpZ2h0KCkgLyAyOwotICAgIHZvdXRbMF0gKz0gcnNjLT5nZXRXaWR0aCgpIC8gMjsKLSAgICB2b3V0WzFdICs9IHJzYy0+Z2V0SGVpZ2h0KCkgLyAyOwotCi0gICAgdm91dFswXSAtPSB3LzI7Ci0gICAgdm91dFsxXSAtPSBoLzI7Ci0KLSAgICAvL0xPR0UoImRzICBvdXQyICVmICVmICVmIiwgdm91dFswXSwgdm91dFsxXSwgdm91dFsyXSk7Ci0KLSAgICAvLyBVLCBWLCBXLCBICi0gICAgU0NfZHJhd1Nwcml0ZVNjcmVlbnNwYWNlKHZvdXRbMF0sIHZvdXRbMV0sIHosIGgsIHcpOwotICAgIC8vcnNjLT5zZXR1cENoZWNrKCk7Ci19Ci0KLQotc3RhdGljIHZvaWQgU0NfZHJhd1JlY3QoZmxvYXQgeDEsIGZsb2F0IHkxLAotICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgeDIsIGZsb2F0IHkyLCBmbG9hdCB6KQotewotICAgIFNDX2RyYXdRdWFkKHgxLCB5MiwgeiwKLSAgICAgICAgICAgICAgICB4MiwgeTIsIHosCi0gICAgICAgICAgICAgICAgeDIsIHkxLCB6LAotICAgICAgICAgICAgICAgIHgxLCB5MSwgeik7Ci19Ci0KLXN0YXRpYyB2b2lkIFNDX2RyYXdTaW1wbGVNZXNoKFJzU2ltcGxlTWVzaCB2c20pCi17Ci0gICAgR0VUX1RMUygpOwotICAgIFNpbXBsZU1lc2ggKnNtID0gc3RhdGljX2Nhc3Q8U2ltcGxlTWVzaCAqPih2c20pOwotICAgIGlmICghcnNjLT5zZXR1cENoZWNrKCkpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBzbS0+cmVuZGVyKHJzYyk7Ci19Ci0KLXN0YXRpYyB2b2lkIFNDX2RyYXdTaW1wbGVNZXNoUmFuZ2UoUnNTaW1wbGVNZXNoIHZzbSwgdWludDMyX3Qgc3RhcnQsIHVpbnQzMl90IGxlbikKLXsKLSAgICBHRVRfVExTKCk7Ci0gICAgU2ltcGxlTWVzaCAqc20gPSBzdGF0aWNfY2FzdDxTaW1wbGVNZXNoICo+KHZzbSk7Ci0gICAgaWYgKCFyc2MtPnNldHVwQ2hlY2soKSkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIHNtLT5yZW5kZXJSYW5nZShyc2MsIHN0YXJ0LCBsZW4pOworICAgIGludDY0X3QgbCA9IHNjLT5tRW52aXJvbWVudC5tTGFzdER0VGltZTsKKyAgICBzYy0+bUVudmlyb21lbnQubUxhc3REdFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7CisgICAgcmV0dXJuICgoZmxvYXQpKHNjLT5tRW52aXJvbWVudC5tTGFzdER0VGltZSAtIGwpKSAvIDEuMGU5OwogfQogCiAKQEAgLTg2MCw1MzEgKzIwMSwyNzkgQEAKIC8vCiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KIAotc3RhdGljIHZvaWQgU0NfY29sb3IoZmxvYXQgciwgZmxvYXQgZywgZmxvYXQgYiwgZmxvYXQgYSkKK3N0YXRpYyB1aW50MzJfdCBTQ19hbGxvY0dldERpbVgoUnNBbGxvY2F0aW9uIHZhKQogewogICAgIEdFVF9UTFMoKTsKLSAgICByc2MtPm1TdGF0ZVZlcnRleC5jb2xvclswXSA9IHI7Ci0gICAgcnNjLT5tU3RhdGVWZXJ0ZXguY29sb3JbMV0gPSBnOwotICAgIHJzYy0+bVN0YXRlVmVydGV4LmNvbG9yWzJdID0gYjsKLSAgICByc2MtPm1TdGF0ZVZlcnRleC5jb2xvclszXSA9IGE7Ci0gICAgaWYgKCFyc2MtPmNoZWNrVmVyc2lvbjJfMCgpKSB7Ci0gICAgICAgIGdsQ29sb3I0ZihyLCBnLCBiLCBhKTsKLSAgICB9CisgICAgY29uc3QgQWxsb2NhdGlvbiAqYSA9IHN0YXRpY19jYXN0PGNvbnN0IEFsbG9jYXRpb24gKj4odmEpOworICAgIC8vTE9HRSgiU0NfYWxsb2NHZXREaW1YIGE9JXAiLCBhKTsKKyAgICAvL0xPR0UoIiB0eXBlPSVwIiwgYS0+Z2V0VHlwZSgpKTsKKyAgICByZXR1cm4gYS0+Z2V0VHlwZSgpLT5nZXREaW1YKCk7CiB9CiAKLXN0YXRpYyB2b2lkIFNDX2FtYmllbnQoZmxvYXQgciwgZmxvYXQgZywgZmxvYXQgYiwgZmxvYXQgYSkKLXsKLSAgICBHTGZsb2F0IHBhcmFtc1tdID0geyByLCBnLCBiLCBhIH07Ci0gICAgZ2xNYXRlcmlhbGZ2KEdMX0ZST05UX0FORF9CQUNLLCBHTF9BTUJJRU5ULCBwYXJhbXMpOwotfQotCi1zdGF0aWMgdm9pZCBTQ19kaWZmdXNlKGZsb2F0IHIsIGZsb2F0IGcsIGZsb2F0IGIsIGZsb2F0IGEpCi17Ci0gICAgR0xmbG9hdCBwYXJhbXNbXSA9IHsgciwgZywgYiwgYSB9OwotICAgIGdsTWF0ZXJpYWxmdihHTF9GUk9OVF9BTkRfQkFDSywgR0xfRElGRlVTRSwgcGFyYW1zKTsKLX0KLQotc3RhdGljIHZvaWQgU0Nfc3BlY3VsYXIoZmxvYXQgciwgZmxvYXQgZywgZmxvYXQgYiwgZmxvYXQgYSkKLXsKLSAgICBHTGZsb2F0IHBhcmFtc1tdID0geyByLCBnLCBiLCBhIH07Ci0gICAgZ2xNYXRlcmlhbGZ2KEdMX0ZST05UX0FORF9CQUNLLCBHTF9TUEVDVUxBUiwgcGFyYW1zKTsKLX0KLQotc3RhdGljIHZvaWQgU0NfZW1pc3Npb24oZmxvYXQgciwgZmxvYXQgZywgZmxvYXQgYiwgZmxvYXQgYSkKLXsKLSAgICBHTGZsb2F0IHBhcmFtc1tdID0geyByLCBnLCBiLCBhIH07Ci0gICAgZ2xNYXRlcmlhbGZ2KEdMX0ZST05UX0FORF9CQUNLLCBHTF9FTUlTU0lPTiwgcGFyYW1zKTsKLX0KLQotc3RhdGljIHZvaWQgU0Nfc2hpbmluZXNzKGZsb2F0IHMpCi17Ci0gICAgZ2xNYXRlcmlhbGYoR0xfRlJPTlRfQU5EX0JBQ0ssIEdMX1NISU5JTkVTUywgcyk7Ci19Ci0KLXN0YXRpYyB2b2lkIFNDX3BvaW50QXR0ZW51YXRpb24oZmxvYXQgYSwgZmxvYXQgYiwgZmxvYXQgYykKLXsKLSAgICBHTGZsb2F0IHBhcmFtc1tdID0geyBhLCBiLCBjIH07Ci0gICAgZ2xQb2ludFBhcmFtZXRlcmZ2KEdMX1BPSU5UX0RJU1RBTkNFX0FUVEVOVUFUSU9OLCBwYXJhbXMpOwotfQotCi1zdGF0aWMgdm9pZCBTQ19oc2JUb1JnYihmbG9hdCBoLCBmbG9hdCBzLCBmbG9hdCBiLCBmbG9hdCogcmdiKQotewotICAgIGZsb2F0IHJlZCA9IDAuMGY7Ci0gICAgZmxvYXQgZ3JlZW4gPSAwLjBmOwotICAgIGZsb2F0IGJsdWUgPSAwLjBmOwotCi0gICAgZmxvYXQgeCA9IGg7Ci0gICAgZmxvYXQgeSA9IHM7Ci0gICAgZmxvYXQgeiA9IGI7Ci0KLSAgICBmbG9hdCBoZiA9ICh4IC0gKGludCkgeCkgKiA2LjBmOwotICAgIGludCBpaGYgPSAoaW50KSBoZjsKLSAgICBmbG9hdCBmID0gaGYgLSBpaGY7Ci0gICAgZmxvYXQgcHYgPSB6ICogKDEuMGYgLSB5KTsKLSAgICBmbG9hdCBxdiA9IHogKiAoMS4wZiAtIHkgKiBmKTsKLSAgICBmbG9hdCB0diA9IHogKiAoMS4wZiAtIHkgKiAoMS4wZiAtIGYpKTsKLQotICAgIHN3aXRjaCAoaWhmKSB7Ci0gICAgICAgIGNhc2UgMDogICAgICAgICAvLyBSZWQgaXMgdGhlIGRvbWluYW50IGNvbG9yCi0gICAgICAgICAgICByZWQgPSB6OwotICAgICAgICAgICAgZ3JlZW4gPSB0djsKLSAgICAgICAgICAgIGJsdWUgPSBwdjsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDE6ICAgICAgICAgLy8gR3JlZW4gaXMgdGhlIGRvbWluYW50IGNvbG9yCi0gICAgICAgICAgICByZWQgPSBxdjsKLSAgICAgICAgICAgIGdyZWVuID0gejsKLSAgICAgICAgICAgIGJsdWUgPSBwdjsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDI6Ci0gICAgICAgICAgICByZWQgPSBwdjsKLSAgICAgICAgICAgIGdyZWVuID0gejsKLSAgICAgICAgICAgIGJsdWUgPSB0djsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDM6ICAgICAgICAgLy8gQmx1ZSBpcyB0aGUgZG9taW5hbnQgY29sb3IKLSAgICAgICAgICAgIHJlZCA9IHB2OwotICAgICAgICAgICAgZ3JlZW4gPSBxdjsKLSAgICAgICAgICAgIGJsdWUgPSB6OwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgNDoKLSAgICAgICAgICAgIHJlZCA9IHR2OwotICAgICAgICAgICAgZ3JlZW4gPSBwdjsKLSAgICAgICAgICAgIGJsdWUgPSB6OwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgNTogICAgICAgICAvLyBSZWQgaXMgdGhlIGRvbWluYW50IGNvbG9yCi0gICAgICAgICAgICByZWQgPSB6OwotICAgICAgICAgICAgZ3JlZW4gPSBwdjsKLSAgICAgICAgICAgIGJsdWUgPSBxdjsKLSAgICAgICAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIHJnYlswXSA9IHJlZDsKLSAgICByZ2JbMV0gPSBncmVlbjsKLSAgICByZ2JbMl0gPSBibHVlOwotfQotCi1zdGF0aWMgaW50IFNDX2hzYlRvQWJncihmbG9hdCBoLCBmbG9hdCBzLCBmbG9hdCBiLCBmbG9hdCBhKQotewotICAgIGZsb2F0IHJnYlszXTsKLSAgICBTQ19oc2JUb1JnYihoLCBzLCBiLCByZ2IpOwotICAgIHJldHVybiBpbnQoYSAgICAgICogMjU1LjBmKSA8PCAyNCB8Ci0gICAgICAgICAgIGludChyZ2JbMl0gKiAyNTUuMGYpIDw8IDE2IHwKLSAgICAgICAgICAgaW50KHJnYlsxXSAqIDI1NS4wZikgPDwgIDggfAotICAgICAgICAgICBpbnQocmdiWzBdICogMjU1LjBmKTsKLX0KLQotc3RhdGljIHZvaWQgU0NfaHNiKGZsb2F0IGgsIGZsb2F0IHMsIGZsb2F0IGIsIGZsb2F0IGEpCitzdGF0aWMgdWludDMyX3QgU0NfYWxsb2NHZXREaW1ZKFJzQWxsb2NhdGlvbiB2YSkKIHsKICAgICBHRVRfVExTKCk7Ci0gICAgZmxvYXQgcmdiWzNdOwotICAgIFNDX2hzYlRvUmdiKGgsIHMsIGIsIHJnYik7Ci0gICAgaWYgKHJzYy0+Y2hlY2tWZXJzaW9uMl8wKCkpIHsKLSAgICAgICAgZ2xWZXJ0ZXhBdHRyaWI0ZigxLCByZ2JbMF0sIHJnYlsxXSwgcmdiWzJdLCBhKTsKLSAgICB9IGVsc2UgewotICAgICAgICBnbENvbG9yNGYocmdiWzBdLCByZ2JbMV0sIHJnYlsyXSwgYSk7Ci0gICAgfQorICAgIGNvbnN0IEFsbG9jYXRpb24gKmEgPSBzdGF0aWNfY2FzdDxjb25zdCBBbGxvY2F0aW9uICo+KHZhKTsKKyAgICByZXR1cm4gYS0+Z2V0VHlwZSgpLT5nZXREaW1ZKCk7CiB9CiAKLXN0YXRpYyB2b2lkIFNDX3VwbG9hZFRvVGV4dHVyZShSc0FsbG9jYXRpb24gdmEsIHVpbnQzMl90IGJhc2VNaXBMZXZlbCkKK3N0YXRpYyB1aW50MzJfdCBTQ19hbGxvY0dldERpbVooUnNBbGxvY2F0aW9uIHZhKQogewogICAgIEdFVF9UTFMoKTsKLSAgICByc2lfQWxsb2NhdGlvblVwbG9hZFRvVGV4dHVyZShyc2MsIHZhLCBmYWxzZSwgYmFzZU1pcExldmVsKTsKKyAgICBjb25zdCBBbGxvY2F0aW9uICphID0gc3RhdGljX2Nhc3Q8Y29uc3QgQWxsb2NhdGlvbiAqPih2YSk7CisgICAgcmV0dXJuIGEtPmdldFR5cGUoKS0+Z2V0RGltWigpOwogfQogCi1zdGF0aWMgdm9pZCBTQ191cGxvYWRUb0J1ZmZlck9iamVjdChSc0FsbG9jYXRpb24gdmEpCitzdGF0aWMgdWludDMyX3QgU0NfYWxsb2NHZXREaW1MT0QoUnNBbGxvY2F0aW9uIHZhKQogewogICAgIEdFVF9UTFMoKTsKLSAgICByc2lfQWxsb2NhdGlvblVwbG9hZFRvQnVmZmVyT2JqZWN0KHJzYywgdmEpOworICAgIGNvbnN0IEFsbG9jYXRpb24gKmEgPSBzdGF0aWNfY2FzdDxjb25zdCBBbGxvY2F0aW9uICo+KHZhKTsKKyAgICByZXR1cm4gYS0+Z2V0VHlwZSgpLT5nZXREaW1MT0QoKTsKIH0KIAotc3RhdGljIHZvaWQgU0Nfc3luY1RvR0woUnNBbGxvY2F0aW9uIHZhKQorc3RhdGljIHVpbnQzMl90IFNDX2FsbG9jR2V0RGltRmFjZXMoUnNBbGxvY2F0aW9uIHZhKQogewogICAgIEdFVF9UTFMoKTsKLSAgICBBbGxvY2F0aW9uICphID0gc3RhdGljX2Nhc3Q8QWxsb2NhdGlvbiAqPih2YSk7Ci0KKyAgICBjb25zdCBBbGxvY2F0aW9uICphID0gc3RhdGljX2Nhc3Q8Y29uc3QgQWxsb2NhdGlvbiAqPih2YSk7CisgICAgcmV0dXJuIGEtPmdldFR5cGUoKS0+Z2V0RGltRmFjZXMoKTsKIH0KIAotc3RhdGljIHZvaWQgU0NfQ2xlYXJDb2xvcihmbG9hdCByLCBmbG9hdCBnLCBmbG9hdCBiLCBmbG9hdCBhKQorc3RhdGljIGNvbnN0IHZvaWQgKiBTQ19nZXRFbGVtZW50QXRYKFJzQWxsb2NhdGlvbiB2YSwgdWludDMyX3QgeCkKIHsKLSAgICAvL0xPR0UoImMgJWYgJWYgJWYgJWYiLCByLCBnLCBiLCBhKTsKLSAgICBHRVRfVExTKCk7Ci0gICAgc2MtPm1FbnZpcm9tZW50Lm1DbGVhckNvbG9yWzBdID0gcjsKLSAgICBzYy0+bUVudmlyb21lbnQubUNsZWFyQ29sb3JbMV0gPSBnOwotICAgIHNjLT5tRW52aXJvbWVudC5tQ2xlYXJDb2xvclsyXSA9IGI7Ci0gICAgc2MtPm1FbnZpcm9tZW50Lm1DbGVhckNvbG9yWzNdID0gYTsKKyAgICBjb25zdCBBbGxvY2F0aW9uICphID0gc3RhdGljX2Nhc3Q8Y29uc3QgQWxsb2NhdGlvbiAqPih2YSk7CisgICAgY29uc3QgVHlwZSAqdCA9IGEtPmdldFR5cGUoKTsKKyAgICBjb25zdCB1aW50OF90ICpwID0gKGNvbnN0IHVpbnQ4X3QgKilhLT5nZXRQdHIoKTsKKyAgICByZXR1cm4gJnBbdC0+Z2V0RWxlbWVudFNpemVCeXRlcygpICogeF07CiB9CiAKLXN0YXRpYyB2b2lkIFNDX2RlYnVnRihjb25zdCBjaGFyICpzLCBmbG9hdCBmKQorc3RhdGljIGNvbnN0IHZvaWQgKiBTQ19nZXRFbGVtZW50QXRYWShSc0FsbG9jYXRpb24gdmEsIHVpbnQzMl90IHgsIHVpbnQzMl90IHkpCiB7Ci0gICAgTE9HRSgiJXMgJWYiLCBzLCBmKTsKKyAgICBjb25zdCBBbGxvY2F0aW9uICphID0gc3RhdGljX2Nhc3Q8Y29uc3QgQWxsb2NhdGlvbiAqPih2YSk7CisgICAgY29uc3QgVHlwZSAqdCA9IGEtPmdldFR5cGUoKTsKKyAgICBjb25zdCB1aW50OF90ICpwID0gKGNvbnN0IHVpbnQ4X3QgKilhLT5nZXRQdHIoKTsKKyAgICByZXR1cm4gJnBbdC0+Z2V0RWxlbWVudFNpemVCeXRlcygpICogKHggKyB5KnQtPmdldERpbVgoKSldOwogfQogCi1zdGF0aWMgdm9pZCBTQ19kZWJ1Z0hleEYoY29uc3QgY2hhciAqcywgZmxvYXQgZikKK3N0YXRpYyBjb25zdCB2b2lkICogU0NfZ2V0RWxlbWVudEF0WFlaKFJzQWxsb2NhdGlvbiB2YSwgdWludDMyX3QgeCwgdWludDMyX3QgeSwgdWludDMyX3QgeikKIHsKLSAgICBMT0dFKCIlcyAweCV4IiwgcywgKigoaW50ICopICgmZikpKTsKKyAgICBjb25zdCBBbGxvY2F0aW9uICphID0gc3RhdGljX2Nhc3Q8Y29uc3QgQWxsb2NhdGlvbiAqPih2YSk7CisgICAgY29uc3QgVHlwZSAqdCA9IGEtPmdldFR5cGUoKTsKKyAgICBjb25zdCB1aW50OF90ICpwID0gKGNvbnN0IHVpbnQ4X3QgKilhLT5nZXRQdHIoKTsKKyAgICByZXR1cm4gJnBbdC0+Z2V0RWxlbWVudFNpemVCeXRlcygpICogKHggKyB5KnQtPmdldERpbVgoKSldOwogfQogCi1zdGF0aWMgdm9pZCBTQ19kZWJ1Z0kzMihjb25zdCBjaGFyICpzLCBpbnQzMl90IGkpCi17Ci0gICAgTE9HRSgiJXMgJWkiLCBzLCBpKTsKK3N0YXRpYyB2b2lkIFNDX3NldE9iamVjdCh2b2lkICoqdmRzdCwgdm9pZCAqIHZzcmMpIHsKKyAgICBzdGF0aWNfY2FzdDxPYmplY3RCYXNlICo+KHZzcmMpLT5pbmNTeXNSZWYoKTsKKyAgICBzdGF0aWNfY2FzdDxPYmplY3RCYXNlICo+KHZkc3RbMF0pLT5kZWNTeXNSZWYoKTsKKyAgICAqdmRzdCA9IHZzcmM7Cit9CitzdGF0aWMgdm9pZCBTQ19jbGVhck9iamVjdCh2b2lkICoqdmRzdCkgeworICAgIHN0YXRpY19jYXN0PE9iamVjdEJhc2UgKj4odmRzdFswXSktPmRlY1N5c1JlZigpOworICAgICp2ZHN0ID0gTlVMTDsKK30KK3N0YXRpYyBib29sIFNDX2lzT2JqZWN0KFJzQWxsb2NhdGlvbiB2c3JjKSB7CisgICAgcmV0dXJuIHZzcmMgIT0gTlVMTDsKIH0KIAotc3RhdGljIHZvaWQgU0NfZGVidWdIZXhJMzIoY29uc3QgY2hhciAqcywgaW50MzJfdCBpKQotewotICAgIExPR0UoIiVzIDB4JXgiLCBzLCBpKTsKKworCitzdGF0aWMgdm9pZCBTQ19kZWJ1Z0YoY29uc3QgY2hhciAqcywgZmxvYXQgZikgeworICAgIExPR0UoIiVzICVmLCAweCUwOHgiLCBzLCBmLCAqKChpbnQgKikgKCZmKSkpOworfQorc3RhdGljIHZvaWQgU0NfZGVidWdGdjIoY29uc3QgY2hhciAqcywgZmxvYXQgZjEsIGZsb2F0IGYyKSB7CisgICAgTE9HRSgiJXMgeyVmLCAlZn0iLCBzLCBmMSwgZjIpOworfQorc3RhdGljIHZvaWQgU0NfZGVidWdGdjMoY29uc3QgY2hhciAqcywgZmxvYXQgZjEsIGZsb2F0IGYyLCBmbG9hdCBmMykgeworICAgIExPR0UoIiVzIHslZiwgJWYsICVmfSIsIHMsIGYxLCBmMiwgZjMpOworfQorc3RhdGljIHZvaWQgU0NfZGVidWdGdjQoY29uc3QgY2hhciAqcywgZmxvYXQgZjEsIGZsb2F0IGYyLCBmbG9hdCBmMywgZmxvYXQgZjQpIHsKKyAgICBMT0dFKCIlcyB7JWYsICVmLCAlZiwgJWZ9IiwgcywgZjEsIGYyLCBmMywgZjQpOworfQorc3RhdGljIHZvaWQgU0NfZGVidWdGTTR2NChjb25zdCBjaGFyICpzLCBjb25zdCBmbG9hdCAqZikgeworICAgIExPR0UoIiVzIHslZiwgJWYsICVmLCAlZiIsIHMsIGZbMF0sIGZbNF0sIGZbOF0sIGZbMTJdKTsKKyAgICBMT0dFKCIlcyAgJWYsICVmLCAlZiwgJWYiLCBzLCBmWzFdLCBmWzVdLCBmWzldLCBmWzEzXSk7CisgICAgTE9HRSgiJXMgICVmLCAlZiwgJWYsICVmIiwgcywgZlsyXSwgZls2XSwgZlsxMF0sIGZbMTRdKTsKKyAgICBMT0dFKCIlcyAgJWYsICVmLCAlZiwgJWZ9IiwgcywgZlszXSwgZls3XSwgZlsxMV0sIGZbMTVdKTsKK30KK3N0YXRpYyB2b2lkIFNDX2RlYnVnRk0zdjMoY29uc3QgY2hhciAqcywgY29uc3QgZmxvYXQgKmYpIHsKKyAgICBMT0dFKCIlcyB7JWYsICVmLCAlZiIsIHMsIGZbMF0sIGZbM10sIGZbNl0pOworICAgIExPR0UoIiVzICAlZiwgJWYsICVmIiwgcywgZlsxXSwgZls0XSwgZls3XSk7CisgICAgTE9HRSgiJXMgICVmLCAlZiwgJWZ9IixzLCBmWzJdLCBmWzVdLCBmWzhdKTsKK30KK3N0YXRpYyB2b2lkIFNDX2RlYnVnRk0ydjIoY29uc3QgY2hhciAqcywgY29uc3QgZmxvYXQgKmYpIHsKKyAgICBMT0dFKCIlcyB7JWYsICVmIiwgcywgZlswXSwgZlsyXSk7CisgICAgTE9HRSgiJXMgICVmLCAlZn0iLHMsIGZbMV0sIGZbM10pOwogfQogCi1zdGF0aWMgdWludDMyX3QgU0NfZ2V0V2lkdGgoKQorc3RhdGljIHZvaWQgU0NfZGVidWdJMzIoY29uc3QgY2hhciAqcywgaW50MzJfdCBpKSB7CisgICAgTE9HRSgiJXMgJWkgIDB4JXgiLCBzLCBpLCBpKTsKK30KK3N0YXRpYyB2b2lkIFNDX2RlYnVnVTMyKGNvbnN0IGNoYXIgKnMsIHVpbnQzMl90IGkpIHsKKyAgICBMT0dFKCIlcyAlaSAgMHgleCIsIHMsIGksIGkpOworfQorCitzdGF0aWMgdm9pZCBTQ19kZWJ1Z1AoY29uc3QgY2hhciAqcywgY29uc3Qgdm9pZCAqcCkgeworICAgIExPR0UoIiVzICVwIiwgcywgcCk7Cit9CisKK3N0YXRpYyB1aW50MzJfdCBTQ190b0NsaWVudDIoaW50IGNtZElELCB2b2lkICpkYXRhLCBpbnQgbGVuKQogewogICAgIEdFVF9UTFMoKTsKLSAgICByZXR1cm4gcnNjLT5nZXRXaWR0aCgpOworICAgIC8vTE9HRSgiU0NfdG9DbGllbnQgJWkgJWkgJWkiLCBjbWRJRCwgbGVuKTsKKyAgICByZXR1cm4gcnNjLT5zZW5kTWVzc2FnZVRvQ2xpZW50KGRhdGEsIGNtZElELCBsZW4sIGZhbHNlKTsKIH0KIAotc3RhdGljIHVpbnQzMl90IFNDX2dldEhlaWdodCgpCitzdGF0aWMgdWludDMyX3QgU0NfdG9DbGllbnQoaW50IGNtZElEKQogewogICAgIEdFVF9UTFMoKTsKLSAgICByZXR1cm4gcnNjLT5nZXRIZWlnaHQoKTsKKyAgICAvL0xPR0UoIlNDX3RvQ2xpZW50ICVpIiwgY21kSUQpOworICAgIHJldHVybiByc2MtPnNlbmRNZXNzYWdlVG9DbGllbnQoTlVMTCwgY21kSUQsIDAsIGZhbHNlKTsKIH0KIAotc3RhdGljIHVpbnQzMl90IFNDX2NvbG9yRmxvYXRSR0JBdG9VTm9ybTgoZmxvYXQgciwgZmxvYXQgZywgZmxvYXQgYiwgZmxvYXQgYSkKLXsKLSAgICB1aW50MzJfdCBjID0gMDsKLSAgICBjIHw9ICh1aW50MzJfdCkociAqIDI1NS5mICsgMC41Zik7Ci0gICAgYyB8PSAoKHVpbnQzMl90KShnICogMjU1LmYgKyAwLjVmKSkgPDwgODsKLSAgICBjIHw9ICgodWludDMyX3QpKGIgKiAyNTUuZiArIDAuNWYpKSA8PCAxNjsKLSAgICBjIHw9ICgodWludDMyX3QpKGEgKiAyNTUuZiArIDAuNWYpKSA8PCAyNDsKLSAgICByZXR1cm4gYzsKLX0KLQotc3RhdGljIHVpbnQzMl90IFNDX2NvbG9yRmxvYXRSR0JBdG81NjUoZmxvYXQgciwgZmxvYXQgZywgZmxvYXQgYikKLXsKLSAgICB1aW50MzJfdCBpciA9ICh1aW50MzJfdCkociAqIDI1NS5mICsgMC41Zik7Ci0gICAgdWludDMyX3QgaWcgPSAodWludDMyX3QpKGcgKiAyNTUuZiArIDAuNWYpOwotICAgIHVpbnQzMl90IGliID0gKHVpbnQzMl90KShiICogMjU1LmYgKyAwLjVmKTsKLSAgICByZXR1cm4gcnM4ODh0bzU2NShpciwgaWcsIGliKTsKLX0KLQotc3RhdGljIHVpbnQzMl90IFNDX3RvQ2xpZW50KHZvaWQgKmRhdGEsIGludCBjbWRJRCwgaW50IGxlbiwgaW50IHdhaXRGb3JTcGFjZSkKK3N0YXRpYyB1aW50MzJfdCBTQ190b0NsaWVudEJsb2NraW5nMihpbnQgY21kSUQsIHZvaWQgKmRhdGEsIGludCBsZW4pCiB7CiAgICAgR0VUX1RMUygpOwotICAgIHJldHVybiByc2MtPnNlbmRNZXNzYWdlVG9DbGllbnQoZGF0YSwgY21kSUQsIGxlbiwgd2FpdEZvclNwYWNlICE9IDApOworICAgIC8vTE9HRSgiU0NfdG9DbGllbnRCbG9ja2luZyAlaSAlaSIsIGNtZElELCBsZW4pOworICAgIHJldHVybiByc2MtPnNlbmRNZXNzYWdlVG9DbGllbnQoZGF0YSwgY21kSUQsIGxlbiwgdHJ1ZSk7CiB9CiAKLXN0YXRpYyB2b2lkIFNDX3NjcmlwdENhbGwoaW50IHNjcmlwdElEKQorc3RhdGljIHVpbnQzMl90IFNDX3RvQ2xpZW50QmxvY2tpbmcoaW50IGNtZElEKQogewogICAgIEdFVF9UTFMoKTsKLSAgICByc2MtPnJ1blNjcmlwdCgoU2NyaXB0ICopc2NyaXB0SUQsIDApOworICAgIC8vTE9HRSgiU0NfdG9DbGllbnRCbG9ja2luZyAlaSIsIGNtZElEKTsKKyAgICByZXR1cm4gcnNjLT5zZW5kTWVzc2FnZVRvQ2xpZW50KE5VTEwsIGNtZElELCAwLCB0cnVlKTsKIH0KIAoraW50IFNDX2RpdnNpMyhpbnQgYSwgaW50IGIpCit7CisgICAgcmV0dXJuIGEgLyBiOworfQorCitpbnQgU0NfZ2V0QWxsb2NhdGlvbihjb25zdCB2b2lkICpwdHIpCit7CisgICAgR0VUX1RMUygpOworICAgIGNvbnN0IEFsbG9jYXRpb24gKmFsbG9jID0gc2MtPnB0clRvQWxsb2NhdGlvbihwdHIpOworICAgIHJldHVybiAoaW50KWFsbG9jOworfQorCit2b2lkIFNDX2FsbG9jYXRpb25NYXJrRGlydHkoUnNBbGxvY2F0aW9uIGEpCit7CisgICAgQWxsb2NhdGlvbiAqYWxsb2MgPSBzdGF0aWNfY2FzdDxBbGxvY2F0aW9uICo+KGEpOworICAgIGFsbG9jLT5zZW5kRGlydHkoKTsKK30KKwordm9pZCBTQ19Gb3JFYWNoKFJzU2NyaXB0IHZzLAorICAgICAgICAgICAgICAgIFJzQWxsb2NhdGlvbiB2aW4sCisgICAgICAgICAgICAgICAgUnNBbGxvY2F0aW9uIHZvdXQsCisgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCAqdXNyKQoreworICAgIEdFVF9UTFMoKTsKKyAgICBjb25zdCBBbGxvY2F0aW9uICphaW4gPSBzdGF0aWNfY2FzdDxjb25zdCBBbGxvY2F0aW9uICo+KHZpbik7CisgICAgQWxsb2NhdGlvbiAqYW91dCA9IHN0YXRpY19jYXN0PEFsbG9jYXRpb24gKj4odm91dCk7CisgICAgU2NyaXB0ICpzID0gc3RhdGljX2Nhc3Q8U2NyaXB0ICo+KHZzKTsKKyAgICBzLT5ydW5Gb3JFYWNoKHJzYywgYWluLCBhb3V0LCB1c3IpOworfQorCit2b2lkIFNDX0ZvckVhY2gyKFJzU2NyaXB0IHZzLAorICAgICAgICAgICAgICAgIFJzQWxsb2NhdGlvbiB2aW4sCisgICAgICAgICAgICAgICAgUnNBbGxvY2F0aW9uIHZvdXQsCisgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCAqdXNyLAorICAgICAgICAgICAgICAgIGNvbnN0IFJzU2NyaXB0Q2FsbCAqY2FsbCkKK3sKKyAgICBHRVRfVExTKCk7CisgICAgY29uc3QgQWxsb2NhdGlvbiAqYWluID0gc3RhdGljX2Nhc3Q8Y29uc3QgQWxsb2NhdGlvbiAqPih2aW4pOworICAgIEFsbG9jYXRpb24gKmFvdXQgPSBzdGF0aWNfY2FzdDxBbGxvY2F0aW9uICo+KHZvdXQpOworICAgIFNjcmlwdCAqcyA9IHN0YXRpY19jYXN0PFNjcmlwdCAqPih2cyk7CisgICAgcy0+cnVuRm9yRWFjaChyc2MsIGFpbiwgYW91dCwgdXNyLCBjYWxsKTsKK30KIAogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAvLyBDbGFzcyBpbXBsZW1lbnRhdGlvbgogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAKLVNjcmlwdENTdGF0ZTo6U3ltYm9sVGFibGVfdCBTY3JpcHRDU3RhdGU6OmdTeW1zW10gPSB7Ci0gICAgLy8gSU8KLSAgICB7ICJsb2FkSTMyIiwgKHZvaWQgKikmU0NfbG9hZEkzMiwKLSAgICAgICAgImludCIsICIoaW50LCBpbnQpIiB9LAotICAgIC8veyAibG9hZFUzMiIsICh2b2lkICopJlNDX2xvYWRVMzIsICJ1bnNpZ25lZCBpbnQiLCAiKGludCwgaW50KSIgfSwKLSAgICB7ICJsb2FkRiIsICh2b2lkICopJlNDX2xvYWRGLAotICAgICAgICAiZmxvYXQiLCAiKGludCwgaW50KSIgfSwKLSAgICB7ICJsb2FkQXJyYXlGIiwgKHZvaWQgKikmU0NfbG9hZEFycmF5RiwKLSAgICAgICAgImZsb2F0KiIsICIoaW50LCBpbnQpIiB9LAotICAgIHsgImxvYWRBcnJheUkzMiIsICh2b2lkICopJlNDX2xvYWRBcnJheUkzMiwKLSAgICAgICAgImludCoiLCAiKGludCwgaW50KSIgfSwKLSAgICB7ICJsb2FkVmVjNCIsICh2b2lkICopJlNDX2xvYWRWZWM0LAotICAgICAgICAidm9pZCIsICIoaW50LCBpbnQsIGZsb2F0ICopIiB9LAotICAgIHsgImxvYWRNYXRyaXgiLCAodm9pZCAqKSZTQ19sb2FkTWF0cml4LAotICAgICAgICAidm9pZCIsICIoaW50LCBpbnQsIGZsb2F0ICopIiB9LAotICAgIHsgInN0b3JlSTMyIiwgKHZvaWQgKikmU0Nfc3RvcmVJMzIsCi0gICAgICAgICJ2b2lkIiwgIihpbnQsIGludCwgaW50KSIgfSwKLSAgICAvL3sgInN0b3JlVTMyIiwgKHZvaWQgKikmU0Nfc3RvcmVVMzIsICJ2b2lkIiwgIihpbnQsIGludCwgdW5zaWduZWQgaW50KSIgfSwKLSAgICB7ICJzdG9yZUYiLCAodm9pZCAqKSZTQ19zdG9yZUYsCi0gICAgICAgICJ2b2lkIiwgIihpbnQsIGludCwgZmxvYXQpIiB9LAotICAgIHsgInN0b3JlVmVjNCIsICh2b2lkICopJlNDX3N0b3JlVmVjNCwKLSAgICAgICAgInZvaWQiLCAiKGludCwgaW50LCBmbG9hdCAqKSIgfSwKLSAgICB7ICJzdG9yZU1hdHJpeCIsICh2b2lkICopJlNDX3N0b3JlTWF0cml4LAotICAgICAgICAidm9pZCIsICIoaW50LCBpbnQsIGZsb2F0ICopIiB9LAotICAgIHsgImxvYWRTaW1wbGVNZXNoVmVydGljZXNGIiwgKHZvaWQgKikmU0NfbG9hZFNpbXBsZU1lc2hWZXJ0aWNlc0YsCi0gICAgICAgICJmbG9hdCoiLCAiKGludCwgaW50KSIgfSwKLSAgICB7ICJ1cGRhdGVTaW1wbGVNZXNoIiwgKHZvaWQgKikmU0NfdXBkYXRlU2ltcGxlTWVzaCwKLSAgICAgICAgInZvaWQiLCAiKGludCkiIH0sCisvLyBsbHZtIG5hbWUgbWFuZ2xpbmcgcmVmCisvLyAgPGJ1aWx0aW4tdHlwZT4gOjo9IHYgICMgdm9pZAorLy8gICAgICAgICAgICAgICAgIDo6PSBiICAjIGJvb2wKKy8vICAgICAgICAgICAgICAgICA6Oj0gYyAgIyBjaGFyCisvLyAgICAgICAgICAgICAgICAgOjo9IGEgICMgc2lnbmVkIGNoYXIKKy8vICAgICAgICAgICAgICAgICA6Oj0gaCAgIyB1bnNpZ25lZCBjaGFyCisvLyAgICAgICAgICAgICAgICAgOjo9IHMgICMgc2hvcnQKKy8vICAgICAgICAgICAgICAgICA6Oj0gdCAgIyB1bnNpZ25lZCBzaG9ydAorLy8gICAgICAgICAgICAgICAgIDo6PSBpICAjIGludAorLy8gICAgICAgICAgICAgICAgIDo6PSBqICAjIHVuc2lnbmVkIGludAorLy8gICAgICAgICAgICAgICAgIDo6PSBsICAjIGxvbmcKKy8vICAgICAgICAgICAgICAgICA6Oj0gbSAgIyB1bnNpZ25lZCBsb25nCisvLyAgICAgICAgICAgICAgICAgOjo9IHggICMgbG9uZyBsb25nLCBfX2ludDY0CisvLyAgICAgICAgICAgICAgICAgOjo9IHkgICMgdW5zaWduZWQgbG9uZyBsb25nLCBfX2ludDY0CisvLyAgICAgICAgICAgICAgICAgOjo9IGYgICMgZmxvYXQKKy8vICAgICAgICAgICAgICAgICA6Oj0gZCAgIyBkb3VibGUKIAotICAgIC8vIG1hdGgKLSAgICB7ICJtb2RmIiwgKHZvaWQgKikmZm1vZCwKLSAgICAgICAgImZsb2F0IiwgIihmbG9hdCwgZmxvYXQpIiB9LAotICAgIHsgImFicyIsICh2b2lkICopJmFicywKLSAgICAgICAgImludCIsICIoaW50KSIgfSwKLSAgICB7ICJhYnNmIiwgKHZvaWQgKikmZmFic2YsCi0gICAgICAgICJmbG9hdCIsICIoZmxvYXQpIiB9LAotICAgIHsgInNpbmZfZmFzdCIsICh2b2lkICopJlNDX3NpbmZfZmFzdCwKLSAgICAgICAgImZsb2F0IiwgIihmbG9hdCkiIH0sCi0gICAgeyAiY29zZl9mYXN0IiwgKHZvaWQgKikmU0NfY29zZl9mYXN0LAotICAgICAgICAiZmxvYXQiLCAiKGZsb2F0KSIgfSwKLSAgICB7ICJzaW5mIiwgKHZvaWQgKikmc2luZiwKLSAgICAgICAgImZsb2F0IiwgIihmbG9hdCkiIH0sCi0gICAgeyAiY29zZiIsICh2b2lkICopJmNvc2YsCi0gICAgICAgICJmbG9hdCIsICIoZmxvYXQpIiB9LAotICAgIHsgImFzaW5mIiwgKHZvaWQgKikmYXNpbmYsCi0gICAgICAgICJmbG9hdCIsICIoZmxvYXQpIiB9LAotICAgIHsgImFjb3NmIiwgKHZvaWQgKikmYWNvc2YsCi0gICAgICAgICJmbG9hdCIsICIoZmxvYXQpIiB9LAotICAgIHsgImF0YW5mIiwgKHZvaWQgKikmYXRhbmYsCi0gICAgICAgICJmbG9hdCIsICIoZmxvYXQpIiB9LAotICAgIHsgImF0YW4yZiIsICh2b2lkICopJmF0YW4yZiwKLSAgICAgICAgImZsb2F0IiwgIihmbG9hdCwgZmxvYXQpIiB9LAotICAgIHsgImZhYnNmIiwgKHZvaWQgKikmZmFic2YsCi0gICAgICAgICJmbG9hdCIsICIoZmxvYXQpIiB9LAotICAgIHsgInJhbmRmIiwgKHZvaWQgKikmU0NfcmFuZGYsCi0gICAgICAgICJmbG9hdCIsICIoZmxvYXQpIiB9LAotICAgIHsgInJhbmRmMiIsICh2b2lkICopJlNDX3JhbmRmMiwKLSAgICAgICAgImZsb2F0IiwgIihmbG9hdCwgZmxvYXQpIiB9LAotICAgIHsgImZsb29yZiIsICh2b2lkICopJmZsb29yZiwKLSAgICAgICAgImZsb2F0IiwgIihmbG9hdCkiIH0sCi0gICAgeyAiZnJhY2YiLCAodm9pZCAqKSZTQ19mcmFjZiwKLSAgICAgICAgImZsb2F0IiwgIihmbG9hdCkiIH0sCi0gICAgeyAiY2VpbGYiLCAodm9pZCAqKSZjZWlsZiwKLSAgICAgICAgImZsb2F0IiwgIihmbG9hdCkiIH0sCi0gICAgeyAicm91bmRmIiwgKHZvaWQgKikmU0Nfcm91bmRmLAotICAgICAgICAiZmxvYXQiLCAiKGZsb2F0KSIgfSwKLSAgICB7ICJleHBmIiwgKHZvaWQgKikmZXhwZiwKLSAgICAgICAgImZsb2F0IiwgIihmbG9hdCkiIH0sCi0gICAgeyAibG9nZiIsICh2b2lkICopJmxvZ2YsCi0gICAgICAgICJmbG9hdCIsICIoZmxvYXQpIiB9LAotICAgIHsgInBvd2YiLCAodm9pZCAqKSZwb3dmLAotICAgICAgICAiZmxvYXQiLCAiKGZsb2F0LCBmbG9hdCkiIH0sCi0gICAgeyAibWF4ZiIsICh2b2lkICopJlNDX21heGYsCi0gICAgICAgICJmbG9hdCIsICIoZmxvYXQsIGZsb2F0KSIgfSwKLSAgICB7ICJtaW5mIiwgKHZvaWQgKikmU0NfbWluZiwKLSAgICAgICAgImZsb2F0IiwgIihmbG9hdCwgZmxvYXQpIiB9LAotICAgIHsgInNxcnQiLCAodm9pZCAqKSZzcXJ0LAotICAgICAgICAiaW50IiwgIihpbnQpIiB9LAotICAgIHsgInNxcnRmIiwgKHZvaWQgKikmc3FydGYsCi0gICAgICAgICJmbG9hdCIsICIoZmxvYXQpIiB9LAotICAgIHsgInNxciIsICh2b2lkICopJlNDX3NxciwKLSAgICAgICAgImludCIsICIoaW50KSIgfSwKLSAgICB7ICJzcXJmIiwgKHZvaWQgKikmU0Nfc3FyZiwKLSAgICAgICAgImZsb2F0IiwgIihmbG9hdCkiIH0sCi0gICAgeyAic2lnbiIsICh2b2lkICopJlNDX3NpZ24sCi0gICAgICAgICJpbnQiLCAiKGludCkiIH0sCi0gICAgeyAic2lnbmYiLCAodm9pZCAqKSZTQ19zaWduZiwKLSAgICAgICAgImZsb2F0IiwgIihmbG9hdCkiIH0sCi0gICAgeyAiY2xhbXAiLCAodm9pZCAqKSZTQ19jbGFtcCwKLSAgICAgICAgImludCIsICIoaW50LCBpbnQsIGludCkiIH0sCi0gICAgeyAiY2xhbXBmIiwgKHZvaWQgKikmU0NfY2xhbXBmLAotICAgICAgICAiZmxvYXQiLCAiKGZsb2F0LCBmbG9hdCwgZmxvYXQpIiB9LAotICAgIHsgImRpc3RmMiIsICh2b2lkICopJlNDX2Rpc3RmMiwKLSAgICAgICAgImZsb2F0IiwgIihmbG9hdCwgZmxvYXQsIGZsb2F0LCBmbG9hdCkiIH0sCi0gICAgeyAiZGlzdGYzIiwgKHZvaWQgKikmU0NfZGlzdGYzLAotICAgICAgICAiZmxvYXQiLCAiKGZsb2F0LCBmbG9hdCwgZmxvYXQsIGZsb2F0LCBmbG9hdCwgZmxvYXQpIiB9LAotICAgIHsgIm1hZ2YyIiwgKHZvaWQgKikmU0NfbWFnZjIsCi0gICAgICAgICJmbG9hdCIsICIoZmxvYXQsIGZsb2F0KSIgfSwKLSAgICB7ICJtYWdmMyIsICh2b2lkICopJlNDX21hZ2YzLAotICAgICAgICAiZmxvYXQiLCAiKGZsb2F0LCBmbG9hdCwgZmxvYXQpIiB9LAotICAgIHsgInJhZGYiLCAodm9pZCAqKSZTQ19yYWRmLAotICAgICAgICAiZmxvYXQiLCAiKGZsb2F0KSIgfSwKLSAgICB7ICJkZWdmIiwgKHZvaWQgKikmU0NfZGVnZiwKLSAgICAgICAgImZsb2F0IiwgIihmbG9hdCkiIH0sCi0gICAgeyAibGVycGYiLCAodm9pZCAqKSZTQ19sZXJwZiwKLSAgICAgICAgImZsb2F0IiwgIihmbG9hdCwgZmxvYXQsIGZsb2F0KSIgfSwKLSAgICB7ICJub3JtZiIsICh2b2lkICopJlNDX25vcm1mLAotICAgICAgICAiZmxvYXQiLCAiKGZsb2F0LCBmbG9hdCwgZmxvYXQpIiB9LAotICAgIHsgIm1hcGYiLCAodm9pZCAqKSZTQ19tYXBmLAotICAgICAgICAiZmxvYXQiLCAiKGZsb2F0LCBmbG9hdCwgZmxvYXQsIGZsb2F0LCBmbG9hdCkiIH0sCi0gICAgeyAibm9pc2VmIiwgKHZvaWQgKikmU0Nfbm9pc2VmLAotICAgICAgICAiZmxvYXQiLCAiKGZsb2F0KSIgfSwKLSAgICB7ICJub2lzZWYyIiwgKHZvaWQgKikmU0Nfbm9pc2VmMiwKLSAgICAgICAgImZsb2F0IiwgIihmbG9hdCwgZmxvYXQpIiB9LAotICAgIHsgIm5vaXNlZjMiLCAodm9pZCAqKSZTQ19ub2lzZWYzLAotICAgICAgICAiZmxvYXQiLCAiKGZsb2F0LCBmbG9hdCwgZmxvYXQpIiB9LAotICAgIHsgInR1cmJ1bGVuY2VmMiIsICh2b2lkICopJlNDX3R1cmJ1bGVuY2VmMiwKLSAgICAgICAgImZsb2F0IiwgIihmbG9hdCwgZmxvYXQsIGZsb2F0KSIgfSwKLSAgICB7ICJ0dXJidWxlbmNlZjMiLCAodm9pZCAqKSZTQ190dXJidWxlbmNlZjMsCi0gICAgICAgICJmbG9hdCIsICIoZmxvYXQsIGZsb2F0LCBmbG9hdCwgZmxvYXQpIiB9LAorc3RhdGljIFNjcmlwdENTdGF0ZTo6U3ltYm9sVGFibGVfdCBnU3ltc1tdID0geworICAgIHsgIl9fZGl2c2kzIiwgKHZvaWQgKikmU0NfZGl2c2kzIH0sCisKKyAgICAvLyBhbGxvY2F0aW9uCisgICAgeyAiX1oxOXJzQWxsb2NhdGlvbkdldERpbVgxM3JzX2FsbG9jYXRpb24iLCAodm9pZCAqKSZTQ19hbGxvY0dldERpbVggfSwKKyAgICB7ICJfWjE5cnNBbGxvY2F0aW9uR2V0RGltWTEzcnNfYWxsb2NhdGlvbiIsICh2b2lkICopJlNDX2FsbG9jR2V0RGltWSB9LAorICAgIHsgIl9aMTlyc0FsbG9jYXRpb25HZXREaW1aMTNyc19hbGxvY2F0aW9uIiwgKHZvaWQgKikmU0NfYWxsb2NHZXREaW1aIH0sCisgICAgeyAiX1oyMXJzQWxsb2NhdGlvbkdldERpbUxPRDEzcnNfYWxsb2NhdGlvbiIsICh2b2lkICopJlNDX2FsbG9jR2V0RGltTE9EIH0sCisgICAgeyAiX1oyM3JzQWxsb2NhdGlvbkdldERpbUZhY2VzMTNyc19hbGxvY2F0aW9uIiwgKHZvaWQgKikmU0NfYWxsb2NHZXREaW1GYWNlcyB9LAorICAgIHsgIl9aMTVyc0dldEFsbG9jYXRpb25QS3YiLCAodm9pZCAqKSZTQ19nZXRBbGxvY2F0aW9uIH0sCisKKyAgICB7ICJfWjE0cnNHZXRFbGVtZW50QXQxM3JzX2FsbG9jYXRpb25qIiwgKHZvaWQgKikmU0NfZ2V0RWxlbWVudEF0WCB9LAorICAgIHsgIl9aMTRyc0dldEVsZW1lbnRBdDEzcnNfYWxsb2NhdGlvbmpqIiwgKHZvaWQgKikmU0NfZ2V0RWxlbWVudEF0WFkgfSwKKyAgICB7ICJfWjE0cnNHZXRFbGVtZW50QXQxM3JzX2FsbG9jYXRpb25qamoiLCAodm9pZCAqKSZTQ19nZXRFbGVtZW50QXRYWVogfSwKKworICAgIHsgIl9aMTFyc1NldE9iamVjdFAxM3JzX2FsbG9jYXRpb24xM3JzX2FsbG9jYXRpb24iLCAodm9pZCAqKSZTQ19zZXRPYmplY3QgfSwKKyAgICB7ICJfWjEzcnNDbGVhck9iamVjdFAxM3JzX2FsbG9jYXRpb24iLCAodm9pZCAqKSZTQ19jbGVhck9iamVjdCB9LAorICAgIHsgIl9aMTByc0lzT2JqZWN0MTNyc19hbGxvY2F0aW9uIiwgKHZvaWQgKikmU0NfaXNPYmplY3QgfSwKKworICAgIHsgIl9aMjFyc0FsbG9jYXRpb25NYXJrRGlydHkxM3JzX2FsbG9jYXRpb24iLCAodm9pZCAqKSZTQ19hbGxvY2F0aW9uTWFya0RpcnR5IH0sCisKKworICAgIC8vIERlYnVnCisgICAgeyAiX1o3cnNEZWJ1Z1BLY2YiLCAodm9pZCAqKSZTQ19kZWJ1Z0YgfSwKKyAgICB7ICJfWjdyc0RlYnVnUEtjZmYiLCAodm9pZCAqKSZTQ19kZWJ1Z0Z2MiB9LAorICAgIHsgIl9aN3JzRGVidWdQS2NmZmYiLCAodm9pZCAqKSZTQ19kZWJ1Z0Z2MyB9LAorICAgIHsgIl9aN3JzRGVidWdQS2NmZmZmIiwgKHZvaWQgKikmU0NfZGVidWdGdjQgfSwKKyAgICB7ICJfWjdyc0RlYnVnUEtjUEsxMnJzX21hdHJpeDR4NCIsICh2b2lkICopJlNDX2RlYnVnRk00djQgfSwKKyAgICB7ICJfWjdyc0RlYnVnUEtjUEsxMnJzX21hdHJpeDN4MyIsICh2b2lkICopJlNDX2RlYnVnRk0zdjMgfSwKKyAgICB7ICJfWjdyc0RlYnVnUEtjUEsxMnJzX21hdHJpeDJ4MiIsICh2b2lkICopJlNDX2RlYnVnRk0ydjIgfSwKKyAgICB7ICJfWjdyc0RlYnVnUEtjaSIsICh2b2lkICopJlNDX2RlYnVnSTMyIH0sCisgICAgeyAiX1o3cnNEZWJ1Z1BLY2oiLCAodm9pZCAqKSZTQ19kZWJ1Z1UzMiB9LAorICAgIHsgIl9aN3JzRGVidWdQS2NQS3YiLCAodm9pZCAqKSZTQ19kZWJ1Z1AgfSwKKworICAgIC8vIFJTIE1hdGgKKyAgICB7ICJfWjZyc1JhbmRpIiwgKHZvaWQgKikmU0NfcmFuZGkgfSwKKyAgICB7ICJfWjZyc1JhbmRpaSIsICh2b2lkICopJlNDX3JhbmRpMiB9LAorICAgIHsgIl9aNnJzUmFuZGYiLCAodm9pZCAqKSZTQ19yYW5kZiB9LAorICAgIHsgIl9aNnJzUmFuZGZmIiwgKHZvaWQgKikmU0NfcmFuZGYyIH0sCisgICAgeyAiX1o2cnNGcmFjZiIsICh2b2lkICopJlNDX2ZyYWMgfSwKIAogICAgIC8vIHRpbWUKLSAgICB7ICJzZWNvbmQiLCAodm9pZCAqKSZTQ19zZWNvbmQsCi0gICAgICAgICJpbnQiLCAiKCkiIH0sCi0gICAgeyAibWludXRlIiwgKHZvaWQgKikmU0NfbWludXRlLAotICAgICAgICAiaW50IiwgIigpIiB9LAotICAgIHsgImhvdXIiLCAodm9pZCAqKSZTQ19ob3VyLAotICAgICAgICAiaW50IiwgIigpIiB9LAotICAgIHsgImRheSIsICh2b2lkICopJlNDX2RheSwKLSAgICAgICAgImludCIsICIoKSIgfSwKLSAgICB7ICJtb250aCIsICh2b2lkICopJlNDX21vbnRoLAotICAgICAgICAiaW50IiwgIigpIiB9LAotICAgIHsgInllYXIiLCAodm9pZCAqKSZTQ195ZWFyLAotICAgICAgICAiaW50IiwgIigpIiB9LAotICAgIHsgInVwdGltZU1pbGxpcyIsICh2b2lkKikmU0NfdXB0aW1lTWlsbGlzLAotICAgICAgICAiaW50IiwgIigpIiB9LCAgICAgIC8vIFRPRE86IHVzZSBsb25nIGluc3RlYWQKLSAgICB7ICJzdGFydFRpbWVNaWxsaXMiLCAodm9pZCopJlNDX3N0YXJ0VGltZU1pbGxpcywKLSAgICAgICAgImludCIsICIoKSIgfSwgICAgICAvLyBUT0RPOiB1c2UgbG9uZyBpbnN0ZWFkCi0gICAgeyAiZWxhcHNlZFRpbWVNaWxsaXMiLCAodm9pZCopJlNDX2VsYXBzZWRUaW1lTWlsbGlzLAotICAgICAgICAiaW50IiwgIigpIiB9LCAgICAgIC8vIFRPRE86IHVzZSBsb25nIGluc3RlYWQKKyAgICB7ICJfWjhyc1NlY29uZHYiLCAodm9pZCAqKSZTQ19zZWNvbmQgfSwKKyAgICB7ICJfWjhyc01pbnV0ZXYiLCAodm9pZCAqKSZTQ19taW51dGUgfSwKKyAgICB7ICJfWjZyc0hvdXJ2IiwgKHZvaWQgKikmU0NfaG91ciB9LAorICAgIHsgIl9aNXJzRGF5diIsICh2b2lkICopJlNDX2RheSB9LAorICAgIHsgIl9aN3JzTW9udGh2IiwgKHZvaWQgKikmU0NfbW9udGggfSwKKyAgICB7ICJfWjZyc1llYXJ2IiwgKHZvaWQgKikmU0NfeWVhciB9LAorICAgIHsgIl9aMTRyc1VwdGltZU1pbGxpc3YiLCAodm9pZCopJlNDX3VwdGltZU1pbGxpcyB9LAorICAgIHsgIl9aMTNyc1VwdGltZU5hbm9zdiIsICh2b2lkKikmU0NfdXB0aW1lTmFub3MgfSwKKyAgICB7ICJfWjdyc0dldER0diIsICh2b2lkKikmU0NfZ2V0RHQgfSwKIAotICAgIC8vIG1hdHJpeAotICAgIHsgIm1hdHJpeExvYWRJZGVudGl0eSIsICh2b2lkICopJlNDX21hdHJpeExvYWRJZGVudGl0eSwKLSAgICAgICAgInZvaWQiLCAiKGZsb2F0ICptYXQpIiB9LAotICAgIHsgIm1hdHJpeExvYWRGbG9hdCIsICh2b2lkICopJlNDX21hdHJpeExvYWRGbG9hdCwKLSAgICAgICAgInZvaWQiLCAiKGZsb2F0ICptYXQsIGZsb2F0ICpmKSIgfSwKLSAgICB7ICJtYXRyaXhMb2FkTWF0IiwgKHZvaWQgKikmU0NfbWF0cml4TG9hZE1hdCwKLSAgICAgICAgInZvaWQiLCAiKGZsb2F0ICptYXQsIGZsb2F0ICpuZXdtYXQpIiB9LAotICAgIHsgIm1hdHJpeExvYWRSb3RhdGUiLCAodm9pZCAqKSZTQ19tYXRyaXhMb2FkUm90YXRlLAotICAgICAgICAidm9pZCIsICIoZmxvYXQgKm1hdCwgZmxvYXQgcm90LCBmbG9hdCB4LCBmbG9hdCB5LCBmbG9hdCB6KSIgfSwKLSAgICB7ICJtYXRyaXhMb2FkU2NhbGUiLCAodm9pZCAqKSZTQ19tYXRyaXhMb2FkU2NhbGUsCi0gICAgICAgICJ2b2lkIiwgIihmbG9hdCAqbWF0LCBmbG9hdCB4LCBmbG9hdCB5LCBmbG9hdCB6KSIgfSwKLSAgICB7ICJtYXRyaXhMb2FkVHJhbnNsYXRlIiwgKHZvaWQgKikmU0NfbWF0cml4TG9hZFRyYW5zbGF0ZSwKLSAgICAgICAgInZvaWQiLCAiKGZsb2F0ICptYXQsIGZsb2F0IHgsIGZsb2F0IHksIGZsb2F0IHopIiB9LAotICAgIHsgIm1hdHJpeExvYWRNdWx0aXBseSIsICh2b2lkICopJlNDX21hdHJpeExvYWRNdWx0aXBseSwKLSAgICAgICAgInZvaWQiLCAiKGZsb2F0ICptYXQsIGZsb2F0ICpsaHMsIGZsb2F0ICpyaHMpIiB9LAotICAgIHsgIm1hdHJpeE11bHRpcGx5IiwgKHZvaWQgKikmU0NfbWF0cml4TXVsdGlwbHksCi0gICAgICAgICJ2b2lkIiwgIihmbG9hdCAqbWF0LCBmbG9hdCAqcmhzKSIgfSwKLSAgICB7ICJtYXRyaXhSb3RhdGUiLCAodm9pZCAqKSZTQ19tYXRyaXhSb3RhdGUsCi0gICAgICAgICJ2b2lkIiwgIihmbG9hdCAqbWF0LCBmbG9hdCByb3QsIGZsb2F0IHgsIGZsb2F0IHksIGZsb2F0IHopIiB9LAotICAgIHsgIm1hdHJpeFNjYWxlIiwgKHZvaWQgKikmU0NfbWF0cml4U2NhbGUsCi0gICAgICAgICJ2b2lkIiwgIihmbG9hdCAqbWF0LCBmbG9hdCB4LCBmbG9hdCB5LCBmbG9hdCB6KSIgfSwKLSAgICB7ICJtYXRyaXhUcmFuc2xhdGUiLCAodm9pZCAqKSZTQ19tYXRyaXhUcmFuc2xhdGUsCi0gICAgICAgICJ2b2lkIiwgIihmbG9hdCAqbWF0LCBmbG9hdCB4LCBmbG9hdCB5LCBmbG9hdCB6KSIgfSwKKyAgICB7ICJfWjE0cnNTZW5kVG9DbGllbnRpIiwgKHZvaWQgKikmU0NfdG9DbGllbnQgfSwKKyAgICB7ICJfWjE0cnNTZW5kVG9DbGllbnRpUEt2aiIsICh2b2lkICopJlNDX3RvQ2xpZW50MiB9LAorICAgIHsgIl9aMjJyc1NlbmRUb0NsaWVudEJsb2NraW5naSIsICh2b2lkICopJlNDX3RvQ2xpZW50QmxvY2tpbmcgfSwKKyAgICB7ICJfWjIycnNTZW5kVG9DbGllbnRCbG9ja2luZ2lQS3ZqIiwgKHZvaWQgKikmU0NfdG9DbGllbnRCbG9ja2luZzIgfSwKIAotICAgIC8vIHZlY3RvcgotICAgIHsgInZlYzJSYW5kIiwgKHZvaWQgKikmU0NfdmVjMlJhbmQsCi0gICAgICAgICJ2b2lkIiwgIihmbG9hdCAqdmVjLCBmbG9hdCBtYXhMZW4pIiB9LAorICAgIHsgIl9aOXJzRm9yRWFjaDlyc19zY3JpcHQxM3JzX2FsbG9jYXRpb25TMF9QS3YiLCAodm9pZCAqKSZTQ19Gb3JFYWNoIH0sCisgICAgLy97ICJfWjlyc0ZvckVhY2g5cnNfc2NyaXB0MTNyc19hbGxvY2F0aW9uUzBfUEt2IiwgKHZvaWQgKikmU0NfRm9yRWFjaDIgfSwKIAotICAgIC8vIHZlYzMKLSAgICB7ICJ2ZWMzTm9ybSIsICh2b2lkICopJlNDX3ZlYzNOb3JtLAotICAgICAgICAidm9pZCIsICIoc3RydWN0IHZlY0YzMl8zX3MgKikiIH0sCi0gICAgeyAidmVjM0xlbmd0aCIsICh2b2lkICopJlNDX3ZlYzNMZW5ndGgsCi0gICAgICAgICJmbG9hdCIsICIoc3RydWN0IHZlY0YzMl8zX3MgKikiIH0sCi0gICAgeyAidmVjM0FkZCIsICh2b2lkICopJlNDX3ZlYzNBZGQsCi0gICAgICAgICJ2b2lkIiwgIihzdHJ1Y3QgdmVjRjMyXzNfcyAqZGVzdCwgc3RydWN0IHZlY0YzMl8zX3MgKmxocywgc3RydWN0IHZlY0YzMl8zX3MgKnJocykiIH0sCi0gICAgeyAidmVjM1N1YiIsICh2b2lkICopJlNDX3ZlYzNTdWIsCi0gICAgICAgICJ2b2lkIiwgIihzdHJ1Y3QgdmVjRjMyXzNfcyAqZGVzdCwgc3RydWN0IHZlY0YzMl8zX3MgKmxocywgc3RydWN0IHZlY0YzMl8zX3MgKnJocykiIH0sCi0gICAgeyAidmVjM0Nyb3NzIiwgKHZvaWQgKikmU0NfdmVjM0Nyb3NzLAotICAgICAgICAidm9pZCIsICIoc3RydWN0IHZlY0YzMl8zX3MgKmRlc3QsIHN0cnVjdCB2ZWNGMzJfM19zICpsaHMsIHN0cnVjdCB2ZWNGMzJfM19zICpyaHMpIiB9LAotICAgIHsgInZlYzNEb3QiLCAodm9pZCAqKSZTQ192ZWMzRG90LAotICAgICAgICAiZmxvYXQiLCAiKHN0cnVjdCB2ZWNGMzJfM19zICpsaHMsIHN0cnVjdCB2ZWNGMzJfM19zICpyaHMpIiB9LAotICAgIHsgInZlYzNTY2FsZSIsICh2b2lkICopJlNDX3ZlYzNTY2FsZSwKLSAgICAgICAgInZvaWQiLCAiKHN0cnVjdCB2ZWNGMzJfM19zICpsaHMsIGZsb2F0IHNjYWxlKSIgfSwKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAKLSAgICAvLyB2ZWM0Ci0gICAgeyAidmVjNE5vcm0iLCAodm9pZCAqKSZTQ192ZWM0Tm9ybSwKLSAgICAgICAgInZvaWQiLCAiKHN0cnVjdCB2ZWNGMzJfNF9zICopIiB9LAotICAgIHsgInZlYzRMZW5ndGgiLCAodm9pZCAqKSZTQ192ZWM0TGVuZ3RoLAotICAgICAgICAiZmxvYXQiLCAiKHN0cnVjdCB2ZWNGMzJfNF9zICopIiB9LAotICAgIHsgInZlYzRBZGQiLCAodm9pZCAqKSZTQ192ZWM0QWRkLAotICAgICAgICAidm9pZCIsICIoc3RydWN0IHZlY0YzMl80X3MgKmRlc3QsIHN0cnVjdCB2ZWNGMzJfNF9zICpsaHMsIHN0cnVjdCB2ZWNGMzJfNF9zICpyaHMpIiB9LAotICAgIHsgInZlYzRTdWIiLCAodm9pZCAqKSZTQ192ZWM0U3ViLAotICAgICAgICAidm9pZCIsICIoc3RydWN0IHZlY0YzMl80X3MgKmRlc3QsIHN0cnVjdCB2ZWNGMzJfNF9zICpsaHMsIHN0cnVjdCB2ZWNGMzJfNF9zICpyaHMpIiB9LAotICAgIHsgInZlYzREb3QiLCAodm9pZCAqKSZTQ192ZWM0RG90LAotICAgICAgICAiZmxvYXQiLCAiKHN0cnVjdCB2ZWNGMzJfNF9zICpsaHMsIHN0cnVjdCB2ZWNGMzJfNF9zICpyaHMpIiB9LAotICAgIHsgInZlYzRTY2FsZSIsICh2b2lkICopJlNDX3ZlYzRTY2FsZSwKLSAgICAgICAgInZvaWQiLCAiKHN0cnVjdCB2ZWNGMzJfNF9zICpsaHMsIGZsb2F0IHNjYWxlKSIgfSwKKyAgICAvL3sgInNpbmZfZmFzdCIsICh2b2lkICopJlNDX3NpbmZfZmFzdCB9LAorICAgIC8veyAiY29zZl9mYXN0IiwgKHZvaWQgKikmU0NfY29zZl9mYXN0IH0sCiAKLSAgICAvLyBjb250ZXh0Ci0gICAgeyAiYmluZFByb2dyYW1GcmFnbWVudCIsICh2b2lkICopJlNDX2JpbmRQcm9ncmFtRnJhZ21lbnQsCi0gICAgICAgICJ2b2lkIiwgIihpbnQpIiB9LAotICAgIHsgImJpbmRQcm9ncmFtRnJhZ21lbnRTdG9yZSIsICh2b2lkICopJlNDX2JpbmRQcm9ncmFtRnJhZ21lbnRTdG9yZSwKLSAgICAgICAgInZvaWQiLCAiKGludCkiIH0sCi0gICAgeyAiYmluZFByb2dyYW1TdG9yZSIsICh2b2lkICopJlNDX2JpbmRQcm9ncmFtRnJhZ21lbnRTdG9yZSwKLSAgICAgICAgInZvaWQiLCAiKGludCkiIH0sCi0gICAgeyAiYmluZFByb2dyYW1WZXJ0ZXgiLCAodm9pZCAqKSZTQ19iaW5kUHJvZ3JhbVZlcnRleCwKLSAgICAgICAgInZvaWQiLCAiKGludCkiIH0sCi0gICAgeyAiYmluZFNhbXBsZXIiLCAodm9pZCAqKSZTQ19iaW5kU2FtcGxlciwKLSAgICAgICAgInZvaWQiLCAiKGludCwgaW50LCBpbnQpIiB9LAotICAgIHsgImJpbmRUZXh0dXJlIiwgKHZvaWQgKikmU0NfYmluZFRleHR1cmUsCi0gICAgICAgICJ2b2lkIiwgIihpbnQsIGludCwgaW50KSIgfSwKLQotICAgIC8vIHZwCi0gICAgeyAidnBMb2FkTW9kZWxNYXRyaXgiLCAodm9pZCAqKSZTQ192cExvYWRNb2RlbE1hdHJpeCwKLSAgICAgICAgInZvaWQiLCAiKHZvaWQgKikiIH0sCi0gICAgeyAidnBMb2FkVGV4dHVyZU1hdHJpeCIsICh2b2lkICopJlNDX3ZwTG9hZFRleHR1cmVNYXRyaXgsCi0gICAgICAgICJ2b2lkIiwgIih2b2lkICopIiB9LAotCi0KLQotICAgIC8vIGRyYXdpbmcKLSAgICB7ICJkcmF3UmVjdCIsICh2b2lkICopJlNDX2RyYXdSZWN0LAotICAgICAgICAidm9pZCIsICIoZmxvYXQgeDEsIGZsb2F0IHkxLCBmbG9hdCB4MiwgZmxvYXQgeTIsIGZsb2F0IHopIiB9LAotICAgIHsgImRyYXdRdWFkIiwgKHZvaWQgKikmU0NfZHJhd1F1YWQsCi0gICAgICAgICJ2b2lkIiwgIihmbG9hdCB4MSwgZmxvYXQgeTEsIGZsb2F0IHoxLCBmbG9hdCB4MiwgZmxvYXQgeTIsIGZsb2F0IHoyLCBmbG9hdCB4MywgZmxvYXQgeTMsIGZsb2F0IHozLCBmbG9hdCB4NCwgZmxvYXQgeTQsIGZsb2F0IHo0KSIgfSwKLSAgICB7ICJkcmF3UXVhZFRleENvb3JkcyIsICh2b2lkICopJlNDX2RyYXdRdWFkVGV4Q29vcmRzLAotICAgICAgICAidm9pZCIsICIoZmxvYXQgeDEsIGZsb2F0IHkxLCBmbG9hdCB6MSwgZmxvYXQgdTEsIGZsb2F0IHYxLCBmbG9hdCB4MiwgZmxvYXQgeTIsIGZsb2F0IHoyLCBmbG9hdCB1MiwgZmxvYXQgdjIsIGZsb2F0IHgzLCBmbG9hdCB5MywgZmxvYXQgejMsIGZsb2F0IHUzLCBmbG9hdCB2MywgZmxvYXQgeDQsIGZsb2F0IHk0LCBmbG9hdCB6NCwgZmxvYXQgdTQsIGZsb2F0IHY0KSIgfSwKLSAgICB7ICJkcmF3U3ByaXRlIiwgKHZvaWQgKikmU0NfZHJhd1Nwcml0ZSwKLSAgICAgICAgInZvaWQiLCAiKGZsb2F0IHgsIGZsb2F0IHksIGZsb2F0IHosIGZsb2F0IHcsIGZsb2F0IGgpIiB9LAotICAgIHsgImRyYXdTcHJpdGVTY3JlZW5zcGFjZSIsICh2b2lkICopJlNDX2RyYXdTcHJpdGVTY3JlZW5zcGFjZSwKLSAgICAgICAgInZvaWQiLCAiKGZsb2F0IHgsIGZsb2F0IHksIGZsb2F0IHosIGZsb2F0IHcsIGZsb2F0IGgpIiB9LAotICAgIHsgImRyYXdTcHJpdGVTY3JlZW5zcGFjZUNyb3BwZWQiLCAodm9pZCAqKSZTQ19kcmF3U3ByaXRlU2NyZWVuc3BhY2VDcm9wcGVkLAotICAgICAgICAidm9pZCIsICIoZmxvYXQgeCwgZmxvYXQgeSwgZmxvYXQgeiwgZmxvYXQgdywgZmxvYXQgaCwgZmxvYXQgY3gwLCBmbG9hdCBjeTAsIGZsb2F0IGN4MSwgZmxvYXQgY3kxKSIgfSwKLSAgICB7ICJkcmF3TGluZSIsICh2b2lkICopJlNDX2RyYXdMaW5lLAotICAgICAgICAidm9pZCIsICIoZmxvYXQgeDEsIGZsb2F0IHkxLCBmbG9hdCB6MSwgZmxvYXQgeDIsIGZsb2F0IHkyLCBmbG9hdCB6MikiIH0sCi0gICAgeyAiZHJhd1BvaW50IiwgKHZvaWQgKikmU0NfZHJhd1BvaW50LAotICAgICAgICAidm9pZCIsICIoZmxvYXQgeDEsIGZsb2F0IHkxLCBmbG9hdCB6MSkiIH0sCi0gICAgeyAiZHJhd1NpbXBsZU1lc2giLCAodm9pZCAqKSZTQ19kcmF3U2ltcGxlTWVzaCwKLSAgICAgICAgInZvaWQiLCAiKGludCBpc20pIiB9LAotICAgIHsgImRyYXdTaW1wbGVNZXNoUmFuZ2UiLCAodm9pZCAqKSZTQ19kcmF3U2ltcGxlTWVzaFJhbmdlLAotICAgICAgICAidm9pZCIsICIoaW50IGlzbSwgaW50IHN0YXJ0LCBpbnQgbGVuKSIgfSwKLQotCi0gICAgLy8gbWlzYwotICAgIHsgInBmQ2xlYXJDb2xvciIsICh2b2lkICopJlNDX0NsZWFyQ29sb3IsCi0gICAgICAgICJ2b2lkIiwgIihmbG9hdCwgZmxvYXQsIGZsb2F0LCBmbG9hdCkiIH0sCi0gICAgeyAiY29sb3IiLCAodm9pZCAqKSZTQ19jb2xvciwKLSAgICAgICAgInZvaWQiLCAiKGZsb2F0LCBmbG9hdCwgZmxvYXQsIGZsb2F0KSIgfSwKLSAgICB7ICJoc2IiLCAodm9pZCAqKSZTQ19oc2IsCi0gICAgICAgICJ2b2lkIiwgIihmbG9hdCwgZmxvYXQsIGZsb2F0LCBmbG9hdCkiIH0sCi0gICAgeyAiaHNiVG9SZ2IiLCAodm9pZCAqKSZTQ19oc2JUb1JnYiwKLSAgICAgICAgInZvaWQiLCAiKGZsb2F0LCBmbG9hdCwgZmxvYXQsIGZsb2F0KikiIH0sCi0gICAgeyAiaHNiVG9BYmdyIiwgKHZvaWQgKikmU0NfaHNiVG9BYmdyLAotICAgICAgICAiaW50IiwgIihmbG9hdCwgZmxvYXQsIGZsb2F0LCBmbG9hdCkiIH0sCi0gICAgeyAiYW1iaWVudCIsICh2b2lkICopJlNDX2FtYmllbnQsCi0gICAgICAgICJ2b2lkIiwgIihmbG9hdCwgZmxvYXQsIGZsb2F0LCBmbG9hdCkiIH0sCi0gICAgeyAiZGlmZnVzZSIsICh2b2lkICopJlNDX2RpZmZ1c2UsCi0gICAgICAgICJ2b2lkIiwgIihmbG9hdCwgZmxvYXQsIGZsb2F0LCBmbG9hdCkiIH0sCi0gICAgeyAic3BlY3VsYXIiLCAodm9pZCAqKSZTQ19zcGVjdWxhciwKLSAgICAgICAgInZvaWQiLCAiKGZsb2F0LCBmbG9hdCwgZmxvYXQsIGZsb2F0KSIgfSwKLSAgICB7ICJlbWlzc2lvbiIsICh2b2lkICopJlNDX2VtaXNzaW9uLAotICAgICAgICAidm9pZCIsICIoZmxvYXQsIGZsb2F0LCBmbG9hdCwgZmxvYXQpIiB9LAotICAgIHsgInNoaW5pbmVzcyIsICh2b2lkICopJlNDX3NoaW5pbmVzcywKLSAgICAgICAgInZvaWQiLCAiKGZsb2F0KSIgfSwKLSAgICB7ICJwb2ludEF0dGVudWF0aW9uIiwgKHZvaWQgKikmU0NfcG9pbnRBdHRlbnVhdGlvbiwKLSAgICAgICAgInZvaWQiLCAiKGZsb2F0LCBmbG9hdCwgZmxvYXQpIiB9LAotCi0gICAgeyAidXBsb2FkVG9UZXh0dXJlIiwgKHZvaWQgKikmU0NfdXBsb2FkVG9UZXh0dXJlLAotICAgICAgICAidm9pZCIsICIoaW50LCBpbnQpIiB9LAotICAgIHsgInVwbG9hZFRvQnVmZmVyT2JqZWN0IiwgKHZvaWQgKikmU0NfdXBsb2FkVG9CdWZmZXJPYmplY3QsCi0gICAgICAgICJ2b2lkIiwgIihpbnQpIiB9LAotCi0gICAgeyAic3luY1RvR0wiLCAodm9pZCAqKSZTQ19zeW5jVG9HTCwKLSAgICAgICAgInZvaWQiLCAiKGludCkiIH0sCi0KLSAgICB7ICJjb2xvckZsb2F0UkdCQXRvVU5vcm04IiwgKHZvaWQgKikmU0NfY29sb3JGbG9hdFJHQkF0b1VOb3JtOCwKLSAgICAgICAgImludCIsICIoZmxvYXQsIGZsb2F0LCBmbG9hdCwgZmxvYXQpIiB9LAotICAgIHsgImNvbG9yRmxvYXRSR0J0bzU2NSIsICh2b2lkICopJlNDX2NvbG9yRmxvYXRSR0JBdG81NjUsCi0gICAgICAgICJpbnQiLCAiKGZsb2F0LCBmbG9hdCwgZmxvYXQpIiB9LAotCi0KLSAgICB7ICJnZXRXaWR0aCIsICh2b2lkICopJlNDX2dldFdpZHRoLAotICAgICAgICAiaW50IiwgIigpIiB9LAotICAgIHsgImdldEhlaWdodCIsICh2b2lkICopJlNDX2dldEhlaWdodCwKLSAgICAgICAgImludCIsICIoKSIgfSwKLQotICAgIHsgInNlbmRUb0NsaWVudCIsICh2b2lkICopJlNDX3RvQ2xpZW50LAotICAgICAgICAiaW50IiwgIih2b2lkICpkYXRhLCBpbnQgY21kSUQsIGludCBsZW4sIGludCB3YWl0Rm9yU3BhY2UpIiB9LAotCi0KLSAgICB7ICJkZWJ1Z0YiLCAodm9pZCAqKSZTQ19kZWJ1Z0YsCi0gICAgICAgICJ2b2lkIiwgIih2b2lkICosIGZsb2F0KSIgfSwKLSAgICB7ICJkZWJ1Z0kzMiIsICh2b2lkICopJlNDX2RlYnVnSTMyLAotICAgICAgICAidm9pZCIsICIodm9pZCAqLCBpbnQpIiB9LAotICAgIHsgImRlYnVnSGV4RiIsICh2b2lkICopJlNDX2RlYnVnSGV4RiwKLSAgICAgICAgInZvaWQiLCAiKHZvaWQgKiwgZmxvYXQpIiB9LAotICAgIHsgImRlYnVnSGV4STMyIiwgKHZvaWQgKikmU0NfZGVidWdIZXhJMzIsCi0gICAgICAgICJ2b2lkIiwgIih2b2lkICosIGludCkiIH0sCi0KLSAgICB7ICJzY3JpcHRDYWxsIiwgKHZvaWQgKikmU0Nfc2NyaXB0Q2FsbCwKLSAgICAgICAgInZvaWQiLCAiKGludCkiIH0sCi0KLQotICAgIHsgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCB9CisgICAgeyBOVUxMLCBOVUxMIH0KIH07CiAKIGNvbnN0IFNjcmlwdENTdGF0ZTo6U3ltYm9sVGFibGVfdCAqIFNjcmlwdENTdGF0ZTo6bG9va3VwU3ltYm9sKGNvbnN0IGNoYXIgKnN5bSkKQEAgLTE0MDAsMTcgKzQ4OSwzIEBACiAgICAgcmV0dXJuIE5VTEw7CiB9CiAKLXZvaWQgU2NyaXB0Q1N0YXRlOjphcHBlbmREZWNscyhTdHJpbmc4ICpzdHIpCi17Ci0gICAgU2NyaXB0Q1N0YXRlOjpTeW1ib2xUYWJsZV90ICpzeW1zID0gZ1N5bXM7Ci0gICAgd2hpbGUgKHN5bXMtPm1QdHIpIHsKLSAgICAgICAgc3RyLT5hcHBlbmQoc3ltcy0+bVJldCk7Ci0gICAgICAgIHN0ci0+YXBwZW5kKCIgIik7Ci0gICAgICAgIHN0ci0+YXBwZW5kKHN5bXMtPm1OYW1lKTsKLSAgICAgICAgc3RyLT5hcHBlbmQoc3ltcy0+bVBhcmFtKTsKLSAgICAgICAgc3RyLT5hcHBlbmQoIjtcbiIpOwotICAgICAgICBzeW1zKys7Ci0gICAgfQotfQotCi0KZGlmZiAtLWdpdCBhL2xpYnMvcnMvcnNTY3JpcHRDX0xpYkNMLmNwcCBiL2xpYnMvcnMvcnNTY3JpcHRDX0xpYkNMLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZThlN2IyCi0tLSAvZGV2L251bGwKKysrIGIvbGlicy9ycy9yc1NjcmlwdENfTGliQ0wuY3BwCkBAIC0wLDAgKzEsMzE0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgInJzQ29udGV4dC5oIgorI2luY2x1ZGUgInJzU2NyaXB0Qy5oIgorCisvLyBJbXBsZW1lbnRzIHJzX2NsLnJzaAorCisKK3VzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOwordXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ6OnJlbmRlcnNjcmlwdDsKKworCitzdGF0aWMgZmxvYXQgU0NfYWNvc3BpKGZsb2F0IHYpIHsKKyAgICByZXR1cm4gYWNvc2YodikvIE1fUEk7Cit9CisKK3N0YXRpYyBmbG9hdCBTQ19hc2lucGkoZmxvYXQgdikgeworICAgIHJldHVybiBhc2luZih2KSAvIE1fUEk7Cit9CisKK3N0YXRpYyBmbG9hdCBTQ19hdGFucGkoZmxvYXQgdikgeworICAgIHJldHVybiBhdGFuZih2KSAvIE1fUEk7Cit9CisKK3N0YXRpYyBmbG9hdCBTQ19hdGFuMnBpKGZsb2F0IHksIGZsb2F0IHgpIHsKKyAgICByZXR1cm4gYXRhbjJmKHksIHgpIC8gTV9QSTsKK30KKworc3RhdGljIGZsb2F0IFNDX2Nvc3BpKGZsb2F0IHYpIHsKKyAgICByZXR1cm4gY29zZih2ICogTV9QSSk7Cit9CisKK3N0YXRpYyBmbG9hdCBTQ19leHAxMChmbG9hdCB2KSB7CisgICAgcmV0dXJuIHBvdygxMC5mLCB2KTsKKworfQorCitzdGF0aWMgZmxvYXQgU0NfZnJhY3QoZmxvYXQgdiwgaW50ICppcHRyKSB7CisgICAgaW50IGkgPSAoaW50KWZsb29yKHYpOworICAgIGlwdHJbMF0gPSBpOworICAgIHJldHVybiBmbWluKHYgLSBpLCAweDEuZmZmZmZlcC0xZik7Cit9CisKK3N0YXRpYyBmbG9hdCBTQ19sb2cyKGZsb2F0IHYpIHsKKyAgICByZXR1cm4gbG9nMTAodikgLyBsb2cxMCgyLmYpOworfQorCitzdGF0aWMgZmxvYXQgU0NfcG93bihmbG9hdCB2LCBpbnQgcCkgeworICAgIHJldHVybiBwb3dmKHYsIChmbG9hdClwKTsKK30KKworc3RhdGljIGZsb2F0IFNDX3Bvd3IoZmxvYXQgdiwgZmxvYXQgcCkgeworICAgIHJldHVybiBwb3dmKHYsIHApOworfQorCitmbG9hdCBTQ19yb290bihmbG9hdCB2LCBpbnQgcikgeworICAgIHJldHVybiBwb3codiwgMS5mIC8gcik7Cit9CisKK2Zsb2F0IFNDX3JzcXJ0KGZsb2F0IHYpIHsKKyAgICByZXR1cm4gMS5mIC8gc3FydGYodik7Cit9CisKK2Zsb2F0IFNDX3NpbmNvcyhmbG9hdCB2LCBmbG9hdCAqY29zcHRyKSB7CisgICAgKmNvc3B0ciA9IGNvc2Yodik7CisgICAgcmV0dXJuIHNpbmYodik7Cit9CisKK3N0YXRpYyBmbG9hdCBTQ19zaW5waShmbG9hdCB2KSB7CisgICAgcmV0dXJuIHNpbmYodiAqIE1fUEkpOworfQorCitzdGF0aWMgZmxvYXQgU0NfdGFucGkoZmxvYXQgdikgeworICAgIHJldHVybiB0YW5mKHYgKiBNX1BJKTsKK30KKworICAgIC8veyAibG9nYiIsICh2b2lkICopJiB9LAorICAgIC8veyAibWFkIiwgKHZvaWQgKikmIH0sCisgICAgLy97ICJuYW4iLCAodm9pZCAqKSYgfSwKKyAgICAvL3sgInRnYW1tYSIsICh2b2lkICopJiB9LAorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIEludGVnZXIKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisKK3N0YXRpYyB1aW50MzJfdCBTQ19hYnNfaTMyKGludDMyX3Qgdikge3JldHVybiBhYnModik7fQorc3RhdGljIHVpbnQxNl90IFNDX2Fic19pMTYoaW50MTZfdCB2KSB7cmV0dXJuICh1aW50MTZfdClhYnModik7fQorc3RhdGljIHVpbnQ4X3QgU0NfYWJzX2k4KGludDhfdCB2KSB7cmV0dXJuICh1aW50OF90KWFicyh2KTt9CisKK3N0YXRpYyB1aW50MzJfdCBTQ19jbHpfdTMyKHVpbnQzMl90IHYpIHtyZXR1cm4gX19idWlsdGluX2Nseih2KTt9CitzdGF0aWMgdWludDE2X3QgU0NfY2x6X3UxNih1aW50MTZfdCB2KSB7cmV0dXJuICh1aW50MTZfdClfX2J1aWx0aW5fY2x6KHYpO30KK3N0YXRpYyB1aW50OF90IFNDX2Nsel91OCh1aW50OF90IHYpIHtyZXR1cm4gKHVpbnQ4X3QpX19idWlsdGluX2Nseih2KTt9CitzdGF0aWMgaW50MzJfdCBTQ19jbHpfaTMyKGludDMyX3Qgdikge3JldHVybiAoaW50MzJfdClfX2J1aWx0aW5fY2x6KCh1aW50MzJfdCl2KTt9CitzdGF0aWMgaW50MTZfdCBTQ19jbHpfaTE2KGludDE2X3Qgdikge3JldHVybiAoaW50MTZfdClfX2J1aWx0aW5fY2x6KHYpO30KK3N0YXRpYyBpbnQ4X3QgU0NfY2x6X2k4KGludDhfdCB2KSB7cmV0dXJuIChpbnQ4X3QpX19idWlsdGluX2Nseih2KTt9CisKK3N0YXRpYyB1aW50MzJfdCBTQ19tYXhfdTMyKHVpbnQzMl90IHYsIHVpbnQzMl90IHYyKSB7cmV0dXJuIHJzTWF4KHYsIHYyKTt9CitzdGF0aWMgdWludDE2X3QgU0NfbWF4X3UxNih1aW50MTZfdCB2LCB1aW50MTZfdCB2Mikge3JldHVybiByc01heCh2LCB2Mik7fQorc3RhdGljIHVpbnQ4X3QgU0NfbWF4X3U4KHVpbnQ4X3QgdiwgdWludDhfdCB2Mikge3JldHVybiByc01heCh2LCB2Mik7fQorc3RhdGljIGludDMyX3QgU0NfbWF4X2kzMihpbnQzMl90IHYsIGludDMyX3QgdjIpIHtyZXR1cm4gcnNNYXgodiwgdjIpO30KK3N0YXRpYyBpbnQxNl90IFNDX21heF9pMTYoaW50MTZfdCB2LCBpbnQxNl90IHYyKSB7cmV0dXJuIHJzTWF4KHYsIHYyKTt9CitzdGF0aWMgaW50OF90IFNDX21heF9pOChpbnQ4X3QgdiwgaW50OF90IHYyKSB7cmV0dXJuIHJzTWF4KHYsIHYyKTt9CisKK3N0YXRpYyB1aW50MzJfdCBTQ19taW5fdTMyKHVpbnQzMl90IHYsIHVpbnQzMl90IHYyKSB7cmV0dXJuIHJzTWluKHYsIHYyKTt9CitzdGF0aWMgdWludDE2X3QgU0NfbWluX3UxNih1aW50MTZfdCB2LCB1aW50MTZfdCB2Mikge3JldHVybiByc01pbih2LCB2Mik7fQorc3RhdGljIHVpbnQ4X3QgU0NfbWluX3U4KHVpbnQ4X3QgdiwgdWludDhfdCB2Mikge3JldHVybiByc01pbih2LCB2Mik7fQorc3RhdGljIGludDMyX3QgU0NfbWluX2kzMihpbnQzMl90IHYsIGludDMyX3QgdjIpIHtyZXR1cm4gcnNNaW4odiwgdjIpO30KK3N0YXRpYyBpbnQxNl90IFNDX21pbl9pMTYoaW50MTZfdCB2LCBpbnQxNl90IHYyKSB7cmV0dXJuIHJzTWluKHYsIHYyKTt9CitzdGF0aWMgaW50OF90IFNDX21pbl9pOChpbnQ4X3QgdiwgaW50OF90IHYyKSB7cmV0dXJuIHJzTWluKHYsIHYyKTt9CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gRmxvYXQgdXRpbAorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK3N0YXRpYyBmbG9hdCBTQ19jbGFtcF9mMzIoZmxvYXQgYW1vdW50LCBmbG9hdCBsb3csIGZsb2F0IGhpZ2gpCit7CisgICAgcmV0dXJuIGFtb3VudCA8IGxvdyA/IGxvdyA6IChhbW91bnQgPiBoaWdoID8gaGlnaCA6IGFtb3VudCk7Cit9CisKK3N0YXRpYyBmbG9hdCBTQ19kZWdyZWVzKGZsb2F0IHJhZGlhbnMpCit7CisgICAgcmV0dXJuIHJhZGlhbnMgKiAoMTgwLmYgLyBNX1BJKTsKK30KKworc3RhdGljIGZsb2F0IFNDX21heF9mMzIoZmxvYXQgdiwgZmxvYXQgdjIpCit7CisgICAgcmV0dXJuIHJzTWF4KHYsIHYyKTsKK30KKworc3RhdGljIGZsb2F0IFNDX21pbl9mMzIoZmxvYXQgdiwgZmxvYXQgdjIpCit7CisgICAgcmV0dXJuIHJzTWluKHYsIHYyKTsKK30KKworc3RhdGljIGZsb2F0IFNDX21peF9mMzIoZmxvYXQgc3RhcnQsIGZsb2F0IHN0b3AsIGZsb2F0IGFtb3VudCkKK3sKKyAgICAvL0xPR0UoImxlcnBmICVmICAlZiAgJWYiLCBzdGFydCwgc3RvcCwgYW1vdW50KTsKKyAgICByZXR1cm4gc3RhcnQgKyAoc3RvcCAtIHN0YXJ0KSAqIGFtb3VudDsKK30KKworc3RhdGljIGZsb2F0IFNDX3JhZGlhbnMoZmxvYXQgZGVncmVlcykKK3sKKyAgICByZXR1cm4gZGVncmVlcyAqIChNX1BJIC8gMTgwLmYpOworfQorCitzdGF0aWMgZmxvYXQgU0Nfc3RlcF9mMzIoZmxvYXQgZWRnZSwgZmxvYXQgdikKK3sKKyAgICBpZiAodiA8IGVkZ2UpIHJldHVybiAwLmY7CisgICAgcmV0dXJuIDEuZjsKK30KKworc3RhdGljIGZsb2F0IFNDX3NpZ25fZjMyKGZsb2F0IHZhbHVlKQoreworICAgIGlmICh2YWx1ZSA+IDApIHJldHVybiAxLmY7CisgICAgaWYgKHZhbHVlIDwgMCkgcmV0dXJuIC0xLmY7CisgICAgcmV0dXJuIHZhbHVlOworfQorCisKKworCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gQ2xhc3MgaW1wbGVtZW50YXRpb24KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisvLyBsbHZtIG5hbWUgbWFuZ2xpbmcgcmVmCisvLyAgPGJ1aWx0aW4tdHlwZT4gOjo9IHYgICMgdm9pZAorLy8gICAgICAgICAgICAgICAgIDo6PSBiICAjIGJvb2wKKy8vICAgICAgICAgICAgICAgICA6Oj0gYyAgIyBjaGFyCisvLyAgICAgICAgICAgICAgICAgOjo9IGEgICMgc2lnbmVkIGNoYXIKKy8vICAgICAgICAgICAgICAgICA6Oj0gaCAgIyB1bnNpZ25lZCBjaGFyCisvLyAgICAgICAgICAgICAgICAgOjo9IHMgICMgc2hvcnQKKy8vICAgICAgICAgICAgICAgICA6Oj0gdCAgIyB1bnNpZ25lZCBzaG9ydAorLy8gICAgICAgICAgICAgICAgIDo6PSBpICAjIGludAorLy8gICAgICAgICAgICAgICAgIDo6PSBqICAjIHVuc2lnbmVkIGludAorLy8gICAgICAgICAgICAgICAgIDo6PSBsICAjIGxvbmcKKy8vICAgICAgICAgICAgICAgICA6Oj0gbSAgIyB1bnNpZ25lZCBsb25nCisvLyAgICAgICAgICAgICAgICAgOjo9IHggICMgbG9uZyBsb25nLCBfX2ludDY0CisvLyAgICAgICAgICAgICAgICAgOjo9IHkgICMgdW5zaWduZWQgbG9uZyBsb25nLCBfX2ludDY0CisvLyAgICAgICAgICAgICAgICAgOjo9IGYgICMgZmxvYXQKKy8vICAgICAgICAgICAgICAgICA6Oj0gZCAgIyBkb3VibGUKKworc3RhdGljIFNjcmlwdENTdGF0ZTo6U3ltYm9sVGFibGVfdCBnU3ltc1tdID0geworICAgIC8vIE9wZW5DTCBtYXRoCisgICAgeyAiX1o0YWNvc2YiLCAodm9pZCAqKSZhY29zZiB9LAorICAgIHsgIl9aNWFjb3NoZiIsICh2b2lkICopJmFjb3NoZiB9LAorICAgIHsgIl9aNmFjb3NwaWYiLCAodm9pZCAqKSZTQ19hY29zcGkgfSwKKyAgICB7ICJfWjRhc2luZiIsICh2b2lkICopJmFzaW5mIH0sCisgICAgeyAiX1o1YXNpbmhmIiwgKHZvaWQgKikmYXNpbmhmIH0sCisgICAgeyAiX1o2YXNpbnBpZiIsICh2b2lkICopJlNDX2FzaW5waSB9LAorICAgIHsgIl9aNGF0YW5mIiwgKHZvaWQgKikmYXRhbmYgfSwKKyAgICB7ICJfWjVhdGFuMmYiLCAodm9pZCAqKSZhdGFuMmYgfSwKKyAgICB7ICJfWjZhdGFucGlmIiwgKHZvaWQgKikmU0NfYXRhbnBpIH0sCisgICAgeyAiX1o3YXRhbjJwaWYiLCAodm9pZCAqKSZTQ19hdGFuMnBpIH0sCisgICAgeyAiX1o0Y2JydGYiLCAodm9pZCAqKSZjYnJ0ZiB9LAorICAgIHsgIl9aNGNlaWxmIiwgKHZvaWQgKikmY2VpbGYgfSwKKyAgICB7ICJfWjhjb3B5c2lnbmZmIiwgKHZvaWQgKikmY29weXNpZ25mIH0sCisgICAgeyAiX1ozY29zZiIsICh2b2lkICopJmNvc2YgfSwKKyAgICB7ICJfWjRjb3NoZiIsICh2b2lkICopJmNvc2hmIH0sCisgICAgeyAiX1o1Y29zcGlmIiwgKHZvaWQgKikmU0NfY29zcGkgfSwKKyAgICB7ICJfWjRlcmZjZiIsICh2b2lkICopJmVyZmNmIH0sCisgICAgeyAiX1ozZXJmZiIsICh2b2lkICopJmVyZmYgfSwKKyAgICB7ICJfWjNleHBmIiwgKHZvaWQgKikmZXhwZiB9LAorICAgIHsgIl9aNGV4cDJmIiwgKHZvaWQgKikmZXhwMmYgfSwKKyAgICB7ICJfWjVleHAxMGYiLCAodm9pZCAqKSZTQ19leHAxMCB9LAorICAgIHsgIl9aNWV4cG0xZiIsICh2b2lkICopJmV4cG0xZiB9LAorICAgIHsgIl9aNGZhYnNmIiwgKHZvaWQgKikmZmFic2YgfSwKKyAgICB7ICJfWjRmZGltZmYiLCAodm9pZCAqKSZmZGltZiB9LAorICAgIHsgIl9aNWZsb29yZiIsICh2b2lkICopJmZsb29yZiB9LAorICAgIHsgIl9aM2ZtYWZmZiIsICh2b2lkICopJmZtYWYgfSwKKyAgICB7ICJfWjRmbWF4ZmYiLCAodm9pZCAqKSZmbWF4ZiB9LAorICAgIHsgIl9aNGZtaW5mZiIsICh2b2lkICopJmZtaW5mIH0sICAvLyBmbG9hdCBmbWluKGZsb2F0LCBmbG9hdCkKKyAgICB7ICJfWjRmbW9kZmYiLCAodm9pZCAqKSZmbW9kZiB9LAorICAgIHsgIl9aNWZyYWN0ZlBmIiwgKHZvaWQgKikmU0NfZnJhY3QgfSwKKyAgICB7ICJfWjVmcmV4cGZQaSIsICh2b2lkICopJmZyZXhwZiB9LAorICAgIHsgIl9aNWh5cG90ZmYiLCAodm9pZCAqKSZoeXBvdGYgfSwKKyAgICB7ICJfWjVpbG9nYmYiLCAodm9pZCAqKSZpbG9nYmYgfSwKKyAgICB7ICJfWjVsZGV4cGZpIiwgKHZvaWQgKikmbGRleHBmIH0sCisgICAgeyAiX1o2bGdhbW1hZiIsICh2b2lkICopJmxnYW1tYWYgfSwKKyAgICB7ICJfWjNsb2dmIiwgKHZvaWQgKikmbG9nZiB9LAorICAgIHsgIl9aNGxvZzJmIiwgKHZvaWQgKikmU0NfbG9nMiB9LAorICAgIHsgIl9aNWxvZzEwZiIsICh2b2lkICopJmxvZzEwZiB9LAorICAgIHsgIl9aNWxvZzFwZiIsICh2b2lkICopJmxvZzFwZiB9LAorICAgIC8veyAibG9nYiIsICh2b2lkICopJiB9LAorICAgIC8veyAibWFkIiwgKHZvaWQgKikmIH0sCisgICAgeyAibW9kZiIsICh2b2lkICopJm1vZGZmIH0sCisgICAgLy97ICJuYW4iLCAodm9pZCAqKSYgfSwKKyAgICB7ICJfWjluZXh0YWZ0ZXJmZiIsICh2b2lkICopJm5leHRhZnRlcmYgfSwKKyAgICB7ICJfWjNwb3dmZiIsICh2b2lkICopJnBvd2YgfSwKKyAgICB7ICJfWjRwb3duZmkiLCAodm9pZCAqKSZTQ19wb3duIH0sCisgICAgeyAiX1o0cG93cmZmIiwgKHZvaWQgKikmU0NfcG93ciB9LAorICAgIHsgIl9aOXJlbWFpbmRlcmZmIiwgKHZvaWQgKikmcmVtYWluZGVyZiB9LAorICAgIHsgInJlbXF1byIsICh2b2lkICopJnJlbXF1b2YgfSwKKyAgICB7ICJfWjRyaW50ZiIsICh2b2lkICopJnJpbnRmIH0sCisgICAgeyAiX1o1cm9vdG5maSIsICh2b2lkICopJlNDX3Jvb3RuIH0sCisgICAgeyAiX1o1cm91bmRmIiwgKHZvaWQgKikmcm91bmRmIH0sCisgICAgeyAiX1o1cnNxcnRmIiwgKHZvaWQgKikmU0NfcnNxcnQgfSwKKyAgICB7ICJfWjNzaW5mIiwgKHZvaWQgKikmc2luZiB9LAorICAgIHsgInNpbmNvcyIsICh2b2lkICopJlNDX3NpbmNvcyB9LAorICAgIHsgIl9aNHNpbmhmIiwgKHZvaWQgKikmc2luaGYgfSwKKyAgICB7ICJfWjVzaW5waWYiLCAodm9pZCAqKSZTQ19zaW5waSB9LAorICAgIHsgIl9aNHNxcnRmIiwgKHZvaWQgKikmc3FydGYgfSwKKyAgICB7ICJfWjN0YW5mIiwgKHZvaWQgKikmdGFuZiB9LAorICAgIHsgIl9aNHRhbmhmIiwgKHZvaWQgKikmdGFuaGYgfSwKKyAgICB7ICJfWjV0YW5waWYiLCAodm9pZCAqKSZTQ190YW5waSB9LAorICAgIC8veyAidGdhbW1hIiwgKHZvaWQgKikmIH0sCisgICAgeyAiX1o1dHJ1bmNmIiwgKHZvaWQgKikmdHJ1bmNmIH0sCisKKyAgICAvLyBPcGVuQ0wgSW50CisgICAgeyAiX1ozYWJzaSIsICh2b2lkICopJlNDX2Fic19pMzIgfSwKKyAgICB7ICJfWjNhYnNzIiwgKHZvaWQgKikmU0NfYWJzX2kxNiB9LAorICAgIHsgIl9aM2Fic2MiLCAodm9pZCAqKSZTQ19hYnNfaTggfSwKKyAgICB7ICJfWjNjbHpqIiwgKHZvaWQgKikmU0NfY2x6X3UzMiB9LAorICAgIHsgIl9aM2NsenQiLCAodm9pZCAqKSZTQ19jbHpfdTE2IH0sCisgICAgeyAiX1ozY2x6aCIsICh2b2lkICopJlNDX2Nsel91OCB9LAorICAgIHsgIl9aM2NsemkiLCAodm9pZCAqKSZTQ19jbHpfaTMyIH0sCisgICAgeyAiX1ozY2x6cyIsICh2b2lkICopJlNDX2Nsel9pMTYgfSwKKyAgICB7ICJfWjNjbHpjIiwgKHZvaWQgKikmU0NfY2x6X2k4IH0sCisgICAgeyAiX1ozbWF4amoiLCAodm9pZCAqKSZTQ19tYXhfdTMyIH0sCisgICAgeyAiX1ozbWF4dHQiLCAodm9pZCAqKSZTQ19tYXhfdTE2IH0sCisgICAgeyAiX1ozbWF4aGgiLCAodm9pZCAqKSZTQ19tYXhfdTggfSwKKyAgICB7ICJfWjNtYXhpaSIsICh2b2lkICopJlNDX21heF9pMzIgfSwKKyAgICB7ICJfWjNtYXhzcyIsICh2b2lkICopJlNDX21heF9pMTYgfSwKKyAgICB7ICJfWjNtYXhjYyIsICh2b2lkICopJlNDX21heF9pOCB9LAorICAgIHsgIl9aM21pbmpqIiwgKHZvaWQgKikmU0NfbWluX3UzMiB9LAorICAgIHsgIl9aM21pbnR0IiwgKHZvaWQgKikmU0NfbWluX3UxNiB9LAorICAgIHsgIl9aM21pbmhoIiwgKHZvaWQgKikmU0NfbWluX3U4IH0sCisgICAgeyAiX1ozbWluaWkiLCAodm9pZCAqKSZTQ19taW5faTMyIH0sCisgICAgeyAiX1ozbWluc3MiLCAodm9pZCAqKSZTQ19taW5faTE2IH0sCisgICAgeyAiX1ozbWluY2MiLCAodm9pZCAqKSZTQ19taW5faTggfSwKKworICAgIC8vIE9wZW5DTCA2LjExLjQKKyAgICB7ICJfWjVjbGFtcGZmZiIsICh2b2lkICopJlNDX2NsYW1wX2YzMiB9LAorICAgIHsgIl9aN2RlZ3JlZXNmIiwgKHZvaWQgKikmU0NfZGVncmVlcyB9LAorICAgIHsgIl9aM21heGZmIiwgKHZvaWQgKikmU0NfbWF4X2YzMiB9LAorICAgIHsgIl9aM21pbmZmIiwgKHZvaWQgKikmU0NfbWluX2YzMiB9LAorICAgIHsgIl9aM21peGZmZiIsICh2b2lkICopJlNDX21peF9mMzIgfSwKKyAgICB7ICJfWjdyYWRpYW5zZiIsICh2b2lkICopJlNDX3JhZGlhbnMgfSwKKyAgICB7ICJfWjRzdGVwZmYiLCAodm9pZCAqKSZTQ19zdGVwX2YzMiB9LAorICAgIC8veyAic21vb3Roc3RlcCIsICh2b2lkICopJiB9LAorICAgIHsgIl9aNHNpZ25mIiwgKHZvaWQgKikmU0Nfc2lnbl9mMzIgfSwKKworICAgIHsgTlVMTCwgTlVMTCB9Cit9OworCitjb25zdCBTY3JpcHRDU3RhdGU6OlN5bWJvbFRhYmxlX3QgKiBTY3JpcHRDU3RhdGU6Omxvb2t1cFN5bWJvbENMKGNvbnN0IGNoYXIgKnN5bSkKK3sKKyAgICBTY3JpcHRDU3RhdGU6OlN5bWJvbFRhYmxlX3QgKnN5bXMgPSBnU3ltczsKKworICAgIHdoaWxlIChzeW1zLT5tUHRyKSB7CisgICAgICAgIGlmICghc3RyY21wKHN5bXMtPm1OYW1lLCBzeW0pKSB7CisgICAgICAgICAgICByZXR1cm4gc3ltczsKKyAgICAgICAgfQorICAgICAgICBzeW1zKys7CisgICAgfQorICAgIHJldHVybiBOVUxMOworfQorCmRpZmYgLS1naXQgYS9saWJzL3JzL3JzU2NyaXB0Q19MaWJHTC5jcHAgYi9saWJzL3JzL3JzU2NyaXB0Q19MaWJHTC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmY4Zjc5YQotLS0gL2Rldi9udWxsCisrKyBiL2xpYnMvcnMvcnNTY3JpcHRDX0xpYkdMLmNwcApAQCAtMCwwICsxLDQ0MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlICJyc0NvbnRleHQuaCIKKyNpbmNsdWRlICJyc1NjcmlwdEMuaCIKKyNpbmNsdWRlICJyc01hdHJpeC5oIgorCisjaW5jbHVkZSAidXRpbHMvVGltZXJzLmgiCisKKyNkZWZpbmUgR0xfR0xFWFRfUFJPVE9UWVBFUworCisjaW5jbHVkZSA8R0xFUy9nbC5oPgorI2luY2x1ZGUgPEdMRVMvZ2xleHQuaD4KKyNpbmNsdWRlIDxHTEVTMi9nbDIuaD4KKyNpbmNsdWRlIDxHTEVTMi9nbDJleHQuaD4KKworI2luY2x1ZGUgPHRpbWUuaD4KKwordXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7Cit1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDo6cmVuZGVyc2NyaXB0OworCisjZGVmaW5lIEdFVF9UTFMoKSAgQ29udGV4dDo6U2NyaXB0VExTU3RydWN0ICogdGxzID0gXAorICAgIChDb250ZXh0OjpTY3JpcHRUTFNTdHJ1Y3QgKilwdGhyZWFkX2dldHNwZWNpZmljKENvbnRleHQ6OmdUaHJlYWRUTFNLZXkpOyBcCisgICAgQ29udGV4dCAqIHJzYyA9IHRscy0+bUNvbnRleHQ7IFwKKyAgICBTY3JpcHRDICogc2MgPSAoU2NyaXB0QyAqKSB0bHMtPm1TY3JpcHQKKworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIENvbnRleHQKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitzdGF0aWMgdm9pZCBTQ19iaW5kVGV4dHVyZShSc1Byb2dyYW1GcmFnbWVudCB2cGYsIHVpbnQzMl90IHNsb3QsIFJzQWxsb2NhdGlvbiB2YSkKK3sKKyAgICBHRVRfVExTKCk7CisgICAgcnNpX1Byb2dyYW1CaW5kVGV4dHVyZShyc2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxQcm9ncmFtRnJhZ21lbnQgKj4odnBmKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHNsb3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxBbGxvY2F0aW9uICo+KHZhKSk7CisKK30KKworc3RhdGljIHZvaWQgU0NfYmluZFNhbXBsZXIoUnNQcm9ncmFtRnJhZ21lbnQgdnBmLCB1aW50MzJfdCBzbG90LCBSc1NhbXBsZXIgdnMpCit7CisgICAgR0VUX1RMUygpOworICAgIHJzaV9Qcm9ncmFtQmluZFNhbXBsZXIocnNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8UHJvZ3JhbUZyYWdtZW50ICo+KHZwZiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzbG90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8U2FtcGxlciAqPih2cykpOworCit9CisKK3N0YXRpYyB2b2lkIFNDX2JpbmRQcm9ncmFtU3RvcmUoUnNQcm9ncmFtU3RvcmUgcGZzKQoreworICAgIEdFVF9UTFMoKTsKKyAgICByc2lfQ29udGV4dEJpbmRQcm9ncmFtU3RvcmUocnNjLCBwZnMpOworfQorCitzdGF0aWMgdm9pZCBTQ19iaW5kUHJvZ3JhbUZyYWdtZW50KFJzUHJvZ3JhbUZyYWdtZW50IHBmKQoreworICAgIEdFVF9UTFMoKTsKKyAgICByc2lfQ29udGV4dEJpbmRQcm9ncmFtRnJhZ21lbnQocnNjLCBwZik7Cit9CisKK3N0YXRpYyB2b2lkIFNDX2JpbmRQcm9ncmFtVmVydGV4KFJzUHJvZ3JhbVZlcnRleCBwdikKK3sKKyAgICBHRVRfVExTKCk7CisgICAgcnNpX0NvbnRleHRCaW5kUHJvZ3JhbVZlcnRleChyc2MsIHB2KTsKK30KKworc3RhdGljIHZvaWQgU0NfYmluZFByb2dyYW1SYXN0ZXIoUnNQcm9ncmFtUmFzdGVyIHB2KQoreworICAgIEdFVF9UTFMoKTsKKyAgICByc2lfQ29udGV4dEJpbmRQcm9ncmFtUmFzdGVyKHJzYywgcHYpOworfQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIFZQCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworc3RhdGljIHZvaWQgU0NfdnBMb2FkUHJvamVjdGlvbk1hdHJpeChjb25zdCByc2NfTWF0cml4ICptKQoreworICAgIEdFVF9UTFMoKTsKKyAgICByc2MtPmdldFZlcnRleCgpLT5zZXRQcm9qZWN0aW9uTWF0cml4KG0pOworfQorCitzdGF0aWMgdm9pZCBTQ192cExvYWRNb2RlbE1hdHJpeChjb25zdCByc2NfTWF0cml4ICptKQoreworICAgIEdFVF9UTFMoKTsKKyAgICByc2MtPmdldFZlcnRleCgpLT5zZXRNb2RlbHZpZXdNYXRyaXgobSk7Cit9CisKK3N0YXRpYyB2b2lkIFNDX3ZwTG9hZFRleHR1cmVNYXRyaXgoY29uc3QgcnNjX01hdHJpeCAqbSkKK3sKKyAgICBHRVRfVExTKCk7CisgICAgcnNjLT5nZXRWZXJ0ZXgoKS0+c2V0VGV4dHVyZU1hdHJpeChtKTsKK30KKworCitzdGF0aWMgdm9pZCBTQ19wZkNvbnN0YW50Q29sb3IoUnNQcm9ncmFtRnJhZ21lbnQgdnBmLCBmbG9hdCByLCBmbG9hdCBnLCBmbG9hdCBiLCBmbG9hdCBhKQoreworICAgIC8vR0VUX1RMUygpOworICAgIFByb2dyYW1GcmFnbWVudCAqcGYgPSBzdGF0aWNfY2FzdDxQcm9ncmFtRnJhZ21lbnQgKj4odnBmKTsKKyAgICBwZi0+c2V0Q29uc3RhbnRDb2xvcihyLCBnLCBiLCBhKTsKK30KKworc3RhdGljIHZvaWQgU0NfdnBHZXRQcm9qZWN0aW9uTWF0cml4KHJzY19NYXRyaXggKm0pCit7CisgICAgR0VUX1RMUygpOworICAgIHJzYy0+Z2V0VmVydGV4KCktPmdldFByb2plY3Rpb25NYXRyaXgobSk7Cit9CisKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBEcmF3aW5nCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworc3RhdGljIHZvaWQgU0NfZHJhd1F1YWRUZXhDb29yZHMoZmxvYXQgeDEsIGZsb2F0IHkxLCBmbG9hdCB6MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHUxLCBmbG9hdCB2MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHgyLCBmbG9hdCB5MiwgZmxvYXQgejIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCB1MiwgZmxvYXQgdjIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCB4MywgZmxvYXQgeTMsIGZsb2F0IHozLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgdTMsIGZsb2F0IHYzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgeDQsIGZsb2F0IHk0LCBmbG9hdCB6NCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHU0LCBmbG9hdCB2NCkKK3sKKyAgICBHRVRfVExTKCk7CisgICAgaWYgKCFyc2MtPnNldHVwQ2hlY2soKSkgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLy9MT0dFKCJRdWFkIik7CisgICAgLy9MT0dFKCIlNC4yZiwgJTQuMmYsICU0LjJmIiwgeDEsIHkxLCB6MSk7CisgICAgLy9MT0dFKCIlNC4yZiwgJTQuMmYsICU0LjJmIiwgeDIsIHkyLCB6Mik7CisgICAgLy9MT0dFKCIlNC4yZiwgJTQuMmYsICU0LjJmIiwgeDMsIHkzLCB6Myk7CisgICAgLy9MT0dFKCIlNC4yZiwgJTQuMmYsICU0LjJmIiwgeDQsIHk0LCB6NCk7CisKKyAgICBmbG9hdCB2dHhbXSA9IHt4MSx5MSx6MSwgeDIseTIsejIsIHgzLHkzLHozLCB4NCx5NCx6NH07CisgICAgY29uc3QgZmxvYXQgdGV4W10gPSB7dTEsdjEsIHUyLHYyLCB1Myx2MywgdTQsdjR9OworCisgICAgVmVydGV4QXJyYXkgdmE7CisgICAgdmEuYWRkKEdMX0ZMT0FULCAzLCAxMiwgZmFsc2UsICh1aW50MzJfdCl2dHgsICJwb3NpdGlvbiIpOworICAgIHZhLmFkZChHTF9GTE9BVCwgMiwgOCwgZmFsc2UsICh1aW50MzJfdCl0ZXgsICJ0ZXh0dXJlMCIpOworICAgIHZhLnNldHVwR0wyKHJzYywgJnJzYy0+bVN0YXRlVmVydGV4QXJyYXksICZyc2MtPm1TaGFkZXJDYWNoZSk7CisKKyAgICBnbERyYXdBcnJheXMoR0xfVFJJQU5HTEVfRkFOLCAwLCA0KTsKK30KKworc3RhdGljIHZvaWQgU0NfZHJhd1F1YWQoZmxvYXQgeDEsIGZsb2F0IHkxLCBmbG9hdCB6MSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHgyLCBmbG9hdCB5MiwgZmxvYXQgejIsCisgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCB4MywgZmxvYXQgeTMsIGZsb2F0IHozLAorICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgeDQsIGZsb2F0IHk0LCBmbG9hdCB6NCkKK3sKKyAgICBTQ19kcmF3UXVhZFRleENvb3Jkcyh4MSwgeTEsIHoxLCAwLCAxLAorICAgICAgICAgICAgICAgICAgICAgICAgIHgyLCB5MiwgejIsIDEsIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgeDMsIHkzLCB6MywgMSwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICB4NCwgeTQsIHo0LCAwLCAwKTsKK30KKworc3RhdGljIHZvaWQgU0NfZHJhd1Nwcml0ZVNjcmVlbnNwYWNlKGZsb2F0IHgsIGZsb2F0IHksIGZsb2F0IHosIGZsb2F0IHcsIGZsb2F0IGgpCit7CisgICAgR0VUX1RMUygpOworICAgIE9iamVjdEJhc2VSZWY8Y29uc3QgUHJvZ3JhbVZlcnRleD4gdG1wKHJzYy0+Z2V0VmVydGV4KCkpOworICAgIHJzYy0+c2V0VmVydGV4KHJzYy0+Z2V0RGVmYXVsdFByb2dyYW1WZXJ0ZXgoKSk7CisgICAgLy9yc2MtPnNldHVwQ2hlY2soKTsKKworICAgIC8vR0xpbnQgY3JvcFs0XSA9IHswLCBoLCB3LCAtaH07CisKKyAgICBmbG9hdCBzaCA9IHJzYy0+Z2V0SGVpZ2h0KCk7CisKKyAgICBTQ19kcmF3UXVhZCh4LCAgIHNoIC0geSwgICAgIHosCisgICAgICAgICAgICAgICAgeCt3LCBzaCAtIHksICAgICB6LAorICAgICAgICAgICAgICAgIHgrdywgc2ggLSAoeStoKSwgeiwKKyAgICAgICAgICAgICAgICB4LCAgIHNoIC0gKHkraCksIHopOworICAgIHJzYy0+c2V0VmVydGV4KChQcm9ncmFtVmVydGV4ICopdG1wLmdldCgpKTsKK30KKy8qCitzdGF0aWMgdm9pZCBTQ19kcmF3U3ByaXRlKGZsb2F0IHgsIGZsb2F0IHksIGZsb2F0IHosIGZsb2F0IHcsIGZsb2F0IGgpCit7CisgICAgR0VUX1RMUygpOworICAgIGZsb2F0IHZpblszXSA9IHt4LCB5LCB6fTsKKyAgICBmbG9hdCB2b3V0WzRdOworCisgICAgLy9MT0dFKCJkcyAgaW4gJWYgJWYgJWYiLCB4LCB5LCB6KTsKKyAgICByc2MtPmdldFZlcnRleCgpLT50cmFuc2Zvcm1Ub1NjcmVlbihyc2MsIHZvdXQsIHZpbik7CisgICAgLy9MT0dFKCJkcyAgb3V0ICVmICVmICVmICVmIiwgdm91dFswXSwgdm91dFsxXSwgdm91dFsyXSwgdm91dFszXSk7CisgICAgdm91dFswXSAvPSB2b3V0WzNdOworICAgIHZvdXRbMV0gLz0gdm91dFszXTsKKyAgICB2b3V0WzJdIC89IHZvdXRbM107CisKKyAgICB2b3V0WzBdICo9IHJzYy0+Z2V0V2lkdGgoKSAvIDI7CisgICAgdm91dFsxXSAqPSByc2MtPmdldEhlaWdodCgpIC8gMjsKKyAgICB2b3V0WzBdICs9IHJzYy0+Z2V0V2lkdGgoKSAvIDI7CisgICAgdm91dFsxXSArPSByc2MtPmdldEhlaWdodCgpIC8gMjsKKworICAgIHZvdXRbMF0gLT0gdy8yOworICAgIHZvdXRbMV0gLT0gaC8yOworCisgICAgLy9MT0dFKCJkcyAgb3V0MiAlZiAlZiAlZiIsIHZvdXRbMF0sIHZvdXRbMV0sIHZvdXRbMl0pOworCisgICAgLy8gVSwgViwgVywgSAorICAgIFNDX2RyYXdTcHJpdGVTY3JlZW5zcGFjZSh2b3V0WzBdLCB2b3V0WzFdLCB6LCBoLCB3KTsKKyAgICAvL3JzYy0+c2V0dXBDaGVjaygpOworfQorKi8KKworc3RhdGljIHZvaWQgU0NfZHJhd1JlY3QoZmxvYXQgeDEsIGZsb2F0IHkxLAorICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgeDIsIGZsb2F0IHkyLCBmbG9hdCB6KQoreworICAgIC8vTE9HRSgiU0NfZHJhd1JlY3QgJWYsJWYgICVmLCVmICAlZiIsIHgxLCB5MSwgeDIsIHkyLCB6KTsKKyAgICBTQ19kcmF3UXVhZCh4MSwgeTIsIHosCisgICAgICAgICAgICAgICAgeDIsIHkyLCB6LAorICAgICAgICAgICAgICAgIHgyLCB5MSwgeiwKKyAgICAgICAgICAgICAgICB4MSwgeTEsIHopOworfQorCitzdGF0aWMgdm9pZCBTQ19kcmF3TWVzaChSc01lc2ggdnNtKQoreworICAgIEdFVF9UTFMoKTsKKyAgICBNZXNoICpzbSA9IHN0YXRpY19jYXN0PE1lc2ggKj4odnNtKTsKKyAgICBpZiAoIXJzYy0+c2V0dXBDaGVjaygpKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgc20tPnJlbmRlcihyc2MpOworfQorCitzdGF0aWMgdm9pZCBTQ19kcmF3TWVzaFByaW1pdGl2ZShSc01lc2ggdnNtLCB1aW50MzJfdCBwcmltSW5kZXgpCit7CisgICAgR0VUX1RMUygpOworICAgIE1lc2ggKnNtID0gc3RhdGljX2Nhc3Q8TWVzaCAqPih2c20pOworICAgIGlmICghcnNjLT5zZXR1cENoZWNrKCkpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBzbS0+cmVuZGVyUHJpbWl0aXZlKHJzYywgcHJpbUluZGV4KTsKK30KKworc3RhdGljIHZvaWQgU0NfZHJhd01lc2hQcmltaXRpdmVSYW5nZShSc01lc2ggdnNtLCB1aW50MzJfdCBwcmltSW5kZXgsIHVpbnQzMl90IHN0YXJ0LCB1aW50MzJfdCBsZW4pCit7CisgICAgR0VUX1RMUygpOworICAgIE1lc2ggKnNtID0gc3RhdGljX2Nhc3Q8TWVzaCAqPih2c20pOworICAgIGlmICghcnNjLT5zZXR1cENoZWNrKCkpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBzbS0+cmVuZGVyUHJpbWl0aXZlUmFuZ2UocnNjLCBwcmltSW5kZXgsIHN0YXJ0LCBsZW4pOworfQorCitzdGF0aWMgdm9pZCBTQ19tZXNoQ29tcHV0ZUJvdW5kaW5nQm94KFJzTWVzaCB2c20sIGZsb2F0ICptaW5YLCBmbG9hdCAqbWluWSwgZmxvYXQgKm1pblosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0ICptYXhYLCBmbG9hdCAqbWF4WSwgZmxvYXQgKm1heFopCit7CisgICAgR0VUX1RMUygpOworICAgIE1lc2ggKnNtID0gc3RhdGljX2Nhc3Q8TWVzaCAqPih2c20pOworICAgIHNtLT5jb21wdXRlQkJveCgpOworICAgICptaW5YID0gc20tPm1CQm94TWluWzBdOworICAgICptaW5ZID0gc20tPm1CQm94TWluWzFdOworICAgICptaW5aID0gc20tPm1CQm94TWluWzJdOworICAgICptYXhYID0gc20tPm1CQm94TWF4WzBdOworICAgICptYXhZID0gc20tPm1CQm94TWF4WzFdOworICAgICptYXhaID0gc20tPm1CQm94TWF4WzJdOworfQorCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisKK3N0YXRpYyB2b2lkIFNDX2NvbG9yKGZsb2F0IHIsIGZsb2F0IGcsIGZsb2F0IGIsIGZsb2F0IGEpCit7CisgICAgR0VUX1RMUygpOworICAgIFByb2dyYW1GcmFnbWVudCAqcGYgPSAoUHJvZ3JhbUZyYWdtZW50ICopcnNjLT5nZXRGcmFnbWVudCgpOworICAgIHBmLT5zZXRDb25zdGFudENvbG9yKHIsIGcsIGIsIGEpOworfQorCitzdGF0aWMgdm9pZCBTQ191cGxvYWRUb1RleHR1cmUyKFJzQWxsb2NhdGlvbiB2YSwgdWludDMyX3QgYmFzZU1pcExldmVsKQoreworICAgIEdFVF9UTFMoKTsKKyAgICByc2lfQWxsb2NhdGlvblVwbG9hZFRvVGV4dHVyZShyc2MsIHZhLCBmYWxzZSwgYmFzZU1pcExldmVsKTsKK30KK3N0YXRpYyB2b2lkIFNDX3VwbG9hZFRvVGV4dHVyZShSc0FsbG9jYXRpb24gdmEpCit7CisgICAgR0VUX1RMUygpOworICAgIHJzaV9BbGxvY2F0aW9uVXBsb2FkVG9UZXh0dXJlKHJzYywgdmEsIGZhbHNlLCAwKTsKK30KKworc3RhdGljIHZvaWQgU0NfdXBsb2FkVG9CdWZmZXJPYmplY3QoUnNBbGxvY2F0aW9uIHZhKQoreworICAgIEdFVF9UTFMoKTsKKyAgICByc2lfQWxsb2NhdGlvblVwbG9hZFRvQnVmZmVyT2JqZWN0KHJzYywgdmEpOworfQorCitzdGF0aWMgdm9pZCBTQ19DbGVhckNvbG9yKGZsb2F0IHIsIGZsb2F0IGcsIGZsb2F0IGIsIGZsb2F0IGEpCit7CisgICAgR0VUX1RMUygpOworICAgIGlmICghcnNjLT5zZXR1cENoZWNrKCkpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGdsQ2xlYXJDb2xvcihyLCBnLCBiLCBhKTsKKyAgICBnbENsZWFyKEdMX0NPTE9SX0JVRkZFUl9CSVQpOworfQorCitzdGF0aWMgdm9pZCBTQ19DbGVhckRlcHRoKGZsb2F0IHYpCit7CisgICAgR0VUX1RMUygpOworICAgIGlmICghcnNjLT5zZXR1cENoZWNrKCkpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGdsQ2xlYXJEZXB0aGYodik7CisgICAgZ2xDbGVhcihHTF9ERVBUSF9CVUZGRVJfQklUKTsKK30KKworc3RhdGljIHVpbnQzMl90IFNDX2dldFdpZHRoKCkKK3sKKyAgICBHRVRfVExTKCk7CisgICAgcmV0dXJuIHJzYy0+Z2V0V2lkdGgoKTsKK30KKworc3RhdGljIHVpbnQzMl90IFNDX2dldEhlaWdodCgpCit7CisgICAgR0VUX1RMUygpOworICAgIHJldHVybiByc2MtPmdldEhlaWdodCgpOworfQorCitzdGF0aWMgdm9pZCBTQ19EcmF3VGV4dEFsbG9jKFJzQWxsb2NhdGlvbiB2YSwgaW50IHgsIGludCB5KQoreworICAgIEdFVF9UTFMoKTsKKyAgICBBbGxvY2F0aW9uICphbGxvYyA9IHN0YXRpY19jYXN0PEFsbG9jYXRpb24gKj4odmEpOworICAgIHJzYy0+bVN0YXRlRm9udC5yZW5kZXJUZXh0KGFsbG9jLCB4LCB5KTsKK30KKworc3RhdGljIHZvaWQgU0NfRHJhd1RleHQoY29uc3QgY2hhciAqdGV4dCwgaW50IHgsIGludCB5KQoreworICAgIEdFVF9UTFMoKTsKKyAgICByc2MtPm1TdGF0ZUZvbnQucmVuZGVyVGV4dCh0ZXh0LCB4LCB5KTsKK30KKworc3RhdGljIHZvaWQgU0NfQmluZEZvbnQoUnNGb250IGZvbnQpCit7CisgICAgR0VUX1RMUygpOworICAgIHJzaV9Db250ZXh0QmluZEZvbnQocnNjLCBmb250KTsKK30KKworc3RhdGljIHZvaWQgU0NfRm9udENvbG9yKGZsb2F0IHIsIGZsb2F0IGcsIGZsb2F0IGIsIGZsb2F0IGEpCit7CisgICAgR0VUX1RMUygpOworICAgIHJzYy0+bVN0YXRlRm9udC5zZXRGb250Q29sb3IociwgZywgYiwgYSk7Cit9CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gQ2xhc3MgaW1wbGVtZW50YXRpb24KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisvLyBsbHZtIG5hbWUgbWFuZ2xpbmcgcmVmCisvLyAgPGJ1aWx0aW4tdHlwZT4gOjo9IHYgICMgdm9pZAorLy8gICAgICAgICAgICAgICAgIDo6PSBiICAjIGJvb2wKKy8vICAgICAgICAgICAgICAgICA6Oj0gYyAgIyBjaGFyCisvLyAgICAgICAgICAgICAgICAgOjo9IGEgICMgc2lnbmVkIGNoYXIKKy8vICAgICAgICAgICAgICAgICA6Oj0gaCAgIyB1bnNpZ25lZCBjaGFyCisvLyAgICAgICAgICAgICAgICAgOjo9IHMgICMgc2hvcnQKKy8vICAgICAgICAgICAgICAgICA6Oj0gdCAgIyB1bnNpZ25lZCBzaG9ydAorLy8gICAgICAgICAgICAgICAgIDo6PSBpICAjIGludAorLy8gICAgICAgICAgICAgICAgIDo6PSBqICAjIHVuc2lnbmVkIGludAorLy8gICAgICAgICAgICAgICAgIDo6PSBsICAjIGxvbmcKKy8vICAgICAgICAgICAgICAgICA6Oj0gbSAgIyB1bnNpZ25lZCBsb25nCisvLyAgICAgICAgICAgICAgICAgOjo9IHggICMgbG9uZyBsb25nLCBfX2ludDY0CisvLyAgICAgICAgICAgICAgICAgOjo9IHkgICMgdW5zaWduZWQgbG9uZyBsb25nLCBfX2ludDY0CisvLyAgICAgICAgICAgICAgICAgOjo9IGYgICMgZmxvYXQKKy8vICAgICAgICAgICAgICAgICA6Oj0gZCAgIyBkb3VibGUKKworc3RhdGljIFNjcmlwdENTdGF0ZTo6U3ltYm9sVGFibGVfdCBnU3ltc1tdID0geworICAgIHsgIl9aMjJyc2dCaW5kUHJvZ3JhbUZyYWdtZW50MTlyc19wcm9ncmFtX2ZyYWdtZW50IiwgKHZvaWQgKikmU0NfYmluZFByb2dyYW1GcmFnbWVudCB9LAorICAgIHsgIl9aMTlyc2dCaW5kUHJvZ3JhbVN0b3JlMTZyc19wcm9ncmFtX3N0b3JlIiwgKHZvaWQgKikmU0NfYmluZFByb2dyYW1TdG9yZSB9LAorICAgIHsgIl9aMjByc2dCaW5kUHJvZ3JhbVZlcnRleDE3cnNfcHJvZ3JhbV92ZXJ0ZXgiLCAodm9pZCAqKSZTQ19iaW5kUHJvZ3JhbVZlcnRleCB9LAorICAgIHsgIl9aMjByc2dCaW5kUHJvZ3JhbVJhc3RlcjE3cnNfcHJvZ3JhbV9yYXN0ZXIiLCAodm9pZCAqKSZTQ19iaW5kUHJvZ3JhbVJhc3RlciB9LAorICAgIHsgIl9aMTRyc2dCaW5kU2FtcGxlcjE5cnNfcHJvZ3JhbV9mcmFnbWVudGoxMHJzX3NhbXBsZXIiLCAodm9pZCAqKSZTQ19iaW5kU2FtcGxlciB9LAorICAgIHsgIl9aMTRyc2dCaW5kVGV4dHVyZTE5cnNfcHJvZ3JhbV9mcmFnbWVudGoxM3JzX2FsbG9jYXRpb24iLCAodm9pZCAqKSZTQ19iaW5kVGV4dHVyZSB9LAorCisgICAgeyAiX1ozNnJzZ1Byb2dyYW1WZXJ0ZXhMb2FkUHJvamVjdGlvbk1hdHJpeFBLMTJyc19tYXRyaXg0eDQiLCAodm9pZCAqKSZTQ192cExvYWRQcm9qZWN0aW9uTWF0cml4IH0sCisgICAgeyAiX1ozMXJzZ1Byb2dyYW1WZXJ0ZXhMb2FkTW9kZWxNYXRyaXhQSzEycnNfbWF0cml4NHg0IiwgKHZvaWQgKikmU0NfdnBMb2FkTW9kZWxNYXRyaXggfSwKKyAgICB7ICJfWjMzcnNnUHJvZ3JhbVZlcnRleExvYWRUZXh0dXJlTWF0cml4UEsxMnJzX21hdHJpeDR4NCIsICh2b2lkICopJlNDX3ZwTG9hZFRleHR1cmVNYXRyaXggfSwKKworICAgIHsgIl9aMzVyc2dQcm9ncmFtVmVydGV4R2V0UHJvamVjdGlvbk1hdHJpeFAxMnJzX21hdHJpeDR4NCIsICh2b2lkICopJlNDX3ZwR2V0UHJvamVjdGlvbk1hdHJpeCB9LAorCisgICAgeyAiX1ozMXJzZ1Byb2dyYW1GcmFnbWVudENvbnN0YW50Q29sb3IxOXJzX3Byb2dyYW1fZnJhZ21lbnRmZmZmIiwgKHZvaWQgKikmU0NfcGZDb25zdGFudENvbG9yIH0sCisKKyAgICB7ICJfWjExcnNnR2V0V2lkdGh2IiwgKHZvaWQgKikmU0NfZ2V0V2lkdGggfSwKKyAgICB7ICJfWjEycnNnR2V0SGVpZ2h0diIsICh2b2lkICopJlNDX2dldEhlaWdodCB9LAorCisgICAgeyAiX1oxOHJzZ1VwbG9hZFRvVGV4dHVyZTEzcnNfYWxsb2NhdGlvbmoiLCAodm9pZCAqKSZTQ191cGxvYWRUb1RleHR1cmUyIH0sCisgICAgeyAiX1oxOHJzZ1VwbG9hZFRvVGV4dHVyZTEzcnNfYWxsb2NhdGlvbiIsICh2b2lkICopJlNDX3VwbG9hZFRvVGV4dHVyZSB9LAorICAgIHsgIl9aMjNyc2dVcGxvYWRUb0J1ZmZlck9iamVjdDEzcnNfYWxsb2NhdGlvbiIsICh2b2lkICopJlNDX3VwbG9hZFRvQnVmZmVyT2JqZWN0IH0sCisKKyAgICB7ICJfWjExcnNnRHJhd1JlY3RmZmZmZiIsICh2b2lkICopJlNDX2RyYXdSZWN0IH0sCisgICAgeyAiX1oxMXJzZ0RyYXdRdWFkZmZmZmZmZmZmZmZmIiwgKHZvaWQgKikmU0NfZHJhd1F1YWQgfSwKKyAgICB7ICJfWjIwcnNnRHJhd1F1YWRUZXhDb29yZHNmZmZmZmZmZmZmZmZmZmZmZmZmZiIsICh2b2lkICopJlNDX2RyYXdRdWFkVGV4Q29vcmRzIH0sCisgICAgeyAiX1oyNHJzZ0RyYXdTcHJpdGVTY3JlZW5zcGFjZWZmZmZmIiwgKHZvaWQgKikmU0NfZHJhd1Nwcml0ZVNjcmVlbnNwYWNlIH0sCisKKyAgICB7ICJfWjExcnNnRHJhd01lc2g3cnNfbWVzaCIsICh2b2lkICopJlNDX2RyYXdNZXNoIH0sCisgICAgeyAiX1oxMXJzZ0RyYXdNZXNoN3JzX21lc2hqIiwgKHZvaWQgKikmU0NfZHJhd01lc2hQcmltaXRpdmUgfSwKKyAgICB7ICJfWjExcnNnRHJhd01lc2g3cnNfbWVzaGpqaiIsICh2b2lkICopJlNDX2RyYXdNZXNoUHJpbWl0aXZlUmFuZ2UgfSwKKyAgICB7ICJfWjI1cnNnTWVzaENvbXB1dGVCb3VuZGluZ0JveDdyc19tZXNoUGZTMF9TMF9TMF9TMF9TMF8iLCAodm9pZCAqKSZTQ19tZXNoQ29tcHV0ZUJvdW5kaW5nQm94IH0sCisKKyAgICB7ICJfWjEzcnNnQ2xlYXJDb2xvcmZmZmYiLCAodm9pZCAqKSZTQ19DbGVhckNvbG9yIH0sCisgICAgeyAiX1oxM3JzZ0NsZWFyRGVwdGhmIiwgKHZvaWQgKikmU0NfQ2xlYXJEZXB0aCB9LAorCisgICAgeyAiX1oxMXJzZ0RyYXdUZXh0UEtjaWkiLCAodm9pZCAqKSZTQ19EcmF3VGV4dCB9LAorICAgIHsgIl9aMTFyc2dEcmF3VGV4dDEzcnNfYWxsb2NhdGlvbmlpIiwgKHZvaWQgKikmU0NfRHJhd1RleHRBbGxvYyB9LAorCisgICAgeyAiX1oxMXJzZ0JpbmRGb250N3JzX2ZvbnQiLCAodm9pZCAqKSZTQ19CaW5kRm9udCB9LAorICAgIHsgIl9aMTJyc2dGb250Q29sb3JmZmZmIiwgKHZvaWQgKikmU0NfRm9udENvbG9yIH0sCisKKyAgICAvLyBtaXNjCisgICAgeyAiX1o1Y29sb3JmZmZmIiwgKHZvaWQgKikmU0NfY29sb3IgfSwKKworICAgIHsgTlVMTCwgTlVMTCB9Cit9OworCitjb25zdCBTY3JpcHRDU3RhdGU6OlN5bWJvbFRhYmxlX3QgKiBTY3JpcHRDU3RhdGU6Omxvb2t1cFN5bWJvbEdMKGNvbnN0IGNoYXIgKnN5bSkKK3sKKyAgICBTY3JpcHRDU3RhdGU6OlN5bWJvbFRhYmxlX3QgKnN5bXMgPSBnU3ltczsKKworICAgIHdoaWxlIChzeW1zLT5tUHRyKSB7CisgICAgICAgIGlmICghc3RyY21wKHN5bXMtPm1OYW1lLCBzeW0pKSB7CisgICAgICAgICAgICByZXR1cm4gc3ltczsKKyAgICAgICAgfQorICAgICAgICBzeW1zKys7CisgICAgfQorICAgIHJldHVybiBOVUxMOworfQorCmRpZmYgLS1naXQgYS9saWJzL3JzL3JzU2hhZGVyQ2FjaGUuY3BwIGIvbGlicy9ycy9yc1NoYWRlckNhY2hlLmNwcAppbmRleCA0NzExZDFiLi41YzA3M2IzIDEwMDY0NAotLS0gYS9saWJzL3JzL3JzU2hhZGVyQ2FjaGUuY3BwCisrKyBiL2xpYnMvcnMvcnNTaGFkZXJDYWNoZS5jcHAKQEAgLTE0LDEwICsxNCwxNCBAQAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAorI2lmbmRlZiBBTkRST0lEX1JTX0JVSUxEX0ZPUl9IT1NUCiAjaW5jbHVkZSAicnNDb250ZXh0LmgiCi0KICNpbmNsdWRlIDxHTEVTL2dsLmg+CiAjaW5jbHVkZSA8R0xFUzIvZ2wyLmg+CisjZWxzZQorI2luY2x1ZGUgInJzQ29udGV4dEhvc3RTdHViLmgiCisjaW5jbHVkZSA8T3BlbkdML2dsLmg+CisjZW5kaWYgLy9BTkRST0lEX1JTX0JVSUxEX0ZPUl9IT1NUCiAKIHVzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOwogdXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ6OnJlbmRlcnNjcmlwdDsKQEAgLTk0LDE2ICs5OCwxMCBAQAogICAgICAgICBnbEF0dGFjaFNoYWRlcihwZ20sIGZyYWctPmdldFNoYWRlcklEKCkpOwogCiAgICAgICAgIGlmICghdnR4LT5pc1VzZXJQcm9ncmFtKCkpIHsKLSAgICAgICAgICAgIGdsQmluZEF0dHJpYkxvY2F0aW9uKHBnbSwgMCwgIkFUVFJJQl9MZWdhY3lQb3NpdGlvbiIpOwotICAgICAgICAgICAgZ2xCaW5kQXR0cmliTG9jYXRpb24ocGdtLCAxLCAiQVRUUklCX0xlZ2FjeUNvbG9yIik7Ci0gICAgICAgICAgICBnbEJpbmRBdHRyaWJMb2NhdGlvbihwZ20sIDIsICJBVFRSSUJfTGVnYWN5Tm9ybWFsIik7Ci0gICAgICAgICAgICBnbEJpbmRBdHRyaWJMb2NhdGlvbihwZ20sIDMsICJBVFRSSUJfTGVnYWN5UG9pbnRTaXplIik7Ci0gICAgICAgICAgICBnbEJpbmRBdHRyaWJMb2NhdGlvbihwZ20sIDQsICJBVFRSSUJfTGVnYWN5VGV4dHVyZSIpOwotICAgICAgICAgICAgZS0+bVZ0eEF0dHJpYlNsb3RzW1JTX0tJTkRfUE9TSVRJT05dID0gMDsKLSAgICAgICAgICAgIGUtPm1WdHhBdHRyaWJTbG90c1tSU19LSU5EX0NPTE9SXSA9IDE7Ci0gICAgICAgICAgICBlLT5tVnR4QXR0cmliU2xvdHNbUlNfS0lORF9OT1JNQUxdID0gMjsKLSAgICAgICAgICAgIGUtPm1WdHhBdHRyaWJTbG90c1tSU19LSU5EX1BPSU5UX1NJWkVdID0gMzsKLSAgICAgICAgICAgIGUtPm1WdHhBdHRyaWJTbG90c1tSU19LSU5EX1RFWFRVUkVdID0gNDsKKyAgICAgICAgICAgIGdsQmluZEF0dHJpYkxvY2F0aW9uKHBnbSwgMCwgIkFUVFJJQl9wb3NpdGlvbiIpOworICAgICAgICAgICAgZ2xCaW5kQXR0cmliTG9jYXRpb24ocGdtLCAxLCAiQVRUUklCX2NvbG9yIik7CisgICAgICAgICAgICBnbEJpbmRBdHRyaWJMb2NhdGlvbihwZ20sIDIsICJBVFRSSUJfbm9ybWFsIik7CisgICAgICAgICAgICBnbEJpbmRBdHRyaWJMb2NhdGlvbihwZ20sIDMsICJBVFRSSUJfdGV4dHVyZTAiKTsKICAgICAgICAgfQogCiAgICAgICAgIC8vTE9HRSgiZTIgJXgiLCBnbEdldEVycm9yKCkpOwpkaWZmIC0tZ2l0IGEvbGlicy9ycy9yc1NpZ25hbC5jcHAgYi9saWJzL3JzL3JzU2lnbmFsLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MjM5YmZkCi0tLSAvZGV2L251bGwKKysrIGIvbGlicy9ycy9yc1NpZ25hbC5jcHAKQEAgLTAsMCArMSw5OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlICJyc1NpZ25hbC5oIgorCit1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKK3VzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOjpyZW5kZXJzY3JpcHQ7CisKKworU2lnbmFsOjpTaWduYWwoKQoreworICAgIG1TZXQgPSB0cnVlOworfQorCitTaWduYWw6On5TaWduYWwoKQoreworICAgIHB0aHJlYWRfbXV0ZXhfZGVzdHJveSgmbU11dGV4KTsKKyAgICBwdGhyZWFkX2NvbmRfZGVzdHJveSgmbUNvbmRpdGlvbik7Cit9CisKK2Jvb2wgU2lnbmFsOjppbml0KCkKK3sKKyAgICBpbnQgc3RhdHVzID0gcHRocmVhZF9tdXRleF9pbml0KCZtTXV0ZXgsIE5VTEwpOworICAgIGlmIChzdGF0dXMpIHsKKyAgICAgICAgTE9HRSgiTG9ja2xlc3NGaWZvIG11dGV4IGluaXQgZmFpbHVyZSIpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgc3RhdHVzID0gcHRocmVhZF9jb25kX2luaXQoJm1Db25kaXRpb24sIE5VTEwpOworICAgIGlmIChzdGF0dXMpIHsKKyAgICAgICAgTE9HRSgiTG9ja2xlc3NGaWZvIGNvbmRpdGlvbiBpbml0IGZhaWx1cmUiKTsKKyAgICAgICAgcHRocmVhZF9tdXRleF9kZXN0cm95KCZtTXV0ZXgpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcmV0dXJuIHRydWU7Cit9CisKK3ZvaWQgU2lnbmFsOjpzZXQoKQoreworICAgIGludCBzdGF0dXM7CisKKyAgICBzdGF0dXMgPSBwdGhyZWFkX211dGV4X2xvY2soJm1NdXRleCk7CisgICAgaWYgKHN0YXR1cykgeworICAgICAgICBMT0dFKCJMb2NrbGVzc0NvbW1hbmRGaWZvOiBlcnJvciAlaSBsb2NraW5nIGZvciBzZXQgY29uZGl0aW9uLiIsIHN0YXR1cyk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBtU2V0ID0gdHJ1ZTsKKworICAgIHN0YXR1cyA9IHB0aHJlYWRfY29uZF9zaWduYWwoJm1Db25kaXRpb24pOworICAgIGlmIChzdGF0dXMpIHsKKyAgICAgICAgTE9HRSgiTG9ja2xlc3NDb21tYW5kRmlmbzogZXJyb3IgJWkgb24gc2V0IGNvbmRpdGlvbi4iLCBzdGF0dXMpOworICAgIH0KKworICAgIHN0YXR1cyA9IHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZtTXV0ZXgpOworICAgIGlmIChzdGF0dXMpIHsKKyAgICAgICAgTE9HRSgiTG9ja2xlc3NDb21tYW5kRmlmbzogZXJyb3IgJWkgdW5sb2NraW5nIGZvciBzZXQgY29uZGl0aW9uLiIsIHN0YXR1cyk7CisgICAgfQorfQorCit2b2lkIFNpZ25hbDo6d2FpdCgpCit7CisgICAgaW50IHN0YXR1czsKKworICAgIHN0YXR1cyA9IHB0aHJlYWRfbXV0ZXhfbG9jaygmbU11dGV4KTsKKyAgICBpZiAoc3RhdHVzKSB7CisgICAgICAgIExPR0UoIkxvY2tsZXNzQ29tbWFuZEZpZm86IGVycm9yICVpIGxvY2tpbmcgZm9yIGNvbmRpdGlvbi4iLCBzdGF0dXMpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKCFtU2V0KSB7CisgICAgICAgIHN0YXR1cyA9IHB0aHJlYWRfY29uZF93YWl0KCZtQ29uZGl0aW9uLCAmbU11dGV4KTsKKyAgICAgICAgaWYgKHN0YXR1cykgeworICAgICAgICAgICAgTE9HRSgiTG9ja2xlc3NDb21tYW5kRmlmbzogZXJyb3IgJWkgd2FpdGluZyBvbiBjb25kaXRpb24uIiwgc3RhdHVzKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBtU2V0ID0gZmFsc2U7CisKKyAgICBzdGF0dXMgPSBwdGhyZWFkX211dGV4X3VubG9jaygmbU11dGV4KTsKKyAgICBpZiAoc3RhdHVzKSB7CisgICAgICAgIExPR0UoIkxvY2tsZXNzQ29tbWFuZEZpZm86IGVycm9yICVpIHVubG9ja2luZyBmb3IgY29uZGl0aW9uLiIsIHN0YXR1cyk7CisgICAgfQorfQorCmRpZmYgLS1naXQgYS9saWJzL3JzL3JzU2lnbmFsLmggYi9saWJzL3JzL3JzU2lnbmFsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmU3NjBmMQotLS0gL2Rldi9udWxsCisrKyBiL2xpYnMvcnMvcnNTaWduYWwuaApAQCAtMCwwICsxLDQ2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX1JTX1NJR05BTF9ICisjZGVmaW5lIEFORFJPSURfUlNfU0lHTkFMX0gKKworCisjaW5jbHVkZSAicnNVdGlscy5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgcmVuZGVyc2NyaXB0IHsKKworY2xhc3MgU2lnbmFsIHsKK3B1YmxpYzoKKyAgICBTaWduYWwoKTsKKyAgICB+U2lnbmFsKCk7CisKKyAgICBib29sIGluaXQoKTsKKworICAgIHZvaWQgc2V0KCk7CisgICAgdm9pZCB3YWl0KCk7CisKK3Byb3RlY3RlZDoKKyAgICBib29sIG1TZXQ7CisgICAgcHRocmVhZF9tdXRleF90IG1NdXRleDsKKyAgICBwdGhyZWFkX2NvbmRfdCBtQ29uZGl0aW9uOworfTsKKworfQorfQorCisjZW5kaWYKKwpkaWZmIC0tZ2l0IGEvbGlicy9ycy9yc1NpbXBsZU1lc2guY3BwIGIvbGlicy9ycy9yc1NpbXBsZU1lc2guY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1M2NlNWNkLi4wMDAwMDAwCi0tLSBhL2xpYnMvcnMvcnNTaW1wbGVNZXNoLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDE2OSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgInJzQ29udGV4dC5oIgotCi11c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKLXVzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOjpyZW5kZXJzY3JpcHQ7Ci0KLSNpbmNsdWRlIDxHTEVTL2dsLmg+Ci0jaW5jbHVkZSA8R0xFUy9nbGV4dC5oPgotCi1TaW1wbGVNZXNoOjpTaW1wbGVNZXNoKENvbnRleHQgKnJzYykgOiBPYmplY3RCYXNlKHJzYykKLXsKLSAgICBtQWxsb2NGaWxlID0gX19GSUxFX187Ci0gICAgbUFsbG9jTGluZSA9IF9fTElORV9fOwotfQotCi1TaW1wbGVNZXNoOjp+U2ltcGxlTWVzaCgpCi17Ci0gICAgZGVsZXRlW10gbVZlcnRleFR5cGVzOwotICAgIGRlbGV0ZVtdIG1WZXJ0ZXhCdWZmZXJzOwotfQotCi12b2lkIFNpbXBsZU1lc2g6OnJlbmRlcihDb250ZXh0ICpyc2MpIGNvbnN0Ci17Ci0gICAgaWYgKG1QcmltaXRpdmVUeXBlLmdldCgpKSB7Ci0gICAgICAgIHJlbmRlclJhbmdlKHJzYywgMCwgbVByaW1pdGl2ZVR5cGUtPmdldERpbVgoKSk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBpZiAobUluZGV4VHlwZS5nZXQoKSkgewotICAgICAgICByZW5kZXJSYW5nZShyc2MsIDAsIG1JbmRleFR5cGUtPmdldERpbVgoKSk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICByZW5kZXJSYW5nZShyc2MsIDAsIG1WZXJ0ZXhUeXBlc1swXS0+Z2V0RGltWCgpKTsKLX0KLQotdm9pZCBTaW1wbGVNZXNoOjpyZW5kZXJSYW5nZShDb250ZXh0ICpyc2MsIHVpbnQzMl90IHN0YXJ0LCB1aW50MzJfdCBsZW4pIGNvbnN0Ci17Ci0gICAgaWYgKGxlbiA8IDEpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIHJzYy0+Y2hlY2tFcnJvcigiU2ltcGxlTWVzaDo6cmVuZGVyUmFuZ2UgMSIpOwotICAgIFZlcnRleEFycmF5IHZhOwotICAgIGlmIChyc2MtPmNoZWNrVmVyc2lvbjJfMCgpKSB7Ci0gICAgICAgIGZvciAodWludDMyX3QgY3Q9MDsgY3QgPCBtVmVydGV4VHlwZUNvdW50OyBjdCsrKSB7Ci0gICAgICAgICAgICBtVmVydGV4QnVmZmVyc1tjdF0tPnVwbG9hZENoZWNrKHJzYyk7Ci0gICAgICAgICAgICB2YS5zZXRBY3RpdmVCdWZmZXIobVZlcnRleEJ1ZmZlcnNbY3RdLT5nZXRCdWZmZXJPYmplY3RJRCgpKTsKLSAgICAgICAgICAgIG1WZXJ0ZXhUeXBlc1tjdF0tPmVuYWJsZUdMVmVydGV4QnVmZmVyMigmdmEpOwotICAgICAgICB9Ci0gICAgICAgIHZhLnNldHVwR0wyKHJzYywgJnJzYy0+bVN0YXRlVmVydGV4QXJyYXksICZyc2MtPm1TaGFkZXJDYWNoZSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgZm9yICh1aW50MzJfdCBjdD0wOyBjdCA8IG1WZXJ0ZXhUeXBlQ291bnQ7IGN0KyspIHsKLSAgICAgICAgICAgIG1WZXJ0ZXhCdWZmZXJzW2N0XS0+dXBsb2FkQ2hlY2socnNjKTsKLSAgICAgICAgICAgIHZhLnNldEFjdGl2ZUJ1ZmZlcihtVmVydGV4QnVmZmVyc1tjdF0tPmdldEJ1ZmZlck9iamVjdElEKCkpOwotICAgICAgICAgICAgbVZlcnRleFR5cGVzW2N0XS0+ZW5hYmxlR0xWZXJ0ZXhCdWZmZXIoJnZhKTsKLSAgICAgICAgfQotICAgICAgICB2YS5zZXR1cEdMKHJzYywgMCk7Ci0gICAgfQotCi0gICAgcnNjLT5jaGVja0Vycm9yKCJTaW1wbGVNZXNoOjpyZW5kZXJSYW5nZSAyIik7Ci0gICAgaWYgKG1JbmRleFR5cGUuZ2V0KCkpIHsKLSAgICAgICAgbUluZGV4QnVmZmVyLT51cGxvYWRDaGVjayhyc2MpOwotICAgICAgICBnbEJpbmRCdWZmZXIoR0xfRUxFTUVOVF9BUlJBWV9CVUZGRVIsIG1JbmRleEJ1ZmZlci0+Z2V0QnVmZmVyT2JqZWN0SUQoKSk7Ci0gICAgICAgIGdsRHJhd0VsZW1lbnRzKG1HTFByaW1pdGl2ZSwgbGVuLCBHTF9VTlNJR05FRF9TSE9SVCwgKHVpbnQxNl90ICopKHN0YXJ0ICogMikpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGdsRHJhd0FycmF5cyhtR0xQcmltaXRpdmUsIHN0YXJ0LCBsZW4pOwotICAgIH0KLQotICAgIHJzYy0+Y2hlY2tFcnJvcigiU2ltcGxlTWVzaDo6cmVuZGVyUmFuZ2UiKTsKLX0KLQotdm9pZCBTaW1wbGVNZXNoOjp1cGxvYWRBbGwoQ29udGV4dCAqcnNjKQotewotICAgIGZvciAodWludDMyX3QgY3Q9MDsgY3QgPCBtVmVydGV4VHlwZUNvdW50OyBjdCsrKSB7Ci0gICAgICAgIGlmIChtVmVydGV4QnVmZmVyc1tjdF0uZ2V0KCkpIHsKLSAgICAgICAgICAgIG1WZXJ0ZXhCdWZmZXJzW2N0XS0+ZGVmZXJlZFVwbG9hZFRvQnVmZmVyT2JqZWN0KHJzYyk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgaWYgKG1JbmRleEJ1ZmZlci5nZXQoKSkgewotICAgICAgICBtSW5kZXhCdWZmZXItPmRlZmVyZWRVcGxvYWRUb0J1ZmZlck9iamVjdChyc2MpOwotICAgIH0KLSAgICBpZiAobVByaW1pdGl2ZUJ1ZmZlci5nZXQoKSkgewotICAgICAgICBtUHJpbWl0aXZlQnVmZmVyLT5kZWZlcmVkVXBsb2FkVG9CdWZmZXJPYmplY3QocnNjKTsKLSAgICB9Ci0gICAgcnNjLT5jaGVja0Vycm9yKCJTaW1wbGVNZXNoOjp1cGxvYWRBbGwiKTsKLX0KLQotCi1TaW1wbGVNZXNoQ29udGV4dDo6U2ltcGxlTWVzaENvbnRleHQoKQotewotfQotCi1TaW1wbGVNZXNoQ29udGV4dDo6flNpbXBsZU1lc2hDb250ZXh0KCkKLXsKLX0KLQotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci1uYW1lc3BhY2UgcmVuZGVyc2NyaXB0IHsKLQotCi1Sc1NpbXBsZU1lc2ggcnNpX1NpbXBsZU1lc2hDcmVhdGUoQ29udGV4dCAqcnNjLCBSc1R5cGUgcHJpbSwgUnNUeXBlIGlkeCwgUnNUeXBlICp2dHgsIHVpbnQzMl90IHZ0eENvdW50LCB1aW50MzJfdCBwcmltVHlwZSkKLXsKLSAgICBTaW1wbGVNZXNoICpzbSA9IG5ldyBTaW1wbGVNZXNoKHJzYyk7Ci0gICAgc20tPmluY1VzZXJSZWYoKTsKLQotICAgIHNtLT5tSW5kZXhUeXBlLnNldCgoY29uc3QgVHlwZSAqKWlkeCk7Ci0gICAgc20tPm1QcmltaXRpdmVUeXBlLnNldCgoY29uc3QgVHlwZSAqKXByaW0pOwotCi0gICAgc20tPm1WZXJ0ZXhUeXBlQ291bnQgPSB2dHhDb3VudDsKLSAgICBzbS0+bVZlcnRleFR5cGVzID0gbmV3IE9iamVjdEJhc2VSZWY8Y29uc3QgVHlwZT5bdnR4Q291bnRdOwotICAgIHNtLT5tVmVydGV4QnVmZmVycyA9IG5ldyBPYmplY3RCYXNlUmVmPEFsbG9jYXRpb24+W3Z0eENvdW50XTsKLSAgICBmb3IgKHVpbnQzMl90IGN0PTA7IGN0IDwgdnR4Q291bnQ7IGN0KyspIHsKLSAgICAgICAgc20tPm1WZXJ0ZXhUeXBlc1tjdF0uc2V0KChjb25zdCBUeXBlICopdnR4W2N0XSk7Ci0gICAgfQotCi0gICAgc20tPm1QcmltaXRpdmUgPSAoUnNQcmltaXRpdmUpcHJpbVR5cGU7Ci0gICAgc3dpdGNoKHNtLT5tUHJpbWl0aXZlKSB7Ci0gICAgY2FzZSBSU19QUklNSVRJVkVfUE9JTlQ6ICAgICAgICAgIHNtLT5tR0xQcmltaXRpdmUgPSBHTF9QT0lOVFM7IGJyZWFrOwotICAgIGNhc2UgUlNfUFJJTUlUSVZFX0xJTkU6ICAgICAgICAgICBzbS0+bUdMUHJpbWl0aXZlID0gR0xfTElORVM7IGJyZWFrOwotICAgIGNhc2UgUlNfUFJJTUlUSVZFX0xJTkVfU1RSSVA6ICAgICBzbS0+bUdMUHJpbWl0aXZlID0gR0xfTElORV9TVFJJUDsgYnJlYWs7Ci0gICAgY2FzZSBSU19QUklNSVRJVkVfVFJJQU5HTEU6ICAgICAgIHNtLT5tR0xQcmltaXRpdmUgPSBHTF9UUklBTkdMRVM7IGJyZWFrOwotICAgIGNhc2UgUlNfUFJJTUlUSVZFX1RSSUFOR0xFX1NUUklQOiBzbS0+bUdMUHJpbWl0aXZlID0gR0xfVFJJQU5HTEVfU1RSSVA7IGJyZWFrOwotICAgIGNhc2UgUlNfUFJJTUlUSVZFX1RSSUFOR0xFX0ZBTjogICBzbS0+bUdMUHJpbWl0aXZlID0gR0xfVFJJQU5HTEVfRkFOOyBicmVhazsKLSAgICB9Ci0gICAgcmV0dXJuIHNtOwotfQotCi12b2lkIHJzaV9TaW1wbGVNZXNoQmluZFZlcnRleChDb250ZXh0ICpyc2MsIFJzU2ltcGxlTWVzaCBtdiwgUnNBbGxvY2F0aW9uIHZhLCB1aW50MzJfdCBzbG90KQotewotICAgIFNpbXBsZU1lc2ggKnNtID0gc3RhdGljX2Nhc3Q8U2ltcGxlTWVzaCAqPihtdik7Ci0gICAgcnNBc3NlcnQoc2xvdCA8IHNtLT5tVmVydGV4VHlwZUNvdW50KTsKLQotICAgIHNtLT5tVmVydGV4QnVmZmVyc1tzbG90XS5zZXQoKEFsbG9jYXRpb24gKil2YSk7Ci19Ci0KLXZvaWQgcnNpX1NpbXBsZU1lc2hCaW5kSW5kZXgoQ29udGV4dCAqcnNjLCBSc1NpbXBsZU1lc2ggbXYsIFJzQWxsb2NhdGlvbiB2YSkKLXsKLSAgICBTaW1wbGVNZXNoICpzbSA9IHN0YXRpY19jYXN0PFNpbXBsZU1lc2ggKj4obXYpOwotICAgIHNtLT5tSW5kZXhCdWZmZXIuc2V0KChBbGxvY2F0aW9uICopdmEpOwotfQotCi12b2lkIHJzaV9TaW1wbGVNZXNoQmluZFByaW1pdGl2ZShDb250ZXh0ICpyc2MsIFJzU2ltcGxlTWVzaCBtdiwgUnNBbGxvY2F0aW9uIHZhKQotewotICAgIFNpbXBsZU1lc2ggKnNtID0gc3RhdGljX2Nhc3Q8U2ltcGxlTWVzaCAqPihtdik7Ci0gICAgc20tPm1QcmltaXRpdmVCdWZmZXIuc2V0KChBbGxvY2F0aW9uICopdmEpOwotfQotCi0KLQotCi19fQotCmRpZmYgLS1naXQgYS9saWJzL3JzL3JzU2ltcGxlTWVzaC5oIGIvbGlicy9ycy9yc1NpbXBsZU1lc2guaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmRlZmJkYS4uMDAwMDAwMAotLS0gYS9saWJzL3JzL3JzU2ltcGxlTWVzaC5oCisrKyAvZGV2L251bGwKQEAgLTEsNjkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgQU5EUk9JRF9SU19TSU1QTEVfTUVTSF9ICi0jZGVmaW5lIEFORFJPSURfUlNfU0lNUExFX01FU0hfSAotCi0KLSNpbmNsdWRlICJSZW5kZXJTY3JpcHQuaCIKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci1uYW1lc3BhY2UgcmVuZGVyc2NyaXB0IHsKLQotCi0vLyBBbiBlbGVtZW50IGlzIGEgZ3JvdXAgb2YgQ29tcG9uZW50cyB0aGF0IG9jY3VwaWVzIG9uZSBjZWxsIGluIGEgc3RydWN0dXJlLgotY2xhc3MgU2ltcGxlTWVzaCA6IHB1YmxpYyBPYmplY3RCYXNlCi17Ci1wdWJsaWM6Ci0gICAgU2ltcGxlTWVzaChDb250ZXh0ICopOwotICAgIH5TaW1wbGVNZXNoKCk7Ci0KLSAgICBPYmplY3RCYXNlUmVmPGNvbnN0IFR5cGU+IG1JbmRleFR5cGU7Ci0gICAgT2JqZWN0QmFzZVJlZjxjb25zdCBUeXBlPiBtUHJpbWl0aXZlVHlwZTsKLSAgICBPYmplY3RCYXNlUmVmPGNvbnN0IFR5cGU+ICptVmVydGV4VHlwZXM7Ci0gICAgdWludDMyX3QgbVZlcnRleFR5cGVDb3VudDsKLQotICAgIE9iamVjdEJhc2VSZWY8QWxsb2NhdGlvbj4gbUluZGV4QnVmZmVyOwotICAgIE9iamVjdEJhc2VSZWY8QWxsb2NhdGlvbj4gbVByaW1pdGl2ZUJ1ZmZlcjsKLSAgICBPYmplY3RCYXNlUmVmPEFsbG9jYXRpb24+ICptVmVydGV4QnVmZmVyczsKLQotICAgIFJzUHJpbWl0aXZlIG1QcmltaXRpdmU7Ci0gICAgdWludDMyX3QgbUdMUHJpbWl0aXZlOwotCi0KLSAgICB2b2lkIHJlbmRlcihDb250ZXh0ICopIGNvbnN0OwotICAgIHZvaWQgcmVuZGVyUmFuZ2UoQ29udGV4dCAqLCB1aW50MzJfdCBzdGFydCwgdWludDMyX3QgbGVuKSBjb25zdDsKLSAgICB2b2lkIHVwbG9hZEFsbChDb250ZXh0ICopOwotCi0KLXByb3RlY3RlZDoKLX07Ci0KLWNsYXNzIFNpbXBsZU1lc2hDb250ZXh0Ci17Ci1wdWJsaWM6Ci0gICAgU2ltcGxlTWVzaENvbnRleHQoKTsKLSAgICB+U2ltcGxlTWVzaENvbnRleHQoKTsKLQotCi19OwotCi0KLX0KLX0KLSNlbmRpZiAvL0FORFJPSURfUlNfU0lNUExFX01FU0hfSAotCmRpZmYgLS1naXQgYS9saWJzL3JzL3JzU3RyZWFtLmNwcCBiL2xpYnMvcnMvcnNTdHJlYW0uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY4MjQxZmEKLS0tIC9kZXYvbnVsbAorKysgYi9saWJzL3JzL3JzU3RyZWFtLmNwcApAQCAtMCwwICsxLDEzMSBAQAorCisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX1JTX0JVSUxEX0ZPUl9IT1NUCisjaW5jbHVkZSAicnNDb250ZXh0LmgiCisjZWxzZQorI2luY2x1ZGUgInJzQ29udGV4dEhvc3RTdHViLmgiCisjZW5kaWYKKworI2luY2x1ZGUgInJzU3RyZWFtLmgiCisKK3VzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOwordXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ6OnJlbmRlcnNjcmlwdDsKKworSVN0cmVhbTo6SVN0cmVhbShjb25zdCB1aW50OF90ICpidWYsIGJvb2wgdXNlNjQpCit7CisgICAgbURhdGEgPSBidWY7CisgICAgbVBvcyA9IDA7CisgICAgbVVzZTY0ID0gdXNlNjQ7Cit9CisKK3ZvaWQgSVN0cmVhbTo6bG9hZEJ5dGVBcnJheSh2b2lkICpkZXN0LCBzaXplX3QgbnVtQnl0ZXMpCit7CisgICAgbWVtY3B5KGRlc3QsIG1EYXRhICsgbVBvcywgbnVtQnl0ZXMpOworICAgIG1Qb3MgKz0gbnVtQnl0ZXM7Cit9CisKK3VpbnQ2NF90IElTdHJlYW06OmxvYWRPZmZzZXQoKQoreworICAgIHVpbnQ2NF90IHRtcDsKKyAgICBpZiAobVVzZTY0KSB7CisgICAgICAgIG1Qb3MgPSAobVBvcyArIDcpICYgKH43KTsKKyAgICAgICAgdG1wID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50NjRfdCAqPigmbURhdGFbbVBvc10pWzBdOworICAgICAgICBtUG9zICs9IHNpemVvZih1aW50NjRfdCk7CisgICAgICAgIHJldHVybiB0bXA7CisgICAgfQorICAgIHJldHVybiBsb2FkVTMyKCk7Cit9CisKK3ZvaWQgSVN0cmVhbTo6bG9hZFN0cmluZyhTdHJpbmc4ICpzKQoreworICAgIHVpbnQzMl90IGxlbiA9IGxvYWRVMzIoKTsKKyAgICBzLT5zZXRUbygoY29uc3QgY2hhciAqKSZtRGF0YVttUG9zXSwgbGVuKTsKKyAgICBtUG9zICs9IGxlbjsKK30KKworCisvLyBPdXRwdXQgc3RyZWFtIGltcGxlbWVudGF0aW9uCisKK09TdHJlYW06Ok9TdHJlYW0odWludDY0X3QgbGVuLCBib29sIHVzZTY0KQoreworICAgIG1EYXRhID0gKHVpbnQ4X3QqKW1hbGxvYyhsZW4pOworICAgIG1MZW5ndGggPSBsZW47CisgICAgbVBvcyA9IDA7CisgICAgbVVzZTY0ID0gdXNlNjQ7Cit9CisKK09TdHJlYW06On5PU3RyZWFtKCkKK3sKKyAgICBmcmVlKG1EYXRhKTsKK30KKwordm9pZCBPU3RyZWFtOjphZGRCeXRlQXJyYXkoY29uc3Qgdm9pZCAqc3JjLCBzaXplX3QgbnVtQnl0ZXMpCit7CisgICAgLy8gV2UgbmVlZCB0byBwb3RlbnRpYWxseSBncm93IG1vcmUgdGhhbiBvbmNlIGlmIHRoZSBudW1iZXIgb2YgYnllcyB3ZSB3cml0ZSBpcyBzdWJzdGFudGlhbAorICAgIHdoaWxlKG1Qb3MgKyBudW1CeXRlcyA+PSBtTGVuZ3RoKSB7CisgICAgICAgIGdyb3dTaXplKCk7CisgICAgfQorICAgIG1lbWNweShtRGF0YSArIG1Qb3MsIHNyYywgbnVtQnl0ZXMpOworICAgIG1Qb3MgKz0gbnVtQnl0ZXM7Cit9CisKK3ZvaWQgT1N0cmVhbTo6YWRkT2Zmc2V0KHVpbnQ2NF90IHYpCit7CisgICAgaWYgKG1Vc2U2NCkgeworICAgICAgICBtUG9zID0gKG1Qb3MgKyA3KSAmICh+Nyk7CisgICAgICAgIGlmKG1Qb3MgKyBzaXplb2YodikgPj0gbUxlbmd0aCkgeworICAgICAgICAgICAgZ3Jvd1NpemUoKTsKKyAgICAgICAgfQorICAgICAgICBtRGF0YVttUG9zKytdID0gKHVpbnQ4X3QpKHYgJiAweGZmKTsKKyAgICAgICAgbURhdGFbbVBvcysrXSA9ICh1aW50OF90KSgodiA+PiA4KSAmIDB4ZmYpOworICAgICAgICBtRGF0YVttUG9zKytdID0gKHVpbnQ4X3QpKCh2ID4+IDE2KSAmIDB4ZmYpOworICAgICAgICBtRGF0YVttUG9zKytdID0gKHVpbnQ4X3QpKCh2ID4+IDI0KSAmIDB4ZmYpOworICAgICAgICBtRGF0YVttUG9zKytdID0gKHVpbnQ4X3QpKCh2ID4+IDMyKSAmIDB4ZmYpOworICAgICAgICBtRGF0YVttUG9zKytdID0gKHVpbnQ4X3QpKCh2ID4+IDQwKSAmIDB4ZmYpOworICAgICAgICBtRGF0YVttUG9zKytdID0gKHVpbnQ4X3QpKCh2ID4+IDQ4KSAmIDB4ZmYpOworICAgICAgICBtRGF0YVttUG9zKytdID0gKHVpbnQ4X3QpKCh2ID4+IDU2KSAmIDB4ZmYpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgYWRkVTMyKHYpOworICAgIH0KK30KKwordm9pZCBPU3RyZWFtOjphZGRTdHJpbmcoU3RyaW5nOCAqcykKK3sKKyAgICB1aW50MzJfdCBsZW4gPSBzLT5zaXplKCk7CisgICAgYWRkVTMyKGxlbik7CisgICAgaWYobVBvcyArIGxlbipzaXplb2YoY2hhcikgPj0gbUxlbmd0aCkgeworICAgICAgICBncm93U2l6ZSgpOworICAgIH0KKyAgICBjaGFyICpzdHJpbmdEYXRhID0gcmVpbnRlcnByZXRfY2FzdDxjaGFyICo+KCZtRGF0YVttUG9zXSk7CisgICAgZm9yKHVpbnQzMl90IGkgPSAwOyBpIDwgbGVuOyBpICsrKSB7CisgICAgICAgIHN0cmluZ0RhdGFbaV0gPSBzLT5zdHJpbmcoKVtpXTsKKyAgICB9CisgICAgbVBvcyArPSBsZW4qc2l6ZW9mKGNoYXIpOworfQorCit2b2lkIE9TdHJlYW06Omdyb3dTaXplKCkKK3sKKyAgICB1aW50OF90ICpuZXdEYXRhID0gKHVpbnQ4X3QqKW1hbGxvYyhtTGVuZ3RoKjIpOworICAgIG1lbWNweShuZXdEYXRhLCBtRGF0YSwgbUxlbmd0aCpzaXplb2YodWludDhfdCkpOworICAgIG1MZW5ndGggPSBtTGVuZ3RoICogMjsKKyAgICBmcmVlKG1EYXRhKTsKKyAgICBtRGF0YSA9IG5ld0RhdGE7Cit9CisKKwpkaWZmIC0tZ2l0IGEvbGlicy9ycy9yc1N0cmVhbS5oIGIvbGlicy9ycy9yc1N0cmVhbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ0MDFjZDEyCi0tLSAvZGV2L251bGwKKysrIGIvbGlicy9ycy9yc1N0cmVhbS5oCkBAIC0wLDAgKzEsMTYzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX1JTX1NUUkVBTV9ICisjZGVmaW5lIEFORFJPSURfUlNfU1RSRUFNX0gKKworI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSByZW5kZXJzY3JpcHQgeworCitjbGFzcyBJU3RyZWFtCit7CitwdWJsaWM6CisgICAgSVN0cmVhbShjb25zdCB1aW50OF90ICosIGJvb2wgdXNlNjQpOworCisgICAgZmxvYXQgbG9hZEYoKSB7CisgICAgICAgIG1Qb3MgPSAobVBvcyArIDMpICYgKH4zKTsKKyAgICAgICAgZmxvYXQgdG1wID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBmbG9hdCAqPigmbURhdGFbbVBvc10pWzBdOworICAgICAgICBtUG9zICs9IHNpemVvZihmbG9hdCk7CisgICAgICAgIHJldHVybiB0bXA7CisgICAgfQorICAgIGludDMyX3QgbG9hZEkzMigpIHsKKyAgICAgICAgbVBvcyA9IChtUG9zICsgMykgJiAofjMpOworICAgICAgICBpbnQzMl90IHRtcCA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgaW50MzJfdCAqPigmbURhdGFbbVBvc10pWzBdOworICAgICAgICBtUG9zICs9IHNpemVvZihpbnQzMl90KTsKKyAgICAgICAgcmV0dXJuIHRtcDsKKyAgICB9CisgICAgdWludDMyX3QgbG9hZFUzMigpIHsKKyAgICAgICAgbVBvcyA9IChtUG9zICsgMykgJiAofjMpOworICAgICAgICB1aW50MzJfdCB0bXAgPSByZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQzMl90ICo+KCZtRGF0YVttUG9zXSlbMF07CisgICAgICAgIG1Qb3MgKz0gc2l6ZW9mKHVpbnQzMl90KTsKKyAgICAgICAgcmV0dXJuIHRtcDsKKyAgICB9CisgICAgdWludDE2X3QgbG9hZFUxNigpIHsKKyAgICAgICAgbVBvcyA9IChtUG9zICsgMSkgJiAofjEpOworICAgICAgICB1aW50MTZfdCB0bXAgPSByZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQxNl90ICo+KCZtRGF0YVttUG9zXSlbMF07CisgICAgICAgIG1Qb3MgKz0gc2l6ZW9mKHVpbnQxNl90KTsKKyAgICAgICAgcmV0dXJuIHRtcDsKKyAgICB9CisgICAgaW5saW5lIHVpbnQ4X3QgbG9hZFU4KCkgeworICAgICAgICB1aW50OF90IHRtcCA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhfdCAqPigmbURhdGFbbVBvc10pWzBdOworICAgICAgICBtUG9zICs9IHNpemVvZih1aW50OF90KTsKKyAgICAgICAgcmV0dXJuIHRtcDsKKyAgICB9CisgICAgdm9pZCBsb2FkQnl0ZUFycmF5KHZvaWQgKmRlc3QsIHNpemVfdCBudW1CeXRlcyk7CisgICAgdWludDY0X3QgbG9hZE9mZnNldCgpOworICAgIHZvaWQgbG9hZFN0cmluZyhTdHJpbmc4ICpzKTsKKyAgICB1aW50NjRfdCBnZXRQb3MoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtUG9zOworICAgIH0KKyAgICB2b2lkIHJlc2V0KHVpbnQ2NF90IHBvcykgeworICAgICAgICBtUG9zID0gcG9zOworICAgIH0KKyAgICB2b2lkIHJlc2V0KCkgeworICAgICAgICBtUG9zID0gMDsKKyAgICB9CisgICAgCisgICAgY29uc3QgdWludDhfdCAqIGdldFB0cigpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1EYXRhOworICAgIH0KK3Byb3RlY3RlZDoKKyAgICBjb25zdCB1aW50OF90ICogbURhdGE7CisgICAgdWludDY0X3QgbVBvczsKKyAgICBib29sIG1Vc2U2NDsKK307CisKK2NsYXNzIE9TdHJlYW0KK3sKK3B1YmxpYzoKKyAgICBPU3RyZWFtKHVpbnQ2NF90IGxlbmd0aCwgYm9vbCB1c2U2NCk7CisgICAgfk9TdHJlYW0oKTsKKyAgICAKKyAgICB2b2lkIGFsaWduKHVpbnQzMl90IGJ5dGVzKSB7CisgICAgICAgIG1Qb3MgPSAobVBvcyArIChieXRlcyAtIDEpKSAmICh+KGJ5dGVzIC0gMSkpOworICAgICAgICBpZihtUG9zID49IG1MZW5ndGgpIHsKKyAgICAgICAgICAgIGdyb3dTaXplKCk7CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgdm9pZCBhZGRGKGZsb2F0IHYpIHsKKyAgICAgICAgdWludDMyX3QgdWludFYgPSAqcmVpbnRlcnByZXRfY2FzdDx1aW50MzJfdCo+ICgmdik7CisgICAgICAgIGFkZFUzMih1aW50Vik7CisgICAgfQorICAgIHZvaWQgYWRkSTMyKGludDMyX3QgdikgeworICAgICAgICBtUG9zID0gKG1Qb3MgKyAzKSAmICh+Myk7CisgICAgICAgIGlmKG1Qb3MgKyBzaXplb2YodikgPj0gbUxlbmd0aCkgeworICAgICAgICAgICAgZ3Jvd1NpemUoKTsKKyAgICAgICAgfQorICAgICAgICBtRGF0YVttUG9zKytdID0gKHVpbnQ4X3QpKHYgJiAweGZmKTsKKyAgICAgICAgbURhdGFbbVBvcysrXSA9ICh1aW50OF90KSgodiA+PiA4KSAmIDB4ZmYpOworICAgICAgICBtRGF0YVttUG9zKytdID0gKHVpbnQ4X3QpKCh2ID4+IDE2KSAmIDB4ZmYpOworICAgICAgICBtRGF0YVttUG9zKytdID0gKHVpbnQ4X3QpKCh2ID4+IDI0KSAmIDB4ZmYpOworICAgIH0KKyAgICB2b2lkIGFkZFUzMih1aW50MzJfdCB2KSB7CisgICAgICAgIG1Qb3MgPSAobVBvcyArIDMpICYgKH4zKTsKKyAgICAgICAgaWYobVBvcyArIHNpemVvZih2KSA+PSBtTGVuZ3RoKSB7CisgICAgICAgICAgICBncm93U2l6ZSgpOworICAgICAgICB9CisgICAgICAgIG1EYXRhW21Qb3MrK10gPSAodWludDhfdCkodiAmIDB4ZmYpOworICAgICAgICBtRGF0YVttUG9zKytdID0gKHVpbnQ4X3QpKCh2ID4+IDgpICYgMHhmZik7CisgICAgICAgIG1EYXRhW21Qb3MrK10gPSAodWludDhfdCkoKHYgPj4gMTYpICYgMHhmZik7CisgICAgICAgIG1EYXRhW21Qb3MrK10gPSAodWludDhfdCkoKHYgPj4gMjQpICYgMHhmZik7CisgICAgfQorICAgIHZvaWQgYWRkVTE2KHVpbnQxNl90IHYpIHsKKyAgICAgICAgbVBvcyA9IChtUG9zICsgMSkgJiAofjEpOworICAgICAgICBpZihtUG9zICsgc2l6ZW9mKHYpID49IG1MZW5ndGgpIHsKKyAgICAgICAgICAgIGdyb3dTaXplKCk7CisgICAgICAgIH0KKyAgICAgICAgbURhdGFbbVBvcysrXSA9ICh1aW50OF90KSh2ICYgMHhmZik7CisgICAgICAgIG1EYXRhW21Qb3MrK10gPSAodWludDhfdCkodiA+PiA4KTsKKyAgICB9CisgICAgaW5saW5lIHZvaWQgYWRkVTgodWludDhfdCB2KSB7CisgICAgICAgIGlmKG1Qb3MgKyAxID49IG1MZW5ndGgpIHsKKyAgICAgICAgICAgIGdyb3dTaXplKCk7CisgICAgICAgIH0KKyAgICAgICAgcmVpbnRlcnByZXRfY2FzdDx1aW50OF90ICo+KCZtRGF0YVttUG9zXSlbMF0gPSB2OworICAgICAgICBtUG9zICsrOworICAgIH0KKyAgICB2b2lkIGFkZEJ5dGVBcnJheShjb25zdCB2b2lkICpzcmMsIHNpemVfdCBudW1CeXRlcyk7CisgICAgdm9pZCBhZGRPZmZzZXQodWludDY0X3Qgdik7CisgICAgdm9pZCBhZGRTdHJpbmcoU3RyaW5nOCAqcyk7CisgICAgdWludDY0X3QgZ2V0UG9zKCkgY29uc3QgeworICAgICAgICByZXR1cm4gbVBvczsKKyAgICB9CisgICAgdm9pZCByZXNldCh1aW50NjRfdCBwb3MpIHsKKyAgICAgICAgbVBvcyA9IHBvczsKKyAgICB9CisgICAgdm9pZCByZXNldCgpIHsKKyAgICAgICAgbVBvcyA9IDA7CisgICAgfQorICAgIGNvbnN0IHVpbnQ4X3QgKiBnZXRQdHIoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtRGF0YTsKKyAgICB9Citwcm90ZWN0ZWQ6CisgICAgdm9pZCBncm93U2l6ZSgpOworICAgIHVpbnQ4X3QgKiBtRGF0YTsKKyAgICB1aW50NjRfdCBtTGVuZ3RoOworICAgIHVpbnQ2NF90IG1Qb3M7CisgICAgYm9vbCBtVXNlNjQ7Cit9OworICAgIAorCit9IC8vIHJlbmRlcnNjcmlwdAorfSAvLyBhbmRyb2lkCisjZW5kaWYgLy9BTkRST0lEX1JTX1NUUkVBTV9ICisKKwpkaWZmIC0tZ2l0IGEvbGlicy9ycy9yc1R5cGUuY3BwIGIvbGlicy9ycy9yc1R5cGUuY3BwCmluZGV4IGMwOWU5NzkuLjc5Y2ZkNDEgMTAwNjQ0Ci0tLSBhL2xpYnMvcnMvcnNUeXBlLmNwcAorKysgYi9saWJzL3JzL3JzVHlwZS5jcHAKQEAgLTE0LDggKzE0LDEzIEBACiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCisjaWZuZGVmIEFORFJPSURfUlNfQlVJTERfRk9SX0hPU1QKICNpbmNsdWRlICJyc0NvbnRleHQuaCIKICNpbmNsdWRlIDxHTEVTL2dsLmg+CisjZWxzZQorI2luY2x1ZGUgInJzQ29udGV4dEhvc3RTdHViLmgiCisjaW5jbHVkZSA8T3BlbkdML2dsLmg+CisjZW5kaWYKIAogdXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7CiB1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDo6cmVuZGVyc2NyaXB0OwpAQCAtODQsNyArODksOSBAQAogICAgICAgICBtTE9EQ291bnQgPSAxOwogICAgIH0KICAgICBpZiAobUxPRENvdW50ICE9IG9sZExPRENvdW50KSB7Ci0gICAgICAgIGRlbGV0ZSBbXSBtTE9EczsKKyAgICAgICAgaWYobUxPRHMpeworICAgICAgICAgICAgZGVsZXRlIFtdIG1MT0RzOworICAgICAgICB9CiAgICAgICAgIG1MT0RzID0gbmV3IExPRFttTE9EQ291bnRdOwogICAgIH0KIApAQCAtMTM4LDEzNiArMTQ1LDMxIEBACiAKIHZvaWQgVHlwZTo6bWFrZUdMQ29tcG9uZW50cygpCiB7CisgICAgaWYoZ2V0RWxlbWVudCgpLT5nZXRGaWVsZENvdW50KCkgPj0gUlNfTUFYX0FUVFJJQlMpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKwogICAgIHVpbnQzMl90IHVzZXJOdW0gPSAwOwogCiAgICAgZm9yICh1aW50MzJfdCBjdD0wOyBjdCA8IGdldEVsZW1lbnQoKS0+Z2V0RmllbGRDb3VudCgpOyBjdCsrKSB7CiAgICAgICAgIGNvbnN0IENvbXBvbmVudCAmYyA9IGdldEVsZW1lbnQoKS0+Z2V0RmllbGQoY3QpLT5nZXRDb21wb25lbnQoKTsKIAotICAgICAgICBzd2l0Y2goYy5nZXRLaW5kKCkpIHsKLSAgICAgICAgY2FzZSBSU19LSU5EX1VTRVI6Ci0gICAgICAgICAgICBtR0wubVVzZXJbdXNlck51bV0uc2l6ZSA9IGMuZ2V0VmVjdG9yU2l6ZSgpOwotICAgICAgICAgICAgbUdMLm1Vc2VyW3VzZXJOdW1dLm9mZnNldCA9IG1FbGVtZW50LT5nZXRGaWVsZE9mZnNldEJ5dGVzKGN0KTsKLSAgICAgICAgICAgIG1HTC5tVXNlclt1c2VyTnVtXS50eXBlID0gYy5nZXRHTFR5cGUoKTsKLSAgICAgICAgICAgIG1HTC5tVXNlclt1c2VyTnVtXS5ub3JtYWxpemVkID0gYy5nZXRUeXBlKCkgIT0gUlNfVFlQRV9GTE9BVF8zMjsvL2MuZ2V0SXNOb3JtYWxpemVkKCk7Ci0gICAgICAgICAgICBtR0wubVVzZXJbdXNlck51bV0ubmFtZS5zZXRUbyhnZXRFbGVtZW50KCktPmdldEZpZWxkTmFtZShjdCkpOwotICAgICAgICAgICAgdXNlck51bSArKzsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgUlNfS0lORF9QT1NJVElPTjoKLSAgICAgICAgICAgIHJzQXNzZXJ0KG1HTC5tVnR4LnNpemUgPT0gMCk7Ci0gICAgICAgICAgICBtR0wubVZ0eC5zaXplID0gYy5nZXRWZWN0b3JTaXplKCk7Ci0gICAgICAgICAgICBtR0wubVZ0eC5vZmZzZXQgPSBtRWxlbWVudC0+Z2V0RmllbGRPZmZzZXRCeXRlcyhjdCk7Ci0gICAgICAgICAgICBtR0wubVZ0eC50eXBlID0gYy5nZXRHTFR5cGUoKTsKLSAgICAgICAgICAgIG1HTC5tVnR4Lm5vcm1hbGl6ZWQgPSBmYWxzZTsKLSAgICAgICAgICAgIG1HTC5tVnR4Lm5hbWUuc2V0VG8oIlBvc2l0aW9uIik7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIFJTX0tJTkRfQ09MT1I6Ci0gICAgICAgICAgICByc0Fzc2VydChtR0wubUNvbG9yLnNpemUgPT0gMCk7Ci0gICAgICAgICAgICBtR0wubUNvbG9yLnNpemUgPSBjLmdldFZlY3RvclNpemUoKTsKLSAgICAgICAgICAgIG1HTC5tQ29sb3Iub2Zmc2V0ID0gbUVsZW1lbnQtPmdldEZpZWxkT2Zmc2V0Qnl0ZXMoY3QpOwotICAgICAgICAgICAgbUdMLm1Db2xvci50eXBlID0gYy5nZXRHTFR5cGUoKTsKLSAgICAgICAgICAgIG1HTC5tQ29sb3Iubm9ybWFsaXplZCA9IGMuZ2V0VHlwZSgpICE9IFJTX1RZUEVfRkxPQVRfMzI7Ci0gICAgICAgICAgICBtR0wubUNvbG9yLm5hbWUuc2V0VG8oIkNvbG9yIik7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIFJTX0tJTkRfTk9STUFMOgotICAgICAgICAgICAgcnNBc3NlcnQobUdMLm1Ob3JtLnNpemUgPT0gMCk7Ci0gICAgICAgICAgICBtR0wubU5vcm0uc2l6ZSA9IGMuZ2V0VmVjdG9yU2l6ZSgpOwotICAgICAgICAgICAgbUdMLm1Ob3JtLm9mZnNldCA9IG1FbGVtZW50LT5nZXRGaWVsZE9mZnNldEJ5dGVzKGN0KTsKLSAgICAgICAgICAgIG1HTC5tTm9ybS50eXBlID0gYy5nZXRHTFR5cGUoKTsKLSAgICAgICAgICAgIG1HTC5tTm9ybS5ub3JtYWxpemVkID0gZmFsc2U7Ci0gICAgICAgICAgICBtR0wubU5vcm0ubmFtZS5zZXRUbygiTm9ybWFsIik7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIFJTX0tJTkRfVEVYVFVSRToKLSAgICAgICAgICAgIHJzQXNzZXJ0KG1HTC5tVGV4LnNpemUgPT0gMCk7Ci0gICAgICAgICAgICBtR0wubVRleC5zaXplID0gYy5nZXRWZWN0b3JTaXplKCk7Ci0gICAgICAgICAgICBtR0wubVRleC5vZmZzZXQgPSBtRWxlbWVudC0+Z2V0RmllbGRPZmZzZXRCeXRlcyhjdCk7Ci0gICAgICAgICAgICBtR0wubVRleC50eXBlID0gYy5nZXRHTFR5cGUoKTsKLSAgICAgICAgICAgIG1HTC5tVGV4Lm5vcm1hbGl6ZWQgPSBmYWxzZTsKLSAgICAgICAgICAgIG1HTC5tVGV4Lm5hbWUuc2V0VG8oIlRleHR1cmUiKTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgUlNfS0lORF9QT0lOVF9TSVpFOgotICAgICAgICAgICAgcnNBc3NlcnQoIW1HTC5tUG9pbnRTaXplLnNpemUpOwotICAgICAgICAgICAgbUdMLm1Qb2ludFNpemUuc2l6ZSA9IGMuZ2V0VmVjdG9yU2l6ZSgpOwotICAgICAgICAgICAgbUdMLm1Qb2ludFNpemUub2Zmc2V0ID0gbUVsZW1lbnQtPmdldEZpZWxkT2Zmc2V0Qnl0ZXMoY3QpOwotICAgICAgICAgICAgbUdMLm1Qb2ludFNpemUudHlwZSA9IGMuZ2V0R0xUeXBlKCk7Ci0gICAgICAgICAgICBtR0wubVBvaW50U2l6ZS5ub3JtYWxpemVkID0gZmFsc2U7Ci0gICAgICAgICAgICBtR0wubVBvaW50U2l6ZS5uYW1lLnNldFRvKCJQb2ludFNpemUiKTsKLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9CisgICAgICAgIG1BdHRyaWJzW3VzZXJOdW1dLnNpemUgPSBjLmdldFZlY3RvclNpemUoKTsKKyAgICAgICAgbUF0dHJpYnNbdXNlck51bV0ub2Zmc2V0ID0gbUVsZW1lbnQtPmdldEZpZWxkT2Zmc2V0Qnl0ZXMoY3QpOworICAgICAgICBtQXR0cmlic1t1c2VyTnVtXS50eXBlID0gYy5nZXRHTFR5cGUoKTsKKyAgICAgICAgbUF0dHJpYnNbdXNlck51bV0ubm9ybWFsaXplZCA9IGMuZ2V0VHlwZSgpICE9IFJTX1RZUEVfRkxPQVRfMzI7Ly9jLmdldElzTm9ybWFsaXplZCgpOworICAgICAgICBtQXR0cmlic1t1c2VyTnVtXS5uYW1lLnNldFRvKGdldEVsZW1lbnQoKS0+Z2V0RmllbGROYW1lKGN0KSk7CisgICAgICAgIHVzZXJOdW0gKys7CiAgICAgfQogfQogCisKIHZvaWQgVHlwZTo6ZW5hYmxlR0xWZXJ0ZXhCdWZmZXIoVmVydGV4QXJyYXkgKnZhKSBjb25zdAogewotICAgIC8vIE5vdGU6IFdlIGFyZSBvbmx5IGdvaW5nIHRvIGVuYWJsZSBidWZmZXJzIGFuZCBuZXZlciBkaXNhYmxlIHRoZW0KLSAgICAvLyBoZXJlLiAgVGhlIHJlYXNvbiBpcyBtb3JlIHRoYW4gb25lIEFsbG9jYXRpb24gbWF5IGJlIHVzZWQgYXMgYSB2ZXJ0ZXgKLSAgICAvLyBzb3VyY2UuICBTbyB3ZSBjYW5ub3QgZGlzYWJsZSBhcnJheXMgdGhhdCBtYXkgaGF2ZSBiZWVuIGluIHVzZSBieQotICAgIC8vIGFub3RoZXIgYWxsb2NhdGlvbi4KLQotICAgIHVpbnQzMl90IHN0cmlkZSA9IG1FbGVtZW50LT5nZXRTaXplQnl0ZXMoKTsKLSAgICBpZiAobUdMLm1WdHguc2l6ZSkgewotICAgICAgICB2YS0+YWRkTGVnYWN5KG1HTC5tVnR4LnR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgbUdMLm1WdHguc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICBzdHJpZGUsCi0gICAgICAgICAgICAgICAgICAgICAgUlNfS0lORF9QT1NJVElPTiwKLSAgICAgICAgICAgICAgICAgICAgICBmYWxzZSwKLSAgICAgICAgICAgICAgICAgICAgICBtR0wubVZ0eC5vZmZzZXQpOwotICAgIH0KLQotICAgIGlmIChtR0wubU5vcm0uc2l6ZSkgewotICAgICAgICB2YS0+YWRkTGVnYWN5KG1HTC5tTm9ybS50eXBlLAotICAgICAgICAgICAgICAgICAgICAgMywKLSAgICAgICAgICAgICAgICAgICAgIHN0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgIFJTX0tJTkRfTk9STUFMLAotICAgICAgICAgICAgICAgICAgICAgZmFsc2UsCi0gICAgICAgICAgICAgICAgICAgICBtR0wubU5vcm0ub2Zmc2V0KTsKLSAgICB9Ci0KLSAgICBpZiAobUdMLm1Db2xvci5zaXplKSB7Ci0gICAgICAgIHZhLT5hZGRMZWdhY3kobUdMLm1Db2xvci50eXBlLAotICAgICAgICAgICAgICAgICAgICAgbUdMLm1Db2xvci5zaXplLAotICAgICAgICAgICAgICAgICAgICAgc3RyaWRlLAotICAgICAgICAgICAgICAgICAgICAgUlNfS0lORF9DT0xPUiwKLSAgICAgICAgICAgICAgICAgICAgIHRydWUsCi0gICAgICAgICAgICAgICAgICAgICBtR0wubUNvbG9yLm9mZnNldCk7Ci0gICAgfQotCi0gICAgaWYgKG1HTC5tVGV4LnNpemUpIHsKLSAgICAgICAgdmEtPmFkZExlZ2FjeShtR0wubVRleC50eXBlLAotICAgICAgICAgICAgICAgICAgICAgbUdMLm1UZXguc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgIHN0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgIFJTX0tJTkRfVEVYVFVSRSwKLSAgICAgICAgICAgICAgICAgICAgIGZhbHNlLAotICAgICAgICAgICAgICAgICAgICAgbUdMLm1UZXgub2Zmc2V0KTsKLSAgICB9Ci0KLSAgICBpZiAobUdMLm1Qb2ludFNpemUuc2l6ZSkgewotICAgICAgICB2YS0+YWRkTGVnYWN5KG1HTC5tUG9pbnRTaXplLnR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAxLAotICAgICAgICAgICAgICAgICAgICAgc3RyaWRlLAotICAgICAgICAgICAgICAgICAgICAgUlNfS0lORF9QT0lOVF9TSVpFLAotICAgICAgICAgICAgICAgICAgICAgZmFsc2UsCi0gICAgICAgICAgICAgICAgICAgICBtR0wubVBvaW50U2l6ZS5vZmZzZXQpOwotICAgIH0KLQotfQotCi12b2lkIFR5cGU6OmVuYWJsZUdMVmVydGV4QnVmZmVyMihWZXJ0ZXhBcnJheSAqdmEpIGNvbnN0Ci17Ci0gICAgLy8gRG8gbGVnYWN5IGJ1ZmZlcnMKLSAgICBlbmFibGVHTFZlcnRleEJ1ZmZlcih2YSk7Ci0KICAgICB1aW50MzJfdCBzdHJpZGUgPSBtRWxlbWVudC0+Z2V0U2l6ZUJ5dGVzKCk7CiAgICAgZm9yICh1aW50MzJfdCBjdD0wOyBjdCA8IFJTX01BWF9BVFRSSUJTOyBjdCsrKSB7Ci0gICAgICAgIGlmIChtR0wubVVzZXJbY3RdLnNpemUpIHsKLSAgICAgICAgICAgIHZhLT5hZGRVc2VyKG1HTC5tVXNlcltjdF0sIHN0cmlkZSk7CisgICAgICAgIGlmIChtQXR0cmlic1tjdF0uc2l6ZSkgeworICAgICAgICAgICAgdmEtPmFkZChtQXR0cmlic1tjdF0sIHN0cmlkZSk7CiAgICAgICAgIH0KICAgICB9CiB9CkBAIC0yODMsNiArMTg1LDU3IEBACiAgICAgbUVsZW1lbnQtPmR1bXBMT0dWKGJ1Zik7CiB9CiAKK3ZvaWQgVHlwZTo6c2VyaWFsaXplKE9TdHJlYW0gKnN0cmVhbSkgY29uc3QKK3sKKyAgICAvLyBOZWVkIHRvIGlkZW50aWZ5IG91cnNlbHZlcworICAgIHN0cmVhbS0+YWRkVTMyKCh1aW50MzJfdClnZXRDbGFzc0lkKCkpOworCisgICAgU3RyaW5nOCBuYW1lKGdldE5hbWUoKSk7CisgICAgc3RyZWFtLT5hZGRTdHJpbmcoJm5hbWUpOworCisgICAgbUVsZW1lbnQtPnNlcmlhbGl6ZShzdHJlYW0pOworCisgICAgc3RyZWFtLT5hZGRVMzIobURpbVgpOworICAgIHN0cmVhbS0+YWRkVTMyKG1EaW1ZKTsKKyAgICBzdHJlYW0tPmFkZFUzMihtRGltWik7CisKKyAgICBzdHJlYW0tPmFkZFU4KCh1aW50OF90KShtRGltTE9EID8gMSA6IDApKTsKKyAgICBzdHJlYW0tPmFkZFU4KCh1aW50OF90KShtRmFjZXMgPyAxIDogMCkpOworfQorCitUeXBlICpUeXBlOjpjcmVhdGVGcm9tU3RyZWFtKENvbnRleHQgKnJzYywgSVN0cmVhbSAqc3RyZWFtKQoreworICAgIC8vIEZpcnN0IG1ha2Ugc3VyZSB3ZSBhcmUgcmVhZGluZyB0aGUgY29ycmVjdCBvYmplY3QKKyAgICBSc0EzRENsYXNzSUQgY2xhc3NJRCA9IChSc0EzRENsYXNzSUQpc3RyZWFtLT5sb2FkVTMyKCk7CisgICAgaWYoY2xhc3NJRCAhPSBSU19BM0RfQ0xBU1NfSURfVFlQRSkgeworICAgICAgICBMT0dFKCJ0eXBlIGxvYWRpbmcgc2tpcHBlZCBkdWUgdG8gaW52YWxpZCBjbGFzcyBpZFxuIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIFN0cmluZzggbmFtZTsKKyAgICBzdHJlYW0tPmxvYWRTdHJpbmcoJm5hbWUpOworCisgICAgRWxlbWVudCAqZWxlbSA9IEVsZW1lbnQ6OmNyZWF0ZUZyb21TdHJlYW0ocnNjLCBzdHJlYW0pOworICAgIGlmKCFlbGVtKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIFR5cGUgKnR5cGUgPSBuZXcgVHlwZShyc2MpOworICAgIHR5cGUtPm1EaW1YID0gc3RyZWFtLT5sb2FkVTMyKCk7CisgICAgdHlwZS0+bURpbVkgPSBzdHJlYW0tPmxvYWRVMzIoKTsKKyAgICB0eXBlLT5tRGltWiA9IHN0cmVhbS0+bG9hZFUzMigpOworCisgICAgdWludDhfdCB0ZW1wID0gc3RyZWFtLT5sb2FkVTgoKTsKKyAgICB0eXBlLT5tRGltTE9EID0gdGVtcCAhPSAwOworCisgICAgdGVtcCA9IHN0cmVhbS0+bG9hZFU4KCk7CisgICAgdHlwZS0+bUZhY2VzID0gdGVtcCAhPSAwOworCisgICAgdHlwZS0+c2V0RWxlbWVudChlbGVtKTsKKworICAgIHJldHVybiB0eXBlOworfQorCiBib29sIFR5cGU6OmdldElzTnAyKCkgY29uc3QKIHsKICAgICB1aW50MzJfdCB4ID0gZ2V0RGltWCgpOwpAQCAtMzkxLDYgKzM0NCwyMiBAQAogICAgIHJldHVybiBzdDsKIH0KIAordm9pZCByc2lfVHlwZUdldE5hdGl2ZURhdGEoQ29udGV4dCAqcnNjLCBSc1R5cGUgdHlwZSwgdWludDMyX3QgKnR5cGVEYXRhLCB1aW50MzJfdCB0eXBlRGF0YVNpemUpCit7CisgICAgcnNBc3NlcnQodHlwZURhdGFTaXplID09IDYpOworICAgIC8vIFBhY2sgdGhlIGRhdGEgaW4gdGhlIGZvbGxvZmluZyB3YXkgbURpbVg7IG1EaW1ZOyBtRGltWjsKKyAgICAvLyBtRGltTE9EOyBtRGltRmFjZXM7IG1FbGVtZW50OyBpbnRvIHR5cGVEYXRhCisgICAgVHlwZSAqdCA9IHN0YXRpY19jYXN0PFR5cGUgKj4odHlwZSk7CisKKyAgICAoKnR5cGVEYXRhKyspID0gdC0+Z2V0RGltWCgpOworICAgICgqdHlwZURhdGErKykgPSB0LT5nZXREaW1ZKCk7CisgICAgKCp0eXBlRGF0YSsrKSA9IHQtPmdldERpbVooKTsKKyAgICAoKnR5cGVEYXRhKyspID0gdC0+Z2V0RGltTE9EKCk7CisgICAgKCp0eXBlRGF0YSsrKSA9IHQtPmdldERpbUZhY2VzKCkgPyAxIDogMDsKKyAgICAoKnR5cGVEYXRhKyspID0gKHVpbnQzMl90KXQtPmdldEVsZW1lbnQoKTsKKworfQorCiAKIH0KIH0KZGlmZiAtLWdpdCBhL2xpYnMvcnMvcnNUeXBlLmggYi9saWJzL3JzL3JzVHlwZS5oCmluZGV4IGMyNTU3N2MuLjViNTFlMjAgMTAwNjQ0Ci0tLSBhL2xpYnMvcnMvcnNUeXBlLmgKKysrIGIvbGlicy9ycy9yc1R5cGUuaApAQCAtNzEsOSArNzEsMTEgQEAKICAgICB2b2lkIGNvbXB1dGUoKTsKIAogICAgIHZvaWQgZW5hYmxlR0xWZXJ0ZXhCdWZmZXIoY2xhc3MgVmVydGV4QXJyYXkgKikgY29uc3Q7Ci0gICAgdm9pZCBlbmFibGVHTFZlcnRleEJ1ZmZlcjIoY2xhc3MgVmVydGV4QXJyYXkgKikgY29uc3Q7CiAKICAgICB2b2lkIGR1bXBMT0dWKGNvbnN0IGNoYXIgKnByZWZpeCkgY29uc3Q7CisgICAgdmlydHVhbCB2b2lkIHNlcmlhbGl6ZShPU3RyZWFtICpzdHJlYW0pIGNvbnN0OworICAgIHZpcnR1YWwgUnNBM0RDbGFzc0lEIGdldENsYXNzSWQoKSBjb25zdCB7IHJldHVybiBSU19BM0RfQ0xBU1NfSURfVFlQRTsgfQorICAgIHN0YXRpYyBUeXBlICpjcmVhdGVGcm9tU3RyZWFtKENvbnRleHQgKnJzYywgSVN0cmVhbSAqc3RyZWFtKTsKIAogcHJvdGVjdGVkOgogICAgIHN0cnVjdCBMT0QgewpAQCAtMTEyLDE1ICsxMTQsNyBAQAogICAgIExPRCAqbUxPRHM7CiAgICAgdWludDMyX3QgbUxPRENvdW50OwogCi0gICAgc3RydWN0IEdMU3RhdGVfdCB7Ci0gICAgICAgIFZlcnRleEFycmF5OjpBdHRyaWIgbVVzZXJbUlNfTUFYX0FUVFJJQlNdOwotICAgICAgICBWZXJ0ZXhBcnJheTo6QXR0cmliIG1WdHg7Ci0gICAgICAgIFZlcnRleEFycmF5OjpBdHRyaWIgbU5vcm07Ci0gICAgICAgIFZlcnRleEFycmF5OjpBdHRyaWIgbUNvbG9yOwotICAgICAgICBWZXJ0ZXhBcnJheTo6QXR0cmliIG1UZXg7Ci0gICAgICAgIFZlcnRleEFycmF5OjpBdHRyaWIgbVBvaW50U2l6ZTsKLSAgICB9OwotICAgIEdMU3RhdGVfdCBtR0w7CisgICAgVmVydGV4QXJyYXk6OkF0dHJpYiBtQXR0cmlic1tSU19NQVhfQVRUUklCU107CiAgICAgdm9pZCBtYWtlR0xDb21wb25lbnRzKCk7CiAKIHByaXZhdGU6CmRpZmYgLS1naXQgYS9saWJzL3JzL3JzVXRpbHMuaCBiL2xpYnMvcnMvcnNVdGlscy5oCmluZGV4IDA3Zjg5MzMuLjE3ZmViMjIgMTAwNjQ0Ci0tLSBhL2xpYnMvcnMvcnNVdGlscy5oCisrKyBiL2xpYnMvcnMvcnNVdGlscy5oCkBAIC0xOSwxNSArMTksMjMgQEAKIAogI2RlZmluZSBMT0dfTkRFQlVHIDAKICNkZWZpbmUgTE9HX1RBRyAiUmVuZGVyU2NyaXB0IgorCiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+Ci0jaW5jbHVkZSA8dXRpbHMvVmVjdG9yLmg+Ci0jaW5jbHVkZSA8dXRpbHMvS2V5ZWRWZWN0b3IuaD4KKworI2luY2x1ZGUgInJzU3RyZWFtLmgiCisKICNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+CisjaW5jbHVkZSA8dXRpbHMvVmVjdG9yLmg+CisKICNpbmNsdWRlIDxzdGRsaWIuaD4KICNpbmNsdWRlIDxwdGhyZWFkLmg+CiAjaW5jbHVkZSA8dGltZS5oPgorI2luY2x1ZGUgPGN1dGlscy9hdG9taWMuaD4KIAorI2lmbmRlZiBBTkRST0lEX1JTX0JVSUxEX0ZPUl9IT1NUCiAjaW5jbHVkZSA8RUdML2VnbC5oPgorI2VuZGlmCisKICNpbmNsdWRlIDxtYXRoLmg+CiAKICNpbmNsdWRlICJSZW5kZXJTY3JpcHQuaCIKQEAgLTQxLDYgKzQ5LDI2IEBACiAjZGVmaW5lIHJzQXNzZXJ0KHYpIHdoaWxlKDApCiAjZW5kaWYKIAordHlwZWRlZiBmbG9hdCByc3ZGXzIgX19hdHRyaWJ1dGVfXyAoKHZlY3Rvcl9zaXplICg4KSkpOwordHlwZWRlZiBmbG9hdCByc3ZGXzQgX19hdHRyaWJ1dGVfXyAoKHZlY3Rvcl9zaXplICgxNikpKTsKK3R5cGVkZWYgdWludDhfdCByc3ZVOF80IF9fYXR0cmlidXRlX18gKCh2ZWN0b3Jfc2l6ZSAoNCkpKTsKKwordW5pb24gZmxvYXQyIHsKKyAgICByc3ZGXzIgdjsKKyAgICBmbG9hdCBmWzJdOworfTsKKwordW5pb24gZmxvYXQ0IHsKKyAgICByc3ZGXzQgdjsKKyAgICBmbG9hdCBmWzRdOworfTsKKwordW5pb24gdWNoYXI0IHsKKyAgICByc3ZVOF80IHY7CisgICAgdWludDhfdCBmWzRdOworICAgIHVpbnQzMl90IHBhY2tlZDsKK307CisKIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CiBUIHJzTWluKFQgaW4xLCBUIGluMikKIHsKZGlmZiAtLWdpdCBhL2xpYnMvcnMvcnNWZXJ0ZXhBcnJheS5jcHAgYi9saWJzL3JzL3JzVmVydGV4QXJyYXkuY3BwCmluZGV4IDZjMjAwMmQuLjA3NWE3MGQgMTAwNjQ0Ci0tLSBhL2xpYnMvcnMvcnNWZXJ0ZXhBcnJheS5jcHAKKysrIGIvbGlicy9ycy9yc1ZlcnRleEFycmF5LmNwcApAQCAtMTQsMTAgKzE0LDE1IEBACiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCisjaWZuZGVmIEFORFJPSURfUlNfQlVJTERfRk9SX0hPU1QKICNpbmNsdWRlICJyc0NvbnRleHQuaCIKLQogI2luY2x1ZGUgPEdMRVMvZ2wuaD4KICNpbmNsdWRlIDxHTEVTMi9nbDIuaD4KKyNlbHNlCisjaW5jbHVkZSAicnNDb250ZXh0SG9zdFN0dWIuaCIKKyNpbmNsdWRlIDxPcGVuR0wvZ2wuaD4KKyNlbmRpZgorCiAKIHVzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOwogdXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ6OnJlbmRlcnNjcmlwdDsKQEAgLTM5LDYgKzQ0LDcgQEAKICAgICAgICAgbUF0dHJpYnNbY3RdLmNsZWFyKCk7CiAgICAgfQogICAgIG1BY3RpdmVCdWZmZXIgPSAwOworICAgIG1BY3RpdmVQb2ludGVyID0gTlVMTDsKICAgICBtQ291bnQgPSAwOwogfQogCkBAIC01MCwxMiArNTYsMTIgQEAKIHZvaWQgVmVydGV4QXJyYXk6OkF0dHJpYjo6c2V0KGNvbnN0IEF0dHJpYiAmYSkKIHsKICAgICBidWZmZXIgPSBhLmJ1ZmZlcjsKKyAgICBwdHIgPSBhLnB0cjsKICAgICBvZmZzZXQgPSBhLm9mZnNldDsKICAgICB0eXBlID0gYS50eXBlOwogICAgIHNpemUgPSBhLnNpemU7CiAgICAgc3RyaWRlID0gYS5zdHJpZGU7CiAgICAgbm9ybWFsaXplZCA9IGEubm9ybWFsaXplZDsKLSAgICBraW5kID0gUlNfS0lORF9VU0VSOwogICAgIG5hbWUuc2V0VG8oYS5uYW1lKTsKIH0KIApAQCAtNjYsNiArNzIsNyBAQAogICAgIHR5cGUgPSAwOwogICAgIHNpemUgPSAwOwogICAgIHN0cmlkZSA9IDA7CisgICAgcHRyID0gTlVMTDsKICAgICBub3JtYWxpemVkID0gZmFsc2U7CiAgICAgbmFtZS5zZXRUbygiIik7CiB9CkBAIC03NSwxMzggKzgyLDg3IEBACiAgICAgbUF0dHJpYnNbbl0uY2xlYXIoKTsKIH0KIAotdm9pZCBWZXJ0ZXhBcnJheTo6YWRkVXNlcihjb25zdCBBdHRyaWIgJmEsIHVpbnQzMl90IHN0cmlkZSkKK3ZvaWQgVmVydGV4QXJyYXk6OmFkZChjb25zdCBBdHRyaWIgJmEsIHVpbnQzMl90IHN0cmlkZSkKIHsKLSAgICBhc3NlcnQobUNvdW50IDwgUlNfTUFYX0FUVFJJQlMpOworICAgIHJzQXNzZXJ0KG1Db3VudCA8IFJTX01BWF9BVFRSSUJTKTsKICAgICBtQXR0cmlic1ttQ291bnRdLnNldChhKTsKICAgICBtQXR0cmlic1ttQ291bnRdLmJ1ZmZlciA9IG1BY3RpdmVCdWZmZXI7CisgICAgbUF0dHJpYnNbbUNvdW50XS5wdHIgPSBtQWN0aXZlUG9pbnRlcjsKICAgICBtQXR0cmlic1ttQ291bnRdLnN0cmlkZSA9IHN0cmlkZTsKLSAgICBtQXR0cmlic1ttQ291bnRdLmtpbmQgPSBSU19LSU5EX1VTRVI7CiAgICAgbUNvdW50ICsrOwogfQogCi12b2lkIFZlcnRleEFycmF5OjphZGRMZWdhY3kodWludDMyX3QgdHlwZSwgdWludDMyX3Qgc2l6ZSwgdWludDMyX3Qgc3RyaWRlLCBSc0RhdGFLaW5kIGtpbmQsIGJvb2wgbm9ybWFsaXplZCwgdWludDMyX3Qgb2Zmc2V0KQordm9pZCBWZXJ0ZXhBcnJheTo6YWRkKHVpbnQzMl90IHR5cGUsIHVpbnQzMl90IHNpemUsIHVpbnQzMl90IHN0cmlkZSwgYm9vbCBub3JtYWxpemVkLCB1aW50MzJfdCBvZmZzZXQsIGNvbnN0IGNoYXIgKm5hbWUpCiB7Ci0gICAgYXNzZXJ0KG1Db3VudCA8IFJTX01BWF9BVFRSSUJTKTsKKyAgICByc0Fzc2VydChtQ291bnQgPCBSU19NQVhfQVRUUklCUyk7CiAgICAgbUF0dHJpYnNbbUNvdW50XS5jbGVhcigpOwogICAgIG1BdHRyaWJzW21Db3VudF0udHlwZSA9IHR5cGU7CiAgICAgbUF0dHJpYnNbbUNvdW50XS5zaXplID0gc2l6ZTsKICAgICBtQXR0cmlic1ttQ291bnRdLm9mZnNldCA9IG9mZnNldDsKICAgICBtQXR0cmlic1ttQ291bnRdLm5vcm1hbGl6ZWQgPSBub3JtYWxpemVkOwotICAgIG1BdHRyaWJzW21Db3VudF0uYnVmZmVyID0gbUFjdGl2ZUJ1ZmZlcjsKICAgICBtQXR0cmlic1ttQ291bnRdLnN0cmlkZSA9IHN0cmlkZTsKLSAgICBtQXR0cmlic1ttQ291bnRdLmtpbmQgPSBraW5kOworICAgIG1BdHRyaWJzW21Db3VudF0ubmFtZS5zZXRUbyhuYW1lKTsKKworICAgIG1BdHRyaWJzW21Db3VudF0uYnVmZmVyID0gbUFjdGl2ZUJ1ZmZlcjsKKyAgICBtQXR0cmlic1ttQ291bnRdLnB0ciA9IG1BY3RpdmVQb2ludGVyOwogICAgIG1Db3VudCArKzsKIH0KIAogdm9pZCBWZXJ0ZXhBcnJheTo6bG9nQXR0cmliKHVpbnQzMl90IGlkeCwgdWludDMyX3Qgc2xvdCkgY29uc3QgewotICAgIExPR0UoInZhICVpOiBzbG90PSVpIG5hbWU9JXMgYnVmPSVpICBzaXplPSVpICB0eXBlPTB4JXggIGtpbmQ9JWkgIHN0cmlkZT0weCV4ICBub3JtPSVpICBvZmZzZXQ9MHgleCIsIGlkeCwgc2xvdCwKKyAgICBMT0dFKCJ2YSAlaTogc2xvdD0laSBuYW1lPSVzIGJ1Zj0laSBwdHI9JXAgc2l6ZT0laSAgdHlwZT0weCV4ICBzdHJpZGU9MHgleCAgbm9ybT0laSAgb2Zmc2V0PTB4JXgiLCBpZHgsIHNsb3QsCiAgICAgICAgICBtQXR0cmlic1tpZHhdLm5hbWUuc3RyaW5nKCksCiAgICAgICAgICBtQXR0cmlic1tpZHhdLmJ1ZmZlciwKKyAgICAgICAgIG1BdHRyaWJzW2lkeF0ucHRyLAogICAgICAgICAgbUF0dHJpYnNbaWR4XS5zaXplLAogICAgICAgICAgbUF0dHJpYnNbaWR4XS50eXBlLAotICAgICAgICAgbUF0dHJpYnNbaWR4XS5raW5kLAogICAgICAgICAgbUF0dHJpYnNbaWR4XS5zdHJpZGUsCiAgICAgICAgICBtQXR0cmlic1tpZHhdLm5vcm1hbGl6ZWQsCiAgICAgICAgICBtQXR0cmlic1tpZHhdLm9mZnNldCk7CiB9CiAKLXZvaWQgVmVydGV4QXJyYXk6OnNldHVwR0woY29uc3QgQ29udGV4dCAqcnNjLCBjbGFzcyBWZXJ0ZXhBcnJheVN0YXRlICpzdGF0ZSkgY29uc3QKLXsKLSAgICBnbENsaWVudEFjdGl2ZVRleHR1cmUoR0xfVEVYVFVSRTApOwotICAgIGdsRGlzYWJsZUNsaWVudFN0YXRlKEdMX05PUk1BTF9BUlJBWSk7Ci0gICAgZ2xEaXNhYmxlQ2xpZW50U3RhdGUoR0xfQ09MT1JfQVJSQVkpOwotICAgIGdsRGlzYWJsZUNsaWVudFN0YXRlKEdMX1RFWFRVUkVfQ09PUkRfQVJSQVkpOwotICAgIGdsRGlzYWJsZUNsaWVudFN0YXRlKEdMX1BPSU5UX1NJWkVfQVJSQVlfT0VTKTsKLQotICAgIGZvciAodWludDMyX3QgY3Q9MDsgY3QgPCBtQ291bnQ7IGN0KyspIHsKLSAgICAgICAgc3dpdGNoKG1BdHRyaWJzW2N0XS5raW5kKSB7Ci0gICAgICAgIGNhc2UgUlNfS0lORF9QT1NJVElPTjoKLSAgICAgICAgICAgIC8vbG9nQXR0cmliKFBPU0lUSU9OKTsKLSAgICAgICAgICAgIGdsRW5hYmxlQ2xpZW50U3RhdGUoR0xfVkVSVEVYX0FSUkFZKTsKLSAgICAgICAgICAgIGdsQmluZEJ1ZmZlcihHTF9BUlJBWV9CVUZGRVIsIG1BdHRyaWJzW2N0XS5idWZmZXIpOwotICAgICAgICAgICAgZ2xWZXJ0ZXhQb2ludGVyKG1BdHRyaWJzW2N0XS5zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1BdHRyaWJzW2N0XS50eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1BdHRyaWJzW2N0XS5zdHJpZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKiltQXR0cmlic1tjdF0ub2Zmc2V0KTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgUlNfS0lORF9OT1JNQUw6Ci0gICAgICAgICAgICAvL2xvZ0F0dHJpYihOT1JNQUwpOwotICAgICAgICAgICAgZ2xFbmFibGVDbGllbnRTdGF0ZShHTF9OT1JNQUxfQVJSQVkpOwotICAgICAgICAgICAgcnNBc3NlcnQobUF0dHJpYnNbY3RdLnNpemUgPT0gMyk7Ci0gICAgICAgICAgICBnbEJpbmRCdWZmZXIoR0xfQVJSQVlfQlVGRkVSLCBtQXR0cmlic1tjdF0uYnVmZmVyKTsKLSAgICAgICAgICAgIGdsTm9ybWFsUG9pbnRlcihtQXR0cmlic1tjdF0udHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQXR0cmlic1tjdF0uc3RyaWRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopbUF0dHJpYnNbY3RdLm9mZnNldCk7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIFJTX0tJTkRfQ09MT1I6Ci0gICAgICAgICAgICAvL2xvZ0F0dHJpYihDT0xPUik7Ci0gICAgICAgICAgICBnbEVuYWJsZUNsaWVudFN0YXRlKEdMX0NPTE9SX0FSUkFZKTsKLSAgICAgICAgICAgIGdsQmluZEJ1ZmZlcihHTF9BUlJBWV9CVUZGRVIsIG1BdHRyaWJzW2N0XS5idWZmZXIpOwotICAgICAgICAgICAgZ2xDb2xvclBvaW50ZXIobUF0dHJpYnNbY3RdLnNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBtQXR0cmlic1tjdF0udHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIG1BdHRyaWJzW2N0XS5zdHJpZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKW1BdHRyaWJzW2N0XS5vZmZzZXQpOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBSU19LSU5EX1RFWFRVUkU6Ci0gICAgICAgICAgICAvL2xvZ0F0dHJpYihURVhUVVJFKTsKLSAgICAgICAgICAgIGdsRW5hYmxlQ2xpZW50U3RhdGUoR0xfVEVYVFVSRV9DT09SRF9BUlJBWSk7Ci0gICAgICAgICAgICBnbEJpbmRCdWZmZXIoR0xfQVJSQVlfQlVGRkVSLCBtQXR0cmlic1tjdF0uYnVmZmVyKTsKLSAgICAgICAgICAgIGdsVGV4Q29vcmRQb2ludGVyKG1BdHRyaWJzW2N0XS5zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUF0dHJpYnNbY3RdLnR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQXR0cmlic1tjdF0uc3RyaWRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKiltQXR0cmlic1tjdF0ub2Zmc2V0KTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgUlNfS0lORF9QT0lOVF9TSVpFOgotICAgICAgICAgICAgLy9sb2dBdHRyaWIoUE9JTlRfU0laRSk7Ci0gICAgICAgICAgICBnbEVuYWJsZUNsaWVudFN0YXRlKEdMX1BPSU5UX1NJWkVfQVJSQVlfT0VTKTsKLSAgICAgICAgICAgIGdsQmluZEJ1ZmZlcihHTF9BUlJBWV9CVUZGRVIsIG1BdHRyaWJzW2N0XS5idWZmZXIpOwotICAgICAgICAgICAgZ2xQb2ludFNpemVQb2ludGVyT0VTKG1BdHRyaWJzW2N0XS50eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1BdHRyaWJzW2N0XS5zdHJpZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKiltQXR0cmlic1tjdF0ub2Zmc2V0KTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICByc0Fzc2VydCgwKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHJzYy0+Y2hlY2tFcnJvcigiVmVydGV4QXJyYXk6OnNldHVwR0wiKTsKLX0KLQogdm9pZCBWZXJ0ZXhBcnJheTo6c2V0dXBHTDIoY29uc3QgQ29udGV4dCAqcnNjLCBjbGFzcyBWZXJ0ZXhBcnJheVN0YXRlICpzdGF0ZSwgU2hhZGVyQ2FjaGUgKnNjKSBjb25zdAogewogICAgIHJzYy0+Y2hlY2tFcnJvcigiVmVydGV4QXJyYXk6OnNldHVwR0wyIHN0YXJ0Iik7Ci0gICAgZm9yICh1aW50MzJfdCBjdD0xOyBjdCA8PSBzdGF0ZS0+bUxhc3RFbmFibGVDb3VudDsgY3QrKykgeworICAgIGZvciAodWludDMyX3QgY3Q9MTsgY3QgPD0gMHhmLypzdGF0ZS0+bUxhc3RFbmFibGVDb3VudCovOyBjdCsrKSB7CiAgICAgICAgIGdsRGlzYWJsZVZlcnRleEF0dHJpYkFycmF5KGN0KTsKICAgICB9CiAKICAgICByc2MtPmNoZWNrRXJyb3IoIlZlcnRleEFycmF5OjpzZXR1cEdMMiBkaXNhYmxlZCIpOwogICAgIGZvciAodWludDMyX3QgY3Q9MDsgY3QgPCBtQ291bnQ7IGN0KyspIHsKLSAgICAgICAgdWludDMyX3Qgc2xvdCA9IDA7CisgICAgICAgIGludDMyX3Qgc2xvdCA9IDA7CisKKyAgICAgICAgaWYgKG1BdHRyaWJzW2N0XS5uYW1lWzBdID09ICcjJykgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKwogICAgICAgICBpZiAoc2MtPmlzVXNlclZlcnRleFByb2dyYW0oKSkgewogICAgICAgICAgICAgc2xvdCA9IHNjLT52dHhBdHRyaWJTbG90KGN0KTsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGlmIChtQXR0cmlic1tjdF0ua2luZCA9PSBSU19LSU5EX1VTRVIpIHsKKyAgICAgICAgICAgIGlmIChtQXR0cmlic1tjdF0ubmFtZSA9PSAicG9zaXRpb24iKSB7CisgICAgICAgICAgICAgICAgc2xvdCA9IDA7CisgICAgICAgICAgICB9IGVsc2UgaWYgKG1BdHRyaWJzW2N0XS5uYW1lID09ICJjb2xvciIpIHsKKyAgICAgICAgICAgICAgICBzbG90ID0gMTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAobUF0dHJpYnNbY3RdLm5hbWUgPT0gIm5vcm1hbCIpIHsKKyAgICAgICAgICAgICAgICBzbG90ID0gMjsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAobUF0dHJpYnNbY3RdLm5hbWUgPT0gInRleHR1cmUwIikgeworICAgICAgICAgICAgICAgIHNsb3QgPSAzOworICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNsb3QgPSBzYy0+dnR4QXR0cmliU2xvdChtQXR0cmlic1tjdF0ua2luZCk7CisgICAgICAgIH0KKyAgICAgICAgaWYoc2xvdCA8IDApIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICB9CiAKICAgICAgICAgLy9sb2dBdHRyaWIoY3QsIHNsb3QpOwogICAgICAgICBnbEVuYWJsZVZlcnRleEF0dHJpYkFycmF5KHNsb3QpOwogICAgICAgICBnbEJpbmRCdWZmZXIoR0xfQVJSQVlfQlVGRkVSLCBtQXR0cmlic1tjdF0uYnVmZmVyKTsKLQogICAgICAgICBnbFZlcnRleEF0dHJpYlBvaW50ZXIoc2xvdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1BdHRyaWJzW2N0XS5zaXplLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUF0dHJpYnNbY3RdLnR5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQXR0cmlic1tjdF0ubm9ybWFsaXplZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1BdHRyaWJzW2N0XS5zdHJpZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKW1BdHRyaWJzW2N0XS5vZmZzZXQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUF0dHJpYnNbY3RdLnB0ciArIG1BdHRyaWJzW2N0XS5vZmZzZXQpOwogICAgIH0KICAgICBzdGF0ZS0+bUxhc3RFbmFibGVDb3VudCA9IG1Db3VudDsKICAgICByc2MtPmNoZWNrRXJyb3IoIlZlcnRleEFycmF5OjpzZXR1cEdMMiBkb25lIik7CmRpZmYgLS1naXQgYS9saWJzL3JzL3JzVmVydGV4QXJyYXkuaCBiL2xpYnMvcnMvcnNWZXJ0ZXhBcnJheS5oCmluZGV4IDM5MDRjYjYuLjdjNjA5YjIgMTAwNjQ0Ci0tLSBhL2xpYnMvcnMvcnNWZXJ0ZXhBcnJheS5oCisrKyBiL2xpYnMvcnMvcnNWZXJ0ZXhBcnJheS5oCkBAIC0zNywxMyArMzcsMTMgQEAKICAgICBjbGFzcyBBdHRyaWIgewogICAgIHB1YmxpYzoKICAgICAgICAgdWludDMyX3QgYnVmZmVyOworICAgICAgICBjb25zdCB1aW50OF90ICogcHRyOwogICAgICAgICB1aW50MzJfdCBvZmZzZXQ7CiAgICAgICAgIHVpbnQzMl90IHR5cGU7CiAgICAgICAgIHVpbnQzMl90IHNpemU7CiAgICAgICAgIHVpbnQzMl90IHN0cmlkZTsKICAgICAgICAgYm9vbCBub3JtYWxpemVkOwogICAgICAgICBTdHJpbmc4IG5hbWU7Ci0gICAgICAgIFJzRGF0YUtpbmQga2luZDsKIAogICAgICAgICBBdHRyaWIoKTsKICAgICAgICAgdm9pZCBzZXQoY29uc3QgQXR0cmliICYpOwpAQCAtNTIsOSArNTIsMTggQEAKIAogCiAgICAgdm9pZCBjbGVhckFsbCgpOwotICAgIHZvaWQgc2V0QWN0aXZlQnVmZmVyKHVpbnQzMl90IGlkKSB7bUFjdGl2ZUJ1ZmZlciA9IGlkO30KLSAgICB2b2lkIGFkZFVzZXIoY29uc3QgQXR0cmliICYsIHVpbnQzMl90IHN0cmlkZSk7Ci0gICAgdm9pZCBhZGRMZWdhY3kodWludDMyX3QgdHlwZSwgdWludDMyX3Qgc2l6ZSwgdWludDMyX3Qgc3RyaWRlLCBSc0RhdGFLaW5kIGtpbmQsIGJvb2wgbm9ybWFsaXplZCwgdWludDMyX3Qgb2Zmc2V0KTsKKyAgICB2b2lkIHNldEFjdGl2ZUJ1ZmZlcih1aW50MzJfdCBpZCkgeworICAgICAgICBtQWN0aXZlQnVmZmVyID0gaWQ7CisgICAgICAgIG1BY3RpdmVQb2ludGVyID0gTlVMTDsKKyAgICB9CisgICAgdm9pZCBzZXRBY3RpdmVCdWZmZXIoY29uc3Qgdm9pZCAqcHRyKSB7CisgICAgICAgIG1BY3RpdmVCdWZmZXIgPSAwOworICAgICAgICBtQWN0aXZlUG9pbnRlciA9IChjb25zdCB1aW50OF90ICopcHRyOworICAgIH0KKworICAgIHZvaWQgYWRkKGNvbnN0IEF0dHJpYiAmLCB1aW50MzJfdCBzdHJpZGUpOworICAgIC8vdm9pZCBhZGRMZWdhY3kodWludDMyX3QgdHlwZSwgdWludDMyX3Qgc2l6ZSwgdWludDMyX3Qgc3RyaWRlLCBib29sIG5vcm1hbGl6ZWQsIHVpbnQzMl90IG9mZnNldCk7CisgICAgdm9pZCBhZGQodWludDMyX3QgdHlwZSwgdWludDMyX3Qgc2l6ZSwgdWludDMyX3Qgc3RyaWRlLCBib29sIG5vcm1hbGl6ZWQsIHVpbnQzMl90IG9mZnNldCwgY29uc3QgY2hhciAqbmFtZSk7CiAKICAgICB2b2lkIHNldHVwR0woY29uc3QgQ29udGV4dCAqcnNjLCBjbGFzcyBWZXJ0ZXhBcnJheVN0YXRlICopIGNvbnN0OwogICAgIHZvaWQgc2V0dXBHTDIoY29uc3QgQ29udGV4dCAqcnNjLCBjbGFzcyBWZXJ0ZXhBcnJheVN0YXRlICosIFNoYWRlckNhY2hlICopIGNvbnN0OwpAQCAtNjMsNiArNzIsNyBAQAogcHJvdGVjdGVkOgogICAgIHZvaWQgY2xlYXIodWludDMyX3QgaW5kZXgpOwogICAgIHVpbnQzMl90IG1BY3RpdmVCdWZmZXI7CisgICAgY29uc3QgdWludDhfdCAqIG1BY3RpdmVQb2ludGVyOwogICAgIHVpbnQzMl90IG1Db3VudDsKIAogICAgIEF0dHJpYiBtQXR0cmlic1tSU19NQVhfQVRUUklCU107CmRpZmYgLS1naXQgYS9saWJzL3JzL3JzZ19TY3JpcHRKYXZhQ2xhc3MuY3BwIGIvbGlicy9ycy9yc2dfU2NyaXB0SmF2YUNsYXNzLmNwcAppbmRleCBjZWU5ZjUyLi4wMTY5Yjk4IDEwMDY0NAotLS0gYS9saWJzL3JzL3JzZ19TY3JpcHRKYXZhQ2xhc3MuY3BwCisrKyBiL2xpYnMvcnMvcnNnX1NjcmlwdEphdmFDbGFzcy5jcHAKQEAgLTcsOCArNywxMiBAQAogc3RydWN0IEVsZW1lbnQ7CiAKIHN0cnVjdCBFbGVtZW50RmllbGQgeworICAgIC8vIEFuIEVsZW1lbnQgRmllbGQgaXMgYSBjb21iaW5hdGlvbiBvZiBhbiBFbGVtZW50IHdpdGggYSBuYW1lIGFzc2lnbmVkLgorCiAgICAgY29uc3QgY2hhciAqbmFtZTsKICAgICBFbGVtZW50ICplOworCisKICAgICBFbGVtZW50RmllbGQoY29uc3QgY2hhciAqbiwgRWxlbWVudCAqX2UpIHsKICAgICAgICAgbmFtZSA9IG47CiAgICAgICAgIGUgPSBfZTsKQEAgLTIwLDEyICsyNCwyMSBAQAogfTsKIAogc3RydWN0IEVsZW1lbnQgeworICAgIC8vIEFuIEVsZW1lbnQgY2FuIHRha2Ugb25lIG9mIHR3byBmb3Jtcy4KKyAgICAvLyAxOiBCYXNpYy4gIEl0IGNvbnRhaW5zIGEgc2luZ2xlIGJhc2ljIHR5cGUgYW5kIHZlY3RvciBzaXplLgorICAgIC8vIDI6IENvbXBsZXguICBJdCBjb250YWlucyBhIGxpc3Qgb2YgZmllbGRzIHdpdGggbmFtZXMuICBFYWNoIGZpZWxkCisgICAgLy8gd2lsbCBpbiB0dXJuIGJlIGFub3RoZXIgZWxlbWVudC4KKwogICAgIEVsZW1lbnRGaWVsZCAqZmllbGRzOwotICAgIHNpemVfdCBmaWVsZENvdW50OworICAgIHNpemVfdCBmaWVsZENvdW50OyAgLy8gSWYgZmllbGQgY291bnQgaXMgMCwgdGhlIGVsZW1lbnQgaXMgYSBCYXNpYyB0eXBlLgogICAgIGNvbnN0IGNoYXIgKm5hbWU7CiAgICAgYm9vbCBnZW5lcmF0ZWQ7CiAKKyAgICAvLyBUaGUgYmFzaWMgZGF0YSB0eXBlIGZyb20gUmVuZGVyU2NyaXB0LmgKICAgICBSc0RhdGFUeXBlIGNvbXBUeXBlOworCisgICAgLy8gVGhlIHZlY3RvciBzaXplIG9mIHRoZSBkYXRhIHR5cGUgZm9yIGZsb2F0MiwgZmxvYXQzLCAuLi4uCisgICAgLy8gQWxsb3dlZCBzaXplcyBhcmUgMiwzLDQsOCwxNgogICAgIHVpbnQzMl90IGNvbXBWZWN0b3JTaXplOwogCiAgICAgRWxlbWVudCgpIHsKZGlmZiAtLWdpdCBhL2xpYnMvcnMvc2NyaXB0Yy9yc19jbC5yc2ggYi9saWJzL3JzL3NjcmlwdGMvcnNfY2wucnNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY0ODQ0YTQKLS0tIC9kZXYvbnVsbAorKysgYi9saWJzL3JzL3NjcmlwdGMvcnNfY2wucnNoCkBAIC0wLDAgKzEsNzg1IEBACisjaWZuZGVmIF9fUlNfQ0xfUlNIX18KKyNkZWZpbmUgX19SU19DTF9SU0hfXworCisjZGVmaW5lIE1fUEkgICAgICAgIDMuMTQxNTkyNjUzNTg5NzkzMjM4NDYyNjQzMzgzMjc5NTAyODhmICAgLyogcGkgKi8KKworCisvLyBDb252ZXJzaW9ucworI2RlZmluZSBDVlRfRlVOQ18yKHR5cGVvdXQsIHR5cGVpbikgXAorc3RhdGljIHR5cGVvdXQjIzIgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgY29udmVydF8jI3R5cGVvdXQjIzIodHlwZWluIyMyIHYpIHsgXAorICAgIHR5cGVvdXQjIzIgciA9IHsodHlwZW91dCl2LngsICh0eXBlb3V0KXYueX07IFwKKyAgICByZXR1cm4gcjsgXAorfSBcCitzdGF0aWMgdHlwZW91dCMjMyBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBjb252ZXJ0XyMjdHlwZW91dCMjMyh0eXBlaW4jIzMgdikgeyBcCisgICAgdHlwZW91dCMjMyByID0geyh0eXBlb3V0KXYueCwgKHR5cGVvdXQpdi55LCAodHlwZW91dCl2Lnp9OyBcCisgICAgcmV0dXJuIHI7IFwKK30gXAorc3RhdGljIHR5cGVvdXQjIzQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgY29udmVydF8jI3R5cGVvdXQjIzQodHlwZWluIyM0IHYpIHsgXAorICAgIHR5cGVvdXQjIzQgciA9IHsodHlwZW91dCl2LngsICh0eXBlb3V0KXYueSwgKHR5cGVvdXQpdi56LCAodHlwZW91dCl2Lnd9OyBcCisgICAgcmV0dXJuIHI7IFwKK30KKworI2RlZmluZSBDVlRfRlVOQyh0eXBlKSAgICAgIENWVF9GVU5DXzIodHlwZSwgdWNoYXIpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDVlRfRlVOQ18yKHR5cGUsIGNoYXIpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDVlRfRlVOQ18yKHR5cGUsIHVzaG9ydCkgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIENWVF9GVU5DXzIodHlwZSwgc2hvcnQpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDVlRfRlVOQ18yKHR5cGUsIGludCkgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIENWVF9GVU5DXzIodHlwZSwgdWludCkgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIENWVF9GVU5DXzIodHlwZSwgZmxvYXQpCisKK0NWVF9GVU5DKGNoYXIpCitDVlRfRlVOQyh1Y2hhcikKK0NWVF9GVU5DKHNob3J0KQorQ1ZUX0ZVTkModXNob3J0KQorQ1ZUX0ZVTkMoaW50KQorQ1ZUX0ZVTkModWludCkKK0NWVF9GVU5DKGZsb2F0KQorCisKKworLy8gRmxvYXQgb3BzLCA2LjExLjIKKworI2RlZmluZSBERUZfRlVOQ18xKGZuYykgXAorc3RhdGljIGZsb2F0MiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBmbmMoZmxvYXQyIHYpIHsgXAorICAgIGZsb2F0MiByOyBcCisgICAgci54ID0gZm5jKHYueCk7IFwKKyAgICByLnkgPSBmbmModi55KTsgXAorICAgIHJldHVybiByOyBcCit9IFwKK3N0YXRpYyBmbG9hdDMgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgZm5jKGZsb2F0MyB2KSB7IFwKKyAgICBmbG9hdDMgcjsgXAorICAgIHIueCA9IGZuYyh2LngpOyBcCisgICAgci55ID0gZm5jKHYueSk7IFwKKyAgICByLnogPSBmbmModi56KTsgXAorICAgIHJldHVybiByOyBcCit9IFwKK3N0YXRpYyBmbG9hdDQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgZm5jKGZsb2F0NCB2KSB7IFwKKyAgICBmbG9hdDQgcjsgXAorICAgIHIueCA9IGZuYyh2LngpOyBcCisgICAgci55ID0gZm5jKHYueSk7IFwKKyAgICByLnogPSBmbmModi56KTsgXAorICAgIHIudyA9IGZuYyh2LncpOyBcCisgICAgcmV0dXJuIHI7IFwKK30KKworI2RlZmluZSBERUZfRlVOQ18yKGZuYykgXAorc3RhdGljIGZsb2F0MiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBmbmMoZmxvYXQyIHYxLCBmbG9hdDIgdjIpIHsgXAorICAgIGZsb2F0MiByOyBcCisgICAgci54ID0gZm5jKHYxLngsIHYyLngpOyBcCisgICAgci55ID0gZm5jKHYxLnksIHYyLnkpOyBcCisgICAgcmV0dXJuIHI7IFwKK30gXAorc3RhdGljIGZsb2F0MyBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBmbmMoZmxvYXQzIHYxLCBmbG9hdDMgdjIpIHsgXAorICAgIGZsb2F0MyByOyBcCisgICAgci54ID0gZm5jKHYxLngsIHYyLngpOyBcCisgICAgci55ID0gZm5jKHYxLnksIHYyLnkpOyBcCisgICAgci56ID0gZm5jKHYxLnosIHYyLnopOyBcCisgICAgcmV0dXJuIHI7IFwKK30gXAorc3RhdGljIGZsb2F0NCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBmbmMoZmxvYXQ0IHYxLCBmbG9hdDQgdjIpIHsgXAorICAgIGZsb2F0NCByOyBcCisgICAgci54ID0gZm5jKHYxLngsIHYyLngpOyBcCisgICAgci55ID0gZm5jKHYxLnksIHYyLnkpOyBcCisgICAgci56ID0gZm5jKHYxLnosIHYyLnopOyBcCisgICAgci53ID0gZm5jKHYxLncsIHYyLnopOyBcCisgICAgcmV0dXJuIHI7IFwKK30KKworI2RlZmluZSBERUZfRlVOQ18yRihmbmMpIFwKK3N0YXRpYyBmbG9hdDIgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgZm5jKGZsb2F0MiB2MSwgZmxvYXQgdjIpIHsgXAorICAgIGZsb2F0MiByOyBcCisgICAgci54ID0gZm5jKHYxLngsIHYyKTsgXAorICAgIHIueSA9IGZuYyh2MS55LCB2Mik7IFwKKyAgICByZXR1cm4gcjsgXAorfSBcCitzdGF0aWMgZmxvYXQzIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGZuYyhmbG9hdDMgdjEsIGZsb2F0IHYyKSB7IFwKKyAgICBmbG9hdDMgcjsgXAorICAgIHIueCA9IGZuYyh2MS54LCB2Mik7IFwKKyAgICByLnkgPSBmbmModjEueSwgdjIpOyBcCisgICAgci56ID0gZm5jKHYxLnosIHYyKTsgXAorICAgIHJldHVybiByOyBcCit9IFwKK3N0YXRpYyBmbG9hdDQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgZm5jKGZsb2F0NCB2MSwgZmxvYXQgdjIpIHsgXAorICAgIGZsb2F0NCByOyBcCisgICAgci54ID0gZm5jKHYxLngsIHYyKTsgXAorICAgIHIueSA9IGZuYyh2MS55LCB2Mik7IFwKKyAgICByLnogPSBmbmModjEueiwgdjIpOyBcCisgICAgci53ID0gZm5jKHYxLncsIHYyKTsgXAorICAgIHJldHVybiByOyBcCit9CisKKworZXh0ZXJuIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGFjb3MoZmxvYXQpOworREVGX0ZVTkNfMShhY29zKQorCitleHRlcm4gZmxvYXQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgYWNvc2goZmxvYXQpOworREVGX0ZVTkNfMShhY29zaCkKKworc3RhdGljIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGFjb3NwaShmbG9hdCB2KSB7CisgICAgcmV0dXJuIGFjb3ModikgLyBNX1BJOworfQorREVGX0ZVTkNfMShhY29zcGkpCisKK2V4dGVybiBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBhc2luKGZsb2F0KTsKK0RFRl9GVU5DXzEoYXNpbikKKworZXh0ZXJuIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGFzaW5oKGZsb2F0KTsKK0RFRl9GVU5DXzEoYXNpbmgpCisKK3N0YXRpYyBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBhc2lucGkoZmxvYXQgdikgeworICAgIHJldHVybiBhc2luKHYpIC8gTV9QSTsKK30KK0RFRl9GVU5DXzEoYXNpbnBpKQorCitleHRlcm4gZmxvYXQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgYXRhbihmbG9hdCk7CitERUZfRlVOQ18xKGF0YW4pCisKK2V4dGVybiBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBhdGFuMihmbG9hdCwgZmxvYXQpOworREVGX0ZVTkNfMihhdGFuMikKKworZXh0ZXJuIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGF0YW5oKGZsb2F0KTsKK0RFRl9GVU5DXzEoYXRhbmgpCisKK3N0YXRpYyBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBhdGFucGkoZmxvYXQgdikgeworICAgIHJldHVybiBhdGFuKHYpIC8gTV9QSTsKK30KK0RFRl9GVU5DXzEoYXRhbnBpKQorCitzdGF0aWMgZmxvYXQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgYXRhbjJwaShmbG9hdCB5LCBmbG9hdCB4KSB7CisgICAgcmV0dXJuIGF0YW4yKHksIHgpIC8gTV9QSTsKK30KK0RFRl9GVU5DXzIoYXRhbjJwaSkKKworZXh0ZXJuIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGNicnQoZmxvYXQpOworREVGX0ZVTkNfMShjYnJ0KQorCitleHRlcm4gZmxvYXQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgY2VpbChmbG9hdCk7CitERUZfRlVOQ18xKGNlaWwpCisKK2V4dGVybiBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBjb3B5c2lnbihmbG9hdCwgZmxvYXQpOworREVGX0ZVTkNfMihjb3B5c2lnbikKKworZXh0ZXJuIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGNvcyhmbG9hdCk7CitERUZfRlVOQ18xKGNvcykKKworZXh0ZXJuIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGNvc2goZmxvYXQpOworREVGX0ZVTkNfMShjb3NoKQorCitzdGF0aWMgZmxvYXQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgY29zcGkoZmxvYXQgdikgeworICAgIHJldHVybiBjb3ModiAqIE1fUEkpOworfQorREVGX0ZVTkNfMShjb3NwaSkKKworZXh0ZXJuIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGVyZmMoZmxvYXQpOworREVGX0ZVTkNfMShlcmZjKQorCitleHRlcm4gZmxvYXQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgZXJmKGZsb2F0KTsKK0RFRl9GVU5DXzEoZXJmKQorCitleHRlcm4gZmxvYXQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgZXhwKGZsb2F0KTsKK0RFRl9GVU5DXzEoZXhwKQorCitleHRlcm4gZmxvYXQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgZXhwMihmbG9hdCk7CitERUZfRlVOQ18xKGV4cDIpCisKK2V4dGVybiBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBwb3coZmxvYXQsIGZsb2F0KTsKK3N0YXRpYyBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBleHAxMChmbG9hdCB2KSB7CisgICAgcmV0dXJuIHBvdygxMC5mLCB2KTsKK30KK0RFRl9GVU5DXzEoZXhwMTApCisKK2V4dGVybiBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBleHBtMShmbG9hdCk7CitERUZfRlVOQ18xKGV4cG0xKQorCitleHRlcm4gZmxvYXQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgZmFicyhmbG9hdCk7CitERUZfRlVOQ18xKGZhYnMpCisKK2V4dGVybiBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBmZGltKGZsb2F0LCBmbG9hdCk7CitERUZfRlVOQ18yKGZkaW0pCisKK2V4dGVybiBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBmbG9vcihmbG9hdCk7CitERUZfRlVOQ18xKGZsb29yKQorCitleHRlcm4gZmxvYXQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgZm1hKGZsb2F0LCBmbG9hdCwgZmxvYXQpOworZXh0ZXJuIGZsb2F0MiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBmbWEoZmxvYXQyLCBmbG9hdDIsIGZsb2F0Mik7CitleHRlcm4gZmxvYXQzIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGZtYShmbG9hdDMsIGZsb2F0MywgZmxvYXQzKTsKK2V4dGVybiBmbG9hdDQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgZm1hKGZsb2F0NCwgZmxvYXQ0LCBmbG9hdDQpOworCitleHRlcm4gZmxvYXQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgZm1heChmbG9hdCwgZmxvYXQpOworREVGX0ZVTkNfMihmbWF4KTsKK0RFRl9GVU5DXzJGKGZtYXgpOworCitleHRlcm4gZmxvYXQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgZm1pbihmbG9hdCwgZmxvYXQpOworREVGX0ZVTkNfMihmbWluKTsKK0RFRl9GVU5DXzJGKGZtaW4pOworCitleHRlcm4gZmxvYXQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgZm1vZChmbG9hdCwgZmxvYXQpOworREVGX0ZVTkNfMihmbW9kKQorCitzdGF0aWMgZmxvYXQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgZnJhY3QoZmxvYXQgdiwgZmxvYXQgKmlwdHIpIHsKKyAgICBpbnQgaSA9IChpbnQpZmxvb3Iodik7CisgICAgaXB0clswXSA9IGk7CisgICAgcmV0dXJuIGZtaW4odiAtIGksIDB4MS5mZmZmZmVwLTFmKTsKK30KK3N0YXRpYyBmbG9hdDIgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgZnJhY3QoZmxvYXQyIHYsIGZsb2F0MiAqaXB0cikgeworICAgIGZsb2F0IHRbMl07CisgICAgZmxvYXQyIHI7CisgICAgci54ID0gZnJhY3Qodi54LCAmdFswXSk7CisgICAgci55ID0gZnJhY3Qodi55LCAmdFsxXSk7CisgICAgaXB0clswXSA9IHRbMF07CisgICAgaXB0clsxXSA9IHRbMV07CisgICAgcmV0dXJuIHI7Cit9CitzdGF0aWMgZmxvYXQzIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGZyYWN0KGZsb2F0MyB2LCBmbG9hdDMgKmlwdHIpIHsKKyAgICBmbG9hdCB0WzNdOworICAgIGZsb2F0MyByOworICAgIHIueCA9IGZyYWN0KHYueCwgJnRbMF0pOworICAgIHIueSA9IGZyYWN0KHYueSwgJnRbMV0pOworICAgIHIueiA9IGZyYWN0KHYueiwgJnRbMl0pOworICAgIGlwdHJbMF0gPSB0WzBdOworICAgIGlwdHJbMV0gPSB0WzFdOworICAgIGlwdHJbMl0gPSB0WzJdOworICAgIHJldHVybiByOworfQorc3RhdGljIGZsb2F0NCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBmcmFjdChmbG9hdDQgdiwgZmxvYXQ0ICppcHRyKSB7CisgICAgZmxvYXQgdFs0XTsKKyAgICBmbG9hdDQgcjsKKyAgICByLnggPSBmcmFjdCh2LngsICZ0WzBdKTsKKyAgICByLnkgPSBmcmFjdCh2LnksICZ0WzFdKTsKKyAgICByLnogPSBmcmFjdCh2LnosICZ0WzJdKTsKKyAgICByLncgPSBmcmFjdCh2LncsICZ0WzNdKTsKKyAgICBpcHRyWzBdID0gdFswXTsKKyAgICBpcHRyWzFdID0gdFsxXTsKKyAgICBpcHRyWzJdID0gdFsyXTsKKyAgICBpcHRyWzNdID0gdFszXTsKKyAgICByZXR1cm4gcjsKK30KKworZXh0ZXJuIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGZyZXhwKGZsb2F0LCBmbG9hdCAqKTsKK2V4dGVybiBmbG9hdDIgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgZnJleHAoZmxvYXQyLCBmbG9hdDIgKik7CitleHRlcm4gZmxvYXQzIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGZyZXhwKGZsb2F0MywgZmxvYXQzICopOworZXh0ZXJuIGZsb2F0NCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBmcmV4cChmbG9hdDQsIGZsb2F0NCAqKTsKKworZXh0ZXJuIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGh5cG90KGZsb2F0LCBmbG9hdCk7CitERUZfRlVOQ18yKGh5cG90KQorCitleHRlcm4gaW50IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGlsb2diKGZsb2F0KTsKK0RFRl9GVU5DXzEoaWxvZ2IpCisKK2V4dGVybiBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBsZGV4cChmbG9hdCwgaW50KTsKK2V4dGVybiBmbG9hdDIgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgbGRleHAoZmxvYXQyLCBpbnQyKTsKK2V4dGVybiBmbG9hdDMgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgbGRleHAoZmxvYXQzLCBpbnQzKTsKK2V4dGVybiBmbG9hdDQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgbGRleHAoZmxvYXQ0LCBpbnQ0KTsKK2V4dGVybiBmbG9hdDIgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgbGRleHAoZmxvYXQyLCBpbnQpOworZXh0ZXJuIGZsb2F0MyBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBsZGV4cChmbG9hdDMsIGludCk7CitleHRlcm4gZmxvYXQ0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGxkZXhwKGZsb2F0NCwgaW50KTsKKworZXh0ZXJuIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGxnYW1tYShmbG9hdCk7CitERUZfRlVOQ18xKGxnYW1tYSkKK2V4dGVybiBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBsZ2FtbWEoZmxvYXQsIGZsb2F0ICopOworZXh0ZXJuIGZsb2F0MiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBsZ2FtbWEoZmxvYXQyLCBmbG9hdDIgKik7CitleHRlcm4gZmxvYXQzIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGxnYW1tYShmbG9hdDMsIGZsb2F0MyAqKTsKK2V4dGVybiBmbG9hdDQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgbGdhbW1hKGZsb2F0NCwgZmxvYXQ0ICopOworCitleHRlcm4gZmxvYXQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgbG9nKGZsb2F0KTsKK0RFRl9GVU5DXzEobG9nKQorCisKK2V4dGVybiBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBsb2cxMChmbG9hdCk7CitERUZfRlVOQ18xKGxvZzEwKQorCitzdGF0aWMgZmxvYXQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgbG9nMihmbG9hdCB2KSB7CisgICAgcmV0dXJuIGxvZzEwKHYpIC8gbG9nMTAoMi5mKTsKK30KK0RFRl9GVU5DXzEobG9nMikKKworZXh0ZXJuIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGxvZzFwKGZsb2F0KTsKK0RFRl9GVU5DXzEobG9nMXApCisKK2V4dGVybiBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBsb2diKGZsb2F0KTsKK0RFRl9GVU5DXzEobG9nYikKKworZXh0ZXJuIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIG1hZChmbG9hdCwgZmxvYXQsIGZsb2F0KTsKK2V4dGVybiBmbG9hdDIgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgbWFkKGZsb2F0MiwgZmxvYXQyLCBmbG9hdDIpOworZXh0ZXJuIGZsb2F0MyBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBtYWQoZmxvYXQzLCBmbG9hdDMsIGZsb2F0Myk7CitleHRlcm4gZmxvYXQ0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIG1hZChmbG9hdDQsIGZsb2F0NCwgZmxvYXQ0KTsKKworZXh0ZXJuIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIG1vZGYoZmxvYXQsIGZsb2F0ICopOworZXh0ZXJuIGZsb2F0MiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBtb2RmKGZsb2F0MiwgZmxvYXQyICopOworZXh0ZXJuIGZsb2F0MyBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBtb2RmKGZsb2F0MywgZmxvYXQzICopOworZXh0ZXJuIGZsb2F0NCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBtb2RmKGZsb2F0NCwgZmxvYXQ0ICopOworCisvL2V4dGVybiBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBuYW4odWludCk7CisKK2V4dGVybiBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBuZXh0YWZ0ZXIoZmxvYXQsIGZsb2F0KTsKK0RFRl9GVU5DXzIobmV4dGFmdGVyKQorCitERUZfRlVOQ18yKHBvdykKKworc3RhdGljIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIHBvd24oZmxvYXQgdiwgaW50IHApIHsKKyAgICByZXR1cm4gcG93KHYsIChmbG9hdClwKTsKK30KK3N0YXRpYyBmbG9hdDIgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgcG93bihmbG9hdDIgdiwgaW50MiBwKSB7CisgICAgcmV0dXJuIHBvdyh2LCAoZmxvYXQyKXApOworfQorc3RhdGljIGZsb2F0MyBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBwb3duKGZsb2F0MyB2LCBpbnQzIHApIHsKKyAgICByZXR1cm4gcG93KHYsIChmbG9hdDMpcCk7Cit9CitzdGF0aWMgZmxvYXQ0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIHBvd24oZmxvYXQ0IHYsIGludDQgcCkgeworICAgIHJldHVybiBwb3codiwgKGZsb2F0NClwKTsKK30KKworc3RhdGljIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIHBvd3IoZmxvYXQgdiwgZmxvYXQgcCkgeworICAgIHJldHVybiBwb3codiwgcCk7Cit9CitzdGF0aWMgZmxvYXQyIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIHBvd3IoZmxvYXQyIHYsIGZsb2F0MiBwKSB7CisgICAgcmV0dXJuIHBvdyh2LCBwKTsKK30KK3N0YXRpYyBmbG9hdDMgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgcG93cihmbG9hdDMgdiwgZmxvYXQzIHApIHsKKyAgICByZXR1cm4gcG93KHYsIHApOworfQorc3RhdGljIGZsb2F0NCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBwb3dyKGZsb2F0NCB2LCBmbG9hdDQgcCkgeworICAgIHJldHVybiBwb3codiwgcCk7Cit9CisKK2V4dGVybiBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSByZW1haW5kZXIoZmxvYXQsIGZsb2F0KTsKK0RFRl9GVU5DXzIocmVtYWluZGVyKQorCitleHRlcm4gZmxvYXQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgcmVtcXVvKGZsb2F0LCBmbG9hdCwgZmxvYXQgKik7CitleHRlcm4gZmxvYXQyIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIHJlbXF1byhmbG9hdDIsIGZsb2F0MiwgZmxvYXQyICopOworZXh0ZXJuIGZsb2F0MyBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSByZW1xdW8oZmxvYXQzLCBmbG9hdDMsIGZsb2F0MyAqKTsKK2V4dGVybiBmbG9hdDQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgcmVtcXVvKGZsb2F0NCwgZmxvYXQ0LCBmbG9hdDQgKik7CisKK2V4dGVybiBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSByaW50KGZsb2F0KTsKK0RFRl9GVU5DXzEocmludCkKKworc3RhdGljIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIHJvb3RuKGZsb2F0IHYsIGludCByKSB7CisgICAgcmV0dXJuIHBvdyh2LCAxLmYgLyByKTsKK30KK3N0YXRpYyBmbG9hdDIgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgcm9vdG4oZmxvYXQyIHYsIGludDIgcikgeworICAgIGZsb2F0MiB0ID0gezEuZiAvIHIueCwgMS5mIC8gci55fTsKKyAgICByZXR1cm4gcG93KHYsIHQpOworfQorc3RhdGljIGZsb2F0MyBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSByb290bihmbG9hdDMgdiwgaW50MyByKSB7CisgICAgZmxvYXQzIHQgPSB7MS5mIC8gci54LCAxLmYgLyByLnksIDEuZiAvIHIuen07CisgICAgcmV0dXJuIHBvdyh2LCB0KTsKK30KK3N0YXRpYyBmbG9hdDQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgcm9vdG4oZmxvYXQ0IHYsIGludDQgcikgeworICAgIGZsb2F0NCB0ID0gezEuZiAvIHIueCwgMS5mIC8gci55LCAxLmYgLyByLnosIDEuZiAvIHIud307CisgICAgcmV0dXJuIHBvdyh2LCB0KTsKK30KKworZXh0ZXJuIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIHJvdW5kKGZsb2F0KTsKK0RFRl9GVU5DXzEocm91bmQpCisKK2V4dGVybiBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBzcXJ0KGZsb2F0KTsKKy8qc3RhdGljIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIHJzcXJ0KGZsb2F0IHYpIHsKKyAgICByZXR1cm4gMS5mIC8gc3FydCh2KTsKK30KK0RFRl9GVU5DXzEocnNxcnQpKi8KKworZXh0ZXJuIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIHNpbihmbG9hdCk7CitERUZfRlVOQ18xKHNpbikKKworc3RhdGljIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIHNpbmNvcyhmbG9hdCB2LCBmbG9hdCAqY29zcHRyKSB7CisgICAgKmNvc3B0ciA9IGNvcyh2KTsKKyAgICByZXR1cm4gc2luKHYpOworfQorc3RhdGljIGZsb2F0MiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBzaW5jb3MoZmxvYXQyIHYsIGZsb2F0MiAqY29zcHRyKSB7CisgICAgKmNvc3B0ciA9IGNvcyh2KTsKKyAgICByZXR1cm4gc2luKHYpOworfQorc3RhdGljIGZsb2F0MyBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBzaW5jb3MoZmxvYXQzIHYsIGZsb2F0MyAqY29zcHRyKSB7CisgICAgKmNvc3B0ciA9IGNvcyh2KTsKKyAgICByZXR1cm4gc2luKHYpOworfQorc3RhdGljIGZsb2F0NCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBzaW5jb3MoZmxvYXQ0IHYsIGZsb2F0NCAqY29zcHRyKSB7CisgICAgKmNvc3B0ciA9IGNvcyh2KTsKKyAgICByZXR1cm4gc2luKHYpOworfQorCitleHRlcm4gZmxvYXQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgc2luaChmbG9hdCk7CitERUZfRlVOQ18xKHNpbmgpCisKK3N0YXRpYyBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBzaW5waShmbG9hdCB2KSB7CisgICAgcmV0dXJuIHNpbih2ICogTV9QSSk7Cit9CitERUZfRlVOQ18xKHNpbnBpKQorCitERUZfRlVOQ18xKHNxcnQpCisKK2V4dGVybiBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSB0YW4oZmxvYXQpOworREVGX0ZVTkNfMSh0YW4pCisKK2V4dGVybiBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSB0YW5oKGZsb2F0KTsKK0RFRl9GVU5DXzEodGFuaCkKKworc3RhdGljIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIHRhbnBpKGZsb2F0IHYpIHsKKyAgICByZXR1cm4gdGFuKHYgKiBNX1BJKTsKK30KK0RFRl9GVU5DXzEodGFucGkpCisKK2V4dGVybiBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSB0Z2FtbWEoZmxvYXQpOworREVGX0ZVTkNfMSh0Z2FtbWEpCisKK2V4dGVybiBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSB0cnVuYyhmbG9hdCk7CitERUZfRlVOQ18xKHRydW5jKQorCisvLyBJbnQgb3BzIChwYXJ0aWFsKSwgNi4xMS4zCitleHRlcm4gdWludCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBhYnMoaW50KTsKK2V4dGVybiB1c2hvcnQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgYWJzKHNob3J0KTsKK2V4dGVybiB1Y2hhciBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBhYnMoY2hhcik7CisKK2V4dGVybiB1aW50IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGNseih1aW50KTsKK2V4dGVybiBpbnQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgY2x6KGludCk7CitleHRlcm4gdXNob3J0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGNseih1c2hvcnQpOworZXh0ZXJuIHNob3J0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGNseihzaG9ydCk7CitleHRlcm4gdWNoYXIgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgY2x6KHVjaGFyKTsKK2V4dGVybiBjaGFyIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGNseihjaGFyKTsKKworc3RhdGljIHVpbnQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgbWluKHVpbnQgdjEsIHVpbnQgdjIpIHsKKyAgICByZXR1cm4gdjEgPCB2MiA/IHYxIDogdjI7Cit9CitzdGF0aWMgaW50IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIG1pbihpbnQgdjEsIGludCB2MikgeworICAgIHJldHVybiB2MSA8IHYyID8gdjEgOiB2MjsKK30KK3N0YXRpYyB1c2hvcnQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgbWluKHVzaG9ydCB2MSwgdXNob3J0IHYyKSB7CisgICAgcmV0dXJuIHYxIDwgdjIgPyB2MSA6IHYyOworfQorc3RhdGljIHNob3J0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIG1pbihzaG9ydCB2MSwgc2hvcnQgdjIpIHsKKyAgICByZXR1cm4gdjEgPCB2MiA/IHYxIDogdjI7Cit9CitzdGF0aWMgdWNoYXIgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgbWluKHVjaGFyIHYxLCB1Y2hhciB2MikgeworICAgIHJldHVybiB2MSA8IHYyID8gdjEgOiB2MjsKK30KK3N0YXRpYyBjaGFyIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIG1pbihjaGFyIHYxLCBjaGFyIHYyKSB7CisgICAgcmV0dXJuIHYxIDwgdjIgPyB2MSA6IHYyOworfQorCitzdGF0aWMgdWludCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBtYXgodWludCB2MSwgdWludCB2MikgeworICAgIHJldHVybiB2MSA+IHYyID8gdjEgOiB2MjsKK30KK3N0YXRpYyBpbnQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgbWF4KGludCB2MSwgaW50IHYyKSB7CisgICAgcmV0dXJuIHYxID4gdjIgPyB2MSA6IHYyOworfQorc3RhdGljIHVzaG9ydCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBtYXgodXNob3J0IHYxLCB1c2hvcnQgdjIpIHsKKyAgICByZXR1cm4gdjEgPiB2MiA/IHYxIDogdjI7Cit9CitzdGF0aWMgc2hvcnQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgbWF4KHNob3J0IHYxLCBzaG9ydCB2MikgeworICAgIHJldHVybiB2MSA+IHYyID8gdjEgOiB2MjsKK30KK3N0YXRpYyB1Y2hhciBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBtYXgodWNoYXIgdjEsIHVjaGFyIHYyKSB7CisgICAgcmV0dXJuIHYxID4gdjIgPyB2MSA6IHYyOworfQorc3RhdGljIGNoYXIgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgbWF4KGNoYXIgdjEsIGNoYXIgdjIpIHsKKyAgICByZXR1cm4gdjEgPiB2MiA/IHYxIDogdjI7Cit9CisKKworCisKKy8vIDYuMTEuNAorCitzdGF0aWMgZmxvYXQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgY2xhbXAoZmxvYXQgYW1vdW50LCBmbG9hdCBsb3csIGZsb2F0IGhpZ2gpIHsKKyAgICByZXR1cm4gYW1vdW50IDwgbG93ID8gbG93IDogKGFtb3VudCA+IGhpZ2ggPyBoaWdoIDogYW1vdW50KTsKK30KK3N0YXRpYyBmbG9hdDIgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgY2xhbXAoZmxvYXQyIGFtb3VudCwgZmxvYXQyIGxvdywgZmxvYXQyIGhpZ2gpIHsKKyAgICBmbG9hdDIgcjsKKyAgICByLnggPSBhbW91bnQueCA8IGxvdy54ID8gbG93LnggOiAoYW1vdW50LnggPiBoaWdoLnggPyBoaWdoLnggOiBhbW91bnQueCk7CisgICAgci55ID0gYW1vdW50LnkgPCBsb3cueSA/IGxvdy55IDogKGFtb3VudC55ID4gaGlnaC55ID8gaGlnaC55IDogYW1vdW50LnkpOworICAgIHJldHVybiByOworfQorc3RhdGljIGZsb2F0MyBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBjbGFtcChmbG9hdDMgYW1vdW50LCBmbG9hdDMgbG93LCBmbG9hdDMgaGlnaCkgeworICAgIGZsb2F0MyByOworICAgIHIueCA9IGFtb3VudC54IDwgbG93LnggPyBsb3cueCA6IChhbW91bnQueCA+IGhpZ2gueCA/IGhpZ2gueCA6IGFtb3VudC54KTsKKyAgICByLnkgPSBhbW91bnQueSA8IGxvdy55ID8gbG93LnkgOiAoYW1vdW50LnkgPiBoaWdoLnkgPyBoaWdoLnkgOiBhbW91bnQueSk7CisgICAgci56ID0gYW1vdW50LnogPCBsb3cueiA/IGxvdy56IDogKGFtb3VudC56ID4gaGlnaC56ID8gaGlnaC56IDogYW1vdW50LnopOworICAgIHJldHVybiByOworfQorc3RhdGljIGZsb2F0NCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBjbGFtcChmbG9hdDQgYW1vdW50LCBmbG9hdDQgbG93LCBmbG9hdDQgaGlnaCkgeworICAgIGZsb2F0NCByOworICAgIHIueCA9IGFtb3VudC54IDwgbG93LnggPyBsb3cueCA6IChhbW91bnQueCA+IGhpZ2gueCA/IGhpZ2gueCA6IGFtb3VudC54KTsKKyAgICByLnkgPSBhbW91bnQueSA8IGxvdy55ID8gbG93LnkgOiAoYW1vdW50LnkgPiBoaWdoLnkgPyBoaWdoLnkgOiBhbW91bnQueSk7CisgICAgci56ID0gYW1vdW50LnogPCBsb3cueiA/IGxvdy56IDogKGFtb3VudC56ID4gaGlnaC56ID8gaGlnaC56IDogYW1vdW50LnopOworICAgIHIudyA9IGFtb3VudC53IDwgbG93LncgPyBsb3cudyA6IChhbW91bnQudyA+IGhpZ2gudyA/IGhpZ2gudyA6IGFtb3VudC53KTsKKyAgICByZXR1cm4gcjsKK30KK3N0YXRpYyBmbG9hdDIgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgY2xhbXAoZmxvYXQyIGFtb3VudCwgZmxvYXQgbG93LCBmbG9hdCBoaWdoKSB7CisgICAgZmxvYXQyIHI7CisgICAgci54ID0gYW1vdW50LnggPCBsb3cgPyBsb3cgOiAoYW1vdW50LnggPiBoaWdoID8gaGlnaCA6IGFtb3VudC54KTsKKyAgICByLnkgPSBhbW91bnQueSA8IGxvdyA/IGxvdyA6IChhbW91bnQueSA+IGhpZ2ggPyBoaWdoIDogYW1vdW50LnkpOworICAgIHJldHVybiByOworfQorc3RhdGljIGZsb2F0MyBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBjbGFtcChmbG9hdDMgYW1vdW50LCBmbG9hdCBsb3csIGZsb2F0IGhpZ2gpIHsKKyAgICBmbG9hdDMgcjsKKyAgICByLnggPSBhbW91bnQueCA8IGxvdyA/IGxvdyA6IChhbW91bnQueCA+IGhpZ2ggPyBoaWdoIDogYW1vdW50LngpOworICAgIHIueSA9IGFtb3VudC55IDwgbG93ID8gbG93IDogKGFtb3VudC55ID4gaGlnaCA/IGhpZ2ggOiBhbW91bnQueSk7CisgICAgci56ID0gYW1vdW50LnogPCBsb3cgPyBsb3cgOiAoYW1vdW50LnogPiBoaWdoID8gaGlnaCA6IGFtb3VudC56KTsKKyAgICByZXR1cm4gcjsKK30KK3N0YXRpYyBmbG9hdDQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgY2xhbXAoZmxvYXQ0IGFtb3VudCwgZmxvYXQgbG93LCBmbG9hdCBoaWdoKSB7CisgICAgZmxvYXQ0IHI7CisgICAgci54ID0gYW1vdW50LnggPCBsb3cgPyBsb3cgOiAoYW1vdW50LnggPiBoaWdoID8gaGlnaCA6IGFtb3VudC54KTsKKyAgICByLnkgPSBhbW91bnQueSA8IGxvdyA/IGxvdyA6IChhbW91bnQueSA+IGhpZ2ggPyBoaWdoIDogYW1vdW50LnkpOworICAgIHIueiA9IGFtb3VudC56IDwgbG93ID8gbG93IDogKGFtb3VudC56ID4gaGlnaCA/IGhpZ2ggOiBhbW91bnQueik7CisgICAgci53ID0gYW1vdW50LncgPCBsb3cgPyBsb3cgOiAoYW1vdW50LncgPiBoaWdoID8gaGlnaCA6IGFtb3VudC53KTsKKyAgICByZXR1cm4gcjsKK30KKworc3RhdGljIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGRlZ3JlZXMoZmxvYXQgcmFkaWFucykgeworICAgIHJldHVybiByYWRpYW5zICogKDE4MC5mIC8gTV9QSSk7Cit9CitERUZfRlVOQ18xKGRlZ3JlZXMpCisKK3N0YXRpYyBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBtYXgoZmxvYXQgdjEsIGZsb2F0IHYyKSB7CisgICAgcmV0dXJuIHYxID4gdjIgPyB2MSA6IHYyOworfQorc3RhdGljIGZsb2F0MiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBtYXgoZmxvYXQyIHYxLCBmbG9hdDIgdjIpIHsKKyAgICBmbG9hdDIgcjsKKyAgICByLnggPSB2MS54ID4gdjIueCA/IHYxLnggOiB2Mi54OworICAgIHIueSA9IHYxLnkgPiB2Mi55ID8gdjEueSA6IHYyLnk7CisgICAgcmV0dXJuIHI7Cit9CitzdGF0aWMgZmxvYXQzIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIG1heChmbG9hdDMgdjEsIGZsb2F0MyB2MikgeworICAgIGZsb2F0MyByOworICAgIHIueCA9IHYxLnggPiB2Mi54ID8gdjEueCA6IHYyLng7CisgICAgci55ID0gdjEueSA+IHYyLnkgPyB2MS55IDogdjIueTsKKyAgICByLnogPSB2MS56ID4gdjIueiA/IHYxLnogOiB2Mi56OworICAgIHJldHVybiByOworfQorc3RhdGljIGZsb2F0NCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBtYXgoZmxvYXQ0IHYxLCBmbG9hdDQgdjIpIHsKKyAgICBmbG9hdDQgcjsKKyAgICByLnggPSB2MS54ID4gdjIueCA/IHYxLnggOiB2Mi54OworICAgIHIueSA9IHYxLnkgPiB2Mi55ID8gdjEueSA6IHYyLnk7CisgICAgci56ID0gdjEueiA+IHYyLnogPyB2MS56IDogdjIuejsKKyAgICByLncgPSB2MS53ID4gdjIudyA/IHYxLncgOiB2Mi53OworICAgIHJldHVybiByOworfQorc3RhdGljIGZsb2F0MiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBtYXgoZmxvYXQyIHYxLCBmbG9hdCB2MikgeworICAgIGZsb2F0MiByOworICAgIHIueCA9IHYxLnggPiB2MiA/IHYxLnggOiB2MjsKKyAgICByLnkgPSB2MS55ID4gdjIgPyB2MS55IDogdjI7CisgICAgcmV0dXJuIHI7Cit9CitzdGF0aWMgZmxvYXQzIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIG1heChmbG9hdDMgdjEsIGZsb2F0IHYyKSB7CisgICAgZmxvYXQzIHI7CisgICAgci54ID0gdjEueCA+IHYyID8gdjEueCA6IHYyOworICAgIHIueSA9IHYxLnkgPiB2MiA/IHYxLnkgOiB2MjsKKyAgICByLnogPSB2MS56ID4gdjIgPyB2MS56IDogdjI7CisgICAgcmV0dXJuIHI7Cit9CitzdGF0aWMgZmxvYXQ0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIG1heChmbG9hdDQgdjEsIGZsb2F0IHYyKSB7CisgICAgZmxvYXQ0IHI7CisgICAgci54ID0gdjEueCA+IHYyID8gdjEueCA6IHYyOworICAgIHIueSA9IHYxLnkgPiB2MiA/IHYxLnkgOiB2MjsKKyAgICByLnogPSB2MS56ID4gdjIgPyB2MS56IDogdjI7CisgICAgci53ID0gdjEudyA+IHYyID8gdjEudyA6IHYyOworICAgIHJldHVybiByOworfQorCitzdGF0aWMgZmxvYXQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgbWluKGZsb2F0IHYxLCBmbG9hdCB2MikgeworICAgIHJldHVybiB2MSA8IHYyID8gdjEgOiB2MjsKK30KK3N0YXRpYyBmbG9hdDIgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgbWluKGZsb2F0MiB2MSwgZmxvYXQyIHYyKSB7CisgICAgZmxvYXQyIHI7CisgICAgci54ID0gdjEueCA8IHYyLnggPyB2MS54IDogdjIueDsKKyAgICByLnkgPSB2MS55IDwgdjIueSA/IHYxLnkgOiB2Mi55OworICAgIHJldHVybiByOworfQorc3RhdGljIGZsb2F0MyBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBtaW4oZmxvYXQzIHYxLCBmbG9hdDMgdjIpIHsKKyAgICBmbG9hdDMgcjsKKyAgICByLnggPSB2MS54IDwgdjIueCA/IHYxLnggOiB2Mi54OworICAgIHIueSA9IHYxLnkgPCB2Mi55ID8gdjEueSA6IHYyLnk7CisgICAgci56ID0gdjEueiA8IHYyLnogPyB2MS56IDogdjIuejsKKyAgICByZXR1cm4gcjsKK30KK3N0YXRpYyBmbG9hdDQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgbWluKGZsb2F0NCB2MSwgZmxvYXQ0IHYyKSB7CisgICAgZmxvYXQ0IHI7CisgICAgci54ID0gdjEueCA8IHYyLnggPyB2MS54IDogdjIueDsKKyAgICByLnkgPSB2MS55IDwgdjIueSA/IHYxLnkgOiB2Mi55OworICAgIHIueiA9IHYxLnogPCB2Mi56ID8gdjEueiA6IHYyLno7CisgICAgci53ID0gdjEudyA8IHYyLncgPyB2MS53IDogdjIudzsKKyAgICByZXR1cm4gcjsKK30KK3N0YXRpYyBmbG9hdDIgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgbWluKGZsb2F0MiB2MSwgZmxvYXQgdjIpIHsKKyAgICBmbG9hdDIgcjsKKyAgICByLnggPSB2MS54IDwgdjIgPyB2MS54IDogdjI7CisgICAgci55ID0gdjEueSA8IHYyID8gdjEueSA6IHYyOworICAgIHJldHVybiByOworfQorc3RhdGljIGZsb2F0MyBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBtaW4oZmxvYXQzIHYxLCBmbG9hdCB2MikgeworICAgIGZsb2F0MyByOworICAgIHIueCA9IHYxLnggPCB2MiA/IHYxLnggOiB2MjsKKyAgICByLnkgPSB2MS55IDwgdjIgPyB2MS55IDogdjI7CisgICAgci56ID0gdjEueiA8IHYyID8gdjEueiA6IHYyOworICAgIHJldHVybiByOworfQorc3RhdGljIGZsb2F0NCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBtaW4oZmxvYXQ0IHYxLCBmbG9hdCB2MikgeworICAgIGZsb2F0NCByOworICAgIHIueCA9IHYxLnggPCB2MiA/IHYxLnggOiB2MjsKKyAgICByLnkgPSB2MS55IDwgdjIgPyB2MS55IDogdjI7CisgICAgci56ID0gdjEueiA8IHYyID8gdjEueiA6IHYyOworICAgIHIudyA9IHYxLncgPCB2MiA/IHYxLncgOiB2MjsKKyAgICByZXR1cm4gcjsKK30KKworc3RhdGljIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIG1peChmbG9hdCBzdGFydCwgZmxvYXQgc3RvcCwgZmxvYXQgYW1vdW50KSB7CisgICAgcmV0dXJuIHN0YXJ0ICsgKHN0b3AgLSBzdGFydCkgKiBhbW91bnQ7Cit9CitzdGF0aWMgZmxvYXQyIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIG1peChmbG9hdDIgc3RhcnQsIGZsb2F0MiBzdG9wLCBmbG9hdDIgYW1vdW50KSB7CisgICAgcmV0dXJuIHN0YXJ0ICsgKHN0b3AgLSBzdGFydCkgKiBhbW91bnQ7Cit9CitzdGF0aWMgZmxvYXQzIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIG1peChmbG9hdDMgc3RhcnQsIGZsb2F0MyBzdG9wLCBmbG9hdDMgYW1vdW50KSB7CisgICAgcmV0dXJuIHN0YXJ0ICsgKHN0b3AgLSBzdGFydCkgKiBhbW91bnQ7Cit9CitzdGF0aWMgZmxvYXQ0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIG1peChmbG9hdDQgc3RhcnQsIGZsb2F0NCBzdG9wLCBmbG9hdDQgYW1vdW50KSB7CisgICAgcmV0dXJuIHN0YXJ0ICsgKHN0b3AgLSBzdGFydCkgKiBhbW91bnQ7Cit9CitzdGF0aWMgZmxvYXQyIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIG1peChmbG9hdDIgc3RhcnQsIGZsb2F0MiBzdG9wLCBmbG9hdCBhbW91bnQpIHsKKyAgICByZXR1cm4gc3RhcnQgKyAoc3RvcCAtIHN0YXJ0KSAqIGFtb3VudDsKK30KK3N0YXRpYyBmbG9hdDMgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgbWl4KGZsb2F0MyBzdGFydCwgZmxvYXQzIHN0b3AsIGZsb2F0IGFtb3VudCkgeworICAgIHJldHVybiBzdGFydCArIChzdG9wIC0gc3RhcnQpICogYW1vdW50OworfQorc3RhdGljIGZsb2F0NCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBtaXgoZmxvYXQ0IHN0YXJ0LCBmbG9hdDQgc3RvcCwgZmxvYXQgYW1vdW50KSB7CisgICAgcmV0dXJuIHN0YXJ0ICsgKHN0b3AgLSBzdGFydCkgKiBhbW91bnQ7Cit9CisKK3N0YXRpYyBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSByYWRpYW5zKGZsb2F0IGRlZ3JlZXMpIHsKKyAgICByZXR1cm4gZGVncmVlcyAqIChNX1BJIC8gMTgwLmYpOworfQorREVGX0ZVTkNfMShyYWRpYW5zKQorCitzdGF0aWMgZmxvYXQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgc3RlcChmbG9hdCBlZGdlLCBmbG9hdCB2KSB7CisgICAgcmV0dXJuICh2IDwgZWRnZSkgPyAwLmYgOiAxLmY7Cit9CitzdGF0aWMgZmxvYXQyIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIHN0ZXAoZmxvYXQyIGVkZ2UsIGZsb2F0MiB2KSB7CisgICAgZmxvYXQyIHI7CisgICAgci54ID0gKHYueCA8IGVkZ2UueCkgPyAwLmYgOiAxLmY7CisgICAgci55ID0gKHYueSA8IGVkZ2UueSkgPyAwLmYgOiAxLmY7CisgICAgcmV0dXJuIHI7Cit9CitzdGF0aWMgZmxvYXQzIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIHN0ZXAoZmxvYXQzIGVkZ2UsIGZsb2F0MyB2KSB7CisgICAgZmxvYXQzIHI7CisgICAgci54ID0gKHYueCA8IGVkZ2UueCkgPyAwLmYgOiAxLmY7CisgICAgci55ID0gKHYueSA8IGVkZ2UueSkgPyAwLmYgOiAxLmY7CisgICAgci56ID0gKHYueiA8IGVkZ2UueikgPyAwLmYgOiAxLmY7CisgICAgcmV0dXJuIHI7Cit9CitzdGF0aWMgZmxvYXQ0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIHN0ZXAoZmxvYXQ0IGVkZ2UsIGZsb2F0NCB2KSB7CisgICAgZmxvYXQ0IHI7CisgICAgci54ID0gKHYueCA8IGVkZ2UueCkgPyAwLmYgOiAxLmY7CisgICAgci55ID0gKHYueSA8IGVkZ2UueSkgPyAwLmYgOiAxLmY7CisgICAgci56ID0gKHYueiA8IGVkZ2UueikgPyAwLmYgOiAxLmY7CisgICAgci53ID0gKHYudyA8IGVkZ2UudykgPyAwLmYgOiAxLmY7CisgICAgcmV0dXJuIHI7Cit9CitzdGF0aWMgZmxvYXQyIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIHN0ZXAoZmxvYXQyIGVkZ2UsIGZsb2F0IHYpIHsKKyAgICBmbG9hdDIgcjsKKyAgICByLnggPSAodiA8IGVkZ2UueCkgPyAwLmYgOiAxLmY7CisgICAgci55ID0gKHYgPCBlZGdlLnkpID8gMC5mIDogMS5mOworICAgIHJldHVybiByOworfQorc3RhdGljIGZsb2F0MyBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBzdGVwKGZsb2F0MyBlZGdlLCBmbG9hdCB2KSB7CisgICAgZmxvYXQzIHI7CisgICAgci54ID0gKHYgPCBlZGdlLngpID8gMC5mIDogMS5mOworICAgIHIueSA9ICh2IDwgZWRnZS55KSA/IDAuZiA6IDEuZjsKKyAgICByLnogPSAodiA8IGVkZ2UueikgPyAwLmYgOiAxLmY7CisgICAgcmV0dXJuIHI7Cit9CitzdGF0aWMgZmxvYXQ0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIHN0ZXAoZmxvYXQ0IGVkZ2UsIGZsb2F0IHYpIHsKKyAgICBmbG9hdDQgcjsKKyAgICByLnggPSAodiA8IGVkZ2UueCkgPyAwLmYgOiAxLmY7CisgICAgci55ID0gKHYgPCBlZGdlLnkpID8gMC5mIDogMS5mOworICAgIHIueiA9ICh2IDwgZWRnZS56KSA/IDAuZiA6IDEuZjsKKyAgICByLncgPSAodiA8IGVkZ2UudykgPyAwLmYgOiAxLmY7CisgICAgcmV0dXJuIHI7Cit9CisKK2V4dGVybiBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBzbW9vdGhzdGVwKGZsb2F0LCBmbG9hdCwgZmxvYXQpOworZXh0ZXJuIGZsb2F0MiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBzbW9vdGhzdGVwKGZsb2F0MiwgZmxvYXQyLCBmbG9hdDIpOworZXh0ZXJuIGZsb2F0MyBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBzbW9vdGhzdGVwKGZsb2F0MywgZmxvYXQzLCBmbG9hdDMpOworZXh0ZXJuIGZsb2F0NCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBzbW9vdGhzdGVwKGZsb2F0NCwgZmxvYXQ0LCBmbG9hdDQpOworZXh0ZXJuIGZsb2F0MiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBzbW9vdGhzdGVwKGZsb2F0LCBmbG9hdCwgZmxvYXQyKTsKK2V4dGVybiBmbG9hdDMgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgc21vb3Roc3RlcChmbG9hdCwgZmxvYXQsIGZsb2F0Myk7CitleHRlcm4gZmxvYXQ0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIHNtb290aHN0ZXAoZmxvYXQsIGZsb2F0LCBmbG9hdDQpOworCitzdGF0aWMgZmxvYXQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgc2lnbihmbG9hdCB2KSB7CisgICAgaWYgKHYgPiAwKSByZXR1cm4gMS5mOworICAgIGlmICh2IDwgMCkgcmV0dXJuIC0xLmY7CisgICAgcmV0dXJuIHY7Cit9CitERUZfRlVOQ18xKHNpZ24pCisKKy8vIDYuMTEuNQorc3RhdGljIGZsb2F0MyBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBjcm9zcyhmbG9hdDMgbGhzLCBmbG9hdDMgcmhzKSB7CisgICAgZmxvYXQzIHI7CisgICAgci54ID0gbGhzLnkgKiByaHMueiAgLSBsaHMueiAqIHJocy55OworICAgIHIueSA9IGxocy56ICogcmhzLnggIC0gbGhzLnggKiByaHMuejsKKyAgICByLnogPSBsaHMueCAqIHJocy55ICAtIGxocy55ICogcmhzLng7CisgICAgcmV0dXJuIHI7Cit9CisKK3N0YXRpYyBmbG9hdDQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgY3Jvc3MoZmxvYXQ0IGxocywgZmxvYXQ0IHJocykgeworICAgIGZsb2F0NCByOworICAgIHIueCA9IGxocy55ICogcmhzLnogIC0gbGhzLnogKiByaHMueTsKKyAgICByLnkgPSBsaHMueiAqIHJocy54ICAtIGxocy54ICogcmhzLno7CisgICAgci56ID0gbGhzLnggKiByaHMueSAgLSBsaHMueSAqIHJocy54OworICAgIHIudyA9IDAuZjsKKyAgICByZXR1cm4gcjsKK30KKworc3RhdGljIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGRvdChmbG9hdCBsaHMsIGZsb2F0IHJocykgeworICAgIHJldHVybiBsaHMgKiByaHM7Cit9CitzdGF0aWMgZmxvYXQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgZG90KGZsb2F0MiBsaHMsIGZsb2F0MiByaHMpIHsKKyAgICByZXR1cm4gbGhzLngqcmhzLnggKyBsaHMueSpyaHMueTsKK30KK3N0YXRpYyBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBkb3QoZmxvYXQzIGxocywgZmxvYXQzIHJocykgeworICAgIHJldHVybiBsaHMueCpyaHMueCArIGxocy55KnJocy55ICsgbGhzLnoqcmhzLno7Cit9CitzdGF0aWMgZmxvYXQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgZG90KGZsb2F0NCBsaHMsIGZsb2F0NCByaHMpIHsKKyAgICByZXR1cm4gbGhzLngqcmhzLnggKyBsaHMueSpyaHMueSArIGxocy56KnJocy56ICsgbGhzLncqcmhzLnc7Cit9CisKK3N0YXRpYyBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBsZW5ndGgoZmxvYXQgdikgeworICAgIHJldHVybiB2OworfQorc3RhdGljIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGxlbmd0aChmbG9hdDIgdikgeworICAgIHJldHVybiBzcXJ0KHYueCp2LnggKyB2Lnkqdi55KTsKK30KK3N0YXRpYyBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBsZW5ndGgoZmxvYXQzIHYpIHsKKyAgICByZXR1cm4gc3FydCh2Lngqdi54ICsgdi55KnYueSArIHYueip2LnopOworfQorc3RhdGljIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGxlbmd0aChmbG9hdDQgdikgeworICAgIHJldHVybiBzcXJ0KHYueCp2LnggKyB2Lnkqdi55ICsgdi56KnYueiArIHYudyp2LncpOworfQorCitzdGF0aWMgZmxvYXQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgZGlzdGFuY2UoZmxvYXQgbGhzLCBmbG9hdCByaHMpIHsKKyAgICByZXR1cm4gbGVuZ3RoKGxocyAtIHJocyk7Cit9CitzdGF0aWMgZmxvYXQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgZGlzdGFuY2UoZmxvYXQyIGxocywgZmxvYXQyIHJocykgeworICAgIHJldHVybiBsZW5ndGgobGhzIC0gcmhzKTsKK30KK3N0YXRpYyBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBkaXN0YW5jZShmbG9hdDMgbGhzLCBmbG9hdDMgcmhzKSB7CisgICAgcmV0dXJuIGxlbmd0aChsaHMgLSByaHMpOworfQorc3RhdGljIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGRpc3RhbmNlKGZsb2F0NCBsaHMsIGZsb2F0NCByaHMpIHsKKyAgICByZXR1cm4gbGVuZ3RoKGxocyAtIHJocyk7Cit9CisKK3N0YXRpYyBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBub3JtYWxpemUoZmxvYXQgdikgeworICAgIHJldHVybiAxLmY7Cit9CitzdGF0aWMgZmxvYXQyIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIG5vcm1hbGl6ZShmbG9hdDIgdikgeworICAgIHJldHVybiB2IC8gbGVuZ3RoKHYpOworfQorc3RhdGljIGZsb2F0MyBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBub3JtYWxpemUoZmxvYXQzIHYpIHsKKyAgICByZXR1cm4gdiAvIGxlbmd0aCh2KTsKK30KK3N0YXRpYyBmbG9hdDQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgbm9ybWFsaXplKGZsb2F0NCB2KSB7CisgICAgcmV0dXJuIHYgLyBsZW5ndGgodik7Cit9CisKKworI2VuZGlmCmRpZmYgLS1naXQgYS9saWJzL3JzL3NjcmlwdGMvcnNfY29yZS5yc2ggYi9saWJzL3JzL3NjcmlwdGMvcnNfY29yZS5yc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTlmYzE2NgotLS0gL2Rldi9udWxsCisrKyBiL2xpYnMvcnMvc2NyaXB0Yy9yc19jb3JlLnJzaApAQCAtMCwwICsxLDg5MiBAQAorI2lmbmRlZiBfX1JTX0NPUkVfUlNIX18KKyNkZWZpbmUgX19SU19DT1JFX1JTSF9fCisKK3N0YXRpYyB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIHJzRGVidWcoY29uc3QgY2hhciAqcywgZmxvYXQyIHYpIHsKKyAgICByc0RlYnVnKHMsIHYueCwgdi55KTsKK30KK3N0YXRpYyB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIHJzRGVidWcoY29uc3QgY2hhciAqcywgZmxvYXQzIHYpIHsKKyAgICByc0RlYnVnKHMsIHYueCwgdi55LCB2LnopOworfQorc3RhdGljIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgcnNEZWJ1Zyhjb25zdCBjaGFyICpzLCBmbG9hdDQgdikgeworICAgIHJzRGVidWcocywgdi54LCB2LnksIHYueiwgdi53KTsKK30KKworc3RhdGljIHVjaGFyNCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSByc1BhY2tDb2xvclRvODg4OChmbG9hdCByLCBmbG9hdCBnLCBmbG9hdCBiKQoreworICAgIHVjaGFyNCBjOworICAgIGMueCA9ICh1Y2hhcikociAqIDI1NS5mKTsKKyAgICBjLnkgPSAodWNoYXIpKGcgKiAyNTUuZik7CisgICAgYy56ID0gKHVjaGFyKShiICogMjU1LmYpOworICAgIGMudyA9IDI1NTsKKyAgICByZXR1cm4gYzsKK30KKworc3RhdGljIHVjaGFyNCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSByc1BhY2tDb2xvclRvODg4OChmbG9hdCByLCBmbG9hdCBnLCBmbG9hdCBiLCBmbG9hdCBhKQoreworICAgIHVjaGFyNCBjOworICAgIGMueCA9ICh1Y2hhcikociAqIDI1NS5mKTsKKyAgICBjLnkgPSAodWNoYXIpKGcgKiAyNTUuZik7CisgICAgYy56ID0gKHVjaGFyKShiICogMjU1LmYpOworICAgIGMudyA9ICh1Y2hhcikoYSAqIDI1NS5mKTsKKyAgICByZXR1cm4gYzsKK30KKworc3RhdGljIHVjaGFyNCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSByc1BhY2tDb2xvclRvODg4OChmbG9hdDMgY29sb3IpCit7CisgICAgY29sb3IgKj0gMjU1LmY7CisgICAgdWNoYXI0IGMgPSB7Y29sb3IueCwgY29sb3IueSwgY29sb3IueiwgMjU1fTsKKyAgICByZXR1cm4gYzsKK30KKworc3RhdGljIHVjaGFyNCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSByc1BhY2tDb2xvclRvODg4OChmbG9hdDQgY29sb3IpCit7CisgICAgY29sb3IgKj0gMjU1LmY7CisgICAgdWNoYXI0IGMgPSB7Y29sb3IueCwgY29sb3IueSwgY29sb3IueiwgY29sb3Iud307CisgICAgcmV0dXJuIGM7Cit9CisKK3N0YXRpYyBmbG9hdDQgcnNVbnBhY2tDb2xvcjg4ODgodWNoYXI0IGMpCit7CisgICAgZmxvYXQ0IHJldCA9IChmbG9hdDQpMC4wMDM5MTU2ODYyNzQ1ZjsKKyAgICByZXQgKj0gY29udmVydF9mbG9hdDQoYyk7CisgICAgcmV0dXJuIHJldDsKK30KKworLy9leHRlcm4gdWNoYXI0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIHJzUGFja0NvbG9yVG81NjUoZmxvYXQgciwgZmxvYXQgZywgZmxvYXQgYik7CisvL2V4dGVybiB1Y2hhcjQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgcnNQYWNrQ29sb3JUbzU2NShmbG9hdDMpOworLy9leHRlcm4gZmxvYXQ0IHJzVW5wYWNrQ29sb3I1NjUodWNoYXI0KTsKKworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gTWF0cml4IG9wcworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworc3RhdGljIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKK3JzTWF0cml4U2V0KHJzX21hdHJpeDR4NCAqbSwgdWludDMyX3Qgcm93LCB1aW50MzJfdCBjb2wsIGZsb2F0IHYpIHsKKyAgICBtLT5tW3JvdyAqIDQgKyBjb2xdID0gdjsKK30KKworc3RhdGljIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCityc01hdHJpeEdldChjb25zdCByc19tYXRyaXg0eDQgKm0sIHVpbnQzMl90IHJvdywgdWludDMyX3QgY29sKSB7CisgICAgcmV0dXJuIG0tPm1bcm93ICogNCArIGNvbF07Cit9CisKK3N0YXRpYyB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCityc01hdHJpeFNldChyc19tYXRyaXgzeDMgKm0sIHVpbnQzMl90IHJvdywgdWludDMyX3QgY29sLCBmbG9hdCB2KSB7CisgICAgbS0+bVtyb3cgKiAzICsgY29sXSA9IHY7Cit9CisKK3N0YXRpYyBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorcnNNYXRyaXhHZXQoY29uc3QgcnNfbWF0cml4M3gzICptLCB1aW50MzJfdCByb3csIHVpbnQzMl90IGNvbCkgeworICAgIHJldHVybiBtLT5tW3JvdyAqIDMgKyBjb2xdOworfQorCitzdGF0aWMgdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorcnNNYXRyaXhTZXQocnNfbWF0cml4MngyICptLCB1aW50MzJfdCByb3csIHVpbnQzMl90IGNvbCwgZmxvYXQgdikgeworICAgIG0tPm1bcm93ICogMiArIGNvbF0gPSB2OworfQorCitzdGF0aWMgZmxvYXQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKK3JzTWF0cml4R2V0KGNvbnN0IHJzX21hdHJpeDJ4MiAqbSwgdWludDMyX3Qgcm93LCB1aW50MzJfdCBjb2wpIHsKKyAgICByZXR1cm4gbS0+bVtyb3cgKiAyICsgY29sXTsKK30KKworc3RhdGljIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKK3JzTWF0cml4TG9hZElkZW50aXR5KHJzX21hdHJpeDR4NCAqbSkgeworICAgIG0tPm1bMF0gPSAxLmY7CisgICAgbS0+bVsxXSA9IDAuZjsKKyAgICBtLT5tWzJdID0gMC5mOworICAgIG0tPm1bM10gPSAwLmY7CisgICAgbS0+bVs0XSA9IDAuZjsKKyAgICBtLT5tWzVdID0gMS5mOworICAgIG0tPm1bNl0gPSAwLmY7CisgICAgbS0+bVs3XSA9IDAuZjsKKyAgICBtLT5tWzhdID0gMC5mOworICAgIG0tPm1bOV0gPSAwLmY7CisgICAgbS0+bVsxMF0gPSAxLmY7CisgICAgbS0+bVsxMV0gPSAwLmY7CisgICAgbS0+bVsxMl0gPSAwLmY7CisgICAgbS0+bVsxM10gPSAwLmY7CisgICAgbS0+bVsxNF0gPSAwLmY7CisgICAgbS0+bVsxNV0gPSAxLmY7Cit9CisKK3N0YXRpYyB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCityc01hdHJpeExvYWRJZGVudGl0eShyc19tYXRyaXgzeDMgKm0pIHsKKyAgICBtLT5tWzBdID0gMS5mOworICAgIG0tPm1bMV0gPSAwLmY7CisgICAgbS0+bVsyXSA9IDAuZjsKKyAgICBtLT5tWzNdID0gMC5mOworICAgIG0tPm1bNF0gPSAxLmY7CisgICAgbS0+bVs1XSA9IDAuZjsKKyAgICBtLT5tWzZdID0gMC5mOworICAgIG0tPm1bN10gPSAwLmY7CisgICAgbS0+bVs4XSA9IDEuZjsKK30KKworc3RhdGljIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKK3JzTWF0cml4TG9hZElkZW50aXR5KHJzX21hdHJpeDJ4MiAqbSkgeworICAgIG0tPm1bMF0gPSAxLmY7CisgICAgbS0+bVsxXSA9IDAuZjsKKyAgICBtLT5tWzJdID0gMC5mOworICAgIG0tPm1bM10gPSAxLmY7Cit9CisKK3N0YXRpYyB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCityc01hdHJpeExvYWQocnNfbWF0cml4NHg0ICptLCBjb25zdCBmbG9hdCAqdikgeworICAgIG0tPm1bMF0gPSB2WzBdOworICAgIG0tPm1bMV0gPSB2WzFdOworICAgIG0tPm1bMl0gPSB2WzJdOworICAgIG0tPm1bM10gPSB2WzNdOworICAgIG0tPm1bNF0gPSB2WzRdOworICAgIG0tPm1bNV0gPSB2WzVdOworICAgIG0tPm1bNl0gPSB2WzZdOworICAgIG0tPm1bN10gPSB2WzddOworICAgIG0tPm1bOF0gPSB2WzhdOworICAgIG0tPm1bOV0gPSB2WzldOworICAgIG0tPm1bMTBdID0gdlsxMF07CisgICAgbS0+bVsxMV0gPSB2WzExXTsKKyAgICBtLT5tWzEyXSA9IHZbMTJdOworICAgIG0tPm1bMTNdID0gdlsxM107CisgICAgbS0+bVsxNF0gPSB2WzE0XTsKKyAgICBtLT5tWzE1XSA9IHZbMTVdOworfQorCitzdGF0aWMgdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorcnNNYXRyaXhMb2FkKHJzX21hdHJpeDN4MyAqbSwgY29uc3QgZmxvYXQgKnYpIHsKKyAgICBtLT5tWzBdID0gdlswXTsKKyAgICBtLT5tWzFdID0gdlsxXTsKKyAgICBtLT5tWzJdID0gdlsyXTsKKyAgICBtLT5tWzNdID0gdlszXTsKKyAgICBtLT5tWzRdID0gdls0XTsKKyAgICBtLT5tWzVdID0gdls1XTsKKyAgICBtLT5tWzZdID0gdls2XTsKKyAgICBtLT5tWzddID0gdls3XTsKKyAgICBtLT5tWzhdID0gdls4XTsKK30KKworc3RhdGljIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKK3JzTWF0cml4TG9hZChyc19tYXRyaXgyeDIgKm0sIGNvbnN0IGZsb2F0ICp2KSB7CisgICAgbS0+bVswXSA9IHZbMF07CisgICAgbS0+bVsxXSA9IHZbMV07CisgICAgbS0+bVsyXSA9IHZbMl07CisgICAgbS0+bVszXSA9IHZbM107Cit9CisKK3N0YXRpYyB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCityc01hdHJpeExvYWQocnNfbWF0cml4NHg0ICptLCBjb25zdCByc19tYXRyaXg0eDQgKnYpIHsKKyAgICBtLT5tWzBdID0gdi0+bVswXTsKKyAgICBtLT5tWzFdID0gdi0+bVsxXTsKKyAgICBtLT5tWzJdID0gdi0+bVsyXTsKKyAgICBtLT5tWzNdID0gdi0+bVszXTsKKyAgICBtLT5tWzRdID0gdi0+bVs0XTsKKyAgICBtLT5tWzVdID0gdi0+bVs1XTsKKyAgICBtLT5tWzZdID0gdi0+bVs2XTsKKyAgICBtLT5tWzddID0gdi0+bVs3XTsKKyAgICBtLT5tWzhdID0gdi0+bVs4XTsKKyAgICBtLT5tWzldID0gdi0+bVs5XTsKKyAgICBtLT5tWzEwXSA9IHYtPm1bMTBdOworICAgIG0tPm1bMTFdID0gdi0+bVsxMV07CisgICAgbS0+bVsxMl0gPSB2LT5tWzEyXTsKKyAgICBtLT5tWzEzXSA9IHYtPm1bMTNdOworICAgIG0tPm1bMTRdID0gdi0+bVsxNF07CisgICAgbS0+bVsxNV0gPSB2LT5tWzE1XTsKK30KKworc3RhdGljIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKK3JzTWF0cml4TG9hZChyc19tYXRyaXg0eDQgKm0sIGNvbnN0IHJzX21hdHJpeDN4MyAqdikgeworICAgIG0tPm1bMF0gPSB2LT5tWzBdOworICAgIG0tPm1bMV0gPSB2LT5tWzFdOworICAgIG0tPm1bMl0gPSB2LT5tWzJdOworICAgIG0tPm1bM10gPSAwLmY7CisgICAgbS0+bVs0XSA9IHYtPm1bM107CisgICAgbS0+bVs1XSA9IHYtPm1bNF07CisgICAgbS0+bVs2XSA9IHYtPm1bNV07CisgICAgbS0+bVs3XSA9IDAuZjsKKyAgICBtLT5tWzhdID0gdi0+bVs2XTsKKyAgICBtLT5tWzldID0gdi0+bVs3XTsKKyAgICBtLT5tWzEwXSA9IHYtPm1bOF07CisgICAgbS0+bVsxMV0gPSAwLmY7CisgICAgbS0+bVsxMl0gPSAwLmY7CisgICAgbS0+bVsxM10gPSAwLmY7CisgICAgbS0+bVsxNF0gPSAwLmY7CisgICAgbS0+bVsxNV0gPSAxLmY7Cit9CisKK3N0YXRpYyB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCityc01hdHJpeExvYWQocnNfbWF0cml4NHg0ICptLCBjb25zdCByc19tYXRyaXgyeDIgKnYpIHsKKyAgICBtLT5tWzBdID0gdi0+bVswXTsKKyAgICBtLT5tWzFdID0gdi0+bVsxXTsKKyAgICBtLT5tWzJdID0gMC5mOworICAgIG0tPm1bM10gPSAwLmY7CisgICAgbS0+bVs0XSA9IHYtPm1bM107CisgICAgbS0+bVs1XSA9IHYtPm1bNF07CisgICAgbS0+bVs2XSA9IDAuZjsKKyAgICBtLT5tWzddID0gMC5mOworICAgIG0tPm1bOF0gPSB2LT5tWzZdOworICAgIG0tPm1bOV0gPSB2LT5tWzddOworICAgIG0tPm1bMTBdID0gMS5mOworICAgIG0tPm1bMTFdID0gMC5mOworICAgIG0tPm1bMTJdID0gMC5mOworICAgIG0tPm1bMTNdID0gMC5mOworICAgIG0tPm1bMTRdID0gMC5mOworICAgIG0tPm1bMTVdID0gMS5mOworfQorCitzdGF0aWMgdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorcnNNYXRyaXhMb2FkKHJzX21hdHJpeDN4MyAqbSwgY29uc3QgcnNfbWF0cml4M3gzICp2KSB7CisgICAgbS0+bVswXSA9IHYtPm1bMF07CisgICAgbS0+bVsxXSA9IHYtPm1bMV07CisgICAgbS0+bVsyXSA9IHYtPm1bMl07CisgICAgbS0+bVszXSA9IHYtPm1bM107CisgICAgbS0+bVs0XSA9IHYtPm1bNF07CisgICAgbS0+bVs1XSA9IHYtPm1bNV07CisgICAgbS0+bVs2XSA9IHYtPm1bNl07CisgICAgbS0+bVs3XSA9IHYtPm1bN107CisgICAgbS0+bVs4XSA9IHYtPm1bOF07Cit9CisKK3N0YXRpYyB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCityc01hdHJpeExvYWQocnNfbWF0cml4MngyICptLCBjb25zdCByc19tYXRyaXgyeDIgKnYpIHsKKyAgICBtLT5tWzBdID0gdi0+bVswXTsKKyAgICBtLT5tWzFdID0gdi0+bVsxXTsKKyAgICBtLT5tWzJdID0gdi0+bVsyXTsKKyAgICBtLT5tWzNdID0gdi0+bVszXTsKK30KKworc3RhdGljIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKK3JzTWF0cml4TG9hZFJvdGF0ZShyc19tYXRyaXg0eDQgKm0sIGZsb2F0IHJvdCwgZmxvYXQgeCwgZmxvYXQgeSwgZmxvYXQgeikgeworICAgIGZsb2F0IGMsIHM7CisgICAgbS0+bVszXSA9IDA7CisgICAgbS0+bVs3XSA9IDA7CisgICAgbS0+bVsxMV09IDA7CisgICAgbS0+bVsxMl09IDA7CisgICAgbS0+bVsxM109IDA7CisgICAgbS0+bVsxNF09IDA7CisgICAgbS0+bVsxNV09IDE7CisgICAgcm90ICo9IChmbG9hdCkoTV9QSSAvIDE4MC4wZik7CisgICAgYyA9IGNvcyhyb3QpOworICAgIHMgPSBzaW4ocm90KTsKKworICAgIGNvbnN0IGZsb2F0IGxlbiA9IHgqeCArIHkqeSArIHoqejsKKyAgICBpZiAobGVuICE9IDEpIHsKKyAgICAgICAgY29uc3QgZmxvYXQgcmVjaXBMZW4gPSAxLmYgLyBzcXJ0KGxlbik7CisgICAgICAgIHggKj0gcmVjaXBMZW47CisgICAgICAgIHkgKj0gcmVjaXBMZW47CisgICAgICAgIHogKj0gcmVjaXBMZW47CisgICAgfQorICAgIGNvbnN0IGZsb2F0IG5jID0gMS4wZiAtIGM7CisgICAgY29uc3QgZmxvYXQgeHkgPSB4ICogeTsKKyAgICBjb25zdCBmbG9hdCB5eiA9IHkgKiB6OworICAgIGNvbnN0IGZsb2F0IHp4ID0geiAqIHg7CisgICAgY29uc3QgZmxvYXQgeHMgPSB4ICogczsKKyAgICBjb25zdCBmbG9hdCB5cyA9IHkgKiBzOworICAgIGNvbnN0IGZsb2F0IHpzID0geiAqIHM7CisgICAgbS0+bVsgMF0gPSB4KngqbmMgKyAgYzsKKyAgICBtLT5tWyA0XSA9ICB4eSpuYyAtIHpzOworICAgIG0tPm1bIDhdID0gIHp4Km5jICsgeXM7CisgICAgbS0+bVsgMV0gPSAgeHkqbmMgKyB6czsKKyAgICBtLT5tWyA1XSA9IHkqeSpuYyArICBjOworICAgIG0tPm1bIDldID0gIHl6Km5jIC0geHM7CisgICAgbS0+bVsgMl0gPSAgengqbmMgLSB5czsKKyAgICBtLT5tWyA2XSA9ICB5eipuYyArIHhzOworICAgIG0tPm1bMTBdID0geip6Km5jICsgIGM7Cit9CisKK3N0YXRpYyB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCityc01hdHJpeExvYWRTY2FsZShyc19tYXRyaXg0eDQgKm0sIGZsb2F0IHgsIGZsb2F0IHksIGZsb2F0IHopIHsKKyAgICByc01hdHJpeExvYWRJZGVudGl0eShtKTsKKyAgICBtLT5tWzBdID0geDsKKyAgICBtLT5tWzVdID0geTsKKyAgICBtLT5tWzEwXSA9IHo7Cit9CisKK3N0YXRpYyB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCityc01hdHJpeExvYWRUcmFuc2xhdGUocnNfbWF0cml4NHg0ICptLCBmbG9hdCB4LCBmbG9hdCB5LCBmbG9hdCB6KSB7CisgICAgcnNNYXRyaXhMb2FkSWRlbnRpdHkobSk7CisgICAgbS0+bVsxMl0gPSB4OworICAgIG0tPm1bMTNdID0geTsKKyAgICBtLT5tWzE0XSA9IHo7Cit9CisKK3N0YXRpYyB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCityc01hdHJpeExvYWRNdWx0aXBseShyc19tYXRyaXg0eDQgKm0sIGNvbnN0IHJzX21hdHJpeDR4NCAqbGhzLCBjb25zdCByc19tYXRyaXg0eDQgKnJocykgeworICAgIGZvciAoaW50IGk9MCA7IGk8NCA7IGkrKykgeworICAgICAgICBmbG9hdCByaTAgPSAwOworICAgICAgICBmbG9hdCByaTEgPSAwOworICAgICAgICBmbG9hdCByaTIgPSAwOworICAgICAgICBmbG9hdCByaTMgPSAwOworICAgICAgICBmb3IgKGludCBqPTAgOyBqPDQgOyBqKyspIHsKKyAgICAgICAgICAgIGNvbnN0IGZsb2F0IHJoc19paiA9IHJzTWF0cml4R2V0KHJocywgaSxqKTsKKyAgICAgICAgICAgIHJpMCArPSByc01hdHJpeEdldChsaHMsIGosIDApICogcmhzX2lqOworICAgICAgICAgICAgcmkxICs9IHJzTWF0cml4R2V0KGxocywgaiwgMSkgKiByaHNfaWo7CisgICAgICAgICAgICByaTIgKz0gcnNNYXRyaXhHZXQobGhzLCBqLCAyKSAqIHJoc19pajsKKyAgICAgICAgICAgIHJpMyArPSByc01hdHJpeEdldChsaHMsIGosIDMpICogcmhzX2lqOworICAgICAgICB9CisgICAgICAgIHJzTWF0cml4U2V0KG0sIGksIDAsIHJpMCk7CisgICAgICAgIHJzTWF0cml4U2V0KG0sIGksIDEsIHJpMSk7CisgICAgICAgIHJzTWF0cml4U2V0KG0sIGksIDIsIHJpMik7CisgICAgICAgIHJzTWF0cml4U2V0KG0sIGksIDMsIHJpMyk7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorcnNNYXRyaXhNdWx0aXBseShyc19tYXRyaXg0eDQgKm0sIGNvbnN0IHJzX21hdHJpeDR4NCAqcmhzKSB7CisgICAgcnNfbWF0cml4NHg0IG10OworICAgIHJzTWF0cml4TG9hZE11bHRpcGx5KCZtdCwgbSwgcmhzKTsKKyAgICByc01hdHJpeExvYWQobSwgJm10KTsKK30KKworc3RhdGljIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKK3JzTWF0cml4TG9hZE11bHRpcGx5KHJzX21hdHJpeDN4MyAqbSwgY29uc3QgcnNfbWF0cml4M3gzICpsaHMsIGNvbnN0IHJzX21hdHJpeDN4MyAqcmhzKSB7CisgICAgZm9yIChpbnQgaT0wIDsgaTwzIDsgaSsrKSB7CisgICAgICAgIGZsb2F0IHJpMCA9IDA7CisgICAgICAgIGZsb2F0IHJpMSA9IDA7CisgICAgICAgIGZsb2F0IHJpMiA9IDA7CisgICAgICAgIGZvciAoaW50IGo9MCA7IGo8MyA7IGorKykgeworICAgICAgICAgICAgY29uc3QgZmxvYXQgcmhzX2lqID0gcnNNYXRyaXhHZXQocmhzLCBpLGopOworICAgICAgICAgICAgcmkwICs9IHJzTWF0cml4R2V0KGxocywgaiwgMCkgKiByaHNfaWo7CisgICAgICAgICAgICByaTEgKz0gcnNNYXRyaXhHZXQobGhzLCBqLCAxKSAqIHJoc19pajsKKyAgICAgICAgICAgIHJpMiArPSByc01hdHJpeEdldChsaHMsIGosIDIpICogcmhzX2lqOworICAgICAgICB9CisgICAgICAgIHJzTWF0cml4U2V0KG0sIGksIDAsIHJpMCk7CisgICAgICAgIHJzTWF0cml4U2V0KG0sIGksIDEsIHJpMSk7CisgICAgICAgIHJzTWF0cml4U2V0KG0sIGksIDIsIHJpMik7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorcnNNYXRyaXhNdWx0aXBseShyc19tYXRyaXgzeDMgKm0sIGNvbnN0IHJzX21hdHJpeDN4MyAqcmhzKSB7CisgICAgcnNfbWF0cml4M3gzIG10OworICAgIHJzTWF0cml4TG9hZE11bHRpcGx5KCZtdCwgbSwgcmhzKTsKKyAgICByc01hdHJpeExvYWQobSwgJm10KTsKK30KKworc3RhdGljIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKK3JzTWF0cml4TG9hZE11bHRpcGx5KHJzX21hdHJpeDJ4MiAqbSwgY29uc3QgcnNfbWF0cml4MngyICpsaHMsIGNvbnN0IHJzX21hdHJpeDJ4MiAqcmhzKSB7CisgICAgZm9yIChpbnQgaT0wIDsgaTwyIDsgaSsrKSB7CisgICAgICAgIGZsb2F0IHJpMCA9IDA7CisgICAgICAgIGZsb2F0IHJpMSA9IDA7CisgICAgICAgIGZvciAoaW50IGo9MCA7IGo8MiA7IGorKykgeworICAgICAgICAgICAgY29uc3QgZmxvYXQgcmhzX2lqID0gcnNNYXRyaXhHZXQocmhzLCBpLGopOworICAgICAgICAgICAgcmkwICs9IHJzTWF0cml4R2V0KGxocywgaiwgMCkgKiByaHNfaWo7CisgICAgICAgICAgICByaTEgKz0gcnNNYXRyaXhHZXQobGhzLCBqLCAxKSAqIHJoc19pajsKKyAgICAgICAgfQorICAgICAgICByc01hdHJpeFNldChtLCBpLCAwLCByaTApOworICAgICAgICByc01hdHJpeFNldChtLCBpLCAxLCByaTEpOworICAgIH0KK30KKworc3RhdGljIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKK3JzTWF0cml4TXVsdGlwbHkocnNfbWF0cml4MngyICptLCBjb25zdCByc19tYXRyaXgyeDIgKnJocykgeworICAgIHJzX21hdHJpeDJ4MiBtdDsKKyAgICByc01hdHJpeExvYWRNdWx0aXBseSgmbXQsIG0sIHJocyk7CisgICAgcnNNYXRyaXhMb2FkKG0sICZtdCk7Cit9CisKK3N0YXRpYyB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCityc01hdHJpeFJvdGF0ZShyc19tYXRyaXg0eDQgKm0sIGZsb2F0IHJvdCwgZmxvYXQgeCwgZmxvYXQgeSwgZmxvYXQgeikgeworICAgIHJzX21hdHJpeDR4NCBtMTsKKyAgICByc01hdHJpeExvYWRSb3RhdGUoJm0xLCByb3QsIHgsIHksIHopOworICAgIHJzTWF0cml4TXVsdGlwbHkobSwgJm0xKTsKK30KKworc3RhdGljIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKK3JzTWF0cml4U2NhbGUocnNfbWF0cml4NHg0ICptLCBmbG9hdCB4LCBmbG9hdCB5LCBmbG9hdCB6KSB7CisgICAgcnNfbWF0cml4NHg0IG0xOworICAgIHJzTWF0cml4TG9hZFNjYWxlKCZtMSwgeCwgeSwgeik7CisgICAgcnNNYXRyaXhNdWx0aXBseShtLCAmbTEpOworfQorCitzdGF0aWMgdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorcnNNYXRyaXhUcmFuc2xhdGUocnNfbWF0cml4NHg0ICptLCBmbG9hdCB4LCBmbG9hdCB5LCBmbG9hdCB6KSB7CisgICAgcnNfbWF0cml4NHg0IG0xOworICAgIHJzTWF0cml4TG9hZFRyYW5zbGF0ZSgmbTEsIHgsIHksIHopOworICAgIHJzTWF0cml4TXVsdGlwbHkobSwgJm0xKTsKK30KKworc3RhdGljIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKK3JzTWF0cml4TG9hZE9ydGhvKHJzX21hdHJpeDR4NCAqbSwgZmxvYXQgbGVmdCwgZmxvYXQgcmlnaHQsIGZsb2F0IGJvdHRvbSwgZmxvYXQgdG9wLCBmbG9hdCBuZWFyLCBmbG9hdCBmYXIpIHsKKyAgICByc01hdHJpeExvYWRJZGVudGl0eShtKTsKKyAgICBtLT5tWzBdID0gMi5mIC8gKHJpZ2h0IC0gbGVmdCk7CisgICAgbS0+bVs1XSA9IDIuZiAvICh0b3AgLSBib3R0b20pOworICAgIG0tPm1bMTBdPSAtMi5mIC8gKGZhciAtIG5lYXIpOworICAgIG0tPm1bMTJdPSAtKHJpZ2h0ICsgbGVmdCkgLyAocmlnaHQgLSBsZWZ0KTsKKyAgICBtLT5tWzEzXT0gLSh0b3AgKyBib3R0b20pIC8gKHRvcCAtIGJvdHRvbSk7CisgICAgbS0+bVsxNF09IC0oZmFyICsgbmVhcikgLyAoZmFyIC0gbmVhcik7Cit9CisKK3N0YXRpYyB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCityc01hdHJpeExvYWRGcnVzdHVtKHJzX21hdHJpeDR4NCAqbSwgZmxvYXQgbGVmdCwgZmxvYXQgcmlnaHQsIGZsb2F0IGJvdHRvbSwgZmxvYXQgdG9wLCBmbG9hdCBuZWFyLCBmbG9hdCBmYXIpIHsKKyAgICByc01hdHJpeExvYWRJZGVudGl0eShtKTsKKyAgICBtLT5tWzBdID0gMi5mICogbmVhciAvIChyaWdodCAtIGxlZnQpOworICAgIG0tPm1bNV0gPSAyLmYgKiBuZWFyIC8gKHRvcCAtIGJvdHRvbSk7CisgICAgbS0+bVs4XSA9IChyaWdodCArIGxlZnQpIC8gKHJpZ2h0IC0gbGVmdCk7CisgICAgbS0+bVs5XSA9ICh0b3AgKyBib3R0b20pIC8gKHRvcCAtIGJvdHRvbSk7CisgICAgbS0+bVsxMF09IC0oZmFyICsgbmVhcikgLyAoZmFyIC0gbmVhcik7CisgICAgbS0+bVsxMV09IC0xLmY7CisgICAgbS0+bVsxNF09IC0yLmYgKiBmYXIgKiBuZWFyIC8gKGZhciAtIG5lYXIpOworICAgIG0tPm1bMTVdPSAwLmY7Cit9CisKK3N0YXRpYyB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCityc01hdHJpeExvYWRQZXJzcGVjdGl2ZShyc19tYXRyaXg0eDQqIG0sIGZsb2F0IGZvdnksIGZsb2F0IGFzcGVjdCwgZmxvYXQgbmVhciwgZmxvYXQgZmFyKSB7CisgICAgZmxvYXQgdG9wID0gbmVhciAqIHRhbigoZmxvYXQpIChmb3Z5ICogTV9QSSAvIDM2MC4wZikpOworICAgIGZsb2F0IGJvdHRvbSA9IC10b3A7CisgICAgZmxvYXQgbGVmdCA9IGJvdHRvbSAqIGFzcGVjdDsKKyAgICBmbG9hdCByaWdodCA9IHRvcCAqIGFzcGVjdDsKKyAgICByc01hdHJpeExvYWRGcnVzdHVtKG0sIGxlZnQsIHJpZ2h0LCBib3R0b20sIHRvcCwgbmVhciwgZmFyKTsKK30KKworc3RhdGljIGZsb2F0NCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorcnNNYXRyaXhNdWx0aXBseShyc19tYXRyaXg0eDQgKm0sIGZsb2F0NCBpbikgeworICAgIGZsb2F0NCByZXQ7CisgICAgcmV0LnggPSAobS0+bVswXSAqIGluLngpICsgKG0tPm1bNF0gKiBpbi55KSArIChtLT5tWzhdICogaW4ueikgKyAobS0+bVsxMl0gKiBpbi53KTsKKyAgICByZXQueSA9IChtLT5tWzFdICogaW4ueCkgKyAobS0+bVs1XSAqIGluLnkpICsgKG0tPm1bOV0gKiBpbi56KSArIChtLT5tWzEzXSAqIGluLncpOworICAgIHJldC56ID0gKG0tPm1bMl0gKiBpbi54KSArIChtLT5tWzZdICogaW4ueSkgKyAobS0+bVsxMF0gKiBpbi56KSArIChtLT5tWzE0XSAqIGluLncpOworICAgIHJldC53ID0gKG0tPm1bM10gKiBpbi54KSArIChtLT5tWzddICogaW4ueSkgKyAobS0+bVsxMV0gKiBpbi56KSArIChtLT5tWzE1XSAqIGluLncpOworICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBmbG9hdDQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKK3JzTWF0cml4TXVsdGlwbHkocnNfbWF0cml4NHg0ICptLCBmbG9hdDMgaW4pIHsKKyAgICBmbG9hdDQgcmV0OworICAgIHJldC54ID0gKG0tPm1bMF0gKiBpbi54KSArIChtLT5tWzRdICogaW4ueSkgKyAobS0+bVs4XSAqIGluLnopICsgbS0+bVsxMl07CisgICAgcmV0LnkgPSAobS0+bVsxXSAqIGluLngpICsgKG0tPm1bNV0gKiBpbi55KSArIChtLT5tWzldICogaW4ueikgKyBtLT5tWzEzXTsKKyAgICByZXQueiA9IChtLT5tWzJdICogaW4ueCkgKyAobS0+bVs2XSAqIGluLnkpICsgKG0tPm1bMTBdICogaW4ueikgKyBtLT5tWzE0XTsKKyAgICByZXQudyA9IChtLT5tWzNdICogaW4ueCkgKyAobS0+bVs3XSAqIGluLnkpICsgKG0tPm1bMTFdICogaW4ueikgKyBtLT5tWzE1XTsKKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgZmxvYXQ0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCityc01hdHJpeE11bHRpcGx5KHJzX21hdHJpeDR4NCAqbSwgZmxvYXQyIGluKSB7CisgICAgZmxvYXQ0IHJldDsKKyAgICByZXQueCA9IChtLT5tWzBdICogaW4ueCkgKyAobS0+bVs0XSAqIGluLnkpICsgbS0+bVsxMl07CisgICAgcmV0LnkgPSAobS0+bVsxXSAqIGluLngpICsgKG0tPm1bNV0gKiBpbi55KSArIG0tPm1bMTNdOworICAgIHJldC56ID0gKG0tPm1bMl0gKiBpbi54KSArIChtLT5tWzZdICogaW4ueSkgKyBtLT5tWzE0XTsKKyAgICByZXQudyA9IChtLT5tWzNdICogaW4ueCkgKyAobS0+bVs3XSAqIGluLnkpICsgbS0+bVsxNV07CisgICAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGZsb2F0MyBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorcnNNYXRyaXhNdWx0aXBseShyc19tYXRyaXgzeDMgKm0sIGZsb2F0MyBpbikgeworICAgIGZsb2F0MyByZXQ7CisgICAgcmV0LnggPSAobS0+bVswXSAqIGluLngpICsgKG0tPm1bM10gKiBpbi55KSArIChtLT5tWzZdICogaW4ueik7CisgICAgcmV0LnkgPSAobS0+bVsxXSAqIGluLngpICsgKG0tPm1bNF0gKiBpbi55KSArIChtLT5tWzddICogaW4ueik7CisgICAgcmV0LnogPSAobS0+bVsyXSAqIGluLngpICsgKG0tPm1bNV0gKiBpbi55KSArIChtLT5tWzhdICogaW4ueik7CisgICAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGZsb2F0MyBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorcnNNYXRyaXhNdWx0aXBseShyc19tYXRyaXgzeDMgKm0sIGZsb2F0MiBpbikgeworICAgIGZsb2F0MyByZXQ7CisgICAgcmV0LnggPSAobS0+bVswXSAqIGluLngpICsgKG0tPm1bM10gKiBpbi55KTsKKyAgICByZXQueSA9IChtLT5tWzFdICogaW4ueCkgKyAobS0+bVs0XSAqIGluLnkpOworICAgIHJldC56ID0gKG0tPm1bMl0gKiBpbi54KSArIChtLT5tWzVdICogaW4ueSk7CisgICAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGZsb2F0MiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorcnNNYXRyaXhNdWx0aXBseShyc19tYXRyaXgyeDIgKm0sIGZsb2F0MiBpbikgeworICAgIGZsb2F0MiByZXQ7CisgICAgcmV0LnggPSAobS0+bVswXSAqIGluLngpICsgKG0tPm1bMl0gKiBpbi55KTsKKyAgICByZXQueSA9IChtLT5tWzFdICogaW4ueCkgKyAobS0+bVszXSAqIGluLnkpOworICAgIHJldHVybiByZXQ7Cit9CisKKy8vIFJldHVybnMgdHJ1ZSBpZiB0aGUgbWF0cml4IHdhcyBzdWNjZXNzZnVsbHkgaW52ZXJzZWQKK3N0YXRpYyBib29sIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCityc01hdHJpeEludmVyc2UocnNfbWF0cml4NHg0ICptKSB7CisgICAgcnNfbWF0cml4NHg0IHJlc3VsdDsKKworICAgIGludCBpLCBqOworICAgIGZvciAoaSA9IDA7IGkgPCA0OyArK2kpIHsKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IDQ7ICsraikgeworICAgICAgICAgICAgLy8gY29tcHV0ZUNvZmFjdG9yIGZvciBpbnQgaSwgaW50IGoKKyAgICAgICAgICAgIGludCBjMCA9IChpKzEpICUgNDsKKyAgICAgICAgICAgIGludCBjMSA9IChpKzIpICUgNDsKKyAgICAgICAgICAgIGludCBjMiA9IChpKzMpICUgNDsKKyAgICAgICAgICAgIGludCByMCA9IChqKzEpICUgNDsKKyAgICAgICAgICAgIGludCByMSA9IChqKzIpICUgNDsKKyAgICAgICAgICAgIGludCByMiA9IChqKzMpICUgNDsKKworICAgICAgICAgICAgZmxvYXQgbWlub3IgPSAobS0+bVtjMCArIDQqcjBdICogKG0tPm1bYzEgKyA0KnIxXSAqIG0tPm1bYzIgKyA0KnIyXSAtIG0tPm1bYzEgKyA0KnIyXSAqIG0tPm1bYzIgKyA0KnIxXSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgLSAobS0+bVtjMCArIDQqcjFdICogKG0tPm1bYzEgKyA0KnIwXSAqIG0tPm1bYzIgKyA0KnIyXSAtIG0tPm1bYzEgKyA0KnIyXSAqIG0tPm1bYzIgKyA0KnIwXSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgKyAobS0+bVtjMCArIDQqcjJdICogKG0tPm1bYzEgKyA0KnIwXSAqIG0tPm1bYzIgKyA0KnIxXSAtIG0tPm1bYzEgKyA0KnIxXSAqIG0tPm1bYzIgKyA0KnIwXSkpOworCisgICAgICAgICAgICBmbG9hdCBjb2ZhY3RvciA9IChpK2opICYgMSA/IC1taW5vciA6IG1pbm9yOworCisgICAgICAgICAgICByZXN1bHQubVs0KmkgKyBqXSA9IGNvZmFjdG9yOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gRG90IHByb2R1Y3Qgb2YgMHRoIGNvbHVtbiBvZiBzb3VyY2UgYW5kIDB0aCByb3cgb2YgcmVzdWx0CisgICAgZmxvYXQgZGV0ID0gbS0+bVswXSpyZXN1bHQubVswXSArIG0tPm1bNF0qcmVzdWx0Lm1bMV0gKworICAgICAgICAgICAgICAgICBtLT5tWzhdKnJlc3VsdC5tWzJdICsgbS0+bVsxMl0qcmVzdWx0Lm1bM107CisKKyAgICBpZiAoZmFicyhkZXQpIDwgMWUtNikgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgZGV0ID0gMS4wZiAvIGRldDsKKyAgICBmb3IgKGkgPSAwOyBpIDwgMTY7ICsraSkgeworICAgICAgICBtLT5tW2ldID0gcmVzdWx0Lm1baV0gKiBkZXQ7CisgICAgfQorCisgICAgcmV0dXJuIHRydWU7Cit9CisKKy8vIFJldHVybnMgdHJ1ZSBpZiB0aGUgbWF0cml4IHdhcyBzdWNjZXNzZnVsbHkgaW52ZXJzZWQKK3N0YXRpYyBib29sIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCityc01hdHJpeEludmVyc2VUcmFuc3Bvc2UocnNfbWF0cml4NHg0ICptKSB7CisgICAgcnNfbWF0cml4NHg0IHJlc3VsdDsKKworICAgIGludCBpLCBqOworICAgIGZvciAoaSA9IDA7IGkgPCA0OyArK2kpIHsKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IDQ7ICsraikgeworICAgICAgICAgICAgLy8gY29tcHV0ZUNvZmFjdG9yIGZvciBpbnQgaSwgaW50IGoKKyAgICAgICAgICAgIGludCBjMCA9IChpKzEpICUgNDsKKyAgICAgICAgICAgIGludCBjMSA9IChpKzIpICUgNDsKKyAgICAgICAgICAgIGludCBjMiA9IChpKzMpICUgNDsKKyAgICAgICAgICAgIGludCByMCA9IChqKzEpICUgNDsKKyAgICAgICAgICAgIGludCByMSA9IChqKzIpICUgNDsKKyAgICAgICAgICAgIGludCByMiA9IChqKzMpICUgNDsKKworICAgICAgICAgICAgZmxvYXQgbWlub3IgPSAobS0+bVtjMCArIDQqcjBdICogKG0tPm1bYzEgKyA0KnIxXSAqIG0tPm1bYzIgKyA0KnIyXSAtIG0tPm1bYzEgKyA0KnIyXSAqIG0tPm1bYzIgKyA0KnIxXSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgLSAobS0+bVtjMCArIDQqcjFdICogKG0tPm1bYzEgKyA0KnIwXSAqIG0tPm1bYzIgKyA0KnIyXSAtIG0tPm1bYzEgKyA0KnIyXSAqIG0tPm1bYzIgKyA0KnIwXSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgKyAobS0+bVtjMCArIDQqcjJdICogKG0tPm1bYzEgKyA0KnIwXSAqIG0tPm1bYzIgKyA0KnIxXSAtIG0tPm1bYzEgKyA0KnIxXSAqIG0tPm1bYzIgKyA0KnIwXSkpOworCisgICAgICAgICAgICBmbG9hdCBjb2ZhY3RvciA9IChpK2opICYgMSA/IC1taW5vciA6IG1pbm9yOworCisgICAgICAgICAgICByZXN1bHQubVs0KmogKyBpXSA9IGNvZmFjdG9yOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gRG90IHByb2R1Y3Qgb2YgMHRoIGNvbHVtbiBvZiBzb3VyY2UgYW5kIDB0aCBjb2x1bW4gb2YgcmVzdWx0CisgICAgZmxvYXQgZGV0ID0gbS0+bVswXSpyZXN1bHQubVswXSArIG0tPm1bNF0qcmVzdWx0Lm1bNF0gKworICAgICAgICAgICAgICAgICBtLT5tWzhdKnJlc3VsdC5tWzhdICsgbS0+bVsxMl0qcmVzdWx0Lm1bMTJdOworCisgICAgaWYgKGZhYnMoZGV0KSA8IDFlLTYpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGRldCA9IDEuMGYgLyBkZXQ7CisgICAgZm9yIChpID0gMDsgaSA8IDE2OyArK2kpIHsKKyAgICAgICAgbS0+bVtpXSA9IHJlc3VsdC5tW2ldICogZGV0OworICAgIH0KKworICAgIHJldHVybiB0cnVlOworfQorCitzdGF0aWMgdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorcnNNYXRyaXhUcmFuc3Bvc2UocnNfbWF0cml4NHg0ICptKSB7CisgICAgaW50IGksIGo7CisgICAgZmxvYXQgdGVtcDsKKyAgICBmb3IgKGkgPSAwOyBpIDwgMzsgKytpKSB7CisgICAgICAgIGZvciAoaiA9IGkgKyAxOyBqIDwgNDsgKytqKSB7CisgICAgICAgICAgICB0ZW1wID0gbS0+bVtpKjQgKyBqXTsKKyAgICAgICAgICAgIG0tPm1baSo0ICsgal0gPSBtLT5tW2oqNCArIGldOworICAgICAgICAgICAgbS0+bVtqKjQgKyBpXSA9IHRlbXA7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCityc01hdHJpeFRyYW5zcG9zZShyc19tYXRyaXgzeDMgKm0pIHsKKyAgICBpbnQgaSwgajsKKyAgICBmbG9hdCB0ZW1wOworICAgIGZvciAoaSA9IDA7IGkgPCAyOyArK2kpIHsKKyAgICAgICAgZm9yIChqID0gaSArIDE7IGogPCAzOyArK2opIHsKKyAgICAgICAgICAgIHRlbXAgPSBtLT5tW2kqMyArIGpdOworICAgICAgICAgICAgbS0+bVtpKjMgKyBqXSA9IG0tPm1baio0ICsgaV07CisgICAgICAgICAgICBtLT5tW2oqMyArIGldID0gdGVtcDsKKyAgICAgICAgfQorICAgIH0KK30KKworc3RhdGljIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKK3JzTWF0cml4VHJhbnNwb3NlKHJzX21hdHJpeDJ4MiAqbSkgeworICAgIGZsb2F0IHRlbXAgPSBtLT5tWzFdOworICAgIG0tPm1bMV0gPSBtLT5tWzJdOworICAgIG0tPm1bMl0gPSB0ZW1wOworfQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gcXVhdGVybmlvbiBvcHMKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK3N0YXRpYyB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCityc1F1YXRlcm5pb25TZXQocnNfcXVhdGVybmlvbiAqcSwgZmxvYXQgdywgZmxvYXQgeCwgZmxvYXQgeSwgZmxvYXQgeikgeworICAgIHEtPncgPSB3OworICAgIHEtPnggPSB4OworICAgIHEtPnkgPSB5OworICAgIHEtPnogPSB6OworfQorCitzdGF0aWMgdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorcnNRdWF0ZXJuaW9uU2V0KHJzX3F1YXRlcm5pb24gKnEsIGNvbnN0IHJzX3F1YXRlcm5pb24gKnJocykgeworICAgIHEtPncgPSByaHMtPnc7CisgICAgcS0+eCA9IHJocy0+eDsKKyAgICBxLT55ID0gcmhzLT55OworICAgIHEtPnogPSByaHMtPno7Cit9CisKK3N0YXRpYyB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCityc1F1YXRlcm5pb25NdWx0aXBseShyc19xdWF0ZXJuaW9uICpxLCBmbG9hdCBzKSB7CisgICAgcS0+dyAqPSBzOworICAgIHEtPnggKj0gczsKKyAgICBxLT55ICo9IHM7CisgICAgcS0+eiAqPSBzOworfQorCitzdGF0aWMgdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorcnNRdWF0ZXJuaW9uTXVsdGlwbHkocnNfcXVhdGVybmlvbiAqcSwgY29uc3QgcnNfcXVhdGVybmlvbiAqcmhzKSB7CisgICAgcS0+dyA9IC1xLT54KnJocy0+eCAtIHEtPnkqcmhzLT55IC0gcS0+eipyaHMtPnogKyBxLT53KnJocy0+dzsKKyAgICBxLT54ID0gIHEtPngqcmhzLT53ICsgcS0+eSpyaHMtPnogLSBxLT56KnJocy0+eSArIHEtPncqcmhzLT54OworICAgIHEtPnkgPSAtcS0+eCpyaHMtPnogKyBxLT55KnJocy0+dyArIHEtPnoqcmhzLT56ICsgcS0+dypyaHMtPnk7CisgICAgcS0+eiA9ICBxLT54KnJocy0+eSAtIHEtPnkqcmhzLT54ICsgcS0+eipyaHMtPncgKyBxLT53KnJocy0+ejsKK30KKworc3RhdGljIHZvaWQKK3JzUXVhdGVybmlvbkFkZChyc19xdWF0ZXJuaW9uICpxLCBjb25zdCByc19xdWF0ZXJuaW9uICpyaHMpIHsKKyAgICBxLT53ICo9IHJocy0+dzsKKyAgICBxLT54ICo9IHJocy0+eDsKKyAgICBxLT55ICo9IHJocy0+eTsKKyAgICBxLT56ICo9IHJocy0+ejsKK30KKworc3RhdGljIHZvaWQKK3JzUXVhdGVybmlvbkxvYWRSb3RhdGVVbml0KHJzX3F1YXRlcm5pb24gKnEsIGZsb2F0IHJvdCwgZmxvYXQgeCwgZmxvYXQgeSwgZmxvYXQgeikgeworICAgIHJvdCAqPSAoZmxvYXQpKE1fUEkgLyAxODAuMGYpICogMC41ZjsKKyAgICBmbG9hdCBjID0gY29zKHJvdCk7CisgICAgZmxvYXQgcyA9IHNpbihyb3QpOworCisgICAgcS0+dyA9IGM7CisgICAgcS0+eCA9IHggKiBzOworICAgIHEtPnkgPSB5ICogczsKKyAgICBxLT56ID0geiAqIHM7Cit9CisKK3N0YXRpYyB2b2lkCityc1F1YXRlcm5pb25Mb2FkUm90YXRlKHJzX3F1YXRlcm5pb24gKnEsIGZsb2F0IHJvdCwgZmxvYXQgeCwgZmxvYXQgeSwgZmxvYXQgeikgeworICAgIGNvbnN0IGZsb2F0IGxlbiA9IHgqeCArIHkqeSArIHoqejsKKyAgICBpZiAobGVuICE9IDEpIHsKKyAgICAgICAgY29uc3QgZmxvYXQgcmVjaXBMZW4gPSAxLmYgLyBzcXJ0KGxlbik7CisgICAgICAgIHggKj0gcmVjaXBMZW47CisgICAgICAgIHkgKj0gcmVjaXBMZW47CisgICAgICAgIHogKj0gcmVjaXBMZW47CisgICAgfQorICAgIHJzUXVhdGVybmlvbkxvYWRSb3RhdGVVbml0KHEsIHJvdCwgeCwgeSwgeik7Cit9CisKK3N0YXRpYyB2b2lkCityc1F1YXRlcm5pb25Db25qdWdhdGUocnNfcXVhdGVybmlvbiAqcSkgeworICAgIHEtPnggPSAtcS0+eDsKKyAgICBxLT55ID0gLXEtPnk7CisgICAgcS0+eiA9IC1xLT56OworfQorCitzdGF0aWMgZmxvYXQKK3JzUXVhdGVybmlvbkRvdChjb25zdCByc19xdWF0ZXJuaW9uICpxMCwgY29uc3QgcnNfcXVhdGVybmlvbiAqcTEpIHsKKyAgICByZXR1cm4gcTAtPncqcTEtPncgKyBxMC0+eCpxMS0+eCArIHEwLT55KnExLT55ICsgcTAtPnoqcTEtPno7Cit9CisKK3N0YXRpYyB2b2lkCityc1F1YXRlcm5pb25Ob3JtYWxpemUocnNfcXVhdGVybmlvbiAqcSkgeworICAgIGNvbnN0IGZsb2F0IGxlbiA9IHJzUXVhdGVybmlvbkRvdChxLCBxKTsKKyAgICBpZiAobGVuICE9IDEpIHsKKyAgICAgICAgY29uc3QgZmxvYXQgcmVjaXBMZW4gPSAxLmYgLyBzcXJ0KGxlbik7CisgICAgICAgIHJzUXVhdGVybmlvbk11bHRpcGx5KHEsIHJlY2lwTGVuKTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkCityc1F1YXRlcm5pb25TbGVycChyc19xdWF0ZXJuaW9uICpxLCBjb25zdCByc19xdWF0ZXJuaW9uICpxMCwgY29uc3QgcnNfcXVhdGVybmlvbiAqcTEsIGZsb2F0IHQpIHsKKyAgICBpZih0IDw9IDAuMGYpIHsKKyAgICAgICAgcnNRdWF0ZXJuaW9uU2V0KHEsIHEwKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBpZih0ID49IDEuMGYpIHsKKyAgICAgICAgcnNRdWF0ZXJuaW9uU2V0KHEsIHExKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHJzX3F1YXRlcm5pb24gdGVtcHEwLCB0ZW1wcTE7CisgICAgcnNRdWF0ZXJuaW9uU2V0KCZ0ZW1wcTAsIHEwKTsKKyAgICByc1F1YXRlcm5pb25TZXQoJnRlbXBxMSwgcTEpOworCisgICAgZmxvYXQgYW5nbGUgPSByc1F1YXRlcm5pb25Eb3QocTAsIHExKTsKKyAgICBpZihhbmdsZSA8IDApIHsKKyAgICAgICAgcnNRdWF0ZXJuaW9uTXVsdGlwbHkoJnRlbXBxMCwgLTEuMGYpOworICAgICAgICBhbmdsZSAqPSAtMS4wZjsKKyAgICB9CisKKyAgICBmbG9hdCBzY2FsZSwgaW52U2NhbGU7CisgICAgaWYgKGFuZ2xlICsgMS4wZiA+IDAuMDVmKSB7CisgICAgICAgIGlmICgxLjBmIC0gYW5nbGUgPj0gMC4wNWYpIHsKKyAgICAgICAgICAgIGZsb2F0IHRoZXRhID0gYWNvcyhhbmdsZSk7CisgICAgICAgICAgICBmbG9hdCBpbnZTaW5UaGV0YSA9IDEuMGYgLyBzaW4odGhldGEpOworICAgICAgICAgICAgc2NhbGUgPSBzaW4odGhldGEgKiAoMS4wZiAtIHQpKSAqIGludlNpblRoZXRhOworICAgICAgICAgICAgaW52U2NhbGUgPSBzaW4odGhldGEgKiB0KSAqIGludlNpblRoZXRhOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgc2NhbGUgPSAxLjBmIC0gdDsKKyAgICAgICAgICAgIGludlNjYWxlID0gdDsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgcnNRdWF0ZXJuaW9uU2V0KCZ0ZW1wcTEsIHRlbXBxMC56LCAtdGVtcHEwLnksIHRlbXBxMC54LCAtdGVtcHEwLncpOworICAgICAgICBzY2FsZSA9IHNpbihNX1BJICogKDAuNWYgLSB0KSk7CisgICAgICAgIGludlNjYWxlID0gc2luKE1fUEkgKiB0KTsKKyAgICB9CisKKyAgICByc1F1YXRlcm5pb25TZXQocSwgdGVtcHEwLncqc2NhbGUgKyB0ZW1wcTEudyppbnZTY2FsZSwgdGVtcHEwLngqc2NhbGUgKyB0ZW1wcTEueCppbnZTY2FsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBxMC55KnNjYWxlICsgdGVtcHExLnkqaW52U2NhbGUsIHRlbXBxMC56KnNjYWxlICsgdGVtcHExLnoqaW52U2NhbGUpOworfQorCitzdGF0aWMgdm9pZCByc1F1YXRlcm5pb25HZXRNYXRyaXhVbml0KHJzX21hdHJpeDR4NCAqbSwgY29uc3QgcnNfcXVhdGVybmlvbiAqcSkgeworICAgIGZsb2F0IHgyID0gMi4wZiAqIHEtPnggKiBxLT54OworICAgIGZsb2F0IHkyID0gMi4wZiAqIHEtPnkgKiBxLT55OworICAgIGZsb2F0IHoyID0gMi4wZiAqIHEtPnogKiBxLT56OworICAgIGZsb2F0IHh5ID0gMi4wZiAqIHEtPnggKiBxLT55OworICAgIGZsb2F0IHd6ID0gMi4wZiAqIHEtPncgKiBxLT56OworICAgIGZsb2F0IHh6ID0gMi4wZiAqIHEtPnggKiBxLT56OworICAgIGZsb2F0IHd5ID0gMi4wZiAqIHEtPncgKiBxLT55OworICAgIGZsb2F0IHd4ID0gMi4wZiAqIHEtPncgKiBxLT54OworICAgIGZsb2F0IHl6ID0gMi4wZiAqIHEtPnkgKiBxLT56OworCisgICAgbS0+bVswXSA9IDEuMGYgLSB5MiAtIHoyOworICAgIG0tPm1bMV0gPSB4eSAtIHd6OworICAgIG0tPm1bMl0gPSB4eiArIHd5OworICAgIG0tPm1bM10gPSAwLjBmOworCisgICAgbS0+bVs0XSA9IHh5ICsgd3o7CisgICAgbS0+bVs1XSA9IDEuMGYgLSB4MiAtIHoyOworICAgIG0tPm1bNl0gPSB5eiAtIHd4OworICAgIG0tPm1bN10gPSAwLjBmOworCisgICAgbS0+bVs4XSA9IHh6IC0gd3k7CisgICAgbS0+bVs5XSA9IHl6IC0gd3g7CisgICAgbS0+bVsxMF0gPSAxLjBmIC0geDIgLSB5MjsKKyAgICBtLT5tWzExXSA9IDAuMGY7CisKKyAgICBtLT5tWzEyXSA9IDAuMGY7CisgICAgbS0+bVsxM10gPSAwLjBmOworICAgIG0tPm1bMTRdID0gMC4wZjsKKyAgICBtLT5tWzE1XSA9IDEuMGY7Cit9CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyB1dGlsaXR5IGZ1bmNzCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwordm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorcnNFeHRyYWN0RnJ1c3R1bVBsYW5lcyhjb25zdCByc19tYXRyaXg0eDQgKm1vZGVsVmlld1Byb2osCisgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQ0ICpsZWZ0LCBmbG9hdDQgKnJpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0NCAqdG9wLCBmbG9hdDQgKmJvdHRvbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdDQgKm5lYXIsIGZsb2F0NCAqZmFyKSB7CisgICAgLy8geCB5IHogdyA9IGEgYiBjIGQgaW4gdGhlIHBsYW5lIGVxdWF0aW9uCisgICAgbGVmdC0+eCA9IG1vZGVsVmlld1Byb2otPm1bM10gKyBtb2RlbFZpZXdQcm9qLT5tWzBdOworICAgIGxlZnQtPnkgPSBtb2RlbFZpZXdQcm9qLT5tWzddICsgbW9kZWxWaWV3UHJvai0+bVs0XTsKKyAgICBsZWZ0LT56ID0gbW9kZWxWaWV3UHJvai0+bVsxMV0gKyBtb2RlbFZpZXdQcm9qLT5tWzhdOworICAgIGxlZnQtPncgPSBtb2RlbFZpZXdQcm9qLT5tWzE1XSArIG1vZGVsVmlld1Byb2otPm1bMTJdOworCisgICAgcmlnaHQtPnggPSBtb2RlbFZpZXdQcm9qLT5tWzNdIC0gbW9kZWxWaWV3UHJvai0+bVswXTsKKyAgICByaWdodC0+eSA9IG1vZGVsVmlld1Byb2otPm1bN10gLSBtb2RlbFZpZXdQcm9qLT5tWzRdOworICAgIHJpZ2h0LT56ID0gbW9kZWxWaWV3UHJvai0+bVsxMV0gLSBtb2RlbFZpZXdQcm9qLT5tWzhdOworICAgIHJpZ2h0LT53ID0gbW9kZWxWaWV3UHJvai0+bVsxNV0gLSBtb2RlbFZpZXdQcm9qLT5tWzEyXTsKKworICAgIHRvcC0+eCA9IG1vZGVsVmlld1Byb2otPm1bM10gLSBtb2RlbFZpZXdQcm9qLT5tWzFdOworICAgIHRvcC0+eSA9IG1vZGVsVmlld1Byb2otPm1bN10gLSBtb2RlbFZpZXdQcm9qLT5tWzVdOworICAgIHRvcC0+eiA9IG1vZGVsVmlld1Byb2otPm1bMTFdIC0gbW9kZWxWaWV3UHJvai0+bVs5XTsKKyAgICB0b3AtPncgPSBtb2RlbFZpZXdQcm9qLT5tWzE1XSAtIG1vZGVsVmlld1Byb2otPm1bMTNdOworCisgICAgYm90dG9tLT54ID0gbW9kZWxWaWV3UHJvai0+bVszXSArIG1vZGVsVmlld1Byb2otPm1bMV07CisgICAgYm90dG9tLT55ID0gbW9kZWxWaWV3UHJvai0+bVs3XSArIG1vZGVsVmlld1Byb2otPm1bNV07CisgICAgYm90dG9tLT56ID0gbW9kZWxWaWV3UHJvai0+bVsxMV0gKyBtb2RlbFZpZXdQcm9qLT5tWzldOworICAgIGJvdHRvbS0+dyA9IG1vZGVsVmlld1Byb2otPm1bMTVdICsgbW9kZWxWaWV3UHJvai0+bVsxM107CisKKyAgICBuZWFyLT54ID0gbW9kZWxWaWV3UHJvai0+bVszXSArIG1vZGVsVmlld1Byb2otPm1bMl07CisgICAgbmVhci0+eSA9IG1vZGVsVmlld1Byb2otPm1bN10gKyBtb2RlbFZpZXdQcm9qLT5tWzZdOworICAgIG5lYXItPnogPSBtb2RlbFZpZXdQcm9qLT5tWzExXSArIG1vZGVsVmlld1Byb2otPm1bMTBdOworICAgIG5lYXItPncgPSBtb2RlbFZpZXdQcm9qLT5tWzE1XSArIG1vZGVsVmlld1Byb2otPm1bMTRdOworCisgICAgZmFyLT54ID0gbW9kZWxWaWV3UHJvai0+bVszXSAtIG1vZGVsVmlld1Byb2otPm1bMl07CisgICAgZmFyLT55ID0gbW9kZWxWaWV3UHJvai0+bVs3XSAtIG1vZGVsVmlld1Byb2otPm1bNl07CisgICAgZmFyLT56ID0gbW9kZWxWaWV3UHJvai0+bVsxMV0gLSBtb2RlbFZpZXdQcm9qLT5tWzEwXTsKKyAgICBmYXItPncgPSBtb2RlbFZpZXdQcm9qLT5tWzE1XSAtIG1vZGVsVmlld1Byb2otPm1bMTRdOworCisgICAgZmxvYXQgbGVuID0gbGVuZ3RoKGxlZnQtPnh5eik7CisgICAgKmxlZnQgLz0gbGVuOworICAgIGxlbiA9IGxlbmd0aChyaWdodC0+eHl6KTsKKyAgICAqcmlnaHQgLz0gbGVuOworICAgIGxlbiA9IGxlbmd0aCh0b3AtPnh5eik7CisgICAgKnRvcCAvPSBsZW47CisgICAgbGVuID0gbGVuZ3RoKGJvdHRvbS0+eHl6KTsKKyAgICAqYm90dG9tIC89IGxlbjsKKyAgICBsZW4gPSBsZW5ndGgobmVhci0+eHl6KTsKKyAgICAqbmVhciAvPSBsZW47CisgICAgbGVuID0gbGVuZ3RoKGZhci0+eHl6KTsKKyAgICAqZmFyIC89IGxlbjsKK30KKworYm9vbCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorcnNJc1NwaGVyZUluRnJ1c3R1bShmbG9hdDQgKnNwaGVyZSwKKyAgICAgICAgICAgICAgICAgICAgICBmbG9hdDQgKmxlZnQsIGZsb2F0NCAqcmlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgZmxvYXQ0ICp0b3AsIGZsb2F0NCAqYm90dG9tLAorICAgICAgICAgICAgICAgICAgICAgIGZsb2F0NCAqbmVhciwgZmxvYXQ0ICpmYXIpIHsKKworICAgIGZsb2F0IGRpc3RUb0NlbnRlciA9IGRvdChsZWZ0LT54eXosIHNwaGVyZS0+eHl6KSArIGxlZnQtPnc7CisgICAgaWYoZGlzdFRvQ2VudGVyIDwgLXNwaGVyZS0+dykgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGRpc3RUb0NlbnRlciA9IGRvdChyaWdodC0+eHl6LCBzcGhlcmUtPnh5eikgKyByaWdodC0+dzsKKyAgICBpZihkaXN0VG9DZW50ZXIgPCAtc3BoZXJlLT53KSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgZGlzdFRvQ2VudGVyID0gZG90KHRvcC0+eHl6LCBzcGhlcmUtPnh5eikgKyB0b3AtPnc7CisgICAgaWYoZGlzdFRvQ2VudGVyIDwgLXNwaGVyZS0+dykgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGRpc3RUb0NlbnRlciA9IGRvdChib3R0b20tPnh5eiwgc3BoZXJlLT54eXopICsgYm90dG9tLT53OworICAgIGlmKGRpc3RUb0NlbnRlciA8IC1zcGhlcmUtPncpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBkaXN0VG9DZW50ZXIgPSBkb3QobmVhci0+eHl6LCBzcGhlcmUtPnh5eikgKyBuZWFyLT53OworICAgIGlmKGRpc3RUb0NlbnRlciA8IC1zcGhlcmUtPncpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBkaXN0VG9DZW50ZXIgPSBkb3QoZmFyLT54eXosIHNwaGVyZS0+eHl6KSArIGZhci0+dzsKKyAgICBpZihkaXN0VG9DZW50ZXIgPCAtc3BoZXJlLT53KSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgcmV0dXJuIHRydWU7Cit9CisKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIGludCBvcHMKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK19faW5saW5lX18gc3RhdGljIHVpbnQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlLCBhbHdheXNfaW5saW5lKSkgcnNDbGFtcCh1aW50IGFtb3VudCwgdWludCBsb3csIHVpbnQgaGlnaCkgeworICAgIHJldHVybiBhbW91bnQgPCBsb3cgPyBsb3cgOiAoYW1vdW50ID4gaGlnaCA/IGhpZ2ggOiBhbW91bnQpOworfQorX19pbmxpbmVfXyBzdGF0aWMgaW50IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSwgYWx3YXlzX2lubGluZSkpIHJzQ2xhbXAoaW50IGFtb3VudCwgaW50IGxvdywgaW50IGhpZ2gpIHsKKyAgICByZXR1cm4gYW1vdW50IDwgbG93ID8gbG93IDogKGFtb3VudCA+IGhpZ2ggPyBoaWdoIDogYW1vdW50KTsKK30KK19faW5saW5lX18gc3RhdGljIHVzaG9ydCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUsIGFsd2F5c19pbmxpbmUpKSByc0NsYW1wKHVzaG9ydCBhbW91bnQsIHVzaG9ydCBsb3csIHVzaG9ydCBoaWdoKSB7CisgICAgcmV0dXJuIGFtb3VudCA8IGxvdyA/IGxvdyA6IChhbW91bnQgPiBoaWdoID8gaGlnaCA6IGFtb3VudCk7Cit9CitfX2lubGluZV9fIHN0YXRpYyBzaG9ydCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUsIGFsd2F5c19pbmxpbmUpKSByc0NsYW1wKHNob3J0IGFtb3VudCwgc2hvcnQgbG93LCBzaG9ydCBoaWdoKSB7CisgICAgcmV0dXJuIGFtb3VudCA8IGxvdyA/IGxvdyA6IChhbW91bnQgPiBoaWdoID8gaGlnaCA6IGFtb3VudCk7Cit9CitfX2lubGluZV9fIHN0YXRpYyB1Y2hhciBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUsIGFsd2F5c19pbmxpbmUpKSByc0NsYW1wKHVjaGFyIGFtb3VudCwgdWNoYXIgbG93LCB1Y2hhciBoaWdoKSB7CisgICAgcmV0dXJuIGFtb3VudCA8IGxvdyA/IGxvdyA6IChhbW91bnQgPiBoaWdoID8gaGlnaCA6IGFtb3VudCk7Cit9CitfX2lubGluZV9fIHN0YXRpYyBjaGFyIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSwgYWx3YXlzX2lubGluZSkpIHJzQ2xhbXAoY2hhciBhbW91bnQsIGNoYXIgbG93LCBjaGFyIGhpZ2gpIHsKKyAgICByZXR1cm4gYW1vdW50IDwgbG93ID8gbG93IDogKGFtb3VudCA+IGhpZ2ggPyBoaWdoIDogYW1vdW50KTsKK30KKworCisKKyNlbmRpZgorCmRpZmYgLS1naXQgYS9saWJzL3JzL3NjcmlwdGMvcnNfZ3JhcGhpY3MucnNoIGIvbGlicy9ycy9zY3JpcHRjL3JzX2dyYXBoaWNzLnJzaAppbmRleCA3MGNkNTYyLi5jMGIyZDJkIDEwMDY0NAotLS0gYS9saWJzL3JzL3NjcmlwdGMvcnNfZ3JhcGhpY3MucnNoCisrKyBiL2xpYnMvcnMvc2NyaXB0Yy9yc19ncmFwaGljcy5yc2gKQEAgLTEsNjUgKzEsMTA2IEBACisjaWZuZGVmIF9fUlNfR1JBUEhJQ1NfUlNIX18KKyNkZWZpbmUgX19SU19HUkFQSElDU19SU0hfXworCisjaW5jbHVkZSAicnNfbWF0aC5yc2giCiAKIAotZXh0ZXJuIGZsb2F0MiB2ZWMyUmFuZChmbG9hdCBsZW4pOworLy8gQmluZCBhIFByb2dyYW1GcmFnbWVudCB0byB0aGUgUlMgY29udGV4dC4KK2V4dGVybiB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNnQmluZFByb2dyYW1GcmFnbWVudChyc19wcm9ncmFtX2ZyYWdtZW50KTsKK2V4dGVybiB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNnQmluZFByb2dyYW1TdG9yZShyc19wcm9ncmFtX3N0b3JlKTsKK2V4dGVybiB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNnQmluZFByb2dyYW1WZXJ0ZXgocnNfcHJvZ3JhbV92ZXJ0ZXgpOworZXh0ZXJuIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc2dCaW5kUHJvZ3JhbVJhc3Rlcihyc19wcm9ncmFtX3Jhc3Rlcik7CiAKLWV4dGVybiBmbG9hdDMgZmxvYXQzTm9ybShmbG9hdDMpOwotZXh0ZXJuIGZsb2F0IGZsb2F0M0xlbmd0aChmbG9hdDMpOwotZXh0ZXJuIGZsb2F0MyBmbG9hdDNBZGQoZmxvYXQzIGxocywgZmxvYXQzIHJocyk7Ci1leHRlcm4gZmxvYXQzIGZsb2F0M1N1YihmbG9hdDMgbGhzLCBmbG9hdDMgcmhzKTsKLWV4dGVybiBmbG9hdDMgZmxvYXQzQ3Jvc3MoZmxvYXQzIGxocywgZmxvYXQzIHJocyk7Ci1leHRlcm4gZmxvYXQgZmxvYXQzRG90KGZsb2F0MyBsaHMsIGZsb2F0MyByaHMpOwotZXh0ZXJuIGZsb2F0MyBmbG9hdDNTY2FsZShmbG9hdDMgdiwgZmxvYXQgc2NhbGUpOworZXh0ZXJuIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc2dCaW5kU2FtcGxlcihyc19wcm9ncmFtX2ZyYWdtZW50LCB1aW50IHNsb3QsIHJzX3NhbXBsZXIpOworZXh0ZXJuIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc2dCaW5kVGV4dHVyZShyc19wcm9ncmFtX2ZyYWdtZW50LCB1aW50IHNsb3QsIHJzX2FsbG9jYXRpb24pOwogCi1leHRlcm4gZmxvYXQ0IGZsb2F0NEFkZChmbG9hdDQgbGhzLCBmbG9hdDQgcmhzKTsKLWV4dGVybiBmbG9hdDQgZmxvYXQ0U3ViKGZsb2F0NCBsaHMsIGZsb2F0NCByaHMpOwotZXh0ZXJuIGZsb2F0NCBmbG9hdDRDcm9zcyhmbG9hdDQgbGhzLCBmbG9hdDQgcmhzKTsKLWV4dGVybiBmbG9hdCBmbG9hdDREb3QoZmxvYXQ0IGxocywgZmxvYXQ0IHJocyk7Ci1leHRlcm4gZmxvYXQ0IGZsb2F0NFNjYWxlKGZsb2F0NCB2LCBmbG9hdCBzY2FsZSk7CitleHRlcm4gdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzZ1Byb2dyYW1WZXJ0ZXhMb2FkUHJvamVjdGlvbk1hdHJpeChjb25zdCByc19tYXRyaXg0eDQgKik7CitleHRlcm4gdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzZ1Byb2dyYW1WZXJ0ZXhMb2FkTW9kZWxNYXRyaXgoY29uc3QgcnNfbWF0cml4NHg0ICopOworZXh0ZXJuIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc2dQcm9ncmFtVmVydGV4TG9hZFRleHR1cmVNYXRyaXgoY29uc3QgcnNfbWF0cml4NHg0ICopOwogCi0gICAgLy8gY29udGV4dAotZXh0ZXJuIHZvaWQgYmluZFByb2dyYW1GcmFnbWVudChyc19wcm9ncmFtX2ZyYWdtZW50KTsKLWV4dGVybiB2b2lkIGJpbmRQcm9ncmFtU3RvcmUocnNfcHJvZ3JhbV9zdG9yZSk7Ci1leHRlcm4gdm9pZCBiaW5kUHJvZ3JhbVZlcnRleChyc19wcm9ncmFtX3ZlcnRleCk7CitleHRlcm4gdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzZ1Byb2dyYW1WZXJ0ZXhHZXRQcm9qZWN0aW9uTWF0cml4KHJzX21hdHJpeDR4NCAqKTsKIAotZXh0ZXJuIHZvaWQgYmluZFNhbXBsZXIocnNfcHJvZ3JhbV9mcmFnbWVudCwgaW50IHNsb3QsIHJzX3NhbXBsZXIpOwotZXh0ZXJuIHZvaWQgYmluZFNhbXBsZXIocnNfcHJvZ3JhbV9mcmFnbWVudCwgaW50IHNsb3QsIHJzX2FsbG9jYXRpb24pOworZXh0ZXJuIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc2dQcm9ncmFtRnJhZ21lbnRDb25zdGFudENvbG9yKHJzX3Byb2dyYW1fZnJhZ21lbnQsIGZsb2F0LCBmbG9hdCwgZmxvYXQsIGZsb2F0KTsKIAotZXh0ZXJuIHZvaWQgdnBMb2FkTW9kZWxNYXRyaXgoY29uc3QgZmxvYXQgKik7Ci1leHRlcm4gdm9pZCB2cExvYWRUZXh0dXJlTWF0cml4KGNvbnN0IGZsb2F0ICopOworZXh0ZXJuIHVpbnQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc2dHZXRXaWR0aCh2b2lkKTsKK2V4dGVybiB1aW50IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNnR2V0SGVpZ2h0KHZvaWQpOwogCitleHRlcm4gdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzZ1VwbG9hZFRvVGV4dHVyZShyc19hbGxvY2F0aW9uKTsKK2V4dGVybiB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNnVXBsb2FkVG9UZXh0dXJlKHJzX2FsbG9jYXRpb24sIHVpbnQgbWlwTGV2ZWwpOworZXh0ZXJuIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc2dVcGxvYWRUb0J1ZmZlck9iamVjdChyc19hbGxvY2F0aW9uKTsKIAotLy8gZHJhd2luZwotZXh0ZXJuIHZvaWQgZHJhd1JlY3QoZmxvYXQgeDEsIGZsb2F0IHkxLCBmbG9hdCB4MiwgZmxvYXQgeTIsIGZsb2F0IHopOwotZXh0ZXJuIHZvaWQgZHJhd1F1YWQoZmxvYXQgeDEsIGZsb2F0IHkxLCBmbG9hdCB6MSwgZmxvYXQgeDIsIGZsb2F0IHkyLCBmbG9hdCB6MiwgZmxvYXQgeDMsIGZsb2F0IHkzLCBmbG9hdCB6MywgZmxvYXQgeDQsIGZsb2F0IHk0LCBmbG9hdCB6NCk7Ci1leHRlcm4gdm9pZCBkcmF3UXVhZFRleENvb3JkcyhmbG9hdCB4MSwgZmxvYXQgeTEsIGZsb2F0IHoxLCBmbG9hdCB1MSwgZmxvYXQgdjEsIGZsb2F0IHgyLCBmbG9hdCB5MiwgZmxvYXQgejIsIGZsb2F0IHUyLCBmbG9hdCB2MiwgZmxvYXQgeDMsIGZsb2F0IHkzLCBmbG9hdCB6MywgZmxvYXQgdTMsIGZsb2F0IHYzLCBmbG9hdCB4NCwgZmxvYXQgeTQsIGZsb2F0IHo0LCBmbG9hdCB1NCwgZmxvYXQgdjQpOwotZXh0ZXJuIHZvaWQgZHJhd1Nwcml0ZShmbG9hdCB4LCBmbG9hdCB5LCBmbG9hdCB6LCBmbG9hdCB3LCBmbG9hdCBoKTsKLWV4dGVybiB2b2lkIGRyYXdTcHJpdGVTY3JlZW5zcGFjZShmbG9hdCB4LCBmbG9hdCB5LCBmbG9hdCB6LCBmbG9hdCB3LCBmbG9hdCBoKTsKLWV4dGVybiB2b2lkIGRyYXdMaW5lKGZsb2F0IHgxLCBmbG9hdCB5MSwgZmxvYXQgejEsIGZsb2F0IHgyLCBmbG9hdCB5MiwgZmxvYXQgejIpOwotZXh0ZXJuIHZvaWQgZHJhd1BvaW50KGZsb2F0IHgxLCBmbG9hdCB5MSwgZmxvYXQgejEpOwotZXh0ZXJuIHZvaWQgZHJhd1NpbXBsZU1lc2goaW50IGlzbSk7Ci1leHRlcm4gdm9pZCBkcmF3U2ltcGxlTWVzaFJhbmdlKGludCBpc20sIGludCBzdGFydCwgaW50IGxlbik7CitleHRlcm4gdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzZ0RyYXdSZWN0KGZsb2F0IHgxLCBmbG9hdCB5MSwgZmxvYXQgeDIsIGZsb2F0IHkyLCBmbG9hdCB6KTsKK2V4dGVybiB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNnRHJhd1F1YWQoZmxvYXQgeDEsIGZsb2F0IHkxLCBmbG9hdCB6MSwKKyAgICAgICAgICAgICAgICBmbG9hdCB4MiwgZmxvYXQgeTIsIGZsb2F0IHoyLAorICAgICAgICAgICAgICAgIGZsb2F0IHgzLCBmbG9hdCB5MywgZmxvYXQgejMsCisgICAgICAgICAgICAgICAgZmxvYXQgeDQsIGZsb2F0IHk0LCBmbG9hdCB6NCk7CitleHRlcm4gdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzZ0RyYXdRdWFkVGV4Q29vcmRzKGZsb2F0IHgxLCBmbG9hdCB5MSwgZmxvYXQgejEsIGZsb2F0IHUxLCBmbG9hdCB2MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCB4MiwgZmxvYXQgeTIsIGZsb2F0IHoyLCBmbG9hdCB1MiwgZmxvYXQgdjIsCisgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgeDMsIGZsb2F0IHkzLCBmbG9hdCB6MywgZmxvYXQgdTMsIGZsb2F0IHYzLAorICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHg0LCBmbG9hdCB5NCwgZmxvYXQgejQsIGZsb2F0IHU0LCBmbG9hdCB2NCk7CitleHRlcm4gdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzZ0RyYXdTcHJpdGVTY3JlZW5zcGFjZShmbG9hdCB4LCBmbG9hdCB5LCBmbG9hdCB6LCBmbG9hdCB3LCBmbG9hdCBoKTsKIAorZXh0ZXJuIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc2dEcmF3TWVzaChyc19tZXNoIGlzbSk7CitleHRlcm4gdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzZ0RyYXdNZXNoKHJzX21lc2ggaXNtLCB1aW50IHByaW1pdGl2ZUluZGV4KTsKK2V4dGVybiB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNnRHJhd01lc2gocnNfbWVzaCBpc20sIHVpbnQgcHJpbWl0aXZlSW5kZXgsIHVpbnQgc3RhcnQsIHVpbnQgbGVuKTsKKworZXh0ZXJuIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc2dDbGVhckNvbG9yKGZsb2F0LCBmbG9hdCwgZmxvYXQsIGZsb2F0KTsKK2V4dGVybiB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNnQ2xlYXJEZXB0aChmbG9hdCk7CisKK2V4dGVybiB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNnRHJhd1RleHQoY29uc3QgY2hhciAqLCBpbnQgeCwgaW50IHkpOworZXh0ZXJuIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc2dEcmF3VGV4dChyc19hbGxvY2F0aW9uLCBpbnQgeCwgaW50IHkpOworZXh0ZXJuIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc2dCaW5kRm9udChyc19mb250KTsKK2V4dGVybiB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNnRm9udENvbG9yKGZsb2F0LCBmbG9hdCwgZmxvYXQsIGZsb2F0KTsKKworZXh0ZXJuIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc2dNZXNoQ29tcHV0ZUJvdW5kaW5nQm94KHJzX21lc2ggbWVzaCwgZmxvYXQgKm1pblgsIGZsb2F0ICptaW5ZLCBmbG9hdCAqbWluWiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0ICptYXhYLCBmbG9hdCAqbWF4WSwgZmxvYXQgKm1heFopOwordm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorcnNnTWVzaENvbXB1dGVCb3VuZGluZ0JveChyc19tZXNoIG1lc2gsIGZsb2F0MyAqYkJveE1pbiwgZmxvYXQzICpiQm94TWF4KSB7CisgICAgZmxvYXQgeDEsIHkxLCB6MSwgeDIsIHkyLCB6MjsKKyAgICByc2dNZXNoQ29tcHV0ZUJvdW5kaW5nQm94KG1lc2gsICZ4MSwgJnkxLCAmejEsICZ4MiwgJnkyLCAmejIpOworICAgIGJCb3hNaW4tPnggPSB4MTsKKyAgICBiQm94TWluLT55ID0geTE7CisgICAgYkJveE1pbi0+eiA9IHoxOworICAgIGJCb3hNYXgtPnggPSB4MjsKKyAgICBiQm94TWF4LT55ID0geTI7CisgICAgYkJveE1heC0+eiA9IHoyOworfQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAvLyBtaXNjCi1leHRlcm4gdm9pZCBwZkNsZWFyQ29sb3IoZmxvYXQsIGZsb2F0LCBmbG9hdCwgZmxvYXQpOwotZXh0ZXJuIHZvaWQgY29sb3IoZmxvYXQsIGZsb2F0LCBmbG9hdCwgZmxvYXQpOwotZXh0ZXJuIHZvaWQgaHNiKGZsb2F0LCBmbG9hdCwgZmxvYXQsIGZsb2F0KTsKLWV4dGVybiB2b2lkIGhzYlRvUmdiKGZsb2F0LCBmbG9hdCwgZmxvYXQsIGZsb2F0Kik7Ci1leHRlcm4gaW50IGhzYlRvQWJncihmbG9hdCwgZmxvYXQsIGZsb2F0LCBmbG9hdCk7CiAKLWV4dGVybiB2b2lkIHVwbG9hZFRvVGV4dHVyZShpbnQsIGludCk7Ci1leHRlcm4gdm9pZCB1cGxvYWRUb0J1ZmZlck9iamVjdChpbnQpOworLy8gRGVwcmljYXRlZAorZXh0ZXJuIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICBjb2xvcihmbG9hdCwgZmxvYXQsIGZsb2F0LCBmbG9hdCk7CiAKLWV4dGVybiBpbnQgY29sb3JGbG9hdFJHQkF0b1VOb3JtOChmbG9hdCwgZmxvYXQsIGZsb2F0LCBmbG9hdCk7Ci1leHRlcm4gaW50IGNvbG9yRmxvYXRSR0J0bzU2NShmbG9hdCwgZmxvYXQsIGZsb2F0KTsKLQotZXh0ZXJuIGludCBnZXRXaWR0aCgpOwotZXh0ZXJuIGludCBnZXRIZWlnaHQoKTsKLQotZXh0ZXJuIGludCBzZW5kVG9DbGllbnQodm9pZCAqZGF0YSwgaW50IGNtZElELCBpbnQgbGVuLCBpbnQgd2FpdEZvclNwYWNlKTsKLQotZXh0ZXJuIHZvaWQgZGVidWdGKGNvbnN0IGNoYXIgKiwgZmxvYXQpOwotZXh0ZXJuIHZvaWQgZGVidWdJMzIoY29uc3QgY2hhciAqLCBpbnQpOwotZXh0ZXJuIHZvaWQgZGVidWdIZXhJMzIoY29uc3QgY2hhciAqLCBpbnQpOwotCi0KKyNlbmRpZgogCmRpZmYgLS1naXQgYS9saWJzL3JzL3NjcmlwdGMvcnNfbWF0aC5yc2ggYi9saWJzL3JzL3NjcmlwdGMvcnNfbWF0aC5yc2gKaW5kZXggNjEzYzdjYS4uNTcyMGIwNSAxMDA2NDQKLS0tIGEvbGlicy9ycy9zY3JpcHRjL3JzX21hdGgucnNoCisrKyBiL2xpYnMvcnMvc2NyaXB0Yy9yc19tYXRoLnJzaApAQCAtMSwyODcgKzEsMjIyIEBACi0vLyBGbG9hdCBvcHMKKyNpZm5kZWYgX19SU19NQVRIX1JTSF9fCisjZGVmaW5lIF9fUlNfTUFUSF9SU0hfXwogCi1leHRlcm4gZmxvYXQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgYWJzKGZsb2F0KTsKLWV4dGVybiBmbG9hdDIgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgYWJzKGZsb2F0Mik7Ci1leHRlcm4gZmxvYXQzIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGFicyhmbG9hdDMpOwotZXh0ZXJuIGZsb2F0NCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBhYnMoZmxvYXQ0KTsKLWV4dGVybiBmbG9hdDggX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgYWJzKGZsb2F0OCk7Ci1leHRlcm4gZmxvYXQxNiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBhYnMoZmxvYXQxNik7CisvLyBEZWJ1Z2dpbmcsIHByaW50IHRvIHRoZSBMT0cgYSBkZXNjcmlwdGlvbiBzdHJpbmcgYW5kIGEgdmFsdWUuCitleHRlcm4gdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzRGVidWcoY29uc3QgY2hhciAqLCBmbG9hdCk7CitleHRlcm4gdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzRGVidWcoY29uc3QgY2hhciAqLCBmbG9hdCwgZmxvYXQpOworZXh0ZXJuIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc0RlYnVnKGNvbnN0IGNoYXIgKiwgZmxvYXQsIGZsb2F0LCBmbG9hdCk7CitleHRlcm4gdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzRGVidWcoY29uc3QgY2hhciAqLCBmbG9hdCwgZmxvYXQsIGZsb2F0LCBmbG9hdCk7CitleHRlcm4gdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzRGVidWcoY29uc3QgY2hhciAqLCBjb25zdCByc19tYXRyaXg0eDQgKik7CitleHRlcm4gdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzRGVidWcoY29uc3QgY2hhciAqLCBjb25zdCByc19tYXRyaXgzeDMgKik7CitleHRlcm4gdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzRGVidWcoY29uc3QgY2hhciAqLCBjb25zdCByc19tYXRyaXgyeDIgKik7CitleHRlcm4gdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzRGVidWcoY29uc3QgY2hhciAqLCBpbnQpOworZXh0ZXJuIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc0RlYnVnKGNvbnN0IGNoYXIgKiwgdWludCk7CitleHRlcm4gdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzRGVidWcoY29uc3QgY2hhciAqLCBjb25zdCB2b2lkICopOworI2RlZmluZSBSU19ERUJVRyhhKSByc0RlYnVnKCNhLCBhKQorI2RlZmluZSBSU19ERUJVR19NQVJLRVIgcnNEZWJ1ZyhfX0ZJTEVfXywgX19MSU5FX18pCiAKLWV4dGVybiBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBhY29zKGZsb2F0KTsKLWV4dGVybiBmbG9hdDIgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgYWNvcyhmbG9hdDIpOwotZXh0ZXJuIGZsb2F0MyBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBhY29zKGZsb2F0Myk7Ci1leHRlcm4gZmxvYXQ0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGFjb3MoZmxvYXQ0KTsKLWV4dGVybiBmbG9hdDggX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgYWNvcyhmbG9hdDgpOwotZXh0ZXJuIGZsb2F0MTYgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgYWNvcyhmbG9hdDE2KTsKIAotZXh0ZXJuIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGFzaW4oZmxvYXQpOwotZXh0ZXJuIGZsb2F0MiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBhc2luKGZsb2F0Mik7Ci1leHRlcm4gZmxvYXQzIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGFzaW4oZmxvYXQzKTsKLWV4dGVybiBmbG9hdDQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgYXNpbihmbG9hdDQpOwotZXh0ZXJuIGZsb2F0OCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBhc2luKGZsb2F0OCk7Ci1leHRlcm4gZmxvYXQxNiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBhc2luKGZsb2F0MTYpOworI2luY2x1ZGUgInJzX2NsLnJzaCIKKyNpbmNsdWRlICJyc19jb3JlLnJzaCIKIAotZXh0ZXJuIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGF0YW4oZmxvYXQpOwotZXh0ZXJuIGZsb2F0MiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBhdGFuKGZsb2F0Mik7Ci1leHRlcm4gZmxvYXQzIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGF0YW4oZmxvYXQzKTsKLWV4dGVybiBmbG9hdDQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgYXRhbihmbG9hdDQpOwotZXh0ZXJuIGZsb2F0OCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBhdGFuKGZsb2F0OCk7Ci1leHRlcm4gZmxvYXQxNiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBhdGFuKGZsb2F0MTYpOworZXh0ZXJuIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc1NldE9iamVjdChyc19lbGVtZW50ICpkc3QsIHJzX2VsZW1lbnQgc3JjKTsKK2V4dGVybiB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNTZXRPYmplY3QocnNfdHlwZSAqZHN0LCByc190eXBlIHNyYyk7CitleHRlcm4gdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzU2V0T2JqZWN0KHJzX2FsbG9jYXRpb24gKmRzdCwgcnNfYWxsb2NhdGlvbiBzcmMpOworZXh0ZXJuIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc1NldE9iamVjdChyc19zYW1wbGVyICpkc3QsIHJzX3NhbXBsZXIgc3JjKTsKK2V4dGVybiB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNTZXRPYmplY3QocnNfc2NyaXB0ICpkc3QsIHJzX3NjcmlwdCBzcmMpOworZXh0ZXJuIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc1NldE9iamVjdChyc19tZXNoICpkc3QsIHJzX21lc2ggc3JjKTsKK2V4dGVybiB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNTZXRPYmplY3QocnNfcHJvZ3JhbV9mcmFnbWVudCAqZHN0LCByc19wcm9ncmFtX2ZyYWdtZW50IHNyYyk7CitleHRlcm4gdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzU2V0T2JqZWN0KHJzX3Byb2dyYW1fdmVydGV4ICpkc3QsIHJzX3Byb2dyYW1fdmVydGV4IHNyYyk7CitleHRlcm4gdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzU2V0T2JqZWN0KHJzX3Byb2dyYW1fcmFzdGVyICpkc3QsIHJzX3Byb2dyYW1fcmFzdGVyIHNyYyk7CitleHRlcm4gdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzU2V0T2JqZWN0KHJzX3Byb2dyYW1fc3RvcmUgKmRzdCwgcnNfcHJvZ3JhbV9zdG9yZSBzcmMpOworZXh0ZXJuIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc1NldE9iamVjdChyc19mb250ICpkc3QsIHJzX2ZvbnQgc3JjKTsKIAotZXh0ZXJuIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGF0YW4yKGZsb2F0LCBmbG9hdCk7Ci1leHRlcm4gZmxvYXQyIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGF0YW4yKGZsb2F0MiwgZmxvYXQyKTsKLWV4dGVybiBmbG9hdDMgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgYXRhbjIoZmxvYXQzLCBmbG9hdDMpOwotZXh0ZXJuIGZsb2F0NCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBhdGFuMihmbG9hdDQsIGZsb2F0NCk7Ci1leHRlcm4gZmxvYXQ4IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGF0YW4yKGZsb2F0OCwgZmxvYXQ4KTsKLWV4dGVybiBmbG9hdDE2IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGF0YW4yKGZsb2F0MTYsIGZsb2F0MTYpOworZXh0ZXJuIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc0NsZWFyT2JqZWN0KHJzX2VsZW1lbnQgKmRzdCk7CitleHRlcm4gdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzQ2xlYXJPYmplY3QocnNfdHlwZSAqZHN0KTsKK2V4dGVybiB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNDbGVhck9iamVjdChyc19hbGxvY2F0aW9uICpkc3QpOworZXh0ZXJuIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc0NsZWFyT2JqZWN0KHJzX3NhbXBsZXIgKmRzdCk7CitleHRlcm4gdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzQ2xlYXJPYmplY3QocnNfc2NyaXB0ICpkc3QpOworZXh0ZXJuIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc0NsZWFyT2JqZWN0KHJzX21lc2ggKmRzdCk7CitleHRlcm4gdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzQ2xlYXJPYmplY3QocnNfcHJvZ3JhbV9mcmFnbWVudCAqZHN0KTsKK2V4dGVybiB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNDbGVhck9iamVjdChyc19wcm9ncmFtX3ZlcnRleCAqZHN0KTsKK2V4dGVybiB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNDbGVhck9iamVjdChyc19wcm9ncmFtX3Jhc3RlciAqZHN0KTsKK2V4dGVybiB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNDbGVhck9iamVjdChyc19wcm9ncmFtX3N0b3JlICpkc3QpOworZXh0ZXJuIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc0NsZWFyT2JqZWN0KHJzX2ZvbnQgKmRzdCk7CiAKLWV4dGVybiBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBjZWlsKGZsb2F0KTsKLWV4dGVybiBmbG9hdDIgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgY2VpbChmbG9hdDIpOwotZXh0ZXJuIGZsb2F0MyBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBjZWlsKGZsb2F0Myk7Ci1leHRlcm4gZmxvYXQ0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGNlaWwoZmxvYXQ0KTsKLWV4dGVybiBmbG9hdDggX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgY2VpbChmbG9hdDgpOwotZXh0ZXJuIGZsb2F0MTYgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgY2VpbChmbG9hdDE2KTsKLQotZXh0ZXJuIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGNsYW1wKGZsb2F0LCBmbG9hdCwgZmxvYXQpOwotZXh0ZXJuIGZsb2F0MiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBjbGFtcChmbG9hdDIsIGZsb2F0MiwgZmxvYXQyKTsKLWV4dGVybiBmbG9hdDMgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgY2xhbXAoZmxvYXQzLCBmbG9hdDMsIGZsb2F0Myk7Ci1leHRlcm4gZmxvYXQ0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGNsYW1wKGZsb2F0NCwgZmxvYXQ0LCBmbG9hdDQpOwotZXh0ZXJuIGZsb2F0OCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBjbGFtcChmbG9hdDgsIGZsb2F0OCwgZmxvYXQ4KTsKLWV4dGVybiBmbG9hdDE2IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGNsYW1wKGZsb2F0MTYsIGZsb2F0MTYsIGZsb2F0MTYpOwotZXh0ZXJuIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGNsYW1wKGZsb2F0LCBmbG9hdCwgZmxvYXQpOwotZXh0ZXJuIGZsb2F0MiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBjbGFtcChmbG9hdDIsIGZsb2F0LCBmbG9hdCk7Ci1leHRlcm4gZmxvYXQzIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGNsYW1wKGZsb2F0MywgZmxvYXQsIGZsb2F0KTsKLWV4dGVybiBmbG9hdDQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgY2xhbXAoZmxvYXQ0LCBmbG9hdCwgZmxvYXQpOwotZXh0ZXJuIGZsb2F0OCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBjbGFtcChmbG9hdDgsIGZsb2F0LCBmbG9hdCk7Ci1leHRlcm4gZmxvYXQxNiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBjbGFtcChmbG9hdDE2LCBmbG9hdCwgZmxvYXQpOwotCi1leHRlcm4gZmxvYXQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgY29weXNpZ24oZmxvYXQsIGZsb2F0KTsKLWV4dGVybiBmbG9hdDIgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgY29weXNpZ24oZmxvYXQyLCBmbG9hdDIpOwotZXh0ZXJuIGZsb2F0MyBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBjb3B5c2lnbihmbG9hdDMsIGZsb2F0Myk7Ci1leHRlcm4gZmxvYXQ0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGNvcHlzaWduKGZsb2F0NCwgZmxvYXQ0KTsKLWV4dGVybiBmbG9hdDggX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgY29weXNpZ24oZmxvYXQ4LCBmbG9hdDgpOwotZXh0ZXJuIGZsb2F0MTYgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgY29weXNpZ24oZmxvYXQxNiwgZmxvYXQxNik7Ci0KLWV4dGVybiBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBjb3MoZmxvYXQpOwotZXh0ZXJuIGZsb2F0MiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBjb3MoZmxvYXQyKTsKLWV4dGVybiBmbG9hdDMgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgY29zKGZsb2F0Myk7Ci1leHRlcm4gZmxvYXQ0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGNvcyhmbG9hdDQpOwotZXh0ZXJuIGZsb2F0OCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBjb3MoZmxvYXQ4KTsKLWV4dGVybiBmbG9hdDE2IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGNvcyhmbG9hdDE2KTsKLQotZXh0ZXJuIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGRlZ3JlZXMoZmxvYXQpOwotZXh0ZXJuIGZsb2F0MiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBkZWdyZWVzKGZsb2F0Mik7Ci1leHRlcm4gZmxvYXQzIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGRlZ3JlZXMoZmxvYXQzKTsKLWV4dGVybiBmbG9hdDQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgZGVncmVlcyhmbG9hdDQpOwotZXh0ZXJuIGZsb2F0OCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBkZWdyZWVzKGZsb2F0OCk7Ci1leHRlcm4gZmxvYXQxNiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBkZWdyZWVzKGZsb2F0MTYpOwotCi1leHRlcm4gZmxvYXQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgZXhwKGZsb2F0KTsKLWV4dGVybiBmbG9hdDIgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgZXhwKGZsb2F0Mik7Ci1leHRlcm4gZmxvYXQzIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGV4cChmbG9hdDMpOwotZXh0ZXJuIGZsb2F0NCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBleHAoZmxvYXQ0KTsKLWV4dGVybiBmbG9hdDggX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgZXhwKGZsb2F0OCk7Ci1leHRlcm4gZmxvYXQxNiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBleHAoZmxvYXQxNik7Ci0KLWV4dGVybiBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBleHAyKGZsb2F0KTsKLWV4dGVybiBmbG9hdDIgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgZXhwMihmbG9hdDIpOwotZXh0ZXJuIGZsb2F0MyBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBleHAyKGZsb2F0Myk7Ci1leHRlcm4gZmxvYXQ0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGV4cDIoZmxvYXQ0KTsKLWV4dGVybiBmbG9hdDggX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgZXhwMihmbG9hdDgpOwotZXh0ZXJuIGZsb2F0MTYgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgZXhwMihmbG9hdDE2KTsKLQotZXh0ZXJuIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGV4cDEwKGZsb2F0KTsKLWV4dGVybiBmbG9hdDIgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgZXhwMTAoZmxvYXQyKTsKLWV4dGVybiBmbG9hdDMgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgZXhwMTAoZmxvYXQzKTsKLWV4dGVybiBmbG9hdDQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgZXhwMTAoZmxvYXQ0KTsKLWV4dGVybiBmbG9hdDggX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgZXhwMTAoZmxvYXQ4KTsKLWV4dGVybiBmbG9hdDE2IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGV4cDEwKGZsb2F0MTYpOwotCi1leHRlcm4gZmxvYXQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgZmFicyhmbG9hdCk7Ci1leHRlcm4gZmxvYXQyIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGZhYnMoZmxvYXQyKTsKLWV4dGVybiBmbG9hdDMgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgZmFicyhmbG9hdDMpOwotZXh0ZXJuIGZsb2F0NCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBmYWJzKGZsb2F0NCk7Ci1leHRlcm4gZmxvYXQ4IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGZhYnMoZmxvYXQ4KTsKLWV4dGVybiBmbG9hdDE2IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGZhYnMoZmxvYXQxNik7Ci0KLWV4dGVybiBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBmbG9vcihmbG9hdCk7Ci1leHRlcm4gZmxvYXQyIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGZsb29yKGZsb2F0Mik7Ci1leHRlcm4gZmxvYXQzIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGZsb29yKGZsb2F0Myk7Ci1leHRlcm4gZmxvYXQ0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGZsb29yKGZsb2F0NCk7Ci1leHRlcm4gZmxvYXQ4IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGZsb29yKGZsb2F0OCk7Ci1leHRlcm4gZmxvYXQxNiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBmbG9vcihmbG9hdDE2KTsKLQotZXh0ZXJuIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGZtYXgoZmxvYXQsIGZsb2F0KTsKLWV4dGVybiBmbG9hdDIgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgZm1heChmbG9hdDIsIGZsb2F0Mik7Ci1leHRlcm4gZmxvYXQzIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGZtYXgoZmxvYXQzLCBmbG9hdDMpOwotZXh0ZXJuIGZsb2F0NCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBmbWF4KGZsb2F0NCwgZmxvYXQ0KTsKLWV4dGVybiBmbG9hdDggX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgZm1heChmbG9hdDgsIGZsb2F0OCk7Ci1leHRlcm4gZmxvYXQxNiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBmbWF4KGZsb2F0MTYsIGZsb2F0MTYpOwotZXh0ZXJuIGZsb2F0MiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBmbWF4KGZsb2F0MiwgZmxvYXQpOwotZXh0ZXJuIGZsb2F0MyBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBmbWF4KGZsb2F0MywgZmxvYXQpOwotZXh0ZXJuIGZsb2F0NCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBmbWF4KGZsb2F0NCwgZmxvYXQpOwotZXh0ZXJuIGZsb2F0OCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBmbWF4KGZsb2F0OCwgZmxvYXQpOwotZXh0ZXJuIGZsb2F0MTYgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgZm1heChmbG9hdDE2LCBmbG9hdCk7Ci0KLWV4dGVybiBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBmbWluKGZsb2F0LCBmbG9hdCk7Ci1leHRlcm4gZmxvYXQyIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGZtaW4oZmxvYXQyLCBmbG9hdDIpOwotZXh0ZXJuIGZsb2F0MyBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBmbWluKGZsb2F0MywgZmxvYXQzKTsKLWV4dGVybiBmbG9hdDQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgZm1pbihmbG9hdDQsIGZsb2F0NCk7Ci1leHRlcm4gZmxvYXQ4IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGZtaW4oZmxvYXQ4LCBmbG9hdDgpOwotZXh0ZXJuIGZsb2F0MTYgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgZm1pbihmbG9hdDE2LCBmbG9hdDE2KTsKLWV4dGVybiBmbG9hdDIgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgZm1pbihmbG9hdDIsIGZsb2F0KTsKLWV4dGVybiBmbG9hdDMgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgZm1pbihmbG9hdDMsIGZsb2F0KTsKLWV4dGVybiBmbG9hdDQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgZm1pbihmbG9hdDQsIGZsb2F0KTsKLWV4dGVybiBmbG9hdDggX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgZm1pbihmbG9hdDgsIGZsb2F0KTsKLWV4dGVybiBmbG9hdDE2IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGZtaW4oZmxvYXQxNiwgZmxvYXQpOwotCi1leHRlcm4gZmxvYXQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgZm1vZChmbG9hdCwgZmxvYXQpOwotZXh0ZXJuIGZsb2F0MiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBmbW9kKGZsb2F0MiwgZmxvYXQyKTsKLWV4dGVybiBmbG9hdDMgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgZm1vZChmbG9hdDMsIGZsb2F0Myk7Ci1leHRlcm4gZmxvYXQ0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGZtb2QoZmxvYXQ0LCBmbG9hdDQpOwotZXh0ZXJuIGZsb2F0OCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBmbW9kKGZsb2F0OCwgZmxvYXQ4KTsKLWV4dGVybiBmbG9hdDE2IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGZtb2QoZmxvYXQxNiwgZmxvYXQxNik7Ci0KLWV4dGVybiBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBsb2coZmxvYXQpOwotZXh0ZXJuIGZsb2F0MiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBsb2coZmxvYXQyKTsKLWV4dGVybiBmbG9hdDMgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgbG9nKGZsb2F0Myk7Ci1leHRlcm4gZmxvYXQ0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGxvZyhmbG9hdDQpOwotZXh0ZXJuIGZsb2F0OCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBsb2coZmxvYXQ4KTsKLWV4dGVybiBmbG9hdDE2IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGxvZyhmbG9hdDE2KTsKLQotZXh0ZXJuIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGxvZzIoZmxvYXQpOwotZXh0ZXJuIGZsb2F0MiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBsb2cyKGZsb2F0Mik7Ci1leHRlcm4gZmxvYXQzIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGxvZzIoZmxvYXQzKTsKLWV4dGVybiBmbG9hdDQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgbG9nMihmbG9hdDQpOwotZXh0ZXJuIGZsb2F0OCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBsb2cyKGZsb2F0OCk7Ci1leHRlcm4gZmxvYXQxNiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBsb2cyKGZsb2F0MTYpOwotCi1leHRlcm4gZmxvYXQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgbG9nMTAoZmxvYXQpOwotZXh0ZXJuIGZsb2F0MiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBsb2cxMChmbG9hdDIpOwotZXh0ZXJuIGZsb2F0MyBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBsb2cxMChmbG9hdDMpOwotZXh0ZXJuIGZsb2F0NCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBsb2cxMChmbG9hdDQpOwotZXh0ZXJuIGZsb2F0OCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBsb2cxMChmbG9hdDgpOwotZXh0ZXJuIGZsb2F0MTYgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgbG9nMTAoZmxvYXQxNik7Ci0KLWV4dGVybiBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBtYXgoZmxvYXQsIGZsb2F0KTsKLWV4dGVybiBmbG9hdDIgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgbWF4KGZsb2F0MiwgZmxvYXQyKTsKLWV4dGVybiBmbG9hdDMgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgbWF4KGZsb2F0MywgZmxvYXQzKTsKLWV4dGVybiBmbG9hdDQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgbWF4KGZsb2F0NCwgZmxvYXQ0KTsKLWV4dGVybiBmbG9hdDggX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgbWF4KGZsb2F0OCwgZmxvYXQ4KTsKLWV4dGVybiBmbG9hdDE2IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIG1heChmbG9hdDE2LCBmbG9hdDE2KTsKLQotZXh0ZXJuIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIG1pbihmbG9hdCwgZmxvYXQpOwotZXh0ZXJuIGZsb2F0MiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBtaW4oZmxvYXQyLCBmbG9hdDIpOwotZXh0ZXJuIGZsb2F0MyBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBtaW4oZmxvYXQzLCBmbG9hdDMpOwotZXh0ZXJuIGZsb2F0NCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBtaW4oZmxvYXQ0LCBmbG9hdDQpOwotZXh0ZXJuIGZsb2F0OCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBtaW4oZmxvYXQ4LCBmbG9hdDgpOwotZXh0ZXJuIGZsb2F0MTYgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgbWluKGZsb2F0MTYsIGZsb2F0MTYpOwotCi1leHRlcm4gZmxvYXQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgbWl4KGZsb2F0LCBmbG9hdCwgZmxvYXQpOwotZXh0ZXJuIGZsb2F0MiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBtaXgoZmxvYXQyLCBmbG9hdDIsIGZsb2F0Mik7Ci1leHRlcm4gZmxvYXQzIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIG1peChmbG9hdDMsIGZsb2F0MywgZmxvYXQzKTsKLWV4dGVybiBmbG9hdDQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgbWl4KGZsb2F0NCwgZmxvYXQ0LCBmbG9hdDQpOwotZXh0ZXJuIGZsb2F0OCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBtaXgoZmxvYXQ4LCBmbG9hdDgsIGZsb2F0OCk7Ci1leHRlcm4gZmxvYXQxNiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBtaXgoZmxvYXQxNiwgZmxvYXQxNiwgZmxvYXQxNik7Ci1leHRlcm4gZmxvYXQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgbWl4KGZsb2F0LCBmbG9hdCwgZmxvYXQpOwotZXh0ZXJuIGZsb2F0MiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBtaXgoZmxvYXQyLCBmbG9hdDIsIGZsb2F0KTsKLWV4dGVybiBmbG9hdDMgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgbWl4KGZsb2F0MywgZmxvYXQzLCBmbG9hdCk7Ci1leHRlcm4gZmxvYXQ0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIG1peChmbG9hdDQsIGZsb2F0NCwgZmxvYXQpOwotZXh0ZXJuIGZsb2F0OCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBtaXgoZmxvYXQ4LCBmbG9hdDgsIGZsb2F0KTsKLWV4dGVybiBmbG9hdDE2IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIG1peChmbG9hdDE2LCBmbG9hdDE2LCBmbG9hdCk7Ci0KLWV4dGVybiBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBwb3coZmxvYXQsIGZsb2F0KTsKLWV4dGVybiBmbG9hdDIgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgcG93KGZsb2F0MiwgZmxvYXQyKTsKLWV4dGVybiBmbG9hdDMgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgcG93KGZsb2F0MywgZmxvYXQzKTsKLWV4dGVybiBmbG9hdDQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgcG93KGZsb2F0NCwgZmxvYXQ0KTsKLWV4dGVybiBmbG9hdDggX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgcG93KGZsb2F0OCwgZmxvYXQ4KTsKLWV4dGVybiBmbG9hdDE2IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIHBvdyhmbG9hdDE2LCBmbG9hdDE2KTsKLQotZXh0ZXJuIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIHJhZGlhbnMoZmxvYXQpOwotZXh0ZXJuIGZsb2F0MiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSByYWRpYW5zKGZsb2F0Mik7Ci1leHRlcm4gZmxvYXQzIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIHJhZGlhbnMoZmxvYXQzKTsKLWV4dGVybiBmbG9hdDQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgcmFkaWFucyhmbG9hdDQpOwotZXh0ZXJuIGZsb2F0OCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSByYWRpYW5zKGZsb2F0OCk7Ci1leHRlcm4gZmxvYXQxNiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSByYWRpYW5zKGZsb2F0MTYpOwotCi1leHRlcm4gZmxvYXQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgcmludChmbG9hdCk7Ci1leHRlcm4gZmxvYXQyIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIHJpbnQoZmxvYXQyKTsKLWV4dGVybiBmbG9hdDMgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgcmludChmbG9hdDMpOwotZXh0ZXJuIGZsb2F0NCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSByaW50KGZsb2F0NCk7Ci1leHRlcm4gZmxvYXQ4IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIHJpbnQoZmxvYXQ4KTsKLWV4dGVybiBmbG9hdDE2IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIHJpbnQoZmxvYXQxNik7Ci0KLWV4dGVybiBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSByb3VuZChmbG9hdCk7Ci1leHRlcm4gZmxvYXQyIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIHJvdW5kKGZsb2F0Mik7Ci1leHRlcm4gZmxvYXQzIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIHJvdW5kKGZsb2F0Myk7Ci1leHRlcm4gZmxvYXQ0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIHJvdW5kKGZsb2F0NCk7Ci1leHRlcm4gZmxvYXQ4IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIHJvdW5kKGZsb2F0OCk7Ci1leHRlcm4gZmxvYXQxNiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSByb3VuZChmbG9hdDE2KTsKLQotZXh0ZXJuIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIHJzcXJ0KGZsb2F0KTsKLWV4dGVybiBmbG9hdDIgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgcnNxcnQoZmxvYXQyKTsKLWV4dGVybiBmbG9hdDMgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgcnNxcnQoZmxvYXQzKTsKLWV4dGVybiBmbG9hdDQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgcnNxcnQoZmxvYXQ0KTsKLWV4dGVybiBmbG9hdDggX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgcnNxcnQoZmxvYXQ4KTsKLWV4dGVybiBmbG9hdDE2IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIHJzcXJ0KGZsb2F0MTYpOwotCi1leHRlcm4gZmxvYXQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgc2lnbihmbG9hdCk7Ci1leHRlcm4gZmxvYXQyIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIHNpZ24oZmxvYXQyKTsKLWV4dGVybiBmbG9hdDMgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgc2lnbihmbG9hdDMpOwotZXh0ZXJuIGZsb2F0NCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBzaWduKGZsb2F0NCk7Ci1leHRlcm4gZmxvYXQ4IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIHNpZ24oZmxvYXQ4KTsKLWV4dGVybiBmbG9hdDE2IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIHNpZ24oZmxvYXQxNik7Ci0KLWV4dGVybiBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBzaW4oZmxvYXQpOwotZXh0ZXJuIGZsb2F0MiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBzaW4oZmxvYXQyKTsKLWV4dGVybiBmbG9hdDMgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgc2luKGZsb2F0Myk7Ci1leHRlcm4gZmxvYXQ0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIHNpbihmbG9hdDQpOwotZXh0ZXJuIGZsb2F0OCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBzaW4oZmxvYXQ4KTsKLWV4dGVybiBmbG9hdDE2IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIHNpbihmbG9hdDE2KTsKLQotZXh0ZXJuIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIHNxcnQoZmxvYXQpOwotZXh0ZXJuIGZsb2F0MiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBzcXJ0KGZsb2F0Mik7Ci1leHRlcm4gZmxvYXQzIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIHNxcnQoZmxvYXQzKTsKLWV4dGVybiBmbG9hdDQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgc3FydChmbG9hdDQpOwotZXh0ZXJuIGZsb2F0OCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBzcXJ0KGZsb2F0OCk7Ci1leHRlcm4gZmxvYXQxNiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBzcXJ0KGZsb2F0MTYpOwotCi1leHRlcm4gZmxvYXQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgdGFuKGZsb2F0KTsKLWV4dGVybiBmbG9hdDIgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgdGFuKGZsb2F0Mik7Ci1leHRlcm4gZmxvYXQzIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIHRhbihmbG9hdDMpOwotZXh0ZXJuIGZsb2F0NCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSB0YW4oZmxvYXQ0KTsKLWV4dGVybiBmbG9hdDggX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgdGFuKGZsb2F0OCk7Ci1leHRlcm4gZmxvYXQxNiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSB0YW4oZmxvYXQxNik7Ci0KLWV4dGVybiBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSB0cnVuYyhmbG9hdCk7Ci1leHRlcm4gZmxvYXQyIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIHRydW5jKGZsb2F0Mik7Ci1leHRlcm4gZmxvYXQzIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIHRydW5jKGZsb2F0Myk7Ci1leHRlcm4gZmxvYXQ0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIHRydW5jKGZsb2F0NCk7Ci1leHRlcm4gZmxvYXQ4IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIHRydW5jKGZsb2F0OCk7Ci1leHRlcm4gZmxvYXQxNiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSB0cnVuYyhmbG9hdDE2KTsKK2V4dGVybiBib29sIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNJc09iamVjdChyc19lbGVtZW50KTsKK2V4dGVybiBib29sIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNJc09iamVjdChyc190eXBlKTsKK2V4dGVybiBib29sIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNJc09iamVjdChyc19hbGxvY2F0aW9uKTsKK2V4dGVybiBib29sIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNJc09iamVjdChyc19zYW1wbGVyKTsKK2V4dGVybiBib29sIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNJc09iamVjdChyc19zY3JpcHQpOworZXh0ZXJuIGJvb2wgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc0lzT2JqZWN0KHJzX21lc2gpOworZXh0ZXJuIGJvb2wgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc0lzT2JqZWN0KHJzX3Byb2dyYW1fZnJhZ21lbnQpOworZXh0ZXJuIGJvb2wgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc0lzT2JqZWN0KHJzX3Byb2dyYW1fdmVydGV4KTsKK2V4dGVybiBib29sIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNJc09iamVjdChyc19wcm9ncmFtX3Jhc3Rlcik7CitleHRlcm4gYm9vbCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzSXNPYmplY3QocnNfcHJvZ3JhbV9zdG9yZSk7CitleHRlcm4gYm9vbCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzSXNPYmplY3QocnNfZm9udCk7CiAKIAogCisvLyBBbGxvY2F0aW9ucworCisvLyBSZXR1cm4gdGhlIHJzX2FsbG9jYXRpb24gYXNzb2NpYXRlZCB3aXRoIGEgYm91bmQgZGF0YQorLy8gcG9pbnRlci4KK2V4dGVybiByc19hbGxvY2F0aW9uIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNHZXRBbGxvY2F0aW9uKGNvbnN0IHZvaWQgKik7CisKKy8vIE1hcmsgdGhlIGFsbG9jYXRpb24gZGlydHkgYW5kIG5vdGlmeSB0aG9zZSB1c2luZyBpdAorZXh0ZXJuIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc0FsbG9jYXRpb25NYXJrRGlydHkocnNfYWxsb2NhdGlvbik7CisKKy8vIFJldHVybiB0aGUgZGltZW5zaW9ucyBhc3NvY2lhdGVkIHdpdGggYW4gYWxsb2NhdGlvbi4KK2V4dGVybiB1aW50MzJfdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzQWxsb2NhdGlvbkdldERpbVgocnNfYWxsb2NhdGlvbik7CitleHRlcm4gdWludDMyX3QgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc0FsbG9jYXRpb25HZXREaW1ZKHJzX2FsbG9jYXRpb24pOworZXh0ZXJuIHVpbnQzMl90IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNBbGxvY2F0aW9uR2V0RGltWihyc19hbGxvY2F0aW9uKTsKK2V4dGVybiB1aW50MzJfdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzQWxsb2NhdGlvbkdldERpbUxPRChyc19hbGxvY2F0aW9uKTsKK2V4dGVybiB1aW50MzJfdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzQWxsb2NhdGlvbkdldERpbUZhY2VzKHJzX2FsbG9jYXRpb24pOworCisvLyBFeHRyYWN0IGEgc2luZ2xlIGVsZW1lbnQgZnJvbSBhbiBhbGxvY2F0aW9uLgorZXh0ZXJuIGNvbnN0IHZvaWQgKiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzR2V0RWxlbWVudEF0KHJzX2FsbG9jYXRpb24sIHVpbnQzMl90IHgpOworZXh0ZXJuIGNvbnN0IHZvaWQgKiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzR2V0RWxlbWVudEF0KHJzX2FsbG9jYXRpb24sIHVpbnQzMl90IHgsIHVpbnQzMl90IHkpOworZXh0ZXJuIGNvbnN0IHZvaWQgKiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzR2V0RWxlbWVudEF0KHJzX2FsbG9jYXRpb24sIHVpbnQzMl90IHgsIHVpbnQzMl90IHksIHVpbnQzMl90IHopOworCisvLyBSZXR1cm4gYSByYW5kb20gdmFsdWUgYmV0d2VlbiAwIChvciBtaW5fdmFsdWUpIGFuZCBtYXhfbWFsdWUuCitleHRlcm4gaW50IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNSYW5kKGludCBtYXhfdmFsdWUpOworZXh0ZXJuIGludCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzUmFuZChpbnQgbWluX3ZhbHVlLCBpbnQgbWF4X3ZhbHVlKTsKK2V4dGVybiBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzUmFuZChmbG9hdCBtYXhfdmFsdWUpOworZXh0ZXJuIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNSYW5kKGZsb2F0IG1pbl92YWx1ZSwgZmxvYXQgbWF4X3ZhbHVlKTsKKworLy8gcmV0dXJuIHRoZSBmcmFjdGlvbmFsIHBhcnQgb2YgYSBmbG9hdAorLy8gbWluKHYgLSAoKGludClmbG9vcih2KSksIDB4MS5mZmZmZmVwLTFmKTsKK2V4dGVybiBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzRnJhYyhmbG9hdCk7CisKKy8vIHRpbWUKK2V4dGVybiBpbnQzMl90IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNTZWNvbmQodm9pZCk7CitleHRlcm4gaW50MzJfdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzTWludXRlKHZvaWQpOworZXh0ZXJuIGludDMyX3QgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc0hvdXIodm9pZCk7CitleHRlcm4gaW50MzJfdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzRGF5KHZvaWQpOworZXh0ZXJuIGludDMyX3QgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc01vbnRoKHZvaWQpOworZXh0ZXJuIGludDMyX3QgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc1llYXIodm9pZCk7CisKKy8vIFJldHVybiB0aGUgY3VycmVudCBzeXN0ZW0gY2xvY2sgaW4gbWlsbGlzZWNvbmRzCitleHRlcm4gaW50NjRfdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzVXB0aW1lTWlsbGlzKHZvaWQpOworCisvLyBSZXR1cm4gdGhlIGN1cnJlbnQgc3lzdGVtIGNsb2NrIGluIG5hbm9zZWNvbmRzCitleHRlcm4gaW50NjRfdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzVXB0aW1lTmFub3Modm9pZCk7CisKKy8vIFJldHVybiB0aGUgdGltZSBpbiBzZWNvbmRzIHNpbmNlIGZ1bmN0aW9uIHdhcyBsYXN0IGNhbGxlZCBpbiB0aGlzIHNjcmlwdC4KK2V4dGVybiBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzR2V0RHQodm9pZCk7CisKKy8vIFNlbmQgYSBtZXNzYWdlIGJhY2sgdG8gdGhlIGNsaWVudC4gIFdpbGwgbm90IGJsb2NrIGFuZCByZXR1cm5zIHRydWUKKy8vIGlmIHRoZSBtZXNzYWdlIHdhcyBzZW5kYWJsZSBhbmQgZmFsc2UgaWYgdGhlIGZpZm8gd2FzIGZ1bGwuCisvLyBBIG1lc3NhZ2UgSUQgaXMgcmVxdWlyZWQuICBEYXRhIHBheWxvYWQgaXMgb3B0aW9uYWwuCitleHRlcm4gYm9vbCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzU2VuZFRvQ2xpZW50KGludCBjbWRJRCk7CitleHRlcm4gYm9vbCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzU2VuZFRvQ2xpZW50KGludCBjbWRJRCwgY29uc3Qgdm9pZCAqZGF0YSwgdWludCBsZW4pOworCisvLyBTZW5kIGEgbWVzc2FnZSBiYWNrIHRvIHRoZSBjbGllbnQsIGJsb2NraW5nIHVudGlsIHRoZSBtZXNzYWdlIGlzIHF1ZXVlZC4KKy8vIEEgbWVzc2FnZSBJRCBpcyByZXF1aXJlZC4gIERhdGEgcGF5bG9hZCBpcyBvcHRpb25hbC4KK2V4dGVybiB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNTZW5kVG9DbGllbnRCbG9ja2luZyhpbnQgY21kSUQpOworZXh0ZXJuIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc1NlbmRUb0NsaWVudEJsb2NraW5nKGludCBjbWRJRCwgY29uc3Qgdm9pZCAqZGF0YSwgdWludCBsZW4pOwogCiAKKy8vIFNjcmlwdCB0byBTY3JpcHQKK2VudW0gcnNfZm9yX2VhY2hfc3RyYXRlZ3kgeworICAgIFJTX0ZPUl9FQUNIX1NUUkFURUdZX1NFUklBTCwKKyAgICBSU19GT1JfRUFDSF9TVFJBVEVHWV9ET05UX0NBUkUsCisgICAgUlNfRk9SX0VBQ0hfU1RSQVRFR1lfRFNUX0xJTkVBUiwKKyAgICBSU19GT1JfRUFDSF9TVFJBVEVHWV9USUxFX1NNQUxMLAorICAgIFJTX0ZPUl9FQUNIX1NUUkFURUdZX1RJTEVfTUVESVVNLAorICAgIFJTX0ZPUl9FQUNIX1NUUkFURUdZX1RJTEVfTEFSR0UKK307CiAKLS8vIEludCBvcHMKK3R5cGVkZWYgc3RydWN0IHJzX3NjcmlwdF9jYWxsIHsKKyAgICBlbnVtIHJzX2Zvcl9lYWNoX3N0cmF0ZWd5IHN0cmF0ZWd5OworICAgIHVpbnQzMl90IHhTdGFydDsKKyAgICB1aW50MzJfdCB4RW5kOworICAgIHVpbnQzMl90IHlTdGFydDsKKyAgICB1aW50MzJfdCB5RW5kOworICAgIHVpbnQzMl90IHpTdGFydDsKKyAgICB1aW50MzJfdCB6RW5kOworICAgIHVpbnQzMl90IGFycmF5U3RhcnQ7CisgICAgdWludDMyX3QgYXJyYXlFbmQ7Cit9IHJzX3NjcmlwdF9jYWxsX3Q7CiAKLWV4dGVybiBpbnQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgYWJzKGludCk7Ci1leHRlcm4gaW50MiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBhYnMoaW50Mik7Ci1leHRlcm4gaW50MyBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBhYnMoaW50Myk7Ci1leHRlcm4gaW50NCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBhYnMoaW50NCk7Ci1leHRlcm4gaW50OCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBhYnMoaW50OCk7Ci1leHRlcm4gaW50MTYgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgYWJzKGludDE2KTsKK2V4dGVybiB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNGb3JFYWNoKHJzX3NjcmlwdCBzY3JpcHQsIHJzX2FsbG9jYXRpb24gaW5wdXQsCisgICAgICAgICAgICAgIHJzX2FsbG9jYXRpb24gb3V0cHV0LCBjb25zdCB2b2lkICogdXNyRGF0YSk7CiAKK2V4dGVybiB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNGb3JFYWNoKHJzX3NjcmlwdCBzY3JpcHQsIHJzX2FsbG9jYXRpb24gaW5wdXQsCisgICAgICAgICAgICAgIHJzX2FsbG9jYXRpb24gb3V0cHV0LCBjb25zdCB2b2lkICogdXNyRGF0YSwKKyAgICAgICAgICAgICAgY29uc3QgcnNfc2NyaXB0X2NhbGxfdCAqKTsKIAotCi0vKgotZXh0ZXJuIGZsb2F0IG1vZGYoZmxvYXQsIGZsb2F0KTsKLWV4dGVybiBmbG9hdCByYW5kZihmbG9hdCk7Ci1leHRlcm4gZmxvYXQgcmFuZGYyKGZsb2F0LCBmbG9hdCk7Ci1leHRlcm4gZmxvYXQgZnJhY2YoZmxvYXQpOwotZXh0ZXJuIGZsb2F0IGxlcnBmKGZsb2F0LCBmbG9hdCwgZmxvYXQpOwotZXh0ZXJuIGZsb2F0IG1hcGYoZmxvYXQsIGZsb2F0LCBmbG9hdCwgZmxvYXQsIGZsb2F0KTsKLSovCi0KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGlicy9ycy9zY3JpcHRjL3JzX3R5cGVzLnJzaCBiL2xpYnMvcnMvc2NyaXB0Yy9yc190eXBlcy5yc2gKaW5kZXggNDE5OGE3NC4uZGQ0Mjk3MiAxMDA2NDQKLS0tIGEvbGlicy9ycy9zY3JpcHRjL3JzX3R5cGVzLnJzaAorKysgYi9saWJzL3JzL3NjcmlwdGMvcnNfdHlwZXMucnNoCkBAIC0yLDcwICsyLDczIEBACiB0eXBlZGVmIGNoYXIgaW50OF90OwogdHlwZWRlZiBzaG9ydCBpbnQxNl90OwogdHlwZWRlZiBpbnQgaW50MzJfdDsKLS8vdHlwZWRlZiBsb25nIGludDY0X3Q7Cit0eXBlZGVmIGxvbmcgbG9uZyBpbnQ2NF90OwogCiB0eXBlZGVmIHVuc2lnbmVkIGNoYXIgdWludDhfdDsKIHR5cGVkZWYgdW5zaWduZWQgc2hvcnQgdWludDE2X3Q7CiB0eXBlZGVmIHVuc2lnbmVkIGludCB1aW50MzJfdDsKLS8vdHlwZWRlZiBsb25nIHVpbnQ2NF90OwordHlwZWRlZiB1bnNpZ25lZCBsb25nIGxvbmcgdWludDY0X3Q7CiAKIHR5cGVkZWYgdWludDhfdCB1Y2hhcjsKIHR5cGVkZWYgdWludDE2X3QgdXNob3J0OwogdHlwZWRlZiB1aW50MzJfdCB1aW50OwotLy90eXBlZGVmIHVpbnQ2NF90IHVsb25nOwordHlwZWRlZiB1aW50NjRfdCB1bG9uZzsKIAotdHlwZWRlZiBpbnQgcnNfZWxlbWVudDsKLXR5cGVkZWYgaW50IHJzX3R5cGU7Ci10eXBlZGVmIGludCByc19hbGxvY2F0aW9uOwotdHlwZWRlZiBpbnQgcnNfc2FtcGxlcjsKLXR5cGVkZWYgaW50IHJzX3NjcmlwdDsKLXR5cGVkZWYgaW50IHJzX21lc2g7Ci10eXBlZGVmIGludCByc19wcm9ncmFtX2ZyYWdtZW50OwotdHlwZWRlZiBpbnQgcnNfcHJvZ3JhbV92ZXJ0ZXg7Ci10eXBlZGVmIGludCByc19wcm9ncmFtX3Jhc3RlcjsKLXR5cGVkZWYgaW50IHJzX3Byb2dyYW1fc3RvcmU7Cit0eXBlZGVmIHN0cnVjdCB7IGNvbnN0IGludCogY29uc3QgcDsgfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQsIGFsaWduZWQoNCkpKSByc19lbGVtZW50OwordHlwZWRlZiBzdHJ1Y3QgeyBjb25zdCBpbnQqIGNvbnN0IHA7IH0gX19hdHRyaWJ1dGVfXygocGFja2VkLCBhbGlnbmVkKDQpKSkgcnNfdHlwZTsKK3R5cGVkZWYgc3RydWN0IHsgY29uc3QgaW50KiBjb25zdCBwOyB9IF9fYXR0cmlidXRlX18oKHBhY2tlZCwgYWxpZ25lZCg0KSkpIHJzX2FsbG9jYXRpb247Cit0eXBlZGVmIHN0cnVjdCB7IGNvbnN0IGludCogY29uc3QgcDsgfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQsIGFsaWduZWQoNCkpKSByc19zYW1wbGVyOwordHlwZWRlZiBzdHJ1Y3QgeyBjb25zdCBpbnQqIGNvbnN0IHA7IH0gX19hdHRyaWJ1dGVfXygocGFja2VkLCBhbGlnbmVkKDQpKSkgcnNfc2NyaXB0OwordHlwZWRlZiBzdHJ1Y3QgeyBjb25zdCBpbnQqIGNvbnN0IHA7IH0gX19hdHRyaWJ1dGVfXygocGFja2VkLCBhbGlnbmVkKDQpKSkgcnNfbWVzaDsKK3R5cGVkZWYgc3RydWN0IHsgY29uc3QgaW50KiBjb25zdCBwOyB9IF9fYXR0cmlidXRlX18oKHBhY2tlZCwgYWxpZ25lZCg0KSkpIHJzX3Byb2dyYW1fZnJhZ21lbnQ7Cit0eXBlZGVmIHN0cnVjdCB7IGNvbnN0IGludCogY29uc3QgcDsgfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQsIGFsaWduZWQoNCkpKSByc19wcm9ncmFtX3ZlcnRleDsKK3R5cGVkZWYgc3RydWN0IHsgY29uc3QgaW50KiBjb25zdCBwOyB9IF9fYXR0cmlidXRlX18oKHBhY2tlZCwgYWxpZ25lZCg0KSkpIHJzX3Byb2dyYW1fcmFzdGVyOwordHlwZWRlZiBzdHJ1Y3QgeyBjb25zdCBpbnQqIGNvbnN0IHA7IH0gX19hdHRyaWJ1dGVfXygocGFja2VkLCBhbGlnbmVkKDQpKSkgcnNfcHJvZ3JhbV9zdG9yZTsKK3R5cGVkZWYgc3RydWN0IHsgY29uc3QgaW50KiBjb25zdCBwOyB9IF9fYXR0cmlidXRlX18oKHBhY2tlZCwgYWxpZ25lZCg0KSkpIHJzX2ZvbnQ7CisKIAogdHlwZWRlZiBmbG9hdCBmbG9hdDIgX19hdHRyaWJ1dGVfXygoZXh0X3ZlY3Rvcl90eXBlKDIpKSk7CiB0eXBlZGVmIGZsb2F0IGZsb2F0MyBfX2F0dHJpYnV0ZV9fKChleHRfdmVjdG9yX3R5cGUoMykpKTsKIHR5cGVkZWYgZmxvYXQgZmxvYXQ0IF9fYXR0cmlidXRlX18oKGV4dF92ZWN0b3JfdHlwZSg0KSkpOwotdHlwZWRlZiBmbG9hdCBmbG9hdDggX19hdHRyaWJ1dGVfXygoZXh0X3ZlY3Rvcl90eXBlKDgpKSk7Ci10eXBlZGVmIGZsb2F0IGZsb2F0MTYgX19hdHRyaWJ1dGVfXygoZXh0X3ZlY3Rvcl90eXBlKDE2KSkpOwogCiB0eXBlZGVmIHVjaGFyIHVjaGFyMiBfX2F0dHJpYnV0ZV9fKChleHRfdmVjdG9yX3R5cGUoMikpKTsKIHR5cGVkZWYgdWNoYXIgdWNoYXIzIF9fYXR0cmlidXRlX18oKGV4dF92ZWN0b3JfdHlwZSgzKSkpOwogdHlwZWRlZiB1Y2hhciB1Y2hhcjQgX19hdHRyaWJ1dGVfXygoZXh0X3ZlY3Rvcl90eXBlKDQpKSk7Ci10eXBlZGVmIHVjaGFyIHVjaGFyOCBfX2F0dHJpYnV0ZV9fKChleHRfdmVjdG9yX3R5cGUoOCkpKTsKLXR5cGVkZWYgdWNoYXIgdWNoYXIxNiBfX2F0dHJpYnV0ZV9fKChleHRfdmVjdG9yX3R5cGUoMTYpKSk7CiAKIHR5cGVkZWYgdXNob3J0IHVzaG9ydDIgX19hdHRyaWJ1dGVfXygoZXh0X3ZlY3Rvcl90eXBlKDIpKSk7CiB0eXBlZGVmIHVzaG9ydCB1c2hvcnQzIF9fYXR0cmlidXRlX18oKGV4dF92ZWN0b3JfdHlwZSgzKSkpOwogdHlwZWRlZiB1c2hvcnQgdXNob3J0NCBfX2F0dHJpYnV0ZV9fKChleHRfdmVjdG9yX3R5cGUoNCkpKTsKLXR5cGVkZWYgdXNob3J0IHVzaG9ydDggX19hdHRyaWJ1dGVfXygoZXh0X3ZlY3Rvcl90eXBlKDgpKSk7Ci10eXBlZGVmIHVzaG9ydCB1c2hvcnQxNiBfX2F0dHJpYnV0ZV9fKChleHRfdmVjdG9yX3R5cGUoMTYpKSk7CiAKIHR5cGVkZWYgdWludCB1aW50MiBfX2F0dHJpYnV0ZV9fKChleHRfdmVjdG9yX3R5cGUoMikpKTsKIHR5cGVkZWYgdWludCB1aW50MyBfX2F0dHJpYnV0ZV9fKChleHRfdmVjdG9yX3R5cGUoMykpKTsKIHR5cGVkZWYgdWludCB1aW50NCBfX2F0dHJpYnV0ZV9fKChleHRfdmVjdG9yX3R5cGUoNCkpKTsKLXR5cGVkZWYgdWludCB1aW50OCBfX2F0dHJpYnV0ZV9fKChleHRfdmVjdG9yX3R5cGUoOCkpKTsKLXR5cGVkZWYgdWludCB1aW50MTYgX19hdHRyaWJ1dGVfXygoZXh0X3ZlY3Rvcl90eXBlKDE2KSkpOwogCiB0eXBlZGVmIGNoYXIgY2hhcjIgX19hdHRyaWJ1dGVfXygoZXh0X3ZlY3Rvcl90eXBlKDIpKSk7CiB0eXBlZGVmIGNoYXIgY2hhcjMgX19hdHRyaWJ1dGVfXygoZXh0X3ZlY3Rvcl90eXBlKDMpKSk7CiB0eXBlZGVmIGNoYXIgY2hhcjQgX19hdHRyaWJ1dGVfXygoZXh0X3ZlY3Rvcl90eXBlKDQpKSk7Ci10eXBlZGVmIGNoYXIgY2hhcjggX19hdHRyaWJ1dGVfXygoZXh0X3ZlY3Rvcl90eXBlKDgpKSk7Ci10eXBlZGVmIGNoYXIgY2hhcjE2IF9fYXR0cmlidXRlX18oKGV4dF92ZWN0b3JfdHlwZSgxNikpKTsKIAogdHlwZWRlZiBzaG9ydCBzaG9ydDIgX19hdHRyaWJ1dGVfXygoZXh0X3ZlY3Rvcl90eXBlKDIpKSk7CiB0eXBlZGVmIHNob3J0IHNob3J0MyBfX2F0dHJpYnV0ZV9fKChleHRfdmVjdG9yX3R5cGUoMykpKTsKIHR5cGVkZWYgc2hvcnQgc2hvcnQ0IF9fYXR0cmlidXRlX18oKGV4dF92ZWN0b3JfdHlwZSg0KSkpOwotdHlwZWRlZiBzaG9ydCBzaG9ydDggX19hdHRyaWJ1dGVfXygoZXh0X3ZlY3Rvcl90eXBlKDgpKSk7Ci10eXBlZGVmIHNob3J0IHNob3J0MTYgX19hdHRyaWJ1dGVfXygoZXh0X3ZlY3Rvcl90eXBlKDE2KSkpOwogCiB0eXBlZGVmIGludCBpbnQyIF9fYXR0cmlidXRlX18oKGV4dF92ZWN0b3JfdHlwZSgyKSkpOwogdHlwZWRlZiBpbnQgaW50MyBfX2F0dHJpYnV0ZV9fKChleHRfdmVjdG9yX3R5cGUoMykpKTsKIHR5cGVkZWYgaW50IGludDQgX19hdHRyaWJ1dGVfXygoZXh0X3ZlY3Rvcl90eXBlKDQpKSk7Ci10eXBlZGVmIGludCBpbnQ4IF9fYXR0cmlidXRlX18oKGV4dF92ZWN0b3JfdHlwZSg4KSkpOwotdHlwZWRlZiBpbnQgaW50MTYgX19hdHRyaWJ1dGVfXygoZXh0X3ZlY3Rvcl90eXBlKDE2KSkpOwogCiAKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBmbG9hdCBtWzE2XTsKK30gcnNfbWF0cml4NHg0OworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgZmxvYXQgbVs5XTsKK30gcnNfbWF0cml4M3gzOworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgZmxvYXQgbVs0XTsKK30gcnNfbWF0cml4MngyOworCit0eXBlZGVmIGZsb2F0NCByc19xdWF0ZXJuaW9uOworCisjZGVmaW5lIFJTX1BBQ0tFRCBfX2F0dHJpYnV0ZV9fKChwYWNrZWQsIGFsaWduZWQoNCkpKQogCmRpZmYgLS1naXQgYS9saWJzL3N1cmZhY2VmbGluZ2VyX2NsaWVudC9TaGFyZWRCdWZmZXJTdGFjay5jcHAgYi9saWJzL3N1cmZhY2VmbGluZ2VyX2NsaWVudC9TaGFyZWRCdWZmZXJTdGFjay5jcHAKaW5kZXggMzhiMmZhZS4uYTQzYjQ0MDIgMTAwNjQ0Ci0tLSBhL2xpYnMvc3VyZmFjZWZsaW5nZXJfY2xpZW50L1NoYXJlZEJ1ZmZlclN0YWNrLmNwcAorKysgYi9saWJzL3N1cmZhY2VmbGluZ2VyX2NsaWVudC9TaGFyZWRCdWZmZXJTdGFjay5jcHAKQEAgLTM3NiwxMSArMzc2LDYgQEAKIHsKICAgICBTaGFyZWRCdWZmZXJTdGFjayYgc3RhY2soICptU2hhcmVkU3RhY2sgKTsKIAotICAgIGlmIChzdGFjay5oZWFkID09IHRhaWwgJiYgc3RhY2suYXZhaWxhYmxlID09IG1OdW1CdWZmZXJzKSB7Ci0gICAgICAgIExPR1coImRlcXVldWU6IHRhaWw9JWQsIGhlYWQ9JWQsIGF2YWlsPSVkLCBxdWV1ZWQ9JWQiLAotICAgICAgICAgICAgICAgIHRhaWwsIHN0YWNrLmhlYWQsIHN0YWNrLmF2YWlsYWJsZSwgc3RhY2sucXVldWVkKTsKLSAgICB9Ci0KICAgICBSV0xvY2s6OkF1dG9STG9jayBfcmQobUxvY2spOwogCiAgICAgY29uc3QgbnNlY3NfdCBkZXF1ZXVlVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKZGlmZiAtLWdpdCBhL2xpYnMvc3VyZmFjZWZsaW5nZXJfY2xpZW50L1N1cmZhY2UuY3BwIGIvbGlicy9zdXJmYWNlZmxpbmdlcl9jbGllbnQvU3VyZmFjZS5jcHAKaW5kZXggNTYwZWE2Ny4uYzc3ZDQ4ZSAxMDA2NDQKLS0tIGEvbGlicy9zdXJmYWNlZmxpbmdlcl9jbGllbnQvU3VyZmFjZS5jcHAKKysrIGIvbGlicy9zdXJmYWNlZmxpbmdlcl9jbGllbnQvU3VyZmFjZS5jcHAKQEAgLTM2NCw2ICszNjQsMTMgQEAKICAgICAgICAgaGVpZ2h0ICAgPSBzdXJmYWNlLT5tSGVpZ2h0OwogICAgICAgICBmb3JtYXQgICA9IHN1cmZhY2UtPm1Gb3JtYXQ7CiAgICAgICAgIGZsYWdzICAgID0gc3VyZmFjZS0+bUZsYWdzOworICAgIH0gZWxzZSBpZiAoc3VyZmFjZSAhPSAwICYmIHN1cmZhY2UtPm1TdXJmYWNlICE9IDApIHsKKyAgICAgICAgTE9HVygiUGFyY2VsaW5nIGludmFsaWQgc3VyZmFjZSB3aXRoIG5vbi1OVUxMIElTdXJmYWNlIGFzIE5VTEw6ICIKKyAgICAgICAgICAgICAibVN1cmZhY2UgPSAlcCwgbUlkZW50aXR5ID0gJWQsIG1XaWR0aCA9ICVkLCBtSGVpZ2h0ID0gJWQsICIKKyAgICAgICAgICAgICAibUZvcm1hdCA9ICVkLCBtRmxhZ3MgPSAweCUwOHgsIG1Jbml0Q2hlY2sgPSAlZCIsCisgICAgICAgICAgICAgc3VyZmFjZS0+bVN1cmZhY2UuZ2V0KCksIHN1cmZhY2UtPm1JZGVudGl0eSwgc3VyZmFjZS0+bVdpZHRoLAorICAgICAgICAgICAgIHN1cmZhY2UtPm1IZWlnaHQsIHN1cmZhY2UtPm1Gb3JtYXQsIHN1cmZhY2UtPm1GbGFncywKKyAgICAgICAgICAgICBzdXJmYWNlLT5tSW5pdENoZWNrKTsKICAgICB9CiAgICAgcGFyY2VsLT53cml0ZVN0cm9uZ0JpbmRlcihzdXIhPTAgPyBzdXItPmFzQmluZGVyKCkgOiBOVUxMKTsKICAgICBwYXJjZWwtPndyaXRlSW50MzIoaWRlbnRpdHkpOwpAQCAtNDM3LDYgKzQ0NCw5IEBACiAgICAgICAgICAgICBtU2hhcmVkQnVmZmVyQ2xpZW50ID0gbmV3IFNoYXJlZEJ1ZmZlckNsaWVudCgKICAgICAgICAgICAgICAgICAgICAgbUNsaWVudC5nZXRTaGFyZWRDbGllbnQoKSwgdG9rZW4sIDIsIG1JZGVudGl0eSk7CiAgICAgICAgICAgICBtSW5pdENoZWNrID0gbUNsaWVudC5nZXRTaGFyZWRDbGllbnQoKS0+dmFsaWRhdGUodG9rZW4pOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgTE9HVygiTm90IGluaXRpYWxpemluZyB0aGUgc2hhcmVkIGJ1ZmZlciBjbGllbnQgYmVjYXVzZSB0b2tlbiA9ICVkIiwKKyAgICAgICAgICAgICAgICAgICAgdG9rZW4pOwogICAgICAgICB9CiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvbGlicy91dGlscy9SZXNvdXJjZVR5cGVzLmNwcCBiL2xpYnMvdXRpbHMvUmVzb3VyY2VUeXBlcy5jcHAKaW5kZXggODM0NWNjMy4uOTFlN2RmMyAxMDA2NDQKLS0tIGEvbGlicy91dGlscy9SZXNvdXJjZVR5cGVzLmNwcAorKysgYi9saWJzL3V0aWxzL1Jlc291cmNlVHlwZXMuY3BwCkBAIC0zMTcsNiArMzE3LDEyIEBACiAgICAgICAgICAgICBtU3RyaW5nUG9vbFNpemUgPQogICAgICAgICAgICAgICAgIChtSGVhZGVyLT5oZWFkZXIuc2l6ZS1tSGVhZGVyLT5zdHJpbmdzU3RhcnQpL2NoYXJTaXplOwogICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gY2hlY2sgaW52YXJpYW50OiBzdHlsZXMgc3RhcnRzIGJlZm9yZSBlbmQgb2YgZGF0YQorICAgICAgICAgICAgaWYgKG1IZWFkZXItPnN0eWxlc1N0YXJ0ID49IChtSGVhZGVyLT5oZWFkZXIuc2l6ZS1zaXplb2YodWludDE2X3QpKSkgeworICAgICAgICAgICAgICAgIExPR1coIkJhZCBzdHlsZSBibG9jazogc3R5bGUgYmxvY2sgc3RhcnRzIGF0ICVkIHBhc3QgZGF0YSBzaXplIG9mICVkXG4iLAorICAgICAgICAgICAgICAgICAgICAoaW50KW1IZWFkZXItPnN0eWxlc1N0YXJ0LCAoaW50KW1IZWFkZXItPmhlYWRlci5zaXplKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gKG1FcnJvcj1CQURfVFlQRSk7CisgICAgICAgICAgICB9CiAgICAgICAgICAgICAvLyBjaGVjayBpbnZhcmlhbnQ6IHN0eWxlcyBmb2xsb3cgdGhlIHN0cmluZ3MKICAgICAgICAgICAgIGlmIChtSGVhZGVyLT5zdHlsZXNTdGFydCA8PSBtSGVhZGVyLT5zdHJpbmdzU3RhcnQpIHsKICAgICAgICAgICAgICAgICBMT0dXKCJCYWQgc3R5bGUgYmxvY2s6IHN0eWxlIGJsb2NrIHN0YXJ0cyBhdCAlZCwgYmVmb3JlIHN0cmluZ3MgYXQgJWRcbiIsCkBAIC0xODc4LDYgKzE4ODQsMTIgQEAKICAgICAgICAgb3V0TmFtZS0+dHlwZSA9IGdycC0+YmFzZVBhY2thZ2UtPnR5cGVTdHJpbmdzLnN0cmluZ0F0KHQsICZvdXROYW1lLT50eXBlTGVuKTsKICAgICAgICAgb3V0TmFtZS0+bmFtZSA9IGdycC0+YmFzZVBhY2thZ2UtPmtleVN0cmluZ3Muc3RyaW5nQXQoCiAgICAgICAgICAgICBkdG9obChlbnRyeS0+a2V5LmluZGV4KSwgJm91dE5hbWUtPm5hbWVMZW4pOworCisgICAgICAgIC8vIElmIHdlIGhhdmUgYSBiYWQgaW5kZXggZm9yIHNvbWUgcmVhc29uLCB3ZSBzaG91bGQgYWJvcnQuCisgICAgICAgIGlmIChvdXROYW1lLT50eXBlID09IE5VTEwgfHwgb3V0TmFtZS0+bmFtZSA9PSBOVUxMKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKwogICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CiAKQEAgLTI2MDksNiArMjYyMSwyNCBAQAogICAgICAgICAqb3V0VHlwZSA9ICpkZWZUeXBlOwogICAgIH0KICAgICAqb3V0TmFtZSA9IFN0cmluZzE2KHAsIGVuZC1wKTsKKyAgICBpZigqKm91dFBhY2thZ2UgPT0gMCkgeworICAgICAgICBpZihvdXRFcnJvck1zZykgeworICAgICAgICAgICAgKm91dEVycm9yTXNnID0gIlJlc291cmNlIHBhY2thZ2UgY2Fubm90IGJlIGFuIGVtcHR5IHN0cmluZyI7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBpZigqKm91dFR5cGUgPT0gMCkgeworICAgICAgICBpZihvdXRFcnJvck1zZykgeworICAgICAgICAgICAgKm91dEVycm9yTXNnID0gIlJlc291cmNlIHR5cGUgY2Fubm90IGJlIGFuIGVtcHR5IHN0cmluZyI7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBpZigqKm91dE5hbWUgPT0gMCkgeworICAgICAgICBpZihvdXRFcnJvck1zZykgeworICAgICAgICAgICAgKm91dEVycm9yTXNnID0gIlJlc291cmNlIGlkIGNhbm5vdCBiZSBhbiBlbXB0eSBzdHJpbmciOworICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CiAgICAgcmV0dXJuIHRydWU7CiB9CiAKQEAgLTQxMjcsMTMgKzQxNTcsMTYgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgKDB4MDBmZjAwMDAgJiAoKHR5cGVJbmRleCsxKTw8MTYpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAoMHgwMDAwZmZmZiAmIChlbnRyeUluZGV4KSk7CiAgICAgICAgICAgICAgICAgICAgICAgICByZXNvdXJjZV9uYW1lIHJlc05hbWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLT5nZXRSZXNvdXJjZU5hbWUocmVzSUQsICZyZXNOYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiICAgICAgc3BlYyByZXNvdXJjZSAweCUwOHggJXM6JXMvJXM6IGZsYWdzPTB4JTA4eFxuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNJRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDSEFSMTZfVE9fQ1NUUihyZXNOYW1lLnBhY2thZ2UsIHJlc05hbWUucGFja2FnZUxlbiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0hBUjE2X1RPX0NTVFIocmVzTmFtZS50eXBlLCByZXNOYW1lLnR5cGVMZW4pLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENIQVIxNl9UT19DU1RSKHJlc05hbWUubmFtZSwgcmVzTmFtZS5uYW1lTGVuKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkdG9obCh0eXBlQ29uZmlncy0+dHlwZVNwZWNGbGFnc1tlbnRyeUluZGV4XSkpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMtPmdldFJlc291cmNlTmFtZShyZXNJRCwgJnJlc05hbWUpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCIgICAgICBzcGVjIHJlc291cmNlIDB4JTA4eCAlczolcy8lczogZmxhZ3M9MHglMDh4XG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0hBUjE2X1RPX0NTVFIocmVzTmFtZS5wYWNrYWdlLCByZXNOYW1lLnBhY2thZ2VMZW4pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDSEFSMTZfVE9fQ1NUUihyZXNOYW1lLnR5cGUsIHJlc05hbWUudHlwZUxlbiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENIQVIxNl9UT19DU1RSKHJlc05hbWUubmFtZSwgcmVzTmFtZS5uYW1lTGVuKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHRvaGwodHlwZUNvbmZpZ3MtPnR5cGVTcGVjRmxhZ3NbZW50cnlJbmRleF0pKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCIgICAgICBJTlZBTElEIFRZUEUgQ09ORklHIEZPUiBSRVNPVVJDRSAweCUwOHhcbiIsIHJlc0lEKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBmb3IgKHNpemVfdCBjb25maWdJbmRleD0wOyBjb25maWdJbmRleDxOVEM7IGNvbmZpZ0luZGV4KyspIHsKQEAgLTQzNDAsMTEgKzQzNzMsMTQgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgKDB4MDBmZjAwMDAgJiAoKHR5cGVJbmRleCsxKTw8MTYpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAoMHgwMDAwZmZmZiAmIChlbnRyeUluZGV4KSk7CiAgICAgICAgICAgICAgICAgICAgICAgICByZXNvdXJjZV9uYW1lIHJlc05hbWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLT5nZXRSZXNvdXJjZU5hbWUocmVzSUQsICZyZXNOYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiICAgICAgICByZXNvdXJjZSAweCUwOHggJXM6JXMvJXM6ICIsIHJlc0lELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDSEFSMTZfVE9fQ1NUUihyZXNOYW1lLnBhY2thZ2UsIHJlc05hbWUucGFja2FnZUxlbiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENIQVIxNl9UT19DU1RSKHJlc05hbWUudHlwZSwgcmVzTmFtZS50eXBlTGVuKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0hBUjE2X1RPX0NTVFIocmVzTmFtZS5uYW1lLCByZXNOYW1lLm5hbWVMZW4pKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLT5nZXRSZXNvdXJjZU5hbWUocmVzSUQsICZyZXNOYW1lKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiICAgICAgICByZXNvdXJjZSAweCUwOHggJXM6JXMvJXM6ICIsIHJlc0lELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0hBUjE2X1RPX0NTVFIocmVzTmFtZS5wYWNrYWdlLCByZXNOYW1lLnBhY2thZ2VMZW4pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0hBUjE2X1RPX0NTVFIocmVzTmFtZS50eXBlLCByZXNOYW1lLnR5cGVMZW4pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0hBUjE2X1RPX0NTVFIocmVzTmFtZS5uYW1lLCByZXNOYW1lLm5hbWVMZW4pKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCIgICAgICAgIElOVkFMSUQgUkVTT1VSQ0UgMHglMDh4OiAiLCByZXNJRCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKHRoaXNPZmZzZXQmMHgzKSAhPSAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCJOT04tSU5URUdFUiBPRkZTRVQ6ICVwXG4iLCAodm9pZCopdGhpc09mZnNldCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CkBAIC00NDAyLDE4ICs0NDM4LDE5IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50X3ZhbHVlKHBrZywgdmFsdWUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYmFnUHRyICE9IE5VTEwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IE4gPSBkdG9obChiYWdQdHItPmNvdW50KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUmVzVGFibGVfbWFwKiBtYXBQdHIgPSAoY29uc3QgUmVzVGFibGVfbWFwKikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKChjb25zdCB1aW50OF90KillbnQpICsgZXNpemUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBiYXNlTWFwUHRyID0gKGNvbnN0IHVpbnQ4X3QqKWVudDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IG1hcE9mZnNldCA9IGVzaXplOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSZXNUYWJsZV9tYXAqIG1hcFB0ciA9IChSZXNUYWJsZV9tYXAqKShiYXNlTWFwUHRyK21hcE9mZnNldCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiICAgICAgICAgIFBhcmVudD0weCUwOHgsIENvdW50PSVkXG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHRvaGwoYmFnUHRyLT5wYXJlbnQuaWRlbnQpLCBOKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaT0wOyBpPE47IGkrKykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpPTA7IGk8TiAmJiBtYXBPZmZzZXQgPCAodHlwZVNpemUtc2l6ZW9mKFJlc1RhYmxlX21hcCkpOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiICAgICAgICAgICMlaSAoS2V5PTB4JTA4eCk6ICIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaSwgZHRvaGwobWFwUHRyLT5uYW1lLmlkZW50KSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZS5jb3B5RnJvbV9kdG9oKG1hcFB0ci0+dmFsdWUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRfdmFsdWUocGtnLCB2YWx1ZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzaXplX3Qgc2l6ZSA9IGR0b2hzKG1hcFB0ci0+dmFsdWUuc2l6ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXBQdHIgPSAoUmVzVGFibGVfbWFwKikoKChjb25zdCB1aW50OF90KiltYXBQdHIpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgc2l6ZSArIHNpemVvZigqbWFwUHRyKS1zaXplb2YobWFwUHRyLT52YWx1ZSkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFwT2Zmc2V0ICs9IHNpemUgKyBzaXplb2YoKm1hcFB0ciktc2l6ZW9mKG1hcFB0ci0+dmFsdWUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFwUHRyID0gKFJlc1RhYmxlX21hcCopKGJhc2VNYXBQdHIrbWFwT2Zmc2V0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgIH0KZGlmZiAtLWdpdCBhL2xvY2F0aW9uL2phdmEvYW5kcm9pZC9sb2NhdGlvbi9Db3VudHJ5LmFpZGwgYi9sb2NhdGlvbi9qYXZhL2FuZHJvaWQvbG9jYXRpb24vQ291bnRyeS5haWRsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM4M2Q2NDUKLS0tIC9kZXYvbnVsbAorKysgYi9sb2NhdGlvbi9qYXZhL2FuZHJvaWQvbG9jYXRpb24vQ291bnRyeS5haWRsCkBAIC0wLDAgKzEsMTkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQubG9jYXRpb247CisKK3BhcmNlbGFibGUgQ291bnRyeTsKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9sb2NhdGlvbi9qYXZhL2FuZHJvaWQvbG9jYXRpb24vQ291bnRyeS5qYXZhIGIvbG9jYXRpb24vamF2YS9hbmRyb2lkL2xvY2F0aW9uL0NvdW50cnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4zYzA1NDAzCi0tLSAvZGV2L251bGwKKysrIGIvbG9jYXRpb24vamF2YS9hbmRyb2lkL2xvY2F0aW9uL0NvdW50cnkuamF2YQpAQCAtMCwwICsxLDE2MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlCisgKi8KKworcGFja2FnZSBhbmRyb2lkLmxvY2F0aW9uOworCitpbXBvcnQgYW5kcm9pZC5vcy5QYXJjZWw7CitpbXBvcnQgYW5kcm9pZC5vcy5QYXJjZWxhYmxlOworCisvKioKKyAqIFRoaXMgY2xhc3Mgd3JhcHMgdGhlIGNvdW50cnkgaW5mb3JtYXRpb24uCisgKgorICogQGhpZGUKKyAqLworcHVibGljIGNsYXNzIENvdW50cnkgaW1wbGVtZW50cyBQYXJjZWxhYmxlIHsKKyAgICAvKioKKyAgICAgKiBUaGUgY291bnRyeSBjb2RlIGNhbWUgZnJvbSB0aGUgbW9iaWxlIG5ldHdvcmsKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDT1VOVFJZX1NPVVJDRV9ORVRXT1JLID0gMDsKKworICAgIC8qKgorICAgICAqIFRoZSBjb3VudHJ5IGNvZGUgY2FtZSBmcm9tIHRoZSBsb2NhdGlvbiBzZXJ2aWNlCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ09VTlRSWV9TT1VSQ0VfTE9DQVRJT04gPSAxOworCisgICAgLyoqCisgICAgICogVGhlIGNvdW50cnkgY29kZSB3YXMgcmVhZCBmcm9tIHRoZSBTSU0gY2FyZAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENPVU5UUllfU09VUkNFX1NJTSA9IDI7CisKKyAgICAvKioKKyAgICAgKiBUaGUgY291bnRyeSBjb2RlIGNhbWUgZnJvbSB0aGUgc3lzdGVtIGxvY2FsZSBzZXR0aW5nCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ09VTlRSWV9TT1VSQ0VfTE9DQUxFID0gMzsKKworICAgIC8qKgorICAgICAqIFRoZSBJU08gMzE2Ni0xIHR3byBsZXR0ZXJzIGNvdW50cnkgY29kZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBtQ291bnRyeUlzbzsKKworICAgIC8qKgorICAgICAqIFdoZXJlIHRoZSBjb3VudHJ5IGNvZGUgY2FtZSBmcm9tLgorICAgICAqLworICAgIHByaXZhdGUgZmluYWwgaW50IG1Tb3VyY2U7CisKKyAgICBwcml2YXRlIGludCBtSGFzaENvZGU7CisgICAgLyoqCisgICAgICoKKyAgICAgKiBAcGFyYW0gY291bnRyeUlzbyB0aGUgSVNPIDMxNjYtMSB0d28gbGV0dGVycyBjb3VudHJ5IGNvZGUuCisgICAgICogQHBhcmFtIHNvdXJjZSB3aGVyZSB0aGUgY291bnRyeUlzbyBjYW1lIGZyb20sIGNvdWxkIGJlIG9uZSBvZiBiZWxvdworICAgICAqICAgICAgICB2YWx1ZXMKKyAgICAgKiAgICAgICAgPHA+CisgICAgICogICAgICAgIDx1bD4KKyAgICAgKiAgICAgICAgPGxpPntAbGluayAjQ09VTlRSWV9TT1VSQ0VfTkVUV09SS308L2xpPgorICAgICAqICAgICAgICA8bGk+e0BsaW5rICNDT1VOVFJZX1NPVVJDRV9MT0NBVElPTn08L2xpPgorICAgICAqICAgICAgICA8bGk+e0BsaW5rICNDT1VOVFJZX1NPVVJDRV9TSU19PC9saT4KKyAgICAgKiAgICAgICAgPGxpPntAbGluayAjQ09VTlRSWV9TT1VSQ0VfTE9DQUxFfTwvbGk+CisgICAgICogICAgICAgIDwvdWw+CisgICAgICovCisgICAgcHVibGljIENvdW50cnkoZmluYWwgU3RyaW5nIGNvdW50cnlJc28sIGZpbmFsIGludCBzb3VyY2UpIHsKKyAgICAgICAgaWYgKGNvdW50cnlJc28gPT0gbnVsbCB8fCBzb3VyY2UgPCBDT1VOVFJZX1NPVVJDRV9ORVRXT1JLCisgICAgICAgICAgICAgICAgfHwgc291cmNlID4gQ09VTlRSWV9TT1VSQ0VfTE9DQUxFKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7CisgICAgICAgIH0KKyAgICAgICAgbUNvdW50cnlJc28gPSBjb3VudHJ5SXNvLnRvTG93ZXJDYXNlKCk7CisgICAgICAgIG1Tb3VyY2UgPSBzb3VyY2U7CisgICAgfQorCisgICAgcHVibGljIENvdW50cnkoQ291bnRyeSBjb3VudHJ5KSB7CisgICAgICAgIG1Db3VudHJ5SXNvID0gY291bnRyeS5tQ291bnRyeUlzbzsKKyAgICAgICAgbVNvdXJjZSA9IGNvdW50cnkubVNvdXJjZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIHRoZSBJU08gMzE2Ni0xIHR3byBsZXR0ZXJzIGNvdW50cnkgY29kZQorICAgICAqLworICAgIHB1YmxpYyBmaW5hbCBTdHJpbmcgZ2V0Q291bnRyeUlzbygpIHsKKyAgICAgICAgcmV0dXJuIG1Db3VudHJ5SXNvOworICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4gd2hlcmUgdGhlIGNvdW50cnkgY29kZSBjYW1lIGZyb20sIGNvdWxkIGJlIG9uZSBvZiBiZWxvdyB2YWx1ZXMKKyAgICAgKiAgICAgICAgIDxwPgorICAgICAqICAgICAgICAgPHVsPgorICAgICAqICAgICAgICAgPGxpPntAbGluayAjQ09VTlRSWV9TT1VSQ0VfTkVUV09SS308L2xpPgorICAgICAqICAgICAgICAgPGxpPntAbGluayAjQ09VTlRSWV9TT1VSQ0VfTE9DQVRJT059PC9saT4KKyAgICAgKiAgICAgICAgIDxsaT57QGxpbmsgI0NPVU5UUllfU09VUkNFX1NJTX08L2xpPgorICAgICAqICAgICAgICAgPGxpPntAbGluayAjQ09VTlRSWV9TT1VSQ0VfTE9DQUxFfTwvbGk+CisgICAgICogICAgICAgICA8L3VsPgorICAgICAqLworICAgIHB1YmxpYyBmaW5hbCBpbnQgZ2V0U291cmNlKCkgeworICAgICAgICByZXR1cm4gbVNvdXJjZTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFBhcmNlbGFibGUuQ3JlYXRvcjxDb3VudHJ5PiBDUkVBVE9SID0gbmV3IFBhcmNlbGFibGUuQ3JlYXRvcjxDb3VudHJ5PigpIHsKKyAgICAgICAgcHVibGljIENvdW50cnkgY3JlYXRlRnJvbVBhcmNlbChQYXJjZWwgaW4pIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgQ291bnRyeShpbi5yZWFkU3RyaW5nKCksIGluLnJlYWRJbnQoKSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgQ291bnRyeVtdIG5ld0FycmF5KGludCBzaXplKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IENvdW50cnlbc2l6ZV07CisgICAgICAgIH0KKyAgICB9OworCisgICAgcHVibGljIGludCBkZXNjcmliZUNvbnRlbnRzKCkgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB3cml0ZVRvUGFyY2VsKFBhcmNlbCBwYXJjZWwsIGludCBmbGFncykgeworICAgICAgICBwYXJjZWwud3JpdGVTdHJpbmcobUNvdW50cnlJc28pOworICAgICAgICBwYXJjZWwud3JpdGVJbnQobVNvdXJjZSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmplY3QpIHsKKyAgICAgICAgaWYgKG9iamVjdCA9PSB0aGlzKSB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBpZiAob2JqZWN0IGluc3RhbmNlb2YgQ291bnRyeSkgeworICAgICAgICAgICAgQ291bnRyeSBjID0gKENvdW50cnkpIG9iamVjdDsKKyAgICAgICAgICAgIHJldHVybiBtQ291bnRyeUlzby5lcXVhbHMoYy5nZXRDb3VudHJ5SXNvKCkpICYmIG1Tb3VyY2UgPT0gYy5nZXRTb3VyY2UoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKKyAgICAgICAgaW50IGhhc2ggPSBtSGFzaENvZGU7CisgICAgICAgIGlmIChoYXNoID09IDApIHsKKyAgICAgICAgICAgIGhhc2ggPSAxNzsKKyAgICAgICAgICAgIGhhc2ggPSBoYXNoICogMTMgKyBtQ291bnRyeUlzby5oYXNoQ29kZSgpOworICAgICAgICAgICAgaGFzaCA9IGhhc2ggKiAxMyArIG1Tb3VyY2U7CisgICAgICAgICAgICBtSGFzaENvZGUgPSBoYXNoOworICAgICAgICB9CisgICAgICAgIHJldHVybiBtSGFzaENvZGU7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29tcGFyZSB0aGUgc3BlY2lmaWVkIGNvdW50cnkgdG8gdGhpcyBjb3VudHJ5IG9iamVjdCBpZ25vcmluZyB0aGUgbVNvdXJjZQorICAgICAqIGZpZWxkLCByZXR1cm4gdHJ1ZSBpZiB0aGUgY291bnRyeUlzbyBmaWVsZHMgYXJlIGVxdWFsCisgICAgICoKKyAgICAgKiBAcGFyYW0gY291bnRyeSB0aGUgY291bnRyeSB0byBjb21wYXJlCisgICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBzcGVjaWZpZWQgY291bnRyeSdzIGNvdW50cnlJc28gZmllbGQgaXMgZXF1YWwgdG8gdGhpcworICAgICAqICAgICAgICAgY291bnRyeSdzLCBmYWxzZSBvdGhlcndpc2UuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzSWdub3JlU291cmNlKENvdW50cnkgY291bnRyeSkgeworICAgICAgICByZXR1cm4gY291bnRyeSAhPSBudWxsICYmIG1Db3VudHJ5SXNvLmVxdWFscyhjb3VudHJ5LmdldENvdW50cnlJc28oKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbG9jYXRpb24vamF2YS9hbmRyb2lkL2xvY2F0aW9uL0NvdW50cnlEZXRlY3Rvci5qYXZhIGIvbG9jYXRpb24vamF2YS9hbmRyb2lkL2xvY2F0aW9uL0NvdW50cnlEZXRlY3Rvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBiNzgwY2UKLS0tIC9kZXYvbnVsbAorKysgYi9sb2NhdGlvbi9qYXZhL2FuZHJvaWQvbG9jYXRpb24vQ291bnRyeURldGVjdG9yLmphdmEKQEAgLTAsMCArMSwxNTIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdAorICogdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKKyAqIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgV0lUSE9VVAorICogV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlCisgKiBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlcgorICogdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLmxvY2F0aW9uOworCitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CisKK2ltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5Mb29wZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb247CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKKworLyoqCisgKiBUaGlzIGNsYXNzIHByb3ZpZGVzIGFjY2VzcyB0byB0aGUgc3lzdGVtIGNvdW50cnkgZGV0ZWN0b3Igc2VydmljZS4gVGhpcworICogc2VydmljZSBhbGxvd3MgYXBwbGljYXRpb25zIHRvIG9idGFpbiB0aGUgY291bnRyeSB0aGF0IHRoZSB1c2VyIGlzIGluLgorICogPHA+CisgKiBUaGUgY291bnRyeSB3aWxsIGJlIGRldGVjdGVkIGluIG9yZGVyIG9mIHJlbGlhYmlsaXR5LCBsaWtlCisgKiA8dWw+CisgKiA8bGk+TW9iaWxlIG5ldHdvcms8L2xpPgorICogPGxpPkxvY2F0aW9uPC9saT4KKyAqIDxsaT5TSU0ncyBjb3VudHJ5PC9saT4KKyAqIDxsaT5QaG9uZSdzIGxvY2FsZTwvbGk+CisgKiA8L3VsPgorICogPHA+CisgKiBDYWxsIHRoZSB7QGxpbmsgI2RldGVjdENvdW50cnkoKX0gdG8gZ2V0IHRoZSBhdmFpbGFibGUgY291bnRyeSBpbW1lZGlhdGVseS4KKyAqIDxwPgorICogVG8gYmUgbm90aWZpZWQgb2YgdGhlIGZ1dHVyZSBjb3VudHJ5IGNoYW5nZSwgdXNlIHRoZQorICoge0BsaW5rICNhZGRDb3VudHJ5TGlzdGVuZXJ9CisgKiA8cD4KKyAqIDxwPgorICogWW91IGRvIG5vdCBpbnN0YW50aWF0ZSB0aGlzIGNsYXNzIGRpcmVjdGx5OyBpbnN0ZWFkLCByZXRyaWV2ZSBpdCB0aHJvdWdoCisgKiB7QGxpbmsgYW5kcm9pZC5jb250ZW50LkNvbnRleHQjZ2V0U3lzdGVtU2VydmljZQorICogQ29udGV4dC5nZXRTeXN0ZW1TZXJ2aWNlKENvbnRleHQuQ09VTlRSWV9ERVRFQ1RPUil9LgorICogPHA+CisgKiBCb3RoIEFDQ0VTU19GSU5FX0xPQ0FUSU9OIGFuZCBBQ0NFU1NfQ09BUlNFX0xPQ0FUSU9OIHBlcm1pc3Npb25zIGFyZSBuZWVkZWQuCisgKgorICogQGhpZGUKKyAqLworcHVibGljIGNsYXNzIENvdW50cnlEZXRlY3RvciB7CisKKyAgICAvKioKKyAgICAgKiBUaGUgY2xhc3MgdG8gd3JhcCB0aGUgSUNvdW50cnlMaXN0ZW5lci5TdHViIGFuZCBDb3VudHJ5TGlzdGVuZXIgb2JqZWN0cworICAgICAqIHRvZ2V0aGVyLiBUaGUgQ291bnRyeUxpc3RlbmVyIHdpbGwgYmUgbm90aWZpZWQgdGhyb3VnaCB0aGUgc3BlY2lmaWMKKyAgICAgKiBsb29wZXIgb25jZSB0aGUgY291bnRyeSBjaGFuZ2VkIGFuZCBkZXRlY3RlZC4KKyAgICAgKi8KKyAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBjbGFzcyBMaXN0ZW5lclRyYW5zcG9ydCBleHRlbmRzIElDb3VudHJ5TGlzdGVuZXIuU3R1YiB7CisKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBDb3VudHJ5TGlzdGVuZXIgbUxpc3RlbmVyOworCisgICAgICAgIHByaXZhdGUgZmluYWwgSGFuZGxlciBtSGFuZGxlcjsKKworICAgICAgICBwdWJsaWMgTGlzdGVuZXJUcmFuc3BvcnQoQ291bnRyeUxpc3RlbmVyIGxpc3RlbmVyLCBMb29wZXIgbG9vcGVyKSB7CisgICAgICAgICAgICBtTGlzdGVuZXIgPSBsaXN0ZW5lcjsKKyAgICAgICAgICAgIGlmIChsb29wZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG1IYW5kbGVyID0gbmV3IEhhbmRsZXIobG9vcGVyKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbUhhbmRsZXIgPSBuZXcgSGFuZGxlcigpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgb25Db3VudHJ5RGV0ZWN0ZWQoZmluYWwgQ291bnRyeSBjb3VudHJ5KSB7CisgICAgICAgICAgICBtSGFuZGxlci5wb3N0KG5ldyBSdW5uYWJsZSgpIHsKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgICAgIG1MaXN0ZW5lci5vbkNvdW50cnlEZXRlY3RlZChjb3VudHJ5KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBUQUcgPSAiQ291bnRyeURldGVjdG9yIjsKKyAgICBwcml2YXRlIGZpbmFsIElDb3VudHJ5RGV0ZWN0b3IgbVNlcnZpY2U7CisgICAgcHJpdmF0ZSBmaW5hbCBIYXNoTWFwPENvdW50cnlMaXN0ZW5lciwgTGlzdGVuZXJUcmFuc3BvcnQ+IG1MaXN0ZW5lcnM7CisKKyAgICAvKioKKyAgICAgKiBAaGlkZSAtIGhpZGUgdGhpcyBjb25zdHJ1Y3RvciBiZWNhdXNlIGl0IGhhcyBhIHBhcmFtZXRlciBvZiB0eXBlCisgICAgICogICAgICAgSUNvdW50cnlEZXRlY3Rvciwgd2hpY2ggaXMgYSBzeXN0ZW0gcHJpdmF0ZSBjbGFzcy4gVGhlIHJpZ2h0IHdheSB0bworICAgICAqICAgICAgIGNyZWF0ZSBhbiBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzIGlzIHVzaW5nIHRoZSBmYWN0b3J5CisgICAgICogICAgICAgQ29udGV4dC5nZXRTeXN0ZW1TZXJ2aWNlLgorICAgICAqLworICAgIHB1YmxpYyBDb3VudHJ5RGV0ZWN0b3IoSUNvdW50cnlEZXRlY3RvciBzZXJ2aWNlKSB7CisgICAgICAgIG1TZXJ2aWNlID0gc2VydmljZTsKKyAgICAgICAgbUxpc3RlbmVycyA9IG5ldyBIYXNoTWFwPENvdW50cnlMaXN0ZW5lciwgTGlzdGVuZXJUcmFuc3BvcnQ+KCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU3RhcnQgZGV0ZWN0aW5nIHRoZSBjb3VudHJ5IHRoYXQgdGhlIHVzZXIgaXMgaW4uCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSBjb3VudHJ5IGlmIGl0IGlzIGF2YWlsYWJsZSBpbW1lZGlhdGVseSwgb3RoZXJ3aXNlIG51bGwgd2lsbAorICAgICAqICAgICAgICAgYmUgcmV0dXJuZWQuCisgICAgICovCisgICAgcHVibGljIENvdW50cnkgZGV0ZWN0Q291bnRyeSgpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJldHVybiBtU2VydmljZS5kZXRlY3RDb3VudHJ5KCk7CisgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBMb2cuZShUQUcsICJkZXRlY3RDb3VudHJ5OiBSZW1vdGVFeGNlcHRpb24iLCBlKTsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkIGEgbGlzdGVuZXIgdG8gcmVjZWl2ZSB0aGUgbm90aWZpY2F0aW9uIHdoZW4gdGhlIGNvdW50cnkgaXMgZGV0ZWN0ZWQKKyAgICAgKiBvciBjaGFuZ2VkLgorICAgICAqCisgICAgICogQHBhcmFtIGxpc3RlbmVyIHdpbGwgYmUgY2FsbGVkIHdoZW4gdGhlIGNvdW50cnkgaXMgZGV0ZWN0ZWQgb3IgY2hhbmdlZC4KKyAgICAgKiBAcGFyYW0gbG9vcGVyIGEgTG9vcGVyIG9iamVjdCB3aG9zZSBtZXNzYWdlIHF1ZXVlIHdpbGwgYmUgdXNlZCB0bworICAgICAqICAgICAgICBpbXBsZW1lbnQgdGhlIGNhbGxiYWNrIG1lY2hhbmlzbS4gSWYgbG9vcGVyIGlzIG51bGwgdGhlbiB0aGUKKyAgICAgKiAgICAgICAgY2FsbGJhY2tzIHdpbGwgYmUgY2FsbGVkIG9uIHRoZSBtYWluIHRocmVhZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRDb3VudHJ5TGlzdGVuZXIoQ291bnRyeUxpc3RlbmVyIGxpc3RlbmVyLCBMb29wZXIgbG9vcGVyKSB7CisgICAgICAgIHN5bmNocm9uaXplZCAobUxpc3RlbmVycykgeworICAgICAgICAgICAgaWYgKCFtTGlzdGVuZXJzLmNvbnRhaW5zS2V5KGxpc3RlbmVyKSkgeworICAgICAgICAgICAgICAgIExpc3RlbmVyVHJhbnNwb3J0IHRyYW5zcG9ydCA9IG5ldyBMaXN0ZW5lclRyYW5zcG9ydChsaXN0ZW5lciwgbG9vcGVyKTsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBtU2VydmljZS5hZGRDb3VudHJ5TGlzdGVuZXIodHJhbnNwb3J0KTsKKyAgICAgICAgICAgICAgICAgICAgbUxpc3RlbmVycy5wdXQobGlzdGVuZXIsIHRyYW5zcG9ydCk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAiYWRkQ291bnRyeUxpc3RlbmVyOiBSZW1vdGVFeGNlcHRpb24iLCBlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZW1vdmUgdGhlIGxpc3RlbmVyCisgICAgICovCisgICAgcHVibGljIHZvaWQgcmVtb3ZlQ291bnRyeUxpc3RlbmVyKENvdW50cnlMaXN0ZW5lciBsaXN0ZW5lcikgeworICAgICAgICBzeW5jaHJvbml6ZWQgKG1MaXN0ZW5lcnMpIHsKKyAgICAgICAgICAgIExpc3RlbmVyVHJhbnNwb3J0IHRyYW5zcG9ydCA9IG1MaXN0ZW5lcnMuZ2V0KGxpc3RlbmVyKTsKKyAgICAgICAgICAgIGlmICh0cmFuc3BvcnQgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIG1MaXN0ZW5lcnMucmVtb3ZlKGxpc3RlbmVyKTsKKyAgICAgICAgICAgICAgICAgICAgbVNlcnZpY2UucmVtb3ZlQ291bnRyeUxpc3RlbmVyKHRyYW5zcG9ydCk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAicmVtb3ZlQ291bnRyeUxpc3RlbmVyOiBSZW1vdGVFeGNlcHRpb24iLCBlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9sb2NhdGlvbi9qYXZhL2FuZHJvaWQvbG9jYXRpb24vQ291bnRyeUxpc3RlbmVyLmphdmEgYi9sb2NhdGlvbi9qYXZhL2FuZHJvaWQvbG9jYXRpb24vQ291bnRyeUxpc3RlbmVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTM2ZGI0MQotLS0gL2Rldi9udWxsCisrKyBiL2xvY2F0aW9uL2phdmEvYW5kcm9pZC9sb2NhdGlvbi9Db3VudHJ5TGlzdGVuZXIuamF2YQpAQCAtMCwwICsxLDMwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UKKyAqLworCitwYWNrYWdlIGFuZHJvaWQubG9jYXRpb247CisKKy8qKgorICogVGhlIGxpc3RlbmVyIGZvciByZWNlaXZpbmcgdGhlIG5vdGlmaWNhdGlvbiB3aGVuIHRoZSBjb3VudHJ5IGlzIGRldGVjdGVkIG9yCisgKiBjaGFuZ2VkCisgKgorICogQGhpZGUKKyAqLworcHVibGljIGludGVyZmFjZSBDb3VudHJ5TGlzdGVuZXIgeworICAgIC8qKgorICAgICAqIEBwYXJhbSBjb3VudHJ5IHRoZSBjaGFuZ2VkIG9yIGRldGVjdGVkIGNvdW50cnkuCisgICAgICovCisgICAgdm9pZCBvbkNvdW50cnlEZXRlY3RlZChDb3VudHJ5IGNvdW50cnkpOworfQpkaWZmIC0tZ2l0IGEvbG9jYXRpb24vamF2YS9hbmRyb2lkL2xvY2F0aW9uL0lDb3VudHJ5RGV0ZWN0b3IuYWlkbCBiL2xvY2F0aW9uL2phdmEvYW5kcm9pZC9sb2NhdGlvbi9JQ291bnRyeURldGVjdG9yLmFpZGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmVhZjA3YwotLS0gL2Rldi9udWxsCisrKyBiL2xvY2F0aW9uL2phdmEvYW5kcm9pZC9sb2NhdGlvbi9JQ291bnRyeURldGVjdG9yLmFpZGwKQEAgLTAsMCArMSw0NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5sb2NhdGlvbjsKKworaW1wb3J0IGFuZHJvaWQubG9jYXRpb24uQ291bnRyeTsKK2ltcG9ydCBhbmRyb2lkLmxvY2F0aW9uLklDb3VudHJ5TGlzdGVuZXI7CisKKy8qKgorICogVGhlIEFQSSBmb3IgZGV0ZWN0aW5nIHRoZSBjb3VudHJ5IHdoZXJlIHRoZSB1c2VyIGlzLgorICoKKyAqIHtAaGlkZX0KKyAqLworaW50ZXJmYWNlIElDb3VudHJ5RGV0ZWN0b3IKK3sKKyAgICAvKioKKyAgICAgKiBTdGFydCBkZXRlY3RpbmcgdGhlIGNvdW50cnkgdGhhdCB0aGUgdXNlciBpcyBpbi4KKyAgICAgKiBAcmV0dXJuIHRoZSBjb3VudHJ5IGlmIGl0IGlzIGF2YWlsYWJsZSBpbW1lZGlhdGVseSwgb3RoZXJ3aXNlIG51bGwgd2lsbCBiZSByZXR1cm5lZC4KKyAgICAgKi8KKyAgICBDb3VudHJ5IGRldGVjdENvdW50cnkoKTsKKworICAgIC8qKgorICAgICAqIEFkZCBhIGxpc3RlbmVyIHRvIHJlY2VpdmUgdGhlIG5vdGlmaWNhdGlvbiB3aGVuIHRoZSBjb3VudHJ5IGlzIGRldGVjdGVkIG9yIGNoYW5nZWQuCisgICAgICovCisgICAgdm9pZCBhZGRDb3VudHJ5TGlzdGVuZXIoaW4gSUNvdW50cnlMaXN0ZW5lciBsaXN0ZW5lcik7CisKKyAgICAvKioKKyAgICAgKiBSZW1vdmUgdGhlIGxpc3RlbmVyCisgICAgICovCisgICAgdm9pZCByZW1vdmVDb3VudHJ5TGlzdGVuZXIoaW4gSUNvdW50cnlMaXN0ZW5lciBsaXN0ZW5lcik7Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbG9jYXRpb24vamF2YS9hbmRyb2lkL2xvY2F0aW9uL0lDb3VudHJ5TGlzdGVuZXIuYWlkbCBiL2xvY2F0aW9uL2phdmEvYW5kcm9pZC9sb2NhdGlvbi9JQ291bnRyeUxpc3RlbmVyLmFpZGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzZlY2IxMwotLS0gL2Rldi9udWxsCisrKyBiL2xvY2F0aW9uL2phdmEvYW5kcm9pZC9sb2NhdGlvbi9JQ291bnRyeUxpc3RlbmVyLmFpZGwKQEAgLTAsMCArMSwyNiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5sb2NhdGlvbjsKKworaW1wb3J0IGFuZHJvaWQubG9jYXRpb24uQ291bnRyeTsKKy8qKgorICoge0BoaWRlfQorICovCitvbmV3YXkgaW50ZXJmYWNlIElDb3VudHJ5TGlzdGVuZXIKK3sKKyAgICB2b2lkIG9uQ291bnRyeURldGVjdGVkKGluIENvdW50cnkgY291bnRyeSk7Cit9CmRpZmYgLS1naXQgYS9sb2NhdGlvbi90ZXN0cy9sb2NhdGlvbnRlc3RzL3NyYy9hbmRyb2lkL2xvY2F0aW9uL0NvdW50cnlUZXN0ZXIuamF2YSBiL2xvY2F0aW9uL3Rlc3RzL2xvY2F0aW9udGVzdHMvc3JjL2FuZHJvaWQvbG9jYXRpb24vQ291bnRyeVRlc3Rlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk4MDJkNWEKLS0tIC9kZXYvbnVsbAorKysgYi9sb2NhdGlvbi90ZXN0cy9sb2NhdGlvbnRlc3RzL3NyYy9hbmRyb2lkL2xvY2F0aW9uL0NvdW50cnlUZXN0ZXIuamF2YQpAQCAtMCwwICsxLDMzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLmxvY2F0aW9uOworCitpbXBvcnQgYW5kcm9pZC50ZXN0LkFuZHJvaWRUZXN0Q2FzZTsKKworcHVibGljIGNsYXNzIENvdW50cnlUZXN0ZXIgZXh0ZW5kcyBBbmRyb2lkVGVzdENhc2UgeworICAgIHB1YmxpYyB2b2lkIHRlc3RDb3VudHJ5RXF1YWxzKCkgeworICAgICAgICBDb3VudHJ5IGNvdW50cnlBID0gbmV3IENvdW50cnkoIlVTIiwgQ291bnRyeS5DT1VOVFJZX1NPVVJDRV9ORVRXT1JLKTsKKyAgICAgICAgQ291bnRyeSBjb3VudHJ5QiA9IG5ldyBDb3VudHJ5KCJVUyIsIENvdW50cnkuQ09VTlRSWV9TT1VSQ0VfTE9DQUxFKTsKKyAgICAgICAgQ291bnRyeSBjb3VudHJ5QyA9IG5ldyBDb3VudHJ5KCJDTiIsIENvdW50cnkuQ09VTlRSWV9TT1VSQ0VfTE9DQUxFKTsKKyAgICAgICAgQ291bnRyeSBjb3VudHJ5RCA9IG5ldyBDb3VudHJ5KCJ1cyIsIENvdW50cnkuQ09VTlRSWV9TT1VSQ0VfTkVUV09SSyk7CisgICAgICAgIGFzc2VydFRydWUoY291bnRyeUEuZXF1YWxzSWdub3JlU291cmNlKGNvdW50cnlCKSk7CisgICAgICAgIGFzc2VydEZhbHNlKGNvdW50cnlBLmVxdWFsc0lnbm9yZVNvdXJjZShjb3VudHJ5QykpOworICAgICAgICBhc3NlcnRGYWxzZShjb3VudHJ5QS5lcXVhbHMoY291bnRyeUMpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShjb3VudHJ5QS5lcXVhbHMoY291bnRyeUQpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShjb3VudHJ5QS5oYXNoQ29kZSgpID09IGNvdW50cnlELmhhc2hDb2RlKCkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL21lZGlhL2phdmEvYW5kcm9pZC9tZWRpYS9BdWRpb0Zvcm1hdC5qYXZhIGIvbWVkaWEvamF2YS9hbmRyb2lkL21lZGlhL0F1ZGlvRm9ybWF0LmphdmEKaW5kZXggZjFmYTFlOC4uMzFlNDYzMSAxMDA2NDQKLS0tIGEvbWVkaWEvamF2YS9hbmRyb2lkL21lZGlhL0F1ZGlvRm9ybWF0LmphdmEKKysrIGIvbWVkaWEvamF2YS9hbmRyb2lkL21lZGlhL0F1ZGlvRm9ybWF0LmphdmEKQEAgLTMxLDkgKzMxLDkgQEAKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFTkNPRElOR19JTlZBTElEID0gMDsKICAgICAvKiogRGVmYXVsdCBhdWRpbyBkYXRhIGZvcm1hdCAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVOQ09ESU5HX0RFRkFVTFQgPSAxOwotICAgIC8qKiBBdWRpbyBkYXRhIGZvcm1hdDogUENNIDE2IGJpdCBwZXIgc2FtcGxlICovCisgICAgLyoqIEF1ZGlvIGRhdGEgZm9ybWF0OiBQQ00gMTYgYml0IHBlciBzYW1wbGUuIEd1YXJhbnRlZWQgdG8gYmUgc3VwcG9ydGVkIGJ5IGRldmljZXMuICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRU5DT0RJTkdfUENNXzE2QklUID0gMjsgLy8gYWNjZXNzZWQgYnkgbmF0aXZlIGNvZGUKLSAgICAvKiogQXVkaW8gZGF0YSBmb3JtYXQ6IFBDTSA4IGJpdCBwZXIgc2FtcGxlICovCisgICAgLyoqIEF1ZGlvIGRhdGEgZm9ybWF0OiBQQ00gOCBiaXQgcGVyIHNhbXBsZS4gTm90IGd1YXJhbnRlZWQgdG8gYmUgc3VwcG9ydGVkIGJ5IGRldmljZXMuICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRU5DT0RJTkdfUENNXzhCSVQgPSAzOyAgLy8gYWNjZXNzZWQgYnkgbmF0aXZlIGNvZGUKIAogICAgIC8qKiBJbnZhbGlkIGF1ZGlvIGNoYW5uZWwgY29uZmlndXJhdGlvbiAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvamF2YS9hbmRyb2lkL21lZGlhL0F1ZGlvTWFuYWdlci5qYXZhIGIvbWVkaWEvamF2YS9hbmRyb2lkL21lZGlhL0F1ZGlvTWFuYWdlci5qYXZhCmluZGV4IGJiYmJhNzQuLmIyM2RjZGUgMTAwNjQ0Ci0tLSBhL21lZGlhL2phdmEvYW5kcm9pZC9tZWRpYS9BdWRpb01hbmFnZXIuamF2YQorKysgYi9tZWRpYS9qYXZhL2FuZHJvaWQvbWVkaWEvQXVkaW9NYW5hZ2VyLmphdmEKQEAgLTE1MjUsNCArMTUyNSwyMiBAQAogICAgICAgKiB7QGhpZGV9CiAgICAgICAqLwogICAgICBwcml2YXRlIElCaW5kZXIgbUlDYWxsQmFjayA9IG5ldyBCaW5kZXIoKTsKKworICAgIC8qKgorICAgICAqIENoZWNrcyB3aGV0aGVyIHRoZSBwaG9uZSBpcyBpbiBzaWxlbnQgbW9kZSwgd2l0aCBvciB3aXRob3V0IHZpYnJhdGUuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgcGhvbmUgaXMgaW4gc2lsZW50IG1vZGUsIHdpdGggb3Igd2l0aG91dCB2aWJyYXRlLgorICAgICAqCisgICAgICogQHNlZSAjZ2V0UmluZ2VyTW9kZSgpCisgICAgICoKKyAgICAgKiBAaGlkZSBwZW5kaW5nIEFQSSBDb3VuY2lsIGFwcHJvdmFsCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNTaWxlbnRNb2RlKCkgeworICAgICAgICBpbnQgcmluZ2VyTW9kZSA9IGdldFJpbmdlck1vZGUoKTsKKyAgICAgICAgYm9vbGVhbiBzaWxlbnRNb2RlID0KKyAgICAgICAgICAgIChyaW5nZXJNb2RlID09IFJJTkdFUl9NT0RFX1NJTEVOVCkgfHwKKyAgICAgICAgICAgIChyaW5nZXJNb2RlID09IFJJTkdFUl9NT0RFX1ZJQlJBVEUpOworICAgICAgICByZXR1cm4gc2lsZW50TW9kZTsKKyAgICB9CisKIH0KZGlmZiAtLWdpdCBhL21lZGlhL2phdmEvYW5kcm9pZC9tZWRpYS9BdWRpb1JlY29yZC5qYXZhIGIvbWVkaWEvamF2YS9hbmRyb2lkL21lZGlhL0F1ZGlvUmVjb3JkLmphdmEKaW5kZXggYzQ4ZWFhZC4uYzU2N2E2ZSAxMDA2NDQKLS0tIGEvbWVkaWEvamF2YS9hbmRyb2lkL21lZGlhL0F1ZGlvUmVjb3JkLmphdmEKKysrIGIvbWVkaWEvamF2YS9hbmRyb2lkL21lZGlhL0F1ZGlvUmVjb3JkLmphdmEKQEAgLTE5NCwxMSArMTk0LDEzIEBACiAgICAgICogQ2xhc3MgY29uc3RydWN0b3IuCiAgICAgICogQHBhcmFtIGF1ZGlvU291cmNlIHRoZSByZWNvcmRpbmcgc291cmNlLiBTZWUge0BsaW5rIE1lZGlhUmVjb3JkZXIuQXVkaW9Tb3VyY2V9IGZvcgogICAgICAqICAgIHJlY29yZGluZyBzb3VyY2UgZGVmaW5pdGlvbnMuCi0gICAgICogQHBhcmFtIHNhbXBsZVJhdGVJbkh6IHRoZSBzYW1wbGUgcmF0ZSBleHByZXNzZWQgaW4gSGVydHouIEV4YW1wbGVzIG9mIHJhdGVzIGFyZSAoYnV0Ci0gICAgICogICBub3QgbGltaXRlZCB0bykgNDQxMDAsIDIyMDUwIGFuZCAxMTAyNS4KKyAgICAgKiBAcGFyYW0gc2FtcGxlUmF0ZUluSHogdGhlIHNhbXBsZSByYXRlIGV4cHJlc3NlZCBpbiBIZXJ0ei4gNDQxMDBIeiBpcyBjdXJyZW50bHkgdGhlIG9ubHkKKyAgICAgKiAgIHJhdGUgdGhhdCBpcyBndWFyYW50ZWVkIHRvIHdvcmsgb24gYWxsIGRldmljZXMsIGJ1dCBvdGhlciByYXRlcyBzdWNoIGFzIDIyMDUwLAorICAgICAqICAgMTYwMDAsIGFuZCAxMTAyNSBtYXkgd29yayBvbiBzb21lIGRldmljZXMuCiAgICAgICogQHBhcmFtIGNoYW5uZWxDb25maWcgZGVzY3JpYmVzIHRoZSBjb25maWd1cmF0aW9uIG9mIHRoZSBhdWRpbyBjaGFubmVscy4gCiAgICAgICogICBTZWUge0BsaW5rIEF1ZGlvRm9ybWF0I0NIQU5ORUxfSU5fTU9OT30gYW5kCi0gICAgICogICB7QGxpbmsgQXVkaW9Gb3JtYXQjQ0hBTk5FTF9JTl9TVEVSRU99CisgICAgICogICB7QGxpbmsgQXVkaW9Gb3JtYXQjQ0hBTk5FTF9JTl9TVEVSRU99LiAge0BsaW5rIEF1ZGlvRm9ybWF0I0NIQU5ORUxfSU5fTU9OT30gaXMgZ3VhcmFudGVlZAorICAgICAqICAgdG8gd29yayBvbiBhbGwgZGV2aWNlcy4KICAgICAgKiBAcGFyYW0gYXVkaW9Gb3JtYXQgdGhlIGZvcm1hdCBpbiB3aGljaCB0aGUgYXVkaW8gZGF0YSBpcyByZXByZXNlbnRlZC4gCiAgICAgICogICBTZWUge0BsaW5rIEF1ZGlvRm9ybWF0I0VOQ09ESU5HX1BDTV8xNkJJVH0gYW5kIAogICAgICAqICAge0BsaW5rIEF1ZGlvRm9ybWF0I0VOQ09ESU5HX1BDTV84QklUfQpAQCAtNDQ0LDYgKzQ0Niw4IEBACiAgICAgICogIG9yIHtAbGluayAjRVJST1J9IGlmIHRoZSBpbXBsZW1lbnRhdGlvbiB3YXMgdW5hYmxlIHRvIHF1ZXJ5IHRoZSBoYXJkd2FyZSBmb3IgaXRzIAogICAgICAqICBvdXRwdXQgcHJvcGVydGllcywgCiAgICAgICogICBvciB0aGUgbWluaW11bSBidWZmZXIgc2l6ZSBleHByZXNzZWQgaW4gYnl0ZXMuCisgICAgICogQHNlZSAjQXVkaW9SZWNvcmQoaW50LCBpbnQsIGludCwgaW50LCBpbnQpIGZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHZhbGlkCisgICAgICogICBjb25maWd1cmF0aW9uIHZhbHVlcy4KICAgICAgKi8KICAgICBzdGF0aWMgcHVibGljIGludCBnZXRNaW5CdWZmZXJTaXplKGludCBzYW1wbGVSYXRlSW5IeiwgaW50IGNoYW5uZWxDb25maWcsIGludCBhdWRpb0Zvcm1hdCkgewogICAgICAgICBpbnQgY2hhbm5lbENvdW50ID0gMDsKZGlmZiAtLWdpdCBhL21lZGlhL2phdmEvYW5kcm9pZC9tZWRpYS9DYW1jb3JkZXJQcm9maWxlLmphdmEgYi9tZWRpYS9qYXZhL2FuZHJvaWQvbWVkaWEvQ2FtY29yZGVyUHJvZmlsZS5qYXZhCmluZGV4IGEyN2RmNTcuLmRhYTk3NmYgMTAwNjQ0Ci0tLSBhL21lZGlhL2phdmEvYW5kcm9pZC9tZWRpYS9DYW1jb3JkZXJQcm9maWxlLmphdmEKKysrIGIvbWVkaWEvamF2YS9hbmRyb2lkL21lZGlhL0NhbWNvcmRlclByb2ZpbGUuamF2YQpAQCAtMzksMjIgKzM5LDgwIEBACiAgKi8KIHB1YmxpYyBjbGFzcyBDYW1jb3JkZXJQcm9maWxlCiB7CisgICAgLy8gRG8gbm90IGNoYW5nZSB0aGVzZSB2YWx1ZXMvb3JkaW5hbHMgd2l0aG91dCB1cGRhdGluZyB0aGVpciBjb3VudGVycGFydAorICAgIC8vIGluIGluY2x1ZGUvbWVkaWEvTWVkaWFQcm9maWxlcy5oIQorCiAgICAgLyoqCi0gICAgICogVGhlIG91dHB1dCBmcm9tIGNhbWNvcmRlciByZWNvcmRpbmcgc2Vzc2lvbnMgY2FuIGhhdmUgZGlmZmVyZW50IHF1YWxpdHkgbGV2ZWxzLgotICAgICAqCi0gICAgICogQ3VycmVudGx5LCB3ZSBkZWZpbmUgdHdvIHF1YWxpdHkgbGV2ZWxzOiBoaWdoIHF1YWxpdHkgYW5kIGxvdyBxdWFsaXR5LgotICAgICAqIEEgY2FtY29yZGVyIHJlY29yZGluZyBzZXNzaW9uIHdpdGggaGlnaCBxdWFsaXR5IGxldmVsIHVzdWFsbHkgaGFzIGhpZ2hlciBvdXRwdXQgYml0Ci0gICAgICogcmF0ZSwgYmV0dGVyIHZpZGVvIGFuZC9vciBhdWRpbyByZWNvcmRpbmcgcXVhbGl0eSwgbGFyZ2VyIHZpZGVvIGZyYW1lCi0gICAgICogcmVzb2x1dGlvbiBhbmQgaGlnaGVyIGF1ZGlvIHNhbXBsaW5nIHJhdGUsIGV0YywgdGhhbiB0aG9zZSB3aXRoIGxvdyBxdWFsaXR5Ci0gICAgICogbGV2ZWwuCi0gICAgICoKLSAgICAgKiBEbyBub3QgY2hhbmdlIHRoZXNlIHZhbHVlcy9vcmRpbmFscyB3aXRob3V0IHVwZGF0aW5nIHRoZWlyIGNvdW50ZXJwYXJ0Ci0gICAgICogaW4gaW5jbHVkZS9tZWRpYS9NZWRpYVByb2ZpbGVzLmghCisgICAgICogUXVhbGl0eSBsZXZlbCBjb3JyZXNwb25kaW5nIHRvIHRoZSBsb3dlc3QgYXZhaWxhYmxlIHJlc29sdXRpb24uCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUVVBTElUWV9MT1cgID0gMDsKKworICAgIC8qKgorICAgICAqIFF1YWxpdHkgbGV2ZWwgY29ycmVzcG9uZGluZyB0byB0aGUgaGlnaGVzdCBhdmFpbGFibGUgcmVzb2x1dGlvbi4KKyAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBRVUFMSVRZX0hJR0ggPSAxOwogCiAgICAgLyoqCisgICAgICogUXVhbGl0eSBsZXZlbCBjb3JyZXNwb25kaW5nIHRvIHRoZSBxY2lmICgxNzYgeCAxNDQpIHJlc29sdXRpb24uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUVVBTElUWV9RQ0lGID0gMjsKKworICAgIC8qKgorICAgICAqIFF1YWxpdHkgbGV2ZWwgY29ycmVzcG9uZGluZyB0byB0aGUgY2lmICgzNTIgeCAyODgpIHJlc29sdXRpb24uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUVVBTElUWV9DSUYgPSAzOworCisgICAgLyoqCisgICAgICogUXVhbGl0eSBsZXZlbCBjb3JyZXNwb25kaW5nIHRvIHRoZSA0ODBwICg3MjAgeCA0ODApIHJlc29sdXRpb24uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUVVBTElUWV80ODBQID0gNDsKKworICAgIC8qKgorICAgICAqIFF1YWxpdHkgbGV2ZWwgY29ycmVzcG9uZGluZyB0byB0aGUgNzIwcCAoMTI4MCB4IDcyMCkgcmVzb2x1dGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBRVUFMSVRZXzcyMFAgPSA1OworCisgICAgLyoqCisgICAgICogUXVhbGl0eSBsZXZlbCBjb3JyZXNwb25kaW5nIHRvIHRoZSAxMDgwcCAoMTkyMCB4IDEwODgpIHJlc29sdXRpb24uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUVVBTElUWV8xMDgwUCA9IDY7CisKKyAgICAvKioKKyAgICAgKiBUaW1lIGxhcHNlIHF1YWxpdHkgbGV2ZWwgY29ycmVzcG9uZGluZyB0byB0aGUgbG93ZXN0IGF2YWlsYWJsZSByZXNvbHV0aW9uLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFFVQUxJVFlfVElNRV9MQVBTRV9MT1cgID0gMTAwMDsKKworICAgIC8qKgorICAgICAqIFRpbWUgbGFwc2UgcXVhbGl0eSBsZXZlbCBjb3JyZXNwb25kaW5nIHRvIHRoZSBoaWdoZXN0IGF2YWlsYWJsZSByZXNvbHV0aW9uLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFFVQUxJVFlfVElNRV9MQVBTRV9ISUdIID0gMTAwMTsKKworICAgIC8qKgorICAgICAqIFRpbWUgbGFwc2UgcXVhbGl0eSBsZXZlbCBjb3JyZXNwb25kaW5nIHRvIHRoZSBxY2lmICgxNzYgeCAxNDQpIHJlc29sdXRpb24uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUVVBTElUWV9USU1FX0xBUFNFX1FDSUYgPSAxMDAyOworCisgICAgLyoqCisgICAgICogVGltZSBsYXBzZSBxdWFsaXR5IGxldmVsIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGNpZiAoMzUyIHggMjg4KSByZXNvbHV0aW9uLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFFVQUxJVFlfVElNRV9MQVBTRV9DSUYgPSAxMDAzOworCisgICAgLyoqCisgICAgICogVGltZSBsYXBzZSBxdWFsaXR5IGxldmVsIGNvcnJlc3BvbmRpbmcgdG8gdGhlIDQ4MHAgKDcyMCB4IDQ4MCkgcmVzb2x1dGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBRVUFMSVRZX1RJTUVfTEFQU0VfNDgwUCA9IDEwMDQ7CisKKyAgICAvKioKKyAgICAgKiBUaW1lIGxhcHNlIHF1YWxpdHkgbGV2ZWwgY29ycmVzcG9uZGluZyB0byB0aGUgNzIwcCAoMTI4MCB4IDcyMCkgcmVzb2x1dGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBRVUFMSVRZX1RJTUVfTEFQU0VfNzIwUCA9IDEwMDU7CisKKyAgICAvKioKKyAgICAgKiBUaW1lIGxhcHNlIHF1YWxpdHkgbGV2ZWwgY29ycmVzcG9uZGluZyB0byB0aGUgMTA4MHAgKDE5MjAgeCAxMDg4KSByZXNvbHV0aW9uLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFFVQUxJVFlfVElNRV9MQVBTRV8xMDgwUCA9IDEwMDY7CisKKyAgICAvKioKICAgICAgKiBEZWZhdWx0IHJlY29yZGluZyBkdXJhdGlvbiBpbiBzZWNvbmRzIGJlZm9yZSB0aGUgc2Vzc2lvbiBpcyB0ZXJtaW5hdGVkLgogICAgICAqIFRoaXMgaXMgdXNlZnVsIGZvciBhcHBsaWNhdGlvbnMgbGlrZSBNTVMgaGFzIGxpbWl0ZWQgZmlsZSBzaXplIHJlcXVpcmVtZW50LgogICAgICAqLwpAQCAtMTIyLDI1ICsxODAsNzUgQEAKICAgICAgKiBSZXR1cm5zIHRoZSBjYW1jb3JkZXIgcHJvZmlsZSBmb3IgdGhlIGRlZmF1bHQgY2FtZXJhIGF0IHRoZSBnaXZlbgogICAgICAqIHF1YWxpdHkgbGV2ZWwuCiAgICAgICogQHBhcmFtIHF1YWxpdHkgdGhlIHRhcmdldCBxdWFsaXR5IGxldmVsIGZvciB0aGUgY2FtY29yZGVyIHByb2ZpbGUKKyAgICAgKiBAc2VlICNnZXQoaW50LCBpbnQpCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBDYW1jb3JkZXJQcm9maWxlIGdldChpbnQgcXVhbGl0eSkgewotICAgICAgICByZXR1cm4gZ2V0KDAsIHF1YWxpdHkpOworICAgICAgICByZXR1cm4gZ2V0KGFuZHJvaWQuaGFyZHdhcmUuQ2FtZXJhLkNBTUVSQV9JRF9ERUZBVUxULCBxdWFsaXR5KTsKICAgICB9CiAKICAgICAvKioKICAgICAgKiBSZXR1cm5zIHRoZSBjYW1jb3JkZXIgcHJvZmlsZSBmb3IgdGhlIGdpdmVuIGNhbWVyYSBhdCB0aGUgZ2l2ZW4KICAgICAgKiBxdWFsaXR5IGxldmVsLgorICAgICAqCisgICAgICogUXVhbGl0eSBsZXZlbHMgUVVBTElUWV9MT1csIFFVQUxJVFlfSElHSCBhcmUgZ3VhcmFudGVlZCB0byBiZSBzdXBwb3J0ZWQsIHdoaWxlCisgICAgICogb3RoZXIgbGV2ZWxzIG1heSBvciBtYXkgbm90IGJlIHN1cHBvcnRlZC4gVGhlIHN1cHBvcnRlZCBsZXZlbHMgY2FuIGJlIGNoZWNrZWQgdXNpbmcKKyAgICAgKiB7QGxpbmsgI2hhc1Byb2ZpbGUoaW50LCBpbnQpfS4KKyAgICAgKiBRVUFMSVRZX0xPVyByZWZlcnMgdG8gdGhlIGxvd2VzdCBxdWFsaXR5IGF2YWlsYWJsZSwgd2hpbGUgUVVBTElUWV9ISUdIIHJlZmVycyB0bworICAgICAqIHRoZSBoaWdoZXN0IHF1YWxpdHkgYXZhaWxhYmxlLgorICAgICAqIFFVQUxJVFlfTE9XL1FVQUxJVFlfSElHSCBoYXZlIHRvIG1hdGNoIG9uZSBvZiBxY2lmLCBjaWYsIDQ4MHAsIDcyMHAsIG9yIDEwODBwLgorICAgICAqIEUuZy4gaWYgdGhlIGRldmljZSBzdXBwb3J0cyA0ODBwLCA3MjBwLCBhbmQgMTA4MHAsIHRoZW4gbG93IGlzIDQ4MHAgYW5kIGhpZ2ggaXMKKyAgICAgKiAxMDgwcC4KKyAgICAgKgorICAgICAqIEEgY2FtY29yZGVyIHJlY29yZGluZyBzZXNzaW9uIHdpdGggaGlnaGVyIHF1YWxpdHkgbGV2ZWwgdXN1YWxseSBoYXMgaGlnaGVyIG91dHB1dAorICAgICAqIGJpdCByYXRlLCBiZXR0ZXIgdmlkZW8gYW5kL29yIGF1ZGlvIHJlY29yZGluZyBxdWFsaXR5LCBsYXJnZXIgdmlkZW8gZnJhbWUKKyAgICAgKiByZXNvbHV0aW9uIGFuZCBoaWdoZXIgYXVkaW8gc2FtcGxpbmcgcmF0ZSwgZXRjLCB0aGFuIHRob3NlIHdpdGggbG93ZXIgcXVhbGl0eQorICAgICAqIGxldmVsLgorICAgICAqCiAgICAgICogQHBhcmFtIGNhbWVyYUlkIHRoZSBpZCBmb3IgdGhlIGNhbWVyYQotICAgICAqIEBwYXJhbSBxdWFsaXR5IHRoZSB0YXJnZXQgcXVhbGl0eSBsZXZlbCBmb3IgdGhlIGNhbWNvcmRlciBwcm9maWxlCisgICAgICogQHBhcmFtIHF1YWxpdHkgdGhlIHRhcmdldCBxdWFsaXR5IGxldmVsIGZvciB0aGUgY2FtY29yZGVyIHByb2ZpbGUuCisgICAgICogQHNlZSAjUVVBTElUWV9MT1cKKyAgICAgKiBAc2VlICNRVUFMSVRZX0hJR0gKKyAgICAgKiBAc2VlICNRVUFMSVRZX1FDSUYKKyAgICAgKiBAc2VlICNRVUFMSVRZX0NJRgorICAgICAqIEBzZWUgI1FVQUxJVFlfNDgwUAorICAgICAqIEBzZWUgI1FVQUxJVFlfNzIwUAorICAgICAqIEBzZWUgI1FVQUxJVFlfMTA4MFAKKyAgICAgKiBAc2VlICNRVUFMSVRZX1RJTUVfTEFQU0VfTE9XCisgICAgICogQHNlZSAjUVVBTElUWV9USU1FX0xBUFNFX0hJR0gKKyAgICAgKiBAc2VlICNRVUFMSVRZX1RJTUVfTEFQU0VfUUNJRgorICAgICAqIEBzZWUgI1FVQUxJVFlfVElNRV9MQVBTRV9DSUYKKyAgICAgKiBAc2VlICNRVUFMSVRZX1RJTUVfTEFQU0VfNDgwUAorICAgICAqIEBzZWUgI1FVQUxJVFlfVElNRV9MQVBTRV83MjBQCisgICAgICogQHNlZSAjUVVBTElUWV9USU1FX0xBUFNFXzEwODBQCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBDYW1jb3JkZXJQcm9maWxlIGdldChpbnQgY2FtZXJhSWQsIGludCBxdWFsaXR5KSB7Ci0gICAgICAgIGlmIChxdWFsaXR5IDwgUVVBTElUWV9MT1cgfHwgcXVhbGl0eSA+IFFVQUxJVFlfSElHSCkgeworICAgICAgICBpZiAoISgocXVhbGl0eSA+PSBRVUFMSVRZX0xPVyAmJiBxdWFsaXR5IDw9IFFVQUxJVFlfMTA4MFApIHx8CisgICAgICAgICAgICAgICAgKHF1YWxpdHkgPj0gUVVBTElUWV9USU1FX0xBUFNFX0xPVyAmJiBxdWFsaXR5IDw9IFFVQUxJVFlfVElNRV9MQVBTRV8xMDgwUCkpKSB7CiAgICAgICAgICAgICBTdHJpbmcgZXJyTWVzc2FnZSA9ICJVbnN1cHBvcnRlZCBxdWFsaXR5IGxldmVsOiAiICsgcXVhbGl0eTsKICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oZXJyTWVzc2FnZSk7CiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIG5hdGl2ZV9nZXRfY2FtY29yZGVyX3Byb2ZpbGUoY2FtZXJhSWQsIHF1YWxpdHkpOwogICAgIH0KIAorICAgIC8qKgorICAgICAqIFJldHVybnMgdHJ1ZSBpZiBjYW1jb3JkZXIgcHJvZmlsZSBleGlzdHMgZm9yIHRoZSBkZWZhdWx0IGNhbWVyYSBhdAorICAgICAqIHRoZSBnaXZlbiBxdWFsaXR5IGxldmVsLgorICAgICAqIEBwYXJhbSBxdWFsaXR5IHRoZSB0YXJnZXQgcXVhbGl0eSBsZXZlbCBmb3IgdGhlIGNhbWNvcmRlciBwcm9maWxlCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBib29sZWFuIGhhc1Byb2ZpbGUoaW50IHF1YWxpdHkpIHsKKyAgICAgICAgcmV0dXJuIGhhc1Byb2ZpbGUoYW5kcm9pZC5oYXJkd2FyZS5DYW1lcmEuQ0FNRVJBX0lEX0RFRkFVTFQsIHF1YWxpdHkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdHJ1ZSBpZiBjYW1jb3JkZXIgcHJvZmlsZSBleGlzdHMgZm9yIHRoZSBnaXZlbiBjYW1lcmEgYXQKKyAgICAgKiB0aGUgZ2l2ZW4gcXVhbGl0eSBsZXZlbC4KKyAgICAgKiBAcGFyYW0gY2FtZXJhSWQgdGhlIGlkIGZvciB0aGUgY2FtZXJhCisgICAgICogQHBhcmFtIHF1YWxpdHkgdGhlIHRhcmdldCBxdWFsaXR5IGxldmVsIGZvciB0aGUgY2FtY29yZGVyIHByb2ZpbGUKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaGFzUHJvZmlsZShpbnQgY2FtZXJhSWQsIGludCBxdWFsaXR5KSB7CisgICAgICAgIHJldHVybiBuYXRpdmVfaGFzX2NhbWNvcmRlcl9wcm9maWxlKGNhbWVyYUlkLCBxdWFsaXR5KTsKKyAgICB9CisKICAgICBzdGF0aWMgewogICAgICAgICBTeXN0ZW0ubG9hZExpYnJhcnkoIm1lZGlhX2puaSIpOwogICAgICAgICBuYXRpdmVfaW5pdCgpOwpAQCAtMTc4LDQgKzI4Niw2IEBACiAgICAgcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIGZpbmFsIHZvaWQgbmF0aXZlX2luaXQoKTsKICAgICBwcml2YXRlIHN0YXRpYyBuYXRpdmUgZmluYWwgQ2FtY29yZGVyUHJvZmlsZSBuYXRpdmVfZ2V0X2NhbWNvcmRlcl9wcm9maWxlKAogICAgICAgICAgICAgaW50IGNhbWVyYUlkLCBpbnQgcXVhbGl0eSk7CisgICAgcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIGZpbmFsIGJvb2xlYW4gbmF0aXZlX2hhc19jYW1jb3JkZXJfcHJvZmlsZSgKKyAgICAgICAgICAgIGludCBjYW1lcmFJZCwgaW50IHF1YWxpdHkpOwogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvamF2YS9hbmRyb2lkL21lZGlhL01lZGlhRmlsZS5qYXZhIGIvbWVkaWEvamF2YS9hbmRyb2lkL21lZGlhL01lZGlhRmlsZS5qYXZhCmluZGV4IDZlNTI3ZDkuLjY2YTkzZjA0IDEwMDY0NAotLS0gYS9tZWRpYS9qYXZhL2FuZHJvaWQvbWVkaWEvTWVkaWFGaWxlLmphdmEKKysrIGIvbWVkaWEvamF2YS9hbmRyb2lkL21lZGlhL01lZGlhRmlsZS5qYXZhCkBAIC0zNCw4ICszNCw2IEBACiAgKiB7QGhpZGV9CiAgKi8KIHB1YmxpYyBjbGFzcyBNZWRpYUZpbGUgewotICAgIC8vIGNvbW1hIHNlcGFyYXRlZCBsaXN0IG9mIGFsbCBmaWxlIGV4dGVuc2lvbnMgc3VwcG9ydGVkIGJ5IHRoZSBtZWRpYSBzY2FubmVyCi0gICAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgc0ZpbGVFeHRlbnNpb25zOwogCiAgICAgLy8gQXVkaW8gZmlsZSB0eXBlcwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZJTEVfVFlQRV9NUDMgICAgID0gMTsKQEAgLTg0LDYgKzgyLDE3IEBACiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRklMRV9UWVBFX1dQTCAgICAgPSA0MzsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRklSU1RfUExBWUxJU1RfRklMRV9UWVBFID0gRklMRV9UWVBFX00zVTsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTEFTVF9QTEFZTElTVF9GSUxFX1RZUEUgPSBGSUxFX1RZUEVfV1BMOworCisgICAgLy8gT3RoZXIgcG9wdWxhciBmaWxlIHR5cGVzCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRklMRV9UWVBFX1RFWFQgICAgICAgICAgPSAxMDA7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRklMRV9UWVBFX0hUTUwgICAgICAgICAgPSAxMDE7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRklMRV9UWVBFX1BERiAgICAgICAgICAgPSAxMDI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRklMRV9UWVBFX1hNTCAgICAgICAgICAgPSAxMDM7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRklMRV9UWVBFX01TX1dPUkQgICAgICAgPSAxMDQ7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRklMRV9UWVBFX01TX0VYQ0VMICAgICAgPSAxMDU7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRklMRV9UWVBFX01TX1BPV0VSUE9JTlQgPSAxMDY7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRklMRV9UWVBFX0ZMQUMgICAgICAgICAgPSAxMDc7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRklMRV9UWVBFX1pJUCAgICAgICAgICAgPSAxMDg7CiAgICAgCiAgICAgc3RhdGljIGNsYXNzIE1lZGlhRmlsZVR5cGUgewogICAgIApAQCAtOTYsMTUgKzEwNSwzMiBAQAogICAgICAgICB9CiAgICAgfQogICAgIAotICAgIHByaXZhdGUgc3RhdGljIEhhc2hNYXA8U3RyaW5nLCBNZWRpYUZpbGVUeXBlPiBzRmlsZVR5cGVNYXAgCisgICAgcHJpdmF0ZSBzdGF0aWMgSGFzaE1hcDxTdHJpbmcsIE1lZGlhRmlsZVR5cGU+IHNGaWxlVHlwZU1hcAogICAgICAgICAgICAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE1lZGlhRmlsZVR5cGU+KCk7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgSGFzaE1hcDxTdHJpbmcsIEludGVnZXI+IHNNaW1lVHlwZU1hcCAKLSAgICAgICAgICAgID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBJbnRlZ2VyPigpOyAgICAgICAgICAgIAorICAgIHByaXZhdGUgc3RhdGljIEhhc2hNYXA8U3RyaW5nLCBJbnRlZ2VyPiBzTWltZVR5cGVNYXAKKyAgICAgICAgICAgID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBJbnRlZ2VyPigpOworICAgIC8vIG1hcHMgZmlsZSBleHRlbnNpb24gdG8gTVRQIGZvcm1hdCBjb2RlCisgICAgcHJpdmF0ZSBzdGF0aWMgSGFzaE1hcDxTdHJpbmcsIEludGVnZXI+IHNGaWxlVHlwZVRvRm9ybWF0TWFwCisgICAgICAgICAgICA9IG5ldyBIYXNoTWFwPFN0cmluZywgSW50ZWdlcj4oKTsKKyAgICAvLyBtYXBzIG1pbWUgdHlwZSB0byBNVFAgZm9ybWF0IGNvZGUKKyAgICBwcml2YXRlIHN0YXRpYyBIYXNoTWFwPFN0cmluZywgSW50ZWdlcj4gc01pbWVUeXBlVG9Gb3JtYXRNYXAKKyAgICAgICAgICAgID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBJbnRlZ2VyPigpOworICAgIC8vIG1hcHMgTVRQIGZvcm1hdCBjb2RlIHRvIG1pbWUgdHlwZQorICAgIHByaXZhdGUgc3RhdGljIEhhc2hNYXA8SW50ZWdlciwgU3RyaW5nPiBzRm9ybWF0VG9NaW1lVHlwZU1hcAorICAgICAgICAgICAgPSBuZXcgSGFzaE1hcDxJbnRlZ2VyLCBTdHJpbmc+KCk7CisKICAgICBzdGF0aWMgdm9pZCBhZGRGaWxlVHlwZShTdHJpbmcgZXh0ZW5zaW9uLCBpbnQgZmlsZVR5cGUsIFN0cmluZyBtaW1lVHlwZSkgewogICAgICAgICBzRmlsZVR5cGVNYXAucHV0KGV4dGVuc2lvbiwgbmV3IE1lZGlhRmlsZVR5cGUoZmlsZVR5cGUsIG1pbWVUeXBlKSk7CiAgICAgICAgIHNNaW1lVHlwZU1hcC5wdXQobWltZVR5cGUsIEludGVnZXIudmFsdWVPZihmaWxlVHlwZSkpOwogICAgIH0KIAorICAgIHN0YXRpYyB2b2lkIGFkZEZpbGVUeXBlKFN0cmluZyBleHRlbnNpb24sIGludCBmaWxlVHlwZSwgU3RyaW5nIG1pbWVUeXBlLCBpbnQgbXRwRm9ybWF0Q29kZSkgeworICAgICAgICBhZGRGaWxlVHlwZShleHRlbnNpb24sIGZpbGVUeXBlLCBtaW1lVHlwZSk7CisgICAgICAgIHNGaWxlVHlwZVRvRm9ybWF0TWFwLnB1dChleHRlbnNpb24sIEludGVnZXIudmFsdWVPZihtdHBGb3JtYXRDb2RlKSk7CisgICAgICAgIHNNaW1lVHlwZVRvRm9ybWF0TWFwLnB1dChtaW1lVHlwZSwgSW50ZWdlci52YWx1ZU9mKG10cEZvcm1hdENvZGUpKTsKKyAgICAgICAgc0Zvcm1hdFRvTWltZVR5cGVNYXAucHV0KG10cEZvcm1hdENvZGUsIG1pbWVUeXBlKTsKKyAgICB9CisKICAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzV01BRW5hYmxlZCgpIHsKICAgICAgICAgTGlzdDxBdWRpb0RlY29kZXI+IGRlY29kZXJzID0gRGVjb2RlckNhcGFiaWxpdGllcy5nZXRBdWRpb0RlY29kZXJzKCk7CiAgICAgICAgIGZvciAoQXVkaW9EZWNvZGVyIGRlY29kZXI6IGRlY29kZXJzKSB7CkBAIC0xMTUsMjggKzE0MSwxOCBAQAogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogCi0gICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc1dNVkVuYWJsZWQoKSB7Ci0gICAgICAgIExpc3Q8VmlkZW9EZWNvZGVyPiBkZWNvZGVycyA9IERlY29kZXJDYXBhYmlsaXRpZXMuZ2V0VmlkZW9EZWNvZGVycygpOwotICAgICAgICBmb3IgKFZpZGVvRGVjb2RlciBkZWNvZGVyOiBkZWNvZGVycykgewotICAgICAgICAgICAgaWYgKGRlY29kZXIgPT0gVmlkZW9EZWNvZGVyLlZJREVPX0RFQ09ERVJfV01WKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQogICAgIHN0YXRpYyB7Ci0gICAgICAgIGFkZEZpbGVUeXBlKCJNUDMiLCBGSUxFX1RZUEVfTVAzLCAiYXVkaW8vbXBlZyIpOwotICAgICAgICBhZGRGaWxlVHlwZSgiTTRBIiwgRklMRV9UWVBFX000QSwgImF1ZGlvL21wNCIpOwotICAgICAgICBhZGRGaWxlVHlwZSgiV0FWIiwgRklMRV9UWVBFX1dBViwgImF1ZGlvL3gtd2F2Iik7CisgICAgICAgIGFkZEZpbGVUeXBlKCJNUDMiLCBGSUxFX1RZUEVfTVAzLCAiYXVkaW8vbXBlZyIsIE10cENvbnN0YW50cy5GT1JNQVRfTVAzKTsKKyAgICAgICAgYWRkRmlsZVR5cGUoIk00QSIsIEZJTEVfVFlQRV9NNEEsICJhdWRpby9tcDQiLCBNdHBDb25zdGFudHMuRk9STUFUX01QRUcpOworICAgICAgICBhZGRGaWxlVHlwZSgiV0FWIiwgRklMRV9UWVBFX1dBViwgImF1ZGlvL3gtd2F2IiwgTXRwQ29uc3RhbnRzLkZPUk1BVF9XQVYpOwogICAgICAgICBhZGRGaWxlVHlwZSgiQU1SIiwgRklMRV9UWVBFX0FNUiwgImF1ZGlvL2FtciIpOwogICAgICAgICBhZGRGaWxlVHlwZSgiQVdCIiwgRklMRV9UWVBFX0FXQiwgImF1ZGlvL2Ftci13YiIpOwogICAgICAgICBpZiAoaXNXTUFFbmFibGVkKCkpIHsKLSAgICAgICAgICAgIGFkZEZpbGVUeXBlKCJXTUEiLCBGSUxFX1RZUEVfV01BLCAiYXVkaW8veC1tcy13bWEiKTsKKyAgICAgICAgICAgIGFkZEZpbGVUeXBlKCJXTUEiLCBGSUxFX1RZUEVfV01BLCAiYXVkaW8veC1tcy13bWEiLCBNdHBDb25zdGFudHMuRk9STUFUX1dNQSk7CiAgICAgICAgIH0KLSAgICAgICAgYWRkRmlsZVR5cGUoIk9HRyIsIEZJTEVfVFlQRV9PR0csICJhcHBsaWNhdGlvbi9vZ2ciKTsKLSAgICAgICAgYWRkRmlsZVR5cGUoIk9HQSIsIEZJTEVfVFlQRV9PR0csICJhcHBsaWNhdGlvbi9vZ2ciKTsKLSAgICAgICAgYWRkRmlsZVR5cGUoIkFBQyIsIEZJTEVfVFlQRV9BQUMsICJhdWRpby9hYWMiKTsKKyAgICAgICAgYWRkRmlsZVR5cGUoIk9HRyIsIEZJTEVfVFlQRV9PR0csICJhcHBsaWNhdGlvbi9vZ2ciLCBNdHBDb25zdGFudHMuRk9STUFUX09HRyk7CisgICAgICAgIGFkZEZpbGVUeXBlKCJPR0EiLCBGSUxFX1RZUEVfT0dHLCAiYXBwbGljYXRpb24vb2dnIiwgTXRwQ29uc3RhbnRzLkZPUk1BVF9PR0cpOworICAgICAgICBhZGRGaWxlVHlwZSgiQUFDIiwgRklMRV9UWVBFX0FBQywgImF1ZGlvL2FhYyIsIE10cENvbnN0YW50cy5GT1JNQVRfQUFDKTsKICAgICAgICAgYWRkRmlsZVR5cGUoIk1LQSIsIEZJTEVfVFlQRV9NS0EsICJhdWRpby94LW1hdHJvc2thIik7CiAgCiAgICAgICAgIGFkZEZpbGVUeXBlKCJNSUQiLCBGSUxFX1RZUEVfTUlELCAiYXVkaW8vbWlkaSIpOwpAQCAtMTQ4LDc4ICsxNjQsMTE4IEBACiAgICAgICAgIGFkZEZpbGVUeXBlKCJSVFgiLCBGSUxFX1RZUEVfTUlELCAiYXVkaW8vbWlkaSIpOwogICAgICAgICBhZGRGaWxlVHlwZSgiT1RBIiwgRklMRV9UWVBFX01JRCwgImF1ZGlvL21pZGkiKTsKICAgICAgICAgCi0gICAgICAgIGFkZEZpbGVUeXBlKCJNUEVHIiwgRklMRV9UWVBFX01QNCwgInZpZGVvL21wZWciKTsKLSAgICAgICAgYWRkRmlsZVR5cGUoIk1QNCIsIEZJTEVfVFlQRV9NUDQsICJ2aWRlby9tcDQiKTsKLSAgICAgICAgYWRkRmlsZVR5cGUoIk00ViIsIEZJTEVfVFlQRV9NNFYsICJ2aWRlby9tcDQiKTsKLSAgICAgICAgYWRkRmlsZVR5cGUoIjNHUCIsIEZJTEVfVFlQRV8zR1BQLCAidmlkZW8vM2dwcCIpOwotICAgICAgICBhZGRGaWxlVHlwZSgiM0dQUCIsIEZJTEVfVFlQRV8zR1BQLCAidmlkZW8vM2dwcCIpOwotICAgICAgICBhZGRGaWxlVHlwZSgiM0cyIiwgRklMRV9UWVBFXzNHUFAyLCAidmlkZW8vM2dwcDIiKTsKLSAgICAgICAgYWRkRmlsZVR5cGUoIjNHUFAyIiwgRklMRV9UWVBFXzNHUFAyLCAidmlkZW8vM2dwcDIiKTsKKyAgICAgICAgYWRkRmlsZVR5cGUoIk1QRUciLCBGSUxFX1RZUEVfTVA0LCAidmlkZW8vbXBlZyIsIE10cENvbnN0YW50cy5GT1JNQVRfTVBFRyk7CisgICAgICAgIGFkZEZpbGVUeXBlKCJNUDQiLCBGSUxFX1RZUEVfTVA0LCAidmlkZW8vbXA0IiwgTXRwQ29uc3RhbnRzLkZPUk1BVF9NUEVHKTsKKyAgICAgICAgYWRkRmlsZVR5cGUoIk00ViIsIEZJTEVfVFlQRV9NNFYsICJ2aWRlby9tcDQiLCBNdHBDb25zdGFudHMuRk9STUFUX01QRUcpOworICAgICAgICBhZGRGaWxlVHlwZSgiM0dQIiwgRklMRV9UWVBFXzNHUFAsICJ2aWRlby8zZ3BwIiwgIE10cENvbnN0YW50cy5GT1JNQVRfM0dQX0NPTlRBSU5FUik7CisgICAgICAgIGFkZEZpbGVUeXBlKCIzR1BQIiwgRklMRV9UWVBFXzNHUFAsICJ2aWRlby8zZ3BwIiwgTXRwQ29uc3RhbnRzLkZPUk1BVF8zR1BfQ09OVEFJTkVSKTsKKyAgICAgICAgYWRkRmlsZVR5cGUoIjNHMiIsIEZJTEVfVFlQRV8zR1BQMiwgInZpZGVvLzNncHAyIiwgTXRwQ29uc3RhbnRzLkZPUk1BVF8zR1BfQ09OVEFJTkVSKTsKKyAgICAgICAgYWRkRmlsZVR5cGUoIjNHUFAyIiwgRklMRV9UWVBFXzNHUFAyLCAidmlkZW8vM2dwcDIiLCBNdHBDb25zdGFudHMuRk9STUFUXzNHUF9DT05UQUlORVIpOwogICAgICAgICBhZGRGaWxlVHlwZSgiTUtWIiwgRklMRV9UWVBFX01LViwgInZpZGVvL3gtbWF0cm9za2EiKTsKICAgICAgICAgYWRkRmlsZVR5cGUoIldFQk0iLCBGSUxFX1RZUEVfTUtWLCAidmlkZW8veC1tYXRyb3NrYSIpOwogICAgICAgICBhZGRGaWxlVHlwZSgiVFMiLCBGSUxFX1RZUEVfTVAyVFMsICJ2aWRlby9tcDJ0cyIpOwogCi0gICAgICAgIGlmIChpc1dNVkVuYWJsZWQoKSkgewotICAgICAgICAgICAgYWRkRmlsZVR5cGUoIldNViIsIEZJTEVfVFlQRV9XTVYsICJ2aWRlby94LW1zLXdtdiIpOwotICAgICAgICAgICAgYWRkRmlsZVR5cGUoIkFTRiIsIEZJTEVfVFlQRV9BU0YsICJ2aWRlby94LW1zLWFzZiIpOwotICAgICAgICB9CisgICAgICAgIGFkZEZpbGVUeXBlKCJXTVYiLCBGSUxFX1RZUEVfV01WLCAidmlkZW8veC1tcy13bXYiLCBNdHBDb25zdGFudHMuRk9STUFUX1dNVik7CisgICAgICAgIGFkZEZpbGVUeXBlKCJBU0YiLCBGSUxFX1RZUEVfQVNGLCAidmlkZW8veC1tcy1hc2YiKTsKIAotICAgICAgICBhZGRGaWxlVHlwZSgiSlBHIiwgRklMRV9UWVBFX0pQRUcsICJpbWFnZS9qcGVnIik7Ci0gICAgICAgIGFkZEZpbGVUeXBlKCJKUEVHIiwgRklMRV9UWVBFX0pQRUcsICJpbWFnZS9qcGVnIik7Ci0gICAgICAgIGFkZEZpbGVUeXBlKCJHSUYiLCBGSUxFX1RZUEVfR0lGLCAiaW1hZ2UvZ2lmIik7Ci0gICAgICAgIGFkZEZpbGVUeXBlKCJQTkciLCBGSUxFX1RZUEVfUE5HLCAiaW1hZ2UvcG5nIik7Ci0gICAgICAgIGFkZEZpbGVUeXBlKCJCTVAiLCBGSUxFX1RZUEVfQk1QLCAiaW1hZ2UveC1tcy1ibXAiKTsKKyAgICAgICAgYWRkRmlsZVR5cGUoIkpQRyIsIEZJTEVfVFlQRV9KUEVHLCAiaW1hZ2UvanBlZyIsIE10cENvbnN0YW50cy5GT1JNQVRfRVhJRl9KUEVHKTsKKyAgICAgICAgYWRkRmlsZVR5cGUoIkpQRUciLCBGSUxFX1RZUEVfSlBFRywgImltYWdlL2pwZWciLCBNdHBDb25zdGFudHMuRk9STUFUX0VYSUZfSlBFRyk7CisgICAgICAgIGFkZEZpbGVUeXBlKCJHSUYiLCBGSUxFX1RZUEVfR0lGLCAiaW1hZ2UvZ2lmIiwgTXRwQ29uc3RhbnRzLkZPUk1BVF9HSUYpOworICAgICAgICBhZGRGaWxlVHlwZSgiUE5HIiwgRklMRV9UWVBFX1BORywgImltYWdlL3BuZyIsIE10cENvbnN0YW50cy5GT1JNQVRfUE5HKTsKKyAgICAgICAgYWRkRmlsZVR5cGUoIkJNUCIsIEZJTEVfVFlQRV9CTVAsICJpbWFnZS94LW1zLWJtcCIsIE10cENvbnN0YW50cy5GT1JNQVRfQk1QKTsKICAgICAgICAgYWRkRmlsZVR5cGUoIldCTVAiLCBGSUxFX1RZUEVfV0JNUCwgImltYWdlL3ZuZC53YXAud2JtcCIpOwogIAotICAgICAgICBhZGRGaWxlVHlwZSgiTTNVIiwgRklMRV9UWVBFX00zVSwgImF1ZGlvL3gtbXBlZ3VybCIpOwotICAgICAgICBhZGRGaWxlVHlwZSgiUExTIiwgRklMRV9UWVBFX1BMUywgImF1ZGlvL3gtc2NwbHMiKTsKLSAgICAgICAgYWRkRmlsZVR5cGUoIldQTCIsIEZJTEVfVFlQRV9XUEwsICJhcHBsaWNhdGlvbi92bmQubXMtd3BsIik7CisgICAgICAgIGFkZEZpbGVUeXBlKCJNM1UiLCBGSUxFX1RZUEVfTTNVLCAiYXVkaW8veC1tcGVndXJsIiwgTXRwQ29uc3RhbnRzLkZPUk1BVF9NM1VfUExBWUxJU1QpOworICAgICAgICBhZGRGaWxlVHlwZSgiUExTIiwgRklMRV9UWVBFX1BMUywgImF1ZGlvL3gtc2NwbHMiLCBNdHBDb25zdGFudHMuRk9STUFUX1BMU19QTEFZTElTVCk7CisgICAgICAgIGFkZEZpbGVUeXBlKCJXUEwiLCBGSUxFX1RZUEVfV1BMLCAiYXBwbGljYXRpb24vdm5kLm1zLXdwbCIsIE10cENvbnN0YW50cy5GT1JNQVRfV1BMX1BMQVlMSVNUKTsKIAotICAgICAgICAvLyBjb21wdXRlIGZpbGUgZXh0ZW5zaW9ucyBsaXN0IGZvciBuYXRpdmUgTWVkaWEgU2Nhbm5lcgotICAgICAgICBTdHJpbmdCdWlsZGVyIGJ1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotICAgICAgICBJdGVyYXRvcjxTdHJpbmc+IGl0ZXJhdG9yID0gc0ZpbGVUeXBlTWFwLmtleVNldCgpLml0ZXJhdG9yKCk7Ci0gICAgICAgIAotICAgICAgICB3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICBpZiAoYnVpbGRlci5sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICAgICAgICBidWlsZGVyLmFwcGVuZCgnLCcpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoaXRlcmF0b3IubmV4dCgpKTsKLSAgICAgICAgfSAKLSAgICAgICAgc0ZpbGVFeHRlbnNpb25zID0gYnVpbGRlci50b1N0cmluZygpOworICAgICAgICBhZGRGaWxlVHlwZSgiVFhUIiwgRklMRV9UWVBFX1RFWFQsICJ0ZXh0L3BsYWluIiwgTXRwQ29uc3RhbnRzLkZPUk1BVF9URVhUKTsKKyAgICAgICAgYWRkRmlsZVR5cGUoIkhUTSIsIEZJTEVfVFlQRV9IVE1MLCAidGV4dC9odG1sIiwgTXRwQ29uc3RhbnRzLkZPUk1BVF9IVE1MKTsKKyAgICAgICAgYWRkRmlsZVR5cGUoIkhUTUwiLCBGSUxFX1RZUEVfSFRNTCwgInRleHQvaHRtbCIsIE10cENvbnN0YW50cy5GT1JNQVRfSFRNTCk7CisgICAgICAgIGFkZEZpbGVUeXBlKCJQREYiLCBGSUxFX1RZUEVfUERGLCAiYXBwbGljYXRpb24vcGRmIik7CisgICAgICAgIGFkZEZpbGVUeXBlKCJET0MiLCBGSUxFX1RZUEVfTVNfV09SRCwgImFwcGxpY2F0aW9uL21zd29yZCIsIE10cENvbnN0YW50cy5GT1JNQVRfTVNfV09SRF9ET0NVTUVOVCk7CisgICAgICAgIGFkZEZpbGVUeXBlKCJYTFMiLCBGSUxFX1RZUEVfTVNfRVhDRUwsICJhcHBsaWNhdGlvbi92bmQubXMtZXhjZWwiLCBNdHBDb25zdGFudHMuRk9STUFUX01TX0VYQ0VMX1NQUkVBRFNIRUVUKTsKKyAgICAgICAgYWRkRmlsZVR5cGUoIlBQVCIsIEZJTEVfVFlQRV9NU19QT1dFUlBPSU5ULCAiYXBwbGljYXRpb24vbXNwb3dlcnBvaW50IiwgTXRwQ29uc3RhbnRzLkZPUk1BVF9NU19QT1dFUlBPSU5UX1BSRVNFTlRBVElPTik7CisgICAgICAgIGFkZEZpbGVUeXBlKCJGTEFDIiwgRklMRV9UWVBFX0ZMQUMsICJhdWRpby9mbGFjIiwgTXRwQ29uc3RhbnRzLkZPUk1BVF9GTEFDKTsKKyAgICAgICAgYWRkRmlsZVR5cGUoIlpJUCIsIEZJTEVfVFlQRV9aSVAsICJhcHBsaWNhdGlvbi96aXAiKTsKICAgICB9Ci0gICAgCisKICAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNBdWRpb0ZpbGVUeXBlKGludCBmaWxlVHlwZSkgewogICAgICAgICByZXR1cm4gKChmaWxlVHlwZSA+PSBGSVJTVF9BVURJT19GSUxFX1RZUEUgJiYKICAgICAgICAgICAgICAgICBmaWxlVHlwZSA8PSBMQVNUX0FVRElPX0ZJTEVfVFlQRSkgfHwKICAgICAgICAgICAgICAgICAoZmlsZVR5cGUgPj0gRklSU1RfTUlESV9GSUxFX1RZUEUgJiYKICAgICAgICAgICAgICAgICBmaWxlVHlwZSA8PSBMQVNUX01JRElfRklMRV9UWVBFKSk7CiAgICAgfQotICAgIAorCiAgICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzVmlkZW9GaWxlVHlwZShpbnQgZmlsZVR5cGUpIHsKICAgICAgICAgcmV0dXJuIChmaWxlVHlwZSA+PSBGSVJTVF9WSURFT19GSUxFX1RZUEUgJiYKICAgICAgICAgICAgICAgICBmaWxlVHlwZSA8PSBMQVNUX1ZJREVPX0ZJTEVfVFlQRSk7CiAgICAgfQotICAgIAorCiAgICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzSW1hZ2VGaWxlVHlwZShpbnQgZmlsZVR5cGUpIHsKICAgICAgICAgcmV0dXJuIChmaWxlVHlwZSA+PSBGSVJTVF9JTUFHRV9GSUxFX1RZUEUgJiYKICAgICAgICAgICAgICAgICBmaWxlVHlwZSA8PSBMQVNUX0lNQUdFX0ZJTEVfVFlQRSk7CiAgICAgfQotICAgIAorCiAgICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzUGxheUxpc3RGaWxlVHlwZShpbnQgZmlsZVR5cGUpIHsKICAgICAgICAgcmV0dXJuIChmaWxlVHlwZSA+PSBGSVJTVF9QTEFZTElTVF9GSUxFX1RZUEUgJiYKICAgICAgICAgICAgICAgICBmaWxlVHlwZSA8PSBMQVNUX1BMQVlMSVNUX0ZJTEVfVFlQRSk7CiAgICAgfQotICAgIAorCiAgICAgcHVibGljIHN0YXRpYyBNZWRpYUZpbGVUeXBlIGdldEZpbGVUeXBlKFN0cmluZyBwYXRoKSB7CiAgICAgICAgIGludCBsYXN0RG90ID0gcGF0aC5sYXN0SW5kZXhPZigiLiIpOwogICAgICAgICBpZiAobGFzdERvdCA8IDApCiAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgcmV0dXJuIHNGaWxlVHlwZU1hcC5nZXQocGF0aC5zdWJzdHJpbmcobGFzdERvdCArIDEpLnRvVXBwZXJDYXNlKCkpOwogICAgIH0KLSAgICAKKworICAgIC8vIGdlbmVyYXRlcyBhIHRpdGxlIGJhc2VkIG9uIGZpbGUgbmFtZQorICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEZpbGVUaXRsZShTdHJpbmcgcGF0aCkgeworICAgICAgICAvLyBleHRyYWN0IGZpbGUgbmFtZSBhZnRlciBsYXN0IHNsYXNoCisgICAgICAgIGludCBsYXN0U2xhc2ggPSBwYXRoLmxhc3RJbmRleE9mKCcvJyk7CisgICAgICAgIGlmIChsYXN0U2xhc2ggPj0gMCkgeworICAgICAgICAgICAgbGFzdFNsYXNoKys7CisgICAgICAgICAgICBpZiAobGFzdFNsYXNoIDwgcGF0aC5sZW5ndGgoKSkgeworICAgICAgICAgICAgICAgIHBhdGggPSBwYXRoLnN1YnN0cmluZyhsYXN0U2xhc2gpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8vIHRydW5jYXRlIHRoZSBmaWxlIGV4dGVuc2lvbiAoaWYgYW55KQorICAgICAgICBpbnQgbGFzdERvdCA9IHBhdGgubGFzdEluZGV4T2YoJy4nKTsKKyAgICAgICAgaWYgKGxhc3REb3QgPiAwKSB7CisgICAgICAgICAgICBwYXRoID0gcGF0aC5zdWJzdHJpbmcoMCwgbGFzdERvdCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHBhdGg7CisgICAgfQorCiAgICAgcHVibGljIHN0YXRpYyBpbnQgZ2V0RmlsZVR5cGVGb3JNaW1lVHlwZShTdHJpbmcgbWltZVR5cGUpIHsKICAgICAgICAgSW50ZWdlciB2YWx1ZSA9IHNNaW1lVHlwZU1hcC5nZXQobWltZVR5cGUpOwogICAgICAgICByZXR1cm4gKHZhbHVlID09IG51bGwgPyAwIDogdmFsdWUuaW50VmFsdWUoKSk7CiAgICAgfQogCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0TWltZVR5cGVGb3JGaWxlKFN0cmluZyBwYXRoKSB7CisgICAgICAgIE1lZGlhRmlsZVR5cGUgbWVkaWFGaWxlVHlwZSA9IGdldEZpbGVUeXBlKHBhdGgpOworICAgICAgICByZXR1cm4gKG1lZGlhRmlsZVR5cGUgPT0gbnVsbCA/IG51bGwgOiBtZWRpYUZpbGVUeXBlLm1pbWVUeXBlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGludCBnZXRGb3JtYXRDb2RlKFN0cmluZyBmaWxlTmFtZSwgU3RyaW5nIG1pbWVUeXBlKSB7CisgICAgICAgIGlmIChtaW1lVHlwZSAhPSBudWxsKSB7CisgICAgICAgICAgICBJbnRlZ2VyIHZhbHVlID0gc01pbWVUeXBlVG9Gb3JtYXRNYXAuZ2V0KG1pbWVUeXBlKTsKKyAgICAgICAgICAgIGlmICh2YWx1ZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlLmludFZhbHVlKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaW50IGxhc3REb3QgPSBmaWxlTmFtZS5sYXN0SW5kZXhPZignLicpOworICAgICAgICBpZiAobGFzdERvdCA+IDApIHsKKyAgICAgICAgICAgIFN0cmluZyBleHRlbnNpb24gPSBmaWxlTmFtZS5zdWJzdHJpbmcobGFzdERvdCArIDEpOworICAgICAgICAgICAgSW50ZWdlciB2YWx1ZSA9IHNGaWxlVHlwZVRvRm9ybWF0TWFwLmdldChleHRlbnNpb24pOworICAgICAgICAgICAgaWYgKHZhbHVlICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWUuaW50VmFsdWUoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gTXRwQ29uc3RhbnRzLkZPUk1BVF9VTkRFRklORUQ7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0TWltZVR5cGVGb3JGb3JtYXRDb2RlKGludCBmb3JtYXRDb2RlKSB7CisgICAgICAgIHJldHVybiBzRm9ybWF0VG9NaW1lVHlwZU1hcC5nZXQoZm9ybWF0Q29kZSk7CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvamF2YS9hbmRyb2lkL21lZGlhL01lZGlhUmVjb3JkZXIuamF2YSBiL21lZGlhL2phdmEvYW5kcm9pZC9tZWRpYS9NZWRpYVJlY29yZGVyLmphdmEKaW5kZXggMzRhODZlYy4uZGQxOTQ1MCAxMDA2NDQKLS0tIGEvbWVkaWEvamF2YS9hbmRyb2lkL21lZGlhL01lZGlhUmVjb3JkZXIuamF2YQorKysgYi9tZWRpYS9qYXZhL2FuZHJvaWQvbWVkaWEvTWVkaWFSZWNvcmRlci5qYXZhCkBAIC03Miw2ICs3Miw5IEBACiAKICAgICBwcml2YXRlIFN0cmluZyBtUGF0aDsKICAgICBwcml2YXRlIEZpbGVEZXNjcmlwdG9yIG1GZDsKKyAgICBwcml2YXRlIGJvb2xlYW4gbVByZXBhcmVBdXhpbGlhcnlGaWxlID0gZmFsc2U7CisgICAgcHJpdmF0ZSBTdHJpbmcgbVBhdGhBdXg7CisgICAgcHJpdmF0ZSBGaWxlRGVzY3JpcHRvciBtRmRBdXg7CiAgICAgcHJpdmF0ZSBFdmVudEhhbmRsZXIgbUV2ZW50SGFuZGxlcjsKICAgICBwcml2YXRlIE9uRXJyb3JMaXN0ZW5lciBtT25FcnJvckxpc3RlbmVyOwogICAgIHByaXZhdGUgT25JbmZvTGlzdGVuZXIgbU9uSW5mb0xpc3RlbmVyOwpAQCAtMjc0LDExICsyNzcsMzcgQEAKICAgICAgICAgc2V0VmlkZW9GcmFtZVJhdGUocHJvZmlsZS52aWRlb0ZyYW1lUmF0ZSk7CiAgICAgICAgIHNldFZpZGVvU2l6ZShwcm9maWxlLnZpZGVvRnJhbWVXaWR0aCwgcHJvZmlsZS52aWRlb0ZyYW1lSGVpZ2h0KTsKICAgICAgICAgc2V0VmlkZW9FbmNvZGluZ0JpdFJhdGUocHJvZmlsZS52aWRlb0JpdFJhdGUpOwotICAgICAgICBzZXRBdWRpb0VuY29kaW5nQml0UmF0ZShwcm9maWxlLmF1ZGlvQml0UmF0ZSk7Ci0gICAgICAgIHNldEF1ZGlvQ2hhbm5lbHMocHJvZmlsZS5hdWRpb0NoYW5uZWxzKTsKLSAgICAgICAgc2V0QXVkaW9TYW1wbGluZ1JhdGUocHJvZmlsZS5hdWRpb1NhbXBsZVJhdGUpOwogICAgICAgICBzZXRWaWRlb0VuY29kZXIocHJvZmlsZS52aWRlb0NvZGVjKTsKLSAgICAgICAgc2V0QXVkaW9FbmNvZGVyKHByb2ZpbGUuYXVkaW9Db2RlYyk7CisgICAgICAgIGlmIChwcm9maWxlLnF1YWxpdHkgPj0gQ2FtY29yZGVyUHJvZmlsZS5RVUFMSVRZX1RJTUVfTEFQU0VfTE9XICYmCisgICAgICAgICAgICAgcHJvZmlsZS5xdWFsaXR5IDw9IENhbWNvcmRlclByb2ZpbGUuUVVBTElUWV9USU1FX0xBUFNFXzEwODBQKSB7CisgICAgICAgICAgICAvLyBFbmFibGUgdGltZSBsYXBzZS4gQWxzbyBkb24ndCBzZXQgYXVkaW8gZm9yIHRpbWUgbGFwc2UuCisgICAgICAgICAgICBzZXRQYXJhbWV0ZXIoU3RyaW5nLmZvcm1hdCgidGltZS1sYXBzZS1lbmFibGU9MSIpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHNldEF1ZGlvRW5jb2RpbmdCaXRSYXRlKHByb2ZpbGUuYXVkaW9CaXRSYXRlKTsKKyAgICAgICAgICAgIHNldEF1ZGlvQ2hhbm5lbHMocHJvZmlsZS5hdWRpb0NoYW5uZWxzKTsKKyAgICAgICAgICAgIHNldEF1ZGlvU2FtcGxpbmdSYXRlKHByb2ZpbGUuYXVkaW9TYW1wbGVSYXRlKTsKKyAgICAgICAgICAgIHNldEF1ZGlvRW5jb2Rlcihwcm9maWxlLmF1ZGlvQ29kZWMpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHZpZGVvIGZyYW1lIGNhcHR1cmUgcmF0ZS4gVGhpcyBjYW4gYmUgdXNlZCB0byBzZXQgYSBkaWZmZXJlbnQgdmlkZW8gZnJhbWUgY2FwdHVyZQorICAgICAqIHJhdGUgdGhhbiB0aGUgcmVjb3JkZWQgdmlkZW8ncyBwbGF5YmFjayByYXRlLiBDdXJyZW50bHkgdGhpcyB3b3JrcyBvbmx5IGZvciB0aW1lIGxhcHNlIG1vZGUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZnBzIFJhdGUgYXQgd2hpY2ggZnJhbWVzIHNob3VsZCBiZSBjYXB0dXJlZCBpbiBmcmFtZXMgcGVyIHNlY29uZC4KKyAgICAgKiBUaGUgZnBzIGNhbiBnbyBhcyBsb3cgYXMgZGVzaXJlZC4gSG93ZXZlciB0aGUgZmFzdGVzdCBmcHMgd2lsbCBiZSBsaW1pdGVkIGJ5IHRoZSBoYXJkd2FyZS4KKyAgICAgKiBGb3IgcmVzb2x1dGlvbnMgdGhhdCBjYW4gYmUgY2FwdHVyZWQgYnkgdGhlIHZpZGVvIGNhbWVyYSwgdGhlIGZhc3Rlc3QgZnBzIGNhbiBiZSBjb21wdXRlZCB1c2luZworICAgICAqIHtAbGluayBhbmRyb2lkLmhhcmR3YXJlLkNhbWVyYS5QYXJhbWV0ZXJzI2dldFByZXZpZXdGcHNSYW5nZShpbnRbXSl9LiBGb3IgaGlnaGVyCisgICAgICogcmVzb2x1dGlvbnMgdGhlIGZhc3Rlc3QgZnBzIG1heSBiZSBtb3JlIHJlc3RyaWN0aXZlLgorICAgICAqIE5vdGUgdGhhdCB0aGUgcmVjb3JkZXIgY2Fubm90IGd1YXJhbnRlZSB0aGF0IGZyYW1lcyB3aWxsIGJlIGNhcHR1cmVkIGF0IHRoZQorICAgICAqIGdpdmVuIHJhdGUgZHVlIHRvIGNhbWVyYS9lbmNvZGVyIGxpbWl0YXRpb25zLiBIb3dldmVyIGl0IHRyaWVzIHRvIGJlIGFzIGNsb3NlIGFzCisgICAgICogcG9zc2libGUuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Q2FwdHVyZVJhdGUoZG91YmxlIGZwcykgeworICAgICAgICBkb3VibGUgdGltZUJldHdlZW5GcmFtZUNhcHR1cmUgPSAxIC8gZnBzOworICAgICAgICBpbnQgdGltZUJldHdlZW5GcmFtZUNhcHR1cmVNcyA9IChpbnQpICgxMDAwICogdGltZUJldHdlZW5GcmFtZUNhcHR1cmUpOworICAgICAgICBzZXRQYXJhbWV0ZXIoU3RyaW5nLmZvcm1hdCgidGltZS1iZXR3ZWVuLXRpbWUtbGFwc2UtZnJhbWUtY2FwdHVyZT0lZCIsCisgICAgICAgICAgICAgICAgICAgIHRpbWVCZXR3ZWVuRnJhbWVDYXB0dXJlTXMpKTsKICAgICB9CiAKICAgICAvKioKQEAgLTQ0OCw2ICs0NzcsOTcgQEAKICAgICB9CiAKICAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBsZXZlbCBvZiB0aGUgZW5jb2Rlci4gQ2FsbCB0aGlzIGJlZm9yZSBwcmVwYXJlKCkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZW5jb2RlckxldmVsIHRoZSB2aWRlbyBlbmNvZGVyIGxldmVsLgorICAgICAqIEBoaWRlCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0VmlkZW9FbmNvZGVyTGV2ZWwoaW50IGVuY29kZXJMZXZlbCkgeworICAgICAgICBzZXRQYXJhbWV0ZXIoU3RyaW5nLmZvcm1hdCgidmlkZW8tcGFyYW0tZW5jb2Rlci1sZXZlbD0lZCIsIGVuY29kZXJMZXZlbCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIGF1eGlsaWFyeSB0aW1lIGxhcHNlIHZpZGVvJ3MgcmVzb2x1dGlvbiBhbmQgYml0cmF0ZS4KKyAgICAgKgorICAgICAqIFRoZSBhdXhpbGlhcnkgdmlkZW8ncyByZXNvbHV0aW9uIGFuZCBiaXRyYXRlIGFyZSBkZXRlcm1pbmVkIGJ5IHRoZSBDYW1jb3JkZXJQcm9maWxlCisgICAgICogcXVhbGl0eSBsZXZlbCB7QGxpbmsgYW5kcm9pZC5tZWRpYS5DYW1jb3JkZXJQcm9maWxlI1FVQUxJVFlfSElHSH0uCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIHNldEF1eFZpZGVvUGFyYW1ldGVycygpIHsKKyAgICAgICAgQ2FtY29yZGVyUHJvZmlsZSBwcm9maWxlID0gQ2FtY29yZGVyUHJvZmlsZS5nZXQoQ2FtY29yZGVyUHJvZmlsZS5RVUFMSVRZX0hJR0gpOworICAgICAgICBzZXRQYXJhbWV0ZXIoU3RyaW5nLmZvcm1hdCgidmlkZW8tYXV4LXBhcmFtLXdpZHRoPSVkIiwgcHJvZmlsZS52aWRlb0ZyYW1lV2lkdGgpKTsKKyAgICAgICAgc2V0UGFyYW1ldGVyKFN0cmluZy5mb3JtYXQoInZpZGVvLWF1eC1wYXJhbS1oZWlnaHQ9JWQiLCBwcm9maWxlLnZpZGVvRnJhbWVIZWlnaHQpKTsKKyAgICAgICAgc2V0UGFyYW1ldGVyKFN0cmluZy5mb3JtYXQoInZpZGVvLWF1eC1wYXJhbS1lbmNvZGluZy1iaXRyYXRlPSVkIiwgcHJvZmlsZS52aWRlb0JpdFJhdGUpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQYXNzIGluIHRoZSBmaWxlIGRlc2NyaXB0b3IgZm9yIHRoZSBhdXhpbGlhcnkgdGltZSBsYXBzZSB2aWRlby4gQ2FsbCB0aGlzIGJlZm9yZQorICAgICAqIHByZXBhcmUoKS4KKyAgICAgKgorICAgICAqIFNldHMgZmlsZSBkZXNjcmlwdG9yIGFuZCBwYXJhbWV0ZXJzIGZvciBhdXhpbGlhcnkgdGltZSBsYXBzZSB2aWRlby4gVGltZSBsYXBzZSBtb2RlCisgICAgICogY2FuIGNhcHR1cmUgdmlkZW8gKHVzaW5nIHRoZSBzdGlsbCBjYW1lcmEpIGF0IHJlc29sdXRpb25zIGhpZ2hlciB0aGFuIHRoYXQgY2FuIGJlCisgICAgICogcGxheWVkIGJhY2sgb24gdGhlIGRldmljZS4gVGhpcyBmdW5jdGlvbiBvcgorICAgICAqIHtAbGluayAjc2V0QXV4aWxpYXJ5T3V0cHV0RmlsZShTdHJpbmcpfSBlbmFibGUgY2FwdHVyZSBvZiBhIHNtYWxsZXIgdmlkZW8gaW4KKyAgICAgKiBwYXJhbGxlbCB3aXRoIHRoZSBtYWluIHRpbWUgbGFwc2UgdmlkZW8sIHdoaWNoIGNhbiBiZSB1c2VkIHRvIHBsYXkgYmFjayBvbiB0aGUKKyAgICAgKiBkZXZpY2UuIFRoZSBzbWFsbGVyIHZpZGVvIGlzIGNyZWF0ZWQgYnkgZG93bnNhbXBsaW5nIHRoZSBtYWluIHZpZGVvLiBUaGlzIGNhbGwgaXMKKyAgICAgKiBvcHRpb25hbCBhbmQgZG9lcyBub3QgaGF2ZSB0byBiZSBjYWxsZWQgaWYgcGFyYWxsZWwgY2FwdHVyZSBvZiBhIGRvd25zYW1wbGVkIHZpZGVvCisgICAgICogaXMgbm90IGRlc2lyZWQuCisgICAgICoKKyAgICAgKiBOb3RlIHRoYXQgd2hpbGUgdGhlIG1haW4gdmlkZW8gcmVzb2x1dGlvbiBhbmQgYml0cmF0ZSBpcyBkZXRlcm1pbmVkIGZyb20gdGhlCisgICAgICogQ2FtY29yZGVyUHJvZmlsZSBpbiB7QGxpbmsgI3NldFByb2ZpbGUoQ2FtY29yZGVyUHJvZmlsZSl9LCB0aGUgYXV4aWxpYXJ5IHZpZGVvJ3MKKyAgICAgKiByZXNvbHV0aW9uIGFuZCBiaXRyYXRlIGFyZSBkZXRlcm1pbmVkIGJ5IHRoZSBDYW1jb3JkZXJQcm9maWxlIHF1YWxpdHkgbGV2ZWwKKyAgICAgKiB7QGxpbmsgYW5kcm9pZC5tZWRpYS5DYW1jb3JkZXJQcm9maWxlI1FVQUxJVFlfSElHSH0uIEFsbCBvdGhlciBlbmNvZGluZyBwYXJhbWV0ZXJzCisgICAgICogcmVtYWluIHRoZSBzYW1lIGZvciB0aGUgbWFpbiB2aWRlbyBhbmQgdGhlIGF1eGlsaWFyeSB2aWRlby4KKyAgICAgKgorICAgICAqIEUuZy4gaWYgdGhlIGRldmljZSBzdXBwb3J0cyB0aGUgdGltZSBsYXBzZSBwcm9maWxlIHF1YWxpdHkgbGV2ZWwKKyAgICAgKiB7QGxpbmsgYW5kcm9pZC5tZWRpYS5DYW1jb3JkZXJQcm9maWxlI1FVQUxJVFlfVElNRV9MQVBTRV8xMDgwUH0gYnV0IGNhbiBwbGF5YmFjayBhdAorICAgICAqIG1vc3QgNDgwcCwgdGhlIGFwcGxpY2F0aW9uIG1pZ2h0IHdhbnQgdG8gY2FwdHVyZSBhbiBhdXhpbGlhcnkgdmlkZW8gb2YgcmVzb2x1dGlvbgorICAgICAqIDQ4MHAgdXNpbmcgdGhpcyBjYWxsLgorICAgICAqCisgICAgICogQHBhcmFtIGZkIGFuIG9wZW4gZmlsZSBkZXNjcmlwdG9yIHRvIGJlIHdyaXR0ZW4gaW50by4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRBdXhpbGlhcnlPdXRwdXRGaWxlKEZpbGVEZXNjcmlwdG9yIGZkKQorICAgIHsKKyAgICAgICAgbVByZXBhcmVBdXhpbGlhcnlGaWxlID0gdHJ1ZTsKKyAgICAgICAgbVBhdGhBdXggPSBudWxsOworICAgICAgICBtRmRBdXggPSBmZDsKKyAgICAgICAgc2V0QXV4VmlkZW9QYXJhbWV0ZXJzKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUGFzcyBpbiB0aGUgZmlsZSBwYXRoIGZvciB0aGUgYXV4aWxpYXJ5IHRpbWUgbGFwc2UgdmlkZW8uIENhbGwgdGhpcyBiZWZvcmUKKyAgICAgKiBwcmVwYXJlKCkuCisgICAgICoKKyAgICAgKiBTZXRzIGZpbGUgcGF0aCBhbmQgcGFyYW1ldGVycyBmb3IgYXV4aWxpYXJ5IHRpbWUgbGFwc2UgdmlkZW8uIFRpbWUgbGFwc2UgbW9kZSBjYW4KKyAgICAgKiBjYXB0dXJlIHZpZGVvICh1c2luZyB0aGUgc3RpbGwgY2FtZXJhKSBhdCByZXNvbHV0aW9ucyBoaWdoZXIgdGhhbiB0aGF0IGNhbiBiZQorICAgICAqIHBsYXllZCBiYWNrIG9uIHRoZSBkZXZpY2UuIFRoaXMgZnVuY3Rpb24gb3IKKyAgICAgKiB7QGxpbmsgI3NldEF1eGlsaWFyeU91dHB1dEZpbGUoRmlsZURlc2NyaXB0b3IpfSBlbmFibGUgY2FwdHVyZSBvZiBhIHNtYWxsZXIKKyAgICAgKiB2aWRlbyBpbiBwYXJhbGxlbCB3aXRoIHRoZSBtYWluIHRpbWUgbGFwc2UgdmlkZW8sIHdoaWNoIGNhbiBiZSB1c2VkIHRvIHBsYXkgYmFjayBvbgorICAgICAqIHRoZSBkZXZpY2UuIFRoZSBzbWFsbGVyIHZpZGVvIGlzIGNyZWF0ZWQgYnkgZG93bnNhbXBsaW5nIHRoZSBtYWluIHZpZGVvLiBUaGlzIGNhbGwKKyAgICAgKiBpcyBvcHRpb25hbCBhbmQgZG9lcyBub3QgaGF2ZSB0byBiZSBjYWxsZWQgaWYgcGFyYWxsZWwgY2FwdHVyZSBvZiBhIGRvd25zYW1wbGVkCisgICAgICogdmlkZW8gaXMgbm90IGRlc2lyZWQuCisgICAgICoKKyAgICAgKiBOb3RlIHRoYXQgd2hpbGUgdGhlIG1haW4gdmlkZW8gcmVzb2x1dGlvbiBhbmQgYml0cmF0ZSBpcyBkZXRlcm1pbmVkIGZyb20gdGhlCisgICAgICogQ2FtY29yZGVyUHJvZmlsZSBpbiB7QGxpbmsgI3NldFByb2ZpbGUoQ2FtY29yZGVyUHJvZmlsZSl9LCB0aGUgYXV4aWxpYXJ5IHZpZGVvJ3MKKyAgICAgKiByZXNvbHV0aW9uIGFuZCBiaXRyYXRlIGFyZSBkZXRlcm1pbmVkIGJ5IHRoZSBDYW1jb3JkZXJQcm9maWxlIHF1YWxpdHkgbGV2ZWwKKyAgICAgKiB7QGxpbmsgYW5kcm9pZC5tZWRpYS5DYW1jb3JkZXJQcm9maWxlI1FVQUxJVFlfSElHSH0uIEFsbCBvdGhlciBlbmNvZGluZyBwYXJhbWV0ZXJzCisgICAgICogcmVtYWluIHRoZSBzYW1lIGZvciB0aGUgbWFpbiB2aWRlbyBhbmQgdGhlIGF1eGlsaWFyeSB2aWRlby4KKyAgICAgKgorICAgICAqIEUuZy4gaWYgdGhlIGRldmljZSBzdXBwb3J0cyB0aGUgdGltZSBsYXBzZSBwcm9maWxlIHF1YWxpdHkgbGV2ZWwKKyAgICAgKiB7QGxpbmsgYW5kcm9pZC5tZWRpYS5DYW1jb3JkZXJQcm9maWxlI1FVQUxJVFlfVElNRV9MQVBTRV8xMDgwUH0gYnV0IGNhbiBwbGF5YmFjayBhdAorICAgICAqIG1vc3QgNDgwcCwgdGhlIGFwcGxpY2F0aW9uIG1pZ2h0IHdhbnQgdG8gY2FwdHVyZSBhbiBhdXhpbGlhcnkgdmlkZW8gb2YgcmVzb2x1dGlvbgorICAgICAqIDQ4MHAgdXNpbmcgdGhpcyBjYWxsLgorICAgICAqCisgICAgICogQHBhcmFtIHBhdGggVGhlIHBhdGhuYW1lIHRvIHVzZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRBdXhpbGlhcnlPdXRwdXRGaWxlKFN0cmluZyBwYXRoKQorICAgIHsKKyAgICAgICAgbVByZXBhcmVBdXhpbGlhcnlGaWxlID0gdHJ1ZTsKKyAgICAgICAgbUZkQXV4ID0gbnVsbDsKKyAgICAgICAgbVBhdGhBdXggPSBwYXRoOworICAgICAgICBzZXRBdXhWaWRlb1BhcmFtZXRlcnMoKTsKKyAgICB9CisKKyAgICAvKioKICAgICAgKiBQYXNzIGluIHRoZSBmaWxlIGRlc2NyaXB0b3Igb2YgdGhlIGZpbGUgdG8gYmUgd3JpdHRlbi4gQ2FsbCB0aGlzIGFmdGVyCiAgICAgICogc2V0T3V0cHV0Rm9ybWF0KCkgYnV0IGJlZm9yZSBwcmVwYXJlKCkuCiAgICAgICoKQEAgLTQ3OCw2ICs1OTgsOCBAQAogICAgIC8vIG5hdGl2ZSBpbXBsZW1lbnRhdGlvbgogICAgIHByaXZhdGUgbmF0aXZlIHZvaWQgX3NldE91dHB1dEZpbGUoRmlsZURlc2NyaXB0b3IgZmQsIGxvbmcgb2Zmc2V0LCBsb25nIGxlbmd0aCkKICAgICAgICAgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiwgSU9FeGNlcHRpb247CisgICAgcHJpdmF0ZSBuYXRpdmUgdm9pZCBfc2V0T3V0cHV0RmlsZUF1eChGaWxlRGVzY3JpcHRvciBmZCkKKyAgICAgICAgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiwgSU9FeGNlcHRpb247CiAgICAgcHJpdmF0ZSBuYXRpdmUgdm9pZCBfcHJlcGFyZSgpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24sIElPRXhjZXB0aW9uOwogCiAgICAgLyoqCkBAIC01MDMsNiArNjI1LDIyIEBACiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oIk5vIHZhbGlkIG91dHB1dCBmaWxlIik7CiAgICAgICAgIH0KKworICAgICAgICBpZiAobVByZXBhcmVBdXhpbGlhcnlGaWxlKSB7CisgICAgICAgICAgICBpZiAobVBhdGhBdXggIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIEZpbGVPdXRwdXRTdHJlYW0gZm9zID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0obVBhdGhBdXgpOworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIF9zZXRPdXRwdXRGaWxlQXV4KGZvcy5nZXRGRCgpKTsKKyAgICAgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgICAgICBmb3MuY2xvc2UoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgaWYgKG1GZEF1eCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgX3NldE91dHB1dEZpbGVBdXgobUZkQXV4KTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJObyB2YWxpZCBvdXRwdXQgZmlsZSIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKICAgICAgICAgX3ByZXBhcmUoKTsKICAgICB9CiAKZGlmZiAtLWdpdCBhL21lZGlhL2phdmEvYW5kcm9pZC9tZWRpYS9NZWRpYVNjYW5uZXIuamF2YSBiL21lZGlhL2phdmEvYW5kcm9pZC9tZWRpYS9NZWRpYVNjYW5uZXIuamF2YQppbmRleCAzMzMzMjY4Li5iMmEwYTQ2IDEwMDY0NAotLS0gYS9tZWRpYS9qYXZhL2FuZHJvaWQvbWVkaWEvTWVkaWFTY2FubmVyLmphdmEKKysrIGIvbWVkaWEvamF2YS9hbmRyb2lkL21lZGlhL01lZGlhU2Nhbm5lci5qYXZhCkBAIC0zNCw2ICszNCw3IEBACiBpbXBvcnQgYW5kcm9pZC5wcm92aWRlci5NZWRpYVN0b3JlOwogaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuU2V0dGluZ3M7CiBpbXBvcnQgYW5kcm9pZC5wcm92aWRlci5NZWRpYVN0b3JlLkF1ZGlvOworaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuTWVkaWFTdG9yZS5GaWxlczsKIGltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLk1lZGlhU3RvcmUuSW1hZ2VzOwogaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuTWVkaWFTdG9yZS5WaWRlbzsKIGltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLk1lZGlhU3RvcmUuQXVkaW8uR2VucmVzOwpAQCAtMTA5LDQxICsxMTAsMjggQEAKIAogICAgIHByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBUQUcgPSAiTWVkaWFTY2FubmVyIjsKIAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIEFVRElPX1BST0pFQ1RJT04gPSBuZXcgU3RyaW5nW10gewotICAgICAgICAgICAgQXVkaW8uTWVkaWEuX0lELCAvLyAwCi0gICAgICAgICAgICBBdWRpby5NZWRpYS5EQVRBLCAvLyAxCi0gICAgICAgICAgICBBdWRpby5NZWRpYS5EQVRFX01PRElGSUVELCAvLyAyCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gRklMRVNfUFJFU0NBTl9QUk9KRUNUSU9OID0gbmV3IFN0cmluZ1tdIHsKKyAgICAgICAgICAgIEZpbGVzLkZpbGVDb2x1bW5zLl9JRCwgLy8gMAorICAgICAgICAgICAgRmlsZXMuRmlsZUNvbHVtbnMuREFUQSwgLy8gMQorICAgICAgICAgICAgRmlsZXMuRmlsZUNvbHVtbnMuRk9STUFULCAvLyAyCisgICAgICAgICAgICBGaWxlcy5GaWxlQ29sdW1ucy5EQVRFX01PRElGSUVELCAvLyAzCiAgICAgfTsKIAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBJRF9BVURJT19DT0xVTU5fSU5ERVggPSAwOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBQQVRIX0FVRElPX0NPTFVNTl9JTkRFWCA9IDE7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IERBVEVfTU9ESUZJRURfQVVESU9fQ09MVU1OX0lOREVYID0gMjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRklMRVNfUFJFU0NBTl9JRF9DT0xVTU5fSU5ERVggPSAwOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBGSUxFU19QUkVTQ0FOX1BBVEhfQ09MVU1OX0lOREVYID0gMTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRklMRVNfUFJFU0NBTl9GT1JNQVRfQ09MVU1OX0lOREVYID0gMjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRklMRVNfUFJFU0NBTl9EQVRFX01PRElGSUVEX0NPTFVNTl9JTkRFWCA9IDM7CiAKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBWSURFT19QUk9KRUNUSU9OID0gbmV3IFN0cmluZ1tdIHsKLSAgICAgICAgICAgIFZpZGVvLk1lZGlhLl9JRCwgLy8gMAotICAgICAgICAgICAgVmlkZW8uTWVkaWEuREFUQSwgLy8gMQotICAgICAgICAgICAgVmlkZW8uTWVkaWEuREFURV9NT0RJRklFRCwgLy8gMgorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIE1FRElBX1BSRVNDQU5fUFJPSkVDVElPTiA9IG5ldyBTdHJpbmdbXSB7CisgICAgICAgICAgICBNZWRpYVN0b3JlLk1lZGlhQ29sdW1ucy5fSUQsIC8vIDAKKyAgICAgICAgICAgIE1lZGlhU3RvcmUuTWVkaWFDb2x1bW5zLkRBVEEsIC8vIDEKKyAgICAgICAgICAgIE1lZGlhU3RvcmUuTWVkaWFDb2x1bW5zLkRBVEVfTU9ESUZJRUQsIC8vIDIKICAgICB9OwogCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IElEX1ZJREVPX0NPTFVNTl9JTkRFWCA9IDA7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFBBVEhfVklERU9fQ09MVU1OX0lOREVYID0gMTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgREFURV9NT0RJRklFRF9WSURFT19DT0xVTU5fSU5ERVggPSAyOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNRURJQV9QUkVTQ0FOX0lEX0NPTFVNTl9JTkRFWCA9IDA7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1FRElBX1BSRVNDQU5fUEFUSF9DT0xVTU5fSU5ERVggPSAxOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNRURJQV9QUkVTQ0FOX0RBVEVfTU9ESUZJRURfQ09MVU1OX0lOREVYID0gMjsKIAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIElNQUdFU19QUk9KRUNUSU9OID0gbmV3IFN0cmluZ1tdIHsKLSAgICAgICAgICAgIEltYWdlcy5NZWRpYS5fSUQsIC8vIDAKLSAgICAgICAgICAgIEltYWdlcy5NZWRpYS5EQVRBLCAvLyAxCi0gICAgICAgICAgICBJbWFnZXMuTWVkaWEuREFURV9NT0RJRklFRCwgLy8gMgotICAgIH07Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgSURfSU1BR0VTX0NPTFVNTl9JTkRFWCA9IDA7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFBBVEhfSU1BR0VTX0NPTFVNTl9JTkRFWCA9IDE7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IERBVEVfTU9ESUZJRURfSU1BR0VTX0NPTFVNTl9JTkRFWCA9IDI7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBQTEFZTElTVFNfUFJPSkVDVElPTiA9IG5ldyBTdHJpbmdbXSB7Ci0gICAgICAgICAgICBBdWRpby5QbGF5bGlzdHMuX0lELCAvLyAwCi0gICAgICAgICAgICBBdWRpby5QbGF5bGlzdHMuREFUQSwgLy8gMQotICAgICAgICAgICAgQXVkaW8uUGxheWxpc3RzLkRBVEVfTU9ESUZJRUQsIC8vIDIKLSAgICB9OwogCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gUExBWUxJU1RfTUVNQkVSU19QUk9KRUNUSU9OID0gbmV3IFN0cmluZ1tdIHsKICAgICAgICAgICAgIEF1ZGlvLlBsYXlsaXN0cy5NZW1iZXJzLlBMQVlMSVNUX0lELCAvLyAwCkBAIC0zMDQsNyArMjkyLDkgQEAKICAgICBwcml2YXRlIFVyaSBtVGh1bWJzVXJpOwogICAgIHByaXZhdGUgVXJpIG1HZW5yZXNVcmk7CiAgICAgcHJpdmF0ZSBVcmkgbVBsYXlsaXN0c1VyaTsKKyAgICBwcml2YXRlIFVyaSBtRmlsZXNVcmk7CiAgICAgcHJpdmF0ZSBib29sZWFuIG1Qcm9jZXNzUGxheWxpc3RzLCBtUHJvY2Vzc0dlbnJlczsKKyAgICBwcml2YXRlIGludCBtTXRwT2JqZWN0SGFuZGxlOwogCiAgICAgLy8gdXNlZCB3aGVuIHNjYW5uaW5nIHRoZSBpbWFnZSBkYXRhYmFzZSBzbyB3ZSBrbm93IHdoZXRoZXIgd2UgaGF2ZSB0byBwcnVuZQogICAgIC8vIG9sZCB0aHVtYm5haWwgZmlsZXMKQEAgLTMzOSwyMSArMzI5LDIzIEBACiAgICAgICAgIGxvbmcgbVJvd0lkOwogICAgICAgICBTdHJpbmcgbVBhdGg7CiAgICAgICAgIGxvbmcgbUxhc3RNb2RpZmllZDsKKyAgICAgICAgaW50IG1Gb3JtYXQ7CiAgICAgICAgIGJvb2xlYW4gbVNlZW5JbkZpbGVTeXN0ZW07CiAgICAgICAgIGJvb2xlYW4gbUxhc3RNb2RpZmllZENoYW5nZWQ7CiAKLSAgICAgICAgRmlsZUNhY2hlRW50cnkoVXJpIHRhYmxlVXJpLCBsb25nIHJvd0lkLCBTdHJpbmcgcGF0aCwgbG9uZyBsYXN0TW9kaWZpZWQpIHsKKyAgICAgICAgRmlsZUNhY2hlRW50cnkoVXJpIHRhYmxlVXJpLCBsb25nIHJvd0lkLCBTdHJpbmcgcGF0aCwgbG9uZyBsYXN0TW9kaWZpZWQsIGludCBmb3JtYXQpIHsKICAgICAgICAgICAgIG1UYWJsZVVyaSA9IHRhYmxlVXJpOwogICAgICAgICAgICAgbVJvd0lkID0gcm93SWQ7CiAgICAgICAgICAgICBtUGF0aCA9IHBhdGg7CiAgICAgICAgICAgICBtTGFzdE1vZGlmaWVkID0gbGFzdE1vZGlmaWVkOworICAgICAgICAgICAgbUZvcm1hdCA9IGZvcm1hdDsKICAgICAgICAgICAgIG1TZWVuSW5GaWxlU3lzdGVtID0gZmFsc2U7CiAgICAgICAgICAgICBtTGFzdE1vZGlmaWVkQ2hhbmdlZCA9IGZhbHNlOwogICAgICAgICB9CiAKICAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbVBhdGg7CisgICAgICAgICAgICByZXR1cm4gbVBhdGggKyAiIG1UYWJsZVVyaTogIiArIG1UYWJsZVVyaSArICIgbVJvd0lkOiAiICsgbVJvd0lkOwogICAgICAgICB9CiAgICAgfQogCkBAIC00MzEsNiArNDIzLDkgQEAKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgbU1pbWVUeXBlID0gbnVsbDsKKyAgICAgICAgICAgIG1GaWxlVHlwZSA9IDA7CisgICAgICAgICAgICBtRmlsZVNpemUgPSBmaWxlU2l6ZTsKKwogICAgICAgICAgICAgLy8gdHJ5IG1pbWVUeXBlIGZpcnN0LCBpZiBpdCBpcyBzcGVjaWZpZWQKICAgICAgICAgICAgIGlmIChtaW1lVHlwZSAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgbUZpbGVUeXBlID0gTWVkaWFGaWxlLmdldEZpbGVUeXBlRm9yTWltZVR5cGUobWltZVR5cGUpOwpAQCAtNDM4LDcgKzQzMyw2IEBACiAgICAgICAgICAgICAgICAgICAgIG1NaW1lVHlwZSA9IG1pbWVUeXBlOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1GaWxlU2l6ZSA9IGZpbGVTaXplOwogCiAgICAgICAgICAgICAvLyBpZiBtaW1lVHlwZSB3YXMgbm90IHNwZWNpZmllZCwgY29tcHV0ZSBmaWxlIHR5cGUgYmFzZWQgb24gZmlsZSBleHRlbnNpb24uCiAgICAgICAgICAgICBpZiAobU1pbWVUeXBlID09IG51bGwpIHsKQEAgLTQ1NSw3ICs0NDksMTcgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIEZpbGVDYWNoZUVudHJ5IGVudHJ5ID0gbUZpbGVDYWNoZS5nZXQoa2V5KTsKICAgICAgICAgICAgIGlmIChlbnRyeSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgZW50cnkgPSBuZXcgRmlsZUNhY2hlRW50cnkobnVsbCwgMCwgcGF0aCwgMCk7CisgICAgICAgICAgICAgICAgVXJpIHRhYmxlVXJpOworICAgICAgICAgICAgICAgIGlmIChNZWRpYUZpbGUuaXNWaWRlb0ZpbGVUeXBlKG1GaWxlVHlwZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgdGFibGVVcmkgPSBtVmlkZW9Vcmk7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChNZWRpYUZpbGUuaXNJbWFnZUZpbGVUeXBlKG1GaWxlVHlwZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgdGFibGVVcmkgPSBtSW1hZ2VzVXJpOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoTWVkaWFGaWxlLmlzQXVkaW9GaWxlVHlwZShtRmlsZVR5cGUpKSB7CisgICAgICAgICAgICAgICAgICAgIHRhYmxlVXJpID0gbUF1ZGlvVXJpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHRhYmxlVXJpID0gbUZpbGVzVXJpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbnRyeSA9IG5ldyBGaWxlQ2FjaGVFbnRyeSh0YWJsZVVyaSwgMCwgcGF0aCwgMCwgMCk7CiAgICAgICAgICAgICAgICAgbUZpbGVDYWNoZS5wdXQoa2V5LCBlbnRyeSk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBlbnRyeS5tU2VlbkluRmlsZVN5c3RlbSA9IHRydWU7CkBAIC01MDAsNyArNTA0LDggQEAKICAgICAgICAgICAgIGRvU2NhbkZpbGUocGF0aCwgbWltZVR5cGUsIGxhc3RNb2RpZmllZCwgZmlsZVNpemUsIGZhbHNlKTsKICAgICAgICAgfQogCi0gICAgICAgIHB1YmxpYyBVcmkgZG9TY2FuRmlsZShTdHJpbmcgcGF0aCwgU3RyaW5nIG1pbWVUeXBlLCBsb25nIGxhc3RNb2RpZmllZCwgbG9uZyBmaWxlU2l6ZSwgYm9vbGVhbiBzY2FuQWx3YXlzKSB7CisgICAgICAgIHB1YmxpYyBVcmkgZG9TY2FuRmlsZShTdHJpbmcgcGF0aCwgU3RyaW5nIG1pbWVUeXBlLCBsb25nIGxhc3RNb2RpZmllZCwKKyAgICAgICAgICAgICAgICBsb25nIGZpbGVTaXplLCBib29sZWFuIHNjYW5BbHdheXMpIHsKICAgICAgICAgICAgIFVyaSByZXN1bHQgPSBudWxsOwogLy8gICAgICAgICAgICBsb25nIHQxID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CiAgICAgICAgICAgICB0cnkgewpAQCAtNTE1LDcgKzUyMCw5IEBACiAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gbXVzaWMgPSAobG93cGF0aC5pbmRleE9mKE1VU0lDX0RJUikgPiAwKSB8fAogICAgICAgICAgICAgICAgICAgICAgICAgKCFyaW5ndG9uZXMgJiYgIW5vdGlmaWNhdGlvbnMgJiYgIWFsYXJtcyAmJiAhcG9kY2FzdHMpOwogCi0gICAgICAgICAgICAgICAgICAgIGlmICghTWVkaWFGaWxlLmlzSW1hZ2VGaWxlVHlwZShtRmlsZVR5cGUpKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIHdlIG9ubHkgZXh0cmFjdCBtZXRhZGF0YSBmb3IgYXVkaW8gYW5kIHZpZGVvIGZpbGVzCisgICAgICAgICAgICAgICAgICAgIGlmIChNZWRpYUZpbGUuaXNBdWRpb0ZpbGVUeXBlKG1GaWxlVHlwZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBNZWRpYUZpbGUuaXNWaWRlb0ZpbGVUeXBlKG1GaWxlVHlwZSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NGaWxlKHBhdGgsIG1pbWVUeXBlLCB0aGlzKTsKICAgICAgICAgICAgICAgICAgICAgfQogCkBAIC01NTUsNyArNTYyLDggQEAKICAgICAgICAgICAgICAgICBtVGl0bGUgPSB2YWx1ZTsKICAgICAgICAgICAgIH0gZWxzZSBpZiAobmFtZS5lcXVhbHNJZ25vcmVDYXNlKCJhcnRpc3QiKSB8fCBuYW1lLnN0YXJ0c1dpdGgoImFydGlzdDsiKSkgewogICAgICAgICAgICAgICAgIG1BcnRpc3QgPSB2YWx1ZS50cmltKCk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKG5hbWUuZXF1YWxzSWdub3JlQ2FzZSgiYWxidW1hcnRpc3QiKSB8fCBuYW1lLnN0YXJ0c1dpdGgoImFsYnVtYXJ0aXN0OyIpKSB7CisgICAgICAgICAgICB9IGVsc2UgaWYgKG5hbWUuZXF1YWxzSWdub3JlQ2FzZSgiYWxidW1hcnRpc3QiKSB8fCBuYW1lLnN0YXJ0c1dpdGgoImFsYnVtYXJ0aXN0OyIpCisgICAgICAgICAgICAgICAgICAgIHx8IG5hbWUuZXF1YWxzSWdub3JlQ2FzZSgiYmFuZCIpIHx8IG5hbWUuc3RhcnRzV2l0aCgiYmFuZDsiKSkgewogICAgICAgICAgICAgICAgIG1BbGJ1bUFydGlzdCA9IHZhbHVlLnRyaW0oKTsKICAgICAgICAgICAgIH0gZWxzZSBpZiAobmFtZS5lcXVhbHNJZ25vcmVDYXNlKCJhbGJ1bSIpIHx8IG5hbWUuc3RhcnRzV2l0aCgiYWxidW07IikpIHsKICAgICAgICAgICAgICAgICBtQWxidW0gPSB2YWx1ZS50cmltKCk7CkBAIC02NTQsMjEgKzY2Miw2IEBACiAgICAgICAgICAgICAgICAgYm9vbGVhbiBhbGFybXMsIGJvb2xlYW4gbXVzaWMsIGJvb2xlYW4gcG9kY2FzdHMpCiAgICAgICAgICAgICAgICAgdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbiB7CiAgICAgICAgICAgICAvLyB1cGRhdGUgZGF0YWJhc2UKLSAgICAgICAgICAgIFVyaSB0YWJsZVVyaTsKLSAgICAgICAgICAgIGJvb2xlYW4gaXNBdWRpbyA9IE1lZGlhRmlsZS5pc0F1ZGlvRmlsZVR5cGUobUZpbGVUeXBlKTsKLSAgICAgICAgICAgIGJvb2xlYW4gaXNWaWRlbyA9IE1lZGlhRmlsZS5pc1ZpZGVvRmlsZVR5cGUobUZpbGVUeXBlKTsKLSAgICAgICAgICAgIGJvb2xlYW4gaXNJbWFnZSA9IE1lZGlhRmlsZS5pc0ltYWdlRmlsZVR5cGUobUZpbGVUeXBlKTsKLSAgICAgICAgICAgIGlmIChpc1ZpZGVvKSB7Ci0gICAgICAgICAgICAgICAgdGFibGVVcmkgPSBtVmlkZW9Vcmk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGlzSW1hZ2UpIHsKLSAgICAgICAgICAgICAgICB0YWJsZVVyaSA9IG1JbWFnZXNVcmk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGlzQXVkaW8pIHsKLSAgICAgICAgICAgICAgICB0YWJsZVVyaSA9IG1BdWRpb1VyaTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgLy8gZG9uJ3QgYWRkIGZpbGUgdG8gZGF0YWJhc2UgaWYgbm90IGF1ZGlvLCB2aWRlbyBvciBpbWFnZQotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZW50cnkubVRhYmxlVXJpID0gdGFibGVVcmk7CiAKICAgICAgICAgICAgICAvLyB1c2UgYWxidW0gYXJ0aXN0IGlmIGFydGlzdCBpcyBtaXNzaW5nCiAgICAgICAgICAgICBpZiAobUFydGlzdCA9PSBudWxsIHx8IG1BcnRpc3QubGVuZ3RoKCkgPT0gMCkgewpAQCAtNjc4LDIwICs2NzEsNyBAQAogICAgICAgICAgICAgQ29udGVudFZhbHVlcyB2YWx1ZXMgPSB0b1ZhbHVlcygpOwogICAgICAgICAgICAgU3RyaW5nIHRpdGxlID0gdmFsdWVzLmdldEFzU3RyaW5nKE1lZGlhU3RvcmUuTWVkaWFDb2x1bW5zLlRJVExFKTsKICAgICAgICAgICAgIGlmICh0aXRsZSA9PSBudWxsIHx8IFRleHRVdGlscy5pc0VtcHR5KHRpdGxlLnRyaW0oKSkpIHsKLSAgICAgICAgICAgICAgICB0aXRsZSA9IHZhbHVlcy5nZXRBc1N0cmluZyhNZWRpYVN0b3JlLk1lZGlhQ29sdW1ucy5EQVRBKTsKLSAgICAgICAgICAgICAgICAvLyBleHRyYWN0IGZpbGUgbmFtZSBhZnRlciBsYXN0IHNsYXNoCi0gICAgICAgICAgICAgICAgaW50IGxhc3RTbGFzaCA9IHRpdGxlLmxhc3RJbmRleE9mKCcvJyk7Ci0gICAgICAgICAgICAgICAgaWYgKGxhc3RTbGFzaCA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGxhc3RTbGFzaCsrOwotICAgICAgICAgICAgICAgICAgICBpZiAobGFzdFNsYXNoIDwgdGl0bGUubGVuZ3RoKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlID0gdGl0bGUuc3Vic3RyaW5nKGxhc3RTbGFzaCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgLy8gdHJ1bmNhdGUgdGhlIGZpbGUgZXh0ZW5zaW9uIChpZiBhbnkpCi0gICAgICAgICAgICAgICAgaW50IGxhc3REb3QgPSB0aXRsZS5sYXN0SW5kZXhPZignLicpOwotICAgICAgICAgICAgICAgIGlmIChsYXN0RG90ID4gMCkgewotICAgICAgICAgICAgICAgICAgICB0aXRsZSA9IHRpdGxlLnN1YnN0cmluZygwLCBsYXN0RG90KTsKLSAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgdGl0bGUgPSBNZWRpYUZpbGUuZ2V0RmlsZVRpdGxlKHZhbHVlcy5nZXRBc1N0cmluZyhNZWRpYVN0b3JlLk1lZGlhQ29sdW1ucy5EQVRBKSk7CiAgICAgICAgICAgICAgICAgdmFsdWVzLnB1dChNZWRpYVN0b3JlLk1lZGlhQ29sdW1ucy5USVRMRSwgdGl0bGUpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgU3RyaW5nIGFsYnVtID0gdmFsdWVzLmdldEFzU3RyaW5nKEF1ZGlvLk1lZGlhLkFMQlVNKTsKQEAgLTcxNSw3ICs2OTUsNyBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGxvbmcgcm93SWQgPSBlbnRyeS5tUm93SWQ7Ci0gICAgICAgICAgICBpZiAoaXNBdWRpbyAmJiByb3dJZCA9PSAwKSB7CisgICAgICAgICAgICBpZiAoTWVkaWFGaWxlLmlzQXVkaW9GaWxlVHlwZShtRmlsZVR5cGUpICYmIHJvd0lkID09IDApIHsKICAgICAgICAgICAgICAgICAvLyBPbmx5IHNldCB0aGVzZSBmb3IgbmV3IGVudHJpZXMuIEZvciBleGlzdGluZyBlbnRyaWVzLCB0aGV5CiAgICAgICAgICAgICAgICAgLy8gbWF5IGhhdmUgYmVlbiBtb2RpZmllZCBsYXRlciwgYW5kIHdlIHdhbnQgdG8ga2VlcCB0aGUgY3VycmVudAogICAgICAgICAgICAgICAgIC8vIHZhbHVlcyBzbyB0aGF0IGN1c3RvbSByaW5ndG9uZXMgc3RpbGwgc2hvdyB1cCBpbiB0aGUgcmluZ3RvbmUKQEAgLTc2OCw4ICs3NDgsMTUgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAKKyAgICAgICAgICAgIFVyaSB0YWJsZVVyaSA9IGVudHJ5Lm1UYWJsZVVyaTsKICAgICAgICAgICAgIFVyaSByZXN1bHQgPSBudWxsOwogICAgICAgICAgICAgaWYgKHJvd0lkID09IDApIHsKKyAgICAgICAgICAgICAgICBpZiAobU10cE9iamVjdEhhbmRsZSAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgIHZhbHVlcy5wdXQoTWVkaWFTdG9yZS5NZWRpYUNvbHVtbnMuTUVESUFfU0NBTk5FUl9ORVdfT0JKRUNUX0lELCBtTXRwT2JqZWN0SGFuZGxlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKHRhYmxlVXJpID09IG1GaWxlc1VyaSkgeworICAgICAgICAgICAgICAgICAgICB2YWx1ZXMucHV0KEZpbGVzLkZpbGVDb2x1bW5zLkZPUk1BVCwgTWVkaWFGaWxlLmdldEZvcm1hdENvZGUoZW50cnkubVBhdGgsIG1NaW1lVHlwZSkpOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAvLyBuZXcgZmlsZSwgaW5zZXJ0IGl0CiAgICAgICAgICAgICAgICAgcmVzdWx0ID0gbU1lZGlhUHJvdmlkZXIuaW5zZXJ0KHRhYmxlVXJpLCB2YWx1ZXMpOwogICAgICAgICAgICAgICAgIGlmIChyZXN1bHQgIT0gbnVsbCkgewpAQCAtODg1LDcgKzg3Miw3IEBACiAKICAgICB9OyAvLyBlbmQgb2YgYW5vbnltb3VzIE1lZGlhU2Nhbm5lckNsaWVudCBpbnN0YW5jZQogCi0gICAgcHJpdmF0ZSB2b2lkIHByZXNjYW4oU3RyaW5nIGZpbGVQYXRoKSB0aHJvd3MgUmVtb3RlRXhjZXB0aW9uIHsKKyAgICBwcml2YXRlIHZvaWQgcHJlc2NhbihTdHJpbmcgZmlsZVBhdGgsIGJvb2xlYW4gcHJlc2NhbkZpbGVzKSB0aHJvd3MgUmVtb3RlRXhjZXB0aW9uIHsKICAgICAgICAgQ3Vyc29yIGMgPSBudWxsOwogICAgICAgICBTdHJpbmcgd2hlcmUgPSBudWxsOwogICAgICAgICBTdHJpbmdbXSBzZWxlY3Rpb25BcmdzID0gbnVsbDsKQEAgLTkwMSwyMSArODg4LDI2IEBACiAgICAgICAgICAgICBtUGxheUxpc3RzLmNsZWFyKCk7CiAgICAgICAgIH0KIAorICAgICAgICBpZiAoZmlsZVBhdGggIT0gbnVsbCkgeworICAgICAgICAgICAgLy8gcXVlcnkgZm9yIG9ubHkgb25lIGZpbGUKKyAgICAgICAgICAgIHdoZXJlID0gRmlsZXMuRmlsZUNvbHVtbnMuREFUQSArICI9PyI7CisgICAgICAgICAgICBzZWxlY3Rpb25BcmdzID0gbmV3IFN0cmluZ1tdIHsgZmlsZVBhdGggfTsKKyAgICAgICAgfQorCiAgICAgICAgIC8vIEJ1aWxkIHRoZSBsaXN0IG9mIGZpbGVzIGZyb20gdGhlIGNvbnRlbnQgcHJvdmlkZXIKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIFJlYWQgZXhpc3RpbmcgZmlsZXMgZnJvbSB0aGUgYXVkaW8gdGFibGUKLSAgICAgICAgICAgIGlmIChmaWxlUGF0aCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgd2hlcmUgPSBNZWRpYVN0b3JlLkF1ZGlvLk1lZGlhLkRBVEEgKyAiPT8iOwotICAgICAgICAgICAgICAgIHNlbGVjdGlvbkFyZ3MgPSBuZXcgU3RyaW5nW10geyBmaWxlUGF0aCB9OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYyA9IG1NZWRpYVByb3ZpZGVyLnF1ZXJ5KG1BdWRpb1VyaSwgQVVESU9fUFJPSkVDVElPTiwgd2hlcmUsIHNlbGVjdGlvbkFyZ3MsIG51bGwpOworICAgICAgICAgICAgaWYgKHByZXNjYW5GaWxlcykgeworICAgICAgICAgICAgICAgIC8vIEZpcnN0IHJlYWQgZXhpc3RpbmcgZmlsZXMgZnJvbSB0aGUgZmlsZXMgdGFibGUKIAotICAgICAgICAgICAgaWYgKGMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgYyA9IG1NZWRpYVByb3ZpZGVyLnF1ZXJ5KG1GaWxlc1VyaSwgRklMRVNfUFJFU0NBTl9QUk9KRUNUSU9OLAorICAgICAgICAgICAgICAgICAgICAgICAgd2hlcmUsIHNlbGVjdGlvbkFyZ3MsIG51bGwpOworCisgICAgICAgICAgICAgICAgaWYgKGMgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgICB3aGlsZSAoYy5tb3ZlVG9OZXh0KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxvbmcgcm93SWQgPSBjLmdldExvbmcoSURfQVVESU9fQ09MVU1OX0lOREVYKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBwYXRoID0gYy5nZXRTdHJpbmcoUEFUSF9BVURJT19DT0xVTU5fSU5ERVgpOwotICAgICAgICAgICAgICAgICAgICAgICAgbG9uZyBsYXN0TW9kaWZpZWQgPSBjLmdldExvbmcoREFURV9NT0RJRklFRF9BVURJT19DT0xVTU5fSU5ERVgpOworICAgICAgICAgICAgICAgICAgICAgICAgbG9uZyByb3dJZCA9IGMuZ2V0TG9uZyhGSUxFU19QUkVTQ0FOX0lEX0NPTFVNTl9JTkRFWCk7CisgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcGF0aCA9IGMuZ2V0U3RyaW5nKEZJTEVTX1BSRVNDQU5fUEFUSF9DT0xVTU5fSU5ERVgpOworICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZvcm1hdCA9IGMuZ2V0SW50KEZJTEVTX1BSRVNDQU5fRk9STUFUX0NPTFVNTl9JTkRFWCk7CisgICAgICAgICAgICAgICAgICAgICAgICBsb25nIGxhc3RNb2RpZmllZCA9IGMuZ2V0TG9uZyhGSUxFU19QUkVTQ0FOX0RBVEVfTU9ESUZJRURfQ09MVU1OX0lOREVYKTsKIAogICAgICAgICAgICAgICAgICAgICAgICAgLy8gT25seSBjb25zaWRlciBlbnRyaWVzIHdpdGggYWJzb2x1dGUgcGF0aCBuYW1lcy4KICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoaXMgYWxsb3dzIHN0b3JpbmcgVVJJcyBpbiB0aGUgZGF0YWJhc2Ugd2l0aG91dCB0aGUKQEAgLTkyNSwxMTQgKzkxNywxNDQgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobUNhc2VJbnNlbnNpdGl2ZVBhdGhzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleSA9IHBhdGgudG9Mb3dlckNhc2UoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaWxlQ2FjaGVFbnRyeSBlbnRyeSA9IG5ldyBGaWxlQ2FjaGVFbnRyeShtRmlsZXNVcmksIHJvd0lkLCBwYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFzdE1vZGlmaWVkLCBmb3JtYXQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1GaWxlQ2FjaGUucHV0KGtleSwgZW50cnkpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGMuY2xvc2UoKTsKKyAgICAgICAgICAgICAgICAgICAgYyA9IG51bGw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBSZWFkIGV4aXN0aW5nIGZpbGVzIGZyb20gdGhlIGF1ZGlvIHRhYmxlIGFuZCB1cGRhdGUgRmlsZUNhY2hlRW50cnkKKyAgICAgICAgICAgIGMgPSBtTWVkaWFQcm92aWRlci5xdWVyeShtQXVkaW9VcmksIE1FRElBX1BSRVNDQU5fUFJPSkVDVElPTiwKKyAgICAgICAgICAgICAgICAgICAgd2hlcmUsIHNlbGVjdGlvbkFyZ3MsIG51bGwpOworICAgICAgICAgICAgaWYgKGMgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHdoaWxlIChjLm1vdmVUb05leHQoKSkgeworICAgICAgICAgICAgICAgICAgICBsb25nIHJvd0lkID0gYy5nZXRMb25nKE1FRElBX1BSRVNDQU5fSURfQ09MVU1OX0lOREVYKTsKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHBhdGggPSBjLmdldFN0cmluZyhNRURJQV9QUkVTQ0FOX1BBVEhfQ09MVU1OX0lOREVYKTsKKyAgICAgICAgICAgICAgICAgICAgbG9uZyBsYXN0TW9kaWZpZWQgPSBjLmdldExvbmcoTUVESUFfUFJFU0NBTl9EQVRFX01PRElGSUVEX0NPTFVNTl9JTkRFWCk7CisKKyAgICAgICAgICAgICAgICAgICAgLy8gT25seSBjb25zaWRlciBlbnRyaWVzIHdpdGggYWJzb2x1dGUgcGF0aCBuYW1lcy4KKyAgICAgICAgICAgICAgICAgICAgLy8gVGhpcyBhbGxvd3Mgc3RvcmluZyBVUklzIGluIHRoZSBkYXRhYmFzZSB3aXRob3V0IHRoZQorICAgICAgICAgICAgICAgICAgICAvLyBtZWRpYSBzY2FubmVyIHJlbW92aW5nIHRoZW0uCisgICAgICAgICAgICAgICAgICAgIGlmIChwYXRoLnN0YXJ0c1dpdGgoIi8iKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGtleSA9IHBhdGg7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobUNhc2VJbnNlbnNpdGl2ZVBhdGhzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5ID0gcGF0aC50b0xvd2VyQ2FzZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgRmlsZUNhY2hlRW50cnkgZW50cnkgPSBtRmlsZUNhY2hlLmdldChwYXRoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlbnRyeSA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUZpbGVDYWNoZS5wdXQoa2V5LCBuZXcgRmlsZUNhY2hlRW50cnkobUF1ZGlvVXJpLCByb3dJZCwgcGF0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhc3RNb2RpZmllZCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFzdE1vZGlmaWVkLCAwKSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHVwZGF0ZSB0aGUgZW50cnkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnRyeS5tVGFibGVVcmkgPSBtQXVkaW9Vcmk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW50cnkubVJvd0lkID0gcm93SWQ7CiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgICAgICAgICBjLmNsb3NlKCk7Ci0gICAgICAgICAgICAgICAgICAgIGMgPSBudWxsOwogICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjLmNsb3NlKCk7CisgICAgICAgICAgICAgICAgYyA9IG51bGw7CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIC8vIFJlYWQgZXhpc3RpbmcgZmlsZXMgZnJvbSB0aGUgdmlkZW8gdGFibGUKLSAgICAgICAgICAgIGlmIChmaWxlUGF0aCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgd2hlcmUgPSBNZWRpYVN0b3JlLlZpZGVvLk1lZGlhLkRBVEEgKyAiPT8iOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB3aGVyZSA9IG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjID0gbU1lZGlhUHJvdmlkZXIucXVlcnkobVZpZGVvVXJpLCBWSURFT19QUk9KRUNUSU9OLCB3aGVyZSwgc2VsZWN0aW9uQXJncywgbnVsbCk7Ci0KKyAgICAgICAgICAgIC8vIFJlYWQgZXhpc3RpbmcgZmlsZXMgZnJvbSB0aGUgdmlkZW8gdGFibGUgYW5kIHVwZGF0ZSBGaWxlQ2FjaGVFbnRyeQorICAgICAgICAgICAgYyA9IG1NZWRpYVByb3ZpZGVyLnF1ZXJ5KG1WaWRlb1VyaSwgTUVESUFfUFJFU0NBTl9QUk9KRUNUSU9OLAorICAgICAgICAgICAgICAgICAgICB3aGVyZSwgc2VsZWN0aW9uQXJncywgbnVsbCk7CiAgICAgICAgICAgICBpZiAoYyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGMubW92ZVRvTmV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsb25nIHJvd0lkID0gYy5nZXRMb25nKElEX1ZJREVPX0NPTFVNTl9JTkRFWCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcGF0aCA9IGMuZ2V0U3RyaW5nKFBBVEhfVklERU9fQ09MVU1OX0lOREVYKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxvbmcgbGFzdE1vZGlmaWVkID0gYy5nZXRMb25nKERBVEVfTU9ESUZJRURfVklERU9fQ09MVU1OX0lOREVYKTsKKyAgICAgICAgICAgICAgICB3aGlsZSAoYy5tb3ZlVG9OZXh0KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgbG9uZyByb3dJZCA9IGMuZ2V0TG9uZyhNRURJQV9QUkVTQ0FOX0lEX0NPTFVNTl9JTkRFWCk7CisgICAgICAgICAgICAgICAgICAgIFN0cmluZyBwYXRoID0gYy5nZXRTdHJpbmcoTUVESUFfUFJFU0NBTl9QQVRIX0NPTFVNTl9JTkRFWCk7CisgICAgICAgICAgICAgICAgICAgIGxvbmcgbGFzdE1vZGlmaWVkID0gYy5nZXRMb25nKE1FRElBX1BSRVNDQU5fREFURV9NT0RJRklFRF9DT0xVTU5fSU5ERVgpOwogCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBPbmx5IGNvbnNpZGVyIGVudHJpZXMgd2l0aCBhYnNvbHV0ZSBwYXRoIG5hbWVzLgotICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhpcyBhbGxvd3Mgc3RvcmluZyBVUklzIGluIHRoZSBkYXRhYmFzZSB3aXRob3V0IHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgLy8gbWVkaWEgc2Nhbm5lciByZW1vdmluZyB0aGVtLgotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBhdGguc3RhcnRzV2l0aCgiLyIpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGtleSA9IHBhdGg7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1DYXNlSW5zZW5zaXRpdmVQYXRocykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXkgPSBwYXRoLnRvTG93ZXJDYXNlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAvLyBPbmx5IGNvbnNpZGVyIGVudHJpZXMgd2l0aCBhYnNvbHV0ZSBwYXRoIG5hbWVzLgorICAgICAgICAgICAgICAgICAgICAvLyBUaGlzIGFsbG93cyBzdG9yaW5nIFVSSXMgaW4gdGhlIGRhdGFiYXNlIHdpdGhvdXQgdGhlCisgICAgICAgICAgICAgICAgICAgIC8vIG1lZGlhIHNjYW5uZXIgcmVtb3ZpbmcgdGhlbS4KKyAgICAgICAgICAgICAgICAgICAgaWYgKHBhdGguc3RhcnRzV2l0aCgiLyIpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcga2V5ID0gcGF0aDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtQ2FzZUluc2Vuc2l0aXZlUGF0aHMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXkgPSBwYXRoLnRvTG93ZXJDYXNlKCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBGaWxlQ2FjaGVFbnRyeSBlbnRyeSA9IG1GaWxlQ2FjaGUuZ2V0KHBhdGgpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVudHJ5ID09IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtRmlsZUNhY2hlLnB1dChrZXksIG5ldyBGaWxlQ2FjaGVFbnRyeShtVmlkZW9VcmksIHJvd0lkLCBwYXRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFzdE1vZGlmaWVkKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXN0TW9kaWZpZWQsIDApKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdXBkYXRlIHRoZSBlbnRyeQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudHJ5Lm1UYWJsZVVyaSA9IG1WaWRlb1VyaTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnRyeS5tUm93SWQgPSByb3dJZDsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICAgICAgICAgIGMuY2xvc2UoKTsKLSAgICAgICAgICAgICAgICAgICAgYyA9IG51bGw7CiAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGMuY2xvc2UoKTsKKyAgICAgICAgICAgICAgICBjID0gbnVsbDsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgLy8gUmVhZCBleGlzdGluZyBmaWxlcyBmcm9tIHRoZSBpbWFnZXMgdGFibGUKLSAgICAgICAgICAgIGlmIChmaWxlUGF0aCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgd2hlcmUgPSBNZWRpYVN0b3JlLkltYWdlcy5NZWRpYS5EQVRBICsgIj0/IjsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgd2hlcmUgPSBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbU9yaWdpbmFsQ291bnQgPSAwOwotICAgICAgICAgICAgYyA9IG1NZWRpYVByb3ZpZGVyLnF1ZXJ5KG1JbWFnZXNVcmksIElNQUdFU19QUk9KRUNUSU9OLCB3aGVyZSwgc2VsZWN0aW9uQXJncywgbnVsbCk7Ci0KKyAgICAgICAgICAgIC8vIFJlYWQgZXhpc3RpbmcgZmlsZXMgZnJvbSB0aGUgdmlkZW8gdGFibGUgYW5kIHVwZGF0ZSBGaWxlQ2FjaGVFbnRyeQorICAgICAgICAgICAgYyA9IG1NZWRpYVByb3ZpZGVyLnF1ZXJ5KG1JbWFnZXNVcmksIE1FRElBX1BSRVNDQU5fUFJPSkVDVElPTiwKKyAgICAgICAgICAgICAgICAgICAgd2hlcmUsIHNlbGVjdGlvbkFyZ3MsIG51bGwpOwogICAgICAgICAgICAgaWYgKGMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIG1PcmlnaW5hbENvdW50ID0gYy5nZXRDb3VudCgpOwotICAgICAgICAgICAgICAgICAgICB3aGlsZSAoYy5tb3ZlVG9OZXh0KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxvbmcgcm93SWQgPSBjLmdldExvbmcoSURfSU1BR0VTX0NPTFVNTl9JTkRFWCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcGF0aCA9IGMuZ2V0U3RyaW5nKFBBVEhfSU1BR0VTX0NPTFVNTl9JTkRFWCk7Ci0gICAgICAgICAgICAgICAgICAgICAgIGxvbmcgbGFzdE1vZGlmaWVkID0gYy5nZXRMb25nKERBVEVfTU9ESUZJRURfSU1BR0VTX0NPTFVNTl9JTkRFWCk7CisgICAgICAgICAgICAgICAgd2hpbGUgKGMubW92ZVRvTmV4dCgpKSB7CisgICAgICAgICAgICAgICAgICAgIGxvbmcgcm93SWQgPSBjLmdldExvbmcoTUVESUFfUFJFU0NBTl9JRF9DT0xVTU5fSU5ERVgpOworICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcGF0aCA9IGMuZ2V0U3RyaW5nKE1FRElBX1BSRVNDQU5fUEFUSF9DT0xVTU5fSU5ERVgpOworICAgICAgICAgICAgICAgICAgICBsb25nIGxhc3RNb2RpZmllZCA9IGMuZ2V0TG9uZyhNRURJQV9QUkVTQ0FOX0RBVEVfTU9ESUZJRURfQ09MVU1OX0lOREVYKTsKIAotICAgICAgICAgICAgICAgICAgICAgICAvLyBPbmx5IGNvbnNpZGVyIGVudHJpZXMgd2l0aCBhYnNvbHV0ZSBwYXRoIG5hbWVzLgotICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGlzIGFsbG93cyBzdG9yaW5nIFVSSXMgaW4gdGhlIGRhdGFiYXNlIHdpdGhvdXQgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgIC8vIG1lZGlhIHNjYW5uZXIgcmVtb3ZpbmcgdGhlbS4KLSAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBhdGguc3RhcnRzV2l0aCgiLyIpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcga2V5ID0gcGF0aDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtQ2FzZUluc2Vuc2l0aXZlUGF0aHMpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXkgPSBwYXRoLnRvTG93ZXJDYXNlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICBtRmlsZUNhY2hlLnB1dChrZXksIG5ldyBGaWxlQ2FjaGVFbnRyeShtSW1hZ2VzVXJpLCByb3dJZCwgcGF0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFzdE1vZGlmaWVkKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgLy8gT25seSBjb25zaWRlciBlbnRyaWVzIHdpdGggYWJzb2x1dGUgcGF0aCBuYW1lcy4KKyAgICAgICAgICAgICAgICAgICAgLy8gVGhpcyBhbGxvd3Mgc3RvcmluZyBVUklzIGluIHRoZSBkYXRhYmFzZSB3aXRob3V0IHRoZQorICAgICAgICAgICAgICAgICAgICAvLyBtZWRpYSBzY2FubmVyIHJlbW92aW5nIHRoZW0uCisgICAgICAgICAgICAgICAgICAgIGlmIChwYXRoLnN0YXJ0c1dpdGgoIi8iKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGtleSA9IHBhdGg7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobUNhc2VJbnNlbnNpdGl2ZVBhdGhzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5ID0gcGF0aC50b0xvd2VyQ2FzZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgRmlsZUNhY2hlRW50cnkgZW50cnkgPSBtRmlsZUNhY2hlLmdldChwYXRoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlbnRyeSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUZpbGVDYWNoZS5wdXQoa2V5LCBuZXcgRmlsZUNhY2hlRW50cnkobUltYWdlc1VyaSwgcm93SWQsIHBhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXN0TW9kaWZpZWQsIDApKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdXBkYXRlIHRoZSBlbnRyeQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudHJ5Lm1UYWJsZVVyaSA9IG1JbWFnZXNVcmk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW50cnkubVJvd0lkID0gcm93SWQ7CisgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgICAgICAgICBjLmNsb3NlKCk7Ci0gICAgICAgICAgICAgICAgICAgIGMgPSBudWxsOwogICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjLmNsb3NlKCk7CisgICAgICAgICAgICAgICAgYyA9IG51bGw7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIGlmIChtUHJvY2Vzc1BsYXlsaXN0cykgewotICAgICAgICAgICAgICAgIC8vIFJlYWQgZXhpc3RpbmcgZmlsZXMgZnJvbSB0aGUgcGxheWxpc3RzIHRhYmxlCi0gICAgICAgICAgICAgICAgaWYgKGZpbGVQYXRoICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgd2hlcmUgPSBNZWRpYVN0b3JlLkF1ZGlvLlBsYXlsaXN0cy5EQVRBICsgIj0/IjsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICB3aGVyZSA9IG51bGw7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGMgPSBtTWVkaWFQcm92aWRlci5xdWVyeShtUGxheWxpc3RzVXJpLCBQTEFZTElTVFNfUFJPSkVDVElPTiwgd2hlcmUsIHNlbGVjdGlvbkFyZ3MsIG51bGwpOwotCisgICAgICAgICAgICAgICAgLy8gUmVhZCBleGlzdGluZyBmaWxlcyBmcm9tIHRoZSBwbGF5bGlzdHMgdGFibGUgYW5kIHVwZGF0ZSBGaWxlQ2FjaGVFbnRyeQorICAgICAgICAgICAgICAgIGMgPSBtTWVkaWFQcm92aWRlci5xdWVyeShtUGxheWxpc3RzVXJpLCBNRURJQV9QUkVTQ0FOX1BST0pFQ1RJT04sCisgICAgICAgICAgICAgICAgICAgICAgICB3aGVyZSwgc2VsZWN0aW9uQXJncywgbnVsbCk7CiAgICAgICAgICAgICAgICAgaWYgKGMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGMubW92ZVRvTmV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHBhdGggPSBjLmdldFN0cmluZyhQQVRIX1BMQVlMSVNUU19DT0xVTU5fSU5ERVgpOworICAgICAgICAgICAgICAgICAgICB3aGlsZSAoYy5tb3ZlVG9OZXh0KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxvbmcgcm93SWQgPSBjLmdldExvbmcoTUVESUFfUFJFU0NBTl9JRF9DT0xVTU5fSU5ERVgpOworICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHBhdGggPSBjLmdldFN0cmluZyhNRURJQV9QUkVTQ0FOX1BBVEhfQ09MVU1OX0lOREVYKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxvbmcgbGFzdE1vZGlmaWVkID0gYy5nZXRMb25nKE1FRElBX1BSRVNDQU5fREFURV9NT0RJRklFRF9DT0xVTU5fSU5ERVgpOwogCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBhdGggIT0gbnVsbCAmJiBwYXRoLmxlbmd0aCgpID4gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb25nIHJvd0lkID0gYy5nZXRMb25nKElEX1BMQVlMSVNUU19DT0xVTU5fSU5ERVgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb25nIGxhc3RNb2RpZmllZCA9IGMuZ2V0TG9uZyhEQVRFX01PRElGSUVEX1BMQVlMSVNUU19DT0xVTU5fSU5ERVgpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBrZXkgPSBwYXRoOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobUNhc2VJbnNlbnNpdGl2ZVBhdGhzKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXkgPSBwYXRoLnRvTG93ZXJDYXNlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIE9ubHkgY29uc2lkZXIgZW50cmllcyB3aXRoIGFic29sdXRlIHBhdGggbmFtZXMuCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGlzIGFsbG93cyBzdG9yaW5nIFVSSXMgaW4gdGhlIGRhdGFiYXNlIHdpdGhvdXQgdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBtZWRpYSBzY2FubmVyIHJlbW92aW5nIHRoZW0uCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAocGF0aC5zdGFydHNXaXRoKCIvIikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcga2V5ID0gcGF0aDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobUNhc2VJbnNlbnNpdGl2ZVBhdGhzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleSA9IHBhdGgudG9Mb3dlckNhc2UoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmlsZUNhY2hlRW50cnkgZW50cnkgPSBtRmlsZUNhY2hlLmdldChwYXRoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZW50cnkgPT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtRmlsZUNhY2hlLnB1dChrZXksIG5ldyBGaWxlQ2FjaGVFbnRyeShtUGxheWxpc3RzVXJpLCByb3dJZCwgcGF0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXN0TW9kaWZpZWQpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXN0TW9kaWZpZWQsIDApKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB1cGRhdGUgdGhlIGVudHJ5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudHJ5Lm1UYWJsZVVyaSA9IG1QbGF5bGlzdHNVcmk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudHJ5Lm1Sb3dJZCA9IHJvd0lkOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGMuY2xvc2UoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGMgPSBudWxsOwogICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGMuY2xvc2UoKTsKKyAgICAgICAgICAgICAgICAgICAgYyA9IG51bGw7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICB9CkBAIC0xMTA3LDEyICsxMTI5LDE0IEBACiAgICAgICAgICAgICAvLyByZW1vdmUgZGF0YWJhc2UgZW50cmllcyBmb3IgZmlsZXMgdGhhdCBubyBsb25nZXIgZXhpc3QuCiAgICAgICAgICAgICBib29sZWFuIGZpbGVNaXNzaW5nID0gZmFsc2U7CiAKLSAgICAgICAgICAgIGlmICghZW50cnkubVNlZW5JbkZpbGVTeXN0ZW0pIHsKLSAgICAgICAgICAgICAgICBpZiAoaW5TY2FuRGlyZWN0b3J5KHBhdGgsIGRpcmVjdG9yaWVzKSkgeworICAgICAgICAgICAgaWYgKCFlbnRyeS5tU2VlbkluRmlsZVN5c3RlbSAmJiAhTXRwQ29uc3RhbnRzLmlzQWJzdHJhY3RPYmplY3QoZW50cnkubUZvcm1hdCkpIHsKKyAgICAgICAgICAgICAgICBpZiAoZW50cnkubUZvcm1hdCAhPSBNdHBDb25zdGFudHMuRk9STUFUX0FTU09DSUFUSU9OICYmCisgICAgICAgICAgICAgICAgICAgICAgICBpblNjYW5EaXJlY3RvcnkocGF0aCwgZGlyZWN0b3JpZXMpKSB7CiAgICAgICAgICAgICAgICAgICAgIC8vIHdlIGRpZG4ndCBzZWUgdGhpcyBmaWxlIGluIHRoZSBzY2FuIGRpcmVjdG9yeS4KICAgICAgICAgICAgICAgICAgICAgZmlsZU1pc3NpbmcgPSB0cnVlOwogICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIHRoZSBmaWxlIGlzIG91dHNpZGUgb2Ygb3VyIHNjYW4gZGlyZWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAvLyB0aGUgZmlsZSBhY3R1YWxseSBhIGRpcmVjdG9yeSBvciBvdGhlciBhYnN0cmFjdCBvYmplY3QKKyAgICAgICAgICAgICAgICAgICAgLy8gb3IgaXMgb3V0c2lkZSBvZiBvdXIgc2NhbiBkaXJlY3RvcnksCiAgICAgICAgICAgICAgICAgICAgIC8vIHNvIHdlIG5lZWQgdG8gY2hlY2sgZm9yIGZpbGUgZXhpc3RlbmNlIGhlcmUuCiAgICAgICAgICAgICAgICAgICAgIEZpbGUgdGVzdEZpbGUgPSBuZXcgRmlsZShwYXRoKTsKICAgICAgICAgICAgICAgICAgICAgaWYgKCF0ZXN0RmlsZS5leGlzdHMoKSkgewpAQCAtMTEzMiw5ICsxMTU2LDExIEBACiAgICAgICAgICAgICAgICAgICAgIENvbnRlbnRWYWx1ZXMgdmFsdWVzID0gbmV3IENvbnRlbnRWYWx1ZXMoKTsKICAgICAgICAgICAgICAgICAgICAgdmFsdWVzLnB1dChNZWRpYVN0b3JlLkF1ZGlvLlBsYXlsaXN0cy5EQVRBLCAiIik7CiAgICAgICAgICAgICAgICAgICAgIHZhbHVlcy5wdXQoTWVkaWFTdG9yZS5BdWRpby5QbGF5bGlzdHMuREFURV9NT0RJRklFRCwgMCk7Ci0gICAgICAgICAgICAgICAgICAgIG1NZWRpYVByb3ZpZGVyLnVwZGF0ZShDb250ZW50VXJpcy53aXRoQXBwZW5kZWRJZChtUGxheWxpc3RzVXJpLCBlbnRyeS5tUm93SWQpLCB2YWx1ZXMsIG51bGwsIG51bGwpOworICAgICAgICAgICAgICAgICAgICBtTWVkaWFQcm92aWRlci51cGRhdGUoQ29udGVudFVyaXMud2l0aEFwcGVuZGVkSWQobVBsYXlsaXN0c1VyaSwgZW50cnkubVJvd0lkKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXMsIG51bGwsIG51bGwpOwogICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIG1NZWRpYVByb3ZpZGVyLmRlbGV0ZShDb250ZW50VXJpcy53aXRoQXBwZW5kZWRJZChlbnRyeS5tVGFibGVVcmksIGVudHJ5Lm1Sb3dJZCksIG51bGwsIG51bGwpOworICAgICAgICAgICAgICAgICAgICBtTWVkaWFQcm92aWRlci5kZWxldGUoQ29udGVudFVyaXMud2l0aEFwcGVuZGVkSWQobUZpbGVzVXJpLCBlbnRyeS5tUm93SWQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwsIG51bGwpOwogICAgICAgICAgICAgICAgICAgICBpdGVyYXRvci5yZW1vdmUoKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CkBAIC0xMTYyLDYgKzExODgsNyBAQAogICAgICAgICBtVmlkZW9VcmkgPSBWaWRlby5NZWRpYS5nZXRDb250ZW50VXJpKHZvbHVtZU5hbWUpOwogICAgICAgICBtSW1hZ2VzVXJpID0gSW1hZ2VzLk1lZGlhLmdldENvbnRlbnRVcmkodm9sdW1lTmFtZSk7CiAgICAgICAgIG1UaHVtYnNVcmkgPSBJbWFnZXMuVGh1bWJuYWlscy5nZXRDb250ZW50VXJpKHZvbHVtZU5hbWUpOworICAgICAgICBtRmlsZXNVcmkgPSBGaWxlcy5nZXRDb250ZW50VXJpKHZvbHVtZU5hbWUpOwogCiAgICAgICAgIGlmICghdm9sdW1lTmFtZS5lcXVhbHMoImludGVybmFsIikpIHsKICAgICAgICAgICAgIC8vIHdlIG9ubHkgc3VwcG9ydCBwbGF5bGlzdHMgb24gZXh0ZXJuYWwgbWVkaWEKQEAgLTExNzAsOSArMTE5NywxMiBAQAogICAgICAgICAgICAgbUdlbnJlQ2FjaGUgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFVyaT4oKTsKICAgICAgICAgICAgIG1HZW5yZXNVcmkgPSBHZW5yZXMuZ2V0Q29udGVudFVyaSh2b2x1bWVOYW1lKTsKICAgICAgICAgICAgIG1QbGF5bGlzdHNVcmkgPSBQbGF5bGlzdHMuZ2V0Q29udGVudFVyaSh2b2x1bWVOYW1lKTsKLSAgICAgICAgICAgIC8vIGFzc3VtaW5nIGV4dGVybmFsIHN0b3JhZ2UgaXMgRkFUIChjYXNlIGluc2Vuc2l0aXZlKSwgZXhjZXB0IG9uIHRoZSBzaW11bGF0b3IuCi0gICAgICAgICAgICBpZiAoIFByb2Nlc3Muc3VwcG9ydHNQcm9jZXNzZXMoKSkgewotICAgICAgICAgICAgICAgIG1DYXNlSW5zZW5zaXRpdmVQYXRocyA9IHRydWU7CisKKyAgICAgICAgICAgIG1DYXNlSW5zZW5zaXRpdmVQYXRocyA9ICFtQ29udGV4dC5nZXRSZXNvdXJjZXMoKS5nZXRCb29sZWFuKAorICAgICAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuYm9vbC5jb25maWdfY2FzZVNlbnNpdGl2ZUV4dGVybmFsU3RvcmFnZSk7CisgICAgICAgICAgICBpZiAoIVByb2Nlc3Muc3VwcG9ydHNQcm9jZXNzZXMoKSkgeworICAgICAgICAgICAgICAgIC8vIFNpbXVsYXRvciB1c2VzIGhvc3QgZmlsZSBzeXN0ZW0sIHNvIGl0IHNob3VsZCBiZSBjYXNlIHNlbnNpdGl2ZS4KKyAgICAgICAgICAgICAgICBtQ2FzZUluc2Vuc2l0aXZlUGF0aHMgPSBmYWxzZTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KQEAgLTExODEsMTEgKzEyMTEsMTEgQEAKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIGxvbmcgc3RhcnQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKICAgICAgICAgICAgIGluaXRpYWxpemUodm9sdW1lTmFtZSk7Ci0gICAgICAgICAgICBwcmVzY2FuKG51bGwpOworICAgICAgICAgICAgcHJlc2NhbihudWxsLCB0cnVlKTsKICAgICAgICAgICAgIGxvbmcgcHJlc2NhbiA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwogCiAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGRpcmVjdG9yaWVzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgcHJvY2Vzc0RpcmVjdG9yeShkaXJlY3Rvcmllc1tpXSwgTWVkaWFGaWxlLnNGaWxlRXh0ZW5zaW9ucywgbUNsaWVudCk7CisgICAgICAgICAgICAgICAgcHJvY2Vzc0RpcmVjdG9yeShkaXJlY3Rvcmllc1tpXSwgbUNsaWVudCk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBsb25nIHNjYW4gPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKICAgICAgICAgICAgIHBvc3RzY2FuKGRpcmVjdG9yaWVzKTsKQEAgLTEyMTIsNyArMTI0Miw3IEBACiAgICAgcHVibGljIFVyaSBzY2FuU2luZ2xlRmlsZShTdHJpbmcgcGF0aCwgU3RyaW5nIHZvbHVtZU5hbWUsIFN0cmluZyBtaW1lVHlwZSkgewogICAgICAgICB0cnkgewogICAgICAgICAgICAgaW5pdGlhbGl6ZSh2b2x1bWVOYW1lKTsKLSAgICAgICAgICAgIHByZXNjYW4ocGF0aCk7CisgICAgICAgICAgICBwcmVzY2FuKHBhdGgsIHRydWUpOwogCiAgICAgICAgICAgICBGaWxlIGZpbGUgPSBuZXcgRmlsZShwYXRoKTsKIApAQCAtMTIyNyw2ICsxMjU3LDM2IEBACiAgICAgICAgIH0KICAgICB9CiAKKyAgICBwdWJsaWMgdm9pZCBzY2FuTXRwRmlsZShTdHJpbmcgcGF0aCwgU3RyaW5nIHZvbHVtZU5hbWUsIGludCBvYmplY3RIYW5kbGUsIGludCBmb3JtYXQpIHsKKyAgICAgICAgTWVkaWFGaWxlLk1lZGlhRmlsZVR5cGUgbWVkaWFGaWxlVHlwZSA9IE1lZGlhRmlsZS5nZXRGaWxlVHlwZShwYXRoKTsKKyAgICAgICAgaW50IGZpbGVUeXBlID0gKG1lZGlhRmlsZVR5cGUgPT0gbnVsbCA/IDAgOiBtZWRpYUZpbGVUeXBlLmZpbGVUeXBlKTsKKworICAgICAgICBpZiAoIU1lZGlhRmlsZS5pc0F1ZGlvRmlsZVR5cGUoZmlsZVR5cGUpICYmICFNZWRpYUZpbGUuaXNWaWRlb0ZpbGVUeXBlKGZpbGVUeXBlKSAmJgorICAgICAgICAgICAgIU1lZGlhRmlsZS5pc0ltYWdlRmlsZVR5cGUoZmlsZVR5cGUpICYmICFNZWRpYUZpbGUuaXNQbGF5TGlzdEZpbGVUeXBlKGZpbGVUeXBlKSkgeworICAgICAgICAgICAgLy8gbm90aGluZyB0byBkbworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgbU10cE9iamVjdEhhbmRsZSA9IG9iamVjdEhhbmRsZTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGluaXRpYWxpemUodm9sdW1lTmFtZSk7CisgICAgICAgICAgICAvLyBNVFAgd2lsbCBjcmVhdGUgYSBmaWxlIGVudHJ5IGZvciB1cyBzbyB3ZSBkb24ndCB3YW50IHRvIGRvIGl0IGluIHByZXNjYW4KKyAgICAgICAgICAgIHByZXNjYW4ocGF0aCwgZmFsc2UpOworCisgICAgICAgICAgICBGaWxlIGZpbGUgPSBuZXcgRmlsZShwYXRoKTsKKworICAgICAgICAgICAgLy8gbGFzdE1vZGlmaWVkIGlzIGluIG1pbGxpc2Vjb25kcyBvbiBGaWxlcy4KKyAgICAgICAgICAgIGxvbmcgbGFzdE1vZGlmaWVkU2Vjb25kcyA9IGZpbGUubGFzdE1vZGlmaWVkKCkgLyAxMDAwOworCisgICAgICAgICAgICAvLyBhbHdheXMgc2NhbiB0aGUgZmlsZSwgc28gd2UgY2FuIHJldHVybiB0aGUgY29udGVudDovL21lZGlhIFVyaSBmb3IgZXhpc3RpbmcgZmlsZXMKKyAgICAgICAgICAgIG1DbGllbnQuZG9TY2FuRmlsZShwYXRoLCBtZWRpYUZpbGVUeXBlLm1pbWVUeXBlLCBsYXN0TW9kaWZpZWRTZWNvbmRzLCBmaWxlLmxlbmd0aCgpLCB0cnVlKTsKKyAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIExvZy5lKFRBRywgIlJlbW90ZUV4Y2VwdGlvbiBpbiBNZWRpYVNjYW5uZXIuc2NhbkZpbGUoKSIsIGUpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgbU10cE9iamVjdEhhbmRsZSA9IDA7CisgICAgICAgIH0KKyAgICB9CisKICAgICAvLyByZXR1cm5zIHRoZSBudW1iZXIgb2YgbWF0Y2hpbmcgZmlsZS9kaXJlY3RvcnkgbmFtZXMsIHN0YXJ0aW5nIGZyb20gdGhlIHJpZ2h0CiAgICAgcHJpdmF0ZSBpbnQgbWF0Y2hQYXRocyhTdHJpbmcgcGF0aDEsIFN0cmluZyBwYXRoMikgewogICAgICAgICBpbnQgcmVzdWx0ID0gMDsKQEAgLTE1MDYsNyArMTU2Niw3IEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICBwcml2YXRlIG5hdGl2ZSB2b2lkIHByb2Nlc3NEaXJlY3RvcnkoU3RyaW5nIHBhdGgsIFN0cmluZyBleHRlbnNpb25zLCBNZWRpYVNjYW5uZXJDbGllbnQgY2xpZW50KTsKKyAgICBwcml2YXRlIG5hdGl2ZSB2b2lkIHByb2Nlc3NEaXJlY3RvcnkoU3RyaW5nIHBhdGgsIE1lZGlhU2Nhbm5lckNsaWVudCBjbGllbnQpOwogICAgIHByaXZhdGUgbmF0aXZlIHZvaWQgcHJvY2Vzc0ZpbGUoU3RyaW5nIHBhdGgsIFN0cmluZyBtaW1lVHlwZSwgTWVkaWFTY2FubmVyQ2xpZW50IGNsaWVudCk7CiAgICAgcHVibGljIG5hdGl2ZSB2b2lkIHNldExvY2FsZShTdHJpbmcgbG9jYWxlKTsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvamF2YS9hbmRyb2lkL21lZGlhL010cENsaWVudC5qYXZhIGIvbWVkaWEvamF2YS9hbmRyb2lkL21lZGlhL010cENsaWVudC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY3YzBjZTIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9qYXZhL2FuZHJvaWQvbWVkaWEvTXRwQ2xpZW50LmphdmEKQEAgLTAsMCArMSwxMDggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQubWVkaWE7CisKK2ltcG9ydCBhbmRyb2lkLm9zLlBhcmNlbEZpbGVEZXNjcmlwdG9yOworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CisKKy8qKgorICoge0BoaWRlfQorICovCitwdWJsaWMgY2xhc3MgTXRwQ2xpZW50IHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiTXRwQ2xpZW50IjsKKworICAgIHByaXZhdGUgZmluYWwgTGlzdGVuZXIgbUxpc3RlbmVyOworCisgICAgc3RhdGljIHsKKyAgICAgICAgU3lzdGVtLmxvYWRMaWJyYXJ5KCJtZWRpYV9qbmkiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgTXRwQ2xpZW50KExpc3RlbmVyIGxpc3RlbmVyKSB7CisgICAgICAgIG5hdGl2ZV9zZXR1cCgpOworICAgICAgICBpZiAobGlzdGVuZXIgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCJNdHBDbGllbnQ6IGxpc3RlbmVyIGlzIG51bGwiKTsKKyAgICAgICAgfQorICAgICAgICBtTGlzdGVuZXIgPSBsaXN0ZW5lcjsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBmaW5hbGl6ZSgpIHRocm93cyBUaHJvd2FibGUgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgbmF0aXZlX2ZpbmFsaXplKCk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBzdXBlci5maW5hbGl6ZSgpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gc3RhcnQoKSB7CisgICAgICAgIHJldHVybiBuYXRpdmVfc3RhcnQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzdG9wKCkgeworICAgICAgICBuYXRpdmVfc3RvcCgpOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGRlbGV0ZU9iamVjdChpbnQgZGV2aWNlSUQsIGludCBvYmplY3RJRCkgeworICAgICAgICByZXR1cm4gbmF0aXZlX2RlbGV0ZV9vYmplY3QoZGV2aWNlSUQsIG9iamVjdElEKTsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGdldFBhcmVudChpbnQgZGV2aWNlSUQsIGludCBvYmplY3RJRCkgeworICAgICAgICByZXR1cm4gbmF0aXZlX2dldF9wYXJlbnQoZGV2aWNlSUQsIG9iamVjdElEKTsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGdldFN0b3JhZ2VJRChpbnQgZGV2aWNlSUQsIGludCBvYmplY3RJRCkgeworICAgICAgICByZXR1cm4gbmF0aXZlX2dldF9zdG9yYWdlX2lkKGRldmljZUlELCBvYmplY3RJRCk7CisgICAgfQorCisgICAgLy8gY3JlYXRlIGEgZmlsZSBkZXNjcmlwdG9yIGZvciByZWFkaW5nIHRoZSBjb250ZW50cyBvZiBhbiBvYmplY3Qgb3ZlciBNVFAKKyAgICBwdWJsaWMgUGFyY2VsRmlsZURlc2NyaXB0b3Igb3BlbkZpbGUoaW50IGRldmljZUlELCBpbnQgb2JqZWN0SUQpIHsKKyAgICAgICAgcmV0dXJuIG5hdGl2ZV9vcGVuX2ZpbGUoZGV2aWNlSUQsIG9iamVjdElEKTsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50ZXJmYWNlIExpc3RlbmVyIHsKKyAgICAgICAgLy8gY2FsbGVkIHdoZW4gYSBuZXcgTVRQIGRldmljZSBoYXMgYmVlbiBkaXNjb3ZlcmVkCisgICAgICAgIHZvaWQgZGV2aWNlQWRkZWQoaW50IGlkKTsKKworICAgICAgICAvLyBjYWxsZWQgd2hlbiBhbiBNVFAgZGV2aWNlIGhhcyBiZWVuIHJlbW92ZWQKKyAgICAgICAgdm9pZCBkZXZpY2VSZW1vdmVkKGludCBpZCk7CisgICAgfQorCisgICAgLy8gY2FsbGVkIGZyb20gbmF0aXZlIGNvZGUKKyAgICBwcml2YXRlIHZvaWQgZGV2aWNlQWRkZWQoaW50IGlkKSB7CisgICAgICAgIExvZy5kKFRBRywgImRldmljZUFkZGVkICIgKyBpZCk7CisgICAgICAgIG1MaXN0ZW5lci5kZXZpY2VBZGRlZChpZCk7CisgICAgfQorCisgICAgLy8gY2FsbGVkIGZyb20gbmF0aXZlIGNvZGUKKyAgICBwcml2YXRlIHZvaWQgZGV2aWNlUmVtb3ZlZChpbnQgaWQpIHsKKyAgICAgICAgTG9nLmQoVEFHLCAiZGV2aWNlUmVtb3ZlZCAiICsgaWQpOworICAgICAgICBtTGlzdGVuZXIuZGV2aWNlUmVtb3ZlZChpZCk7CisgICAgfQorCisgICAgLy8gdXNlZCBieSB0aGUgSk5JIGNvZGUKKyAgICBwcml2YXRlIGludCBtTmF0aXZlQ29udGV4dDsKKworICAgIHByaXZhdGUgbmF0aXZlIGZpbmFsIHZvaWQgbmF0aXZlX3NldHVwKCk7CisgICAgcHJpdmF0ZSBuYXRpdmUgZmluYWwgdm9pZCBuYXRpdmVfZmluYWxpemUoKTsKKyAgICBwcml2YXRlIG5hdGl2ZSBib29sZWFuIG5hdGl2ZV9zdGFydCgpOworICAgIHByaXZhdGUgbmF0aXZlIHZvaWQgbmF0aXZlX3N0b3AoKTsKKyAgICBwcml2YXRlIG5hdGl2ZSBib29sZWFuIG5hdGl2ZV9kZWxldGVfb2JqZWN0KGludCBkZXZpY2VJRCwgaW50IG9iamVjdElEKTsKKyAgICBwcml2YXRlIG5hdGl2ZSBpbnQgbmF0aXZlX2dldF9wYXJlbnQoaW50IGRldmljZUlELCBpbnQgb2JqZWN0SUQpOworICAgIHByaXZhdGUgbmF0aXZlIGludCBuYXRpdmVfZ2V0X3N0b3JhZ2VfaWQoaW50IGRldmljZUlELCBpbnQgb2JqZWN0SUQpOworICAgIHByaXZhdGUgbmF0aXZlIFBhcmNlbEZpbGVEZXNjcmlwdG9yIG5hdGl2ZV9vcGVuX2ZpbGUoaW50IGRldmljZUlELCBpbnQgb2JqZWN0SUQpOworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvamF2YS9hbmRyb2lkL21lZGlhL010cENvbnN0YW50cy5qYXZhIGIvbWVkaWEvamF2YS9hbmRyb2lkL21lZGlhL010cENvbnN0YW50cy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE3ZDMzY2UKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9qYXZhL2FuZHJvaWQvbWVkaWEvTXRwQ29uc3RhbnRzLmphdmEKQEAgLTAsMCArMSw0MDQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQubWVkaWE7CisKKy8qKgorICoge0BoaWRlfQorICovCitwdWJsaWMgZmluYWwgY2xhc3MgTXRwQ29uc3RhbnRzIHsKKworLy8gTVRQIFJlc3BvbnNlIENvZGVzCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUkVTUE9OU0VfVU5ERUZJTkVEID0gMHgyMDAwOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJFU1BPTlNFX09LID0gMHgyMDAxOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJFU1BPTlNFX0dFTkVSQUxfRVJST1IgPSAweDIwMDI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUkVTUE9OU0VfU0VTU0lPTl9OT1RfT1BFTiA9IDB4MjAwMzsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSRVNQT05TRV9JTlZBTElEX1RSQU5TQUNUSU9OX0lEID0gMHgyMDA0OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJFU1BPTlNFX09QRVJBVElPTl9OT1RfU1VQUE9SVEVEID0gMHgyMDA1OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJFU1BPTlNFX1BBUkFNRVRFUl9OT1RfU1VQUE9SVEVEID0gMHgyMDA2OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJFU1BPTlNFX0lOQ09NUExFVEVfVFJBTlNGRVIgPSAweDIwMDc7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUkVTUE9OU0VfSU5WQUxJRF9TVE9SQUdFX0lEID0gMHgyMDA4OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJFU1BPTlNFX0lOVkFMSURfT0JKRUNUX0hBTkRMRSA9IDB4MjAwOTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSRVNQT05TRV9ERVZJQ0VfUFJPUF9OT1RfU1VQUE9SVEVEID0gMHgyMDBBOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJFU1BPTlNFX0lOVkFMSURfT0JKRUNUX0ZPUk1BVF9DT0RFID0gMHgyMDBCOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJFU1BPTlNFX1NUT1JBR0VfRlVMTCA9IDB4MjAwQzsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSRVNQT05TRV9PQkpFQ1RfV1JJVEVfUFJPVEVDVEVEID0gMHgyMDBEOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJFU1BPTlNFX1NUT1JFX1JFQURfT05MWSA9IDB4MjAwRTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSRVNQT05TRV9BQ0NFU1NfREVOSUVEID0gMHgyMDBGOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJFU1BPTlNFX05PX1RIVU1CTkFJTF9QUkVTRU5UID0gMHgyMDEwOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJFU1BPTlNFX1NFTEZfVEVTVF9GQUlMRUQgPSAweDIwMTE7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUkVTUE9OU0VfUEFSVElBTF9ERUxFVElPTiA9IDB4MjAxMjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSRVNQT05TRV9TVE9SRV9OT1RfQVZBSUxBQkxFID0gMHgyMDEzOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJFU1BPTlNFX1NQRUNJRklDQVRJT05fQllfRk9STUFUX1VOU1VQUE9SVEVEID0gMHgyMDE0OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJFU1BPTlNFX05PX1ZBTElEX09CSkVDVF9JTkZPID0gMHgyMDE1OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJFU1BPTlNFX0lOVkFMSURfQ09ERV9GT1JNQVQgPSAweDIwMTY7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUkVTUE9OU0VfVU5LTk9XTl9WRU5ET1JfQ09ERSA9IDB4MjAxNzsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSRVNQT05TRV9DQVBUVVJFX0FMUkVBRFlfVEVSTUlOQVRFRCA9IDB4MjAxODsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSRVNQT05TRV9ERVZJQ0VfQlVTWSA9IDB4MjAxOTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSRVNQT05TRV9JTlZBTElEX1BBUkVOVF9PQkpFQ1QgPSAweDIwMUE7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUkVTUE9OU0VfSU5WQUxJRF9ERVZJQ0VfUFJPUF9GT1JNQVQgPSAweDIwMUI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUkVTUE9OU0VfSU5WQUxJRF9ERVZJQ0VfUFJPUF9WQUxVRSA9IDB4MjAxQzsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSRVNQT05TRV9JTlZBTElEX1BBUkFNRVRFUiA9IDB4MjAxRDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSRVNQT05TRV9TRVNTSU9OX0FMUkVBRFlfT1BFTiA9IDB4MjAxRTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSRVNQT05TRV9UUkFOU0FDVElPTl9DQU5DRUxMRUQgPSAweDIwMUY7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUkVTUE9OU0VfU1BFQ0lGSUNBVElPTl9PRl9ERVNUSU5BVElPTl9VTlNVUFBPUlRFRCA9IDB4MjAyMDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSRVNQT05TRV9JTlZBTElEX09CSkVDVF9QUk9QX0NPREUgPSAweEE4MDE7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUkVTUE9OU0VfSU5WQUxJRF9PQkpFQ1RfUFJPUF9GT1JNQVQgPSAweEE4MDI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUkVTUE9OU0VfSU5WQUxJRF9PQkpFQ1RfUFJPUF9WQUxVRSA9IDB4QTgwMzsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSRVNQT05TRV9JTlZBTElEX09CSkVDVF9SRUZFUkVOQ0UgPSAweEE4MDQ7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUkVTUE9OU0VfR1JPVVBfTk9UX1NVUFBPUlRFRCA9IDB4QTgwNTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSRVNQT05TRV9JTlZBTElEX0RBVEFTRVQgPSAweEE4MDY7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUkVTUE9OU0VfU1BFQ0lGSUNBVElPTl9CWV9HUk9VUF9VTlNVUFBPUlRFRCA9IDB4QTgwNzsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSRVNQT05TRV9TUEVDSUZJQ0FUSU9OX0JZX0RFUFRIX1VOU1VQUE9SVEVEID0gMHhBODA4OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJFU1BPTlNFX09CSkVDVF9UT09fTEFSR0UgPSAweEE4MDk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUkVTUE9OU0VfT0JKRUNUX1BST1BfTk9UX1NVUFBPUlRFRCA9IDB4QTgwQTsKKworICAgIC8vIE1UUCBmb3JtYXQgY29kZXMKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGT1JNQVRfVU5ERUZJTkVEID0gMHgzMDAwOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZPUk1BVF9BU1NPQ0lBVElPTiA9IDB4MzAwMTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGT1JNQVRfU0NSSVBUID0gMHgzMDAyOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZPUk1BVF9FWEVDVVRBQkxFID0gMHgzMDAzOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZPUk1BVF9URVhUID0gMHgzMDA0OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZPUk1BVF9IVE1MID0gMHgzMDA1OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZPUk1BVF9EUE9GID0gMHgzMDA2OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZPUk1BVF9BSUZGID0gMHgzMDA3OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZPUk1BVF9XQVYgPSAweDMwMDg7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRk9STUFUX01QMyA9IDB4MzAwOTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGT1JNQVRfQVZJID0gMHgzMDBBOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZPUk1BVF9NUEVHID0gMHgzMDBCOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZPUk1BVF9BU0YgPSAweDMwMEM7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRk9STUFUX0RFRklORUQgPSAweDM4MDA7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRk9STUFUX0VYSUZfSlBFRyA9IDB4MzgwMTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGT1JNQVRfVElGRl9FUCA9IDB4MzgwMjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGT1JNQVRfRkxBU0hQSVggPSAweDM4MDM7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRk9STUFUX0JNUCA9IDB4MzgwNDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGT1JNQVRfQ0lGRiA9IDB4MzgwNTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGT1JNQVRfR0lGID0gMHgzODA3OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZPUk1BVF9KRklGID0gMHgzODA4OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZPUk1BVF9DRCA9IDB4MzgwOTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGT1JNQVRfUElDVCA9IDB4MzgwQTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGT1JNQVRfUE5HID0gMHgzODBCOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZPUk1BVF9USUZGID0gMHgzODBEOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZPUk1BVF9USUZGX0lUID0gMHgzODBFOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZPUk1BVF9KUDIgPSAweDM4MEY7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRk9STUFUX0pQWCA9IDB4MzgxMDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGT1JNQVRfVU5ERUZJTkVEX0ZJUk1XQVJFID0gMHhCODAyOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZPUk1BVF9XSU5ET1dTX0lNQUdFX0ZPUk1BVCA9IDB4Qjg4MTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGT1JNQVRfVU5ERUZJTkVEX0FVRElPID0gMHhCOTAwOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZPUk1BVF9XTUEgPSAweEI5MDE7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRk9STUFUX09HRyA9IDB4QjkwMjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGT1JNQVRfQUFDID0gMHhCOTAzOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZPUk1BVF9BVURJQkxFID0gMHhCOTA0OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZPUk1BVF9GTEFDID0gMHhCOTA2OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZPUk1BVF9VTkRFRklORURfVklERU8gPSAweEI5ODA7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRk9STUFUX1dNViA9IDB4Qjk4MTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGT1JNQVRfTVA0X0NPTlRBSU5FUiA9IDB4Qjk4MjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGT1JNQVRfTVAyID0gMHhCOTgzOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZPUk1BVF8zR1BfQ09OVEFJTkVSID0gMHhCOTg0OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZPUk1BVF9VTkRFRklORURfQ09MTEVDVElPTiA9IDB4QkEwMDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGT1JNQVRfQUJTVFJBQ1RfTVVMVElNRURJQV9BTEJVTSA9IDB4QkEwMTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGT1JNQVRfQUJTVFJBQ1RfSU1BR0VfQUxCVU0gPSAweEJBMDI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRk9STUFUX0FCU1RSQUNUX0FVRElPX0FMQlVNID0gMHhCQTAzOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZPUk1BVF9BQlNUUkFDVF9WSURFT19BTEJVTSA9IDB4QkEwNDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGT1JNQVRfQUJTVFJBQ1RfQVZfUExBWUxJU1QgPSAweEJBMDU7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRk9STUFUX0FCU1RSQUNUX0NPTlRBQ1RfR1JPVVAgPSAweEJBMDY7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRk9STUFUX0FCU1RSQUNUX01FU1NBR0VfRk9MREVSID0gMHhCQTA3OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZPUk1BVF9BQlNUUkFDVF9DSEFQVEVSRURfUFJPRFVDVElPTiA9IDB4QkEwODsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGT1JNQVRfQUJTVFJBQ1RfQVVESU9fUExBWUxJU1QgPSAweEJBMDk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRk9STUFUX0FCU1RSQUNUX1ZJREVPX1BMQVlMSVNUID0gMHhCQTBBOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZPUk1BVF9BQlNUUkFDVF9NRURJQUNBU1QgPSAweEJBMEI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRk9STUFUX1dQTF9QTEFZTElTVCA9IDB4QkExMDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGT1JNQVRfTTNVX1BMQVlMSVNUID0gMHhCQTExOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZPUk1BVF9NUExfUExBWUxJU1QgPSAweEJBMTI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRk9STUFUX0FTWF9QTEFZTElTVCA9IDB4QkExMzsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGT1JNQVRfUExTX1BMQVlMSVNUID0gMHhCQTE0OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZPUk1BVF9VTkRFRklORURfRE9DVU1FTlQgPSAweEJBODA7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRk9STUFUX0FCU1RSQUNUX0RPQ1VNRU5UID0gMHhCQTgxOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZPUk1BVF9YTUxfRE9DVU1FTlQgPSAweEJBODI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRk9STUFUX01TX1dPUkRfRE9DVU1FTlQgPSAweEJBODM7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRk9STUFUX01IVF9DT01QSUxFRF9IVE1MX0RPQ1VNRU5UID0gMHhCQTg0OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZPUk1BVF9NU19FWENFTF9TUFJFQURTSEVFVCA9IDB4QkE4NTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGT1JNQVRfTVNfUE9XRVJQT0lOVF9QUkVTRU5UQVRJT04gPSAweEJBODY7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRk9STUFUX1VOREVGSU5FRF9NRVNTQUdFID0gMHhCQjAwOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZPUk1BVF9BQlNUUkFDVF9NRVNTU0FHRSA9IDB4QkIwMTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGT1JNQVRfVU5ERUZJTkVEX0NPTlRBQ1QgPSAweEJCODA7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRk9STUFUX0FCU1RSQUNUX0NPTlRBQ1QgPSAweEJCODE7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRk9STUFUX1ZDQVJEXzIgPSAweEJCODI7CisKKyAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNBYnN0cmFjdE9iamVjdChpbnQgZm9ybWF0KSB7CisgICAgICAgIHN3aXRjaCAoZm9ybWF0KSB7CisgICAgICAgICAgICBjYXNlIEZPUk1BVF9BQlNUUkFDVF9NVUxUSU1FRElBX0FMQlVNOgorICAgICAgICAgICAgY2FzZSBGT1JNQVRfQUJTVFJBQ1RfSU1BR0VfQUxCVU06CisgICAgICAgICAgICBjYXNlIEZPUk1BVF9BQlNUUkFDVF9BVURJT19BTEJVTToKKyAgICAgICAgICAgIGNhc2UgRk9STUFUX0FCU1RSQUNUX1ZJREVPX0FMQlVNOgorICAgICAgICAgICAgY2FzZSBGT1JNQVRfQUJTVFJBQ1RfQVZfUExBWUxJU1Q6CisgICAgICAgICAgICBjYXNlIEZPUk1BVF9BQlNUUkFDVF9DT05UQUNUX0dST1VQOgorICAgICAgICAgICAgY2FzZSBGT1JNQVRfQUJTVFJBQ1RfTUVTU0FHRV9GT0xERVI6CisgICAgICAgICAgICBjYXNlIEZPUk1BVF9BQlNUUkFDVF9DSEFQVEVSRURfUFJPRFVDVElPTjoKKyAgICAgICAgICAgIGNhc2UgRk9STUFUX0FCU1RSQUNUX0FVRElPX1BMQVlMSVNUOgorICAgICAgICAgICAgY2FzZSBGT1JNQVRfQUJTVFJBQ1RfVklERU9fUExBWUxJU1Q6CisgICAgICAgICAgICBjYXNlIEZPUk1BVF9BQlNUUkFDVF9NRURJQUNBU1Q6CisgICAgICAgICAgICBjYXNlIEZPUk1BVF9BQlNUUkFDVF9ET0NVTUVOVDoKKyAgICAgICAgICAgIGNhc2UgRk9STUFUX0FCU1RSQUNUX01FU1NTQUdFOgorICAgICAgICAgICAgY2FzZSBGT1JNQVRfQUJTVFJBQ1RfQ09OVEFDVDoKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gTVRQIG9iamVjdCBwcm9wZXJ0aWVzCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPUEVSVFlfU1RPUkFHRV9JRCA9IDB4REMwMTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9QRVJUWV9PQkpFQ1RfRk9STUFUID0gMHhEQzAyOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST1BFUlRZX1BST1RFQ1RJT05fU1RBVFVTID0gMHhEQzAzOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST1BFUlRZX09CSkVDVF9TSVpFID0gMHhEQzA0OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST1BFUlRZX0FTU09DSUFUSU9OX1RZUEUgPSAweERDMDU7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPUEVSVFlfQVNTT0NJQVRJT05fREVTQyA9IDB4REMwNjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9QRVJUWV9PQkpFQ1RfRklMRV9OQU1FID0gMHhEQzA3OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST1BFUlRZX0RBVEVfQ1JFQVRFRCA9IDB4REMwODsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9QRVJUWV9EQVRFX01PRElGSUVEID0gMHhEQzA5OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST1BFUlRZX0tFWVdPUkRTID0gMHhEQzBBOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST1BFUlRZX1BBUkVOVF9PQkpFQ1QgPSAweERDMEI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPUEVSVFlfQUxMT1dFRF9GT0xERVJfQ09OVEVOVFMgPSAweERDMEM7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPUEVSVFlfSElEREVOID0gMHhEQzBEOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST1BFUlRZX1NZU1RFTV9PQkpFQ1QgPSAweERDMEU7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPUEVSVFlfUEVSU0lTVEVOVF9VSUQgPSAweERDNDE7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPUEVSVFlfU1lOQ19JRCA9IDB4REM0MjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9QRVJUWV9QUk9QRVJUWV9CQUcgPSAweERDNDM7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPUEVSVFlfTkFNRSA9IDB4REM0NDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9QRVJUWV9DUkVBVEVEX0JZID0gMHhEQzQ1OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST1BFUlRZX0FSVElTVCA9IDB4REM0NjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9QRVJUWV9EQVRFX0FVVEhPUkVEID0gMHhEQzQ3OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST1BFUlRZX0RFU0NSSVBUSU9OID0gMHhEQzQ4OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST1BFUlRZX1VSTF9SRUZFUkVOQ0UgPSAweERDNDk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPUEVSVFlfTEFOR1VBR0VfTE9DQUxFID0gMHhEQzRBOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST1BFUlRZX0NPUFlSSUdIVF9JTkZPUk1BVElPTiA9IDB4REM0QjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9QRVJUWV9TT1VSQ0UgPSAweERDNEM7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPUEVSVFlfT1JJR0lOX0xPQ0FUSU9OID0gMHhEQzREOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST1BFUlRZX0RBVEVfQURERUQgPSAweERDNEU7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPUEVSVFlfTk9OX0NPTlNVTUFCTEUgPSAweERDNEY7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPUEVSVFlfQ09SUlVQVF9VTlBMQVlBQkxFID0gMHhEQzUwOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST1BFUlRZX1BST0RVQ0VSX1NFUklBTF9OVU1CRVIgPSAweERDNTE7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPUEVSVFlfUkVQUkVTRU5UQVRJVkVfU0FNUExFX0ZPUk1BVCA9IDB4REM4MTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9QRVJUWV9SRVBSRVNFTlRBVElWRV9TQU1QTEVfU0laRSA9IDB4REM4MjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9QRVJUWV9SRVBSRVNFTlRBVElWRV9TQU1QTEVfSEVJR0hUID0gMHhEQzgzOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST1BFUlRZX1JFUFJFU0VOVEFUSVZFX1NBTVBMRV9XSURUSCA9IDB4REM4NDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9QRVJUWV9SRVBSRVNFTlRBVElWRV9TQU1QTEVfRFVSQVRJT04gPSAweERDODU7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPUEVSVFlfUkVQUkVTRU5UQVRJVkVfU0FNUExFX0RBVEEgPSAweERDODY7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPUEVSVFlfV0lEVEggPSAweERDODc7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPUEVSVFlfSEVJR0hUID0gMHhEQzg4OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST1BFUlRZX0RVUkFUSU9OID0gMHhEQzg5OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST1BFUlRZX1JBVElORyA9IDB4REM4QTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9QRVJUWV9UUkFDSyA9IDB4REM4QjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9QRVJUWV9HRU5SRSA9IDB4REM4QzsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9QRVJUWV9DUkVESVRTID0gMHhEQzhEOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST1BFUlRZX0xZUklDUyA9IDB4REM4RTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9QRVJUWV9TVUJTQ1JJUFRJT05fQ09OVEVOVF9JRCA9IDB4REM4RjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9QRVJUWV9QUk9EVUNFRF9CWSA9IDB4REM5MDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9QRVJUWV9VU0VfQ09VTlQgPSAweERDOTE7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPUEVSVFlfU0tJUF9DT1VOVCA9IDB4REM5MjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9QRVJUWV9MQVNUX0FDQ0VTU0VEID0gMHhEQzkzOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST1BFUlRZX1BBUkVOVEFMX1JBVElORyA9IDB4REM5NDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9QRVJUWV9NRVRBX0dFTlJFID0gMHhEQzk1OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST1BFUlRZX0NPTVBPU0VSID0gMHhEQzk2OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST1BFUlRZX0VGRkVDVElWRV9SQVRJTkcgPSAweERDOTc7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPUEVSVFlfU1VCVElUTEUgPSAweERDOTg7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPUEVSVFlfT1JJR0lOQUxfUkVMRUFTRV9EQVRFID0gMHhEQzk5OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST1BFUlRZX0FMQlVNX05BTUUgPSAweERDOUE7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPUEVSVFlfQUxCVU1fQVJUSVNUID0gMHhEQzlCOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST1BFUlRZX01PT0QgPSAweERDOUM7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPUEVSVFlfRFJNX1NUQVRVUyA9IDB4REM5RDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9QRVJUWV9TVUJfREVTQ1JJUFRJT04gPSAweERDOUU7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPUEVSVFlfSVNfQ1JPUFBFRCA9IDB4RENEMTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9QRVJUWV9JU19DT0xPVVJfQ09SUkVDVEVEID0gMHhEQ0QyOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST1BFUlRZX0lNQUdFX0JJVF9ERVBUSCA9IDB4RENEMzsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9QRVJUWV9GX05VTUJFUiA9IDB4RENENDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9QRVJUWV9FWFBPU1VSRV9USU1FID0gMHhEQ0Q1OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST1BFUlRZX0VYUE9TVVJFX0lOREVYID0gMHhEQ0Q2OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST1BFUlRZX1RPVEFMX0JJVFJBVEUgPSAweERFOTE7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPUEVSVFlfQklUUkFURV9UWVBFID0gMHhERTkyOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST1BFUlRZX1NBTVBMRV9SQVRFID0gMHhERTkzOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST1BFUlRZX05VTUJFUl9PRl9DSEFOTkVMUyA9IDB4REU5NDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9QRVJUWV9BVURJT19CSVRfREVQVEggPSAweERFOTU7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPUEVSVFlfU0NBTl9UWVBFID0gMHhERTk3OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST1BFUlRZX0FVRElPX1dBVkVfQ09ERUMgPSAweERFOTk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPUEVSVFlfQVVESU9fQklUUkFURSA9IDB4REU5QTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9QRVJUWV9WSURFT19GT1VSQ0NfQ09ERUMgPSAweERFOUI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPUEVSVFlfVklERU9fQklUUkFURSA9IDB4REU5QzsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9QRVJUWV9GUkFNRVNfUEVSX1RIT1VTQU5EX1NFQ09ORFMgPSAweERFOUQ7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPUEVSVFlfS0VZRlJBTUVfRElTVEFOQ0UgPSAweERFOUU7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPUEVSVFlfQlVGRkVSX1NJWkUgPSAweERFOUY7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPUEVSVFlfRU5DT0RJTkdfUVVBTElUWSA9IDB4REVBMDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9QRVJUWV9FTkNPRElOR19QUk9GSUxFID0gMHhERUExOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST1BFUlRZX0RJU1BMQVlfTkFNRSA9IDB4RENFMDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9QRVJUWV9CT0RZX1RFWFQgPSAweERDRTE7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPUEVSVFlfU1VCSkVDVCA9IDB4RENFMjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9QRVJUWV9QUklPUklUWSA9IDB4RENFMzsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9QRVJUWV9HSVZFTl9OQU1FID0gMHhERDAwOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST1BFUlRZX01JRERMRV9OQU1FUyA9IDB4REQwMTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9QRVJUWV9GQU1JTFlfTkFNRSA9IDB4REQwMjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9QRVJUWV9QUkVGSVggPSAweEREMDM7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPUEVSVFlfU1VGRklYID0gMHhERDA0OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST1BFUlRZX1BIT05FVElDX0dJVkVOX05BTUUgPSAweEREMDU7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPUEVSVFlfUEhPTkVUSUNfRkFNSUxZX05BTUUgPSAweEREMDY7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPUEVSVFlfRU1BSUxfUFJJTUFSWSA9IDB4REQwNzsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9QRVJUWV9FTUFJTF9QRVJTT05BTF8xID0gMHhERDA4OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST1BFUlRZX0VNQUlMX1BFUlNPTkFMXzIgPSAweEREMDk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPUEVSVFlfRU1BSUxfQlVTSU5FU1NfMSA9IDB4REQwQTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9QRVJUWV9FTUFJTF9CVVNJTkVTU18yID0gMHhERDBCOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST1BFUlRZX0VNQUlMX09USEVSUyA9IDB4REQwQzsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9QRVJUWV9QSE9ORV9OVU1CRVJfUFJJTUFSWSA9IDB4REQwRDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9QRVJUWV9QSE9ORV9OVU1CRVJfUEVSU09OQUwgPSAweEREMEU7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPUEVSVFlfUEhPTkVfTlVNQkVSX1BFUlNPTkFMXzIgPSAweEREMEY7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPUEVSVFlfUEhPTkVfTlVNQkVSX0JVU0lORVNTID0gMHhERDEwOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST1BFUlRZX1BIT05FX05VTUJFUl9CVVNJTkVTU18yID0gMHhERDExOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST1BFUlRZX1BIT05FX05VTUJFUl9NT0JJTEU9IDB4REQxMjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9QRVJUWV9QSE9ORV9OVU1CRVJfTU9CSUxFXzIgPSAweEREMTM7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPUEVSVFlfRkFYX05VTUJFUl9QUklNQVJZID0gMHhERDE0OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST1BFUlRZX0ZBWF9OVU1CRVJfUEVSU09OQUw9IDB4REQxNTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9QRVJUWV9GQVhfTlVNQkVSX0JVU0lORVNTPSAweEREMTY7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPUEVSVFlfUEFHRVJfTlVNQkVSID0gMHhERDE3OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST1BFUlRZX1BIT05FX05VTUJFUl9PVEhFUlM9IDB4REQxODsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9QRVJUWV9QUklNQVJZX1dFQl9BRERSRVNTPSAweEREMTk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPUEVSVFlfUEVSU09OQUxfV0VCX0FERFJFU1MgPSAweEREMUE7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPUEVSVFlfQlVTSU5FU1NfV0VCX0FERFJFU1MgPSAweEREMUI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPUEVSVFlfSU5TVEFOVF9NRVNTQU5HRVJfQUREUkVTUyA9IDB4REQxQzsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9QRVJUWV9JTlNUQU5UX01FU1NBTkdFUl9BRERSRVNTXzIgPSAweEREMUQ7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPUEVSVFlfSU5TVEFOVF9NRVNTQU5HRVJfQUREUkVTU18zID0gMHhERDFFOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST1BFUlRZX1BPU1RBTF9BRERSRVNTX1BFUlNPTkFMX0ZVTEwgPSAweEREMUY7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPUEVSVFlfUE9TVEFMX0FERFJFU1NfUEVSU09OQUxfTElORV8xID0gMHhERDIwOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST1BFUlRZX1BPU1RBTF9BRERSRVNTX1BFUlNPTkFMX0xJTkVfMiA9IDB4REQyMTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9QRVJUWV9QT1NUQUxfQUREUkVTU19QRVJTT05BTF9DSVRZID0gMHhERDIyOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST1BFUlRZX1BPU1RBTF9BRERSRVNTX1BFUlNPTkFMX1JFR0lPTiA9IDB4REQyMzsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9QRVJUWV9QT1NUQUxfQUREUkVTU19QRVJTT05BTF9QT1NUQUxfQ09ERSA9IDB4REQyNDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9QRVJUWV9QT1NUQUxfQUREUkVTU19QRVJTT05BTF9DT1VOVFJZID0gMHhERDI1OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST1BFUlRZX1BPU1RBTF9BRERSRVNTX0JVU0lORVNTX0ZVTEwgPSAweEREMjY7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPUEVSVFlfUE9TVEFMX0FERFJFU1NfQlVTSU5FU1NfTElORV8xID0gMHhERDI3OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST1BFUlRZX1BPU1RBTF9BRERSRVNTX0JVU0lORVNTX0xJTkVfMiA9IDB4REQyODsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9QRVJUWV9QT1NUQUxfQUREUkVTU19CVVNJTkVTU19DSVRZID0gMHhERDI5OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST1BFUlRZX1BPU1RBTF9BRERSRVNTX0JVU0lORVNTX1JFR0lPTiA9IDB4REQyQTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9QRVJUWV9QT1NUQUxfQUREUkVTU19CVVNJTkVTU19QT1NUQUxfQ09ERSA9IDB4REQyQjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9QRVJUWV9QT1NUQUxfQUREUkVTU19CVVNJTkVTU19DT1VOVFJZID0gMHhERDJDOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST1BFUlRZX1BPU1RBTF9BRERSRVNTX09USEVSX0ZVTEwgPSAweEREMkQ7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPUEVSVFlfUE9TVEFMX0FERFJFU1NfT1RIRVJfTElORV8xID0gMHhERDJFOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST1BFUlRZX1BPU1RBTF9BRERSRVNTX09USEVSX0xJTkVfMiA9IDB4REQyRjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9QRVJUWV9QT1NUQUxfQUREUkVTU19PVEhFUl9DSVRZID0gMHhERDMwOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST1BFUlRZX1BPU1RBTF9BRERSRVNTX09USEVSX1JFR0lPTiA9IDB4REQzMTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9QRVJUWV9QT1NUQUxfQUREUkVTU19PVEhFUl9QT1NUQUxfQ09ERSA9IDB4REQzMjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9QRVJUWV9QT1NUQUxfQUREUkVTU19PVEhFUl9DT1VOVFJZID0gMHhERDMzOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST1BFUlRZX09SR0FOSVpBVElPTl9OQU1FID0gMHhERDM0OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST1BFUlRZX1BIT05FVElDX09SR0FOSVpBVElPTl9OQU1FID0gMHhERDM1OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST1BFUlRZX1JPTEUgPSAweEREMzY7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPUEVSVFlfQklSVEhEQVRFID0gMHhERDM3OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST1BFUlRZX01FU1NBR0VfVE8gPSAweERENDA7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPUEVSVFlfTUVTU0FHRV9DQyA9IDB4REQ0MTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9QRVJUWV9NRVNTQUdFX0JDQyA9IDB4REQ0MjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9QRVJUWV9NRVNTQUdFX1JFQUQgPSAweERENDM7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPUEVSVFlfTUVTU0FHRV9SRUNFSVZFRF9USU1FID0gMHhERDQ0OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST1BFUlRZX01FU1NBR0VfU0VOREVSID0gMHhERDQ1OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST1BFUlRZX0FDVElWSVRZX0JFR0lOX1RJTUUgPSAweERENTA7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPUEVSVFlfQUNUSVZJVFlfRU5EX1RJTUUgPSAweERENTE7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPUEVSVFlfQUNUSVZJVFlfTE9DQVRJT04gPSAweERENTI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPUEVSVFlfQUNUSVZJVFlfUkVRVUlSRURfQVRURU5ERUVTID0gMHhERDU0OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST1BFUlRZX0FDVElWSVRZX09QVElPTkFMX0FUVEVOREVFUyA9IDB4REQ1NTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9QRVJUWV9BQ1RJVklUWV9SRVNPVVJDRVMgPSAweERENTY7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPUEVSVFlfQUNUSVZJVFlfQUNDRVBURUQgPSAweERENTc7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPUEVSVFlfQUNUSVZJVFlfVEVOVEFUSVZFID0gMHhERDU4OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST1BFUlRZX0FDVElWSVRZX0RFQ0xJTkVEID0gMHhERDU5OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST1BFUlRZX0FDVElWSVRZX1JFTUFJTkRFUl9USU1FID0gMHhERDVBOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST1BFUlRZX0FDVElWSVRZX09XTkVSID0gMHhERDVCOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST1BFUlRZX0FDVElWSVRZX1NUQVRVUyA9IDB4REQ1QzsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9QRVJUWV9PV05FUiA9IDB4REQ1RDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9QRVJUWV9FRElUT1IgPSAweERENUU7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPUEVSVFlfV0VCTUFTVEVSID0gMHhERDVGOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST1BFUlRZX1VSTF9TT1VSQ0UgPSAweERENjA7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPUEVSVFlfVVJMX0RFU1RJTkFUSU9OID0gMHhERDYxOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST1BFUlRZX1RJTUVfQk9PS01BUksgPSAweERENjI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPUEVSVFlfT0JKRUNUX0JPT0tNQVJLID0gMHhERDYzOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST1BFUlRZX0JZVEVfQk9PS01BUksgPSAweERENjQ7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPUEVSVFlfTEFTVF9CVUlMRF9EQVRFID0gMHhERDcwOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST1BFUlRZX1RJTUVfVE9fTElWRSA9IDB4REQ3MTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9QRVJUWV9NRURJQV9HVUlEID0gMHhERDcyOworCisgICAgLy8gTVRQIGRldmljZSBwcm9wZXJ0aWVzCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgREVWSUNFX1BST1BFUlRZX1VOREVGSU5FRCA9IDB4NTAwMDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBERVZJQ0VfUFJPUEVSVFlfQkFUVEVSWV9MRVZFTCA9IDB4NTAwMTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBERVZJQ0VfUFJPUEVSVFlfRlVOQ1RJT05BTF9NT0RFID0gMHg1MDAyOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERFVklDRV9QUk9QRVJUWV9JTUFHRV9TSVpFID0gMHg1MDAzOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERFVklDRV9QUk9QRVJUWV9DT01QUkVTU0lPTl9TRVRUSU5HID0gMHg1MDA0OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERFVklDRV9QUk9QRVJUWV9XSElURV9CQUxBTkNFID0gMHg1MDA1OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERFVklDRV9QUk9QRVJUWV9SR0JfR0FJTiA9IDB4NTAwNjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBERVZJQ0VfUFJPUEVSVFlfRl9OVU1CRVIgPSAweDUwMDc7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgREVWSUNFX1BST1BFUlRZX0ZPQ0FMX0xFTkdUSCA9IDB4NTAwODsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBERVZJQ0VfUFJPUEVSVFlfRk9DVVNfRElTVEFOQ0UgPSAweDUwMDk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgREVWSUNFX1BST1BFUlRZX0ZPQ1VTX01PREUgPSAweDUwMEE7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgREVWSUNFX1BST1BFUlRZX0VYUE9TVVJFX01FVEVSSU5HX01PREUgPSAweDUwMEI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgREVWSUNFX1BST1BFUlRZX0ZMQVNIX01PREUgPSAweDUwMEM7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgREVWSUNFX1BST1BFUlRZX0VYUE9TVVJFX1RJTUUgPSAweDUwMEQ7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgREVWSUNFX1BST1BFUlRZX0VYUE9TVVJFX1BST0dSQU1fTU9ERSA9IDB4NTAwRTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBERVZJQ0VfUFJPUEVSVFlfRVhQT1NVUkVfSU5ERVggPSAweDUwMEY7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgREVWSUNFX1BST1BFUlRZX0VYUE9TVVJFX0JJQVNfQ09NUEVOU0FUSU9OID0gMHg1MDEwOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERFVklDRV9QUk9QRVJUWV9EQVRFVElNRSA9IDB4NTAxMTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBERVZJQ0VfUFJPUEVSVFlfQ0FQVFVSRV9ERUxBWSA9IDB4NTAxMjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBERVZJQ0VfUFJPUEVSVFlfU1RJTExfQ0FQVFVSRV9NT0RFID0gMHg1MDEzOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERFVklDRV9QUk9QRVJUWV9DT05UUkFTVCA9IDB4NTAxNDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBERVZJQ0VfUFJPUEVSVFlfU0hBUlBORVNTID0gMHg1MDE1OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERFVklDRV9QUk9QRVJUWV9ESUdJVEFMX1pPT00gPSAweDUwMTY7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgREVWSUNFX1BST1BFUlRZX0VGRkVDVF9NT0RFID0gMHg1MDE3OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERFVklDRV9QUk9QRVJUWV9CVVJTVF9OVU1CRVI9IDB4NTAxODsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBERVZJQ0VfUFJPUEVSVFlfQlVSU1RfSU5URVJWQUwgPSAweDUwMTk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgREVWSUNFX1BST1BFUlRZX1RJTUVMQVBTRV9OVU1CRVIgPSAweDUwMUE7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgREVWSUNFX1BST1BFUlRZX1RJTUVMQVBTRV9JTlRFUlZBTCA9IDB4NTAxQjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBERVZJQ0VfUFJPUEVSVFlfRk9DVVNfTUVURVJJTkdfTU9ERSA9IDB4NTAxQzsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBERVZJQ0VfUFJPUEVSVFlfVVBMT0FEX1VSTCA9IDB4NTAxRDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBERVZJQ0VfUFJPUEVSVFlfQVJUSVNUID0gMHg1MDFFOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERFVklDRV9QUk9QRVJUWV9DT1BZUklHSFRfSU5GTyA9IDB4NTAxRjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBERVZJQ0VfUFJPUEVSVFlfU1lOQ0hST05JWkFUSU9OX1BBUlRORVIgPSAweEQ0MDE7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgREVWSUNFX1BST1BFUlRZX0RFVklDRV9GUklFTkRMWV9OQU1FID0gMHhENDAyOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERFVklDRV9QUk9QRVJUWV9WT0xVTUUgPSAweEQ0MDM7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgREVWSUNFX1BST1BFUlRZX1NVUFBPUlRFRF9GT1JNQVRTX09SREVSRUQgPSAweEQ0MDQ7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgREVWSUNFX1BST1BFUlRZX0RFVklDRV9JQ09OID0gMHhENDA1OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERFVklDRV9QUk9QRVJUWV9QTEFZQkFDS19SQVRFID0gMHhENDEwOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERFVklDRV9QUk9QRVJUWV9QTEFZQkFDS19PQkpFQ1QgPSAweEQ0MTE7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgREVWSUNFX1BST1BFUlRZX1BMQVlCQUNLX0NPTlRBSU5FUl9JTkRFWCA9IDB4RDQxMjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBERVZJQ0VfUFJPUEVSVFlfU0VTU0lPTl9JTklUSUFUT1JfVkVSU0lPTl9JTkZPID0gMHhENDA2OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERFVklDRV9QUk9QRVJUWV9QRVJDRUlWRURfREVWSUNFX1RZUEUgPSAweEQ0MDc7CisKKworICAgIC8qKgorICAgICAqIE9iamVjdCBpcyBub3QgcHJvdGVjdGVkLiBJdCBtYXkgYmUgbW9kaWZpZWQgYW5kIGRlbGV0ZWQsIGFuZCBpdHMgcHJvcGVydGllcworICAgICAqIG1heSBiZSBtb2RpZmllZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9URUNUSU9OX1NUQVRVU19OT05FID0gMDsKKworICAgIC8qKgorICAgICAqIE9iamVjdCBjYW4gbm90IGJlIG1vZGlmaWVkIG9yIGRlbGV0ZWQgYW5kIGl0cyBwcm9wZXJ0aWVzIGNhbiBub3QgYmUgbW9kaWZpZWQuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPVEVDVElPTl9TVEFUVVNfUkVBRF9PTkxZID0gMHg4MDAxOworCisgICAgLyoqCisgICAgICogT2JqZWN0IGNhbiBub3QgYmUgbW9kaWZpZWQgb3IgZGVsZXRlZCBidXQgaXRzIHByb3BlcnRpZXMgYXJlIG1vZGlmaWFibGUuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPVEVDVElPTl9TVEFUVVNfUkVBRF9PTkxZX0RBVEEgPSAweDgwMDI7CisKKyAgICAvKioKKyAgICAgKiBPYmplY3QncyBjb250ZW50cyBjYW4gbm90IGJlIHRyYW5zZmVyZWQgZnJvbSB0aGUgZGV2aWNlLCBidXQgdGhlIG9iamVjdAorICAgICAqIG1heSBiZSBtb3ZlZCBvciBkZWxldGVkIGFuZCBpdHMgcHJvcGVydGllcyBtYXkgYmUgbW9kaWZpZWQuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPVEVDVElPTl9TVEFUVVNfTk9OX1RSQU5TRkVSQUJMRV9EQVRBID0gMHg4MDAzOworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQVNTT0NJQVRJT05fVFlQRV9HRU5FUklDX0ZPTERFUiA9IDB4MDAwMTsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2phdmEvYW5kcm9pZC9tZWRpYS9NdHBDdXJzb3IuamF2YSBiL21lZGlhL2phdmEvYW5kcm9pZC9tZWRpYS9NdHBDdXJzb3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNDE0MmQ4Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvamF2YS9hbmRyb2lkL21lZGlhL010cEN1cnNvci5qYXZhCkBAIC0wLDAgKzEsMjI3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLm1lZGlhOworCitpbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5BYnN0cmFjdFdpbmRvd2VkQ3Vyc29yOworaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2UuQ3Vyc29yV2luZG93OworaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuTXRwOworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CisKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKKworLyoqCisgICogQ3Vyc29yIGNsYXNzIGZvciBNVFAgY29udGVudCBwcm92aWRlcgorICAqIEBoaWRlCisgICovCitwdWJsaWMgZmluYWwgY2xhc3MgTXRwQ3Vyc29yIGV4dGVuZHMgQWJzdHJhY3RXaW5kb3dlZEN1cnNvciB7CisgICAgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiTXRwQ3Vyc29yIjsKKyAgICBzdGF0aWMgZmluYWwgaW50IE5PX0NPVU5UID0gLTE7CisKKyAgICAvKiBjb25zdGFudHMgZm9yIG1RdWVyeVR5cGUgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBERVZJQ0UgICAgICAgICAgICAgID0gMTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBERVZJQ0VfSUQgICAgICAgICAgID0gMjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVE9SQUdFICAgICAgICAgICAgID0gMzsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVE9SQUdFX0lEICAgICAgICAgID0gNDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBPQkpFQ1QgICAgICAgICAgICAgID0gNTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBPQkpFQ1RfSUQgICAgICAgICAgID0gNjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVE9SQUdFX0NISUxEUkVOICAgID0gNzsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBPQkpFQ1RfQ0hJTERSRU4gICAgID0gODsKKworICAgIHByaXZhdGUgaW50IG1RdWVyeVR5cGU7CisgICAgcHJpdmF0ZSBpbnQgbURldmljZUlEOworICAgIHByaXZhdGUgaW50IG1TdG9yYWdlSUQ7CisgICAgcHJpdmF0ZSBpbnQgbVFiamVjdElEOworCisgICAgLyoqIFRoZSBuYW1lcyBvZiB0aGUgY29sdW1ucyBpbiB0aGUgcHJvamVjdGlvbiAqLworICAgIHByaXZhdGUgU3RyaW5nW10gbUNvbHVtbnM7CisKKyAgICAvKiogVGhlIG51bWJlciBvZiByb3dzIGluIHRoZSBjdXJzb3IgKi8KKyAgICBwcml2YXRlIGludCBtQ291bnQgPSBOT19DT1VOVDsKKworICAgIHByaXZhdGUgZmluYWwgTXRwQ2xpZW50IG1DbGllbnQ7CisKKyAgICBwdWJsaWMgTXRwQ3Vyc29yKE10cENsaWVudCBjbGllbnQsIGludCBxdWVyeVR5cGUsIGludCBkZXZpY2VJRCwgaW50IHN0b3JhZ2VJRCwgaW50IG9iamVjdElELAorICAgICAgICAgICAgU3RyaW5nW10gcHJvamVjdGlvbikgeworCisgICAgICAgIG1DbGllbnQgPSBjbGllbnQ7CisgICAgICAgIG1RdWVyeVR5cGUgPSBxdWVyeVR5cGU7CisgICAgICAgIG1EZXZpY2VJRCA9IGRldmljZUlEOworICAgICAgICBtU3RvcmFnZUlEID0gc3RvcmFnZUlEOworICAgICAgICBtUWJqZWN0SUQgPSBvYmplY3RJRDsKKyAgICAgICAgbUNvbHVtbnMgPSBwcm9qZWN0aW9uOworCisgICAgICAgIEhhc2hNYXA8U3RyaW5nLCBJbnRlZ2VyPiBtYXA7CisgICAgICAgIHN3aXRjaCAocXVlcnlUeXBlKSB7CisgICAgICAgICAgICBjYXNlIERFVklDRToKKyAgICAgICAgICAgIGNhc2UgREVWSUNFX0lEOgorICAgICAgICAgICAgICAgIG1hcCA9IHNEZXZpY2VQcm9qZWN0aW9uTWFwOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBTVE9SQUdFOgorICAgICAgICAgICAgY2FzZSBTVE9SQUdFX0lEOgorICAgICAgICAgICAgICAgIG1hcCA9IHNTdG9yYWdlUHJvamVjdGlvbk1hcDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgT0JKRUNUOgorICAgICAgICAgICAgY2FzZSBPQkpFQ1RfSUQ6CisgICAgICAgICAgICBjYXNlIFNUT1JBR0VfQ0hJTERSRU46CisgICAgICAgICAgICBjYXNlIE9CSkVDVF9DSElMRFJFTjoKKyAgICAgICAgICAgICAgICBtYXAgPSBzT2JqZWN0UHJvamVjdGlvbk1hcDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigidW5rbm93biBxdWVyeSB0eXBlICIgICsgcXVlcnlUeXBlKTsKKyAgICAgICAgfQorCisgICAgICAgIGludFtdIGNvbHVtbnMgPSBuZXcgaW50W3Byb2plY3Rpb24ubGVuZ3RoXTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwcm9qZWN0aW9uLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBJbnRlZ2VyIGlkID0gbWFwLmdldChwcm9qZWN0aW9uW2ldKTsKKyAgICAgICAgICAgIGlmIChpZCA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigidW5rbm93biBjb2x1bW4gIiAgKyBwcm9qZWN0aW9uW2ldKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNvbHVtbnNbaV0gPSBpZC5pbnRWYWx1ZSgpOworICAgICAgICB9CisgICAgICAgIG5hdGl2ZV9zZXR1cChjbGllbnQsIHF1ZXJ5VHlwZSwgZGV2aWNlSUQsIHN0b3JhZ2VJRCwgb2JqZWN0SUQsIGNvbHVtbnMpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIGZpbmFsaXplKCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgbmF0aXZlX2ZpbmFsaXplKCk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBzdXBlci5maW5hbGl6ZSgpOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGludCBnZXRDb3VudCgpIHsKKyAgICAgICAgaWYgKG1Db3VudCA9PSBOT19DT1VOVCkgeworICAgICAgICAgICAgZmlsbFdpbmRvdygwKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbUNvdW50OworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIHJlcXVlcnkoKSB7CisgICAgICAgIExvZy5kKFRBRywgInJlcXVlcnkiKTsKKyAgICAgICAgbUNvdW50ID0gTk9fQ09VTlQ7CisgICAgICAgIGlmIChtV2luZG93ICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1XaW5kb3cuY2xlYXIoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc3VwZXIucmVxdWVyeSgpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBmaWxsV2luZG93KGludCBzdGFydFBvcykgeworICAgICAgICBpZiAobVdpbmRvdyA9PSBudWxsKSB7CisgICAgICAgICAgICAvLyBJZiB0aGVyZSBpc24ndCBhIHdpbmRvdyBzZXQgYWxyZWFkeSBpdCB3aWxsIG9ubHkgYmUgYWNjZXNzZWQgbG9jYWxseQorICAgICAgICAgICAgbVdpbmRvdyA9IG5ldyBDdXJzb3JXaW5kb3codHJ1ZSAvKiB0aGUgd2luZG93IGlzIGxvY2FsIG9ubHkgKi8pOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG1XaW5kb3cuY2xlYXIoKTsKKyAgICAgICAgfQorICAgICAgICBtV2luZG93LnNldFN0YXJ0UG9zaXRpb24oc3RhcnRQb3MpOworICAgICAgICBtQ291bnQgPSBuYXRpdmVfZmlsbF93aW5kb3cobVdpbmRvdywgc3RhcnRQb3MpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRDb2x1bW5OYW1lcygpIHsKKyAgICAgICAgTG9nLmQoVEFHLCAiZ2V0Q29sdW1uTmFtZXMgcmV0dXJuaW5nICIgKyBtQ29sdW1ucyk7CisgICAgICAgIHJldHVybiBtQ29sdW1uczsKKyAgICB9CisKKyAgICAvKiBEZXZpY2UgQ29sdW1uIElEcyAqLworICAgICAvKiBUaGVzZSBtdXN0IG1hdGNoIHRoZSB2YWx1ZXMgaW4gTXRwQ3Vyc29yLmNwcCAqLworICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IERFVklDRV9ST1dfSUQgICAgICAgICAgPSAxOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBERVZJQ0VfTUFOVUZBQ1RVUkVSICAgID0gMjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgREVWSUNFX01PREVMICAgICAgICAgICA9IDM7CisKKyAgICAvKiBTdG9yYWdlIENvbHVtbiBJRHMgKi8KKyAgICAvKiBUaGVzZSBtdXN0IG1hdGNoIHRoZSB2YWx1ZXMgaW4gTXRwQ3Vyc29yLmNwcCAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTVE9SQUdFX1JPV19JRCAgICAgICAgID0gMTAxOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTVE9SQUdFX0lERU5USUZJRVIgICAgID0gMTAyOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTVE9SQUdFX0RFU0NSSVBUSU9OICAgID0gMTAzOworCisgICAgLyogT2JqZWN0IENvbHVtbiBJRHMgKi8KKyAgICAvKiBUaGVzZSBtdXN0IG1hdGNoIHRoZSB2YWx1ZXMgaW4gTXRwQ3Vyc29yLmNwcCAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBPQkpFQ1RfUk9XX0lEICAgICAgICAgICAgICA9IDIwMTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgT0JKRUNUX1NUT1JBR0VfSUQgICAgICAgICAgPSAyMDI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE9CSkVDVF9GT1JNQVQgICAgICAgICAgICAgID0gMjAzOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBPQkpFQ1RfUFJPVEVDVElPTl9TVEFUVVMgICA9IDIwNDsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgT0JKRUNUX1NJWkUgICAgICAgICAgICAgICAgPSAyMDU7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE9CSkVDVF9USFVNQl9GT1JNQVQgICAgICAgID0gMjA2OworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBPQkpFQ1RfVEhVTUJfU0laRSAgICAgICAgICA9IDIwNzsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgT0JKRUNUX1RIVU1CX1dJRFRIICAgICAgICAgPSAyMDg7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE9CSkVDVF9USFVNQl9IRUlHSFQgICAgICAgID0gMjA5OworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBPQkpFQ1RfSU1BR0VfV0lEVEggICAgICAgICA9IDIxMDsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgT0JKRUNUX0lNQUdFX0hFSUdIVCAgICAgICAgPSAyMTE7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE9CSkVDVF9JTUFHRV9ERVBUSCAgICAgICAgID0gMjEyOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBPQkpFQ1RfUEFSRU5UICAgICAgICAgICAgICA9IDIxMzsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgT0JKRUNUX0FTU09DSUFUSU9OX1RZUEUgICAgPSAyMTQ7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE9CSkVDVF9BU1NPQ0lBVElPTl9ERVNDICAgID0gMjE1OworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBPQkpFQ1RfU0VRVUVOQ0VfTlVNQkVSICAgICA9IDIxNjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgT0JKRUNUX05BTUUgICAgICAgICAgICAgICAgPSAyMTc7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE9CSkVDVF9EQVRFX0NSRUFURUQgICAgICAgID0gMjE4OworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBPQkpFQ1RfREFURV9NT0RJRklFRCAgICAgICA9IDIxOTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgT0JKRUNUX0tFWVdPUkRTICAgICAgICAgICAgPSAyMjA7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE9CSkVDVF9USFVNQiAgICAgICAgICAgICAgID0gMjIxOworCisgICAgcHJpdmF0ZSBzdGF0aWMgSGFzaE1hcDxTdHJpbmcsIEludGVnZXI+IHNEZXZpY2VQcm9qZWN0aW9uTWFwOworICAgIHByaXZhdGUgc3RhdGljIEhhc2hNYXA8U3RyaW5nLCBJbnRlZ2VyPiBzU3RvcmFnZVByb2plY3Rpb25NYXA7CisgICAgcHJpdmF0ZSBzdGF0aWMgSGFzaE1hcDxTdHJpbmcsIEludGVnZXI+IHNPYmplY3RQcm9qZWN0aW9uTWFwOworCisgICAgc3RhdGljIHsKKyAgICAgICAgc0RldmljZVByb2plY3Rpb25NYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIEludGVnZXI+KCk7CisgICAgICAgIHNEZXZpY2VQcm9qZWN0aW9uTWFwLnB1dChNdHAuRGV2aWNlLl9JRCwgbmV3IEludGVnZXIoREVWSUNFX1JPV19JRCkpOworICAgICAgICBzRGV2aWNlUHJvamVjdGlvbk1hcC5wdXQoTXRwLkRldmljZS5NQU5VRkFDVFVSRVIsIG5ldyBJbnRlZ2VyKERFVklDRV9NQU5VRkFDVFVSRVIpKTsKKyAgICAgICAgc0RldmljZVByb2plY3Rpb25NYXAucHV0KE10cC5EZXZpY2UuTU9ERUwsIG5ldyBJbnRlZ2VyKERFVklDRV9NT0RFTCkpOworCisgICAgICAgIHNTdG9yYWdlUHJvamVjdGlvbk1hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgSW50ZWdlcj4oKTsKKyAgICAgICAgc1N0b3JhZ2VQcm9qZWN0aW9uTWFwLnB1dChNdHAuU3RvcmFnZS5fSUQsIG5ldyBJbnRlZ2VyKFNUT1JBR0VfUk9XX0lEKSk7CisgICAgICAgIHNTdG9yYWdlUHJvamVjdGlvbk1hcC5wdXQoTXRwLlN0b3JhZ2UuSURFTlRJRklFUiwgbmV3IEludGVnZXIoU1RPUkFHRV9JREVOVElGSUVSKSk7CisgICAgICAgIHNTdG9yYWdlUHJvamVjdGlvbk1hcC5wdXQoTXRwLlN0b3JhZ2UuREVTQ1JJUFRJT04sIG5ldyBJbnRlZ2VyKFNUT1JBR0VfREVTQ1JJUFRJT04pKTsKKworICAgICAgICBzT2JqZWN0UHJvamVjdGlvbk1hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgSW50ZWdlcj4oKTsKKyAgICAgICAgc09iamVjdFByb2plY3Rpb25NYXAucHV0KE10cC5PYmplY3QuX0lELCBuZXcgSW50ZWdlcihPQkpFQ1RfUk9XX0lEKSk7CisgICAgICAgIHNPYmplY3RQcm9qZWN0aW9uTWFwLnB1dChNdHAuT2JqZWN0LlNUT1JBR0VfSUQsIG5ldyBJbnRlZ2VyKE9CSkVDVF9TVE9SQUdFX0lEKSk7CisgICAgICAgIHNPYmplY3RQcm9qZWN0aW9uTWFwLnB1dChNdHAuT2JqZWN0LkZPUk1BVCwgbmV3IEludGVnZXIoT0JKRUNUX0ZPUk1BVCkpOworICAgICAgICBzT2JqZWN0UHJvamVjdGlvbk1hcC5wdXQoTXRwLk9iamVjdC5QUk9URUNUSU9OX1NUQVRVUywgbmV3IEludGVnZXIoT0JKRUNUX1BST1RFQ1RJT05fU1RBVFVTKSk7CisgICAgICAgIHNPYmplY3RQcm9qZWN0aW9uTWFwLnB1dChNdHAuT2JqZWN0LlNJWkUsIG5ldyBJbnRlZ2VyKE9CSkVDVF9TSVpFKSk7CisgICAgICAgIHNPYmplY3RQcm9qZWN0aW9uTWFwLnB1dChNdHAuT2JqZWN0LlRIVU1CX0ZPUk1BVCwgbmV3IEludGVnZXIoT0JKRUNUX1RIVU1CX0ZPUk1BVCkpOworICAgICAgICBzT2JqZWN0UHJvamVjdGlvbk1hcC5wdXQoTXRwLk9iamVjdC5USFVNQl9TSVpFLCBuZXcgSW50ZWdlcihPQkpFQ1RfVEhVTUJfU0laRSkpOworICAgICAgICBzT2JqZWN0UHJvamVjdGlvbk1hcC5wdXQoTXRwLk9iamVjdC5USFVNQl9XSURUSCwgbmV3IEludGVnZXIoT0JKRUNUX1RIVU1CX1dJRFRIKSk7CisgICAgICAgIHNPYmplY3RQcm9qZWN0aW9uTWFwLnB1dChNdHAuT2JqZWN0LlRIVU1CX0hFSUdIVCwgbmV3IEludGVnZXIoT0JKRUNUX1RIVU1CX0hFSUdIVCkpOworICAgICAgICBzT2JqZWN0UHJvamVjdGlvbk1hcC5wdXQoTXRwLk9iamVjdC5JTUFHRV9XSURUSCwgbmV3IEludGVnZXIoT0JKRUNUX0lNQUdFX1dJRFRIKSk7CisgICAgICAgIHNPYmplY3RQcm9qZWN0aW9uTWFwLnB1dChNdHAuT2JqZWN0LklNQUdFX0hFSUdIVCwgbmV3IEludGVnZXIoT0JKRUNUX0lNQUdFX0hFSUdIVCkpOworICAgICAgICBzT2JqZWN0UHJvamVjdGlvbk1hcC5wdXQoTXRwLk9iamVjdC5JTUFHRV9ERVBUSCwgbmV3IEludGVnZXIoT0JKRUNUX0lNQUdFX0RFUFRIKSk7CisgICAgICAgIHNPYmplY3RQcm9qZWN0aW9uTWFwLnB1dChNdHAuT2JqZWN0LlBBUkVOVCwgbmV3IEludGVnZXIoT0JKRUNUX1BBUkVOVCkpOworICAgICAgICBzT2JqZWN0UHJvamVjdGlvbk1hcC5wdXQoTXRwLk9iamVjdC5BU1NPQ0lBVElPTl9UWVBFLCBuZXcgSW50ZWdlcihPQkpFQ1RfQVNTT0NJQVRJT05fVFlQRSkpOworICAgICAgICBzT2JqZWN0UHJvamVjdGlvbk1hcC5wdXQoTXRwLk9iamVjdC5BU1NPQ0lBVElPTl9ERVNDLCBuZXcgSW50ZWdlcihPQkpFQ1RfQVNTT0NJQVRJT05fREVTQykpOworICAgICAgICBzT2JqZWN0UHJvamVjdGlvbk1hcC5wdXQoTXRwLk9iamVjdC5TRVFVRU5DRV9OVU1CRVIsIG5ldyBJbnRlZ2VyKE9CSkVDVF9TRVFVRU5DRV9OVU1CRVIpKTsKKyAgICAgICAgc09iamVjdFByb2plY3Rpb25NYXAucHV0KE10cC5PYmplY3QuTkFNRSwgbmV3IEludGVnZXIoT0JKRUNUX05BTUUpKTsKKyAgICAgICAgc09iamVjdFByb2plY3Rpb25NYXAucHV0KE10cC5PYmplY3QuREFURV9DUkVBVEVELCBuZXcgSW50ZWdlcihPQkpFQ1RfREFURV9DUkVBVEVEKSk7CisgICAgICAgIHNPYmplY3RQcm9qZWN0aW9uTWFwLnB1dChNdHAuT2JqZWN0LkRBVEVfTU9ESUZJRUQsIG5ldyBJbnRlZ2VyKE9CSkVDVF9EQVRFX01PRElGSUVEKSk7CisgICAgICAgIHNPYmplY3RQcm9qZWN0aW9uTWFwLnB1dChNdHAuT2JqZWN0LktFWVdPUkRTLCBuZXcgSW50ZWdlcihPQkpFQ1RfS0VZV09SRFMpKTsKKyAgICAgICAgc09iamVjdFByb2plY3Rpb25NYXAucHV0KE10cC5PYmplY3QuVEhVTUIsIG5ldyBJbnRlZ2VyKE9CSkVDVF9USFVNQikpOworCisgICAgICAgIHNPYmplY3RQcm9qZWN0aW9uTWFwLnB1dChNdHAuT2JqZWN0Lk5BTUUsIG5ldyBJbnRlZ2VyKE9CSkVDVF9OQU1FKSk7CisgICAgfQorCisgICAgLy8gdXNlZCBieSB0aGUgSk5JIGNvZGUKKyAgICBwcml2YXRlIGludCBtTmF0aXZlQ29udGV4dDsKKworICAgIHByaXZhdGUgbmF0aXZlIGZpbmFsIHZvaWQgbmF0aXZlX3NldHVwKE10cENsaWVudCBjbGllbnQsIGludCBxdWVyeVR5cGUsCisgICAgICAgICAgICBpbnQgZGV2aWNlSUQsIGludCBzdG9yYWdlSUQsIGludCBvYmplY3RJRCwgaW50W10gY29sdW1ucyk7CisgICAgcHJpdmF0ZSBuYXRpdmUgZmluYWwgdm9pZCBuYXRpdmVfZmluYWxpemUoKTsKKyAgICBwcml2YXRlIG5hdGl2ZSB2b2lkIG5hdGl2ZV93YWl0X2Zvcl9ldmVudCgpOworICAgIHByaXZhdGUgbmF0aXZlIGludCBuYXRpdmVfZmlsbF93aW5kb3coQ3Vyc29yV2luZG93IHdpbmRvdywgaW50IHN0YXJ0UG9zKTsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2phdmEvYW5kcm9pZC9tZWRpYS9NdHBEYXRhYmFzZS5qYXZhIGIvbWVkaWEvamF2YS9hbmRyb2lkL21lZGlhL010cERhdGFiYXNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjY0Mjk5YQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2phdmEvYW5kcm9pZC9tZWRpYS9NdHBEYXRhYmFzZS5qYXZhCkBAIC0wLDAgKzEsNTc4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLm1lZGlhOworCitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRWYWx1ZXM7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LklDb250ZW50UHJvdmlkZXI7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKK2ltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLkN1cnNvcjsKK2ltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZS5TUUxpdGVEYXRhYmFzZTsKK2ltcG9ydCBhbmRyb2lkLm5ldC5Vcmk7CitpbXBvcnQgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb247CitpbXBvcnQgYW5kcm9pZC5wcm92aWRlci5NZWRpYVN0b3JlLkF1ZGlvOworaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuTWVkaWFTdG9yZS5NZWRpYUNvbHVtbnM7CitpbXBvcnQgYW5kcm9pZC5wcm92aWRlci5NZWRpYVN0b3JlLkZpbGVzOworaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuTXRwOworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CisKKy8qKgorICoge0BoaWRlfQorICovCitwdWJsaWMgY2xhc3MgTXRwRGF0YWJhc2UgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJNdHBEYXRhYmFzZSI7CisKKyAgICBwcml2YXRlIGZpbmFsIENvbnRleHQgbUNvbnRleHQ7CisgICAgcHJpdmF0ZSBmaW5hbCBJQ29udGVudFByb3ZpZGVyIG1NZWRpYVByb3ZpZGVyOworICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIG1Wb2x1bWVOYW1lOworICAgIHByaXZhdGUgZmluYWwgVXJpIG1PYmplY3RzVXJpOworCisgICAgLy8gdHJ1ZSBpZiB0aGUgZGF0YWJhc2UgaGFzIGJlZW4gbW9kaWZpZWQgaW4gdGhlIGN1cnJlbnQgTVRQIHNlc3Npb24KKyAgICBwcml2YXRlIGJvb2xlYW4gbURhdGFiYXNlTW9kaWZpZWQ7CisKKyAgICAvLyBkYXRhYmFzZSBmb3Igd3JpdGFibGUgTVRQIGRldmljZSBwcm9wZXJ0aWVzCisgICAgcHJpdmF0ZSBTUUxpdGVEYXRhYmFzZSBtRGV2aWNlUHJvcERiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBERVZJQ0VfUFJPUEVSVElFU19EQVRBQkFTRV9WRVJTSU9OID0gMTsKKworICAgIC8vIEZJWE1FIC0gdGhpcyBzaG91bGQgYmUgcGFzc2VkIGluIHZpYSB0aGUgY29uc3RydWN0b3IKKyAgICBwcml2YXRlIGZpbmFsIGludCBtU3RvcmFnZUlEID0gMHgwMDAxMDAwMTsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIElEX1BST0pFQ1RJT04gPSBuZXcgU3RyaW5nW10geworICAgICAgICAgICAgRmlsZXMuRmlsZUNvbHVtbnMuX0lELCAvLyAwCisgICAgfTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBQQVRIX1NJWkVfUFJPSkVDVElPTiA9IG5ldyBTdHJpbmdbXSB7CisgICAgICAgICAgICBGaWxlcy5GaWxlQ29sdW1ucy5fSUQsIC8vIDAKKyAgICAgICAgICAgIEZpbGVzLkZpbGVDb2x1bW5zLkRBVEEsIC8vIDEKKyAgICAgICAgICAgIEZpbGVzLkZpbGVDb2x1bW5zLlNJWkUsIC8vIDIKKyAgICB9OworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIE9CSkVDVF9JTkZPX1BST0pFQ1RJT04gPSBuZXcgU3RyaW5nW10geworICAgICAgICAgICAgRmlsZXMuRmlsZUNvbHVtbnMuX0lELCAvLyAwCisgICAgICAgICAgICBGaWxlcy5GaWxlQ29sdW1ucy5EQVRBLCAvLyAxCisgICAgICAgICAgICBGaWxlcy5GaWxlQ29sdW1ucy5GT1JNQVQsIC8vIDIKKyAgICAgICAgICAgIEZpbGVzLkZpbGVDb2x1bW5zLlBBUkVOVCwgLy8gMworICAgICAgICAgICAgRmlsZXMuRmlsZUNvbHVtbnMuU0laRSwgLy8gNAorICAgICAgICAgICAgRmlsZXMuRmlsZUNvbHVtbnMuREFURV9NT0RJRklFRCwgLy8gNQorICAgIH07CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIElEX1dIRVJFID0gRmlsZXMuRmlsZUNvbHVtbnMuX0lEICsgIj0/IjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFUSF9XSEVSRSA9IEZpbGVzLkZpbGVDb2x1bW5zLkRBVEEgKyAiPT8iOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJFTlRfV0hFUkUgPSBGaWxlcy5GaWxlQ29sdW1ucy5QQVJFTlQgKyAiPT8iOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJFTlRfRk9STUFUX1dIRVJFID0gUEFSRU5UX1dIRVJFICsgIiBBTkQgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIEZpbGVzLkZpbGVDb2x1bW5zLkZPUk1BVCArICI9PyI7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBERVZJQ0VfUFJPUEVSVFlfUFJPSkVDVElPTiA9IG5ldyBTdHJpbmdbXSB7ICJfaWQiLCAidmFsdWUiIH07CisgICAgcHJpdmF0ZSAgc3RhdGljIGZpbmFsIFN0cmluZyBERVZJQ0VfUFJPUEVSVFlfV0hFUkUgPSAiY29kZT0/IjsKKworICAgIHByaXZhdGUgZmluYWwgTWVkaWFTY2FubmVyIG1NZWRpYVNjYW5uZXI7CisKKyAgICBzdGF0aWMgeworICAgICAgICBTeXN0ZW0ubG9hZExpYnJhcnkoIm1lZGlhX2puaSIpOworICAgIH0KKworICAgIHB1YmxpYyBNdHBEYXRhYmFzZShDb250ZXh0IGNvbnRleHQsIFN0cmluZyB2b2x1bWVOYW1lKSB7CisgICAgICAgIG5hdGl2ZV9zZXR1cCgpOworCisgICAgICAgIG1Db250ZXh0ID0gY29udGV4dDsKKyAgICAgICAgbU1lZGlhUHJvdmlkZXIgPSBjb250ZXh0LmdldENvbnRlbnRSZXNvbHZlcigpLmFjcXVpcmVQcm92aWRlcigibWVkaWEiKTsKKyAgICAgICAgbVZvbHVtZU5hbWUgPSB2b2x1bWVOYW1lOworICAgICAgICBtT2JqZWN0c1VyaSA9IEZpbGVzLmdldE10cE9iamVjdHNVcmkodm9sdW1lTmFtZSk7CisgICAgICAgIG1NZWRpYVNjYW5uZXIgPSBuZXcgTWVkaWFTY2FubmVyKGNvbnRleHQpOworICAgICAgICBvcGVuRGV2aWNlUHJvcGVydGllc0RhdGFiYXNlKGNvbnRleHQpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIGZpbmFsaXplKCkgdGhyb3dzIFRocm93YWJsZSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBuYXRpdmVfZmluYWxpemUoKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIHN1cGVyLmZpbmFsaXplKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgb3BlbkRldmljZVByb3BlcnRpZXNEYXRhYmFzZShDb250ZXh0IGNvbnRleHQpIHsKKyAgICAgICAgbURldmljZVByb3BEYiA9IGNvbnRleHQub3Blbk9yQ3JlYXRlRGF0YWJhc2UoImRldmljZS1wcm9wZXJ0aWVzIiwgQ29udGV4dC5NT0RFX1BSSVZBVEUsIG51bGwpOworICAgICAgICBpbnQgdmVyc2lvbiA9IG1EZXZpY2VQcm9wRGIuZ2V0VmVyc2lvbigpOworCisgICAgICAgIC8vIGluaXRpYWxpemUgaWYgbmVjZXNzYXJ5CisgICAgICAgIGlmICh2ZXJzaW9uICE9IERFVklDRV9QUk9QRVJUSUVTX0RBVEFCQVNFX1ZFUlNJT04pIHsKKyAgICAgICAgICAgIG1EZXZpY2VQcm9wRGIuZXhlY1NRTCgiQ1JFQVRFIFRBQkxFIHByb3BlcnRpZXMgKCIgKworICAgICAgICAgICAgICAgICAgICAiX2lkIElOVEVHRVIgUFJJTUFSWSBLRVkgQVVUT0lOQ1JFTUVOVCwiICsKKyAgICAgICAgICAgICAgICAgICAgImNvZGUgSU5URUdFUiBVTklRVUUgT04gQ09ORkxJQ1QgUkVQTEFDRSwiICsKKyAgICAgICAgICAgICAgICAgICAgInZhbHVlIFRFWFQiICsKKyAgICAgICAgICAgICAgICAgICAgIik7Iik7CisgICAgICAgICAgICBtRGV2aWNlUHJvcERiLmV4ZWNTUUwoIkNSRUFURSBJTkRFWCBwcm9wZXJ0eV9pbmRleCBPTiBwcm9wZXJ0aWVzIChjb2RlKTsiKTsKKyAgICAgICAgICAgIG1EZXZpY2VQcm9wRGIuc2V0VmVyc2lvbihERVZJQ0VfUFJPUEVSVElFU19EQVRBQkFTRV9WRVJTSU9OKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgaW50IGJlZ2luU2VuZE9iamVjdChTdHJpbmcgcGF0aCwgaW50IGZvcm1hdCwgaW50IHBhcmVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RvcmFnZSwgbG9uZyBzaXplLCBsb25nIG1vZGlmaWVkKSB7CisgICAgICAgIG1EYXRhYmFzZU1vZGlmaWVkID0gdHJ1ZTsKKyAgICAgICAgQ29udGVudFZhbHVlcyB2YWx1ZXMgPSBuZXcgQ29udGVudFZhbHVlcygpOworICAgICAgICB2YWx1ZXMucHV0KEZpbGVzLkZpbGVDb2x1bW5zLkRBVEEsIHBhdGgpOworICAgICAgICB2YWx1ZXMucHV0KEZpbGVzLkZpbGVDb2x1bW5zLkZPUk1BVCwgZm9ybWF0KTsKKyAgICAgICAgdmFsdWVzLnB1dChGaWxlcy5GaWxlQ29sdW1ucy5QQVJFTlQsIHBhcmVudCk7CisgICAgICAgIC8vIHN0b3JhZ2UgaXMgaWdub3JlZCBmb3Igbm93CisgICAgICAgIHZhbHVlcy5wdXQoRmlsZXMuRmlsZUNvbHVtbnMuU0laRSwgc2l6ZSk7CisgICAgICAgIHZhbHVlcy5wdXQoRmlsZXMuRmlsZUNvbHVtbnMuREFURV9NT0RJRklFRCwgbW9kaWZpZWQpOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBVcmkgdXJpID0gbU1lZGlhUHJvdmlkZXIuaW5zZXJ0KG1PYmplY3RzVXJpLCB2YWx1ZXMpOworICAgICAgICAgICAgaWYgKHVyaSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEludGVnZXIucGFyc2VJbnQodXJpLmdldFBhdGhTZWdtZW50cygpLmdldCgyKSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIExvZy5lKFRBRywgIlJlbW90ZUV4Y2VwdGlvbiBpbiBiZWdpblNlbmRPYmplY3QiLCBlKTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBlbmRTZW5kT2JqZWN0KFN0cmluZyBwYXRoLCBpbnQgaGFuZGxlLCBpbnQgZm9ybWF0LCBib29sZWFuIHN1Y2NlZWRlZCkgeworICAgICAgICBpZiAoc3VjY2VlZGVkKSB7CisgICAgICAgICAgICAvLyBoYW5kbGUgYWJzdHJhY3QgcGxheWxpc3RzIHNlcGFyYXRlbHkKKyAgICAgICAgICAgIC8vIHRoZXkgZG8gbm90IGV4aXN0IGluIHRoZSBmaWxlIHN5c3RlbSBzbyBkb24ndCB1c2UgdGhlIG1lZGlhIHNjYW5uZXIgaGVyZQorICAgICAgICAgICAgaWYgKGZvcm1hdCA9PSBNdHBDb25zdGFudHMuRk9STUFUX0FCU1RSQUNUX0FWX1BMQVlMSVNUKSB7CisgICAgICAgICAgICAgICAgLy8gU3RyaXAgV2luZG93cyBNZWRpYSBQbGF5ZXIgZmlsZSBleHRlbnNpb24KKyAgICAgICAgICAgICAgICBpZiAocGF0aC5lbmRzV2l0aCgiLnBsYSIpKSB7CisgICAgICAgICAgICAgICAgICAgIHBhdGggPSBwYXRoLnN1YnN0cmluZygwLCBwYXRoLmxlbmd0aCgpIC0gNCk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLy8gZXh0cmFjdCBuYW1lIGZyb20gcGF0aAorICAgICAgICAgICAgICAgIFN0cmluZyBuYW1lID0gcGF0aDsKKyAgICAgICAgICAgICAgICBpbnQgbGFzdFNsYXNoID0gbmFtZS5sYXN0SW5kZXhPZignLycpOworICAgICAgICAgICAgICAgIGlmIChsYXN0U2xhc2ggPj0gMCkgeworICAgICAgICAgICAgICAgICAgICBuYW1lID0gbmFtZS5zdWJzdHJpbmcobGFzdFNsYXNoICsgMSk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgQ29udGVudFZhbHVlcyB2YWx1ZXMgPSBuZXcgQ29udGVudFZhbHVlcygxKTsKKyAgICAgICAgICAgICAgICB2YWx1ZXMucHV0KEF1ZGlvLlBsYXlsaXN0cy5EQVRBLCBwYXRoKTsKKyAgICAgICAgICAgICAgICB2YWx1ZXMucHV0KEF1ZGlvLlBsYXlsaXN0cy5OQU1FLCBuYW1lKTsKKyAgICAgICAgICAgICAgICB2YWx1ZXMucHV0KE1lZGlhQ29sdW1ucy5NRURJQV9TQ0FOTkVSX05FV19PQkpFQ1RfSUQsIGhhbmRsZSk7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgVXJpIHVyaSA9IG1NZWRpYVByb3ZpZGVyLmluc2VydChBdWRpby5QbGF5bGlzdHMuRVhURVJOQUxfQ09OVEVOVF9VUkksIHZhbHVlcyk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAiUmVtb3RlRXhjZXB0aW9uIGluIGVuZFNlbmRPYmplY3QiLCBlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG1NZWRpYVNjYW5uZXIuc2Nhbk10cEZpbGUocGF0aCwgbVZvbHVtZU5hbWUsIGhhbmRsZSwgZm9ybWF0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGRlbGV0ZUZpbGUoaGFuZGxlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgaW50W10gZ2V0T2JqZWN0TGlzdChpbnQgc3RvcmFnZUlELCBpbnQgZm9ybWF0LCBpbnQgcGFyZW50KSB7CisgICAgICAgIC8vIHdlIGNhbiBpZ25vcmUgc3RvcmFnZUlEIHVudGlsIHdlIHN1cHBvcnQgbXVsdGlwbGUgc3RvcmFnZXMKKyAgICAgICAgTG9nLmQoVEFHLCAiZ2V0T2JqZWN0TGlzdCBwYXJlbnQ6ICIgKyBwYXJlbnQpOworICAgICAgICBDdXJzb3IgYyA9IG51bGw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpZiAoZm9ybWF0ICE9IDApIHsKKyAgICAgICAgICAgICAgICBjID0gbU1lZGlhUHJvdmlkZXIucXVlcnkobU9iamVjdHNVcmksIElEX1BST0pFQ1RJT04sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEFSRU5UX0ZPUk1BVF9XSEVSRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgU3RyaW5nW10geyBJbnRlZ2VyLnRvU3RyaW5nKHBhcmVudCksIEludGVnZXIudG9TdHJpbmcoZm9ybWF0KSB9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgYyA9IG1NZWRpYVByb3ZpZGVyLnF1ZXJ5KG1PYmplY3RzVXJpLCBJRF9QUk9KRUNUSU9OLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBBUkVOVF9XSEVSRSwgbmV3IFN0cmluZ1tdIHsgSW50ZWdlci50b1N0cmluZyhwYXJlbnQpIH0sIG51bGwpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGMgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIm51bGwgY3Vyc29yIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpbnQgY291bnQgPSBjLmdldENvdW50KCk7CisgICAgICAgICAgICBpZiAoY291bnQgPiAwKSB7CisgICAgICAgICAgICAgICAgaW50W10gcmVzdWx0ID0gbmV3IGludFtjb3VudF07CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIGMubW92ZVRvTmV4dCgpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbaV0gPSBjLmdldEludCgwKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAicmV0dXJuaW5nICIgKyByZXN1bHQpOworICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBMb2cuZShUQUcsICJSZW1vdGVFeGNlcHRpb24gaW4gZ2V0T2JqZWN0TGlzdCIsIGUpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgaWYgKGMgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGMuY2xvc2UoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBwcml2YXRlIGludCBnZXROdW1PYmplY3RzKGludCBzdG9yYWdlSUQsIGludCBmb3JtYXQsIGludCBwYXJlbnQpIHsKKyAgICAgICAgLy8gd2UgY2FuIGlnbm9yZSBzdG9yYWdlSUQgdW50aWwgd2Ugc3VwcG9ydCBtdWx0aXBsZSBzdG9yYWdlcworICAgICAgICBMb2cuZChUQUcsICJnZXRPYmplY3RMaXN0IHBhcmVudDogIiArIHBhcmVudCk7CisgICAgICAgIEN1cnNvciBjID0gbnVsbDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGlmIChmb3JtYXQgIT0gMCkgeworICAgICAgICAgICAgICAgIGMgPSBtTWVkaWFQcm92aWRlci5xdWVyeShtT2JqZWN0c1VyaSwgSURfUFJPSkVDVElPTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBQQVJFTlRfRk9STUFUX1dIRVJFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBTdHJpbmdbXSB7IEludGVnZXIudG9TdHJpbmcocGFyZW50KSwgSW50ZWdlci50b1N0cmluZyhmb3JtYXQpIH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBjID0gbU1lZGlhUHJvdmlkZXIucXVlcnkobU9iamVjdHNVcmksIElEX1BST0pFQ1RJT04sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEFSRU5UX1dIRVJFLCBuZXcgU3RyaW5nW10geyBJbnRlZ2VyLnRvU3RyaW5nKHBhcmVudCkgfSwgbnVsbCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoYyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGMuZ2V0Q291bnQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIExvZy5lKFRBRywgIlJlbW90ZUV4Y2VwdGlvbiBpbiBnZXROdW1PYmplY3RzIiwgZSk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBpZiAoYyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgYy5jbG9zZSgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICBwcml2YXRlIGludFtdIGdldFN1cHBvcnRlZFBsYXliYWNrRm9ybWF0cygpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBpbnRbXSB7CisgICAgICAgICAgICAvLyBhbGxvdyB0cmFuc2ZlcmluZyBhcmJpdHJhcnkgZmlsZXMKKyAgICAgICAgICAgIE10cENvbnN0YW50cy5GT1JNQVRfVU5ERUZJTkVELAorICAgICAgICAgICAgTXRwQ29uc3RhbnRzLkZPUk1BVF9BU1NPQ0lBVElPTiwKKyAgICAgICAgICAgIE10cENvbnN0YW50cy5GT1JNQVRfQUJTVFJBQ1RfQVZfUExBWUxJU1QsCisgICAgICAgIH07CisgICAgfQorCisgICAgcHJpdmF0ZSBpbnRbXSBnZXRTdXBwb3J0ZWRDYXB0dXJlRm9ybWF0cygpIHsKKyAgICAgICAgLy8gbm8gY2FwdHVyZSBmb3JtYXRzIHlldAorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBwcml2YXRlIGludFtdIGdldFN1cHBvcnRlZE9iamVjdFByb3BlcnRpZXMoaW50IGhhbmRsZSkgeworICAgICAgICByZXR1cm4gbmV3IGludFtdIHsKKyAgICAgICAgICAgIE10cENvbnN0YW50cy5QUk9QRVJUWV9TVE9SQUdFX0lELAorICAgICAgICAgICAgTXRwQ29uc3RhbnRzLlBST1BFUlRZX09CSkVDVF9GT1JNQVQsCisgICAgICAgICAgICBNdHBDb25zdGFudHMuUFJPUEVSVFlfT0JKRUNUX1NJWkUsCisgICAgICAgICAgICBNdHBDb25zdGFudHMuUFJPUEVSVFlfT0JKRUNUX0ZJTEVfTkFNRSwKKyAgICAgICAgICAgIE10cENvbnN0YW50cy5QUk9QRVJUWV9QQVJFTlRfT0JKRUNULAorICAgICAgICB9OworICAgIH0KKworICAgIHByaXZhdGUgaW50W10gZ2V0U3VwcG9ydGVkRGV2aWNlUHJvcGVydGllcygpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBpbnRbXSB7CisgICAgICAgICAgICBNdHBDb25zdGFudHMuREVWSUNFX1BST1BFUlRZX1NZTkNIUk9OSVpBVElPTl9QQVJUTkVSLAorICAgICAgICAgICAgTXRwQ29uc3RhbnRzLkRFVklDRV9QUk9QRVJUWV9ERVZJQ0VfRlJJRU5ETFlfTkFNRSwKKyAgICAgICAgfTsKKyAgICB9CisKKyAgICBwcml2YXRlIGludCBnZXRPYmplY3RQcm9wZXJ0eShpbnQgaGFuZGxlLCBpbnQgcHJvcGVydHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9uZ1tdIG91dEludFZhbHVlLCBjaGFyW10gb3V0U3RyaW5nVmFsdWUpIHsKKyAgICAgICAgTG9nLmQoVEFHLCAiZ2V0T2JqZWN0UHJvcGVydHk6ICIgKyBwcm9wZXJ0eSk7CisgICAgICAgIFN0cmluZyBjb2x1bW4gPSBudWxsOworICAgICAgICBib29sZWFuIGlzU3RyaW5nID0gZmFsc2U7CisKKyAgICAgICAgc3dpdGNoIChwcm9wZXJ0eSkgeworICAgICAgICAgICAgY2FzZSBNdHBDb25zdGFudHMuUFJPUEVSVFlfU1RPUkFHRV9JRDoKKyAgICAgICAgICAgICAgICBvdXRJbnRWYWx1ZVswXSA9IG1TdG9yYWdlSUQ7CisgICAgICAgICAgICAgICAgcmV0dXJuIE10cENvbnN0YW50cy5SRVNQT05TRV9PSzsKKyAgICAgICAgICAgIGNhc2UgTXRwQ29uc3RhbnRzLlBST1BFUlRZX09CSkVDVF9GT1JNQVQ6CisgICAgICAgICAgICAgICAgY29sdW1uID0gRmlsZXMuRmlsZUNvbHVtbnMuRk9STUFUOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBNdHBDb25zdGFudHMuUFJPUEVSVFlfUFJPVEVDVElPTl9TVEFUVVM6CisgICAgICAgICAgICAgICAgLy8gcHJvdGVjdGlvbiBzdGF0dXMgaXMgYWx3YXlzIDAKKyAgICAgICAgICAgICAgICBvdXRJbnRWYWx1ZVswXSA9IDA7CisgICAgICAgICAgICAgICAgcmV0dXJuIE10cENvbnN0YW50cy5SRVNQT05TRV9PSzsKKyAgICAgICAgICAgIGNhc2UgTXRwQ29uc3RhbnRzLlBST1BFUlRZX09CSkVDVF9TSVpFOgorICAgICAgICAgICAgICAgIGNvbHVtbiA9IEZpbGVzLkZpbGVDb2x1bW5zLlNJWkU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE10cENvbnN0YW50cy5QUk9QRVJUWV9PQkpFQ1RfRklMRV9OQU1FOgorICAgICAgICAgICAgICAgIGNvbHVtbiA9IEZpbGVzLkZpbGVDb2x1bW5zLkRBVEE7CisgICAgICAgICAgICAgICAgaXNTdHJpbmcgPSB0cnVlOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBNdHBDb25zdGFudHMuUFJPUEVSVFlfREFURV9NT0RJRklFRDoKKyAgICAgICAgICAgICAgICBjb2x1bW4gPSBGaWxlcy5GaWxlQ29sdW1ucy5EQVRFX01PRElGSUVEOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBNdHBDb25zdGFudHMuUFJPUEVSVFlfUEFSRU5UX09CSkVDVDoKKyAgICAgICAgICAgICAgICBjb2x1bW4gPSBGaWxlcy5GaWxlQ29sdW1ucy5QQVJFTlQ7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE10cENvbnN0YW50cy5QUk9QRVJUWV9QRVJTSVNURU5UX1VJRDoKKyAgICAgICAgICAgICAgICAvLyBQVUlEIGlzIGNvbmNhdGVuYXRpb24gb2Ygc3RvcmFnZUlEIGFuZCBvYmplY3QgaGFuZGxlCisgICAgICAgICAgICAgICAgbG9uZyBwdWlkID0gbVN0b3JhZ2VJRDsKKyAgICAgICAgICAgICAgICBwdWlkIDw8PSAzMjsKKyAgICAgICAgICAgICAgICBwdWlkICs9IGhhbmRsZTsKKyAgICAgICAgICAgICAgICBvdXRJbnRWYWx1ZVswXSA9IHB1aWQ7CisgICAgICAgICAgICAgICAgcmV0dXJuIE10cENvbnN0YW50cy5SRVNQT05TRV9PSzsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgcmV0dXJuIE10cENvbnN0YW50cy5SRVNQT05TRV9PQkpFQ1RfUFJPUF9OT1RfU1VQUE9SVEVEOworICAgICAgICB9CisKKyAgICAgICAgQ3Vyc29yIGMgPSBudWxsOworICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gZm9yIG5vdyB3ZSBhcmUgb25seSByZWFkaW5nIHByb3BlcnRpZXMgZnJvbSB0aGUgIm9iamVjdHMiIHRhYmxlCisgICAgICAgICAgICBjID0gbU1lZGlhUHJvdmlkZXIucXVlcnkobU9iamVjdHNVcmksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFN0cmluZyBbXSB7IEZpbGVzLkZpbGVDb2x1bW5zLl9JRCwgY29sdW1uIH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgSURfV0hFUkUsIG5ldyBTdHJpbmdbXSB7IEludGVnZXIudG9TdHJpbmcoaGFuZGxlKSB9LCBudWxsKTsKKyAgICAgICAgICAgIGlmIChjICE9IG51bGwgJiYgYy5tb3ZlVG9OZXh0KCkpIHsKKyAgICAgICAgICAgICAgICBpZiAoaXNTdHJpbmcpIHsKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHZhbHVlID0gYy5nZXRTdHJpbmcoMSk7CisgICAgICAgICAgICAgICAgICAgIGludCBzdGFydCA9IDA7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKHByb3BlcnR5ID09IE10cENvbnN0YW50cy5QUk9QRVJUWV9PQkpFQ1RfRklMRV9OQU1FKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBleHRyYWN0IG5hbWUgZnJvbSBmdWxsIHBhdGgKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBsYXN0U2xhc2ggPSB2YWx1ZS5sYXN0SW5kZXhPZignLycpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxhc3RTbGFzaCA+PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnQgPSBsYXN0U2xhc2ggKyAxOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGludCBlbmQgPSB2YWx1ZS5sZW5ndGgoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGVuZCAtIHN0YXJ0ID4gMjU1KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBlbmQgPSBzdGFydCArIDI1NTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB2YWx1ZS5nZXRDaGFycyhzdGFydCwgZW5kLCBvdXRTdHJpbmdWYWx1ZSwgMCk7CisgICAgICAgICAgICAgICAgICAgIG91dFN0cmluZ1ZhbHVlW2VuZCAtIHN0YXJ0XSA9IDA7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgb3V0SW50VmFsdWVbMF0gPSBjLmdldExvbmcoMSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBNdHBDb25zdGFudHMuUkVTUE9OU0VfT0s7CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICByZXR1cm4gTXRwQ29uc3RhbnRzLlJFU1BPTlNFX0dFTkVSQUxfRVJST1I7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBpZiAoYyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgYy5jbG9zZSgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8vIHF1ZXJ5IGZhaWxlZCBpZiB3ZSBnZXQgaGVyZQorICAgICAgICByZXR1cm4gTXRwQ29uc3RhbnRzLlJFU1BPTlNFX0lOVkFMSURfT0JKRUNUX0hBTkRMRTsKKyAgICB9CisKKyAgICBwcml2YXRlIGludCBzZXRPYmplY3RQcm9wZXJ0eShpbnQgaGFuZGxlLCBpbnQgcHJvcGVydHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9uZyBpbnRWYWx1ZSwgU3RyaW5nIHN0cmluZ1ZhbHVlKSB7CisgICAgICAgIExvZy5kKFRBRywgInNldE9iamVjdFByb3BlcnR5OiAiICsgcHJvcGVydHkpOworICAgICAgICByZXR1cm4gTXRwQ29uc3RhbnRzLlJFU1BPTlNFX09CSkVDVF9QUk9QX05PVF9TVVBQT1JURUQ7CisgICAgfQorCisgICAgcHJpdmF0ZSBpbnQgZ2V0RGV2aWNlUHJvcGVydHkoaW50IHByb3BlcnR5LCBsb25nW10gb3V0SW50VmFsdWUsIGNoYXJbXSBvdXRTdHJpbmdWYWx1ZSkgeworICAgICAgICBMb2cuZChUQUcsICJnZXREZXZpY2VQcm9wZXJ0eTogIiArIHByb3BlcnR5KTsKKworICAgICAgICBzd2l0Y2ggKHByb3BlcnR5KSB7CisgICAgICAgICAgICBjYXNlIE10cENvbnN0YW50cy5ERVZJQ0VfUFJPUEVSVFlfU1lOQ0hST05JWkFUSU9OX1BBUlRORVI6CisgICAgICAgICAgICBjYXNlIE10cENvbnN0YW50cy5ERVZJQ0VfUFJPUEVSVFlfREVWSUNFX0ZSSUVORExZX05BTUU6CisgICAgICAgICAgICAgICAgLy8gd3JpdGFibGUgc3RyaW5nIHByb3BlcnRpZXMga2VwdCBpbiBvdXIgZGV2aWNlIHByb3BlcnR5IGRhdGFiYXNlCisgICAgICAgICAgICAgICAgQ3Vyc29yIGMgPSBudWxsOworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIGMgPSBtRGV2aWNlUHJvcERiLnF1ZXJ5KCJwcm9wZXJ0aWVzIiwgREVWSUNFX1BST1BFUlRZX1BST0pFQ1RJT04sCisgICAgICAgICAgICAgICAgICAgICAgICBERVZJQ0VfUFJPUEVSVFlfV0hFUkUsIG5ldyBTdHJpbmdbXSB7ICBJbnRlZ2VyLnRvU3RyaW5nKHByb3BlcnR5KSB9LAorICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCwgbnVsbCwgbnVsbCk7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKGMgIT0gbnVsbCAmJiBjLm1vdmVUb05leHQoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHZhbHVlID0gYy5nZXRTdHJpbmcoMSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGVuZ3RoID0gdmFsdWUubGVuZ3RoKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobGVuZ3RoID4gMjU1KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuZ3RoID0gMjU1OworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUuZ2V0Q2hhcnMoMCwgbGVuZ3RoLCBvdXRTdHJpbmdWYWx1ZSwgMCk7CisgICAgICAgICAgICAgICAgICAgICAgICBvdXRTdHJpbmdWYWx1ZVtsZW5ndGhdID0gMDsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG91dFN0cmluZ1ZhbHVlWzBdID0gMDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gTXRwQ29uc3RhbnRzLlJFU1BPTlNFX09LOworICAgICAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChjICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGMuY2xvc2UoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBNdHBDb25zdGFudHMuUkVTUE9OU0VfREVWSUNFX1BST1BfTk9UX1NVUFBPUlRFRDsKKyAgICB9CisKKyAgICBwcml2YXRlIGludCBzZXREZXZpY2VQcm9wZXJ0eShpbnQgcHJvcGVydHksIGxvbmcgaW50VmFsdWUsIFN0cmluZyBzdHJpbmdWYWx1ZSkgeworICAgICAgICBMb2cuZChUQUcsICJzZXREZXZpY2VQcm9wZXJ0eTogIiArIHByb3BlcnR5ICsgIiA6ICIgKyBzdHJpbmdWYWx1ZSk7CisKKyAgICAgICAgc3dpdGNoIChwcm9wZXJ0eSkgeworICAgICAgICAgICAgY2FzZSBNdHBDb25zdGFudHMuREVWSUNFX1BST1BFUlRZX1NZTkNIUk9OSVpBVElPTl9QQVJUTkVSOgorICAgICAgICAgICAgY2FzZSBNdHBDb25zdGFudHMuREVWSUNFX1BST1BFUlRZX0RFVklDRV9GUklFTkRMWV9OQU1FOgorICAgICAgICAgICAgICAgIC8vIHdyaXRhYmxlIHN0cmluZyBwcm9wZXJ0aWVzIGtlcHQgaW4gb3VyIGRldmljZSBwcm9wZXJ0eSBkYXRhYmFzZQorICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIENvbnRlbnRWYWx1ZXMgdmFsdWVzID0gbmV3IENvbnRlbnRWYWx1ZXMoKTsKKyAgICAgICAgICAgICAgICAgICAgdmFsdWVzLnB1dCgiY29kZSIsIHByb3BlcnR5KTsKKyAgICAgICAgICAgICAgICAgICAgdmFsdWVzLnB1dCgidmFsdWUiLCBzdHJpbmdWYWx1ZSk7CisgICAgICAgICAgICAgICAgICAgIG1EZXZpY2VQcm9wRGIuaW5zZXJ0KCJwcm9wZXJ0aWVzIiwgImNvZGUiLCB2YWx1ZXMpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gTXRwQ29uc3RhbnRzLlJFU1BPTlNFX09LOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBNdHBDb25zdGFudHMuUkVTUE9OU0VfR0VORVJBTF9FUlJPUjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gTXRwQ29uc3RhbnRzLlJFU1BPTlNFX0RFVklDRV9QUk9QX05PVF9TVVBQT1JURUQ7CisgICAgfQorCisgICAgcHJpdmF0ZSBib29sZWFuIGdldE9iamVjdEluZm8oaW50IGhhbmRsZSwgaW50W10gb3V0U3RvcmFnZUZvcm1hdFBhcmVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNoYXJbXSBvdXROYW1lLCBsb25nW10gb3V0U2l6ZU1vZGlmaWVkKSB7CisgICAgICAgIExvZy5kKFRBRywgImdldE9iamVjdEluZm86ICIgKyBoYW5kbGUpOworICAgICAgICBDdXJzb3IgYyA9IG51bGw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBjID0gbU1lZGlhUHJvdmlkZXIucXVlcnkobU9iamVjdHNVcmksIE9CSkVDVF9JTkZPX1BST0pFQ1RJT04sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgSURfV0hFUkUsIG5ldyBTdHJpbmdbXSB7ICBJbnRlZ2VyLnRvU3RyaW5nKGhhbmRsZSkgfSwgbnVsbCk7CisgICAgICAgICAgICBpZiAoYyAhPSBudWxsICYmIGMubW92ZVRvTmV4dCgpKSB7CisgICAgICAgICAgICAgICAgb3V0U3RvcmFnZUZvcm1hdFBhcmVudFswXSA9IG1TdG9yYWdlSUQ7CisgICAgICAgICAgICAgICAgb3V0U3RvcmFnZUZvcm1hdFBhcmVudFsxXSA9IGMuZ2V0SW50KDIpOworICAgICAgICAgICAgICAgIG91dFN0b3JhZ2VGb3JtYXRQYXJlbnRbMl0gPSBjLmdldEludCgzKTsKKworICAgICAgICAgICAgICAgIC8vIGV4dHJhY3QgbmFtZSBmcm9tIHBhdGgKKyAgICAgICAgICAgICAgICBTdHJpbmcgcGF0aCA9IGMuZ2V0U3RyaW5nKDEpOworICAgICAgICAgICAgICAgIGludCBsYXN0U2xhc2ggPSBwYXRoLmxhc3RJbmRleE9mKCcvJyk7CisgICAgICAgICAgICAgICAgaW50IHN0YXJ0ID0gKGxhc3RTbGFzaCA+PSAwID8gbGFzdFNsYXNoICsgMSA6IDApOworICAgICAgICAgICAgICAgIGludCBlbmQgPSBwYXRoLmxlbmd0aCgpOworICAgICAgICAgICAgICAgIGlmIChlbmQgLSBzdGFydCA+IDI1NSkgeworICAgICAgICAgICAgICAgICAgICBlbmQgPSBzdGFydCArIDI1NTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcGF0aC5nZXRDaGFycyhzdGFydCwgZW5kLCBvdXROYW1lLCAwKTsKKyAgICAgICAgICAgICAgICBvdXROYW1lW2VuZCAtIHN0YXJ0XSA9IDA7CisKKyAgICAgICAgICAgICAgICBvdXRTaXplTW9kaWZpZWRbMF0gPSBjLmdldExvbmcoNCk7CisgICAgICAgICAgICAgICAgb3V0U2l6ZU1vZGlmaWVkWzFdID0gYy5nZXRMb25nKDUpOworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgTG9nLmUoVEFHLCAiUmVtb3RlRXhjZXB0aW9uIGluIGdldE9iamVjdFByb3BlcnR5IiwgZSk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBpZiAoYyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgYy5jbG9zZSgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBwcml2YXRlIGludCBnZXRPYmplY3RGaWxlUGF0aChpbnQgaGFuZGxlLCBjaGFyW10gb3V0RmlsZVBhdGgsIGxvbmdbXSBvdXRGaWxlTGVuZ3RoKSB7CisgICAgICAgIExvZy5kKFRBRywgImdldE9iamVjdEZpbGVQYXRoOiAiICsgaGFuZGxlKTsKKyAgICAgICAgQ3Vyc29yIGMgPSBudWxsOworICAgICAgICB0cnkgeworICAgICAgICAgICAgYyA9IG1NZWRpYVByb3ZpZGVyLnF1ZXJ5KG1PYmplY3RzVXJpLCBQQVRIX1NJWkVfUFJPSkVDVElPTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRF9XSEVSRSwgbmV3IFN0cmluZ1tdIHsgIEludGVnZXIudG9TdHJpbmcoaGFuZGxlKSB9LCBudWxsKTsKKyAgICAgICAgICAgIGlmIChjICE9IG51bGwgJiYgYy5tb3ZlVG9OZXh0KCkpIHsKKyAgICAgICAgICAgICAgICBTdHJpbmcgcGF0aCA9IGMuZ2V0U3RyaW5nKDEpOworICAgICAgICAgICAgICAgIHBhdGguZ2V0Q2hhcnMoMCwgcGF0aC5sZW5ndGgoKSwgb3V0RmlsZVBhdGgsIDApOworICAgICAgICAgICAgICAgIG91dEZpbGVQYXRoW3BhdGgubGVuZ3RoKCldID0gMDsKKyAgICAgICAgICAgICAgICBvdXRGaWxlTGVuZ3RoWzBdID0gYy5nZXRMb25nKDIpOworICAgICAgICAgICAgICAgIHJldHVybiBNdHBDb25zdGFudHMuUkVTUE9OU0VfT0s7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJldHVybiBNdHBDb25zdGFudHMuUkVTUE9OU0VfSU5WQUxJRF9PQkpFQ1RfSEFORExFOworICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgTG9nLmUoVEFHLCAiUmVtb3RlRXhjZXB0aW9uIGluIGdldE9iamVjdEZpbGVQYXRoIiwgZSk7CisgICAgICAgICAgICByZXR1cm4gTXRwQ29uc3RhbnRzLlJFU1BPTlNFX0dFTkVSQUxfRVJST1I7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBpZiAoYyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgYy5jbG9zZSgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBpbnQgZGVsZXRlUmVjdXJzaXZlKGludCBoYW5kbGUpIHRocm93cyBSZW1vdGVFeGNlcHRpb24geworICAgICAgICBpbnRbXSBjaGlsZHJlbiA9IGdldE9iamVjdExpc3QoMCAvKiBzdG9yYWdlSUQgKi8sIDAgLyogZm9ybWF0ICovLCBoYW5kbGUpOworICAgICAgICBVcmkgdXJpID0gRmlsZXMuZ2V0TXRwT2JqZWN0c1VyaShtVm9sdW1lTmFtZSwgaGFuZGxlKTsKKyAgICAgICAgLy8gZGVsZXRlIHBhcmVudCBmaXJzdCwgdG8gYXZvaWQgcG90ZW50aWFsIGluZmluaXRlIHJlY3Vyc2lvbgorICAgICAgICBpbnQgY291bnQgPSBtTWVkaWFQcm92aWRlci5kZWxldGUodXJpLCBudWxsLCBudWxsKTsKKyAgICAgICAgaWYgKGNvdW50ID09IDEpIHsKKyAgICAgICAgICAgIGlmIChjaGlsZHJlbiAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSBkZWxldGVSZWN1cnNpdmUoY2hpbGRyZW5baV0pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gY291bnQ7CisgICAgfQorCisgICAgcHJpdmF0ZSBpbnQgZGVsZXRlRmlsZShpbnQgaGFuZGxlKSB7CisgICAgICAgIExvZy5kKFRBRywgImRlbGV0ZUZpbGU6ICIgKyBoYW5kbGUpOworICAgICAgICBtRGF0YWJhc2VNb2RpZmllZCA9IHRydWU7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpZiAoZGVsZXRlUmVjdXJzaXZlKGhhbmRsZSkgPiAwKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE10cENvbnN0YW50cy5SRVNQT05TRV9PSzsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE10cENvbnN0YW50cy5SRVNQT05TRV9JTlZBTElEX09CSkVDVF9IQU5ETEU7CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBMb2cuZShUQUcsICJSZW1vdGVFeGNlcHRpb24gaW4gZGVsZXRlRmlsZSIsIGUpOworICAgICAgICAgICAgcmV0dXJuIE10cENvbnN0YW50cy5SRVNQT05TRV9HRU5FUkFMX0VSUk9SOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBpbnRbXSBnZXRPYmplY3RSZWZlcmVuY2VzKGludCBoYW5kbGUpIHsKKyAgICAgICAgTG9nLmQoVEFHLCAiZ2V0T2JqZWN0UmVmZXJlbmNlcyBmb3I6ICIgKyBoYW5kbGUpOworICAgICAgICBVcmkgdXJpID0gRmlsZXMuZ2V0TXRwUmVmZXJlbmNlc1VyaShtVm9sdW1lTmFtZSwgaGFuZGxlKTsKKyAgICAgICAgQ3Vyc29yIGMgPSBudWxsOworICAgICAgICB0cnkgeworICAgICAgICAgICAgYyA9IG1NZWRpYVByb3ZpZGVyLnF1ZXJ5KHVyaSwgSURfUFJPSkVDVElPTiwgbnVsbCwgbnVsbCwgbnVsbCk7CisgICAgICAgICAgICBpZiAoYyA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpbnQgY291bnQgPSBjLmdldENvdW50KCk7CisgICAgICAgICAgICBpZiAoY291bnQgPiAwKSB7CisgICAgICAgICAgICAgICAgaW50W10gcmVzdWx0ID0gbmV3IGludFtjb3VudF07CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIGMubW92ZVRvTmV4dCgpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbaV0gPSBjLmdldEludCgwKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIExvZy5lKFRBRywgIlJlbW90ZUV4Y2VwdGlvbiBpbiBnZXRPYmplY3RMaXN0IiwgZSk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBpZiAoYyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgYy5jbG9zZSgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIHByaXZhdGUgaW50IHNldE9iamVjdFJlZmVyZW5jZXMoaW50IGhhbmRsZSwgaW50W10gcmVmZXJlbmNlcykgeworICAgICAgICBtRGF0YWJhc2VNb2RpZmllZCA9IHRydWU7CisgICAgICAgIFVyaSB1cmkgPSBGaWxlcy5nZXRNdHBSZWZlcmVuY2VzVXJpKG1Wb2x1bWVOYW1lLCBoYW5kbGUpOworICAgICAgICBpbnQgY291bnQgPSByZWZlcmVuY2VzLmxlbmd0aDsKKyAgICAgICAgQ29udGVudFZhbHVlc1tdIHZhbHVlc0xpc3QgPSBuZXcgQ29udGVudFZhbHVlc1tjb3VudF07CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeworICAgICAgICAgICAgQ29udGVudFZhbHVlcyB2YWx1ZXMgPSBuZXcgQ29udGVudFZhbHVlcygpOworICAgICAgICAgICAgdmFsdWVzLnB1dChGaWxlcy5GaWxlQ29sdW1ucy5fSUQsIHJlZmVyZW5jZXNbaV0pOworICAgICAgICAgICAgdmFsdWVzTGlzdFtpXSA9IHZhbHVlczsKKyAgICAgICAgfQorICAgICAgICB0cnkgeworICAgICAgICAgICAgaWYgKGNvdW50ID09IG1NZWRpYVByb3ZpZGVyLmJ1bGtJbnNlcnQodXJpLCB2YWx1ZXNMaXN0KSkgeworICAgICAgICAgICAgICAgIHJldHVybiBNdHBDb25zdGFudHMuUkVTUE9OU0VfT0s7CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBMb2cuZShUQUcsICJSZW1vdGVFeGNlcHRpb24gaW4gc2V0T2JqZWN0UmVmZXJlbmNlcyIsIGUpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBNdHBDb25zdGFudHMuUkVTUE9OU0VfR0VORVJBTF9FUlJPUjsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgc2Vzc2lvblN0YXJ0ZWQoKSB7CisgICAgICAgIExvZy5kKFRBRywgInNlc3Npb25TdGFydGVkIik7CisgICAgICAgIG1EYXRhYmFzZU1vZGlmaWVkID0gZmFsc2U7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHNlc3Npb25FbmRlZCgpIHsKKyAgICAgICAgTG9nLmQoVEFHLCAic2Vzc2lvbkVuZGVkIik7CisgICAgICAgIGlmIChtRGF0YWJhc2VNb2RpZmllZCkgeworICAgICAgICAgICAgTG9nLmQoVEFHLCAic2VuZGluZyBBQ1RJT05fTVRQX1NFU1NJT05fRU5EIik7CisgICAgICAgICAgICBtQ29udGV4dC5zZW5kQnJvYWRjYXN0KG5ldyBJbnRlbnQoTXRwLkFDVElPTl9NVFBfU0VTU0lPTl9FTkQpKTsKKyAgICAgICAgICAgIG1EYXRhYmFzZU1vZGlmaWVkID0gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyB1c2VkIGJ5IHRoZSBKTkkgY29kZQorICAgIHByaXZhdGUgaW50IG1OYXRpdmVDb250ZXh0OworCisgICAgcHJpdmF0ZSBuYXRpdmUgZmluYWwgdm9pZCBuYXRpdmVfc2V0dXAoKTsKKyAgICBwcml2YXRlIG5hdGl2ZSBmaW5hbCB2b2lkIG5hdGl2ZV9maW5hbGl6ZSgpOworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvamF2YS9hbmRyb2lkL21lZGlhL010cFNlcnZlci5qYXZhIGIvbWVkaWEvamF2YS9hbmRyb2lkL21lZGlhL010cFNlcnZlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdmMTUyNzYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9qYXZhL2FuZHJvaWQvbWVkaWEvTXRwU2VydmVyLmphdmEKQEAgLTAsMCArMSw3NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5tZWRpYTsKKworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CisKKy8qKgorICogSmF2YSB3cmFwcGVyIGZvciBNVFAvUFRQIHN1cHBvcnQgYXMgVVNCIHJlc3BvbmRlci4KKyAqIHtAaGlkZX0KKyAqLworcHVibGljIGNsYXNzIE10cFNlcnZlciB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIk10cFNlcnZlciI7CisKKyAgICBzdGF0aWMgeworICAgICAgICBTeXN0ZW0ubG9hZExpYnJhcnkoIm1lZGlhX2puaSIpOworICAgIH0KKworICAgIHB1YmxpYyBNdHBTZXJ2ZXIoTXRwRGF0YWJhc2UgZGF0YWJhc2UsIFN0cmluZyBzdG9yYWdlUGF0aCkgeworICAgICAgICBuYXRpdmVfc2V0dXAoZGF0YWJhc2UsIHN0b3JhZ2VQYXRoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBmaW5hbGl6ZSgpIHRocm93cyBUaHJvd2FibGUgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgbmF0aXZlX2ZpbmFsaXplKCk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBzdXBlci5maW5hbGl6ZSgpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc3RhcnQoKSB7CisgICAgICAgIG5hdGl2ZV9zdGFydCgpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHN0b3AoKSB7CisgICAgICAgIG5hdGl2ZV9zdG9wKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2VuZE9iamVjdEFkZGVkKGludCBoYW5kbGUpIHsKKyAgICAgICAgbmF0aXZlX3NlbmRfb2JqZWN0X2FkZGVkKGhhbmRsZSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2VuZE9iamVjdFJlbW92ZWQoaW50IGhhbmRsZSkgeworICAgICAgICBuYXRpdmVfc2VuZF9vYmplY3RfcmVtb3ZlZChoYW5kbGUpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFB0cE1vZGUoYm9vbGVhbiB1c2VQdHApIHsKKyAgICAgICAgbmF0aXZlX3NldF9wdHBfbW9kZSh1c2VQdHApOworICAgIH0KKworICAgIC8vIHVzZWQgYnkgdGhlIEpOSSBjb2RlCisgICAgcHJpdmF0ZSBpbnQgbU5hdGl2ZUNvbnRleHQ7CisKKyAgICBwcml2YXRlIG5hdGl2ZSBmaW5hbCB2b2lkIG5hdGl2ZV9zZXR1cChNdHBEYXRhYmFzZSBkYXRhYmFzZSwgU3RyaW5nIHN0b3JhZ2VQYXRoKTsKKyAgICBwcml2YXRlIG5hdGl2ZSBmaW5hbCB2b2lkIG5hdGl2ZV9maW5hbGl6ZSgpOworICAgIHByaXZhdGUgbmF0aXZlIGZpbmFsIHZvaWQgbmF0aXZlX3N0YXJ0KCk7CisgICAgcHJpdmF0ZSBuYXRpdmUgZmluYWwgdm9pZCBuYXRpdmVfc3RvcCgpOworICAgIHByaXZhdGUgbmF0aXZlIGZpbmFsIHZvaWQgbmF0aXZlX3NlbmRfb2JqZWN0X2FkZGVkKGludCBoYW5kbGUpOworICAgIHByaXZhdGUgbmF0aXZlIGZpbmFsIHZvaWQgbmF0aXZlX3NlbmRfb2JqZWN0X3JlbW92ZWQoaW50IGhhbmRsZSk7CisgICAgcHJpdmF0ZSBuYXRpdmUgZmluYWwgdm9pZCBuYXRpdmVfc2V0X3B0cF9tb2RlKGJvb2xlYW4gdXNlUHRwKTsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2puaS9BbmRyb2lkLm1rIGIvbWVkaWEvam5pL0FuZHJvaWQubWsKaW5kZXggNzBlZDYwOC4uMjVkMjQzYiAxMDA2NDQKLS0tIGEvbWVkaWEvam5pL0FuZHJvaWQubWsKKysrIGIvbWVkaWEvam5pL0FuZHJvaWQubWsKQEAgLTgsNyArOCwxMSBAQAogICAgIGFuZHJvaWRfbWVkaWFfTWVkaWFNZXRhZGF0YVJldHJpZXZlci5jcHAgXAogICAgIGFuZHJvaWRfbWVkaWFfUmVzYW1wbGVJbnB1dFN0cmVhbS5jcHAgXAogICAgIGFuZHJvaWRfbWVkaWFfTWVkaWFQcm9maWxlcy5jcHAgXAotICAgIGFuZHJvaWRfbWVkaWFfQW1ySW5wdXRTdHJlYW0uY3BwCisgICAgYW5kcm9pZF9tZWRpYV9BbXJJbnB1dFN0cmVhbS5jcHAgXAorCWFuZHJvaWRfbWVkaWFfTXRwQ2xpZW50LmNwcCBcCisJYW5kcm9pZF9tZWRpYV9NdHBDdXJzb3IuY3BwIFwKKwlhbmRyb2lkX21lZGlhX010cERhdGFiYXNlLmNwcCBcCisJYW5kcm9pZF9tZWRpYV9NdHBTZXJ2ZXIuY3BwIFwKIAogTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBcCiAgICAgbGliYW5kcm9pZF9ydW50aW1lIFwKQEAgLTIxLDkgKzI1LDEyIEBACiAgICAgbGliY3V0aWxzIFwKICAgICBsaWJzdXJmYWNlZmxpbmdlcl9jbGllbnQgXAogICAgIGxpYnN0YWdlZnJpZ2h0IFwKLSAgICBsaWJjYW1lcmFfY2xpZW50CisgICAgbGliY2FtZXJhX2NsaWVudCBcCisJbGlic3FsaXRlCiAKLUxPQ0FMX1NUQVRJQ19MSUJSQVJJRVMgOj0KK2lmbmVxICgkKFRBUkdFVF9TSU1VTEFUT1IpLHRydWUpCitMT0NBTF9TVEFUSUNfTElCUkFSSUVTIDo9IGxpYm10cCBsaWJ1c2Job3N0CitlbmRpZgogCiBMT0NBTF9DX0lOQ0xVREVTICs9IFwKICAgICBleHRlcm5hbC90cmVtb3IvVHJlbW9yIFwKQEAgLTMyLDYgKzM5LDcgQEAKICAgICBmcmFtZXdvcmtzL2Jhc2UvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2VuYy9zcmMgXAogICAgIGZyYW1ld29ya3MvYmFzZS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uIFwKICAgICBmcmFtZXdvcmtzL2Jhc2UvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlIFwKKyAgICBmcmFtZXdvcmtzL2Jhc2UvbWVkaWEvbXRwIFwKICAgICAkKFBWX0lOQ0xVREVTKSBcCiAgICAgJChKTklfSF9JTkNMVURFKSBcCiAgICAgJChjYWxsIGluY2x1ZGUtcGF0aC1mb3IsIGNvcmVjZyBncmFwaGljcykKZGlmZiAtLWdpdCBhL21lZGlhL2puaS9hbmRyb2lkX21lZGlhX01lZGlhUGxheWVyLmNwcCBiL21lZGlhL2puaS9hbmRyb2lkX21lZGlhX01lZGlhUGxheWVyLmNwcAppbmRleCA2Zjk0ZThiLi5kNGFhY2FmIDEwMDY0NAotLS0gYS9tZWRpYS9qbmkvYW5kcm9pZF9tZWRpYV9NZWRpYVBsYXllci5jcHAKKysrIGIvbWVkaWEvam5pL2FuZHJvaWRfbWVkaWFfTWVkaWFQbGF5ZXIuY3BwCkBAIC03ODgsNiArNzg4LDEwIEBACiBleHRlcm4gaW50IHJlZ2lzdGVyX2FuZHJvaWRfbWVkaWFfTWVkaWFTY2FubmVyKEpOSUVudiAqZW52KTsKIGV4dGVybiBpbnQgcmVnaXN0ZXJfYW5kcm9pZF9tZWRpYV9SZXNhbXBsZUlucHV0U3RyZWFtKEpOSUVudiAqZW52KTsKIGV4dGVybiBpbnQgcmVnaXN0ZXJfYW5kcm9pZF9tZWRpYV9NZWRpYVByb2ZpbGVzKEpOSUVudiAqZW52KTsKK2V4dGVybiBpbnQgcmVnaXN0ZXJfYW5kcm9pZF9tZWRpYV9NdHBDbGllbnQoSk5JRW52ICplbnYpOworZXh0ZXJuIGludCByZWdpc3Rlcl9hbmRyb2lkX21lZGlhX010cEN1cnNvcihKTklFbnYgKmVudik7CitleHRlcm4gaW50IHJlZ2lzdGVyX2FuZHJvaWRfbWVkaWFfTXRwRGF0YWJhc2UoSk5JRW52ICplbnYpOworZXh0ZXJuIGludCByZWdpc3Rlcl9hbmRyb2lkX21lZGlhX010cFNlcnZlcihKTklFbnYgKmVudik7CiBleHRlcm4gaW50IHJlZ2lzdGVyX2FuZHJvaWRfbWVkaWFfQW1ySW5wdXRTdHJlYW0oSk5JRW52ICplbnYpOwogCiBqaW50IEpOSV9PbkxvYWQoSmF2YVZNKiB2bSwgdm9pZCogcmVzZXJ2ZWQpCkBAIC04MzYsNiArODQwLDI2IEBACiAgICAgICAgIGdvdG8gYmFpbDsKICAgICB9CiAKKyAgICBpZiAocmVnaXN0ZXJfYW5kcm9pZF9tZWRpYV9NdHBDbGllbnQoZW52KSA8IDApIHsKKyAgICAgICAgTE9HRSgiRVJST1I6IE10cENsaWVudCBuYXRpdmUgcmVnaXN0cmF0aW9uIGZhaWxlZCIpOworICAgICAgICBnb3RvIGJhaWw7CisgICAgfQorCisgICAgaWYgKHJlZ2lzdGVyX2FuZHJvaWRfbWVkaWFfTXRwQ3Vyc29yKGVudikgPCAwKSB7CisgICAgICAgIExPR0UoIkVSUk9SOiBNdHBDdXJzb3IgbmF0aXZlIHJlZ2lzdHJhdGlvbiBmYWlsZWQiKTsKKyAgICAgICAgZ290byBiYWlsOworICAgIH0KKworICAgIGlmIChyZWdpc3Rlcl9hbmRyb2lkX21lZGlhX010cERhdGFiYXNlKGVudikgPCAwKSB7CisgICAgICAgIExPR0UoIkVSUk9SOiBNdHBEYXRhYmFzZSBuYXRpdmUgcmVnaXN0cmF0aW9uIGZhaWxlZCIpOworICAgICAgICBnb3RvIGJhaWw7CisgICAgfQorCisgICAgaWYgKHJlZ2lzdGVyX2FuZHJvaWRfbWVkaWFfTXRwU2VydmVyKGVudikgPCAwKSB7CisgICAgICAgIExPR0UoIkVSUk9SOiBNdHBTZXJ2ZXIgbmF0aXZlIHJlZ2lzdHJhdGlvbiBmYWlsZWQiKTsKKyAgICAgICAgZ290byBiYWlsOworICAgIH0KKwogICAgIC8qIHN1Y2Nlc3MgLS0gcmV0dXJuIHZhbGlkIHZlcnNpb24gbnVtYmVyICovCiAgICAgcmVzdWx0ID0gSk5JX1ZFUlNJT05fMV80OwogCmRpZmYgLS1naXQgYS9tZWRpYS9qbmkvYW5kcm9pZF9tZWRpYV9NZWRpYVByb2ZpbGVzLmNwcCBiL21lZGlhL2puaS9hbmRyb2lkX21lZGlhX01lZGlhUHJvZmlsZXMuY3BwCmluZGV4IGNjZTlmZDAuLjA4YTZkZTEgMTAwNjQ0Ci0tLSBhL21lZGlhL2puaS9hbmRyb2lkX21lZGlhX01lZGlhUHJvZmlsZXMuY3BwCisrKyBiL21lZGlhL2puaS9hbmRyb2lkX21lZGlhX01lZGlhUHJvZmlsZXMuY3BwCkBAIC0xNjUsNyArMTY1LDkgQEAKIGFuZHJvaWRfbWVkaWFfTWVkaWFQcm9maWxlc19uYXRpdmVfZ2V0X2NhbWNvcmRlcl9wcm9maWxlKEpOSUVudiAqZW52LCBqb2JqZWN0IHRoaXosIGppbnQgaWQsIGppbnQgcXVhbGl0eSkKIHsKICAgICBMT0dWKCJuYXRpdmVfZ2V0X2NhbWNvcmRlcl9wcm9maWxlOiAlZCAlZCIsIGlkLCBxdWFsaXR5KTsKLSAgICBpZiAocXVhbGl0eSAhPSBDQU1DT1JERVJfUVVBTElUWV9ISUdIICYmIHF1YWxpdHkgIT0gQ0FNQ09SREVSX1FVQUxJVFlfTE9XKSB7CisgICAgaWYgKCEoKHF1YWxpdHkgPj0gQ0FNQ09SREVSX1FVQUxJVFlfTE9XICYmIHF1YWxpdHkgPD0gQ0FNQ09SREVSX1FVQUxJVFlfMTA4MFApIHx8CisgICAgICAgICAgICAgICAgKHF1YWxpdHkgPj0gQ0FNQ09SREVSX1FVQUxJVFlfVElNRV9MQVBTRV9MT1cgJiYKKyAgICAgICAgICAgICAgICBxdWFsaXR5IDw9IENBTUNPUkRFUl9RVUFMSVRZX1RJTUVfTEFQU0VfMTA4MFApKSkgewogICAgICAgICBqbmlUaHJvd0V4Y2VwdGlvbihlbnYsICJqYXZhL2xhbmcvUnVudGltZUV4Y2VwdGlvbiIsICJVbmtub3duIGNhbWNvcmRlciBwcm9maWxlIHF1YWxpdHkiKTsKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQpAQCAtMjEwLDYgKzIxMiwyMCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb0NoYW5uZWxzKTsKIH0KIAorc3RhdGljIGpib29sZWFuCithbmRyb2lkX21lZGlhX01lZGlhUHJvZmlsZXNfbmF0aXZlX2hhc19jYW1jb3JkZXJfcHJvZmlsZShKTklFbnYgKmVudiwgam9iamVjdCB0aGl6LCBqaW50IGlkLCBqaW50IHF1YWxpdHkpCit7CisgICAgTE9HVigibmF0aXZlX2hhc19jYW1jb3JkZXJfcHJvZmlsZTogJWQgJWQiLCBpZCwgcXVhbGl0eSk7CisgICAgaWYgKCEoKHF1YWxpdHkgPj0gQ0FNQ09SREVSX1FVQUxJVFlfTE9XICYmIHF1YWxpdHkgPD0gQ0FNQ09SREVSX1FVQUxJVFlfMTA4MFApIHx8CisgICAgICAgICAgICAgICAgKHF1YWxpdHkgPj0gQ0FNQ09SREVSX1FVQUxJVFlfVElNRV9MQVBTRV9MT1cgJiYKKyAgICAgICAgICAgICAgICBxdWFsaXR5IDw9IENBTUNPUkRFUl9RVUFMSVRZX1RJTUVfTEFQU0VfMTA4MFApKSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgY2FtY29yZGVyX3F1YWxpdHkgcSA9IHN0YXRpY19jYXN0PGNhbWNvcmRlcl9xdWFsaXR5PihxdWFsaXR5KTsKKyAgICByZXR1cm4gc1Byb2ZpbGVzLT5oYXNDYW1jb3JkZXJQcm9maWxlKGlkLCBxKTsKK30KKwogc3RhdGljIGppbnQKIGFuZHJvaWRfbWVkaWFfTWVkaWFQcm9maWxlc19uYXRpdmVfZ2V0X251bV92aWRlb19kZWNvZGVycyhKTklFbnYgKmVudiwgam9iamVjdCB0aGl6KQogewpAQCAtMjg5LDYgKzMwNSw4IEBACiAgICAgeyJuYXRpdmVfaW5pdCIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICIoKVYiLCAgICAgICAgICAgICAgICAgICAgKHZvaWQgKilhbmRyb2lkX21lZGlhX01lZGlhUHJvZmlsZXNfbmF0aXZlX2luaXR9LAogICAgIHsibmF0aXZlX2dldF9jYW1jb3JkZXJfcHJvZmlsZSIsICAgICAgICAgICAiKElJKUxhbmRyb2lkL21lZGlhL0NhbWNvcmRlclByb2ZpbGU7IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKWFuZHJvaWRfbWVkaWFfTWVkaWFQcm9maWxlc19uYXRpdmVfZ2V0X2NhbWNvcmRlcl9wcm9maWxlfSwKKyAgICB7Im5hdGl2ZV9oYXNfY2FtY29yZGVyX3Byb2ZpbGUiLCAgICAgICAgICAgIihJSSlaIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKWFuZHJvaWRfbWVkaWFfTWVkaWFQcm9maWxlc19uYXRpdmVfaGFzX2NhbWNvcmRlcl9wcm9maWxlfSwKIH07CiAKIHN0YXRpYyBKTklOYXRpdmVNZXRob2QgZ01ldGhvZHNGb3JEZWNvZGVyQ2FwYWJpbGl0aWVzQ2xhc3NbXSA9IHsKZGlmZiAtLWdpdCBhL21lZGlhL2puaS9hbmRyb2lkX21lZGlhX01lZGlhUmVjb3JkZXIuY3BwIGIvbWVkaWEvam5pL2FuZHJvaWRfbWVkaWFfTWVkaWFSZWNvcmRlci5jcHAKaW5kZXggZWZhMDgxMy4uODJiNGFjMSAxMDA2NDQKLS0tIGEvbWVkaWEvam5pL2FuZHJvaWRfbWVkaWFfTWVkaWFSZWNvcmRlci5jcHAKKysrIGIvbWVkaWEvam5pL2FuZHJvaWRfbWVkaWFfTWVkaWFSZWNvcmRlci5jcHAKQEAgLTI2MCw2ICsyNjAsMjAgQEAKIH0KIAogc3RhdGljIHZvaWQKK2FuZHJvaWRfbWVkaWFfTWVkaWFSZWNvcmRlcl9zZXRPdXRwdXRGaWxlQXV4RkQoSk5JRW52ICplbnYsIGpvYmplY3QgdGhpeiwgam9iamVjdCBmaWxlRGVzY3JpcHRvcikKK3sKKyAgICBMT0dWKCJzZXRPdXRwdXRGaWxlIik7CisgICAgaWYgKGZpbGVEZXNjcmlwdG9yID09IE5VTEwpIHsKKyAgICAgICAgam5pVGhyb3dFeGNlcHRpb24oZW52LCAiamF2YS9sYW5nL0lsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiIsIE5VTEwpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGludCBmZCA9IGdldFBhcmNlbEZpbGVEZXNjcmlwdG9yRkQoZW52LCBmaWxlRGVzY3JpcHRvcik7CisgICAgc3A8TWVkaWFSZWNvcmRlcj4gbXIgPSBnZXRNZWRpYVJlY29yZGVyKGVudiwgdGhpeik7CisgICAgc3RhdHVzX3Qgb3BTdGF0dXMgPSBtci0+c2V0T3V0cHV0RmlsZUF1eGlsaWFyeShmZCk7CisgICAgcHJvY2Vzc19tZWRpYV9yZWNvcmRlcl9jYWxsKGVudiwgb3BTdGF0dXMsICJqYXZhL2lvL0lPRXhjZXB0aW9uIiwgInNldE91dHB1dEZpbGUgZmFpbGVkLiIpOworfQorCitzdGF0aWMgdm9pZAogYW5kcm9pZF9tZWRpYV9NZWRpYVJlY29yZGVyX3NldFZpZGVvU2l6ZShKTklFbnYgKmVudiwgam9iamVjdCB0aGl6LCBqaW50IHdpZHRoLCBqaW50IGhlaWdodCkKIHsKICAgICBMT0dWKCJzZXRWaWRlb1NpemUoJWQsICVkKSIsIHdpZHRoLCBoZWlnaHQpOwpAQCAtNDY2LDYgKzQ4MCw3IEBACiAgICAgeyJzZXRBdWRpb0VuY29kZXIiLCAgICAgICIoSSlWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKilhbmRyb2lkX21lZGlhX01lZGlhUmVjb3JkZXJfc2V0QXVkaW9FbmNvZGVyfSwKICAgICB7InNldFBhcmFtZXRlciIsICAgICAgICAgIihMamF2YS9sYW5nL1N0cmluZzspViIsICAgICAgICAgICAodm9pZCAqKWFuZHJvaWRfbWVkaWFfTWVkaWFSZWNvcmRlcl9zZXRQYXJhbWV0ZXJ9LAogICAgIHsiX3NldE91dHB1dEZpbGUiLCAgICAgICAiKExqYXZhL2lvL0ZpbGVEZXNjcmlwdG9yO0pKKVYiLCAgICh2b2lkICopYW5kcm9pZF9tZWRpYV9NZWRpYVJlY29yZGVyX3NldE91dHB1dEZpbGVGRH0sCisgICAgeyJfc2V0T3V0cHV0RmlsZUF1eCIsICAgICIoTGphdmEvaW8vRmlsZURlc2NyaXB0b3I7KVYiLCAgICAgKHZvaWQgKilhbmRyb2lkX21lZGlhX01lZGlhUmVjb3JkZXJfc2V0T3V0cHV0RmlsZUF1eEZEfSwKICAgICB7InNldFZpZGVvU2l6ZSIsICAgICAgICAgIihJSSlWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKWFuZHJvaWRfbWVkaWFfTWVkaWFSZWNvcmRlcl9zZXRWaWRlb1NpemV9LAogICAgIHsic2V0VmlkZW9GcmFtZVJhdGUiLCAgICAiKEkpViIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopYW5kcm9pZF9tZWRpYV9NZWRpYVJlY29yZGVyX3NldFZpZGVvRnJhbWVSYXRlfSwKICAgICB7InNldE1heER1cmF0aW9uIiwgICAgICAgIihJKVYiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKWFuZHJvaWRfbWVkaWFfTWVkaWFSZWNvcmRlcl9zZXRNYXhEdXJhdGlvbn0sCmRpZmYgLS1naXQgYS9tZWRpYS9qbmkvYW5kcm9pZF9tZWRpYV9NZWRpYVNjYW5uZXIuY3BwIGIvbWVkaWEvam5pL2FuZHJvaWRfbWVkaWFfTWVkaWFTY2FubmVyLmNwcAppbmRleCAyNzNmMWFmLi5mZDBiMjMzIDEwMDY0NAotLS0gYS9tZWRpYS9qbmkvYW5kcm9pZF9tZWRpYV9NZWRpYVNjYW5uZXIuY3BwCisrKyBiL21lZGlhL2puaS9hbmRyb2lkX21lZGlhX01lZGlhU2Nhbm5lci5jcHAKQEAgLTE0Niw3ICsxNDYsNyBAQAogfQogCiBzdGF0aWMgdm9pZAotYW5kcm9pZF9tZWRpYV9NZWRpYVNjYW5uZXJfcHJvY2Vzc0RpcmVjdG9yeShKTklFbnYgKmVudiwgam9iamVjdCB0aGl6LCBqc3RyaW5nIHBhdGgsIGpzdHJpbmcgZXh0ZW5zaW9ucywgam9iamVjdCBjbGllbnQpCithbmRyb2lkX21lZGlhX01lZGlhU2Nhbm5lcl9wcm9jZXNzRGlyZWN0b3J5KEpOSUVudiAqZW52LCBqb2JqZWN0IHRoaXosIGpzdHJpbmcgcGF0aCwgam9iamVjdCBjbGllbnQpCiB7CiAgICAgTWVkaWFTY2FubmVyICptcCA9IChNZWRpYVNjYW5uZXIgKillbnYtPkdldEludEZpZWxkKHRoaXosIGZpZWxkcy5jb250ZXh0KTsKIApAQCAtMTU0LDI3ICsxNTQsMTYgQEAKICAgICAgICAgam5pVGhyb3dFeGNlcHRpb24oZW52LCAiamF2YS9sYW5nL0lsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiIsIE5VTEwpOwogICAgICAgICByZXR1cm47CiAgICAgfQotICAgIGlmIChleHRlbnNpb25zID09IE5VTEwpIHsKLSAgICAgICAgam5pVGhyb3dFeGNlcHRpb24oZW52LCAiamF2YS9sYW5nL0lsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiIsIE5VTEwpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIAorCiAgICAgY29uc3QgY2hhciAqcGF0aFN0ciA9IGVudi0+R2V0U3RyaW5nVVRGQ2hhcnMocGF0aCwgTlVMTCk7CiAgICAgaWYgKHBhdGhTdHIgPT0gTlVMTCkgeyAgLy8gT3V0IG9mIG1lbW9yeQogICAgICAgICBqbmlUaHJvd0V4Y2VwdGlvbihlbnYsICJqYXZhL2xhbmcvUnVudGltZUV4Y2VwdGlvbiIsICJPdXQgb2YgbWVtb3J5Iik7CiAgICAgICAgIHJldHVybjsKICAgICB9Ci0gICAgY29uc3QgY2hhciAqZXh0ZW5zaW9uc1N0ciA9IGVudi0+R2V0U3RyaW5nVVRGQ2hhcnMoZXh0ZW5zaW9ucywgTlVMTCk7Ci0gICAgaWYgKGV4dGVuc2lvbnNTdHIgPT0gTlVMTCkgeyAgLy8gT3V0IG9mIG1lbW9yeQotICAgICAgICBlbnYtPlJlbGVhc2VTdHJpbmdVVEZDaGFycyhwYXRoLCBwYXRoU3RyKTsKLSAgICAgICAgam5pVGhyb3dFeGNlcHRpb24oZW52LCAiamF2YS9sYW5nL1J1bnRpbWVFeGNlcHRpb24iLCAiT3V0IG9mIG1lbW9yeSIpOwotICAgICAgICByZXR1cm47Ci0gICAgfQogCiAgICAgTXlNZWRpYVNjYW5uZXJDbGllbnQgbXlDbGllbnQoZW52LCBjbGllbnQpOwotICAgIG1wLT5wcm9jZXNzRGlyZWN0b3J5KHBhdGhTdHIsIGV4dGVuc2lvbnNTdHIsIG15Q2xpZW50LCBFeGNlcHRpb25DaGVjaywgZW52KTsKKyAgICBtcC0+cHJvY2Vzc0RpcmVjdG9yeShwYXRoU3RyLCBteUNsaWVudCwgRXhjZXB0aW9uQ2hlY2ssIGVudik7CiAgICAgZW52LT5SZWxlYXNlU3RyaW5nVVRGQ2hhcnMocGF0aCwgcGF0aFN0cik7Ci0gICAgZW52LT5SZWxlYXNlU3RyaW5nVVRGQ2hhcnMoZXh0ZW5zaW9ucywgZXh0ZW5zaW9uc1N0cik7CiB9CiAKIHN0YXRpYyB2b2lkCkBAIC0zMDksOSArMjk4LDkgQEAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAogc3RhdGljIEpOSU5hdGl2ZU1ldGhvZCBnTWV0aG9kc1tdID0gewotICAgIHsicHJvY2Vzc0RpcmVjdG9yeSIsICAiKExqYXZhL2xhbmcvU3RyaW5nO0xqYXZhL2xhbmcvU3RyaW5nO0xhbmRyb2lkL21lZGlhL01lZGlhU2Nhbm5lckNsaWVudDspViIsICAgIAorICAgIHsicHJvY2Vzc0RpcmVjdG9yeSIsICAiKExqYXZhL2xhbmcvU3RyaW5nO0xhbmRyb2lkL21lZGlhL01lZGlhU2Nhbm5lckNsaWVudDspViIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopYW5kcm9pZF9tZWRpYV9NZWRpYVNjYW5uZXJfcHJvY2Vzc0RpcmVjdG9yeX0sCi0gICAgeyJwcm9jZXNzRmlsZSIsICAgICAgICIoTGphdmEvbGFuZy9TdHJpbmc7TGphdmEvbGFuZy9TdHJpbmc7TGFuZHJvaWQvbWVkaWEvTWVkaWFTY2FubmVyQ2xpZW50OylWIiwgICAgCisgICAgeyJwcm9jZXNzRmlsZSIsICAgICAgICIoTGphdmEvbGFuZy9TdHJpbmc7TGphdmEvbGFuZy9TdHJpbmc7TGFuZHJvaWQvbWVkaWEvTWVkaWFTY2FubmVyQ2xpZW50OylWIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKilhbmRyb2lkX21lZGlhX01lZGlhU2Nhbm5lcl9wcm9jZXNzRmlsZX0sCiAgICAgeyJzZXRMb2NhbGUiLCAgICAgICAgICIoTGphdmEvbGFuZy9TdHJpbmc7KVYiLCAgICAgICh2b2lkICopYW5kcm9pZF9tZWRpYV9NZWRpYVNjYW5uZXJfc2V0TG9jYWxlfSwKICAgICB7ImV4dHJhY3RBbGJ1bUFydCIsICAgIihMamF2YS9pby9GaWxlRGVzY3JpcHRvcjspW0IiLCAgICAgKHZvaWQgKilhbmRyb2lkX21lZGlhX01lZGlhU2Nhbm5lcl9leHRyYWN0QWxidW1BcnR9LApkaWZmIC0tZ2l0IGEvbWVkaWEvam5pL2FuZHJvaWRfbWVkaWFfTXRwQ2xpZW50LmNwcCBiL21lZGlhL2puaS9hbmRyb2lkX21lZGlhX010cENsaWVudC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjc3NDBiYwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2puaS9hbmRyb2lkX21lZGlhX010cENsaWVudC5jcHAKQEAgLTAsMCArMSwyOTYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIk10cENsaWVudEpOSSIKKyNpbmNsdWRlICJ1dGlscy9Mb2cuaCIKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjaW5jbHVkZSA8bGltaXRzLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKworI2luY2x1ZGUgImpuaS5oIgorI2luY2x1ZGUgIkpOSUhlbHAuaCIKKyNpbmNsdWRlICJhbmRyb2lkX3J1bnRpbWUvQW5kcm9pZFJ1bnRpbWUuaCIKKworI2luY2x1ZGUgIk10cENsaWVudC5oIgorI2luY2x1ZGUgIk10cERldmljZS5oIgorI2luY2x1ZGUgIk10cE9iamVjdEluZm8uaCIKKwordXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIGptZXRob2RJRCBtZXRob2RfZGV2aWNlQWRkZWQ7CitzdGF0aWMgam1ldGhvZElEIG1ldGhvZF9kZXZpY2VSZW1vdmVkOworc3RhdGljIGpmaWVsZElEIGZpZWxkX2NvbnRleHQ7CisKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9kZXNjcmlwdG9yX29mZnNldHNfdAoreworICAgIGpjbGFzcyBtQ2xhc3M7CisgICAgam1ldGhvZElEIG1Db25zdHJ1Y3RvcjsKKyAgICBqZmllbGRJRCBtRGVzY3JpcHRvcjsKK30gZ0ZpbGVEZXNjcmlwdG9yT2Zmc2V0czsKKworc3RhdGljIHN0cnVjdCBwYXJjZWxfZmlsZV9kZXNjcmlwdG9yX29mZnNldHNfdAoreworICAgIGpjbGFzcyBtQ2xhc3M7CisgICAgam1ldGhvZElEIG1Db25zdHJ1Y3RvcjsKK30gZ1BhcmNlbEZpbGVEZXNjcmlwdG9yT2Zmc2V0czsKKworI2lmZGVmIEhBVkVfQU5EUk9JRF9PUworCitzdGF0aWMgdm9pZCBjaGVja0FuZENsZWFyRXhjZXB0aW9uRnJvbUNhbGxiYWNrKEpOSUVudiogZW52LCBjb25zdCBjaGFyKiBtZXRob2ROYW1lKSB7CisgICAgaWYgKGVudi0+RXhjZXB0aW9uQ2hlY2soKSkgeworICAgICAgICBMT0dFKCJBbiBleGNlcHRpb24gd2FzIHRocm93biBieSBjYWxsYmFjayAnJXMnLiIsIG1ldGhvZE5hbWUpOworICAgICAgICBMT0dFX0VYKGVudik7CisgICAgICAgIGVudi0+RXhjZXB0aW9uQ2xlYXIoKTsKKyAgICB9Cit9CisKK2NsYXNzIE15Q2xpZW50IDogcHVibGljIE10cENsaWVudCB7Citwcml2YXRlOgorICAgIHZpcnR1YWwgdm9pZCAgICBkZXZpY2VBZGRlZChNdHBEZXZpY2UgKmRldmljZSk7CisgICAgdmlydHVhbCB2b2lkICAgIGRldmljZVJlbW92ZWQoTXRwRGV2aWNlICpkZXZpY2UpOworCisgICAgam9iamVjdCAgICAgICAgIG1DbGllbnQ7CisgICAgTXRwRGV2aWNlKiAgICAgIG1FdmVudERldmljZTsKKworcHVibGljOgorICAgICAgICAgICAgICAgICAgICBNeUNsaWVudChKTklFbnYgKmVudiwgam9iamVjdCBjbGllbnQpOworICAgIHZvaWQgICAgICAgICAgICBjbGVhbnVwKEpOSUVudiAqZW52KTsKK307CisKK010cENsaWVudCogZ2V0X2NsaWVudF9mcm9tX29iamVjdChKTklFbnYqIGVudiwgam9iamVjdCBqYXZhQ2xpZW50KQoreworICAgIHJldHVybiAoTXRwQ2xpZW50KillbnYtPkdldEludEZpZWxkKGphdmFDbGllbnQsIGZpZWxkX2NvbnRleHQpOworfQorCisKK015Q2xpZW50OjpNeUNsaWVudChKTklFbnYgKmVudiwgam9iamVjdCBjbGllbnQpCisgICAgOiAgIG1DbGllbnQoZW52LT5OZXdHbG9iYWxSZWYoY2xpZW50KSkKK3sKK30KKwordm9pZCBNeUNsaWVudDo6Y2xlYW51cChKTklFbnYgKmVudikgeworICAgIGVudi0+RGVsZXRlR2xvYmFsUmVmKG1DbGllbnQpOworfQorCit2b2lkIE15Q2xpZW50OjpkZXZpY2VBZGRlZChNdHBEZXZpY2UgKmRldmljZSkgeworICAgIEpOSUVudiogZW52ID0gQW5kcm9pZFJ1bnRpbWU6OmdldEpOSUVudigpOworICAgIGNvbnN0IGNoYXIqIG5hbWUgPSBkZXZpY2UtPmdldERldmljZU5hbWUoKTsKKyAgICBMT0dEKCJNeUNsaWVudDo6ZGV2aWNlQWRkZWQgJXNcbiIsIG5hbWUpOworCisgICAgZW52LT5DYWxsVm9pZE1ldGhvZChtQ2xpZW50LCBtZXRob2RfZGV2aWNlQWRkZWQsIGRldmljZS0+Z2V0SUQoKSk7CisKKyAgICBjaGVja0FuZENsZWFyRXhjZXB0aW9uRnJvbUNhbGxiYWNrKGVudiwgX19GVU5DVElPTl9fKTsKK30KKwordm9pZCBNeUNsaWVudDo6ZGV2aWNlUmVtb3ZlZChNdHBEZXZpY2UgKmRldmljZSkgeworICAgIEpOSUVudiogZW52ID0gQW5kcm9pZFJ1bnRpbWU6OmdldEpOSUVudigpOworICAgIGNvbnN0IGNoYXIqIG5hbWUgPSBkZXZpY2UtPmdldERldmljZU5hbWUoKTsKKyAgICBMT0dEKCJNeUNsaWVudDo6ZGV2aWNlUmVtb3ZlZCAlc1xuIiwgbmFtZSk7CisKKyAgICBlbnYtPkNhbGxWb2lkTWV0aG9kKG1DbGllbnQsIG1ldGhvZF9kZXZpY2VSZW1vdmVkLCBkZXZpY2UtPmdldElEKCkpOworCisgICAgY2hlY2tBbmRDbGVhckV4Y2VwdGlvbkZyb21DYWxsYmFjayhlbnYsIF9fRlVOQ1RJT05fXyk7Cit9CisKKyNlbmRpZiAvLyBIQVZFX0FORFJPSURfT1MKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgdm9pZAorYW5kcm9pZF9tZWRpYV9NdHBDbGllbnRfc2V0dXAoSk5JRW52ICplbnYsIGpvYmplY3QgdGhpeikKK3sKKyNpZmRlZiBIQVZFX0FORFJPSURfT1MKKyAgICBMT0dEKCJzZXR1cFxuIik7CisgICAgTXlDbGllbnQqIGNsaWVudCA9IG5ldyBNeUNsaWVudChlbnYsIHRoaXopOworICAgIGNsaWVudC0+c3RhcnQoKTsKKyAgICBlbnYtPlNldEludEZpZWxkKHRoaXosIGZpZWxkX2NvbnRleHQsIChpbnQpY2xpZW50KTsKKyNlbmRpZgorfQorCitzdGF0aWMgdm9pZAorYW5kcm9pZF9tZWRpYV9NdHBDbGllbnRfZmluYWxpemUoSk5JRW52ICplbnYsIGpvYmplY3QgdGhpeikKK3sKKyNpZmRlZiBIQVZFX0FORFJPSURfT1MKKyAgICBMT0dEKCJmaW5hbGl6ZVxuIik7CisgICAgTXlDbGllbnQgKmNsaWVudCA9IChNeUNsaWVudCAqKWVudi0+R2V0SW50RmllbGQodGhpeiwgZmllbGRfY29udGV4dCk7CisgICAgY2xpZW50LT5jbGVhbnVwKGVudik7CisgICAgZGVsZXRlIGNsaWVudDsKKyAgICBlbnYtPlNldEludEZpZWxkKHRoaXosIGZpZWxkX2NvbnRleHQsIDApOworI2VuZGlmCit9CisKK3N0YXRpYyBqYm9vbGVhbgorYW5kcm9pZF9tZWRpYV9NdHBDbGllbnRfc3RhcnQoSk5JRW52ICplbnYsIGpvYmplY3QgdGhpeikKK3sKKyNpZmRlZiBIQVZFX0FORFJPSURfT1MKKyAgICBMT0dEKCJzdGFydFxuIik7CisgICAgTXlDbGllbnQgKmNsaWVudCA9IChNeUNsaWVudCAqKWVudi0+R2V0SW50RmllbGQodGhpeiwgZmllbGRfY29udGV4dCk7CisgICAgcmV0dXJuIGNsaWVudC0+c3RhcnQoKTsKKyNlbHNlCisgICAgcmV0dXJuIGZhbHNlOworI2VuZGlmCit9CisKK3N0YXRpYyB2b2lkCithbmRyb2lkX21lZGlhX010cENsaWVudF9zdG9wKEpOSUVudiAqZW52LCBqb2JqZWN0IHRoaXopCit7CisjaWZkZWYgSEFWRV9BTkRST0lEX09TCisgICAgTE9HRCgic3RvcFxuIik7CisgICAgTXlDbGllbnQgKmNsaWVudCA9IChNeUNsaWVudCAqKWVudi0+R2V0SW50RmllbGQodGhpeiwgZmllbGRfY29udGV4dCk7CisgICAgY2xpZW50LT5zdG9wKCk7CisjZW5kaWYKK30KKworc3RhdGljIGpib29sZWFuCithbmRyb2lkX21lZGlhX010cENsaWVudF9kZWxldGVfb2JqZWN0KEpOSUVudiAqZW52LCBqb2JqZWN0IHRoaXosCisgICAgICAgIGppbnQgZGV2aWNlX2lkLCBqaW50IG9iamVjdF9pZCkKK3sKKyNpZmRlZiBIQVZFX0FORFJPSURfT1MKKyAgICBNeUNsaWVudCAqY2xpZW50ID0gKE15Q2xpZW50ICopZW52LT5HZXRJbnRGaWVsZCh0aGl6LCBmaWVsZF9jb250ZXh0KTsKKyAgICBNdHBEZXZpY2UqIGRldmljZSA9IGNsaWVudC0+Z2V0RGV2aWNlKGRldmljZV9pZCk7CisgICAgaWYgKGRldmljZSkKKyAgICAgICAgcmV0dXJuIGRldmljZS0+ZGVsZXRlT2JqZWN0KG9iamVjdF9pZCk7CisgICAgZWxzZQorICNlbmRpZgorICAgICAgICByZXR1cm4gTlVMTDsKK30KKworc3RhdGljIGppbnQKK2FuZHJvaWRfbWVkaWFfTXRwQ2xpZW50X2dldF9wYXJlbnQoSk5JRW52ICplbnYsIGpvYmplY3QgdGhpeiwKKyAgICAgICAgamludCBkZXZpY2VfaWQsIGppbnQgb2JqZWN0X2lkKQoreworI2lmZGVmIEhBVkVfQU5EUk9JRF9PUworICAgIE15Q2xpZW50ICpjbGllbnQgPSAoTXlDbGllbnQgKillbnYtPkdldEludEZpZWxkKHRoaXosIGZpZWxkX2NvbnRleHQpOworICAgIE10cERldmljZSogZGV2aWNlID0gY2xpZW50LT5nZXREZXZpY2UoZGV2aWNlX2lkKTsKKyAgICBpZiAoZGV2aWNlKQorICAgICAgICByZXR1cm4gZGV2aWNlLT5nZXRQYXJlbnQob2JqZWN0X2lkKTsKKyAgICBlbHNlCisjZW5kaWYKKyAgICAgICAgcmV0dXJuIC0xOworfQorCitzdGF0aWMgamludAorYW5kcm9pZF9tZWRpYV9NdHBDbGllbnRfZ2V0X3N0b3JhZ2VfaWQoSk5JRW52ICplbnYsIGpvYmplY3QgdGhpeiwKKyAgICAgICAgamludCBkZXZpY2VfaWQsIGppbnQgb2JqZWN0X2lkKQoreworICNpZmRlZiBIQVZFX0FORFJPSURfT1MKKyAgICBNeUNsaWVudCAqY2xpZW50ID0gKE15Q2xpZW50ICopZW52LT5HZXRJbnRGaWVsZCh0aGl6LCBmaWVsZF9jb250ZXh0KTsKKyAgICBNdHBEZXZpY2UqIGRldmljZSA9IGNsaWVudC0+Z2V0RGV2aWNlKGRldmljZV9pZCk7CisgICAgaWYgKGRldmljZSkKKyAgICAgICAgcmV0dXJuIGRldmljZS0+Z2V0U3RvcmFnZUlEKG9iamVjdF9pZCk7CisgICAgZWxzZQorI2VuZGlmCisgICAgICAgIHJldHVybiAtMTsKK30KKworc3RhdGljIGpvYmplY3QKK2FuZHJvaWRfbWVkaWFfTXRwQ2xpZW50X29wZW5fZmlsZShKTklFbnYgKmVudiwgam9iamVjdCB0aGl6LAorICAgICAgICBqaW50IGRldmljZV9pZCwgamludCBvYmplY3RfaWQpCit7CisjaWZkZWYgSEFWRV9BTkRST0lEX09TCisgICAgTXlDbGllbnQgKmNsaWVudCA9IChNeUNsaWVudCAqKWVudi0+R2V0SW50RmllbGQodGhpeiwgZmllbGRfY29udGV4dCk7CisgICAgTXRwRGV2aWNlKiBkZXZpY2UgPSBjbGllbnQtPmdldERldmljZShkZXZpY2VfaWQpOworICAgIGlmICghZGV2aWNlKQorICAgICAgICByZXR1cm4gTlVMTDsKKworICAgIE10cE9iamVjdEluZm8qIGluZm8gPSBkZXZpY2UtPmdldE9iamVjdEluZm8ob2JqZWN0X2lkKTsKKyAgICBpZiAoIWluZm8pCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGludCBvYmplY3Rfc2l6ZSA9IGluZm8tPm1Db21wcmVzc2VkU2l6ZTsKKyAgICBkZWxldGUgaW5mbzsKKyAgICBpbnQgZmQgPSBkZXZpY2UtPnJlYWRPYmplY3Qob2JqZWN0X2lkLCBvYmplY3Rfc2l6ZSk7CisgICAgaWYgKGZkIDwgMCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICBqb2JqZWN0IGZpbGVEZXNjcmlwdG9yID0gZW52LT5OZXdPYmplY3QoZ0ZpbGVEZXNjcmlwdG9yT2Zmc2V0cy5tQ2xhc3MsCisgICAgICAgIGdGaWxlRGVzY3JpcHRvck9mZnNldHMubUNvbnN0cnVjdG9yKTsKKyAgICBpZiAoZmlsZURlc2NyaXB0b3IgIT0gTlVMTCkgeworICAgICAgICBlbnYtPlNldEludEZpZWxkKGZpbGVEZXNjcmlwdG9yLCBnRmlsZURlc2NyaXB0b3JPZmZzZXRzLm1EZXNjcmlwdG9yLCBmZCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHJldHVybiBlbnYtPk5ld09iamVjdChnUGFyY2VsRmlsZURlc2NyaXB0b3JPZmZzZXRzLm1DbGFzcywKKyAgICAgICAgZ1BhcmNlbEZpbGVEZXNjcmlwdG9yT2Zmc2V0cy5tQ29uc3RydWN0b3IsIGZpbGVEZXNjcmlwdG9yKTsKKyNlbmRpZgorICAgIHJldHVybiBOVUxMOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyBKTklOYXRpdmVNZXRob2QgZ01ldGhvZHNbXSA9IHsKKyAgICB7Im5hdGl2ZV9zZXR1cCIsICAgICAgICAgICAgIigpViIsICAodm9pZCAqKWFuZHJvaWRfbWVkaWFfTXRwQ2xpZW50X3NldHVwfSwKKyAgICB7Im5hdGl2ZV9maW5hbGl6ZSIsICAgICAgICAgIigpViIsICAodm9pZCAqKWFuZHJvaWRfbWVkaWFfTXRwQ2xpZW50X2ZpbmFsaXplfSwKKyAgICB7Im5hdGl2ZV9zdGFydCIsICAgICAgICAgICAgIigpWiIsICAodm9pZCAqKWFuZHJvaWRfbWVkaWFfTXRwQ2xpZW50X3N0YXJ0fSwKKyAgICB7Im5hdGl2ZV9zdG9wIiwgICAgICAgICAgICAgIigpViIsICAodm9pZCAqKWFuZHJvaWRfbWVkaWFfTXRwQ2xpZW50X3N0b3B9LAorICAgIHsibmF0aXZlX2RlbGV0ZV9vYmplY3QiLCAgICIoSUkpWiIsICh2b2lkICopYW5kcm9pZF9tZWRpYV9NdHBDbGllbnRfZGVsZXRlX29iamVjdH0sCisgICAgeyJuYXRpdmVfZ2V0X3BhcmVudCIsICAgICAgIihJSSlJIiwgKHZvaWQgKilhbmRyb2lkX21lZGlhX010cENsaWVudF9nZXRfcGFyZW50fSwKKyAgICB7Im5hdGl2ZV9nZXRfc3RvcmFnZV9pZCIsICAiKElJKUkiLCAodm9pZCAqKWFuZHJvaWRfbWVkaWFfTXRwQ2xpZW50X2dldF9zdG9yYWdlX2lkfSwKKyAgICB7Im5hdGl2ZV9vcGVuX2ZpbGUiLCAgICAgICAiKElJKUxhbmRyb2lkL29zL1BhcmNlbEZpbGVEZXNjcmlwdG9yOyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKilhbmRyb2lkX21lZGlhX010cENsaWVudF9vcGVuX2ZpbGV9LAorfTsKKworc3RhdGljIGNvbnN0IGNoYXIqIGNvbnN0IGtDbGFzc1BhdGhOYW1lID0gImFuZHJvaWQvbWVkaWEvTXRwQ2xpZW50IjsKKworaW50IHJlZ2lzdGVyX2FuZHJvaWRfbWVkaWFfTXRwQ2xpZW50KEpOSUVudiAqZW52KQoreworICAgIGpjbGFzcyBjbGF6ejsKKworICAgIExPR0QoInJlZ2lzdGVyX2FuZHJvaWRfbWVkaWFfTXRwQ2xpZW50XG4iKTsKKworICAgIGNsYXp6ID0gZW52LT5GaW5kQ2xhc3MoImFuZHJvaWQvbWVkaWEvTXRwQ2xpZW50Iik7CisgICAgaWYgKGNsYXp6ID09IE5VTEwpIHsKKyAgICAgICAgTE9HRSgiQ2FuJ3QgZmluZCBhbmRyb2lkL21lZGlhL010cENsaWVudCIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIG1ldGhvZF9kZXZpY2VBZGRlZCA9IGVudi0+R2V0TWV0aG9kSUQoY2xhenosICJkZXZpY2VBZGRlZCIsICIoSSlWIik7CisgICAgaWYgKG1ldGhvZF9kZXZpY2VBZGRlZCA9PSBOVUxMKSB7CisgICAgICAgIExPR0UoIkNhbid0IGZpbmQgZGV2aWNlQWRkZWQiKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBtZXRob2RfZGV2aWNlUmVtb3ZlZCA9IGVudi0+R2V0TWV0aG9kSUQoY2xhenosICJkZXZpY2VSZW1vdmVkIiwgIihJKVYiKTsKKyAgICBpZiAobWV0aG9kX2RldmljZVJlbW92ZWQgPT0gTlVMTCkgeworICAgICAgICBMT0dFKCJDYW4ndCBmaW5kIGRldmljZVJlbW92ZWQiKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBmaWVsZF9jb250ZXh0ID0gZW52LT5HZXRGaWVsZElEKGNsYXp6LCAibU5hdGl2ZUNvbnRleHQiLCAiSSIpOworICAgIGlmIChmaWVsZF9jb250ZXh0ID09IE5VTEwpIHsKKyAgICAgICAgTE9HRSgiQ2FuJ3QgZmluZCBNdHBDbGllbnQubU5hdGl2ZUNvbnRleHQiKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgY2xhenogPSBlbnYtPkZpbmRDbGFzcygiamF2YS9pby9GaWxlRGVzY3JpcHRvciIpOworICAgIExPR19GQVRBTF9JRihjbGF6eiA9PSBOVUxMLCAiVW5hYmxlIHRvIGZpbmQgY2xhc3MgamF2YS5pby5GaWxlRGVzY3JpcHRvciIpOworICAgIGdGaWxlRGVzY3JpcHRvck9mZnNldHMubUNsYXNzID0gKGpjbGFzcykgZW52LT5OZXdHbG9iYWxSZWYoY2xhenopOworICAgIGdGaWxlRGVzY3JpcHRvck9mZnNldHMubUNvbnN0cnVjdG9yID0gZW52LT5HZXRNZXRob2RJRChjbGF6eiwgIjxpbml0PiIsICIoKVYiKTsKKyAgICBnRmlsZURlc2NyaXB0b3JPZmZzZXRzLm1EZXNjcmlwdG9yID0gZW52LT5HZXRGaWVsZElEKGNsYXp6LCAiZGVzY3JpcHRvciIsICJJIik7CisgICAgTE9HX0ZBVEFMX0lGKGdGaWxlRGVzY3JpcHRvck9mZnNldHMubURlc2NyaXB0b3IgPT0gTlVMTCwKKyAgICAgICAgICAgICAgICAgIlVuYWJsZSB0byBmaW5kIGRlc2NyaXB0b3IgZmllbGQgaW4gamF2YS5pby5GaWxlRGVzY3JpcHRvciIpOworCisgICBjbGF6eiA9IGVudi0+RmluZENsYXNzKCJhbmRyb2lkL29zL1BhcmNlbEZpbGVEZXNjcmlwdG9yIik7CisgICAgTE9HX0ZBVEFMX0lGKGNsYXp6ID09IE5VTEwsICJVbmFibGUgdG8gZmluZCBjbGFzcyBhbmRyb2lkLm9zLlBhcmNlbEZpbGVEZXNjcmlwdG9yIik7CisgICAgZ1BhcmNlbEZpbGVEZXNjcmlwdG9yT2Zmc2V0cy5tQ2xhc3MgPSAoamNsYXNzKSBlbnYtPk5ld0dsb2JhbFJlZihjbGF6eik7CisgICAgZ1BhcmNlbEZpbGVEZXNjcmlwdG9yT2Zmc2V0cy5tQ29uc3RydWN0b3IgPSBlbnYtPkdldE1ldGhvZElEKGNsYXp6LCAiPGluaXQ+IiwgIihMamF2YS9pby9GaWxlRGVzY3JpcHRvcjspViIpOworICAgIExPR19GQVRBTF9JRihnUGFyY2VsRmlsZURlc2NyaXB0b3JPZmZzZXRzLm1Db25zdHJ1Y3RvciA9PSBOVUxMLAorICAgICAgICAgICAgICAgICAiVW5hYmxlIHRvIGZpbmQgY29uc3RydWN0b3IgZm9yIGFuZHJvaWQub3MuUGFyY2VsRmlsZURlc2NyaXB0b3IiKTsKKworICAgIHJldHVybiBBbmRyb2lkUnVudGltZTo6cmVnaXN0ZXJOYXRpdmVNZXRob2RzKGVudiwKKyAgICAgICAgICAgICAgICAiYW5kcm9pZC9tZWRpYS9NdHBDbGllbnQiLCBnTWV0aG9kcywgTkVMRU0oZ01ldGhvZHMpKTsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2puaS9hbmRyb2lkX21lZGlhX010cEN1cnNvci5jcHAgYi9tZWRpYS9qbmkvYW5kcm9pZF9tZWRpYV9NdHBDdXJzb3IuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYyMjhiNWQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9qbmkvYW5kcm9pZF9tZWRpYV9NdHBDdXJzb3IuY3BwCkBAIC0wLDAgKzEsMTM2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJNdHBDdXJzb3JKTkkiCisjaW5jbHVkZSAidXRpbHMvTG9nLmgiCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgPGxpbWl0cy5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisKKyNpbmNsdWRlICJqbmkuaCIKKyNpbmNsdWRlICJKTklIZWxwLmgiCisjaW5jbHVkZSAiYW5kcm9pZF9ydW50aW1lL0FuZHJvaWRSdW50aW1lLmgiCisjaW5jbHVkZSAiYmluZGVyL0N1cnNvcldpbmRvdy5oIgorCisjaW5jbHVkZSAiTXRwQ2xpZW50LmgiCisjaW5jbHVkZSAiTXRwQ3Vyc29yLmgiCisKK3VzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyBqZmllbGRJRCBmaWVsZF9jb250ZXh0OworCisvLyBGcm9tIGFuZHJvaWRfbWVkaWFfTXRwQ2xpZW50LmNwcAorTXRwQ2xpZW50ICogZ2V0X2NsaWVudF9mcm9tX29iamVjdChKTklFbnYgKiBlbnYsIGpvYmplY3QgamF2YUNsaWVudCk7CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIGJvb2wgRXhjZXB0aW9uQ2hlY2sodm9pZCogZW52KQoreworICAgIHJldHVybiAoKEpOSUVudiAqKWVudiktPkV4Y2VwdGlvbkNoZWNrKCk7Cit9CisKK3N0YXRpYyB2b2lkCithbmRyb2lkX21lZGlhX010cEN1cnNvcl9zZXR1cChKTklFbnYgKmVudiwgam9iamVjdCB0aGl6LCBqb2JqZWN0IGphdmFDbGllbnQsCisgICAgICAgIGppbnQgcXVlcnlUeXBlLCBqaW50IGRldmljZUlELCBqaW50IHN0b3JhZ2VJRCwgamludCBvYmplY3RJRCwgamludEFycmF5IGphdmFDb2x1bW5zKQoreworI2lmZGVmIEhBVkVfQU5EUk9JRF9PUworICAgIExPR0QoImFuZHJvaWRfbWVkaWFfTXRwQ3Vyc29yX3NldHVwIHF1ZXJ5VHlwZTogJWQgZGV2aWNlSUQ6ICVkIHN0b3JhZ2VJRDogJWQgb2JqZWN0SUQ6ICVkXG4iLAorICAgICAgICAgICAgICAgIHF1ZXJ5VHlwZSwgZGV2aWNlSUQsIHN0b3JhZ2VJRCwgb2JqZWN0SUQpOworCisgICAgaW50KiBjb2x1bW5zID0gTlVMTDsKKyAgICBpbnQgY29sdW1uQ291bnQgPSAwOworICAgIGlmIChqYXZhQ29sdW1ucykgeworICAgICAgICBjb2x1bW5zID0gZW52LT5HZXRJbnRBcnJheUVsZW1lbnRzKGphdmFDb2x1bW5zLCAwKTsKKyAgICAgICAgY29sdW1uQ291bnQgPSBlbnYtPkdldEFycmF5TGVuZ3RoKGphdmFDb2x1bW5zKTsKKyAgICB9CisKKyAgICBNdHBDbGllbnQqIGNsaWVudCA9IGdldF9jbGllbnRfZnJvbV9vYmplY3QoZW52LCBqYXZhQ2xpZW50KTsKKyAgICBNdHBDdXJzb3IqIGN1cnNvciA9IG5ldyBNdHBDdXJzb3IoY2xpZW50LCBxdWVyeVR5cGUsCisgICAgICAgICAgICBkZXZpY2VJRCwgc3RvcmFnZUlELCBvYmplY3RJRCwgY29sdW1uQ291bnQsIGNvbHVtbnMpOworCisgICAgaWYgKGNvbHVtbnMpCisgICAgICAgIGVudi0+UmVsZWFzZUludEFycmF5RWxlbWVudHMoamF2YUNvbHVtbnMsIGNvbHVtbnMsIDApOworICAgIGVudi0+U2V0SW50RmllbGQodGhpeiwgZmllbGRfY29udGV4dCwgKGludCljdXJzb3IpOworI2VuZGlmCit9CisKK3N0YXRpYyB2b2lkCithbmRyb2lkX21lZGlhX010cEN1cnNvcl9maW5hbGl6ZShKTklFbnYgKmVudiwgam9iamVjdCB0aGl6KQoreworI2lmZGVmIEhBVkVfQU5EUk9JRF9PUworICAgIExPR0QoImZpbmFsaXplXG4iKTsKKyAgICBNdHBDdXJzb3IgKmN1cnNvciA9IChNdHBDdXJzb3IgKillbnYtPkdldEludEZpZWxkKHRoaXosIGZpZWxkX2NvbnRleHQpOworICAgIGRlbGV0ZSBjdXJzb3I7CisjZW5kaWYKK30KKworc3RhdGljIGppbnQKK2FuZHJvaWRfbWVkaWFfTXRwQ3Vyc29yX2ZpbGxfd2luZG93KEpOSUVudiAqZW52LCBqb2JqZWN0IHRoaXosIGpvYmplY3QgamF2YVdpbmRvdywgamludCBzdGFydFBvcykKK3sKKyNpZmRlZiBIQVZFX0FORFJPSURfT1MKKyAgICBDdXJzb3JXaW5kb3cqIHdpbmRvdyA9IGdldF93aW5kb3dfZnJvbV9vYmplY3QoZW52LCBqYXZhV2luZG93KTsKKyAgICBpZiAoIXdpbmRvdykgeworICAgICAgICBMT0dFKCJJbnZhbGlkIEN1cnNvcldpbmRvdyIpOworICAgICAgICBqbmlUaHJvd0V4Y2VwdGlvbihlbnYsICJqYXZhL2xhbmcvSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIkJhZCBDdXJzb3JXaW5kb3ciKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIE10cEN1cnNvciAqY3Vyc29yID0gKE10cEN1cnNvciAqKWVudi0+R2V0SW50RmllbGQodGhpeiwgZmllbGRfY29udGV4dCk7CisKKyAgICByZXR1cm4gY3Vyc29yLT5maWxsV2luZG93KHdpbmRvdywgc3RhcnRQb3MpOworI2Vsc2UKKyAgICByZXR1cm4gMDsKKyNlbmRpZgorfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyBKTklOYXRpdmVNZXRob2QgZ01ldGhvZHNbXSA9IHsKKyAgICB7Im5hdGl2ZV9zZXR1cCIsICAgICAgICAgICAgIihMYW5kcm9pZC9tZWRpYS9NdHBDbGllbnQ7SUlJSVtJKVYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopYW5kcm9pZF9tZWRpYV9NdHBDdXJzb3Jfc2V0dXB9LAorICAgIHsibmF0aXZlX2ZpbmFsaXplIiwgICAgICAgICAiKClWIiwgICh2b2lkICopYW5kcm9pZF9tZWRpYV9NdHBDdXJzb3JfZmluYWxpemV9LAorICAgIHsibmF0aXZlX2ZpbGxfd2luZG93IiwgICAgICAiKExhbmRyb2lkL2RhdGFiYXNlL0N1cnNvcldpbmRvdztJKUkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopYW5kcm9pZF9tZWRpYV9NdHBDdXJzb3JfZmlsbF93aW5kb3d9LAorCit9OworCitzdGF0aWMgY29uc3QgY2hhciogY29uc3Qga0NsYXNzUGF0aE5hbWUgPSAiYW5kcm9pZC9tZWRpYS9NdHBDdXJzb3IiOworCitpbnQgcmVnaXN0ZXJfYW5kcm9pZF9tZWRpYV9NdHBDdXJzb3IoSk5JRW52ICplbnYpCit7CisgICAgamNsYXNzIGNsYXp6OworCisgICAgTE9HRCgicmVnaXN0ZXJfYW5kcm9pZF9tZWRpYV9NdHBDdXJzb3JcbiIpOworCisgICAgY2xhenogPSBlbnYtPkZpbmRDbGFzcygiYW5kcm9pZC9tZWRpYS9NdHBDdXJzb3IiKTsKKyAgICBpZiAoY2xhenogPT0gTlVMTCkgeworICAgICAgICBMT0dFKCJDYW4ndCBmaW5kIGFuZHJvaWQvbWVkaWEvTXRwQ3Vyc29yIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgZmllbGRfY29udGV4dCA9IGVudi0+R2V0RmllbGRJRChjbGF6eiwgIm1OYXRpdmVDb250ZXh0IiwgIkkiKTsKKyAgICBpZiAoZmllbGRfY29udGV4dCA9PSBOVUxMKSB7CisgICAgICAgIExPR0UoIkNhbid0IGZpbmQgTXRwQ3Vyc29yLm1OYXRpdmVDb250ZXh0Iik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICByZXR1cm4gQW5kcm9pZFJ1bnRpbWU6OnJlZ2lzdGVyTmF0aXZlTWV0aG9kcyhlbnYsCisgICAgICAgICAgICAgICAgImFuZHJvaWQvbWVkaWEvTXRwQ3Vyc29yIiwgZ01ldGhvZHMsIE5FTEVNKGdNZXRob2RzKSk7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9qbmkvYW5kcm9pZF9tZWRpYV9NdHBEYXRhYmFzZS5jcHAgYi9tZWRpYS9qbmkvYW5kcm9pZF9tZWRpYV9NdHBEYXRhYmFzZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTg0MmNiMgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2puaS9hbmRyb2lkX21lZGlhX010cERhdGFiYXNlLmNwcApAQCAtMCwwICsxLDk1MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiTXRwRGF0YWJhc2VKTkkiCisjaW5jbHVkZSAidXRpbHMvTG9nLmgiCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgPGxpbWl0cy5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisKKyNpbmNsdWRlICJqbmkuaCIKKyNpbmNsdWRlICJKTklIZWxwLmgiCisjaW5jbHVkZSAiYW5kcm9pZF9ydW50aW1lL0FuZHJvaWRSdW50aW1lLmgiCisKKyNpbmNsdWRlICJNdHBEYXRhYmFzZS5oIgorI2luY2x1ZGUgIk10cERhdGFQYWNrZXQuaCIKKyNpbmNsdWRlICJNdHBQcm9wZXJ0eS5oIgorI2luY2x1ZGUgIk10cFN0cmluZ0J1ZmZlci5oIgorI2luY2x1ZGUgIk10cFV0aWxzLmgiCisjaW5jbHVkZSAibXRwLmgiCisKK3VzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyBqbWV0aG9kSUQgbWV0aG9kX2JlZ2luU2VuZE9iamVjdDsKK3N0YXRpYyBqbWV0aG9kSUQgbWV0aG9kX2VuZFNlbmRPYmplY3Q7CitzdGF0aWMgam1ldGhvZElEIG1ldGhvZF9nZXRPYmplY3RMaXN0Oworc3RhdGljIGptZXRob2RJRCBtZXRob2RfZ2V0TnVtT2JqZWN0czsKK3N0YXRpYyBqbWV0aG9kSUQgbWV0aG9kX2dldFN1cHBvcnRlZFBsYXliYWNrRm9ybWF0czsKK3N0YXRpYyBqbWV0aG9kSUQgbWV0aG9kX2dldFN1cHBvcnRlZENhcHR1cmVGb3JtYXRzOworc3RhdGljIGptZXRob2RJRCBtZXRob2RfZ2V0U3VwcG9ydGVkT2JqZWN0UHJvcGVydGllczsKK3N0YXRpYyBqbWV0aG9kSUQgbWV0aG9kX2dldFN1cHBvcnRlZERldmljZVByb3BlcnRpZXM7CitzdGF0aWMgam1ldGhvZElEIG1ldGhvZF9nZXRPYmplY3RQcm9wZXJ0eTsKK3N0YXRpYyBqbWV0aG9kSUQgbWV0aG9kX3NldE9iamVjdFByb3BlcnR5Oworc3RhdGljIGptZXRob2RJRCBtZXRob2RfZ2V0RGV2aWNlUHJvcGVydHk7CitzdGF0aWMgam1ldGhvZElEIG1ldGhvZF9zZXREZXZpY2VQcm9wZXJ0eTsKK3N0YXRpYyBqbWV0aG9kSUQgbWV0aG9kX2dldE9iamVjdEluZm87CitzdGF0aWMgam1ldGhvZElEIG1ldGhvZF9nZXRPYmplY3RGaWxlUGF0aDsKK3N0YXRpYyBqbWV0aG9kSUQgbWV0aG9kX2RlbGV0ZUZpbGU7CitzdGF0aWMgam1ldGhvZElEIG1ldGhvZF9nZXRPYmplY3RSZWZlcmVuY2VzOworc3RhdGljIGptZXRob2RJRCBtZXRob2Rfc2V0T2JqZWN0UmVmZXJlbmNlczsKK3N0YXRpYyBqbWV0aG9kSUQgbWV0aG9kX3Nlc3Npb25TdGFydGVkOworc3RhdGljIGptZXRob2RJRCBtZXRob2Rfc2Vzc2lvbkVuZGVkOworCitzdGF0aWMgamZpZWxkSUQgZmllbGRfY29udGV4dDsKKworTXRwRGF0YWJhc2UqIGdldE10cERhdGFiYXNlKEpOSUVudiAqZW52LCBqb2JqZWN0IGRhdGFiYXNlKSB7CisgICAgcmV0dXJuIChNdHBEYXRhYmFzZSAqKWVudi0+R2V0SW50RmllbGQoZGF0YWJhc2UsIGZpZWxkX2NvbnRleHQpOworfQorCisjaWZkZWYgSEFWRV9BTkRST0lEX09TCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2NsYXNzIE15TXRwRGF0YWJhc2UgOiBwdWJsaWMgTXRwRGF0YWJhc2UgeworcHJpdmF0ZToKKyAgICBqb2JqZWN0ICAgICAgICAgbURhdGFiYXNlOworICAgIGppbnRBcnJheSAgICAgICBtSW50QnVmZmVyOworICAgIGpsb25nQXJyYXkgICAgICBtTG9uZ0J1ZmZlcjsKKyAgICBqY2hhckFycmF5ICAgICAgbVN0cmluZ0J1ZmZlcjsKKworcHVibGljOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXlNdHBEYXRhYmFzZShKTklFbnYgKmVudiwgam9iamVjdCBjbGllbnQpOworICAgIHZpcnR1YWwgICAgICAgICAgICAgICAgICAgICAgICAgfk15TXRwRGF0YWJhc2UoKTsKKyAgICB2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsZWFudXAoSk5JRW52ICplbnYpOworCisgICAgdmlydHVhbCBNdHBPYmplY3RIYW5kbGUgICAgICAgICBiZWdpblNlbmRPYmplY3QoY29uc3QgY2hhciogcGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXRwT2JqZWN0Rm9ybWF0IGZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXRwT2JqZWN0SGFuZGxlIHBhcmVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXRwU3RvcmFnZUlEIHN0b3JhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVfdCBtb2RpZmllZCk7CisKKyAgICB2aXJ0dWFsIHZvaWQgICAgICAgICAgICAgICAgICAgIGVuZFNlbmRPYmplY3QoY29uc3QgY2hhciogcGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXRwT2JqZWN0SGFuZGxlIGhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXRwT2JqZWN0Rm9ybWF0IGZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBzdWNjZWVkZWQpOworCisgICAgdmlydHVhbCBNdHBPYmplY3RIYW5kbGVMaXN0KiAgICBnZXRPYmplY3RMaXN0KE10cFN0b3JhZ2VJRCBzdG9yYWdlSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdHBPYmplY3RGb3JtYXQgZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXRwT2JqZWN0SGFuZGxlIHBhcmVudCk7CisKKyAgICB2aXJ0dWFsIGludCAgICAgICAgICAgICAgICAgICAgIGdldE51bU9iamVjdHMoTXRwU3RvcmFnZUlEIHN0b3JhZ2VJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXRwT2JqZWN0Rm9ybWF0IGZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXRwT2JqZWN0SGFuZGxlIHBhcmVudCk7CisKKyAgICAvLyBjYWxsZWUgc2hvdWxkIGRlbGV0ZVtdIHRoZSByZXN1bHRzIGZyb20gdGhlc2UKKyAgICAvLyByZXN1bHRzIGNhbiBiZSBOVUxMCisgICAgdmlydHVhbCBNdHBPYmplY3RGb3JtYXRMaXN0KiAgICBnZXRTdXBwb3J0ZWRQbGF5YmFja0Zvcm1hdHMoKTsKKyAgICB2aXJ0dWFsIE10cE9iamVjdEZvcm1hdExpc3QqICAgIGdldFN1cHBvcnRlZENhcHR1cmVGb3JtYXRzKCk7CisgICAgdmlydHVhbCBNdHBPYmplY3RQcm9wZXJ0eUxpc3QqICBnZXRTdXBwb3J0ZWRPYmplY3RQcm9wZXJ0aWVzKE10cE9iamVjdEZvcm1hdCBmb3JtYXQpOworICAgIHZpcnR1YWwgTXRwRGV2aWNlUHJvcGVydHlMaXN0KiAgZ2V0U3VwcG9ydGVkRGV2aWNlUHJvcGVydGllcygpOworCisgICAgdmlydHVhbCBNdHBSZXNwb25zZUNvZGUgICAgICAgICBnZXRPYmplY3RQcm9wZXJ0eVZhbHVlKE10cE9iamVjdEhhbmRsZSBoYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE10cE9iamVjdFByb3BlcnR5IHByb3BlcnR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdHBEYXRhUGFja2V0JiBwYWNrZXQpOworCisgICAgdmlydHVhbCBNdHBSZXNwb25zZUNvZGUgICAgICAgICBzZXRPYmplY3RQcm9wZXJ0eVZhbHVlKE10cE9iamVjdEhhbmRsZSBoYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE10cE9iamVjdFByb3BlcnR5IHByb3BlcnR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdHBEYXRhUGFja2V0JiBwYWNrZXQpOworCisgICAgdmlydHVhbCBNdHBSZXNwb25zZUNvZGUgICAgICAgICBnZXREZXZpY2VQcm9wZXJ0eVZhbHVlKE10cERldmljZVByb3BlcnR5IHByb3BlcnR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdHBEYXRhUGFja2V0JiBwYWNrZXQpOworCisgICAgdmlydHVhbCBNdHBSZXNwb25zZUNvZGUgICAgICAgICBzZXREZXZpY2VQcm9wZXJ0eVZhbHVlKE10cERldmljZVByb3BlcnR5IHByb3BlcnR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdHBEYXRhUGFja2V0JiBwYWNrZXQpOworCisgICAgdmlydHVhbCBNdHBSZXNwb25zZUNvZGUgICAgICAgICByZXNldERldmljZVByb3BlcnR5KE10cERldmljZVByb3BlcnR5IHByb3BlcnR5KTsKKworICAgIHZpcnR1YWwgTXRwUmVzcG9uc2VDb2RlICAgICAgICAgZ2V0T2JqZWN0SW5mbyhNdHBPYmplY3RIYW5kbGUgaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdHBEYXRhUGFja2V0JiBwYWNrZXQpOworCisgICAgdmlydHVhbCBNdHBSZXNwb25zZUNvZGUgICAgICAgICBnZXRPYmplY3RGaWxlUGF0aChNdHBPYmplY3RIYW5kbGUgaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdHBTdHJpbmcmIGZpbGVQYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90JiBmaWxlTGVuZ3RoKTsKKyAgICB2aXJ0dWFsIE10cFJlc3BvbnNlQ29kZSAgICAgICAgIGRlbGV0ZUZpbGUoTXRwT2JqZWN0SGFuZGxlIGhhbmRsZSk7CisKKyAgICBib29sICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldE9iamVjdFByb3BlcnR5SW5mbyhNdHBPYmplY3RQcm9wZXJ0eSBwcm9wZXJ0eSwgaW50JiB0eXBlKTsKKyAgICBib29sICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldERldmljZVByb3BlcnR5SW5mbyhNdHBEZXZpY2VQcm9wZXJ0eSBwcm9wZXJ0eSwgaW50JiB0eXBlKTsKKworICAgIHZpcnR1YWwgTXRwT2JqZWN0SGFuZGxlTGlzdCogICAgZ2V0T2JqZWN0UmVmZXJlbmNlcyhNdHBPYmplY3RIYW5kbGUgaGFuZGxlKTsKKworICAgIHZpcnR1YWwgTXRwUmVzcG9uc2VDb2RlICAgICAgICAgc2V0T2JqZWN0UmVmZXJlbmNlcyhNdHBPYmplY3RIYW5kbGUgaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdHBPYmplY3RIYW5kbGVMaXN0KiByZWZlcmVuY2VzKTsKKworICAgIHZpcnR1YWwgTXRwUHJvcGVydHkqICAgICAgICAgICAgZ2V0T2JqZWN0UHJvcGVydHlEZXNjKE10cE9iamVjdFByb3BlcnR5IHByb3BlcnR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdHBPYmplY3RGb3JtYXQgZm9ybWF0KTsKKworICAgIHZpcnR1YWwgTXRwUHJvcGVydHkqICAgICAgICAgICAgZ2V0RGV2aWNlUHJvcGVydHlEZXNjKE10cERldmljZVByb3BlcnR5IHByb3BlcnR5KTsKKworICAgIHZpcnR1YWwgdm9pZCAgICAgICAgICAgICAgICAgICAgc2Vzc2lvblN0YXJ0ZWQoKTsKKworICAgIHZpcnR1YWwgdm9pZCAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbkVuZGVkKCk7Cit9OworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyB2b2lkIGNoZWNrQW5kQ2xlYXJFeGNlcHRpb25Gcm9tQ2FsbGJhY2soSk5JRW52KiBlbnYsIGNvbnN0IGNoYXIqIG1ldGhvZE5hbWUpIHsKKyAgICBpZiAoZW52LT5FeGNlcHRpb25DaGVjaygpKSB7CisgICAgICAgIExPR0UoIkFuIGV4Y2VwdGlvbiB3YXMgdGhyb3duIGJ5IGNhbGxiYWNrICclcycuIiwgbWV0aG9kTmFtZSk7CisgICAgICAgIExPR0VfRVgoZW52KTsKKyAgICAgICAgZW52LT5FeGNlcHRpb25DbGVhcigpOworICAgIH0KK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitNeU10cERhdGFiYXNlOjpNeU10cERhdGFiYXNlKEpOSUVudiAqZW52LCBqb2JqZWN0IGNsaWVudCkKKyAgICA6ICAgbURhdGFiYXNlKGVudi0+TmV3R2xvYmFsUmVmKGNsaWVudCkpLAorICAgICAgICBtSW50QnVmZmVyKE5VTEwpLAorICAgICAgICBtTG9uZ0J1ZmZlcihOVUxMKSwKKyAgICAgICAgbVN0cmluZ0J1ZmZlcihOVUxMKQoreworICAgIGppbnRBcnJheSBpbnRBcnJheTsKKyAgICBqbG9uZ0FycmF5IGxvbmdBcnJheTsKKyAgICBqY2hhckFycmF5IGNoYXJBcnJheTsKKworICAgIC8vIGNyZWF0ZSBidWZmZXJzIGZvciBvdXQgYXJndW1lbnRzCisgICAgLy8gd2UgZG9uJ3QgbmVlZCB0byBiZSB0aHJlYWQtc2FmZSBzbyB0aGlzIGlzIE9LCisgICAgaW50QXJyYXkgPSBlbnYtPk5ld0ludEFycmF5KDMpOworICAgIGlmICghaW50QXJyYXkpCisgICAgICAgIGdvdG8gb3V0X29mX21lbW9yeTsKKyAgICBtSW50QnVmZmVyID0gKGppbnRBcnJheSllbnYtPk5ld0dsb2JhbFJlZihpbnRBcnJheSk7CisgICAgbG9uZ0FycmF5ID0gZW52LT5OZXdMb25nQXJyYXkoMik7CisgICAgaWYgKCFsb25nQXJyYXkpCisgICAgICAgIGdvdG8gb3V0X29mX21lbW9yeTsKKyAgICBtTG9uZ0J1ZmZlciA9IChqbG9uZ0FycmF5KWVudi0+TmV3R2xvYmFsUmVmKGxvbmdBcnJheSk7CisgICAgY2hhckFycmF5ID0gZW52LT5OZXdDaGFyQXJyYXkoMjU2KTsKKyAgICBpZiAoIWNoYXJBcnJheSkKKyAgICAgICAgZ290byBvdXRfb2ZfbWVtb3J5OworICAgIG1TdHJpbmdCdWZmZXIgPSAoamNoYXJBcnJheSllbnYtPk5ld0dsb2JhbFJlZihjaGFyQXJyYXkpOworICAgIHJldHVybjsKKworb3V0X29mX21lbW9yeToKKyAgICBlbnYtPlRocm93TmV3KGVudi0+RmluZENsYXNzKCJqYXZhL2xhbmcvT3V0T2ZNZW1vcnlFcnJvciIpLCBOVUxMKTsKK30KKwordm9pZCBNeU10cERhdGFiYXNlOjpjbGVhbnVwKEpOSUVudiAqZW52KSB7CisgICAgZW52LT5EZWxldGVHbG9iYWxSZWYobURhdGFiYXNlKTsKKyAgICBlbnYtPkRlbGV0ZUdsb2JhbFJlZihtSW50QnVmZmVyKTsKKyAgICBlbnYtPkRlbGV0ZUdsb2JhbFJlZihtTG9uZ0J1ZmZlcik7CisgICAgZW52LT5EZWxldGVHbG9iYWxSZWYobVN0cmluZ0J1ZmZlcik7Cit9CisKK015TXRwRGF0YWJhc2U6On5NeU10cERhdGFiYXNlKCkgeworfQorCitNdHBPYmplY3RIYW5kbGUgTXlNdHBEYXRhYmFzZTo6YmVnaW5TZW5kT2JqZWN0KGNvbnN0IGNoYXIqIHBhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE10cE9iamVjdEZvcm1hdCBmb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE10cE9iamVjdEhhbmRsZSBwYXJlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE10cFN0b3JhZ2VJRCBzdG9yYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCBzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lX3QgbW9kaWZpZWQpIHsKKyAgICBKTklFbnYqIGVudiA9IEFuZHJvaWRSdW50aW1lOjpnZXRKTklFbnYoKTsKKyAgICBNdHBPYmplY3RIYW5kbGUgcmVzdWx0ID0gZW52LT5DYWxsSW50TWV0aG9kKG1EYXRhYmFzZSwgbWV0aG9kX2JlZ2luU2VuZE9iamVjdCwKKyAgICAgICAgICAgIGVudi0+TmV3U3RyaW5nVVRGKHBhdGgpLCAoamludClmb3JtYXQsIChqaW50KXBhcmVudCwgKGppbnQpc3RvcmFnZSwKKyAgICAgICAgICAgIChqbG9uZylzaXplLCAoamxvbmcpbW9kaWZpZWQpOworCisgICAgY2hlY2tBbmRDbGVhckV4Y2VwdGlvbkZyb21DYWxsYmFjayhlbnYsIF9fRlVOQ1RJT05fXyk7CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKwordm9pZCBNeU10cERhdGFiYXNlOjplbmRTZW5kT2JqZWN0KGNvbnN0IGNoYXIqIHBhdGgsIE10cE9iamVjdEhhbmRsZSBoYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE10cE9iamVjdEZvcm1hdCBmb3JtYXQsIGJvb2wgc3VjY2VlZGVkKSB7CisgICAgSk5JRW52KiBlbnYgPSBBbmRyb2lkUnVudGltZTo6Z2V0Sk5JRW52KCk7CisgICAgZW52LT5DYWxsVm9pZE1ldGhvZChtRGF0YWJhc2UsIG1ldGhvZF9lbmRTZW5kT2JqZWN0LCBlbnYtPk5ld1N0cmluZ1VURihwYXRoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIChqaW50KWhhbmRsZSwgKGppbnQpZm9ybWF0LCAoamJvb2xlYW4pc3VjY2VlZGVkKTsKKworICAgIGNoZWNrQW5kQ2xlYXJFeGNlcHRpb25Gcm9tQ2FsbGJhY2soZW52LCBfX0ZVTkNUSU9OX18pOworfQorCitNdHBPYmplY3RIYW5kbGVMaXN0KiBNeU10cERhdGFiYXNlOjpnZXRPYmplY3RMaXN0KE10cFN0b3JhZ2VJRCBzdG9yYWdlSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdHBPYmplY3RGb3JtYXQgZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXRwT2JqZWN0SGFuZGxlIHBhcmVudCkgeworICAgIEpOSUVudiogZW52ID0gQW5kcm9pZFJ1bnRpbWU6OmdldEpOSUVudigpOworICAgIGppbnRBcnJheSBhcnJheSA9IChqaW50QXJyYXkpZW52LT5DYWxsT2JqZWN0TWV0aG9kKG1EYXRhYmFzZSwgbWV0aG9kX2dldE9iamVjdExpc3QsCisgICAgICAgICAgICAgICAgKGppbnQpc3RvcmFnZUlELCAoamludClmb3JtYXQsIChqaW50KXBhcmVudCk7CisgICAgaWYgKCFhcnJheSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgTXRwT2JqZWN0SGFuZGxlTGlzdCogbGlzdCA9IG5ldyBNdHBPYmplY3RIYW5kbGVMaXN0KCk7CisgICAgamludCogaGFuZGxlcyA9IGVudi0+R2V0SW50QXJyYXlFbGVtZW50cyhhcnJheSwgMCk7CisgICAganNpemUgbGVuZ3RoID0gZW52LT5HZXRBcnJheUxlbmd0aChhcnJheSk7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykKKyAgICAgICAgbGlzdC0+cHVzaChoYW5kbGVzW2ldKTsKKyAgICBlbnYtPlJlbGVhc2VJbnRBcnJheUVsZW1lbnRzKGFycmF5LCBoYW5kbGVzLCAwKTsKKworICAgIGNoZWNrQW5kQ2xlYXJFeGNlcHRpb25Gcm9tQ2FsbGJhY2soZW52LCBfX0ZVTkNUSU9OX18pOworICAgIHJldHVybiBsaXN0OworfQorCitpbnQgTXlNdHBEYXRhYmFzZTo6Z2V0TnVtT2JqZWN0cyhNdHBTdG9yYWdlSUQgc3RvcmFnZUlELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdHBPYmplY3RGb3JtYXQgZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdHBPYmplY3RIYW5kbGUgcGFyZW50KSB7CisgICAgSk5JRW52KiBlbnYgPSBBbmRyb2lkUnVudGltZTo6Z2V0Sk5JRW52KCk7CisgICAgaW50IHJlc3VsdCA9IGVudi0+Q2FsbEludE1ldGhvZChtRGF0YWJhc2UsIG1ldGhvZF9nZXROdW1PYmplY3RzLAorICAgICAgICAgICAgICAgIChqaW50KXN0b3JhZ2VJRCwgKGppbnQpZm9ybWF0LCAoamludClwYXJlbnQpOworCisgICAgY2hlY2tBbmRDbGVhckV4Y2VwdGlvbkZyb21DYWxsYmFjayhlbnYsIF9fRlVOQ1RJT05fXyk7CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworTXRwT2JqZWN0Rm9ybWF0TGlzdCogTXlNdHBEYXRhYmFzZTo6Z2V0U3VwcG9ydGVkUGxheWJhY2tGb3JtYXRzKCkgeworICAgIEpOSUVudiogZW52ID0gQW5kcm9pZFJ1bnRpbWU6OmdldEpOSUVudigpOworICAgIGppbnRBcnJheSBhcnJheSA9IChqaW50QXJyYXkpZW52LT5DYWxsT2JqZWN0TWV0aG9kKG1EYXRhYmFzZSwKKyAgICAgICAgICAgIG1ldGhvZF9nZXRTdXBwb3J0ZWRQbGF5YmFja0Zvcm1hdHMpOworICAgIGlmICghYXJyYXkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIE10cE9iamVjdEZvcm1hdExpc3QqIGxpc3QgPSBuZXcgTXRwT2JqZWN0Rm9ybWF0TGlzdCgpOworICAgIGppbnQqIGZvcm1hdHMgPSBlbnYtPkdldEludEFycmF5RWxlbWVudHMoYXJyYXksIDApOworICAgIGpzaXplIGxlbmd0aCA9IGVudi0+R2V0QXJyYXlMZW5ndGgoYXJyYXkpOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspCisgICAgICAgIGxpc3QtPnB1c2goZm9ybWF0c1tpXSk7CisgICAgZW52LT5SZWxlYXNlSW50QXJyYXlFbGVtZW50cyhhcnJheSwgZm9ybWF0cywgMCk7CisKKyAgICBjaGVja0FuZENsZWFyRXhjZXB0aW9uRnJvbUNhbGxiYWNrKGVudiwgX19GVU5DVElPTl9fKTsKKyAgICByZXR1cm4gbGlzdDsKK30KKworTXRwT2JqZWN0Rm9ybWF0TGlzdCogTXlNdHBEYXRhYmFzZTo6Z2V0U3VwcG9ydGVkQ2FwdHVyZUZvcm1hdHMoKSB7CisgICAgSk5JRW52KiBlbnYgPSBBbmRyb2lkUnVudGltZTo6Z2V0Sk5JRW52KCk7CisgICAgamludEFycmF5IGFycmF5ID0gKGppbnRBcnJheSllbnYtPkNhbGxPYmplY3RNZXRob2QobURhdGFiYXNlLAorICAgICAgICAgICAgbWV0aG9kX2dldFN1cHBvcnRlZENhcHR1cmVGb3JtYXRzKTsKKyAgICBpZiAoIWFycmF5KQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBNdHBPYmplY3RGb3JtYXRMaXN0KiBsaXN0ID0gbmV3IE10cE9iamVjdEZvcm1hdExpc3QoKTsKKyAgICBqaW50KiBmb3JtYXRzID0gZW52LT5HZXRJbnRBcnJheUVsZW1lbnRzKGFycmF5LCAwKTsKKyAgICBqc2l6ZSBsZW5ndGggPSBlbnYtPkdldEFycmF5TGVuZ3RoKGFycmF5KTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKQorICAgICAgICBsaXN0LT5wdXNoKGZvcm1hdHNbaV0pOworICAgIGVudi0+UmVsZWFzZUludEFycmF5RWxlbWVudHMoYXJyYXksIGZvcm1hdHMsIDApOworCisgICAgY2hlY2tBbmRDbGVhckV4Y2VwdGlvbkZyb21DYWxsYmFjayhlbnYsIF9fRlVOQ1RJT05fXyk7CisgICAgcmV0dXJuIGxpc3Q7Cit9CisKK010cE9iamVjdFByb3BlcnR5TGlzdCogTXlNdHBEYXRhYmFzZTo6Z2V0U3VwcG9ydGVkT2JqZWN0UHJvcGVydGllcyhNdHBPYmplY3RGb3JtYXQgZm9ybWF0KSB7CisgICAgSk5JRW52KiBlbnYgPSBBbmRyb2lkUnVudGltZTo6Z2V0Sk5JRW52KCk7CisgICAgamludEFycmF5IGFycmF5ID0gKGppbnRBcnJheSllbnYtPkNhbGxPYmplY3RNZXRob2QobURhdGFiYXNlLAorICAgICAgICAgICAgbWV0aG9kX2dldFN1cHBvcnRlZE9iamVjdFByb3BlcnRpZXMsIChqaW50KWZvcm1hdCk7CisgICAgaWYgKCFhcnJheSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgTXRwT2JqZWN0UHJvcGVydHlMaXN0KiBsaXN0ID0gbmV3IE10cE9iamVjdFByb3BlcnR5TGlzdCgpOworICAgIGppbnQqIHByb3BlcnRpZXMgPSBlbnYtPkdldEludEFycmF5RWxlbWVudHMoYXJyYXksIDApOworICAgIGpzaXplIGxlbmd0aCA9IGVudi0+R2V0QXJyYXlMZW5ndGgoYXJyYXkpOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspCisgICAgICAgIGxpc3QtPnB1c2gocHJvcGVydGllc1tpXSk7CisgICAgZW52LT5SZWxlYXNlSW50QXJyYXlFbGVtZW50cyhhcnJheSwgcHJvcGVydGllcywgMCk7CisKKyAgICBjaGVja0FuZENsZWFyRXhjZXB0aW9uRnJvbUNhbGxiYWNrKGVudiwgX19GVU5DVElPTl9fKTsKKyAgICByZXR1cm4gbGlzdDsKK30KKworTXRwRGV2aWNlUHJvcGVydHlMaXN0KiBNeU10cERhdGFiYXNlOjpnZXRTdXBwb3J0ZWREZXZpY2VQcm9wZXJ0aWVzKCkgeworICAgIEpOSUVudiogZW52ID0gQW5kcm9pZFJ1bnRpbWU6OmdldEpOSUVudigpOworICAgIGppbnRBcnJheSBhcnJheSA9IChqaW50QXJyYXkpZW52LT5DYWxsT2JqZWN0TWV0aG9kKG1EYXRhYmFzZSwKKyAgICAgICAgICAgIG1ldGhvZF9nZXRTdXBwb3J0ZWREZXZpY2VQcm9wZXJ0aWVzKTsKKyAgICBpZiAoIWFycmF5KQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBNdHBEZXZpY2VQcm9wZXJ0eUxpc3QqIGxpc3QgPSBuZXcgTXRwRGV2aWNlUHJvcGVydHlMaXN0KCk7CisgICAgamludCogcHJvcGVydGllcyA9IGVudi0+R2V0SW50QXJyYXlFbGVtZW50cyhhcnJheSwgMCk7CisgICAganNpemUgbGVuZ3RoID0gZW52LT5HZXRBcnJheUxlbmd0aChhcnJheSk7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykKKyAgICAgICAgbGlzdC0+cHVzaChwcm9wZXJ0aWVzW2ldKTsKKyAgICBlbnYtPlJlbGVhc2VJbnRBcnJheUVsZW1lbnRzKGFycmF5LCBwcm9wZXJ0aWVzLCAwKTsKKworICAgIGNoZWNrQW5kQ2xlYXJFeGNlcHRpb25Gcm9tQ2FsbGJhY2soZW52LCBfX0ZVTkNUSU9OX18pOworICAgIHJldHVybiBsaXN0OworfQorCitNdHBSZXNwb25zZUNvZGUgTXlNdHBEYXRhYmFzZTo6Z2V0T2JqZWN0UHJvcGVydHlWYWx1ZShNdHBPYmplY3RIYW5kbGUgaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdHBPYmplY3RQcm9wZXJ0eSBwcm9wZXJ0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXRwRGF0YVBhY2tldCYgcGFja2V0KSB7CisgICAgaW50ICAgICAgICAgdHlwZTsKKworICAgIGlmICghZ2V0T2JqZWN0UHJvcGVydHlJbmZvKHByb3BlcnR5LCB0eXBlKSkKKyAgICAgICAgcmV0dXJuIE1UUF9SRVNQT05TRV9PQkpFQ1RfUFJPUF9OT1RfU1VQUE9SVEVEOworCisgICAgSk5JRW52KiBlbnYgPSBBbmRyb2lkUnVudGltZTo6Z2V0Sk5JRW52KCk7CisgICAgamludCByZXN1bHQgPSBlbnYtPkNhbGxJbnRNZXRob2QobURhdGFiYXNlLCBtZXRob2RfZ2V0T2JqZWN0UHJvcGVydHksCisgICAgICAgICAgICAgICAgKGppbnQpaGFuZGxlLCAoamludClwcm9wZXJ0eSwgbUxvbmdCdWZmZXIsIG1TdHJpbmdCdWZmZXIpOworICAgIGlmIChyZXN1bHQgIT0gTVRQX1JFU1BPTlNFX09LKSB7CisgICAgICAgIGNoZWNrQW5kQ2xlYXJFeGNlcHRpb25Gcm9tQ2FsbGJhY2soZW52LCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIGpsb25nKiBsb25nVmFsdWVzID0gZW52LT5HZXRMb25nQXJyYXlFbGVtZW50cyhtTG9uZ0J1ZmZlciwgMCk7CisgICAgamxvbmcgbG9uZ1ZhbHVlID0gbG9uZ1ZhbHVlc1swXTsKKyAgICBlbnYtPlJlbGVhc2VMb25nQXJyYXlFbGVtZW50cyhtTG9uZ0J1ZmZlciwgbG9uZ1ZhbHVlcywgMCk7CisKKyAgICAvLyBzcGVjaWFsIGNhc2UgTVRQX1BST1BFUlRZX0RBVEVfTU9ESUZJRUQsIHdoaWNoIGlzIGEgc3RyaW5nIHRvIE1UUAorICAgIC8vIGJ1dCBzdG9yZWQgaW50ZXJuYWxseSBhcyBhIHVpbnQ2NAorICAgIGlmIChwcm9wZXJ0eSA9PSBNVFBfUFJPUEVSVFlfREFURV9NT0RJRklFRCkgeworICAgICAgICBjaGFyICAgIGRhdGVbMjBdOworICAgICAgICBmb3JtYXREYXRlVGltZShsb25nVmFsdWUsIGRhdGUsIHNpemVvZihkYXRlKSk7CisgICAgICAgIHBhY2tldC5wdXRTdHJpbmcoZGF0ZSk7CisgICAgICAgIHJldHVybiBNVFBfUkVTUE9OU0VfT0s7CisgICAgfQorCisgICAgc3dpdGNoICh0eXBlKSB7CisgICAgICAgIGNhc2UgTVRQX1RZUEVfSU5UODoKKyAgICAgICAgICAgIHBhY2tldC5wdXRJbnQ4KGxvbmdWYWx1ZSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBNVFBfVFlQRV9VSU5UODoKKyAgICAgICAgICAgIHBhY2tldC5wdXRVSW50OChsb25nVmFsdWUpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTVRQX1RZUEVfSU5UMTY6CisgICAgICAgICAgICBwYWNrZXQucHV0SW50MTYobG9uZ1ZhbHVlKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE1UUF9UWVBFX1VJTlQxNjoKKyAgICAgICAgICAgIHBhY2tldC5wdXRVSW50MTYobG9uZ1ZhbHVlKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE1UUF9UWVBFX0lOVDMyOgorICAgICAgICAgICAgcGFja2V0LnB1dEludDMyKGxvbmdWYWx1ZSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBNVFBfVFlQRV9VSU5UMzI6CisgICAgICAgICAgICBwYWNrZXQucHV0VUludDMyKGxvbmdWYWx1ZSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBNVFBfVFlQRV9JTlQ2NDoKKyAgICAgICAgICAgIHBhY2tldC5wdXRJbnQ2NChsb25nVmFsdWUpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTVRQX1RZUEVfVUlOVDY0OgorICAgICAgICAgICAgcGFja2V0LnB1dFVJbnQ2NChsb25nVmFsdWUpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTVRQX1RZUEVfSU5UMTI4OgorICAgICAgICAgICAgcGFja2V0LnB1dEludDEyOChsb25nVmFsdWUpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTVRQX1RZUEVfVUlOVDEyODoKKyAgICAgICAgICAgIHBhY2tldC5wdXRJbnQxMjgobG9uZ1ZhbHVlKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE1UUF9UWVBFX1NUUjoKKyAgICAgICAgeworICAgICAgICAgICAgamNoYXIqIHN0ciA9IGVudi0+R2V0Q2hhckFycmF5RWxlbWVudHMobVN0cmluZ0J1ZmZlciwgMCk7CisgICAgICAgICAgICBwYWNrZXQucHV0U3RyaW5nKHN0cik7CisgICAgICAgICAgICBlbnYtPlJlbGVhc2VDaGFyQXJyYXlFbGVtZW50cyhtU3RyaW5nQnVmZmVyLCBzdHIsIDApOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICB9CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBMT0dFKCJ1bnN1cHBvcnRlZCB0eXBlIGluIGdldE9iamVjdFByb3BlcnR5VmFsdWVcbiIpOworICAgICAgICAgICAgcmV0dXJuIE1UUF9SRVNQT05TRV9JTlZBTElEX09CSkVDVF9QUk9QX0ZPUk1BVDsKKyAgICB9CisKKyAgICBjaGVja0FuZENsZWFyRXhjZXB0aW9uRnJvbUNhbGxiYWNrKGVudiwgX19GVU5DVElPTl9fKTsKKyAgICByZXR1cm4gTVRQX1JFU1BPTlNFX09LOworfQorCitNdHBSZXNwb25zZUNvZGUgTXlNdHBEYXRhYmFzZTo6c2V0T2JqZWN0UHJvcGVydHlWYWx1ZShNdHBPYmplY3RIYW5kbGUgaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdHBPYmplY3RQcm9wZXJ0eSBwcm9wZXJ0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXRwRGF0YVBhY2tldCYgcGFja2V0KSB7CisgICAgaW50ICAgICAgICAgdHlwZTsKKworICAgIGlmICghZ2V0T2JqZWN0UHJvcGVydHlJbmZvKHByb3BlcnR5LCB0eXBlKSkKKyAgICAgICAgcmV0dXJuIE1UUF9SRVNQT05TRV9PQkpFQ1RfUFJPUF9OT1RfU1VQUE9SVEVEOworCisgICAgSk5JRW52KiBlbnYgPSBBbmRyb2lkUnVudGltZTo6Z2V0Sk5JRW52KCk7CisgICAgamxvbmcgbG9uZ1ZhbHVlID0gMDsKKyAgICBqc3RyaW5nIHN0cmluZ1ZhbHVlID0gTlVMTDsKKworICAgIHN3aXRjaCAodHlwZSkgeworICAgICAgICBjYXNlIE1UUF9UWVBFX0lOVDg6CisgICAgICAgICAgICBsb25nVmFsdWUgPSBwYWNrZXQuZ2V0SW50OCgpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTVRQX1RZUEVfVUlOVDg6CisgICAgICAgICAgICBsb25nVmFsdWUgPSBwYWNrZXQuZ2V0VUludDgoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE1UUF9UWVBFX0lOVDE2OgorICAgICAgICAgICAgbG9uZ1ZhbHVlID0gcGFja2V0LmdldEludDE2KCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBNVFBfVFlQRV9VSU5UMTY6CisgICAgICAgICAgICBsb25nVmFsdWUgPSBwYWNrZXQuZ2V0VUludDE2KCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBNVFBfVFlQRV9JTlQzMjoKKyAgICAgICAgICAgIGxvbmdWYWx1ZSA9IHBhY2tldC5nZXRJbnQzMigpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTVRQX1RZUEVfVUlOVDMyOgorICAgICAgICAgICAgbG9uZ1ZhbHVlID0gcGFja2V0LmdldFVJbnQzMigpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTVRQX1RZUEVfSU5UNjQ6CisgICAgICAgICAgICBsb25nVmFsdWUgPSBwYWNrZXQuZ2V0SW50NjQoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE1UUF9UWVBFX1VJTlQ2NDoKKyAgICAgICAgICAgIGxvbmdWYWx1ZSA9IHBhY2tldC5nZXRVSW50NjQoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE1UUF9UWVBFX1NUUjoKKyAgICAgICAgeworICAgICAgICAgICAgTXRwU3RyaW5nQnVmZmVyIGJ1ZmZlcjsKKyAgICAgICAgICAgIHBhY2tldC5nZXRTdHJpbmcoYnVmZmVyKTsKKyAgICAgICAgICAgIHN0cmluZ1ZhbHVlID0gZW52LT5OZXdTdHJpbmdVVEYoKGNvbnN0IGNoYXIgKilidWZmZXIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICB9CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBMT0dFKCJ1bnN1cHBvcnRlZCB0eXBlIGluIGdldE9iamVjdFByb3BlcnR5VmFsdWVcbiIpOworICAgICAgICAgICAgcmV0dXJuIE1UUF9SRVNQT05TRV9JTlZBTElEX09CSkVDVF9QUk9QX0ZPUk1BVDsKKyAgICB9CisKKyAgICBqaW50IHJlc3VsdCA9IGVudi0+Q2FsbEludE1ldGhvZChtRGF0YWJhc2UsIG1ldGhvZF9zZXRPYmplY3RQcm9wZXJ0eSwKKyAgICAgICAgICAgICAgICAoamludCloYW5kbGUsIChqaW50KXByb3BlcnR5LCBsb25nVmFsdWUsIHN0cmluZ1ZhbHVlKTsKKworICAgIGNoZWNrQW5kQ2xlYXJFeGNlcHRpb25Gcm9tQ2FsbGJhY2soZW52LCBfX0ZVTkNUSU9OX18pOworICAgIHJldHVybiByZXN1bHQ7Cit9CisKK010cFJlc3BvbnNlQ29kZSBNeU10cERhdGFiYXNlOjpnZXREZXZpY2VQcm9wZXJ0eVZhbHVlKE10cERldmljZVByb3BlcnR5IHByb3BlcnR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdHBEYXRhUGFja2V0JiBwYWNrZXQpIHsKKworICAgIGludCAgICAgICAgIHR5cGU7CisKKyAgICBpZiAoIWdldERldmljZVByb3BlcnR5SW5mbyhwcm9wZXJ0eSwgdHlwZSkpCisgICAgICAgIHJldHVybiBNVFBfUkVTUE9OU0VfREVWSUNFX1BST1BfTk9UX1NVUFBPUlRFRDsKKworICAgIEpOSUVudiogZW52ID0gQW5kcm9pZFJ1bnRpbWU6OmdldEpOSUVudigpOworICAgIGppbnQgcmVzdWx0ID0gZW52LT5DYWxsSW50TWV0aG9kKG1EYXRhYmFzZSwgbWV0aG9kX2dldERldmljZVByb3BlcnR5LAorICAgICAgICAgICAgICAgIChqaW50KXByb3BlcnR5LCBtTG9uZ0J1ZmZlciwgbVN0cmluZ0J1ZmZlcik7CisgICAgaWYgKHJlc3VsdCAhPSBNVFBfUkVTUE9OU0VfT0spIHsKKyAgICAgICAgY2hlY2tBbmRDbGVhckV4Y2VwdGlvbkZyb21DYWxsYmFjayhlbnYsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgamxvbmcqIGxvbmdWYWx1ZXMgPSBlbnYtPkdldExvbmdBcnJheUVsZW1lbnRzKG1Mb25nQnVmZmVyLCAwKTsKKyAgICBqbG9uZyBsb25nVmFsdWUgPSBsb25nVmFsdWVzWzBdOworICAgIGVudi0+UmVsZWFzZUxvbmdBcnJheUVsZW1lbnRzKG1Mb25nQnVmZmVyLCBsb25nVmFsdWVzLCAwKTsKKworICAgIHN3aXRjaCAodHlwZSkgeworICAgICAgICBjYXNlIE1UUF9UWVBFX0lOVDg6CisgICAgICAgICAgICBwYWNrZXQucHV0SW50OChsb25nVmFsdWUpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTVRQX1RZUEVfVUlOVDg6CisgICAgICAgICAgICBwYWNrZXQucHV0VUludDgobG9uZ1ZhbHVlKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE1UUF9UWVBFX0lOVDE2OgorICAgICAgICAgICAgcGFja2V0LnB1dEludDE2KGxvbmdWYWx1ZSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBNVFBfVFlQRV9VSU5UMTY6CisgICAgICAgICAgICBwYWNrZXQucHV0VUludDE2KGxvbmdWYWx1ZSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBNVFBfVFlQRV9JTlQzMjoKKyAgICAgICAgICAgIHBhY2tldC5wdXRJbnQzMihsb25nVmFsdWUpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTVRQX1RZUEVfVUlOVDMyOgorICAgICAgICAgICAgcGFja2V0LnB1dFVJbnQzMihsb25nVmFsdWUpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTVRQX1RZUEVfSU5UNjQ6CisgICAgICAgICAgICBwYWNrZXQucHV0SW50NjQobG9uZ1ZhbHVlKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE1UUF9UWVBFX1VJTlQ2NDoKKyAgICAgICAgICAgIHBhY2tldC5wdXRVSW50NjQobG9uZ1ZhbHVlKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE1UUF9UWVBFX0lOVDEyODoKKyAgICAgICAgICAgIHBhY2tldC5wdXRJbnQxMjgobG9uZ1ZhbHVlKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE1UUF9UWVBFX1VJTlQxMjg6CisgICAgICAgICAgICBwYWNrZXQucHV0SW50MTI4KGxvbmdWYWx1ZSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBNVFBfVFlQRV9TVFI6CisgICAgICAgIHsKKyAgICAgICAgICAgIGpjaGFyKiBzdHIgPSBlbnYtPkdldENoYXJBcnJheUVsZW1lbnRzKG1TdHJpbmdCdWZmZXIsIDApOworICAgICAgICAgICAgcGFja2V0LnB1dFN0cmluZyhzdHIpOworICAgICAgICAgICAgZW52LT5SZWxlYXNlQ2hhckFycmF5RWxlbWVudHMobVN0cmluZ0J1ZmZlciwgc3RyLCAwKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgfQorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgTE9HRSgidW5zdXBwb3J0ZWQgdHlwZSBpbiBnZXREZXZpY2VQcm9wZXJ0eVZhbHVlXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBNVFBfUkVTUE9OU0VfSU5WQUxJRF9ERVZJQ0VfUFJPUF9GT1JNQVQ7CisgICAgfQorCisgICAgY2hlY2tBbmRDbGVhckV4Y2VwdGlvbkZyb21DYWxsYmFjayhlbnYsIF9fRlVOQ1RJT05fXyk7CisgICAgcmV0dXJuIE1UUF9SRVNQT05TRV9PSzsKK30KKworTXRwUmVzcG9uc2VDb2RlIE15TXRwRGF0YWJhc2U6OnNldERldmljZVByb3BlcnR5VmFsdWUoTXRwRGV2aWNlUHJvcGVydHkgcHJvcGVydHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE10cERhdGFQYWNrZXQmIHBhY2tldCkgeworICAgIGludCAgICAgICAgIHR5cGU7CisKKyAgICBpZiAoIWdldERldmljZVByb3BlcnR5SW5mbyhwcm9wZXJ0eSwgdHlwZSkpCisgICAgICAgIHJldHVybiBNVFBfUkVTUE9OU0VfREVWSUNFX1BST1BfTk9UX1NVUFBPUlRFRDsKKworICAgIEpOSUVudiogZW52ID0gQW5kcm9pZFJ1bnRpbWU6OmdldEpOSUVudigpOworICAgIGpsb25nIGxvbmdWYWx1ZSA9IDA7CisgICAganN0cmluZyBzdHJpbmdWYWx1ZSA9IE5VTEw7CisKKyAgICBzd2l0Y2ggKHR5cGUpIHsKKyAgICAgICAgY2FzZSBNVFBfVFlQRV9JTlQ4OgorICAgICAgICAgICAgbG9uZ1ZhbHVlID0gcGFja2V0LmdldEludDgoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE1UUF9UWVBFX1VJTlQ4OgorICAgICAgICAgICAgbG9uZ1ZhbHVlID0gcGFja2V0LmdldFVJbnQ4KCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBNVFBfVFlQRV9JTlQxNjoKKyAgICAgICAgICAgIGxvbmdWYWx1ZSA9IHBhY2tldC5nZXRJbnQxNigpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTVRQX1RZUEVfVUlOVDE2OgorICAgICAgICAgICAgbG9uZ1ZhbHVlID0gcGFja2V0LmdldFVJbnQxNigpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTVRQX1RZUEVfSU5UMzI6CisgICAgICAgICAgICBsb25nVmFsdWUgPSBwYWNrZXQuZ2V0SW50MzIoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE1UUF9UWVBFX1VJTlQzMjoKKyAgICAgICAgICAgIGxvbmdWYWx1ZSA9IHBhY2tldC5nZXRVSW50MzIoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE1UUF9UWVBFX0lOVDY0OgorICAgICAgICAgICAgbG9uZ1ZhbHVlID0gcGFja2V0LmdldEludDY0KCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBNVFBfVFlQRV9VSU5UNjQ6CisgICAgICAgICAgICBsb25nVmFsdWUgPSBwYWNrZXQuZ2V0VUludDY0KCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBNVFBfVFlQRV9TVFI6CisgICAgICAgIHsKKyAgICAgICAgICAgIE10cFN0cmluZ0J1ZmZlciBidWZmZXI7CisgICAgICAgICAgICBwYWNrZXQuZ2V0U3RyaW5nKGJ1ZmZlcik7CisgICAgICAgICAgICBzdHJpbmdWYWx1ZSA9IGVudi0+TmV3U3RyaW5nVVRGKChjb25zdCBjaGFyICopYnVmZmVyKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgfQorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgTE9HRSgidW5zdXBwb3J0ZWQgdHlwZSBpbiBzZXREZXZpY2VQcm9wZXJ0eVZhbHVlXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBNVFBfUkVTUE9OU0VfSU5WQUxJRF9PQkpFQ1RfUFJPUF9GT1JNQVQ7CisgICAgfQorCisgICAgamludCByZXN1bHQgPSBlbnYtPkNhbGxJbnRNZXRob2QobURhdGFiYXNlLCBtZXRob2Rfc2V0RGV2aWNlUHJvcGVydHksCisgICAgICAgICAgICAgICAgKGppbnQpcHJvcGVydHksIGxvbmdWYWx1ZSwgc3RyaW5nVmFsdWUpOworCisgICAgY2hlY2tBbmRDbGVhckV4Y2VwdGlvbkZyb21DYWxsYmFjayhlbnYsIF9fRlVOQ1RJT05fXyk7CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworTXRwUmVzcG9uc2VDb2RlIE15TXRwRGF0YWJhc2U6OnJlc2V0RGV2aWNlUHJvcGVydHkoTXRwRGV2aWNlUHJvcGVydHkgcHJvcGVydHkpIHsKKyAgICByZXR1cm4gLTE7Cit9CisKK010cFJlc3BvbnNlQ29kZSBNeU10cERhdGFiYXNlOjpnZXRPYmplY3RJbmZvKE10cE9iamVjdEhhbmRsZSBoYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE10cERhdGFQYWNrZXQmIHBhY2tldCkgeworICAgIGNoYXIgICAgZGF0ZVsyMF07CisKKyAgICBKTklFbnYqIGVudiA9IEFuZHJvaWRSdW50aW1lOjpnZXRKTklFbnYoKTsKKyAgICBqYm9vbGVhbiByZXN1bHQgPSBlbnYtPkNhbGxCb29sZWFuTWV0aG9kKG1EYXRhYmFzZSwgbWV0aG9kX2dldE9iamVjdEluZm8sCisgICAgICAgICAgICAgICAgKGppbnQpaGFuZGxlLCBtSW50QnVmZmVyLCBtU3RyaW5nQnVmZmVyLCBtTG9uZ0J1ZmZlcik7CisgICAgaWYgKCFyZXN1bHQpCisgICAgICAgIHJldHVybiBNVFBfUkVTUE9OU0VfSU5WQUxJRF9PQkpFQ1RfSEFORExFOworCisgICAgamludCogaW50VmFsdWVzID0gZW52LT5HZXRJbnRBcnJheUVsZW1lbnRzKG1JbnRCdWZmZXIsIDApOworICAgIE10cFN0b3JhZ2VJRCBzdG9yYWdlSUQgPSBpbnRWYWx1ZXNbMF07CisgICAgTXRwT2JqZWN0Rm9ybWF0IGZvcm1hdCA9IGludFZhbHVlc1sxXTsKKyAgICBNdHBPYmplY3RIYW5kbGUgcGFyZW50ID0gaW50VmFsdWVzWzJdOworICAgIGVudi0+UmVsZWFzZUludEFycmF5RWxlbWVudHMobUludEJ1ZmZlciwgaW50VmFsdWVzLCAwKTsKKworICAgIGpsb25nKiBsb25nVmFsdWVzID0gZW52LT5HZXRMb25nQXJyYXlFbGVtZW50cyhtTG9uZ0J1ZmZlciwgMCk7CisgICAgdWludDY0X3Qgc2l6ZSA9IGxvbmdWYWx1ZXNbMF07CisgICAgdWludDY0X3QgbW9kaWZpZWQgPSBsb25nVmFsdWVzWzFdOworICAgIGVudi0+UmVsZWFzZUxvbmdBcnJheUVsZW1lbnRzKG1Mb25nQnVmZmVyLCBsb25nVmFsdWVzLCAwKTsKKworLy8gICAgaW50IGFzc29jaWF0aW9uVHlwZSA9IChmb3JtYXQgPT0gTVRQX0ZPUk1BVF9BU1NPQ0lBVElPTiA/CisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICBNVFBfQVNTT0NJQVRJT05fVFlQRV9HRU5FUklDX0ZPTERFUiA6CisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICBNVFBfQVNTT0NJQVRJT05fVFlQRV9VTkRFRklORUQpOworICAgIGludCBhc3NvY2lhdGlvblR5cGUgPSBNVFBfQVNTT0NJQVRJT05fVFlQRV9VTkRFRklORUQ7CisKKyAgICBwYWNrZXQucHV0VUludDMyKHN0b3JhZ2VJRCk7CisgICAgcGFja2V0LnB1dFVJbnQxNihmb3JtYXQpOworICAgIHBhY2tldC5wdXRVSW50MTYoMCk7ICAgLy8gcHJvdGVjdGlvbiBzdGF0dXMKKyAgICBwYWNrZXQucHV0VUludDMyKChzaXplID4gMHhGRkZGRkZGRkxMID8gMHhGRkZGRkZGRiA6IHNpemUpKTsKKyAgICBwYWNrZXQucHV0VUludDE2KDApOyAgIC8vIHRodW1iIGZvcm1hdAorICAgIHBhY2tldC5wdXRVSW50MzIoMCk7ICAgLy8gdGh1bWIgY29tcHJlc3NlZCBzaXplCisgICAgcGFja2V0LnB1dFVJbnQzMigwKTsgICAvLyB0aHVtYiBwaXggd2lkdGgKKyAgICBwYWNrZXQucHV0VUludDMyKDApOyAgIC8vIHRodW1iIHBpeCBoZWlnaHQKKyAgICBwYWNrZXQucHV0VUludDMyKDApOyAgIC8vIGltYWdlIHBpeCB3aWR0aAorICAgIHBhY2tldC5wdXRVSW50MzIoMCk7ICAgLy8gaW1hZ2UgcGl4IGhlaWdodAorICAgIHBhY2tldC5wdXRVSW50MzIoMCk7ICAgLy8gaW1hZ2UgYml0IGRlcHRoCisgICAgcGFja2V0LnB1dFVJbnQzMihwYXJlbnQpOworICAgIHBhY2tldC5wdXRVSW50MTYoYXNzb2NpYXRpb25UeXBlKTsKKyAgICBwYWNrZXQucHV0VUludDMyKDApOyAgIC8vIGFzc29jaWF0aW9uIGRlc2MKKyAgICBwYWNrZXQucHV0VUludDMyKDApOyAgIC8vIHNlcXVlbmNlIG51bWJlcgorCisgICAgamNoYXIqIHN0ciA9IGVudi0+R2V0Q2hhckFycmF5RWxlbWVudHMobVN0cmluZ0J1ZmZlciwgMCk7CisgICAgcGFja2V0LnB1dFN0cmluZyhzdHIpOyAgIC8vIGZpbGUgbmFtZQorICAgIGVudi0+UmVsZWFzZUNoYXJBcnJheUVsZW1lbnRzKG1TdHJpbmdCdWZmZXIsIHN0ciwgMCk7CisKKyAgICBwYWNrZXQucHV0RW1wdHlTdHJpbmcoKTsKKyAgICBmb3JtYXREYXRlVGltZShtb2RpZmllZCwgZGF0ZSwgc2l6ZW9mKGRhdGUpKTsKKyAgICBwYWNrZXQucHV0U3RyaW5nKGRhdGUpOyAgIC8vIGRhdGUgbW9kaWZpZWQKKyAgICBwYWNrZXQucHV0RW1wdHlTdHJpbmcoKTsgICAvLyBrZXl3b3JkcworCisgICAgY2hlY2tBbmRDbGVhckV4Y2VwdGlvbkZyb21DYWxsYmFjayhlbnYsIF9fRlVOQ1RJT05fXyk7CisgICAgcmV0dXJuIE1UUF9SRVNQT05TRV9PSzsKK30KKworTXRwUmVzcG9uc2VDb2RlIE15TXRwRGF0YWJhc2U6OmdldE9iamVjdEZpbGVQYXRoKE10cE9iamVjdEhhbmRsZSBoYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE10cFN0cmluZyYgZmlsZVBhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QmIGZpbGVMZW5ndGgpIHsKKyAgICBKTklFbnYqIGVudiA9IEFuZHJvaWRSdW50aW1lOjpnZXRKTklFbnYoKTsKKyAgICBqaW50IHJlc3VsdCA9IGVudi0+Q2FsbEludE1ldGhvZChtRGF0YWJhc2UsIG1ldGhvZF9nZXRPYmplY3RGaWxlUGF0aCwKKyAgICAgICAgICAgICAgICAoamludCloYW5kbGUsIG1TdHJpbmdCdWZmZXIsIG1Mb25nQnVmZmVyKTsKKyAgICBpZiAocmVzdWx0ICE9IE1UUF9SRVNQT05TRV9PSykgeworICAgICAgICBjaGVja0FuZENsZWFyRXhjZXB0aW9uRnJvbUNhbGxiYWNrKGVudiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICBqY2hhciogc3RyID0gZW52LT5HZXRDaGFyQXJyYXlFbGVtZW50cyhtU3RyaW5nQnVmZmVyLCAwKTsKKyAgICBmaWxlUGF0aC5zZXRUbyhzdHIsIHN0cmxlbjE2KHN0cikpOworICAgIGVudi0+UmVsZWFzZUNoYXJBcnJheUVsZW1lbnRzKG1TdHJpbmdCdWZmZXIsIHN0ciwgMCk7CisKKyAgICBqbG9uZyogbG9uZ1ZhbHVlcyA9IGVudi0+R2V0TG9uZ0FycmF5RWxlbWVudHMobUxvbmdCdWZmZXIsIDApOworICAgIGZpbGVMZW5ndGggPSBsb25nVmFsdWVzWzBdOworICAgIGVudi0+UmVsZWFzZUxvbmdBcnJheUVsZW1lbnRzKG1Mb25nQnVmZmVyLCBsb25nVmFsdWVzLCAwKTsKKyAgICAKKyAgICBjaGVja0FuZENsZWFyRXhjZXB0aW9uRnJvbUNhbGxiYWNrKGVudiwgX19GVU5DVElPTl9fKTsKKyAgICByZXR1cm4gcmVzdWx0OworfQorCitNdHBSZXNwb25zZUNvZGUgTXlNdHBEYXRhYmFzZTo6ZGVsZXRlRmlsZShNdHBPYmplY3RIYW5kbGUgaGFuZGxlKSB7CisgICAgSk5JRW52KiBlbnYgPSBBbmRyb2lkUnVudGltZTo6Z2V0Sk5JRW52KCk7CisgICAgTXRwUmVzcG9uc2VDb2RlIHJlc3VsdCA9IGVudi0+Q2FsbEludE1ldGhvZChtRGF0YWJhc2UsIG1ldGhvZF9kZWxldGVGaWxlLCAoamludCloYW5kbGUpOworCisgICAgY2hlY2tBbmRDbGVhckV4Y2VwdGlvbkZyb21DYWxsYmFjayhlbnYsIF9fRlVOQ1RJT05fXyk7CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworc3RydWN0IFByb3BlcnR5VGFibGVFbnRyeSB7CisgICAgTXRwT2JqZWN0UHJvcGVydHkgICBwcm9wZXJ0eTsKKyAgICBpbnQgICAgICAgICAgICAgICAgIHR5cGU7Cit9OworCitzdGF0aWMgY29uc3QgUHJvcGVydHlUYWJsZUVudHJ5ICAga09iamVjdFByb3BlcnR5VGFibGVbXSA9IHsKKyAgICB7ICAgTVRQX1BST1BFUlRZX1BBUkVOVF9PQkpFQ1QsICAgICBNVFBfVFlQRV9VSU5UMzIgfSwKKyAgICB7ICAgTVRQX1BST1BFUlRZX1NUT1JBR0VfSUQsICAgICAgICBNVFBfVFlQRV9VSU5UMzIgfSwKKyAgICB7ICAgTVRQX1BST1BFUlRZX09CSkVDVF9GT1JNQVQsICAgICBNVFBfVFlQRV9VSU5UMTYgfSwKKyAgICB7ICAgTVRQX1BST1BFUlRZX09CSkVDVF9GSUxFX05BTUUsICBNVFBfVFlQRV9TVFIgICAgfSwKKyAgICB7ICAgTVRQX1BST1BFUlRZX09CSkVDVF9TSVpFLCAgICAgICBNVFBfVFlQRV9VSU5UNjQgfSwKKyAgICB7ICAgTVRQX1BST1BFUlRZX0RBVEVfTU9ESUZJRUQsICAgICBNVFBfVFlQRV9TVFIgICAgfSwKK307CisKK3N0YXRpYyBjb25zdCBQcm9wZXJ0eVRhYmxlRW50cnkgICBrRGV2aWNlUHJvcGVydHlUYWJsZVtdID0geworICAgIHsgICBNVFBfREVWSUNFX1BST1BFUlRZX1NZTkNIUk9OSVpBVElPTl9QQVJUTkVSLCAgICAgTVRQX1RZUEVfU1RSIH0sCisgICAgeyAgIE1UUF9ERVZJQ0VfUFJPUEVSVFlfREVWSUNFX0ZSSUVORExZX05BTUUsICAgICAgICBNVFBfVFlQRV9TVFIgfSwKK307CisKK2Jvb2wgTXlNdHBEYXRhYmFzZTo6Z2V0T2JqZWN0UHJvcGVydHlJbmZvKE10cE9iamVjdFByb3BlcnR5IHByb3BlcnR5LCBpbnQmIHR5cGUpIHsKKyAgICBpbnQgY291bnQgPSBzaXplb2Yoa09iamVjdFByb3BlcnR5VGFibGUpIC8gc2l6ZW9mKGtPYmplY3RQcm9wZXJ0eVRhYmxlWzBdKTsKKyAgICBjb25zdCBQcm9wZXJ0eVRhYmxlRW50cnkqIGVudHJ5ID0ga09iamVjdFByb3BlcnR5VGFibGU7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrLCBlbnRyeSsrKSB7CisgICAgICAgIGlmIChlbnRyeS0+cHJvcGVydHkgPT0gcHJvcGVydHkpIHsKKyAgICAgICAgICAgIHR5cGUgPSBlbnRyeS0+dHlwZTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKK30KKworYm9vbCBNeU10cERhdGFiYXNlOjpnZXREZXZpY2VQcm9wZXJ0eUluZm8oTXRwRGV2aWNlUHJvcGVydHkgcHJvcGVydHksIGludCYgdHlwZSkgeworICAgIGludCBjb3VudCA9IHNpemVvZihrRGV2aWNlUHJvcGVydHlUYWJsZSkgLyBzaXplb2Yoa0RldmljZVByb3BlcnR5VGFibGVbMF0pOworICAgIGNvbnN0IFByb3BlcnR5VGFibGVFbnRyeSogZW50cnkgPSBrRGV2aWNlUHJvcGVydHlUYWJsZTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyssIGVudHJ5KyspIHsKKyAgICAgICAgaWYgKGVudHJ5LT5wcm9wZXJ0eSA9PSBwcm9wZXJ0eSkgeworICAgICAgICAgICAgdHlwZSA9IGVudHJ5LT50eXBlOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQorCitNdHBPYmplY3RIYW5kbGVMaXN0KiBNeU10cERhdGFiYXNlOjpnZXRPYmplY3RSZWZlcmVuY2VzKE10cE9iamVjdEhhbmRsZSBoYW5kbGUpIHsKKyAgICBKTklFbnYqIGVudiA9IEFuZHJvaWRSdW50aW1lOjpnZXRKTklFbnYoKTsKKyAgICBqaW50QXJyYXkgYXJyYXkgPSAoamludEFycmF5KWVudi0+Q2FsbE9iamVjdE1ldGhvZChtRGF0YWJhc2UsIG1ldGhvZF9nZXRPYmplY3RSZWZlcmVuY2VzLAorICAgICAgICAgICAgICAgIChqaW50KWhhbmRsZSk7CisgICAgaWYgKCFhcnJheSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgTXRwT2JqZWN0SGFuZGxlTGlzdCogbGlzdCA9IG5ldyBNdHBPYmplY3RIYW5kbGVMaXN0KCk7CisgICAgamludCogaGFuZGxlcyA9IGVudi0+R2V0SW50QXJyYXlFbGVtZW50cyhhcnJheSwgMCk7CisgICAganNpemUgbGVuZ3RoID0gZW52LT5HZXRBcnJheUxlbmd0aChhcnJheSk7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykKKyAgICAgICAgbGlzdC0+cHVzaChoYW5kbGVzW2ldKTsKKyAgICBlbnYtPlJlbGVhc2VJbnRBcnJheUVsZW1lbnRzKGFycmF5LCBoYW5kbGVzLCAwKTsKKworICAgIGNoZWNrQW5kQ2xlYXJFeGNlcHRpb25Gcm9tQ2FsbGJhY2soZW52LCBfX0ZVTkNUSU9OX18pOworICAgIHJldHVybiBsaXN0OworfQorCitNdHBSZXNwb25zZUNvZGUgTXlNdHBEYXRhYmFzZTo6c2V0T2JqZWN0UmVmZXJlbmNlcyhNdHBPYmplY3RIYW5kbGUgaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE10cE9iamVjdEhhbmRsZUxpc3QqIHJlZmVyZW5jZXMpIHsKKyAgICBKTklFbnYqIGVudiA9IEFuZHJvaWRSdW50aW1lOjpnZXRKTklFbnYoKTsKKyAgICBpbnQgY291bnQgPSByZWZlcmVuY2VzLT5zaXplKCk7CisgICAgamludEFycmF5IGFycmF5ID0gZW52LT5OZXdJbnRBcnJheShjb3VudCk7CisgICAgaWYgKCFhcnJheSkgeworICAgICAgICBMT0dFKCJvdXQgb2YgbWVtb3J5IGluIHNldE9iamVjdFJlZmVyZW5jZXMiKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBqaW50KiBoYW5kbGVzID0gZW52LT5HZXRJbnRBcnJheUVsZW1lbnRzKGFycmF5LCAwKTsKKyAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKQorICAgICAgICBoYW5kbGVzW2ldID0gKCpyZWZlcmVuY2VzKVtpXTsKKyAgICBlbnYtPlJlbGVhc2VJbnRBcnJheUVsZW1lbnRzKGFycmF5LCBoYW5kbGVzLCAwKTsKKyAgICBNdHBSZXNwb25zZUNvZGUgcmVzdWx0ID0gZW52LT5DYWxsSW50TWV0aG9kKG1EYXRhYmFzZSwgbWV0aG9kX3NldE9iamVjdFJlZmVyZW5jZXMsCisgICAgICAgICAgICAgICAgKGppbnQpaGFuZGxlLCBhcnJheSk7CisKKyAgICBjaGVja0FuZENsZWFyRXhjZXB0aW9uRnJvbUNhbGxiYWNrKGVudiwgX19GVU5DVElPTl9fKTsKKyAgICByZXR1cm4gcmVzdWx0OworfQorCitNdHBQcm9wZXJ0eSogTXlNdHBEYXRhYmFzZTo6Z2V0T2JqZWN0UHJvcGVydHlEZXNjKE10cE9iamVjdFByb3BlcnR5IHByb3BlcnR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdHBPYmplY3RGb3JtYXQgZm9ybWF0KSB7CisgICAgTXRwUHJvcGVydHkqIHJlc3VsdCA9IE5VTEw7CisgICAgc3dpdGNoIChwcm9wZXJ0eSkgeworICAgICAgICBjYXNlIE1UUF9QUk9QRVJUWV9PQkpFQ1RfRk9STUFUOgorICAgICAgICBjYXNlIE1UUF9QUk9QRVJUWV9QUk9URUNUSU9OX1NUQVRVUzoKKyAgICAgICAgICAgIHJlc3VsdCA9IG5ldyBNdHBQcm9wZXJ0eShwcm9wZXJ0eSwgTVRQX1RZUEVfVUlOVDE2KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE1UUF9QUk9QRVJUWV9TVE9SQUdFX0lEOgorICAgICAgICBjYXNlIE1UUF9QUk9QRVJUWV9QQVJFTlRfT0JKRUNUOgorICAgICAgICAgICAgcmVzdWx0ID0gbmV3IE10cFByb3BlcnR5KHByb3BlcnR5LCBNVFBfVFlQRV9VSU5UMzIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTVRQX1BST1BFUlRZX09CSkVDVF9TSVpFOgorICAgICAgICAgICAgcmVzdWx0ID0gbmV3IE10cFByb3BlcnR5KHByb3BlcnR5LCBNVFBfVFlQRV9VSU5UNjQpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTVRQX1BST1BFUlRZX1BFUlNJU1RFTlRfVUlEOgorICAgICAgICAgICAgcmVzdWx0ID0gbmV3IE10cFByb3BlcnR5KHByb3BlcnR5LCBNVFBfVFlQRV9VSU5UMTI4KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE1UUF9QUk9QRVJUWV9PQkpFQ1RfRklMRV9OQU1FOgorICAgICAgICBjYXNlIE1UUF9QUk9QRVJUWV9EQVRFX01PRElGSUVEOgorICAgICAgICAgICAgcmVzdWx0ID0gbmV3IE10cFByb3BlcnR5KHByb3BlcnR5LCBNVFBfVFlQRV9TVFIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworTXRwUHJvcGVydHkqIE15TXRwRGF0YWJhc2U6OmdldERldmljZVByb3BlcnR5RGVzYyhNdHBEZXZpY2VQcm9wZXJ0eSBwcm9wZXJ0eSkgeworICAgIE10cFByb3BlcnR5KiByZXN1bHQgPSBOVUxMOworICAgIHN3aXRjaCAocHJvcGVydHkpIHsKKyAgICAgICAgY2FzZSBNVFBfREVWSUNFX1BST1BFUlRZX1NZTkNIUk9OSVpBVElPTl9QQVJUTkVSOgorICAgICAgICBjYXNlIE1UUF9ERVZJQ0VfUFJPUEVSVFlfREVWSUNFX0ZSSUVORExZX05BTUU6CisgICAgICAgICAgICAvLyB3cml0ZWFibGUgc3RyaW5nIHByb3BlcnRpZXMKKyAgICAgICAgICAgIHJlc3VsdCA9IG5ldyBNdHBQcm9wZXJ0eShwcm9wZXJ0eSwgTVRQX1RZUEVfU1RSLCB0cnVlKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiByZXN1bHQ7Cit9CisKK3ZvaWQgTXlNdHBEYXRhYmFzZTo6c2Vzc2lvblN0YXJ0ZWQoKSB7CisgICAgSk5JRW52KiBlbnYgPSBBbmRyb2lkUnVudGltZTo6Z2V0Sk5JRW52KCk7CisgICAgZW52LT5DYWxsVm9pZE1ldGhvZChtRGF0YWJhc2UsIG1ldGhvZF9zZXNzaW9uU3RhcnRlZCk7CisgICAgY2hlY2tBbmRDbGVhckV4Y2VwdGlvbkZyb21DYWxsYmFjayhlbnYsIF9fRlVOQ1RJT05fXyk7Cit9CisKK3ZvaWQgTXlNdHBEYXRhYmFzZTo6c2Vzc2lvbkVuZGVkKCkgeworICAgIEpOSUVudiogZW52ID0gQW5kcm9pZFJ1bnRpbWU6OmdldEpOSUVudigpOworICAgIGVudi0+Q2FsbFZvaWRNZXRob2QobURhdGFiYXNlLCBtZXRob2Rfc2Vzc2lvbkVuZGVkKTsKKyAgICBjaGVja0FuZENsZWFyRXhjZXB0aW9uRnJvbUNhbGxiYWNrKGVudiwgX19GVU5DVElPTl9fKTsKK30KKworI2VuZGlmIC8vIEhBVkVfQU5EUk9JRF9PUworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyB2b2lkCithbmRyb2lkX21lZGlhX010cERhdGFiYXNlX3NldHVwKEpOSUVudiAqZW52LCBqb2JqZWN0IHRoaXopCit7CisjaWZkZWYgSEFWRV9BTkRST0lEX09TCisgICAgTE9HRCgic2V0dXBcbiIpOworICAgIE15TXRwRGF0YWJhc2UqIGRhdGFiYXNlID0gbmV3IE15TXRwRGF0YWJhc2UoZW52LCB0aGl6KTsKKyAgICBlbnYtPlNldEludEZpZWxkKHRoaXosIGZpZWxkX2NvbnRleHQsIChpbnQpZGF0YWJhc2UpOworICAgIGNoZWNrQW5kQ2xlYXJFeGNlcHRpb25Gcm9tQ2FsbGJhY2soZW52LCBfX0ZVTkNUSU9OX18pOworI2VuZGlmCit9CisKK3N0YXRpYyB2b2lkCithbmRyb2lkX21lZGlhX010cERhdGFiYXNlX2ZpbmFsaXplKEpOSUVudiAqZW52LCBqb2JqZWN0IHRoaXopCit7CisjaWZkZWYgSEFWRV9BTkRST0lEX09TCisgICAgTE9HRCgiZmluYWxpemVcbiIpOworICAgIE15TXRwRGF0YWJhc2UqIGRhdGFiYXNlID0gKE15TXRwRGF0YWJhc2UgKillbnYtPkdldEludEZpZWxkKHRoaXosIGZpZWxkX2NvbnRleHQpOworICAgIGRhdGFiYXNlLT5jbGVhbnVwKGVudik7CisgICAgZGVsZXRlIGRhdGFiYXNlOworICAgIGVudi0+U2V0SW50RmllbGQodGhpeiwgZmllbGRfY29udGV4dCwgMCk7CisgICAgY2hlY2tBbmRDbGVhckV4Y2VwdGlvbkZyb21DYWxsYmFjayhlbnYsIF9fRlVOQ1RJT05fXyk7CisjZW5kaWYKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgSk5JTmF0aXZlTWV0aG9kIGdNZXRob2RzW10gPSB7CisgICAgeyJuYXRpdmVfc2V0dXAiLCAgICAgICAgICAgICIoKVYiLCAgKHZvaWQgKilhbmRyb2lkX21lZGlhX010cERhdGFiYXNlX3NldHVwfSwKKyAgICB7Im5hdGl2ZV9maW5hbGl6ZSIsICAgICAgICAgIigpViIsICAodm9pZCAqKWFuZHJvaWRfbWVkaWFfTXRwRGF0YWJhc2VfZmluYWxpemV9LAorfTsKKworc3RhdGljIGNvbnN0IGNoYXIqIGNvbnN0IGtDbGFzc1BhdGhOYW1lID0gImFuZHJvaWQvbWVkaWEvTXRwRGF0YWJhc2UiOworCitpbnQgcmVnaXN0ZXJfYW5kcm9pZF9tZWRpYV9NdHBEYXRhYmFzZShKTklFbnYgKmVudikKK3sKKyAgICBqY2xhc3MgY2xheno7CisKKyAgICBMT0dEKCJyZWdpc3Rlcl9hbmRyb2lkX21lZGlhX010cERhdGFiYXNlXG4iKTsKKworICAgIGNsYXp6ID0gZW52LT5GaW5kQ2xhc3MoImFuZHJvaWQvbWVkaWEvTXRwRGF0YWJhc2UiKTsKKyAgICBpZiAoY2xhenogPT0gTlVMTCkgeworICAgICAgICBMT0dFKCJDYW4ndCBmaW5kIGFuZHJvaWQvbWVkaWEvTXRwRGF0YWJhc2UiKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBtZXRob2RfYmVnaW5TZW5kT2JqZWN0ID0gZW52LT5HZXRNZXRob2RJRChjbGF6eiwgImJlZ2luU2VuZE9iamVjdCIsICIoTGphdmEvbGFuZy9TdHJpbmc7SUlJSkopSSIpOworICAgIGlmIChtZXRob2RfYmVnaW5TZW5kT2JqZWN0ID09IE5VTEwpIHsKKyAgICAgICAgTE9HRSgiQ2FuJ3QgZmluZCBiZWdpblNlbmRPYmplY3QiKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBtZXRob2RfZW5kU2VuZE9iamVjdCA9IGVudi0+R2V0TWV0aG9kSUQoY2xhenosICJlbmRTZW5kT2JqZWN0IiwgIihMamF2YS9sYW5nL1N0cmluZztJSVopViIpOworICAgIGlmIChtZXRob2RfZW5kU2VuZE9iamVjdCA9PSBOVUxMKSB7CisgICAgICAgIExPR0UoIkNhbid0IGZpbmQgZW5kU2VuZE9iamVjdCIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIG1ldGhvZF9nZXRPYmplY3RMaXN0ID0gZW52LT5HZXRNZXRob2RJRChjbGF6eiwgImdldE9iamVjdExpc3QiLCAiKElJSSlbSSIpOworICAgIGlmIChtZXRob2RfZ2V0T2JqZWN0TGlzdCA9PSBOVUxMKSB7CisgICAgICAgIExPR0UoIkNhbid0IGZpbmQgZ2V0T2JqZWN0TGlzdCIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIG1ldGhvZF9nZXROdW1PYmplY3RzID0gZW52LT5HZXRNZXRob2RJRChjbGF6eiwgImdldE51bU9iamVjdHMiLCAiKElJSSlJIik7CisgICAgaWYgKG1ldGhvZF9nZXROdW1PYmplY3RzID09IE5VTEwpIHsKKyAgICAgICAgTE9HRSgiQ2FuJ3QgZmluZCBnZXROdW1PYmplY3RzIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgbWV0aG9kX2dldFN1cHBvcnRlZFBsYXliYWNrRm9ybWF0cyA9IGVudi0+R2V0TWV0aG9kSUQoY2xhenosICJnZXRTdXBwb3J0ZWRQbGF5YmFja0Zvcm1hdHMiLCAiKClbSSIpOworICAgIGlmIChtZXRob2RfZ2V0U3VwcG9ydGVkUGxheWJhY2tGb3JtYXRzID09IE5VTEwpIHsKKyAgICAgICAgTE9HRSgiQ2FuJ3QgZmluZCBnZXRTdXBwb3J0ZWRQbGF5YmFja0Zvcm1hdHMiKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBtZXRob2RfZ2V0U3VwcG9ydGVkQ2FwdHVyZUZvcm1hdHMgPSBlbnYtPkdldE1ldGhvZElEKGNsYXp6LCAiZ2V0U3VwcG9ydGVkQ2FwdHVyZUZvcm1hdHMiLCAiKClbSSIpOworICAgIGlmIChtZXRob2RfZ2V0U3VwcG9ydGVkQ2FwdHVyZUZvcm1hdHMgPT0gTlVMTCkgeworICAgICAgICBMT0dFKCJDYW4ndCBmaW5kIGdldFN1cHBvcnRlZENhcHR1cmVGb3JtYXRzIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgbWV0aG9kX2dldFN1cHBvcnRlZE9iamVjdFByb3BlcnRpZXMgPSBlbnYtPkdldE1ldGhvZElEKGNsYXp6LCAiZ2V0U3VwcG9ydGVkT2JqZWN0UHJvcGVydGllcyIsICIoSSlbSSIpOworICAgIGlmIChtZXRob2RfZ2V0U3VwcG9ydGVkT2JqZWN0UHJvcGVydGllcyA9PSBOVUxMKSB7CisgICAgICAgIExPR0UoIkNhbid0IGZpbmQgZ2V0U3VwcG9ydGVkT2JqZWN0UHJvcGVydGllcyIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIG1ldGhvZF9nZXRTdXBwb3J0ZWREZXZpY2VQcm9wZXJ0aWVzID0gZW52LT5HZXRNZXRob2RJRChjbGF6eiwgImdldFN1cHBvcnRlZERldmljZVByb3BlcnRpZXMiLCAiKClbSSIpOworICAgIGlmIChtZXRob2RfZ2V0U3VwcG9ydGVkRGV2aWNlUHJvcGVydGllcyA9PSBOVUxMKSB7CisgICAgICAgIExPR0UoIkNhbid0IGZpbmQgZ2V0U3VwcG9ydGVkRGV2aWNlUHJvcGVydGllcyIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIG1ldGhvZF9nZXRPYmplY3RQcm9wZXJ0eSA9IGVudi0+R2V0TWV0aG9kSUQoY2xhenosICJnZXRPYmplY3RQcm9wZXJ0eSIsICIoSUlbSltDKUkiKTsKKyAgICBpZiAobWV0aG9kX2dldE9iamVjdFByb3BlcnR5ID09IE5VTEwpIHsKKyAgICAgICAgTE9HRSgiQ2FuJ3QgZmluZCBnZXRPYmplY3RQcm9wZXJ0eSIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIG1ldGhvZF9zZXRPYmplY3RQcm9wZXJ0eSA9IGVudi0+R2V0TWV0aG9kSUQoY2xhenosICJzZXRPYmplY3RQcm9wZXJ0eSIsICIoSUlKTGphdmEvbGFuZy9TdHJpbmc7KUkiKTsKKyAgICBpZiAobWV0aG9kX3NldE9iamVjdFByb3BlcnR5ID09IE5VTEwpIHsKKyAgICAgICAgTE9HRSgiQ2FuJ3QgZmluZCBzZXRPYmplY3RQcm9wZXJ0eSIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIG1ldGhvZF9nZXREZXZpY2VQcm9wZXJ0eSA9IGVudi0+R2V0TWV0aG9kSUQoY2xhenosICJnZXREZXZpY2VQcm9wZXJ0eSIsICIoSVtKW0MpSSIpOworICAgIGlmIChtZXRob2RfZ2V0RGV2aWNlUHJvcGVydHkgPT0gTlVMTCkgeworICAgICAgICBMT0dFKCJDYW4ndCBmaW5kIGdldERldmljZVByb3BlcnR5Iik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgbWV0aG9kX3NldERldmljZVByb3BlcnR5ID0gZW52LT5HZXRNZXRob2RJRChjbGF6eiwgInNldERldmljZVByb3BlcnR5IiwgIihJSkxqYXZhL2xhbmcvU3RyaW5nOylJIik7CisgICAgaWYgKG1ldGhvZF9zZXREZXZpY2VQcm9wZXJ0eSA9PSBOVUxMKSB7CisgICAgICAgIExPR0UoIkNhbid0IGZpbmQgc2V0RGV2aWNlUHJvcGVydHkiKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBtZXRob2RfZ2V0T2JqZWN0SW5mbyA9IGVudi0+R2V0TWV0aG9kSUQoY2xhenosICJnZXRPYmplY3RJbmZvIiwgIihJW0lbQ1tKKVoiKTsKKyAgICBpZiAobWV0aG9kX2dldE9iamVjdEluZm8gPT0gTlVMTCkgeworICAgICAgICBMT0dFKCJDYW4ndCBmaW5kIGdldE9iamVjdEluZm8iKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBtZXRob2RfZ2V0T2JqZWN0RmlsZVBhdGggPSBlbnYtPkdldE1ldGhvZElEKGNsYXp6LCAiZ2V0T2JqZWN0RmlsZVBhdGgiLCAiKElbQ1tKKUkiKTsKKyAgICBpZiAobWV0aG9kX2dldE9iamVjdEZpbGVQYXRoID09IE5VTEwpIHsKKyAgICAgICAgTE9HRSgiQ2FuJ3QgZmluZCBnZXRPYmplY3RGaWxlUGF0aCIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIG1ldGhvZF9kZWxldGVGaWxlID0gZW52LT5HZXRNZXRob2RJRChjbGF6eiwgImRlbGV0ZUZpbGUiLCAiKEkpSSIpOworICAgIGlmIChtZXRob2RfZGVsZXRlRmlsZSA9PSBOVUxMKSB7CisgICAgICAgIExPR0UoIkNhbid0IGZpbmQgZGVsZXRlRmlsZSIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIG1ldGhvZF9nZXRPYmplY3RSZWZlcmVuY2VzID0gZW52LT5HZXRNZXRob2RJRChjbGF6eiwgImdldE9iamVjdFJlZmVyZW5jZXMiLCAiKEkpW0kiKTsKKyAgICBpZiAobWV0aG9kX2dldE9iamVjdFJlZmVyZW5jZXMgPT0gTlVMTCkgeworICAgICAgICBMT0dFKCJDYW4ndCBmaW5kIGdldE9iamVjdFJlZmVyZW5jZXMiKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBtZXRob2Rfc2V0T2JqZWN0UmVmZXJlbmNlcyA9IGVudi0+R2V0TWV0aG9kSUQoY2xhenosICJzZXRPYmplY3RSZWZlcmVuY2VzIiwgIihJW0kpSSIpOworICAgIGlmIChtZXRob2Rfc2V0T2JqZWN0UmVmZXJlbmNlcyA9PSBOVUxMKSB7CisgICAgICAgIExPR0UoIkNhbid0IGZpbmQgc2V0T2JqZWN0UmVmZXJlbmNlcyIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIG1ldGhvZF9zZXNzaW9uU3RhcnRlZCA9IGVudi0+R2V0TWV0aG9kSUQoY2xhenosICJzZXNzaW9uU3RhcnRlZCIsICIoKVYiKTsKKyAgICBpZiAobWV0aG9kX3Nlc3Npb25TdGFydGVkID09IE5VTEwpIHsKKyAgICAgICAgTE9HRSgiQ2FuJ3QgZmluZCBzZXNzaW9uU3RhcnRlZCIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIG1ldGhvZF9zZXNzaW9uRW5kZWQgPSBlbnYtPkdldE1ldGhvZElEKGNsYXp6LCAic2Vzc2lvbkVuZGVkIiwgIigpViIpOworICAgIGlmIChtZXRob2Rfc2Vzc2lvbkVuZGVkID09IE5VTEwpIHsKKyAgICAgICAgTE9HRSgiQ2FuJ3QgZmluZCBzZXNzaW9uRW5kZWQiKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIGZpZWxkX2NvbnRleHQgPSBlbnYtPkdldEZpZWxkSUQoY2xhenosICJtTmF0aXZlQ29udGV4dCIsICJJIik7CisgICAgaWYgKGZpZWxkX2NvbnRleHQgPT0gTlVMTCkgeworICAgICAgICBMT0dFKCJDYW4ndCBmaW5kIE10cERhdGFiYXNlLm1OYXRpdmVDb250ZXh0Iik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICByZXR1cm4gQW5kcm9pZFJ1bnRpbWU6OnJlZ2lzdGVyTmF0aXZlTWV0aG9kcyhlbnYsCisgICAgICAgICAgICAgICAgImFuZHJvaWQvbWVkaWEvTXRwRGF0YWJhc2UiLCBnTWV0aG9kcywgTkVMRU0oZ01ldGhvZHMpKTsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2puaS9hbmRyb2lkX21lZGlhX010cFNlcnZlci5jcHAgYi9tZWRpYS9qbmkvYW5kcm9pZF9tZWRpYV9NdHBTZXJ2ZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ1Njc5NjUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9qbmkvYW5kcm9pZF9tZWRpYV9NdHBTZXJ2ZXIuY3BwCkBAIC0wLDAgKzEsMjU3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJNdHBTZXJ2ZXJKTkkiCisjaW5jbHVkZSAidXRpbHMvTG9nLmgiCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgPGxpbWl0cy5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8c3lzL2lvY3RsLmg+CisjaW5jbHVkZSA8dXRpbHMvdGhyZWFkcy5oPgorCisjaWZkZWYgSEFWRV9BTkRST0lEX09TCisjaW5jbHVkZSA8bGludXgvdXNiL2ZfbXRwLmg+CisjZW5kaWYKKworI2luY2x1ZGUgImpuaS5oIgorI2luY2x1ZGUgIkpOSUhlbHAuaCIKKyNpbmNsdWRlICJhbmRyb2lkX3J1bnRpbWUvQW5kcm9pZFJ1bnRpbWUuaCIKKyNpbmNsdWRlICJwcml2YXRlL2FuZHJvaWRfZmlsZXN5c3RlbV9jb25maWcuaCIKKworI2luY2x1ZGUgIk10cFNlcnZlci5oIgorCit1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgamZpZWxkSUQgZmllbGRfY29udGV4dDsKK3N0YXRpYyBNdXRleCAgICBzTXV0ZXg7CisKKy8vIGluIGFuZHJvaWRfbWVkaWFfTXRwRGF0YWJhc2UuY3BwCitleHRlcm4gTXRwRGF0YWJhc2UqIGdldE10cERhdGFiYXNlKEpOSUVudiAqZW52LCBqb2JqZWN0IGRhdGFiYXNlKTsKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjaWZkZWYgSEFWRV9BTkRST0lEX09TCisKK3N0YXRpYyBib29sIEV4Y2VwdGlvbkNoZWNrKHZvaWQqIGVudikKK3sKKyAgICByZXR1cm4gKChKTklFbnYgKillbnYpLT5FeGNlcHRpb25DaGVjaygpOworfQorCitjbGFzcyBNdHBUaHJlYWQgOiBwdWJsaWMgVGhyZWFkIHsKK3ByaXZhdGU6CisgICAgTXRwRGF0YWJhc2UqICAgIG1EYXRhYmFzZTsKKyAgICBNdHBTZXJ2ZXIqICAgICAgbVNlcnZlcjsKKyAgICBTdHJpbmc4ICAgICAgICAgbVN0b3JhZ2VQYXRoOworICAgIGpvYmplY3QgICAgICAgICBtSmF2YVNlcnZlcjsKKyAgICBpbnQgICAgICAgICAgICAgbUZkOworCitwdWJsaWM6CisgICAgTXRwVGhyZWFkKE10cERhdGFiYXNlKiBkYXRhYmFzZSwgY29uc3QgY2hhciogc3RvcmFnZVBhdGgsIGpvYmplY3QgamF2YVNlcnZlcikKKyAgICAgICAgOiAgIG1EYXRhYmFzZShkYXRhYmFzZSksCisgICAgICAgICAgICBtU2VydmVyKE5VTEwpLAorICAgICAgICAgICAgbVN0b3JhZ2VQYXRoKHN0b3JhZ2VQYXRoKSwKKyAgICAgICAgICAgIG1KYXZhU2VydmVyKGphdmFTZXJ2ZXIpLAorICAgICAgICAgICAgbUZkKC0xKQorICAgIHsKKyAgICB9CisKKyAgICB2b2lkIHNldFB0cE1vZGUoYm9vbCB1c2VQdHApIHsKKyAgICAgICAgc011dGV4LmxvY2soKTsKKyAgICAgICAgaWYgKG1GZCA+PSAwKSB7CisgICAgICAgICAgICBpb2N0bChtRmQsIE1UUF9TRVRfSU5URVJGQUNFX01PREUsCisgICAgICAgICAgICAgICAgICAgICh1c2VQdHAgPyBNVFBfSU5URVJGQUNFX01PREVfUFRQIDogTVRQX0lOVEVSRkFDRV9NT0RFX01UUCkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaW50IGZkID0gb3BlbigiL2Rldi9tdHBfdXNiIiwgT19SRFdSKTsKKyAgICAgICAgICAgIGlmIChmZCA+PSAwKSB7CisgICAgICAgICAgICAgICAgaW9jdGwoZmQsIE1UUF9TRVRfSU5URVJGQUNFX01PREUsCisgICAgICAgICAgICAgICAgICAgICAgICAodXNlUHRwID8gTVRQX0lOVEVSRkFDRV9NT0RFX1BUUCA6IE1UUF9JTlRFUkZBQ0VfTU9ERV9NVFApKTsKKyAgICAgICAgICAgICAgICBjbG9zZShmZCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgc011dGV4LnVubG9jaygpOworICAgIH0KKworICAgIHZpcnR1YWwgYm9vbCB0aHJlYWRMb29wKCkgeworICAgICAgICBzTXV0ZXgubG9jaygpOworICAgICAgICBtRmQgPSBvcGVuKCIvZGV2L210cF91c2IiLCBPX1JEV1IpOworICAgICAgICBwcmludGYoIm9wZW4gcmV0dXJuZWQgJWRcbiIsIG1GZCk7CisgICAgICAgIGlmIChtRmQgPCAwKSB7CisgICAgICAgICAgICBMT0dFKCJjb3VsZCBub3Qgb3BlbiBNVFAgZHJpdmVyXG4iKTsKKyAgICAgICAgICAgIHNNdXRleC51bmxvY2soKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIG1TZXJ2ZXIgPSBuZXcgTXRwU2VydmVyKG1GZCwgbURhdGFiYXNlLCBBSURfU0RDQVJEX1JXLCAwNjY0LCAwNzc1KTsKKyAgICAgICAgbVNlcnZlci0+YWRkU3RvcmFnZShtU3RvcmFnZVBhdGgpOworICAgICAgICBzTXV0ZXgudW5sb2NrKCk7CisKKyAgICAgICAgTE9HRCgiTXRwVGhyZWFkIG1TZXJ2ZXItPnJ1biIpOworICAgICAgICBtU2VydmVyLT5ydW4oKTsKKworICAgICAgICBzTXV0ZXgubG9jaygpOworICAgICAgICBjbG9zZShtRmQpOworICAgICAgICBtRmQgPSAtMTsKKyAgICAgICAgZGVsZXRlIG1TZXJ2ZXI7CisgICAgICAgIG1TZXJ2ZXIgPSBOVUxMOworCisgICAgICAgIEpOSUVudiogZW52ID0gQW5kcm9pZFJ1bnRpbWU6OmdldEpOSUVudigpOworICAgICAgICBlbnYtPlNldEludEZpZWxkKG1KYXZhU2VydmVyLCBmaWVsZF9jb250ZXh0LCAwKTsKKyAgICAgICAgZW52LT5EZWxldGVHbG9iYWxSZWYobUphdmFTZXJ2ZXIpOworICAgICAgICBzTXV0ZXgudW5sb2NrKCk7CisKKyAgICAgICAgTE9HRCgidGhyZWFkTG9vcCByZXR1cm5pbmciKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHZvaWQgc2VuZE9iamVjdEFkZGVkKE10cE9iamVjdEhhbmRsZSBoYW5kbGUpIHsKKyAgICAgICAgc011dGV4LmxvY2soKTsKKyAgICAgICAgaWYgKG1TZXJ2ZXIpCisgICAgICAgICAgICBtU2VydmVyLT5zZW5kT2JqZWN0QWRkZWQoaGFuZGxlKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgTE9HRSgic2VuZE9iamVjdEFkZGVkIGNhbGxlZCB3aGlsZSBkaXNjb25uZWN0ZWRcbiIpOworICAgICAgICBzTXV0ZXgudW5sb2NrKCk7CisgICAgfQorCisgICAgdm9pZCBzZW5kT2JqZWN0UmVtb3ZlZChNdHBPYmplY3RIYW5kbGUgaGFuZGxlKSB7CisgICAgICAgIHNNdXRleC5sb2NrKCk7CisgICAgICAgIGlmIChtU2VydmVyKQorICAgICAgICAgICAgbVNlcnZlci0+c2VuZE9iamVjdFJlbW92ZWQoaGFuZGxlKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgTE9HRSgic2VuZE9iamVjdFJlbW92ZWQgY2FsbGVkIHdoaWxlIGRpc2Nvbm5lY3RlZFxuIik7CisgICAgICAgIHNNdXRleC51bmxvY2soKTsKKyAgICB9Cit9OworCisjZW5kaWYgLy8gSEFWRV9BTkRST0lEX09TCisKK3N0YXRpYyB2b2lkCithbmRyb2lkX21lZGlhX010cFNlcnZlcl9zZXR1cChKTklFbnYgKmVudiwgam9iamVjdCB0aGl6LCBqb2JqZWN0IGphdmFEYXRhYmFzZSwganN0cmluZyBzdG9yYWdlUGF0aCkKK3sKKyNpZmRlZiBIQVZFX0FORFJPSURfT1MKKyAgICBMT0dEKCJzZXR1cFxuIik7CisKKyAgICBNdHBEYXRhYmFzZSogZGF0YWJhc2UgPSBnZXRNdHBEYXRhYmFzZShlbnYsIGphdmFEYXRhYmFzZSk7CisgICAgY29uc3QgY2hhciAqc3RvcmFnZVBhdGhTdHIgPSBlbnYtPkdldFN0cmluZ1VURkNoYXJzKHN0b3JhZ2VQYXRoLCBOVUxMKTsKKworICAgIE10cFRocmVhZCogdGhyZWFkID0gbmV3IE10cFRocmVhZChkYXRhYmFzZSwgc3RvcmFnZVBhdGhTdHIsIGVudi0+TmV3R2xvYmFsUmVmKHRoaXopKTsKKyAgICBlbnYtPlNldEludEZpZWxkKHRoaXosIGZpZWxkX2NvbnRleHQsIChpbnQpdGhyZWFkKTsKKworICAgIGVudi0+UmVsZWFzZVN0cmluZ1VURkNoYXJzKHN0b3JhZ2VQYXRoLCBzdG9yYWdlUGF0aFN0cik7CisjZW5kaWYKK30KKworc3RhdGljIHZvaWQKK2FuZHJvaWRfbWVkaWFfTXRwU2VydmVyX2ZpbmFsaXplKEpOSUVudiAqZW52LCBqb2JqZWN0IHRoaXopCit7CisgICAgTE9HRCgiZmluYWxpemVcbiIpOworfQorCisKK3N0YXRpYyB2b2lkCithbmRyb2lkX21lZGlhX010cFNlcnZlcl9zdGFydChKTklFbnYgKmVudiwgam9iamVjdCB0aGl6KQoreworI2lmZGVmIEhBVkVfQU5EUk9JRF9PUworICAgIExPR0QoInN0YXJ0XG4iKTsKKyAgICBNdHBUaHJlYWQgKnRocmVhZCA9IChNdHBUaHJlYWQgKillbnYtPkdldEludEZpZWxkKHRoaXosIGZpZWxkX2NvbnRleHQpOworICAgIHRocmVhZC0+cnVuKCJNdHBUaHJlYWQiKTsKKyNlbmRpZiAvLyBIQVZFX0FORFJPSURfT1MKK30KKworc3RhdGljIHZvaWQKK2FuZHJvaWRfbWVkaWFfTXRwU2VydmVyX3N0b3AoSk5JRW52ICplbnYsIGpvYmplY3QgdGhpeikKK3sKKyNpZmRlZiBIQVZFX0FORFJPSURfT1MKKyAgICBMT0dEKCJzdG9wXG4iKTsKKyNlbmRpZgorfQorCitzdGF0aWMgdm9pZAorYW5kcm9pZF9tZWRpYV9NdHBTZXJ2ZXJfc2VuZF9vYmplY3RfYWRkZWQoSk5JRW52ICplbnYsIGpvYmplY3QgdGhpeiwgamludCBoYW5kbGUpCit7CisjaWZkZWYgSEFWRV9BTkRST0lEX09TCisgICAgTE9HRCgic2VuZF9vYmplY3RfYWRkZWQgJWRcbiIsIGhhbmRsZSk7CisgICAgTXRwVGhyZWFkICp0aHJlYWQgPSAoTXRwVGhyZWFkICopZW52LT5HZXRJbnRGaWVsZCh0aGl6LCBmaWVsZF9jb250ZXh0KTsKKyAgICBpZiAodGhyZWFkKQorICAgICAgICB0aHJlYWQtPnNlbmRPYmplY3RBZGRlZChoYW5kbGUpOworICAgIGVsc2UKKyAgICAgICAgTE9HRSgic2VuZE9iamVjdEFkZGVkIGNhbGxlZCB3aGlsZSBkaXNjb25uZWN0ZWRcbiIpOworI2VuZGlmCit9CisKK3N0YXRpYyB2b2lkCithbmRyb2lkX21lZGlhX010cFNlcnZlcl9zZW5kX29iamVjdF9yZW1vdmVkKEpOSUVudiAqZW52LCBqb2JqZWN0IHRoaXosIGppbnQgaGFuZGxlKQoreworI2lmZGVmIEhBVkVfQU5EUk9JRF9PUworICAgIExPR0QoInNlbmRfb2JqZWN0X3JlbW92ZWQgJWRcbiIsIGhhbmRsZSk7CisgICAgTXRwVGhyZWFkICp0aHJlYWQgPSAoTXRwVGhyZWFkICopZW52LT5HZXRJbnRGaWVsZCh0aGl6LCBmaWVsZF9jb250ZXh0KTsKKyAgICBpZiAodGhyZWFkKQorICAgICAgICB0aHJlYWQtPnNlbmRPYmplY3RSZW1vdmVkKGhhbmRsZSk7CisgICAgZWxzZQorICAgICAgICBMT0dFKCJzZW5kT2JqZWN0UmVtb3ZlZCBjYWxsZWQgd2hpbGUgZGlzY29ubmVjdGVkXG4iKTsKKyNlbmRpZgorfQorCitzdGF0aWMgdm9pZAorYW5kcm9pZF9tZWRpYV9NdHBTZXJ2ZXJfc2V0X3B0cF9tb2RlKEpOSUVudiAqZW52LCBqb2JqZWN0IHRoaXosIGpib29sZWFuIHVzZVB0cCkKK3sKKyNpZmRlZiBIQVZFX0FORFJPSURfT1MKKyAgICBMT0dEKCJzZXRfcHRwX21vZGVcbiIpOworICAgIE10cFRocmVhZCAqdGhyZWFkID0gKE10cFRocmVhZCAqKWVudi0+R2V0SW50RmllbGQodGhpeiwgZmllbGRfY29udGV4dCk7CisgICAgaWYgKHRocmVhZCkKKyAgICAgICAgdGhyZWFkLT5zZXRQdHBNb2RlKHVzZVB0cCk7CisgI2VuZGlmCit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIEpOSU5hdGl2ZU1ldGhvZCBnTWV0aG9kc1tdID0geworICAgIHsibmF0aXZlX3NldHVwIiwgICAgICAgICAgICAgICAgIihMYW5kcm9pZC9tZWRpYS9NdHBEYXRhYmFzZTtMamF2YS9sYW5nL1N0cmluZzspViIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopYW5kcm9pZF9tZWRpYV9NdHBTZXJ2ZXJfc2V0dXB9LAorICAgIHsibmF0aXZlX2ZpbmFsaXplIiwgICAgICAgICAgICAgIigpViIsICAodm9pZCAqKWFuZHJvaWRfbWVkaWFfTXRwU2VydmVyX2ZpbmFsaXplfSwKKyAgICB7Im5hdGl2ZV9zdGFydCIsICAgICAgICAgICAgICAgICIoKVYiLCAgKHZvaWQgKilhbmRyb2lkX21lZGlhX010cFNlcnZlcl9zdGFydH0sCisgICAgeyJuYXRpdmVfc3RvcCIsICAgICAgICAgICAgICAgICAiKClWIiwgICh2b2lkICopYW5kcm9pZF9tZWRpYV9NdHBTZXJ2ZXJfc3RvcH0sCisgICAgeyJuYXRpdmVfc2VuZF9vYmplY3RfYWRkZWQiLCAgICAiKEkpViIsICh2b2lkICopYW5kcm9pZF9tZWRpYV9NdHBTZXJ2ZXJfc2VuZF9vYmplY3RfYWRkZWR9LAorICAgIHsibmF0aXZlX3NlbmRfb2JqZWN0X3JlbW92ZWQiLCAgIihJKVYiLCAodm9pZCAqKWFuZHJvaWRfbWVkaWFfTXRwU2VydmVyX3NlbmRfb2JqZWN0X3JlbW92ZWR9LAorICAgIHsibmF0aXZlX3NldF9wdHBfbW9kZSIsICAgICAgICAgIihaKVYiLCAodm9pZCAqKWFuZHJvaWRfbWVkaWFfTXRwU2VydmVyX3NldF9wdHBfbW9kZX0sCit9OworCitzdGF0aWMgY29uc3QgY2hhciogY29uc3Qga0NsYXNzUGF0aE5hbWUgPSAiYW5kcm9pZC9tZWRpYS9NdHBTZXJ2ZXIiOworCitpbnQgcmVnaXN0ZXJfYW5kcm9pZF9tZWRpYV9NdHBTZXJ2ZXIoSk5JRW52ICplbnYpCit7CisgICAgamNsYXNzIGNsYXp6OworCisgICAgTE9HRCgicmVnaXN0ZXJfYW5kcm9pZF9tZWRpYV9NdHBTZXJ2ZXJcbiIpOworCisgICAgY2xhenogPSBlbnYtPkZpbmRDbGFzcygiYW5kcm9pZC9tZWRpYS9NdHBTZXJ2ZXIiKTsKKyAgICBpZiAoY2xhenogPT0gTlVMTCkgeworICAgICAgICBMT0dFKCJDYW4ndCBmaW5kIGFuZHJvaWQvbWVkaWEvTXRwU2VydmVyIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgZmllbGRfY29udGV4dCA9IGVudi0+R2V0RmllbGRJRChjbGF6eiwgIm1OYXRpdmVDb250ZXh0IiwgIkkiKTsKKyAgICBpZiAoZmllbGRfY29udGV4dCA9PSBOVUxMKSB7CisgICAgICAgIExPR0UoIkNhbid0IGZpbmQgTXRwU2VydmVyLm1OYXRpdmVDb250ZXh0Iik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICByZXR1cm4gQW5kcm9pZFJ1bnRpbWU6OnJlZ2lzdGVyTmF0aXZlTWV0aG9kcyhlbnYsCisgICAgICAgICAgICAgICAgImFuZHJvaWQvbWVkaWEvTXRwU2VydmVyIiwgZ01ldGhvZHMsIE5FTEVNKGdNZXRob2RzKSk7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL3Zpc3VhbGl6ZXIvQW5kcm9pZC5tayBiL21lZGlhL2xpYmVmZmVjdHMvdmlzdWFsaXplci9BbmRyb2lkLm1rCmluZGV4IDQ4YjQ1ZmYuLmU2ZmY2NTQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvdmlzdWFsaXplci9BbmRyb2lkLm1rCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvdmlzdWFsaXplci9BbmRyb2lkLm1rCkBAIC0yNyw0ICsyNyw0IEBACiAKIExPQ0FMX1BSRUxJTktfTU9EVUxFIDo9IGZhbHNlCiAKLWluY2x1ZGUgJChCVUlMRF9TSEFSRURfTElCUkFSWSkKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCitpbmNsdWRlICQoQlVJTERfU0hBUkVEX0xJQlJBUlkpCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9BdWRpb1N5c3RlbS5jcHAgYi9tZWRpYS9saWJtZWRpYS9BdWRpb1N5c3RlbS5jcHAKaW5kZXggN2UzYjc0My4uOWMyYThiYSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvQXVkaW9TeXN0ZW0uY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhL0F1ZGlvU3lzdGVtLmNwcApAQCAtNzYzLDcgKzc2Myw4IEBACiAgICAgaWYgKChwb3BDb3VudChkZXZpY2UpID09IDEgKSAmJgogICAgICAgICAoZGV2aWNlICYgKEF1ZGlvU3lzdGVtOjpERVZJQ0VfT1VUX0JMVUVUT09USF9TQ08gfAogICAgICAgICAgICAgICAgICAgIEF1ZGlvU3lzdGVtOjpERVZJQ0VfT1VUX0JMVUVUT09USF9TQ09fSEVBRFNFVCB8Ci0gICAgICAgICAgICAgICAgICAgQXVkaW9TeXN0ZW06OkRFVklDRV9PVVRfQkxVRVRPT1RIX1NDT19DQVJLSVQpKSkgeworICAgICAgICAgICAgICAgICAgIEF1ZGlvU3lzdGVtOjpERVZJQ0VfT1VUX0JMVUVUT09USF9TQ09fQ0FSS0lUIHwKKyAgICAgICAgICAgICAgICAgICBBdWRpb1N5c3RlbTo6REVWSUNFX0lOX0JMVUVUT09USF9TQ09fSEVBRFNFVCkpKSB7CiAgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0gZWxzZSB7CiAgICAgICAgIHJldHVybiBmYWxzZTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL0lNZWRpYVBsYXllci5jcHAgYi9tZWRpYS9saWJtZWRpYS9JTWVkaWFQbGF5ZXIuY3BwCmluZGV4IDBmNTViMTlkLi45ZGZkY2IwIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9JTWVkaWFQbGF5ZXIuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhL0lNZWRpYVBsYXllci5jcHAKQEAgLTIyLDEyICsyMiwxNCBAQAogCiAjaW5jbHVkZSA8bWVkaWEvSU1lZGlhUGxheWVyLmg+CiAjaW5jbHVkZSA8c3VyZmFjZWZsaW5nZXIvSVN1cmZhY2UuaD4KKyNpbmNsdWRlIDxzdXJmYWNlZmxpbmdlci9TdXJmYWNlLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogZW51bSB7CiAgICAgRElTQ09OTkVDVCA9IElCaW5kZXI6OkZJUlNUX0NBTExfVFJBTlNBQ1RJT04sCiAgICAgU0VUX1ZJREVPX1NVUkZBQ0UsCisgICAgU0VUX1ZJREVPX0lTVVJGQUNFLAogICAgIFBSRVBBUkVfQVNZTkMsCiAgICAgU1RBUlQsCiAgICAgU1RPUCwKQEAgLTY1LDExICs2NywyMCBAQAogICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoRElTQ09OTkVDVCwgZGF0YSwgJnJlcGx5KTsKICAgICB9CiAKLSAgICBzdGF0dXNfdCBzZXRWaWRlb1N1cmZhY2UoY29uc3Qgc3A8SVN1cmZhY2U+JiBzdXJmYWNlKQorICAgIHN0YXR1c190IHNldFZpZGVvSVN1cmZhY2UoY29uc3Qgc3A8SVN1cmZhY2U+JiBzdXJmYWNlKQogICAgIHsKICAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwogICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSU1lZGlhUGxheWVyOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwogICAgICAgICBkYXRhLndyaXRlU3Ryb25nQmluZGVyKHN1cmZhY2UtPmFzQmluZGVyKCkpOworICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoU0VUX1ZJREVPX0lTVVJGQUNFLCBkYXRhLCAmcmVwbHkpOworICAgICAgICByZXR1cm4gcmVwbHkucmVhZEludDMyKCk7CisgICAgfQorCisgICAgc3RhdHVzX3Qgc2V0VmlkZW9TdXJmYWNlKGNvbnN0IHNwPFN1cmZhY2U+JiBzdXJmYWNlKQorICAgIHsKKyAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OworICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSU1lZGlhUGxheWVyOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworICAgICAgICBTdXJmYWNlOjp3cml0ZVRvUGFyY2VsKHN1cmZhY2UsICZkYXRhKTsKICAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KFNFVF9WSURFT19TVVJGQUNFLCBkYXRhLCAmcmVwbHkpOwogICAgICAgICByZXR1cm4gcmVwbHkucmVhZEludDMyKCk7CiAgICAgfQpAQCAtMjU2LDkgKzI2NywxNSBAQAogICAgICAgICAgICAgZGlzY29ubmVjdCgpOwogICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwogICAgICAgICB9IGJyZWFrOwotICAgICAgICBjYXNlIFNFVF9WSURFT19TVVJGQUNFOiB7CisgICAgICAgIGNhc2UgU0VUX1ZJREVPX0lTVVJGQUNFOiB7CiAgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSU1lZGlhUGxheWVyLCBkYXRhLCByZXBseSk7CiAgICAgICAgICAgICBzcDxJU3VyZmFjZT4gc3VyZmFjZSA9IGludGVyZmFjZV9jYXN0PElTdXJmYWNlPihkYXRhLnJlYWRTdHJvbmdCaW5kZXIoKSk7CisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzZXRWaWRlb0lTdXJmYWNlKHN1cmZhY2UpKTsKKyAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgfSBicmVhazsKKyAgICAgICAgY2FzZSBTRVRfVklERU9fU1VSRkFDRTogeworICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElNZWRpYVBsYXllciwgZGF0YSwgcmVwbHkpOworICAgICAgICAgICAgc3A8U3VyZmFjZT4gc3VyZmFjZSA9IFN1cmZhY2U6OnJlYWRGcm9tUGFyY2VsKGRhdGEpOwogICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc2V0VmlkZW9TdXJmYWNlKHN1cmZhY2UpKTsKICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKICAgICAgICAgfSBicmVhazsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL0lNZWRpYVJlY29yZGVyLmNwcCBiL21lZGlhL2xpYm1lZGlhL0lNZWRpYVJlY29yZGVyLmNwcAppbmRleCA5NDdmZjM0Li41OWNkMWI3IDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9JTWVkaWFSZWNvcmRlci5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWEvSU1lZGlhUmVjb3JkZXIuY3BwCkBAIC0xOSw3ICsxOSw3IEBACiAjZGVmaW5lIExPR19UQUcgIklNZWRpYVJlY29yZGVyIgogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogI2luY2x1ZGUgPGJpbmRlci9QYXJjZWwuaD4KLSNpbmNsdWRlIDxzdXJmYWNlZmxpbmdlci9JU3VyZmFjZS5oPgorI2luY2x1ZGUgPHN1cmZhY2VmbGluZ2VyL1N1cmZhY2UuaD4KICNpbmNsdWRlIDxjYW1lcmEvSUNhbWVyYS5oPgogI2luY2x1ZGUgPG1lZGlhL0lNZWRpYVJlY29yZGVyQ2xpZW50Lmg+CiAjaW5jbHVkZSA8bWVkaWEvSU1lZGlhUmVjb3JkZXIuaD4KQEAgLTQzLDYgKzQzLDcgQEAKICAgICBTRVRfQVVESU9fRU5DT0RFUiwKICAgICBTRVRfT1VUUFVUX0ZJTEVfUEFUSCwKICAgICBTRVRfT1VUUFVUX0ZJTEVfRkQsCisgICAgU0VUX09VVFBVVF9GSUxFX0FVWElMSUFSWV9GRCwKICAgICBTRVRfVklERU9fU0laRSwKICAgICBTRVRfVklERU9fRlJBTUVSQVRFLAogICAgIFNFVF9QQVJBTUVURVJTLApAQCAtNjksMTIgKzcwLDEyIEBACiAgICAgICAgIHJldHVybiByZXBseS5yZWFkSW50MzIoKTsKICAgICB9CiAKLSAgICBzdGF0dXNfdCBzZXRQcmV2aWV3U3VyZmFjZShjb25zdCBzcDxJU3VyZmFjZT4mIHN1cmZhY2UpCisgICAgc3RhdHVzX3Qgc2V0UHJldmlld1N1cmZhY2UoY29uc3Qgc3A8U3VyZmFjZT4mIHN1cmZhY2UpCiAgICAgewogICAgICAgICBMT0dWKCJzZXRQcmV2aWV3U3VyZmFjZSglcCkiLCBzdXJmYWNlLmdldCgpKTsKICAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwogICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSU1lZGlhUmVjb3JkZXI6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7Ci0gICAgICAgIGRhdGEud3JpdGVTdHJvbmdCaW5kZXIoc3VyZmFjZS0+YXNCaW5kZXIoKSk7CisgICAgICAgIFN1cmZhY2U6OndyaXRlVG9QYXJjZWwoc3VyZmFjZSwgJmRhdGEpOwogICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoU0VUX1BSRVZJRVdfU1VSRkFDRSwgZGF0YSwgJnJlcGx5KTsKICAgICAgICAgcmV0dXJuIHJlcGx5LnJlYWRJbnQzMigpOwogICAgIH0KQEAgLTE1OSw2ICsxNjAsMTUgQEAKICAgICAgICAgcmV0dXJuIHJlcGx5LnJlYWRJbnQzMigpOwogICAgIH0KIAorICAgIHN0YXR1c190IHNldE91dHB1dEZpbGVBdXhpbGlhcnkoaW50IGZkKSB7CisgICAgICAgIExPR1YoInNldE91dHB1dEZpbGVBdXhpbGlhcnkoJWQpIiwgZmQpOworICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CisgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJTWVkaWFSZWNvcmRlcjo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKKyAgICAgICAgZGF0YS53cml0ZUZpbGVEZXNjcmlwdG9yKGZkKTsKKyAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KFNFVF9PVVRQVVRfRklMRV9BVVhJTElBUllfRkQsIGRhdGEsICZyZXBseSk7CisgICAgICAgIHJldHVybiByZXBseS5yZWFkSW50MzIoKTsKKyAgICB9CisKICAgICBzdGF0dXNfdCBzZXRWaWRlb1NpemUoaW50IHdpZHRoLCBpbnQgaGVpZ2h0KQogICAgIHsKICAgICAgICAgTE9HVigic2V0VmlkZW9TaXplKCVkeCVkKSIsIHdpZHRoLCBoZWlnaHQpOwpAQCAtMzc3LDYgKzM4NywxMyBAQAogICAgICAgICAgICAgOjpjbG9zZShmZCk7CiAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CiAgICAgICAgIH0gYnJlYWs7CisgICAgICAgIGNhc2UgU0VUX09VVFBVVF9GSUxFX0FVWElMSUFSWV9GRDogeworICAgICAgICAgICAgTE9HVigiU0VUX09VVFBVVF9GSUxFX0FVWElMSUFSWV9GRCIpOworICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElNZWRpYVJlY29yZGVyLCBkYXRhLCByZXBseSk7CisgICAgICAgICAgICBpbnQgZmQgPSBkdXAoZGF0YS5yZWFkRmlsZURlc2NyaXB0b3IoKSk7CisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzZXRPdXRwdXRGaWxlQXV4aWxpYXJ5KGZkKSk7CisgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgIH0gYnJlYWs7CiAgICAgICAgIGNhc2UgU0VUX1ZJREVPX1NJWkU6IHsKICAgICAgICAgICAgIExPR1YoIlNFVF9WSURFT19TSVpFIik7CiAgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSU1lZGlhUmVjb3JkZXIsIGRhdGEsIHJlcGx5KTsKQEAgLTQwOSw3ICs0MjYsNyBAQAogICAgICAgICBjYXNlIFNFVF9QUkVWSUVXX1NVUkZBQ0U6IHsKICAgICAgICAgICAgIExPR1YoIlNFVF9QUkVWSUVXX1NVUkZBQ0UiKTsKICAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJTWVkaWFSZWNvcmRlciwgZGF0YSwgcmVwbHkpOwotICAgICAgICAgICAgc3A8SVN1cmZhY2U+IHN1cmZhY2UgPSBpbnRlcmZhY2VfY2FzdDxJU3VyZmFjZT4oZGF0YS5yZWFkU3Ryb25nQmluZGVyKCkpOworICAgICAgICAgICAgc3A8U3VyZmFjZT4gc3VyZmFjZSA9IFN1cmZhY2U6OnJlYWRGcm9tUGFyY2VsKGRhdGEpOwogICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc2V0UHJldmlld1N1cmZhY2Uoc3VyZmFjZSkpOwogICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwogICAgICAgICB9IGJyZWFrOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvSU9NWC5jcHAgYi9tZWRpYS9saWJtZWRpYS9JT01YLmNwcAppbmRleCBmMzgwNGI4Li40MDgwMWEyIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9JT01YLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYS9JT01YLmNwcApAQCAtMjEsNyArMjEsOSBAQAogICAgIFNFVF9QQVJBTUVURVIsCiAgICAgR0VUX0NPTkZJRywKICAgICBTRVRfQ09ORklHLAorICAgIEVOQUJMRV9HUkFQSElDX0JVRkZFUlMsCiAgICAgVVNFX0JVRkZFUiwKKyAgICBVU0VfR1JBUEhJQ19CVUZGRVIsCiAgICAgQUxMT0NfQlVGRkVSLAogICAgIEFMTE9DX0JVRkZFUl9XSVRIX0JBQ0tVUCwKICAgICBGUkVFX0JVRkZFUiwKQEAgLTIxNiw2ICsyMTgsMTkgQEAKICAgICAgICAgcmV0dXJuIHJlcGx5LnJlYWRJbnQzMigpOwogICAgIH0KIAorICAgIHZpcnR1YWwgc3RhdHVzX3QgZW5hYmxlR3JhcGhpY0J1ZmZlcnMoCisgICAgICAgICAgICBub2RlX2lkIG5vZGUsIE9NWF9VMzIgcG9ydF9pbmRleCwgT01YX0JPT0wgZW5hYmxlKSB7CisgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKKyAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElPTVg6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CisgICAgICAgIGRhdGEud3JpdGVJbnRQdHIoKGludHB0cl90KW5vZGUpOworICAgICAgICBkYXRhLndyaXRlSW50MzIocG9ydF9pbmRleCk7CisgICAgICAgIGRhdGEud3JpdGVJbnQzMigodWludDMyX3QpZW5hYmxlKTsKKyAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KEVOQUJMRV9HUkFQSElDX0JVRkZFUlMsIGRhdGEsICZyZXBseSk7CisKKyAgICAgICAgc3RhdHVzX3QgZXJyID0gcmVwbHkucmVhZEludDMyKCk7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCiAgICAgdmlydHVhbCBzdGF0dXNfdCB1c2VCdWZmZXIoCiAgICAgICAgICAgICBub2RlX2lkIG5vZGUsIE9NWF9VMzIgcG9ydF9pbmRleCwgY29uc3Qgc3A8SU1lbW9yeT4gJnBhcmFtcywKICAgICAgICAgICAgIGJ1ZmZlcl9pZCAqYnVmZmVyKSB7CkBAIC0yMzgsNiArMjUzLDI5IEBACiAgICAgICAgIHJldHVybiBlcnI7CiAgICAgfQogCisKKyAgICB2aXJ0dWFsIHN0YXR1c190IHVzZUdyYXBoaWNCdWZmZXIoCisgICAgICAgICAgICBub2RlX2lkIG5vZGUsIE9NWF9VMzIgcG9ydF9pbmRleCwKKyAgICAgICAgICAgIGNvbnN0IHNwPEdyYXBoaWNCdWZmZXI+ICZncmFwaGljQnVmZmVyLCBidWZmZXJfaWQgKmJ1ZmZlcikgeworICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CisgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJT01YOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworICAgICAgICBkYXRhLndyaXRlSW50UHRyKChpbnRwdHJfdClub2RlKTsKKyAgICAgICAgZGF0YS53cml0ZUludDMyKHBvcnRfaW5kZXgpOworICAgICAgICBkYXRhLndyaXRlKCpncmFwaGljQnVmZmVyKTsKKyAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KFVTRV9HUkFQSElDX0JVRkZFUiwgZGF0YSwgJnJlcGx5KTsKKworICAgICAgICBzdGF0dXNfdCBlcnIgPSByZXBseS5yZWFkSW50MzIoKTsKKyAgICAgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICAgICAgKmJ1ZmZlciA9IDA7CisKKyAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgIH0KKworICAgICAgICAqYnVmZmVyID0gKHZvaWQqKXJlcGx5LnJlYWRJbnRQdHIoKTsKKworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKwogICAgIHZpcnR1YWwgc3RhdHVzX3QgYWxsb2NhdGVCdWZmZXIoCiAgICAgICAgICAgICBub2RlX2lkIG5vZGUsIE9NWF9VMzIgcG9ydF9pbmRleCwgc2l6ZV90IHNpemUsCiAgICAgICAgICAgICBidWZmZXJfaWQgKmJ1ZmZlciwgdm9pZCAqKmJ1ZmZlcl9kYXRhKSB7CkBAIC01NDEsNiArNTc5LDIwIEBACiAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CiAgICAgICAgIH0KIAorICAgICAgICBjYXNlIEVOQUJMRV9HUkFQSElDX0JVRkZFUlM6CisgICAgICAgIHsKKyAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJT01YLCBkYXRhLCByZXBseSk7CisKKyAgICAgICAgICAgIG5vZGVfaWQgbm9kZSA9ICh2b2lkKilkYXRhLnJlYWRJbnRQdHIoKTsKKyAgICAgICAgICAgIE9NWF9VMzIgcG9ydF9pbmRleCA9IGRhdGEucmVhZEludDMyKCk7CisgICAgICAgICAgICBPTVhfQk9PTCBlbmFibGUgPSAoT01YX0JPT0wpZGF0YS5yZWFkSW50MzIoKTsKKworICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0gZW5hYmxlR3JhcGhpY0J1ZmZlcnMobm9kZSwgcG9ydF9pbmRleCwgZW5hYmxlKTsKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKGVycik7CisKKyAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgfQorCiAgICAgICAgIGNhc2UgVVNFX0JVRkZFUjoKICAgICAgICAgewogICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElPTVgsIGRhdGEsIHJlcGx5KTsKQEAgLTU2MSw2ICs2MTMsMjcgQEAKICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKICAgICAgICAgfQogCisgICAgICAgIGNhc2UgVVNFX0dSQVBISUNfQlVGRkVSOgorICAgICAgICB7CisgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSU9NWCwgZGF0YSwgcmVwbHkpOworCisgICAgICAgICAgICBub2RlX2lkIG5vZGUgPSAodm9pZCopZGF0YS5yZWFkSW50UHRyKCk7CisgICAgICAgICAgICBPTVhfVTMyIHBvcnRfaW5kZXggPSBkYXRhLnJlYWRJbnQzMigpOworICAgICAgICAgICAgc3A8R3JhcGhpY0J1ZmZlcj4gZ3JhcGhpY0J1ZmZlciA9IG5ldyBHcmFwaGljQnVmZmVyKCk7CisgICAgICAgICAgICBkYXRhLnJlYWQoKmdyYXBoaWNCdWZmZXIpOworCisgICAgICAgICAgICBidWZmZXJfaWQgYnVmZmVyOworICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0gdXNlR3JhcGhpY0J1ZmZlcigKKyAgICAgICAgICAgICAgICAgICAgbm9kZSwgcG9ydF9pbmRleCwgZ3JhcGhpY0J1ZmZlciwgJmJ1ZmZlcik7CisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihlcnIpOworCisgICAgICAgICAgICBpZiAoZXJyID09IE9LKSB7CisgICAgICAgICAgICAgICAgcmVwbHktPndyaXRlSW50UHRyKChpbnRwdHJfdClidWZmZXIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgIH0KKwogICAgICAgICBjYXNlIEFMTE9DX0JVRkZFUjoKICAgICAgICAgewogICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElPTVgsIGRhdGEsIHJlcGx5KTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL01lZGlhUHJvZmlsZXMuY3BwIGIvbWVkaWEvbGlibWVkaWEvTWVkaWFQcm9maWxlcy5jcHAKaW5kZXggMzg2OTM4OS4uNjQ1YzE2MyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvTWVkaWFQcm9maWxlcy5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWEvTWVkaWFQcm9maWxlcy5jcHAKQEAgLTU5LDggKzU5LDIxIEBACiB9OwogCiBjb25zdCBNZWRpYVByb2ZpbGVzOjpOYW1lVG9UYWdNYXAgTWVkaWFQcm9maWxlczo6c0NhbWNvcmRlclF1YWxpdHlOYW1lTWFwW10gPSB7CisgICAgeyJsb3ciLCBDQU1DT1JERVJfUVVBTElUWV9MT1d9LAogICAgIHsiaGlnaCIsIENBTUNPUkRFUl9RVUFMSVRZX0hJR0h9LAotICAgIHsibG93IiwgIENBTUNPUkRFUl9RVUFMSVRZX0xPV30KKyAgICB7InFjaWYiLCBDQU1DT1JERVJfUVVBTElUWV9RQ0lGfSwKKyAgICB7ImNpZiIsIENBTUNPUkRFUl9RVUFMSVRZX0NJRn0sCisgICAgeyI0ODBwIiwgQ0FNQ09SREVSX1FVQUxJVFlfNDgwUH0sCisgICAgeyI3MjBwIiwgQ0FNQ09SREVSX1FVQUxJVFlfNzIwUH0sCisgICAgeyIxMDgwcCIsIENBTUNPUkRFUl9RVUFMSVRZXzEwODBQfSwKKworICAgIHsidGltZWxhcHNlbG93IiwgIENBTUNPUkRFUl9RVUFMSVRZX1RJTUVfTEFQU0VfTE9XfSwKKyAgICB7InRpbWVsYXBzZWhpZ2giLCBDQU1DT1JERVJfUVVBTElUWV9USU1FX0xBUFNFX0hJR0h9LAorICAgIHsidGltZWxhcHNlcWNpZiIsIENBTUNPUkRFUl9RVUFMSVRZX1RJTUVfTEFQU0VfUUNJRn0sCisgICAgeyJ0aW1lbGFwc2VjaWYiLCBDQU1DT1JERVJfUVVBTElUWV9USU1FX0xBUFNFX0NJRn0sCisgICAgeyJ0aW1lbGFwc2U0ODBwIiwgQ0FNQ09SREVSX1FVQUxJVFlfVElNRV9MQVBTRV80ODBQfSwKKyAgICB7InRpbWVsYXBzZTcyMHAiLCBDQU1DT1JERVJfUVVBTElUWV9USU1FX0xBUFNFXzcyMFB9LAorICAgIHsidGltZWxhcHNlMTA4MHAiLCBDQU1DT1JERVJfUVVBTElUWV9USU1FX0xBUFNFXzEwODBQfQogfTsKIAogLypzdGF0aWMqLyB2b2lkCkBAIC00MTEsNiArNDI0LDQwIEBACiB9CiAKIC8qc3RhdGljKi8gTWVkaWFQcm9maWxlczo6Q2FtY29yZGVyUHJvZmlsZSoKK01lZGlhUHJvZmlsZXM6OmNyZWF0ZURlZmF1bHRDYW1jb3JkZXJUaW1lTGFwc2VIaWdoUHJvZmlsZSgpCit7CisgICAgTWVkaWFQcm9maWxlczo6VmlkZW9Db2RlYyAqdmlkZW9Db2RlYyA9CisgICAgICAgIG5ldyBNZWRpYVByb2ZpbGVzOjpWaWRlb0NvZGVjKFZJREVPX0VOQ09ERVJfSDI2MywgMjAwMDAwMDAsIDcyMCwgNDgwLCAyMCk7CisKKyAgICBBdWRpb0NvZGVjICphdWRpb0NvZGVjID0gbmV3IEF1ZGlvQ29kZWMoQVVESU9fRU5DT0RFUl9BTVJfTkIsIDEyMjAwLCA4MDAwLCAxKTsKKyAgICBDYW1jb3JkZXJQcm9maWxlICpwcm9maWxlID0gbmV3IE1lZGlhUHJvZmlsZXM6OkNhbWNvcmRlclByb2ZpbGU7CisgICAgcHJvZmlsZS0+bUNhbWVyYUlkID0gMDsKKyAgICBwcm9maWxlLT5tRmlsZUZvcm1hdCA9IE9VVFBVVF9GT1JNQVRfVEhSRUVfR1BQOworICAgIHByb2ZpbGUtPm1RdWFsaXR5ID0gQ0FNQ09SREVSX1FVQUxJVFlfVElNRV9MQVBTRV9ISUdIOworICAgIHByb2ZpbGUtPm1EdXJhdGlvbiA9IDYwOworICAgIHByb2ZpbGUtPm1WaWRlb0NvZGVjID0gdmlkZW9Db2RlYzsKKyAgICBwcm9maWxlLT5tQXVkaW9Db2RlYyA9IGF1ZGlvQ29kZWM7CisgICAgcmV0dXJuIHByb2ZpbGU7Cit9CisKKy8qc3RhdGljKi8gTWVkaWFQcm9maWxlczo6Q2FtY29yZGVyUHJvZmlsZSoKK01lZGlhUHJvZmlsZXM6OmNyZWF0ZURlZmF1bHRDYW1jb3JkZXJUaW1lTGFwc2VMb3dQcm9maWxlKCkKK3sKKyAgICBNZWRpYVByb2ZpbGVzOjpWaWRlb0NvZGVjICp2aWRlb0NvZGVjID0KKyAgICAgICAgbmV3IE1lZGlhUHJvZmlsZXM6OlZpZGVvQ29kZWMoVklERU9fRU5DT0RFUl9IMjYzLCAxMDAwMDAwLCAxNzYsIDE0NCwgMjApOworCisgICAgQXVkaW9Db2RlYyAqYXVkaW9Db2RlYyA9IG5ldyBBdWRpb0NvZGVjKEFVRElPX0VOQ09ERVJfQU1SX05CLCAxMjIwMCwgODAwMCwgMSk7CisgICAgQ2FtY29yZGVyUHJvZmlsZSAqcHJvZmlsZSA9IG5ldyBNZWRpYVByb2ZpbGVzOjpDYW1jb3JkZXJQcm9maWxlOworICAgIHByb2ZpbGUtPm1DYW1lcmFJZCA9IDA7CisgICAgcHJvZmlsZS0+bUZpbGVGb3JtYXQgPSBPVVRQVVRfRk9STUFUX1RIUkVFX0dQUDsKKyAgICBwcm9maWxlLT5tUXVhbGl0eSA9IENBTUNPUkRFUl9RVUFMSVRZX1RJTUVfTEFQU0VfTE9XOworICAgIHByb2ZpbGUtPm1EdXJhdGlvbiA9IDYwOworICAgIHByb2ZpbGUtPm1WaWRlb0NvZGVjID0gdmlkZW9Db2RlYzsKKyAgICBwcm9maWxlLT5tQXVkaW9Db2RlYyA9IGF1ZGlvQ29kZWM7CisgICAgcmV0dXJuIHByb2ZpbGU7Cit9CisKKy8qc3RhdGljKi8gTWVkaWFQcm9maWxlczo6Q2FtY29yZGVyUHJvZmlsZSoKIE1lZGlhUHJvZmlsZXM6OmNyZWF0ZURlZmF1bHRDYW1jb3JkZXJIaWdoUHJvZmlsZSgpCiB7CiAgICAgTWVkaWFQcm9maWxlczo6VmlkZW9Db2RlYyAqdmlkZW9Db2RlYyA9CkBAIC00NDksNiArNDk2LDggQEAKIC8qc3RhdGljKi8gdm9pZAogTWVkaWFQcm9maWxlczo6Y3JlYXRlRGVmYXVsdENhbWNvcmRlclByb2ZpbGVzKE1lZGlhUHJvZmlsZXMgKnByb2ZpbGVzKQogeworICAgIHByb2ZpbGVzLT5tQ2FtY29yZGVyUHJvZmlsZXMuYWRkKGNyZWF0ZURlZmF1bHRDYW1jb3JkZXJUaW1lTGFwc2VIaWdoUHJvZmlsZSgpKTsKKyAgICBwcm9maWxlcy0+bUNhbWNvcmRlclByb2ZpbGVzLmFkZChjcmVhdGVEZWZhdWx0Q2FtY29yZGVyVGltZUxhcHNlTG93UHJvZmlsZSgpKTsKICAgICBwcm9maWxlcy0+bUNhbWNvcmRlclByb2ZpbGVzLmFkZChjcmVhdGVEZWZhdWx0Q2FtY29yZGVySGlnaFByb2ZpbGUoKSk7CiAgICAgcHJvZmlsZXMtPm1DYW1jb3JkZXJQcm9maWxlcy5hZGQoY3JlYXRlRGVmYXVsdENhbWNvcmRlckxvd1Byb2ZpbGUoKSk7CiB9CkBAIC02NjgsMTMgKzcxNyw4IEBACiAgICAgcmV0dXJuIGRlY29kZXJzOyAgLy8gY29weSBvdXQKIH0KIAotaW50IE1lZGlhUHJvZmlsZXM6OmdldENhbWNvcmRlclByb2ZpbGVQYXJhbUJ5TmFtZShjb25zdCBjaGFyICpuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2FtZXJhSWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbWNvcmRlcl9xdWFsaXR5IHF1YWxpdHkpIGNvbnN0CitpbnQgTWVkaWFQcm9maWxlczo6Z2V0Q2FtY29yZGVyUHJvZmlsZUluZGV4KGludCBjYW1lcmFJZCwgY2FtY29yZGVyX3F1YWxpdHkgcXVhbGl0eSkgY29uc3QKIHsKLSAgICBMT0dWKCJnZXRDYW1jb3JkZXJQcm9maWxlUGFyYW1CeU5hbWU6ICVzIGZvciBjYW1lcmEgJWQsIHF1YWxpdHkgJWQiLAotICAgICAgICAgbmFtZSwgY2FtZXJhSWQsIHF1YWxpdHkpOwotCiAgICAgaW50IGluZGV4ID0gLTE7CiAgICAgZm9yIChzaXplX3QgaSA9IDAsIG4gPSBtQ2FtY29yZGVyUHJvZmlsZXMuc2l6ZSgpOyBpIDwgbjsgKytpKSB7CiAgICAgICAgIGlmIChtQ2FtY29yZGVyUHJvZmlsZXNbaV0tPm1DYW1lcmFJZCA9PSBjYW1lcmFJZCAmJgpAQCAtNjgzLDYgKzcyNywxNyBAQAogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KICAgICB9CisgICAgcmV0dXJuIGluZGV4OworfQorCitpbnQgTWVkaWFQcm9maWxlczo6Z2V0Q2FtY29yZGVyUHJvZmlsZVBhcmFtQnlOYW1lKGNvbnN0IGNoYXIgKm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjYW1lcmFJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FtY29yZGVyX3F1YWxpdHkgcXVhbGl0eSkgY29uc3QKK3sKKyAgICBMT0dWKCJnZXRDYW1jb3JkZXJQcm9maWxlUGFyYW1CeU5hbWU6ICVzIGZvciBjYW1lcmEgJWQsIHF1YWxpdHkgJWQiLAorICAgICAgICAgbmFtZSwgY2FtZXJhSWQsIHF1YWxpdHkpOworCisgICAgaW50IGluZGV4ID0gZ2V0Q2FtY29yZGVyUHJvZmlsZUluZGV4KGNhbWVyYUlkLCBxdWFsaXR5KTsKICAgICBpZiAoaW5kZXggPT0gLTEpIHsKICAgICAgICAgTE9HRSgiVGhlIGdpdmVuIGNhbWNvcmRlciBwcm9maWxlIGNhbWVyYSAlZCBxdWFsaXR5ICVkIGlzIG5vdCBmb3VuZCIsCiAgICAgICAgICAgICAgY2FtZXJhSWQsIHF1YWxpdHkpOwpAQCAtNzA1LDYgKzc2MCwxMSBAQAogICAgIHJldHVybiAtMTsKIH0KIAorYm9vbCBNZWRpYVByb2ZpbGVzOjpoYXNDYW1jb3JkZXJQcm9maWxlKGludCBjYW1lcmFJZCwgY2FtY29yZGVyX3F1YWxpdHkgcXVhbGl0eSkgY29uc3QKK3sKKyAgICByZXR1cm4gKGdldENhbWNvcmRlclByb2ZpbGVJbmRleChjYW1lcmFJZCwgcXVhbGl0eSkgIT0gLTEpOworfQorCiBWZWN0b3I8aW50PiBNZWRpYVByb2ZpbGVzOjpnZXRJbWFnZUVuY29kaW5nUXVhbGl0eUxldmVscyhpbnQgY2FtZXJhSWQpIGNvbnN0CiB7CiAgICAgVmVjdG9yPGludD4gcmVzdWx0OwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvTWVkaWFTY2FubmVyLmNwcCBiL21lZGlhL2xpYm1lZGlhL01lZGlhU2Nhbm5lci5jcHAKaW5kZXggYzUxMTJhNS4uYzMxYjYyMiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvTWVkaWFTY2FubmVyLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYS9NZWRpYVNjYW5uZXIuY3BwCkBAIC00OCw4ICs0OCw3IEBACiB9CiAKIHN0YXR1c190IE1lZGlhU2Nhbm5lcjo6cHJvY2Vzc0RpcmVjdG9yeSgKLSAgICAgICAgY29uc3QgY2hhciAqcGF0aCwgY29uc3QgY2hhciAqZXh0ZW5zaW9ucywKLSAgICAgICAgTWVkaWFTY2FubmVyQ2xpZW50ICZjbGllbnQsCisgICAgICAgIGNvbnN0IGNoYXIgKnBhdGgsIE1lZGlhU2Nhbm5lckNsaWVudCAmY2xpZW50LAogICAgICAgICBFeGNlcHRpb25DaGVjayBleGNlcHRpb25DaGVjaywgdm9pZCAqZXhjZXB0aW9uRW52KSB7CiAgICAgaW50IHBhdGhMZW5ndGggPSBzdHJsZW4ocGF0aCk7CiAgICAgaWYgKHBhdGhMZW5ndGggPj0gUEFUSF9NQVgpIHsKQEAgLTcyLDM1ICs3MSwxNiBAQAogCiAgICAgc3RhdHVzX3QgcmVzdWx0ID0KICAgICAgICAgZG9Qcm9jZXNzRGlyZWN0b3J5KAotICAgICAgICAgICAgICAgIHBhdGhCdWZmZXIsIHBhdGhSZW1haW5pbmcsIGV4dGVuc2lvbnMsIGNsaWVudCwKLSAgICAgICAgICAgICAgICBleGNlcHRpb25DaGVjaywgZXhjZXB0aW9uRW52KTsKKyAgICAgICAgICAgICAgICBwYXRoQnVmZmVyLCBwYXRoUmVtYWluaW5nLCBjbGllbnQsIGV4Y2VwdGlvbkNoZWNrLCBleGNlcHRpb25FbnYpOwogCiAgICAgZnJlZShwYXRoQnVmZmVyKTsKIAogICAgIHJldHVybiByZXN1bHQ7CiB9CiAKLXN0YXRpYyBib29sIGZpbGVNYXRjaGVzRXh0ZW5zaW9uKGNvbnN0IGNoYXIqIHBhdGgsIGNvbnN0IGNoYXIqIGV4dGVuc2lvbnMpIHsKLSAgICBjb25zdCBjaGFyKiBleHRlbnNpb24gPSBzdHJyY2hyKHBhdGgsICcuJyk7Ci0gICAgaWYgKCFleHRlbnNpb24pIHJldHVybiBmYWxzZTsKLSAgICArK2V4dGVuc2lvbjsgICAgLy8gc2tpcCB0aGUgZG90Ci0gICAgaWYgKGV4dGVuc2lvblswXSA9PSAwKSByZXR1cm4gZmFsc2U7Ci0KLSAgICB3aGlsZSAoZXh0ZW5zaW9uc1swXSkgewotICAgICAgICBjb25zdCBjaGFyKiBjb21tYSA9IHN0cmNocihleHRlbnNpb25zLCAnLCcpOwotICAgICAgICBzaXplX3QgbGVuZ3RoID0gKGNvbW1hID8gY29tbWEgLSBleHRlbnNpb25zIDogc3RybGVuKGV4dGVuc2lvbnMpKTsKLSAgICAgICAgaWYgKGxlbmd0aCA9PSBzdHJsZW4oZXh0ZW5zaW9uKSAmJiBzdHJuY2FzZWNtcChleHRlbnNpb24sIGV4dGVuc2lvbnMsIGxlbmd0aCkgPT0gMCkgcmV0dXJuIHRydWU7Ci0gICAgICAgIGV4dGVuc2lvbnMgKz0gbGVuZ3RoOwotICAgICAgICBpZiAoZXh0ZW5zaW9uc1swXSA9PSAnLCcpICsrZXh0ZW5zaW9uczsKLSAgICB9Ci0KLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KIHN0YXR1c190IE1lZGlhU2Nhbm5lcjo6ZG9Qcm9jZXNzRGlyZWN0b3J5KAotICAgICAgICBjaGFyICpwYXRoLCBpbnQgcGF0aFJlbWFpbmluZywgY29uc3QgY2hhciAqZXh0ZW5zaW9ucywKLSAgICAgICAgTWVkaWFTY2FubmVyQ2xpZW50ICZjbGllbnQsIEV4Y2VwdGlvbkNoZWNrIGV4Y2VwdGlvbkNoZWNrLAotICAgICAgICB2b2lkICpleGNlcHRpb25FbnYpIHsKKyAgICAgICAgY2hhciAqcGF0aCwgaW50IHBhdGhSZW1haW5pbmcsIE1lZGlhU2Nhbm5lckNsaWVudCAmY2xpZW50LAorICAgICAgICBFeGNlcHRpb25DaGVjayBleGNlcHRpb25DaGVjaywgdm9pZCAqZXhjZXB0aW9uRW52KSB7CiAgICAgLy8gcGxhY2UgdG8gY29weSBmaWxlIG9yIGRpcmVjdG9yeSBuYW1lCiAgICAgY2hhciogZmlsZVNwb3QgPSBwYXRoICsgc3RybGVuKHBhdGgpOwogICAgIHN0cnVjdCBkaXJlbnQqIGVudHJ5OwpAQCAtMTMzLDYgKzExMywxMyBAQAogICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgIH0KIAorICAgICAgICBpbnQgbmFtZUxlbmd0aCA9IHN0cmxlbihuYW1lKTsKKyAgICAgICAgaWYgKG5hbWVMZW5ndGggKyAxID4gcGF0aFJlbWFpbmluZykgeworICAgICAgICAgICAgLy8gcGF0aCB0b28gbG9uZyEKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIHN0cmNweShmaWxlU3BvdCwgbmFtZSk7CisKICAgICAgICAgaW50IHR5cGUgPSBlbnRyeS0+ZF90eXBlOwogICAgICAgICBpZiAodHlwZSA9PSBEVF9VTktOT1dOKSB7CiAgICAgICAgICAgICAvLyBJZiB0aGUgdHlwZSBpcyB1bmtub3duLCBzdGF0KCkgdGhlIGZpbGUgaW5zdGVhZC4KQEAgLTE1MCwyOSArMTM3LDIwIEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgaWYgKHR5cGUgPT0gRFRfUkVHIHx8IHR5cGUgPT0gRFRfRElSKSB7Ci0gICAgICAgICAgICBpbnQgbmFtZUxlbmd0aCA9IHN0cmxlbihuYW1lKTsKLSAgICAgICAgICAgIGJvb2wgaXNEaXJlY3RvcnkgPSAodHlwZSA9PSBEVF9ESVIpOwotCi0gICAgICAgICAgICBpZiAobmFtZUxlbmd0aCA+IHBhdGhSZW1haW5pbmcgfHwgKGlzRGlyZWN0b3J5ICYmIG5hbWVMZW5ndGggKyAxID4gcGF0aFJlbWFpbmluZykpIHsKLSAgICAgICAgICAgICAgICAvLyBwYXRoIHRvbyBsb25nIQotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBzdHJjcHkoZmlsZVNwb3QsIG5hbWUpOwotICAgICAgICAgICAgaWYgKGlzRGlyZWN0b3J5KSB7CisgICAgICAgICAgICBpZiAodHlwZSA9PSBEVF9ESVIpIHsKICAgICAgICAgICAgICAgICAvLyBpZ25vcmUgZGlyZWN0b3JpZXMgd2l0aCBhIG5hbWUgdGhhdCBzdGFydHMgd2l0aCAnLicKICAgICAgICAgICAgICAgICAvLyBmb3IgZXhhbXBsZSwgdGhlIE1hYyAiLlRyYXNoZXMiIGRpcmVjdG9yeQogICAgICAgICAgICAgICAgIGlmIChuYW1lWzBdID09ICcuJykgY29udGludWU7CiAKICAgICAgICAgICAgICAgICBzdHJjYXQoZmlsZVNwb3QsICIvIik7Ci0gICAgICAgICAgICAgICAgaW50IGVyciA9IGRvUHJvY2Vzc0RpcmVjdG9yeShwYXRoLCBwYXRoUmVtYWluaW5nIC0gbmFtZUxlbmd0aCAtIDEsIGV4dGVuc2lvbnMsIGNsaWVudCwgZXhjZXB0aW9uQ2hlY2ssIGV4Y2VwdGlvbkVudik7CisgICAgICAgICAgICAgICAgaW50IGVyciA9IGRvUHJvY2Vzc0RpcmVjdG9yeShwYXRoLCBwYXRoUmVtYWluaW5nIC0gbmFtZUxlbmd0aCAtIDEsIGNsaWVudCwgZXhjZXB0aW9uQ2hlY2ssIGV4Y2VwdGlvbkVudik7CiAgICAgICAgICAgICAgICAgaWYgKGVycikgewogICAgICAgICAgICAgICAgICAgICAvLyBwYXNzIGV4Y2VwdGlvbnMgdXAgLSBpZ25vcmUgb3RoZXIgZXJyb3JzCiAgICAgICAgICAgICAgICAgICAgIGlmIChleGNlcHRpb25DaGVjayAmJiBleGNlcHRpb25DaGVjayhleGNlcHRpb25FbnYpKSBnb3RvIGZhaWx1cmU7CiAgICAgICAgICAgICAgICAgICAgIExPR0UoIkVycm9yIHByb2Nlc3NpbmcgJyVzJyAtIHNraXBwaW5nXG4iLCBwYXRoKTsKICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIGlmIChmaWxlTWF0Y2hlc0V4dGVuc2lvbihwYXRoLCBleHRlbnNpb25zKSkgeworICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICBzdHJ1Y3Qgc3RhdCBzdGF0YnVmOwogICAgICAgICAgICAgICAgIHN0YXQocGF0aCwgJnN0YXRidWYpOwogICAgICAgICAgICAgICAgIGlmIChzdGF0YnVmLnN0X3NpemUgPiAwKSB7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9tZWRpYXBsYXllci5jcHAgYi9tZWRpYS9saWJtZWRpYS9tZWRpYXBsYXllci5jcHAKaW5kZXggZjMyMjljMC4uMzJiMjBjNyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvbWVkaWFwbGF5ZXIuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhL21lZGlhcGxheWVyLmNwcApAQCAtMjA2LDEwICsyMDYsMTUgQEAKICAgICBMT0dWKCJzZXRWaWRlb1N1cmZhY2UiKTsKICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwogICAgIGlmIChtUGxheWVyID09IDApIHJldHVybiBOT19JTklUOwotICAgIGlmIChzdXJmYWNlICE9IE5VTEwpCi0gICAgICAgIHJldHVybiAgbVBsYXllci0+c2V0VmlkZW9TdXJmYWNlKHN1cmZhY2UtPmdldElTdXJmYWNlKCkpOwotICAgIGVsc2UKLSAgICAgICAgcmV0dXJuICBtUGxheWVyLT5zZXRWaWRlb1N1cmZhY2UoTlVMTCk7CisKKyAgICBzdGF0dXNfdCBlcnIgPSBtUGxheWVyLT5zZXRWaWRlb0lTdXJmYWNlKAorICAgICAgICAgICAgc3VyZmFjZSA9PSBOVUxMID8gTlVMTCA6IHN1cmZhY2UtPmdldElTdXJmYWNlKCkpOworCisgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKworICAgIHJldHVybiBtUGxheWVyLT5zZXRWaWRlb1N1cmZhY2Uoc3VyZmFjZSk7CiB9CiAKIC8vIG11c3QgY2FsbCB3aXRoIGxvY2sgaGVsZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvbWVkaWFyZWNvcmRlci5jcHAgYi9tZWRpYS9saWJtZWRpYS9tZWRpYXJlY29yZGVyLmNwcAppbmRleCA5ZDUzYzI1Li41MWQ5MWZlIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9tZWRpYXJlY29yZGVyLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYS9tZWRpYXJlY29yZGVyLmNwcApAQCAtNjUsNyArNjUsNyBAQAogICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgfQogCi0gICAgc3RhdHVzX3QgcmV0ID0gbU1lZGlhUmVjb3JkZXItPnNldFByZXZpZXdTdXJmYWNlKHN1cmZhY2UtPmdldElTdXJmYWNlKCkpOworICAgIHN0YXR1c190IHJldCA9IG1NZWRpYVJlY29yZGVyLT5zZXRQcmV2aWV3U3VyZmFjZShzdXJmYWNlKTsKICAgICBpZiAoT0sgIT0gcmV0KSB7CiAgICAgICAgIExPR1YoInNldFByZXZpZXdTdXJmYWNlIGZhaWxlZDogJWQiLCByZXQpOwogICAgICAgICBtQ3VycmVudFN0YXRlID0gTUVESUFfUkVDT1JERVJfRVJST1I7CkBAIC0zMDgsNiArMzA4LDMyIEBACiAgICAgcmV0dXJuIHJldDsKIH0KIAorc3RhdHVzX3QgTWVkaWFSZWNvcmRlcjo6c2V0T3V0cHV0RmlsZUF1eGlsaWFyeShpbnQgZmQpCit7CisgICAgTE9HVigic2V0T3V0cHV0RmlsZUF1eGlsaWFyeSglZCkiLCBmZCk7CisgICAgaWYobU1lZGlhUmVjb3JkZXIgPT0gTlVMTCkgeworICAgICAgICBMT0dFKCJtZWRpYSByZWNvcmRlciBpcyBub3QgaW5pdGlhbGl6ZWQgeWV0Iik7CisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9CisgICAgaWYgKG1Jc0F1eGlsaWFyeU91dHB1dEZpbGVTZXQpIHsKKyAgICAgICAgTE9HRSgib3V0cHV0IGZpbGUgaGFzIGFscmVhZHkgYmVlbiBzZXQiKTsKKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KKyAgICBpZiAoIShtQ3VycmVudFN0YXRlICYgTUVESUFfUkVDT1JERVJfREFUQVNPVVJDRV9DT05GSUdVUkVEKSkgeworICAgICAgICBMT0dFKCJzZXRPdXRwdXRGaWxlIGNhbGxlZCBpbiBhbiBpbnZhbGlkIHN0YXRlKCVkKSIsIG1DdXJyZW50U3RhdGUpOworICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorCisgICAgc3RhdHVzX3QgcmV0ID0gbU1lZGlhUmVjb3JkZXItPnNldE91dHB1dEZpbGVBdXhpbGlhcnkoZmQpOworICAgIGlmIChPSyAhPSByZXQpIHsKKyAgICAgICAgTE9HVigic2V0T3V0cHV0RmlsZUF1eGlsaWFyeSBmYWlsZWQ6ICVkIiwgcmV0KTsKKyAgICAgICAgbUN1cnJlbnRTdGF0ZSA9IE1FRElBX1JFQ09SREVSX0VSUk9SOworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKyAgICBtSXNBdXhpbGlhcnlPdXRwdXRGaWxlU2V0ID0gdHJ1ZTsKKyAgICByZXR1cm4gcmV0OworfQorCiBzdGF0dXNfdCBNZWRpYVJlY29yZGVyOjpzZXRWaWRlb1NpemUoaW50IHdpZHRoLCBpbnQgaGVpZ2h0KQogewogICAgIExPR1YoInNldFZpZGVvU2l6ZSglZCwgJWQpIiwgd2lkdGgsIGhlaWdodCk7CkBAIC01NzEsNiArNTk3LDcgQEAKICAgICBtSXNBdWRpb0VuY29kZXJTZXQgPSBmYWxzZTsKICAgICBtSXNWaWRlb0VuY29kZXJTZXQgPSBmYWxzZTsKICAgICBtSXNPdXRwdXRGaWxlU2V0ICAgPSBmYWxzZTsKKyAgICBtSXNBdXhpbGlhcnlPdXRwdXRGaWxlU2V0ID0gZmFsc2U7CiB9CiAKIC8vIFJlbGVhc2Ugc2hvdWxkIGJlIE9LIGluIGFueSBzdGF0ZQpAQCAtNjQzLDQgKzY3MCwzIEBACiB9CiAKIH07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9NZWRpYVBsYXllclNlcnZpY2UuY3BwIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL01lZGlhUGxheWVyU2VydmljZS5jcHAKaW5kZXggYWJhNWY1Mi4uZmZlMTk4MyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL01lZGlhUGxheWVyU2VydmljZS5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL01lZGlhUGxheWVyU2VydmljZS5jcHAKQEAgLTg4OSw3ICs4ODksMTUgQEAKICAgICByZXR1cm4gbVN0YXR1czsKIH0KIAotc3RhdHVzX3QgTWVkaWFQbGF5ZXJTZXJ2aWNlOjpDbGllbnQ6OnNldFZpZGVvU3VyZmFjZShjb25zdCBzcDxJU3VyZmFjZT4mIHN1cmZhY2UpCitzdGF0dXNfdCBNZWRpYVBsYXllclNlcnZpY2U6OkNsaWVudDo6c2V0VmlkZW9JU3VyZmFjZShjb25zdCBzcDxJU3VyZmFjZT4mIHN1cmZhY2UpCit7CisgICAgTE9HVigiWyVkXSBzZXRWaWRlb0lTdXJmYWNlKCVwKSIsIG1Db25uSWQsIHN1cmZhY2UuZ2V0KCkpOworICAgIHNwPE1lZGlhUGxheWVyQmFzZT4gcCA9IGdldFBsYXllcigpOworICAgIGlmIChwID09IDApIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgIHJldHVybiBwLT5zZXRWaWRlb0lTdXJmYWNlKHN1cmZhY2UpOworfQorCitzdGF0dXNfdCBNZWRpYVBsYXllclNlcnZpY2U6OkNsaWVudDo6c2V0VmlkZW9TdXJmYWNlKGNvbnN0IHNwPFN1cmZhY2U+JiBzdXJmYWNlKQogewogICAgIExPR1YoIlslZF0gc2V0VmlkZW9TdXJmYWNlKCVwKSIsIG1Db25uSWQsIHN1cmZhY2UuZ2V0KCkpOwogICAgIHNwPE1lZGlhUGxheWVyQmFzZT4gcCA9IGdldFBsYXllcigpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL01lZGlhUGxheWVyU2VydmljZS5oIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL01lZGlhUGxheWVyU2VydmljZS5oCmluZGV4IGE5NjdlZTIuLmRlYjQ1OGMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9NZWRpYVBsYXllclNlcnZpY2UuaAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvTWVkaWFQbGF5ZXJTZXJ2aWNlLmgKQEAgLTIwNCw3ICsyMDQsOCBAQAogCiAgICAgICAgIC8vIElNZWRpYVBsYXllciBpbnRlcmZhY2UKICAgICAgICAgdmlydHVhbCB2b2lkICAgICAgICAgICAgZGlzY29ubmVjdCgpOwotICAgICAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgICBzZXRWaWRlb1N1cmZhY2UoY29uc3Qgc3A8SVN1cmZhY2U+JiBzdXJmYWNlKTsKKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCAgICAgICAgc2V0VmlkZW9JU3VyZmFjZShjb25zdCBzcDxJU3VyZmFjZT4mIHN1cmZhY2UpOworICAgICAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgICBzZXRWaWRlb1N1cmZhY2UoY29uc3Qgc3A8U3VyZmFjZT4mIHN1cmZhY2UpOwogICAgICAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgICBwcmVwYXJlQXN5bmMoKTsKICAgICAgICAgdmlydHVhbCBzdGF0dXNfdCAgICAgICAgc3RhcnQoKTsKICAgICAgICAgdmlydHVhbCBzdGF0dXNfdCAgICAgICAgc3RvcCgpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL01lZGlhUmVjb3JkZXJDbGllbnQuY3BwIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL01lZGlhUmVjb3JkZXJDbGllbnQuY3BwCmluZGV4IDE5OTE1ZjEuLmJlNmE4YmUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9NZWRpYVJlY29yZGVyQ2xpZW50LmNwcAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvTWVkaWFSZWNvcmRlckNsaWVudC5jcHAKQEAgLTcwLDcgKzcwLDcgQEAKICAgICByZXR1cm4gbVJlY29yZGVyLT5zZXRDYW1lcmEoY2FtZXJhKTsKIH0KIAotc3RhdHVzX3QgTWVkaWFSZWNvcmRlckNsaWVudDo6c2V0UHJldmlld1N1cmZhY2UoY29uc3Qgc3A8SVN1cmZhY2U+JiBzdXJmYWNlKQorc3RhdHVzX3QgTWVkaWFSZWNvcmRlckNsaWVudDo6c2V0UHJldmlld1N1cmZhY2UoY29uc3Qgc3A8U3VyZmFjZT4mIHN1cmZhY2UpCiB7CiAgICAgTE9HVigic2V0UHJldmlld1N1cmZhY2UiKTsKICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7CkBAIC0xNjQsNiArMTY0LDE3IEBACiAgICAgcmV0dXJuIG1SZWNvcmRlci0+c2V0T3V0cHV0RmlsZShmZCwgb2Zmc2V0LCBsZW5ndGgpOwogfQogCitzdGF0dXNfdCBNZWRpYVJlY29yZGVyQ2xpZW50OjpzZXRPdXRwdXRGaWxlQXV4aWxpYXJ5KGludCBmZCkKK3sKKyAgICBMT0dWKCJzZXRPdXRwdXRGaWxlQXV4aWxpYXJ5KCVkKSIsIGZkKTsKKyAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7CisgICAgaWYgKG1SZWNvcmRlciA9PSBOVUxMKSB7CisgICAgICAgIExPR0UoInJlY29yZGVyIGlzIG5vdCBpbml0aWFsaXplZCIpOworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisgICAgcmV0dXJuIG1SZWNvcmRlci0+c2V0T3V0cHV0RmlsZUF1eGlsaWFyeShmZCk7Cit9CisKIHN0YXR1c190IE1lZGlhUmVjb3JkZXJDbGllbnQ6OnNldFZpZGVvU2l6ZShpbnQgd2lkdGgsIGludCBoZWlnaHQpCiB7CiAgICAgTE9HVigic2V0VmlkZW9TaXplKCVkeCVkKSIsIHdpZHRoLCBoZWlnaHQpOwpAQCAtMzM3LDQgKzM0OCwzIEBACiB9CiAKIH07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9NZWRpYVJlY29yZGVyQ2xpZW50LmggYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvTWVkaWFSZWNvcmRlckNsaWVudC5oCmluZGV4IDFkMTkxM2QuLmZkZWQ5OGUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9NZWRpYVJlY29yZGVyQ2xpZW50LmgKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL01lZGlhUmVjb3JkZXJDbGllbnQuaApAQCAtMjksNyArMjksNyBAQAogewogcHVibGljOgogICAgIHZpcnR1YWwgICAgIHN0YXR1c190ICAgICAgICBzZXRDYW1lcmEoY29uc3Qgc3A8SUNhbWVyYT4mIGNhbWVyYSk7Ci0gICAgdmlydHVhbCAgICAgc3RhdHVzX3QgICAgICAgIHNldFByZXZpZXdTdXJmYWNlKGNvbnN0IHNwPElTdXJmYWNlPiYgc3VyZmFjZSk7CisgICAgdmlydHVhbCAgICAgc3RhdHVzX3QgICAgICAgIHNldFByZXZpZXdTdXJmYWNlKGNvbnN0IHNwPFN1cmZhY2U+JiBzdXJmYWNlKTsKICAgICB2aXJ0dWFsICAgICBzdGF0dXNfdCAgICAgICAgc2V0VmlkZW9Tb3VyY2UoaW50IHZzKTsKICAgICB2aXJ0dWFsICAgICBzdGF0dXNfdCAgICAgICAgc2V0QXVkaW9Tb3VyY2UoaW50IGFzKTsKICAgICB2aXJ0dWFsICAgICBzdGF0dXNfdCAgICAgICAgc2V0T3V0cHV0Rm9ybWF0KGludCBvZik7CkBAIC0zNyw2ICszNyw3IEBACiAgICAgdmlydHVhbCAgICAgc3RhdHVzX3QgICAgICAgIHNldEF1ZGlvRW5jb2RlcihpbnQgYWUpOwogICAgIHZpcnR1YWwgICAgIHN0YXR1c190ICAgICAgICBzZXRPdXRwdXRGaWxlKGNvbnN0IGNoYXIqIHBhdGgpOwogICAgIHZpcnR1YWwgICAgIHN0YXR1c190ICAgICAgICBzZXRPdXRwdXRGaWxlKGludCBmZCwgaW50NjRfdCBvZmZzZXQsIGludDY0X3QgbGVuZ3RoKTsKKyAgICB2aXJ0dWFsICAgICBzdGF0dXNfdCAgICAgICAgc2V0T3V0cHV0RmlsZUF1eGlsaWFyeShpbnQgZmQpOwogICAgIHZpcnR1YWwgICAgIHN0YXR1c190ICAgICAgICBzZXRWaWRlb1NpemUoaW50IHdpZHRoLCBpbnQgaGVpZ2h0KTsKICAgICB2aXJ0dWFsICAgICBzdGF0dXNfdCAgICAgICAgc2V0VmlkZW9GcmFtZVJhdGUoaW50IGZyYW1lc19wZXJfc2Vjb25kKTsKICAgICB2aXJ0dWFsICAgICBzdGF0dXNfdCAgICAgICAgc2V0UGFyYW1ldGVycyhjb25zdCBTdHJpbmc4JiBwYXJhbXMpOwpAQCAtNjYsNCArNjcsMyBAQAogfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKIAogI2VuZGlmIC8vIEFORFJPSURfTUVESUFSRUNPUkRFUkNMSUVOVF9ICi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9NaWRpRmlsZS5oIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL01pZGlGaWxlLmgKaW5kZXggNGE2MGVjZS4uMDZlNGI3MCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL01pZGlGaWxlLmgKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL01pZGlGaWxlLmgKQEAgLTM1LDcgKzM1LDggQEAKICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHBhdGgsIGNvbnN0IEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+ICpoZWFkZXJzKTsKIAogICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgc2V0RGF0YVNvdXJjZShpbnQgZmQsIGludDY0X3Qgb2Zmc2V0LCBpbnQ2NF90IGxlbmd0aCk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCAgICBzZXRWaWRlb1N1cmZhY2UoY29uc3Qgc3A8SVN1cmZhY2U+JiBzdXJmYWNlKSB7IHJldHVybiBVTktOT1dOX0VSUk9SOyB9CisgICAgdmlydHVhbCBzdGF0dXNfdCAgICBzZXRWaWRlb0lTdXJmYWNlKGNvbnN0IHNwPElTdXJmYWNlPiYgc3VyZmFjZSkgeyByZXR1cm4gVU5LTk9XTl9FUlJPUjsgfQorICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgc2V0VmlkZW9TdXJmYWNlKGNvbnN0IHNwPFN1cmZhY2U+JiBzdXJmYWNlKSB7IHJldHVybiBVTktOT1dOX0VSUk9SOyB9CiAgICAgdmlydHVhbCBzdGF0dXNfdCAgICBwcmVwYXJlKCk7CiAgICAgdmlydHVhbCBzdGF0dXNfdCAgICBwcmVwYXJlQXN5bmMoKTsKICAgICB2aXJ0dWFsIHN0YXR1c190ICAgIHN0YXJ0KCk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvU3RhZ2VmcmlnaHRQbGF5ZXIuY3BwIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL1N0YWdlZnJpZ2h0UGxheWVyLmNwcAppbmRleCAyYzk2ZDZkLi42YjliZjg1IDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvU3RhZ2VmcmlnaHRQbGF5ZXIuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9TdGFnZWZyaWdodFBsYXllci5jcHAKQEAgLTQ0LDEzICs0NCwyMCBAQAogICAgIHJldHVybiBtUGxheWVyLT5zZXREYXRhU291cmNlKGR1cChmZCksIG9mZnNldCwgbGVuZ3RoKTsKIH0KIAotc3RhdHVzX3QgU3RhZ2VmcmlnaHRQbGF5ZXI6OnNldFZpZGVvU3VyZmFjZShjb25zdCBzcDxJU3VyZmFjZT4gJnN1cmZhY2UpIHsKLSAgICBMT0dWKCJzZXRWaWRlb1N1cmZhY2UiKTsKK3N0YXR1c190IFN0YWdlZnJpZ2h0UGxheWVyOjpzZXRWaWRlb0lTdXJmYWNlKGNvbnN0IHNwPElTdXJmYWNlPiAmc3VyZmFjZSkgeworICAgIExPR1YoInNldFZpZGVvSVN1cmZhY2UiKTsKIAogICAgIG1QbGF5ZXItPnNldElTdXJmYWNlKHN1cmZhY2UpOwogICAgIHJldHVybiBPSzsKIH0KIAorc3RhdHVzX3QgU3RhZ2VmcmlnaHRQbGF5ZXI6OnNldFZpZGVvU3VyZmFjZShjb25zdCBzcDxTdXJmYWNlPiAmc3VyZmFjZSkgeworICAgIExPR1YoInNldFZpZGVvU3VyZmFjZSIpOworCisgICAgbVBsYXllci0+c2V0U3VyZmFjZShzdXJmYWNlKTsKKyAgICByZXR1cm4gT0s7Cit9CisKIHN0YXR1c190IFN0YWdlZnJpZ2h0UGxheWVyOjpwcmVwYXJlKCkgewogICAgIHJldHVybiBtUGxheWVyLT5wcmVwYXJlKCk7CiB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvU3RhZ2VmcmlnaHRQbGF5ZXIuaCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9TdGFnZWZyaWdodFBsYXllci5oCmluZGV4IDc4MWViNDQuLmRkMzcxMDIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9TdGFnZWZyaWdodFBsYXllci5oCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9TdGFnZWZyaWdodFBsYXllci5oCkBAIC0zNSw3ICszNSw4IEBACiAgICAgICAgICAgICBjb25zdCBjaGFyICp1cmwsIGNvbnN0IEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+ICpoZWFkZXJzKTsKIAogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0RGF0YVNvdXJjZShpbnQgZmQsIGludDY0X3Qgb2Zmc2V0LCBpbnQ2NF90IGxlbmd0aCk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRWaWRlb1N1cmZhY2UoY29uc3Qgc3A8SVN1cmZhY2U+ICZzdXJmYWNlKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldFZpZGVvSVN1cmZhY2UoY29uc3Qgc3A8SVN1cmZhY2U+ICZzdXJmYWNlKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldFZpZGVvU3VyZmFjZShjb25zdCBzcDxTdXJmYWNlPiAmc3VyZmFjZSk7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBwcmVwYXJlKCk7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBwcmVwYXJlQXN5bmMoKTsKICAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0KCk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvU3RhZ2VmcmlnaHRSZWNvcmRlci5jcHAgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvU3RhZ2VmcmlnaHRSZWNvcmRlci5jcHAKaW5kZXggY2YwMWZmNi4uZmU1MDc0YiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL1N0YWdlZnJpZ2h0UmVjb3JkZXIuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9TdGFnZWZyaWdodFJlY29yZGVyLmNwcApAQCAtMjQsNiArMjQsOSBAQAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0F1ZGlvU291cmNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvQU1SV3JpdGVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvQ2FtZXJhU291cmNlLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvVmlkZW9Tb3VyY2VEb3duU2FtcGxlci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0NhbWVyYVNvdXJjZVRpbWVMYXBzZS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhU291cmNlU3BsaXR0ZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NUEVHNFdyaXRlci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRGVidWcuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlZnMuaD4KQEAgLTM0LDE5ICszNywxOSBAQAogI2luY2x1ZGUgPGNhbWVyYS9JQ2FtZXJhLmg+CiAjaW5jbHVkZSA8Y2FtZXJhL0NhbWVyYS5oPgogI2luY2x1ZGUgPGNhbWVyYS9DYW1lcmFQYXJhbWV0ZXJzLmg+Ci0jaW5jbHVkZSA8c3VyZmFjZWZsaW5nZXIvSVN1cmZhY2UuaD4KKyNpbmNsdWRlIDxzdXJmYWNlZmxpbmdlci9TdXJmYWNlLmg+CiAjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+CiAjaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8dW5pc3RkLmg+CiAjaW5jbHVkZSA8Y3R5cGUuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KIAogI2luY2x1ZGUgIkFSVFBXcml0ZXIuaCIKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCiBTdGFnZWZyaWdodFJlY29yZGVyOjpTdGFnZWZyaWdodFJlY29yZGVyKCkKLSAgICA6IG1Xcml0ZXIoTlVMTCksCi0gICAgICBtT3V0cHV0RmQoLTEpIHsKKyAgICA6IG1Xcml0ZXIoTlVMTCksIG1Xcml0ZXJBdXgoTlVMTCksCisgICAgICBtT3V0cHV0RmQoLTEpLCBtT3V0cHV0RmRBdXgoLTEpIHsKIAogICAgIExPR1YoIkNvbnN0cnVjdG9yIik7CiAgICAgcmVzZXQoKTsKQEAgLTIwMCw3ICsyMDMsNyBAQAogICAgIHJldHVybiBPSzsKIH0KIAotc3RhdHVzX3QgU3RhZ2VmcmlnaHRSZWNvcmRlcjo6c2V0UHJldmlld1N1cmZhY2UoY29uc3Qgc3A8SVN1cmZhY2U+ICZzdXJmYWNlKSB7CitzdGF0dXNfdCBTdGFnZWZyaWdodFJlY29yZGVyOjpzZXRQcmV2aWV3U3VyZmFjZShjb25zdCBzcDxTdXJmYWNlPiAmc3VyZmFjZSkgewogICAgIExPR1YoInNldFByZXZpZXdTdXJmYWNlOiAlcCIsIHN1cmZhY2UuZ2V0KCkpOwogICAgIG1QcmV2aWV3U3VyZmFjZSA9IHN1cmZhY2U7CiAKQEAgLTIzNCw2ICsyMzcsMjQgQEAKICAgICByZXR1cm4gT0s7CiB9CiAKK3N0YXR1c190IFN0YWdlZnJpZ2h0UmVjb3JkZXI6OnNldE91dHB1dEZpbGVBdXhpbGlhcnkoaW50IGZkKSB7CisgICAgTE9HVigic2V0T3V0cHV0RmlsZUF1eGlsaWFyeTogJWQiLCBmZCk7CisKKyAgICBpZiAoZmQgPCAwKSB7CisgICAgICAgIExPR0UoIkludmFsaWQgZmlsZSBkZXNjcmlwdG9yOiAlZCIsIGZkKTsKKyAgICAgICAgcmV0dXJuIC1FQkFERjsKKyAgICB9CisKKyAgICBtQ2FwdHVyZUF1eFZpZGVvID0gdHJ1ZTsKKworICAgIGlmIChtT3V0cHV0RmRBdXggPj0gMCkgeworICAgICAgICA6OmNsb3NlKG1PdXRwdXRGZEF1eCk7CisgICAgfQorICAgIG1PdXRwdXRGZEF1eCA9IGR1cChmZCk7CisKKyAgICByZXR1cm4gT0s7Cit9CisKIC8vIEF0dGVtcHQgdG8gcGFyc2UgYW4gaW50NjQgbGl0ZXJhbCBvcHRpb25hbGx5IHN1cnJvdW5kZWQgYnkgd2hpdGVzcGFjZSwKIC8vIHJldHVybnMgdHJ1ZSBvbiBzdWNjZXNzLCBmYWxzZSBvdGhlcndpc2UuCiBzdGF0aWMgYm9vbCBzYWZlX3N0cnRvaTY0KGNvbnN0IGNoYXIgKnMsIGludDY0X3QgKnZhbCkgewpAQCAtNDczLDYgKzQ5NCw2OCBAQAogICAgIHJldHVybiBPSzsKIH0KIAorc3RhdHVzX3QgU3RhZ2VmcmlnaHRSZWNvcmRlcjo6c2V0UGFyYW1UaW1lTGFwc2VFbmFibGUoaW50MzJfdCB0aW1lTGFwc2VFbmFibGUpIHsKKyAgICBMT0dWKCJzZXRQYXJhbVRpbWVMYXBzZUVuYWJsZTogJWQiLCB0aW1lTGFwc2VFbmFibGUpOworCisgICAgaWYodGltZUxhcHNlRW5hYmxlID09IDApIHsKKyAgICAgICAgbUNhcHR1cmVUaW1lTGFwc2UgPSBmYWxzZTsKKyAgICB9IGVsc2UgaWYgKHRpbWVMYXBzZUVuYWJsZSA9PSAxKSB7CisgICAgICAgIG1DYXB0dXJlVGltZUxhcHNlID0gdHJ1ZTsKKyAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IFN0YWdlZnJpZ2h0UmVjb3JkZXI6OnNldFBhcmFtVGltZUJldHdlZW5UaW1lTGFwc2VGcmFtZUNhcHR1cmUoaW50NjRfdCB0aW1lVXMpIHsKKyAgICBMT0dWKCJzZXRQYXJhbVRpbWVCZXR3ZWVuVGltZUxhcHNlRnJhbWVDYXB0dXJlOiAlbGxkIHVzIiwgdGltZVVzKTsKKworICAgIC8vIE5vdCBhbGxvd2luZyB0aW1lIG1vcmUgdGhhbiBhIGRheQorICAgIGlmICh0aW1lVXMgPD0gMCB8fCB0aW1lVXMgPiA4NjQwMCoxRTYpIHsKKyAgICAgICAgTE9HRSgiVGltZSBiZXR3ZWVuIHRpbWUgbGFwc2UgZnJhbWUgY2FwdHVyZSAoJWxsZCkgaXMgb3V0IG9mIHJhbmdlIFswLCAxIERheV0iLCB0aW1lVXMpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIG1UaW1lQmV0d2VlblRpbWVMYXBzZUZyYW1lQ2FwdHVyZVVzID0gdGltZVVzOworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgU3RhZ2VmcmlnaHRSZWNvcmRlcjo6c2V0UGFyYW1BdXhWaWRlb1dpZHRoKGludDMyX3Qgd2lkdGgpIHsKKyAgICBMT0dWKCJzZXRQYXJhbUF1eFZpZGVvV2lkdGggOiAlZCIsIHdpZHRoKTsKKworICAgIGlmICh3aWR0aCA8PSAwKSB7CisgICAgICAgIExPR0UoIldpZHRoICglZCkgaXMgbm90IHBvc2l0aXZlIiwgd2lkdGgpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIG1BdXhWaWRlb1dpZHRoID0gd2lkdGg7CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBTdGFnZWZyaWdodFJlY29yZGVyOjpzZXRQYXJhbUF1eFZpZGVvSGVpZ2h0KGludDMyX3QgaGVpZ2h0KSB7CisgICAgTE9HVigic2V0UGFyYW1BdXhWaWRlb0hlaWdodCA6ICVkIiwgaGVpZ2h0KTsKKworICAgIGlmIChoZWlnaHQgPD0gMCkgeworICAgICAgICBMT0dFKCJIZWlnaHQgKCVkKSBpcyBub3QgcG9zaXRpdmUiLCBoZWlnaHQpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIG1BdXhWaWRlb0hlaWdodCA9IGhlaWdodDsKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IFN0YWdlZnJpZ2h0UmVjb3JkZXI6OnNldFBhcmFtQXV4VmlkZW9FbmNvZGluZ0JpdFJhdGUoaW50MzJfdCBiaXRSYXRlKSB7CisgICAgTE9HVigiU3RhZ2VmcmlnaHRSZWNvcmRlcjo6c2V0UGFyYW1BdXhWaWRlb0VuY29kaW5nQml0UmF0ZTogJWQiLCBiaXRSYXRlKTsKKworICAgIGlmIChiaXRSYXRlIDw9IDApIHsKKyAgICAgICAgTE9HRSgiSW52YWxpZCB2aWRlbyBlbmNvZGluZyBiaXQgcmF0ZTogJWQiLCBiaXRSYXRlKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICBtQXV4VmlkZW9CaXRSYXRlID0gYml0UmF0ZTsKKyAgICByZXR1cm4gT0s7Cit9CisKIHN0YXR1c190IFN0YWdlZnJpZ2h0UmVjb3JkZXI6OnNldFBhcmFtZXRlcigKICAgICAgICAgY29uc3QgU3RyaW5nOCAma2V5LCBjb25zdCBTdHJpbmc4ICZ2YWx1ZSkgewogICAgIExPR1YoInNldFBhcmFtZXRlcjoga2V5ICglcykgPT4gdmFsdWUgKCVzKSIsIGtleS5zdHJpbmcoKSwgdmFsdWUuc3RyaW5nKCkpOwpAQCAtNTU2LDYgKzYzOSwzMiBAQAogICAgICAgICBpZiAoc2FmZV9zdHJ0b2kzMih2YWx1ZS5zdHJpbmcoKSwgJnRpbWVTY2FsZSkpIHsKICAgICAgICAgICAgIHJldHVybiBzZXRQYXJhbVZpZGVvVGltZVNjYWxlKHRpbWVTY2FsZSk7CiAgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKGtleSA9PSAidGltZS1sYXBzZS1lbmFibGUiKSB7CisgICAgICAgIGludDMyX3QgdGltZUxhcHNlRW5hYmxlOworICAgICAgICBpZiAoc2FmZV9zdHJ0b2kzMih2YWx1ZS5zdHJpbmcoKSwgJnRpbWVMYXBzZUVuYWJsZSkpIHsKKyAgICAgICAgICAgIHJldHVybiBzZXRQYXJhbVRpbWVMYXBzZUVuYWJsZSh0aW1lTGFwc2VFbmFibGUpOworICAgICAgICB9CisgICAgfSBlbHNlIGlmIChrZXkgPT0gInRpbWUtYmV0d2Vlbi10aW1lLWxhcHNlLWZyYW1lLWNhcHR1cmUiKSB7CisgICAgICAgIGludDY0X3QgdGltZUJldHdlZW5UaW1lTGFwc2VGcmFtZUNhcHR1cmVNczsKKyAgICAgICAgaWYgKHNhZmVfc3RydG9pNjQodmFsdWUuc3RyaW5nKCksICZ0aW1lQmV0d2VlblRpbWVMYXBzZUZyYW1lQ2FwdHVyZU1zKSkgeworICAgICAgICAgICAgcmV0dXJuIHNldFBhcmFtVGltZUJldHdlZW5UaW1lTGFwc2VGcmFtZUNhcHR1cmUoCisgICAgICAgICAgICAgICAgICAgIDEwMDBMTCAqIHRpbWVCZXR3ZWVuVGltZUxhcHNlRnJhbWVDYXB0dXJlTXMpOworICAgICAgICB9CisgICAgfSBlbHNlIGlmIChrZXkgPT0gInZpZGVvLWF1eC1wYXJhbS13aWR0aCIpIHsKKyAgICAgICAgaW50MzJfdCBhdXhXaWR0aDsKKyAgICAgICAgaWYgKHNhZmVfc3RydG9pMzIodmFsdWUuc3RyaW5nKCksICZhdXhXaWR0aCkpIHsKKyAgICAgICAgICAgIHJldHVybiBzZXRQYXJhbUF1eFZpZGVvV2lkdGgoYXV4V2lkdGgpOworICAgICAgICB9CisgICAgfSBlbHNlIGlmIChrZXkgPT0gInZpZGVvLWF1eC1wYXJhbS1oZWlnaHQiKSB7CisgICAgICAgIGludDMyX3QgYXV4SGVpZ2h0OworICAgICAgICBpZiAoc2FmZV9zdHJ0b2kzMih2YWx1ZS5zdHJpbmcoKSwgJmF1eEhlaWdodCkpIHsKKyAgICAgICAgICAgIHJldHVybiBzZXRQYXJhbUF1eFZpZGVvSGVpZ2h0KGF1eEhlaWdodCk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKGtleSA9PSAidmlkZW8tYXV4LXBhcmFtLWVuY29kaW5nLWJpdHJhdGUiKSB7CisgICAgICAgIGludDMyX3QgYXV4VmlkZW9CaXRSYXRlOworICAgICAgICBpZiAoc2FmZV9zdHJ0b2kzMih2YWx1ZS5zdHJpbmcoKSwgJmF1eFZpZGVvQml0UmF0ZSkpIHsKKyAgICAgICAgICAgIHJldHVybiBzZXRQYXJhbUF1eFZpZGVvRW5jb2RpbmdCaXRSYXRlKGF1eFZpZGVvQml0UmF0ZSk7CisgICAgICAgIH0KICAgICB9IGVsc2UgewogICAgICAgICBMT0dFKCJzZXRQYXJhbWV0ZXI6IGZhaWxlZCB0byBmaW5kIGtleSAlcyIsIGtleS5zdHJpbmcoKSk7CiAgICAgfQpAQCAtNzg2LDcgKzg5NSwxNCBAQAogICAgIGlmIChtQXVkaW9Tb3VyY2UgIT0gQVVESU9fU09VUkNFX0xJU1RfRU5EKSB7CiAgICAgICAgIHNvdXJjZSA9IGNyZWF0ZUF1ZGlvU291cmNlKCk7CiAgICAgfSBlbHNlIHsKLSAgICAgICAgc3RhdHVzX3QgZXJyID0gc2V0dXBWaWRlb0VuY29kZXIoJnNvdXJjZSk7CisKKyAgICAgICAgc3A8Q2FtZXJhU291cmNlPiBjYW1lcmFTb3VyY2U7CisgICAgICAgIHN0YXR1c190IGVyciA9IHNldHVwQ2FtZXJhU291cmNlKCZjYW1lcmFTb3VyY2UpOworICAgICAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICB9CisKKyAgICAgICAgZXJyID0gc2V0dXBWaWRlb0VuY29kZXIoY2FtZXJhU291cmNlLCBtVmlkZW9CaXRSYXRlLCAmc291cmNlKTsKICAgICAgICAgaWYgKGVyciAhPSBPSykgewogICAgICAgICAgICAgcmV0dXJuIGVycjsKICAgICAgICAgfQpAQCAtODUwLDExICs5NjYsMTUgQEAKICAgICB9CiB9CiAKLXN0YXR1c190IFN0YWdlZnJpZ2h0UmVjb3JkZXI6OnNldHVwQ2FtZXJhU291cmNlKCkgewotICAgIGNsaXBWaWRlb0JpdFJhdGUoKTsKLSAgICBjbGlwVmlkZW9GcmFtZVJhdGUoKTsKLSAgICBjbGlwVmlkZW9GcmFtZVdpZHRoKCk7Ci0gICAgY2xpcFZpZGVvRnJhbWVIZWlnaHQoKTsKK3N0YXR1c190IFN0YWdlZnJpZ2h0UmVjb3JkZXI6OnNldHVwQ2FtZXJhKCkgeworICAgIGlmICghbUNhcHR1cmVUaW1lTGFwc2UpIHsKKyAgICAgICAgLy8gRG9udCBjbGlwIGZvciB0aW1lIGxhcHNlIGNhcHR1cmUgYXMgZW5jb2RlciB3aWxsIGhhdmUgZW5vdWdoCisgICAgICAgIC8vIHRpbWUgdG8gZW5jb2RlIGJlY2F1c2Ugb2Ygc2xvdyBjYXB0dXJlIHJhdGUgb2YgdGltZSBsYXBzZS4KKyAgICAgICAgY2xpcFZpZGVvQml0UmF0ZSgpOworICAgICAgICBjbGlwVmlkZW9GcmFtZVJhdGUoKTsKKyAgICAgICAgY2xpcFZpZGVvRnJhbWVXaWR0aCgpOworICAgICAgICBjbGlwVmlkZW9GcmFtZUhlaWdodCgpOworICAgIH0KIAogICAgIGludDY0X3QgdG9rZW4gPSBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5jbGVhckNhbGxpbmdJZGVudGl0eSgpOwogICAgIGlmIChtQ2FtZXJhID09IDApIHsKQEAgLTg2OSw3ICs5ODksMTQgQEAKIAogICAgIC8vIFNldCB0aGUgYWN0dWFsIHZpZGVvIHJlY29yZGluZyBmcmFtZSBzaXplCiAgICAgQ2FtZXJhUGFyYW1ldGVycyBwYXJhbXMobUNhbWVyYS0+Z2V0UGFyYW1ldGVycygpKTsKLSAgICBwYXJhbXMuc2V0UHJldmlld1NpemUobVZpZGVvV2lkdGgsIG1WaWRlb0hlaWdodCk7CisKKyAgICAvLyBkb250IGNoYW5nZSB0aGUgcHJldmlldyBzaXplIGJlY2F1c2UgdGltZSBsYXBzZSBtYXkgYmUgdXNpbmcgc3RpbGwgY2FtZXJhCisgICAgLy8gYXMgbVZpZGVvV2lkdGgsIG1WaWRlb0hlaWdodCBtYXkgY29ycmVzcG9uZCB0byBIRCByZXNvbHV0aW9uIG5vdAorICAgIC8vIHN1cHBvcnRlZCBieSB0aGUgdmlkZW8gY2FtZXJhLgorICAgIGlmICghbUNhcHR1cmVUaW1lTGFwc2UpIHsKKyAgICAgICAgcGFyYW1zLnNldFByZXZpZXdTaXplKG1WaWRlb1dpZHRoLCBtVmlkZW9IZWlnaHQpOworICAgIH0KKwogICAgIHBhcmFtcy5zZXRQcmV2aWV3RnJhbWVSYXRlKG1GcmFtZVJhdGUpOwogICAgIFN0cmluZzggcyA9IHBhcmFtcy5mbGF0dGVuKCk7CiAgICAgaWYgKE9LICE9IG1DYW1lcmEtPnNldFBhcmFtZXRlcnMocykpIHsKQEAgLTg4Miw4ICsxMDA5LDkgQEAKICAgICAvLyBDaGVjayBvbiB2aWRlbyBmcmFtZSBzaXplCiAgICAgaW50IGZyYW1lV2lkdGggPSAwLCBmcmFtZUhlaWdodCA9IDA7CiAgICAgbmV3Q2FtZXJhUGFyYW1zLmdldFByZXZpZXdTaXplKCZmcmFtZVdpZHRoLCAmZnJhbWVIZWlnaHQpOwotICAgIGlmIChmcmFtZVdpZHRoICA8IDAgfHwgZnJhbWVXaWR0aCAgIT0gbVZpZGVvV2lkdGggfHwKLSAgICAgICAgZnJhbWVIZWlnaHQgPCAwIHx8IGZyYW1lSGVpZ2h0ICE9IG1WaWRlb0hlaWdodCkgeworICAgIGlmICghbUNhcHR1cmVUaW1lTGFwc2UgJiYKKyAgICAgICAgKGZyYW1lV2lkdGggIDwgMCB8fCBmcmFtZVdpZHRoICAhPSBtVmlkZW9XaWR0aCB8fAorICAgICAgICBmcmFtZUhlaWdodCA8IDAgfHwgZnJhbWVIZWlnaHQgIT0gbVZpZGVvSGVpZ2h0KSkgewogICAgICAgICBMT0dFKCJGYWlsZWQgdG8gc2V0IHRoZSB2aWRlbyBmcmFtZSBzaXplIHRvICVkeCVkIiwKICAgICAgICAgICAgICAgICBtVmlkZW9XaWR0aCwgbVZpZGVvSGVpZ2h0KTsKICAgICAgICAgSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+cmVzdG9yZUNhbGxpbmdJZGVudGl0eSh0b2tlbik7CkBAIC05MjEsMTcgKzEwNDksMjcgQEAKICAgICB9CiB9CiAKLXN0YXR1c190IFN0YWdlZnJpZ2h0UmVjb3JkZXI6OnNldHVwVmlkZW9FbmNvZGVyKHNwPE1lZGlhU291cmNlPiAqc291cmNlKSB7Ci0gICAgc291cmNlLT5jbGVhcigpOwotCi0gICAgc3RhdHVzX3QgZXJyID0gc2V0dXBDYW1lcmFTb3VyY2UoKTsKK3N0YXR1c190IFN0YWdlZnJpZ2h0UmVjb3JkZXI6OnNldHVwQ2FtZXJhU291cmNlKHNwPENhbWVyYVNvdXJjZT4gKmNhbWVyYVNvdXJjZSkgeworICAgIHN0YXR1c190IGVyciA9IHNldHVwQ2FtZXJhKCk7CiAgICAgaWYgKGVyciAhPSBPSykgcmV0dXJuIGVycjsKIAotICAgIHNwPENhbWVyYVNvdXJjZT4gY2FtZXJhU291cmNlID0gQ2FtZXJhU291cmNlOjpDcmVhdGVGcm9tQ2FtZXJhKG1DYW1lcmEpOwotICAgIENIRUNLKGNhbWVyYVNvdXJjZSAhPSBOVUxMKTsKKyAgICAqY2FtZXJhU291cmNlID0gKG1DYXB0dXJlVGltZUxhcHNlKSA/CisgICAgICAgIENhbWVyYVNvdXJjZVRpbWVMYXBzZTo6Q3JlYXRlRnJvbUNhbWVyYShtQ2FtZXJhLAorICAgICAgICAgICAgICAgIG1UaW1lQmV0d2VlblRpbWVMYXBzZUZyYW1lQ2FwdHVyZVVzLCBtVmlkZW9XaWR0aCwgbVZpZGVvSGVpZ2h0LCBtRnJhbWVSYXRlKToKKyAgICAgICAgQ2FtZXJhU291cmNlOjpDcmVhdGVGcm9tQ2FtZXJhKG1DYW1lcmEpOworICAgIENIRUNLKCpjYW1lcmFTb3VyY2UgIT0gTlVMTCk7CisKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IFN0YWdlZnJpZ2h0UmVjb3JkZXI6OnNldHVwVmlkZW9FbmNvZGVyKAorICAgICAgICBzcDxNZWRpYVNvdXJjZT4gY2FtZXJhU291cmNlLAorICAgICAgICBpbnQzMl90IHZpZGVvQml0UmF0ZSwKKyAgICAgICAgc3A8TWVkaWFTb3VyY2U+ICpzb3VyY2UpIHsKKyAgICBzb3VyY2UtPmNsZWFyKCk7CiAKICAgICBzcDxNZXRhRGF0YT4gZW5jX21ldGEgPSBuZXcgTWV0YURhdGE7Ci0gICAgZW5jX21ldGEtPnNldEludDMyKGtLZXlCaXRSYXRlLCBtVmlkZW9CaXRSYXRlKTsKKyAgICBlbmNfbWV0YS0+c2V0SW50MzIoa0tleUJpdFJhdGUsIHZpZGVvQml0UmF0ZSk7CiAgICAgZW5jX21ldGEtPnNldEludDMyKGtLZXlTYW1wbGVSYXRlLCBtRnJhbWVSYXRlKTsKIAogICAgIHN3aXRjaCAobVZpZGVvRW5jb2RlcikgewpAQCAtOTc1LDE0ICsxMTEzLDI0IEBACiAgICAgfQogICAgIGlmIChtVmlkZW9FbmNvZGVyTGV2ZWwgIT0gLTEpIHsKICAgICAgICAgZW5jX21ldGEtPnNldEludDMyKGtLZXlWaWRlb0xldmVsLCBtVmlkZW9FbmNvZGVyTGV2ZWwpOworICAgIH0gZWxzZSBpZiAobUNhcHR1cmVUaW1lTGFwc2UpIHsKKyAgICAgICAgLy8gQ2hlY2sgaWYgd2UgYXJlIHVzaW5nIGhpZ2ggcmVzb2x1dGlvbiBhbmQvb3IgaGlnaCBiaXRyYXRlIGFuZAorICAgICAgICAvLyBzZXQgYXBwcm9wcmlhdGUgbGV2ZWwgZm9yIHRoZSBzb2Z0d2FyZSBBVkNFbmNvZGVyLgorICAgICAgICBpZiAoKHdpZHRoICogaGVpZ2h0ID49IDkyMTYwMCkgLy8gNzIwcAorICAgICAgICAgICAgICAgIHx8ICh2aWRlb0JpdFJhdGUgPj0gMjAwMDAwMDApKSB7CisgICAgICAgICAgICBlbmNfbWV0YS0+c2V0SW50MzIoa0tleVZpZGVvTGV2ZWwsIDUwKTsKKyAgICAgICAgfQogICAgIH0KIAogICAgIE9NWENsaWVudCBjbGllbnQ7CiAgICAgQ0hFQ0tfRVEoY2xpZW50LmNvbm5lY3QoKSwgT0spOwogCisgICAgLy8gVXNlIHNvZnR3YXJlIGNvZGVjIGZvciB0aW1lIGxhcHNlCisgICAgdWludDMyX3QgZW5jb2Rlcl9mbGFncyA9IChtQ2FwdHVyZVRpbWVMYXBzZSkgPyBPTVhDb2RlYzo6a1ByZWZlclNvZnR3YXJlQ29kZWNzIDogMDsKICAgICBzcDxNZWRpYVNvdXJjZT4gZW5jb2RlciA9IE9NWENvZGVjOjpDcmVhdGUoCiAgICAgICAgICAgICBjbGllbnQuaW50ZXJmYWNlKCksIGVuY19tZXRhLAotICAgICAgICAgICAgdHJ1ZSAvKiBjcmVhdGVFbmNvZGVyICovLCBjYW1lcmFTb3VyY2UpOworICAgICAgICAgICAgdHJ1ZSAvKiBjcmVhdGVFbmNvZGVyICovLCBjYW1lcmFTb3VyY2UsCisgICAgICAgICAgICBOVUxMLCBlbmNvZGVyX2ZsYWdzKTsKICAgICBpZiAoZW5jb2RlciA9PSBOVUxMKSB7CiAgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOwogICAgIH0KQEAgLTEwMTMsNTEgKzExNjEsMTQ3IEBACiAgICAgcmV0dXJuIE9LOwogfQogCi1zdGF0dXNfdCBTdGFnZWZyaWdodFJlY29yZGVyOjpzdGFydE1QRUc0UmVjb3JkaW5nKCkgewotICAgIGludDMyX3QgdG90YWxCaXRSYXRlID0gMDsKK3N0YXR1c190IFN0YWdlZnJpZ2h0UmVjb3JkZXI6OnNldHVwTVBFRzRSZWNvcmRpbmcoCisgICAgICAgIGJvb2wgdXNlU3BsaXRDYW1lcmFTb3VyY2UsCisgICAgICAgIGludCBvdXRwdXRGZCwKKyAgICAgICAgaW50MzJfdCB2aWRlb1dpZHRoLCBpbnQzMl90IHZpZGVvSGVpZ2h0LAorICAgICAgICBpbnQzMl90IHZpZGVvQml0UmF0ZSwKKyAgICAgICAgaW50MzJfdCAqdG90YWxCaXRSYXRlLAorICAgICAgICBzcDxNZWRpYVdyaXRlcj4gKm1lZGlhV3JpdGVyKSB7CisgICAgbWVkaWFXcml0ZXItPmNsZWFyKCk7CisgICAgKnRvdGFsQml0UmF0ZSA9IDA7CiAgICAgc3RhdHVzX3QgZXJyID0gT0s7Ci0gICAgc3A8TWVkaWFXcml0ZXI+IHdyaXRlciA9IG5ldyBNUEVHNFdyaXRlcihkdXAobU91dHB1dEZkKSk7CisgICAgc3A8TWVkaWFXcml0ZXI+IHdyaXRlciA9IG5ldyBNUEVHNFdyaXRlcihkdXAob3V0cHV0RmQpKTsKIAogICAgIC8vIEFkZCBhdWRpbyBzb3VyY2UgZmlyc3QgaWYgaXQgZXhpc3RzCi0gICAgaWYgKG1BdWRpb1NvdXJjZSAhPSBBVURJT19TT1VSQ0VfTElTVF9FTkQpIHsKKyAgICBpZiAoIW1DYXB0dXJlVGltZUxhcHNlICYmIChtQXVkaW9Tb3VyY2UgIT0gQVVESU9fU09VUkNFX0xJU1RfRU5EKSkgewogICAgICAgICBlcnIgPSBzZXR1cEF1ZGlvRW5jb2Rlcih3cml0ZXIpOwogICAgICAgICBpZiAoZXJyICE9IE9LKSByZXR1cm4gZXJyOwotICAgICAgICB0b3RhbEJpdFJhdGUgKz0gbUF1ZGlvQml0UmF0ZTsKKyAgICAgICAgKnRvdGFsQml0UmF0ZSArPSBtQXVkaW9CaXRSYXRlOwogICAgIH0KICAgICBpZiAobVZpZGVvU291cmNlID09IFZJREVPX1NPVVJDRV9ERUZBVUxUCiAgICAgICAgICAgICB8fCBtVmlkZW9Tb3VyY2UgPT0gVklERU9fU09VUkNFX0NBTUVSQSkgeworCisgICAgICAgIHNwPE1lZGlhU291cmNlPiBjYW1lcmFNZWRpYVNvdXJjZTsKKyAgICAgICAgaWYgKHVzZVNwbGl0Q2FtZXJhU291cmNlKSB7CisgICAgICAgICAgICBMT0dWKCJVc2luZyBTcGxpdCBjYW1lcmEgc291cmNlIik7CisgICAgICAgICAgICBjYW1lcmFNZWRpYVNvdXJjZSA9IG1DYW1lcmFTb3VyY2VTcGxpdHRlci0+Y3JlYXRlQ2xpZW50KCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzcDxDYW1lcmFTb3VyY2U+IGNhbWVyYVNvdXJjZTsKKyAgICAgICAgICAgIGVyciA9IHNldHVwQ2FtZXJhU291cmNlKCZjYW1lcmFTb3VyY2UpOworICAgICAgICAgICAgY2FtZXJhTWVkaWFTb3VyY2UgPSBjYW1lcmFTb3VyY2U7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCh2aWRlb1dpZHRoICE9IG1WaWRlb1dpZHRoKSB8fCAodmlkZW9IZWlnaHQgIT0gbVZpZGVvSGVpZ2h0KSkgeworICAgICAgICAgICAgLy8gVXNlIGRvd25zYW1wbGluZyBmcm9tIHRoZSBvcmlnaW5hbCBzb3VyY2UuCisgICAgICAgICAgICBjYW1lcmFNZWRpYVNvdXJjZSA9CisgICAgICAgICAgICAgICAgbmV3IFZpZGVvU291cmNlRG93blNhbXBsZXIoY2FtZXJhTWVkaWFTb3VyY2UsIHZpZGVvV2lkdGgsIHZpZGVvSGVpZ2h0KTsKKyAgICAgICAgfQorICAgICAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICB9CisKICAgICAgICAgc3A8TWVkaWFTb3VyY2U+IGVuY29kZXI7Ci0gICAgICAgIGVyciA9IHNldHVwVmlkZW9FbmNvZGVyKCZlbmNvZGVyKTsKLSAgICAgICAgaWYgKGVyciAhPSBPSykgcmV0dXJuIGVycjsKKyAgICAgICAgZXJyID0gc2V0dXBWaWRlb0VuY29kZXIoY2FtZXJhTWVkaWFTb3VyY2UsIHZpZGVvQml0UmF0ZSwgJmVuY29kZXIpOworICAgICAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICB9CisKICAgICAgICAgd3JpdGVyLT5hZGRTb3VyY2UoZW5jb2Rlcik7Ci0gICAgICAgIHRvdGFsQml0UmF0ZSArPSBtVmlkZW9CaXRSYXRlOworICAgICAgICAqdG90YWxCaXRSYXRlICs9IHZpZGVvQml0UmF0ZTsKICAgICB9CiAKICAgICBpZiAobUludGVybGVhdmVEdXJhdGlvblVzID4gMCkgewogICAgICAgICByZWludGVycHJldF9jYXN0PE1QRUc0V3JpdGVyICo+KHdyaXRlci5nZXQoKSktPgogICAgICAgICAgICAgc2V0SW50ZXJsZWF2ZUR1cmF0aW9uKG1JbnRlcmxlYXZlRHVyYXRpb25Vcyk7CiAgICAgfQotCiAgICAgaWYgKG1NYXhGaWxlRHVyYXRpb25VcyAhPSAwKSB7CiAgICAgICAgIHdyaXRlci0+c2V0TWF4RmlsZUR1cmF0aW9uKG1NYXhGaWxlRHVyYXRpb25Vcyk7CiAgICAgfQogICAgIGlmIChtTWF4RmlsZVNpemVCeXRlcyAhPSAwKSB7CiAgICAgICAgIHdyaXRlci0+c2V0TWF4RmlsZVNpemUobU1heEZpbGVTaXplQnl0ZXMpOwogICAgIH0KLSAgICBzcDxNZXRhRGF0YT4gbWV0YSA9IG5ldyBNZXRhRGF0YTsKLSAgICBtZXRhLT5zZXRJbnQ2NChrS2V5VGltZSwgc3lzdGVtVGltZSgpIC8gMTAwMCk7Ci0gICAgbWV0YS0+c2V0SW50MzIoa0tleUZpbGVUeXBlLCBtT3V0cHV0Rm9ybWF0KTsKLSAgICBtZXRhLT5zZXRJbnQzMihrS2V5Qml0UmF0ZSwgdG90YWxCaXRSYXRlKTsKLSAgICBtZXRhLT5zZXRJbnQzMihrS2V5NjRCaXRGaWxlT2Zmc2V0LCBtVXNlNjRCaXRGaWxlT2Zmc2V0KTsKKworICAgIHdyaXRlci0+c2V0TGlzdGVuZXIobUxpc3RlbmVyKTsKKyAgICAqbWVkaWFXcml0ZXIgPSB3cml0ZXI7CisgICAgcmV0dXJuIE9LOworfQorCit2b2lkIFN0YWdlZnJpZ2h0UmVjb3JkZXI6OnNldHVwTVBFRzRNZXRhRGF0YShpbnQ2NF90IHN0YXJ0VGltZVVzLCBpbnQzMl90IHRvdGFsQml0UmF0ZSwKKyAgICAgICAgc3A8TWV0YURhdGE+ICptZXRhKSB7CisgICAgKCptZXRhKS0+c2V0SW50NjQoa0tleVRpbWUsIHN0YXJ0VGltZVVzKTsKKyAgICAoKm1ldGEpLT5zZXRJbnQzMihrS2V5RmlsZVR5cGUsIG1PdXRwdXRGb3JtYXQpOworICAgICgqbWV0YSktPnNldEludDMyKGtLZXlCaXRSYXRlLCB0b3RhbEJpdFJhdGUpOworICAgICgqbWV0YSktPnNldEludDMyKGtLZXk2NEJpdEZpbGVPZmZzZXQsIG1Vc2U2NEJpdEZpbGVPZmZzZXQpOwogICAgIGlmIChtTW92aWVUaW1lU2NhbGUgPiAwKSB7Ci0gICAgICAgIG1ldGEtPnNldEludDMyKGtLZXlUaW1lU2NhbGUsIG1Nb3ZpZVRpbWVTY2FsZSk7CisgICAgICAgICgqbWV0YSktPnNldEludDMyKGtLZXlUaW1lU2NhbGUsIG1Nb3ZpZVRpbWVTY2FsZSk7CiAgICAgfQogICAgIGlmIChtVHJhY2tFdmVyeVRpbWVEdXJhdGlvblVzID4gMCkgewotICAgICAgICBtZXRhLT5zZXRJbnQ2NChrS2V5VHJhY2tUaW1lU3RhdHVzLCBtVHJhY2tFdmVyeVRpbWVEdXJhdGlvblVzKTsKKyAgICAgICAgKCptZXRhKS0+c2V0SW50NjQoa0tleVRyYWNrVGltZVN0YXR1cywgbVRyYWNrRXZlcnlUaW1lRHVyYXRpb25Vcyk7CiAgICAgfQotICAgIHdyaXRlci0+c2V0TGlzdGVuZXIobUxpc3RlbmVyKTsKLSAgICBtV3JpdGVyID0gd3JpdGVyOwotICAgIHJldHVybiBtV3JpdGVyLT5zdGFydChtZXRhLmdldCgpKTsKK30KKworc3RhdHVzX3QgU3RhZ2VmcmlnaHRSZWNvcmRlcjo6c3RhcnRNUEVHNFJlY29yZGluZygpIHsKKyAgICBpZiAobUNhcHR1cmVBdXhWaWRlbykgeworICAgICAgICBpZiAoIW1DYXB0dXJlVGltZUxhcHNlKSB7CisgICAgICAgICAgICBMT0dFKCJBdXhpbGlhcnkgdmlkZW8gY2FuIGJlIGNhcHR1cmVkIG9ubHkgaW4gdGltZSBsYXBzZSBtb2RlIik7CisgICAgICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICAgICAgfQorICAgICAgICBMT0dWKCJDcmVhdGluZyBNZWRpYVNvdXJjZVNwbGl0dGVyIik7CisgICAgICAgIHNwPENhbWVyYVNvdXJjZT4gY2FtZXJhU291cmNlOworICAgICAgICBzdGF0dXNfdCBlcnIgPSBzZXR1cENhbWVyYVNvdXJjZSgmY2FtZXJhU291cmNlKTsKKyAgICAgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgfQorICAgICAgICBtQ2FtZXJhU291cmNlU3BsaXR0ZXIgPSBuZXcgTWVkaWFTb3VyY2VTcGxpdHRlcihjYW1lcmFTb3VyY2UpOworICAgIH0gZWxzZSB7CisgICAgICAgIG1DYW1lcmFTb3VyY2VTcGxpdHRlciA9IE5VTEw7CisgICAgfQorCisgICAgaW50MzJfdCB0b3RhbEJpdFJhdGU7CisgICAgc3RhdHVzX3QgZXJyID0gc2V0dXBNUEVHNFJlY29yZGluZyhtQ2FwdHVyZUF1eFZpZGVvLAorICAgICAgICAgICAgbU91dHB1dEZkLCBtVmlkZW9XaWR0aCwgbVZpZGVvSGVpZ2h0LAorICAgICAgICAgICAgbVZpZGVvQml0UmF0ZSwgJnRvdGFsQml0UmF0ZSwgJm1Xcml0ZXIpOworICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisKKyAgICBpbnQ2NF90IHN0YXJ0VGltZVVzID0gc3lzdGVtVGltZSgpIC8gMTAwMDsKKyAgICBzcDxNZXRhRGF0YT4gbWV0YSA9IG5ldyBNZXRhRGF0YTsKKyAgICBzZXR1cE1QRUc0TWV0YURhdGEoc3RhcnRUaW1lVXMsIHRvdGFsQml0UmF0ZSwgJm1ldGEpOworCisgICAgZXJyID0gbVdyaXRlci0+c3RhcnQobWV0YS5nZXQoKSk7CisgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKworICAgIGlmIChtQ2FwdHVyZUF1eFZpZGVvKSB7CisgICAgICAgIENIRUNLKG1PdXRwdXRGZEF1eCA+PSAwKTsKKyAgICAgICAgaWYgKG1Xcml0ZXJBdXggIT0gTlVMTCkgeworICAgICAgICAgICAgTE9HRSgiQXV4aWxpYXJ5IEZpbGUgd3JpdGVyIGlzIG5vdCBhdmFpYWxibGUiKTsKKyAgICAgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgICAgICB9CisgICAgICAgIGlmICgobUF1eFZpZGVvV2lkdGggPiBtVmlkZW9XaWR0aCkgfHwgKG1BdXhWaWRlb0hlaWdodCA+IG1WaWRlb0hlaWdodCkgfHwKKyAgICAgICAgICAgICAgICAoKG1BdXhWaWRlb1dpZHRoID09IG1WaWRlb1dpZHRoKSAmJiBtQXV4VmlkZW9IZWlnaHQgPT0gbVZpZGVvSGVpZ2h0KSkgeworICAgICAgICAgICAgTE9HRSgiQXV4aWxpYXJ5IHZpZGVvIHNpemUgKCVkIHggJWQpIHNhbWUgb3IgbGFyZ2VyIHRoYW4gdGhlIG1haW4gdmlkZW8gc2l6ZSAoJWQgeCAlZCkiLAorICAgICAgICAgICAgICAgICAgICBtQXV4VmlkZW9XaWR0aCwgbUF1eFZpZGVvSGVpZ2h0LCBtVmlkZW9XaWR0aCwgbVZpZGVvSGVpZ2h0KTsKKyAgICAgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgICAgICB9CisKKyAgICAgICAgaW50MzJfdCB0b3RhbEJpdHJhdGVBdXg7CisgICAgICAgIGVyciA9IHNldHVwTVBFRzRSZWNvcmRpbmcobUNhcHR1cmVBdXhWaWRlbywKKyAgICAgICAgICAgICAgICBtT3V0cHV0RmRBdXgsIG1BdXhWaWRlb1dpZHRoLCBtQXV4VmlkZW9IZWlnaHQsCisgICAgICAgICAgICAgICAgbUF1eFZpZGVvQml0UmF0ZSwgJnRvdGFsQml0cmF0ZUF1eCwgJm1Xcml0ZXJBdXgpOworICAgICAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICB9CisKKyAgICAgICAgc3A8TWV0YURhdGE+IG1ldGFBdXggPSBuZXcgTWV0YURhdGE7CisgICAgICAgIHNldHVwTVBFRzRNZXRhRGF0YShzdGFydFRpbWVVcywgdG90YWxCaXRyYXRlQXV4LCAmbWV0YUF1eCk7CisKKyAgICAgICAgcmV0dXJuIG1Xcml0ZXJBdXgtPnN0YXJ0KG1ldGFBdXguZ2V0KCkpOworICAgIH0KKworICAgIHJldHVybiBPSzsKIH0KIAogc3RhdHVzX3QgU3RhZ2VmcmlnaHRSZWNvcmRlcjo6cGF1c2UoKSB7CkBAIC0xMDY2LDEyICsxMzEwLDI4IEBACiAgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOwogICAgIH0KICAgICBtV3JpdGVyLT5wYXVzZSgpOworCisgICAgaWYgKG1DYXB0dXJlQXV4VmlkZW8pIHsKKyAgICAgICAgaWYgKG1Xcml0ZXJBdXggPT0gTlVMTCkgeworICAgICAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgICAgIH0KKyAgICAgICAgbVdyaXRlckF1eC0+cGF1c2UoKTsKKyAgICB9CisKICAgICByZXR1cm4gT0s7CiB9CiAKIHN0YXR1c190IFN0YWdlZnJpZ2h0UmVjb3JkZXI6OnN0b3AoKSB7CiAgICAgTE9HVigic3RvcCIpOwogICAgIHN0YXR1c190IGVyciA9IE9LOworCisgICAgaWYgKG1DYXB0dXJlQXV4VmlkZW8pIHsKKyAgICAgICAgaWYgKG1Xcml0ZXJBdXggIT0gTlVMTCkgeworICAgICAgICAgICAgbVdyaXRlckF1eC0+c3RvcCgpOworICAgICAgICAgICAgbVdyaXRlckF1eC5jbGVhcigpOworICAgICAgICB9CisgICAgfQorCiAgICAgaWYgKG1Xcml0ZXIgIT0gTlVMTCkgewogICAgICAgICBlcnIgPSBtV3JpdGVyLT5zdG9wKCk7CiAgICAgICAgIG1Xcml0ZXIuY2xlYXIoKTsKQEAgLTEwOTUsNiArMTM1NSwxMyBAQAogICAgICAgICBtT3V0cHV0RmQgPSAtMTsKICAgICB9CiAKKyAgICBpZiAobUNhcHR1cmVBdXhWaWRlbykgeworICAgICAgICBpZiAobU91dHB1dEZkQXV4ID49IDApIHsKKyAgICAgICAgICAgIDo6Y2xvc2UobU91dHB1dEZkQXV4KTsKKyAgICAgICAgICAgIG1PdXRwdXRGZEF1eCA9IC0xOworICAgICAgICB9CisgICAgfQorCiAgICAgcmV0dXJuIGVycjsKIH0KIApAQCAtMTExOSw4ICsxMzg2LDExIEBACiAgICAgbVZpZGVvRW5jb2RlciAgPSBWSURFT19FTkNPREVSX0gyNjM7CiAgICAgbVZpZGVvV2lkdGggICAgPSAxNzY7CiAgICAgbVZpZGVvSGVpZ2h0ICAgPSAxNDQ7CisgICAgbUF1eFZpZGVvV2lkdGggICAgPSAxNzY7CisgICAgbUF1eFZpZGVvSGVpZ2h0ICAgPSAxNDQ7CiAgICAgbUZyYW1lUmF0ZSAgICAgPSAyMDsKICAgICBtVmlkZW9CaXRSYXRlICA9IDE5MjAwMDsKKyAgICBtQXV4VmlkZW9CaXRSYXRlID0gMTkyMDAwOwogICAgIG1TYW1wbGVSYXRlICAgID0gODAwMDsKICAgICBtQXVkaW9DaGFubmVscyA9IDE7CiAgICAgbUF1ZGlvQml0UmF0ZSAgPSAxMjIwMDsKQEAgLTExMzcsOSArMTQwNywxNCBAQAogICAgIG1NYXhGaWxlRHVyYXRpb25VcyA9IDA7CiAgICAgbU1heEZpbGVTaXplQnl0ZXMgPSAwOwogICAgIG1UcmFja0V2ZXJ5VGltZUR1cmF0aW9uVXMgPSAwOworICAgIG1DYXB0dXJlVGltZUxhcHNlID0gZmFsc2U7CisgICAgbVRpbWVCZXR3ZWVuVGltZUxhcHNlRnJhbWVDYXB0dXJlVXMgPSAtMTsKKyAgICBtQ2FwdHVyZUF1eFZpZGVvID0gZmFsc2U7CisgICAgbUNhbWVyYVNvdXJjZVNwbGl0dGVyID0gTlVMTDsKICAgICBtRW5jb2RlclByb2ZpbGVzID0gTWVkaWFQcm9maWxlczo6Z2V0SW5zdGFuY2UoKTsKIAogICAgIG1PdXRwdXRGZCA9IC0xOworICAgIG1PdXRwdXRGZEF1eCA9IC0xOwogICAgIG1GbGFncyA9IDA7CiAKICAgICByZXR1cm4gT0s7CkBAIC0xMTc3LDYgKzE0NTIsOCBAQAogICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiAgIFJlY29yZGVyOiAlcFxuIiwgdGhpcyk7CiAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiICAgT3V0cHV0IGZpbGUgKGZkICVkKTpcbiIsIG1PdXRwdXRGZCk7CiAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiAgIE91dHB1dCBmaWxlIEF1eGlsaWFyeSAoZmQgJWQpOlxuIiwgbU91dHB1dEZkQXV4KTsKKyAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CiAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiICAgICBGaWxlIGZvcm1hdDogJWRcbiIsIG1PdXRwdXRGb3JtYXQpOwogICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgICAgIE1heCBmaWxlIHNpemUgKGJ5dGVzKTogJWxsZFxuIiwgbU1heEZpbGVTaXplQnl0ZXMpOwpAQCAtMTIyMSwxMCArMTQ5OCwxNCBAQAogICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgICAgIEZyYW1lIHNpemUgKHBpeGVscyk6ICVkeCVkXG4iLCBtVmlkZW9XaWR0aCwgbVZpZGVvSGVpZ2h0KTsKICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiICAgICBBdXggRnJhbWUgc2l6ZSAocGl4ZWxzKTogJWR4JWRcbiIsIG1BdXhWaWRlb1dpZHRoLCBtQXV4VmlkZW9IZWlnaHQpOworICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgICAgIEZyYW1lIHJhdGUgKGZwcyk6ICVkXG4iLCBtRnJhbWVSYXRlKTsKICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CiAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiICAgICBCaXQgcmF0ZSAoYnBzKTogJWRcbiIsIG1WaWRlb0JpdFJhdGUpOwogICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgICAgIEF1eCBCaXQgcmF0ZSAoYnBzKTogJWRcbiIsIG1BdXhWaWRlb0JpdFJhdGUpOworICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKICAgICA6OndyaXRlKGZkLCByZXN1bHQuc3RyaW5nKCksIHJlc3VsdC5zaXplKCkpOwogICAgIHJldHVybiBPSzsKIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9TdGFnZWZyaWdodFJlY29yZGVyLmggYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvU3RhZ2VmcmlnaHRSZWNvcmRlci5oCmluZGV4IDIxNmY2YmMuLmYxZGM5ZTYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9TdGFnZWZyaWdodFJlY29yZGVyLmgKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL1N0YWdlZnJpZ2h0UmVjb3JkZXIuaApAQCAtMjQsOCArMjQsMTEgQEAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogY2xhc3MgQ2FtZXJhOworY2xhc3MgQ2FtZXJhU291cmNlOworY2xhc3MgTWVkaWFTb3VyY2VTcGxpdHRlcjsKIHN0cnVjdCBNZWRpYVNvdXJjZTsKIHN0cnVjdCBNZWRpYVdyaXRlcjsKK2NsYXNzIE1ldGFEYXRhOwogc3RydWN0IEF1ZGlvU291cmNlOwogY2xhc3MgTWVkaWFQcm9maWxlczsKIApAQCAtNDIsOSArNDUsMTAgQEAKICAgICB2aXJ0dWFsIHN0YXR1c190IHNldFZpZGVvU2l6ZShpbnQgd2lkdGgsIGludCBoZWlnaHQpOwogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0VmlkZW9GcmFtZVJhdGUoaW50IGZyYW1lc19wZXJfc2Vjb25kKTsKICAgICB2aXJ0dWFsIHN0YXR1c190IHNldENhbWVyYShjb25zdCBzcDxJQ2FtZXJhPiYgY2FtZXJhKTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldFByZXZpZXdTdXJmYWNlKGNvbnN0IHNwPElTdXJmYWNlPiYgc3VyZmFjZSk7CisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRQcmV2aWV3U3VyZmFjZShjb25zdCBzcDxTdXJmYWNlPiYgc3VyZmFjZSk7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRPdXRwdXRGaWxlKGNvbnN0IGNoYXIgKnBhdGgpOwogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0T3V0cHV0RmlsZShpbnQgZmQsIGludDY0X3Qgb2Zmc2V0LCBpbnQ2NF90IGxlbmd0aCk7CisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRPdXRwdXRGaWxlQXV4aWxpYXJ5KGludCBmZCk7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRQYXJhbWV0ZXJzKGNvbnN0IFN0cmluZzgmIHBhcmFtcyk7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRMaXN0ZW5lcihjb25zdCBzcDxJTWVkaWFSZWNvcmRlckNsaWVudD4mIGxpc3RlbmVyKTsKICAgICB2aXJ0dWFsIHN0YXR1c190IHByZXBhcmUoKTsKQEAgLTYzLDkgKzY3LDkgQEAKICAgICB9OwogCiAgICAgc3A8Q2FtZXJhPiBtQ2FtZXJhOwotICAgIHNwPElTdXJmYWNlPiBtUHJldmlld1N1cmZhY2U7CisgICAgc3A8U3VyZmFjZT4gbVByZXZpZXdTdXJmYWNlOwogICAgIHNwPElNZWRpYVJlY29yZGVyQ2xpZW50PiBtTGlzdGVuZXI7Ci0gICAgc3A8TWVkaWFXcml0ZXI+IG1Xcml0ZXI7CisgICAgc3A8TWVkaWFXcml0ZXI+IG1Xcml0ZXIsIG1Xcml0ZXJBdXg7CiAgICAgc3A8QXVkaW9Tb3VyY2U+IG1BdWRpb1NvdXJjZU5vZGU7CiAKICAgICBhdWRpb19zb3VyY2UgbUF1ZGlvU291cmNlOwpAQCAtNzUsOCArNzksOSBAQAogICAgIHZpZGVvX2VuY29kZXIgbVZpZGVvRW5jb2RlcjsKICAgICBib29sIG1Vc2U2NEJpdEZpbGVPZmZzZXQ7CiAgICAgaW50MzJfdCBtVmlkZW9XaWR0aCwgbVZpZGVvSGVpZ2h0OworICAgIGludDMyX3QgbUF1eFZpZGVvV2lkdGgsIG1BdXhWaWRlb0hlaWdodDsKICAgICBpbnQzMl90IG1GcmFtZVJhdGU7Ci0gICAgaW50MzJfdCBtVmlkZW9CaXRSYXRlOworICAgIGludDMyX3QgbVZpZGVvQml0UmF0ZSwgbUF1eFZpZGVvQml0UmF0ZTsKICAgICBpbnQzMl90IG1BdWRpb0JpdFJhdGU7CiAgICAgaW50MzJfdCBtQXVkaW9DaGFubmVsczsKICAgICBpbnQzMl90IG1TYW1wbGVSYXRlOwpAQCAtOTIsMjAgKzk3LDM4IEBACiAgICAgaW50NjRfdCBtTWF4RmlsZUR1cmF0aW9uVXM7CiAgICAgaW50NjRfdCBtVHJhY2tFdmVyeVRpbWVEdXJhdGlvblVzOwogCisgICAgYm9vbCBtQ2FwdHVyZVRpbWVMYXBzZTsKKyAgICBpbnQ2NF90IG1UaW1lQmV0d2VlblRpbWVMYXBzZUZyYW1lQ2FwdHVyZVVzOworICAgIGJvb2wgbUNhcHR1cmVBdXhWaWRlbzsKKyAgICBzcDxNZWRpYVNvdXJjZVNwbGl0dGVyPiBtQ2FtZXJhU291cmNlU3BsaXR0ZXI7CisKICAgICBTdHJpbmc4IG1QYXJhbXM7Ci0gICAgaW50IG1PdXRwdXRGZDsKKyAgICBpbnQgbU91dHB1dEZkLCBtT3V0cHV0RmRBdXg7CiAgICAgaW50MzJfdCBtRmxhZ3M7CiAKICAgICBNZWRpYVByb2ZpbGVzICptRW5jb2RlclByb2ZpbGVzOwogCisgICAgc3RhdHVzX3Qgc2V0dXBNUEVHNFJlY29yZGluZygKKyAgICAgICAgYm9vbCB1c2VTcGxpdENhbWVyYVNvdXJjZSwKKyAgICAgICAgaW50IG91dHB1dEZkLAorICAgICAgICBpbnQzMl90IHZpZGVvV2lkdGgsIGludDMyX3QgdmlkZW9IZWlnaHQsCisgICAgICAgIGludDMyX3QgdmlkZW9CaXRSYXRlLAorICAgICAgICBpbnQzMl90ICp0b3RhbEJpdFJhdGUsCisgICAgICAgIHNwPE1lZGlhV3JpdGVyPiAqbWVkaWFXcml0ZXIpOworICAgIHZvaWQgc2V0dXBNUEVHNE1ldGFEYXRhKGludDY0X3Qgc3RhcnRUaW1lVXMsIGludDMyX3QgdG90YWxCaXRSYXRlLAorICAgICAgICBzcDxNZXRhRGF0YT4gKm1ldGEpOwogICAgIHN0YXR1c190IHN0YXJ0TVBFRzRSZWNvcmRpbmcoKTsKICAgICBzdGF0dXNfdCBzdGFydEFNUlJlY29yZGluZygpOwogICAgIHN0YXR1c190IHN0YXJ0QUFDUmVjb3JkaW5nKCk7CiAgICAgc3RhdHVzX3Qgc3RhcnRSVFBSZWNvcmRpbmcoKTsKICAgICBzcDxNZWRpYVNvdXJjZT4gY3JlYXRlQXVkaW9Tb3VyY2UoKTsKLSAgICBzdGF0dXNfdCBzZXR1cENhbWVyYVNvdXJjZSgpOworICAgIHN0YXR1c190IHNldHVwQ2FtZXJhKCk7CisgICAgc3RhdHVzX3Qgc2V0dXBDYW1lcmFTb3VyY2Uoc3A8Q2FtZXJhU291cmNlPiAqY2FtZXJhU291cmNlKTsKICAgICBzdGF0dXNfdCBzZXR1cEF1ZGlvRW5jb2Rlcihjb25zdCBzcDxNZWRpYVdyaXRlcj4mIHdyaXRlcik7Ci0gICAgc3RhdHVzX3Qgc2V0dXBWaWRlb0VuY29kZXIoc3A8TWVkaWFTb3VyY2U+ICpzb3VyY2UpOworICAgIHN0YXR1c190IHNldHVwVmlkZW9FbmNvZGVyKAorICAgICAgICAgICAgc3A8TWVkaWFTb3VyY2U+IGNhbWVyYVNvdXJjZSwKKyAgICAgICAgICAgIGludDMyX3QgdmlkZW9CaXRSYXRlLAorICAgICAgICAgICAgc3A8TWVkaWFTb3VyY2U+ICpzb3VyY2UpOwogCiAgICAgLy8gRW5jb2RpbmcgcGFyYW1ldGVyIGhhbmRsaW5nIHV0aWxpdGllcwogICAgIHN0YXR1c190IHNldFBhcmFtZXRlcihjb25zdCBTdHJpbmc4ICZrZXksIGNvbnN0IFN0cmluZzggJnZhbHVlKTsKQEAgLTExMyw2ICsxMzYsMTEgQEAKICAgICBzdGF0dXNfdCBzZXRQYXJhbUF1ZGlvTnVtYmVyT2ZDaGFubmVscyhpbnQzMl90IGNoYW5ubGVzKTsKICAgICBzdGF0dXNfdCBzZXRQYXJhbUF1ZGlvU2FtcGxpbmdSYXRlKGludDMyX3Qgc2FtcGxlUmF0ZSk7CiAgICAgc3RhdHVzX3Qgc2V0UGFyYW1BdWRpb1RpbWVTY2FsZShpbnQzMl90IHRpbWVTY2FsZSk7CisgICAgc3RhdHVzX3Qgc2V0UGFyYW1UaW1lTGFwc2VFbmFibGUoaW50MzJfdCB0aW1lTGFwc2VFbmFibGUpOworICAgIHN0YXR1c190IHNldFBhcmFtVGltZUJldHdlZW5UaW1lTGFwc2VGcmFtZUNhcHR1cmUoaW50NjRfdCB0aW1lVXMpOworICAgIHN0YXR1c190IHNldFBhcmFtQXV4VmlkZW9IZWlnaHQoaW50MzJfdCBoZWlnaHQpOworICAgIHN0YXR1c190IHNldFBhcmFtQXV4VmlkZW9XaWR0aChpbnQzMl90IHdpZHRoKTsKKyAgICBzdGF0dXNfdCBzZXRQYXJhbUF1eFZpZGVvRW5jb2RpbmdCaXRSYXRlKGludDMyX3QgYml0UmF0ZSk7CiAgICAgc3RhdHVzX3Qgc2V0UGFyYW1WaWRlb0VuY29kaW5nQml0UmF0ZShpbnQzMl90IGJpdFJhdGUpOwogICAgIHN0YXR1c190IHNldFBhcmFtVmlkZW9JRnJhbWVzSW50ZXJ2YWwoaW50MzJfdCBzZWNvbmRzKTsKICAgICBzdGF0dXNfdCBzZXRQYXJhbVZpZGVvRW5jb2RlclByb2ZpbGUoaW50MzJfdCBwcm9maWxlKTsKQEAgLTEzNyw0ICsxNjUsMyBAQAogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKIAogI2VuZGlmICAvLyBTVEFHRUZSSUdIVF9SRUNPUkRFUl9IXwotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvVGVzdFBsYXllclN0dWIuaCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9UZXN0UGxheWVyU3R1Yi5oCmluZGV4IDZlNmMzY2QuLjVlYWY1OTIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9UZXN0UGxheWVyU3R1Yi5oCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9UZXN0UGxheWVyU3R1Yi5oCkBAIC03NSw3ICs3NSwxMCBAQAogCiAKICAgICAvLyBBbGwgdGhlIG1ldGhvZHMgYmVsb3cgd3JhcCB0aGUgbVBsYXllciBpbnN0YW5jZS4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldFZpZGVvU3VyZmFjZShjb25zdCBhbmRyb2lkOjpzcDxhbmRyb2lkOjpJU3VyZmFjZT4mIHMpICB7CisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRWaWRlb0lTdXJmYWNlKGNvbnN0IGFuZHJvaWQ6OnNwPGFuZHJvaWQ6OklTdXJmYWNlPiYgcykgIHsKKyAgICAgICAgcmV0dXJuIG1QbGF5ZXItPnNldFZpZGVvSVN1cmZhY2Uocyk7CisgICAgfQorICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0VmlkZW9TdXJmYWNlKGNvbnN0IGFuZHJvaWQ6OnNwPGFuZHJvaWQ6OlN1cmZhY2U+JiBzKSAgewogICAgICAgICByZXR1cm4gbVBsYXllci0+c2V0VmlkZW9TdXJmYWNlKHMpOwogICAgIH0KICAgICB2aXJ0dWFsIHN0YXR1c190IHByZXBhcmUoKSB7cmV0dXJuIG1QbGF5ZXItPnByZXBhcmUoKTt9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9BbmRyb2lkLm1rIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQW5kcm9pZC5tawppbmRleCA4NmZhNjY4Li4wZDExYjMzIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9BbmRyb2lkLm1rCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0FuZHJvaWQubWsKQEAgLTEwLDYgKzEwLDggQEAKICAgICAgICAgQXVkaW9Tb3VyY2UuY3BwICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgQXdlc29tZVBsYXllci5jcHAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgQ2FtZXJhU291cmNlLmNwcCAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgQ2FtZXJhU291cmNlVGltZUxhcHNlLmNwcCAgICAgICAgIFwKKyAgICAgICAgVmlkZW9Tb3VyY2VEb3duU2FtcGxlci5jcHAgICAgICAgIFwKICAgICAgICAgRGF0YVNvdXJjZS5jcHAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgRVNEUy5jcHAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgRmlsZVNvdXJjZS5jcHAgICAgICAgICAgICAgICAgICAgIFwKQEAgLTIzLDYgKzI1LDcgQEAKICAgICAgICAgTWVkaWFEZWZzLmNwcCAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgTWVkaWFFeHRyYWN0b3IuY3BwICAgICAgICAgICAgICAgIFwKICAgICAgICAgTWVkaWFTb3VyY2UuY3BwICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgTWVkaWFTb3VyY2VTcGxpdHRlci5jcHAgICAgICAgICAgIFwKICAgICAgICAgTWV0YURhdGEuY3BwICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgTnVDYWNoZWRTb3VyY2UyLmNwcCAgICAgICAgICAgICAgIFwKICAgICAgICAgTnVIVFRQRGF0YVNvdXJjZS5jcHAgICAgICAgICAgICAgIFwKQEAgLTU4LDYgKzYxLDcgQEAKICAgICAgICAgbGlic29uaXZveCAgICAgICAgXAogICAgICAgICBsaWJ2b3JiaXNpZGVjICAgICBcCiAgICAgICAgIGxpYnN1cmZhY2VmbGluZ2VyX2NsaWVudCBcCisgICAgICAgIGxpYnN0YWdlZnJpZ2h0X3l1diBcCiAgICAgICAgIGxpYmNhbWVyYV9jbGllbnQKIAogTE9DQUxfU1RBVElDX0xJQlJBUklFUyA6PSBcCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9Bd2Vzb21lUGxheWVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0F3ZXNvbWVQbGF5ZXIuY3BwCmluZGV4IDg1MDdhZmMuLmZkNWYzMGIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0F3ZXNvbWVQbGF5ZXIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0F3ZXNvbWVQbGF5ZXIuY3BwCkBAIC00NCw3ICs0NCw3IEBACiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9PTVhDb2RlYy5oPgogCi0jaW5jbHVkZSA8c3VyZmFjZWZsaW5nZXIvSVN1cmZhY2UuaD4KKyNpbmNsdWRlIDxzdXJmYWNlZmxpbmdlci9TdXJmYWNlLmg+CiAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FMb29wZXIuaD4KIApAQCAtMTAwLDEzICsxMDAsMTQgQEAKICAgICAgICAgICAgIGJvb2wgcHJldmlld09ubHksCiAgICAgICAgICAgICBjb25zdCBjaGFyICpjb21wb25lbnROYW1lLAogICAgICAgICAgICAgT01YX0NPTE9SX0ZPUk1BVFRZUEUgY29sb3JGb3JtYXQsCi0gICAgICAgICAgICBjb25zdCBzcDxJU3VyZmFjZT4gJnN1cmZhY2UsCisgICAgICAgICAgICBjb25zdCBzcDxJU3VyZmFjZT4gJmlzdXJmYWNlLAorICAgICAgICAgICAgY29uc3Qgc3A8U3VyZmFjZT4gJnN1cmZhY2UsCiAgICAgICAgICAgICBzaXplX3QgZGlzcGxheVdpZHRoLCBzaXplX3QgZGlzcGxheUhlaWdodCwKICAgICAgICAgICAgIHNpemVfdCBkZWNvZGVkV2lkdGgsIHNpemVfdCBkZWNvZGVkSGVpZ2h0KQogICAgICAgICA6IG1UYXJnZXQoTlVMTCksCiAgICAgICAgICAgbUxpYkhhbmRsZShOVUxMKSB7CiAgICAgICAgICAgICBpbml0KHByZXZpZXdPbmx5LCBjb21wb25lbnROYW1lLAotICAgICAgICAgICAgICAgICBjb2xvckZvcm1hdCwgc3VyZmFjZSwgZGlzcGxheVdpZHRoLAorICAgICAgICAgICAgICAgICBjb2xvckZvcm1hdCwgaXN1cmZhY2UsIHN1cmZhY2UsIGRpc3BsYXlXaWR0aCwKICAgICAgICAgICAgICAgICAgZGlzcGxheUhlaWdodCwgZGVjb2RlZFdpZHRoLCBkZWNvZGVkSGVpZ2h0KTsKICAgICB9CiAKQEAgLTEzOCw3ICsxMzksOCBAQAogICAgICAgICAgICAgYm9vbCBwcmV2aWV3T25seSwKICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmNvbXBvbmVudE5hbWUsCiAgICAgICAgICAgICBPTVhfQ09MT1JfRk9STUFUVFlQRSBjb2xvckZvcm1hdCwKLSAgICAgICAgICAgIGNvbnN0IHNwPElTdXJmYWNlPiAmc3VyZmFjZSwKKyAgICAgICAgICAgIGNvbnN0IHNwPElTdXJmYWNlPiAmaXN1cmZhY2UsCisgICAgICAgICAgICBjb25zdCBzcDxTdXJmYWNlPiAmc3VyZmFjZSwKICAgICAgICAgICAgIHNpemVfdCBkaXNwbGF5V2lkdGgsIHNpemVfdCBkaXNwbGF5SGVpZ2h0LAogICAgICAgICAgICAgc2l6ZV90IGRlY29kZWRXaWR0aCwgc2l6ZV90IGRlY29kZWRIZWlnaHQpOwogCkBAIC0xNTAsNyArMTUyLDggQEAKICAgICAgICAgYm9vbCBwcmV2aWV3T25seSwKICAgICAgICAgY29uc3QgY2hhciAqY29tcG9uZW50TmFtZSwKICAgICAgICAgT01YX0NPTE9SX0ZPUk1BVFRZUEUgY29sb3JGb3JtYXQsCi0gICAgICAgIGNvbnN0IHNwPElTdXJmYWNlPiAmc3VyZmFjZSwKKyAgICAgICAgY29uc3Qgc3A8SVN1cmZhY2U+ICZpc3VyZmFjZSwKKyAgICAgICAgY29uc3Qgc3A8U3VyZmFjZT4gJnN1cmZhY2UsCiAgICAgICAgIHNpemVfdCBkaXNwbGF5V2lkdGgsIHNpemVfdCBkaXNwbGF5SGVpZ2h0LAogICAgICAgICBzaXplX3QgZGVjb2RlZFdpZHRoLCBzaXplX3QgZGVjb2RlZEhlaWdodCkgewogICAgIGlmICghcHJldmlld09ubHkpIHsKQEAgLTE3Niw3ICsxNzksNyBAQAogCiAgICAgICAgICAgICBpZiAoZnVuYykgewogICAgICAgICAgICAgICAgIG1UYXJnZXQgPQotICAgICAgICAgICAgICAgICAgICAoKmZ1bmMpKHN1cmZhY2UsIGNvbXBvbmVudE5hbWUsIGNvbG9yRm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAoKmZ1bmMpKGlzdXJmYWNlLCBjb21wb25lbnROYW1lLCBjb2xvckZvcm1hdCwKICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BsYXlXaWR0aCwgZGlzcGxheUhlaWdodCwKICAgICAgICAgICAgICAgICAgICAgICAgIGRlY29kZWRXaWR0aCwgZGVjb2RlZEhlaWdodCk7CiAgICAgICAgICAgICB9CkBAIC02OTQsOCArNjk3LDE4IEBACiAgICAgcmV0dXJuIE9LOwogfQogCit2b2lkIEF3ZXNvbWVQbGF5ZXI6Om5vdGlmeVZpZGVvU2l6ZV9sKCkgeworICAgIHNwPE1ldGFEYXRhPiBtZXRhID0gbVZpZGVvU291cmNlLT5nZXRGb3JtYXQoKTsKKworICAgIGludDMyX3QgZGVjb2RlZFdpZHRoLCBkZWNvZGVkSGVpZ2h0OworICAgIENIRUNLKG1ldGEtPmZpbmRJbnQzMihrS2V5V2lkdGgsICZkZWNvZGVkV2lkdGgpKTsKKyAgICBDSEVDSyhtZXRhLT5maW5kSW50MzIoa0tleUhlaWdodCwgJmRlY29kZWRIZWlnaHQpKTsKKworICAgIG5vdGlmeUxpc3RlbmVyX2woTUVESUFfU0VUX1ZJREVPX1NJWkUsIGRlY29kZWRXaWR0aCwgZGVjb2RlZEhlaWdodCk7Cit9CisKIHZvaWQgQXdlc29tZVBsYXllcjo6aW5pdFJlbmRlcmVyX2woKSB7Ci0gICAgaWYgKG1JU3VyZmFjZSAhPSBOVUxMKSB7CisgICAgaWYgKG1TdXJmYWNlICE9IE5VTEwgfHwgbUlTdXJmYWNlICE9IE5VTEwpIHsKICAgICAgICAgc3A8TWV0YURhdGE+IG1ldGEgPSBtVmlkZW9Tb3VyY2UtPmdldEZvcm1hdCgpOwogCiAgICAgICAgIGludDMyX3QgZm9ybWF0OwpAQCAtNzEyLDcgKzcyNSwxOCBAQAogICAgICAgICAvLyBiZWZvcmUgY3JlYXRpbmcgYSBuZXcgb25lLgogICAgICAgICBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5mbHVzaENvbW1hbmRzKCk7CiAKLSAgICAgICAgaWYgKCFzdHJuY21wKCJPTVguIiwgY29tcG9uZW50LCA0KSkgeworICAgICAgICBpZiAobVN1cmZhY2UgIT0gTlVMTCkgeworICAgICAgICAgICAgLy8gT3RoZXIgZGVjb2RlcnMgYXJlIGluc3RhbnRpYXRlZCBsb2NhbGx5IGFuZCBhcyBhIGNvbnNlcXVlbmNlCisgICAgICAgICAgICAvLyBhbGxvY2F0ZSB0aGVpciBidWZmZXJzIGluIGxvY2FsIGFkZHJlc3Mgc3BhY2UuCisgICAgICAgICAgICBtVmlkZW9SZW5kZXJlciA9IG5ldyBBd2Vzb21lTG9jYWxSZW5kZXJlcigKKyAgICAgICAgICAgICAgICBmYWxzZSwgIC8vIHByZXZpZXdPbmx5CisgICAgICAgICAgICAgICAgY29tcG9uZW50LAorICAgICAgICAgICAgICAgIChPTVhfQ09MT1JfRk9STUFUVFlQRSlmb3JtYXQsCisgICAgICAgICAgICAgICAgbUlTdXJmYWNlLAorICAgICAgICAgICAgICAgIG1TdXJmYWNlLAorICAgICAgICAgICAgICAgIG1WaWRlb1dpZHRoLCBtVmlkZW9IZWlnaHQsCisgICAgICAgICAgICAgICAgZGVjb2RlZFdpZHRoLCBkZWNvZGVkSGVpZ2h0KTsKKyAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIC8vIE91ciBPTVggY29kZWNzIGFsbG9jYXRlIGJ1ZmZlcnMgb24gdGhlIG1lZGlhX3NlcnZlciBzaWRlCiAgICAgICAgICAgICAvLyB0aGVyZWZvcmUgdGhleSByZXF1aXJlIGEgcmVtb3RlIElPTVhSZW5kZXJlciB0aGF0IGtub3dzIGhvdwogICAgICAgICAgICAgLy8gdG8gZGlzcGxheSB0aGVtLgpAQCAtNzIyLDE2ICs3NDYsNiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgKE9NWF9DT0xPUl9GT1JNQVRUWVBFKWZvcm1hdCwKICAgICAgICAgICAgICAgICAgICAgICAgIGRlY29kZWRXaWR0aCwgZGVjb2RlZEhlaWdodCwKICAgICAgICAgICAgICAgICAgICAgICAgIG1WaWRlb1dpZHRoLCBtVmlkZW9IZWlnaHQpKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIE90aGVyIGRlY29kZXJzIGFyZSBpbnN0YW50aWF0ZWQgbG9jYWxseSBhbmQgYXMgYSBjb25zZXF1ZW5jZQotICAgICAgICAgICAgLy8gYWxsb2NhdGUgdGhlaXIgYnVmZmVycyBpbiBsb2NhbCBhZGRyZXNzIHNwYWNlLgotICAgICAgICAgICAgbVZpZGVvUmVuZGVyZXIgPSBuZXcgQXdlc29tZUxvY2FsUmVuZGVyZXIoCi0gICAgICAgICAgICAgICAgZmFsc2UsICAvLyBwcmV2aWV3T25seQotICAgICAgICAgICAgICAgIGNvbXBvbmVudCwKLSAgICAgICAgICAgICAgICAoT01YX0NPTE9SX0ZPUk1BVFRZUEUpZm9ybWF0LAotICAgICAgICAgICAgICAgIG1JU3VyZmFjZSwKLSAgICAgICAgICAgICAgICBtVmlkZW9XaWR0aCwgbVZpZGVvSGVpZ2h0LAotICAgICAgICAgICAgICAgIGRlY29kZWRXaWR0aCwgZGVjb2RlZEhlaWdodCk7CiAgICAgICAgIH0KICAgICB9CiB9CkBAIC03NzAsNiArNzg0LDEyIEBACiAgICAgbUlTdXJmYWNlID0gaXN1cmZhY2U7CiB9CiAKK3ZvaWQgQXdlc29tZVBsYXllcjo6c2V0U3VyZmFjZShjb25zdCBzcDxTdXJmYWNlPiAmc3VyZmFjZSkgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisKKyAgICBtU3VyZmFjZSA9IHN1cmZhY2U7Cit9CisKIHZvaWQgQXdlc29tZVBsYXllcjo6c2V0QXVkaW9TaW5rKAogICAgICAgICBjb25zdCBzcDxNZWRpYVBsYXllckJhc2U6OkF1ZGlvU2luaz4gJmF1ZGlvU2luaykgewogICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CkBAIC0xMDIzLDYgKzEwNDMsOCBAQAogICAgICAgICAgICAgICAgIGlmIChlcnIgPT0gSU5GT19GT1JNQVRfQ0hBTkdFRCkgewogICAgICAgICAgICAgICAgICAgICBMT0dWKCJWaWRlb1NvdXJjZSBzaWduYWxsZWQgZm9ybWF0IGNoYW5nZS4iKTsKIAorICAgICAgICAgICAgICAgICAgICBub3RpZnlWaWRlb1NpemVfbCgpOworCiAgICAgICAgICAgICAgICAgICAgIGlmIChtVmlkZW9SZW5kZXJlciAhPSBOVUxMKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBtVmlkZW9SZW5kZXJlcklzUHJldmlldyA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgICAgICAgaW5pdFJlbmRlcmVyX2woKTsKQEAgLTE1MTQsMTAgKzE1MzYsMTAgQEAKIAogdm9pZCBBd2Vzb21lUGxheWVyOjpmaW5pc2hBc3luY1ByZXBhcmVfbCgpIHsKICAgICBpZiAobUlzQXN5bmNQcmVwYXJlKSB7Ci0gICAgICAgIGlmIChtVmlkZW9XaWR0aCA8IDAgfHwgbVZpZGVvSGVpZ2h0IDwgMCkgeworICAgICAgICBpZiAobVZpZGVvU291cmNlID09IE5VTEwpIHsKICAgICAgICAgICAgIG5vdGlmeUxpc3RlbmVyX2woTUVESUFfU0VUX1ZJREVPX1NJWkUsIDAsIDApOwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbm90aWZ5TGlzdGVuZXJfbChNRURJQV9TRVRfVklERU9fU0laRSwgbVZpZGVvV2lkdGgsIG1WaWRlb0hlaWdodCk7CisgICAgICAgICAgICBub3RpZnlWaWRlb1NpemVfbCgpOwogICAgICAgICB9CiAKICAgICAgICAgbm90aWZ5TGlzdGVuZXJfbChNRURJQV9QUkVQQVJFRCk7CkBAIC0xNjMwLDEzICsxNjUyLDE0IEBACiAKICAgICBtRmxhZ3MgPSBzdGF0ZS0+bUZsYWdzICYgKEFVVE9fTE9PUElORyB8IExPT1BJTkcgfCBBVF9FT1MpOwogCi0gICAgaWYgKHN0YXRlLT5tTGFzdFZpZGVvRnJhbWUgJiYgbUlTdXJmYWNlICE9IE5VTEwpIHsKKyAgICBpZiAoc3RhdGUtPm1MYXN0VmlkZW9GcmFtZSAmJiAobVN1cmZhY2UgIT0gTlVMTCB8fCBtSVN1cmZhY2UgIT0gTlVMTCkpIHsKICAgICAgICAgbVZpZGVvUmVuZGVyZXIgPQogICAgICAgICAgICAgbmV3IEF3ZXNvbWVMb2NhbFJlbmRlcmVyKAogICAgICAgICAgICAgICAgICAgICB0cnVlLCAgLy8gcHJldmlld09ubHkKICAgICAgICAgICAgICAgICAgICAgIiIsCiAgICAgICAgICAgICAgICAgICAgIChPTVhfQ09MT1JfRk9STUFUVFlQRSlzdGF0ZS0+bUNvbG9yRm9ybWF0LAogICAgICAgICAgICAgICAgICAgICBtSVN1cmZhY2UsCisgICAgICAgICAgICAgICAgICAgIG1TdXJmYWNlLAogICAgICAgICAgICAgICAgICAgICBzdGF0ZS0+bVZpZGVvV2lkdGgsCiAgICAgICAgICAgICAgICAgICAgIHN0YXRlLT5tVmlkZW9IZWlnaHQsCiAgICAgICAgICAgICAgICAgICAgIHN0YXRlLT5tRGVjb2RlZFdpZHRoLApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQ2FtZXJhU291cmNlLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0NhbWVyYVNvdXJjZS5jcHAKaW5kZXggM2UzMWQ2MS4uOWNjZDE0MCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQ2FtZXJhU291cmNlLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9DYW1lcmFTb3VyY2UuY3BwCkBAIC02NSw2ICs2NSwxMSBAQAogdm9pZCBDYW1lcmFTb3VyY2VMaXN0ZW5lcjo6cG9zdERhdGEoaW50MzJfdCBtc2dUeXBlLCBjb25zdCBzcDxJTWVtb3J5PiAmZGF0YVB0cikgewogICAgIExPR1YoInBvc3REYXRhKCVkLCBwdHI6JXAsIHNpemU6JWQpIiwKICAgICAgICAgIG1zZ1R5cGUsIGRhdGFQdHItPnBvaW50ZXIoKSwgZGF0YVB0ci0+c2l6ZSgpKTsKKworICAgIHNwPENhbWVyYVNvdXJjZT4gc291cmNlID0gbVNvdXJjZS5wcm9tb3RlKCk7CisgICAgaWYgKHNvdXJjZS5nZXQoKSAhPSBOVUxMKSB7CisgICAgICAgIHNvdXJjZS0+ZGF0YUNhbGxiYWNrKG1zZ1R5cGUsIGRhdGFQdHIpOworICAgIH0KIH0KIAogdm9pZCBDYW1lcmFTb3VyY2VMaXN0ZW5lcjo6cG9zdERhdGFUaW1lc3RhbXAoCkBAIC0xMTgsMTUgKzEyMywxNSBAQAogCiBDYW1lcmFTb3VyY2U6OkNhbWVyYVNvdXJjZShjb25zdCBzcDxDYW1lcmE+ICZjYW1lcmEpCiAgICAgOiBtQ2FtZXJhKGNhbWVyYSksCi0gICAgICBtRmlyc3RGcmFtZVRpbWVVcygwKSwKLSAgICAgIG1MYXN0RnJhbWVUaW1lc3RhbXBVcygwKSwKICAgICAgIG1OdW1GcmFtZXNSZWNlaXZlZCgwKSwKKyAgICAgIG1MYXN0RnJhbWVUaW1lc3RhbXBVcygwKSwKKyAgICAgIG1TdGFydGVkKGZhbHNlKSwKKyAgICAgIG1GaXJzdEZyYW1lVGltZVVzKDApLAogICAgICAgbU51bUZyYW1lc0VuY29kZWQoMCksCiAgICAgICBtTnVtRnJhbWVzRHJvcHBlZCgwKSwKICAgICAgIG1OdW1HbGl0Y2hlcygwKSwKICAgICAgIG1HbGl0Y2hEdXJhdGlvblRocmVzaG9sZFVzKDIwMDAwMCksCi0gICAgICBtQ29sbGVjdFN0YXRzKGZhbHNlKSwKLSAgICAgIG1TdGFydGVkKGZhbHNlKSB7CisgICAgICBtQ29sbGVjdFN0YXRzKGZhbHNlKSB7CiAKICAgICBpbnQ2NF90IHRva2VuID0gSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Y2xlYXJDYWxsaW5nSWRlbnRpdHkoKTsKICAgICBTdHJpbmc4IHMgPSBtQ2FtZXJhLT5nZXRQYXJhbWV0ZXJzKCk7CkBAIC0xNjEsNyArMTY2LDYgQEAKICAgICBtTWV0YS0+c2V0SW50MzIoa0tleUhlaWdodCwgaGVpZ2h0KTsKICAgICBtTWV0YS0+c2V0SW50MzIoa0tleVN0cmlkZSwgc3RyaWRlKTsKICAgICBtTWV0YS0+c2V0SW50MzIoa0tleVNsaWNlSGVpZ2h0LCBzbGljZUhlaWdodCk7Ci0KIH0KIAogQ2FtZXJhU291cmNlOjp+Q2FtZXJhU291cmNlKCkgewpAQCAtMTcwLDYgKzE3NCwxMCBAQAogICAgIH0KIH0KIAordm9pZCBDYW1lcmFTb3VyY2U6OnN0YXJ0Q2FtZXJhUmVjb3JkaW5nKCkgeworICAgIENIRUNLX0VRKE9LLCBtQ2FtZXJhLT5zdGFydFJlY29yZGluZygpKTsKK30KKwogc3RhdHVzX3QgQ2FtZXJhU291cmNlOjpzdGFydChNZXRhRGF0YSAqbWV0YSkgewogICAgIENIRUNLKCFtU3RhcnRlZCk7CiAKQEAgLTE4NywxMyArMTk1LDE3IEBACiAKICAgICBpbnQ2NF90IHRva2VuID0gSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Y2xlYXJDYWxsaW5nSWRlbnRpdHkoKTsKICAgICBtQ2FtZXJhLT5zZXRMaXN0ZW5lcihuZXcgQ2FtZXJhU291cmNlTGlzdGVuZXIodGhpcykpOwotICAgIENIRUNLX0VRKE9LLCBtQ2FtZXJhLT5zdGFydFJlY29yZGluZygpKTsKKyAgICBzdGFydENhbWVyYVJlY29yZGluZygpOwogICAgIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPnJlc3RvcmVDYWxsaW5nSWRlbnRpdHkodG9rZW4pOwogCiAgICAgbVN0YXJ0ZWQgPSB0cnVlOwogICAgIHJldHVybiBPSzsKIH0KIAordm9pZCBDYW1lcmFTb3VyY2U6OnN0b3BDYW1lcmFSZWNvcmRpbmcoKSB7CisgICAgbUNhbWVyYS0+c3RvcFJlY29yZGluZygpOworfQorCiBzdGF0dXNfdCBDYW1lcmFTb3VyY2U6OnN0b3AoKSB7CiAgICAgTE9HVigic3RvcCIpOwogICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CkBAIC0yMDIsNyArMjE0LDcgQEAKIAogICAgIGludDY0X3QgdG9rZW4gPSBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5jbGVhckNhbGxpbmdJZGVudGl0eSgpOwogICAgIG1DYW1lcmEtPnNldExpc3RlbmVyKE5VTEwpOwotICAgIG1DYW1lcmEtPnN0b3BSZWNvcmRpbmcoKTsKKyAgICBzdG9wQ2FtZXJhUmVjb3JkaW5nKCk7CiAgICAgcmVsZWFzZVF1ZXVlZEZyYW1lcygpOwogICAgIHdoaWxlICghbUZyYW1lc0JlaW5nRW5jb2RlZC5lbXB0eSgpKSB7CiAgICAgICAgIExPR0koIldhaXRpbmcgZm9yIG91dHN0YW5kaW5nIGZyYW1lcyBiZWluZyBlbmNvZGVkOiAlZCIsCkBAIC0yMjIsMTEgKzIzNCwxNSBAQAogICAgIHJldHVybiBPSzsKIH0KIAordm9pZCBDYW1lcmFTb3VyY2U6OnJlbGVhc2VSZWNvcmRpbmdGcmFtZShjb25zdCBzcDxJTWVtb3J5PiYgZnJhbWUpIHsKKyAgICBtQ2FtZXJhLT5yZWxlYXNlUmVjb3JkaW5nRnJhbWUoZnJhbWUpOworfQorCiB2b2lkIENhbWVyYVNvdXJjZTo6cmVsZWFzZVF1ZXVlZEZyYW1lcygpIHsKICAgICBMaXN0PHNwPElNZW1vcnk+ID46Oml0ZXJhdG9yIGl0OwogICAgIHdoaWxlICghbUZyYW1lc1JlY2VpdmVkLmVtcHR5KCkpIHsKICAgICAgICAgaXQgPSBtRnJhbWVzUmVjZWl2ZWQuYmVnaW4oKTsKLSAgICAgICAgbUNhbWVyYS0+cmVsZWFzZVJlY29yZGluZ0ZyYW1lKCppdCk7CisgICAgICAgIHJlbGVhc2VSZWNvcmRpbmdGcmFtZSgqaXQpOwogICAgICAgICBtRnJhbWVzUmVjZWl2ZWQuZXJhc2UoaXQpOwogICAgICAgICArK21OdW1GcmFtZXNEcm9wcGVkOwogICAgIH0KQEAgLTIzOCw3ICsyNTQsNyBAQAogCiB2b2lkIENhbWVyYVNvdXJjZTo6cmVsZWFzZU9uZVJlY29yZGluZ0ZyYW1lKGNvbnN0IHNwPElNZW1vcnk+JiBmcmFtZSkgewogICAgIGludDY0X3QgdG9rZW4gPSBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5jbGVhckNhbGxpbmdJZGVudGl0eSgpOwotICAgIG1DYW1lcmEtPnJlbGVhc2VSZWNvcmRpbmdGcmFtZShmcmFtZSk7CisgICAgcmVsZWFzZVJlY29yZGluZ0ZyYW1lKGZyYW1lKTsKICAgICBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5yZXN0b3JlQ2FsbGluZ0lkZW50aXR5KHRva2VuKTsKIH0KIApAQCAtMjQ4LDcgKzI2NCw2IEBACiAgICAgZm9yIChMaXN0PHNwPElNZW1vcnk+ID46Oml0ZXJhdG9yIGl0ID0gbUZyYW1lc0JlaW5nRW5jb2RlZC5iZWdpbigpOwogICAgICAgICAgaXQgIT0gbUZyYW1lc0JlaW5nRW5jb2RlZC5lbmQoKTsgKytpdCkgewogICAgICAgICBpZiAoKCppdCktPnBvaW50ZXIoKSA9PSAgYnVmZmVyLT5kYXRhKCkpIHsKLQogICAgICAgICAgICAgcmVsZWFzZU9uZVJlY29yZGluZ0ZyYW1lKCgqaXQpKTsKICAgICAgICAgICAgIG1GcmFtZXNCZWluZ0VuY29kZWQuZXJhc2UoaXQpOwogICAgICAgICAgICAgKyttTnVtRnJhbWVzRW5jb2RlZDsKQEAgLTM0MCw2ICszNTUsMTMgQEAKICAgICAgICAgKyttTnVtR2xpdGNoZXM7CiAgICAgfQogCisgICAgLy8gTWF5IG5lZWQgdG8gc2tpcCBmcmFtZSBvciBtb2RpZnkgdGltZXN0YW1wLiBDdXJyZW50bHkgaW1wbGVtZW50ZWQKKyAgICAvLyBieSB0aGUgc3ViY2xhc3MgQ2FtZXJhU291cmNlVGltZUxhcHNlLgorICAgIGlmKHNraXBDdXJyZW50RnJhbWUodGltZXN0YW1wVXMpKSB7CisgICAgICAgIHJlbGVhc2VPbmVSZWNvcmRpbmdGcmFtZShkYXRhKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKwogICAgIG1MYXN0RnJhbWVUaW1lc3RhbXBVcyA9IHRpbWVzdGFtcFVzOwogICAgIGlmIChtTnVtRnJhbWVzUmVjZWl2ZWQgPT0gMCkgewogICAgICAgICBtRmlyc3RGcmFtZVRpbWVVcyA9IHRpbWVzdGFtcFVzOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQ2FtZXJhU291cmNlVGltZUxhcHNlLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0NhbWVyYVNvdXJjZVRpbWVMYXBzZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDRkMTU5YQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0NhbWVyYVNvdXJjZVRpbWVMYXBzZS5jcHAKQEAgLTAsMCArMSwzODkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIkNhbWVyYVNvdXJjZVRpbWVMYXBzZSIKKworI2luY2x1ZGUgPGJpbmRlci9JUENUaHJlYWRTdGF0ZS5oPgorI2luY2x1ZGUgPGJpbmRlci9NZW1vcnlCYXNlLmg+CisjaW5jbHVkZSA8YmluZGVyL01lbW9yeUhlYXBCYXNlLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvQ2FtZXJhU291cmNlLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvQ2FtZXJhU291cmNlVGltZUxhcHNlLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFEZWJ1Zy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvWVVWSW1hZ2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9ZVVZDYW52YXMuaD4KKyNpbmNsdWRlIDxjYW1lcmEvQ2FtZXJhLmg+CisjaW5jbHVkZSA8Y2FtZXJhL0NhbWVyYVBhcmFtZXRlcnMuaD4KKyNpbmNsdWRlIDx1aS9SZWN0Lmg+CisjaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgorI2luY2x1ZGUgPHV0aWxzL1ZlY3Rvci5oPgorI2luY2x1ZGUgIk9NWF9WaWRlby5oIgorI2luY2x1ZGUgPGxpbWl0cy5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKy8vIHN0YXRpYworQ2FtZXJhU291cmNlVGltZUxhcHNlICpDYW1lcmFTb3VyY2VUaW1lTGFwc2U6OkNyZWF0ZSgKKyAgICAgICAgaW50NjRfdCB0aW1lQmV0d2VlblRpbWVMYXBzZUZyYW1lQ2FwdHVyZVVzLAorICAgICAgICBpbnQzMl90IHdpZHRoLCBpbnQzMl90IGhlaWdodCwKKyAgICAgICAgaW50MzJfdCB2aWRlb0ZyYW1lUmF0ZSkgeworICAgIHNwPENhbWVyYT4gY2FtZXJhID0gQ2FtZXJhOjpjb25uZWN0KDApOworCisgICAgaWYgKGNhbWVyYS5nZXQoKSA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIHJldHVybiBuZXcgQ2FtZXJhU291cmNlVGltZUxhcHNlKGNhbWVyYSwgdGltZUJldHdlZW5UaW1lTGFwc2VGcmFtZUNhcHR1cmVVcywKKyAgICAgICAgICAgIHdpZHRoLCBoZWlnaHQsIHZpZGVvRnJhbWVSYXRlKTsKK30KKworLy8gc3RhdGljCitDYW1lcmFTb3VyY2VUaW1lTGFwc2UgKkNhbWVyYVNvdXJjZVRpbWVMYXBzZTo6Q3JlYXRlRnJvbUNhbWVyYShjb25zdCBzcDxDYW1lcmE+ICZjYW1lcmEsCisgICAgICAgIGludDY0X3QgdGltZUJldHdlZW5UaW1lTGFwc2VGcmFtZUNhcHR1cmVVcywKKyAgICAgICAgaW50MzJfdCB3aWR0aCwgaW50MzJfdCBoZWlnaHQsCisgICAgICAgIGludDMyX3QgdmlkZW9GcmFtZVJhdGUpIHsKKyAgICBpZiAoY2FtZXJhLmdldCgpID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgcmV0dXJuIG5ldyBDYW1lcmFTb3VyY2VUaW1lTGFwc2UoY2FtZXJhLCB0aW1lQmV0d2VlblRpbWVMYXBzZUZyYW1lQ2FwdHVyZVVzLAorICAgICAgICAgICAgd2lkdGgsIGhlaWdodCwgdmlkZW9GcmFtZVJhdGUpOworfQorCitDYW1lcmFTb3VyY2VUaW1lTGFwc2U6OkNhbWVyYVNvdXJjZVRpbWVMYXBzZShjb25zdCBzcDxDYW1lcmE+ICZjYW1lcmEsCisgICAgICAgIGludDY0X3QgdGltZUJldHdlZW5UaW1lTGFwc2VGcmFtZUNhcHR1cmVVcywKKyAgICAgICAgaW50MzJfdCB3aWR0aCwgaW50MzJfdCBoZWlnaHQsCisgICAgICAgIGludDMyX3QgdmlkZW9GcmFtZVJhdGUpCisgICAgOiBDYW1lcmFTb3VyY2UoY2FtZXJhKSwKKyAgICAgIG1UaW1lQmV0d2VlblRpbWVMYXBzZUZyYW1lQ2FwdHVyZVVzKHRpbWVCZXR3ZWVuVGltZUxhcHNlRnJhbWVDYXB0dXJlVXMpLAorICAgICAgbVRpbWVCZXR3ZWVuVGltZUxhcHNlVmlkZW9GcmFtZXNVcygxRTYvdmlkZW9GcmFtZVJhdGUpLAorICAgICAgbUxhc3RUaW1lTGFwc2VGcmFtZVJlYWxUaW1lc3RhbXBVcygwKSwKKyAgICAgIG1Ta2lwQ3VycmVudEZyYW1lKGZhbHNlKSB7CisKKyAgICBMT0dWKCJzdGFydGluZyB0aW1lIGxhcHNlIG1vZGUiKTsKKyAgICBtVmlkZW9XaWR0aCA9IHdpZHRoOworICAgIG1WaWRlb0hlaWdodCA9IGhlaWdodDsKKworICAgIGlmICh0cnlTZXR0aW5nUHJldmlld1NpemUod2lkdGgsIGhlaWdodCkpIHsKKyAgICAgICAgbVVzZVN0aWxsQ2FtZXJhRm9yVGltZUxhcHNlID0gZmFsc2U7CisgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gVE9ETzogQWRkIGEgY2hlY2sgdG8gc2VlIHRoYXQgbVRpbWVCZXR3ZWVuVGltZUxhcHNlRnJhbWVDYXB0dXJlVXMgaXMgZ3JlYXRlcgorICAgICAgICAvLyB0aGFuIHRoZSBmYXN0ZXN0IHJhdGUgYXQgd2hpY2ggdGhlIHN0aWxsIGNhbWVyYSBjYW4gdGFrZSBwaWN0dXJlcy4KKyAgICAgICAgbVVzZVN0aWxsQ2FtZXJhRm9yVGltZUxhcHNlID0gdHJ1ZTsKKyAgICAgICAgQ0hFQ0soc2V0UGljdHVyZVNpemVUb0Nsb3Nlc3RTdXBwb3J0ZWQod2lkdGgsIGhlaWdodCkpOworICAgICAgICBtTmVlZENyb3BwaW5nID0gY29tcHV0ZUNyb3BSZWN0YW5nbGVPZmZzZXQoKTsKKyAgICAgICAgbU1ldGEtPnNldEludDMyKGtLZXlXaWR0aCwgd2lkdGgpOworICAgICAgICBtTWV0YS0+c2V0SW50MzIoa0tleUhlaWdodCwgaGVpZ2h0KTsKKyAgICB9Cit9CisKK0NhbWVyYVNvdXJjZVRpbWVMYXBzZTo6fkNhbWVyYVNvdXJjZVRpbWVMYXBzZSgpIHsKK30KKworYm9vbCBDYW1lcmFTb3VyY2VUaW1lTGFwc2U6OnRyeVNldHRpbmdQcmV2aWV3U2l6ZShpbnQzMl90IHdpZHRoLCBpbnQzMl90IGhlaWdodCkgeworICAgIGludDY0X3QgdG9rZW4gPSBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5jbGVhckNhbGxpbmdJZGVudGl0eSgpOworICAgIFN0cmluZzggcyA9IG1DYW1lcmEtPmdldFBhcmFtZXRlcnMoKTsKKyAgICBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5yZXN0b3JlQ2FsbGluZ0lkZW50aXR5KHRva2VuKTsKKworICAgIENhbWVyYVBhcmFtZXRlcnMgcGFyYW1zKHMpOworICAgIFZlY3RvcjxTaXplPiBzdXBwb3J0ZWRTaXplczsKKyAgICBwYXJhbXMuZ2V0U3VwcG9ydGVkUHJldmlld1NpemVzKHN1cHBvcnRlZFNpemVzKTsKKworICAgIGJvb2wgcHJldmlld1NpemVTdXBwb3J0ZWQgPSBmYWxzZTsKKyAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgc3VwcG9ydGVkU2l6ZXMuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgaW50MzJfdCBwaWN0dXJlV2lkdGggPSBzdXBwb3J0ZWRTaXplc1tpXS53aWR0aDsKKyAgICAgICAgaW50MzJfdCBwaWN0dXJlSGVpZ2h0ID0gc3VwcG9ydGVkU2l6ZXNbaV0uaGVpZ2h0OworCisgICAgICAgIGlmICgocGljdHVyZVdpZHRoID09IHdpZHRoKSAmJiAocGljdHVyZUhlaWdodCA9PSBoZWlnaHQpKSB7CisgICAgICAgICAgICBwcmV2aWV3U2l6ZVN1cHBvcnRlZCA9IHRydWU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAocHJldmlld1NpemVTdXBwb3J0ZWQpIHsKKyAgICAgICAgTE9HVigiVmlkZW8gc2l6ZSAoJWQsICVkKSBpcyBhIHN1cHBvcnRlZCBwcmV2aWV3IHNpemUiLCB3aWR0aCwgaGVpZ2h0KTsKKyAgICAgICAgcGFyYW1zLnNldFByZXZpZXdTaXplKHdpZHRoLCBoZWlnaHQpOworICAgICAgICBDSEVDSyhtQ2FtZXJhLT5zZXRQYXJhbWV0ZXJzKHBhcmFtcy5mbGF0dGVuKCkpKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgcmV0dXJuIGZhbHNlOworfQorCitib29sIENhbWVyYVNvdXJjZVRpbWVMYXBzZTo6c2V0UGljdHVyZVNpemVUb0Nsb3Nlc3RTdXBwb3J0ZWQoaW50MzJfdCB3aWR0aCwgaW50MzJfdCBoZWlnaHQpIHsKKyAgICBpbnQ2NF90IHRva2VuID0gSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Y2xlYXJDYWxsaW5nSWRlbnRpdHkoKTsKKyAgICBTdHJpbmc4IHMgPSBtQ2FtZXJhLT5nZXRQYXJhbWV0ZXJzKCk7CisgICAgSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+cmVzdG9yZUNhbGxpbmdJZGVudGl0eSh0b2tlbik7CisKKyAgICBDYW1lcmFQYXJhbWV0ZXJzIHBhcmFtcyhzKTsKKyAgICBWZWN0b3I8U2l6ZT4gc3VwcG9ydGVkU2l6ZXM7CisgICAgcGFyYW1zLmdldFN1cHBvcnRlZFBpY3R1cmVTaXplcyhzdXBwb3J0ZWRTaXplcyk7CisKKyAgICBpbnQzMl90IG1pblBpY3R1cmVTaXplID0gSU5UX01BWDsKKyAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgc3VwcG9ydGVkU2l6ZXMuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgaW50MzJfdCBwaWN0dXJlV2lkdGggPSBzdXBwb3J0ZWRTaXplc1tpXS53aWR0aDsKKyAgICAgICAgaW50MzJfdCBwaWN0dXJlSGVpZ2h0ID0gc3VwcG9ydGVkU2l6ZXNbaV0uaGVpZ2h0OworCisgICAgICAgIGlmICgocGljdHVyZVdpZHRoID49IHdpZHRoKSAmJiAocGljdHVyZUhlaWdodCA+PSBoZWlnaHQpKSB7CisgICAgICAgICAgICBpbnQzMl90IHBpY3R1cmVTaXplID0gcGljdHVyZVdpZHRoKnBpY3R1cmVIZWlnaHQ7CisgICAgICAgICAgICBpZiAocGljdHVyZVNpemUgPCBtaW5QaWN0dXJlU2l6ZSkgeworICAgICAgICAgICAgICAgIG1pblBpY3R1cmVTaXplID0gcGljdHVyZVNpemU7CisgICAgICAgICAgICAgICAgbVBpY3R1cmVXaWR0aCA9IHBpY3R1cmVXaWR0aDsKKyAgICAgICAgICAgICAgICBtUGljdHVyZUhlaWdodCA9IHBpY3R1cmVIZWlnaHQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgTE9HVigiUGljdHVyZSBzaXplID0gKCVkLCAlZCkiLCBtUGljdHVyZVdpZHRoLCBtUGljdHVyZUhlaWdodCk7CisgICAgcmV0dXJuIChtaW5QaWN0dXJlU2l6ZSAhPSBJTlRfTUFYKTsKK30KKworYm9vbCBDYW1lcmFTb3VyY2VUaW1lTGFwc2U6OmNvbXB1dGVDcm9wUmVjdGFuZ2xlT2Zmc2V0KCkgeworICAgIGlmICgobVBpY3R1cmVXaWR0aCA9PSBtVmlkZW9XaWR0aCkgJiYgKG1QaWN0dXJlSGVpZ2h0ID09IG1WaWRlb0hlaWdodCkpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIENIRUNLKChtUGljdHVyZVdpZHRoID4gbVZpZGVvV2lkdGgpICYmIChtUGljdHVyZUhlaWdodCA+IG1WaWRlb0hlaWdodCkpOworCisgICAgaW50MzJfdCB3aWR0aERpZmZlcmVuY2UgPSBtUGljdHVyZVdpZHRoIC0gbVZpZGVvV2lkdGg7CisgICAgaW50MzJfdCBoZWlnaHREaWZmZXJlbmNlID0gbVBpY3R1cmVIZWlnaHQgLSBtVmlkZW9IZWlnaHQ7CisKKyAgICBtQ3JvcFJlY3RTdGFydFggPSB3aWR0aERpZmZlcmVuY2UvMjsKKyAgICBtQ3JvcFJlY3RTdGFydFkgPSBoZWlnaHREaWZmZXJlbmNlLzI7CisKKyAgICBMT0dWKCJzZXR0aW5nIGNyb3AgcmVjdGFuZ2xlIG9mZnNldCB0byAoJWQsICVkKSIsIG1Dcm9wUmVjdFN0YXJ0WCwgbUNyb3BSZWN0U3RhcnRZKTsKKworICAgIHJldHVybiB0cnVlOworfQorCisvLyBzdGF0aWMKK3ZvaWQgKkNhbWVyYVNvdXJjZVRpbWVMYXBzZTo6VGhyZWFkVGltZUxhcHNlV3JhcHBlcih2b2lkICptZSkgeworICAgIENhbWVyYVNvdXJjZVRpbWVMYXBzZSAqc291cmNlID0gc3RhdGljX2Nhc3Q8Q2FtZXJhU291cmNlVGltZUxhcHNlICo+KG1lKTsKKyAgICBzb3VyY2UtPnRocmVhZFRpbWVMYXBzZUVudHJ5KCk7CisgICAgcmV0dXJuIE5VTEw7Cit9CisKK3ZvaWQgQ2FtZXJhU291cmNlVGltZUxhcHNlOjp0aHJlYWRUaW1lTGFwc2VFbnRyeSgpIHsKKyAgICB3aGlsZShtU3RhcnRlZCkgeworICAgICAgICBpZiAobUNhbWVyYUlkbGUpIHsKKyAgICAgICAgICAgIExPR1YoInRocmVhZFRpbWVMYXBzZUVudHJ5OiB0YWtpbmcgcGljdHVyZSIpOworICAgICAgICAgICAgQ0hFQ0tfRVEoT0ssIG1DYW1lcmEtPnRha2VQaWN0dXJlKCkpOworICAgICAgICAgICAgbUNhbWVyYUlkbGUgPSBmYWxzZTsKKyAgICAgICAgICAgIHVzbGVlcChtVGltZUJldHdlZW5UaW1lTGFwc2VGcmFtZUNhcHR1cmVVcyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBMT0dWKCJ0aHJlYWRUaW1lTGFwc2VFbnRyeTogY2FtZXJhIGJ1c3kgd2l0aCBvbGQgdGFrZVBpY3R1cmUuIFNsZWVwaW5nIGEgbGl0dGxlLiIpOworICAgICAgICAgICAgdXNsZWVwKDFFNCk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQgQ2FtZXJhU291cmNlVGltZUxhcHNlOjpzdGFydENhbWVyYVJlY29yZGluZygpIHsKKyAgICBpZiAobVVzZVN0aWxsQ2FtZXJhRm9yVGltZUxhcHNlKSB7CisgICAgICAgIExPR1YoInN0YXJ0IHRpbWUgbGFwc2UgcmVjb3JkaW5nIHVzaW5nIHN0aWxsIGNhbWVyYSIpOworCisgICAgICAgIGludDY0X3QgdG9rZW4gPSBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5jbGVhckNhbGxpbmdJZGVudGl0eSgpOworICAgICAgICBTdHJpbmc4IHMgPSBtQ2FtZXJhLT5nZXRQYXJhbWV0ZXJzKCk7CisgICAgICAgIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPnJlc3RvcmVDYWxsaW5nSWRlbnRpdHkodG9rZW4pOworCisgICAgICAgIENhbWVyYVBhcmFtZXRlcnMgcGFyYW1zKHMpOworICAgICAgICBwYXJhbXMuc2V0UGljdHVyZVNpemUobVBpY3R1cmVXaWR0aCwgbVBpY3R1cmVIZWlnaHQpOworICAgICAgICBtQ2FtZXJhLT5zZXRQYXJhbWV0ZXJzKHBhcmFtcy5mbGF0dGVuKCkpOworICAgICAgICBtQ2FtZXJhSWRsZSA9IHRydWU7CisKKyAgICAgICAgLy8gZGlzYWJsZSBzaHV0dGVyIHNvdW5kIGFuZCBwbGF5IHRoZSByZWNvcmRpbmcgc291bmQuCisgICAgICAgIG1DYW1lcmEtPnNlbmRDb21tYW5kKENBTUVSQV9DTURfRU5BQkxFX1NIVVRURVJfU09VTkQsIDAsIDApOworICAgICAgICBtQ2FtZXJhLT5zZW5kQ29tbWFuZChDQU1FUkFfQ01EX1BMQVlfUkVDT1JESU5HX1NPVU5ELCAwLCAwKTsKKworICAgICAgICAvLyBjcmVhdGUgYSB0aHJlYWQgd2hpY2ggdGFrZXMgcGljdHVyZXMgaW4gYSBsb29wCisgICAgICAgIHB0aHJlYWRfYXR0cl90IGF0dHI7CisgICAgICAgIHB0aHJlYWRfYXR0cl9pbml0KCZhdHRyKTsKKyAgICAgICAgcHRocmVhZF9hdHRyX3NldGRldGFjaHN0YXRlKCZhdHRyLCBQVEhSRUFEX0NSRUFURV9KT0lOQUJMRSk7CisKKyAgICAgICAgcHRocmVhZF9jcmVhdGUoJm1UaHJlYWRUaW1lTGFwc2UsICZhdHRyLCBUaHJlYWRUaW1lTGFwc2VXcmFwcGVyLCB0aGlzKTsKKyAgICAgICAgcHRocmVhZF9hdHRyX2Rlc3Ryb3koJmF0dHIpOworICAgIH0gZWxzZSB7CisgICAgICAgIExPR1YoInN0YXJ0IHRpbWUgbGFwc2UgcmVjb3JkaW5nIHVzaW5nIHZpZGVvIGNhbWVyYSIpOworICAgICAgICBDSEVDS19FUShPSywgbUNhbWVyYS0+c3RhcnRSZWNvcmRpbmcoKSk7CisgICAgfQorfQorCit2b2lkIENhbWVyYVNvdXJjZVRpbWVMYXBzZTo6c3RvcENhbWVyYVJlY29yZGluZygpIHsKKyAgICBpZiAobVVzZVN0aWxsQ2FtZXJhRm9yVGltZUxhcHNlKSB7CisgICAgICAgIHZvaWQgKmR1bW15OworICAgICAgICBwdGhyZWFkX2pvaW4obVRocmVhZFRpbWVMYXBzZSwgJmR1bW15KTsKKworICAgICAgICAvLyBwbGF5IHRoZSByZWNvcmRpbmcgc291bmQgYW5kIHJlc3RhcnQgcHJldmlldy4KKyAgICAgICAgbUNhbWVyYS0+c2VuZENvbW1hbmQoQ0FNRVJBX0NNRF9QTEFZX1JFQ09SRElOR19TT1VORCwgMCwgMCk7CisgICAgICAgIENIRUNLX0VRKE9LLCBtQ2FtZXJhLT5zdGFydFByZXZpZXcoKSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbUNhbWVyYS0+c3RvcFJlY29yZGluZygpOworICAgIH0KK30KKwordm9pZCBDYW1lcmFTb3VyY2VUaW1lTGFwc2U6OnJlbGVhc2VSZWNvcmRpbmdGcmFtZShjb25zdCBzcDxJTWVtb3J5PiYgZnJhbWUpIHsKKyAgICBpZiAoIW1Vc2VTdGlsbENhbWVyYUZvclRpbWVMYXBzZSkgeworICAgICAgICBtQ2FtZXJhLT5yZWxlYXNlUmVjb3JkaW5nRnJhbWUoZnJhbWUpOworICAgIH0KK30KKworc3A8SU1lbW9yeT4gQ2FtZXJhU291cmNlVGltZUxhcHNlOjpjcmVhdGVJTWVtb3J5Q29weShjb25zdCBzcDxJTWVtb3J5PiAmc291cmNlX2RhdGEpIHsKKyAgICBzaXplX3Qgc291cmNlX3NpemUgPSBzb3VyY2VfZGF0YS0+c2l6ZSgpOworICAgIHZvaWQqIHNvdXJjZV9wb2ludGVyID0gc291cmNlX2RhdGEtPnBvaW50ZXIoKTsKKworICAgIHNwPE1lbW9yeUhlYXBCYXNlPiBuZXdNZW1vcnlIZWFwID0gbmV3IE1lbW9yeUhlYXBCYXNlKHNvdXJjZV9zaXplKTsKKyAgICBzcDxNZW1vcnlCYXNlPiBuZXdNZW1vcnkgPSBuZXcgTWVtb3J5QmFzZShuZXdNZW1vcnlIZWFwLCAwLCBzb3VyY2Vfc2l6ZSk7CisgICAgbWVtY3B5KG5ld01lbW9yeS0+cG9pbnRlcigpLCBzb3VyY2VfcG9pbnRlciwgc291cmNlX3NpemUpOworICAgIHJldHVybiBuZXdNZW1vcnk7Cit9CisKKy8vIEFsbG9jYXRlcyBJTWVtb3J5IG9mIGZpbmFsIHR5cGUgTWVtb3J5QmFzZSB3aXRoIHRoZSBnaXZlbiBzaXplLgorc3A8SU1lbW9yeT4gYWxsb2NhdGVJTWVtb3J5KHNpemVfdCBzaXplKSB7CisgICAgc3A8TWVtb3J5SGVhcEJhc2U+IG5ld01lbW9yeUhlYXAgPSBuZXcgTWVtb3J5SGVhcEJhc2Uoc2l6ZSk7CisgICAgc3A8TWVtb3J5QmFzZT4gbmV3TWVtb3J5ID0gbmV3IE1lbW9yeUJhc2UobmV3TWVtb3J5SGVhcCwgMCwgc2l6ZSk7CisgICAgcmV0dXJuIG5ld01lbW9yeTsKK30KKworLy8gc3RhdGljCit2b2lkICpDYW1lcmFTb3VyY2VUaW1lTGFwc2U6OlRocmVhZFN0YXJ0UHJldmlld1dyYXBwZXIodm9pZCAqbWUpIHsKKyAgICBDYW1lcmFTb3VyY2VUaW1lTGFwc2UgKnNvdXJjZSA9IHN0YXRpY19jYXN0PENhbWVyYVNvdXJjZVRpbWVMYXBzZSAqPihtZSk7CisgICAgc291cmNlLT50aHJlYWRTdGFydFByZXZpZXcoKTsKKyAgICByZXR1cm4gTlVMTDsKK30KKwordm9pZCBDYW1lcmFTb3VyY2VUaW1lTGFwc2U6OnRocmVhZFN0YXJ0UHJldmlldygpIHsKKyAgICBDSEVDS19FUShPSywgbUNhbWVyYS0+c3RhcnRQcmV2aWV3KCkpOworICAgIG1DYW1lcmFJZGxlID0gdHJ1ZTsKK30KKwordm9pZCBDYW1lcmFTb3VyY2VUaW1lTGFwc2U6OnJlc3RhcnRQcmV2aWV3KCkgeworICAgIC8vIFN0YXJ0IHRoaXMgaW4gYSBkaWZmZXJlbnQgdGhyZWFkLCBzbyB0aGF0IHRoZSBkYXRhQ2FsbGJhY2sgY2FuIHJldHVybgorICAgIExPR1YoInJlc3RhcnRQcmV2aWV3Iik7CisgICAgcHRocmVhZF9hdHRyX3QgYXR0cjsKKyAgICBwdGhyZWFkX2F0dHJfaW5pdCgmYXR0cik7CisgICAgcHRocmVhZF9hdHRyX3NldGRldGFjaHN0YXRlKCZhdHRyLCBQVEhSRUFEX0NSRUFURV9ERVRBQ0hFRCk7CisKKyAgICBwdGhyZWFkX3QgdGhyZWFkUHJldmlldzsKKyAgICBwdGhyZWFkX2NyZWF0ZSgmdGhyZWFkUHJldmlldywgJmF0dHIsIFRocmVhZFN0YXJ0UHJldmlld1dyYXBwZXIsIHRoaXMpOworICAgIHB0aHJlYWRfYXR0cl9kZXN0cm95KCZhdHRyKTsKK30KKworc3A8SU1lbW9yeT4gQ2FtZXJhU291cmNlVGltZUxhcHNlOjpjcm9wWVVWSW1hZ2UoY29uc3Qgc3A8SU1lbW9yeT4gJnNvdXJjZV9kYXRhKSB7CisgICAgLy8gZmluZCB0aGUgWVVWIGZvcm1hdAorICAgIGludDMyX3Qgc3JjRm9ybWF0OworICAgIENIRUNLKG1NZXRhLT5maW5kSW50MzIoa0tleUNvbG9yRm9ybWF0LCAmc3JjRm9ybWF0KSk7CisgICAgWVVWSW1hZ2U6OllVVkZvcm1hdCB5dXZGb3JtYXQ7CisgICAgaWYgKHNyY0Zvcm1hdCA9PSBPTVhfQ09MT1JfRm9ybWF0WVVWNDIwU2VtaVBsYW5hcikgeworICAgICAgICB5dXZGb3JtYXQgPSBZVVZJbWFnZTo6WVVWNDIwU2VtaVBsYW5hcjsKKyAgICB9IGVsc2UgaWYgKHNyY0Zvcm1hdCA9PSBPTVhfQ09MT1JfRm9ybWF0WVVWNDIwUGxhbmFyKSB7CisgICAgICAgIHl1dkZvcm1hdCA9IFlVVkltYWdlOjpZVVY0MjBQbGFuYXI7CisgICAgfQorCisgICAgLy8gYWxsb2NhdGUgbWVtb3J5IGZvciBjcm9wcGVkIGltYWdlIGFuZCBzZXR1cCBhIGNhbnZhcyB1c2luZyBpdC4KKyAgICBzcDxJTWVtb3J5PiBjcm9wcGVkSW1hZ2VNZW1vcnkgPSBhbGxvY2F0ZUlNZW1vcnkoCisgICAgICAgICAgICBZVVZJbWFnZTo6YnVmZmVyU2l6ZSh5dXZGb3JtYXQsIG1WaWRlb1dpZHRoLCBtVmlkZW9IZWlnaHQpKTsKKyAgICBZVVZJbWFnZSB5dXZJbWFnZUNyb3BwZWQoeXV2Rm9ybWF0LAorICAgICAgICAgICAgbVZpZGVvV2lkdGgsIG1WaWRlb0hlaWdodCwKKyAgICAgICAgICAgICh1aW50OF90ICopY3JvcHBlZEltYWdlTWVtb3J5LT5wb2ludGVyKCkpOworICAgIFlVVkNhbnZhcyB5dXZDYW52YXNDcm9wKHl1dkltYWdlQ3JvcHBlZCk7CisKKyAgICBZVVZJbWFnZSB5dXZJbWFnZVNvdXJjZSh5dXZGb3JtYXQsCisgICAgICAgICAgICBtUGljdHVyZVdpZHRoLCBtUGljdHVyZUhlaWdodCwKKyAgICAgICAgICAgICh1aW50OF90ICopc291cmNlX2RhdGEtPnBvaW50ZXIoKSk7CisgICAgeXV2Q2FudmFzQ3JvcC5Db3B5SW1hZ2VSZWN0KAorICAgICAgICAgICAgUmVjdChtQ3JvcFJlY3RTdGFydFgsIG1Dcm9wUmVjdFN0YXJ0WSwKKyAgICAgICAgICAgICAgICBtQ3JvcFJlY3RTdGFydFggKyBtVmlkZW9XaWR0aCwKKyAgICAgICAgICAgICAgICBtQ3JvcFJlY3RTdGFydFkgKyBtVmlkZW9IZWlnaHQpLAorICAgICAgICAgICAgMCwgMCwKKyAgICAgICAgICAgIHl1dkltYWdlU291cmNlKTsKKworICAgIHJldHVybiBjcm9wcGVkSW1hZ2VNZW1vcnk7Cit9CisKK3ZvaWQgQ2FtZXJhU291cmNlVGltZUxhcHNlOjpkYXRhQ2FsbGJhY2soaW50MzJfdCBtc2dUeXBlLCBjb25zdCBzcDxJTWVtb3J5PiAmZGF0YSkgeworICAgIGlmIChtc2dUeXBlID09IENBTUVSQV9NU0dfQ09NUFJFU1NFRF9JTUFHRSkgeworICAgICAgICAvLyB0YWtlUGljdHVyZSB3aWxsIGNvbXBsZXRlIGFmdGVyIHRoaXMgY2FsbGJhY2ssIHNvIHJlc3RhcnQgcHJldmlldy4KKyAgICAgICAgcmVzdGFydFByZXZpZXcoKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBpZiAobXNnVHlwZSAhPSBDQU1FUkFfTVNHX1JBV19JTUFHRSkgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgTE9HVigiZGF0YUNhbGxiYWNrIGZvciB0aW1lbGFwc2Ugc3RpbGwgZnJhbWUiKTsKKyAgICBDSEVDS19FUSh0cnVlLCBtVXNlU3RpbGxDYW1lcmFGb3JUaW1lTGFwc2UpOworCisgICAgaW50NjRfdCB0aW1lc3RhbXBVczsKKyAgICBpZiAobU51bUZyYW1lc1JlY2VpdmVkID09IDApIHsKKyAgICAgICAgdGltZXN0YW1wVXMgPSBtU3RhcnRUaW1lVXM7CisgICAgfSBlbHNlIHsKKyAgICAgICAgdGltZXN0YW1wVXMgPSBtTGFzdEZyYW1lVGltZXN0YW1wVXMgKyBtVGltZUJldHdlZW5UaW1lTGFwc2VWaWRlb0ZyYW1lc1VzOworICAgIH0KKworICAgIGlmIChtTmVlZENyb3BwaW5nKSB7CisgICAgICAgIHNwPElNZW1vcnk+IGNyb3BwZWRJbWFnZURhdGEgPSBjcm9wWVVWSW1hZ2UoZGF0YSk7CisgICAgICAgIGRhdGFDYWxsYmFja1RpbWVzdGFtcCh0aW1lc3RhbXBVcywgbXNnVHlwZSwgY3JvcHBlZEltYWdlRGF0YSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgc3A8SU1lbW9yeT4gZGF0YUNvcHkgPSBjcmVhdGVJTWVtb3J5Q29weShkYXRhKTsKKyAgICAgICAgZGF0YUNhbGxiYWNrVGltZXN0YW1wKHRpbWVzdGFtcFVzLCBtc2dUeXBlLCBkYXRhQ29weSk7CisgICAgfQorfQorCitib29sIENhbWVyYVNvdXJjZVRpbWVMYXBzZTo6c2tpcEN1cnJlbnRGcmFtZShpbnQ2NF90IHRpbWVzdGFtcFVzKSB7CisgICAgaWYgKG1Ta2lwQ3VycmVudEZyYW1lKSB7CisgICAgICAgIG1Ta2lwQ3VycmVudEZyYW1lID0gZmFsc2U7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9Cit9CisKK2Jvb2wgQ2FtZXJhU291cmNlVGltZUxhcHNlOjpza2lwRnJhbWVBbmRNb2RpZnlUaW1lU3RhbXAoaW50NjRfdCAqdGltZXN0YW1wVXMpIHsKKyAgICBpZiAoIW1Vc2VTdGlsbENhbWVyYUZvclRpbWVMYXBzZSkgeworICAgICAgICBpZiAobUxhc3RUaW1lTGFwc2VGcmFtZVJlYWxUaW1lc3RhbXBVcyA9PSAwKSB7CisgICAgICAgICAgICAvLyBGaXJzdCB0aW1lIGxhcHNlIGZyYW1lLiBJbml0aWFsaXplIG1MYXN0VGltZUxhcHNlRnJhbWVSZWFsVGltZXN0YW1wVXMKKyAgICAgICAgICAgIC8vIHRvIGN1cnJlbnQgdGltZSAodGltZXN0YW1wVXMpIGFuZCBzYXZlIGZyYW1lIGRhdGEuCisgICAgICAgICAgICBMT0dWKCJkYXRhQ2FsbGJhY2tUaW1lc3RhbXAgdGltZWxhcHNlOiBpbml0aWFsIGZyYW1lIik7CisKKyAgICAgICAgICAgIG1MYXN0VGltZUxhcHNlRnJhbWVSZWFsVGltZXN0YW1wVXMgPSAqdGltZXN0YW1wVXM7CisgICAgICAgIH0gZWxzZSBpZiAoKnRpbWVzdGFtcFVzIDwKKyAgICAgICAgICAgICAgICAobUxhc3RUaW1lTGFwc2VGcmFtZVJlYWxUaW1lc3RhbXBVcyArIG1UaW1lQmV0d2VlblRpbWVMYXBzZUZyYW1lQ2FwdHVyZVVzKSkgeworICAgICAgICAgICAgLy8gU2tpcCBhbGwgZnJhbWVzIGZyb20gbGFzdCBlbmNvZGVkIGZyYW1lIHVudGlsCisgICAgICAgICAgICAvLyBzdWZmaWNpZW50IHRpbWUgKG1UaW1lQmV0d2VlblRpbWVMYXBzZUZyYW1lQ2FwdHVyZVVzKSBoYXMgcGFzc2VkLgorICAgICAgICAgICAgLy8gVGVsbCB0aGUgY2FtZXJhIHRvIHJlbGVhc2UgaXRzIHJlY29yZGluZyBmcmFtZSBhbmQgcmV0dXJuLgorICAgICAgICAgICAgTE9HVigiZGF0YUNhbGxiYWNrVGltZXN0YW1wIHRpbWVsYXBzZTogc2tpcHBpbmcgaW50ZXJtZWRpYXRlIGZyYW1lIik7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIERlc2lyZWQgZnJhbWUgaGFzIGFycml2ZWQgYWZ0ZXIgbVRpbWVCZXR3ZWVuVGltZUxhcHNlRnJhbWVDYXB0dXJlVXMgdGltZToKKyAgICAgICAgICAgIC8vIC0gUmVzZXQgbUxhc3RUaW1lTGFwc2VGcmFtZVJlYWxUaW1lc3RhbXBVcyB0byBjdXJyZW50IHRpbWUuCisgICAgICAgICAgICAvLyAtIEFydGlmaWNpYWxseSBtb2RpZnkgdGltZXN0YW1wVXMgdG8gYmUgb25lIGZyYW1lIHRpbWUgKDEvZnJhbWVyYXRlKSBhaGVhZAorICAgICAgICAgICAgLy8gb2YgdGhlIGxhc3QgZW5jb2RlZCBmcmFtZSdzIHRpbWUgc3RhbXAuCisgICAgICAgICAgICBMT0dWKCJkYXRhQ2FsbGJhY2tUaW1lc3RhbXAgdGltZWxhcHNlOiBnb3QgdGltZWxhcHNlIGZyYW1lIik7CisKKyAgICAgICAgICAgIG1MYXN0VGltZUxhcHNlRnJhbWVSZWFsVGltZXN0YW1wVXMgPSAqdGltZXN0YW1wVXM7CisgICAgICAgICAgICAqdGltZXN0YW1wVXMgPSBtTGFzdEZyYW1lVGltZXN0YW1wVXMgKyBtVGltZUJldHdlZW5UaW1lTGFwc2VWaWRlb0ZyYW1lc1VzOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKK30KKwordm9pZCBDYW1lcmFTb3VyY2VUaW1lTGFwc2U6OmRhdGFDYWxsYmFja1RpbWVzdGFtcChpbnQ2NF90IHRpbWVzdGFtcFVzLCBpbnQzMl90IG1zZ1R5cGUsCisgICAgICAgICAgICBjb25zdCBzcDxJTWVtb3J5PiAmZGF0YSkgeworICAgIGlmICghbVVzZVN0aWxsQ2FtZXJhRm9yVGltZUxhcHNlKSB7CisgICAgICAgIG1Ta2lwQ3VycmVudEZyYW1lID0gc2tpcEZyYW1lQW5kTW9kaWZ5VGltZVN0YW1wKCZ0aW1lc3RhbXBVcyk7CisgICAgfQorICAgIENhbWVyYVNvdXJjZTo6ZGF0YUNhbGxiYWNrVGltZXN0YW1wKHRpbWVzdGFtcFVzLCBtc2dUeXBlLCBkYXRhKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01lZGlhU291cmNlU3BsaXR0ZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWVkaWFTb3VyY2VTcGxpdHRlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWJjNzAxMgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01lZGlhU291cmNlU3BsaXR0ZXIuY3BwCkBAIC0wLDAgKzEsMjM0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJNZWRpYVNvdXJjZVNwbGl0dGVyIgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFTb3VyY2VTcGxpdHRlci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRGVidWcuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworTWVkaWFTb3VyY2VTcGxpdHRlcjo6TWVkaWFTb3VyY2VTcGxpdHRlcihzcDxNZWRpYVNvdXJjZT4gbWVkaWFTb3VyY2UpIHsKKyAgICBtTnVtYmVyT2ZDbGllbnRzID0gMDsKKyAgICBtU291cmNlID0gbWVkaWFTb3VyY2U7CisgICAgbVNvdXJjZVN0YXJ0ZWQgPSBmYWxzZTsKKworICAgIG1OdW1iZXJPZkNsaWVudHNTdGFydGVkID0gMDsKKyAgICBtTnVtYmVyT2ZDdXJyZW50UmVhZHMgPSAwOworICAgIG1DdXJyZW50UmVhZEJpdCA9IDA7CisgICAgbUxhc3RSZWFkQ29tcGxldGVkID0gdHJ1ZTsKK30KKworTWVkaWFTb3VyY2VTcGxpdHRlcjo6fk1lZGlhU291cmNlU3BsaXR0ZXIoKSB7Cit9CisKK3NwPE1lZGlhU291cmNlPiBNZWRpYVNvdXJjZVNwbGl0dGVyOjpjcmVhdGVDbGllbnQoKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKworICAgIHNwPE1lZGlhU291cmNlPiBjbGllbnQgPSBuZXcgQ2xpZW50KHRoaXMsIG1OdW1iZXJPZkNsaWVudHMrKyk7CisgICAgbUNsaWVudHNTdGFydGVkLnB1c2goZmFsc2UpOworICAgIG1DbGllbnRzRGVzaXJlZFJlYWRCaXQucHVzaCgwKTsKKyAgICByZXR1cm4gY2xpZW50OworfQorCitzdGF0dXNfdCBNZWRpYVNvdXJjZVNwbGl0dGVyOjpzdGFydChpbnQgY2xpZW50SWQsIE1ldGFEYXRhICpwYXJhbXMpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworCisgICAgTE9HVigic3RhcnQgY2xpZW50ICglZCkiLCBjbGllbnRJZCk7CisgICAgaWYgKG1DbGllbnRzU3RhcnRlZFtjbGllbnRJZF0pIHsKKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0KKworICAgIG1OdW1iZXJPZkNsaWVudHNTdGFydGVkKys7CisKKyAgICBpZiAoIW1Tb3VyY2VTdGFydGVkKSB7CisgICAgICAgIExPR1YoIlN0YXJ0aW5nIHJlYWwgc291cmNlIGZyb20gY2xpZW50ICglZCkiLCBjbGllbnRJZCk7CisgICAgICAgIHN0YXR1c190IGVyciA9IG1Tb3VyY2UtPnN0YXJ0KHBhcmFtcyk7CisKKyAgICAgICAgaWYgKGVyciA9PSBPSykgeworICAgICAgICAgICAgbVNvdXJjZVN0YXJ0ZWQgPSB0cnVlOworICAgICAgICAgICAgbUNsaWVudHNTdGFydGVkLmVkaXRJdGVtQXQoY2xpZW50SWQpID0gdHJ1ZTsKKyAgICAgICAgICAgIG1DbGllbnRzRGVzaXJlZFJlYWRCaXQuZWRpdEl0ZW1BdChjbGllbnRJZCkgPSAhbUN1cnJlbnRSZWFkQml0OworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9IGVsc2UgeworICAgICAgICBtQ2xpZW50c1N0YXJ0ZWQuZWRpdEl0ZW1BdChjbGllbnRJZCkgPSB0cnVlOworICAgICAgICBpZiAobUxhc3RSZWFkQ29tcGxldGVkKSB7CisgICAgICAgICAgICAvLyBMYXN0IHJlYWQgd2FzIGNvbXBsZXRlZC4gU28gam9pbiBpbiB0aGUgdGhyZWFkcyBmb3IgdGhlIG5leHQgcmVhZC4KKyAgICAgICAgICAgIG1DbGllbnRzRGVzaXJlZFJlYWRCaXQuZWRpdEl0ZW1BdChjbGllbnRJZCkgPSAhbUN1cnJlbnRSZWFkQml0OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gTGFzdCByZWFkIGlzIG9uZ29pbmcuIFNvIGpvaW4gaW4gdGhlIHRocmVhZHMgZm9yIHRoZSBjdXJyZW50IHJlYWQuCisgICAgICAgICAgICBtQ2xpZW50c0Rlc2lyZWRSZWFkQml0LmVkaXRJdGVtQXQoY2xpZW50SWQpID0gbUN1cnJlbnRSZWFkQml0OworICAgICAgICB9CisgICAgICAgIHJldHVybiBPSzsKKyAgICB9Cit9CisKK3N0YXR1c190IE1lZGlhU291cmNlU3BsaXR0ZXI6OnN0b3AoaW50IGNsaWVudElkKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKworICAgIExPR1YoInN0b3AgY2xpZW50ICglZCkiLCBjbGllbnRJZCk7CisgICAgQ0hFQ0soY2xpZW50SWQgPj0gMCAmJiBjbGllbnRJZCA8IG1OdW1iZXJPZkNsaWVudHMpOworICAgIENIRUNLKG1DbGllbnRzU3RhcnRlZFtjbGllbnRJZF0pOworCisgICAgaWYgKC0tbU51bWJlck9mQ2xpZW50c1N0YXJ0ZWQgPT0gMCkgeworICAgICAgICBMT0dWKCJTdG9wcGluZyByZWFsIHNvdXJjZSBmcm9tIGNsaWVudCAoJWQpIiwgY2xpZW50SWQpOworICAgICAgICBzdGF0dXNfdCBlcnIgPSBtU291cmNlLT5zdG9wKCk7CisgICAgICAgIG1Tb3VyY2VTdGFydGVkID0gZmFsc2U7CisgICAgICAgIG1DbGllbnRzU3RhcnRlZC5lZGl0SXRlbUF0KGNsaWVudElkKSA9IGZhbHNlOworICAgICAgICByZXR1cm4gZXJyOworICAgIH0gZWxzZSB7CisgICAgICAgIG1DbGllbnRzU3RhcnRlZC5lZGl0SXRlbUF0KGNsaWVudElkKSA9IGZhbHNlOworICAgICAgICBpZiAoIW1MYXN0UmVhZENvbXBsZXRlZCAmJiAobUNsaWVudHNEZXNpcmVkUmVhZEJpdFtjbGllbnRJZF0gPT0gbUN1cnJlbnRSZWFkQml0KSkgeworICAgICAgICAgICAgLy8gIW1MYXN0UmVhZENvbXBsZXRlZCBpbXBsaWVzIHRoYXQgYnVmZmVyIGhhcyBiZWVuIHJlYWQgZnJvbSBzb3VyY2UsIGJ1dCBhbGwKKyAgICAgICAgICAgIC8vIGNsaWVudHMgaGF2ZW4ndCByZWFkIGl0LgorICAgICAgICAgICAgLy8gbUNsaWVudHNEZXNpcmVkUmVhZEJpdFtjbGllbnRJZF0gPT0gbUN1cnJlbnRSZWFkQml0IGltcGxpZXMgdGhhdCB0aGlzCisgICAgICAgICAgICAvLyBjbGllbnQgd291bGQgaGF2ZSB3YW50ZWQgdG8gcmVhZCBmcm9tIHRoaXMgYnVmZmVyLiAoaS5lLiBpdCBoYXMgbm90IHlldAorICAgICAgICAgICAgLy8gY2FsbGVkIHJlYWQoKSBmb3IgdGhlIGN1cnJlbnQgcmVhZCBidWZmZXIuKQorICAgICAgICAgICAgLy8gU2luY2Ugb3RoZXIgdGhyZWFkcyBtYXkgYmUgd2FpdGluZyBmb3IgYWxsIHRoZSBjbGllbnRzJyByZWFkcyB0byBjb21wbGV0ZSwKKyAgICAgICAgICAgIC8vIHNpZ25hbCB0aGF0IHRoaXMgcmVhZCBoYXMgYmVlbiBhYm9ydGVkLgorICAgICAgICAgICAgc2lnbmFsUmVhZENvbXBsZXRlX2xvY2sodHJ1ZSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0KK30KKworc3A8TWV0YURhdGE+IE1lZGlhU291cmNlU3BsaXR0ZXI6OmdldEZvcm1hdChpbnQgY2xpZW50SWQpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworCisgICAgTE9HVigiZ2V0Rm9ybWF0IGNsaWVudCAoJWQpIiwgY2xpZW50SWQpOworICAgIHJldHVybiBtU291cmNlLT5nZXRGb3JtYXQoKTsKK30KKworc3RhdHVzX3QgTWVkaWFTb3VyY2VTcGxpdHRlcjo6cmVhZChpbnQgY2xpZW50SWQsCisgICAgICAgIE1lZGlhQnVmZmVyICoqYnVmZmVyLCBjb25zdCBNZWRpYVNvdXJjZTo6UmVhZE9wdGlvbnMgKm9wdGlvbnMpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworCisgICAgQ0hFQ0soY2xpZW50SWQgPj0gMCAmJiBjbGllbnRJZCA8IG1OdW1iZXJPZkNsaWVudHMpOworCisgICAgTE9HVigicmVhZCBjbGllbnQgKCVkKSIsIGNsaWVudElkKTsKKyAgICAqYnVmZmVyID0gTlVMTDsKKworICAgIGlmICghbUNsaWVudHNTdGFydGVkW2NsaWVudElkXSkgeworICAgICAgICByZXR1cm4gT0s7CisgICAgfQorCisgICAgaWYgKG1DdXJyZW50UmVhZEJpdCAhPSBtQ2xpZW50c0Rlc2lyZWRSZWFkQml0W2NsaWVudElkXSkgeworICAgICAgICAvLyBEZXNpcmVkIGJ1ZmZlciBoYXMgbm90IGJlZW4gcmVhZCBmcm9tIHNvdXJjZSB5ZXQuCisKKyAgICAgICAgLy8gSWYgdGhlIGN1cnJlbnQgY2xpZW50IGlzIHRoZSBzcGVjaWFsIGNsaWVudCB3aXRoIGNsaWVudElkID0gMAorICAgICAgICAvLyB0aGVuIHJlYWQgZnJvbSBzb3VyY2UsIGVsc2Ugd2FpdCB1bnRpbCB0aGUgY2xpZW50IDAgaGFzIGZpbmlzaGVkCisgICAgICAgIC8vIHJlYWRpbmcgZnJvbSBzb3VyY2UuCisgICAgICAgIGlmIChjbGllbnRJZCA9PSAwKSB7CisgICAgICAgICAgICAvLyBXYWl0IGZvciBhbGwgY2xpZW50J3MgbGFzdCByZWFkIHRvIGNvbXBsZXRlIGZpcnN0IHNvIGFzIHRvIG5vdAorICAgICAgICAgICAgLy8gY29ycnVwdCB0aGUgYnVmZmVyIGF0IG1MYXN0UmVhZE1lZGlhQnVmZmVyLgorICAgICAgICAgICAgd2FpdEZvckFsbENsaWVudHNMYXN0UmVhZF9sb2NrKGNsaWVudElkKTsKKworICAgICAgICAgICAgcmVhZEZyb21Tb3VyY2VfbG9jayhvcHRpb25zKTsKKyAgICAgICAgICAgICpidWZmZXIgPSBtTGFzdFJlYWRNZWRpYUJ1ZmZlcjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHdhaXRGb3JSZWFkRnJvbVNvdXJjZV9sb2NrKGNsaWVudElkKTsKKworICAgICAgICAgICAgKmJ1ZmZlciA9IG1MYXN0UmVhZE1lZGlhQnVmZmVyOworICAgICAgICAgICAgKCpidWZmZXIpLT5hZGRfcmVmKCk7CisgICAgICAgIH0KKyAgICAgICAgQ0hFQ0sobUN1cnJlbnRSZWFkQml0ID09IG1DbGllbnRzRGVzaXJlZFJlYWRCaXRbY2xpZW50SWRdKTsKKyAgICB9IGVsc2UgeworICAgICAgICAvLyBEZXNpcmVkIGJ1ZmZlciBoYXMgYWxyZWFkeSBiZWVuIHJlYWQgZnJvbSBzb3VyY2UuIFVzZSB0aGUgY2FjaGVkIGRhdGEuCisgICAgICAgIENIRUNLKGNsaWVudElkICE9IDApOworCisgICAgICAgICpidWZmZXIgPSBtTGFzdFJlYWRNZWRpYUJ1ZmZlcjsKKyAgICAgICAgKCpidWZmZXIpLT5hZGRfcmVmKCk7CisgICAgfQorCisgICAgbUNsaWVudHNEZXNpcmVkUmVhZEJpdC5lZGl0SXRlbUF0KGNsaWVudElkKSA9ICFtQ2xpZW50c0Rlc2lyZWRSZWFkQml0W2NsaWVudElkXTsKKyAgICBzaWduYWxSZWFkQ29tcGxldGVfbG9jayhmYWxzZSk7CisKKyAgICByZXR1cm4gbUxhc3RSZWFkU3RhdHVzOworfQorCit2b2lkIE1lZGlhU291cmNlU3BsaXR0ZXI6OnJlYWRGcm9tU291cmNlX2xvY2soY29uc3QgTWVkaWFTb3VyY2U6OlJlYWRPcHRpb25zICpvcHRpb25zKSB7CisgICAgbUxhc3RSZWFkU3RhdHVzID0gbVNvdXJjZS0+cmVhZCgmbUxhc3RSZWFkTWVkaWFCdWZmZXIgLCBvcHRpb25zKTsKKworICAgIG1DdXJyZW50UmVhZEJpdCA9ICFtQ3VycmVudFJlYWRCaXQ7CisgICAgbUxhc3RSZWFkQ29tcGxldGVkID0gZmFsc2U7CisgICAgbVJlYWRGcm9tU291cmNlQ29uZGl0aW9uLmJyb2FkY2FzdCgpOworfQorCit2b2lkIE1lZGlhU291cmNlU3BsaXR0ZXI6OndhaXRGb3JSZWFkRnJvbVNvdXJjZV9sb2NrKGludDMyX3QgY2xpZW50SWQpIHsKKyAgICBtUmVhZEZyb21Tb3VyY2VDb25kaXRpb24ud2FpdChtTG9jayk7Cit9CisKK3ZvaWQgTWVkaWFTb3VyY2VTcGxpdHRlcjo6d2FpdEZvckFsbENsaWVudHNMYXN0UmVhZF9sb2NrKGludDMyX3QgY2xpZW50SWQpIHsKKyAgICBpZiAobUxhc3RSZWFkQ29tcGxldGVkKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgbUFsbFJlYWRzQ29tcGxldGVDb25kaXRpb24ud2FpdChtTG9jayk7CisgICAgQ0hFQ0sobUxhc3RSZWFkQ29tcGxldGVkKTsKK30KKwordm9pZCBNZWRpYVNvdXJjZVNwbGl0dGVyOjpzaWduYWxSZWFkQ29tcGxldGVfbG9jayhib29sIHJlYWRBYm9ydGVkKSB7CisgICAgaWYgKCFyZWFkQWJvcnRlZCkgeworICAgICAgICBtTnVtYmVyT2ZDdXJyZW50UmVhZHMrKzsKKyAgICB9CisKKyAgICBpZiAobU51bWJlck9mQ3VycmVudFJlYWRzID09IG1OdW1iZXJPZkNsaWVudHNTdGFydGVkKSB7CisgICAgICAgIG1MYXN0UmVhZENvbXBsZXRlZCA9IHRydWU7CisgICAgICAgIG1OdW1iZXJPZkN1cnJlbnRSZWFkcyA9IDA7CisgICAgICAgIG1BbGxSZWFkc0NvbXBsZXRlQ29uZGl0aW9uLmJyb2FkY2FzdCgpOworICAgIH0KK30KKworc3RhdHVzX3QgTWVkaWFTb3VyY2VTcGxpdHRlcjo6cGF1c2UoaW50IGNsaWVudElkKSB7CisgICAgcmV0dXJuIEVSUk9SX1VOU1VQUE9SVEVEOworfQorCisvLyBDbGllbnQKKworTWVkaWFTb3VyY2VTcGxpdHRlcjo6Q2xpZW50OjpDbGllbnQoCisgICAgICAgIHNwPE1lZGlhU291cmNlU3BsaXR0ZXI+IHNwbGl0dGVyLAorICAgICAgICBpbnQzMl90IGNsaWVudElkKSB7CisgICAgbVNwbGl0dGVyID0gc3BsaXR0ZXI7CisgICAgbUNsaWVudElkID0gY2xpZW50SWQ7Cit9CisKK3N0YXR1c190IE1lZGlhU291cmNlU3BsaXR0ZXI6OkNsaWVudDo6c3RhcnQoTWV0YURhdGEgKnBhcmFtcykgeworICAgIHJldHVybiBtU3BsaXR0ZXItPnN0YXJ0KG1DbGllbnRJZCwgcGFyYW1zKTsKK30KKworc3RhdHVzX3QgTWVkaWFTb3VyY2VTcGxpdHRlcjo6Q2xpZW50OjpzdG9wKCkgeworICAgIHJldHVybiBtU3BsaXR0ZXItPnN0b3AobUNsaWVudElkKTsKK30KKworc3A8TWV0YURhdGE+IE1lZGlhU291cmNlU3BsaXR0ZXI6OkNsaWVudDo6Z2V0Rm9ybWF0KCkgeworICAgIHJldHVybiBtU3BsaXR0ZXItPmdldEZvcm1hdChtQ2xpZW50SWQpOworfQorCitzdGF0dXNfdCBNZWRpYVNvdXJjZVNwbGl0dGVyOjpDbGllbnQ6OnJlYWQoCisgICAgICAgIE1lZGlhQnVmZmVyICoqYnVmZmVyLCBjb25zdCBSZWFkT3B0aW9ucyAqb3B0aW9ucykgeworICAgIHJldHVybiBtU3BsaXR0ZXItPnJlYWQobUNsaWVudElkLCBidWZmZXIsIG9wdGlvbnMpOworfQorCitzdGF0dXNfdCBNZWRpYVNvdXJjZVNwbGl0dGVyOjpDbGllbnQ6OnBhdXNlKCkgeworICAgIHJldHVybiBtU3BsaXR0ZXItPnBhdXNlKG1DbGllbnRJZCk7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9OdUhUVFBEYXRhU291cmNlLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L051SFRUUERhdGFTb3VyY2UuY3BwCmluZGV4IGFiOTI4NWQuLjMzMmJhYjMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L051SFRUUERhdGFTb3VyY2UuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L051SFRUUERhdGFTb3VyY2UuY3BwCkBAIC00Miw3ICs0Miw3IEBACiAgICAgICAgIHBhdGgtPnNldFRvKHNsYXNoUG9zKTsKICAgICB9CiAKLSAgICBjaGFyICpjb2xvblBvcyA9IHN0cmNocihob3N0LT5zdHJpbmcoKSwgJzonKTsKKyAgICBjb25zdCBjaGFyICpjb2xvblBvcyA9IHN0cmNocihob3N0LT5zdHJpbmcoKSwgJzonKTsKIAogICAgIGlmIChjb2xvblBvcyAhPSBOVUxMKSB7CiAgICAgICAgIHVuc2lnbmVkIGxvbmcgeDsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L09NWENvZGVjLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L09NWENvZGVjLmNwcAppbmRleCAxNjVjZWM5Li5mNjhjMDhhIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9PTVhDb2RlYy5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvT01YQ29kZWMuY3BwCkBAIC0xNDYsMjkgKzE0NiwzNiBAQAogCiBzdGF0aWMgY29uc3QgQ29kZWNJbmZvIGtEZWNvZGVySW5mb1tdID0gewogICAgIHsgTUVESUFfTUlNRVRZUEVfSU1BR0VfSlBFRywgIk9NWC5USS5KUEVHLmRlY29kZSIgfSwKKy8vICAgIHsgTUVESUFfTUlNRVRZUEVfQVVESU9fTVBFRywgIk9NWC5OdmlkaWEubXAzLmRlY29kZXIiIH0sCiAvLyAgICB7IE1FRElBX01JTUVUWVBFX0FVRElPX01QRUcsICJPTVguVEkuTVAzLmRlY29kZSIgfSwKICAgICB7IE1FRElBX01JTUVUWVBFX0FVRElPX01QRUcsICJNUDNEZWNvZGVyIiB9LAogLy8gICAgeyBNRURJQV9NSU1FVFlQRV9BVURJT19NUEVHLCAiT01YLlBWLm1wM2RlYyIgfSwKIC8vICAgIHsgTUVESUFfTUlNRVRZUEVfQVVESU9fQU1SX05CLCAiT01YLlRJLkFNUi5kZWNvZGUiIH0sCisvLyAgICB7IE1FRElBX01JTUVUWVBFX0FVRElPX0FNUl9OQiwgIk9NWC5OdmlkaWEuYW1yLmRlY29kZXIiIH0sCiAgICAgeyBNRURJQV9NSU1FVFlQRV9BVURJT19BTVJfTkIsICJBTVJOQkRlY29kZXIiIH0sCiAvLyAgICB7IE1FRElBX01JTUVUWVBFX0FVRElPX0FNUl9OQiwgIk9NWC5QVi5hbXJkZWMiIH0sCisvLyAgICB7IE1FRElBX01JTUVUWVBFX0FVRElPX0FNUl9OQiwgIk9NWC5OdmlkaWEuYW1yd2IuZGVjb2RlciIgfSwKICAgICB7IE1FRElBX01JTUVUWVBFX0FVRElPX0FNUl9XQiwgIk9NWC5USS5XQkFNUi5kZWNvZGUiIH0sCiAgICAgeyBNRURJQV9NSU1FVFlQRV9BVURJT19BTVJfV0IsICJBTVJXQkRlY29kZXIiIH0sCiAvLyAgICB7IE1FRElBX01JTUVUWVBFX0FVRElPX0FNUl9XQiwgIk9NWC5QVi5hbXJkZWMiIH0sCisvLyAgICB7IE1FRElBX01JTUVUWVBFX0FVRElPX0FBQywgIk9NWC5OdmlkaWEuYWFjLmRlY29kZXIiIH0sCiAgICAgeyBNRURJQV9NSU1FVFlQRV9BVURJT19BQUMsICJPTVguVEkuQUFDLmRlY29kZSIgfSwKICAgICB7IE1FRElBX01JTUVUWVBFX0FVRElPX0FBQywgIkFBQ0RlY29kZXIiIH0sCiAvLyAgICB7IE1FRElBX01JTUVUWVBFX0FVRElPX0FBQywgIk9NWC5QVi5hYWNkZWMiIH0sCiAgICAgeyBNRURJQV9NSU1FVFlQRV9BVURJT19HNzExX0FMQVcsICJHNzExRGVjb2RlciIgfSwKICAgICB7IE1FRElBX01JTUVUWVBFX0FVRElPX0c3MTFfTUxBVywgIkc3MTFEZWNvZGVyIiB9LAorLy8gICAgeyBNRURJQV9NSU1FVFlQRV9WSURFT19NUEVHNCwgIk9NWC5OdmlkaWEubXA0LmRlY29kZSIgfSwKICAgICB7IE1FRElBX01JTUVUWVBFX1ZJREVPX01QRUc0LCAiT01YLnFjb20uN3gzMC52aWRlby5kZWNvZGVyLm1wZWc0IiB9LAogICAgIHsgTUVESUFfTUlNRVRZUEVfVklERU9fTVBFRzQsICJPTVgucWNvbS52aWRlby5kZWNvZGVyLm1wZWc0IiB9LAogICAgIHsgTUVESUFfTUlNRVRZUEVfVklERU9fTVBFRzQsICJPTVguVEkuVmlkZW8uRGVjb2RlciIgfSwKICAgICB7IE1FRElBX01JTUVUWVBFX1ZJREVPX01QRUc0LCAiTTR2SDI2M0RlY29kZXIiIH0sCiAvLyAgICB7IE1FRElBX01JTUVUWVBFX1ZJREVPX01QRUc0LCAiT01YLlBWLm1wZWc0ZGVjIiB9LAorLy8gICAgeyBNRURJQV9NSU1FVFlQRV9WSURFT19IMjYzLCAiT01YLk52aWRpYS5oMjYzLmRlY29kZSIgfSwKICAgICB7IE1FRElBX01JTUVUWVBFX1ZJREVPX0gyNjMsICJPTVgucWNvbS43eDMwLnZpZGVvLmRlY29kZXIuaDI2MyIgfSwKICAgICB7IE1FRElBX01JTUVUWVBFX1ZJREVPX0gyNjMsICJPTVgucWNvbS52aWRlby5kZWNvZGVyLmgyNjMiIH0sCiAgICAgeyBNRURJQV9NSU1FVFlQRV9WSURFT19IMjYzLCAiTTR2SDI2M0RlY29kZXIiIH0sCiAvLyAgICB7IE1FRElBX01JTUVUWVBFX1ZJREVPX0gyNjMsICJPTVguUFYuaDI2M2RlYyIgfSwKKyAgICB7IE1FRElBX01JTUVUWVBFX1ZJREVPX0FWQywgIk9NWC5OdmlkaWEuaDI2NC5kZWNvZGUiIH0sCiAgICAgeyBNRURJQV9NSU1FVFlQRV9WSURFT19BVkMsICJPTVgucWNvbS43eDMwLnZpZGVvLmRlY29kZXIuYXZjIiB9LAogICAgIHsgTUVESUFfTUlNRVRZUEVfVklERU9fQVZDLCAiT01YLnFjb20udmlkZW8uZGVjb2Rlci5hdmMiIH0sCiAgICAgeyBNRURJQV9NSU1FVFlQRV9WSURFT19BVkMsICJPTVguVEkuVmlkZW8uRGVjb2RlciIgfSwKQEAgLTE5OSw2ICsyMDYsNyBAQAogICAgIHsgTUVESUFfTUlNRVRZUEVfVklERU9fQVZDLCAiT01YLnFjb20uN3gzMC52aWRlby5lbmNvZGVyLmF2YyIgfSwKICAgICB7IE1FRElBX01JTUVUWVBFX1ZJREVPX0FWQywgIk9NWC5xY29tLnZpZGVvLmVuY29kZXIuYXZjIiB9LAogICAgIHsgTUVESUFfTUlNRVRZUEVfVklERU9fQVZDLCAiT01YLlRJLlZpZGVvLmVuY29kZXIiIH0sCisgICAgeyBNRURJQV9NSU1FVFlQRV9WSURFT19BVkMsICJPTVguTnZpZGlhLmgyNjQuZW5jb2RlciIgfSwKICAgICB7IE1FRElBX01JTUVUWVBFX1ZJREVPX0FWQywgIkFWQ0VuY29kZXIiIH0sCiAvLyAgICB7IE1FRElBX01JTUVUWVBFX1ZJREVPX0FWQywgIk9NWC5QVi5hdmNlbmMiIH0sCiB9OwpAQCAtMzM3LDYgKzM0NSwxMyBAQAogdWludDMyX3QgT01YQ29kZWM6OmdldENvbXBvbmVudFF1aXJrcyhjb25zdCBjaGFyICpjb21wb25lbnROYW1lKSB7CiAgICAgdWludDMyX3QgcXVpcmtzID0gMDsKIAorICAgIGlmICghc3RyY21wKGNvbXBvbmVudE5hbWUsICJPTVguTnZpZGlhLmFtci5kZWNvZGVyIikgfHwKKyAgICAgICAgICFzdHJjbXAoY29tcG9uZW50TmFtZSwgIk9NWC5OdmlkaWEuYW1yd2IuZGVjb2RlciIpIHx8CisgICAgICAgICAhc3RyY21wKGNvbXBvbmVudE5hbWUsICJPTVguTnZpZGlhLmFhYy5kZWNvZGVyIikgfHwKKyAgICAgICAgICFzdHJjbXAoY29tcG9uZW50TmFtZSwgIk9NWC5OdmlkaWEubXAzLmRlY29kZXIiKSkgeworICAgICAgICBxdWlya3MgfD0ga0RlY29kZXJMaWVzQWJvdXROdW1iZXJPZkNoYW5uZWxzOworICAgIH0KKwogICAgIGlmICghc3RyY21wKGNvbXBvbmVudE5hbWUsICJPTVguUFYuYXZjZGVjIikpIHsKICAgICAgICAgcXVpcmtzIHw9IGtXYW50c05BTEZyYWdtZW50czsKICAgICB9CkBAIC04NjMsNiArODc4LDEwIEBACiAgICAgT01YX0NPTE9SX0ZPUk1BVFRZUEUgY29sb3JGb3JtYXQ7CiAgICAgQ0hFQ0tfRVEoT0ssIGZpbmRUYXJnZXRDb2xvckZvcm1hdChtZXRhLCAmY29sb3JGb3JtYXQpKTsKIAorICAgIGlmICghc3RyY2FzZWNtcCgiT01YLk52aWRpYS5oMjY0LmVuY29kZXIiLCBtQ29tcG9uZW50TmFtZSkpIHsKKyAgICAgICAgY29sb3JGb3JtYXQgPSBPTVhfQ09MT1JfRm9ybWF0WVVWNDIwUGxhbmFyOworICAgIH0KKwogICAgIHN0YXR1c190IGVycjsKICAgICBPTVhfUEFSQU1fUE9SVERFRklOSVRJT05UWVBFIGRlZjsKICAgICBPTVhfVklERU9fUE9SVERFRklOSVRJT05UWVBFICp2aWRlb19kZWYgPSAmZGVmLmZvcm1hdC52aWRlbzsKQEAgLTEyMDYsNiArMTIyNSwxMCBAQAogICAgIGgyNjR0eXBlLmJNQkFGRiA9IE9NWF9GQUxTRTsKICAgICBoMjY0dHlwZS5lTG9vcEZpbHRlck1vZGUgPSBPTVhfVklERU9fQVZDTG9vcEZpbHRlckVuYWJsZTsKIAorICAgIGlmICghc3RyY2FzZWNtcCgiT01YLk52aWRpYS5oMjY0LmVuY29kZXIiLCBtQ29tcG9uZW50TmFtZSkpIHsKKyAgICAgICAgaDI2NHR5cGUuZUxldmVsID0gT01YX1ZJREVPX0FWQ0xldmVsTWF4OworICAgIH0KKwogICAgIGVyciA9IG1PTVgtPnNldFBhcmFtZXRlcigKICAgICAgICAgICAgIG1Ob2RlLCBPTVhfSW5kZXhQYXJhbVZpZGVvQXZjLCAmaDI2NHR5cGUsIHNpemVvZihoMjY0dHlwZSkpOwogICAgIENIRUNLX0VRKGVyciwgT0spOwpAQCAtMTc4OCw3ICsxODExLDkgQEAKIAogICAgICAgICBjYXNlIE9NWF9FdmVudFBvcnRTZXR0aW5nc0NoYW5nZWQ6CiAgICAgICAgIHsKLSAgICAgICAgICAgIG9uUG9ydFNldHRpbmdzQ2hhbmdlZChkYXRhMSk7CisgICAgICAgICAgICBpZiAoZGF0YTIgPT0gMCB8fCBkYXRhMiA9PSBPTVhfSW5kZXhQYXJhbVBvcnREZWZpbml0aW9uKSB7CisgICAgICAgICAgICAgICAgb25Qb3J0U2V0dGluZ3NDaGFuZ2VkKGRhdGExKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAKQEAgLTIxNzgsNiArMjIwMyw3IEBACiAgICAgQ0hFQ0tfRVEobVBvcnRTdGF0dXNbcG9ydEluZGV4XSwgRU5BQkxFRCk7CiAgICAgbVBvcnRTdGF0dXNbcG9ydEluZGV4XSA9IERJU0FCTElORzsKIAorICAgIENPREVDX0xPR1YoInNlbmRpbmcgT01YX0NvbW1hbmRQb3J0RGlzYWJsZSglbGQpIiwgcG9ydEluZGV4KTsKICAgICBzdGF0dXNfdCBlcnIgPQogICAgICAgICBtT01YLT5zZW5kQ29tbWFuZChtTm9kZSwgT01YX0NvbW1hbmRQb3J0RGlzYWJsZSwgcG9ydEluZGV4KTsKICAgICBDSEVDS19FUShlcnIsIE9LKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1ZpZGVvU291cmNlRG93blNhbXBsZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvVmlkZW9Tb3VyY2VEb3duU2FtcGxlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWE3YjA5YQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1ZpZGVvU291cmNlRG93blNhbXBsZXIuY3BwCkBAIC0wLDAgKzEsMTQyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJWaWRlb1NvdXJjZURvd25TYW1wbGVyIgorCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvVmlkZW9Tb3VyY2VEb3duU2FtcGxlci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQnVmZmVyLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFEZWJ1Zy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvWVVWSW1hZ2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9ZVVZDYW52YXMuaD4KKyNpbmNsdWRlICJPTVhfVmlkZW8uaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitWaWRlb1NvdXJjZURvd25TYW1wbGVyOjpWaWRlb1NvdXJjZURvd25TYW1wbGVyKGNvbnN0IHNwPE1lZGlhU291cmNlPiAmdmlkZW9Tb3VyY2UsCisgICAgICAgIGludDMyX3Qgd2lkdGgsIGludDMyX3QgaGVpZ2h0KSB7CisgICAgTE9HVigiQ29uc3RydWN0IFZpZGVvU291cmNlRG93blNhbXBsZXIiKTsKKyAgICBDSEVDSyh3aWR0aCA+IDApOworICAgIENIRUNLKGhlaWdodCA+IDApOworCisgICAgbVJlYWxWaWRlb1NvdXJjZSA9IHZpZGVvU291cmNlOworICAgIG1XaWR0aCA9IHdpZHRoOworICAgIG1IZWlnaHQgPSBoZWlnaHQ7CisKKyAgICBtTWV0YSA9IG5ldyBNZXRhRGF0YSgqKG1SZWFsVmlkZW9Tb3VyY2UtPmdldEZvcm1hdCgpKSk7CisgICAgQ0hFQ0sobU1ldGEtPmZpbmRJbnQzMihrS2V5V2lkdGgsICZtUmVhbFNvdXJjZVdpZHRoKSk7CisgICAgQ0hFQ0sobU1ldGEtPmZpbmRJbnQzMihrS2V5SGVpZ2h0LCAmbVJlYWxTb3VyY2VIZWlnaHQpKTsKKworICAgIGlmICgobVdpZHRoICE9IG1SZWFsU291cmNlV2lkdGgpIHx8IChtSGVpZ2h0ICE9IG1SZWFsU291cmNlSGVpZ2h0KSkgeworICAgICAgICAvLyBDaGFuZ2UgbWV0YSBkYXRhIGZvciB3aWR0aCBhbmQgaGVpZ2h0LgorICAgICAgICBDSEVDSyhtV2lkdGggPD0gbVJlYWxTb3VyY2VXaWR0aCk7CisgICAgICAgIENIRUNLKG1IZWlnaHQgPD0gbVJlYWxTb3VyY2VIZWlnaHQpOworCisgICAgICAgIG1OZWVkRG93blNhbXBsaW5nID0gdHJ1ZTsKKyAgICAgICAgY29tcHV0ZURvd25TYW1wbGluZ1BhcmFtZXRlcnMoKTsKKyAgICAgICAgbU1ldGEtPnNldEludDMyKGtLZXlXaWR0aCwgbVdpZHRoKTsKKyAgICAgICAgbU1ldGEtPnNldEludDMyKGtLZXlIZWlnaHQsIG1IZWlnaHQpOworICAgIH0gZWxzZSB7CisgICAgICAgIG1OZWVkRG93blNhbXBsaW5nID0gZmFsc2U7CisgICAgfQorfQorCitWaWRlb1NvdXJjZURvd25TYW1wbGVyOjp+VmlkZW9Tb3VyY2VEb3duU2FtcGxlcigpIHsKK30KKwordm9pZCBWaWRlb1NvdXJjZURvd25TYW1wbGVyOjpjb21wdXRlRG93blNhbXBsaW5nUGFyYW1ldGVycygpIHsKKyAgICBtRG93blNhbXBsZVNraXBYID0gbVJlYWxTb3VyY2VXaWR0aCAvIG1XaWR0aDsKKyAgICBtRG93blNhbXBsZVNraXBZID0gbVJlYWxTb3VyY2VIZWlnaHQgLyBtSGVpZ2h0OworCisgICAgbURvd25TYW1wbGVPZmZzZXRYID0gbVJlYWxTb3VyY2VXaWR0aCAtIG1Eb3duU2FtcGxlU2tpcFggKiBtV2lkdGg7CisgICAgbURvd25TYW1wbGVPZmZzZXRZID0gbVJlYWxTb3VyY2VIZWlnaHQgLSBtRG93blNhbXBsZVNraXBZICogbUhlaWdodDsKK30KKwordm9pZCBWaWRlb1NvdXJjZURvd25TYW1wbGVyOjpkb3duU2FtcGxlWVVWSW1hZ2UoCisgICAgICAgIGNvbnN0IE1lZGlhQnVmZmVyICZzb3VyY2VCdWZmZXIsIE1lZGlhQnVmZmVyICoqYnVmZmVyKSBjb25zdCB7CisgICAgLy8gZmluZCB0aGUgWVVWIGZvcm1hdAorICAgIGludDMyX3Qgc3JjRm9ybWF0OworICAgIENIRUNLKG1NZXRhLT5maW5kSW50MzIoa0tleUNvbG9yRm9ybWF0LCAmc3JjRm9ybWF0KSk7CisgICAgWVVWSW1hZ2U6OllVVkZvcm1hdCB5dXZGb3JtYXQ7CisgICAgaWYgKHNyY0Zvcm1hdCA9PSBPTVhfQ09MT1JfRm9ybWF0WVVWNDIwU2VtaVBsYW5hcikgeworICAgICAgICB5dXZGb3JtYXQgPSBZVVZJbWFnZTo6WVVWNDIwU2VtaVBsYW5hcjsKKyAgICB9IGVsc2UgaWYgKHNyY0Zvcm1hdCA9PSBPTVhfQ09MT1JfRm9ybWF0WVVWNDIwUGxhbmFyKSB7CisgICAgICAgIHl1dkZvcm1hdCA9IFlVVkltYWdlOjpZVVY0MjBQbGFuYXI7CisgICAgfQorCisgICAgLy8gYWxsb2NhdGUgbWVkaWFCdWZmZXIgZm9yIGRvd24gc2FtcGxlZCBpbWFnZSBhbmQgc2V0dXAgYSBjYW52YXMuCisgICAgKmJ1ZmZlciA9IG5ldyBNZWRpYUJ1ZmZlcihZVVZJbWFnZTo6YnVmZmVyU2l6ZSh5dXZGb3JtYXQsIG1XaWR0aCwgbUhlaWdodCkpOworICAgIFlVVkltYWdlIHl1dkRvd25TYW1wbGVkSW1hZ2UoeXV2Rm9ybWF0LAorICAgICAgICAgICAgbVdpZHRoLCBtSGVpZ2h0LAorICAgICAgICAgICAgKHVpbnQ4X3QgKikoKmJ1ZmZlciktPmRhdGEoKSk7CisgICAgWVVWQ2FudmFzIHl1dkNhbnZhc0Rvd25TYW1wbGUoeXV2RG93blNhbXBsZWRJbWFnZSk7CisKKyAgICBZVVZJbWFnZSB5dXZJbWFnZVNvdXJjZSh5dXZGb3JtYXQsCisgICAgICAgICAgICBtUmVhbFNvdXJjZVdpZHRoLCBtUmVhbFNvdXJjZUhlaWdodCwKKyAgICAgICAgICAgICh1aW50OF90ICopc291cmNlQnVmZmVyLmRhdGEoKSk7CisgICAgeXV2Q2FudmFzRG93blNhbXBsZS5kb3duc2FtcGxlKG1Eb3duU2FtcGxlT2Zmc2V0WCwgbURvd25TYW1wbGVPZmZzZXRZLAorICAgICAgICAgICAgbURvd25TYW1wbGVTa2lwWCwgbURvd25TYW1wbGVTa2lwWSwKKyAgICAgICAgICAgIHl1dkltYWdlU291cmNlKTsKK30KKworc3RhdHVzX3QgVmlkZW9Tb3VyY2VEb3duU2FtcGxlcjo6c3RhcnQoTWV0YURhdGEgKnBhcmFtcykgeworICAgIExPR1YoInN0YXJ0Iik7CisgICAgcmV0dXJuIG1SZWFsVmlkZW9Tb3VyY2UtPnN0YXJ0KCk7Cit9CisKK3N0YXR1c190IFZpZGVvU291cmNlRG93blNhbXBsZXI6OnN0b3AoKSB7CisgICAgTE9HVigic3RvcCIpOworICAgIHJldHVybiBtUmVhbFZpZGVvU291cmNlLT5zdG9wKCk7Cit9CisKK3NwPE1ldGFEYXRhPiBWaWRlb1NvdXJjZURvd25TYW1wbGVyOjpnZXRGb3JtYXQoKSB7CisgICAgTE9HVigiZ2V0Rm9ybWF0Iik7CisgICAgcmV0dXJuIG1NZXRhOworfQorCitzdGF0dXNfdCBWaWRlb1NvdXJjZURvd25TYW1wbGVyOjpyZWFkKAorICAgICAgICBNZWRpYUJ1ZmZlciAqKmJ1ZmZlciwgY29uc3QgUmVhZE9wdGlvbnMgKm9wdGlvbnMpIHsKKyAgICBMT0dWKCJyZWFkIik7CisgICAgTWVkaWFCdWZmZXIgKnJlYWxCdWZmZXI7CisgICAgc3RhdHVzX3QgZXJyID0gbVJlYWxWaWRlb1NvdXJjZS0+cmVhZCgmcmVhbEJ1ZmZlciwgb3B0aW9ucyk7CisKKyAgICBpZiAobU5lZWREb3duU2FtcGxpbmcpIHsKKyAgICAgICAgZG93blNhbXBsZVlVVkltYWdlKCpyZWFsQnVmZmVyLCBidWZmZXIpOworCisgICAgICAgIGludDY0X3QgZnJhbWVUaW1lOworICAgICAgICByZWFsQnVmZmVyLT5tZXRhX2RhdGEoKS0+ZmluZEludDY0KGtLZXlUaW1lLCAmZnJhbWVUaW1lKTsKKyAgICAgICAgKCpidWZmZXIpLT5tZXRhX2RhdGEoKS0+c2V0SW50NjQoa0tleVRpbWUsIGZyYW1lVGltZSk7CisKKyAgICAgICAgLy8gV2UganVzdCB3YW50IHRoaXMgYnVmZmVyIHRvIGJlIGRlbGV0ZWQgd2hlbiB0aGUgZW5jb2RlciByZWxlYXNlcyBpdC4KKyAgICAgICAgLy8gU28gZG9uJ3QgYWRkIGEgcmVmZXJlbmNlIHRvIGl0IGFuZCBzZXQgdGhlIG9ic2VydmVyIHRvIE5VTEwuCisgICAgICAgICgqYnVmZmVyKS0+c2V0T2JzZXJ2ZXIoTlVMTCk7CisKKyAgICAgICAgLy8gVGhlIG9yaWdpbmFsIGJ1ZmZlciBpcyBubyBsb25nZXIgcmVxdWlyZWQuIFJlbGVhc2UgaXQuCisgICAgICAgIHJlYWxCdWZmZXItPnJlbGVhc2UoKTsKKyAgICB9IGVsc2UgeworICAgICAgICAqYnVmZmVyID0gcmVhbEJ1ZmZlcjsKKyAgICB9CisKKyAgICByZXR1cm4gZXJyOworfQorCitzdGF0dXNfdCBWaWRlb1NvdXJjZURvd25TYW1wbGVyOjpwYXVzZSgpIHsKKyAgICBMT0dWKCJwYXVzZSIpOworICAgIHJldHVybiBtUmVhbFZpZGVvU291cmNlLT5wYXVzZSgpOworfQorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29sb3Jjb252ZXJzaW9uL0FuZHJvaWQubWsgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2xvcmNvbnZlcnNpb24vQW5kcm9pZC5tawppbmRleCBiOWJhMWJlLi4yYjYzMjM1IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2xvcmNvbnZlcnNpb24vQW5kcm9pZC5taworKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2xvcmNvbnZlcnNpb24vQW5kcm9pZC5tawpAQCAtNiw3ICs2LDggQEAKICAgICAgICAgU29mdHdhcmVSZW5kZXJlci5jcHAKIAogTE9DQUxfQ19JTkNMVURFUyA6PSBcCi0gICAgICAgICQoVE9QKS9leHRlcm5hbC9vcGVuY29yZS9leHRlcm5fbGlic192Mi9raHJvbm9zL29wZW5tYXgvaW5jbHVkZQorICAgICAgICAkKFRPUCkvZXh0ZXJuYWwvb3BlbmNvcmUvZXh0ZXJuX2xpYnNfdjIva2hyb25vcy9vcGVubWF4L2luY2x1ZGUgXAorICAgICAgICAkKFRPUCkvaGFyZHdhcmUvbXNtN2sKIAogTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSAgICAgICBcCiAgICAgICAgIGxpYmJpbmRlciAgICAgICAgICAgICAgIFwKQEAgLTE3LDYgKzE4LDExIEBACiAgICAgICAgIGxpYnN1cmZhY2VmbGluZ2VyX2NsaWVudFwKICAgICAgICAgbGliY2FtZXJhX2NsaWVudAogCisjIGlmZXEgKCQoVEFSR0VUX0JPQVJEX1BMQVRGT1JNKSxtc203aykKK2lmZXEgKCQoVEFSR0VUX1BST0RVQ1QpLHBhc3Npb24pCisJTE9DQUxfQ0ZMQUdTICs9IC1ESEFTX1lDQkNSNDIwX1NQX0FEUkVOTworZW5kaWYKKwogTE9DQUxfTU9EVUxFOj0gbGlic3RhZ2VmcmlnaHRfY29sb3JfY29udmVyc2lvbgogCiBpbmNsdWRlICQoQlVJTERfU0hBUkVEX0xJQlJBUlkpCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2xvcmNvbnZlcnNpb24vU29mdHdhcmVSZW5kZXJlci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2xvcmNvbnZlcnNpb24vU29mdHdhcmVSZW5kZXJlci5jcHAKaW5kZXggYTZkYmY2OS4uYzIwNGE5NCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29sb3Jjb252ZXJzaW9uL1NvZnR3YXJlUmVuZGVyZXIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvbG9yY29udmVyc2lvbi9Tb2Z0d2FyZVJlbmRlcmVyLmNwcApAQCAtMjIsNjUgKzIyLDE3OSBAQAogI2luY2x1ZGUgPGJpbmRlci9NZW1vcnlIZWFwQmFzZS5oPgogI2luY2x1ZGUgPGJpbmRlci9NZW1vcnlIZWFwUG1lbS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRGVidWcuaD4KLSNpbmNsdWRlIDxzdXJmYWNlZmxpbmdlci9JU3VyZmFjZS5oPgorI2luY2x1ZGUgPHN1cmZhY2VmbGluZ2VyL1N1cmZhY2UuaD4KKyNpbmNsdWRlIDx1aS9hbmRyb2lkX25hdGl2ZV9idWZmZXIuaD4KKyNpbmNsdWRlIDx1aS9HcmFwaGljQnVmZmVyTWFwcGVyLmg+CisKKy8vIFhYWDogVGVtcG9yYXJ5IGhhY2sgdG8gYWxsb3cgcmVmZXJlbmNpbmcgdGhlIF9BRFJFTk8gcGl4ZWwgZm9ybWF0IGhlcmUuCisjaW5jbHVkZSA8bGliZ3JhbGxvYy1xc2Q4ay9ncmFsbG9jX3ByaXYuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCiBTb2Z0d2FyZVJlbmRlcmVyOjpTb2Z0d2FyZVJlbmRlcmVyKAogICAgICAgICBPTVhfQ09MT1JfRk9STUFUVFlQRSBjb2xvckZvcm1hdCwKLSAgICAgICAgY29uc3Qgc3A8SVN1cmZhY2U+ICZzdXJmYWNlLAorICAgICAgICBjb25zdCBzcDxTdXJmYWNlPiAmc3VyZmFjZSwKICAgICAgICAgc2l6ZV90IGRpc3BsYXlXaWR0aCwgc2l6ZV90IGRpc3BsYXlIZWlnaHQsCiAgICAgICAgIHNpemVfdCBkZWNvZGVkV2lkdGgsIHNpemVfdCBkZWNvZGVkSGVpZ2h0KQogICAgIDogbUNvbG9yRm9ybWF0KGNvbG9yRm9ybWF0KSwKLSAgICAgIG1Db252ZXJ0ZXIoY29sb3JGb3JtYXQsIE9NWF9DT0xPUl9Gb3JtYXQxNmJpdFJHQjU2NSksCi0gICAgICBtSVN1cmZhY2Uoc3VyZmFjZSksCisgICAgICBtQ29udmVydGVyKE5VTEwpLAorICAgICAgbVlVVk1vZGUoTm9uZSksCisgICAgICBtU3VyZmFjZShzdXJmYWNlKSwKICAgICAgIG1EaXNwbGF5V2lkdGgoZGlzcGxheVdpZHRoKSwKICAgICAgIG1EaXNwbGF5SGVpZ2h0KGRpc3BsYXlIZWlnaHQpLAogICAgICAgbURlY29kZWRXaWR0aChkZWNvZGVkV2lkdGgpLAotICAgICAgbURlY29kZWRIZWlnaHQoZGVjb2RlZEhlaWdodCksCi0gICAgICBtRnJhbWVTaXplKG1EZWNvZGVkV2lkdGggKiBtRGVjb2RlZEhlaWdodCAqIDIpLCAgLy8gUkdCNTY1Ci0gICAgICBtSW5kZXgoMCkgewotICAgIG1NZW1vcnlIZWFwID0gbmV3IE1lbW9yeUhlYXBCYXNlKCIvZGV2L3BtZW1fYWRzcCIsIDIgKiBtRnJhbWVTaXplKTsKLSAgICBpZiAobU1lbW9yeUhlYXAtPmhlYXBJRCgpIDwgMCkgewotICAgICAgICBMT0dJKCJDcmVhdGluZyBwaHlzaWNhbCBtZW1vcnkgaGVhcCBmYWlsZWQsIHJldmVydGluZyB0byByZWd1bGFyIGhlYXAuIik7Ci0gICAgICAgIG1NZW1vcnlIZWFwID0gbmV3IE1lbW9yeUhlYXBCYXNlKDIgKiBtRnJhbWVTaXplKTsKLSAgICB9IGVsc2UgewotICAgICAgICBzcDxNZW1vcnlIZWFwUG1lbT4gcG1lbUhlYXAgPSBuZXcgTWVtb3J5SGVhcFBtZW0obU1lbW9yeUhlYXApOwotICAgICAgICBwbWVtSGVhcC0+c2xhcCgpOwotICAgICAgICBtTWVtb3J5SGVhcCA9IHBtZW1IZWFwOworICAgICAgbURlY29kZWRIZWlnaHQoZGVjb2RlZEhlaWdodCkgeworICAgIExPR0koImlucHV0IGZvcm1hdCA9ICVkIiwgbUNvbG9yRm9ybWF0KTsKKyAgICBMT0dJKCJkaXNwbGF5ID0gJWQgeCAlZCwgZGVjb2RlZCA9ICVkIHggJWQiLAorICAgICAgICAgICAgbURpc3BsYXlXaWR0aCwgbURpc3BsYXlIZWlnaHQsIG1EZWNvZGVkV2lkdGgsIG1EZWNvZGVkSGVpZ2h0KTsKKworICAgIGludCBoYWxGb3JtYXQ7CisgICAgc3dpdGNoIChtQ29sb3JGb3JtYXQpIHsKKyNpZiBIQVNfWUNCQ1I0MjBfU1BfQURSRU5PCisgICAgICAgIGNhc2UgT01YX0NPTE9SX0Zvcm1hdFlVVjQyMFBsYW5hcjoKKyAgICAgICAgeworICAgICAgICAgICAgaGFsRm9ybWF0ID0gSEFMX1BJWEVMX0ZPUk1BVF9ZQ3JDYl80MjBfU1BfQURSRU5POworICAgICAgICAgICAgbVlVVk1vZGUgPSBZVVY0MjBUb1lVVjQyMHNwOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIDB4N2ZhMzBjMDA6CisgICAgICAgIHsKKyAgICAgICAgICAgIGhhbEZvcm1hdCA9IEhBTF9QSVhFTF9GT1JNQVRfWUNyQ2JfNDIwX1NQX0FEUkVOTzsKKyAgICAgICAgICAgIG1ZVVZNb2RlID0gWVVWNDIwc3BUb1lVVjQyMHNwOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyNlbmRpZgorCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBoYWxGb3JtYXQgPSBIQUxfUElYRUxfRk9STUFUX1JHQl81NjU7CisKKyAgICAgICAgICAgIG1Db252ZXJ0ZXIgPSBuZXcgQ29sb3JDb252ZXJ0ZXIoCisgICAgICAgICAgICAgICAgICAgIG1Db2xvckZvcm1hdCwgT01YX0NPTE9SX0Zvcm1hdDE2Yml0UkdCNTY1KTsKKyAgICAgICAgICAgIENIRUNLKG1Db252ZXJ0ZXItPmlzVmFsaWQoKSk7CisgICAgICAgICAgICBicmVhazsKICAgICB9CiAKLSAgICBDSEVDSyhtSVN1cmZhY2UuZ2V0KCkgIT0gTlVMTCk7CisgICAgQ0hFQ0sobVN1cmZhY2UuZ2V0KCkgIT0gTlVMTCk7CiAgICAgQ0hFQ0sobURlY29kZWRXaWR0aCA+IDApOwogICAgIENIRUNLKG1EZWNvZGVkSGVpZ2h0ID4gMCk7Ci0gICAgQ0hFQ0sobU1lbW9yeUhlYXAtPmhlYXBJRCgpID49IDApOwotICAgIENIRUNLKG1Db252ZXJ0ZXIuaXNWYWxpZCgpKTsKKyAgICBDSEVDSyhtQ29udmVydGVyID09IE5VTEwgfHwgbUNvbnZlcnRlci0+aXNWYWxpZCgpKTsKIAotICAgIElTdXJmYWNlOjpCdWZmZXJIZWFwIGJ1ZmZlckhlYXAoCi0gICAgICAgICAgICBtRGlzcGxheVdpZHRoLCBtRGlzcGxheUhlaWdodCwKLSAgICAgICAgICAgIG1EZWNvZGVkV2lkdGgsIG1EZWNvZGVkSGVpZ2h0LAotICAgICAgICAgICAgUElYRUxfRk9STUFUX1JHQl81NjUsCi0gICAgICAgICAgICBtTWVtb3J5SGVhcCk7CisgICAgQ0hFQ0tfRVEoMCwKKyAgICAgICAgICAgIG5hdGl2ZV93aW5kb3dfc2V0X3VzYWdlKAorICAgICAgICAgICAgbVN1cmZhY2UuZ2V0KCksCisgICAgICAgICAgICBHUkFMTE9DX1VTQUdFX1NXX1JFQURfTkVWRVIgfCBHUkFMTE9DX1VTQUdFX1NXX1dSSVRFX09GVEVOCisgICAgICAgICAgICB8IEdSQUxMT0NfVVNBR0VfSFdfVEVYVFVSRSkpOwogCi0gICAgc3RhdHVzX3QgZXJyID0gbUlTdXJmYWNlLT5yZWdpc3RlckJ1ZmZlcnMoYnVmZmVySGVhcCk7Ci0gICAgQ0hFQ0tfRVEoZXJyLCBPSyk7CisgICAgQ0hFQ0tfRVEoMCwgbmF0aXZlX3dpbmRvd19zZXRfYnVmZmVyX2NvdW50KG1TdXJmYWNlLmdldCgpLCAyKSk7CisKKyAgICAvLyBXaWR0aCBtdXN0IGJlIG11bHRpcGxlIG9mIDMyPz8/CisgICAgQ0hFQ0tfRVEoMCwgbmF0aXZlX3dpbmRvd19zZXRfYnVmZmVyc19nZW9tZXRyeSgKKyAgICAgICAgICAgICAgICBtU3VyZmFjZS5nZXQoKSwgbURlY29kZWRXaWR0aCwgbURlY29kZWRIZWlnaHQsCisgICAgICAgICAgICAgICAgaGFsRm9ybWF0KSk7CiB9CiAKIFNvZnR3YXJlUmVuZGVyZXI6On5Tb2Z0d2FyZVJlbmRlcmVyKCkgewotICAgIG1JU3VyZmFjZS0+dW5yZWdpc3RlckJ1ZmZlcnMoKTsKKyAgICBkZWxldGUgbUNvbnZlcnRlcjsKKyAgICBtQ29udmVydGVyID0gTlVMTDsKK30KKworc3RhdGljIGlubGluZSBzaXplX3QgQUxJR04oc2l6ZV90IHgsIHNpemVfdCBhbGlnbm1lbnQpIHsKKyAgICByZXR1cm4gKHggKyBhbGlnbm1lbnQgLSAxKSAmIH4oYWxpZ25tZW50IC0gMSk7CiB9CiAKIHZvaWQgU29mdHdhcmVSZW5kZXJlcjo6cmVuZGVyKAogICAgICAgICBjb25zdCB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSwgdm9pZCAqcGxhdGZvcm1Qcml2YXRlKSB7Ci0gICAgc2l6ZV90IG9mZnNldCA9IG1JbmRleCAqIG1GcmFtZVNpemU7Ci0gICAgdm9pZCAqZHN0ID0gKHVpbnQ4X3QgKiltTWVtb3J5SGVhcC0+Z2V0QmFzZSgpICsgb2Zmc2V0OworICAgIGFuZHJvaWRfbmF0aXZlX2J1ZmZlcl90ICpidWY7CisgICAgaW50IGVycjsKKyAgICBpZiAoKGVyciA9IG1TdXJmYWNlLT5kZXF1ZXVlQnVmZmVyKG1TdXJmYWNlLmdldCgpLCAmYnVmKSkgIT0gMCkgeworICAgICAgICBMT0dXKCJTdXJmYWNlOjpkZXF1ZXVlQnVmZmVyIHJldHVybmVkIGVycm9yICVkIiwgZXJyKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KIAotICAgIG1Db252ZXJ0ZXIuY29udmVydCgKLSAgICAgICAgICAgIG1EZWNvZGVkV2lkdGgsIG1EZWNvZGVkSGVpZ2h0LAotICAgICAgICAgICAgZGF0YSwgMCwgZHN0LCAyICogbURlY29kZWRXaWR0aCk7CisgICAgQ0hFQ0tfRVEoMCwgbVN1cmZhY2UtPmxvY2tCdWZmZXIobVN1cmZhY2UuZ2V0KCksIGJ1ZikpOwogCi0gICAgbUlTdXJmYWNlLT5wb3N0QnVmZmVyKG9mZnNldCk7Ci0gICAgbUluZGV4ID0gMSAtIG1JbmRleDsKKyAgICBHcmFwaGljQnVmZmVyTWFwcGVyICZtYXBwZXIgPSBHcmFwaGljQnVmZmVyTWFwcGVyOjpnZXQoKTsKKworICAgIFJlY3QgYm91bmRzKG1EZWNvZGVkV2lkdGgsIG1EZWNvZGVkSGVpZ2h0KTsKKworICAgIHZvaWQgKmRzdDsKKyAgICBDSEVDS19FUSgwLCBtYXBwZXIubG9jaygKKyAgICAgICAgICAgICAgICBidWYtPmhhbmRsZSwgR1JBTExPQ19VU0FHRV9TV19XUklURV9PRlRFTiwgYm91bmRzLCAmZHN0KSk7CisKKyAgICBpZiAobUNvbnZlcnRlcikgeworICAgICAgICBtQ29udmVydGVyLT5jb252ZXJ0KAorICAgICAgICAgICAgICAgIG1EZWNvZGVkV2lkdGgsIG1EZWNvZGVkSGVpZ2h0LAorICAgICAgICAgICAgICAgIGRhdGEsIDAsIGRzdCwgYnVmLT5zdHJpZGUgKiAyKTsKKyAgICB9IGVsc2UgaWYgKG1ZVVZNb2RlID09IFlVVjQyMHNwVG9ZVVY0MjBzcCkgeworICAgICAgICAvLyBJbnB1dCBhbmQgb3V0cHV0IGFyZSBib3RoIFlVVjQyMHNwLCBidXQgdGhlIGFsaWdubWVudCByZXF1aXJlbWVudHMKKyAgICAgICAgLy8gYXJlIGRpZmZlcmVudC4KKyAgICAgICAgc2l6ZV90IHNyY1lTdHJpZGUgPSBtRGVjb2RlZFdpZHRoOworICAgICAgICBjb25zdCB1aW50OF90ICpzcmNZID0gKGNvbnN0IHVpbnQ4X3QgKilkYXRhOworICAgICAgICB1aW50OF90ICpkc3RZID0gKHVpbnQ4X3QgKilkc3Q7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbURlY29kZWRIZWlnaHQ7ICsraSkgeworICAgICAgICAgICAgbWVtY3B5KGRzdFksIHNyY1ksIG1EZWNvZGVkV2lkdGgpOworICAgICAgICAgICAgc3JjWSArPSBzcmNZU3RyaWRlOworICAgICAgICAgICAgZHN0WSArPSBidWYtPnN0cmlkZTsKKyAgICAgICAgfQorCisgICAgICAgIHNpemVfdCBzcmNVVlN0cmlkZSA9IChtRGVjb2RlZFdpZHRoICsgMSkgJiB+MTsKKyAgICAgICAgc2l6ZV90IGRzdFVWU3RyaWRlID0gQUxJR04obURlY29kZWRXaWR0aCAvIDIsIDMyKSAqIDI7CisKKyAgICAgICAgY29uc3QgdWludDhfdCAqc3JjVVYgPSAoY29uc3QgdWludDhfdCAqKWRhdGEKKyAgICAgICAgICAgICsgbURlY29kZWRIZWlnaHQgKiBtRGVjb2RlZFdpZHRoOworCisgICAgICAgIHNpemVfdCBkc3RVVk9mZnNldCA9IEFMSUdOKEFMSUdOKG1EZWNvZGVkSGVpZ2h0LCAzMikgKiBidWYtPnN0cmlkZSwgNDA5Nik7CisgICAgICAgIHVpbnQ4X3QgKmRzdFVWID0gKHVpbnQ4X3QgKilkc3QgKyBkc3RVVk9mZnNldDsKKworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IChtRGVjb2RlZEhlaWdodCArIDEpIC8gMjsgKytpKSB7CisgICAgICAgICAgICBtZW1jcHkoZHN0VVYsIHNyY1VWLCAobURlY29kZWRXaWR0aCArIDEpICYgfjEpOworICAgICAgICAgICAgc3JjVVYgKz0gc3JjVVZTdHJpZGU7CisgICAgICAgICAgICBkc3RVViArPSBkc3RVVlN0cmlkZTsKKyAgICAgICAgfQorICAgIH0gZWxzZSBpZiAobVlVVk1vZGUgPT0gWVVWNDIwVG9ZVVY0MjBzcCkgeworICAgICAgICAvLyBJbnB1dCBpcyBZVVY0MjAgcGxhbmFyLCBvdXRwdXQgaXMgWVVWNDIwc3AsIGFkaGVyZSB0byBwcm9wZXIKKyAgICAgICAgLy8gYWxpZ25tZW50IHJlcXVpcmVtZW50cy4KKyAgICAgICAgc2l6ZV90IHNyY1lTdHJpZGUgPSBtRGVjb2RlZFdpZHRoOworICAgICAgICBjb25zdCB1aW50OF90ICpzcmNZID0gKGNvbnN0IHVpbnQ4X3QgKilkYXRhOworICAgICAgICB1aW50OF90ICpkc3RZID0gKHVpbnQ4X3QgKilkc3Q7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbURlY29kZWRIZWlnaHQ7ICsraSkgeworICAgICAgICAgICAgbWVtY3B5KGRzdFksIHNyY1ksIG1EZWNvZGVkV2lkdGgpOworICAgICAgICAgICAgc3JjWSArPSBzcmNZU3RyaWRlOworICAgICAgICAgICAgZHN0WSArPSBidWYtPnN0cmlkZTsKKyAgICAgICAgfQorCisgICAgICAgIHNpemVfdCBzcmNVVlN0cmlkZSA9IChtRGVjb2RlZFdpZHRoICsgMSkgLyAyOworICAgICAgICBzaXplX3QgZHN0VVZTdHJpZGUgPSBBTElHTihtRGVjb2RlZFdpZHRoIC8gMiwgMzIpICogMjsKKworICAgICAgICBjb25zdCB1aW50OF90ICpzcmNVID0gKGNvbnN0IHVpbnQ4X3QgKilkYXRhCisgICAgICAgICAgICArIG1EZWNvZGVkSGVpZ2h0ICogbURlY29kZWRXaWR0aDsKKworICAgICAgICBjb25zdCB1aW50OF90ICpzcmNWID0KKyAgICAgICAgICAgIHNyY1UgKyAoKG1EZWNvZGVkV2lkdGggKyAxKSAvIDIpICogKChtRGVjb2RlZEhlaWdodCArIDEpIC8gMik7CisKKyAgICAgICAgc2l6ZV90IGRzdFVWT2Zmc2V0ID0gQUxJR04oQUxJR04obURlY29kZWRIZWlnaHQsIDMyKSAqIGJ1Zi0+c3RyaWRlLCA0MDk2KTsKKyAgICAgICAgdWludDhfdCAqZHN0VVYgPSAodWludDhfdCAqKWRzdCArIGRzdFVWT2Zmc2V0OworCisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgKG1EZWNvZGVkSGVpZ2h0ICsgMSkgLyAyOyArK2kpIHsKKyAgICAgICAgICAgIGZvciAoc2l6ZV90IGogPSAwOyBqIDwgKG1EZWNvZGVkV2lkdGggKyAxKSAvIDI7ICsraikgeworICAgICAgICAgICAgICAgIGRzdFVWWzIgKiBqICsgMV0gPSBzcmNVW2pdOworICAgICAgICAgICAgICAgIGRzdFVWWzIgKiBqXSA9IHNyY1Zbal07CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzcmNVICs9IHNyY1VWU3RyaWRlOworICAgICAgICAgICAgc3JjViArPSBzcmNVVlN0cmlkZTsKKyAgICAgICAgICAgIGRzdFVWICs9IGRzdFVWU3RyaWRlOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgbWVtY3B5KGRzdCwgZGF0YSwgc2l6ZSk7CisgICAgfQorCisgICAgQ0hFQ0tfRVEoMCwgbWFwcGVyLnVubG9jayhidWYtPmhhbmRsZSkpOworCisgICAgaWYgKChlcnIgPSBtU3VyZmFjZS0+cXVldWVCdWZmZXIobVN1cmZhY2UuZ2V0KCksIGJ1ZikpICE9IDApIHsKKyAgICAgICAgTE9HVygiU3VyZmFjZTo6cXVldWVCdWZmZXIgcmV0dXJuZWQgZXJyb3IgJWQiLCBlcnIpOworICAgIH0KKyAgICBidWYgPSBOVUxMOwogfQogCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cGxpdmUvTTNVUGFyc2VyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHBsaXZlL00zVVBhcnNlci5jcHAKaW5kZXggZWRkODY0OC4uMTc3NzFjNCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cGxpdmUvTTNVUGFyc2VyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwbGl2ZS9NM1VQYXJzZXIuY3BwCkBAIC05MCw3ICs5MCw3IEBACiAgICAgICAgIG91dC0+c2V0VG8oYmFzZVVSTCk7CiAgICAgICAgIG91dC0+YXBwZW5kKHVybCk7CiAgICAgfSBlbHNlIHsKLSAgICAgICAgY2hhciAqc2xhc2hQb3MgPSBzdHJyY2hyKGJhc2VVUkwsICcvJyk7CisgICAgICAgIGNvbnN0IGNoYXIgKnNsYXNoUG9zID0gc3RycmNocihiYXNlVVJMLCAnLycpOwogCiAgICAgICAgIGlmIChzbGFzaFBvcyA+ICZiYXNlVVJMWzZdKSB7CiAgICAgICAgICAgICBvdXQtPnNldFRvKGJhc2VVUkwsIHNsYXNoUG9zIC0gYmFzZVVSTCk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL0F3ZXNvbWVQbGF5ZXIuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvQXdlc29tZVBsYXllci5oCmluZGV4IDFmMzk0NmMuLmVhMmY3ZDUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvQXdlc29tZVBsYXllci5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvQXdlc29tZVBsYXllci5oCkBAIC03Niw2ICs3Niw3IEBACiAgICAgYm9vbCBpc1BsYXlpbmcoKSBjb25zdDsKIAogICAgIHZvaWQgc2V0SVN1cmZhY2UoY29uc3Qgc3A8SVN1cmZhY2U+ICZpc3VyZmFjZSk7CisgICAgdm9pZCBzZXRTdXJmYWNlKGNvbnN0IHNwPFN1cmZhY2U+ICZzdXJmYWNlKTsKICAgICB2b2lkIHNldEF1ZGlvU2luayhjb25zdCBzcDxNZWRpYVBsYXllckJhc2U6OkF1ZGlvU2luaz4gJmF1ZGlvU2luayk7CiAgICAgc3RhdHVzX3Qgc2V0TG9vcGluZyhib29sIHNob3VsZExvb3ApOwogCkBAIC0xMTgsNiArMTE5LDcgQEAKICAgICB3cDxNZWRpYVBsYXllckJhc2U+IG1MaXN0ZW5lcjsKIAogICAgIHNwPElTdXJmYWNlPiBtSVN1cmZhY2U7CisgICAgc3A8U3VyZmFjZT4gbVN1cmZhY2U7CiAgICAgc3A8TWVkaWFQbGF5ZXJCYXNlOjpBdWRpb1Npbms+IG1BdWRpb1Npbms7CiAKICAgICBTeXN0ZW1UaW1lU291cmNlIG1TeXN0ZW1UaW1lU291cmNlOwpAQCAtMjIwLDYgKzIyMiw3IEBACiAgICAgc3RhdHVzX3Qgc2Vla1RvX2woaW50NjRfdCB0aW1lVXMpOwogICAgIHN0YXR1c190IHBhdXNlX2woKTsKICAgICB2b2lkIGluaXRSZW5kZXJlcl9sKCk7CisgICAgdm9pZCBub3RpZnlWaWRlb1NpemVfbCgpOwogICAgIHZvaWQgc2Vla0F1ZGlvSWZOZWNlc3NhcnlfbCgpOwogCiAgICAgdm9pZCBjYW5jZWxQbGF5ZXJFdmVudHMoYm9vbCBrZWVwQnVmZmVyaW5nR29pbmcgPSBmYWxzZSk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL09NWC5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9PTVguaAppbmRleCBjOTlkYTU5Li44M2I3NWFkIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL09NWC5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvT01YLmgKQEAgLTU5LDEwICs1OSwxNyBAQAogICAgICAgICAgICAgbm9kZV9pZCBub2RlLCBPTVhfSU5ERVhUWVBFIGluZGV4LAogICAgICAgICAgICAgY29uc3Qgdm9pZCAqcGFyYW1zLCBzaXplX3Qgc2l6ZSk7CiAKKyAgICB2aXJ0dWFsIHN0YXR1c190IGVuYWJsZUdyYXBoaWNCdWZmZXJzKAorICAgICAgICAgICAgbm9kZV9pZCBub2RlLCBPTVhfVTMyIHBvcnRfaW5kZXgsIE9NWF9CT09MIGVuYWJsZSk7CisKICAgICB2aXJ0dWFsIHN0YXR1c190IHVzZUJ1ZmZlcigKICAgICAgICAgICAgIG5vZGVfaWQgbm9kZSwgT01YX1UzMiBwb3J0X2luZGV4LCBjb25zdCBzcDxJTWVtb3J5PiAmcGFyYW1zLAogICAgICAgICAgICAgYnVmZmVyX2lkICpidWZmZXIpOwogCisgICAgdmlydHVhbCBzdGF0dXNfdCB1c2VHcmFwaGljQnVmZmVyKAorICAgICAgICAgICAgbm9kZV9pZCBub2RlLCBPTVhfVTMyIHBvcnRfaW5kZXgsCisgICAgICAgICAgICBjb25zdCBzcDxHcmFwaGljQnVmZmVyPiAmZ3JhcGhpY0J1ZmZlciwgYnVmZmVyX2lkICpidWZmZXIpOworCiAgICAgdmlydHVhbCBzdGF0dXNfdCBhbGxvY2F0ZUJ1ZmZlcigKICAgICAgICAgICAgIG5vZGVfaWQgbm9kZSwgT01YX1UzMiBwb3J0X2luZGV4LCBzaXplX3Qgc2l6ZSwKICAgICAgICAgICAgIGJ1ZmZlcl9pZCAqYnVmZmVyLCB2b2lkICoqYnVmZmVyX2RhdGEpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9PTVhOb2RlSW5zdGFuY2UuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvT01YTm9kZUluc3RhbmNlLmgKaW5kZXggYjViMzFhYy4uOGM3YzU2MiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9PTVhOb2RlSW5zdGFuY2UuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL09NWE5vZGVJbnN0YW5jZS5oCkBAIC00OSwxMCArNDksMTYgQEAKICAgICBzdGF0dXNfdCBnZXRDb25maWcoT01YX0lOREVYVFlQRSBpbmRleCwgdm9pZCAqcGFyYW1zLCBzaXplX3Qgc2l6ZSk7CiAgICAgc3RhdHVzX3Qgc2V0Q29uZmlnKE9NWF9JTkRFWFRZUEUgaW5kZXgsIGNvbnN0IHZvaWQgKnBhcmFtcywgc2l6ZV90IHNpemUpOwogCisgICAgc3RhdHVzX3QgZW5hYmxlR3JhcGhpY0J1ZmZlcnMoT01YX1UzMiBwb3J0SW5kZXgsIE9NWF9CT09MIGVuYWJsZSk7CisKICAgICBzdGF0dXNfdCB1c2VCdWZmZXIoCiAgICAgICAgICAgICBPTVhfVTMyIHBvcnRJbmRleCwgY29uc3Qgc3A8SU1lbW9yeT4gJnBhcmFtcywKICAgICAgICAgICAgIE9NWDo6YnVmZmVyX2lkICpidWZmZXIpOwogCisgICAgc3RhdHVzX3QgdXNlR3JhcGhpY0J1ZmZlcigKKyAgICAgICAgICAgIE9NWF9VMzIgcG9ydEluZGV4LCBjb25zdCBzcDxHcmFwaGljQnVmZmVyPiAmZ3JhcGhpY0J1ZmZlciwKKyAgICAgICAgICAgIE9NWDo6YnVmZmVyX2lkICpidWZmZXIpOworCiAgICAgc3RhdHVzX3QgYWxsb2NhdGVCdWZmZXIoCiAgICAgICAgICAgICBPTVhfVTMyIHBvcnRJbmRleCwgc2l6ZV90IHNpemUsIE9NWDo6YnVmZmVyX2lkICpidWZmZXIsCiAgICAgICAgICAgICB2b2lkICoqYnVmZmVyX2RhdGEpOwpAQCAtMTI1LDQgKzEzMSwzIEBACiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAogCiAjZW5kaWYgIC8vIE9NWF9OT0RFX0lOU1RBTkNFX0hfCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvU29mdHdhcmVSZW5kZXJlci5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9Tb2Z0d2FyZVJlbmRlcmVyLmgKaW5kZXggOWVlZDA4OS4uOGQ1ODA1NiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9Tb2Z0d2FyZVJlbmRlcmVyLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9Tb2Z0d2FyZVJlbmRlcmVyLmgKQEAgLTI0LDE0ICsyNCwxNCBAQAogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKLWNsYXNzIElTdXJmYWNlOworY2xhc3MgU3VyZmFjZTsKIGNsYXNzIE1lbW9yeUhlYXBCYXNlOwogCiBjbGFzcyBTb2Z0d2FyZVJlbmRlcmVyIDogcHVibGljIFZpZGVvUmVuZGVyZXIgewogcHVibGljOgogICAgIFNvZnR3YXJlUmVuZGVyZXIoCiAgICAgICAgICAgICBPTVhfQ09MT1JfRk9STUFUVFlQRSBjb2xvckZvcm1hdCwKLSAgICAgICAgICAgIGNvbnN0IHNwPElTdXJmYWNlPiAmc3VyZmFjZSwKKyAgICAgICAgICAgIGNvbnN0IHNwPFN1cmZhY2U+ICZzdXJmYWNlLAogICAgICAgICAgICAgc2l6ZV90IGRpc3BsYXlXaWR0aCwgc2l6ZV90IGRpc3BsYXlIZWlnaHQsCiAgICAgICAgICAgICBzaXplX3QgZGVjb2RlZFdpZHRoLCBzaXplX3QgZGVjb2RlZEhlaWdodCk7CiAKQEAgLTQxLDE0ICs0MSwxOCBAQAogICAgICAgICAgICAgY29uc3Qgdm9pZCAqZGF0YSwgc2l6ZV90IHNpemUsIHZvaWQgKnBsYXRmb3JtUHJpdmF0ZSk7CiAKIHByaXZhdGU6CisgICAgZW51bSBZVVZNb2RlIHsKKyAgICAgICAgTm9uZSwKKyAgICAgICAgWVVWNDIwVG9ZVVY0MjBzcCwKKyAgICAgICAgWVVWNDIwc3BUb1lVVjQyMHNwLAorICAgIH07CisKICAgICBPTVhfQ09MT1JfRk9STUFUVFlQRSBtQ29sb3JGb3JtYXQ7Ci0gICAgQ29sb3JDb252ZXJ0ZXIgbUNvbnZlcnRlcjsKLSAgICBzcDxJU3VyZmFjZT4gbUlTdXJmYWNlOworICAgIENvbG9yQ29udmVydGVyICptQ29udmVydGVyOworICAgIFlVVk1vZGUgbVlVVk1vZGU7CisgICAgc3A8U3VyZmFjZT4gbVN1cmZhY2U7CiAgICAgc2l6ZV90IG1EaXNwbGF5V2lkdGgsIG1EaXNwbGF5SGVpZ2h0OwogICAgIHNpemVfdCBtRGVjb2RlZFdpZHRoLCBtRGVjb2RlZEhlaWdodDsKLSAgICBzaXplX3QgbUZyYW1lU2l6ZTsKLSAgICBzcDxNZW1vcnlIZWFwQmFzZT4gbU1lbW9yeUhlYXA7Ci0gICAgaW50IG1JbmRleDsKIAogICAgIFNvZnR3YXJlUmVuZGVyZXIoY29uc3QgU29mdHdhcmVSZW5kZXJlciAmKTsKICAgICBTb2Z0d2FyZVJlbmRlcmVyICZvcGVyYXRvcj0oY29uc3QgU29mdHdhcmVSZW5kZXJlciAmKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9PTVguY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L09NWC5jcHAKaW5kZXggNmRlNzYxZi4uMzcyNDNhZCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L09NWC5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L09NWC5jcHAKQEAgLTI4Nyw2ICsyODcsMTEgQEAKICAgICAgICAgICAgIGluZGV4LCBwYXJhbXMsIHNpemUpOwogfQogCitzdGF0dXNfdCBPTVg6OmVuYWJsZUdyYXBoaWNCdWZmZXJzKAorICAgICAgICBub2RlX2lkIG5vZGUsIE9NWF9VMzIgcG9ydF9pbmRleCwgT01YX0JPT0wgZW5hYmxlKSB7CisgICAgcmV0dXJuIGZpbmRJbnN0YW5jZShub2RlKS0+ZW5hYmxlR3JhcGhpY0J1ZmZlcnMocG9ydF9pbmRleCwgZW5hYmxlKTsKK30KKwogc3RhdHVzX3QgT01YOjp1c2VCdWZmZXIoCiAgICAgICAgIG5vZGVfaWQgbm9kZSwgT01YX1UzMiBwb3J0X2luZGV4LCBjb25zdCBzcDxJTWVtb3J5PiAmcGFyYW1zLAogICAgICAgICBidWZmZXJfaWQgKmJ1ZmZlcikgewpAQCAtMjk0LDYgKzI5OSwxMyBAQAogICAgICAgICAgICAgcG9ydF9pbmRleCwgcGFyYW1zLCBidWZmZXIpOwogfQogCitzdGF0dXNfdCBPTVg6OnVzZUdyYXBoaWNCdWZmZXIoCisgICAgICAgIG5vZGVfaWQgbm9kZSwgT01YX1UzMiBwb3J0X2luZGV4LAorICAgICAgICBjb25zdCBzcDxHcmFwaGljQnVmZmVyPiAmZ3JhcGhpY0J1ZmZlciwgYnVmZmVyX2lkICpidWZmZXIpIHsKKyAgICByZXR1cm4gZmluZEluc3RhbmNlKG5vZGUpLT51c2VHcmFwaGljQnVmZmVyKAorICAgICAgICAgICAgcG9ydF9pbmRleCwgZ3JhcGhpY0J1ZmZlciwgYnVmZmVyKTsKK30KKwogc3RhdHVzX3QgT01YOjphbGxvY2F0ZUJ1ZmZlcigKICAgICAgICAgbm9kZV9pZCBub2RlLCBPTVhfVTMyIHBvcnRfaW5kZXgsIHNpemVfdCBzaXplLAogICAgICAgICBidWZmZXJfaWQgKmJ1ZmZlciwgdm9pZCAqKmJ1ZmZlcl9kYXRhKSB7CkBAIC00OTUsMTIgKzUwNywxNyBAQAogICAgIH0KIAogICAgIGlmICghaW1wbCkgeworI2lmIDAKICAgICAgICAgTE9HVygiVXNpbmcgc29mdHdhcmUgcmVuZGVyZXIuIik7CiAgICAgICAgIGltcGwgPSBuZXcgU29mdHdhcmVSZW5kZXJlcigKICAgICAgICAgICAgICAgICBjb2xvckZvcm1hdCwKICAgICAgICAgICAgICAgICBzdXJmYWNlLAogICAgICAgICAgICAgICAgIGRpc3BsYXlXaWR0aCwgZGlzcGxheUhlaWdodCwKICAgICAgICAgICAgICAgICBlbmNvZGVkV2lkdGgsIGVuY29kZWRIZWlnaHQpOworI2Vsc2UKKyAgICAgICAgQ0hFQ0soISJTaG91bGQgbm90IGJlIGhlcmUuIik7CisgICAgICAgIHJldHVybiBOVUxMOworI2VuZGlmCiAgICAgfQogCiAgICAgcmV0dXJuIG5ldyBPTVhSZW5kZXJlcihpbXBsKTsKQEAgLTUyNSw0ICs1NDIsMyBAQAogfQogCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvT01YTm9kZUluc3RhbmNlLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9PTVhOb2RlSW5zdGFuY2UuY3BwCmluZGV4IDVkYjUxNmUuLmJhNGQ3NjUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9PTVhOb2RlSW5zdGFuY2UuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9PTVhOb2RlSW5zdGFuY2UuY3BwCkBAIC0yNCw2ICsyNCw3IEBACiAjaW5jbHVkZSA8T01YX0NvbXBvbmVudC5oPgogCiAjaW5jbHVkZSA8YmluZGVyL0lNZW1vcnkuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9IYXJkd2FyZUFQSS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRGVidWcuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oPgogCkBAIC00MCw2ICs0MSwxMSBAQAogICAgICAgICAgIG1Jc0JhY2t1cChmYWxzZSkgewogICAgIH0KIAorICAgIEJ1ZmZlck1ldGEoY29uc3Qgc3A8R3JhcGhpY0J1ZmZlcj4gJmdyYXBoaWNCdWZmZXIpCisgICAgICAgIDogbUdyYXBoaWNCdWZmZXIoZ3JhcGhpY0J1ZmZlciksCisgICAgICAgICAgbUlzQmFja3VwKGZhbHNlKSB7CisgICAgfQorCiAgICAgdm9pZCBDb3B5RnJvbU9NWChjb25zdCBPTVhfQlVGRkVSSEVBREVSVFlQRSAqaGVhZGVyKSB7CiAgICAgICAgIGlmICghbUlzQmFja3VwKSB7CiAgICAgICAgICAgICByZXR1cm47CkBAIC02MSw2ICs2Nyw3IEBACiAgICAgfQogCiBwcml2YXRlOgorICAgIHNwPEdyYXBoaWNCdWZmZXI+IG1HcmFwaGljQnVmZmVyOwogICAgIHNwPElNZW1vcnk+IG1NZW07CiAgICAgc2l6ZV90IG1TaXplOwogICAgIGJvb2wgbUlzQmFja3VwOwpAQCAtMjQwLDYgKzI0Nyw0MyBAQAogICAgIHJldHVybiBTdGF0dXNGcm9tT01YRXJyb3IoZXJyKTsKIH0KIAorc3RhdHVzX3QgT01YTm9kZUluc3RhbmNlOjplbmFibGVHcmFwaGljQnVmZmVycygKKyAgICAgICAgT01YX1UzMiBwb3J0SW5kZXgsIE9NWF9CT09MIGVuYWJsZSkgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisKKyAgICBPTVhfSU5ERVhUWVBFIGluZGV4OworICAgIE9NWF9FUlJPUlRZUEUgZXJyID0gT01YX0dldEV4dGVuc2lvbkluZGV4KAorICAgICAgICAgICAgbUhhbmRsZSwKKyAgICAgICAgICAgIGNvbnN0X2Nhc3Q8T01YX1NUUklORz4oIk9NWC5nb29nbGUuYW5kcm9pZC5pbmRleC5lbmFibGVBbmRyb2lkTmF0aXZlQnVmZmVycyIpLAorICAgICAgICAgICAgJmluZGV4KTsKKworICAgIGlmIChlcnIgIT0gT01YX0Vycm9yTm9uZSkgeworICAgICAgICBMT0dFKCJPTVhfR2V0RXh0ZW5zaW9uSW5kZXggZmFpbGVkIik7CisKKyAgICAgICAgcmV0dXJuIFN0YXR1c0Zyb21PTVhFcnJvcihlcnIpOworICAgIH0KKworICAgIE9NWF9WRVJTSU9OVFlQRSB2ZXI7CisgICAgdmVyLnMublZlcnNpb25NYWpvciA9IDE7CisgICAgdmVyLnMublZlcnNpb25NaW5vciA9IDA7CisgICAgdmVyLnMublJldmlzaW9uID0gMDsKKyAgICB2ZXIucy5uU3RlcCA9IDA7CisgICAgRW5hYmxlQW5kcm9pZE5hdGl2ZUJ1ZmZlcnNQYXJhbXMgcGFyYW1zID0geworICAgICAgICBzaXplb2YoRW5hYmxlQW5kcm9pZE5hdGl2ZUJ1ZmZlcnNQYXJhbXMpLCB2ZXIsIHBvcnRJbmRleCwgZW5hYmxlLAorICAgIH07CisKKyAgICBlcnIgPSBPTVhfU2V0UGFyYW1ldGVyKG1IYW5kbGUsIGluZGV4LCAmcGFyYW1zKTsKKworICAgIGlmIChlcnIgIT0gT01YX0Vycm9yTm9uZSkgeworICAgICAgICBMT0dFKCJPTVhfRW5hYmxlQW5kcm9pZE5hdGl2ZUJ1ZmZlcnMgZmFpbGVkIHdpdGggZXJyb3IgJWQgKDB4JTA4eCkiLAorICAgICAgICAgICAgICAgIGVyciwgZXJyKTsKKworICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICB9CisKKyAgICByZXR1cm4gT0s7Cit9CisKIHN0YXR1c190IE9NWE5vZGVJbnN0YW5jZTo6dXNlQnVmZmVyKAogICAgICAgICBPTVhfVTMyIHBvcnRJbmRleCwgY29uc3Qgc3A8SU1lbW9yeT4gJnBhcmFtcywKICAgICAgICAgT01YOjpidWZmZXJfaWQgKmJ1ZmZlcikgewpAQCAtMjczLDYgKzMxNyw2MCBAQAogICAgIHJldHVybiBPSzsKIH0KIAorc3RhdHVzX3QgT01YTm9kZUluc3RhbmNlOjp1c2VHcmFwaGljQnVmZmVyKAorICAgICAgICBPTVhfVTMyIHBvcnRJbmRleCwgY29uc3Qgc3A8R3JhcGhpY0J1ZmZlcj4mIGdyYXBoaWNCdWZmZXIsCisgICAgICAgIE9NWDo6YnVmZmVyX2lkICpidWZmZXIpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworCisgICAgT01YX0lOREVYVFlQRSBpbmRleDsKKyAgICBPTVhfRVJST1JUWVBFIGVyciA9IE9NWF9HZXRFeHRlbnNpb25JbmRleCgKKyAgICAgICAgICAgIG1IYW5kbGUsCisgICAgICAgICAgICBjb25zdF9jYXN0PE9NWF9TVFJJTkc+KCJPTVguZ29vZ2xlLmFuZHJvaWQuaW5kZXgudXNlQW5kcm9pZE5hdGl2ZUJ1ZmZlciIpLAorICAgICAgICAgICAgJmluZGV4KTsKKworICAgIGlmIChlcnIgIT0gT01YX0Vycm9yTm9uZSkgeworICAgICAgICBMT0dFKCJPTVhfR2V0RXh0ZW5zaW9uSW5kZXggZmFpbGVkIik7CisKKyAgICAgICAgcmV0dXJuIFN0YXR1c0Zyb21PTVhFcnJvcihlcnIpOworICAgIH0KKworICAgIEJ1ZmZlck1ldGEgKmJ1ZmZlck1ldGEgPSBuZXcgQnVmZmVyTWV0YShncmFwaGljQnVmZmVyKTsKKworICAgIE9NWF9CVUZGRVJIRUFERVJUWVBFICpoZWFkZXI7CisKKyAgICBPTVhfVkVSU0lPTlRZUEUgdmVyOworICAgIHZlci5zLm5WZXJzaW9uTWFqb3IgPSAxOworICAgIHZlci5zLm5WZXJzaW9uTWlub3IgPSAwOworICAgIHZlci5zLm5SZXZpc2lvbiA9IDA7CisgICAgdmVyLnMublN0ZXAgPSAwOworICAgIFVzZUFuZHJvaWROYXRpdmVCdWZmZXJQYXJhbXMgcGFyYW1zID0geworICAgICAgICBzaXplb2YoVXNlQW5kcm9pZE5hdGl2ZUJ1ZmZlclBhcmFtcyksIHZlciwgcG9ydEluZGV4LCBidWZmZXJNZXRhLAorICAgICAgICAmaGVhZGVyLCBncmFwaGljQnVmZmVyLAorICAgIH07CisKKyAgICBlcnIgPSBPTVhfU2V0UGFyYW1ldGVyKG1IYW5kbGUsIGluZGV4LCAmcGFyYW1zKTsKKworICAgIGlmIChlcnIgIT0gT01YX0Vycm9yTm9uZSkgeworICAgICAgICBMT0dFKCJPTVhfVXNlQW5kcm9pZE5hdGl2ZUJ1ZmZlciBmYWlsZWQgd2l0aCBlcnJvciAlZCAoMHglMDh4KSIsIGVyciwKKyAgICAgICAgICAgICAgICBlcnIpOworCisgICAgICAgIGRlbGV0ZSBidWZmZXJNZXRhOworICAgICAgICBidWZmZXJNZXRhID0gTlVMTDsKKworICAgICAgICAqYnVmZmVyID0gMDsKKworICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICB9CisKKyAgICBDSEVDS19FUShoZWFkZXItPnBBcHBQcml2YXRlLCBidWZmZXJNZXRhKTsKKworICAgICpidWZmZXIgPSBoZWFkZXI7CisKKyAgICBhZGRBY3RpdmVCdWZmZXIocG9ydEluZGV4LCAqYnVmZmVyKTsKKworICAgIHJldHVybiBPSzsKK30KKwogc3RhdHVzX3QgT01YTm9kZUluc3RhbmNlOjphbGxvY2F0ZUJ1ZmZlcigKICAgICAgICAgT01YX1UzMiBwb3J0SW5kZXgsIHNpemVfdCBzaXplLCBPTVg6OmJ1ZmZlcl9pZCAqYnVmZmVyLAogICAgICAgICB2b2lkICoqYnVmZmVyX2RhdGEpIHsKQEAgLTQ5OCw0ICs1OTYsMyBAQAogfQogCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FSVFNQQ29ubmVjdGlvbi5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FSVFNQQ29ubmVjdGlvbi5jcHAKaW5kZXggY2JkNDgzNi4uZmQ2YWE2MiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BUlRTUENvbm5lY3Rpb24uY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQVJUU1BDb25uZWN0aW9uLmNwcApAQCAtMTI5LDcgKzEyOSw3IEBACiAgICAgICAgIHBhdGgtPnNldFRvKHNsYXNoUG9zKTsKICAgICB9CiAKLSAgICBjaGFyICpjb2xvblBvcyA9IHN0cmNocihob3N0LT5jX3N0cigpLCAnOicpOworICAgIGNvbnN0IGNoYXIgKmNvbG9uUG9zID0gc3RyY2hyKGhvc3QtPmNfc3RyKCksICc6Jyk7CiAKICAgICBpZiAoY29sb25Qb3MgIT0gTlVMTCkgewogICAgICAgICB1bnNpZ25lZCBsb25nIHg7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FTZXNzaW9uRGVzY3JpcHRpb24uY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BU2Vzc2lvbkRlc2NyaXB0aW9uLmNwcAppbmRleCA0ZWE3ZmRhLi40YThjY2U4IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FTZXNzaW9uRGVzY3JpcHRpb24uY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQVNlc3Npb25EZXNjcmlwdGlvbi5jcHAKQEAgLTE4Miw3ICsxODIsNyBAQAogICAgIEFTdHJpbmcgZm9ybWF0OwogICAgIGdldEZvcm1hdChpbmRleCwgJmZvcm1hdCk7CiAKLSAgICBjaGFyICpsYXN0U3BhY2VQb3MgPSBzdHJyY2hyKGZvcm1hdC5jX3N0cigpLCAnICcpOworICAgIGNvbnN0IGNoYXIgKmxhc3RTcGFjZVBvcyA9IHN0cnJjaHIoZm9ybWF0LmNfc3RyKCksICcgJyk7CiAgICAgQ0hFQ0sobGFzdFNwYWNlUG9zICE9IE5VTEwpOwogCiAgICAgY2hhciAqZW5kOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9NeUhhbmRsZXIuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvTXlIYW5kbGVyLmgKaW5kZXggYjg0OTExNy4uMGFlZmQ1OCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9NeUhhbmRsZXIuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL015SGFuZGxlci5oCkBAIC04NzMsNyArODczLDcgQEAKICAgICAgICAgICAgIG91dC0+c2V0VG8oYmFzZVVSTCk7CiAgICAgICAgICAgICBvdXQtPmFwcGVuZCh1cmwpOwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgY2hhciAqc2xhc2hQb3MgPSBzdHJyY2hyKGJhc2VVUkwsICcvJyk7CisgICAgICAgICAgICBjb25zdCBjaGFyICpzbGFzaFBvcyA9IHN0cnJjaHIoYmFzZVVSTCwgJy8nKTsKIAogICAgICAgICAgICAgaWYgKHNsYXNoUG9zID4gJmJhc2VVUkxbNl0pIHsKICAgICAgICAgICAgICAgICBvdXQtPnNldFRvKGJhc2VVUkwsIHNsYXNoUG9zIC0gYmFzZVVSTCk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC95dXYvQW5kcm9pZC5tayBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3l1di9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA3OTRhZDEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC95dXYvQW5kcm9pZC5tawpAQCAtMCwwICsxLDEzIEBACitMT0NBTF9QQVRIOj0gJChjYWxsIG15LWRpcikKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorCitMT0NBTF9TUkNfRklMRVM6PSAgICAgICAgICAgICAgIFwKKyAgICAgICAgWVVWSW1hZ2UuY3BwICAgICAgICAgICAgXAorICAgICAgICBZVVZDYW52YXMuY3BwCisKK0xPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gICAgICAgXAorICAgICAgICBsaWJjdXRpbHMKKworTE9DQUxfTU9EVUxFOj0gbGlic3RhZ2VmcmlnaHRfeXV2CisKK2luY2x1ZGUgJChCVUlMRF9TSEFSRURfTElCUkFSWSkKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3l1di9ZVVZDYW52YXMuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQveXV2L1lVVkNhbnZhcy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzhhYTc3OQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3l1di9ZVVZDYW52YXMuY3BwCkBAIC0wLDAgKzEsMTExIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiWVVWQ2FudmFzIgorCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFEZWJ1Zy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L1lVVkNhbnZhcy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L1lVVkltYWdlLmg+CisjaW5jbHVkZSA8dWkvUmVjdC5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK1lVVkNhbnZhczo6WVVWQ2FudmFzKFlVVkltYWdlICZ5dXZJbWFnZSkKKyAgICA6IG1ZVVZJbWFnZSh5dXZJbWFnZSkgeworfQorCitZVVZDYW52YXM6On5ZVVZDYW52YXMoKSB7Cit9CisKK3ZvaWQgWVVWQ2FudmFzOjpGaWxsWVVWKHVpbnQ4X3QgeVZhbHVlLCB1aW50OF90IHVWYWx1ZSwgdWludDhfdCB2VmFsdWUpIHsKKyAgICBmb3IgKGludDMyX3QgeSA9IDA7IHkgPCBtWVVWSW1hZ2UuaGVpZ2h0KCk7ICsreSkgeworICAgICAgICBmb3IgKGludDMyX3QgeCA9IDA7IHggPCBtWVVWSW1hZ2Uud2lkdGgoKTsgKyt4KSB7CisgICAgICAgICAgICBtWVVWSW1hZ2Uuc2V0UGl4ZWxWYWx1ZSh4LCB5LCB5VmFsdWUsIHVWYWx1ZSwgdlZhbHVlKTsKKyAgICAgICAgfQorICAgIH0KK30KKwordm9pZCBZVVZDYW52YXM6OkZpbGxZVVZSZWN0YW5nbGUoY29uc3QgUmVjdCYgcmVjdCwKKyAgICAgICAgdWludDhfdCB5VmFsdWUsIHVpbnQ4X3QgdVZhbHVlLCB1aW50OF90IHZWYWx1ZSkgeworICAgIGZvciAoaW50MzJfdCB5ID0gcmVjdC50b3A7IHkgPCByZWN0LmJvdHRvbTsgKyt5KSB7CisgICAgICAgIGZvciAoaW50MzJfdCB4ID0gcmVjdC5sZWZ0OyB4IDwgcmVjdC5yaWdodDsgKyt4KSB7CisgICAgICAgICAgICBtWVVWSW1hZ2Uuc2V0UGl4ZWxWYWx1ZSh4LCB5LCB5VmFsdWUsIHVWYWx1ZSwgdlZhbHVlKTsKKyAgICAgICAgfQorICAgIH0KK30KKwordm9pZCBZVVZDYW52YXM6OkNvcHlJbWFnZVJlY3QoCisgICAgICAgIGNvbnN0IFJlY3QmIHNyY1JlY3QsCisgICAgICAgIGludDMyX3QgZGVzdFN0YXJ0WCwgaW50MzJfdCBkZXN0U3RhcnRZLAorICAgICAgICBjb25zdCBZVVZJbWFnZSAmc3JjSW1hZ2UpIHsKKworICAgIC8vIFRyeSBmYXN0IGNvcHkgZmlyc3QKKyAgICBpZiAoWVVWSW1hZ2U6OmZhc3RDb3B5UmVjdGFuZ2xlKAorICAgICAgICAgICAgICAgIHNyY1JlY3QsCisgICAgICAgICAgICAgICAgZGVzdFN0YXJ0WCwgZGVzdFN0YXJ0WSwKKyAgICAgICAgICAgICAgICBzcmNJbWFnZSwgbVlVVkltYWdlKSkgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaW50MzJfdCBzcmNTdGFydFggPSBzcmNSZWN0LmxlZnQ7CisgICAgaW50MzJfdCBzcmNTdGFydFkgPSBzcmNSZWN0LnRvcDsKKyAgICBmb3IgKGludDMyX3Qgb2Zmc2V0WSA9IDA7IG9mZnNldFkgPCBzcmNSZWN0LmhlaWdodCgpOyArK29mZnNldFkpIHsKKyAgICAgICAgZm9yIChpbnQzMl90IG9mZnNldFggPSAwOyBvZmZzZXRYIDwgc3JjUmVjdC53aWR0aCgpOyArK29mZnNldFgpIHsKKyAgICAgICAgICAgIGludDMyX3Qgc3JjWCA9IHNyY1N0YXJ0WCArIG9mZnNldFg7CisgICAgICAgICAgICBpbnQzMl90IHNyY1kgPSBzcmNTdGFydFkgKyBvZmZzZXRZOworCisgICAgICAgICAgICBpbnQzMl90IGRlc3RYID0gZGVzdFN0YXJ0WCArIG9mZnNldFg7CisgICAgICAgICAgICBpbnQzMl90IGRlc3RZID0gZGVzdFN0YXJ0WSArIG9mZnNldFk7CisKKyAgICAgICAgICAgIHVpbnQ4X3QgeVZhbHVlOworICAgICAgICAgICAgdWludDhfdCB1VmFsdWU7CisgICAgICAgICAgICB1aW50OF90IHZWYWx1ZTsKKworICAgICAgICAgICAgc3JjSW1hZ2UuZ2V0UGl4ZWxWYWx1ZShzcmNYLCBzcmNZLCAmeVZhbHVlLCAmdVZhbHVlLCAmdlZhbHVlKTsKKyAgICAgICAgICAgIG1ZVVZJbWFnZS5zZXRQaXhlbFZhbHVlKGRlc3RYLCBkZXN0WSwgeVZhbHVlLCB1VmFsdWUsIHZWYWx1ZSk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQgWVVWQ2FudmFzOjpkb3duc2FtcGxlKAorICAgICAgICBpbnQzMl90IHNyY09mZnNldFgsIGludDMyX3Qgc3JjT2Zmc2V0WSwKKyAgICAgICAgaW50MzJfdCBza2lwWCwgaW50MzJfdCBza2lwWSwKKyAgICAgICAgY29uc3QgWVVWSW1hZ2UgJnNyY0ltYWdlKSB7CisgICAgLy8gVE9ETzogQWRkIGEgbG93IHBhc3MgZmlsdGVyIGZvciBkb3duc2FtcGxpbmcuCisKKyAgICAvLyBDaGVjayB0aGF0IHNyY0ltYWdlIGlzIGJpZyBlbm91Z2ggdG8gZmlsbCBtWVVWSW1hZ2UuCisgICAgQ0hFQ0soKHNyY09mZnNldFggKyAobVlVVkltYWdlLndpZHRoKCkgLSAxKSAqIHNraXBYKSA8IHNyY0ltYWdlLndpZHRoKCkpOworICAgIENIRUNLKChzcmNPZmZzZXRZICsgKG1ZVVZJbWFnZS5oZWlnaHQoKSAtIDEpICogc2tpcFkpIDwgc3JjSW1hZ2UuaGVpZ2h0KCkpOworCisgICAgdWludDhfdCB5VmFsdWU7CisgICAgdWludDhfdCB1VmFsdWU7CisgICAgdWludDhfdCB2VmFsdWU7CisKKyAgICBpbnQzMl90IHNyY1kgPSBzcmNPZmZzZXRZOworICAgIGZvciAoaW50MzJfdCB5ID0gMDsgeSA8IG1ZVVZJbWFnZS5oZWlnaHQoKTsgKyt5KSB7CisgICAgICAgIGludDMyX3Qgc3JjWCA9IHNyY09mZnNldFg7CisgICAgICAgIGZvciAoaW50MzJfdCB4ID0gMDsgeCA8IG1ZVVZJbWFnZS53aWR0aCgpOyArK3gpIHsKKyAgICAgICAgICAgIHNyY0ltYWdlLmdldFBpeGVsVmFsdWUoc3JjWCwgc3JjWSwgJnlWYWx1ZSwgJnVWYWx1ZSwgJnZWYWx1ZSk7CisgICAgICAgICAgICBtWVVWSW1hZ2Uuc2V0UGl4ZWxWYWx1ZSh4LCB5LCB5VmFsdWUsIHVWYWx1ZSwgdlZhbHVlKTsKKworICAgICAgICAgICAgc3JjWCArPSBza2lwWDsKKyAgICAgICAgfQorICAgICAgICBzcmNZICs9IHNraXBZOworICAgIH0KK30KKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3l1di9ZVVZJbWFnZS5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC95dXYvWVVWSW1hZ2UuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI3MTIwNjIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC95dXYvWVVWSW1hZ2UuY3BwCkBAIC0wLDAgKzEsNDEzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiWVVWSW1hZ2UiCisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9ZVVZJbWFnZS5oPgorI2luY2x1ZGUgPHVpL1JlY3QuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlYnVnLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworWVVWSW1hZ2U6OllVVkltYWdlKFlVVkZvcm1hdCB5dXZGb3JtYXQsIGludDMyX3Qgd2lkdGgsIGludDMyX3QgaGVpZ2h0KSB7CisgICAgbVlVVkZvcm1hdCA9IHl1dkZvcm1hdDsKKyAgICBtV2lkdGggPSB3aWR0aDsKKyAgICBtSGVpZ2h0ID0gaGVpZ2h0OworCisgICAgc2l6ZV90IG51bWJlck9mQnl0ZXMgPSBidWZmZXJTaXplKHl1dkZvcm1hdCwgd2lkdGgsIGhlaWdodCk7CisgICAgdWludDhfdCAqYnVmZmVyID0gbmV3IHVpbnQ4X3RbbnVtYmVyT2ZCeXRlc107CisgICAgbUJ1ZmZlciA9IGJ1ZmZlcjsKKyAgICBtT3duQnVmZmVyID0gdHJ1ZTsKKworICAgIGluaXRpYWxpemVZVVZQb2ludGVycygpOworfQorCitZVVZJbWFnZTo6WVVWSW1hZ2UoWVVWRm9ybWF0IHl1dkZvcm1hdCwgaW50MzJfdCB3aWR0aCwgaW50MzJfdCBoZWlnaHQsIHVpbnQ4X3QgKmJ1ZmZlcikgeworICAgIG1ZVVZGb3JtYXQgPSB5dXZGb3JtYXQ7CisgICAgbVdpZHRoID0gd2lkdGg7CisgICAgbUhlaWdodCA9IGhlaWdodDsKKyAgICBtQnVmZmVyID0gYnVmZmVyOworICAgIG1Pd25CdWZmZXIgPSBmYWxzZTsKKworICAgIGluaXRpYWxpemVZVVZQb2ludGVycygpOworfQorCisvL3N0YXRpYworc2l6ZV90IFlVVkltYWdlOjpidWZmZXJTaXplKFlVVkZvcm1hdCB5dXZGb3JtYXQsIGludDMyX3Qgd2lkdGgsIGludDMyX3QgaGVpZ2h0KSB7CisgICAgaW50MzJfdCBudW1iZXJPZlBpeGVscyA9IHdpZHRoKmhlaWdodDsKKyAgICBzaXplX3QgbnVtYmVyT2ZCeXRlcyA9IDA7CisgICAgaWYgKHl1dkZvcm1hdCA9PSBZVVY0MjBQbGFuYXIgfHwgeXV2Rm9ybWF0ID09IFlVVjQyMFNlbWlQbGFuYXIpIHsKKyAgICAgICAgLy8gWSB0YWtlcyBudW1iZXJPZlBpeGVscyBieXRlcyBhbmQgVS9WIHRha2UgbnVtYmVyT2ZQaXhlbHMvNCBieXRlcyBlYWNoLgorICAgICAgICBudW1iZXJPZkJ5dGVzID0gKHNpemVfdCkobnVtYmVyT2ZQaXhlbHMgKyAobnVtYmVyT2ZQaXhlbHMgPj4gMSkpOworICAgIH0gZWxzZSB7CisgICAgICAgIExPR0UoIkZvcm1hdCBub3Qgc3VwcG9ydGVkIik7CisgICAgfQorICAgIHJldHVybiBudW1iZXJPZkJ5dGVzOworfQorCitib29sIFlVVkltYWdlOjppbml0aWFsaXplWVVWUG9pbnRlcnMoKSB7CisgICAgaW50MzJfdCBudW1iZXJPZlBpeGVscyA9IG1XaWR0aCAqIG1IZWlnaHQ7CisKKyAgICBpZiAobVlVVkZvcm1hdCA9PSBZVVY0MjBQbGFuYXIpIHsKKyAgICAgICAgbVlkYXRhID0gKHVpbnQ4X3QgKiltQnVmZmVyOworICAgICAgICBtVWRhdGEgPSBtWWRhdGEgKyBudW1iZXJPZlBpeGVsczsKKyAgICAgICAgbVZkYXRhID0gbVVkYXRhICsgKG51bWJlck9mUGl4ZWxzID4+IDIpOworICAgIH0gZWxzZSBpZiAobVlVVkZvcm1hdCA9PSBZVVY0MjBTZW1pUGxhbmFyKSB7CisgICAgICAgIC8vIFUgYW5kIFYgY2hhbm5lbHMgYXJlIGludGVybGVhdmVkIGFzIFZVVlVWVS4KKyAgICAgICAgLy8gU28gViBkYXRhIHN0YXJ0cyBhdCB0aGUgZW5kIG9mIFkgY2hhbm5lbCBhbmQKKyAgICAgICAgLy8gVSBkYXRhIHN0YXJ0cyByaWdodCBhZnRlciBWJ3Mgc3RhcnQuCisgICAgICAgIG1ZZGF0YSA9ICh1aW50OF90ICopbUJ1ZmZlcjsKKyAgICAgICAgbVZkYXRhID0gbVlkYXRhICsgbnVtYmVyT2ZQaXhlbHM7CisgICAgICAgIG1VZGF0YSA9IG1WZGF0YSArIDE7CisgICAgfSBlbHNlIHsKKyAgICAgICAgTE9HRSgiRm9ybWF0IG5vdCBzdXBwb3J0ZWQiKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKK30KKworWVVWSW1hZ2U6On5ZVVZJbWFnZSgpIHsKKyAgICBpZiAobU93bkJ1ZmZlcikgZGVsZXRlW10gbUJ1ZmZlcjsKK30KKworYm9vbCBZVVZJbWFnZTo6Z2V0T2Zmc2V0cyhpbnQzMl90IHgsIGludDMyX3QgeSwKKyAgICAgICAgaW50MzJfdCAqeU9mZnNldCwgaW50MzJfdCAqdU9mZnNldCwgaW50MzJfdCAqdk9mZnNldCkgY29uc3QgeworICAgICp5T2Zmc2V0ID0geSptV2lkdGggKyB4OworCisgICAgaW50MzJfdCB1dk9mZnNldCA9ICh5ID4+IDEpICogKG1XaWR0aCA+PiAxKSArICh4ID4+IDEpOworICAgIGlmIChtWVVWRm9ybWF0ID09IFlVVjQyMFBsYW5hcikgeworICAgICAgICAqdU9mZnNldCA9IHV2T2Zmc2V0OworICAgICAgICAqdk9mZnNldCA9IHV2T2Zmc2V0OworICAgIH0gZWxzZSBpZiAobVlVVkZvcm1hdCA9PSBZVVY0MjBTZW1pUGxhbmFyKSB7CisgICAgICAgIC8vIFNpbmNlIFUgYW5kIFYgY2hhbm5lbHMgYXJlIGludGVybGVhdmVkLCBvZmZzZXRzIG5lZWQKKyAgICAgICAgLy8gdG8gYmUgZG91YmxlZC4KKyAgICAgICAgKnVPZmZzZXQgPSAyKnV2T2Zmc2V0OworICAgICAgICAqdk9mZnNldCA9IDIqdXZPZmZzZXQ7CisgICAgfSBlbHNlIHsKKyAgICAgICAgTE9HRSgiRm9ybWF0IG5vdCBzdXBwb3J0ZWQiKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHJldHVybiB0cnVlOworfQorCitib29sIFlVVkltYWdlOjpnZXRPZmZzZXRJbmNyZW1lbnRzUGVyRGF0YVJvdygKKyAgICAgICAgaW50MzJfdCAqeURhdGFPZmZzZXRJbmNyZW1lbnQsCisgICAgICAgIGludDMyX3QgKnVEYXRhT2Zmc2V0SW5jcmVtZW50LAorICAgICAgICBpbnQzMl90ICp2RGF0YU9mZnNldEluY3JlbWVudCkgY29uc3QgeworICAgICp5RGF0YU9mZnNldEluY3JlbWVudCA9IG1XaWR0aDsKKworICAgIGludDMyX3QgdXZEYXRhT2Zmc2V0SW5jcmVtZW50ID0gbVdpZHRoID4+IDE7CisKKyAgICBpZiAobVlVVkZvcm1hdCA9PSBZVVY0MjBQbGFuYXIpIHsKKyAgICAgICAgKnVEYXRhT2Zmc2V0SW5jcmVtZW50ID0gdXZEYXRhT2Zmc2V0SW5jcmVtZW50OworICAgICAgICAqdkRhdGFPZmZzZXRJbmNyZW1lbnQgPSB1dkRhdGFPZmZzZXRJbmNyZW1lbnQ7CisgICAgfSBlbHNlIGlmIChtWVVWRm9ybWF0ID09IFlVVjQyMFNlbWlQbGFuYXIpIHsKKyAgICAgICAgLy8gU2luY2UgVSBhbmQgViBjaGFubmVscyBhcmUgaW50ZXJsZWF2ZWQsIG9mZnNldHMgbmVlZAorICAgICAgICAvLyB0byBiZSBkb3VibGVkLgorICAgICAgICAqdURhdGFPZmZzZXRJbmNyZW1lbnQgPSAyKnV2RGF0YU9mZnNldEluY3JlbWVudDsKKyAgICAgICAgKnZEYXRhT2Zmc2V0SW5jcmVtZW50ID0gMip1dkRhdGFPZmZzZXRJbmNyZW1lbnQ7CisgICAgfSBlbHNlIHsKKyAgICAgICAgTE9HRSgiRm9ybWF0IG5vdCBzdXBwb3J0ZWQiKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHJldHVybiB0cnVlOworfQorCit1aW50OF90KiBZVVZJbWFnZTo6Z2V0WUFkZHJlc3MoaW50MzJfdCBvZmZzZXQpIGNvbnN0IHsKKyAgICByZXR1cm4gbVlkYXRhICsgb2Zmc2V0OworfQorCit1aW50OF90KiBZVVZJbWFnZTo6Z2V0VUFkZHJlc3MoaW50MzJfdCBvZmZzZXQpIGNvbnN0IHsKKyAgICByZXR1cm4gbVVkYXRhICsgb2Zmc2V0OworfQorCit1aW50OF90KiBZVVZJbWFnZTo6Z2V0VkFkZHJlc3MoaW50MzJfdCBvZmZzZXQpIGNvbnN0IHsKKyAgICByZXR1cm4gbVZkYXRhICsgb2Zmc2V0OworfQorCitib29sIFlVVkltYWdlOjpnZXRZVVZBZGRyZXNzZXMoaW50MzJfdCB4LCBpbnQzMl90IHksCisgICAgICAgIHVpbnQ4X3QgKip5QWRkciwgdWludDhfdCAqKnVBZGRyLCB1aW50OF90ICoqdkFkZHIpIGNvbnN0IHsKKyAgICBpbnQzMl90IHlPZmZzZXQ7CisgICAgaW50MzJfdCB1T2Zmc2V0OworICAgIGludDMyX3Qgdk9mZnNldDsKKyAgICBpZiAoIWdldE9mZnNldHMoeCwgeSwgJnlPZmZzZXQsICZ1T2Zmc2V0LCAmdk9mZnNldCkpIHJldHVybiBmYWxzZTsKKworICAgICp5QWRkciA9IGdldFlBZGRyZXNzKHlPZmZzZXQpOworICAgICp1QWRkciA9IGdldFVBZGRyZXNzKHVPZmZzZXQpOworICAgICp2QWRkciA9IGdldFZBZGRyZXNzKHZPZmZzZXQpOworCisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgWVVWSW1hZ2U6OnZhbGlkUGl4ZWwoaW50MzJfdCB4LCBpbnQzMl90IHkpIGNvbnN0IHsKKyAgICByZXR1cm4gKHggPj0gMCAmJiB4IDwgbVdpZHRoICYmCisgICAgICAgICAgICB5ID49IDAgJiYgeSA8IG1IZWlnaHQpOworfQorCitib29sIFlVVkltYWdlOjpnZXRQaXhlbFZhbHVlKGludDMyX3QgeCwgaW50MzJfdCB5LAorICAgICAgICB1aW50OF90ICp5UHRyLCB1aW50OF90ICp1UHRyLCB1aW50OF90ICp2UHRyKSBjb25zdCB7CisgICAgQ0hFQ0sodmFsaWRQaXhlbCh4LCB5KSk7CisKKyAgICB1aW50OF90ICp5QWRkcjsKKyAgICB1aW50OF90ICp1QWRkcjsKKyAgICB1aW50OF90ICp2QWRkcjsKKyAgICBpZiAoIWdldFlVVkFkZHJlc3Nlcyh4LCB5LCAmeUFkZHIsICZ1QWRkciwgJnZBZGRyKSkgcmV0dXJuIGZhbHNlOworCisgICAgKnlQdHIgPSAqeUFkZHI7CisgICAgKnVQdHIgPSAqdUFkZHI7CisgICAgKnZQdHIgPSAqdkFkZHI7CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBZVVZJbWFnZTo6c2V0UGl4ZWxWYWx1ZShpbnQzMl90IHgsIGludDMyX3QgeSwKKyAgICAgICAgdWludDhfdCB5VmFsdWUsIHVpbnQ4X3QgdVZhbHVlLCB1aW50OF90IHZWYWx1ZSkgeworICAgIENIRUNLKHZhbGlkUGl4ZWwoeCwgeSkpOworCisgICAgdWludDhfdCAqeUFkZHI7CisgICAgdWludDhfdCAqdUFkZHI7CisgICAgdWludDhfdCAqdkFkZHI7CisgICAgaWYgKCFnZXRZVVZBZGRyZXNzZXMoeCwgeSwgJnlBZGRyLCAmdUFkZHIsICZ2QWRkcikpIHJldHVybiBmYWxzZTsKKworICAgICp5QWRkciA9IHlWYWx1ZTsKKyAgICAqdUFkZHIgPSB1VmFsdWU7CisgICAgKnZBZGRyID0gdlZhbHVlOworCisgICAgcmV0dXJuIHRydWU7Cit9CisKK3ZvaWQgWVVWSW1hZ2U6OmZhc3RDb3B5UmVjdGFuZ2xlNDIwUGxhbmFyKAorICAgICAgICBjb25zdCBSZWN0JiBzcmNSZWN0LAorICAgICAgICBpbnQzMl90IGRlc3RTdGFydFgsIGludDMyX3QgZGVzdFN0YXJ0WSwKKyAgICAgICAgY29uc3QgWVVWSW1hZ2UgJnNyY0ltYWdlLCBZVVZJbWFnZSAmZGVzdEltYWdlKSB7CisgICAgQ0hFQ0soc3JjSW1hZ2UubVlVVkZvcm1hdCA9PSBZVVY0MjBQbGFuYXIpOworICAgIENIRUNLKGRlc3RJbWFnZS5tWVVWRm9ybWF0ID09IFlVVjQyMFBsYW5hcik7CisKKyAgICBpbnQzMl90IHNyY1N0YXJ0WCA9IHNyY1JlY3QubGVmdDsKKyAgICBpbnQzMl90IHNyY1N0YXJ0WSA9IHNyY1JlY3QudG9wOworICAgIGludDMyX3Qgd2lkdGggPSBzcmNSZWN0LndpZHRoKCk7CisgICAgaW50MzJfdCBoZWlnaHQgPSBzcmNSZWN0LmhlaWdodCgpOworCisgICAgLy8gR2V0IHNvdXJjZSBhbmQgZGVzdGluYXRpb24gc3RhcnQgYWRkcmVzc2VzCisgICAgdWludDhfdCAqeVNyY0FkZHJCYXNlOworICAgIHVpbnQ4X3QgKnVTcmNBZGRyQmFzZTsKKyAgICB1aW50OF90ICp2U3JjQWRkckJhc2U7CisgICAgc3JjSW1hZ2UuZ2V0WVVWQWRkcmVzc2VzKHNyY1N0YXJ0WCwgc3JjU3RhcnRZLAorICAgICAgICAgICAgJnlTcmNBZGRyQmFzZSwgJnVTcmNBZGRyQmFzZSwgJnZTcmNBZGRyQmFzZSk7CisKKyAgICB1aW50OF90ICp5RGVzdEFkZHJCYXNlOworICAgIHVpbnQ4X3QgKnVEZXN0QWRkckJhc2U7CisgICAgdWludDhfdCAqdkRlc3RBZGRyQmFzZTsKKyAgICBkZXN0SW1hZ2UuZ2V0WVVWQWRkcmVzc2VzKGRlc3RTdGFydFgsIGRlc3RTdGFydFksCisgICAgICAgICAgICAmeURlc3RBZGRyQmFzZSwgJnVEZXN0QWRkckJhc2UsICZ2RGVzdEFkZHJCYXNlKTsKKworICAgIC8vIEdldCBzb3VyY2UgYW5kIGRlc3RpbmF0aW9uIG9mZnNldCBpbmNyZW1lbnRzIGluY3VycmVkIGluIGdvaW5nCisgICAgLy8gZnJvbSBvbmUgZGF0YSByb3cgdG8gbmV4dC4KKyAgICBpbnQzMl90IHlTcmNPZmZzZXRJbmNyZW1lbnQ7CisgICAgaW50MzJfdCB1U3JjT2Zmc2V0SW5jcmVtZW50OworICAgIGludDMyX3QgdlNyY09mZnNldEluY3JlbWVudDsKKyAgICBzcmNJbWFnZS5nZXRPZmZzZXRJbmNyZW1lbnRzUGVyRGF0YVJvdygKKyAgICAgICAgICAgICZ5U3JjT2Zmc2V0SW5jcmVtZW50LCAmdVNyY09mZnNldEluY3JlbWVudCwgJnZTcmNPZmZzZXRJbmNyZW1lbnQpOworCisgICAgaW50MzJfdCB5RGVzdE9mZnNldEluY3JlbWVudDsKKyAgICBpbnQzMl90IHVEZXN0T2Zmc2V0SW5jcmVtZW50OworICAgIGludDMyX3QgdkRlc3RPZmZzZXRJbmNyZW1lbnQ7CisgICAgZGVzdEltYWdlLmdldE9mZnNldEluY3JlbWVudHNQZXJEYXRhUm93KAorICAgICAgICAgICAgJnlEZXN0T2Zmc2V0SW5jcmVtZW50LCAmdURlc3RPZmZzZXRJbmNyZW1lbnQsICZ2RGVzdE9mZnNldEluY3JlbWVudCk7CisKKyAgICAvLyBDb3B5IFkKKyAgICB7CisgICAgICAgIHNpemVfdCBudW1iZXJPZllCeXRlc1BlclJvdyA9IChzaXplX3QpIHdpZHRoOworICAgICAgICB1aW50OF90ICp5U3JjQWRkciA9IHlTcmNBZGRyQmFzZTsKKyAgICAgICAgdWludDhfdCAqeURlc3RBZGRyID0geURlc3RBZGRyQmFzZTsKKyAgICAgICAgZm9yIChpbnQzMl90IG9mZnNldFkgPSAwOyBvZmZzZXRZIDwgaGVpZ2h0OyArK29mZnNldFkpIHsKKyAgICAgICAgICAgIG1lbWNweSh5RGVzdEFkZHIsIHlTcmNBZGRyLCBudW1iZXJPZllCeXRlc1BlclJvdyk7CisKKyAgICAgICAgICAgIHlTcmNBZGRyICs9IHlTcmNPZmZzZXRJbmNyZW1lbnQ7CisgICAgICAgICAgICB5RGVzdEFkZHIgKz0geURlc3RPZmZzZXRJbmNyZW1lbnQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBDb3B5IFUKKyAgICB7CisgICAgICAgIHNpemVfdCBudW1iZXJPZlVCeXRlc1BlclJvdyA9IChzaXplX3QpICh3aWR0aCA+PiAxKTsKKyAgICAgICAgdWludDhfdCAqdVNyY0FkZHIgPSB1U3JjQWRkckJhc2U7CisgICAgICAgIHVpbnQ4X3QgKnVEZXN0QWRkciA9IHVEZXN0QWRkckJhc2U7CisgICAgICAgIC8vIEV2ZXJ5IG90aGVyIHJvdyBoYXMgYW4gZW50cnkgZm9yIFUvViBjaGFubmVsIHZhbHVlcy4gSGVuY2Ugb25seQorICAgICAgICAvLyBnbyBoYWxmIHRoZSBoZWlnaHQuCisgICAgICAgIGZvciAoaW50MzJfdCBvZmZzZXRZID0gMDsgb2Zmc2V0WSA8IChoZWlnaHQgPj4gMSk7ICsrb2Zmc2V0WSkgeworICAgICAgICAgICAgbWVtY3B5KHVEZXN0QWRkciwgdVNyY0FkZHIsIG51bWJlck9mVUJ5dGVzUGVyUm93KTsKKworICAgICAgICAgICAgdVNyY0FkZHIgKz0gdVNyY09mZnNldEluY3JlbWVudDsKKyAgICAgICAgICAgIHVEZXN0QWRkciArPSB1RGVzdE9mZnNldEluY3JlbWVudDsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIENvcHkgVgorICAgIHsKKyAgICAgICAgc2l6ZV90IG51bWJlck9mVkJ5dGVzUGVyUm93ID0gKHNpemVfdCkgKHdpZHRoID4+IDEpOworICAgICAgICB1aW50OF90ICp2U3JjQWRkciA9IHZTcmNBZGRyQmFzZTsKKyAgICAgICAgdWludDhfdCAqdkRlc3RBZGRyID0gdkRlc3RBZGRyQmFzZTsKKyAgICAgICAgLy8gRXZlcnkgb3RoZXIgcGl4ZWwgcm93IGhhcyBhIFUvViBkYXRhIHJvdy4gSGVuY2Ugb25seSBnbyBoYWxmIHRoZSBoZWlnaHQuCisgICAgICAgIGZvciAoaW50MzJfdCBvZmZzZXRZID0gMDsgb2Zmc2V0WSA8IChoZWlnaHQgPj4gMSk7ICsrb2Zmc2V0WSkgeworICAgICAgICAgICAgbWVtY3B5KHZEZXN0QWRkciwgdlNyY0FkZHIsIG51bWJlck9mVkJ5dGVzUGVyUm93KTsKKworICAgICAgICAgICAgdlNyY0FkZHIgKz0gdlNyY09mZnNldEluY3JlbWVudDsKKyAgICAgICAgICAgIHZEZXN0QWRkciArPSB2RGVzdE9mZnNldEluY3JlbWVudDsKKyAgICAgICAgfQorICAgIH0KK30KKwordm9pZCBZVVZJbWFnZTo6ZmFzdENvcHlSZWN0YW5nbGU0MjBTZW1pUGxhbmFyKAorICAgICAgICBjb25zdCBSZWN0JiBzcmNSZWN0LAorICAgICAgICBpbnQzMl90IGRlc3RTdGFydFgsIGludDMyX3QgZGVzdFN0YXJ0WSwKKyAgICAgICAgY29uc3QgWVVWSW1hZ2UgJnNyY0ltYWdlLCBZVVZJbWFnZSAmZGVzdEltYWdlKSB7CisgICAgQ0hFQ0soc3JjSW1hZ2UubVlVVkZvcm1hdCA9PSBZVVY0MjBTZW1pUGxhbmFyKTsKKyAgICBDSEVDSyhkZXN0SW1hZ2UubVlVVkZvcm1hdCA9PSBZVVY0MjBTZW1pUGxhbmFyKTsKKworICAgIGludDMyX3Qgc3JjU3RhcnRYID0gc3JjUmVjdC5sZWZ0OworICAgIGludDMyX3Qgc3JjU3RhcnRZID0gc3JjUmVjdC50b3A7CisgICAgaW50MzJfdCB3aWR0aCA9IHNyY1JlY3Qud2lkdGgoKTsKKyAgICBpbnQzMl90IGhlaWdodCA9IHNyY1JlY3QuaGVpZ2h0KCk7CisKKyAgICAvLyBHZXQgc291cmNlIGFuZCBkZXN0aW5hdGlvbiBzdGFydCBhZGRyZXNzZXMKKyAgICB1aW50OF90ICp5U3JjQWRkckJhc2U7CisgICAgdWludDhfdCAqdVNyY0FkZHJCYXNlOworICAgIHVpbnQ4X3QgKnZTcmNBZGRyQmFzZTsKKyAgICBzcmNJbWFnZS5nZXRZVVZBZGRyZXNzZXMoc3JjU3RhcnRYLCBzcmNTdGFydFksCisgICAgICAgICAgICAmeVNyY0FkZHJCYXNlLCAmdVNyY0FkZHJCYXNlLCAmdlNyY0FkZHJCYXNlKTsKKworICAgIHVpbnQ4X3QgKnlEZXN0QWRkckJhc2U7CisgICAgdWludDhfdCAqdURlc3RBZGRyQmFzZTsKKyAgICB1aW50OF90ICp2RGVzdEFkZHJCYXNlOworICAgIGRlc3RJbWFnZS5nZXRZVVZBZGRyZXNzZXMoZGVzdFN0YXJ0WCwgZGVzdFN0YXJ0WSwKKyAgICAgICAgICAgICZ5RGVzdEFkZHJCYXNlLCAmdURlc3RBZGRyQmFzZSwgJnZEZXN0QWRkckJhc2UpOworCisgICAgLy8gR2V0IHNvdXJjZSBhbmQgZGVzdGluYXRpb24gb2Zmc2V0IGluY3JlbWVudHMgaW5jdXJyZWQgaW4gZ29pbmcKKyAgICAvLyBmcm9tIG9uZSBkYXRhIHJvdyB0byBuZXh0LgorICAgIGludDMyX3QgeVNyY09mZnNldEluY3JlbWVudDsKKyAgICBpbnQzMl90IHVTcmNPZmZzZXRJbmNyZW1lbnQ7CisgICAgaW50MzJfdCB2U3JjT2Zmc2V0SW5jcmVtZW50OworICAgIHNyY0ltYWdlLmdldE9mZnNldEluY3JlbWVudHNQZXJEYXRhUm93KAorICAgICAgICAgICAgJnlTcmNPZmZzZXRJbmNyZW1lbnQsICZ1U3JjT2Zmc2V0SW5jcmVtZW50LCAmdlNyY09mZnNldEluY3JlbWVudCk7CisKKyAgICBpbnQzMl90IHlEZXN0T2Zmc2V0SW5jcmVtZW50OworICAgIGludDMyX3QgdURlc3RPZmZzZXRJbmNyZW1lbnQ7CisgICAgaW50MzJfdCB2RGVzdE9mZnNldEluY3JlbWVudDsKKyAgICBkZXN0SW1hZ2UuZ2V0T2Zmc2V0SW5jcmVtZW50c1BlckRhdGFSb3coCisgICAgICAgICAgICAmeURlc3RPZmZzZXRJbmNyZW1lbnQsICZ1RGVzdE9mZnNldEluY3JlbWVudCwgJnZEZXN0T2Zmc2V0SW5jcmVtZW50KTsKKworICAgIC8vIENvcHkgWQorICAgIHsKKyAgICAgICAgc2l6ZV90IG51bWJlck9mWUJ5dGVzUGVyUm93ID0gKHNpemVfdCkgd2lkdGg7CisgICAgICAgIHVpbnQ4X3QgKnlTcmNBZGRyID0geVNyY0FkZHJCYXNlOworICAgICAgICB1aW50OF90ICp5RGVzdEFkZHIgPSB5RGVzdEFkZHJCYXNlOworICAgICAgICBmb3IgKGludDMyX3Qgb2Zmc2V0WSA9IDA7IG9mZnNldFkgPCBoZWlnaHQ7ICsrb2Zmc2V0WSkgeworICAgICAgICAgICAgbWVtY3B5KHlEZXN0QWRkciwgeVNyY0FkZHIsIG51bWJlck9mWUJ5dGVzUGVyUm93KTsKKworICAgICAgICAgICAgeVNyY0FkZHIgPSB5U3JjQWRkciArIHlTcmNPZmZzZXRJbmNyZW1lbnQ7CisgICAgICAgICAgICB5RGVzdEFkZHIgPSB5RGVzdEFkZHIgKyB5RGVzdE9mZnNldEluY3JlbWVudDsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIENvcHkgVVYKKyAgICB7CisgICAgICAgIC8vIFVWIGFyZSBpbnRlcmxlYXZlZC4gU28gbnVtYmVyIG9mIFVWIGJ5dGVzIHBlciByb3cgaXMgMiood2lkdGgvMikuCisgICAgICAgIHNpemVfdCBudW1iZXJPZlVWQnl0ZXNQZXJSb3cgPSAoc2l6ZV90KSB3aWR0aDsKKyAgICAgICAgdWludDhfdCAqdlNyY0FkZHIgPSB2U3JjQWRkckJhc2U7CisgICAgICAgIHVpbnQ4X3QgKnZEZXN0QWRkciA9IHZEZXN0QWRkckJhc2U7CisgICAgICAgIC8vIEV2ZXJ5IG90aGVyIHBpeGVsIHJvdyBoYXMgYSBVL1YgZGF0YSByb3cuIEhlbmNlIG9ubHkgZ28gaGFsZiB0aGUgaGVpZ2h0LgorICAgICAgICBmb3IgKGludDMyX3Qgb2Zmc2V0WSA9IDA7IG9mZnNldFkgPCAoaGVpZ2h0ID4+IDEpOyArK29mZnNldFkpIHsKKyAgICAgICAgICAgIG1lbWNweSh2RGVzdEFkZHIsIHZTcmNBZGRyLCBudW1iZXJPZlVWQnl0ZXNQZXJSb3cpOworCisgICAgICAgICAgICB2U3JjQWRkciArPSB2U3JjT2Zmc2V0SW5jcmVtZW50OworICAgICAgICAgICAgdkRlc3RBZGRyICs9IHZEZXN0T2Zmc2V0SW5jcmVtZW50OworICAgICAgICB9CisgICAgfQorfQorCisvLyBzdGF0aWMKK2Jvb2wgWVVWSW1hZ2U6OmZhc3RDb3B5UmVjdGFuZ2xlKAorICAgICAgICBjb25zdCBSZWN0JiBzcmNSZWN0LAorICAgICAgICBpbnQzMl90IGRlc3RTdGFydFgsIGludDMyX3QgZGVzdFN0YXJ0WSwKKyAgICAgICAgY29uc3QgWVVWSW1hZ2UgJnNyY0ltYWdlLCBZVVZJbWFnZSAmZGVzdEltYWdlKSB7CisgICAgaWYgKHNyY0ltYWdlLm1ZVVZGb3JtYXQgPT0gZGVzdEltYWdlLm1ZVVZGb3JtYXQpIHsKKyAgICAgICAgaWYgKHNyY0ltYWdlLm1ZVVZGb3JtYXQgPT0gWVVWNDIwUGxhbmFyKSB7CisgICAgICAgICAgICBmYXN0Q29weVJlY3RhbmdsZTQyMFBsYW5hcigKKyAgICAgICAgICAgICAgICAgICAgc3JjUmVjdCwKKyAgICAgICAgICAgICAgICAgICAgZGVzdFN0YXJ0WCwgZGVzdFN0YXJ0WSwKKyAgICAgICAgICAgICAgICAgICAgc3JjSW1hZ2UsIGRlc3RJbWFnZSk7CisgICAgICAgIH0gZWxzZSBpZiAoc3JjSW1hZ2UubVlVVkZvcm1hdCA9PSBZVVY0MjBTZW1pUGxhbmFyKSB7CisgICAgICAgICAgICBmYXN0Q29weVJlY3RhbmdsZTQyMFNlbWlQbGFuYXIoCisgICAgICAgICAgICAgICAgICAgIHNyY1JlY3QsCisgICAgICAgICAgICAgICAgICAgIGRlc3RTdGFydFgsIGRlc3RTdGFydFksCisgICAgICAgICAgICAgICAgICAgIHNyY0ltYWdlLCBkZXN0SW1hZ2UpOworICAgICAgICB9CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK3VpbnQ4X3QgY2xhbXAodWludDhfdCB2LCB1aW50OF90IG1pblZhbHVlLCB1aW50OF90IG1heFZhbHVlKSB7CisgICAgQ0hFQ0sobWF4VmFsdWUgPj0gbWluVmFsdWUpOworCisgICAgaWYgKHYgPCBtaW5WYWx1ZSkgcmV0dXJuIG1pblZhbHVlOworICAgIGVsc2UgaWYgKHYgPiBtYXhWYWx1ZSkgcmV0dXJuIG1heFZhbHVlOworICAgIGVsc2UgcmV0dXJuIHY7Cit9CisKK3ZvaWQgWVVWSW1hZ2U6Onl1djJyZ2IodWludDhfdCB5VmFsdWUsIHVpbnQ4X3QgdVZhbHVlLCB1aW50OF90IHZWYWx1ZSwKKyAgICAgICAgdWludDhfdCAqciwgdWludDhfdCAqZywgdWludDhfdCAqYikgY29uc3QgeworICAgICpyID0geVZhbHVlICsgKDEuMzcwNzA1ICogKHZWYWx1ZS0xMjgpKTsKKyAgICAqZyA9IHlWYWx1ZSAtICgwLjY5ODAwMSAqICh2VmFsdWUtMTI4KSkgLSAoMC4zMzc2MzMgKiAodVZhbHVlLTEyOCkpOworICAgICpiID0geVZhbHVlICsgKDEuNzMyNDQ2ICogKHVWYWx1ZS0xMjgpKTsKKworICAgICpyID0gY2xhbXAoKnIsIDAsIDI1NSk7CisgICAgKmcgPSBjbGFtcCgqZywgMCwgMjU1KTsKKyAgICAqYiA9IGNsYW1wKCpiLCAwLCAyNTUpOworfQorCitib29sIFlVVkltYWdlOjp3cml0ZVRvUFBNKGNvbnN0IGNoYXIgKmZpbGVuYW1lKSBjb25zdCB7CisgICAgRklMRSAqZnAgPSBmb3BlbihmaWxlbmFtZSwgInciKTsKKyAgICBpZiAoZnAgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGZwcmludGYoZnAsICJQM1xuIik7CisgICAgZnByaW50ZihmcCwgIiVkICVkXG4iLCBtV2lkdGgsIG1IZWlnaHQpOworICAgIGZwcmludGYoZnAsICIyNTVcbiIpOworICAgIGZvciAoaW50MzJfdCB5ID0gMDsgeSA8IG1IZWlnaHQ7ICsreSkgeworICAgICAgICBmb3IgKGludDMyX3QgeCA9IDA7IHggPCBtV2lkdGg7ICsreCkgeworICAgICAgICAgICAgdWludDhfdCB5VmFsdWU7CisgICAgICAgICAgICB1aW50OF90IHVWYWx1ZTsKKyAgICAgICAgICAgIHVpbnQ4X3QgdlZhbHVlOworICAgICAgICAgICAgZ2V0UGl4ZWxWYWx1ZSh4LCB5LCAmeVZhbHVlLCAmdVZhbHVlLCAmIHZWYWx1ZSk7CisKKyAgICAgICAgICAgIHVpbnQ4X3QgclZhbHVlOworICAgICAgICAgICAgdWludDhfdCBnVmFsdWU7CisgICAgICAgICAgICB1aW50OF90IGJWYWx1ZTsKKyAgICAgICAgICAgIHl1djJyZ2IoeVZhbHVlLCB1VmFsdWUsIHZWYWx1ZSwgJnJWYWx1ZSwgJmdWYWx1ZSwgJmJWYWx1ZSk7CisKKyAgICAgICAgICAgIGZwcmludGYoZnAsICIlZCAlZCAlZFxuIiwgKGludDMyX3QpclZhbHVlLCAoaW50MzJfdClnVmFsdWUsIChpbnQzMl90KWJWYWx1ZSk7CisgICAgICAgIH0KKyAgICB9CisgICAgZmNsb3NlKGZwKTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL210cC9BbmRyb2lkLm1rIGIvbWVkaWEvbXRwL0FuZHJvaWQubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzUwMmY2ZQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL210cC9BbmRyb2lkLm1rCkBAIC0wLDAgKzEsNzggQEAKKyMKKyMgQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKK0xPQ0FMX1BBVEg6PSAkKGNhbGwgbXktZGlyKQorCitpZm5lcSAoJChUQVJHRVRfU0lNVUxBVE9SKSx0cnVlKQorCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKKworTE9DQUxfU1JDX0ZJTEVTOj0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICBNdHBDbGllbnQuY3BwICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgIE10cEN1cnNvci5jcHAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgTXRwRGF0YVBhY2tldC5jcHAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICBNdHBEZWJ1Zy5jcHAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgIE10cERldmljZS5jcHAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgTXRwRXZlbnRQYWNrZXQuY3BwICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICBNdHBEZXZpY2VJbmZvLmNwcCAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgIE10cE9iamVjdEluZm8uY3BwICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgTXRwUGFja2V0LmNwcCAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICBNdHBQcm9wZXJ0eS5jcHAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgIE10cFJlcXVlc3RQYWNrZXQuY3BwICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgTXRwUmVzcG9uc2VQYWNrZXQuY3BwICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICBNdHBTZXJ2ZXIuY3BwICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgIE10cFN0b3JhZ2VJbmZvLmNwcCAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgTXRwU3RyaW5nQnVmZmVyLmNwcCAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICBNdHBTdG9yYWdlLmNwcCAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgIE10cFV0aWxzLmNwcCAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCitMT0NBTF9NT0RVTEU6PSBsaWJtdHAKKworTE9DQUxfQ0ZMQUdTIDo9IC1ETVRQX0RFVklDRSAtRE1UUF9IT1NUCisKK2luY2x1ZGUgJChCVUlMRF9TVEFUSUNfTElCUkFSWSkKKworZW5kaWYKKworaWZlcSAoJChIT1NUX09TKSxsaW51eCkKKworaW5jbHVkZSAkKENMRUFSX1ZBUlMpCisKK0xPQ0FMX1NSQ19GSUxFUzo9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgTXRwQ2xpZW50LmNwcCAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICBNdHBDdXJzb3IuY3BwICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgIE10cERhdGFQYWNrZXQuY3BwICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgTXRwRGVidWcuY3BwICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICBNdHBEZXZpY2UuY3BwICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgIE10cEV2ZW50UGFja2V0LmNwcCAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgTXRwRGV2aWNlSW5mby5jcHAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICBNdHBPYmplY3RJbmZvLmNwcCAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgIE10cFBhY2tldC5jcHAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgTXRwUHJvcGVydHkuY3BwICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICBNdHBSZXF1ZXN0UGFja2V0LmNwcCAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgIE10cFJlc3BvbnNlUGFja2V0LmNwcCAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgTXRwU3RvcmFnZUluZm8uY3BwICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICBNdHBTdHJpbmdCdWZmZXIuY3BwICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgIE10cFN0b3JhZ2UuY3BwICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgTXRwVXRpbHMuY3BwICAgICAgICAgICAgICAgICAgICAgICAgICBcCisKK0xPQ0FMX01PRFVMRTo9IGxpYm10cAorCitMT0NBTF9DRkxBR1MgOj0gLURNVFBfSE9TVAorCitpbmNsdWRlICQoQlVJTERfSE9TVF9TVEFUSUNfTElCUkFSWSkKKworZW5kaWYKZGlmZiAtLWdpdCBhL21lZGlhL210cC9NdHBDbGllbnQuY3BwIGIvbWVkaWEvbXRwL010cENsaWVudC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2ViNmE0MwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL210cC9NdHBDbGllbnQuY3BwCkBAIC0wLDAgKzEsMjYyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJNdHBDbGllbnQiCisKKyNpbmNsdWRlICJNdHBEZWJ1Zy5oIgorI2luY2x1ZGUgIk10cENsaWVudC5oIgorI2luY2x1ZGUgIk10cERldmljZS5oIgorCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvaW9jdGwuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKworI2luY2x1ZGUgPHVzYmhvc3QvdXNiaG9zdC5oPgorI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPiBLRVJORUxfVkVSU0lPTigyLCA2LCAyMCkKKyNpbmNsdWRlIDxsaW51eC91c2IvY2g5Lmg+CisjZWxzZQorI2luY2x1ZGUgPGxpbnV4L3VzYl9jaDkuaD4KKyNlbmRpZgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3N0YXRpYyBib29sIGlzTXRwRGV2aWNlKHVpbnQxNl90IHZlbmRvciwgdWludDE2X3QgcHJvZHVjdCkgeworICAgIC8vIFNhbmRpc2sgU2Fuc2EgRnV6ZQorICAgIGlmICh2ZW5kb3IgPT0gMHgwNzgxICYmIHByb2R1Y3QgPT0gMHg3NGMyKQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAvLyBTYW1zdW5nIFlQLVo1CisgICAgaWYgKHZlbmRvciA9PSAweDA0ZTggJiYgcHJvZHVjdCA9PSAweDUwM2MpCisgICAgICAgIHJldHVybiB0cnVlOworICAgIHJldHVybiBmYWxzZTsKK30KKworY2xhc3MgTXRwQ2xpZW50VGhyZWFkIDogcHVibGljIFRocmVhZCB7Citwcml2YXRlOgorICAgIE10cENsaWVudCogICBtQ2xpZW50OworCitwdWJsaWM6CisgICAgTXRwQ2xpZW50VGhyZWFkKE10cENsaWVudCogY2xpZW50KQorICAgICAgICA6IG1DbGllbnQoY2xpZW50KQorICAgIHsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGJvb2wgdGhyZWFkTG9vcCgpIHsKKyAgICAgICAgcmV0dXJuIG1DbGllbnQtPnRocmVhZExvb3AoKTsKKyAgICB9Cit9OworCisKK010cENsaWVudDo6TXRwQ2xpZW50KCkKKyAgICA6ICAgbVRocmVhZChOVUxMKSwKKyAgICAgICAgbVVzYkhvc3RDb250ZXh0KE5VTEwpLAorICAgICAgICBtRG9uZShmYWxzZSkKK3sKK30KKworTXRwQ2xpZW50Ojp+TXRwQ2xpZW50KCkgeworICAgIHVzYl9ob3N0X2NsZWFudXAobVVzYkhvc3RDb250ZXh0KTsKK30KKworYm9vbCBNdHBDbGllbnQ6OnN0YXJ0KCkgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTXV0ZXgpOworCisgICAgaWYgKG1UaHJlYWQpCisgICAgICAgIHJldHVybiB0cnVlOworCisgICAgbVVzYkhvc3RDb250ZXh0ID0gdXNiX2hvc3RfaW5pdCgpOworICAgIGlmICghbVVzYkhvc3RDb250ZXh0KQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBtVGhyZWFkID0gbmV3IE10cENsaWVudFRocmVhZCh0aGlzKTsKKyAgICBtVGhyZWFkLT5ydW4oIk10cENsaWVudFRocmVhZCIpOworICAgIC8vIHdhaXQgZm9yIHRoZSB0aHJlYWQgdG8gZG8gaW5pdGlhbCBkZXZpY2UgZGlzY292ZXJ5IGJlZm9yZSByZXR1cm5pbmcKKyAgICBtVGhyZWFkU3RhcnRDb25kaXRpb24ud2FpdChtTXV0ZXgpOworCisgICAgcmV0dXJuIHRydWU7Cit9CisKK3ZvaWQgTXRwQ2xpZW50OjpzdG9wKCkgeworICAgIG1Eb25lID0gdHJ1ZTsKK30KKworTXRwRGV2aWNlKiBNdHBDbGllbnQ6OmdldERldmljZShpbnQgaWQpIHsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IG1EZXZpY2VMaXN0LnNpemUoKTsgaSsrKSB7CisgICAgICAgIE10cERldmljZSogZGV2aWNlID0gbURldmljZUxpc3RbaV07CisgICAgICAgIGlmIChkZXZpY2UtPmdldElEKCkgPT0gaWQpCisgICAgICAgICAgICByZXR1cm4gZGV2aWNlOworICAgIH0KKyAgICByZXR1cm4gTlVMTDsKK30KKworYm9vbCBNdHBDbGllbnQ6OnVzYkRldmljZUFkZGVkKGNvbnN0IGNoYXIgKmRldm5hbWUpIHsKKyAgICBzdHJ1Y3QgdXNiX2Rlc2NyaXB0b3JfaGVhZGVyKiBkZXNjOworICAgIHN0cnVjdCB1c2JfZGVzY3JpcHRvcl9pdGVyIGl0ZXI7CisKKyAgICBzdHJ1Y3QgdXNiX2RldmljZSAqZGV2aWNlID0gdXNiX2RldmljZV9vcGVuKGRldm5hbWUpOworICAgIGlmICghZGV2aWNlKSB7CisgICAgICAgIExPR0UoInVzYl9kZXZpY2Vfb3BlbiBmYWlsZWRcbiIpOworICAgICAgICByZXR1cm4gbURvbmU7CisgICAgfQorCisgICAgdXNiX2Rlc2NyaXB0b3JfaXRlcl9pbml0KGRldmljZSwgJml0ZXIpOworCisgICAgd2hpbGUgKChkZXNjID0gdXNiX2Rlc2NyaXB0b3JfaXRlcl9uZXh0KCZpdGVyKSkgIT0gTlVMTCkgeworICAgICAgICBpZiAoZGVzYy0+YkRlc2NyaXB0b3JUeXBlID09IFVTQl9EVF9JTlRFUkZBQ0UpIHsKKyAgICAgICAgICAgIHN0cnVjdCB1c2JfaW50ZXJmYWNlX2Rlc2NyaXB0b3IgKmludGVyZmFjZSA9IChzdHJ1Y3QgdXNiX2ludGVyZmFjZV9kZXNjcmlwdG9yICopZGVzYzsKKworICAgICAgICAgICAgaWYgKGludGVyZmFjZS0+YkludGVyZmFjZUNsYXNzID09IFVTQl9DTEFTU19TVElMTF9JTUFHRSAmJgorICAgICAgICAgICAgICAgIGludGVyZmFjZS0+YkludGVyZmFjZVN1YkNsYXNzID09IDEgJiYgLy8gU3RpbGwgSW1hZ2UgQ2FwdHVyZQorICAgICAgICAgICAgICAgIGludGVyZmFjZS0+YkludGVyZmFjZVByb3RvY29sID09IDEpICAgICAvLyBQaWN0dXJlIFRyYW5zZmVyIFByb3RvY29sIChQSU1BIDE1NDcwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIExPR0QoIkZvdW5kIGNhbWVyYTogXCIlc1wiIFwiJXNcIlxuIiwgdXNiX2RldmljZV9nZXRfbWFudWZhY3R1cmVyX25hbWUoZGV2aWNlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHVzYl9kZXZpY2VfZ2V0X3Byb2R1Y3RfbmFtZShkZXZpY2UpKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoaW50ZXJmYWNlLT5iSW50ZXJmYWNlQ2xhc3MgPT0gMHhGRiAmJgorICAgICAgICAgICAgICAgICAgICBpbnRlcmZhY2UtPmJJbnRlcmZhY2VTdWJDbGFzcyA9PSAweEZGICYmCisgICAgICAgICAgICAgICAgICAgIGludGVyZmFjZS0+YkludGVyZmFjZVByb3RvY29sID09IDApIHsKKyAgICAgICAgICAgICAgICBjaGFyKiBpbnRlcmZhY2VOYW1lID0gdXNiX2RldmljZV9nZXRfc3RyaW5nKGRldmljZSwgaW50ZXJmYWNlLT5pSW50ZXJmYWNlKTsKKyAgICAgICAgICAgICAgICBpZiAoIWludGVyZmFjZU5hbWUgfHwgc3RyY21wKGludGVyZmFjZU5hbWUsICJNVFAiKSkKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgLy8gTG9va3MgbGlrZSBhbiBhbmRyb2lkIHN0eWxlIE1UUCBkZXZpY2UKKyAgICAgICAgICAgICAgICBMT0dEKCJGb3VuZCBNVFAgZGV2aWNlOiBcIiVzXCIgXCIlc1wiXG4iLCB1c2JfZGV2aWNlX2dldF9tYW51ZmFjdHVyZXJfbmFtZShkZXZpY2UpLAorICAgICAgICAgICAgICAgICAgICAgICAgdXNiX2RldmljZV9nZXRfcHJvZHVjdF9uYW1lKGRldmljZSkpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvLyBsb29rIGZvciBzcGVjaWFsIGNhc2VkIGRldmljZXMgYmFzZWQgb24gdmVuZG9yL3Byb2R1Y3QgSUQKKyAgICAgICAgICAgICAgICAvLyB3ZSBhcmUgZG9pbmcgdGhpcyBtYWlubHkgZm9yIHRlc3RpbmcgcHVycG9zZXMKKyAgICAgICAgICAgICAgICB1aW50MTZfdCB2ZW5kb3IgPSB1c2JfZGV2aWNlX2dldF92ZW5kb3JfaWQoZGV2aWNlKTsKKyAgICAgICAgICAgICAgICB1aW50MTZfdCBwcm9kdWN0ID0gdXNiX2RldmljZV9nZXRfcHJvZHVjdF9pZChkZXZpY2UpOworICAgICAgICAgICAgICAgIGlmICghaXNNdHBEZXZpY2UodmVuZG9yLCBwcm9kdWN0KSkgeworICAgICAgICAgICAgICAgICAgICAvLyBub3QgYW4gTVRQIG9yIFBUUCBkZXZpY2UKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8vIHJlcXVlc3QgTVRQIE9TIHN0cmluZyBhbmQgZGVzY3JpcHRvcgorICAgICAgICAgICAgICAgIC8vIHNvbWUgbXVzaWMgcGxheWVycyBuZWVkIHRvIHNlZSB0aGlzIGJlZm9yZSBlbnRlcmluZyBNVFAgbW9kZS4KKyAgICAgICAgICAgICAgICBjaGFyIGJ1ZmZlclsyNTZdOworICAgICAgICAgICAgICAgIG1lbXNldChidWZmZXIsIDAsIHNpemVvZihidWZmZXIpKTsKKyAgICAgICAgICAgICAgICBpbnQgcmV0ID0gdXNiX2RldmljZV9zZW5kX2NvbnRyb2woZGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgVVNCX0RJUl9JTnxVU0JfUkVDSVBfREVWSUNFfFVTQl9UWVBFX1NUQU5EQVJELAorICAgICAgICAgICAgICAgICAgICAgICAgVVNCX1JFUV9HRVRfREVTQ1JJUFRPUiwgKFVTQl9EVF9TVFJJTkcgPDwgOCkgfCAweEVFLAorICAgICAgICAgICAgICAgICAgICAgICAgMCwgc2l6ZW9mKGJ1ZmZlciksIGJ1ZmZlcik7CisgICAgICAgICAgICAgICAgcHJpbnRmKCJ1c2JfZGV2aWNlX3NlbmRfY29udHJvbCByZXR1cm5lZCAlZCBlcnJubzogJWRcbiIsIHJldCwgZXJybm8pOworICAgICAgICAgICAgICAgIGlmIChyZXQgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgIHByaW50ZigiZ290IE1UUCBzdHJpbmcgJXNcbiIsIGJ1ZmZlcik7CisgICAgICAgICAgICAgICAgICAgIHJldCA9IHVzYl9kZXZpY2Vfc2VuZF9jb250cm9sKGRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBVU0JfRElSX0lOfFVTQl9SRUNJUF9ERVZJQ0V8VVNCX1RZUEVfVkVORE9SLCAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIDQsIHNpemVvZihidWZmZXIpLCBidWZmZXIpOworICAgICAgICAgICAgICAgICAgICBwcmludGYoIk9TIGRlc2NyaXB0b3IgZ290ICVkXG4iLCByZXQpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHByaW50Zigibm8gTVRQIHN0cmluZ1xuIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBpZiB3ZSBnb3QgaGVyZSwgdGhlbiB3ZSBoYXZlIGEgbGlrZWx5IE1UUCBvciBQVFAgZGV2aWNlCisKKyAgICAgICAgICAgIC8vIGludGVyZmFjZSBzaG91bGQgYmUgZm9sbG93ZWQgYnkgdGhyZWUgZW5kcG9pbnRzCisgICAgICAgICAgICBzdHJ1Y3QgdXNiX2VuZHBvaW50X2Rlc2NyaXB0b3IgKmVwOworICAgICAgICAgICAgc3RydWN0IHVzYl9lbmRwb2ludF9kZXNjcmlwdG9yICplcF9pbl9kZXNjID0gTlVMTDsKKyAgICAgICAgICAgIHN0cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvciAqZXBfb3V0X2Rlc2MgPSBOVUxMOworICAgICAgICAgICAgc3RydWN0IHVzYl9lbmRwb2ludF9kZXNjcmlwdG9yICplcF9pbnRyX2Rlc2MgPSBOVUxMOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAzOyBpKyspIHsKKyAgICAgICAgICAgICAgICBlcCA9IChzdHJ1Y3QgdXNiX2VuZHBvaW50X2Rlc2NyaXB0b3IgKil1c2JfZGVzY3JpcHRvcl9pdGVyX25leHQoJml0ZXIpOworICAgICAgICAgICAgICAgIGlmICghZXAgfHwgZXAtPmJEZXNjcmlwdG9yVHlwZSAhPSBVU0JfRFRfRU5EUE9JTlQpIHsKKyAgICAgICAgICAgICAgICAgICAgTE9HRSgiZW5kcG9pbnRzIG5vdCBmb3VuZFxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBtRG9uZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGVwLT5ibUF0dHJpYnV0ZXMgPT0gVVNCX0VORFBPSU5UX1hGRVJfQlVMSykgeworICAgICAgICAgICAgICAgICAgICBpZiAoZXAtPmJFbmRwb2ludEFkZHJlc3MgJiBVU0JfRU5EUE9JTlRfRElSX01BU0spCisgICAgICAgICAgICAgICAgICAgICAgICBlcF9pbl9kZXNjID0gZXA7CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIGVwX291dF9kZXNjID0gZXA7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChlcC0+Ym1BdHRyaWJ1dGVzID09IFVTQl9FTkRQT0lOVF9YRkVSX0lOVCAmJgorICAgICAgICAgICAgICAgICAgICBlcC0+YkVuZHBvaW50QWRkcmVzcyAmIFVTQl9FTkRQT0lOVF9ESVJfTUFTSykgeworICAgICAgICAgICAgICAgICAgICBlcF9pbnRyX2Rlc2MgPSBlcDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIWVwX2luX2Rlc2MgfHwgIWVwX291dF9kZXNjIHx8ICFlcF9pbnRyX2Rlc2MpIHsKKyAgICAgICAgICAgICAgICBMT0dFKCJlbmRwb2ludHMgbm90IGZvdW5kXG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gbURvbmU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0cnVjdCB1c2JfZW5kcG9pbnQgKmVwX2luID0gdXNiX2VuZHBvaW50X29wZW4oZGV2aWNlLCBlcF9pbl9kZXNjKTsKKyAgICAgICAgICAgIHN0cnVjdCB1c2JfZW5kcG9pbnQgKmVwX291dCA9IHVzYl9lbmRwb2ludF9vcGVuKGRldmljZSwgZXBfb3V0X2Rlc2MpOworICAgICAgICAgICAgc3RydWN0IHVzYl9lbmRwb2ludCAqZXBfaW50ciA9IHVzYl9lbmRwb2ludF9vcGVuKGRldmljZSwgZXBfaW50cl9kZXNjKTsKKworICAgICAgICAgICAgaWYgKHVzYl9kZXZpY2VfY2xhaW1faW50ZXJmYWNlKGRldmljZSwgaW50ZXJmYWNlLT5iSW50ZXJmYWNlTnVtYmVyKSkgeworICAgICAgICAgICAgICAgIExPR0UoInVzYl9kZXZpY2VfY2xhaW1faW50ZXJmYWNlIGZhaWxlZCBlcnJubzogJWRcbiIsIGVycm5vKTsKKyAgICAgICAgICAgICAgICB1c2JfZW5kcG9pbnRfY2xvc2UoZXBfaW4pOworICAgICAgICAgICAgICAgIHVzYl9lbmRwb2ludF9jbG9zZShlcF9vdXQpOworICAgICAgICAgICAgICAgIHVzYl9lbmRwb2ludF9jbG9zZShlcF9pbnRyKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gbURvbmU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIE10cERldmljZSogbXRwRGV2aWNlID0gbmV3IE10cERldmljZShkZXZpY2UsIGludGVyZmFjZS0+YkludGVyZmFjZU51bWJlciwKKyAgICAgICAgICAgICAgICAgICAgICAgIGVwX2luLCBlcF9vdXQsIGVwX2ludHIpOworICAgICAgICAgICAgbURldmljZUxpc3QuYWRkKG10cERldmljZSk7CisgICAgICAgICAgICBtdHBEZXZpY2UtPmluaXRpYWxpemUoKTsKKyAgICAgICAgICAgIGRldmljZUFkZGVkKG10cERldmljZSk7CisgICAgICAgICAgICByZXR1cm4gbURvbmU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICB1c2JfZGV2aWNlX2Nsb3NlKGRldmljZSk7CisgICAgcmV0dXJuIG1Eb25lOworfQorCitib29sIE10cENsaWVudDo6dXNiRGV2aWNlUmVtb3ZlZChjb25zdCBjaGFyICpkZXZuYW1lKSB7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtRGV2aWNlTGlzdC5zaXplKCk7IGkrKykgeworICAgICAgICBNdHBEZXZpY2UqIGRldmljZSA9IG1EZXZpY2VMaXN0W2ldOworICAgICAgICBpZiAoIXN0cmNtcChkZXZuYW1lLCBkZXZpY2UtPmdldERldmljZU5hbWUoKSkpIHsKKyAgICAgICAgICAgIGRldmljZVJlbW92ZWQoZGV2aWNlKTsKKyAgICAgICAgICAgIG1EZXZpY2VMaXN0LnJlbW92ZUF0KGkpOworICAgICAgICAgICAgZGVsZXRlIGRldmljZTsKKyAgICAgICAgICAgIExPR0QoIkNhbWVyYSByZW1vdmVkIVxuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gbURvbmU7Cit9CisKK2Jvb2wgTXRwQ2xpZW50Ojp1c2JEaXNjb3ZlcnlEb25lKCkgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTXV0ZXgpOworICAgIG1UaHJlYWRTdGFydENvbmRpdGlvbi5zaWduYWwoKTsKKyAgICByZXR1cm4gbURvbmU7Cit9CisKK2Jvb2wgTXRwQ2xpZW50Ojp0aHJlYWRMb29wKCkgeworICAgIHVzYl9ob3N0X3J1bihtVXNiSG9zdENvbnRleHQsIHVzYl9kZXZpY2VfYWRkZWQsIHVzYl9kZXZpY2VfcmVtb3ZlZCwgdXNiX2Rpc2NvdmVyeV9kb25lLCB0aGlzKTsKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK2ludCBNdHBDbGllbnQ6OnVzYl9kZXZpY2VfYWRkZWQoY29uc3QgY2hhciAqZGV2bmFtZSwgdm9pZCogY2xpZW50X2RhdGEpIHsKKyAgICBMT0dEKCJ1c2JfZGV2aWNlX2FkZGVkICVzXG4iLCBkZXZuYW1lKTsKKyAgICByZXR1cm4gKChNdHBDbGllbnQgKiljbGllbnRfZGF0YSktPnVzYkRldmljZUFkZGVkKGRldm5hbWUpOworfQorCitpbnQgTXRwQ2xpZW50Ojp1c2JfZGV2aWNlX3JlbW92ZWQoY29uc3QgY2hhciAqZGV2bmFtZSwgdm9pZCogY2xpZW50X2RhdGEpIHsKKyAgICBMT0dEKCJ1c2JfZGV2aWNlX3JlbW92ZWQgJXNcbiIsIGRldm5hbWUpOworICAgIHJldHVybiAoKE10cENsaWVudCAqKWNsaWVudF9kYXRhKS0+dXNiRGV2aWNlUmVtb3ZlZChkZXZuYW1lKTsKK30KKworaW50IE10cENsaWVudDo6dXNiX2Rpc2NvdmVyeV9kb25lKHZvaWQqIGNsaWVudF9kYXRhKSB7CisgICAgTE9HRCgidXNiX2Rpc2NvdmVyeV9kb25lXG4iKTsKKyAgICByZXR1cm4gKChNdHBDbGllbnQgKiljbGllbnRfZGF0YSktPnVzYkRpc2NvdmVyeURvbmUoKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL210cC9NdHBDbGllbnQuaCBiL21lZGlhL210cC9NdHBDbGllbnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYTVjNTI3Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbXRwL010cENsaWVudC5oCkBAIC0wLDAgKzEsNjggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9NVFBfQ0xJRU5UX0gKKyNkZWZpbmUgX01UUF9DTElFTlRfSAorCisjaW5jbHVkZSAiTXRwVHlwZXMuaCIKKworI2luY2x1ZGUgPHV0aWxzL3RocmVhZHMuaD4KKworc3RydWN0IHVzYl9ob3N0X2NvbnRleHQ7CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY2xhc3MgTXRwQ2xpZW50VGhyZWFkOworCitjbGFzcyBNdHBDbGllbnQgeworcHJpdmF0ZToKKyAgICBNdHBEZXZpY2VMaXN0ICAgICAgICAgICAgICAgbURldmljZUxpc3Q7CisgICAgTXRwQ2xpZW50VGhyZWFkKiAgICAgICAgICAgIG1UaHJlYWQ7CisgICAgQ29uZGl0aW9uICAgICAgICAgICAgICAgICAgIG1UaHJlYWRTdGFydENvbmRpdGlvbjsKKyAgICBNdXRleCAgICAgICAgICAgICAgICAgICAgICAgbU11dGV4OworICAgIHN0cnVjdCB1c2JfaG9zdF9jb250ZXh0KiAgICBtVXNiSG9zdENvbnRleHQ7CisgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgICAgIG1Eb25lOworCitwdWJsaWM6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXRwQ2xpZW50KCk7CisgICAgdmlydHVhbCAgICAgICAgICAgICAgICAgfk10cENsaWVudCgpOworCisgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgc3RhcnQoKTsKKyAgICB2b2lkICAgICAgICAgICAgICAgICAgICBzdG9wKCk7CisKKyAgICBpbmxpbmUgTXRwRGV2aWNlTGlzdCYgICBnZXREZXZpY2VMaXN0KCkgeyByZXR1cm4gbURldmljZUxpc3Q7IH0KKyAgICBNdHBEZXZpY2UqICAgICAgICAgICAgICBnZXREZXZpY2UoaW50IGlkKTsKKworCisgICAgdmlydHVhbCB2b2lkICAgICAgICAgICAgZGV2aWNlQWRkZWQoTXRwRGV2aWNlICpkZXZpY2UpID0gMDsKKyAgICB2aXJ0dWFsIHZvaWQgICAgICAgICAgICBkZXZpY2VSZW1vdmVkKE10cERldmljZSAqZGV2aWNlKSA9IDA7CisKK3ByaXZhdGU6CisgICAgLy8gdGhlc2UgcmV0dXJuIHRydWUgaWYgd2Ugc2hvdWxkIHN0b3AgbW9uaXRvcmluZyBVU0IgYW5kIGNsZWFuIHVwCisgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgdXNiRGV2aWNlQWRkZWQoY29uc3QgY2hhciAqZGV2bmFtZSk7CisgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgdXNiRGV2aWNlUmVtb3ZlZChjb25zdCBjaGFyICpkZXZuYW1lKTsKKyAgICBib29sICAgICAgICAgICAgICAgICAgICB1c2JEaXNjb3ZlcnlEb25lKCk7CisKKyAgICBmcmllbmQgY2xhc3MgTXRwQ2xpZW50VGhyZWFkOworICAgIGJvb2wgICAgICAgICAgICAgICAgICAgIHRocmVhZExvb3AoKTsKKyAgICBzdGF0aWMgaW50ICAgICAgICAgICAgICB1c2JfZGV2aWNlX2FkZGVkKGNvbnN0IGNoYXIgKmRldm5hbWUsIHZvaWQqIGNsaWVudF9kYXRhKTsKKyAgICBzdGF0aWMgaW50ICAgICAgICAgICAgICB1c2JfZGV2aWNlX3JlbW92ZWQoY29uc3QgY2hhciAqZGV2bmFtZSwgdm9pZCogY2xpZW50X2RhdGEpOworICAgIHN0YXRpYyBpbnQgICAgICAgICAgICAgIHVzYl9kaXNjb3ZlcnlfZG9uZSh2b2lkKiBjbGllbnRfZGF0YSk7Cit9OworCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgLy8gX01UUF9DTElFTlRfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbXRwL010cEN1cnNvci5jcHAgYi9tZWRpYS9tdHAvTXRwQ3Vyc29yLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYmEwN2NjCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbXRwL010cEN1cnNvci5jcHAKQEAgLTAsMCArMSw0NjAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIk10cEN1cnNvciIKKworI2luY2x1ZGUgIk10cERlYnVnLmgiCisjaW5jbHVkZSAiTXRwQ2xpZW50LmgiCisjaW5jbHVkZSAiTXRwQ3Vyc29yLmgiCisjaW5jbHVkZSAiTXRwRGV2aWNlLmgiCisjaW5jbHVkZSAiTXRwRGV2aWNlSW5mby5oIgorI2luY2x1ZGUgIk10cE9iamVjdEluZm8uaCIKKyNpbmNsdWRlICJNdHBTdG9yYWdlSW5mby5oIgorCisKKyNpbmNsdWRlICJiaW5kZXIvQ3Vyc29yV2luZG93LmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworLyogRGV2aWNlIENvbHVtbiBJRHMgKi8KKy8qIFRoZXNlIG11c3QgbWF0Y2ggdGhlIHZhbHVlcyBpbiBNdHBDdXJzb3IuamF2YSAqLworI2RlZmluZSBERVZJQ0VfUk9XX0lEICAgICAgICAgICAxCisjZGVmaW5lIERFVklDRV9NQU5VRkFDVFVSRVIgICAgIDIKKyNkZWZpbmUgREVWSUNFX01PREVMICAgICAgICAgICAgMworCisvKiBTdG9yYWdlIENvbHVtbiBJRHMgKi8KKy8qIFRoZXNlIG11c3QgbWF0Y2ggdGhlIHZhbHVlcyBpbiBNdHBDdXJzb3IuamF2YSAqLworI2RlZmluZSBTVE9SQUdFX1JPV19JRCAgICAgICAgICAxMDEKKyNkZWZpbmUgU1RPUkFHRV9JREVOVElGSUVSICAgICAgMTAyCisjZGVmaW5lIFNUT1JBR0VfREVTQ1JJUFRJT04gICAgIDEwMworCisvKiBPYmplY3QgQ29sdW1uIElEcyAqLworLyogVGhlc2UgbXVzdCBtYXRjaCB0aGUgdmFsdWVzIGluIE10cEN1cnNvci5qYXZhICovCisjZGVmaW5lIE9CSkVDVF9ST1dfSUQgICAgICAgICAgICAgICAyMDEKKyNkZWZpbmUgT0JKRUNUX1NUT1JBR0VfSUQgICAgICAgICAgIDIwMgorI2RlZmluZSBPQkpFQ1RfRk9STUFUICAgICAgICAgICAgICAgMjAzCisjZGVmaW5lIE9CSkVDVF9QUk9URUNUSU9OX1NUQVRVUyAgICAyMDQKKyNkZWZpbmUgT0JKRUNUX1NJWkUgICAgICAgICAgICAgICAgIDIwNQorI2RlZmluZSBPQkpFQ1RfVEhVTUJfRk9STUFUICAgICAgICAgMjA2CisjZGVmaW5lIE9CSkVDVF9USFVNQl9TSVpFICAgICAgICAgICAyMDcKKyNkZWZpbmUgT0JKRUNUX1RIVU1CX1dJRFRIICAgICAgICAgIDIwOAorI2RlZmluZSBPQkpFQ1RfVEhVTUJfSEVJR0hUICAgICAgICAgMjA5CisjZGVmaW5lIE9CSkVDVF9JTUFHRV9XSURUSCAgICAgICAgICAyMTAKKyNkZWZpbmUgT0JKRUNUX0lNQUdFX0hFSUdIVCAgICAgICAgIDIxMQorI2RlZmluZSBPQkpFQ1RfSU1BR0VfREVQVEggICAgICAgICAgMjEyCisjZGVmaW5lIE9CSkVDVF9QQVJFTlQgICAgICAgICAgICAgICAyMTMKKyNkZWZpbmUgT0JKRUNUX0FTU09DSUFUSU9OX1RZUEUgICAgIDIxNAorI2RlZmluZSBPQkpFQ1RfQVNTT0NJQVRJT05fREVTQyAgICAgMjE1CisjZGVmaW5lIE9CSkVDVF9TRVFVRU5DRV9OVU1CRVIgICAgICAyMTYKKyNkZWZpbmUgT0JKRUNUX05BTUUgICAgICAgICAgICAgICAgIDIxNworI2RlZmluZSBPQkpFQ1RfREFURV9DUkVBVEVEICAgICAgICAgMjE4CisjZGVmaW5lIE9CSkVDVF9EQVRFX01PRElGSUVEICAgICAgICAyMTkKKyNkZWZpbmUgT0JKRUNUX0tFWVdPUkRTICAgICAgICAgICAgIDIyMAorI2RlZmluZSBPQkpFQ1RfVEhVTUIgICAgICAgICAgICAgICAgMjIxCisKK010cEN1cnNvcjo6TXRwQ3Vyc29yKE10cENsaWVudCogY2xpZW50LCBpbnQgcXVlcnlUeXBlLCBpbnQgZGV2aWNlSUQsCisgICAgICAgICAgICAgICAgaW50IHN0b3JhZ2VJRCwgaW50IG9iamVjdElELCBpbnQgY29sdW1uQ291bnQsIGludCogY29sdW1ucykKKyAgICAgICAgOiAgIG1DbGllbnQoY2xpZW50KSwKKyAgICAgICAgICAgIG1RdWVyeVR5cGUocXVlcnlUeXBlKSwKKyAgICAgICAgICAgIG1EZXZpY2VJRChkZXZpY2VJRCksCisgICAgICAgICAgICBtU3RvcmFnZUlEKHN0b3JhZ2VJRCksCisgICAgICAgICAgICBtUWJqZWN0SUQob2JqZWN0SUQpLAorICAgICAgICAgICAgbUNvbHVtbkNvdW50KGNvbHVtbkNvdW50KSwKKyAgICAgICAgICAgIG1Db2x1bW5zKE5VTEwpCit7CisgICAgaWYgKGNvbHVtbnMpIHsKKyAgICAgICAgbUNvbHVtbnMgPSBuZXcgaW50W2NvbHVtbkNvdW50XTsKKyAgICAgICAgbWVtY3B5KG1Db2x1bW5zLCBjb2x1bW5zLCBjb2x1bW5Db3VudCAqIHNpemVvZihpbnQpKTsKKyAgICB9Cit9CisKK010cEN1cnNvcjo6fk10cEN1cnNvcigpIHsKKyAgICBkZWxldGVbXSBtQ29sdW1uczsKK30KKworaW50IE10cEN1cnNvcjo6ZmlsbFdpbmRvdyhDdXJzb3JXaW5kb3cqIHdpbmRvdywgaW50IHN0YXJ0UG9zKSB7CisgICAgTE9HRCgiTXRwQ3Vyc29yOjpmaWxsV2luZG93IG1RdWVyeVR5cGU6ICVkXG4iLCBtUXVlcnlUeXBlKTsKKworICAgIHN3aXRjaCAobVF1ZXJ5VHlwZSkgeworICAgICAgICBjYXNlIERFVklDRToKKyAgICAgICAgICAgIHJldHVybiBmaWxsRGV2aWNlcyh3aW5kb3csIHN0YXJ0UG9zKTsKKyAgICAgICAgY2FzZSBERVZJQ0VfSUQ6CisgICAgICAgICAgICByZXR1cm4gZmlsbERldmljZSh3aW5kb3csIHN0YXJ0UG9zKTsKKyAgICAgICAgY2FzZSBTVE9SQUdFOgorICAgICAgICAgICAgcmV0dXJuIGZpbGxTdG9yYWdlcyh3aW5kb3csIHN0YXJ0UG9zKTsKKyAgICAgICAgY2FzZSBTVE9SQUdFX0lEOgorICAgICAgICAgICAgcmV0dXJuIGZpbGxTdG9yYWdlKHdpbmRvdywgc3RhcnRQb3MpOworICAgICAgICBjYXNlIE9CSkVDVDoKKyAgICAgICAgICAgIHJldHVybiBmaWxsT2JqZWN0cyh3aW5kb3csIDAsIHN0YXJ0UG9zKTsKKyAgICAgICAgY2FzZSBPQkpFQ1RfSUQ6CisgICAgICAgICAgICByZXR1cm4gZmlsbE9iamVjdCh3aW5kb3csIHN0YXJ0UG9zKTsKKyAgICAgICAgY2FzZSBTVE9SQUdFX0NISUxEUkVOOgorICAgICAgICAgICAgcmV0dXJuIGZpbGxPYmplY3RzKHdpbmRvdywgLTEsIHN0YXJ0UG9zKTsKKyAgICAgICAgY2FzZSBPQkpFQ1RfQ0hJTERSRU46CisgICAgICAgICAgICByZXR1cm4gZmlsbE9iamVjdHMod2luZG93LCBtUWJqZWN0SUQsIHN0YXJ0UG9zKTsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIExPR0UoIk10cEN1cnNvcjo6ZmlsbFdpbmRvdzogdW5rbm93biBxdWVyeSB0eXBlICVkXG4iLCBtUXVlcnlUeXBlKTsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgIH0KK30KKworaW50IE10cEN1cnNvcjo6ZmlsbERldmljZXMoQ3Vyc29yV2luZG93KiB3aW5kb3csIGludCBzdGFydFBvcykgeworICAgIGludCBjb3VudCA9IDA7CisgICAgTXRwRGV2aWNlTGlzdCYgZGV2aWNlTGlzdCA9IG1DbGllbnQtPmdldERldmljZUxpc3QoKTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGRldmljZUxpc3Quc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgTXRwRGV2aWNlKiBkZXZpY2UgPSBkZXZpY2VMaXN0W2ldOworICAgICAgICBpZiAoZmlsbERldmljZSh3aW5kb3csIGRldmljZSwgc3RhcnRQb3MpKSB7CisgICAgICAgICAgICBjb3VudCsrOworICAgICAgICAgICAgc3RhcnRQb3MrKzsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBjb3VudDsKK30KKworaW50IE10cEN1cnNvcjo6ZmlsbERldmljZShDdXJzb3JXaW5kb3cqIHdpbmRvdywgaW50IHN0YXJ0UG9zKSB7CisgICAgTXRwRGV2aWNlKiBkZXZpY2UgPSBtQ2xpZW50LT5nZXREZXZpY2UobURldmljZUlEKTsKKyAgICBpZiAoZGV2aWNlICYmIGZpbGxEZXZpY2Uod2luZG93LCBkZXZpY2UsIHN0YXJ0UG9zKSkKKyAgICAgICAgcmV0dXJuIDE7CisgICAgZWxzZQorICAgICAgICByZXR1cm4gMDsKK30KKworaW50IE10cEN1cnNvcjo6ZmlsbFN0b3JhZ2VzKEN1cnNvcldpbmRvdyogd2luZG93LCBpbnQgc3RhcnRQb3MpIHsKKyAgICBpbnQgY291bnQgPSAwOworICAgIE10cERldmljZSogZGV2aWNlID0gbUNsaWVudC0+Z2V0RGV2aWNlKG1EZXZpY2VJRCk7CisgICAgaWYgKCFkZXZpY2UpCisgICAgICAgIHJldHVybiAwOworICAgIE10cFN0b3JhZ2VJRExpc3QqIHN0b3JhZ2VJRHMgPSBkZXZpY2UtPmdldFN0b3JhZ2VJRHMoKTsKKyAgICBpZiAoIXN0b3JhZ2VJRHMpCisgICAgICAgIHJldHVybiAwOworCisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzdG9yYWdlSURzLT5zaXplKCk7IGkrKykgeworICAgICAgICBNdHBTdG9yYWdlSUQgc3RvcmFnZUlEID0gKCpzdG9yYWdlSURzKVtpXTsKKyAgICAgICAgaWYgKGZpbGxTdG9yYWdlKHdpbmRvdywgZGV2aWNlLCBzdG9yYWdlSUQsIHN0YXJ0UG9zKSkgeworICAgICAgICAgICAgY291bnQrKzsKKyAgICAgICAgICAgIHN0YXJ0UG9zKys7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICBkZWxldGUgc3RvcmFnZUlEczsKKyAgICByZXR1cm4gY291bnQ7Cit9CisKK2ludCBNdHBDdXJzb3I6OmZpbGxTdG9yYWdlKEN1cnNvcldpbmRvdyogd2luZG93LCBpbnQgc3RhcnRQb3MpIHsKKyAgICBNdHBEZXZpY2UqIGRldmljZSA9IG1DbGllbnQtPmdldERldmljZShtRGV2aWNlSUQpOworICAgIGlmIChkZXZpY2UgJiYgZmlsbFN0b3JhZ2Uod2luZG93LCBkZXZpY2UsIG1TdG9yYWdlSUQsIHN0YXJ0UG9zKSkKKyAgICAgICAgcmV0dXJuIDE7CisgICAgZWxzZQorICAgICAgICByZXR1cm4gMDsKK30KKworaW50IE10cEN1cnNvcjo6ZmlsbE9iamVjdHMoQ3Vyc29yV2luZG93KiB3aW5kb3csIGludCBwYXJlbnQsIGludCBzdGFydFBvcykgeworICAgIGludCBjb3VudCA9IDA7CisgICAgTXRwRGV2aWNlKiBkZXZpY2UgPSBtQ2xpZW50LT5nZXREZXZpY2UobURldmljZUlEKTsKKyAgICBpZiAoIWRldmljZSkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgTXRwT2JqZWN0SGFuZGxlTGlzdCogaGFuZGxlcyA9IGRldmljZS0+Z2V0T2JqZWN0SGFuZGxlcyhtU3RvcmFnZUlELCAwLCBwYXJlbnQpOworICAgIGlmICghaGFuZGxlcykKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGhhbmRsZXMtPnNpemUoKTsgaSsrKSB7CisgICAgICAgIE10cE9iamVjdEhhbmRsZSBoYW5kbGUgPSAoKmhhbmRsZXMpW2ldOworICAgICAgICBpZiAoZmlsbE9iamVjdCh3aW5kb3csIGRldmljZSwgaGFuZGxlLCBzdGFydFBvcykpIHsKKyAgICAgICAgICAgIGNvdW50Kys7CisgICAgICAgICAgICBzdGFydFBvcysrOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgZGVsZXRlIGhhbmRsZXM7CisgICAgcmV0dXJuIGNvdW50OworfQorCitpbnQgTXRwQ3Vyc29yOjpmaWxsT2JqZWN0KEN1cnNvcldpbmRvdyogd2luZG93LCBpbnQgc3RhcnRQb3MpIHsKKyAgICBNdHBEZXZpY2UqIGRldmljZSA9IG1DbGllbnQtPmdldERldmljZShtRGV2aWNlSUQpOworICAgIGlmIChkZXZpY2UgJiYgZmlsbE9iamVjdCh3aW5kb3csIGRldmljZSwgbVFiamVjdElELCBzdGFydFBvcykpCisgICAgICAgIHJldHVybiAxOworICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIDA7Cit9CisKK2Jvb2wgTXRwQ3Vyc29yOjpmaWxsRGV2aWNlKEN1cnNvcldpbmRvdyogd2luZG93LCBNdHBEZXZpY2UqIGRldmljZSwgaW50IHJvdykgeworICAgIE10cERldmljZUluZm8qIGRldmljZUluZm8gPSBkZXZpY2UtPmdldERldmljZUluZm8oKTsKKyAgICBpZiAoIWRldmljZUluZm8pCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICBpZiAoIXByZXBhcmVSb3cod2luZG93KSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtQ29sdW1uQ291bnQ7IGkrKykgeworICAgICAgICBzd2l0Y2ggKG1Db2x1bW5zW2ldKSB7CisgICAgICAgICAgICBjYXNlIERFVklDRV9ST1dfSUQ6CisgICAgICAgICAgICAgICAgaWYgKCFwdXRMb25nKHdpbmRvdywgZGV2aWNlLT5nZXRJRCgpLCByb3csIGkpKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBERVZJQ0VfTUFOVUZBQ1RVUkVSOgorICAgICAgICAgICAgICAgIGlmICghcHV0U3RyaW5nKHdpbmRvdywgZGV2aWNlSW5mby0+bU1hbnVmYWN0dXJlciwgcm93LCBpKSkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgREVWSUNFX01PREVMOgorICAgICAgICAgICAgICAgIGlmICghcHV0U3RyaW5nKHdpbmRvdywgZGV2aWNlSW5mby0+bU1vZGVsLCByb3csIGkpKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBMT0dFKCJmaWxsRGV2aWNlOiB1bmtub3duIGNvbHVtbiAlZFxuIiwgbUNvbHVtbnNbaV0pOworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiB0cnVlOworfQorCitib29sIE10cEN1cnNvcjo6ZmlsbFN0b3JhZ2UoQ3Vyc29yV2luZG93KiB3aW5kb3csIE10cERldmljZSogZGV2aWNlLAorICAgICAgICBNdHBTdG9yYWdlSUQgc3RvcmFnZUlELCBpbnQgcm93KSB7CisKK0xPR0QoImZpbGxTdG9yYWdlICVkXG4iLCBzdG9yYWdlSUQpOworCisgICAgTXRwU3RvcmFnZUluZm8qIHN0b3JhZ2VJbmZvID0gZGV2aWNlLT5nZXRTdG9yYWdlSW5mbyhzdG9yYWdlSUQpOworICAgIGlmICghc3RvcmFnZUluZm8pCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICBpZiAoIXByZXBhcmVSb3cod2luZG93KSkgeworICAgICAgICBkZWxldGUgc3RvcmFnZUluZm87CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBjb25zdCBjaGFyKiB0ZXh0OworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbUNvbHVtbkNvdW50OyBpKyspIHsKKyAgICAgICAgc3dpdGNoIChtQ29sdW1uc1tpXSkgeworICAgICAgICAgICAgY2FzZSBTVE9SQUdFX1JPV19JRDoKKyAgICAgICAgICAgICAgICBpZiAoIXB1dExvbmcod2luZG93LCBzdG9yYWdlSUQsIHJvdywgaSkpCisgICAgICAgICAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFNUT1JBR0VfSURFTlRJRklFUjoKKyAgICAgICAgICAgICAgICB0ZXh0ID0gc3RvcmFnZUluZm8tPm1Wb2x1bWVJZGVudGlmaWVyOworICAgICAgICAgICAgICAgIGlmICghdGV4dCB8fCAhdGV4dFswXSkKKyAgICAgICAgICAgICAgICAgICAgdGV4dCA9ICJDYW1lcmEgU3RvcmFnZSI7CisgICAgICAgICAgICAgICAgaWYgKCFwdXRTdHJpbmcod2luZG93LCB0ZXh0LCByb3csIGkpKQorICAgICAgICAgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBTVE9SQUdFX0RFU0NSSVBUSU9OOgorICAgICAgICAgICAgICAgIHRleHQgPSBzdG9yYWdlSW5mby0+bVN0b3JhZ2VEZXNjcmlwdGlvbjsKKyAgICAgICAgICAgICAgICBpZiAoIXRleHQgfHwgIXRleHRbMF0pCisgICAgICAgICAgICAgICAgICAgIHRleHQgPSAiU3RvcmFnZSBEZXNjcmlwdGlvbiI7CisgICAgICAgICAgICAgICAgaWYgKCFwdXRTdHJpbmcod2luZG93LCB0ZXh0LCByb3csIGkpKQorICAgICAgICAgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBMT0dFKCJmaWxsU3RvcmFnZTogdW5rbm93biBjb2x1bW4gJWRcbiIsIG1Db2x1bW5zW2ldKTsKKyAgICAgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBkZWxldGUgc3RvcmFnZUluZm87CisgICAgcmV0dXJuIHRydWU7CisKK2ZhaWw6CisgICAgZGVsZXRlIHN0b3JhZ2VJbmZvOworICAgIHJldHVybiBmYWxzZTsKK30KKworYm9vbCBNdHBDdXJzb3I6OmZpbGxPYmplY3QoQ3Vyc29yV2luZG93KiB3aW5kb3csIE10cERldmljZSogZGV2aWNlLAorICAgICAgICBNdHBPYmplY3RIYW5kbGUgb2JqZWN0SUQsIGludCByb3cpIHsKKworICAgIE10cE9iamVjdEluZm8qIG9iamVjdEluZm8gPSBkZXZpY2UtPmdldE9iamVjdEluZm8ob2JqZWN0SUQpOworICAgIGlmICghb2JqZWN0SW5mbykKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIC8vIG9iamVjdEluZm8tPnByaW50KCk7CisgICAgaWYgKCFwcmVwYXJlUm93KHdpbmRvdykpIHsKKyAgICAgICAgZGVsZXRlIG9iamVjdEluZm87CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IG1Db2x1bW5Db3VudDsgaSsrKSB7CisgICAgICAgIHN3aXRjaCAobUNvbHVtbnNbaV0pIHsKKyAgICAgICAgICAgIGNhc2UgT0JKRUNUX1JPV19JRDoKKyAgICAgICAgICAgICAgICBpZiAoIXB1dExvbmcod2luZG93LCBvYmplY3RJRCwgcm93LCBpKSkKKyAgICAgICAgICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgT0JKRUNUX1NUT1JBR0VfSUQ6CisgICAgICAgICAgICAgICAgaWYgKCFwdXRMb25nKHdpbmRvdywgb2JqZWN0SW5mby0+bVN0b3JhZ2VJRCwgcm93LCBpKSkKKyAgICAgICAgICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgT0JKRUNUX0ZPUk1BVDoKKyAgICAgICAgICAgICAgICBpZiAoIXB1dExvbmcod2luZG93LCBvYmplY3RJbmZvLT5tRm9ybWF0LCByb3csIGkpKQorICAgICAgICAgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBPQkpFQ1RfUFJPVEVDVElPTl9TVEFUVVM6CisgICAgICAgICAgICAgICAgaWYgKCFwdXRMb25nKHdpbmRvdywgb2JqZWN0SW5mby0+bVByb3RlY3Rpb25TdGF0dXMsIHJvdywgaSkpCisgICAgICAgICAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE9CSkVDVF9TSVpFOgorICAgICAgICAgICAgICAgIGlmICghcHV0TG9uZyh3aW5kb3csIG9iamVjdEluZm8tPm1Db21wcmVzc2VkU2l6ZSwgcm93LCBpKSkKKyAgICAgICAgICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgT0JKRUNUX1RIVU1CX0ZPUk1BVDoKKyAgICAgICAgICAgICAgICBpZiAoIXB1dExvbmcod2luZG93LCBvYmplY3RJbmZvLT5tVGh1bWJGb3JtYXQsIHJvdywgaSkpCisgICAgICAgICAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE9CSkVDVF9USFVNQl9TSVpFOgorICAgICAgICAgICAgICAgIGlmICghcHV0TG9uZyh3aW5kb3csIG9iamVjdEluZm8tPm1UaHVtYkNvbXByZXNzZWRTaXplLCByb3csIGkpKQorICAgICAgICAgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBPQkpFQ1RfVEhVTUJfV0lEVEg6CisgICAgICAgICAgICAgICAgaWYgKCFwdXRMb25nKHdpbmRvdywgb2JqZWN0SW5mby0+bVRodW1iUGl4V2lkdGgsIHJvdywgaSkpCisgICAgICAgICAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE9CSkVDVF9USFVNQl9IRUlHSFQ6CisgICAgICAgICAgICAgICAgaWYgKCFwdXRMb25nKHdpbmRvdywgb2JqZWN0SW5mby0+bVRodW1iUGl4SGVpZ2h0LCByb3csIGkpKQorICAgICAgICAgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBPQkpFQ1RfSU1BR0VfV0lEVEg6CisgICAgICAgICAgICAgICAgaWYgKCFwdXRMb25nKHdpbmRvdywgb2JqZWN0SW5mby0+bUltYWdlUGl4V2lkdGgsIHJvdywgaSkpCisgICAgICAgICAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE9CSkVDVF9JTUFHRV9IRUlHSFQ6CisgICAgICAgICAgICAgICAgaWYgKCFwdXRMb25nKHdpbmRvdywgb2JqZWN0SW5mby0+bUltYWdlUGl4SGVpZ2h0LCByb3csIGkpKQorICAgICAgICAgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBPQkpFQ1RfSU1BR0VfREVQVEg6CisgICAgICAgICAgICAgICAgaWYgKCFwdXRMb25nKHdpbmRvdywgb2JqZWN0SW5mby0+bUltYWdlUGl4RGVwdGgsIHJvdywgaSkpCisgICAgICAgICAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE9CSkVDVF9QQVJFTlQ6CisgICAgICAgICAgICAgICAgaWYgKCFwdXRMb25nKHdpbmRvdywgb2JqZWN0SW5mby0+bVBhcmVudCwgcm93LCBpKSkKKyAgICAgICAgICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgT0JKRUNUX0FTU09DSUFUSU9OX1RZUEU6CisgICAgICAgICAgICAgICAgaWYgKCFwdXRMb25nKHdpbmRvdywgb2JqZWN0SW5mby0+bUFzc29jaWF0aW9uVHlwZSwgcm93LCBpKSkKKyAgICAgICAgICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgT0JKRUNUX0FTU09DSUFUSU9OX0RFU0M6CisgICAgICAgICAgICAgICAgaWYgKCFwdXRMb25nKHdpbmRvdywgb2JqZWN0SW5mby0+bUFzc29jaWF0aW9uRGVzYywgcm93LCBpKSkKKyAgICAgICAgICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgT0JKRUNUX1NFUVVFTkNFX05VTUJFUjoKKyAgICAgICAgICAgICAgICBpZiAoIXB1dExvbmcod2luZG93LCBvYmplY3RJbmZvLT5tU2VxdWVuY2VOdW1iZXIsIHJvdywgaSkpCisgICAgICAgICAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE9CSkVDVF9OQU1FOgorICAgICAgICAgICAgICAgIGlmICghcHV0U3RyaW5nKHdpbmRvdywgb2JqZWN0SW5mby0+bU5hbWUsIHJvdywgaSkpCisgICAgICAgICAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE9CSkVDVF9EQVRFX0NSRUFURUQ6CisgICAgICAgICAgICAgICAgaWYgKCFwdXRMb25nKHdpbmRvdywgb2JqZWN0SW5mby0+bURhdGVDcmVhdGVkLCByb3csIGkpKQorICAgICAgICAgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBPQkpFQ1RfREFURV9NT0RJRklFRDoKKyAgICAgICAgICAgICAgICBpZiAoIXB1dExvbmcod2luZG93LCBvYmplY3RJbmZvLT5tRGF0ZU1vZGlmaWVkLCByb3csIGkpKQorICAgICAgICAgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBPQkpFQ1RfS0VZV09SRFM6CisgICAgICAgICAgICAgICAgaWYgKCFwdXRTdHJpbmcod2luZG93LCBvYmplY3RJbmZvLT5tS2V5d29yZHMsIHJvdywgaSkpCisgICAgICAgICAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE9CSkVDVF9USFVNQjoKKyAgICAgICAgICAgICAgICBpZiAoIXB1dFRodW1ibmFpbCh3aW5kb3csIG9iamVjdElELCBvYmplY3RJbmZvLT5tRm9ybWF0LCByb3csIGkpKQorICAgICAgICAgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIExPR0UoImZpbGxTdG9yYWdlOiB1bmtub3duIGNvbHVtbiAlZFxuIiwgbUNvbHVtbnNbaV0pOworICAgICAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgfQorICAgIH0KKworICAgIGRlbGV0ZSBvYmplY3RJbmZvOworICAgIHJldHVybiB0cnVlOworCitmYWlsOgorICAgIGRlbGV0ZSBvYmplY3RJbmZvOworICAgIHJldHVybiBmYWxzZTsKK30KKworYm9vbCBNdHBDdXJzb3I6OnByZXBhcmVSb3coQ3Vyc29yV2luZG93KiB3aW5kb3cpIHsKKyAgICBpZiAoIXdpbmRvdy0+c2V0TnVtQ29sdW1ucyhtQ29sdW1uQ291bnQpKSB7CisgICAgICAgIExPR0UoIkZhaWxlZCB0byBjaGFuZ2UgY29sdW1uIGNvdW50IGZyb20gJWQgdG8gJWQiLCB3aW5kb3ctPmdldE51bUNvbHVtbnMoKSwgbUNvbHVtbkNvdW50KTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBmaWVsZF9zbG90X3QgKiBmaWVsZERpciA9IHdpbmRvdy0+YWxsb2NSb3coKTsKKyAgICBpZiAoIWZpZWxkRGlyKSB7CisgICAgICAgIExPR0UoIkZhaWxlZCBhbGxvY2F0aW5nIGZpZWxkRGlyIik7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgcmV0dXJuIHRydWU7Cit9CisKKworYm9vbCBNdHBDdXJzb3I6OnB1dExvbmcoQ3Vyc29yV2luZG93KiB3aW5kb3csIGludCB2YWx1ZSwgaW50IHJvdywgaW50IGNvbHVtbikgeworCisgICAgaWYgKCF3aW5kb3ctPnB1dExvbmcocm93LCBjb2x1bW4sIHZhbHVlKSkgeworICAgICAgICB3aW5kb3ctPmZyZWVMYXN0Um93KCk7CisgICAgICAgIExPR0UoIkZhaWxlZCBhbGxvY2F0aW5nIHNwYWNlIGZvciBhIGxvbmcgaW4gY29sdW1uICVkIiwgY29sdW1uKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBNdHBDdXJzb3I6OnB1dFN0cmluZyhDdXJzb3JXaW5kb3cqIHdpbmRvdywgY29uc3QgY2hhciogdGV4dCwgaW50IHJvdywgaW50IGNvbHVtbikgeworICAgIGludCBzaXplID0gc3RybGVuKHRleHQpICsgMTsKKyAgICBpbnQgb2Zmc2V0ID0gd2luZG93LT5hbGxvYyhzaXplKTsKKyAgICBpZiAoIW9mZnNldCkgeworICAgICAgICB3aW5kb3ctPmZyZWVMYXN0Um93KCk7CisgICAgICAgIExPR0UoIkZhaWxlZCBhbGxvY2F0aW5nICV1IGJ5dGVzIGZvciB0ZXh0L2Jsb2IgJXMiLCBzaXplLCB0ZXh0KTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICB3aW5kb3ctPmNvcHlJbihvZmZzZXQsIChjb25zdCB1aW50OF90Kil0ZXh0LCBzaXplKTsKKworICAgIC8vIFRoaXMgbXVzdCBiZSB1cGRhdGVkIGFmdGVyIHRoZSBjYWxsIHRvIGFsbG9jKCksIHNpbmNlIHRoYXQKKyAgICAvLyBtYXkgbW92ZSB0aGUgZmllbGQgYXJvdW5kIGluIHRoZSB3aW5kb3cKKyAgICBmaWVsZF9zbG90X3QgKiBmaWVsZFNsb3QgPSB3aW5kb3ctPmdldEZpZWxkU2xvdChyb3csIGNvbHVtbik7CisgICAgZmllbGRTbG90LT50eXBlID0gRklFTERfVFlQRV9TVFJJTkc7CisgICAgZmllbGRTbG90LT5kYXRhLmJ1ZmZlci5vZmZzZXQgPSBvZmZzZXQ7CisgICAgZmllbGRTbG90LT5kYXRhLmJ1ZmZlci5zaXplID0gc2l6ZTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBNdHBDdXJzb3I6OnB1dFRodW1ibmFpbChDdXJzb3JXaW5kb3cqIHdpbmRvdywgaW50IG9iamVjdElELCBpbnQgZm9ybWF0LCBpbnQgcm93LCBpbnQgY29sdW1uKSB7CisgICAgTXRwRGV2aWNlKiBkZXZpY2UgPSBtQ2xpZW50LT5nZXREZXZpY2UobURldmljZUlEKTsKKyAgICB2b2lkKiB0aHVtYm5haWw7CisgICAgaW50IHNpemUsIG9mZnNldDsKKyAgICBpZiAoZm9ybWF0ID09IE1UUF9GT1JNQVRfQVNTT0NJQVRJT04pIHsKKyAgICAgICAgdGh1bWJuYWlsID0gTlVMTDsKKyAgICAgICAgc2l6ZSA9IG9mZnNldCA9IDA7CisgICAgfSBlbHNlIHsKKyAgICAgICAgdGh1bWJuYWlsID0gZGV2aWNlLT5nZXRUaHVtYm5haWwob2JqZWN0SUQsIHNpemUpOworCisgICAgICAgIExPR1YoInB1dFRodW1ibmFpbDogJXAsIHNpemU6ICVkXG4iLCB0aHVtYm5haWwsIHNpemUpOworICAgICAgICBvZmZzZXQgPSB3aW5kb3ctPmFsbG9jKHNpemUpOworICAgICAgICBpZiAoIW9mZnNldCkgeworICAgICAgICAgICAgd2luZG93LT5mcmVlTGFzdFJvdygpOworICAgICAgICAgICAgTE9HRSgiRmFpbGVkIGFsbG9jYXRpbmcgJXUgYnl0ZXMgZm9yIHRodW1ibmFpbCIsIHNpemUpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorICAgIGlmICh0aHVtYm5haWwpCisgICAgICAgIHdpbmRvdy0+Y29weUluKG9mZnNldCwgKGNvbnN0IHVpbnQ4X3QqKXRodW1ibmFpbCwgc2l6ZSk7CisKKyAgICAvLyBUaGlzIG11c3QgYmUgdXBkYXRlZCBhZnRlciB0aGUgY2FsbCB0byBhbGxvYygpLCBzaW5jZSB0aGF0CisgICAgLy8gbWF5IG1vdmUgdGhlIGZpZWxkIGFyb3VuZCBpbiB0aGUgd2luZG93CisgICAgZmllbGRfc2xvdF90ICogZmllbGRTbG90ID0gd2luZG93LT5nZXRGaWVsZFNsb3Qocm93LCBjb2x1bW4pOworICAgIGZpZWxkU2xvdC0+dHlwZSA9IEZJRUxEX1RZUEVfQkxPQjsKKyAgICBmaWVsZFNsb3QtPmRhdGEuYnVmZmVyLm9mZnNldCA9IG9mZnNldDsKKyAgICBmaWVsZFNsb3QtPmRhdGEuYnVmZmVyLnNpemUgPSBzaXplOworICAgIHJldHVybiB0cnVlOworfQorCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9tdHAvTXRwQ3Vyc29yLmggYi9tZWRpYS9tdHAvTXRwQ3Vyc29yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2Y4NDc1MwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL210cC9NdHBDdXJzb3IuaApAQCAtMCwwICsxLDc2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfTVRQX0NVUlNPUl9ICisjZGVmaW5lIF9NVFBfQ1VSU09SX0gKKworI2luY2x1ZGUgIk10cFR5cGVzLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY2xhc3MgQ3Vyc29yV2luZG93OworCitjbGFzcyBNdHBDdXJzb3IgeworcHJpdmF0ZToKKyAgICBlbnVtIHsKKyAgICAgICAgREVWSUNFICAgICAgICAgICAgICA9IDEsCisgICAgICAgIERFVklDRV9JRCAgICAgICAgICAgPSAyLAorICAgICAgICBTVE9SQUdFICAgICAgICAgICAgID0gMywKKyAgICAgICAgU1RPUkFHRV9JRCAgICAgICAgICA9IDQsCisgICAgICAgIE9CSkVDVCAgICAgICAgICAgICAgPSA1LAorICAgICAgICBPQkpFQ1RfSUQgICAgICAgICAgID0gNiwKKyAgICAgICAgU1RPUkFHRV9DSElMRFJFTiAgICA9IDcsCisgICAgICAgIE9CSkVDVF9DSElMRFJFTiAgICAgPSA4LAorICAgIH07CisKKyAgICBNdHBDbGllbnQqICBtQ2xpZW50OworICAgIGludCAgICAgICAgIG1RdWVyeVR5cGU7CisgICAgaW50ICAgICAgICAgbURldmljZUlEOworICAgIGludCAgICAgICAgIG1TdG9yYWdlSUQ7CisgICAgaW50ICAgICAgICAgbVFiamVjdElEOworICAgIGludCAgICAgICAgIG1Db2x1bW5Db3VudDsKKyAgICBpbnQqICAgICAgICBtQ29sdW1uczsKKworcHVibGljOgorICAgICAgICAgICAgICAgIE10cEN1cnNvcihNdHBDbGllbnQqIGNsaWVudCwgaW50IHF1ZXJ5VHlwZSwgaW50IGRldmljZUlELAorICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0b3JhZ2VJRCwgaW50IG9iamVjdElELCBpbnQgY29sdW1uQ291bnQsIGludCogY29sdW1ucyk7CisgICAgdmlydHVhbCAgICAgfk10cEN1cnNvcigpOworCisgICAgaW50ICAgICAgICAgZmlsbFdpbmRvdyhDdXJzb3JXaW5kb3cqIHdpbmRvdywgaW50IHN0YXJ0UG9zKTsKKworcHJpdmF0ZToKKyAgICBpbnQgICAgICAgICBmaWxsRGV2aWNlcyhDdXJzb3JXaW5kb3cqIHdpbmRvdywgaW50IHN0YXJ0UG9zKTsKKyAgICBpbnQgICAgICAgICBmaWxsRGV2aWNlKEN1cnNvcldpbmRvdyogd2luZG93LCBpbnQgc3RhcnRQb3MpOworICAgIGludCAgICAgICAgIGZpbGxTdG9yYWdlcyhDdXJzb3JXaW5kb3cqIHdpbmRvdywgaW50IHN0YXJ0UG9zKTsKKyAgICBpbnQgICAgICAgICBmaWxsU3RvcmFnZShDdXJzb3JXaW5kb3cqIHdpbmRvdywgaW50IHN0YXJ0UG9zKTsKKyAgICBpbnQgICAgICAgICBmaWxsT2JqZWN0cyhDdXJzb3JXaW5kb3cqIHdpbmRvdywgaW50IHBhcmVudCwgaW50IHN0YXJ0UG9zKTsKKyAgICBpbnQgICAgICAgICBmaWxsT2JqZWN0KEN1cnNvcldpbmRvdyogd2luZG93LCBpbnQgc3RhcnRQb3MpOworCisgICAgYm9vbCAgICAgICAgZmlsbERldmljZShDdXJzb3JXaW5kb3cqIHdpbmRvdywgTXRwRGV2aWNlKiBkZXZpY2UsIGludCBzdGFydFBvcyk7CisgICAgYm9vbCAgICAgICAgZmlsbFN0b3JhZ2UoQ3Vyc29yV2luZG93KiB3aW5kb3csIE10cERldmljZSogZGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgTXRwU3RvcmFnZUlEIHN0b3JhZ2VJRCwgaW50IHJvdyk7CisgICAgYm9vbCAgICAgICAgZmlsbE9iamVjdChDdXJzb3JXaW5kb3cqIHdpbmRvdywgTXRwRGV2aWNlKiBkZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICBNdHBPYmplY3RIYW5kbGUgb2JqZWN0SUQsIGludCByb3cpOworCisgICAgYm9vbCAgICAgICAgcHJlcGFyZVJvdyhDdXJzb3JXaW5kb3cqIHdpbmRvdyk7CisgICAgYm9vbCAgICAgICAgcHV0TG9uZyhDdXJzb3JXaW5kb3cqIHdpbmRvdywgaW50IHZhbHVlLCBpbnQgcm93LCBpbnQgY29sdW1uKTsKKyAgICBib29sICAgICAgICBwdXRTdHJpbmcoQ3Vyc29yV2luZG93KiB3aW5kb3csIGNvbnN0IGNoYXIqIHRleHQsIGludCByb3csIGludCBjb2x1bW4pOworICAgIGJvb2wgICAgICAgIHB1dFRodW1ibmFpbChDdXJzb3JXaW5kb3cqIHdpbmRvdywgaW50IG9iamVjdElELCBpbnQgZm9ybWF0LCBpbnQgcm93LCBpbnQgY29sdW1uKTsKK307CisKK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAvLyBfTVRQX0NVUlNPUl9ICmRpZmYgLS1naXQgYS9tZWRpYS9tdHAvTXRwRGF0YVBhY2tldC5jcHAgYi9tZWRpYS9tdHAvTXRwRGF0YVBhY2tldC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWM3OGZmMAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL210cC9NdHBEYXRhUGFja2V0LmNwcApAQCAtMCwwICsxLDQ4NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiTXRwRGF0YVBhY2tldCIKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKworI2luY2x1ZGUgPHVzYmhvc3QvdXNiaG9zdC5oPgorCisjaW5jbHVkZSAiTXRwRGF0YVBhY2tldC5oIgorI2luY2x1ZGUgIk10cFN0cmluZ0J1ZmZlci5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK010cERhdGFQYWNrZXQ6Ok10cERhdGFQYWNrZXQoKQorICAgIDogICBNdHBQYWNrZXQoNTEyKSwKKyAgICAgICAgbU9mZnNldChNVFBfQ09OVEFJTkVSX0hFQURFUl9TSVpFKQoreworfQorCitNdHBEYXRhUGFja2V0Ojp+TXRwRGF0YVBhY2tldCgpIHsKK30KKwordm9pZCBNdHBEYXRhUGFja2V0OjpyZXNldCgpIHsKKyAgICBNdHBQYWNrZXQ6OnJlc2V0KCk7CisgICAgbU9mZnNldCA9IE1UUF9DT05UQUlORVJfSEVBREVSX1NJWkU7Cit9CisKK3ZvaWQgTXRwRGF0YVBhY2tldDo6c2V0T3BlcmF0aW9uQ29kZShNdHBPcGVyYXRpb25Db2RlIGNvZGUpIHsKKyAgICBNdHBQYWNrZXQ6OnB1dFVJbnQxNihNVFBfQ09OVEFJTkVSX0NPREVfT0ZGU0VULCBjb2RlKTsKK30KKwordm9pZCBNdHBEYXRhUGFja2V0OjpzZXRUcmFuc2FjdGlvbklEKE10cFRyYW5zYWN0aW9uSUQgaWQpIHsKKyAgICBNdHBQYWNrZXQ6OnB1dFVJbnQzMihNVFBfQ09OVEFJTkVSX1RSQU5TQUNUSU9OX0lEX09GRlNFVCwgaWQpOworfQorCit1aW50MTZfdCBNdHBEYXRhUGFja2V0OjpnZXRVSW50MTYoKSB7CisgICAgaW50IG9mZnNldCA9IG1PZmZzZXQ7CisgICAgdWludDE2X3QgcmVzdWx0ID0gKHVpbnQxNl90KW1CdWZmZXJbb2Zmc2V0XSB8ICgodWludDE2X3QpbUJ1ZmZlcltvZmZzZXQgKyAxXSA8PCA4KTsKKyAgICBtT2Zmc2V0ICs9IDI7CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKwordWludDMyX3QgTXRwRGF0YVBhY2tldDo6Z2V0VUludDMyKCkgeworICAgIGludCBvZmZzZXQgPSBtT2Zmc2V0OworICAgIHVpbnQzMl90IHJlc3VsdCA9ICh1aW50MzJfdCltQnVmZmVyW29mZnNldF0gfCAoKHVpbnQzMl90KW1CdWZmZXJbb2Zmc2V0ICsgMV0gPDwgOCkgfAorICAgICAgICAgICAoKHVpbnQzMl90KW1CdWZmZXJbb2Zmc2V0ICsgMl0gPDwgMTYpICB8ICgodWludDMyX3QpbUJ1ZmZlcltvZmZzZXQgKyAzXSA8PCAyNCk7CisgICAgbU9mZnNldCArPSA0OworICAgIHJldHVybiByZXN1bHQ7Cit9CisKK3VpbnQ2NF90IE10cERhdGFQYWNrZXQ6OmdldFVJbnQ2NCgpIHsKKyAgICBpbnQgb2Zmc2V0ID0gbU9mZnNldDsKKyAgICB1aW50NjRfdCByZXN1bHQgPSAodWludDY0X3QpbUJ1ZmZlcltvZmZzZXRdIHwgKCh1aW50NjRfdCltQnVmZmVyW29mZnNldCArIDFdIDw8IDgpIHwKKyAgICAgICAgICAgKCh1aW50NjRfdCltQnVmZmVyW29mZnNldCArIDJdIDw8IDE2KSB8ICgodWludDY0X3QpbUJ1ZmZlcltvZmZzZXQgKyAzXSA8PCAyNCkgfAorICAgICAgICAgICAoKHVpbnQ2NF90KW1CdWZmZXJbb2Zmc2V0ICsgNF0gPDwgMzIpIHwgKCh1aW50NjRfdCltQnVmZmVyW29mZnNldCArIDVdIDw8IDQwKSB8CisgICAgICAgICAgICgodWludDY0X3QpbUJ1ZmZlcltvZmZzZXQgKyA2XSA8PCA0OCkgIHwgKCh1aW50NjRfdCltQnVmZmVyW29mZnNldCArIDddIDw8IDU2KTsKKyAgICBtT2Zmc2V0ICs9IDg7CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKwordm9pZCBNdHBEYXRhUGFja2V0OjpnZXRVSW50MTI4KHVpbnQxMjhfdCYgdmFsdWUpIHsKKyAgICB2YWx1ZVswXSA9IGdldFVJbnQzMigpOworICAgIHZhbHVlWzFdID0gZ2V0VUludDMyKCk7CisgICAgdmFsdWVbMl0gPSBnZXRVSW50MzIoKTsKKyAgICB2YWx1ZVszXSA9IGdldFVJbnQzMigpOworfQorCit2b2lkIE10cERhdGFQYWNrZXQ6OmdldFN0cmluZyhNdHBTdHJpbmdCdWZmZXImIHN0cmluZykKK3sKKyAgICBzdHJpbmcucmVhZEZyb21QYWNrZXQodGhpcyk7Cit9CisKK0ludDhMaXN0KiBNdHBEYXRhUGFja2V0OjpnZXRBSW50OCgpIHsKKyAgICBJbnQ4TGlzdCogcmVzdWx0ID0gbmV3IEludDhMaXN0OworICAgIGludCBjb3VudCA9IGdldFVJbnQzMigpOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykKKyAgICAgICAgcmVzdWx0LT5wdXNoKGdldEludDgoKSk7CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworVUludDhMaXN0KiBNdHBEYXRhUGFja2V0OjpnZXRBVUludDgoKSB7CisgICAgVUludDhMaXN0KiByZXN1bHQgPSBuZXcgVUludDhMaXN0OworICAgIGludCBjb3VudCA9IGdldFVJbnQzMigpOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykKKyAgICAgICAgcmVzdWx0LT5wdXNoKGdldFVJbnQ4KCkpOworICAgIHJldHVybiByZXN1bHQ7Cit9CisKK0ludDE2TGlzdCogTXRwRGF0YVBhY2tldDo6Z2V0QUludDE2KCkgeworICAgIEludDE2TGlzdCogcmVzdWx0ID0gbmV3IEludDE2TGlzdDsKKyAgICBpbnQgY291bnQgPSBnZXRVSW50MzIoKTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspCisgICAgICAgIHJlc3VsdC0+cHVzaChnZXRJbnQxNigpKTsKKyAgICByZXR1cm4gcmVzdWx0OworfQorCitVSW50MTZMaXN0KiBNdHBEYXRhUGFja2V0OjpnZXRBVUludDE2KCkgeworICAgIFVJbnQxNkxpc3QqIHJlc3VsdCA9IG5ldyBVSW50MTZMaXN0OworICAgIGludCBjb3VudCA9IGdldFVJbnQzMigpOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykKKyAgICAgICAgcmVzdWx0LT5wdXNoKGdldFVJbnQxNigpKTsKKyAgICByZXR1cm4gcmVzdWx0OworfQorCitJbnQzMkxpc3QqIE10cERhdGFQYWNrZXQ6OmdldEFJbnQzMigpIHsKKyAgICBJbnQzMkxpc3QqIHJlc3VsdCA9IG5ldyBJbnQzMkxpc3Q7CisgICAgaW50IGNvdW50ID0gZ2V0VUludDMyKCk7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKQorICAgICAgICByZXN1bHQtPnB1c2goZ2V0SW50MzIoKSk7CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworVUludDMyTGlzdCogTXRwRGF0YVBhY2tldDo6Z2V0QVVJbnQzMigpIHsKKyAgICBVSW50MzJMaXN0KiByZXN1bHQgPSBuZXcgVUludDMyTGlzdDsKKyAgICBpbnQgY291bnQgPSBnZXRVSW50MzIoKTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspCisgICAgICAgIHJlc3VsdC0+cHVzaChnZXRVSW50MzIoKSk7CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworSW50NjRMaXN0KiBNdHBEYXRhUGFja2V0OjpnZXRBSW50NjQoKSB7CisgICAgSW50NjRMaXN0KiByZXN1bHQgPSBuZXcgSW50NjRMaXN0OworICAgIGludCBjb3VudCA9IGdldFVJbnQzMigpOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykKKyAgICAgICAgcmVzdWx0LT5wdXNoKGdldEludDY0KCkpOworICAgIHJldHVybiByZXN1bHQ7Cit9CisKK1VJbnQ2NExpc3QqIE10cERhdGFQYWNrZXQ6OmdldEFVSW50NjQoKSB7CisgICAgVUludDY0TGlzdCogcmVzdWx0ID0gbmV3IFVJbnQ2NExpc3Q7CisgICAgaW50IGNvdW50ID0gZ2V0VUludDMyKCk7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKQorICAgICAgICByZXN1bHQtPnB1c2goZ2V0VUludDY0KCkpOworICAgIHJldHVybiByZXN1bHQ7Cit9CisKK3ZvaWQgTXRwRGF0YVBhY2tldDo6cHV0SW50OChpbnQ4X3QgdmFsdWUpIHsKKyAgICBhbGxvY2F0ZShtT2Zmc2V0ICsgMSk7CisgICAgbUJ1ZmZlclttT2Zmc2V0KytdID0gKHVpbnQ4X3QpdmFsdWU7CisgICAgaWYgKG1QYWNrZXRTaXplIDwgbU9mZnNldCkKKyAgICAgICAgbVBhY2tldFNpemUgPSBtT2Zmc2V0OworfQorCit2b2lkIE10cERhdGFQYWNrZXQ6OnB1dFVJbnQ4KHVpbnQ4X3QgdmFsdWUpIHsKKyAgICBhbGxvY2F0ZShtT2Zmc2V0ICsgMSk7CisgICAgbUJ1ZmZlclttT2Zmc2V0KytdID0gKHVpbnQ4X3QpdmFsdWU7CisgICAgaWYgKG1QYWNrZXRTaXplIDwgbU9mZnNldCkKKyAgICAgICAgbVBhY2tldFNpemUgPSBtT2Zmc2V0OworfQorCit2b2lkIE10cERhdGFQYWNrZXQ6OnB1dEludDE2KGludDE2X3QgdmFsdWUpIHsKKyAgICBhbGxvY2F0ZShtT2Zmc2V0ICsgMik7CisgICAgbUJ1ZmZlclttT2Zmc2V0KytdID0gKHVpbnQ4X3QpKHZhbHVlICYgMHhGRik7CisgICAgbUJ1ZmZlclttT2Zmc2V0KytdID0gKHVpbnQ4X3QpKCh2YWx1ZSA+PiA4KSAmIDB4RkYpOworICAgIGlmIChtUGFja2V0U2l6ZSA8IG1PZmZzZXQpCisgICAgICAgIG1QYWNrZXRTaXplID0gbU9mZnNldDsKK30KKwordm9pZCBNdHBEYXRhUGFja2V0OjpwdXRVSW50MTYodWludDE2X3QgdmFsdWUpIHsKKyAgICBhbGxvY2F0ZShtT2Zmc2V0ICsgMik7CisgICAgbUJ1ZmZlclttT2Zmc2V0KytdID0gKHVpbnQ4X3QpKHZhbHVlICYgMHhGRik7CisgICAgbUJ1ZmZlclttT2Zmc2V0KytdID0gKHVpbnQ4X3QpKCh2YWx1ZSA+PiA4KSAmIDB4RkYpOworICAgIGlmIChtUGFja2V0U2l6ZSA8IG1PZmZzZXQpCisgICAgICAgIG1QYWNrZXRTaXplID0gbU9mZnNldDsKK30KKwordm9pZCBNdHBEYXRhUGFja2V0OjpwdXRJbnQzMihpbnQzMl90IHZhbHVlKSB7CisgICAgYWxsb2NhdGUobU9mZnNldCArIDQpOworICAgIG1CdWZmZXJbbU9mZnNldCsrXSA9ICh1aW50OF90KSh2YWx1ZSAmIDB4RkYpOworICAgIG1CdWZmZXJbbU9mZnNldCsrXSA9ICh1aW50OF90KSgodmFsdWUgPj4gOCkgJiAweEZGKTsKKyAgICBtQnVmZmVyW21PZmZzZXQrK10gPSAodWludDhfdCkoKHZhbHVlID4+IDE2KSAmIDB4RkYpOworICAgIG1CdWZmZXJbbU9mZnNldCsrXSA9ICh1aW50OF90KSgodmFsdWUgPj4gMjQpICYgMHhGRik7CisgICAgaWYgKG1QYWNrZXRTaXplIDwgbU9mZnNldCkKKyAgICAgICAgbVBhY2tldFNpemUgPSBtT2Zmc2V0OworfQorCit2b2lkIE10cERhdGFQYWNrZXQ6OnB1dFVJbnQzMih1aW50MzJfdCB2YWx1ZSkgeworICAgIGFsbG9jYXRlKG1PZmZzZXQgKyA0KTsKKyAgICBtQnVmZmVyW21PZmZzZXQrK10gPSAodWludDhfdCkodmFsdWUgJiAweEZGKTsKKyAgICBtQnVmZmVyW21PZmZzZXQrK10gPSAodWludDhfdCkoKHZhbHVlID4+IDgpICYgMHhGRik7CisgICAgbUJ1ZmZlclttT2Zmc2V0KytdID0gKHVpbnQ4X3QpKCh2YWx1ZSA+PiAxNikgJiAweEZGKTsKKyAgICBtQnVmZmVyW21PZmZzZXQrK10gPSAodWludDhfdCkoKHZhbHVlID4+IDI0KSAmIDB4RkYpOworICAgIGlmIChtUGFja2V0U2l6ZSA8IG1PZmZzZXQpCisgICAgICAgIG1QYWNrZXRTaXplID0gbU9mZnNldDsKK30KKwordm9pZCBNdHBEYXRhUGFja2V0OjpwdXRJbnQ2NChpbnQ2NF90IHZhbHVlKSB7CisgICAgYWxsb2NhdGUobU9mZnNldCArIDgpOworICAgIG1CdWZmZXJbbU9mZnNldCsrXSA9ICh1aW50OF90KSh2YWx1ZSAmIDB4RkYpOworICAgIG1CdWZmZXJbbU9mZnNldCsrXSA9ICh1aW50OF90KSgodmFsdWUgPj4gOCkgJiAweEZGKTsKKyAgICBtQnVmZmVyW21PZmZzZXQrK10gPSAodWludDhfdCkoKHZhbHVlID4+IDE2KSAmIDB4RkYpOworICAgIG1CdWZmZXJbbU9mZnNldCsrXSA9ICh1aW50OF90KSgodmFsdWUgPj4gMjQpICYgMHhGRik7CisgICAgbUJ1ZmZlclttT2Zmc2V0KytdID0gKHVpbnQ4X3QpKCh2YWx1ZSA+PiAzMikgJiAweEZGKTsKKyAgICBtQnVmZmVyW21PZmZzZXQrK10gPSAodWludDhfdCkoKHZhbHVlID4+IDQwKSAmIDB4RkYpOworICAgIG1CdWZmZXJbbU9mZnNldCsrXSA9ICh1aW50OF90KSgodmFsdWUgPj4gNDgpICYgMHhGRik7CisgICAgbUJ1ZmZlclttT2Zmc2V0KytdID0gKHVpbnQ4X3QpKCh2YWx1ZSA+PiA1NikgJiAweEZGKTsKKyAgICBpZiAobVBhY2tldFNpemUgPCBtT2Zmc2V0KQorICAgICAgICBtUGFja2V0U2l6ZSA9IG1PZmZzZXQ7Cit9CisKK3ZvaWQgTXRwRGF0YVBhY2tldDo6cHV0VUludDY0KHVpbnQ2NF90IHZhbHVlKSB7CisgICAgYWxsb2NhdGUobU9mZnNldCArIDgpOworICAgIG1CdWZmZXJbbU9mZnNldCsrXSA9ICh1aW50OF90KSh2YWx1ZSAmIDB4RkYpOworICAgIG1CdWZmZXJbbU9mZnNldCsrXSA9ICh1aW50OF90KSgodmFsdWUgPj4gOCkgJiAweEZGKTsKKyAgICBtQnVmZmVyW21PZmZzZXQrK10gPSAodWludDhfdCkoKHZhbHVlID4+IDE2KSAmIDB4RkYpOworICAgIG1CdWZmZXJbbU9mZnNldCsrXSA9ICh1aW50OF90KSgodmFsdWUgPj4gMjQpICYgMHhGRik7CisgICAgbUJ1ZmZlclttT2Zmc2V0KytdID0gKHVpbnQ4X3QpKCh2YWx1ZSA+PiAzMikgJiAweEZGKTsKKyAgICBtQnVmZmVyW21PZmZzZXQrK10gPSAodWludDhfdCkoKHZhbHVlID4+IDQwKSAmIDB4RkYpOworICAgIG1CdWZmZXJbbU9mZnNldCsrXSA9ICh1aW50OF90KSgodmFsdWUgPj4gNDgpICYgMHhGRik7CisgICAgbUJ1ZmZlclttT2Zmc2V0KytdID0gKHVpbnQ4X3QpKCh2YWx1ZSA+PiA1NikgJiAweEZGKTsKKyAgICBpZiAobVBhY2tldFNpemUgPCBtT2Zmc2V0KQorICAgICAgICBtUGFja2V0U2l6ZSA9IG1PZmZzZXQ7Cit9CisKK3ZvaWQgTXRwRGF0YVBhY2tldDo6cHV0SW50MTI4KGNvbnN0IGludDEyOF90JiB2YWx1ZSkgeworICAgIHB1dEludDMyKHZhbHVlWzBdKTsKKyAgICBwdXRJbnQzMih2YWx1ZVsxXSk7CisgICAgcHV0SW50MzIodmFsdWVbMl0pOworICAgIHB1dEludDMyKHZhbHVlWzNdKTsKK30KKwordm9pZCBNdHBEYXRhUGFja2V0OjpwdXRVSW50MTI4KGNvbnN0IHVpbnQxMjhfdCYgdmFsdWUpIHsKKyAgICBwdXRVSW50MzIodmFsdWVbMF0pOworICAgIHB1dFVJbnQzMih2YWx1ZVsxXSk7CisgICAgcHV0VUludDMyKHZhbHVlWzJdKTsKKyAgICBwdXRVSW50MzIodmFsdWVbM10pOworfQorCit2b2lkIE10cERhdGFQYWNrZXQ6OnB1dEludDEyOChpbnQ2NF90IHZhbHVlKSB7CisgICAgcHV0SW50NjQodmFsdWUpOworICAgIHB1dEludDY0KHZhbHVlIDwgMCA/IC0xIDogMCk7Cit9CisKK3ZvaWQgTXRwRGF0YVBhY2tldDo6cHV0VUludDEyOCh1aW50NjRfdCB2YWx1ZSkgeworICAgIHB1dFVJbnQ2NCh2YWx1ZSk7CisgICAgcHV0VUludDY0KDApOworfQorCit2b2lkIE10cERhdGFQYWNrZXQ6OnB1dEFJbnQ4KGNvbnN0IGludDhfdCogdmFsdWVzLCBpbnQgY291bnQpIHsKKyAgICBwdXRVSW50MzIoY291bnQpOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykKKyAgICAgICAgcHV0SW50OCgqdmFsdWVzKyspOworfQorCit2b2lkIE10cERhdGFQYWNrZXQ6OnB1dEFVSW50OChjb25zdCB1aW50OF90KiB2YWx1ZXMsIGludCBjb3VudCkgeworICAgIHB1dFVJbnQzMihjb3VudCk7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKQorICAgICAgICBwdXRVSW50OCgqdmFsdWVzKyspOworfQorCit2b2lkIE10cERhdGFQYWNrZXQ6OnB1dEFJbnQxNihjb25zdCBpbnQxNl90KiB2YWx1ZXMsIGludCBjb3VudCkgeworICAgIHB1dFVJbnQzMihjb3VudCk7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKQorICAgICAgICBwdXRJbnQxNigqdmFsdWVzKyspOworfQorCit2b2lkIE10cERhdGFQYWNrZXQ6OnB1dEFVSW50MTYoY29uc3QgdWludDE2X3QqIHZhbHVlcywgaW50IGNvdW50KSB7CisgICAgcHV0VUludDMyKGNvdW50KTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspCisgICAgICAgIHB1dFVJbnQxNigqdmFsdWVzKyspOworfQorCit2b2lkIE10cERhdGFQYWNrZXQ6OnB1dEFVSW50MTYoY29uc3QgVUludDE2TGlzdCogdmFsdWVzKSB7CisgICAgc2l6ZV90IGNvdW50ID0gKHZhbHVlcyA/IHZhbHVlcy0+c2l6ZSgpIDogMCk7CisgICAgcHV0VUludDMyKGNvdW50KTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGNvdW50OyBpKyspCisgICAgICAgIHB1dFVJbnQxNigoKnZhbHVlcylbaV0pOworfQorCit2b2lkIE10cERhdGFQYWNrZXQ6OnB1dEFJbnQzMihjb25zdCBpbnQzMl90KiB2YWx1ZXMsIGludCBjb3VudCkgeworICAgIHB1dFVJbnQzMihjb3VudCk7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKQorICAgICAgICBwdXRJbnQzMigqdmFsdWVzKyspOworfQorCit2b2lkIE10cERhdGFQYWNrZXQ6OnB1dEFVSW50MzIoY29uc3QgdWludDMyX3QqIHZhbHVlcywgaW50IGNvdW50KSB7CisgICAgcHV0VUludDMyKGNvdW50KTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspCisgICAgICAgIHB1dFVJbnQzMigqdmFsdWVzKyspOworfQorCit2b2lkIE10cERhdGFQYWNrZXQ6OnB1dEFVSW50MzIoY29uc3QgVUludDMyTGlzdCogbGlzdCkgeworICAgIGlmICghbGlzdCkgeworICAgICAgICBwdXRFbXB0eUFycmF5KCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgc2l6ZV90IHNpemUgPSBsaXN0LT5zaXplKCk7CisgICAgICAgIHB1dFVJbnQzMihzaXplKTsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplOyBpKyspCisgICAgICAgICAgICBwdXRVSW50MzIoKCpsaXN0KVtpXSk7CisgICAgfQorfQorCit2b2lkIE10cERhdGFQYWNrZXQ6OnB1dEFJbnQ2NChjb25zdCBpbnQ2NF90KiB2YWx1ZXMsIGludCBjb3VudCkgeworICAgIHB1dFVJbnQzMihjb3VudCk7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKQorICAgICAgICBwdXRJbnQ2NCgqdmFsdWVzKyspOworfQorCit2b2lkIE10cERhdGFQYWNrZXQ6OnB1dEFVSW50NjQoY29uc3QgdWludDY0X3QqIHZhbHVlcywgaW50IGNvdW50KSB7CisgICAgcHV0VUludDMyKGNvdW50KTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspCisgICAgICAgIHB1dFVJbnQ2NCgqdmFsdWVzKyspOworfQorCit2b2lkIE10cERhdGFQYWNrZXQ6OnB1dFN0cmluZyhjb25zdCBNdHBTdHJpbmdCdWZmZXImIHN0cmluZykgeworICAgIHN0cmluZy53cml0ZVRvUGFja2V0KHRoaXMpOworfQorCit2b2lkIE10cERhdGFQYWNrZXQ6OnB1dFN0cmluZyhjb25zdCBjaGFyKiBzKSB7CisgICAgTXRwU3RyaW5nQnVmZmVyIHN0cmluZyhzKTsKKyAgICBzdHJpbmcud3JpdGVUb1BhY2tldCh0aGlzKTsKK30KKwordm9pZCBNdHBEYXRhUGFja2V0OjpwdXRTdHJpbmcoY29uc3QgdWludDE2X3QqIHN0cmluZykgeworICAgIGludCBjb3VudCA9IDA7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAyNTY7IGkrKykgeworICAgICAgICBpZiAoc3RyaW5nW2ldKQorICAgICAgICAgICAgY291bnQrKzsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorICAgIHB1dFVJbnQ4KGNvdW50ID4gMCA/IGNvdW50ICsgMSA6IDApOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykKKyAgICAgICAgcHV0VUludDE2KHN0cmluZ1tpXSk7CisgICAgLy8gb25seSB0ZXJtaW5hdGUgd2l0aCB6ZXJvIGlmIHN0cmluZyBpcyBub3QgZW1wdHkKKyAgICBpZiAoY291bnQgPiAwKQorICAgICAgICBwdXRVSW50MTYoMCk7Cit9CisKKyNpZmRlZiBNVFBfREVWSUNFIAoraW50IE10cERhdGFQYWNrZXQ6OnJlYWQoaW50IGZkKSB7CisgICAgLy8gZmlyc3QgcmVhZCB0aGUgaGVhZGVyCisgICAgaW50IHJldCA9IDo6cmVhZChmZCwgbUJ1ZmZlciwgTVRQX0NPTlRBSU5FUl9IRUFERVJfU0laRSk7CisgICAgaWYgKHJldCAhPSBNVFBfQ09OVEFJTkVSX0hFQURFUl9TSVpFKQorICAgICAgICByZXR1cm4gLTE7CisgICAgLy8gdGhlbiB0aGUgZm9sbG93aW5nIGRhdGEKKyAgICBpbnQgdG90YWwgPSBNdHBQYWNrZXQ6OmdldFVJbnQzMihNVFBfQ09OVEFJTkVSX0xFTkdUSF9PRkZTRVQpOworICAgIGludCByZW1haW5pbmcgPSB0b3RhbCAtIE1UUF9DT05UQUlORVJfSEVBREVSX1NJWkU7CisgICAgcmV0ID0gOjpyZWFkKGZkLCAmbUJ1ZmZlclswXSArIE1UUF9DT05UQUlORVJfSEVBREVSX1NJWkUsIHJlbWFpbmluZyk7CisgICAgaWYgKHJldCAhPSByZW1haW5pbmcpCisgICAgICAgIHJldHVybiAtMTsKKworICAgIG1QYWNrZXRTaXplID0gdG90YWw7CisgICAgbU9mZnNldCA9IE1UUF9DT05UQUlORVJfSEVBREVSX1NJWkU7CisgICAgcmV0dXJuIHRvdGFsOworfQorCitpbnQgTXRwRGF0YVBhY2tldDo6cmVhZERhdGFIZWFkZXIoaW50IGZkKSB7CisgICAgaW50IHJldCA9IDo6cmVhZChmZCwgbUJ1ZmZlciwgTVRQX0NPTlRBSU5FUl9IRUFERVJfU0laRSk7CisgICAgaWYgKHJldCA+IDApCisgICAgICAgIG1QYWNrZXRTaXplID0gcmV0OworICAgIGVsc2UKKyAgICAgICAgbVBhY2tldFNpemUgPSAwOworICAgIHJldHVybiByZXQ7Cit9CisKK2ludCBNdHBEYXRhUGFja2V0Ojp3cml0ZShpbnQgZmQpIHsKKyAgICBNdHBQYWNrZXQ6OnB1dFVJbnQzMihNVFBfQ09OVEFJTkVSX0xFTkdUSF9PRkZTRVQsIG1QYWNrZXRTaXplKTsKKyAgICBNdHBQYWNrZXQ6OnB1dFVJbnQxNihNVFBfQ09OVEFJTkVSX1RZUEVfT0ZGU0VULCBNVFBfQ09OVEFJTkVSX1RZUEVfREFUQSk7CisgICAgZHVtcCgpOworICAgIC8vIHNlbmQgaGVhZGVyIHNlcGFyYXRlbHkgZnJvbSBkYXRhCisgICAgaW50IHJldCA9IDo6d3JpdGUoZmQsIG1CdWZmZXIsIE1UUF9DT05UQUlORVJfSEVBREVSX1NJWkUpOworICAgIGlmIChyZXQgPT0gTVRQX0NPTlRBSU5FUl9IRUFERVJfU0laRSkKKyAgICAgICAgcmV0ID0gOjp3cml0ZShmZCwgbUJ1ZmZlciArIE1UUF9DT05UQUlORVJfSEVBREVSX1NJWkUsCisgICAgICAgICAgICAgICAgICAgICAgICBtUGFja2V0U2l6ZSAtIE1UUF9DT05UQUlORVJfSEVBREVSX1NJWkUpOworICAgIHJldHVybiAocmV0IDwgMCA/IHJldCA6IDApOworfQorCitpbnQgTXRwRGF0YVBhY2tldDo6d3JpdGVEYXRhSGVhZGVyKGludCBmZCwgdWludDMyX3QgbGVuZ3RoKSB7CisgICAgTXRwUGFja2V0OjpwdXRVSW50MzIoTVRQX0NPTlRBSU5FUl9MRU5HVEhfT0ZGU0VULCBsZW5ndGgpOworICAgIE10cFBhY2tldDo6cHV0VUludDE2KE1UUF9DT05UQUlORVJfVFlQRV9PRkZTRVQsIE1UUF9DT05UQUlORVJfVFlQRV9EQVRBKTsKKyAgICBpbnQgcmV0ID0gOjp3cml0ZShmZCwgbUJ1ZmZlciwgTVRQX0NPTlRBSU5FUl9IRUFERVJfU0laRSk7CisgICAgcmV0dXJuIChyZXQgPCAwID8gcmV0IDogMCk7Cit9CisjZW5kaWYgLy8gTVRQX0RFVklDRQorCisjaWZkZWYgTVRQX0hPU1QKK2ludCBNdHBEYXRhUGFja2V0OjpyZWFkKHN0cnVjdCB1c2JfZW5kcG9pbnQgKmVwKSB7CisgICAgLy8gZmlyc3QgcmVhZCB0aGUgaGVhZGVyCisgICAgaW50IGxlbmd0aCA9IHRyYW5zZmVyKGVwLCBtQnVmZmVyLCBtQnVmZmVyU2l6ZSk7CisgICAgaWYgKGxlbmd0aCA+PSBNVFBfQ09OVEFJTkVSX0hFQURFUl9TSVpFKSB7CisgICAgICAgIC8vIGxvb2sgYXQgdGhlIGxlbmd0aCBmaWVsZCB0byBzZWUgaWYgdGhlIGRhdGEgc3BhbnMgbXVsdGlwbGUgcGFja2V0cworICAgICAgICB1aW50MzJfdCB0b3RhbExlbmd0aCA9IE10cFBhY2tldDo6Z2V0VUludDMyKE1UUF9DT05UQUlORVJfTEVOR1RIX09GRlNFVCk7CisgICAgICAgIHdoaWxlICh0b3RhbExlbmd0aCA+IGxlbmd0aCkgeworICAgICAgICAgICAgYWxsb2NhdGUobGVuZ3RoICsgbUFsbG9jYXRpb25JbmNyZW1lbnQpOworICAgICAgICAgICAgaW50IHJldCA9IHRyYW5zZmVyKGVwLCBtQnVmZmVyICsgbGVuZ3RoLCBtQWxsb2NhdGlvbkluY3JlbWVudCk7CisgICAgICAgICAgICBpZiAocmV0ID49IDApCisgICAgICAgICAgICAgICAgbGVuZ3RoICs9IHJldDsKKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIGxlbmd0aCA9IHJldDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAobGVuZ3RoID49IDApCisgICAgICAgIG1QYWNrZXRTaXplID0gbGVuZ3RoOworICAgIHJldHVybiBsZW5ndGg7Cit9CisKK2ludCBNdHBEYXRhUGFja2V0OjpyZWFkRGF0YShzdHJ1Y3QgdXNiX2VuZHBvaW50ICplcCwgdm9pZCogYnVmZmVyLCBpbnQgbGVuZ3RoKSB7CisgICAgaW50IHBhY2tldFNpemUgPSB1c2JfZW5kcG9pbnRfbWF4X3BhY2tldChlcCk7CisgICAgaW50IHJlYWQgPSAwOworICAgIHdoaWxlIChyZWFkIDwgbGVuZ3RoKSB7CisgICAgICAgIGludCByZXQgPSB0cmFuc2ZlcihlcCwgKGNoYXIgKilidWZmZXIgKyByZWFkLCBwYWNrZXRTaXplKTsKKyAgICAgICAgaWYgKHJldCA8IDApIHsKK3ByaW50ZigiTXRwRGF0YVBhY2tldDo6cmVhZERhdGEgcmV0dXJuaW5nICVkXG4iLCByZXQpOworICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgfQorICAgICAgICByZWFkICs9IHJldDsKKyAgICB9CitwcmludGYoIk10cERhdGFQYWNrZXQ6OnJlYWREYXRhIHJldHVybmluZyAlZFxuIiwgcmVhZCk7CisgICAgcmV0dXJuIHJlYWQ7Cit9CisKK2ludCBNdHBEYXRhUGFja2V0OjpyZWFkRGF0YUhlYWRlcihzdHJ1Y3QgdXNiX2VuZHBvaW50ICplcCkgeworICAgIGludCBsZW5ndGggPSB0cmFuc2ZlcihlcCwgbUJ1ZmZlciwgdXNiX2VuZHBvaW50X21heF9wYWNrZXQoZXApKTsKKyAgICBpZiAobGVuZ3RoID49IDApCisgICAgICAgIG1QYWNrZXRTaXplID0gbGVuZ3RoOworICAgIHJldHVybiBsZW5ndGg7Cit9CisKK2ludCBNdHBEYXRhUGFja2V0Ojp3cml0ZURhdGFIZWFkZXIoc3RydWN0IHVzYl9lbmRwb2ludCAqZXAsIHVpbnQzMl90IGxlbmd0aCkgeworICAgIE10cFBhY2tldDo6cHV0VUludDMyKE1UUF9DT05UQUlORVJfTEVOR1RIX09GRlNFVCwgbGVuZ3RoKTsKKyAgICBNdHBQYWNrZXQ6OnB1dFVJbnQxNihNVFBfQ09OVEFJTkVSX1RZUEVfT0ZGU0VULCBNVFBfQ09OVEFJTkVSX1RZUEVfREFUQSk7CisgICAgaW50IHJldCA9IHRyYW5zZmVyKGVwLCBtQnVmZmVyLCBNVFBfQ09OVEFJTkVSX0hFQURFUl9TSVpFKTsKKyAgICByZXR1cm4gKHJldCA8IDAgPyByZXQgOiAwKTsKK30KKworaW50IE10cERhdGFQYWNrZXQ6OndyaXRlKHN0cnVjdCB1c2JfZW5kcG9pbnQgKmVwKSB7CisgICAgTXRwUGFja2V0OjpwdXRVSW50MzIoTVRQX0NPTlRBSU5FUl9MRU5HVEhfT0ZGU0VULCBtUGFja2V0U2l6ZSk7CisgICAgTXRwUGFja2V0OjpwdXRVSW50MTYoTVRQX0NPTlRBSU5FUl9UWVBFX09GRlNFVCwgTVRQX0NPTlRBSU5FUl9UWVBFX0RBVEEpOworCisgICAgLy8gc2VuZCBoZWFkZXIgc2VwYXJhdGVseSBmcm9tIGRhdGEKKyAgICBpbnQgcmV0ID0gdHJhbnNmZXIoZXAsIG1CdWZmZXIsIE1UUF9DT05UQUlORVJfSEVBREVSX1NJWkUpOworICAgIGlmIChyZXQgPT0gTVRQX0NPTlRBSU5FUl9IRUFERVJfU0laRSkKKyAgICAgICAgcmV0ID0gdHJhbnNmZXIoZXAsIG1CdWZmZXIgKyBNVFBfQ09OVEFJTkVSX0hFQURFUl9TSVpFLAorICAgICAgICAgICAgICAgICAgICAgICAgbVBhY2tldFNpemUgLSBNVFBfQ09OVEFJTkVSX0hFQURFUl9TSVpFKTsKKyAgICByZXR1cm4gKHJldCA8IDAgPyByZXQgOiAwKTsKK30KKworaW50IE10cERhdGFQYWNrZXQ6OndyaXRlKHN0cnVjdCB1c2JfZW5kcG9pbnQgKmVwLCB2b2lkKiBidWZmZXIsIHVpbnQzMl90IGxlbmd0aCkgeworICAgIGludCByZXQgPSAwOworICAgIGludCBwYWNrZXRTaXplID0gdXNiX2VuZHBvaW50X21heF9wYWNrZXQoZXApOworICAgIHdoaWxlIChsZW5ndGggPiAwKSB7CisgICAgICAgIGludCB3cml0ZSA9IChsZW5ndGggPiBwYWNrZXRTaXplID8gcGFja2V0U2l6ZSA6IGxlbmd0aCk7CisgICAgICAgIGludCByZXQgPSB0cmFuc2ZlcihlcCwgYnVmZmVyLCB3cml0ZSk7CisgICAgICAgIGlmIChyZXQgPCAwKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGxlbmd0aCAtPSByZXQ7CisgICAgfQorICAgIHJldHVybiAocmV0IDwgMCA/IHJldCA6IDApOworfQorCisjZW5kaWYgLy8gTVRQX0hPU1QKKwordm9pZCogTXRwRGF0YVBhY2tldDo6Z2V0RGF0YShpbnQmIG91dExlbmd0aCkgY29uc3QgeworICAgIGludCBsZW5ndGggPSBtUGFja2V0U2l6ZSAtIE1UUF9DT05UQUlORVJfSEVBREVSX1NJWkU7CisgICAgaWYgKGxlbmd0aCA+IDApIHsKKyAgICAgICAgdm9pZCogcmVzdWx0ID0gbWFsbG9jKGxlbmd0aCk7CisgICAgICAgIGlmIChyZXN1bHQpIHsKKyAgICAgICAgICAgIG1lbWNweShyZXN1bHQsIG1CdWZmZXIgKyBNVFBfQ09OVEFJTkVSX0hFQURFUl9TSVpFLCBsZW5ndGgpOworICAgICAgICAgICAgb3V0TGVuZ3RoID0gbGVuZ3RoOworICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgfQorICAgIH0KKyAgICBvdXRMZW5ndGggPSAwOworICAgIHJldHVybiBOVUxMOworfQorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbXRwL010cERhdGFQYWNrZXQuaCBiL21lZGlhL210cC9NdHBEYXRhUGFja2V0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmFiNmEwNwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL210cC9NdHBEYXRhUGFja2V0LmgKQEAgLTAsMCArMSwxMTggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9NVFBfREFUQV9QQUNLRVRfSAorI2RlZmluZSBfTVRQX0RBVEFfUEFDS0VUX0gKKworI2luY2x1ZGUgIk10cFBhY2tldC5oIgorI2luY2x1ZGUgIm10cC5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NsYXNzIE10cFN0cmluZ0J1ZmZlcjsKKworY2xhc3MgTXRwRGF0YVBhY2tldCA6IHB1YmxpYyBNdHBQYWNrZXQgeworcHJpdmF0ZToKKyAgICAvLyBjdXJyZW50IG9mZnNldCBmb3IgZ2V0L3B1dCBtZXRob2RzCisgICAgaW50ICAgICAgICAgICAgICAgICBtT2Zmc2V0OworCitwdWJsaWM6CisgICAgICAgICAgICAgICAgICAgICAgICBNdHBEYXRhUGFja2V0KCk7CisgICAgdmlydHVhbCAgICAgICAgICAgICB+TXRwRGF0YVBhY2tldCgpOworCisgICAgdmlydHVhbCB2b2lkICAgICAgICByZXNldCgpOworCisgICAgdm9pZCAgICAgICAgICAgICAgICBzZXRPcGVyYXRpb25Db2RlKE10cE9wZXJhdGlvbkNvZGUgY29kZSk7CisgICAgdm9pZCAgICAgICAgICAgICAgICBzZXRUcmFuc2FjdGlvbklEKE10cFRyYW5zYWN0aW9uSUQgaWQpOworCisgICAgaW5saW5lIHVpbnQ4X3QgICAgICBnZXRVSW50OCgpIHsgcmV0dXJuICh1aW50OF90KW1CdWZmZXJbbU9mZnNldCsrXTsgfQorICAgIGlubGluZSBpbnQ4X3QgICAgICAgZ2V0SW50OCgpIHsgcmV0dXJuIChpbnQ4X3QpbUJ1ZmZlclttT2Zmc2V0KytdOyB9CisgICAgdWludDE2X3QgICAgICAgICAgICBnZXRVSW50MTYoKTsKKyAgICBpbmxpbmUgaW50MTZfdCAgICAgIGdldEludDE2KCkgeyByZXR1cm4gKGludDE2X3QpZ2V0VUludDE2KCk7IH0KKyAgICB1aW50MzJfdCAgICAgICAgICAgIGdldFVJbnQzMigpOworICAgIGlubGluZSBpbnQzMl90ICAgICAgZ2V0SW50MzIoKSB7IHJldHVybiAoaW50MzJfdClnZXRVSW50MzIoKTsgfQorICAgIHVpbnQ2NF90ICAgICAgICAgICAgZ2V0VUludDY0KCk7CisgICAgaW5saW5lIGludDY0X3QgICAgICBnZXRJbnQ2NCgpIHsgcmV0dXJuIChpbnQ2NF90KWdldFVJbnQ2NCgpOyB9CisgICAgdm9pZCAgICAgICAgICAgICAgICBnZXRVSW50MTI4KHVpbnQxMjhfdCYgdmFsdWUpOworICAgIGlubGluZSB2b2lkICAgICAgICAgZ2V0SW50MTI4KGludDEyOF90JiB2YWx1ZSkgeyBnZXRVSW50MTI4KCh1aW50MTI4X3QmKXZhbHVlKTsgfQorICAgIHZvaWQgICAgICAgICAgICAgICAgZ2V0U3RyaW5nKE10cFN0cmluZ0J1ZmZlciYgc3RyaW5nKTsKKworICAgIEludDhMaXN0KiAgICAgICAgICAgZ2V0QUludDgoKTsKKyAgICBVSW50OExpc3QqICAgICAgICAgIGdldEFVSW50OCgpOworICAgIEludDE2TGlzdCogICAgICAgICAgZ2V0QUludDE2KCk7CisgICAgVUludDE2TGlzdCogICAgICAgICBnZXRBVUludDE2KCk7CisgICAgSW50MzJMaXN0KiAgICAgICAgICBnZXRBSW50MzIoKTsKKyAgICBVSW50MzJMaXN0KiAgICAgICAgIGdldEFVSW50MzIoKTsKKyAgICBJbnQ2NExpc3QqICAgICAgICAgIGdldEFJbnQ2NCgpOworICAgIFVJbnQ2NExpc3QqICAgICAgICAgZ2V0QVVJbnQ2NCgpOworCisgICAgdm9pZCAgICAgICAgICAgICAgICBwdXRJbnQ4KGludDhfdCB2YWx1ZSk7CisgICAgdm9pZCAgICAgICAgICAgICAgICBwdXRVSW50OCh1aW50OF90IHZhbHVlKTsKKyAgICB2b2lkICAgICAgICAgICAgICAgIHB1dEludDE2KGludDE2X3QgdmFsdWUpOworICAgIHZvaWQgICAgICAgICAgICAgICAgcHV0VUludDE2KHVpbnQxNl90IHZhbHVlKTsKKyAgICB2b2lkICAgICAgICAgICAgICAgIHB1dEludDMyKGludDMyX3QgdmFsdWUpOworICAgIHZvaWQgICAgICAgICAgICAgICAgcHV0VUludDMyKHVpbnQzMl90IHZhbHVlKTsKKyAgICB2b2lkICAgICAgICAgICAgICAgIHB1dEludDY0KGludDY0X3QgdmFsdWUpOworICAgIHZvaWQgICAgICAgICAgICAgICAgcHV0VUludDY0KHVpbnQ2NF90IHZhbHVlKTsKKyAgICB2b2lkICAgICAgICAgICAgICAgIHB1dEludDEyOChjb25zdCBpbnQxMjhfdCYgdmFsdWUpOworICAgIHZvaWQgICAgICAgICAgICAgICAgcHV0VUludDEyOChjb25zdCB1aW50MTI4X3QmIHZhbHVlKTsKKyAgICB2b2lkICAgICAgICAgICAgICAgIHB1dEludDEyOChpbnQ2NF90IHZhbHVlKTsKKyAgICB2b2lkICAgICAgICAgICAgICAgIHB1dFVJbnQxMjgodWludDY0X3QgdmFsdWUpOworCisgICAgdm9pZCAgICAgICAgICAgICAgICBwdXRBSW50OChjb25zdCBpbnQ4X3QqIHZhbHVlcywgaW50IGNvdW50KTsKKyAgICB2b2lkICAgICAgICAgICAgICAgIHB1dEFVSW50OChjb25zdCB1aW50OF90KiB2YWx1ZXMsIGludCBjb3VudCk7CisgICAgdm9pZCAgICAgICAgICAgICAgICBwdXRBSW50MTYoY29uc3QgaW50MTZfdCogdmFsdWVzLCBpbnQgY291bnQpOworICAgIHZvaWQgICAgICAgICAgICAgICAgcHV0QVVJbnQxNihjb25zdCB1aW50MTZfdCogdmFsdWVzLCBpbnQgY291bnQpOworICAgIHZvaWQgICAgICAgICAgICAgICAgcHV0QVVJbnQxNihjb25zdCBVSW50MTZMaXN0KiB2YWx1ZXMpOworICAgIHZvaWQgICAgICAgICAgICAgICAgcHV0QUludDMyKGNvbnN0IGludDMyX3QqIHZhbHVlcywgaW50IGNvdW50KTsKKyAgICB2b2lkICAgICAgICAgICAgICAgIHB1dEFVSW50MzIoY29uc3QgdWludDMyX3QqIHZhbHVlcywgaW50IGNvdW50KTsKKyAgICB2b2lkICAgICAgICAgICAgICAgIHB1dEFVSW50MzIoY29uc3QgVUludDMyTGlzdCogbGlzdCk7CisgICAgdm9pZCAgICAgICAgICAgICAgICBwdXRBSW50NjQoY29uc3QgaW50NjRfdCogdmFsdWVzLCBpbnQgY291bnQpOworICAgIHZvaWQgICAgICAgICAgICAgICAgcHV0QVVJbnQ2NChjb25zdCB1aW50NjRfdCogdmFsdWVzLCBpbnQgY291bnQpOworICAgIHZvaWQgICAgICAgICAgICAgICAgcHV0U3RyaW5nKGNvbnN0IE10cFN0cmluZ0J1ZmZlciYgc3RyaW5nKTsKKyAgICB2b2lkICAgICAgICAgICAgICAgIHB1dFN0cmluZyhjb25zdCBjaGFyKiBzdHJpbmcpOworICAgIHZvaWQgICAgICAgICAgICAgICAgcHV0U3RyaW5nKGNvbnN0IHVpbnQxNl90KiBzdHJpbmcpOworICAgIGlubGluZSB2b2lkICAgICAgICAgcHV0RW1wdHlTdHJpbmcoKSB7IHB1dFVJbnQ4KDApOyB9CisgICAgaW5saW5lIHZvaWQgICAgICAgICBwdXRFbXB0eUFycmF5KCkgeyBwdXRVSW50MzIoMCk7IH0KKworCisjaWZkZWYgTVRQX0RFVklDRQorICAgIC8vIGZpbGwgb3VyIGJ1ZmZlciB3aXRoIGRhdGEgZnJvbSB0aGUgZ2l2ZW4gZmlsZSBkZXNjcmlwdG9yCisgICAgaW50ICAgICAgICAgICAgICAgICByZWFkKGludCBmZCk7CisgICAgaW50ICAgICAgICAgICAgICAgICByZWFkRGF0YUhlYWRlcihpbnQgZmQpOworCisgICAgLy8gd3JpdGUgb3VyIGRhdGEgdG8gdGhlIGdpdmVuIGZpbGUgZGVzY3JpcHRvcgorICAgIGludCAgICAgICAgICAgICAgICAgd3JpdGUoaW50IGZkKTsKKyAgICBpbnQgICAgICAgICAgICAgICAgIHdyaXRlRGF0YUhlYWRlcihpbnQgZmQsIHVpbnQzMl90IGxlbmd0aCk7CisjZW5kaWYKKworI2lmZGVmIE1UUF9IT1NUCisgICAgaW50ICAgICAgICAgICAgICAgICByZWFkKHN0cnVjdCB1c2JfZW5kcG9pbnQgKmVwKTsKKyAgICBpbnQgICAgICAgICAgICAgICAgIHJlYWREYXRhKHN0cnVjdCB1c2JfZW5kcG9pbnQgKmVwLCB2b2lkKiBidWZmZXIsIGludCBsZW5ndGgpOworICAgIGludCAgICAgICAgICAgICAgICAgcmVhZERhdGFIZWFkZXIoc3RydWN0IHVzYl9lbmRwb2ludCAqZXApOworCisgICAgaW50ICAgICAgICAgICAgICAgICB3cml0ZURhdGFIZWFkZXIoc3RydWN0IHVzYl9lbmRwb2ludCAqZXAsIHVpbnQzMl90IGxlbmd0aCk7CisgICAgaW50ICAgICAgICAgICAgICAgICB3cml0ZShzdHJ1Y3QgdXNiX2VuZHBvaW50ICplcCk7CisgICAgaW50ICAgICAgICAgICAgICAgICB3cml0ZShzdHJ1Y3QgdXNiX2VuZHBvaW50ICplcCwgdm9pZCogYnVmZmVyLCB1aW50MzJfdCBsZW5ndGgpOworI2VuZGlmCisKKyAgICBpbmxpbmUgYm9vbCAgICAgICAgIGhhc0RhdGEoKSBjb25zdCB7IHJldHVybiBtUGFja2V0U2l6ZSA+IE1UUF9DT05UQUlORVJfSEVBREVSX1NJWkU7IH0KKyAgICB2b2lkKiAgICAgICAgICAgICAgIGdldERhdGEoaW50JiBvdXRMZW5ndGgpIGNvbnN0OworfTsKKworfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmIC8vIF9NVFBfREFUQV9QQUNLRVRfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbXRwL010cERhdGFiYXNlLmggYi9tZWRpYS9tdHAvTXRwRGF0YWJhc2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOGNiMDE2Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbXRwL010cERhdGFiYXNlLmgKQEAgLTAsMCArMSwxMDQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9NVFBfREFUQUJBU0VfSAorI2RlZmluZSBfTVRQX0RBVEFCQVNFX0gKKworI2luY2x1ZGUgIk10cFR5cGVzLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY2xhc3MgTXRwRGF0YVBhY2tldDsKK2NsYXNzIE10cFByb3BlcnR5OworCitjbGFzcyBNdHBEYXRhYmFzZSB7CitwdWJsaWM6CisgICAgdmlydHVhbCB+TXRwRGF0YWJhc2UoKSB7fQorCisgICAgLy8gY2FsbGVkIGZyb20gU2VuZE9iamVjdEluZm8gdG8gcmVzZXJ2ZSBhIGRhdGFiYXNlIGVudHJ5IGZvciB0aGUgaW5jb21pbmcgZmlsZQorICAgIHZpcnR1YWwgTXRwT2JqZWN0SGFuZGxlICAgICAgICAgYmVnaW5TZW5kT2JqZWN0KGNvbnN0IGNoYXIqIHBhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE10cE9iamVjdEZvcm1hdCBmb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE10cE9iamVjdEhhbmRsZSBwYXJlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE10cFN0b3JhZ2VJRCBzdG9yYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCBzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lX3QgbW9kaWZpZWQpID0gMDsKKworICAgIC8vIGNhbGxlZCB0byByZXBvcnQgc3VjY2VzcyBvciBmYWlsdXJlIG9mIHRoZSBTZW5kT2JqZWN0IGZpbGUgdHJhbnNmZXIKKyAgICAvLyBzdWNjZXNzIHNob3VsZCBzaWduYWwgYSBub3RpZmljYXRpb24gb2YgdGhlIG5ldyBvYmplY3QncyBjcmVhdGlvbiwKKyAgICAvLyBmYWlsdXJlIHNob3VsZCByZW1vdmUgdGhlIGRhdGFiYXNlIGVudHJ5IGNyZWF0ZWQgaW4gYmVnaW5TZW5kT2JqZWN0CisgICAgdmlydHVhbCB2b2lkICAgICAgICAgICAgICAgICAgICBlbmRTZW5kT2JqZWN0KGNvbnN0IGNoYXIqIHBhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE10cE9iamVjdEhhbmRsZSBoYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE10cE9iamVjdEZvcm1hdCBmb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgc3VjY2VlZGVkKSA9IDA7CisKKyAgICB2aXJ0dWFsIE10cE9iamVjdEhhbmRsZUxpc3QqICAgIGdldE9iamVjdExpc3QoTXRwU3RvcmFnZUlEIHN0b3JhZ2VJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXRwT2JqZWN0Rm9ybWF0IGZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXRwT2JqZWN0SGFuZGxlIHBhcmVudCkgPSAwOworCisgICAgdmlydHVhbCBpbnQgICAgICAgICAgICAgICAgICAgICBnZXROdW1PYmplY3RzKE10cFN0b3JhZ2VJRCBzdG9yYWdlSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE10cE9iamVjdEZvcm1hdCBmb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE10cE9iamVjdEhhbmRsZSBwYXJlbnQpID0gMDsKKworICAgIC8vIGNhbGxlZSBzaG91bGQgZGVsZXRlW10gdGhlIHJlc3VsdHMgZnJvbSB0aGVzZQorICAgIC8vIHJlc3VsdHMgY2FuIGJlIE5VTEwKKyAgICB2aXJ0dWFsIE10cE9iamVjdEZvcm1hdExpc3QqICAgIGdldFN1cHBvcnRlZFBsYXliYWNrRm9ybWF0cygpID0gMDsKKyAgICB2aXJ0dWFsIE10cE9iamVjdEZvcm1hdExpc3QqICAgIGdldFN1cHBvcnRlZENhcHR1cmVGb3JtYXRzKCkgPSAwOworICAgIHZpcnR1YWwgTXRwT2JqZWN0UHJvcGVydHlMaXN0KiAgZ2V0U3VwcG9ydGVkT2JqZWN0UHJvcGVydGllcyhNdHBPYmplY3RGb3JtYXQgZm9ybWF0KSA9IDA7CisgICAgdmlydHVhbCBNdHBEZXZpY2VQcm9wZXJ0eUxpc3QqICBnZXRTdXBwb3J0ZWREZXZpY2VQcm9wZXJ0aWVzKCkgPSAwOworCisgICAgdmlydHVhbCBNdHBSZXNwb25zZUNvZGUgICAgICAgICBnZXRPYmplY3RQcm9wZXJ0eVZhbHVlKE10cE9iamVjdEhhbmRsZSBoYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE10cE9iamVjdFByb3BlcnR5IHByb3BlcnR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdHBEYXRhUGFja2V0JiBwYWNrZXQpID0gMDsKKworICAgIHZpcnR1YWwgTXRwUmVzcG9uc2VDb2RlICAgICAgICAgc2V0T2JqZWN0UHJvcGVydHlWYWx1ZShNdHBPYmplY3RIYW5kbGUgaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdHBPYmplY3RQcm9wZXJ0eSBwcm9wZXJ0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXRwRGF0YVBhY2tldCYgcGFja2V0KSA9IDA7CisKKyAgICB2aXJ0dWFsIE10cFJlc3BvbnNlQ29kZSAgICAgICAgIGdldERldmljZVByb3BlcnR5VmFsdWUoTXRwRGV2aWNlUHJvcGVydHkgcHJvcGVydHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE10cERhdGFQYWNrZXQmIHBhY2tldCkgPSAwOworCisgICAgdmlydHVhbCBNdHBSZXNwb25zZUNvZGUgICAgICAgICBzZXREZXZpY2VQcm9wZXJ0eVZhbHVlKE10cERldmljZVByb3BlcnR5IHByb3BlcnR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdHBEYXRhUGFja2V0JiBwYWNrZXQpID0gMDsKKworICAgIHZpcnR1YWwgTXRwUmVzcG9uc2VDb2RlICAgICAgICAgcmVzZXREZXZpY2VQcm9wZXJ0eShNdHBEZXZpY2VQcm9wZXJ0eSBwcm9wZXJ0eSkgPSAwOworCisgICAgdmlydHVhbCBNdHBSZXNwb25zZUNvZGUgICAgICAgICBnZXRPYmplY3RJbmZvKE10cE9iamVjdEhhbmRsZSBoYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE10cERhdGFQYWNrZXQmIHBhY2tldCkgPSAwOworCisgICAgdmlydHVhbCBNdHBSZXNwb25zZUNvZGUgICAgICAgICBnZXRPYmplY3RGaWxlUGF0aChNdHBPYmplY3RIYW5kbGUgaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdHBTdHJpbmcmIGZpbGVQYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90JiBmaWxlTGVuZ3RoKSA9IDA7CisKKyAgICB2aXJ0dWFsIE10cFJlc3BvbnNlQ29kZSAgICAgICAgIGRlbGV0ZUZpbGUoTXRwT2JqZWN0SGFuZGxlIGhhbmRsZSkgPSAwOworCisgICAgdmlydHVhbCBNdHBPYmplY3RIYW5kbGVMaXN0KiAgICBnZXRPYmplY3RSZWZlcmVuY2VzKE10cE9iamVjdEhhbmRsZSBoYW5kbGUpID0gMDsKKworICAgIHZpcnR1YWwgTXRwUmVzcG9uc2VDb2RlICAgICAgICAgc2V0T2JqZWN0UmVmZXJlbmNlcyhNdHBPYmplY3RIYW5kbGUgaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdHBPYmplY3RIYW5kbGVMaXN0KiByZWZlcmVuY2VzKSA9IDA7CisKKyAgICB2aXJ0dWFsIE10cFByb3BlcnR5KiAgICAgICAgICAgIGdldE9iamVjdFByb3BlcnR5RGVzYyhNdHBPYmplY3RQcm9wZXJ0eSBwcm9wZXJ0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXRwT2JqZWN0Rm9ybWF0IGZvcm1hdCkgPSAwOworCisgICAgdmlydHVhbCBNdHBQcm9wZXJ0eSogICAgICAgICAgICBnZXREZXZpY2VQcm9wZXJ0eURlc2MoTXRwRGV2aWNlUHJvcGVydHkgcHJvcGVydHkpID0gMDsKKworICAgIHZpcnR1YWwgdm9pZCAgICAgICAgICAgICAgICAgICAgc2Vzc2lvblN0YXJ0ZWQoKSA9IDA7CisKKyAgICB2aXJ0dWFsIHZvaWQgICAgICAgICAgICAgICAgICAgIHNlc3Npb25FbmRlZCgpID0gMDsKK307CisKK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAvLyBfTVRQX0RBVEFCQVNFX0gKZGlmZiAtLWdpdCBhL21lZGlhL210cC9NdHBEZWJ1Zy5jcHAgYi9tZWRpYS9tdHAvTXRwRGVidWcuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ2YjEwN2QKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9tdHAvTXRwRGVidWcuY3BwCkBAIC0wLDAgKzEsMzg3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgIk10cERlYnVnLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworc3RydWN0IENvZGVFbnRyeSB7CisgICAgY29uc3QgY2hhciogbmFtZTsKKyAgICB1aW50MTZfdCBjb2RlOworfTsKKworc3RhdGljIGNvbnN0IENvZGVFbnRyeSBzT3BlcmF0aW9uQ29kZXNbXSA9IHsKKyAgICB7ICJNVFBfT1BFUkFUSU9OX0dFVF9ERVZJQ0VfSU5GTyIsICAgICAgICAgICAgICAweDEwMDEgfSwKKyAgICB7ICJNVFBfT1BFUkFUSU9OX09QRU5fU0VTU0lPTiIsICAgICAgICAgICAgICAgICAweDEwMDIgfSwKKyAgICB7ICJNVFBfT1BFUkFUSU9OX0NMT1NFX1NFU1NJT04iLCAgICAgICAgICAgICAgICAweDEwMDMgfSwKKyAgICB7ICJNVFBfT1BFUkFUSU9OX0dFVF9TVE9SQUdFX0lEUyIsICAgICAgICAgICAgICAweDEwMDQgfSwKKyAgICB7ICJNVFBfT1BFUkFUSU9OX0dFVF9TVE9SQUdFX0lORk8iLCAgICAgICAgICAgICAweDEwMDUgfSwKKyAgICB7ICJNVFBfT1BFUkFUSU9OX0dFVF9OVU1fT0JKRUNUUyIsICAgICAgICAgICAgICAweDEwMDYgfSwKKyAgICB7ICJNVFBfT1BFUkFUSU9OX0dFVF9PQkpFQ1RfSEFORExFUyIsICAgICAgICAgICAweDEwMDcgfSwKKyAgICB7ICJNVFBfT1BFUkFUSU9OX0dFVF9PQkpFQ1RfSU5GTyIsICAgICAgICAgICAgICAweDEwMDggfSwKKyAgICB7ICJNVFBfT1BFUkFUSU9OX0dFVF9PQkpFQ1QiLCAgICAgICAgICAgICAgICAgICAweDEwMDkgfSwKKyAgICB7ICJNVFBfT1BFUkFUSU9OX0dFVF9USFVNQiIsICAgICAgICAgICAgICAgICAgICAweDEwMEEgfSwKKyAgICB7ICJNVFBfT1BFUkFUSU9OX0RFTEVURV9PQkpFQ1QiLCAgICAgICAgICAgICAgICAweDEwMEIgfSwKKyAgICB7ICJNVFBfT1BFUkFUSU9OX1NFTkRfT0JKRUNUX0lORk8iLCAgICAgICAgICAgICAweDEwMEMgfSwKKyAgICB7ICJNVFBfT1BFUkFUSU9OX1NFTkRfT0JKRUNUIiwgICAgICAgICAgICAgICAgICAweDEwMEQgfSwKKyAgICB7ICJNVFBfT1BFUkFUSU9OX0lOSVRJQVRFX0NBUFRVUkUiLCAgICAgICAgICAgICAweDEwMEUgfSwKKyAgICB7ICJNVFBfT1BFUkFUSU9OX0ZPUk1BVF9TVE9SRSIsICAgICAgICAgICAgICAgICAweDEwMEYgfSwKKyAgICB7ICJNVFBfT1BFUkFUSU9OX1JFU0VUX0RFVklDRSIsICAgICAgICAgICAgICAgICAweDEwMTAgfSwKKyAgICB7ICJNVFBfT1BFUkFUSU9OX1NFTEZfVEVTVCIsICAgICAgICAgICAgICAgICAgICAweDEwMTEgfSwKKyAgICB7ICJNVFBfT1BFUkFUSU9OX1NFVF9PQkpFQ1RfUFJPVEVDVElPTiIsICAgICAgICAweDEwMTIgfSwKKyAgICB7ICJNVFBfT1BFUkFUSU9OX1BPV0VSX0RPV04iLCAgICAgICAgICAgICAgICAgICAweDEwMTMgfSwKKyAgICB7ICJNVFBfT1BFUkFUSU9OX0dFVF9ERVZJQ0VfUFJPUF9ERVNDIiwgICAgICAgICAweDEwMTQgfSwKKyAgICB7ICJNVFBfT1BFUkFUSU9OX0dFVF9ERVZJQ0VfUFJPUF9WQUxVRSIsICAgICAgICAweDEwMTUgfSwKKyAgICB7ICJNVFBfT1BFUkFUSU9OX1NFVF9ERVZJQ0VfUFJPUF9WQUxVRSIsICAgICAgICAweDEwMTYgfSwKKyAgICB7ICJNVFBfT1BFUkFUSU9OX1JFU0VUX0RFVklDRV9QUk9QX1ZBTFVFIiwgICAgICAweDEwMTcgfSwKKyAgICB7ICJNVFBfT1BFUkFUSU9OX1RFUk1JTkFURV9PUEVOX0NBUFRVUkUiLCAgICAgICAweDEwMTggfSwKKyAgICB7ICJNVFBfT1BFUkFUSU9OX01PVkVfT0JKRUNUIiwgICAgICAgICAgICAgICAgICAweDEwMTkgfSwKKyAgICB7ICJNVFBfT1BFUkFUSU9OX0NPUFlfT0JKRUNUIiwgICAgICAgICAgICAgICAgICAweDEwMUEgfSwKKyAgICB7ICJNVFBfT1BFUkFUSU9OX0dFVF9QQVJUSUFMX09CSkVDVCIsICAgICAgICAgICAweDEwMUIgfSwKKyAgICB7ICJNVFBfT1BFUkFUSU9OX0lOSVRJQVRFX09QRU5fQ0FQVFVSRSIsICAgICAgICAweDEwMUMgfSwKKyAgICB7ICJNVFBfT1BFUkFUSU9OX0dFVF9PQkpFQ1RfUFJPUFNfU1VQUE9SVEVEIiwgICAweDk4MDEgfSwKKyAgICB7ICJNVFBfT1BFUkFUSU9OX0dFVF9PQkpFQ1RfUFJPUF9ERVNDIiwgICAgICAgICAweDk4MDIgfSwKKyAgICB7ICJNVFBfT1BFUkFUSU9OX0dFVF9PQkpFQ1RfUFJPUF9WQUxVRSIsICAgICAgICAweDk4MDMgfSwKKyAgICB7ICJNVFBfT1BFUkFUSU9OX1NFVF9PQkpFQ1RfUFJPUF9WQUxVRSIsICAgICAgICAweDk4MDQgfSwKKyAgICB7ICJNVFBfT1BFUkFUSU9OX0dFVF9PQkpFQ1RfUkVGRVJFTkNFUyIsICAgICAgICAweDk4MTAgfSwKKyAgICB7ICJNVFBfT1BFUkFUSU9OX1NFVF9PQkpFQ1RfUkVGRVJFTkNFUyIsICAgICAgICAweDk4MTEgfSwKKyAgICB7ICJNVFBfT1BFUkFUSU9OX1NLSVAiLCAgICAgICAgICAgICAgICAgICAgICAgICAweDk4MjAgfSwKKyAgICB7IDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAgICAgfSwKK307CisKK3N0YXRpYyBjb25zdCBDb2RlRW50cnkgc0Zvcm1hdENvZGVzW10gPSB7CisgICAgeyAiTVRQX09QRVJBVElPTl9HRVRfREVWSUNFX0lORk8iLCAgICAgICAgICAgICAgMHgxMDAxIH0sCisgICAgeyAiTVRQX0ZPUk1BVF9VTkRFRklORUQiLCAgICAgICAgICAgICAgICAgICAgICAgMHgzMDAwIH0sCisgICAgeyAiTVRQX0ZPUk1BVF9BU1NPQ0lBVElPTiIsICAgICAgICAgICAgICAgICAgICAgMHgzMDAxIH0sCisgICAgeyAiTVRQX0ZPUk1BVF9TQ1JJUFQiLCAgICAgICAgICAgICAgICAgICAgICAgICAgMHgzMDAyIH0sCisgICAgeyAiTVRQX0ZPUk1BVF9FWEVDVVRBQkxFIiwgICAgICAgICAgICAgICAgICAgICAgMHgzMDAzIH0sCisgICAgeyAiTVRQX0ZPUk1BVF9URVhUIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgzMDA0IH0sCisgICAgeyAiTVRQX0ZPUk1BVF9IVE1MIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgzMDA1IH0sCisgICAgeyAiTVRQX0ZPUk1BVF9EUE9GIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgzMDA2IH0sCisgICAgeyAiTVRQX0ZPUk1BVF9BSUZGIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgzMDA3IH0sCisgICAgeyAiTVRQX0ZPUk1BVF9XQVYiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgzMDA4IH0sCisgICAgeyAiTVRQX0ZPUk1BVF9NUDMiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgzMDA5IH0sCisgICAgeyAiTVRQX0ZPUk1BVF9BVkkiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgzMDBBIH0sCisgICAgeyAiTVRQX0ZPUk1BVF9NUEVHIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgzMDBCIH0sCisgICAgeyAiTVRQX0ZPUk1BVF9BU0YiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgzMDBDIH0sCisgICAgeyAiTVRQX0ZPUk1BVF9ERUZJTkVEIiwgICAgICAgICAgICAgICAgICAgICAgICAgMHgzODAwIH0sCisgICAgeyAiTVRQX0ZPUk1BVF9FWElGX0pQRUciLCAgICAgICAgICAgICAgICAgICAgICAgMHgzODAxIH0sCisgICAgeyAiTVRQX0ZPUk1BVF9USUZGX0VQIiwgICAgICAgICAgICAgICAgICAgICAgICAgMHgzODAyIH0sCisgICAgeyAiTVRQX0ZPUk1BVF9GTEFTSFBJWCIsICAgICAgICAgICAgICAgICAgICAgICAgMHgzODAzIH0sCisgICAgeyAiTVRQX0ZPUk1BVF9CTVAiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgzODA0IH0sCisgICAgeyAiTVRQX0ZPUk1BVF9DSUZGIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgzODA1IH0sCisgICAgeyAiTVRQX0ZPUk1BVF9HSUYiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgzODA3IH0sCisgICAgeyAiTVRQX0ZPUk1BVF9KRklGIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgzODA4IH0sCisgICAgeyAiTVRQX0ZPUk1BVF9DRCIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgzODA5IH0sCisgICAgeyAiTVRQX0ZPUk1BVF9QSUNUIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgzODBBIH0sCisgICAgeyAiTVRQX0ZPUk1BVF9QTkciLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgzODBCIH0sCisgICAgeyAiTVRQX0ZPUk1BVF9USUZGIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgzODBEIH0sCisgICAgeyAiTVRQX0ZPUk1BVF9USUZGX0lUIiwgICAgICAgICAgICAgICAgICAgICAgICAgMHgzODBFIH0sCisgICAgeyAiTVRQX0ZPUk1BVF9KUDIiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgzODBGIH0sCisgICAgeyAiTVRQX0ZPUk1BVF9KUFgiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgzODEwIH0sCisgICAgeyAiTVRQX0ZPUk1BVF9VTkRFRklORURfRklSTVdBUkUiLCAgICAgICAgICAgICAgMHhCODAyIH0sCisgICAgeyAiTVRQX0ZPUk1BVF9XSU5ET1dTX0lNQUdFX0ZPUk1BVCIsICAgICAgICAgICAgMHhCODgxIH0sCisgICAgeyAiTVRQX0ZPUk1BVF9VTkRFRklORURfQVVESU8iLCAgICAgICAgICAgICAgICAgMHhCOTAwIH0sCisgICAgeyAiTVRQX0ZPUk1BVF9XTUEiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhCOTAxIH0sCisgICAgeyAiTVRQX0ZPUk1BVF9PR0ciLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhCOTAyIH0sCisgICAgeyAiTVRQX0ZPUk1BVF9BQUMiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhCOTAzIH0sCisgICAgeyAiTVRQX0ZPUk1BVF9BVURJQkxFIiwgICAgICAgICAgICAgICAgICAgICAgICAgMHhCOTA0IH0sCisgICAgeyAiTVRQX0ZPUk1BVF9GTEFDIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhCOTA2IH0sCisgICAgeyAiTVRQX0ZPUk1BVF9VTkRFRklORURfVklERU8iLCAgICAgICAgICAgICAgICAgMHhCOTgwIH0sCisgICAgeyAiTVRQX0ZPUk1BVF9XTVYiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhCOTgxIH0sCisgICAgeyAiTVRQX0ZPUk1BVF9NUDRfQ09OVEFJTkVSIiwgICAgICAgICAgICAgICAgICAgMHhCOTgyIH0sCisgICAgeyAiTVRQX0ZPUk1BVF9NUDIiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhCOTgzIH0sCisgICAgeyAiTVRQX0ZPUk1BVF8zR1BfQ09OVEFJTkVSIiwgICAgICAgICAgICAgICAgICAgMHhCOTg0IH0sCisgICAgeyAiTVRQX0ZPUk1BVF9VTkRFRklORURfQ09MTEVDVElPTiIsICAgICAgICAgICAgMHhCQTAwIH0sCisgICAgeyAiTVRQX0ZPUk1BVF9BQlNUUkFDVF9NVUxUSU1FRElBX0FMQlVNIiwgICAgICAgMHhCQTAxIH0sCisgICAgeyAiTVRQX0ZPUk1BVF9BQlNUUkFDVF9JTUFHRV9BTEJVTSIsICAgICAgICAgICAgMHhCQTAyIH0sCisgICAgeyAiTVRQX0ZPUk1BVF9BQlNUUkFDVF9BVURJT19BTEJVTSIsICAgICAgICAgICAgMHhCQTAzIH0sCisgICAgeyAiTVRQX0ZPUk1BVF9BQlNUUkFDVF9WSURFT19BTEJVTSIsICAgICAgICAgICAgMHhCQTA0IH0sCisgICAgeyAiTVRQX0ZPUk1BVF9BQlNUUkFDVF9BVl9QTEFZTElTVCIsICAgICAgICAgICAgMHhCQTA1IH0sCisgICAgeyAiTVRQX0ZPUk1BVF9BQlNUUkFDVF9DT05UQUNUX0dST1VQIiwgICAgICAgICAgMHhCQTA2IH0sCisgICAgeyAiTVRQX0ZPUk1BVF9BQlNUUkFDVF9NRVNTQUdFX0ZPTERFUiIsICAgICAgICAgMHhCQTA3IH0sCisgICAgeyAiTVRQX0ZPUk1BVF9BQlNUUkFDVF9DSEFQVEVSRURfUFJPRFVDVElPTiIsICAgMHhCQTA4IH0sCisgICAgeyAiTVRQX0ZPUk1BVF9BQlNUUkFDVF9BVURJT19QTEFZTElTVCIsICAgICAgICAgMHhCQTA5IH0sCisgICAgeyAiTVRQX0ZPUk1BVF9BQlNUUkFDVF9WSURFT19QTEFZTElTVCIsICAgICAgICAgMHhCQTBBIH0sCisgICAgeyAiTVRQX0ZPUk1BVF9BQlNUUkFDVF9NRURJQUNBU1QiLCAgICAgICAgICAgICAgMHhCQTBCIH0sCisgICAgeyAiTVRQX0ZPUk1BVF9XUExfUExBWUxJU1QiLCAgICAgICAgICAgICAgICAgICAgMHhCQTEwIH0sCisgICAgeyAiTVRQX0ZPUk1BVF9NM1VfUExBWUxJU1QiLCAgICAgICAgICAgICAgICAgICAgMHhCQTExIH0sCisgICAgeyAiTVRQX0ZPUk1BVF9NUExfUExBWUxJU1QiLCAgICAgICAgICAgICAgICAgICAgMHhCQTEyIH0sCisgICAgeyAiTVRQX0ZPUk1BVF9BU1hfUExBWUxJU1QiLCAgICAgICAgICAgICAgICAgICAgMHhCQTEzIH0sCisgICAgeyAiTVRQX0ZPUk1BVF9QTFNfUExBWUxJU1QiLCAgICAgICAgICAgICAgICAgICAgMHhCQTE0IH0sCisgICAgeyAiTVRQX0ZPUk1BVF9VTkRFRklORURfRE9DVU1FTlQiLCAgICAgICAgICAgICAgMHhCQTgwIH0sCisgICAgeyAiTVRQX0ZPUk1BVF9BQlNUUkFDVF9ET0NVTUVOVCIsICAgICAgICAgICAgICAgMHhCQTgxIH0sCisgICAgeyAiTVRQX0ZPUk1BVF9YTUxfRE9DVU1FTlQiLCAgICAgICAgICAgICAgICAgICAgMHhCQTgyIH0sCisgICAgeyAiTVRQX0ZPUk1BVF9NU19XT1JEX0RPQ1VNRU5UIiwgICAgICAgICAgICAgICAgMHhCQTgzIH0sCisgICAgeyAiTVRQX0ZPUk1BVF9NSFRfQ09NUElMRURfSFRNTF9ET0NVTUVOVCIsICAgICAgMHhCQTg0IH0sCisgICAgeyAiTVRQX0ZPUk1BVF9NU19FWENFTF9TUFJFQURTSEVFVCIsICAgICAgICAgICAgMHhCQTg1IH0sCisgICAgeyAiTVRQX0ZPUk1BVF9NU19QT1dFUlBPSU5UX1BSRVNFTlRBVElPTiIsICAgICAgMHhCQTg2IH0sCisgICAgeyAiTVRQX0ZPUk1BVF9VTkRFRklORURfTUVTU0FHRSIsICAgICAgICAgICAgICAgMHhCQjAwIH0sCisgICAgeyAiTVRQX0ZPUk1BVF9BQlNUUkFDVF9NRVNTU0FHRSIsICAgICAgICAgICAgICAgMHhCQjAxIH0sCisgICAgeyAiTVRQX0ZPUk1BVF9VTkRFRklORURfQ09OVEFDVCIsICAgICAgICAgICAgICAgMHhCQjgwIH0sCisgICAgeyAiTVRQX0ZPUk1BVF9BQlNUUkFDVF9DT05UQUNUIiwgICAgICAgICAgICAgICAgMHhCQjgxIH0sCisgICAgeyAiTVRQX0ZPUk1BVF9WQ0FSRF8yIiwgICAgICAgICAgICAgICAgICAgICAgICAgMHhCQjgyIH0sCisgICAgeyAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgIH0sCit9OworCitzdGF0aWMgY29uc3QgQ29kZUVudHJ5IHNPYmplY3RQcm9wQ29kZXNbXSA9IHsKKyAgICB7ICJNVFBfUFJPUEVSVFlfU1RPUkFHRV9JRCIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweERDMDEgfSwKKyAgICB7ICJNVFBfUFJPUEVSVFlfT0JKRUNUX0ZPUk1BVCIsICAgICAgICAgICAgICAgICAgICAgICAgICAweERDMDIgfSwKKyAgICB7ICJNVFBfUFJPUEVSVFlfUFJPVEVDVElPTl9TVEFUVVMiLCAgICAgICAgICAgICAgICAgICAgICAweERDMDMgfSwKKyAgICB7ICJNVFBfUFJPUEVSVFlfT0JKRUNUX1NJWkUiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAweERDMDQgfSwKKyAgICB7ICJNVFBfUFJPUEVSVFlfQVNTT0NJQVRJT05fVFlQRSIsICAgICAgICAgICAgICAgICAgICAgICAweERDMDUgfSwKKyAgICB7ICJNVFBfUFJPUEVSVFlfQVNTT0NJQVRJT05fREVTQyIsICAgICAgICAgICAgICAgICAgICAgICAweERDMDYgfSwKKyAgICB7ICJNVFBfUFJPUEVSVFlfT0JKRUNUX0ZJTEVfTkFNRSIsICAgICAgICAgICAgICAgICAgICAgICAweERDMDcgfSwKKyAgICB7ICJNVFBfUFJPUEVSVFlfREFURV9DUkVBVEVEIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAweERDMDggfSwKKyAgICB7ICJNVFBfUFJPUEVSVFlfREFURV9NT0RJRklFRCIsICAgICAgICAgICAgICAgICAgICAgICAgICAweERDMDkgfSwKKyAgICB7ICJNVFBfUFJPUEVSVFlfS0VZV09SRFMiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweERDMEEgfSwKKyAgICB7ICJNVFBfUFJPUEVSVFlfUEFSRU5UX09CSkVDVCIsICAgICAgICAgICAgICAgICAgICAgICAgICAweERDMEIgfSwKKyAgICB7ICJNVFBfUFJPUEVSVFlfQUxMT1dFRF9GT0xERVJfQ09OVEVOVFMiLCAgICAgICAgICAgICAgICAweERDMEMgfSwKKyAgICB7ICJNVFBfUFJPUEVSVFlfSElEREVOIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweERDMEQgfSwKKyAgICB7ICJNVFBfUFJPUEVSVFlfU1lTVEVNX09CSkVDVCIsICAgICAgICAgICAgICAgICAgICAgICAgICAweERDMEUgfSwKKyAgICB7ICJNVFBfUFJPUEVSVFlfUEVSU0lTVEVOVF9VSUQiLCAgICAgICAgICAgICAgICAgICAgICAgICAweERDNDEgfSwKKyAgICB7ICJNVFBfUFJPUEVSVFlfU1lOQ19JRCIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweERDNDIgfSwKKyAgICB7ICJNVFBfUFJPUEVSVFlfUFJPUEVSVFlfQkFHIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAweERDNDMgfSwKKyAgICB7ICJNVFBfUFJPUEVSVFlfTkFNRSIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweERDNDQgfSwKKyAgICB7ICJNVFBfUFJPUEVSVFlfQ1JFQVRFRF9CWSIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweERDNDUgfSwKKyAgICB7ICJNVFBfUFJPUEVSVFlfQVJUSVNUIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweERDNDYgfSwKKyAgICB7ICJNVFBfUFJPUEVSVFlfREFURV9BVVRIT1JFRCIsICAgICAgICAgICAgICAgICAgICAgICAgICAweERDNDcgfSwKKyAgICB7ICJNVFBfUFJPUEVSVFlfREVTQ1JJUFRJT04iLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAweERDNDggfSwKKyAgICB7ICJNVFBfUFJPUEVSVFlfVVJMX1JFRkVSRU5DRSIsICAgICAgICAgICAgICAgICAgICAgICAgICAweERDNDkgfSwKKyAgICB7ICJNVFBfUFJPUEVSVFlfTEFOR1VBR0VfTE9DQUxFIiwgICAgICAgICAgICAgICAgICAgICAgICAweERDNEEgfSwKKyAgICB7ICJNVFBfUFJPUEVSVFlfQ09QWVJJR0hUX0lORk9STUFUSU9OIiwgICAgICAgICAgICAgICAgICAweERDNEIgfSwKKyAgICB7ICJNVFBfUFJPUEVSVFlfU09VUkNFIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweERDNEMgfSwKKyAgICB7ICJNVFBfUFJPUEVSVFlfT1JJR0lOX0xPQ0FUSU9OIiwgICAgICAgICAgICAgICAgICAgICAgICAweERDNEQgfSwKKyAgICB7ICJNVFBfUFJPUEVSVFlfREFURV9BRERFRCIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweERDNEUgfSwKKyAgICB7ICJNVFBfUFJPUEVSVFlfTk9OX0NPTlNVTUFCTEUiLCAgICAgICAgICAgICAgICAgICAgICAgICAweERDNEYgfSwKKyAgICB7ICJNVFBfUFJPUEVSVFlfQ09SUlVQVF9VTlBMQVlBQkxFIiwgICAgICAgICAgICAgICAgICAgICAweERDNTAgfSwKKyAgICB7ICJNVFBfUFJPUEVSVFlfUFJPRFVDRVJfU0VSSUFMX05VTUJFUiIsICAgICAgICAgICAgICAgICAweERDNTEgfSwKKyAgICB7ICJNVFBfUFJPUEVSVFlfUkVQUkVTRU5UQVRJVkVfU0FNUExFX0ZPUk1BVCIsICAgICAgICAgICAweERDODEgfSwKKyAgICB7ICJNVFBfUFJPUEVSVFlfUkVQUkVTRU5UQVRJVkVfU0FNUExFX1NJWkUiLCAgICAgICAgICAgICAweERDODIgfSwKKyAgICB7ICJNVFBfUFJPUEVSVFlfUkVQUkVTRU5UQVRJVkVfU0FNUExFX0hFSUdIVCIsICAgICAgICAgICAweERDODMgfSwKKyAgICB7ICJNVFBfUFJPUEVSVFlfUkVQUkVTRU5UQVRJVkVfU0FNUExFX1dJRFRIIiwgICAgICAgICAgICAweERDODQgfSwKKyAgICB7ICJNVFBfUFJPUEVSVFlfUkVQUkVTRU5UQVRJVkVfU0FNUExFX0RVUkFUSU9OIiwgICAgICAgICAweERDODUgfSwKKyAgICB7ICJNVFBfUFJPUEVSVFlfUkVQUkVTRU5UQVRJVkVfU0FNUExFX0RBVEEiLCAgICAgICAgICAgICAweERDODYgfSwKKyAgICB7ICJNVFBfUFJPUEVSVFlfV0lEVEgiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweERDODcgfSwKKyAgICB7ICJNVFBfUFJPUEVSVFlfSEVJR0hUIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweERDODggfSwKKyAgICB7ICJNVFBfUFJPUEVSVFlfRFVSQVRJT04iLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweERDODkgfSwKKyAgICB7ICJNVFBfUFJPUEVSVFlfUkFUSU5HIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweERDOEEgfSwKKyAgICB7ICJNVFBfUFJPUEVSVFlfVFJBQ0siLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweERDOEIgfSwKKyAgICB7ICJNVFBfUFJPUEVSVFlfR0VOUkUiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweERDOEMgfSwKKyAgICB7ICJNVFBfUFJPUEVSVFlfQ1JFRElUUyIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweERDOEQgfSwKKyAgICB7ICJNVFBfUFJPUEVSVFlfTFlSSUNTIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweERDOEUgfSwKKyAgICB7ICJNVFBfUFJPUEVSVFlfU1VCU0NSSVBUSU9OX0NPTlRFTlRfSUQiLCAgICAgICAgICAgICAgICAweERDOEYgfSwKKyAgICB7ICJNVFBfUFJPUEVSVFlfUFJPRFVDRURfQlkiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAweERDOTAgfSwKKyAgICB7ICJNVFBfUFJPUEVSVFlfVVNFX0NPVU5UIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweERDOTEgfSwKKyAgICB7ICJNVFBfUFJPUEVSVFlfU0tJUF9DT1VOVCIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweERDOTIgfSwKKyAgICB7ICJNVFBfUFJPUEVSVFlfTEFTVF9BQ0NFU1NFRCIsICAgICAgICAgICAgICAgICAgICAgICAgICAweERDOTMgfSwKKyAgICB7ICJNVFBfUFJPUEVSVFlfUEFSRU5UQUxfUkFUSU5HIiwgICAgICAgICAgICAgICAgICAgICAgICAweERDOTQgfSwKKyAgICB7ICJNVFBfUFJPUEVSVFlfTUVUQV9HRU5SRSIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweERDOTUgfSwKKyAgICB7ICJNVFBfUFJPUEVSVFlfQ09NUE9TRVIiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweERDOTYgfSwKKyAgICB7ICJNVFBfUFJPUEVSVFlfRUZGRUNUSVZFX1JBVElORyIsICAgICAgICAgICAgICAgICAgICAgICAweERDOTcgfSwKKyAgICB7ICJNVFBfUFJPUEVSVFlfU1VCVElUTEUiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweERDOTggfSwKKyAgICB7ICJNVFBfUFJPUEVSVFlfT1JJR0lOQUxfUkVMRUFTRV9EQVRFIiwgICAgICAgICAgICAgICAgICAweERDOTkgfSwKKyAgICB7ICJNVFBfUFJPUEVSVFlfQUxCVU1fTkFNRSIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweERDOUEgfSwKKyAgICB7ICJNVFBfUFJPUEVSVFlfQUxCVU1fQVJUSVNUIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAweERDOUIgfSwKKyAgICB7ICJNVFBfUFJPUEVSVFlfTU9PRCIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweERDOUMgfSwKKyAgICB7ICJNVFBfUFJPUEVSVFlfRFJNX1NUQVRVUyIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweERDOUQgfSwKKyAgICB7ICJNVFBfUFJPUEVSVFlfU1VCX0RFU0NSSVBUSU9OIiwgICAgICAgICAgICAgICAgICAgICAgICAweERDOUUgfSwKKyAgICB7ICJNVFBfUFJPUEVSVFlfSVNfQ1JPUFBFRCIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweERDRDEgfSwKKyAgICB7ICJNVFBfUFJPUEVSVFlfSVNfQ09MT1VSX0NPUlJFQ1RFRCIsICAgICAgICAgICAgICAgICAgICAweERDRDIgfSwKKyAgICB7ICJNVFBfUFJPUEVSVFlfSU1BR0VfQklUX0RFUFRIIiwgICAgICAgICAgICAgICAgICAgICAgICAweERDRDMgfSwKKyAgICB7ICJNVFBfUFJPUEVSVFlfRl9OVU1CRVIiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweERDRDQgfSwKKyAgICB7ICJNVFBfUFJPUEVSVFlfRVhQT1NVUkVfVElNRSIsICAgICAgICAgICAgICAgICAgICAgICAgICAweERDRDUgfSwKKyAgICB7ICJNVFBfUFJPUEVSVFlfRVhQT1NVUkVfSU5ERVgiLCAgICAgICAgICAgICAgICAgICAgICAgICAweERDRDYgfSwKKyAgICB7ICJNVFBfUFJPUEVSVFlfVE9UQUxfQklUUkFURSIsICAgICAgICAgICAgICAgICAgICAgICAgICAweERFOTEgfSwKKyAgICB7ICJNVFBfUFJPUEVSVFlfQklUUkFURV9UWVBFIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAweERFOTIgfSwKKyAgICB7ICJNVFBfUFJPUEVSVFlfU0FNUExFX1JBVEUiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAweERFOTMgfSwKKyAgICB7ICJNVFBfUFJPUEVSVFlfTlVNQkVSX09GX0NIQU5ORUxTIiwgICAgICAgICAgICAgICAgICAgICAweERFOTQgfSwKKyAgICB7ICJNVFBfUFJPUEVSVFlfQVVESU9fQklUX0RFUFRIIiwgICAgICAgICAgICAgICAgICAgICAgICAweERFOTUgfSwKKyAgICB7ICJNVFBfUFJPUEVSVFlfU0NBTl9UWVBFIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweERFOTcgfSwKKyAgICB7ICJNVFBfUFJPUEVSVFlfQVVESU9fV0FWRV9DT0RFQyIsICAgICAgICAgICAgICAgICAgICAgICAweERFOTkgfSwKKyAgICB7ICJNVFBfUFJPUEVSVFlfQVVESU9fQklUUkFURSIsICAgICAgICAgICAgICAgICAgICAgICAgICAweERFOUEgfSwKKyAgICB7ICJNVFBfUFJPUEVSVFlfVklERU9fRk9VUkNDX0NPREVDIiwgICAgICAgICAgICAgICAgICAgICAweERFOUIgfSwKKyAgICB7ICJNVFBfUFJPUEVSVFlfVklERU9fQklUUkFURSIsICAgICAgICAgICAgICAgICAgICAgICAgICAweERFOUMgfSwKKyAgICB7ICJNVFBfUFJPUEVSVFlfRlJBTUVTX1BFUl9USE9VU0FORF9TRUNPTkRTIiwgICAgICAgICAgICAweERFOUQgfSwKKyAgICB7ICJNVFBfUFJPUEVSVFlfS0VZRlJBTUVfRElTVEFOQ0UiLCAgICAgICAgICAgICAgICAgICAgICAweERFOUUgfSwKKyAgICB7ICJNVFBfUFJPUEVSVFlfQlVGRkVSX1NJWkUiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAweERFOUYgfSwKKyAgICB7ICJNVFBfUFJPUEVSVFlfRU5DT0RJTkdfUVVBTElUWSIsICAgICAgICAgICAgICAgICAgICAgICAweERFQTAgfSwKKyAgICB7ICJNVFBfUFJPUEVSVFlfRU5DT0RJTkdfUFJPRklMRSIsICAgICAgICAgICAgICAgICAgICAgICAweERFQTEgfSwKKyAgICB7ICJNVFBfUFJPUEVSVFlfRElTUExBWV9OQU1FIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAweERDRTAgfSwKKyAgICB7ICJNVFBfUFJPUEVSVFlfQk9EWV9URVhUIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweERDRTEgfSwKKyAgICB7ICJNVFBfUFJPUEVSVFlfU1VCSkVDVCIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweERDRTIgfSwKKyAgICB7ICJNVFBfUFJPUEVSVFlfUFJJT1JJVFkiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweERDRTMgfSwKKyAgICB7ICJNVFBfUFJPUEVSVFlfR0lWRU5fTkFNRSIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweEREMDAgfSwKKyAgICB7ICJNVFBfUFJPUEVSVFlfTUlERExFX05BTUVTIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAweEREMDEgfSwKKyAgICB7ICJNVFBfUFJPUEVSVFlfRkFNSUxZX05BTUUiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAweEREMDIgfSwKKyAgICB7ICJNVFBfUFJPUEVSVFlfUFJFRklYIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweEREMDMgfSwKKyAgICB7ICJNVFBfUFJPUEVSVFlfU1VGRklYIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweEREMDQgfSwKKyAgICB7ICJNVFBfUFJPUEVSVFlfUEhPTkVUSUNfR0lWRU5fTkFNRSIsICAgICAgICAgICAgICAgICAgICAweEREMDUgfSwKKyAgICB7ICJNVFBfUFJPUEVSVFlfUEhPTkVUSUNfRkFNSUxZX05BTUUiLCAgICAgICAgICAgICAgICAgICAweEREMDYgfSwKKyAgICB7ICJNVFBfUFJPUEVSVFlfRU1BSUxfUFJJTUFSWSIsICAgICAgICAgICAgICAgICAgICAgICAgICAweEREMDcgfSwKKyAgICB7ICJNVFBfUFJPUEVSVFlfRU1BSUxfUEVSU09OQUxfMSIsICAgICAgICAgICAgICAgICAgICAgICAweEREMDggfSwKKyAgICB7ICJNVFBfUFJPUEVSVFlfRU1BSUxfUEVSU09OQUxfMiIsICAgICAgICAgICAgICAgICAgICAgICAweEREMDkgfSwKKyAgICB7ICJNVFBfUFJPUEVSVFlfRU1BSUxfQlVTSU5FU1NfMSIsICAgICAgICAgICAgICAgICAgICAgICAweEREMEEgfSwKKyAgICB7ICJNVFBfUFJPUEVSVFlfRU1BSUxfQlVTSU5FU1NfMiIsICAgICAgICAgICAgICAgICAgICAgICAweEREMEIgfSwKKyAgICB7ICJNVFBfUFJPUEVSVFlfRU1BSUxfT1RIRVJTIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAweEREMEMgfSwKKyAgICB7ICJNVFBfUFJPUEVSVFlfUEhPTkVfTlVNQkVSX1BSSU1BUlkiLCAgICAgICAgICAgICAgICAgICAweEREMEQgfSwKKyAgICB7ICJNVFBfUFJPUEVSVFlfUEhPTkVfTlVNQkVSX1BFUlNPTkFMIiwgICAgICAgICAgICAgICAgICAweEREMEUgfSwKKyAgICB7ICJNVFBfUFJPUEVSVFlfUEhPTkVfTlVNQkVSX1BFUlNPTkFMXzIiLCAgICAgICAgICAgICAgICAweEREMEYgfSwKKyAgICB7ICJNVFBfUFJPUEVSVFlfUEhPTkVfTlVNQkVSX0JVU0lORVNTIiwgICAgICAgICAgICAgICAgICAweEREMTAgfSwKKyAgICB7ICJNVFBfUFJPUEVSVFlfUEhPTkVfTlVNQkVSX0JVU0lORVNTXzIiLCAgICAgICAgICAgICAgICAweEREMTEgfSwKKyAgICB7ICJNVFBfUFJPUEVSVFlfUEhPTkVfTlVNQkVSX01PQklMRSIsICAgICAgICAgICAgICAgICAgICAweEREMTIgfSwKKyAgICB7ICJNVFBfUFJPUEVSVFlfUEhPTkVfTlVNQkVSX01PQklMRV8yIiwgICAgICAgICAgICAgICAgICAweEREMTMgfSwKKyAgICB7ICJNVFBfUFJPUEVSVFlfRkFYX05VTUJFUl9QUklNQVJZIiwgICAgICAgICAgICAgICAgICAgICAweEREMTQgfSwKKyAgICB7ICJNVFBfUFJPUEVSVFlfRkFYX05VTUJFUl9QRVJTT05BTCIsICAgICAgICAgICAgICAgICAgICAweEREMTUgfSwKKyAgICB7ICJNVFBfUFJPUEVSVFlfRkFYX05VTUJFUl9CVVNJTkVTUyIsICAgICAgICAgICAgICAgICAgICAweEREMTYgfSwKKyAgICB7ICJNVFBfUFJPUEVSVFlfUEFHRVJfTlVNQkVSIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAweEREMTcgfSwKKyAgICB7ICJNVFBfUFJPUEVSVFlfUEhPTkVfTlVNQkVSX09USEVSUyIsICAgICAgICAgICAgICAgICAgICAweEREMTggfSwKKyAgICB7ICJNVFBfUFJPUEVSVFlfUFJJTUFSWV9XRUJfQUREUkVTUyIsICAgICAgICAgICAgICAgICAgICAweEREMTkgfSwKKyAgICB7ICJNVFBfUFJPUEVSVFlfUEVSU09OQUxfV0VCX0FERFJFU1MiLCAgICAgICAgICAgICAgICAgICAweEREMUEgfSwKKyAgICB7ICJNVFBfUFJPUEVSVFlfQlVTSU5FU1NfV0VCX0FERFJFU1MiLCAgICAgICAgICAgICAgICAgICAweEREMUIgfSwKKyAgICB7ICJNVFBfUFJPUEVSVFlfSU5TVEFOVF9NRVNTQU5HRVJfQUREUkVTUyIsICAgICAgICAgICAgICAweEREMUMgfSwKKyAgICB7ICJNVFBfUFJPUEVSVFlfSU5TVEFOVF9NRVNTQU5HRVJfQUREUkVTU18yIiwgICAgICAgICAgICAweEREMUQgfSwKKyAgICB7ICJNVFBfUFJPUEVSVFlfSU5TVEFOVF9NRVNTQU5HRVJfQUREUkVTU18zIiwgICAgICAgICAgICAweEREMUUgfSwKKyAgICB7ICJNVFBfUFJPUEVSVFlfUE9TVEFMX0FERFJFU1NfUEVSU09OQUxfRlVMTCIsICAgICAgICAgICAweEREMUYgfSwKKyAgICB7ICJNVFBfUFJPUEVSVFlfUE9TVEFMX0FERFJFU1NfUEVSU09OQUxfTElORV8xIiwgICAgICAgICAweEREMjAgfSwKKyAgICB7ICJNVFBfUFJPUEVSVFlfUE9TVEFMX0FERFJFU1NfUEVSU09OQUxfTElORV8yIiwgICAgICAgICAweEREMjEgfSwKKyAgICB7ICJNVFBfUFJPUEVSVFlfUE9TVEFMX0FERFJFU1NfUEVSU09OQUxfQ0lUWSIsICAgICAgICAgICAweEREMjIgfSwKKyAgICB7ICJNVFBfUFJPUEVSVFlfUE9TVEFMX0FERFJFU1NfUEVSU09OQUxfUkVHSU9OIiwgICAgICAgICAweEREMjMgfSwKKyAgICB7ICJNVFBfUFJPUEVSVFlfUE9TVEFMX0FERFJFU1NfUEVSU09OQUxfUE9TVEFMX0NPREUiLCAgICAweEREMjQgfSwKKyAgICB7ICJNVFBfUFJPUEVSVFlfUE9TVEFMX0FERFJFU1NfUEVSU09OQUxfQ09VTlRSWSIsICAgICAgICAweEREMjUgfSwKKyAgICB7ICJNVFBfUFJPUEVSVFlfUE9TVEFMX0FERFJFU1NfQlVTSU5FU1NfRlVMTCIsICAgICAgICAgICAweEREMjYgfSwKKyAgICB7ICJNVFBfUFJPUEVSVFlfUE9TVEFMX0FERFJFU1NfQlVTSU5FU1NfTElORV8xIiwgICAgICAgICAweEREMjcgfSwKKyAgICB7ICJNVFBfUFJPUEVSVFlfUE9TVEFMX0FERFJFU1NfQlVTSU5FU1NfTElORV8yIiwgICAgICAgICAweEREMjggfSwKKyAgICB7ICJNVFBfUFJPUEVSVFlfUE9TVEFMX0FERFJFU1NfQlVTSU5FU1NfQ0lUWSIsICAgICAgICAgICAweEREMjkgfSwKKyAgICB7ICJNVFBfUFJPUEVSVFlfUE9TVEFMX0FERFJFU1NfQlVTSU5FU1NfUkVHSU9OIiwgICAgICAgICAweEREMkEgfSwKKyAgICB7ICJNVFBfUFJPUEVSVFlfUE9TVEFMX0FERFJFU1NfQlVTSU5FU1NfUE9TVEFMX0NPREUiLCAgICAweEREMkIgfSwKKyAgICB7ICJNVFBfUFJPUEVSVFlfUE9TVEFMX0FERFJFU1NfQlVTSU5FU1NfQ09VTlRSWSIsICAgICAgICAweEREMkMgfSwKKyAgICB7ICJNVFBfUFJPUEVSVFlfUE9TVEFMX0FERFJFU1NfT1RIRVJfRlVMTCIsICAgICAgICAgICAgICAweEREMkQgfSwKKyAgICB7ICJNVFBfUFJPUEVSVFlfUE9TVEFMX0FERFJFU1NfT1RIRVJfTElORV8xIiwgICAgICAgICAgICAweEREMkUgfSwKKyAgICB7ICJNVFBfUFJPUEVSVFlfUE9TVEFMX0FERFJFU1NfT1RIRVJfTElORV8yIiwgICAgICAgICAgICAweEREMkYgfSwKKyAgICB7ICJNVFBfUFJPUEVSVFlfUE9TVEFMX0FERFJFU1NfT1RIRVJfQ0lUWSIsICAgICAgICAgICAgICAweEREMzAgfSwKKyAgICB7ICJNVFBfUFJPUEVSVFlfUE9TVEFMX0FERFJFU1NfT1RIRVJfUkVHSU9OIiwgICAgICAgICAgICAweEREMzEgfSwKKyAgICB7ICJNVFBfUFJPUEVSVFlfUE9TVEFMX0FERFJFU1NfT1RIRVJfUE9TVEFMX0NPREUiLCAgICAgICAweEREMzIgfSwKKyAgICB7ICJNVFBfUFJPUEVSVFlfUE9TVEFMX0FERFJFU1NfT1RIRVJfQ09VTlRSWSIsICAgICAgICAgICAweEREMzMgfSwKKyAgICB7ICJNVFBfUFJPUEVSVFlfT1JHQU5JWkFUSU9OX05BTUUiLCAgICAgICAgICAgICAgICAgICAgICAweEREMzQgfSwKKyAgICB7ICJNVFBfUFJPUEVSVFlfUEhPTkVUSUNfT1JHQU5JWkFUSU9OX05BTUUiLCAgICAgICAgICAgICAweEREMzUgfSwKKyAgICB7ICJNVFBfUFJPUEVSVFlfUk9MRSIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweEREMzYgfSwKKyAgICB7ICJNVFBfUFJPUEVSVFlfQklSVEhEQVRFIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweEREMzcgfSwKKyAgICB7ICJNVFBfUFJPUEVSVFlfTUVTU0FHRV9UTyIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweERENDAgfSwKKyAgICB7ICJNVFBfUFJPUEVSVFlfTUVTU0FHRV9DQyIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweERENDEgfSwKKyAgICB7ICJNVFBfUFJPUEVSVFlfTUVTU0FHRV9CQ0MiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAweERENDIgfSwKKyAgICB7ICJNVFBfUFJPUEVSVFlfTUVTU0FHRV9SRUFEIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAweERENDMgfSwKKyAgICB7ICJNVFBfUFJPUEVSVFlfTUVTU0FHRV9SRUNFSVZFRF9USU1FIiwgICAgICAgICAgICAgICAgICAweERENDQgfSwKKyAgICB7ICJNVFBfUFJPUEVSVFlfTUVTU0FHRV9TRU5ERVIiLCAgICAgICAgICAgICAgICAgICAgICAgICAweERENDUgfSwKKyAgICB7ICJNVFBfUFJPUEVSVFlfQUNUSVZJVFlfQkVHSU5fVElNRSIsICAgICAgICAgICAgICAgICAgICAweERENTAgfSwKKyAgICB7ICJNVFBfUFJPUEVSVFlfQUNUSVZJVFlfRU5EX1RJTUUiLCAgICAgICAgICAgICAgICAgICAgICAweERENTEgfSwKKyAgICB7ICJNVFBfUFJPUEVSVFlfQUNUSVZJVFlfTE9DQVRJT04iLCAgICAgICAgICAgICAgICAgICAgICAweERENTIgfSwKKyAgICB7ICJNVFBfUFJPUEVSVFlfQUNUSVZJVFlfUkVRVUlSRURfQVRURU5ERUVTIiwgICAgICAgICAgICAweERENTQgfSwKKyAgICB7ICJNVFBfUFJPUEVSVFlfQUNUSVZJVFlfT1BUSU9OQUxfQVRURU5ERUVTIiwgICAgICAgICAgICAweERENTUgfSwKKyAgICB7ICJNVFBfUFJPUEVSVFlfQUNUSVZJVFlfUkVTT1VSQ0VTIiwgICAgICAgICAgICAgICAgICAgICAweERENTYgfSwKKyAgICB7ICJNVFBfUFJPUEVSVFlfQUNUSVZJVFlfQUNDRVBURUQiLCAgICAgICAgICAgICAgICAgICAgICAweERENTcgfSwKKyAgICB7ICJNVFBfUFJPUEVSVFlfQUNUSVZJVFlfVEVOVEFUSVZFIiwgICAgICAgICAgICAgICAgICAgICAweERENTggfSwKKyAgICB7ICJNVFBfUFJPUEVSVFlfQUNUSVZJVFlfREVDTElORUQiLCAgICAgICAgICAgICAgICAgICAgICAweERENTkgfSwKKyAgICB7ICJNVFBfUFJPUEVSVFlfQUNUSVZJVFlfUkVNQUlOREVSX1RJTUUiLCAgICAgICAgICAgICAgICAweERENUEgfSwKKyAgICB7ICJNVFBfUFJPUEVSVFlfQUNUSVZJVFlfT1dORVIiLCAgICAgICAgICAgICAgICAgICAgICAgICAweERENUIgfSwKKyAgICB7ICJNVFBfUFJPUEVSVFlfQUNUSVZJVFlfU1RBVFVTIiwgICAgICAgICAgICAgICAgICAgICAgICAweERENUMgfSwKKyAgICB7ICJNVFBfUFJPUEVSVFlfT1dORVIiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweERENUQgfSwKKyAgICB7ICJNVFBfUFJPUEVSVFlfRURJVE9SIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweERENUUgfSwKKyAgICB7ICJNVFBfUFJPUEVSVFlfV0VCTUFTVEVSIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweERENUYgfSwKKyAgICB7ICJNVFBfUFJPUEVSVFlfVVJMX1NPVVJDRSIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweERENjAgfSwKKyAgICB7ICJNVFBfUFJPUEVSVFlfVVJMX0RFU1RJTkFUSU9OIiwgICAgICAgICAgICAgICAgICAgICAgICAweERENjEgfSwKKyAgICB7ICJNVFBfUFJPUEVSVFlfVElNRV9CT09LTUFSSyIsICAgICAgICAgICAgICAgICAgICAgICAgICAweERENjIgfSwKKyAgICB7ICJNVFBfUFJPUEVSVFlfT0JKRUNUX0JPT0tNQVJLIiwgICAgICAgICAgICAgICAgICAgICAgICAweERENjMgfSwKKyAgICB7ICJNVFBfUFJPUEVSVFlfQllURV9CT09LTUFSSyIsICAgICAgICAgICAgICAgICAgICAgICAgICAweERENjQgfSwKKyAgICB7ICJNVFBfUFJPUEVSVFlfTEFTVF9CVUlMRF9EQVRFIiwgICAgICAgICAgICAgICAgICAgICAgICAweERENzAgfSwKKyAgICB7ICJNVFBfUFJPUEVSVFlfVElNRV9UT19MSVZFIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAweERENzEgfSwKKyAgICB7ICJNVFBfUFJPUEVSVFlfTUVESUFfR1VJRCIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweERENzIgfSwKKyAgICB7IDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAgICAgfSwKK307CisKK3N0YXRpYyBjb25zdCBDb2RlRW50cnkgc0RldmljZVByb3BDb2Rlc1tdID0geworICAgIHsgIk1UUF9ERVZJQ0VfUFJPUEVSVFlfVU5ERUZJTkVEIiwgICAgICAgICAgICAgICAgICAgICAgIDB4NTAwMCB9LAorICAgIHsgIk1UUF9ERVZJQ0VfUFJPUEVSVFlfQkFUVEVSWV9MRVZFTCIsICAgICAgICAgICAgICAgICAgIDB4NTAwMSB9LAorICAgIHsgIk1UUF9ERVZJQ0VfUFJPUEVSVFlfRlVOQ1RJT05BTF9NT0RFIiwgICAgICAgICAgICAgICAgIDB4NTAwMiB9LAorICAgIHsgIk1UUF9ERVZJQ0VfUFJPUEVSVFlfSU1BR0VfU0laRSIsICAgICAgICAgICAgICAgICAgICAgIDB4NTAwMyB9LAorICAgIHsgIk1UUF9ERVZJQ0VfUFJPUEVSVFlfQ09NUFJFU1NJT05fU0VUVElORyIsICAgICAgICAgICAgIDB4NTAwNCB9LAorICAgIHsgIk1UUF9ERVZJQ0VfUFJPUEVSVFlfV0hJVEVfQkFMQU5DRSIsICAgICAgICAgICAgICAgICAgIDB4NTAwNSB9LAorICAgIHsgIk1UUF9ERVZJQ0VfUFJPUEVSVFlfUkdCX0dBSU4iLCAgICAgICAgICAgICAgICAgICAgICAgIDB4NTAwNiB9LAorICAgIHsgIk1UUF9ERVZJQ0VfUFJPUEVSVFlfRl9OVU1CRVIiLCAgICAgICAgICAgICAgICAgICAgICAgIDB4NTAwNyB9LAorICAgIHsgIk1UUF9ERVZJQ0VfUFJPUEVSVFlfRk9DQUxfTEVOR1RIIiwgICAgICAgICAgICAgICAgICAgIDB4NTAwOCB9LAorICAgIHsgIk1UUF9ERVZJQ0VfUFJPUEVSVFlfRk9DVVNfRElTVEFOQ0UiLCAgICAgICAgICAgICAgICAgIDB4NTAwOSB9LAorICAgIHsgIk1UUF9ERVZJQ0VfUFJPUEVSVFlfRk9DVVNfTU9ERSIsICAgICAgICAgICAgICAgICAgICAgIDB4NTAwQSB9LAorICAgIHsgIk1UUF9ERVZJQ0VfUFJPUEVSVFlfRVhQT1NVUkVfTUVURVJJTkdfTU9ERSIsICAgICAgICAgIDB4NTAwQiB9LAorICAgIHsgIk1UUF9ERVZJQ0VfUFJPUEVSVFlfRkxBU0hfTU9ERSIsICAgICAgICAgICAgICAgICAgICAgIDB4NTAwQyB9LAorICAgIHsgIk1UUF9ERVZJQ0VfUFJPUEVSVFlfRVhQT1NVUkVfVElNRSIsICAgICAgICAgICAgICAgICAgIDB4NTAwRCB9LAorICAgIHsgIk1UUF9ERVZJQ0VfUFJPUEVSVFlfRVhQT1NVUkVfUFJPR1JBTV9NT0RFIiwgICAgICAgICAgIDB4NTAwRSB9LAorICAgIHsgIk1UUF9ERVZJQ0VfUFJPUEVSVFlfRVhQT1NVUkVfSU5ERVgiLCAgICAgICAgICAgICAgICAgIDB4NTAwRiB9LAorICAgIHsgIk1UUF9ERVZJQ0VfUFJPUEVSVFlfRVhQT1NVUkVfQklBU19DT01QRU5TQVRJT04iLCAgICAgIDB4NTAxMCB9LAorICAgIHsgIk1UUF9ERVZJQ0VfUFJPUEVSVFlfREFURVRJTUUiLCAgICAgICAgICAgICAgICAgICAgICAgIDB4NTAxMSB9LAorICAgIHsgIk1UUF9ERVZJQ0VfUFJPUEVSVFlfQ0FQVFVSRV9ERUxBWSIsICAgICAgICAgICAgICAgICAgIDB4NTAxMiB9LAorICAgIHsgIk1UUF9ERVZJQ0VfUFJPUEVSVFlfU1RJTExfQ0FQVFVSRV9NT0RFIiwgICAgICAgICAgICAgIDB4NTAxMyB9LAorICAgIHsgIk1UUF9ERVZJQ0VfUFJPUEVSVFlfQ09OVFJBU1QiLCAgICAgICAgICAgICAgICAgICAgICAgIDB4NTAxNCB9LAorICAgIHsgIk1UUF9ERVZJQ0VfUFJPUEVSVFlfU0hBUlBORVNTIiwgICAgICAgICAgICAgICAgICAgICAgIDB4NTAxNSB9LAorICAgIHsgIk1UUF9ERVZJQ0VfUFJPUEVSVFlfRElHSVRBTF9aT09NIiwgICAgICAgICAgICAgICAgICAgIDB4NTAxNiB9LAorICAgIHsgIk1UUF9ERVZJQ0VfUFJPUEVSVFlfRUZGRUNUX01PREUiLCAgICAgICAgICAgICAgICAgICAgIDB4NTAxNyB9LAorICAgIHsgIk1UUF9ERVZJQ0VfUFJPUEVSVFlfQlVSU1RfTlVNQkVSIiwgICAgICAgICAgICAgICAgICAgIDB4NTAxOCB9LAorICAgIHsgIk1UUF9ERVZJQ0VfUFJPUEVSVFlfQlVSU1RfSU5URVJWQUwiLCAgICAgICAgICAgICAgICAgIDB4NTAxOSB9LAorICAgIHsgIk1UUF9ERVZJQ0VfUFJPUEVSVFlfVElNRUxBUFNFX05VTUJFUiIsICAgICAgICAgICAgICAgIDB4NTAxQSB9LAorICAgIHsgIk1UUF9ERVZJQ0VfUFJPUEVSVFlfVElNRUxBUFNFX0lOVEVSVkFMIiwgICAgICAgICAgICAgIDB4NTAxQiB9LAorICAgIHsgIk1UUF9ERVZJQ0VfUFJPUEVSVFlfRk9DVVNfTUVURVJJTkdfTU9ERSIsICAgICAgICAgICAgIDB4NTAxQyB9LAorICAgIHsgIk1UUF9ERVZJQ0VfUFJPUEVSVFlfVVBMT0FEX1VSTCIsICAgICAgICAgICAgICAgICAgICAgIDB4NTAxRCB9LAorICAgIHsgIk1UUF9ERVZJQ0VfUFJPUEVSVFlfQVJUSVNUIiwgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NTAxRSB9LAorICAgIHsgIk1UUF9ERVZJQ0VfUFJPUEVSVFlfQ09QWVJJR0hUX0lORk8iLCAgICAgICAgICAgICAgICAgIDB4NTAxRiB9LAorICAgIHsgIk1UUF9ERVZJQ0VfUFJPUEVSVFlfU1lOQ0hST05JWkFUSU9OX1BBUlRORVIiLCAgICAgICAgIDB4RDQwMSB9LAorICAgIHsgIk1UUF9ERVZJQ0VfUFJPUEVSVFlfREVWSUNFX0ZSSUVORExZX05BTUUiLCAgICAgICAgICAgIDB4RDQwMiB9LAorICAgIHsgIk1UUF9ERVZJQ0VfUFJPUEVSVFlfVk9MVU1FIiwgICAgICAgICAgICAgICAgICAgICAgICAgIDB4RDQwMyB9LAorICAgIHsgIk1UUF9ERVZJQ0VfUFJPUEVSVFlfU1VQUE9SVEVEX0ZPUk1BVFNfT1JERVJFRCIsICAgICAgIDB4RDQwNCB9LAorICAgIHsgIk1UUF9ERVZJQ0VfUFJPUEVSVFlfREVWSUNFX0lDT04iLCAgICAgICAgICAgICAgICAgICAgIDB4RDQwNSB9LAorICAgIHsgIk1UUF9ERVZJQ0VfUFJPUEVSVFlfUExBWUJBQ0tfUkFURSIsICAgICAgICAgICAgICAgICAgIDB4RDQxMCB9LAorICAgIHsgIk1UUF9ERVZJQ0VfUFJPUEVSVFlfUExBWUJBQ0tfT0JKRUNUIiwgICAgICAgICAgICAgICAgIDB4RDQxMSB9LAorICAgIHsgIk1UUF9ERVZJQ0VfUFJPUEVSVFlfUExBWUJBQ0tfQ09OVEFJTkVSX0lOREVYIiwgICAgICAgIDB4RDQxMiB9LAorICAgIHsgIk1UUF9ERVZJQ0VfUFJPUEVSVFlfU0VTU0lPTl9JTklUSUFUT1JfVkVSU0lPTl9JTkZPIiwgIDB4RDQwNiB9LAorICAgIHsgIk1UUF9ERVZJQ0VfUFJPUEVSVFlfUEVSQ0VJVkVEX0RFVklDRV9UWVBFIiwgICAgICAgICAgIDB4RDQwNyB9LAorICAgIHsgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICB9LAorfTsKKworc3RhdGljIGNvbnN0IGNoYXIqIGdldENvZGVOYW1lKHVpbnQxNl90IGNvZGUsIGNvbnN0IENvZGVFbnRyeSogdGFibGUpIHsKKyAgICBjb25zdCBDb2RlRW50cnkqIGVudHJ5ID0gdGFibGU7CisgICAgd2hpbGUgKGVudHJ5LT5uYW1lKSB7CisgICAgICAgIGlmIChlbnRyeS0+Y29kZSA9PSBjb2RlKQorICAgICAgICAgICAgcmV0dXJuIGVudHJ5LT5uYW1lOworICAgICAgICBlbnRyeSsrOworICAgIH0KKyAgICByZXR1cm4gIlVOS05PV04iOworfQorCitjb25zdCBjaGFyKiBNdHBEZWJ1Zzo6Z2V0T3BlcmF0aW9uQ29kZU5hbWUoTXRwT3BlcmF0aW9uQ29kZSBjb2RlKSB7CisgICAgcmV0dXJuIGdldENvZGVOYW1lKGNvZGUsIHNPcGVyYXRpb25Db2Rlcyk7Cit9CisKK2NvbnN0IGNoYXIqIE10cERlYnVnOjpnZXRGb3JtYXRDb2RlTmFtZShNdHBPcGVyYXRpb25Db2RlIGNvZGUpIHsKKyAgICByZXR1cm4gZ2V0Q29kZU5hbWUoY29kZSwgc0Zvcm1hdENvZGVzKTsKK30KKworY29uc3QgY2hhciogTXRwRGVidWc6OmdldE9iamVjdFByb3BDb2RlTmFtZShNdHBQcm9wZXJ0eUNvZGUgY29kZSkgeworICAgIHJldHVybiBnZXRDb2RlTmFtZShjb2RlLCBzT2JqZWN0UHJvcENvZGVzKTsKK30KKworY29uc3QgY2hhciogTXRwRGVidWc6OmdldERldmljZVByb3BDb2RlTmFtZShNdHBQcm9wZXJ0eUNvZGUgY29kZSkgeworICAgIHJldHVybiBnZXRDb2RlTmFtZShjb2RlLCBzRGV2aWNlUHJvcENvZGVzKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL210cC9NdHBEZWJ1Zy5oIGIvbWVkaWEvbXRwL010cERlYnVnLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWI1M2UzMQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL210cC9NdHBEZWJ1Zy5oCkBAIC0wLDAgKzEsMzcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9NVFBfREVCVUdfSAorI2RlZmluZSBfTVRQX0RFQlVHX0gKKworLy8gI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgIk10cFR5cGVzLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY2xhc3MgTXRwRGVidWcgeworcHVibGljOgorICAgIHN0YXRpYyBjb25zdCBjaGFyKiBnZXRPcGVyYXRpb25Db2RlTmFtZShNdHBPcGVyYXRpb25Db2RlIGNvZGUpOworICAgIHN0YXRpYyBjb25zdCBjaGFyKiBnZXRGb3JtYXRDb2RlTmFtZShNdHBPYmplY3RGb3JtYXQgY29kZSk7CisgICAgc3RhdGljIGNvbnN0IGNoYXIqIGdldE9iamVjdFByb3BDb2RlTmFtZShNdHBQcm9wZXJ0eUNvZGUgY29kZSk7CisgICAgc3RhdGljIGNvbnN0IGNoYXIqIGdldERldmljZVByb3BDb2RlTmFtZShNdHBQcm9wZXJ0eUNvZGUgY29kZSk7Cit9OworCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgLy8gX01UUF9ERUJVR19ICmRpZmYgLS1naXQgYS9tZWRpYS9tdHAvTXRwRGV2aWNlLmNwcCBiL21lZGlhL210cC9NdHBEZXZpY2UuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZjYTAxNDIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9tdHAvTXRwRGV2aWNlLmNwcApAQCAtMCwwICsxLDQ5NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiTXRwRGV2aWNlIgorCisjaW5jbHVkZSAiTXRwRGVidWcuaCIKKyNpbmNsdWRlICJNdHBEZXZpY2UuaCIKKyNpbmNsdWRlICJNdHBEZXZpY2VJbmZvLmgiCisjaW5jbHVkZSAiTXRwT2JqZWN0SW5mby5oIgorI2luY2x1ZGUgIk10cFByb3BlcnR5LmgiCisjaW5jbHVkZSAiTXRwU3RvcmFnZUluZm8uaCIKKyNpbmNsdWRlICJNdHBTdHJpbmdCdWZmZXIuaCIKKyNpbmNsdWRlICJNdHBVdGlscy5oIgorCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvaW9jdGwuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxlbmRpYW4uaD4KKworI2luY2x1ZGUgPHVzYmhvc3QvdXNiaG9zdC5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK010cERldmljZTo6TXRwRGV2aWNlKHN0cnVjdCB1c2JfZGV2aWNlKiBkZXZpY2UsIGludCBpbnRlcmZhY2UsCisgICAgICAgICAgICBzdHJ1Y3QgdXNiX2VuZHBvaW50ICplcF9pbiwgc3RydWN0IHVzYl9lbmRwb2ludCAqZXBfb3V0LAorICAgICAgICAgICAgc3RydWN0IHVzYl9lbmRwb2ludCAqZXBfaW50cikKKyAgICA6ICAgbURldmljZShkZXZpY2UpLAorICAgICAgICBtSW50ZXJmYWNlKGludGVyZmFjZSksCisgICAgICAgIG1FbmRwb2ludEluKGVwX2luKSwKKyAgICAgICAgbUVuZHBvaW50T3V0KGVwX291dCksCisgICAgICAgIG1FbmRwb2ludEludHIoZXBfaW50ciksCisgICAgICAgIG1EZXZpY2VJbmZvKE5VTEwpLAorICAgICAgICBtSUQodXNiX2RldmljZV9nZXRfdW5pcXVlX2lkKGRldmljZSkpLAorICAgICAgICBtU2Vzc2lvbklEKDApLAorICAgICAgICBtVHJhbnNhY3Rpb25JRCgwKQoreworfQorCitNdHBEZXZpY2U6On5NdHBEZXZpY2UoKSB7CisgICAgY2xvc2UoKTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IG1EZXZpY2VQcm9wZXJ0aWVzLnNpemUoKTsgaSsrKQorICAgICAgICBkZWxldGUgbURldmljZVByb3BlcnRpZXNbaV07Cit9CisKK3ZvaWQgTXRwRGV2aWNlOjppbml0aWFsaXplKCkgeworICAgIG9wZW5TZXNzaW9uKCk7CisgICAgbURldmljZUluZm8gPSBnZXREZXZpY2VJbmZvKCk7CisgICAgaWYgKG1EZXZpY2VJbmZvKSB7CisgICAgICAgIG1EZXZpY2VJbmZvLT5wcmludCgpOworCisgICAgICAgIGlmIChtRGV2aWNlSW5mby0+bURldmljZVByb3BlcnRpZXMpIHsKKyAgICAgICAgICAgIGludCBjb3VudCA9IG1EZXZpY2VJbmZvLT5tRGV2aWNlUHJvcGVydGllcy0+c2l6ZSgpOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisgICAgICAgICAgICAgICAgTXRwRGV2aWNlUHJvcGVydHkgcHJvcENvZGUgPSAoKm1EZXZpY2VJbmZvLT5tRGV2aWNlUHJvcGVydGllcylbaV07CisgICAgICAgICAgICAgICAgTXRwUHJvcGVydHkqIHByb3BlcnR5ID0gZ2V0RGV2aWNlUHJvcERlc2MocHJvcENvZGUpOworICAgICAgICAgICAgICAgIGlmIChwcm9wZXJ0eSkgeworICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eS0+cHJpbnQoKTsKKyAgICAgICAgICAgICAgICAgICAgbURldmljZVByb3BlcnRpZXMucHVzaChwcm9wZXJ0eSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCit2b2lkIE10cERldmljZTo6Y2xvc2UoKSB7CisgICAgaWYgKG1EZXZpY2UpIHsKKyAgICAgICAgdXNiX2RldmljZV9yZWxlYXNlX2ludGVyZmFjZShtRGV2aWNlLCBtSW50ZXJmYWNlKTsKKyAgICAgICAgdXNiX2RldmljZV9jbG9zZShtRGV2aWNlKTsKKyAgICAgICAgbURldmljZSA9IE5VTEw7CisgICAgfQorfQorCitjb25zdCBjaGFyKiBNdHBEZXZpY2U6OmdldERldmljZU5hbWUoKSB7CisgICAgaWYgKG1EZXZpY2UpCisgICAgICAgIHJldHVybiB1c2JfZGV2aWNlX2dldF9uYW1lKG1EZXZpY2UpOworICAgIGVsc2UKKyAgICAgICAgcmV0dXJuICI/Pz8iOworfQorCitib29sIE10cERldmljZTo6b3BlblNlc3Npb24oKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1NdXRleCk7CisKKyAgICBtU2Vzc2lvbklEID0gMDsKKyAgICBtVHJhbnNhY3Rpb25JRCA9IDA7CisgICAgTXRwU2Vzc2lvbklEIG5ld1Nlc3Npb24gPSAxOworICAgIG1SZXF1ZXN0LnJlc2V0KCk7CisgICAgbVJlcXVlc3Quc2V0UGFyYW1ldGVyKDEsIG5ld1Nlc3Npb24pOworICAgIGlmICghc2VuZFJlcXVlc3QoTVRQX09QRVJBVElPTl9PUEVOX1NFU1NJT04pKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgTXRwUmVzcG9uc2VDb2RlIHJldCA9IHJlYWRSZXNwb25zZSgpOworICAgIGlmIChyZXQgPT0gTVRQX1JFU1BPTlNFX1NFU1NJT05fQUxSRUFEWV9PUEVOKQorICAgICAgICBuZXdTZXNzaW9uID0gbVJlc3BvbnNlLmdldFBhcmFtZXRlcigxKTsKKyAgICBlbHNlIGlmIChyZXQgIT0gTVRQX1JFU1BPTlNFX09LKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBtU2Vzc2lvbklEID0gbmV3U2Vzc2lvbjsKKyAgICBtVHJhbnNhY3Rpb25JRCA9IDE7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgTXRwRGV2aWNlOjpjbG9zZVNlc3Npb24oKSB7CisgICAgLy8gRklYTUUKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworTXRwRGV2aWNlSW5mbyogTXRwRGV2aWNlOjpnZXREZXZpY2VJbmZvKCkgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTXV0ZXgpOworCisgICAgbVJlcXVlc3QucmVzZXQoKTsKKyAgICBpZiAoIXNlbmRSZXF1ZXN0KE1UUF9PUEVSQVRJT05fR0VUX0RFVklDRV9JTkZPKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFyZWFkRGF0YSgpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBNdHBSZXNwb25zZUNvZGUgcmV0ID0gcmVhZFJlc3BvbnNlKCk7CisgICAgaWYgKHJldCA9PSBNVFBfUkVTUE9OU0VfT0spIHsKKyAgICAgICAgTXRwRGV2aWNlSW5mbyogaW5mbyA9IG5ldyBNdHBEZXZpY2VJbmZvOworICAgICAgICBpbmZvLT5yZWFkKG1EYXRhKTsKKyAgICAgICAgcmV0dXJuIGluZm87CisgICAgfQorICAgIHJldHVybiBOVUxMOworfQorCitNdHBTdG9yYWdlSURMaXN0KiBNdHBEZXZpY2U6OmdldFN0b3JhZ2VJRHMoKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1NdXRleCk7CisKKyAgICBtUmVxdWVzdC5yZXNldCgpOworICAgIGlmICghc2VuZFJlcXVlc3QoTVRQX09QRVJBVElPTl9HRVRfU1RPUkFHRV9JRFMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIXJlYWREYXRhKCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIE10cFJlc3BvbnNlQ29kZSByZXQgPSByZWFkUmVzcG9uc2UoKTsKKyAgICBpZiAocmV0ID09IE1UUF9SRVNQT05TRV9PSykgeworICAgICAgICByZXR1cm4gbURhdGEuZ2V0QVVJbnQzMigpOworICAgIH0KKyAgICByZXR1cm4gTlVMTDsKK30KKworTXRwU3RvcmFnZUluZm8qIE10cERldmljZTo6Z2V0U3RvcmFnZUluZm8oTXRwU3RvcmFnZUlEIHN0b3JhZ2VJRCkgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTXV0ZXgpOworCisgICAgbVJlcXVlc3QucmVzZXQoKTsKKyAgICBtUmVxdWVzdC5zZXRQYXJhbWV0ZXIoMSwgc3RvcmFnZUlEKTsKKyAgICBpZiAoIXNlbmRSZXF1ZXN0KE1UUF9PUEVSQVRJT05fR0VUX1NUT1JBR0VfSU5GTykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghcmVhZERhdGEoKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgTXRwUmVzcG9uc2VDb2RlIHJldCA9IHJlYWRSZXNwb25zZSgpOworICAgIGlmIChyZXQgPT0gTVRQX1JFU1BPTlNFX09LKSB7CisgICAgICAgIE10cFN0b3JhZ2VJbmZvKiBpbmZvID0gbmV3IE10cFN0b3JhZ2VJbmZvKHN0b3JhZ2VJRCk7CisgICAgICAgIGluZm8tPnJlYWQobURhdGEpOworICAgICAgICByZXR1cm4gaW5mbzsKKyAgICB9CisgICAgcmV0dXJuIE5VTEw7Cit9CisKK010cE9iamVjdEhhbmRsZUxpc3QqIE10cERldmljZTo6Z2V0T2JqZWN0SGFuZGxlcyhNdHBTdG9yYWdlSUQgc3RvcmFnZUlELAorICAgICAgICAgICAgTXRwT2JqZWN0Rm9ybWF0IGZvcm1hdCwgTXRwT2JqZWN0SGFuZGxlIHBhcmVudCkgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTXV0ZXgpOworCisgICAgbVJlcXVlc3QucmVzZXQoKTsKKyAgICBtUmVxdWVzdC5zZXRQYXJhbWV0ZXIoMSwgc3RvcmFnZUlEKTsKKyAgICBtUmVxdWVzdC5zZXRQYXJhbWV0ZXIoMiwgZm9ybWF0KTsKKyAgICBtUmVxdWVzdC5zZXRQYXJhbWV0ZXIoMywgcGFyZW50KTsKKyAgICBpZiAoIXNlbmRSZXF1ZXN0KE1UUF9PUEVSQVRJT05fR0VUX09CSkVDVF9IQU5ETEVTKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFyZWFkRGF0YSgpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBNdHBSZXNwb25zZUNvZGUgcmV0ID0gcmVhZFJlc3BvbnNlKCk7CisgICAgaWYgKHJldCA9PSBNVFBfUkVTUE9OU0VfT0spIHsKKyAgICAgICAgcmV0dXJuIG1EYXRhLmdldEFVSW50MzIoKTsKKyAgICB9CisgICAgcmV0dXJuIE5VTEw7Cit9CisKK010cE9iamVjdEluZm8qIE10cERldmljZTo6Z2V0T2JqZWN0SW5mbyhNdHBPYmplY3RIYW5kbGUgaGFuZGxlKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1NdXRleCk7CisKKyAgICAvLyBGSVhNRSAtIHdlIG1pZ2h0IHdhbnQgdG8gYWRkIHNvbWUgY2FjaGluZyBoZXJlCisKKyAgICBtUmVxdWVzdC5yZXNldCgpOworICAgIG1SZXF1ZXN0LnNldFBhcmFtZXRlcigxLCBoYW5kbGUpOworICAgIGlmICghc2VuZFJlcXVlc3QoTVRQX09QRVJBVElPTl9HRVRfT0JKRUNUX0lORk8pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIXJlYWREYXRhKCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIE10cFJlc3BvbnNlQ29kZSByZXQgPSByZWFkUmVzcG9uc2UoKTsKKyAgICBpZiAocmV0ID09IE1UUF9SRVNQT05TRV9PSykgeworICAgICAgICBNdHBPYmplY3RJbmZvKiBpbmZvID0gbmV3IE10cE9iamVjdEluZm8oaGFuZGxlKTsKKyAgICAgICAgaW5mby0+cmVhZChtRGF0YSk7CisgICAgICAgIHJldHVybiBpbmZvOworICAgIH0KKyAgICByZXR1cm4gTlVMTDsKK30KKwordm9pZCogTXRwRGV2aWNlOjpnZXRUaHVtYm5haWwoTXRwT2JqZWN0SGFuZGxlIGhhbmRsZSwgaW50JiBvdXRMZW5ndGgpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobU11dGV4KTsKKworICAgIG1SZXF1ZXN0LnJlc2V0KCk7CisgICAgbVJlcXVlc3Quc2V0UGFyYW1ldGVyKDEsIGhhbmRsZSk7CisgICAgaWYgKHNlbmRSZXF1ZXN0KE1UUF9PUEVSQVRJT05fR0VUX1RIVU1CKSAmJiByZWFkRGF0YSgpKSB7CisgICAgICAgIE10cFJlc3BvbnNlQ29kZSByZXQgPSByZWFkUmVzcG9uc2UoKTsKKyAgICAgICAgaWYgKHJldCA9PSBNVFBfUkVTUE9OU0VfT0spIHsKKyAgICAgICAgICAgIHJldHVybiBtRGF0YS5nZXREYXRhKG91dExlbmd0aCk7CisgICAgICAgIH0KKyAgICB9CisgICAgb3V0TGVuZ3RoID0gMDsKKyAgICByZXR1cm4gTlVMTDsKK30KKworTXRwT2JqZWN0SGFuZGxlIE10cERldmljZTo6c2VuZE9iamVjdEluZm8oTXRwT2JqZWN0SW5mbyogaW5mbykgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTXV0ZXgpOworCisgICAgbVJlcXVlc3QucmVzZXQoKTsKKyAgICBNdHBPYmplY3RIYW5kbGUgcGFyZW50ID0gaW5mby0+bVBhcmVudDsKKyAgICBpZiAocGFyZW50ID09IDApCisgICAgICAgIHBhcmVudCA9IE1UUF9QQVJFTlRfUk9PVDsKKworICAgIG1SZXF1ZXN0LnNldFBhcmFtZXRlcigxLCBpbmZvLT5tU3RvcmFnZUlEKTsKKyAgICBtUmVxdWVzdC5zZXRQYXJhbWV0ZXIoMiwgaW5mby0+bVBhcmVudCk7CisKKyAgICBtRGF0YS5wdXRVSW50MzIoaW5mby0+bVN0b3JhZ2VJRCk7CisgICAgbURhdGEucHV0VUludDE2KGluZm8tPm1Gb3JtYXQpOworICAgIG1EYXRhLnB1dFVJbnQxNihpbmZvLT5tUHJvdGVjdGlvblN0YXR1cyk7CisgICAgbURhdGEucHV0VUludDMyKGluZm8tPm1Db21wcmVzc2VkU2l6ZSk7CisgICAgbURhdGEucHV0VUludDE2KGluZm8tPm1UaHVtYkZvcm1hdCk7CisgICAgbURhdGEucHV0VUludDMyKGluZm8tPm1UaHVtYkNvbXByZXNzZWRTaXplKTsKKyAgICBtRGF0YS5wdXRVSW50MzIoaW5mby0+bVRodW1iUGl4V2lkdGgpOworICAgIG1EYXRhLnB1dFVJbnQzMihpbmZvLT5tVGh1bWJQaXhIZWlnaHQpOworICAgIG1EYXRhLnB1dFVJbnQzMihpbmZvLT5tSW1hZ2VQaXhXaWR0aCk7CisgICAgbURhdGEucHV0VUludDMyKGluZm8tPm1JbWFnZVBpeEhlaWdodCk7CisgICAgbURhdGEucHV0VUludDMyKGluZm8tPm1JbWFnZVBpeERlcHRoKTsKKyAgICBtRGF0YS5wdXRVSW50MzIoaW5mby0+bVBhcmVudCk7CisgICAgbURhdGEucHV0VUludDE2KGluZm8tPm1Bc3NvY2lhdGlvblR5cGUpOworICAgIG1EYXRhLnB1dFVJbnQzMihpbmZvLT5tQXNzb2NpYXRpb25EZXNjKTsKKyAgICBtRGF0YS5wdXRVSW50MzIoaW5mby0+bVNlcXVlbmNlTnVtYmVyKTsKKyAgICBtRGF0YS5wdXRTdHJpbmcoaW5mby0+bU5hbWUpOworCisgICAgY2hhciBjcmVhdGVkWzEwMF0sIG1vZGlmaWVkWzEwMF07CisgICAgZm9ybWF0RGF0ZVRpbWUoaW5mby0+bURhdGVDcmVhdGVkLCBjcmVhdGVkLCBzaXplb2YoY3JlYXRlZCkpOworICAgIGZvcm1hdERhdGVUaW1lKGluZm8tPm1EYXRlTW9kaWZpZWQsIG1vZGlmaWVkLCBzaXplb2YobW9kaWZpZWQpKTsKKworICAgIG1EYXRhLnB1dFN0cmluZyhjcmVhdGVkKTsKKyAgICBtRGF0YS5wdXRTdHJpbmcobW9kaWZpZWQpOworICAgIGlmIChpbmZvLT5tS2V5d29yZHMpCisgICAgICAgIG1EYXRhLnB1dFN0cmluZyhpbmZvLT5tS2V5d29yZHMpOworICAgIGVsc2UKKyAgICAgICAgbURhdGEucHV0RW1wdHlTdHJpbmcoKTsKKworICAgaWYgKHNlbmRSZXF1ZXN0KE1UUF9PUEVSQVRJT05fU0VORF9PQkpFQ1RfSU5GTykgJiYgc2VuZERhdGEoKSkgeworICAgICAgICBNdHBSZXNwb25zZUNvZGUgcmV0ID0gcmVhZFJlc3BvbnNlKCk7CisgICAgICAgIGlmIChyZXQgPT0gTVRQX1JFU1BPTlNFX09LKSB7CisgICAgICAgICAgICBpbmZvLT5tU3RvcmFnZUlEID0gbVJlc3BvbnNlLmdldFBhcmFtZXRlcigxKTsKKyAgICAgICAgICAgIGluZm8tPm1QYXJlbnQgPSBtUmVzcG9uc2UuZ2V0UGFyYW1ldGVyKDIpOworICAgICAgICAgICAgaW5mby0+bUhhbmRsZSA9IG1SZXNwb25zZS5nZXRQYXJhbWV0ZXIoMyk7CisgICAgICAgICAgICByZXR1cm4gaW5mby0+bUhhbmRsZTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gKE10cE9iamVjdEhhbmRsZSktMTsKK30KKworYm9vbCBNdHBEZXZpY2U6OnNlbmRPYmplY3QoTXRwT2JqZWN0SW5mbyogaW5mbywgaW50IHNyY0ZEKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1NdXRleCk7CisKKyAgICBpbnQgcmVtYWluaW5nID0gaW5mby0+bUNvbXByZXNzZWRTaXplOworICAgIG1SZXF1ZXN0LnJlc2V0KCk7CisgICAgbVJlcXVlc3Quc2V0UGFyYW1ldGVyKDEsIGluZm8tPm1IYW5kbGUpOworICAgIGlmIChzZW5kUmVxdWVzdChNVFBfT1BFUkFUSU9OX1NFTkRfT0JKRUNUKSkgeworICAgICAgICAvLyBzZW5kIGRhdGEgaGVhZGVyCisgICAgICAgIHdyaXRlRGF0YUhlYWRlcihNVFBfT1BFUkFUSU9OX1NFTkRfT0JKRUNULCByZW1haW5pbmcpOworCisgICAgICAgIGNoYXIgYnVmZmVyWzY1NTM2XTsKKyAgICAgICAgd2hpbGUgKHJlbWFpbmluZyA+IDApIHsKKyAgICAgICAgICAgIGludCBjb3VudCA9IHJlYWQoc3JjRkQsIGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlcikpOworICAgICAgICAgICAgaWYgKGNvdW50ID4gMCkgeworICAgICAgICAgICAgICAgIGludCB3cml0dGVuID0gbURhdGEud3JpdGUobUVuZHBvaW50T3V0LCBidWZmZXIsIGNvdW50KTsKKyAgICAgICAgICAgICAgICAvLyBGSVhNRSBjaGVjayBlcnJvcgorICAgICAgICAgICAgICAgIHJlbWFpbmluZyAtPSBjb3VudDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgTXRwUmVzcG9uc2VDb2RlIHJldCA9IHJlYWRSZXNwb25zZSgpOworICAgIHJldHVybiAocmVtYWluaW5nID09IDAgJiYgcmV0ID09IE1UUF9SRVNQT05TRV9PSyk7Cit9CisKK2Jvb2wgTXRwRGV2aWNlOjpkZWxldGVPYmplY3QoTXRwT2JqZWN0SGFuZGxlIGhhbmRsZSkgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTXV0ZXgpOworCisgICAgbVJlcXVlc3QucmVzZXQoKTsKKyAgICBtUmVxdWVzdC5zZXRQYXJhbWV0ZXIoMSwgaGFuZGxlKTsKKyAgICBpZiAoc2VuZFJlcXVlc3QoTVRQX09QRVJBVElPTl9ERUxFVEVfT0JKRUNUKSkgeworICAgICAgICBNdHBSZXNwb25zZUNvZGUgcmV0ID0gcmVhZFJlc3BvbnNlKCk7CisgICAgICAgIGlmIChyZXQgPT0gTVRQX1JFU1BPTlNFX09LKQorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKK30KKworTXRwT2JqZWN0SGFuZGxlIE10cERldmljZTo6Z2V0UGFyZW50KE10cE9iamVjdEhhbmRsZSBoYW5kbGUpIHsKKyAgICBNdHBPYmplY3RJbmZvKiBpbmZvID0gZ2V0T2JqZWN0SW5mbyhoYW5kbGUpOworICAgIGlmIChpbmZvKQorICAgICAgICByZXR1cm4gaW5mby0+bVBhcmVudDsKKyAgICBlbHNlCisgICAgICAgIHJldHVybiAtMTsKK30KKworTXRwT2JqZWN0SGFuZGxlIE10cERldmljZTo6Z2V0U3RvcmFnZUlEKE10cE9iamVjdEhhbmRsZSBoYW5kbGUpIHsKKyAgICBNdHBPYmplY3RJbmZvKiBpbmZvID0gZ2V0T2JqZWN0SW5mbyhoYW5kbGUpOworICAgIGlmIChpbmZvKQorICAgICAgICByZXR1cm4gaW5mby0+bVN0b3JhZ2VJRDsKKyAgICBlbHNlCisgICAgICAgIHJldHVybiAtMTsKK30KKworTXRwUHJvcGVydHkqIE10cERldmljZTo6Z2V0RGV2aWNlUHJvcERlc2MoTXRwRGV2aWNlUHJvcGVydHkgY29kZSkgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTXV0ZXgpOworCisgICAgbVJlcXVlc3QucmVzZXQoKTsKKyAgICBtUmVxdWVzdC5zZXRQYXJhbWV0ZXIoMSwgY29kZSk7CisgICAgaWYgKCFzZW5kUmVxdWVzdChNVFBfT1BFUkFUSU9OX0dFVF9ERVZJQ0VfUFJPUF9ERVNDKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFyZWFkRGF0YSgpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBNdHBSZXNwb25zZUNvZGUgcmV0ID0gcmVhZFJlc3BvbnNlKCk7CisgICAgaWYgKHJldCA9PSBNVFBfUkVTUE9OU0VfT0spIHsKKyAgICAgICAgTXRwUHJvcGVydHkqIHByb3BlcnR5ID0gbmV3IE10cFByb3BlcnR5OworICAgICAgICBwcm9wZXJ0eS0+cmVhZChtRGF0YSk7CisgICAgICAgIHJldHVybiBwcm9wZXJ0eTsKKyAgICB9CisgICAgcmV0dXJuIE5VTEw7Cit9CisKK2NsYXNzIFJlYWRPYmplY3RUaHJlYWQgOiBwdWJsaWMgVGhyZWFkIHsKK3ByaXZhdGU6CisgICAgTXRwRGV2aWNlKiAgICAgICAgICBtRGV2aWNlOworICAgIE10cE9iamVjdEhhbmRsZSAgICAgbUhhbmRsZTsKKyAgICBpbnQgICAgICAgICAgICAgICAgIG1PYmplY3RTaXplOworICAgIHZvaWQqICAgICAgICAgICAgICAgbUluaXRpYWxEYXRhOworICAgIGludCAgICAgICAgICAgICAgICAgbUluaXRpYWxEYXRhTGVuZ3RoOworICAgIGludCAgICAgICAgICAgICAgICAgbUZEOworCitwdWJsaWM6CisgICAgUmVhZE9iamVjdFRocmVhZChNdHBEZXZpY2UqIGRldmljZSwgTXRwT2JqZWN0SGFuZGxlIGhhbmRsZSwgaW50IG9iamVjdFNpemUpCisgICAgICAgIDogbURldmljZShkZXZpY2UpLAorICAgICAgICAgIG1IYW5kbGUoaGFuZGxlKSwKKyAgICAgICAgICBtT2JqZWN0U2l6ZShvYmplY3RTaXplKSwKKyAgICAgICAgICBtSW5pdGlhbERhdGEoTlVMTCksCisgICAgICAgICAgbUluaXRpYWxEYXRhTGVuZ3RoKDApCisgICAgeworICAgIH0KKworICAgIHZpcnR1YWwgflJlYWRPYmplY3RUaHJlYWQoKSB7CisgICAgICAgIGlmIChtRkQgPj0gMCkKKyAgICAgICAgICAgIGNsb3NlKG1GRCk7CisgICAgICAgIGZyZWUobUluaXRpYWxEYXRhKTsKKyAgICB9CisKKyAgICAvLyByZXR1cm5zIGZpbGUgZGVzY3JpcHRvcgorICAgIGludCBpbml0KCkgeworICAgICAgICBtRGV2aWNlLT5tUmVxdWVzdC5yZXNldCgpOworICAgICAgICBtRGV2aWNlLT5tUmVxdWVzdC5zZXRQYXJhbWV0ZXIoMSwgbUhhbmRsZSk7CisgICAgICAgIGlmIChtRGV2aWNlLT5zZW5kUmVxdWVzdChNVFBfT1BFUkFUSU9OX0dFVF9PQkpFQ1QpCisgICAgICAgICAgICAgICAgJiYgbURldmljZS0+bURhdGEucmVhZERhdGFIZWFkZXIobURldmljZS0+bUVuZHBvaW50SW4pKSB7CisKKyAgICAgICAgICAgIC8vIG1EYXRhIHdpbGwgY29udGFpbiBoZWFkZXIgYW5kIHBvc3NpYmx5IHRoZSBiZWdpbm5pbmcgb2YgdGhlIG9iamVjdCBkYXRhCisgICAgICAgICAgICBtSW5pdGlhbERhdGEgPSBtRGV2aWNlLT5tRGF0YS5nZXREYXRhKG1Jbml0aWFsRGF0YUxlbmd0aCk7CisKKyAgICAgICAgICAgIC8vIGNyZWF0ZSBhIHBpcGUgZm9yIHRoZSBjbGllbnQgdG8gcmVhZCBmcm9tCisgICAgICAgICAgICBpbnQgcGlwZWZkWzJdOworICAgICAgICAgICAgaWYgKHBpcGUocGlwZWZkKSA8IDApIHsKKyAgICAgICAgICAgICAgICBMT0dFKCJwaXBlIGZhaWxlZCAoJXMpIiwgc3RyZXJyb3IoZXJybm8pKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG1GRCA9IHBpcGVmZFsxXTsKKyAgICAgICAgICAgIHJldHVybiBwaXBlZmRbMF07CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHZpcnR1YWwgYm9vbCB0aHJlYWRMb29wKCkgeworICAgICAgICBpbnQgcmVtYWluaW5nID0gbU9iamVjdFNpemU7CisgICAgICAgIGlmIChtSW5pdGlhbERhdGEpIHsKKyAgICAgICAgICAgIHdyaXRlKG1GRCwgbUluaXRpYWxEYXRhLCBtSW5pdGlhbERhdGFMZW5ndGgpOworICAgICAgICAgICAgcmVtYWluaW5nIC09IG1Jbml0aWFsRGF0YUxlbmd0aDsKKyAgICAgICAgICAgIGZyZWUobUluaXRpYWxEYXRhKTsKKyAgICAgICAgICAgIG1Jbml0aWFsRGF0YSA9IE5VTEw7CisgICAgICAgIH0KKworICAgICAgICBjaGFyIGJ1ZmZlclsxNjM4NF07CisgICAgICAgIHdoaWxlIChyZW1haW5pbmcgPiAwKSB7CisgICAgICAgICAgICBpbnQgcmVhZFNpemUgPSAocmVtYWluaW5nID4gc2l6ZW9mKGJ1ZmZlcikgPyBzaXplb2YoYnVmZmVyKSA6IHJlbWFpbmluZyk7CisgICAgICAgICAgICBpbnQgY291bnQgPSBtRGV2aWNlLT5tRGF0YS5yZWFkRGF0YShtRGV2aWNlLT5tRW5kcG9pbnRJbiwgYnVmZmVyLCByZWFkU2l6ZSk7CisgICAgICAgICAgICBpbnQgd3JpdHRlbjsKKyAgICAgICAgICAgIGlmIChjb3VudCA+PSAwKSB7CisgICAgICAgICAgICAgICAgaW50IHdyaXR0ZW4gPSB3cml0ZShtRkQsIGJ1ZmZlciwgY291bnQpOworICAgICAgICAgICAgICAgIC8vIEZJWE1FIGNoZWNrIGVycm9yCisgICAgICAgICAgICAgICAgcmVtYWluaW5nIC09IGNvdW50OworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIE10cFJlc3BvbnNlQ29kZSByZXQgPSBtRGV2aWNlLT5yZWFkUmVzcG9uc2UoKTsKKyAgICAgICAgbURldmljZS0+bU11dGV4LnVubG9jaygpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorfTsKKworICAgIC8vIHJldHVybnMgdGhlIGZpbGUgZGVzY3JpcHRvciBmb3IgYSBwaXBlIHRvIHJlYWQgdGhlIG9iamVjdCdzIGRhdGEKK2ludCBNdHBEZXZpY2U6OnJlYWRPYmplY3QoTXRwT2JqZWN0SGFuZGxlIGhhbmRsZSwgaW50IG9iamVjdFNpemUpIHsKKyAgICBtTXV0ZXgubG9jaygpOworCisgICAgUmVhZE9iamVjdFRocmVhZCogdGhyZWFkID0gbmV3IFJlYWRPYmplY3RUaHJlYWQodGhpcywgaGFuZGxlLCBvYmplY3RTaXplKTsKKyAgICBpbnQgZmQgPSB0aHJlYWQtPmluaXQoKTsKKyAgICBpZiAoZmQgPCAwKSB7CisgICAgICAgIGRlbGV0ZSB0aHJlYWQ7CisgICAgICAgIG1NdXRleC51bmxvY2soKTsKKyAgICB9IGVsc2UgeworICAgICAgICB0aHJlYWQtPnJ1bigiUmVhZE9iamVjdFRocmVhZCIpOworICAgIH0KKyAgICByZXR1cm4gZmQ7Cit9CisKK2Jvb2wgTXRwRGV2aWNlOjpzZW5kUmVxdWVzdChNdHBPcGVyYXRpb25Db2RlIG9wZXJhdGlvbikgeworICAgIExPR1YoInNlbmRSZXF1ZXN0OiAlc1xuIiwgTXRwRGVidWc6OmdldE9wZXJhdGlvbkNvZGVOYW1lKG9wZXJhdGlvbikpOworICAgIG1SZXF1ZXN0LnNldE9wZXJhdGlvbkNvZGUob3BlcmF0aW9uKTsKKyAgICBpZiAobVRyYW5zYWN0aW9uSUQgPiAwKQorICAgICAgICBtUmVxdWVzdC5zZXRUcmFuc2FjdGlvbklEKG1UcmFuc2FjdGlvbklEKyspOworICAgIGludCByZXQgPSBtUmVxdWVzdC53cml0ZShtRW5kcG9pbnRPdXQpOworICAgIG1SZXF1ZXN0LmR1bXAoKTsKKyAgICByZXR1cm4gKHJldCA+IDApOworfQorCitib29sIE10cERldmljZTo6c2VuZERhdGEoKSB7CisgICAgTE9HVigic2VuZERhdGFcbiIpOworICAgIG1EYXRhLnNldE9wZXJhdGlvbkNvZGUobVJlcXVlc3QuZ2V0T3BlcmF0aW9uQ29kZSgpKTsKKyAgICBtRGF0YS5zZXRUcmFuc2FjdGlvbklEKG1SZXF1ZXN0LmdldFRyYW5zYWN0aW9uSUQoKSk7CisgICAgaW50IHJldCA9IG1EYXRhLndyaXRlKG1FbmRwb2ludE91dCk7CisgICAgbURhdGEuZHVtcCgpOworICAgIHJldHVybiAocmV0ID4gMCk7Cit9CisKK2Jvb2wgTXRwRGV2aWNlOjpyZWFkRGF0YSgpIHsKKyAgICBtRGF0YS5yZXNldCgpOworICAgIGludCByZXQgPSBtRGF0YS5yZWFkKG1FbmRwb2ludEluKTsKKyAgICBMT0dWKCJyZWFkRGF0YSByZXR1cm5lZCAlZFxuIiwgcmV0KTsKKyAgICBpZiAocmV0ID49IE1UUF9DT05UQUlORVJfSEVBREVSX1NJWkUpIHsKKyAgICAgICAgbURhdGEuZHVtcCgpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIExPR1YoInJlYWRSZXNwb25zZSBmYWlsZWRcbiIpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorfQorCitib29sIE10cERldmljZTo6d3JpdGVEYXRhSGVhZGVyKE10cE9wZXJhdGlvbkNvZGUgb3BlcmF0aW9uLCBpbnQgZGF0YUxlbmd0aCkgeworICAgIG1EYXRhLnNldE9wZXJhdGlvbkNvZGUob3BlcmF0aW9uKTsKKyAgICBtRGF0YS5zZXRUcmFuc2FjdGlvbklEKG1SZXF1ZXN0LmdldFRyYW5zYWN0aW9uSUQoKSk7CisgICAgcmV0dXJuICghbURhdGEud3JpdGVEYXRhSGVhZGVyKG1FbmRwb2ludE91dCwgZGF0YUxlbmd0aCkpOworfQorCitNdHBSZXNwb25zZUNvZGUgTXRwRGV2aWNlOjpyZWFkUmVzcG9uc2UoKSB7CisgICAgTE9HVigicmVhZFJlc3BvbnNlXG4iKTsKKyAgICBpbnQgcmV0ID0gbVJlc3BvbnNlLnJlYWQobUVuZHBvaW50SW4pOworICAgIGlmIChyZXQgPj0gTVRQX0NPTlRBSU5FUl9IRUFERVJfU0laRSkgeworICAgICAgICBtUmVzcG9uc2UuZHVtcCgpOworICAgICAgICByZXR1cm4gbVJlc3BvbnNlLmdldFJlc3BvbnNlQ29kZSgpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgTE9HRCgicmVhZFJlc3BvbnNlIGZhaWxlZFxuIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9Cit9CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9tdHAvTXRwRGV2aWNlLmggYi9tZWRpYS9tdHAvTXRwRGV2aWNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTdmNDkyZgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL210cC9NdHBEZXZpY2UuaApAQCAtMCwwICsxLDEwNSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX01UUF9ERVZJQ0VfSAorI2RlZmluZSBfTVRQX0RFVklDRV9ICisKKyNpbmNsdWRlICJNdHBSZXF1ZXN0UGFja2V0LmgiCisjaW5jbHVkZSAiTXRwRGF0YVBhY2tldC5oIgorI2luY2x1ZGUgIk10cFJlc3BvbnNlUGFja2V0LmgiCisjaW5jbHVkZSAiTXRwVHlwZXMuaCIKKworI2luY2x1ZGUgPHV0aWxzL3RocmVhZHMuaD4KKworc3RydWN0IHVzYl9kZXZpY2U7CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY2xhc3MgTXRwRGV2aWNlSW5mbzsKK2NsYXNzIE10cE9iamVjdEluZm87CitjbGFzcyBNdHBTdG9yYWdlSW5mbzsKKworY2xhc3MgTXRwRGV2aWNlIHsKK3ByaXZhdGU6CisgICAgc3RydWN0IHVzYl9kZXZpY2UqICAgICAgbURldmljZTsKKyAgICBpbnQgICAgICAgICAgICAgICAgICAgICBtSW50ZXJmYWNlOworICAgIHN0cnVjdCB1c2JfZW5kcG9pbnQqICAgIG1FbmRwb2ludEluOworICAgIHN0cnVjdCB1c2JfZW5kcG9pbnQqICAgIG1FbmRwb2ludE91dDsKKyAgICBzdHJ1Y3QgdXNiX2VuZHBvaW50KiAgICBtRW5kcG9pbnRJbnRyOworICAgIE10cERldmljZUluZm8qICAgICAgICAgIG1EZXZpY2VJbmZvOworICAgIE10cFByb3BlcnR5TGlzdCAgICAgICAgIG1EZXZpY2VQcm9wZXJ0aWVzOworCisgICAgLy8gYSB1bmlxdWUgSUQgZm9yIHRoZSBkZXZpY2UKKyAgICBpbnQgICAgICAgICAgICAgICAgICAgICBtSUQ7CisKKyAgICAvLyBjdXJyZW50IHNlc3Npb24gSUQKKyAgICBNdHBTZXNzaW9uSUQgICAgICAgICAgICBtU2Vzc2lvbklEOworICAgIC8vIGN1cnJlbnQgdHJhbnNhY3Rpb24gSUQKKyAgICBNdHBUcmFuc2FjdGlvbklEICAgICAgICBtVHJhbnNhY3Rpb25JRDsKKworICAgIE10cFJlcXVlc3RQYWNrZXQgICAgICAgIG1SZXF1ZXN0OworICAgIE10cERhdGFQYWNrZXQgICAgICAgICAgIG1EYXRhOworICAgIE10cFJlc3BvbnNlUGFja2V0ICAgICAgIG1SZXNwb25zZTsKKworICAgIC8vIHRvIGVuc3VyZSBvbmx5IG9uZSBNVFAgdHJhbnNhY3Rpb24gYXQgYSB0aW1lCisgICAgTXV0ZXggICAgICAgICAgICAgICAgICAgbU11dGV4OworCitwdWJsaWM6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXRwRGV2aWNlKHN0cnVjdCB1c2JfZGV2aWNlKiBkZXZpY2UsIGludCBpbnRlcmZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgdXNiX2VuZHBvaW50ICplcF9pbiwgc3RydWN0IHVzYl9lbmRwb2ludCAqZXBfb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHVzYl9lbmRwb2ludCAqZXBfaW50cik7CisgICAgdmlydHVhbCAgICAgICAgICAgICAgICAgfk10cERldmljZSgpOworCisgICAgaW5saW5lIGludCAgICAgICAgICAgICAgZ2V0SUQoKSBjb25zdCB7IHJldHVybiBtSUQ7IH0KKworICAgIHZvaWQgICAgICAgICAgICAgICAgICAgIGluaXRpYWxpemUoKTsKKyAgICB2b2lkICAgICAgICAgICAgICAgICAgICBjbG9zZSgpOworICAgIGNvbnN0IGNoYXIqICAgICAgICAgICAgIGdldERldmljZU5hbWUoKTsKKworICAgIGJvb2wgICAgICAgICAgICAgICAgICAgIG9wZW5TZXNzaW9uKCk7CisgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgY2xvc2VTZXNzaW9uKCk7CisKKyAgICBNdHBEZXZpY2VJbmZvKiAgICAgICAgICBnZXREZXZpY2VJbmZvKCk7CisgICAgTXRwU3RvcmFnZUlETGlzdCogICAgICAgZ2V0U3RvcmFnZUlEcygpOworICAgIE10cFN0b3JhZ2VJbmZvKiAgICAgICAgIGdldFN0b3JhZ2VJbmZvKE10cFN0b3JhZ2VJRCBzdG9yYWdlSUQpOworICAgIE10cE9iamVjdEhhbmRsZUxpc3QqICAgIGdldE9iamVjdEhhbmRsZXMoTXRwU3RvcmFnZUlEIHN0b3JhZ2VJRCwgTXRwT2JqZWN0Rm9ybWF0IGZvcm1hdCwgTXRwT2JqZWN0SGFuZGxlIHBhcmVudCk7CisgICAgTXRwT2JqZWN0SW5mbyogICAgICAgICAgZ2V0T2JqZWN0SW5mbyhNdHBPYmplY3RIYW5kbGUgaGFuZGxlKTsKKyAgICB2b2lkKiAgICAgICAgICAgICAgICAgICBnZXRUaHVtYm5haWwoTXRwT2JqZWN0SGFuZGxlIGhhbmRsZSwgaW50JiBvdXRMZW5ndGgpOworICAgIE10cE9iamVjdEhhbmRsZSAgICAgICAgIHNlbmRPYmplY3RJbmZvKE10cE9iamVjdEluZm8qIGluZm8pOworICAgIGJvb2wgICAgICAgICAgICAgICAgICAgIHNlbmRPYmplY3QoTXRwT2JqZWN0SW5mbyogaW5mbywgaW50IHNyY0ZEKTsKKyAgICBib29sICAgICAgICAgICAgICAgICAgICBkZWxldGVPYmplY3QoTXRwT2JqZWN0SGFuZGxlIGhhbmRsZSk7CisgICAgTXRwT2JqZWN0SGFuZGxlICAgICAgICAgZ2V0UGFyZW50KE10cE9iamVjdEhhbmRsZSBoYW5kbGUpOworICAgIE10cE9iamVjdEhhbmRsZSAgICAgICAgIGdldFN0b3JhZ2VJRChNdHBPYmplY3RIYW5kbGUgaGFuZGxlKTsKKworICAgIE10cFByb3BlcnR5KiAgICAgICAgICAgIGdldERldmljZVByb3BEZXNjKE10cERldmljZVByb3BlcnR5IGNvZGUpOworCisgICAgLy8gcmV0dXJucyB0aGUgZmlsZSBkZXNjcmlwdG9yIGZvciBhIHBpcGUgdG8gcmVhZCB0aGUgb2JqZWN0J3MgZGF0YQorICAgIGludCAgICAgICAgICAgICAgICAgICAgIHJlYWRPYmplY3QoTXRwT2JqZWN0SGFuZGxlIGhhbmRsZSwgaW50IG9iamVjdFNpemUpOworCitwcml2YXRlOgorICAgIGZyaWVuZCBjbGFzcyBSZWFkT2JqZWN0VGhyZWFkOworCisgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgc2VuZFJlcXVlc3QoTXRwT3BlcmF0aW9uQ29kZSBvcGVyYXRpb24pOworICAgIGJvb2wgICAgICAgICAgICAgICAgICAgIHNlbmREYXRhKCk7CisgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgcmVhZERhdGEoKTsKKyAgICBib29sICAgICAgICAgICAgICAgICAgICB3cml0ZURhdGFIZWFkZXIoTXRwT3BlcmF0aW9uQ29kZSBvcGVyYXRpb24sIGludCBkYXRhTGVuZ3RoKTsKKyAgICBNdHBSZXNwb25zZUNvZGUgICAgICAgICByZWFkUmVzcG9uc2UoKTsKKworfTsKKworfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmIC8vIF9NVFBfREVWSUNFX0gKZGlmZiAtLWdpdCBhL21lZGlhL210cC9NdHBEZXZpY2VJbmZvLmNwcCBiL21lZGlhL210cC9NdHBEZXZpY2VJbmZvLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YTkzMjJlCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbXRwL010cERldmljZUluZm8uY3BwCkBAIC0wLDAgKzEsOTcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIk10cERldmljZUluZm8iCisKKyNpbmNsdWRlICJNdHBEZWJ1Zy5oIgorI2luY2x1ZGUgIk10cERhdGFQYWNrZXQuaCIKKyNpbmNsdWRlICJNdHBEZXZpY2VJbmZvLmgiCisjaW5jbHVkZSAiTXRwU3RyaW5nQnVmZmVyLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworTXRwRGV2aWNlSW5mbzo6TXRwRGV2aWNlSW5mbygpCisgICAgOiAgIG1TdGFuZGFyZFZlcnNpb24oMCksCisgICAgICAgIG1WZW5kb3JFeHRlbnNpb25JRCgwKSwKKyAgICAgICAgbVZlbmRvckV4dGVuc2lvblZlcnNpb24oMCksCisgICAgICAgIG1WZW5kb3JFeHRlbnNpb25EZXNjKE5VTEwpLAorICAgICAgICBtRnVuY3Rpb25hbENvZGUoMCksCisgICAgICAgIG1PcGVyYXRpb25zKE5VTEwpLAorICAgICAgICBtRXZlbnRzKE5VTEwpLAorICAgICAgICBtRGV2aWNlUHJvcGVydGllcyhOVUxMKSwKKyAgICAgICAgbUNhcHR1cmVGb3JtYXRzKE5VTEwpLAorICAgICAgICBtUGxheWJhY2tGb3JtYXRzKE5VTEwpLAorICAgICAgICBtTWFudWZhY3R1cmVyKE5VTEwpLAorICAgICAgICBtTW9kZWwoTlVMTCksCisgICAgICAgIG1WZXJzaW9uKE5VTEwpLAorICAgICAgICBtU2VyaWFsKE5VTEwpCit7Cit9CisKK010cERldmljZUluZm86On5NdHBEZXZpY2VJbmZvKCkgeworICAgIGlmIChtVmVuZG9yRXh0ZW5zaW9uRGVzYykKKyAgICAgICAgZnJlZShtVmVuZG9yRXh0ZW5zaW9uRGVzYyk7CisgICAgZGVsZXRlIG1PcGVyYXRpb25zOworICAgIGRlbGV0ZSBtRXZlbnRzOworICAgIGRlbGV0ZSBtRGV2aWNlUHJvcGVydGllczsKKyAgICBkZWxldGUgbUNhcHR1cmVGb3JtYXRzOworICAgIGRlbGV0ZSBtUGxheWJhY2tGb3JtYXRzOworICAgIGlmIChtTWFudWZhY3R1cmVyKQorICAgICAgICBmcmVlKG1NYW51ZmFjdHVyZXIpOworICAgIGlmIChtTW9kZWwpCisgICAgICAgIGZyZWUobU1vZGVsKTsKKyAgICBpZiAobVZlcnNpb24pCisgICAgICAgIGZyZWUobVZlcnNpb24pOworICAgIGlmIChtU2VyaWFsKQorICAgICAgICBmcmVlKG1TZXJpYWwpOworfQorCit2b2lkIE10cERldmljZUluZm86OnJlYWQoTXRwRGF0YVBhY2tldCYgcGFja2V0KSB7CisgICAgTXRwU3RyaW5nQnVmZmVyIHN0cmluZzsKKworICAgIC8vIHJlYWQgdGhlIGRldmljZSBpbmZvCisgICAgbVN0YW5kYXJkVmVyc2lvbiA9IHBhY2tldC5nZXRVSW50MTYoKTsKKyAgICBtVmVuZG9yRXh0ZW5zaW9uSUQgPSBwYWNrZXQuZ2V0VUludDMyKCk7CisgICAgbVZlbmRvckV4dGVuc2lvblZlcnNpb24gPSBwYWNrZXQuZ2V0VUludDE2KCk7CisKKyAgICBwYWNrZXQuZ2V0U3RyaW5nKHN0cmluZyk7CisgICAgbVZlbmRvckV4dGVuc2lvbkRlc2MgPSBzdHJkdXAoKGNvbnN0IGNoYXIgKilzdHJpbmcpOworCisgICAgbUZ1bmN0aW9uYWxDb2RlID0gcGFja2V0LmdldFVJbnQxNigpOworICAgIG1PcGVyYXRpb25zID0gcGFja2V0LmdldEFVSW50MTYoKTsKKyAgICBtRXZlbnRzID0gcGFja2V0LmdldEFVSW50MTYoKTsKKyAgICBtRGV2aWNlUHJvcGVydGllcyA9IHBhY2tldC5nZXRBVUludDE2KCk7CisgICAgbUNhcHR1cmVGb3JtYXRzID0gcGFja2V0LmdldEFVSW50MTYoKTsKKyAgICBtUGxheWJhY2tGb3JtYXRzID0gcGFja2V0LmdldEFVSW50MTYoKTsKKworICAgIHBhY2tldC5nZXRTdHJpbmcoc3RyaW5nKTsKKyAgICBtTWFudWZhY3R1cmVyID0gc3RyZHVwKChjb25zdCBjaGFyICopc3RyaW5nKTsKKyAgICBwYWNrZXQuZ2V0U3RyaW5nKHN0cmluZyk7CisgICAgbU1vZGVsID0gc3RyZHVwKChjb25zdCBjaGFyICopc3RyaW5nKTsKKyAgICBwYWNrZXQuZ2V0U3RyaW5nKHN0cmluZyk7CisgICAgbVZlcnNpb24gPSBzdHJkdXAoKGNvbnN0IGNoYXIgKilzdHJpbmcpOworICAgIHBhY2tldC5nZXRTdHJpbmcoc3RyaW5nKTsKKyAgICBtU2VyaWFsID0gc3RyZHVwKChjb25zdCBjaGFyICopc3RyaW5nKTsKK30KKwordm9pZCBNdHBEZXZpY2VJbmZvOjpwcmludCgpIHsKKyAgICBMT0dWKCJEZXZpY2UgSW5mbzpcblx0bVN0YW5kYXJkVmVyc2lvbjogJWRcblx0bVZlbmRvckV4dGVuc2lvbklEOiAlZFxuXHRtVmVuZG9yRXh0ZW5zaW9uVmVyc2lvbnk6ICVkXG4iLAorICAgICAgICAgICAgbVN0YW5kYXJkVmVyc2lvbiwgbVZlbmRvckV4dGVuc2lvbklELCBtVmVuZG9yRXh0ZW5zaW9uVmVyc2lvbik7CisgICAgTE9HVigiXHRtVmVuZG9yRXh0ZW5zaW9uRGVzYzogJXNcblx0bUZ1bmN0aW9uYWxDb2RlOiAlZFxuXHRtTWFudWZhY3R1cmVyOiAlc1xuXHRtTW9kZWw6ICVzXG5cdG1WZXJzaW9uOiAlc1xuXHRtU2VyaWFsOiAlc1xuIiwKKyAgICAgICAgICAgIG1WZW5kb3JFeHRlbnNpb25EZXNjLCBtRnVuY3Rpb25hbENvZGUsIG1NYW51ZmFjdHVyZXIsIG1Nb2RlbCwgbVZlcnNpb24sIG1TZXJpYWwpOworfQorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbXRwL010cERldmljZUluZm8uaCBiL21lZGlhL210cC9NdHBEZXZpY2VJbmZvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmFiYWExMAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL210cC9NdHBEZXZpY2VJbmZvLmgKQEAgLTAsMCArMSw1NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX01UUF9ERVZJQ0VfSU5GT19ICisjZGVmaW5lIF9NVFBfREVWSUNFX0lORk9fSAorCitzdHJ1Y3Qgc3RhdDsKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjbGFzcyBNdHBEYXRhUGFja2V0OworCitjbGFzcyBNdHBEZXZpY2VJbmZvIHsKK3B1YmxpYzoKKyAgICB1aW50MTZfdCAgICAgICAgICAgICAgICBtU3RhbmRhcmRWZXJzaW9uOworICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgIG1WZW5kb3JFeHRlbnNpb25JRDsKKyAgICB1aW50MTZfdCAgICAgICAgICAgICAgICBtVmVuZG9yRXh0ZW5zaW9uVmVyc2lvbjsKKyAgICBjaGFyKiAgICAgICAgICAgICAgICAgICBtVmVuZG9yRXh0ZW5zaW9uRGVzYzsKKyAgICB1aW50MTZfdCAgICAgICAgICAgICAgICBtRnVuY3Rpb25hbENvZGU7CisgICAgVUludDE2TGlzdCogICAgICAgICAgICAgbU9wZXJhdGlvbnM7CisgICAgVUludDE2TGlzdCogICAgICAgICAgICAgbUV2ZW50czsKKyAgICBNdHBEZXZpY2VQcm9wZXJ0eUxpc3QqICBtRGV2aWNlUHJvcGVydGllczsKKyAgICBNdHBPYmplY3RGb3JtYXRMaXN0KiAgICBtQ2FwdHVyZUZvcm1hdHM7CisgICAgTXRwT2JqZWN0Rm9ybWF0TGlzdCogICAgbVBsYXliYWNrRm9ybWF0czsKKyAgICBjaGFyKiAgICAgICAgICAgICAgICAgICBtTWFudWZhY3R1cmVyOworICAgIGNoYXIqICAgICAgICAgICAgICAgICAgIG1Nb2RlbDsKKyAgICBjaGFyKiAgICAgICAgICAgICAgICAgICBtVmVyc2lvbjsKKyAgICBjaGFyKiAgICAgICAgICAgICAgICAgICBtU2VyaWFsOworCitwdWJsaWM6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXRwRGV2aWNlSW5mbygpOworICAgIHZpcnR1YWwgICAgICAgICAgICAgICAgIH5NdHBEZXZpY2VJbmZvKCk7CisKKyAgICB2b2lkICAgICAgICAgICAgICAgICAgICByZWFkKE10cERhdGFQYWNrZXQmIHBhY2tldCk7CisKKyAgICB2b2lkICAgICAgICAgICAgICAgICAgICBwcmludCgpOworfTsKKworfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmIC8vIF9NVFBfREVWSUNFX0lORk9fSApkaWZmIC0tZ2l0IGEvbWVkaWEvbXRwL010cEV2ZW50UGFja2V0LmNwcCBiL21lZGlhL210cC9NdHBFdmVudFBhY2tldC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmM3NDU0MgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL210cC9NdHBFdmVudFBhY2tldC5jcHAKQEAgLTAsMCArMSw2NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiTXRwRXZlbnRQYWNrZXQiCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8c3lzL2lvY3RsLmg+CisKKyNpZmRlZiBNVFBfREVWSUNFCisjaW5jbHVkZSA8bGludXgvdXNiL2ZfbXRwLmg+CisjZW5kaWYKKworI2luY2x1ZGUgIk10cEV2ZW50UGFja2V0LmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworTXRwRXZlbnRQYWNrZXQ6Ok10cEV2ZW50UGFja2V0KCkKKyAgICA6ICAgTXRwUGFja2V0KDUxMikKK3sKK30KKworTXRwRXZlbnRQYWNrZXQ6On5NdHBFdmVudFBhY2tldCgpIHsKK30KKworI2lmZGVmIE1UUF9ERVZJQ0UKK2ludCBNdHBFdmVudFBhY2tldDo6d3JpdGUoaW50IGZkKSB7CisgICAgc3RydWN0IG10cF9ldmVudCAgICBldmVudDsKKworICAgIHB1dFVJbnQzMihNVFBfQ09OVEFJTkVSX0xFTkdUSF9PRkZTRVQsIG1QYWNrZXRTaXplKTsKKyAgICBwdXRVSW50MTYoTVRQX0NPTlRBSU5FUl9UWVBFX09GRlNFVCwgTVRQX0NPTlRBSU5FUl9UWVBFX0VWRU5UKTsKKworICAgIGV2ZW50LmRhdGEgPSBtQnVmZmVyOworICAgIGV2ZW50Lmxlbmd0aCA9IG1QYWNrZXRTaXplOworICAgIGludCByZXQgPSA6OmlvY3RsKGZkLCBNVFBfU0VORF9FVkVOVCwgKHVuc2lnbmVkIGxvbmcpJmV2ZW50KTsKKyAgICByZXR1cm4gKHJldCA8IDAgPyByZXQgOiAwKTsKK30KKyNlbmRpZgorCisjaWZkZWYgTVRQX0hPU1QKKyAgICAvLyByZWFkIG91ciBidWZmZXIgZnJvbSB0aGUgZ2l2ZW4gZW5kcG9pbnQKK2ludCBNdHBFdmVudFBhY2tldDo6cmVhZChzdHJ1Y3QgdXNiX2VuZHBvaW50ICplcCkgeworICAgIGludCByZXQgPSB0cmFuc2ZlcihlcCwgbUJ1ZmZlciwgbUJ1ZmZlclNpemUpOworICAgICBpZiAocmV0ID49IDApCisgICAgICAgIG1QYWNrZXRTaXplID0gcmV0OworICAgIGVsc2UKKyAgICAgICAgbVBhY2tldFNpemUgPSAwOworICAgIHJldHVybiByZXQ7Cit9CisjZW5kaWYKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbXRwL010cEV2ZW50UGFja2V0LmggYi9tZWRpYS9tdHAvTXRwRXZlbnRQYWNrZXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMGFlODY5Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbXRwL010cEV2ZW50UGFja2V0LmgKQEAgLTAsMCArMSw0OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX01UUF9FVkVOVF9QQUNLRVRfSAorI2RlZmluZSBfTVRQX0VWRU5UX1BBQ0tFVF9ICisKKyNpbmNsdWRlICJNdHBQYWNrZXQuaCIKKyNpbmNsdWRlICJtdHAuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjbGFzcyBNdHBFdmVudFBhY2tldCA6IHB1YmxpYyBNdHBQYWNrZXQgeworCitwdWJsaWM6CisgICAgICAgICAgICAgICAgICAgICAgICBNdHBFdmVudFBhY2tldCgpOworICAgIHZpcnR1YWwgICAgICAgICAgICAgfk10cEV2ZW50UGFja2V0KCk7CisKKyNpZmRlZiBNVFBfREVWSUNFCisgICAgLy8gd3JpdGUgb3VyIGRhdGEgdG8gdGhlIGdpdmVuIGZpbGUgZGVzY3JpcHRvcgorICAgIGludCAgICAgICAgICAgICAgICAgd3JpdGUoaW50IGZkKTsKKyNlbmRpZgorCisjaWZkZWYgTVRQX0hPU1QKKyAgICAvLyByZWFkIG91ciBidWZmZXIgZnJvbSB0aGUgZ2l2ZW4gZW5kcG9pbnQKKyAgICBpbnQgICAgICAgICAgICAgICAgIHJlYWQoc3RydWN0IHVzYl9lbmRwb2ludCAqZXApOworI2VuZGlmCisKKyAgICBpbmxpbmUgTXRwRXZlbnRDb2RlICAgICBnZXRFdmVudENvZGUoKSBjb25zdCB7IHJldHVybiBnZXRDb250YWluZXJDb2RlKCk7IH0KKyAgICBpbmxpbmUgdm9pZCAgICAgICAgICAgICBzZXRFdmVudENvZGUoTXRwRXZlbnRDb2RlIGNvZGUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgcmV0dXJuIHNldENvbnRhaW5lckNvZGUoY29kZSk7IH0KK307CisKK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAvLyBfTVRQX0VWRU5UX1BBQ0tFVF9ICmRpZmYgLS1naXQgYS9tZWRpYS9tdHAvTXRwT2JqZWN0SW5mby5jcHAgYi9tZWRpYS9tdHAvTXRwT2JqZWN0SW5mby5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGQ0MzA0ZQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL210cC9NdHBPYmplY3RJbmZvLmNwcApAQCAtMCwwICsxLDEwOCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiTXRwT2JqZWN0SW5mbyIKKworI2luY2x1ZGUgIk10cERlYnVnLmgiCisjaW5jbHVkZSAiTXRwRGF0YVBhY2tldC5oIgorI2luY2x1ZGUgIk10cE9iamVjdEluZm8uaCIKKyNpbmNsdWRlICJNdHBTdHJpbmdCdWZmZXIuaCIKKyNpbmNsdWRlICJNdHBVdGlscy5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK010cE9iamVjdEluZm86Ok10cE9iamVjdEluZm8oTXRwT2JqZWN0SGFuZGxlIGhhbmRsZSkKKyAgICA6ICAgbUhhbmRsZShoYW5kbGUpLAorICAgICAgICBtU3RvcmFnZUlEKDApLAorICAgICAgICBtRm9ybWF0KDApLAorICAgICAgICBtUHJvdGVjdGlvblN0YXR1cygwKSwKKyAgICAgICAgbUNvbXByZXNzZWRTaXplKDApLAorICAgICAgICBtVGh1bWJGb3JtYXQoMCksCisgICAgICAgIG1UaHVtYkNvbXByZXNzZWRTaXplKDApLAorICAgICAgICBtVGh1bWJQaXhXaWR0aCgwKSwKKyAgICAgICAgbVRodW1iUGl4SGVpZ2h0KDApLAorICAgICAgICBtSW1hZ2VQaXhXaWR0aCgwKSwKKyAgICAgICAgbUltYWdlUGl4SGVpZ2h0KDApLAorICAgICAgICBtSW1hZ2VQaXhEZXB0aCgwKSwKKyAgICAgICAgbVBhcmVudCgwKSwKKyAgICAgICAgbUFzc29jaWF0aW9uVHlwZSgwKSwKKyAgICAgICAgbUFzc29jaWF0aW9uRGVzYygwKSwKKyAgICAgICAgbVNlcXVlbmNlTnVtYmVyKDApLAorICAgICAgICBtTmFtZShOVUxMKSwKKyAgICAgICAgbURhdGVDcmVhdGVkKDApLAorICAgICAgICBtRGF0ZU1vZGlmaWVkKDApLAorICAgICAgICBtS2V5d29yZHMoTlVMTCkKK3sKK30KKworTXRwT2JqZWN0SW5mbzo6fk10cE9iamVjdEluZm8oKSB7CisgICAgaWYgKG1OYW1lKQorICAgICAgICBmcmVlKG1OYW1lKTsKKyAgICBpZiAobUtleXdvcmRzKQorICAgICAgICBmcmVlKG1LZXl3b3Jkcyk7Cit9CisKK3ZvaWQgTXRwT2JqZWN0SW5mbzo6cmVhZChNdHBEYXRhUGFja2V0JiBwYWNrZXQpIHsKKyAgICBNdHBTdHJpbmdCdWZmZXIgc3RyaW5nOworICAgIHRpbWVfdCB0aW1lOworCisgICAgbVN0b3JhZ2VJRCA9IHBhY2tldC5nZXRVSW50MzIoKTsKKyAgICBtRm9ybWF0ID0gcGFja2V0LmdldFVJbnQxNigpOworICAgIG1Qcm90ZWN0aW9uU3RhdHVzID0gcGFja2V0LmdldFVJbnQxNigpOworICAgIG1Db21wcmVzc2VkU2l6ZSA9IHBhY2tldC5nZXRVSW50MzIoKTsKKyAgICBtVGh1bWJGb3JtYXQgPSBwYWNrZXQuZ2V0VUludDE2KCk7CisgICAgbVRodW1iQ29tcHJlc3NlZFNpemUgPSBwYWNrZXQuZ2V0VUludDMyKCk7CisgICAgbVRodW1iUGl4V2lkdGggPSBwYWNrZXQuZ2V0VUludDMyKCk7CisgICAgbVRodW1iUGl4SGVpZ2h0ID0gcGFja2V0LmdldFVJbnQzMigpOworICAgIG1JbWFnZVBpeFdpZHRoID0gcGFja2V0LmdldFVJbnQzMigpOworICAgIG1JbWFnZVBpeEhlaWdodCA9IHBhY2tldC5nZXRVSW50MzIoKTsKKyAgICBtSW1hZ2VQaXhEZXB0aCA9IHBhY2tldC5nZXRVSW50MzIoKTsKKyAgICBtUGFyZW50ID0gcGFja2V0LmdldFVJbnQzMigpOworICAgIG1Bc3NvY2lhdGlvblR5cGUgPSBwYWNrZXQuZ2V0VUludDE2KCk7CisgICAgbUFzc29jaWF0aW9uRGVzYyA9IHBhY2tldC5nZXRVSW50MzIoKTsKKyAgICBtU2VxdWVuY2VOdW1iZXIgPSBwYWNrZXQuZ2V0VUludDMyKCk7CisKKyAgICBwYWNrZXQuZ2V0U3RyaW5nKHN0cmluZyk7CisgICAgbU5hbWUgPSBzdHJkdXAoKGNvbnN0IGNoYXIgKilzdHJpbmcpOworCisgICAgcGFja2V0LmdldFN0cmluZyhzdHJpbmcpOworICAgIGlmIChwYXJzZURhdGVUaW1lKChjb25zdCBjaGFyKilzdHJpbmcsIHRpbWUpKQorICAgICAgICBtRGF0ZUNyZWF0ZWQgPSB0aW1lOworCisgICAgcGFja2V0LmdldFN0cmluZyhzdHJpbmcpOworICAgIGlmIChwYXJzZURhdGVUaW1lKChjb25zdCBjaGFyKilzdHJpbmcsIHRpbWUpKQorICAgICAgICBtRGF0ZU1vZGlmaWVkID0gdGltZTsKKworICAgIHBhY2tldC5nZXRTdHJpbmcoc3RyaW5nKTsKKyAgICBtS2V5d29yZHMgPSBzdHJkdXAoKGNvbnN0IGNoYXIgKilzdHJpbmcpOworfQorCit2b2lkIE10cE9iamVjdEluZm86OnByaW50KCkgeworICAgIExPR0QoIk10cE9iamVjdCBJbmZvICUwOFg6ICVzXG4iLCBtSGFuZGxlLCBtTmFtZSk7CisgICAgTE9HRCgiICBtU3RvcmFnZUlEOiAlMDhYIG1Gb3JtYXQ6ICUwNFggbVByb3RlY3Rpb25TdGF0dXM6ICVkXG4iLAorICAgICAgICAgICAgbVN0b3JhZ2VJRCwgbUZvcm1hdCwgbVByb3RlY3Rpb25TdGF0dXMpOworICAgIExPR0QoIiAgbUNvbXByZXNzZWRTaXplOiAlZCBtVGh1bWJGb3JtYXQ6ICUwNFggbVRodW1iQ29tcHJlc3NlZFNpemU6ICVkXG4iLAorICAgICAgICAgICAgbUNvbXByZXNzZWRTaXplLCBtRm9ybWF0LCBtVGh1bWJDb21wcmVzc2VkU2l6ZSk7CisgICAgTE9HRCgiICBtVGh1bWJQaXhXaWR0aDogJWQgbVRodW1iUGl4SGVpZ2h0OiAlZFxuIiwgbVRodW1iUGl4V2lkdGgsIG1UaHVtYlBpeEhlaWdodCk7CisgICAgTE9HRCgiICBtSW1hZ2VQaXhXaWR0aDogJWQgbUltYWdlUGl4SGVpZ2h0OiAlZCBtSW1hZ2VQaXhEZXB0aDogJWRcbiIsCisgICAgICAgICAgICBtSW1hZ2VQaXhXaWR0aCwgbUltYWdlUGl4SGVpZ2h0LCBtSW1hZ2VQaXhEZXB0aCk7CisgICAgTE9HRCgiICBtUGFyZW50OiAlMDhYIG1Bc3NvY2lhdGlvblR5cGU6ICUwNFggbUFzc29jaWF0aW9uRGVzYzogJTA0WFxuIiwKKyAgICAgICAgICAgIG1QYXJlbnQsIG1Bc3NvY2lhdGlvblR5cGUsIG1Bc3NvY2lhdGlvbkRlc2MpOworICAgIExPR0QoIiAgbVNlcXVlbmNlTnVtYmVyOiAlZCBtRGF0ZUNyZWF0ZWQ6ICVkIG1EYXRlTW9kaWZpZWQ6ICVkIG1LZXl3b3JkczogJXNcbiIsCisgICAgICAgICAgICBtU2VxdWVuY2VOdW1iZXIsIG1EYXRlQ3JlYXRlZCwgbURhdGVNb2RpZmllZCwgbUtleXdvcmRzKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL210cC9NdHBPYmplY3RJbmZvLmggYi9tZWRpYS9tdHAvTXRwT2JqZWN0SW5mby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM3YTQ0OWNhCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbXRwL010cE9iamVjdEluZm8uaApAQCAtMCwwICsxLDYwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfTVRQX09CSkVDVF9JTkZPX0gKKyNkZWZpbmUgX01UUF9PQkpFQ1RfSU5GT19ICisKKyNpbmNsdWRlICJNdHBUeXBlcy5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NsYXNzIE10cERhdGFQYWNrZXQ7CisKK2NsYXNzIE10cE9iamVjdEluZm8geworcHVibGljOgorICAgIE10cE9iamVjdEhhbmRsZSAgICAgbUhhbmRsZTsKKyAgICBNdHBTdG9yYWdlSUQgICAgICAgIG1TdG9yYWdlSUQ7CisgICAgTXRwT2JqZWN0Rm9ybWF0ICAgICBtRm9ybWF0OworICAgIHVpbnQxNl90ICAgICAgICAgICAgbVByb3RlY3Rpb25TdGF0dXM7CisgICAgdWludDMyX3QgICAgICAgICAgICBtQ29tcHJlc3NlZFNpemU7CisgICAgTXRwT2JqZWN0Rm9ybWF0ICAgICBtVGh1bWJGb3JtYXQ7CisgICAgdWludDMyX3QgICAgICAgICAgICBtVGh1bWJDb21wcmVzc2VkU2l6ZTsKKyAgICB1aW50MzJfdCAgICAgICAgICAgIG1UaHVtYlBpeFdpZHRoOworICAgIHVpbnQzMl90ICAgICAgICAgICAgbVRodW1iUGl4SGVpZ2h0OworICAgIHVpbnQzMl90ICAgICAgICAgICAgbUltYWdlUGl4V2lkdGg7CisgICAgdWludDMyX3QgICAgICAgICAgICBtSW1hZ2VQaXhIZWlnaHQ7CisgICAgdWludDMyX3QgICAgICAgICAgICBtSW1hZ2VQaXhEZXB0aDsKKyAgICBNdHBPYmplY3RIYW5kbGUgICAgIG1QYXJlbnQ7CisgICAgdWludDE2X3QgICAgICAgICAgICBtQXNzb2NpYXRpb25UeXBlOworICAgIHVpbnQzMl90ICAgICAgICAgICAgbUFzc29jaWF0aW9uRGVzYzsKKyAgICB1aW50MzJfdCAgICAgICAgICAgIG1TZXF1ZW5jZU51bWJlcjsKKyAgICBjaGFyKiAgICAgICAgICAgICAgIG1OYW1lOworICAgIHRpbWVfdCAgICAgICAgICAgICAgbURhdGVDcmVhdGVkOworICAgIHRpbWVfdCAgICAgICAgICAgICAgbURhdGVNb2RpZmllZDsKKyAgICBjaGFyKiAgICAgICAgICAgICAgIG1LZXl3b3JkczsKKworcHVibGljOgorICAgICAgICAgICAgICAgICAgICAgICAgTXRwT2JqZWN0SW5mbyhNdHBPYmplY3RIYW5kbGUgaGFuZGxlKTsKKyAgICB2aXJ0dWFsICAgICAgICAgICAgIH5NdHBPYmplY3RJbmZvKCk7CisKKyAgICB2b2lkICAgICAgICAgICAgICAgIHJlYWQoTXRwRGF0YVBhY2tldCYgcGFja2V0KTsKKworICAgIHZvaWQgICAgICAgICAgICAgICAgcHJpbnQoKTsKK307CisKK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAvLyBfTVRQX09CSkVDVF9JTkZPX0gKZGlmZiAtLWdpdCBhL21lZGlhL210cC9NdHBQYWNrZXQuY3BwIGIvbWVkaWEvbXRwL010cFBhY2tldC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDJiZjhiYQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL210cC9NdHBQYWNrZXQuY3BwCkBAIC0wLDAgKzEsMTU0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJNdHBQYWNrZXQiCisKKyNpbmNsdWRlICJNdHBEZWJ1Zy5oIgorI2luY2x1ZGUgIk10cFBhY2tldC5oIgorI2luY2x1ZGUgIm10cC5oIgorCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorCisjaW5jbHVkZSA8dXNiaG9zdC91c2Job3N0Lmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworTXRwUGFja2V0OjpNdHBQYWNrZXQoaW50IGJ1ZmZlclNpemUpCisgICAgOiAgIG1CdWZmZXIoTlVMTCksCisgICAgICAgIG1CdWZmZXJTaXplKGJ1ZmZlclNpemUpLAorICAgICAgICBtQWxsb2NhdGlvbkluY3JlbWVudChidWZmZXJTaXplKSwKKyAgICAgICAgbVBhY2tldFNpemUoMCkKK3sKKyAgICBtQnVmZmVyID0gKHVpbnQ4X3QgKiltYWxsb2MoYnVmZmVyU2l6ZSk7CisgICAgaWYgKCFtQnVmZmVyKSB7CisgICAgICAgIExPR0UoIm91dCBvZiBtZW1vcnkhIik7CisgICAgICAgIGFib3J0KCk7CisgICAgfQorfQorCitNdHBQYWNrZXQ6On5NdHBQYWNrZXQoKSB7CisgICAgaWYgKG1CdWZmZXIpCisgICAgICAgIGZyZWUobUJ1ZmZlcik7Cit9CisKK3ZvaWQgTXRwUGFja2V0OjpyZXNldCgpIHsKKyAgICBhbGxvY2F0ZShNVFBfQ09OVEFJTkVSX0hFQURFUl9TSVpFKTsKKyAgICBtUGFja2V0U2l6ZSA9IE1UUF9DT05UQUlORVJfSEVBREVSX1NJWkU7CisgICAgbWVtc2V0KG1CdWZmZXIsIDAsIG1CdWZmZXJTaXplKTsKK30KKwordm9pZCBNdHBQYWNrZXQ6OmFsbG9jYXRlKGludCBsZW5ndGgpIHsKKyAgICBpZiAobGVuZ3RoID4gbUJ1ZmZlclNpemUpIHsKKyAgICAgICAgaW50IG5ld0xlbmd0aCA9IGxlbmd0aCArIG1BbGxvY2F0aW9uSW5jcmVtZW50OworICAgICAgICBtQnVmZmVyID0gKHVpbnQ4X3QgKilyZWFsbG9jKG1CdWZmZXIsIG5ld0xlbmd0aCk7CisgICAgICAgIGlmICghbUJ1ZmZlcikgeworICAgICAgICAgICAgTE9HRSgib3V0IG9mIG1lbW9yeSEiKTsKKyAgICAgICAgICAgIGFib3J0KCk7CisgICAgICAgIH0KKyAgICAgICAgbUJ1ZmZlclNpemUgPSBuZXdMZW5ndGg7CisgICAgfQorfQorCit2b2lkIE10cFBhY2tldDo6ZHVtcCgpIHsKKyNkZWZpbmUgRFVNUF9CWVRFU19QRVJfUk9XICAxNgorICAgIGNoYXIgYnVmZmVyWzUwMF07CisgICAgY2hhciogYnVmcHRyID0gYnVmZmVyOworCisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtUGFja2V0U2l6ZTsgaSsrKSB7CisgICAgICAgIHNwcmludGYoYnVmcHRyLCAiJTAyWCAiLCBtQnVmZmVyW2ldKTsKKyAgICAgICAgYnVmcHRyICs9IHN0cmxlbihidWZwdHIpOworICAgICAgICBpZiAoaSAlIERVTVBfQllURVNfUEVSX1JPVyA9PSAoRFVNUF9CWVRFU19QRVJfUk9XIC0gMSkpIHsKKyAgICAgICAgICAgIExPR1YoIiVzIiwgYnVmZmVyKTsKKyAgICAgICAgICAgIGJ1ZnB0ciA9IGJ1ZmZlcjsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoYnVmcHRyICE9IGJ1ZmZlcikgeworICAgICAgICAvLyBwcmludCBsYXN0IGxpbmUKKyAgICAgICAgTE9HVigiJXMiLCBidWZmZXIpOworICAgIH0KKyAgICBMT0dWKCJcbiIpOworfQorCit1aW50MTZfdCBNdHBQYWNrZXQ6OmdldFVJbnQxNihpbnQgb2Zmc2V0KSBjb25zdCB7CisgICAgcmV0dXJuICgodWludDE2X3QpbUJ1ZmZlcltvZmZzZXQgKyAxXSA8PCA4KSB8ICh1aW50MTZfdCltQnVmZmVyW29mZnNldF07Cit9CisKK3VpbnQzMl90IE10cFBhY2tldDo6Z2V0VUludDMyKGludCBvZmZzZXQpIGNvbnN0IHsKKyAgICByZXR1cm4gKCh1aW50MzJfdCltQnVmZmVyW29mZnNldCArIDNdIDw8IDI0KSB8ICgodWludDMyX3QpbUJ1ZmZlcltvZmZzZXQgKyAyXSA8PCAxNikgfAorICAgICAgICAgICAoKHVpbnQzMl90KW1CdWZmZXJbb2Zmc2V0ICsgMV0gPDwgOCkgIHwgKHVpbnQzMl90KW1CdWZmZXJbb2Zmc2V0XTsKK30KKwordm9pZCBNdHBQYWNrZXQ6OnB1dFVJbnQxNihpbnQgb2Zmc2V0LCB1aW50MTZfdCB2YWx1ZSkgeworICAgIG1CdWZmZXJbb2Zmc2V0KytdID0gKHVpbnQ4X3QpKHZhbHVlICYgMHhGRik7CisgICAgbUJ1ZmZlcltvZmZzZXQrK10gPSAodWludDhfdCkoKHZhbHVlID4+IDgpICYgMHhGRik7Cit9CisKK3ZvaWQgTXRwUGFja2V0OjpwdXRVSW50MzIoaW50IG9mZnNldCwgdWludDMyX3QgdmFsdWUpIHsKKyAgICBtQnVmZmVyW29mZnNldCsrXSA9ICh1aW50OF90KSh2YWx1ZSAmIDB4RkYpOworICAgIG1CdWZmZXJbb2Zmc2V0KytdID0gKHVpbnQ4X3QpKCh2YWx1ZSA+PiA4KSAmIDB4RkYpOworICAgIG1CdWZmZXJbb2Zmc2V0KytdID0gKHVpbnQ4X3QpKCh2YWx1ZSA+PiAxNikgJiAweEZGKTsKKyAgICBtQnVmZmVyW29mZnNldCsrXSA9ICh1aW50OF90KSgodmFsdWUgPj4gMjQpICYgMHhGRik7Cit9CisKK3VpbnQxNl90IE10cFBhY2tldDo6Z2V0Q29udGFpbmVyQ29kZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0VUludDE2KE1UUF9DT05UQUlORVJfQ09ERV9PRkZTRVQpOworfQorCit2b2lkIE10cFBhY2tldDo6c2V0Q29udGFpbmVyQ29kZSh1aW50MTZfdCBjb2RlKSB7CisgICAgcHV0VUludDE2KE1UUF9DT05UQUlORVJfQ09ERV9PRkZTRVQsIGNvZGUpOworfQorCitNdHBUcmFuc2FjdGlvbklEIE10cFBhY2tldDo6Z2V0VHJhbnNhY3Rpb25JRCgpIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0VUludDMyKE1UUF9DT05UQUlORVJfVFJBTlNBQ1RJT05fSURfT0ZGU0VUKTsKK30KKwordm9pZCBNdHBQYWNrZXQ6OnNldFRyYW5zYWN0aW9uSUQoTXRwVHJhbnNhY3Rpb25JRCBpZCkgeworICAgIHB1dFVJbnQzMihNVFBfQ09OVEFJTkVSX1RSQU5TQUNUSU9OX0lEX09GRlNFVCwgaWQpOworfQorCit1aW50MzJfdCBNdHBQYWNrZXQ6OmdldFBhcmFtZXRlcihpbnQgaW5kZXgpIGNvbnN0IHsKKyAgICBpZiAoaW5kZXggPCAxIHx8IGluZGV4ID4gNSkgeworICAgICAgICBMT0dFKCJpbmRleCAlZCBvdXQgb2YgcmFuZ2UgaW4gTXRwUmVxdWVzdFBhY2tldDo6Z2V0UGFyYW1ldGVyIiwgaW5kZXgpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgcmV0dXJuIGdldFVJbnQzMihNVFBfQ09OVEFJTkVSX1BBUkFNRVRFUl9PRkZTRVQgKyAoaW5kZXggLSAxKSAqIHNpemVvZih1aW50MzJfdCkpOworfQorCit2b2lkIE10cFBhY2tldDo6c2V0UGFyYW1ldGVyKGludCBpbmRleCwgdWludDMyX3QgdmFsdWUpIHsKKyAgICBpZiAoaW5kZXggPCAxIHx8IGluZGV4ID4gNSkgeworICAgICAgICBMT0dFKCJpbmRleCAlZCBvdXQgb2YgcmFuZ2UgaW4gTXRwUmVzcG9uc2VQYWNrZXQ6OnNldFBhcmFtZXRlciIsIGluZGV4KTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBpbnQgb2Zmc2V0ID0gTVRQX0NPTlRBSU5FUl9QQVJBTUVURVJfT0ZGU0VUICsgKGluZGV4IC0gMSkgKiBzaXplb2YodWludDMyX3QpOworICAgIGlmIChtUGFja2V0U2l6ZSA8IG9mZnNldCArIHNpemVvZih1aW50MzJfdCkpCisgICAgICAgIG1QYWNrZXRTaXplID0gb2Zmc2V0ICsgc2l6ZW9mKHVpbnQzMl90KTsKKyAgICBwdXRVSW50MzIob2Zmc2V0LCB2YWx1ZSk7Cit9CisKKyNpZmRlZiBNVFBfSE9TVAoraW50IE10cFBhY2tldDo6dHJhbnNmZXIoc3RydWN0IHVzYl9lbmRwb2ludCAqZXAsIHZvaWQqIGJ1ZmZlciwgaW50IGxlbmd0aCkgeworICAgIGlmICh1c2JfZW5kcG9pbnRfcXVldWUoZXAsIGJ1ZmZlciwgbGVuZ3RoKSkgeworICAgICAgICBMT0dFKCJ1c2JfZW5kcG9pbnRfcXVldWUgZmFpbGVkLCBlcnJubzogJWQiLCBlcnJubyk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgaW50IGVwX251bTsKKyAgICByZXR1cm4gdXNiX2VuZHBvaW50X3dhaXQodXNiX2VuZHBvaW50X2dldF9kZXZpY2UoZXApLCAmZXBfbnVtKTsKK30KKyNlbmRpZgorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbXRwL010cFBhY2tldC5oIGIvbWVkaWEvbXRwL010cFBhY2tldC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjljOGQ2ZGEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9tdHAvTXRwUGFja2V0LmgKQEAgLTAsMCArMSw2OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX01UUF9QQUNLRVRfSAorI2RlZmluZSBfTVRQX1BBQ0tFVF9ICisKKyNpbmNsdWRlICJNdHBUeXBlcy5oIgorCitzdHJ1Y3QgdXNiX2VuZHBvaW50OworCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NsYXNzIE10cFBhY2tldCB7CisKK3Byb3RlY3RlZDoKKyAgICB1aW50OF90KiAgICAgICAgICAgIG1CdWZmZXI7CisgICAgLy8gY3VycmVudCBzaXplIG9mIHRoZSBidWZmZXIKKyAgICBpbnQgICAgICAgICAgICAgICAgIG1CdWZmZXJTaXplOworICAgIC8vIG51bWJlciBvZiBieXRlcyB0byBhZGQgd2hlbiByZXNpemluZyB0aGUgYnVmZmVyCisgICAgaW50ICAgICAgICAgICAgICAgICBtQWxsb2NhdGlvbkluY3JlbWVudDsKKyAgICAvLyBzaXplIG9mIHRoZSBkYXRhIGluIHRoZSBwYWNrZXQKKyAgICBpbnQgICAgICAgICAgICAgICAgIG1QYWNrZXRTaXplOworCitwdWJsaWM6CisgICAgICAgICAgICAgICAgICAgICAgICBNdHBQYWNrZXQoaW50IGJ1ZmZlclNpemUpOworICAgIHZpcnR1YWwgICAgICAgICAgICAgfk10cFBhY2tldCgpOworCisgICAgLy8gc2V0cyBwYWNrZXQgc2l6ZSB0byB0aGUgZGVmYXVsdCBjb250YWluZXIgc2l6ZSBhbmQgc2V0cyBidWZmZXIgdG8gemVybworICAgIHZpcnR1YWwgdm9pZCAgICAgICAgcmVzZXQoKTsKKworICAgIHZvaWQgICAgICAgICAgICAgICAgYWxsb2NhdGUoaW50IGxlbmd0aCk7CisgICAgdm9pZCAgICAgICAgICAgICAgICBkdW1wKCk7CisKKyAgICB1aW50MTZfdCAgICAgICAgICAgIGdldENvbnRhaW5lckNvZGUoKSBjb25zdDsKKyAgICB2b2lkICAgICAgICAgICAgICAgIHNldENvbnRhaW5lckNvZGUodWludDE2X3QgY29kZSk7CisKKyAgICBNdHBUcmFuc2FjdGlvbklEICAgIGdldFRyYW5zYWN0aW9uSUQoKSBjb25zdDsKKyAgICB2b2lkICAgICAgICAgICAgICAgIHNldFRyYW5zYWN0aW9uSUQoTXRwVHJhbnNhY3Rpb25JRCBpZCk7CisKKyAgICB1aW50MzJfdCAgICAgICAgICAgIGdldFBhcmFtZXRlcihpbnQgaW5kZXgpIGNvbnN0OworICAgIHZvaWQgICAgICAgICAgICAgICAgc2V0UGFyYW1ldGVyKGludCBpbmRleCwgdWludDMyX3QgdmFsdWUpOworCisjaWZkZWYgTVRQX0hPU1QKKyAgICBpbnQgICAgICAgICAgICAgICAgIHRyYW5zZmVyKHN0cnVjdCB1c2JfZW5kcG9pbnQgKmVwLCB2b2lkKiBidWZmZXIsIGludCBsZW5ndGgpOworI2VuZGlmCisKK3Byb3RlY3RlZDoKKyAgICB1aW50MTZfdCAgICAgICAgICAgIGdldFVJbnQxNihpbnQgb2Zmc2V0KSBjb25zdDsKKyAgICB1aW50MzJfdCAgICAgICAgICAgIGdldFVJbnQzMihpbnQgb2Zmc2V0KSBjb25zdDsKKyAgICB2b2lkICAgICAgICAgICAgICAgIHB1dFVJbnQxNihpbnQgb2Zmc2V0LCB1aW50MTZfdCB2YWx1ZSk7CisgICAgdm9pZCAgICAgICAgICAgICAgICBwdXRVSW50MzIoaW50IG9mZnNldCwgdWludDMyX3QgdmFsdWUpOworfTsKKworfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmIC8vIF9NVFBfUEFDS0VUX0gKZGlmZiAtLWdpdCBhL21lZGlhL210cC9NdHBQcm9wZXJ0eS5jcHAgYi9tZWRpYS9tdHAvTXRwUHJvcGVydHkuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM3YTkxZDYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9tdHAvTXRwUHJvcGVydHkuY3BwCkBAIC0wLDAgKzEsMzI2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJNdHBQcm9wZXJ0eSIKKworI2luY2x1ZGUgIk10cERhdGFQYWNrZXQuaCIKKyNpbmNsdWRlICJNdHBQcm9wZXJ0eS5oIgorI2luY2x1ZGUgIk10cFN0cmluZ0J1ZmZlci5oIgorI2luY2x1ZGUgIk10cFV0aWxzLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworTXRwUHJvcGVydHk6Ok10cFByb3BlcnR5KCkKKyAgICA6ICAgbUNvZGUoMCksCisgICAgICAgIG1UeXBlKDApLAorICAgICAgICBtV3JpdGVhYmxlKGZhbHNlKSwKKyAgICAgICAgbURlZmF1bHRBcnJheUxlbmd0aCgwKSwKKyAgICAgICAgbURlZmF1bHRBcnJheVZhbHVlcyhOVUxMKSwKKyAgICAgICAgbUN1cnJlbnRBcnJheUxlbmd0aCgwKSwKKyAgICAgICAgbUN1cnJlbnRBcnJheVZhbHVlcyhOVUxMKSwKKyAgICAgICAgbUdyb3VwQ29kZSgwKSwKKyAgICAgICAgbUZvcm1GbGFnKGtGb3JtTm9uZSksCisgICAgICAgIG1FbnVtTGVuZ3RoKDApLAorICAgICAgICBtRW51bVZhbHVlcyhOVUxMKQoreworICAgIG1EZWZhdWx0VmFsdWUuc3RyID0gTlVMTDsKKyAgICBtQ3VycmVudFZhbHVlLnN0ciA9IE5VTEw7CisgICAgbU1pbmltdW1WYWx1ZS5zdHIgPSBOVUxMOworICAgIG1NYXhpbXVtVmFsdWUuc3RyID0gTlVMTDsKK30KKworTXRwUHJvcGVydHk6Ok10cFByb3BlcnR5KE10cFByb3BlcnR5Q29kZSBwcm9wQ29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBNdHBEYXRhVHlwZSB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgd3JpdGVhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZWZhdWx0VmFsdWUpCisgICAgOiAgIG1Db2RlKHByb3BDb2RlKSwKKyAgICAgICAgbVR5cGUodHlwZSksCisgICAgICAgIG1Xcml0ZWFibGUod3JpdGVhYmxlKSwKKyAgICAgICAgbURlZmF1bHRBcnJheUxlbmd0aCgwKSwKKyAgICAgICAgbURlZmF1bHRBcnJheVZhbHVlcyhOVUxMKSwKKyAgICAgICAgbUN1cnJlbnRBcnJheUxlbmd0aCgwKSwKKyAgICAgICAgbUN1cnJlbnRBcnJheVZhbHVlcyhOVUxMKSwKKyAgICAgICAgbUdyb3VwQ29kZSgwKSwKKyAgICAgICAgbUZvcm1GbGFnKGtGb3JtTm9uZSksCisgICAgICAgIG1FbnVtTGVuZ3RoKDApLAorICAgICAgICBtRW51bVZhbHVlcyhOVUxMKQoreworICAgIG1lbXNldCgmbURlZmF1bHRWYWx1ZSwgMCwgc2l6ZW9mKG1EZWZhdWx0VmFsdWUpKTsKKyAgICBtZW1zZXQoJm1DdXJyZW50VmFsdWUsIDAsIHNpemVvZihtQ3VycmVudFZhbHVlKSk7CisgICAgbWVtc2V0KCZtTWluaW11bVZhbHVlLCAwLCBzaXplb2YobU1pbmltdW1WYWx1ZSkpOworICAgIG1lbXNldCgmbU1heGltdW1WYWx1ZSwgMCwgc2l6ZW9mKG1NYXhpbXVtVmFsdWUpKTsKKworICAgIGlmIChkZWZhdWx0VmFsdWUpIHsKKyAgICAgICAgc3dpdGNoICh0eXBlKSB7CisgICAgICAgICAgICBjYXNlIE1UUF9UWVBFX0lOVDg6CisgICAgICAgICAgICAgICAgbURlZmF1bHRWYWx1ZS5pOCA9IGRlZmF1bHRWYWx1ZTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgTVRQX1RZUEVfVUlOVDg6CisgICAgICAgICAgICAgICAgbURlZmF1bHRWYWx1ZS51OCA9IGRlZmF1bHRWYWx1ZTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgTVRQX1RZUEVfSU5UMTY6CisgICAgICAgICAgICAgICAgbURlZmF1bHRWYWx1ZS5pMTYgPSBkZWZhdWx0VmFsdWU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE1UUF9UWVBFX1VJTlQxNjoKKyAgICAgICAgICAgICAgICBtRGVmYXVsdFZhbHVlLnUxNiA9IGRlZmF1bHRWYWx1ZTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgTVRQX1RZUEVfSU5UMzI6CisgICAgICAgICAgICAgICAgbURlZmF1bHRWYWx1ZS5pMzIgPSBkZWZhdWx0VmFsdWU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE1UUF9UWVBFX1VJTlQzMjoKKyAgICAgICAgICAgICAgICBtRGVmYXVsdFZhbHVlLnUzMiA9IGRlZmF1bHRWYWx1ZTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgTVRQX1RZUEVfSU5UNjQ6CisgICAgICAgICAgICAgICAgbURlZmF1bHRWYWx1ZS5pNjQgPSBkZWZhdWx0VmFsdWU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE1UUF9UWVBFX1VJTlQ2NDoKKyAgICAgICAgICAgICAgICBtRGVmYXVsdFZhbHVlLnU2NCA9IGRlZmF1bHRWYWx1ZTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgTE9HRSgidW5rbm93biB0eXBlICUwNFggaW4gTXRwUHJvcGVydHk6Ok10cFByb3BlcnR5IiwgdHlwZSk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK010cFByb3BlcnR5Ojp+TXRwUHJvcGVydHkoKSB7CisgICAgaWYgKG1UeXBlID09IE1UUF9UWVBFX1NUUikgeworICAgICAgICAvLyBmcmVlIGFsbCBzdHJpbmdzCisgICAgICAgIGZyZWUobURlZmF1bHRWYWx1ZS5zdHIpOworICAgICAgICBmcmVlKG1DdXJyZW50VmFsdWUuc3RyKTsKKyAgICAgICAgZnJlZShtTWluaW11bVZhbHVlLnN0cik7CisgICAgICAgIGZyZWUobU1heGltdW1WYWx1ZS5zdHIpOworICAgICAgICBpZiAobURlZmF1bHRBcnJheVZhbHVlcykgeworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtRGVmYXVsdEFycmF5TGVuZ3RoOyBpKyspCisgICAgICAgICAgICAgICAgZnJlZShtRGVmYXVsdEFycmF5VmFsdWVzW2ldLnN0cik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1DdXJyZW50QXJyYXlWYWx1ZXMpIHsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbUN1cnJlbnRBcnJheUxlbmd0aDsgaSsrKQorICAgICAgICAgICAgICAgIGZyZWUobUN1cnJlbnRBcnJheVZhbHVlc1tpXS5zdHIpOworICAgICAgICB9CisgICAgICAgIGlmIChtRW51bVZhbHVlcykgeworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtRW51bUxlbmd0aDsgaSsrKQorICAgICAgICAgICAgICAgIGZyZWUobUVudW1WYWx1ZXNbaV0uc3RyKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBkZWxldGVbXSBtRGVmYXVsdEFycmF5VmFsdWVzOworICAgIGRlbGV0ZVtdIG1DdXJyZW50QXJyYXlWYWx1ZXM7CisgICAgZGVsZXRlW10gbUVudW1WYWx1ZXM7Cit9CisKK3ZvaWQgTXRwUHJvcGVydHk6OnJlYWQoTXRwRGF0YVBhY2tldCYgcGFja2V0KSB7CisKKyAgICBtQ29kZSA9IHBhY2tldC5nZXRVSW50MTYoKTsKKyAgICBtVHlwZSA9IHBhY2tldC5nZXRVSW50MTYoKTsKKyAgICBtV3JpdGVhYmxlID0gKHBhY2tldC5nZXRVSW50OCgpID09IDEpOworICAgIHN3aXRjaCAobVR5cGUpIHsKKyAgICAgICAgY2FzZSBNVFBfVFlQRV9BSU5UODoKKyAgICAgICAgY2FzZSBNVFBfVFlQRV9BVUlOVDg6CisgICAgICAgIGNhc2UgTVRQX1RZUEVfQUlOVDE2OgorICAgICAgICBjYXNlIE1UUF9UWVBFX0FVSU5UMTY6CisgICAgICAgIGNhc2UgTVRQX1RZUEVfQUlOVDMyOgorICAgICAgICBjYXNlIE1UUF9UWVBFX0FVSU5UMzI6CisgICAgICAgIGNhc2UgTVRQX1RZUEVfQUlOVDY0OgorICAgICAgICBjYXNlIE1UUF9UWVBFX0FVSU5UNjQ6CisgICAgICAgIGNhc2UgTVRQX1RZUEVfQUlOVDEyODoKKyAgICAgICAgY2FzZSBNVFBfVFlQRV9BVUlOVDEyODoKKyAgICAgICAgICAgIG1EZWZhdWx0QXJyYXlWYWx1ZXMgPSByZWFkQXJyYXlWYWx1ZXMocGFja2V0LCBtRGVmYXVsdEFycmF5TGVuZ3RoKTsKKyAgICAgICAgICAgIG1DdXJyZW50QXJyYXlWYWx1ZXMgPSByZWFkQXJyYXlWYWx1ZXMocGFja2V0LCBtQ3VycmVudEFycmF5TGVuZ3RoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmVhZFZhbHVlKHBhY2tldCwgbURlZmF1bHRWYWx1ZSk7CisgICAgICAgICAgICBpZiAoaXNEZXZpY2VQcm9wZXJ0eSgpKQorICAgICAgICAgICAgICAgIHJlYWRWYWx1ZShwYWNrZXQsIG1DdXJyZW50VmFsdWUpOworICAgIH0KKyAgICBtR3JvdXBDb2RlID0gcGFja2V0LmdldFVJbnQzMigpOworICAgIG1Gb3JtRmxhZyA9IHBhY2tldC5nZXRVSW50OCgpOworCisgICAgaWYgKG1Gb3JtRmxhZyA9PSBrRm9ybVJhbmdlKSB7CisgICAgICAgICAgICByZWFkVmFsdWUocGFja2V0LCBtTWluaW11bVZhbHVlKTsKKyAgICAgICAgICAgIHJlYWRWYWx1ZShwYWNrZXQsIG1NYXhpbXVtVmFsdWUpOworICAgICAgICAgICAgcmVhZFZhbHVlKHBhY2tldCwgbVN0ZXBTaXplKTsKKyAgICB9IGVsc2UgaWYgKG1Gb3JtRmxhZyA9PSBrRm9ybUVudW0pIHsKKyAgICAgICAgbUVudW1MZW5ndGggPSBwYWNrZXQuZ2V0VUludDE2KCk7CisgICAgICAgIG1FbnVtVmFsdWVzID0gbmV3IE10cFByb3BlcnR5VmFsdWVbbUVudW1MZW5ndGhdOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1FbnVtTGVuZ3RoOyBpKyspCisgICAgICAgICAgICByZWFkVmFsdWUocGFja2V0LCBtRW51bVZhbHVlc1tpXSk7CisgICAgfQorfQorCit2b2lkIE10cFByb3BlcnR5Ojp3cml0ZShNdHBEYXRhUGFja2V0JiBwYWNrZXQpIHsKKyAgICBwYWNrZXQucHV0VUludDE2KG1Db2RlKTsKKyAgICBwYWNrZXQucHV0VUludDE2KG1UeXBlKTsKKyAgICBwYWNrZXQucHV0VUludDgobVdyaXRlYWJsZSA/IDEgOiAwKTsKKworICAgIHN3aXRjaCAobVR5cGUpIHsKKyAgICAgICAgY2FzZSBNVFBfVFlQRV9BSU5UODoKKyAgICAgICAgY2FzZSBNVFBfVFlQRV9BVUlOVDg6CisgICAgICAgIGNhc2UgTVRQX1RZUEVfQUlOVDE2OgorICAgICAgICBjYXNlIE1UUF9UWVBFX0FVSU5UMTY6CisgICAgICAgIGNhc2UgTVRQX1RZUEVfQUlOVDMyOgorICAgICAgICBjYXNlIE1UUF9UWVBFX0FVSU5UMzI6CisgICAgICAgIGNhc2UgTVRQX1RZUEVfQUlOVDY0OgorICAgICAgICBjYXNlIE1UUF9UWVBFX0FVSU5UNjQ6CisgICAgICAgIGNhc2UgTVRQX1RZUEVfQUlOVDEyODoKKyAgICAgICAgY2FzZSBNVFBfVFlQRV9BVUlOVDEyODoKKyAgICAgICAgICAgIHdyaXRlQXJyYXlWYWx1ZXMocGFja2V0LCBtRGVmYXVsdEFycmF5VmFsdWVzLCBtRGVmYXVsdEFycmF5TGVuZ3RoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgd3JpdGVWYWx1ZShwYWNrZXQsIG1EZWZhdWx0VmFsdWUpOworICAgIH0KKyAgICBwYWNrZXQucHV0VUludDMyKG1Hcm91cENvZGUpOworICAgIHBhY2tldC5wdXRVSW50OChtRm9ybUZsYWcpOworICAgIGlmIChtRm9ybUZsYWcgPT0ga0Zvcm1SYW5nZSkgeworICAgICAgICAgICAgd3JpdGVWYWx1ZShwYWNrZXQsIG1NaW5pbXVtVmFsdWUpOworICAgICAgICAgICAgd3JpdGVWYWx1ZShwYWNrZXQsIG1NYXhpbXVtVmFsdWUpOworICAgICAgICAgICAgd3JpdGVWYWx1ZShwYWNrZXQsIG1TdGVwU2l6ZSk7CisgICAgfSBlbHNlIGlmIChtRm9ybUZsYWcgPT0ga0Zvcm1FbnVtKSB7CisgICAgICAgIHBhY2tldC5wdXRVSW50MTYobUVudW1MZW5ndGgpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1FbnVtTGVuZ3RoOyBpKyspCisgICAgICAgICAgICB3cml0ZVZhbHVlKHBhY2tldCwgbUVudW1WYWx1ZXNbaV0pOworICAgIH0KK30KKwordm9pZCBNdHBQcm9wZXJ0eTo6cHJpbnQoKSB7CisgICAgTE9HVigiTXRwUHJvcGVydHkgJTA0WFxuIiwgbUNvZGUpOworICAgIExPR1YoIiAgICB0eXBlICUwNFhcbiIsIG1UeXBlKTsKKyAgICBMT0dWKCIgICAgd3JpdGVhYmxlICVzXG4iLCAobVdyaXRlYWJsZSA/ICJ0cnVlIiA6ICJmYWxzZSIpKTsKK30KKwordm9pZCBNdHBQcm9wZXJ0eTo6cmVhZFZhbHVlKE10cERhdGFQYWNrZXQmIHBhY2tldCwgTXRwUHJvcGVydHlWYWx1ZSYgdmFsdWUpIHsKKyAgICBNdHBTdHJpbmdCdWZmZXIgc3RyaW5nQnVmZmVyOworCisgICAgc3dpdGNoIChtVHlwZSkgeworICAgICAgICBjYXNlIE1UUF9UWVBFX0lOVDg6CisgICAgICAgIGNhc2UgTVRQX1RZUEVfQUlOVDg6CisgICAgICAgICAgICB2YWx1ZS5pOCA9IHBhY2tldC5nZXRJbnQ4KCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBNVFBfVFlQRV9VSU5UODoKKyAgICAgICAgY2FzZSBNVFBfVFlQRV9BVUlOVDg6CisgICAgICAgICAgICB2YWx1ZS51OCA9IHBhY2tldC5nZXRVSW50OCgpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTVRQX1RZUEVfSU5UMTY6CisgICAgICAgIGNhc2UgTVRQX1RZUEVfQUlOVDE2OgorICAgICAgICAgICAgdmFsdWUuaTE2ID0gcGFja2V0LmdldEludDE2KCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBNVFBfVFlQRV9VSU5UMTY6CisgICAgICAgIGNhc2UgTVRQX1RZUEVfQVVJTlQxNjoKKyAgICAgICAgICAgIHZhbHVlLnUxNiA9IHBhY2tldC5nZXRVSW50MTYoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE1UUF9UWVBFX0lOVDMyOgorICAgICAgICBjYXNlIE1UUF9UWVBFX0FJTlQzMjoKKyAgICAgICAgICAgIHZhbHVlLmkzMiA9IHBhY2tldC5nZXRJbnQzMigpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTVRQX1RZUEVfVUlOVDMyOgorICAgICAgICBjYXNlIE1UUF9UWVBFX0FVSU5UMzI6CisgICAgICAgICAgICB2YWx1ZS51MzIgPSBwYWNrZXQuZ2V0VUludDMyKCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBNVFBfVFlQRV9JTlQ2NDoKKyAgICAgICAgY2FzZSBNVFBfVFlQRV9BSU5UNjQ6CisgICAgICAgICAgICB2YWx1ZS5pNjQgPSBwYWNrZXQuZ2V0SW50NjQoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE1UUF9UWVBFX1VJTlQ2NDoKKyAgICAgICAgY2FzZSBNVFBfVFlQRV9BVUlOVDY0OgorICAgICAgICAgICAgdmFsdWUudTY0ID0gcGFja2V0LmdldFVJbnQ2NCgpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTVRQX1RZUEVfSU5UMTI4OgorICAgICAgICBjYXNlIE1UUF9UWVBFX0FJTlQxMjg6CisgICAgICAgICAgICBwYWNrZXQuZ2V0SW50MTI4KHZhbHVlLmkxMjgpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTVRQX1RZUEVfVUlOVDEyODoKKyAgICAgICAgY2FzZSBNVFBfVFlQRV9BVUlOVDEyODoKKyAgICAgICAgICAgIHBhY2tldC5nZXRVSW50MTI4KHZhbHVlLnUxMjgpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTVRQX1RZUEVfU1RSOgorICAgICAgICAgICAgcGFja2V0LmdldFN0cmluZyhzdHJpbmdCdWZmZXIpOworICAgICAgICAgICAgdmFsdWUuc3RyID0gc3RyZHVwKHN0cmluZ0J1ZmZlcik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIExPR0UoInVua25vd24gdHlwZSAlMDRYIGluIE10cFByb3BlcnR5OjpyZWFkVmFsdWUiLCBtVHlwZSk7CisgICAgfQorfQorCit2b2lkIE10cFByb3BlcnR5Ojp3cml0ZVZhbHVlKE10cERhdGFQYWNrZXQmIHBhY2tldCwgTXRwUHJvcGVydHlWYWx1ZSYgdmFsdWUpIHsKKyAgICBNdHBTdHJpbmdCdWZmZXIgc3RyaW5nQnVmZmVyOworCisgICAgc3dpdGNoIChtVHlwZSkgeworICAgICAgICBjYXNlIE1UUF9UWVBFX0lOVDg6CisgICAgICAgIGNhc2UgTVRQX1RZUEVfQUlOVDg6CisgICAgICAgICAgICBwYWNrZXQucHV0SW50OCh2YWx1ZS5pOCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBNVFBfVFlQRV9VSU5UODoKKyAgICAgICAgY2FzZSBNVFBfVFlQRV9BVUlOVDg6CisgICAgICAgICAgICBwYWNrZXQucHV0VUludDgodmFsdWUudTgpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTVRQX1RZUEVfSU5UMTY6CisgICAgICAgIGNhc2UgTVRQX1RZUEVfQUlOVDE2OgorICAgICAgICAgICAgcGFja2V0LnB1dEludDE2KHZhbHVlLmkxNik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBNVFBfVFlQRV9VSU5UMTY6CisgICAgICAgIGNhc2UgTVRQX1RZUEVfQVVJTlQxNjoKKyAgICAgICAgICAgIHBhY2tldC5wdXRVSW50MTYodmFsdWUudTE2KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE1UUF9UWVBFX0lOVDMyOgorICAgICAgICBjYXNlIE1UUF9UWVBFX0FJTlQzMjoKKyAgICAgICAgICAgIHBhY2tldC5wdXRJbnQzMih2YWx1ZS5pMzIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTVRQX1RZUEVfVUlOVDMyOgorICAgICAgICBjYXNlIE1UUF9UWVBFX0FVSU5UMzI6CisgICAgICAgICAgICBwYWNrZXQucHV0VUludDMyKHZhbHVlLnUzMik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBNVFBfVFlQRV9JTlQ2NDoKKyAgICAgICAgY2FzZSBNVFBfVFlQRV9BSU5UNjQ6CisgICAgICAgICAgICBwYWNrZXQucHV0SW50NjQodmFsdWUuaTY0KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE1UUF9UWVBFX1VJTlQ2NDoKKyAgICAgICAgY2FzZSBNVFBfVFlQRV9BVUlOVDY0OgorICAgICAgICAgICAgcGFja2V0LnB1dFVJbnQ2NCh2YWx1ZS51NjQpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTVRQX1RZUEVfSU5UMTI4OgorICAgICAgICBjYXNlIE1UUF9UWVBFX0FJTlQxMjg6CisgICAgICAgICAgICBwYWNrZXQucHV0SW50MTI4KHZhbHVlLmkxMjgpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTVRQX1RZUEVfVUlOVDEyODoKKyAgICAgICAgY2FzZSBNVFBfVFlQRV9BVUlOVDEyODoKKyAgICAgICAgICAgIHBhY2tldC5wdXRVSW50MTI4KHZhbHVlLnUxMjgpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTVRQX1RZUEVfU1RSOgorICAgICAgICAgICAgaWYgKHZhbHVlLnN0cikKKyAgICAgICAgICAgICAgICBwYWNrZXQucHV0U3RyaW5nKHZhbHVlLnN0cik7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgcGFja2V0LnB1dEVtcHR5U3RyaW5nKCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIExPR0UoInVua25vd24gdHlwZSAlMDRYIGluIE10cFByb3BlcnR5Ojp3cml0ZVZhbHVlIiwgbVR5cGUpOworICAgIH0KK30KKworTXRwUHJvcGVydHlWYWx1ZSogTXRwUHJvcGVydHk6OnJlYWRBcnJheVZhbHVlcyhNdHBEYXRhUGFja2V0JiBwYWNrZXQsIGludCYgbGVuZ3RoKSB7CisgICAgbGVuZ3RoID0gcGFja2V0LmdldFVJbnQzMigpOworICAgIGlmIChsZW5ndGggPT0gMCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgTXRwUHJvcGVydHlWYWx1ZSogcmVzdWx0ID0gbmV3IE10cFByb3BlcnR5VmFsdWVbbGVuZ3RoXTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKQorICAgICAgICByZWFkVmFsdWUocGFja2V0LCByZXN1bHRbaV0pOworICAgIHJldHVybiByZXN1bHQ7Cit9CisKK3ZvaWQgTXRwUHJvcGVydHk6OndyaXRlQXJyYXlWYWx1ZXMoTXRwRGF0YVBhY2tldCYgcGFja2V0LCBNdHBQcm9wZXJ0eVZhbHVlKiB2YWx1ZXMsIGludCBsZW5ndGgpIHsKKyAgICBwYWNrZXQucHV0VUludDMyKGxlbmd0aCk7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykKKyAgICAgICAgd3JpdGVWYWx1ZShwYWNrZXQsIHZhbHVlc1tpXSk7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9tdHAvTXRwUHJvcGVydHkuaCBiL21lZGlhL210cC9NdHBQcm9wZXJ0eS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY0Y2ZiOTMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9tdHAvTXRwUHJvcGVydHkuaApAQCAtMCwwICsxLDg4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfTVRQX1BST1BFUlRZX0gKKyNkZWZpbmUgX01UUF9QUk9QRVJUWV9ICisKKyNpbmNsdWRlICJNdHBUeXBlcy5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NsYXNzIE10cERhdGFQYWNrZXQ7CisKK2NsYXNzIE10cFByb3BlcnR5IHsKK3B1YmxpYzoKKyAgICBNdHBQcm9wZXJ0eUNvZGUgICAgIG1Db2RlOworICAgIE10cERhdGFUeXBlICAgICAgICAgbVR5cGU7CisgICAgYm9vbCAgICAgICAgICAgICAgICBtV3JpdGVhYmxlOworICAgIE10cFByb3BlcnR5VmFsdWUgICAgbURlZmF1bHRWYWx1ZTsKKyAgICBNdHBQcm9wZXJ0eVZhbHVlICAgIG1DdXJyZW50VmFsdWU7CisKKyAgICAvLyBmb3IgYXJyYXkgdHlwZXMKKyAgICBpbnQgICAgICAgICAgICAgICAgIG1EZWZhdWx0QXJyYXlMZW5ndGg7CisgICAgTXRwUHJvcGVydHlWYWx1ZSogICBtRGVmYXVsdEFycmF5VmFsdWVzOworICAgIGludCAgICAgICAgICAgICAgICAgbUN1cnJlbnRBcnJheUxlbmd0aDsKKyAgICBNdHBQcm9wZXJ0eVZhbHVlKiAgIG1DdXJyZW50QXJyYXlWYWx1ZXM7CisKKyAgICBlbnVtIHsKKyAgICAgICAga0Zvcm1Ob25lID0gMCwKKyAgICAgICAga0Zvcm1SYW5nZSA9IDEsCisgICAgICAgIGtGb3JtRW51bSA9IDIsCisgICAgfTsKKworICAgIHVpbnQzMl90ICAgICAgICAgICAgbUdyb3VwQ29kZTsKKyAgICB1aW50OF90ICAgICAgICAgICAgIG1Gb3JtRmxhZzsKKworICAgIC8vIGZvciByYW5nZSBmb3JtCisgICAgTXRwUHJvcGVydHlWYWx1ZSAgICBtTWluaW11bVZhbHVlOworICAgIE10cFByb3BlcnR5VmFsdWUgICAgbU1heGltdW1WYWx1ZTsKKyAgICBNdHBQcm9wZXJ0eVZhbHVlICAgIG1TdGVwU2l6ZTsKKworICAgIC8vIGZvciBlbnVtIGZvcm0KKyAgICBpbnQgICAgICAgICAgICAgICAgIG1FbnVtTGVuZ3RoOworICAgIE10cFByb3BlcnR5VmFsdWUqICAgbUVudW1WYWx1ZXM7CisKK3B1YmxpYzoKKyAgICAgICAgICAgICAgICAgICAgICAgIE10cFByb3BlcnR5KCk7CisgICAgICAgICAgICAgICAgICAgICAgICBNdHBQcm9wZXJ0eShNdHBQcm9wZXJ0eUNvZGUgcHJvcENvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXRwRGF0YVR5cGUgdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHdyaXRlYWJsZSA9IGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZWZhdWx0VmFsdWUgPSAwKTsKKyAgICB2aXJ0dWFsICAgICAgICAgICAgIH5NdHBQcm9wZXJ0eSgpOworCisgICAgaW5saW5lIE10cFByb3BlcnR5Q29kZSBnZXRQcm9wZXJ0eUNvZGUoKSBjb25zdCB7IHJldHVybiBtQ29kZTsgfQorCisgICAgdm9pZCAgICAgICAgICAgICAgICByZWFkKE10cERhdGFQYWNrZXQmIHBhY2tldCk7CisgICAgdm9pZCAgICAgICAgICAgICAgICB3cml0ZShNdHBEYXRhUGFja2V0JiBwYWNrZXQpOworCisgICAgdm9pZCAgICAgICAgICAgICAgICBwcmludCgpOworCisgICAgaW5saW5lIGJvb2wgICAgICAgICBpc0RldmljZVByb3BlcnR5KCkgY29uc3QgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoICAgKChtQ29kZSAmIDB4RjAwMCkgPT0gMHg1MDAwKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChtQ29kZSAmIDB4RjgwMCkgPT0gMHhEMDAwKSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKK3ByaXZhdGU6CisgICAgdm9pZCAgICAgICAgICAgICAgICByZWFkVmFsdWUoTXRwRGF0YVBhY2tldCYgcGFja2V0LCBNdHBQcm9wZXJ0eVZhbHVlJiB2YWx1ZSk7CisgICAgdm9pZCAgICAgICAgICAgICAgICB3cml0ZVZhbHVlKE10cERhdGFQYWNrZXQmIHBhY2tldCwgTXRwUHJvcGVydHlWYWx1ZSYgdmFsdWUpOworICAgIE10cFByb3BlcnR5VmFsdWUqICAgcmVhZEFycmF5VmFsdWVzKE10cERhdGFQYWNrZXQmIHBhY2tldCwgaW50JiBsZW5ndGgpOworICAgIHZvaWQgICAgICAgICAgICAgICAgd3JpdGVBcnJheVZhbHVlcyhNdHBEYXRhUGFja2V0JiBwYWNrZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE10cFByb3BlcnR5VmFsdWUqIHZhbHVlcywgaW50IGxlbmd0aCk7Cit9OworCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgLy8gX01UUF9QUk9QRVJUWV9ICmRpZmYgLS1naXQgYS9tZWRpYS9tdHAvTXRwUmVxdWVzdFBhY2tldC5jcHAgYi9tZWRpYS9tdHAvTXRwUmVxdWVzdFBhY2tldC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGVjZTU4MAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL210cC9NdHBSZXF1ZXN0UGFja2V0LmNwcApAQCAtMCwwICsxLDU2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJNdHBSZXF1ZXN0UGFja2V0IgorCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorCisjaW5jbHVkZSAiTXRwUmVxdWVzdFBhY2tldC5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK010cFJlcXVlc3RQYWNrZXQ6Ok10cFJlcXVlc3RQYWNrZXQoKQorICAgIDogICBNdHBQYWNrZXQoNTEyKQoreworfQorCitNdHBSZXF1ZXN0UGFja2V0Ojp+TXRwUmVxdWVzdFBhY2tldCgpIHsKK30KKworI2lmZGVmIE1UUF9ERVZJQ0UKK2ludCBNdHBSZXF1ZXN0UGFja2V0OjpyZWFkKGludCBmZCkgeworICAgIGludCByZXQgPSA6OnJlYWQoZmQsIG1CdWZmZXIsIG1CdWZmZXJTaXplKTsKKyAgICBpZiAocmV0ID49IDApCisgICAgICAgIG1QYWNrZXRTaXplID0gcmV0OworICAgIGVsc2UKKyAgICAgICAgbVBhY2tldFNpemUgPSAwOworICAgIHJldHVybiByZXQ7Cit9CisjZW5kaWYKKworI2lmZGVmIE1UUF9IT1NUCisgICAgLy8gd3JpdGUgb3VyIGJ1ZmZlciB0byB0aGUgZ2l2ZW4gZW5kcG9pbnQgKGhvc3QgbW9kZSkKK2ludCBNdHBSZXF1ZXN0UGFja2V0Ojp3cml0ZShzdHJ1Y3QgdXNiX2VuZHBvaW50ICplcCkKK3sKKyAgICBwdXRVSW50MzIoTVRQX0NPTlRBSU5FUl9MRU5HVEhfT0ZGU0VULCBtUGFja2V0U2l6ZSk7CisgICAgcHV0VUludDE2KE1UUF9DT05UQUlORVJfVFlQRV9PRkZTRVQsIE1UUF9DT05UQUlORVJfVFlQRV9DT01NQU5EKTsKKyAgICByZXR1cm4gdHJhbnNmZXIoZXAsIG1CdWZmZXIsIG1QYWNrZXRTaXplKTsKK30KKyNlbmRpZgorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbXRwL010cFJlcXVlc3RQYWNrZXQuaCBiL21lZGlhL210cC9NdHBSZXF1ZXN0UGFja2V0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGY1MThmMgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL210cC9NdHBSZXF1ZXN0UGFja2V0LmgKQEAgLTAsMCArMSw0OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX01UUF9SRVFVRVNUX1BBQ0tFVF9ICisjZGVmaW5lIF9NVFBfUkVRVUVTVF9QQUNLRVRfSAorCisjaW5jbHVkZSAiTXRwUGFja2V0LmgiCisjaW5jbHVkZSAibXRwLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY2xhc3MgTXRwUmVxdWVzdFBhY2tldCA6IHB1YmxpYyBNdHBQYWNrZXQgeworCitwdWJsaWM6CisgICAgICAgICAgICAgICAgICAgICAgICBNdHBSZXF1ZXN0UGFja2V0KCk7CisgICAgdmlydHVhbCAgICAgICAgICAgICB+TXRwUmVxdWVzdFBhY2tldCgpOworCisjaWZkZWYgTVRQX0RFVklDRQorICAgIC8vIGZpbGwgb3VyIGJ1ZmZlciB3aXRoIGRhdGEgZnJvbSB0aGUgZ2l2ZW4gZmlsZSBkZXNjcmlwdG9yCisgICAgaW50ICAgICAgICAgICAgICAgICByZWFkKGludCBmZCk7CisjZW5kaWYKKworI2lmZGVmIE1UUF9IT1NUCisgICAgLy8gd3JpdGUgb3VyIGJ1ZmZlciB0byB0aGUgZ2l2ZW4gZW5kcG9pbnQKKyAgICBpbnQgICAgICAgICAgICAgICAgIHdyaXRlKHN0cnVjdCB1c2JfZW5kcG9pbnQgKmVwKTsKKyNlbmRpZgorCisgICAgaW5saW5lIE10cE9wZXJhdGlvbkNvZGUgICAgZ2V0T3BlcmF0aW9uQ29kZSgpIGNvbnN0IHsgcmV0dXJuIGdldENvbnRhaW5lckNvZGUoKTsgfQorICAgIGlubGluZSB2b2lkICAgICAgICAgICAgICAgIHNldE9wZXJhdGlvbkNvZGUoTXRwT3BlcmF0aW9uQ29kZSBjb2RlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgcmV0dXJuIHNldENvbnRhaW5lckNvZGUoY29kZSk7IH0KK307CisKK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAvLyBfTVRQX1JFUVVFU1RfUEFDS0VUX0gKZGlmZiAtLWdpdCBhL21lZGlhL210cC9NdHBSZXNwb25zZVBhY2tldC5jcHAgYi9tZWRpYS9tdHAvTXRwUmVzcG9uc2VQYWNrZXQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNlZjcxNGUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9tdHAvTXRwUmVzcG9uc2VQYWNrZXQuY3BwCkBAIC0wLDAgKzEsNTcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIk10cFJlc3BvbnNlUGFja2V0IgorCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorCisjaW5jbHVkZSAiTXRwUmVzcG9uc2VQYWNrZXQuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitNdHBSZXNwb25zZVBhY2tldDo6TXRwUmVzcG9uc2VQYWNrZXQoKQorICAgIDogICBNdHBQYWNrZXQoNTEyKQoreworfQorCitNdHBSZXNwb25zZVBhY2tldDo6fk10cFJlc3BvbnNlUGFja2V0KCkgeworfQorCisjaWZkZWYgTVRQX0RFVklDRQoraW50IE10cFJlc3BvbnNlUGFja2V0Ojp3cml0ZShpbnQgZmQpIHsKKyAgICBwdXRVSW50MzIoTVRQX0NPTlRBSU5FUl9MRU5HVEhfT0ZGU0VULCBtUGFja2V0U2l6ZSk7CisgICAgcHV0VUludDE2KE1UUF9DT05UQUlORVJfVFlQRV9PRkZTRVQsIE1UUF9DT05UQUlORVJfVFlQRV9SRVNQT05TRSk7CisgICAgaW50IHJldCA9IDo6d3JpdGUoZmQsIG1CdWZmZXIsIG1QYWNrZXRTaXplKTsKKyAgICByZXR1cm4gKHJldCA8IDAgPyByZXQgOiAwKTsKK30KKyNlbmRpZgorCisjaWZkZWYgTVRQX0hPU1QKKyAgICAvLyByZWFkIG91ciBidWZmZXIgZnJvbSB0aGUgZ2l2ZW4gZW5kcG9pbnQKK2ludCBNdHBSZXNwb25zZVBhY2tldDo6cmVhZChzdHJ1Y3QgdXNiX2VuZHBvaW50ICplcCkgeworICAgIGludCByZXQgPSB0cmFuc2ZlcihlcCwgbUJ1ZmZlciwgbUJ1ZmZlclNpemUpOworICAgICBpZiAocmV0ID49IDApCisgICAgICAgIG1QYWNrZXRTaXplID0gcmV0OworICAgIGVsc2UKKyAgICAgICAgbVBhY2tldFNpemUgPSAwOworICAgIHJldHVybiByZXQ7Cit9CisjZW5kaWYKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbXRwL010cFJlc3BvbnNlUGFja2V0LmggYi9tZWRpYS9tdHAvTXRwUmVzcG9uc2VQYWNrZXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNzNmOGY5Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbXRwL010cFJlc3BvbnNlUGFja2V0LmgKQEAgLTAsMCArMSw0OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX01UUF9SRVNQT05TRV9QQUNLRVRfSAorI2RlZmluZSBfTVRQX1JFU1BPTlNFX1BBQ0tFVF9ICisKKyNpbmNsdWRlICJNdHBQYWNrZXQuaCIKKyNpbmNsdWRlICJtdHAuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjbGFzcyBNdHBSZXNwb25zZVBhY2tldCA6IHB1YmxpYyBNdHBQYWNrZXQgeworCitwdWJsaWM6CisgICAgICAgICAgICAgICAgICAgICAgICBNdHBSZXNwb25zZVBhY2tldCgpOworICAgIHZpcnR1YWwgICAgICAgICAgICAgfk10cFJlc3BvbnNlUGFja2V0KCk7CisKKyNpZmRlZiBNVFBfREVWSUNFCisgICAgLy8gd3JpdGUgb3VyIGRhdGEgdG8gdGhlIGdpdmVuIGZpbGUgZGVzY3JpcHRvcgorICAgIGludCAgICAgICAgICAgICAgICAgd3JpdGUoaW50IGZkKTsKKyNlbmRpZgorCisjaWZkZWYgTVRQX0hPU1QKKyAgICAvLyByZWFkIG91ciBidWZmZXIgZnJvbSB0aGUgZ2l2ZW4gZW5kcG9pbnQKKyAgICBpbnQgICAgICAgICAgICAgICAgIHJlYWQoc3RydWN0IHVzYl9lbmRwb2ludCAqZXApOworI2VuZGlmCisKKyAgICBpbmxpbmUgTXRwUmVzcG9uc2VDb2RlICAgICAgZ2V0UmVzcG9uc2VDb2RlKCkgY29uc3QgeyByZXR1cm4gZ2V0Q29udGFpbmVyQ29kZSgpOyB9CisgICAgaW5saW5lIHZvaWQgICAgICAgICAgICAgICAgIHNldFJlc3BvbnNlQ29kZShNdHBSZXNwb25zZUNvZGUgY29kZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyByZXR1cm4gc2V0Q29udGFpbmVyQ29kZShjb2RlKTsgfQorfTsKKworfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmIC8vIF9NVFBfUkVTUE9OU0VfUEFDS0VUX0gKZGlmZiAtLWdpdCBhL21lZGlhL210cC9NdHBTZXJ2ZXIuY3BwIGIvbWVkaWEvbXRwL010cFNlcnZlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjMzMmI0ZQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL210cC9NdHBTZXJ2ZXIuY3BwCkBAIC0wLDAgKzEsNzkyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL2lvY3RsLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDxkaXJlbnQuaD4KKworI2luY2x1ZGUgPGN1dGlscy9wcm9wZXJ0aWVzLmg+CisKKyNpbmNsdWRlICJNdHBEZWJ1Zy5oIgorI2luY2x1ZGUgIk10cERhdGFiYXNlLmgiCisjaW5jbHVkZSAiTXRwUHJvcGVydHkuaCIKKyNpbmNsdWRlICJNdHBTZXJ2ZXIuaCIKKyNpbmNsdWRlICJNdHBTdG9yYWdlLmgiCisjaW5jbHVkZSAiTXRwU3RyaW5nQnVmZmVyLmgiCisKKyNpbmNsdWRlIDxsaW51eC91c2IvZl9tdHAuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitzdGF0aWMgY29uc3QgTXRwT3BlcmF0aW9uQ29kZSBrU3VwcG9ydGVkT3BlcmF0aW9uQ29kZXNbXSA9IHsKKyAgICBNVFBfT1BFUkFUSU9OX0dFVF9ERVZJQ0VfSU5GTywKKyAgICBNVFBfT1BFUkFUSU9OX09QRU5fU0VTU0lPTiwKKyAgICBNVFBfT1BFUkFUSU9OX0NMT1NFX1NFU1NJT04sCisgICAgTVRQX09QRVJBVElPTl9HRVRfU1RPUkFHRV9JRFMsCisgICAgTVRQX09QRVJBVElPTl9HRVRfU1RPUkFHRV9JTkZPLAorICAgIE1UUF9PUEVSQVRJT05fR0VUX05VTV9PQkpFQ1RTLAorICAgIE1UUF9PUEVSQVRJT05fR0VUX09CSkVDVF9IQU5ETEVTLAorICAgIE1UUF9PUEVSQVRJT05fR0VUX09CSkVDVF9JTkZPLAorICAgIE1UUF9PUEVSQVRJT05fR0VUX09CSkVDVCwKKy8vICAgIE1UUF9PUEVSQVRJT05fR0VUX1RIVU1CLAorICAgIE1UUF9PUEVSQVRJT05fREVMRVRFX09CSkVDVCwKKyAgICBNVFBfT1BFUkFUSU9OX1NFTkRfT0JKRUNUX0lORk8sCisgICAgTVRQX09QRVJBVElPTl9TRU5EX09CSkVDVCwKKy8vICAgIE1UUF9PUEVSQVRJT05fSU5JVElBVEVfQ0FQVFVSRSwKKy8vICAgIE1UUF9PUEVSQVRJT05fRk9STUFUX1NUT1JFLAorLy8gICAgTVRQX09QRVJBVElPTl9SRVNFVF9ERVZJQ0UsCisvLyAgICBNVFBfT1BFUkFUSU9OX1NFTEZfVEVTVCwKKy8vICAgIE1UUF9PUEVSQVRJT05fU0VUX09CSkVDVF9QUk9URUNUSU9OLAorLy8gICAgTVRQX09QRVJBVElPTl9QT1dFUl9ET1dOLAorICAgIE1UUF9PUEVSQVRJT05fR0VUX0RFVklDRV9QUk9QX0RFU0MsCisgICAgTVRQX09QRVJBVElPTl9HRVRfREVWSUNFX1BST1BfVkFMVUUsCisgICAgTVRQX09QRVJBVElPTl9TRVRfREVWSUNFX1BST1BfVkFMVUUsCisgICAgTVRQX09QRVJBVElPTl9SRVNFVF9ERVZJQ0VfUFJPUF9WQUxVRSwKKy8vICAgIE1UUF9PUEVSQVRJT05fVEVSTUlOQVRFX09QRU5fQ0FQVFVSRSwKKy8vICAgIE1UUF9PUEVSQVRJT05fTU9WRV9PQkpFQ1QsCisvLyAgICBNVFBfT1BFUkFUSU9OX0NPUFlfT0JKRUNULAorLy8gICAgTVRQX09QRVJBVElPTl9HRVRfUEFSVElBTF9PQkpFQ1QsCisvLyAgICBNVFBfT1BFUkFUSU9OX0lOSVRJQVRFX09QRU5fQ0FQVFVSRSwKKyAgICBNVFBfT1BFUkFUSU9OX0dFVF9PQkpFQ1RfUFJPUFNfU1VQUE9SVEVELAorICAgIE1UUF9PUEVSQVRJT05fR0VUX09CSkVDVF9QUk9QX0RFU0MsCisvLyAgICBNVFBfT1BFUkFUSU9OX0dFVF9PQkpFQ1RfUFJPUF9WQUxVRSwKKy8vICAgIE1UUF9PUEVSQVRJT05fU0VUX09CSkVDVF9QUk9QX1ZBTFVFLAorICAgIE1UUF9PUEVSQVRJT05fR0VUX09CSkVDVF9SRUZFUkVOQ0VTLAorICAgIE1UUF9PUEVSQVRJT05fU0VUX09CSkVDVF9SRUZFUkVOQ0VTLAorLy8gICAgTVRQX09QRVJBVElPTl9TS0lQLAorfTsKKworc3RhdGljIGNvbnN0IE10cEV2ZW50Q29kZSBrU3VwcG9ydGVkRXZlbnRDb2Rlc1tdID0geworICAgIE1UUF9FVkVOVF9PQkpFQ1RfQURERUQsCisgICAgTVRQX0VWRU5UX09CSkVDVF9SRU1PVkVELAorfTsKKworTXRwU2VydmVyOjpNdHBTZXJ2ZXIoaW50IGZkLCBNdHBEYXRhYmFzZSogZGF0YWJhc2UsCisgICAgICAgICAgICAgICAgICAgIGludCBmaWxlR3JvdXAsIGludCBmaWxlUGVybSwgaW50IGRpcmVjdG9yeVBlcm0pCisgICAgOiAgIG1GRChmZCksCisgICAgICAgIG1EYXRhYmFzZShkYXRhYmFzZSksCisgICAgICAgIG1GaWxlR3JvdXAoZmlsZUdyb3VwKSwKKyAgICAgICAgbUZpbGVQZXJtaXNzaW9uKGZpbGVQZXJtKSwKKyAgICAgICAgbURpcmVjdG9yeVBlcm1pc3Npb24oZGlyZWN0b3J5UGVybSksCisgICAgICAgIG1TZXNzaW9uSUQoMCksCisgICAgICAgIG1TZXNzaW9uT3BlbihmYWxzZSksCisgICAgICAgIG1TZW5kT2JqZWN0SGFuZGxlKGtJbnZhbGlkT2JqZWN0SGFuZGxlKSwKKyAgICAgICAgbVNlbmRPYmplY3RGb3JtYXQoMCksCisgICAgICAgIG1TZW5kT2JqZWN0RmlsZVNpemUoMCkKK3sKK30KKworTXRwU2VydmVyOjp+TXRwU2VydmVyKCkgeworfQorCit2b2lkIE10cFNlcnZlcjo6YWRkU3RvcmFnZShjb25zdCBjaGFyKiBmaWxlUGF0aCkgeworICAgIGludCBpbmRleCA9IG1TdG9yYWdlcy5zaXplKCkgKyAxOworICAgIGluZGV4IHw9IGluZGV4IDw8IDE2OyAgIC8vIHNldCBoaWdoIGFuZCBsb3cgcGFydCB0byBvdXIgaW5kZXgKKyAgICBNdHBTdG9yYWdlKiBzdG9yYWdlID0gbmV3IE10cFN0b3JhZ2UoaW5kZXgsIGZpbGVQYXRoLCBtRGF0YWJhc2UpOworICAgIGFkZFN0b3JhZ2Uoc3RvcmFnZSk7Cit9CisKK010cFN0b3JhZ2UqIE10cFNlcnZlcjo6Z2V0U3RvcmFnZShNdHBTdG9yYWdlSUQgaWQpIHsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IG1TdG9yYWdlcy5zaXplKCk7IGkrKykgeworICAgICAgICBNdHBTdG9yYWdlKiBzdG9yYWdlID0gIG1TdG9yYWdlc1tpXTsKKyAgICAgICAgaWYgKHN0b3JhZ2UtPmdldFN0b3JhZ2VJRCgpID09IGlkKQorICAgICAgICAgICAgcmV0dXJuIHN0b3JhZ2U7CisgICAgfQorICAgIHJldHVybiBOVUxMOworfQorCit2b2lkIE10cFNlcnZlcjo6cnVuKCkgeworICAgIGludCBmZCA9IG1GRDsKKworICAgIExPR1YoIk10cFNlcnZlcjo6cnVuIGZkOiAlZFxuIiwgZmQpOworCisgICAgd2hpbGUgKDEpIHsKKyAgICAgICAgaW50IHJldCA9IG1SZXF1ZXN0LnJlYWQoZmQpOworICAgICAgICBpZiAocmV0IDwgMCkgeworICAgICAgICAgICAgTE9HRSgicmVxdWVzdCByZWFkIHJldHVybmVkICVkLCBlcnJubzogJWQiLCByZXQsIGVycm5vKTsKKyAgICAgICAgICAgIGlmIChlcnJubyA9PSBFQ0FOQ0VMRUQpIHsKKyAgICAgICAgICAgICAgICAvLyByZXR1cm4gdG8gdG9wIG9mIGxvb3AgYW5kIHdhaXQgZm9yIG5leHQgY29tbWFuZAorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgTXRwT3BlcmF0aW9uQ29kZSBvcGVyYXRpb24gPSBtUmVxdWVzdC5nZXRPcGVyYXRpb25Db2RlKCk7CisgICAgICAgIE10cFRyYW5zYWN0aW9uSUQgdHJhbnNhY3Rpb24gPSBtUmVxdWVzdC5nZXRUcmFuc2FjdGlvbklEKCk7CisKKyAgICAgICAgTE9HVigib3BlcmF0aW9uOiAlcyIsIE10cERlYnVnOjpnZXRPcGVyYXRpb25Db2RlTmFtZShvcGVyYXRpb24pKTsKKyAgICAgICAgbVJlcXVlc3QuZHVtcCgpOworCisgICAgICAgIC8vIEZJWE1FIG5lZWQgdG8gZ2VuZXJhbGl6ZSB0aGlzCisgICAgICAgIGJvb2wgZGF0YUluID0gKG9wZXJhdGlvbiA9PSBNVFBfT1BFUkFUSU9OX1NFTkRfT0JKRUNUX0lORk8KKyAgICAgICAgICAgICAgICAgICAgfHwgb3BlcmF0aW9uID09IE1UUF9PUEVSQVRJT05fU0VUX09CSkVDVF9SRUZFUkVOQ0VTCisgICAgICAgICAgICAgICAgICAgIHx8IG9wZXJhdGlvbiA9PSBNVFBfT1BFUkFUSU9OX1NFVF9PQkpFQ1RfUFJPUF9WQUxVRQorICAgICAgICAgICAgICAgICAgICB8fCBvcGVyYXRpb24gPT0gTVRQX09QRVJBVElPTl9TRVRfREVWSUNFX1BST1BfVkFMVUUpOworICAgICAgICBpZiAoZGF0YUluKSB7CisgICAgICAgICAgICBpbnQgcmV0ID0gbURhdGEucmVhZChmZCk7CisgICAgICAgICAgICBpZiAocmV0IDwgMCkgeworICAgICAgICAgICAgICAgIExPR0UoImRhdGEgcmVhZCByZXR1cm5lZCAlZCwgZXJybm86ICVkIiwgcmV0LCBlcnJubyk7CisgICAgICAgICAgICAgICAgaWYgKGVycm5vID09IEVDQU5DRUxFRCkgeworICAgICAgICAgICAgICAgICAgICAvLyByZXR1cm4gdG8gdG9wIG9mIGxvb3AgYW5kIHdhaXQgZm9yIG5leHQgY29tbWFuZAorICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBMT0dWKCJyZWNlaXZlZCBkYXRhOiIpOworICAgICAgICAgICAgbURhdGEuZHVtcCgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbURhdGEucmVzZXQoKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChoYW5kbGVSZXF1ZXN0KCkpIHsKKyAgICAgICAgICAgIGlmICghZGF0YUluICYmIG1EYXRhLmhhc0RhdGEoKSkgeworICAgICAgICAgICAgICAgIG1EYXRhLnNldE9wZXJhdGlvbkNvZGUob3BlcmF0aW9uKTsKKyAgICAgICAgICAgICAgICBtRGF0YS5zZXRUcmFuc2FjdGlvbklEKHRyYW5zYWN0aW9uKTsKKyAgICAgICAgICAgICAgICBMT0dWKCJzZW5kaW5nIGRhdGE6Iik7CisgICAgICAgICAgICAgICAgcmV0ID0gbURhdGEud3JpdGUoZmQpOworICAgICAgICAgICAgICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgICAgICAgICAgICAgIExPR0UoInJlcXVlc3Qgd3JpdGUgcmV0dXJuZWQgJWQsIGVycm5vOiAlZCIsIHJldCwgZXJybm8pOworICAgICAgICAgICAgICAgICAgICBpZiAoZXJybm8gPT0gRUNBTkNFTEVEKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyByZXR1cm4gdG8gdG9wIG9mIGxvb3AgYW5kIHdhaXQgZm9yIG5leHQgY29tbWFuZAorICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBtUmVzcG9uc2Uuc2V0VHJhbnNhY3Rpb25JRCh0cmFuc2FjdGlvbik7CisgICAgICAgICAgICBMT0dWKCJzZW5kaW5nIHJlc3BvbnNlICUwNFgiLCBtUmVzcG9uc2UuZ2V0UmVzcG9uc2VDb2RlKCkpOworICAgICAgICAgICAgcmV0ID0gbVJlc3BvbnNlLndyaXRlKGZkKTsKKyAgICAgICAgICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgICAgICAgICAgTE9HRSgicmVxdWVzdCB3cml0ZSByZXR1cm5lZCAlZCwgZXJybm86ICVkIiwgcmV0LCBlcnJubyk7CisgICAgICAgICAgICAgICAgaWYgKGVycm5vID09IEVDQU5DRUxFRCkgeworICAgICAgICAgICAgICAgICAgICAvLyByZXR1cm4gdG8gdG9wIG9mIGxvb3AgYW5kIHdhaXQgZm9yIG5leHQgY29tbWFuZAorICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBMT0dWKCJza2lwcGluZyByZXNwb25zZVxuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAobVNlc3Npb25PcGVuKQorICAgICAgICBtRGF0YWJhc2UtPnNlc3Npb25FbmRlZCgpOworfQorCit2b2lkIE10cFNlcnZlcjo6c2VuZE9iamVjdEFkZGVkKE10cE9iamVjdEhhbmRsZSBoYW5kbGUpIHsKKyAgICBpZiAobVNlc3Npb25PcGVuKSB7CisgICAgICAgIExPR0QoInNlbmRPYmplY3RBZGRlZCAlZFxuIiwgaGFuZGxlKTsKKyAgICAgICAgbUV2ZW50LnNldEV2ZW50Q29kZShNVFBfRVZFTlRfT0JKRUNUX0FEREVEKTsKKyAgICAgICAgbUV2ZW50LnNldFRyYW5zYWN0aW9uSUQobVJlcXVlc3QuZ2V0VHJhbnNhY3Rpb25JRCgpKTsKKyAgICAgICAgbUV2ZW50LnNldFBhcmFtZXRlcigxLCBoYW5kbGUpOworICAgICAgICBpbnQgcmV0ID0gbUV2ZW50LndyaXRlKG1GRCk7CisgICAgICAgIExPR0QoIm1FdmVudC53cml0ZSByZXR1cm5lZCAlZFxuIiwgcmV0KTsKKyAgICB9Cit9CisKK3ZvaWQgTXRwU2VydmVyOjpzZW5kT2JqZWN0UmVtb3ZlZChNdHBPYmplY3RIYW5kbGUgaGFuZGxlKSB7CisgICAgaWYgKG1TZXNzaW9uT3BlbikgeworICAgICAgICBMT0dEKCJzZW5kT2JqZWN0UmVtb3ZlZCAlZFxuIiwgaGFuZGxlKTsKKyAgICAgICAgbUV2ZW50LnNldEV2ZW50Q29kZShNVFBfRVZFTlRfT0JKRUNUX1JFTU9WRUQpOworICAgICAgICBtRXZlbnQuc2V0VHJhbnNhY3Rpb25JRChtUmVxdWVzdC5nZXRUcmFuc2FjdGlvbklEKCkpOworICAgICAgICBtRXZlbnQuc2V0UGFyYW1ldGVyKDEsIGhhbmRsZSk7CisgICAgICAgIGludCByZXQgPSBtRXZlbnQud3JpdGUobUZEKTsKKyAgICAgICAgTE9HRCgibUV2ZW50LndyaXRlIHJldHVybmVkICVkXG4iLCByZXQpOworICAgIH0KK30KKworYm9vbCBNdHBTZXJ2ZXI6OmhhbmRsZVJlcXVlc3QoKSB7CisgICAgTXRwT3BlcmF0aW9uQ29kZSBvcGVyYXRpb24gPSBtUmVxdWVzdC5nZXRPcGVyYXRpb25Db2RlKCk7CisgICAgTXRwUmVzcG9uc2VDb2RlIHJlc3BvbnNlOworCisgICAgbVJlc3BvbnNlLnJlc2V0KCk7CisKKyAgICBpZiAobVNlbmRPYmplY3RIYW5kbGUgIT0ga0ludmFsaWRPYmplY3RIYW5kbGUgJiYgb3BlcmF0aW9uICE9IE1UUF9PUEVSQVRJT05fU0VORF9PQkpFQ1QpIHsKKyAgICAgICAgLy8gRklYTUUgLSBuZWVkIHRvIGRlbGV0ZSBtU2VuZE9iamVjdEhhbmRsZSBmcm9tIHRoZSBkYXRhYmFzZQorICAgICAgICBMT0dFKCJleHBlY3RlZCBTZW5kT2JqZWN0IGFmdGVyIFNlbmRPYmplY3RJbmZvIik7CisgICAgICAgIG1TZW5kT2JqZWN0SGFuZGxlID0ga0ludmFsaWRPYmplY3RIYW5kbGU7CisgICAgfQorCisgICAgc3dpdGNoIChvcGVyYXRpb24pIHsKKyAgICAgICAgY2FzZSBNVFBfT1BFUkFUSU9OX0dFVF9ERVZJQ0VfSU5GTzoKKyAgICAgICAgICAgIHJlc3BvbnNlID0gZG9HZXREZXZpY2VJbmZvKCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBNVFBfT1BFUkFUSU9OX09QRU5fU0VTU0lPTjoKKyAgICAgICAgICAgIHJlc3BvbnNlID0gZG9PcGVuU2Vzc2lvbigpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTVRQX09QRVJBVElPTl9DTE9TRV9TRVNTSU9OOgorICAgICAgICAgICAgcmVzcG9uc2UgPSBkb0Nsb3NlU2Vzc2lvbigpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTVRQX09QRVJBVElPTl9HRVRfU1RPUkFHRV9JRFM6CisgICAgICAgICAgICByZXNwb25zZSA9IGRvR2V0U3RvcmFnZUlEcygpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICBjYXNlIE1UUF9PUEVSQVRJT05fR0VUX1NUT1JBR0VfSU5GTzoKKyAgICAgICAgICAgIHJlc3BvbnNlID0gZG9HZXRTdG9yYWdlSW5mbygpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTVRQX09QRVJBVElPTl9HRVRfT0JKRUNUX1BST1BTX1NVUFBPUlRFRDoKKyAgICAgICAgICAgIHJlc3BvbnNlID0gZG9HZXRPYmplY3RQcm9wc1N1cHBvcnRlZCgpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTVRQX09QRVJBVElPTl9HRVRfT0JKRUNUX0hBTkRMRVM6CisgICAgICAgICAgICByZXNwb25zZSA9IGRvR2V0T2JqZWN0SGFuZGxlcygpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTVRQX09QRVJBVElPTl9HRVRfTlVNX09CSkVDVFM6CisgICAgICAgICAgICByZXNwb25zZSA9IGRvR2V0TnVtT2JqZWN0cygpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTVRQX09QRVJBVElPTl9HRVRfT0JKRUNUX1JFRkVSRU5DRVM6CisgICAgICAgICAgICByZXNwb25zZSA9IGRvR2V0T2JqZWN0UmVmZXJlbmNlcygpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTVRQX09QRVJBVElPTl9TRVRfT0JKRUNUX1JFRkVSRU5DRVM6CisgICAgICAgICAgICByZXNwb25zZSA9IGRvU2V0T2JqZWN0UmVmZXJlbmNlcygpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTVRQX09QRVJBVElPTl9HRVRfT0JKRUNUX1BST1BfVkFMVUU6CisgICAgICAgICAgICByZXNwb25zZSA9IGRvR2V0T2JqZWN0UHJvcFZhbHVlKCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBNVFBfT1BFUkFUSU9OX1NFVF9PQkpFQ1RfUFJPUF9WQUxVRToKKyAgICAgICAgICAgIHJlc3BvbnNlID0gZG9TZXRPYmplY3RQcm9wVmFsdWUoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE1UUF9PUEVSQVRJT05fR0VUX0RFVklDRV9QUk9QX1ZBTFVFOgorICAgICAgICAgICAgcmVzcG9uc2UgPSBkb0dldERldmljZVByb3BWYWx1ZSgpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTVRQX09QRVJBVElPTl9TRVRfREVWSUNFX1BST1BfVkFMVUU6CisgICAgICAgICAgICByZXNwb25zZSA9IGRvU2V0RGV2aWNlUHJvcFZhbHVlKCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBNVFBfT1BFUkFUSU9OX1JFU0VUX0RFVklDRV9QUk9QX1ZBTFVFOgorICAgICAgICAgICAgcmVzcG9uc2UgPSBkb1Jlc2V0RGV2aWNlUHJvcFZhbHVlKCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBNVFBfT1BFUkFUSU9OX0dFVF9PQkpFQ1RfSU5GTzoKKyAgICAgICAgICAgIHJlc3BvbnNlID0gZG9HZXRPYmplY3RJbmZvKCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBNVFBfT1BFUkFUSU9OX0dFVF9PQkpFQ1Q6CisgICAgICAgICAgICByZXNwb25zZSA9IGRvR2V0T2JqZWN0KCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBNVFBfT1BFUkFUSU9OX1NFTkRfT0JKRUNUX0lORk86CisgICAgICAgICAgICByZXNwb25zZSA9IGRvU2VuZE9iamVjdEluZm8oKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE1UUF9PUEVSQVRJT05fU0VORF9PQkpFQ1Q6CisgICAgICAgICAgICByZXNwb25zZSA9IGRvU2VuZE9iamVjdCgpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTVRQX09QRVJBVElPTl9ERUxFVEVfT0JKRUNUOgorICAgICAgICAgICAgcmVzcG9uc2UgPSBkb0RlbGV0ZU9iamVjdCgpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTVRQX09QRVJBVElPTl9HRVRfT0JKRUNUX1BST1BfREVTQzoKKyAgICAgICAgICAgIHJlc3BvbnNlID0gZG9HZXRPYmplY3RQcm9wRGVzYygpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTVRQX09QRVJBVElPTl9HRVRfREVWSUNFX1BST1BfREVTQzoKKyAgICAgICAgICAgIHJlc3BvbnNlID0gZG9HZXREZXZpY2VQcm9wRGVzYygpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXNwb25zZSA9IE1UUF9SRVNQT05TRV9PUEVSQVRJT05fTk9UX1NVUFBPUlRFRDsKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGlmIChyZXNwb25zZSA9PSBNVFBfUkVTUE9OU0VfVFJBTlNBQ1RJT05fQ0FOQ0VMTEVEKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgbVJlc3BvbnNlLnNldFJlc3BvbnNlQ29kZShyZXNwb25zZSk7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK010cFJlc3BvbnNlQ29kZSBNdHBTZXJ2ZXI6OmRvR2V0RGV2aWNlSW5mbygpIHsKKyAgICBNdHBTdHJpbmdCdWZmZXIgICBzdHJpbmc7CisgICAgY2hhciBwcm9wX3ZhbHVlW1BST1BFUlRZX1ZBTFVFX01BWF07CisKKyAgICBNdHBPYmplY3RGb3JtYXRMaXN0KiBwbGF5YmFja0Zvcm1hdHMgPSBtRGF0YWJhc2UtPmdldFN1cHBvcnRlZFBsYXliYWNrRm9ybWF0cygpOworICAgIE10cE9iamVjdEZvcm1hdExpc3QqIGNhcHR1cmVGb3JtYXRzID0gbURhdGFiYXNlLT5nZXRTdXBwb3J0ZWRDYXB0dXJlRm9ybWF0cygpOworICAgIE10cERldmljZVByb3BlcnR5TGlzdCogZGV2aWNlUHJvcGVydGllcyA9IG1EYXRhYmFzZS0+Z2V0U3VwcG9ydGVkRGV2aWNlUHJvcGVydGllcygpOworCisgICAgLy8gZmlsbCBpbiBkZXZpY2UgaW5mbworICAgIG1EYXRhLnB1dFVJbnQxNihNVFBfU1RBTkRBUkRfVkVSU0lPTik7CisgICAgbURhdGEucHV0VUludDMyKDYpOyAvLyBNVFAgVmVuZG9yIEV4dGVuc2lvbiBJRAorICAgIG1EYXRhLnB1dFVJbnQxNihNVFBfU1RBTkRBUkRfVkVSU0lPTik7CisgICAgc3RyaW5nLnNldCgibWljcm9zb2Z0LmNvbTogMS4wOyIpOworICAgIG1EYXRhLnB1dFN0cmluZyhzdHJpbmcpOyAvLyBNVFAgRXh0ZW5zaW9ucworICAgIG1EYXRhLnB1dFVJbnQxNigwKTsgLy9GdW5jdGlvbmFsIE1vZGUKKyAgICBtRGF0YS5wdXRBVUludDE2KGtTdXBwb3J0ZWRPcGVyYXRpb25Db2RlcywKKyAgICAgICAgICAgIHNpemVvZihrU3VwcG9ydGVkT3BlcmF0aW9uQ29kZXMpIC8gc2l6ZW9mKHVpbnQxNl90KSk7IC8vIE9wZXJhdGlvbnMgU3VwcG9ydGVkCisgICAgbURhdGEucHV0QVVJbnQxNihrU3VwcG9ydGVkRXZlbnRDb2RlcywKKyAgICAgICAgICAgIHNpemVvZihrU3VwcG9ydGVkRXZlbnRDb2RlcykgLyBzaXplb2YodWludDE2X3QpKTsgLy8gRXZlbnRzIFN1cHBvcnRlZAorICAgIG1EYXRhLnB1dEFVSW50MTYoZGV2aWNlUHJvcGVydGllcyk7IC8vIERldmljZSBQcm9wZXJ0aWVzIFN1cHBvcnRlZAorICAgIG1EYXRhLnB1dEFVSW50MTYoY2FwdHVyZUZvcm1hdHMpOyAvLyBDYXB0dXJlIEZvcm1hdHMKKyAgICBtRGF0YS5wdXRBVUludDE2KHBsYXliYWNrRm9ybWF0cyk7ICAvLyBQbGF5YmFjayBGb3JtYXRzCisgICAgLy8gRklYTUUKKyAgICBzdHJpbmcuc2V0KCJHb29nbGUsIEluYy4iKTsKKyAgICBtRGF0YS5wdXRTdHJpbmcoc3RyaW5nKTsgICAvLyBNYW51ZmFjdHVyZXIKKworICAgIHByb3BlcnR5X2dldCgicm8ucHJvZHVjdC5tb2RlbCIsIHByb3BfdmFsdWUsICJNVFAgRGV2aWNlIik7CisgICAgc3RyaW5nLnNldChwcm9wX3ZhbHVlKTsKKyAgICBtRGF0YS5wdXRTdHJpbmcoc3RyaW5nKTsgICAvLyBNb2RlbAorICAgIHN0cmluZy5zZXQoIjEuMCIpOworICAgIG1EYXRhLnB1dFN0cmluZyhzdHJpbmcpOyAgIC8vIERldmljZSBWZXJzaW9uCisKKyAgICBwcm9wZXJ0eV9nZXQoInJvLnNlcmlhbG5vIiwgcHJvcF92YWx1ZSwgIj8/Pz8/Pz8/Iik7CisgICAgc3RyaW5nLnNldChwcm9wX3ZhbHVlKTsKKyAgICBtRGF0YS5wdXRTdHJpbmcoc3RyaW5nKTsgICAvLyBTZXJpYWwgTnVtYmVyCisKKyAgICBkZWxldGUgcGxheWJhY2tGb3JtYXRzOworICAgIGRlbGV0ZSBjYXB0dXJlRm9ybWF0czsKKyAgICBkZWxldGUgZGV2aWNlUHJvcGVydGllczsKKworICAgIHJldHVybiBNVFBfUkVTUE9OU0VfT0s7Cit9CisKK010cFJlc3BvbnNlQ29kZSBNdHBTZXJ2ZXI6OmRvT3BlblNlc3Npb24oKSB7CisgICAgaWYgKG1TZXNzaW9uT3BlbikgeworICAgICAgICBtUmVzcG9uc2Uuc2V0UGFyYW1ldGVyKDEsIG1TZXNzaW9uSUQpOworICAgICAgICByZXR1cm4gTVRQX1JFU1BPTlNFX1NFU1NJT05fQUxSRUFEWV9PUEVOOworICAgIH0KKyAgICBtU2Vzc2lvbklEID0gbVJlcXVlc3QuZ2V0UGFyYW1ldGVyKDEpOworICAgIG1TZXNzaW9uT3BlbiA9IHRydWU7CisKKyAgICBtRGF0YWJhc2UtPnNlc3Npb25TdGFydGVkKCk7CisKKyAgICByZXR1cm4gTVRQX1JFU1BPTlNFX09LOworfQorCitNdHBSZXNwb25zZUNvZGUgTXRwU2VydmVyOjpkb0Nsb3NlU2Vzc2lvbigpIHsKKyAgICBpZiAoIW1TZXNzaW9uT3BlbikKKyAgICAgICAgcmV0dXJuIE1UUF9SRVNQT05TRV9TRVNTSU9OX05PVF9PUEVOOworICAgIG1TZXNzaW9uSUQgPSAwOworICAgIG1TZXNzaW9uT3BlbiA9IGZhbHNlOworICAgIG1EYXRhYmFzZS0+c2Vzc2lvbkVuZGVkKCk7CisgICAgcmV0dXJuIE1UUF9SRVNQT05TRV9PSzsKK30KKworTXRwUmVzcG9uc2VDb2RlIE10cFNlcnZlcjo6ZG9HZXRTdG9yYWdlSURzKCkgeworICAgIGlmICghbVNlc3Npb25PcGVuKQorICAgICAgICByZXR1cm4gTVRQX1JFU1BPTlNFX1NFU1NJT05fTk9UX09QRU47CisKKyAgICBpbnQgY291bnQgPSBtU3RvcmFnZXMuc2l6ZSgpOworICAgIG1EYXRhLnB1dFVJbnQzMihjb3VudCk7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKQorICAgICAgICBtRGF0YS5wdXRVSW50MzIobVN0b3JhZ2VzW2ldLT5nZXRTdG9yYWdlSUQoKSk7CisKKyAgICByZXR1cm4gTVRQX1JFU1BPTlNFX09LOworfQorCitNdHBSZXNwb25zZUNvZGUgTXRwU2VydmVyOjpkb0dldFN0b3JhZ2VJbmZvKCkgeworICAgIE10cFN0cmluZ0J1ZmZlciAgIHN0cmluZzsKKworICAgIGlmICghbVNlc3Npb25PcGVuKQorICAgICAgICByZXR1cm4gTVRQX1JFU1BPTlNFX1NFU1NJT05fTk9UX09QRU47CisgICAgTXRwU3RvcmFnZUlEIGlkID0gbVJlcXVlc3QuZ2V0UGFyYW1ldGVyKDEpOworICAgIE10cFN0b3JhZ2UqIHN0b3JhZ2UgPSBnZXRTdG9yYWdlKGlkKTsKKyAgICBpZiAoIXN0b3JhZ2UpCisgICAgICAgIHJldHVybiBNVFBfUkVTUE9OU0VfSU5WQUxJRF9TVE9SQUdFX0lEOworCisgICAgbURhdGEucHV0VUludDE2KHN0b3JhZ2UtPmdldFR5cGUoKSk7CisgICAgbURhdGEucHV0VUludDE2KHN0b3JhZ2UtPmdldEZpbGVTeXN0ZW1UeXBlKCkpOworICAgIG1EYXRhLnB1dFVJbnQxNihzdG9yYWdlLT5nZXRBY2Nlc3NDYXBhYmlsaXR5KCkpOworICAgIG1EYXRhLnB1dFVJbnQ2NChzdG9yYWdlLT5nZXRNYXhDYXBhY2l0eSgpKTsKKyAgICBtRGF0YS5wdXRVSW50NjQoc3RvcmFnZS0+Z2V0RnJlZVNwYWNlKCkpOworICAgIG1EYXRhLnB1dFVJbnQzMigxMDI0KjEwMjQqMTAyNCk7IC8vIEZyZWUgU3BhY2UgaW4gT2JqZWN0cworICAgIHN0cmluZy5zZXQoc3RvcmFnZS0+Z2V0RGVzY3JpcHRpb24oKSk7CisgICAgbURhdGEucHV0U3RyaW5nKHN0cmluZyk7CisgICAgbURhdGEucHV0RW1wdHlTdHJpbmcoKTsgICAvLyBWb2x1bWUgSWRlbnRpZmllcgorCisgICAgcmV0dXJuIE1UUF9SRVNQT05TRV9PSzsKK30KKworTXRwUmVzcG9uc2VDb2RlIE10cFNlcnZlcjo6ZG9HZXRPYmplY3RQcm9wc1N1cHBvcnRlZCgpIHsKKyAgICBpZiAoIW1TZXNzaW9uT3BlbikKKyAgICAgICAgcmV0dXJuIE1UUF9SRVNQT05TRV9TRVNTSU9OX05PVF9PUEVOOworICAgIE10cE9iamVjdEZvcm1hdCBmb3JtYXQgPSBtUmVxdWVzdC5nZXRQYXJhbWV0ZXIoMSk7CisgICAgTXRwRGV2aWNlUHJvcGVydHlMaXN0KiBwcm9wZXJ0aWVzID0gbURhdGFiYXNlLT5nZXRTdXBwb3J0ZWRPYmplY3RQcm9wZXJ0aWVzKGZvcm1hdCk7CisgICAgbURhdGEucHV0QVVJbnQxNihwcm9wZXJ0aWVzKTsKKyAgICBkZWxldGUgcHJvcGVydGllczsKKyAgICByZXR1cm4gTVRQX1JFU1BPTlNFX09LOworfQorCitNdHBSZXNwb25zZUNvZGUgTXRwU2VydmVyOjpkb0dldE9iamVjdEhhbmRsZXMoKSB7CisgICAgaWYgKCFtU2Vzc2lvbk9wZW4pCisgICAgICAgIHJldHVybiBNVFBfUkVTUE9OU0VfU0VTU0lPTl9OT1RfT1BFTjsKKyAgICBNdHBTdG9yYWdlSUQgc3RvcmFnZUlEID0gbVJlcXVlc3QuZ2V0UGFyYW1ldGVyKDEpOyAgICAgIC8vIDB4RkZGRkZGRkYgZm9yIGFsbCBzdG9yYWdlCisgICAgTXRwT2JqZWN0Rm9ybWF0IGZvcm1hdCA9IG1SZXF1ZXN0LmdldFBhcmFtZXRlcigyKTsgICAgICAvLyAwIGZvciBhbGwgZm9ybWF0cworICAgIE10cE9iamVjdEhhbmRsZSBwYXJlbnQgPSBtUmVxdWVzdC5nZXRQYXJhbWV0ZXIoMyk7ICAgICAgLy8gMHhGRkZGRkZGRiBmb3Igb2JqZWN0cyB3aXRoIG5vIHBhcmVudAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMHgwMDAwMDAwMCBmb3IgYWxsIG9iamVjdHM/CisgICAgaWYgKHBhcmVudCA9PSAweEZGRkZGRkZGKQorICAgICAgICBwYXJlbnQgPSAwOworCisgICAgTXRwT2JqZWN0SGFuZGxlTGlzdCogaGFuZGxlcyA9IG1EYXRhYmFzZS0+Z2V0T2JqZWN0TGlzdChzdG9yYWdlSUQsIGZvcm1hdCwgcGFyZW50KTsKKyAgICBtRGF0YS5wdXRBVUludDMyKGhhbmRsZXMpOworICAgIGRlbGV0ZSBoYW5kbGVzOworICAgIHJldHVybiBNVFBfUkVTUE9OU0VfT0s7Cit9CisKK010cFJlc3BvbnNlQ29kZSBNdHBTZXJ2ZXI6OmRvR2V0TnVtT2JqZWN0cygpIHsKKyAgICBpZiAoIW1TZXNzaW9uT3BlbikKKyAgICAgICAgcmV0dXJuIE1UUF9SRVNQT05TRV9TRVNTSU9OX05PVF9PUEVOOworICAgIE10cFN0b3JhZ2VJRCBzdG9yYWdlSUQgPSBtUmVxdWVzdC5nZXRQYXJhbWV0ZXIoMSk7ICAgICAgLy8gMHhGRkZGRkZGRiBmb3IgYWxsIHN0b3JhZ2UKKyAgICBNdHBPYmplY3RGb3JtYXQgZm9ybWF0ID0gbVJlcXVlc3QuZ2V0UGFyYW1ldGVyKDIpOyAgICAgIC8vIDAgZm9yIGFsbCBmb3JtYXRzCisgICAgTXRwT2JqZWN0SGFuZGxlIHBhcmVudCA9IG1SZXF1ZXN0LmdldFBhcmFtZXRlcigzKTsgICAgICAvLyAweEZGRkZGRkZGIGZvciBvYmplY3RzIHdpdGggbm8gcGFyZW50CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAweDAwMDAwMDAwIGZvciBhbGwgb2JqZWN0cz8KKyAgICBpZiAocGFyZW50ID09IDB4RkZGRkZGRkYpCisgICAgICAgIHBhcmVudCA9IDA7CisKKyAgICBpbnQgY291bnQgPSBtRGF0YWJhc2UtPmdldE51bU9iamVjdHMoc3RvcmFnZUlELCBmb3JtYXQsIHBhcmVudCk7CisgICAgaWYgKGNvdW50ID49IDApIHsKKyAgICAgICAgbVJlc3BvbnNlLnNldFBhcmFtZXRlcigxLCBjb3VudCk7CisgICAgICAgIHJldHVybiBNVFBfUkVTUE9OU0VfT0s7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbVJlc3BvbnNlLnNldFBhcmFtZXRlcigxLCAwKTsKKyAgICAgICAgcmV0dXJuIE1UUF9SRVNQT05TRV9JTlZBTElEX09CSkVDVF9IQU5ETEU7CisgICAgfQorfQorCitNdHBSZXNwb25zZUNvZGUgTXRwU2VydmVyOjpkb0dldE9iamVjdFJlZmVyZW5jZXMoKSB7CisgICAgaWYgKCFtU2Vzc2lvbk9wZW4pCisgICAgICAgIHJldHVybiBNVFBfUkVTUE9OU0VfU0VTU0lPTl9OT1RfT1BFTjsKKyAgICBNdHBTdG9yYWdlSUQgaGFuZGxlID0gbVJlcXVlc3QuZ2V0UGFyYW1ldGVyKDEpOworCisgICAgLy8gRklYTUUgLSBjaGVjayBmb3IgaW52YWxpZCBvYmplY3QgaGFuZGxlCisgICAgTXRwT2JqZWN0SGFuZGxlTGlzdCogaGFuZGxlcyA9IG1EYXRhYmFzZS0+Z2V0T2JqZWN0UmVmZXJlbmNlcyhoYW5kbGUpOworICAgIGlmIChoYW5kbGVzKSB7CisgICAgICAgIG1EYXRhLnB1dEFVSW50MzIoaGFuZGxlcyk7CisgICAgICAgIGRlbGV0ZSBoYW5kbGVzOworICAgIH0gZWxzZSB7CisgICAgICAgIG1EYXRhLnB1dEVtcHR5QXJyYXkoKTsKKyAgICB9CisgICAgcmV0dXJuIE1UUF9SRVNQT05TRV9PSzsKK30KKworTXRwUmVzcG9uc2VDb2RlIE10cFNlcnZlcjo6ZG9TZXRPYmplY3RSZWZlcmVuY2VzKCkgeworICAgIGlmICghbVNlc3Npb25PcGVuKQorICAgICAgICByZXR1cm4gTVRQX1JFU1BPTlNFX1NFU1NJT05fTk9UX09QRU47CisgICAgTXRwU3RvcmFnZUlEIGhhbmRsZSA9IG1SZXF1ZXN0LmdldFBhcmFtZXRlcigxKTsKKyAgICBNdHBPYmplY3RIYW5kbGVMaXN0KiByZWZlcmVuY2VzID0gbURhdGEuZ2V0QVVJbnQzMigpOworICAgIE10cFJlc3BvbnNlQ29kZSByZXN1bHQgPSBtRGF0YWJhc2UtPnNldE9iamVjdFJlZmVyZW5jZXMoaGFuZGxlLCByZWZlcmVuY2VzKTsKKyAgICBkZWxldGUgcmVmZXJlbmNlczsKKyAgICByZXR1cm4gcmVzdWx0OworfQorCitNdHBSZXNwb25zZUNvZGUgTXRwU2VydmVyOjpkb0dldE9iamVjdFByb3BWYWx1ZSgpIHsKKyAgICBNdHBPYmplY3RIYW5kbGUgaGFuZGxlID0gbVJlcXVlc3QuZ2V0UGFyYW1ldGVyKDEpOworICAgIE10cE9iamVjdFByb3BlcnR5IHByb3BlcnR5ID0gbVJlcXVlc3QuZ2V0UGFyYW1ldGVyKDIpOworICAgIExPR0QoIkdldE9iamVjdFByb3BWYWx1ZSAlZCAlc1xuIiwgaGFuZGxlLAorICAgICAgICAgICAgTXRwRGVidWc6OmdldE9iamVjdFByb3BDb2RlTmFtZShwcm9wZXJ0eSkpOworCisgICAgcmV0dXJuIG1EYXRhYmFzZS0+Z2V0T2JqZWN0UHJvcGVydHlWYWx1ZShoYW5kbGUsIHByb3BlcnR5LCBtRGF0YSk7Cit9CisKK010cFJlc3BvbnNlQ29kZSBNdHBTZXJ2ZXI6OmRvU2V0T2JqZWN0UHJvcFZhbHVlKCkgeworICAgIE10cE9iamVjdEhhbmRsZSBoYW5kbGUgPSBtUmVxdWVzdC5nZXRQYXJhbWV0ZXIoMSk7CisgICAgTXRwT2JqZWN0UHJvcGVydHkgcHJvcGVydHkgPSBtUmVxdWVzdC5nZXRQYXJhbWV0ZXIoMik7CisgICAgTE9HRCgiU2V0T2JqZWN0UHJvcFZhbHVlICVkICVzXG4iLCBoYW5kbGUsCisgICAgICAgICAgICBNdHBEZWJ1Zzo6Z2V0T2JqZWN0UHJvcENvZGVOYW1lKHByb3BlcnR5KSk7CisKKyAgICByZXR1cm4gbURhdGFiYXNlLT5zZXRPYmplY3RQcm9wZXJ0eVZhbHVlKGhhbmRsZSwgcHJvcGVydHksIG1EYXRhKTsKK30KKworTXRwUmVzcG9uc2VDb2RlIE10cFNlcnZlcjo6ZG9HZXREZXZpY2VQcm9wVmFsdWUoKSB7CisgICAgTXRwRGV2aWNlUHJvcGVydHkgcHJvcGVydHkgPSBtUmVxdWVzdC5nZXRQYXJhbWV0ZXIoMSk7CisgICAgTE9HRCgiR2V0RGV2aWNlUHJvcFZhbHVlICVzXG4iLAorICAgICAgICAgICAgTXRwRGVidWc6OmdldERldmljZVByb3BDb2RlTmFtZShwcm9wZXJ0eSkpOworCisgICAgcmV0dXJuIG1EYXRhYmFzZS0+Z2V0RGV2aWNlUHJvcGVydHlWYWx1ZShwcm9wZXJ0eSwgbURhdGEpOworfQorCitNdHBSZXNwb25zZUNvZGUgTXRwU2VydmVyOjpkb1NldERldmljZVByb3BWYWx1ZSgpIHsKKyAgICBNdHBEZXZpY2VQcm9wZXJ0eSBwcm9wZXJ0eSA9IG1SZXF1ZXN0LmdldFBhcmFtZXRlcigxKTsKKyAgICBMT0dEKCJTZXREZXZpY2VQcm9wVmFsdWUgJXNcbiIsCisgICAgICAgICAgICBNdHBEZWJ1Zzo6Z2V0RGV2aWNlUHJvcENvZGVOYW1lKHByb3BlcnR5KSk7CisKKyAgICByZXR1cm4gbURhdGFiYXNlLT5zZXREZXZpY2VQcm9wZXJ0eVZhbHVlKHByb3BlcnR5LCBtRGF0YSk7Cit9CisKK010cFJlc3BvbnNlQ29kZSBNdHBTZXJ2ZXI6OmRvUmVzZXREZXZpY2VQcm9wVmFsdWUoKSB7CisgICAgTXRwRGV2aWNlUHJvcGVydHkgcHJvcGVydHkgPSBtUmVxdWVzdC5nZXRQYXJhbWV0ZXIoMSk7CisgICAgTE9HRCgiUmVzZXREZXZpY2VQcm9wVmFsdWUgJXNcbiIsCisgICAgICAgICAgICBNdHBEZWJ1Zzo6Z2V0RGV2aWNlUHJvcENvZGVOYW1lKHByb3BlcnR5KSk7CisKKyAgICByZXR1cm4gbURhdGFiYXNlLT5yZXNldERldmljZVByb3BlcnR5KHByb3BlcnR5KTsKK30KKworTXRwUmVzcG9uc2VDb2RlIE10cFNlcnZlcjo6ZG9HZXRPYmplY3RJbmZvKCkgeworICAgIE10cE9iamVjdEhhbmRsZSBoYW5kbGUgPSBtUmVxdWVzdC5nZXRQYXJhbWV0ZXIoMSk7CisgICAgcmV0dXJuIG1EYXRhYmFzZS0+Z2V0T2JqZWN0SW5mbyhoYW5kbGUsIG1EYXRhKTsKK30KKworTXRwUmVzcG9uc2VDb2RlIE10cFNlcnZlcjo6ZG9HZXRPYmplY3QoKSB7CisgICAgTXRwT2JqZWN0SGFuZGxlIGhhbmRsZSA9IG1SZXF1ZXN0LmdldFBhcmFtZXRlcigxKTsKKyAgICBNdHBTdHJpbmcgcGF0aEJ1ZjsKKyAgICBpbnQ2NF90IGZpbGVMZW5ndGg7CisgICAgaW50IHJlc3VsdCA9IG1EYXRhYmFzZS0+Z2V0T2JqZWN0RmlsZVBhdGgoaGFuZGxlLCBwYXRoQnVmLCBmaWxlTGVuZ3RoKTsKKyAgICBpZiAocmVzdWx0ICE9IE1UUF9SRVNQT05TRV9PSykKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKworICAgIGNvbnN0IGNoYXIqIGZpbGVQYXRoID0gKGNvbnN0IGNoYXIgKilwYXRoQnVmOworICAgIG10cF9maWxlX3JhbmdlICBtZnI7CisgICAgbWZyLmZkID0gb3BlbihmaWxlUGF0aCwgT19SRE9OTFkpOworICAgIGlmIChtZnIuZmQgPCAwKSB7CisgICAgICAgIHJldHVybiBNVFBfUkVTUE9OU0VfR0VORVJBTF9FUlJPUjsKKyAgICB9CisgICAgbWZyLm9mZnNldCA9IDA7CisgICAgbWZyLmxlbmd0aCA9IGZpbGVMZW5ndGg7CisKKyAgICAvLyBzZW5kIGRhdGEgaGVhZGVyCisgICAgbURhdGEuc2V0T3BlcmF0aW9uQ29kZShtUmVxdWVzdC5nZXRPcGVyYXRpb25Db2RlKCkpOworICAgIG1EYXRhLnNldFRyYW5zYWN0aW9uSUQobVJlcXVlc3QuZ2V0VHJhbnNhY3Rpb25JRCgpKTsKKyAgICBtRGF0YS53cml0ZURhdGFIZWFkZXIobUZELCBmaWxlTGVuZ3RoKTsKKworICAgIC8vIHRoZW4gdHJhbnNmZXIgdGhlIGZpbGUKKyAgICBpbnQgcmV0ID0gaW9jdGwobUZELCBNVFBfU0VORF9GSUxFLCAodW5zaWduZWQgbG9uZykmbWZyKTsKKyAgICBjbG9zZShtZnIuZmQpOworICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgIGlmIChlcnJubyA9PSBFQ0FOQ0VMRUQpCisgICAgICAgICAgICByZXR1cm4gTVRQX1JFU1BPTlNFX1RSQU5TQUNUSU9OX0NBTkNFTExFRDsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmV0dXJuIE1UUF9SRVNQT05TRV9HRU5FUkFMX0VSUk9SOworICAgIH0KKyAgICByZXR1cm4gTVRQX1JFU1BPTlNFX09LOworfQorCitNdHBSZXNwb25zZUNvZGUgTXRwU2VydmVyOjpkb1NlbmRPYmplY3RJbmZvKCkgeworICAgIE10cFN0cmluZyBwYXRoOworICAgIE10cFN0b3JhZ2VJRCBzdG9yYWdlSUQgPSBtUmVxdWVzdC5nZXRQYXJhbWV0ZXIoMSk7CisgICAgTXRwU3RvcmFnZSogc3RvcmFnZSA9IGdldFN0b3JhZ2Uoc3RvcmFnZUlEKTsKKyAgICBNdHBPYmplY3RIYW5kbGUgcGFyZW50ID0gbVJlcXVlc3QuZ2V0UGFyYW1ldGVyKDIpOworICAgIGlmICghc3RvcmFnZSkKKyAgICAgICAgcmV0dXJuIE1UUF9SRVNQT05TRV9JTlZBTElEX1NUT1JBR0VfSUQ7CisKKyAgICAvLyBzcGVjaWFsIGNhc2UgdGhlIHJvb3QKKyAgICBpZiAocGFyZW50ID09IE1UUF9QQVJFTlRfUk9PVCkgeworICAgICAgICBwYXRoID0gc3RvcmFnZS0+Z2V0UGF0aCgpOworICAgICAgICBwYXJlbnQgPSAwOworICAgIH0gZWxzZSB7CisgICAgICAgIGludDY0X3QgZHVtbXk7CisgICAgICAgIGludCByZXN1bHQgPSBtRGF0YWJhc2UtPmdldE9iamVjdEZpbGVQYXRoKHBhcmVudCwgcGF0aCwgZHVtbXkpOworICAgICAgICBpZiAocmVzdWx0ICE9IE1UUF9SRVNQT05TRV9PSykKKyAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgLy8gcmVhZCBvbmx5IHRoZSBmaWVsZHMgd2UgbmVlZAorICAgIG1EYXRhLmdldFVJbnQzMigpOyAgLy8gc3RvcmFnZSBJRAorICAgIE10cE9iamVjdEZvcm1hdCBmb3JtYXQgPSBtRGF0YS5nZXRVSW50MTYoKTsKKyAgICBtRGF0YS5nZXRVSW50MTYoKTsgIC8vIHByb3RlY3Rpb24gc3RhdHVzCisgICAgbVNlbmRPYmplY3RGaWxlU2l6ZSA9IG1EYXRhLmdldFVJbnQzMigpOworICAgIG1EYXRhLmdldFVJbnQxNigpOyAgLy8gdGh1bWIgZm9ybWF0CisgICAgbURhdGEuZ2V0VUludDMyKCk7ICAvLyB0aHVtYiBjb21wcmVzc2VkIHNpemUKKyAgICBtRGF0YS5nZXRVSW50MzIoKTsgIC8vIHRodW1iIHBpeCB3aWR0aAorICAgIG1EYXRhLmdldFVJbnQzMigpOyAgLy8gdGh1bWIgcGl4IGhlaWdodAorICAgIG1EYXRhLmdldFVJbnQzMigpOyAgLy8gaW1hZ2UgcGl4IHdpZHRoCisgICAgbURhdGEuZ2V0VUludDMyKCk7ICAvLyBpbWFnZSBwaXggaGVpZ2h0CisgICAgbURhdGEuZ2V0VUludDMyKCk7ICAvLyBpbWFnZSBiaXQgZGVwdGgKKyAgICBtRGF0YS5nZXRVSW50MzIoKTsgIC8vIHBhcmVudAorICAgIHVpbnQxNl90IGFzc29jaWF0aW9uVHlwZSA9IG1EYXRhLmdldFVJbnQxNigpOworICAgIHVpbnQzMl90IGFzc29jaWF0aW9uRGVzYyA9IG1EYXRhLmdldFVJbnQzMigpOyAgIC8vIGFzc29jaWF0aW9uIGRlc2MKKyAgICBtRGF0YS5nZXRVSW50MzIoKTsgIC8vIHNlcXVlbmNlIG51bWJlcgorICAgIE10cFN0cmluZ0J1ZmZlciBuYW1lLCBjcmVhdGVkLCBtb2RpZmllZDsKKyAgICBtRGF0YS5nZXRTdHJpbmcobmFtZSk7ICAgIC8vIGZpbGUgbmFtZQorICAgIG1EYXRhLmdldFN0cmluZyhjcmVhdGVkKTsgICAgICAvLyBkYXRlIGNyZWF0ZWQKKyAgICBtRGF0YS5nZXRTdHJpbmcobW9kaWZpZWQpOyAgICAgLy8gZGF0ZSBtb2RpZmllZAorICAgIC8vIGtleXdvcmRzIGZvbGxvdworCisgICAgdGltZV90IG1vZGlmaWVkVGltZTsKKyAgICBpZiAoIXBhcnNlRGF0ZVRpbWUobW9kaWZpZWQsIG1vZGlmaWVkVGltZSkpCisgICAgICAgIG1vZGlmaWVkVGltZSA9IDA7CisKKyAgICBpZiAocGF0aFtwYXRoLnNpemUoKSAtIDFdICE9ICcvJykKKyAgICAgICAgcGF0aCArPSAiLyI7CisgICAgcGF0aCArPSAoY29uc3QgY2hhciAqKW5hbWU7CisKKyAgICBNdHBPYmplY3RIYW5kbGUgaGFuZGxlID0gbURhdGFiYXNlLT5iZWdpblNlbmRPYmplY3QoKGNvbnN0IGNoYXIqKXBhdGgsCisgICAgICAgICAgICBmb3JtYXQsIHBhcmVudCwgc3RvcmFnZUlELCBtU2VuZE9iamVjdEZpbGVTaXplLCBtb2RpZmllZFRpbWUpOworICAgIGlmIChoYW5kbGUgPT0ga0ludmFsaWRPYmplY3RIYW5kbGUpIHsKKyAgICAgICAgcmV0dXJuIE1UUF9SRVNQT05TRV9HRU5FUkFMX0VSUk9SOworICAgIH0KKworICBpZiAoZm9ybWF0ID09IE1UUF9GT1JNQVRfQVNTT0NJQVRJT04pIHsKKyAgICAgICAgbW9kZV90IG1hc2sgPSB1bWFzaygwKTsKKyAgICAgICAgaW50IHJldCA9IG1rZGlyKChjb25zdCBjaGFyICopcGF0aCwgbURpcmVjdG9yeVBlcm1pc3Npb24pOworICAgICAgICB1bWFzayhtYXNrKTsKKyAgICAgICAgaWYgKHJldCAmJiByZXQgIT0gLUVFWElTVCkKKyAgICAgICAgICAgIHJldHVybiBNVFBfUkVTUE9OU0VfR0VORVJBTF9FUlJPUjsKKyAgICAgICAgY2hvd24oKGNvbnN0IGNoYXIgKilwYXRoLCBnZXR1aWQoKSwgbUZpbGVHcm91cCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbVNlbmRPYmplY3RGaWxlUGF0aCA9IHBhdGg7CisgICAgICAgIC8vIHNhdmUgdGhlIGhhbmRsZSBmb3IgdGhlIFNlbmRPYmplY3QgY2FsbCwgd2hpY2ggc2hvdWxkIGZvbGxvdworICAgICAgICBtU2VuZE9iamVjdEhhbmRsZSA9IGhhbmRsZTsKKyAgICAgICAgbVNlbmRPYmplY3RGb3JtYXQgPSBmb3JtYXQ7CisgICAgfQorCisgICAgbVJlc3BvbnNlLnNldFBhcmFtZXRlcigxLCBzdG9yYWdlSUQpOworICAgIG1SZXNwb25zZS5zZXRQYXJhbWV0ZXIoMiwgcGFyZW50KTsKKyAgICBtUmVzcG9uc2Uuc2V0UGFyYW1ldGVyKDMsIGhhbmRsZSk7CisKKyAgICByZXR1cm4gTVRQX1JFU1BPTlNFX09LOworfQorCitNdHBSZXNwb25zZUNvZGUgTXRwU2VydmVyOjpkb1NlbmRPYmplY3QoKSB7CisgICAgTXRwUmVzcG9uc2VDb2RlIHJlc3VsdCA9IE1UUF9SRVNQT05TRV9PSzsKKyAgICBtb2RlX3QgbWFzazsKKyAgICBpbnQgcmV0OworCisgICAgaWYgKG1TZW5kT2JqZWN0SGFuZGxlID09IGtJbnZhbGlkT2JqZWN0SGFuZGxlKSB7CisgICAgICAgIExPR0UoIkV4cGVjdGVkIFNlbmRPYmplY3RJbmZvIGJlZm9yZSBTZW5kT2JqZWN0Iik7CisgICAgICAgIHJlc3VsdCA9IE1UUF9SRVNQT05TRV9OT19WQUxJRF9PQkpFQ1RfSU5GTzsKKyAgICAgICAgZ290byBkb25lOworICAgIH0KKworICAgIC8vIHJlYWQgdGhlIGhlYWRlcgorICAgIHJldCA9IG1EYXRhLnJlYWREYXRhSGVhZGVyKG1GRCk7CisgICAgLy8gRklYTUUgLSBjaGVjayBmb3IgZXJyb3JzIGhlcmUuCisKKyAgICAvLyByZXNldCBzbyB3ZSBkb24ndCBhdHRlbXB0IHRvIHNlbmQgdGhpcyBiYWNrCisgICAgbURhdGEucmVzZXQoKTsKKworICAgIG10cF9maWxlX3JhbmdlICBtZnI7CisgICAgbWZyLmZkID0gb3BlbihtU2VuZE9iamVjdEZpbGVQYXRoLCBPX1JEV1IgfCBPX0NSRUFUIHwgT19UUlVOQyk7CisgICAgaWYgKG1mci5mZCA8IDApIHsKKyAgICAgICAgcmVzdWx0ID0gTVRQX1JFU1BPTlNFX0dFTkVSQUxfRVJST1I7CisgICAgICAgIGdvdG8gZG9uZTsKKyAgICB9CisgICAgZmNob3duKG1mci5mZCwgZ2V0dWlkKCksIG1GaWxlR3JvdXApOworICAgIC8vIHNldCBwZXJtaXNzaW9ucworICAgIG1hc2sgPSB1bWFzaygwKTsKKyAgICBmY2htb2QobWZyLmZkLCBtRmlsZVBlcm1pc3Npb24pOworICAgIHVtYXNrKG1hc2spOworCisgICAgbWZyLm9mZnNldCA9IDA7CisgICAgbWZyLmxlbmd0aCA9IG1TZW5kT2JqZWN0RmlsZVNpemU7CisKKyAgICAvLyB0cmFuc2ZlciB0aGUgZmlsZQorICAgIHJldCA9IGlvY3RsKG1GRCwgTVRQX1JFQ0VJVkVfRklMRSwgKHVuc2lnbmVkIGxvbmcpJm1mcik7CisgICAgY2xvc2UobWZyLmZkKTsKKworICAgIExPR1YoIk1UUF9SRUNFSVZFX0ZJTEUgcmV0dXJuZWQgJWQiLCByZXQpOworCisgICAgaWYgKHJldCA8IDApIHsKKyAgICAgICAgdW5saW5rKG1TZW5kT2JqZWN0RmlsZVBhdGgpOworICAgICAgICBpZiAoZXJybm8gPT0gRUNBTkNFTEVEKQorICAgICAgICAgICAgcmVzdWx0ID0gTVRQX1JFU1BPTlNFX1RSQU5TQUNUSU9OX0NBTkNFTExFRDsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmVzdWx0ID0gTVRQX1JFU1BPTlNFX0dFTkVSQUxfRVJST1I7CisgICAgfQorCitkb25lOgorICAgIG1EYXRhYmFzZS0+ZW5kU2VuZE9iamVjdChtU2VuZE9iamVjdEZpbGVQYXRoLCBtU2VuZE9iamVjdEhhbmRsZSwgbVNlbmRPYmplY3RGb3JtYXQsCisgICAgICAgICAgICByZXN1bHQgPT0gTVRQX1JFU1BPTlNFX09LKTsKKyAgICBtU2VuZE9iamVjdEhhbmRsZSA9IGtJbnZhbGlkT2JqZWN0SGFuZGxlOworICAgIG1TZW5kT2JqZWN0Rm9ybWF0ID0gMDsKKyAgICByZXR1cm4gcmVzdWx0OworfQorCitzdGF0aWMgdm9pZCBkZWxldGVSZWN1cnNpdmUoY29uc3QgY2hhciogcGF0aCkgeworICAgIGNoYXIgcGF0aGJ1ZltQQVRIX01BWF07CisgICAgaW50IHBhdGhMZW5ndGggPSBzdHJsZW4ocGF0aCk7CisgICAgaWYgKHBhdGhMZW5ndGggPj0gc2l6ZW9mKHBhdGhidWYpIC0gMSkgeworICAgICAgICBMT0dFKCJwYXRoIHRvbyBsb25nOiAlc1xuIiwgcGF0aCk7CisgICAgfQorICAgIHN0cmNweShwYXRoYnVmLCBwYXRoKTsKKyAgICBpZiAocGF0aGJ1ZltwYXRoTGVuZ3RoIC0gMV0gIT0gJy8nKSB7CisgICAgICAgIHBhdGhidWZbcGF0aExlbmd0aCsrXSA9ICcvJzsKKyAgICB9CisgICAgY2hhciogZmlsZVNwb3QgPSBwYXRoYnVmICsgcGF0aExlbmd0aDsKKyAgICBpbnQgcGF0aFJlbWFpbmluZyA9IHNpemVvZihwYXRoYnVmKSAtIHBhdGhMZW5ndGggLSAxOworCisgICAgRElSKiBkaXIgPSBvcGVuZGlyKHBhdGgpOworICAgIGlmICghZGlyKSB7CisgICAgICAgIExPR0UoIm9wZW5kaXIgJXMgZmFpbGVkOiAlcyIsIHBhdGgsIHN0cmVycm9yKGVycm5vKSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBzdHJ1Y3QgZGlyZW50KiBlbnRyeTsKKyAgICB3aGlsZSAoKGVudHJ5ID0gcmVhZGRpcihkaXIpKSkgeworICAgICAgICBjb25zdCBjaGFyKiBuYW1lID0gZW50cnktPmRfbmFtZTsKKworICAgICAgICAvLyBpZ25vcmUgIi4iIGFuZCAiLi4iCisgICAgICAgIGlmIChuYW1lWzBdID09ICcuJyAmJiAobmFtZVsxXSA9PSAwIHx8IChuYW1lWzFdID09ICcuJyAmJiBuYW1lWzJdID09IDApKSkgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICBpbnQgbmFtZUxlbmd0aCA9IHN0cmxlbihuYW1lKTsKKyAgICAgICAgaWYgKG5hbWVMZW5ndGggPiBwYXRoUmVtYWluaW5nKSB7CisgICAgICAgICAgICBMT0dFKCJwYXRoICVzLyVzIHRvbyBsb25nXG4iLCBwYXRoLCBuYW1lKTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIHN0cmNweShmaWxlU3BvdCwgbmFtZSk7CisKKyAgICAgICAgaW50IHR5cGUgPSBlbnRyeS0+ZF90eXBlOworICAgICAgICBpZiAoZW50cnktPmRfdHlwZSA9PSBEVF9ESVIpIHsKKyAgICAgICAgICAgIGRlbGV0ZVJlY3Vyc2l2ZShwYXRoYnVmKTsKKyAgICAgICAgICAgIHJtZGlyKHBhdGhidWYpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdW5saW5rKHBhdGhidWYpOworICAgICAgICB9CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBkZWxldGVQYXRoKGNvbnN0IGNoYXIqIHBhdGgpIHsKKyAgICBzdHJ1Y3Qgc3RhdCBzdGF0YnVmOworICAgIGlmIChzdGF0KHBhdGgsICZzdGF0YnVmKSA9PSAwKSB7CisgICAgICAgIGlmIChTX0lTRElSKHN0YXRidWYuc3RfbW9kZSkpIHsKKyAgICAgICAgICAgIGRlbGV0ZVJlY3Vyc2l2ZShwYXRoKTsKKyAgICAgICAgICAgIHJtZGlyKHBhdGgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdW5saW5rKHBhdGgpOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgTE9HRSgiZGVsZXRlUGF0aCBzdGF0IGZhaWxlZCBmb3IgJXM6ICVzIiwgcGF0aCwgc3RyZXJyb3IoZXJybm8pKTsKKyAgICB9Cit9CisKK010cFJlc3BvbnNlQ29kZSBNdHBTZXJ2ZXI6OmRvRGVsZXRlT2JqZWN0KCkgeworICAgIE10cE9iamVjdEhhbmRsZSBoYW5kbGUgPSBtUmVxdWVzdC5nZXRQYXJhbWV0ZXIoMSk7CisgICAgTXRwT2JqZWN0Rm9ybWF0IGZvcm1hdCA9IG1SZXF1ZXN0LmdldFBhcmFtZXRlcigyKTsKKyAgICAvLyBGSVhNRSAtIHN1cHBvcnQgZGVsZXRpbmcgYWxsIG9iamVjdHMgaWYgaGFuZGxlIGlzIDB4RkZGRkZGRkYKKyAgICAvLyBGSVhNRSAtIGltcGxlbWVudCBkZWxldGluZyBvYmplY3RzIGJ5IGZvcm1hdAorCisgICAgTXRwU3RyaW5nIGZpbGVQYXRoOworICAgIGludDY0X3QgZmlsZUxlbmd0aDsKKyAgICBpbnQgcmVzdWx0ID0gbURhdGFiYXNlLT5nZXRPYmplY3RGaWxlUGF0aChoYW5kbGUsIGZpbGVQYXRoLCBmaWxlTGVuZ3RoKTsKKyAgICBpZiAocmVzdWx0ID09IE1UUF9SRVNQT05TRV9PSykgeworICAgICAgICBMT0dWKCJkZWxldGluZyAlcyIsIChjb25zdCBjaGFyICopZmlsZVBhdGgpOworICAgICAgICBkZWxldGVQYXRoKChjb25zdCBjaGFyICopZmlsZVBhdGgpOworICAgICAgICByZXR1cm4gbURhdGFiYXNlLT5kZWxldGVGaWxlKGhhbmRsZSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9Cit9CisKK010cFJlc3BvbnNlQ29kZSBNdHBTZXJ2ZXI6OmRvR2V0T2JqZWN0UHJvcERlc2MoKSB7CisgICAgTXRwT2JqZWN0UHJvcGVydHkgcHJvcENvZGUgPSBtUmVxdWVzdC5nZXRQYXJhbWV0ZXIoMSk7CisgICAgTXRwT2JqZWN0Rm9ybWF0IGZvcm1hdCA9IG1SZXF1ZXN0LmdldFBhcmFtZXRlcigyKTsKKyAgICBMT0dEKCJHZXRPYmplY3RQcm9wRGVzYyAlcyAlc1xuIiwgTXRwRGVidWc6OmdldE9iamVjdFByb3BDb2RlTmFtZShwcm9wQ29kZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXRwRGVidWc6OmdldEZvcm1hdENvZGVOYW1lKGZvcm1hdCkpOworICAgIE10cFByb3BlcnR5KiBwcm9wZXJ0eSA9IG1EYXRhYmFzZS0+Z2V0T2JqZWN0UHJvcGVydHlEZXNjKHByb3BDb2RlLCBmb3JtYXQpOworICAgIGlmICghcHJvcGVydHkpCisgICAgICAgIHJldHVybiBNVFBfUkVTUE9OU0VfT0JKRUNUX1BST1BfTk9UX1NVUFBPUlRFRDsKKyAgICBwcm9wZXJ0eS0+d3JpdGUobURhdGEpOworICAgIGRlbGV0ZSBwcm9wZXJ0eTsKKyAgICByZXR1cm4gTVRQX1JFU1BPTlNFX09LOworfQorCitNdHBSZXNwb25zZUNvZGUgTXRwU2VydmVyOjpkb0dldERldmljZVByb3BEZXNjKCkgeworICAgIE10cERldmljZVByb3BlcnR5IHByb3BDb2RlID0gbVJlcXVlc3QuZ2V0UGFyYW1ldGVyKDEpOworICAgIExPR0QoIkdldERldmljZVByb3BEZXNjICVzXG4iLCBNdHBEZWJ1Zzo6Z2V0RGV2aWNlUHJvcENvZGVOYW1lKHByb3BDb2RlKSk7CisgICAgTXRwUHJvcGVydHkqIHByb3BlcnR5ID0gbURhdGFiYXNlLT5nZXREZXZpY2VQcm9wZXJ0eURlc2MocHJvcENvZGUpOworICAgIGlmICghcHJvcGVydHkpCisgICAgICAgIHJldHVybiBNVFBfUkVTUE9OU0VfREVWSUNFX1BST1BfTk9UX1NVUFBPUlRFRDsKKyAgICBwcm9wZXJ0eS0+d3JpdGUobURhdGEpOworICAgIGRlbGV0ZSBwcm9wZXJ0eTsKKyAgICByZXR1cm4gTVRQX1JFU1BPTlNFX09LOworfQorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbXRwL010cFNlcnZlci5oIGIvbWVkaWEvbXRwL010cFNlcnZlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY4YTY1NjQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9tdHAvTXRwU2VydmVyLmgKQEAgLTAsMCArMSwxMDcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9NVFBfU0VSVkVSX0gKKyNkZWZpbmUgX01UUF9TRVJWRVJfSAorCisjaW5jbHVkZSAiTXRwUmVxdWVzdFBhY2tldC5oIgorI2luY2x1ZGUgIk10cERhdGFQYWNrZXQuaCIKKyNpbmNsdWRlICJNdHBSZXNwb25zZVBhY2tldC5oIgorI2luY2x1ZGUgIk10cEV2ZW50UGFja2V0LmgiCisjaW5jbHVkZSAibXRwLmgiCisKKyNpbmNsdWRlICJNdHBVdGlscy5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NsYXNzIE10cERhdGFiYXNlOworY2xhc3MgTXRwU3RvcmFnZTsKKworY2xhc3MgTXRwU2VydmVyIHsKKworcHJpdmF0ZToKKyAgICAvLyBmaWxlIGRlc2NyaXB0b3IgZm9yIE1UUCBrZXJuZWwgZHJpdmVyCisgICAgaW50ICAgICAgICAgICAgICAgICBtRkQ7CisKKyAgICBNdHBEYXRhYmFzZSogICAgICAgIG1EYXRhYmFzZTsKKworICAgIC8vIGdyb3VwIHRvIG93biBuZXcgZmlsZXMgYW5kIGZvbGRlcnMKKyAgICBpbnQgICAgICAgICAgICAgICAgIG1GaWxlR3JvdXA7CisgICAgLy8gcGVybWlzc2lvbnMgZm9yIG5ldyBmaWxlcyBhbmQgZGlyZWN0b3JpZXMKKyAgICBpbnQgICAgICAgICAgICAgICAgIG1GaWxlUGVybWlzc2lvbjsKKyAgICBpbnQgICAgICAgICAgICAgICAgIG1EaXJlY3RvcnlQZXJtaXNzaW9uOworCisgICAgLy8gY3VycmVudCBzZXNzaW9uIElECisgICAgTXRwU2Vzc2lvbklEICAgICAgICBtU2Vzc2lvbklEOworICAgIC8vIHRydWUgaWYgd2UgaGF2ZSBhbiBvcGVuIHNlc3Npb24gYW5kIG1TZXNzaW9uSUQgaXMgdmFsaWQKKyAgICBib29sICAgICAgICAgICAgICAgIG1TZXNzaW9uT3BlbjsKKworICAgIE10cFJlcXVlc3RQYWNrZXQgICAgbVJlcXVlc3Q7CisgICAgTXRwRGF0YVBhY2tldCAgICAgICBtRGF0YTsKKyAgICBNdHBSZXNwb25zZVBhY2tldCAgIG1SZXNwb25zZTsKKyAgICBNdHBFdmVudFBhY2tldCAgICAgIG1FdmVudDsKKworICAgIE10cFN0b3JhZ2VMaXN0ICAgICAgbVN0b3JhZ2VzOworCisgICAgLy8gaGFuZGxlIGZvciBuZXcgb2JqZWN0LCBzZXQgYnkgU2VuZE9iamVjdEluZm8gYW5kIHVzZWQgYnkgU2VuZE9iamVjdAorICAgIE10cE9iamVjdEhhbmRsZSAgICAgbVNlbmRPYmplY3RIYW5kbGU7CisgICAgTXRwT2JqZWN0Rm9ybWF0ICAgICBtU2VuZE9iamVjdEZvcm1hdDsKKyAgICBNdHBTdHJpbmcgICAgICAgICAgIG1TZW5kT2JqZWN0RmlsZVBhdGg7CisgICAgc2l6ZV90ICAgICAgICAgICAgICBtU2VuZE9iamVjdEZpbGVTaXplOworCitwdWJsaWM6CisgICAgICAgICAgICAgICAgICAgICAgICBNdHBTZXJ2ZXIoaW50IGZkLCBNdHBEYXRhYmFzZSogZGF0YWJhc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZmlsZUdyb3VwLCBpbnQgZmlsZVBlcm0sIGludCBkaXJlY3RvcnlQZXJtKTsKKyAgICB2aXJ0dWFsICAgICAgICAgICAgIH5NdHBTZXJ2ZXIoKTsKKworICAgIHZvaWQgICAgICAgICAgICAgICAgYWRkU3RvcmFnZShjb25zdCBjaGFyKiBmaWxlUGF0aCk7CisgICAgaW5saW5lIHZvaWQgICAgICAgICBhZGRTdG9yYWdlKE10cFN0b3JhZ2UqIHN0b3JhZ2UpIHsgbVN0b3JhZ2VzLnB1c2goc3RvcmFnZSk7IH0KKyAgICBNdHBTdG9yYWdlKiAgICAgICAgIGdldFN0b3JhZ2UoTXRwU3RvcmFnZUlEIGlkKTsKKyAgICB2b2lkICAgICAgICAgICAgICAgIHJ1bigpOworCisgICAgdm9pZCAgICAgICAgICAgICAgICBzZW5kT2JqZWN0QWRkZWQoTXRwT2JqZWN0SGFuZGxlIGhhbmRsZSk7CisgICAgdm9pZCAgICAgICAgICAgICAgICBzZW5kT2JqZWN0UmVtb3ZlZChNdHBPYmplY3RIYW5kbGUgaGFuZGxlKTsKKworcHJpdmF0ZToKKyAgICBib29sICAgICAgICAgICAgICAgIGhhbmRsZVJlcXVlc3QoKTsKKworICAgIE10cFJlc3BvbnNlQ29kZSAgICAgZG9HZXREZXZpY2VJbmZvKCk7CisgICAgTXRwUmVzcG9uc2VDb2RlICAgICBkb09wZW5TZXNzaW9uKCk7CisgICAgTXRwUmVzcG9uc2VDb2RlICAgICBkb0Nsb3NlU2Vzc2lvbigpOworICAgIE10cFJlc3BvbnNlQ29kZSAgICAgZG9HZXRTdG9yYWdlSURzKCk7CisgICAgTXRwUmVzcG9uc2VDb2RlICAgICBkb0dldFN0b3JhZ2VJbmZvKCk7CisgICAgTXRwUmVzcG9uc2VDb2RlICAgICBkb0dldE9iamVjdFByb3BzU3VwcG9ydGVkKCk7CisgICAgTXRwUmVzcG9uc2VDb2RlICAgICBkb0dldE9iamVjdEhhbmRsZXMoKTsKKyAgICBNdHBSZXNwb25zZUNvZGUgICAgIGRvR2V0TnVtT2JqZWN0cygpOworICAgIE10cFJlc3BvbnNlQ29kZSAgICAgZG9HZXRPYmplY3RSZWZlcmVuY2VzKCk7CisgICAgTXRwUmVzcG9uc2VDb2RlICAgICBkb1NldE9iamVjdFJlZmVyZW5jZXMoKTsKKyAgICBNdHBSZXNwb25zZUNvZGUgICAgIGRvR2V0T2JqZWN0UHJvcFZhbHVlKCk7CisgICAgTXRwUmVzcG9uc2VDb2RlICAgICBkb1NldE9iamVjdFByb3BWYWx1ZSgpOworICAgIE10cFJlc3BvbnNlQ29kZSAgICAgZG9HZXREZXZpY2VQcm9wVmFsdWUoKTsKKyAgICBNdHBSZXNwb25zZUNvZGUgICAgIGRvU2V0RGV2aWNlUHJvcFZhbHVlKCk7CisgICAgTXRwUmVzcG9uc2VDb2RlICAgICBkb1Jlc2V0RGV2aWNlUHJvcFZhbHVlKCk7CisgICAgTXRwUmVzcG9uc2VDb2RlICAgICBkb0dldE9iamVjdEluZm8oKTsKKyAgICBNdHBSZXNwb25zZUNvZGUgICAgIGRvR2V0T2JqZWN0KCk7CisgICAgTXRwUmVzcG9uc2VDb2RlICAgICBkb1NlbmRPYmplY3RJbmZvKCk7CisgICAgTXRwUmVzcG9uc2VDb2RlICAgICBkb1NlbmRPYmplY3QoKTsKKyAgICBNdHBSZXNwb25zZUNvZGUgICAgIGRvRGVsZXRlT2JqZWN0KCk7CisgICAgTXRwUmVzcG9uc2VDb2RlICAgICBkb0dldE9iamVjdFByb3BEZXNjKCk7CisgICAgTXRwUmVzcG9uc2VDb2RlICAgICBkb0dldERldmljZVByb3BEZXNjKCk7Cit9OworCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgLy8gX01UUF9TRVJWRVJfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbXRwL010cFN0b3JhZ2UuY3BwIGIvbWVkaWEvbXRwL010cFN0b3JhZ2UuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVjY2YxODYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9tdHAvTXRwU3RvcmFnZS5jcHAKQEAgLTAsMCArMSw4MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiTXRwU3RvcmFnZSIKKworI2luY2x1ZGUgIk10cERlYnVnLmgiCisjaW5jbHVkZSAiTXRwRGF0YWJhc2UuaCIKKyNpbmNsdWRlICJNdHBTdG9yYWdlLmgiCisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPHN5cy9zdGF0ZnMuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxkaXJlbnQuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8bGltaXRzLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworTXRwU3RvcmFnZTo6TXRwU3RvcmFnZShNdHBTdG9yYWdlSUQgaWQsIGNvbnN0IGNoYXIqIGZpbGVQYXRoLCBNdHBEYXRhYmFzZSogZGIpCisgICAgOiAgIG1TdG9yYWdlSUQoaWQpLAorICAgICAgICBtRmlsZVBhdGgoZmlsZVBhdGgpLAorICAgICAgICBtRGF0YWJhc2UoZGIpLAorICAgICAgICBtTWF4Q2FwYWNpdHkoMCkKK3sKKyAgICBMT0dEKCJNdHBTdG9yYWdlIGlkOiAlZCBwYXRoOiAlc1xuIiwgaWQsIGZpbGVQYXRoKTsKK30KKworTXRwU3RvcmFnZTo6fk10cFN0b3JhZ2UoKSB7Cit9CisKK2ludCBNdHBTdG9yYWdlOjpnZXRUeXBlKCkgY29uc3QgeworICAgIHJldHVybiBNVFBfU1RPUkFHRV9GSVhFRF9SQU07Cit9CisKK2ludCBNdHBTdG9yYWdlOjpnZXRGaWxlU3lzdGVtVHlwZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gTVRQX1NUT1JBR0VfRklMRVNZU1RFTV9ISUVSQVJDSElDQUw7Cit9CisKK2ludCBNdHBTdG9yYWdlOjpnZXRBY2Nlc3NDYXBhYmlsaXR5KCkgY29uc3QgeworICAgIHJldHVybiBNVFBfU1RPUkFHRV9SRUFEX1dSSVRFOworfQorCit1aW50NjRfdCBNdHBTdG9yYWdlOjpnZXRNYXhDYXBhY2l0eSgpIHsKKyAgICBpZiAobU1heENhcGFjaXR5ID09IDApIHsKKyAgICAgICAgc3RydWN0IHN0YXRmcyAgIHN0YXQ7CisgICAgICAgIGlmIChzdGF0ZnMobUZpbGVQYXRoLCAmc3RhdCkpCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIG1NYXhDYXBhY2l0eSA9ICh1aW50NjRfdClzdGF0LmZfYmxvY2tzICogKHVpbnQ2NF90KXN0YXQuZl9ic2l6ZTsKKyAgICB9CisgICAgcmV0dXJuIG1NYXhDYXBhY2l0eTsKK30KKwordWludDY0X3QgTXRwU3RvcmFnZTo6Z2V0RnJlZVNwYWNlKCkgeworICAgIHN0cnVjdCBzdGF0ZnMgICBzdGF0OworICAgIGlmIChzdGF0ZnMobUZpbGVQYXRoLCAmc3RhdCkpCisgICAgICAgIHJldHVybiAtMTsKKyAgICByZXR1cm4gKHVpbnQ2NF90KXN0YXQuZl9iYXZhaWwgKiAodWludDY0X3Qpc3RhdC5mX2JzaXplOworfQorCitjb25zdCBjaGFyKiBNdHBTdG9yYWdlOjpnZXREZXNjcmlwdGlvbigpIGNvbnN0IHsKKyAgICByZXR1cm4gIkRldmljZSBTdG9yYWdlIjsKK30KKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL210cC9NdHBTdG9yYWdlLmggYi9tZWRpYS9tdHAvTXRwU3RvcmFnZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIxM2I5MjYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9tdHAvTXRwU3RvcmFnZS5oCkBAIC0wLDAgKzEsNTAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9NVFBfU1RPUkFHRV9ICisjZGVmaW5lIF9NVFBfU1RPUkFHRV9ICisKKyNpbmNsdWRlICJtdHAuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjbGFzcyBNdHBEYXRhYmFzZTsKKworY2xhc3MgTXRwU3RvcmFnZSB7CisKK3ByaXZhdGU6CisgICAgTXRwU3RvcmFnZUlEICAgICAgICAgICAgbVN0b3JhZ2VJRDsKKyAgICBjb25zdCBjaGFyKiAgICAgICAgICAgICBtRmlsZVBhdGg7CisgICAgTXRwRGF0YWJhc2UqICAgICAgICAgICAgbURhdGFiYXNlOworICAgIHVpbnQ2NF90ICAgICAgICAgICAgICAgIG1NYXhDYXBhY2l0eTsKKworcHVibGljOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE10cFN0b3JhZ2UoTXRwU3RvcmFnZUlEIGlkLCBjb25zdCBjaGFyKiBmaWxlUGF0aCwgTXRwRGF0YWJhc2UqIGRiKTsKKyAgICB2aXJ0dWFsICAgICAgICAgICAgICAgICB+TXRwU3RvcmFnZSgpOworCisgICAgaW5saW5lIE10cFN0b3JhZ2VJRCAgICAgZ2V0U3RvcmFnZUlEKCkgY29uc3QgeyByZXR1cm4gbVN0b3JhZ2VJRDsgfQorICAgIGludCAgICAgICAgICAgICAgICAgICAgIGdldFR5cGUoKSBjb25zdDsKKyAgICBpbnQgICAgICAgICAgICAgICAgICAgICBnZXRGaWxlU3lzdGVtVHlwZSgpIGNvbnN0OworICAgIGludCAgICAgICAgICAgICAgICAgICAgIGdldEFjY2Vzc0NhcGFiaWxpdHkoKSBjb25zdDsKKyAgICB1aW50NjRfdCAgICAgICAgICAgICAgICBnZXRNYXhDYXBhY2l0eSgpOworICAgIHVpbnQ2NF90ICAgICAgICAgICAgICAgIGdldEZyZWVTcGFjZSgpOworICAgIGNvbnN0IGNoYXIqICAgICAgICAgICAgIGdldERlc2NyaXB0aW9uKCkgY29uc3Q7CisgICAgaW5saW5lIGNvbnN0IGNoYXIqICAgICAgZ2V0UGF0aCgpIGNvbnN0IHsgcmV0dXJuIG1GaWxlUGF0aDsgfQorfTsKKworfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmIC8vIF9NVFBfU1RPUkFHRV9ICmRpZmYgLS1naXQgYS9tZWRpYS9tdHAvTXRwU3RvcmFnZUluZm8uY3BwIGIvbWVkaWEvbXRwL010cFN0b3JhZ2VJbmZvLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYTY0YWMwCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbXRwL010cFN0b3JhZ2VJbmZvLmNwcApAQCAtMCwwICsxLDcyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJNdHBTdG9yYWdlSW5mbyIKKworI2luY2x1ZGUgIk10cERlYnVnLmgiCisjaW5jbHVkZSAiTXRwRGF0YVBhY2tldC5oIgorI2luY2x1ZGUgIk10cFN0b3JhZ2VJbmZvLmgiCisjaW5jbHVkZSAiTXRwU3RyaW5nQnVmZmVyLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworTXRwU3RvcmFnZUluZm86Ok10cFN0b3JhZ2VJbmZvKE10cFN0b3JhZ2VJRCBpZCkKKyAgICA6ICAgbVN0b3JhZ2VJRChpZCksCisgICAgICAgIG1TdG9yYWdlVHlwZSgwKSwKKyAgICAgICAgbUZpbGVTeXN0ZW1UeXBlKDApLAorICAgICAgICBtQWNjZXNzQ2FwYWJpbGl0eSgwKSwKKyAgICAgICAgbU1heENhcGFjaXR5KDApLAorICAgICAgICBtRnJlZVNwYWNlQnl0ZXMoMCksCisgICAgICAgIG1GcmVlU3BhY2VPYmplY3RzKDApLAorICAgICAgICBtU3RvcmFnZURlc2NyaXB0aW9uKE5VTEwpLAorICAgICAgICBtVm9sdW1lSWRlbnRpZmllcihOVUxMKQoreworfQorCitNdHBTdG9yYWdlSW5mbzo6fk10cFN0b3JhZ2VJbmZvKCkgeworICAgIGlmIChtU3RvcmFnZURlc2NyaXB0aW9uKQorICAgICAgICBmcmVlKG1TdG9yYWdlRGVzY3JpcHRpb24pOworICAgIGlmIChtVm9sdW1lSWRlbnRpZmllcikKKyAgICAgICAgZnJlZShtVm9sdW1lSWRlbnRpZmllcik7Cit9CisKK3ZvaWQgTXRwU3RvcmFnZUluZm86OnJlYWQoTXRwRGF0YVBhY2tldCYgcGFja2V0KSB7CisgICAgTXRwU3RyaW5nQnVmZmVyIHN0cmluZzsKKworICAgIC8vIHJlYWQgdGhlIGRldmljZSBpbmZvCisgICAgbVN0b3JhZ2VUeXBlID0gcGFja2V0LmdldFVJbnQxNigpOworICAgIG1GaWxlU3lzdGVtVHlwZSA9IHBhY2tldC5nZXRVSW50MTYoKTsKKyAgICBtQWNjZXNzQ2FwYWJpbGl0eSA9IHBhY2tldC5nZXRVSW50MTYoKTsKKyAgICBtTWF4Q2FwYWNpdHkgPSBwYWNrZXQuZ2V0VUludDY0KCk7CisgICAgbUZyZWVTcGFjZUJ5dGVzID0gcGFja2V0LmdldFVJbnQ2NCgpOworICAgIG1GcmVlU3BhY2VPYmplY3RzID0gcGFja2V0LmdldFVJbnQzMigpOworCisgICAgcGFja2V0LmdldFN0cmluZyhzdHJpbmcpOworICAgIG1TdG9yYWdlRGVzY3JpcHRpb24gPSBzdHJkdXAoKGNvbnN0IGNoYXIgKilzdHJpbmcpOworICAgIHBhY2tldC5nZXRTdHJpbmcoc3RyaW5nKTsKKyAgICBtVm9sdW1lSWRlbnRpZmllciA9IHN0cmR1cCgoY29uc3QgY2hhciAqKXN0cmluZyk7Cit9CisKK3ZvaWQgTXRwU3RvcmFnZUluZm86OnByaW50KCkgeworICAgIExPR0QoIlN0b3JhZ2UgSW5mbyAlMDhYOlxuXHRtU3RvcmFnZVR5cGU6ICVkXG5cdG1GaWxlU3lzdGVtVHlwZTogJWRcblx0bUFjY2Vzc0NhcGFiaWxpdHk6ICVkXG4iLAorICAgICAgICAgICAgbVN0b3JhZ2VJRCwgbVN0b3JhZ2VUeXBlLCBtRmlsZVN5c3RlbVR5cGUsIG1BY2Nlc3NDYXBhYmlsaXR5KTsKKyAgICBMT0dEKCJcdG1NYXhDYXBhY2l0eTogJWxsZFxuXHRtRnJlZVNwYWNlQnl0ZXM6ICVsbGRcblx0bUZyZWVTcGFjZU9iamVjdHM6ICVkXG4iLAorICAgICAgICAgICAgbU1heENhcGFjaXR5LCBtRnJlZVNwYWNlQnl0ZXMsIG1GcmVlU3BhY2VPYmplY3RzKTsKKyAgICBMT0dEKCJcdG1TdG9yYWdlRGVzY3JpcHRpb246ICVzXG5cdG1Wb2x1bWVJZGVudGlmaWVyOiAlc1xuIiwKKyAgICAgICAgICAgIG1TdG9yYWdlRGVzY3JpcHRpb24sIG1Wb2x1bWVJZGVudGlmaWVyKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL210cC9NdHBTdG9yYWdlSW5mby5oIGIvbWVkaWEvbXRwL010cFN0b3JhZ2VJbmZvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmNiNjI2ZQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL210cC9NdHBTdG9yYWdlSW5mby5oCkBAIC0wLDAgKzEsNDkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9NVFBfU1RPUkFHRV9JTkZPX0gKKyNkZWZpbmUgX01UUF9TVE9SQUdFX0lORk9fSAorCisjaW5jbHVkZSAiTXRwVHlwZXMuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjbGFzcyBNdHBEYXRhUGFja2V0OworCitjbGFzcyBNdHBTdG9yYWdlSW5mbyB7CitwdWJsaWM6CisgICAgTXRwU3RvcmFnZUlEICAgICAgICBtU3RvcmFnZUlEOworICAgIHVpbnQxNl90ICAgICAgICAgICAgbVN0b3JhZ2VUeXBlOworICAgIHVpbnQxNl90ICAgICAgICAgICAgbUZpbGVTeXN0ZW1UeXBlOworICAgIHVpbnQxNl90ICAgICAgICAgICAgbUFjY2Vzc0NhcGFiaWxpdHk7CisgICAgdWludDY0X3QgICAgICAgICAgICBtTWF4Q2FwYWNpdHk7CisgICAgdWludDY0X3QgICAgICAgICAgICBtRnJlZVNwYWNlQnl0ZXM7CisgICAgdWludDMyX3QgICAgICAgICAgICBtRnJlZVNwYWNlT2JqZWN0czsKKyAgICBjaGFyKiAgICAgICAgICAgICAgIG1TdG9yYWdlRGVzY3JpcHRpb247CisgICAgY2hhciogICAgICAgICAgICAgICBtVm9sdW1lSWRlbnRpZmllcjsKKworcHVibGljOgorICAgICAgICAgICAgICAgICAgICAgICAgTXRwU3RvcmFnZUluZm8oTXRwU3RvcmFnZUlEIGlkKTsKKyAgICB2aXJ0dWFsICAgICAgICAgICAgIH5NdHBTdG9yYWdlSW5mbygpOworCisgICAgdm9pZCAgICAgICAgICAgICAgICByZWFkKE10cERhdGFQYWNrZXQmIHBhY2tldCk7CisKKyAgICB2b2lkICAgICAgICAgICAgICAgIHByaW50KCk7Cit9OworCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgLy8gX01UUF9TVE9SQUdFX0lORk9fSApkaWZmIC0tZ2l0IGEvbWVkaWEvbXRwL010cFN0cmluZ0J1ZmZlci5jcHAgYi9tZWRpYS9tdHAvTXRwU3RyaW5nQnVmZmVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YmY2NzMxCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbXRwL010cFN0cmluZ0J1ZmZlci5jcHAKQEAgLTAsMCArMSwxNDEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIk10cFN0cmluZ0J1ZmZlciIKKworI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSAiTXRwRGF0YVBhY2tldC5oIgorI2luY2x1ZGUgIk10cFN0cmluZ0J1ZmZlci5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK010cFN0cmluZ0J1ZmZlcjo6TXRwU3RyaW5nQnVmZmVyKCkKKyAgICA6ICAgbUNoYXJDb3VudCgwKSwKKyAgICAgICAgbUJ5dGVDb3VudCgxKQoreworICAgIG1CdWZmZXJbMF0gPSAwOworfQorCitNdHBTdHJpbmdCdWZmZXI6Ok10cFN0cmluZ0J1ZmZlcihjb25zdCBjaGFyKiBzcmMpCisgICAgOiAgIG1DaGFyQ291bnQoMCksCisgICAgICAgIG1CeXRlQ291bnQoMSkKK3sKKyAgICBzZXQoc3JjKTsKK30KKworTXRwU3RyaW5nQnVmZmVyOjpNdHBTdHJpbmdCdWZmZXIoY29uc3QgTXRwU3RyaW5nQnVmZmVyJiBzcmMpCisgICAgOiAgIG1DaGFyQ291bnQoc3JjLm1DaGFyQ291bnQpLAorICAgICAgICBtQnl0ZUNvdW50KHNyYy5tQnl0ZUNvdW50KQoreworICAgIG1lbWNweShtQnVmZmVyLCBzcmMubUJ1ZmZlciwgbUJ5dGVDb3VudCk7Cit9CisKKworTXRwU3RyaW5nQnVmZmVyOjp+TXRwU3RyaW5nQnVmZmVyKCkgeworfQorCit2b2lkIE10cFN0cmluZ0J1ZmZlcjo6c2V0KGNvbnN0IGNoYXIqIHNyYykgeworICAgIGludCBsZW5ndGggPSBzdHJsZW4oc3JjKTsKKyAgICBpZiAobGVuZ3RoID49IHNpemVvZihtQnVmZmVyKSkKKyAgICAgICAgbGVuZ3RoID0gc2l6ZW9mKG1CdWZmZXIpIC0gMTsKKyAgICBtZW1jcHkobUJ1ZmZlciwgc3JjLCBsZW5ndGgpOworCisgICAgLy8gY291bnQgdGhlIGNoYXJhY3RlcnMKKyAgICBpbnQgY291bnQgPSAwOworICAgIGNoYXIgY2g7CisgICAgd2hpbGUgKChjaCA9ICpzcmMrKykgIT0gMCkgeworICAgICAgICBpZiAoKGNoICYgMHg4MCkgPT0gMCkgeworICAgICAgICAgICAgLy8gc2luZ2xlIGJ5dGUgY2hhcmFjdGVyCisgICAgICAgIH0gZWxzZSBpZiAoKGNoICYgMHhFMCkgPT0gMHhDMCkgeworICAgICAgICAgICAgLy8gdHdvIGJ5dGUgY2hhcmFjdGVyCisgICAgICAgICAgICBpZiAoISAqc3JjKyspIHsKKyAgICAgICAgICAgICAgICAvLyBsYXN0IGNoYXJhY3RlciB3YXMgdHJ1bmNhdGVkLCBzbyBpZ25vcmUgbGFzdCBieXRlCisgICAgICAgICAgICAgICAgbGVuZ3RoLS07CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAoKGNoICYgMHhGMCkgPT0gMHhFMCkgeworICAgICAgICAgICAgLy8gMyBieXRlIGNoYXIKKyAgICAgICAgICAgIGlmICghICpzcmMrKykgeworICAgICAgICAgICAgICAgIC8vIGxhc3QgY2hhcmFjdGVyIHdhcyB0cnVuY2F0ZWQsIHNvIGlnbm9yZSBsYXN0IGJ5dGUKKyAgICAgICAgICAgICAgICBsZW5ndGgtLTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICghICpzcmMrKykgeworICAgICAgICAgICAgICAgIC8vIGxhc3QgY2hhcmFjdGVyIHdhcyB0cnVuY2F0ZWQsIHNvIGlnbm9yZSBsYXN0IHR3byBieXRlcworICAgICAgICAgICAgICAgIGxlbmd0aCAtPSAyOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGNvdW50Kys7CisgICAgfQorCisgICAgbUJ5dGVDb3VudCA9IGxlbmd0aCArIDE7CisgICAgbUJ1ZmZlcltsZW5ndGhdID0gMDsKKyAgICBtQ2hhckNvdW50ID0gY291bnQ7Cit9CisKK3ZvaWQgTXRwU3RyaW5nQnVmZmVyOjpyZWFkRnJvbVBhY2tldChNdHBEYXRhUGFja2V0KiBwYWNrZXQpIHsKKyAgICBpbnQgY291bnQgPSBwYWNrZXQtPmdldFVJbnQ4KCk7CisgICAgdWludDhfdCogZGVzdCA9IG1CdWZmZXI7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisgICAgICAgIHVpbnQxNl90IGNoID0gcGFja2V0LT5nZXRVSW50MTYoKTsKKyAgICAgICAgaWYgKGNoID49IDB4MDgwMCkgeworICAgICAgICAgICAgKmRlc3QrKyA9ICh1aW50OF90KSgweEUwIHwgKGNoID4+IDEyKSk7CisgICAgICAgICAgICAqZGVzdCsrID0gKHVpbnQ4X3QpKDB4ODAgfCAoKGNoID4+IDYpICYgMHgzRikpOworICAgICAgICAgICAgKmRlc3QrKyA9ICh1aW50OF90KSgweDgwIHwgKGNoICYgMHgzRikpOworICAgICAgICB9IGVsc2UgaWYgKGNoID49IDB4ODApIHsKKyAgICAgICAgICAgICpkZXN0KysgPSAodWludDhfdCkoMHhDMCB8IChjaCA+PiA2KSk7CisgICAgICAgICAgICAqZGVzdCsrID0gKHVpbnQ4X3QpKDB4ODAgfCAoY2ggJiAweDNGKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAqZGVzdCsrID0gY2g7CisgICAgICAgIH0KKyAgICB9CisgICAgKmRlc3QrKyA9IDA7CisgICAgbUNoYXJDb3VudCA9IGNvdW50OworICAgIG1CeXRlQ291bnQgPSBkZXN0IC0gbUJ1ZmZlcjsKK30KKwordm9pZCBNdHBTdHJpbmdCdWZmZXI6OndyaXRlVG9QYWNrZXQoTXRwRGF0YVBhY2tldCogcGFja2V0KSBjb25zdCB7CisgICAgaW50IGNvdW50ID0gbUNoYXJDb3VudDsKKyAgICBjb25zdCB1aW50OF90KiBzcmMgPSBtQnVmZmVyOworICAgIHBhY2tldC0+cHV0VUludDgoY291bnQgPiAwID8gY291bnQgKyAxIDogMCk7CisKKyAgICAvLyBleHBhbmQgdXRmOCB0byAxNiBiaXQgY2hhcnMKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKyAgICAgICAgdWludDE2X3QgY2g7CisgICAgICAgIHVpbnQxNl90IGNoMSA9ICpzcmMrKzsKKyAgICAgICAgaWYgKChjaDEgJiAweDgwKSA9PSAwKSB7CisgICAgICAgICAgICAvLyBzaW5nbGUgYnl0ZSBjaGFyYWN0ZXIKKyAgICAgICAgICAgIGNoID0gY2gxOworICAgICAgICB9IGVsc2UgaWYgKChjaDEgJiAweEUwKSA9PSAweEMwKSB7CisgICAgICAgICAgICAvLyB0d28gYnl0ZSBjaGFyYWN0ZXIKKyAgICAgICAgICAgIHVpbnQxNl90IGNoMiA9ICpzcmMrKzsKKyAgICAgICAgICAgIGNoID0gKChjaDEgJiAweDFGKSA8PCA2KSB8IChjaDIgJiAweDNGKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIHRocmVlIGJ5dGUgY2hhcmFjdGVyCisgICAgICAgICAgICB1aW50MTZfdCBjaDIgPSAqc3JjKys7CisgICAgICAgICAgICB1aW50MTZfdCBjaDMgPSAqc3JjKys7CisgICAgICAgICAgICBjaCA9ICgoY2gxICYgMHgwRikgPDwgMTIpIHwgKChjaDIgJiAweDNGKSA8PCA2KSB8IChjaDMgJiAweDNGKTsKKyAgICAgICAgfQorICAgICAgICBwYWNrZXQtPnB1dFVJbnQxNihjaCk7CisgICAgfQorICAgIC8vIG9ubHkgdGVybWluYXRlIHdpdGggemVybyBpZiBzdHJpbmcgaXMgbm90IGVtcHR5CisgICAgaWYgKGNvdW50ID4gMCkKKyAgICAgICAgcGFja2V0LT5wdXRVSW50MTYoMCk7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9tdHAvTXRwU3RyaW5nQnVmZmVyLmggYi9tZWRpYS9tdHAvTXRwU3RyaW5nQnVmZmVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDY0MWMzZgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL210cC9NdHBTdHJpbmdCdWZmZXIuaApAQCAtMCwwICsxLDU0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfTVRQX1NUUklOR19CVUZGRVJfSAorI2RlZmluZSBfTVRQX1NUUklOR19CVUZGRVJfSAorCisjaW5jbHVkZSA8c3RkaW50Lmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY2xhc3MgTXRwRGF0YVBhY2tldDsKKworLy8gUmVwcmVzZW50cyBhIHV0Zjggc3RyaW5nLCB3aXRoIGEgbWF4aW11bSBvZiAyNTUgY2hhcmFjdGVycworY2xhc3MgTXRwU3RyaW5nQnVmZmVyIHsKKworcHJpdmF0ZToKKyAgICAvLyBtYXhpbXVtIDMgYnl0ZXMvY2hhcmFjdGVyLCB3aXRoIDEgZXh0cmEgZm9yIHplcm8gdGVybWluYXRpb24KKyAgICB1aW50OF90ICAgICAgICAgbUJ1ZmZlclsyNTUgKiAzICsgMV07CisgICAgaW50ICAgICAgICAgICAgIG1DaGFyQ291bnQ7CisgICAgaW50ICAgICAgICAgICAgIG1CeXRlQ291bnQ7CisKK3B1YmxpYzoKKyAgICAgICAgICAgICAgICAgICAgTXRwU3RyaW5nQnVmZmVyKCk7CisgICAgICAgICAgICAgICAgICAgIE10cFN0cmluZ0J1ZmZlcihjb25zdCBjaGFyKiBzcmMpOworICAgICAgICAgICAgICAgICAgICBNdHBTdHJpbmdCdWZmZXIoY29uc3QgTXRwU3RyaW5nQnVmZmVyJiBzcmMpOworICAgIHZpcnR1YWwgICAgICAgICB+TXRwU3RyaW5nQnVmZmVyKCk7CisKKyAgICB2b2lkICAgICAgICAgICAgc2V0KGNvbnN0IGNoYXIqIHNyYyk7CisKKyAgICB2b2lkICAgICAgICAgICAgcmVhZEZyb21QYWNrZXQoTXRwRGF0YVBhY2tldCogcGFja2V0KTsKKyAgICB2b2lkICAgICAgICAgICAgd3JpdGVUb1BhY2tldChNdHBEYXRhUGFja2V0KiBwYWNrZXQpIGNvbnN0OworCisgICAgaW5saW5lIGludCAgICAgIGdldENoYXJDb3VudCgpIGNvbnN0IHsgcmV0dXJuIG1DaGFyQ291bnQ7IH0KKyAgICBpbmxpbmUgaW50ICAgICAgZ2V0Qnl0ZUNvdW50KCkgY29uc3QgeyByZXR1cm4gbUJ5dGVDb3VudDsgfQorCisJaW5saW5lIG9wZXJhdG9yIGNvbnN0IGNoYXIqKCkgY29uc3QgeyByZXR1cm4gKGNvbnN0IGNoYXIgKiltQnVmZmVyOyB9Cit9OworCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgLy8gX01UUF9TVFJJTkdfQlVGRkVSX0gKZGlmZiAtLWdpdCBhL21lZGlhL210cC9NdHBUeXBlcy5oIGIvbWVkaWEvbXRwL010cFR5cGVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2UzYzAwOQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL210cC9NdHBUeXBlcy5oCkBAIC0wLDAgKzEsOTIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9NVFBfVFlQRVNfSAorI2RlZmluZSBfTVRQX1RZUEVTX0gKKworI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgInV0aWxzL1N0cmluZzguaCIKKyNpbmNsdWRlICJ1dGlscy9WZWN0b3IuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCit0eXBlZGVmIGludDMyX3QgaW50MTI4X3RbNF07Cit0eXBlZGVmIHVpbnQzMl90IHVpbnQxMjhfdFs0XTsKKwordHlwZWRlZiB1aW50MTZfdCBNdHBPcGVyYXRpb25Db2RlOwordHlwZWRlZiB1aW50MTZfdCBNdHBSZXNwb25zZUNvZGU7Cit0eXBlZGVmIHVpbnQxNl90IE10cEV2ZW50Q29kZTsKK3R5cGVkZWYgdWludDMyX3QgTXRwU2Vzc2lvbklEOwordHlwZWRlZiB1aW50MzJfdCBNdHBTdG9yYWdlSUQ7Cit0eXBlZGVmIHVpbnQzMl90IE10cFRyYW5zYWN0aW9uSUQ7Cit0eXBlZGVmIHVpbnQxNl90IE10cFByb3BlcnR5Q29kZTsKK3R5cGVkZWYgdWludDE2X3QgTXRwRGF0YVR5cGU7Cit0eXBlZGVmIHVpbnQxNl90IE10cE9iamVjdEZvcm1hdDsKK3R5cGVkZWYgTXRwUHJvcGVydHlDb2RlIE10cERldmljZVByb3BlcnR5OwordHlwZWRlZiBNdHBQcm9wZXJ0eUNvZGUgTXRwT2JqZWN0UHJvcGVydHk7CisKKy8vIG9iamVjdCBoYW5kbGVzIGFyZSB1bmlxdWUgYWNyb3NzIGFsbCBzdG9yYWdlIGJ1dCBvbmx5IHdpdGhpbiBhIHNpbmdsZSBzZXNzaW9uLgorLy8gb2JqZWN0IGhhbmRsZXMgY2Fubm90IGJlIHJldXNlZCBhZnRlciBhbiBvYmplY3QgaXMgZGVsZXRlZC4KKy8vIHZhbHVlcyAweDAwMDAwMDAwIGFuZCAweEZGRkZGRkZGIGFyZSByZXNlcnZlZCBmb3Igc3BlY2lhbCBwdXJwb3Nlcy4KK3R5cGVkZWYgdWludDMyX3QgTXRwT2JqZWN0SGFuZGxlOworCit1bmlvbiBNdHBQcm9wZXJ0eVZhbHVlIHsKKyAgICBpbnQ4X3QgICAgICAgICAgaTg7CisgICAgdWludDhfdCAgICAgICAgIHU4OworICAgIGludDE2X3QgICAgICAgICBpMTY7CisgICAgdWludDE2X3QgICAgICAgIHUxNjsKKyAgICBpbnQzMl90ICAgICAgICAgaTMyOworICAgIHVpbnQzMl90ICAgICAgICB1MzI7CisgICAgaW50NjRfdCAgICAgICAgIGk2NDsKKyAgICB1aW50NjRfdCAgICAgICAgdTY0OworICAgIGludDEyOF90ICAgICAgICBpMTI4OworICAgIHVpbnQxMjhfdCAgICAgICB1MTI4OworICAgIGNoYXIqICAgICAgICAgICBzdHI7Cit9OworCisvLyBTcGVjaWFsIHZhbHVlcworI2RlZmluZSBNVFBfUEFSRU5UX1JPT1QgICAgICAgICAweEZGRkZGRkZGICAgICAgIC8vIHBhcmVudCBpcyByb290IG9mIHRoZSBzdG9yYWdlCisjZGVmaW5lIGtJbnZhbGlkT2JqZWN0SGFuZGxlICAgIDB4RkZGRkZGRkYKKworY2xhc3MgTXRwU3RvcmFnZTsKK2NsYXNzIE10cERldmljZTsKK2NsYXNzIE10cFByb3BlcnR5OworCit0eXBlZGVmIFZlY3RvcjxNdHBTdG9yYWdlICo+IE10cFN0b3JhZ2VMaXN0OwordHlwZWRlZiBWZWN0b3I8TXRwRGV2aWNlKj4gTXRwRGV2aWNlTGlzdDsKK3R5cGVkZWYgVmVjdG9yPE10cFByb3BlcnR5Kj4gTXRwUHJvcGVydHlMaXN0OworCit0eXBlZGVmIFZlY3Rvcjx1aW50OF90PiBVSW50OExpc3Q7Cit0eXBlZGVmIFZlY3Rvcjx1aW50MTZfdD4gVUludDE2TGlzdDsKK3R5cGVkZWYgVmVjdG9yPHVpbnQzMl90PiBVSW50MzJMaXN0OwordHlwZWRlZiBWZWN0b3I8dWludDY0X3Q+IFVJbnQ2NExpc3Q7Cit0eXBlZGVmIFZlY3RvcjxpbnQ4X3Q+IEludDhMaXN0OwordHlwZWRlZiBWZWN0b3I8aW50MTZfdD4gSW50MTZMaXN0OwordHlwZWRlZiBWZWN0b3I8aW50MzJfdD4gSW50MzJMaXN0OwordHlwZWRlZiBWZWN0b3I8aW50NjRfdD4gSW50NjRMaXN0OworCit0eXBlZGVmIFVJbnQxNkxpc3QgTXRwT2JqZWN0UHJvcGVydHlMaXN0OwordHlwZWRlZiBVSW50MTZMaXN0IE10cERldmljZVByb3BlcnR5TGlzdDsKK3R5cGVkZWYgVUludDE2TGlzdCBNdHBPYmplY3RGb3JtYXRMaXN0OwordHlwZWRlZiBVSW50MzJMaXN0IE10cE9iamVjdEhhbmRsZUxpc3Q7Cit0eXBlZGVmIFVJbnQxNkxpc3QgTXRwT2JqZWN0UHJvcGVydHlMaXN0OwordHlwZWRlZiBVSW50MzJMaXN0IE10cFN0b3JhZ2VJRExpc3Q7CisKK3R5cGVkZWYgU3RyaW5nOCAgICBNdHBTdHJpbmc7CisKK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAvLyBfTVRQX1RZUEVTX0gKZGlmZiAtLWdpdCBhL21lZGlhL210cC9NdHBVdGlscy5jcHAgYi9tZWRpYS9tdHAvTXRwVXRpbHMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFiMDFlZjUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9tdHAvTXRwVXRpbHMuY3BwCkBAIC0wLDAgKzEsNzggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIk10cFV0aWxzIgorCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDx0aW1lLmg+CisKKyNpbmNsdWRlIDxjdXRpbHMvdHp0aW1lLmg+CisjaW5jbHVkZSAiTXRwVXRpbHMuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisvKgorRGF0ZVRpbWUgc3RyaW5ncyBmb2xsb3cgYSBjb21wYXRpYmxlIHN1YnNldCBvZiB0aGUgZGVmaW5pdGlvbiBmb3VuZCBpbiBJU08gODYwMSwgYW5kCit0YWtlIHRoZSBmb3JtIG9mIGEgVW5pY29kZSBzdHJpbmcgZm9ybWF0dGVkIGFzOiAiWVlZWU1NRERUaGhtbXNzLnMiLiBJbiB0aGlzCityZXByZXNlbnRhdGlvbiwgWVlZWSBzaGFsbCBiZSByZXBsYWNlZCBieSB0aGUgeWVhciwgTU0gcmVwbGFjZWQgYnkgdGhlIG1vbnRoICgwMS0xMiksCitERCByZXBsYWNlZCBieSB0aGUgZGF5ICgwMS0zMSksIFQgaXMgYSBjb25zdGFudCBjaGFyYWN0ZXIgJ1QnIGRlbGltaXRpbmcgdGltZSBmcm9tIGRhdGUsCitoaCBpcyByZXBsYWNlZCBieSB0aGUgaG91ciAoMDAtMjMpLCBtbSBpcyByZXBsYWNlZCBieSB0aGUgbWludXRlICgwMC01OSksIGFuZCBzcyBieSB0aGUKK3NlY29uZCAoMDAtNTkpLiBUaGUgIi5zIiBpcyBvcHRpb25hbCwgYW5kIHJlcHJlc2VudHMgdGVudGhzIG9mIGEgc2Vjb25kLgorKi8KKworYm9vbCBwYXJzZURhdGVUaW1lKGNvbnN0IGNoYXIqIGRhdGVUaW1lLCB0aW1lX3QmIG91dFNlY29uZHMpIHsKKyAgICBpbnQgeWVhciwgbW9udGgsIGRheSwgaG91ciwgbWludXRlLCBzZWNvbmQ7CisgICAgc3RydWN0IHRtIHRtOworCisgICAgaWYgKHNzY2FuZihkYXRlVGltZSwgIiUwNGQlMDJkJTAyZFQlMDJkJTAyZCUwMmQiLAorICAgICAgICAgICAgJnllYXIsICZtb250aCwgJmRheSwgJmhvdXIsICZtaW51dGUsICZzZWNvbmQpICE9IDYpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICBjb25zdCBjaGFyKiB0YWlsID0gZGF0ZVRpbWUgKyAxNTsKKyAgICAvLyBza2lwIG9wdGlvbmFsIHRlbnRoIG9mIHNlY29uZAorICAgIGlmICh0YWlsWzBdID09ICcuJyAmJiB0YWlsWzFdKQorICAgICAgICB0YWlsICs9IDI7CisgICAgLy9GSVhNRSAtIHN1cHBvcnQgKy8taGhtbQorICAgIGJvb2wgdXNlVVRDID0gKHRhaWxbMF0gPT0gJ1onKTsKKworICAgIC8vIGhhY2sgdG8gY29tcHV0ZSB0aW1lem9uZQorICAgIHRpbWVfdCBkdW1teTsKKyAgICBsb2NhbHRpbWVfcigmZHVtbXksICZ0bSk7CisKKyAgICB0bS50bV9zZWMgPSBzZWNvbmQ7CisgICAgdG0udG1fbWluID0gbWludXRlOworICAgIHRtLnRtX2hvdXIgPSBob3VyOworICAgIHRtLnRtX21kYXkgPSBkYXk7CisgICAgdG0udG1fbW9uID0gbW9udGg7CisgICAgdG0udG1feWVhciA9IHllYXIgLSAxOTAwOworICAgIHRtLnRtX3dkYXkgPSAwOworICAgIHRtLnRtX2lzZHN0ID0gLTE7CisgICAgaWYgKHVzZVVUQykKKyAgICAgICAgb3V0U2Vjb25kcyA9IG1rdGltZSgmdG0pOworICAgIGVsc2UKKyAgICAgICAgb3V0U2Vjb25kcyA9IG1rdGltZV90eigmdG0sIHRtLnRtX3pvbmUpOworCisgICAgcmV0dXJuIHRydWU7Cit9CisKK3ZvaWQgZm9ybWF0RGF0ZVRpbWUodGltZV90IHNlY29uZHMsIGNoYXIqIGJ1ZmZlciwgaW50IGJ1ZmZlckxlbmd0aCkgeworICAgIHN0cnVjdCB0bSB0bTsKKworICAgIGxvY2FsdGltZV9yKCZzZWNvbmRzLCAmdG0pOworICAgIHNucHJpbnRmKGJ1ZmZlciwgYnVmZmVyTGVuZ3RoLCAiJTA0ZCUwMmQlMDJkVCUwMmQlMDJkJTAyZCIsCisgICAgICAgIHRtLnRtX3llYXIgKyAxOTAwLCB0bS50bV9tb24sIHRtLnRtX21kYXksIHRtLnRtX2hvdXIsIHRtLnRtX21pbiwgdG0udG1fc2VjKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL210cC9NdHBVdGlscy5oIGIvbWVkaWEvbXRwL010cFV0aWxzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjFmOTA1NQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL210cC9NdHBVdGlscy5oCkBAIC0wLDAgKzEsMjkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9NVFBfVVRJTFNfSAorI2RlZmluZSBfTVRQX1VUSUxTX0gKKworI2luY2x1ZGUgPHN0ZGludC5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2Jvb2wgcGFyc2VEYXRlVGltZShjb25zdCBjaGFyKiBkYXRlVGltZSwgdGltZV90JiBvdXRTZWNvbmRzKTsKK3ZvaWQgZm9ybWF0RGF0ZVRpbWUodGltZV90IHNlY29uZHMsIGNoYXIqIGJ1ZmZlciwgaW50IGJ1ZmZlckxlbmd0aCk7CisKK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAvLyBfTVRQX1VUSUxTX0gKZGlmZiAtLWdpdCBhL21lZGlhL210cC9tdHAuaCBiL21lZGlhL210cC9tdHAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iN2FmYTY2Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbXRwL210cC5oCkBAIC0wLDAgKzEsNDc1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfTVRQX0gKKyNkZWZpbmUgX01UUF9ICisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKworI2RlZmluZSBNVFBfU1RBTkRBUkRfVkVSU0lPTiAgICAgICAgICAgIDEwMAorCisvLyBDb250YWluZXIgVHlwZXMKKyNkZWZpbmUgTVRQX0NPTlRBSU5FUl9UWVBFX1VOREVGSU5FRCAgICAwCisjZGVmaW5lIE1UUF9DT05UQUlORVJfVFlQRV9DT01NQU5EICAgICAgMQorI2RlZmluZSBNVFBfQ09OVEFJTkVSX1RZUEVfREFUQSAgICAgICAgIDIKKyNkZWZpbmUgTVRQX0NPTlRBSU5FUl9UWVBFX1JFU1BPTlNFICAgICAzCisjZGVmaW5lIE1UUF9DT05UQUlORVJfVFlQRV9FVkVOVCAgICAgICAgNAorCisvLyBDb250YWluZXIgT2Zmc2V0cworI2RlZmluZSBNVFBfQ09OVEFJTkVSX0xFTkdUSF9PRkZTRVQgICAgICAgICAgICAgMAorI2RlZmluZSBNVFBfQ09OVEFJTkVSX1RZUEVfT0ZGU0VUICAgICAgICAgICAgICAgNAorI2RlZmluZSBNVFBfQ09OVEFJTkVSX0NPREVfT0ZGU0VUICAgICAgICAgICAgICAgNgorI2RlZmluZSBNVFBfQ09OVEFJTkVSX1RSQU5TQUNUSU9OX0lEX09GRlNFVCAgICAgOAorI2RlZmluZSBNVFBfQ09OVEFJTkVSX1BBUkFNRVRFUl9PRkZTRVQgICAgICAgICAgMTIKKyNkZWZpbmUgTVRQX0NPTlRBSU5FUl9IRUFERVJfU0laRSAgICAgICAgICAgICAgIDEyCisKKy8vIE1UUCBUeXBlcworI2RlZmluZSBNVFBfVFlQRV9VTkRFRklORUQgICAgICAweDAwMDAgICAgICAgICAgLy8gVW5kZWZpbmVkCisjZGVmaW5lIE1UUF9UWVBFX0lOVDggICAgICAgICAgIDB4MDAwMSAgICAgICAgICAvLyBTaWduZWQgOC1iaXQgaW50ZWdlcgorI2RlZmluZSBNVFBfVFlQRV9VSU5UOCAgICAgICAgICAweDAwMDIgICAgICAgICAgLy8gVW5zaWduZWQgOC1iaXQgaW50ZWdlcgorI2RlZmluZSBNVFBfVFlQRV9JTlQxNiAgICAgICAgICAweDAwMDMgICAgICAgICAgLy8gU2lnbmVkIDE2LWJpdCBpbnRlZ2VyCisjZGVmaW5lIE1UUF9UWVBFX1VJTlQxNiAgICAgICAgIDB4MDAwNCAgICAgICAgICAvLyBVbnNpZ25lZCAxNi1iaXQgaW50ZWdlcgorI2RlZmluZSBNVFBfVFlQRV9JTlQzMiAgICAgICAgICAweDAwMDUgICAgICAgICAgLy8gU2lnbmVkIDMyLWJpdCBpbnRlZ2VyCisjZGVmaW5lIE1UUF9UWVBFX1VJTlQzMiAgICAgICAgIDB4MDAwNiAgICAgICAgICAvLyBVbnNpZ25lZCAzMi1iaXQgaW50ZWdlcgorI2RlZmluZSBNVFBfVFlQRV9JTlQ2NCAgICAgICAgICAweDAwMDcgICAgICAgICAgLy8gU2lnbmVkIDY0LWJpdCBpbnRlZ2VyCisjZGVmaW5lIE1UUF9UWVBFX1VJTlQ2NCAgICAgICAgIDB4MDAwOCAgICAgICAgICAvLyBVbnNpZ25lZCA2NC1iaXQgaW50ZWdlcgorI2RlZmluZSBNVFBfVFlQRV9JTlQxMjggICAgICAgICAweDAwMDkgICAgICAgICAgLy8gU2lnbmVkIDEyOC1iaXQgaW50ZWdlcgorI2RlZmluZSBNVFBfVFlQRV9VSU5UMTI4ICAgICAgICAweDAwMEEgICAgICAgICAgLy8gVW5zaWduZWQgMTI4LWJpdCBpbnRlZ2VyCisjZGVmaW5lIE1UUF9UWVBFX0FJTlQ4ICAgICAgICAgIDB4NDAwMSAgICAgICAgICAvLyBBcnJheSBvZiBzaWduZWQgOC1iaXQgaW50ZWdlcnMKKyNkZWZpbmUgTVRQX1RZUEVfQVVJTlQ4ICAgICAgICAgMHg0MDAyICAgICAgICAgIC8vIEFycmF5IG9mIHVuc2lnbmVkIDgtYml0IGludGVnZXJzCisjZGVmaW5lIE1UUF9UWVBFX0FJTlQxNiAgICAgICAgIDB4NDAwMyAgICAgICAgICAvLyBBcnJheSBvZiBzaWduZWQgMTYtYml0IGludGVnZXJzCisjZGVmaW5lIE1UUF9UWVBFX0FVSU5UMTYgICAgICAgIDB4NDAwNCAgICAgICAgICAvLyBBcnJheSBvZiB1bnNpZ25lZCAxNi1iaXQgaW50ZWdlcnMKKyNkZWZpbmUgTVRQX1RZUEVfQUlOVDMyICAgICAgICAgMHg0MDA1ICAgICAgICAgIC8vIEFycmF5IG9mIHNpZ25lZCAzMi1iaXQgaW50ZWdlcnMKKyNkZWZpbmUgTVRQX1RZUEVfQVVJTlQzMiAgICAgICAgMHg0MDA2ICAgICAgICAgIC8vIEFycmF5IG9mIHVuc2lnbmVkIDMyLWJpdCBpbnRlZ2VycworI2RlZmluZSBNVFBfVFlQRV9BSU5UNjQgICAgICAgICAweDQwMDcgICAgICAgICAgLy8gQXJyYXkgb2Ygc2lnbmVkIDY0LWJpdCBpbnRlZ2VycworI2RlZmluZSBNVFBfVFlQRV9BVUlOVDY0ICAgICAgICAweDQwMDggICAgICAgICAgLy8gQXJyYXkgb2YgdW5zaWduZWQgNjQtYml0IGludGVnZXJzCisjZGVmaW5lIE1UUF9UWVBFX0FJTlQxMjggICAgICAgIDB4NDAwOSAgICAgICAgICAvLyBBcnJheSBvZiBzaWduZWQgMTI4LWJpdCBpbnRlZ2VycworI2RlZmluZSBNVFBfVFlQRV9BVUlOVDEyOCAgICAgICAweDQwMEEgICAgICAgICAgLy8gQXJyYXkgb2YgdW5zaWduZWQgMTI4LWJpdCBpbnRlZ2VycworI2RlZmluZSBNVFBfVFlQRV9TVFIgICAgICAgICAgICAweEZGRkYgICAgICAgICAgLy8gVmFyaWFibGUtbGVuZ3RoIFVuaWNvZGUgc3RyaW5nCisKKy8vIE1UUCBGb3JtYXQgQ29kZXMKKyNkZWZpbmUgTVRQX0ZPUk1BVF9VTkRFRklORUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgzMDAwICAgLy8gVW5kZWZpbmVkIG9iamVjdAorI2RlZmluZSBNVFBfRk9STUFUX0FTU09DSUFUSU9OICAgICAgICAgICAgICAgICAgICAgICAgICAweDMwMDEgICAvLyBBc3NvY2lhdGlvbiAoZm9yIGV4YW1wbGUsIGEgZm9sZGVyKQorI2RlZmluZSBNVFBfRk9STUFUX1NDUklQVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDMwMDIgICAvLyBEZXZpY2UgbW9kZWwtc3BlY2lmaWMgc2NyaXB0CisjZGVmaW5lIE1UUF9GT1JNQVRfRVhFQ1VUQUJMRSAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MzAwMyAgIC8vIERldmljZSBtb2RlbC1zcGVjaWZpYyBiaW5hcnkgZXhlY3V0YWJsZQorI2RlZmluZSBNVFBfRk9STUFUX1RFWFQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDMwMDQgICAvLyBUZXh0IGZpbGUKKyNkZWZpbmUgTVRQX0ZPUk1BVF9IVE1MICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgzMDA1ICAgLy8gSHlwZXJ0ZXh0IE1hcmt1cCBMYW5ndWFnZSBmaWxlICh0ZXh0KQorI2RlZmluZSBNVFBfRk9STUFUX0RQT0YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDMwMDYgICAvLyBEaWdpdGFsIFByaW50IE9yZGVyIEZvcm1hdCBmaWxlICh0ZXh0KQorI2RlZmluZSBNVFBfRk9STUFUX0FJRkYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDMwMDcgICAvLyBBdWRpbyBjbGlwCisjZGVmaW5lIE1UUF9GT1JNQVRfV0FWICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MzAwOCAgIC8vIEF1ZGlvIGNsaXAKKyNkZWZpbmUgTVRQX0ZPUk1BVF9NUDMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgzMDA5ICAgLy8gQXVkaW8gY2xpcAorI2RlZmluZSBNVFBfRk9STUFUX0FWSSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDMwMEEgICAvLyBWaWRlbyBjbGlwCisjZGVmaW5lIE1UUF9GT1JNQVRfTVBFRyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MzAwQiAgIC8vIFZpZGVvIGNsaXAKKyNkZWZpbmUgTVRQX0ZPUk1BVF9BU0YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgzMDBDICAgLy8gTWljcm9zb2Z0IEFkdmFuY2VkIFN0cmVhbWluZyBGb3JtYXQgKHZpZGVvKQorI2RlZmluZSBNVFBfRk9STUFUX0RFRklORUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDM4MDAgICAvLyBVbmtub3duIGltYWdlIG9iamVjdAorI2RlZmluZSBNVFBfRk9STUFUX0VYSUZfSlBFRyAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDM4MDEgICAvLyBFeGNoYW5nZWFibGUgRmlsZSBGb3JtYXQsIEpFSURBIHN0YW5kYXJkCisjZGVmaW5lIE1UUF9GT1JNQVRfVElGRl9FUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MzgwMiAgIC8vIFRhZyBJbWFnZSBGaWxlIEZvcm1hdCBmb3IgRWxlY3Ryb25pYyBQaG90b2dyYXBoeQorI2RlZmluZSBNVFBfRk9STUFUX0ZMQVNIUElYICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDM4MDMgICAvLyBTdHJ1Y3R1cmVkIFN0b3JhZ2UgSW1hZ2UgRm9ybWF0CisjZGVmaW5lIE1UUF9GT1JNQVRfQk1QICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MzgwNCAgIC8vIE1pY3Jvc29mdCBXaW5kb3dzIEJpdG1hcCBmaWxlCisjZGVmaW5lIE1UUF9GT1JNQVRfQ0lGRiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MzgwNSAgIC8vIENhbm9uIENhbWVyYSBJbWFnZSBGaWxlIEZvcm1hdAorI2RlZmluZSBNVFBfRk9STUFUX0dJRiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDM4MDcgICAvLyBHcmFwaGljcyBJbnRlcmNoYW5nZSBGb3JtYXQKKyNkZWZpbmUgTVRQX0ZPUk1BVF9KRklGICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgzODA4ICAgLy8gSlBFRyBGaWxlIEludGVyY2hhbmdlIEZvcm1hdAorI2RlZmluZSBNVFBfRk9STUFUX0NEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDM4MDkgICAvLyBQaG90b0NEIEltYWdlIFBhYworI2RlZmluZSBNVFBfRk9STUFUX1BJQ1QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDM4MEEgICAvLyBRdWlja2RyYXcgSW1hZ2UgRm9ybWF0CisjZGVmaW5lIE1UUF9GT1JNQVRfUE5HICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MzgwQiAgIC8vIFBvcnRhYmxlIE5ldHdvcmsgR3JhcGhpY3MKKyNkZWZpbmUgTVRQX0ZPUk1BVF9USUZGICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgzODBEICAgLy8gVGFnIEltYWdlIEZpbGUgRm9ybWF0CisjZGVmaW5lIE1UUF9GT1JNQVRfVElGRl9JVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MzgwRSAgIC8vIFRhZyBJbWFnZSBGaWxlIEZvcm1hdCBmb3IgSW5mb3JtYXRpb24gVGVjaG5vbG9neSAoZ3JhcGhpYyBhcnRzKQorI2RlZmluZSBNVFBfRk9STUFUX0pQMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDM4MEYgICAvLyBKUEVHMjAwMCBCYXNlbGluZSBGaWxlIEZvcm1hdAorI2RlZmluZSBNVFBfRk9STUFUX0pQWCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDM4MTAgICAvLyBKUEVHMjAwMCBFeHRlbmRlZCBGaWxlIEZvcm1hdAorI2RlZmluZSBNVFBfRk9STUFUX1VOREVGSU5FRF9GSVJNV0FSRSAgICAgICAgICAgICAgICAgICAweEI4MDIKKyNkZWZpbmUgTVRQX0ZPUk1BVF9XSU5ET1dTX0lNQUdFX0ZPUk1BVCAgICAgICAgICAgICAgICAgMHhCODgxCisjZGVmaW5lIE1UUF9GT1JNQVRfVU5ERUZJTkVEX0FVRElPICAgICAgICAgICAgICAgICAgICAgIDB4QjkwMAorI2RlZmluZSBNVFBfRk9STUFUX1dNQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweEI5MDEKKyNkZWZpbmUgTVRQX0ZPUk1BVF9PR0cgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhCOTAyCisjZGVmaW5lIE1UUF9GT1JNQVRfQUFDICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4QjkwMworI2RlZmluZSBNVFBfRk9STUFUX0FVRElCTEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweEI5MDQKKyNkZWZpbmUgTVRQX0ZPUk1BVF9GTEFDICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhCOTA2CisjZGVmaW5lIE1UUF9GT1JNQVRfVU5ERUZJTkVEX1ZJREVPICAgICAgICAgICAgICAgICAgICAgIDB4Qjk4MAorI2RlZmluZSBNVFBfRk9STUFUX1dNViAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweEI5ODEKKyNkZWZpbmUgTVRQX0ZPUk1BVF9NUDRfQ09OVEFJTkVSICAgICAgICAgICAgICAgICAgICAgICAgMHhCOTgyICAvLyBJU08gMTQ0OTYtMQorI2RlZmluZSBNVFBfRk9STUFUX01QMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweEI5ODMKKyNkZWZpbmUgTVRQX0ZPUk1BVF8zR1BfQ09OVEFJTkVSICAgICAgICAgICAgICAgICAgICAgICAgMHhCOTg0ICAvLyAzR1BQIGZpbGUgZm9ybWF0LiBEZXRhaWxzOiBodHRwOi8vd3d3LjNncHAub3JnL2Z0cC9TcGVjcy9odG1sLWluZm8vMjYyNDQuaHRtIChwYWdlIHRpdGxlIC0gXHUyMDFjVHJhbnNwYXJlbnQgZW5kLXRvLWVuZCBwYWNrZXQgc3dpdGNoZWQgc3RyZWFtaW5nIHNlcnZpY2UsIDNHUFAgZmlsZSBmb3JtYXRcdTIwMWQpLgorI2RlZmluZSBNVFBfRk9STUFUX1VOREVGSU5FRF9DT0xMRUNUSU9OICAgICAgICAgICAgICAgICAweEJBMDAKKyNkZWZpbmUgTVRQX0ZPUk1BVF9BQlNUUkFDVF9NVUxUSU1FRElBX0FMQlVNICAgICAgICAgICAgMHhCQTAxCisjZGVmaW5lIE1UUF9GT1JNQVRfQUJTVFJBQ1RfSU1BR0VfQUxCVU0gICAgICAgICAgICAgICAgIDB4QkEwMgorI2RlZmluZSBNVFBfRk9STUFUX0FCU1RSQUNUX0FVRElPX0FMQlVNICAgICAgICAgICAgICAgICAweEJBMDMKKyNkZWZpbmUgTVRQX0ZPUk1BVF9BQlNUUkFDVF9WSURFT19BTEJVTSAgICAgICAgICAgICAgICAgMHhCQTA0CisjZGVmaW5lIE1UUF9GT1JNQVRfQUJTVFJBQ1RfQVZfUExBWUxJU1QgICAgICAgICAgICAgICAgIDB4QkEwNQorI2RlZmluZSBNVFBfRk9STUFUX0FCU1RSQUNUX0NPTlRBQ1RfR1JPVVAgICAgICAgICAgICAgICAweEJBMDYKKyNkZWZpbmUgTVRQX0ZPUk1BVF9BQlNUUkFDVF9NRVNTQUdFX0ZPTERFUiAgICAgICAgICAgICAgMHhCQTA3CisjZGVmaW5lIE1UUF9GT1JNQVRfQUJTVFJBQ1RfQ0hBUFRFUkVEX1BST0RVQ1RJT04gICAgICAgIDB4QkEwOAorI2RlZmluZSBNVFBfRk9STUFUX0FCU1RSQUNUX0FVRElPX1BMQVlMSVNUICAgICAgICAgICAgICAweEJBMDkKKyNkZWZpbmUgTVRQX0ZPUk1BVF9BQlNUUkFDVF9WSURFT19QTEFZTElTVCAgICAgICAgICAgICAgMHhCQTBBCisjZGVmaW5lIE1UUF9GT1JNQVRfQUJTVFJBQ1RfTUVESUFDQVNUICAgICAgICAgICAgICAgICAgIDB4QkEwQiAvLyBGb3IgdXNlIHdpdGggbWVkaWFjYXN0czsgcmVmZXJlbmNlcyBtdWx0aW1lZGlhIGVuY2xvc3VyZXMgb2YgUlNTIGZlZWRzIG9yIGVwaXNvZGljIGNvbnRlbnQKKyNkZWZpbmUgTVRQX0ZPUk1BVF9XUExfUExBWUxJU1QgICAgICAgICAgICAgICAgICAgICAgICAgMHhCQTEwCisjZGVmaW5lIE1UUF9GT1JNQVRfTTNVX1BMQVlMSVNUICAgICAgICAgICAgICAgICAgICAgICAgIDB4QkExMQorI2RlZmluZSBNVFBfRk9STUFUX01QTF9QTEFZTElTVCAgICAgICAgICAgICAgICAgICAgICAgICAweEJBMTIKKyNkZWZpbmUgTVRQX0ZPUk1BVF9BU1hfUExBWUxJU1QgICAgICAgICAgICAgICAgICAgICAgICAgMHhCQTEzCisjZGVmaW5lIE1UUF9GT1JNQVRfUExTX1BMQVlMSVNUICAgICAgICAgICAgICAgICAgICAgICAgIDB4QkExNAorI2RlZmluZSBNVFBfRk9STUFUX1VOREVGSU5FRF9ET0NVTUVOVCAgICAgICAgICAgICAgICAgICAweEJBODAKKyNkZWZpbmUgTVRQX0ZPUk1BVF9BQlNUUkFDVF9ET0NVTUVOVCAgICAgICAgICAgICAgICAgICAgMHhCQTgxCisjZGVmaW5lIE1UUF9GT1JNQVRfWE1MX0RPQ1VNRU5UICAgICAgICAgICAgICAgICAgICAgICAgIDB4QkE4MgorI2RlZmluZSBNVFBfRk9STUFUX01TX1dPUkRfRE9DVU1FTlQgICAgICAgICAgICAgICAgICAgICAweEJBODMKKyNkZWZpbmUgTVRQX0ZPUk1BVF9NSFRfQ09NUElMRURfSFRNTF9ET0NVTUVOVCAgICAgICAgICAgMHhCQTg0CisjZGVmaW5lIE1UUF9GT1JNQVRfTVNfRVhDRUxfU1BSRUFEU0hFRVQgICAgICAgICAgICAgICAgIDB4QkE4NQorI2RlZmluZSBNVFBfRk9STUFUX01TX1BPV0VSUE9JTlRfUFJFU0VOVEFUSU9OICAgICAgICAgICAweEJBODYKKyNkZWZpbmUgTVRQX0ZPUk1BVF9VTkRFRklORURfTUVTU0FHRSAgICAgICAgICAgICAgICAgICAgMHhCQjAwCisjZGVmaW5lIE1UUF9GT1JNQVRfQUJTVFJBQ1RfTUVTU1NBR0UgICAgICAgICAgICAgICAgICAgIDB4QkIwMQorI2RlZmluZSBNVFBfRk9STUFUX1VOREVGSU5FRF9DT05UQUNUICAgICAgICAgICAgICAgICAgICAweEJCODAKKyNkZWZpbmUgTVRQX0ZPUk1BVF9BQlNUUkFDVF9DT05UQUNUICAgICAgICAgICAgICAgICAgICAgMHhCQjgxCisjZGVmaW5lIE1UUF9GT1JNQVRfVkNBUkRfMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4QkI4MgorCisvLyBNVFAgT2JqZWN0IFByb3BlcnR5IENvZGVzCisjZGVmaW5lIE1UUF9QUk9QRVJUWV9TVE9SQUdFX0lEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweERDMDEKKyNkZWZpbmUgTVRQX1BST1BFUlRZX09CSkVDVF9GT1JNQVQgICAgICAgICAgICAgICAgICAgICAgICAgIDB4REMwMgorI2RlZmluZSBNVFBfUFJPUEVSVFlfUFJPVEVDVElPTl9TVEFUVVMgICAgICAgICAgICAgICAgICAgICAgMHhEQzAzCisjZGVmaW5lIE1UUF9QUk9QRVJUWV9PQkpFQ1RfU0laRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAweERDMDQKKyNkZWZpbmUgTVRQX1BST1BFUlRZX0FTU09DSUFUSU9OX1RZUEUgICAgICAgICAgICAgICAgICAgICAgIDB4REMwNQorI2RlZmluZSBNVFBfUFJPUEVSVFlfQVNTT0NJQVRJT05fREVTQyAgICAgICAgICAgICAgICAgICAgICAgMHhEQzA2CisjZGVmaW5lIE1UUF9QUk9QRVJUWV9PQkpFQ1RfRklMRV9OQU1FICAgICAgICAgICAgICAgICAgICAgICAweERDMDcKKyNkZWZpbmUgTVRQX1BST1BFUlRZX0RBVEVfQ1JFQVRFRCAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4REMwOAorI2RlZmluZSBNVFBfUFJPUEVSVFlfREFURV9NT0RJRklFRCAgICAgICAgICAgICAgICAgICAgICAgICAgMHhEQzA5CisjZGVmaW5lIE1UUF9QUk9QRVJUWV9LRVlXT1JEUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweERDMEEKKyNkZWZpbmUgTVRQX1BST1BFUlRZX1BBUkVOVF9PQkpFQ1QgICAgICAgICAgICAgICAgICAgICAgICAgIDB4REMwQgorI2RlZmluZSBNVFBfUFJPUEVSVFlfQUxMT1dFRF9GT0xERVJfQ09OVEVOVFMgICAgICAgICAgICAgICAgMHhEQzBDCisjZGVmaW5lIE1UUF9QUk9QRVJUWV9ISURERU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweERDMEQKKyNkZWZpbmUgTVRQX1BST1BFUlRZX1NZU1RFTV9PQkpFQ1QgICAgICAgICAgICAgICAgICAgICAgICAgIDB4REMwRQorI2RlZmluZSBNVFBfUFJPUEVSVFlfUEVSU0lTVEVOVF9VSUQgICAgICAgICAgICAgICAgICAgICAgICAgMHhEQzQxCisjZGVmaW5lIE1UUF9QUk9QRVJUWV9TWU5DX0lEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweERDNDIKKyNkZWZpbmUgTVRQX1BST1BFUlRZX1BST1BFUlRZX0JBRyAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4REM0MworI2RlZmluZSBNVFBfUFJPUEVSVFlfTkFNRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhEQzQ0CisjZGVmaW5lIE1UUF9QUk9QRVJUWV9DUkVBVEVEX0JZICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweERDNDUKKyNkZWZpbmUgTVRQX1BST1BFUlRZX0FSVElTVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4REM0NgorI2RlZmluZSBNVFBfUFJPUEVSVFlfREFURV9BVVRIT1JFRCAgICAgICAgICAgICAgICAgICAgICAgICAgMHhEQzQ3CisjZGVmaW5lIE1UUF9QUk9QRVJUWV9ERVNDUklQVElPTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAweERDNDgKKyNkZWZpbmUgTVRQX1BST1BFUlRZX1VSTF9SRUZFUkVOQ0UgICAgICAgICAgICAgICAgICAgICAgICAgIDB4REM0OQorI2RlZmluZSBNVFBfUFJPUEVSVFlfTEFOR1VBR0VfTE9DQUxFICAgICAgICAgICAgICAgICAgICAgICAgMHhEQzRBCisjZGVmaW5lIE1UUF9QUk9QRVJUWV9DT1BZUklHSFRfSU5GT1JNQVRJT04gICAgICAgICAgICAgICAgICAweERDNEIKKyNkZWZpbmUgTVRQX1BST1BFUlRZX1NPVVJDRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4REM0QworI2RlZmluZSBNVFBfUFJPUEVSVFlfT1JJR0lOX0xPQ0FUSU9OICAgICAgICAgICAgICAgICAgICAgICAgMHhEQzRECisjZGVmaW5lIE1UUF9QUk9QRVJUWV9EQVRFX0FEREVEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweERDNEUKKyNkZWZpbmUgTVRQX1BST1BFUlRZX05PTl9DT05TVU1BQkxFICAgICAgICAgICAgICAgICAgICAgICAgIDB4REM0RgorI2RlZmluZSBNVFBfUFJPUEVSVFlfQ09SUlVQVF9VTlBMQVlBQkxFICAgICAgICAgICAgICAgICAgICAgMHhEQzUwCisjZGVmaW5lIE1UUF9QUk9QRVJUWV9QUk9EVUNFUl9TRVJJQUxfTlVNQkVSICAgICAgICAgICAgICAgICAweERDNTEKKyNkZWZpbmUgTVRQX1BST1BFUlRZX1JFUFJFU0VOVEFUSVZFX1NBTVBMRV9GT1JNQVQgICAgICAgICAgIDB4REM4MQorI2RlZmluZSBNVFBfUFJPUEVSVFlfUkVQUkVTRU5UQVRJVkVfU0FNUExFX1NJWkUgICAgICAgICAgICAgMHhEQzgyCisjZGVmaW5lIE1UUF9QUk9QRVJUWV9SRVBSRVNFTlRBVElWRV9TQU1QTEVfSEVJR0hUICAgICAgICAgICAweERDODMKKyNkZWZpbmUgTVRQX1BST1BFUlRZX1JFUFJFU0VOVEFUSVZFX1NBTVBMRV9XSURUSCAgICAgICAgICAgIDB4REM4NAorI2RlZmluZSBNVFBfUFJPUEVSVFlfUkVQUkVTRU5UQVRJVkVfU0FNUExFX0RVUkFUSU9OICAgICAgICAgMHhEQzg1CisjZGVmaW5lIE1UUF9QUk9QRVJUWV9SRVBSRVNFTlRBVElWRV9TQU1QTEVfREFUQSAgICAgICAgICAgICAweERDODYKKyNkZWZpbmUgTVRQX1BST1BFUlRZX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4REM4NworI2RlZmluZSBNVFBfUFJPUEVSVFlfSEVJR0hUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhEQzg4CisjZGVmaW5lIE1UUF9QUk9QRVJUWV9EVVJBVElPTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweERDODkKKyNkZWZpbmUgTVRQX1BST1BFUlRZX1JBVElORyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4REM4QQorI2RlZmluZSBNVFBfUFJPUEVSVFlfVFJBQ0sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhEQzhCCisjZGVmaW5lIE1UUF9QUk9QRVJUWV9HRU5SRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweERDOEMKKyNkZWZpbmUgTVRQX1BST1BFUlRZX0NSRURJVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4REM4RAorI2RlZmluZSBNVFBfUFJPUEVSVFlfTFlSSUNTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhEQzhFCisjZGVmaW5lIE1UUF9QUk9QRVJUWV9TVUJTQ1JJUFRJT05fQ09OVEVOVF9JRCAgICAgICAgICAgICAgICAweERDOEYKKyNkZWZpbmUgTVRQX1BST1BFUlRZX1BST0RVQ0VEX0JZICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4REM5MAorI2RlZmluZSBNVFBfUFJPUEVSVFlfVVNFX0NPVU5UICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhEQzkxCisjZGVmaW5lIE1UUF9QUk9QRVJUWV9TS0lQX0NPVU5UICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweERDOTIKKyNkZWZpbmUgTVRQX1BST1BFUlRZX0xBU1RfQUNDRVNTRUQgICAgICAgICAgICAgICAgICAgICAgICAgIDB4REM5MworI2RlZmluZSBNVFBfUFJPUEVSVFlfUEFSRU5UQUxfUkFUSU5HICAgICAgICAgICAgICAgICAgICAgICAgMHhEQzk0CisjZGVmaW5lIE1UUF9QUk9QRVJUWV9NRVRBX0dFTlJFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweERDOTUKKyNkZWZpbmUgTVRQX1BST1BFUlRZX0NPTVBPU0VSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4REM5NgorI2RlZmluZSBNVFBfUFJPUEVSVFlfRUZGRUNUSVZFX1JBVElORyAgICAgICAgICAgICAgICAgICAgICAgMHhEQzk3CisjZGVmaW5lIE1UUF9QUk9QRVJUWV9TVUJUSVRMRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweERDOTgKKyNkZWZpbmUgTVRQX1BST1BFUlRZX09SSUdJTkFMX1JFTEVBU0VfREFURSAgICAgICAgICAgICAgICAgIDB4REM5OQorI2RlZmluZSBNVFBfUFJPUEVSVFlfQUxCVU1fTkFNRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhEQzlBCisjZGVmaW5lIE1UUF9QUk9QRVJUWV9BTEJVTV9BUlRJU1QgICAgICAgICAgICAgICAgICAgICAgICAgICAweERDOUIKKyNkZWZpbmUgTVRQX1BST1BFUlRZX01PT0QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4REM5QworI2RlZmluZSBNVFBfUFJPUEVSVFlfRFJNX1NUQVRVUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhEQzlECisjZGVmaW5lIE1UUF9QUk9QRVJUWV9TVUJfREVTQ1JJUFRJT04gICAgICAgICAgICAgICAgICAgICAgICAweERDOUUKKyNkZWZpbmUgTVRQX1BST1BFUlRZX0lTX0NST1BQRUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4RENEMQorI2RlZmluZSBNVFBfUFJPUEVSVFlfSVNfQ09MT1VSX0NPUlJFQ1RFRCAgICAgICAgICAgICAgICAgICAgMHhEQ0QyCisjZGVmaW5lIE1UUF9QUk9QRVJUWV9JTUFHRV9CSVRfREVQVEggICAgICAgICAgICAgICAgICAgICAgICAweERDRDMKKyNkZWZpbmUgTVRQX1BST1BFUlRZX0ZfTlVNQkVSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4RENENAorI2RlZmluZSBNVFBfUFJPUEVSVFlfRVhQT1NVUkVfVElNRSAgICAgICAgICAgICAgICAgICAgICAgICAgMHhEQ0Q1CisjZGVmaW5lIE1UUF9QUk9QRVJUWV9FWFBPU1VSRV9JTkRFWCAgICAgICAgICAgICAgICAgICAgICAgICAweERDRDYKKyNkZWZpbmUgTVRQX1BST1BFUlRZX1RPVEFMX0JJVFJBVEUgICAgICAgICAgICAgICAgICAgICAgICAgIDB4REU5MQorI2RlZmluZSBNVFBfUFJPUEVSVFlfQklUUkFURV9UWVBFICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhERTkyCisjZGVmaW5lIE1UUF9QUk9QRVJUWV9TQU1QTEVfUkFURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAweERFOTMKKyNkZWZpbmUgTVRQX1BST1BFUlRZX05VTUJFUl9PRl9DSEFOTkVMUyAgICAgICAgICAgICAgICAgICAgIDB4REU5NAorI2RlZmluZSBNVFBfUFJPUEVSVFlfQVVESU9fQklUX0RFUFRIICAgICAgICAgICAgICAgICAgICAgICAgMHhERTk1CisjZGVmaW5lIE1UUF9QUk9QRVJUWV9TQ0FOX1RZUEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweERFOTcKKyNkZWZpbmUgTVRQX1BST1BFUlRZX0FVRElPX1dBVkVfQ09ERUMgICAgICAgICAgICAgICAgICAgICAgIDB4REU5OQorI2RlZmluZSBNVFBfUFJPUEVSVFlfQVVESU9fQklUUkFURSAgICAgICAgICAgICAgICAgICAgICAgICAgMHhERTlBCisjZGVmaW5lIE1UUF9QUk9QRVJUWV9WSURFT19GT1VSQ0NfQ09ERUMgICAgICAgICAgICAgICAgICAgICAweERFOUIKKyNkZWZpbmUgTVRQX1BST1BFUlRZX1ZJREVPX0JJVFJBVEUgICAgICAgICAgICAgICAgICAgICAgICAgIDB4REU5QworI2RlZmluZSBNVFBfUFJPUEVSVFlfRlJBTUVTX1BFUl9USE9VU0FORF9TRUNPTkRTICAgICAgICAgICAgMHhERTlECisjZGVmaW5lIE1UUF9QUk9QRVJUWV9LRVlGUkFNRV9ESVNUQU5DRSAgICAgICAgICAgICAgICAgICAgICAweERFOUUKKyNkZWZpbmUgTVRQX1BST1BFUlRZX0JVRkZFUl9TSVpFICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4REU5RgorI2RlZmluZSBNVFBfUFJPUEVSVFlfRU5DT0RJTkdfUVVBTElUWSAgICAgICAgICAgICAgICAgICAgICAgMHhERUEwCisjZGVmaW5lIE1UUF9QUk9QRVJUWV9FTkNPRElOR19QUk9GSUxFICAgICAgICAgICAgICAgICAgICAgICAweERFQTEKKyNkZWZpbmUgTVRQX1BST1BFUlRZX0RJU1BMQVlfTkFNRSAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4RENFMAorI2RlZmluZSBNVFBfUFJPUEVSVFlfQk9EWV9URVhUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhEQ0UxCisjZGVmaW5lIE1UUF9QUk9QRVJUWV9TVUJKRUNUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweERDRTIKKyNkZWZpbmUgTVRQX1BST1BFUlRZX1BSSU9SSVRZICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4RENFMworI2RlZmluZSBNVFBfUFJPUEVSVFlfR0lWRU5fTkFNRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhERDAwCisjZGVmaW5lIE1UUF9QUk9QRVJUWV9NSURETEVfTkFNRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAweEREMDEKKyNkZWZpbmUgTVRQX1BST1BFUlRZX0ZBTUlMWV9OQU1FICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4REQwMgorI2RlZmluZSBNVFBfUFJPUEVSVFlfUFJFRklYICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhERDAzCisjZGVmaW5lIE1UUF9QUk9QRVJUWV9TVUZGSVggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweEREMDQKKyNkZWZpbmUgTVRQX1BST1BFUlRZX1BIT05FVElDX0dJVkVOX05BTUUgICAgICAgICAgICAgICAgICAgIDB4REQwNQorI2RlZmluZSBNVFBfUFJPUEVSVFlfUEhPTkVUSUNfRkFNSUxZX05BTUUgICAgICAgICAgICAgICAgICAgMHhERDA2CisjZGVmaW5lIE1UUF9QUk9QRVJUWV9FTUFJTF9QUklNQVJZICAgICAgICAgICAgICAgICAgICAgICAgICAweEREMDcKKyNkZWZpbmUgTVRQX1BST1BFUlRZX0VNQUlMX1BFUlNPTkFMXzEgICAgICAgICAgICAgICAgICAgICAgIDB4REQwOAorI2RlZmluZSBNVFBfUFJPUEVSVFlfRU1BSUxfUEVSU09OQUxfMiAgICAgICAgICAgICAgICAgICAgICAgMHhERDA5CisjZGVmaW5lIE1UUF9QUk9QRVJUWV9FTUFJTF9CVVNJTkVTU18xICAgICAgICAgICAgICAgICAgICAgICAweEREMEEKKyNkZWZpbmUgTVRQX1BST1BFUlRZX0VNQUlMX0JVU0lORVNTXzIgICAgICAgICAgICAgICAgICAgICAgIDB4REQwQgorI2RlZmluZSBNVFBfUFJPUEVSVFlfRU1BSUxfT1RIRVJTICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhERDBDCisjZGVmaW5lIE1UUF9QUk9QRVJUWV9QSE9ORV9OVU1CRVJfUFJJTUFSWSAgICAgICAgICAgICAgICAgICAweEREMEQKKyNkZWZpbmUgTVRQX1BST1BFUlRZX1BIT05FX05VTUJFUl9QRVJTT05BTCAgICAgICAgICAgICAgICAgIDB4REQwRQorI2RlZmluZSBNVFBfUFJPUEVSVFlfUEhPTkVfTlVNQkVSX1BFUlNPTkFMXzIgICAgICAgICAgICAgICAgMHhERDBGCisjZGVmaW5lIE1UUF9QUk9QRVJUWV9QSE9ORV9OVU1CRVJfQlVTSU5FU1MgICAgICAgICAgICAgICAgICAweEREMTAKKyNkZWZpbmUgTVRQX1BST1BFUlRZX1BIT05FX05VTUJFUl9CVVNJTkVTU18yICAgICAgICAgICAgICAgIDB4REQxMQorI2RlZmluZSBNVFBfUFJPUEVSVFlfUEhPTkVfTlVNQkVSX01PQklMRSAgICAgICAgICAgICAgICAgICAgMHhERDEyCisjZGVmaW5lIE1UUF9QUk9QRVJUWV9QSE9ORV9OVU1CRVJfTU9CSUxFXzIgICAgICAgICAgICAgICAgICAweEREMTMKKyNkZWZpbmUgTVRQX1BST1BFUlRZX0ZBWF9OVU1CRVJfUFJJTUFSWSAgICAgICAgICAgICAgICAgICAgIDB4REQxNAorI2RlZmluZSBNVFBfUFJPUEVSVFlfRkFYX05VTUJFUl9QRVJTT05BTCAgICAgICAgICAgICAgICAgICAgMHhERDE1CisjZGVmaW5lIE1UUF9QUk9QRVJUWV9GQVhfTlVNQkVSX0JVU0lORVNTICAgICAgICAgICAgICAgICAgICAweEREMTYKKyNkZWZpbmUgTVRQX1BST1BFUlRZX1BBR0VSX05VTUJFUiAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4REQxNworI2RlZmluZSBNVFBfUFJPUEVSVFlfUEhPTkVfTlVNQkVSX09USEVSUyAgICAgICAgICAgICAgICAgICAgMHhERDE4CisjZGVmaW5lIE1UUF9QUk9QRVJUWV9QUklNQVJZX1dFQl9BRERSRVNTICAgICAgICAgICAgICAgICAgICAweEREMTkKKyNkZWZpbmUgTVRQX1BST1BFUlRZX1BFUlNPTkFMX1dFQl9BRERSRVNTICAgICAgICAgICAgICAgICAgIDB4REQxQQorI2RlZmluZSBNVFBfUFJPUEVSVFlfQlVTSU5FU1NfV0VCX0FERFJFU1MgICAgICAgICAgICAgICAgICAgMHhERDFCCisjZGVmaW5lIE1UUF9QUk9QRVJUWV9JTlNUQU5UX01FU1NBTkdFUl9BRERSRVNTICAgICAgICAgICAgICAweEREMUMKKyNkZWZpbmUgTVRQX1BST1BFUlRZX0lOU1RBTlRfTUVTU0FOR0VSX0FERFJFU1NfMiAgICAgICAgICAgIDB4REQxRAorI2RlZmluZSBNVFBfUFJPUEVSVFlfSU5TVEFOVF9NRVNTQU5HRVJfQUREUkVTU18zICAgICAgICAgICAgMHhERDFFCisjZGVmaW5lIE1UUF9QUk9QRVJUWV9QT1NUQUxfQUREUkVTU19QRVJTT05BTF9GVUxMICAgICAgICAgICAweEREMUYKKyNkZWZpbmUgTVRQX1BST1BFUlRZX1BPU1RBTF9BRERSRVNTX1BFUlNPTkFMX0xJTkVfMSAgICAgICAgIDB4REQyMAorI2RlZmluZSBNVFBfUFJPUEVSVFlfUE9TVEFMX0FERFJFU1NfUEVSU09OQUxfTElORV8yICAgICAgICAgMHhERDIxCisjZGVmaW5lIE1UUF9QUk9QRVJUWV9QT1NUQUxfQUREUkVTU19QRVJTT05BTF9DSVRZICAgICAgICAgICAweEREMjIKKyNkZWZpbmUgTVRQX1BST1BFUlRZX1BPU1RBTF9BRERSRVNTX1BFUlNPTkFMX1JFR0lPTiAgICAgICAgIDB4REQyMworI2RlZmluZSBNVFBfUFJPUEVSVFlfUE9TVEFMX0FERFJFU1NfUEVSU09OQUxfUE9TVEFMX0NPREUgICAgMHhERDI0CisjZGVmaW5lIE1UUF9QUk9QRVJUWV9QT1NUQUxfQUREUkVTU19QRVJTT05BTF9DT1VOVFJZICAgICAgICAweEREMjUKKyNkZWZpbmUgTVRQX1BST1BFUlRZX1BPU1RBTF9BRERSRVNTX0JVU0lORVNTX0ZVTEwgICAgICAgICAgIDB4REQyNgorI2RlZmluZSBNVFBfUFJPUEVSVFlfUE9TVEFMX0FERFJFU1NfQlVTSU5FU1NfTElORV8xICAgICAgICAgMHhERDI3CisjZGVmaW5lIE1UUF9QUk9QRVJUWV9QT1NUQUxfQUREUkVTU19CVVNJTkVTU19MSU5FXzIgICAgICAgICAweEREMjgKKyNkZWZpbmUgTVRQX1BST1BFUlRZX1BPU1RBTF9BRERSRVNTX0JVU0lORVNTX0NJVFkgICAgICAgICAgIDB4REQyOQorI2RlZmluZSBNVFBfUFJPUEVSVFlfUE9TVEFMX0FERFJFU1NfQlVTSU5FU1NfUkVHSU9OICAgICAgICAgMHhERDJBCisjZGVmaW5lIE1UUF9QUk9QRVJUWV9QT1NUQUxfQUREUkVTU19CVVNJTkVTU19QT1NUQUxfQ09ERSAgICAweEREMkIKKyNkZWZpbmUgTVRQX1BST1BFUlRZX1BPU1RBTF9BRERSRVNTX0JVU0lORVNTX0NPVU5UUlkgICAgICAgIDB4REQyQworI2RlZmluZSBNVFBfUFJPUEVSVFlfUE9TVEFMX0FERFJFU1NfT1RIRVJfRlVMTCAgICAgICAgICAgICAgMHhERDJECisjZGVmaW5lIE1UUF9QUk9QRVJUWV9QT1NUQUxfQUREUkVTU19PVEhFUl9MSU5FXzEgICAgICAgICAgICAweEREMkUKKyNkZWZpbmUgTVRQX1BST1BFUlRZX1BPU1RBTF9BRERSRVNTX09USEVSX0xJTkVfMiAgICAgICAgICAgIDB4REQyRgorI2RlZmluZSBNVFBfUFJPUEVSVFlfUE9TVEFMX0FERFJFU1NfT1RIRVJfQ0lUWSAgICAgICAgICAgICAgMHhERDMwCisjZGVmaW5lIE1UUF9QUk9QRVJUWV9QT1NUQUxfQUREUkVTU19PVEhFUl9SRUdJT04gICAgICAgICAgICAweEREMzEKKyNkZWZpbmUgTVRQX1BST1BFUlRZX1BPU1RBTF9BRERSRVNTX09USEVSX1BPU1RBTF9DT0RFICAgICAgIDB4REQzMgorI2RlZmluZSBNVFBfUFJPUEVSVFlfUE9TVEFMX0FERFJFU1NfT1RIRVJfQ09VTlRSWSAgICAgICAgICAgMHhERDMzCisjZGVmaW5lIE1UUF9QUk9QRVJUWV9PUkdBTklaQVRJT05fTkFNRSAgICAgICAgICAgICAgICAgICAgICAweEREMzQKKyNkZWZpbmUgTVRQX1BST1BFUlRZX1BIT05FVElDX09SR0FOSVpBVElPTl9OQU1FICAgICAgICAgICAgIDB4REQzNQorI2RlZmluZSBNVFBfUFJPUEVSVFlfUk9MRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhERDM2CisjZGVmaW5lIE1UUF9QUk9QRVJUWV9CSVJUSERBVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweEREMzcKKyNkZWZpbmUgTVRQX1BST1BFUlRZX01FU1NBR0VfVE8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4REQ0MAorI2RlZmluZSBNVFBfUFJPUEVSVFlfTUVTU0FHRV9DQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhERDQxCisjZGVmaW5lIE1UUF9QUk9QRVJUWV9NRVNTQUdFX0JDQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAweERENDIKKyNkZWZpbmUgTVRQX1BST1BFUlRZX01FU1NBR0VfUkVBRCAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4REQ0MworI2RlZmluZSBNVFBfUFJPUEVSVFlfTUVTU0FHRV9SRUNFSVZFRF9USU1FICAgICAgICAgICAgICAgICAgMHhERDQ0CisjZGVmaW5lIE1UUF9QUk9QRVJUWV9NRVNTQUdFX1NFTkRFUiAgICAgICAgICAgICAgICAgICAgICAgICAweERENDUKKyNkZWZpbmUgTVRQX1BST1BFUlRZX0FDVElWSVRZX0JFR0lOX1RJTUUgICAgICAgICAgICAgICAgICAgIDB4REQ1MAorI2RlZmluZSBNVFBfUFJPUEVSVFlfQUNUSVZJVFlfRU5EX1RJTUUgICAgICAgICAgICAgICAgICAgICAgMHhERDUxCisjZGVmaW5lIE1UUF9QUk9QRVJUWV9BQ1RJVklUWV9MT0NBVElPTiAgICAgICAgICAgICAgICAgICAgICAweERENTIKKyNkZWZpbmUgTVRQX1BST1BFUlRZX0FDVElWSVRZX1JFUVVJUkVEX0FUVEVOREVFUyAgICAgICAgICAgIDB4REQ1NAorI2RlZmluZSBNVFBfUFJPUEVSVFlfQUNUSVZJVFlfT1BUSU9OQUxfQVRURU5ERUVTICAgICAgICAgICAgMHhERDU1CisjZGVmaW5lIE1UUF9QUk9QRVJUWV9BQ1RJVklUWV9SRVNPVVJDRVMgICAgICAgICAgICAgICAgICAgICAweERENTYKKyNkZWZpbmUgTVRQX1BST1BFUlRZX0FDVElWSVRZX0FDQ0VQVEVEICAgICAgICAgICAgICAgICAgICAgIDB4REQ1NworI2RlZmluZSBNVFBfUFJPUEVSVFlfQUNUSVZJVFlfVEVOVEFUSVZFICAgICAgICAgICAgICAgICAgICAgMHhERDU4CisjZGVmaW5lIE1UUF9QUk9QRVJUWV9BQ1RJVklUWV9ERUNMSU5FRCAgICAgICAgICAgICAgICAgICAgICAweERENTkKKyNkZWZpbmUgTVRQX1BST1BFUlRZX0FDVElWSVRZX1JFTUFJTkRFUl9USU1FICAgICAgICAgICAgICAgIDB4REQ1QQorI2RlZmluZSBNVFBfUFJPUEVSVFlfQUNUSVZJVFlfT1dORVIgICAgICAgICAgICAgICAgICAgICAgICAgMHhERDVCCisjZGVmaW5lIE1UUF9QUk9QRVJUWV9BQ1RJVklUWV9TVEFUVVMgICAgICAgICAgICAgICAgICAgICAgICAweERENUMKKyNkZWZpbmUgTVRQX1BST1BFUlRZX09XTkVSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4REQ1RAorI2RlZmluZSBNVFBfUFJPUEVSVFlfRURJVE9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhERDVFCisjZGVmaW5lIE1UUF9QUk9QRVJUWV9XRUJNQVNURVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweERENUYKKyNkZWZpbmUgTVRQX1BST1BFUlRZX1VSTF9TT1VSQ0UgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4REQ2MAorI2RlZmluZSBNVFBfUFJPUEVSVFlfVVJMX0RFU1RJTkFUSU9OICAgICAgICAgICAgICAgICAgICAgICAgMHhERDYxCisjZGVmaW5lIE1UUF9QUk9QRVJUWV9USU1FX0JPT0tNQVJLICAgICAgICAgICAgICAgICAgICAgICAgICAweERENjIKKyNkZWZpbmUgTVRQX1BST1BFUlRZX09CSkVDVF9CT09LTUFSSyAgICAgICAgICAgICAgICAgICAgICAgIDB4REQ2MworI2RlZmluZSBNVFBfUFJPUEVSVFlfQllURV9CT09LTUFSSyAgICAgICAgICAgICAgICAgICAgICAgICAgMHhERDY0CisjZGVmaW5lIE1UUF9QUk9QRVJUWV9MQVNUX0JVSUxEX0RBVEUgICAgICAgICAgICAgICAgICAgICAgICAweERENzAKKyNkZWZpbmUgTVRQX1BST1BFUlRZX1RJTUVfVE9fTElWRSAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4REQ3MQorI2RlZmluZSBNVFBfUFJPUEVSVFlfTUVESUFfR1VJRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhERDcyCisKKy8vIE1UUCBEZXZpY2UgUHJvcGVydHkgQ29kZXMKKyNkZWZpbmUgTVRQX0RFVklDRV9QUk9QRVJUWV9VTkRFRklORUQgICAgICAgICAgICAgICAgICAgICAgIDB4NTAwMAorI2RlZmluZSBNVFBfREVWSUNFX1BST1BFUlRZX0JBVFRFUllfTEVWRUwgICAgICAgICAgICAgICAgICAgMHg1MDAxCisjZGVmaW5lIE1UUF9ERVZJQ0VfUFJPUEVSVFlfRlVOQ1RJT05BTF9NT0RFICAgICAgICAgICAgICAgICAweDUwMDIKKyNkZWZpbmUgTVRQX0RFVklDRV9QUk9QRVJUWV9JTUFHRV9TSVpFICAgICAgICAgICAgICAgICAgICAgIDB4NTAwMworI2RlZmluZSBNVFBfREVWSUNFX1BST1BFUlRZX0NPTVBSRVNTSU9OX1NFVFRJTkcgICAgICAgICAgICAgMHg1MDA0CisjZGVmaW5lIE1UUF9ERVZJQ0VfUFJPUEVSVFlfV0hJVEVfQkFMQU5DRSAgICAgICAgICAgICAgICAgICAweDUwMDUKKyNkZWZpbmUgTVRQX0RFVklDRV9QUk9QRVJUWV9SR0JfR0FJTiAgICAgICAgICAgICAgICAgICAgICAgIDB4NTAwNgorI2RlZmluZSBNVFBfREVWSUNFX1BST1BFUlRZX0ZfTlVNQkVSICAgICAgICAgICAgICAgICAgICAgICAgMHg1MDA3CisjZGVmaW5lIE1UUF9ERVZJQ0VfUFJPUEVSVFlfRk9DQUxfTEVOR1RIICAgICAgICAgICAgICAgICAgICAweDUwMDgKKyNkZWZpbmUgTVRQX0RFVklDRV9QUk9QRVJUWV9GT0NVU19ESVNUQU5DRSAgICAgICAgICAgICAgICAgIDB4NTAwOQorI2RlZmluZSBNVFBfREVWSUNFX1BST1BFUlRZX0ZPQ1VTX01PREUgICAgICAgICAgICAgICAgICAgICAgMHg1MDBBCisjZGVmaW5lIE1UUF9ERVZJQ0VfUFJPUEVSVFlfRVhQT1NVUkVfTUVURVJJTkdfTU9ERSAgICAgICAgICAweDUwMEIKKyNkZWZpbmUgTVRQX0RFVklDRV9QUk9QRVJUWV9GTEFTSF9NT0RFICAgICAgICAgICAgICAgICAgICAgIDB4NTAwQworI2RlZmluZSBNVFBfREVWSUNFX1BST1BFUlRZX0VYUE9TVVJFX1RJTUUgICAgICAgICAgICAgICAgICAgMHg1MDBECisjZGVmaW5lIE1UUF9ERVZJQ0VfUFJPUEVSVFlfRVhQT1NVUkVfUFJPR1JBTV9NT0RFICAgICAgICAgICAweDUwMEUKKyNkZWZpbmUgTVRQX0RFVklDRV9QUk9QRVJUWV9FWFBPU1VSRV9JTkRFWCAgICAgICAgICAgICAgICAgIDB4NTAwRgorI2RlZmluZSBNVFBfREVWSUNFX1BST1BFUlRZX0VYUE9TVVJFX0JJQVNfQ09NUEVOU0FUSU9OICAgICAgMHg1MDEwCisjZGVmaW5lIE1UUF9ERVZJQ0VfUFJPUEVSVFlfREFURVRJTUUgICAgICAgICAgICAgICAgICAgICAgICAweDUwMTEKKyNkZWZpbmUgTVRQX0RFVklDRV9QUk9QRVJUWV9DQVBUVVJFX0RFTEFZICAgICAgICAgICAgICAgICAgIDB4NTAxMgorI2RlZmluZSBNVFBfREVWSUNFX1BST1BFUlRZX1NUSUxMX0NBUFRVUkVfTU9ERSAgICAgICAgICAgICAgMHg1MDEzCisjZGVmaW5lIE1UUF9ERVZJQ0VfUFJPUEVSVFlfQ09OVFJBU1QgICAgICAgICAgICAgICAgICAgICAgICAweDUwMTQKKyNkZWZpbmUgTVRQX0RFVklDRV9QUk9QRVJUWV9TSEFSUE5FU1MgICAgICAgICAgICAgICAgICAgICAgIDB4NTAxNQorI2RlZmluZSBNVFBfREVWSUNFX1BST1BFUlRZX0RJR0lUQUxfWk9PTSAgICAgICAgICAgICAgICAgICAgMHg1MDE2CisjZGVmaW5lIE1UUF9ERVZJQ0VfUFJPUEVSVFlfRUZGRUNUX01PREUgICAgICAgICAgICAgICAgICAgICAweDUwMTcKKyNkZWZpbmUgTVRQX0RFVklDRV9QUk9QRVJUWV9CVVJTVF9OVU1CRVIgICAgICAgICAgICAgICAgICAgIDB4NTAxOAorI2RlZmluZSBNVFBfREVWSUNFX1BST1BFUlRZX0JVUlNUX0lOVEVSVkFMICAgICAgICAgICAgICAgICAgMHg1MDE5CisjZGVmaW5lIE1UUF9ERVZJQ0VfUFJPUEVSVFlfVElNRUxBUFNFX05VTUJFUiAgICAgICAgICAgICAgICAweDUwMUEKKyNkZWZpbmUgTVRQX0RFVklDRV9QUk9QRVJUWV9USU1FTEFQU0VfSU5URVJWQUwgICAgICAgICAgICAgIDB4NTAxQgorI2RlZmluZSBNVFBfREVWSUNFX1BST1BFUlRZX0ZPQ1VTX01FVEVSSU5HX01PREUgICAgICAgICAgICAgMHg1MDFDCisjZGVmaW5lIE1UUF9ERVZJQ0VfUFJPUEVSVFlfVVBMT0FEX1VSTCAgICAgICAgICAgICAgICAgICAgICAweDUwMUQKKyNkZWZpbmUgTVRQX0RFVklDRV9QUk9QRVJUWV9BUlRJU1QgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NTAxRQorI2RlZmluZSBNVFBfREVWSUNFX1BST1BFUlRZX0NPUFlSSUdIVF9JTkZPICAgICAgICAgICAgICAgICAgMHg1MDFGCisjZGVmaW5lIE1UUF9ERVZJQ0VfUFJPUEVSVFlfU1lOQ0hST05JWkFUSU9OX1BBUlRORVIgICAgICAgICAweEQ0MDEKKyNkZWZpbmUgTVRQX0RFVklDRV9QUk9QRVJUWV9ERVZJQ0VfRlJJRU5ETFlfTkFNRSAgICAgICAgICAgIDB4RDQwMgorI2RlZmluZSBNVFBfREVWSUNFX1BST1BFUlRZX1ZPTFVNRSAgICAgICAgICAgICAgICAgICAgICAgICAgMHhENDAzCisjZGVmaW5lIE1UUF9ERVZJQ0VfUFJPUEVSVFlfU1VQUE9SVEVEX0ZPUk1BVFNfT1JERVJFRCAgICAgICAweEQ0MDQKKyNkZWZpbmUgTVRQX0RFVklDRV9QUk9QRVJUWV9ERVZJQ0VfSUNPTiAgICAgICAgICAgICAgICAgICAgIDB4RDQwNQorI2RlZmluZSBNVFBfREVWSUNFX1BST1BFUlRZX1BMQVlCQUNLX1JBVEUgICAgICAgICAgICAgICAgICAgMHhENDEwCisjZGVmaW5lIE1UUF9ERVZJQ0VfUFJPUEVSVFlfUExBWUJBQ0tfT0JKRUNUICAgICAgICAgICAgICAgICAweEQ0MTEKKyNkZWZpbmUgTVRQX0RFVklDRV9QUk9QRVJUWV9QTEFZQkFDS19DT05UQUlORVJfSU5ERVggICAgICAgIDB4RDQxMgorI2RlZmluZSBNVFBfREVWSUNFX1BST1BFUlRZX1NFU1NJT05fSU5JVElBVE9SX1ZFUlNJT05fSU5GTyAgMHhENDA2CisjZGVmaW5lIE1UUF9ERVZJQ0VfUFJPUEVSVFlfUEVSQ0VJVkVEX0RFVklDRV9UWVBFICAgICAgICAgICAweEQ0MDcKKworLy8gTVRQIE9wZXJhdGlvbiBDb2RlcworI2RlZmluZSBNVFBfT1BFUkFUSU9OX0dFVF9ERVZJQ0VfSU5GTyAgICAgICAgICAgICAgICAgICAgICAgMHgxMDAxCisjZGVmaW5lIE1UUF9PUEVSQVRJT05fT1BFTl9TRVNTSU9OICAgICAgICAgICAgICAgICAgICAgICAgICAweDEwMDIKKyNkZWZpbmUgTVRQX09QRVJBVElPTl9DTE9TRV9TRVNTSU9OICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTAwMworI2RlZmluZSBNVFBfT1BFUkFUSU9OX0dFVF9TVE9SQUdFX0lEUyAgICAgICAgICAgICAgICAgICAgICAgMHgxMDA0CisjZGVmaW5lIE1UUF9PUEVSQVRJT05fR0VUX1NUT1JBR0VfSU5GTyAgICAgICAgICAgICAgICAgICAgICAweDEwMDUKKyNkZWZpbmUgTVRQX09QRVJBVElPTl9HRVRfTlVNX09CSkVDVFMgICAgICAgICAgICAgICAgICAgICAgIDB4MTAwNgorI2RlZmluZSBNVFBfT1BFUkFUSU9OX0dFVF9PQkpFQ1RfSEFORExFUyAgICAgICAgICAgICAgICAgICAgMHgxMDA3CisjZGVmaW5lIE1UUF9PUEVSQVRJT05fR0VUX09CSkVDVF9JTkZPICAgICAgICAgICAgICAgICAgICAgICAweDEwMDgKKyNkZWZpbmUgTVRQX09QRVJBVElPTl9HRVRfT0JKRUNUICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTAwOQorI2RlZmluZSBNVFBfT1BFUkFUSU9OX0dFVF9USFVNQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxMDBBCisjZGVmaW5lIE1UUF9PUEVSQVRJT05fREVMRVRFX09CSkVDVCAgICAgICAgICAgICAgICAgICAgICAgICAweDEwMEIKKyNkZWZpbmUgTVRQX09QRVJBVElPTl9TRU5EX09CSkVDVF9JTkZPICAgICAgICAgICAgICAgICAgICAgIDB4MTAwQworI2RlZmluZSBNVFBfT1BFUkFUSU9OX1NFTkRfT0JKRUNUICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxMDBECisjZGVmaW5lIE1UUF9PUEVSQVRJT05fSU5JVElBVEVfQ0FQVFVSRSAgICAgICAgICAgICAgICAgICAgICAweDEwMEUKKyNkZWZpbmUgTVRQX09QRVJBVElPTl9GT1JNQVRfU1RPUkUgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTAwRgorI2RlZmluZSBNVFBfT1BFUkFUSU9OX1JFU0VUX0RFVklDRSAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxMDEwCisjZGVmaW5lIE1UUF9PUEVSQVRJT05fU0VMRl9URVNUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDEwMTEKKyNkZWZpbmUgTVRQX09QRVJBVElPTl9TRVRfT0JKRUNUX1BST1RFQ1RJT04gICAgICAgICAgICAgICAgIDB4MTAxMgorI2RlZmluZSBNVFBfT1BFUkFUSU9OX1BPV0VSX0RPV04gICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxMDEzCisjZGVmaW5lIE1UUF9PUEVSQVRJT05fR0VUX0RFVklDRV9QUk9QX0RFU0MgICAgICAgICAgICAgICAgICAweDEwMTQKKyNkZWZpbmUgTVRQX09QRVJBVElPTl9HRVRfREVWSUNFX1BST1BfVkFMVUUgICAgICAgICAgICAgICAgIDB4MTAxNQorI2RlZmluZSBNVFBfT1BFUkFUSU9OX1NFVF9ERVZJQ0VfUFJPUF9WQUxVRSAgICAgICAgICAgICAgICAgMHgxMDE2CisjZGVmaW5lIE1UUF9PUEVSQVRJT05fUkVTRVRfREVWSUNFX1BST1BfVkFMVUUgICAgICAgICAgICAgICAweDEwMTcKKyNkZWZpbmUgTVRQX09QRVJBVElPTl9URVJNSU5BVEVfT1BFTl9DQVBUVVJFICAgICAgICAgICAgICAgIDB4MTAxOAorI2RlZmluZSBNVFBfT1BFUkFUSU9OX01PVkVfT0JKRUNUICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxMDE5CisjZGVmaW5lIE1UUF9PUEVSQVRJT05fQ09QWV9PQkpFQ1QgICAgICAgICAgICAgICAgICAgICAgICAgICAweDEwMUEKKyNkZWZpbmUgTVRQX09QRVJBVElPTl9HRVRfUEFSVElBTF9PQkpFQ1QgICAgICAgICAgICAgICAgICAgIDB4MTAxQgorI2RlZmluZSBNVFBfT1BFUkFUSU9OX0lOSVRJQVRFX09QRU5fQ0FQVFVSRSAgICAgICAgICAgICAgICAgMHgxMDFDCisjZGVmaW5lIE1UUF9PUEVSQVRJT05fR0VUX09CSkVDVF9QUk9QU19TVVBQT1JURUQgICAgICAgICAgICAweDk4MDEKKyNkZWZpbmUgTVRQX09QRVJBVElPTl9HRVRfT0JKRUNUX1BST1BfREVTQyAgICAgICAgICAgICAgICAgIDB4OTgwMgorI2RlZmluZSBNVFBfT1BFUkFUSU9OX0dFVF9PQkpFQ1RfUFJPUF9WQUxVRSAgICAgICAgICAgICAgICAgMHg5ODAzCisjZGVmaW5lIE1UUF9PUEVSQVRJT05fU0VUX09CSkVDVF9QUk9QX1ZBTFVFICAgICAgICAgICAgICAgICAweDk4MDQKKyNkZWZpbmUgTVRQX09QRVJBVElPTl9HRVRfT0JKRUNUX1JFRkVSRU5DRVMgICAgICAgICAgICAgICAgIDB4OTgxMAorI2RlZmluZSBNVFBfT1BFUkFUSU9OX1NFVF9PQkpFQ1RfUkVGRVJFTkNFUyAgICAgICAgICAgICAgICAgMHg5ODExCisjZGVmaW5lIE1UUF9PUEVSQVRJT05fU0tJUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDk4MjAKKworLy8gTVRQIFJlc3BvbnNlIENvZGVzCisjZGVmaW5lIE1UUF9SRVNQT05TRV9VTkRFRklORUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMDAwCisjZGVmaW5lIE1UUF9SRVNQT05TRV9PSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMDAxCisjZGVmaW5lIE1UUF9SRVNQT05TRV9HRU5FUkFMX0VSUk9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMDAyCisjZGVmaW5lIE1UUF9SRVNQT05TRV9TRVNTSU9OX05PVF9PUEVOICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMDAzCisjZGVmaW5lIE1UUF9SRVNQT05TRV9JTlZBTElEX1RSQU5TQUNUSU9OX0lEICAgICAgICAgICAgICAgICAgICAgMHgyMDA0CisjZGVmaW5lIE1UUF9SRVNQT05TRV9PUEVSQVRJT05fTk9UX1NVUFBPUlRFRCAgICAgICAgICAgICAgICAgICAgMHgyMDA1CisjZGVmaW5lIE1UUF9SRVNQT05TRV9QQVJBTUVURVJfTk9UX1NVUFBPUlRFRCAgICAgICAgICAgICAgICAgICAgMHgyMDA2CisjZGVmaW5lIE1UUF9SRVNQT05TRV9JTkNPTVBMRVRFX1RSQU5TRkVSICAgICAgICAgICAgICAgICAgICAgICAgMHgyMDA3CisjZGVmaW5lIE1UUF9SRVNQT05TRV9JTlZBTElEX1NUT1JBR0VfSUQgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMDA4CisjZGVmaW5lIE1UUF9SRVNQT05TRV9JTlZBTElEX09CSkVDVF9IQU5ETEUgICAgICAgICAgICAgICAgICAgICAgMHgyMDA5CisjZGVmaW5lIE1UUF9SRVNQT05TRV9ERVZJQ0VfUFJPUF9OT1RfU1VQUE9SVEVEICAgICAgICAgICAgICAgICAgMHgyMDBBCisjZGVmaW5lIE1UUF9SRVNQT05TRV9JTlZBTElEX09CSkVDVF9GT1JNQVRfQ09ERSAgICAgICAgICAgICAgICAgMHgyMDBCCisjZGVmaW5lIE1UUF9SRVNQT05TRV9TVE9SQUdFX0ZVTEwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMDBDCisjZGVmaW5lIE1UUF9SRVNQT05TRV9PQkpFQ1RfV1JJVEVfUFJPVEVDVEVEICAgICAgICAgICAgICAgICAgICAgMHgyMDBECisjZGVmaW5lIE1UUF9SRVNQT05TRV9TVE9SRV9SRUFEX09OTFkgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMDBFCisjZGVmaW5lIE1UUF9SRVNQT05TRV9BQ0NFU1NfREVOSUVEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMDBGCisjZGVmaW5lIE1UUF9SRVNQT05TRV9OT19USFVNQk5BSUxfUFJFU0VOVCAgICAgICAgICAgICAgICAgICAgICAgMHgyMDEwCisjZGVmaW5lIE1UUF9SRVNQT05TRV9TRUxGX1RFU1RfRkFJTEVEICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMDExCisjZGVmaW5lIE1UUF9SRVNQT05TRV9QQVJUSUFMX0RFTEVUSU9OICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMDEyCisjZGVmaW5lIE1UUF9SRVNQT05TRV9TVE9SRV9OT1RfQVZBSUxBQkxFICAgICAgICAgICAgICAgICAgICAgICAgMHgyMDEzCisjZGVmaW5lIE1UUF9SRVNQT05TRV9TUEVDSUZJQ0FUSU9OX0JZX0ZPUk1BVF9VTlNVUFBPUlRFRCAgICAgICAgMHgyMDE0CisjZGVmaW5lIE1UUF9SRVNQT05TRV9OT19WQUxJRF9PQkpFQ1RfSU5GTyAgICAgICAgICAgICAgICAgICAgICAgMHgyMDE1CisjZGVmaW5lIE1UUF9SRVNQT05TRV9JTlZBTElEX0NPREVfRk9STUFUICAgICAgICAgICAgICAgICAgICAgICAgMHgyMDE2CisjZGVmaW5lIE1UUF9SRVNQT05TRV9VTktOT1dOX1ZFTkRPUl9DT0RFICAgICAgICAgICAgICAgICAgICAgICAgMHgyMDE3CisjZGVmaW5lIE1UUF9SRVNQT05TRV9DQVBUVVJFX0FMUkVBRFlfVEVSTUlOQVRFRCAgICAgICAgICAgICAgICAgMHgyMDE4CisjZGVmaW5lIE1UUF9SRVNQT05TRV9ERVZJQ0VfQlVTWSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMDE5CisjZGVmaW5lIE1UUF9SRVNQT05TRV9JTlZBTElEX1BBUkVOVF9PQkpFQ1QgICAgICAgICAgICAgICAgICAgICAgMHgyMDFBCisjZGVmaW5lIE1UUF9SRVNQT05TRV9JTlZBTElEX0RFVklDRV9QUk9QX0ZPUk1BVCAgICAgICAgICAgICAgICAgMHgyMDFCCisjZGVmaW5lIE1UUF9SRVNQT05TRV9JTlZBTElEX0RFVklDRV9QUk9QX1ZBTFVFICAgICAgICAgICAgICAgICAgMHgyMDFDCisjZGVmaW5lIE1UUF9SRVNQT05TRV9JTlZBTElEX1BBUkFNRVRFUiAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMDFECisjZGVmaW5lIE1UUF9SRVNQT05TRV9TRVNTSU9OX0FMUkVBRFlfT1BFTiAgICAgICAgICAgICAgICAgICAgICAgMHgyMDFFCisjZGVmaW5lIE1UUF9SRVNQT05TRV9UUkFOU0FDVElPTl9DQU5DRUxMRUQgICAgICAgICAgICAgICAgICAgICAgMHgyMDFGCisjZGVmaW5lIE1UUF9SRVNQT05TRV9TUEVDSUZJQ0FUSU9OX09GX0RFU1RJTkFUSU9OX1VOU1VQUE9SVEVEICAgMHgyMDIwCisjZGVmaW5lIE1UUF9SRVNQT05TRV9JTlZBTElEX09CSkVDVF9QUk9QX0NPREUgICAgICAgICAgICAgICAgICAgMHhBODAxCisjZGVmaW5lIE1UUF9SRVNQT05TRV9JTlZBTElEX09CSkVDVF9QUk9QX0ZPUk1BVCAgICAgICAgICAgICAgICAgMHhBODAyCisjZGVmaW5lIE1UUF9SRVNQT05TRV9JTlZBTElEX09CSkVDVF9QUk9QX1ZBTFVFICAgICAgICAgICAgICAgICAgMHhBODAzCisjZGVmaW5lIE1UUF9SRVNQT05TRV9JTlZBTElEX09CSkVDVF9SRUZFUkVOQ0UgICAgICAgICAgICAgICAgICAgMHhBODA0CisjZGVmaW5lIE1UUF9SRVNQT05TRV9HUk9VUF9OT1RfU1VQUE9SVEVEICAgICAgICAgICAgICAgICAgICAgICAgMHhBODA1CisjZGVmaW5lIE1UUF9SRVNQT05TRV9JTlZBTElEX0RBVEFTRVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhBODA2CisjZGVmaW5lIE1UUF9SRVNQT05TRV9TUEVDSUZJQ0FUSU9OX0JZX0dST1VQX1VOU1VQUE9SVEVEICAgICAgICAgMHhBODA3CisjZGVmaW5lIE1UUF9SRVNQT05TRV9TUEVDSUZJQ0FUSU9OX0JZX0RFUFRIX1VOU1VQUE9SVEVEICAgICAgICAgMHhBODA4CisjZGVmaW5lIE1UUF9SRVNQT05TRV9PQkpFQ1RfVE9PX0xBUkdFICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhBODA5CisjZGVmaW5lIE1UUF9SRVNQT05TRV9PQkpFQ1RfUFJPUF9OT1RfU1VQUE9SVEVEICAgICAgICAgICAgICAgICAgMHhBODBBCisKKy8vIE1UUCBFdmVudCBDb2RlcworI2RlZmluZSBNVFBfRVZFTlRfVU5ERUZJTkVEICAgICAgICAgICAgICAgICAgICAgICAgIDB4NDAwMAorI2RlZmluZSBNVFBfRVZFTlRfQ0FOQ0VMX1RSQU5TQUNUSU9OICAgICAgICAgICAgICAgIDB4NDAwMQorI2RlZmluZSBNVFBfRVZFTlRfT0JKRUNUX0FEREVEICAgICAgICAgICAgICAgICAgICAgIDB4NDAwMgorI2RlZmluZSBNVFBfRVZFTlRfT0JKRUNUX1JFTU9WRUQgICAgICAgICAgICAgICAgICAgIDB4NDAwMworI2RlZmluZSBNVFBfRVZFTlRfU1RPUkVfQURERUQgICAgICAgICAgICAgICAgICAgICAgIDB4NDAwNAorI2RlZmluZSBNVFBfRVZFTlRfU1RPUkVfUkVNT1ZFRCAgICAgICAgICAgICAgICAgICAgIDB4NDAwNQorI2RlZmluZSBNVFBfRVZFTlRfREVWSUNFX1BST1BfQ0hBTkdFRCAgICAgICAgICAgICAgIDB4NDAwNgorI2RlZmluZSBNVFBfRVZFTlRfT0JKRUNUX0lORk9fQ0hBTkdFRCAgICAgICAgICAgICAgIDB4NDAwNworI2RlZmluZSBNVFBfRVZFTlRfREVWSUNFX0lORk9fQ0hBTkdFRCAgICAgICAgICAgICAgIDB4NDAwOAorI2RlZmluZSBNVFBfRVZFTlRfUkVRVUVTVF9PQkpFQ1RfVFJBTlNGRVIgICAgICAgICAgIDB4NDAwOQorI2RlZmluZSBNVFBfRVZFTlRfU1RPUkVfRlVMTCAgICAgICAgICAgICAgICAgICAgICAgIDB4NDAwQQorI2RlZmluZSBNVFBfRVZFTlRfREVWSUNFX1JFU0VUICAgICAgICAgICAgICAgICAgICAgIDB4NDAwQgorI2RlZmluZSBNVFBfRVZFTlRfU1RPUkFHRV9JTkZPX0NIQU5HRUQgICAgICAgICAgICAgIDB4NDAwQworI2RlZmluZSBNVFBfRVZFTlRfQ0FQVFVSRV9DT01QTEVURSAgICAgICAgICAgICAgICAgIDB4NDAwRAorI2RlZmluZSBNVFBfRVZFTlRfVU5SRVBPUlRFRF9TVEFUVVMgICAgICAgICAgICAgICAgIDB4NDAwRQorI2RlZmluZSBNVFBfRVZFTlRfT0JKRUNUX1BST1BfQ0hBTkdFRCAgICAgICAgICAgICAgIDB4QzgwMQorI2RlZmluZSBNVFBfRVZFTlRfT0JKRUNUX1BST1BfREVTQ19DSEFOR0VEICAgICAgICAgIDB4QzgwMgorI2RlZmluZSBNVFBfRVZFTlRfT0JKRUNUX1JFRkVSRU5DRVNfQ0hBTkdFRCAgICAgICAgIDB4QzgwMworCisvLyBTdG9yYWdlIFR5cGUKKyNkZWZpbmUgTVRQX1NUT1JBR0VfRklYRURfUk9NICAgICAgICAgICAgICAgICAgICAgICAweDAwMDEKKyNkZWZpbmUgTVRQX1NUT1JBR0VfUkVNT1ZBQkxFX1JPTSAgICAgICAgICAgICAgICAgICAweDAwMDIKKyNkZWZpbmUgTVRQX1NUT1JBR0VfRklYRURfUkFNICAgICAgICAgICAgICAgICAgICAgICAweDAwMDMKKyNkZWZpbmUgTVRQX1NUT1JBR0VfUkVNT1ZBQkxFX1JBTSAgICAgICAgICAgICAgICAgICAweDAwMDQKKworLy8gU3RvcmFnZSBGaWxlIFN5c3RlbQorI2RlZmluZSBNVFBfU1RPUkFHRV9GSUxFU1lTVEVNX0ZMQVQgICAgICAgICAgICAgICAgIDB4MDAwMQorI2RlZmluZSBNVFBfU1RPUkFHRV9GSUxFU1lTVEVNX0hJRVJBUkNISUNBTCAgICAgICAgIDB4MDAwMgorI2RlZmluZSBNVFBfU1RPUkFHRV9GSUxFU1lTVEVNX0RDRiAgICAgICAgICAgICAgICAgIDB4MDAwMworCisvLyBTdG9yYWdlIEFjY2VzcyBDYXBhYmlsaXR5CisjZGVmaW5lIE1UUF9TVE9SQUdFX1JFQURfV1JJVEUgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwCisjZGVmaW5lIE1UUF9TVE9SQUdFX1JFQURfT05MWV9XSVRIT1VUX0RFTEVURSAgICAgICAgMHgwMDAxCisjZGVmaW5lIE1UUF9TVE9SQUdFX1JFQURfT05MWV9XSVRIX0RFTEVURSAgICAgICAgICAgMHgwMDAyCisKKy8vIEFzc29jaWF0aW9uIFR5cGUKKyNkZWZpbmUgTVRQX0FTU09DSUFUSU9OX1RZUEVfVU5ERUZJTkVEICAgICAgICAgICAgICAweDAwMDAKKyNkZWZpbmUgTVRQX0FTU09DSUFUSU9OX1RZUEVfR0VORVJJQ19GT0xERVIgICAgICAgICAweDAwMDEKKworI2VuZGlmIC8vIF9NVFBfSApkaWZmIC0tZ2l0IGEvbWVkaWEvdGVzdHMvQ2FtZXJhQnJvd3Nlci9BbmRyb2lkLm1rIGIvbWVkaWEvdGVzdHMvQ2FtZXJhQnJvd3Nlci9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMzZDI5NzYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS90ZXN0cy9DYW1lcmFCcm93c2VyL0FuZHJvaWQubWsKQEAgLTAsMCArMSw4IEBACitMT0NBTF9QQVRIOj0gJChjYWxsIG15LWRpcikKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorCitMT0NBTF9TUkNfRklMRVMgOj0gJChjYWxsIGFsbC1zdWJkaXItamF2YS1maWxlcykKKworTE9DQUxfUEFDS0FHRV9OQU1FIDo9IENhbWVyYUJyb3dzZXIKKworaW5jbHVkZSAkKEJVSUxEX1BBQ0tBR0UpCmRpZmYgLS1naXQgYS9tZWRpYS90ZXN0cy9DYW1lcmFCcm93c2VyL0FuZHJvaWRNYW5pZmVzdC54bWwgYi9tZWRpYS90ZXN0cy9DYW1lcmFCcm93c2VyL0FuZHJvaWRNYW5pZmVzdC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWFlMGIwMQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL3Rlc3RzL0NhbWVyYUJyb3dzZXIvQW5kcm9pZE1hbmlmZXN0LnhtbApAQCAtMCwwICsxLDI4IEBACis8bWFuaWZlc3QgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgIHBhY2thZ2U9ImNvbS5hbmRyb2lkLmNhbWVyYWJyb3dzZXIiPgorCisgICAgPHVzZXMtcGVybWlzc2lvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQucGVybWlzc2lvbi5XUklURV9FWFRFUk5BTF9TVE9SQUdFIiAvPgorCisgICAgPGFwcGxpY2F0aW9uIGFuZHJvaWQ6bGFiZWw9IkBzdHJpbmcvYXBwX2xhYmVsIj4KKyAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iQ2FtZXJhQnJvd3NlciIgYW5kcm9pZDpsYWJlbD0iQ2FtZXJhIEJyb3dzZXIiPgorICAgICAgICAgICAgPGludGVudC1maWx0ZXI+CisgICAgICAgICAgICAgICAgPGFjdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmFjdGlvbi5NQUlOIiAvPgorICAgICAgICAgICAgICAgIDxjYXRlZ29yeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmNhdGVnb3J5LkxBVU5DSEVSIiAvPgorICAgICAgICAgICAgPC9pbnRlbnQtZmlsdGVyPgorICAgICAgICA8L2FjdGl2aXR5PgorCisgICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9IlN0b3JhZ2VCcm93c2VyIiAvPgorICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSJPYmplY3RCcm93c2VyIiAvPgorICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSJPYmplY3RWaWV3ZXIiIC8+CisKKyAgICAgICAgPHJlY2VpdmVyIGFuZHJvaWQ6bmFtZT0iVXNiUmVjZWl2ZXIiPgorICAgICAgICAgICAgPGludGVudC1maWx0ZXI+CisgICAgICAgICAgICAgICAgPGFjdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaGFyZHdhcmUuYWN0aW9uLlVTQl9DQU1FUkFfQVRUQUNIRUQiIC8+CisgICAgICAgICAgICAgICAgPGRhdGEgYW5kcm9pZDpzY2hlbWU9ImNvbnRlbnQiLz4KKyAgICAgICAgICAgIDwvaW50ZW50LWZpbHRlcj4KKyAgICAgICAgPC9yZWNlaXZlcj4KKworICAgIDwvYXBwbGljYXRpb24+CisKKworPC9tYW5pZmVzdD4KZGlmZiAtLWdpdCBhL21lZGlhL3Rlc3RzL0NhbWVyYUJyb3dzZXIvcmVzL2xheW91dC9vYmplY3RfaW5mby54bWwgYi9tZWRpYS90ZXN0cy9DYW1lcmFCcm93c2VyL3Jlcy9sYXlvdXQvb2JqZWN0X2luZm8ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM3ZmQ4MzAKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS90ZXN0cy9DYW1lcmFCcm93c2VyL3Jlcy9sYXlvdXQvb2JqZWN0X2luZm8ueG1sCkBAIC0wLDAgKzEsMTQ3IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLQorLyoKKyoqIENvcHlyaWdodCAyMDA4LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqKgorKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoqCisqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqKgorKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworLS0+Cis8VGFibGVMYXlvdXQgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgIGFuZHJvaWQ6aWQ9IkAraWQvb2JqZWN0X2luZm8iCisgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCI+CisgICAgPFRhYmxlUm93PgorICAgICAgICA8VGV4dFZpZXcgYW5kcm9pZDppZD0iQCtpZC9uYW1lX2xhYmVsIgorICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL25hbWVfbGFiZWwiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9ncmF2aXR5PSJyaWdodCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpblJpZ2h0PSI4ZGlwIgorICAgICAgICAgICAgc3R5bGU9IkBzdHlsZS9pbmZvX2xhYmVsIiAvPgorCisgICAgICAgIDxUZXh0VmlldyBhbmRyb2lkOmlkPSJAK2lkL25hbWUiCisgICAgICAgICAgICBzdHlsZT0iQHN0eWxlL2luZm9fdmFsdWUiIC8+CisgICAgPC9UYWJsZVJvdz4KKyAgICA8VGFibGVSb3c+CisgICAgICAgIDxUZXh0VmlldyBhbmRyb2lkOmlkPSJAK2lkL3NpemVfbGFiZWwiCisgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvc2l6ZV9sYWJlbCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2dyYXZpdHk9InJpZ2h0IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luUmlnaHQ9IjhkaXAiCisgICAgICAgICAgICBzdHlsZT0iQHN0eWxlL2luZm9fbGFiZWwiIC8+CisKKyAgICAgICAgPFRleHRWaWV3IGFuZHJvaWQ6aWQ9IkAraWQvc2l6ZSIKKyAgICAgICAgICAgIHN0eWxlPSJAc3R5bGUvaW5mb192YWx1ZSIgLz4KKyAgICA8L1RhYmxlUm93PgorICAgIDxUYWJsZVJvdz4KKyAgICAgICAgPFRleHRWaWV3IGFuZHJvaWQ6aWQ9IkAraWQvdGh1bWJfd2lkdGhfbGFiZWwiCisgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvdGh1bWJfd2lkdGhfbGFiZWwiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9ncmF2aXR5PSJyaWdodCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpblJpZ2h0PSI4ZGlwIgorICAgICAgICAgICAgc3R5bGU9IkBzdHlsZS9pbmZvX2xhYmVsIiAvPgorCisgICAgICAgIDxUZXh0VmlldyBhbmRyb2lkOmlkPSJAK2lkL3RodW1iX3dpZHRoIgorICAgICAgICAgICAgc3R5bGU9IkBzdHlsZS9pbmZvX3ZhbHVlIiAvPgorICAgIDwvVGFibGVSb3c+CisgICAgPFRhYmxlUm93PgorICAgICAgICA8VGV4dFZpZXcgYW5kcm9pZDppZD0iQCtpZC90aHVtYl9oZWlnaHRfbGFiZWwiCisgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvdGh1bWJfaGVpZ2h0X2xhYmVsIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfZ3Jhdml0eT0icmlnaHQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5SaWdodD0iOGRpcCIKKyAgICAgICAgICAgIHN0eWxlPSJAc3R5bGUvaW5mb19sYWJlbCIgLz4KKworICAgICAgICA8VGV4dFZpZXcgYW5kcm9pZDppZD0iQCtpZC90aHVtYl9oZWlnaHQiCisgICAgICAgICAgICBzdHlsZT0iQHN0eWxlL2luZm9fdmFsdWUiIC8+CisgICAgPC9UYWJsZVJvdz4KKyAgICA8VGFibGVSb3c+CisgICAgICAgIDxUZXh0VmlldyBhbmRyb2lkOmlkPSJAK2lkL3RodW1iX3NpemVfbGFiZWwiCisgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvdGh1bWJfc2l6ZV9sYWJlbCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2dyYXZpdHk9InJpZ2h0IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luUmlnaHQ9IjhkaXAiCisgICAgICAgICAgICBzdHlsZT0iQHN0eWxlL2luZm9fbGFiZWwiIC8+CisKKyAgICAgICAgPFRleHRWaWV3IGFuZHJvaWQ6aWQ9IkAraWQvdGh1bWJfc2l6ZSIKKyAgICAgICAgICAgIHN0eWxlPSJAc3R5bGUvaW5mb192YWx1ZSIgLz4KKyAgICA8L1RhYmxlUm93PgorICAgIDxUYWJsZVJvdz4KKyAgICAgICAgPFRleHRWaWV3IGFuZHJvaWQ6aWQ9IkAraWQvd2lkdGhfbGFiZWwiCisgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvd2lkdGhfbGFiZWwiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9ncmF2aXR5PSJyaWdodCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpblJpZ2h0PSI4ZGlwIgorICAgICAgICAgICAgc3R5bGU9IkBzdHlsZS9pbmZvX2xhYmVsIiAvPgorCisgICAgICAgIDxUZXh0VmlldyBhbmRyb2lkOmlkPSJAK2lkL3dpZHRoIgorICAgICAgICAgICAgc3R5bGU9IkBzdHlsZS9pbmZvX3ZhbHVlIiAvPgorICAgIDwvVGFibGVSb3c+CisgICAgPFRhYmxlUm93PgorICAgICAgICA8VGV4dFZpZXcgYW5kcm9pZDppZD0iQCtpZC9oZWlnaHRfbGFiZWwiCisgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvaGVpZ2h0X2xhYmVsIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfZ3Jhdml0eT0icmlnaHQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5SaWdodD0iOGRpcCIKKyAgICAgICAgICAgIHN0eWxlPSJAc3R5bGUvaW5mb19sYWJlbCIgLz4KKworICAgICAgICA8VGV4dFZpZXcgYW5kcm9pZDppZD0iQCtpZC9oZWlnaHQiCisgICAgICAgICAgICBzdHlsZT0iQHN0eWxlL2luZm9fdmFsdWUiIC8+CisgICAgPC9UYWJsZVJvdz4KKyAgICA8VGFibGVSb3c+CisgICAgICAgIDxUZXh0VmlldyBhbmRyb2lkOmlkPSJAK2lkL2RlcHRoX2xhYmVsIgorICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL2RlcHRoX2xhYmVsIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfZ3Jhdml0eT0icmlnaHQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5SaWdodD0iOGRpcCIKKyAgICAgICAgICAgIHN0eWxlPSJAc3R5bGUvaW5mb19sYWJlbCIgLz4KKworICAgICAgICA8VGV4dFZpZXcgYW5kcm9pZDppZD0iQCtpZC9kZXB0aCIKKyAgICAgICAgICAgIHN0eWxlPSJAc3R5bGUvaW5mb192YWx1ZSIgLz4KKyAgICA8L1RhYmxlUm93PgorICAgIDxUYWJsZVJvdz4KKyAgICAgICAgPFRleHRWaWV3IGFuZHJvaWQ6aWQ9IkAraWQvc2VxdWVuY2VfbGFiZWwiCisgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvc2VxdWVuY2VfbGFiZWwiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9ncmF2aXR5PSJyaWdodCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpblJpZ2h0PSI4ZGlwIgorICAgICAgICAgICAgc3R5bGU9IkBzdHlsZS9pbmZvX2xhYmVsIiAvPgorCisgICAgICAgIDxUZXh0VmlldyBhbmRyb2lkOmlkPSJAK2lkL3NlcXVlbmNlIgorICAgICAgICAgICAgc3R5bGU9IkBzdHlsZS9pbmZvX3ZhbHVlIiAvPgorICAgIDwvVGFibGVSb3c+CisgICAgPFRhYmxlUm93PgorICAgICAgICA8VGV4dFZpZXcgYW5kcm9pZDppZD0iQCtpZC9jcmVhdGVkX2xhYmVsIgorICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL2NyZWF0ZWRfbGFiZWwiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9ncmF2aXR5PSJyaWdodCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpblJpZ2h0PSI4ZGlwIgorICAgICAgICAgICAgc3R5bGU9IkBzdHlsZS9pbmZvX2xhYmVsIiAvPgorCisgICAgICAgIDxUZXh0VmlldyBhbmRyb2lkOmlkPSJAK2lkL2NyZWF0ZWQiCisgICAgICAgICAgICBzdHlsZT0iQHN0eWxlL2luZm9fdmFsdWUiIC8+CisgICAgPC9UYWJsZVJvdz4KKyAgICA8VGFibGVSb3c+CisgICAgICAgIDxUZXh0VmlldyBhbmRyb2lkOmlkPSJAK2lkL21vZGlmaWVkX2xhYmVsIgorICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL21vZGlmaWVkX2xhYmVsIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfZ3Jhdml0eT0icmlnaHQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5SaWdodD0iOGRpcCIKKyAgICAgICAgICAgIHN0eWxlPSJAc3R5bGUvaW5mb19sYWJlbCIgLz4KKworICAgICAgICA8VGV4dFZpZXcgYW5kcm9pZDppZD0iQCtpZC9tb2RpZmllZCIKKyAgICAgICAgICAgIHN0eWxlPSJAc3R5bGUvaW5mb192YWx1ZSIgLz4KKyAgICA8L1RhYmxlUm93PgorICAgIDxUYWJsZVJvdz4KKyAgICAgICAgPFRleHRWaWV3IGFuZHJvaWQ6aWQ9IkAraWQva2V5d29yZHNfbGFiZWwiCisgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcva2V5d29yZHNfbGFiZWwiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9ncmF2aXR5PSJyaWdodCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpblJpZ2h0PSI4ZGlwIgorICAgICAgICAgICAgc3R5bGU9IkBzdHlsZS9pbmZvX2xhYmVsIiAvPgorCisgICAgICAgIDxUZXh0VmlldyBhbmRyb2lkOmlkPSJAK2lkL2tleXdvcmRzIgorICAgICAgICAgICAgc3R5bGU9IkBzdHlsZS9pbmZvX3ZhbHVlIiAvPgorICAgIDwvVGFibGVSb3c+CisgICAgPFRhYmxlUm93PgorICAgICAgICA8SW1hZ2VWaWV3IGFuZHJvaWQ6aWQ9IkAraWQvdGh1bWJuYWlsIiAvPgorICAgIDwvVGFibGVSb3c+Cis8L1RhYmxlTGF5b3V0PgorCmRpZmYgLS1naXQgYS9tZWRpYS90ZXN0cy9DYW1lcmFCcm93c2VyL3Jlcy9sYXlvdXQvb2JqZWN0X2xpc3QueG1sIGIvbWVkaWEvdGVzdHMvQ2FtZXJhQnJvd3Nlci9yZXMvbGF5b3V0L29iamVjdF9saXN0LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMGMxOGJiCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvdGVzdHMvQ2FtZXJhQnJvd3Nlci9yZXMvbGF5b3V0L29iamVjdF9saXN0LnhtbApAQCAtMCwwICsxLDMzIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICAKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPExpbmVhckxheW91dCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0iaG9yaXpvbnRhbCIKKyAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iZmlsbF9wYXJlbnQiIAorICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iZmlsbF9wYXJlbnQiPgorICAgIAorICAgIDxJbWFnZVZpZXcgYW5kcm9pZDppZD0iQCtpZC90aHVtYm5haWwiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IiAvPgorCisgICAgPFRleHRWaWV3IGFuZHJvaWQ6aWQ9IkAraWQvbmFtZSIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6dGV4dEFwcGVhcmFuY2U9Ij9hbmRyb2lkOmF0dHIvdGV4dEFwcGVhcmFuY2VMYXJnZSIKKyAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJjZW50ZXJfdmVydGljYWwiCisgICAgICAgIGFuZHJvaWQ6cGFkZGluZ0xlZnQ9IjZkaXAiCisgICAgICAgIGFuZHJvaWQ6bWluSGVpZ2h0PSI/YW5kcm9pZDphdHRyL2xpc3RQcmVmZXJyZWRJdGVtSGVpZ2h0IiAvPgorPC9MaW5lYXJMYXlvdXQ+CmRpZmYgLS1naXQgYS9tZWRpYS90ZXN0cy9DYW1lcmFCcm93c2VyL3Jlcy9tZW51L29iamVjdF9tZW51LnhtbCBiL21lZGlhL3Rlc3RzL0NhbWVyYUJyb3dzZXIvcmVzL21lbnUvb2JqZWN0X21lbnUueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEwODY1ZjAKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS90ZXN0cy9DYW1lcmFCcm93c2VyL3Jlcy9tZW51L29iamVjdF9tZW51LnhtbApAQCAtMCwwICsxLDIzIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8bWVudSB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiPgorCisgICAgPGl0ZW0gYW5kcm9pZDppZD0iQCtpZC9zYXZlIgorICAgICAgICBhbmRyb2lkOnRpdGxlPSJAc3RyaW5nL3NhdmVfaXRlbSIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOmlkPSJAK2lkL2RlbGV0ZSIKKyAgICAgICAgYW5kcm9pZDp0aXRsZT0iQHN0cmluZy9kZWxldGVfaXRlbSIgLz4KKzwvbWVudT4KZGlmZiAtLWdpdCBhL21lZGlhL3Rlc3RzL0NhbWVyYUJyb3dzZXIvcmVzL3ZhbHVlcy9zdHJpbmdzLnhtbCBiL21lZGlhL3Rlc3RzL0NhbWVyYUJyb3dzZXIvcmVzL3ZhbHVlcy9zdHJpbmdzLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NmM1MTExCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvdGVzdHMvQ2FtZXJhQnJvd3Nlci9yZXMvdmFsdWVzL3N0cmluZ3MueG1sCkBAIC0wLDAgKzEsNDQgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzxyZXNvdXJjZXM+CisgICAgPHN0cmluZyBuYW1lPSJhcHBfbGFiZWwiPkNhbWVyYSBCcm93c2VyPC9zdHJpbmc+CisKKyAgICA8IS0tIGZvciBvYmplY3QgaW5mbyAtLT4KKyAgICA8c3RyaW5nIG5hbWU9Im5hbWVfbGFiZWwiPk5hbWU6IDwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ic2l6ZV9sYWJlbCI+U2l6ZTogPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJ0aHVtYl93aWR0aF9sYWJlbCI+VGh1bWIgV2lkdGg6IDwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0idGh1bWJfaGVpZ2h0X2xhYmVsIj5UaHVtYiBIZWlnaHQ6IDwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0idGh1bWJfc2l6ZV9sYWJlbCI+VGh1bWIgU2l6ZTogPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJ3aWR0aF9sYWJlbCI+V2lkdGg6IDwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iaGVpZ2h0X2xhYmVsIj5IZWlnaHQ6IDwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGVwdGhfbGFiZWwiPkRlcHRoOiA8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InNlcXVlbmNlX2xhYmVsIj5TZXF1ZW5jZTogPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJjcmVhdGVkX2xhYmVsIj5DcmVhdGVkOiA8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1vZGlmaWVkX2xhYmVsIj5Nb2RpZmllZDogPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJrZXl3b3Jkc19sYWJlbCI+S2V5d29yZHM6IDwvc3RyaW5nPgorCisgICAgPCEtLSBtZW51IGl0ZW1zIC0tPgorICAgIDxzdHJpbmcgbmFtZT0ic2F2ZV9pdGVtIj5TYXZlPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkZWxldGVfaXRlbSI+RGVsZXRlPC9zdHJpbmc+CisKKyAgICA8IS0tIHRvYXN0cyAtLT4KKyAgICA8c3RyaW5nIG5hbWU9Im9iamVjdF9zYXZlZF9tZXNzYWdlIj5PYmplY3Qgc2F2ZWQ8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InNhdmVfZmFpbGVkX21lc3NhZ2UiPkNvdWxkIG5vdCBzYXZlIG9iamVjdDwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ib2JqZWN0X2RlbGV0ZWRfbWVzc2FnZSI+T2JqZWN0IGRlbGV0ZWQ8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRlbGV0ZV9mYWlsZWRfbWVzc2FnZSI+Q291bGQgbm90IGRlbGV0ZSBvYmplY3Q8L3N0cmluZz4KKworPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9tZWRpYS90ZXN0cy9DYW1lcmFCcm93c2VyL3Jlcy92YWx1ZXMvc3R5bGVzLnhtbCBiL21lZGlhL3Rlc3RzL0NhbWVyYUJyb3dzZXIvcmVzL3ZhbHVlcy9zdHlsZXMueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM4Njk5ODUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS90ZXN0cy9DYW1lcmFCcm93c2VyL3Jlcy92YWx1ZXMvc3R5bGVzLnhtbApAQCAtMCwwICsxLDM0IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8cmVzb3VyY2VzPgorICAgIDxzdHlsZSBuYW1lPSJpbmZvX2xhYmVsIj4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpsYXlvdXRfaGVpZ2h0Ij53cmFwX2NvbnRlbnQ8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6bGF5b3V0X3dpZHRoIj53cmFwX2NvbnRlbnQ8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6dGV4dFNpemUiPjE0c3A8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6dGV4dFN0eWxlIj5ib2xkPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnBhZGRpbmdSaWdodCI+NGRpcDwvaXRlbT4KKyAgICA8L3N0eWxlPgorCisgICAgPHN0eWxlIG5hbWU9ImluZm9fdmFsdWUiPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmxheW91dF9oZWlnaHQiPndyYXBfY29udGVudDwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpsYXlvdXRfd2lkdGgiPndyYXBfY29udGVudDwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp0ZXh0U2l6ZSI+MTRzcDwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp0ZXh0U3R5bGUiPm5vcm1hbDwvaXRlbT4KKyAgICA8L3N0eWxlPgorCis8L3Jlc291cmNlcz4KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvdGVzdHMvQ2FtZXJhQnJvd3Nlci9zcmMvY29tL2FuZHJvaWQvY2FtZXJhYnJvd3Nlci9DYW1lcmFCcm93c2VyLmphdmEgYi9tZWRpYS90ZXN0cy9DYW1lcmFCcm93c2VyL3NyYy9jb20vYW5kcm9pZC9jYW1lcmFicm93c2VyL0NhbWVyYUJyb3dzZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMDQ4NzNhCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvdGVzdHMvQ2FtZXJhQnJvd3Nlci9zcmMvY29tL2FuZHJvaWQvY2FtZXJhYnJvd3Nlci9DYW1lcmFCcm93c2VyLmphdmEKQEAgLTAsMCArMSwxMDMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLmNhbWVyYWJyb3dzZXI7CisKK2ltcG9ydCBhbmRyb2lkLmFwcC5MaXN0QWN0aXZpdHk7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRSZXNvbHZlcjsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OworaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2UuQ29udGVudE9ic2VydmVyOworaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2UuQ3Vyc29yOworaW1wb3J0IGFuZHJvaWQubmV0LlVyaTsKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKK2ltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXI7CitpbXBvcnQgYW5kcm9pZC5wcm92aWRlci5NdHA7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5MaXN0QWRhcHRlcjsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5MaXN0VmlldzsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5TaW1wbGVDdXJzb3JBZGFwdGVyOworCisgLyoqCisgKiBBIGxpc3QgdmlldyBkaXNwbGF5aW5nIGFsbCBjb25uZWN0ZWQgY2FtZXJhcy4KKyAqLworcHVibGljIGNsYXNzIENhbWVyYUJyb3dzZXIgZXh0ZW5kcyBMaXN0QWN0aXZpdHkgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJDYW1lcmFCcm93c2VyIjsKKworICAgIHByaXZhdGUgTGlzdEFkYXB0ZXIgbUFkYXB0ZXI7CisgICAgcHJpdmF0ZSBDb250ZW50UmVzb2x2ZXIgbVJlc29sdmVyOworICAgIHByaXZhdGUgRGV2aWNlT2JzZXJ2ZXIgbURldmljZU9ic2VydmVyOworICAgIHByaXZhdGUgQ3Vyc29yIG1DdXJzb3I7CisKKyAgICBwcml2YXRlIGNsYXNzIERldmljZU9ic2VydmVyIGV4dGVuZHMgQ29udGVudE9ic2VydmVyIHsKKyAgICAgICAgRGV2aWNlT2JzZXJ2ZXIoSGFuZGxlciBoYW5kbGVyKSB7CisgICAgICAgICAgICBzdXBlcihoYW5kbGVyKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBvbkNoYW5nZShib29sZWFuIHNlbGZDaGFuZ2UpIHsKKyAgICAgICAgICAgIExvZy5kKFRBRywgIkRldmljZU9ic2VydmVyLm9uQ2hhbmdlIik7CisgICAgICAgICAgICBpZiAobUN1cnNvciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgbUN1cnNvci5yZXF1ZXJ5KCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBERVZJQ0VfQ09MVU1OUyA9CisgICAgICAgICBuZXcgU3RyaW5nW10geyBNdHAuRGV2aWNlLl9JRCwgTXRwLkRldmljZS5NQU5VRkFDVFVSRVIsIE10cC5EZXZpY2UuTU9ERUwgfTsKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG9uQ3JlYXRlKEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpIHsKKyAgICAgICAgc3VwZXIub25DcmVhdGUoc2F2ZWRJbnN0YW5jZVN0YXRlKTsKKyAgICAgICAgbVJlc29sdmVyID0gZ2V0Q29udGVudFJlc29sdmVyKCk7CisgICAgICAgIG1EZXZpY2VPYnNlcnZlciA9IG5ldyBEZXZpY2VPYnNlcnZlcihuZXcgSGFuZGxlcigpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvblJlc3VtZSgpIHsKKyAgICAgICAgc3VwZXIub25SZXN1bWUoKTsKKworICAgICAgICBDdXJzb3IgYyA9IGdldENvbnRlbnRSZXNvbHZlcigpLnF1ZXJ5KE10cC5EZXZpY2UuQ09OVEVOVF9VUkksCisgICAgICAgICAgICAgICAgREVWSUNFX0NPTFVNTlMsIG51bGwsIG51bGwsIG51bGwpOworICAgICAgICBMb2cuZChUQUcsICJxdWVyeSByZXR1cm5lZCAiICsgYyk7CisgICAgICAgIHN0YXJ0TWFuYWdpbmdDdXJzb3IoYyk7CisgICAgICAgIG1DdXJzb3IgPSBjOworCisgICAgICAgIC8vIE1hcCBDdXJzb3IgY29sdW1ucyB0byB2aWV3cyBkZWZpbmVkIGluIHNpbXBsZV9saXN0X2l0ZW1fMi54bWwKKyAgICAgICAgbUFkYXB0ZXIgPSBuZXcgU2ltcGxlQ3Vyc29yQWRhcHRlcih0aGlzLAorICAgICAgICAgICAgICAgIGFuZHJvaWQuUi5sYXlvdXQuc2ltcGxlX2xpc3RfaXRlbV8yLCBjLAorICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFN0cmluZ1tdIHsgTXRwLkRldmljZS5NQU5VRkFDVFVSRVIsIE10cC5EZXZpY2UuTU9ERUwgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBpbnRbXSB7IGFuZHJvaWQuUi5pZC50ZXh0MSwgYW5kcm9pZC5SLmlkLnRleHQyIH0pOworICAgICAgICBzZXRMaXN0QWRhcHRlcihtQWRhcHRlcik7CisKKyAgICAgICAgLy8gcmVnaXN0ZXIgZm9yIGNoYW5nZXMgdG8gdGhlIGRldmljZSBsaXN0CisgICAgICAgIG1SZXNvbHZlci5yZWdpc3RlckNvbnRlbnRPYnNlcnZlcihNdHAuRGV2aWNlLkNPTlRFTlRfVVJJLCB0cnVlLCBtRGV2aWNlT2JzZXJ2ZXIpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG9uUGF1c2UoKSB7CisgICAgICAgIHN1cGVyLm9uUGF1c2UoKTsKKyAgICAgICAgbVJlc29sdmVyLnVucmVnaXN0ZXJDb250ZW50T2JzZXJ2ZXIobURldmljZU9ic2VydmVyKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvbkxpc3RJdGVtQ2xpY2soTGlzdFZpZXcgbCwgVmlldyB2LCBpbnQgcG9zaXRpb24sIGxvbmcgaWQpIHsKKyAgICAgICAgSW50ZW50IGludGVudCA9IG5ldyBJbnRlbnQodGhpcywgU3RvcmFnZUJyb3dzZXIuY2xhc3MpOworICAgICAgICBpbnRlbnQucHV0RXh0cmEoImRldmljZSIsIChpbnQpbUFkYXB0ZXIuZ2V0SXRlbUlkKHBvc2l0aW9uKSk7CisgICAgICAgIHN0YXJ0QWN0aXZpdHkoaW50ZW50KTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9tZWRpYS90ZXN0cy9DYW1lcmFCcm93c2VyL3NyYy9jb20vYW5kcm9pZC9jYW1lcmFicm93c2VyL09iamVjdEJyb3dzZXIuamF2YSBiL21lZGlhL3Rlc3RzL0NhbWVyYUJyb3dzZXIvc3JjL2NvbS9hbmRyb2lkL2NhbWVyYWJyb3dzZXIvT2JqZWN0QnJvd3Nlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZjOTk4OWQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS90ZXN0cy9DYW1lcmFCcm93c2VyL3NyYy9jb20vYW5kcm9pZC9jYW1lcmFicm93c2VyL09iamVjdEJyb3dzZXIuamF2YQpAQCAtMCwwICsxLDE0NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQuY2FtZXJhYnJvd3NlcjsKKworaW1wb3J0IGFuZHJvaWQuYXBwLkxpc3RBY3Rpdml0eTsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OworaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2UuQ3Vyc29yOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwRmFjdG9yeTsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLk10cENvbnN0YW50czsKK2ltcG9ydCBhbmRyb2lkLm5ldC5Vcmk7CitpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CitpbXBvcnQgYW5kcm9pZC5wcm92aWRlci5NdHA7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5BZGFwdGVyVmlldzsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5JbWFnZVZpZXc7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuTGlzdFZpZXc7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuUmVzb3VyY2VDdXJzb3JBZGFwdGVyOworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlRleHRWaWV3OworCisgLyoqCisgKiBBIGxpc3QgdmlldyBkaXNwbGF5aW5nIGFsbCBvYmplY3RzIHdpdGhpbiBhIGNvbnRhaW5lciAoZm9sZGVyIG9yIHN0b3JhZ2UgdW5pdCkuCisgKi8KK3B1YmxpYyBjbGFzcyBPYmplY3RCcm93c2VyIGV4dGVuZHMgTGlzdEFjdGl2aXR5IHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiT2JqZWN0QnJvd3NlciI7CisKKyAgICBwcml2YXRlIEN1cnNvciBtQ3Vyc29yOworICAgIHByaXZhdGUgT2JqZWN0Q3Vyc29yQWRhcHRlciBtQWRhcHRlcjsKKyAgICBwcml2YXRlIGludCBtRGV2aWNlSUQ7CisgICAgcHJpdmF0ZSBpbnQgbVN0b3JhZ2VJRDsKKyAgICBwcml2YXRlIGludCBtT2JqZWN0SUQ7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBPQkpFQ1RfQ09MVU1OUyA9CisgICAgICAgIG5ldyBTdHJpbmdbXSB7IE10cC5PYmplY3QuX0lELCBNdHAuT2JqZWN0Lk5BTUUsIE10cC5PYmplY3QuRk9STUFULCBNdHAuT2JqZWN0LlRIVU1CIH07CisKKyAgICBzdGF0aWMgZmluYWwgaW50IElEX0NPTFVNTiA9IDA7CisgICAgc3RhdGljIGZpbmFsIGludCBOQU1FX0NPTFVNTiA9IDE7CisgICAgc3RhdGljIGZpbmFsIGludCBGT1JNQVRfQ09MVU1OID0gMjsKKyAgICBzdGF0aWMgZmluYWwgaW50IFRIVU1CX0NPTFVNTiA9IDM7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvbkNyZWF0ZShCdW5kbGUgc2F2ZWRJbnN0YW5jZVN0YXRlKSB7CisgICAgICAgIHN1cGVyLm9uQ3JlYXRlKHNhdmVkSW5zdGFuY2VTdGF0ZSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25SZXN1bWUoKSB7CisgICAgICAgIHN1cGVyLm9uUmVzdW1lKCk7CisKKyAgICAgICAgbURldmljZUlEID0gZ2V0SW50ZW50KCkuZ2V0SW50RXh0cmEoImRldmljZSIsIDApOworICAgICAgICBtU3RvcmFnZUlEID0gZ2V0SW50ZW50KCkuZ2V0SW50RXh0cmEoInN0b3JhZ2UiLCAwKTsKKyAgICAgICAgbU9iamVjdElEID0gZ2V0SW50ZW50KCkuZ2V0SW50RXh0cmEoIm9iamVjdCIsIDApOworICAgICAgICBpZiAobURldmljZUlEICE9IDAgJiYgbVN0b3JhZ2VJRCAhPSAwKSB7CisgICAgICAgICAgICBDdXJzb3IgYzsKKyAgICAgICAgICAgIFVyaSB1cmk7CisgICAgICAgICAgICBpZiAobU9iamVjdElEID09IDApIHsKKyAgICAgICAgICAgICAgICB1cmkgPSBNdHAuT2JqZWN0LmdldENvbnRlbnRVcmlGb3JTdG9yYWdlQ2hpbGRyZW4obURldmljZUlELCBtU3RvcmFnZUlEKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgdXJpID0gTXRwLk9iamVjdC5nZXRDb250ZW50VXJpRm9yT2JqZWN0Q2hpbGRyZW4obURldmljZUlELCBtT2JqZWN0SUQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgTG9nLmQoVEFHLCAicXVlcnkgIiArIHVyaSk7CisgICAgICAgICAgICBjID0gZ2V0Q29udGVudFJlc29sdmVyKCkucXVlcnkodXJpLCBPQkpFQ1RfQ09MVU1OUywgbnVsbCwgbnVsbCwgbnVsbCk7CisgICAgICAgICAgICBzdGFydE1hbmFnaW5nQ3Vyc29yKGMpOworICAgICAgICAgICAgbUN1cnNvciA9IGM7CisKKyAgICAgICAgICAgIC8vIE1hcCBDdXJzb3IgY29sdW1ucyB0byB2aWV3cyBkZWZpbmVkIGluIHNpbXBsZV9saXN0X2l0ZW1fMS54bWwKKyAgICAgICAgICAgIG1BZGFwdGVyID0gbmV3IE9iamVjdEN1cnNvckFkYXB0ZXIodGhpcywgYyk7CisgICAgICAgICAgICBzZXRMaXN0QWRhcHRlcihtQWRhcHRlcik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvbkxpc3RJdGVtQ2xpY2soTGlzdFZpZXcgbCwgVmlldyB2LCBpbnQgcG9zaXRpb24sIGxvbmcgaWQpIHsKKyAgICAgICAgaW50IHJvd0lEID0gKGludCltQWRhcHRlci5nZXRJdGVtSWQocG9zaXRpb24pOworICAgICAgICBDdXJzb3IgYyA9IGdldENvbnRlbnRSZXNvbHZlcigpLnF1ZXJ5KAorICAgICAgICAgICAgICAgICAgICAgICAgTXRwLk9iamVjdC5nZXRDb250ZW50VXJpKG1EZXZpY2VJRCwgcm93SUQpLAorICAgICAgICAgICAgICAgICAgICAgICAgT0JKRUNUX0NPTFVNTlMsIG51bGwsIG51bGwsIG51bGwpOworICAgICAgICBMb2cuZChUQUcsICJxdWVyeSByZXR1cm5lZCAiICsgYyArICIgY291bnQ6ICIgKyBjLmdldENvdW50KCkpOworICAgICAgICBsb25nIGZvcm1hdCA9IDA7CisgICAgICAgIGlmIChjICE9IG51bGwgJiYgYy5nZXRDb3VudCgpID09IDEpIHsKKyAgICAgICAgICAgIGMubW92ZVRvRmlyc3QoKTsKKyAgICAgICAgICAgIGxvbmcgcm93SWQgPSBjLmdldExvbmcoSURfQ09MVU1OKTsKKyAgICAgICAgICAgIFN0cmluZyBuYW1lID0gYy5nZXRTdHJpbmcoTkFNRV9DT0xVTU4pOworICAgICAgICAgICAgZm9ybWF0ID0gYy5nZXRMb25nKEZPUk1BVF9DT0xVTU4pOworICAgICAgICAgICAgTG9nLmQoVEFHLCAicm93SWQ6ICIgKyByb3dJZCArICIgbmFtZTogIiArIG5hbWUgKyAiIGZvcm1hdDogIiArIGZvcm1hdCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGZvcm1hdCA9PSBNdHBDb25zdGFudHMuRk9STUFUX0pGSUYpIHsKKyAgICAgICAgICAgIEludGVudCBpbnRlbnQgPSBuZXcgSW50ZW50KHRoaXMsIE9iamVjdFZpZXdlci5jbGFzcyk7CisgICAgICAgICAgICBpbnRlbnQucHV0RXh0cmEoImRldmljZSIsIG1EZXZpY2VJRCk7CisgICAgICAgICAgICBpbnRlbnQucHV0RXh0cmEoInN0b3JhZ2UiLCBtU3RvcmFnZUlEKTsKKyAgICAgICAgICAgIGludGVudC5wdXRFeHRyYSgib2JqZWN0Iixyb3dJRCk7CisgICAgICAgICAgICBzdGFydEFjdGl2aXR5KGludGVudCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBJbnRlbnQgaW50ZW50ID0gbmV3IEludGVudCh0aGlzLCBPYmplY3RCcm93c2VyLmNsYXNzKTsKKyAgICAgICAgICAgIGludGVudC5wdXRFeHRyYSgiZGV2aWNlIiwgbURldmljZUlEKTsKKyAgICAgICAgICAgIGludGVudC5wdXRFeHRyYSgic3RvcmFnZSIsIG1TdG9yYWdlSUQpOworICAgICAgICAgICAgaW50ZW50LnB1dEV4dHJhKCJvYmplY3QiLCByb3dJRCk7CisgICAgICAgICAgICBzdGFydEFjdGl2aXR5KGludGVudCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIGNsYXNzIE9iamVjdEN1cnNvckFkYXB0ZXIgZXh0ZW5kcyBSZXNvdXJjZUN1cnNvckFkYXB0ZXIgeworCisgICAgICAgIHB1YmxpYyBPYmplY3RDdXJzb3JBZGFwdGVyKENvbnRleHQgY29udGV4dCwgQ3Vyc29yIGMpIHsKKyAgICAgICAgICAgIHN1cGVyKGNvbnRleHQsIFIubGF5b3V0Lm9iamVjdF9saXN0LCBjKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBiaW5kVmlldyhWaWV3IHZpZXcsIENvbnRleHQgY29udGV4dCwgQ3Vyc29yIGN1cnNvcikgeworICAgICAgICAgICAgSW1hZ2VWaWV3IHRodW1iVmlldyA9IChJbWFnZVZpZXcpdmlldy5maW5kVmlld0J5SWQoUi5pZC50aHVtYm5haWwpOworICAgICAgICAgICAgVGV4dFZpZXcgbmFtZVZpZXcgPSAoVGV4dFZpZXcpdmlldy5maW5kVmlld0J5SWQoUi5pZC5uYW1lKTsKKworICAgICAgICAgICAgLy8gZ2V0IHRoZSB0aHVtYm5haWwKKyAgICAgICAgICAgIGJ5dGVbXSB0aHVtYm5haWwgPSBjdXJzb3IuZ2V0QmxvYihUSFVNQl9DT0xVTU4pOworICAgICAgICAgICAgaWYgKHRodW1ibmFpbCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgQml0bWFwIGJpdG1hcCA9IEJpdG1hcEZhY3RvcnkuZGVjb2RlQnl0ZUFycmF5KHRodW1ibmFpbCwgMCwgdGh1bWJuYWlsLmxlbmd0aCk7CisgICAgICAgICAgICAgICAgaWYgKGJpdG1hcCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIHRodW1iVmlldy5zZXRJbWFnZUJpdG1hcChiaXRtYXApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gZ2V0IHRoZSBuYW1lCisgICAgICAgICAgICBTdHJpbmcgbmFtZSA9IGN1cnNvci5nZXRTdHJpbmcoTkFNRV9DT0xVTU4pOworICAgICAgICAgICAgaWYgKG5hbWUgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG5hbWUgPSAiIjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG5hbWVWaWV3LnNldFRleHQobmFtZSk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9tZWRpYS90ZXN0cy9DYW1lcmFCcm93c2VyL3NyYy9jb20vYW5kcm9pZC9jYW1lcmFicm93c2VyL09iamVjdFZpZXdlci5qYXZhIGIvbWVkaWEvdGVzdHMvQ2FtZXJhQnJvd3Nlci9zcmMvY29tL2FuZHJvaWQvY2FtZXJhYnJvd3Nlci9PYmplY3RWaWV3ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYTQ5Y2Q4Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvdGVzdHMvQ2FtZXJhQnJvd3Nlci9zcmMvY29tL2FuZHJvaWQvY2FtZXJhYnJvd3Nlci9PYmplY3RWaWV3ZXIuamF2YQpAQCAtMCwwICsxLDI1MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLmNhbWVyYWJyb3dzZXI7CisKK2ltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eTsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OworaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2UuQ3Vyc29yOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwRmFjdG9yeTsKK2ltcG9ydCBhbmRyb2lkLm5ldC5Vcmk7CitpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CitpbXBvcnQgYW5kcm9pZC5vcy5FbnZpcm9ubWVudDsKK2ltcG9ydCBhbmRyb2lkLm9zLkZpbGVVdGlsczsKK2ltcG9ydCBhbmRyb2lkLm9zLlBhcmNlbEZpbGVEZXNjcmlwdG9yOworaW1wb3J0IGFuZHJvaWQub3MuUHJvY2VzczsKK2ltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLk10cDsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworaW1wb3J0IGFuZHJvaWQudmlldy5NZW51OworaW1wb3J0IGFuZHJvaWQudmlldy5NZW51SW5mbGF0ZXI7CitpbXBvcnQgYW5kcm9pZC52aWV3Lk1lbnVJdGVtOworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkltYWdlVmlldzsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5UZXh0VmlldzsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5Ub2FzdDsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVEZXNjcmlwdG9yOworaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLnV0aWwuQ2FsZW5kYXI7CitpbXBvcnQgamF2YS51dGlsLkRhdGU7CisKKy8qKgorICogQSB2aWV3IHRvIGRpc3BsYXkgdGhlIHByb3BlcnRpZXMgb2YgYW4gb2JqZWN0LgorICovCitwdWJsaWMgY2xhc3MgT2JqZWN0Vmlld2VyIGV4dGVuZHMgQWN0aXZpdHkgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJPYmplY3RWaWV3ZXIiOworCisgICAgcHJpdmF0ZSBpbnQgbURldmljZUlEOworICAgIHByaXZhdGUgaW50IG1TdG9yYWdlSUQ7CisgICAgcHJpdmF0ZSBpbnQgbU9iamVjdElEOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gT0JKRUNUX0NPTFVNTlMgPQorICAgICAgICBuZXcgU3RyaW5nW10geyAgTXRwLk9iamVjdC5fSUQsCisgICAgICAgICAgICAgICAgICAgICAgICBNdHAuT2JqZWN0Lk5BTUUsCisgICAgICAgICAgICAgICAgICAgICAgICBNdHAuT2JqZWN0LlNJWkUsCisgICAgICAgICAgICAgICAgICAgICAgICBNdHAuT2JqZWN0LlRIVU1CX1dJRFRILAorICAgICAgICAgICAgICAgICAgICAgICAgTXRwLk9iamVjdC5USFVNQl9IRUlHSFQsCisgICAgICAgICAgICAgICAgICAgICAgICBNdHAuT2JqZWN0LlRIVU1CX1NJWkUsCisgICAgICAgICAgICAgICAgICAgICAgICBNdHAuT2JqZWN0LklNQUdFX1dJRFRILAorICAgICAgICAgICAgICAgICAgICAgICAgTXRwLk9iamVjdC5JTUFHRV9IRUlHSFQsCisgICAgICAgICAgICAgICAgICAgICAgICBNdHAuT2JqZWN0LklNQUdFX0RFUFRILAorICAgICAgICAgICAgICAgICAgICAgICAgTXRwLk9iamVjdC5TRVFVRU5DRV9OVU1CRVIsCisgICAgICAgICAgICAgICAgICAgICAgICBNdHAuT2JqZWN0LkRBVEVfQ1JFQVRFRCwKKyAgICAgICAgICAgICAgICAgICAgICAgIE10cC5PYmplY3QuREFURV9NT0RJRklFRCwKKyAgICAgICAgICAgICAgICAgICAgICAgIE10cC5PYmplY3QuS0VZV09SRFMsCisgICAgICAgICAgICAgICAgICAgICAgICBNdHAuT2JqZWN0LlRIVU1CLAorICAgICAgICAgICAgICAgICAgICAgICAgfTsKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG9uQ3JlYXRlKEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpIHsKKyAgICAgICAgc3VwZXIub25DcmVhdGUoc2F2ZWRJbnN0YW5jZVN0YXRlKTsKKworICAgICAgICBzZXRDb250ZW50VmlldyhSLmxheW91dC5vYmplY3RfaW5mbyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25SZXN1bWUoKSB7CisgICAgICAgIHN1cGVyLm9uUmVzdW1lKCk7CisKKyAgICAgICAgbURldmljZUlEID0gZ2V0SW50ZW50KCkuZ2V0SW50RXh0cmEoImRldmljZSIsIDApOworICAgICAgICBtU3RvcmFnZUlEID0gZ2V0SW50ZW50KCkuZ2V0SW50RXh0cmEoInN0b3JhZ2UiLCAwKTsKKyAgICAgICAgbU9iamVjdElEID0gZ2V0SW50ZW50KCkuZ2V0SW50RXh0cmEoIm9iamVjdCIsIDApOworCisgICAgICAgIGlmIChtRGV2aWNlSUQgIT0gMCAmJiBtT2JqZWN0SUQgIT0gMCkgeworICAgICAgICBDdXJzb3IgYyA9IGdldENvbnRlbnRSZXNvbHZlcigpLnF1ZXJ5KAorICAgICAgICAgICAgICAgICAgICAgICAgTXRwLk9iamVjdC5nZXRDb250ZW50VXJpKG1EZXZpY2VJRCwgbU9iamVjdElEKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIE9CSkVDVF9DT0xVTU5TLCBudWxsLCBudWxsLCBudWxsKTsKKyAgICAgICAgICAgIGMubW92ZVRvRmlyc3QoKTsKKyAgICAgICAgICAgIFRleHRWaWV3IHZpZXcgPSAoVGV4dFZpZXcpZmluZFZpZXdCeUlkKFIuaWQubmFtZSk7CisgICAgICAgICAgICB2aWV3LnNldFRleHQoYy5nZXRTdHJpbmcoMSkpOworICAgICAgICAgICAgdmlldyA9IChUZXh0VmlldylmaW5kVmlld0J5SWQoUi5pZC5zaXplKTsKKyAgICAgICAgICAgIHZpZXcuc2V0VGV4dChMb25nLnRvU3RyaW5nKGMuZ2V0TG9uZygyKSkpOworICAgICAgICAgICAgdmlldyA9IChUZXh0VmlldylmaW5kVmlld0J5SWQoUi5pZC50aHVtYl93aWR0aCk7CisgICAgICAgICAgICB2aWV3LnNldFRleHQoTG9uZy50b1N0cmluZyhjLmdldExvbmcoMykpKTsKKyAgICAgICAgICAgIHZpZXcgPSAoVGV4dFZpZXcpZmluZFZpZXdCeUlkKFIuaWQudGh1bWJfaGVpZ2h0KTsKKyAgICAgICAgICAgIHZpZXcuc2V0VGV4dChMb25nLnRvU3RyaW5nKGMuZ2V0TG9uZyg0KSkpOworICAgICAgICAgICAgdmlldyA9IChUZXh0VmlldylmaW5kVmlld0J5SWQoUi5pZC50aHVtYl9zaXplKTsKKyAgICAgICAgICAgIHZpZXcuc2V0VGV4dChMb25nLnRvU3RyaW5nKGMuZ2V0TG9uZyg1KSkpOworICAgICAgICAgICAgdmlldyA9IChUZXh0VmlldylmaW5kVmlld0J5SWQoUi5pZC53aWR0aCk7CisgICAgICAgICAgICB2aWV3LnNldFRleHQoTG9uZy50b1N0cmluZyhjLmdldExvbmcoNikpKTsKKyAgICAgICAgICAgIHZpZXcgPSAoVGV4dFZpZXcpZmluZFZpZXdCeUlkKFIuaWQuaGVpZ2h0KTsKKyAgICAgICAgICAgIHZpZXcuc2V0VGV4dChMb25nLnRvU3RyaW5nKGMuZ2V0TG9uZyg3KSkpOworICAgICAgICAgICAgdmlldyA9IChUZXh0VmlldylmaW5kVmlld0J5SWQoUi5pZC5kZXB0aCk7CisgICAgICAgICAgICB2aWV3LnNldFRleHQoTG9uZy50b1N0cmluZyhjLmdldExvbmcoOCkpKTsKKyAgICAgICAgICAgIHZpZXcgPSAoVGV4dFZpZXcpZmluZFZpZXdCeUlkKFIuaWQuc2VxdWVuY2UpOworICAgICAgICAgICAgdmlldy5zZXRUZXh0KExvbmcudG9TdHJpbmcoYy5nZXRMb25nKDkpKSk7CisgICAgICAgICAgICB2aWV3ID0gKFRleHRWaWV3KWZpbmRWaWV3QnlJZChSLmlkLmNyZWF0ZWQpOworICAgICAgICAgICAgRGF0ZSBkYXRlID0gbmV3IERhdGUoYy5nZXRMb25nKDEwKSAqIDEwMDApOworICAgICAgICAgICAgdmlldy5zZXRUZXh0KGRhdGUudG9TdHJpbmcoKSk7CisgICAgICAgICAgICB2aWV3ID0gKFRleHRWaWV3KWZpbmRWaWV3QnlJZChSLmlkLm1vZGlmaWVkKTsKKyAgICAgICAgICAgIGRhdGUgPSBuZXcgRGF0ZShjLmdldExvbmcoMTEpICogMTAwMCk7CisgICAgICAgICAgICB2aWV3LnNldFRleHQoZGF0ZS50b1N0cmluZygpKTsKKyAgICAgICAgICAgIHZpZXcgPSAoVGV4dFZpZXcpZmluZFZpZXdCeUlkKFIuaWQua2V5d29yZHMpOworICAgICAgICAgICAgdmlldy5zZXRUZXh0KGMuZ2V0U3RyaW5nKDEyKSk7CisgICAgICAgICAgICBieXRlW10gdGh1bWJuYWlsID0gYy5nZXRCbG9iKDEzKTsKKyAgICAgICAgICAgIGlmICh0aHVtYm5haWwgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIEltYWdlVmlldyB0aHVtYlZpZXcgPSAoSW1hZ2VWaWV3KWZpbmRWaWV3QnlJZChSLmlkLnRodW1ibmFpbCk7CisgICAgICAgICAgICAgICAgQml0bWFwIGJpdG1hcCA9IEJpdG1hcEZhY3RvcnkuZGVjb2RlQnl0ZUFycmF5KHRodW1ibmFpbCwgMCwgdGh1bWJuYWlsLmxlbmd0aCk7CisgICAgICAgICAgICAgICAgaWYgKGJpdG1hcCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIHRodW1iVmlldy5zZXRJbWFnZUJpdG1hcChiaXRtYXApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIG9uQ3JlYXRlT3B0aW9uc01lbnUoTWVudSBtZW51KSB7CisgICAgICAgIE1lbnVJbmZsYXRlciBpbmZsYXRlciA9IGdldE1lbnVJbmZsYXRlcigpOworICAgICAgICBpbmZsYXRlci5pbmZsYXRlKFIubWVudS5vYmplY3RfbWVudSwgbWVudSk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIG9uUHJlcGFyZU9wdGlvbnNNZW51KE1lbnUgbWVudSkgeworICAgICAgICBNZW51SXRlbSBpdGVtID0gbWVudS5maW5kSXRlbShSLmlkLnNhdmUpOworICAgICAgICBpdGVtLnNldEVuYWJsZWQodHJ1ZSk7CisgICAgICAgIGl0ZW0gPSBtZW51LmZpbmRJdGVtKFIuaWQuZGVsZXRlKTsKKyAgICAgICAgaXRlbS5zZXRFbmFibGVkKHRydWUpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBvbk9wdGlvbnNJdGVtU2VsZWN0ZWQoTWVudUl0ZW0gaXRlbSkgeworICAgICAgICBzd2l0Y2ggKGl0ZW0uZ2V0SXRlbUlkKCkpIHsKKyAgICAgICAgICAgIGNhc2UgUi5pZC5zYXZlOgorICAgICAgICAgICAgICAgIHNhdmUoKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIGNhc2UgUi5pZC5kZWxldGU6CisgICAgICAgICAgICAgICAgZGVsZXRlKCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRUaW1lc3RhbXAoKSB7CisgICAgICAgIENhbGVuZGFyIGMgPSBDYWxlbmRhci5nZXRJbnN0YW5jZSgpOworICAgICAgICBjLnNldFRpbWVJbk1pbGxpcyhTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSk7CisgICAgICAgIHJldHVybiBTdHJpbmcuZm9ybWF0KCIldFktJXRtLSV0ZC0ldEgtJXRNLSV0UyIsIGMsIGMsIGMsIGMsIGMsIGMpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBzYXZlKCkgeworICAgICAgICBib29sZWFuIHN1Y2Nlc3MgPSBmYWxzZTsKKyAgICAgICAgVXJpIHVyaSA9IE10cC5PYmplY3QuZ2V0Q29udGVudFVyaShtRGV2aWNlSUQsIG1PYmplY3RJRCk7CisgICAgICAgIEZpbGUgZGVzdEZpbGUgPSBudWxsOworICAgICAgICBQYXJjZWxGaWxlRGVzY3JpcHRvciBwZmQgPSBudWxsOworICAgICAgICBGaWxlSW5wdXRTdHJlYW0gZmlzID0gbnVsbDsKKyAgICAgICAgRmlsZU91dHB1dFN0cmVhbSBmb3MgPSBudWxsOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBwZmQgPSBnZXRDb250ZW50UmVzb2x2ZXIoKS5vcGVuRmlsZURlc2NyaXB0b3IodXJpLCAiciIpOworICAgICAgICAgICAgTG9nLmQoVEFHLCAic2F2ZSBnb3QgcGZkICIgKyBwZmQpOworICAgICAgICAgICAgaWYgKHBmZCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgZmlzID0gbmV3IEZpbGVJbnB1dFN0cmVhbShwZmQuZ2V0RmlsZURlc2NyaXB0b3IoKSk7CisgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAic2F2ZSBnb3QgZmlzICIgKyBmaXMpOworICAgICAgICAgICAgICAgIEZpbGUgZGVzdERpciA9IEVudmlyb25tZW50LmdldEV4dGVybmFsU3RvcmFnZVB1YmxpY0RpcmVjdG9yeSgKKyAgICAgICAgICAgICAgICAgICAgICAgIEVudmlyb25tZW50LkRJUkVDVE9SWV9EQ0lNKTsKKyAgICAgICAgICAgICAgICBkZXN0RGlyLm1rZGlycygpOworICAgICAgICAgICAgICAgIGRlc3RGaWxlID0gbmV3IEZpbGUoZGVzdERpciwgIkNhbWVyYUJyb3dzZXItIiArIGdldFRpbWVzdGFtcCgpICsgIi5qcGVnIik7CisKKworICAgICAgICAgICAgICAgIExvZy5kKFRBRywgInNhdmUgZ290IGRlc3RGaWxlICIgKyBkZXN0RmlsZSk7CisKKyAgICAgICAgICAgICAgICBpZiAoZGVzdEZpbGUuZXhpc3RzKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgZGVzdEZpbGUuZGVsZXRlKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGZvcyA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKGRlc3RGaWxlKTsKKworICAgICAgICAgICAgICAgIGJ5dGVbXSBidWZmZXIgPSBuZXcgYnl0ZVs2NTUzNl07CisgICAgICAgICAgICAgICAgaW50IGJ5dGVzUmVhZDsKKyAgICAgICAgICAgICAgICB3aGlsZSAoKGJ5dGVzUmVhZCA9IGZpcy5yZWFkKGJ1ZmZlcikpID49IDApIHsKKyAgICAgICAgICAgICAgICAgICAgZm9zLndyaXRlKGJ1ZmZlciwgMCwgYnl0ZXNSZWFkKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvLyB0ZW1wb3Jhcnkgd29ya2Fyb3VuZCB1bnRpbCB3ZSBzdHJhaWdodGVuIG91dCBwZXJtaXNzaW9ucyBpbiAvZGF0YS9tZWRpYQorICAgICAgICAgICAgICAgIC8vIDEwMTUgaXMgQUlEX1NEQ0FSRF9SVworICAgICAgICAgICAgICAgIEZpbGVVdGlscy5zZXRQZXJtaXNzaW9ucyhkZXN0RGlyLmdldFBhdGgoKSwgMDc3NSwgUHJvY2Vzcy5teVVpZCgpLCAxMDE1KTsKKyAgICAgICAgICAgICAgICBGaWxlVXRpbHMuc2V0UGVybWlzc2lvbnMoZGVzdEZpbGUuZ2V0UGF0aCgpLCAwNjY0LCBQcm9jZXNzLm15VWlkKCksIDEwMTUpOworCisgICAgICAgICAgICAgICAgc3VjY2VzcyA9IHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBMb2cuZShUQUcsICJFeGNlcHRpb24gaW4gT2JqZWN0Vmlldy5zYXZlIiwgZSk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBpZiAoZmlzICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBmaXMuY2xvc2UoKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChmb3MgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIGZvcy5jbG9zZSgpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHBmZCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgcGZkLmNsb3NlKCk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoc3VjY2VzcykgeworICAgICAgICAgICAgSW50ZW50IGludGVudCA9IG5ldyBJbnRlbnQoSW50ZW50LkFDVElPTl9NRURJQV9TQ0FOTkVSX1NDQU5fRklMRSk7CisgICAgICAgICAgICBpbnRlbnQuc2V0RGF0YShVcmkuZnJvbUZpbGUoZGVzdEZpbGUpKTsKKyAgICAgICAgICAgIHNlbmRCcm9hZGNhc3QoaW50ZW50KTsKKyAgICAgICAgICAgIFRvYXN0Lm1ha2VUZXh0KHRoaXMsIFIuc3RyaW5nLm9iamVjdF9zYXZlZF9tZXNzYWdlLCBUb2FzdC5MRU5HVEhfU0hPUlQpLnNob3coKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIFRvYXN0Lm1ha2VUZXh0KHRoaXMsIFIuc3RyaW5nLnNhdmVfZmFpbGVkX21lc3NhZ2UsIFRvYXN0LkxFTkdUSF9TSE9SVCkuc2hvdygpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGRlbGV0ZSgpIHsKKyAgICAgICAgVXJpIHVyaSA9IE10cC5PYmplY3QuZ2V0Q29udGVudFVyaShtRGV2aWNlSUQsIG1PYmplY3RJRCk7CisKKyAgICAgICAgTG9nLmQoVEFHLCAiZGVsZXRpbmcgIiArIHVyaSk7CisKKyAgICAgICAgaW50IHJlc3VsdCA9IGdldENvbnRlbnRSZXNvbHZlcigpLmRlbGV0ZSh1cmksIG51bGwsIG51bGwpOworICAgICAgICBpZiAocmVzdWx0ID4gMCkgeworICAgICAgICAgICAgVG9hc3QubWFrZVRleHQodGhpcywgUi5zdHJpbmcub2JqZWN0X2RlbGV0ZWRfbWVzc2FnZSwgVG9hc3QuTEVOR1RIX1NIT1JUKS5zaG93KCk7CisgICAgICAgICAgICBmaW5pc2goKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIFRvYXN0Lm1ha2VUZXh0KHRoaXMsIFIuc3RyaW5nLmRlbGV0ZV9mYWlsZWRfbWVzc2FnZSwgVG9hc3QuTEVOR1RIX1NIT1JUKS5zaG93KCk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9tZWRpYS90ZXN0cy9DYW1lcmFCcm93c2VyL3NyYy9jb20vYW5kcm9pZC9jYW1lcmFicm93c2VyL1N0b3JhZ2VCcm93c2VyLmphdmEgYi9tZWRpYS90ZXN0cy9DYW1lcmFCcm93c2VyL3NyYy9jb20vYW5kcm9pZC9jYW1lcmFicm93c2VyL1N0b3JhZ2VCcm93c2VyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmRkZjRlNwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL3Rlc3RzL0NhbWVyYUJyb3dzZXIvc3JjL2NvbS9hbmRyb2lkL2NhbWVyYWJyb3dzZXIvU3RvcmFnZUJyb3dzZXIuamF2YQpAQCAtMCwwICsxLDc2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5jYW1lcmFicm93c2VyOworCitpbXBvcnQgYW5kcm9pZC5hcHAuTGlzdEFjdGl2aXR5OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7CitpbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5DdXJzb3I7CitpbXBvcnQgYW5kcm9pZC5uZXQuVXJpOworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuTXRwOworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuTGlzdEFkYXB0ZXI7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuTGlzdFZpZXc7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuU2ltcGxlQ3Vyc29yQWRhcHRlcjsKKworLyoqCisgKiBBIGxpc3QgdmlldyBkaXNwbGF5aW5nIGFsbCBzdG9yYWdlIHVuaXRzIG9uIGEgZGV2aWNlLgorICovCitwdWJsaWMgY2xhc3MgU3RvcmFnZUJyb3dzZXIgZXh0ZW5kcyBMaXN0QWN0aXZpdHkgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJTdG9yYWdlQnJvd3NlciI7CisKKyAgICBwcml2YXRlIExpc3RBZGFwdGVyIG1BZGFwdGVyOworICAgIHByaXZhdGUgaW50IG1EZXZpY2VJRDsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIFNUT1JBR0VfQ09MVU1OUyA9CisgICAgICAgIG5ldyBTdHJpbmdbXSB7IE10cC5TdG9yYWdlLl9JRCwgTXRwLlN0b3JhZ2UuREVTQ1JJUFRJT04gfTsKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG9uQ3JlYXRlKEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpIHsKKyAgICAgICAgc3VwZXIub25DcmVhdGUoc2F2ZWRJbnN0YW5jZVN0YXRlKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvblJlc3VtZSgpIHsKKyAgICAgICAgc3VwZXIub25SZXN1bWUoKTsKKworICAgICAgICBtRGV2aWNlSUQgPSBnZXRJbnRlbnQoKS5nZXRJbnRFeHRyYSgiZGV2aWNlIiwgMCk7CisgICAgICAgIGlmIChtRGV2aWNlSUQgIT0gMCkgeworICAgICAgICAgICAgQ3Vyc29yIGMgPSBnZXRDb250ZW50UmVzb2x2ZXIoKS5xdWVyeShNdHAuU3RvcmFnZS5nZXRDb250ZW50VXJpKG1EZXZpY2VJRCksCisgICAgICAgICAgICAgICAgICAgIFNUT1JBR0VfQ09MVU1OUywgbnVsbCwgbnVsbCwgbnVsbCk7CisgICAgICAgICAgICBMb2cuZChUQUcsICJxdWVyeSByZXR1cm5lZCAiICsgYyk7CisgICAgICAgICAgICBzdGFydE1hbmFnaW5nQ3Vyc29yKGMpOworCisgICAgICAgICAgICAvLyBNYXAgQ3Vyc29yIGNvbHVtbnMgdG8gdmlld3MgZGVmaW5lZCBpbiBzaW1wbGVfbGlzdF9pdGVtXzEueG1sCisgICAgICAgICAgICBtQWRhcHRlciA9IG5ldyBTaW1wbGVDdXJzb3JBZGFwdGVyKHRoaXMsCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQuUi5sYXlvdXQuc2ltcGxlX2xpc3RfaXRlbV8xLCBjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBTdHJpbmdbXSB7IE10cC5TdG9yYWdlLkRFU0NSSVBUSU9OIH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IGludFtdIHsgYW5kcm9pZC5SLmlkLnRleHQxLCBhbmRyb2lkLlIuaWQudGV4dDIgfSk7CisgICAgICAgICAgICBzZXRMaXN0QWRhcHRlcihtQWRhcHRlcik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvbkxpc3RJdGVtQ2xpY2soTGlzdFZpZXcgbCwgVmlldyB2LCBpbnQgcG9zaXRpb24sIGxvbmcgaWQpIHsKKyAgICAgICAgSW50ZW50IGludGVudCA9IG5ldyBJbnRlbnQodGhpcywgT2JqZWN0QnJvd3Nlci5jbGFzcyk7CisgICAgICAgIGludGVudC5wdXRFeHRyYSgiZGV2aWNlIiwgbURldmljZUlEKTsKKyAgICAgICAgaW50ZW50LnB1dEV4dHJhKCJzdG9yYWdlIiwgKGludCltQWRhcHRlci5nZXRJdGVtSWQocG9zaXRpb24pKTsKKyAgICAgICAgc3RhcnRBY3Rpdml0eShpbnRlbnQpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL21lZGlhL3Rlc3RzL0NhbWVyYUJyb3dzZXIvc3JjL2NvbS9hbmRyb2lkL2NhbWVyYWJyb3dzZXIvVXNiUmVjZWl2ZXIuamF2YSBiL21lZGlhL3Rlc3RzL0NhbWVyYUJyb3dzZXIvc3JjL2NvbS9hbmRyb2lkL2NhbWVyYWJyb3dzZXIvVXNiUmVjZWl2ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMDViMjM5Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvdGVzdHMvQ2FtZXJhQnJvd3Nlci9zcmMvY29tL2FuZHJvaWQvY2FtZXJhYnJvd3Nlci9Vc2JSZWNlaXZlci5qYXZhCkBAIC0wLDAgKzEsNDcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLmNhbWVyYWJyb3dzZXI7CisKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Ccm9hZGNhc3RSZWNlaXZlcjsKK2ltcG9ydCBhbmRyb2lkLmhhcmR3YXJlLlVzYjsKK2ltcG9ydCBhbmRyb2lkLm5ldC5Vcmk7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKKworcHVibGljIGNsYXNzIFVzYlJlY2VpdmVyIGV4dGVuZHMgQnJvYWRjYXN0UmVjZWl2ZXIKK3sKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIlVzYlJlY2VpdmVyIjsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9uUmVjZWl2ZShDb250ZXh0IGNvbnRleHQsIEludGVudCBpbnRlbnQpIHsKKyAgICAgICAgTG9nLmQoVEFHLCAib25SZWNlaXZlICIgKyBpbnRlbnQpOworICAgICAgICBpZiAoVXNiLkFDVElPTl9VU0JfQ0FNRVJBX0FUVEFDSEVELmVxdWFscyhpbnRlbnQuZ2V0QWN0aW9uKCkpKSB7CisgICAgICAgICAgICBVcmkgdXJpID0gaW50ZW50LmdldERhdGEoKTsKKyAgICAgICAgICAgIGludGVudCA9IG5ldyBJbnRlbnQoY29udGV4dCwgU3RvcmFnZUJyb3dzZXIuY2xhc3MpOworICAgICAgICAgICAgaW50ZW50LnNldEZsYWdzKEludGVudC5GTEFHX0FDVElWSVRZX05FV19UQVNLKTsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgLy8gVE9ETyAtIGFkZCBhIHdyYXBwZXIgdG8gTXRwLkRldmljZSBmb3IgdGhpcworICAgICAgICAgICAgICAgIGludCBpZCA9IEludGVnZXIucGFyc2VJbnQodXJpLmdldFBhdGhTZWdtZW50cygpLmdldCgxKSk7CisgICAgICAgICAgICAgICAgaW50ZW50LnB1dEV4dHJhKCJkZXZpY2UiLCBpZCk7CisgICAgICAgICAgICAgICAgY29udGV4dC5zdGFydEFjdGl2aXR5KGludGVudCk7CisgICAgICAgICAgICB9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIExvZy5lKFRBRywgImJhZCBkZXZpY2UgVXJpICIgKyB1cmkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvdGVzdHMvbXRwL0FuZHJvaWQubWsgYi9tZWRpYS90ZXN0cy9tdHAvQW5kcm9pZC5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOTA3NGVkCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvdGVzdHMvbXRwL0FuZHJvaWQubWsKQEAgLTAsMCArMSw2MSBAQAorTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCisKK2lmbmVxICgkKFRBUkdFVF9TSU1VTEFUT1IpLHRydWUpCisKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorCitMT0NBTF9TUkNfRklMRVMgOj0gXAorCW10cC5jcHAgXAorCU10cEZpbGUuY3BwIFwKKworTE9DQUxfQ19JTkNMVURFUyArPSBcCisgICAgZnJhbWV3b3Jrcy9iYXNlL21lZGlhL210cCBcCisKK0xPQ0FMX0NGTEFHUyA6PSAtRE1UUF9IT1NUCisKK0xPQ0FMX01PRFVMRSA6PSBtdHAKKworTE9DQUxfU1RBVElDX0xJQlJBUklFUyA6PSBsaWJtdHAgbGlidXNiaG9zdCBsaWJ1dGlscyBsaWJjdXRpbHMKKworaW5jbHVkZSAkKEJVSUxEX0VYRUNVVEFCTEUpCisKK2VuZGlmCisKK2lmZXEgKCQoSE9TVF9PUyksbGludXgpCisKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorCitMT0NBTF9TUkNfRklMRVMgOj0gXAorCW10cC5jcHAgXAorCU10cEZpbGUuY3BwIFwKKwkuLi8uLi8uLi9saWJzL3V0aWxzL1JlZkJhc2UuY3BwIFwKKwkuLi8uLi8uLi9saWJzL3V0aWxzL1NoYXJlZEJ1ZmZlci5jcHAgXAorCS4uLy4uLy4uL2xpYnMvdXRpbHMvVGhyZWFkcy5jcHAgXAorCS4uLy4uLy4uL2xpYnMvdXRpbHMvVmVjdG9ySW1wbC5jcHAgXAorCitMT0NBTF9DX0lOQ0xVREVTICs9IFwKKyAgICBmcmFtZXdvcmtzL2Jhc2UvbWVkaWEvbXRwIFwKKworTE9DQUxfQ0ZMQUdTIDo9IC1ETVRQX0hPU1QgLWcgLU8wCisKK2hhdmVfcmVhZGxpbmUgOj0gJCh3aWxkY2FyZCAvdXNyL2luY2x1ZGUvcmVhZGxpbmUvcmVhZGxpbmUuaCkKK2hhdmVfaGlzdG9yeSA6PSAkKHdpbGRjYXJkIC91c3IvbGliL2xpYmhpc3RvcnkqKQoraWZuZXEgKCQoc3RyaXAgJChoYXZlX3JlYWRsaW5lKSksKQorTE9DQUxfQ0ZMQUdTICs9IC1ESEFWRV9SRUFETElORT0xCitlbmRpZgorCitMT0NBTF9MRExJQlMgKz0gLWxwdGhyZWFkCitpZm5lcSAoJChzdHJpcCAkKGhhdmVfcmVhZGxpbmUpKSwpCitMT0NBTF9MRExJQlMgKz0gLWxyZWFkbGluZSAtbG5jdXJzZXMKK2VuZGlmCitpZm5lcSAoJChzdHJpcCAkKGhhdmVfaGlzdG9yeSkpLCkKK0xPQ0FMX0xETElCUyArPSAtbGhpc3RvcnkKK2VuZGlmCisKK0xPQ0FMX01PRFVMRSA6PSBtdHAKKworTE9DQUxfU1RBVElDX0xJQlJBUklFUyA6PSBsaWJtdHAgbGlidXNiaG9zdCBsaWJjdXRpbHMKKworaW5jbHVkZSAkKEJVSUxEX0hPU1RfRVhFQ1VUQUJMRSkKKworZW5kaWYKZGlmZiAtLWdpdCBhL21lZGlhL3Rlc3RzL210cC9NdHBGaWxlLmNwcCBiL21lZGlhL3Rlc3RzL210cC9NdHBGaWxlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMGQzMjhlCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvdGVzdHMvbXRwL010cEZpbGUuY3BwCkBAIC0wLDAgKzEsMTg3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgIk10cENsaWVudC5oIgorI2luY2x1ZGUgIk10cERldmljZS5oIgorI2luY2x1ZGUgIk10cERldmljZUluZm8uaCIKKyNpbmNsdWRlICJNdHBPYmplY3RJbmZvLmgiCisjaW5jbHVkZSAiTXRwU3RvcmFnZS5oIgorI2luY2x1ZGUgIk10cFV0aWxzLmgiCisKKyNpbmNsdWRlICJNdHBGaWxlLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworTXRwQ2xpZW50KiBNdHBGaWxlOjpzQ2xpZW50ID0gTlVMTDsKKworTXRwRmlsZTo6TXRwRmlsZShNdHBEZXZpY2UqIGRldmljZSkKKyAgICA6ICAgbURldmljZShkZXZpY2UpLAorICAgICAgICBtU3RvcmFnZSgwKSwKKyAgICAgICAgbUhhbmRsZSgwKQoreworfQorCitNdHBGaWxlOjpNdHBGaWxlKE10cERldmljZSogZGV2aWNlLCBNdHBTdG9yYWdlSUQgc3RvcmFnZSkKKyAgICA6ICAgbURldmljZShkZXZpY2UpLAorICAgICAgICBtU3RvcmFnZShzdG9yYWdlKSwKKyAgICAgICAgbUhhbmRsZSgwKQoreworfQorCitNdHBGaWxlOjpNdHBGaWxlKE10cERldmljZSogZGV2aWNlLCBNdHBTdG9yYWdlSUQgc3RvcmFnZSwgTXRwT2JqZWN0SGFuZGxlIGhhbmRsZSkKKyAgICA6ICAgbURldmljZShkZXZpY2UpLAorICAgICAgICBtU3RvcmFnZShzdG9yYWdlKSwKKyAgICAgICAgbUhhbmRsZShoYW5kbGUpCit7Cit9CisKK010cEZpbGU6Ok10cEZpbGUoTXRwRmlsZSogZmlsZSkKKyAgICA6ICAgbURldmljZShmaWxlLT5tRGV2aWNlKSwKKyAgICAgICAgbVN0b3JhZ2UoZmlsZS0+bVN0b3JhZ2UpLAorICAgICAgICBtSGFuZGxlKGZpbGUtPm1IYW5kbGUpCit7Cit9CisKK010cEZpbGU6On5NdHBGaWxlKCkgeworfQorCit2b2lkIE10cEZpbGU6OnByaW50KCkgeworICAgIGlmIChtSGFuZGxlKSB7CisKKyAgICB9IGVsc2UgaWYgKG1TdG9yYWdlKSB7CisgICAgICAgIHByaW50ZigiJXhcbiIsIG1TdG9yYWdlKTsKKyAgICB9IGVsc2UgeworICAgICAgICBpbnQgaWQgPSBtRGV2aWNlLT5nZXRJRCgpOworICAgICAgICBNdHBEZXZpY2VJbmZvKiBpbmZvID0gbURldmljZS0+Z2V0RGV2aWNlSW5mbygpOworICAgICAgICBpZiAoaW5mbykKKyAgICAgICAgICAgIHByaW50ZigiJWRcdCVzICVzICVzXG4iLCBpZCwgaW5mby0+bU1hbnVmYWN0dXJlciwgaW5mby0+bU1vZGVsLCBpbmZvLT5tU2VyaWFsKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcHJpbnRmKCIlZFx0KG5vIGRldmljZSBpbmZvIGF2YWlsYWJsZSlcbiIsIGlkKTsKKyAgICAgICAgZGVsZXRlIGluZm87CisgICAgfQorfQorCitNdHBPYmplY3RJbmZvKiBNdHBGaWxlOjpnZXRPYmplY3RJbmZvKCkgeworICAgIHJldHVybiBtRGV2aWNlLT5nZXRPYmplY3RJbmZvKG1IYW5kbGUpOworfQorCit2b2lkIE10cEZpbGU6Omxpc3QoKSB7CisgICAgaWYgKG1TdG9yYWdlKSB7CisgICAgICAgIE10cE9iamVjdEhhbmRsZUxpc3QqIGhhbmRsZXMgPSBtRGV2aWNlLT5nZXRPYmplY3RIYW5kbGVzKG1TdG9yYWdlLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1IYW5kbGUgPyBtSGFuZGxlIDogLTEpKTsKKyAgICAgICAgaWYgKGhhbmRsZXMpIHsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaGFuZGxlcy0+c2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgICAgICBNdHBPYmplY3RIYW5kbGUgaGFuZGxlID0gKCpoYW5kbGVzKVtpXTsKKyAgICAgICAgICAgICAgICBNdHBPYmplY3RJbmZvKiBpbmZvID0gbURldmljZS0+Z2V0T2JqZWN0SW5mbyhoYW5kbGUpOworICAgICAgICAgICAgICAgIGlmIChpbmZvKSB7CisgICAgICAgICAgICAgICAgICAgIGNoYXIgbW9kaWZpZWRbMTAwXTsKKyAgICAgICAgICAgICAgICAgICAgc3RydWN0IHRtIHRtOworCisgICAgICAgICAgICAgICAgICAgIGdtdGltZV9yKCZpbmZvLT5tRGF0ZU1vZGlmaWVkLCAmdG0pOworICAgICAgICAgICAgICAgICAgICBzdHJmdGltZShtb2RpZmllZCwgc2l6ZW9mKG1vZGlmaWVkKSwgIiVhICViICVlICVIOiVNOiVTIEdNVCAlWSIsICZ0bSk7CisgICAgICAgICAgICAgICAgICAgIHByaW50ZigiJXMgSGFuZGxlOiAlZCBGb3JtYXQ6ICUwNFggU2l6ZTogJWQgTW9kaWZpZWQ6ICVzXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm8tPm1OYW1lLCBoYW5kbGUsIGluZm8tPm1Gb3JtYXQsIGluZm8tPm1Db21wcmVzc2VkU2l6ZSwgbW9kaWZpZWQpOworICAgICAgICAgICAgICAgICAgICBkZWxldGUgaW5mbzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBkZWxldGUgaGFuZGxlczsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIC8vIGxpc3Qgc3RvcmFnZSB1bml0cyBmb3IgZGV2aWNlCisgICAgICAgIE10cFN0b3JhZ2VJRExpc3QqIHN0b3JhZ2VMaXN0ID0gbURldmljZS0+Z2V0U3RvcmFnZUlEcygpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHN0b3JhZ2VMaXN0LT5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgTXRwU3RvcmFnZUlEIHN0b3JhZ2VJRCA9ICgqc3RvcmFnZUxpc3QpW2ldOworICAgICAgICAgICAgcHJpbnRmKCIleFxuIiwgc3RvcmFnZUlEKTsKKyAgICAgICAgfQorICAgIH0KK30KKwordm9pZCBNdHBGaWxlOjppbml0KE10cENsaWVudCogY2xpZW50KSB7CisgICAgc0NsaWVudCA9IGNsaWVudDsKK30KKworTXRwRmlsZSogTXRwRmlsZTo6cGFyc2VQYXRoKE10cEZpbGUqIGJhc2UsIGNoYXIqIHBhdGgpIHsKKyAgICBNdHBEZXZpY2UqIGRldmljZSA9IE5VTEw7CisgICAgTXRwU3RvcmFnZUlEIHN0b3JhZ2UgPSAwOworICAgIE10cE9iamVjdEhhbmRsZSBoYW5kbGUgPSAwOworCisgICAgaWYgKHBhdGhbMF0gIT0gJy8nICYmIGJhc2UpIHsKKyAgICAgICAgZGV2aWNlID0gYmFzZS0+bURldmljZTsKKyAgICAgICAgc3RvcmFnZSA9IGJhc2UtPm1TdG9yYWdlOworICAgICAgICBoYW5kbGUgPSBiYXNlLT5tSGFuZGxlOworICAgIH0KKworICAgIC8vIHBhcnNlIGFuIGFic29sdXRlIHBhdGgKKyAgICBpZiAocGF0aFswXSA9PSAnLycpCisgICAgICAgIHBhdGgrKzsKKyAgICBjaGFyKiB0b2sgPSBzdHJ0b2socGF0aCwgIi8iKTsKKyAgICB3aGlsZSAodG9rKSB7CisgICAgICAgIGlmIChzdG9yYWdlKSB7CisgICAgICAgICAgICAvLyBmaW5kIGNoaWxkIG9mIGN1cnJlbnQgaGFuZGxlCisgICAgICAgICAgICBNdHBPYmplY3RIYW5kbGVMaXN0KiBoYW5kbGVzID0gZGV2aWNlLT5nZXRPYmplY3RIYW5kbGVzKHN0b3JhZ2UsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGhhbmRsZSA/IGhhbmRsZSA6IC0xKSk7CisgICAgICAgICAgICBNdHBPYmplY3RIYW5kbGUgY2hpbGRIYW5kbGUgPSAwOworCisgICAgICAgICAgICBpZiAoaGFuZGxlcykgeworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaGFuZGxlcy0+c2l6ZSgpICYmICFjaGlsZEhhbmRsZTsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIE10cE9iamVjdEhhbmRsZSBoYW5kbGUgPSAoKmhhbmRsZXMpW2ldOworICAgICAgICAgICAgICAgICAgICBNdHBPYmplY3RJbmZvKiBpbmZvID0gZGV2aWNlLT5nZXRPYmplY3RJbmZvKGhhbmRsZSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChpbmZvICYmICFzdHJjbXAodG9rLCBpbmZvLT5tTmFtZSkpCisgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZEhhbmRsZSA9IGhhbmRsZTsKKyAgICAgICAgICAgICAgICAgICAgZGVsZXRlIGluZm87CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGRlbGV0ZSBoYW5kbGVzOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGNoaWxkSGFuZGxlKQorICAgICAgICAgICAgICAgIGhhbmRsZSA9IGNoaWxkSGFuZGxlOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9IGVsc2UgaWYgKGRldmljZSkgeworICAgICAgICAgICAgdW5zaWduZWQgaW50IGlkOworICAgICAgICAgICAgLy8gZmluZCBzdG9yYWdlIGZvciB0aGUgZGV2aWNlCisgICAgICAgICAgICBpZiAoc3NjYW5mKHRvaywgIiV4IiwgJmlkKSA9PSAxKSB7CisgICAgICAgICAgICAgICAgTXRwU3RvcmFnZUlETGlzdCogc3RvcmFnZUxpc3QgPSBkZXZpY2UtPmdldFN0b3JhZ2VJRHMoKTsKKyAgICAgICAgICAgICAgICBib29sIGZvdW5kID0gZmFsc2U7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzdG9yYWdlTGlzdC0+c2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCgqc3RvcmFnZUxpc3QpW2ldID09IGlkKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoZm91bmQpCisgICAgICAgICAgICAgICAgICAgIHN0b3JhZ2UgPSBpZDsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gZmluZCBkZXZpY2UKKyAgICAgICAgICAgIHVuc2lnbmVkIGludCBpZDsKKyAgICAgICAgICAgIGlmIChzc2NhbmYodG9rLCAiJWQiLCAmaWQpID09IDEpCisgICAgICAgICAgICAgICAgZGV2aWNlID0gc0NsaWVudC0+Z2V0RGV2aWNlKGlkKTsKKyAgICAgICAgICAgIGlmICghZGV2aWNlKQorICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisKKyAgICAgICAgdG9rID0gc3RydG9rKE5VTEwsICIvIik7CisgICAgfQorCisgICAgaWYgKGRldmljZSkKKyAgICAgICAgcmV0dXJuIG5ldyBNdHBGaWxlKGRldmljZSwgc3RvcmFnZSwgaGFuZGxlKTsKKyAgICBlbHNlCisgICAgICAgIHJldHVybiBOVUxMOworfQorCit9CmRpZmYgLS1naXQgYS9tZWRpYS90ZXN0cy9tdHAvTXRwRmlsZS5oIGIvbWVkaWEvdGVzdHMvbXRwL010cEZpbGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYjg3NjJiCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvdGVzdHMvbXRwL010cEZpbGUuaApAQCAtMCwwICsxLDU3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfTVRQX0ZJTEVfSAorI2RlZmluZSBfTVRQX0ZJTEVfSAorCisjaW5jbHVkZSAiTXRwVHlwZXMuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjbGFzcyBNdHBDbGllbnQ7CitjbGFzcyBNdHBEZXZpY2U7CitjbGFzcyBNdHBPYmplY3RJbmZvOworCisvLyBGaWxlLWxpa2UgYWJzdHJhY3Rpb24gZm9yIHRoZSBpbnRlcmFjdGl2ZSBzaGVsbC4KKy8vIFRoaXMgY2FuIGJlIHVzZWQgdG8gcmVwcmVzZW50IGFuIE1UUCBkZXZpY2UsIHN0b3JhZ2UgdW5pdCBvciBvYmplY3QKKy8vIChlaXRoZXIgZmlsZSBvciBhc3NvY2lhdGlvbikuCitjbGFzcyBNdHBGaWxlIHsKK3ByaXZhdGU6CisgICAgTXRwRGV2aWNlKiAgICAgICAgICBtRGV2aWNlOworICAgIE10cFN0b3JhZ2VJRCAgICAgICAgbVN0b3JhZ2U7CisgICAgTXRwT2JqZWN0SGFuZGxlICAgICBtSGFuZGxlOworICAgIHN0YXRpYyBNdHBDbGllbnQqICAgc0NsaWVudDsKKworcHVibGljOgorICAgIE10cEZpbGUoTXRwRGV2aWNlKiBkZXZpY2UpOworICAgIE10cEZpbGUoTXRwRGV2aWNlKiBkZXZpY2UsIE10cFN0b3JhZ2VJRCBzdG9yYWdlKTsKKyAgICBNdHBGaWxlKE10cERldmljZSogZGV2aWNlLCBNdHBTdG9yYWdlSUQgc3RvcmFnZSwgTXRwT2JqZWN0SGFuZGxlIGhhbmRsZSk7CisgICAgTXRwRmlsZShNdHBGaWxlKiBmaWxlKTsKKyAgICB2aXJ0dWFsIH5NdHBGaWxlKCk7CisKKyAgICBNdHBPYmplY3RJbmZvKiBnZXRPYmplY3RJbmZvKCk7CisgICAgdm9pZCBwcmludCgpOworICAgIHZvaWQgbGlzdCgpOworCisgICAgaW5saW5lIE10cERldmljZSogZ2V0RGV2aWNlKCkgY29uc3QgeyByZXR1cm4gbURldmljZTsgfQorCisgICAgc3RhdGljIHZvaWQgaW5pdChNdHBDbGllbnQqIGNsaWVudCk7CisgICAgc3RhdGljIE10cEZpbGUqIHBhcnNlUGF0aChNdHBGaWxlKiBiYXNlLCBjaGFyKiBwYXRoKTsKK307CisKK30KKworI2VuZGlmIC8vIF9NVFBfRElSRUNUT1JZX0gKZGlmZiAtLWdpdCBhL21lZGlhL3Rlc3RzL210cC9tdHAuY3BwIGIvbWVkaWEvdGVzdHMvbXRwL210cC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmM1ZTIzYgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL3Rlc3RzL210cC9tdHAuY3BwCkBAIC0wLDAgKzEsMzcwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisKKyNpZiBIQVZFX1JFQURMSU5FCisjaW5jbHVkZSA8cmVhZGxpbmUvcmVhZGxpbmUuaD4KKyNpbmNsdWRlIDxyZWFkbGluZS9oaXN0b3J5Lmg+CisjZW5kaWYKKworI2luY2x1ZGUgIk10cENsaWVudC5oIgorI2luY2x1ZGUgIk10cERldmljZS5oIgorI2luY2x1ZGUgIk10cE9iamVjdEluZm8uaCIKKworI2luY2x1ZGUgIk10cEZpbGUuaCIKKworI2RlZmluZSBQUk9NUFQgICJtdHA+ICIKKwordXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7CisKK3N0YXRpYyBNdHBDbGllbnQqIHNDbGllbnQgPSBOVUxMOworCisvLyBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5IGluZm9ybWF0aW9uIGZvciBpbnRlcmFjdGl2ZSBzaGVsbAorc3RhdGljIE10cEZpbGUqIHNDdXJyZW50RGlyZWN0b3J5ID0gTlVMTDsKKworc3RhdGljIE10cEZpbGUqIHBhcnNlX3BhdGgoY2hhciogcGF0aCkgeworICAgIHJldHVybiBNdHBGaWxlOjpwYXJzZVBhdGgoc0N1cnJlbnREaXJlY3RvcnksIHBhdGgpOworfQorCitjbGFzcyBNeUNsaWVudCA6IHB1YmxpYyBNdHBDbGllbnQgeworcHJpdmF0ZToKKyAgICB2aXJ0dWFsIHZvaWQgZGV2aWNlQWRkZWQoTXRwRGV2aWNlICpkZXZpY2UpIHsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHZvaWQgZGV2aWNlUmVtb3ZlZChNdHBEZXZpY2UgKmRldmljZSkgeworICAgIH0KKworcHVibGljOgorfTsKKworc3RhdGljIHZvaWQgaW5pdCgpIHsKKyAgICBzQ2xpZW50ID0gbmV3IE15Q2xpZW50OworICAgIHNDbGllbnQtPnN0YXJ0KCk7CisgICAgTXRwRmlsZTo6aW5pdChzQ2xpZW50KTsKK30KKworc3RhdGljIGludCBzZXRfY3dkKGludCBhcmdjLCBjaGFyKiBhcmd2W10pIHsKKyAgICBpZiAoYXJnYyAhPSAxKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiY2Qgc2hvdWxkIGhhdmUgb25lIGFyZ3VtZW50XG4iKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBpZiAoIXN0cmNtcChhcmd2WzBdLCAiLyIpKSB7CisgICAgICAgIGRlbGV0ZSBzQ3VycmVudERpcmVjdG9yeTsKKyAgICAgICAgc0N1cnJlbnREaXJlY3RvcnkgPSBOVUxMOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgTXRwRmlsZSogZmlsZSA9IHBhcnNlX3BhdGgoYXJndlswXSk7CisgICAgICAgIGlmIChmaWxlKSB7CisgICAgICAgICAgICBkZWxldGUgc0N1cnJlbnREaXJlY3Rvcnk7CisgICAgICAgICAgICBzQ3VycmVudERpcmVjdG9yeSA9IGZpbGU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImNvdWxkIG5vdCBmaW5kICVzXG4iLCBhcmd2WzBdKTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgbGlzdF9kZXZpY2VzKCkgeworICAgIC8vIFRPRE8gLSBuZWVkIHRvIG1ha2Ugc3VyZSB0aGUgbGlzdCB3aWxsIG5vdCBjaGFuZ2Ugd2hpbGUgaXRlcmF0aW5nCisgICAgTXRwRGV2aWNlTGlzdCYgZGV2aWNlcyA9IHNDbGllbnQtPmdldERldmljZUxpc3QoKTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGRldmljZXMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgTXRwRGV2aWNlKiBkZXZpY2UgPSBkZXZpY2VzW2ldOworICAgICAgICBNdHBGaWxlKiBmaWxlID0gbmV3IE10cEZpbGUoZGV2aWNlKTsKKyAgICAgICAgZmlsZS0+cHJpbnQoKTsKKyAgICAgICAgZGVsZXRlIGZpbGU7CisgICAgfQorfQorCitzdGF0aWMgaW50IGxpc3QoaW50IGFyZ2MsIGNoYXIqIGFyZ3ZbXSkgeworICAgIGlmIChhcmdjID09IDApIHsKKyAgICAgICAgLy8gbGlzdCBjd2QKKyAgICAgICAgaWYgKHNDdXJyZW50RGlyZWN0b3J5KSB7CisgICAgICAgICAgICBzQ3VycmVudERpcmVjdG9yeS0+bGlzdCgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbGlzdF9kZXZpY2VzKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGFyZ2M7IGkrKykgeworICAgICAgICBjaGFyKiBwYXRoID0gYXJndltpXTsKKyAgICAgICAgaWYgKCFzdHJjbXAocGF0aCwgIi8iKSkgeworICAgICAgICAgICAgbGlzdF9kZXZpY2VzKCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBNdHBGaWxlKiBmaWxlID0gcGFyc2VfcGF0aChwYXRoKTsKKyAgICAgICAgICAgIGlmICghZmlsZSkgeworICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiY291bGQgbm90IGZpbmQgJXNcbiIsIHBhdGgpOworICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZpbGUtPmxpc3QoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGdldF9maWxlKGludCBhcmdjLCBjaGFyKiBhcmd2W10pIHsKKyAgICBpbnQgcmV0ID0gLTE7CisgICAgaW50IHNyY0ZEID0gLTE7CisgICAgaW50IGRlc3RGRCA9IC0xOworICAgIE10cEZpbGUqIHNyY0ZpbGUgPSBOVUxMOworICAgIE10cE9iamVjdEluZm8qIGluZm8gPSBOVUxMOworICAgIGNoYXIqIGRlc3Q7CisKKyAgICBpZiAoYXJnYyA8IDEpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJub3QgZW5vdWdoIGFyZ3VtZW50c1xuIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9IGVsc2UgaWYgKGFyZ2MgPiAyKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAidG9vIG1hbnkgYXJndW1lbnRzXG4iKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIC8vIGZpbmQgc291cmNlIG9iamVjdAorICAgIGNoYXIqIHNyYyA9IGFyZ3ZbMF07CisgICAgc3JjRmlsZSA9IHBhcnNlX3BhdGgoc3JjKTsKKyAgICBpZiAoIXNyY0ZpbGUpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJjb3VsZCBub3QgZmluZCAlc1xuIiwgc3JjKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBpbmZvID0gc3JjRmlsZS0+Z2V0T2JqZWN0SW5mbygpOworICAgIGlmICghaW5mbykgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImNvdWxkIG5vdCBmaW5kIG9iamVjdCBpbmZvIGZvciAlc1xuIiwgc3JjKTsKKyAgICAgICAgZ290byBmYWlsOworICAgIH0KKyAgICBpZiAoaW5mby0+bUZvcm1hdCA9PSBNVFBfRk9STUFUX0FTU09DSUFUSU9OKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiY29weWluZyBkaXJlY3RvcmllcyBub3QgaW1wbGVtZW50ZWQgeWV0XG4iKTsKKyAgICAgICAgZ290byBmYWlsOworICAgIH0KKworICAgIGRlc3QgPSAoYXJnYyA+IDEgPyBhcmd2WzFdIDogaW5mby0+bU5hbWUpOworICAgIGRlc3RGRCA9IG9wZW4oZGVzdCwgT19XUk9OTFkgfCBPX0NSRUFUIHwgT19UUlVOQywgU19JUlVTUiB8IFNfSVdVU1IgfCBTX0lSR1JQIHwgU19JUk9USCk7CisgICAgaWYgKGRlc3RGRCA8IDApIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJjb3VsZCBub3QgY3JlYXRlICVzXG4iLCBkZXN0KTsKKyAgICAgICAgZ290byBmYWlsOworICAgIH0KKyAgICBzcmNGRCA9IHNyY0ZpbGUtPmdldERldmljZSgpLT5yZWFkT2JqZWN0KGluZm8tPm1IYW5kbGUsIGluZm8tPm1Db21wcmVzc2VkU2l6ZSk7CisgICAgaWYgKHNyY0ZEIDwgMCkKKyAgICAgICAgZ290byBmYWlsOworCisgICAgY2hhciBidWZmZXJbNjU1MzZdOworICAgIHdoaWxlICgxKSB7CisgICAgICAgIGludCBjb3VudCA9IHJlYWQoc3JjRkQsIGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlcikpOworICAgICAgICBpZiAoY291bnQgPD0gMCkKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB3cml0ZShkZXN0RkQsIGJ1ZmZlciwgY291bnQpOworICAgIH0KKyAgICAvLyBGSVhNRSAtIGVycm9yIGNoZWNraW5nIGFuZCByZXBvcnRpbmcKKyAgICByZXQgPSAwOworCitmYWlsOgorICAgIGRlbGV0ZSBzcmNGaWxlOworICAgIGRlbGV0ZSBpbmZvOworICAgIGlmIChzcmNGRCA+PSAwKQorICAgICAgICBjbG9zZShzcmNGRCk7CisgICAgaWYgKGRlc3RGRCA+PSAwKQorICAgICAgICBjbG9zZShkZXN0RkQpOworICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgcHV0X2ZpbGUoaW50IGFyZ2MsIGNoYXIqIGFyZ3ZbXSkgeworICAgIGludCByZXQgPSAtMTsKKyAgICBpbnQgc3JjRkQgPSAtMTsKKyAgICBNdHBGaWxlKiBkZXN0RmlsZSA9IE5VTEw7CisgICAgTXRwT2JqZWN0SW5mbyogc3JjSW5mbyA9IE5VTEw7CisgICAgTXRwT2JqZWN0SW5mbyogZGVzdEluZm8gPSBOVUxMOworICAgIE10cE9iamVjdEhhbmRsZSBoYW5kbGU7CisgICAgc3RydWN0IHN0YXQgc3RhdGJ1ZjsKKyAgICBjb25zdCBjaGFyKiBsYXN0U2xhc2g7CisKKyAgICBpZiAoYXJnYyA8IDEpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJub3QgZW5vdWdoIGFyZ3VtZW50c1xuIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9IGVsc2UgaWYgKGFyZ2MgPiAyKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAidG9vIG1hbnkgYXJndW1lbnRzXG4iKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBjb25zdCBjaGFyKiBzcmMgPSBhcmd2WzBdOworICAgIHNyY0ZEID0gb3BlbihzcmMsIE9fUkRPTkxZKTsKKyAgICBpZiAoc3JjRkQgPCAwKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiY291bGQgbm90IG9wZW4gJXNcbiIsIHNyYyk7CisgICAgICAgIGdvdG8gZmFpbDsKKyAgICB9CisgICAgaWYgKGFyZ2MgPT0gMikgeworICAgICAgICAgY2hhciogZGVzdCA9IGFyZ3ZbMV07CisgICAgICAgIGRlc3RGaWxlID0gcGFyc2VfcGF0aChkZXN0KTsKKyAgICAgICAgaWYgKCFkZXN0RmlsZSkgeworICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJjb3VsZCBub3QgZmluZCAlc1xuIiwgZGVzdCk7CisgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBpZiAoIXNDdXJyZW50RGlyZWN0b3J5KSB7CisgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImN1cnJlbnQgd29ya2luZyBkaXJlY3Rvcnkgbm90IHNldFxuIik7CisgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgIH0KKyAgICAgICAgZGVzdEZpbGUgPSBuZXcgTXRwRmlsZShzQ3VycmVudERpcmVjdG9yeSk7CisgICAgfQorCisgICAgZGVzdEluZm8gPSBkZXN0RmlsZS0+Z2V0T2JqZWN0SW5mbygpOworICAgIGlmICghZGVzdEluZm8pIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJjb3VsZCBub3QgZmluZCBvYmplY3QgaW5mbyBkZXN0aW5hdGlvbiBkaXJlY3RvcnlcbiIpOworICAgICAgICBnb3RvIGZhaWw7CisgICAgfQorICAgIGlmIChkZXN0SW5mby0+bUZvcm1hdCAhPSBNVFBfRk9STUFUX0FTU09DSUFUSU9OKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiZGVzdGluYXRpb24gbm90IGEgZGlyZWN0b3J5XG4iKTsKKyAgICAgICAgZ290byBmYWlsOworICAgIH0KKworICAgIGlmIChmc3RhdChzcmNGRCwgJnN0YXRidWYpKQorICAgICAgICBnb3RvIGZhaWw7CisKKyAgICBzcmNJbmZvID0gbmV3IE10cE9iamVjdEluZm8oMCk7CisgICAgc3JjSW5mby0+bVN0b3JhZ2VJRCA9IGRlc3RJbmZvLT5tU3RvcmFnZUlEOworICAgIHNyY0luZm8tPm1Gb3JtYXQgPSBNVFBfRk9STUFUX0VYSUZfSlBFRzsgIC8vIEZJWE1FCisgICAgc3JjSW5mby0+bUNvbXByZXNzZWRTaXplID0gc3RhdGJ1Zi5zdF9zaXplOworICAgIHNyY0luZm8tPm1QYXJlbnQgPSBkZXN0SW5mby0+bUhhbmRsZTsKKyAgICBsYXN0U2xhc2ggPSBzdHJyY2hyKHNyYywgJy8nKTsKKyAgICBzcmNJbmZvLT5tTmFtZSA9IHN0cmR1cChsYXN0U2xhc2ggPyBsYXN0U2xhc2ggKyAxIDogc3JjKTsKKyAgICBzcmNJbmZvLT5tRGF0ZU1vZGlmaWVkID0gc3RhdGJ1Zi5zdF9tdGltZTsKKyAgICBoYW5kbGUgPSBkZXN0RmlsZS0+Z2V0RGV2aWNlKCktPnNlbmRPYmplY3RJbmZvKHNyY0luZm8pOworICAgIGlmIChoYW5kbGUgPD0gMCkgeworICAgICAgICBwcmludGYoInNlbmRPYmplY3RJbmZvIHJldHVybmVkICUwNFhcbiIsIGhhbmRsZSk7CisgICAgICAgIGdvdG8gZmFpbDsKKyAgICB9CisgICAgaWYgKGRlc3RGaWxlLT5nZXREZXZpY2UoKS0+c2VuZE9iamVjdChzcmNJbmZvLCBzcmNGRCkpCisgICAgICAgIHJldCA9IDA7CisKK2ZhaWw6CisgICAgZGVsZXRlIGRlc3RGaWxlOworICAgIGRlbGV0ZSBzcmNJbmZvOworICAgIGRlbGV0ZSBkZXN0SW5mbzsKKyAgICBpZiAoc3JjRkQgPj0gMCkKKyAgICAgICAgY2xvc2Uoc3JjRkQpOworICAgIHByaW50ZigicmV0dXJuaW5nICVkXG4iLCByZXQpOworICAgIHJldHVybiByZXQ7Cit9CisKK3R5cGVkZWYgaW50ICgqIGNvbW1hbmRfZnVuYykoaW50IGFyZ2MsIGNoYXIqIGFyZ3ZbXSk7CisKK3N0cnVjdCBjb21tYW5kX3RhYmxlX2VudHJ5IHsKKyAgICBjb25zdCBjaGFyKiBuYW1lOworICAgIGNvbW1hbmRfZnVuYyBmdW5jOworfTsKKworY29uc3QgY29tbWFuZF90YWJsZV9lbnRyeSBjb21tYW5kX2xpc3RbXSA9IHsKKyAgICB7ICAgImNkIiwgICAgICAgc2V0X2N3ZCAgICAgICAgIH0sCisgICAgeyAgICJscyIsICAgICAgIGxpc3QgICAgICAgICAgICB9LAorICAgIHsgICAiZ2V0IiwgICAgICBnZXRfZmlsZSAgICAgICAgfSwKKyAgICB7ICAgInB1dCIsICAgICAgcHV0X2ZpbGUgICAgICAgIH0sCisgICAgeyAgIE5VTEwsICAgICAgIE5VTEwgICAgICAgICAgICB9LAorfTsKKworCitzdGF0aWMgaW50IGRvX2NvbW1hbmQoaW50IGFyZ2MsIGNoYXIqIGFyZ3ZbXSkgeworICAgIGNvbnN0IGNvbW1hbmRfdGFibGVfZW50cnkqIGNvbW1hbmQgPSBjb21tYW5kX2xpc3Q7CisgICAgY29uc3QgY2hhciogbmFtZSA9ICphcmd2Kys7CisgICAgYXJnYy0tOworCisgICAgd2hpbGUgKGNvbW1hbmQtPm5hbWUpIHsKKyAgICAgICAgaWYgKCFzdHJjbXAoY29tbWFuZC0+bmFtZSwgbmFtZSkpCisgICAgICAgICAgICByZXR1cm4gY29tbWFuZC0+ZnVuYyhhcmdjLCBhcmd2KTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgY29tbWFuZCsrOworICAgIH0KKyAgICBmcHJpbnRmKHN0ZGVyciwgInVua25vd24gY29tbWFuZCAlc1xuIiwgbmFtZSk7CisgICAgcmV0dXJuIC0xOworfQorCitzdGF0aWMgaW50IHNoZWxsKCkgeworICAgIGludCBhcmdjOworICAgIGludCByZXN1bHQgPSAwOworI2RlZmluZSBNQVhfQVJHUyAgICAxMDAKKyAgICBjaGFyKiBhcmd2W01BWF9BUkdTXTsKKworI2lmIEhBVkVfUkVBRExJTkUKKyAgICB1c2luZ19oaXN0b3J5KCk7CisjZW5kaWYKKworICAgIHdoaWxlICgxKSB7CisjaWYgSEFWRV9SRUFETElORQorICAgICAgICBjaGFyKiBsaW5lID0gcmVhZGxpbmUoUFJPTVBUKTsKKyAgICAgICAgaWYgKCFsaW5lKSB7CisgICAgICAgICAgICBwcmludGYoIlxuIik7CisgICAgICAgICAgICBleGl0KDApOworICAgICAgICB9CisjZWxzZQorICAgICAgICBjaGFyICAgIGJ1ZmZlclsxMDAwXTsKKyAgICAgICAgcHJpbnRmKCIlcyIsIFBST01QVCk7CisgICAgICAgIGNoYXIqIGxpbmUgPSBOVUxMOworICAgICAgICBzaXplX3QgbGVuZ3RoID0gMDsKKworICAgICAgICBidWZmZXJbMF0gPSAwOworICAgICAgICBmZ2V0cyhidWZmZXIsIHNpemVvZihidWZmZXIpLCBzdGRpbik7CisgICAgICAgIGludCBjb3VudCA9IHN0cmxlbihidWZmZXIpOworICAgICAgICBpZiAoY291bnQgPiAwICYmIGJ1ZmZlclswXSA9PSBFT0YpIHsKKyAgICAgICAgICAgIHByaW50ZigiXG4iKTsKKyAgICAgICAgICAgIGV4aXQoMCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGNvdW50ID4gMCAmJiBsaW5lW2NvdW50IC0gMV0gPT0gJ1xuJykKKyAgICAgICAgICAgIGxpbmVbY291bnQgLSAxXSA9PSAwOworI2VuZGlmCisgICAgICAgIGNoYXIqIHRvayA9IHN0cnRvayhsaW5lLCAiIFx0XG5cciIpOworICAgICAgICBpZiAoIXRvaykKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICBpZiAoIXN0cmNtcCh0b2ssICJxdWl0IikgfHwgIXN0cmNtcCh0b2ssICJleGl0IikpIHsKKyAgICAgICAgICAgIGV4aXQoMCk7CisgICAgICAgIH0KKyNpZiBIQVZFX1JFQURMSU5FCisgICAgICAgIGFkZF9oaXN0b3J5KGxpbmUpOworI2VuZGlmCisgICAgICAgIGFyZ2MgPSAwOworICAgICAgICB3aGlsZSAodG9rKSB7CisgICAgICAgICAgICBpZiAoYXJnYyArIDEgPT0gTUFYX0FSR1MpIHsKKyAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgInRvbyBtYW55IGFyZ3VtZW50c1xuIik7CisgICAgICAgICAgICAgICAgcmVzdWx0ID0gLTE7CisgICAgICAgICAgICAgICAgZ290byBib3R0b21fb2ZfbG9vcDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYXJndlthcmdjKytdID0gc3RyZHVwKHRvayk7CisgICAgICAgICAgICB0b2sgPSBzdHJ0b2soTlVMTCwgIiBcdFxuXHIiKTsKKyAgICAgICAgfQorCisgICAgICAgIHJlc3VsdCA9IGRvX2NvbW1hbmQoYXJnYywgYXJndik7CisKK2JvdHRvbV9vZl9sb29wOgorICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGFyZ2M7IGkrKykKKyAgICAgICAgICAgIGZyZWUoYXJndltpXSk7CisgICAgICAgIGZyZWUobGluZSk7CisgICAgfQorCisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIqIGFyZ3ZbXSkgeworICAgIGluaXQoKTsKKworICAgIGlmIChhcmdjID09IDEpCisgICAgICAgIHJldHVybiBzaGVsbCgpOworICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIGRvX2NvbW1hbmQoYXJnYyAtIDEsIGFyZ3YgKyAxKTsKK30KZGlmZiAtLWdpdCBhL21lZGlhL3Rlc3RzL3BsYXllcnMvaW52b2tlX21vY2tfbWVkaWFfcGxheWVyLmNwcCBiL21lZGlhL3Rlc3RzL3BsYXllcnMvaW52b2tlX21vY2tfbWVkaWFfcGxheWVyLmNwcAppbmRleCBiM2NjOGI2Li41MzMwOGJlIDEwMDY0NAotLS0gYS9tZWRpYS90ZXN0cy9wbGF5ZXJzL2ludm9rZV9tb2NrX21lZGlhX3BsYXllci5jcHAKKysrIGIvbWVkaWEvdGVzdHMvcGxheWVycy9pbnZva2VfbW9ja19tZWRpYV9wbGF5ZXIuY3BwCkBAIC0yNiw2ICsyNiw3IEBACiAKIHVzaW5nIGFuZHJvaWQ6OklOVkFMSURfT1BFUkFUSU9OOwogdXNpbmcgYW5kcm9pZDo6SVN1cmZhY2U7Cit1c2luZyBhbmRyb2lkOjpTdXJmYWNlOwogdXNpbmcgYW5kcm9pZDo6TWVkaWFQbGF5ZXJCYXNlOwogdXNpbmcgYW5kcm9pZDo6T0s7CiB1c2luZyBhbmRyb2lkOjpQYXJjZWw7CkBAIC02Nyw3ICs2OCw4IEBACiAgICAgfQogCiAgICAgdmlydHVhbCBzdGF0dXNfdCAgICBzZXREYXRhU291cmNlKGludCBmZCwgaW50NjRfdCBvZmZzZXQsIGludDY0X3QgbGVuZ3RoKSB7cmV0dXJuIE9LO30KLSAgICB2aXJ0dWFsIHN0YXR1c190ICAgIHNldFZpZGVvU3VyZmFjZShjb25zdCBzcDxJU3VyZmFjZT4mIHN1cmZhY2UpIHtyZXR1cm4gT0s7fQorICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgc2V0VmlkZW9JU3VyZmFjZShjb25zdCBzcDxJU3VyZmFjZT4mIHN1cmZhY2UpIHtyZXR1cm4gT0s7fQorICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgc2V0VmlkZW9TdXJmYWNlKGNvbnN0IHNwPFN1cmZhY2U+JiBzdXJmYWNlKSB7cmV0dXJuIE9LO30KICAgICB2aXJ0dWFsIHN0YXR1c190ICAgIHByZXBhcmUoKSB7cmV0dXJuIE9LO30KICAgICB2aXJ0dWFsIHN0YXR1c190ICAgIHByZXBhcmVBc3luYygpIHtyZXR1cm4gT0s7fQogICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgc3RhcnQoKSB7cmV0dXJuIE9LO30KZGlmZiAtLWdpdCBhL25hdGl2ZS9pbmNsdWRlL2FuZHJvaWQvdHRzLmggYi9uYXRpdmUvaW5jbHVkZS9hbmRyb2lkL3R0cy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZiMTUxMDgKLS0tIC9kZXYvbnVsbAorKysgYi9uYXRpdmUvaW5jbHVkZS9hbmRyb2lkL3R0cy5oCkBAIC0wLDAgKzEsMzEzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IEdvb2dsZSBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisjaWZuZGVmIEFORFJPSURfVFRTX0gKKyNkZWZpbmUgQU5EUk9JRF9UVFNfSCAKKworLy8gVGhpcyBoZWFkZXIgZGVmaW5lcyB0aGUgaW50ZXJmYWNlIHVzZWQgYnkgdGhlIEFuZHJvaWQgcGxhdGZvcm0KKy8vIHRvIGFjY2VzcyBUZXh0LVRvLVNwZWVjaCBmdW5jdGlvbmFsaXR5IGluIHNoYXJlZCBsaWJyYXJpZXMgdGhhdCBpbXBsZW1lbnQKKy8vIHNwZWVjaCBzeW50aGVzaXMgYW5kIHRoZSBtYW5hZ2VtZW50IG9mIHJlc291cmNlcyBhc3NvY2lhdGVkIHdpdGggdGhlCisvLyBzeW50aGVzaXMuCisKKy8vIFRoZSBzaGFyZWQgbGlicmFyeSBtdXN0IGNvbnRhaW4gYSBmdW5jdGlvbiBuYW1lZCAiYW5kcm9pZF9nZXRUdHNFbmdpbmUiCisvLyB0aGF0IHJldHVybnMgYW4gJ2FuZHJvaWRfdHRzX2VuZ2luZV90JyBpbnN0YW5jZS4KKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisjZGVmaW5lIEFORFJPSURfVFRTX0VOR0lORV9QUk9QRVJUWV9DT05GSUcgImVuZ2luZUNvbmZpZyIKKyNkZWZpbmUgQU5EUk9JRF9UVFNfRU5HSU5FX1BST1BFUlRZX1BJVENIICAicGl0Y2giCisjZGVmaW5lIEFORFJPSURfVFRTX0VOR0lORV9QUk9QRVJUWV9SQVRFICAgInJhdGUiCisjZGVmaW5lIEFORFJPSURfVFRTX0VOR0lORV9QUk9QRVJUWV9WT0xVTUUgInZvbHVtZSIKKwordHlwZWRlZiBlbnVtIHsKKyAgICBBTkRST0lEX1RUU19TVUNDRVNTICAgICAgICAgICAgICAgICA9IDAsCisgICAgQU5EUk9JRF9UVFNfRkFJTFVSRSAgICAgICAgICAgICAgICAgPSAtMSwKKyAgICBBTkRST0lEX1RUU19GRUFUVVJFX1VOU1VQUE9SVEVEICAgICA9IC0yLAorICAgIEFORFJPSURfVFRTX1ZBTFVFX0lOVkFMSUQgICAgICAgICAgID0gLTMsCisgICAgQU5EUk9JRF9UVFNfUFJPUEVSVFlfVU5TVVBQT1JURUQgICAgPSAtNCwKKyAgICBBTkRST0lEX1RUU19QUk9QRVJUWV9TSVpFX1RPT19TTUFMTCA9IC01LAorICAgIEFORFJPSURfVFRTX01JU1NJTkdfUkVTT1VSQ0VTICAgICAgID0gLTYKK30gYW5kcm9pZF90dHNfcmVzdWx0X3Q7CisKK3R5cGVkZWYgZW51bSB7CisgICAgQU5EUk9JRF9UVFNfTEFOR19DT1VOVFJZX1ZBUl9BVkFJTEFCTEUgPSAyLAorICAgIEFORFJPSURfVFRTX0xBTkdfQ09VTlRSWV9BVkFJTEFCTEUgICAgPSAxLAorICAgIEFORFJPSURfVFRTX0xBTkdfQVZBSUxBQkxFICAgICAgICAgICAgPSAwLAorICAgIEFORFJPSURfVFRTX0xBTkdfTUlTU0lOR19EQVRBICAgICAgICAgPSAtMSwKKyAgICBBTkRST0lEX1RUU19MQU5HX05PVF9TVVBQT1JURUQgICAgICAgID0gLTIKK30gYW5kcm9pZF90dHNfc3VwcG9ydF9yZXN1bHRfdDsKKwordHlwZWRlZiBlbnVtIHsKKyAgICBBTkRST0lEX1RUU19TWU5USF9ET05FICAgICAgICAgICAgICA9IDAsCisgICAgQU5EUk9JRF9UVFNfU1lOVEhfUEVORElORyAgICAgICAgICAgPSAxCit9IGFuZHJvaWRfdHRzX3N5bnRoX3N0YXR1c190OworCit0eXBlZGVmIGVudW0geworICAgIEFORFJPSURfVFRTX0NBTExCQUNLX0hBTFQgICAgICAgICAgID0gMCwKKyAgICBBTkRST0lEX1RUU19DQUxMQkFDS19DT05USU5VRSAgICAgICA9IDEKK30gYW5kcm9pZF90dHNfY2FsbGJhY2tfc3RhdHVzX3Q7CisKKy8vIFN1cHBvcnRlZCBhdWRpbyBmb3JtYXRzCit0eXBlZGVmIGVudW0geworICAgIEFORFJPSURfVFRTX0FVRElPX0ZPUk1BVF9JTlZBTElEICAgID0gLTEsCisgICAgQU5EUk9JRF9UVFNfQVVESU9fRk9STUFUX0RFRkFVTFQgICAgPSAwLAorICAgIEFORFJPSURfVFRTX0FVRElPX0ZPUk1BVF9QQ01fMTZfQklUID0gMSwKKyAgICBBTkRST0lEX1RUU19BVURJT19GT1JNQVRfUENNXzhfQklUICA9IDIsCit9IGFuZHJvaWRfdHRzX2F1ZGlvX2Zvcm1hdF90OworCisKKy8qIEFuIGFuZHJvaWRfdHRzX2VuZ2luZV90IG9iamVjdCBjYW4gYmUgYW55dGhpbmcsIGJ1dCBtdXN0IGhhdmUsCisgKiBhcyBpdHMgZmlyc3QgZmllbGQsIGEgcG9pbnRlciB0byBhIHRhYmxlIG9mIGZ1bmN0aW9ucy4KKyAqCisgKiBTZWUgdGhlIGZ1bGwgZGVmaW5pdGlvbiBvZiBzdHJ1Y3QgYW5kcm9pZF90dHNfZW5naW5lX3RfZnVuY3NfdAorICogYmVsb3cgZm9yIGRldGFpbHMuCisgKi8KK3R5cGVkZWYgc3RydWN0IGFuZHJvaWRfdHRzX2VuZ2luZV9mdW5jc190ICBhbmRyb2lkX3R0c19lbmdpbmVfZnVuY3NfdDsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIGFuZHJvaWRfdHRzX2VuZ2luZV9mdW5jc190ICpmdW5jczsKK30gYW5kcm9pZF90dHNfZW5naW5lX3Q7CisKKy8qIFRoaXMgZnVuY3Rpb24gbXVzdCBiZSBsb2NhdGVkIGluIHRoZSBUVFMgRW5naW5lIHNoYXJlZCBsaWJyYXJ5CisgKiBhbmQgbXVzdCByZXR1cm4gdGhlIGFkZHJlc3Mgb2YgYW4gYW5kcm9pZF90dHNfZW5naW5lX3QgbGlicmFyeS4KKyAqLworZXh0ZXJuIGFuZHJvaWRfdHRzX2VuZ2luZV90ICphbmRyb2lkX2dldFR0c0VuZ2luZSgpOworCisvKiBJbmNsdWRpbmcgdGhlIG9sZCB2ZXJzaW9uIGZvciBsZWdhY3kgc3VwcG9ydCAoRnJveW8gY29tcGF0aWJpbGl0eSkuCisgKiBUaGlzIHNob3VsZCByZXR1cm4gdGhlIHNhbWUgdGhpbmcgYXMgYW5kcm9pZF9nZXRUdHNFbmdpbmUuCisgKi8KK2V4dGVybiAiQyIgYW5kcm9pZF90dHNfZW5naW5lX3QgKmdldFR0c0VuZ2luZSgpOworCisvLyBBIGNhbGxiYWNrIHR5cGUgdXNlZCB0byBub3RpZnkgdGhlIGZyYW1ld29yayBvZiBuZXcgc3ludGhldGl6ZWQKKy8vIGF1ZGlvIHNhbXBsZXMsIHN0YXR1cyB3aWxsIGJlIFNZTlRIX0RPTkUgZm9yIHRoZSBsYXN0IHNhbXBsZSBvZgorLy8gdGhlIGxhc3QgcmVxdWVzdCwgb2YgU1lOVEhfUEVORElORyBvdGhlcndpc2UuCisvLworLy8gVGhpcyBpcyBwYXNzZWQgYnkgdGhlIGZyYW1ld29yayB0byB0aGUgZW5naW5lIHRocm91Z2ggdGhlCisvLyAnZW5naW5lX2luaXQnIGZ1bmN0aW9uIChzZWUgYmVsb3cpLgorLy8KKy8vIFRoZSBjYWxsYmFjayBmb3Igc3ludGhlc2lzIGNvbXBsZXRlZCB0YWtlczoKKy8vIEBwYXJhbSBbaW5vdXRdIHZvaWQgKiYgICAgICAgLSBUaGUgdXNlcmRhdGEgcG9pbnRlciBzZXQgaW4gdGhlIG9yaWdpbmFsCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5bnRoIGNhbGwKKy8vIEBwYXJhbSBbaW5dICAgIHVpbnQzMl90ICAgICAgLSBUcmFjayBzYW1wbGluZyByYXRlIGluIEh6CisvLyBAcGFyYW0gW2luXSAgICB1aW50MzJfdCAgICAgIC0gVGhlIGF1ZGlvIGZvcm1hdAorLy8gQHBhcmFtIFtpbl0gICAgaW50ICAgICAgICAgICAtIFRoZSBudW1iZXIgb2YgY2hhbm5lbHMKKy8vIEBwYXJhbSBbaW5vdXRdIGludDhfdCAqJiAgICAgLSBBIGJ1ZmZlciBvZiBhdWRpbyBkYXRhIG9ubHkgdmFsaWQgZHVyaW5nIHRoZQorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGlvbiBvZiB0aGUgY2FsbGJhY2sKKy8vIEBwYXJhbSBbaW5vdXRdIHNpemVfdCAgJiAgICAgLSBUaGUgc2l6ZSBvZiB0aGUgYnVmZmVyCisvLyBAcGFyYW0gW2luXSB0dHNfc3ludGhfc3RhdHVzIC0gaW5kaWNhdGUgd2hldGhlciB0aGUgc3ludGhlc2lzIGlzIGRvbmUsIG9yCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIG1vcmUgZGF0YSBpcyB0byBiZSBzeW50aGVzaXplZC4KKy8vIEByZXR1cm4gVFRTX0NBTExCQUNLX0hBTFQgdG8gaW5kaWNhdGUgdGhlIHN5bnRoZXNpcyBtdXN0IHN0b3AsCisvLyAgICAgICAgIFRUU19DQUxMQkFDS19DT05USU5VRSB0byBpbmRpY2F0ZSB0aGUgc3ludGhlc2lzIG11c3QgY29udGludWUgaWYKKy8vICAgICAgICAgICAgdGhlcmUgaXMgbW9yZSBkYXRhIHRvIHByb2R1Y2UuCit0eXBlZGVmIGFuZHJvaWRfdHRzX2NhbGxiYWNrX3N0YXR1c190ICgqYW5kcm9pZF90dHNfc3ludGhfY2JfdCkKKyAgICAgICAgICAgICh2b2lkICoqcFVzZXJEYXRhLAorICAgICAgICAgICAgIHVpbnQzMl90IHRyYWNrU2FtcGxpbmdIeiwKKyAgICAgICAgICAgICBhbmRyb2lkX3R0c19hdWRpb19mb3JtYXRfdCBhdWRpb0Zvcm1hdCwKKyAgICAgICAgICAgICBpbnQgY2hhbm5lbENvdW50LAorICAgICAgICAgICAgIGludDhfdCAqKnBBdWRpb0J1ZmZlciwKKyAgICAgICAgICAgICBzaXplX3QgKnBCdWZmZXJTaXplLAorICAgICAgICAgICAgIGFuZHJvaWRfdHRzX3N5bnRoX3N0YXR1c190IHN0YXR1cyk7CisKKworLy8gVGhlIHRhYmxlIG9mIGZ1bmN0aW9uIHBvaW50ZXJzIHRoYXQgdGhlIGFuZHJvaWRfdHRzX2VuZ2luZV90IG11c3QgcG9pbnQgdG8uCisvLyBOb3RlIHRoYXQgZWFjaCBvZiB0aGVzZSBmdW5jdGlvbnMgd2lsbCB0YWtlIGEgaGFuZGxlIHRvIHRoZSBlbmdpbmUgaXRzZWxmCisvLyBhcyB0aGVpciBmaXJzdCBwYXJhbWV0ZXIuCisvLworCitzdHJ1Y3QgYW5kcm9pZF90dHNfZW5naW5lX2Z1bmNzX3QgeworICAgIC8vIHJlc2VydmVkIGZpZWxkcywgaWdub3JlZCBieSB0aGUgZnJhbWV3b3JrCisgICAgLy8gdGhleSBtdXN0IGJlIHBsYWNlZCBoZXJlIHRvIGVuc3VyZSBiaW5hcnkgY29tcGF0aWJpbGl0eQorICAgIC8vIG9mIGxlZ2FjeSBiaW5hcnkgcGx1Z2lucy4KKyAgICB2b2lkICpyZXNlcnZlZFsyXTsKKworICAgIC8vIEluaXRpYWxpemUgdGhlIFRUUyBlbmdpbmUgYW5kIHJldHVybnMgd2hldGhlciBpbml0aWFsaXphdGlvbiBzdWNjZWVkZWQuCisgICAgLy8gQHBhcmFtIHN5bnRoRG9uZUNCUHRyIHN5bnRoZXNpcyBjYWxsYmFjayBmdW5jdGlvbiBwb2ludGVyCisgICAgLy8gQHJldHVybiBUVFNfU1VDQ0VTUywgb3IgVFRTX0ZBSUxVUkUKKyAgICBhbmRyb2lkX3R0c19yZXN1bHRfdCAoKmluaXQpCisgICAgICAgICAgICAodm9pZCAqZW5naW5lLAorICAgICAgICAgICAgIGFuZHJvaWRfdHRzX3N5bnRoX2NiX3Qgc3ludGhEb25lUHRyLAorICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmVuZ2luZUNvbmZpZyk7CisKKyAgICAvLyBTaHV0IGRvd24gdGhlIFRUUyBlbmdpbmUgYW5kIHJlbGVhc2VzIGFsbCBhc3NvY2lhdGVkIHJlc291cmNlcy4KKyAgICAvLyBAcmV0dXJuIFRUU19TVUNDRVNTLCBvciBUVFNfRkFJTFVSRQorICAgIGFuZHJvaWRfdHRzX3Jlc3VsdF90ICgqc2h1dGRvd24pCisgICAgICAgICAgICAodm9pZCAqZW5naW5lKTsKKworICAgIC8vIEludGVycnVwdCBzeW50aGVzaXMgYW5kIGZsdXNoZXMgYW55IHN5bnRoZXNpemVkIGRhdGEgdGhhdCBoYXNuJ3QgYmVlbgorICAgIC8vIG91dHB1dCB5ZXQuIFRoaXMgd2lsbCBibG9jayB1bnRpbCBjYWxsYmFja3MgdW5kZXJ3YXkgYXJlIGNvbXBsZXRlZC4KKyAgICAvLyBAcmV0dXJuIFRUU19TVUNDRVNTLCBvciBUVFNfRkFJTFVSRQorICAgIGFuZHJvaWRfdHRzX3Jlc3VsdF90ICgqc3RvcCkKKyAgICAgICAgICAgICh2b2lkICplbmdpbmUpOworCisgICAgLy8gUmV0dXJucyB0aGUgbGV2ZWwgb2Ygc3VwcG9ydCBmb3IgdGhlIGxhbmd1YWdlLCBjb3VudHJ5IGFuZCB2YXJpYW50LgorICAgIC8vIEByZXR1cm4gVFRTX0xBTkdfQ09VTlRSWV9WQVJfQVZBSUxBQkxFIGlmIHRoZSBsYW5ndWFnZSwgY291bnRyeSBhbmQgdmFyaWFudCBhcmUgc3VwcG9ydGVkLAorICAgIC8vICAgICAgICAgICAgYW5kIHRoZSBjb3JyZXNwb25kaW5nIHJlc291cmNlcyBhcmUgY29ycmVjdGx5IGluc3RhbGxlZAorICAgIC8vICAgICAgICAgVFRTX0xBTkdfQ09VTlRSWV9BVkFJTEFCTEUgaWYgdGhlIGxhbmd1YWdlIGFuZCBjb3VudHJ5IGFyZSBzdXBwb3J0ZWQgYW5kIHRoZQorICAgIC8vICAgICAgICAgICAgIGNvcnJlc3BvbmRpbmcgcmVzb3VyY2VzIGFyZSBjb3JyZWN0bHkgaW5zdGFsbGVkLCBidXQgdGhlcmUgaXMgbm8gbWF0Y2ggZm9yCisgICAgLy8gICAgICAgICAgICAgdGhlIHNwZWNpZmllZCB2YXJpYW50CisgICAgLy8gICAgICAgICBUVFNfTEFOR19BVkFJTEFCTEUgaWYgdGhlIGxhbmd1YWdlIGlzIHN1cHBvcnRlZCBhbmQgdGhlCisgICAgLy8gICAgICAgICAgICAgY29ycmVzcG9uZGluZyByZXNvdXJjZXMgYXJlIGNvcnJlY3RseSBpbnN0YWxsZWQsIGJ1dCB0aGVyZSBpcyBubyBtYXRjaCBmb3IKKyAgICAvLyAgICAgICAgICAgICB0aGUgc3BlY2lmaWVkIGNvdW50cnkgYW5kIHZhcmlhbnQKKyAgICAvLyAgICAgICAgIFRUU19MQU5HX01JU1NJTkdfREFUQSBpZiB0aGUgcmVxdWlyZWQgcmVzb3VyY2VzIHRvIHByb3ZpZGUgYW55IGxldmVsIG9mIHN1cHBvcnQKKyAgICAvLyAgICAgICAgICAgICBmb3IgdGhlIGxhbmd1YWdlIGFyZSBub3QgY29ycmVjdGx5IGluc3RhbGxlZAorICAgIC8vICAgICAgICAgVFRTX0xBTkdfTk9UX1NVUFBPUlRFRCBpZiB0aGUgbGFuZ3VhZ2UgaXMgbm90IHN1cHBvcnRlZCBieSB0aGUgVFRTIGVuZ2luZS4KKyAgICBhbmRyb2lkX3R0c19zdXBwb3J0X3Jlc3VsdF90ICgqaXNMYW5ndWFnZUF2YWlsYWJsZSkKKyAgICAgICAgICAgICh2b2lkICplbmdpbmUsCisgICAgICAgICAgICAgY29uc3QgY2hhciAqbGFuZywKKyAgICAgICAgICAgICBjb25zdCBjaGFyICpjb3VudHJ5LAorICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnZhcmlhbnQpOworCisgICAgLy8gTG9hZCB0aGUgcmVzb3VyY2VzIGFzc29jaWF0ZWQgd2l0aCB0aGUgc3BlY2lmaWVkIGxhbmd1YWdlLiBUaGUgbG9hZGVkCisgICAgLy8gbGFuZ3VhZ2Ugd2lsbCBvbmx5IGJlIHVzZWQgb25jZSBhIGNhbGwgdG8gc2V0TGFuZ3VhZ2UoKSB3aXRoIHRoZSBzYW1lCisgICAgLy8gbGFuZ3VhZ2UgdmFsdWUgaXMgaXNzdWVkLiBMYW5ndWFnZSBhbmQgY291bnRyeSB2YWx1ZXMgYXJlIGNvZGVkIGFjY29yZGluZyB0byB0aGUgSVNPIHRocmVlCisgICAgLy8gbGV0dGVyIGNvZGVzIGZvciBsYW5ndWFnZXMgYW5kIGNvdW50cmllcywgYXMgY2FuIGJlIHJldHJpZXZlZCBmcm9tIGEgamF2YS51dGlsLkxvY2FsZQorICAgIC8vIGluc3RhbmNlLiBUaGUgdmFyaWFudCB2YWx1ZSBpcyBlbmNvZGVkIGFzIHRoZSB2YXJpYW50IHN0cmluZyByZXRyaWV2ZWQgZnJvbSBhCisgICAgLy8gamF2YS51dGlsLkxvY2FsZSBpbnN0YW5jZSBidWlsdCB3aXRoIHRoYXQgdmFyaWFudCBkYXRhLgorICAgIC8vIEBwYXJhbSBsYW5nIHBvaW50ZXIgdG8gdGhlIElTTyB0aHJlZSBsZXR0ZXIgY29kZSBmb3IgdGhlIGxhbmd1YWdlCisgICAgLy8gQHBhcmFtIGNvdW50cnkgcG9pbnRlciB0byB0aGUgSVNPIHRocmVlIGxldHRlciBjb2RlIGZvciB0aGUgY291bnRyeQorICAgIC8vIEBwYXJhbSB2YXJpYW50IHBvaW50ZXIgdG8gdGhlIHZhcmlhbnQgY29kZQorICAgIC8vIEByZXR1cm4gVFRTX1NVQ0NFU1MsIG9yIFRUU19GQUlMVVJFCisgICAgYW5kcm9pZF90dHNfcmVzdWx0X3QgKCpsb2FkTGFuZ3VhZ2UpCisgICAgICAgICAgICAodm9pZCAqZW5naW5lLAorICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmxhbmcsCisgICAgICAgICAgICAgY29uc3QgY2hhciAqY291bnRyeSwKKyAgICAgICAgICAgICBjb25zdCBjaGFyICp2YXJpYW50KTsKKworICAgIC8vIExvYWQgdGhlIHJlc291cmNlcyBhc3NvY2lhdGVkIHdpdGggdGhlIHNwZWNpZmllZCBsYW5ndWFnZSwgY291bnRyeSBhbmQgTG9jYWxlIHZhcmlhbnQuCisgICAgLy8gVGhlIGxvYWRlZCBsYW5ndWFnZSB3aWxsIG9ubHkgYmUgdXNlZCBvbmNlIGEgY2FsbCB0byBzZXRMYW5ndWFnZUZyb21Mb2NhbGUoKSB3aXRoIHRoZSBzYW1lCisgICAgLy8gbGFuZ3VhZ2UgdmFsdWUgaXMgaXNzdWVkLiBMYW5ndWFnZSBhbmQgY291bnRyeSB2YWx1ZXMgYXJlIGNvZGVkIGFjY29yZGluZyB0byB0aGUgSVNPIHRocmVlCisgICAgLy8gbGV0dGVyIGNvZGVzIGZvciBsYW5ndWFnZXMgYW5kIGNvdW50cmllcywgYXMgY2FuIGJlIHJldHJpZXZlZCBmcm9tIGEgamF2YS51dGlsLkxvY2FsZQorICAgIC8vIGluc3RhbmNlLiBUaGUgdmFyaWFudCB2YWx1ZSBpcyBlbmNvZGVkIGFzIHRoZSB2YXJpYW50IHN0cmluZyByZXRyaWV2ZWQgZnJvbSBhCisgICAgLy8gamF2YS51dGlsLkxvY2FsZSBpbnN0YW5jZSBidWlsdCB3aXRoIHRoYXQgdmFyaWFudCBkYXRhLgorICAgIC8vIEBwYXJhbSBsYW5nIHBvaW50ZXIgdG8gdGhlIElTTyB0aHJlZSBsZXR0ZXIgY29kZSBmb3IgdGhlIGxhbmd1YWdlCisgICAgLy8gQHBhcmFtIGNvdW50cnkgcG9pbnRlciB0byB0aGUgSVNPIHRocmVlIGxldHRlciBjb2RlIGZvciB0aGUgY291bnRyeQorICAgIC8vIEBwYXJhbSB2YXJpYW50IHBvaW50ZXIgdG8gdGhlIHZhcmlhbnQgY29kZQorICAgIC8vIEByZXR1cm4gVFRTX1NVQ0NFU1MsIG9yIFRUU19GQUlMVVJFCisgICAgYW5kcm9pZF90dHNfcmVzdWx0X3QgKCpzZXRMYW5ndWFnZSkKKyAgICAgICAgICAgICh2b2lkICplbmdpbmUsCisgICAgICAgICAgICAgY29uc3QgY2hhciAqbGFuZywKKyAgICAgICAgICAgICBjb25zdCBjaGFyICpjb3VudHJ5LAorICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnZhcmlhbnQpOworCisgICAgLy8gUmV0cmlldmUgdGhlIGN1cnJlbnRseSBzZXQgbGFuZ3VhZ2UsIGNvdW50cnkgYW5kIHZhcmlhbnQsIG9yIGVtcHR5IHN0cmluZ3MgaWYgbm9uZSBvZgorICAgIC8vIHBhcmFtZXRlcnMgaGF2ZSBiZWVuIHNldC4gTGFuZ3VhZ2UgYW5kIGNvdW50cnkgYXJlIHJlcHJlc2VudGVkIGJ5IHRoZWlyIDMtbGV0dGVyIElTTyBjb2RlCisgICAgLy8gQHBhcmFtW291dF0gICBwb2ludGVyIHRvIHRoZSByZXRyaWV2ZWQgMy1sZXR0ZXIgY29kZSBsYW5ndWFnZSB2YWx1ZQorICAgIC8vIEBwYXJhbVtvdXRdICAgcG9pbnRlciB0byB0aGUgcmV0cmlldmVkIDMtbGV0dGVyIGNvZGUgY291bnRyeSB2YWx1ZQorICAgIC8vIEBwYXJhbVtvdXRdICAgcG9pbnRlciB0byB0aGUgcmV0cmlldmVkIHZhcmlhbnQgdmFsdWUKKyAgICAvLyBAcmV0dXJuIFRUU19TVUNDRVNTLCBvciBUVFNfRkFJTFVSRQorICAgIGFuZHJvaWRfdHRzX3Jlc3VsdF90ICgqZ2V0TGFuZ3VhZ2UpCisgICAgICAgICAgICAodm9pZCAqZW5naW5lLAorICAgICAgICAgICAgIGNoYXIgKmxhbmd1YWdlLAorICAgICAgICAgICAgIGNoYXIgKmNvdW50cnksCisgICAgICAgICAgICAgY2hhciAqdmFyaWFudCk7CisKKyAgICAvLyBOb3RpZmllcyB0aGUgZW5naW5lIHdoYXQgYXVkaW8gcGFyYW1ldGVycyBzaG91bGQgYmUgdXNlZCBmb3IgdGhlIHN5bnRoZXNpcy4KKyAgICAvLyBUaGlzIGlzIG1lYW50IHRvIGJlIHVzZWQgYXMgYSBoaW50LCB0aGUgZW5naW5lIGltcGxlbWVudGF0aW9uIHdpbGwgc2V0IHRoZSBvdXRwdXQgdmFsdWVzCisgICAgLy8gdG8gdGhvc2Ugb2YgdGhlIHN5bnRoZXNpcyBmb3JtYXQsIGJhc2VkIG9uIGEgZ2l2ZW4gaGludC4KKyAgICAvLyBAcGFyYW1baW5vdXRdIGVuY29kaW5nIGluOiB0aGUgZGVzaXJlZCBhdWRpbyBzYW1wbGUgZm9ybWF0CisgICAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgb3V0OiB0aGUgZm9ybWF0IHVzZWQgYnkgdGhlIFRUUyBlbmdpbmUKKyAgICAvLyBAcGFyYW1baW5vdXRdIHJhdGUgaW46IHRoZSBkZXNpcmVkIGF1ZGlvIHNhbXBsZSByYXRlCisgICAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgb3V0OiB0aGUgc2FtcGxlIHJhdGUgdXNlZCBieSB0aGUgVFRTIGVuZ2luZQorICAgIC8vIEBwYXJhbVtpbm91dF0gY2hhbm5lbHMgaW46IHRoZSBkZXNpcmVkIG51bWJlciBvZiBhdWRpbyBjaGFubmVscworICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgIG91dDogdGhlIG51bWJlciBvZiBjaGFubmVscyB1c2VkIGJ5IHRoZSBUVFMgZW5naW5lCisgICAgLy8gQHJldHVybiBUVFNfU1VDQ0VTUywgb3IgVFRTX0ZBSUxVUkUKKyAgICBhbmRyb2lkX3R0c19yZXN1bHRfdCAoKnNldEF1ZGlvRm9ybWF0KQorICAgICAgICAgICAgKHZvaWQgKmVuZ2luZSwKKyAgICAgICAgICAgICBhbmRyb2lkX3R0c19hdWRpb19mb3JtYXRfdCogcEVuY29kaW5nLAorICAgICAgICAgICAgIHVpbnQzMl90KiBwUmF0ZSwKKyAgICAgICAgICAgICBpbnQqIHBDaGFubmVscyk7CisKKyAgICAvLyBTZXQgYSBwcm9wZXJ0eSBmb3IgdGhlIHRoZSBUVFMgZW5naW5lCisgICAgLy8gInNpemUiIGlzIHRoZSBtYXhpbXVtIHNpemUgb2YgInZhbHVlIiBmb3IgcHJvcGVydGllcyAicHJvcGVydHkiCisgICAgLy8gQHBhcmFtIHByb3BlcnR5IHBvaW50ZXIgdG8gdGhlIHByb3BlcnR5IG5hbWUKKyAgICAvLyBAcGFyYW0gdmFsdWUgICAgcG9pbnRlciB0byB0aGUgcHJvcGVydHkgdmFsdWUKKyAgICAvLyBAcGFyYW0gc2l6ZSAgICAgbWF4aW11bSBzaXplIHJlcXVpcmVkIHRvIHN0b3JlIHRoaXMgdHlwZSBvZiBwcm9wZXJ0eQorICAgIC8vIEByZXR1cm4gICAgICAgICBUVFNfUFJPUEVSVFlfVU5TVVBQT1JURUQsIG9yIFRUU19TVUNDRVNTLCBvciBUVFNfRkFJTFVSRSwKKyAgICAvLyAgICAgICAgICAgICAgICAgIG9yIFRUU19WQUxVRV9JTlZBTElECisgICAgYW5kcm9pZF90dHNfcmVzdWx0X3QgKCpzZXRQcm9wZXJ0eSkKKyAgICAgICAgICAgICh2b2lkICplbmdpbmUsCisgICAgICAgICAgICAgY29uc3QgY2hhciAqcHJvcGVydHksCisgICAgICAgICAgICAgY29uc3QgY2hhciAqdmFsdWUsCisgICAgICAgICAgICAgY29uc3Qgc2l6ZV90IHNpemUpOworCisgICAgLy8gUmV0cmlldmUgYSBwcm9wZXJ0eSBmcm9tIHRoZSBUVFMgZW5naW5lCisgICAgLy8gQHBhcmFtICAgICAgICBwcm9wZXJ0eSBwb2ludGVyIHRvIHRoZSBwcm9wZXJ0eSBuYW1lCisgICAgLy8gQHBhcmFtW291dF0gICB2YWx1ZSAgICBwb2ludGVyIHRvIHRoZSByZXRyaWV2ZWQgbGFuZ3VhZ2UgdmFsdWUKKyAgICAvLyBAcGFyYW1baW5vdXRdIGlvc2l6ZSAgIGluOiBzdG9yZXMgdGhlIHNpemUgYXZhaWxhYmxlIHRvIHN0b3JlIHRoZQorICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eSB2YWx1ZS4KKyAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgIG91dDogc3RvcmVzIHRoZSBzaXplIHJlcXVpcmVkIHRvIGhvbGQgdGhlIGxhbmd1YWdlCisgICAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlIGlmIGdldExhbmd1YWdlKCkgcmV0dXJuZWQKKyAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgVFRTX1BST1BFUlRZX1NJWkVfVE9PX1NNQUxMLCB1bmNoYW5nZWQgb3RoZXJ3aXNlCisgICAgLy8gQHJldHVybiBUVFNfUFJPUEVSVFlfVU5TVVBQT1JURUQsIG9yIFRUU19TVUNDRVNTLAorICAgIC8vICAgICAgICAgb3IgVFRTX1BST1BFUlRZX1NJWkVfVE9PX1NNQUxMCisgICAgYW5kcm9pZF90dHNfcmVzdWx0X3QgKCpnZXRQcm9wZXJ0eSkKKyAgICAgICAgICAgICh2b2lkICplbmdpbmUsCisgICAgICAgICAgICAgY29uc3QgY2hhciAqcHJvcGVydHksCisgICAgICAgICAgICAgY2hhciAqdmFsdWUsCisgICAgICAgICAgICAgc2l6ZV90ICppb3NpemUpOworCisgICAgLy8gU3ludGhlc2l6ZSB0aGUgdGV4dC4KKyAgICAvLyBBcyB0aGUgc3ludGhlc2lzIGlzIHBlcmZvcm1lZCwgdGhlIGVuZ2luZSBpbnZva2VzIHRoZSBjYWxsYmFjayB0byBub3RpZnkKKyAgICAvLyB0aGUgVFRTIGZyYW1ld29yayB0aGF0IGl0IGhhcyBmaWxsZWQgdGhlIGdpdmVuIGJ1ZmZlciwgYW5kIGluZGljYXRlcyBob3cKKyAgICAvLyBtYW55IGJ5dGVzIGl0IHdyb3RlLiBUaGUgY2FsbGJhY2sgaXMgY2FsbGVkIHJlcGVhdGVkbHkgdW50aWwgdGhlIGVuZ2luZQorICAgIC8vIGhhcyBnZW5lcmF0ZWQgYWxsIHRoZSBhdWRpbyBkYXRhIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHRleHQuCisgICAgLy8gTm90ZSBhYm91dCB0aGUgZm9ybWF0IG9mIHRoZSBpbnB1dDogdGhlIHRleHQgcGFyYW1ldGVyIG1heSB1c2UgdGhlCisgICAgLy8gZm9sbG93aW5nIGVsZW1lbnRzCisgICAgLy8gYW5kIHRoZWlyIHJlc3BlY3RpdmUgYXR0cmlidXRlcyBhcyBkZWZpbmVkIGluIHRoZSBTU01MIDEuMCBzcGVjaWZpY2F0aW9uOgorICAgIC8vICAgICogbGFuZworICAgIC8vICAgICogc2F5LWFzOgorICAgIC8vICAgICAgICAgIG8gaW50ZXJwcmV0LWFzCisgICAgLy8gICAgKiBwaG9uZW1lCisgICAgLy8gICAgKiB2b2ljZToKKyAgICAvLyAgICAgICAgICBvIGdlbmRlciwKKyAgICAvLyAgICAgICAgICBvIGFnZSwKKyAgICAvLyAgICAgICAgICBvIHZhcmlhbnQsCisgICAgLy8gICAgICAgICAgbyBuYW1lCisgICAgLy8gICAgKiBlbXBoYXNpcworICAgIC8vICAgICogYnJlYWs6CisgICAgLy8gICAgICAgICAgbyBzdHJlbmd0aCwKKyAgICAvLyAgICAgICAgICBvIHRpbWUKKyAgICAvLyAgICAqIHByb3NvZHk6CisgICAgLy8gICAgICAgICAgbyBwaXRjaCwKKyAgICAvLyAgICAgICAgICBvIGNvbnRvdXIsCisgICAgLy8gICAgICAgICAgbyByYW5nZSwKKyAgICAvLyAgICAgICAgICBvIHJhdGUsCisgICAgLy8gICAgICAgICAgbyBkdXJhdGlvbiwKKyAgICAvLyAgICAgICAgICBvIHZvbHVtZQorICAgIC8vICAgICogbWFyaworICAgIC8vIERpZmZlcmVuY2VzIGJldHdlZW4gdGhpcyB0ZXh0IGZvcm1hdCBhbmQgU1NNTCBhcmU6CisgICAgLy8gICAgKiBmdWxsIFNTTUwgZG9jdW1lbnRzIGFyZSBub3Qgc3VwcG9ydGVkCisgICAgLy8gICAgKiBuYW1lc3BhY2VzIGFyZSBub3Qgc3VwcG9ydGVkCisgICAgLy8gVGV4dCBpcyBjb2RlZCBpbiBVVEYtOC4KKyAgICAvLyBAcGFyYW0gdGV4dCAgICAgIHRoZSBVVEYtOCB0ZXh0IHRvIHN5bnRoZXNpemUKKyAgICAvLyBAcGFyYW0gdXNlcmRhdGEgIHBvaW50ZXIgdG8gYmUgcmV0dXJuZWQgd2hlbiB0aGUgY2FsbCBpcyBpbnZva2VkCisgICAgLy8gQHBhcmFtIGJ1ZmZlciAgICB0aGUgbG9jYXRpb24gd2hlcmUgdGhlIHN5bnRoZXNpemVkIGRhdGEgbXVzdCBiZSB3cml0dGVuCisgICAgLy8gQHBhcmFtIGJ1ZmZlclNpemUgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGNhbiBiZSB3cml0dGVuIGluIGJ1ZmZlcgorICAgIC8vIEByZXR1cm4gICAgICAgICAgVFRTX1NVQ0NFU1Mgb3IgVFRTX0ZBSUxVUkUKKyAgICBhbmRyb2lkX3R0c19yZXN1bHRfdCAoKnN5bnRoZXNpemVUZXh0KQorICAgICAgICAgICAgKHZvaWQgKmVuZ2luZSwKKyAgICAgICAgICAgICBjb25zdCBjaGFyICp0ZXh0LAorICAgICAgICAgICAgIGludDhfdCAqYnVmZmVyLAorICAgICAgICAgICAgIHNpemVfdCBidWZmZXJTaXplLAorICAgICAgICAgICAgIHZvaWQgKnVzZXJkYXRhKTsKK307CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZiAvKiBBTkRST0lEX1RUU19IICovCmRpZmYgLS1naXQgYS9vcGVuZ2wvbGlicy9FR0wvZWdsLmNwcCBiL29wZW5nbC9saWJzL0VHTC9lZ2wuY3BwCmluZGV4IGRmMjEzNThkLi42NmY5ZTJkIDEwMDY0NAotLS0gYS9vcGVuZ2wvbGlicy9FR0wvZWdsLmNwcAorKysgYi9vcGVuZ2wvbGlicy9FR0wvZWdsLmNwcApAQCAtNTksNiArNTksOCBAQAogICAgICAgICAiRUdMX0tIUl9pbWFnZSAiCiAgICAgICAgICJFR0xfS0hSX2ltYWdlX2Jhc2UgIgogICAgICAgICAiRUdMX0tIUl9pbWFnZV9waXhtYXAgIgorICAgICAgICAiRUdMX0tIUl9nbF90ZXh0dXJlXzJEX2ltYWdlICIKKyAgICAgICAgIkVHTF9LSFJfZmVuY2Vfc3luYyAiCiAgICAgICAgICJFR0xfQU5EUk9JRF9pbWFnZV9uYXRpdmVfYnVmZmVyICIKICAgICAgICAgIkVHTF9BTkRST0lEX3N3YXBfcmVjdGFuZ2xlICIKICAgICAgICAgOwpAQCAtMjQzLDkgKzI0NSwyMyBAQAogICAgIEVHTEltYWdlS0hSIGltYWdlc1tJTVBMX05VTV9JTVBMRU1FTlRBVElPTlNdOwogfTsKIAorc3RydWN0IGVnbF9zeW5jX3QgOiBwdWJsaWMgZWdsX29iamVjdF90Cit7CisgICAgdHlwZWRlZiBlZ2xfb2JqZWN0X3Q6OkxvY2FsUmVmPGVnbF9zeW5jX3QsIEVHTFN5bmNLSFI+IFJlZjsKKworICAgIGVnbF9zeW5jX3QoRUdMRGlzcGxheSBkcHksIEVHTENvbnRleHQgY29udGV4dCwgRUdMU3luY0tIUiBzeW5jKQorICAgICAgICA6IGRweShkcHkpLCBjb250ZXh0KGNvbnRleHQpLCBzeW5jKHN5bmMpCisgICAgeworICAgIH0KKyAgICBFR0xEaXNwbGF5IGRweTsKKyAgICBFR0xDb250ZXh0IGNvbnRleHQ7CisgICAgRUdMU3luY0tIUiBzeW5jOworfTsKKwogdHlwZWRlZiBlZ2xfc3VyZmFjZV90OjpSZWYgIFN1cmZhY2VSZWY7CiB0eXBlZGVmIGVnbF9jb250ZXh0X3Q6OlJlZiAgQ29udGV4dFJlZjsKIHR5cGVkZWYgZWdsX2ltYWdlX3Q6OlJlZiAgICBJbWFnZVJlZjsKK3R5cGVkZWYgZWdsX3N5bmNfdDo6UmVmICAgICBTeW5jUmVmOwogCiBzdHJ1Y3QgdGxzX3QKIHsKQEAgLTQ4MSw2ICs0OTcsMTEgQEAKICAgICByZXR1cm4gZWdsX3RvX25hdGl2ZV9jYXN0PGVnbF9pbWFnZV90PihpbWFnZSk7CiB9CiAKK3N0YXRpYyBpbmxpbmUKK2VnbF9zeW5jX3QqIGdldF9zeW5jKEVHTFN5bmNLSFIgc3luYykgeworICAgIHJldHVybiBlZ2xfdG9fbmF0aXZlX2Nhc3Q8ZWdsX3N5bmNfdD4oc3luYyk7Cit9CisKIHN0YXRpYyBlZ2xfY29ubmVjdGlvbl90KiB2YWxpZGF0ZV9kaXNwbGF5X2NvbmZpZygKICAgICAgICAgRUdMRGlzcGxheSBkcHksIEVHTENvbmZpZyBjb25maWcsCiAgICAgICAgIGVnbF9kaXNwbGF5X3QgY29uc3QqJiBkcCkKQEAgLTE3ODYsNiArMTgwNywxMTEgQEAKICAgICAgcmV0dXJuIEVHTF9UUlVFOwogfQogCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBFR0xfRUdMRVhUX1ZFUlNJT04gNQorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisKK0VHTFN5bmNLSFIgZWdsQ3JlYXRlU3luY0tIUihFR0xEaXNwbGF5IGRweSwgRUdMZW51bSB0eXBlLCBjb25zdCBFR0xpbnQgKmF0dHJpYl9saXN0KQoreworICAgIEVHTENvbnRleHQgY3R4ID0gZWdsR2V0Q3VycmVudENvbnRleHQoKTsKKyAgICBDb250ZXh0UmVmIF9jKGN0eCk7CisgICAgaWYgKCFfYy5nZXQoKSkgcmV0dXJuIHNldEVycm9yKEVHTF9CQURfQ09OVEVYVCwgRUdMX05PX0lNQUdFX0tIUik7CisgICAgaWYgKCF2YWxpZGF0ZV9kaXNwbGF5X2NvbnRleHQoZHB5LCBjdHgpKQorICAgICAgICByZXR1cm4gRUdMX05PX0lNQUdFX0tIUjsKKyAgICBlZ2xfZGlzcGxheV90IGNvbnN0ICogY29uc3QgZHAgPSBnZXRfZGlzcGxheShkcHkpOworICAgIGVnbF9jb250ZXh0X3QgKiBjb25zdCBjID0gZ2V0X2NvbnRleHQoY3R4KTsKKyAgICBFR0xTeW5jS0hSIHJlc3VsdCA9IEVHTF9OT19JTUFHRV9LSFI7CisgICAgaWYgKGMtPmNueC0+ZWdsLmVnbENyZWF0ZVN5bmNLSFIpIHsKKyAgICAgICAgRUdMU3luY0tIUiBzeW5jID0gYy0+Y254LT5lZ2wuZWdsQ3JlYXRlU3luY0tIUigKKyAgICAgICAgICAgICAgICBkcC0+ZGlzcFtjLT5pbXBsXS5kcHksIHR5cGUsIGF0dHJpYl9saXN0KTsKKyAgICAgICAgaWYgKHN5bmMgPT0gRUdMX05PX0lNQUdFX0tIUikKKyAgICAgICAgICAgIHJldHVybiBzeW5jOworICAgICAgICByZXN1bHQgPSAoZWdsX3N5bmNfdCopbmV3IGVnbF9zeW5jX3QoZHB5LCBjdHgsIHN5bmMpOworICAgIH0KKyAgICByZXR1cm4gKEVHTFN5bmNLSFIpcmVzdWx0OworfQorCitFR0xCb29sZWFuIGVnbERlc3Ryb3lTeW5jS0hSKEVHTERpc3BsYXkgZHB5LCBFR0xTeW5jS0hSIHN5bmMpCit7CisgICAgZWdsX2Rpc3BsYXlfdCBjb25zdCAqIGNvbnN0IGRwID0gZ2V0X2Rpc3BsYXkoZHB5KTsKKyAgICBpZiAoZHAgPT0gMCkgeworICAgICAgICByZXR1cm4gc2V0RXJyb3IoRUdMX0JBRF9ESVNQTEFZLCBFR0xfRkFMU0UpOworICAgIH0KKworICAgIFN5bmNSZWYgX3Moc3luYyk7CisgICAgaWYgKCFfcy5nZXQoKSkgcmV0dXJuIHNldEVycm9yKEVHTF9CQURfUEFSQU1FVEVSLCBFR0xfRkFMU0UpOworICAgIGVnbF9zeW5jX3QqIHN5bmNPYmplY3QgPSBnZXRfc3luYyhzeW5jKTsKKworICAgIEVHTENvbnRleHQgY3R4ID0gc3luY09iamVjdC0+Y29udGV4dDsKKyAgICBDb250ZXh0UmVmIF9jKGN0eCk7CisgICAgaWYgKCFfYy5nZXQoKSkgcmV0dXJuIHNldEVycm9yKEVHTF9CQURfQ09OVEVYVCwgRUdMX0ZBTFNFKTsKKyAgICBpZiAoIXZhbGlkYXRlX2Rpc3BsYXlfY29udGV4dChkcHksIGN0eCkpCisgICAgICAgIHJldHVybiBFR0xfRkFMU0U7CisKKyAgICBlZ2xfY29udGV4dF90ICogY29uc3QgYyA9IGdldF9jb250ZXh0KGN0eCk7CisKKyAgICBpZiAoYy0+Y254LT5lZ2wuZWdsRGVzdHJveVN5bmNLSFIpIHsKKyAgICAgICAgcmV0dXJuIGMtPmNueC0+ZWdsLmVnbERlc3Ryb3lTeW5jS0hSKAorICAgICAgICAgICAgICAgIGRwLT5kaXNwW2MtPmltcGxdLmRweSwgc3luY09iamVjdC0+c3luYyk7CisgICAgfQorCisgICAgcmV0dXJuIEVHTF9GQUxTRTsKK30KKworRUdMaW50IGVnbENsaWVudFdhaXRTeW5jS0hSKEVHTERpc3BsYXkgZHB5LCBFR0xTeW5jS0hSIHN5bmMsIEVHTGludCBmbGFncywgRUdMVGltZUtIUiB0aW1lb3V0KQoreworICAgIGVnbF9kaXNwbGF5X3QgY29uc3QgKiBjb25zdCBkcCA9IGdldF9kaXNwbGF5KGRweSk7CisgICAgaWYgKGRwID09IDApIHsKKyAgICAgICAgcmV0dXJuIHNldEVycm9yKEVHTF9CQURfRElTUExBWSwgRUdMX0ZBTFNFKTsKKyAgICB9CisKKyAgICBTeW5jUmVmIF9zKHN5bmMpOworICAgIGlmICghX3MuZ2V0KCkpIHJldHVybiBzZXRFcnJvcihFR0xfQkFEX1BBUkFNRVRFUiwgRUdMX0ZBTFNFKTsKKyAgICBlZ2xfc3luY190KiBzeW5jT2JqZWN0ID0gZ2V0X3N5bmMoc3luYyk7CisKKyAgICBFR0xDb250ZXh0IGN0eCA9IHN5bmNPYmplY3QtPmNvbnRleHQ7CisgICAgQ29udGV4dFJlZiBfYyhjdHgpOworICAgIGlmICghX2MuZ2V0KCkpIHJldHVybiBzZXRFcnJvcihFR0xfQkFEX0NPTlRFWFQsIEVHTF9GQUxTRSk7CisgICAgaWYgKCF2YWxpZGF0ZV9kaXNwbGF5X2NvbnRleHQoZHB5LCBjdHgpKQorICAgICAgICByZXR1cm4gRUdMX0ZBTFNFOworCisgICAgZWdsX2NvbnRleHRfdCAqIGNvbnN0IGMgPSBnZXRfY29udGV4dChjdHgpOworCisgICAgaWYgKGMtPmNueC0+ZWdsLmVnbENsaWVudFdhaXRTeW5jS0hSKSB7CisgICAgICAgIHJldHVybiBjLT5jbngtPmVnbC5lZ2xDbGllbnRXYWl0U3luY0tIUigKKyAgICAgICAgICAgICAgICBkcC0+ZGlzcFtjLT5pbXBsXS5kcHksIHN5bmNPYmplY3QtPnN5bmMsIGZsYWdzLCB0aW1lb3V0KTsKKyAgICB9CisKKyAgICByZXR1cm4gRUdMX0ZBTFNFOworfQorCitFR0xCb29sZWFuIGVnbEdldFN5bmNBdHRyaWJLSFIoRUdMRGlzcGxheSBkcHksIEVHTFN5bmNLSFIgc3luYywgRUdMaW50IGF0dHJpYnV0ZSwgRUdMaW50ICp2YWx1ZSkKK3sKKyAgICBlZ2xfZGlzcGxheV90IGNvbnN0ICogY29uc3QgZHAgPSBnZXRfZGlzcGxheShkcHkpOworICAgIGlmIChkcCA9PSAwKSB7CisgICAgICAgIHJldHVybiBzZXRFcnJvcihFR0xfQkFEX0RJU1BMQVksIEVHTF9GQUxTRSk7CisgICAgfQorCisgICAgU3luY1JlZiBfcyhzeW5jKTsKKyAgICBpZiAoIV9zLmdldCgpKSByZXR1cm4gc2V0RXJyb3IoRUdMX0JBRF9QQVJBTUVURVIsIEVHTF9GQUxTRSk7CisgICAgZWdsX3N5bmNfdCogc3luY09iamVjdCA9IGdldF9zeW5jKHN5bmMpOworCisgICAgRUdMQ29udGV4dCBjdHggPSBzeW5jT2JqZWN0LT5jb250ZXh0OworICAgIENvbnRleHRSZWYgX2MoY3R4KTsKKyAgICBpZiAoIV9jLmdldCgpKSByZXR1cm4gc2V0RXJyb3IoRUdMX0JBRF9DT05URVhULCBFR0xfRkFMU0UpOworICAgIGlmICghdmFsaWRhdGVfZGlzcGxheV9jb250ZXh0KGRweSwgY3R4KSkKKyAgICAgICAgcmV0dXJuIEVHTF9GQUxTRTsKKworICAgIGVnbF9jb250ZXh0X3QgKiBjb25zdCBjID0gZ2V0X2NvbnRleHQoY3R4KTsKKworICAgIGlmIChjLT5jbngtPmVnbC5lZ2xHZXRTeW5jQXR0cmliS0hSKSB7CisgICAgICAgIHJldHVybiBjLT5jbngtPmVnbC5lZ2xHZXRTeW5jQXR0cmliS0hSKAorICAgICAgICAgICAgICAgIGRwLT5kaXNwW2MtPmltcGxdLmRweSwgc3luY09iamVjdC0+c3luYywgYXR0cmlidXRlLCB2YWx1ZSk7CisgICAgfQorCisgICAgcmV0dXJuIEVHTF9GQUxTRTsKK30KIAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogLy8gQU5EUk9JRCBleHRlbnNpb25zCmRpZmYgLS1naXQgYS9vcGVuZ2wvbGlicy9FR0wvZWdsX2VudHJpZXMuaW4gYi9vcGVuZ2wvbGlicy9FR0wvZWdsX2VudHJpZXMuaW4KaW5kZXggNWQ4OTI4Ny4uNjNjM2MxOSAxMDA2NDQKLS0tIGEvb3BlbmdsL2xpYnMvRUdML2VnbF9lbnRyaWVzLmluCisrKyBiL29wZW5nbC9saWJzL0VHTC9lZ2xfZW50cmllcy5pbgpAQCAtNTEsNiArNTEsMTMgQEAKIEVHTF9FTlRSWShFR0xJbWFnZUtIUiwgZWdsQ3JlYXRlSW1hZ2VLSFIsICAgRUdMRGlzcGxheSwgRUdMQ29udGV4dCwgRUdMZW51bSwgRUdMQ2xpZW50QnVmZmVyLCBjb25zdCBFR0xpbnQgKikKIEVHTF9FTlRSWShFR0xCb29sZWFuLCAgZWdsRGVzdHJveUltYWdlS0hSLCAgRUdMRGlzcGxheSwgRUdMSW1hZ2VLSFIpCiAKKy8qIEVHTF9FR0xFWFRfVkVSU0lPTiA1ICovCisKK0VHTF9FTlRSWShFR0xTeW5jS0hSLCAgIGVnbENyZWF0ZVN5bmNLSFIsICAgICAgIEVHTERpc3BsYXksIEVHTGVudW0sIGNvbnN0IEVHTGludCAqKQorRUdMX0VOVFJZKEVHTEJvb2xlYW4sICAgZWdsRGVzdHJveVN5bmNLSFIsICAgICAgRUdMRGlzcGxheSwgRUdMU3luY0tIUikKK0VHTF9FTlRSWShFR0xpbnQsICAgICAgIGVnbENsaWVudFdhaXRTeW5jS0hSLCAgIEVHTERpc3BsYXksIEVHTFN5bmNLSFIsIEVHTGludCwgRUdMVGltZUtIUikKK0VHTF9FTlRSWShFR0xCb29sZWFuLCAgIGVnbEdldFN5bmNBdHRyaWJLSFIsICAgIEVHTERpc3BsYXksIEVHTFN5bmNLSFIsIEVHTGludCwgRUdMaW50ICopCisKIC8qIEFORFJPSUQgZXh0ZW5zaW9ucyAqLwogCiBFR0xfRU5UUlkoRUdMQm9vbGVhbiwgZWdsU2V0U3dhcFJlY3RhbmdsZUFORFJPSUQsIEVHTERpc3BsYXksIEVHTFN1cmZhY2UsIEVHTGludCwgRUdMaW50LCBFR0xpbnQsIEVHTGludCkKZGlmZiAtLWdpdCBhL29wZW5nbC9saWJzL0dMRVMyL2dsMi5jcHAgYi9vcGVuZ2wvbGlicy9HTEVTMi9nbDIuY3BwCmluZGV4IDkyNDczN2UuLmExMmVkZjIgMTAwNjQ0Ci0tLSBhL29wZW5nbC9saWJzL0dMRVMyL2dsMi5jcHAKKysrIGIvb3BlbmdsL2xpYnMvR0xFUzIvZ2wyLmNwcApAQCAtMzksNiArMzksOCBAQAogI3VuZGVmIENBTExfR0xfQVBJCiAjdW5kZWYgQ0FMTF9HTF9BUElfUkVUVVJOCiAKKyNkZWZpbmUgREVCVUdfQ0FMTF9HTF9BUEkgMAorCiAjaWYgVVNFX0ZBU1RfVExTX0tFWQogCiAgICAgI2lmZGVmIEhBVkVfQVJNX1RMU19SRUdJU1RFUgpAQCAtNzMsMTAgKzc1LDI0IEBACiAKICAgICAjZGVmaW5lIEFQSV9FTlRSWShfYXBpKSBfYXBpCiAKKyNpZiBERUJVR19DQUxMX0dMX0FQSQorCiAgICAgI2RlZmluZSBDQUxMX0dMX0FQSShfYXBpLCAuLi4pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICBnbF9ob29rc190OjpnbF90IGNvbnN0ICogY29uc3QgX2MgPSAmZ2V0R2xUaHJlYWRTcGVjaWZpYygpLT5nbDsgIFwKLSAgICAgICAgX2MtPl9hcGkoX19WQV9BUkdTX18pCi0gICAgCisgICAgICAgIF9jLT5fYXBpKF9fVkFfQVJHU19fKTsgXAorICAgICAgICBHTGVudW0gc3RhdHVzID0gR0xfTk9fRVJST1I7IFwKKyAgICAgICAgd2hpbGUgKChzdGF0dXMgPSBnbEdldEVycm9yKCkpICE9IEdMX05PX0VSUk9SKSB7IFwKKyAgICAgICAgICAgIExPR0QoIlsiICNfYXBpICJdIDB4JXgiLCBzdGF0dXMpOyBcCisgICAgICAgIH0KKworI2Vsc2UKKworICAgICNkZWZpbmUgQ0FMTF9HTF9BUEkoX2FwaSwgLi4uKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZ2xfaG9va3NfdDo6Z2xfdCBjb25zdCAqIGNvbnN0IF9jID0gJmdldEdsVGhyZWFkU3BlY2lmaWMoKS0+Z2w7ICBcCisgICAgICAgIF9jLT5fYXBpKF9fVkFfQVJHU19fKTsKKworI2VuZGlmCisKICAgICAjZGVmaW5lIENBTExfR0xfQVBJX1JFVFVSTihfYXBpLCAuLi4pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgIGdsX2hvb2tzX3Q6OmdsX3QgY29uc3QgKiBjb25zdCBfYyA9ICZnZXRHbFRocmVhZFNwZWNpZmljKCktPmdsOyAgXAogICAgICAgICByZXR1cm4gX2MtPl9hcGkoX19WQV9BUkdTX18pCmRpZmYgLS1naXQgYS9vcGVuZ2wvdGVzdHMvZ2xfcGVyZi9BbmRyb2lkLm1rIGIvb3BlbmdsL3Rlc3RzL2dsX3BlcmYvQW5kcm9pZC5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNzY0N2NhCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmdsL3Rlc3RzL2dsX3BlcmYvQW5kcm9pZC5tawpAQCAtMCwwICsxLDIwIEBACitMT0NBTF9QQVRIOj0gJChjYWxsIG15LWRpcikKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorCitMT0NBTF9TUkNfRklMRVM6PSBcCisJZ2wyX3BlcmYuY3BwIFwKKwlmaWxsdGVzdC5jcHAKKworTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBcCisJbGliY3V0aWxzIFwKKyAgICBsaWJFR0wgXAorICAgIGxpYkdMRVN2MiBcCisgICAgbGlidWkKKworTE9DQUxfTU9EVUxFOj0gdGVzdC1vcGVuZ2wtZ2wyX3BlcmYKKworTE9DQUxfTU9EVUxFX1RBR1MgOj0gb3B0aW9uYWwKKworTE9DQUxfQ0ZMQUdTIDo9IC1ER0xfR0xFWFRfUFJPVE9UWVBFUworCitpbmNsdWRlICQoQlVJTERfRVhFQ1VUQUJMRSkKZGlmZiAtLWdpdCBhL29wZW5nbC90ZXN0cy9nbF9wZXJmL2ZpbGxfY29tbW9uLmNwcCBiL29wZW5nbC90ZXN0cy9nbF9wZXJmL2ZpbGxfY29tbW9uLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMDY5ZjY3Ci0tLSAvZGV2L251bGwKKysrIGIvb3BlbmdsL3Rlc3RzL2dsX3BlcmYvZmlsbF9jb21tb24uY3BwCkBAIC0wLDAgKzEsMjk4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgImZyYWdtZW50X3NoYWRlcnMuY3BwIgorCitGSUxFICogZk91dCA9IE5VTEw7Cit2b2lkIHB0U3dhcCgpOworCitzdGF0aWMgY2hhciBnQ3VycmVudFRlc3ROYW1lWzEwMjRdOworc3RhdGljIHVpbnQzMl90IGdXaWR0aCA9IDA7CitzdGF0aWMgdWludDMyX3QgZ0hlaWdodCA9IDA7CisKK3N0YXRpYyB2b2lkIGNoZWNrR2xFcnJvcihjb25zdCBjaGFyKiBvcCkgeworICAgIGZvciAoR0xpbnQgZXJyb3IgPSBnbEdldEVycm9yKCk7IGVycm9yOyBlcnJvcgorICAgICAgICAgICAgPSBnbEdldEVycm9yKCkpIHsKKyAgICAgICAgTE9HRSgiYWZ0ZXIgJXMoKSBnbEVycm9yICgweCV4KVxuIiwgb3AsIGVycm9yKTsKKyAgICB9Cit9CisKK0dMdWludCBsb2FkU2hhZGVyKEdMZW51bSBzaGFkZXJUeXBlLCBjb25zdCBjaGFyKiBwU291cmNlKSB7CisgICAgR0x1aW50IHNoYWRlciA9IGdsQ3JlYXRlU2hhZGVyKHNoYWRlclR5cGUpOworICAgIGlmIChzaGFkZXIpIHsKKyAgICAgICAgZ2xTaGFkZXJTb3VyY2Uoc2hhZGVyLCAxLCAmcFNvdXJjZSwgTlVMTCk7CisgICAgICAgIGdsQ29tcGlsZVNoYWRlcihzaGFkZXIpOworICAgICAgICBHTGludCBjb21waWxlZCA9IDA7CisgICAgICAgIGdsR2V0U2hhZGVyaXYoc2hhZGVyLCBHTF9DT01QSUxFX1NUQVRVUywgJmNvbXBpbGVkKTsKKyAgICAgICAgaWYgKCFjb21waWxlZCkgeworICAgICAgICAgICAgR0xpbnQgaW5mb0xlbiA9IDA7CisgICAgICAgICAgICBnbEdldFNoYWRlcml2KHNoYWRlciwgR0xfSU5GT19MT0dfTEVOR1RILCAmaW5mb0xlbik7CisgICAgICAgICAgICBpZiAoaW5mb0xlbikgeworICAgICAgICAgICAgICAgIGNoYXIqIGJ1ZiA9IChjaGFyKikgbWFsbG9jKGluZm9MZW4pOworICAgICAgICAgICAgICAgIGlmIChidWYpIHsKKyAgICAgICAgICAgICAgICAgICAgZ2xHZXRTaGFkZXJJbmZvTG9nKHNoYWRlciwgaW5mb0xlbiwgTlVMTCwgYnVmKTsKKyAgICAgICAgICAgICAgICAgICAgTE9HRSgiQ291bGQgbm90IGNvbXBpbGUgc2hhZGVyICVkOlxuJXNcbiIsIHNoYWRlclR5cGUsIGJ1Zik7CisgICAgICAgICAgICAgICAgICAgIGZyZWUoYnVmKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZ2xEZWxldGVTaGFkZXIoc2hhZGVyKTsKKyAgICAgICAgICAgICAgICBzaGFkZXIgPSAwOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBzaGFkZXI7Cit9CisKK2VudW0geworICAgIEFfUE9TLAorICAgIEFfQ09MT1IsCisgICAgQV9URVgwLAorICAgIEFfVEVYMQorfTsKKworR0x1aW50IGNyZWF0ZVByb2dyYW0oY29uc3QgY2hhciogcFZlcnRleFNvdXJjZSwgY29uc3QgY2hhciogcEZyYWdtZW50U291cmNlKSB7CisgICAgR0x1aW50IHZlcnRleFNoYWRlciA9IGxvYWRTaGFkZXIoR0xfVkVSVEVYX1NIQURFUiwgcFZlcnRleFNvdXJjZSk7CisgICAgaWYgKCF2ZXJ0ZXhTaGFkZXIpIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgR0x1aW50IHBpeGVsU2hhZGVyID0gbG9hZFNoYWRlcihHTF9GUkFHTUVOVF9TSEFERVIsIHBGcmFnbWVudFNvdXJjZSk7CisgICAgaWYgKCFwaXhlbFNoYWRlcikgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBHTHVpbnQgcHJvZ3JhbSA9IGdsQ3JlYXRlUHJvZ3JhbSgpOworICAgIGlmIChwcm9ncmFtKSB7CisgICAgICAgIGdsQXR0YWNoU2hhZGVyKHByb2dyYW0sIHZlcnRleFNoYWRlcik7CisgICAgICAgIGNoZWNrR2xFcnJvcigiZ2xBdHRhY2hTaGFkZXIgdiIpOworICAgICAgICBnbEF0dGFjaFNoYWRlcihwcm9ncmFtLCBwaXhlbFNoYWRlcik7CisgICAgICAgIGNoZWNrR2xFcnJvcigiZ2xBdHRhY2hTaGFkZXIgcCIpOworCisgICAgICAgIGdsQmluZEF0dHJpYkxvY2F0aW9uKHByb2dyYW0sIEFfUE9TLCAiYV9wb3MiKTsKKyAgICAgICAgZ2xCaW5kQXR0cmliTG9jYXRpb24ocHJvZ3JhbSwgQV9DT0xPUiwgImFfY29sb3IiKTsKKyAgICAgICAgZ2xCaW5kQXR0cmliTG9jYXRpb24ocHJvZ3JhbSwgQV9URVgwLCAiYV90ZXgwIik7CisgICAgICAgIGdsQmluZEF0dHJpYkxvY2F0aW9uKHByb2dyYW0sIEFfVEVYMSwgImFfdGV4MSIpOworICAgICAgICBnbExpbmtQcm9ncmFtKHByb2dyYW0pOworICAgICAgICBHTGludCBsaW5rU3RhdHVzID0gR0xfRkFMU0U7CisgICAgICAgIGdsR2V0UHJvZ3JhbWl2KHByb2dyYW0sIEdMX0xJTktfU1RBVFVTLCAmbGlua1N0YXR1cyk7CisgICAgICAgIGlmIChsaW5rU3RhdHVzICE9IEdMX1RSVUUpIHsKKyAgICAgICAgICAgIEdMaW50IGJ1Zkxlbmd0aCA9IDA7CisgICAgICAgICAgICBnbEdldFByb2dyYW1pdihwcm9ncmFtLCBHTF9JTkZPX0xPR19MRU5HVEgsICZidWZMZW5ndGgpOworICAgICAgICAgICAgaWYgKGJ1Zkxlbmd0aCkgeworICAgICAgICAgICAgICAgIGNoYXIqIGJ1ZiA9IChjaGFyKikgbWFsbG9jKGJ1Zkxlbmd0aCk7CisgICAgICAgICAgICAgICAgaWYgKGJ1ZikgeworICAgICAgICAgICAgICAgICAgICBnbEdldFByb2dyYW1JbmZvTG9nKHByb2dyYW0sIGJ1Zkxlbmd0aCwgTlVMTCwgYnVmKTsKKyAgICAgICAgICAgICAgICAgICAgTE9HRSgiQ291bGQgbm90IGxpbmsgcHJvZ3JhbTpcbiVzXG4iLCBidWYpOworICAgICAgICAgICAgICAgICAgICBmcmVlKGJ1Zik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZ2xEZWxldGVQcm9ncmFtKHByb2dyYW0pOworICAgICAgICAgICAgcHJvZ3JhbSA9IDA7CisgICAgICAgIH0KKyAgICB9CisgICAgY2hlY2tHbEVycm9yKCJjcmVhdGVQcm9ncmFtIik7CisgICAgZ2xVc2VQcm9ncmFtKHByb2dyYW0pOworICAgIHJldHVybiBwcm9ncmFtOworfQorCit1aW50NjRfdCBnZXRUaW1lKCkgeworICAgIHN0cnVjdCB0aW1lc3BlYyB0OworICAgIGNsb2NrX2dldHRpbWUoQ0xPQ0tfTU9OT1RPTklDLCAmdCk7CisgICAgcmV0dXJuIHQudHZfbnNlYyArICgodWludDY0X3QpdC50dl9zZWMgKiAxMDAwICogMTAwMCAqIDEwMDApOworfQorCit1aW50NjRfdCBnVGltZTsKK3ZvaWQgc3RhcnRUaW1lcigpIHsKKyAgICBnVGltZSA9IGdldFRpbWUoKTsKK30KKworCitzdGF0aWMgdm9pZCBlbmRUaW1lcihpbnQgY291bnQpIHsKKyAgICB1aW50NjRfdCB0MiA9IGdldFRpbWUoKTsKKyAgICBkb3VibGUgZGVsdGEgPSAoKGRvdWJsZSkodDIgLSBnVGltZSkpIC8gMTAwMDAwMDAwMDsKKyAgICBkb3VibGUgcGl4ZWxzID0gKGdXaWR0aCAqIGdIZWlnaHQpICogY291bnQ7CisgICAgZG91YmxlIG1wcHMgPSBwaXhlbHMgLyBkZWx0YSAvIDEwMDAwMDA7CisgICAgZG91YmxlIGRjNjAgPSAoKGRvdWJsZSljb3VudCkgLyBkZWx0YSAvIDYwOworCisgICAgaWYgKGZPdXQpIHsKKyAgICAgICAgZnByaW50ZihmT3V0LCAiJXMsICVmLCAlZlxyXG4iLCBnQ3VycmVudFRlc3ROYW1lLCBtcHBzLCBkYzYwKTsKKyAgICAgICAgZmZsdXNoKGZPdXQpOworICAgIH0gZWxzZSB7CisgICAgICAgIHByaW50ZigiJXMsICVmLCAlZlxuIiwgZ0N1cnJlbnRUZXN0TmFtZSwgbXBwcywgZGM2MCk7CisgICAgfQorICAgIExPR0koIiVzLCAlZiwgJWZcclxuIiwgZ0N1cnJlbnRUZXN0TmFtZSwgbXBwcywgZGM2MCk7Cit9CisKKworc3RhdGljIGNvbnN0IGNoYXIgZ1ZlcnRleFNoYWRlcltdID0KKyAgICAiYXR0cmlidXRlIHZlYzQgYV9wb3M7XG4iCisgICAgImF0dHJpYnV0ZSB2ZWM0IGFfY29sb3I7XG4iCisgICAgImF0dHJpYnV0ZSB2ZWMyIGFfdGV4MDtcbiIKKyAgICAiYXR0cmlidXRlIHZlYzIgYV90ZXgxO1xuIgorICAgICJ2YXJ5aW5nIHZlYzQgdl9jb2xvcjtcbiIKKyAgICAidmFyeWluZyB2ZWMyIHZfdGV4MDtcbiIKKyAgICAidmFyeWluZyB2ZWMyIHZfdGV4MTtcbiIKKyAgICAidW5pZm9ybSB2ZWMyIHVfdGV4T2ZmO1xuIgorCisgICAgInZvaWQgbWFpbigpIHtcbiIKKyAgICAiICAgIHZfY29sb3IgPSBhX2NvbG9yO1xuIgorICAgICIgICAgdl90ZXgwID0gYV90ZXgwO1xuIgorICAgICIgICAgdl90ZXgxID0gYV90ZXgxO1xuIgorICAgICIgICAgdl90ZXgwLnggKz0gdV90ZXhPZmYueDtcbiIKKyAgICAiICAgIHZfdGV4MS55ICs9IHVfdGV4T2ZmLnk7XG4iCisgICAgIiAgICBnbF9Qb3NpdGlvbiA9IGFfcG9zO1xuIgorICAgICJ9XG4iOworCitzdGF0aWMgdm9pZCBzZXR1cFZBKCkgeworICAgIHN0YXRpYyBjb25zdCBmbG9hdCB2dHhbXSA9IHsKKyAgICAgICAgLTEuMGYsLTEuMGYsCisgICAgICAgICAxLjBmLC0xLjBmLAorICAgICAgICAtMS4wZiwgMS4wZiwKKyAgICAgICAgIDEuMGYsIDEuMGYgfTsKKyAgICBzdGF0aWMgY29uc3QgZmxvYXQgY29sb3JbXSA9IHsKKyAgICAgICAgMS4wZiwwLjBmLDEuMGYsMS4wZiwKKyAgICAgICAgMC4wZiwwLjBmLDEuMGYsMS4wZiwKKyAgICAgICAgMS4wZiwxLjBmLDAuMGYsMS4wZiwKKyAgICAgICAgMS4wZiwxLjBmLDEuMGYsMS4wZiB9OworICAgIHN0YXRpYyBjb25zdCBmbG9hdCB0ZXgwW10gPSB7CisgICAgICAgIDAuMGYsMC4wZiwKKyAgICAgICAgMS4wZiwwLjBmLAorICAgICAgICAwLjBmLDEuMGYsCisgICAgICAgIDEuMGYsMS4wZiB9OworICAgIHN0YXRpYyBjb25zdCBmbG9hdCB0ZXgxW10gPSB7CisgICAgICAgIDEuMGYsMC4wZiwKKyAgICAgICAgMS4wZiwxLjBmLAorICAgICAgICAwLjBmLDEuMGYsCisgICAgICAgIDAuMGYsMC4wZiB9OworCisgICAgZ2xFbmFibGVWZXJ0ZXhBdHRyaWJBcnJheShBX1BPUyk7CisgICAgZ2xFbmFibGVWZXJ0ZXhBdHRyaWJBcnJheShBX0NPTE9SKTsKKyAgICBnbEVuYWJsZVZlcnRleEF0dHJpYkFycmF5KEFfVEVYMCk7CisgICAgZ2xFbmFibGVWZXJ0ZXhBdHRyaWJBcnJheShBX1RFWDEpOworCisgICAgZ2xWZXJ0ZXhBdHRyaWJQb2ludGVyKEFfUE9TLCAyLCBHTF9GTE9BVCwgZmFsc2UsIDgsIHZ0eCk7CisgICAgZ2xWZXJ0ZXhBdHRyaWJQb2ludGVyKEFfQ09MT1IsIDQsIEdMX0ZMT0FULCBmYWxzZSwgMTYsIGNvbG9yKTsKKyAgICBnbFZlcnRleEF0dHJpYlBvaW50ZXIoQV9URVgwLCAyLCBHTF9GTE9BVCwgZmFsc2UsIDgsIHRleDApOworICAgIGdsVmVydGV4QXR0cmliUG9pbnRlcihBX1RFWDEsIDIsIEdMX0ZMT0FULCBmYWxzZSwgOCwgdGV4MSk7Cit9CisKK3N0YXRpYyB2b2lkIHJhbmRVbmlmb3JtKGludCBwZ20sIGNvbnN0IGNoYXIgKnZhcikgeworICAgIGludCBsb2MgPSBnbEdldFVuaWZvcm1Mb2NhdGlvbihwZ20sIHZhcik7CisgICAgaWYgKGxvYyA+PSAwKSB7CisgICAgICAgIGZsb2F0IHggPSAoKGZsb2F0KXJhbmQoKSkgLyBSQU5EX01BWDsKKyAgICAgICAgZmxvYXQgeSA9ICgoZmxvYXQpcmFuZCgpKSAvIFJBTkRfTUFYOworICAgICAgICBmbG9hdCB6ID0gKChmbG9hdClyYW5kKCkpIC8gUkFORF9NQVg7CisgICAgICAgIGZsb2F0IHcgPSAoKGZsb2F0KXJhbmQoKSkgLyBSQU5EX01BWDsKKyAgICAgICAgZ2xVbmlmb3JtNGYobG9jLCB4LCB5LCB6LCB3KTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIGRvTG9vcChib29sIHdhcm11cCwgaW50IHBnbSwgdWludDMyX3QgcGFzc0NvdW50KSB7CisgICAgaWYgKHdhcm11cCkgeworICAgICAgICBnbENsZWFyKEdMX0RFUFRIX0JVRkZFUl9CSVQgfCBHTF9DT0xPUl9CVUZGRVJfQklUKTsKKyAgICAgICAgZ2xEcmF3QXJyYXlzKEdMX1RSSUFOR0xFX1NUUklQLCAwLCA0KTsKKyAgICAgICAgcHRTd2FwKCk7CisgICAgICAgIGdsRmluaXNoKCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBzdGFydFRpbWVyKCk7CisgICAgZ2xDbGVhcihHTF9ERVBUSF9CVUZGRVJfQklUIHwgR0xfQ09MT1JfQlVGRkVSX0JJVCk7CisgICAgZm9yICh1aW50MzJfdCBjdD0wOyBjdCA8IHBhc3NDb3VudDsgY3QrKykgeworICAgICAgICBpbnQgbG9jID0gZ2xHZXRVbmlmb3JtTG9jYXRpb24ocGdtLCAidV90ZXhPZmYiKTsKKyAgICAgICAgZ2xVbmlmb3JtMmYobG9jLCAoKGZsb2F0KWN0KSAvIHBhc3NDb3VudCwgKChmbG9hdCljdCkgLyAyLmYgLyBwYXNzQ291bnQpOworCisgICAgICAgIHJhbmRVbmlmb3JtKHBnbSwgInVfY29sb3IiKTsKKyAgICAgICAgcmFuZFVuaWZvcm0ocGdtLCAidV8wIik7CisgICAgICAgIHJhbmRVbmlmb3JtKHBnbSwgInVfMSIpOworICAgICAgICByYW5kVW5pZm9ybShwZ20sICJ1XzIiKTsKKyAgICAgICAgcmFuZFVuaWZvcm0ocGdtLCAidV8zIik7CisgICAgICAgIGdsRHJhd0FycmF5cyhHTF9UUklBTkdMRV9TVFJJUCwgMCwgNCk7CisgICAgfQorICAgIHB0U3dhcCgpOworICAgIGdsRmluaXNoKCk7CisgICAgZW5kVGltZXIocGFzc0NvdW50KTsKK30KKworCitzdGF0aWMgdWludDMyX3QgcmdiKHVpbnQzMl90IHIsIHVpbnQzMl90IGcsIHVpbnQzMl90IGIpCit7CisgICAgdWludDMyX3QgcmV0ID0gMHhmZjAwMDAwMDsKKyAgICByZXQgfD0gciAmIDB4ZmY7CisgICAgcmV0IHw9IChnICYgMHhmZikgPDwgODsKKyAgICByZXQgfD0gKGIgJiAweGZmKSA8PCAxNjsKKyAgICByZXR1cm4gcmV0OworfQorCit2b2lkIGdlblRleHR1cmVzKCkgeworICAgIHVpbnQzMl90ICptID0gKHVpbnQzMl90ICopbWFsbG9jKDEwMjQqMTAyNCo0KTsKKyAgICBmb3IgKGludCB5PTA7IHkgPCAxMDI0OyB5KyspeworICAgICAgICBmb3IgKGludCB4PTA7IHggPCAxMDI0OyB4KyspeworICAgICAgICAgICAgbVt5KjEwMjQgKyB4XSA9IHJnYih4LCAoKCh4K3kpICYgMHhmZikgPT0gMHg3ZikgKiAweGZmLCB5KTsKKyAgICAgICAgfQorICAgIH0KKyAgICBnbEJpbmRUZXh0dXJlKEdMX1RFWFRVUkVfMkQsIDEpOworICAgIGdsVGV4SW1hZ2UyRChHTF9URVhUVVJFXzJELCAwLCBHTF9SR0JBLCAxMDI0LCAxMDI0LCAwLCBHTF9SR0JBLCBHTF9VTlNJR05FRF9CWVRFLCBtKTsKKyAgICBnbFRleFBhcmFtZXRlcmkoR0xfVEVYVFVSRV8yRCwgR0xfVEVYVFVSRV9NQUdfRklMVEVSLCBHTF9MSU5FQVIpOworICAgIGdsVGV4UGFyYW1ldGVyaShHTF9URVhUVVJFXzJELCBHTF9URVhUVVJFX01JTl9GSUxURVIsIEdMX0xJTkVBUik7CisgICAgZ2xUZXhQYXJhbWV0ZXJpKEdMX1RFWFRVUkVfMkQsIEdMX1RFWFRVUkVfV1JBUF9TLCBHTF9SRVBFQVQpOworICAgIGdsVGV4UGFyYW1ldGVyaShHTF9URVhUVVJFXzJELCBHTF9URVhUVVJFX1dSQVBfVCwgR0xfUkVQRUFUKTsKKworICAgIGZvciAoaW50IHk9MDsgeSA8IDE2OyB5KyspeworICAgICAgICBmb3IgKGludCB4PTA7IHggPCAxNjsgeCsrKXsKKyAgICAgICAgICAgIG1beSoxNiArIHhdID0gcmdiKHggPDwgNCwgKCgoeCt5KSAmIDB4ZikgPT0gMHg3KSAqIDB4ZmYsIHkgPDwgNCk7CisgICAgICAgIH0KKyAgICB9CisgICAgZ2xCaW5kVGV4dHVyZShHTF9URVhUVVJFXzJELCAyKTsKKyAgICBnbFRleEltYWdlMkQoR0xfVEVYVFVSRV8yRCwgMCwgR0xfUkdCQSwgMTYsIDE2LCAwLCBHTF9SR0JBLCBHTF9VTlNJR05FRF9CWVRFLCBtKTsKKyAgICBnbFRleFBhcmFtZXRlcmkoR0xfVEVYVFVSRV8yRCwgR0xfVEVYVFVSRV9NQUdfRklMVEVSLCBHTF9MSU5FQVIpOworICAgIGdsVGV4UGFyYW1ldGVyaShHTF9URVhUVVJFXzJELCBHTF9URVhUVVJFX01JTl9GSUxURVIsIEdMX0xJTkVBUik7CisgICAgZ2xUZXhQYXJhbWV0ZXJpKEdMX1RFWFRVUkVfMkQsIEdMX1RFWFRVUkVfV1JBUF9TLCBHTF9SRVBFQVQpOworICAgIGdsVGV4UGFyYW1ldGVyaShHTF9URVhUVVJFXzJELCBHTF9URVhUVVJFX1dSQVBfVCwgR0xfUkVQRUFUKTsKKyAgICBmcmVlKG0pOworfQorCitzdGF0aWMgdm9pZCBkb1NpbmdsZVRlc3QodWludDMyX3QgcGdtTnVtLCBpbnQgdGV4KSB7CisgICAgY29uc3QgY2hhciAqcGdtVHh0ID0gZ0ZyYWdtZW50VGVzdHNbcGdtTnVtXS0+dHh0OworICAgIGludCBwZ20gPSBjcmVhdGVQcm9ncmFtKGdWZXJ0ZXhTaGFkZXIsIHBnbVR4dCk7CisgICAgaWYgKCFwZ20pIHsKKyAgICAgICAgcHJpbnRmKCJlcnJvciBydW5uaW5nIHRlc3RcbiIpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGludCBsb2MgPSBnbEdldFVuaWZvcm1Mb2NhdGlvbihwZ20sICJ1X3RleDAiKTsKKyAgICBpZiAobG9jID49IDApIGdsVW5pZm9ybTFpKGxvYywgMCk7CisgICAgbG9jID0gZ2xHZXRVbmlmb3JtTG9jYXRpb24ocGdtLCAidV90ZXgxIik7CisgICAgaWYgKGxvYyA+PSAwKSBnbFVuaWZvcm0xaShsb2MsIDEpOworCisKKyAgICBnbEFjdGl2ZVRleHR1cmUoR0xfVEVYVFVSRTApOworICAgIGdsQmluZFRleHR1cmUoR0xfVEVYVFVSRV8yRCwgdGV4KTsKKyAgICBnbEFjdGl2ZVRleHR1cmUoR0xfVEVYVFVSRTEpOworICAgIGdsQmluZFRleHR1cmUoR0xfVEVYVFVSRV8yRCwgdGV4KTsKKyAgICBnbEFjdGl2ZVRleHR1cmUoR0xfVEVYVFVSRTApOworCisgICAgZ2xCbGVuZEZ1bmMoR0xfT05FLCBHTF9PTkUpOworICAgIGdsRGlzYWJsZShHTF9CTEVORCk7CisgICAgLy9zcHJpbnRmKHN0cjIsICIlaSwgJWksICVpLCAlaSwgJWksIDAiLAorICAgICAgICAgICAgLy91c2VWYXJDb2xvciwgdGV4Q291bnQsIG1vZHVsYXRlRmlyc3RUZXgsIGV4dHJhTWF0aCwgdGV4MCk7CisgICAgLy9kb0xvb3AodHJ1ZSwgcGdtLCB3LCBoLCBzdHIyKTsKKyAgICAvL2RvTG9vcChmYWxzZSwgcGdtLCB3LCBoLCBzdHIyKTsKKworICAgIGdsRW5hYmxlKEdMX0JMRU5EKTsKKyAgICBzcHJpbnRmKGdDdXJyZW50VGVzdE5hbWUsICIlcywgJWksICVpLCAxIiwgZ0ZyYWdtZW50VGVzdHNbcGdtTnVtXS0+bmFtZSwgcGdtTnVtLCB0ZXgpOworICAgIGRvTG9vcCh0cnVlLCBwZ20sIDEwMCk7CisgICAgZG9Mb29wKGZhbHNlLCBwZ20sIDEwMCk7Cit9CisKZGlmZiAtLWdpdCBhL29wZW5nbC90ZXN0cy9nbF9wZXJmL2ZpbGx0ZXN0LmNwcCBiL29wZW5nbC90ZXN0cy9nbF9wZXJmL2ZpbGx0ZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZjhmYWNhCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmdsL3Rlc3RzL2dsX3BlcmYvZmlsbHRlc3QuY3BwCkBAIC0wLDAgKzEsNTQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDx0aW1lLmg+CisjaW5jbHVkZSA8c2NoZWQuaD4KKyNpbmNsdWRlIDxzeXMvcmVzb3VyY2UuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgPEdMRVMyL2dsMi5oPgorI2luY2x1ZGUgPEdMRVMyL2dsMmV4dC5oPgorI2luY2x1ZGUgPHV0aWxzL1RpbWVycy5oPgorI2luY2x1ZGUgPEVHTC9lZ2wuaD4KKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworCit1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKKworCisjaW5jbHVkZSAiZmlsbF9jb21tb24uY3BwIgorCisKK2Jvb2wgZG9UZXN0KHVpbnQzMl90IHcsIHVpbnQzMl90IGgpIHsKKyAgICBnV2lkdGggPSB3OworICAgIGdIZWlnaHQgPSBoOworICAgIHNldHVwVkEoKTsKKyAgICBnZW5UZXh0dXJlcygpOworCisgICAgcHJpbnRmKCJcbnZhckNvbG9yLCB0ZXhDb3VudCwgbW9kdWxhdGUsIGV4dHJhTWF0aCwgdGV4U2l6ZSwgYmxlbmQsIE1wcHMsIERDNjBcbiIpOworCisgICAgZm9yICh1aW50MzJfdCBudW0gPSAwOyBudW0gPCBnRnJhZ21lbnRUZXN0Q291bnQ7IG51bSsrKSB7CisgICAgICAgIGRvU2luZ2xlVGVzdChudW0sIDIpOworICAgICAgICBpZiAoZ0ZyYWdtZW50VGVzdHNbbnVtXS0+dGV4Q291bnQpIHsKKyAgICAgICAgICAgIGRvU2luZ2xlVGVzdChudW0sIDEpOworICAgICAgICB9CisgICAgfQorCisgICAgZXhpdCgwKTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KZGlmZiAtLWdpdCBhL29wZW5nbC90ZXN0cy9nbF9wZXJmL2ZyYWdtZW50X3NoYWRlcnMuY3BwIGIvb3BlbmdsL3Rlc3RzL2dsX3BlcmYvZnJhZ21lbnRfc2hhZGVycy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzlkNWVhZAotLS0gL2Rldi9udWxsCisrKyBiL29wZW5nbC90ZXN0cy9nbF9wZXJmL2ZyYWdtZW50X3NoYWRlcnMuY3BwCkBAIC0wLDAgKzEsMTM5IEBACisKK3R5cGVkZWYgc3RydWN0IEZyYWdtZW50VGVzdFJlYyB7CisJY29uc3QgY2hhciAqIG5hbWU7CisJdWludDMyX3QgdGV4Q291bnQ7CisJY29uc3QgY2hhciAqIHR4dDsKK30gRnJhZ21lbnRUZXN0OworCitzdGF0aWMgRnJhZ21lbnRUZXN0IGZwRmlsbCA9IHsKKwkiU29saWQgY29sb3IiLCAwLAorCisgICAgInByZWNpc2lvbiBtZWRpdW1wIGZsb2F0O1xuIgorICAgICJ1bmlmb3JtIHZlYzQgdV9jb2xvcjtcbiIKKyAgICAidm9pZCBtYWluKCkge1xuIgorICAgICIgIGdsX0ZyYWdDb2xvciA9IHVfY29sb3I7XG4iCisgICAgIn1cbiIKK307CisKK3N0YXRpYyBGcmFnbWVudFRlc3QgZnBHcmFkaWVudCA9IHsKKwkiU29saWQgZ3JhZGllbnQiLCAwLAorCisgICAgInByZWNpc2lvbiBtZWRpdW1wIGZsb2F0O1xuIgorICAgICJ2YXJ5aW5nIGxvd3AgdmVjNCB2X2NvbG9yO1xuIgorICAgICJ2b2lkIG1haW4oKSB7XG4iCisgICAgIiAgZ2xfRnJhZ0NvbG9yID0gdl9jb2xvcjtcbiIKKyAgICAifVxuIgorfTsKKworc3RhdGljIEZyYWdtZW50VGVzdCBmcENvcHlUZXggPSB7CisJIlRleHR1cmUgY29weSIsIDEsCisKKyAgICAicHJlY2lzaW9uIG1lZGl1bXAgZmxvYXQ7XG4iCisgICAgInZhcnlpbmcgdmVjMiB2X3RleDA7XG4iCisgICAgInVuaWZvcm0gc2FtcGxlcjJEIHVfdGV4MDtcbiIKKyAgICAidm9pZCBtYWluKCkge1xuIgorICAgICIgIGdsX0ZyYWdDb2xvciA9IHRleHR1cmUyRCh1X3RleDAsIHZfdGV4MCk7XG4iCisgICAgIn1cbiIKK307CisKK3N0YXRpYyBGcmFnbWVudFRlc3QgZnBDb3B5VGV4R2FtbWEgPSB7CisJIlRleHR1cmUgY29weSB3aXRoIGdhbW1hIiwgMSwKKworICAgICJwcmVjaXNpb24gbWVkaXVtcCBmbG9hdDtcbiIKKyAgICAidmFyeWluZyB2ZWMyIHZfdGV4MDtcbiIKKyAgICAidW5pZm9ybSBzYW1wbGVyMkQgdV90ZXgwO1xuIgorICAgICJ2b2lkIG1haW4oKSB7XG4iCisgICAgIiAgdmVjNCB0ID0gdGV4dHVyZTJEKHVfdGV4MCwgdl90ZXgwKTtcbiIKKyAgICAiICB0LnJnYiA9IHBvdyh0LnJnYiwgdmVjMygxLjQsIDEuNCwgMS40KSk7XG4iCisgICAgIiAgZ2xfRnJhZ0NvbG9yID0gdDtcbiIKKyAgICAifVxuIgorfTsKKworc3RhdGljIEZyYWdtZW50VGVzdCBmcFRleFNwZWMgPSB7CisJIlRleHR1cmUgc3BlYyIsIDEsCisKKyAgICAicHJlY2lzaW9uIG1lZGl1bXAgZmxvYXQ7XG4iCisgICAgInZhcnlpbmcgdmVjMiB2X3RleDA7XG4iCisgICAgInVuaWZvcm0gc2FtcGxlcjJEIHVfdGV4MDtcbiIKKyAgICAidm9pZCBtYWluKCkge1xuIgorICAgICIgIHZlYzQgdCA9IHRleHR1cmUyRCh1X3RleDAsIHZfdGV4MCk7XG4iCisgICAgIiAgZmxvYXQgc2ltU3BlYyA9IGRvdChnbF9GcmFnQ29vcmQueHl6LCBnbF9GcmFnQ29vcmQueHl6KTtcbiIKKyAgICAiICBzaW1TcGVjID0gcG93KGNsYW1wKHNpbVNwZWMsIDAuMSwgMS4wKSwgNDAuMCk7XG4iCisgICAgIiAgZ2xfRnJhZ0NvbG9yID0gdCArIHZlYzQoc2ltU3BlYywgc2ltU3BlYywgc2ltU3BlYywgc2ltU3BlYyk7XG4iCisgICAgIn1cbiIKK307CisKK3N0YXRpYyBGcmFnbWVudFRlc3QgZnBEZXBUZXggPSB7CisJIkRlcGVuZGVudCBMb29rdXAiLCAxLAorCisgICAgInByZWNpc2lvbiBtZWRpdW1wIGZsb2F0O1xuIgorICAgICJ2YXJ5aW5nIHZlYzIgdl90ZXgwO1xuIgorICAgICJ1bmlmb3JtIHNhbXBsZXIyRCB1X3RleDA7XG4iCisgICAgInZvaWQgbWFpbigpIHtcbiIKKyAgICAiICB2ZWM0IHQgPSB0ZXh0dXJlMkQodV90ZXgwLCB2X3RleDApO1xuIgorICAgICIgIHQgKz0gdGV4dHVyZTJEKHVfdGV4MCwgdC54eSk7XG4iCisgICAgIiAgZ2xfRnJhZ0NvbG9yID0gdDtcbiIKKyAgICAifVxuIgorfTsKKworc3RhdGljIEZyYWdtZW50VGVzdCBmcE1vZHVsYXRlQ29uc3RhbnRUZXggPSB7CisJIlRleHR1cmUgbW9kdWxhdGUgY29uc3RhbnQiLCAxLAorCisgICAgInByZWNpc2lvbiBtZWRpdW1wIGZsb2F0O1xuIgorICAgICJ2YXJ5aW5nIHZlYzIgdl90ZXgwO1xuIgorICAgICJ1bmlmb3JtIHNhbXBsZXIyRCB1X3RleDA7XG4iCisgICAgInVuaWZvcm0gdmVjNCB1X2NvbG9yO1xuIgorCisgICAgInZvaWQgbWFpbigpIHtcbiIKKyAgICAiICBsb3dwIHZlYzQgYyA9IHRleHR1cmUyRCh1X3RleDAsIHZfdGV4MCk7XG4iCisJIiAgYyAqPSB1X2NvbG9yO1xuIgorICAgICIgIGdsX0ZyYWdDb2xvciA9IGM7XG4iCisgICAgIn1cbiIKK307CisKK3N0YXRpYyBGcmFnbWVudFRlc3QgZnBNb2R1bGF0ZVZhcnlpbmdUZXggPSB7CisJIlRleHR1cmUgbW9kdWxhdGUgZ3JhZGllbnQiLCAxLAorCisgICAgInByZWNpc2lvbiBtZWRpdW1wIGZsb2F0O1xuIgorICAgICJ2YXJ5aW5nIHZlYzIgdl90ZXgwO1xuIgorICAgICJ2YXJ5aW5nIGxvd3AgdmVjNCB2X2NvbG9yO1xuIgorICAgICJ1bmlmb3JtIHNhbXBsZXIyRCB1X3RleDA7XG4iCisKKyAgICAidm9pZCBtYWluKCkge1xuIgorICAgICIgIGxvd3AgdmVjNCBjID0gdGV4dHVyZTJEKHVfdGV4MCwgdl90ZXgwKTtcbiIKKwkiICBjICo9IHZfY29sb3I7XG4iCisgICAgIiAgZ2xfRnJhZ0NvbG9yID0gYztcbiIKKyAgICAifVxuIgorfTsKKworc3RhdGljIEZyYWdtZW50VGVzdCBmcE1vZHVsYXRlVmFyeWluZ0NvbnN0YW50VGV4ID0geworCSJUZXh0dXJlIG1vZHVsYXRlIGdyYWRpZW50IGNvbnN0YW50IiwgMSwKKworICAgICJwcmVjaXNpb24gbWVkaXVtcCBmbG9hdDtcbiIKKyAgICAidmFyeWluZyB2ZWMyIHZfdGV4MDtcbiIKKyAgICAidmFyeWluZyBsb3dwIHZlYzQgdl9jb2xvcjtcbiIKKyAgICAidW5pZm9ybSBzYW1wbGVyMkQgdV90ZXgwO1xuIgorICAgICJ1bmlmb3JtIHZlYzQgdV9jb2xvcjtcbiIKKworICAgICJ2b2lkIG1haW4oKSB7XG4iCisgICAgIiAgbG93cCB2ZWM0IGMgPSB0ZXh0dXJlMkQodV90ZXgwLCB2X3RleDApO1xuIgorCSIgIGMgKj0gdl9jb2xvcjtcbiIKKwkiICBjICo9IHVfY29sb3I7XG4iCisgICAgIiAgZ2xfRnJhZ0NvbG9yID0gYztcbiIKKyAgICAifVxuIgorfTsKKworc3RhdGljIEZyYWdtZW50VGVzdCAqZ0ZyYWdtZW50VGVzdHNbXSA9IHsKKwkmZnBGaWxsLAorCSZmcEdyYWRpZW50LAorCSZmcENvcHlUZXgsCisJJmZwQ29weVRleEdhbW1hLAorICAgJmZwVGV4U3BlYywKKyAgICZmcERlcFRleCwKKwkmZnBNb2R1bGF0ZUNvbnN0YW50VGV4LAorCSZmcE1vZHVsYXRlVmFyeWluZ1RleCwKKwkmZnBNb2R1bGF0ZVZhcnlpbmdDb25zdGFudFRleCwKKworfTsKKworc3RhdGljIGNvbnN0IHNpemVfdCBnRnJhZ21lbnRUZXN0Q291bnQgPSBzaXplb2YoZ0ZyYWdtZW50VGVzdHMpIC8gc2l6ZW9mKGdGcmFnbWVudFRlc3RzWzBdKTsKZGlmZiAtLWdpdCBhL29wZW5nbC90ZXN0cy9nbF9wZXJmL2dsMl9wZXJmLmNwcCBiL29wZW5nbC90ZXN0cy9nbF9wZXJmL2dsMl9wZXJmLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZGZjZjFjCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmdsL3Rlc3RzL2dsX3BlcmYvZ2wyX3BlcmYuY3BwCkBAIC0wLDAgKzEsMTM2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8dGltZS5oPgorI2luY2x1ZGUgPHNjaGVkLmg+CisjaW5jbHVkZSA8c3lzL3Jlc291cmNlLmg+CisKKyNpbmNsdWRlIDxFR0wvZWdsLmg+CisjaW5jbHVkZSA8R0xFUzIvZ2wyLmg+CisjaW5jbHVkZSA8R0xFUzIvZ2wyZXh0Lmg+CisKKyNpbmNsdWRlIDx1dGlscy9UaW1lcnMuaD4KKworI2luY2x1ZGUgPHVpL0ZyYW1lYnVmZmVyTmF0aXZlV2luZG93Lmg+CisjaW5jbHVkZSA8dWkvRUdMVXRpbHMuaD4KKwordXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7CisKKworc3RhdGljIHZvaWQgY2hlY2tFZ2xFcnJvcihjb25zdCBjaGFyKiBvcCwgRUdMQm9vbGVhbiByZXR1cm5WYWwgPSBFR0xfVFJVRSkgeworICAgIGlmIChyZXR1cm5WYWwgIT0gRUdMX1RSVUUpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICIlcygpIHJldHVybmVkICVkXG4iLCBvcCwgcmV0dXJuVmFsKTsKKyAgICB9CisKKyAgICBmb3IgKEVHTGludCBlcnJvciA9IGVnbEdldEVycm9yKCk7IGVycm9yICE9IEVHTF9TVUNDRVNTOyBlcnJvcgorICAgICAgICAgICAgPSBlZ2xHZXRFcnJvcigpKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiYWZ0ZXIgJXMoKSBlZ2xFcnJvciAlcyAoMHgleClcbiIsIG9wLCBFR0xVdGlsczo6c3RyZXJyb3IoZXJyb3IpLAorICAgICAgICAgICAgICAgIGVycm9yKTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIGNoZWNrR2xFcnJvcihjb25zdCBjaGFyKiBvcCkgeworICAgIGZvciAoR0xpbnQgZXJyb3IgPSBnbEdldEVycm9yKCk7IGVycm9yOyBlcnJvcgorICAgICAgICAgICAgPSBnbEdldEVycm9yKCkpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJhZnRlciAlcygpIGdsRXJyb3IgKDB4JXgpXG4iLCBvcCwgZXJyb3IpOworICAgIH0KK30KKworYm9vbCBkb1Rlc3QodWludDMyX3QgdywgdWludDMyX3QgaCk7CisKK3N0YXRpYyBFR0xEaXNwbGF5IGRweTsKK3N0YXRpYyBFR0xTdXJmYWNlIHN1cmZhY2U7CisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyKiogYXJndikgeworICAgIEVHTEJvb2xlYW4gcmV0dXJuVmFsdWU7CisgICAgRUdMQ29uZmlnIG15Q29uZmlnID0gezB9OworCisgICAgRUdMaW50IGNvbnRleHRfYXR0cmlic1tdID0geyBFR0xfQ09OVEVYVF9DTElFTlRfVkVSU0lPTiwgMiwgRUdMX05PTkUgfTsKKyAgICBFR0xpbnQgc19jb25maWdBdHRyaWJzW10gPSB7CisgICAgICAgICAgICBFR0xfU1VSRkFDRV9UWVBFLCBFR0xfV0lORE9XX0JJVCwKKyAgICAgICAgICAgIEVHTF9SRU5ERVJBQkxFX1RZUEUsIEVHTF9PUEVOR0xfRVMyX0JJVCwKKyAgICAgICAgICAgIEVHTF9OT05FIH07CisgICAgRUdMaW50IG1ham9yVmVyc2lvbjsKKyAgICBFR0xpbnQgbWlub3JWZXJzaW9uOworICAgIEVHTENvbnRleHQgY29udGV4dDsKKyAgICBFR0xpbnQgdywgaDsKKworCisgICAgY2hlY2tFZ2xFcnJvcigiPGluaXQ+Iik7CisgICAgZHB5ID0gZWdsR2V0RGlzcGxheShFR0xfREVGQVVMVF9ESVNQTEFZKTsKKyAgICBjaGVja0VnbEVycm9yKCJlZ2xHZXREaXNwbGF5Iik7CisgICAgaWYgKGRweSA9PSBFR0xfTk9fRElTUExBWSkgeworICAgICAgICBwcmludGYoImVnbEdldERpc3BsYXkgcmV0dXJuZWQgRUdMX05PX0RJU1BMQVkuXG4iKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgcmV0dXJuVmFsdWUgPSBlZ2xJbml0aWFsaXplKGRweSwgJm1ham9yVmVyc2lvbiwgJm1pbm9yVmVyc2lvbik7CisgICAgY2hlY2tFZ2xFcnJvcigiZWdsSW5pdGlhbGl6ZSIsIHJldHVyblZhbHVlKTsKKyAgICBpZiAocmV0dXJuVmFsdWUgIT0gRUdMX1RSVUUpIHsKKyAgICAgICAgcHJpbnRmKCJlZ2xJbml0aWFsaXplIGZhaWxlZFxuIik7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIEVHTE5hdGl2ZVdpbmRvd1R5cGUgd2luZG93ID0gYW5kcm9pZF9jcmVhdGVEaXNwbGF5U3VyZmFjZSgpOw0KKyAgICByZXR1cm5WYWx1ZSA9IEVHTFV0aWxzOjpzZWxlY3RDb25maWdGb3JOYXRpdmVXaW5kb3coZHB5LCBzX2NvbmZpZ0F0dHJpYnMsIHdpbmRvdywgJm15Q29uZmlnKTsKKyAgICBpZiAocmV0dXJuVmFsdWUpIHsKKyAgICAgICAgcHJpbnRmKCJFR0xVdGlsczo6c2VsZWN0Q29uZmlnRm9yTmF0aXZlV2luZG93KCkgcmV0dXJuZWQgJWQiLCByZXR1cm5WYWx1ZSk7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIGNoZWNrRWdsRXJyb3IoIkVHTFV0aWxzOjpzZWxlY3RDb25maWdGb3JOYXRpdmVXaW5kb3ciKTsKKworICAgIHN1cmZhY2UgPSBlZ2xDcmVhdGVXaW5kb3dTdXJmYWNlKGRweSwgbXlDb25maWcsIHdpbmRvdywgTlVMTCk7CisgICAgY2hlY2tFZ2xFcnJvcigiZWdsQ3JlYXRlV2luZG93U3VyZmFjZSIpOworICAgIGlmIChzdXJmYWNlID09IEVHTF9OT19TVVJGQUNFKSB7CisgICAgICAgIHByaW50ZigiZ2VsQ3JlYXRlV2luZG93U3VyZmFjZSBmYWlsZWQuXG4iKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgY29udGV4dCA9IGVnbENyZWF0ZUNvbnRleHQoZHB5LCBteUNvbmZpZywgRUdMX05PX0NPTlRFWFQsIGNvbnRleHRfYXR0cmlicyk7CisgICAgY2hlY2tFZ2xFcnJvcigiZWdsQ3JlYXRlQ29udGV4dCIpOworICAgIGlmIChjb250ZXh0ID09IEVHTF9OT19DT05URVhUKSB7CisgICAgICAgIHByaW50ZigiZWdsQ3JlYXRlQ29udGV4dCBmYWlsZWRcbiIpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgcmV0dXJuVmFsdWUgPSBlZ2xNYWtlQ3VycmVudChkcHksIHN1cmZhY2UsIHN1cmZhY2UsIGNvbnRleHQpOworICAgIGNoZWNrRWdsRXJyb3IoImVnbE1ha2VDdXJyZW50IiwgcmV0dXJuVmFsdWUpOworICAgIGlmIChyZXR1cm5WYWx1ZSAhPSBFR0xfVFJVRSkgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgZWdsUXVlcnlTdXJmYWNlKGRweSwgc3VyZmFjZSwgRUdMX1dJRFRILCAmdyk7CisgICAgY2hlY2tFZ2xFcnJvcigiZWdsUXVlcnlTdXJmYWNlIik7CisgICAgZWdsUXVlcnlTdXJmYWNlKGRweSwgc3VyZmFjZSwgRUdMX0hFSUdIVCwgJmgpOworICAgIGNoZWNrRWdsRXJyb3IoImVnbFF1ZXJ5U3VyZmFjZSIpOworICAgIEdMaW50IGRpbSA9IHcgPCBoID8gdyA6IGg7CisKKyAgICBnbFZpZXdwb3J0KDAsIDAsIHcsIGgpOworCisgICAgZm9yICg7OykgeworICAgICAgICBkb1Rlc3QodywgaCk7CisgICAgICAgIGVnbFN3YXBCdWZmZXJzKGRweSwgc3VyZmFjZSk7CisgICAgICAgIGNoZWNrRWdsRXJyb3IoImVnbFN3YXBCdWZmZXJzIik7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK3ZvaWQgcHRTd2FwKCkgeworICAgIGVnbFN3YXBCdWZmZXJzKGRweSwgc3VyZmFjZSk7Cit9CisKZGlmZiAtLWdpdCBhL29wZW5nbC90ZXN0cy9nbF9wZXJmYXBwL0FuZHJvaWQubWsgYi9vcGVuZ2wvdGVzdHMvZ2xfcGVyZmFwcC9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRkNzVhNzQKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuZ2wvdGVzdHMvZ2xfcGVyZmFwcC9BbmRyb2lkLm1rCkBAIC0wLDAgKzEsNTQgQEAKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgT3BlbkdMIEVTIFBlcmYgQXBwCisjIFRoaXMgbWFrZWZpbGUgYnVpbGRzIGJvdGggYW4gYWN0aXZpdHkgYW5kIGEgc2hhcmVkIGxpYnJhcnkuCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCitpZm5lcSAoJChUQVJHRVRfU0lNVUxBVE9SKSx0cnVlKSAjIG5vdCA2NCBiaXQgY2xlYW4KKworVE9QX0xPQ0FMX1BBVEg6PSAkKGNhbGwgbXktZGlyKQorCisjIEJ1aWxkIGFjdGl2aXR5CisKK0xPQ0FMX1BBVEg6PSAkKGNhbGwgbXktZGlyKQoraW5jbHVkZSAkKENMRUFSX1ZBUlMpCisKK0xPQ0FMX01PRFVMRV9UQUdTIDo9IG9wdGlvbmFsCisKK0xPQ0FMX1NSQ19GSUxFUyA6PSAkKGNhbGwgYWxsLXN1YmRpci1qYXZhLWZpbGVzKQorCitMT0NBTF9QQUNLQUdFX05BTUUgOj0gR0xQZXJmCisKK0xPQ0FMX0pOSV9TSEFSRURfTElCUkFSSUVTIDo9IGxpYmdscGVyZgorCisjIFJ1biBvbiBFY2xhaXIKK0xPQ0FMX1NES19WRVJTSU9OIDo9IDcKKworaW5jbHVkZSAkKEJVSUxEX1BBQ0tBR0UpCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgQnVpbGQgSk5JIFNoYXJlZCBMaWJyYXJ5CisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKK0xPQ0FMX1BBVEg6PSAkKExPQ0FMX1BBVEgpL2puaQorCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKKworIyBPcHRpb25hbCB0YWcgd291bGQgbWVhbiBpdCBkb2Vzbid0IGdldCBpbnN0YWxsZWQgYnkgZGVmYXVsdAorTE9DQUxfTU9EVUxFX1RBR1MgOj0gb3B0aW9uYWwKKworTE9DQUxfQ0ZMQUdTIDo9IC1XZXJyb3IKKworTE9DQUxfU1JDX0ZJTEVTOj0gXAorICBnbF9jb2RlLmNwcAorCitMT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IFwKKwlsaWJ1dGlscyBcCisJbGliRUdMIFwKKwlsaWJHTEVTdjIKKworTE9DQUxfTU9EVUxFIDo9IGxpYmdscGVyZgorCitMT0NBTF9QUkVMSU5LX01PRFVMRSA6PSBmYWxzZQorCitpbmNsdWRlICQoQlVJTERfU0hBUkVEX0xJQlJBUlkpCisKK2VuZGlmICMgVEFSR0VUX1NJTVVMQVRPUgpkaWZmIC0tZ2l0IGEvb3BlbmdsL3Rlc3RzL2dsX3BlcmZhcHAvQW5kcm9pZE1hbmlmZXN0LnhtbCBiL29wZW5nbC90ZXN0cy9nbF9wZXJmYXBwL0FuZHJvaWRNYW5pZmVzdC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzA1ZDk1ZgotLS0gL2Rldi9udWxsCisrKyBiL29wZW5nbC90ZXN0cy9nbF9wZXJmYXBwL0FuZHJvaWRNYW5pZmVzdC54bWwKQEAgLTAsMCArMSwzOCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0KKy8qCisqKgorKiogQ29weXJpZ2h0IDIwMDksIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoqCisqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgCisqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIAorKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0IAorKioKKyoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgCisqKgorKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZSAKKyoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIAorKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCAKKyoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKy0tPgorCis8bWFuaWZlc3QgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgIHBhY2thZ2U9ImNvbS5hbmRyb2lkLmdscGVyZiIKKyAgICBhbmRyb2lkOnZlcnNpb25OYW1lPSIxLjAuMCIgYW5kcm9pZDp2ZXJzaW9uQ29kZT0iMTAwMDAiID4KKyAgICA8dXNlcy1zZGsgYW5kcm9pZDp0YXJnZXRTZGtWZXJzaW9uPSI3IiBhbmRyb2lkOm1pblNka1ZlcnNpb249IjciIC8+CisgICAgPHVzZXMtcGVybWlzc2lvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQucGVybWlzc2lvbi5XUklURV9FWFRFUk5BTF9TVE9SQUdFIiAvPgorICAgIDxhcHBsaWNhdGlvbgorICAgICAgICAgICAgYW5kcm9pZDpsYWJlbD0iQHN0cmluZy9nbHBlcmZfYWN0aXZpdHkiPgorICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSJHTFBlcmZBY3Rpdml0eSIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOnRoZW1lPSJAYW5kcm9pZDpzdHlsZS9UaGVtZS5Ob1RpdGxlQmFyLkZ1bGxzY3JlZW4iCisgICAgICAgICAgICAJYW5kcm9pZDpsYXVuY2hNb2RlPSJzaW5nbGVUYXNrIgorICAgICAgICAgICAgCWFuZHJvaWQ6Y29uZmlnQ2hhbmdlcz0ib3JpZW50YXRpb258a2V5Ym9hcmRIaWRkZW4iPgorICAgICAgICAgICAgPGludGVudC1maWx0ZXI+CisgICAgICAgICAgICAgICAgPGFjdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmFjdGlvbi5NQUlOIiAvPgorICAgICAgICAgICAgICAgIDxjYXRlZ29yeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmNhdGVnb3J5LkxBVU5DSEVSIiAvPgorICAgICAgICAgICAgPC9pbnRlbnQtZmlsdGVyPgorICAgICAgICA8L2FjdGl2aXR5PgorICAgIDwvYXBwbGljYXRpb24+Cis8L21hbmlmZXN0PgpkaWZmIC0tZ2l0IGEvb3BlbmdsL3Rlc3RzL2dsX3BlcmZhcHAvam5pL2dsX2NvZGUuY3BwIGIvb3BlbmdsL3Rlc3RzL2dsX3BlcmZhcHAvam5pL2dsX2NvZGUuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY5OTMzNzEKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuZ2wvdGVzdHMvZ2xfcGVyZmFwcC9qbmkvZ2xfY29kZS5jcHAKQEAgLTAsMCArMSwxMDMgQEAKKy8vIE9wZW5HTCBFUyAyLjAgY29kZQorCisjaW5jbHVkZSA8bmF0aXZlaGVscGVyL2puaS5oPgorI2RlZmluZSBMT0dfVEFHICJHTFBlcmYgZ2xfY29kZS5jcHAiCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlIDxFR0wvZWdsLmg+CisjaW5jbHVkZSA8R0xFUzIvZ2wyLmg+CisjaW5jbHVkZSA8R0xFUzIvZ2wyZXh0Lmg+CisjaW5jbHVkZSA8dXRpbHMvVGltZXJzLmg+CisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPG1hdGguaD4KKworI2luY2x1ZGUgIi4uLy4uL2dsX3BlcmYvZmlsbF9jb21tb24uY3BwIgorCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKy8vIFdpZHRoIGFuZCBoZWlnaHQgb2YgdGhlIHNjcmVlbgorCit1aW50MzJfdCB3OwordWludDMyX3QgaDsKKworLy8gVGhlIHN0YXRlQ2xvY2sgc3RhcnRzIGF0IHplcm8gYW5kIGluY3JlbWVudHMgYnkgMSBldmVyeSB0aW1lIHdlIGRyYXcgYSBmcmFtZS4gSXQgaXMgdXNlZCB0byBjb250cm9sIHdoaWNoIHBoYXNlIG9mIHRoZSB0ZXN0IHdlIGFyZSBpbi4KKworaW50IHN0YXRlQ2xvY2s7Citjb25zdCBpbnQgZG9Mb29wU3RhdGVzID0gMjsKK2NvbnN0IGludCBkb1NpbmdsZVRlc3RTdGF0ZXMgPSAyOworYm9vbCBkb25lOworCisvLyBTYXZlcyB0aGUgcGFyYW1ldGVycyBvZiB0aGUgdGVzdCAoc28gd2UgY2FuIHByaW50IHRoZW0gb3V0IHdoZW4gd2UgZmluaXNoIHRoZSB0aW1pbmcuKQorCisKK2ludCBwZ207CisKK3ZvaWQgcHRTd2FwKCkgeworfQorCit2b2lkIGRvVGVzdCgpIHsKKyAgICB1aW50MzJfdCB0ZXN0TnVtID0gc3RhdGVDbG9jayA+PiAyOworICAgIGludCB0ZXhTaXplID0gKChzdGF0ZUNsb2NrID4+IDEpICYgMHgxKSArIDE7CisKKyAgICBpZiAodGVzdE51bSA+PSBnRnJhZ21lbnRUZXN0Q291bnQpIHsKKyAgICAgICBMT0dJKCJkb25lXG4iKTsKKyAgICAgICBpZiAoZk91dCkgeworICAgICAgICAgICBmY2xvc2UoZk91dCk7CisgICAgICAgICAgIGZPdXQgPSBOVUxMOworICAgICAgIH0KKyAgICAgICBkb25lID0gdHJ1ZTsKKyAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLy8gTE9HSSgiZG9UZXN0ICVkICVkICVkXG4iLCB0ZXhDb3VudCwgZXh0cmFNYXRoLCB0ZXN0U3ViU3RhdGUpOworCisvLyAgICAgICAgZm9yICh1aW50MzJfdCBudW0gPSAwOyBudW0gPCBnRnJhZ21lbnRUZXN0Q291bnQ7IG51bSsrKSB7CisgICAgZG9TaW5nbGVUZXN0KHRlc3ROdW0sIHRleFNpemUpOworfQorCitleHRlcm4gIkMiIHsKKyAgICBKTklFWFBPUlQgdm9pZCBKTklDQUxMIEphdmFfY29tX2FuZHJvaWRfZ2xwZXJmX0dMUGVyZkxpYl9pbml0KEpOSUVudiAqIGVudiwgam9iamVjdCBvYmosICBqaW50IHdpZHRoLCBqaW50IGhlaWdodCk7CisgICAgSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBKYXZhX2NvbV9hbmRyb2lkX2dscGVyZl9HTFBlcmZMaWJfc3RlcChKTklFbnYgKiBlbnYsIGpvYmplY3Qgb2JqKTsKK307CisKK0pOSUVYUE9SVCB2b2lkIEpOSUNBTEwgSmF2YV9jb21fYW5kcm9pZF9nbHBlcmZfR0xQZXJmTGliX2luaXQoSk5JRW52ICogZW52LCBqb2JqZWN0IG9iaiwgIGppbnQgd2lkdGgsIGppbnQgaGVpZ2h0KQoreworICAgIGdXaWR0aCA9IHdpZHRoOworICAgIGdIZWlnaHQgPSBoZWlnaHQ7CisgICAgaWYgKCFkb25lKSB7CisgICAgICAgICAgICBzdGF0ZUNsb2NrID0gMDsKKyAgICAgICAgICAgIGRvbmUgPSBmYWxzZTsKKyAgICAgICAgICAgIHNldHVwVkEoKTsKKyAgICAgICAgICAgIGdlblRleHR1cmVzKCk7CisgICAgICAgICAgICBjb25zdCBjaGFyKiBmaWxlTmFtZSA9ICIvc2RjYXJkL2dscGVyZi5jc3YiOworICAgICAgICAgICAgaWYgKGZPdXQgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgICBMT0dJKCJDbG9zaW5nIHBhcnRpYWxseSB3cml0dGVuIG91dHB1dC5uIik7CisgICAgICAgICAgICAgICAgIGZjbG9zZShmT3V0KTsKKyAgICAgICAgICAgICAgICAgZk91dCA9IE5VTEw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBMT0dJKCJXcml0aW5nIHRvOiAlc1xuIixmaWxlTmFtZSk7CisgICAgICAgICAgICBmT3V0ID0gZm9wZW4oZmlsZU5hbWUsICJ3Iik7CisgICAgICAgICAgICBpZiAoZk91dCA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgTE9HRSgiQ291bGQgbm90IG9wZW46ICVzXG4iLCBmaWxlTmFtZSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIExPR0koIlxudmFyQ29sb3IsIHRleENvdW50LCBtb2R1bGF0ZSwgZXh0cmFNYXRoLCB0ZXhTaXplLCBibGVuZCwgTXBwcywgREM2MFxuIik7CisgICAgICAgICAgICBpZiAoZk91dCkgZnByaW50ZihmT3V0LCJ2YXJDb2xvciwgdGV4Q291bnQsIG1vZHVsYXRlLCBleHRyYU1hdGgsIHRleFNpemUsIGJsZW5kLCBNcHBzLCBEQzYwXHJcbiIpOworICAgIH0KK30KKworSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBKYXZhX2NvbV9hbmRyb2lkX2dscGVyZl9HTFBlcmZMaWJfc3RlcChKTklFbnYgKiBlbnYsIGpvYmplY3Qgb2JqKQoreworICAgIGlmICghIGRvbmUpIHsKKyAgICAgICAgaWYgKHN0YXRlQ2xvY2sgPiAwICYmICgoc3RhdGVDbG9jayAmIDEpID09IDApKSB7CisgICAgICAgICAgICAvL2VuZFRpbWVyKDEwMCk7CisgICAgICAgIH0KKyAgICAgICAgZG9UZXN0KCk7CisgICAgICAgIHN0YXRlQ2xvY2srKzsKKyAgICB9IGVsc2UgeworICAgICAgICAgICAgZ2xDbGVhcihHTF9ERVBUSF9CVUZGRVJfQklUIHwgR0xfQ09MT1JfQlVGRkVSX0JJVCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvb3BlbmdsL3Rlc3RzL2dsX3BlcmZhcHAvcmVzL3ZhbHVlcy9zdHJpbmdzLnhtbCBiL29wZW5nbC90ZXN0cy9nbF9wZXJmYXBwL3Jlcy92YWx1ZXMvc3RyaW5ncy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGMyMTA3NQotLS0gL2Rldi9udWxsCisrKyBiL29wZW5nbC90ZXN0cy9nbF9wZXJmYXBwL3Jlcy92YWx1ZXMvc3RyaW5ncy54bWwKQEAgLTAsMCArMSwyOSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0KKy8qCisqKgorKiogQ29weXJpZ2h0IDIwMDYsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoqCisqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgCisqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIAorKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0IAorKioKKyoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgCisqKgorKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZSAKKyoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIAorKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCAKKyoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKy0tPgorCis8IS0tIFRoaXMgZmlsZSBjb250YWlucyByZXNvdXJjZSBkZWZpbml0aW9ucyBmb3IgZGlzcGxheWVkIHN0cmluZ3MsIGFsbG93aW5nCisgICAgIHRoZW0gdG8gYmUgY2hhbmdlZCBiYXNlZCBvbiB0aGUgbG9jYWxlIGFuZCBvcHRpb25zLiAtLT4KKworPHJlc291cmNlcz4KKyAgICA8IS0tIFNpbXBsZSBzdHJpbmdzLiAtLT4KKyAgICA8c3RyaW5nIG5hbWU9ImdscGVyZl9hY3Rpdml0eSI+R0xQZXJmPC9zdHJpbmc+CisKKzwvcmVzb3VyY2VzPgorCmRpZmYgLS1naXQgYS9vcGVuZ2wvdGVzdHMvZ2xfcGVyZmFwcC9zcmMvY29tL2FuZHJvaWQvZ2xwZXJmL0dMUGVyZkFjdGl2aXR5LmphdmEgYi9vcGVuZ2wvdGVzdHMvZ2xfcGVyZmFwcC9zcmMvY29tL2FuZHJvaWQvZ2xwZXJmL0dMUGVyZkFjdGl2aXR5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTNmM2FiZgotLS0gL2Rldi9udWxsCisrKyBiL29wZW5nbC90ZXN0cy9nbF9wZXJmYXBwL3NyYy9jb20vYW5kcm9pZC9nbHBlcmYvR0xQZXJmQWN0aXZpdHkuamF2YQpAQCAtMCwwICsxLDQ3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5nbHBlcmY7CisKK2ltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eTsKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworaW1wb3J0IGFuZHJvaWQudmlldy5XaW5kb3dNYW5hZ2VyOworCitpbXBvcnQgamF2YS5pby5GaWxlOworCisKK3B1YmxpYyBjbGFzcyBHTFBlcmZBY3Rpdml0eSBleHRlbmRzIEFjdGl2aXR5IHsKKworICAgIEdMUGVyZlZpZXcgbVZpZXc7CisKKyAgICBAT3ZlcnJpZGUgcHJvdGVjdGVkIHZvaWQgb25DcmVhdGUoQnVuZGxlIGljaWNsZSkgeworICAgICAgICBzdXBlci5vbkNyZWF0ZShpY2ljbGUpOworCWdldFdpbmRvdygpLnNldEZsYWdzKFdpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zLkZMQUdfS0VFUF9TQ1JFRU5fT04sIFdpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zLkZMQUdfS0VFUF9TQ1JFRU5fT04pOworICAgICAgICBtVmlldyA9IG5ldyBHTFBlcmZWaWV3KGdldEFwcGxpY2F0aW9uKCkpOworCXNldENvbnRlbnRWaWV3KG1WaWV3KTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUgcHJvdGVjdGVkIHZvaWQgb25QYXVzZSgpIHsKKyAgICAgICAgc3VwZXIub25QYXVzZSgpOworICAgICAgICBtVmlldy5vblBhdXNlKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlIHByb3RlY3RlZCB2b2lkIG9uUmVzdW1lKCkgeworICAgICAgICBzdXBlci5vblJlc3VtZSgpOworICAgICAgICBtVmlldy5vblJlc3VtZSgpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL29wZW5nbC90ZXN0cy9nbF9wZXJmYXBwL3NyYy9jb20vYW5kcm9pZC9nbHBlcmYvR0xQZXJmTGliLmphdmEgYi9vcGVuZ2wvdGVzdHMvZ2xfcGVyZmFwcC9zcmMvY29tL2FuZHJvaWQvZ2xwZXJmL0dMUGVyZkxpYi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg5YTBlNTQKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuZ2wvdGVzdHMvZ2xfcGVyZmFwcC9zcmMvY29tL2FuZHJvaWQvZ2xwZXJmL0dMUGVyZkxpYi5qYXZhCkBAIC0wLDAgKzEsMzMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLmdscGVyZjsKKworLy8gV3JhcHBlciBmb3IgbmF0aXZlIGxpYnJhcnkKKworcHVibGljIGNsYXNzIEdMUGVyZkxpYiB7CisKKyAgICAgc3RhdGljIHsKKyAgICAgICAgIFN5c3RlbS5sb2FkTGlicmFyeSgiZ2xwZXJmIik7CisgICAgIH0KKworICAgIC8qKgorICAgICAqIEBwYXJhbSB3aWR0aCB0aGUgY3VycmVudCB2aWV3IHdpZHRoCisgICAgICogQHBhcmFtIGhlaWdodCB0aGUgY3VycmVudCB2aWV3IGhlaWdodAorICAgICAqLworICAgICBwdWJsaWMgc3RhdGljIG5hdGl2ZSB2b2lkIGluaXQoaW50IHdpZHRoLCBpbnQgaGVpZ2h0KTsKKyAgICAgcHVibGljIHN0YXRpYyBuYXRpdmUgdm9pZCBzdGVwKCk7Cit9CmRpZmYgLS1naXQgYS9vcGVuZ2wvdGVzdHMvZ2xfcGVyZmFwcC9zcmMvY29tL2FuZHJvaWQvZ2xwZXJmL0dMUGVyZlZpZXcuamF2YSBiL29wZW5nbC90ZXN0cy9nbF9wZXJmYXBwL3NyYy9jb20vYW5kcm9pZC9nbHBlcmYvR0xQZXJmVmlldy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRjZTRhNGQKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuZ2wvdGVzdHMvZ2xfcGVyZmFwcC9zcmMvY29tL2FuZHJvaWQvZ2xwZXJmL0dMUGVyZlZpZXcuamF2YQpAQCAtMCwwICsxLDI5NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQuZ2xwZXJmOworLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQub3BlbmdsLkdMU3VyZmFjZVZpZXc7CitpbXBvcnQgYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldDsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworaW1wb3J0IGFuZHJvaWQudmlldy5LZXlFdmVudDsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuTW90aW9uRXZlbnQ7CisKK2ltcG9ydCBqYXZheC5taWNyb2VkaXRpb24ua2hyb25vcy5lZ2wuRUdMMTA7CitpbXBvcnQgamF2YXgubWljcm9lZGl0aW9uLmtocm9ub3MuZWdsLkVHTENvbmZpZzsKK2ltcG9ydCBqYXZheC5taWNyb2VkaXRpb24ua2hyb25vcy5lZ2wuRUdMQ29udGV4dDsKK2ltcG9ydCBqYXZheC5taWNyb2VkaXRpb24ua2hyb25vcy5lZ2wuRUdMRGlzcGxheTsKK2ltcG9ydCBqYXZheC5taWNyb2VkaXRpb24ua2hyb25vcy5vcGVuZ2xlcy5HTDEwOworCisvKioKKyAqIEFuIGltcGxlbWVudGF0aW9uIG9mIFN1cmZhY2VWaWV3IHRoYXQgdXNlcyB0aGUgZGVkaWNhdGVkIHN1cmZhY2UgZm9yCisgKiBkaXNwbGF5aW5nIGFuIE9wZW5HTCBhbmltYXRpb24uICBUaGlzIGFsbG93cyB0aGUgYW5pbWF0aW9uIHRvIHJ1biBpbiBhCisgKiBzZXBhcmF0ZSB0aHJlYWQsIHdpdGhvdXQgcmVxdWlyaW5nIHRoYXQgaXQgYmUgZHJpdmVuIGJ5IHRoZSB1cGRhdGUgbWVjaGFuaXNtCisgKiBvZiB0aGUgdmlldyBoaWVyYXJjaHkuCisgKgorICogVGhlIGFwcGxpY2F0aW9uLXNwZWNpZmljIHJlbmRlcmluZyBjb2RlIGlzIGRlbGVnYXRlZCB0byBhIEdMVmlldy5SZW5kZXJlcgorICogaW5zdGFuY2UuCisgKi8KK2NsYXNzIEdMUGVyZlZpZXcgZXh0ZW5kcyBHTFN1cmZhY2VWaWV3IHsKKyAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgVEFHID0gIkdMUGVyZlZpZXciOworCisgICAgcHVibGljIEdMUGVyZlZpZXcoQ29udGV4dCBjb250ZXh0KSB7CisgICAgICAgIHN1cGVyKGNvbnRleHQpOworICAgICAgICBpbml0KGZhbHNlLCAwLCAwKTsKKyAgICB9CisKKyAgICBwdWJsaWMgR0xQZXJmVmlldyhDb250ZXh0IGNvbnRleHQsIGJvb2xlYW4gdHJhbnNsdWNlbnQsIGludCBkZXB0aCwgaW50IHN0ZW5jaWwpIHsKKyAgICAgICAgc3VwZXIoY29udGV4dCk7CisgICAgICAgIGluaXQodHJhbnNsdWNlbnQsIGRlcHRoLCBzdGVuY2lsKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgaW5pdChib29sZWFuIHRyYW5zbHVjZW50LCBpbnQgZGVwdGgsIGludCBzdGVuY2lsKSB7CisgICAgICAgIHNldEVHTENvbnRleHRGYWN0b3J5KG5ldyBDb250ZXh0RmFjdG9yeSgpKTsKKyAgICAgICAgc2V0RUdMQ29uZmlnQ2hvb3NlciggdHJhbnNsdWNlbnQgPworICAgICAgICAgICAgICBuZXcgQ29uZmlnQ2hvb3Nlcig4LDgsOCw4LCBkZXB0aCwgc3RlbmNpbCkgOgorICAgICAgICAgICAgICBuZXcgQ29uZmlnQ2hvb3Nlcig1LDYsNSwwLCBkZXB0aCwgc3RlbmNpbCkpOworICAgICAgICBzZXRSZW5kZXJlcihuZXcgUmVuZGVyZXIoKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgQ29udGV4dEZhY3RvcnkgaW1wbGVtZW50cyBHTFN1cmZhY2VWaWV3LkVHTENvbnRleHRGYWN0b3J5IHsKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgaW50IEVHTF9DT05URVhUX0NMSUVOVF9WRVJTSU9OID0gMHgzMDk4OworICAgICAgICBwdWJsaWMgRUdMQ29udGV4dCBjcmVhdGVDb250ZXh0KEVHTDEwIGVnbCwgRUdMRGlzcGxheSBkaXNwbGF5LCBFR0xDb25maWcgZWdsQ29uZmlnKSB7CisgICAgICAgICAgICBMb2cudyhUQUcsICJjcmVhdGluZyBPcGVuR0wgRVMgMi4wIGNvbnRleHQiKTsKKyAgICAgICAgICAgIGNoZWNrRWdsRXJyb3IoIkJlZm9yZSBlZ2xDcmVhdGVDb250ZXh0IiwgZWdsKTsKKyAgICAgICAgICAgIGludFtdIGF0dHJpYl9saXN0ID0ge0VHTF9DT05URVhUX0NMSUVOVF9WRVJTSU9OLCAyLCBFR0wxMC5FR0xfTk9ORSB9OworICAgICAgICAgICAgRUdMQ29udGV4dCBjb250ZXh0ID0gZWdsLmVnbENyZWF0ZUNvbnRleHQoZGlzcGxheSwgZWdsQ29uZmlnLCBFR0wxMC5FR0xfTk9fQ09OVEVYVCwgYXR0cmliX2xpc3QpOworICAgICAgICAgICAgY2hlY2tFZ2xFcnJvcigiQWZ0ZXIgZWdsQ3JlYXRlQ29udGV4dCIsIGVnbCk7CisgICAgICAgICAgICByZXR1cm4gY29udGV4dDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIGRlc3Ryb3lDb250ZXh0KEVHTDEwIGVnbCwgRUdMRGlzcGxheSBkaXNwbGF5LCBFR0xDb250ZXh0IGNvbnRleHQpIHsKKyAgICAgICAgICAgIGVnbC5lZ2xEZXN0cm95Q29udGV4dChkaXNwbGF5LCBjb250ZXh0KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIHZvaWQgY2hlY2tFZ2xFcnJvcihTdHJpbmcgcHJvbXB0LCBFR0wxMCBlZ2wpIHsKKyAgICAgICAgaW50IGVycm9yOworICAgICAgICB3aGlsZSAoKGVycm9yID0gZWdsLmVnbEdldEVycm9yKCkpICE9IEVHTDEwLkVHTF9TVUNDRVNTKSB7CisgICAgICAgICAgICBMb2cuZShUQUcsIFN0cmluZy5mb3JtYXQoIiVzOiBFR0wgZXJyb3I6IDB4JXgiLCBwcm9tcHQsIGVycm9yKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBDb25maWdDaG9vc2VyIGltcGxlbWVudHMgR0xTdXJmYWNlVmlldy5FR0xDb25maWdDaG9vc2VyIHsKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgaW50IEVHTF9PUEVOR0xfRVMyX0JJVCA9IDQ7CisgICAgICAgIHByaXZhdGUgc3RhdGljIGludFtdIHNfY29uZmlnQXR0cmliczIgPQorICAgICAgICB7CisgICAgICAgICAgICBFR0wxMC5FR0xfUkVEX1NJWkUsIDQsCisgICAgICAgICAgICBFR0wxMC5FR0xfR1JFRU5fU0laRSwgNCwKKyAgICAgICAgICAgIEVHTDEwLkVHTF9CTFVFX1NJWkUsIDQsCisgICAgICAgICAgICBFR0wxMC5FR0xfUkVOREVSQUJMRV9UWVBFLCBFR0xfT1BFTkdMX0VTMl9CSVQsCisgICAgICAgICAgICBFR0wxMC5FR0xfTk9ORQorICAgICAgICB9OworCisgICAgICAgIHB1YmxpYyBDb25maWdDaG9vc2VyKGludCByLCBpbnQgZywgaW50IGIsIGludCBhLCBpbnQgZGVwdGgsIGludCBzdGVuY2lsKSB7CisgICAgICAgICAgICBtUmVkU2l6ZSA9IHI7CisgICAgICAgICAgICBtR3JlZW5TaXplID0gZzsKKyAgICAgICAgICAgIG1CbHVlU2l6ZSA9IGI7CisgICAgICAgICAgICBtQWxwaGFTaXplID0gYTsKKyAgICAgICAgICAgIG1EZXB0aFNpemUgPSBkZXB0aDsKKyAgICAgICAgICAgIG1TdGVuY2lsU2l6ZSA9IHN0ZW5jaWw7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgRUdMQ29uZmlnIGNob29zZUNvbmZpZyhFR0wxMCBlZ2wsIEVHTERpc3BsYXkgZGlzcGxheSkgeworCisgICAgICAgICAgICBpbnRbXSBudW1fY29uZmlnID0gbmV3IGludFsxXTsKKyAgICAgICAgICAgIGVnbC5lZ2xDaG9vc2VDb25maWcoZGlzcGxheSwgc19jb25maWdBdHRyaWJzMiwgbnVsbCwgMCwgbnVtX2NvbmZpZyk7CisKKyAgICAgICAgICAgIGludCBudW1Db25maWdzID0gbnVtX2NvbmZpZ1swXTsKKworICAgICAgICAgICAgaWYgKG51bUNvbmZpZ3MgPD0gMCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIk5vIGNvbmZpZ3MgbWF0Y2ggY29uZmlnU3BlYyIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgRUdMQ29uZmlnW10gY29uZmlncyA9IG5ldyBFR0xDb25maWdbbnVtQ29uZmlnc107CisgICAgICAgICAgICBlZ2wuZWdsQ2hvb3NlQ29uZmlnKGRpc3BsYXksIHNfY29uZmlnQXR0cmliczIsIGNvbmZpZ3MsIG51bUNvbmZpZ3MsIG51bV9jb25maWcpOworICAgICAgICAgICAgLy8gcHJpbnRDb25maWdzKGVnbCwgZGlzcGxheSwgY29uZmlncyk7CisgICAgICAgICAgICByZXR1cm4gY2hvb3NlQ29uZmlnKGVnbCwgZGlzcGxheSwgY29uZmlncyk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgRUdMQ29uZmlnIGNob29zZUNvbmZpZyhFR0wxMCBlZ2wsIEVHTERpc3BsYXkgZGlzcGxheSwKKyAgICAgICAgICAgICAgICBFR0xDb25maWdbXSBjb25maWdzKSB7CisgICAgICAgICAgICBFR0xDb25maWcgY2xvc2VzdENvbmZpZyA9IG51bGw7CisgICAgICAgICAgICBpbnQgY2xvc2VzdERpc3RhbmNlID0gMTAwMDsKKyAgICAgICAgICAgIGZvcihFR0xDb25maWcgY29uZmlnIDogY29uZmlncykgeworICAgICAgICAgICAgICAgIGludCBkID0gZmluZENvbmZpZ0F0dHJpYihlZ2wsIGRpc3BsYXksIGNvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgIEVHTDEwLkVHTF9ERVBUSF9TSVpFLCAwKTsKKyAgICAgICAgICAgICAgICBpbnQgcyA9IGZpbmRDb25maWdBdHRyaWIoZWdsLCBkaXNwbGF5LCBjb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICBFR0wxMC5FR0xfU1RFTkNJTF9TSVpFLCAwKTsKKyAgICAgICAgICAgICAgICBpZiAoZCA+PSBtRGVwdGhTaXplICYmIHM+PSBtU3RlbmNpbFNpemUpIHsKKyAgICAgICAgICAgICAgICAgICAgaW50IHIgPSBmaW5kQ29uZmlnQXR0cmliKGVnbCwgZGlzcGxheSwgY29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVHTDEwLkVHTF9SRURfU0laRSwgMCk7CisgICAgICAgICAgICAgICAgICAgIGludCBnID0gZmluZENvbmZpZ0F0dHJpYihlZ2wsIGRpc3BsYXksIGNvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUdMMTAuRUdMX0dSRUVOX1NJWkUsIDApOworICAgICAgICAgICAgICAgICAgICBpbnQgYiA9IGZpbmRDb25maWdBdHRyaWIoZWdsLCBkaXNwbGF5LCBjb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFR0wxMC5FR0xfQkxVRV9TSVpFLCAwKTsKKyAgICAgICAgICAgICAgICAgICAgaW50IGEgPSBmaW5kQ29uZmlnQXR0cmliKGVnbCwgZGlzcGxheSwgY29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVHTDEwLkVHTF9BTFBIQV9TSVpFLCAwKTsKKyAgICAgICAgICAgICAgICAgICAgaW50IGRpc3RhbmNlID0gTWF0aC5hYnMociAtIG1SZWRTaXplKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIE1hdGguYWJzKGcgLSBtR3JlZW5TaXplKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIE1hdGguYWJzKGIgLSBtQmx1ZVNpemUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgTWF0aC5hYnMoYSAtIG1BbHBoYVNpemUpOworICAgICAgICAgICAgICAgICAgICBpZiAoZGlzdGFuY2UgPCBjbG9zZXN0RGlzdGFuY2UpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNsb3Nlc3REaXN0YW5jZSA9IGRpc3RhbmNlOworICAgICAgICAgICAgICAgICAgICAgICAgY2xvc2VzdENvbmZpZyA9IGNvbmZpZzsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBjbG9zZXN0Q29uZmlnOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBpbnQgZmluZENvbmZpZ0F0dHJpYihFR0wxMCBlZ2wsIEVHTERpc3BsYXkgZGlzcGxheSwKKyAgICAgICAgICAgICAgICBFR0xDb25maWcgY29uZmlnLCBpbnQgYXR0cmlidXRlLCBpbnQgZGVmYXVsdFZhbHVlKSB7CisKKyAgICAgICAgICAgIGlmIChlZ2wuZWdsR2V0Q29uZmlnQXR0cmliKGRpc3BsYXksIGNvbmZpZywgYXR0cmlidXRlLCBtVmFsdWUpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG1WYWx1ZVswXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBkZWZhdWx0VmFsdWU7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHZvaWQgcHJpbnRDb25maWdzKEVHTDEwIGVnbCwgRUdMRGlzcGxheSBkaXNwbGF5LAorICAgICAgICAgICAgRUdMQ29uZmlnW10gY29uZmlncykgeworICAgICAgICAgICAgaW50IG51bUNvbmZpZ3MgPSBjb25maWdzLmxlbmd0aDsKKyAgICAgICAgICAgIExvZy53KFRBRywgU3RyaW5nLmZvcm1hdCgiJWQgY29uZmlndXJhdGlvbnMiLCBudW1Db25maWdzKSk7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bUNvbmZpZ3M7IGkrKykgeworICAgICAgICAgICAgICAgIExvZy53KFRBRywgU3RyaW5nLmZvcm1hdCgiQ29uZmlndXJhdGlvbiAlZDpcbiIsIGkpKTsKKyAgICAgICAgICAgICAgICBwcmludENvbmZpZyhlZ2wsIGRpc3BsYXksIGNvbmZpZ3NbaV0pOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSB2b2lkIHByaW50Q29uZmlnKEVHTDEwIGVnbCwgRUdMRGlzcGxheSBkaXNwbGF5LAorICAgICAgICAgICAgICAgIEVHTENvbmZpZyBjb25maWcpIHsKKyAgICAgICAgICAgIGludFtdIGF0dHJpYnV0ZXMgPSB7CisgICAgICAgICAgICAgICAgICAgIEVHTDEwLkVHTF9CVUZGRVJfU0laRSwKKyAgICAgICAgICAgICAgICAgICAgRUdMMTAuRUdMX0FMUEhBX1NJWkUsCisgICAgICAgICAgICAgICAgICAgIEVHTDEwLkVHTF9CTFVFX1NJWkUsCisgICAgICAgICAgICAgICAgICAgIEVHTDEwLkVHTF9HUkVFTl9TSVpFLAorICAgICAgICAgICAgICAgICAgICBFR0wxMC5FR0xfUkVEX1NJWkUsCisgICAgICAgICAgICAgICAgICAgIEVHTDEwLkVHTF9ERVBUSF9TSVpFLAorICAgICAgICAgICAgICAgICAgICBFR0wxMC5FR0xfU1RFTkNJTF9TSVpFLAorICAgICAgICAgICAgICAgICAgICBFR0wxMC5FR0xfQ09ORklHX0NBVkVBVCwKKyAgICAgICAgICAgICAgICAgICAgRUdMMTAuRUdMX0NPTkZJR19JRCwKKyAgICAgICAgICAgICAgICAgICAgRUdMMTAuRUdMX0xFVkVMLAorICAgICAgICAgICAgICAgICAgICBFR0wxMC5FR0xfTUFYX1BCVUZGRVJfSEVJR0hULAorICAgICAgICAgICAgICAgICAgICBFR0wxMC5FR0xfTUFYX1BCVUZGRVJfUElYRUxTLAorICAgICAgICAgICAgICAgICAgICBFR0wxMC5FR0xfTUFYX1BCVUZGRVJfV0lEVEgsCisgICAgICAgICAgICAgICAgICAgIEVHTDEwLkVHTF9OQVRJVkVfUkVOREVSQUJMRSwKKyAgICAgICAgICAgICAgICAgICAgRUdMMTAuRUdMX05BVElWRV9WSVNVQUxfSUQsCisgICAgICAgICAgICAgICAgICAgIEVHTDEwLkVHTF9OQVRJVkVfVklTVUFMX1RZUEUsCisgICAgICAgICAgICAgICAgICAgIDB4MzAzMCwgLy8gRUdMMTAuRUdMX1BSRVNFUlZFRF9SRVNPVVJDRVMsCisgICAgICAgICAgICAgICAgICAgIEVHTDEwLkVHTF9TQU1QTEVTLAorICAgICAgICAgICAgICAgICAgICBFR0wxMC5FR0xfU0FNUExFX0JVRkZFUlMsCisgICAgICAgICAgICAgICAgICAgIEVHTDEwLkVHTF9TVVJGQUNFX1RZUEUsCisgICAgICAgICAgICAgICAgICAgIEVHTDEwLkVHTF9UUkFOU1BBUkVOVF9UWVBFLAorICAgICAgICAgICAgICAgICAgICBFR0wxMC5FR0xfVFJBTlNQQVJFTlRfUkVEX1ZBTFVFLAorICAgICAgICAgICAgICAgICAgICBFR0wxMC5FR0xfVFJBTlNQQVJFTlRfR1JFRU5fVkFMVUUsCisgICAgICAgICAgICAgICAgICAgIEVHTDEwLkVHTF9UUkFOU1BBUkVOVF9CTFVFX1ZBTFVFLAorICAgICAgICAgICAgICAgICAgICAweDMwMzksIC8vIEVHTDEwLkVHTF9CSU5EX1RPX1RFWFRVUkVfUkdCLAorICAgICAgICAgICAgICAgICAgICAweDMwM0EsIC8vIEVHTDEwLkVHTF9CSU5EX1RPX1RFWFRVUkVfUkdCQSwKKyAgICAgICAgICAgICAgICAgICAgMHgzMDNCLCAvLyBFR0wxMC5FR0xfTUlOX1NXQVBfSU5URVJWQUwsCisgICAgICAgICAgICAgICAgICAgIDB4MzAzQywgLy8gRUdMMTAuRUdMX01BWF9TV0FQX0lOVEVSVkFMLAorICAgICAgICAgICAgICAgICAgICBFR0wxMC5FR0xfTFVNSU5BTkNFX1NJWkUsCisgICAgICAgICAgICAgICAgICAgIEVHTDEwLkVHTF9BTFBIQV9NQVNLX1NJWkUsCisgICAgICAgICAgICAgICAgICAgIEVHTDEwLkVHTF9DT0xPUl9CVUZGRVJfVFlQRSwKKyAgICAgICAgICAgICAgICAgICAgRUdMMTAuRUdMX1JFTkRFUkFCTEVfVFlQRSwKKyAgICAgICAgICAgICAgICAgICAgMHgzMDQyIC8vIEVHTDEwLkVHTF9DT05GT1JNQU5UCisgICAgICAgICAgICB9OworICAgICAgICAgICAgU3RyaW5nW10gbmFtZXMgPSB7CisgICAgICAgICAgICAgICAgICAgICJFR0xfQlVGRkVSX1NJWkUiLAorICAgICAgICAgICAgICAgICAgICAiRUdMX0FMUEhBX1NJWkUiLAorICAgICAgICAgICAgICAgICAgICAiRUdMX0JMVUVfU0laRSIsCisgICAgICAgICAgICAgICAgICAgICJFR0xfR1JFRU5fU0laRSIsCisgICAgICAgICAgICAgICAgICAgICJFR0xfUkVEX1NJWkUiLAorICAgICAgICAgICAgICAgICAgICAiRUdMX0RFUFRIX1NJWkUiLAorICAgICAgICAgICAgICAgICAgICAiRUdMX1NURU5DSUxfU0laRSIsCisgICAgICAgICAgICAgICAgICAgICJFR0xfQ09ORklHX0NBVkVBVCIsCisgICAgICAgICAgICAgICAgICAgICJFR0xfQ09ORklHX0lEIiwKKyAgICAgICAgICAgICAgICAgICAgIkVHTF9MRVZFTCIsCisgICAgICAgICAgICAgICAgICAgICJFR0xfTUFYX1BCVUZGRVJfSEVJR0hUIiwKKyAgICAgICAgICAgICAgICAgICAgIkVHTF9NQVhfUEJVRkZFUl9QSVhFTFMiLAorICAgICAgICAgICAgICAgICAgICAiRUdMX01BWF9QQlVGRkVSX1dJRFRIIiwKKyAgICAgICAgICAgICAgICAgICAgIkVHTF9OQVRJVkVfUkVOREVSQUJMRSIsCisgICAgICAgICAgICAgICAgICAgICJFR0xfTkFUSVZFX1ZJU1VBTF9JRCIsCisgICAgICAgICAgICAgICAgICAgICJFR0xfTkFUSVZFX1ZJU1VBTF9UWVBFIiwKKyAgICAgICAgICAgICAgICAgICAgIkVHTF9QUkVTRVJWRURfUkVTT1VSQ0VTIiwKKyAgICAgICAgICAgICAgICAgICAgIkVHTF9TQU1QTEVTIiwKKyAgICAgICAgICAgICAgICAgICAgIkVHTF9TQU1QTEVfQlVGRkVSUyIsCisgICAgICAgICAgICAgICAgICAgICJFR0xfU1VSRkFDRV9UWVBFIiwKKyAgICAgICAgICAgICAgICAgICAgIkVHTF9UUkFOU1BBUkVOVF9UWVBFIiwKKyAgICAgICAgICAgICAgICAgICAgIkVHTF9UUkFOU1BBUkVOVF9SRURfVkFMVUUiLAorICAgICAgICAgICAgICAgICAgICAiRUdMX1RSQU5TUEFSRU5UX0dSRUVOX1ZBTFVFIiwKKyAgICAgICAgICAgICAgICAgICAgIkVHTF9UUkFOU1BBUkVOVF9CTFVFX1ZBTFVFIiwKKyAgICAgICAgICAgICAgICAgICAgIkVHTF9CSU5EX1RPX1RFWFRVUkVfUkdCIiwKKyAgICAgICAgICAgICAgICAgICAgIkVHTF9CSU5EX1RPX1RFWFRVUkVfUkdCQSIsCisgICAgICAgICAgICAgICAgICAgICJFR0xfTUlOX1NXQVBfSU5URVJWQUwiLAorICAgICAgICAgICAgICAgICAgICAiRUdMX01BWF9TV0FQX0lOVEVSVkFMIiwKKyAgICAgICAgICAgICAgICAgICAgIkVHTF9MVU1JTkFOQ0VfU0laRSIsCisgICAgICAgICAgICAgICAgICAgICJFR0xfQUxQSEFfTUFTS19TSVpFIiwKKyAgICAgICAgICAgICAgICAgICAgIkVHTF9DT0xPUl9CVUZGRVJfVFlQRSIsCisgICAgICAgICAgICAgICAgICAgICJFR0xfUkVOREVSQUJMRV9UWVBFIiwKKyAgICAgICAgICAgICAgICAgICAgIkVHTF9DT05GT1JNQU5UIgorICAgICAgICAgICAgfTsKKyAgICAgICAgICAgIGludFtdIHZhbHVlID0gbmV3IGludFsxXTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYXR0cmlidXRlcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgIGludCBhdHRyaWJ1dGUgPSBhdHRyaWJ1dGVzW2ldOworICAgICAgICAgICAgICAgIFN0cmluZyBuYW1lID0gbmFtZXNbaV07CisgICAgICAgICAgICAgICAgaWYgKCBlZ2wuZWdsR2V0Q29uZmlnQXR0cmliKGRpc3BsYXksIGNvbmZpZywgYXR0cmlidXRlLCB2YWx1ZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgTG9nLncoVEFHLCBTdHJpbmcuZm9ybWF0KCIgICVzOiAlZFxuIiwgbmFtZSwgdmFsdWVbMF0pKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAvLyBMb2cudyhUQUcsIFN0cmluZy5mb3JtYXQoIiAgJXM6IGZhaWxlZFxuIiwgbmFtZSkpOworICAgICAgICAgICAgICAgICAgICB3aGlsZSAoZWdsLmVnbEdldEVycm9yKCkgIT0gRUdMMTAuRUdMX1NVQ0NFU1MpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIFN1YmNsYXNzZXMgY2FuIGFkanVzdCB0aGVzZSB2YWx1ZXM6CisgICAgICAgIHByb3RlY3RlZCBpbnQgbVJlZFNpemU7CisgICAgICAgIHByb3RlY3RlZCBpbnQgbUdyZWVuU2l6ZTsKKyAgICAgICAgcHJvdGVjdGVkIGludCBtQmx1ZVNpemU7CisgICAgICAgIHByb3RlY3RlZCBpbnQgbUFscGhhU2l6ZTsKKyAgICAgICAgcHJvdGVjdGVkIGludCBtRGVwdGhTaXplOworICAgICAgICBwcm90ZWN0ZWQgaW50IG1TdGVuY2lsU2l6ZTsKKyAgICAgICAgcHJpdmF0ZSBpbnRbXSBtVmFsdWUgPSBuZXcgaW50WzFdOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIFJlbmRlcmVyIGltcGxlbWVudHMgR0xTdXJmYWNlVmlldy5SZW5kZXJlciB7CisgICAgICAgIHB1YmxpYyB2b2lkIG9uRHJhd0ZyYW1lKEdMMTAgZ2wpIHsKKyAgICAgICAgICAgIEdMUGVyZkxpYi5zdGVwKCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBvblN1cmZhY2VDaGFuZ2VkKEdMMTAgZ2wsIGludCB3aWR0aCwgaW50IGhlaWdodCkgeworICAgICAgICAgICAgR0xQZXJmTGliLmluaXQod2lkdGgsIGhlaWdodCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBvblN1cmZhY2VDcmVhdGVkKEdMMTAgZ2wsIEVHTENvbmZpZyBjb25maWcpIHsKKyAgICAgICAgICAgIC8vIERvIG5vdGhpbmcuCisgICAgICAgIH0KKyAgICB9Cit9CisKZGlmZiAtLWdpdCBhL29wZW5nbC90ZXN0cy90ZXN0Vmlld3BvcnQvQW5kcm9pZC5tayBiL29wZW5nbC90ZXN0cy90ZXN0Vmlld3BvcnQvQW5kcm9pZC5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYjM3ODA5Ci0tLSAvZGV2L251bGwKKysrIGIvb3BlbmdsL3Rlc3RzL3Rlc3RWaWV3cG9ydC9BbmRyb2lkLm1rCkBAIC0wLDAgKzEsMjYgQEAKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgT3BlbkdMIEVTIEpOSSBzYW1wbGUKKyMgVGhpcyBtYWtlZmlsZSBidWlsZHMgYm90aCBhbiBhY3Rpdml0eSBhbmQgYSBzaGFyZWQgbGlicmFyeS4KKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKK2lmbmVxICgkKFRBUkdFVF9TSU1VTEFUT1IpLHRydWUpICMgbm90IDY0IGJpdCBjbGVhbgorCitUT1BfTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCisKKyMgQnVpbGQgYWN0aXZpdHkKKworTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKKworTE9DQUxfTU9EVUxFX1RBR1MgOj0gb3B0aW9uYWwKKworTE9DQUxfU1JDX0ZJTEVTIDo9ICQoY2FsbCBhbGwtc3ViZGlyLWphdmEtZmlsZXMpCisKK0xPQ0FMX1BBQ0tBR0VfTkFNRSA6PSBUZXN0Vmlld3BvcnQKKworIyBTZXQgYSBzcGVjaWZpYyBTREsgdmVyc2lvbiBzbyB3ZSBjYW4gcnVuIG9uIEZyb3lvLgorCitMT0NBTF9TREtfVkVSU0lPTiA6PSA4CisKK2luY2x1ZGUgJChCVUlMRF9QQUNLQUdFKQorCitlbmRpZiAjIFRBUkdFVF9TSU1VTEFUT1IKZGlmZiAtLWdpdCBhL29wZW5nbC90ZXN0cy90ZXN0Vmlld3BvcnQvQW5kcm9pZE1hbmlmZXN0LnhtbCBiL29wZW5nbC90ZXN0cy90ZXN0Vmlld3BvcnQvQW5kcm9pZE1hbmlmZXN0LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MGE5ZDJkCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmdsL3Rlc3RzL3Rlc3RWaWV3cG9ydC9BbmRyb2lkTWFuaWZlc3QueG1sCkBAIC0wLDAgKzEsMzcgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tCisvKgorKioKKyoqIENvcHlyaWdodCAyMDA5LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqKgorKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IAorKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAKKyoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAKKyoqCisqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIAorKioKKyoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUgCisqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCAKKyoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgCisqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCistLT4KKworPG1hbmlmZXN0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICBwYWNrYWdlPSJjb20uYW5kcm9pZC50ZXN0Ij4KKyAgICA8dXNlcy1zZGsgYW5kcm9pZDp0YXJnZXRTZGtWZXJzaW9uPSI4IiBhbmRyb2lkOm1pblNka1ZlcnNpb249IjgiIC8+CisgICAgPHVzZXMtcGVybWlzc2lvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQucGVybWlzc2lvbi5JTlRFUk5FVCIgLz4KKyAgICA8dXNlcy1wZXJtaXNzaW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5wZXJtaXNzaW9uLldSSVRFX0VYVEVSTkFMX1NUT1JBR0UiIC8+CisgICAgPGFwcGxpY2F0aW9uCisgICAgICAgICAgICBhbmRyb2lkOmxhYmVsPSJAc3RyaW5nL3Rlc3RfYWN0aXZpdHkiPgorICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSJUZXN0QWN0aXZpdHkiCisgICAgICAgICAgICAgICAgYW5kcm9pZDp0aGVtZT0iQGFuZHJvaWQ6c3R5bGUvVGhlbWUuTm9UaXRsZUJhci5GdWxsc2NyZWVuIgorICAgICAgICAgICAgCWFuZHJvaWQ6Y29uZmlnQ2hhbmdlcz0ib3JpZW50YXRpb258a2V5Ym9hcmRIaWRkZW4iPgorICAgICAgICAgICAgPGludGVudC1maWx0ZXI+CisgICAgICAgICAgICAgICAgPGFjdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmFjdGlvbi5NQUlOIiAvPgorICAgICAgICAgICAgICAgIDxjYXRlZ29yeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmNhdGVnb3J5LkxBVU5DSEVSIiAvPgorICAgICAgICAgICAgPC9pbnRlbnQtZmlsdGVyPgorICAgICAgICA8L2FjdGl2aXR5PgorICAgIDwvYXBwbGljYXRpb24+Cis8L21hbmlmZXN0PgpkaWZmIC0tZ2l0IGEvb3BlbmdsL3Rlc3RzL3Rlc3RWaWV3cG9ydC9SRUFETUUgYi9vcGVuZ2wvdGVzdHMvdGVzdFZpZXdwb3J0L1JFQURNRQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMDZhYmM5Ci0tLSAvZGV2L251bGwKKysrIGIvb3BlbmdsL3Rlc3RzL3Rlc3RWaWV3cG9ydC9SRUFETUUKQEAgLTAsMCArMSwyOCBAQAorUmVwcm8gc3RlcHM6CisKK2J1aWxkLCBpbnN0YWxsIGFuZCBydW4gdGhlIGF0dGFjaGVkIHRlc3QgcHJvZ3JhbSBUZXN0Vmlld3BvcnQuYXBrCisKK1J1biBvbiBTYXBwaGlyZSB3aXRoIEZyb3lvLgorCitUaGUgcHJvZ3JhbSBjbGVhcnMgdGhlIHNjcmVlbiB0byBibHVlLCB0aGVuIGRyYXdzIGEgZnVsbCBzY3JlZW4gd2hpdGUgcXVhZCB0aGF0CitpcyBhbGxpZ25lZCB0byB0aGUgc2NyZWVuLgorKFRoZXJlZm9yZSB0aGUgd2hvbGUgc2NyZWVuIHNob3VsZCBhcHBlYXIgdG8gYmUgd2hpdGUuKQorCisKK05vdGUgdGhhdCBzY3JlZW4gaXMgYWxsIHdoaXRlLgorCitSb3RhdGUgc2NyZWVuIDkwIGRlZ3JlZXMuCisKK0V4cGVjdGVkOiBzY3JlZW4gaXMgc3RpbGwgYWxsIHdoaXRlLgorCitBY3R1YWw6IHNjcmVlbiBpcyBibHVlIHdpdGggb2Zmc2V0IHdoaXRlIHJlY3RhbmdsZS4KKworVGhpcyBidWcgb25seSBoYXBwZW5zIG9uIFNhcHBoaXJlLCBpdCB3b3JrcyBjb3JyZWN0bHkgb24gUGFzc2lvbi4KKworV2hhdCBoYXBwZW5zOgorCitJIHRoaW5rIHRoZSBidWcgaXMgdGhhdCB0aGUgZ2wuZ2xWaWV3cG9ydCgpIGNhbGwgaW4gb25TdXJmYWNlQ2hhbmdlZCgpIGlzCitiZWluZyBpZ25vcmVkIGJ5IHRoZSBPcGVuR0wgZHJpdmVyLgorCitOT1RFOiBJZiBhIGdsLmdsVmlld3BvcnQgY2FsbCBpcyBhZGRlZCBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBvbkRyYXdGcmFtZSgpCitjYWxsICh3aGljaCBtZWFucyBpdCBpcyBjYWxsZWQgYmVmb3JlIGV2ZXJ5IGRyYXcpLCB0aGUgcHJvZ3JhbSBydW5zIGNvcnJlY3RseS4KZGlmZiAtLWdpdCBhL29wZW5nbC90ZXN0cy90ZXN0Vmlld3BvcnQvcmVzL3ZhbHVlcy9zdHJpbmdzLnhtbCBiL29wZW5nbC90ZXN0cy90ZXN0Vmlld3BvcnQvcmVzL3ZhbHVlcy9zdHJpbmdzLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNGI4YmJiCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmdsL3Rlc3RzL3Rlc3RWaWV3cG9ydC9yZXMvdmFsdWVzL3N0cmluZ3MueG1sCkBAIC0wLDAgKzEsMjkgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tCisvKgorKioKKyoqIENvcHlyaWdodCAyMDA2LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqKgorKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IAorKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAKKyoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAKKyoqCisqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIAorKioKKyoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUgCisqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCAKKyoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgCisqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCistLT4KKworPCEtLSBUaGlzIGZpbGUgY29udGFpbnMgcmVzb3VyY2UgZGVmaW5pdGlvbnMgZm9yIGRpc3BsYXllZCBzdHJpbmdzLCBhbGxvd2luZworICAgICB0aGVtIHRvIGJlIGNoYW5nZWQgYmFzZWQgb24gdGhlIGxvY2FsZSBhbmQgb3B0aW9ucy4gLS0+CisKKzxyZXNvdXJjZXM+CisgICAgPCEtLSBTaW1wbGUgc3RyaW5ncy4gLS0+CisgICAgPHN0cmluZyBuYW1lPSJ0ZXN0X2FjdGl2aXR5Ij5UZXN0IFZpZXdwb3J0PC9zdHJpbmc+CisKKzwvcmVzb3VyY2VzPgorCmRpZmYgLS1naXQgYS9vcGVuZ2wvdGVzdHMvdGVzdFZpZXdwb3J0L3NyYy9jb20vYW5kcm9pZC90ZXN0L1Rlc3RBY3Rpdml0eS5qYXZhIGIvb3BlbmdsL3Rlc3RzL3Rlc3RWaWV3cG9ydC9zcmMvY29tL2FuZHJvaWQvdGVzdC9UZXN0QWN0aXZpdHkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYzdlNDUwCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmdsL3Rlc3RzL3Rlc3RWaWV3cG9ydC9zcmMvY29tL2FuZHJvaWQvdGVzdC9UZXN0QWN0aXZpdHkuamF2YQpAQCAtMCwwICsxLDQ2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC50ZXN0OworCitpbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHk7CitpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKKworcHVibGljIGNsYXNzIFRlc3RBY3Rpdml0eSBleHRlbmRzIEFjdGl2aXR5IHsKKyAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgVEFHID0gIlRlc3RBY3Rpdml0eSI7CisgICAgVGVzdFZpZXcgbVZpZXc7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvbkNyZWF0ZShCdW5kbGUgaWNpY2xlKSB7CisgICAgICAgIHN1cGVyLm9uQ3JlYXRlKGljaWNsZSk7CisgICAgICAgIG1WaWV3ID0gbmV3IFRlc3RWaWV3KGdldEFwcGxpY2F0aW9uKCkpOworCSAgICBtVmlldy5zZXRGb2N1c2FibGVJblRvdWNoTW9kZSh0cnVlKTsKKwkgICAgc2V0Q29udGVudFZpZXcobVZpZXcpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG9uUGF1c2UoKSB7CisgICAgICAgIHN1cGVyLm9uUGF1c2UoKTsKKyAgICAgICAgbVZpZXcub25QYXVzZSgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG9uUmVzdW1lKCkgeworICAgICAgICBzdXBlci5vblJlc3VtZSgpOworICAgICAgICBtVmlldy5vblJlc3VtZSgpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL29wZW5nbC90ZXN0cy90ZXN0Vmlld3BvcnQvc3JjL2NvbS9hbmRyb2lkL3Rlc3QvVGVzdFZpZXcuamF2YSBiL29wZW5nbC90ZXN0cy90ZXN0Vmlld3BvcnQvc3JjL2NvbS9hbmRyb2lkL3Rlc3QvVGVzdFZpZXcuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yM2NjMzdkCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmdsL3Rlc3RzL3Rlc3RWaWV3cG9ydC9zcmMvY29tL2FuZHJvaWQvdGVzdC9UZXN0Vmlldy5qYXZhCkBAIC0wLDAgKzEsMjYyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC50ZXN0OworLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK2ltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOworaW1wb3J0IGphdmEubmlvLkJ5dGVPcmRlcjsKK2ltcG9ydCBqYXZhLm5pby5DaGFyQnVmZmVyOworaW1wb3J0IGphdmEubmlvLkZsb2F0QnVmZmVyOworCitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5vcGVuZ2wuR0xTdXJmYWNlVmlldzsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0OworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CitpbXBvcnQgYW5kcm9pZC52aWV3LktleUV2ZW50OworaW1wb3J0IGFuZHJvaWQudmlldy5Nb3Rpb25FdmVudDsKKworaW1wb3J0IGphdmF4Lm1pY3JvZWRpdGlvbi5raHJvbm9zLmVnbC5FR0wxMDsKK2ltcG9ydCBqYXZheC5taWNyb2VkaXRpb24ua2hyb25vcy5lZ2wuRUdMQ29uZmlnOworaW1wb3J0IGphdmF4Lm1pY3JvZWRpdGlvbi5raHJvbm9zLm9wZW5nbGVzLkdMOworaW1wb3J0IGphdmF4Lm1pY3JvZWRpdGlvbi5raHJvbm9zLm9wZW5nbGVzLkdMMTA7CitpbXBvcnQgamF2YXgubWljcm9lZGl0aW9uLmtocm9ub3Mub3BlbmdsZXMuR0wxMTsKKy8qKgorICogQW4gaW1wbGVtZW50YXRpb24gb2YgU3VyZmFjZVZpZXcgdGhhdCB1c2VzIHRoZSBkZWRpY2F0ZWQgc3VyZmFjZSBmb3IKKyAqIGRpc3BsYXlpbmcgYW4gT3BlbkdMIGFuaW1hdGlvbi4gIFRoaXMgYWxsb3dzIHRoZSBhbmltYXRpb24gdG8gcnVuIGluIGEKKyAqIHNlcGFyYXRlIHRocmVhZCwgd2l0aG91dCByZXF1aXJpbmcgdGhhdCBpdCBiZSBkcml2ZW4gYnkgdGhlIHVwZGF0ZSBtZWNoYW5pc20KKyAqIG9mIHRoZSB2aWV3IGhpZXJhcmNoeS4KKyAqCisgKiBUaGUgYXBwbGljYXRpb24tc3BlY2lmaWMgcmVuZGVyaW5nIGNvZGUgaXMgZGVsZWdhdGVkIHRvIGEgR0xWaWV3LlJlbmRlcmVyCisgKiBpbnN0YW5jZS4KKyAqLworY2xhc3MgVGVzdFZpZXcgZXh0ZW5kcyBHTFN1cmZhY2VWaWV3IHsKKyAgICBUZXN0VmlldyhDb250ZXh0IGNvbnRleHQpIHsKKyAgICAgICAgc3VwZXIoY29udGV4dCk7CisgICAgICAgIGluaXQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgVGVzdFZpZXcoQ29udGV4dCBjb250ZXh0LCBBdHRyaWJ1dGVTZXQgYXR0cnMpIHsKKyAgICAgICAgc3VwZXIoY29udGV4dCwgYXR0cnMpOworICAgICAgICBpbml0KCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGluaXQoKSB7CisgICAgICAgIHNldFJlbmRlcmVyKG5ldyBSZW5kZXJlcigpKTsKKyAgICAgICAgc2V0UmVuZGVyTW9kZShSRU5ERVJNT0RFX1dIRU5fRElSVFkpOworICAgIH0KKyAgICAKKyAgICAgICAgLyoqIEEgZ3JpZCBpcyBhIHRvcG9sb2dpY2FsbHkgcmVjdGFuZ3VsYXIgYXJyYXkgb2YgdmVydGljZXMuCisgICAgKgorICAgICogVGhlIHZlcnRleCBhbmQgaW5kZXggZGF0YSBhcmUgaGVsZCBpbiBWQk8gb2JqZWN0cyBiZWNhdXNlIG9uIG1vc3QKKyAgICAqIEdQVXMgVkJPIG9iamVjdHMgYXJlIHRoZSBmYXN0ZXN0IHdheSBvZiByZW5kZXJpbmcgc3RhdGljIHZlcnRleAorICAgICogYW5kIGluZGV4IGRhdGEuCisgICAgKgorICAgICovCisKKyAgIHByaXZhdGUgc3RhdGljIGNsYXNzIEdyaWQgeworICAgICAgIC8vIFNpemUgb2YgdmVydGV4IGRhdGEgZWxlbWVudHMgaW4gYnl0ZXM6CisgICAgICAgZmluYWwgc3RhdGljIGludCBGTE9BVF9TSVpFID0gNDsKKyAgICAgICBmaW5hbCBzdGF0aWMgaW50IENIQVJfU0laRSA9IDI7CisKKyAgICAgICAvLyBWZXJ0ZXggc3RydWN0dXJlOgorICAgICAgIC8vIGZsb2F0IHgsIHksIHo7CisKKyAgICAgICBmaW5hbCBzdGF0aWMgaW50IFZFUlRFWF9TSVpFID0gMyAqIEZMT0FUX1NJWkU7CisKKyAgICAgICBwcml2YXRlIGludCBtVmVydGV4QnVmZmVyT2JqZWN0SWQ7CisgICAgICAgcHJpdmF0ZSBpbnQgbUVsZW1lbnRCdWZmZXJPYmplY3RJZDsKKworICAgICAgIC8vIFRoZXNlIGJ1ZmZlcnMgYXJlIHVzZWQgdG8gaG9sZCB0aGUgdmVydGV4IGFuZCBpbmRleCBkYXRhIHdoaWxlCisgICAgICAgLy8gY29uc3RydWN0aW5nIHRoZSBncmlkLiBPbmNlIGNyZWF0ZUJ1ZmZlck9iamVjdHMoKSBpcyBjYWxsZWQKKyAgICAgICAvLyB0aGUgYnVmZmVycyBhcmUgbnVsbGVkIG91dCB0byBzYXZlIG1lbW9yeS4KKworICAgICAgIHByaXZhdGUgQnl0ZUJ1ZmZlciBtVmVydGV4Qnl0ZUJ1ZmZlcjsKKyAgICAgICBwcml2YXRlIEZsb2F0QnVmZmVyIG1WZXJ0ZXhCdWZmZXI7CisgICAgICAgcHJpdmF0ZSBDaGFyQnVmZmVyIG1JbmRleEJ1ZmZlcjsKKworICAgICAgIHByaXZhdGUgaW50IG1XOworICAgICAgIHByaXZhdGUgaW50IG1IOworICAgICAgIHByaXZhdGUgaW50IG1JbmRleENvdW50OworCisgICAgICAgcHVibGljIEdyaWQoaW50IHcsIGludCBoKSB7CisgICAgICAgICAgIGlmICh3IDwgMCB8fCB3ID49IDY1NTM2KSB7CisgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJ3Iik7CisgICAgICAgICAgIH0KKyAgICAgICAgICAgaWYgKGggPCAwIHx8IGggPj0gNjU1MzYpIHsKKyAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImgiKTsKKyAgICAgICAgICAgfQorICAgICAgICAgICBpZiAodyAqIGggPj0gNjU1MzYpIHsKKyAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIncgKiBoID49IDY1NTM2Iik7CisgICAgICAgICAgIH0KKworICAgICAgICAgICBtVyA9IHc7CisgICAgICAgICAgIG1IID0gaDsKKyAgICAgICAgICAgaW50IHNpemUgPSB3ICogaDsKKworICAgICAgICAgICBtVmVydGV4Qnl0ZUJ1ZmZlciA9IEJ5dGVCdWZmZXIuYWxsb2NhdGVEaXJlY3QoVkVSVEVYX1NJWkUgKiBzaXplKQorICAgICAgICAgICAgICAgLm9yZGVyKEJ5dGVPcmRlci5uYXRpdmVPcmRlcigpKTsKKyAgICAgICAgICAgbVZlcnRleEJ1ZmZlciA9IG1WZXJ0ZXhCeXRlQnVmZmVyLmFzRmxvYXRCdWZmZXIoKTsKKworICAgICAgICAgICBpbnQgcXVhZFcgPSBtVyAtIDE7CisgICAgICAgICAgIGludCBxdWFkSCA9IG1IIC0gMTsKKyAgICAgICAgICAgaW50IHF1YWRDb3VudCA9IHF1YWRXICogcXVhZEg7CisgICAgICAgICAgIGludCBpbmRleENvdW50ID0gcXVhZENvdW50ICogNjsKKyAgICAgICAgICAgbUluZGV4Q291bnQgPSBpbmRleENvdW50OworICAgICAgICAgICBtSW5kZXhCdWZmZXIgPSBCeXRlQnVmZmVyLmFsbG9jYXRlRGlyZWN0KENIQVJfU0laRSAqIGluZGV4Q291bnQpCisgICAgICAgICAgICAgICAub3JkZXIoQnl0ZU9yZGVyLm5hdGl2ZU9yZGVyKCkpLmFzQ2hhckJ1ZmZlcigpOworCisgICAgICAgICAgIC8qCisgICAgICAgICAgICAqIEluaXRpYWxpemUgdHJpYW5nbGUgbGlzdCBtZXNoLgorICAgICAgICAgICAgKgorICAgICAgICAgICAgKiAgICAgWzBdLS0tLS1bICAxXSAuLi4KKyAgICAgICAgICAgICogICAgICB8ICAgIC8gICB8CisgICAgICAgICAgICAqICAgICAgfCAgIC8gICAgfAorICAgICAgICAgICAgKiAgICAgIHwgIC8gICAgIHwKKyAgICAgICAgICAgICogICAgIFt3XS0tLS0tW3crMV0gLi4uCisgICAgICAgICAgICAqICAgICAgfCAgICAgICB8CisgICAgICAgICAgICAqCisgICAgICAgICAgICAqLworCisgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIGludCBpID0gMDsKKyAgICAgICAgICAgICAgIGZvciAoaW50IHkgPSAwOyB5IDwgcXVhZEg7IHkrKykgeworICAgICAgICAgICAgICAgICAgIGZvciAoaW50IHggPSAwOyB4IDwgcXVhZFc7IHgrKykgeworICAgICAgICAgICAgICAgICAgICAgICBjaGFyIGEgPSAoY2hhcikgKHkgKiBtVyArIHgpOworICAgICAgICAgICAgICAgICAgICAgICBjaGFyIGIgPSAoY2hhcikgKHkgKiBtVyArIHggKyAxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgY2hhciBjID0gKGNoYXIpICgoeSArIDEpICogbVcgKyB4KTsKKyAgICAgICAgICAgICAgICAgICAgICAgY2hhciBkID0gKGNoYXIpICgoeSArIDEpICogbVcgKyB4ICsgMSk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgbUluZGV4QnVmZmVyLnB1dChpKyssIGEpOworICAgICAgICAgICAgICAgICAgICAgICBtSW5kZXhCdWZmZXIucHV0KGkrKywgYyk7CisgICAgICAgICAgICAgICAgICAgICAgIG1JbmRleEJ1ZmZlci5wdXQoaSsrLCBiKTsKKworICAgICAgICAgICAgICAgICAgICAgICBtSW5kZXhCdWZmZXIucHV0KGkrKywgYik7CisgICAgICAgICAgICAgICAgICAgICAgIG1JbmRleEJ1ZmZlci5wdXQoaSsrLCBjKTsKKyAgICAgICAgICAgICAgICAgICAgICAgbUluZGV4QnVmZmVyLnB1dChpKyssIGQpOworICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgfQorCisgICAgICAgfQorCisgICAgICAgcHVibGljIHZvaWQgc2V0KGludCBpLCBpbnQgaiwgZmxvYXQgeCwgZmxvYXQgeSwgZmxvYXQgeikgeworICAgICAgICAgICBpZiAoaSA8IDAgfHwgaSA+PSBtVykgeworICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiaSIpOworICAgICAgICAgICB9CisgICAgICAgICAgIGlmIChqIDwgMCB8fCBqID49IG1IKSB7CisgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJqIik7CisgICAgICAgICAgIH0KKworICAgICAgICAgICBpbnQgaW5kZXggPSBtVyAqIGogKyBpOworCisgICAgICAgICAgIG1WZXJ0ZXhCdWZmZXIucG9zaXRpb24oaW5kZXggKiBWRVJURVhfU0laRSAvIEZMT0FUX1NJWkUpOworICAgICAgICAgICBtVmVydGV4QnVmZmVyLnB1dCh4KTsKKyAgICAgICAgICAgbVZlcnRleEJ1ZmZlci5wdXQoeSk7CisgICAgICAgICAgIG1WZXJ0ZXhCdWZmZXIucHV0KHopOworICAgICAgIH0KKworICAgICAgIHB1YmxpYyB2b2lkIGNyZWF0ZUJ1ZmZlck9iamVjdHMoR0wgZ2wpIHsKKyAgICAgICAgICAgLy8gR2VuZXJhdGUgYSB0aGUgdmVydGV4IGFuZCBlbGVtZW50IGJ1ZmZlciBJRHMKKyAgICAgICAgICAgaW50W10gdmJvSWRzID0gbmV3IGludFsyXTsKKyAgICAgICAgICAgR0wxMSBnbDExID0gKEdMMTEpIGdsOworICAgICAgICAgICBnbDExLmdsR2VuQnVmZmVycygyLCB2Ym9JZHMsIDApOworICAgICAgICAgICBtVmVydGV4QnVmZmVyT2JqZWN0SWQgPSB2Ym9JZHNbMF07CisgICAgICAgICAgIG1FbGVtZW50QnVmZmVyT2JqZWN0SWQgPSB2Ym9JZHNbMV07CisKKyAgICAgICAgICAgLy8gVXBsb2FkIHRoZSB2ZXJ0ZXggZGF0YQorICAgICAgICAgICBnbDExLmdsQmluZEJ1ZmZlcihHTDExLkdMX0FSUkFZX0JVRkZFUiwgbVZlcnRleEJ1ZmZlck9iamVjdElkKTsKKyAgICAgICAgICAgbVZlcnRleEJ5dGVCdWZmZXIucG9zaXRpb24oMCk7CisgICAgICAgICAgIGdsMTEuZ2xCdWZmZXJEYXRhKEdMMTEuR0xfQVJSQVlfQlVGRkVSLCBtVmVydGV4Qnl0ZUJ1ZmZlci5jYXBhY2l0eSgpLCBtVmVydGV4Qnl0ZUJ1ZmZlciwgR0wxMS5HTF9TVEFUSUNfRFJBVyk7CisKKyAgICAgICAgICAgZ2wxMS5nbEJpbmRCdWZmZXIoR0wxMS5HTF9FTEVNRU5UX0FSUkFZX0JVRkZFUiwgbUVsZW1lbnRCdWZmZXJPYmplY3RJZCk7CisgICAgICAgICAgIG1JbmRleEJ1ZmZlci5wb3NpdGlvbigwKTsKKyAgICAgICAgICAgZ2wxMS5nbEJ1ZmZlckRhdGEoR0wxMS5HTF9FTEVNRU5UX0FSUkFZX0JVRkZFUiwgbUluZGV4QnVmZmVyLmNhcGFjaXR5KCkgKiBDSEFSX1NJWkUsIG1JbmRleEJ1ZmZlciwgR0wxMS5HTF9TVEFUSUNfRFJBVyk7CisKKyAgICAgICAgICAgLy8gV2UgZG9uJ3QgbmVlZCB0aGUgaW4tbWVtb3J5IGRhdGEgYW55IG1vcmUKKyAgICAgICAgICAgbVZlcnRleEJ1ZmZlciA9IG51bGw7CisgICAgICAgICAgIG1WZXJ0ZXhCeXRlQnVmZmVyID0gbnVsbDsKKyAgICAgICAgICAgbUluZGV4QnVmZmVyID0gbnVsbDsKKyAgICAgICB9CisKKyAgICAgICBwdWJsaWMgdm9pZCBkcmF3KEdMMTAgZ2wpIHsKKyAgICAgICAgICAgR0wxMSBnbDExID0gKEdMMTEpIGdsOworCisgICAgICAgICAgIGdsLmdsRW5hYmxlQ2xpZW50U3RhdGUoR0wxMC5HTF9WRVJURVhfQVJSQVkpOworCisgICAgICAgICAgIGdsMTEuZ2xCaW5kQnVmZmVyKEdMMTEuR0xfQVJSQVlfQlVGRkVSLCBtVmVydGV4QnVmZmVyT2JqZWN0SWQpOworICAgICAgICAgICBnbDExLmdsVmVydGV4UG9pbnRlcigzLCBHTDEwLkdMX0ZMT0FULCBWRVJURVhfU0laRSwgMCk7CisgICAgICAgICAgIAorICAgICAgICAgICBnbDExLmdsQmluZEJ1ZmZlcihHTDExLkdMX0VMRU1FTlRfQVJSQVlfQlVGRkVSLCBtRWxlbWVudEJ1ZmZlck9iamVjdElkKTsKKyAgICAgICAgICAgZ2wxMS5nbERyYXdFbGVtZW50cyhHTDEwLkdMX1RSSUFOR0xFUywgbUluZGV4Q291bnQsIEdMMTAuR0xfVU5TSUdORURfU0hPUlQsIDApOworICAgICAgICAgICBnbC5nbERpc2FibGVDbGllbnRTdGF0ZShHTDEwLkdMX1ZFUlRFWF9BUlJBWSk7CisgICAgICAgICAgIGdsMTEuZ2xCaW5kQnVmZmVyKEdMMTEuR0xfQVJSQVlfQlVGRkVSLCAwKTsKKyAgICAgICAgICAgZ2wxMS5nbEJpbmRCdWZmZXIoR0wxMS5HTF9FTEVNRU5UX0FSUkFZX0JVRkZFUiwgMCk7CisgICAgICAgfQorICAgfQorCisKKyAgICBwcml2YXRlIGNsYXNzIFJlbmRlcmVyIGltcGxlbWVudHMgR0xTdXJmYWNlVmlldy5SZW5kZXJlciB7CisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiUmVuZGVyZXIiOworICAgICAgICBwcml2YXRlIEdyaWQgbUdyaWQ7CisgICAgICAgIAorICAgICAgICBwdWJsaWMgdm9pZCBvbkRyYXdGcmFtZShHTDEwIGdsKSB7CisJCQlnbC5nbENsZWFyQ29sb3IoMCwwLDEsMSk7CisJCQlnbC5nbENsZWFyKEdMMTAuR0xfQ09MT1JfQlVGRkVSX0JJVCk7CisgICAgICAgICAgICBtR3JpZC5kcmF3KGdsKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIG9uU3VyZmFjZUNoYW5nZWQoR0wxMCBnbCwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KSB7CisgICAgICAgICAgICBnbC5nbFZpZXdwb3J0KDAsIDAsIHdpZHRoLCBoZWlnaHQpOworCQkJZ2wuZ2xNYXRyaXhNb2RlKEdMMTEuR0xfUFJPSkVDVElPTik7CisJCQlnbC5nbExvYWRJZGVudGl0eSgpOworCQkJZ2wuZ2xPcnRob2YoMCwgd2lkdGgsIGhlaWdodCwgMCwgLTEsIDEpOworCQkJZ2wuZ2xNYXRyaXhNb2RlKEdMMTEuR0xfTU9ERUxWSUVXKTsKKyAgICAgICAgICAgIGNyZWF0ZUdyaWQoZ2wsIHdpZHRoLCBoZWlnaHQpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgb25TdXJmYWNlQ3JlYXRlZChHTDEwIGdsLCBFR0xDb25maWcgY29uZmlnKSB7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIHByaXZhdGUgdm9pZCBjcmVhdGVHcmlkKEdMMTAgZ2wsIGZsb2F0IHcsIGZsb2F0IGgpIHsKKyAgICAgICAgbUdyaWQgPSBuZXcgR3JpZCgyLCAyKTsKKwkJCWZvciAoaW50IGogPSAwOyBqIDwgMjsgaisrKSB7CisJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCAyOyBpKyspIHsKKwkJCQkJZmxvYXQgeCA9IHcgKiBpOworCQkJCQlmbG9hdCB5ID0gaCAqIGo7CisJCQkJCWZsb2F0IHogPSAwLjBmOworCQkJCQltR3JpZC5zZXQoaSxqLCB4LCB5LCB6KTsKKwkJCQl9CisJCQl9CisJCQltR3JpZC5jcmVhdGVCdWZmZXJPYmplY3RzKGdsKTsKKwkJfQorICAgIH0KK30KKwpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvRGVmYXVsdENvbnRhaW5lclNlcnZpY2UvcmVzL3ZhbHVlcy9zdHJpbmdzLnhtbCBiL3BhY2thZ2VzL0RlZmF1bHRDb250YWluZXJTZXJ2aWNlL3Jlcy92YWx1ZXMvc3RyaW5ncy54bWwKaW5kZXggMzdmNWI2MS4uZmZkNmI1OSAxMDA2NDQKLS0tIGEvcGFja2FnZXMvRGVmYXVsdENvbnRhaW5lclNlcnZpY2UvcmVzL3ZhbHVlcy9zdHJpbmdzLnhtbAorKysgYi9wYWNrYWdlcy9EZWZhdWx0Q29udGFpbmVyU2VydmljZS9yZXMvdmFsdWVzL3N0cmluZ3MueG1sCkBAIC0xOCw2ICsxOCw2IEBACiAqLwogLS0+CiA8cmVzb3VyY2VzIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KLSAgICA8IS0tIHNlcnZpY2UgbmFtZSAgLS0+CisgICAgPCEtLSBzZXJ2aWNlIG5hbWUgW0NIQVIgTElNSVQ9MjVdICAtLT4KICAgICA8c3RyaW5nIG5hbWU9InNlcnZpY2VfbmFtZSI+UGFja2FnZSBBY2Nlc3MgSGVscGVyPC9zdHJpbmc+CiA8L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1NldHRpbmdzUHJvdmlkZXIvcmVzL3ZhbHVlcy1ybS9zdHJpbmdzLnhtbCBiL3BhY2thZ2VzL1NldHRpbmdzUHJvdmlkZXIvcmVzL3ZhbHVlcy1ybS9zdHJpbmdzLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NjFlNjI1Ci0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvU2V0dGluZ3NQcm92aWRlci9yZXMvdmFsdWVzLXJtL3N0cmluZ3MueG1sCkBAIC0wLDAgKzEsMjMgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tIAorLyoqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgCisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIAorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0IAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZSAKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCAKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisgLS0+CisKKzxyZXNvdXJjZXMgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KKyAgICA8c3RyaW5nIG5hbWU9ImFwcF9sYWJlbCIgbXNnaWQ9IjQ1Njc1NjYwOTg1Mjg1ODg4NjMiPiJNZW1vcmlhIGRhbHMgcGFyYW1ldGVycyI8L3N0cmluZz4KKzwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU2V0dGluZ3NQcm92aWRlci9yZXMvdmFsdWVzL2RlZmF1bHRzLnhtbCBiL3BhY2thZ2VzL1NldHRpbmdzUHJvdmlkZXIvcmVzL3ZhbHVlcy9kZWZhdWx0cy54bWwKaW5kZXggNTJlMDRkNy4uNDNiYjI2YSAxMDA2NDQKLS0tIGEvcGFja2FnZXMvU2V0dGluZ3NQcm92aWRlci9yZXMvdmFsdWVzL2RlZmF1bHRzLnhtbAorKysgYi9wYWNrYWdlcy9TZXR0aW5nc1Byb3ZpZGVyL3Jlcy92YWx1ZXMvZGVmYXVsdHMueG1sCkBAIC03Miw0ICs3MiwzNCBAQAogCiAgICAgPCEtLSBEZWZhdWx0IGZvciBTZXR0aW5ncy5TeXN0ZW0uVklCUkFURV9JTl9TSUxFTlQgLS0+CiAgICAgPGJvb2wgbmFtZT0iZGVmX3ZpYnJhdGVfaW5fc2lsZW50Ij50cnVlPC9ib29sPgorCisgICAgPGJvb2wgbmFtZT0iZGVmX3VzZV9wdHBfaW50ZXJmYWNlIj5mYWxzZTwvYm9vbD4KKworICAgIDwhLS0gRGVmYXVsdCBmb3IgU2V0dGluZ3MuU2VjdXJlLkFDQ0VTU0lCSUxJVFlfU0NSSVBUX0lOSkVDVElPTiAtLT4KKyAgICA8Ym9vbCBuYW1lPSJkZWZfYWNjZXNzaWJpbGl0eV9zY3JpcHRfaW5qZWN0aW9uIj5mYWxzZTwvYm9vbD4KKworICAgIDwhLS0gRGVmYXVsdCBmb3IgU2V0dGluZ3MuU2VjdXJlLkFDQ0VTU0lCSUxJVFlfV0VCX0NPTlRFTlRfS0VZX0JJTkRJTkdTIC0tPgorICAgIDxzdHJpbmcgbmFtZT0iZGVmX2FjY2Vzc2liaWxpdHlfd2ViX2NvbnRlbnRfa2V5X2JpbmRpbmdzIj4KKyAgICAgICAgICAgIDwhLS0gRFBBRC9UcmFja2JhbGwgVVAgbWFwcyB0byB0cmF2ZXJzZSBwcmV2aW91cyBvbiBjdXJyZW50IGF4aXMgYW5kIHNlbmQgYW4gZXZlbnQuIC0tPgorICAgICAgICAgICAgMHgxMz0weDAxMDAwMTAwOworICAgICAgICAgICAgPCEtLSBEUEFEL1RyYWNrYmFsbCBET1dOIG1hcHMgdG8gdHJhdmVyc2UgbmV4dCBvbiBjdXJyZW50IGF4aXMgYW5kIHNlbmQgYW4gZXZlbnQuIC0tPgorICAgICAgICAgICAgMHgxND0weDAxMDEwMTAwOworICAgICAgICAgICAgPCEtLSBEUEFEL1RyYWNrYmFsbCBMRUZUIG1hcHMgdG8gYWN0aW9uIGluIG5vbi1hbmRyb2lkIGRlZmF1bHQgbmF2aWdhdGlvbiBheGlzLiAtLT4KKyAgICAgICAgICAgIDB4MTU9MHgwNDAwMDAwMDsKKyAgICAgICAgICAgIDwhLS0gRFBBRC9UcmFja2JhbGwgUklHSFQgbWFwcyB0byBubyBhY3Rpb24gaW4gbm9uLWFuZHJvaWQgZGVmYXVsdCBuYXZpZ2F0aW9uIGF4aXMuIC0tPgorICAgICAgICAgICAgMHgxNj0weDA0MDAwMDAwOworICAgICAgICAgICAgPCEtLSBMZWZ0IEFsdCtEUEFEL1RyYWNrYmFsbCBVUCB0cmFuc2l0aW9ucyBmcm9tIGFuIGF4aXMgdG8gYW5vdGhlciBhbmQgc2VuZHMgYW4gZXZlbnQuIC0tPgorICAgICAgICAgICAgPCEtLSBBeGlzIHRyYW5zaXRpb25zOiAgMiAtPiA3OyAxIC0+IDI7IDAgLT4gMTsgMyAtPiAwOyA0IC0+IDA7IDUgLT4gMDsgNiAtPiAwOyAtLT4KKyAgICAgICAgICAgIDB4MTIwMDEzPTB4MDMwMjA3MDE6MHgwMzAxMDIwMToweDAzMDAwMTAxOjB4MDMwMzAwMDE6MHgwMzA0MDAwMToweDAzMDUwMDAxOjB4MDMwNjAwMDE7CisgICAgICAgICAgICA8IS0tIExlZnQgQWx0K0RQQUQvVHJhY2tiYWxsIERPV04gdHJhbnNpdGlvbnMgZnJvbSBhbiBheGlzIHRvIGFub3RoZXIgYW5kIHNlbmRzIGFuIGV2ZW50LiAtLT4KKyAgICAgICAgICAgIDwhLS0gQXhpcyB0cmFuc2l0aW9uczogMSAtPiAwOyAyIC0+IDE7IDcgLT4gMjsgMyAtPiA3OyA0IC0+IDc7IDUgLT4gNzsgNiAtPiA3OyAtLT4KKyAgICAgICAgICAgIDB4MTIwMDE0PTB4MDMwMTAwMDE6MHgwMzAyMDEwMToweDAzMDcwMjAxOjB4MDMwMzA3MDE6MHgwMzA0MDcwMToweDAzMDUwNzAxOjB4MDMwNjA3MDE7CisgICAgICAgICAgICA8IS0tIExlZnQgQWx0K0RQQUQvVHJhY2tiYWxsIExFRlQgdHJhbnNpdGlvbnMgZnJvbSBhbiBheGlzIHRvIGFub3RoZXIgYW5kIHNlbmRzIGFuIGV2ZW50LiAtLT4KKyAgICAgICAgICAgIDwhLS0gQXhpcyB0cmFuc2l0aW9uczogNCAtPiAzOyA1IC0+IDQ7IDYgLT4gNTsgMCAtPiA2OyAxIC0+IDY7IDIgLT4gNjsgNyAtPiA2OyAtLT4KKyAgICAgICAgICAgIDB4MTIwMDE1PTB4MDMwNDAzMDE6MHgwMzA1MDQwMToweDAzMDYwNTAxOjB4MDMwMDA2MDE6MHgwMzAxMDYwMToweDAzMDIwNjAxOjB4MDMwNzA2MDE7CisgICAgICAgICAgICA8IS0tIExlZnQgQWx0K0RQQUQvVHJhY2tiYWxsIFJJR0hUIHRyYW5zaXRpb25zIGZyb20gYW4gYXhpcyB0byBhbm90aGVyIGFuZCBzZW5kcyBhbiBldmVudC4gIC0tPgorICAgICAgICAgICAgPCEtLSBBeGlzIHRyYW5zaXRpb25zOiA1IC0+IDY7IDQgLT4gNTsgMyAtPiA0OyAyIC0+IDM7IDcgLT4gMzsgMSAtPiAzOyAwIC0+IDM7IC0tPgorICAgICAgICAgICAgMHgxMjAwMTY9MHgwMzA1MDYwMToweDAzMDQwNTAxOjB4MDMwMzA0MDE6MHgwMzAyMDMwMToweDAzMDcwMzAxOjB4MDMwMTAzMDE6MHgwMzAwMDMwMTsKKyAgICA8L3N0cmluZz4KKwogPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TZXR0aW5nc1Byb3ZpZGVyL3NyYy9jb20vYW5kcm9pZC9wcm92aWRlcnMvc2V0dGluZ3MvRGF0YWJhc2VIZWxwZXIuamF2YSBiL3BhY2thZ2VzL1NldHRpbmdzUHJvdmlkZXIvc3JjL2NvbS9hbmRyb2lkL3Byb3ZpZGVycy9zZXR0aW5ncy9EYXRhYmFzZUhlbHBlci5qYXZhCmluZGV4IGFkMDRiYjQuLjhlYjNmZTYgMTAwNjQ0Ci0tLSBhL3BhY2thZ2VzL1NldHRpbmdzUHJvdmlkZXIvc3JjL2NvbS9hbmRyb2lkL3Byb3ZpZGVycy9zZXR0aW5ncy9EYXRhYmFzZUhlbHBlci5qYXZhCisrKyBiL3BhY2thZ2VzL1NldHRpbmdzUHJvdmlkZXIvc3JjL2NvbS9hbmRyb2lkL3Byb3ZpZGVycy9zZXR0aW5ncy9EYXRhYmFzZUhlbHBlci5qYXZhCkBAIC0yMSw3ICsyMSw2IEBACiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uQWN0aXZpdHlJbmZvOwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5QYWNrYWdlSW5mbzsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uUGFja2FnZU1hbmFnZXI7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5YbWxSZXNvdXJjZVBhcnNlcjsKIGltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLkN1cnNvcjsKQEAgLTM1LDEwICszNCw3IEBACiBpbXBvcnQgYW5kcm9pZC5wcm92aWRlci5TZXR0aW5nczsKIGltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLlNldHRpbmdzLlNlY3VyZTsKIGltcG9ydCBhbmRyb2lkLnRleHQuVGV4dFV0aWxzOwotaW1wb3J0IGFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQ7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkNvbmZpZzsKIGltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwotaW1wb3J0IGFuZHJvaWQudXRpbC5YbWw7CiAKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC5jb250ZW50LlBhY2thZ2VIZWxwZXI7CiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LlJJTENvbnN0YW50czsKQEAgLTY0LDcgKzYwLDcgQEAKICAgICAvLyBkYXRhYmFzZSBnZXRzIHVwZ3JhZGVkIHByb3Blcmx5LiBBdCBhIG1pbmltdW0sIHBsZWFzZSBjb25maXJtIHRoYXQgJ3VwZ3JhZGVWZXJzaW9uJwogICAgIC8vIGlzIHByb3Blcmx5IHByb3BhZ2F0ZWQgdGhyb3VnaCB5b3VyIGNoYW5nZS4gIE5vdCBkb2luZyBzbyB3aWxsIHJlc3VsdCBpbiBhIGxvc3Mgb2YgdXNlcgogICAgIC8vIHNldHRpbmdzLgotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBEQVRBQkFTRV9WRVJTSU9OID0gNTc7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IERBVEFCQVNFX1ZFUlNJT04gPSA1ODsKIAogICAgIHByaXZhdGUgQ29udGV4dCBtQ29udGV4dDsKIApAQCAtNzM0LDYgKzczMCwzMyBAQAogICAgICAgICAgICAgfQogICAgICAgICAgICAgdXBncmFkZVZlcnNpb24gPSA1NzsKICAgICAgICAgfQorCisgICAgICAgIGlmICh1cGdyYWRlVmVyc2lvbiA9PSA1NykgeworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIE5ldyBzZXR0aW5ncyB0bzoKKyAgICAgICAgICAgICAqICAxLiBFbmFibGUgaW5qZWN0aW9uIG9mIGFjY2Vzc2liaWxpdHkgc2NyaXB0cyBpbiBXZWJWaWV3cy4KKyAgICAgICAgICAgICAqICAyLiBEZWZpbmUgdGhlIGtleSBiaW5kaW5ncyBmb3IgdHJhdmVyc2luZyB3ZWIgY29udGVudCBpbiBXZWJWaWV3cy4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgZGIuYmVnaW5UcmFuc2FjdGlvbigpOworICAgICAgICAgICAgU1FMaXRlU3RhdGVtZW50IHN0bXQgPSBudWxsOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBzdG10ID0gZGIuY29tcGlsZVN0YXRlbWVudCgiSU5TRVJUIElOVE8gc2VjdXJlKG5hbWUsdmFsdWUpIgorICAgICAgICAgICAgICAgICAgICAgICAgKyAiIFZBTFVFUyg/LD8pOyIpOworICAgICAgICAgICAgICAgIGxvYWRCb29sZWFuU2V0dGluZyhzdG10LCBTZXR0aW5ncy5TZWN1cmUuQUNDRVNTSUJJTElUWV9TQ1JJUFRfSU5KRUNUSU9OLAorICAgICAgICAgICAgICAgICAgICAgICAgUi5ib29sLmRlZl9hY2Nlc3NpYmlsaXR5X3NjcmlwdF9pbmplY3Rpb24pOworICAgICAgICAgICAgICAgIHN0bXQuY2xvc2UoKTsKKyAgICAgICAgICAgICAgICBzdG10ID0gZGIuY29tcGlsZVN0YXRlbWVudCgiSU5TRVJUIElOVE8gc2VjdXJlKG5hbWUsdmFsdWUpIgorICAgICAgICAgICAgICAgICAgICAgICAgKyAiIFZBTFVFUyg/LD8pOyIpOworICAgICAgICAgICAgICAgIGxvYWRTdHJpbmdTZXR0aW5nKHN0bXQsIFNldHRpbmdzLlNlY3VyZS5BQ0NFU1NJQklMSVRZX1dFQl9DT05URU5UX0tFWV9CSU5ESU5HUywKKyAgICAgICAgICAgICAgICAgICAgICAgIFIuc3RyaW5nLmRlZl9hY2Nlc3NpYmlsaXR5X3dlYl9jb250ZW50X2tleV9iaW5kaW5ncyk7CisgICAgICAgICAgICAgICAgZGIuc2V0VHJhbnNhY3Rpb25TdWNjZXNzZnVsKCk7CisgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgIGRiLmVuZFRyYW5zYWN0aW9uKCk7CisgICAgICAgICAgICAgICAgaWYgKHN0bXQgIT0gbnVsbCkgc3RtdC5jbG9zZSgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdXBncmFkZVZlcnNpb24gPSA1ODsKKyAgICAgICAgfQorCiAgICAgICAgIC8vICoqKiBSZW1lbWJlciB0byB1cGRhdGUgREFUQUJBU0VfVkVSU0lPTiBhYm92ZSEKIAogICAgICAgICBpZiAodXBncmFkZVZlcnNpb24gIT0gY3VycmVudFZlcnNpb24pIHsKQEAgLTg3Niw3ICs4OTksNyBAQAogICAgICAgICAgICAgICAgIFN0cmluZyBjbHMgPSBwYXJzZXIuZ2V0QXR0cmlidXRlVmFsdWUobnVsbCwgImNsYXNzIik7CiAgICAgICAgICAgICAgICAgU3RyaW5nIHNob3J0Y3V0U3RyID0gcGFyc2VyLmdldEF0dHJpYnV0ZVZhbHVlKG51bGwsICJzaG9ydGN1dCIpOwogCi0gICAgICAgICAgICAgICAgaW50IHNob3J0Y3V0VmFsdWUgPSAoaW50KSBzaG9ydGN1dFN0ci5jaGFyQXQoMCk7CisgICAgICAgICAgICAgICAgaW50IHNob3J0Y3V0VmFsdWUgPSBzaG9ydGN1dFN0ci5jaGFyQXQoMCk7CiAgICAgICAgICAgICAgICAgaWYgKFRleHRVdGlscy5pc0VtcHR5KHNob3J0Y3V0U3RyKSkgewogICAgICAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJVbmFibGUgdG8gZ2V0IHNob3J0Y3V0IGZvcjogIiArIHBrZyArICIvIiArIGNscyk7CiAgICAgICAgICAgICAgICAgfQpAQCAtMTA2OCw2ICsxMDkxLDkgQEAKICAgICAKICAgICAgICAgICAgIGxvYWRCb29sZWFuU2V0dGluZyhzdG10LCBTZXR0aW5ncy5TeXN0ZW0uVklCUkFURV9JTl9TSUxFTlQsCiAgICAgICAgICAgICAgICAgICAgIFIuYm9vbC5kZWZfdmlicmF0ZV9pbl9zaWxlbnQpOworCisgICAgICAgICAgICBsb2FkQm9vbGVhblNldHRpbmcoc3RtdCwgU2V0dGluZ3MuU3lzdGVtLlVTRV9QVFBfSU5URVJGQUNFLAorICAgICAgICAgICAgICAgICAgICBSLmJvb2wuZGVmX3VzZV9wdHBfaW50ZXJmYWNlKTsKICAgICAgICAgfSBmaW5hbGx5IHsKICAgICAgICAgICAgIGlmIChzdG10ICE9IG51bGwpIHN0bXQuY2xvc2UoKTsKICAgICAgICAgfQpAQCAtMTE4NCw2ICsxMjEwLDEyIEBACiAgICAgCiAgICAgICAgICAgICBsb2FkQm9vbGVhblNldHRpbmcoc3RtdCwgU2V0dGluZ3MuU2VjdXJlLk1PVU5UX1VNU19OT1RJRllfRU5BQkxFRCwKICAgICAgICAgICAgICAgICAgICAgUi5ib29sLmRlZl9tb3VudF91bXNfbm90aWZ5X2VuYWJsZWQpOworCisgICAgICAgICAgICBsb2FkQm9vbGVhblNldHRpbmcoc3RtdCwgU2V0dGluZ3MuU2VjdXJlLkFDQ0VTU0lCSUxJVFlfU0NSSVBUX0lOSkVDVElPTiwKKyAgICAgICAgICAgICAgICAgICAgUi5ib29sLmRlZl9hY2Nlc3NpYmlsaXR5X3NjcmlwdF9pbmplY3Rpb24pOworCisgICAgICAgICAgICBsb2FkU3RyaW5nU2V0dGluZyhzdG10LCBTZXR0aW5ncy5TZWN1cmUuQUNDRVNTSUJJTElUWV9XRUJfQ09OVEVOVF9LRVlfQklORElOR1MsCisgICAgICAgICAgICAgICAgICAgIFIuc3RyaW5nLmRlZl9hY2Nlc3NpYmlsaXR5X3dlYl9jb250ZW50X2tleV9iaW5kaW5ncyk7CiAgICAgICAgIH0gZmluYWxseSB7CiAgICAgICAgICAgICBpZiAoc3RtdCAhPSBudWxsKSBzdG10LmNsb3NlKCk7CiAgICAgICAgIH0KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL0FuZHJvaWQubWsgYi9wYWNrYWdlcy9TeXN0ZW1VSS9BbmRyb2lkLm1rCmluZGV4IDRjODM3NjguLmNmYWQ5MzkgMTAwNjQ0Ci0tLSBhL3BhY2thZ2VzL1N5c3RlbVVJL0FuZHJvaWQubWsKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvQW5kcm9pZC5tawpAQCAtMywxMSArMywxNiBAQAogCiBMT0NBTF9NT0RVTEVfVEFHUyA6PSBvcHRpb25hbAogCi1MT0NBTF9TUkNfRklMRVMgOj0gJChjYWxsIGFsbC1zdWJkaXItamF2YS1maWxlcykKK0xPQ0FMX1NSQ19GSUxFUyA6PSAkKGNhbGwgYWxsLXN1YmRpci1qYXZhLWZpbGVzKSBcCisgICAgLi4vLi4vLi4vZXgvY2Fyb3VzZWwvamF2YS9jb20vYW5kcm9pZC9leC9jYXJvdXNlbC9jYXJvdXNlbC5ycwogCiBMT0NBTF9KQVZBX0xJQlJBUklFUyA6PSBzZXJ2aWNlcwogCitMT0NBTF9TVEFUSUNfSkFWQV9MSUJSQVJJRVMgOj0gYW5kcm9pZC1jb21tb24tY2Fyb3VzZWwKKwogTE9DQUxfUEFDS0FHRV9OQU1FIDo9IFN5c3RlbVVJCiBMT0NBTF9DRVJUSUZJQ0FURSA6PSBwbGF0Zm9ybQogCitMT0NBTF9QUk9HVUFSRF9GTEFHUyA6PSAtaW5jbHVkZSAkKExPQ0FMX1BBVEgpL3Byb2d1YXJkLmZsYWdzCisKIGluY2x1ZGUgJChCVUlMRF9QQUNLQUdFKQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvQW5kcm9pZE1hbmlmZXN0LnhtbCBiL3BhY2thZ2VzL1N5c3RlbVVJL0FuZHJvaWRNYW5pZmVzdC54bWwKaW5kZXggMGZjY2JlNy4uZjFmMzFjZiAxMDA2NDQKLS0tIGEvcGFja2FnZXMvU3lzdGVtVUkvQW5kcm9pZE1hbmlmZXN0LnhtbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9BbmRyb2lkTWFuaWZlc3QueG1sCkBAIC01LDYgKzUsOSBAQAogICAgICAgICA+CiAKICAgICA8dXNlcy1wZXJtaXNzaW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5wZXJtaXNzaW9uLlNUQVRVU19CQVJfU0VSVklDRSIgLz4KKyAgICA8dXNlcy1wZXJtaXNzaW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5wZXJtaXNzaW9uLkJMVUVUT09USCIgLz4KKyAgICA8dXNlcy1wZXJtaXNzaW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5wZXJtaXNzaW9uLkJMVUVUT09USF9BRE1JTiIgLz4KKyAgICA8dXNlcy1wZXJtaXNzaW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5wZXJtaXNzaW9uLkdFVF9UQVNLUyIgLz4KIAogICAgIDxhcHBsaWNhdGlvbgogICAgICAgICBhbmRyb2lkOnBlcnNpc3RlbnQ9InRydWUiCkBAIC0xMyw3ICsxNiwxMiBAQAogICAgICAgICBhbmRyb2lkOmljb249IkBkcmF3YWJsZS9pY19sYXVuY2hlcl9zZXR0aW5ncyI+CiAgICAgICAgICAgICAgICAgIAogICAgICAgICA8c2VydmljZQotICAgICAgICAgICAgYW5kcm9pZDpuYW1lPSIuc3RhdHVzYmFyLlN0YXR1c0JhclNlcnZpY2UiCisgICAgICAgICAgICBhbmRyb2lkOm5hbWU9Ii5zdGF0dXNiYXIuUGhvbmVTdGF0dXNCYXJTZXJ2aWNlIgorICAgICAgICAgICAgYW5kcm9pZDpleHBvcnRlZD0iZmFsc2UiCisgICAgICAgICAgICAvPgorCisgICAgICAgIDxzZXJ2aWNlCisgICAgICAgICAgICBhbmRyb2lkOm5hbWU9Ii5zdGF0dXNiYXIudGFibGV0LlRhYmxldFN0YXR1c0JhclNlcnZpY2UiCiAgICAgICAgICAgICBhbmRyb2lkOmV4cG9ydGVkPSJmYWxzZSIKICAgICAgICAgICAgIC8+CiAKQEAgLTIxLDUgKzI5LDExIEBACiAgICAgICAgICAgICAgICAgYW5kcm9pZDpleGNsdWRlRnJvbVJlY2VudHM9InRydWUiPgogICAgICAgICA8L2FjdGl2aXR5PgogCisgICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9Ii5yZWNlbnQuUmVjZW50QXBwbGljYXRpb25zQWN0aXZpdHkiCisgICAgICAgICAgICBhbmRyb2lkOnRoZW1lPSJAYW5kcm9pZDpzdHlsZS9UaGVtZS5Ob1RpdGxlQmFyIgorICAgICAgICAgICAgYW5kcm9pZDpleGNsdWRlRnJvbVJlY2VudHM9InRydWUiCisgICAgICAgICAgICBhbmRyb2lkOmV4cG9ydGVkPSJ0cnVlIj4KKyAgICAgICAgPC9hY3Rpdml0eT4KKwogICAgIDwvYXBwbGljYXRpb24+CiA8L21hbmlmZXN0PgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcHJvZ3VhcmQuZmxhZ3MgYi9wYWNrYWdlcy9TeXN0ZW1VSS9wcm9ndWFyZC5mbGFncwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZTQ4NDYxCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcHJvZ3VhcmQuZmxhZ3MKQEAgLTAsMCArMSw2IEBACista2VlcCBjbGFzcyBjb20uYW5kcm9pZC5zeXN0ZW11aS5zdGF0dXNiYXIudGFibGV0LlRhYmxldFN0YXR1c0JhclNlcnZpY2UgeworICBwdWJsaWMgdm9pZCBub3RpZmljYXRpb25JY29uc0NsaWNrZWQoYW5kcm9pZC52aWV3LlZpZXcpOworICBwdWJsaWMgdm9pZCBzeXN0ZW1JbmZvQ2xpY2tlZChhbmRyb2lkLnZpZXcuVmlldyk7CisgIHB1YmxpYyB2b2lkIHJlY2VudEJ1dHRvbkNsaWNrZWQoYW5kcm9pZC52aWV3LlZpZXcpOworICBwdWJsaWMgdm9pZCB0b2dnbGVMaWdodHNPdXQoYW5kcm9pZC52aWV3LlZpZXcpOworfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2FuaW0vaHlkcmF1bGljX2JyYWtlX2ludGVycG9sYXRvci54bWwgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvYW5pbS9oeWRyYXVsaWNfYnJha2VfaW50ZXJwb2xhdG9yLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YjY3NzhlCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2FuaW0vaHlkcmF1bGljX2JyYWtlX2ludGVycG9sYXRvci54bWwKQEAgLTAsMCArMSwyMyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0KKy8qIC8vZGV2aWNlL2FwcHMvY29tbW9uL3Jlcy9hbmltL2Vhc2Vfb3V0X2ludGVycG9sYXRvci54bWwKKyoqCisqKiBDb3B5cmlnaHQgMjAwNywgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKioKKyoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyAKKyoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gCisqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgCisqKgorKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAKKyoqCisqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlIAorKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgCisqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIAorKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworLS0+CisKKzxkZWNlbGVyYXRlSW50ZXJwb2xhdG9yIAorICAgIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICBhbmRyb2lkOmZhY3Rvcj0iMTAuMCIgLz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9hbmltL2xpZ2h0c19vdXRfaW4ueG1sIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2FuaW0vbGlnaHRzX291dF9pbi54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODE1NGVjMAotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9hbmltL2xpZ2h0c19vdXRfaW4ueG1sCkBAIC0wLDAgKzEsMjYgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzxzZXQgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgID4KKyAgICA8dHJhbnNsYXRlIGFuZHJvaWQ6ZnJvbVlEZWx0YT0iMTAwJXAiIGFuZHJvaWQ6dG9ZRGVsdGE9IjAiCisgICAgICAgIGFuZHJvaWQ6ZHVyYXRpb249IkBhbmRyb2lkOmludGVnZXIvY29uZmlnX21lZGl1bUFuaW1UaW1lIiAKKyAgICAgICAgYW5kcm9pZDppbnRlcnBvbGF0b3I9IkBhbmltL2h5ZHJhdWxpY19icmFrZV9pbnRlcnBvbGF0b3IiCisgICAgICAgIC8+CisgICAgPGFscGhhIGFuZHJvaWQ6ZnJvbUFscGhhPSIwLjAiIGFuZHJvaWQ6dG9BbHBoYT0iMS4wIgorICAgICAgICBhbmRyb2lkOmR1cmF0aW9uPSJAYW5kcm9pZDppbnRlZ2VyL2NvbmZpZ19sb25nQW5pbVRpbWUiIAorICAgICAgICAvPgorPC9zZXQ+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvYW5pbS9saWdodHNfb3V0X291dC54bWwgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvYW5pbS9saWdodHNfb3V0X291dC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjRiYzU1YQotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9hbmltL2xpZ2h0c19vdXRfb3V0LnhtbApAQCAtMCwwICsxLDI2IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8c2V0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICA+CisgICAgPHRyYW5zbGF0ZSBhbmRyb2lkOnRvWURlbHRhPSIxMDAlcCIgYW5kcm9pZDpmcm9tWURlbHRhPSIwIiAKKyAgICAgICAgYW5kcm9pZDpkdXJhdGlvbj0iQGFuZHJvaWQ6aW50ZWdlci9jb25maWdfbWVkaXVtQW5pbVRpbWUiIAorICAgICAgICBhbmRyb2lkOmludGVycG9sYXRvcj0iQGFuaW0vaHlkcmF1bGljX2JyYWtlX2ludGVycG9sYXRvciIKKyAgICAgICAgLz4KKyAgICA8YWxwaGEgYW5kcm9pZDp0b0FscGhhPSIwLjAiIGFuZHJvaWQ6ZnJvbUFscGhhPSIxLjAiCisgICAgICAgIGFuZHJvaWQ6ZHVyYXRpb249IkBhbmRyb2lkOmludGVnZXIvY29uZmlnX2xvbmdBbmltVGltZSIgCisgICAgICAgIC8+Cis8L3NldD4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9hbmltL3N0YXR1c19iYXJfaW4ueG1sIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2FuaW0vc3RhdHVzX2Jhcl9pbi54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDYwZmU1MAotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9hbmltL3N0YXR1c19iYXJfaW4ueG1sCkBAIC0wLDAgKzEsMjYgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzxzZXQgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgID4KKyAgICA8dHJhbnNsYXRlIGFuZHJvaWQ6ZnJvbVlEZWx0YT0iLTEwMCVwIiBhbmRyb2lkOnRvWURlbHRhPSIwIgorICAgICAgICBhbmRyb2lkOmR1cmF0aW9uPSJAYW5kcm9pZDppbnRlZ2VyL2NvbmZpZ19sb25nQW5pbVRpbWUiIAorICAgICAgICBhbmRyb2lkOmludGVycG9sYXRvcj0iQGFuaW0vaHlkcmF1bGljX2JyYWtlX2ludGVycG9sYXRvciIKKyAgICAgICAgLz4KKyAgICA8YWxwaGEgYW5kcm9pZDpmcm9tQWxwaGE9IjAuMCIgYW5kcm9pZDp0b0FscGhhPSIxLjAiCisgICAgICAgIGFuZHJvaWQ6ZHVyYXRpb249IkBhbmRyb2lkOmludGVnZXIvY29uZmlnX2xvbmdBbmltVGltZSIgCisgICAgICAgIC8+Cis8L3NldD4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9hbmltL3N0YXR1c19iYXJfb3V0LnhtbCBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9hbmltL3N0YXR1c19iYXJfb3V0LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NTcyYWI0Ci0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2FuaW0vc3RhdHVzX2Jhcl9vdXQueG1sCkBAIC0wLDAgKzEsMjYgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzxzZXQgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgID4KKyAgICA8dHJhbnNsYXRlIGFuZHJvaWQ6dG9ZRGVsdGE9Ii0xMDAlcCIgYW5kcm9pZDpmcm9tWURlbHRhPSIwIgorICAgICAgICBhbmRyb2lkOmR1cmF0aW9uPSJAYW5kcm9pZDppbnRlZ2VyL2NvbmZpZ19sb25nQW5pbVRpbWUiIAorICAgICAgICBhbmRyb2lkOmludGVycG9sYXRvcj0iQGFuaW0vaHlkcmF1bGljX2JyYWtlX2ludGVycG9sYXRvciIKKyAgICAgICAgLz4KKyAgICA8YWxwaGEgYW5kcm9pZDp0b0FscGhhPSIwLjAiIGFuZHJvaWQ6ZnJvbUFscGhhPSIxLjAiCisgICAgICAgIGFuZHJvaWQ6ZHVyYXRpb249IkBhbmRyb2lkOmludGVnZXIvY29uZmlnX2xvbmdBbmltVGltZSIgCisgICAgICAgIC8+Cis8L3NldD4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL2FsZXJ0X2Jhcl9iYWNrZ3JvdW5kX25vcm1hbC45LnBuZyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL2FsZXJ0X2Jhcl9iYWNrZ3JvdW5kX25vcm1hbC45LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYzEyN2JkCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLWhkcGkvYWxlcnRfYmFyX2JhY2tncm91bmRfbm9ybWFsLjkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL2FsZXJ0X2Jhcl9iYWNrZ3JvdW5kX3ByZXNzZWQuOS5wbmcgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9hbGVydF9iYXJfYmFja2dyb3VuZF9wcmVzc2VkLjkucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU5YWY4MDQKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9hbGVydF9iYXJfYmFja2dyb3VuZF9wcmVzc2VkLjkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL2JhdHRlcnlfMC5wbmcgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9iYXR0ZXJ5XzAucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY0MTAzYTgKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9iYXR0ZXJ5XzAucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL2JhdHRlcnlfMTAwLnBuZyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL2JhdHRlcnlfMTAwLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNjFjYmU1Ci0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLWhkcGkvYmF0dGVyeV8xMDAucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL2JhdHRlcnlfMjAucG5nIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLWhkcGkvYmF0dGVyeV8yMC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDA2NDAyNwotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL2JhdHRlcnlfMjAucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL2JhdHRlcnlfNDAucG5nIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLWhkcGkvYmF0dGVyeV80MC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTBkZTBlNwotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL2JhdHRlcnlfNDAucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL2JhdHRlcnlfNjAucG5nIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLWhkcGkvYmF0dGVyeV82MC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWEyYjhlZgotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL2JhdHRlcnlfNjAucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL2JhdHRlcnlfODAucG5nIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLWhkcGkvYmF0dGVyeV84MC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmUyMzFmMAotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL2JhdHRlcnlfODAucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL2J1dHRvbl9mcmFtZV9kZWZhdWx0LjkucG5nIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLWhkcGkvYnV0dG9uX2ZyYW1lX2RlZmF1bHQuOS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDgwOWI4NAotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL2J1dHRvbl9mcmFtZV9kZWZhdWx0LjkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL2J1dHRvbl9mcmFtZV9wcmVzc2VkLjkucG5nIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLWhkcGkvYnV0dG9uX2ZyYW1lX3ByZXNzZWQuOS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWNjMDA3YwotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL2J1dHRvbl9mcmFtZV9wcmVzc2VkLjkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL2RpdmlkZXJfaG9yaXpvbnRhbF9kYXJrX29wYXF1ZS45LnBuZyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL2RpdmlkZXJfaG9yaXpvbnRhbF9kYXJrX29wYXF1ZS45LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDIxYWFkMi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9kaXZpZGVyX2hvcml6b250YWxfZGFya19vcGFxdWUuOS5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9kb3RzX2VtcHR5LnBuZyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL2RvdHNfZW1wdHkucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMxZTc2NTQKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9kb3RzX2VtcHR5LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9kb3RzX2Z1bGwucG5nIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLWhkcGkvZG90c19mdWxsLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YzVjNjA0Ci0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLWhkcGkvZG90c19mdWxsLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9zaWduYWxfMC5wbmcgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9zaWduYWxfMC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDBlMzZjNAotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL3NpZ25hbF8wLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9zaWduYWxfMTAwLnBuZyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL3NpZ25hbF8xMDAucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk2ZTUyZmYKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9zaWduYWxfMTAwLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9zaWduYWxfMjAucG5nIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLWhkcGkvc2lnbmFsXzIwLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMGY2NTJhCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLWhkcGkvc2lnbmFsXzIwLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9zaWduYWxfNDAucG5nIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLWhkcGkvc2lnbmFsXzQwLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OTVkZDhlCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLWhkcGkvc2lnbmFsXzQwLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9zaWduYWxfNjAucG5nIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLWhkcGkvc2lnbmFsXzYwLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MWUzMWJhCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLWhkcGkvc2lnbmFsXzYwLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9zaWduYWxfODAucG5nIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLWhkcGkvc2lnbmFsXzgwLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZmE2NTZlCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLWhkcGkvc2lnbmFsXzgwLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9zdGF0dXNfYmFyX2JhY2tfZGVmYXVsdC5wbmcgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9zdGF0dXNfYmFyX2JhY2tfZGVmYXVsdC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTlmOTU0MAotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXR1c19iYXJfYmFja19kZWZhdWx0LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9zdGF0dXNfYmFyX2JhY2tfcHJlc3NlZC5wbmcgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9zdGF0dXNfYmFyX2JhY2tfcHJlc3NlZC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjhhYTE5MAotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXR1c19iYXJfYmFja19wcmVzc2VkLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9zdGF0dXNfYmFyX2V4cGFuZF9kZWZhdWx0LnBuZyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXR1c19iYXJfZXhwYW5kX2RlZmF1bHQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkyZmM3ZjgKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9zdGF0dXNfYmFyX2V4cGFuZF9kZWZhdWx0LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9zdGF0dXNfYmFyX2V4cGFuZF9wcmVzc2VkLnBuZyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXR1c19iYXJfZXhwYW5kX3ByZXNzZWQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc3ZjA5YWMKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9zdGF0dXNfYmFyX2V4cGFuZF9wcmVzc2VkLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9zdGF0dXNfYmFyX2hvbWVfZGVmYXVsdC5wbmcgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9zdGF0dXNfYmFyX2hvbWVfZGVmYXVsdC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2I5NTFkZAotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXR1c19iYXJfaG9tZV9kZWZhdWx0LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9zdGF0dXNfYmFyX2hvbWVfcHJlc3NlZC5wbmcgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9zdGF0dXNfYmFyX2hvbWVfcHJlc3NlZC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTgzNWFkNQotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXR1c19iYXJfaG9tZV9wcmVzc2VkLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9zdGF0dXNfYmFyX2ljb25fdHJheS45LnBuZyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXR1c19iYXJfaWNvbl90cmF5LjkucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUxZjA0MWMKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9zdGF0dXNfYmFyX2ljb25fdHJheS45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9zdGF0dXNfYmFyX2l0ZW1fYXBwX2JhY2tncm91bmRfbm9ybWFsLjkucG5nIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdHVzX2Jhcl9pdGVtX2FwcF9iYWNrZ3JvdW5kX25vcm1hbC45LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZmJmYTRmCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdHVzX2Jhcl9pdGVtX2FwcF9iYWNrZ3JvdW5kX25vcm1hbC45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9zdGF0dXNfYmFyX21lbnVfZGVmYXVsdC5wbmcgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9zdGF0dXNfYmFyX21lbnVfZGVmYXVsdC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTQ3NzljZgotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXR1c19iYXJfbWVudV9kZWZhdWx0LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9zdGF0dXNfYmFyX21lbnVfcHJlc3NlZC5wbmcgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9zdGF0dXNfYmFyX21lbnVfcHJlc3NlZC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmMzZDRjOQotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXR1c19iYXJfbWVudV9wcmVzc2VkLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9zdGF0dXNfYmFyX3ZldG9fbm9ybWFsLnBuZyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXR1c19iYXJfdmV0b19ub3JtYWwucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRmNTMyYjgKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9zdGF0dXNfYmFyX3ZldG9fbm9ybWFsLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9zdGF0dXNfYmFyX3ZldG9fcHJlc3NlZC5wbmcgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9zdGF0dXNfYmFyX3ZldG9fcHJlc3NlZC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTE4YzAxYgotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXR1c19iYXJfdmV0b19wcmVzc2VkLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9zeXN0ZW1fcGFuZWxfYWlycGxhbmVfZGVmYXVsdC5wbmcgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9zeXN0ZW1fcGFuZWxfYWlycGxhbmVfZGVmYXVsdC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTM3NWVlOQotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL3N5c3RlbV9wYW5lbF9haXJwbGFuZV9kZWZhdWx0LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9zeXN0ZW1fcGFuZWxfYnJpZ2h0bmVzc19kZWZhdWx0LnBuZyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL3N5c3RlbV9wYW5lbF9icmlnaHRuZXNzX2RlZmF1bHQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY2MjUwMmIKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9zeXN0ZW1fcGFuZWxfYnJpZ2h0bmVzc19kZWZhdWx0LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9zeXN0ZW1fcGFuZWxfb3JpZW50YXRpb25fZGVmYXVsdC5wbmcgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9zeXN0ZW1fcGFuZWxfb3JpZW50YXRpb25fZGVmYXVsdC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTg4N2ZiOAotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL3N5c3RlbV9wYW5lbF9vcmllbnRhdGlvbl9kZWZhdWx0LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9zeXN0ZW1fcGFuZWxfb3JpZW50YXRpb25fbG9ja2VkLnBuZyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL3N5c3RlbV9wYW5lbF9vcmllbnRhdGlvbl9sb2NrZWQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU4MTU5ZDUKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9zeXN0ZW1fcGFuZWxfb3JpZW50YXRpb25fbG9ja2VkLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9zeXN0ZW1fcGFuZWxfc291bmRfZGVmYXVsdC5wbmcgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9zeXN0ZW1fcGFuZWxfc291bmRfZGVmYXVsdC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmU4NTdiNQotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL3N5c3RlbV9wYW5lbF9zb3VuZF9kZWZhdWx0LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9hbGVydF9iYXJfYmFja2dyb3VuZF9ub3JtYWwuOS5wbmcgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9hbGVydF9iYXJfYmFja2dyb3VuZF9ub3JtYWwuOS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjU4ZGUxMwotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL2FsZXJ0X2Jhcl9iYWNrZ3JvdW5kX25vcm1hbC45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9hbGVydF9iYXJfYmFja2dyb3VuZF9wcmVzc2VkLjkucG5nIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvYWxlcnRfYmFyX2JhY2tncm91bmRfcHJlc3NlZC45LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNThkZTEzCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvYWxlcnRfYmFyX2JhY2tncm91bmRfcHJlc3NlZC45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9iYXR0ZXJ5X2xvd19iYXR0ZXJ5LnBuZyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL2JhdHRlcnlfbG93X2JhdHRlcnkucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MGJiZTZjLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL2JhdHRlcnlfbG93X2JhdHRlcnkucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvYnV0dG9uX2ZyYW1lX2RlZmF1bHQuOS5wbmcgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9idXR0b25fZnJhbWVfZGVmYXVsdC45LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YWIxZjI2Ci0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvYnV0dG9uX2ZyYW1lX2RlZmF1bHQuOS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvYnV0dG9uX2ZyYW1lX3ByZXNzZWQuOS5wbmcgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9idXR0b25fZnJhbWVfcHJlc3NlZC45LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOGY3YTRkCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvYnV0dG9uX2ZyYW1lX3ByZXNzZWQuOS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvZGl2aWRlcl9ob3Jpem9udGFsX2Rhcmtfb3BhcXVlLjkucG5nIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvZGl2aWRlcl9ob3Jpem9udGFsX2Rhcmtfb3BhcXVlLjkucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NDQ0ZjBkLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL2RpdmlkZXJfaG9yaXpvbnRhbF9kYXJrX29wYXF1ZS45LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL2RvdHNfZW1wdHkucG5nIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvZG90c19lbXB0eS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjJhZGE0MQotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL2RvdHNfZW1wdHkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL2RvdHNfZnVsbC5wbmcgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9kb3RzX2Z1bGwucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJhMzQ2ZDYKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9kb3RzX2Z1bGwucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX3N5c2Jhcl9haXJwbGFuZV9vZmYucG5nIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvaWNfc3lzYmFyX2FpcnBsYW5lX29mZi5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDg5N2JhNjEKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9pY19zeXNiYXJfYWlycGxhbmVfb2ZmLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9pY19zeXNiYXJfYWlycGxhbmVfb24ucG5nIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvaWNfc3lzYmFyX2FpcnBsYW5lX29uLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMjk2YjViCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvaWNfc3lzYmFyX2FpcnBsYW5lX29uLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9pY19zeXNiYXJfYmFjay5wbmcgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9pY19zeXNiYXJfYmFjay5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmM1YTc5YgotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX3N5c2Jhcl9iYWNrLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9pY19zeXNiYXJfYmF0dGVyeV9taW5pLnBuZyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX3N5c2Jhcl9iYXR0ZXJ5X21pbmkucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlhYmFiYjcKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9pY19zeXNiYXJfYmF0dGVyeV9taW5pLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9pY19zeXNiYXJfYmF0dGVyeV9vbi5wbmcgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9pY19zeXNiYXJfYmF0dGVyeV9vbi5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjY4YjQ3MgotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX3N5c2Jhcl9iYXR0ZXJ5X29uLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9pY19zeXNiYXJfYmx1ZXRvb3RoX29mZi5wbmcgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9pY19zeXNiYXJfYmx1ZXRvb3RoX29mZi5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTQ2M2JhNAotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX3N5c2Jhcl9ibHVldG9vdGhfb2ZmLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9pY19zeXNiYXJfYmx1ZXRvb3RoX29uLnBuZyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX3N5c2Jhcl9ibHVldG9vdGhfb24ucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEyMzlkNTAKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9pY19zeXNiYXJfYmx1ZXRvb3RoX29uLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9pY19zeXNiYXJfYnJpZ2h0bmVzcy5wbmcgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9pY19zeXNiYXJfYnJpZ2h0bmVzcy5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTdmYTVmYwotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX3N5c2Jhcl9icmlnaHRuZXNzLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9pY19zeXNiYXJfYnJpZ2h0bmVzc19hdXRvLnBuZyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX3N5c2Jhcl9icmlnaHRuZXNzX2F1dG8ucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM3YTE1MzMKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9pY19zeXNiYXJfYnJpZ2h0bmVzc19hdXRvLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9pY19zeXNiYXJfYnJpZ2h0bmVzc19sb3cucG5nIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvaWNfc3lzYmFyX2JyaWdodG5lc3NfbG93LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YTU1ZTNhCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvaWNfc3lzYmFyX2JyaWdodG5lc3NfbG93LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9pY19zeXNiYXJfY2xvc2UucG5nIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvaWNfc3lzYmFyX2Nsb3NlLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41M2FiY2JjCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvaWNfc3lzYmFyX2Nsb3NlLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9pY19zeXNiYXJfZGVmYXVsdF9iZy5wbmcgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9pY19zeXNiYXJfZGVmYXVsdF9iZy5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2U4MmQ0ZQotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX3N5c2Jhcl9kZWZhdWx0X2JnLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9pY19zeXNiYXJfZ3BzX29mZi5wbmcgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9pY19zeXNiYXJfZ3BzX29mZi5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGMyZWQzNAotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX3N5c2Jhcl9ncHNfb2ZmLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9pY19zeXNiYXJfZ3BzX29uLnBuZyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX3N5c2Jhcl9ncHNfb24ucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFlMzlmZGMKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9pY19zeXNiYXJfZ3BzX29uLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9pY19zeXNiYXJfaG9tZS5wbmcgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9pY19zeXNiYXJfaG9tZS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWQ4MTNkYwotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX3N5c2Jhcl9ob21lLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9pY19zeXNiYXJfbGlnaHRzb3V0LnBuZyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX3N5c2Jhcl9saWdodHNvdXQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhhMDdhY2MKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9pY19zeXNiYXJfbGlnaHRzb3V0LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9pY19zeXNiYXJfbWVudS5wbmcgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9pY19zeXNiYXJfbWVudS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDc3NzVmMgotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX3N5c2Jhcl9tZW51LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9pY19zeXNiYXJfb3Blbi5wbmcgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9pY19zeXNiYXJfb3Blbi5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjdkNjI0ZQotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX3N5c2Jhcl9vcGVuLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9pY19zeXNiYXJfcHJlc3NfYmcucG5nIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvaWNfc3lzYmFyX3ByZXNzX2JnLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOTU4MzkzCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvaWNfc3lzYmFyX3ByZXNzX2JnLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9pY19zeXNiYXJfcmVjZW50LnBuZyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX3N5c2Jhcl9yZWNlbnQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE3OGFmNzMKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9pY19zeXNiYXJfcmVjZW50LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9pY19zeXNiYXJfcm90YXRlX29mZl9sYW5zY2FwZS5wbmcgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9pY19zeXNiYXJfcm90YXRlX29mZl9sYW5zY2FwZS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWRhYWRmNwotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX3N5c2Jhcl9yb3RhdGVfb2ZmX2xhbnNjYXBlLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9pY19zeXNiYXJfcm90YXRlX29mZl9wb3J0cmFpdC5wbmcgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9pY19zeXNiYXJfcm90YXRlX29mZl9wb3J0cmFpdC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmRjMGFjNwotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX3N5c2Jhcl9yb3RhdGVfb2ZmX3BvcnRyYWl0LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9pY19zeXNiYXJfcm90YXRlX29uLnBuZyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX3N5c2Jhcl9yb3RhdGVfb24ucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ1MTdkMWIKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9pY19zeXNiYXJfcm90YXRlX29uLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9pY19zeXNiYXJfc291bmRfb2ZmLnBuZyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX3N5c2Jhcl9zb3VuZF9vZmYucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJkMTFlODYKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9pY19zeXNiYXJfc291bmRfb2ZmLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9pY19zeXNiYXJfc291bmRfb24ucG5nIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvaWNfc3lzYmFyX3NvdW5kX29uLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYjNiYTJmCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvaWNfc3lzYmFyX3NvdW5kX29uLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9pY19zeXNiYXJfd2lmaV9taW5pLnBuZyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX3N5c2Jhcl93aWZpX21pbmkucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZmYmQyZDMKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9pY19zeXNiYXJfd2lmaV9taW5pLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9pY19zeXNiYXJfd2lmaV9vZmYucG5nIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvaWNfc3lzYmFyX3dpZmlfb2ZmLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44N2FjYzE0Ci0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvaWNfc3lzYmFyX3dpZmlfb2ZmLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9pY19zeXNiYXJfd2lmaV9vbi5wbmcgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9pY19zeXNiYXJfd2lmaV9vbi5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmJiMWM3NAotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX3N5c2Jhcl93aWZpX29uLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9zdGF0dXNfYmFyX2JhY2tfZGVmYXVsdC5wbmcgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9zdGF0dXNfYmFyX2JhY2tfZGVmYXVsdC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWM1NzgwMgotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL3N0YXR1c19iYXJfYmFja19kZWZhdWx0LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9zdGF0dXNfYmFyX2JhY2tfcHJlc3NlZC5wbmcgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9zdGF0dXNfYmFyX2JhY2tfcHJlc3NlZC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTI1MjdiMwotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL3N0YXR1c19iYXJfYmFja19wcmVzc2VkLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9zdGF0dXNfYmFyX2V4cGFuZF9kZWZhdWx0LnBuZyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL3N0YXR1c19iYXJfZXhwYW5kX2RlZmF1bHQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNlNjQ5MjYKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9zdGF0dXNfYmFyX2V4cGFuZF9kZWZhdWx0LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9zdGF0dXNfYmFyX2V4cGFuZF9wcmVzc2VkLnBuZyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL3N0YXR1c19iYXJfZXhwYW5kX3ByZXNzZWQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM2M2M0MjYKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9zdGF0dXNfYmFyX2V4cGFuZF9wcmVzc2VkLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9zdGF0dXNfYmFyX2hvbWVfZGVmYXVsdC5wbmcgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9zdGF0dXNfYmFyX2hvbWVfZGVmYXVsdC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjIxOWRlZAotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL3N0YXR1c19iYXJfaG9tZV9kZWZhdWx0LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9zdGF0dXNfYmFyX2hvbWVfcHJlc3NlZC5wbmcgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9zdGF0dXNfYmFyX2hvbWVfcHJlc3NlZC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWU2NGZlOAotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL3N0YXR1c19iYXJfaG9tZV9wcmVzc2VkLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9zdGF0dXNfYmFyX2ljb25fdHJheS45LnBuZyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL3N0YXR1c19iYXJfaWNvbl90cmF5LjkucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUwMmFjY2UKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9zdGF0dXNfYmFyX2ljb25fdHJheS45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9zdGF0dXNfYmFyX2l0ZW1fYXBwX2JhY2tncm91bmRfbm9ybWFsLjkucG5nIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvc3RhdHVzX2Jhcl9pdGVtX2FwcF9iYWNrZ3JvdW5kX25vcm1hbC45LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMDc5NjE1Ci0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvc3RhdHVzX2Jhcl9pdGVtX2FwcF9iYWNrZ3JvdW5kX25vcm1hbC45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9zdGF0dXNfYmFyX21lbnVfZGVmYXVsdC5wbmcgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9zdGF0dXNfYmFyX21lbnVfZGVmYXVsdC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmYzYTc1NQotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL3N0YXR1c19iYXJfbWVudV9kZWZhdWx0LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9zdGF0dXNfYmFyX21lbnVfcHJlc3NlZC5wbmcgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9zdGF0dXNfYmFyX21lbnVfcHJlc3NlZC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTVlMjFkNzMKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9zdGF0dXNfYmFyX21lbnVfcHJlc3NlZC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvc3RhdHVzX2Jhcl9yZWNlbnRfZGVmYXVsdC5wbmcgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9zdGF0dXNfYmFyX3JlY2VudF9kZWZhdWx0LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZGQ4ZGM3Ci0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvc3RhdHVzX2Jhcl9yZWNlbnRfZGVmYXVsdC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvc3RhdHVzX2Jhcl9yZWNlbnRfcHJlc3NlZC5wbmcgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9zdGF0dXNfYmFyX3JlY2VudF9wcmVzc2VkLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNTBhM2U5Ci0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvc3RhdHVzX2Jhcl9yZWNlbnRfcHJlc3NlZC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvc3RhdHVzX2Jhcl92ZXRvX25vcm1hbC5wbmcgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9zdGF0dXNfYmFyX3ZldG9fbm9ybWFsLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOWE3Y2MyCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvc3RhdHVzX2Jhcl92ZXRvX25vcm1hbC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvc3RhdHVzX2Jhcl92ZXRvX3ByZXNzZWQucG5nIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvc3RhdHVzX2Jhcl92ZXRvX3ByZXNzZWQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ0NjFhYzgKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9zdGF0dXNfYmFyX3ZldG9fcHJlc3NlZC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvc3lzYmFyX2JhdHRlcnlfMC5wbmcgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9zeXNiYXJfYmF0dGVyeV8wLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZjc1YTUxCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvc3lzYmFyX2JhdHRlcnlfMC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvc3lzYmFyX2JhdHRlcnlfMTAucG5nIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvc3lzYmFyX2JhdHRlcnlfMTAucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY2YWI0YzYKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9zeXNiYXJfYmF0dGVyeV8xMC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvc3lzYmFyX2JhdHRlcnlfMTAwLnBuZyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL3N5c2Jhcl9iYXR0ZXJ5XzEwMC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2I1MDUwMAotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL3N5c2Jhcl9iYXR0ZXJ5XzEwMC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvc3lzYmFyX2JhdHRlcnlfMjAucG5nIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvc3lzYmFyX2JhdHRlcnlfMjAucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkxMTkwNjUKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9zeXNiYXJfYmF0dGVyeV8yMC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvc3lzYmFyX2JhdHRlcnlfMzAucG5nIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvc3lzYmFyX2JhdHRlcnlfMzAucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI5NmYxOWYyNmIKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9zeXNiYXJfYmF0dGVyeV8zMC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvc3lzYmFyX2JhdHRlcnlfNDAucG5nIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvc3lzYmFyX2JhdHRlcnlfNDAucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlkYWFiMjMKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9zeXNiYXJfYmF0dGVyeV80MC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvc3lzYmFyX2JhdHRlcnlfNTAucG5nIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvc3lzYmFyX2JhdHRlcnlfNTAucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYyZDI0YzQKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9zeXNiYXJfYmF0dGVyeV81MC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvc3lzYmFyX2JhdHRlcnlfNjAucG5nIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvc3lzYmFyX2JhdHRlcnlfNjAucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVlYTkyN2EKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9zeXNiYXJfYmF0dGVyeV82MC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvc3lzYmFyX2JhdHRlcnlfNzAucG5nIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvc3lzYmFyX2JhdHRlcnlfNzAucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY4MTYwODgKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9zeXNiYXJfYmF0dGVyeV83MC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvc3lzYmFyX2JhdHRlcnlfODAucG5nIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvc3lzYmFyX2JhdHRlcnlfODAucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI3ZGQ5YmIKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9zeXNiYXJfYmF0dGVyeV84MC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvc3lzYmFyX2JhdHRlcnlfOTAucG5nIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvc3lzYmFyX2JhdHRlcnlfOTAucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZlMzZmNTMKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9zeXNiYXJfYmF0dGVyeV85MC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvc3lzYmFyX2JhdHRlcnltaW5pXzEwMC5wbmcgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9zeXNiYXJfYmF0dGVyeW1pbmlfMTAwLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZWIwZjI5Ci0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvc3lzYmFyX2JhdHRlcnltaW5pXzEwMC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvc3lzYmFyX2JhdHRlcnltaW5pX3JlZC5wbmcgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9zeXNiYXJfYmF0dGVyeW1pbmlfcmVkLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZGNjNmI5Ci0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvc3lzYmFyX2JhdHRlcnltaW5pX3JlZC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvc3lzYmFyX2hpZGVub3RpZmljYXRpb25faGFuZGxlLnBuZyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL3N5c2Jhcl9oaWRlbm90aWZpY2F0aW9uX2hhbmRsZS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTQzZWRkNwotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL3N5c2Jhcl9oaWRlbm90aWZpY2F0aW9uX2hhbmRsZS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvc3lzYmFyX21pbmltZXRlcl9iZy5wbmcgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9zeXNiYXJfbWluaW1ldGVyX2JnLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZDI2NWZjCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvc3lzYmFyX21pbmltZXRlcl9iZy5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvc3lzYmFyX3BhbmVsX2JnLjkucG5nIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvc3lzYmFyX3BhbmVsX2JnLjkucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc3ZTAzNGIKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9zeXNiYXJfcGFuZWxfYmcuOS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvc3lzYmFyX3NpZ25hbF8wLnBuZyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL3N5c2Jhcl9zaWduYWxfMC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzQ2OTM3MgotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL3N5c2Jhcl9zaWduYWxfMC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvc3lzYmFyX3NpZ25hbF8xMC5wbmcgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9zeXNiYXJfc2lnbmFsXzEwLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NjI1ZDlhCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvc3lzYmFyX3NpZ25hbF8xMC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvc3lzYmFyX3NpZ25hbF8xMDAucG5nIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvc3lzYmFyX3NpZ25hbF8xMDAucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIyZTc2M2IKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9zeXNiYXJfc2lnbmFsXzEwMC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvc3lzYmFyX3NpZ25hbF8yMC5wbmcgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9zeXNiYXJfc2lnbmFsXzIwLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYjY2MzYyCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvc3lzYmFyX3NpZ25hbF8yMC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvc3lzYmFyX3NpZ25hbF8zMC5wbmcgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9zeXNiYXJfc2lnbmFsXzMwLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hODdkOTRlCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvc3lzYmFyX3NpZ25hbF8zMC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvc3lzYmFyX3NpZ25hbF80MC5wbmcgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9zeXNiYXJfc2lnbmFsXzQwLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZTIyOWQ1Ci0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvc3lzYmFyX3NpZ25hbF80MC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvc3lzYmFyX3NpZ25hbF81MC5wbmcgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9zeXNiYXJfc2lnbmFsXzUwLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZTk4OWQ0Ci0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvc3lzYmFyX3NpZ25hbF81MC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvc3lzYmFyX3NpZ25hbF82MC5wbmcgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9zeXNiYXJfc2lnbmFsXzYwLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYWM1N2RjCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvc3lzYmFyX3NpZ25hbF82MC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvc3lzYmFyX3NpZ25hbF83MC5wbmcgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9zeXNiYXJfc2lnbmFsXzcwLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMjgxOTY4Ci0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvc3lzYmFyX3NpZ25hbF83MC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvc3lzYmFyX3NpZ25hbF84MC5wbmcgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9zeXNiYXJfc2lnbmFsXzgwLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MTc3YWUxCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvc3lzYmFyX3NpZ25hbF84MC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvc3lzYmFyX3NpZ25hbF85MC5wbmcgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9zeXNiYXJfc2lnbmFsXzkwLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZjYwNDgwCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvc3lzYmFyX3NpZ25hbF85MC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvc3lzYmFyX3NpZ25hbG1pbmlfMTAwLnBuZyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL3N5c2Jhcl9zaWduYWxtaW5pXzEwMC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTVlYWE2MwotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL3N5c2Jhcl9zaWduYWxtaW5pXzEwMC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvc3lzYmFyX3RvZ2dsZV9iZ19vZmYuOS5wbmcgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9zeXNiYXJfdG9nZ2xlX2JnX29mZi45LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NDg0OWQ4Ci0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvc3lzYmFyX3RvZ2dsZV9iZ19vZmYuOS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvc3lzYmFyX3RvZ2dsZV9iZ19vbi45LnBuZyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL3N5c2Jhcl90b2dnbGVfYmdfb24uOS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjExMDU4YwotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL3N5c2Jhcl90b2dnbGVfYmdfb24uOS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvc3lzdGVtX3BhbmVsX2FpcnBsYW5lX2RlZmF1bHQucG5nIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvc3lzdGVtX3BhbmVsX2FpcnBsYW5lX2RlZmF1bHQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmViODc1MzIKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9zeXN0ZW1fcGFuZWxfYWlycGxhbmVfZGVmYXVsdC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvc3lzdGVtX3BhbmVsX2JyaWdodG5lc3NfZGVmYXVsdC5wbmcgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9zeXN0ZW1fcGFuZWxfYnJpZ2h0bmVzc19kZWZhdWx0LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYmZjODNlCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvc3lzdGVtX3BhbmVsX2JyaWdodG5lc3NfZGVmYXVsdC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvc3lzdGVtX3BhbmVsX29yaWVudGF0aW9uX2RlZmF1bHQucG5nIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvc3lzdGVtX3BhbmVsX29yaWVudGF0aW9uX2RlZmF1bHQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBkODQ3OWMKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9zeXN0ZW1fcGFuZWxfb3JpZW50YXRpb25fZGVmYXVsdC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvc3lzdGVtX3BhbmVsX29yaWVudGF0aW9uX2xvY2tlZC5wbmcgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9zeXN0ZW1fcGFuZWxfb3JpZW50YXRpb25fbG9ja2VkLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZjFkMjZjCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvc3lzdGVtX3BhbmVsX29yaWVudGF0aW9uX2xvY2tlZC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvc3lzdGVtX3BhbmVsX3NvdW5kX2RlZmF1bHQucG5nIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvc3lzdGVtX3BhbmVsX3NvdW5kX2RlZmF1bHQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIyNjM2ZDYKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9zeXN0ZW1fcGFuZWxfc291bmRfZGVmYXVsdC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlL2FsZXJ0X2Jhcl9iYWNrZ3JvdW5kLnhtbCBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS9hbGVydF9iYXJfYmFja2dyb3VuZC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjRiNmFhMwotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS9hbGVydF9iYXJfYmFja2dyb3VuZC54bWwKQEAgLTAsMCArMSwyMyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPHNlbGVjdG9yIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCI+CisgICAgPGl0ZW0gYW5kcm9pZDpzdGF0ZV9wcmVzc2VkPSJ0cnVlIiAKKyAgICAgICAgYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2FsZXJ0X2Jhcl9iYWNrZ3JvdW5kX3ByZXNzZWQiIC8+CisgICAgPGl0ZW0KKyAgICAgICAgIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9hbGVydF9iYXJfYmFja2dyb3VuZF9ub3JtYWwiIC8+Cis8L3NlbGVjdG9yPgorCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUvYnV0dG9uX2ZyYW1lLnhtbCBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS9idXR0b25fZnJhbWUueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVkYjM5YTUKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUvYnV0dG9uX2ZyYW1lLnhtbApAQCAtMCwwICsxLDIxIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8c2VsZWN0b3IgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIj4KKyAgICA8aXRlbSBhbmRyb2lkOnN0YXRlX3ByZXNzZWQ9InRydWUiIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9idXR0b25fZnJhbWVfcHJlc3NlZCIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvYnV0dG9uX2ZyYW1lX2RlZmF1bHQiIC8+Cis8L3NlbGVjdG9yPgorCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUvaWNfc3lzYmFyX2ljb25fYmcueG1sIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlL2ljX3N5c2Jhcl9pY29uX2JnLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOGJhMmE4Ci0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlL2ljX3N5c2Jhcl9pY29uX2JnLnhtbApAQCAtMCwwICsxLDIxIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8c2VsZWN0b3IgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIj4KKyAgICA8aXRlbSBhbmRyb2lkOnN0YXRlX3ByZXNzZWQ9InRydWUiIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19zeXNiYXJfcHJlc3NfYmciIC8+CisgICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX3N5c2Jhcl9kZWZhdWx0X2JnIiAvPgorPC9zZWxlY3Rvcj4KKwpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlL3N0YXR1c19iYXJfYmFjay54bWwgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUvc3RhdHVzX2Jhcl9iYWNrLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MmJmMTQ3Ci0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlL3N0YXR1c19iYXJfYmFjay54bWwKQEAgLTAsMCArMSwyMSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPHNlbGVjdG9yIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCI+CisgICAgPGl0ZW0gYW5kcm9pZDpzdGF0ZV9wcmVzc2VkPSJ0cnVlIiBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvc3RhdHVzX2Jhcl9iYWNrX3ByZXNzZWQiIC8+CisgICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL3N0YXR1c19iYXJfYmFja19kZWZhdWx0IiAvPgorPC9zZWxlY3Rvcj4KKwpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlL3N0YXR1c19iYXJfZXhwYW5kLnhtbCBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS9zdGF0dXNfYmFyX2V4cGFuZC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjk2NjkyMAotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS9zdGF0dXNfYmFyX2V4cGFuZC54bWwKQEAgLTAsMCArMSwyMSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPHNlbGVjdG9yIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCI+CisgICAgPGl0ZW0gYW5kcm9pZDpzdGF0ZV9wcmVzc2VkPSJ0cnVlIiBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvc3RhdHVzX2Jhcl9leHBhbmRfcHJlc3NlZCIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvc3RhdHVzX2Jhcl9leHBhbmRfZGVmYXVsdCIgLz4KKzwvc2VsZWN0b3I+CisKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS9zdGF0dXNfYmFyX2hvbWUueG1sIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlL3N0YXR1c19iYXJfaG9tZS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDAxMTcxMQotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS9zdGF0dXNfYmFyX2hvbWUueG1sCkBAIC0wLDAgKzEsMjEgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzxzZWxlY3RvciB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiPgorICAgIDxpdGVtIGFuZHJvaWQ6c3RhdGVfcHJlc3NlZD0idHJ1ZSIgYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL3N0YXR1c19iYXJfaG9tZV9wcmVzc2VkIiAvPgorICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9zdGF0dXNfYmFyX2hvbWVfZGVmYXVsdCIgLz4KKzwvc2VsZWN0b3I+CisKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS9zdGF0dXNfYmFyX21lbnUueG1sIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlL3N0YXR1c19iYXJfbWVudS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWE3Mjg2ZQotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS9zdGF0dXNfYmFyX21lbnUueG1sCkBAIC0wLDAgKzEsMjEgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzxzZWxlY3RvciB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiPgorICAgIDxpdGVtIGFuZHJvaWQ6c3RhdGVfcHJlc3NlZD0idHJ1ZSIgYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL3N0YXR1c19iYXJfbWVudV9wcmVzc2VkIiAvPgorICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9zdGF0dXNfYmFyX21lbnVfZGVmYXVsdCIgLz4KKzwvc2VsZWN0b3I+CisKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS9zdGF0dXNfYmFyX3JlY2VudC54bWwgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUvc3RhdHVzX2Jhcl9yZWNlbnQueG1sCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmQ3MDg0NTUKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUvc3RhdHVzX2Jhcl9yZWNlbnQueG1sCkBAIC0wLDAgKzEsMjEgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzxzZWxlY3RvciB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiPgorICAgIDxpdGVtIGFuZHJvaWQ6c3RhdGVfcHJlc3NlZD0idHJ1ZSIgYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL3N0YXR1c19iYXJfcmVjZW50X3ByZXNzZWQiIC8+CisgICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL3N0YXR1c19iYXJfcmVjZW50X2RlZmF1bHQiIC8+Cis8L3NlbGVjdG9yPgorCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUvc3RhdHVzX2Jhcl92ZXRvLnhtbCBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS9zdGF0dXNfYmFyX3ZldG8ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZlMWI2ODEKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUvc3RhdHVzX2Jhcl92ZXRvLnhtbApAQCAtMCwwICsxLDIxIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8c2VsZWN0b3IgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIj4KKyAgICA8aXRlbSBhbmRyb2lkOnN0YXRlX3ByZXNzZWQ9InRydWUiIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9zdGF0dXNfYmFyX3ZldG9fcHJlc3NlZCIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvc3RhdHVzX2Jhcl92ZXRvX25vcm1hbCIgLz4KKzwvc2VsZWN0b3I+CisKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS9zeXNiYXJfYmF0dGVyeS54bWwgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUvc3lzYmFyX2JhdHRlcnkueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk1NTFiZjAKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUvc3lzYmFyX2JhdHRlcnkueG1sCkBAIC0wLDAgKzEsMzMgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tCisvKiAvL2RldmljZS9hcHBzL2NvbW1vbi9yZXMvZHJhd2FibGUvc3RhdF9zeXNfYmF0dGVyeS54bWwKKyoqCisqKiBDb3B5cmlnaHQgMjAwNywgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKioKKyoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyAKKyoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gCisqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgCisqKgorKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAKKyoqCisqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlIAorKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgCisqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIAorKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworLS0+CisKKzxsZXZlbC1saXN0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCI+CisgICAgPGl0ZW0gYW5kcm9pZDptYXhMZXZlbD0iMDEiIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9zeXNiYXJfYmF0dGVyeV8wIiAvPgorICAgIDxpdGVtIGFuZHJvaWQ6bWF4TGV2ZWw9IjEwIiBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvc3lzYmFyX2JhdHRlcnlfMTAiIC8+CisgICAgPGl0ZW0gYW5kcm9pZDptYXhMZXZlbD0iMjAiIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9zeXNiYXJfYmF0dGVyeV8yMCIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOm1heExldmVsPSIzMCIgYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL3N5c2Jhcl9iYXR0ZXJ5XzMwIiAvPgorICAgIDxpdGVtIGFuZHJvaWQ6bWF4TGV2ZWw9IjQwIiBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvc3lzYmFyX2JhdHRlcnlfNDAiIC8+CisgICAgPGl0ZW0gYW5kcm9pZDptYXhMZXZlbD0iNTAiIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9zeXNiYXJfYmF0dGVyeV81MCIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOm1heExldmVsPSI2MCIgYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL3N5c2Jhcl9iYXR0ZXJ5XzYwIiAvPgorICAgIDxpdGVtIGFuZHJvaWQ6bWF4TGV2ZWw9IjcwIiBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvc3lzYmFyX2JhdHRlcnlfNzAiIC8+CisgICAgPGl0ZW0gYW5kcm9pZDptYXhMZXZlbD0iODAiIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9zeXNiYXJfYmF0dGVyeV84MCIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOm1heExldmVsPSI5MCIgYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL3N5c2Jhcl9iYXR0ZXJ5XzkwIiAvPgorICAgIDxpdGVtIGFuZHJvaWQ6bWF4TGV2ZWw9IjEwMSIgYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL3N5c2Jhcl9iYXR0ZXJ5XzEwMCIgLz4KKzwvbGV2ZWwtbGlzdD4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS9zeXNiYXJfYmF0dGVyeW1pbmkueG1sIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlL3N5c2Jhcl9iYXR0ZXJ5bWluaS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzczMDBlNgotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS9zeXNiYXJfYmF0dGVyeW1pbmkueG1sCkBAIC0wLDAgKzEsMjkgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tCisvKiAvL2RldmljZS9hcHBzL2NvbW1vbi9yZXMvZHJhd2FibGUvc3RhdF9zeXNfYmF0dGVyeS54bWwKKyoqCisqKiBDb3B5cmlnaHQgMjAwNywgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKioKKyoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyAKKyoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gCisqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgCisqKgorKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAKKyoqCisqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlIAorKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgCisqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIAorKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworLS0+CisKKzxjbGlwIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICAgICAgYW5kcm9pZDpjbGlwT3JpZW50YXRpb249Imhvcml6b250YWwiCisgICAgICAgIGFuZHJvaWQ6bWF4TGV2ZWw9IjEwMCIKKyAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJsZWZ0Ij4KKyAgICA8bGV2ZWwtbGlzdD4KKyAgICAgICAgPGl0ZW0gYW5kcm9pZDptYXhMZXZlbD0iMTUwMCIgIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9zeXNiYXJfYmF0dGVyeW1pbmlfcmVkIiAvPgorICAgICAgICA8aXRlbSBhbmRyb2lkOm1heExldmVsPSIxMDAwMCIgYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL3N5c2Jhcl9iYXR0ZXJ5bWluaV8xMDAiIC8+CisgICAgPC9sZXZlbC1saXN0PgorPC9jbGlwPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlL3N5c2Jhcl9zaWduYWwueG1sIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlL3N5c2Jhcl9zaWduYWwueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk1NjFjMzcKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUvc3lzYmFyX3NpZ25hbC54bWwKQEAgLTAsMCArMSwzMyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0KKy8qIC8vZGV2aWNlL2FwcHMvY29tbW9uL3Jlcy9kcmF3YWJsZS9zdGF0X3N5c19iYXR0ZXJ5LnhtbAorKioKKyoqIENvcHlyaWdodCAyMDA3LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqKgorKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IAorKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAKKyoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAKKyoqCisqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIAorKioKKyoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUgCisqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCAKKyoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgCisqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCistLT4KKworPGxldmVsLWxpc3QgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIj4KKyAgICA8aXRlbSBhbmRyb2lkOm1heExldmVsPSIwMSIgYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL3N5c2Jhcl9zaWduYWxfMCIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOm1heExldmVsPSIxMCIgYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL3N5c2Jhcl9zaWduYWxfMTAiIC8+CisgICAgPGl0ZW0gYW5kcm9pZDptYXhMZXZlbD0iMjAiIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9zeXNiYXJfc2lnbmFsXzIwIiAvPgorICAgIDxpdGVtIGFuZHJvaWQ6bWF4TGV2ZWw9IjMwIiBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvc3lzYmFyX3NpZ25hbF8zMCIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOm1heExldmVsPSI0MCIgYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL3N5c2Jhcl9zaWduYWxfNDAiIC8+CisgICAgPGl0ZW0gYW5kcm9pZDptYXhMZXZlbD0iNTAiIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9zeXNiYXJfc2lnbmFsXzUwIiAvPgorICAgIDxpdGVtIGFuZHJvaWQ6bWF4TGV2ZWw9IjYwIiBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvc3lzYmFyX3NpZ25hbF82MCIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOm1heExldmVsPSI3MCIgYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL3N5c2Jhcl9zaWduYWxfNzAiIC8+CisgICAgPGl0ZW0gYW5kcm9pZDptYXhMZXZlbD0iODAiIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9zeXNiYXJfc2lnbmFsXzgwIiAvPgorICAgIDxpdGVtIGFuZHJvaWQ6bWF4TGV2ZWw9IjkwIiBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvc3lzYmFyX3NpZ25hbF85MCIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOm1heExldmVsPSIxMDEiIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9zeXNiYXJfc2lnbmFsXzEwMCIgLz4KKzwvbGV2ZWwtbGlzdD4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS9zeXNiYXJfc2lnbmFsbWluaS54bWwgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUvc3lzYmFyX3NpZ25hbG1pbmkueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU5OGJmMTAKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUvc3lzYmFyX3NpZ25hbG1pbmkueG1sCkBAIC0wLDAgKzEsMjUgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tCisvKiAvL2RldmljZS9hcHBzL2NvbW1vbi9yZXMvZHJhd2FibGUvc3RhdF9zeXNfYmF0dGVyeS54bWwKKyoqCisqKiBDb3B5cmlnaHQgMjAwNywgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKioKKyoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyAKKyoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gCisqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgCisqKgorKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAKKyoqCisqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlIAorKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgCisqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIAorKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworLS0+CisKKzxjbGlwIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICAgICAgYW5kcm9pZDpjbGlwT3JpZW50YXRpb249Imhvcml6b250YWwiCisgICAgICAgIGFuZHJvaWQ6Z3Jhdml0eT0icmlnaHQiCisgICAgICAgIGFuZHJvaWQ6bWF4TGV2ZWw9IjEwMDAwIgorICAgICAgICBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvc3lzYmFyX3NpZ25hbG1pbmlfMTAwIiAvPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlL3N5c2Jhcl93aWZpLnhtbCBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS9zeXNiYXJfd2lmaS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTU2MWMzNwotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS9zeXNiYXJfd2lmaS54bWwKQEAgLTAsMCArMSwzMyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0KKy8qIC8vZGV2aWNlL2FwcHMvY29tbW9uL3Jlcy9kcmF3YWJsZS9zdGF0X3N5c19iYXR0ZXJ5LnhtbAorKioKKyoqIENvcHlyaWdodCAyMDA3LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqKgorKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IAorKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAKKyoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAKKyoqCisqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIAorKioKKyoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUgCisqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCAKKyoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgCisqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCistLT4KKworPGxldmVsLWxpc3QgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIj4KKyAgICA8aXRlbSBhbmRyb2lkOm1heExldmVsPSIwMSIgYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL3N5c2Jhcl9zaWduYWxfMCIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOm1heExldmVsPSIxMCIgYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL3N5c2Jhcl9zaWduYWxfMTAiIC8+CisgICAgPGl0ZW0gYW5kcm9pZDptYXhMZXZlbD0iMjAiIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9zeXNiYXJfc2lnbmFsXzIwIiAvPgorICAgIDxpdGVtIGFuZHJvaWQ6bWF4TGV2ZWw9IjMwIiBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvc3lzYmFyX3NpZ25hbF8zMCIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOm1heExldmVsPSI0MCIgYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL3N5c2Jhcl9zaWduYWxfNDAiIC8+CisgICAgPGl0ZW0gYW5kcm9pZDptYXhMZXZlbD0iNTAiIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9zeXNiYXJfc2lnbmFsXzUwIiAvPgorICAgIDxpdGVtIGFuZHJvaWQ6bWF4TGV2ZWw9IjYwIiBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvc3lzYmFyX3NpZ25hbF82MCIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOm1heExldmVsPSI3MCIgYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL3N5c2Jhcl9zaWduYWxfNzAiIC8+CisgICAgPGl0ZW0gYW5kcm9pZDptYXhMZXZlbD0iODAiIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9zeXNiYXJfc2lnbmFsXzgwIiAvPgorICAgIDxpdGVtIGFuZHJvaWQ6bWF4TGV2ZWw9IjkwIiBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvc3lzYmFyX3NpZ25hbF85MCIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOm1heExldmVsPSIxMDEiIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9zeXNiYXJfc2lnbmFsXzEwMCIgLz4KKzwvbGV2ZWwtbGlzdD4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS9zeXNiYXJfd2lmaW1pbmkueG1sIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlL3N5c2Jhcl93aWZpbWluaS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2E2YzllZAotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS9zeXNiYXJfd2lmaW1pbmkueG1sCkBAIC0wLDAgKzEsMjUgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tCisvKiAvL2RldmljZS9hcHBzL2NvbW1vbi9yZXMvZHJhd2FibGUvc3RhdF9zeXNfYmF0dGVyeS54bWwKKyoqCisqKiBDb3B5cmlnaHQgMjAwNywgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKioKKyoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyAKKyoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gCisqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgCisqKgorKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAKKyoqCisqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlIAorKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgCisqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIAorKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworLS0+CisKKzxjbGlwIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICAgICAgYW5kcm9pZDpjbGlwT3JpZW50YXRpb249Imhvcml6b250YWwiCisgICAgICAgIGFuZHJvaWQ6Z3Jhdml0eT0icmlnaHQiCisgICAgICAgIGFuZHJvaWQ6bWF4TGV2ZWw9IjEwMCIKKyAgICAgICAgYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL3N5c2Jhcl9zaWduYWxtaW5pXzEwMCIgLz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9sYXlvdXQteGxhcmdlL3N0YXR1c19iYXIueG1sIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2xheW91dC14bGFyZ2Uvc3RhdHVzX2Jhci54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTBiMzRjYwotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9sYXlvdXQteGxhcmdlL3N0YXR1c19iYXIueG1sCkBAIC0wLDAgKzEsMTY0IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLQorLyogYXBwcy9jb21tb24vYXNzZXRzL2RlZmF1bHQvZGVmYXVsdC9za2lucy9TdGF0dXNCYXIueG1sCisqKgorKiogQ29weXJpZ2h0IDIwMDYsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoqCisqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgCisqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIAorKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0IAorKioKKyoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgCisqKgorKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZSAKKyoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIAorKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCAKKyoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKy0tPgorCis8IS0tICAgIGFuZHJvaWQ6YmFja2dyb3VuZD0iQGRyYXdhYmxlL3N0YXR1c19iYXJfY2xvc2VkX2RlZmF1bHRfYmFja2dyb3VuZCIgLS0+Cis8RnJhbWVMYXlvdXQKKyAgICB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgeG1sbnM6c3lzdGVtdWk9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvY29tLmFuZHJvaWQuc3lzdGVtdWkiCisgICAgYW5kcm9pZDpiYWNrZ3JvdW5kPSJAZHJhd2FibGUvc3RhdHVzX2Jhcl9iYWNrZ3JvdW5kIgorICAgID4KKyAgICA8UmVsYXRpdmVMYXlvdXQKKyAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9iYXJfY29udGVudHMiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0ibWF0Y2hfcGFyZW50IgorICAgICAgICA+CisKKyAgICAgICAgPGNvbS5hbmRyb2lkLnN5c3RlbXVpLnN0YXR1c2Jhci50YWJsZXQuTm90aWZpY2F0aW9uSWNvbkFyZWEKKyAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvbm90aWZpY2F0aW9uSWNvbnMiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJtYXRjaF9wYXJlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9hbGlnblBhcmVudExlZnQ9InRydWUiCisgICAgICAgICAgICBhbmRyb2lkOnBhZGRpbmdMZWZ0PSI2ZGlwIgorICAgICAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJjZW50ZXJfdmVydGljYWwiCisgICAgICAgICAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJob3Jpem9udGFsIgorICAgICAgICAgICAgPgorICAgICAgICAgICAgPHZpZXcKKyAgICAgICAgICAgICAgICBjbGFzcz0iY29tLmFuZHJvaWQuc3lzdGVtdWkuc3RhdHVzYmFyLnRhYmxldC5Ob3RpZmljYXRpb25JY29uQXJlYSRJY29uTGF5b3V0IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvaWNvbnMiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IkAqYW5kcm9pZDpkaW1lbi9zdGF0dXNfYmFyX2ljb25fc2l6ZSIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5MZWZ0PSI4ZGlwIgorICAgICAgICAgICAgICAgIC8+CisgICAgICAgICAgICA8dmlldworICAgICAgICAgICAgICAgIGNsYXNzPSJjb20uYW5kcm9pZC5zeXN0ZW11aS5zdGF0dXNiYXIudGFibGV0Lk5vdGlmaWNhdGlvbkljb25BcmVhJERyYWdnZXJWaWV3IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvaGFuZGxlIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSIzMmRpcCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmJhY2tncm91bmQ9IkBkcmF3YWJsZS9zeXNiYXJfaGlkZW5vdGlmaWNhdGlvbl9oYW5kbGUiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luTGVmdD0iOGRpcCIKKyAgICAgICAgICAgICAgICAvPgorICAgICAgICAgICAgPEltYWdlVmlldworICAgICAgICAgICAgICAgIGNsYXNzPSJjb20uYW5kcm9pZC5zeXN0ZW11aS5zdGF0dXNiYXIudGFibGV0Lk5vdGlmaWNhdGlvbkljb25BcmVhJE1vcmVWaWV3IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvZXhwYW5kIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpzcmM9IkBkcmF3YWJsZS9pY19zeXNiYXJfb3BlbiIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOm9uQ2xpY2s9Im5vdGlmaWNhdGlvbkljb25zQ2xpY2tlZCIKKyAgICAgICAgICAgICAgICAvPgorCisgICAgICAgIDwvY29tLmFuZHJvaWQuc3lzdGVtdWkuc3RhdHVzYmFyLnRhYmxldC5Ob3RpZmljYXRpb25JY29uQXJlYT4KKworICAgICAgICA8TGluZWFyTGF5b3V0IGFuZHJvaWQ6aWQ9IkAraWQvdGlja2VyIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IjMwMGRpcCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0ibWF0Y2hfcGFyZW50IgorICAgICAgICAgICAgYW5kcm9pZDpwYWRkaW5nTGVmdD0iNmRpcCIKKyAgICAgICAgICAgIGFuZHJvaWQ6YW5pbWF0aW9uQ2FjaGU9ImZhbHNlIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfYWxpZ25MZWZ0PSJAaWQvbm90aWZpY2F0aW9uSWNvbnMiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9hbGlnblRvcD0iQGlkL25vdGlmaWNhdGlvbkljb25zIgorICAgICAgICAgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0iaG9yaXpvbnRhbCIKKyAgICAgICAgICAgIGFuZHJvaWQ6dmlzaWJpbGl0eT0iZ29uZSIKKyAgICAgICAgICAgID4KKyAgICAgICAgICAgIDxJbWFnZVZpZXcgYW5kcm9pZDppZD0iQCtpZC90aWNrZXJJY29uIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJtYXRjaF9wYXJlbnQiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luUmlnaHQ9IjhkaXAiCisgICAgICAgICAgICAgICAgLz4KKyAgICAgICAgICAgIDxjb20uYW5kcm9pZC5zeXN0ZW11aS5zdGF0dXNiYXIuVGlja2VyVmlldyBhbmRyb2lkOmlkPSJAK2lkL3RpY2tlclRleHQiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IjBkaXAiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2VpZ2h0PSIxIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6cGFkZGluZ1RvcD0iMmRpcCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOnBhZGRpbmdSaWdodD0iMTBkaXAiPgorICAgICAgICAgICAgICAgIDxUZXh0VmlldworICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHRBcHBlYXJhbmNlPSJAKmFuZHJvaWQ6c3R5bGUvVGV4dEFwcGVhcmFuY2UuU3RhdHVzQmFyLlRpY2tlciIKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6c2luZ2xlTGluZT0idHJ1ZSIKKyAgICAgICAgICAgICAgICAgICAgLz4KKyAgICAgICAgICAgICAgICA8VGV4dFZpZXcKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0QXBwZWFyYW5jZT0iQCphbmRyb2lkOnN0eWxlL1RleHRBcHBlYXJhbmNlLlN0YXR1c0Jhci5UaWNrZXIiCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnNpbmdsZUxpbmU9InRydWUiCisgICAgICAgICAgICAgICAgICAgIC8+CisgICAgICAgICAgICA8L2NvbS5hbmRyb2lkLnN5c3RlbXVpLnN0YXR1c2Jhci5UaWNrZXJWaWV3PgorICAgICAgICA8L0xpbmVhckxheW91dD4KKworICAgICAgICA8aW5jbHVkZSBsYXlvdXQ9IkBsYXlvdXQvc3RhdHVzX2Jhcl9jZW50ZXIiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iMjU2ZGlwIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJtYXRjaF9wYXJlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9jZW50ZXJJblBhcmVudD0idHJ1ZSIKKyAgICAgICAgICAgIC8+CisKKyAgICAgICAgPGNvbS5hbmRyb2lkLnN5c3RlbXVpLnN0YXR1c2Jhci5LZXlCdXR0b25WaWV3IGFuZHJvaWQ6aWQ9IkAraWQvbWVudSIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3RvTGVmdE9mPSJAK2lkL3JlY2VudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6c3JjPSJAZHJhd2FibGUvaWNfc3lzYmFyX21lbnUiCisgICAgICAgICAgICBhbmRyb2lkOmJhY2tncm91bmQ9IkBkcmF3YWJsZS9pY19zeXNiYXJfaWNvbl9iZyIKKyAgICAgICAgICAgIGFuZHJvaWQ6cGFkZGluZ0xlZnQ9IjRkaXAiCisgICAgICAgICAgICBhbmRyb2lkOnBhZGRpbmdSaWdodD0iNGRpcCIKKyAgICAgICAgICAgIHN5c3RlbXVpOmtleUNvZGU9IjgyIgorICAgICAgICAgICAgLz4KKyAgICAgICAgPEltYWdlQnV0dG9uIGFuZHJvaWQ6aWQ9IkAraWQvcmVjZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0ibWF0Y2hfcGFyZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfdG9MZWZ0T2Y9IkAraWQvaG9tZSIKKyAgICAgICAgICAgIGFuZHJvaWQ6c3JjPSJAZHJhd2FibGUvaWNfc3lzYmFyX3JlY2VudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6YmFja2dyb3VuZD0iQGRyYXdhYmxlL2ljX3N5c2Jhcl9pY29uX2JnIgorICAgICAgICAgICAgYW5kcm9pZDpwYWRkaW5nTGVmdD0iNGRpcCIKKyAgICAgICAgICAgIGFuZHJvaWQ6cGFkZGluZ1JpZ2h0PSI0ZGlwIgorICAgICAgICAgICAgYW5kcm9pZDpvbkNsaWNrPSJyZWNlbnRCdXR0b25DbGlja2VkIgorICAgICAgICAgICAgLz4KKyAgICAgICAgPGNvbS5hbmRyb2lkLnN5c3RlbXVpLnN0YXR1c2Jhci5LZXlCdXR0b25WaWV3IGFuZHJvaWQ6aWQ9IkAraWQvaG9tZSIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3RvTGVmdE9mPSJAK2lkL2JhY2siCisgICAgICAgICAgICBhbmRyb2lkOnBhZGRpbmdMZWZ0PSI0ZGlwIgorICAgICAgICAgICAgYW5kcm9pZDpwYWRkaW5nUmlnaHQ9IjRkaXAiCisgICAgICAgICAgICBhbmRyb2lkOnNyYz0iQGRyYXdhYmxlL2ljX3N5c2Jhcl9ob21lIgorICAgICAgICAgICAgYW5kcm9pZDpiYWNrZ3JvdW5kPSJAZHJhd2FibGUvaWNfc3lzYmFyX2ljb25fYmciCisgICAgICAgICAgICBzeXN0ZW11aTprZXlDb2RlPSIzIgorICAgICAgICAgICAgLz4KKyAgICAgICAgPGNvbS5hbmRyb2lkLnN5c3RlbXVpLnN0YXR1c2Jhci5LZXlCdXR0b25WaWV3IGFuZHJvaWQ6aWQ9IkAraWQvYmFjayIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2FsaWduUGFyZW50UmlnaHQ9InRydWUiCisgICAgICAgICAgICBhbmRyb2lkOnBhZGRpbmdMZWZ0PSI0ZGlwIgorICAgICAgICAgICAgYW5kcm9pZDpwYWRkaW5nUmlnaHQ9IjRkaXAiCisgICAgICAgICAgICBhbmRyb2lkOnNyYz0iQGRyYXdhYmxlL2ljX3N5c2Jhcl9iYWNrIgorICAgICAgICAgICAgYW5kcm9pZDpiYWNrZ3JvdW5kPSJAZHJhd2FibGUvaWNfc3lzYmFyX2ljb25fYmciCisgICAgICAgICAgICBzeXN0ZW11aTprZXlDb2RlPSI0IgorICAgICAgICAgICAgLz4KKyAgICA8L1JlbGF0aXZlTGF5b3V0PgorCisgICAgPCEtLSBJdCdzIGN1cnRhaW5zIGZvciB5b3UuIC0tPgorICAgIDxJbWFnZVZpZXcKKyAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9saWdodHNfb3V0IgorICAgICAgICBhbmRyb2lkOnNyYz0iQGRyYXdhYmxlL2ljX3N5c2Jhcl9saWdodHNvdXQiCisgICAgICAgIGFuZHJvaWQ6Z3Jhdml0eT0iY2VudGVyIgorICAgICAgICBhbmRyb2lkOmJhY2tncm91bmQ9IiNGRjAwMDAwMCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJtYXRjaF9wYXJlbnQiCisgICAgICAgIGFuZHJvaWQ6dmlzaWJpbGl0eT0iaW52aXNpYmxlIgorICAgICAgICBhbmRyb2lkOmNsaWNrYWJsZT0idHJ1ZSIKKyAgICAgICAgLz4KKzwvRnJhbWVMYXlvdXQ+CisKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9sYXlvdXQteGxhcmdlL3N0YXR1c19iYXJfY2VudGVyLnhtbCBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9sYXlvdXQteGxhcmdlL3N0YXR1c19iYXJfY2VudGVyLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZDc0NjcyCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2xheW91dC14bGFyZ2Uvc3RhdHVzX2Jhcl9jZW50ZXIueG1sCkBAIC0wLDAgKzEsNzMgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzwhLS0gQ2VudGVyIG9mIHN0YXR1cyBiYXI6IFN5c3RlbSBpbmZvIGRpc3BsYXksIHN5c3RlbSBpbmZvIHBhbmVsIHRyaWdnZXIgLS0+Cis8UmVsYXRpdmVMYXlvdXQgYW5kcm9pZDppZD0iQCtpZC9zeXN0ZW1JbmZvIgorICAgIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICB4bWxuczpzeXN0ZW11aT0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9jb20uYW5kcm9pZC5zeXN0ZW11aSIKKyAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0ibWF0Y2hfcGFyZW50IgorICAgIGFuZHJvaWQ6bGF5b3V0X2NlbnRlckluUGFyZW50PSJ0cnVlIgorICAgIGFuZHJvaWQ6Y2xpY2thYmxlPSJ0cnVlIgorICAgIGFuZHJvaWQ6b25DbGljaz0ic3lzdGVtSW5mb0NsaWNrZWQiCisgICAgPgorICAgIDxjb20uYW5kcm9pZC5zeXN0ZW11aS5zdGF0dXNiYXIuQ2xvY2sKKyAgICAgICAgc3R5bGU9IkAqYW5kcm9pZDpzdHlsZS9UZXh0QXBwZWFyYW5jZS5TdGF0dXNCYXIuSWNvbiIKKyAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9jbG9jayIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IjY0ZGlwIgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IjQ4ZGlwIgorICAgICAgICBhbmRyb2lkOmxheW91dF9jZW50ZXJJblBhcmVudD0idHJ1ZSIKKyAgICAgICAgYW5kcm9pZDpzaW5nbGVMaW5lPSJ0cnVlIgorICAgICAgICBhbmRyb2lkOmdyYXZpdHk9ImNlbnRlciIKKyAgICAgICAgYW5kcm9pZDp0ZXh0U2l6ZT0iMTZzcCIKKyAgICAgICAgYW5kcm9pZDp0ZXh0U3R5bGU9ImJvbGQiCisgICAgICAgIGFuZHJvaWQ6cGFkZGluZz0iMmRpcCIKKyAgICAgICAgLz4KKyAgICA8SW1hZ2VWaWV3CisgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvYmF0dGVyeSIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IjY0ZGlwIgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IjE2ZGlwIgorICAgICAgICBhbmRyb2lkOmxheW91dF90b0xlZnRPZj0iQGlkL2Nsb2NrIgorICAgICAgICBhbmRyb2lkOmxheW91dF9jZW50ZXJJblBhcmVudD0idHJ1ZSIKKyAgICAgICAgYW5kcm9pZDpiYWNrZ3JvdW5kPSJAZHJhd2FibGUvc3lzYmFyX21pbmltZXRlcl9iZyIgCisgICAgICAgIC8+CisgICAgPEltYWdlVmlldworICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL3NpZ25hbCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IjY0ZGlwIgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IjE2ZGlwIgorICAgICAgICBhbmRyb2lkOmxheW91dF90b1JpZ2h0T2Y9IkBpZC9jbG9jayIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfY2VudGVySW5QYXJlbnQ9InRydWUiCisgICAgICAgIGFuZHJvaWQ6YmFja2dyb3VuZD0iQGRyYXdhYmxlL3N5c2Jhcl9taW5pbWV0ZXJfYmciIAorICAgICAgICAvPgorICAgIDxJbWFnZVZpZXcKKyAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9iYXR0ZXJ5X2ljb24iCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iMzBkaXAiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSIzMGRpcCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfdG9MZWZ0T2Y9IkBpZC9iYXR0ZXJ5IgorICAgICAgICBhbmRyb2lkOmxheW91dF9jZW50ZXJJblBhcmVudD0idHJ1ZSIKKyAgICAgICAgYW5kcm9pZDpzcmM9IkBkcmF3YWJsZS9pY19zeXNiYXJfYmF0dGVyeV9taW5pIgorICAgICAgICAvPgorICAgIDxJbWFnZVZpZXcKKyAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9zaWduYWxfaWNvbiIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSIzMGRpcCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IjMwZGlwIgorICAgICAgICBhbmRyb2lkOmxheW91dF90b1JpZ2h0T2Y9IkBpZC9zaWduYWwiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2NlbnRlckluUGFyZW50PSJ0cnVlIgorICAgICAgICBhbmRyb2lkOnNyYz0iQGRyYXdhYmxlL2ljX3N5c2Jhcl93aWZpX21pbmkiCisgICAgICAgIC8+Cis8L1JlbGF0aXZlTGF5b3V0PgorCisKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9sYXlvdXQteGxhcmdlL3N0YXR1c19iYXJfbGF0ZXN0X2V2ZW50LnhtbCBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9sYXlvdXQteGxhcmdlL3N0YXR1c19iYXJfbGF0ZXN0X2V2ZW50LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYTQ5MmQwCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2xheW91dC14bGFyZ2Uvc3RhdHVzX2Jhcl9sYXRlc3RfZXZlbnQueG1sCkBAIC0wLDAgKzEsMzYgQEAKKzxSZWxhdGl2ZUxheW91dCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IjY1c3AiCisgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0idmVydGljYWwiCisgICAgYW5kcm9pZDpiYWNrZ3JvdW5kPSJAYW5kcm9pZDpkcmF3YWJsZS9zdGF0dXNfYmFyX2l0ZW1fYmFja2dyb3VuZCIKKyAgICA+CisKKyAgICA8SW1hZ2VCdXR0b24KKyAgICAgICAgYW5kcm9pZDppZD0iQCtpZC92ZXRvIgorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfY2VudGVyVmVydGljYWw9InRydWUiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2FsaWduUGFyZW50UmlnaHQ9InRydWUiCisgICAgICAgIGFuZHJvaWQ6c3JjPSJAZHJhd2FibGUvc3RhdHVzX2Jhcl92ZXRvIgorICAgICAgICBhbmRyb2lkOmJhY2tncm91bmQ9IkBudWxsIgorICAgICAgICBhbmRyb2lkOnBhZGRpbmc9IjJkaXAiCisgICAgICAgIC8+CisKKyAgICA8Y29tLmFuZHJvaWQuc3lzdGVtdWkuc3RhdHVzYmFyLkxhdGVzdEl0ZW1WaWV3IGFuZHJvaWQ6aWQ9IkAraWQvY29udGVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfYWxpZ25QYXJlbnRUb3A9InRydWUiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3RvTGVmdE9mPSJAaWQvdmV0byIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSI2NHNwIgorICAgICAgICBhbmRyb2lkOmZvY3VzYWJsZT0idHJ1ZSIKKyAgICAgICAgYW5kcm9pZDpjbGlja2FibGU9InRydWUiCisgICAgICAgIGFuZHJvaWQ6cGFkZGluZ1JpZ2h0PSI2c3AiCisgICAgICAgIC8+CisKKyAgICA8VmlldworICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IjFzcCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfYWxpZ25QYXJlbnRCb3R0b209InRydWUiCisgICAgICAgIGFuZHJvaWQ6YmFja2dyb3VuZD0iQGFuZHJvaWQ6ZHJhd2FibGUvZGl2aWRlcl9ob3Jpem9udGFsX2RhcmsiCisgICAgICAgIC8+CisKKzwvUmVsYXRpdmVMYXlvdXQ+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvbGF5b3V0LXhsYXJnZS9zeXNiYXJfcGFuZWxfbm90aWZpY2F0aW9ucy54bWwgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvbGF5b3V0LXhsYXJnZS9zeXNiYXJfcGFuZWxfbm90aWZpY2F0aW9ucy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzQ4OWVlYwotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9sYXlvdXQteGxhcmdlL3N5c2Jhcl9wYW5lbF9ub3RpZmljYXRpb25zLnhtbApAQCAtMCwwICsxLDY4IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLQorLyogYXBwcy9jb21tb24vYXNzZXRzL2RlZmF1bHQvZGVmYXVsdC9za2lucy9TdGF0dXNCYXIueG1sCisqKgorKiogQ29weXJpZ2h0IDIwMDYsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoqCisqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgCisqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIAorKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0IAorKioKKyoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgCisqKgorKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZSAKKyoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIAorKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCAKKyoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKy0tPgorCis8IS0tICAgIGFuZHJvaWQ6YmFja2dyb3VuZD0iQGRyYXdhYmxlL3N0YXR1c19iYXJfY2xvc2VkX2RlZmF1bHRfYmFja2dyb3VuZCIgLS0+Cis8TGluZWFyTGF5b3V0CisgICAgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgYW5kcm9pZDpiYWNrZ3JvdW5kPSIjRkYwMDAwMDAiCisgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0idmVydGljYWwiCisgICAgPgorCisgICAgPFRleHRWaWV3IGFuZHJvaWQ6aWQ9IkAraWQvY2xlYXJfYWxsX2J1dHRvbiIKKyAgICAgICAgc3R5bGU9Ij9hbmRyb2lkOmF0dHIvdGV4dEFwcGVhcmFuY2UiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9ncmF2aXR5PSJyaWdodHxjZW50ZXJfdmVydGljYWwiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpblRvcD0iMmRpcCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luQm90dG9tPSIxZGlwIgorICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5SaWdodD0iMTBkaXAiCisgICAgICAgIGFuZHJvaWQ6cGFkZGluZz0iNmRpcCIKKyAgICAgICAgYW5kcm9pZDp0ZXh0U2l6ZT0iMTRzcCIKKyAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL3N0YXR1c19iYXJfY2xlYXJfYWxsX2J1dHRvbiIKKyAgICAgICAgLz4KKworICAgIDxWaWV3CisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iMXNwIgorICAgICAgICBhbmRyb2lkOmJhY2tncm91bmQ9IkBhbmRyb2lkOmRyYXdhYmxlL2RpdmlkZXJfaG9yaXpvbnRhbF9kYXJrIgorICAgICAgICAvPgorCisgICAgPFNjcm9sbFZpZXcKKyAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9ub3RpZmljYXRpb25TY3JvbGxlciIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgID4KKyAgICAgICAgPExpbmVhckxheW91dCAKKyAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6Z3Jhdml0eT0iY2VudGVyX2hvcml6b250YWx8Ym90dG9tIgorICAgICAgICAgICAgYW5kcm9pZDphbmltYXRpb25DYWNoZT0iZmFsc2UiCisgICAgICAgICAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJ2ZXJ0aWNhbCIKKyAgICAgICAgICAgIGFuZHJvaWQ6YmFja2dyb3VuZD0iQGRyYXdhYmxlL3N0YXR1c19iYXJfYmFja2dyb3VuZCIKKyAgICAgICAgICAgIGFuZHJvaWQ6Y2xpY2thYmxlPSJ0cnVlIgorICAgICAgICAgICAgYW5kcm9pZDpmb2N1c2FibGU9InRydWUiCisgICAgICAgICAgICBhbmRyb2lkOmRlc2NlbmRhbnRGb2N1c2FiaWxpdHk9ImFmdGVyRGVzY2VuZGFudHMiCisgICAgICAgICAgICA+CisgICAgICAgIDwvTGluZWFyTGF5b3V0PgorICAgIDwvU2Nyb2xsVmlldz4KKzwvTGluZWFyTGF5b3V0PgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2xheW91dC14bGFyZ2Uvc3lzYmFyX3BhbmVsX3N5c3RlbS54bWwgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvbGF5b3V0LXhsYXJnZS9zeXNiYXJfcGFuZWxfc3lzdGVtLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZTQ2OWY3Ci0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2xheW91dC14bGFyZ2Uvc3lzYmFyX3BhbmVsX3N5c3RlbS54bWwKQEAgLTAsMCArMSwyMDggQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tCisvKiBhcHBzL2NvbW1vbi9hc3NldHMvZGVmYXVsdC9kZWZhdWx0L3NraW5zL1N0YXR1c0Jhci54bWwKKyoqCisqKiBDb3B5cmlnaHQgMjAxMCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKioKKyoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyAKKyoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gCisqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgCisqKgorKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAKKyoqCisqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlIAorKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgCisqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIAorKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworLS0+CisKKzxjb20uYW5kcm9pZC5zeXN0ZW11aS5zdGF0dXNiYXIudGFibGV0LlN5c3RlbVBhbmVsCisgICAgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgYW5kcm9pZDpiYWNrZ3JvdW5kPSJAZHJhd2FibGUvc3lzYmFyX3BhbmVsX2JnIgorICAgIGFuZHJvaWQ6b3JpZW50YXRpb249InZlcnRpY2FsIgorICAgIGFuZHJvaWQ6cGFkZGluZ0xlZnQ9IjcwZGlwIgorICAgIGFuZHJvaWQ6cGFkZGluZ1JpZ2h0PSIxMjBkaXAiCisgICAgPgorCisgICAgPCEtLSB0b3Agcm93OiBxdWljayBzZXR0aW5ncyBidXR0b25zIC0tPgorICAgIDxMaW5lYXJMYXlvdXQKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSI2NGRpcCIKKyAgICAgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0iaG9yaXpvbnRhbCIKKyAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJjZW50ZXIiCisgICAgICAgID4KKyAgICAgICAgPEltYWdlQnV0dG9uIGFuZHJvaWQ6aWQ9IkAraWQvYnJpZ2h0bmVzcyIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSI5MGRpcCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iNjRkaXAiCisgICAgICAgICAgICBhbmRyb2lkOnNyYz0iQGRyYXdhYmxlL2ljX3N5c2Jhcl9icmlnaHRuZXNzIgorICAgICAgICAgICAgYW5kcm9pZDpiYWNrZ3JvdW5kPSJAZHJhd2FibGUvc3lzYmFyX3RvZ2dsZV9iZ19vZmYiCisgICAgICAgICAgICAvPgorICAgICAgICA8SW1hZ2VCdXR0b24gYW5kcm9pZDppZD0iQCtpZC9zb3VuZCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSI5MGRpcCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iNjRkaXAiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5MZWZ0PSI4ZGlwIgorICAgICAgICAgICAgYW5kcm9pZDpzcmM9IkBkcmF3YWJsZS9pY19zeXNiYXJfc291bmRfb24iCisgICAgICAgICAgICBhbmRyb2lkOmJhY2tncm91bmQ9IkBkcmF3YWJsZS9zeXNiYXJfdG9nZ2xlX2JnX29mZiIKKyAgICAgICAgICAgIC8+CisgICAgICAgIDxJbWFnZUJ1dHRvbiBhbmRyb2lkOmlkPSJAK2lkL29yaWVudGF0aW9uIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IjkwZGlwIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSI2NGRpcCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpbkxlZnQ9IjhkaXAiCisgICAgICAgICAgICBhbmRyb2lkOnNyYz0iQGRyYXdhYmxlL2ljX3N5c2Jhcl9yb3RhdGVfb24iCisgICAgICAgICAgICBhbmRyb2lkOmJhY2tncm91bmQ9IkBkcmF3YWJsZS9zeXNiYXJfdG9nZ2xlX2JnX29mZiIKKyAgICAgICAgICAgIC8+CisgICAgICAgIDxJbWFnZUJ1dHRvbiBhbmRyb2lkOmlkPSJAK2lkL2FpcnBsYW5lIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IjkwZGlwIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSI2NGRpcCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpbkxlZnQ9IjhkaXAiCisgICAgICAgICAgICBhbmRyb2lkOnNyYz0iQGRyYXdhYmxlL2ljX3N5c2Jhcl9haXJwbGFuZV9vbiIKKyAgICAgICAgICAgIGFuZHJvaWQ6YmFja2dyb3VuZD0iQGRyYXdhYmxlL3N5c2Jhcl90b2dnbGVfYmdfb2ZmIgorICAgICAgICAgICAgLz4KKyAgICAgICAgPEltYWdlQnV0dG9uIGFuZHJvaWQ6aWQ9IkAraWQvZ3BzIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IjkwZGlwIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSI2NGRpcCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpbkxlZnQ9IjhkaXAiCisgICAgICAgICAgICBhbmRyb2lkOnNyYz0iQGRyYXdhYmxlL2ljX3N5c2Jhcl9ncHNfb24iCisgICAgICAgICAgICBhbmRyb2lkOmJhY2tncm91bmQ9IkBkcmF3YWJsZS9zeXNiYXJfdG9nZ2xlX2JnX29mZiIKKyAgICAgICAgICAgIC8+CisgICAgICAgIDxJbWFnZUJ1dHRvbiBhbmRyb2lkOmlkPSJAK2lkL2JsdWV0b290aCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSI5MGRpcCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iNjRkaXAiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5MZWZ0PSI4ZGlwIgorICAgICAgICAgICAgYW5kcm9pZDpzcmM9IkBkcmF3YWJsZS9pY19zeXNiYXJfYmx1ZXRvb3RoX29uIgorICAgICAgICAgICAgYW5kcm9pZDpiYWNrZ3JvdW5kPSJAZHJhd2FibGUvc3lzYmFyX3RvZ2dsZV9iZ19vZmYiCisgICAgICAgICAgICAvPgorICAgIDwvTGluZWFyTGF5b3V0PgorCisgICAgPCEtLSBtYWluIHJvdzogbWV0ZXJzLCBjbG9jayAtLT4KKyAgICA8UmVsYXRpdmVMYXlvdXQKKyAgICAgICAgYW5kcm9pZDpwYWRkaW5nPSI4ZGlwIgorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IjE5MmRpcCIKKyAgICAgICAgPgorICAgICAgICA8UmVsYXRpdmVMYXlvdXQKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSIyNTZkaXAiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IjE5MmRpcCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2FsaWduUGFyZW50TGVmdD0idHJ1ZSIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpbkxlZnQ9IjQ4ZGlwIgorICAgICAgICAgICAgPgorICAgICAgICAgICAgPEltYWdlVmlldyBhbmRyb2lkOmlkPSJAK2lkL2JhdHRlcnlfbWV0ZXIiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IjI1NmRpcCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9hbGlnblBhcmVudEJvdHRvbT0idHJ1ZSIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOnNjYWxlVHlwZT0iY2VudGVyQ3JvcCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOnNyYz0iQGRyYXdhYmxlL3N5c2Jhcl9iYXR0ZXJ5IgorICAgICAgICAgICAgICAgIC8+CisgICAgICAgICAgICA8VGV4dFZpZXcgYW5kcm9pZDppZD0iQCtpZC9iYXR0ZXJ5X2luZm8iCisgICAgICAgICAgICAgICAgc3R5bGU9IkBzdHlsZS9UZXh0QXBwZWFyYW5jZS5TdGF0dXNCYXIuU3lzdGVtUGFuZWwiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IjI0ZGlwIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6Z3Jhdml0eT0iY2VudGVyIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2Fib3ZlPSJAaWQvYmF0dGVyeV9tZXRlciIKKyAgICAgICAgICAgICAgICAvPgorICAgICAgICA8L1JlbGF0aXZlTGF5b3V0PgorCisgICAgICAgIDxjb20uYW5kcm9pZC5zeXN0ZW11aS5zdGF0dXNiYXIuQ2xvY2sKKyAgICAgICAgICAgIHN0eWxlPSJAc3R5bGUvVGV4dEFwcGVhcmFuY2UuU3RhdHVzQmFyLlN5c3RlbVBhbmVsIgorICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9jbG9jayIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6c2luZ2xlTGluZT0idHJ1ZSIKKyAgICAgICAgICAgIGFuZHJvaWQ6dGV4dFNpemU9IjUwc3AiCisgICAgICAgICAgICBhbmRyb2lkOnRleHRTdHlsZT0ibm9ybWFsIgorICAgICAgICAgICAgYW5kcm9pZDp0ZXh0Q29sb3I9IiNGRkZGRkZGRiIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2NlbnRlckhvcml6b250YWw9InRydWUiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9hbGlnblBhcmVudEJvdHRvbT0idHJ1ZSIKKyAgICAgICAgICAgIC8+CisKKyAgICAgICAgPFJlbGF0aXZlTGF5b3V0CisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iMjU2ZGlwIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSIxOTJkaXAiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9hbGlnblBhcmVudFJpZ2h0PSJ0cnVlIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luUmlnaHQ9IjQ4ZGlwIgorICAgICAgICAgICAgPgorICAgICAgICAgICAgPEltYWdlVmlldyBhbmRyb2lkOmlkPSJAK2lkL3NpZ25hbF9tZXRlciIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iMjU2ZGlwIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2FsaWduUGFyZW50Qm90dG9tPSJ0cnVlIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6c2NhbGVUeXBlPSJjZW50ZXJDcm9wIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6c3JjPSJAZHJhd2FibGUvc3lzYmFyX3NpZ25hbCIKKyAgICAgICAgICAgICAgICAvPgorCisgICAgICAgICAgICA8VGV4dFZpZXcgYW5kcm9pZDppZD0iQCtpZC9zaWduYWxfaW5mbyIKKyAgICAgICAgICAgICAgICBzdHlsZT0iQHN0eWxlL1RleHRBcHBlYXJhbmNlLlN0YXR1c0Jhci5TeXN0ZW1QYW5lbCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iMjRkaXAiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJjZW50ZXIiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfYWJvdmU9IkBpZC9zaWduYWxfbWV0ZXIiCisgICAgICAgICAgICAgICAgLz4KKyAgICAgICAgPC9SZWxhdGl2ZUxheW91dD4KKworICAgICAgICA8SW1hZ2VWaWV3CisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9hbGlnblBhcmVudExlZnQ9InRydWUiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9hbGlnblBhcmVudEJvdHRvbT0idHJ1ZSIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpbkJvdHRvbT0iOGRpcCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpbkxlZnQ9IjhkaXAiCisgICAgICAgICAgICBhbmRyb2lkOnNyYz0iQGRyYXdhYmxlL2ljX3N5c2Jhcl9iYXR0ZXJ5X29uIgorICAgICAgICAgICAgLz4KKyAgICAgICAgPEltYWdlVmlldworICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfYWxpZ25QYXJlbnRSaWdodD0idHJ1ZSIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2FsaWduUGFyZW50Qm90dG9tPSJ0cnVlIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luQm90dG9tPSI4ZGlwIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luUmlnaHQ9IjhkaXAiCisgICAgICAgICAgICBhbmRyb2lkOnNyYz0iQGRyYXdhYmxlL2ljX3N5c2Jhcl93aWZpX29uIgorICAgICAgICAgICAgLz4KKyAgICA8L1JlbGF0aXZlTGF5b3V0PgorCisgICAgPCEtLSBib3R0b20gcm93OiB0cmFuc2llbnQgaW5kaWNhdG9ycywgc2V0dGluZ3MgYnV0dG9uIC0tPgorICAgIDxWaWV3CisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iMXNwIgorICAgICAgICBhbmRyb2lkOmJhY2tncm91bmQ9IkBhbmRyb2lkOmRyYXdhYmxlL2RpdmlkZXJfaG9yaXpvbnRhbF9kYXJrIgorICAgICAgICAvPgorICAgIDxSZWxhdGl2ZUxheW91dAorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IjQ4ZGlwIgorICAgICAgICA+CisgICAgICAgIDxMaW5lYXJMYXlvdXQKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2FsaWduUGFyZW50TGVmdD0idHJ1ZSIKKyAgICAgICAgICAgIGFuZHJvaWQ6b3JpZW50YXRpb249Imhvcml6b250YWwiCisgICAgICAgICAgICA+CisgICAgICAgICAgICA8IS0tIFRPRE86IGFsYXJtIC0tPgorICAgICAgICAgICAgPCEtLSBUT0RPOiBzeW5jIC0tPgorICAgICAgICAgICAgPFRleHRWaWV3IGFuZHJvaWQ6aWQ9IkAraWQvZGF0ZSIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgIC8+CisgICAgICAgIDwvTGluZWFyTGF5b3V0PgorCisgICAgICAgIDxUZXh0VmlldyBhbmRyb2lkOmlkPSJAK2lkL3NldHRpbmdzX2J1dHRvbiIKKyAgICAgICAgICAgIHN0eWxlPSJAc3R5bGUvVGV4dEFwcGVhcmFuY2UuU3RhdHVzQmFyLlRleHRCdXR0b24iCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9hbGlnblBhcmVudFJpZ2h0PSJ0cnVlIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfY2VudGVyVmVydGljYWw9InRydWUiCisgICAgICAgICAgICBhbmRyb2lkOnBhZGRpbmdSaWdodD0iMzJkaXAiCisgICAgICAgICAgICBhbmRyb2lkOnBhZGRpbmdMZWZ0PSIzMmRpcCIKKyAgICAgICAgICAgIGFuZHJvaWQ6dGV4dFNpemU9IjIwc3AiCisgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvc3lzdGVtX3BhbmVsX3NldHRpbmdzX2J1dHRvbiIKKyAgICAgICAgICAgIC8+CisgICAgICAgIDxWaWV3CisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSIxc3AiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF90b0xlZnRPZj0iQGlkL3NldHRpbmdzX2J1dHRvbiIKKyAgICAgICAgICAgIGFuZHJvaWQ6YmFja2dyb3VuZD0iQCphbmRyb2lkOmRyYXdhYmxlL2RpdmlkZXJfdmVydGljYWxfZGFyayIKKyAgICAgICAgICAgIC8+CisKKyAgICA8L1JlbGF0aXZlTGF5b3V0PgorPC9jb20uYW5kcm9pZC5zeXN0ZW11aS5zdGF0dXNiYXIudGFibGV0LlN5c3RlbVBhbmVsPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2xheW91dC9pbnRydWRlcl9hbGVydC54bWwgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvbGF5b3V0L2ludHJ1ZGVyX2FsZXJ0LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYTRhNzc0Ci0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2xheW91dC9pbnRydWRlcl9hbGVydC54bWwKQEAgLTAsMCArMSw1OCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0KKy8qIGFwcHMvY29tbW9uL2Fzc2V0cy9kZWZhdWx0L2RlZmF1bHQvc2tpbnMvU3RhdHVzQmFyLnhtbAorKioKKyoqIENvcHlyaWdodCAyMDA2LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqKgorKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IAorKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAKKyoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAKKyoqCisqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIAorKioKKyoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUgCisqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCAKKyoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgCisqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCistLT4KKworPCEtLSAgICBhbmRyb2lkOmJhY2tncm91bmQ9IkBkcmF3YWJsZS9zdGF0dXNfYmFyX2Nsb3NlZF9kZWZhdWx0X2JhY2tncm91bmQiIC0tPgorPEZyYW1lTGF5b3V0CisgICAgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iMzJkaXAiCisgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICBhbmRyb2lkOnBhZGRpbmdMZWZ0PSI4ZGlwIgorICAgIGFuZHJvaWQ6cGFkZGluZ1JpZ2h0PSI4ZGlwIgorICAgID4KKyAgICAgICAgCisgICAgPExpbmVhckxheW91dCAKKyAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9pbnRydWRlcl9hbGVydF9jb250ZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJjZW50ZXIiCisgICAgICAgIGFuZHJvaWQ6YW5pbWF0aW9uQ2FjaGU9ImZhbHNlIgorICAgICAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJob3Jpem9udGFsIgorICAgICAgICBhbmRyb2lkOmJhY2tncm91bmQ9IkBkcmF3YWJsZS9hbGVydF9iYXJfYmFja2dyb3VuZCIKKyAgICAgICAgYW5kcm9pZDpjbGlja2FibGU9InRydWUiCisgICAgICAgIGFuZHJvaWQ6Zm9jdXNhYmxlPSJ0cnVlIgorICAgICAgICBhbmRyb2lkOmRlc2NlbmRhbnRGb2N1c2FiaWxpdHk9ImFmdGVyRGVzY2VuZGFudHMiCisgICAgICAgID4KKworICAgICAgICA8SW1hZ2VWaWV3CisgICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL2FsZXJ0SWNvbiIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSIyNWRpcCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iMjVkaXAiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5MZWZ0PSI2ZGlwIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luUmlnaHQ9IjhkaXAiCisgICAgICAgICAgICAvPgorICAgICAgICA8VGV4dFZpZXcKKyAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvYWxlcnRUZXh0IgorICAgICAgICAgICAgYW5kcm9pZDp0ZXh0QXBwZWFyYW5jZT0iQHN0eWxlL1RleHRBcHBlYXJhbmNlLlN0YXR1c0Jhci5JbnRydWRlckFsZXJ0IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDpzaW5nbGVMaW5lPSJ0cnVlIgorICAgICAgICAgICAgLz4KKyAgICA8L0xpbmVhckxheW91dD4KKzwvRnJhbWVMYXlvdXQ+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvbGF5b3V0L3JlY2VudF9hcHBzX2FjdGl2aXR5LnhtbCBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9sYXlvdXQvcmVjZW50X2FwcHNfYWN0aXZpdHkueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVjNjYxZTgKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvbGF5b3V0L3JlY2VudF9hcHBzX2FjdGl2aXR5LnhtbApAQCAtMCwwICsxLDU1IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLQorLyoKKyoqIENvcHlyaWdodCAyMDA4LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqKgorKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoqCisqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqKgorKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworLS0+CisKKzxMaW5lYXJMYXlvdXQKKyAgICB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9Im1hdGNoX3BhcmVudCIKKyAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJ2ZXJ0aWNhbCI+CisKKyAgICA8IS0tIFRpdGxlIC0tPgorICAgIDxUZXh0VmlldworICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJjZW50ZXIiCisgICAgICAgIGFuZHJvaWQ6dGV4dEFwcGVhcmFuY2U9Ij9hbmRyb2lkOmF0dHIvdGV4dEFwcGVhcmFuY2VTbWFsbCIKKyAgICAgICAgYW5kcm9pZDp0ZXh0Q29sb3I9IiM4MEZGRkZGRiIKKyAgICAgICAgYW5kcm9pZDp0ZXh0U3R5bGU9ImJvbGQiCisgICAgICAgIGFuZHJvaWQ6c2luZ2xlTGluZT0idHJ1ZSIKKyAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL3JlY2VudF90YXNrc190aXRsZSIKKyAgICAgICAgYW5kcm9pZDp2aXNpYmlsaXR5PSJnb25lIi8+CisKKyAgICA8IS0tIFRoaXMgaXMgb25seSBpbnRlbmRlZCB0byBiZSB2aXNpYmxlIHdoZW4gY2Fyb3VzZWwgaXMgaW52aXNpYmxlIC0tPgorICAgIDxUZXh0VmlldworICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL25vX2FwcGxpY2F0aW9uc19tZXNzYWdlIgorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfZ3Jhdml0eT0iY2VudGVyIgorICAgICAgICBhbmRyb2lkOnRleHRBcHBlYXJhbmNlPSI/YW5kcm9pZDphdHRyL3RleHRBcHBlYXJhbmNlU21hbGwiCisgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy9yZWNlbnRfdGFza3NfZW1wdHkiCisgICAgICAgIGFuZHJvaWQ6dmlzaWJpbGl0eT0iZ29uZSIvPgorCisgICAgPGNvbS5hbmRyb2lkLnN5c3RlbXVpLnJlY2VudC5SZWNlbnRBcHBsaWNhdGlvbnNDYXJvdXNlbFZpZXcKKyAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9jYXJvdXNlbCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSIwZGlwIgorICAgICAgICBhbmRyb2lkOmxheW91dF93ZWlnaHQ9IjEiPgorICAgIDwvY29tLmFuZHJvaWQuc3lzdGVtdWkucmVjZW50LlJlY2VudEFwcGxpY2F0aW9uc0Nhcm91c2VsVmlldz4KKworPC9MaW5lYXJMYXlvdXQ+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvbGF5b3V0L3N0YXR1c19iYXIueG1sIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2xheW91dC9zdGF0dXNfYmFyLnhtbAppbmRleCA0MjNjZjVhLi4yZjFiMzZlOCAxMDA2NDQKLS0tIGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2xheW91dC9zdGF0dXNfYmFyLnhtbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvbGF5b3V0L3N0YXR1c19iYXIueG1sCkBAIC0yMSw2ICsyMSw3IEBACiA8IS0tICAgIGFuZHJvaWQ6YmFja2dyb3VuZD0iQGRyYXdhYmxlL3N0YXR1c19iYXJfY2xvc2VkX2RlZmF1bHRfYmFja2dyb3VuZCIgLS0+CiA8Y29tLmFuZHJvaWQuc3lzdGVtdWkuc3RhdHVzYmFyLlN0YXR1c0JhclZpZXcKICAgICB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgeG1sbnM6c3lzdGVtdWk9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvY29tLmFuZHJvaWQuc3lzdGVtdWkiCiAgICAgYW5kcm9pZDpiYWNrZ3JvdW5kPSJAZHJhd2FibGUvc3RhdHVzX2Jhcl9iYWNrZ3JvdW5kIgogICAgIGFuZHJvaWQ6b3JpZW50YXRpb249InZlcnRpY2FsIgogICAgIGFuZHJvaWQ6Zm9jdXNhYmxlPSJ0cnVlIgpAQCAtNTUsNiArNTYsOCBAQAogICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJtYXRjaF9wYXJlbnQiCiAgICAgICAgICAgICBhbmRyb2lkOnNpbmdsZUxpbmU9InRydWUiCiAgICAgICAgICAgICBhbmRyb2lkOnBhZGRpbmdSaWdodD0iNmRpcCIKKyAgICAgICAgICAgIGFuZHJvaWQ6dGV4dFNpemU9IjE2c3AiCisgICAgICAgICAgICBhbmRyb2lkOnRleHRTdHlsZT0iYm9sZCIKICAgICAgICAgICAgIGFuZHJvaWQ6Z3Jhdml0eT0iY2VudGVyX3ZlcnRpY2FsfGxlZnQiCiAgICAgICAgICAgICAvPgogICAgIDwvTGluZWFyTGF5b3V0PgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2xheW91dC9zdGF0dXNfYmFyX2xhdGVzdF9ldmVudC54bWwgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvbGF5b3V0L3N0YXR1c19iYXJfbGF0ZXN0X2V2ZW50LnhtbAppbmRleCA2NWM3MzFiLi44OGQ5NzM5IDEwMDY0NAotLS0gYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvbGF5b3V0L3N0YXR1c19iYXJfbGF0ZXN0X2V2ZW50LnhtbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvbGF5b3V0L3N0YXR1c19iYXJfbGF0ZXN0X2V2ZW50LnhtbApAQCAtMTYsOCArMTYsOCBAQAogCiAgICAgPFZpZXcKICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKLSAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgIGFuZHJvaWQ6YmFja2dyb3VuZD0iQGRyYXdhYmxlL2RpdmlkZXJfaG9yaXpvbnRhbF9kYXJrX29wYXF1ZSIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSIxc3AiCisgICAgICAgIGFuZHJvaWQ6YmFja2dyb3VuZD0iQGFuZHJvaWQ6ZHJhd2FibGUvZGl2aWRlcl9ob3Jpem9udGFsX2JyaWdodCIKICAgICAgICAgLz4KIAogPC9MaW5lYXJMYXlvdXQ+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvdmFsdWVzLXhsYXJnZS9jb2xvcnMueG1sIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL3ZhbHVlcy14bGFyZ2UvY29sb3JzLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNDE2MWMzCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL3ZhbHVlcy14bGFyZ2UvY29sb3JzLnhtbApAQCAtMCwwICsxLDUgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8cmVzb3VyY2VzPgorICAgIDxkcmF3YWJsZSBuYW1lPSJzdGF0dXNfYmFyX2JhY2tncm91bmQiPiMwMDAwMDA8L2RyYXdhYmxlPgorPC9yZXNvdXJjZXM+CisKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy92YWx1ZXMteGxhcmdlL2NvbmZpZy54bWwgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvdmFsdWVzLXhsYXJnZS9jb25maWcueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRjZjVkMThkMTEKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvdmFsdWVzLXhsYXJnZS9jb25maWcueG1sCkBAIC0wLDAgKzEsMjUgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tCisvKgorKiogQ29weXJpZ2h0IDIwMTAsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoqCisqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgCisqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIAorKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0IAorKioKKyoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgCisqKgorKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZSAKKyoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIAorKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCAKKyoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKy0tPgorCis8IS0tIFRoZXNlIHJlc291cmNlcyBhcmUgYXJvdW5kIGp1c3QgdG8gYWxsb3cgdGhlaXIgdmFsdWVzIHRvIGJlIGN1c3RvbWl6ZWQKKyAgICAgZm9yIGRpZmZlcmVudCBoYXJkd2FyZSBhbmQgcHJvZHVjdCBidWlsZHMuIC0tPgorPHJlc291cmNlcz4KKyAgICA8aW50ZWdlciBuYW1lPSJjb25maWdfc3RhdHVzX2Jhcl9wb3NpdGlvbiI+MTwvaW50ZWdlcj4KKzwvcmVzb3VyY2VzPgorCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvdmFsdWVzLXhsYXJnZS9zdHJpbmdzLnhtbCBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy92YWx1ZXMteGxhcmdlL3N0cmluZ3MueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNjNTljOTIKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvdmFsdWVzLXhsYXJnZS9zdHJpbmdzLnhtbApAQCAtMCwwICsxLDc3IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLQorLyoqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgCisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIAorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0IAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZSAKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCAKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCistLT4KKzxyZXNvdXJjZXMgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgorICAgIDwhLS0gVGhlIHRleHQgZm9yIHRoZSBidXR0b24gaW4gdGhlIG5vdGlmaWNhdGlvbiB3aW5kb3ctc2hhZGUgdGhhdCBjbGVhcnMKKyAgICAgICAgIGFsbCBvZiB0aGUgY3VycmVudGx5IHZpc2libGUgbm90aWZpY2F0aW9ucy4gLS0+CisgICAgPHN0cmluZyBuYW1lPSJzdGF0dXNfYmFyX2NsZWFyX2FsbF9idXR0b24iPkNsZWFyIGFsbDwvc3RyaW5nPgorCisgICAgPCEtLSBTeXN0ZW0gcGFuZWwgKCJRdWljayBTZXR0aW5ncyIpIC0tPgorCisgICAgPCEtLSBUZXh0IHRvIGRpc3BsYXkgdW5kZXJuZWF0aCB0aGUgZ3JhcGhpY2FsIGJhdHRlcnkgbWV0ZXIuIFNob3VsZAorICAgICAgICAgaW5jbHVkZSB0aGUgd29yZCBmb3IgImJhdHRlcnkiIGFuZCBhIHBsYWNlIGZvciB0aGUgcGVyY2VudGFnZSBjaGFyZ2UKKyAgICAgICAgIGF2YWlsYWJsZS4gW0NIQVIgTElNSVQ9MjBdIC0tPgorICAgIDxzdHJpbmcgbmFtZT0ic3lzdGVtX3BhbmVsX2JhdHRlcnlfbWV0ZXJfZm9ybWF0Ij4KKyAgICAgICAgQmF0dGVyeTogPHhsaWZmOmcgaWQ9Im51bWJlciI+JWQ8L3hsaWZmOmc+PHhsaWZmOmcgaWQ9InBlcmNlbnQiPiUlPC94bGlmZjpnPgorICAgIDwvc3RyaW5nPgorCisgICAgPCEtLSBUZXh0IHRvIGRpc3BsYXkgdW5kZXJuZWF0aCB0aGUgZ3JhcGhpY2FsIHNpZ25hbCBzdHJlbmd0aCBtZXRlciB3aGVuCisgICAgICAgICBubyBjb25uZWN0aW9uIGlzIGF2YWlsYWJsZS4gW0NIQVIgTElNSVQ9MjBdIC0tPgorICAgIDxzdHJpbmcgbmFtZT0ic3lzdGVtX3BhbmVsX3NpZ25hbF9tZXRlcl9kaXNjb25uZWN0ZWQiPgorICAgICAgICBubyBpbnRlcm5ldCBjb25uZWN0aW9uCisgICAgPC9zdHJpbmc+CisKKyAgICA8IS0tIFRleHQgdG8gZGlzcGxheSB1bmRlcm5lYXRoIHRoZSBncmFwaGljYWwgc2lnbmFsIHN0cmVuZ3RoIG1ldGVyIHdoZW4KKyAgICAgICAgIGl0IGlzIGRpc3BsYXlpbmcgaW5mb3JtYXRpb24gYWJvdXQgYSBjb25uZWN0ZWQsIG5hbWVkIFdpLUZpIG5ldHdvcmsuCisgICAgICAgICBTaG91bGQgaW5jbHVkZSB0aGUgd29yZCBmb3IgIldpLUZpIiBhbmQgYSBwbGFjZWhvbGRlciBmb3IgdGhlCisgICAgICAgICB3aXJlbGVzcyBuZXR3b3JrJ3MgU1NJRC4gW0NIQVIgTElNSVQ9MjBdIC0tPgorICAgIDxzdHJpbmcgbmFtZT0ic3lzdGVtX3BhbmVsX3NpZ25hbF9tZXRlcl93aWZpX3NzaWRfZm9ybWF0Ij4KKyAgICAgICAgV2ktRmk6IDx4bGlmZjpnIGlkPSJzc2lkIj4lczwveGxpZmY6Zz4KKyAgICA8L3N0cmluZz4KKworICAgIDwhLS0gVGV4dCB0byBkaXNwbGF5IHVuZGVybmVhdGggdGhlIGdyYXBoaWNhbCBzaWduYWwgc3RyZW5ndGggbWV0ZXIgd2hlbgorICAgICAgICAgaXQgaXMgZGlzcGxheWluZyBXaS1GaSBzdGF0dXMgYW5kIFdpLUZpIGlzIGNvbm5lY3RlZCB0byBhIG5ldHdvcmsKKyAgICAgICAgIHdob3NlIFNTSUQgaXMgbm90IGF2YWlsYWJsZS4KKyAgICAgICAgIFtDSEFSIExJTUlUPTIwXSAtLT4KKyAgICA8c3RyaW5nIG5hbWU9InN5c3RlbV9wYW5lbF9zaWduYWxfbWV0ZXJfd2lmaV9ub3NzaWQiPgorICAgICAgICBXaS1GaTogY29ubmVjdGVkCisgICAgPC9zdHJpbmc+CisKKyAgICA8IS0tIFRleHQgdG8gZGlzcGxheSB1bmRlcm5lYXRoIHRoZSBncmFwaGljYWwgc2lnbmFsIHN0cmVuZ3RoIG1ldGVyIHdoZW4KKyAgICAgICAgIGl0IGlzIGRpc3BsYXlpbmcgV2ktRmkgc3RhdHVzIGFuZCBXaS1GaSBpcyBpbiB0aGUgcHJvY2VzcyBvZgorICAgICAgICAgY29ubmVjdGluZyB0byBhIG5ldHdvcmsuICBbQ0hBUiBMSU1JVD0yMF0gLS0+CisgICAgPHN0cmluZyBuYW1lPSJzeXN0ZW1fcGFuZWxfc2lnbmFsX21ldGVyX3dpZmlfY29ubmVjdGluZyI+CisgICAgICAgIFdpLUZpOiBjb25uZWN0aW5n4oCmCisgICAgPC9zdHJpbmc+CisgCisgICAgPCEtLSBUZXh0IHRvIGRpc3BsYXkgdW5kZXJuZWF0aCB0aGUgZ3JhcGhpY2FsIHNpZ25hbCBzdHJlbmd0aCBtZXRlciB3aGVuCisgICAgICAgICBpdCBpcyBkaXNwbGF5aW5nIG1vYmlsZSBkYXRhICgzRykgc3RhdHVzIGFuZCBhIG5ldHdvcmsgY29ubmVjdGlvbiBpcworICAgICAgICAgYXZhaWxhYmxlLgorICAgICAgICAgW0NIQVIgTElNSVQ9MjBdIC0tPgorICAgIDxzdHJpbmcgbmFtZT0ic3lzdGVtX3BhbmVsX3NpZ25hbF9tZXRlcl9kYXRhX2Nvbm5lY3RlZCI+CisgICAgICAgIE1vYmlsZSBkYXRhOiBjb25uZWN0ZWQKKyAgICA8L3N0cmluZz4KKworICAgIDwhLS0gVGV4dCB0byBkaXNwbGF5IHVuZGVybmVhdGggdGhlIGdyYXBoaWNhbCBzaWduYWwgc3RyZW5ndGggbWV0ZXIgd2hlbgorICAgICAgICAgaXQgaXMgZGlzcGxheWluZyBtb2JpbGUgZGF0YSAoM0cpIHN0YXR1cyBhbmQgYSBuZXR3b3JrIGNvbm5lY3Rpb24gaXMKKyAgICAgICAgIHVuYXZhaWxhYmxlLgorICAgICAgICAgW0NIQVIgTElNSVQ9MjBdIC0tPgorICAgIDxzdHJpbmcgbmFtZT0ic3lzdGVtX3BhbmVsX3NpZ25hbF9tZXRlcl9kYXRhX2Nvbm5lY3RpbmciPgorICAgICAgICBNb2JpbGUgZGF0YTogY29ubmVjdGluZ+KApgorICAgIDwvc3RyaW5nPgorPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvdmFsdWVzL2F0dHJzLnhtbCBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy92YWx1ZXMvYXR0cnMueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIzYmNmMjAKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvdmFsdWVzL2F0dHJzLnhtbApAQCAtMCwwICsxLDIyIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8cmVzb3VyY2VzPgorICAgIDxkZWNsYXJlLXN0eWxlYWJsZSBuYW1lPSJLZXlCdXR0b25WaWV3Ij4KKyAgICAgICAgPGF0dHIgbmFtZT0ia2V5Q29kZSIgZm9ybWF0PSJpbnRlZ2VyIiAvPgorICAgIDwvZGVjbGFyZS1zdHlsZWFibGU+Cis8L3Jlc291cmNlcz4KKwpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL3ZhbHVlcy9jb25maWcueG1sIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL3ZhbHVlcy9jb25maWcueG1sCmluZGV4IDhlYTQ2ZTUuLmFjMDBjNjkgMTAwNjQ0Ci0tLSBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy92YWx1ZXMvY29uZmlnLnhtbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvdmFsdWVzL2NvbmZpZy54bWwKQEAgLTIwLDcgKzIwLDE2IEBACiA8IS0tIFRoZXNlIHJlc291cmNlcyBhcmUgYXJvdW5kIGp1c3QgdG8gYWxsb3cgdGhlaXIgdmFsdWVzIHRvIGJlIGN1c3RvbWl6ZWQKICAgICAgZm9yIGRpZmZlcmVudCBoYXJkd2FyZSBhbmQgcHJvZHVjdCBidWlsZHMuIC0tPgogPHJlc291cmNlcz4KLSAgICA8IS0tIENvbnRyb2wgd2hldGhlciBzdGF0dXMgYmFyIHNob3VsZCBkaXN0aW5ndWlzaCBIU1BBIGRhdGEgaWNvbiBmb3JtIFVNVFMgZGF0YSBpY29uIG9uIGRldmljZXMgLS0+CisKKyAgICA8IS0tIENvbnRyb2wgd2hldGhlciBzdGF0dXMgYmFyIHNob3VsZCBkaXN0aW5ndWlzaCBIU1BBIGRhdGEgaWNvbiBmb3JtIFVNVFMKKyAgICBkYXRhIGljb24gb24gZGV2aWNlcyAtLT4KICAgICA8Ym9vbCBuYW1lPSJjb25maWdfaHNwYV9kYXRhX2Rpc3Rpbmd1aXNoYWJsZSI+ZmFsc2U8L2Jvb2w+CisKKyAgICA8IS0tIFRoZSBsb2NhdGlvbiBvZiB0aGUgc3RhdHVzIGJhci4KKyAgICAgICAgMCAtIHRvcAorICAgICAgICAxIC0gYm90dG9tCisgICAgLS0+CisgICAgPGludGVnZXIgbmFtZT0iY29uZmlnX3N0YXR1c19iYXJfcG9zaXRpb24iPjA8L2ludGVnZXI+CisKIDwvcmVzb3VyY2VzPgogCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvdmFsdWVzL3N0cmluZ3MueG1sIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL3ZhbHVlcy9zdHJpbmdzLnhtbAppbmRleCBiYTNhM2QxLi4wMzdkYzRhIDEwMDY0NAotLS0gYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvdmFsdWVzL3N0cmluZ3MueG1sCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy92YWx1ZXMvc3RyaW5ncy54bWwKQEAgLTUxLDQgKzUxLDIwIEBACiAgICAgICAgICBwb3dlciB1c2FnZSBhY3Rpdml0eSB0byBmaW5kIG91dCB3aGF0IGRyYWluZWQgdGhlIGJhdHRlcnkuIC0tPgogICAgIDxzdHJpbmcgbmFtZT0iYmF0dGVyeV9sb3dfd2h5Ij5CYXR0ZXJ5IHVzZTwvc3RyaW5nPgogCisgICAgPCEtLSBOYW1lIG9mIHRoZSBidXR0b24gdGhhdCBsaW5rcyB0byB0aGUgU2V0dGluZ3MgYXBwLiBbTUFYQ0hBUlM9Tk9ORV0gLS0+CisgICAgPHN0cmluZyBuYW1lPSJzeXN0ZW1fcGFuZWxfc2V0dGluZ3NfYnV0dG9uIj5TZXR0aW5nczwvc3RyaW5nPgorCisKKyAgICA8IS0tIFJlY2VudCBUYXNrcyBkaWFsb2c6IHRpdGxlCisgICAgIFRPRE86IHRoaXMgc2hvdWxkIG1vdmUgdG8gU3lzdGVtVUkuYXBrLCBidXQgdGhlIGNvZGUgZm9yIHRoZSBvbGQgCisgICAgICAgICAgICByZWNlbnQgZGlhbG9nIGlzIHN0aWxsIGluIHRoZSBmcmFtZXdvcmsKKyAgICAgLS0+CisgICAgPHN0cmluZyBuYW1lPSJyZWNlbnRfdGFza3NfdGl0bGUiPlJlY2VudDwvc3RyaW5nPgorICAgIDwhLS0gUmVjZW50IFRhc2tzIGRpYWxvZzogbWVzc2FnZSB3aGVuIHRoZXJlIGFyZSBubyByZWNlbnQgYXBwbGljYXRpb25zCisgICAgIFRPRE86IHRoaXMgc2hvdWxkIG1vdmUgdG8gU3lzdGVtVUkuYXBrLCBidXQgdGhlIGNvZGUgZm9yIHRoZSBvbGQgCisgICAgICAgICAgICByZWNlbnQgZGlhbG9nIGlzIHN0aWxsIGluIHRoZSBmcmFtZXdvcmsKKyAgICAgLS0+CisgICAgPHN0cmluZyBuYW1lPSJyZWNlbnRfdGFza3NfZW1wdHkiPk5vIHJlY2VudCBhcHBsaWNhdGlvbnMuPC9zdHJpbmc+CisKKyAgICAKIDwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL3ZhbHVlcy9zdHlsZXMueG1sIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL3ZhbHVlcy9zdHlsZXMueG1sCmluZGV4IDgxNmYzNGE0Li5mNTkyNzAzIDEwMDY0NAotLS0gYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvdmFsdWVzL3N0eWxlcy54bWwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL3ZhbHVlcy9zdHlsZXMueG1sCkBAIC0yNSw0ICsyNSwxOCBAQAogICAgIDxzdHlsZSBuYW1lPSJUZXh0QXBwZWFyYW5jZS5TdGF0dXNCYXIuSW50cnVkZXJBbGVydCIKICAgICAgICAgcGFyZW50PSJAYW5kcm9pZDpzdHlsZS9UZXh0QXBwZWFyYW5jZS5TdGF0dXNCYXIiPgogICAgIDwvc3R5bGU+CisKKyAgICA8c3R5bGUgbmFtZT0iVGV4dEFwcGVhcmFuY2UuU3RhdHVzQmFyLlN5c3RlbVBhbmVsIgorICAgICAgICBwYXJlbnQ9IkBhbmRyb2lkOnN0eWxlL1RleHRBcHBlYXJhbmNlLlN0YXR1c0JhciI+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6dGV4dEFwcGVhcmFuY2UiPj9hbmRyb2lkOmF0dHIvdGV4dEFwcGVhcmFuY2U8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6dGV4dFN0eWxlIj5ub3JtYWw8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6dGV4dENvbG9yIj4jNTBGRkZGRkY8L2l0ZW0+CisgICAgPC9zdHlsZT4KKworICAgIDxzdHlsZSBuYW1lPSJUZXh0QXBwZWFyYW5jZS5TdGF0dXNCYXIuVGV4dEJ1dHRvbiIKKyAgICAgICAgcGFyZW50PSJAYW5kcm9pZDpzdHlsZS9UZXh0QXBwZWFyYW5jZS5TdGF0dXNCYXIiPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnRleHRBcHBlYXJhbmNlIj4/YW5kcm9pZDphdHRyL3RleHRBcHBlYXJhbmNlPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnRleHRTdHlsZSI+bm9ybWFsPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnRleHRDb2xvciI+I0ZGRkZGRkZGPC9pdGVtPgorICAgIDwvc3R5bGU+CiA8L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9yZWNlbnQvUmVjZW50QXBwbGljYXRpb25zQWN0aXZpdHkuamF2YSBiL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9yZWNlbnQvUmVjZW50QXBwbGljYXRpb25zQWN0aXZpdHkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45Y2MyNGJlCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL3JlY2VudC9SZWNlbnRBcHBsaWNhdGlvbnNBY3Rpdml0eS5qYXZhCkBAIC0wLDAgKzEsMzUyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIGNvbS5hbmRyb2lkLnN5c3RlbXVpLnJlY2VudDsKKworaW1wb3J0IGNvbS5hbmRyb2lkLnN5c3RlbXVpLlI7CisKK2ltcG9ydCBjb20uYW5kcm9pZC5leC5jYXJvdXNlbC5DYXJvdXNlbFZpZXc7CitpbXBvcnQgY29tLmFuZHJvaWQuZXguY2Fyb3VzZWwuQ2Fyb3VzZWxSUy5DYXJvdXNlbENhbGxiYWNrOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5OworaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5TWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkLmFwcC5JVGh1bWJuYWlsUmVjZWl2ZXI7CitpbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHlNYW5hZ2VyLlJ1bm5pbmdUYXNrSW5mbzsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQWN0aXZpdHlOb3RGb3VuZEV4Y2VwdGlvbjsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5BY3Rpdml0eUluZm87CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLlBhY2thZ2VNYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5SZXNvbHZlSW5mbzsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLkNvbmZpZ3VyYXRpb247CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5SZXNvdXJjZXM7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5CaXRtYXA7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5NYXRyaXg7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5CaXRtYXAuQ29uZmlnOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuRHJhd2FibGU7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5QaXhlbEZvcm1hdDsKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKK2ltcG9ydCBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbjsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OworCitwdWJsaWMgY2xhc3MgUmVjZW50QXBwbGljYXRpb25zQWN0aXZpdHkgZXh0ZW5kcyBBY3Rpdml0eSB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJSZWNlbnRBcHBsaWNhdGlvbnNBY3Rpdml0eSI7CisgICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBEQkcgPSB0cnVlOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDQVJEX1NMT1RTID0gNTY7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFZJU0lCTEVfU0xPVFMgPSA3OworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNQVhfVEFTS1MgPSBWSVNJQkxFX1NMT1RTICogMjsKKyAgICBwcml2YXRlIEFjdGl2aXR5TWFuYWdlciBtQWN0aXZpdHlNYW5hZ2VyOworICAgIHByaXZhdGUgTGlzdDxSdW5uaW5nVGFza0luZm8+IG1SdW5uaW5nVGFza0xpc3Q7CisgICAgcHJpdmF0ZSBib29sZWFuIG1Qb3J0cmFpdE1vZGUgPSB0cnVlOworICAgIHByaXZhdGUgQXJyYXlMaXN0PEFjdGl2aXR5RGVzY3JpcHRpb24+IG1BY3Rpdml0eURlc2NyaXB0aW9ucworICAgICAgICAgICAgPSBuZXcgQXJyYXlMaXN0PEFjdGl2aXR5RGVzY3JpcHRpb24+KCk7CisgICAgcHJpdmF0ZSBDYXJvdXNlbFZpZXcgbUNhcm91c2VsVmlldzsKKyAgICBwcml2YXRlIFZpZXcgbU5vUmVjZW50c1ZpZXc7CisgICAgcHJpdmF0ZSBCaXRtYXAgbUJsYW5rQml0bWFwID0gQml0bWFwLmNyZWF0ZUJpdG1hcCgKKyAgICAgICAgICAgIG5ldyBpbnRbXSB7MHhmZjgwODA4MCwgMHhmZmZmZmZmZiwgMHhmZjgwODA4MCwgMHhmZmZmZmZmZn0sIDIsIDIsIENvbmZpZy5SR0JfNTY1KTsKKworICAgIHN0YXRpYyBjbGFzcyBBY3Rpdml0eURlc2NyaXB0aW9uIHsKKyAgICAgICAgaW50IGlkOworICAgICAgICBCaXRtYXAgdGh1bWJuYWlsOyAvLyBnZW5lcmF0ZWQgYnkgQWN0aXZpdHkub25DcmVhdGVUaHVtYm5haWwoKQorICAgICAgICBEcmF3YWJsZSBpY29uOyAvLyBhcHBsaWNhdGlvbiBwYWNrYWdlIGljb24KKyAgICAgICAgU3RyaW5nIGxhYmVsOyAvLyBhcHBsaWNhdGlvbiBwYWNrYWdlIGxhYmVsCisgICAgICAgIFN0cmluZyBkZXNjcmlwdGlvbjsgLy8gZ2VuZXJhdGVkIGJ5IEFjdGl2aXR5Lm9uQ3JlYXRlRGVzY3JpcHRpb24oKQorICAgICAgICBJbnRlbnQgaW50ZW50OyAvLyBsYXVuY2ggaW50ZW50IGZvciBhcHBsaWNhdGlvbgorICAgICAgICBNYXRyaXggbWF0cml4OyAvLyBhcmJpdHJhcnkgcm90YXRpb24gbWF0cml4IHRvIGNvcnJlY3Qgb3JpZW50YXRpb24KKyAgICAgICAgaW50IHBvc2l0aW9uOyAvLyBwb3NpdGlvbiBpbiBsaXN0CisKKyAgICAgICAgcHVibGljIEFjdGl2aXR5RGVzY3JpcHRpb24oQml0bWFwIF90aHVtYm5haWwsCisgICAgICAgICAgICAgICAgRHJhd2FibGUgX2ljb24sIFN0cmluZyBfbGFiZWwsIFN0cmluZyBfZGVzYywgaW50IF9pZCwgaW50IF9wb3MpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRodW1ibmFpbCA9IF90aHVtYm5haWw7CisgICAgICAgICAgICBpY29uID0gX2ljb247CisgICAgICAgICAgICBsYWJlbCA9IF9sYWJlbDsKKyAgICAgICAgICAgIGRlc2NyaXB0aW9uID0gX2Rlc2M7CisgICAgICAgICAgICBpZCA9IF9pZDsKKyAgICAgICAgICAgIHBvc2l0aW9uID0gX3BvczsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIGNsZWFyKCkgeworICAgICAgICAgICAgaWNvbiA9IG51bGw7CisgICAgICAgICAgICB0aHVtYm5haWwgPSBudWxsOworICAgICAgICAgICAgbGFiZWwgPSBudWxsOworICAgICAgICAgICAgZGVzY3JpcHRpb24gPSBudWxsOworICAgICAgICAgICAgaW50ZW50ID0gbnVsbDsKKyAgICAgICAgICAgIG1hdHJpeCA9IG51bGw7CisgICAgICAgICAgICBpZCA9IC0xOworICAgICAgICAgICAgcG9zaXRpb24gPSAtMTsKKyAgICAgICAgfQorICAgIH07CisKKyAgICBwcml2YXRlIEFjdGl2aXR5RGVzY3JpcHRpb24gZmluZEFjdGl2aXR5RGVzY3JpcHRpb24oaW50IGlkKSB7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbUFjdGl2aXR5RGVzY3JpcHRpb25zLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICBBY3Rpdml0eURlc2NyaXB0aW9uIGl0ZW0gPSBtQWN0aXZpdHlEZXNjcmlwdGlvbnMuZ2V0KGkpOworICAgICAgICAgICAgaWYgKGl0ZW0gIT0gbnVsbCAmJiBpdGVtLmlkID09IGlkKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGl0ZW07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgZmluYWwgQ2Fyb3VzZWxDYWxsYmFjayBtQ2Fyb3VzZWxDYWxsYmFjayA9IG5ldyBDYXJvdXNlbENhbGxiYWNrKCkgeworCisgICAgICAgIHB1YmxpYyB2b2lkIG9uQW5pbWF0aW9uRmluaXNoZWQoKSB7CisKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIG9uQW5pbWF0aW9uU3RhcnRlZCgpIHsKKworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgb25DYXJkU2VsZWN0ZWQoaW50IG4pIHsKKyAgICAgICAgICAgIGlmIChuIDwgbUFjdGl2aXR5RGVzY3JpcHRpb25zLnNpemUoKSkgeworICAgICAgICAgICAgICAgIEFjdGl2aXR5RGVzY3JpcHRpb24gaXRlbSA9IG1BY3Rpdml0eURlc2NyaXB0aW9ucy5nZXQobik7CisgICAgICAgICAgICAgICAgLy8gcHJlcGFyZSBhIGxhdW5jaCBpbnRlbnQgYW5kIHNlbmQgaXQKKyAgICAgICAgICAgICAgICBpZiAoaXRlbS5pbnRlbnQgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBpdGVtLmludGVudC5hZGRGbGFncyhJbnRlbnQuRkxBR19BQ1RJVklUWV9MQVVOQ0hFRF9GUk9NX0hJU1RPUlkpOworICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKERCRykgTG9nLnYoVEFHLCAiU3RhcnRpbmcgaW50ZW50ICIgKyBpdGVtLmludGVudCk7CisgICAgICAgICAgICAgICAgICAgICAgICBzdGFydEFjdGl2aXR5KGl0ZW0uaW50ZW50KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vb3ZlcnJpZGVQZW5kaW5nVHJhbnNpdGlvbihSLmFuaW0uem9vbV9lbnRlciwgUi5hbmltLnpvb21fZXhpdCk7CisgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEFjdGl2aXR5Tm90Rm91bmRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKERCRykgTG9nLncoIlJlY2VudCIsICJVbmFibGUgdG8gbGF1bmNoIHJlY2VudCB0YXNrIiwgZSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZmluaXNoKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgb25JbnZhbGlkYXRlVGV4dHVyZShpbnQgbikgeworCisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBvblJlcXVlc3RHZW9tZXRyeShpbnQgbikgeworCisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBvbkludmFsaWRhdGVHZW9tZXRyeShpbnQgbikgeworCisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBvblJlcXVlc3RUZXh0dXJlKGZpbmFsIGludCBuKSB7CisgICAgICAgICAgICBpZiAoREJHKSBMb2cudihUQUcsICJvblJlcXVlc3RUZXh0dXJlKCIgKyBuICsgIikiKTsKKyAgICAgICAgICAgIGlmIChuIDwgbUFjdGl2aXR5RGVzY3JpcHRpb25zLnNpemUoKSkgeworICAgICAgICAgICAgICAgIG1DYXJvdXNlbFZpZXcucG9zdChuZXcgUnVubmFibGUoKSB7CisgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFjdGl2aXR5RGVzY3JpcHRpb24gaW5mbyA9IG1BY3Rpdml0eURlc2NyaXB0aW9ucy5nZXQobik7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5mbyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKERCRykgTG9nLnYoVEFHLCAiRk9VTkQgQUNUSVZJVFkgVEhVTUJOQUlMICIgKyBpbmZvLnRodW1ibmFpbCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQml0bWFwIGJpdG1hcCA9IGluZm8udGh1bWJuYWlsID09IG51bGwgPyBtQmxhbmtCaXRtYXAgOiBpbmZvLnRodW1ibmFpbDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ2Fyb3VzZWxWaWV3LnNldFRleHR1cmVGb3JJdGVtKG4sIGJpdG1hcCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChEQkcpIExvZy52KFRBRywgIkZBSUxFRCBUTyBHRVQgQUNUSVZJVFkgVEhVTUJOQUlMIEZPUiBJVEVNICIgKyBuKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgb25JbnZhbGlkYXRlRGV0YWlsVGV4dHVyZShpbnQgbikgeworCisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBvblJlcXVlc3REZXRhaWxUZXh0dXJlKGludCBuKSB7CisKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIG9uUmVwb3J0Rmlyc3RDYXJkUG9zaXRpb24oaW50IG4pIHsKKworICAgICAgICB9CisgICAgfTsKKworICAgIHByaXZhdGUgZmluYWwgSVRodW1ibmFpbFJlY2VpdmVyIG1UaHVtYm5haWxSZWNlaXZlciA9IG5ldyBJVGh1bWJuYWlsUmVjZWl2ZXIuU3R1YigpIHsKKworICAgICAgICBwdWJsaWMgdm9pZCBmaW5pc2hlZCgpIHRocm93cyBSZW1vdGVFeGNlcHRpb24geworCisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBuZXdUaHVtYm5haWwoZmluYWwgaW50IGlkLCBmaW5hbCBCaXRtYXAgYml0bWFwLCBDaGFyU2VxdWVuY2UgZGVzY3JpcHRpb24pCisgICAgICAgICAgICAgICAgdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbiB7CisgICAgICAgICAgICBpbnQgdyA9IGJpdG1hcC5nZXRXaWR0aCgpOworICAgICAgICAgICAgaW50IGggPSBiaXRtYXAuZ2V0SGVpZ2h0KCk7CisgICAgICAgICAgICBpZiAoREJHKSBMb2cudihUQUcsICJOZXcgdGh1bWJuYWlsIGZvciBpZD0iICsgaWQgKyAiLCBkaW1lbnNpb25zPSIgKyB3ICsgIngiICsgaAorICAgICAgICAgICAgICAgICAgICArICIgZGVzY3JpcHRpb24gJyIgKyBkZXNjcmlwdGlvbiArICInIik7CisgICAgICAgICAgICBBY3Rpdml0eURlc2NyaXB0aW9uIGluZm8gPSBmaW5kQWN0aXZpdHlEZXNjcmlwdGlvbihpZCk7CisgICAgICAgICAgICBpZiAoaW5mbyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgaW5mby50aHVtYm5haWwgPSBiaXRtYXA7CisgICAgICAgICAgICAgICAgZmluYWwgaW50IHRodW1iV2lkdGggPSBiaXRtYXAuZ2V0V2lkdGgoKTsKKyAgICAgICAgICAgICAgICBmaW5hbCBpbnQgdGh1bWJIZWlnaHQgPSBiaXRtYXAuZ2V0SGVpZ2h0KCk7CisgICAgICAgICAgICAgICAgaWYgKChtUG9ydHJhaXRNb2RlICYmIHRodW1iV2lkdGggPiB0aHVtYkhlaWdodCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHx8ICghbVBvcnRyYWl0TW9kZSAmJiB0aHVtYldpZHRoIDwgdGh1bWJIZWlnaHQpKSB7CisgICAgICAgICAgICAgICAgICAgIE1hdHJpeCBtYXRyaXggPSBuZXcgTWF0cml4KCk7CisgICAgICAgICAgICAgICAgICAgIG1hdHJpeC5zZXRSb3RhdGUoOTAuMGYsIChmbG9hdCkgdGh1bWJXaWR0aCAvIDIsIChmbG9hdCkgdGh1bWJIZWlnaHQgLyAyKTsKKyAgICAgICAgICAgICAgICAgICAgaW5mby5tYXRyaXggPSBtYXRyaXg7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgaW5mby5tYXRyaXggPSBudWxsOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBtQ2Fyb3VzZWxWaWV3LnNldFRleHR1cmVGb3JJdGVtKGluZm8ucG9zaXRpb24sIGluZm8udGh1bWJuYWlsKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaWYgKERCRykgTG9nLnYoVEFHLCAiQ2FuJ3QgZmluZCB2aWV3IGZvciBpZCAiICsgaWQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfTsKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG9uQ3JlYXRlKEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpIHsKKyAgICAgICAgc3VwZXIub25DcmVhdGUoc2F2ZWRJbnN0YW5jZVN0YXRlKTsKKworICAgICAgICBmaW5hbCBSZXNvdXJjZXMgcmVzID0gZ2V0UmVzb3VyY2VzKCk7CisgICAgICAgIGZpbmFsIFZpZXcgZGVjb3JWaWV3ID0gZ2V0V2luZG93KCkuZ2V0RGVjb3JWaWV3KCk7CisKKyAgICAgICAgZ2V0V2luZG93KCkuZ2V0RGVjb3JWaWV3KCkuc2V0QmFja2dyb3VuZENvbG9yKDB4ODAwMDAwMDApOworICAgICAgICBzZXRDb250ZW50VmlldyhSLmxheW91dC5yZWNlbnRfYXBwc19hY3Rpdml0eSk7CisgICAgICAgIG1DYXJvdXNlbFZpZXcgPSAoQ2Fyb3VzZWxWaWV3KWZpbmRWaWV3QnlJZChSLmlkLmNhcm91c2VsKTsKKyAgICAgICAgbU5vUmVjZW50c1ZpZXcgPSAoVmlldykgZmluZFZpZXdCeUlkKFIuaWQubm9fYXBwbGljYXRpb25zX21lc3NhZ2UpOworICAgICAgICAvL21DYXJvdXNlbFZpZXcgPSBuZXcgQ2Fyb3VzZWxWaWV3KHRoaXMpOworICAgICAgICAvL3NldENvbnRlbnRWaWV3KG1DYXJvdXNlbFZpZXcpOworICAgICAgICBtQ2Fyb3VzZWxWaWV3LnNldFNsb3RDb3VudChDQVJEX1NMT1RTKTsKKyAgICAgICAgbUNhcm91c2VsVmlldy5zZXRWaXNpYmxlU2xvdHMoVklTSUJMRV9TTE9UUyk7CisgICAgICAgIG1DYXJvdXNlbFZpZXcuY3JlYXRlQ2FyZHMoMSk7CisgICAgICAgIG1DYXJvdXNlbFZpZXcuc2V0U3RhcnRBbmdsZSgoZmxvYXQpIC0oMi4wZipNYXRoLlBJICogNSAvIENBUkRfU0xPVFMpKTsKKyAgICAgICAgbUNhcm91c2VsVmlldy5zZXREZWZhdWx0Qml0bWFwKG1CbGFua0JpdG1hcCk7CisgICAgICAgIG1DYXJvdXNlbFZpZXcuc2V0TG9hZGluZ0JpdG1hcChtQmxhbmtCaXRtYXApOworICAgICAgICBtQ2Fyb3VzZWxWaWV3LnNldENhbGxiYWNrKG1DYXJvdXNlbENhbGxiYWNrKTsKKyAgICAgICAgbUNhcm91c2VsVmlldy5nZXRIb2xkZXIoKS5zZXRGb3JtYXQoUGl4ZWxGb3JtYXQuVFJBTlNMVUNFTlQpOworCisgICAgICAgIG1BY3Rpdml0eU1hbmFnZXIgPSAoQWN0aXZpdHlNYW5hZ2VyKSBnZXRTeXN0ZW1TZXJ2aWNlKENvbnRleHQuQUNUSVZJVFlfU0VSVklDRSk7CisgICAgICAgIG1Qb3J0cmFpdE1vZGUgPSBkZWNvclZpZXcuZ2V0SGVpZ2h0KCkgPiBkZWNvclZpZXcuZ2V0V2lkdGgoKTsKKworICAgICAgICByZWZyZXNoKCk7CisKKworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG9uUmVzdW1lKCkgeworICAgICAgICBzdXBlci5vblJlc3VtZSgpOworICAgICAgICByZWZyZXNoKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb25Db25maWd1cmF0aW9uQ2hhbmdlZChDb25maWd1cmF0aW9uIG5ld0NvbmZpZykgeworICAgICAgICBzdXBlci5vbkNvbmZpZ3VyYXRpb25DaGFuZ2VkKG5ld0NvbmZpZyk7CisgICAgICAgIG1Qb3J0cmFpdE1vZGUgPSBuZXdDb25maWcub3JpZW50YXRpb24gPT0gQ29uZmlndXJhdGlvbi5PUklFTlRBVElPTl9QT1JUUkFJVDsKKyAgICAgICAgaWYgKERCRykgTG9nLnYoVEFHLCAiQ09ORklHIENIQU5HRSwgbVBvcnRyYWl0TW9kZSA9ICIgKyBtUG9ydHJhaXRNb2RlKTsKKyAgICAgICAgcmVmcmVzaCgpOworICAgIH0KKworICAgIHZvaWQgdXBkYXRlUnVubmluZ1Rhc2tzKCkgeworICAgICAgICBtUnVubmluZ1Rhc2tMaXN0ID0gbUFjdGl2aXR5TWFuYWdlci5nZXRSdW5uaW5nVGFza3MoTUFYX1RBU0tTLCAwLCBtVGh1bWJuYWlsUmVjZWl2ZXIpOworICAgICAgICBpZiAoREJHKSBMb2cudihUQUcsICJQb3J0cmFpdDogIiArIG1Qb3J0cmFpdE1vZGUpOworICAgICAgICBmb3IgKFJ1bm5pbmdUYXNrSW5mbyByIDogbVJ1bm5pbmdUYXNrTGlzdCkgeworICAgICAgICAgICAgaWYgKHIudGh1bWJuYWlsICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBpbnQgdGh1bWJXaWR0aCA9IHIudGh1bWJuYWlsLmdldFdpZHRoKCk7CisgICAgICAgICAgICAgICAgaW50IHRodW1iSGVpZ2h0ID0gci50aHVtYm5haWwuZ2V0SGVpZ2h0KCk7CisgICAgICAgICAgICAgICAgaWYgKERCRykgTG9nLnYoVEFHLCAiR290IHRodW1ibmFpbCAiICsgdGh1bWJXaWR0aCArICJ4IiArIHRodW1iSGVpZ2h0KTsKKyAgICAgICAgICAgICAgICBBY3Rpdml0eURlc2NyaXB0aW9uIGRlc2MgPSBmaW5kQWN0aXZpdHlEZXNjcmlwdGlvbihyLmlkKTsKKyAgICAgICAgICAgICAgICBpZiAoZGVzYyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGRlc2MudGh1bWJuYWlsID0gci50aHVtYm5haWw7CisgICAgICAgICAgICAgICAgICAgIGRlc2MubGFiZWwgPSByLnRvcEFjdGl2aXR5LmZsYXR0ZW5Ub1Nob3J0U3RyaW5nKCk7CisgICAgICAgICAgICAgICAgICAgIGlmICgobVBvcnRyYWl0TW9kZSAmJiB0aHVtYldpZHRoID4gdGh1bWJIZWlnaHQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKCFtUG9ydHJhaXRNb2RlICYmIHRodW1iV2lkdGggPCB0aHVtYkhlaWdodCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIE1hdHJpeCBtYXRyaXggPSBuZXcgTWF0cml4KCk7CisgICAgICAgICAgICAgICAgICAgICAgICBtYXRyaXguc2V0Um90YXRlKDkwLjBmLCAoZmxvYXQpIHRodW1iV2lkdGggLyAyLCAoZmxvYXQpIHRodW1iSGVpZ2h0IC8gMik7CisgICAgICAgICAgICAgICAgICAgICAgICBkZXNjLm1hdHJpeCA9IG1hdHJpeDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChEQkcpIExvZy52KFRBRywgIkNvdWxkbid0IGZpbmQgQWN0aXZpdHlEZXNjIGZvciBpZD0iICsgci5pZCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZiAoREJHKSBMb2cudihUQUcsICIqKiogUlVOTklORyBUSFVNQk5BSUwgV0FTIE5VTEwgKioqIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgbUNhcm91c2VsVmlldy5jcmVhdGVDYXJkcyhtQWN0aXZpdHlEZXNjcmlwdGlvbnMuc2l6ZSgpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgdXBkYXRlUmVjZW50VGFza3MoKSB7CisgICAgICAgIGZpbmFsIFBhY2thZ2VNYW5hZ2VyIHBtID0gZ2V0UGFja2FnZU1hbmFnZXIoKTsKKyAgICAgICAgZmluYWwgQWN0aXZpdHlNYW5hZ2VyIGFtID0gKEFjdGl2aXR5TWFuYWdlcikgZ2V0U3lzdGVtU2VydmljZShDb250ZXh0LkFDVElWSVRZX1NFUlZJQ0UpOworCisgICAgICAgIGZpbmFsIExpc3Q8QWN0aXZpdHlNYW5hZ2VyLlJlY2VudFRhc2tJbmZvPiByZWNlbnRUYXNrcyA9CisgICAgICAgICAgICAgICAgYW0uZ2V0UmVjZW50VGFza3MoTUFYX1RBU0tTLCBBY3Rpdml0eU1hbmFnZXIuUkVDRU5UX0lHTk9SRV9VTkFWQUlMQUJMRSk7CisKKyAgICAgICAgQWN0aXZpdHlJbmZvIGhvbWVJbmZvID0gbmV3IEludGVudChJbnRlbnQuQUNUSU9OX01BSU4pLmFkZENhdGVnb3J5KEludGVudC5DQVRFR09SWV9IT01FKQorICAgICAgICAgICAgICAgICAgICAucmVzb2x2ZUFjdGl2aXR5SW5mbyhwbSwgMCk7CisKKyAgICAgICAgLy8gSWNvblV0aWxpdGllcyBpY29uVXRpbGl0aWVzID0gbmV3IEljb25VdGlsaXRpZXModGhpcyk7IC8vIEZJWE1FCisKKyAgICAgICAgaW50IG51bVRhc2tzID0gcmVjZW50VGFza3Muc2l6ZSgpOworICAgICAgICBtQWN0aXZpdHlEZXNjcmlwdGlvbnMuY2xlYXIoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDAsIGluZGV4ID0gMDsgaSA8IG51bVRhc2tzICYmIChpbmRleCA8IE1BWF9UQVNLUyk7ICsraSkgeworICAgICAgICAgICAgZmluYWwgQWN0aXZpdHlNYW5hZ2VyLlJlY2VudFRhc2tJbmZvIHJlY2VudEluZm8gPSByZWNlbnRUYXNrcy5nZXQoaSk7CisKKyAgICAgICAgICAgIEludGVudCBpbnRlbnQgPSBuZXcgSW50ZW50KHJlY2VudEluZm8uYmFzZUludGVudCk7CisgICAgICAgICAgICBpZiAocmVjZW50SW5mby5vcmlnQWN0aXZpdHkgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGludGVudC5zZXRDb21wb25lbnQocmVjZW50SW5mby5vcmlnQWN0aXZpdHkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBTa2lwIHRoZSBjdXJyZW50IGhvbWUgYWN0aXZpdHkuCisgICAgICAgICAgICBpZiAoaG9tZUluZm8gIT0gbnVsbAorICAgICAgICAgICAgICAgICAgICAmJiBob21lSW5mby5wYWNrYWdlTmFtZS5lcXVhbHMoaW50ZW50LmdldENvbXBvbmVudCgpLmdldFBhY2thZ2VOYW1lKCkpCisgICAgICAgICAgICAgICAgICAgICYmIGhvbWVJbmZvLm5hbWUuZXF1YWxzKGludGVudC5nZXRDb21wb25lbnQoKS5nZXRDbGFzc05hbWUoKSkpIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaW50ZW50LnNldEZsYWdzKChpbnRlbnQuZ2V0RmxhZ3MoKSZ+SW50ZW50LkZMQUdfQUNUSVZJVFlfUkVTRVRfVEFTS19JRl9ORUVERUQpCisgICAgICAgICAgICAgICAgICAgIHwgSW50ZW50LkZMQUdfQUNUSVZJVFlfTkVXX1RBU0spOworICAgICAgICAgICAgZmluYWwgUmVzb2x2ZUluZm8gcmVzb2x2ZUluZm8gPSBwbS5yZXNvbHZlQWN0aXZpdHkoaW50ZW50LCAwKTsKKyAgICAgICAgICAgIGlmIChyZXNvbHZlSW5mbyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgZmluYWwgQWN0aXZpdHlJbmZvIGluZm8gPSByZXNvbHZlSW5mby5hY3Rpdml0eUluZm87CisgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIHRpdGxlID0gaW5mby5sb2FkTGFiZWwocG0pLnRvU3RyaW5nKCk7CisgICAgICAgICAgICAgICAgRHJhd2FibGUgaWNvbiA9IGluZm8ubG9hZEljb24ocG0pOworCisgICAgICAgICAgICAgICAgaW50IGlkID0gcmVjZW50VGFza3MuZ2V0KGkpLmlkOworICAgICAgICAgICAgICAgIGlmIChpZCAhPSAtMSAmJiB0aXRsZSAhPSBudWxsICYmIHRpdGxlLmxlbmd0aCgpID4gMCAmJiBpY29uICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gaWNvbiA9IG51bGw7IEZJWE1FOiBpY29uVXRpbGl0aWVzLmNyZWF0ZUljb25EcmF3YWJsZShpY29uKTsKKyAgICAgICAgICAgICAgICAgICAgQWN0aXZpdHlEZXNjcmlwdGlvbiBpdGVtID0gbmV3IEFjdGl2aXR5RGVzY3JpcHRpb24oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCwgaWNvbiwgdGl0bGUsIG51bGwsIGlkLCBpbmRleCk7CisgICAgICAgICAgICAgICAgICAgIGl0ZW0uaW50ZW50ID0gaW50ZW50OworICAgICAgICAgICAgICAgICAgICBtQWN0aXZpdHlEZXNjcmlwdGlvbnMuYWRkKGl0ZW0pOworICAgICAgICAgICAgICAgICAgICBpZiAoREJHKSBMb2cudihUQUcsICJBZGRlZCBpdGVtWyIgKyBpbmRleAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIl0sIGlkPSIgKyBpdGVtLmlkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiLCB0aXRsZT0iICsgaXRlbS5sYWJlbCk7CisgICAgICAgICAgICAgICAgICAgICsraW5kZXg7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKERCRykgTG9nLnYoVEFHLCAiU0tJUFBJTkcgaXRlbSAiICsgaWQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCByZWZyZXNoKCkgeworICAgICAgICB1cGRhdGVSZWNlbnRUYXNrcygpOworICAgICAgICB1cGRhdGVSdW5uaW5nVGFza3MoKTsKKyAgICAgICAgaWYgKG1BY3Rpdml0eURlc2NyaXB0aW9ucy5zaXplKCkgPT0gMCkgeworICAgICAgICAgICAgLy8gc2hvdyAiTm8gUmVjZW50IFRha3NzIgorICAgICAgICAgICAgbU5vUmVjZW50c1ZpZXcuc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOworICAgICAgICAgICAgbUNhcm91c2VsVmlldy5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtTm9SZWNlbnRzVmlldy5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7CisgICAgICAgICAgICBtQ2Fyb3VzZWxWaWV3LnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKKyAgICAgICAgICAgIG1DYXJvdXNlbFZpZXcuY3JlYXRlQ2FyZHMobUFjdGl2aXR5RGVzY3JpcHRpb25zLnNpemUoKSk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvcmVjZW50L1JlY2VudEFwcGxpY2F0aW9uc0Nhcm91c2VsVmlldy5qYXZhIGIvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL3JlY2VudC9SZWNlbnRBcHBsaWNhdGlvbnNDYXJvdXNlbFZpZXcuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYzhlYzk1Ci0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL3JlY2VudC9SZWNlbnRBcHBsaWNhdGlvbnNDYXJvdXNlbFZpZXcuamF2YQpAQCAtMCwwICsxLDM5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5zeXN0ZW11aS5yZWNlbnQ7CisKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0OworCitpbXBvcnQgY29tLmFuZHJvaWQuZXguY2Fyb3VzZWwuQ2Fyb3VzZWxWaWV3OworaW1wb3J0IGNvbS5hbmRyb2lkLnN5c3RlbXVpLlI7CisKK3B1YmxpYyBjbGFzcyBSZWNlbnRBcHBsaWNhdGlvbnNDYXJvdXNlbFZpZXcgZXh0ZW5kcyBDYXJvdXNlbFZpZXcgeworCisgICAgcHVibGljIFJlY2VudEFwcGxpY2F0aW9uc0Nhcm91c2VsVmlldyhDb250ZXh0IGNvbnRleHQpIHsKKyAgICAgICAgdGhpcyhjb250ZXh0LCBudWxsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgUmVjZW50QXBwbGljYXRpb25zQ2Fyb3VzZWxWaWV3KENvbnRleHQgY29udGV4dCwgQXR0cmlidXRlU2V0IGF0dHJzKSB7CisgICAgICAgIHN1cGVyKGNvbnRleHQsIGF0dHJzKTsKKyAgICB9CisKKyAgICBwdWJsaWMgSW5mbyBnZXRSZW5kZXJTY3JpcHRJbmZvKCkgeworICAgICAgICByZXR1cm4gbmV3IEluZm8oUi5yYXcuY2Fyb3VzZWwpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL3N0YXR1c2Jhci9DbG9zZURyYWdIYW5kbGUuamF2YSBiL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9zdGF0dXNiYXIvQ2xvc2VEcmFnSGFuZGxlLmphdmEKaW5kZXggZjQ1Y2FmNTEuLjBmNjcyM2UgMTAwNjQ0Ci0tLSBhL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9zdGF0dXNiYXIvQ2xvc2VEcmFnSGFuZGxlLmphdmEKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL3N0YXR1c2Jhci9DbG9zZURyYWdIYW5kbGUuamF2YQpAQCAtMjMsNyArMjMsNyBAQAogCiAKIHB1YmxpYyBjbGFzcyBDbG9zZURyYWdIYW5kbGUgZXh0ZW5kcyBMaW5lYXJMYXlvdXQgewotICAgIFN0YXR1c0JhclNlcnZpY2UgbVNlcnZpY2U7CisgICAgUGhvbmVTdGF0dXNCYXJTZXJ2aWNlIG1TZXJ2aWNlOwogCiAgICAgcHVibGljIENsb3NlRHJhZ0hhbmRsZShDb250ZXh0IGNvbnRleHQsIEF0dHJpYnV0ZVNldCBhdHRycykgewogICAgICAgICBzdXBlcihjb250ZXh0LCBhdHRycyk7CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvc3RhdHVzYmFyL0NvbW1hbmRRdWV1ZS5qYXZhIGIvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL3N0YXR1c2Jhci9Db21tYW5kUXVldWUuamF2YQppbmRleCBmOTM0N2IxLi4zZWYxMmY5IDEwMDY0NAotLS0gYS9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvc3RhdHVzYmFyL0NvbW1hbmRRdWV1ZS5qYXZhCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9zdGF0dXNiYXIvQ29tbWFuZFF1ZXVlLmphdmEKQEAgLTMyLDcgKzMyLDcgQEAKICAqIGNvYWxlc2NpbmcgdGhlc2UgY2FsbHMgc28gdGhleSBkb24ndCBzdGFjayB1cC4gIEZvciB0aGUgY2FsbHMKICAqIGFyZSBjb2FsZXNjZWQsIG5vdGUgdGhhdCB0aGV5IGFyZSBhbGwgaWRlbXBvdGVudC4KICAqLwotY2xhc3MgQ29tbWFuZFF1ZXVlIGV4dGVuZHMgSVN0YXR1c0Jhci5TdHViIHsKK3B1YmxpYyBjbGFzcyBDb21tYW5kUXVldWUgZXh0ZW5kcyBJU3RhdHVzQmFyLlN0dWIgewogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiU3RhdHVzQmFyLkNvbW1hbmRRdWV1ZSI7CiAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTVNHX01BU0sgPSAweGZmZmYwMDAwOwpAQCAtNTIsNiArNTIsOCBAQAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBPUF9FWFBBTkQgPSAxOwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBPUF9DT0xMQVBTRSA9IDI7CiAKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTVNHX1NFVF9MSUdIVFNfT04gPSAweDAwMDcwMDAwOworCiAgICAgcHJpdmF0ZSBTdGF0dXNCYXJJY29uTGlzdCBtTGlzdDsKICAgICBwcml2YXRlIENhbGxiYWNrcyBtQ2FsbGJhY2tzOwogICAgIHByaXZhdGUgSGFuZGxlciBtSGFuZGxlciA9IG5ldyBIKCk7CkBAIC03NSw2ICs3Nyw3IEBACiAgICAgICAgIHB1YmxpYyB2b2lkIGRpc2FibGUoaW50IHN0YXRlKTsKICAgICAgICAgcHVibGljIHZvaWQgYW5pbWF0ZUV4cGFuZCgpOwogICAgICAgICBwdWJsaWMgdm9pZCBhbmltYXRlQ29sbGFwc2UoKTsKKyAgICAgICAgcHVibGljIHZvaWQgc2V0TGlnaHRzT24oYm9vbGVhbiBvbik7CiAgICAgfQogCiAgICAgcHVibGljIENvbW1hbmRRdWV1ZShDYWxsYmFja3MgY2FsbGJhY2tzLCBTdGF0dXNCYXJJY29uTGlzdCBsaXN0KSB7CkBAIC0xNDMsNiArMTQ2LDEzIEBACiAgICAgICAgIH0KICAgICB9CiAKKyAgICBwdWJsaWMgdm9pZCBzZXRMaWdodHNPbihib29sZWFuIG9uKSB7CisgICAgICAgIHN5bmNocm9uaXplZCAobUxpc3QpIHsKKyAgICAgICAgICAgIG1IYW5kbGVyLnJlbW92ZU1lc3NhZ2VzKE1TR19TRVRfTElHSFRTX09OKTsKKyAgICAgICAgICAgIG1IYW5kbGVyLm9idGFpbk1lc3NhZ2UoTVNHX1NFVF9MSUdIVFNfT04sIG9uID8gMSA6IDAsIDAsIG51bGwpLnNlbmRUb1RhcmdldCgpOworICAgICAgICB9CisgICAgfQorCiAgICAgcHJpdmF0ZSBmaW5hbCBjbGFzcyBIIGV4dGVuZHMgSGFuZGxlciB7CiAgICAgICAgIHB1YmxpYyB2b2lkIGhhbmRsZU1lc3NhZ2UoTWVzc2FnZSBtc2cpIHsKICAgICAgICAgICAgIGZpbmFsIGludCB3aGF0ID0gbXNnLndoYXQgJiBNU0dfTUFTSzsKQEAgLTE5NCw2ICsyMDQsMTAgQEAKICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgIG1DYWxsYmFja3MuYW5pbWF0ZUNvbGxhcHNlKCk7CiAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBNU0dfU0VUX0xJR0hUU19PTjoKKyAgICAgICAgICAgICAgICAgICAgbUNhbGxiYWNrcy5zZXRMaWdodHNPbihtc2cuYXJnMSAhPSAwKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvc3RhdHVzYmFyL0V4cGFuZGVkVmlldy5qYXZhIGIvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL3N0YXR1c2Jhci9FeHBhbmRlZFZpZXcuamF2YQppbmRleCAzZDg1ZjI3Li5hMmQ0Yjk1IDEwMDY0NAotLS0gYS9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvc3RhdHVzYmFyL0V4cGFuZGVkVmlldy5qYXZhCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9zdGF0dXNiYXIvRXhwYW5kZWRWaWV3LmphdmEKQEAgLTI3LDcgKzI3LDcgQEAKIAogCiBwdWJsaWMgY2xhc3MgRXhwYW5kZWRWaWV3IGV4dGVuZHMgTGluZWFyTGF5b3V0IHsKLSAgICBTdGF0dXNCYXJTZXJ2aWNlIG1TZXJ2aWNlOworICAgIFBob25lU3RhdHVzQmFyU2VydmljZSBtU2VydmljZTsKICAgICBpbnQgbVByZXZIZWlnaHQgPSAtMTsKIAogICAgIHB1YmxpYyBFeHBhbmRlZFZpZXcoQ29udGV4dCBjb250ZXh0LCBBdHRyaWJ1dGVTZXQgYXR0cnMpIHsKQEAgLTUzLDcgKzUzLDcgQEAKICAgICAgICAgICAgICAvL1Nsb2cuZChTdGF0dXNCYXJTZXJ2aWNlLlRBRywgImhlaWdodCBjaGFuZ2VkIG9sZD0iICsgbVByZXZIZWlnaHQKICAgICAgICAgICAgICAvLyAgICAgKyAiIG5ldz0iICsgaGVpZ2h0KTsKICAgICAgICAgICAgICBtUHJldkhlaWdodCA9IGhlaWdodDsKLSAgICAgICAgICAgICBtU2VydmljZS51cGRhdGVFeHBhbmRlZFZpZXdQb3MoU3RhdHVzQmFyU2VydmljZS5FWFBBTkRFRF9MRUFWRV9BTE9ORSk7CisgICAgICAgICAgICAgbVNlcnZpY2UudXBkYXRlRXhwYW5kZWRWaWV3UG9zKFBob25lU3RhdHVzQmFyU2VydmljZS5FWFBBTkRFRF9MRUFWRV9BTE9ORSk7CiAgICAgICAgICB9CiAgICAgIH0KIH0KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9zdGF0dXNiYXIvS2V5QnV0dG9uVmlldy5qYXZhIGIvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL3N0YXR1c2Jhci9LZXlCdXR0b25WaWV3LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjAxYzVlNwotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9zdGF0dXNiYXIvS2V5QnV0dG9uVmlldy5qYXZhCkBAIC0wLDAgKzEsMTQzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5zeXN0ZW11aS5zdGF0dXNiYXI7CisKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlR5cGVkQXJyYXk7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5BbmltYXRpb25EcmF3YWJsZTsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlOworaW1wb3J0IGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uOworaW1wb3J0IGFuZHJvaWQub3MuU3lzdGVtQ2xvY2s7CitpbXBvcnQgYW5kcm9pZC5vcy5TZXJ2aWNlTWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0OworaW1wb3J0IGFuZHJvaWQudXRpbC5TbG9nOworaW1wb3J0IGFuZHJvaWQudmlldy5IYXB0aWNGZWVkYmFja0NvbnN0YW50czsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuSVdpbmRvd01hbmFnZXI7CitpbXBvcnQgYW5kcm9pZC52aWV3LklucHV0RGV2aWNlOworaW1wb3J0IGFuZHJvaWQudmlldy5LZXlFdmVudDsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuTW90aW9uRXZlbnQ7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXdDb25maWd1cmF0aW9uOworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkltYWdlVmlldzsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5SZW1vdGVWaWV3cy5SZW1vdGVWaWV3OworCitpbXBvcnQgY29tLmFuZHJvaWQuc3lzdGVtdWkuUjsKKworcHVibGljIGNsYXNzIEtleUJ1dHRvblZpZXcgZXh0ZW5kcyBJbWFnZVZpZXcgeworICAgIElXaW5kb3dNYW5hZ2VyIG1XaW5kb3dNYW5hZ2VyOworICAgIGxvbmcgbURvd25UaW1lOworICAgIGJvb2xlYW4gbVNlbmRpbmcsIG1Mb25nUHJlc3NlZDsKKyAgICBpbnQgbUNvZGU7CisgICAgaW50IG1SZXBlYXQ7CisgICAgUnVubmFibGUgbUNoZWNrTG9uZ1ByZXNzID0gbmV3IFJ1bm5hYmxlKCkgeworICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICBTbG9nLmQoIktleUJ1dHRvblZpZXciLCAibG9uZ3ByZXNzIik7CisgICAgICAgICAgICBpZiAoaXNQcmVzc2VkKCkpIHsKKyAgICAgICAgICAgICAgICBtTG9uZ1ByZXNzZWQgPSB0cnVlOworICAgICAgICAgICAgICAgIG1SZXBlYXQrKzsKKyAgICAgICAgICAgICAgICBzZW5kRXZlbnQoS2V5RXZlbnQuQUNUSU9OX0RPV04sCisgICAgICAgICAgICAgICAgICAgICAgICBLZXlFdmVudC5GTEFHX0ZST01fU1lTVEVNCisgICAgICAgICAgICAgICAgICAgICAgICB8IEtleUV2ZW50LkZMQUdfVklSVFVBTF9IQVJEX0tFWQorICAgICAgICAgICAgICAgICAgICAgICAgfCBLZXlFdmVudC5GTEFHX0xPTkdfUFJFU1MpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfTsKKworICAgIHB1YmxpYyBLZXlCdXR0b25WaWV3KENvbnRleHQgY29udGV4dCwgQXR0cmlidXRlU2V0IGF0dHJzKSB7CisgICAgICAgIHRoaXMoY29udGV4dCwgYXR0cnMsIDApOworICAgIH0KKworICAgIHB1YmxpYyBLZXlCdXR0b25WaWV3KENvbnRleHQgY29udGV4dCwgQXR0cmlidXRlU2V0IGF0dHJzLCBpbnQgZGVmU3R5bGUpIHsKKyAgICAgICAgc3VwZXIoY29udGV4dCwgYXR0cnMpOworCisgICAgICAgIFR5cGVkQXJyYXkgYSA9IGNvbnRleHQub2J0YWluU3R5bGVkQXR0cmlidXRlcyhhdHRycywgUi5zdHlsZWFibGUuS2V5QnV0dG9uVmlldywKKyAgICAgICAgICAgICAgICBkZWZTdHlsZSwgMCk7CisKKyAgICAgICAgbUNvZGUgPSBhLmdldEludGVnZXIoUi5zdHlsZWFibGUuS2V5QnV0dG9uVmlld19rZXlDb2RlLCAwKTsKKyAgICAgICAgaWYgKG1Db2RlID09IDApIHsKKyAgICAgICAgICAgIFNsb2cudyhTdGF0dXNCYXJTZXJ2aWNlLlRBRywgIktleUJ1dHRvblZpZXcgd2l0aG91dCBrZXkgY29kZSBpZD0weCIKKyAgICAgICAgICAgICAgICAgICAgKyBJbnRlZ2VyLnRvSGV4U3RyaW5nKGdldElkKCkpKTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgYS5yZWN5Y2xlKCk7CisKKyAgICAgICAgbVdpbmRvd01hbmFnZXIgPSBJV2luZG93TWFuYWdlci5TdHViLmFzSW50ZXJmYWNlKAorICAgICAgICAgICAgICAgIFNlcnZpY2VNYW5hZ2VyLmdldFNlcnZpY2UoQ29udGV4dC5XSU5ET1dfU0VSVklDRSkpOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIG9uVG91Y2hFdmVudChNb3Rpb25FdmVudCBldikgeworICAgICAgICBmaW5hbCBpbnQgYWN0aW9uID0gZXYuZ2V0QWN0aW9uKCk7CisgICAgICAgIGludCB4LCB5OworCisgICAgICAgIHN3aXRjaCAoYWN0aW9uKSB7CisgICAgICAgICAgICBjYXNlIE1vdGlvbkV2ZW50LkFDVElPTl9ET1dOOgorICAgICAgICAgICAgICAgIC8vU2xvZy5kKCJLZXlCdXR0b25WaWV3IiwgInByZXNzIik7CisgICAgICAgICAgICAgICAgbURvd25UaW1lID0gU3lzdGVtQ2xvY2sudXB0aW1lTWlsbGlzKCk7CisgICAgICAgICAgICAgICAgbVJlcGVhdCA9IDA7CisgICAgICAgICAgICAgICAgbVNlbmRpbmcgPSB0cnVlOworICAgICAgICAgICAgICAgIG1Mb25nUHJlc3NlZCA9IGZhbHNlOworICAgICAgICAgICAgICAgIHNlbmRFdmVudChLZXlFdmVudC5BQ1RJT05fRE9XTiwKKyAgICAgICAgICAgICAgICAgICAgICAgIEtleUV2ZW50LkZMQUdfRlJPTV9TWVNURU0gfCBLZXlFdmVudC5GTEFHX1ZJUlRVQUxfSEFSRF9LRVksIG1Eb3duVGltZSk7CisgICAgICAgICAgICAgICAgc2V0UHJlc3NlZCh0cnVlKTsKKyAgICAgICAgICAgICAgICByZW1vdmVDYWxsYmFja3MobUNoZWNrTG9uZ1ByZXNzKTsKKyAgICAgICAgICAgICAgICBwb3N0RGVsYXllZChtQ2hlY2tMb25nUHJlc3MsIFZpZXdDb25maWd1cmF0aW9uLmdldExvbmdQcmVzc1RpbWVvdXQoKSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE1vdGlvbkV2ZW50LkFDVElPTl9NT1ZFOgorICAgICAgICAgICAgICAgIGlmIChtU2VuZGluZykgeworICAgICAgICAgICAgICAgICAgICB4ID0gKGludClldi5nZXRYKCk7CisgICAgICAgICAgICAgICAgICAgIHkgPSAoaW50KWV2LmdldFkoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHggPCAwIHx8IHggPj0gZ2V0V2lkdGgoKSB8fCB5IDwgMCB8fCB5ID49IGdldEhlaWdodCgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtU2VuZGluZyA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgc2VuZEV2ZW50KEtleUV2ZW50LkFDVElPTl9VUCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgS2V5RXZlbnQuRkxBR19GUk9NX1NZU1RFTSB8IEtleUV2ZW50LkZMQUdfVklSVFVBTF9IQVJEX0tFWQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgS2V5RXZlbnQuRkxBR19DQU5DRUxFRCk7CisgICAgICAgICAgICAgICAgICAgICAgICBzZXRQcmVzc2VkKGZhbHNlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlbW92ZUNhbGxiYWNrcyhtQ2hlY2tMb25nUHJlc3MpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBNb3Rpb25FdmVudC5BQ1RJT05fVVA6CisgICAgICAgICAgICBjYXNlIE1vdGlvbkV2ZW50LkFDVElPTl9DQU5DRUw6CisgICAgICAgICAgICAgICAgc2V0UHJlc3NlZChmYWxzZSk7CisgICAgICAgICAgICAgICAgaWYgKG1TZW5kaW5nICYmICFtTG9uZ1ByZXNzZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgbVNlbmRpbmcgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgc2VuZEV2ZW50KEtleUV2ZW50LkFDVElPTl9VUCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBLZXlFdmVudC5GTEFHX0ZST01fU1lTVEVNIHwgS2V5RXZlbnQuRkxBR19WSVJUVUFMX0hBUkRfS0VZKTsKKyAgICAgICAgICAgICAgICAgICAgcmVtb3ZlQ2FsbGJhY2tzKG1DaGVja0xvbmdQcmVzcyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgdm9pZCBzZW5kRXZlbnQoaW50IGFjdGlvbiwgaW50IGZsYWdzKSB7CisgICAgICAgIHNlbmRFdmVudChhY3Rpb24sIGZsYWdzLCBTeXN0ZW1DbG9jay51cHRpbWVNaWxsaXMoKSk7CisgICAgfQorCisgICAgdm9pZCBzZW5kRXZlbnQoaW50IGFjdGlvbiwgaW50IGZsYWdzLCBsb25nIHdoZW4pIHsKKyAgICAgICAgZmluYWwgS2V5RXZlbnQgZXYgPSBuZXcgS2V5RXZlbnQobURvd25UaW1lLCB3aGVuLCBhY3Rpb24sIG1Db2RlLCBtUmVwZWF0LAorICAgICAgICAgICAgICAgIDAsIDAsIDAsIGZsYWdzLCBJbnB1dERldmljZS5TT1VSQ0VfS0VZQk9BUkQpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgLy9TbG9nLmQoU3RhdHVzQmFyU2VydmljZS5UQUcsICJpbmplY3RpbmcgZXZlbnQgIiArIGV2KTsKKyAgICAgICAgICAgIG1XaW5kb3dNYW5hZ2VyLmluamVjdElucHV0RXZlbnROb1dhaXQoZXYpOworICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgIC8vIFN5c3RlbSBwcm9jZXNzIGlzIGRlYWQKKyAgICAgICAgfQorICAgIH0KK30KKworCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvc3RhdHVzYmFyL05vdGlmaWNhdGlvbkRhdGEuamF2YSBiL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9zdGF0dXNiYXIvTm90aWZpY2F0aW9uRGF0YS5qYXZhCmluZGV4IDdhODIyNjcuLjQ1YWJlOTMgMTAwNjQ0Ci0tLSBhL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9zdGF0dXNiYXIvTm90aWZpY2F0aW9uRGF0YS5qYXZhCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9zdGF0dXNiYXIvTm90aWZpY2F0aW9uRGF0YS5qYXZhCkBAIC0yMiw2ICsyMiw3IEBACiAKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC5zdGF0dXNiYXIuU3RhdHVzQmFyTm90aWZpY2F0aW9uOwogCitpbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7CiBpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKIAogLyoqCkBAIC0zNSwyNiArMzYsNDcgQEAKICAgICAgICAgcHVibGljIFZpZXcgcm93OyAvLyB0aGUgb3V0ZXIgZXhwYW5kZWQgdmlldwogICAgICAgICBwdWJsaWMgVmlldyBjb250ZW50OyAvLyB0YWtlcyB0aGUgY2xpY2sgZXZlbnRzIGFuZCBzZW5kcyB0aGUgUGVuZGluZ0ludGVudAogICAgICAgICBwdWJsaWMgVmlldyBleHBhbmRlZDsgLy8gdGhlIGluZmxhdGVkIFJlbW90ZVZpZXdzCisgICAgICAgIHB1YmxpYyBFbnRyeSgpIHt9CisgICAgICAgIHB1YmxpYyBFbnRyeShJQmluZGVyIGtleSwgU3RhdHVzQmFyTm90aWZpY2F0aW9uIG4sIFN0YXR1c0Jhckljb25WaWV3IGljKSB7CisgICAgICAgICAgICB0aGlzLmtleSA9IGtleTsKKyAgICAgICAgICAgIHRoaXMubm90aWZpY2F0aW9uID0gbjsKKyAgICAgICAgICAgIHRoaXMuaWNvbiA9IGljOworICAgICAgICB9CiAgICAgfQogICAgIHByaXZhdGUgZmluYWwgQXJyYXlMaXN0PEVudHJ5PiBtRW50cmllcyA9IG5ldyBBcnJheUxpc3Q8RW50cnk+KCk7CisgICAgcHJpdmF0ZSBmaW5hbCBDb21wYXJhdG9yPEVudHJ5PiBtRW50cnlDbXAgPSBuZXcgQ29tcGFyYXRvcjxFbnRyeT4oKSB7CisgICAgICAgIHB1YmxpYyBpbnQgY29tcGFyZShFbnRyeSBhLCBFbnRyeSBiKSB7CisgICAgICAgICAgICByZXR1cm4gKGludCkoYS5ub3RpZmljYXRpb24ubm90aWZpY2F0aW9uLndoZW4gLSBiLm5vdGlmaWNhdGlvbi5ub3RpZmljYXRpb24ud2hlbik7CisgICAgICAgIH0KKyAgICB9OwogCiAgICAgcHVibGljIGludCBzaXplKCkgewogICAgICAgICByZXR1cm4gbUVudHJpZXMuc2l6ZSgpOwogICAgIH0KIAotICAgIHB1YmxpYyBFbnRyeSBnZXRFbnRyeUF0KGludCBpbmRleCkgewotICAgICAgICByZXR1cm4gbUVudHJpZXMuZ2V0KGluZGV4KTsKKyAgICBwdWJsaWMgRW50cnkgZ2V0KGludCBpKSB7CisgICAgICAgIHJldHVybiBtRW50cmllcy5nZXQoaSk7CiAgICAgfQogCi0gICAgcHVibGljIGludCBmaW5kRW50cnkoSUJpbmRlciBrZXkpIHsKLSAgICAgICAgZmluYWwgaW50IE4gPSBtRW50cmllcy5zaXplKCk7Ci0gICAgICAgIGZvciAoaW50IGk9MDsgaTxOOyBpKyspIHsKLSAgICAgICAgICAgIEVudHJ5IGVudHJ5ID0gbUVudHJpZXMuZ2V0KGkpOwotICAgICAgICAgICAgaWYgKGVudHJ5LmtleSA9PSBrZXkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gaTsKKyAgICBwdWJsaWMgRW50cnkgZmluZEJ5S2V5KElCaW5kZXIga2V5KSB7CisgICAgICAgIGZvciAoRW50cnkgZSA6IG1FbnRyaWVzKSB7CisgICAgICAgICAgICBpZiAoZS5rZXkgPT0ga2V5KSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGU7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KLSAgICAgICAgcmV0dXJuIC0xOworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGFkZChFbnRyeSBlbnRyeSkgeworICAgICAgICBpbnQgaTsKKyAgICAgICAgaW50IE4gPSBtRW50cmllcy5zaXplKCk7CisgICAgICAgIGZvciAoaT0wOyBpPE47IGkrKykgeworICAgICAgICAgICAgaWYgKG1FbnRyeUNtcC5jb21wYXJlKG1FbnRyaWVzLmdldChpKSwgZW50cnkpID4gMCkgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIG1FbnRyaWVzLmFkZChpLCBlbnRyeSk7CisgICAgICAgIHJldHVybiBpOwogICAgIH0KIAogICAgIHB1YmxpYyBpbnQgYWRkKElCaW5kZXIga2V5LCBTdGF0dXNCYXJOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uLCBWaWV3IHJvdywgVmlldyBjb250ZW50LApAQCAtNjYsNDIgKzg4LDIzIEBACiAgICAgICAgIGVudHJ5LmNvbnRlbnQgPSBjb250ZW50OwogICAgICAgICBlbnRyeS5leHBhbmRlZCA9IGV4cGFuZGVkOwogICAgICAgICBlbnRyeS5pY29uID0gaWNvbjsKLSAgICAgICAgZmluYWwgaW50IGluZGV4ID0gY2hvb3NlSW5kZXgobm90aWZpY2F0aW9uLm5vdGlmaWNhdGlvbi53aGVuKTsKLSAgICAgICAgbUVudHJpZXMuYWRkKGluZGV4LCBlbnRyeSk7Ci0gICAgICAgIHJldHVybiBpbmRleDsKKyAgICAgICAgcmV0dXJuIGFkZChlbnRyeSk7CiAgICAgfQogCiAgICAgcHVibGljIEVudHJ5IHJlbW92ZShJQmluZGVyIGtleSkgewotICAgICAgICBmaW5hbCBpbnQgTiA9IG1FbnRyaWVzLnNpemUoKTsKLSAgICAgICAgZm9yIChpbnQgaT0wOyBpPE47IGkrKykgewotICAgICAgICAgICAgRW50cnkgZW50cnkgPSBtRW50cmllcy5nZXQoaSk7Ci0gICAgICAgICAgICBpZiAoZW50cnkua2V5ID09IGtleSkgewotICAgICAgICAgICAgICAgIG1FbnRyaWVzLnJlbW92ZShpKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gZW50cnk7Ci0gICAgICAgICAgICB9CisgICAgICAgIEVudHJ5IGUgPSBmaW5kQnlLZXkoa2V5KTsKKyAgICAgICAgaWYgKGUgIT0gbnVsbCkgeworICAgICAgICAgICAgbUVudHJpZXMucmVtb3ZlKGUpOwogICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHByaXZhdGUgaW50IGNob29zZUluZGV4KGZpbmFsIGxvbmcgd2hlbikgewotICAgICAgICBmaW5hbCBpbnQgTiA9IG1FbnRyaWVzLnNpemUoKTsKLSAgICAgICAgZm9yIChpbnQgaT0wOyBpPE47IGkrKykgewotICAgICAgICAgICAgRW50cnkgZW50cnkgPSBtRW50cmllcy5nZXQoaSk7Ci0gICAgICAgICAgICBpZiAoZW50cnkubm90aWZpY2F0aW9uLm5vdGlmaWNhdGlvbi53aGVuID4gd2hlbikgewotICAgICAgICAgICAgICAgIHJldHVybiBpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBOOworICAgICAgICByZXR1cm4gZTsKICAgICB9CiAKICAgICAvKioKICAgICAgKiBSZXR1cm4gd2hldGhlciB0aGVyZSBhcmUgYW55IHZpc2libGUgaXRlbXMgKGkuZS4gaXRlbXMgd2l0aG91dCBhbiBlcnJvcikuCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gaGFzVmlzaWJsZUl0ZW1zKCkgewotICAgICAgICBmaW5hbCBpbnQgTiA9IG1FbnRyaWVzLnNpemUoKTsKLSAgICAgICAgZm9yIChpbnQgaT0wOyBpPE47IGkrKykgewotICAgICAgICAgICAgRW50cnkgZW50cnkgPSBtRW50cmllcy5nZXQoaSk7Ci0gICAgICAgICAgICBpZiAoZW50cnkuZXhwYW5kZWQgIT0gbnVsbCkgeyAvLyB0aGUgdmlldyBzdWNjZXNzZnVsbHkgaW5mbGF0ZWQKKyAgICAgICAgZm9yIChFbnRyeSBlIDogbUVudHJpZXMpIHsKKyAgICAgICAgICAgIGlmIChlLmV4cGFuZGVkICE9IG51bGwpIHsgLy8gdGhlIHZpZXcgc3VjY2Vzc2Z1bGx5IGluZmxhdGVkCiAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KQEAgLTExMiwxMSArMTE1LDkgQEAKICAgICAgKiBSZXR1cm4gd2hldGhlciB0aGVyZSBhcmUgYW55IGNsZWFyYWJsZSBpdGVtcyAodGhhdCBhcmVuJ3QgZXJyb3JzKS4KICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiBoYXNDbGVhcmFibGVJdGVtcygpIHsKLSAgICAgICAgZmluYWwgaW50IE4gPSBtRW50cmllcy5zaXplKCk7Ci0gICAgICAgIGZvciAoaW50IGk9MDsgaTxOOyBpKyspIHsKLSAgICAgICAgICAgIEVudHJ5IGVudHJ5ID0gbUVudHJpZXMuZ2V0KGkpOwotICAgICAgICAgICAgaWYgKGVudHJ5LmV4cGFuZGVkICE9IG51bGwpIHsgLy8gdGhlIHZpZXcgc3VjY2Vzc2Z1bGx5IGluZmxhdGVkCi0gICAgICAgICAgICAgICAgaWYgKChlbnRyeS5ub3RpZmljYXRpb24ubm90aWZpY2F0aW9uLmZsYWdzICYgTm90aWZpY2F0aW9uLkZMQUdfTk9fQ0xFQVIpID09IDApIHsKKyAgICAgICAgZm9yIChFbnRyeSBlIDogbUVudHJpZXMpIHsKKyAgICAgICAgICAgIGlmIChlLmV4cGFuZGVkICE9IG51bGwpIHsgLy8gdGhlIHZpZXcgc3VjY2Vzc2Z1bGx5IGluZmxhdGVkCisgICAgICAgICAgICAgICAgaWYgKChlLm5vdGlmaWNhdGlvbi5ub3RpZmljYXRpb24uZmxhZ3MgJiBOb3RpZmljYXRpb24uRkxBR19OT19DTEVBUikgPT0gMCkgewogICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvc3RhdHVzYmFyL1Bob25lU3RhdHVzQmFyU2VydmljZS5qYXZhIGIvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL3N0YXR1c2Jhci9QaG9uZVN0YXR1c0JhclNlcnZpY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOTQ1OTgxCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL3N0YXR1c2Jhci9QaG9uZVN0YXR1c0JhclNlcnZpY2UuamF2YQpAQCAtMCwwICsxLDE1NjUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLnN5c3RlbXVpLnN0YXR1c2JhcjsKKworaW1wb3J0IGFuZHJvaWQuYXBwLlNlcnZpY2U7CitpbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHlNYW5hZ2VyTmF0aXZlOworaW1wb3J0IGFuZHJvaWQuYXBwLkRpYWxvZzsKK2ltcG9ydCBhbmRyb2lkLmFwcC5Ob3RpZmljYXRpb247CitpbXBvcnQgYW5kcm9pZC5hcHAuUGVuZGluZ0ludGVudDsKK2ltcG9ydCBhbmRyb2lkLmFwcC5TZXJ2aWNlOworaW1wb3J0IGFuZHJvaWQuYXBwLlN0YXR1c0Jhck1hbmFnZXI7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkJyb2FkY2FzdFJlY2VpdmVyOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudEZpbHRlcjsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uUGFja2FnZU1hbmFnZXI7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5SZXNvdXJjZXM7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5QaXhlbEZvcm1hdDsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlJlY3Q7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZTsKK2ltcG9ydCBhbmRyb2lkLm5ldC5Vcmk7CitpbXBvcnQgYW5kcm9pZC5vcy5JQmluZGVyOworaW1wb3J0IGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uOworaW1wb3J0IGFuZHJvaWQub3MuQmluZGVyOworaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLk1lc3NhZ2U7CitpbXBvcnQgYW5kcm9pZC5vcy5TeXN0ZW1DbG9jazsKK2ltcG9ydCBhbmRyb2lkLnRleHQuVGV4dFV0aWxzOworaW1wb3J0IGFuZHJvaWQudXRpbC5TbG9nOworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CitpbXBvcnQgYW5kcm9pZC52aWV3LkRpc3BsYXk7CitpbXBvcnQgYW5kcm9pZC52aWV3LkdyYXZpdHk7CitpbXBvcnQgYW5kcm9pZC52aWV3LktleUV2ZW50OworaW1wb3J0IGFuZHJvaWQudmlldy5MYXlvdXRJbmZsYXRlcjsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuTW90aW9uRXZlbnQ7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZlbG9jaXR5VHJhY2tlcjsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlld0dyb3VwOworaW1wb3J0IGFuZHJvaWQudmlldy5XaW5kb3c7CitpbXBvcnQgYW5kcm9pZC52aWV3LldpbmRvd01hbmFnZXI7CitpbXBvcnQgYW5kcm9pZC52aWV3LldpbmRvd01hbmFnZXJJbXBsOworaW1wb3J0IGFuZHJvaWQudmlldy5hbmltYXRpb24uQW5pbWF0aW9uOworaW1wb3J0IGFuZHJvaWQudmlldy5hbmltYXRpb24uQW5pbWF0aW9uVXRpbHM7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuSW1hZ2VWaWV3OworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkxpbmVhckxheW91dDsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5SZW1vdGVWaWV3czsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5TY3JvbGxWaWV3OworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlRleHRWaWV3OworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkZyYW1lTGF5b3V0OworCitpbXBvcnQgamF2YS5pby5GaWxlRGVzY3JpcHRvcjsKK2ltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLlNldDsKKworaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnN0YXR1c2Jhci5JU3RhdHVzQmFyOworaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnN0YXR1c2Jhci5JU3RhdHVzQmFyU2VydmljZTsKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC5zdGF0dXNiYXIuU3RhdHVzQmFySWNvbjsKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC5zdGF0dXNiYXIuU3RhdHVzQmFySWNvbkxpc3Q7CitpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwuc3RhdHVzYmFyLlN0YXR1c0Jhck5vdGlmaWNhdGlvbjsKKworaW1wb3J0IGNvbS5hbmRyb2lkLnN5c3RlbXVpLlI7CitpbXBvcnQgY29tLmFuZHJvaWQuc3lzdGVtdWkuc3RhdHVzYmFyLnBvbGljeS5TdGF0dXNCYXJQb2xpY3k7CisKKworCitwdWJsaWMgY2xhc3MgUGhvbmVTdGF0dXNCYXJTZXJ2aWNlIGV4dGVuZHMgU3RhdHVzQmFyU2VydmljZSB7CisgICAgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiUGhvbmVTdGF0dXNCYXJTZXJ2aWNlIjsKKyAgICBzdGF0aWMgZmluYWwgYm9vbGVhbiBTUEVXID0gZmFsc2U7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBQ1RJT05fU1RBVFVTQkFSX1NUQVJUCisgICAgICAgICAgICA9ICJjb20uYW5kcm9pZC5pbnRlcm5hbC5wb2xpY3kuc3RhdHVzYmFyLlNUQVJUIjsKKworICAgIHN0YXRpYyBmaW5hbCBpbnQgRVhQQU5ERURfTEVBVkVfQUxPTkUgPSAtMTAwMDA7CisgICAgc3RhdGljIGZpbmFsIGludCBFWFBBTkRFRF9GVUxMX09QRU4gPSAtMTAwMDE7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTVNHX0FOSU1BVEUgPSAxMDAwOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNU0dfQU5JTUFURV9SRVZFQUwgPSAxMDAxOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNU0dfU0hPV19JTlRSVURFUiA9IDEwMDI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1TR19ISURFX0lOVFJVREVSID0gMTAwMzsKKworICAgIC8vIHdpbGwgbGlrZWx5IG1vdmUgdG8gYSByZXNvdXJjZSBvciBvdGhlciB0dW5hYmxlIHBhcmFtIGF0IHNvbWUgcG9pbnQKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgSU5UUlVERVJfQUxFUlRfREVDQVlfTVMgPSAxMDAwMDsKKworICAgIFN0YXR1c0JhclBvbGljeSBtSWNvblBvbGljeTsKKworICAgIGludCBtSWNvblNpemU7CisgICAgRGlzcGxheSBtRGlzcGxheTsKKworICAgIFN0YXR1c0JhclZpZXcgbVN0YXR1c0JhclZpZXc7CisgICAgaW50IG1QaXhlbEZvcm1hdDsKKyAgICBIIG1IYW5kbGVyID0gbmV3IEgoKTsKKyAgICBPYmplY3QgbVF1ZXVlTG9jayA9IG5ldyBPYmplY3QoKTsKKworICAgIC8vIGljb25zCisgICAgTGluZWFyTGF5b3V0IG1JY29uczsKKyAgICBJY29uTWVyZ2VyIG1Ob3RpZmljYXRpb25JY29uczsKKyAgICBMaW5lYXJMYXlvdXQgbVN0YXR1c0ljb25zOworCisgICAgLy8gZXhwYW5kZWQgbm90aWZpY2F0aW9ucworICAgIERpYWxvZyBtRXhwYW5kZWREaWFsb2c7CisgICAgRXhwYW5kZWRWaWV3IG1FeHBhbmRlZFZpZXc7CisgICAgV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMgbUV4cGFuZGVkUGFyYW1zOworICAgIFNjcm9sbFZpZXcgbVNjcm9sbFZpZXc7CisgICAgVmlldyBtTm90aWZpY2F0aW9uTGluZWFyTGF5b3V0OworICAgIFZpZXcgbUV4cGFuZGVkQ29udGVudHM7CisgICAgLy8gdG9wIGJhcgorICAgIFRleHRWaWV3IG1Ob05vdGlmaWNhdGlvbnNUaXRsZTsKKyAgICBUZXh0VmlldyBtQ2xlYXJCdXR0b247CisgICAgLy8gZHJhZyBiYXIKKyAgICBDbG9zZURyYWdIYW5kbGUgbUNsb3NlVmlldzsKKyAgICAvLyBvbmdvaW5nCisgICAgTm90aWZpY2F0aW9uRGF0YSBtT25nb2luZyA9IG5ldyBOb3RpZmljYXRpb25EYXRhKCk7CisgICAgVGV4dFZpZXcgbU9uZ29pbmdUaXRsZTsKKyAgICBMaW5lYXJMYXlvdXQgbU9uZ29pbmdJdGVtczsKKyAgICAvLyBsYXRlc3QKKyAgICBOb3RpZmljYXRpb25EYXRhIG1MYXRlc3QgPSBuZXcgTm90aWZpY2F0aW9uRGF0YSgpOworICAgIFRleHRWaWV3IG1MYXRlc3RUaXRsZTsKKyAgICBMaW5lYXJMYXlvdXQgbUxhdGVzdEl0ZW1zOworICAgIC8vIHBvc2l0aW9uCisgICAgaW50W10gbVBvc2l0aW9uVG1wID0gbmV3IGludFsyXTsKKyAgICBib29sZWFuIG1FeHBhbmRlZDsKKyAgICBib29sZWFuIG1FeHBhbmRlZFZpc2libGU7CisKKyAgICAvLyB0aGUgZGF0ZSB2aWV3CisgICAgRGF0ZVZpZXcgbURhdGVWaWV3OworCisgICAgLy8gZm9yIGltbWVyc2l2ZSBhY3Rpdml0aWVzCisgICAgcHJpdmF0ZSBWaWV3IG1JbnRydWRlckFsZXJ0VmlldzsKKworICAgIC8vIHRoZSB0cmFja2VyIHZpZXcKKyAgICBUcmFja2luZ1ZpZXcgbVRyYWNraW5nVmlldzsKKyAgICBXaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcyBtVHJhY2tpbmdQYXJhbXM7CisgICAgaW50IG1UcmFja2luZ1Bvc2l0aW9uOyAvLyB0aGUgcG9zaXRpb24gb2YgdGhlIHRvcCBvZiB0aGUgdHJhY2tpbmcgdmlldy4KKyAgICBwcml2YXRlIGJvb2xlYW4gbVBhbmVsU2xpZ2h0bHlWaXNpYmxlOworCisgICAgLy8gdGlja2VyCisgICAgcHJpdmF0ZSBUaWNrZXIgbVRpY2tlcjsKKyAgICBwcml2YXRlIFZpZXcgbVRpY2tlclZpZXc7CisgICAgcHJpdmF0ZSBib29sZWFuIG1UaWNraW5nOworCisgICAgLy8gVHJhY2tpbmcgZmluZ2VyIGZvciBvcGVuaW5nL2Nsb3NpbmcuCisgICAgaW50IG1FZGdlQm9yZGVyOyAvLyBjb3JyZXNwb25kcyB0byBSLmRpbWVuLnN0YXR1c19iYXJfZWRnZV9pZ25vcmUKKyAgICBib29sZWFuIG1UcmFja2luZzsKKyAgICBWZWxvY2l0eVRyYWNrZXIgbVZlbG9jaXR5VHJhY2tlcjsKKworICAgIHN0YXRpYyBmaW5hbCBpbnQgQU5JTV9GUkFNRV9EVVJBVElPTiA9ICgxMDAwLzYwKTsKKworICAgIGJvb2xlYW4gbUFuaW1hdGluZzsKKyAgICBsb25nIG1DdXJBbmltYXRpb25UaW1lOworICAgIGZsb2F0IG1EaXNwbGF5SGVpZ2h0OworICAgIGZsb2F0IG1BbmltWTsKKyAgICBmbG9hdCBtQW5pbVZlbDsKKyAgICBmbG9hdCBtQW5pbUFjY2VsOworICAgIGxvbmcgbUFuaW1MYXN0VGltZTsKKyAgICBib29sZWFuIG1BbmltYXRpbmdSZXZlYWwgPSBmYWxzZTsKKyAgICBpbnQgbVZpZXdEZWx0YTsKKyAgICBpbnRbXSBtQWJzUG9zID0gbmV3IGludFsyXTsKKworICAgIC8vIGZvciBkaXNhYmxpbmcgdGhlIHN0YXR1cyBiYXIKKyAgICBpbnQgbURpc2FibGVkID0gMDsKKworICAgIHByaXZhdGUgY2xhc3MgRXhwYW5kZWREaWFsb2cgZXh0ZW5kcyBEaWFsb2cgeworICAgICAgICBFeHBhbmRlZERpYWxvZyhDb250ZXh0IGNvbnRleHQpIHsKKyAgICAgICAgICAgIHN1cGVyKGNvbnRleHQsIGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGUuVGhlbWVfTGlnaHRfTm9UaXRsZUJhcik7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gZGlzcGF0Y2hLZXlFdmVudChLZXlFdmVudCBldmVudCkgeworICAgICAgICAgICAgYm9vbGVhbiBkb3duID0gZXZlbnQuZ2V0QWN0aW9uKCkgPT0gS2V5RXZlbnQuQUNUSU9OX0RPV047CisgICAgICAgICAgICBzd2l0Y2ggKGV2ZW50LmdldEtleUNvZGUoKSkgeworICAgICAgICAgICAgY2FzZSBLZXlFdmVudC5LRVlDT0RFX0JBQ0s6CisgICAgICAgICAgICAgICAgaWYgKCFkb3duKSB7CisgICAgICAgICAgICAgICAgICAgIGFuaW1hdGVDb2xsYXBzZSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBzdXBlci5kaXNwYXRjaEtleUV2ZW50KGV2ZW50KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9uQ3JlYXRlKCkgeworICAgICAgICBtRGlzcGxheSA9ICgoV2luZG93TWFuYWdlcilnZXRTeXN0ZW1TZXJ2aWNlKENvbnRleHQuV0lORE9XX1NFUlZJQ0UpKS5nZXREZWZhdWx0RGlzcGxheSgpOworCisgICAgICAgIHN1cGVyLm9uQ3JlYXRlKCk7CisKKyAgICAgICAgYWRkSW50cnVkZXJWaWV3KCk7CisKKyAgICAgICAgLy8gTGFzdGx5LCBjYWxsIHRvIHRoZSBpY29uIHBvbGljeSB0byBpbnN0YWxsL3VwZGF0ZSBhbGwgdGhlIGljb25zLgorICAgICAgICBtSWNvblBvbGljeSA9IG5ldyBTdGF0dXNCYXJQb2xpY3kodGhpcyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb25EZXN0cm95KCkgeworICAgICAgICAvLyB3ZSdyZSBuZXZlciBkZXN0cm95ZWQKKyAgICB9CisKKyAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIC8vIENvbnN0cnVjdGluZyB0aGUgdmlldworICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgcHJvdGVjdGVkIFZpZXcgbWFrZVN0YXR1c0JhclZpZXcoKSB7CisgICAgICAgIGZpbmFsIENvbnRleHQgY29udGV4dCA9IHRoaXM7CisKKyAgICAgICAgUmVzb3VyY2VzIHJlcyA9IGNvbnRleHQuZ2V0UmVzb3VyY2VzKCk7CisKKyAgICAgICAgbUljb25TaXplID0gcmVzLmdldERpbWVuc2lvblBpeGVsU2l6ZShjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmRpbWVuLnN0YXR1c19iYXJfaWNvbl9zaXplKTsKKworICAgICAgICBFeHBhbmRlZFZpZXcgZXhwYW5kZWQgPSAoRXhwYW5kZWRWaWV3KVZpZXcuaW5mbGF0ZShjb250ZXh0LAorICAgICAgICAgICAgICAgIFIubGF5b3V0LnN0YXR1c19iYXJfZXhwYW5kZWQsIG51bGwpOworICAgICAgICBleHBhbmRlZC5tU2VydmljZSA9IHRoaXM7CisKKyAgICAgICAgbUludHJ1ZGVyQWxlcnRWaWV3ID0gVmlldy5pbmZsYXRlKGNvbnRleHQsIFIubGF5b3V0LmludHJ1ZGVyX2FsZXJ0LCBudWxsKTsKKyAgICAgICAgbUludHJ1ZGVyQWxlcnRWaWV3LnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKKyAgICAgICAgbUludHJ1ZGVyQWxlcnRWaWV3LnNldENsaWNrYWJsZSh0cnVlKTsKKworICAgICAgICBTdGF0dXNCYXJWaWV3IHNiID0gKFN0YXR1c0JhclZpZXcpVmlldy5pbmZsYXRlKGNvbnRleHQsIFIubGF5b3V0LnN0YXR1c19iYXIsIG51bGwpOworICAgICAgICBzYi5tU2VydmljZSA9IHRoaXM7CisKKyAgICAgICAgLy8gZmlndXJlIG91dCB3aGljaCBwaXhlbC1mb3JtYXQgdG8gdXNlIGZvciB0aGUgc3RhdHVzIGJhci4KKyAgICAgICAgbVBpeGVsRm9ybWF0ID0gUGl4ZWxGb3JtYXQuVFJBTlNMVUNFTlQ7CisgICAgICAgIERyYXdhYmxlIGJnID0gc2IuZ2V0QmFja2dyb3VuZCgpOworICAgICAgICBpZiAoYmcgIT0gbnVsbCkgeworICAgICAgICAgICAgbVBpeGVsRm9ybWF0ID0gYmcuZ2V0T3BhY2l0eSgpOworICAgICAgICB9CisKKyAgICAgICAgbVN0YXR1c0JhclZpZXcgPSBzYjsKKyAgICAgICAgbVN0YXR1c0ljb25zID0gKExpbmVhckxheW91dClzYi5maW5kVmlld0J5SWQoUi5pZC5zdGF0dXNJY29ucyk7CisgICAgICAgIG1Ob3RpZmljYXRpb25JY29ucyA9IChJY29uTWVyZ2VyKXNiLmZpbmRWaWV3QnlJZChSLmlkLm5vdGlmaWNhdGlvbkljb25zKTsKKyAgICAgICAgbUljb25zID0gKExpbmVhckxheW91dClzYi5maW5kVmlld0J5SWQoUi5pZC5pY29ucyk7CisgICAgICAgIG1UaWNrZXJWaWV3ID0gc2IuZmluZFZpZXdCeUlkKFIuaWQudGlja2VyKTsKKyAgICAgICAgbURhdGVWaWV3ID0gKERhdGVWaWV3KXNiLmZpbmRWaWV3QnlJZChSLmlkLmRhdGUpOworCisgICAgICAgIG1FeHBhbmRlZERpYWxvZyA9IG5ldyBFeHBhbmRlZERpYWxvZyhjb250ZXh0KTsKKyAgICAgICAgbUV4cGFuZGVkVmlldyA9IGV4cGFuZGVkOworICAgICAgICBtRXhwYW5kZWRDb250ZW50cyA9IGV4cGFuZGVkLmZpbmRWaWV3QnlJZChSLmlkLm5vdGlmaWNhdGlvbkxpbmVhckxheW91dCk7CisgICAgICAgIG1PbmdvaW5nVGl0bGUgPSAoVGV4dFZpZXcpZXhwYW5kZWQuZmluZFZpZXdCeUlkKFIuaWQub25nb2luZ1RpdGxlKTsKKyAgICAgICAgbU9uZ29pbmdJdGVtcyA9IChMaW5lYXJMYXlvdXQpZXhwYW5kZWQuZmluZFZpZXdCeUlkKFIuaWQub25nb2luZ0l0ZW1zKTsKKyAgICAgICAgbUxhdGVzdFRpdGxlID0gKFRleHRWaWV3KWV4cGFuZGVkLmZpbmRWaWV3QnlJZChSLmlkLmxhdGVzdFRpdGxlKTsKKyAgICAgICAgbUxhdGVzdEl0ZW1zID0gKExpbmVhckxheW91dClleHBhbmRlZC5maW5kVmlld0J5SWQoUi5pZC5sYXRlc3RJdGVtcyk7CisgICAgICAgIG1Ob05vdGlmaWNhdGlvbnNUaXRsZSA9IChUZXh0VmlldylleHBhbmRlZC5maW5kVmlld0J5SWQoUi5pZC5ub05vdGlmaWNhdGlvbnNUaXRsZSk7CisgICAgICAgIG1DbGVhckJ1dHRvbiA9IChUZXh0VmlldylleHBhbmRlZC5maW5kVmlld0J5SWQoUi5pZC5jbGVhcl9hbGxfYnV0dG9uKTsKKyAgICAgICAgbUNsZWFyQnV0dG9uLnNldE9uQ2xpY2tMaXN0ZW5lcihtQ2xlYXJCdXR0b25MaXN0ZW5lcik7CisgICAgICAgIG1TY3JvbGxWaWV3ID0gKFNjcm9sbFZpZXcpZXhwYW5kZWQuZmluZFZpZXdCeUlkKFIuaWQuc2Nyb2xsKTsKKyAgICAgICAgbU5vdGlmaWNhdGlvbkxpbmVhckxheW91dCA9IGV4cGFuZGVkLmZpbmRWaWV3QnlJZChSLmlkLm5vdGlmaWNhdGlvbkxpbmVhckxheW91dCk7CisKKyAgICAgICAgbU9uZ29pbmdUaXRsZS5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7CisgICAgICAgIG1MYXRlc3RUaXRsZS5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7CisKKyAgICAgICAgbVRpY2tlciA9IG5ldyBNeVRpY2tlcihjb250ZXh0LCBzYik7CisKKyAgICAgICAgVGlja2VyVmlldyB0aWNrZXJWaWV3ID0gKFRpY2tlclZpZXcpc2IuZmluZFZpZXdCeUlkKFIuaWQudGlja2VyVGV4dCk7CisgICAgICAgIHRpY2tlclZpZXcubVRpY2tlciA9IG1UaWNrZXI7CisKKyAgICAgICAgbVRyYWNraW5nVmlldyA9IChUcmFja2luZ1ZpZXcpVmlldy5pbmZsYXRlKGNvbnRleHQsIFIubGF5b3V0LnN0YXR1c19iYXJfdHJhY2tpbmcsIG51bGwpOworICAgICAgICBtVHJhY2tpbmdWaWV3Lm1TZXJ2aWNlID0gdGhpczsKKyAgICAgICAgbUNsb3NlVmlldyA9IChDbG9zZURyYWdIYW5kbGUpbVRyYWNraW5nVmlldy5maW5kVmlld0J5SWQoUi5pZC5jbG9zZSk7CisgICAgICAgIG1DbG9zZVZpZXcubVNlcnZpY2UgPSB0aGlzOworCisgICAgICAgIG1FZGdlQm9yZGVyID0gcmVzLmdldERpbWVuc2lvblBpeGVsU2l6ZShSLmRpbWVuLnN0YXR1c19iYXJfZWRnZV9pZ25vcmUpOworCisgICAgICAgIC8vIHRoZSBtb3JlIG5vdGlmaWNhdGlvbnMgaWNvbgorICAgICAgICBTdGF0dXNCYXJJY29uVmlldyBtb3JlVmlldyA9IG5ldyBTdGF0dXNCYXJJY29uVmlldyh0aGlzLCAibW9yZSIpOworICAgICAgICBtb3JlVmlldy5zZXQobmV3IFN0YXR1c0Jhckljb24obnVsbCwgUi5kcmF3YWJsZS5zdGF0X25vdGlmeV9tb3JlLCAwKSk7CisgICAgICAgIG1Ob3RpZmljYXRpb25JY29ucy5hZGRNb3JlVmlldyhtb3JlVmlldywKKyAgICAgICAgICAgICAgICBuZXcgTGluZWFyTGF5b3V0LkxheW91dFBhcmFtcyhtSWNvblNpemUsIG1JY29uU2l6ZSkpOworCisgICAgICAgIC8vIHNldCB0aGUgaW5pdGFsIHZpZXcgdmlzaWJpbGl0eQorICAgICAgICBzZXRBcmVUaGVyZU5vdGlmaWNhdGlvbnMoKTsKKyAgICAgICAgbURhdGVWaWV3LnNldFZpc2liaWxpdHkoVmlldy5JTlZJU0lCTEUpOworCisgICAgICAgIC8vIHJlY2VpdmUgYnJvYWRjYXN0cworICAgICAgICBJbnRlbnRGaWx0ZXIgZmlsdGVyID0gbmV3IEludGVudEZpbHRlcigpOworICAgICAgICBmaWx0ZXIuYWRkQWN0aW9uKEludGVudC5BQ1RJT05fQ09ORklHVVJBVElPTl9DSEFOR0VEKTsKKyAgICAgICAgZmlsdGVyLmFkZEFjdGlvbihJbnRlbnQuQUNUSU9OX0NMT1NFX1NZU1RFTV9ESUFMT0dTKTsKKyAgICAgICAgZmlsdGVyLmFkZEFjdGlvbihJbnRlbnQuQUNUSU9OX1NDUkVFTl9PRkYpOworICAgICAgICBjb250ZXh0LnJlZ2lzdGVyUmVjZWl2ZXIobUJyb2FkY2FzdFJlY2VpdmVyLCBmaWx0ZXIpOworCisgICAgICAgIHJldHVybiBzYjsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgaW50IGdldFN0YXR1c0JhckdyYXZpdHkoKSB7CisgICAgICAgIHJldHVybiBHcmF2aXR5LlRPUCB8IEdyYXZpdHkuRklMTF9IT1JJWk9OVEFMOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBhZGRJbnRydWRlclZpZXcoKSB7CisgICAgICAgIGZpbmFsIFJlc291cmNlcyByZXMgPSBnZXRSZXNvdXJjZXMoKTsKKyAgICAgICAgZmluYWwgaW50IGhlaWdodD0gcmVzLmdldERpbWVuc2lvblBpeGVsU2l6ZShjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmRpbWVuLnN0YXR1c19iYXJfaGVpZ2h0KTsKKworICAgICAgICBXaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcyBscCA9IG5ldyBXaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcygKKyAgICAgICAgICAgICAgICBWaWV3R3JvdXAuTGF5b3V0UGFyYW1zLk1BVENIX1BBUkVOVCwKKyAgICAgICAgICAgICAgICBWaWV3R3JvdXAuTGF5b3V0UGFyYW1zLldSQVBfQ09OVEVOVCwKKyAgICAgICAgICAgICAgICBXaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcy5UWVBFX1NUQVRVU19CQVJfUEFORUwsCisgICAgICAgICAgICAgICAgV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMuRkxBR19MQVlPVVRfSU5fU0NSRUVOCisgICAgICAgICAgICAgICAgICAgIHwgV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMuRkxBR19MQVlPVVRfTk9fTElNSVRTCisgICAgICAgICAgICAgICAgICAgIHwgV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMuRkxBR19OT1RfVE9VQ0hfTU9EQUwKKyAgICAgICAgICAgICAgICAgICAgfCBXaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcy5GTEFHX05PVF9GT0NVU0FCTEUKKyAgICAgICAgICAgICAgICAgICAgfCBXaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcy5GTEFHX0FMVF9GT0NVU0FCTEVfSU0sCisgICAgICAgICAgICAgICAgUGl4ZWxGb3JtYXQuVFJBTlNMVUNFTlQpOworICAgICAgICBscC5ncmF2aXR5ID0gR3Jhdml0eS5UT1AgfCBHcmF2aXR5LkZJTExfSE9SSVpPTlRBTDsKKyAgICAgICAgbHAueSArPSBoZWlnaHQgKiAxLjU7IC8vIEZJWE1FCisgICAgICAgIGxwLnNldFRpdGxlKCJJbnRydWRlckFsZXJ0Iik7CisgICAgICAgIGxwLndpbmRvd0FuaW1hdGlvbnMgPSBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlLkFuaW1hdGlvbl9TdGF0dXNCYXJfSW50cnVkZXJBbGVydDsKKworICAgICAgICBXaW5kb3dNYW5hZ2VySW1wbC5nZXREZWZhdWx0KCkuYWRkVmlldyhtSW50cnVkZXJBbGVydFZpZXcsIGxwKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBhZGRJY29uKFN0cmluZyBzbG90LCBpbnQgaW5kZXgsIGludCB2aWV3SW5kZXgsIFN0YXR1c0Jhckljb24gaWNvbikgeworICAgICAgICBpZiAoU1BFVykgU2xvZy5kKFRBRywgImFkZEljb24gc2xvdD0iICsgc2xvdCArICIgaW5kZXg9IiArIGluZGV4ICsgIiB2aWV3SW5kZXg9IiArIHZpZXdJbmRleAorICAgICAgICAgICAgICAgICsgIiBpY29uPSIgKyBpY29uKTsKKyAgICAgICAgU3RhdHVzQmFySWNvblZpZXcgdmlldyA9IG5ldyBTdGF0dXNCYXJJY29uVmlldyh0aGlzLCBzbG90KTsKKyAgICAgICAgdmlldy5zZXQoaWNvbik7CisgICAgICAgIG1TdGF0dXNJY29ucy5hZGRWaWV3KHZpZXcsIHZpZXdJbmRleCwgbmV3IExpbmVhckxheW91dC5MYXlvdXRQYXJhbXMobUljb25TaXplLCBtSWNvblNpemUpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB1cGRhdGVJY29uKFN0cmluZyBzbG90LCBpbnQgaW5kZXgsIGludCB2aWV3SW5kZXgsCisgICAgICAgICAgICBTdGF0dXNCYXJJY29uIG9sZCwgU3RhdHVzQmFySWNvbiBpY29uKSB7CisgICAgICAgIGlmIChTUEVXKSBTbG9nLmQoVEFHLCAidXBkYXRlSWNvbiBzbG90PSIgKyBzbG90ICsgIiBpbmRleD0iICsgaW5kZXggKyAiIHZpZXdJbmRleD0iICsgdmlld0luZGV4CisgICAgICAgICAgICAgICAgKyAiIG9sZD0iICsgb2xkICsgIiBpY29uPSIgKyBpY29uKTsKKyAgICAgICAgU3RhdHVzQmFySWNvblZpZXcgdmlldyA9IChTdGF0dXNCYXJJY29uVmlldyltU3RhdHVzSWNvbnMuZ2V0Q2hpbGRBdCh2aWV3SW5kZXgpOworICAgICAgICB2aWV3LnNldChpY29uKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCByZW1vdmVJY29uKFN0cmluZyBzbG90LCBpbnQgaW5kZXgsIGludCB2aWV3SW5kZXgpIHsKKyAgICAgICAgaWYgKFNQRVcpIFNsb2cuZChUQUcsICJyZW1vdmVJY29uIHNsb3Q9IiArIHNsb3QgKyAiIGluZGV4PSIgKyBpbmRleCArICIgdmlld0luZGV4PSIgKyB2aWV3SW5kZXgpOworICAgICAgICBtU3RhdHVzSWNvbnMucmVtb3ZlVmlld0F0KHZpZXdJbmRleCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgYWRkTm90aWZpY2F0aW9uKElCaW5kZXIga2V5LCBTdGF0dXNCYXJOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7CisgICAgICAgIFN0YXR1c0Jhckljb25WaWV3IGljb25WaWV3ID0gYWRkTm90aWZpY2F0aW9uVmlld3Moa2V5LCBub3RpZmljYXRpb24pOworICAgICAgICBpZiAoaWNvblZpZXcgPT0gbnVsbCkgcmV0dXJuOworCisgICAgICAgIGJvb2xlYW4gaW1tZXJzaXZlID0gZmFsc2U7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbW1lcnNpdmUgPSBBY3Rpdml0eU1hbmFnZXJOYXRpdmUuZ2V0RGVmYXVsdCgpLmlzVG9wQWN0aXZpdHlJbW1lcnNpdmUoKTsKKyAgICAgICAgICAgIFNsb2cuZChUQUcsICJUb3AgYWN0aXZpdHkgaXMgIiArIChpbW1lcnNpdmU/ImltbWVyc2l2ZSI6Im5vdCBpbW1lcnNpdmUiKSk7CisgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBleCkgeworICAgICAgICB9CisgICAgICAgIGlmIChpbW1lcnNpdmUpIHsKKyAgICAgICAgICAgIGlmICgobm90aWZpY2F0aW9uLm5vdGlmaWNhdGlvbi5mbGFncyAmIE5vdGlmaWNhdGlvbi5GTEFHX0hJR0hfUFJJT1JJVFkpICE9IDApIHsKKyAgICAgICAgICAgICAgICBTbG9nLmQoVEFHLCAiUHJlc2VudGluZyBoaWdoLXByaW9yaXR5IG5vdGlmaWNhdGlvbiBpbiBpbW1lcnNpdmUgYWN0aXZpdHkiKTsKKyAgICAgICAgICAgICAgICAvLyBzcGVjaWFsIG5ldyB0cmFuc2llbnQgdGlja2VyIG1vZGUKKyAgICAgICAgICAgICAgICAvLyAxLiBQb3B1bGF0ZSBtSW50cnVkZXJBbGVydFZpZXcKKworICAgICAgICAgICAgICAgIEltYWdlVmlldyBhbGVydEljb24gPSAoSW1hZ2VWaWV3KSBtSW50cnVkZXJBbGVydFZpZXcuZmluZFZpZXdCeUlkKFIuaWQuYWxlcnRJY29uKTsKKyAgICAgICAgICAgICAgICBUZXh0VmlldyBhbGVydFRleHQgPSAoVGV4dFZpZXcpIG1JbnRydWRlckFsZXJ0Vmlldy5maW5kVmlld0J5SWQoUi5pZC5hbGVydFRleHQpOworICAgICAgICAgICAgICAgIGFsZXJ0SWNvbi5zZXRJbWFnZURyYXdhYmxlKFN0YXR1c0Jhckljb25WaWV3LmdldEljb24oCisgICAgICAgICAgICAgICAgICAgIGFsZXJ0SWNvbi5nZXRDb250ZXh0KCksCisgICAgICAgICAgICAgICAgICAgIGljb25WaWV3LmdldFN0YXR1c0Jhckljb24oKSkpOworICAgICAgICAgICAgICAgIGFsZXJ0VGV4dC5zZXRUZXh0KG5vdGlmaWNhdGlvbi5ub3RpZmljYXRpb24udGlja2VyVGV4dCk7CisKKyAgICAgICAgICAgICAgICBWaWV3IGJ1dHRvbiA9IG1JbnRydWRlckFsZXJ0Vmlldy5maW5kVmlld0J5SWQoUi5pZC5pbnRydWRlcl9hbGVydF9jb250ZW50KTsKKyAgICAgICAgICAgICAgICBidXR0b24uc2V0T25DbGlja0xpc3RlbmVyKAorICAgICAgICAgICAgICAgICAgICBuZXcgTGF1bmNoZXIobm90aWZpY2F0aW9uLm5vdGlmaWNhdGlvbi5jb250ZW50SW50ZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgbm90aWZpY2F0aW9uLnBrZywgbm90aWZpY2F0aW9uLnRhZywgbm90aWZpY2F0aW9uLmlkKSk7CisKKyAgICAgICAgICAgICAgICAvLyAyLiBBbmltYXRlIG1JbnRydWRlckFsZXJ0VmlldyBpbgorICAgICAgICAgICAgICAgIG1IYW5kbGVyLnNlbmRFbXB0eU1lc3NhZ2UoTVNHX1NIT1dfSU5UUlVERVIpOworCisgICAgICAgICAgICAgICAgLy8gMy4gU2V0IGFsYXJtIHRvIGFnZSB0aGUgbm90aWZpY2F0aW9uIG9mZiAoVE9ETykKKyAgICAgICAgICAgICAgICBtSGFuZGxlci5yZW1vdmVNZXNzYWdlcyhNU0dfSElERV9JTlRSVURFUik7CisgICAgICAgICAgICAgICAgbUhhbmRsZXIuc2VuZEVtcHR5TWVzc2FnZURlbGF5ZWQoTVNHX0hJREVfSU5UUlVERVIsIElOVFJVREVSX0FMRVJUX0RFQ0FZX01TKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmIChub3RpZmljYXRpb24ubm90aWZpY2F0aW9uLmZ1bGxTY3JlZW5JbnRlbnQgIT0gbnVsbCkgeworICAgICAgICAgICAgLy8gbm90IGltbWVyc2l2ZSAmIGEgZnVsbC1zY3JlZW4gYWxlcnQgc2hvdWxkIGJlIHNob3duCisgICAgICAgICAgICBTbG9nLmQoVEFHLCAiTm90aWZpY2F0aW9uIGhhcyBmdWxsU2NyZWVuSW50ZW50IGFuZCBhY3Rpdml0eSBpcyBub3QgaW1tZXJzaXZlOyIKKyAgICAgICAgICAgICAgICAgICAgKyAiIHNlbmRpbmcgZnVsbFNjcmVlbkludGVudCIpOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBub3RpZmljYXRpb24ubm90aWZpY2F0aW9uLmZ1bGxTY3JlZW5JbnRlbnQuc2VuZCgpOworICAgICAgICAgICAgfSBjYXRjaCAoUGVuZGluZ0ludGVudC5DYW5jZWxlZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyB1c3VhbCBjYXNlOiBzdGF0dXMgYmFyIHZpc2libGUgJiBub3QgaW1tZXJzaXZlCisKKyAgICAgICAgICAgIC8vIHNob3cgdGhlIHRpY2tlcgorICAgICAgICAgICAgdGljayhub3RpZmljYXRpb24pOworICAgICAgICB9CisKKyAgICAgICAgLy8gUmVjYWxjdWxhdGUgdGhlIHBvc2l0aW9uIG9mIHRoZSBzbGlkaW5nIHdpbmRvd3MgYW5kIHRoZSB0aXRsZXMuCisgICAgICAgIHNldEFyZVRoZXJlTm90aWZpY2F0aW9ucygpOworICAgICAgICB1cGRhdGVFeHBhbmRlZFZpZXdQb3MoRVhQQU5ERURfTEVBVkVfQUxPTkUpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHVwZGF0ZU5vdGlmaWNhdGlvbihJQmluZGVyIGtleSwgU3RhdHVzQmFyTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgeworICAgICAgICBTbG9nLmQoVEFHLCAidXBkYXRlTm90aWZpY2F0aW9uIGtleT0iICsga2V5ICsgIiBub3RpZmljYXRpb249IiArIG5vdGlmaWNhdGlvbik7CisKKyAgICAgICAgTm90aWZpY2F0aW9uRGF0YSBvbGRMaXN0OworICAgICAgICBOb3RpZmljYXRpb25EYXRhLkVudHJ5IG9sZEVudHJ5ID0gbU9uZ29pbmcuZmluZEJ5S2V5KGtleSk7CisgICAgICAgIGlmIChvbGRFbnRyeSAhPSBudWxsKSB7CisgICAgICAgICAgICBvbGRMaXN0ID0gbU9uZ29pbmc7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBvbGRFbnRyeSA9IG1MYXRlc3QuZmluZEJ5S2V5KGtleSk7CisgICAgICAgICAgICBpZiAob2xkRW50cnkgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIFNsb2cudyhUQUcsICJ1cGRhdGVOb3RpZmljYXRpb24gZm9yIHVua25vd24ga2V5OiAiICsga2V5KTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBvbGRMaXN0ID0gbUxhdGVzdDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbCBTdGF0dXNCYXJOb3RpZmljYXRpb24gb2xkTm90aWZpY2F0aW9uID0gb2xkRW50cnkubm90aWZpY2F0aW9uOworICAgICAgICBmaW5hbCBSZW1vdGVWaWV3cyBvbGRDb250ZW50VmlldyA9IG9sZE5vdGlmaWNhdGlvbi5ub3RpZmljYXRpb24uY29udGVudFZpZXc7CisKKyAgICAgICAgZmluYWwgUmVtb3RlVmlld3MgY29udGVudFZpZXcgPSBub3RpZmljYXRpb24ubm90aWZpY2F0aW9uLmNvbnRlbnRWaWV3OworCisgICAgICAgIGlmIChmYWxzZSkgeworICAgICAgICAgICAgU2xvZy5kKFRBRywgIm9sZCBub3RpZmljYXRpb246IHdoZW49IiArIG9sZE5vdGlmaWNhdGlvbi5ub3RpZmljYXRpb24ud2hlbgorICAgICAgICAgICAgICAgICAgICArICIgb25nb2luZz0iICsgb2xkTm90aWZpY2F0aW9uLmlzT25nb2luZygpCisgICAgICAgICAgICAgICAgICAgICsgIiBleHBhbmRlZD0iICsgb2xkRW50cnkuZXhwYW5kZWQKKyAgICAgICAgICAgICAgICAgICAgKyAiIGNvbnRlbnRWaWV3PSIgKyBvbGRDb250ZW50Vmlldyk7CisgICAgICAgICAgICBTbG9nLmQoVEFHLCAibmV3IG5vdGlmaWNhdGlvbjogd2hlbj0iICsgbm90aWZpY2F0aW9uLm5vdGlmaWNhdGlvbi53aGVuCisgICAgICAgICAgICAgICAgICAgICsgIiBvbmdvaW5nPSIgKyBvbGROb3RpZmljYXRpb24uaXNPbmdvaW5nKCkKKyAgICAgICAgICAgICAgICAgICAgKyAiIGNvbnRlbnRWaWV3PSIgKyBjb250ZW50Vmlldyk7CisgICAgICAgIH0KKworICAgICAgICAvLyBDYW4gd2UganVzdCByZWFwcGx5IHRoZSBSZW1vdGVWaWV3cyBpbiBwbGFjZT8gIElmIHdoZW4gZGlkbid0IGNoYW5nZSwgdGhlIG9yZGVyCisgICAgICAgIC8vIGRpZG4ndCBjaGFuZ2UuCisgICAgICAgIGlmIChub3RpZmljYXRpb24ubm90aWZpY2F0aW9uLndoZW4gPT0gb2xkTm90aWZpY2F0aW9uLm5vdGlmaWNhdGlvbi53aGVuCisgICAgICAgICAgICAgICAgJiYgbm90aWZpY2F0aW9uLmlzT25nb2luZygpID09IG9sZE5vdGlmaWNhdGlvbi5pc09uZ29pbmcoKQorICAgICAgICAgICAgICAgICYmIG9sZEVudHJ5LmV4cGFuZGVkICE9IG51bGwKKyAgICAgICAgICAgICAgICAmJiBjb250ZW50VmlldyAhPSBudWxsICYmIG9sZENvbnRlbnRWaWV3ICE9IG51bGwKKyAgICAgICAgICAgICAgICAmJiBjb250ZW50Vmlldy5nZXRQYWNrYWdlKCkgIT0gbnVsbAorICAgICAgICAgICAgICAgICYmIG9sZENvbnRlbnRWaWV3LmdldFBhY2thZ2UoKSAhPSBudWxsCisgICAgICAgICAgICAgICAgJiYgb2xkQ29udGVudFZpZXcuZ2V0UGFja2FnZSgpLmVxdWFscyhjb250ZW50Vmlldy5nZXRQYWNrYWdlKCkpCisgICAgICAgICAgICAgICAgJiYgb2xkQ29udGVudFZpZXcuZ2V0TGF5b3V0SWQoKSA9PSBjb250ZW50Vmlldy5nZXRMYXlvdXRJZCgpKSB7CisgICAgICAgICAgICBpZiAoU1BFVykgU2xvZy5kKFRBRywgInJldXNpbmcgbm90aWZpY2F0aW9uIik7CisgICAgICAgICAgICBvbGRFbnRyeS5ub3RpZmljYXRpb24gPSBub3RpZmljYXRpb247CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIC8vIFJlYXBwbHkgdGhlIFJlbW90ZVZpZXdzCisgICAgICAgICAgICAgICAgY29udGVudFZpZXcucmVhcHBseSh0aGlzLCBvbGRFbnRyeS5jb250ZW50KTsKKyAgICAgICAgICAgICAgICAvLyB1cGRhdGUgdGhlIGNvbnRlbnRJbnRlbnQKKyAgICAgICAgICAgICAgICBmaW5hbCBQZW5kaW5nSW50ZW50IGNvbnRlbnRJbnRlbnQgPSBub3RpZmljYXRpb24ubm90aWZpY2F0aW9uLmNvbnRlbnRJbnRlbnQ7CisgICAgICAgICAgICAgICAgaWYgKGNvbnRlbnRJbnRlbnQgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBvbGRFbnRyeS5jb250ZW50LnNldE9uQ2xpY2tMaXN0ZW5lcihuZXcgTGF1bmNoZXIoY29udGVudEludGVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm90aWZpY2F0aW9uLnBrZywgbm90aWZpY2F0aW9uLnRhZywgbm90aWZpY2F0aW9uLmlkKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8vIFVwZGF0ZSB0aGUgaWNvbi4KKyAgICAgICAgICAgICAgICBmaW5hbCBTdGF0dXNCYXJJY29uIGljID0gbmV3IFN0YXR1c0Jhckljb24obm90aWZpY2F0aW9uLnBrZywKKyAgICAgICAgICAgICAgICAgICAgICAgIG5vdGlmaWNhdGlvbi5ub3RpZmljYXRpb24uaWNvbiwgbm90aWZpY2F0aW9uLm5vdGlmaWNhdGlvbi5pY29uTGV2ZWwsCisgICAgICAgICAgICAgICAgICAgICAgICBub3RpZmljYXRpb24ubm90aWZpY2F0aW9uLm51bWJlcik7CisgICAgICAgICAgICAgICAgaWYgKCFvbGRFbnRyeS5pY29uLnNldChpYykpIHsKKyAgICAgICAgICAgICAgICAgICAgaGFuZGxlTm90aWZpY2F0aW9uRXJyb3Ioa2V5LCBub3RpZmljYXRpb24sICJDb3VsZG4ndCB1cGRhdGUgaWNvbjogIiArIGljKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAvLyBJdCBmYWlsZWQgdG8gYWRkIGNsZWFubHkuICBMb2csIGFuZCByZW1vdmUgdGhlIHZpZXcgZnJvbSB0aGUgcGFuZWwuCisgICAgICAgICAgICAgICAgU2xvZy53KFRBRywgIkNvdWxkbid0IHJlYXBwbHkgdmlld3MgZm9yIHBhY2thZ2UgIiArIGNvbnRlbnRWaWV3LmdldFBhY2thZ2UoKSwgZSk7CisgICAgICAgICAgICAgICAgcmVtb3ZlTm90aWZpY2F0aW9uVmlld3Moa2V5KTsKKyAgICAgICAgICAgICAgICBhZGROb3RpZmljYXRpb25WaWV3cyhrZXksIG5vdGlmaWNhdGlvbik7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAoU1BFVykgU2xvZy5kKFRBRywgIm5vdCByZXVzaW5nIG5vdGlmaWNhdGlvbiIpOworICAgICAgICAgICAgcmVtb3ZlTm90aWZpY2F0aW9uVmlld3Moa2V5KTsKKyAgICAgICAgICAgIGFkZE5vdGlmaWNhdGlvblZpZXdzKGtleSwgbm90aWZpY2F0aW9uKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFJlc3RhcnQgdGhlIHRpY2tlciBpZiBpdCdzIHN0aWxsIHJ1bm5pbmcKKyAgICAgICAgaWYgKG5vdGlmaWNhdGlvbi5ub3RpZmljYXRpb24udGlja2VyVGV4dCAhPSBudWxsCisgICAgICAgICAgICAgICAgJiYgIVRleHRVdGlscy5lcXVhbHMobm90aWZpY2F0aW9uLm5vdGlmaWNhdGlvbi50aWNrZXJUZXh0LAorICAgICAgICAgICAgICAgICAgICBvbGRFbnRyeS5ub3RpZmljYXRpb24ubm90aWZpY2F0aW9uLnRpY2tlclRleHQpKSB7CisgICAgICAgICAgICB0aWNrKG5vdGlmaWNhdGlvbik7CisgICAgICAgIH0KKworICAgICAgICAvLyBSZWNhbGN1bGF0ZSB0aGUgcG9zaXRpb24gb2YgdGhlIHNsaWRpbmcgd2luZG93cyBhbmQgdGhlIHRpdGxlcy4KKyAgICAgICAgc2V0QXJlVGhlcmVOb3RpZmljYXRpb25zKCk7CisgICAgICAgIHVwZGF0ZUV4cGFuZGVkVmlld1BvcyhFWFBBTkRFRF9MRUFWRV9BTE9ORSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgcmVtb3ZlTm90aWZpY2F0aW9uKElCaW5kZXIga2V5KSB7CisgICAgICAgIGlmIChTUEVXKSBTbG9nLmQoVEFHLCAicmVtb3ZlTm90aWZpY2F0aW9uIGtleT0iICsga2V5KTsKKyAgICAgICAgU3RhdHVzQmFyTm90aWZpY2F0aW9uIG9sZCA9IHJlbW92ZU5vdGlmaWNhdGlvblZpZXdzKGtleSk7CisKKyAgICAgICAgaWYgKG9sZCAhPSBudWxsKSB7CisgICAgICAgICAgICAvLyBDYW5jZWwgdGhlIHRpY2tlciBpZiBpdCdzIHN0aWxsIHJ1bm5pbmcKKyAgICAgICAgICAgIG1UaWNrZXIucmVtb3ZlRW50cnkob2xkKTsKKworICAgICAgICAgICAgLy8gUmVjYWxjdWxhdGUgdGhlIHBvc2l0aW9uIG9mIHRoZSBzbGlkaW5nIHdpbmRvd3MgYW5kIHRoZSB0aXRsZXMuCisgICAgICAgICAgICBzZXRBcmVUaGVyZU5vdGlmaWNhdGlvbnMoKTsKKyAgICAgICAgICAgIHVwZGF0ZUV4cGFuZGVkVmlld1BvcyhFWFBBTkRFRF9MRUFWRV9BTE9ORSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIGludCBjaG9vc2VJY29uSW5kZXgoYm9vbGVhbiBpc09uZ29pbmcsIGludCB2aWV3SW5kZXgpIHsKKyAgICAgICAgZmluYWwgaW50IGxhdGVzdFNpemUgPSBtTGF0ZXN0LnNpemUoKTsKKyAgICAgICAgaWYgKGlzT25nb2luZykgeworICAgICAgICAgICAgcmV0dXJuIGxhdGVzdFNpemUgKyAobU9uZ29pbmcuc2l6ZSgpIC0gdmlld0luZGV4KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiBsYXRlc3RTaXplIC0gdmlld0luZGV4OworICAgICAgICB9CisgICAgfQorCisgICAgVmlld1tdIG1ha2VOb3RpZmljYXRpb25WaWV3KFN0YXR1c0Jhck5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24sIFZpZXdHcm91cCBwYXJlbnQpIHsKKyAgICAgICAgTm90aWZpY2F0aW9uIG4gPSBub3RpZmljYXRpb24ubm90aWZpY2F0aW9uOworICAgICAgICBSZW1vdGVWaWV3cyByZW1vdGVWaWV3cyA9IG4uY29udGVudFZpZXc7CisgICAgICAgIGlmIChyZW1vdGVWaWV3cyA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIC8vIGNyZWF0ZSB0aGUgcm93IHZpZXcKKyAgICAgICAgTGF5b3V0SW5mbGF0ZXIgaW5mbGF0ZXIgPSAoTGF5b3V0SW5mbGF0ZXIpZ2V0U3lzdGVtU2VydmljZShDb250ZXh0LkxBWU9VVF9JTkZMQVRFUl9TRVJWSUNFKTsKKyAgICAgICAgVmlldyByb3cgPSBpbmZsYXRlci5pbmZsYXRlKFIubGF5b3V0LnN0YXR1c19iYXJfbGF0ZXN0X2V2ZW50LCBwYXJlbnQsIGZhbHNlKTsKKworICAgICAgICAvLyBiaW5kIHRoZSBjbGljayBldmVudCB0byB0aGUgY29udGVudCBhcmVhCisgICAgICAgIFZpZXdHcm91cCBjb250ZW50ID0gKFZpZXdHcm91cClyb3cuZmluZFZpZXdCeUlkKFIuaWQuY29udGVudCk7CisgICAgICAgIGNvbnRlbnQuc2V0RGVzY2VuZGFudEZvY3VzYWJpbGl0eShWaWV3R3JvdXAuRk9DVVNfQkxPQ0tfREVTQ0VOREFOVFMpOworICAgICAgICBjb250ZW50LnNldE9uRm9jdXNDaGFuZ2VMaXN0ZW5lcihtRm9jdXNDaGFuZ2VMaXN0ZW5lcik7CisgICAgICAgIFBlbmRpbmdJbnRlbnQgY29udGVudEludGVudCA9IG4uY29udGVudEludGVudDsKKyAgICAgICAgaWYgKGNvbnRlbnRJbnRlbnQgIT0gbnVsbCkgeworICAgICAgICAgICAgY29udGVudC5zZXRPbkNsaWNrTGlzdGVuZXIobmV3IExhdW5jaGVyKGNvbnRlbnRJbnRlbnQsIG5vdGlmaWNhdGlvbi5wa2csCisgICAgICAgICAgICAgICAgICAgICAgICBub3RpZmljYXRpb24udGFnLCBub3RpZmljYXRpb24uaWQpKTsKKyAgICAgICAgfQorCisgICAgICAgIFZpZXcgZXhwYW5kZWQgPSBudWxsOworICAgICAgICBFeGNlcHRpb24gZXhjZXB0aW9uID0gbnVsbDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGV4cGFuZGVkID0gcmVtb3RlVmlld3MuYXBwbHkodGhpcywgY29udGVudCk7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZXhjZXB0aW9uID0gZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoZXhwYW5kZWQgPT0gbnVsbCkgeworICAgICAgICAgICAgU3RyaW5nIGlkZW50ID0gbm90aWZpY2F0aW9uLnBrZyArICIvMHgiICsgSW50ZWdlci50b0hleFN0cmluZyhub3RpZmljYXRpb24uaWQpOworICAgICAgICAgICAgU2xvZy5lKFRBRywgImNvdWxkbid0IGluZmxhdGUgdmlldyBmb3Igbm90aWZpY2F0aW9uICIgKyBpZGVudCwgZXhjZXB0aW9uKTsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgY29udGVudC5hZGRWaWV3KGV4cGFuZGVkKTsKKyAgICAgICAgICAgIHJvdy5zZXREcmF3aW5nQ2FjaGVFbmFibGVkKHRydWUpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIG5ldyBWaWV3W10geyByb3csIGNvbnRlbnQsIGV4cGFuZGVkIH07CisgICAgfQorCisgICAgU3RhdHVzQmFySWNvblZpZXcgYWRkTm90aWZpY2F0aW9uVmlld3MoSUJpbmRlciBrZXksIFN0YXR1c0Jhck5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKKyAgICAgICAgTm90aWZpY2F0aW9uRGF0YSBsaXN0OworICAgICAgICBWaWV3R3JvdXAgcGFyZW50OworICAgICAgICBmaW5hbCBib29sZWFuIGlzT25nb2luZyA9IG5vdGlmaWNhdGlvbi5pc09uZ29pbmcoKTsKKyAgICAgICAgaWYgKGlzT25nb2luZykgeworICAgICAgICAgICAgbGlzdCA9IG1PbmdvaW5nOworICAgICAgICAgICAgcGFyZW50ID0gbU9uZ29pbmdJdGVtczsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGxpc3QgPSBtTGF0ZXN0OworICAgICAgICAgICAgcGFyZW50ID0gbUxhdGVzdEl0ZW1zOworICAgICAgICB9CisgICAgICAgIC8vIENvbnN0cnVjdCB0aGUgZXhwYW5kZWQgdmlldy4KKyAgICAgICAgZmluYWwgVmlld1tdIHZpZXdzID0gbWFrZU5vdGlmaWNhdGlvblZpZXcobm90aWZpY2F0aW9uLCBwYXJlbnQpOworICAgICAgICBpZiAodmlld3MgPT0gbnVsbCkgeworICAgICAgICAgICAgaGFuZGxlTm90aWZpY2F0aW9uRXJyb3Ioa2V5LCBub3RpZmljYXRpb24sICJDb3VsZG4ndCBleHBhbmQgUmVtb3RlVmlld3MgZm9yOiAiCisgICAgICAgICAgICAgICAgICAgICsgbm90aWZpY2F0aW9uKTsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgICAgIGZpbmFsIFZpZXcgcm93ID0gdmlld3NbMF07CisgICAgICAgIGZpbmFsIFZpZXcgY29udGVudCA9IHZpZXdzWzFdOworICAgICAgICBmaW5hbCBWaWV3IGV4cGFuZGVkID0gdmlld3NbMl07CisgICAgICAgIC8vIENvbnN0cnVjdCB0aGUgaWNvbi4KKyAgICAgICAgZmluYWwgU3RhdHVzQmFySWNvblZpZXcgaWNvblZpZXcgPSBuZXcgU3RhdHVzQmFySWNvblZpZXcodGhpcywKKyAgICAgICAgICAgICAgICBub3RpZmljYXRpb24ucGtnICsgIi8weCIgKyBJbnRlZ2VyLnRvSGV4U3RyaW5nKG5vdGlmaWNhdGlvbi5pZCkpOworICAgICAgICBmaW5hbCBTdGF0dXNCYXJJY29uIGljID0gbmV3IFN0YXR1c0Jhckljb24obm90aWZpY2F0aW9uLnBrZywgbm90aWZpY2F0aW9uLm5vdGlmaWNhdGlvbi5pY29uLAorICAgICAgICAgICAgICAgICAgICBub3RpZmljYXRpb24ubm90aWZpY2F0aW9uLmljb25MZXZlbCwgbm90aWZpY2F0aW9uLm5vdGlmaWNhdGlvbi5udW1iZXIpOworICAgICAgICBpZiAoIWljb25WaWV3LnNldChpYykpIHsKKyAgICAgICAgICAgIGhhbmRsZU5vdGlmaWNhdGlvbkVycm9yKGtleSwgbm90aWZpY2F0aW9uLCAiQ291bGRpbmcgY3JlYXRlIGljb246ICIgKyBpYyk7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgICAgICAvLyBBZGQgdGhlIGV4cGFuZGVkIHZpZXcuCisgICAgICAgIGZpbmFsIGludCB2aWV3SW5kZXggPSBsaXN0LmFkZChrZXksIG5vdGlmaWNhdGlvbiwgcm93LCBjb250ZW50LCBleHBhbmRlZCwgaWNvblZpZXcpOworICAgICAgICBwYXJlbnQuYWRkVmlldyhyb3csIHZpZXdJbmRleCk7CisgICAgICAgIC8vIEFkZCB0aGUgaWNvbi4KKyAgICAgICAgZmluYWwgaW50IGljb25JbmRleCA9IGNob29zZUljb25JbmRleChpc09uZ29pbmcsIHZpZXdJbmRleCk7CisgICAgICAgIG1Ob3RpZmljYXRpb25JY29ucy5hZGRWaWV3KGljb25WaWV3LCBpY29uSW5kZXgsCisgICAgICAgICAgICAgICAgbmV3IExpbmVhckxheW91dC5MYXlvdXRQYXJhbXMobUljb25TaXplLCBtSWNvblNpemUpKTsKKyAgICAgICAgcmV0dXJuIGljb25WaWV3OworICAgIH0KKworICAgIFN0YXR1c0Jhck5vdGlmaWNhdGlvbiByZW1vdmVOb3RpZmljYXRpb25WaWV3cyhJQmluZGVyIGtleSkgeworICAgICAgICBOb3RpZmljYXRpb25EYXRhLkVudHJ5IGVudHJ5ID0gbU9uZ29pbmcucmVtb3ZlKGtleSk7CisgICAgICAgIGlmIChlbnRyeSA9PSBudWxsKSB7CisgICAgICAgICAgICBlbnRyeSA9IG1MYXRlc3QucmVtb3ZlKGtleSk7CisgICAgICAgICAgICBpZiAoZW50cnkgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIFNsb2cudyhUQUcsICJyZW1vdmVOb3RpZmljYXRpb24gZm9yIHVua25vd24ga2V5OiAiICsga2V5KTsKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvLyBSZW1vdmUgdGhlIGV4cGFuZGVkIHZpZXcuCisgICAgICAgICgoVmlld0dyb3VwKWVudHJ5LnJvdy5nZXRQYXJlbnQoKSkucmVtb3ZlVmlldyhlbnRyeS5yb3cpOworICAgICAgICAvLyBSZW1vdmUgdGhlIGljb24uCisgICAgICAgICgoVmlld0dyb3VwKWVudHJ5Lmljb24uZ2V0UGFyZW50KCkpLnJlbW92ZVZpZXcoZW50cnkuaWNvbik7CisKKyAgICAgICAgcmV0dXJuIGVudHJ5Lm5vdGlmaWNhdGlvbjsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgc2V0QXJlVGhlcmVOb3RpZmljYXRpb25zKCkgeworICAgICAgICBib29sZWFuIG9uZ29pbmcgPSBtT25nb2luZy5oYXNWaXNpYmxlSXRlbXMoKTsKKyAgICAgICAgYm9vbGVhbiBsYXRlc3QgPSBtTGF0ZXN0Lmhhc1Zpc2libGVJdGVtcygpOworCisgICAgICAgIC8vIChubyBvbmdvaW5nIG5vdGlmaWNhdGlvbnMgYXJlIGNsZWFyYWJsZSkKKyAgICAgICAgaWYgKG1MYXRlc3QuaGFzQ2xlYXJhYmxlSXRlbXMoKSkgeworICAgICAgICAgICAgbUNsZWFyQnV0dG9uLnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1DbGVhckJ1dHRvbi5zZXRWaXNpYmlsaXR5KFZpZXcuSU5WSVNJQkxFKTsKKyAgICAgICAgfQorCisgICAgICAgIG1PbmdvaW5nVGl0bGUuc2V0VmlzaWJpbGl0eShvbmdvaW5nID8gVmlldy5WSVNJQkxFIDogVmlldy5HT05FKTsKKyAgICAgICAgbUxhdGVzdFRpdGxlLnNldFZpc2liaWxpdHkobGF0ZXN0ID8gVmlldy5WSVNJQkxFIDogVmlldy5HT05FKTsKKworICAgICAgICBpZiAob25nb2luZyB8fCBsYXRlc3QpIHsKKyAgICAgICAgICAgIG1Ob05vdGlmaWNhdGlvbnNUaXRsZS5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtTm9Ob3RpZmljYXRpb25zVGl0bGUuc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOworICAgICAgICB9CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBTdGF0ZSBpcyBvbmUgb3IgbW9yZSBvZiB0aGUgRElTQUJMRSBjb25zdGFudHMgZnJvbSBTdGF0dXNCYXJNYW5hZ2VyLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGRpc2FibGUoaW50IHN0YXRlKSB7CisgICAgICAgIGZpbmFsIGludCBvbGQgPSBtRGlzYWJsZWQ7CisgICAgICAgIGZpbmFsIGludCBkaWZmID0gc3RhdGUgXiBvbGQ7CisgICAgICAgIG1EaXNhYmxlZCA9IHN0YXRlOworCisgICAgICAgIGlmICgoZGlmZiAmIFN0YXR1c0Jhck1hbmFnZXIuRElTQUJMRV9FWFBBTkQpICE9IDApIHsKKyAgICAgICAgICAgIGlmICgoc3RhdGUgJiBTdGF0dXNCYXJNYW5hZ2VyLkRJU0FCTEVfRVhQQU5EKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgU2xvZy5kKFRBRywgIkRJU0FCTEVfRVhQQU5EOiB5ZXMiKTsKKyAgICAgICAgICAgICAgICBhbmltYXRlQ29sbGFwc2UoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoKGRpZmYgJiBTdGF0dXNCYXJNYW5hZ2VyLkRJU0FCTEVfTk9USUZJQ0FUSU9OX0lDT05TKSAhPSAwKSB7CisgICAgICAgICAgICBpZiAoKHN0YXRlICYgU3RhdHVzQmFyTWFuYWdlci5ESVNBQkxFX05PVElGSUNBVElPTl9JQ09OUykgIT0gMCkgeworICAgICAgICAgICAgICAgIFNsb2cuZChUQUcsICJESVNBQkxFX05PVElGSUNBVElPTl9JQ09OUzogeWVzIik7CisgICAgICAgICAgICAgICAgaWYgKG1UaWNraW5nKSB7CisgICAgICAgICAgICAgICAgICAgIG1UaWNrZXIuaGFsdCgpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHNldE5vdGlmaWNhdGlvbkljb25WaXNpYmlsaXR5KGZhbHNlLCBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmFuaW0uZmFkZV9vdXQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgU2xvZy5kKFRBRywgIkRJU0FCTEVfTk9USUZJQ0FUSU9OX0lDT05TOiBubyIpOworICAgICAgICAgICAgICAgIGlmICghbUV4cGFuZGVkVmlzaWJsZSkgeworICAgICAgICAgICAgICAgICAgICBzZXROb3RpZmljYXRpb25JY29uVmlzaWJpbGl0eSh0cnVlLCBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmFuaW0uZmFkZV9pbik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKChkaWZmICYgU3RhdHVzQmFyTWFuYWdlci5ESVNBQkxFX05PVElGSUNBVElPTl9USUNLRVIpICE9IDApIHsKKyAgICAgICAgICAgIGlmIChtVGlja2luZyAmJiAoc3RhdGUgJiBTdGF0dXNCYXJNYW5hZ2VyLkRJU0FCTEVfTk9USUZJQ0FUSU9OX1RJQ0tFUikgIT0gMCkgeworICAgICAgICAgICAgICAgIFNsb2cuZChUQUcsICJESVNBQkxFX05PVElGSUNBVElPTl9USUNLRVI6IHllcyIpOworICAgICAgICAgICAgICAgIG1UaWNrZXIuaGFsdCgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQWxsIGNoYW5nZXMgdG8gdGhlIHN0YXR1cyBiYXIgYW5kIG5vdGlmaWNhdGlvbnMgZnVubmVsIHRocm91Z2ggaGVyZSBhbmQgYXJlIGJhdGNoZWQuCisgICAgICovCisgICAgcHJpdmF0ZSBjbGFzcyBIIGV4dGVuZHMgSGFuZGxlciB7CisgICAgICAgIHB1YmxpYyB2b2lkIGhhbmRsZU1lc3NhZ2UoTWVzc2FnZSBtKSB7CisgICAgICAgICAgICBzd2l0Y2ggKG0ud2hhdCkgeworICAgICAgICAgICAgICAgIGNhc2UgTVNHX0FOSU1BVEU6CisgICAgICAgICAgICAgICAgICAgIGRvQW5pbWF0aW9uKCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgTVNHX0FOSU1BVEVfUkVWRUFMOgorICAgICAgICAgICAgICAgICAgICBkb1JldmVhbEFuaW1hdGlvbigpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIE1TR19TSE9XX0lOVFJVREVSOgorICAgICAgICAgICAgICAgICAgICBzZXRJbnRydWRlckFsZXJ0VmlzaWJpbGl0eSh0cnVlKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBNU0dfSElERV9JTlRSVURFUjoKKyAgICAgICAgICAgICAgICAgICAgc2V0SW50cnVkZXJBbGVydFZpc2liaWxpdHkoZmFsc2UpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIFZpZXcuT25Gb2N1c0NoYW5nZUxpc3RlbmVyIG1Gb2N1c0NoYW5nZUxpc3RlbmVyID0gbmV3IFZpZXcuT25Gb2N1c0NoYW5nZUxpc3RlbmVyKCkgeworICAgICAgICBwdWJsaWMgdm9pZCBvbkZvY3VzQ2hhbmdlKFZpZXcgdiwgYm9vbGVhbiBoYXNGb2N1cykgeworICAgICAgICAgICAgLy8gQmVjYXVzZSAndicgaXMgYSBWaWV3R3JvdXAsIGFsbCBpdHMgY2hpbGRyZW4gd2lsbCBiZSAodW4pc2VsZWN0ZWQKKyAgICAgICAgICAgIC8vIHRvbywgd2hpY2ggYWxsb3dzIG1hcnF1ZWVpbmcgdG8gd29yay4KKyAgICAgICAgICAgIHYuc2V0U2VsZWN0ZWQoaGFzRm9jdXMpOworICAgICAgICB9CisgICAgfTsKKworICAgIHByaXZhdGUgdm9pZCBtYWtlRXhwYW5kZWRWaXNpYmxlKCkgeworICAgICAgICBpZiAoU1BFVykgU2xvZy5kKFRBRywgIk1ha2UgZXhwYW5kZWQgdmlzaWJsZTogZXhwYW5kZWQgdmlzaWJsZT0iICsgbUV4cGFuZGVkVmlzaWJsZSk7CisgICAgICAgIGlmIChtRXhwYW5kZWRWaXNpYmxlKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgbUV4cGFuZGVkVmlzaWJsZSA9IHRydWU7CisgICAgICAgIHZpc2liaWxpdHlDaGFuZ2VkKHRydWUpOworCisgICAgICAgIHVwZGF0ZUV4cGFuZGVkVmlld1BvcyhFWFBBTkRFRF9MRUFWRV9BTE9ORSk7CisgICAgICAgIG1FeHBhbmRlZFBhcmFtcy5mbGFncyAmPSB+V2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMuRkxBR19OT1RfRk9DVVNBQkxFOworICAgICAgICBtRXhwYW5kZWRQYXJhbXMuZmxhZ3MgfD0gV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMuRkxBR19BTFRfRk9DVVNBQkxFX0lNOworICAgICAgICBtRXhwYW5kZWREaWFsb2cuZ2V0V2luZG93KCkuc2V0QXR0cmlidXRlcyhtRXhwYW5kZWRQYXJhbXMpOworICAgICAgICBtRXhwYW5kZWRWaWV3LnJlcXVlc3RGb2N1cyhWaWV3LkZPQ1VTX0ZPUldBUkQpOworICAgICAgICBtVHJhY2tpbmdWaWV3LnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKKworICAgICAgICBpZiAoIW1UaWNraW5nKSB7CisgICAgICAgICAgICBzZXREYXRlVmlld1Zpc2liaWxpdHkodHJ1ZSwgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5hbmltLmZhZGVfaW4pOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgYW5pbWF0ZUV4cGFuZCgpIHsKKyAgICAgICAgaWYgKFNQRVcpIFNsb2cuZChUQUcsICJBbmltYXRlIGV4cGFuZDogZXhwYW5kZWQ9IiArIG1FeHBhbmRlZCk7CisgICAgICAgIGlmICgobURpc2FibGVkICYgU3RhdHVzQmFyTWFuYWdlci5ESVNBQkxFX0VYUEFORCkgIT0gMCkgeworICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgfQorICAgICAgICBpZiAobUV4cGFuZGVkKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBwcmVwYXJlVHJhY2tpbmcoMCwgdHJ1ZSk7CisgICAgICAgIHBlcmZvcm1GbGluZygwLCAyMDAwLjBmLCB0cnVlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBhbmltYXRlQ29sbGFwc2UoKSB7CisgICAgICAgIGlmIChTUEVXKSB7CisgICAgICAgICAgICBTbG9nLmQoVEFHLCAiYW5pbWF0ZUNvbGxhcHNlKCk6IG1FeHBhbmRlZD0iICsgbUV4cGFuZGVkCisgICAgICAgICAgICAgICAgICAgICsgIiBtRXhwYW5kZWRWaXNpYmxlPSIgKyBtRXhwYW5kZWRWaXNpYmxlCisgICAgICAgICAgICAgICAgICAgICsgIiBtRXhwYW5kZWQ9IiArIG1FeHBhbmRlZAorICAgICAgICAgICAgICAgICAgICArICIgbUFuaW1hdGluZz0iICsgbUFuaW1hdGluZworICAgICAgICAgICAgICAgICAgICArICIgbUFuaW1ZPSIgKyBtQW5pbVkKKyAgICAgICAgICAgICAgICAgICAgKyAiIG1BbmltVmVsPSIgKyBtQW5pbVZlbCk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoIW1FeHBhbmRlZFZpc2libGUpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGludCB5OworICAgICAgICBpZiAobUFuaW1hdGluZykgeworICAgICAgICAgICAgeSA9IChpbnQpbUFuaW1ZOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgeSA9IG1EaXNwbGF5LmdldEhlaWdodCgpLTE7CisgICAgICAgIH0KKyAgICAgICAgLy8gTGV0IHRoZSBmbGluZyB0aGluayB0aGF0IHdlJ3JlIG9wZW4gc28gaXQgZ29lcyBpbiB0aGUgcmlnaHQgZGlyZWN0aW9uCisgICAgICAgIC8vIGFuZCBkb2Vzbid0IHRyeSB0byByZS1vcGVuIHRoZSB3aW5kb3dzaGFkZS4KKyAgICAgICAgbUV4cGFuZGVkID0gdHJ1ZTsKKyAgICAgICAgcHJlcGFyZVRyYWNraW5nKHksIGZhbHNlKTsKKyAgICAgICAgcGVyZm9ybUZsaW5nKHksIC0yMDAwLjBmLCB0cnVlKTsKKyAgICB9CisKKyAgICB2b2lkIHBlcmZvcm1FeHBhbmQoKSB7CisgICAgICAgIGlmIChTUEVXKSBTbG9nLmQoVEFHLCAicGVyZm9ybUV4cGFuZDogbUV4cGFuZGVkPSIgKyBtRXhwYW5kZWQpOworICAgICAgICBpZiAoKG1EaXNhYmxlZCAmIFN0YXR1c0Jhck1hbmFnZXIuRElTQUJMRV9FWFBBTkQpICE9IDApIHsKKyAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1FeHBhbmRlZCkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgbUV4cGFuZGVkID0gdHJ1ZTsKKyAgICAgICAgbWFrZUV4cGFuZGVkVmlzaWJsZSgpOworICAgICAgICB1cGRhdGVFeHBhbmRlZFZpZXdQb3MoRVhQQU5ERURfRlVMTF9PUEVOKTsKKworICAgICAgICBpZiAoZmFsc2UpIHBvc3RTdGFydFRyYWNpbmcoKTsKKyAgICB9CisKKyAgICB2b2lkIHBlcmZvcm1Db2xsYXBzZSgpIHsKKyAgICAgICAgaWYgKFNQRVcpIFNsb2cuZChUQUcsICJwZXJmb3JtQ29sbGFwc2U6IG1FeHBhbmRlZD0iICsgbUV4cGFuZGVkCisgICAgICAgICAgICAgICAgKyAiIG1FeHBhbmRlZFZpc2libGU9IiArIG1FeHBhbmRlZFZpc2libGUpOworCisgICAgICAgIGlmICghbUV4cGFuZGVkVmlzaWJsZSkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIG1FeHBhbmRlZFZpc2libGUgPSBmYWxzZTsKKyAgICAgICAgdmlzaWJpbGl0eUNoYW5nZWQoZmFsc2UpOworICAgICAgICBtRXhwYW5kZWRQYXJhbXMuZmxhZ3MgfD0gV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMuRkxBR19OT1RfRk9DVVNBQkxFOworICAgICAgICBtRXhwYW5kZWRQYXJhbXMuZmxhZ3MgJj0gfldpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zLkZMQUdfQUxUX0ZPQ1VTQUJMRV9JTTsKKyAgICAgICAgbUV4cGFuZGVkRGlhbG9nLmdldFdpbmRvdygpLnNldEF0dHJpYnV0ZXMobUV4cGFuZGVkUGFyYW1zKTsKKyAgICAgICAgbVRyYWNraW5nVmlldy5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7CisKKyAgICAgICAgaWYgKChtRGlzYWJsZWQgJiBTdGF0dXNCYXJNYW5hZ2VyLkRJU0FCTEVfTk9USUZJQ0FUSU9OX0lDT05TKSA9PSAwKSB7CisgICAgICAgICAgICBzZXROb3RpZmljYXRpb25JY29uVmlzaWJpbGl0eSh0cnVlLCBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmFuaW0uZmFkZV9pbik7CisgICAgICAgIH0KKyAgICAgICAgc2V0RGF0ZVZpZXdWaXNpYmlsaXR5KGZhbHNlLCBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmFuaW0uZmFkZV9vdXQpOworCisgICAgICAgIGlmICghbUV4cGFuZGVkKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgbUV4cGFuZGVkID0gZmFsc2U7CisgICAgfQorCisgICAgdm9pZCBkb0FuaW1hdGlvbigpIHsKKyAgICAgICAgaWYgKG1BbmltYXRpbmcpIHsKKyAgICAgICAgICAgIGlmIChTUEVXKSBTbG9nLmQoVEFHLCAiZG9BbmltYXRpb24iKTsKKyAgICAgICAgICAgIGlmIChTUEVXKSBTbG9nLmQoVEFHLCAiZG9BbmltYXRpb24gYmVmb3JlIG1BbmltWT0iICsgbUFuaW1ZKTsKKyAgICAgICAgICAgIGluY3JlbWVudEFuaW0oKTsKKyAgICAgICAgICAgIGlmIChTUEVXKSBTbG9nLmQoVEFHLCAiZG9BbmltYXRpb24gYWZ0ZXIgIG1BbmltWT0iICsgbUFuaW1ZKTsKKyAgICAgICAgICAgIGlmIChtQW5pbVkgPj0gbURpc3BsYXkuZ2V0SGVpZ2h0KCktMSkgeworICAgICAgICAgICAgICAgIGlmIChTUEVXKSBTbG9nLmQoVEFHLCAiQW5pbWF0aW9uIGNvbXBsZXRlZCB0byBleHBhbmRlZCBzdGF0ZS4iKTsKKyAgICAgICAgICAgICAgICBtQW5pbWF0aW5nID0gZmFsc2U7CisgICAgICAgICAgICAgICAgdXBkYXRlRXhwYW5kZWRWaWV3UG9zKEVYUEFOREVEX0ZVTExfT1BFTik7CisgICAgICAgICAgICAgICAgcGVyZm9ybUV4cGFuZCgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAobUFuaW1ZIDwgbVN0YXR1c0JhclZpZXcuZ2V0SGVpZ2h0KCkpIHsKKyAgICAgICAgICAgICAgICBpZiAoU1BFVykgU2xvZy5kKFRBRywgIkFuaW1hdGlvbiBjb21wbGV0ZWQgdG8gY29sbGFwc2VkIHN0YXRlLiIpOworICAgICAgICAgICAgICAgIG1BbmltYXRpbmcgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICB1cGRhdGVFeHBhbmRlZFZpZXdQb3MoMCk7CisgICAgICAgICAgICAgICAgcGVyZm9ybUNvbGxhcHNlKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICB1cGRhdGVFeHBhbmRlZFZpZXdQb3MoKGludCltQW5pbVkpOworICAgICAgICAgICAgICAgIG1DdXJBbmltYXRpb25UaW1lICs9IEFOSU1fRlJBTUVfRFVSQVRJT047CisgICAgICAgICAgICAgICAgbUhhbmRsZXIuc2VuZE1lc3NhZ2VBdFRpbWUobUhhbmRsZXIub2J0YWluTWVzc2FnZShNU0dfQU5JTUFURSksIG1DdXJBbmltYXRpb25UaW1lKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHZvaWQgc3RvcFRyYWNraW5nKCkgeworICAgICAgICBtVHJhY2tpbmcgPSBmYWxzZTsKKyAgICAgICAgbVZlbG9jaXR5VHJhY2tlci5yZWN5Y2xlKCk7CisgICAgICAgIG1WZWxvY2l0eVRyYWNrZXIgPSBudWxsOworICAgIH0KKworICAgIHZvaWQgaW5jcmVtZW50QW5pbSgpIHsKKyAgICAgICAgbG9uZyBub3cgPSBTeXN0ZW1DbG9jay51cHRpbWVNaWxsaXMoKTsKKyAgICAgICAgZmxvYXQgdCA9ICgoZmxvYXQpKG5vdyAtIG1BbmltTGFzdFRpbWUpKSAvIDEwMDA7ICAgICAgICAgICAgLy8gbXMgLT4gcworICAgICAgICBmaW5hbCBmbG9hdCB5ID0gbUFuaW1ZOworICAgICAgICBmaW5hbCBmbG9hdCB2ID0gbUFuaW1WZWw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBweC9zCisgICAgICAgIGZpbmFsIGZsb2F0IGEgPSBtQW5pbUFjY2VsOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHB4L3MvcworICAgICAgICBtQW5pbVkgPSB5ICsgKHYqdCkgKyAoMC41ZiphKnQqdCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBweAorICAgICAgICBtQW5pbVZlbCA9IHYgKyAoYSp0KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBweC9zCisgICAgICAgIG1BbmltTGFzdFRpbWUgPSBub3c7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1zCisgICAgICAgIC8vU2xvZy5kKFRBRywgInk9IiArIHkgKyAiIHY9IiArIHYgKyAiIGE9IiArIGEgKyAiIHQ9IiArIHQgKyAiIG1BbmltWT0iICsgbUFuaW1ZCisgICAgICAgIC8vICAgICAgICArICIgbUFuaW1BY2NlbD0iICsgbUFuaW1BY2NlbCk7CisgICAgfQorCisgICAgdm9pZCBkb1JldmVhbEFuaW1hdGlvbigpIHsKKyAgICAgICAgZmluYWwgaW50IGggPSBtQ2xvc2VWaWV3LmdldEhlaWdodCgpICsgbVN0YXR1c0JhclZpZXcuZ2V0SGVpZ2h0KCk7CisgICAgICAgIGlmIChtQW5pbWF0aW5nUmV2ZWFsICYmIG1BbmltYXRpbmcgJiYgbUFuaW1ZIDwgaCkgeworICAgICAgICAgICAgaW5jcmVtZW50QW5pbSgpOworICAgICAgICAgICAgaWYgKG1BbmltWSA+PSBoKSB7CisgICAgICAgICAgICAgICAgbUFuaW1ZID0gaDsKKyAgICAgICAgICAgICAgICB1cGRhdGVFeHBhbmRlZFZpZXdQb3MoKGludCltQW5pbVkpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICB1cGRhdGVFeHBhbmRlZFZpZXdQb3MoKGludCltQW5pbVkpOworICAgICAgICAgICAgICAgIG1DdXJBbmltYXRpb25UaW1lICs9IEFOSU1fRlJBTUVfRFVSQVRJT047CisgICAgICAgICAgICAgICAgbUhhbmRsZXIuc2VuZE1lc3NhZ2VBdFRpbWUobUhhbmRsZXIub2J0YWluTWVzc2FnZShNU0dfQU5JTUFURV9SRVZFQUwpLAorICAgICAgICAgICAgICAgICAgICAgICAgbUN1ckFuaW1hdGlvblRpbWUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgdm9pZCBwcmVwYXJlVHJhY2tpbmcoaW50IHksIGJvb2xlYW4gb3BlbmluZykgeworICAgICAgICBtVHJhY2tpbmcgPSB0cnVlOworICAgICAgICBtVmVsb2NpdHlUcmFja2VyID0gVmVsb2NpdHlUcmFja2VyLm9idGFpbigpOworICAgICAgICBpZiAob3BlbmluZykgeworICAgICAgICAgICAgbUFuaW1BY2NlbCA9IDIwMDAuMGY7CisgICAgICAgICAgICBtQW5pbVZlbCA9IDIwMDsKKyAgICAgICAgICAgIG1BbmltWSA9IG1TdGF0dXNCYXJWaWV3LmdldEhlaWdodCgpOworICAgICAgICAgICAgdXBkYXRlRXhwYW5kZWRWaWV3UG9zKChpbnQpbUFuaW1ZKTsKKyAgICAgICAgICAgIG1BbmltYXRpbmcgPSB0cnVlOworICAgICAgICAgICAgbUFuaW1hdGluZ1JldmVhbCA9IHRydWU7CisgICAgICAgICAgICBtSGFuZGxlci5yZW1vdmVNZXNzYWdlcyhNU0dfQU5JTUFURSk7CisgICAgICAgICAgICBtSGFuZGxlci5yZW1vdmVNZXNzYWdlcyhNU0dfQU5JTUFURV9SRVZFQUwpOworICAgICAgICAgICAgbG9uZyBub3cgPSBTeXN0ZW1DbG9jay51cHRpbWVNaWxsaXMoKTsKKyAgICAgICAgICAgIG1BbmltTGFzdFRpbWUgPSBub3c7CisgICAgICAgICAgICBtQ3VyQW5pbWF0aW9uVGltZSA9IG5vdyArIEFOSU1fRlJBTUVfRFVSQVRJT047CisgICAgICAgICAgICBtQW5pbWF0aW5nID0gdHJ1ZTsKKyAgICAgICAgICAgIG1IYW5kbGVyLnNlbmRNZXNzYWdlQXRUaW1lKG1IYW5kbGVyLm9idGFpbk1lc3NhZ2UoTVNHX0FOSU1BVEVfUkVWRUFMKSwKKyAgICAgICAgICAgICAgICAgICAgbUN1ckFuaW1hdGlvblRpbWUpOworICAgICAgICAgICAgbWFrZUV4cGFuZGVkVmlzaWJsZSgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gaXQncyBvcGVuLCBjbG9zZSBpdD8KKyAgICAgICAgICAgIGlmIChtQW5pbWF0aW5nKSB7CisgICAgICAgICAgICAgICAgbUFuaW1hdGluZyA9IGZhbHNlOworICAgICAgICAgICAgICAgIG1IYW5kbGVyLnJlbW92ZU1lc3NhZ2VzKE1TR19BTklNQVRFKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHVwZGF0ZUV4cGFuZGVkVmlld1Bvcyh5ICsgbVZpZXdEZWx0YSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICB2b2lkIHBlcmZvcm1GbGluZyhpbnQgeSwgZmxvYXQgdmVsLCBib29sZWFuIGFsd2F5cykgeworICAgICAgICBtQW5pbWF0aW5nUmV2ZWFsID0gZmFsc2U7CisgICAgICAgIG1EaXNwbGF5SGVpZ2h0ID0gbURpc3BsYXkuZ2V0SGVpZ2h0KCk7CisKKyAgICAgICAgbUFuaW1ZID0geTsKKyAgICAgICAgbUFuaW1WZWwgPSB2ZWw7CisKKyAgICAgICAgLy9TbG9nLmQoVEFHLCAic3RhcnRpbmcgd2l0aCBtQW5pbVk9IiArIG1BbmltWSArICIgbUFuaW1WZWw9IiArIG1BbmltVmVsKTsKKworICAgICAgICBpZiAobUV4cGFuZGVkKSB7CisgICAgICAgICAgICBpZiAoIWFsd2F5cyAmJiAoCisgICAgICAgICAgICAgICAgICAgIHZlbCA+IDIwMC4wZgorICAgICAgICAgICAgICAgICAgICB8fCAoeSA+IChtRGlzcGxheUhlaWdodC0yNSkgJiYgdmVsID4gLTIwMC4wZikpKSB7CisgICAgICAgICAgICAgICAgLy8gV2UgYXJlIGV4cGFuZGVkLCBidXQgdGhleSBkaWRuJ3QgbW92ZSBzdWZmaWNpZW50bHkgdG8gY2F1c2UKKyAgICAgICAgICAgICAgICAvLyB1cyB0byByZXRyYWN0LiAgQW5pbWF0ZSBiYWNrIHRvIHRoZSBleHBhbmRlZCBwb3NpdGlvbi4KKyAgICAgICAgICAgICAgICBtQW5pbUFjY2VsID0gMjAwMC4wZjsKKyAgICAgICAgICAgICAgICBpZiAodmVsIDwgMCkgeworICAgICAgICAgICAgICAgICAgICBtQW5pbVZlbCA9IDA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgLy8gV2UgYXJlIGV4cGFuZGVkIGFuZCBhcmUgbm93IGdvaW5nIHRvIGFuaW1hdGUgYXdheS4KKyAgICAgICAgICAgICAgICBtQW5pbUFjY2VsID0gLTIwMDAuMGY7CisgICAgICAgICAgICAgICAgaWYgKHZlbCA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgbUFuaW1WZWwgPSAwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmIChhbHdheXMgfHwgKAorICAgICAgICAgICAgICAgICAgICB2ZWwgPiAyMDAuMGYKKyAgICAgICAgICAgICAgICAgICAgfHwgKHkgPiAobURpc3BsYXlIZWlnaHQvMikgJiYgdmVsID4gLTIwMC4wZikpKSB7CisgICAgICAgICAgICAgICAgLy8gV2UgYXJlIGNvbGxhcHNlZCwgYW5kIHRoZXkgbW92ZWQgZW5vdWdoIHRvIGFsbG93IHVzIHRvCisgICAgICAgICAgICAgICAgLy8gZXhwYW5kLiAgQW5pbWF0ZSBpbiB0aGUgbm90aWZpY2F0aW9ucy4KKyAgICAgICAgICAgICAgICBtQW5pbUFjY2VsID0gMjAwMC4wZjsKKyAgICAgICAgICAgICAgICBpZiAodmVsIDwgMCkgeworICAgICAgICAgICAgICAgICAgICBtQW5pbVZlbCA9IDA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgLy8gV2UgYXJlIGNvbGxhcHNlZCwgYnV0IHRoZXkgZGlkbid0IG1vdmUgc3VmZmljaWVudGx5IHRvIGNhdXNlCisgICAgICAgICAgICAgICAgLy8gdXMgdG8gcmV0cmFjdC4gIEFuaW1hdGUgYmFjayB0byB0aGUgY29sbGFwc2VkIHBvc2l0aW9uLgorICAgICAgICAgICAgICAgIG1BbmltQWNjZWwgPSAtMjAwMC4wZjsKKyAgICAgICAgICAgICAgICBpZiAodmVsID4gMCkgeworICAgICAgICAgICAgICAgICAgICBtQW5pbVZlbCA9IDA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8vU2xvZy5kKFRBRywgIm1BbmltWT0iICsgbUFuaW1ZICsgIiBtQW5pbVZlbD0iICsgbUFuaW1WZWwKKyAgICAgICAgLy8gICAgICAgICsgIiBtQW5pbUFjY2VsPSIgKyBtQW5pbUFjY2VsKTsKKworICAgICAgICBsb25nIG5vdyA9IFN5c3RlbUNsb2NrLnVwdGltZU1pbGxpcygpOworICAgICAgICBtQW5pbUxhc3RUaW1lID0gbm93OworICAgICAgICBtQ3VyQW5pbWF0aW9uVGltZSA9IG5vdyArIEFOSU1fRlJBTUVfRFVSQVRJT047CisgICAgICAgIG1BbmltYXRpbmcgPSB0cnVlOworICAgICAgICBtSGFuZGxlci5yZW1vdmVNZXNzYWdlcyhNU0dfQU5JTUFURSk7CisgICAgICAgIG1IYW5kbGVyLnJlbW92ZU1lc3NhZ2VzKE1TR19BTklNQVRFX1JFVkVBTCk7CisgICAgICAgIG1IYW5kbGVyLnNlbmRNZXNzYWdlQXRUaW1lKG1IYW5kbGVyLm9idGFpbk1lc3NhZ2UoTVNHX0FOSU1BVEUpLCBtQ3VyQW5pbWF0aW9uVGltZSk7CisgICAgICAgIHN0b3BUcmFja2luZygpOworICAgIH0KKworICAgIGJvb2xlYW4gaW50ZXJjZXB0VG91Y2hFdmVudChNb3Rpb25FdmVudCBldmVudCkgeworICAgICAgICBpZiAoU1BFVykgeworICAgICAgICAgICAgU2xvZy5kKFRBRywgIlRvdWNoOiByYXdZPSIgKyBldmVudC5nZXRSYXdZKCkgKyAiIGV2ZW50PSIgKyBldmVudCArICIgbURpc2FibGVkPSIKKyAgICAgICAgICAgICAgICArIG1EaXNhYmxlZCk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoKG1EaXNhYmxlZCAmIFN0YXR1c0Jhck1hbmFnZXIuRElTQUJMRV9FWFBBTkQpICE9IDApIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIGZpbmFsIGludCBzdGF0dXNCYXJTaXplID0gbVN0YXR1c0JhclZpZXcuZ2V0SGVpZ2h0KCk7CisgICAgICAgIGZpbmFsIGludCBoaXRTaXplID0gc3RhdHVzQmFyU2l6ZSoyOworICAgICAgICBpZiAoZXZlbnQuZ2V0QWN0aW9uKCkgPT0gTW90aW9uRXZlbnQuQUNUSU9OX0RPV04pIHsKKyAgICAgICAgICAgIGZpbmFsIGludCB5ID0gKGludClldmVudC5nZXRSYXdZKCk7CisKKyAgICAgICAgICAgIGlmICghbUV4cGFuZGVkKSB7CisgICAgICAgICAgICAgICAgbVZpZXdEZWx0YSA9IHN0YXR1c0JhclNpemUgLSB5OworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBtVHJhY2tpbmdWaWV3LmdldExvY2F0aW9uT25TY3JlZW4obUFic1Bvcyk7CisgICAgICAgICAgICAgICAgbVZpZXdEZWx0YSA9IG1BYnNQb3NbMV0gKyBtVHJhY2tpbmdWaWV3LmdldEhlaWdodCgpIC0geTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICgoIW1FeHBhbmRlZCAmJiB5IDwgaGl0U2l6ZSkgfHwKKyAgICAgICAgICAgICAgICAgICAgKG1FeHBhbmRlZCAmJiB5ID4gKG1EaXNwbGF5LmdldEhlaWdodCgpLWhpdFNpemUpKSkgeworCisgICAgICAgICAgICAgICAgLy8gV2UgZHJvcCBldmVudHMgYXQgdGhlIGVkZ2Ugb2YgdGhlIHNjcmVlbiB0byBtYWtlIHRoZSB3aW5kb3dzaGFkZSBjb21lCisgICAgICAgICAgICAgICAgLy8gZG93biBieSBhY2NpZGVudCBsZXNzLCBlc3BlY2lhbGx5IHdoZW4gcHVzaGluZyBvcGVuIGEgZGV2aWNlIHdpdGggYSBrZXlib2FyZAorICAgICAgICAgICAgICAgIC8vIHRoYXQgcm90YXRlcyAobGlrZSBnMSBhbmQgZHJvaWQpCisgICAgICAgICAgICAgICAgaW50IHggPSAoaW50KWV2ZW50LmdldFJhd1goKTsKKyAgICAgICAgICAgICAgICBmaW5hbCBpbnQgZWRnZUJvcmRlciA9IG1FZGdlQm9yZGVyOworICAgICAgICAgICAgICAgIGlmICh4ID49IGVkZ2VCb3JkZXIgJiYgeCA8IG1EaXNwbGF5LmdldFdpZHRoKCkgLSBlZGdlQm9yZGVyKSB7CisgICAgICAgICAgICAgICAgICAgIHByZXBhcmVUcmFja2luZyh5LCAhbUV4cGFuZGVkKTsvLyBvcGVuaW5nIGlmIHdlJ3JlIG5vdCBhbHJlYWR5IGZ1bGx5IHZpc2libGUKKyAgICAgICAgICAgICAgICAgICAgbVZlbG9jaXR5VHJhY2tlci5hZGRNb3ZlbWVudChldmVudCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKG1UcmFja2luZykgeworICAgICAgICAgICAgbVZlbG9jaXR5VHJhY2tlci5hZGRNb3ZlbWVudChldmVudCk7CisgICAgICAgICAgICBmaW5hbCBpbnQgbWluWSA9IHN0YXR1c0JhclNpemUgKyBtQ2xvc2VWaWV3LmdldEhlaWdodCgpOworICAgICAgICAgICAgaWYgKGV2ZW50LmdldEFjdGlvbigpID09IE1vdGlvbkV2ZW50LkFDVElPTl9NT1ZFKSB7CisgICAgICAgICAgICAgICAgaW50IHkgPSAoaW50KWV2ZW50LmdldFJhd1koKTsKKyAgICAgICAgICAgICAgICBpZiAobUFuaW1hdGluZ1JldmVhbCAmJiB5IDwgbWluWSkgeworICAgICAgICAgICAgICAgICAgICAvLyBub3RoaW5nCisgICAgICAgICAgICAgICAgfSBlbHNlICB7CisgICAgICAgICAgICAgICAgICAgIG1BbmltYXRpbmdSZXZlYWwgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgdXBkYXRlRXhwYW5kZWRWaWV3UG9zKHkgKyBtVmlld0RlbHRhKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgaWYgKGV2ZW50LmdldEFjdGlvbigpID09IE1vdGlvbkV2ZW50LkFDVElPTl9VUCkgeworICAgICAgICAgICAgICAgIG1WZWxvY2l0eVRyYWNrZXIuY29tcHV0ZUN1cnJlbnRWZWxvY2l0eSgxMDAwKTsKKworICAgICAgICAgICAgICAgIGZsb2F0IHlWZWwgPSBtVmVsb2NpdHlUcmFja2VyLmdldFlWZWxvY2l0eSgpOworICAgICAgICAgICAgICAgIGJvb2xlYW4gbmVnYXRpdmUgPSB5VmVsIDwgMDsKKworICAgICAgICAgICAgICAgIGZsb2F0IHhWZWwgPSBtVmVsb2NpdHlUcmFja2VyLmdldFhWZWxvY2l0eSgpOworICAgICAgICAgICAgICAgIGlmICh4VmVsIDwgMCkgeworICAgICAgICAgICAgICAgICAgICB4VmVsID0gLXhWZWw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmICh4VmVsID4gMTUwLjBmKSB7CisgICAgICAgICAgICAgICAgICAgIHhWZWwgPSAxNTAuMGY7IC8vIGxpbWl0IGhvdyBtdWNoIHdlIGNhcmUgYWJvdXQgdGhlIHggYXhpcworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZsb2F0IHZlbCA9IChmbG9hdClNYXRoLmh5cG90KHlWZWwsIHhWZWwpOworICAgICAgICAgICAgICAgIGlmIChuZWdhdGl2ZSkgeworICAgICAgICAgICAgICAgICAgICB2ZWwgPSAtdmVsOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHBlcmZvcm1GbGluZygoaW50KWV2ZW50LmdldFJhd1koKSwgdmVsLCBmYWxzZSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0TGlnaHRzT24oYm9vbGVhbiBvbikgeworICAgICAgICBpZiAoIW9uKSB7CisgICAgICAgICAgICAvLyBBbGwgd2UgZG8gZm9yICJsaWdodHMgb3V0IiBtb2RlIG9uIGEgcGhvbmUgaXMgaGlkZSB0aGUgc3RhdHVzIGJhciwKKyAgICAgICAgICAgIC8vIHdoaWNoIHRoZSB3aW5kb3cgbWFuYWdlciBkb2VzLiAgQnV0IHdlIGRvIG5lZWQgdG8gaGlkZSB0aGUgd2luZG93c2hhZGUKKyAgICAgICAgICAgIC8vIG9uIG91ciBvd24uCisgICAgICAgICAgICBhbmltYXRlQ29sbGFwc2UoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgY2xhc3MgTGF1bmNoZXIgaW1wbGVtZW50cyBWaWV3Lk9uQ2xpY2tMaXN0ZW5lciB7CisgICAgICAgIHByaXZhdGUgUGVuZGluZ0ludGVudCBtSW50ZW50OworICAgICAgICBwcml2YXRlIFN0cmluZyBtUGtnOworICAgICAgICBwcml2YXRlIFN0cmluZyBtVGFnOworICAgICAgICBwcml2YXRlIGludCBtSWQ7CisKKyAgICAgICAgTGF1bmNoZXIoUGVuZGluZ0ludGVudCBpbnRlbnQsIFN0cmluZyBwa2csIFN0cmluZyB0YWcsIGludCBpZCkgeworICAgICAgICAgICAgbUludGVudCA9IGludGVudDsKKyAgICAgICAgICAgIG1Qa2cgPSBwa2c7CisgICAgICAgICAgICBtVGFnID0gdGFnOworICAgICAgICAgICAgbUlkID0gaWQ7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBvbkNsaWNrKFZpZXcgdikgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAvLyBUaGUgaW50ZW50IHdlIGFyZSBzZW5kaW5nIGlzIGZvciB0aGUgYXBwbGljYXRpb24sIHdoaWNoCisgICAgICAgICAgICAgICAgLy8gd29uJ3QgaGF2ZSBwZXJtaXNzaW9uIHRvIGltbWVkaWF0ZWx5IHN0YXJ0IGFuIGFjdGl2aXR5IGFmdGVyCisgICAgICAgICAgICAgICAgLy8gdGhlIHVzZXIgc3dpdGNoZXMgdG8gaG9tZS4gIFdlIGtub3cgaXQgaXMgc2FmZSB0byBkbyBhdCB0aGlzCisgICAgICAgICAgICAgICAgLy8gcG9pbnQsIHNvIG1ha2Ugc3VyZSBuZXcgYWN0aXZpdHkgc3dpdGNoZXMgYXJlIG5vdyBhbGxvd2VkLgorICAgICAgICAgICAgICAgIEFjdGl2aXR5TWFuYWdlck5hdGl2ZS5nZXREZWZhdWx0KCkucmVzdW1lQXBwU3dpdGNoZXMoKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChtSW50ZW50ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBpbnRbXSBwb3MgPSBuZXcgaW50WzJdOworICAgICAgICAgICAgICAgIHYuZ2V0TG9jYXRpb25PblNjcmVlbihwb3MpOworICAgICAgICAgICAgICAgIEludGVudCBvdmVybGF5ID0gbmV3IEludGVudCgpOworICAgICAgICAgICAgICAgIG92ZXJsYXkuc2V0U291cmNlQm91bmRzKAorICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFJlY3QocG9zWzBdLCBwb3NbMV0sIHBvc1swXSt2LmdldFdpZHRoKCksIHBvc1sxXSt2LmdldEhlaWdodCgpKSk7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgbUludGVudC5zZW5kKFBob25lU3RhdHVzQmFyU2VydmljZS50aGlzLCAwLCBvdmVybGF5KTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChQZW5kaW5nSW50ZW50LkNhbmNlbGVkRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHN0YWNrIHRyYWNlIGlzbid0IHZlcnkgaGVscGZ1bCBoZXJlLiAgSnVzdCBsb2cgdGhlIGV4Y2VwdGlvbiBtZXNzYWdlLgorICAgICAgICAgICAgICAgICAgICBTbG9nLncoVEFHLCAiU2VuZGluZyBjb250ZW50SW50ZW50IGZhaWxlZDogIiArIGUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBtQmFyU2VydmljZS5vbk5vdGlmaWNhdGlvbkNsaWNrKG1Qa2csIG1UYWcsIG1JZCk7CisgICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgICAgICAvLyBzeXN0ZW0gcHJvY2VzcyBpcyBkZWFkIGlmIHdlJ3JlIGhlcmUuCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIGNsb3NlIHRoZSBzaGFkZSBpZiBpdCB3YXMgb3BlbgorICAgICAgICAgICAgYW5pbWF0ZUNvbGxhcHNlKCk7CisKKyAgICAgICAgICAgIC8vIElmIHRoaXMgY2xpY2sgd2FzIG9uIHRoZSBpbnRydWRlciBhbGVydCwgaGlkZSB0aGF0IGluc3RlYWQKKyAgICAgICAgICAgIG1IYW5kbGVyLnNlbmRFbXB0eU1lc3NhZ2UoTVNHX0hJREVfSU5UUlVERVIpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHRpY2soU3RhdHVzQmFyTm90aWZpY2F0aW9uIG4pIHsKKyAgICAgICAgLy8gU2hvdyB0aGUgdGlja2VyIGlmIG9uZSBpcyByZXF1ZXN0ZWQuIEFsc28gZG9uJ3QgZG8gdGhpcworICAgICAgICAvLyB1bnRpbCBzdGF0dXMgYmFyIHdpbmRvdyBpcyBhdHRhY2hlZCB0byB0aGUgd2luZG93IG1hbmFnZXIsCisgICAgICAgIC8vIGJlY2F1c2UuLi4gIHdlbGwsIHdoYXQncyB0aGUgcG9pbnQgb3RoZXJ3aXNlPyAgQW5kIHRyeWluZyB0bworICAgICAgICAvLyBydW4gYSB0aWNrZXIgd2l0aG91dCBiZWluZyBhdHRhY2hlZCB3aWxsIGNyYXNoIQorICAgICAgICBpZiAobi5ub3RpZmljYXRpb24udGlja2VyVGV4dCAhPSBudWxsICYmIG1TdGF0dXNCYXJWaWV3LmdldFdpbmRvd1Rva2VuKCkgIT0gbnVsbCkgeworICAgICAgICAgICAgaWYgKDAgPT0gKG1EaXNhYmxlZCAmIChTdGF0dXNCYXJNYW5hZ2VyLkRJU0FCTEVfTk9USUZJQ0FUSU9OX0lDT05TCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBTdGF0dXNCYXJNYW5hZ2VyLkRJU0FCTEVfTk9USUZJQ0FUSU9OX1RJQ0tFUikpKSB7CisgICAgICAgICAgICAgICAgbVRpY2tlci5hZGRFbnRyeShuKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIENhbmNlbCB0aGlzIG5vdGlmaWNhdGlvbiBhbmQgdGVsbCB0aGUgU3RhdHVzQmFyTWFuYWdlclNlcnZpY2UgLyBOb3RpZmljYXRpb25NYW5hZ2VyU2VydmljZQorICAgICAqIGFib3V0IHRoZSBmYWlsdXJlLgorICAgICAqCisgICAgICogV0FSTklORzogdGhpcyB3aWxsIGNhbGwgYmFjayBpbnRvIHVzLiAgRG9uJ3QgaG9sZCBhbnkgbG9ja3MuCisgICAgICovCisgICAgdm9pZCBoYW5kbGVOb3RpZmljYXRpb25FcnJvcihJQmluZGVyIGtleSwgU3RhdHVzQmFyTm90aWZpY2F0aW9uIG4sIFN0cmluZyBtZXNzYWdlKSB7CisgICAgICAgIHJlbW92ZU5vdGlmaWNhdGlvbihrZXkpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgbUJhclNlcnZpY2Uub25Ob3RpZmljYXRpb25FcnJvcihuLnBrZywgbi50YWcsIG4uaWQsIG4udWlkLCBuLmluaXRpYWxQaWQsIG1lc3NhZ2UpOworICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgIC8vIFRoZSBlbmQgaXMgbmlnaC4KKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgY2xhc3MgTXlUaWNrZXIgZXh0ZW5kcyBUaWNrZXIgeworICAgICAgICBNeVRpY2tlcihDb250ZXh0IGNvbnRleHQsIFZpZXcgc2IpIHsKKyAgICAgICAgICAgIHN1cGVyKGNvbnRleHQsIHNiKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCB0aWNrZXJTdGFydGluZygpIHsKKyAgICAgICAgICAgIG1UaWNraW5nID0gdHJ1ZTsKKyAgICAgICAgICAgIG1JY29ucy5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7CisgICAgICAgICAgICBtVGlja2VyVmlldy5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7CisgICAgICAgICAgICBtVGlja2VyVmlldy5zdGFydEFuaW1hdGlvbihsb2FkQW5pbShjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmFuaW0ucHVzaF91cF9pbiwgbnVsbCkpOworICAgICAgICAgICAgbUljb25zLnN0YXJ0QW5pbWF0aW9uKGxvYWRBbmltKGNvbS5hbmRyb2lkLmludGVybmFsLlIuYW5pbS5wdXNoX3VwX291dCwgbnVsbCkpOworICAgICAgICAgICAgaWYgKG1FeHBhbmRlZFZpc2libGUpIHsKKyAgICAgICAgICAgICAgICBzZXREYXRlVmlld1Zpc2liaWxpdHkoZmFsc2UsIGNvbS5hbmRyb2lkLmludGVybmFsLlIuYW5pbS5wdXNoX3VwX291dCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgdGlja2VyRG9uZSgpIHsKKyAgICAgICAgICAgIG1JY29ucy5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7CisgICAgICAgICAgICBtVGlja2VyVmlldy5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7CisgICAgICAgICAgICBtSWNvbnMuc3RhcnRBbmltYXRpb24obG9hZEFuaW0oY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5hbmltLnB1c2hfZG93bl9pbiwgbnVsbCkpOworICAgICAgICAgICAgbVRpY2tlclZpZXcuc3RhcnRBbmltYXRpb24obG9hZEFuaW0oY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5hbmltLnB1c2hfZG93bl9vdXQsCisgICAgICAgICAgICAgICAgICAgICAgICBtVGlja2luZ0RvbmVMaXN0ZW5lcikpOworICAgICAgICAgICAgaWYgKG1FeHBhbmRlZFZpc2libGUpIHsKKyAgICAgICAgICAgICAgICBzZXREYXRlVmlld1Zpc2liaWxpdHkodHJ1ZSwgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5hbmltLnB1c2hfZG93bl9pbik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCB0aWNrZXJIYWx0aW5nKCkgeworICAgICAgICAgICAgbUljb25zLnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKKyAgICAgICAgICAgIG1UaWNrZXJWaWV3LnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKKyAgICAgICAgICAgIG1JY29ucy5zdGFydEFuaW1hdGlvbihsb2FkQW5pbShjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmFuaW0uZmFkZV9pbiwgbnVsbCkpOworICAgICAgICAgICAgbVRpY2tlclZpZXcuc3RhcnRBbmltYXRpb24obG9hZEFuaW0oY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5hbmltLmZhZGVfb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgbVRpY2tpbmdEb25lTGlzdGVuZXIpKTsKKyAgICAgICAgICAgIGlmIChtRXhwYW5kZWRWaXNpYmxlKSB7CisgICAgICAgICAgICAgICAgc2V0RGF0ZVZpZXdWaXNpYmlsaXR5KHRydWUsIGNvbS5hbmRyb2lkLmludGVybmFsLlIuYW5pbS5mYWRlX2luKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIEFuaW1hdGlvbi5BbmltYXRpb25MaXN0ZW5lciBtVGlja2luZ0RvbmVMaXN0ZW5lciA9IG5ldyBBbmltYXRpb24uQW5pbWF0aW9uTGlzdGVuZXIoKSB7OworICAgICAgICBwdWJsaWMgdm9pZCBvbkFuaW1hdGlvbkVuZChBbmltYXRpb24gYW5pbWF0aW9uKSB7CisgICAgICAgICAgICBtVGlja2luZyA9IGZhbHNlOworICAgICAgICB9CisgICAgICAgIHB1YmxpYyB2b2lkIG9uQW5pbWF0aW9uUmVwZWF0KEFuaW1hdGlvbiBhbmltYXRpb24pIHsKKyAgICAgICAgfQorICAgICAgICBwdWJsaWMgdm9pZCBvbkFuaW1hdGlvblN0YXJ0KEFuaW1hdGlvbiBhbmltYXRpb24pIHsKKyAgICAgICAgfQorICAgIH07CisKKyAgICBwcml2YXRlIEFuaW1hdGlvbiBsb2FkQW5pbShpbnQgaWQsIEFuaW1hdGlvbi5BbmltYXRpb25MaXN0ZW5lciBsaXN0ZW5lcikgeworICAgICAgICBBbmltYXRpb24gYW5pbSA9IEFuaW1hdGlvblV0aWxzLmxvYWRBbmltYXRpb24oUGhvbmVTdGF0dXNCYXJTZXJ2aWNlLnRoaXMsIGlkKTsKKyAgICAgICAgaWYgKGxpc3RlbmVyICE9IG51bGwpIHsKKyAgICAgICAgICAgIGFuaW0uc2V0QW5pbWF0aW9uTGlzdGVuZXIobGlzdGVuZXIpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBhbmltOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgdmlld0luZm8oVmlldyB2KSB7CisgICAgICAgIHJldHVybiAiKCIgKyB2LmdldExlZnQoKSArICIsIiArIHYuZ2V0VG9wKCkgKyAiKSgiICsgdi5nZXRSaWdodCgpICsgIiwiICsgdi5nZXRCb3R0b20oKQorICAgICAgICAgICAgICAgICsgIiAiICsgdi5nZXRXaWR0aCgpICsgIngiICsgdi5nZXRIZWlnaHQoKSArICIpIjsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgdm9pZCBkdW1wKEZpbGVEZXNjcmlwdG9yIGZkLCBQcmludFdyaXRlciBwdywgU3RyaW5nW10gYXJncykgeworICAgICAgICBpZiAoY2hlY2tDYWxsaW5nT3JTZWxmUGVybWlzc2lvbihhbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24uRFVNUCkKKyAgICAgICAgICAgICAgICAhPSBQYWNrYWdlTWFuYWdlci5QRVJNSVNTSU9OX0dSQU5URUQpIHsKKyAgICAgICAgICAgIHB3LnByaW50bG4oIlBlcm1pc3Npb24gRGVuaWFsOiBjYW4ndCBkdW1wIFN0YXR1c0JhciBmcm9tIGZyb20gcGlkPSIKKyAgICAgICAgICAgICAgICAgICAgKyBCaW5kZXIuZ2V0Q2FsbGluZ1BpZCgpCisgICAgICAgICAgICAgICAgICAgICsgIiwgdWlkPSIgKyBCaW5kZXIuZ2V0Q2FsbGluZ1VpZCgpKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIHN5bmNocm9uaXplZCAobVF1ZXVlTG9jaykgeworICAgICAgICAgICAgcHcucHJpbnRsbigiQ3VycmVudCBTdGF0dXMgQmFyIHN0YXRlOiIpOworICAgICAgICAgICAgcHcucHJpbnRsbigiICBtRXhwYW5kZWQ9IiArIG1FeHBhbmRlZAorICAgICAgICAgICAgICAgICAgICArICIsIG1FeHBhbmRlZFZpc2libGU9IiArIG1FeHBhbmRlZFZpc2libGUpOworICAgICAgICAgICAgcHcucHJpbnRsbigiICBtVGlja2luZz0iICsgbVRpY2tpbmcpOworICAgICAgICAgICAgcHcucHJpbnRsbigiICBtVHJhY2tpbmc9IiArIG1UcmFja2luZyk7CisgICAgICAgICAgICBwdy5wcmludGxuKCIgIG1BbmltYXRpbmc9IiArIG1BbmltYXRpbmcKKyAgICAgICAgICAgICAgICAgICAgKyAiLCBtQW5pbVk9IiArIG1BbmltWSArICIsIG1BbmltVmVsPSIgKyBtQW5pbVZlbAorICAgICAgICAgICAgICAgICAgICArICIsIG1BbmltQWNjZWw9IiArIG1BbmltQWNjZWwpOworICAgICAgICAgICAgcHcucHJpbnRsbigiICBtQ3VyQW5pbWF0aW9uVGltZT0iICsgbUN1ckFuaW1hdGlvblRpbWUKKyAgICAgICAgICAgICAgICAgICAgKyAiIG1BbmltTGFzdFRpbWU9IiArIG1BbmltTGFzdFRpbWUpOworICAgICAgICAgICAgcHcucHJpbnRsbigiICBtRGlzcGxheUhlaWdodD0iICsgbURpc3BsYXlIZWlnaHQKKyAgICAgICAgICAgICAgICAgICAgKyAiIG1BbmltYXRpbmdSZXZlYWw9IiArIG1BbmltYXRpbmdSZXZlYWwKKyAgICAgICAgICAgICAgICAgICAgKyAiIG1WaWV3RGVsdGE9IiArIG1WaWV3RGVsdGEpOworICAgICAgICAgICAgcHcucHJpbnRsbigiICBtRGlzcGxheUhlaWdodD0iICsgbURpc3BsYXlIZWlnaHQpOworICAgICAgICAgICAgcHcucHJpbnRsbigiICBtRXhwYW5kZWRQYXJhbXM6ICIgKyBtRXhwYW5kZWRQYXJhbXMpOworICAgICAgICAgICAgcHcucHJpbnRsbigiICBtRXhwYW5kZWRWaWV3OiAiICsgdmlld0luZm8obUV4cGFuZGVkVmlldykpOworICAgICAgICAgICAgcHcucHJpbnRsbigiICBtRXhwYW5kZWREaWFsb2c6ICIgKyBtRXhwYW5kZWREaWFsb2cpOworICAgICAgICAgICAgcHcucHJpbnRsbigiICBtVHJhY2tpbmdQYXJhbXM6ICIgKyBtVHJhY2tpbmdQYXJhbXMpOworICAgICAgICAgICAgcHcucHJpbnRsbigiICBtVHJhY2tpbmdWaWV3OiAiICsgdmlld0luZm8obVRyYWNraW5nVmlldykpOworICAgICAgICAgICAgcHcucHJpbnRsbigiICBtT25nb2luZ1RpdGxlOiAiICsgdmlld0luZm8obU9uZ29pbmdUaXRsZSkpOworICAgICAgICAgICAgcHcucHJpbnRsbigiICBtT25nb2luZ0l0ZW1zOiAiICsgdmlld0luZm8obU9uZ29pbmdJdGVtcykpOworICAgICAgICAgICAgcHcucHJpbnRsbigiICBtTGF0ZXN0VGl0bGU6ICIgKyB2aWV3SW5mbyhtTGF0ZXN0VGl0bGUpKTsKKyAgICAgICAgICAgIHB3LnByaW50bG4oIiAgbUxhdGVzdEl0ZW1zOiAiICsgdmlld0luZm8obUxhdGVzdEl0ZW1zKSk7CisgICAgICAgICAgICBwdy5wcmludGxuKCIgIG1Ob05vdGlmaWNhdGlvbnNUaXRsZTogIiArIHZpZXdJbmZvKG1Ob05vdGlmaWNhdGlvbnNUaXRsZSkpOworICAgICAgICAgICAgcHcucHJpbnRsbigiICBtQ2xvc2VWaWV3OiAiICsgdmlld0luZm8obUNsb3NlVmlldykpOworICAgICAgICAgICAgcHcucHJpbnRsbigiICBtVGlja2VyVmlldzogIiArIHZpZXdJbmZvKG1UaWNrZXJWaWV3KSk7CisgICAgICAgICAgICBwdy5wcmludGxuKCIgIG1TY3JvbGxWaWV3OiAiICsgdmlld0luZm8obVNjcm9sbFZpZXcpCisgICAgICAgICAgICAgICAgICAgICsgIiBzY3JvbGwgIiArIG1TY3JvbGxWaWV3LmdldFNjcm9sbFgoKSArICIsIiArIG1TY3JvbGxWaWV3LmdldFNjcm9sbFkoKSk7CisgICAgICAgICAgICBwdy5wcmludGxuKCJtTm90aWZpY2F0aW9uTGluZWFyTGF5b3V0OiAiICsgdmlld0luZm8obU5vdGlmaWNhdGlvbkxpbmVhckxheW91dCkpOworICAgICAgICB9CisgICAgICAgIC8qCisgICAgICAgIHN5bmNocm9uaXplZCAobU5vdGlmaWNhdGlvbkRhdGEpIHsKKyAgICAgICAgICAgIGludCBOID0gbU5vdGlmaWNhdGlvbkRhdGEub25nb2luZ0NvdW50KCk7CisgICAgICAgICAgICBwdy5wcmludGxuKCIgIG9uZ29pbmdDb3VudC5zaXplPSIgKyBOKTsKKyAgICAgICAgICAgIGZvciAoaW50IGk9MDsgaTxOOyBpKyspIHsKKyAgICAgICAgICAgICAgICBTdGF0dXNCYXJOb3RpZmljYXRpb24gbiA9IG1Ob3RpZmljYXRpb25EYXRhLmdldE9uZ29pbmcoaSk7CisgICAgICAgICAgICAgICAgcHcucHJpbnRsbigiICAgIFsiICsgaSArICJdIGtleT0iICsgbi5rZXkgKyAiIHZpZXc9IiArIG4udmlldyk7CisgICAgICAgICAgICAgICAgcHcucHJpbnRsbigiICAgICAgICAgICBkYXRhPSIgKyBuLmRhdGEpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgTiA9IG1Ob3RpZmljYXRpb25EYXRhLmxhdGVzdENvdW50KCk7CisgICAgICAgICAgICBwdy5wcmludGxuKCIgIG9uZ29pbmdDb3VudC5zaXplPSIgKyBOKTsKKyAgICAgICAgICAgIGZvciAoaW50IGk9MDsgaTxOOyBpKyspIHsKKyAgICAgICAgICAgICAgICBTdGF0dXNCYXJOb3RpZmljYXRpb24gbiA9IG1Ob3RpZmljYXRpb25EYXRhLmdldExhdGVzdChpKTsKKyAgICAgICAgICAgICAgICBwdy5wcmludGxuKCIgICAgWyIgKyBpICsgIl0ga2V5PSIgKyBuLmtleSArICIgdmlldz0iICsgbi52aWV3KTsKKyAgICAgICAgICAgICAgICBwdy5wcmludGxuKCIgICAgICAgICAgIGRhdGE9IiArIG4uZGF0YSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgKi8KKworICAgICAgICBpZiAoZmFsc2UpIHsKKyAgICAgICAgICAgIHB3LnByaW50bG4oInNlZSB0aGUgbG9nY2F0IGZvciBhIGR1bXAgb2YgdGhlIHZpZXdzIHdlIGhhdmUgY3JlYXRlZC4iKTsKKyAgICAgICAgICAgIC8vIG11c3QgaGFwcGVuIG9uIHVpIHRocmVhZAorICAgICAgICAgICAgbUhhbmRsZXIucG9zdChuZXcgUnVubmFibGUoKSB7CisgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1TdGF0dXNCYXJWaWV3LmdldExvY2F0aW9uT25TY3JlZW4obUFic1Bvcyk7CisgICAgICAgICAgICAgICAgICAgICAgICBTbG9nLmQoVEFHLCAibVN0YXR1c0JhclZpZXc6IC0tLS0tICgiICsgbUFic1Bvc1swXSArICIsIiArIG1BYnNQb3NbMV0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiKSAiICsgbVN0YXR1c0JhclZpZXcuZ2V0V2lkdGgoKSArICJ4IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIG1TdGF0dXNCYXJWaWV3LmdldEhlaWdodCgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1TdGF0dXNCYXJWaWV3LmRlYnVnKCk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIG1FeHBhbmRlZFZpZXcuZ2V0TG9jYXRpb25PblNjcmVlbihtQWJzUG9zKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFNsb2cuZChUQUcsICJtRXhwYW5kZWRWaWV3OiAtLS0tLSAoIiArIG1BYnNQb3NbMF0gKyAiLCIgKyBtQWJzUG9zWzFdCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIikgIiArIG1FeHBhbmRlZFZpZXcuZ2V0V2lkdGgoKSArICJ4IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIG1FeHBhbmRlZFZpZXcuZ2V0SGVpZ2h0KCkpOworICAgICAgICAgICAgICAgICAgICAgICAgbUV4cGFuZGVkVmlldy5kZWJ1ZygpOworCisgICAgICAgICAgICAgICAgICAgICAgICBtVHJhY2tpbmdWaWV3LmdldExvY2F0aW9uT25TY3JlZW4obUFic1Bvcyk7CisgICAgICAgICAgICAgICAgICAgICAgICBTbG9nLmQoVEFHLCAibVRyYWNraW5nVmlldzogLS0tLS0gKCIgKyBtQWJzUG9zWzBdICsgIiwiICsgbUFic1Bvc1sxXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIpICIgKyBtVHJhY2tpbmdWaWV3LmdldFdpZHRoKCkgKyAieCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBtVHJhY2tpbmdWaWV3LmdldEhlaWdodCgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1UcmFja2luZ1ZpZXcuZGVidWcoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0pOworICAgICAgICB9CisgICAgfQorCisgICAgdm9pZCBvbkJhclZpZXdBdHRhY2hlZCgpIHsKKyAgICAgICAgV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMgbHA7CisgICAgICAgIGludCBwaXhlbEZvcm1hdDsKKyAgICAgICAgRHJhd2FibGUgYmc7CisKKyAgICAgICAgLy8vIC0tLS0tLS0tLS0gVHJhY2tpbmcgVmlldyAtLS0tLS0tLS0tLS0tLQorICAgICAgICBwaXhlbEZvcm1hdCA9IFBpeGVsRm9ybWF0LlJHQlhfODg4ODsKKyAgICAgICAgYmcgPSBtVHJhY2tpbmdWaWV3LmdldEJhY2tncm91bmQoKTsKKyAgICAgICAgaWYgKGJnICE9IG51bGwpIHsKKyAgICAgICAgICAgIHBpeGVsRm9ybWF0ID0gYmcuZ2V0T3BhY2l0eSgpOworICAgICAgICB9CisKKyAgICAgICAgbHAgPSBuZXcgV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMoCisgICAgICAgICAgICAgICAgVmlld0dyb3VwLkxheW91dFBhcmFtcy5NQVRDSF9QQVJFTlQsCisgICAgICAgICAgICAgICAgVmlld0dyb3VwLkxheW91dFBhcmFtcy5NQVRDSF9QQVJFTlQsCisgICAgICAgICAgICAgICAgV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMuVFlQRV9TVEFUVVNfQkFSX1BBTkVMLAorICAgICAgICAgICAgICAgIFdpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zLkZMQUdfTEFZT1VUX0lOX1NDUkVFTgorICAgICAgICAgICAgICAgIHwgV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMuRkxBR19MQVlPVVRfTk9fTElNSVRTCisgICAgICAgICAgICAgICAgfCBXaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcy5GTEFHX0FMVF9GT0NVU0FCTEVfSU0sCisgICAgICAgICAgICAgICAgcGl4ZWxGb3JtYXQpOworLy8gICAgICAgIGxwLnRva2VuID0gbVN0YXR1c0JhclZpZXcuZ2V0V2luZG93VG9rZW4oKTsKKyAgICAgICAgbHAuZ3Jhdml0eSA9IEdyYXZpdHkuVE9QIHwgR3Jhdml0eS5GSUxMX0hPUklaT05UQUw7CisgICAgICAgIGxwLnNldFRpdGxlKCJUcmFja2luZ1ZpZXciKTsKKyAgICAgICAgbHAueSA9IG1UcmFja2luZ1Bvc2l0aW9uOworICAgICAgICBtVHJhY2tpbmdQYXJhbXMgPSBscDsKKworICAgICAgICBXaW5kb3dNYW5hZ2VySW1wbC5nZXREZWZhdWx0KCkuYWRkVmlldyhtVHJhY2tpbmdWaWV3LCBscCk7CisgICAgfQorCisgICAgdm9pZCBvblRyYWNraW5nVmlld0F0dGFjaGVkKCkgeworICAgICAgICBXaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcyBscDsKKyAgICAgICAgaW50IHBpeGVsRm9ybWF0OworICAgICAgICBEcmF3YWJsZSBiZzsKKworICAgICAgICAvLy8gLS0tLS0tLS0tLSBFeHBhbmRlZCBWaWV3IC0tLS0tLS0tLS0tLS0tCisgICAgICAgIHBpeGVsRm9ybWF0ID0gUGl4ZWxGb3JtYXQuVFJBTlNMVUNFTlQ7CisKKyAgICAgICAgZmluYWwgaW50IGRpc3BoID0gbURpc3BsYXkuZ2V0SGVpZ2h0KCk7CisgICAgICAgIGxwID0gbUV4cGFuZGVkRGlhbG9nLmdldFdpbmRvdygpLmdldEF0dHJpYnV0ZXMoKTsKKyAgICAgICAgbHAud2lkdGggPSBWaWV3R3JvdXAuTGF5b3V0UGFyYW1zLk1BVENIX1BBUkVOVDsKKyAgICAgICAgbHAuaGVpZ2h0ID0gZ2V0RXhwYW5kZWRIZWlnaHQoKTsKKyAgICAgICAgbHAueCA9IDA7CisgICAgICAgIG1UcmFja2luZ1Bvc2l0aW9uID0gbHAueSA9IC1kaXNwaDsgLy8gc3VmZmljaWVudGx5IGxhcmdlIG5lZ2F0aXZlCisgICAgICAgIGxwLnR5cGUgPSBXaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcy5UWVBFX1NUQVRVU19CQVJfUEFORUw7CisgICAgICAgIGxwLmZsYWdzID0gV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMuRkxBR19MQVlPVVRfSU5fU0NSRUVOCisgICAgICAgICAgICAgICAgfCBXaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcy5GTEFHX0xBWU9VVF9OT19MSU1JVFMKKyAgICAgICAgICAgICAgICB8IFdpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zLkZMQUdfTk9UX1RPVUNIX01PREFMCisgICAgICAgICAgICAgICAgfCBXaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcy5GTEFHX0RJVEhFUgorICAgICAgICAgICAgICAgIHwgV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMuRkxBR19OT1RfRk9DVVNBQkxFOworICAgICAgICBscC5mb3JtYXQgPSBwaXhlbEZvcm1hdDsKKyAgICAgICAgbHAuZ3Jhdml0eSA9IEdyYXZpdHkuVE9QIHwgR3Jhdml0eS5GSUxMX0hPUklaT05UQUw7CisgICAgICAgIGxwLnNldFRpdGxlKCJTdGF0dXNCYXJFeHBhbmRlZCIpOworICAgICAgICBtRXhwYW5kZWREaWFsb2cuZ2V0V2luZG93KCkuc2V0QXR0cmlidXRlcyhscCk7CisgICAgICAgIG1FeHBhbmRlZERpYWxvZy5nZXRXaW5kb3coKS5zZXRGb3JtYXQocGl4ZWxGb3JtYXQpOworICAgICAgICBtRXhwYW5kZWRQYXJhbXMgPSBscDsKKworICAgICAgICBtRXhwYW5kZWREaWFsb2cuZ2V0V2luZG93KCkucmVxdWVzdEZlYXR1cmUoV2luZG93LkZFQVRVUkVfTk9fVElUTEUpOworICAgICAgICBtRXhwYW5kZWREaWFsb2cuc2V0Q29udGVudFZpZXcobUV4cGFuZGVkVmlldywKKyAgICAgICAgICAgICAgICBuZXcgVmlld0dyb3VwLkxheW91dFBhcmFtcyhWaWV3R3JvdXAuTGF5b3V0UGFyYW1zLk1BVENIX1BBUkVOVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWaWV3R3JvdXAuTGF5b3V0UGFyYW1zLk1BVENIX1BBUkVOVCkpOworICAgICAgICBtRXhwYW5kZWREaWFsb2cuZ2V0V2luZG93KCkuc2V0QmFja2dyb3VuZERyYXdhYmxlKG51bGwpOworICAgICAgICBtRXhwYW5kZWREaWFsb2cuc2hvdygpOworICAgICAgICBGcmFtZUxheW91dCBoYWNrID0gKEZyYW1lTGF5b3V0KW1FeHBhbmRlZFZpZXcuZ2V0UGFyZW50KCk7CisgICAgfQorCisgICAgdm9pZCBzZXREYXRlVmlld1Zpc2liaWxpdHkoYm9vbGVhbiB2aXNpYmxlLCBpbnQgYW5pbSkgeworICAgICAgICBtRGF0ZVZpZXcuc2V0VXBkYXRlcyh2aXNpYmxlKTsKKyAgICAgICAgbURhdGVWaWV3LnNldFZpc2liaWxpdHkodmlzaWJsZSA/IFZpZXcuVklTSUJMRSA6IFZpZXcuSU5WSVNJQkxFKTsKKyAgICAgICAgbURhdGVWaWV3LnN0YXJ0QW5pbWF0aW9uKGxvYWRBbmltKGFuaW0sIG51bGwpKTsKKyAgICB9CisKKyAgICB2b2lkIHNldE5vdGlmaWNhdGlvbkljb25WaXNpYmlsaXR5KGJvb2xlYW4gdmlzaWJsZSwgaW50IGFuaW0pIHsKKyAgICAgICAgaW50IG9sZCA9IG1Ob3RpZmljYXRpb25JY29ucy5nZXRWaXNpYmlsaXR5KCk7CisgICAgICAgIGludCB2ID0gdmlzaWJsZSA/IFZpZXcuVklTSUJMRSA6IFZpZXcuSU5WSVNJQkxFOworICAgICAgICBpZiAob2xkICE9IHYpIHsKKyAgICAgICAgICAgIG1Ob3RpZmljYXRpb25JY29ucy5zZXRWaXNpYmlsaXR5KHYpOworICAgICAgICAgICAgbU5vdGlmaWNhdGlvbkljb25zLnN0YXJ0QW5pbWF0aW9uKGxvYWRBbmltKGFuaW0sIG51bGwpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHZvaWQgdXBkYXRlRXhwYW5kZWRWaWV3UG9zKGludCBleHBhbmRlZFBvc2l0aW9uKSB7CisgICAgICAgIGlmIChTUEVXKSB7CisgICAgICAgICAgICBTbG9nLmQoVEFHLCAidXBkYXRlRXhwYW5kZWRWaWV3UG9zIGJlZm9yZSBleHBhbmRlZFBvc2l0aW9uPSIgKyBleHBhbmRlZFBvc2l0aW9uCisgICAgICAgICAgICAgICAgICAgICsgIiBtVHJhY2tpbmdQYXJhbXMueT0iICsgbVRyYWNraW5nUGFyYW1zLnkKKyAgICAgICAgICAgICAgICAgICAgKyAiIG1UcmFja2luZ1Bvc2l0aW9uPSIgKyBtVHJhY2tpbmdQb3NpdGlvbik7CisgICAgICAgIH0KKworICAgICAgICBpbnQgaCA9IG1TdGF0dXNCYXJWaWV3LmdldEhlaWdodCgpOworICAgICAgICBpbnQgZGlzcGggPSBtRGlzcGxheS5nZXRIZWlnaHQoKTsKKworICAgICAgICAvLyBJZiB0aGUgZXhwYW5kZWQgdmlldyBpcyBub3QgdmlzaWJsZSwgbWFrZSBzdXJlIHRoZXkncmUgc3RpbGwgb2ZmIHNjcmVlbi4KKyAgICAgICAgLy8gTWF5YmUgdGhlIHZpZXcgd2FzIHJlc2l6ZWQuCisgICAgICAgIGlmICghbUV4cGFuZGVkVmlzaWJsZSkgeworICAgICAgICAgICAgaWYgKG1UcmFja2luZ1ZpZXcgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG1UcmFja2luZ1Bvc2l0aW9uID0gLWRpc3BoOworICAgICAgICAgICAgICAgIGlmIChtVHJhY2tpbmdQYXJhbXMgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBtVHJhY2tpbmdQYXJhbXMueSA9IG1UcmFja2luZ1Bvc2l0aW9uOworICAgICAgICAgICAgICAgICAgICBXaW5kb3dNYW5hZ2VySW1wbC5nZXREZWZhdWx0KCkudXBkYXRlVmlld0xheW91dChtVHJhY2tpbmdWaWV3LCBtVHJhY2tpbmdQYXJhbXMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChtRXhwYW5kZWRQYXJhbXMgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG1FeHBhbmRlZFBhcmFtcy55ID0gLWRpc3BoOworICAgICAgICAgICAgICAgIG1FeHBhbmRlZERpYWxvZy5nZXRXaW5kb3coKS5zZXRBdHRyaWJ1dGVzKG1FeHBhbmRlZFBhcmFtcyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICAvLyB0cmFja2luZyB2aWV3Li4uCisgICAgICAgIGludCBwb3M7CisgICAgICAgIGlmIChleHBhbmRlZFBvc2l0aW9uID09IEVYUEFOREVEX0ZVTExfT1BFTikgeworICAgICAgICAgICAgcG9zID0gaDsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChleHBhbmRlZFBvc2l0aW9uID09IEVYUEFOREVEX0xFQVZFX0FMT05FKSB7CisgICAgICAgICAgICBwb3MgPSBtVHJhY2tpbmdQb3NpdGlvbjsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIGlmIChleHBhbmRlZFBvc2l0aW9uIDw9IGRpc3BoKSB7CisgICAgICAgICAgICAgICAgcG9zID0gZXhwYW5kZWRQb3NpdGlvbjsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcG9zID0gZGlzcGg7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwb3MgLT0gZGlzcGgtaDsKKyAgICAgICAgfQorICAgICAgICBtVHJhY2tpbmdQb3NpdGlvbiA9IG1UcmFja2luZ1BhcmFtcy55ID0gcG9zOworICAgICAgICBtVHJhY2tpbmdQYXJhbXMuaGVpZ2h0ID0gZGlzcGgtaDsKKyAgICAgICAgV2luZG93TWFuYWdlckltcGwuZ2V0RGVmYXVsdCgpLnVwZGF0ZVZpZXdMYXlvdXQobVRyYWNraW5nVmlldywgbVRyYWNraW5nUGFyYW1zKTsKKworICAgICAgICBpZiAobUV4cGFuZGVkUGFyYW1zICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1DbG9zZVZpZXcuZ2V0TG9jYXRpb25JbldpbmRvdyhtUG9zaXRpb25UbXApOworICAgICAgICAgICAgZmluYWwgaW50IGNsb3NlUG9zID0gbVBvc2l0aW9uVG1wWzFdOworCisgICAgICAgICAgICBtRXhwYW5kZWRDb250ZW50cy5nZXRMb2NhdGlvbkluV2luZG93KG1Qb3NpdGlvblRtcCk7CisgICAgICAgICAgICBmaW5hbCBpbnQgY29udGVudHNCb3R0b20gPSBtUG9zaXRpb25UbXBbMV0gKyBtRXhwYW5kZWRDb250ZW50cy5nZXRIZWlnaHQoKTsKKworICAgICAgICAgICAgbUV4cGFuZGVkUGFyYW1zLnkgPSBwb3MgKyBtVHJhY2tpbmdWaWV3LmdldEhlaWdodCgpCisgICAgICAgICAgICAgICAgICAgIC0gKG1UcmFja2luZ1BhcmFtcy5oZWlnaHQtY2xvc2VQb3MpIC0gY29udGVudHNCb3R0b207CisgICAgICAgICAgICBpbnQgbWF4ID0gaDsKKyAgICAgICAgICAgIGlmIChtRXhwYW5kZWRQYXJhbXMueSA+IG1heCkgeworICAgICAgICAgICAgICAgIG1FeHBhbmRlZFBhcmFtcy55ID0gbWF4OworICAgICAgICAgICAgfQorICAgICAgICAgICAgaW50IG1pbiA9IG1UcmFja2luZ1Bvc2l0aW9uOworICAgICAgICAgICAgaWYgKG1FeHBhbmRlZFBhcmFtcy55IDwgbWluKSB7CisgICAgICAgICAgICAgICAgbUV4cGFuZGVkUGFyYW1zLnkgPSBtaW47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGJvb2xlYW4gdmlzaWJsZSA9IChtVHJhY2tpbmdQb3NpdGlvbiArIG1UcmFja2luZ1ZpZXcuZ2V0SGVpZ2h0KCkpID4gaDsKKyAgICAgICAgICAgIGlmICghdmlzaWJsZSkgeworICAgICAgICAgICAgICAgIC8vIGlmIHRoZSBjb250ZW50cyBhcmVuJ3QgdmlzaWJsZSwgbW92ZSB0aGUgZXhwYW5kZWQgdmlldyB3YXkgb2ZmIHNjcmVlbgorICAgICAgICAgICAgICAgIC8vIGJlY2F1c2UgdGhlIHdpbmRvdyBpdHNlbGYgZXh0ZW5kcyBiZWxvdyB0aGUgY29udGVudCB2aWV3LgorICAgICAgICAgICAgICAgIG1FeHBhbmRlZFBhcmFtcy55ID0gLWRpc3BoOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbUV4cGFuZGVkRGlhbG9nLmdldFdpbmRvdygpLnNldEF0dHJpYnV0ZXMobUV4cGFuZGVkUGFyYW1zKTsKKworICAgICAgICAgICAgLy8gQXMgbG9uZyBhcyB0aGlzIGlzbid0IGp1c3QgYSByZXBvc2l0aW9uaW5nIHRoYXQncyBub3Qgc3VwcG9zZWQgdG8gYWZmZWN0CisgICAgICAgICAgICAvLyB0aGUgdXNlcidzIHBlcmNlcHRpb24gb2Ygd2hhdCdzIHNob3dpbmcsIGNhbGwgdG8gc2F5IHRoYXQgdGhlIHZpc2liaWxpdHkKKyAgICAgICAgICAgIC8vIGhhcyBjaGFuZ2VkLiAoT3RoZXJ3aXNlLCBzb21lb25lIGVsc2Ugd2lsbCBjYWxsIHRvIGRvIHRoYXQpLgorICAgICAgICAgICAgaWYgKGV4cGFuZGVkUG9zaXRpb24gIT0gRVhQQU5ERURfTEVBVkVfQUxPTkUpIHsKKyAgICAgICAgICAgICAgICBpZiAoU1BFVykgU2xvZy5kKFRBRywgInVwZGF0ZUV4cGFuZGVkVmlld1BvcyB2aXNpYmlsaXR5Q2hhbmdlZCgiICsgdmlzaWJsZSArICIpIik7CisgICAgICAgICAgICAgICAgdmlzaWJpbGl0eUNoYW5nZWQodmlzaWJsZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoU1BFVykgeworICAgICAgICAgICAgU2xvZy5kKFRBRywgInVwZGF0ZUV4cGFuZGVkVmlld1BvcyBhZnRlciAgZXhwYW5kZWRQb3NpdGlvbj0iICsgZXhwYW5kZWRQb3NpdGlvbgorICAgICAgICAgICAgICAgICAgICArICIgbVRyYWNraW5nUGFyYW1zLnk9IiArIG1UcmFja2luZ1BhcmFtcy55CisgICAgICAgICAgICAgICAgICAgICsgIiBtVHJhY2tpbmdQb3NpdGlvbj0iICsgbVRyYWNraW5nUG9zaXRpb24KKyAgICAgICAgICAgICAgICAgICAgKyAiIG1FeHBhbmRlZFBhcmFtcy55PSIgKyBtRXhwYW5kZWRQYXJhbXMueQorICAgICAgICAgICAgICAgICAgICArICIgbUV4cGFuZGVkUGFyYW1zLmhlaWdodD0iICsgbUV4cGFuZGVkUGFyYW1zLmhlaWdodCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpbnQgZ2V0RXhwYW5kZWRIZWlnaHQoKSB7CisgICAgICAgIHJldHVybiBtRGlzcGxheS5nZXRIZWlnaHQoKSAtIG1TdGF0dXNCYXJWaWV3LmdldEhlaWdodCgpIC0gbUNsb3NlVmlldy5nZXRIZWlnaHQoKTsKKyAgICB9CisKKyAgICB2b2lkIHVwZGF0ZUV4cGFuZGVkSGVpZ2h0KCkgeworICAgICAgICBpZiAobUV4cGFuZGVkVmlldyAhPSBudWxsKSB7CisgICAgICAgICAgICBtRXhwYW5kZWRQYXJhbXMuaGVpZ2h0ID0gZ2V0RXhwYW5kZWRIZWlnaHQoKTsKKyAgICAgICAgICAgIG1FeHBhbmRlZERpYWxvZy5nZXRXaW5kb3coKS5zZXRBdHRyaWJ1dGVzKG1FeHBhbmRlZFBhcmFtcyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgTEVEcyBhcmUgdHVybmVkIG8pZmYgd2hlbiB0aGUgbm90aWZpY2F0aW9uIHBhbmVsIGlzIHNob3duLCBldmVuIGp1c3QgYSBsaXR0bGUgYml0LgorICAgICAqIFRoaXMgd2FzIGFkZGVkIGxhc3QtbWludXRlIGFuZCBpcyBpbmNvbnNpc3RlbnQgd2l0aCB0aGUgd2F5IHRoZSByZXN0IG9mIHRoZSBub3RpZmljYXRpb25zCisgICAgICogYXJlIGhhbmRsZWQsIGJlY2F1c2UgdGhlIG5vdGlmaWNhdGlvbiBpc24ndCByZWFsbHkgY2FuY2VsbGVkLiAgVGhlIGxpZ2h0cyBhcmUganVzdAorICAgICAqIHR1cm5lZCBvZmYuICBJZiBhbnkgb3RoZXIgbm90aWZpY2F0aW9ucyBoYXBwZW4sIHRoZSBsaWdodHMgd2lsbCB0dXJuIGJhY2sgb24uICBTdGV2ZSBzYXlzCisgICAgICogdGhpcyBpcyB3aGF0IGhlIHdhbnRzLiAoc2VlIGJ1ZyAxMTMxNDYxKQorICAgICAqLworICAgIHZvaWQgdmlzaWJpbGl0eUNoYW5nZWQoYm9vbGVhbiB2aXNpYmxlKSB7CisgICAgICAgIGlmIChtUGFuZWxTbGlnaHRseVZpc2libGUgIT0gdmlzaWJsZSkgeworICAgICAgICAgICAgbVBhbmVsU2xpZ2h0bHlWaXNpYmxlID0gdmlzaWJsZTsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgbUJhclNlcnZpY2Uub25QYW5lbFJldmVhbGVkKCk7CisgICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgICAgICAvLyBXb24ndCBmYWlsIHVubGVzcyB0aGUgd29ybGQgaGFzIGVuZGVkLgorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgdm9pZCBwZXJmb3JtRGlzYWJsZUFjdGlvbnMoaW50IG5ldCkgeworICAgICAgICBpbnQgb2xkID0gbURpc2FibGVkOworICAgICAgICBpbnQgZGlmZiA9IG5ldCBeIG9sZDsKKyAgICAgICAgbURpc2FibGVkID0gbmV0OworCisgICAgICAgIC8vIGFjdCBhY2NvcmRpbmdseQorICAgICAgICBpZiAoKGRpZmYgJiBTdGF0dXNCYXJNYW5hZ2VyLkRJU0FCTEVfRVhQQU5EKSAhPSAwKSB7CisgICAgICAgICAgICBpZiAoKG5ldCAmIFN0YXR1c0Jhck1hbmFnZXIuRElTQUJMRV9FWFBBTkQpICE9IDApIHsKKyAgICAgICAgICAgICAgICBTbG9nLmQoVEFHLCAiRElTQUJMRV9FWFBBTkQ6IHllcyIpOworICAgICAgICAgICAgICAgIGFuaW1hdGVDb2xsYXBzZSgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmICgoZGlmZiAmIFN0YXR1c0Jhck1hbmFnZXIuRElTQUJMRV9OT1RJRklDQVRJT05fSUNPTlMpICE9IDApIHsKKyAgICAgICAgICAgIGlmICgobmV0ICYgU3RhdHVzQmFyTWFuYWdlci5ESVNBQkxFX05PVElGSUNBVElPTl9JQ09OUykgIT0gMCkgeworICAgICAgICAgICAgICAgIFNsb2cuZChUQUcsICJESVNBQkxFX05PVElGSUNBVElPTl9JQ09OUzogeWVzIik7CisgICAgICAgICAgICAgICAgaWYgKG1UaWNraW5nKSB7CisgICAgICAgICAgICAgICAgICAgIG1Ob3RpZmljYXRpb25JY29ucy5zZXRWaXNpYmlsaXR5KFZpZXcuSU5WSVNJQkxFKTsKKyAgICAgICAgICAgICAgICAgICAgbVRpY2tlci5oYWx0KCk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgc2V0Tm90aWZpY2F0aW9uSWNvblZpc2liaWxpdHkoZmFsc2UsIGNvbS5hbmRyb2lkLmludGVybmFsLlIuYW5pbS5mYWRlX291dCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBTbG9nLmQoVEFHLCAiRElTQUJMRV9OT1RJRklDQVRJT05fSUNPTlM6IG5vIik7CisgICAgICAgICAgICAgICAgaWYgKCFtRXhwYW5kZWRWaXNpYmxlKSB7CisgICAgICAgICAgICAgICAgICAgIHNldE5vdGlmaWNhdGlvbkljb25WaXNpYmlsaXR5KHRydWUsIGNvbS5hbmRyb2lkLmludGVybmFsLlIuYW5pbS5mYWRlX2luKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAoKGRpZmYgJiBTdGF0dXNCYXJNYW5hZ2VyLkRJU0FCTEVfTk9USUZJQ0FUSU9OX1RJQ0tFUikgIT0gMCkgeworICAgICAgICAgICAgaWYgKG1UaWNraW5nICYmIChuZXQgJiBTdGF0dXNCYXJNYW5hZ2VyLkRJU0FCTEVfTk9USUZJQ0FUSU9OX1RJQ0tFUikgIT0gMCkgeworICAgICAgICAgICAgICAgIG1UaWNrZXIuaGFsdCgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBWaWV3Lk9uQ2xpY2tMaXN0ZW5lciBtQ2xlYXJCdXR0b25MaXN0ZW5lciA9IG5ldyBWaWV3Lk9uQ2xpY2tMaXN0ZW5lcigpIHsKKyAgICAgICAgcHVibGljIHZvaWQgb25DbGljayhWaWV3IHYpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgbUJhclNlcnZpY2Uub25DbGVhckFsbE5vdGlmaWNhdGlvbnMoKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgICAgIC8vIHN5c3RlbSBwcm9jZXNzIGlzIGRlYWQgaWYgd2UncmUgaGVyZS4KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGFuaW1hdGVDb2xsYXBzZSgpOworICAgICAgICB9CisgICAgfTsKKworICAgIHByaXZhdGUgQnJvYWRjYXN0UmVjZWl2ZXIgbUJyb2FkY2FzdFJlY2VpdmVyID0gbmV3IEJyb2FkY2FzdFJlY2VpdmVyKCkgeworICAgICAgICBwdWJsaWMgdm9pZCBvblJlY2VpdmUoQ29udGV4dCBjb250ZXh0LCBJbnRlbnQgaW50ZW50KSB7CisgICAgICAgICAgICBTdHJpbmcgYWN0aW9uID0gaW50ZW50LmdldEFjdGlvbigpOworICAgICAgICAgICAgaWYgKEludGVudC5BQ1RJT05fQ0xPU0VfU1lTVEVNX0RJQUxPR1MuZXF1YWxzKGFjdGlvbikKKyAgICAgICAgICAgICAgICAgICAgfHwgSW50ZW50LkFDVElPTl9TQ1JFRU5fT0ZGLmVxdWFscyhhY3Rpb24pKSB7CisgICAgICAgICAgICAgICAgYW5pbWF0ZUNvbGxhcHNlKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmIChJbnRlbnQuQUNUSU9OX0NPTkZJR1VSQVRJT05fQ0hBTkdFRC5lcXVhbHMoYWN0aW9uKSkgeworICAgICAgICAgICAgICAgIHVwZGF0ZVJlc291cmNlcygpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfTsKKworICAgIHByaXZhdGUgdm9pZCBzZXRJbnRydWRlckFsZXJ0VmlzaWJpbGl0eShib29sZWFuIHZpcykgeworICAgICAgICBtSW50cnVkZXJBbGVydFZpZXcuc2V0VmlzaWJpbGl0eSh2aXMgPyBWaWV3LlZJU0lCTEUgOiBWaWV3LkdPTkUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlbG9hZCBzb21lIG9mIG91ciByZXNvdXJjZXMgd2hlbiB0aGUgY29uZmlndXJhdGlvbiBjaGFuZ2VzLgorICAgICAqCisgICAgICogV2UgZG9uJ3QgcmVsb2FkIGV2ZXJ5dGhpbmcgd2hlbiB0aGUgY29uZmlndXJhdGlvbiBjaGFuZ2VzIC0tIHdlIHByb2JhYmx5CisgICAgICogc2hvdWxkLCBidXQgZ2V0dGluZyB0aGF0IHNtb290aCBpcyB0b3VnaC4gIFNvbWVkYXkgd2UnbGwgZml4IHRoYXQuICBJbiB0aGUKKyAgICAgKiBtZWFudGltZSwganVzdCB1cGRhdGUgdGhlIHRoaW5ncyB0aGF0IHdlIGtub3cgY2hhbmdlLgorICAgICAqLworICAgIHZvaWQgdXBkYXRlUmVzb3VyY2VzKCkgeworICAgICAgICBSZXNvdXJjZXMgcmVzID0gZ2V0UmVzb3VyY2VzKCk7CisKKyAgICAgICAgbUNsZWFyQnV0dG9uLnNldFRleHQoZ2V0VGV4dChSLnN0cmluZy5zdGF0dXNfYmFyX2NsZWFyX2FsbF9idXR0b24pKTsKKyAgICAgICAgbU9uZ29pbmdUaXRsZS5zZXRUZXh0KGdldFRleHQoUi5zdHJpbmcuc3RhdHVzX2Jhcl9vbmdvaW5nX2V2ZW50c190aXRsZSkpOworICAgICAgICBtTGF0ZXN0VGl0bGUuc2V0VGV4dChnZXRUZXh0KFIuc3RyaW5nLnN0YXR1c19iYXJfbGF0ZXN0X2V2ZW50c190aXRsZSkpOworICAgICAgICBtTm9Ob3RpZmljYXRpb25zVGl0bGUuc2V0VGV4dChnZXRUZXh0KFIuc3RyaW5nLnN0YXR1c19iYXJfbm9fbm90aWZpY2F0aW9uc190aXRsZSkpOworCisgICAgICAgIG1FZGdlQm9yZGVyID0gcmVzLmdldERpbWVuc2lvblBpeGVsU2l6ZShSLmRpbWVuLnN0YXR1c19iYXJfZWRnZV9pZ25vcmUpOworCisgICAgICAgIGlmIChmYWxzZSkgU2xvZy52KFRBRywgInVwZGF0ZVJlc291cmNlcyIpOworICAgIH0KKworICAgIC8vCisgICAgLy8gdHJhY2luZworICAgIC8vCisKKyAgICB2b2lkIHBvc3RTdGFydFRyYWNpbmcoKSB7CisgICAgICAgIG1IYW5kbGVyLnBvc3REZWxheWVkKG1TdGFydFRyYWNpbmcsIDMwMDApOworICAgIH0KKworICAgIHZvaWQgdmlicmF0ZSgpIHsKKyAgICAgICAgYW5kcm9pZC5vcy5WaWJyYXRvciB2aWIgPSAoYW5kcm9pZC5vcy5WaWJyYXRvcilnZXRTeXN0ZW1TZXJ2aWNlKENvbnRleHQuVklCUkFUT1JfU0VSVklDRSk7CisgICAgICAgIHZpYi52aWJyYXRlKDI1MCk7CisgICAgfQorCisgICAgUnVubmFibGUgbVN0YXJ0VHJhY2luZyA9IG5ldyBSdW5uYWJsZSgpIHsKKyAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgdmlicmF0ZSgpOworICAgICAgICAgICAgU3lzdGVtQ2xvY2suc2xlZXAoMjUwKTsKKyAgICAgICAgICAgIFNsb2cuZChUQUcsICJzdGFydFRyYWNpbmciKTsKKyAgICAgICAgICAgIGFuZHJvaWQub3MuRGVidWcuc3RhcnRNZXRob2RUcmFjaW5nKCIvZGF0YS9zdGF0dXNiYXItdHJhY2VzL3RyYWNlIik7CisgICAgICAgICAgICBtSGFuZGxlci5wb3N0RGVsYXllZChtU3RvcFRyYWNpbmcsIDEwMDAwKTsKKyAgICAgICAgfQorICAgIH07CisKKyAgICBSdW5uYWJsZSBtU3RvcFRyYWNpbmcgPSBuZXcgUnVubmFibGUoKSB7CisgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgIGFuZHJvaWQub3MuRGVidWcuc3RvcE1ldGhvZFRyYWNpbmcoKTsKKyAgICAgICAgICAgIFNsb2cuZChUQUcsICJzdG9wVHJhY2luZyIpOworICAgICAgICAgICAgdmlicmF0ZSgpOworICAgICAgICB9CisgICAgfTsKK30KKwpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL3N0YXR1c2Jhci9TdGF0dXNCYXJTZXJ2aWNlLmphdmEgYi9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvc3RhdHVzYmFyL1N0YXR1c0JhclNlcnZpY2UuamF2YQppbmRleCBhZjczNmFhLi42OTVmZGJhIDEwMDY0NAotLS0gYS9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvc3RhdHVzYmFyL1N0YXR1c0JhclNlcnZpY2UuamF2YQorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvc3RhdHVzYmFyL1N0YXR1c0JhclNlcnZpY2UuamF2YQpAQCAtMTcsMTg0ICsxNyw1MyBAQAogcGFja2FnZSBjb20uYW5kcm9pZC5zeXN0ZW11aS5zdGF0dXNiYXI7CiAKIGltcG9ydCBhbmRyb2lkLmFwcC5TZXJ2aWNlOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5SZXNvdXJjZXM7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5QaXhlbEZvcm1hdDsKK2ltcG9ydCBhbmRyb2lkLm9zLklCaW5kZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb247CitpbXBvcnQgYW5kcm9pZC5vcy5TZXJ2aWNlTWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuU2xvZzsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworaW1wb3J0IGFuZHJvaWQudmlldy5HcmF2aXR5OworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3R3JvdXA7CitpbXBvcnQgYW5kcm9pZC52aWV3LldpbmRvd01hbmFnZXI7CitpbXBvcnQgYW5kcm9pZC52aWV3LldpbmRvd01hbmFnZXJJbXBsOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKKwogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnN0YXR1c2Jhci5JU3RhdHVzQmFyOwogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnN0YXR1c2Jhci5JU3RhdHVzQmFyU2VydmljZTsKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC5zdGF0dXNiYXIuU3RhdHVzQmFySWNvbjsKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC5zdGF0dXNiYXIuU3RhdHVzQmFySWNvbkxpc3Q7CiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwuc3RhdHVzYmFyLlN0YXR1c0Jhck5vdGlmaWNhdGlvbjsKIAotaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5TWFuYWdlck5hdGl2ZTsKLWltcG9ydCBhbmRyb2lkLmFwcC5EaWFsb2c7Ci1pbXBvcnQgYW5kcm9pZC5hcHAuTm90aWZpY2F0aW9uOwotaW1wb3J0IGFuZHJvaWQuYXBwLlBlbmRpbmdJbnRlbnQ7Ci1pbXBvcnQgYW5kcm9pZC5hcHAuU2VydmljZTsKLWltcG9ydCBhbmRyb2lkLmFwcC5TdGF0dXNCYXJNYW5hZ2VyOwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Ccm9hZGNhc3RSZWNlaXZlcjsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnRGaWx0ZXI7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLlBhY2thZ2VNYW5hZ2VyOwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuUmVzb3VyY2VzOwotaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUGl4ZWxGb3JtYXQ7Ci1pbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5SZWN0OwotaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuRHJhd2FibGU7Ci1pbXBvcnQgYW5kcm9pZC5uZXQuVXJpOwotaW1wb3J0IGFuZHJvaWQub3MuSUJpbmRlcjsKLWltcG9ydCBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbjsKLWltcG9ydCBhbmRyb2lkLm9zLkJpbmRlcjsKLWltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXI7Ci1pbXBvcnQgYW5kcm9pZC5vcy5NZXNzYWdlOwotaW1wb3J0IGFuZHJvaWQub3MuU2VydmljZU1hbmFnZXI7Ci1pbXBvcnQgYW5kcm9pZC5vcy5TeXN0ZW1DbG9jazsKLWltcG9ydCBhbmRyb2lkLnRleHQuVGV4dFV0aWxzOwotaW1wb3J0IGFuZHJvaWQudXRpbC5TbG9nOwotaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LkRpc3BsYXk7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LkdyYXZpdHk7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LktleUV2ZW50OwotaW1wb3J0IGFuZHJvaWQudmlldy5MYXlvdXRJbmZsYXRlcjsKLWltcG9ydCBhbmRyb2lkLnZpZXcuTW90aW9uRXZlbnQ7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LlZlbG9jaXR5VHJhY2tlcjsKLWltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKLWltcG9ydCBhbmRyb2lkLnZpZXcuVmlld0dyb3VwOwotaW1wb3J0IGFuZHJvaWQudmlldy5XaW5kb3c7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LldpbmRvd01hbmFnZXI7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LldpbmRvd01hbmFnZXJJbXBsOwotaW1wb3J0IGFuZHJvaWQudmlldy5hbmltYXRpb24uQW5pbWF0aW9uOwotaW1wb3J0IGFuZHJvaWQudmlldy5hbmltYXRpb24uQW5pbWF0aW9uVXRpbHM7Ci1pbXBvcnQgYW5kcm9pZC53aWRnZXQuSW1hZ2VWaWV3OwotaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkxpbmVhckxheW91dDsKLWltcG9ydCBhbmRyb2lkLndpZGdldC5SZW1vdGVWaWV3czsKLWltcG9ydCBhbmRyb2lkLndpZGdldC5TY3JvbGxWaWV3OwotaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlRleHRWaWV3OwotaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkZyYW1lTGF5b3V0OwotCi1pbXBvcnQgamF2YS5pby5GaWxlRGVzY3JpcHRvcjsKLWltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQogaW1wb3J0IGNvbS5hbmRyb2lkLnN5c3RlbXVpLlI7Ci1pbXBvcnQgY29tLmFuZHJvaWQuc3lzdGVtdWkuc3RhdHVzYmFyLnBvbGljeS5TdGF0dXNCYXJQb2xpY3k7CiAKLQotCi1wdWJsaWMgY2xhc3MgU3RhdHVzQmFyU2VydmljZSBleHRlbmRzIFNlcnZpY2UgaW1wbGVtZW50cyBDb21tYW5kUXVldWUuQ2FsbGJhY2tzIHsKK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBTdGF0dXNCYXJTZXJ2aWNlIGV4dGVuZHMgU2VydmljZSBpbXBsZW1lbnRzIENvbW1hbmRRdWV1ZS5DYWxsYmFja3MgewogICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIlN0YXR1c0JhclNlcnZpY2UiOwotICAgIHN0YXRpYyBmaW5hbCBib29sZWFuIFNQRVcgPSBmYWxzZTsKIAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFDVElPTl9TVEFUVVNCQVJfU1RBUlQKLSAgICAgICAgICAgID0gImNvbS5hbmRyb2lkLmludGVybmFsLnBvbGljeS5zdGF0dXNiYXIuU1RBUlQiOworICAgIHByb3RlY3RlZCBDb21tYW5kUXVldWUgbUNvbW1hbmRRdWV1ZTsKKyAgICBwcm90ZWN0ZWQgSVN0YXR1c0JhclNlcnZpY2UgbUJhclNlcnZpY2U7CiAKLSAgICBzdGF0aWMgZmluYWwgaW50IEVYUEFOREVEX0xFQVZFX0FMT05FID0gLTEwMDAwOwotICAgIHN0YXRpYyBmaW5hbCBpbnQgRVhQQU5ERURfRlVMTF9PUEVOID0gLTEwMDAxOworICAgIC8vIFVwLWNhbGwgbWV0aG9kcworICAgIHByb3RlY3RlZCBhYnN0cmFjdCBWaWV3IG1ha2VTdGF0dXNCYXJWaWV3KCk7CisgICAgcHJvdGVjdGVkIGFic3RyYWN0IGludCBnZXRTdGF0dXNCYXJHcmF2aXR5KCk7CiAKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTVNHX0FOSU1BVEUgPSAxMDAwOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNU0dfQU5JTUFURV9SRVZFQUwgPSAxMDAxOwotCi0gICAgU3RhdHVzQmFyUG9saWN5IG1JY29uUG9saWN5OwotCi0gICAgQ29tbWFuZFF1ZXVlIG1Db21tYW5kUXVldWU7Ci0gICAgSVN0YXR1c0JhclNlcnZpY2UgbUJhclNlcnZpY2U7Ci0KLSAgICBpbnQgbUljb25TaXplOwotICAgIERpc3BsYXkgbURpc3BsYXk7Ci0gICAgU3RhdHVzQmFyVmlldyBtU3RhdHVzQmFyVmlldzsKLSAgICBpbnQgbVBpeGVsRm9ybWF0OwotICAgIEggbUhhbmRsZXIgPSBuZXcgSCgpOwotICAgIE9iamVjdCBtUXVldWVMb2NrID0gbmV3IE9iamVjdCgpOwotCi0gICAgLy8gaWNvbnMKLSAgICBMaW5lYXJMYXlvdXQgbUljb25zOwotICAgIEljb25NZXJnZXIgbU5vdGlmaWNhdGlvbkljb25zOwotICAgIExpbmVhckxheW91dCBtU3RhdHVzSWNvbnM7Ci0KLSAgICAvLyBleHBhbmRlZCBub3RpZmljYXRpb25zCi0gICAgRGlhbG9nIG1FeHBhbmRlZERpYWxvZzsKLSAgICBFeHBhbmRlZFZpZXcgbUV4cGFuZGVkVmlldzsKLSAgICBXaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcyBtRXhwYW5kZWRQYXJhbXM7Ci0gICAgU2Nyb2xsVmlldyBtU2Nyb2xsVmlldzsKLSAgICBWaWV3IG1Ob3RpZmljYXRpb25MaW5lYXJMYXlvdXQ7Ci0gICAgVmlldyBtRXhwYW5kZWRDb250ZW50czsKLSAgICAvLyB0b3AgYmFyCi0gICAgVGV4dFZpZXcgbU5vTm90aWZpY2F0aW9uc1RpdGxlOwotICAgIFRleHRWaWV3IG1DbGVhckJ1dHRvbjsKLSAgICAvLyBkcmFnIGJhcgotICAgIENsb3NlRHJhZ0hhbmRsZSBtQ2xvc2VWaWV3OwotICAgIC8vIG9uZ29pbmcKLSAgICBOb3RpZmljYXRpb25EYXRhIG1PbmdvaW5nID0gbmV3IE5vdGlmaWNhdGlvbkRhdGEoKTsKLSAgICBUZXh0VmlldyBtT25nb2luZ1RpdGxlOwotICAgIExpbmVhckxheW91dCBtT25nb2luZ0l0ZW1zOwotICAgIC8vIGxhdGVzdAotICAgIE5vdGlmaWNhdGlvbkRhdGEgbUxhdGVzdCA9IG5ldyBOb3RpZmljYXRpb25EYXRhKCk7Ci0gICAgVGV4dFZpZXcgbUxhdGVzdFRpdGxlOwotICAgIExpbmVhckxheW91dCBtTGF0ZXN0SXRlbXM7Ci0gICAgLy8gcG9zaXRpb24KLSAgICBpbnRbXSBtUG9zaXRpb25UbXAgPSBuZXcgaW50WzJdOwotICAgIGJvb2xlYW4gbUV4cGFuZGVkOwotICAgIGJvb2xlYW4gbUV4cGFuZGVkVmlzaWJsZTsKLQotICAgIC8vIHRoZSBkYXRlIHZpZXcKLSAgICBEYXRlVmlldyBtRGF0ZVZpZXc7Ci0KLSAgICAvLyB0aGUgdHJhY2tlciB2aWV3Ci0gICAgVHJhY2tpbmdWaWV3IG1UcmFja2luZ1ZpZXc7Ci0gICAgV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMgbVRyYWNraW5nUGFyYW1zOwotICAgIGludCBtVHJhY2tpbmdQb3NpdGlvbjsgLy8gdGhlIHBvc2l0aW9uIG9mIHRoZSB0b3Agb2YgdGhlIHRyYWNraW5nIHZpZXcuCi0gICAgcHJpdmF0ZSBib29sZWFuIG1QYW5lbFNsaWdodGx5VmlzaWJsZTsKLQotICAgIC8vIHRpY2tlcgotICAgIHByaXZhdGUgVGlja2VyIG1UaWNrZXI7Ci0gICAgcHJpdmF0ZSBWaWV3IG1UaWNrZXJWaWV3OwotICAgIHByaXZhdGUgYm9vbGVhbiBtVGlja2luZzsKLQotICAgIC8vIFRyYWNraW5nIGZpbmdlciBmb3Igb3BlbmluZy9jbG9zaW5nLgotICAgIGludCBtRWRnZUJvcmRlcjsgLy8gY29ycmVzcG9uZHMgdG8gUi5kaW1lbi5zdGF0dXNfYmFyX2VkZ2VfaWdub3JlCi0gICAgYm9vbGVhbiBtVHJhY2tpbmc7Ci0gICAgVmVsb2NpdHlUcmFja2VyIG1WZWxvY2l0eVRyYWNrZXI7Ci0KLSAgICBzdGF0aWMgZmluYWwgaW50IEFOSU1fRlJBTUVfRFVSQVRJT04gPSAoMTAwMC82MCk7Ci0KLSAgICBib29sZWFuIG1BbmltYXRpbmc7Ci0gICAgbG9uZyBtQ3VyQW5pbWF0aW9uVGltZTsKLSAgICBmbG9hdCBtRGlzcGxheUhlaWdodDsKLSAgICBmbG9hdCBtQW5pbVk7Ci0gICAgZmxvYXQgbUFuaW1WZWw7Ci0gICAgZmxvYXQgbUFuaW1BY2NlbDsKLSAgICBsb25nIG1BbmltTGFzdFRpbWU7Ci0gICAgYm9vbGVhbiBtQW5pbWF0aW5nUmV2ZWFsID0gZmFsc2U7Ci0gICAgaW50IG1WaWV3RGVsdGE7Ci0gICAgaW50W10gbUFic1BvcyA9IG5ldyBpbnRbMl07Ci0KLSAgICAvLyBmb3IgZGlzYWJsaW5nIHRoZSBzdGF0dXMgYmFyCi0gICAgaW50IG1EaXNhYmxlZCA9IDA7Ci0KLSAgICBwcml2YXRlIGNsYXNzIEV4cGFuZGVkRGlhbG9nIGV4dGVuZHMgRGlhbG9nIHsKLSAgICAgICAgRXhwYW5kZWREaWFsb2coQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgICAgICBzdXBlcihjb250ZXh0LCBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlLlRoZW1lX0xpZ2h0X05vVGl0bGVCYXIpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGRpc3BhdGNoS2V5RXZlbnQoS2V5RXZlbnQgZXZlbnQpIHsKLSAgICAgICAgICAgIGJvb2xlYW4gZG93biA9IGV2ZW50LmdldEFjdGlvbigpID09IEtleUV2ZW50LkFDVElPTl9ET1dOOwotICAgICAgICAgICAgc3dpdGNoIChldmVudC5nZXRLZXlDb2RlKCkpIHsKLSAgICAgICAgICAgIGNhc2UgS2V5RXZlbnQuS0VZQ09ERV9CQUNLOgotICAgICAgICAgICAgICAgIGlmICghZG93bikgewotICAgICAgICAgICAgICAgICAgICBhbmltYXRlQ29sbGFwc2UoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gc3VwZXIuZGlzcGF0Y2hLZXlFdmVudChldmVudCk7Ci0gICAgICAgIH0KKyAgICAvKioKKyAgICAgKiBOb2JvZHkgYmluZHMgdG8gdXMuCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIElCaW5kZXIgb25CaW5kKEludGVudCBpbnRlbnQpIHsKKyAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgfQogCi0KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBvbkNyZWF0ZSgpIHsKICAgICAgICAgLy8gRmlyc3Qgc2V0IHVwIG91ciB2aWV3cyBhbmQgc3R1ZmYuCi0gICAgICAgIG1EaXNwbGF5ID0gKChXaW5kb3dNYW5hZ2VyKWdldFN5c3RlbVNlcnZpY2UoQ29udGV4dC5XSU5ET1dfU0VSVklDRSkpLmdldERlZmF1bHREaXNwbGF5KCk7Ci0gICAgICAgIG1ha2VTdGF0dXNCYXJWaWV3KHRoaXMpOworICAgICAgICBWaWV3IHNiID0gbWFrZVN0YXR1c0JhclZpZXcoKTsKIAogICAgICAgICAvLyBDb25uZWN0IGluIHRvIHRoZSBzdGF0dXMgYmFyIG1hbmFnZXIgc2VydmljZQogICAgICAgICBTdGF0dXNCYXJJY29uTGlzdCBpY29uTGlzdCA9IG5ldyBTdGF0dXNCYXJJY29uTGlzdCgpOwpAQCAtMjAzLDEyICs3MiwxNiBAQAogICAgICAgICBtQ29tbWFuZFF1ZXVlID0gbmV3IENvbW1hbmRRdWV1ZSh0aGlzLCBpY29uTGlzdCk7CiAgICAgICAgIG1CYXJTZXJ2aWNlID0gSVN0YXR1c0JhclNlcnZpY2UuU3R1Yi5hc0ludGVyZmFjZSgKICAgICAgICAgICAgICAgICBTZXJ2aWNlTWFuYWdlci5nZXRTZXJ2aWNlKENvbnRleHQuU1RBVFVTX0JBUl9TRVJWSUNFKSk7CisgICAgICAgIGJvb2xlYW5bXSBsaWdodHNPbiA9IG5ldyBib29sZWFuWzFdOwogICAgICAgICB0cnkgewotICAgICAgICAgICAgbUJhclNlcnZpY2UucmVnaXN0ZXJTdGF0dXNCYXIobUNvbW1hbmRRdWV1ZSwgaWNvbkxpc3QsIG5vdGlmaWNhdGlvbktleXMsIG5vdGlmaWNhdGlvbnMpOworICAgICAgICAgICAgbUJhclNlcnZpY2UucmVnaXN0ZXJTdGF0dXNCYXIobUNvbW1hbmRRdWV1ZSwgaWNvbkxpc3QsIG5vdGlmaWNhdGlvbktleXMsIG5vdGlmaWNhdGlvbnMsCisgICAgICAgICAgICAgICAgICAgIGxpZ2h0c09uKTsKICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGV4KSB7CiAgICAgICAgICAgICAvLyBJZiB0aGUgc3lzdGVtIHByb2Nlc3MgaXNuJ3QgdGhlcmUgd2UncmUgZG9vbWVkIGFueXdheS4KICAgICAgICAgfQogCisgICAgICAgIHNldExpZ2h0c09uKGxpZ2h0c09uWzBdKTsKKwogICAgICAgICAvLyBTZXQgdXAgdGhlIGluaXRpYWwgaWNvbiBzdGF0ZQogICAgICAgICBpbnQgTiA9IGljb25MaXN0LnNpemUoKTsKICAgICAgICAgaW50IHZpZXdJbmRleCA9IDA7CkBAIC0yMzIsMTMwNiArMTA1LDIyIEBACiAgICAgICAgIH0KIAogICAgICAgICAvLyBQdXQgdXAgdGhlIHZpZXcKLSAgICAgICAgYWRkU3RhdHVzQmFyVmlldygpOwotCi0gICAgICAgIC8vIExhc3RseSwgY2FsbCB0byB0aGUgaWNvbiBwb2xpY3kgdG8gaW5zdGFsbC91cGRhdGUgYWxsIHRoZSBpY29ucy4KLSAgICAgICAgbUljb25Qb2xpY3kgPSBuZXcgU3RhdHVzQmFyUG9saWN5KHRoaXMpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIG9uRGVzdHJveSgpIHsKLSAgICAgICAgLy8gd2UncmUgbmV2ZXIgZGVzdHJveWVkCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogTm9ib2R5IGJpbmRzIHRvIHVzLgotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBJQmluZGVyIG9uQmluZChJbnRlbnQgaW50ZW50KSB7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICAgLy8gQ29uc3RydWN0aW5nIHRoZSB2aWV3Ci0gICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgICBwcml2YXRlIHZvaWQgbWFrZVN0YXR1c0JhclZpZXcoQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgIFJlc291cmNlcyByZXMgPSBjb250ZXh0LmdldFJlc291cmNlcygpOwotCi0gICAgICAgIG1JY29uU2l6ZSA9IHJlcy5nZXREaW1lbnNpb25QaXhlbFNpemUoY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5kaW1lbi5zdGF0dXNfYmFyX2ljb25fc2l6ZSk7Ci0KLSAgICAgICAgRXhwYW5kZWRWaWV3IGV4cGFuZGVkID0gKEV4cGFuZGVkVmlldylWaWV3LmluZmxhdGUoY29udGV4dCwKLSAgICAgICAgICAgICAgICBSLmxheW91dC5zdGF0dXNfYmFyX2V4cGFuZGVkLCBudWxsKTsKLSAgICAgICAgZXhwYW5kZWQubVNlcnZpY2UgPSB0aGlzOwotCi0gICAgICAgIFN0YXR1c0JhclZpZXcgc2IgPSAoU3RhdHVzQmFyVmlldylWaWV3LmluZmxhdGUoY29udGV4dCwgUi5sYXlvdXQuc3RhdHVzX2JhciwgbnVsbCk7Ci0gICAgICAgIHNiLm1TZXJ2aWNlID0gdGhpczsKLQotICAgICAgICAvLyBmaWd1cmUgb3V0IHdoaWNoIHBpeGVsLWZvcm1hdCB0byB1c2UgZm9yIHRoZSBzdGF0dXMgYmFyLgotICAgICAgICBtUGl4ZWxGb3JtYXQgPSBQaXhlbEZvcm1hdC5UUkFOU0xVQ0VOVDsKLSAgICAgICAgRHJhd2FibGUgYmcgPSBzYi5nZXRCYWNrZ3JvdW5kKCk7Ci0gICAgICAgIGlmIChiZyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtUGl4ZWxGb3JtYXQgPSBiZy5nZXRPcGFjaXR5KCk7Ci0gICAgICAgIH0KLQotICAgICAgICBtU3RhdHVzQmFyVmlldyA9IHNiOwotICAgICAgICBtU3RhdHVzSWNvbnMgPSAoTGluZWFyTGF5b3V0KXNiLmZpbmRWaWV3QnlJZChSLmlkLnN0YXR1c0ljb25zKTsKLSAgICAgICAgbU5vdGlmaWNhdGlvbkljb25zID0gKEljb25NZXJnZXIpc2IuZmluZFZpZXdCeUlkKFIuaWQubm90aWZpY2F0aW9uSWNvbnMpOwotICAgICAgICBtSWNvbnMgPSAoTGluZWFyTGF5b3V0KXNiLmZpbmRWaWV3QnlJZChSLmlkLmljb25zKTsKLSAgICAgICAgbVRpY2tlclZpZXcgPSBzYi5maW5kVmlld0J5SWQoUi5pZC50aWNrZXIpOwotICAgICAgICBtRGF0ZVZpZXcgPSAoRGF0ZVZpZXcpc2IuZmluZFZpZXdCeUlkKFIuaWQuZGF0ZSk7Ci0KLSAgICAgICAgbUV4cGFuZGVkRGlhbG9nID0gbmV3IEV4cGFuZGVkRGlhbG9nKGNvbnRleHQpOwotICAgICAgICBtRXhwYW5kZWRWaWV3ID0gZXhwYW5kZWQ7Ci0gICAgICAgIG1FeHBhbmRlZENvbnRlbnRzID0gZXhwYW5kZWQuZmluZFZpZXdCeUlkKFIuaWQubm90aWZpY2F0aW9uTGluZWFyTGF5b3V0KTsKLSAgICAgICAgbU9uZ29pbmdUaXRsZSA9IChUZXh0VmlldylleHBhbmRlZC5maW5kVmlld0J5SWQoUi5pZC5vbmdvaW5nVGl0bGUpOwotICAgICAgICBtT25nb2luZ0l0ZW1zID0gKExpbmVhckxheW91dClleHBhbmRlZC5maW5kVmlld0J5SWQoUi5pZC5vbmdvaW5nSXRlbXMpOwotICAgICAgICBtTGF0ZXN0VGl0bGUgPSAoVGV4dFZpZXcpZXhwYW5kZWQuZmluZFZpZXdCeUlkKFIuaWQubGF0ZXN0VGl0bGUpOwotICAgICAgICBtTGF0ZXN0SXRlbXMgPSAoTGluZWFyTGF5b3V0KWV4cGFuZGVkLmZpbmRWaWV3QnlJZChSLmlkLmxhdGVzdEl0ZW1zKTsKLSAgICAgICAgbU5vTm90aWZpY2F0aW9uc1RpdGxlID0gKFRleHRWaWV3KWV4cGFuZGVkLmZpbmRWaWV3QnlJZChSLmlkLm5vTm90aWZpY2F0aW9uc1RpdGxlKTsKLSAgICAgICAgbUNsZWFyQnV0dG9uID0gKFRleHRWaWV3KWV4cGFuZGVkLmZpbmRWaWV3QnlJZChSLmlkLmNsZWFyX2FsbF9idXR0b24pOwotICAgICAgICBtQ2xlYXJCdXR0b24uc2V0T25DbGlja0xpc3RlbmVyKG1DbGVhckJ1dHRvbkxpc3RlbmVyKTsKLSAgICAgICAgbVNjcm9sbFZpZXcgPSAoU2Nyb2xsVmlldylleHBhbmRlZC5maW5kVmlld0J5SWQoUi5pZC5zY3JvbGwpOwotICAgICAgICBtTm90aWZpY2F0aW9uTGluZWFyTGF5b3V0ID0gZXhwYW5kZWQuZmluZFZpZXdCeUlkKFIuaWQubm90aWZpY2F0aW9uTGluZWFyTGF5b3V0KTsKLQotICAgICAgICBtT25nb2luZ1RpdGxlLnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKLSAgICAgICAgbUxhdGVzdFRpdGxlLnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKLQotICAgICAgICBtVGlja2VyID0gbmV3IE15VGlja2VyKGNvbnRleHQsIHNiKTsKLQotICAgICAgICBUaWNrZXJWaWV3IHRpY2tlclZpZXcgPSAoVGlja2VyVmlldylzYi5maW5kVmlld0J5SWQoUi5pZC50aWNrZXJUZXh0KTsKLSAgICAgICAgdGlja2VyVmlldy5tVGlja2VyID0gbVRpY2tlcjsKLQotICAgICAgICBtVHJhY2tpbmdWaWV3ID0gKFRyYWNraW5nVmlldylWaWV3LmluZmxhdGUoY29udGV4dCwgUi5sYXlvdXQuc3RhdHVzX2Jhcl90cmFja2luZywgbnVsbCk7Ci0gICAgICAgIG1UcmFja2luZ1ZpZXcubVNlcnZpY2UgPSB0aGlzOwotICAgICAgICBtQ2xvc2VWaWV3ID0gKENsb3NlRHJhZ0hhbmRsZSltVHJhY2tpbmdWaWV3LmZpbmRWaWV3QnlJZChSLmlkLmNsb3NlKTsKLSAgICAgICAgbUNsb3NlVmlldy5tU2VydmljZSA9IHRoaXM7Ci0KLSAgICAgICAgbUVkZ2VCb3JkZXIgPSByZXMuZ2V0RGltZW5zaW9uUGl4ZWxTaXplKFIuZGltZW4uc3RhdHVzX2Jhcl9lZGdlX2lnbm9yZSk7Ci0KLSAgICAgICAgLy8gdGhlIG1vcmUgbm90aWZpY2F0aW9ucyBpY29uCi0gICAgICAgIFN0YXR1c0Jhckljb25WaWV3IG1vcmVWaWV3ID0gbmV3IFN0YXR1c0Jhckljb25WaWV3KHRoaXMsICJtb3JlIik7Ci0gICAgICAgIG1vcmVWaWV3LnNldChuZXcgU3RhdHVzQmFySWNvbihudWxsLCBSLmRyYXdhYmxlLnN0YXRfbm90aWZ5X21vcmUsIDApKTsKLSAgICAgICAgbU5vdGlmaWNhdGlvbkljb25zLmFkZE1vcmVWaWV3KG1vcmVWaWV3LAotICAgICAgICAgICAgICAgIG5ldyBMaW5lYXJMYXlvdXQuTGF5b3V0UGFyYW1zKG1JY29uU2l6ZSwgbUljb25TaXplKSk7Ci0KLSAgICAgICAgLy8gc2V0IHRoZSBpbml0YWwgdmlldyB2aXNpYmlsaXR5Ci0gICAgICAgIHNldEFyZVRoZXJlTm90aWZpY2F0aW9ucygpOwotICAgICAgICBtRGF0ZVZpZXcuc2V0VmlzaWJpbGl0eShWaWV3LklOVklTSUJMRSk7Ci0KLSAgICAgICAgLy8gcmVjZWl2ZSBicm9hZGNhc3RzCi0gICAgICAgIEludGVudEZpbHRlciBmaWx0ZXIgPSBuZXcgSW50ZW50RmlsdGVyKCk7Ci0gICAgICAgIGZpbHRlci5hZGRBY3Rpb24oSW50ZW50LkFDVElPTl9DT05GSUdVUkFUSU9OX0NIQU5HRUQpOwotICAgICAgICBmaWx0ZXIuYWRkQWN0aW9uKEludGVudC5BQ1RJT05fQ0xPU0VfU1lTVEVNX0RJQUxPR1MpOwotICAgICAgICBmaWx0ZXIuYWRkQWN0aW9uKEludGVudC5BQ1RJT05fU0NSRUVOX09GRik7Ci0gICAgICAgIGNvbnRleHQucmVnaXN0ZXJSZWNlaXZlcihtQnJvYWRjYXN0UmVjZWl2ZXIsIGZpbHRlcik7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgYWRkU3RhdHVzQmFyVmlldygpIHsKLSAgICAgICAgUmVzb3VyY2VzIHJlcyA9IGdldFJlc291cmNlcygpOworICAgICAgICBmaW5hbCBSZXNvdXJjZXMgcmVzID0gZ2V0UmVzb3VyY2VzKCk7CiAgICAgICAgIGZpbmFsIGludCBoZWlnaHQ9IHJlcy5nZXREaW1lbnNpb25QaXhlbFNpemUoY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5kaW1lbi5zdGF0dXNfYmFyX2hlaWdodCk7CiAKLSAgICAgICAgZmluYWwgU3RhdHVzQmFyVmlldyB2aWV3ID0gbVN0YXR1c0JhclZpZXc7Ci0gICAgICAgIFdpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zIGxwID0gbmV3IFdpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zKAorICAgICAgICBmaW5hbCBXaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcyBscCA9IG5ldyBXaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcygKICAgICAgICAgICAgICAgICBWaWV3R3JvdXAuTGF5b3V0UGFyYW1zLk1BVENIX1BBUkVOVCwKICAgICAgICAgICAgICAgICBoZWlnaHQsCiAgICAgICAgICAgICAgICAgV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMuVFlQRV9TVEFUVVNfQkFSLAogICAgICAgICAgICAgICAgIFdpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zLkZMQUdfTk9UX0ZPQ1VTQUJMRQogICAgICAgICAgICAgICAgICAgICB8IFdpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zLkZMQUdfVE9VQ0hBQkxFX1dIRU5fV0FLSU5HLAogICAgICAgICAgICAgICAgIFBpeGVsRm9ybWF0LlJHQlhfODg4OCk7Ci0gICAgICAgIGxwLmdyYXZpdHkgPSBHcmF2aXR5LlRPUCB8IEdyYXZpdHkuRklMTF9IT1JJWk9OVEFMOworICAgICAgICBscC5ncmF2aXR5ID0gZ2V0U3RhdHVzQmFyR3Jhdml0eSgpOwogICAgICAgICBscC5zZXRUaXRsZSgiU3RhdHVzQmFyIik7CiAgICAgICAgIC8vIFRPRE8gbHAud2luZG93QW5pbWF0aW9ucyA9IFIuc3R5bGUuQW5pbWF0aW9uX1N0YXR1c0JhcjsKKyAgICAgICAgV2luZG93TWFuYWdlckltcGwuZ2V0RGVmYXVsdCgpLmFkZFZpZXcoc2IsIGxwKTsKIAotICAgICAgICBXaW5kb3dNYW5hZ2VySW1wbC5nZXREZWZhdWx0KCkuYWRkVmlldyh2aWV3LCBscCk7CisgICAgICAgIFNsb2cuZChUQUcsICJBZGRlZCBzdGF0dXMgYmFyIHZpZXcgdy8gZ3Jhdml0eSAweCIgKyBJbnRlZ2VyLnRvSGV4U3RyaW5nKGxwLmdyYXZpdHkpKTsKICAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBhZGRJY29uKFN0cmluZyBzbG90LCBpbnQgaW5kZXgsIGludCB2aWV3SW5kZXgsIFN0YXR1c0Jhckljb24gaWNvbikgewotICAgICAgICBpZiAoU1BFVykgU2xvZy5kKFRBRywgImFkZEljb24gc2xvdD0iICsgc2xvdCArICIgaW5kZXg9IiArIGluZGV4ICsgIiB2aWV3SW5kZXg9IiArIHZpZXdJbmRleAotICAgICAgICAgICAgICAgICsgIiBpY29uPSIgKyBpY29uKTsKLSAgICAgICAgU3RhdHVzQmFySWNvblZpZXcgdmlldyA9IG5ldyBTdGF0dXNCYXJJY29uVmlldyh0aGlzLCBzbG90KTsKLSAgICAgICAgdmlldy5zZXQoaWNvbik7Ci0gICAgICAgIG1TdGF0dXNJY29ucy5hZGRWaWV3KHZpZXcsIHZpZXdJbmRleCwgbmV3IExpbmVhckxheW91dC5MYXlvdXRQYXJhbXMobUljb25TaXplLCBtSWNvblNpemUpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB1cGRhdGVJY29uKFN0cmluZyBzbG90LCBpbnQgaW5kZXgsIGludCB2aWV3SW5kZXgsCi0gICAgICAgICAgICBTdGF0dXNCYXJJY29uIG9sZCwgU3RhdHVzQmFySWNvbiBpY29uKSB7Ci0gICAgICAgIGlmIChTUEVXKSBTbG9nLmQoVEFHLCAidXBkYXRlSWNvbiBzbG90PSIgKyBzbG90ICsgIiBpbmRleD0iICsgaW5kZXggKyAiIHZpZXdJbmRleD0iICsgdmlld0luZGV4Ci0gICAgICAgICAgICAgICAgKyAiIG9sZD0iICsgb2xkICsgIiBpY29uPSIgKyBpY29uKTsKLSAgICAgICAgU3RhdHVzQmFySWNvblZpZXcgdmlldyA9IChTdGF0dXNCYXJJY29uVmlldyltU3RhdHVzSWNvbnMuZ2V0Q2hpbGRBdCh2aWV3SW5kZXgpOwotICAgICAgICB2aWV3LnNldChpY29uKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCByZW1vdmVJY29uKFN0cmluZyBzbG90LCBpbnQgaW5kZXgsIGludCB2aWV3SW5kZXgpIHsKLSAgICAgICAgaWYgKFNQRVcpIFNsb2cuZChUQUcsICJyZW1vdmVJY29uIHNsb3Q9IiArIHNsb3QgKyAiIGluZGV4PSIgKyBpbmRleCArICIgdmlld0luZGV4PSIgKyB2aWV3SW5kZXgpOwotICAgICAgICBtU3RhdHVzSWNvbnMucmVtb3ZlVmlld0F0KHZpZXdJbmRleCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYWRkTm90aWZpY2F0aW9uKElCaW5kZXIga2V5LCBTdGF0dXNCYXJOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0gICAgICAgIGJvb2xlYW4gc2hvdWxkVGljayA9IHRydWU7Ci0gICAgICAgIGlmIChub3RpZmljYXRpb24ubm90aWZpY2F0aW9uLmZ1bGxTY3JlZW5JbnRlbnQgIT0gbnVsbCkgewotICAgICAgICAgICAgc2hvdWxkVGljayA9IGZhbHNlOwotICAgICAgICAgICAgU2xvZy5kKFRBRywgIk5vdGlmaWNhdGlvbiBoYXMgZnVsbFNjcmVlbkludGVudDsgc2VuZGluZyBmdWxsU2NyZWVuSW50ZW50Iik7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIG5vdGlmaWNhdGlvbi5ub3RpZmljYXRpb24uZnVsbFNjcmVlbkludGVudC5zZW5kKCk7Ci0gICAgICAgICAgICB9IGNhdGNoIChQZW5kaW5nSW50ZW50LkNhbmNlbGVkRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSAKLQotICAgICAgICBTdGF0dXNCYXJJY29uVmlldyBpY29uVmlldyA9IGFkZE5vdGlmaWNhdGlvblZpZXdzKGtleSwgbm90aWZpY2F0aW9uKTsKLSAgICAgICAgaWYgKGljb25WaWV3ID09IG51bGwpIHJldHVybjsKLQotICAgICAgICBpZiAoc2hvdWxkVGljaykgewotICAgICAgICAgICAgdGljayhub3RpZmljYXRpb24pOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICAvLyBSZWNhbGN1bGF0ZSB0aGUgcG9zaXRpb24gb2YgdGhlIHNsaWRpbmcgd2luZG93cyBhbmQgdGhlIHRpdGxlcy4KLSAgICAgICAgc2V0QXJlVGhlcmVOb3RpZmljYXRpb25zKCk7Ci0gICAgICAgIHVwZGF0ZUV4cGFuZGVkVmlld1BvcyhFWFBBTkRFRF9MRUFWRV9BTE9ORSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdXBkYXRlTm90aWZpY2F0aW9uKElCaW5kZXIga2V5LCBTdGF0dXNCYXJOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0gICAgICAgIFNsb2cuZChUQUcsICJ1cGRhdGVOb3RpZmljYXRpb24ga2V5PSIgKyBrZXkgKyAiIG5vdGlmaWNhdGlvbj0iICsgbm90aWZpY2F0aW9uKTsKLQotICAgICAgICBOb3RpZmljYXRpb25EYXRhIG9sZExpc3Q7Ci0gICAgICAgIGludCBvbGRJbmRleCA9IG1PbmdvaW5nLmZpbmRFbnRyeShrZXkpOwotICAgICAgICBpZiAob2xkSW5kZXggPj0gMCkgewotICAgICAgICAgICAgb2xkTGlzdCA9IG1PbmdvaW5nOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgb2xkSW5kZXggPSBtTGF0ZXN0LmZpbmRFbnRyeShrZXkpOwotICAgICAgICAgICAgaWYgKG9sZEluZGV4IDwgMCkgewotICAgICAgICAgICAgICAgIFNsb2cudyhUQUcsICJ1cGRhdGVOb3RpZmljYXRpb24gZm9yIHVua25vd24ga2V5OiAiICsga2V5KTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBvbGRMaXN0ID0gbUxhdGVzdDsKLSAgICAgICAgfQotICAgICAgICBmaW5hbCBOb3RpZmljYXRpb25EYXRhLkVudHJ5IG9sZEVudHJ5ID0gb2xkTGlzdC5nZXRFbnRyeUF0KG9sZEluZGV4KTsKLSAgICAgICAgZmluYWwgU3RhdHVzQmFyTm90aWZpY2F0aW9uIG9sZE5vdGlmaWNhdGlvbiA9IG9sZEVudHJ5Lm5vdGlmaWNhdGlvbjsKLSAgICAgICAgZmluYWwgUmVtb3RlVmlld3Mgb2xkQ29udGVudFZpZXcgPSBvbGROb3RpZmljYXRpb24ubm90aWZpY2F0aW9uLmNvbnRlbnRWaWV3OwotCi0gICAgICAgIGZpbmFsIFJlbW90ZVZpZXdzIGNvbnRlbnRWaWV3ID0gbm90aWZpY2F0aW9uLm5vdGlmaWNhdGlvbi5jb250ZW50VmlldzsKLQotICAgICAgICBpZiAoZmFsc2UpIHsKLSAgICAgICAgICAgIFNsb2cuZChUQUcsICJvbGQgbm90aWZpY2F0aW9uOiB3aGVuPSIgKyBvbGROb3RpZmljYXRpb24ubm90aWZpY2F0aW9uLndoZW4KLSAgICAgICAgICAgICAgICAgICAgKyAiIG9uZ29pbmc9IiArIG9sZE5vdGlmaWNhdGlvbi5pc09uZ29pbmcoKQotICAgICAgICAgICAgICAgICAgICArICIgZXhwYW5kZWQ9IiArIG9sZEVudHJ5LmV4cGFuZGVkCi0gICAgICAgICAgICAgICAgICAgICsgIiBjb250ZW50Vmlldz0iICsgb2xkQ29udGVudFZpZXcpOwotICAgICAgICAgICAgU2xvZy5kKFRBRywgIm5ldyBub3RpZmljYXRpb246IHdoZW49IiArIG5vdGlmaWNhdGlvbi5ub3RpZmljYXRpb24ud2hlbgotICAgICAgICAgICAgICAgICAgICArICIgb25nb2luZz0iICsgb2xkTm90aWZpY2F0aW9uLmlzT25nb2luZygpCi0gICAgICAgICAgICAgICAgICAgICsgIiBjb250ZW50Vmlldz0iICsgY29udGVudFZpZXcpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gQ2FuIHdlIGp1c3QgcmVhcHBseSB0aGUgUmVtb3RlVmlld3MgaW4gcGxhY2U/ICBJZiB3aGVuIGRpZG4ndCBjaGFuZ2UsIHRoZSBvcmRlcgotICAgICAgICAvLyBkaWRuJ3QgY2hhbmdlLgotICAgICAgICBpZiAobm90aWZpY2F0aW9uLm5vdGlmaWNhdGlvbi53aGVuID09IG9sZE5vdGlmaWNhdGlvbi5ub3RpZmljYXRpb24ud2hlbgotICAgICAgICAgICAgICAgICYmIG5vdGlmaWNhdGlvbi5pc09uZ29pbmcoKSA9PSBvbGROb3RpZmljYXRpb24uaXNPbmdvaW5nKCkKLSAgICAgICAgICAgICAgICAmJiBvbGRFbnRyeS5leHBhbmRlZCAhPSBudWxsCi0gICAgICAgICAgICAgICAgJiYgY29udGVudFZpZXcgIT0gbnVsbCAmJiBvbGRDb250ZW50VmlldyAhPSBudWxsCi0gICAgICAgICAgICAgICAgJiYgY29udGVudFZpZXcuZ2V0UGFja2FnZSgpICE9IG51bGwKLSAgICAgICAgICAgICAgICAmJiBvbGRDb250ZW50Vmlldy5nZXRQYWNrYWdlKCkgIT0gbnVsbAotICAgICAgICAgICAgICAgICYmIG9sZENvbnRlbnRWaWV3LmdldFBhY2thZ2UoKS5lcXVhbHMoY29udGVudFZpZXcuZ2V0UGFja2FnZSgpKQotICAgICAgICAgICAgICAgICYmIG9sZENvbnRlbnRWaWV3LmdldExheW91dElkKCkgPT0gY29udGVudFZpZXcuZ2V0TGF5b3V0SWQoKSkgewotICAgICAgICAgICAgaWYgKFNQRVcpIFNsb2cuZChUQUcsICJyZXVzaW5nIG5vdGlmaWNhdGlvbiIpOwotICAgICAgICAgICAgb2xkRW50cnkubm90aWZpY2F0aW9uID0gbm90aWZpY2F0aW9uOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAvLyBSZWFwcGx5IHRoZSBSZW1vdGVWaWV3cwotICAgICAgICAgICAgICAgIGNvbnRlbnRWaWV3LnJlYXBwbHkodGhpcywgb2xkRW50cnkuY29udGVudCk7Ci0gICAgICAgICAgICAgICAgLy8gdXBkYXRlIHRoZSBjb250ZW50SW50ZW50Ci0gICAgICAgICAgICAgICAgZmluYWwgUGVuZGluZ0ludGVudCBjb250ZW50SW50ZW50ID0gbm90aWZpY2F0aW9uLm5vdGlmaWNhdGlvbi5jb250ZW50SW50ZW50OwotICAgICAgICAgICAgICAgIGlmIChjb250ZW50SW50ZW50ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgb2xkRW50cnkuY29udGVudC5zZXRPbkNsaWNrTGlzdGVuZXIobmV3IExhdW5jaGVyKGNvbnRlbnRJbnRlbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vdGlmaWNhdGlvbi5wa2csIG5vdGlmaWNhdGlvbi50YWcsIG5vdGlmaWNhdGlvbi5pZCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAvLyBVcGRhdGUgdGhlIGljb24uCi0gICAgICAgICAgICAgICAgZmluYWwgU3RhdHVzQmFySWNvbiBpYyA9IG5ldyBTdGF0dXNCYXJJY29uKG5vdGlmaWNhdGlvbi5wa2csCi0gICAgICAgICAgICAgICAgICAgICAgICBub3RpZmljYXRpb24ubm90aWZpY2F0aW9uLmljb24sIG5vdGlmaWNhdGlvbi5ub3RpZmljYXRpb24uaWNvbkxldmVsLAotICAgICAgICAgICAgICAgICAgICAgICAgbm90aWZpY2F0aW9uLm5vdGlmaWNhdGlvbi5udW1iZXIpOwotICAgICAgICAgICAgICAgIGlmICghb2xkRW50cnkuaWNvbi5zZXQoaWMpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGhhbmRsZU5vdGlmaWNhdGlvbkVycm9yKGtleSwgbm90aWZpY2F0aW9uLCAiQ291bGRuJ3QgdXBkYXRlIGljb246ICIgKyBpYyk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgLy8gSXQgZmFpbGVkIHRvIGFkZCBjbGVhbmx5LiAgTG9nLCBhbmQgcmVtb3ZlIHRoZSB2aWV3IGZyb20gdGhlIHBhbmVsLgotICAgICAgICAgICAgICAgIFNsb2cudyhUQUcsICJDb3VsZG4ndCByZWFwcGx5IHZpZXdzIGZvciBwYWNrYWdlICIgKyBjb250ZW50Vmlldy5nZXRQYWNrYWdlKCksIGUpOwotICAgICAgICAgICAgICAgIHJlbW92ZU5vdGlmaWNhdGlvblZpZXdzKGtleSk7Ci0gICAgICAgICAgICAgICAgYWRkTm90aWZpY2F0aW9uVmlld3Moa2V5LCBub3RpZmljYXRpb24pOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaWYgKFNQRVcpIFNsb2cuZChUQUcsICJub3QgcmV1c2luZyBub3RpZmljYXRpb24iKTsKLSAgICAgICAgICAgIHJlbW92ZU5vdGlmaWNhdGlvblZpZXdzKGtleSk7Ci0gICAgICAgICAgICBhZGROb3RpZmljYXRpb25WaWV3cyhrZXksIG5vdGlmaWNhdGlvbik7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBSZXN0YXJ0IHRoZSB0aWNrZXIgaWYgaXQncyBzdGlsbCBydW5uaW5nCi0gICAgICAgIGlmIChub3RpZmljYXRpb24ubm90aWZpY2F0aW9uLnRpY2tlclRleHQgIT0gbnVsbAotICAgICAgICAgICAgICAgICYmICFUZXh0VXRpbHMuZXF1YWxzKG5vdGlmaWNhdGlvbi5ub3RpZmljYXRpb24udGlja2VyVGV4dCwKLSAgICAgICAgICAgICAgICAgICAgb2xkRW50cnkubm90aWZpY2F0aW9uLm5vdGlmaWNhdGlvbi50aWNrZXJUZXh0KSkgewotICAgICAgICAgICAgdGljayhub3RpZmljYXRpb24pOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gUmVjYWxjdWxhdGUgdGhlIHBvc2l0aW9uIG9mIHRoZSBzbGlkaW5nIHdpbmRvd3MgYW5kIHRoZSB0aXRsZXMuCi0gICAgICAgIHNldEFyZVRoZXJlTm90aWZpY2F0aW9ucygpOwotICAgICAgICB1cGRhdGVFeHBhbmRlZFZpZXdQb3MoRVhQQU5ERURfTEVBVkVfQUxPTkUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHJlbW92ZU5vdGlmaWNhdGlvbihJQmluZGVyIGtleSkgewotICAgICAgICBpZiAoU1BFVykgU2xvZy5kKFRBRywgInJlbW92ZU5vdGlmaWNhdGlvbiBrZXk9IiArIGtleSk7Ci0gICAgICAgIFN0YXR1c0Jhck5vdGlmaWNhdGlvbiBvbGQgPSByZW1vdmVOb3RpZmljYXRpb25WaWV3cyhrZXkpOwotCi0gICAgICAgIGlmIChvbGQgIT0gbnVsbCkgewotICAgICAgICAgICAgLy8gQ2FuY2VsIHRoZSB0aWNrZXIgaWYgaXQncyBzdGlsbCBydW5uaW5nCi0gICAgICAgICAgICBtVGlja2VyLnJlbW92ZUVudHJ5KG9sZCk7Ci0KLSAgICAgICAgICAgIC8vIFJlY2FsY3VsYXRlIHRoZSBwb3NpdGlvbiBvZiB0aGUgc2xpZGluZyB3aW5kb3dzIGFuZCB0aGUgdGl0bGVzLgotICAgICAgICAgICAgc2V0QXJlVGhlcmVOb3RpZmljYXRpb25zKCk7Ci0gICAgICAgICAgICB1cGRhdGVFeHBhbmRlZFZpZXdQb3MoRVhQQU5ERURfTEVBVkVfQUxPTkUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBpbnQgY2hvb3NlSWNvbkluZGV4KGJvb2xlYW4gaXNPbmdvaW5nLCBpbnQgdmlld0luZGV4KSB7Ci0gICAgICAgIGZpbmFsIGludCBsYXRlc3RTaXplID0gbUxhdGVzdC5zaXplKCk7Ci0gICAgICAgIGlmIChpc09uZ29pbmcpIHsKLSAgICAgICAgICAgIHJldHVybiBsYXRlc3RTaXplICsgKG1PbmdvaW5nLnNpemUoKSAtIHZpZXdJbmRleCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gbGF0ZXN0U2l6ZSAtIHZpZXdJbmRleDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIFZpZXdbXSBtYWtlTm90aWZpY2F0aW9uVmlldyhTdGF0dXNCYXJOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uLCBWaWV3R3JvdXAgcGFyZW50KSB7Ci0gICAgICAgIE5vdGlmaWNhdGlvbiBuID0gbm90aWZpY2F0aW9uLm5vdGlmaWNhdGlvbjsKLSAgICAgICAgUmVtb3RlVmlld3MgcmVtb3RlVmlld3MgPSBuLmNvbnRlbnRWaWV3OwotICAgICAgICBpZiAocmVtb3RlVmlld3MgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBjcmVhdGUgdGhlIHJvdyB2aWV3Ci0gICAgICAgIExheW91dEluZmxhdGVyIGluZmxhdGVyID0gKExheW91dEluZmxhdGVyKWdldFN5c3RlbVNlcnZpY2UoQ29udGV4dC5MQVlPVVRfSU5GTEFURVJfU0VSVklDRSk7Ci0gICAgICAgIFZpZXcgcm93ID0gaW5mbGF0ZXIuaW5mbGF0ZShSLmxheW91dC5zdGF0dXNfYmFyX2xhdGVzdF9ldmVudCwgcGFyZW50LCBmYWxzZSk7Ci0KLSAgICAgICAgLy8gYmluZCB0aGUgY2xpY2sgZXZlbnQgdG8gdGhlIGNvbnRlbnQgYXJlYQotICAgICAgICBWaWV3R3JvdXAgY29udGVudCA9IChWaWV3R3JvdXApcm93LmZpbmRWaWV3QnlJZChSLmlkLmNvbnRlbnQpOwotICAgICAgICBjb250ZW50LnNldERlc2NlbmRhbnRGb2N1c2FiaWxpdHkoVmlld0dyb3VwLkZPQ1VTX0JMT0NLX0RFU0NFTkRBTlRTKTsKLSAgICAgICAgY29udGVudC5zZXRPbkZvY3VzQ2hhbmdlTGlzdGVuZXIobUZvY3VzQ2hhbmdlTGlzdGVuZXIpOwotICAgICAgICBQZW5kaW5nSW50ZW50IGNvbnRlbnRJbnRlbnQgPSBuLmNvbnRlbnRJbnRlbnQ7Ci0gICAgICAgIGlmIChjb250ZW50SW50ZW50ICE9IG51bGwpIHsKLSAgICAgICAgICAgIGNvbnRlbnQuc2V0T25DbGlja0xpc3RlbmVyKG5ldyBMYXVuY2hlcihjb250ZW50SW50ZW50LCBub3RpZmljYXRpb24ucGtnLAotICAgICAgICAgICAgICAgICAgICAgICAgbm90aWZpY2F0aW9uLnRhZywgbm90aWZpY2F0aW9uLmlkKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBWaWV3IGV4cGFuZGVkID0gbnVsbDsKLSAgICAgICAgRXhjZXB0aW9uIGV4Y2VwdGlvbiA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBleHBhbmRlZCA9IHJlbW90ZVZpZXdzLmFwcGx5KHRoaXMsIGNvbnRlbnQpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGV4Y2VwdGlvbiA9IGU7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGV4cGFuZGVkID09IG51bGwpIHsKLSAgICAgICAgICAgIFN0cmluZyBpZGVudCA9IG5vdGlmaWNhdGlvbi5wa2cgKyAiLzB4IiArIEludGVnZXIudG9IZXhTdHJpbmcobm90aWZpY2F0aW9uLmlkKTsKLSAgICAgICAgICAgIFNsb2cuZShUQUcsICJjb3VsZG4ndCBpbmZsYXRlIHZpZXcgZm9yIG5vdGlmaWNhdGlvbiAiICsgaWRlbnQsIGV4Y2VwdGlvbik7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGNvbnRlbnQuYWRkVmlldyhleHBhbmRlZCk7Ci0gICAgICAgICAgICByb3cuc2V0RHJhd2luZ0NhY2hlRW5hYmxlZCh0cnVlKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBuZXcgVmlld1tdIHsgcm93LCBjb250ZW50LCBleHBhbmRlZCB9OwotICAgIH0KLQotICAgIFN0YXR1c0Jhckljb25WaWV3IGFkZE5vdGlmaWNhdGlvblZpZXdzKElCaW5kZXIga2V5LCBTdGF0dXNCYXJOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0gICAgICAgIE5vdGlmaWNhdGlvbkRhdGEgbGlzdDsKLSAgICAgICAgVmlld0dyb3VwIHBhcmVudDsKLSAgICAgICAgZmluYWwgYm9vbGVhbiBpc09uZ29pbmcgPSBub3RpZmljYXRpb24uaXNPbmdvaW5nKCk7Ci0gICAgICAgIGlmIChpc09uZ29pbmcpIHsKLSAgICAgICAgICAgIGxpc3QgPSBtT25nb2luZzsKLSAgICAgICAgICAgIHBhcmVudCA9IG1PbmdvaW5nSXRlbXM7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBsaXN0ID0gbUxhdGVzdDsKLSAgICAgICAgICAgIHBhcmVudCA9IG1MYXRlc3RJdGVtczsKLSAgICAgICAgfQotICAgICAgICAvLyBDb25zdHJ1Y3QgdGhlIGV4cGFuZGVkIHZpZXcuCi0gICAgICAgIGZpbmFsIFZpZXdbXSB2aWV3cyA9IG1ha2VOb3RpZmljYXRpb25WaWV3KG5vdGlmaWNhdGlvbiwgcGFyZW50KTsKLSAgICAgICAgaWYgKHZpZXdzID09IG51bGwpIHsKLSAgICAgICAgICAgIGhhbmRsZU5vdGlmaWNhdGlvbkVycm9yKGtleSwgbm90aWZpY2F0aW9uLCAiQ291bGRuJ3QgZXhwYW5kIFJlbW90ZVZpZXdzIGZvcjogIgotICAgICAgICAgICAgICAgICAgICArIG5vdGlmaWNhdGlvbik7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgICAgICBmaW5hbCBWaWV3IHJvdyA9IHZpZXdzWzBdOwotICAgICAgICBmaW5hbCBWaWV3IGNvbnRlbnQgPSB2aWV3c1sxXTsKLSAgICAgICAgZmluYWwgVmlldyBleHBhbmRlZCA9IHZpZXdzWzJdOwotICAgICAgICAvLyBDb25zdHJ1Y3QgdGhlIGljb24uCi0gICAgICAgIGZpbmFsIFN0YXR1c0Jhckljb25WaWV3IGljb25WaWV3ID0gbmV3IFN0YXR1c0Jhckljb25WaWV3KHRoaXMsCi0gICAgICAgICAgICAgICAgbm90aWZpY2F0aW9uLnBrZyArICIvMHgiICsgSW50ZWdlci50b0hleFN0cmluZyhub3RpZmljYXRpb24uaWQpKTsKLSAgICAgICAgZmluYWwgU3RhdHVzQmFySWNvbiBpYyA9IG5ldyBTdGF0dXNCYXJJY29uKG5vdGlmaWNhdGlvbi5wa2csIG5vdGlmaWNhdGlvbi5ub3RpZmljYXRpb24uaWNvbiwKLSAgICAgICAgICAgICAgICAgICAgbm90aWZpY2F0aW9uLm5vdGlmaWNhdGlvbi5pY29uTGV2ZWwsIG5vdGlmaWNhdGlvbi5ub3RpZmljYXRpb24ubnVtYmVyKTsKLSAgICAgICAgaWYgKCFpY29uVmlldy5zZXQoaWMpKSB7Ci0gICAgICAgICAgICBoYW5kbGVOb3RpZmljYXRpb25FcnJvcihrZXksIG5vdGlmaWNhdGlvbiwgIkNvdWxkaW5nIGNyZWF0ZSBpY29uOiAiICsgaWMpOwotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gQWRkIHRoZSBleHBhbmRlZCB2aWV3LgotICAgICAgICBmaW5hbCBpbnQgdmlld0luZGV4ID0gbGlzdC5hZGQoa2V5LCBub3RpZmljYXRpb24sIHJvdywgY29udGVudCwgZXhwYW5kZWQsIGljb25WaWV3KTsKLSAgICAgICAgcGFyZW50LmFkZFZpZXcocm93LCB2aWV3SW5kZXgpOwotICAgICAgICAvLyBBZGQgdGhlIGljb24uCi0gICAgICAgIGZpbmFsIGludCBpY29uSW5kZXggPSBjaG9vc2VJY29uSW5kZXgoaXNPbmdvaW5nLCB2aWV3SW5kZXgpOwotICAgICAgICBtTm90aWZpY2F0aW9uSWNvbnMuYWRkVmlldyhpY29uVmlldywgaWNvbkluZGV4LAotICAgICAgICAgICAgICAgIG5ldyBMaW5lYXJMYXlvdXQuTGF5b3V0UGFyYW1zKG1JY29uU2l6ZSwgbUljb25TaXplKSk7Ci0gICAgICAgIHJldHVybiBpY29uVmlldzsKLSAgICB9Ci0KLSAgICBTdGF0dXNCYXJOb3RpZmljYXRpb24gcmVtb3ZlTm90aWZpY2F0aW9uVmlld3MoSUJpbmRlciBrZXkpIHsKLSAgICAgICAgTm90aWZpY2F0aW9uRGF0YS5FbnRyeSBlbnRyeSA9IG1PbmdvaW5nLnJlbW92ZShrZXkpOwotICAgICAgICBpZiAoZW50cnkgPT0gbnVsbCkgewotICAgICAgICAgICAgZW50cnkgPSBtTGF0ZXN0LnJlbW92ZShrZXkpOwotICAgICAgICAgICAgaWYgKGVudHJ5ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBTbG9nLncoVEFHLCAicmVtb3ZlTm90aWZpY2F0aW9uIGZvciB1bmtub3duIGtleTogIiArIGtleSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgLy8gUmVtb3ZlIHRoZSBleHBhbmRlZCB2aWV3LgotICAgICAgICAoKFZpZXdHcm91cCllbnRyeS5yb3cuZ2V0UGFyZW50KCkpLnJlbW92ZVZpZXcoZW50cnkucm93KTsKLSAgICAgICAgLy8gUmVtb3ZlIHRoZSBpY29uLgotICAgICAgICAoKFZpZXdHcm91cCllbnRyeS5pY29uLmdldFBhcmVudCgpKS5yZW1vdmVWaWV3KGVudHJ5Lmljb24pOwotCi0gICAgICAgIHJldHVybiBlbnRyeS5ub3RpZmljYXRpb247Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHNldEFyZVRoZXJlTm90aWZpY2F0aW9ucygpIHsKLSAgICAgICAgYm9vbGVhbiBvbmdvaW5nID0gbU9uZ29pbmcuaGFzVmlzaWJsZUl0ZW1zKCk7Ci0gICAgICAgIGJvb2xlYW4gbGF0ZXN0ID0gbUxhdGVzdC5oYXNWaXNpYmxlSXRlbXMoKTsKLQotICAgICAgICAvLyAobm8gb25nb2luZyBub3RpZmljYXRpb25zIGFyZSBjbGVhcmFibGUpCi0gICAgICAgIGlmIChtTGF0ZXN0Lmhhc0NsZWFyYWJsZUl0ZW1zKCkpIHsKLSAgICAgICAgICAgIG1DbGVhckJ1dHRvbi5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtQ2xlYXJCdXR0b24uc2V0VmlzaWJpbGl0eShWaWV3LklOVklTSUJMRSk7Ci0gICAgICAgIH0KLQotICAgICAgICBtT25nb2luZ1RpdGxlLnNldFZpc2liaWxpdHkob25nb2luZyA/IFZpZXcuVklTSUJMRSA6IFZpZXcuR09ORSk7Ci0gICAgICAgIG1MYXRlc3RUaXRsZS5zZXRWaXNpYmlsaXR5KGxhdGVzdCA/IFZpZXcuVklTSUJMRSA6IFZpZXcuR09ORSk7Ci0KLSAgICAgICAgaWYgKG9uZ29pbmcgfHwgbGF0ZXN0KSB7Ci0gICAgICAgICAgICBtTm9Ob3RpZmljYXRpb25zVGl0bGUuc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbU5vTm90aWZpY2F0aW9uc1RpdGxlLnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKLSAgICAgICAgfQotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogU3RhdGUgaXMgb25lIG9yIG1vcmUgb2YgdGhlIERJU0FCTEUgY29uc3RhbnRzIGZyb20gU3RhdHVzQmFyTWFuYWdlci4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBkaXNhYmxlKGludCBzdGF0ZSkgewotICAgICAgICBmaW5hbCBpbnQgb2xkID0gbURpc2FibGVkOwotICAgICAgICBmaW5hbCBpbnQgZGlmZiA9IHN0YXRlIF4gb2xkOwotICAgICAgICBtRGlzYWJsZWQgPSBzdGF0ZTsKLQotICAgICAgICBpZiAoKGRpZmYgJiBTdGF0dXNCYXJNYW5hZ2VyLkRJU0FCTEVfRVhQQU5EKSAhPSAwKSB7Ci0gICAgICAgICAgICBpZiAoKHN0YXRlICYgU3RhdHVzQmFyTWFuYWdlci5ESVNBQkxFX0VYUEFORCkgIT0gMCkgewotICAgICAgICAgICAgICAgIFNsb2cuZChUQUcsICJESVNBQkxFX0VYUEFORDogeWVzIik7Ci0gICAgICAgICAgICAgICAgYW5pbWF0ZUNvbGxhcHNlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKChkaWZmICYgU3RhdHVzQmFyTWFuYWdlci5ESVNBQkxFX05PVElGSUNBVElPTl9JQ09OUykgIT0gMCkgewotICAgICAgICAgICAgaWYgKChzdGF0ZSAmIFN0YXR1c0Jhck1hbmFnZXIuRElTQUJMRV9OT1RJRklDQVRJT05fSUNPTlMpICE9IDApIHsKLSAgICAgICAgICAgICAgICBTbG9nLmQoVEFHLCAiRElTQUJMRV9OT1RJRklDQVRJT05fSUNPTlM6IHllcyIpOwotICAgICAgICAgICAgICAgIGlmIChtVGlja2luZykgewotICAgICAgICAgICAgICAgICAgICBtVGlja2VyLmhhbHQoKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBzZXROb3RpZmljYXRpb25JY29uVmlzaWJpbGl0eShmYWxzZSwgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5hbmltLmZhZGVfb3V0KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIFNsb2cuZChUQUcsICJESVNBQkxFX05PVElGSUNBVElPTl9JQ09OUzogbm8iKTsKLSAgICAgICAgICAgICAgICBpZiAoIW1FeHBhbmRlZFZpc2libGUpIHsKLSAgICAgICAgICAgICAgICAgICAgc2V0Tm90aWZpY2F0aW9uSWNvblZpc2liaWxpdHkodHJ1ZSwgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5hbmltLmZhZGVfaW4pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmICgoZGlmZiAmIFN0YXR1c0Jhck1hbmFnZXIuRElTQUJMRV9OT1RJRklDQVRJT05fVElDS0VSKSAhPSAwKSB7Ci0gICAgICAgICAgICBpZiAobVRpY2tpbmcgJiYgKHN0YXRlICYgU3RhdHVzQmFyTWFuYWdlci5ESVNBQkxFX05PVElGSUNBVElPTl9USUNLRVIpICE9IDApIHsKLSAgICAgICAgICAgICAgICBTbG9nLmQoVEFHLCAiRElTQUJMRV9OT1RJRklDQVRJT05fVElDS0VSOiB5ZXMiKTsKLSAgICAgICAgICAgICAgICBtVGlja2VyLmhhbHQoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFsbCBjaGFuZ2VzIHRvIHRoZSBzdGF0dXMgYmFyIGFuZCBub3RpZmljYXRpb25zIGZ1bm5lbCB0aHJvdWdoIGhlcmUgYW5kIGFyZSBiYXRjaGVkLgotICAgICAqLwotICAgIHByaXZhdGUgY2xhc3MgSCBleHRlbmRzIEhhbmRsZXIgewotICAgICAgICBwdWJsaWMgdm9pZCBoYW5kbGVNZXNzYWdlKE1lc3NhZ2UgbSkgewotICAgICAgICAgICAgc3dpdGNoIChtLndoYXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIE1TR19BTklNQVRFOgotICAgICAgICAgICAgICAgICAgICBkb0FuaW1hdGlvbigpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIE1TR19BTklNQVRFX1JFVkVBTDoKLSAgICAgICAgICAgICAgICAgICAgZG9SZXZlYWxBbmltYXRpb24oKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBWaWV3Lk9uRm9jdXNDaGFuZ2VMaXN0ZW5lciBtRm9jdXNDaGFuZ2VMaXN0ZW5lciA9IG5ldyBWaWV3Lk9uRm9jdXNDaGFuZ2VMaXN0ZW5lcigpIHsKLSAgICAgICAgcHVibGljIHZvaWQgb25Gb2N1c0NoYW5nZShWaWV3IHYsIGJvb2xlYW4gaGFzRm9jdXMpIHsKLSAgICAgICAgICAgIC8vIEJlY2F1c2UgJ3YnIGlzIGEgVmlld0dyb3VwLCBhbGwgaXRzIGNoaWxkcmVuIHdpbGwgYmUgKHVuKXNlbGVjdGVkCi0gICAgICAgICAgICAvLyB0b28sIHdoaWNoIGFsbG93cyBtYXJxdWVlaW5nIHRvIHdvcmsuCi0gICAgICAgICAgICB2LnNldFNlbGVjdGVkKGhhc0ZvY3VzKTsKLSAgICAgICAgfQotICAgIH07Ci0KLSAgICBwcml2YXRlIHZvaWQgbWFrZUV4cGFuZGVkVmlzaWJsZSgpIHsKLSAgICAgICAgaWYgKFNQRVcpIFNsb2cuZChUQUcsICJNYWtlIGV4cGFuZGVkIHZpc2libGU6IGV4cGFuZGVkIHZpc2libGU9IiArIG1FeHBhbmRlZFZpc2libGUpOwotICAgICAgICBpZiAobUV4cGFuZGVkVmlzaWJsZSkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIG1FeHBhbmRlZFZpc2libGUgPSB0cnVlOwotICAgICAgICB2aXNpYmlsaXR5Q2hhbmdlZCh0cnVlKTsKLQotICAgICAgICB1cGRhdGVFeHBhbmRlZFZpZXdQb3MoRVhQQU5ERURfTEVBVkVfQUxPTkUpOwotICAgICAgICBtRXhwYW5kZWRQYXJhbXMuZmxhZ3MgJj0gfldpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zLkZMQUdfTk9UX0ZPQ1VTQUJMRTsKLSAgICAgICAgbUV4cGFuZGVkUGFyYW1zLmZsYWdzIHw9IFdpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zLkZMQUdfQUxUX0ZPQ1VTQUJMRV9JTTsKLSAgICAgICAgbUV4cGFuZGVkRGlhbG9nLmdldFdpbmRvdygpLnNldEF0dHJpYnV0ZXMobUV4cGFuZGVkUGFyYW1zKTsKLSAgICAgICAgbUV4cGFuZGVkVmlldy5yZXF1ZXN0Rm9jdXMoVmlldy5GT0NVU19GT1JXQVJEKTsKLSAgICAgICAgbVRyYWNraW5nVmlldy5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7Ci0KLSAgICAgICAgaWYgKCFtVGlja2luZykgewotICAgICAgICAgICAgc2V0RGF0ZVZpZXdWaXNpYmlsaXR5KHRydWUsIGNvbS5hbmRyb2lkLmludGVybmFsLlIuYW5pbS5mYWRlX2luKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFuaW1hdGVFeHBhbmQoKSB7Ci0gICAgICAgIGlmIChTUEVXKSBTbG9nLmQoVEFHLCAiQW5pbWF0ZSBleHBhbmQ6IGV4cGFuZGVkPSIgKyBtRXhwYW5kZWQpOwotICAgICAgICBpZiAoKG1EaXNhYmxlZCAmIFN0YXR1c0Jhck1hbmFnZXIuRElTQUJMRV9FWFBBTkQpICE9IDApIHsKLSAgICAgICAgICAgIHJldHVybiA7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG1FeHBhbmRlZCkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJlcGFyZVRyYWNraW5nKDAsIHRydWUpOwotICAgICAgICBwZXJmb3JtRmxpbmcoMCwgMjAwMC4wZiwgdHJ1ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYW5pbWF0ZUNvbGxhcHNlKCkgewotICAgICAgICBpZiAoU1BFVykgewotICAgICAgICAgICAgU2xvZy5kKFRBRywgImFuaW1hdGVDb2xsYXBzZSgpOiBtRXhwYW5kZWQ9IiArIG1FeHBhbmRlZAotICAgICAgICAgICAgICAgICAgICArICIgbUV4cGFuZGVkVmlzaWJsZT0iICsgbUV4cGFuZGVkVmlzaWJsZQotICAgICAgICAgICAgICAgICAgICArICIgbUV4cGFuZGVkPSIgKyBtRXhwYW5kZWQKLSAgICAgICAgICAgICAgICAgICAgKyAiIG1BbmltYXRpbmc9IiArIG1BbmltYXRpbmcKLSAgICAgICAgICAgICAgICAgICAgKyAiIG1BbmltWT0iICsgbUFuaW1ZCi0gICAgICAgICAgICAgICAgICAgICsgIiBtQW5pbVZlbD0iICsgbUFuaW1WZWwpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCFtRXhwYW5kZWRWaXNpYmxlKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBpbnQgeTsKLSAgICAgICAgaWYgKG1BbmltYXRpbmcpIHsKLSAgICAgICAgICAgIHkgPSAoaW50KW1BbmltWTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHkgPSBtRGlzcGxheS5nZXRIZWlnaHQoKS0xOwotICAgICAgICB9Ci0gICAgICAgIC8vIExldCB0aGUgZmxpbmcgdGhpbmsgdGhhdCB3ZSdyZSBvcGVuIHNvIGl0IGdvZXMgaW4gdGhlIHJpZ2h0IGRpcmVjdGlvbgotICAgICAgICAvLyBhbmQgZG9lc24ndCB0cnkgdG8gcmUtb3BlbiB0aGUgd2luZG93c2hhZGUuCi0gICAgICAgIG1FeHBhbmRlZCA9IHRydWU7Ci0gICAgICAgIHByZXBhcmVUcmFja2luZyh5LCBmYWxzZSk7Ci0gICAgICAgIHBlcmZvcm1GbGluZyh5LCAtMjAwMC4wZiwgdHJ1ZSk7Ci0gICAgfQotCi0gICAgdm9pZCBwZXJmb3JtRXhwYW5kKCkgewotICAgICAgICBpZiAoU1BFVykgU2xvZy5kKFRBRywgInBlcmZvcm1FeHBhbmQ6IG1FeHBhbmRlZD0iICsgbUV4cGFuZGVkKTsKLSAgICAgICAgaWYgKChtRGlzYWJsZWQgJiBTdGF0dXNCYXJNYW5hZ2VyLkRJU0FCTEVfRVhQQU5EKSAhPSAwKSB7Ci0gICAgICAgICAgICByZXR1cm4gOwotICAgICAgICB9Ci0gICAgICAgIGlmIChtRXhwYW5kZWQpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIG1FeHBhbmRlZCA9IHRydWU7Ci0gICAgICAgIG1ha2VFeHBhbmRlZFZpc2libGUoKTsKLSAgICAgICAgdXBkYXRlRXhwYW5kZWRWaWV3UG9zKEVYUEFOREVEX0ZVTExfT1BFTik7Ci0KLSAgICAgICAgaWYgKGZhbHNlKSBwb3N0U3RhcnRUcmFjaW5nKCk7Ci0gICAgfQotCi0gICAgdm9pZCBwZXJmb3JtQ29sbGFwc2UoKSB7Ci0gICAgICAgIGlmIChTUEVXKSBTbG9nLmQoVEFHLCAicGVyZm9ybUNvbGxhcHNlOiBtRXhwYW5kZWQ9IiArIG1FeHBhbmRlZAotICAgICAgICAgICAgICAgICsgIiBtRXhwYW5kZWRWaXNpYmxlPSIgKyBtRXhwYW5kZWRWaXNpYmxlCi0gICAgICAgICAgICAgICAgKyAiIG1UaWNraW5nPSIgKyBtVGlja2luZyk7Ci0KLSAgICAgICAgaWYgKCFtRXhwYW5kZWRWaXNpYmxlKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgbUV4cGFuZGVkVmlzaWJsZSA9IGZhbHNlOwotICAgICAgICB2aXNpYmlsaXR5Q2hhbmdlZChmYWxzZSk7Ci0gICAgICAgIG1FeHBhbmRlZFBhcmFtcy5mbGFncyB8PSBXaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcy5GTEFHX05PVF9GT0NVU0FCTEU7Ci0gICAgICAgIG1FeHBhbmRlZFBhcmFtcy5mbGFncyAmPSB+V2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMuRkxBR19BTFRfRk9DVVNBQkxFX0lNOwotICAgICAgICBtRXhwYW5kZWREaWFsb2cuZ2V0V2luZG93KCkuc2V0QXR0cmlidXRlcyhtRXhwYW5kZWRQYXJhbXMpOwotICAgICAgICBtVHJhY2tpbmdWaWV3LnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKLQotICAgICAgICBpZiAoKG1EaXNhYmxlZCAmIFN0YXR1c0Jhck1hbmFnZXIuRElTQUJMRV9OT1RJRklDQVRJT05fSUNPTlMpID09IDApIHsKLSAgICAgICAgICAgIHNldE5vdGlmaWNhdGlvbkljb25WaXNpYmlsaXR5KHRydWUsIGNvbS5hbmRyb2lkLmludGVybmFsLlIuYW5pbS5mYWRlX2luKTsKLSAgICAgICAgfQotICAgICAgICBpZiAobURhdGVWaWV3LmdldFZpc2liaWxpdHkoKSA9PSBWaWV3LlZJU0lCTEUpIHsKLSAgICAgICAgICAgIHNldERhdGVWaWV3VmlzaWJpbGl0eShmYWxzZSwgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5hbmltLmZhZGVfb3V0KTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICghbUV4cGFuZGVkKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgbUV4cGFuZGVkID0gZmFsc2U7Ci0gICAgfQotCi0gICAgdm9pZCBkb0FuaW1hdGlvbigpIHsKLSAgICAgICAgaWYgKG1BbmltYXRpbmcpIHsKLSAgICAgICAgICAgIGlmIChTUEVXKSBTbG9nLmQoVEFHLCAiZG9BbmltYXRpb24iKTsKLSAgICAgICAgICAgIGlmIChTUEVXKSBTbG9nLmQoVEFHLCAiZG9BbmltYXRpb24gYmVmb3JlIG1BbmltWT0iICsgbUFuaW1ZKTsKLSAgICAgICAgICAgIGluY3JlbWVudEFuaW0oKTsKLSAgICAgICAgICAgIGlmIChTUEVXKSBTbG9nLmQoVEFHLCAiZG9BbmltYXRpb24gYWZ0ZXIgIG1BbmltWT0iICsgbUFuaW1ZKTsKLSAgICAgICAgICAgIGlmIChtQW5pbVkgPj0gbURpc3BsYXkuZ2V0SGVpZ2h0KCktMSkgewotICAgICAgICAgICAgICAgIGlmIChTUEVXKSBTbG9nLmQoVEFHLCAiQW5pbWF0aW9uIGNvbXBsZXRlZCB0byBleHBhbmRlZCBzdGF0ZS4iKTsKLSAgICAgICAgICAgICAgICBtQW5pbWF0aW5nID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgdXBkYXRlRXhwYW5kZWRWaWV3UG9zKEVYUEFOREVEX0ZVTExfT1BFTik7Ci0gICAgICAgICAgICAgICAgcGVyZm9ybUV4cGFuZCgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAobUFuaW1ZIDwgbVN0YXR1c0JhclZpZXcuZ2V0SGVpZ2h0KCkpIHsKLSAgICAgICAgICAgICAgICBpZiAoU1BFVykgU2xvZy5kKFRBRywgIkFuaW1hdGlvbiBjb21wbGV0ZWQgdG8gY29sbGFwc2VkIHN0YXRlLiIpOwotICAgICAgICAgICAgICAgIG1BbmltYXRpbmcgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICB1cGRhdGVFeHBhbmRlZFZpZXdQb3MoMCk7Ci0gICAgICAgICAgICAgICAgcGVyZm9ybUNvbGxhcHNlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICB1cGRhdGVFeHBhbmRlZFZpZXdQb3MoKGludCltQW5pbVkpOwotICAgICAgICAgICAgICAgIG1DdXJBbmltYXRpb25UaW1lICs9IEFOSU1fRlJBTUVfRFVSQVRJT047Ci0gICAgICAgICAgICAgICAgbUhhbmRsZXIuc2VuZE1lc3NhZ2VBdFRpbWUobUhhbmRsZXIub2J0YWluTWVzc2FnZShNU0dfQU5JTUFURSksIG1DdXJBbmltYXRpb25UaW1lKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHZvaWQgc3RvcFRyYWNraW5nKCkgewotICAgICAgICBtVHJhY2tpbmcgPSBmYWxzZTsKLSAgICAgICAgbVZlbG9jaXR5VHJhY2tlci5yZWN5Y2xlKCk7Ci0gICAgICAgIG1WZWxvY2l0eVRyYWNrZXIgPSBudWxsOwotICAgIH0KLQotICAgIHZvaWQgaW5jcmVtZW50QW5pbSgpIHsKLSAgICAgICAgbG9uZyBub3cgPSBTeXN0ZW1DbG9jay51cHRpbWVNaWxsaXMoKTsKLSAgICAgICAgZmxvYXQgdCA9ICgoZmxvYXQpKG5vdyAtIG1BbmltTGFzdFRpbWUpKSAvIDEwMDA7ICAgICAgICAgICAgLy8gbXMgLT4gcwotICAgICAgICBmaW5hbCBmbG9hdCB5ID0gbUFuaW1ZOwotICAgICAgICBmaW5hbCBmbG9hdCB2ID0gbUFuaW1WZWw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBweC9zCi0gICAgICAgIGZpbmFsIGZsb2F0IGEgPSBtQW5pbUFjY2VsOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHB4L3MvcwotICAgICAgICBtQW5pbVkgPSB5ICsgKHYqdCkgKyAoMC41ZiphKnQqdCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBweAotICAgICAgICBtQW5pbVZlbCA9IHYgKyAoYSp0KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBweC9zCi0gICAgICAgIG1BbmltTGFzdFRpbWUgPSBub3c7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1zCi0gICAgICAgIC8vU2xvZy5kKFRBRywgInk9IiArIHkgKyAiIHY9IiArIHYgKyAiIGE9IiArIGEgKyAiIHQ9IiArIHQgKyAiIG1BbmltWT0iICsgbUFuaW1ZCi0gICAgICAgIC8vICAgICAgICArICIgbUFuaW1BY2NlbD0iICsgbUFuaW1BY2NlbCk7Ci0gICAgfQotCi0gICAgdm9pZCBkb1JldmVhbEFuaW1hdGlvbigpIHsKLSAgICAgICAgZmluYWwgaW50IGggPSBtQ2xvc2VWaWV3LmdldEhlaWdodCgpICsgbVN0YXR1c0JhclZpZXcuZ2V0SGVpZ2h0KCk7Ci0gICAgICAgIGlmIChtQW5pbWF0aW5nUmV2ZWFsICYmIG1BbmltYXRpbmcgJiYgbUFuaW1ZIDwgaCkgewotICAgICAgICAgICAgaW5jcmVtZW50QW5pbSgpOwotICAgICAgICAgICAgaWYgKG1BbmltWSA+PSBoKSB7Ci0gICAgICAgICAgICAgICAgbUFuaW1ZID0gaDsKLSAgICAgICAgICAgICAgICB1cGRhdGVFeHBhbmRlZFZpZXdQb3MoKGludCltQW5pbVkpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB1cGRhdGVFeHBhbmRlZFZpZXdQb3MoKGludCltQW5pbVkpOwotICAgICAgICAgICAgICAgIG1DdXJBbmltYXRpb25UaW1lICs9IEFOSU1fRlJBTUVfRFVSQVRJT047Ci0gICAgICAgICAgICAgICAgbUhhbmRsZXIuc2VuZE1lc3NhZ2VBdFRpbWUobUhhbmRsZXIub2J0YWluTWVzc2FnZShNU0dfQU5JTUFURV9SRVZFQUwpLAotICAgICAgICAgICAgICAgICAgICAgICAgbUN1ckFuaW1hdGlvblRpbWUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgdm9pZCBwcmVwYXJlVHJhY2tpbmcoaW50IHksIGJvb2xlYW4gb3BlbmluZykgewotICAgICAgICBtVHJhY2tpbmcgPSB0cnVlOwotICAgICAgICBtVmVsb2NpdHlUcmFja2VyID0gVmVsb2NpdHlUcmFja2VyLm9idGFpbigpOwotICAgICAgICBpZiAob3BlbmluZykgewotICAgICAgICAgICAgbUFuaW1BY2NlbCA9IDIwMDAuMGY7Ci0gICAgICAgICAgICBtQW5pbVZlbCA9IDIwMDsKLSAgICAgICAgICAgIG1BbmltWSA9IG1TdGF0dXNCYXJWaWV3LmdldEhlaWdodCgpOwotICAgICAgICAgICAgdXBkYXRlRXhwYW5kZWRWaWV3UG9zKChpbnQpbUFuaW1ZKTsKLSAgICAgICAgICAgIG1BbmltYXRpbmcgPSB0cnVlOwotICAgICAgICAgICAgbUFuaW1hdGluZ1JldmVhbCA9IHRydWU7Ci0gICAgICAgICAgICBtSGFuZGxlci5yZW1vdmVNZXNzYWdlcyhNU0dfQU5JTUFURSk7Ci0gICAgICAgICAgICBtSGFuZGxlci5yZW1vdmVNZXNzYWdlcyhNU0dfQU5JTUFURV9SRVZFQUwpOwotICAgICAgICAgICAgbG9uZyBub3cgPSBTeXN0ZW1DbG9jay51cHRpbWVNaWxsaXMoKTsKLSAgICAgICAgICAgIG1BbmltTGFzdFRpbWUgPSBub3c7Ci0gICAgICAgICAgICBtQ3VyQW5pbWF0aW9uVGltZSA9IG5vdyArIEFOSU1fRlJBTUVfRFVSQVRJT047Ci0gICAgICAgICAgICBtQW5pbWF0aW5nID0gdHJ1ZTsKLSAgICAgICAgICAgIG1IYW5kbGVyLnNlbmRNZXNzYWdlQXRUaW1lKG1IYW5kbGVyLm9idGFpbk1lc3NhZ2UoTVNHX0FOSU1BVEVfUkVWRUFMKSwKLSAgICAgICAgICAgICAgICAgICAgbUN1ckFuaW1hdGlvblRpbWUpOwotICAgICAgICAgICAgbWFrZUV4cGFuZGVkVmlzaWJsZSgpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy8gaXQncyBvcGVuLCBjbG9zZSBpdD8KLSAgICAgICAgICAgIGlmIChtQW5pbWF0aW5nKSB7Ci0gICAgICAgICAgICAgICAgbUFuaW1hdGluZyA9IGZhbHNlOwotICAgICAgICAgICAgICAgIG1IYW5kbGVyLnJlbW92ZU1lc3NhZ2VzKE1TR19BTklNQVRFKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHVwZGF0ZUV4cGFuZGVkVmlld1Bvcyh5ICsgbVZpZXdEZWx0YSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICB2b2lkIHBlcmZvcm1GbGluZyhpbnQgeSwgZmxvYXQgdmVsLCBib29sZWFuIGFsd2F5cykgewotICAgICAgICBtQW5pbWF0aW5nUmV2ZWFsID0gZmFsc2U7Ci0gICAgICAgIG1EaXNwbGF5SGVpZ2h0ID0gbURpc3BsYXkuZ2V0SGVpZ2h0KCk7Ci0KLSAgICAgICAgbUFuaW1ZID0geTsKLSAgICAgICAgbUFuaW1WZWwgPSB2ZWw7Ci0KLSAgICAgICAgLy9TbG9nLmQoVEFHLCAic3RhcnRpbmcgd2l0aCBtQW5pbVk9IiArIG1BbmltWSArICIgbUFuaW1WZWw9IiArIG1BbmltVmVsKTsKLQotICAgICAgICBpZiAobUV4cGFuZGVkKSB7Ci0gICAgICAgICAgICBpZiAoIWFsd2F5cyAmJiAoCi0gICAgICAgICAgICAgICAgICAgIHZlbCA+IDIwMC4wZgotICAgICAgICAgICAgICAgICAgICB8fCAoeSA+IChtRGlzcGxheUhlaWdodC0yNSkgJiYgdmVsID4gLTIwMC4wZikpKSB7Ci0gICAgICAgICAgICAgICAgLy8gV2UgYXJlIGV4cGFuZGVkLCBidXQgdGhleSBkaWRuJ3QgbW92ZSBzdWZmaWNpZW50bHkgdG8gY2F1c2UKLSAgICAgICAgICAgICAgICAvLyB1cyB0byByZXRyYWN0LiAgQW5pbWF0ZSBiYWNrIHRvIHRoZSBleHBhbmRlZCBwb3NpdGlvbi4KLSAgICAgICAgICAgICAgICBtQW5pbUFjY2VsID0gMjAwMC4wZjsKLSAgICAgICAgICAgICAgICBpZiAodmVsIDwgMCkgewotICAgICAgICAgICAgICAgICAgICBtQW5pbVZlbCA9IDA7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgLy8gV2UgYXJlIGV4cGFuZGVkIGFuZCBhcmUgbm93IGdvaW5nIHRvIGFuaW1hdGUgYXdheS4KLSAgICAgICAgICAgICAgICBtQW5pbUFjY2VsID0gLTIwMDAuMGY7Ci0gICAgICAgICAgICAgICAgaWYgKHZlbCA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgbUFuaW1WZWwgPSAwOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGlmIChhbHdheXMgfHwgKAotICAgICAgICAgICAgICAgICAgICB2ZWwgPiAyMDAuMGYKLSAgICAgICAgICAgICAgICAgICAgfHwgKHkgPiAobURpc3BsYXlIZWlnaHQvMikgJiYgdmVsID4gLTIwMC4wZikpKSB7Ci0gICAgICAgICAgICAgICAgLy8gV2UgYXJlIGNvbGxhcHNlZCwgYW5kIHRoZXkgbW92ZWQgZW5vdWdoIHRvIGFsbG93IHVzIHRvCi0gICAgICAgICAgICAgICAgLy8gZXhwYW5kLiAgQW5pbWF0ZSBpbiB0aGUgbm90aWZpY2F0aW9ucy4KLSAgICAgICAgICAgICAgICBtQW5pbUFjY2VsID0gMjAwMC4wZjsKLSAgICAgICAgICAgICAgICBpZiAodmVsIDwgMCkgewotICAgICAgICAgICAgICAgICAgICBtQW5pbVZlbCA9IDA7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgLy8gV2UgYXJlIGNvbGxhcHNlZCwgYnV0IHRoZXkgZGlkbid0IG1vdmUgc3VmZmljaWVudGx5IHRvIGNhdXNlCi0gICAgICAgICAgICAgICAgLy8gdXMgdG8gcmV0cmFjdC4gIEFuaW1hdGUgYmFjayB0byB0aGUgY29sbGFwc2VkIHBvc2l0aW9uLgotICAgICAgICAgICAgICAgIG1BbmltQWNjZWwgPSAtMjAwMC4wZjsKLSAgICAgICAgICAgICAgICBpZiAodmVsID4gMCkgewotICAgICAgICAgICAgICAgICAgICBtQW5pbVZlbCA9IDA7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIC8vU2xvZy5kKFRBRywgIm1BbmltWT0iICsgbUFuaW1ZICsgIiBtQW5pbVZlbD0iICsgbUFuaW1WZWwKLSAgICAgICAgLy8gICAgICAgICsgIiBtQW5pbUFjY2VsPSIgKyBtQW5pbUFjY2VsKTsKLQotICAgICAgICBsb25nIG5vdyA9IFN5c3RlbUNsb2NrLnVwdGltZU1pbGxpcygpOwotICAgICAgICBtQW5pbUxhc3RUaW1lID0gbm93OwotICAgICAgICBtQ3VyQW5pbWF0aW9uVGltZSA9IG5vdyArIEFOSU1fRlJBTUVfRFVSQVRJT047Ci0gICAgICAgIG1BbmltYXRpbmcgPSB0cnVlOwotICAgICAgICBtSGFuZGxlci5yZW1vdmVNZXNzYWdlcyhNU0dfQU5JTUFURSk7Ci0gICAgICAgIG1IYW5kbGVyLnJlbW92ZU1lc3NhZ2VzKE1TR19BTklNQVRFX1JFVkVBTCk7Ci0gICAgICAgIG1IYW5kbGVyLnNlbmRNZXNzYWdlQXRUaW1lKG1IYW5kbGVyLm9idGFpbk1lc3NhZ2UoTVNHX0FOSU1BVEUpLCBtQ3VyQW5pbWF0aW9uVGltZSk7Ci0gICAgICAgIHN0b3BUcmFja2luZygpOwotICAgIH0KLQotICAgIGJvb2xlYW4gaW50ZXJjZXB0VG91Y2hFdmVudChNb3Rpb25FdmVudCBldmVudCkgewotICAgICAgICBpZiAoU1BFVykgewotICAgICAgICAgICAgU2xvZy5kKFRBRywgIlRvdWNoOiByYXdZPSIgKyBldmVudC5nZXRSYXdZKCkgKyAiIGV2ZW50PSIgKyBldmVudCArICIgbURpc2FibGVkPSIKLSAgICAgICAgICAgICAgICArIG1EaXNhYmxlZCk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoKG1EaXNhYmxlZCAmIFN0YXR1c0Jhck1hbmFnZXIuRElTQUJMRV9FWFBBTkQpICE9IDApIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIGZpbmFsIGludCBzdGF0dXNCYXJTaXplID0gbVN0YXR1c0JhclZpZXcuZ2V0SGVpZ2h0KCk7Ci0gICAgICAgIGZpbmFsIGludCBoaXRTaXplID0gc3RhdHVzQmFyU2l6ZSoyOwotICAgICAgICBpZiAoZXZlbnQuZ2V0QWN0aW9uKCkgPT0gTW90aW9uRXZlbnQuQUNUSU9OX0RPV04pIHsKLSAgICAgICAgICAgIGZpbmFsIGludCB5ID0gKGludClldmVudC5nZXRSYXdZKCk7Ci0KLSAgICAgICAgICAgIGlmICghbUV4cGFuZGVkKSB7Ci0gICAgICAgICAgICAgICAgbVZpZXdEZWx0YSA9IHN0YXR1c0JhclNpemUgLSB5OwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBtVHJhY2tpbmdWaWV3LmdldExvY2F0aW9uT25TY3JlZW4obUFic1Bvcyk7Ci0gICAgICAgICAgICAgICAgbVZpZXdEZWx0YSA9IG1BYnNQb3NbMV0gKyBtVHJhY2tpbmdWaWV3LmdldEhlaWdodCgpIC0geTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICgoIW1FeHBhbmRlZCAmJiB5IDwgaGl0U2l6ZSkgfHwKLSAgICAgICAgICAgICAgICAgICAgKG1FeHBhbmRlZCAmJiB5ID4gKG1EaXNwbGF5LmdldEhlaWdodCgpLWhpdFNpemUpKSkgewotCi0gICAgICAgICAgICAgICAgLy8gV2UgZHJvcCBldmVudHMgYXQgdGhlIGVkZ2Ugb2YgdGhlIHNjcmVlbiB0byBtYWtlIHRoZSB3aW5kb3dzaGFkZSBjb21lCi0gICAgICAgICAgICAgICAgLy8gZG93biBieSBhY2NpZGVudCBsZXNzLCBlc3BlY2lhbGx5IHdoZW4gcHVzaGluZyBvcGVuIGEgZGV2aWNlIHdpdGggYSBrZXlib2FyZAotICAgICAgICAgICAgICAgIC8vIHRoYXQgcm90YXRlcyAobGlrZSBnMSBhbmQgZHJvaWQpCi0gICAgICAgICAgICAgICAgaW50IHggPSAoaW50KWV2ZW50LmdldFJhd1goKTsKLSAgICAgICAgICAgICAgICBmaW5hbCBpbnQgZWRnZUJvcmRlciA9IG1FZGdlQm9yZGVyOwotICAgICAgICAgICAgICAgIGlmICh4ID49IGVkZ2VCb3JkZXIgJiYgeCA8IG1EaXNwbGF5LmdldFdpZHRoKCkgLSBlZGdlQm9yZGVyKSB7Ci0gICAgICAgICAgICAgICAgICAgIHByZXBhcmVUcmFja2luZyh5LCAhbUV4cGFuZGVkKTsvLyBvcGVuaW5nIGlmIHdlJ3JlIG5vdCBhbHJlYWR5IGZ1bGx5IHZpc2libGUKLSAgICAgICAgICAgICAgICAgICAgbVZlbG9jaXR5VHJhY2tlci5hZGRNb3ZlbWVudChldmVudCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKG1UcmFja2luZykgewotICAgICAgICAgICAgbVZlbG9jaXR5VHJhY2tlci5hZGRNb3ZlbWVudChldmVudCk7Ci0gICAgICAgICAgICBmaW5hbCBpbnQgbWluWSA9IHN0YXR1c0JhclNpemUgKyBtQ2xvc2VWaWV3LmdldEhlaWdodCgpOwotICAgICAgICAgICAgaWYgKGV2ZW50LmdldEFjdGlvbigpID09IE1vdGlvbkV2ZW50LkFDVElPTl9NT1ZFKSB7Ci0gICAgICAgICAgICAgICAgaW50IHkgPSAoaW50KWV2ZW50LmdldFJhd1koKTsKLSAgICAgICAgICAgICAgICBpZiAobUFuaW1hdGluZ1JldmVhbCAmJiB5IDwgbWluWSkgewotICAgICAgICAgICAgICAgICAgICAvLyBub3RoaW5nCi0gICAgICAgICAgICAgICAgfSBlbHNlICB7Ci0gICAgICAgICAgICAgICAgICAgIG1BbmltYXRpbmdSZXZlYWwgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgdXBkYXRlRXhwYW5kZWRWaWV3UG9zKHkgKyBtVmlld0RlbHRhKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGV2ZW50LmdldEFjdGlvbigpID09IE1vdGlvbkV2ZW50LkFDVElPTl9VUCkgewotICAgICAgICAgICAgICAgIG1WZWxvY2l0eVRyYWNrZXIuY29tcHV0ZUN1cnJlbnRWZWxvY2l0eSgxMDAwKTsKLQotICAgICAgICAgICAgICAgIGZsb2F0IHlWZWwgPSBtVmVsb2NpdHlUcmFja2VyLmdldFlWZWxvY2l0eSgpOwotICAgICAgICAgICAgICAgIGJvb2xlYW4gbmVnYXRpdmUgPSB5VmVsIDwgMDsKLQotICAgICAgICAgICAgICAgIGZsb2F0IHhWZWwgPSBtVmVsb2NpdHlUcmFja2VyLmdldFhWZWxvY2l0eSgpOwotICAgICAgICAgICAgICAgIGlmICh4VmVsIDwgMCkgewotICAgICAgICAgICAgICAgICAgICB4VmVsID0gLXhWZWw7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmICh4VmVsID4gMTUwLjBmKSB7Ci0gICAgICAgICAgICAgICAgICAgIHhWZWwgPSAxNTAuMGY7IC8vIGxpbWl0IGhvdyBtdWNoIHdlIGNhcmUgYWJvdXQgdGhlIHggYXhpcwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGZsb2F0IHZlbCA9IChmbG9hdClNYXRoLmh5cG90KHlWZWwsIHhWZWwpOwotICAgICAgICAgICAgICAgIGlmIChuZWdhdGl2ZSkgewotICAgICAgICAgICAgICAgICAgICB2ZWwgPSAtdmVsOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHBlcmZvcm1GbGluZygoaW50KWV2ZW50LmdldFJhd1koKSwgdmVsLCBmYWxzZSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBjbGFzcyBMYXVuY2hlciBpbXBsZW1lbnRzIFZpZXcuT25DbGlja0xpc3RlbmVyIHsKLSAgICAgICAgcHJpdmF0ZSBQZW5kaW5nSW50ZW50IG1JbnRlbnQ7Ci0gICAgICAgIHByaXZhdGUgU3RyaW5nIG1Qa2c7Ci0gICAgICAgIHByaXZhdGUgU3RyaW5nIG1UYWc7Ci0gICAgICAgIHByaXZhdGUgaW50IG1JZDsKLQotICAgICAgICBMYXVuY2hlcihQZW5kaW5nSW50ZW50IGludGVudCwgU3RyaW5nIHBrZywgU3RyaW5nIHRhZywgaW50IGlkKSB7Ci0gICAgICAgICAgICBtSW50ZW50ID0gaW50ZW50OwotICAgICAgICAgICAgbVBrZyA9IHBrZzsKLSAgICAgICAgICAgIG1UYWcgPSB0YWc7Ci0gICAgICAgICAgICBtSWQgPSBpZDsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uQ2xpY2soVmlldyB2KSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIC8vIFRoZSBpbnRlbnQgd2UgYXJlIHNlbmRpbmcgaXMgZm9yIHRoZSBhcHBsaWNhdGlvbiwgd2hpY2gKLSAgICAgICAgICAgICAgICAvLyB3b24ndCBoYXZlIHBlcm1pc3Npb24gdG8gaW1tZWRpYXRlbHkgc3RhcnQgYW4gYWN0aXZpdHkgYWZ0ZXIKLSAgICAgICAgICAgICAgICAvLyB0aGUgdXNlciBzd2l0Y2hlcyB0byBob21lLiAgV2Uga25vdyBpdCBpcyBzYWZlIHRvIGRvIGF0IHRoaXMKLSAgICAgICAgICAgICAgICAvLyBwb2ludCwgc28gbWFrZSBzdXJlIG5ldyBhY3Rpdml0eSBzd2l0Y2hlcyBhcmUgbm93IGFsbG93ZWQuCi0gICAgICAgICAgICAgICAgQWN0aXZpdHlNYW5hZ2VyTmF0aXZlLmdldERlZmF1bHQoKS5yZXN1bWVBcHBTd2l0Y2hlcygpOwotICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKG1JbnRlbnQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGludFtdIHBvcyA9IG5ldyBpbnRbMl07Ci0gICAgICAgICAgICAgICAgdi5nZXRMb2NhdGlvbk9uU2NyZWVuKHBvcyk7Ci0gICAgICAgICAgICAgICAgSW50ZW50IG92ZXJsYXkgPSBuZXcgSW50ZW50KCk7Ci0gICAgICAgICAgICAgICAgb3ZlcmxheS5zZXRTb3VyY2VCb3VuZHMoCi0gICAgICAgICAgICAgICAgICAgICAgICBuZXcgUmVjdChwb3NbMF0sIHBvc1sxXSwgcG9zWzBdK3YuZ2V0V2lkdGgoKSwgcG9zWzFdK3YuZ2V0SGVpZ2h0KCkpKTsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBtSW50ZW50LnNlbmQoU3RhdHVzQmFyU2VydmljZS50aGlzLCAwLCBvdmVybGF5KTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChQZW5kaW5nSW50ZW50LkNhbmNlbGVkRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHN0YWNrIHRyYWNlIGlzbid0IHZlcnkgaGVscGZ1bCBoZXJlLiAgSnVzdCBsb2cgdGhlIGV4Y2VwdGlvbiBtZXNzYWdlLgotICAgICAgICAgICAgICAgICAgICBTbG9nLncoVEFHLCAiU2VuZGluZyBjb250ZW50SW50ZW50IGZhaWxlZDogIiArIGUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBtQmFyU2VydmljZS5vbk5vdGlmaWNhdGlvbkNsaWNrKG1Qa2csIG1UYWcsIG1JZCk7Ci0gICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgICAgICAvLyBzeXN0ZW0gcHJvY2VzcyBpcyBkZWFkIGlmIHdlJ3JlIGhlcmUuCi0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIGNsb3NlIHRoZSBzaGFkZSBpZiBpdCB3YXMgb3BlbgotICAgICAgICAgICAgYW5pbWF0ZUNvbGxhcHNlKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgdGljayhTdGF0dXNCYXJOb3RpZmljYXRpb24gbikgewotICAgICAgICAvLyBTaG93IHRoZSB0aWNrZXIgaWYgb25lIGlzIHJlcXVlc3RlZC4gQWxzbyBkb24ndCBkbyB0aGlzCi0gICAgICAgIC8vIHVudGlsIHN0YXR1cyBiYXIgd2luZG93IGlzIGF0dGFjaGVkIHRvIHRoZSB3aW5kb3cgbWFuYWdlciwKLSAgICAgICAgLy8gYmVjYXVzZS4uLiAgd2VsbCwgd2hhdCdzIHRoZSBwb2ludCBvdGhlcndpc2U/ICBBbmQgdHJ5aW5nIHRvCi0gICAgICAgIC8vIHJ1biBhIHRpY2tlciB3aXRob3V0IGJlaW5nIGF0dGFjaGVkIHdpbGwgY3Jhc2ghCi0gICAgICAgIGlmIChuLm5vdGlmaWNhdGlvbi50aWNrZXJUZXh0ICE9IG51bGwgJiYgbVN0YXR1c0JhclZpZXcuZ2V0V2luZG93VG9rZW4oKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAoMCA9PSAobURpc2FibGVkICYgKFN0YXR1c0Jhck1hbmFnZXIuRElTQUJMRV9OT1RJRklDQVRJT05fSUNPTlMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFN0YXR1c0Jhck1hbmFnZXIuRElTQUJMRV9OT1RJRklDQVRJT05fVElDS0VSKSkpIHsKLSAgICAgICAgICAgICAgICBtVGlja2VyLmFkZEVudHJ5KG4pOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2FuY2VsIHRoaXMgbm90aWZpY2F0aW9uIGFuZCB0ZWxsIHRoZSBTdGF0dXNCYXJNYW5hZ2VyU2VydmljZSAvIE5vdGlmaWNhdGlvbk1hbmFnZXJTZXJ2aWNlCi0gICAgICogYWJvdXQgdGhlIGZhaWx1cmUuCi0gICAgICoKLSAgICAgKiBXQVJOSU5HOiB0aGlzIHdpbGwgY2FsbCBiYWNrIGludG8gdXMuICBEb24ndCBob2xkIGFueSBsb2Nrcy4KLSAgICAgKi8KLSAgICB2b2lkIGhhbmRsZU5vdGlmaWNhdGlvbkVycm9yKElCaW5kZXIga2V5LCBTdGF0dXNCYXJOb3RpZmljYXRpb24gbiwgU3RyaW5nIG1lc3NhZ2UpIHsKLSAgICAgICAgcmVtb3ZlTm90aWZpY2F0aW9uKGtleSk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBtQmFyU2VydmljZS5vbk5vdGlmaWNhdGlvbkVycm9yKG4ucGtnLCBuLnRhZywgbi5pZCwgbi51aWQsIG4uaW5pdGlhbFBpZCwgbWVzc2FnZSk7Ci0gICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgLy8gVGhlIGVuZCBpcyBuaWdoLgotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBjbGFzcyBNeVRpY2tlciBleHRlbmRzIFRpY2tlciB7Ci0gICAgICAgIE15VGlja2VyKENvbnRleHQgY29udGV4dCwgU3RhdHVzQmFyVmlldyBzYikgewotICAgICAgICAgICAgc3VwZXIoY29udGV4dCwgc2IpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHZvaWQgdGlja2VyU3RhcnRpbmcoKSB7Ci0gICAgICAgICAgICBpZiAoU1BFVykgU2xvZy5kKFRBRywgInRpY2tlclN0YXJ0aW5nIik7Ci0gICAgICAgICAgICBtVGlja2luZyA9IHRydWU7Ci0gICAgICAgICAgICBtSWNvbnMuc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOwotICAgICAgICAgICAgbVRpY2tlclZpZXcuc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOwotICAgICAgICAgICAgbVRpY2tlclZpZXcuc3RhcnRBbmltYXRpb24obG9hZEFuaW0oY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5hbmltLnB1c2hfdXBfaW4sIG51bGwpKTsKLSAgICAgICAgICAgIG1JY29ucy5zdGFydEFuaW1hdGlvbihsb2FkQW5pbShjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmFuaW0ucHVzaF91cF9vdXQsIG51bGwpKTsKLSAgICAgICAgICAgIGlmIChtRXhwYW5kZWRWaXNpYmxlKSB7Ci0gICAgICAgICAgICAgICAgc2V0RGF0ZVZpZXdWaXNpYmlsaXR5KGZhbHNlLCBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmFuaW0ucHVzaF91cF9vdXQpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHZvaWQgdGlja2VyRG9uZSgpIHsKLSAgICAgICAgICAgIGlmIChTUEVXKSBTbG9nLmQoVEFHLCAidGlja2VyRG9uZSIpOwotICAgICAgICAgICAgbVRpY2tpbmcgPSBmYWxzZTsKLSAgICAgICAgICAgIG1JY29ucy5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7Ci0gICAgICAgICAgICBtVGlja2VyVmlldy5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7Ci0gICAgICAgICAgICBtSWNvbnMuc3RhcnRBbmltYXRpb24obG9hZEFuaW0oY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5hbmltLnB1c2hfZG93bl9pbiwgbnVsbCkpOwotICAgICAgICAgICAgbVRpY2tlclZpZXcuc3RhcnRBbmltYXRpb24obG9hZEFuaW0oY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5hbmltLnB1c2hfZG93bl9vdXQsIG51bGwpKTsKLSAgICAgICAgICAgIGlmIChtRXhwYW5kZWRWaXNpYmxlKSB7Ci0gICAgICAgICAgICAgICAgc2V0RGF0ZVZpZXdWaXNpYmlsaXR5KHRydWUsIGNvbS5hbmRyb2lkLmludGVybmFsLlIuYW5pbS5wdXNoX2Rvd25faW4pOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgdm9pZCB0aWNrZXJIYWx0aW5nKCkgewotICAgICAgICAgICAgaWYgKFNQRVcpIFNsb2cuZChUQUcsICJ0aWNrZXJIYWx0aW5nIik7Ci0gICAgICAgICAgICBtVGlja2luZyA9IGZhbHNlOwotICAgICAgICAgICAgbUljb25zLnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKLSAgICAgICAgICAgIG1UaWNrZXJWaWV3LnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKLSAgICAgICAgICAgIG1JY29ucy5zdGFydEFuaW1hdGlvbihsb2FkQW5pbShjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmFuaW0uZmFkZV9pbiwgbnVsbCkpOwotICAgICAgICAgICAgbVRpY2tlclZpZXcuc3RhcnRBbmltYXRpb24obG9hZEFuaW0oY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5hbmltLmZhZGVfb3V0LCBudWxsKSk7Ci0gICAgICAgICAgICBpZiAobUV4cGFuZGVkVmlzaWJsZSkgewotICAgICAgICAgICAgICAgIHNldERhdGVWaWV3VmlzaWJpbGl0eSh0cnVlLCBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmFuaW0uZmFkZV9pbik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIEFuaW1hdGlvbiBsb2FkQW5pbShpbnQgaWQsIEFuaW1hdGlvbi5BbmltYXRpb25MaXN0ZW5lciBsaXN0ZW5lcikgewotICAgICAgICBBbmltYXRpb24gYW5pbSA9IEFuaW1hdGlvblV0aWxzLmxvYWRBbmltYXRpb24oU3RhdHVzQmFyU2VydmljZS50aGlzLCBpZCk7Ci0gICAgICAgIGlmIChsaXN0ZW5lciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBhbmltLnNldEFuaW1hdGlvbkxpc3RlbmVyKGxpc3RlbmVyKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gYW5pbTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIHZpZXdJbmZvKFZpZXcgdikgewotICAgICAgICByZXR1cm4gIigiICsgdi5nZXRMZWZ0KCkgKyAiLCIgKyB2LmdldFRvcCgpICsgIikoIiArIHYuZ2V0UmlnaHQoKSArICIsIiArIHYuZ2V0Qm90dG9tKCkKLSAgICAgICAgICAgICAgICArICIgIiArIHYuZ2V0V2lkdGgoKSArICJ4IiArIHYuZ2V0SGVpZ2h0KCkgKyAiKSI7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgZHVtcChGaWxlRGVzY3JpcHRvciBmZCwgUHJpbnRXcml0ZXIgcHcsIFN0cmluZ1tdIGFyZ3MpIHsKLSAgICAgICAgaWYgKGNoZWNrQ2FsbGluZ09yU2VsZlBlcm1pc3Npb24oYW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uLkRVTVApCi0gICAgICAgICAgICAgICAgIT0gUGFja2FnZU1hbmFnZXIuUEVSTUlTU0lPTl9HUkFOVEVEKSB7Ci0gICAgICAgICAgICBwdy5wcmludGxuKCJQZXJtaXNzaW9uIERlbmlhbDogY2FuJ3QgZHVtcCBTdGF0dXNCYXIgZnJvbSBmcm9tIHBpZD0iCi0gICAgICAgICAgICAgICAgICAgICsgQmluZGVyLmdldENhbGxpbmdQaWQoKQotICAgICAgICAgICAgICAgICAgICArICIsIHVpZD0iICsgQmluZGVyLmdldENhbGxpbmdVaWQoKSk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBzeW5jaHJvbml6ZWQgKG1RdWV1ZUxvY2spIHsKLSAgICAgICAgICAgIHB3LnByaW50bG4oIkN1cnJlbnQgU3RhdHVzIEJhciBzdGF0ZToiKTsKLSAgICAgICAgICAgIHB3LnByaW50bG4oIiAgbUV4cGFuZGVkPSIgKyBtRXhwYW5kZWQKLSAgICAgICAgICAgICAgICAgICAgKyAiLCBtRXhwYW5kZWRWaXNpYmxlPSIgKyBtRXhwYW5kZWRWaXNpYmxlKTsKLSAgICAgICAgICAgIHB3LnByaW50bG4oIiAgbVRpY2tpbmc9IiArIG1UaWNraW5nKTsKLSAgICAgICAgICAgIHB3LnByaW50bG4oIiAgbVRyYWNraW5nPSIgKyBtVHJhY2tpbmcpOwotICAgICAgICAgICAgcHcucHJpbnRsbigiICBtQW5pbWF0aW5nPSIgKyBtQW5pbWF0aW5nCi0gICAgICAgICAgICAgICAgICAgICsgIiwgbUFuaW1ZPSIgKyBtQW5pbVkgKyAiLCBtQW5pbVZlbD0iICsgbUFuaW1WZWwKLSAgICAgICAgICAgICAgICAgICAgKyAiLCBtQW5pbUFjY2VsPSIgKyBtQW5pbUFjY2VsKTsKLSAgICAgICAgICAgIHB3LnByaW50bG4oIiAgbUN1ckFuaW1hdGlvblRpbWU9IiArIG1DdXJBbmltYXRpb25UaW1lCi0gICAgICAgICAgICAgICAgICAgICsgIiBtQW5pbUxhc3RUaW1lPSIgKyBtQW5pbUxhc3RUaW1lKTsKLSAgICAgICAgICAgIHB3LnByaW50bG4oIiAgbURpc3BsYXlIZWlnaHQ9IiArIG1EaXNwbGF5SGVpZ2h0Ci0gICAgICAgICAgICAgICAgICAgICsgIiBtQW5pbWF0aW5nUmV2ZWFsPSIgKyBtQW5pbWF0aW5nUmV2ZWFsCi0gICAgICAgICAgICAgICAgICAgICsgIiBtVmlld0RlbHRhPSIgKyBtVmlld0RlbHRhKTsKLSAgICAgICAgICAgIHB3LnByaW50bG4oIiAgbURpc3BsYXlIZWlnaHQ9IiArIG1EaXNwbGF5SGVpZ2h0KTsKLSAgICAgICAgICAgIHB3LnByaW50bG4oIiAgbUV4cGFuZGVkUGFyYW1zOiAiICsgbUV4cGFuZGVkUGFyYW1zKTsKLSAgICAgICAgICAgIHB3LnByaW50bG4oIiAgbUV4cGFuZGVkVmlldzogIiArIHZpZXdJbmZvKG1FeHBhbmRlZFZpZXcpKTsKLSAgICAgICAgICAgIHB3LnByaW50bG4oIiAgbUV4cGFuZGVkRGlhbG9nOiAiICsgbUV4cGFuZGVkRGlhbG9nKTsKLSAgICAgICAgICAgIHB3LnByaW50bG4oIiAgbVRyYWNraW5nUGFyYW1zOiAiICsgbVRyYWNraW5nUGFyYW1zKTsKLSAgICAgICAgICAgIHB3LnByaW50bG4oIiAgbVRyYWNraW5nVmlldzogIiArIHZpZXdJbmZvKG1UcmFja2luZ1ZpZXcpKTsKLSAgICAgICAgICAgIHB3LnByaW50bG4oIiAgbU9uZ29pbmdUaXRsZTogIiArIHZpZXdJbmZvKG1PbmdvaW5nVGl0bGUpKTsKLSAgICAgICAgICAgIHB3LnByaW50bG4oIiAgbU9uZ29pbmdJdGVtczogIiArIHZpZXdJbmZvKG1PbmdvaW5nSXRlbXMpKTsKLSAgICAgICAgICAgIHB3LnByaW50bG4oIiAgbUxhdGVzdFRpdGxlOiAiICsgdmlld0luZm8obUxhdGVzdFRpdGxlKSk7Ci0gICAgICAgICAgICBwdy5wcmludGxuKCIgIG1MYXRlc3RJdGVtczogIiArIHZpZXdJbmZvKG1MYXRlc3RJdGVtcykpOwotICAgICAgICAgICAgcHcucHJpbnRsbigiICBtTm9Ob3RpZmljYXRpb25zVGl0bGU6ICIgKyB2aWV3SW5mbyhtTm9Ob3RpZmljYXRpb25zVGl0bGUpKTsKLSAgICAgICAgICAgIHB3LnByaW50bG4oIiAgbUNsb3NlVmlldzogIiArIHZpZXdJbmZvKG1DbG9zZVZpZXcpKTsKLSAgICAgICAgICAgIHB3LnByaW50bG4oIiAgbVRpY2tlclZpZXc6ICIgKyB2aWV3SW5mbyhtVGlja2VyVmlldykpOwotICAgICAgICAgICAgcHcucHJpbnRsbigiICBtU2Nyb2xsVmlldzogIiArIHZpZXdJbmZvKG1TY3JvbGxWaWV3KQotICAgICAgICAgICAgICAgICAgICArICIgc2Nyb2xsICIgKyBtU2Nyb2xsVmlldy5nZXRTY3JvbGxYKCkgKyAiLCIgKyBtU2Nyb2xsVmlldy5nZXRTY3JvbGxZKCkpOwotICAgICAgICAgICAgcHcucHJpbnRsbigibU5vdGlmaWNhdGlvbkxpbmVhckxheW91dDogIiArIHZpZXdJbmZvKG1Ob3RpZmljYXRpb25MaW5lYXJMYXlvdXQpKTsKLSAgICAgICAgfQotICAgICAgICAvKgotICAgICAgICBzeW5jaHJvbml6ZWQgKG1Ob3RpZmljYXRpb25EYXRhKSB7Ci0gICAgICAgICAgICBpbnQgTiA9IG1Ob3RpZmljYXRpb25EYXRhLm9uZ29pbmdDb3VudCgpOwotICAgICAgICAgICAgcHcucHJpbnRsbigiICBvbmdvaW5nQ291bnQuc2l6ZT0iICsgTik7Ci0gICAgICAgICAgICBmb3IgKGludCBpPTA7IGk8TjsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgU3RhdHVzQmFyTm90aWZpY2F0aW9uIG4gPSBtTm90aWZpY2F0aW9uRGF0YS5nZXRPbmdvaW5nKGkpOwotICAgICAgICAgICAgICAgIHB3LnByaW50bG4oIiAgICBbIiArIGkgKyAiXSBrZXk9IiArIG4ua2V5ICsgIiB2aWV3PSIgKyBuLnZpZXcpOwotICAgICAgICAgICAgICAgIHB3LnByaW50bG4oIiAgICAgICAgICAgZGF0YT0iICsgbi5kYXRhKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIE4gPSBtTm90aWZpY2F0aW9uRGF0YS5sYXRlc3RDb3VudCgpOwotICAgICAgICAgICAgcHcucHJpbnRsbigiICBvbmdvaW5nQ291bnQuc2l6ZT0iICsgTik7Ci0gICAgICAgICAgICBmb3IgKGludCBpPTA7IGk8TjsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgU3RhdHVzQmFyTm90aWZpY2F0aW9uIG4gPSBtTm90aWZpY2F0aW9uRGF0YS5nZXRMYXRlc3QoaSk7Ci0gICAgICAgICAgICAgICAgcHcucHJpbnRsbigiICAgIFsiICsgaSArICJdIGtleT0iICsgbi5rZXkgKyAiIHZpZXc9IiArIG4udmlldyk7Ci0gICAgICAgICAgICAgICAgcHcucHJpbnRsbigiICAgICAgICAgICBkYXRhPSIgKyBuLmRhdGEpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgICovCi0KLSAgICAgICAgaWYgKGZhbHNlKSB7Ci0gICAgICAgICAgICBwdy5wcmludGxuKCJzZWUgdGhlIGxvZ2NhdCBmb3IgYSBkdW1wIG9mIHRoZSB2aWV3cyB3ZSBoYXZlIGNyZWF0ZWQuIik7Ci0gICAgICAgICAgICAvLyBtdXN0IGhhcHBlbiBvbiB1aSB0aHJlYWQKLSAgICAgICAgICAgIG1IYW5kbGVyLnBvc3QobmV3IFJ1bm5hYmxlKCkgewotICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtU3RhdHVzQmFyVmlldy5nZXRMb2NhdGlvbk9uU2NyZWVuKG1BYnNQb3MpOwotICAgICAgICAgICAgICAgICAgICAgICAgU2xvZy5kKFRBRywgIm1TdGF0dXNCYXJWaWV3OiAtLS0tLSAoIiArIG1BYnNQb3NbMF0gKyAiLCIgKyBtQWJzUG9zWzFdCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIikgIiArIG1TdGF0dXNCYXJWaWV3LmdldFdpZHRoKCkgKyAieCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBtU3RhdHVzQmFyVmlldy5nZXRIZWlnaHQoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtU3RhdHVzQmFyVmlldy5kZWJ1ZygpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBtRXhwYW5kZWRWaWV3LmdldExvY2F0aW9uT25TY3JlZW4obUFic1Bvcyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBTbG9nLmQoVEFHLCAibUV4cGFuZGVkVmlldzogLS0tLS0gKCIgKyBtQWJzUG9zWzBdICsgIiwiICsgbUFic1Bvc1sxXQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIpICIgKyBtRXhwYW5kZWRWaWV3LmdldFdpZHRoKCkgKyAieCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBtRXhwYW5kZWRWaWV3LmdldEhlaWdodCgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1FeHBhbmRlZFZpZXcuZGVidWcoKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgbVRyYWNraW5nVmlldy5nZXRMb2NhdGlvbk9uU2NyZWVuKG1BYnNQb3MpOwotICAgICAgICAgICAgICAgICAgICAgICAgU2xvZy5kKFRBRywgIm1UcmFja2luZ1ZpZXc6IC0tLS0tICgiICsgbUFic1Bvc1swXSArICIsIiArIG1BYnNQb3NbMV0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiKSAiICsgbVRyYWNraW5nVmlldy5nZXRXaWR0aCgpICsgIngiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgbVRyYWNraW5nVmlldy5nZXRIZWlnaHQoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtVHJhY2tpbmdWaWV3LmRlYnVnKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHZvaWQgb25CYXJWaWV3QXR0YWNoZWQoKSB7Ci0gICAgICAgIFdpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zIGxwOwotICAgICAgICBpbnQgcGl4ZWxGb3JtYXQ7Ci0gICAgICAgIERyYXdhYmxlIGJnOwotCi0gICAgICAgIC8vLyAtLS0tLS0tLS0tIFRyYWNraW5nIFZpZXcgLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgcGl4ZWxGb3JtYXQgPSBQaXhlbEZvcm1hdC5SR0JYXzg4ODg7Ci0gICAgICAgIGJnID0gbVRyYWNraW5nVmlldy5nZXRCYWNrZ3JvdW5kKCk7Ci0gICAgICAgIGlmIChiZyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBwaXhlbEZvcm1hdCA9IGJnLmdldE9wYWNpdHkoKTsKLSAgICAgICAgfQotCi0gICAgICAgIGxwID0gbmV3IFdpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zKAotICAgICAgICAgICAgICAgIFZpZXdHcm91cC5MYXlvdXRQYXJhbXMuTUFUQ0hfUEFSRU5ULAotICAgICAgICAgICAgICAgIFZpZXdHcm91cC5MYXlvdXRQYXJhbXMuTUFUQ0hfUEFSRU5ULAotICAgICAgICAgICAgICAgIFdpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zLlRZUEVfU1RBVFVTX0JBUl9QQU5FTCwKLSAgICAgICAgICAgICAgICBXaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcy5GTEFHX0xBWU9VVF9JTl9TQ1JFRU4KLSAgICAgICAgICAgICAgICB8IFdpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zLkZMQUdfTEFZT1VUX05PX0xJTUlUUwotICAgICAgICAgICAgICAgIHwgV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMuRkxBR19BTFRfRk9DVVNBQkxFX0lNLAotICAgICAgICAgICAgICAgIHBpeGVsRm9ybWF0KTsKLS8vICAgICAgICBscC50b2tlbiA9IG1TdGF0dXNCYXJWaWV3LmdldFdpbmRvd1Rva2VuKCk7Ci0gICAgICAgIGxwLmdyYXZpdHkgPSBHcmF2aXR5LlRPUCB8IEdyYXZpdHkuRklMTF9IT1JJWk9OVEFMOwotICAgICAgICBscC5zZXRUaXRsZSgiVHJhY2tpbmdWaWV3Iik7Ci0gICAgICAgIGxwLnkgPSBtVHJhY2tpbmdQb3NpdGlvbjsKLSAgICAgICAgbVRyYWNraW5nUGFyYW1zID0gbHA7Ci0KLSAgICAgICAgV2luZG93TWFuYWdlckltcGwuZ2V0RGVmYXVsdCgpLmFkZFZpZXcobVRyYWNraW5nVmlldywgbHApOwotICAgIH0KLQotICAgIHZvaWQgb25UcmFja2luZ1ZpZXdBdHRhY2hlZCgpIHsKLSAgICAgICAgV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMgbHA7Ci0gICAgICAgIGludCBwaXhlbEZvcm1hdDsKLSAgICAgICAgRHJhd2FibGUgYmc7Ci0KLSAgICAgICAgLy8vIC0tLS0tLS0tLS0gRXhwYW5kZWQgVmlldyAtLS0tLS0tLS0tLS0tLQotICAgICAgICBwaXhlbEZvcm1hdCA9IFBpeGVsRm9ybWF0LlRSQU5TTFVDRU5UOwotCi0gICAgICAgIGZpbmFsIGludCBkaXNwaCA9IG1EaXNwbGF5LmdldEhlaWdodCgpOwotICAgICAgICBscCA9IG1FeHBhbmRlZERpYWxvZy5nZXRXaW5kb3coKS5nZXRBdHRyaWJ1dGVzKCk7Ci0gICAgICAgIGxwLndpZHRoID0gVmlld0dyb3VwLkxheW91dFBhcmFtcy5NQVRDSF9QQVJFTlQ7Ci0gICAgICAgIGxwLmhlaWdodCA9IGdldEV4cGFuZGVkSGVpZ2h0KCk7Ci0gICAgICAgIGxwLnggPSAwOwotICAgICAgICBtVHJhY2tpbmdQb3NpdGlvbiA9IGxwLnkgPSAtZGlzcGg7IC8vIHN1ZmZpY2llbnRseSBsYXJnZSBuZWdhdGl2ZQotICAgICAgICBscC50eXBlID0gV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMuVFlQRV9TVEFUVVNfQkFSX1BBTkVMOwotICAgICAgICBscC5mbGFncyA9IFdpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zLkZMQUdfTEFZT1VUX0lOX1NDUkVFTgotICAgICAgICAgICAgICAgIHwgV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMuRkxBR19MQVlPVVRfTk9fTElNSVRTCi0gICAgICAgICAgICAgICAgfCBXaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcy5GTEFHX05PVF9UT1VDSF9NT0RBTAotICAgICAgICAgICAgICAgIHwgV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMuRkxBR19ESVRIRVIKLSAgICAgICAgICAgICAgICB8IFdpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zLkZMQUdfTk9UX0ZPQ1VTQUJMRTsKLSAgICAgICAgbHAuZm9ybWF0ID0gcGl4ZWxGb3JtYXQ7Ci0gICAgICAgIGxwLmdyYXZpdHkgPSBHcmF2aXR5LlRPUCB8IEdyYXZpdHkuRklMTF9IT1JJWk9OVEFMOwotICAgICAgICBscC5zZXRUaXRsZSgiU3RhdHVzQmFyRXhwYW5kZWQiKTsKLSAgICAgICAgbUV4cGFuZGVkRGlhbG9nLmdldFdpbmRvdygpLnNldEF0dHJpYnV0ZXMobHApOwotICAgICAgICBtRXhwYW5kZWREaWFsb2cuZ2V0V2luZG93KCkuc2V0Rm9ybWF0KHBpeGVsRm9ybWF0KTsKLSAgICAgICAgbUV4cGFuZGVkUGFyYW1zID0gbHA7Ci0KLSAgICAgICAgbUV4cGFuZGVkRGlhbG9nLmdldFdpbmRvdygpLnJlcXVlc3RGZWF0dXJlKFdpbmRvdy5GRUFUVVJFX05PX1RJVExFKTsKLSAgICAgICAgbUV4cGFuZGVkRGlhbG9nLnNldENvbnRlbnRWaWV3KG1FeHBhbmRlZFZpZXcsCi0gICAgICAgICAgICAgICAgbmV3IFZpZXdHcm91cC5MYXlvdXRQYXJhbXMoVmlld0dyb3VwLkxheW91dFBhcmFtcy5NQVRDSF9QQVJFTlQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmlld0dyb3VwLkxheW91dFBhcmFtcy5NQVRDSF9QQVJFTlQpKTsKLSAgICAgICAgbUV4cGFuZGVkRGlhbG9nLmdldFdpbmRvdygpLnNldEJhY2tncm91bmREcmF3YWJsZShudWxsKTsKLSAgICAgICAgbUV4cGFuZGVkRGlhbG9nLnNob3coKTsKLSAgICAgICAgRnJhbWVMYXlvdXQgaGFjayA9IChGcmFtZUxheW91dCltRXhwYW5kZWRWaWV3LmdldFBhcmVudCgpOwotICAgIH0KLQotICAgIHZvaWQgc2V0RGF0ZVZpZXdWaXNpYmlsaXR5KGJvb2xlYW4gdmlzaWJsZSwgaW50IGFuaW0pIHsKLSAgICAgICAgbURhdGVWaWV3LnNldFVwZGF0ZXModmlzaWJsZSk7Ci0gICAgICAgIG1EYXRlVmlldy5zZXRWaXNpYmlsaXR5KHZpc2libGUgPyBWaWV3LlZJU0lCTEUgOiBWaWV3LklOVklTSUJMRSk7Ci0gICAgICAgIG1EYXRlVmlldy5zdGFydEFuaW1hdGlvbihsb2FkQW5pbShhbmltLCBudWxsKSk7Ci0gICAgfQotCi0gICAgdm9pZCBzZXROb3RpZmljYXRpb25JY29uVmlzaWJpbGl0eShib29sZWFuIHZpc2libGUsIGludCBhbmltKSB7Ci0gICAgICAgIGludCBvbGQgPSBtTm90aWZpY2F0aW9uSWNvbnMuZ2V0VmlzaWJpbGl0eSgpOwotICAgICAgICBpbnQgdiA9IHZpc2libGUgPyBWaWV3LlZJU0lCTEUgOiBWaWV3LklOVklTSUJMRTsKLSAgICAgICAgaWYgKG9sZCAhPSB2KSB7Ci0gICAgICAgICAgICBtTm90aWZpY2F0aW9uSWNvbnMuc2V0VmlzaWJpbGl0eSh2KTsKLSAgICAgICAgICAgIG1Ob3RpZmljYXRpb25JY29ucy5zdGFydEFuaW1hdGlvbihsb2FkQW5pbShhbmltLCBudWxsKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICB2b2lkIHVwZGF0ZUV4cGFuZGVkVmlld1BvcyhpbnQgZXhwYW5kZWRQb3NpdGlvbikgewotICAgICAgICBpZiAoU1BFVykgewotICAgICAgICAgICAgU2xvZy5kKFRBRywgInVwZGF0ZUV4cGFuZGVkVmlld1BvcyBiZWZvcmUgZXhwYW5kZWRQb3NpdGlvbj0iICsgZXhwYW5kZWRQb3NpdGlvbgotICAgICAgICAgICAgICAgICAgICArICIgbVRyYWNraW5nUGFyYW1zLnk9IiAKLSAgICAgICAgICAgICAgICAgICAgKyAoKG1UcmFja2luZ1BhcmFtcyA9PSBudWxsKSA/ICI/Pz8iIDogbVRyYWNraW5nUGFyYW1zLnkpCi0gICAgICAgICAgICAgICAgICAgICsgIiBtVHJhY2tpbmdQb3NpdGlvbj0iICsgbVRyYWNraW5nUG9zaXRpb24pOwotICAgICAgICB9Ci0KLSAgICAgICAgaW50IGggPSBtU3RhdHVzQmFyVmlldy5nZXRIZWlnaHQoKTsKLSAgICAgICAgaW50IGRpc3BoID0gbURpc3BsYXkuZ2V0SGVpZ2h0KCk7Ci0KLSAgICAgICAgLy8gSWYgdGhlIGV4cGFuZGVkIHZpZXcgaXMgbm90IHZpc2libGUsIG1ha2Ugc3VyZSB0aGV5J3JlIHN0aWxsIG9mZiBzY3JlZW4uCi0gICAgICAgIC8vIE1heWJlIHRoZSB2aWV3IHdhcyByZXNpemVkLgotICAgICAgICBpZiAoIW1FeHBhbmRlZFZpc2libGUpIHsKLSAgICAgICAgICAgIGlmIChtVHJhY2tpbmdWaWV3ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtVHJhY2tpbmdQb3NpdGlvbiA9IC1kaXNwaDsKLSAgICAgICAgICAgICAgICBpZiAobVRyYWNraW5nUGFyYW1zICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgbVRyYWNraW5nUGFyYW1zLnkgPSBtVHJhY2tpbmdQb3NpdGlvbjsKLSAgICAgICAgICAgICAgICAgICAgV2luZG93TWFuYWdlckltcGwuZ2V0RGVmYXVsdCgpLnVwZGF0ZVZpZXdMYXlvdXQobVRyYWNraW5nVmlldywgbVRyYWNraW5nUGFyYW1zKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAobUV4cGFuZGVkUGFyYW1zICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtRXhwYW5kZWRQYXJhbXMueSA9IC1kaXNwaDsKLSAgICAgICAgICAgICAgICBtRXhwYW5kZWREaWFsb2cuZ2V0V2luZG93KCkuc2V0QXR0cmlidXRlcyhtRXhwYW5kZWRQYXJhbXMpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gdHJhY2tpbmcgdmlldy4uLgotICAgICAgICBpbnQgcG9zOwotICAgICAgICBpZiAoZXhwYW5kZWRQb3NpdGlvbiA9PSBFWFBBTkRFRF9GVUxMX09QRU4pIHsKLSAgICAgICAgICAgIHBvcyA9IGg7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoZXhwYW5kZWRQb3NpdGlvbiA9PSBFWFBBTkRFRF9MRUFWRV9BTE9ORSkgewotICAgICAgICAgICAgcG9zID0gbVRyYWNraW5nUG9zaXRpb247Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICBpZiAoZXhwYW5kZWRQb3NpdGlvbiA8PSBkaXNwaCkgewotICAgICAgICAgICAgICAgIHBvcyA9IGV4cGFuZGVkUG9zaXRpb247Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHBvcyA9IGRpc3BoOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcG9zIC09IGRpc3BoLWg7Ci0gICAgICAgIH0KLSAgICAgICAgbVRyYWNraW5nUG9zaXRpb24gPSBtVHJhY2tpbmdQYXJhbXMueSA9IHBvczsKLSAgICAgICAgbVRyYWNraW5nUGFyYW1zLmhlaWdodCA9IGRpc3BoLWg7Ci0gICAgICAgIFdpbmRvd01hbmFnZXJJbXBsLmdldERlZmF1bHQoKS51cGRhdGVWaWV3TGF5b3V0KG1UcmFja2luZ1ZpZXcsIG1UcmFja2luZ1BhcmFtcyk7Ci0KLSAgICAgICAgaWYgKG1FeHBhbmRlZFBhcmFtcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtQ2xvc2VWaWV3LmdldExvY2F0aW9uSW5XaW5kb3cobVBvc2l0aW9uVG1wKTsKLSAgICAgICAgICAgIGZpbmFsIGludCBjbG9zZVBvcyA9IG1Qb3NpdGlvblRtcFsxXTsKLQotICAgICAgICAgICAgbUV4cGFuZGVkQ29udGVudHMuZ2V0TG9jYXRpb25JbldpbmRvdyhtUG9zaXRpb25UbXApOwotICAgICAgICAgICAgZmluYWwgaW50IGNvbnRlbnRzQm90dG9tID0gbVBvc2l0aW9uVG1wWzFdICsgbUV4cGFuZGVkQ29udGVudHMuZ2V0SGVpZ2h0KCk7Ci0KLSAgICAgICAgICAgIG1FeHBhbmRlZFBhcmFtcy55ID0gcG9zICsgbVRyYWNraW5nVmlldy5nZXRIZWlnaHQoKQotICAgICAgICAgICAgICAgICAgICAtIChtVHJhY2tpbmdQYXJhbXMuaGVpZ2h0LWNsb3NlUG9zKSAtIGNvbnRlbnRzQm90dG9tOwotICAgICAgICAgICAgaW50IG1heCA9IGg7Ci0gICAgICAgICAgICBpZiAobUV4cGFuZGVkUGFyYW1zLnkgPiBtYXgpIHsKLSAgICAgICAgICAgICAgICBtRXhwYW5kZWRQYXJhbXMueSA9IG1heDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGludCBtaW4gPSBtVHJhY2tpbmdQb3NpdGlvbjsKLSAgICAgICAgICAgIGlmIChtRXhwYW5kZWRQYXJhbXMueSA8IG1pbikgewotICAgICAgICAgICAgICAgIG1FeHBhbmRlZFBhcmFtcy55ID0gbWluOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBib29sZWFuIHZpc2libGUgPSAobVRyYWNraW5nUG9zaXRpb24gKyBtVHJhY2tpbmdWaWV3LmdldEhlaWdodCgpKSA+IGg7Ci0gICAgICAgICAgICBpZiAoIXZpc2libGUpIHsKLSAgICAgICAgICAgICAgICAvLyBpZiB0aGUgY29udGVudHMgYXJlbid0IHZpc2libGUsIG1vdmUgdGhlIGV4cGFuZGVkIHZpZXcgd2F5IG9mZiBzY3JlZW4KLSAgICAgICAgICAgICAgICAvLyBiZWNhdXNlIHRoZSB3aW5kb3cgaXRzZWxmIGV4dGVuZHMgYmVsb3cgdGhlIGNvbnRlbnQgdmlldy4KLSAgICAgICAgICAgICAgICBtRXhwYW5kZWRQYXJhbXMueSA9IC1kaXNwaDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1FeHBhbmRlZERpYWxvZy5nZXRXaW5kb3coKS5zZXRBdHRyaWJ1dGVzKG1FeHBhbmRlZFBhcmFtcyk7Ci0KLSAgICAgICAgICAgIC8vIEFzIGxvbmcgYXMgdGhpcyBpc24ndCBqdXN0IGEgcmVwb3NpdGlvbmluZyB0aGF0J3Mgbm90IHN1cHBvc2VkIHRvIGFmZmVjdAotICAgICAgICAgICAgLy8gdGhlIHVzZXIncyBwZXJjZXB0aW9uIG9mIHdoYXQncyBzaG93aW5nLCBjYWxsIHRvIHNheSB0aGF0IHRoZSB2aXNpYmlsaXR5Ci0gICAgICAgICAgICAvLyBoYXMgY2hhbmdlZC4gKE90aGVyd2lzZSwgc29tZW9uZSBlbHNlIHdpbGwgY2FsbCB0byBkbyB0aGF0KS4KLSAgICAgICAgICAgIGlmIChleHBhbmRlZFBvc2l0aW9uICE9IEVYUEFOREVEX0xFQVZFX0FMT05FKSB7Ci0gICAgICAgICAgICAgICAgaWYgKFNQRVcpIFNsb2cuZChUQUcsICJ1cGRhdGVFeHBhbmRlZFZpZXdQb3MgdmlzaWJpbGl0eUNoYW5nZWQoIiArIHZpc2libGUgKyAiKSIpOwotICAgICAgICAgICAgICAgIHZpc2liaWxpdHlDaGFuZ2VkKHZpc2libGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKFNQRVcpIHsKLSAgICAgICAgICAgIFNsb2cuZChUQUcsICJ1cGRhdGVFeHBhbmRlZFZpZXdQb3MgYWZ0ZXIgIGV4cGFuZGVkUG9zaXRpb249IiArIGV4cGFuZGVkUG9zaXRpb24KLSAgICAgICAgICAgICAgICAgICAgKyAiIG1UcmFja2luZ1BhcmFtcy55PSIgKyBtVHJhY2tpbmdQYXJhbXMueQotICAgICAgICAgICAgICAgICAgICArICIgbVRyYWNraW5nUG9zaXRpb249IiArIG1UcmFja2luZ1Bvc2l0aW9uCi0gICAgICAgICAgICAgICAgICAgICsgIiBtRXhwYW5kZWRQYXJhbXMueT0iICsgbUV4cGFuZGVkUGFyYW1zLnkKLSAgICAgICAgICAgICAgICAgICAgKyAiIG1FeHBhbmRlZFBhcmFtcy5oZWlnaHQ9IiArIG1FeHBhbmRlZFBhcmFtcy5oZWlnaHQpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgaW50IGdldEV4cGFuZGVkSGVpZ2h0KCkgewotICAgICAgICByZXR1cm4gbURpc3BsYXkuZ2V0SGVpZ2h0KCkgLSBtU3RhdHVzQmFyVmlldy5nZXRIZWlnaHQoKSAtIG1DbG9zZVZpZXcuZ2V0SGVpZ2h0KCk7Ci0gICAgfQotCi0gICAgdm9pZCB1cGRhdGVFeHBhbmRlZEhlaWdodCgpIHsKLSAgICAgICAgaWYgKG1FeHBhbmRlZFZpZXcgIT0gbnVsbCkgewotICAgICAgICAgICAgbUV4cGFuZGVkUGFyYW1zLmhlaWdodCA9IGdldEV4cGFuZGVkSGVpZ2h0KCk7Ci0gICAgICAgICAgICBtRXhwYW5kZWREaWFsb2cuZ2V0V2luZG93KCkuc2V0QXR0cmlidXRlcyhtRXhwYW5kZWRQYXJhbXMpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhlIExFRHMgYXJlIHR1cm5lZCBvKWZmIHdoZW4gdGhlIG5vdGlmaWNhdGlvbiBwYW5lbCBpcyBzaG93biwgZXZlbiBqdXN0IGEgbGl0dGxlIGJpdC4KLSAgICAgKiBUaGlzIHdhcyBhZGRlZCBsYXN0LW1pbnV0ZSBhbmQgaXMgaW5jb25zaXN0ZW50IHdpdGggdGhlIHdheSB0aGUgcmVzdCBvZiB0aGUgbm90aWZpY2F0aW9ucwotICAgICAqIGFyZSBoYW5kbGVkLCBiZWNhdXNlIHRoZSBub3RpZmljYXRpb24gaXNuJ3QgcmVhbGx5IGNhbmNlbGxlZC4gIFRoZSBsaWdodHMgYXJlIGp1c3QKLSAgICAgKiB0dXJuZWQgb2ZmLiAgSWYgYW55IG90aGVyIG5vdGlmaWNhdGlvbnMgaGFwcGVuLCB0aGUgbGlnaHRzIHdpbGwgdHVybiBiYWNrIG9uLiAgU3RldmUgc2F5cwotICAgICAqIHRoaXMgaXMgd2hhdCBoZSB3YW50cy4gKHNlZSBidWcgMTEzMTQ2MSkKLSAgICAgKi8KLSAgICB2b2lkIHZpc2liaWxpdHlDaGFuZ2VkKGJvb2xlYW4gdmlzaWJsZSkgewotICAgICAgICBpZiAobVBhbmVsU2xpZ2h0bHlWaXNpYmxlICE9IHZpc2libGUpIHsKLSAgICAgICAgICAgIG1QYW5lbFNsaWdodGx5VmlzaWJsZSA9IHZpc2libGU7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIG1CYXJTZXJ2aWNlLm9uUGFuZWxSZXZlYWxlZCgpOwotICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICAgICAgLy8gV29uJ3QgZmFpbCB1bmxlc3MgdGhlIHdvcmxkIGhhcyBlbmRlZC4KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHZvaWQgcGVyZm9ybURpc2FibGVBY3Rpb25zKGludCBuZXQpIHsKLSAgICAgICAgaW50IG9sZCA9IG1EaXNhYmxlZDsKLSAgICAgICAgaW50IGRpZmYgPSBuZXQgXiBvbGQ7Ci0gICAgICAgIG1EaXNhYmxlZCA9IG5ldDsKLQotICAgICAgICAvLyBhY3QgYWNjb3JkaW5nbHkKLSAgICAgICAgaWYgKChkaWZmICYgU3RhdHVzQmFyTWFuYWdlci5ESVNBQkxFX0VYUEFORCkgIT0gMCkgewotICAgICAgICAgICAgaWYgKChuZXQgJiBTdGF0dXNCYXJNYW5hZ2VyLkRJU0FCTEVfRVhQQU5EKSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgU2xvZy5kKFRBRywgIkRJU0FCTEVfRVhQQU5EOiB5ZXMiKTsKLSAgICAgICAgICAgICAgICBhbmltYXRlQ29sbGFwc2UoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAoKGRpZmYgJiBTdGF0dXNCYXJNYW5hZ2VyLkRJU0FCTEVfTk9USUZJQ0FUSU9OX0lDT05TKSAhPSAwKSB7Ci0gICAgICAgICAgICBpZiAoKG5ldCAmIFN0YXR1c0Jhck1hbmFnZXIuRElTQUJMRV9OT1RJRklDQVRJT05fSUNPTlMpICE9IDApIHsKLSAgICAgICAgICAgICAgICBTbG9nLmQoVEFHLCAiRElTQUJMRV9OT1RJRklDQVRJT05fSUNPTlM6IHllcyIpOwotICAgICAgICAgICAgICAgIGlmIChtVGlja2luZykgewotICAgICAgICAgICAgICAgICAgICBtTm90aWZpY2F0aW9uSWNvbnMuc2V0VmlzaWJpbGl0eShWaWV3LklOVklTSUJMRSk7Ci0gICAgICAgICAgICAgICAgICAgIG1UaWNrZXIuaGFsdCgpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHNldE5vdGlmaWNhdGlvbkljb25WaXNpYmlsaXR5KGZhbHNlLCBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmFuaW0uZmFkZV9vdXQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgU2xvZy5kKFRBRywgIkRJU0FCTEVfTk9USUZJQ0FUSU9OX0lDT05TOiBubyIpOwotICAgICAgICAgICAgICAgIGlmICghbUV4cGFuZGVkVmlzaWJsZSkgewotICAgICAgICAgICAgICAgICAgICBzZXROb3RpZmljYXRpb25JY29uVmlzaWJpbGl0eSh0cnVlLCBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmFuaW0uZmFkZV9pbik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKChkaWZmICYgU3RhdHVzQmFyTWFuYWdlci5ESVNBQkxFX05PVElGSUNBVElPTl9USUNLRVIpICE9IDApIHsKLSAgICAgICAgICAgIFNsb2cuZChUQUcsICJESVNBQkxFX05PVElGSUNBVElPTl9USUNLRVI6ICIKLSAgICAgICAgICAgICAgICArICgoKG5ldCAmIFN0YXR1c0Jhck1hbmFnZXIuRElTQUJMRV9OT1RJRklDQVRJT05fVElDS0VSKSAhPSAwKQotICAgICAgICAgICAgICAgICAgICA/ICJ5ZXMiIDogIm5vIikpOwotICAgICAgICAgICAgaWYgKG1UaWNraW5nICYmIChuZXQgJiBTdGF0dXNCYXJNYW5hZ2VyLkRJU0FCTEVfTk9USUZJQ0FUSU9OX1RJQ0tFUikgIT0gMCkgewotICAgICAgICAgICAgICAgIG1UaWNrZXIuaGFsdCgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBWaWV3Lk9uQ2xpY2tMaXN0ZW5lciBtQ2xlYXJCdXR0b25MaXN0ZW5lciA9IG5ldyBWaWV3Lk9uQ2xpY2tMaXN0ZW5lcigpIHsKLSAgICAgICAgcHVibGljIHZvaWQgb25DbGljayhWaWV3IHYpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgbUJhclNlcnZpY2Uub25DbGVhckFsbE5vdGlmaWNhdGlvbnMoKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgICAgIC8vIHN5c3RlbSBwcm9jZXNzIGlzIGRlYWQgaWYgd2UncmUgaGVyZS4KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGFuaW1hdGVDb2xsYXBzZSgpOwotICAgICAgICB9Ci0gICAgfTsKLQotICAgIHByaXZhdGUgQnJvYWRjYXN0UmVjZWl2ZXIgbUJyb2FkY2FzdFJlY2VpdmVyID0gbmV3IEJyb2FkY2FzdFJlY2VpdmVyKCkgewotICAgICAgICBwdWJsaWMgdm9pZCBvblJlY2VpdmUoQ29udGV4dCBjb250ZXh0LCBJbnRlbnQgaW50ZW50KSB7Ci0gICAgICAgICAgICBTdHJpbmcgYWN0aW9uID0gaW50ZW50LmdldEFjdGlvbigpOwotICAgICAgICAgICAgaWYgKEludGVudC5BQ1RJT05fQ0xPU0VfU1lTVEVNX0RJQUxPR1MuZXF1YWxzKGFjdGlvbikKLSAgICAgICAgICAgICAgICAgICAgfHwgSW50ZW50LkFDVElPTl9TQ1JFRU5fT0ZGLmVxdWFscyhhY3Rpb24pKSB7Ci0gICAgICAgICAgICAgICAgYW5pbWF0ZUNvbGxhcHNlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmIChJbnRlbnQuQUNUSU9OX0NPTkZJR1VSQVRJT05fQ0hBTkdFRC5lcXVhbHMoYWN0aW9uKSkgewotICAgICAgICAgICAgICAgIHVwZGF0ZVJlc291cmNlcygpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfTsKLQotICAgIC8qKgotICAgICAqIFJlbG9hZCBzb21lIG9mIG91ciByZXNvdXJjZXMgd2hlbiB0aGUgY29uZmlndXJhdGlvbiBjaGFuZ2VzLgotICAgICAqCi0gICAgICogV2UgZG9uJ3QgcmVsb2FkIGV2ZXJ5dGhpbmcgd2hlbiB0aGUgY29uZmlndXJhdGlvbiBjaGFuZ2VzIC0tIHdlIHByb2JhYmx5Ci0gICAgICogc2hvdWxkLCBidXQgZ2V0dGluZyB0aGF0IHNtb290aCBpcyB0b3VnaC4gIFNvbWVkYXkgd2UnbGwgZml4IHRoYXQuICBJbiB0aGUKLSAgICAgKiBtZWFudGltZSwganVzdCB1cGRhdGUgdGhlIHRoaW5ncyB0aGF0IHdlIGtub3cgY2hhbmdlLgotICAgICAqLwotICAgIHZvaWQgdXBkYXRlUmVzb3VyY2VzKCkgewotICAgICAgICBSZXNvdXJjZXMgcmVzID0gZ2V0UmVzb3VyY2VzKCk7Ci0KLSAgICAgICAgbUNsZWFyQnV0dG9uLnNldFRleHQoZ2V0VGV4dChSLnN0cmluZy5zdGF0dXNfYmFyX2NsZWFyX2FsbF9idXR0b24pKTsKLSAgICAgICAgbU9uZ29pbmdUaXRsZS5zZXRUZXh0KGdldFRleHQoUi5zdHJpbmcuc3RhdHVzX2Jhcl9vbmdvaW5nX2V2ZW50c190aXRsZSkpOwotICAgICAgICBtTGF0ZXN0VGl0bGUuc2V0VGV4dChnZXRUZXh0KFIuc3RyaW5nLnN0YXR1c19iYXJfbGF0ZXN0X2V2ZW50c190aXRsZSkpOwotICAgICAgICBtTm9Ob3RpZmljYXRpb25zVGl0bGUuc2V0VGV4dChnZXRUZXh0KFIuc3RyaW5nLnN0YXR1c19iYXJfbm9fbm90aWZpY2F0aW9uc190aXRsZSkpOwotCi0gICAgICAgIG1FZGdlQm9yZGVyID0gcmVzLmdldERpbWVuc2lvblBpeGVsU2l6ZShSLmRpbWVuLnN0YXR1c19iYXJfZWRnZV9pZ25vcmUpOwotCi0gICAgICAgIGlmIChmYWxzZSkgU2xvZy52KFRBRywgInVwZGF0ZVJlc291cmNlcyIpOwotICAgIH0KLQotICAgIC8vCi0gICAgLy8gdHJhY2luZwotICAgIC8vCi0KLSAgICB2b2lkIHBvc3RTdGFydFRyYWNpbmcoKSB7Ci0gICAgICAgIG1IYW5kbGVyLnBvc3REZWxheWVkKG1TdGFydFRyYWNpbmcsIDMwMDApOwotICAgIH0KLQotICAgIHZvaWQgdmlicmF0ZSgpIHsKLSAgICAgICAgYW5kcm9pZC5vcy5WaWJyYXRvciB2aWIgPSAoYW5kcm9pZC5vcy5WaWJyYXRvcilnZXRTeXN0ZW1TZXJ2aWNlKENvbnRleHQuVklCUkFUT1JfU0VSVklDRSk7Ci0gICAgICAgIHZpYi52aWJyYXRlKDI1MCk7Ci0gICAgfQotCi0gICAgUnVubmFibGUgbVN0YXJ0VHJhY2luZyA9IG5ldyBSdW5uYWJsZSgpIHsKLSAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgewotICAgICAgICAgICAgdmlicmF0ZSgpOwotICAgICAgICAgICAgU3lzdGVtQ2xvY2suc2xlZXAoMjUwKTsKLSAgICAgICAgICAgIFNsb2cuZChUQUcsICJzdGFydFRyYWNpbmciKTsKLSAgICAgICAgICAgIGFuZHJvaWQub3MuRGVidWcuc3RhcnRNZXRob2RUcmFjaW5nKCIvZGF0YS9zdGF0dXNiYXItdHJhY2VzL3RyYWNlIik7Ci0gICAgICAgICAgICBtSGFuZGxlci5wb3N0RGVsYXllZChtU3RvcFRyYWNpbmcsIDEwMDAwKTsKLSAgICAgICAgfQotICAgIH07Ci0KLSAgICBSdW5uYWJsZSBtU3RvcFRyYWNpbmcgPSBuZXcgUnVubmFibGUoKSB7Ci0gICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgICAgIGFuZHJvaWQub3MuRGVidWcuc3RvcE1ldGhvZFRyYWNpbmcoKTsKLSAgICAgICAgICAgIFNsb2cuZChUQUcsICJzdG9wVHJhY2luZyIpOwotICAgICAgICAgICAgdmlicmF0ZSgpOwotICAgICAgICB9Ci0gICAgfTsKIH0KIApkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL3N0YXR1c2Jhci9TdGF0dXNCYXJWaWV3LmphdmEgYi9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvc3RhdHVzYmFyL1N0YXR1c0JhclZpZXcuamF2YQppbmRleCAxZTE0MGI5Li4yMGZjNDFmIDEwMDY0NAotLS0gYS9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvc3RhdHVzYmFyL1N0YXR1c0JhclZpZXcuamF2YQorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvc3RhdHVzYmFyL1N0YXR1c0JhclZpZXcuamF2YQpAQCAtMTksNiArMTksNyBAQAogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuQ29uZmlndXJhdGlvbjsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkNhbnZhczsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlJlY3Q7CiBpbXBvcnQgYW5kcm9pZC5vcy5TeXN0ZW1DbG9jazsKIGltcG9ydCBhbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0OwogaW1wb3J0IGFuZHJvaWQudmlldy5Nb3Rpb25FdmVudDsKQEAgLTM0LDcgKzM1LDcgQEAKIAogICAgIHN0YXRpYyBmaW5hbCBpbnQgRElNX0FOSU1fVElNRSA9IDQwMDsKICAgICAKLSAgICBTdGF0dXNCYXJTZXJ2aWNlIG1TZXJ2aWNlOworICAgIFBob25lU3RhdHVzQmFyU2VydmljZSBtU2VydmljZTsKICAgICBib29sZWFuIG1UcmFja2luZzsKICAgICBpbnQgbVN0YXJ0WCwgbVN0YXJ0WTsKICAgICBWaWV3R3JvdXAgbU5vdGlmaWNhdGlvbkljb25zOwpAQCAtNDYsNiArNDcsOSBAQAogICAgIGludCBtU3RhcnRBbHBoYSA9IDAsIG1FbmRBbHBoYSA9IDA7CiAgICAgbG9uZyBtRW5kVGltZSA9IDA7CiAKKyAgICBSZWN0IG1CdXR0b25Cb3VuZHMgPSBuZXcgUmVjdCgpOworICAgIGJvb2xlYW4gbUNhcHR1cmluZ0V2ZW50cyA9IHRydWU7CisKICAgICBwdWJsaWMgU3RhdHVzQmFyVmlldyhDb250ZXh0IGNvbnRleHQsIEF0dHJpYnV0ZVNldCBhdHRycykgewogICAgICAgICBzdXBlcihjb250ZXh0LCBhdHRycyk7CiAgICAgfQpAQCAtOTQsNyArOTgsNyBAQAogICAgIEBPdmVycmlkZQogICAgIHByb3RlY3RlZCB2b2lkIG9uU2l6ZUNoYW5nZWQoaW50IHcsIGludCBoLCBpbnQgb2xkdywgaW50IG9sZGgpIHsKICAgICAgICAgc3VwZXIub25TaXplQ2hhbmdlZCh3LCBoLCBvbGR3LCBvbGRoKTsKLSAgICAgICAgbVNlcnZpY2UudXBkYXRlRXhwYW5kZWRWaWV3UG9zKFN0YXR1c0JhclNlcnZpY2UuRVhQQU5ERURfTEVBVkVfQUxPTkUpOworICAgICAgICBtU2VydmljZS51cGRhdGVFeHBhbmRlZFZpZXdQb3MoUGhvbmVTdGF0dXNCYXJTZXJ2aWNlLkVYUEFOREVEX0xFQVZFX0FMT05FKTsKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKQEAgLTE3Nyw2ICsxODEsOSBAQAogICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBib29sZWFuIG9uVG91Y2hFdmVudChNb3Rpb25FdmVudCBldmVudCkgeworICAgICAgICBpZiAoIW1DYXB0dXJpbmdFdmVudHMpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQogICAgICAgICBpZiAoZXZlbnQuZ2V0QWN0aW9uKCkgIT0gTW90aW9uRXZlbnQuQUNUSU9OX0RPV04pIHsKICAgICAgICAgICAgIG1TZXJ2aWNlLmludGVyY2VwdFRvdWNoRXZlbnQoZXZlbnQpOwogICAgICAgICB9CkBAIC0xODUsNiArMTkyLDEzIEBACiAKICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgYm9vbGVhbiBvbkludGVyY2VwdFRvdWNoRXZlbnQoTW90aW9uRXZlbnQgZXZlbnQpIHsKKyAgICAgICAgaWYgKGV2ZW50LmdldEFjdGlvbigpID09IE1vdGlvbkV2ZW50LkFDVElPTl9ET1dOKSB7CisgICAgICAgICAgICBpZiAobUJ1dHRvbkJvdW5kcy5jb250YWlucygoaW50KWV2ZW50LmdldFgoKSwgKGludClldmVudC5nZXRZKCkpKSB7CisgICAgICAgICAgICAgICAgbUNhcHR1cmluZ0V2ZW50cyA9IGZhbHNlOworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBtQ2FwdHVyaW5nRXZlbnRzID0gdHJ1ZTsKICAgICAgICAgcmV0dXJuIG1TZXJ2aWNlLmludGVyY2VwdFRvdWNoRXZlbnQoZXZlbnQpCiAgICAgICAgICAgICAgICAgPyB0cnVlIDogc3VwZXIub25JbnRlcmNlcHRUb3VjaEV2ZW50KGV2ZW50KTsKICAgICB9CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvc3RhdHVzYmFyL1RpY2tlci5qYXZhIGIvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL3N0YXR1c2Jhci9UaWNrZXIuamF2YQppbmRleCAzYTY5N2E2Li5lN2IwNTA5IDEwMDY0NAotLS0gYS9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvc3RhdHVzYmFyL1RpY2tlci5qYXZhCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9zdGF0dXNiYXIvVGlja2VyLmphdmEKQEAgLTE0MSw3ICsxNDEsNyBAQAogICAgICAgICB9CiAgICAgfTsKIAotICAgIFRpY2tlcihDb250ZXh0IGNvbnRleHQsIFN0YXR1c0JhclZpZXcgc2IpIHsKKyAgICBwdWJsaWMgVGlja2VyKENvbnRleHQgY29udGV4dCwgVmlldyBzYikgewogICAgICAgICBtQ29udGV4dCA9IGNvbnRleHQ7CiAgICAgICAgIG1UaWNrZXJWaWV3ID0gc2IuZmluZFZpZXdCeUlkKFIuaWQudGlja2VyKTsKIApAQCAtMTYzLDcgKzE2Myw3IEBACiAgICAgfQogCiAKLSAgICB2b2lkIGFkZEVudHJ5KFN0YXR1c0Jhck5vdGlmaWNhdGlvbiBuKSB7CisgICAgcHVibGljIHZvaWQgYWRkRW50cnkoU3RhdHVzQmFyTm90aWZpY2F0aW9uIG4pIHsKICAgICAgICAgaW50IGluaXRpYWxDb3VudCA9IG1TZWdtZW50cy5zaXplKCk7CiAKICAgICAgICAgLy8gSWYgd2hhdCdzIGJlaW5nIGRpc3BsYXllZCBoYXMgdGhlIHNhbWUgdGV4dCBhbmQgaWNvbiwganVzdCBkcm9wIGl0CkBAIC0yMTIsNyArMjEyLDcgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIHZvaWQgcmVtb3ZlRW50cnkoU3RhdHVzQmFyTm90aWZpY2F0aW9uIG4pIHsKKyAgICBwdWJsaWMgdm9pZCByZW1vdmVFbnRyeShTdGF0dXNCYXJOb3RpZmljYXRpb24gbikgewogICAgICAgICBmb3IgKGludCBpPW1TZWdtZW50cy5zaXplKCktMTsgaT49MDsgaS0tKSB7CiAgICAgICAgICAgICBTZWdtZW50IHNlZyA9IG1TZWdtZW50cy5nZXQoaSk7CiAgICAgICAgICAgICBpZiAobi5pZCA9PSBzZWcubm90aWZpY2F0aW9uLmlkICYmIG4ucGtnLmVxdWFscyhzZWcubm90aWZpY2F0aW9uLnBrZykpIHsKQEAgLTIyMSwxMyArMjIxLDEzIEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICB2b2lkIGhhbHQoKSB7CisgICAgcHVibGljIHZvaWQgaGFsdCgpIHsKICAgICAgICAgbUhhbmRsZXIucmVtb3ZlQ2FsbGJhY2tzKG1BZHZhbmNlVGlja2VyKTsKICAgICAgICAgbVNlZ21lbnRzLmNsZWFyKCk7CiAgICAgICAgIHRpY2tlckhhbHRpbmcoKTsKICAgICB9CiAKLSAgICB2b2lkIHJlZmxvd1RleHQoKSB7CisgICAgcHVibGljIHZvaWQgcmVmbG93VGV4dCgpIHsKICAgICAgICAgaWYgKG1TZWdtZW50cy5zaXplKCkgPiAwKSB7CiAgICAgICAgICAgICBTZWdtZW50IHNlZyA9IG1TZWdtZW50cy5nZXQoMCk7CiAgICAgICAgICAgICBDaGFyU2VxdWVuY2UgdGV4dCA9IHNlZy5nZXRUZXh0KCk7CkBAIC0yNjYsOCArMjY2LDggQEAKICAgICAgICAgbUhhbmRsZXIucG9zdERlbGF5ZWQobUFkdmFuY2VUaWNrZXIsIFRJQ0tFUl9TRUdNRU5UX0RFTEFZKTsKICAgICB9CiAKLSAgICBhYnN0cmFjdCB2b2lkIHRpY2tlclN0YXJ0aW5nKCk7Ci0gICAgYWJzdHJhY3Qgdm9pZCB0aWNrZXJEb25lKCk7Ci0gICAgYWJzdHJhY3Qgdm9pZCB0aWNrZXJIYWx0aW5nKCk7CisgICAgcHVibGljIGFic3RyYWN0IHZvaWQgdGlja2VyU3RhcnRpbmcoKTsKKyAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCB0aWNrZXJEb25lKCk7CisgICAgcHVibGljIGFic3RyYWN0IHZvaWQgdGlja2VySGFsdGluZygpOwogfQogCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvc3RhdHVzYmFyL1RpY2tlclZpZXcuamF2YSBiL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9zdGF0dXNiYXIvVGlja2VyVmlldy5qYXZhCmluZGV4IDk3NDlhZTQuLjgxNDA4MTEgMTAwNjQ0Ci0tLSBhL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9zdGF0dXNiYXIvVGlja2VyVmlldy5qYXZhCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9zdGF0dXNiYXIvVGlja2VyVmlldy5qYXZhCkBAIC0zNCw1ICszNCw5IEBACiAgICAgICAgIHN1cGVyLm9uU2l6ZUNoYW5nZWQodywgaCwgb2xkdywgb2xkaCk7CiAgICAgICAgIG1UaWNrZXIucmVmbG93VGV4dCgpOwogICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFRpY2tlcihUaWNrZXIgdCkgeworICAgICAgICBtVGlja2VyID0gdDsKKyAgICB9CiB9CiAKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9zdGF0dXNiYXIvVHJhY2tpbmdWaWV3LmphdmEgYi9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvc3RhdHVzYmFyL1RyYWNraW5nVmlldy5qYXZhCmluZGV4IDkxMDhlZWUuLmM1OWViNmEgMTAwNjQ0Ci0tLSBhL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9zdGF0dXNiYXIvVHJhY2tpbmdWaWV3LmphdmEKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL3N0YXR1c2Jhci9UcmFja2luZ1ZpZXcuamF2YQpAQCAtMjYsNyArMjYsNyBAQAogCiBwdWJsaWMgY2xhc3MgVHJhY2tpbmdWaWV3IGV4dGVuZHMgTGluZWFyTGF5b3V0IHsKICAgICBmaW5hbCBEaXNwbGF5IG1EaXNwbGF5OwotICAgIFN0YXR1c0JhclNlcnZpY2UgbVNlcnZpY2U7CisgICAgUGhvbmVTdGF0dXNCYXJTZXJ2aWNlIG1TZXJ2aWNlOwogICAgIGJvb2xlYW4gbVRyYWNraW5nOwogICAgIGludCBtU3RhcnRYLCBtU3RhcnRZOwogCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvc3RhdHVzYmFyL3RhYmxldC9Ob3RpZmljYXRpb25JY29uQXJlYS5qYXZhIGIvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL3N0YXR1c2Jhci90YWJsZXQvTm90aWZpY2F0aW9uSWNvbkFyZWEuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YzdkNzRjMwotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9zdGF0dXNiYXIvdGFibGV0L05vdGlmaWNhdGlvbkljb25BcmVhLmphdmEKQEAgLTAsMCArMSw1NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQuc3lzdGVtdWkuc3RhdHVzYmFyLnRhYmxldDsKKworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuUmVzb3VyY2VzOworaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlcjsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0OworaW1wb3J0IGFuZHJvaWQudXRpbC5TbG9nOworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkxpbmVhckxheW91dDsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5JbWFnZVZpZXc7CisKK2ltcG9ydCBjb20uYW5kcm9pZC5zeXN0ZW11aS5SOworCisKK3B1YmxpYyBjbGFzcyBOb3RpZmljYXRpb25JY29uQXJlYSBleHRlbmRzIExpbmVhckxheW91dCB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJOb3RpZmljYXRpb25JY29uQXJlYSI7CisKKyAgICBJY29uTGF5b3V0IG1JY29uTGF5b3V0OworICAgIERyYWdnZXJWaWV3IG1EcmFnZ2VyVmlldzsKKworICAgIHB1YmxpYyBOb3RpZmljYXRpb25JY29uQXJlYShDb250ZXh0IGNvbnRleHQsIEF0dHJpYnV0ZVNldCBhdHRycykgeworICAgICAgICBzdXBlcihjb250ZXh0LCBhdHRycyk7CisKKyAgICAgICAgbUljb25MYXlvdXQgPSAoSWNvbkxheW91dClmaW5kVmlld0J5SWQoUi5pZC5pY29ucyk7CisgICAgICAgIG1EcmFnZ2VyVmlldyA9IChEcmFnZ2VyVmlldykgZmluZFZpZXdCeUlkKFIuaWQuaGFuZGxlKTsKKyAgICB9CisKKyAgICBzdGF0aWMgY2xhc3MgSWNvbkxheW91dCBleHRlbmRzIExpbmVhckxheW91dCB7CisgICAgICAgIHB1YmxpYyBJY29uTGF5b3V0KENvbnRleHQgY29udGV4dCwgQXR0cmlidXRlU2V0IGF0dHJzKSB7CisgICAgICAgICAgICBzdXBlcihjb250ZXh0LCBhdHRycyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBzdGF0aWMgY2xhc3MgRHJhZ2dlclZpZXcgZXh0ZW5kcyBWaWV3IHsKKyAgICAgICAgcHVibGljIERyYWdnZXJWaWV3KENvbnRleHQgY29udGV4dCwgQXR0cmlidXRlU2V0IGF0dHJzKSB7CisgICAgICAgICAgICBzdXBlcihjb250ZXh0LCBhdHRycyk7CisgICAgICAgIH0KKyAgICB9Cit9CisKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9zdGF0dXNiYXIvdGFibGV0L1N5c3RlbVBhbmVsLmphdmEgYi9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvc3RhdHVzYmFyL3RhYmxldC9TeXN0ZW1QYW5lbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ5MWVmMWQKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvc3RhdHVzYmFyL3RhYmxldC9TeXN0ZW1QYW5lbC5qYXZhCkBAIC0wLDAgKzEsNzA0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5zeXN0ZW11aS5zdGF0dXNiYXIudGFibGV0OworCitpbXBvcnQgYW5kcm9pZC5hcHAuTm90aWZpY2F0aW9uOworaW1wb3J0IGFuZHJvaWQuYXBwLlBlbmRpbmdJbnRlbnQ7CitpbXBvcnQgYW5kcm9pZC5hcHAuU2VydmljZTsKK2ltcG9ydCBhbmRyb2lkLmFwcC5TdGF0dXNCYXJNYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQuYmx1ZXRvb3RoLkJsdWV0b290aEFkYXB0ZXI7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkJyb2FkY2FzdFJlY2VpdmVyOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZW50UmVzb2x2ZXI7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50RmlsdGVyOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuUmVzb3VyY2VzOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUGl4ZWxGb3JtYXQ7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5SZWN0OworaW1wb3J0IGFuZHJvaWQubG9jYXRpb24uTG9jYXRpb25NYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQubWVkaWEuQXVkaW9NYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQubmV0Lk5ldHdvcmtJbmZvOworaW1wb3J0IGFuZHJvaWQubmV0LndpZmkuU3VwcGxpY2FudFN0YXRlOworaW1wb3J0IGFuZHJvaWQubmV0LndpZmkuV2lmaUNvbmZpZ3VyYXRpb247CitpbXBvcnQgYW5kcm9pZC5uZXQud2lmaS5XaWZpSW5mbzsKK2ltcG9ydCBhbmRyb2lkLm5ldC53aWZpLldpZmlNYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQub3MuQXN5bmNUYXNrOworaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLklCaW5kZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5JUG93ZXJNYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQub3MuTWVzc2FnZTsKK2ltcG9ydCBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbjsKK2ltcG9ydCBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbjsKK2ltcG9ydCBhbmRyb2lkLm9zLlNlcnZpY2VNYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuU2V0dGluZ3M7CitpbXBvcnQgYW5kcm9pZC50ZWxlcGhvbnkuUGhvbmVTdGF0ZUxpc3RlbmVyOworaW1wb3J0IGFuZHJvaWQudGVsZXBob255LlNlcnZpY2VTdGF0ZTsKK2ltcG9ydCBhbmRyb2lkLnRlbGVwaG9ueS5TaWduYWxTdHJlbmd0aDsKK2ltcG9ydCBhbmRyb2lkLnRlbGVwaG9ueS5UZWxlcGhvbnlNYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQ7CitpbXBvcnQgYW5kcm9pZC51dGlsLlNsb2c7CitpbXBvcnQgYW5kcm9pZC52aWV3LkdyYXZpdHk7CitpbXBvcnQgYW5kcm9pZC52aWV3LkxheW91dEluZmxhdGVyOworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3R3JvdXA7CitpbXBvcnQgYW5kcm9pZC52aWV3LldpbmRvd01hbmFnZXI7CitpbXBvcnQgYW5kcm9pZC52aWV3LldpbmRvd01hbmFnZXJJbXBsOworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkJ1dHRvbjsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5JbWFnZUJ1dHRvbjsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5JbWFnZVZpZXc7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuTGluZWFyTGF5b3V0OworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlJlbW90ZVZpZXdzOworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlNjcm9sbFZpZXc7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuVGV4dFN3aXRjaGVyOworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlRleHRWaWV3OworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlRvYXN0OworCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuSWNjQ2FyZDsKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuVGVsZXBob255SW50ZW50czsKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuY2RtYS5FcmlJbmZvOworaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5jZG1hLlR0eUludGVudDsKKworaW1wb3J0IGNvbS5hbmRyb2lkLnN5c3RlbXVpLnN0YXR1c2Jhci4qOworaW1wb3J0IGNvbS5hbmRyb2lkLnN5c3RlbXVpLlI7CisKK3B1YmxpYyBjbGFzcyBTeXN0ZW1QYW5lbCBleHRlbmRzIExpbmVhckxheW91dCB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJTeXN0ZW1QYW5lbCI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVRyA9IFRhYmxldFN0YXR1c0JhclNlcnZpY2UuREVCVUc7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVR19TSUdOQUwgPSBmYWxzZTsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNSU5JTVVNX0JBQ0tMSUdIVCA9IGFuZHJvaWQub3MuUG93ZXIuQlJJR0hUTkVTU19ESU0gKyA1OworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNQVhJTVVNX0JBQ0tMSUdIVCA9IGFuZHJvaWQub3MuUG93ZXIuQlJJR0hUTkVTU19PTjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgREVGQVVMVF9CQUNLTElHSFQgPSAoaW50KSAoYW5kcm9pZC5vcy5Qb3dlci5CUklHSFRORVNTX09OICogMC40Zik7CisKKyAgICBwcml2YXRlIFRhYmxldFN0YXR1c0JhclNlcnZpY2UgbUJhcjsKKyAgICBwcml2YXRlIGJvb2xlYW4gbUFpcnBsYW5lTW9kZTsKKworICAgIHByaXZhdGUgSW1hZ2VCdXR0b24gbUJyaWdodG5lc3NCdXR0b247CisgICAgcHJpdmF0ZSBJbWFnZUJ1dHRvbiBtU291bmRCdXR0b247CisgICAgcHJpdmF0ZSBJbWFnZUJ1dHRvbiBtT3JpZW50YXRpb25CdXR0b247CisgICAgcHJpdmF0ZSBJbWFnZUJ1dHRvbiBtQWlycGxhbmVCdXR0b247CisgICAgcHJpdmF0ZSBJbWFnZUJ1dHRvbiBtR3BzQnV0dG9uOworICAgIHByaXZhdGUgSW1hZ2VCdXR0b24gbUJsdWV0b290aEJ1dHRvbjsKKworICAgIHByaXZhdGUgSW1hZ2VWaWV3IG1CYXR0ZXJ5TWV0ZXI7CisgICAgcHJpdmF0ZSBJbWFnZVZpZXcgbVNpZ25hbE1ldGVyOworCisgICAgcHJpdmF0ZSBUZXh0VmlldyBtQmF0dGVyeVRleHQ7CisgICAgcHJpdmF0ZSBUZXh0VmlldyBtU2lnbmFsVGV4dDsKKworICAgIHByaXZhdGUgZmluYWwgQXVkaW9NYW5hZ2VyIG1BdWRpb01hbmFnZXI7CisgICAgcHJpdmF0ZSBmaW5hbCBXaWZpTWFuYWdlciBtV2lmaU1hbmFnZXI7CisgICAgcHJpdmF0ZSBmaW5hbCBUZWxlcGhvbnlNYW5hZ2VyIG1QaG9uZTsKKyAgICBwcml2YXRlIGZpbmFsIEJsdWV0b290aEFkYXB0ZXIgbUJsdWV0b290aEFkYXB0ZXI7CisKKyAgICAvLyBzdGF0ZSB0cmFja2VycyBmb3IgdGVsZXBob255IGNvZGUKKyAgICBJY2NDYXJkLlN0YXRlIG1TaW1TdGF0ZSA9IEljY0NhcmQuU3RhdGUuUkVBRFk7CisgICAgaW50IG1QaG9uZVN0YXRlID0gVGVsZXBob255TWFuYWdlci5DQUxMX1NUQVRFX0lETEU7CisgICAgaW50IG1EYXRhU3RhdGUgPSBUZWxlcGhvbnlNYW5hZ2VyLkRBVEFfRElTQ09OTkVDVEVEOworICAgIFNlcnZpY2VTdGF0ZSBtU2VydmljZVN0YXRlOworICAgIFNpZ25hbFN0cmVuZ3RoIG1TaWduYWxTdHJlbmd0aDsKKworICAgIC8vIHN0YXRlIGZvciB0aGUgbWV0ZXJzCisgICAgYm9vbGVhbiBtV2lmaUVuYWJsZWQsIG1XaWZpQ29ubmVjdGVkOworICAgIGludCBtV2lmaUxldmVsOworICAgIFN0cmluZyBtV2lmaVNzaWQ7CisKKyAgICBib29sZWFuIG1EYXRhRW5hYmxlZCwgbURhdGFDb25uZWN0ZWQsIG1EYXRhUm9hbWluZzsKKyAgICBpbnQgbURhdGFMZXZlbDsKKworICAgIHByaXZhdGUgQnJvYWRjYXN0UmVjZWl2ZXIgbVJlY2VpdmVyID0gbmV3IEJyb2FkY2FzdFJlY2VpdmVyKCkgeworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgb25SZWNlaXZlKENvbnRleHQgY29udGV4dCwgSW50ZW50IGludGVudCkgeworICAgICAgICAgICAgZmluYWwgU3RyaW5nIGFjdGlvbiA9IGludGVudC5nZXRBY3Rpb24oKTsKKyAgICAgICAgICAgIGlmIChhY3Rpb24uZXF1YWxzKEF1ZGlvTWFuYWdlci5SSU5HRVJfTU9ERV9DSEFOR0VEX0FDVElPTikpIHsKKyAgICAgICAgICAgICAgICByZWZyZXNoU291bmQoKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoYWN0aW9uLmVxdWFscyhJbnRlbnQuQUNUSU9OX0JBVFRFUllfQ0hBTkdFRCkpIHsKKyAgICAgICAgICAgICAgICB1cGRhdGVCYXR0ZXJ5KGludGVudCk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGFjdGlvbi5lcXVhbHMoV2lmaU1hbmFnZXIuUlNTSV9DSEFOR0VEX0FDVElPTikKKyAgICAgICAgICAgICAgICAgICAgfHwgYWN0aW9uLmVxdWFscyhXaWZpTWFuYWdlci5XSUZJX1NUQVRFX0NIQU5HRURfQUNUSU9OKQorICAgICAgICAgICAgICAgICAgICB8fCBhY3Rpb24uZXF1YWxzKFdpZmlNYW5hZ2VyLlNVUFBMSUNBTlRfU1RBVEVfQ0hBTkdFRF9BQ1RJT04pCisgICAgICAgICAgICAgICAgICAgIHx8IGFjdGlvbi5lcXVhbHMoV2lmaU1hbmFnZXIuTkVUV09SS19TVEFURV9DSEFOR0VEX0FDVElPTikpIHsKKyAgICAgICAgICAgICAgICB1cGRhdGVXaWZpU3RhdGUoaW50ZW50KTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoYWN0aW9uLmVxdWFscyhUZWxlcGhvbnlJbnRlbnRzLkFDVElPTl9TSU1fU1RBVEVfQ0hBTkdFRCkpIHsKKyAgICAgICAgICAgICAgICB1cGRhdGVTaW1TdGF0ZShpbnRlbnQpOworICAgICAgICAgICAgfSBlbHNlIGlmIChhY3Rpb24uZXF1YWxzKEJsdWV0b290aEFkYXB0ZXIuQUNUSU9OX1NUQVRFX0NIQU5HRUQpKSB7CisgICAgICAgICAgICAgICAgcmVmcmVzaEJsdWV0b290aCgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfTsKKworICAgIHByaXZhdGUgZmluYWwgdm9pZCB1cGRhdGVTaW1TdGF0ZShJbnRlbnQgaW50ZW50KSB7CisgICAgICAgIFN0cmluZyBzdGF0ZUV4dHJhID0gaW50ZW50LmdldFN0cmluZ0V4dHJhKEljY0NhcmQuSU5URU5UX0tFWV9JQ0NfU1RBVEUpOworICAgICAgICBpZiAoSWNjQ2FyZC5JTlRFTlRfVkFMVUVfSUNDX0FCU0VOVC5lcXVhbHMoc3RhdGVFeHRyYSkpIHsKKyAgICAgICAgICAgIG1TaW1TdGF0ZSA9IEljY0NhcmQuU3RhdGUuQUJTRU5UOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKEljY0NhcmQuSU5URU5UX1ZBTFVFX0lDQ19SRUFEWS5lcXVhbHMoc3RhdGVFeHRyYSkpIHsKKyAgICAgICAgICAgIG1TaW1TdGF0ZSA9IEljY0NhcmQuU3RhdGUuUkVBRFk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoSWNjQ2FyZC5JTlRFTlRfVkFMVUVfSUNDX0xPQ0tFRC5lcXVhbHMoc3RhdGVFeHRyYSkpIHsKKyAgICAgICAgICAgIGZpbmFsIFN0cmluZyBsb2NrZWRSZWFzb24gPSBpbnRlbnQuZ2V0U3RyaW5nRXh0cmEoSWNjQ2FyZC5JTlRFTlRfS0VZX0xPQ0tFRF9SRUFTT04pOworICAgICAgICAgICAgaWYgKEljY0NhcmQuSU5URU5UX1ZBTFVFX0xPQ0tFRF9PTl9QSU4uZXF1YWxzKGxvY2tlZFJlYXNvbikpIHsKKyAgICAgICAgICAgICAgICBtU2ltU3RhdGUgPSBJY2NDYXJkLlN0YXRlLlBJTl9SRVFVSVJFRDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKEljY0NhcmQuSU5URU5UX1ZBTFVFX0xPQ0tFRF9PTl9QVUsuZXF1YWxzKGxvY2tlZFJlYXNvbikpIHsKKyAgICAgICAgICAgICAgICBtU2ltU3RhdGUgPSBJY2NDYXJkLlN0YXRlLlBVS19SRVFVSVJFRDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIG1TaW1TdGF0ZSA9IEljY0NhcmQuU3RhdGUuTkVUV09SS19MT0NLRUQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtU2ltU3RhdGUgPSBJY2NDYXJkLlN0YXRlLlVOS05PV047CisgICAgICAgIH0KKyAgICAgICAgdXBkYXRlRGF0YVN0YXRlKCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBib29sZWFuIGlzQ2RtYSgpIHsKKyAgICAgICAgcmV0dXJuIChtU2lnbmFsU3RyZW5ndGggIT0gbnVsbCkgJiYgIW1TaWduYWxTdHJlbmd0aC5pc0dzbSgpOworICAgIH0KKworICAgIHByaXZhdGUgYm9vbGVhbiBpc0V2ZG8oKSB7CisgICAgICAgIHJldHVybiAoIChtU2VydmljZVN0YXRlICE9IG51bGwpCisgICAgICAgICAgICAgICAgICYmICgobVNlcnZpY2VTdGF0ZS5nZXRSYWRpb1RlY2hub2xvZ3koKQorICAgICAgICAgICAgICAgICAgICAgICAgPT0gU2VydmljZVN0YXRlLlJBRElPX1RFQ0hOT0xPR1lfRVZET18wKQorICAgICAgICAgICAgICAgICAgICAgfHwgKG1TZXJ2aWNlU3RhdGUuZ2V0UmFkaW9UZWNobm9sb2d5KCkKKyAgICAgICAgICAgICAgICAgICAgICAgID09IFNlcnZpY2VTdGF0ZS5SQURJT19URUNITk9MT0dZX0VWRE9fQSkKKyAgICAgICAgICAgICAgICAgICAgIHx8IChtU2VydmljZVN0YXRlLmdldFJhZGlvVGVjaG5vbG9neSgpCisgICAgICAgICAgICAgICAgICAgICAgICA9PSBTZXJ2aWNlU3RhdGUuUkFESU9fVEVDSE5PTE9HWV9FVkRPX0IpKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBib29sZWFuIGhhc1NlcnZpY2UoKSB7CisgICAgICAgIGlmIChtU2VydmljZVN0YXRlICE9IG51bGwpIHsKKyAgICAgICAgICAgIHN3aXRjaCAobVNlcnZpY2VTdGF0ZS5nZXRTdGF0ZSgpKSB7CisgICAgICAgICAgICAgICAgY2FzZSBTZXJ2aWNlU3RhdGUuU1RBVEVfT1VUX09GX1NFUlZJQ0U6CisgICAgICAgICAgICAgICAgY2FzZSBTZXJ2aWNlU3RhdGUuU1RBVEVfUE9XRVJfT0ZGOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIGludCBnZXRDZG1hTGV2ZWwoKSB7CisgICAgICAgIGlmIChtU2lnbmFsU3RyZW5ndGggPT0gbnVsbCkgcmV0dXJuIDA7CisgICAgICAgIGZpbmFsIGludCBjZG1hRGJtID0gbVNpZ25hbFN0cmVuZ3RoLmdldENkbWFEYm0oKTsKKyAgICAgICAgZmluYWwgaW50IGNkbWFFY2lvID0gbVNpZ25hbFN0cmVuZ3RoLmdldENkbWFFY2lvKCk7CisgICAgICAgIGludCBsZXZlbERibSA9IDA7CisgICAgICAgIGludCBsZXZlbEVjaW8gPSAwOworCisgICAgICAgIGlmIChjZG1hRGJtID49IC03NSkgbGV2ZWxEYm0gPSA0OworICAgICAgICBlbHNlIGlmIChjZG1hRGJtID49IC04NSkgbGV2ZWxEYm0gPSAzOworICAgICAgICBlbHNlIGlmIChjZG1hRGJtID49IC05NSkgbGV2ZWxEYm0gPSAyOworICAgICAgICBlbHNlIGlmIChjZG1hRGJtID49IC0xMDApIGxldmVsRGJtID0gMTsKKyAgICAgICAgZWxzZSBsZXZlbERibSA9IDA7CisKKyAgICAgICAgLy8gRWMvSW8gYXJlIGluIGRCKjEwCisgICAgICAgIGlmIChjZG1hRWNpbyA+PSAtOTApIGxldmVsRWNpbyA9IDQ7CisgICAgICAgIGVsc2UgaWYgKGNkbWFFY2lvID49IC0xMTApIGxldmVsRWNpbyA9IDM7CisgICAgICAgIGVsc2UgaWYgKGNkbWFFY2lvID49IC0xMzApIGxldmVsRWNpbyA9IDI7CisgICAgICAgIGVsc2UgaWYgKGNkbWFFY2lvID49IC0xNTApIGxldmVsRWNpbyA9IDE7CisgICAgICAgIGVsc2UgbGV2ZWxFY2lvID0gMDsKKworICAgICAgICByZXR1cm4gKGxldmVsRGJtIDwgbGV2ZWxFY2lvKSA/IGxldmVsRGJtIDogbGV2ZWxFY2lvOworICAgIH0KKworICAgIHByaXZhdGUgaW50IGdldEV2ZG9MZXZlbCgpIHsKKyAgICAgICAgaWYgKG1TaWduYWxTdHJlbmd0aCA9PSBudWxsKSByZXR1cm4gMDsKKyAgICAgICAgaW50IGV2ZG9EYm0gPSBtU2lnbmFsU3RyZW5ndGguZ2V0RXZkb0RibSgpOworICAgICAgICBpbnQgZXZkb1NuciA9IG1TaWduYWxTdHJlbmd0aC5nZXRFdmRvU25yKCk7CisgICAgICAgIGludCBsZXZlbEV2ZG9EYm0gPSAwOworICAgICAgICBpbnQgbGV2ZWxFdmRvU25yID0gMDsKKworICAgICAgICBpZiAoZXZkb0RibSA+PSAtNjUpIGxldmVsRXZkb0RibSA9IDQ7CisgICAgICAgIGVsc2UgaWYgKGV2ZG9EYm0gPj0gLTc1KSBsZXZlbEV2ZG9EYm0gPSAzOworICAgICAgICBlbHNlIGlmIChldmRvRGJtID49IC05MCkgbGV2ZWxFdmRvRGJtID0gMjsKKyAgICAgICAgZWxzZSBpZiAoZXZkb0RibSA+PSAtMTA1KSBsZXZlbEV2ZG9EYm0gPSAxOworICAgICAgICBlbHNlIGxldmVsRXZkb0RibSA9IDA7CisKKyAgICAgICAgaWYgKGV2ZG9TbnIgPj0gNykgbGV2ZWxFdmRvU25yID0gNDsKKyAgICAgICAgZWxzZSBpZiAoZXZkb1NuciA+PSA1KSBsZXZlbEV2ZG9TbnIgPSAzOworICAgICAgICBlbHNlIGlmIChldmRvU25yID49IDMpIGxldmVsRXZkb1NuciA9IDI7CisgICAgICAgIGVsc2UgaWYgKGV2ZG9TbnIgPj0gMSkgbGV2ZWxFdmRvU25yID0gMTsKKyAgICAgICAgZWxzZSBsZXZlbEV2ZG9TbnIgPSAwOworCisgICAgICAgIHJldHVybiAobGV2ZWxFdmRvRGJtIDwgbGV2ZWxFdmRvU25yKSA/IGxldmVsRXZkb0RibSA6IGxldmVsRXZkb1NucjsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgdXBkYXRlRGF0YVN0YXRlKCkgeworICAgICAgICBtRGF0YUNvbm5lY3RlZCA9IGhhc1NlcnZpY2UoKSAmJiAobURhdGFTdGF0ZSA9PSBUZWxlcGhvbnlNYW5hZ2VyLkRBVEFfQ09OTkVDVEVEKTsKKworICAgICAgICBpZiAoaXNDZG1hKCkpIHsKKyAgICAgICAgICAgIC8vIHRoZXNlIGZ1bmN0aW9ucyByZXR1cm4gYSB2YWx1ZSBmcm9tIDAgdG8gNCwgaW5jbHVzaXZlCisgICAgICAgICAgICBpZiAoKG1QaG9uZVN0YXRlID09IFRlbGVwaG9ueU1hbmFnZXIuQ0FMTF9TVEFURV9JRExFKSAmJiBpc0V2ZG8oKSl7CisgICAgICAgICAgICAgICAgbURhdGFMZXZlbCA9IGdldEV2ZG9MZXZlbCgpICogMjU7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG1EYXRhTGV2ZWwgPSBnZXRDZG1hTGV2ZWwoKSAqIDI1OworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gR1NNCisgICAgICAgICAgICAKKyAgICAgICAgICAgIGludCBhc3UgPSAobVNpZ25hbFN0cmVuZ3RoID09IG51bGwpID8gMCA6IG1TaWduYWxTdHJlbmd0aC5nZXRHc21TaWduYWxTdHJlbmd0aCgpOworCisgICAgICAgICAgICAvLyBhc3Ugb24gWzAsMzFdOyA5OSA9IHVua25vd24KKyAgICAgICAgICAgIC8vIEFuZHJvaWQgaGFzIGhpc3RvcmljYWxseSBzaG93biBhbnl0aGluZyA+PTEyIGFzICJmdWxsIgorICAgICAgICAgICAgLy8gWFhYOiB0dW5lIHRoaXMgYmFzZWQgb24gSW5kdXN0cnkgQmVzdCBQcmFjdGljZXMoVE0pCisgICAgICAgICAgICBpZiAoYXN1IDw9IDIgfHwgYXN1ID09IDk5KSBtRGF0YUxldmVsID0gMDsKKyAgICAgICAgICAgIGVsc2UgbURhdGFMZXZlbCA9IChpbnQpKCgoZmxvYXQpTWF0aC5tYXgoYXN1LCAxNSkgLyAxNSkgKiAxMDApOworCisgICAgICAgICAgICBtRGF0YVJvYW1pbmcgPSBtUGhvbmUuaXNOZXR3b3JrUm9hbWluZygpOworCisgICAgICAgICAgICBtRGF0YUNvbm5lY3RlZCA9IG1EYXRhQ29ubmVjdGVkCisgICAgICAgICAgICAgICAgJiYgKG1TaW1TdGF0ZSA9PSBJY2NDYXJkLlN0YXRlLlJFQURZIHx8IG1TaW1TdGF0ZSA9PSBJY2NDYXJkLlN0YXRlLlVOS05PV04pOworICAgICAgICB9CisKKyAgICAgICAgaWYgKERFQlVHX1NJR05BTCB8fCBERUJVRykgeworICAgICAgICAgICAgU2xvZy5kKFRBRywgInVwZGF0ZURhdGFTdGF0ZTogY29ubmVjdGVkPSIgKyBtRGF0YUNvbm5lY3RlZCAKKyAgICAgICAgICAgICAgICAgICAgKyAiIGxldmVsPSIgKyBtRGF0YUxldmVsCisgICAgICAgICAgICAgICAgICAgICsgIiBpc0V2ZG89IiArIGlzRXZkbygpCisgICAgICAgICAgICAgICAgICAgICsgIiBpc0NkbWE9IiArIGlzQ2RtYSgpCisgICAgICAgICAgICAgICAgICAgICsgIiBtUGhvbmVTdGF0ZT0iICsgbVBob25lU3RhdGUKKyAgICAgICAgICAgICAgICAgICAgKyAiIG1EYXRhU3RhdGU9IiArIG1EYXRhU3RhdGUKKyAgICAgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgfQorCisgICAgICAgIHJlZnJlc2hTaWduYWxNZXRlcnMoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgdXBkYXRlV2lmaVN0YXRlKEludGVudCBpbnRlbnQpIHsKKyAgICAgICAgaWYgKERFQlVHKQorICAgICAgICAgICAgU2xvZy5kKFRBRywgInVwZGF0ZVdpZmlTdGF0ZTogIiArIGludGVudCk7CisKKyAgICAgICAgZmluYWwgU3RyaW5nIGFjdGlvbiA9IGludGVudC5nZXRBY3Rpb24oKTsKKyAgICAgICAgZmluYWwgYm9vbGVhbiB3YXNDb25uZWN0ZWQgPSBtV2lmaUNvbm5lY3RlZDsKKworICAgICAgICBpZiAoYWN0aW9uLmVxdWFscyhXaWZpTWFuYWdlci5XSUZJX1NUQVRFX0NIQU5HRURfQUNUSU9OKSkgeworICAgICAgICAgICAgbVdpZmlFbmFibGVkID0gaW50ZW50LmdldEludEV4dHJhKFdpZmlNYW5hZ2VyLkVYVFJBX1dJRklfU1RBVEUsCisgICAgICAgICAgICAgICAgICAgIFdpZmlNYW5hZ2VyLldJRklfU1RBVEVfVU5LTk9XTikgPT0gV2lmaU1hbmFnZXIuV0lGSV9TVEFURV9FTkFCTEVEOworICAgICAgICB9IGVsc2UgaWYgKGFjdGlvbi5lcXVhbHMoV2lmaU1hbmFnZXIuTkVUV09SS19TVEFURV9DSEFOR0VEX0FDVElPTikpIHsKKyAgICAgICAgICAgIGZpbmFsIE5ldHdvcmtJbmZvIG5ldHdvcmtJbmZvID0gKE5ldHdvcmtJbmZvKQorICAgICAgICAgICAgICAgICAgICBpbnRlbnQuZ2V0UGFyY2VsYWJsZUV4dHJhKFdpZmlNYW5hZ2VyLkVYVFJBX05FVFdPUktfSU5GTyk7CisgICAgICAgICAgICBtV2lmaUNvbm5lY3RlZCA9IG5ldHdvcmtJbmZvICE9IG51bGwgJiYgbmV0d29ya0luZm8uaXNDb25uZWN0ZWQoKTsKKyAgICAgICAgfSBlbHNlIGlmIChhY3Rpb24uZXF1YWxzKFdpZmlNYW5hZ2VyLlNVUFBMSUNBTlRfU1RBVEVfQ0hBTkdFRF9BQ1RJT04pKSB7CisgICAgICAgICAgICBmaW5hbCBOZXR3b3JrSW5mby5EZXRhaWxlZFN0YXRlIGRldGFpbGVkU3RhdGUgPSBXaWZpSW5mby5nZXREZXRhaWxlZFN0YXRlT2YoCisgICAgICAgICAgICAgICAgICAgIChTdXBwbGljYW50U3RhdGUpaW50ZW50LmdldFBhcmNlbGFibGVFeHRyYShXaWZpTWFuYWdlci5FWFRSQV9ORVdfU1RBVEUpKTsKKyAgICAgICAgICAgIG1XaWZpQ29ubmVjdGVkID0gZGV0YWlsZWRTdGF0ZSA9PSBOZXR3b3JrSW5mby5EZXRhaWxlZFN0YXRlLkNPTk5FQ1RFRDsKKyAgICAgICAgfSBlbHNlIGlmIChhY3Rpb24uZXF1YWxzKFdpZmlNYW5hZ2VyLlJTU0lfQ0hBTkdFRF9BQ1RJT04pKSB7CisgICAgICAgICAgICBmaW5hbCBpbnQgbmV3UnNzaSA9IGludGVudC5nZXRJbnRFeHRyYShXaWZpTWFuYWdlci5FWFRSQV9ORVdfUlNTSSwgLTIwMCk7CisgICAgICAgICAgICBpbnQgbmV3U2lnbmFsTGV2ZWwgPSBXaWZpTWFuYWdlci5jYWxjdWxhdGVTaWduYWxMZXZlbChuZXdSc3NpLCAxMDEpOworICAgICAgICAgICAgbVdpZmlMZXZlbCA9IG1XaWZpQ29ubmVjdGVkID8gbmV3U2lnbmFsTGV2ZWwgOiAwOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG1XaWZpQ29ubmVjdGVkICYmICF3YXNDb25uZWN0ZWQpIHsKKyAgICAgICAgICAgIFdpZmlJbmZvIGluZm8gPSBtV2lmaU1hbmFnZXIuZ2V0Q29ubmVjdGlvbkluZm8oKTsKKyAgICAgICAgICAgIGlmIChERUJVRykKKyAgICAgICAgICAgICAgICBTbG9nLmQoVEFHLCAidXBkYXRlV2lmaVN0YXRlOiBqdXN0IGNvbm5lY3RlZDogaW5mbz0iICsgaW5mbyk7CisKKyAgICAgICAgICAgIGlmIChpbmZvICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAvLyBncmFiIHRoZSBpbml0aWFsIHNpZ25hbCBzdHJlbmd0aAorICAgICAgICAgICAgICAgIG1XaWZpTGV2ZWwgPSBXaWZpTWFuYWdlci5jYWxjdWxhdGVTaWduYWxMZXZlbChpbmZvLmdldFJzc2koKSwgMTAxKTsKKworICAgICAgICAgICAgICAgIC8vIGZpbmQgdGhlIFNTSUQKKyAgICAgICAgICAgICAgICBtV2lmaVNzaWQgPSBpbmZvLmdldFNTSUQoKTsKKyAgICAgICAgICAgICAgICBpZiAobVdpZmlTc2lkID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gT0ssIGl0J3Mgbm90IGluIHRoZSBjb25uZWN0aW9uSW5mbzsgd2UgaGF2ZSB0byBnbyBodW50aW5nIGZvciBpdAorICAgICAgICAgICAgICAgICAgICBMaXN0PFdpZmlDb25maWd1cmF0aW9uPiBuZXR3b3JrcyA9IG1XaWZpTWFuYWdlci5nZXRDb25maWd1cmVkTmV0d29ya3MoKTsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChXaWZpQ29uZmlndXJhdGlvbiBuZXQgOiBuZXR3b3JrcykgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5ldC5uZXR3b3JrSWQgPT0gaW5mby5nZXROZXR3b3JrSWQoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1XaWZpU3NpZCA9IG5ldC5TU0lEOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmVmcmVzaFNpZ25hbE1ldGVycygpOworICAgIH0KKworICAgIC8vIGZpZ3VyZSBvdXQgd2hhdCB0byBzaG93OiBmaXJzdCB3aWZpLCB0aGVuIDNHLCB0aGVuIG5vdGhpbmcKKyAgICB2b2lkIHJlZnJlc2hTaWduYWxNZXRlcnMoKSB7CisgICAgICAgIGlmIChtU2lnbmFsTWV0ZXIgPT0gbnVsbCkgcmV0dXJuOyAvLyBubyBVSSB5ZXQKKworICAgICAgICBDb250ZXh0IGN0eHQgPSBnZXRDb250ZXh0KCk7CisKKyAgICAgICAgU3RyaW5nIHRleHQgPSBudWxsOworICAgICAgICBpbnQgbGV2ZWwgPSAwOworCisgICAgICAgIGlmIChtV2lmaUNvbm5lY3RlZCkgeworICAgICAgICAgICAgaWYgKG1XaWZpU3NpZCA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgdGV4dCA9IGN0eHQuZ2V0U3RyaW5nKFIuc3RyaW5nLnN5c3RlbV9wYW5lbF9zaWduYWxfbWV0ZXJfd2lmaV9ub3NzaWQpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICB0ZXh0ID0gY3R4dC5nZXRTdHJpbmcoUi5zdHJpbmcuc3lzdGVtX3BhbmVsX3NpZ25hbF9tZXRlcl93aWZpX3NzaWRfZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtV2lmaVNzaWQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbGV2ZWwgPSBtV2lmaUxldmVsOworICAgICAgICB9IGVsc2UgaWYgKG1EYXRhQ29ubmVjdGVkKSB7CisgICAgICAgICAgICB0ZXh0ID0gY3R4dC5nZXRTdHJpbmcoUi5zdHJpbmcuc3lzdGVtX3BhbmVsX3NpZ25hbF9tZXRlcl9kYXRhX2Nvbm5lY3RlZCk7CisgICAgICAgICAgICBsZXZlbCA9IG1EYXRhTGV2ZWw7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB0ZXh0ID0gY3R4dC5nZXRTdHJpbmcoUi5zdHJpbmcuc3lzdGVtX3BhbmVsX3NpZ25hbF9tZXRlcl9kaXNjb25uZWN0ZWQpOworICAgICAgICAgICAgbGV2ZWwgPSAwOworICAgICAgICB9CisKKyAgICAgICAgbVNpZ25hbE1ldGVyLnNldEltYWdlUmVzb3VyY2UoUi5kcmF3YWJsZS5zeXNiYXJfc2lnbmFsKTsKKyAgICAgICAgbVNpZ25hbE1ldGVyLnNldEltYWdlTGV2ZWwobGV2ZWwpOworICAgICAgICBtU2lnbmFsVGV4dC5zZXRUZXh0KHRleHQpOworCisgICAgICAgIC8vIGhhY2sgZm9yIG5vdworICAgICAgICBtQmFyLnNldFNpZ25hbE1ldGVyKGxldmVsLCBtV2lmaUNvbm5lY3RlZCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0QmFyKFRhYmxldFN0YXR1c0JhclNlcnZpY2UgYmFyKSB7CisgICAgICAgIG1CYXIgPSBiYXI7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdXBkYXRlQmF0dGVyeShJbnRlbnQgaW50ZW50KSB7CisgICAgICAgIGZpbmFsIGludCBsZXZlbCA9IGludGVudC5nZXRJbnRFeHRyYSgibGV2ZWwiLCAwKTsKKyAgICAgICAgZmluYWwgYm9vbGVhbiBwbHVnZ2VkID0gaW50ZW50LmdldEludEV4dHJhKCJwbHVnZ2VkIiwgMCkgIT0gMDsKKworICAgICAgICBtQmF0dGVyeU1ldGVyLnNldEltYWdlUmVzb3VyY2UoUi5kcmF3YWJsZS5zeXNiYXJfYmF0dGVyeSk7CisgICAgICAgIG1CYXR0ZXJ5TWV0ZXIuc2V0SW1hZ2VMZXZlbChsZXZlbCk7CisgICAgICAgIG1CYXR0ZXJ5VGV4dC5zZXRUZXh0KGdldENvbnRleHQoKQorICAgICAgICAgICAgICAgIC5nZXRTdHJpbmcoUi5zdHJpbmcuc3lzdGVtX3BhbmVsX2JhdHRlcnlfbWV0ZXJfZm9ybWF0LCBsZXZlbCkpOworCisgICAgICAgIC8vIGhhY2sgZm9yIG5vdworICAgICAgICBtQmFyLnNldEJhdHRlcnlNZXRlcihsZXZlbCwgcGx1Z2dlZCk7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBTeXN0ZW1QYW5lbChDb250ZXh0IGNvbnRleHQsIEF0dHJpYnV0ZVNldCBhdHRycykgeworICAgICAgICB0aGlzKGNvbnRleHQsIGF0dHJzLCAwKTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3lzdGVtUGFuZWwoQ29udGV4dCBjb250ZXh0LCBBdHRyaWJ1dGVTZXQgYXR0cnMsIGludCBkZWZTdHlsZSkgeworICAgICAgICBzdXBlcihjb250ZXh0LCBhdHRycywgZGVmU3R5bGUpOworCisgICAgICAgIC8vIGdldCBub3RpZmllZCBvZiBwaG9uZSBzdGF0ZSBjaGFuZ2VzCisgICAgICAgIFRlbGVwaG9ueU1hbmFnZXIgdGVsZXBob255TWFuYWdlciA9CisgICAgICAgICAgICAgICAgKFRlbGVwaG9ueU1hbmFnZXIpIGNvbnRleHQuZ2V0U3lzdGVtU2VydmljZShDb250ZXh0LlRFTEVQSE9OWV9TRVJWSUNFKTsKKyAgICAgICAgdGVsZXBob255TWFuYWdlci5saXN0ZW4obVBob25lU3RhdGVMaXN0ZW5lciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUGhvbmVTdGF0ZUxpc3RlbmVyLkxJU1RFTl9TRVJWSUNFX1NUQVRFCisgICAgICAgICAgICAgICAgICAgICAgICB8IFBob25lU3RhdGVMaXN0ZW5lci5MSVNURU5fU0lHTkFMX1NUUkVOR1RIUworICAgICAgICAgICAgICAgICAgICAgICAgfCBQaG9uZVN0YXRlTGlzdGVuZXIuTElTVEVOX0NBTExfU1RBVEUKKyAgICAgICAgICAgICAgICAgICAgICAgIHwgUGhvbmVTdGF0ZUxpc3RlbmVyLkxJU1RFTl9EQVRBX0NPTk5FQ1RJT05fU1RBVEUKKyAgICAgICAgICAgICAgICAgICAgICAgIHwgUGhvbmVTdGF0ZUxpc3RlbmVyLkxJU1RFTl9EQVRBX0FDVElWSVRZKTsKKworICAgICAgICAvLyB3aWZpIHN0YXR1cyBpbmZvCisgICAgICAgIG1XaWZpTWFuYWdlciA9IChXaWZpTWFuYWdlcikgY29udGV4dC5nZXRTeXN0ZW1TZXJ2aWNlKENvbnRleHQuV0lGSV9TRVJWSUNFKTsKKyAgICAgICAgCisgICAgICAgIC8vIGF1ZGlvIHN0YXR1cyAKKyAgICAgICAgbUF1ZGlvTWFuYWdlciA9IChBdWRpb01hbmFnZXIpIG1Db250ZXh0LmdldFN5c3RlbVNlcnZpY2UoQ29udGV4dC5BVURJT19TRVJWSUNFKTsKKworICAgICAgICAvLyBtb2JpbGUgZGF0YSAKKyAgICAgICAgbVBob25lID0gKFRlbGVwaG9ueU1hbmFnZXIpY29udGV4dC5nZXRTeXN0ZW1TZXJ2aWNlKENvbnRleHQuVEVMRVBIT05ZX1NFUlZJQ0UpOworCisgICAgICAgIC8vIEJsdWV0b290aAorICAgICAgICBtQmx1ZXRvb3RoQWRhcHRlciA9IEJsdWV0b290aEFkYXB0ZXIuZ2V0RGVmYXVsdEFkYXB0ZXIoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBvbkF0dGFjaGVkVG9XaW5kb3coKSB7CisgICAgICAgIFRleHRWaWV3IHNldHRpbmdzQnV0dG9uID0gKFRleHRWaWV3KWZpbmRWaWV3QnlJZChSLmlkLnNldHRpbmdzX2J1dHRvbik7CisgICAgICAgIHNldHRpbmdzQnV0dG9uLnNldE9uQ2xpY2tMaXN0ZW5lcihuZXcgVmlldy5PbkNsaWNrTGlzdGVuZXIoKSB7CisgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkNsaWNrKFZpZXcgdikgeworICAgICAgICAgICAgICAgIGdldENvbnRleHQoKS5zdGFydEFjdGl2aXR5KG5ldyBJbnRlbnQoYW5kcm9pZC5wcm92aWRlci5TZXR0aW5ncy5BQ1RJT05fU0VUVElOR1MpCisgICAgICAgICAgICAgICAgICAgICAgICAuc2V0RmxhZ3MoSW50ZW50LkZMQUdfQUNUSVZJVFlfTkVXX1RBU0spKTsKKyAgICAgICAgICAgICAgICBtQmFyLmFuaW1hdGVDb2xsYXBzZSgpOworICAgICAgICAgICAgfX0pOworCisgICAgICAgIG1CcmlnaHRuZXNzQnV0dG9uID0gKEltYWdlQnV0dG9uKWZpbmRWaWV3QnlJZChSLmlkLmJyaWdodG5lc3MpOworICAgICAgICBtQnJpZ2h0bmVzc0J1dHRvbi5zZXRPbkNsaWNrTGlzdGVuZXIobmV3IFZpZXcuT25DbGlja0xpc3RlbmVyKCkgeworICAgICAgICAgICAgcHVibGljIHZvaWQgb25DbGljayhWaWV3IHYpIHsKKyAgICAgICAgICAgICAgICByb3RhdGVCcmlnaHRuZXNzKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworCisgICAgICAgIG1Tb3VuZEJ1dHRvbiA9IChJbWFnZUJ1dHRvbilmaW5kVmlld0J5SWQoUi5pZC5zb3VuZCk7CisgICAgICAgIG1Tb3VuZEJ1dHRvbi5zZXRPbkNsaWNrTGlzdGVuZXIobmV3IFZpZXcuT25DbGlja0xpc3RlbmVyKCkgeworICAgICAgICAgICAgcHVibGljIHZvaWQgb25DbGljayhWaWV3IHYpIHsKKyAgICAgICAgICAgICAgICBzZXRTaWxlbnRNb2RlKCFnZXRTaWxlbnRNb2RlKCkpOworICAgICAgICAgICAgICAgIG1Tb3VuZEJ1dHRvbi5zZXRBbHBoYShnZXRTaWxlbnRNb2RlKCkgPyAweDdGIDogMHhGRik7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworICAgICAgICBtT3JpZW50YXRpb25CdXR0b24gPSAoSW1hZ2VCdXR0b24pZmluZFZpZXdCeUlkKFIuaWQub3JpZW50YXRpb24pOworICAgICAgICBtT3JpZW50YXRpb25CdXR0b24uc2V0T25DbGlja0xpc3RlbmVyKG5ldyBWaWV3Lk9uQ2xpY2tMaXN0ZW5lcigpIHsKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uQ2xpY2soVmlldyB2KSB7CisgICAgICAgICAgICAgICAgVG9hc3QubWFrZVRleHQoZ2V0Q29udGV4dCgpLCAiT3JpZW50YXRpb24gY29udHJvbCBub3QgaW1wbGVtZW50ZWQ7IHBsZWFzZSBhZGp1c3QgbmVjayBhbmdsZS4iLCBUb2FzdC5MRU5HVEhfU0hPUlQpLnNob3coKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisKKyAgICAgICAgbUFpcnBsYW5lQnV0dG9uID0gKEltYWdlQnV0dG9uKWZpbmRWaWV3QnlJZChSLmlkLmFpcnBsYW5lKTsKKyAgICAgICAgbUFpcnBsYW5lQnV0dG9uLnNldEFscGhhKG1BaXJwbGFuZU1vZGUgPyAweEZGIDogMHg3Rik7CisgICAgICAgIG1BaXJwbGFuZUJ1dHRvbi5zZXRPbkNsaWNrTGlzdGVuZXIobmV3IFZpZXcuT25DbGlja0xpc3RlbmVyKCkgeworICAgICAgICAgICAgcHVibGljIHZvaWQgb25DbGljayhWaWV3IHYpIHsKKyAgICAgICAgICAgICAgICBib29sZWFuIG5ld01vZGUgPSAhZ2V0QWlycGxhbmVNb2RlKCk7CisgICAgICAgICAgICAgICAgVG9hc3QubWFrZVRleHQoZ2V0Q29udGV4dCgpLCAiQXR0ZW1wdGluZyB0byB0dXJuICIKKyAgICAgICAgICAgICAgICAgICAgKyAobmV3TW9kZSA/ICJvbiIgOiAib2ZmIikgKyAiIGFpcnBsYW5lIG1vZGUgKGZsYWt5KS4iLAorICAgICAgICAgICAgICAgICAgICBUb2FzdC5MRU5HVEhfU0hPUlQpLnNob3coKTsKKyAgICAgICAgICAgICAgICBzZXRBaXJwbGFuZU1vZGUobmV3TW9kZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworCisgICAgICAgIG1HcHNCdXR0b24gPSAoSW1hZ2VCdXR0b24pZmluZFZpZXdCeUlkKFIuaWQuZ3BzKTsKKyAgICAgICAgbUdwc0J1dHRvbi5zZXRPbkNsaWNrTGlzdGVuZXIobmV3IFZpZXcuT25DbGlja0xpc3RlbmVyKCkgeworICAgICAgICAgICAgcHVibGljIHZvaWQgb25DbGljayhWaWV3IHYpIHsKKyAgICAgICAgICAgICAgICB0b2dnbGVHcHMoKTsKKyAgICAgICAgICAgICAgICByZWZyZXNoR3BzKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworCisgICAgICAgIG1CbHVldG9vdGhCdXR0b24gPSAoSW1hZ2VCdXR0b24pZmluZFZpZXdCeUlkKFIuaWQuYmx1ZXRvb3RoKTsKKyAgICAgICAgbUJsdWV0b290aEJ1dHRvbi5zZXRPbkNsaWNrTGlzdGVuZXIobmV3IFZpZXcuT25DbGlja0xpc3RlbmVyKCkgeworICAgICAgICAgICAgcHVibGljIHZvaWQgb25DbGljayhWaWV3IHYpIHsKKyAgICAgICAgICAgICAgICB0b2dnbGVCbHVldG9vdGgoKTsKKyAgICAgICAgICAgICAgICByZWZyZXNoQmx1ZXRvb3RoKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworCisgICAgICAgIC8vIHJlZ2lzdGVyIGZvciBicm9hZGNhc3RzCisgICAgICAgIEludGVudEZpbHRlciBmaWx0ZXIgPSBuZXcgSW50ZW50RmlsdGVyKCk7CisgICAgICAgIGZpbHRlci5hZGRBY3Rpb24oQXVkaW9NYW5hZ2VyLlJJTkdFUl9NT0RFX0NIQU5HRURfQUNUSU9OKTsKKyAgICAgICAgZmlsdGVyLmFkZEFjdGlvbihJbnRlbnQuQUNUSU9OX0JBVFRFUllfQ0hBTkdFRCk7CisgICAgICAgIGZpbHRlci5hZGRBY3Rpb24oV2lmaU1hbmFnZXIuV0lGSV9TVEFURV9DSEFOR0VEX0FDVElPTik7CisgICAgICAgIGZpbHRlci5hZGRBY3Rpb24oV2lmaU1hbmFnZXIuU1VQUExJQ0FOVF9TVEFURV9DSEFOR0VEX0FDVElPTik7CisgICAgICAgIGZpbHRlci5hZGRBY3Rpb24oV2lmaU1hbmFnZXIuTkVUV09SS19TVEFURV9DSEFOR0VEX0FDVElPTik7CisgICAgICAgIGZpbHRlci5hZGRBY3Rpb24oV2lmaU1hbmFnZXIuUlNTSV9DSEFOR0VEX0FDVElPTik7CisgICAgICAgIGZpbHRlci5hZGRBY3Rpb24oVGVsZXBob255SW50ZW50cy5BQ1RJT05fU0lNX1NUQVRFX0NIQU5HRUQpOworICAgICAgICBmaWx0ZXIuYWRkQWN0aW9uKEJsdWV0b290aEFkYXB0ZXIuQUNUSU9OX1NUQVRFX0NIQU5HRUQpOworICAgICAgICBnZXRDb250ZXh0KCkucmVnaXN0ZXJSZWNlaXZlcihtUmVjZWl2ZXIsIGZpbHRlcik7CisgICAgICAgIAorICAgICAgICBtQmF0dGVyeU1ldGVyID0gKEltYWdlVmlldylmaW5kVmlld0J5SWQoUi5pZC5iYXR0ZXJ5X21ldGVyKTsKKyAgICAgICAgbUJhdHRlcnlNZXRlci5zZXRJbWFnZVJlc291cmNlKFIuZHJhd2FibGUuc3lzYmFyX2JhdHRlcnkpOworICAgICAgICBtQmF0dGVyeU1ldGVyLnNldEltYWdlTGV2ZWwoMCk7CisgICAgICAgIG1TaWduYWxNZXRlciA9IChJbWFnZVZpZXcpZmluZFZpZXdCeUlkKFIuaWQuc2lnbmFsX21ldGVyKTsKKyAgICAgICAgbUJhdHRlcnlNZXRlci5zZXRJbWFnZVJlc291cmNlKFIuZHJhd2FibGUuc3lzYmFyX3NpZ25hbCk7CisgICAgICAgIG1CYXR0ZXJ5TWV0ZXIuc2V0SW1hZ2VMZXZlbCgwKTsKKworICAgICAgICBtQmF0dGVyeVRleHQgPSAoVGV4dFZpZXcpZmluZFZpZXdCeUlkKFIuaWQuYmF0dGVyeV9pbmZvKTsKKyAgICAgICAgbVNpZ25hbFRleHQgPSAoVGV4dFZpZXcpZmluZFZpZXdCeUlkKFIuaWQuc2lnbmFsX2luZm8pOworCisgICAgICAgIHJlZnJlc2hTaWduYWxNZXRlcnMoKTsKKyAgICAgICAgcmVmcmVzaEJsdWV0b290aCgpOworICAgICAgICByZWZyZXNoR3BzKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgb25EZXRhY2hlZEZyb21XaW5kb3coKSB7CisgICAgICAgIGdldENvbnRleHQoKS51bnJlZ2lzdGVyUmVjZWl2ZXIobVJlY2VpdmVyKTsKKyAgICB9CisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vICAgIHByaXZhdGUgYm9vbGVhbiBpc0F1dG9CcmlnaHRuZXNzKCkgeworLy8gICAgICAgIENvbnRleHQgY29udGV4dCA9IGdldENvbnRleHQoKTsKKy8vICAgICAgICB0cnkgeworLy8gICAgICAgICAgICBJUG93ZXJNYW5hZ2VyIHBvd2VyID0gSVBvd2VyTWFuYWdlci5TdHViLmFzSW50ZXJmYWNlKAorLy8gICAgICAgICAgICAgICAgICAgIFNlcnZpY2VNYW5hZ2VyLmdldFNlcnZpY2UoInBvd2VyIikpOworLy8gICAgICAgICAgICBpZiAocG93ZXIgIT0gbnVsbCkgeworLy8gICAgICAgICAgICAgICAgaW50IGJyaWdodG5lc3NNb2RlID0gU2V0dGluZ3MuU3lzdGVtLmdldEludChjb250ZXh0LmdldENvbnRlbnRSZXNvbHZlcigpLAorLy8gICAgICAgICAgICAgICAgICAgICAgICBTZXR0aW5ncy5TeXN0ZW0uU0NSRUVOX0JSSUdIVE5FU1NfTU9ERSk7CisvLyAgICAgICAgICAgICAgICByZXR1cm4gYnJpZ2h0bmVzc01vZGUgPT0gU2V0dGluZ3MuU3lzdGVtLlNDUkVFTl9CUklHSFRORVNTX01PREVfQVVUT01BVElDOworLy8gICAgICAgICAgICB9CisvLyAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKy8vICAgICAgICB9IGNhdGNoIChTZXR0aW5ncy5TZXR0aW5nTm90Rm91bmRFeGNlcHRpb24gZSkgeworLy8gICAgICAgIH0KKy8vICAgICAgICByZXR1cm4gZmFsc2U7CisvLyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgcm90YXRlQnJpZ2h0bmVzcygpIHsKKyAgICAgICAgaW50IGljb24gPSBSLmRyYXdhYmxlLmljX3N5c2Jhcl9icmlnaHRuZXNzOworICAgICAgICBpbnQgYmcgPSBSLmRyYXdhYmxlLnN5c2Jhcl90b2dnbGVfYmdfb247CisgICAgICAgIENvbnRleHQgY29udGV4dCA9IGdldENvbnRleHQoKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIElQb3dlck1hbmFnZXIgcG93ZXIgPSBJUG93ZXJNYW5hZ2VyLlN0dWIuYXNJbnRlcmZhY2UoCisgICAgICAgICAgICAgICAgICAgIFNlcnZpY2VNYW5hZ2VyLmdldFNlcnZpY2UoInBvd2VyIikpOworICAgICAgICAgICAgaWYgKHBvd2VyICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBDb250ZW50UmVzb2x2ZXIgY3IgPSBjb250ZXh0LmdldENvbnRlbnRSZXNvbHZlcigpOworICAgICAgICAgICAgICAgIGludCBicmlnaHRuZXNzID0gU2V0dGluZ3MuU3lzdGVtLmdldEludChjciwKKyAgICAgICAgICAgICAgICAgICAgICAgIFNldHRpbmdzLlN5c3RlbS5TQ1JFRU5fQlJJR0hUTkVTUyk7CisgICAgICAgICAgICAgICAgaW50IGJyaWdodG5lc3NNb2RlID0gU2V0dGluZ3MuU3lzdGVtLlNDUkVFTl9CUklHSFRORVNTX01PREVfTUFOVUFMOworICAgICAgICAgICAgICAgIC8vT25seSBnZXQgYnJpZ2h0bmVzcyBzZXR0aW5nIGlmIGF2YWlsYWJsZQorICAgICAgICAgICAgICAgIGlmIChjb250ZXh0LmdldFJlc291cmNlcygpLmdldEJvb2xlYW4oCisgICAgICAgICAgICAgICAgICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmJvb2wuY29uZmlnX2F1dG9tYXRpY19icmlnaHRuZXNzX2F2YWlsYWJsZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgYnJpZ2h0bmVzc01vZGUgPSBTZXR0aW5ncy5TeXN0ZW0uZ2V0SW50KGNyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNldHRpbmdzLlN5c3RlbS5TQ1JFRU5fQlJJR0hUTkVTU19NT0RFKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvLyBSb3RhdGUgQVVUTyAtPiBNSU5JTVVNIC0+IERFRkFVTFQgLT4gTUFYSU1VTQorICAgICAgICAgICAgICAgIC8vIFRlY2huaWNhbGx5LCBub3QgYSB0b2dnbGUuLi4KKyAgICAgICAgICAgICAgICBpZiAoYnJpZ2h0bmVzc01vZGUgPT0gU2V0dGluZ3MuU3lzdGVtLlNDUkVFTl9CUklHSFRORVNTX01PREVfQVVUT01BVElDKSB7CisgICAgICAgICAgICAgICAgICAgIGJyaWdodG5lc3MgPSBNSU5JTVVNX0JBQ0tMSUdIVDsKKyAgICAgICAgICAgICAgICAgICAgaWNvbiA9IFIuZHJhd2FibGUuaWNfc3lzYmFyX2JyaWdodG5lc3NfbG93OworICAgICAgICAgICAgICAgICAgICBicmlnaHRuZXNzTW9kZSA9IFNldHRpbmdzLlN5c3RlbS5TQ1JFRU5fQlJJR0hUTkVTU19NT0RFX01BTlVBTDsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGJyaWdodG5lc3MgPCBERUZBVUxUX0JBQ0tMSUdIVCkgeworICAgICAgICAgICAgICAgICAgICBicmlnaHRuZXNzID0gREVGQVVMVF9CQUNLTElHSFQ7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChicmlnaHRuZXNzIDwgTUFYSU1VTV9CQUNLTElHSFQpIHsKKyAgICAgICAgICAgICAgICAgICAgYnJpZ2h0bmVzcyA9IE1BWElNVU1fQkFDS0xJR0hUOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGJyaWdodG5lc3NNb2RlID0gU2V0dGluZ3MuU3lzdGVtLlNDUkVFTl9CUklHSFRORVNTX01PREVfQVVUT01BVElDOworICAgICAgICAgICAgICAgICAgICBicmlnaHRuZXNzID0gTUlOSU1VTV9CQUNLTElHSFQ7CisgICAgICAgICAgICAgICAgICAgIGljb24gPSBSLmRyYXdhYmxlLmljX3N5c2Jhcl9icmlnaHRuZXNzX2F1dG87CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKGNvbnRleHQuZ2V0UmVzb3VyY2VzKCkuZ2V0Qm9vbGVhbigKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuYm9vbC5jb25maWdfYXV0b21hdGljX2JyaWdodG5lc3NfYXZhaWxhYmxlKSkgeworICAgICAgICAgICAgICAgICAgICAvLyBTZXQgc2NyZWVuIGJyaWdodG5lc3MgbW9kZSAoYXV0b21hdGljIG9yIG1hbnVhbCkKKyAgICAgICAgICAgICAgICAgICAgU2V0dGluZ3MuU3lzdGVtLnB1dEludChjb250ZXh0LmdldENvbnRlbnRSZXNvbHZlcigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNldHRpbmdzLlN5c3RlbS5TQ1JFRU5fQlJJR0hUTkVTU19NT0RFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyaWdodG5lc3NNb2RlKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAvLyBNYWtlIHN1cmUgd2Ugc2V0IHRoZSBicmlnaHRuZXNzIGlmIGF1dG9tYXRpYyBtb2RlIGlzbid0IGF2YWlsYWJsZQorICAgICAgICAgICAgICAgICAgICBicmlnaHRuZXNzTW9kZSA9IFNldHRpbmdzLlN5c3RlbS5TQ1JFRU5fQlJJR0hUTkVTU19NT0RFX01BTlVBTDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGJyaWdodG5lc3NNb2RlID09IFNldHRpbmdzLlN5c3RlbS5TQ1JFRU5fQlJJR0hUTkVTU19NT0RFX01BTlVBTCkgeworICAgICAgICAgICAgICAgICAgICBwb3dlci5zZXRCYWNrbGlnaHRCcmlnaHRuZXNzKGJyaWdodG5lc3MpOworICAgICAgICAgICAgICAgICAgICBTZXR0aW5ncy5TeXN0ZW0ucHV0SW50KGNyLCBTZXR0aW5ncy5TeXN0ZW0uU0NSRUVOX0JSSUdIVE5FU1MsIGJyaWdodG5lc3MpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgfSBjYXRjaCAoU2V0dGluZ3MuU2V0dGluZ05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgfQorCisgICAgICAgIG1CcmlnaHRuZXNzQnV0dG9uLnNldEltYWdlUmVzb3VyY2UoaWNvbik7CisgICAgICAgIG1CcmlnaHRuZXNzQnV0dG9uLnNldEJhY2tncm91bmRSZXNvdXJjZShiZyk7CisgICAgfQorCisgICAgUGhvbmVTdGF0ZUxpc3RlbmVyIG1QaG9uZVN0YXRlTGlzdGVuZXIgPSBuZXcgUGhvbmVTdGF0ZUxpc3RlbmVyKCkgeworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgb25TZXJ2aWNlU3RhdGVDaGFuZ2VkKFNlcnZpY2VTdGF0ZSBzZXJ2aWNlU3RhdGUpIHsKKyAgICAgICAgICAgIGlmIChERUJVR19TSUdOQUwgfHwgREVCVUcpIHsKKyAgICAgICAgICAgICAgICBTbG9nLmQoVEFHLCAicGhvbmUgc2VydmljZSBzdGF0ZSBjaGFuZ2VkOiAiICsgc2VydmljZVN0YXRlLmdldFN0YXRlKCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbVNlcnZpY2VTdGF0ZSA9IHNlcnZpY2VTdGF0ZTsKKyAgICAgICAgICAgIG1BaXJwbGFuZU1vZGUgPSBzZXJ2aWNlU3RhdGUuZ2V0U3RhdGUoKSA9PSBTZXJ2aWNlU3RhdGUuU1RBVEVfUE9XRVJfT0ZGOworICAgICAgICAgICAgaWYgKG1BaXJwbGFuZUJ1dHRvbiAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgbUFpcnBsYW5lQnV0dG9uLnNldEltYWdlUmVzb3VyY2UobUFpcnBsYW5lTW9kZSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IFIuZHJhd2FibGUuaWNfc3lzYmFyX2FpcnBsYW5lX29uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBSLmRyYXdhYmxlLmljX3N5c2Jhcl9haXJwbGFuZV9vZmYpOworICAgICAgICAgICAgICAgIG1BaXJwbGFuZUJ1dHRvbi5zZXRCYWNrZ3JvdW5kUmVzb3VyY2UobUFpcnBsYW5lTW9kZSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IFIuZHJhd2FibGUuc3lzYmFyX3RvZ2dsZV9iZ19vbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogUi5kcmF3YWJsZS5zeXNiYXJfdG9nZ2xlX2JnX29mZik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB1cGRhdGVEYXRhU3RhdGUoKTsKKyAgICAgICAgfQorICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgb25TaWduYWxTdHJlbmd0aHNDaGFuZ2VkKFNpZ25hbFN0cmVuZ3RoIHNpZ25hbFN0cmVuZ3RoKSB7CisgICAgICAgICAgICBpZiAoREVCVUdfU0lHTkFMIHx8IERFQlVHKSB7CisgICAgICAgICAgICAgICAgU2xvZy5kKFRBRywgIm9uU2lnbmFsU3RyZW5ndGhzQ2hhbmdlZDogIiArIHNpZ25hbFN0cmVuZ3RoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1TaWduYWxTdHJlbmd0aCA9IHNpZ25hbFN0cmVuZ3RoOworICAgICAgICAgICAgdXBkYXRlRGF0YVN0YXRlKCk7CisgICAgICAgIH0KKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIG9uQ2FsbFN0YXRlQ2hhbmdlZChpbnQgc3RhdGUsIFN0cmluZyBpbmNvbWluZ051bWJlcikgeworICAgICAgICAgICAgbVBob25lU3RhdGUgPSBzdGF0ZTsKKyAgICAgICAgICAgIC8vIEluIGNkbWEsIGlmIGEgdm9pY2UgY2FsbCBpcyBtYWRlLCBSU1NJIHNob3VsZCBzd2l0Y2ggdG8gMXguCisgICAgICAgICAgICBpZiAoaXNDZG1hKCkpIHsKKyAgICAgICAgICAgICAgICB1cGRhdGVEYXRhU3RhdGUoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBvbkRhdGFDb25uZWN0aW9uU3RhdGVDaGFuZ2VkKGludCBzdGF0ZSwgaW50IG5ldHdvcmtUeXBlKSB7CisgICAgICAgICAgICBpZiAoREVCVUdfU0lHTkFMIHx8IERFQlVHKSB7CisgICAgICAgICAgICAgICAgU2xvZy5kKFRBRywgIm9uRGF0YUNvbm5lY3Rpb25TdGF0ZUNoYW5nZWQ6IHN0YXRlPSIgKyBzdGF0ZSAKKyAgICAgICAgICAgICAgICAgICAgICAgICsgIiB0eXBlPSIgKyBuZXR3b3JrVHlwZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtRGF0YVN0YXRlID0gc3RhdGU7CisvLyAgICAgICAgICAgIHVwZGF0ZURhdGFOZXRUeXBlKG5ldHdvcmtUeXBlKTsKKyAgICAgICAgICAgIHVwZGF0ZURhdGFTdGF0ZSgpOworICAgICAgICB9CisgICAgfTsKKworICAgIHByaXZhdGUgYm9vbGVhbiBnZXRBaXJwbGFuZU1vZGUoKSB7CisgICAgICAgIHJldHVybiBtQWlycGxhbmVNb2RlOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBzZXRBaXJwbGFuZU1vZGUoYm9vbGVhbiBvbikgeworICAgICAgICBTZXR0aW5ncy5TeXN0ZW0ucHV0SW50KAorICAgICAgICAgICAgICAgIG1Db250ZXh0LmdldENvbnRlbnRSZXNvbHZlcigpLAorICAgICAgICAgICAgICAgIFNldHRpbmdzLlN5c3RlbS5BSVJQTEFORV9NT0RFX09OLAorICAgICAgICAgICAgICAgIG9uID8gMSA6IDApOworICAgICAgICBJbnRlbnQgaW50ZW50ID0gbmV3IEludGVudChJbnRlbnQuQUNUSU9OX0FJUlBMQU5FX01PREVfQ0hBTkdFRCk7CisgICAgICAgIGludGVudC5hZGRGbGFncyhJbnRlbnQuRkxBR19SRUNFSVZFUl9SRVBMQUNFX1BFTkRJTkcpOworICAgICAgICBpbnRlbnQucHV0RXh0cmEoInN0YXRlIiwgb24pOworICAgICAgICBnZXRDb250ZXh0KCkuc2VuZEJyb2FkY2FzdChpbnRlbnQpOworICAgIH0KKworICAgIGJvb2xlYW4gZ2V0U2lsZW50TW9kZSgpIHsKKyAgICAgICAgcmV0dXJuIG1BdWRpb01hbmFnZXIuZ2V0UmluZ2VyTW9kZSgpICE9IEF1ZGlvTWFuYWdlci5SSU5HRVJfTU9ERV9OT1JNQUw7CisgICAgfQorCisgICAgdm9pZCBzZXRTaWxlbnRNb2RlKGJvb2xlYW4gb24pIHsKKyAgICAgICAgaWYgKG9uKSB7CisgICAgICAgICAgICBtQXVkaW9NYW5hZ2VyLnNldFJpbmdlck1vZGUoKFNldHRpbmdzLlN5c3RlbS5nZXRJbnQobUNvbnRleHQuZ2V0Q29udGVudFJlc29sdmVyKCksCisgICAgICAgICAgICAgICAgU2V0dGluZ3MuU3lzdGVtLlZJQlJBVEVfSU5fU0lMRU5ULCAxKSA9PSAxKQorICAgICAgICAgICAgICAgID8gQXVkaW9NYW5hZ2VyLlJJTkdFUl9NT0RFX1ZJQlJBVEUKKyAgICAgICAgICAgICAgICA6IEF1ZGlvTWFuYWdlci5SSU5HRVJfTU9ERV9TSUxFTlQpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbUF1ZGlvTWFuYWdlci5zZXRSaW5nZXJNb2RlKEF1ZGlvTWFuYWdlci5SSU5HRVJfTU9ERV9OT1JNQUwpOworICAgICAgICB9CisgICAgfQorCisgICAgdm9pZCByZWZyZXNoU291bmQoKSB7CisgICAgICAgIGJvb2xlYW4gc2lsZW50ID0gZ2V0U2lsZW50TW9kZSgpOworICAgICAgICBtU291bmRCdXR0b24uc2V0SW1hZ2VSZXNvdXJjZSghc2lsZW50IAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IFIuZHJhd2FibGUuaWNfc3lzYmFyX3NvdW5kX29uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogUi5kcmF3YWJsZS5pY19zeXNiYXJfc291bmRfb2ZmKTsKKyAgICAgICAgbVNvdW5kQnV0dG9uLnNldEJhY2tncm91bmRSZXNvdXJjZSghc2lsZW50IAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IFIuZHJhd2FibGUuc3lzYmFyX3RvZ2dsZV9iZ19vbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IFIuZHJhd2FibGUuc3lzYmFyX3RvZ2dsZV9iZ19vZmYpOworICAgIH0KKworICAgIHZvaWQgdG9nZ2xlQmx1ZXRvb3RoKCkgeworICAgICAgICBpZiAobUJsdWV0b290aEFkYXB0ZXIgPT0gbnVsbCkgcmV0dXJuOworICAgICAgICBpZiAobUJsdWV0b290aEFkYXB0ZXIuaXNFbmFibGVkKCkpIHsKKyAgICAgICAgICAgIG1CbHVldG9vdGhBZGFwdGVyLmRpc2FibGUoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1CbHVldG9vdGhBZGFwdGVyLmVuYWJsZSgpOworICAgICAgICB9CisgICAgfQorCisgICAgdm9pZCByZWZyZXNoQmx1ZXRvb3RoKCkgeworICAgICAgICBib29sZWFuIG9uID0gbUJsdWV0b290aEFkYXB0ZXIgIT0gbnVsbCAmJiBtQmx1ZXRvb3RoQWRhcHRlci5pc0VuYWJsZWQoKTsKKyAgICAgICAgbUJsdWV0b290aEJ1dHRvbi5zZXRJbWFnZVJlc291cmNlKG9uID8gUi5kcmF3YWJsZS5pY19zeXNiYXJfYmx1ZXRvb3RoX29uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IFIuZHJhd2FibGUuaWNfc3lzYmFyX2JsdWV0b290aF9vZmYpOworICAgICAgICBtQmx1ZXRvb3RoQnV0dG9uLnNldEJhY2tncm91bmRSZXNvdXJjZShvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IFIuZHJhd2FibGUuc3lzYmFyX3RvZ2dsZV9iZ19vbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IFIuZHJhd2FibGUuc3lzYmFyX3RvZ2dsZV9iZ19vZmYpOworICAgIH0KKworICAgIHByaXZhdGUgYm9vbGVhbiBpc0dwc0VuYWJsZWQoKSB7CisgICAgICAgIENvbnRlbnRSZXNvbHZlciByZXMgPSBtQ29udGV4dC5nZXRDb250ZW50UmVzb2x2ZXIoKTsKKyAgICAgICAgcmV0dXJuIFNldHRpbmdzLlNlY3VyZS5pc0xvY2F0aW9uUHJvdmlkZXJFbmFibGVkKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXMsIExvY2F0aW9uTWFuYWdlci5HUFNfUFJPVklERVIpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCB0b2dnbGVHcHMoKSB7CisgICAgICAgIFNldHRpbmdzLlNlY3VyZS5zZXRMb2NhdGlvblByb3ZpZGVyRW5hYmxlZChtQ29udGV4dC5nZXRDb250ZW50UmVzb2x2ZXIoKSwKKyAgICAgICAgICAgICAgICBMb2NhdGlvbk1hbmFnZXIuR1BTX1BST1ZJREVSLCAhaXNHcHNFbmFibGVkKCkpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCByZWZyZXNoR3BzKCkgeworICAgICAgICBib29sZWFuIG9uID0gaXNHcHNFbmFibGVkKCk7CisgICAgICAgIG1HcHNCdXR0b24uc2V0SW1hZ2VSZXNvdXJjZShvbiA/IFIuZHJhd2FibGUuaWNfc3lzYmFyX2dwc19vbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBSLmRyYXdhYmxlLmljX3N5c2Jhcl9ncHNfb2ZmKTsKKyAgICAgICAgbUdwc0J1dHRvbi5zZXRCYWNrZ3JvdW5kUmVzb3VyY2Uob24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBSLmRyYXdhYmxlLnN5c2Jhcl90b2dnbGVfYmdfb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBSLmRyYXdhYmxlLnN5c2Jhcl90b2dnbGVfYmdfb2ZmKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvc3RhdHVzYmFyL3RhYmxldC9UYWJsZXRTdGF0dXNCYXJTZXJ2aWNlLmphdmEgYi9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvc3RhdHVzYmFyL3RhYmxldC9UYWJsZXRTdGF0dXNCYXJTZXJ2aWNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWJhMWZhYgotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9zdGF0dXNiYXIvdGFibGV0L1RhYmxldFN0YXR1c0JhclNlcnZpY2UuamF2YQpAQCAtMCwwICsxLDc3NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQuc3lzdGVtdWkuc3RhdHVzYmFyLnRhYmxldDsKKworaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5TWFuYWdlck5hdGl2ZTsKK2ltcG9ydCBhbmRyb2lkLmFwcC5QZW5kaW5nSW50ZW50OworaW1wb3J0IGFuZHJvaWQuYXBwLlN0YXR1c0Jhck1hbmFnZXI7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlJlc291cmNlczsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlBpeGVsRm9ybWF0OworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUmVjdDsKK2ltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5JQmluZGVyOworaW1wb3J0IGFuZHJvaWQub3MuTWVzc2FnZTsKK2ltcG9ydCBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbjsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuU2xvZzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuYW5pbWF0aW9uLkFuaW1hdGlvblV0aWxzOworaW1wb3J0IGFuZHJvaWQudmlldy5HcmF2aXR5OworaW1wb3J0IGFuZHJvaWQudmlldy5MYXlvdXRJbmZsYXRlcjsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlld0dyb3VwOworaW1wb3J0IGFuZHJvaWQudmlldy5XaW5kb3dNYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQudmlldy5XaW5kb3dNYW5hZ2VySW1wbDsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5JbWFnZVZpZXc7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuTGluZWFyTGF5b3V0OworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlJlbW90ZVZpZXdzOworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlNjcm9sbFZpZXc7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuVGV4dFN3aXRjaGVyOworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlRleHRWaWV3OworCitpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwuc3RhdHVzYmFyLlN0YXR1c0Jhckljb247CitpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwuc3RhdHVzYmFyLlN0YXR1c0Jhck5vdGlmaWNhdGlvbjsKKworaW1wb3J0IGNvbS5hbmRyb2lkLnN5c3RlbXVpLnN0YXR1c2Jhci4qOworaW1wb3J0IGNvbS5hbmRyb2lkLnN5c3RlbXVpLnJlY2VudC5SZWNlbnRBcHBsaWNhdGlvbnNBY3Rpdml0eTsKK2ltcG9ydCBjb20uYW5kcm9pZC5zeXN0ZW11aS5SOworCitwdWJsaWMgY2xhc3MgVGFibGV0U3RhdHVzQmFyU2VydmljZSBleHRlbmRzIFN0YXR1c0JhclNlcnZpY2UgeworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVRyA9IGZhbHNlOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJUYWJsZXRTdGF0dXNCYXIiOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1BWF9JTUFHRV9MRVZFTCA9IDEwMDAwOworCisgICAgaW50IG1JY29uU2l6ZTsKKworICAgIEggbUhhbmRsZXIgPSBuZXcgSCgpOworCisgICAgLy8gdHJhY2tpbmcgYWxsIGN1cnJlbnQgbm90aWZpY2F0aW9ucworICAgIHByaXZhdGUgTm90aWZpY2F0aW9uRGF0YSBtTm90bnMgPSBuZXcgTm90aWZpY2F0aW9uRGF0YSgpOworICAgIAorICAgIFZpZXcgbVN0YXR1c0JhclZpZXc7CisgICAgTm90aWZpY2F0aW9uSWNvbkFyZWEgbU5vdGlmaWNhdGlvbkljb25BcmVhOworCisgICAgVmlldyBtTm90aWZpY2F0aW9uUGFuZWw7CisgICAgU3lzdGVtUGFuZWwgbVN5c3RlbVBhbmVsOworCisgICAgVmlld0dyb3VwIG1QaWxlOworICAgIFRleHRWaWV3IG1DbGVhckJ1dHRvbjsKKworICAgIEltYWdlVmlldyBtQmF0dGVyeU1ldGVyOworICAgIEltYWdlVmlldyBtU2lnbmFsTWV0ZXI7CisgICAgSW1hZ2VWaWV3IG1TaWduYWxJY29uOworCisgICAgVmlldyBtQmFyQ29udGVudHM7CisgICAgVmlldyBtQ3VydGFpbnM7CisKKyAgICBOb3RpZmljYXRpb25JY29uQXJlYS5JY29uTGF5b3V0IG1JY29uTGF5b3V0OworCisgICAgS2lja2VyQ29udHJvbGxlciBtS2lja2VyOworICAgIFZpZXcgbUtpY2tlclZpZXc7CisgICAgYm9vbGVhbiBtVGlja2luZzsKKyAgICBib29sZWFuIG1FeHBhbmRlZFZpc2libGU7CisKKyAgICAvLyBmb3IgZGlzYWJsaW5nIHRoZSBzdGF0dXMgYmFyCisgICAgaW50IG1EaXNhYmxlZCA9IDA7CisKKyAgICBwcm90ZWN0ZWQgdm9pZCBhZGRQYW5lbFdpbmRvd3MoKSB7CisgICAgICAgIGZpbmFsIFJlc291cmNlcyByZXMgPSBnZXRSZXNvdXJjZXMoKTsKKyAgICAgICAgZmluYWwgaW50IGJhckhlaWdodD0gcmVzLmdldERpbWVuc2lvblBpeGVsU2l6ZSgKKyAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuZGltZW4uc3RhdHVzX2Jhcl9oZWlnaHQpOworCisgICAgICAgIG1Ob3RpZmljYXRpb25QYW5lbCA9IFZpZXcuaW5mbGF0ZSh0aGlzLCBSLmxheW91dC5zeXNiYXJfcGFuZWxfbm90aWZpY2F0aW9ucywgbnVsbCk7CisgICAgICAgIG1Ob3RpZmljYXRpb25QYW5lbC5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7CisKKyAgICAgICAgV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMgbHAgPSBuZXcgV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMoCisgICAgICAgICAgICAgICAgNDAwLCAvLyBWaWV3R3JvdXAuTGF5b3V0UGFyYW1zLldSQVBfQ09OVEVOVCwKKyAgICAgICAgICAgICAgICBWaWV3R3JvdXAuTGF5b3V0UGFyYW1zLldSQVBfQ09OVEVOVCwKKyAgICAgICAgICAgICAgICBXaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcy5UWVBFX1NUQVRVU19CQVJfUEFORUwsCisgICAgICAgICAgICAgICAgV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMuRkxBR19MQVlPVVRfSU5fU0NSRUVOCisgICAgICAgICAgICAgICAgICAgIHwgV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMuRkxBR19OT1RfVE9VQ0hfTU9EQUwKKyAgICAgICAgICAgICAgICAgICAgfCBXaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcy5GTEFHX1dBVENIX09VVFNJREVfVE9VQ0gKKyAgICAgICAgICAgICAgICAgICAgfCBXaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcy5GTEFHX05PVF9GT0NVU0FCTEUKKyAgICAgICAgICAgICAgICAgICAgfCBXaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcy5GTEFHX0FMVF9GT0NVU0FCTEVfSU0sCisgICAgICAgICAgICAgICAgUGl4ZWxGb3JtYXQuVFJBTlNMVUNFTlQpOworICAgICAgICBscC5ncmF2aXR5ID0gR3Jhdml0eS5CT1RUT00gfCBHcmF2aXR5LkxFRlQ7CisgICAgICAgIGxwLnNldFRpdGxlKCJOb3RpZmljYXRpb25QYW5lbCIpOworICAgICAgICBscC53aW5kb3dBbmltYXRpb25zID0gY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZS5BbmltYXRpb25fU2xpZGluZ0NhcmQ7CisKKyAgICAgICAgV2luZG93TWFuYWdlckltcGwuZ2V0RGVmYXVsdCgpLmFkZFZpZXcobU5vdGlmaWNhdGlvblBhbmVsLCBscCk7CisKKyAgICAgICAgbVN5c3RlbVBhbmVsID0gKFN5c3RlbVBhbmVsKSBWaWV3LmluZmxhdGUodGhpcywgUi5sYXlvdXQuc3lzYmFyX3BhbmVsX3N5c3RlbSwgbnVsbCk7CisgICAgICAgIG1TeXN0ZW1QYW5lbC5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7CisKKyAgICAgICAgbHAgPSBuZXcgV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMoCisgICAgICAgICAgICAgICAgODAwLAorICAgICAgICAgICAgICAgIFZpZXdHcm91cC5MYXlvdXRQYXJhbXMuV1JBUF9DT05URU5ULAorICAgICAgICAgICAgICAgIFdpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zLlRZUEVfU1RBVFVTX0JBUl9QQU5FTCwKKyAgICAgICAgICAgICAgICBXaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcy5GTEFHX0xBWU9VVF9JTl9TQ1JFRU4KKyAgICAgICAgICAgICAgICAgICAgfCBXaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcy5GTEFHX05PVF9UT1VDSF9NT0RBTAorICAgICAgICAgICAgICAgICAgICB8IFdpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zLkZMQUdfV0FUQ0hfT1VUU0lERV9UT1VDSAorICAgICAgICAgICAgICAgICAgICB8IFdpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zLkZMQUdfTk9UX0ZPQ1VTQUJMRQorICAgICAgICAgICAgICAgICAgICB8IFdpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zLkZMQUdfQUxUX0ZPQ1VTQUJMRV9JTSwKKyAgICAgICAgICAgICAgICBQaXhlbEZvcm1hdC5UUkFOU0xVQ0VOVCk7CisgICAgICAgIGxwLmdyYXZpdHkgPSBHcmF2aXR5LkJPVFRPTSB8IEdyYXZpdHkuQ0VOVEVSX0hPUklaT05UQUw7CisgICAgICAgIGxwLnNldFRpdGxlKCJTeXN0ZW1QYW5lbCIpOworICAgICAgICBscC53aW5kb3dBbmltYXRpb25zID0gY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZS5BbmltYXRpb25fU2xpZGluZ0NhcmQ7CisKKyAgICAgICAgV2luZG93TWFuYWdlckltcGwuZ2V0RGVmYXVsdCgpLmFkZFZpZXcobVN5c3RlbVBhbmVsLCBscCk7CisgICAgICAgIG1TeXN0ZW1QYW5lbC5zZXRCYXIodGhpcyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb25DcmVhdGUoKSB7CisgICAgICAgIHN1cGVyLm9uQ3JlYXRlKCk7IC8vIHdpbGwgYWRkIHRoZSBtYWluIGJhciB2aWV3CisgICAgfQorCisgICAgcHJvdGVjdGVkIFZpZXcgbWFrZVN0YXR1c0JhclZpZXcoKSB7CisgICAgICAgIFJlc291cmNlcyByZXMgPSBnZXRSZXNvdXJjZXMoKTsKKworICAgICAgICBtSWNvblNpemUgPSByZXMuZ2V0RGltZW5zaW9uUGl4ZWxTaXplKGNvbS5hbmRyb2lkLmludGVybmFsLlIuZGltZW4uc3RhdHVzX2Jhcl9pY29uX3NpemUpOworCisgICAgICAgIGZpbmFsIFZpZXcgc2IgPSBWaWV3LmluZmxhdGUodGhpcywgUi5sYXlvdXQuc3RhdHVzX2JhciwgbnVsbCk7CisgICAgICAgIG1TdGF0dXNCYXJWaWV3ID0gc2I7CisKKyAgICAgICAgbUJhckNvbnRlbnRzID0gc2IuZmluZFZpZXdCeUlkKFIuaWQuYmFyX2NvbnRlbnRzKTsKKyAgICAgICAgbUN1cnRhaW5zID0gc2IuZmluZFZpZXdCeUlkKFIuaWQubGlnaHRzX291dCk7CisgICAgICAgIFZpZXcgc3lzdGVtSW5mbyA9IHNiLmZpbmRWaWV3QnlJZChSLmlkLnN5c3RlbUluZm8pOworCisgICAgICAgIHN5c3RlbUluZm8uc2V0T25Mb25nQ2xpY2tMaXN0ZW5lcihuZXcgU2V0TGlnaHRzT25MaXN0ZW5lcihmYWxzZSkpOworCisgICAgICAgIFNldExpZ2h0c09uTGlzdGVuZXIgb24gPSBuZXcgU2V0TGlnaHRzT25MaXN0ZW5lcih0cnVlKTsKKyAgICAgICAgbUN1cnRhaW5zLnNldE9uQ2xpY2tMaXN0ZW5lcihvbik7CisgICAgICAgIG1DdXJ0YWlucy5zZXRPbkxvbmdDbGlja0xpc3RlbmVyKG9uKTsKKworICAgICAgICAvLyB0aGUgbW9yZSBub3RpZmljYXRpb25zIGljb24KKyAgICAgICAgbU5vdGlmaWNhdGlvbkljb25BcmVhID0gKE5vdGlmaWNhdGlvbkljb25BcmVhKXNiLmZpbmRWaWV3QnlJZChSLmlkLm5vdGlmaWNhdGlvbkljb25zKTsKKworICAgICAgICAvLyB3aGVyZSB0aGUgaWNvbnMgZ28KKyAgICAgICAgbUljb25MYXlvdXQgPSAoTm90aWZpY2F0aW9uSWNvbkFyZWEuSWNvbkxheW91dCkgc2IuZmluZFZpZXdCeUlkKFIuaWQuaWNvbnMpOworCisgICAgICAgIG1LaWNrZXIgPSBuZXcgS2lja2VyQ29udHJvbGxlcigoQ29udGV4dCl0aGlzLCBtU3RhdHVzQmFyVmlldyk7CisKKyAgICAgICAgLy8gU3lzdGVtIGluZm8gKGNlbnRlcikKKyAgICAgICAgbUJhdHRlcnlNZXRlciA9IChJbWFnZVZpZXcpIHNiLmZpbmRWaWV3QnlJZChSLmlkLmJhdHRlcnkpOworICAgICAgICBtU2lnbmFsTWV0ZXIgPSAoSW1hZ2VWaWV3KSBzYi5maW5kVmlld0J5SWQoUi5pZC5zaWduYWwpOworICAgICAgICBtU2lnbmFsSWNvbiA9IChJbWFnZVZpZXcpIHNiLmZpbmRWaWV3QnlJZChSLmlkLnNpZ25hbF9pY29uKTsKKworICAgICAgICAvLyBBZGQgdGhlIHdpbmRvd3MKKyAgICAgICAgYWRkUGFuZWxXaW5kb3dzKCk7CisKKyAgICAgICAgbVBpbGUgPSAoVmlld0dyb3VwKW1Ob3RpZmljYXRpb25QYW5lbC5maW5kVmlld0J5SWQoUi5pZC5jb250ZW50KTsKKyAgICAgICAgbVBpbGUucmVtb3ZlQWxsVmlld3MoKTsKKyAgICAgICAgCisgICAgICAgIFNjcm9sbFZpZXcgc2Nyb2xsZXIgPSAoU2Nyb2xsVmlldyltUGlsZS5nZXRQYXJlbnQoKTsKKyAgICAgICAgc2Nyb2xsZXIuc2V0RmlsbFZpZXdwb3J0KHRydWUpOworCisgICAgICAgIG1DbGVhckJ1dHRvbiA9IChUZXh0VmlldyltTm90aWZpY2F0aW9uUGFuZWwuZmluZFZpZXdCeUlkKFIuaWQuY2xlYXJfYWxsX2J1dHRvbik7CisgICAgICAgIG1DbGVhckJ1dHRvbi5zZXRPbkNsaWNrTGlzdGVuZXIobUNsZWFyQnV0dG9uTGlzdGVuZXIpOworCisgICAgICAgIHJldHVybiBzYjsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgaW50IGdldFN0YXR1c0JhckdyYXZpdHkoKSB7CisgICAgICAgIHJldHVybiBHcmF2aXR5LkJPVFRPTSB8IEdyYXZpdHkuRklMTF9IT1JJWk9OVEFMOworICAgIH0KKworICAgIHByaXZhdGUgY2xhc3MgSCBleHRlbmRzIEhhbmRsZXIgeworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNU0dfT1BFTl9OT1RJRklDQVRJT05fUEFORUwgPSAxMDAwOworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNU0dfQ0xPU0VfTk9USUZJQ0FUSU9OX1BBTkVMID0gMTAwMTsKKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTVNHX09QRU5fU1lTVEVNX1BBTkVMID0gMTAxMDsKKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTVNHX0NMT1NFX1NZU1RFTV9QQU5FTCA9IDEwMTE7CisgICAgICAgIHB1YmxpYyB2b2lkIGhhbmRsZU1lc3NhZ2UoTWVzc2FnZSBtKSB7CisgICAgICAgICAgICBzd2l0Y2ggKG0ud2hhdCkgeworICAgICAgICAgICAgICAgIGNhc2UgTVNHX09QRU5fTk9USUZJQ0FUSU9OX1BBTkVMOgorICAgICAgICAgICAgICAgICAgICBpZiAoREVCVUcpIFNsb2cuZChUQUcsICJvcGVuaW5nIG5vdGlmaWNhdGlvbnMgcGFuZWwiKTsKKyAgICAgICAgICAgICAgICAgICAgbU5vdGlmaWNhdGlvblBhbmVsLnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKKyAgICAgICAgICAgICAgICAgICAgbUV4cGFuZGVkVmlzaWJsZSA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgTVNHX0NMT1NFX05PVElGSUNBVElPTl9QQU5FTDoKKyAgICAgICAgICAgICAgICAgICAgaWYgKERFQlVHKSBTbG9nLmQoVEFHLCAiY2xvc2luZyBub3RpZmljYXRpb25zIHBhbmVsIik7CisgICAgICAgICAgICAgICAgICAgIG1Ob3RpZmljYXRpb25QYW5lbC5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7CisgICAgICAgICAgICAgICAgICAgIG1FeHBhbmRlZFZpc2libGUgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBNU0dfT1BFTl9TWVNURU1fUEFORUw6CisgICAgICAgICAgICAgICAgICAgIGlmIChERUJVRykgU2xvZy5kKFRBRywgIm9wZW5pbmcgc3lzdGVtIHBhbmVsIik7CisgICAgICAgICAgICAgICAgICAgIG1TeXN0ZW1QYW5lbC5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgTVNHX0NMT1NFX1NZU1RFTV9QQU5FTDoKKyAgICAgICAgICAgICAgICAgICAgaWYgKERFQlVHKSBTbG9nLmQoVEFHLCAiY2xvc2luZyBzeXN0ZW0gcGFuZWwiKTsKKyAgICAgICAgICAgICAgICAgICAgbVN5c3RlbVBhbmVsLnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgcHVibGljIHZvaWQgc2V0QmF0dGVyeU1ldGVyKGludCBsZXZlbCwgYm9vbGVhbiBwbHVnZ2VkKSB7CisgICAgICAgIGlmIChERUJVRykgU2xvZy5kKFRBRywgImJhdHRlcnk9IiArIGxldmVsICsgKHBsdWdnZWQgPyAiIC0gcGx1Z2dlZCIgOiAiIC0gdW5wbHVnZ2VkIikpOworICAgICAgICBtQmF0dGVyeU1ldGVyLnNldEltYWdlUmVzb3VyY2UoUi5kcmF3YWJsZS5zeXNiYXJfYmF0dGVyeW1pbmkpOworICAgICAgICAvLyBhZGp1c3QgcGVyY2VudCB0byBwZXJteXJpYWQgZm9yIENsaXBEcmF3YWJsZSdzIHNha2UKKyAgICAgICAgbUJhdHRlcnlNZXRlci5zZXRJbWFnZUxldmVsKGxldmVsICogKE1BWF9JTUFHRV9MRVZFTCAvIDEwMCkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFNpZ25hbE1ldGVyKGludCBsZXZlbCwgYm9vbGVhbiBpc1dpZmkpIHsKKyAgICAgICAgaWYgKERFQlVHKSBTbG9nLmQoVEFHLCAic2lnbmFsPSIgKyBsZXZlbCk7CisgICAgICAgIGlmIChsZXZlbCA8IDApIHsKKyAgICAgICAgICAgIG1TaWduYWxNZXRlci5zZXRJbWFnZURyYXdhYmxlKG51bGwpOworICAgICAgICAgICAgbVNpZ25hbE1ldGVyLnNldEltYWdlTGV2ZWwoMCk7CisgICAgICAgICAgICBtU2lnbmFsSWNvbi5zZXRJbWFnZURyYXdhYmxlKG51bGwpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbVNpZ25hbE1ldGVyLnNldEltYWdlUmVzb3VyY2UoUi5kcmF3YWJsZS5zeXNiYXJfd2lmaW1pbmkpOworICAgICAgICAgICAgLy8gYWRqdXN0IHRvIHBlcm15cmlhZAorICAgICAgICAgICAgbVNpZ25hbE1ldGVyLnNldEltYWdlTGV2ZWwobGV2ZWwgKiAoTUFYX0lNQUdFX0xFVkVMIC8gMTAwKSk7CisgICAgICAgICAgICBtU2lnbmFsSWNvbi5zZXRJbWFnZVJlc291cmNlKGlzV2lmaSA/IFIuZHJhd2FibGUuaWNfc3lzYmFyX3dpZmlfbWluaSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogUi5kcmF3YWJsZS5pY19zeXNiYXJfd2lmaV9taW5pKTsgLy8gWFhYCisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBhZGRJY29uKFN0cmluZyBzbG90LCBpbnQgaW5kZXgsIGludCB2aWV3SW5kZXgsIFN0YXR1c0Jhckljb24gaWNvbikgeworICAgICAgICBpZiAoREVCVUcpIFNsb2cuZChUQUcsICJhZGRJY29uKCIgKyBzbG90ICsgIikgLT4gIiArIGljb24pOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHVwZGF0ZUljb24oU3RyaW5nIHNsb3QsIGludCBpbmRleCwgaW50IHZpZXdJbmRleCwKKyAgICAgICAgICAgIFN0YXR1c0Jhckljb24gb2xkLCBTdGF0dXNCYXJJY29uIGljb24pIHsKKyAgICAgICAgaWYgKERFQlVHKSBTbG9nLmQoVEFHLCAidXBkYXRlSWNvbigiICsgc2xvdCArICIpIC0+ICIgKyBpY29uKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCByZW1vdmVJY29uKFN0cmluZyBzbG90LCBpbnQgaW5kZXgsIGludCB2aWV3SW5kZXgpIHsKKyAgICAgICAgaWYgKERFQlVHKSBTbG9nLmQoVEFHLCAicmVtb3ZlSWNvbigiICsgc2xvdCArICIpIik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgYWRkTm90aWZpY2F0aW9uKElCaW5kZXIga2V5LCBTdGF0dXNCYXJOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7CisgICAgICAgIGlmIChERUJVRykgU2xvZy5kKFRBRywgImFkZE5vdGlmaWNhdGlvbigiICsga2V5ICsgIiAtPiAiICsgbm90aWZpY2F0aW9uICsgIikiKTsKKyAgICAgICAgYWRkTm90aWZpY2F0aW9uVmlld3Moa2V5LCBub3RpZmljYXRpb24pOworCisgICAgICAgIGJvb2xlYW4gaW1tZXJzaXZlID0gZmFsc2U7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbW1lcnNpdmUgPSBBY3Rpdml0eU1hbmFnZXJOYXRpdmUuZ2V0RGVmYXVsdCgpLmlzVG9wQWN0aXZpdHlJbW1lcnNpdmUoKTsKKyAgICAgICAgICAgIFNsb2cuZChUQUcsICJUb3AgYWN0aXZpdHkgaXMgIiArIChpbW1lcnNpdmU/ImltbWVyc2l2ZSI6Im5vdCBpbW1lcnNpdmUiKSk7CisgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBleCkgeworICAgICAgICB9CisgICAgICAgIGlmIChpbW1lcnNpdmUpIHsKKyAgICAgICAgICAgIC8vIFRPRE86IGltbWVyc2l2ZSBtb2RlIHBvcHVwcyBmb3IgdGFibGV0CisgICAgICAgIH0gZWxzZSBpZiAobm90aWZpY2F0aW9uLm5vdGlmaWNhdGlvbi5mdWxsU2NyZWVuSW50ZW50ICE9IG51bGwpIHsKKyAgICAgICAgICAgIC8vIG5vdCBpbW1lcnNpdmUgJiBhIGZ1bGwtc2NyZWVuIGFsZXJ0IHNob3VsZCBiZSBzaG93bgorICAgICAgICAgICAgU2xvZy5kKFRBRywgIk5vdGlmaWNhdGlvbiBoYXMgZnVsbFNjcmVlbkludGVudCBhbmQgYWN0aXZpdHkgaXMgbm90IGltbWVyc2l2ZTsiCisgICAgICAgICAgICAgICAgICAgICsgIiBzZW5kaW5nIGZ1bGxTY3JlZW5JbnRlbnQiKTsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgbm90aWZpY2F0aW9uLm5vdGlmaWNhdGlvbi5mdWxsU2NyZWVuSW50ZW50LnNlbmQoKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFBlbmRpbmdJbnRlbnQuQ2FuY2VsZWRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gdGljaygpCisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB1cGRhdGVOb3RpZmljYXRpb24oSUJpbmRlciBrZXksIFN0YXR1c0Jhck5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKKyAgICAgICAgaWYgKERFQlVHKSBTbG9nLmQoVEFHLCAidXBkYXRlTm90aWZpY2F0aW9uKCIgKyBrZXkgKyAiIC0+ICIgKyBub3RpZmljYXRpb24gKyAiKSAvLyBUT0RPIik7CisgICAgICAgIAorICAgICAgICBmaW5hbCBOb3RpZmljYXRpb25EYXRhLkVudHJ5IG9sZEVudHJ5ID0gbU5vdG5zLmZpbmRCeUtleShrZXkpOworICAgICAgICBpZiAob2xkRW50cnkgPT0gbnVsbCkgeworICAgICAgICAgICAgU2xvZy53KFRBRywgInVwZGF0ZU5vdGlmaWNhdGlvbiBmb3IgdW5rbm93biBrZXk6ICIgKyBrZXkpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgZmluYWwgU3RhdHVzQmFyTm90aWZpY2F0aW9uIG9sZE5vdGlmaWNhdGlvbiA9IG9sZEVudHJ5Lm5vdGlmaWNhdGlvbjsKKyAgICAgICAgZmluYWwgUmVtb3RlVmlld3Mgb2xkQ29udGVudFZpZXcgPSBvbGROb3RpZmljYXRpb24ubm90aWZpY2F0aW9uLmNvbnRlbnRWaWV3OworCisgICAgICAgIGZpbmFsIFJlbW90ZVZpZXdzIGNvbnRlbnRWaWV3ID0gbm90aWZpY2F0aW9uLm5vdGlmaWNhdGlvbi5jb250ZW50VmlldzsKKworICAgICAgICBpZiAoZmFsc2UpIHsKKyAgICAgICAgICAgIFNsb2cuZChUQUcsICJvbGQgbm90aWZpY2F0aW9uOiB3aGVuPSIgKyBvbGROb3RpZmljYXRpb24ubm90aWZpY2F0aW9uLndoZW4KKyAgICAgICAgICAgICAgICAgICAgKyAiIG9uZ29pbmc9IiArIG9sZE5vdGlmaWNhdGlvbi5pc09uZ29pbmcoKQorICAgICAgICAgICAgICAgICAgICArICIgZXhwYW5kZWQ9IiArIG9sZEVudHJ5LmV4cGFuZGVkCisgICAgICAgICAgICAgICAgICAgICsgIiBjb250ZW50Vmlldz0iICsgb2xkQ29udGVudFZpZXcpOworICAgICAgICAgICAgU2xvZy5kKFRBRywgIm5ldyBub3RpZmljYXRpb246IHdoZW49IiArIG5vdGlmaWNhdGlvbi5ub3RpZmljYXRpb24ud2hlbgorICAgICAgICAgICAgICAgICAgICArICIgb25nb2luZz0iICsgb2xkTm90aWZpY2F0aW9uLmlzT25nb2luZygpCisgICAgICAgICAgICAgICAgICAgICsgIiBjb250ZW50Vmlldz0iICsgY29udGVudFZpZXcpOworICAgICAgICB9CisKKyAgICAgICAgLy8gQ2FuIHdlIGp1c3QgcmVhcHBseSB0aGUgUmVtb3RlVmlld3MgaW4gcGxhY2U/ICBJZiB3aGVuIGRpZG4ndCBjaGFuZ2UsIHRoZSBvcmRlcgorICAgICAgICAvLyBkaWRuJ3QgY2hhbmdlLgorICAgICAgICBpZiAobm90aWZpY2F0aW9uLm5vdGlmaWNhdGlvbi53aGVuID09IG9sZE5vdGlmaWNhdGlvbi5ub3RpZmljYXRpb24ud2hlbgorICAgICAgICAgICAgICAgICYmIG5vdGlmaWNhdGlvbi5pc09uZ29pbmcoKSA9PSBvbGROb3RpZmljYXRpb24uaXNPbmdvaW5nKCkKKyAgICAgICAgICAgICAgICAmJiBvbGRFbnRyeS5leHBhbmRlZCAhPSBudWxsCisgICAgICAgICAgICAgICAgJiYgY29udGVudFZpZXcgIT0gbnVsbAorICAgICAgICAgICAgICAgICYmIG9sZENvbnRlbnRWaWV3ICE9IG51bGwKKyAgICAgICAgICAgICAgICAmJiBjb250ZW50Vmlldy5nZXRQYWNrYWdlKCkgIT0gbnVsbAorICAgICAgICAgICAgICAgICYmIG9sZENvbnRlbnRWaWV3LmdldFBhY2thZ2UoKSAhPSBudWxsCisgICAgICAgICAgICAgICAgJiYgb2xkQ29udGVudFZpZXcuZ2V0UGFja2FnZSgpLmVxdWFscyhjb250ZW50Vmlldy5nZXRQYWNrYWdlKCkpCisgICAgICAgICAgICAgICAgJiYgb2xkQ29udGVudFZpZXcuZ2V0TGF5b3V0SWQoKSA9PSBjb250ZW50Vmlldy5nZXRMYXlvdXRJZCgpKSB7CisgICAgICAgICAgICBpZiAoREVCVUcpIFNsb2cuZChUQUcsICJyZXVzaW5nIG5vdGlmaWNhdGlvbiBmb3Iga2V5OiAiICsga2V5KTsKKyAgICAgICAgICAgIG9sZEVudHJ5Lm5vdGlmaWNhdGlvbiA9IG5vdGlmaWNhdGlvbjsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgLy8gUmVhcHBseSB0aGUgUmVtb3RlVmlld3MKKyAgICAgICAgICAgICAgICBjb250ZW50Vmlldy5yZWFwcGx5KHRoaXMsIG9sZEVudHJ5LmNvbnRlbnQpOworICAgICAgICAgICAgICAgIC8vIHVwZGF0ZSB0aGUgY29udGVudEludGVudAorICAgICAgICAgICAgICAgIGZpbmFsIFBlbmRpbmdJbnRlbnQgY29udGVudEludGVudCA9IG5vdGlmaWNhdGlvbi5ub3RpZmljYXRpb24uY29udGVudEludGVudDsKKyAgICAgICAgICAgICAgICBpZiAoY29udGVudEludGVudCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIG9sZEVudHJ5LmNvbnRlbnQuc2V0T25DbGlja0xpc3RlbmVyKG5ldyBOb3RpZmljYXRpb25DbGlja2VyKGNvbnRlbnRJbnRlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vdGlmaWNhdGlvbi5wa2csIG5vdGlmaWNhdGlvbi50YWcsIG5vdGlmaWNhdGlvbi5pZCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAvLyBVcGRhdGUgdGhlIGljb24uCisgICAgICAgICAgICAgICAgZmluYWwgU3RhdHVzQmFySWNvbiBpYyA9IG5ldyBTdGF0dXNCYXJJY29uKG5vdGlmaWNhdGlvbi5wa2csCisgICAgICAgICAgICAgICAgICAgICAgICBub3RpZmljYXRpb24ubm90aWZpY2F0aW9uLmljb24sIG5vdGlmaWNhdGlvbi5ub3RpZmljYXRpb24uaWNvbkxldmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgbm90aWZpY2F0aW9uLm5vdGlmaWNhdGlvbi5udW1iZXIpOworICAgICAgICAgICAgICAgIGlmICghb2xkRW50cnkuaWNvbi5zZXQoaWMpKSB7CisgICAgICAgICAgICAgICAgICAgIGhhbmRsZU5vdGlmaWNhdGlvbkVycm9yKGtleSwgbm90aWZpY2F0aW9uLCAiQ291bGRuJ3QgdXBkYXRlIGljb246ICIgKyBpYyk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgLy8gSXQgZmFpbGVkIHRvIGFkZCBjbGVhbmx5LiAgTG9nLCBhbmQgcmVtb3ZlIHRoZSB2aWV3IGZyb20gdGhlIHBhbmVsLgorICAgICAgICAgICAgICAgIFNsb2cudyhUQUcsICJDb3VsZG4ndCByZWFwcGx5IHZpZXdzIGZvciBwYWNrYWdlICIgKyBjb250ZW50Vmlldy5nZXRQYWNrYWdlKCksIGUpOworICAgICAgICAgICAgICAgIHJlbW92ZU5vdGlmaWNhdGlvblZpZXdzKGtleSk7CisgICAgICAgICAgICAgICAgYWRkTm90aWZpY2F0aW9uVmlld3Moa2V5LCBub3RpZmljYXRpb24pOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKERFQlVHKSBTbG9nLmQoVEFHLCAibm90IHJldXNpbmcgbm90aWZpY2F0aW9uIGZvciBrZXk6ICIgKyBrZXkpOworICAgICAgICAgICAgcmVtb3ZlTm90aWZpY2F0aW9uVmlld3Moa2V5KTsKKyAgICAgICAgICAgIGFkZE5vdGlmaWNhdGlvblZpZXdzKGtleSwgbm90aWZpY2F0aW9uKTsKKyAgICAgICAgfQorICAgICAgICAvLyBUT0RPOiBraWNrZXI7IGltbWVyc2l2ZSBtb2RlCisgICAgfQorCisgICAgcHVibGljIHZvaWQgcmVtb3ZlTm90aWZpY2F0aW9uKElCaW5kZXIga2V5KSB7CisgICAgICAgIGlmIChERUJVRykgU2xvZy5kKFRBRywgInJlbW92ZU5vdGlmaWNhdGlvbigiICsga2V5ICsgIikgLy8gVE9ETyIpOworICAgICAgICByZW1vdmVOb3RpZmljYXRpb25WaWV3cyhrZXkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGRpc2FibGUoaW50IHN0YXRlKSB7CisgICAgICAgIC8qCisgICAgICAgIGZpbmFsIGludCBvbGQgPSBtRGlzYWJsZWQ7CisgICAgICAgIGZpbmFsIGludCBkaWZmID0gc3RhdGUgXiBvbGQ7CisgICAgICAgIG1EaXNhYmxlZCA9IHN0YXRlOworCisgICAgICAgIGlmICgoZGlmZiAmIFN0YXR1c0Jhck1hbmFnZXIuRElTQUJMRV9FWFBBTkQpICE9IDApIHsKKyAgICAgICAgICAgIGlmICgoc3RhdGUgJiBTdGF0dXNCYXJNYW5hZ2VyLkRJU0FCTEVfRVhQQU5EKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgU2xvZy5kKFRBRywgIkRJU0FCTEVfRVhQQU5EOiB5ZXMiKTsKKyAgICAgICAgICAgICAgICBhbmltYXRlQ29sbGFwc2UoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoKGRpZmYgJiBTdGF0dXNCYXJNYW5hZ2VyLkRJU0FCTEVfTk9USUZJQ0FUSU9OX0lDT05TKSAhPSAwKSB7CisgICAgICAgICAgICBpZiAoKHN0YXRlICYgU3RhdHVzQmFyTWFuYWdlci5ESVNBQkxFX05PVElGSUNBVElPTl9JQ09OUykgIT0gMCkgeworICAgICAgICAgICAgICAgIFNsb2cuZChUQUcsICJESVNBQkxFX05PVElGSUNBVElPTl9JQ09OUzogeWVzIik7CisgICAgICAgICAgICAgICAgaWYgKG1UaWNraW5nKSB7CisgICAgICAgICAgICAgICAgICAgIG1LaWNrZXIuaGFsdCgpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIG1Ob3RpZmljYXRpb25JY29uQXJlYS5zZXRWaXNpYmlsaXR5KFZpZXcuSU5WSVNJQkxFKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIFNsb2cuZChUQUcsICJESVNBQkxFX05PVElGSUNBVElPTl9JQ09OUzogbm8iKTsKKyAgICAgICAgICAgICAgICBpZiAoIW1FeHBhbmRlZFZpc2libGUpIHsKKyAgICAgICAgICAgICAgICAgICAgbU5vdGlmaWNhdGlvbkljb25BcmVhLnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAoKGRpZmYgJiBTdGF0dXNCYXJNYW5hZ2VyLkRJU0FCTEVfTk9USUZJQ0FUSU9OX1RJQ0tFUikgIT0gMCkgeworICAgICAgICAgICAgaWYgKG1UaWNraW5nICYmIChzdGF0ZSAmIFN0YXR1c0Jhck1hbmFnZXIuRElTQUJMRV9OT1RJRklDQVRJT05fVElDS0VSKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgU2xvZy5kKFRBRywgIkRJU0FCTEVfTk9USUZJQ0FUSU9OX1RJQ0tFUjogeWVzIik7CisgICAgICAgICAgICAgICAgbUtpY2tlci5oYWx0KCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgKi8KKyAgICB9CisKKyAgICB2b2lkIHBlcmZvcm1EaXNhYmxlQWN0aW9ucyhpbnQgbmV0KSB7CisgICAgICAgIC8qCisgICAgICAgIGludCBvbGQgPSBtRGlzYWJsZWQ7CisgICAgICAgIGludCBkaWZmID0gbmV0IF4gb2xkOworICAgICAgICBtRGlzYWJsZWQgPSBuZXQ7CisKKyAgICAgICAgLy8gYWN0IGFjY29yZGluZ2x5CisgICAgICAgIGlmICgoZGlmZiAmIFN0YXR1c0Jhck1hbmFnZXIuRElTQUJMRV9FWFBBTkQpICE9IDApIHsKKyAgICAgICAgICAgIGlmICgobmV0ICYgU3RhdHVzQmFyTWFuYWdlci5ESVNBQkxFX0VYUEFORCkgIT0gMCkgeworICAgICAgICAgICAgICAgIFNsb2cuZChUQUcsICJESVNBQkxFX0VYUEFORDogeWVzIik7CisgICAgICAgICAgICAgICAgYW5pbWF0ZUNvbGxhcHNlKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKChkaWZmICYgU3RhdHVzQmFyTWFuYWdlci5ESVNBQkxFX05PVElGSUNBVElPTl9JQ09OUykgIT0gMCkgeworICAgICAgICAgICAgaWYgKChuZXQgJiBTdGF0dXNCYXJNYW5hZ2VyLkRJU0FCTEVfTk9USUZJQ0FUSU9OX0lDT05TKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgU2xvZy5kKFRBRywgIkRJU0FCTEVfTk9USUZJQ0FUSU9OX0lDT05TOiB5ZXMiKTsKKyAgICAgICAgICAgICAgICBpZiAobVRpY2tpbmcpIHsKKyAgICAgICAgICAgICAgICAgICAgbU5vdGlmaWNhdGlvbkljb25BcmVhLnNldFZpc2liaWxpdHkoVmlldy5JTlZJU0lCTEUpOworICAgICAgICAgICAgICAgICAgICBtS2lja2VyLmhhbHQoKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBtTm90aWZpY2F0aW9uSWNvbkFyZWEuc2V0VmlzaWJpbGl0eShWaWV3LklOVklTSUJMRSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBTbG9nLmQoVEFHLCAiRElTQUJMRV9OT1RJRklDQVRJT05fSUNPTlM6IG5vIik7CisgICAgICAgICAgICAgICAgaWYgKCFtRXhwYW5kZWRWaXNpYmxlKSB7CisgICAgICAgICAgICAgICAgICAgIG1Ob3RpZmljYXRpb25JY29uQXJlYS5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKChkaWZmICYgU3RhdHVzQmFyTWFuYWdlci5ESVNBQkxFX05PVElGSUNBVElPTl9USUNLRVIpICE9IDApIHsKKyAgICAgICAgICAgIGlmIChtVGlja2luZyAmJiAobmV0ICYgU3RhdHVzQmFyTWFuYWdlci5ESVNBQkxFX05PVElGSUNBVElPTl9USUNLRVIpICE9IDApIHsKKyAgICAgICAgICAgICAgICBtS2lja2VyLmhhbHQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAqLworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCB0aWNrKFN0YXR1c0Jhck5vdGlmaWNhdGlvbiBuKSB7CisgICAgICAgIC8vIFNob3cgdGhlIHRpY2tlciBpZiBvbmUgaXMgcmVxdWVzdGVkLiBBbHNvIGRvbid0IGRvIHRoaXMKKyAgICAgICAgLy8gdW50aWwgc3RhdHVzIGJhciB3aW5kb3cgaXMgYXR0YWNoZWQgdG8gdGhlIHdpbmRvdyBtYW5hZ2VyLAorICAgICAgICAvLyBiZWNhdXNlLi4uICB3ZWxsLCB3aGF0J3MgdGhlIHBvaW50IG90aGVyd2lzZT8gIEFuZCB0cnlpbmcgdG8KKyAgICAgICAgLy8gcnVuIGEgdGlja2VyIHdpdGhvdXQgYmVpbmcgYXR0YWNoZWQgd2lsbCBjcmFzaCEKKyAgICAgICAgaWYgKG4ubm90aWZpY2F0aW9uLnRpY2tlclRleHQgIT0gbnVsbCAmJiBtU3RhdHVzQmFyVmlldy5nZXRXaW5kb3dUb2tlbigpICE9IG51bGwpIHsKKyAgICAgICAgICAgIGlmICgwID09IChtRGlzYWJsZWQgJiAoU3RhdHVzQmFyTWFuYWdlci5ESVNBQkxFX05PVElGSUNBVElPTl9JQ09OUworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgU3RhdHVzQmFyTWFuYWdlci5ESVNBQkxFX05PVElGSUNBVElPTl9USUNLRVIpKSkgeworICAgICAgICAgICAgICAgIG1LaWNrZXIuYWRkRW50cnkobik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIGNsYXNzIEtpY2tlckNvbnRyb2xsZXIgeworICAgICAgICBWaWV3IG1WaWV3OworICAgICAgICBJbWFnZVZpZXcgbUtpY2tlckljb247CisgICAgICAgIFRleHRTd2l0Y2hlciBtS2lja2VyVGV4dDsKKworICAgICAgICBwdWJsaWMgS2lja2VyQ29udHJvbGxlcihDb250ZXh0IGNvbnRleHQsIFZpZXcgc2IpIHsKKyAgICAgICAgICAgIG1WaWV3ID0gc2IuZmluZFZpZXdCeUlkKFIuaWQudGlja2VyKTsKKyAgICAgICAgICAgIG1LaWNrZXJJY29uID0gKEltYWdlVmlldykgbVZpZXcuZmluZFZpZXdCeUlkKFIuaWQudGlja2VySWNvbik7CisgICAgICAgICAgICBtS2lja2VyVGV4dCA9IChUZXh0U3dpdGNoZXIpIG1WaWV3LmZpbmRWaWV3QnlJZChSLmlkLnRpY2tlclRleHQpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgaGFsdCgpIHsKKyAgICAgICAgICAgIHRpY2tlckhhbHRpbmcoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIGFkZEVudHJ5KFN0YXR1c0Jhck5vdGlmaWNhdGlvbiBuKSB7CisgICAgICAgICAgICBtS2lja2VySWNvbi5zZXRJbWFnZVJlc291cmNlKG4ubm90aWZpY2F0aW9uLmljb24pOworICAgICAgICAgICAgbUtpY2tlclRleHQuc2V0Q3VycmVudFRleHQobi5ub3RpZmljYXRpb24udGlja2VyVGV4dCk7CisgICAgICAgICAgICB0aWNrZXJTdGFydGluZygpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgdGlja2VyU3RhcnRpbmcoKSB7CisgICAgICAgICAgICBtVGlja2luZyA9IHRydWU7CisgICAgICAgICAgICBtSWNvbkxheW91dC5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7CisgICAgICAgICAgICBtS2lja2VyVmlldy5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCB0aWNrZXJEb25lKCkgeworICAgICAgICAgICAgbUljb25MYXlvdXQuc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOworICAgICAgICAgICAgbUtpY2tlclZpZXcuc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOworICAgICAgICAgICAgbVRpY2tpbmcgPSBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHRpY2tlckhhbHRpbmcoKSB7CisgICAgICAgICAgICBtSWNvbkxheW91dC5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7CisgICAgICAgICAgICBtS2lja2VyVmlldy5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7CisgICAgICAgICAgICBtVGlja2luZyA9IGZhbHNlOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgYW5pbWF0ZUV4cGFuZCgpIHsKKyAgICAgICAgbUhhbmRsZXIucmVtb3ZlTWVzc2FnZXMoSC5NU0dfT1BFTl9OT1RJRklDQVRJT05fUEFORUwpOworICAgICAgICBtSGFuZGxlci5zZW5kRW1wdHlNZXNzYWdlKEguTVNHX09QRU5fTk9USUZJQ0FUSU9OX1BBTkVMKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBhbmltYXRlQ29sbGFwc2UoKSB7CisgICAgICAgIG1IYW5kbGVyLnJlbW92ZU1lc3NhZ2VzKEguTVNHX0NMT1NFX05PVElGSUNBVElPTl9QQU5FTCk7CisgICAgICAgIG1IYW5kbGVyLnNlbmRFbXB0eU1lc3NhZ2UoSC5NU0dfQ0xPU0VfTk9USUZJQ0FUSU9OX1BBTkVMKTsKKyAgICAgICAgbUhhbmRsZXIucmVtb3ZlTWVzc2FnZXMoSC5NU0dfQ0xPU0VfU1lTVEVNX1BBTkVMKTsKKyAgICAgICAgbUhhbmRsZXIuc2VuZEVtcHR5TWVzc2FnZShILk1TR19DTE9TRV9TWVNURU1fUEFORUwpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldExpZ2h0c09uKGJvb2xlYW4gb24pIHsKKyAgICAgICAgaWYgKG9uKSB7CisgICAgICAgICAgICBtQ3VydGFpbnMuc2V0QW5pbWF0aW9uKEFuaW1hdGlvblV0aWxzLmxvYWRBbmltYXRpb24oKENvbnRleHQpdGhpcywKKyAgICAgICAgICAgICAgICAgICAgICAgIFIuYW5pbS5saWdodHNfb3V0X291dCkpOworICAgICAgICAgICAgbUN1cnRhaW5zLnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKKyAgICAgICAgICAgIG1CYXJDb250ZW50cy5zZXRBbmltYXRpb24oQW5pbWF0aW9uVXRpbHMubG9hZEFuaW1hdGlvbigoQ29udGV4dCl0aGlzLAorICAgICAgICAgICAgICAgICAgICAgICAgUi5hbmltLnN0YXR1c19iYXJfaW4pKTsKKyAgICAgICAgICAgIG1CYXJDb250ZW50cy5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBhbmltYXRlQ29sbGFwc2UoKTsKKyAgICAgICAgICAgIG1DdXJ0YWlucy5zZXRBbmltYXRpb24oQW5pbWF0aW9uVXRpbHMubG9hZEFuaW1hdGlvbigoQ29udGV4dCl0aGlzLAorICAgICAgICAgICAgICAgICAgICAgICAgUi5hbmltLmxpZ2h0c19vdXRfaW4pKTsKKyAgICAgICAgICAgIG1DdXJ0YWlucy5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7CisgICAgICAgICAgICBtQmFyQ29udGVudHMuc2V0QW5pbWF0aW9uKEFuaW1hdGlvblV0aWxzLmxvYWRBbmltYXRpb24oKENvbnRleHQpdGhpcywKKyAgICAgICAgICAgICAgICAgICAgICAgIFIuYW5pbS5zdGF0dXNfYmFyX291dCkpOworICAgICAgICAgICAgbUJhckNvbnRlbnRzLnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIG5vdGlmaWNhdGlvbkljb25zQ2xpY2tlZChWaWV3IHYpIHsKKyAgICAgICAgaWYgKERFQlVHKSBTbG9nLmQoVEFHLCAiY2xpY2tlZCBub3RpZmljYXRpb24gaWNvbnMiKTsKKyAgICAgICAgbUhhbmRsZXIucmVtb3ZlTWVzc2FnZXMoSC5NU0dfQ0xPU0VfU1lTVEVNX1BBTkVMKTsKKyAgICAgICAgbUhhbmRsZXIuc2VuZEVtcHR5TWVzc2FnZShILk1TR19DTE9TRV9TWVNURU1fUEFORUwpOworCisgICAgICAgIGludCBtc2cgPSAobU5vdGlmaWNhdGlvblBhbmVsLmdldFZpc2liaWxpdHkoKSA9PSBWaWV3LkdPTkUpIAorICAgICAgICAgICAgPyBILk1TR19PUEVOX05PVElGSUNBVElPTl9QQU5FTAorICAgICAgICAgICAgOiBILk1TR19DTE9TRV9OT1RJRklDQVRJT05fUEFORUw7CisgICAgICAgIG1IYW5kbGVyLnJlbW92ZU1lc3NhZ2VzKG1zZyk7CisgICAgICAgIG1IYW5kbGVyLnNlbmRFbXB0eU1lc3NhZ2UobXNnKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzeXN0ZW1JbmZvQ2xpY2tlZChWaWV3IHYpIHsKKyAgICAgICAgaWYgKERFQlVHKSBTbG9nLmQoVEFHLCAiY2xpY2tlZCBzeXN0ZW0gaW5mbyIpOworICAgICAgICBtSGFuZGxlci5yZW1vdmVNZXNzYWdlcyhILk1TR19DTE9TRV9OT1RJRklDQVRJT05fUEFORUwpOworICAgICAgICBtSGFuZGxlci5zZW5kRW1wdHlNZXNzYWdlKEguTVNHX0NMT1NFX05PVElGSUNBVElPTl9QQU5FTCk7CisKKyAgICAgICAgaW50IG1zZyA9IChtU3lzdGVtUGFuZWwuZ2V0VmlzaWJpbGl0eSgpID09IFZpZXcuR09ORSkgCisgICAgICAgICAgICA/IEguTVNHX09QRU5fU1lTVEVNX1BBTkVMCisgICAgICAgICAgICA6IEguTVNHX0NMT1NFX1NZU1RFTV9QQU5FTDsKKyAgICAgICAgbUhhbmRsZXIucmVtb3ZlTWVzc2FnZXMobXNnKTsKKyAgICAgICAgbUhhbmRsZXIuc2VuZEVtcHR5TWVzc2FnZShtc2cpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHJlY2VudEJ1dHRvbkNsaWNrZWQoVmlldyB2KSB7CisgICAgICAgIGlmIChERUJVRykgU2xvZy5kKFRBRywgImNsaWNrZWQgcmVjZW50IGFwcHMiKTsKKyAgICAgICAgSW50ZW50IGludGVudCA9IG5ldyBJbnRlbnQoKTsKKyAgICAgICAgaW50ZW50LnNldENsYXNzKHRoaXMsIFJlY2VudEFwcGxpY2F0aW9uc0FjdGl2aXR5LmNsYXNzKTsKKyAgICAgICAgaW50ZW50LnNldEZsYWdzKEludGVudC5GTEFHX0FDVElWSVRZX05FV19UQVNLCisgICAgICAgICAgICAgICAgfCBJbnRlbnQuRkxBR19BQ1RJVklUWV9FWENMVURFX0ZST01fUkVDRU5UUyk7CisgICAgICAgIHN0YXJ0QWN0aXZpdHkoaW50ZW50KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDYW5jZWwgdGhpcyBub3RpZmljYXRpb24gYW5kIHRlbGwgdGhlIHN0YXR1cyBiYXIgc2VydmljZSBhYm91dCB0aGUgZmFpbHVyZS4gSG9sZCBubyBsb2Nrcy4KKyAgICAgKi8KKyAgICB2b2lkIGhhbmRsZU5vdGlmaWNhdGlvbkVycm9yKElCaW5kZXIga2V5LCBTdGF0dXNCYXJOb3RpZmljYXRpb24gbiwgU3RyaW5nIG1lc3NhZ2UpIHsKKyAgICAgICAgcmVtb3ZlTm90aWZpY2F0aW9uKGtleSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBtQmFyU2VydmljZS5vbk5vdGlmaWNhdGlvbkVycm9yKG4ucGtnLCBuLnRhZywgbi5pZCwgbi51aWQsIG4uaW5pdGlhbFBpZCwgbWVzc2FnZSk7CisgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgLy8gVGhlIGVuZCBpcyBuaWdoLgorICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBWaWV3Lk9uQ2xpY2tMaXN0ZW5lciBtQ2xlYXJCdXR0b25MaXN0ZW5lciA9IG5ldyBWaWV3Lk9uQ2xpY2tMaXN0ZW5lcigpIHsKKyAgICAgICAgcHVibGljIHZvaWQgb25DbGljayhWaWV3IHYpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgbUJhclNlcnZpY2Uub25DbGVhckFsbE5vdGlmaWNhdGlvbnMoKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgICAgIC8vIHN5c3RlbSBwcm9jZXNzIGlzIGRlYWQgaWYgd2UncmUgaGVyZS4KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGFuaW1hdGVDb2xsYXBzZSgpOworICAgICAgICB9CisgICAgfTsKKworICAgIHByaXZhdGUgY2xhc3MgTm90aWZpY2F0aW9uQ2xpY2tlciBpbXBsZW1lbnRzIFZpZXcuT25DbGlja0xpc3RlbmVyIHsKKyAgICAgICAgcHJpdmF0ZSBQZW5kaW5nSW50ZW50IG1JbnRlbnQ7CisgICAgICAgIHByaXZhdGUgU3RyaW5nIG1Qa2c7CisgICAgICAgIHByaXZhdGUgU3RyaW5nIG1UYWc7CisgICAgICAgIHByaXZhdGUgaW50IG1JZDsKKworICAgICAgICBOb3RpZmljYXRpb25DbGlja2VyKFBlbmRpbmdJbnRlbnQgaW50ZW50LCBTdHJpbmcgcGtnLCBTdHJpbmcgdGFnLCBpbnQgaWQpIHsKKyAgICAgICAgICAgIG1JbnRlbnQgPSBpbnRlbnQ7CisgICAgICAgICAgICBtUGtnID0gcGtnOworICAgICAgICAgICAgbVRhZyA9IHRhZzsKKyAgICAgICAgICAgIG1JZCA9IGlkOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgb25DbGljayhWaWV3IHYpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgLy8gVGhlIGludGVudCB3ZSBhcmUgc2VuZGluZyBpcyBmb3IgdGhlIGFwcGxpY2F0aW9uLCB3aGljaAorICAgICAgICAgICAgICAgIC8vIHdvbid0IGhhdmUgcGVybWlzc2lvbiB0byBpbW1lZGlhdGVseSBzdGFydCBhbiBhY3Rpdml0eSBhZnRlcgorICAgICAgICAgICAgICAgIC8vIHRoZSB1c2VyIHN3aXRjaGVzIHRvIGhvbWUuICBXZSBrbm93IGl0IGlzIHNhZmUgdG8gZG8gYXQgdGhpcworICAgICAgICAgICAgICAgIC8vIHBvaW50LCBzbyBtYWtlIHN1cmUgbmV3IGFjdGl2aXR5IHN3aXRjaGVzIGFyZSBub3cgYWxsb3dlZC4KKyAgICAgICAgICAgICAgICBBY3Rpdml0eU1hbmFnZXJOYXRpdmUuZ2V0RGVmYXVsdCgpLnJlc3VtZUFwcFN3aXRjaGVzKCk7CisgICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAobUludGVudCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgaW50W10gcG9zID0gbmV3IGludFsyXTsKKyAgICAgICAgICAgICAgICB2LmdldExvY2F0aW9uT25TY3JlZW4ocG9zKTsKKyAgICAgICAgICAgICAgICBJbnRlbnQgb3ZlcmxheSA9IG5ldyBJbnRlbnQoKTsKKyAgICAgICAgICAgICAgICBvdmVybGF5LnNldFNvdXJjZUJvdW5kcygKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBSZWN0KHBvc1swXSwgcG9zWzFdLCBwb3NbMF0rdi5nZXRXaWR0aCgpLCBwb3NbMV0rdi5nZXRIZWlnaHQoKSkpOworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIG1JbnRlbnQuc2VuZChUYWJsZXRTdGF0dXNCYXJTZXJ2aWNlLnRoaXMsIDAsIG92ZXJsYXkpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFBlbmRpbmdJbnRlbnQuQ2FuY2VsZWRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICAvLyB0aGUgc3RhY2sgdHJhY2UgaXNuJ3QgdmVyeSBoZWxwZnVsIGhlcmUuICBKdXN0IGxvZyB0aGUgZXhjZXB0aW9uIG1lc3NhZ2UuCisgICAgICAgICAgICAgICAgICAgIFNsb2cudyhUQUcsICJTZW5kaW5nIGNvbnRlbnRJbnRlbnQgZmFpbGVkOiAiICsgZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIG1CYXJTZXJ2aWNlLm9uTm90aWZpY2F0aW9uQ2xpY2sobVBrZywgbVRhZywgbUlkKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgICAgIC8vIHN5c3RlbSBwcm9jZXNzIGlzIGRlYWQgaWYgd2UncmUgaGVyZS4KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gY2xvc2UgdGhlIHNoYWRlIGlmIGl0IHdhcyBvcGVuCisgICAgICAgICAgICBhbmltYXRlQ29sbGFwc2UoKTsKKworICAgICAgICAgICAgLy8gSWYgdGhpcyBjbGljayB3YXMgb24gdGhlIGludHJ1ZGVyIGFsZXJ0LCBoaWRlIHRoYXQgaW5zdGVhZAorLy8gICAgICAgICAgICBtSGFuZGxlci5zZW5kRW1wdHlNZXNzYWdlKE1TR19ISURFX0lOVFJVREVSKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIFN0YXR1c0Jhck5vdGlmaWNhdGlvbiByZW1vdmVOb3RpZmljYXRpb25WaWV3cyhJQmluZGVyIGtleSkgeworICAgICAgICBOb3RpZmljYXRpb25EYXRhLkVudHJ5IGVudHJ5ID0gbU5vdG5zLnJlbW92ZShrZXkpOworICAgICAgICBpZiAoZW50cnkgPT0gbnVsbCkgeworICAgICAgICAgICAgU2xvZy53KFRBRywgInJlbW92ZU5vdGlmaWNhdGlvbiBmb3IgdW5rbm93biBrZXk6ICIgKyBrZXkpOworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICAgICAgLy8gUmVtb3ZlIHRoZSBleHBhbmRlZCB2aWV3LgorICAgICAgICBWaWV3R3JvdXAgcm93UGFyZW50ID0gKFZpZXdHcm91cCllbnRyeS5yb3cuZ2V0UGFyZW50KCk7CisgICAgICAgIGlmIChyb3dQYXJlbnQgIT0gbnVsbCkgcm93UGFyZW50LnJlbW92ZVZpZXcoZW50cnkucm93KTsKKyAgICAgICAgLy8gUmVtb3ZlIHRoZSBpY29uLgorLy8gICAgICAgIFZpZXdHcm91cCBpY29uUGFyZW50ID0gKFZpZXdHcm91cCllbnRyeS5pY29uLmdldFBhcmVudCgpOworLy8gICAgICAgIGlmIChpY29uUGFyZW50ICE9IG51bGwpIGljb25QYXJlbnQucmVtb3ZlVmlldyhlbnRyeS5pY29uKTsKKyAgICAgICAgcmVmcmVzaEljb25zKCk7CisKKyAgICAgICAgcmV0dXJuIGVudHJ5Lm5vdGlmaWNhdGlvbjsKKyAgICB9CisKKyAgICBTdGF0dXNCYXJJY29uVmlldyBhZGROb3RpZmljYXRpb25WaWV3cyhJQmluZGVyIGtleSwgU3RhdHVzQmFyTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgeworICAgICAgICBpZiAoREVCVUcpIHsKKyAgICAgICAgICAgIFNsb2cuZChUQUcsICJhZGROb3RpZmljYXRpb25WaWV3cyhrZXk9IiArIGtleSArICIsIG5vdGlmaWNhdGlvbj0iICsgbm90aWZpY2F0aW9uKTsKKyAgICAgICAgfQorICAgICAgICAvLyBDb25zdHJ1Y3QgdGhlIGljb24uCisgICAgICAgIGZpbmFsIFN0YXR1c0Jhckljb25WaWV3IGljb25WaWV3ID0gbmV3IFN0YXR1c0Jhckljb25WaWV3KHRoaXMsCisgICAgICAgICAgICAgICAgbm90aWZpY2F0aW9uLnBrZyArICIvMHgiICsgSW50ZWdlci50b0hleFN0cmluZyhub3RpZmljYXRpb24uaWQpKTsKKyAgICAgICAgaWNvblZpZXcuc2V0U2NhbGVUeXBlKEltYWdlVmlldy5TY2FsZVR5cGUuQ0VOVEVSX0lOU0lERSk7CisKKyAgICAgICAgZmluYWwgU3RhdHVzQmFySWNvbiBpYyA9IG5ldyBTdGF0dXNCYXJJY29uKG5vdGlmaWNhdGlvbi5wa2csCisgICAgICAgICAgICAgICAgICAgIG5vdGlmaWNhdGlvbi5ub3RpZmljYXRpb24uaWNvbiwKKyAgICAgICAgICAgICAgICAgICAgbm90aWZpY2F0aW9uLm5vdGlmaWNhdGlvbi5pY29uTGV2ZWwsCisgICAgICAgICAgICAgICAgICAgIG5vdGlmaWNhdGlvbi5ub3RpZmljYXRpb24ubnVtYmVyKTsKKyAgICAgICAgaWYgKCFpY29uVmlldy5zZXQoaWMpKSB7CisgICAgICAgICAgICBoYW5kbGVOb3RpZmljYXRpb25FcnJvcihrZXksIG5vdGlmaWNhdGlvbiwgIkNvdWxkbid0IGF0dGFjaCBTdGF0dXNCYXJJY29uOiAiICsgaWMpOworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICAgICAgLy8gQ29uc3RydWN0IHRoZSBleHBhbmRlZCB2aWV3LgorICAgICAgICBOb3RpZmljYXRpb25EYXRhLkVudHJ5IGVudHJ5ID0gbmV3IE5vdGlmaWNhdGlvbkRhdGEuRW50cnkoa2V5LCBub3RpZmljYXRpb24sIGljb25WaWV3KTsKKyAgICAgICAgaWYgKCFpbmZsYXRlVmlld3MoZW50cnksIG1QaWxlKSkgeworICAgICAgICAgICAgaGFuZGxlTm90aWZpY2F0aW9uRXJyb3Ioa2V5LCBub3RpZmljYXRpb24sICJDb3VsZG4ndCBleHBhbmQgUmVtb3RlVmlld3MgZm9yOiAiCisgICAgICAgICAgICAgICAgICAgICsgbm90aWZpY2F0aW9uKTsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgICAgIC8vIEFkZCB0aGUgaWNvbi4KKyAgICAgICAgbU5vdG5zLmFkZChlbnRyeSk7CisgICAgICAgIHJlZnJlc2hJY29ucygpOworCisgICAgICAgIHJldHVybiBpY29uVmlldzsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgcmVmcmVzaEljb25zKCkgeworICAgICAgICAvLyBYWFg6IG5lZWQgdG8gaW1wbGVtZW50IGEgbmV3IGxpbWl0ZWQgbGluZWFyIGxheW91dCBjbGFzcworICAgICAgICAvLyB0byBhdm9pZCByZW1vdmluZyAmIHJlYWRkaW5nIGV2ZXJ5dGhpbmcKKworICAgICAgICBpbnQgTiA9IG1Ob3Rucy5zaXplKCk7CisgICAgICAgIExpbmVhckxheW91dC5MYXlvdXRQYXJhbXMgcGFyYW1zID0gbmV3IExpbmVhckxheW91dC5MYXlvdXRQYXJhbXMobUljb25TaXplLCBtSWNvblNpemUpOworCisgICAgICAgIGlmIChERUJVRykgeworICAgICAgICAgICAgU2xvZy5kKFRBRywgInJlZnJlc2hpbmcgaWNvbnMgKCIgKyBOICsgIiBub3RpZmljYXRpb25zLCBtSWNvbkxheW91dD0iCisgICAgICAgICAgICAgICAgICAgICsgbUljb25MYXlvdXQgKyAiLCBtUGlsZT0iICsgbVBpbGUpOworICAgICAgICB9CisKKyAgICAgICAgbUljb25MYXlvdXQucmVtb3ZlQWxsVmlld3MoKTsKKyAgICAgICAgZm9yIChpbnQgaT0wOyBpPDQ7IGkrKykgeworICAgICAgICAgICAgaWYgKGk+PU4pIGJyZWFrOworICAgICAgICAgICAgbUljb25MYXlvdXQuYWRkVmlldyhtTm90bnMuZ2V0KE4taS0xKS5pY29uLCBpLCBwYXJhbXMpOworICAgICAgICB9CisKKyAgICAgICAgbVBpbGUucmVtb3ZlQWxsVmlld3MoKTsKKyAgICAgICAgZm9yIChpbnQgaT0wOyBpPE47IGkrKykgeworICAgICAgICAgICAgbVBpbGUuYWRkVmlldyhtTm90bnMuZ2V0KE4taS0xKS5yb3cpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBib29sZWFuIGluZmxhdGVWaWV3cyhOb3RpZmljYXRpb25EYXRhLkVudHJ5IGVudHJ5LCBWaWV3R3JvdXAgcGFyZW50KSB7CisgICAgICAgIFN0YXR1c0Jhck5vdGlmaWNhdGlvbiBzYm4gPSBlbnRyeS5ub3RpZmljYXRpb247CisgICAgICAgIFJlbW90ZVZpZXdzIHJlbW90ZVZpZXdzID0gc2JuLm5vdGlmaWNhdGlvbi5jb250ZW50VmlldzsKKyAgICAgICAgaWYgKHJlbW90ZVZpZXdzID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIGNyZWF0ZSB0aGUgcm93IHZpZXcKKyAgICAgICAgTGF5b3V0SW5mbGF0ZXIgaW5mbGF0ZXIgPSAoTGF5b3V0SW5mbGF0ZXIpZ2V0U3lzdGVtU2VydmljZShDb250ZXh0LkxBWU9VVF9JTkZMQVRFUl9TRVJWSUNFKTsKKyAgICAgICAgVmlldyByb3cgPSBpbmZsYXRlci5pbmZsYXRlKFIubGF5b3V0LnN0YXR1c19iYXJfbGF0ZXN0X2V2ZW50LCBwYXJlbnQsIGZhbHNlKTsKKyAgICAgICAgVmlldyB2ZXRvQnV0dG9uID0gcm93LmZpbmRWaWV3QnlJZChSLmlkLnZldG8pOworICAgICAgICBmaW5hbCBTdHJpbmcgX3BrZyA9IHNibi5wa2c7CisgICAgICAgIGZpbmFsIFN0cmluZyBfdGFnID0gc2JuLnRhZzsKKyAgICAgICAgZmluYWwgaW50IF9pZCA9IHNibi5pZDsKKyAgICAgICAgdmV0b0J1dHRvbi5zZXRPbkNsaWNrTGlzdGVuZXIobmV3IFZpZXcuT25DbGlja0xpc3RlbmVyKCkgeyAKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkNsaWNrKFZpZXcgdikgeworICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgbUJhclNlcnZpY2Uub25Ob3RpZmljYXRpb25DbGVhcihfcGtnLCBfdGFnLCBfaWQpOworICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN5c3RlbSBwcm9jZXNzIGlzIGRlYWQgaWYgd2UncmUgaGVyZS4KKyAgICAgICAgICAgICAgICAgICAgfQorLy8gICAgICAgICAgICAgICAgICAgIGFuaW1hdGVDb2xsYXBzZSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworCisgICAgICAgIC8vIGJpbmQgdGhlIGNsaWNrIGV2ZW50IHRvIHRoZSBjb250ZW50IGFyZWEKKyAgICAgICAgVmlld0dyb3VwIGNvbnRlbnQgPSAoVmlld0dyb3VwKXJvdy5maW5kVmlld0J5SWQoUi5pZC5jb250ZW50KTsKKyAgICAgICAgLy8gWFhYOiB1cGRhdGUgdG8gYWxsb3cgY29udHJvbHMgd2l0aGluIG5vdGlmaWNhdGlvbiB2aWV3cworICAgICAgICBjb250ZW50LnNldERlc2NlbmRhbnRGb2N1c2FiaWxpdHkoVmlld0dyb3VwLkZPQ1VTX0JMT0NLX0RFU0NFTkRBTlRTKTsKKy8vICAgICAgICBjb250ZW50LnNldE9uRm9jdXNDaGFuZ2VMaXN0ZW5lcihtRm9jdXNDaGFuZ2VMaXN0ZW5lcik7CisgICAgICAgIFBlbmRpbmdJbnRlbnQgY29udGVudEludGVudCA9IHNibi5ub3RpZmljYXRpb24uY29udGVudEludGVudDsKKyAgICAgICAgaWYgKGNvbnRlbnRJbnRlbnQgIT0gbnVsbCkgeworICAgICAgICAgICAgY29udGVudC5zZXRPbkNsaWNrTGlzdGVuZXIobmV3IE5vdGlmaWNhdGlvbkNsaWNrZXIoY29udGVudEludGVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNibi5wa2csIHNibi50YWcsIHNibi5pZCkpOworICAgICAgICB9CisKKyAgICAgICAgVmlldyBleHBhbmRlZCA9IG51bGw7CisgICAgICAgIEV4Y2VwdGlvbiBleGNlcHRpb24gPSBudWxsOworICAgICAgICB0cnkgeworICAgICAgICAgICAgZXhwYW5kZWQgPSByZW1vdGVWaWV3cy5hcHBseSh0aGlzLCBjb250ZW50KTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBleGNlcHRpb24gPSBlOworICAgICAgICB9CisgICAgICAgIGlmIChleHBhbmRlZCA9PSBudWxsKSB7CisgICAgICAgICAgICBTdHJpbmcgaWRlbnQgPSBzYm4ucGtnICsgIi8weCIgKyBJbnRlZ2VyLnRvSGV4U3RyaW5nKHNibi5pZCk7CisgICAgICAgICAgICBTbG9nLmUoVEFHLCAiY291bGRuJ3QgaW5mbGF0ZSB2aWV3IGZvciBub3RpZmljYXRpb24gIiArIGlkZW50LCBleGNlcHRpb24pOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgY29udGVudC5hZGRWaWV3KGV4cGFuZGVkKTsKKyAgICAgICAgICAgIHJvdy5zZXREcmF3aW5nQ2FjaGVFbmFibGVkKHRydWUpOworICAgICAgICB9CisKKyAgICAgICAgZW50cnkucm93ID0gcm93OworICAgICAgICBlbnRyeS5jb250ZW50ID0gY29udGVudDsKKyAgICAgICAgZW50cnkuZXhwYW5kZWQgPSBleHBhbmRlZDsKKworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBwdWJsaWMgY2xhc3MgU2V0TGlnaHRzT25MaXN0ZW5lciBpbXBsZW1lbnRzIFZpZXcuT25Mb25nQ2xpY2tMaXN0ZW5lciwKKyAgICAgICAgICAgVmlldy5PbkNsaWNrTGlzdGVuZXIgeworICAgICAgICBwcml2YXRlIGJvb2xlYW4gbU9uOworCisgICAgICAgIFNldExpZ2h0c09uTGlzdGVuZXIoYm9vbGVhbiBvbikgeworICAgICAgICAgICAgbU9uID0gb247CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBvbkNsaWNrKFZpZXcgdikgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBtQmFyU2VydmljZS5zZXRMaWdodHNPbihtT24pOworICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICAgICAgLy8gc3lzdGVtIHByb2Nlc3MKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBib29sZWFuIG9uTG9uZ0NsaWNrKFZpZXcgdikgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBtQmFyU2VydmljZS5zZXRMaWdodHNPbihtT24pOworICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICAgICAgLy8gc3lzdGVtIHByb2Nlc3MKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisKKyAgICB9Cit9CisKKwpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvVHRzU2VydmljZS9qbmkvQW5kcm9pZC5tayBiL3BhY2thZ2VzL1R0c1NlcnZpY2Uvam5pL0FuZHJvaWQubWsKaW5kZXggYjQxNzU5YS4uNWRjMGMzMCAxMDA3NTUKLS0tIGEvcGFja2FnZXMvVHRzU2VydmljZS9qbmkvQW5kcm9pZC5taworKysgYi9wYWNrYWdlcy9UdHNTZXJ2aWNlL2puaS9BbmRyb2lkLm1rCkBAIC01LDYgKzUsNyBAQAogCWFuZHJvaWRfdHRzX1N5bnRoUHJveHkuY3BwCiAKIExPQ0FMX0NfSU5DTFVERVMgKz0gXAorCWZyYW1ld29ya3MvYmFzZS9uYXRpdmUvaW5jbHVkZSBcCiAJJChKTklfSF9JTkNMVURFKQogCiBMT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IFwKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1R0c1NlcnZpY2Uvam5pL2FuZHJvaWRfdHRzX1N5bnRoUHJveHkuY3BwIGIvcGFja2FnZXMvVHRzU2VydmljZS9qbmkvYW5kcm9pZF90dHNfU3ludGhQcm94eS5jcHAKaW5kZXggMWQ2OTM2MS4uOGRjODhkYiAxMDA2NDQKLS0tIGEvcGFja2FnZXMvVHRzU2VydmljZS9qbmkvYW5kcm9pZF90dHNfU3ludGhQcm94eS5jcHAKKysrIGIvcGFja2FnZXMvVHRzU2VydmljZS9qbmkvYW5kcm9pZF90dHNfU3ludGhQcm94eS5jcHAKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IChDKSAyMDA5IEdvb2dsZSBJbmMuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDktMjAxMCBHb29nbGUgSW5jLgogICoKICAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgpAQCAtMjMsNyArMjMsNyBAQAogI2luY2x1ZGUgPG5hdGl2ZWhlbHBlci9qbmkuaD4KICNpbmNsdWRlIDxuYXRpdmVoZWxwZXIvSk5JSGVscC5oPgogI2luY2x1ZGUgPGFuZHJvaWRfcnVudGltZS9BbmRyb2lkUnVudGltZS5oPgotI2luY2x1ZGUgPHR0cy9UdHNFbmdpbmUuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL3R0cy5oPgogI2luY2x1ZGUgPG1lZGlhL0F1ZGlvVHJhY2suaD4KICNpbmNsdWRlIDxtYXRoLmg+CiAKQEAgLTE1NCw3ICsxNTQsNyBAQAogY2xhc3MgU3ludGhQcm94eUpuaVN0b3JhZ2UgewogICAgIHB1YmxpYyA6CiAgICAgICAgIGpvYmplY3QgICAgICAgICAgICAgICAgICAgdHRzX3JlZjsKLSAgICAgICAgVHRzRW5naW5lKiAgICAgICAgICAgICAgICBtTmF0aXZlU3ludGhJbnRlcmZhY2U7CisgICAgICAgIGFuZHJvaWRfdHRzX2VuZ2luZV90KiAgICAgICBtRW5naW5lOwogICAgICAgICB2b2lkKiAgICAgICAgICAgICAgICAgICAgIG1FbmdpbmVMaWJIYW5kbGU7CiAgICAgICAgIEF1ZGlvVHJhY2sqICAgICAgICAgICAgICAgbUF1ZGlvT3V0OwogICAgICAgICBpbnQ4X3QgICAgICAgICAgICAgICAgICAgIG1QbGF5U3RhdGU7CkBAIC0xNjgsNyArMTY4LDcgQEAKIAogICAgICAgICBTeW50aFByb3h5Sm5pU3RvcmFnZSgpIHsKICAgICAgICAgICAgIHR0c19yZWYgPSBOVUxMOwotICAgICAgICAgICAgbU5hdGl2ZVN5bnRoSW50ZXJmYWNlID0gTlVMTDsKKyAgICAgICAgICAgIG1FbmdpbmUgPSBOVUxMOwogICAgICAgICAgICAgbUVuZ2luZUxpYkhhbmRsZSA9IE5VTEw7CiAgICAgICAgICAgICBtQXVkaW9PdXQgPSBOVUxMOwogICAgICAgICAgICAgbVBsYXlTdGF0ZSA9ICBTWU5USFBMQVlTVEFURV9JU19TVE9QUEVEOwpAQCAtMTg0LDkgKzE4NCw5IEBACiAgICAgICAgIH5TeW50aFByb3h5Sm5pU3RvcmFnZSgpIHsKICAgICAgICAgICAgIC8vTE9HVigiZW50ZXJpbmcgflN5bnRoUHJveHlKbmlTdG9yYWdlKCkiKTsKICAgICAgICAgICAgIGtpbGxBdWRpbygpOwotICAgICAgICAgICAgaWYgKG1OYXRpdmVTeW50aEludGVyZmFjZSkgewotICAgICAgICAgICAgICAgIG1OYXRpdmVTeW50aEludGVyZmFjZS0+c2h1dGRvd24oKTsKLSAgICAgICAgICAgICAgICBtTmF0aXZlU3ludGhJbnRlcmZhY2UgPSBOVUxMOworICAgICAgICAgICAgaWYgKG1FbmdpbmUpIHsKKyAgICAgICAgICAgICAgICBtRW5naW5lLT5mdW5jcy0+c2h1dGRvd24obUVuZ2luZSk7CisgICAgICAgICAgICAgICAgbUVuZ2luZSA9IE5VTEw7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAobUVuZ2luZUxpYkhhbmRsZSkgewogICAgICAgICAgICAgICAgIC8vTE9HRSgiflN5bnRoUHJveHlKbmlTdG9yYWdlKCk6IGJlZm9yZSBjbG9zZSBsaWJyYXJ5Iik7CkBAIC0yNzMsMjggKzI3Myw0NSBAQAogICogQ2FsbGJhY2sgZnJvbSBUVFMgZW5naW5lLgogICogRGlyZWN0bHkgc3BlYWtzIHVzaW5nIEF1ZGlvVHJhY2sgb3Igd3JpdGUgdG8gZmlsZQogICovCi1zdGF0aWMgdHRzX2NhbGxiYWNrX3N0YXR1cyB0dHNTeW50aERvbmVDQih2b2lkIComIHVzZXJkYXRhLCB1aW50MzJfdCByYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZm9ybWF0LCBpbnQgY2hhbm5lbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDhfdCAqJndhdiwgc2l6ZV90ICZidWZmZXJTaXplLCB0dHNfc3ludGhfc3RhdHVzIHN0YXR1cykgeworZXh0ZXJuICJDIiBhbmRyb2lkX3R0c19jYWxsYmFja19zdGF0dXNfdAorX190dHNTeW50aERvbmVDQih2b2lkICoqIHBVc2VyZGF0YSwgdWludDMyX3QgcmF0ZSwKKyAgICAgICAgICAgICAgIGFuZHJvaWRfdHRzX2F1ZGlvX2Zvcm1hdF90IGZvcm1hdCwgaW50IGNoYW5uZWwsCisgICAgICAgICAgICAgICBpbnQ4X3QgKipwV2F2LCBzaXplX3QgKnBCdWZmZXJTaXplLAorICAgICAgICAgICAgICAgYW5kcm9pZF90dHNfc3ludGhfc3RhdHVzX3Qgc3RhdHVzKSAKK3sKICAgICAvL0xPR1YoInR0c1N5bnRoRG9uZUNhbGxiYWNrOiAlZCBieXRlcyIsIGJ1ZmZlclNpemUpOworICAgIEF1ZGlvU3lzdGVtOjphdWRpb19mb3JtYXQgIGVuY29kaW5nOwogCi0gICAgaWYgKHVzZXJkYXRhID09IE5VTEwpeworICAgIGlmICgqcFVzZXJkYXRhID09IE5VTEwpewogICAgICAgICBMT0dFKCJ1c2VyZGF0YSA9PSBOVUxMIik7Ci0gICAgICAgIHJldHVybiBUVFNfQ0FMTEJBQ0tfSEFMVDsKKyAgICAgICAgcmV0dXJuIEFORFJPSURfVFRTX0NBTExCQUNLX0hBTFQ7CiAgICAgfQotICAgIGFmdGVyU3ludGhEYXRhX3QqIHBGb3JBZnRlciA9IChhZnRlclN5bnRoRGF0YV90Kil1c2VyZGF0YTsKKyAgICBzd2l0Y2ggKGZvcm1hdCkgeworICAgIGNhc2UgQU5EUk9JRF9UVFNfQVVESU9fRk9STUFUX1BDTV84X0JJVDoKKyAgICAgICAgZW5jb2RpbmcgPSBBdWRpb1N5c3RlbTo6UENNXzhfQklUOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEFORFJPSURfVFRTX0FVRElPX0ZPUk1BVF9QQ01fMTZfQklUOgorICAgICAgICBlbmNvZGluZyA9IEF1ZGlvU3lzdGVtOjpQQ01fMTZfQklUOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBMT0dFKCJDYW4ndCBwbGF5LCBiYWQgZm9ybWF0Iik7CisgICAgICAgIHJldHVybiBBTkRST0lEX1RUU19DQUxMQkFDS19IQUxUOworICAgIH0KKyAgICBhZnRlclN5bnRoRGF0YV90KiBwRm9yQWZ0ZXIgPSAoYWZ0ZXJTeW50aERhdGFfdCopICpwVXNlcmRhdGE7CiAgICAgU3ludGhQcm94eUpuaVN0b3JhZ2UqIHBKbmlEYXRhID0gKFN5bnRoUHJveHlKbmlTdG9yYWdlKikocEZvckFmdGVyLT5qbmlTdG9yYWdlKTsKIAogICAgIGlmIChwRm9yQWZ0ZXItPnVzYWdlTW9kZSA9PSBVU0FHRU1PREVfUExBWV9JTU1FRElBVEVMWSl7CiAgICAgICAgIC8vTE9HVigiRGlyZWN0IHNwZWVjaCIpOwogCi0gICAgICAgIGlmICh3YXYgPT0gTlVMTCkgeworICAgICAgICBpZiAoKnBXYXYgPT0gTlVMTCkgewogICAgICAgICAgICAgZGVsZXRlIHBGb3JBZnRlcjsKKyAgICAgICAgICAgIHBGb3JBZnRlciA9IE5VTEw7CiAgICAgICAgICAgICBMT0dWKCJOdWxsOiBzcGVlY2ggaGFzIGNvbXBsZXRlZCIpOworICAgICAgICAgICAgcmV0dXJuIEFORFJPSURfVFRTX0NBTExCQUNLX0hBTFQ7CiAgICAgICAgIH0KIAotICAgICAgICBpZiAoYnVmZmVyU2l6ZSA+IDApIHsKLSAgICAgICAgICAgIHByZXBBdWRpb1RyYWNrKHBKbmlEYXRhLCBwRm9yQWZ0ZXItPnN0cmVhbVR5cGUsIHJhdGUsIChBdWRpb1N5c3RlbTo6YXVkaW9fZm9ybWF0KWZvcm1hdCwgY2hhbm5lbCk7CisgICAgICAgIGlmICgqcEJ1ZmZlclNpemUgPiAwKSB7CisgICAgICAgICAgICBwcmVwQXVkaW9UcmFjayhwSm5pRGF0YSwgcEZvckFmdGVyLT5zdHJlYW1UeXBlLCByYXRlLCBlbmNvZGluZywgY2hhbm5lbCk7CiAgICAgICAgICAgICBpZiAocEpuaURhdGEtPm1BdWRpb091dCkgewogICAgICAgICAgICAgICAgIHBKbmlEYXRhLT5tUGxheUxvY2subG9jaygpOwogICAgICAgICAgICAgICAgIGlmKHBKbmlEYXRhLT5tQXVkaW9PdXQtPnN0b3BwZWQoKQpAQCAtMzAzLDI4ICszMjAsMzEgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgcEpuaURhdGEtPm1QbGF5TG9jay51bmxvY2soKTsKICAgICAgICAgICAgICAgICBpZiAoYlVzZUZpbHRlcikgewotICAgICAgICAgICAgICAgICAgICBhcHBseUZpbHRlcigoaW50MTZfdCopd2F2LCBidWZmZXJTaXplLzIpOworICAgICAgICAgICAgICAgICAgICBhcHBseUZpbHRlcigoaW50MTZfdCopKnBXYXYsICpwQnVmZmVyU2l6ZS8yKTsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcEpuaURhdGEtPm1BdWRpb091dC0+d3JpdGUod2F2LCBidWZmZXJTaXplKTsKLSAgICAgICAgICAgICAgICBtZW1zZXQod2F2LCAwLCBidWZmZXJTaXplKTsKKyAgICAgICAgICAgICAgICBwSm5pRGF0YS0+bUF1ZGlvT3V0LT53cml0ZSgqcFdhdiwgKnBCdWZmZXJTaXplKTsKKyAgICAgICAgICAgICAgICBtZW1zZXQoKnBXYXYsIDAsICpwQnVmZmVyU2l6ZSk7CiAgICAgICAgICAgICAgICAgLy9MT0dWKCJBdWRpb1RyYWNrIHdyb3RlOiAlZCBieXRlcyIsIGJ1ZmZlclNpemUpOwogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICBMT0dFKCJDYW4ndCBwbGF5LCBudWxsIGF1ZGlvdHJhY2siKTsKKyAgICAgICAgICAgICAgICBkZWxldGUgcEZvckFmdGVyOworICAgICAgICAgICAgICAgIHBGb3JBZnRlciA9IE5VTEw7CisgICAgICAgICAgICAgICAgcmV0dXJuIEFORFJPSURfVFRTX0NBTExCQUNLX0hBTFQ7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9IGVsc2UgIGlmIChwRm9yQWZ0ZXItPnVzYWdlTW9kZSA9PSBVU0FHRU1PREVfV1JJVEVfVE9fRklMRSkgewogICAgICAgICAvL0xPR1YoIlNhdmUgdG8gZmlsZSIpOwotICAgICAgICBpZiAod2F2ID09IE5VTEwpIHsKKyAgICAgICAgaWYgKCpwV2F2ID09IE5VTEwpIHsKICAgICAgICAgICAgIGRlbGV0ZSBwRm9yQWZ0ZXI7CiAgICAgICAgICAgICBMT0dWKCJOdWxsOiBzcGVlY2ggaGFzIGNvbXBsZXRlZCIpOwotICAgICAgICAgICAgcmV0dXJuIFRUU19DQUxMQkFDS19IQUxUOworICAgICAgICAgICAgcmV0dXJuIEFORFJPSURfVFRTX0NBTExCQUNLX0hBTFQ7CiAgICAgICAgIH0KLSAgICAgICAgaWYgKGJ1ZmZlclNpemUgPiAwKXsKKyAgICAgICAgaWYgKCpwQnVmZmVyU2l6ZSA+IDApewogICAgICAgICAgICAgaWYgKGJVc2VGaWx0ZXIpIHsKLSAgICAgICAgICAgICAgICBhcHBseUZpbHRlcigoaW50MTZfdCopd2F2LCBidWZmZXJTaXplLzIpOworICAgICAgICAgICAgICAgIGFwcGx5RmlsdGVyKChpbnQxNl90KikqcFdhdiwgKnBCdWZmZXJTaXplLzIpOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgZndyaXRlKHdhdiwgMSwgYnVmZmVyU2l6ZSwgcEZvckFmdGVyLT5vdXRwdXRGaWxlKTsKLSAgICAgICAgICAgIG1lbXNldCh3YXYsIDAsIGJ1ZmZlclNpemUpOworICAgICAgICAgICAgZndyaXRlKCpwV2F2LCAxLCAqcEJ1ZmZlclNpemUsIHBGb3JBZnRlci0+b3V0cHV0RmlsZSk7CisgICAgICAgICAgICBtZW1zZXQoKnBXYXYsIDAsICpwQnVmZmVyU2l6ZSk7CiAgICAgICAgIH0KICAgICB9CiAgICAgLy8gRnV0dXJlIHVwZGF0ZToKQEAgLTMzMiw3ICszNTIsNyBAQAogICAgIC8vICAgICAgamF2YVRUU0ZpZWxkcy5zeW50aFByb3h5TWV0aG9kUG9zdCBtZXRob2RlIHRvIG5vdGlmeQogICAgIC8vICAgICAgcGxheWJhY2sgaGFzIGNvbXBsZXRlZCBpZiB0aGUgc3ludGhlc2lzIGlzIGRvbmUgb3IgaWYgYSBtYXJrZXIgaGFzIGJlZW4gcmVhY2hlZC4KIAotICAgIGlmIChzdGF0dXMgPT0gVFRTX1NZTlRIX0RPTkUpIHsKKyAgICBpZiAoc3RhdHVzID09IEFORFJPSURfVFRTX1NZTlRIX0RPTkUpIHsKICAgICAgICAgLy8gdGhpcyBzdHJ1Y3Qgd2FzIGFsbG9jYXRlZCBpbiB0aGUgb3JpZ2luYWwgYW5kcm9pZF90dHNfU3ludGhQcm94eV9zcGVhayBjYWxsLAogICAgICAgICAvLyBhbGwgcHJvY2Vzc2luZyBtYXRjaGluZyB0aGlzIGNhbGwgaXMgbm93IGRvbmUuCiAgICAgICAgIExPR1YoIlNwZWVjaCBzeW50aGVzaXMgZG9uZS4iKTsKQEAgLTM0MiwxNiArMzYyLDE2IEBACiAgICAgICAgICAgICBkZWxldGUgcEZvckFmdGVyOwogICAgICAgICAgICAgcEZvckFmdGVyID0gTlVMTDsKICAgICAgICAgfQotICAgICAgICByZXR1cm4gVFRTX0NBTExCQUNLX0hBTFQ7CisgICAgICAgIHJldHVybiBBTkRST0lEX1RUU19DQUxMQkFDS19IQUxUOwogICAgIH0KIAogICAgIC8vIHdlIGRvbid0IHVwZGF0ZSB0aGUgd2F2IChvdXRwdXQpIHBhcmFtZXRlciBhcyB3ZSdsbCBsZXQgdGhlIG5leHQgY2FsbGJhY2sKICAgICAvLyB3cml0ZSBhdCB0aGUgc2FtZSBsb2NhdGlvbiwgd2UndmUgY29uc3VtZWQgdGhlIGRhdGEgYWxyZWFkeSwgYnV0IHdlIG5lZWQKICAgICAvLyB0byB1cGRhdGUgYnVmZmVyU2l6ZSB0byBsZXQgdGhlIFRUUyBlbmdpbmUga25vdyBob3cgbXVjaCBpdCBjYW4gd3JpdGUgdGhlCiAgICAgLy8gbmV4dCB0aW1lIGl0IGNhbGxzIHRoaXMgZnVuY3Rpb24uCi0gICAgYnVmZmVyU2l6ZSA9IHBKbmlEYXRhLT5tQnVmZmVyU2l6ZTsKKyAgICAqcEJ1ZmZlclNpemUgPSBwSm5pRGF0YS0+bUJ1ZmZlclNpemU7CiAKLSAgICByZXR1cm4gVFRTX0NBTExCQUNLX0NPTlRJTlVFOworICAgIHJldHVybiBBTkRST0lEX1RUU19DQUxMQkFDS19DT05USU5VRTsKIH0KIAogCkBAIC0zNjAsNyArMzgwLDcgQEAKIGFuZHJvaWRfdHRzX1N5bnRoUHJveHlfc2V0TG93U2hlbGYoSk5JRW52ICplbnYsIGpvYmplY3QgdGhpeiwgamJvb2xlYW4gYXBwbHlGaWx0ZXIsCiAgICAgICAgIGpmbG9hdCBmaWx0ZXJHYWluLCBqZmxvYXQgYXR0ZW51YXRpb25JbkRiLCBqZmxvYXQgZnJlcUluSHosIGpmbG9hdCBzbG9wZSkKIHsKLSAgICBpbnQgcmVzdWx0ID0gVFRTX1NVQ0NFU1M7CisgICAgaW50IHJlc3VsdCA9IEFORFJPSURfVFRTX1NVQ0NFU1M7CiAKICAgICBiVXNlRmlsdGVyID0gYXBwbHlGaWx0ZXI7CiAgICAgaWYgKGFwcGx5RmlsdGVyKSB7CkBAIC0zNzMsNyArMzkzLDcgQEAKICAgICAgICAgICAgIGluaXRpYWxpemVFUSgpOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgTE9HRSgiSW52YWxpZCBzbG9wZSwgY2FuJ3QgYmUgbnVsbCIpOwotICAgICAgICAgICAgcmVzdWx0ID0gVFRTX0ZBSUxVUkU7CisgICAgICAgICAgICByZXN1bHQgPSBBTkRST0lEX1RUU19GQUlMVVJFOwogICAgICAgICB9CiAgICAgfQogCkBAIC0zODUsNyArNDA1LDcgQEAKIGFuZHJvaWRfdHRzX1N5bnRoUHJveHlfbmF0aXZlX3NldHVwKEpOSUVudiAqZW52LCBqb2JqZWN0IHRoaXosCiAgICAgICAgIGpvYmplY3Qgd2Vha190aGlzLCBqc3RyaW5nIG5hdGl2ZVNvTGliLCBqc3RyaW5nIGVuZ0NvbmZpZykKIHsKLSAgICBpbnQgcmVzdWx0ID0gVFRTX0ZBSUxVUkU7CisgICAgaW50IHJlc3VsdCA9IEFORFJPSURfVFRTX0ZBSUxVUkU7CiAKICAgICBiVXNlRmlsdGVyID0gZmFsc2U7CiAKQEAgLTQwMiwxOCArNDIyLDI4IEBACiAgICAgaWYgKGVuZ2luZV9saWJfaGFuZGxlID09IE5VTEwpIHsKICAgICAgICBMT0dFKCJhbmRyb2lkX3R0c19TeW50aFByb3h5X25hdGl2ZV9zZXR1cCgpOiBlbmdpbmVfbGliX2hhbmRsZSA9PSBOVUxMIik7CiAgICAgfSBlbHNlIHsKLSAgICAgICAgVHRzRW5naW5lICooKmdldF9UdHNFbmdpbmUpKCkgPQotICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxUdHNFbmdpbmUqICgqKSgpPihkbHN5bShlbmdpbmVfbGliX2hhbmRsZSwgImdldFR0c0VuZ2luZSIpKTsKKyAgICAgICAgYW5kcm9pZF90dHNfZW5naW5lX3QgKiAoKmdldF9UdHNFbmdpbmUpKCkgPQorICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxhbmRyb2lkX3R0c19lbmdpbmVfdCogKCopKCk+KGRsc3ltKGVuZ2luZV9saWJfaGFuZGxlLCAiYW5kcm9pZF9nZXRUdHNFbmdpbmUiKSk7CiAKLSAgICAgICAgcEpuaVN0b3JhZ2UtPm1OYXRpdmVTeW50aEludGVyZmFjZSA9ICgqZ2V0X1R0c0VuZ2luZSkoKTsKLSAgICAgICAgcEpuaVN0b3JhZ2UtPm1FbmdpbmVMaWJIYW5kbGUgPSBlbmdpbmVfbGliX2hhbmRsZTsKLQotICAgICAgICBpZiAocEpuaVN0b3JhZ2UtPm1OYXRpdmVTeW50aEludGVyZmFjZSkgewotICAgICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGwoZW5naW5lTXV0ZXgpOwotICAgICAgICAgICAgcEpuaVN0b3JhZ2UtPm1OYXRpdmVTeW50aEludGVyZmFjZS0+aW5pdCh0dHNTeW50aERvbmVDQiwgZW5nQ29uZmlnU3RyaW5nKTsKKyAgICAgICAgLy8gU3VwcG9ydCBvYnNvbGV0ZS9sZWdhY3kgYmluYXJ5IG1vZHVsZXMKKyAgICAgICAgaWYgKGdldF9UdHNFbmdpbmUgPT0gTlVMTCkgeworICAgICAgICAgICAgZ2V0X1R0c0VuZ2luZSA9CisgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxhbmRyb2lkX3R0c19lbmdpbmVfdCogKCopKCk+KGRsc3ltKGVuZ2luZV9saWJfaGFuZGxlLCAiZ2V0VHRzRW5naW5lIikpOwogICAgICAgICB9CiAKLSAgICAgICAgcmVzdWx0ID0gVFRTX1NVQ0NFU1M7CisgICAgICAgIHBKbmlTdG9yYWdlLT5tRW5naW5lID0gKCpnZXRfVHRzRW5naW5lKSgpOworICAgICAgICBwSm5pU3RvcmFnZS0+bUVuZ2luZUxpYkhhbmRsZSA9IGVuZ2luZV9saWJfaGFuZGxlOworCisgICAgICAgIGFuZHJvaWRfdHRzX2VuZ2luZV90ICplbmdpbmUgPSBwSm5pU3RvcmFnZS0+bUVuZ2luZTsKKyAgICAgICAgaWYgKGVuZ2luZSkgeworICAgICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGwoZW5naW5lTXV0ZXgpOworICAgICAgICAgICAgZW5naW5lLT5mdW5jcy0+aW5pdCgKKyAgICAgICAgICAgICAgICBlbmdpbmUsCisgICAgICAgICAgICAgICAgX190dHNTeW50aERvbmVDQiwKKyAgICAgICAgICAgICAgICBlbmdDb25maWdTdHJpbmcpOworICAgICAgICB9CisKKyAgICAgICAgcmVzdWx0ID0gQU5EUk9JRF9UVFNfU1VDQ0VTUzsKICAgICB9CiAKICAgICAvLyB3ZSB1c2UgYSB3ZWFrIHJlZmVyZW5jZSBzbyB0aGUgU3ludGhQcm94eSBvYmplY3QgY2FuIGJlIGdhcmJhZ2UgY29sbGVjdGVkLgpAQCAtNDYyLDcgKzQ5Miw3IEBACiBhbmRyb2lkX3R0c19TeW50aFByb3h5X2lzTGFuZ3VhZ2VBdmFpbGFibGUoSk5JRW52ICplbnYsIGpvYmplY3QgdGhpeiwgamludCBqbmlEYXRhLAogICAgICAgICBqc3RyaW5nIGxhbmd1YWdlLCBqc3RyaW5nIGNvdW50cnksIGpzdHJpbmcgdmFyaWFudCkKIHsKLSAgICBpbnQgcmVzdWx0ID0gVFRTX0xBTkdfTk9UX1NVUFBPUlRFRDsKKyAgICBpbnQgcmVzdWx0ID0gQU5EUk9JRF9UVFNfTEFOR19OT1RfU1VQUE9SVEVEOwogCiAgICAgaWYgKGpuaURhdGEgPT0gMCkgewogICAgICAgICBMT0dFKCJhbmRyb2lkX3R0c19TeW50aFByb3h5X2lzTGFuZ3VhZ2VBdmFpbGFibGUoKTogaW52YWxpZCBKTkkgZGF0YSIpOwpAQCAtNDc0LDggKzUwNCwxMCBAQAogICAgIGNvbnN0IGNoYXIgKmNvdW50cnlOYXRpdmVTdHJpbmcgPSBlbnYtPkdldFN0cmluZ1VURkNoYXJzKGNvdW50cnksIDApOwogICAgIGNvbnN0IGNoYXIgKnZhcmlhbnROYXRpdmVTdHJpbmcgPSBlbnYtPkdldFN0cmluZ1VURkNoYXJzKHZhcmlhbnQsIDApOwogCi0gICAgaWYgKHBTeW50aERhdGEtPm1OYXRpdmVTeW50aEludGVyZmFjZSkgewotICAgICAgICByZXN1bHQgPSBwU3ludGhEYXRhLT5tTmF0aXZlU3ludGhJbnRlcmZhY2UtPmlzTGFuZ3VhZ2VBdmFpbGFibGUobGFuZ05hdGl2ZVN0cmluZywKKyAgICBhbmRyb2lkX3R0c19lbmdpbmVfdCAqZW5naW5lID0gcFN5bnRoRGF0YS0+bUVuZ2luZTsKKworICAgIGlmIChlbmdpbmUpIHsKKyAgICAgICAgcmVzdWx0ID0gZW5naW5lLT5mdW5jcy0+aXNMYW5ndWFnZUF2YWlsYWJsZShlbmdpbmUsbGFuZ05hdGl2ZVN0cmluZywKICAgICAgICAgICAgICAgICBjb3VudHJ5TmF0aXZlU3RyaW5nLCB2YXJpYW50TmF0aXZlU3RyaW5nKTsKICAgICB9CiAgICAgZW52LT5SZWxlYXNlU3RyaW5nVVRGQ2hhcnMobGFuZ3VhZ2UsIGxhbmdOYXRpdmVTdHJpbmcpOwpAQCAtNDg3LDcgKzUxOSw3IEBACiBzdGF0aWMgaW50CiBhbmRyb2lkX3R0c19TeW50aFByb3h5X3NldENvbmZpZyhKTklFbnYgKmVudiwgam9iamVjdCB0aGl6LCBqaW50IGpuaURhdGEsIGpzdHJpbmcgZW5naW5lQ29uZmlnKQogewotICAgIGludCByZXN1bHQgPSBUVFNfRkFJTFVSRTsKKyAgICBpbnQgcmVzdWx0ID0gQU5EUk9JRF9UVFNfRkFJTFVSRTsKIAogICAgIGlmIChqbmlEYXRhID09IDApIHsKICAgICAgICAgTE9HRSgiYW5kcm9pZF90dHNfU3ludGhQcm94eV9zZXRDb25maWcoKTogaW52YWxpZCBKTkkgZGF0YSIpOwpAQCAtNDk4LDkgKzUzMCwxMCBAQAogCiAgICAgU3ludGhQcm94eUpuaVN0b3JhZ2UqIHBTeW50aERhdGEgPSAoU3ludGhQcm94eUpuaVN0b3JhZ2UqKWpuaURhdGE7CiAgICAgY29uc3QgY2hhciAqZW5naW5lQ29uZmlnTmF0aXZlU3RyaW5nID0gZW52LT5HZXRTdHJpbmdVVEZDaGFycyhlbmdpbmVDb25maWcsIDApOworICAgIGFuZHJvaWRfdHRzX2VuZ2luZV90ICplbmdpbmUgPSBwU3ludGhEYXRhLT5tRW5naW5lOwogCi0gICAgaWYgKHBTeW50aERhdGEtPm1OYXRpdmVTeW50aEludGVyZmFjZSkgewotICAgICAgICByZXN1bHQgPSBwU3ludGhEYXRhLT5tTmF0aXZlU3ludGhJbnRlcmZhY2UtPnNldFByb3BlcnR5KEFORFJPSURfVFRTX0VOR0lORV9QUk9QRVJUWV9DT05GSUcsCisgICAgaWYgKGVuZ2luZSkgeworICAgICAgICByZXN1bHQgPSBlbmdpbmUtPmZ1bmNzLT5zZXRQcm9wZXJ0eShlbmdpbmUsQU5EUk9JRF9UVFNfRU5HSU5FX1BST1BFUlRZX0NPTkZJRywKICAgICAgICAgICAgICAgICBlbmdpbmVDb25maWdOYXRpdmVTdHJpbmcsIHN0cmxlbihlbmdpbmVDb25maWdOYXRpdmVTdHJpbmcpKTsKICAgICB9CiAgICAgZW52LT5SZWxlYXNlU3RyaW5nVVRGQ2hhcnMoZW5naW5lQ29uZmlnLCBlbmdpbmVDb25maWdOYXRpdmVTdHJpbmcpOwpAQCAtNTEyLDcgKzU0NSw3IEBACiBhbmRyb2lkX3R0c19TeW50aFByb3h5X3NldExhbmd1YWdlKEpOSUVudiAqZW52LCBqb2JqZWN0IHRoaXosIGppbnQgam5pRGF0YSwKICAgICAgICAganN0cmluZyBsYW5ndWFnZSwganN0cmluZyBjb3VudHJ5LCBqc3RyaW5nIHZhcmlhbnQpCiB7Ci0gICAgaW50IHJlc3VsdCA9IFRUU19MQU5HX05PVF9TVVBQT1JURUQ7CisgICAgaW50IHJlc3VsdCA9IEFORFJPSURfVFRTX0xBTkdfTk9UX1NVUFBPUlRFRDsKIAogICAgIGlmIChqbmlEYXRhID09IDApIHsKICAgICAgICAgTE9HRSgiYW5kcm9pZF90dHNfU3ludGhQcm94eV9zZXRMYW5ndWFnZSgpOiBpbnZhbGlkIEpOSSBkYXRhIik7CkBAIC01MjUsOSArNTU4LDEwIEBACiAgICAgY29uc3QgY2hhciAqbGFuZ05hdGl2ZVN0cmluZyA9IGVudi0+R2V0U3RyaW5nVVRGQ2hhcnMobGFuZ3VhZ2UsIDApOwogICAgIGNvbnN0IGNoYXIgKmNvdW50cnlOYXRpdmVTdHJpbmcgPSBlbnYtPkdldFN0cmluZ1VURkNoYXJzKGNvdW50cnksIDApOwogICAgIGNvbnN0IGNoYXIgKnZhcmlhbnROYXRpdmVTdHJpbmcgPSBlbnYtPkdldFN0cmluZ1VURkNoYXJzKHZhcmlhbnQsIDApOworICAgIGFuZHJvaWRfdHRzX2VuZ2luZV90ICplbmdpbmUgPSBwU3ludGhEYXRhLT5tRW5naW5lOwogCi0gICAgaWYgKHBTeW50aERhdGEtPm1OYXRpdmVTeW50aEludGVyZmFjZSkgewotICAgICAgICByZXN1bHQgPSBwU3ludGhEYXRhLT5tTmF0aXZlU3ludGhJbnRlcmZhY2UtPnNldExhbmd1YWdlKGxhbmdOYXRpdmVTdHJpbmcsCisgICAgaWYgKGVuZ2luZSkgeworICAgICAgICByZXN1bHQgPSBlbmdpbmUtPmZ1bmNzLT5zZXRMYW5ndWFnZShlbmdpbmUsIGxhbmdOYXRpdmVTdHJpbmcsCiAgICAgICAgICAgICAgICAgY291bnRyeU5hdGl2ZVN0cmluZywgdmFyaWFudE5hdGl2ZVN0cmluZyk7CiAgICAgfQogICAgIGVudi0+UmVsZWFzZVN0cmluZ1VURkNoYXJzKGxhbmd1YWdlLCBsYW5nTmF0aXZlU3RyaW5nKTsKQEAgLTU0MSw3ICs1NzUsNyBAQAogYW5kcm9pZF90dHNfU3ludGhQcm94eV9sb2FkTGFuZ3VhZ2UoSk5JRW52ICplbnYsIGpvYmplY3QgdGhpeiwgamludCBqbmlEYXRhLAogICAgICAgICBqc3RyaW5nIGxhbmd1YWdlLCBqc3RyaW5nIGNvdW50cnksIGpzdHJpbmcgdmFyaWFudCkKIHsKLSAgICBpbnQgcmVzdWx0ID0gVFRTX0xBTkdfTk9UX1NVUFBPUlRFRDsKKyAgICBpbnQgcmVzdWx0ID0gQU5EUk9JRF9UVFNfTEFOR19OT1RfU1VQUE9SVEVEOwogCiAgICAgaWYgKGpuaURhdGEgPT0gMCkgewogICAgICAgICBMT0dFKCJhbmRyb2lkX3R0c19TeW50aFByb3h5X2xvYWRMYW5ndWFnZSgpOiBpbnZhbGlkIEpOSSBkYXRhIik7CkBAIC01NTIsOSArNTg2LDEwIEBACiAgICAgY29uc3QgY2hhciAqbGFuZ05hdGl2ZVN0cmluZyA9IGVudi0+R2V0U3RyaW5nVVRGQ2hhcnMobGFuZ3VhZ2UsIDApOwogICAgIGNvbnN0IGNoYXIgKmNvdW50cnlOYXRpdmVTdHJpbmcgPSBlbnYtPkdldFN0cmluZ1VURkNoYXJzKGNvdW50cnksIDApOwogICAgIGNvbnN0IGNoYXIgKnZhcmlhbnROYXRpdmVTdHJpbmcgPSBlbnYtPkdldFN0cmluZ1VURkNoYXJzKHZhcmlhbnQsIDApOworICAgIGFuZHJvaWRfdHRzX2VuZ2luZV90ICplbmdpbmUgPSBwU3ludGhEYXRhLT5tRW5naW5lOwogCi0gICAgaWYgKHBTeW50aERhdGEtPm1OYXRpdmVTeW50aEludGVyZmFjZSkgewotICAgICAgICByZXN1bHQgPSBwU3ludGhEYXRhLT5tTmF0aXZlU3ludGhJbnRlcmZhY2UtPmxvYWRMYW5ndWFnZShsYW5nTmF0aXZlU3RyaW5nLAorICAgIGlmIChlbmdpbmUpIHsKKyAgICAgICAgcmVzdWx0ID0gZW5naW5lLT5mdW5jcy0+bG9hZExhbmd1YWdlKGVuZ2luZSwgbGFuZ05hdGl2ZVN0cmluZywKICAgICAgICAgICAgICAgICBjb3VudHJ5TmF0aXZlU3RyaW5nLCB2YXJpYW50TmF0aXZlU3RyaW5nKTsKICAgICB9CiAgICAgZW52LT5SZWxlYXNlU3RyaW5nVVRGQ2hhcnMobGFuZ3VhZ2UsIGxhbmdOYXRpdmVTdHJpbmcpOwpAQCAtNTY5LDcgKzYwNCw3IEBACiBhbmRyb2lkX3R0c19TeW50aFByb3h5X3NldFNwZWVjaFJhdGUoSk5JRW52ICplbnYsIGpvYmplY3QgdGhpeiwgamludCBqbmlEYXRhLAogICAgICAgICBqaW50IHNwZWVjaFJhdGUpCiB7Ci0gICAgaW50IHJlc3VsdCA9IFRUU19GQUlMVVJFOworICAgIGludCByZXN1bHQgPSBBTkRST0lEX1RUU19GQUlMVVJFOwogCiAgICAgaWYgKGpuaURhdGEgPT0gMCkgewogICAgICAgICBMT0dFKCJhbmRyb2lkX3R0c19TeW50aFByb3h5X3NldFNwZWVjaFJhdGUoKTogaW52YWxpZCBKTkkgZGF0YSIpOwpAQCAtNTg0LDkgKzYxOSwxMCBAQAogCiAgICAgU3ludGhQcm94eUpuaVN0b3JhZ2UqIHBTeW50aERhdGEgPSAoU3ludGhQcm94eUpuaVN0b3JhZ2UqKWpuaURhdGE7CiAgICAgTE9HSSgic2V0dGluZyBzcGVlY2ggcmF0ZSB0byAlZCIsIHNwZWVjaFJhdGUpOworICAgIGFuZHJvaWRfdHRzX2VuZ2luZV90ICplbmdpbmUgPSBwU3ludGhEYXRhLT5tRW5naW5lOwogCi0gICAgaWYgKHBTeW50aERhdGEtPm1OYXRpdmVTeW50aEludGVyZmFjZSkgewotICAgICAgICByZXN1bHQgPSBwU3ludGhEYXRhLT5tTmF0aXZlU3ludGhJbnRlcmZhY2UtPnNldFByb3BlcnR5KCJyYXRlIiwgYnVmZmVyLCBidWZTaXplKTsKKyAgICBpZiAoZW5naW5lKSB7CisgICAgICAgIHJlc3VsdCA9IGVuZ2luZS0+ZnVuY3MtPnNldFByb3BlcnR5KGVuZ2luZSwgInJhdGUiLCBidWZmZXIsIGJ1ZlNpemUpOwogICAgIH0KIAogICAgIHJldHVybiByZXN1bHQ7CkBAIC01OTcsNyArNjMzLDcgQEAKIGFuZHJvaWRfdHRzX1N5bnRoUHJveHlfc2V0UGl0Y2goSk5JRW52ICplbnYsIGpvYmplY3QgdGhpeiwgamludCBqbmlEYXRhLAogICAgICAgICBqaW50IHBpdGNoKQogewotICAgIGludCByZXN1bHQgPSBUVFNfRkFJTFVSRTsKKyAgICBpbnQgcmVzdWx0ID0gQU5EUk9JRF9UVFNfRkFJTFVSRTsKIAogICAgIGlmIChqbmlEYXRhID09IDApIHsKICAgICAgICAgTE9HRSgiYW5kcm9pZF90dHNfU3ludGhQcm94eV9zZXRQaXRjaCgpOiBpbnZhbGlkIEpOSSBkYXRhIik7CkBAIC02MTIsOSArNjQ4LDEwIEBACiAKICAgICBTeW50aFByb3h5Sm5pU3RvcmFnZSogcFN5bnRoRGF0YSA9IChTeW50aFByb3h5Sm5pU3RvcmFnZSopam5pRGF0YTsKICAgICBMT0dJKCJzZXR0aW5nIHBpdGNoIHRvICVkIiwgcGl0Y2gpOworICAgIGFuZHJvaWRfdHRzX2VuZ2luZV90ICplbmdpbmUgPSBwU3ludGhEYXRhLT5tRW5naW5lOwogCi0gICAgaWYgKHBTeW50aERhdGEtPm1OYXRpdmVTeW50aEludGVyZmFjZSkgewotICAgICAgICByZXN1bHQgPSBwU3ludGhEYXRhLT5tTmF0aXZlU3ludGhJbnRlcmZhY2UtPnNldFByb3BlcnR5KCJwaXRjaCIsIGJ1ZmZlciwgYnVmU2l6ZSk7CisgICAgaWYgKGVuZ2luZSkgeworICAgICAgICByZXN1bHQgPSBlbmdpbmUtPmZ1bmNzLT5zZXRQcm9wZXJ0eShlbmdpbmUsICJwaXRjaCIsIGJ1ZmZlciwgYnVmU2l6ZSk7CiAgICAgfQogCiAgICAgcmV0dXJuIHJlc3VsdDsKQEAgLTYyNSw3ICs2NjIsNyBAQAogYW5kcm9pZF90dHNfU3ludGhQcm94eV9zeW50aGVzaXplVG9GaWxlKEpOSUVudiAqZW52LCBqb2JqZWN0IHRoaXosIGppbnQgam5pRGF0YSwKICAgICAgICAganN0cmluZyB0ZXh0SmF2YVN0cmluZywganN0cmluZyBmaWxlbmFtZUphdmFTdHJpbmcpCiB7Ci0gICAgaW50IHJlc3VsdCA9IFRUU19GQUlMVVJFOworICAgIGludCByZXN1bHQgPSBBTkRST0lEX1RUU19GQUlMVVJFOwogCiAgICAgaWYgKGpuaURhdGEgPT0gMCkgewogICAgICAgICBMT0dFKCJhbmRyb2lkX3R0c19TeW50aFByb3h5X3N5bnRoZXNpemVUb0ZpbGUoKTogaW52YWxpZCBKTkkgZGF0YSIpOwpAQCAtNjMzLDcgKzY3MCw3IEBACiAgICAgfQogCiAgICAgU3ludGhQcm94eUpuaVN0b3JhZ2UqIHBTeW50aERhdGEgPSAoU3ludGhQcm94eUpuaVN0b3JhZ2UqKWpuaURhdGE7Ci0gICAgaWYgKCFwU3ludGhEYXRhLT5tTmF0aXZlU3ludGhJbnRlcmZhY2UpIHsKKyAgICBpZiAoIXBTeW50aERhdGEtPm1FbmdpbmUpIHsKICAgICAgICAgTE9HRSgiYW5kcm9pZF90dHNfU3ludGhQcm94eV9zeW50aGVzaXplVG9GaWxlKCk6IGludmFsaWQgZW5naW5lIGhhbmRsZSIpOwogICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgIH0KQEAgLTY0MywxMiArNjgwLDIyIEBACiAgICAgTXV0ZXg6OkF1dG9sb2NrIGwoZW5naW5lTXV0ZXgpOwogCiAgICAgLy8gUmV0cmlldmUgYXVkaW8gcGFyYW1ldGVycyBiZWZvcmUgd3JpdGluZyB0aGUgZmlsZSBoZWFkZXIKLSAgICBBdWRpb1N5c3RlbTo6YXVkaW9fZm9ybWF0IGVuY29kaW5nID0gREVGQVVMVF9UVFNfRk9STUFUOworICAgIEF1ZGlvU3lzdGVtOjphdWRpb19mb3JtYXQgZW5jb2Rpbmc7CiAgICAgdWludDMyX3QgcmF0ZSA9IERFRkFVTFRfVFRTX1JBVEU7CiAgICAgaW50IGNoYW5uZWxzID0gREVGQVVMVF9UVFNfTkJfQ0hBTk5FTFM7Ci0gICAgcFN5bnRoRGF0YS0+bU5hdGl2ZVN5bnRoSW50ZXJmYWNlLT5zZXRBdWRpb0Zvcm1hdChlbmNvZGluZywgcmF0ZSwgY2hhbm5lbHMpOworICAgIGFuZHJvaWRfdHRzX2VuZ2luZV90ICplbmdpbmUgPSBwU3ludGhEYXRhLT5tRW5naW5lOworICAgIGFuZHJvaWRfdHRzX2F1ZGlvX2Zvcm1hdF90ICBmb3JtYXQgPSBBTkRST0lEX1RUU19BVURJT19GT1JNQVRfREVGQVVMVDsKIAotICAgIGlmICgoZW5jb2RpbmcgIT0gQXVkaW9TeXN0ZW06OlBDTV8xNl9CSVQpICYmIChlbmNvZGluZyAhPSBBdWRpb1N5c3RlbTo6UENNXzhfQklUKSkgeworICAgIGVuZ2luZS0+ZnVuY3MtPnNldEF1ZGlvRm9ybWF0KGVuZ2luZSwgJmZvcm1hdCwgJnJhdGUsICZjaGFubmVscyk7CisKKyAgICBzd2l0Y2ggKGZvcm1hdCkgeworICAgIGNhc2UgQU5EUk9JRF9UVFNfQVVESU9fRk9STUFUX1BDTV8xNl9CSVQ6CisgICAgICAgIGVuY29kaW5nID0gQXVkaW9TeXN0ZW06OlBDTV8xNl9CSVQ7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQU5EUk9JRF9UVFNfQVVESU9fRk9STUFUX1BDTV84X0JJVDoKKyAgICAgICAgZW5jb2RpbmcgPSBBdWRpb1N5c3RlbTo6UENNXzhfQklUOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgogICAgICAgICBMT0dFKCJhbmRyb2lkX3R0c19TeW50aFByb3h5X3N5bnRoZXNpemVUb0ZpbGUoKTogZW5naW5lIHVzZXMgaW52YWxpZCBmb3JtYXQiKTsKICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICB9CkBAIC02NzcsNyArNzI0LDggQEAKICAgICB1bnNpZ25lZCBpbnQgdW5pcXVlX2lkZW50aWZpZXI7CiAKICAgICBtZW1zZXQocFN5bnRoRGF0YS0+bUJ1ZmZlciwgMCwgcFN5bnRoRGF0YS0+bUJ1ZmZlclNpemUpOwotICAgIHJlc3VsdCA9IHBTeW50aERhdGEtPm1OYXRpdmVTeW50aEludGVyZmFjZS0+c3ludGhlc2l6ZVRleHQodGV4dE5hdGl2ZVN0cmluZywKKworICAgIHJlc3VsdCA9IGVuZ2luZS0+ZnVuY3MtPnN5bnRoZXNpemVUZXh0KGVuZ2luZSwgdGV4dE5hdGl2ZVN0cmluZywKICAgICAgICAgICAgIHBTeW50aERhdGEtPm1CdWZmZXIsIHBTeW50aERhdGEtPm1CdWZmZXJTaXplLCAodm9pZCAqKXBGb3JBZnRlcik7CiAKICAgICBsb25nIGZpbGVsZW4gPSBmdGVsbChwRm9yQWZ0ZXItPm91dHB1dEZpbGUpOwpAQCAtNzM3LDcgKzc4NSw3IEBACiBhbmRyb2lkX3R0c19TeW50aFByb3h5X3NwZWFrKEpOSUVudiAqZW52LCBqb2JqZWN0IHRoaXosIGppbnQgam5pRGF0YSwKICAgICAgICAganN0cmluZyB0ZXh0SmF2YVN0cmluZywgamludCBqYXZhU3RyZWFtVHlwZSkKIHsKLSAgICBpbnQgcmVzdWx0ID0gVFRTX0ZBSUxVUkU7CisgICAgaW50IHJlc3VsdCA9IEFORFJPSURfVFRTX0ZBSUxVUkU7CiAKICAgICBpZiAoam5pRGF0YSA9PSAwKSB7CiAgICAgICAgIExPR0UoImFuZHJvaWRfdHRzX1N5bnRoUHJveHlfc3BlYWsoKTogaW52YWxpZCBKTkkgZGF0YSIpOwpAQCAtNzU5LDEwICs4MDcsMTIgQEAKICAgICBwRm9yQWZ0ZXItPnVzYWdlTW9kZSAgPSBVU0FHRU1PREVfUExBWV9JTU1FRElBVEVMWTsKICAgICBwRm9yQWZ0ZXItPnN0cmVhbVR5cGUgPSAoQXVkaW9TeXN0ZW06OnN0cmVhbV90eXBlKSBqYXZhU3RyZWFtVHlwZTsKIAotICAgIGlmIChwU3ludGhEYXRhLT5tTmF0aXZlU3ludGhJbnRlcmZhY2UpIHsKKyAgICBpZiAocFN5bnRoRGF0YS0+bUVuZ2luZSkgewogICAgICAgICBjb25zdCBjaGFyICp0ZXh0TmF0aXZlU3RyaW5nID0gZW52LT5HZXRTdHJpbmdVVEZDaGFycyh0ZXh0SmF2YVN0cmluZywgMCk7CiAgICAgICAgIG1lbXNldChwU3ludGhEYXRhLT5tQnVmZmVyLCAwLCBwU3ludGhEYXRhLT5tQnVmZmVyU2l6ZSk7Ci0gICAgICAgIHJlc3VsdCA9IHBTeW50aERhdGEtPm1OYXRpdmVTeW50aEludGVyZmFjZS0+c3ludGhlc2l6ZVRleHQodGV4dE5hdGl2ZVN0cmluZywKKyAgICAgICAgYW5kcm9pZF90dHNfZW5naW5lX3QgKmVuZ2luZSA9IHBTeW50aERhdGEtPm1FbmdpbmU7CisKKyAgICAgICAgcmVzdWx0ID0gZW5naW5lLT5mdW5jcy0+c3ludGhlc2l6ZVRleHQoZW5naW5lLCB0ZXh0TmF0aXZlU3RyaW5nLAogICAgICAgICAgICAgICAgIHBTeW50aERhdGEtPm1CdWZmZXIsIHBTeW50aERhdGEtPm1CdWZmZXJTaXplLCAodm9pZCAqKXBGb3JBZnRlcik7CiAgICAgICAgIGVudi0+UmVsZWFzZVN0cmluZ1VURkNoYXJzKHRleHRKYXZhU3RyaW5nLCB0ZXh0TmF0aXZlU3RyaW5nKTsKICAgICB9CkBAIC03NzQsNyArODI0LDcgQEAKIHN0YXRpYyBpbnQKIGFuZHJvaWRfdHRzX1N5bnRoUHJveHlfc3RvcChKTklFbnYgKmVudiwgam9iamVjdCB0aGl6LCBqaW50IGpuaURhdGEpCiB7Ci0gICAgaW50IHJlc3VsdCA9IFRUU19GQUlMVVJFOworICAgIGludCByZXN1bHQgPSBBTkRST0lEX1RUU19GQUlMVVJFOwogCiAgICAgaWYgKGpuaURhdGEgPT0gMCkgewogICAgICAgICBMT0dFKCJhbmRyb2lkX3R0c19TeW50aFByb3h5X3N0b3AoKTogaW52YWxpZCBKTkkgZGF0YSIpOwpAQCAtNzkwLDggKzg0MCw5IEBACiAgICAgfQogICAgIHBTeW50aERhdGEtPm1QbGF5TG9jay51bmxvY2soKTsKIAotICAgIGlmIChwU3ludGhEYXRhLT5tTmF0aXZlU3ludGhJbnRlcmZhY2UpIHsKLSAgICAgICAgcmVzdWx0ID0gcFN5bnRoRGF0YS0+bU5hdGl2ZVN5bnRoSW50ZXJmYWNlLT5zdG9wKCk7CisgICAgYW5kcm9pZF90dHNfZW5naW5lX3QgKmVuZ2luZSA9IHBTeW50aERhdGEtPm1FbmdpbmU7CisgICAgaWYgKGVuZ2luZSkgeworICAgICAgICByZXN1bHQgPSBlbmdpbmUtPmZ1bmNzLT5zdG9wKGVuZ2luZSk7CiAgICAgfQogCiAgICAgcmV0dXJuIHJlc3VsdDsKQEAgLTgwMSw3ICs4NTIsNyBAQAogc3RhdGljIGludAogYW5kcm9pZF90dHNfU3ludGhQcm94eV9zdG9wU3luYyhKTklFbnYgKmVudiwgam9iamVjdCB0aGl6LCBqaW50IGpuaURhdGEpCiB7Ci0gICAgaW50IHJlc3VsdCA9IFRUU19GQUlMVVJFOworICAgIGludCByZXN1bHQgPSBBTkRST0lEX1RUU19GQUlMVVJFOwogCiAgICAgaWYgKGpuaURhdGEgPT0gMCkgewogICAgICAgICBMT0dFKCJhbmRyb2lkX3R0c19TeW50aFByb3h5X3N0b3AoKTogaW52YWxpZCBKTkkgZGF0YSIpOwpAQCAtODI5LDcgKzg4MCw3IEBACiAKICAgICBTeW50aFByb3h5Sm5pU3RvcmFnZSogcFN5bnRoRGF0YSA9IChTeW50aFByb3h5Sm5pU3RvcmFnZSopam5pRGF0YTsKIAotICAgIGlmIChwU3ludGhEYXRhLT5tTmF0aXZlU3ludGhJbnRlcmZhY2UpIHsKKyAgICBpZiAocFN5bnRoRGF0YS0+bUVuZ2luZSkgewogICAgICAgICBzaXplX3QgYnVmU2l6ZSA9IDEwMDsKICAgICAgICAgY2hhciBsYW5nW2J1ZlNpemVdOwogICAgICAgICBjaGFyIGNvdW50cnlbYnVmU2l6ZV07CkBAIC04MzksNyArODkwLDkgQEAKICAgICAgICAgbWVtc2V0KHZhcmlhbnQsIDAsIGJ1ZlNpemUpOwogICAgICAgICBqb2JqZWN0QXJyYXkgcmV0TG9jYWxlID0gKGpvYmplY3RBcnJheSllbnYtPk5ld09iamVjdEFycmF5KDMsCiAgICAgICAgICAgICAgICAgZW52LT5GaW5kQ2xhc3MoImphdmEvbGFuZy9TdHJpbmciKSwgZW52LT5OZXdTdHJpbmdVVEYoIiIpKTsKLSAgICAgICAgcFN5bnRoRGF0YS0+bU5hdGl2ZVN5bnRoSW50ZXJmYWNlLT5nZXRMYW5ndWFnZShsYW5nLCBjb3VudHJ5LCB2YXJpYW50KTsKKworICAgICAgICBhbmRyb2lkX3R0c19lbmdpbmVfdCAqZW5naW5lID0gcFN5bnRoRGF0YS0+bUVuZ2luZTsKKyAgICAgICAgZW5naW5lLT5mdW5jcy0+Z2V0TGFuZ3VhZ2UoZW5naW5lLCBsYW5nLCBjb3VudHJ5LCB2YXJpYW50KTsKICAgICAgICAgZW52LT5TZXRPYmplY3RBcnJheUVsZW1lbnQocmV0TG9jYWxlLCAwLCBlbnYtPk5ld1N0cmluZ1VURihsYW5nKSk7CiAgICAgICAgIGVudi0+U2V0T2JqZWN0QXJyYXlFbGVtZW50KHJldExvY2FsZSwgMSwgZW52LT5OZXdTdHJpbmdVVEYoY291bnRyeSkpOwogICAgICAgICBlbnYtPlNldE9iamVjdEFycmF5RWxlbWVudChyZXRMb2NhbGUsIDIsIGVudi0+TmV3U3RyaW5nVVRGKHZhcmlhbnQpKTsKQEAgLTg2NCw4ICs5MTcsOSBAQAogICAgIGNoYXIgYnVmW2J1ZlNpemVdOwogICAgIG1lbXNldChidWYsIDAsIGJ1ZlNpemUpOwogICAgIC8vIFRPRE8gY2hlY2sgcmV0dXJuIGNvZGVzCi0gICAgaWYgKHBTeW50aERhdGEtPm1OYXRpdmVTeW50aEludGVyZmFjZSkgewotICAgICAgICBwU3ludGhEYXRhLT5tTmF0aXZlU3ludGhJbnRlcmZhY2UtPmdldFByb3BlcnR5KCJyYXRlIiwgYnVmLCAmYnVmU2l6ZSk7CisgICAgYW5kcm9pZF90dHNfZW5naW5lX3QgKmVuZ2luZSA9IHBTeW50aERhdGEtPm1FbmdpbmU7CisgICAgaWYgKGVuZ2luZSkgeworICAgICAgICBlbmdpbmUtPmZ1bmNzLT5nZXRQcm9wZXJ0eShlbmdpbmUsInJhdGUiLCBidWYsICZidWZTaXplKTsKICAgICB9CiAgICAgcmV0dXJuIGF0b2koYnVmKTsKIH0KZGlmZiAtLWdpdCBhL3BvbGljeS9zcmMvY29tL2FuZHJvaWQvaW50ZXJuYWwvcG9saWN5L2ltcGwvS2V5Z3VhcmRWaWV3TWFuYWdlci5qYXZhIGIvcG9saWN5L3NyYy9jb20vYW5kcm9pZC9pbnRlcm5hbC9wb2xpY3kvaW1wbC9LZXlndWFyZFZpZXdNYW5hZ2VyLmphdmEKaW5kZXggYmExZDdmNS4uNzBhNGIyMCAxMDA2NDQKLS0tIGEvcG9saWN5L3NyYy9jb20vYW5kcm9pZC9pbnRlcm5hbC9wb2xpY3kvaW1wbC9LZXlndWFyZFZpZXdNYW5hZ2VyLmphdmEKKysrIGIvcG9saWN5L3NyYy9jb20vYW5kcm9pZC9pbnRlcm5hbC9wb2xpY3kvaW1wbC9LZXlndWFyZFZpZXdNYW5hZ2VyLmphdmEKQEAgLTExMyw3ICsxMTMsMTUgQEAKICAgICAgICAgICAgICAgICAgICAgZmxhZ3MsIFBpeGVsRm9ybWF0LlRSQU5TTFVDRU5UKTsKICAgICAgICAgICAgIGxwLnNvZnRJbnB1dE1vZGUgPSBXaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcy5TT0ZUX0lOUFVUX0FESlVTVF9QQU47CiAgICAgICAgICAgICBscC53aW5kb3dBbmltYXRpb25zID0gY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZS5BbmltYXRpb25fTG9ja1NjcmVlbjsKLSAgICAgICAgICAgIGxwLnNjcmVlbk9yaWVudGF0aW9uID0gQWN0aXZpdHlJbmZvLlNDUkVFTl9PUklFTlRBVElPTl9OT1NFTlNPUjsKKworICAgICAgICAgICAgaWYgKG1Db250ZXh0LmdldFJlc291cmNlcygpLmdldEJvb2xlYW4oUi5ib29sLmNvbmZpZ19lbmFibGVMb2NrU2NyZWVuUm90YXRpb24pKSB7CisgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiUm90YXRpb24gc2Vuc29yIGZvciBsb2NrIHNjcmVlbiBPbiEiKTsKKyAgICAgICAgICAgICAgICBscC5zY3JlZW5PcmllbnRhdGlvbiA9IEFjdGl2aXR5SW5mby5TQ1JFRU5fT1JJRU5UQVRJT05fU0VOU09SOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJSb3RhdGlvbiBzZW5zb3IgZm9yIGxvY2sgc2NyZWVuIE9mZiEiKTsKKyAgICAgICAgICAgICAgICBscC5zY3JlZW5PcmllbnRhdGlvbiA9IEFjdGl2aXR5SW5mby5TQ1JFRU5fT1JJRU5UQVRJT05fTk9TRU5TT1I7CisgICAgICAgICAgICB9CisKICAgICAgICAgICAgIGxwLnNldFRpdGxlKCJLZXlndWFyZCIpOwogICAgICAgICAgICAgbVdpbmRvd0xheW91dFBhcmFtcyA9IGxwOwogCmRpZmYgLS1naXQgYS9wb2xpY3kvc3JjL2NvbS9hbmRyb2lkL2ludGVybmFsL3BvbGljeS9pbXBsL0tleWd1YXJkVmlld01lZGlhdG9yLmphdmEgYi9wb2xpY3kvc3JjL2NvbS9hbmRyb2lkL2ludGVybmFsL3BvbGljeS9pbXBsL0tleWd1YXJkVmlld01lZGlhdG9yLmphdmEKaW5kZXggODgyMDNjMy4uZDE5ZjMxOCAxMDA2NDQKLS0tIGEvcG9saWN5L3NyYy9jb20vYW5kcm9pZC9pbnRlcm5hbC9wb2xpY3kvaW1wbC9LZXlndWFyZFZpZXdNZWRpYXRvci5qYXZhCisrKyBiL3BvbGljeS9zcmMvY29tL2FuZHJvaWQvaW50ZXJuYWwvcG9saWN5L2ltcGwvS2V5Z3VhcmRWaWV3TWVkaWF0b3IuamF2YQpAQCAtMTYsNiArMTYsOCBAQAogCiBwYWNrYWdlIGNvbS5hbmRyb2lkLmludGVybmFsLnBvbGljeS5pbXBsOwogCitpbXBvcnQgc3RhdGljIGFuZHJvaWQucHJvdmlkZXIuU2V0dGluZ3MuU3lzdGVtLlNDUkVFTl9PRkZfVElNRU9VVDsKKwogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5JY2NDYXJkOwogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLndpZGdldC5Mb2NrUGF0dGVyblV0aWxzOwogCkBAIC00MSw2ICs0Myw3IEBACiBpbXBvcnQgYW5kcm9pZC5vcy5TeXN0ZW1DbG9jazsKIGltcG9ydCBhbmRyb2lkLm9zLlN5c3RlbVByb3BlcnRpZXM7CiBpbXBvcnQgYW5kcm9pZC5wcm92aWRlci5TZXR0aW5nczsKK2ltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLlNldHRpbmdzLlNldHRpbmdOb3RGb3VuZEV4Y2VwdGlvbjsKIGltcG9ydCBhbmRyb2lkLnRlbGVwaG9ueS5UZWxlcGhvbnlNYW5hZ2VyOwogaW1wb3J0IGFuZHJvaWQudXRpbC5Db25maWc7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkV2ZW50TG9nOwpAQCAtOTMsNiArOTYsNyBAQAogICovCiBwdWJsaWMgY2xhc3MgS2V5Z3VhcmRWaWV3TWVkaWF0b3IgaW1wbGVtZW50cyBLZXlndWFyZFZpZXdDYWxsYmFjaywKICAgICAgICAgS2V5Z3VhcmRVcGRhdGVNb25pdG9yLlNpbVN0YXRlQ2FsbGJhY2sgeworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBLRVlHVUFSRF9ESVNQTEFZX1RJTUVPVVRfREVMQVlfREVGQVVMVCA9IDMwMDAwOwogICAgIHByaXZhdGUgZmluYWwgc3RhdGljIGJvb2xlYW4gREVCVUcgPSBmYWxzZSAmJiBDb25maWcuTE9HRDsKICAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBib29sZWFuIERCR19XQUtFID0gREVCVUcgfHwgdHJ1ZTsKIApAQCAtMTMzLDcgKzEzNyw3IEBACiAgICAgICogdHVybmluZyBvbiB0aGUga2V5Z3VhcmQgKGkuZSwgdGhlIHVzZXIgaGFzIHRoaXMgbXVjaCB0aW1lIHRvIHR1cm4KICAgICAgKiB0aGUgc2NyZWVuIGJhY2sgb24gd2l0aG91dCBoYXZpbmcgdG8gZmFjZSB0aGUga2V5Z3VhcmQpLgogICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBLRVlHVUFSRF9ERUxBWV9NUyA9IDUwMDA7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEtFWUdVQVJEX0xPQ0tfQUZURVJfREVMQVlfREVGQVVMVCA9IDUwMDA7CiAKICAgICAvKioKICAgICAgKiBIb3cgbG9uZyB3ZSdsbCB3YWl0IGZvciB0aGUge0BsaW5rIEtleWd1YXJkVmlld0NhbGxiYWNrI2tleWd1YXJkRG9uZURyYXdpbmcoKX0KQEAgLTI0NCw2ICsyNDgsNyBAQAogICAgICAqIHRoZSBrZXlndWFyZC4KICAgICAgKi8KICAgICBwcml2YXRlIGJvb2xlYW4gbVdhaXRpbmdVbnRpbEtleWd1YXJkVmlzaWJsZSA9IGZhbHNlOworICAgIHByaXZhdGUgTG9ja1BhdHRlcm5VdGlscyBtTG9ja1BhdHRlcm5VdGlsczsKIAogICAgIHB1YmxpYyBLZXlndWFyZFZpZXdNZWRpYXRvcihDb250ZXh0IGNvbnRleHQsIFBob25lV2luZG93TWFuYWdlciBjYWxsYmFjaywKICAgICAgICAgICAgIExvY2FsUG93ZXJNYW5hZ2VyIHBvd2VyTWFuYWdlcikgewpAQCAtMjc1LDggKzI4MCw5IEBACiAKICAgICAgICAgbVVwZGF0ZU1vbml0b3IucmVnaXN0ZXJTaW1TdGF0ZUNhbGxiYWNrKHRoaXMpOwogCi0gICAgICAgIG1LZXlndWFyZFZpZXdQcm9wZXJ0aWVzID0gbmV3IExvY2tQYXR0ZXJuS2V5Z3VhcmRWaWV3UHJvcGVydGllcygKLSAgICAgICAgICAgICAgICBuZXcgTG9ja1BhdHRlcm5VdGlscyhtQ29udGV4dCksIG1VcGRhdGVNb25pdG9yKTsKKyAgICAgICAgbUxvY2tQYXR0ZXJuVXRpbHMgPSBuZXcgTG9ja1BhdHRlcm5VdGlscyhtQ29udGV4dCk7CisgICAgICAgIG1LZXlndWFyZFZpZXdQcm9wZXJ0aWVzIAorICAgICAgICAgICAgICAgID0gbmV3IExvY2tQYXR0ZXJuS2V5Z3VhcmRWaWV3UHJvcGVydGllcyhtTG9ja1BhdHRlcm5VdGlscywgbVVwZGF0ZU1vbml0b3IpOwogCiAgICAgICAgIG1LZXlndWFyZFZpZXdNYW5hZ2VyID0gbmV3IEtleWd1YXJkVmlld01hbmFnZXIoCiAgICAgICAgICAgICAgICAgY29udGV4dCwgV2luZG93TWFuYWdlckltcGwuZ2V0RGVmYXVsdCgpLCB0aGlzLApAQCAtMzI2LDE1ICszMzIsNDYgQEAKICAgICAgICAgICAgICAgICAvLyB0byBlbmFibGUgaXQgYSBsaXR0bGUgYml0IGxhdGVyIChpLmUsIGdpdmUgdGhlIHVzZXIgYSBjaGFuY2UKICAgICAgICAgICAgICAgICAvLyB0byB0dXJuIHRoZSBzY3JlZW4gYmFjayBvbiB3aXRoaW4gYSBjZXJ0YWluIHdpbmRvdyB3aXRob3V0CiAgICAgICAgICAgICAgICAgLy8gaGF2aW5nIHRvIHVubG9jayB0aGUgc2NyZWVuKQotICAgICAgICAgICAgICAgIGxvbmcgd2hlbiA9IFN5c3RlbUNsb2NrLmVsYXBzZWRSZWFsdGltZSgpICsgS0VZR1VBUkRfREVMQVlfTVM7Ci0gICAgICAgICAgICAgICAgSW50ZW50IGludGVudCA9IG5ldyBJbnRlbnQoREVMQVlFRF9LRVlHVUFSRF9BQ1RJT04pOwotICAgICAgICAgICAgICAgIGludGVudC5wdXRFeHRyYSgic2VxIiwgbURlbGF5ZWRTaG93aW5nU2VxdWVuY2UpOwotICAgICAgICAgICAgICAgIFBlbmRpbmdJbnRlbnQgc2VuZGVyID0gUGVuZGluZ0ludGVudC5nZXRCcm9hZGNhc3QobUNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAwLCBpbnRlbnQsIFBlbmRpbmdJbnRlbnQuRkxBR19DQU5DRUxfQ1VSUkVOVCk7Ci0gICAgICAgICAgICAgICAgbUFsYXJtTWFuYWdlci5zZXQoQWxhcm1NYW5hZ2VyLkVMQVBTRURfUkVBTFRJTUVfV0FLRVVQLCB3aGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgc2VuZGVyKTsKLSAgICAgICAgICAgICAgICBpZiAoREVCVUcpIExvZy5kKFRBRywgInNldHRpbmcgYWxhcm0gdG8gdHVybiBvZmYga2V5Z3VhcmQsIHNlcSA9ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgbURlbGF5ZWRTaG93aW5nU2VxdWVuY2UpOworICAgICAgICAgICAgICAgIGZpbmFsIENvbnRlbnRSZXNvbHZlciBjciA9IG1Db250ZXh0LmdldENvbnRlbnRSZXNvbHZlcigpOworCisgICAgICAgICAgICAgICAgLy8gRnJvbSBEaXNwbGF5U2V0dGluZ3MKKyAgICAgICAgICAgICAgICBsb25nIGRpc3BsYXlUaW1lb3V0ID0gU2V0dGluZ3MuU3lzdGVtLmdldEludChjciwgU0NSRUVOX09GRl9USU1FT1VULAorICAgICAgICAgICAgICAgICAgICAgICAgS0VZR1VBUkRfRElTUExBWV9USU1FT1VUX0RFTEFZX0RFRkFVTFQpOworCisgICAgICAgICAgICAgICAgLy8gRnJvbSBTZWN1cml0eVNldHRpbmdzCisgICAgICAgICAgICAgICAgZmluYWwgbG9uZyBsb2NrQWZ0ZXJUaW1lb3V0ID0gU2V0dGluZ3MuU2VjdXJlLmdldEludChjciwKKyAgICAgICAgICAgICAgICAgICAgICAgIFNldHRpbmdzLlNlY3VyZS5MT0NLX1NDUkVFTl9MT0NLX0FGVEVSX1RJTUVPVVQsCisgICAgICAgICAgICAgICAgICAgICAgICBLRVlHVUFSRF9MT0NLX0FGVEVSX0RFTEFZX0RFRkFVTFQpOworCisgICAgICAgICAgICAgICAgLy8gRnJvbSBEZXZpY2VQb2xpY3lBZG1pbgorICAgICAgICAgICAgICAgIGZpbmFsIGxvbmcgcG9saWN5VGltZW91dCA9IG1Mb2NrUGF0dGVyblV0aWxzLmdldERldmljZVBvbGljeU1hbmFnZXIoKQorICAgICAgICAgICAgICAgICAgICAgICAgLmdldE1heGltdW1UaW1lVG9Mb2NrKG51bGwpOworCisgICAgICAgICAgICAgICAgbG9uZyB0aW1lb3V0OworICAgICAgICAgICAgICAgIGlmIChwb2xpY3lUaW1lb3V0ID4gMCkgeworICAgICAgICAgICAgICAgICAgICAvLyBwb2xpY3kgaW4gZWZmZWN0LiBNYWtlIHN1cmUgd2UgZG9uJ3QgZ28gYmV5b25kIHBvbGljeSBsaW1pdC4KKyAgICAgICAgICAgICAgICAgICAgZGlzcGxheVRpbWVvdXQgPSBNYXRoLm1heChkaXNwbGF5VGltZW91dCwgMCk7IC8vIGlnbm9yZSBuZWdhdGl2ZSB2YWx1ZXMKKyAgICAgICAgICAgICAgICAgICAgdGltZW91dCA9IE1hdGgubWluKHBvbGljeVRpbWVvdXQgLSBkaXNwbGF5VGltZW91dCwgbG9ja0FmdGVyVGltZW91dCk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgdGltZW91dCA9IGxvY2tBZnRlclRpbWVvdXQ7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKHRpbWVvdXQgPD0gMCkgeworICAgICAgICAgICAgICAgICAgICAvLyBMb2NrIG5vdworICAgICAgICAgICAgICAgICAgICBtU3VwcHJlc3NOZXh0TG9ja1NvdW5kID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgZG9LZXlndWFyZCgpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIC8vIExvY2sgaW4gdGhlIGZ1dHVyZQorICAgICAgICAgICAgICAgICAgICBsb25nIHdoZW4gPSBTeXN0ZW1DbG9jay5lbGFwc2VkUmVhbHRpbWUoKSArIHRpbWVvdXQ7CisgICAgICAgICAgICAgICAgICAgIEludGVudCBpbnRlbnQgPSBuZXcgSW50ZW50KERFTEFZRURfS0VZR1VBUkRfQUNUSU9OKTsKKyAgICAgICAgICAgICAgICAgICAgaW50ZW50LnB1dEV4dHJhKCJzZXEiLCBtRGVsYXllZFNob3dpbmdTZXF1ZW5jZSk7CisgICAgICAgICAgICAgICAgICAgIFBlbmRpbmdJbnRlbnQgc2VuZGVyID0gUGVuZGluZ0ludGVudC5nZXRCcm9hZGNhc3QobUNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgaW50ZW50LCBQZW5kaW5nSW50ZW50LkZMQUdfQ0FOQ0VMX0NVUlJFTlQpOworICAgICAgICAgICAgICAgICAgICBtQWxhcm1NYW5hZ2VyLnNldChBbGFybU1hbmFnZXIuRUxBUFNFRF9SRUFMVElNRV9XQUtFVVAsIHdoZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VuZGVyKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKERFQlVHKSBMb2cuZChUQUcsICJzZXR0aW5nIGFsYXJtIHRvIHR1cm4gb2ZmIGtleWd1YXJkLCBzZXEgPSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBtRGVsYXllZFNob3dpbmdTZXF1ZW5jZSk7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfSBlbHNlIGlmICh3aHkgPT0gV2luZG93TWFuYWdlclBvbGljeS5PRkZfQkVDQVVTRV9PRl9QUk9YX1NFTlNPUikgewogICAgICAgICAgICAgICAgIC8vIERvIG5vdCBlbmFibGUgdGhlIGtleWd1YXJkIGlmIHRoZSBwcm94IHNlbnNvciBmb3JjZWQgdGhlIHNjcmVlbiBvZmYuCiAgICAgICAgICAgICB9IGVsc2UgewpkaWZmIC0tZ2l0IGEvcG9saWN5L3NyYy9jb20vYW5kcm9pZC9pbnRlcm5hbC9wb2xpY3kvaW1wbC9Mb2NrUGF0dGVybktleWd1YXJkVmlldy5qYXZhIGIvcG9saWN5L3NyYy9jb20vYW5kcm9pZC9pbnRlcm5hbC9wb2xpY3kvaW1wbC9Mb2NrUGF0dGVybktleWd1YXJkVmlldy5qYXZhCmluZGV4IDI3NzA2ZWYuLjgyMmJlNDYgMTAwNjQ0Ci0tLSBhL3BvbGljeS9zcmMvY29tL2FuZHJvaWQvaW50ZXJuYWwvcG9saWN5L2ltcGwvTG9ja1BhdHRlcm5LZXlndWFyZFZpZXcuamF2YQorKysgYi9wb2xpY3kvc3JjL2NvbS9hbmRyb2lkL2ludGVybmFsL3BvbGljeS9pbXBsL0xvY2tQYXR0ZXJuS2V5Z3VhcmRWaWV3LmphdmEKQEAgLTY0NSw3ICs2NDUsOSBAQAogICAgICAgICAgICAgLy8gU2hvdyBMb2NrU2NyZWVuIGZpcnN0IGZvciBhbnkgc2NyZWVuIG90aGVyIHRoYW4gUGF0dGVybiB1bmxvY2suCiAgICAgICAgICAgICBmaW5hbCBib29sZWFuIHVzaW5nTG9ja1BhdHRlcm4gPSBtTG9ja1BhdHRlcm5VdGlscy5nZXRLZXlndWFyZFN0b3JlZFBhc3N3b3JkUXVhbGl0eSgpCiAgICAgICAgICAgICAgICAgICAgID09IERldmljZVBvbGljeU1hbmFnZXIuUEFTU1dPUkRfUVVBTElUWV9TT01FVEhJTkc7Ci0gICAgICAgICAgICBpZiAoaXNTZWN1cmUoKSAmJiB1c2luZ0xvY2tQYXR0ZXJuKSB7CisKKyAgICAgICAgICAgIGJvb2xlYW4gc2hvd1NsaWRpbmdUYWIgPSBnZXRSZXNvdXJjZXMoKS5nZXRCb29sZWFuKFIuYm9vbC5jb25maWdfZW5hYmxlU2xpZGluZ1RhYkZpcnN0KTsKKyAgICAgICAgICAgIGlmIChpc1NlY3VyZSgpICYmICh1c2luZ0xvY2tQYXR0ZXJuIHx8ICFzaG93U2xpZGluZ1RhYikpIHsKICAgICAgICAgICAgICAgICByZXR1cm4gTW9kZS5VbmxvY2tTY3JlZW47CiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIHJldHVybiBNb2RlLkxvY2tTY3JlZW47CkBAIC02NjcsNiArNjY5LDcgQEAKICAgICAgICAgICAgICAgICBjYXNlIERldmljZVBvbGljeU1hbmFnZXIuUEFTU1dPUkRfUVVBTElUWV9OVU1FUklDOgogICAgICAgICAgICAgICAgIGNhc2UgRGV2aWNlUG9saWN5TWFuYWdlci5QQVNTV09SRF9RVUFMSVRZX0FMUEhBQkVUSUM6CiAgICAgICAgICAgICAgICAgY2FzZSBEZXZpY2VQb2xpY3lNYW5hZ2VyLlBBU1NXT1JEX1FVQUxJVFlfQUxQSEFOVU1FUklDOgorICAgICAgICAgICAgICAgIGNhc2UgRGV2aWNlUG9saWN5TWFuYWdlci5QQVNTV09SRF9RVUFMSVRZX0NPTVBMRVg6CiAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRNb2RlID0gVW5sb2NrTW9kZS5QYXNzd29yZDsKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgY2FzZSBEZXZpY2VQb2xpY3lNYW5hZ2VyLlBBU1NXT1JEX1FVQUxJVFlfU09NRVRISU5HOgpAQCAtNjg3LDggKzY5MCwxNyBAQAogCiAgICAgcHJpdmF0ZSB2b2lkIHNob3dUaW1lb3V0RGlhbG9nKCkgewogICAgICAgICBpbnQgdGltZW91dEluU2Vjb25kcyA9IChpbnQpIExvY2tQYXR0ZXJuVXRpbHMuRkFJTEVEX0FUVEVNUFRfVElNRU9VVF9NUyAvIDEwMDA7CisgICAgICAgIGludCBtZXNzYWdlSWQgPSBSLnN0cmluZy5sb2Nrc2NyZWVuX3Rvb19tYW55X2ZhaWxlZF9hdHRlbXB0c19kaWFsb2dfbWVzc2FnZTsKKyAgICAgICAgaWYoZ2V0VW5sb2NrTW9kZSgpID09IFVubG9ja01vZGUuUGFzc3dvcmQpIHsKKyAgICAgICAgICAgIGlmKG1Mb2NrUGF0dGVyblV0aWxzLmdldEtleWd1YXJkU3RvcmVkUGFzc3dvcmRRdWFsaXR5KCkgPT0KKyAgICAgICAgICAgICAgICBEZXZpY2VQb2xpY3lNYW5hZ2VyLlBBU1NXT1JEX1FVQUxJVFlfTlVNRVJJQykgeworICAgICAgICAgICAgICAgIG1lc3NhZ2VJZCA9IFIuc3RyaW5nLmxvY2tzY3JlZW5fdG9vX21hbnlfZmFpbGVkX3Bpbl9hdHRlbXB0c19kaWFsb2dfbWVzc2FnZTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbWVzc2FnZUlkID0gUi5zdHJpbmcubG9ja3NjcmVlbl90b29fbWFueV9mYWlsZWRfcGFzc3dvcmRfYXR0ZW1wdHNfZGlhbG9nX21lc3NhZ2U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KICAgICAgICAgU3RyaW5nIG1lc3NhZ2UgPSBtQ29udGV4dC5nZXRTdHJpbmcoCi0gICAgICAgICAgICAgICAgUi5zdHJpbmcubG9ja3NjcmVlbl90b29fbWFueV9mYWlsZWRfYXR0ZW1wdHNfZGlhbG9nX21lc3NhZ2UsCisgICAgICAgICAgICAgICAgbWVzc2FnZUlkLAogICAgICAgICAgICAgICAgIG1VcGRhdGVNb25pdG9yLmdldEZhaWxlZEF0dGVtcHRzKCksCiAgICAgICAgICAgICAgICAgdGltZW91dEluU2Vjb25kcyk7CiAgICAgICAgIGZpbmFsIEFsZXJ0RGlhbG9nIGRpYWxvZyA9IG5ldyBBbGVydERpYWxvZy5CdWlsZGVyKG1Db250ZXh0KQpkaWZmIC0tZ2l0IGEvcG9saWN5L3NyYy9jb20vYW5kcm9pZC9pbnRlcm5hbC9wb2xpY3kvaW1wbC9Mb2NrU2NyZWVuLmphdmEgYi9wb2xpY3kvc3JjL2NvbS9hbmRyb2lkL2ludGVybmFsL3BvbGljeS9pbXBsL0xvY2tTY3JlZW4uamF2YQppbmRleCBhNWVmMWZhLi5mOGMwYWJhIDEwMDY0NAotLS0gYS9wb2xpY3kvc3JjL2NvbS9hbmRyb2lkL2ludGVybmFsL3BvbGljeS9pbXBsL0xvY2tTY3JlZW4uamF2YQorKysgYi9wb2xpY3kvc3JjL2NvbS9hbmRyb2lkL2ludGVybmFsL3BvbGljeS9pbXBsL0xvY2tTY3JlZW4uamF2YQpAQCAtNTksMTIgKzU5LDcgQEAKICAgICBwcml2YXRlIGZpbmFsIEtleWd1YXJkVXBkYXRlTW9uaXRvciBtVXBkYXRlTW9uaXRvcjsKICAgICBwcml2YXRlIGZpbmFsIEtleWd1YXJkU2NyZWVuQ2FsbGJhY2sgbUNhbGxiYWNrOwogCi0gICAgcHJpdmF0ZSBUZXh0VmlldyBtQ2FycmllcjsKICAgICBwcml2YXRlIFNsaWRpbmdUYWIgbVNlbGVjdG9yOwotICAgIHByaXZhdGUgVGV4dFZpZXcgbVRpbWU7Ci0gICAgcHJpdmF0ZSBUZXh0VmlldyBtRGF0ZTsKLSAgICBwcml2YXRlIFRleHRWaWV3IG1TdGF0dXMxOwotICAgIHByaXZhdGUgVGV4dFZpZXcgbVN0YXR1czI7CiAgICAgcHJpdmF0ZSBUZXh0VmlldyBtU2NyZWVuTG9ja2VkOwogICAgIHByaXZhdGUgVGV4dFZpZXcgbUVtZXJnZW5jeUNhbGxUZXh0OwogICAgIHByaXZhdGUgQnV0dG9uIG1FbWVyZ2VuY3lDYWxsQnV0dG9uOwpAQCAtOTMsNiArODgsOCBAQAogICAgIHByaXZhdGUgamF2YS50ZXh0LkRhdGVGb3JtYXQgbVRpbWVGb3JtYXQ7CiAgICAgcHJpdmF0ZSBib29sZWFuIG1FbmFibGVNZW51S2V5SW5Mb2NrU2NyZWVuOwogCisgICAgcHJpdmF0ZSBTdGF0dXNWaWV3IG1TdGF0dXNWaWV3OworCiAgICAgLyoqCiAgICAgICogVGhlIHN0YXR1cyBvZiB0aGlzIGxvY2sgc2NyZWVuLgogICAgICAqLwpAQCAtMTk1LDE0ICsxOTIsNyBAQAogICAgICAgICAgICAgaW5mbGF0ZXIuaW5mbGF0ZShSLmxheW91dC5rZXlndWFyZF9zY3JlZW5fdGFiX3VubG9ja19sYW5kLCB0aGlzLCB0cnVlKTsKICAgICAgICAgfQogCi0gICAgICAgIG1DYXJyaWVyID0gKFRleHRWaWV3KSBmaW5kVmlld0J5SWQoUi5pZC5jYXJyaWVyKTsKLSAgICAgICAgLy8gUmVxdWlyZWQgZm9yIE1hcnF1ZWUgdG8gd29yawotICAgICAgICBtQ2Fycmllci5zZXRTZWxlY3RlZCh0cnVlKTsKLSAgICAgICAgbUNhcnJpZXIuc2V0VGV4dENvbG9yKDB4ZmZmZmZmZmYpOwotCi0gICAgICAgIG1EYXRlID0gKFRleHRWaWV3KSBmaW5kVmlld0J5SWQoUi5pZC5kYXRlKTsKLSAgICAgICAgbVN0YXR1czEgPSAoVGV4dFZpZXcpIGZpbmRWaWV3QnlJZChSLmlkLnN0YXR1czEpOwotICAgICAgICBtU3RhdHVzMiA9IChUZXh0VmlldykgZmluZFZpZXdCeUlkKFIuaWQuc3RhdHVzMik7CisgICAgICAgIG1TdGF0dXNWaWV3ID0gbmV3IFN0YXR1c1ZpZXcodGhpcywgbVVwZGF0ZU1vbml0b3IsIG1Mb2NrUGF0dGVyblV0aWxzKTsKIAogICAgICAgICBtU2NyZWVuTG9ja2VkID0gKFRleHRWaWV3KSBmaW5kVmlld0J5SWQoUi5pZC5zY3JlZW5Mb2NrZWQpOwogICAgICAgICBtU2VsZWN0b3IgPSAoU2xpZGluZ1RhYikgZmluZFZpZXdCeUlkKFIuaWQudGFiX3NlbGVjdG9yKTsKQEAgLTIyMCw3ICsyMTAsNiBAQAogICAgICAgICAgICAgfQogICAgICAgICB9KTsKIAotCiAgICAgICAgIHNldEZvY3VzYWJsZSh0cnVlKTsKICAgICAgICAgc2V0Rm9jdXNhYmxlSW5Ub3VjaE1vZGUodHJ1ZSk7CiAgICAgICAgIHNldERlc2NlbmRhbnRGb2N1c2FiaWxpdHkoVmlld0dyb3VwLkZPQ1VTX0JMT0NLX0RFU0NFTkRBTlRTKTsKQEAgLTQyOCwzOCArNDE3LDExIEBACiAgICAgfQogCiAgICAgcHJpdmF0ZSB2b2lkIHJlZnJlc2hUaW1lQW5kRGF0ZURpc3BsYXkoKSB7Ci0gICAgICAgIG1EYXRlLnNldFRleHQoRGF0ZUZvcm1hdC5mb3JtYXQobURhdGVGb3JtYXRTdHJpbmcsIG5ldyBEYXRlKCkpKTsKKyAgICAgICAgbVN0YXR1c1ZpZXcucmVmcmVzaFRpbWVBbmREYXRlRGlzcGxheSgpOwogICAgIH0KIAogICAgIHByaXZhdGUgdm9pZCB1cGRhdGVTdGF0dXNMaW5lcygpIHsKLSAgICAgICAgaWYgKCFtU3RhdHVzLnNob3dTdGF0dXNMaW5lcygpCi0gICAgICAgICAgICAgICAgfHwgKG1DaGFyZ2luZyA9PSBudWxsICYmIG1OZXh0QWxhcm0gPT0gbnVsbCkpIHsKLSAgICAgICAgICAgIG1TdGF0dXMxLnNldFZpc2liaWxpdHkoVmlldy5JTlZJU0lCTEUpOwotICAgICAgICAgICAgbVN0YXR1czIuc2V0VmlzaWJpbGl0eShWaWV3LklOVklTSUJMRSk7Ci0gICAgICAgIH0gZWxzZSBpZiAobUNoYXJnaW5nICE9IG51bGwgJiYgbU5leHRBbGFybSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAvLyBjaGFyZ2luZyBvbmx5Ci0gICAgICAgICAgICBtU3RhdHVzMS5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7Ci0gICAgICAgICAgICBtU3RhdHVzMi5zZXRWaXNpYmlsaXR5KFZpZXcuSU5WSVNJQkxFKTsKLQotICAgICAgICAgICAgbVN0YXR1czEuc2V0VGV4dChtQ2hhcmdpbmcpOwotICAgICAgICAgICAgbVN0YXR1czEuc2V0Q29tcG91bmREcmF3YWJsZXNXaXRoSW50cmluc2ljQm91bmRzKG1DaGFyZ2luZ0ljb24sIG51bGwsIG51bGwsIG51bGwpOwotICAgICAgICB9IGVsc2UgaWYgKG1OZXh0QWxhcm0gIT0gbnVsbCAmJiBtQ2hhcmdpbmcgPT0gbnVsbCkgewotICAgICAgICAgICAgLy8gbmV4dCBhbGFybSBvbmx5Ci0gICAgICAgICAgICBtU3RhdHVzMS5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7Ci0gICAgICAgICAgICBtU3RhdHVzMi5zZXRWaXNpYmlsaXR5KFZpZXcuSU5WSVNJQkxFKTsKLQotICAgICAgICAgICAgbVN0YXR1czEuc2V0VGV4dChtTmV4dEFsYXJtKTsKLSAgICAgICAgICAgIG1TdGF0dXMxLnNldENvbXBvdW5kRHJhd2FibGVzV2l0aEludHJpbnNpY0JvdW5kcyhtQWxhcm1JY29uLCBudWxsLCBudWxsLCBudWxsKTsKLSAgICAgICAgfSBlbHNlIGlmIChtQ2hhcmdpbmcgIT0gbnVsbCAmJiBtTmV4dEFsYXJtICE9IG51bGwpIHsKLSAgICAgICAgICAgIC8vIGJvdGggY2hhcmdpbmcgYW5kIG5leHQgYWxhcm0KLSAgICAgICAgICAgIG1TdGF0dXMxLnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKLSAgICAgICAgICAgIG1TdGF0dXMyLnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKLQotICAgICAgICAgICAgbVN0YXR1czEuc2V0VGV4dChtQ2hhcmdpbmcpOwotICAgICAgICAgICAgbVN0YXR1czEuc2V0Q29tcG91bmREcmF3YWJsZXNXaXRoSW50cmluc2ljQm91bmRzKG1DaGFyZ2luZ0ljb24sIG51bGwsIG51bGwsIG51bGwpOwotICAgICAgICAgICAgbVN0YXR1czIuc2V0VGV4dChtTmV4dEFsYXJtKTsKLSAgICAgICAgICAgIG1TdGF0dXMyLnNldENvbXBvdW5kRHJhd2FibGVzV2l0aEludHJpbnNpY0JvdW5kcyhtQWxhcm1JY29uLCBudWxsLCBudWxsLCBudWxsKTsKLSAgICAgICAgfQorICAgICAgICBtU3RhdHVzVmlldy51cGRhdGVTdGF0dXNMaW5lcyhtU3RhdHVzLnNob3dTdGF0dXNMaW5lcygpLCBtQ2hhcmdpbmcsIG1DaGFyZ2luZ0ljb24sIG1BbGFybUljb24pOwogICAgIH0KIAogICAgIC8qKiB7QGluaGVyaXREb2N9ICovCkBAIC01MDksNyArNDcxLDcgQEAKICAgICAgICAgc3dpdGNoIChzdGF0dXMpIHsKICAgICAgICAgICAgIGNhc2UgTm9ybWFsOgogICAgICAgICAgICAgICAgIC8vIHRleHQKLSAgICAgICAgICAgICAgICBtQ2Fycmllci5zZXRUZXh0KAorICAgICAgICAgICAgICAgIG1TdGF0dXNWaWV3LnNldENhcnJpZXJUZXh0KAogICAgICAgICAgICAgICAgICAgICAgICAgZ2V0Q2FycmllclN0cmluZygKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVVwZGF0ZU1vbml0b3IuZ2V0VGVsZXBob255UGxtbigpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtVXBkYXRlTW9uaXRvci5nZXRUZWxlcGhvbnlTcG4oKSkpOwpAQCAtNTE4LDE0ICs0ODAsMTQgQEAKICAgICAgICAgICAgICAgICBtU2NyZWVuTG9ja2VkLnNldFRleHQoIiIpOwogCiAgICAgICAgICAgICAgICAgLy8gbGF5b3V0Ci0gICAgICAgICAgICAgICAgbVNjcmVlbkxvY2tlZC5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7CisgICAgICAgICAgICAgICAgbVNjcmVlbkxvY2tlZC5zZXRWaXNpYmlsaXR5KFZpZXcuSU5WSVNJQkxFKTsKICAgICAgICAgICAgICAgICBtU2VsZWN0b3Iuc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOwogICAgICAgICAgICAgICAgIG1FbWVyZ2VuY3lDYWxsVGV4dC5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICBjYXNlIE5ldHdvcmtMb2NrZWQ6CiAgICAgICAgICAgICAgICAgLy8gVGhlIGNhcnJpZXIgc3RyaW5nIHNob3dzIGJvdGggc2ltIGNhcmQgc3RhdHVzIChpLmUuIE5vIFNpbSBDYXJkKSBhbmQKICAgICAgICAgICAgICAgICAvLyBjYXJyaWVyJ3MgbmFtZSBhbmQvb3IgIkVtZXJnZW5jeSBDYWxscyBPbmx5IiBzdGF0dXMKLSAgICAgICAgICAgICAgICBtQ2Fycmllci5zZXRUZXh0KAorICAgICAgICAgICAgICAgIG1TdGF0dXNWaWV3LnNldENhcnJpZXJUZXh0KAogICAgICAgICAgICAgICAgICAgICAgICAgZ2V0Q2FycmllclN0cmluZygKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVVwZGF0ZU1vbml0b3IuZ2V0VGVsZXBob255UGxtbigpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRDb250ZXh0KCkuZ2V0VGV4dChSLnN0cmluZy5sb2Nrc2NyZWVuX25ldHdvcmtfbG9ja2VkX21lc3NhZ2UpKSk7CkBAIC01MzgsNyArNTAwLDcgQEAKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIGNhc2UgU2ltTWlzc2luZzoKICAgICAgICAgICAgICAgICAvLyB0ZXh0Ci0gICAgICAgICAgICAgICAgbUNhcnJpZXIuc2V0VGV4dChSLnN0cmluZy5sb2Nrc2NyZWVuX21pc3Npbmdfc2ltX21lc3NhZ2Vfc2hvcnQpOworICAgICAgICAgICAgICAgIG1TdGF0dXNWaWV3LnNldENhcnJpZXJUZXh0KFIuc3RyaW5nLmxvY2tzY3JlZW5fbWlzc2luZ19zaW1fbWVzc2FnZV9zaG9ydCk7CiAgICAgICAgICAgICAgICAgbVNjcmVlbkxvY2tlZC5zZXRUZXh0KFIuc3RyaW5nLmxvY2tzY3JlZW5fbWlzc2luZ19zaW1faW5zdHJ1Y3Rpb25zKTsKIAogICAgICAgICAgICAgICAgIC8vIGxheW91dApAQCAtNTQ5LDcgKzUxMSw3IEBACiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICBjYXNlIFNpbU1pc3NpbmdMb2NrZWQ6CiAgICAgICAgICAgICAgICAgLy8gdGV4dAotICAgICAgICAgICAgICAgIG1DYXJyaWVyLnNldFRleHQoCisgICAgICAgICAgICAgICAgbVN0YXR1c1ZpZXcuc2V0Q2FycmllclRleHQoCiAgICAgICAgICAgICAgICAgICAgICAgICBnZXRDYXJyaWVyU3RyaW5nKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtVXBkYXRlTW9uaXRvci5nZXRUZWxlcGhvbnlQbG1uKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldENvbnRleHQoKS5nZXRUZXh0KFIuc3RyaW5nLmxvY2tzY3JlZW5fbWlzc2luZ19zaW1fbWVzc2FnZV9zaG9ydCkpKTsKQEAgLTU2Myw3ICs1MjUsNyBAQAogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgY2FzZSBTaW1Mb2NrZWQ6CiAgICAgICAgICAgICAgICAgLy8gdGV4dAotICAgICAgICAgICAgICAgIG1DYXJyaWVyLnNldFRleHQoCisgICAgICAgICAgICAgICAgbVN0YXR1c1ZpZXcuc2V0Q2FycmllclRleHQoCiAgICAgICAgICAgICAgICAgICAgICAgICBnZXRDYXJyaWVyU3RyaW5nKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtVXBkYXRlTW9uaXRvci5nZXRUZWxlcGhvbnlQbG1uKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldENvbnRleHQoKS5nZXRUZXh0KFIuc3RyaW5nLmxvY2tzY3JlZW5fc2ltX2xvY2tlZF9tZXNzYWdlKSkpOwpAQCAtNTc1LDcgKzUzNyw3IEBACiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICBjYXNlIFNpbVB1a0xvY2tlZDoKICAgICAgICAgICAgICAgICAvLyB0ZXh0Ci0gICAgICAgICAgICAgICAgbUNhcnJpZXIuc2V0VGV4dCgKKyAgICAgICAgICAgICAgICBtU3RhdHVzVmlldy5zZXRDYXJyaWVyVGV4dCgKICAgICAgICAgICAgICAgICAgICAgICAgIGdldENhcnJpZXJTdHJpbmcoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1VcGRhdGVNb25pdG9yLmdldFRlbGVwaG9ueVBsbW4oKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0Q29udGV4dCgpLmdldFRleHQoUi5zdHJpbmcubG9ja3NjcmVlbl9zaW1fcHVrX2xvY2tlZF9tZXNzYWdlKSkpOwpAQCAtNjU4LDcgKzYyMCw2IEBACiAgICAgLyoqIHtAaW5oZXJpdERvY30gKi8KICAgICBwdWJsaWMgdm9pZCBvblJlc3VtZSgpIHsKICAgICAgICAgcmVzZXRTdGF0dXNJbmZvKG1VcGRhdGVNb25pdG9yKTsKLSAgICAgICAgbUxvY2tQYXR0ZXJuVXRpbHMudXBkYXRlRW1lcmdlbmN5Q2FsbEJ1dHRvblN0YXRlKG1FbWVyZ2VuY3lDYWxsQnV0dG9uKTsKICAgICB9CiAKICAgICAvKioge0Bpbmhlcml0RG9jfSAqLwpAQCAtNjc2LDYgKzYzNyw1IEBACiAgICAgfQogCiAgICAgcHVibGljIHZvaWQgb25QaG9uZVN0YXRlQ2hhbmdlZChTdHJpbmcgbmV3U3RhdGUpIHsKLSAgICAgICAgbUxvY2tQYXR0ZXJuVXRpbHMudXBkYXRlRW1lcmdlbmN5Q2FsbEJ1dHRvblN0YXRlKG1FbWVyZ2VuY3lDYWxsQnV0dG9uKTsKICAgICB9CiB9CmRpZmYgLS1naXQgYS9wb2xpY3kvc3JjL2NvbS9hbmRyb2lkL2ludGVybmFsL3BvbGljeS9pbXBsL1Bhc3N3b3JkVW5sb2NrU2NyZWVuLmphdmEgYi9wb2xpY3kvc3JjL2NvbS9hbmRyb2lkL2ludGVybmFsL3BvbGljeS9pbXBsL1Bhc3N3b3JkVW5sb2NrU2NyZWVuLmphdmEKaW5kZXggMzlmMjkxNy4uOWRiODZhYSAxMDA2NDQKLS0tIGEvcG9saWN5L3NyYy9jb20vYW5kcm9pZC9pbnRlcm5hbC9wb2xpY3kvaW1wbC9QYXNzd29yZFVubG9ja1NjcmVlbi5qYXZhCisrKyBiL3BvbGljeS9zcmMvY29tL2FuZHJvaWQvaW50ZXJuYWwvcG9saWN5L2ltcGwvUGFzc3dvcmRVbmxvY2tTY3JlZW4uamF2YQpAQCAtMzAsNiArMzAsNyBAQAogaW1wb3J0IGFuZHJvaWQudGVsZXBob255LlRlbGVwaG9ueU1hbmFnZXI7CiBpbXBvcnQgYW5kcm9pZC50ZXh0Lm1ldGhvZC5EaWdpdHNLZXlMaXN0ZW5lcjsKIGltcG9ydCBhbmRyb2lkLnRleHQubWV0aG9kLlRleHRLZXlMaXN0ZW5lcjsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwogaW1wb3J0IGFuZHJvaWQudmlldy5LZXlFdmVudDsKIGltcG9ydCBhbmRyb2lkLnZpZXcuTGF5b3V0SW5mbGF0ZXI7CiBpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CkBAIC01MCwxOSArNTEsMjUgQEAKIHB1YmxpYyBjbGFzcyBQYXNzd29yZFVubG9ja1NjcmVlbiBleHRlbmRzIExpbmVhckxheW91dCBpbXBsZW1lbnRzIEtleWd1YXJkU2NyZWVuLAogICAgICAgICBWaWV3Lk9uQ2xpY2tMaXN0ZW5lciwgS2V5Z3VhcmRVcGRhdGVNb25pdG9yLkluZm9DYWxsYmFjaywgT25FZGl0b3JBY3Rpb25MaXN0ZW5lciB7CiAKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIlBhc3N3b3JkVW5sb2NrU2NyZWVuIjsKICAgICBwcml2YXRlIGZpbmFsIEtleWd1YXJkVXBkYXRlTW9uaXRvciBtVXBkYXRlTW9uaXRvcjsKICAgICBwcml2YXRlIGZpbmFsIEtleWd1YXJkU2NyZWVuQ2FsbGJhY2sgbUNhbGxiYWNrOwogCisgICAgcHJpdmF0ZSBib29sZWFuIG1Jc0FscGhhOworCiAgICAgcHJpdmF0ZSBFZGl0VGV4dCBtUGFzc3dvcmRFbnRyeTsKICAgICBwcml2YXRlIEJ1dHRvbiBtRW1lcmdlbmN5Q2FsbEJ1dHRvbjsKICAgICBwcml2YXRlIExvY2tQYXR0ZXJuVXRpbHMgbUxvY2tQYXR0ZXJuVXRpbHM7CiAgICAgcHJpdmF0ZSBQYXNzd29yZEVudHJ5S2V5Ym9hcmRWaWV3IG1LZXlib2FyZFZpZXc7CisgICAgcHJpdmF0ZSBQYXNzd29yZEVudHJ5S2V5Ym9hcmRWaWV3IG1LZXlib2FyZFZpZXdBbHBoYTsKICAgICBwcml2YXRlIFBhc3N3b3JkRW50cnlLZXlib2FyZEhlbHBlciBtS2V5Ym9hcmRIZWxwZXI7CisgICAgcHJpdmF0ZSBQYXNzd29yZEVudHJ5S2V5Ym9hcmRIZWxwZXIgbUtleWJvYXJkSGVscGVyQWxwaGE7CiAKICAgICBwcml2YXRlIGludCBtQ3JlYXRpb25PcmllbnRhdGlvbjsKICAgICBwcml2YXRlIGludCBtQ3JlYXRpb25IYXJkS2V5Ym9hcmRIaWRkZW47CiAgICAgcHJpdmF0ZSBDb3VudERvd25UaW1lciBtQ291bnRkb3duVGltZXI7Ci0gICAgcHJpdmF0ZSBUZXh0VmlldyBtVGl0bGU7CisKKyAgICBwcml2YXRlIFN0YXR1c1ZpZXcgbVN0YXR1c1ZpZXc7CiAKICAgICAvLyBUbyBhdm9pZCBhY2NpZGVudGFsIGxvY2tvdXQgZHVlIHRvIGV2ZW50cyB3aGlsZSB0aGUgZGV2aWNlIGluIGluIHRoZSBwb2NrZXQsIGlnbm9yZQogICAgIC8vIGFueSBwYXNzd29yZHMgd2l0aCBsZW5ndGggbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHRoaXMgbGVuZ3RoLgpAQCAtODYsMzYgKzkzLDY1IEBACiAgICAgICAgICAgICBsYXlvdXRJbmZsYXRlci5pbmZsYXRlKFIubGF5b3V0LmtleWd1YXJkX3NjcmVlbl9wYXNzd29yZF9sYW5kc2NhcGUsIHRoaXMsIHRydWUpOwogICAgICAgICB9CiAKKyAgICAgICAgbVN0YXR1c1ZpZXcgPSBuZXcgU3RhdHVzVmlldyh0aGlzLCBtVXBkYXRlTW9uaXRvciwgbUxvY2tQYXR0ZXJuVXRpbHMpOworCiAgICAgICAgIGZpbmFsIGludCBxdWFsaXR5ID0gbG9ja1BhdHRlcm5VdGlscy5nZXRLZXlndWFyZFN0b3JlZFBhc3N3b3JkUXVhbGl0eSgpOwotICAgICAgICBmaW5hbCBib29sZWFuIGlzQWxwaGEgPSBEZXZpY2VQb2xpY3lNYW5hZ2VyLlBBU1NXT1JEX1FVQUxJVFlfQUxQSEFCRVRJQyA9PSBxdWFsaXR5Ci0gICAgICAgICAgICAgICAgfHwgRGV2aWNlUG9saWN5TWFuYWdlci5QQVNTV09SRF9RVUFMSVRZX0FMUEhBTlVNRVJJQyA9PSBxdWFsaXR5OworICAgICAgICBtSXNBbHBoYSA9IERldmljZVBvbGljeU1hbmFnZXIuUEFTU1dPUkRfUVVBTElUWV9BTFBIQUJFVElDID09IHF1YWxpdHkKKyAgICAgICAgICAgICAgICB8fCBEZXZpY2VQb2xpY3lNYW5hZ2VyLlBBU1NXT1JEX1FVQUxJVFlfQUxQSEFOVU1FUklDID09IHF1YWxpdHkKKyAgICAgICAgICAgICAgICB8fCBEZXZpY2VQb2xpY3lNYW5hZ2VyLlBBU1NXT1JEX1FVQUxJVFlfQ09NUExFWCA9PSBxdWFsaXR5OwogCiAgICAgICAgIG1LZXlib2FyZFZpZXcgPSAoUGFzc3dvcmRFbnRyeUtleWJvYXJkVmlldykgZmluZFZpZXdCeUlkKFIuaWQua2V5Ym9hcmQpOworICAgICAgICBtS2V5Ym9hcmRWaWV3QWxwaGEgPSAoUGFzc3dvcmRFbnRyeUtleWJvYXJkVmlldykgZmluZFZpZXdCeUlkKFIuaWQua2V5Ym9hcmRBbHBoYSk7CiAgICAgICAgIG1QYXNzd29yZEVudHJ5ID0gKEVkaXRUZXh0KSBmaW5kVmlld0J5SWQoUi5pZC5wYXNzd29yZEVudHJ5KTsKICAgICAgICAgbVBhc3N3b3JkRW50cnkuc2V0T25FZGl0b3JBY3Rpb25MaXN0ZW5lcih0aGlzKTsKICAgICAgICAgbUVtZXJnZW5jeUNhbGxCdXR0b24gPSAoQnV0dG9uKSBmaW5kVmlld0J5SWQoUi5pZC5lbWVyZ2VuY3lDYWxsKTsKICAgICAgICAgbUVtZXJnZW5jeUNhbGxCdXR0b24uc2V0T25DbGlja0xpc3RlbmVyKHRoaXMpOwogICAgICAgICBtTG9ja1BhdHRlcm5VdGlscy51cGRhdGVFbWVyZ2VuY3lDYWxsQnV0dG9uU3RhdGUobUVtZXJnZW5jeUNhbGxCdXR0b24pOwotICAgICAgICBtVGl0bGUgPSAoVGV4dFZpZXcpIGZpbmRWaWV3QnlJZChSLmlkLmVudGVyX3Bhc3N3b3JkX2xhYmVsKTsKIAotICAgICAgICBtS2V5Ym9hcmRIZWxwZXIgPSBuZXcgUGFzc3dvcmRFbnRyeUtleWJvYXJkSGVscGVyKGNvbnRleHQsIG1LZXlib2FyZFZpZXcsIHRoaXMpOwotICAgICAgICBtS2V5Ym9hcmRIZWxwZXIuc2V0S2V5Ym9hcmRNb2RlKGlzQWxwaGEgPyBQYXNzd29yZEVudHJ5S2V5Ym9hcmRIZWxwZXIuS0VZQk9BUkRfTU9ERV9BTFBIQQotICAgICAgICAgICAgICAgIDogUGFzc3dvcmRFbnRyeUtleWJvYXJkSGVscGVyLktFWUJPQVJEX01PREVfTlVNRVJJQyk7CisgICAgICAgIG1LZXlib2FyZEhlbHBlciA9IG5ldyBQYXNzd29yZEVudHJ5S2V5Ym9hcmRIZWxwZXIoY29udGV4dCwgbUtleWJvYXJkVmlldywgdGhpcywgZmFsc2UpOworICAgICAgICBpZiAobUtleWJvYXJkVmlld0FscGhhID09IG51bGwgfHwgIW1Jc0FscGhhKSB7CisgICAgICAgICAgICBtS2V5Ym9hcmRIZWxwZXIuc2V0S2V5Ym9hcmRNb2RlKG1Jc0FscGhhID8KKyAgICAgICAgICAgICAgICAgICAgUGFzc3dvcmRFbnRyeUtleWJvYXJkSGVscGVyLktFWUJPQVJEX01PREVfQUxQSEEKKyAgICAgICAgICAgICAgICAgICAgOiBQYXNzd29yZEVudHJ5S2V5Ym9hcmRIZWxwZXIuS0VZQk9BUkRfTU9ERV9OVU1FUklDKTsKKyAgICAgICAgICAgIG1LZXlib2FyZFZpZXcuc2V0VmlzaWJpbGl0eSgKKyAgICAgICAgICAgICAgICAgICAgbUNyZWF0aW9uSGFyZEtleWJvYXJkSGlkZGVuID09IENvbmZpZ3VyYXRpb24uSEFSREtFWUJPQVJESElEREVOX05PCisgICAgICAgICAgICAgICAgICAgID8gVmlldy5JTlZJU0lCTEUgOiBWaWV3LlZJU0lCTEUpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbUtleWJvYXJkSGVscGVyQWxwaGEgPSBuZXcgUGFzc3dvcmRFbnRyeUtleWJvYXJkSGVscGVyKGNvbnRleHQsIG1LZXlib2FyZFZpZXdBbHBoYSwKKyAgICAgICAgICAgICAgICAgICAgdGhpcywgZmFsc2UpOworICAgICAgICAgICAgbUtleWJvYXJkSGVscGVyLnNldEtleWJvYXJkTW9kZShQYXNzd29yZEVudHJ5S2V5Ym9hcmRIZWxwZXIuS0VZQk9BUkRfTU9ERV9OVU1FUklDKTsKKyAgICAgICAgICAgIG1LZXlib2FyZEhlbHBlckFscGhhLnNldEtleWJvYXJkTW9kZShQYXNzd29yZEVudHJ5S2V5Ym9hcmRIZWxwZXIuS0VZQk9BUkRfTU9ERV9BTFBIQSk7CisgICAgICAgICAgICBtS2V5Ym9hcmRWaWV3LnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKKyAgICAgICAgICAgIG1LZXlib2FyZFZpZXdBbHBoYS5zZXRWaXNpYmlsaXR5KAorICAgICAgICAgICAgICAgICAgICBtQ3JlYXRpb25IYXJkS2V5Ym9hcmRIaWRkZW4gPT0gQ29uZmlndXJhdGlvbi5IQVJES0VZQk9BUkRISURERU5fTk8KKyAgICAgICAgICAgICAgICAgICAgPyBWaWV3LklOVklTSUJMRSA6IFZpZXcuVklTSUJMRSk7CisgICAgICAgICAgICBtUGFzc3dvcmRFbnRyeS5zZXRXaWR0aChtS2V5Ym9hcmRWaWV3QWxwaGEuZ2V0TGF5b3V0UGFyYW1zKCkud2lkdGgpOworICAgICAgICB9CiAKLSAgICAgICAgbUtleWJvYXJkVmlldy5zZXRWaXNpYmlsaXR5KG1DcmVhdGlvbkhhcmRLZXlib2FyZEhpZGRlbiA9PSBDb25maWd1cmF0aW9uLkhBUkRLRVlCT0FSREhJRERFTl9OTwotICAgICAgICAgICAgICAgID8gVmlldy5JTlZJU0lCTEUgOiBWaWV3LlZJU0lCTEUpOworICAgICAgICBtUGFzc3dvcmRFbnRyeS5zZXRDb21wb3VuZERyYXdhYmxlc1dpdGhJbnRyaW5zaWNCb3VuZHMoUi5kcmF3YWJsZS5pY19sb2NrX2lkbGVfbG9jaywgMCwKKyAgICAgICAgICAgICAgICAwLCAwKTsKICAgICAgICAgbVBhc3N3b3JkRW50cnkucmVxdWVzdEZvY3VzKCk7CiAKICAgICAgICAgLy8gVGhpcyBhbGxvd3Mga2V5Ym9hcmRzIHdpdGggb3ZlcmxhcHBpbmcgcXdlcnR5L251bWVyaWMga2V5cyB0byBjaG9vc2UganVzdCB0aGUKICAgICAgICAgLy8gbnVtZXJpYyBrZXlzLgotICAgICAgICBpZiAoaXNBbHBoYSkgeworICAgICAgICBpZiAobUlzQWxwaGEpIHsKICAgICAgICAgICAgIG1QYXNzd29yZEVudHJ5LnNldEtleUxpc3RlbmVyKFRleHRLZXlMaXN0ZW5lci5nZXRJbnN0YW5jZSgpKTsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIG1QYXNzd29yZEVudHJ5LnNldEtleUxpc3RlbmVyKERpZ2l0c0tleUxpc3RlbmVyLmdldEluc3RhbmNlKCkpOworICAgICAgICAgICAgbVN0YXR1c1ZpZXcuc2V0SW5zdHJ1Y3Rpb25UZXh0KFIuc3RyaW5nLmtleWd1YXJkX3Bhc3N3b3JkX2VudGVyX3Bpbl9wYXNzd29yZF9jb2RlKTsKICAgICAgICAgfQogCiAgICAgICAgIG1LZXlib2FyZEhlbHBlci5zZXRWaWJyYXRlUGF0dGVybihtTG9ja1BhdHRlcm5VdGlscy5pc1RhY3RpbGVGZWVkYmFja0VuYWJsZWQoKSA/CiAgICAgICAgICAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5hcnJheS5jb25maWdfdmlydHVhbEtleVZpYmVQYXR0ZXJuIDogMCk7CisgICAgICAgIGlmIChtS2V5Ym9hcmRIZWxwZXJBbHBoYSAhPSBudWxsKSB7CisgICAgICAgICAgICBtS2V5Ym9hcmRIZWxwZXJBbHBoYS5zZXRWaWJyYXRlUGF0dGVybihtTG9ja1BhdHRlcm5VdGlscy5pc1RhY3RpbGVGZWVkYmFja0VuYWJsZWQoKSA/CisgICAgICAgICAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuYXJyYXkuY29uZmlnX3ZpcnR1YWxLZXlWaWJlUGF0dGVybiA6IDApOworICAgICAgICB9CisKKyAgICAgICAgLy8gdW50aWwgd2UgZ2V0IGFuIHVwZGF0ZS4uLgorICAgICAgICBtU3RhdHVzVmlldy5zZXRDYXJyaWVyVGV4dChMb2NrU2NyZWVuLmdldENhcnJpZXJTdHJpbmcoCisgICAgICAgICAgICAgICAgICAgICAgICBtVXBkYXRlTW9uaXRvci5nZXRUZWxlcGhvbnlQbG1uKCksCisgICAgICAgICAgICAgICAgICAgICAgICBtVXBkYXRlTW9uaXRvci5nZXRUZWxlcGhvbnlTcG4oKSkpOwogICAgIH0KIAogICAgIEBPdmVycmlkZQpAQCAtMTM2LDggKzE3MiwxMiBAQAogCiAgICAgLyoqIHtAaW5oZXJpdERvY30gKi8KICAgICBwdWJsaWMgdm9pZCBvblJlc3VtZSgpIHsKKyAgICAgICAgLy8gcmVzZXQgc3RhdHVzCisgICAgICAgIG1TdGF0dXNWaWV3LnJlc2V0U3RhdHVzSW5mbyhtVXBkYXRlTW9uaXRvciwgbUxvY2tQYXR0ZXJuVXRpbHMpOworCiAgICAgICAgIC8vIHN0YXJ0IGZyZXNoCiAgICAgICAgIG1QYXNzd29yZEVudHJ5LnNldFRleHQoIiIpOworICAgICAgICByZXNldFN0YXR1c0luZm8oKTsKICAgICAgICAgbVBhc3N3b3JkRW50cnkucmVxdWVzdEZvY3VzKCk7CiAgICAgICAgIG1Mb2NrUGF0dGVyblV0aWxzLnVwZGF0ZUVtZXJnZW5jeUNhbGxCdXR0b25TdGF0ZShtRW1lcmdlbmN5Q2FsbEJ1dHRvbik7CiAKQEAgLTE3NCw2ICsyMTQsOSBAQAogICAgICAgICAgICAgICAgIGxvbmcgZGVhZGxpbmUgPSBtTG9ja1BhdHRlcm5VdGlscy5zZXRMb2Nrb3V0QXR0ZW1wdERlYWRsaW5lKCk7CiAgICAgICAgICAgICAgICAgaGFuZGxlQXR0ZW1wdExvY2tvdXQoZGVhZGxpbmUpOwogICAgICAgICAgICAgfQorICAgICAgICAgICAgbVN0YXR1c1ZpZXcuc2V0SW5zdHJ1Y3Rpb25UZXh0KFIuc3RyaW5nLmxvY2tzY3JlZW5fcGFzc3dvcmRfd3JvbmcpOworICAgICAgICB9IGVsc2UgaWYgKGVudHJ5Lmxlbmd0aCgpID4gMCkgeworICAgICAgICAgICAgbVN0YXR1c1ZpZXcuc2V0SW5zdHJ1Y3Rpb25UZXh0KFIuc3RyaW5nLmxvY2tzY3JlZW5fcGFzc3dvcmRfd3JvbmcpOwogICAgICAgICB9CiAgICAgICAgIG1QYXNzd29yZEVudHJ5LnNldFRleHQoIiIpOwogICAgIH0KQEAgLTE5MSwxNCArMjM0LDE0IEBACiAgICAgICAgICAgICAgICAgU3RyaW5nIGluc3RydWN0aW9ucyA9IGdldENvbnRleHQoKS5nZXRTdHJpbmcoCiAgICAgICAgICAgICAgICAgICAgICAgICBSLnN0cmluZy5sb2Nrc2NyZWVuX3Rvb19tYW55X2ZhaWxlZF9hdHRlbXB0c19jb3VudGRvd24sCiAgICAgICAgICAgICAgICAgICAgICAgICBzZWNvbmRzUmVtYWluaW5nKTsKLSAgICAgICAgICAgICAgICBtVGl0bGUuc2V0VGV4dChpbnN0cnVjdGlvbnMpOworICAgICAgICAgICAgICAgIG1TdGF0dXNWaWV3LnNldEluc3RydWN0aW9uVGV4dChpbnN0cnVjdGlvbnMpOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBAT3ZlcnJpZGUKICAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uRmluaXNoKCkgewogICAgICAgICAgICAgICAgIG1QYXNzd29yZEVudHJ5LnNldEVuYWJsZWQodHJ1ZSk7Ci0gICAgICAgICAgICAgICAgbVRpdGxlLnNldFRleHQoUi5zdHJpbmcua2V5Z3VhcmRfcGFzc3dvcmRfZW50ZXJfcGFzc3dvcmRfY29kZSk7CiAgICAgICAgICAgICAgICAgbUtleWJvYXJkVmlldy5zZXRFbmFibGVkKHRydWUpOworICAgICAgICAgICAgICAgIHJlc2V0U3RhdHVzSW5mbygpOwogICAgICAgICAgICAgfQogICAgICAgICB9LnN0YXJ0KCk7CiAgICAgfQpAQCAtMjQ0LDI0ICsyODcsNDEgQEAKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIAorICAgIC8vIC0tLS0tLS0tLS0gSW5mb0NhbGxiYWNrCisKKyAgICAvKioge0Bpbmhlcml0RG9jfSAqLworICAgIHB1YmxpYyB2b2lkIG9uUmVmcmVzaEJhdHRlcnlJbmZvKGJvb2xlYW4gc2hvd0JhdHRlcnlJbmZvLCBib29sZWFuIHBsdWdnZWRJbiwgaW50IGJhdHRlcnlMZXZlbCkgeworICAgICAgICBtU3RhdHVzVmlldy5vblJlZnJlc2hCYXR0ZXJ5SW5mbyhzaG93QmF0dGVyeUluZm8sIHBsdWdnZWRJbiwgYmF0dGVyeUxldmVsKTsKKyAgICB9CisKKyAgICAvKioge0Bpbmhlcml0RG9jfSAqLworICAgIHB1YmxpYyB2b2lkIG9uVGltZUNoYW5nZWQoKSB7CisgICAgICAgIG1TdGF0dXNWaWV3Lm9uVGltZUNoYW5nZWQoKTsKKyAgICB9CisKKyAgICAvKioge0Bpbmhlcml0RG9jfSAqLworICAgIHB1YmxpYyB2b2lkIG9uUmVmcmVzaENhcnJpZXJJbmZvKENoYXJTZXF1ZW5jZSBwbG1uLCBDaGFyU2VxdWVuY2Ugc3BuKSB7CisgICAgICAgIG1TdGF0dXNWaWV3Lm9uUmVmcmVzaENhcnJpZXJJbmZvKHBsbW4sIHNwbik7CisgICAgfQorCisgICAgLyoqIHtAaW5oZXJpdERvY30gKi8KKyAgICBwdWJsaWMgdm9pZCBvblJpbmdlck1vZGVDaGFuZ2VkKGludCBzdGF0ZSkgeworICAgICAgICAvLyBub3QgY3VycmVudGx5IHVzZWQKKyAgICB9CisKKyAgICAvLyAtLS0tLS0tLS0tIFNpbVN0YXRlQ2FsbGJhY2sKKworICAgIC8qKiB7QGluaGVyaXREb2N9ICovCiAgICAgcHVibGljIHZvaWQgb25QaG9uZVN0YXRlQ2hhbmdlZChTdHJpbmcgbmV3U3RhdGUpIHsKICAgICAgICAgbUxvY2tQYXR0ZXJuVXRpbHMudXBkYXRlRW1lcmdlbmN5Q2FsbEJ1dHRvblN0YXRlKG1FbWVyZ2VuY3lDYWxsQnV0dG9uKTsKICAgICB9CiAKLSAgICBwdWJsaWMgdm9pZCBvblJlZnJlc2hCYXR0ZXJ5SW5mbyhib29sZWFuIHNob3dCYXR0ZXJ5SW5mbywgYm9vbGVhbiBwbHVnZ2VkSW4sIGludCBiYXR0ZXJ5TGV2ZWwpIHsKLQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIG9uUmVmcmVzaENhcnJpZXJJbmZvKENoYXJTZXF1ZW5jZSBwbG1uLCBDaGFyU2VxdWVuY2Ugc3BuKSB7Ci0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBvblJpbmdlck1vZGVDaGFuZ2VkKGludCBzdGF0ZSkgewotCi0gICAgfQotCi0gICAgcHVibGljIHZvaWQgb25UaW1lQ2hhbmdlZCgpIHsKLQorICAgIHByaXZhdGUgdm9pZCByZXNldFN0YXR1c0luZm8oKSB7CisgICAgICAgIGlmKG1Jc0FscGhhKSB7CisgICAgICAgICAgICBtU3RhdHVzVmlldy5zZXRJbnN0cnVjdGlvblRleHQoUi5zdHJpbmcua2V5Z3VhcmRfcGFzc3dvcmRfZW50ZXJfcGFzc3dvcmRfY29kZSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtU3RhdHVzVmlldy5zZXRJbnN0cnVjdGlvblRleHQoUi5zdHJpbmcua2V5Z3VhcmRfcGFzc3dvcmRfZW50ZXJfcGluX3Bhc3N3b3JkX2NvZGUpOworICAgICAgICB9CiAgICAgfQogCiB9CmRpZmYgLS1naXQgYS9wb2xpY3kvc3JjL2NvbS9hbmRyb2lkL2ludGVybmFsL3BvbGljeS9pbXBsL1BhdHRlcm5VbmxvY2tTY3JlZW4uamF2YSBiL3BvbGljeS9zcmMvY29tL2FuZHJvaWQvaW50ZXJuYWwvcG9saWN5L2ltcGwvUGF0dGVyblVubG9ja1NjcmVlbi5qYXZhCmluZGV4IDQxOGUyNDMuLjM1ZmEzZTUgMTAwNjQ0Ci0tLSBhL3BvbGljeS9zcmMvY29tL2FuZHJvaWQvaW50ZXJuYWwvcG9saWN5L2ltcGwvUGF0dGVyblVubG9ja1NjcmVlbi5qYXZhCisrKyBiL3BvbGljeS9zcmMvY29tL2FuZHJvaWQvaW50ZXJuYWwvcG9saWN5L2ltcGwvUGF0dGVyblVubG9ja1NjcmVlbi5qYXZhCkBAIC0yNSw5ICsyNSw2IEBACiBpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXdHcm91cDsKIGltcG9ydCBhbmRyb2lkLnZpZXcuTW90aW9uRXZlbnQ7CiBpbXBvcnQgYW5kcm9pZC53aWRnZXQuQnV0dG9uOwotaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlRleHRWaWV3OwotaW1wb3J0IGFuZHJvaWQudGV4dC5mb3JtYXQuRGF0ZUZvcm1hdDsKLWltcG9ydCBhbmRyb2lkLnRleHQuVGV4dFV0aWxzOwogaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwuUjsKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuSWNjQ2FyZDsKQEAgLTM3LDcgKzM0LDYgQEAKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC53aWRnZXQuTG9ja1BhdHRlcm5WaWV3LkNlbGw7CiAKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuRGF0ZTsKIAogLyoqCiAgKiBUaGlzIGlzIHRoZSBzY3JlZW4gdGhhdCBzaG93cyB0aGUgOSBjaXJjbGUgdW5sb2NrIHdpZGdldCBhbmQgaW5zdHJ1Y3RzCkBAIC03NSwyNyArNzEsNyBAQAogICAgICAqLwogICAgIHByaXZhdGUgYm9vbGVhbiBtRW5hYmxlRmFsbGJhY2s7CiAKLSAgICBwcml2YXRlIFN0cmluZyBtRGF0ZUZvcm1hdFN0cmluZzsKLQotICAgIHByaXZhdGUgVGV4dFZpZXcgbUNhcnJpZXI7Ci0gICAgcHJpdmF0ZSBUZXh0VmlldyBtRGF0ZTsKLQotICAgIC8vIGFyZSB3ZSBzaG93aW5nIGJhdHRlcnkgaW5mb3JtYXRpb24/Ci0gICAgcHJpdmF0ZSBib29sZWFuIG1TaG93aW5nQmF0dGVyeUluZm8gPSBmYWxzZTsKLQotICAgIC8vIGxhc3Qga25vd24gcGx1Z2dlZCBpbiBzdGF0ZQotICAgIHByaXZhdGUgYm9vbGVhbiBtUGx1Z2dlZEluID0gZmFsc2U7Ci0KLSAgICAvLyBsYXN0IGtub3duIGJhdHRlcnkgbGV2ZWwKLSAgICBwcml2YXRlIGludCBtQmF0dGVyeUxldmVsID0gMTAwOwotCi0gICAgcHJpdmF0ZSBTdHJpbmcgbU5leHRBbGFybSA9IG51bGw7Ci0KLSAgICBwcml2YXRlIFN0cmluZyBtSW5zdHJ1Y3Rpb25zID0gbnVsbDsKLSAgICBwcml2YXRlIFRleHRWaWV3IG1TdGF0dXMxOwotICAgIHByaXZhdGUgVGV4dFZpZXcgbVN0YXR1c1NlcDsKLSAgICBwcml2YXRlIFRleHRWaWV3IG1TdGF0dXMyOwotCisgICAgcHJpdmF0ZSBTdGF0dXNWaWV3IG1TdGF0dXNWaWV3OwogCiAgICAgcHJpdmF0ZSBMb2NrUGF0dGVyblZpZXcgbUxvY2tQYXR0ZXJuVmlldzsKIApAQCAtMTMzLDE1ICsxMDksMTggQEAKICAgICBwcml2YXRlIHZvaWQgdXBkYXRlRm9vdGVyKEZvb3Rlck1vZGUgbW9kZSkgewogICAgICAgICBzd2l0Y2ggKG1vZGUpIHsKICAgICAgICAgICAgIGNhc2UgTm9ybWFsOgorICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIm1vZGUgbm9ybWFsIik7CiAgICAgICAgICAgICAgICAgbUZvb3Rlck5vcm1hbC5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7CiAgICAgICAgICAgICAgICAgbUZvb3RlckZvcmdvdFBhdHRlcm4uc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgY2FzZSBGb3Jnb3RMb2NrUGF0dGVybjoKKyAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJtb2RlIEZvcmdvdExvY2tQYXR0ZXJuIik7CiAgICAgICAgICAgICAgICAgbUZvb3Rlck5vcm1hbC5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7CiAgICAgICAgICAgICAgICAgbUZvb3RlckZvcmdvdFBhdHRlcm4uc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOwogICAgICAgICAgICAgICAgIG1Gb3Jnb3RQYXR0ZXJuQnV0dG9uLnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIGNhc2UgVmVyaWZ5VW5sb2NrZWQ6CisgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAibW9kZSBWZXJpZnlVbmxvY2tlZCIpOwogICAgICAgICAgICAgICAgIG1Gb290ZXJOb3JtYWwuc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOwogICAgICAgICAgICAgICAgIG1Gb290ZXJGb3Jnb3RQYXR0ZXJuLnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKICAgICAgICAgfQpAQCAtMTgwLDI0ICsxNTksMTYgQEAKICAgICAgICAgbUNyZWF0aW9uT3JpZW50YXRpb24gPSBjb25maWd1cmF0aW9uLm9yaWVudGF0aW9uOwogCiAgICAgICAgIExheW91dEluZmxhdGVyIGluZmxhdGVyID0gTGF5b3V0SW5mbGF0ZXIuZnJvbShjb250ZXh0KTsKKwogICAgICAgICBpZiAobUNyZWF0aW9uT3JpZW50YXRpb24gIT0gQ29uZmlndXJhdGlvbi5PUklFTlRBVElPTl9MQU5EU0NBUEUpIHsKKyAgICAgICAgICAgIExvZy5kKFRBRywgInBvcnRyYWl0IG1vZGUiKTsKICAgICAgICAgICAgIGluZmxhdGVyLmluZmxhdGUoUi5sYXlvdXQua2V5Z3VhcmRfc2NyZWVuX3VubG9ja19wb3J0cmFpdCwgdGhpcywgdHJ1ZSk7CiAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBMb2cuZChUQUcsICJsYW5kc2NhcGUgbW9kZSIpOwogICAgICAgICAgICAgaW5mbGF0ZXIuaW5mbGF0ZShSLmxheW91dC5rZXlndWFyZF9zY3JlZW5fdW5sb2NrX2xhbmRzY2FwZSwgdGhpcywgdHJ1ZSk7CiAgICAgICAgIH0KIAotICAgICAgICBtQ2FycmllciA9IChUZXh0VmlldykgZmluZFZpZXdCeUlkKFIuaWQuY2Fycmllcik7Ci0gICAgICAgIG1EYXRlID0gKFRleHRWaWV3KSBmaW5kVmlld0J5SWQoUi5pZC5kYXRlKTsKLQotICAgICAgICBtRGF0ZUZvcm1hdFN0cmluZyA9IGdldENvbnRleHQoKS5nZXRTdHJpbmcoUi5zdHJpbmcuZnVsbF93ZGF5X21vbnRoX2RheV9ub195ZWFyKTsKLSAgICAgICAgcmVmcmVzaFRpbWVBbmREYXRlRGlzcGxheSgpOwotCi0gICAgICAgIG1TdGF0dXMxID0gKFRleHRWaWV3KSBmaW5kVmlld0J5SWQoUi5pZC5zdGF0dXMxKTsKLSAgICAgICAgbVN0YXR1c1NlcCA9IChUZXh0VmlldykgZmluZFZpZXdCeUlkKFIuaWQuc3RhdHVzU2VwKTsKLSAgICAgICAgbVN0YXR1czIgPSAoVGV4dFZpZXcpIGZpbmRWaWV3QnlJZChSLmlkLnN0YXR1czIpOwotCi0gICAgICAgIHJlc2V0U3RhdHVzSW5mbygpOwotCisgICAgICAgIG1TdGF0dXNWaWV3ID0gbmV3IFN0YXR1c1ZpZXcodGhpcywgbVVwZGF0ZU1vbml0b3IsIG1Mb2NrUGF0dGVyblV0aWxzKTsKIAogICAgICAgICBtTG9ja1BhdHRlcm5WaWV3ID0gKExvY2tQYXR0ZXJuVmlldykgZmluZFZpZXdCeUlkKFIuaWQubG9ja1BhdHRlcm4pOwogCkBAIC0yNDksMTUgKzIyMCwxMSBAQAogICAgICAgICB1cGRhdGVNb25pdG9yLnJlZ2lzdGVyU2ltU3RhdGVDYWxsYmFjayh0aGlzKTsKICAgICAgICAgc2V0Rm9jdXNhYmxlSW5Ub3VjaE1vZGUodHJ1ZSk7CiAKLSAgICAgICAgLy8gUmVxdWlyZWQgdG8gZ2V0IE1hcnF1ZWUgdG8gd29yay4KLSAgICAgICAgbUNhcnJpZXIuc2V0U2VsZWN0ZWQodHJ1ZSk7Ci0gICAgICAgIG1DYXJyaWVyLnNldFRleHRDb2xvcigweGZmZmZmZmZmKTsKLQogICAgICAgICAvLyB1bnRpbCB3ZSBnZXQgYW4gdXBkYXRlLi4uCi0gICAgICAgIG1DYXJyaWVyLnNldFRleHQoCi0gICAgICAgICAgICAgICAgTG9ja1NjcmVlbi5nZXRDYXJyaWVyU3RyaW5nKAorICAgICAgICBtU3RhdHVzVmlldy5zZXRDYXJyaWVyVGV4dChMb2NrU2NyZWVuLmdldENhcnJpZXJTdHJpbmcoCiAgICAgICAgICAgICAgICAgICAgICAgICBtVXBkYXRlTW9uaXRvci5nZXRUZWxlcGhvbnlQbG1uKCksCiAgICAgICAgICAgICAgICAgICAgICAgICBtVXBkYXRlTW9uaXRvci5nZXRUZWxlcGhvbnlTcG4oKSkpOworCiAgICAgfQogCiAgICAgcHJpdmF0ZSB2b2lkIHJlZnJlc2hFbWVyZ2VuY3lCdXR0b25UZXh0KCkgewpAQCAtMjcwLDg4ICsyMzcsNiBAQAogICAgICAgICBtRW5hYmxlRmFsbGJhY2sgPSBzdGF0ZTsKICAgICB9CiAKLSAgICBwcml2YXRlIHZvaWQgcmVzZXRTdGF0dXNJbmZvKCkgewotICAgICAgICBtSW5zdHJ1Y3Rpb25zID0gbnVsbDsKLSAgICAgICAgbVNob3dpbmdCYXR0ZXJ5SW5mbyA9IG1VcGRhdGVNb25pdG9yLnNob3VsZFNob3dCYXR0ZXJ5SW5mbygpOwotICAgICAgICBtUGx1Z2dlZEluID0gbVVwZGF0ZU1vbml0b3IuaXNEZXZpY2VQbHVnZ2VkSW4oKTsKLSAgICAgICAgbUJhdHRlcnlMZXZlbCA9IG1VcGRhdGVNb25pdG9yLmdldEJhdHRlcnlMZXZlbCgpOwotICAgICAgICBtTmV4dEFsYXJtID0gbUxvY2tQYXR0ZXJuVXRpbHMuZ2V0TmV4dEFsYXJtKCk7Ci0gICAgICAgIHVwZGF0ZVN0YXR1c0xpbmVzKCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHVwZGF0ZVN0YXR1c0xpbmVzKCkgewotICAgICAgICBpZiAobUluc3RydWN0aW9ucyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAvLyBpbnN0cnVjdGlvbnMgb25seQotICAgICAgICAgICAgbVN0YXR1czEuc2V0VGV4dChtSW5zdHJ1Y3Rpb25zKTsKLSAgICAgICAgICAgIGlmIChUZXh0VXRpbHMuaXNFbXB0eShtSW5zdHJ1Y3Rpb25zKSkgewotICAgICAgICAgICAgICAgIG1TdGF0dXMxLnNldENvbXBvdW5kRHJhd2FibGVzV2l0aEludHJpbnNpY0JvdW5kcygwLCAwLCAwLCAwKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgbVN0YXR1czEuc2V0Q29tcG91bmREcmF3YWJsZXNXaXRoSW50cmluc2ljQm91bmRzKAotICAgICAgICAgICAgICAgICAgICAgICAgUi5kcmF3YWJsZS5pY19sb2NrX2lkbGVfbG9jaywgMCwgMCwgMCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIG1TdGF0dXMxLnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKLSAgICAgICAgICAgIG1TdGF0dXNTZXAuc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOwotICAgICAgICAgICAgbVN0YXR1czIuc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOwotICAgICAgICB9IGVsc2UgaWYgKG1TaG93aW5nQmF0dGVyeUluZm8gJiYgbU5leHRBbGFybSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAvLyBiYXR0ZXJ5IG9ubHkKLSAgICAgICAgICAgIGlmIChtUGx1Z2dlZEluKSB7Ci0gICAgICAgICAgICAgIGlmIChtQmF0dGVyeUxldmVsID49IDEwMCkgewotICAgICAgICAgICAgICAgIG1TdGF0dXMxLnNldFRleHQoZ2V0Q29udGV4dCgpLmdldFN0cmluZyhSLnN0cmluZy5sb2Nrc2NyZWVuX2NoYXJnZWQpKTsKLSAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgIG1TdGF0dXMxLnNldFRleHQoZ2V0Q29udGV4dCgpLmdldFN0cmluZyhSLnN0cmluZy5sb2Nrc2NyZWVuX3BsdWdnZWRfaW4sIG1CYXR0ZXJ5TGV2ZWwpKTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBtU3RhdHVzMS5zZXRUZXh0KGdldENvbnRleHQoKS5nZXRTdHJpbmcoUi5zdHJpbmcubG9ja3NjcmVlbl9sb3dfYmF0dGVyeSkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbVN0YXR1czEuc2V0Q29tcG91bmREcmF3YWJsZXNXaXRoSW50cmluc2ljQm91bmRzKFIuZHJhd2FibGUuaWNfbG9ja19pZGxlX2NoYXJnaW5nLCAwLCAwLCAwKTsKLQotICAgICAgICAgICAgbVN0YXR1czEuc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOwotICAgICAgICAgICAgbVN0YXR1c1NlcC5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7Ci0gICAgICAgICAgICBtU3RhdHVzMi5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7Ci0KLSAgICAgICAgfSBlbHNlIGlmIChtTmV4dEFsYXJtICE9IG51bGwgJiYgIW1TaG93aW5nQmF0dGVyeUluZm8pIHsKLSAgICAgICAgICAgIC8vIGFsYXJtIG9ubHkKLSAgICAgICAgICAgIG1TdGF0dXMxLnNldFRleHQobU5leHRBbGFybSk7Ci0gICAgICAgICAgICBtU3RhdHVzMS5zZXRDb21wb3VuZERyYXdhYmxlc1dpdGhJbnRyaW5zaWNCb3VuZHMoUi5kcmF3YWJsZS5pY19sb2NrX2lkbGVfYWxhcm0sIDAsIDAsIDApOwotCi0gICAgICAgICAgICBtU3RhdHVzMS5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7Ci0gICAgICAgICAgICBtU3RhdHVzU2VwLnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKLSAgICAgICAgICAgIG1TdGF0dXMyLnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKLSAgICAgICAgfSBlbHNlIGlmIChtTmV4dEFsYXJtICE9IG51bGwgJiYgbVNob3dpbmdCYXR0ZXJ5SW5mbykgewotICAgICAgICAgICAgLy8gYm90aCBiYXR0ZXJ5IGFuZCBuZXh0IGFsYXJtCi0gICAgICAgICAgICBtU3RhdHVzMS5zZXRUZXh0KG1OZXh0QWxhcm0pOwotICAgICAgICAgICAgbVN0YXR1c1NlcC5zZXRUZXh0KCJ8Iik7Ci0gICAgICAgICAgICBtU3RhdHVzMi5zZXRUZXh0KGdldENvbnRleHQoKS5nZXRTdHJpbmcoCi0gICAgICAgICAgICAgICAgICAgIFIuc3RyaW5nLmxvY2tzY3JlZW5fYmF0dGVyeV9zaG9ydCwKLSAgICAgICAgICAgICAgICAgICAgTWF0aC5taW4oMTAwLCBtQmF0dGVyeUxldmVsKSkpOwotICAgICAgICAgICAgbVN0YXR1czEuc2V0Q29tcG91bmREcmF3YWJsZXNXaXRoSW50cmluc2ljQm91bmRzKFIuZHJhd2FibGUuaWNfbG9ja19pZGxlX2FsYXJtLCAwLCAwLCAwKTsKLSAgICAgICAgICAgIGlmIChtUGx1Z2dlZEluKSB7Ci0gICAgICAgICAgICAgICAgbVN0YXR1czIuc2V0Q29tcG91bmREcmF3YWJsZXNXaXRoSW50cmluc2ljQm91bmRzKFIuZHJhd2FibGUuaWNfbG9ja19pZGxlX2NoYXJnaW5nLCAwLCAwLCAwKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgbVN0YXR1czIuc2V0Q29tcG91bmREcmF3YWJsZXNXaXRoSW50cmluc2ljQm91bmRzKDAsIDAsIDAsIDApOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBtU3RhdHVzMS5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7Ci0gICAgICAgICAgICBtU3RhdHVzU2VwLnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKLSAgICAgICAgICAgIG1TdGF0dXMyLnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIG5vdGhpbmcgc3BlY2lmaWMgdG8gc2hvdzsgc2hvdyBnZW5lcmFsIGluc3RydWN0aW9ucwotICAgICAgICAgICAgbVN0YXR1czEuc2V0VGV4dChSLnN0cmluZy5sb2Nrc2NyZWVuX3BhdHRlcm5faW5zdHJ1Y3Rpb25zKTsKLSAgICAgICAgICAgIG1TdGF0dXMxLnNldENvbXBvdW5kRHJhd2FibGVzV2l0aEludHJpbnNpY0JvdW5kcyhSLmRyYXdhYmxlLmljX2xvY2tfaWRsZV9sb2NrLCAwLCAwLCAwKTsKLQotICAgICAgICAgICAgbVN0YXR1czEuc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOwotICAgICAgICAgICAgbVN0YXR1c1NlcC5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7Ci0gICAgICAgICAgICBtU3RhdHVzMi5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLQotICAgIHByaXZhdGUgdm9pZCByZWZyZXNoVGltZUFuZERhdGVEaXNwbGF5KCkgewotICAgICAgICBtRGF0ZS5zZXRUZXh0KERhdGVGb3JtYXQuZm9ybWF0KG1EYXRlRm9ybWF0U3RyaW5nLCBuZXcgRGF0ZSgpKSk7Ci0gICAgfQotCi0KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgYm9vbGVhbiBkaXNwYXRjaFRvdWNoRXZlbnQoTW90aW9uRXZlbnQgZXYpIHsKICAgICAgICAgLy8gYXMgbG9uZyBhcyB0aGUgdXNlciBpcyBlbnRlcmluZyBhIHBhdHRlcm4gKGkuZSBzZW5kaW5nIGEgdG91Y2gKQEAgLTM2NiwyNSArMjUxLDIxIEBACiAgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgfQogCi0KICAgICAvLyAtLS0tLS0tLS0tIEluZm9DYWxsYmFjawogCiAgICAgLyoqIHtAaW5oZXJpdERvY30gKi8KICAgICBwdWJsaWMgdm9pZCBvblJlZnJlc2hCYXR0ZXJ5SW5mbyhib29sZWFuIHNob3dCYXR0ZXJ5SW5mbywgYm9vbGVhbiBwbHVnZ2VkSW4sIGludCBiYXR0ZXJ5TGV2ZWwpIHsKLSAgICAgICAgbVNob3dpbmdCYXR0ZXJ5SW5mbyA9IHNob3dCYXR0ZXJ5SW5mbzsKLSAgICAgICAgbVBsdWdnZWRJbiA9IHBsdWdnZWRJbjsKLSAgICAgICAgbUJhdHRlcnlMZXZlbCA9IGJhdHRlcnlMZXZlbDsKLSAgICAgICAgdXBkYXRlU3RhdHVzTGluZXMoKTsKKyAgICAgICAgbVN0YXR1c1ZpZXcub25SZWZyZXNoQmF0dGVyeUluZm8oc2hvd0JhdHRlcnlJbmZvLCBwbHVnZ2VkSW4sIGJhdHRlcnlMZXZlbCk7CiAgICAgfQogCiAgICAgLyoqIHtAaW5oZXJpdERvY30gKi8KICAgICBwdWJsaWMgdm9pZCBvblRpbWVDaGFuZ2VkKCkgewotICAgICAgICByZWZyZXNoVGltZUFuZERhdGVEaXNwbGF5KCk7CisgICAgICAgIG1TdGF0dXNWaWV3Lm9uVGltZUNoYW5nZWQoKTsKICAgICB9CiAKICAgICAvKioge0Bpbmhlcml0RG9jfSAqLwogICAgIHB1YmxpYyB2b2lkIG9uUmVmcmVzaENhcnJpZXJJbmZvKENoYXJTZXF1ZW5jZSBwbG1uLCBDaGFyU2VxdWVuY2Ugc3BuKSB7Ci0gICAgICAgIG1DYXJyaWVyLnNldFRleHQoTG9ja1NjcmVlbi5nZXRDYXJyaWVyU3RyaW5nKHBsbW4sIHNwbikpOworICAgICAgICBtU3RhdHVzVmlldy5vblJlZnJlc2hDYXJyaWVySW5mbyhwbG1uLCBzcG4pOwogICAgIH0KIAogICAgIC8qKiB7QGluaGVyaXREb2N9ICovCkBAIC00NDQsOCArMzI1LDggQEAKIAogICAgIC8qKiB7QGluaGVyaXREb2N9ICovCiAgICAgcHVibGljIHZvaWQgb25SZXN1bWUoKSB7Ci0gICAgICAgIC8vIHJlc2V0IGhlYWRlcgotICAgICAgICByZXNldFN0YXR1c0luZm8oKTsKKyAgICAgICAgLy8gcmVzZXQgc3RhdHVzCisgICAgICAgIG1TdGF0dXNWaWV3LnJlc2V0U3RhdHVzSW5mbyhtVXBkYXRlTW9uaXRvciwgbUxvY2tQYXR0ZXJuVXRpbHMpOwogCiAgICAgICAgIC8vIHJlc2V0IGxvY2sgcGF0dGVybgogICAgICAgICBtTG9ja1BhdHRlcm5WaWV3LmVuYWJsZUlucHV0KCk7CkBAIC01MTQsOCArMzk1LDggQEAKICAgICAgICAgICAgIGlmIChtTG9ja1BhdHRlcm5VdGlscy5jaGVja1BhdHRlcm4ocGF0dGVybikpIHsKICAgICAgICAgICAgICAgICBtTG9ja1BhdHRlcm5WaWV3CiAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0RGlzcGxheU1vZGUoTG9ja1BhdHRlcm5WaWV3LkRpc3BsYXlNb2RlLkNvcnJlY3QpOwotICAgICAgICAgICAgICAgIG1JbnN0cnVjdGlvbnMgPSAiIjsKLSAgICAgICAgICAgICAgICB1cGRhdGVTdGF0dXNMaW5lcygpOworICAgICAgICAgICAgICAgIG1TdGF0dXNWaWV3LnNldEluc3RydWN0aW9ucygiIik7CisgICAgICAgICAgICAgICAgbVN0YXR1c1ZpZXcudXBkYXRlU3RhdHVzTGluZXMoKTsKICAgICAgICAgICAgICAgICBtQ2FsbGJhY2sua2V5Z3VhcmREb25lKHRydWUpOwogICAgICAgICAgICAgICAgIG1DYWxsYmFjay5yZXBvcnRTdWNjZXNzZnVsVW5sb2NrQXR0ZW1wdCgpOwogICAgICAgICAgICAgfSBlbHNlIHsKQEAgLTUzMyw4ICs0MTQsOSBAQAogICAgICAgICAgICAgICAgICAgICBoYW5kbGVBdHRlbXB0TG9ja291dChkZWFkbGluZSk7CiAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgLy8gVE9ETyBtVW5sb2NrSWNvbi5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7Ci0gICAgICAgICAgICAgICAgICAgIG1JbnN0cnVjdGlvbnMgPSBnZXRDb250ZXh0KCkuZ2V0U3RyaW5nKFIuc3RyaW5nLmxvY2tzY3JlZW5fcGF0dGVybl93cm9uZyk7Ci0gICAgICAgICAgICAgICAgICAgIHVwZGF0ZVN0YXR1c0xpbmVzKCk7CisgICAgICAgICAgICAgICAgICAgIG1TdGF0dXNWaWV3LnNldEluc3RydWN0aW9ucygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRDb250ZXh0KCkuZ2V0U3RyaW5nKFIuc3RyaW5nLmxvY2tzY3JlZW5fcGF0dGVybl93cm9uZykpOworICAgICAgICAgICAgICAgICAgICBtU3RhdHVzVmlldy51cGRhdGVTdGF0dXNMaW5lcygpOwogICAgICAgICAgICAgICAgICAgICBtTG9ja1BhdHRlcm5WaWV3LnBvc3REZWxheWVkKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1DYW5jZWxQYXR0ZXJuUnVubmFibGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEFUVEVSTl9DTEVBUl9USU1FT1VUX01TKTsKQEAgLTU1MiwxNyArNDM0LDE4IEBACiAgICAgICAgICAgICBAT3ZlcnJpZGUKICAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uVGljayhsb25nIG1pbGxpc1VudGlsRmluaXNoZWQpIHsKICAgICAgICAgICAgICAgICBpbnQgc2Vjb25kc1JlbWFpbmluZyA9IChpbnQpIChtaWxsaXNVbnRpbEZpbmlzaGVkIC8gMTAwMCk7Ci0gICAgICAgICAgICAgICAgbUluc3RydWN0aW9ucyA9IGdldENvbnRleHQoKS5nZXRTdHJpbmcoCisgICAgICAgICAgICAgICAgbVN0YXR1c1ZpZXcuc2V0SW5zdHJ1Y3Rpb25zKGdldENvbnRleHQoKS5nZXRTdHJpbmcoCiAgICAgICAgICAgICAgICAgICAgICAgICBSLnN0cmluZy5sb2Nrc2NyZWVuX3Rvb19tYW55X2ZhaWxlZF9hdHRlbXB0c19jb3VudGRvd24sCi0gICAgICAgICAgICAgICAgICAgICAgICBzZWNvbmRzUmVtYWluaW5nKTsKLSAgICAgICAgICAgICAgICB1cGRhdGVTdGF0dXNMaW5lcygpOworICAgICAgICAgICAgICAgICAgICAgICAgc2Vjb25kc1JlbWFpbmluZykpOworICAgICAgICAgICAgICAgIG1TdGF0dXNWaWV3LnVwZGF0ZVN0YXR1c0xpbmVzKCk7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIEBPdmVycmlkZQogICAgICAgICAgICAgcHVibGljIHZvaWQgb25GaW5pc2goKSB7CiAgICAgICAgICAgICAgICAgbUxvY2tQYXR0ZXJuVmlldy5zZXRFbmFibGVkKHRydWUpOwotICAgICAgICAgICAgICAgIG1JbnN0cnVjdGlvbnMgPSBnZXRDb250ZXh0KCkuZ2V0U3RyaW5nKFIuc3RyaW5nLmxvY2tzY3JlZW5fcGF0dGVybl9pbnN0cnVjdGlvbnMpOwotICAgICAgICAgICAgICAgIHVwZGF0ZVN0YXR1c0xpbmVzKCk7CisgICAgICAgICAgICAgICAgbVN0YXR1c1ZpZXcuc2V0SW5zdHJ1Y3Rpb25zKGdldENvbnRleHQoKS5nZXRTdHJpbmcoCisgICAgICAgICAgICAgICAgICAgICAgICBSLnN0cmluZy5sb2Nrc2NyZWVuX3BhdHRlcm5faW5zdHJ1Y3Rpb25zKSk7CisgICAgICAgICAgICAgICAgbVN0YXR1c1ZpZXcudXBkYXRlU3RhdHVzTGluZXMoKTsKICAgICAgICAgICAgICAgICAvLyBUT0RPIG1VbmxvY2tJY29uLnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKICAgICAgICAgICAgICAgICBtRmFpbGVkUGF0dGVybkF0dGVtcHRzU2luY2VMYXN0VGltZW91dCA9IDA7CiAgICAgICAgICAgICAgICAgaWYgKG1FbmFibGVGYWxsYmFjaykgewpkaWZmIC0tZ2l0IGEvcG9saWN5L3NyYy9jb20vYW5kcm9pZC9pbnRlcm5hbC9wb2xpY3kvaW1wbC9QaG9uZVdpbmRvdy5qYXZhIGIvcG9saWN5L3NyYy9jb20vYW5kcm9pZC9pbnRlcm5hbC9wb2xpY3kvaW1wbC9QaG9uZVdpbmRvdy5qYXZhCmluZGV4IGRmZmNjZjguLmMyNWRmMWQgMTAwNjQ0Ci0tLSBhL3BvbGljeS9zcmMvY29tL2FuZHJvaWQvaW50ZXJuYWwvcG9saWN5L2ltcGwvUGhvbmVXaW5kb3cuamF2YQorKysgYi9wb2xpY3kvc3JjL2NvbS9hbmRyb2lkL2ludGVybmFsL3BvbGljeS9pbXBsL1Bob25lV2luZG93LmphdmEKQEAgLTI0LDExICsyNCwxNSBAQAogCiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudmlldy5CYXNlU3VyZmFjZUhvbGRlcjsKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC52aWV3LlJvb3RWaWV3U3VyZmFjZVRha2VyOworaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnZpZXcuU3RhbmRhbG9uZUFjdGlvbk1vZGU7CiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudmlldy5tZW51LkNvbnRleHRNZW51QnVpbGRlcjsKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC52aWV3Lm1lbnUuTWVudUJ1aWxkZXI7CiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudmlldy5tZW51Lk1lbnVEaWFsb2dIZWxwZXI7CitpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudmlldy5tZW51Lk1lbnVQb3B1cEhlbHBlcjsKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC52aWV3Lm1lbnUuTWVudVZpZXc7CiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudmlldy5tZW51LlN1Yk1lbnVCdWlsZGVyOworaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLndpZGdldC5BY3Rpb25CYXJDb250ZXh0VmlldzsKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC53aWRnZXQuQWN0aW9uQmFyVmlldzsKIAogaW1wb3J0IGFuZHJvaWQuYXBwLktleWd1YXJkTWFuYWdlcjsKIGltcG9ydCBhbmRyb2lkLmFwcC5TZWFyY2hNYW5hZ2VyOwpAQCAtNTMsNiArNTcsNyBAQAogaW1wb3J0IGFuZHJvaWQudXRpbC5FdmVudExvZzsKIGltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwogaW1wb3J0IGFuZHJvaWQudXRpbC5TcGFyc2VBcnJheTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuQWN0aW9uTW9kZTsKIGltcG9ydCBhbmRyb2lkLnZpZXcuR3Jhdml0eTsKIGltcG9ydCBhbmRyb2lkLnZpZXcuSGFwdGljRmVlZGJhY2tDb25zdGFudHM7CiBpbXBvcnQgYW5kcm9pZC52aWV3LklucHV0UXVldWU7CkBAIC02Niw2ICs3MSw3IEBACiBpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CiBpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXdHcm91cDsKIGltcG9ydCBhbmRyb2lkLnZpZXcuVmlld01hbmFnZXI7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXdTdHViOwogaW1wb3J0IGFuZHJvaWQudmlldy5Wb2x1bWVQYW5lbDsKIGltcG9ydCBhbmRyb2lkLnZpZXcuV2luZG93OwogaW1wb3J0IGFuZHJvaWQudmlldy5XaW5kb3dNYW5hZ2VyOwpAQCAtOTUsNyArMTAxLDcgQEAKICAgICAgKiBTaW1wbGUgY2FsbGJhY2sgdXNlZCBieSB0aGUgY29udGV4dCBtZW51IGFuZCBpdHMgc3VibWVudXMuIFRoZSBvcHRpb25zCiAgICAgICogbWVudSBzdWJtZW51cyBkbyBub3QgdXNlIHRoaXMgKHRoZWlyIGJlaGF2aW9yIGlzIG1vcmUgY29tcGxleCkuCiAgICAgICovCi0gICAgQ29udGV4dE1lbnVDYWxsYmFjayBtQ29udGV4dE1lbnVDYWxsYmFjayA9IG5ldyBDb250ZXh0TWVudUNhbGxiYWNrKEZFQVRVUkVfQ09OVEVYVF9NRU5VKTsKKyAgICBEaWFsb2dNZW51Q2FsbGJhY2sgbUNvbnRleHRNZW51Q2FsbGJhY2sgPSBuZXcgRGlhbG9nTWVudUNhbGxiYWNrKEZFQVRVUkVfQ09OVEVYVF9NRU5VKTsKIAogICAgIC8vIFRoaXMgaXMgdGhlIHRvcC1sZXZlbCB2aWV3IG9mIHRoZSB3aW5kb3csIGNvbnRhaW5pbmcgdGhlIHdpbmRvdyBkZWNvci4KICAgICBwcml2YXRlIERlY29yVmlldyBtRGVjb3I7CkBAIC0xMTQsNiArMTIwLDggQEAKICAgICBwcml2YXRlIExheW91dEluZmxhdGVyIG1MYXlvdXRJbmZsYXRlcjsKIAogICAgIHByaXZhdGUgVGV4dFZpZXcgbVRpdGxlVmlldzsKKyAgICAKKyAgICBwcml2YXRlIEFjdGlvbkJhclZpZXcgbUFjdGlvbkJhcjsKIAogICAgIHByaXZhdGUgRHJhd2FibGVGZWF0dXJlU3RhdGVbXSBtRHJhd2FibGVzOwogCkBAIC0xOTEsOCArMTk5LDEyIEBACiAgICAgICAgICAgICAvKiBDdXN0b20gdGl0bGUgZmVhdHVyZSBpcyBlbmFibGVkIGFuZCB0aGUgdXNlciBpcyB0cnlpbmcgdG8gZW5hYmxlIGFub3RoZXIgZmVhdHVyZSAqLwogICAgICAgICAgICAgdGhyb3cgbmV3IEFuZHJvaWRSdW50aW1lRXhjZXB0aW9uKCJZb3UgY2Fubm90IGNvbWJpbmUgY3VzdG9tIHRpdGxlcyB3aXRoIG90aGVyIHRpdGxlIGZlYXR1cmVzIik7CiAgICAgICAgIH0KLSAgICAgICAgaWYgKGZlYXR1cmVJZCA9PSBGRUFUVVJFX09QRU5HTCkgewotICAgICAgICAgICAgZ2V0QXR0cmlidXRlcygpLm1lbW9yeVR5cGUgPSBXaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcy5NRU1PUllfVFlQRV9HUFU7CisgICAgICAgIGlmICgoZmVhdHVyZXMgJiAoMSA8PCBGRUFUVVJFX05PX1RJVExFKSkgIT0gMCAmJiBmZWF0dXJlSWQgPT0gRkVBVFVSRV9BQ1RJT05fQkFSKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7IC8vIElnbm9yZS4gTm8gdGl0bGUgZG9taW5hdGVzLgorICAgICAgICB9CisgICAgICAgIGlmICgoZmVhdHVyZXMgJiAoMSA8PCBGRUFUVVJFX0FDVElPTl9CQVIpKSAhPSAwICYmIGZlYXR1cmVJZCA9PSBGRUFUVVJFX05PX1RJVExFKSB7CisgICAgICAgICAgICAvLyBSZW1vdmUgdGhlIGFjdGlvbiBiYXIgZmVhdHVyZSBpZiB3ZSBoYXZlIG5vIHRpdGxlLiBObyB0aXRsZSBkb21pbmF0ZXMuCisgICAgICAgICAgICByZW1vdmVGZWF0dXJlKEZFQVRVUkVfQUNUSU9OX0JBUik7CiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIHN1cGVyLnJlcXVlc3RGZWF0dXJlKGZlYXR1cmVJZCk7CiAgICAgfQpAQCAtMjc2LDYgKzI4OCw4IEBACiAgICAgcHVibGljIHZvaWQgc2V0VGl0bGUoQ2hhclNlcXVlbmNlIHRpdGxlKSB7CiAgICAgICAgIGlmIChtVGl0bGVWaWV3ICE9IG51bGwpIHsKICAgICAgICAgICAgIG1UaXRsZVZpZXcuc2V0VGV4dCh0aXRsZSk7CisgICAgICAgIH0gZWxzZSBpZiAobUFjdGlvbkJhciAhPSBudWxsKSB7CisgICAgICAgICAgICBtQWN0aW9uQmFyLnNldFdpbmRvd1RpdGxlKHRpdGxlKTsKICAgICAgICAgfQogICAgICAgICBtVGl0bGUgPSB0aXRsZTsKICAgICB9CkBAIC0zMDEsNyArMzE1LDcgQEAKICAgICAgICAgLy8gQWxyZWFkeSBwcmVwYXJlZCAoaXNQcmVwYXJlZCB3aWxsIGJlIHJlc2V0IHRvIGZhbHNlIGxhdGVyKQogICAgICAgICBpZiAoc3QuaXNQcmVwYXJlZCkKICAgICAgICAgICAgIHJldHVybiB0cnVlOwotCisgICAgICAgIAogICAgICAgICBpZiAoKG1QcmVwYXJlZFBhbmVsICE9IG51bGwpICYmIChtUHJlcGFyZWRQYW5lbCAhPSBzdCkpIHsKICAgICAgICAgICAgIC8vIEFub3RoZXIgUGFuZWwgaXMgcHJlcGFyZWQgYW5kIHBvc3NpYmx5IG9wZW4sIHNvIGNsb3NlIGl0CiAgICAgICAgICAgICBjbG9zZVBhbmVsKG1QcmVwYXJlZFBhbmVsLCBmYWxzZSk7CkBAIC0zMTUsOSArMzI5LDExIEBACiAKICAgICAgICAgaWYgKHN0LmNyZWF0ZWRQYW5lbFZpZXcgPT0gbnVsbCkgewogICAgICAgICAgICAgLy8gSW5pdCB0aGUgcGFuZWwgc3RhdGUncyBtZW51LS1yZXR1cm4gZmFsc2UgaWYgaW5pdCBmYWlsZWQKLSAgICAgICAgICAgIGlmIChzdC5tZW51ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBpZiAoIWluaXRpYWxpemVQYW5lbE1lbnUoc3QpIHx8IChzdC5tZW51ID09IG51bGwpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIGlmIChzdC5tZW51ID09IG51bGwgfHwgc3QucmVmcmVzaE1lbnVDb250ZW50KSB7CisgICAgICAgICAgICAgICAgaWYgKHN0Lm1lbnUgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWluaXRpYWxpemVQYW5lbE1lbnUoc3QpIHx8IChzdC5tZW51ID09IG51bGwpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgLy8gQ2FsbCBjYWxsYmFjaywgYW5kIHJldHVybiBpZiBpdCBkb2Vzbid0IHdhbnQgdG8gZGlzcGxheSBtZW51CiAgICAgICAgICAgICAgICAgaWYgKChjYiA9PSBudWxsKSB8fCAhY2Iub25DcmVhdGVQYW5lbE1lbnUoc3QuZmVhdHVyZUlkLCBzdC5tZW51KSkgewpAQCAtMzI2LDYgKzM0MiwxMiBAQAogCiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgc3QucmVmcmVzaE1lbnVDb250ZW50ID0gZmFsc2U7CisKKyAgICAgICAgICAgICAgICBpZiAobUFjdGlvbkJhciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIG1BY3Rpb25CYXIuc2V0TWVudShzdC5tZW51KTsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIC8vIENhbGxiYWNrIGFuZCByZXR1cm4gaWYgdGhlIGNhbGxiYWNrIGRvZXMgbm90IHdhbnQgdG8gc2hvdyB0aGUgbWVudQpAQCAtMzQ5LDM2ICszNzEsMzcgQEAKIAogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIG9uQ29uZmlndXJhdGlvbkNoYW5nZWQoQ29uZmlndXJhdGlvbiBuZXdDb25maWcpIHsKLSAgICAgICAgUGFuZWxGZWF0dXJlU3RhdGUgc3QgPSBnZXRQYW5lbFN0YXRlKEZFQVRVUkVfT1BUSU9OU19QQU5FTCwgZmFsc2UpOwotICAgICAgICBpZiAoKHN0ICE9IG51bGwpICYmIChzdC5tZW51ICE9IG51bGwpKSB7Ci0gICAgICAgICAgICBmaW5hbCBNZW51QnVpbGRlciBtZW51QnVpbGRlciA9IChNZW51QnVpbGRlcikgc3QubWVudTsKKyAgICAgICAgLy8gQWN0aW9uIGJhcnMgaGFuZGxlIHRoZWlyIG93biBtZW51IHN0YXRlCisgICAgICAgIGlmIChtQWN0aW9uQmFyID09IG51bGwpIHsKKyAgICAgICAgICAgIFBhbmVsRmVhdHVyZVN0YXRlIHN0ID0gZ2V0UGFuZWxTdGF0ZShGRUFUVVJFX09QVElPTlNfUEFORUwsIGZhbHNlKTsKKyAgICAgICAgICAgIGlmICgoc3QgIT0gbnVsbCkgJiYgKHN0Lm1lbnUgIT0gbnVsbCkpIHsKKyAgICAgICAgICAgICAgICBmaW5hbCBNZW51QnVpbGRlciBtZW51QnVpbGRlciA9IChNZW51QnVpbGRlcikgc3QubWVudTsKIAotICAgICAgICAgICAgaWYgKHN0LmlzT3BlbikgewotICAgICAgICAgICAgICAgIC8vIEZyZWV6ZSBzdGF0ZQotICAgICAgICAgICAgICAgIGZpbmFsIEJ1bmRsZSBzdGF0ZSA9IG5ldyBCdW5kbGUoKTsKLSAgICAgICAgICAgICAgICBtZW51QnVpbGRlci5zYXZlSGllcmFyY2h5U3RhdGUoc3RhdGUpOworICAgICAgICAgICAgICAgIGlmIChzdC5pc09wZW4pIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gRnJlZXplIHN0YXRlCisgICAgICAgICAgICAgICAgICAgIGZpbmFsIEJ1bmRsZSBzdGF0ZSA9IG5ldyBCdW5kbGUoKTsKKyAgICAgICAgICAgICAgICAgICAgbWVudUJ1aWxkZXIuc2F2ZUhpZXJhcmNoeVN0YXRlKHN0YXRlKTsKIAotICAgICAgICAgICAgICAgIC8vIFJlbW92ZSB0aGUgbWVudSB2aWV3cyBzaW5jZSB0aGV5IG5lZWQgdG8gYmUgcmVjcmVhdGVkCi0gICAgICAgICAgICAgICAgLy8gYWNjb3JkaW5nIHRvIHRoZSBuZXcgY29uZmlndXJhdGlvbgotICAgICAgICAgICAgICAgIGNsZWFyTWVudVZpZXdzKHN0KTsKKyAgICAgICAgICAgICAgICAgICAgLy8gUmVtb3ZlIHRoZSBtZW51IHZpZXdzIHNpbmNlIHRoZXkgbmVlZCB0byBiZSByZWNyZWF0ZWQKKyAgICAgICAgICAgICAgICAgICAgLy8gYWNjb3JkaW5nIHRvIHRoZSBuZXcgY29uZmlndXJhdGlvbgorICAgICAgICAgICAgICAgICAgICBjbGVhck1lbnVWaWV3cyhzdCk7CiAKLSAgICAgICAgICAgICAgICAvLyBSZS1vcGVuIHRoZSBzYW1lIG1lbnUKLSAgICAgICAgICAgICAgICByZW9wZW5NZW51KGZhbHNlKTsKKyAgICAgICAgICAgICAgICAgICAgLy8gUmUtb3BlbiB0aGUgc2FtZSBtZW51CisgICAgICAgICAgICAgICAgICAgIHJlb3Blbk1lbnUoZmFsc2UpOwogCi0gICAgICAgICAgICAgICAgLy8gUmVzdG9yZSBzdGF0ZQotICAgICAgICAgICAgICAgIG1lbnVCdWlsZGVyLnJlc3RvcmVIaWVyYXJjaHlTdGF0ZShzdGF0ZSk7CisgICAgICAgICAgICAgICAgICAgIC8vIFJlc3RvcmUgc3RhdGUKKyAgICAgICAgICAgICAgICAgICAgbWVudUJ1aWxkZXIucmVzdG9yZUhpZXJhcmNoeVN0YXRlKHN0YXRlKTsKIAotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAvLyBDbGVhciBtZW51IHZpZXdzIHNvIG9uIG5leHQgbWVudSBvcGVuaW5nLCBpdCB3aWxsIHVzZQotICAgICAgICAgICAgICAgIC8vIHRoZSBwcm9wZXIgbGF5b3V0Ci0gICAgICAgICAgICAgICAgY2xlYXJNZW51Vmlld3Moc3QpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIC8vIENsZWFyIG1lbnUgdmlld3Mgc28gb24gbmV4dCBtZW51IG9wZW5pbmcsIGl0IHdpbGwgdXNlCisgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBwcm9wZXIgbGF5b3V0CisgICAgICAgICAgICAgICAgICAgIGNsZWFyTWVudVZpZXdzKHN0KTsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KLQogICAgIH0KIAogICAgIHByaXZhdGUgc3RhdGljIHZvaWQgY2xlYXJNZW51Vmlld3MoUGFuZWxGZWF0dXJlU3RhdGUgc3QpIHsKLQogICAgICAgICAvLyBUaGlzIGNhbiBiZSBjYWxsZWQgb24gY29uZmlnIGNoYW5nZXMsIHNvIHdlIHNob3VsZCBtYWtlIHN1cmUKICAgICAgICAgLy8gdGhlIHZpZXdzIHdpbGwgYmUgcmVjb25zdHJ1Y3RlZCBiYXNlZCBvbiB0aGUgbmV3IG9yaWVudGF0aW9uLCBldGMuCiAKQEAgLTM5Myw3ICs0MTYsMTIgQEAKIAogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBmaW5hbCB2b2lkIG9wZW5QYW5lbChpbnQgZmVhdHVyZUlkLCBLZXlFdmVudCBldmVudCkgewotICAgICAgICBvcGVuUGFuZWwoZ2V0UGFuZWxTdGF0ZShmZWF0dXJlSWQsIHRydWUpLCBldmVudCk7CisgICAgICAgIGlmIChmZWF0dXJlSWQgPT0gRkVBVFVSRV9PUFRJT05TX1BBTkVMICYmIG1BY3Rpb25CYXIgIT0gbnVsbCAmJgorICAgICAgICAgICAgICAgIG1BY3Rpb25CYXIuaXNPdmVyZmxvd1Jlc2VydmVkKCkpIHsKKyAgICAgICAgICAgIG1BY3Rpb25CYXIuc2hvd092ZXJmbG93TWVudSgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgb3BlblBhbmVsKGdldFBhbmVsU3RhdGUoZmVhdHVyZUlkLCB0cnVlKSwgZXZlbnQpOworICAgICAgICB9CiAgICAgfQogCiAgICAgcHJpdmF0ZSB2b2lkIG9wZW5QYW5lbChQYW5lbEZlYXR1cmVTdGF0ZSBzdCwgS2V5RXZlbnQgZXZlbnQpIHsKQEAgLTQ4NCw3ICs1MTIsMTAgQEAKIAogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBmaW5hbCB2b2lkIGNsb3NlUGFuZWwoaW50IGZlYXR1cmVJZCkgewotICAgICAgICBpZiAoZmVhdHVyZUlkID09IEZFQVRVUkVfQ09OVEVYVF9NRU5VKSB7CisgICAgICAgIGlmIChmZWF0dXJlSWQgPT0gRkVBVFVSRV9PUFRJT05TX1BBTkVMICYmIG1BY3Rpb25CYXIgIT0gbnVsbCAmJgorICAgICAgICAgICAgICAgIG1BY3Rpb25CYXIuaXNPdmVyZmxvd1Jlc2VydmVkKCkpIHsKKyAgICAgICAgICAgIG1BY3Rpb25CYXIuaGlkZU92ZXJmbG93TWVudSgpOworICAgICAgICB9IGVsc2UgaWYgKGZlYXR1cmVJZCA9PSBGRUFUVVJFX0NPTlRFWFRfTUVOVSkgewogICAgICAgICAgICAgY2xvc2VDb250ZXh0TWVudSgpOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgY2xvc2VQYW5lbChnZXRQYW5lbFN0YXRlKGZlYXR1cmVJZCwgdHJ1ZSksIHRydWUpOwpAQCAtNTQ1LDYgKzU3NiwyNiBAQAogICAgICAgICB9CiAgICAgfQogCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgaW52YWxpZGF0ZVBhbmVsTWVudShpbnQgZmVhdHVyZUlkKSB7CisgICAgICAgIFBhbmVsRmVhdHVyZVN0YXRlIHN0ID0gZ2V0UGFuZWxTdGF0ZShmZWF0dXJlSWQsIHRydWUpOworICAgICAgICBpZiAoc3QubWVudSAhPSBudWxsKSB7CisgICAgICAgICAgICBzdC5tZW51LmNsZWFyKCk7CisgICAgICAgIH0KKyAgICAgICAgc3QucmVmcmVzaE1lbnVDb250ZW50ID0gdHJ1ZTsKKyAgICAgICAgc3QucmVmcmVzaERlY29yVmlldyA9IHRydWU7CisgICAgICAgIAorICAgICAgICAvLyBQcmVwYXJlIHRoZSBvcHRpb25zIHBhbmVsIGlmIHdlIGhhdmUgYW4gYWN0aW9uIGJhcgorICAgICAgICBpZiAoKGZlYXR1cmVJZCA9PSBGRUFUVVJFX0FDVElPTl9CQVIgfHwgZmVhdHVyZUlkID09IEZFQVRVUkVfT1BUSU9OU19QQU5FTCkKKyAgICAgICAgICAgICAgICAmJiBtQWN0aW9uQmFyICE9IG51bGwpIHsKKyAgICAgICAgICAgIHN0ID0gZ2V0UGFuZWxTdGF0ZShXaW5kb3cuRkVBVFVSRV9PUFRJT05TX1BBTkVMLCBmYWxzZSk7CisgICAgICAgICAgICBpZiAoc3QgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHN0LmlzUHJlcGFyZWQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICBwcmVwYXJlUGFuZWwoc3QsIG51bGwpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIAogICAgIC8qKgogICAgICAqIENhbGxlZCB3aGVuIHRoZSBwYW5lbCBrZXkgaXMgcHVzaGVkIGRvd24uCiAgICAgICogQHBhcmFtIGZlYXR1cmVJZCBUaGUgZmVhdHVyZSBJRCBvZiB0aGUgcmVsZXZhbnQgcGFuZWwgKGRlZmF1bHRzIHRvIEZFQVRVUkVfT1BUSU9OU19QQU5FTH0uCkBAIC01NTgsNyArNjA5LDcgQEAKICAgICAgICAgICAgIC8vIFRoZSBwYW5lbCBrZXkgd2FzIHB1c2hlZCwgc28gc2V0IHRoZSBjaG9yZGluZyBrZXkKICAgICAgICAgICAgIG1QYW5lbENob3JkaW5nS2V5ID0ga2V5Q29kZTsKICAgICAgICAgICAgIG1QYW5lbE1heUxvbmdQcmVzcyA9IGZhbHNlOwotICAgICAgICAgICAgCisKICAgICAgICAgICAgIFBhbmVsRmVhdHVyZVN0YXRlIHN0ID0gZ2V0UGFuZWxTdGF0ZShmZWF0dXJlSWQsIHRydWUpOwogICAgICAgICAgICAgaWYgKCFzdC5pc09wZW4pIHsKICAgICAgICAgICAgICAgICBpZiAoZ2V0Q29udGV4dCgpLmdldFJlc291cmNlcygpLmdldENvbmZpZ3VyYXRpb24oKS5rZXlib2FyZApAQCAtNTY3LDcgKzYxOCw2IEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIHJldHVybiBwcmVwYXJlUGFuZWwoc3QsIGV2ZW50KTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAogICAgICAgICB9IGVsc2UgaWYgKG1QYW5lbE1heUxvbmdQcmVzcyAmJiBtUGFuZWxDaG9yZGluZ0tleSA9PSBrZXlDb2RlCiAgICAgICAgICAgICAgICAgJiYgKGV2ZW50LmdldEZsYWdzKCkmS2V5RXZlbnQuRkxBR19MT05HX1BSRVNTKSAhPSAwKSB7CiAgICAgICAgICAgICAvLyBXZSBoYXZlIGhhZCBhIGxvbmcgcHJlc3Mgd2hpbGUgaW4gYSBzdGF0ZSB3aGVyZSB0aGlzCkBAIC02MDIsMjUgKzY1MiwzOCBAQAogICAgICAgICAgICAgfQogICAgICAgICAgICAgCiAgICAgICAgICAgICBib29sZWFuIHBsYXlTb3VuZEVmZmVjdCA9IGZhbHNlOwotICAgICAgICAgICAgUGFuZWxGZWF0dXJlU3RhdGUgc3QgPSBnZXRQYW5lbFN0YXRlKGZlYXR1cmVJZCwgdHJ1ZSk7Ci0gICAgICAgICAgICBpZiAoc3QuaXNPcGVuIHx8IHN0LmlzSGFuZGxlZCkgeworICAgICAgICAgICAgZmluYWwgUGFuZWxGZWF0dXJlU3RhdGUgc3QgPSBnZXRQYW5lbFN0YXRlKGZlYXR1cmVJZCwgdHJ1ZSk7CisgICAgICAgICAgICBpZiAoZmVhdHVyZUlkID09IEZFQVRVUkVfT1BUSU9OU19QQU5FTCAmJiBtQWN0aW9uQmFyICE9IG51bGwgJiYKKyAgICAgICAgICAgICAgICAgICAgbUFjdGlvbkJhci5pc092ZXJmbG93UmVzZXJ2ZWQoKSkgeworICAgICAgICAgICAgICAgIGlmICghbUFjdGlvbkJhci5pc092ZXJmbG93TWVudVNob3dpbmcoKSkgeworICAgICAgICAgICAgICAgICAgICBmaW5hbCBDYWxsYmFjayBjYiA9IGdldENhbGxiYWNrKCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChjYiAhPSBudWxsICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2Iub25QcmVwYXJlUGFuZWwoZmVhdHVyZUlkLCBzdC5jcmVhdGVkUGFuZWxWaWV3LCBzdC5tZW51KSkgeworICAgICAgICAgICAgICAgICAgICAgICAgcGxheVNvdW5kRWZmZWN0ID0gbUFjdGlvbkJhci5zaG93T3ZlcmZsb3dNZW51KCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBwbGF5U291bmRFZmZlY3QgPSBtQWN0aW9uQmFyLmhpZGVPdmVyZmxvd01lbnUoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGlmIChzdC5pc09wZW4gfHwgc3QuaXNIYW5kbGVkKSB7CiAKLSAgICAgICAgICAgICAgICAvLyBQbGF5IHRoZSBzb3VuZCBlZmZlY3QgaWYgdGhlIHVzZXIgY2xvc2VkIGFuIG9wZW4gbWVudSAoYW5kIG5vdCBpZgotICAgICAgICAgICAgICAgIC8vIHRoZXkganVzdCByZWxlYXNlZCBhIG1lbnUgc2hvcnRjdXQpCi0gICAgICAgICAgICAgICAgcGxheVNvdW5kRWZmZWN0ID0gc3QuaXNPcGVuOworICAgICAgICAgICAgICAgICAgICAvLyBQbGF5IHRoZSBzb3VuZCBlZmZlY3QgaWYgdGhlIHVzZXIgY2xvc2VkIGFuIG9wZW4gbWVudSAoYW5kIG5vdCBpZgorICAgICAgICAgICAgICAgICAgICAvLyB0aGV5IGp1c3QgcmVsZWFzZWQgYSBtZW51IHNob3J0Y3V0KQorICAgICAgICAgICAgICAgICAgICBwbGF5U291bmRFZmZlY3QgPSBzdC5pc09wZW47CiAKLSAgICAgICAgICAgICAgICAvLyBDbG9zZSBtZW51Ci0gICAgICAgICAgICAgICAgY2xvc2VQYW5lbChzdCwgdHJ1ZSk7CisgICAgICAgICAgICAgICAgICAgIC8vIENsb3NlIG1lbnUKKyAgICAgICAgICAgICAgICAgICAgY2xvc2VQYW5lbChzdCwgdHJ1ZSk7CiAKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoc3QuaXNQcmVwYXJlZCkgeworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc3QuaXNQcmVwYXJlZCkgewogCi0gICAgICAgICAgICAgICAgLy8gV3JpdGUgJ21lbnUgb3BlbmVkJyB0byBldmVudCBsb2cKLSAgICAgICAgICAgICAgICBFdmVudExvZy53cml0ZUV2ZW50KDUwMDAxLCAwKTsKKyAgICAgICAgICAgICAgICAgICAgLy8gV3JpdGUgJ21lbnUgb3BlbmVkJyB0byBldmVudCBsb2cKKyAgICAgICAgICAgICAgICAgICAgRXZlbnRMb2cud3JpdGVFdmVudCg1MDAwMSwgMCk7CiAKLSAgICAgICAgICAgICAgICAvLyBTaG93IG1lbnUKLSAgICAgICAgICAgICAgICBvcGVuUGFuZWwoc3QsIGV2ZW50KTsKKyAgICAgICAgICAgICAgICAgICAgLy8gU2hvdyBtZW51CisgICAgICAgICAgICAgICAgICAgIG9wZW5QYW5lbChzdCwgZXZlbnQpOwogCi0gICAgICAgICAgICAgICAgcGxheVNvdW5kRWZmZWN0ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgcGxheVNvdW5kRWZmZWN0ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIGlmIChwbGF5U291bmRFZmZlY3QpIHsKQEAgLTc3Nyw4ICs4NDAsMjAgQEAKICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICB9CiAKLSAgICAgICAgLy8gVGhlIHdpbmRvdyBtYW5hZ2VyIHdpbGwgZ2l2ZSB1cyBhIHZhbGlkIHdpbmRvdyB0b2tlbgotICAgICAgICBuZXcgTWVudURpYWxvZ0hlbHBlcihzdWJNZW51KS5zaG93KG51bGwpOworICAgICAgICBmaW5hbCBNZW51IHBhcmVudE1lbnUgPSBzdWJNZW51LmdldFJvb3RNZW51KCk7CisgICAgICAgIGZpbmFsIFBhbmVsRmVhdHVyZVN0YXRlIHBhbmVsID0gZmluZE1lbnVQYW5lbChwYXJlbnRNZW51KTsKKworICAgICAgICAvKgorICAgICAgICAgKiBVc2UgdGhlIHBhbmVsIG9wZW4gc3RhdGUgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgdGhpcyBpcyBjb21pbmcgZnJvbSBhbiBvcGVuIHBhbmVsCisgICAgICAgICAqIG9yIGFuIGFjdGlvbiBidXR0b24uIElmIGl0J3MgYW4gb3BlbiBwYW5lbCB3ZSB3YW50IHRvIHVzZSBNZW51RGlhbG9nSGVscGVyLgorICAgICAgICAgKiBJZiBpdCdzIGNsb3NlZCB3ZSB3YW50IHRvIGdyYWIgdGhlIHJlbGV2YW50IHZpZXcgYW5kIGNyZWF0ZSBhIHBvcHVwIGFuY2hvcmVkIHRvIGl0LgorICAgICAgICAgKi8KKyAgICAgICAgaWYgKHBhbmVsLmlzT3BlbikgeworICAgICAgICAgICAgLy8gVGhlIHdpbmRvdyBtYW5hZ2VyIHdpbGwgZ2l2ZSB1cyBhIHZhbGlkIHdpbmRvdyB0b2tlbgorICAgICAgICAgICAgbmV3IE1lbnVEaWFsb2dIZWxwZXIoc3ViTWVudSkuc2hvdyhudWxsKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG5ldyBNZW51UG9wdXBIZWxwZXIoZ2V0Q29udGV4dCgpLCBzdWJNZW51KS5zaG93KCk7CisgICAgICAgIH0KIAogICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CkBAIC03ODgsNiArODYzLDIxIEBACiAgICAgfQogCiAgICAgcHJpdmF0ZSB2b2lkIHJlb3Blbk1lbnUoYm9vbGVhbiB0b2dnbGVNZW51TW9kZSkgeworICAgICAgICBpZiAobUFjdGlvbkJhciAhPSBudWxsKSB7CisgICAgICAgICAgICBpZiAoIW1BY3Rpb25CYXIuaXNPdmVyZmxvd01lbnVTaG93aW5nKCkgfHwgIXRvZ2dsZU1lbnVNb2RlKSB7CisgICAgICAgICAgICAgICAgZmluYWwgQ2FsbGJhY2sgY2IgPSBnZXRDYWxsYmFjaygpOworICAgICAgICAgICAgICAgIGlmIChjYiAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGZpbmFsIFBhbmVsRmVhdHVyZVN0YXRlIHN0ID0gZ2V0UGFuZWxTdGF0ZShGRUFUVVJFX09QVElPTlNfUEFORUwsIHRydWUpOworICAgICAgICAgICAgICAgICAgICBpZiAoY2Iub25QcmVwYXJlUGFuZWwoRkVBVFVSRV9PUFRJT05TX1BBTkVMLCBzdC5jcmVhdGVkUGFuZWxWaWV3LCBzdC5tZW51KSkgeworICAgICAgICAgICAgICAgICAgICAgICAgbUFjdGlvbkJhci5zaG93T3ZlcmZsb3dNZW51KCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG1BY3Rpb25CYXIuaGlkZU92ZXJmbG93TWVudSgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKICAgICAgICAgUGFuZWxGZWF0dXJlU3RhdGUgc3QgPSBnZXRQYW5lbFN0YXRlKEZFQVRVUkVfT1BUSU9OU19QQU5FTCwgdHJ1ZSk7CiAKICAgICAgICAgLy8gU2F2ZSB0aGUgZnV0dXJlIGV4cGFuZGVkIG1vZGUgc3RhdGUgc2luY2UgY2xvc2VQYW5lbCB3aWxsIHJlc2V0IGl0CkBAIC0xNDM3LDYgKzE1MjcsNyBAQAogICAgIHN0YXRpYyBwcml2YXRlIGZpbmFsIFN0cmluZyBGT0NVU0VEX0lEX1RBRyA9ICJhbmRyb2lkOmZvY3VzZWRWaWV3SWQiOwogICAgIHN0YXRpYyBwcml2YXRlIGZpbmFsIFN0cmluZyBWSUVXU19UQUcgPSAiYW5kcm9pZDp2aWV3cyI7CiAgICAgc3RhdGljIHByaXZhdGUgZmluYWwgU3RyaW5nIFBBTkVMU19UQUcgPSAiYW5kcm9pZDpQYW5lbHMiOworICAgIHN0YXRpYyBwcml2YXRlIGZpbmFsIFN0cmluZyBBQ1RJT05fQkFSX1RBRyA9ICJhbmRyb2lkOkFjdGlvbkJhciI7CiAKICAgICAvKioge0Bpbmhlcml0RG9jfSAqLwogICAgIEBPdmVycmlkZQpAQCAtMTQ3MCw2ICsxNTYxLDEwIEBACiAgICAgICAgICAgICBvdXRTdGF0ZS5wdXRTcGFyc2VQYXJjZWxhYmxlQXJyYXkoUEFORUxTX1RBRywgcGFuZWxTdGF0ZXMpOwogICAgICAgICB9CiAKKyAgICAgICAgaWYgKG1BY3Rpb25CYXIgIT0gbnVsbCkgeworICAgICAgICAgICAgb3V0U3RhdGUucHV0Qm9vbGVhbihBQ1RJT05fQkFSX1RBRywgbUFjdGlvbkJhci5pc092ZXJmbG93TWVudVNob3dpbmcoKSk7CisgICAgICAgIH0KKwogICAgICAgICByZXR1cm4gb3V0U3RhdGU7CiAgICAgfQogCkBAIC0xNTA0LDYgKzE1OTksMTAgQEAKICAgICAgICAgaWYgKHBhbmVsU3RhdGVzICE9IG51bGwpIHsKICAgICAgICAgICAgIHJlc3RvcmVQYW5lbFN0YXRlKHBhbmVsU3RhdGVzKTsKICAgICAgICAgfQorCisgICAgICAgIGlmIChtQWN0aW9uQmFyICE9IG51bGwgJiYgc2F2ZWRJbnN0YW5jZVN0YXRlLmdldEJvb2xlYW4oQUNUSU9OX0JBUl9UQUcpKSB7CisgICAgICAgICAgICBtQWN0aW9uQmFyLnBvc3RTaG93T3ZlcmZsb3dNZW51KCk7CisgICAgICAgIH0KICAgICB9CiAKICAgICAvKioKQEAgLTE1OTQsNiArMTY5Myw5IEBACiAgICAgICAgIHByaXZhdGUgYm9vbGVhbiBtV2F0Y2hpbmdGb3JNZW51OwogICAgICAgICBwcml2YXRlIGludCBtRG93blk7CiAKKyAgICAgICAgcHJpdmF0ZSBBY3Rpb25Nb2RlIG1BY3Rpb25Nb2RlOworICAgICAgICBwcml2YXRlIEFjdGlvbkJhckNvbnRleHRWaWV3IG1BY3Rpb25Nb2RlVmlldzsKKwogICAgICAgICBwdWJsaWMgRGVjb3JWaWV3KENvbnRleHQgY29udGV4dCwgaW50IGZlYXR1cmVJZCkgewogICAgICAgICAgICAgc3VwZXIoY29udGV4dCk7CiAgICAgICAgICAgICBtRmVhdHVyZUlkID0gZmVhdHVyZUlkOwpAQCAtMTYwMiw3ICsxNzA0LDggQEAKICAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgIHB1YmxpYyBib29sZWFuIGRpc3BhdGNoS2V5RXZlbnQoS2V5RXZlbnQgZXZlbnQpIHsKICAgICAgICAgICAgIGZpbmFsIGludCBrZXlDb2RlID0gZXZlbnQuZ2V0S2V5Q29kZSgpOwotICAgICAgICAgICAgZmluYWwgYm9vbGVhbiBpc0Rvd24gPSBldmVudC5nZXRBY3Rpb24oKSA9PSBLZXlFdmVudC5BQ1RJT05fRE9XTjsKKyAgICAgICAgICAgIGZpbmFsIGludCBhY3Rpb24gPSBldmVudC5nZXRBY3Rpb24oKTsKKyAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gaXNEb3duID0gYWN0aW9uID09IEtleUV2ZW50LkFDVElPTl9ET1dOOwogCiAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICogSWYgdGhlIHVzZXIgaGl0cyBhbm90aGVyIGtleSB3aXRoaW4gdGhlIHBsYXkgc291bmQgZGVsYXksIHRoZW4KQEAgLTE2NTksNiArMTc2MiwxNCBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KIAorICAgICAgICAgICAgLy8gQmFjayBjYW5jZWxzIGFjdGlvbiBtb2RlcyBmaXJzdC4KKyAgICAgICAgICAgIGlmIChtQWN0aW9uTW9kZSAhPSBudWxsICYmIGtleUNvZGUgPT0gS2V5RXZlbnQuS0VZQ09ERV9CQUNLKSB7CisgICAgICAgICAgICAgICAgaWYgKGFjdGlvbiA9PSBLZXlFdmVudC5BQ1RJT05fVVApIHsKKyAgICAgICAgICAgICAgICAgICAgbUFjdGlvbk1vZGUuZmluaXNoKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorCiAgICAgICAgICAgICBmaW5hbCBDYWxsYmFjayBjYiA9IGdldENhbGxiYWNrKCk7CiAgICAgICAgICAgICBmaW5hbCBib29sZWFuIGhhbmRsZWQgPSBjYiAhPSBudWxsICYmIG1GZWF0dXJlSWQgPCAwID8gY2IuZGlzcGF0Y2hLZXlFdmVudChldmVudCkKICAgICAgICAgICAgICAgICAgICAgOiBzdXBlci5kaXNwYXRjaEtleUV2ZW50KGV2ZW50KTsKQEAgLTE4ODEsNiArMTk5Miw1NSBAQAogICAgICAgICAgICAgcmV0dXJuIG1Db250ZXh0TWVudUhlbHBlciAhPSBudWxsOwogICAgICAgICB9CiAKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBBY3Rpb25Nb2RlIHN0YXJ0QWN0aW9uTW9kZUZvckNoaWxkKFZpZXcgb3JpZ2luYWxWaWV3LAorICAgICAgICAgICAgICAgIEFjdGlvbk1vZGUuQ2FsbGJhY2sgY2FsbGJhY2spIHsKKyAgICAgICAgICAgIC8vIG9yaWdpbmFsVmlldyBjYW4gYmUgdXNlZCBoZXJlIHRvIGJlIHN1cmUgdGhhdCB3ZSBkb24ndCBvYnNjdXJlCisgICAgICAgICAgICAvLyByZWxldmFudCBjb250ZW50IHdpdGggdGhlIGNvbnRleHQgbW9kZSBVSS4KKyAgICAgICAgICAgIHJldHVybiBzdGFydEFjdGlvbk1vZGUoY2FsbGJhY2spOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBBY3Rpb25Nb2RlIHN0YXJ0QWN0aW9uTW9kZShBY3Rpb25Nb2RlLkNhbGxiYWNrIGNhbGxiYWNrKSB7CisgICAgICAgICAgICBpZiAobUFjdGlvbk1vZGUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG1BY3Rpb25Nb2RlLmZpbmlzaCgpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmaW5hbCBBY3Rpb25Nb2RlLkNhbGxiYWNrIHdyYXBwZWRDYWxsYmFjayA9IG5ldyBBY3Rpb25Nb2RlQ2FsbGJhY2tXcmFwcGVyKGNhbGxiYWNrKTsKKyAgICAgICAgICAgIEFjdGlvbk1vZGUgbW9kZSA9IGdldENhbGxiYWNrKCkub25TdGFydEFjdGlvbk1vZGUod3JhcHBlZENhbGxiYWNrKTsKKyAgICAgICAgICAgIGlmIChtb2RlICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBtQWN0aW9uTW9kZSA9IG1vZGU7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGlmIChtQWN0aW9uTW9kZVZpZXcgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBpZiAoaGFzRmVhdHVyZShGRUFUVVJFX0FDVElPTl9NT0RFX09WRVJMQVkpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtQWN0aW9uTW9kZVZpZXcgPSBuZXcgQWN0aW9uQmFyQ29udGV4dFZpZXcobUNvbnRleHQpOworICAgICAgICAgICAgICAgICAgICAgICAgRnJhbWVMYXlvdXQuTGF5b3V0UGFyYW1zIHBhcmFtcyA9IG5ldyBGcmFtZUxheW91dC5MYXlvdXRQYXJhbXMoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1BVENIX1BBUkVOVCwgV1JBUF9DT05URU5UKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFkZFZpZXcobUFjdGlvbk1vZGVWaWV3LCBwYXJhbXMpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgVmlld1N0dWIgc3R1YiA9IChWaWV3U3R1YikgZmluZFZpZXdCeUlkKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmlkLmFjdGlvbl9tb2RlX2Jhcl9zdHViKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdHViICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQWN0aW9uTW9kZVZpZXcgPSAoQWN0aW9uQmFyQ29udGV4dFZpZXcpIHN0dWIuaW5mbGF0ZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKG1BY3Rpb25Nb2RlVmlldyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIG1vZGUgPSBuZXcgU3RhbmRhbG9uZUFjdGlvbk1vZGUoZ2V0Q29udGV4dCgpLCBtQWN0aW9uTW9kZVZpZXcsIHdyYXBwZWRDYWxsYmFjayk7CisgICAgICAgICAgICAgICAgICAgIGlmIChjYWxsYmFjay5vbkNyZWF0ZUFjdGlvbk1vZGUobW9kZSwgbW9kZS5nZXRNZW51KCkpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtb2RlLmludmFsaWRhdGUoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1BY3Rpb25Nb2RlVmlldy5pbml0Rm9yTW9kZShtb2RlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1BY3Rpb25Nb2RlVmlldy5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7CisgICAgICAgICAgICAgICAgICAgICAgICBtQWN0aW9uTW9kZSA9IG1vZGU7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtQWN0aW9uTW9kZSA9IG51bGw7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gbUFjdGlvbk1vZGU7CisgICAgICAgIH0KKwogICAgICAgICBwdWJsaWMgdm9pZCBzdGFydENoYW5naW5nKCkgewogICAgICAgICAgICAgbUNoYW5naW5nID0gdHJ1ZTsKICAgICAgICAgfQpAQCAtMjA2MCw2ICsyMjIwLDM3IEBACiAgICAgICAgICAgICBpZiAoa2VlcE9uKSBQaG9uZVdpbmRvdy50aGlzLmFkZEZsYWdzKFdpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zLkZMQUdfS0VFUF9TQ1JFRU5fT04pOwogICAgICAgICAgICAgZWxzZSBQaG9uZVdpbmRvdy50aGlzLmNsZWFyRmxhZ3MoV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMuRkxBR19LRUVQX1NDUkVFTl9PTik7CiAgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogQ2xlYXJzIG91dCBpbnRlcm5hbCByZWZlcmVuY2Ugd2hlbiB0aGUgYWN0aW9uIG1vZGUgaXMgZGVzdHJveWVkLgorICAgICAgICAgKi8KKyAgICAgICAgcHJpdmF0ZSBjbGFzcyBBY3Rpb25Nb2RlQ2FsbGJhY2tXcmFwcGVyIGltcGxlbWVudHMgQWN0aW9uTW9kZS5DYWxsYmFjayB7CisgICAgICAgICAgICBwcml2YXRlIEFjdGlvbk1vZGUuQ2FsbGJhY2sgbVdyYXBwZWQ7CisKKyAgICAgICAgICAgIHB1YmxpYyBBY3Rpb25Nb2RlQ2FsbGJhY2tXcmFwcGVyKEFjdGlvbk1vZGUuQ2FsbGJhY2sgd3JhcHBlZCkgeworICAgICAgICAgICAgICAgIG1XcmFwcGVkID0gd3JhcHBlZDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gb25DcmVhdGVBY3Rpb25Nb2RlKEFjdGlvbk1vZGUgbW9kZSwgTWVudSBtZW51KSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG1XcmFwcGVkLm9uQ3JlYXRlQWN0aW9uTW9kZShtb2RlLCBtZW51KTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gb25QcmVwYXJlQWN0aW9uTW9kZShBY3Rpb25Nb2RlIG1vZGUsIE1lbnUgbWVudSkgeworICAgICAgICAgICAgICAgIHJldHVybiBtV3JhcHBlZC5vblByZXBhcmVBY3Rpb25Nb2RlKG1vZGUsIG1lbnUpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBvbkFjdGlvbkl0ZW1DbGlja2VkKEFjdGlvbk1vZGUgbW9kZSwgTWVudUl0ZW0gaXRlbSkgeworICAgICAgICAgICAgICAgIHJldHVybiBtV3JhcHBlZC5vbkFjdGlvbkl0ZW1DbGlja2VkKG1vZGUsIGl0ZW0pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkRlc3Ryb3lBY3Rpb25Nb2RlKEFjdGlvbk1vZGUgbW9kZSkgeworICAgICAgICAgICAgICAgIG1XcmFwcGVkLm9uRGVzdHJveUFjdGlvbk1vZGUobW9kZSk7CisgICAgICAgICAgICAgICAgaWYgKG1BY3Rpb25Nb2RlVmlldyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIG1BY3Rpb25Nb2RlVmlldy5yZW1vdmVBbGxWaWV3cygpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBtQWN0aW9uTW9kZSA9IG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KICAgICB9CiAKICAgICBwcm90ZWN0ZWQgRGVjb3JWaWV3IGdlbmVyYXRlRGVjb3IoKSB7CkBAIC0yMTA4LDYgKzIyOTksMTcgQEAKIAogICAgICAgICBpZiAoYS5nZXRCb29sZWFuKGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLldpbmRvd193aW5kb3dOb1RpdGxlLCBmYWxzZSkpIHsKICAgICAgICAgICAgIHJlcXVlc3RGZWF0dXJlKEZFQVRVUkVfTk9fVElUTEUpOworICAgICAgICB9IGVsc2UgaWYgKGEuZ2V0Qm9vbGVhbihjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZS5XaW5kb3dfd2luZG93QWN0aW9uQmFyLCBmYWxzZSkpIHsKKyAgICAgICAgICAgIC8vIERvbid0IGFsbG93IGFuIGFjdGlvbiBiYXIgaWYgdGhlcmUgaXMgbm8gdGl0bGUuCisgICAgICAgICAgICByZXF1ZXN0RmVhdHVyZShGRUFUVVJFX0FDVElPTl9CQVIpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGEuZ2V0Qm9vbGVhbihjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZS5XaW5kb3dfd2luZG93QWN0aW9uQmFyT3ZlcmxheSwgZmFsc2UpKSB7CisgICAgICAgICAgICByZXF1ZXN0RmVhdHVyZShGRUFUVVJFX0FDVElPTl9CQVJfT1ZFUkxBWSk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoYS5nZXRCb29sZWFuKGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLldpbmRvd193aW5kb3dBY3Rpb25Nb2RlT3ZlcmxheSwgZmFsc2UpKSB7CisgICAgICAgICAgICByZXF1ZXN0RmVhdHVyZShGRUFUVVJFX0FDVElPTl9NT0RFX09WRVJMQVkpOwogICAgICAgICB9CiAKICAgICAgICAgaWYgKGEuZ2V0Qm9vbGVhbihjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZS5XaW5kb3dfd2luZG93RnVsbHNjcmVlbiwgZmFsc2UpKSB7CkBAIC0yMTcyLDExICsyMzc0LDE1IEBACiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIGxheW91dFJlc291cmNlID0gY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5sYXlvdXQuc2NyZWVuX3RpdGxlX2ljb25zOwogICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gWFhYIFJlbW92ZSB0aGlzIG9uY2UgYWN0aW9uIGJhciBzdXBwb3J0cyB0aGVzZSBmZWF0dXJlcy4KKyAgICAgICAgICAgIHJlbW92ZUZlYXR1cmUoRkVBVFVSRV9BQ1RJT05fQkFSKTsKICAgICAgICAgICAgIC8vIFN5c3RlbS5vdXQucHJpbnRsbigiVGl0bGUgSWNvbnMhIik7CiAgICAgICAgIH0gZWxzZSBpZiAoKGZlYXR1cmVzICYgKCgxIDw8IEZFQVRVUkVfUFJPR1JFU1MpIHwgKDEgPDwgRkVBVFVSRV9JTkRFVEVSTUlOQVRFX1BST0dSRVNTKSkpICE9IDApIHsKICAgICAgICAgICAgIC8vIFNwZWNpYWwgY2FzZSBmb3IgYSB3aW5kb3cgd2l0aCBvbmx5IGEgcHJvZ3Jlc3MgYmFyIChhbmQgdGl0bGUpLgogICAgICAgICAgICAgLy8gWFhYIE5lZWQgdG8gaGF2ZSBhIG5vLXRpdGxlIHZlcnNpb24gb2YgZW1iZWRkZWQgd2luZG93cy4KICAgICAgICAgICAgIGxheW91dFJlc291cmNlID0gY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5sYXlvdXQuc2NyZWVuX3Byb2dyZXNzOworICAgICAgICAgICAgLy8gWFhYIFJlbW92ZSB0aGlzIG9uY2UgYWN0aW9uIGJhciBzdXBwb3J0cyB0aGVzZSBmZWF0dXJlcy4KKyAgICAgICAgICAgIHJlbW92ZUZlYXR1cmUoRkVBVFVSRV9BQ1RJT05fQkFSKTsKICAgICAgICAgICAgIC8vIFN5c3RlbS5vdXQucHJpbnRsbigiUHJvZ3Jlc3MhIik7CiAgICAgICAgIH0gZWxzZSBpZiAoKGZlYXR1cmVzICYgKDEgPDwgRkVBVFVSRV9DVVNUT01fVElUTEUpKSAhPSAwKSB7CiAgICAgICAgICAgICAvLyBTcGVjaWFsIGNhc2UgZm9yIGEgd2luZG93IHdpdGggYSBjdXN0b20gdGl0bGUuCkBAIC0yMTg2LDExICsyMzkyLDE5IEBACiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIGxheW91dFJlc291cmNlID0gY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5sYXlvdXQuc2NyZWVuX2N1c3RvbV90aXRsZTsKICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIFhYWCBSZW1vdmUgdGhpcyBvbmNlIGFjdGlvbiBiYXIgc3VwcG9ydHMgdGhlc2UgZmVhdHVyZXMuCisgICAgICAgICAgICByZW1vdmVGZWF0dXJlKEZFQVRVUkVfQUNUSU9OX0JBUik7CiAgICAgICAgIH0gZWxzZSBpZiAoKGZlYXR1cmVzICYgKDEgPDwgRkVBVFVSRV9OT19USVRMRSkpID09IDApIHsKICAgICAgICAgICAgIC8vIElmIG5vIG90aGVyIGZlYXR1cmVzIGFuZCBub3QgZW1iZWRkZWQsIG9ubHkgbmVlZCBhIHRpdGxlLgogICAgICAgICAgICAgLy8gSWYgdGhlIHdpbmRvdyBpcyBmbG9hdGluZywgd2UgbmVlZCBhIGRpYWxvZyBsYXlvdXQKICAgICAgICAgICAgIGlmIChtSXNGbG9hdGluZykgewogICAgICAgICAgICAgICAgIGxheW91dFJlc291cmNlID0gY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5sYXlvdXQuZGlhbG9nX3RpdGxlOworICAgICAgICAgICAgfSBlbHNlIGlmICgoZmVhdHVyZXMgJiAoMSA8PCBGRUFUVVJFX0FDVElPTl9CQVIpKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgaWYgKChmZWF0dXJlcyAmICgxIDw8IEZFQVRVUkVfQUNUSU9OX0JBUl9PVkVSTEFZKSkgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICBsYXlvdXRSZXNvdXJjZSA9IGNvbS5hbmRyb2lkLmludGVybmFsLlIubGF5b3V0LnNjcmVlbl9hY3Rpb25fYmFyX292ZXJsYXk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgbGF5b3V0UmVzb3VyY2UgPSBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmxheW91dC5zY3JlZW5fYWN0aW9uX2JhcjsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIGxheW91dFJlc291cmNlID0gY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5sYXlvdXQuc2NyZWVuX3RpdGxlOwogICAgICAgICAgICAgfQpAQCAtMjI3NSw2ICsyNDg5LDIyIEBACiAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgbVRpdGxlVmlldy5zZXRUZXh0KG1UaXRsZSk7CiAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBtQWN0aW9uQmFyID0gKEFjdGlvbkJhclZpZXcpIGZpbmRWaWV3QnlJZChjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmlkLmFjdGlvbl9iYXIpOworICAgICAgICAgICAgICAgIGlmIChtQWN0aW9uQmFyICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1BY3Rpb25CYXIuZ2V0VGl0bGUoKSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtQWN0aW9uQmFyLnNldFdpbmRvd1RpdGxlKG1UaXRsZSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgLy8gUG9zdCB0aGUgcGFuZWwgaW52YWxpZGF0ZSBmb3IgbGF0ZXI7IGF2b2lkIGFwcGxpY2F0aW9uIG9uQ3JlYXRlT3B0aW9uc01lbnUKKyAgICAgICAgICAgICAgICAgICAgLy8gYmVpbmcgY2FsbGVkIGluIHRoZSBtaWRkbGUgb2Ygb25DcmVhdGUgb3Igc2ltaWxhci4KKyAgICAgICAgICAgICAgICAgICAgbURlY29yLnBvc3QobmV3IFJ1bm5hYmxlKCkgeworICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaXNEZXN0cm95ZWQoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnZhbGlkYXRlUGFuZWxNZW51KEZFQVRVUkVfQUNUSU9OX0JBUik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CkBAIC0yNjI4LDYgKzI4NTgsOCBAQAogCiAgICAgICAgIGJvb2xlYW4gcmVmcmVzaERlY29yVmlldzsKIAorICAgICAgICBib29sZWFuIHJlZnJlc2hNZW51Q29udGVudDsKKyAgICAgICAgCiAgICAgICAgIGJvb2xlYW4gd2FzTGFzdE9wZW47CiAgICAgICAgIAogICAgICAgICBib29sZWFuIHdhc0xhc3RFeHBhbmRlZDsKQEAgLTI3NTAsMTEgKzI5ODIsMTEgQEAKICAgICAgKiA8bGk+IENhbGxzIGJhY2sgdG8gdGhlIGNhbGxiYWNrJ3Mgb25NZW51SXRlbVNlbGVjdGVkIHdoZW4gYW4gaXRlbSBpcwogICAgICAqIHNlbGVjdGVkLgogICAgICAqLwotICAgIHByaXZhdGUgZmluYWwgY2xhc3MgQ29udGV4dE1lbnVDYWxsYmFjayBpbXBsZW1lbnRzIE1lbnVCdWlsZGVyLkNhbGxiYWNrIHsKKyAgICBwcml2YXRlIGZpbmFsIGNsYXNzIERpYWxvZ01lbnVDYWxsYmFjayBpbXBsZW1lbnRzIE1lbnVCdWlsZGVyLkNhbGxiYWNrIHsKICAgICAgICAgcHJpdmF0ZSBpbnQgbUZlYXR1cmVJZDsKICAgICAgICAgcHJpdmF0ZSBNZW51RGlhbG9nSGVscGVyIG1TdWJNZW51SGVscGVyOwogCi0gICAgICAgIHB1YmxpYyBDb250ZXh0TWVudUNhbGxiYWNrKGludCBmZWF0dXJlSWQpIHsKKyAgICAgICAgcHVibGljIERpYWxvZ01lbnVDYWxsYmFjayhpbnQgZmVhdHVyZUlkKSB7CiAgICAgICAgICAgICBtRmVhdHVyZUlkID0gZmVhdHVyZUlkOwogICAgICAgICB9CiAKZGlmZiAtLWdpdCBhL3BvbGljeS9zcmMvY29tL2FuZHJvaWQvaW50ZXJuYWwvcG9saWN5L2ltcGwvUGhvbmVXaW5kb3dNYW5hZ2VyLmphdmEgYi9wb2xpY3kvc3JjL2NvbS9hbmRyb2lkL2ludGVybmFsL3BvbGljeS9pbXBsL1Bob25lV2luZG93TWFuYWdlci5qYXZhCmluZGV4IDI3NDEyNGIuLjcwMDljNjUgMTAwNzU1Ci0tLSBhL3BvbGljeS9zcmMvY29tL2FuZHJvaWQvaW50ZXJuYWwvcG9saWN5L2ltcGwvUGhvbmVXaW5kb3dNYW5hZ2VyLmphdmEKKysrIGIvcG9saWN5L3NyYy9jb20vYW5kcm9pZC9pbnRlcm5hbC9wb2xpY3kvaW1wbC9QaG9uZVdpbmRvd01hbmFnZXIuamF2YQpAQCAtNDYsNiArNDYsNyBAQAogaW1wb3J0IGFuZHJvaWQub3MuVmlicmF0b3I7CiBpbXBvcnQgYW5kcm9pZC5wcm92aWRlci5TZXR0aW5nczsKIAoraW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLlI7CiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwucG9saWN5LlBvbGljeU1hbmFnZXI7CiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwuc3RhdHVzYmFyLklTdGF0dXNCYXJTZXJ2aWNlOwogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5JVGVsZXBob255OwpAQCAtMTc2LDYgKzE3Nyw3IEBACiAgICAgQ29udGV4dCBtQ29udGV4dDsKICAgICBJV2luZG93TWFuYWdlciBtV2luZG93TWFuYWdlcjsKICAgICBMb2NhbFBvd2VyTWFuYWdlciBtUG93ZXJNYW5hZ2VyOworICAgIElTdGF0dXNCYXJTZXJ2aWNlIG1TdGF0dXNCYXJTZXJ2aWNlOwogICAgIFZpYnJhdG9yIG1WaWJyYXRvcjsgLy8gVmlicmF0b3IgZm9yIGdpdmluZyBmZWVkYmFjayBvZiBvcmllbnRhdGlvbiBjaGFuZ2VzCiAKICAgICAvLyBWaWJyYXRvciBwYXR0ZXJuIGZvciBoYXB0aWMgZmVlZGJhY2sgb2YgYSBsb25nIHByZXNzLgpAQCAtMTk4LDYgKzIwMCw3IEBACiAgICAgCiAgICAgYm9vbGVhbiBtU2FmZU1vZGU7CiAgICAgV2luZG93U3RhdGUgbVN0YXR1c0JhciA9IG51bGw7CisgICAgYm9vbGVhbiBtU3RhdHVzQmFyQ2FuSGlkZTsKICAgICBmaW5hbCBBcnJheUxpc3Q8V2luZG93U3RhdGU+IG1TdGF0dXNCYXJQYW5lbHMgPSBuZXcgQXJyYXlMaXN0PFdpbmRvd1N0YXRlPigpOwogICAgIFdpbmRvd1N0YXRlIG1LZXlndWFyZCA9IG51bGw7CiAgICAgS2V5Z3VhcmRWaWV3TWVkaWF0b3IgbUtleWd1YXJkTWVkaWF0b3I7CkBAIC0yNjEsNiArMjY0LDcgQEAKICAgICBzdGF0aWMgZmluYWwgUmVjdCBtVG1wVmlzaWJsZUZyYW1lID0gbmV3IFJlY3QoKTsKICAgICAKICAgICBXaW5kb3dTdGF0ZSBtVG9wRnVsbHNjcmVlbk9wYXF1ZVdpbmRvd1N0YXRlOworICAgIGJvb2xlYW4gbVRvcElzRnVsbHNjcmVlbjsKICAgICBib29sZWFuIG1Gb3JjZVN0YXR1c0JhcjsKICAgICBib29sZWFuIG1IaWRlTG9ja1NjcmVlbjsKICAgICBib29sZWFuIG1EaXNtaXNzS2V5Z3VhcmQ7CkBAIC0yODgsNiArMjkyLDkgQEAKIAogICAgIC8vIE5vdGhpbmcgdG8gc2VlIGhlcmUsIG1vdmUgYWxvbmcuLi4KICAgICBpbnQgbUZhbmN5Um90YXRpb25BbmltYXRpb247CisgICAgCisgICAgLy8gRW5hYmxlIDNEIHJlY2VudHMgYmFzZWQgb24gY29uZmlnIHNldHRpbmdzLgorICAgIHByaXZhdGUgQm9vbGVhbiBtVXNlM2RSZWNlbnRzOwogCiAgICAgU2hvcnRjdXRNYW5hZ2VyIG1TaG9ydGN1dE1hbmFnZXI7CiAgICAgUG93ZXJNYW5hZ2VyLldha2VMb2NrIG1Ccm9hZGNhc3RXYWtlTG9jazsKQEAgLTQ5MCw2ICs0OTcsMjcgQEAKICAgICAgKiBDcmVhdGUgKGlmIG5lY2Vzc2FyeSkgYW5kIGxhdW5jaCB0aGUgcmVjZW50IGFwcHMgZGlhbG9nCiAgICAgICovCiAgICAgdm9pZCBzaG93UmVjZW50QXBwc0RpYWxvZygpIHsKKyAgICAgICAgLy8gV2UgY2FuJ3QgaW5pdGlhbGl6ZSB0aGlzIGluIGluaXQoKSBzaW5jZSB0aGUgY29uZmlndXJhdGlvbiBoYXNuJ3QgYmVlbiBsb2FkZWQgeWV0LgorICAgICAgICBpZiAobVVzZTNkUmVjZW50cyA9PSBudWxsKSB7CisgICAgICAgICAgICBtVXNlM2RSZWNlbnRzID0gbUNvbnRleHQuZ2V0UmVzb3VyY2VzKCkuZ2V0Qm9vbGVhbihSLmJvb2wuY29uZmlnX2VuYWJsZVJlY2VudEFwcHMzRCk7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIC8vIFVzZSAzZCBSZWNlbnRzIGRpYWxvZworICAgICAgICBpZiAobVVzZTNkUmVjZW50cykgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBJbnRlbnQgaW50ZW50ID0gbmV3IEludGVudCgpOworICAgICAgICAgICAgICAgIGludGVudC5zZXRDbGFzc05hbWUoImNvbS5hbmRyb2lkLnN5c3RlbXVpIiwgCisgICAgICAgICAgICAgICAgICAgICAgICAiY29tLmFuZHJvaWQuc3lzdGVtdWkuc3RhdHVzYmFyLlJlY2VudEFwcGxpY2F0aW9uc0FjdGl2aXR5Iik7CisgICAgICAgICAgICAgICAgaW50ZW50LnNldEZsYWdzKEludGVudC5GTEFHX0FDVElWSVRZX05FV19UQVNLIAorICAgICAgICAgICAgICAgICAgICAgICAgfCBJbnRlbnQuRkxBR19BQ1RJVklUWV9FWENMVURFX0ZST01fUkVDRU5UUyk7CisgICAgICAgICAgICAgICAgbUNvbnRleHQuc3RhcnRBY3Rpdml0eShpbnRlbnQpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0gY2F0Y2ggKEFjdGl2aXR5Tm90Rm91bmRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIExvZy5lKFRBRywgIkZhaWxlZCB0byBsYXVuY2ggUmVjZW50QXBwc0ludGVudCIsIGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gRmFsbGJhY2sgdG8gZGlhbG9nIGlmIHdlIGZhaWwgdG8gbGF1bmNoIHRoZSBhYm92ZS4KICAgICAgICAgaWYgKG1SZWNlbnRBcHBzRGlhbG9nID09IG51bGwpIHsKICAgICAgICAgICAgIG1SZWNlbnRBcHBzRGlhbG9nID0gbmV3IFJlY2VudEFwcGxpY2F0aW9uc0RpYWxvZyhtQ29udGV4dCk7CiAgICAgICAgIH0KQEAgLTUyMSw2ICs1NDksNyBAQAogICAgICAgICBtRGVza0RvY2tJbnRlbnQuYWRkQ2F0ZWdvcnkoSW50ZW50LkNBVEVHT1JZX0RFU0tfRE9DSyk7CiAgICAgICAgIG1EZXNrRG9ja0ludGVudC5hZGRGbGFncyhJbnRlbnQuRkxBR19BQ1RJVklUWV9ORVdfVEFTSwogICAgICAgICAgICAgICAgIHwgSW50ZW50LkZMQUdfQUNUSVZJVFlfUkVTRVRfVEFTS19JRl9ORUVERUQpOworCiAgICAgICAgIFBvd2VyTWFuYWdlciBwbSA9IChQb3dlck1hbmFnZXIpY29udGV4dC5nZXRTeXN0ZW1TZXJ2aWNlKENvbnRleHQuUE9XRVJfU0VSVklDRSk7CiAgICAgICAgIG1Ccm9hZGNhc3RXYWtlTG9jayA9IHBtLm5ld1dha2VMb2NrKFBvd2VyTWFuYWdlci5QQVJUSUFMX1dBS0VfTE9DSywKICAgICAgICAgICAgICAgICAiUGhvbmVXaW5kb3dNYW5hZ2VyLm1Ccm9hZGNhc3RXYWtlTG9jayIpOwpAQCAtNTYzLDYgKzU5Miw5IEBACiAgICAgICAgICAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5hcnJheS5jb25maWdfc2FmZU1vZGVEaXNhYmxlZFZpYmVQYXR0ZXJuKTsKICAgICAgICAgbVNhZmVNb2RlRW5hYmxlZFZpYmVQYXR0ZXJuID0gZ2V0TG9uZ0ludEFycmF5KG1Db250ZXh0LmdldFJlc291cmNlcygpLAogICAgICAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuYXJyYXkuY29uZmlnX3NhZmVNb2RlRW5hYmxlZFZpYmVQYXR0ZXJuKTsKKworICAgICAgICAvLyBOb3RlOiB0aGUgQ29uZmlndXJhdGlvbiBpcyBub3Qgc3RhYmxlIGhlcmUsIHNvIHdlIGNhbm5vdCBsb2FkIG1TdGF0dXNCYXJDYW5IaWRlIGZyb20KKyAgICAgICAgLy8gY29uZmlnX3N0YXR1c0JhckNhbkhpZGUgYmVjYXVzZSB0aGUgbGF0dGVyIGRlcGVuZHMgb24gdGhlIHNjcmVlbiBzaXplCiAgICAgfQogCiAgICAgcHVibGljIHZvaWQgdXBkYXRlU2V0dGluZ3MoKSB7CkBAIC05NzUsNiArMTAwNywxMSBAQAogICAgICAgICAgICAgICAgICAgICByZXR1cm4gV2luZG93TWFuYWdlckltcGwuQUREX01VTFRJUExFX1NJTkdMRVRPTjsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgbVN0YXR1c0JhciA9IHdpbjsKKworICAgICAgICAgICAgICAgIC8vIFRoZSBDb25maWd1cmF0aW9uIHdpbGwgYmUgc3RhYmxlIGJ5IG5vdywgc28gd2UgY2FuIGxvYWQgdGhpcworICAgICAgICAgICAgICAgIG1TdGF0dXNCYXJDYW5IaWRlID0gbUNvbnRleHQuZ2V0UmVzb3VyY2VzKCkuZ2V0Qm9vbGVhbigKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuYm9vbC5jb25maWdfc3RhdHVzQmFyQ2FuSGlkZSk7CisKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIGNhc2UgVFlQRV9TVEFUVVNfQkFSX1BBTkVMOgogICAgICAgICAgICAgICAgIG1Db250ZXh0LmVuZm9yY2VDYWxsaW5nT3JTZWxmUGVybWlzc2lvbigKQEAgLTEyMzMsNyArMTI3MCw3IEBACiAgICAgcHVibGljIHZvaWQgZ2V0Q29udGVudEluc2V0SGludEx3KFdpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zIGF0dHJzLCBSZWN0IGNvbnRlbnRJbnNldCkgewogICAgICAgICBmaW5hbCBpbnQgZmwgPSBhdHRycy5mbGFnczsKICAgICAgICAgCi0gICAgICAgIGlmICgoZmwgJgorICAgICAgICBpZiAobVN0YXR1c0JhckNhbkhpZGUgJiYgKGZsICYKICAgICAgICAgICAgICAgICAoRkxBR19MQVlPVVRfSU5fU0NSRUVOIHwgRkxBR19GVUxMU0NSRUVOIHwgRkxBR19MQVlPVVRfSU5TRVRfREVDT1IpKQogICAgICAgICAgICAgICAgID09IChGTEFHX0xBWU9VVF9JTl9TQ1JFRU4gfCBGTEFHX0xBWU9VVF9JTlNFVF9ERUNPUikpIHsKICAgICAgICAgICAgIGNvbnRlbnRJbnNldC5zZXQobUN1ckxlZnQsIG1DdXJUb3AsIG1XIC0gbUN1clJpZ2h0LCBtSCAtIG1DdXJCb3R0b20pOwpAQCAtMTI2NiwxMCArMTMwMywxNyBAQAogICAgICAgICAgICAgaWYgKG1TdGF0dXNCYXIuaXNWaXNpYmxlTHcoKSkgewogICAgICAgICAgICAgICAgIC8vIElmIHRoZSBzdGF0dXMgYmFyIGlzIGhpZGRlbiwgd2UgZG9uJ3Qgd2FudCB0byBjYXVzZQogICAgICAgICAgICAgICAgIC8vIHdpbmRvd3MgYmVoaW5kIGl0IHRvIHNjcm9sbC4KLSAgICAgICAgICAgICAgICBtRG9ja1RvcCA9IG1Db250ZW50VG9wID0gbUN1clRvcCA9IG1TdGF0dXNCYXIuZ2V0RnJhbWVMdygpLmJvdHRvbTsKLSAgICAgICAgICAgICAgICBpZiAoREVCVUdfTEFZT1VUKSBMb2cudihUQUcsICJTdGF0dXMgYmFyOiBtRG9ja0JvdHRvbT0iCi0gICAgICAgICAgICAgICAgICAgICAgICArIG1Eb2NrQm90dG9tICsgIiBtQ29udGVudEJvdHRvbT0iCi0gICAgICAgICAgICAgICAgICAgICAgICArIG1Db250ZW50Qm90dG9tICsgIiBtQ3VyQm90dG9tPSIgKyBtQ3VyQm90dG9tKTsKKyAgICAgICAgICAgICAgICBmaW5hbCBSZWN0IHIgPSBtU3RhdHVzQmFyLmdldEZyYW1lTHcoKTsKKyAgICAgICAgICAgICAgICBpZiAobURvY2tUb3AgPT0gci50b3ApIG1Eb2NrVG9wID0gci5ib3R0b207CisgICAgICAgICAgICAgICAgZWxzZSBpZiAobURvY2tCb3R0b20gPT0gci5ib3R0b20pIG1Eb2NrQm90dG9tID0gci50b3A7CisgICAgICAgICAgICAgICAgbUNvbnRlbnRUb3AgPSBtQ3VyVG9wID0gbURvY2tUb3A7CisgICAgICAgICAgICAgICAgbUNvbnRlbnRCb3R0b20gPSBtQ3VyQm90dG9tID0gbURvY2tCb3R0b207CisgICAgICAgICAgICAgICAgaWYgKERFQlVHX0xBWU9VVCkgTG9nLnYoVEFHLCAiU3RhdHVzIGJhcjogbURvY2tUb3A9IiArIG1Eb2NrVG9wCisgICAgICAgICAgICAgICAgICAgICAgICArICIgbUNvbnRlbnRUb3A9IiArIG1Db250ZW50VG9wCisgICAgICAgICAgICAgICAgICAgICAgICArICIgbUN1clRvcD0iICsgbUN1clRvcAorICAgICAgICAgICAgICAgICAgICAgICAgKyAiIG1Eb2NrQm90dG9tPSIgKyBtRG9ja0JvdHRvbQorICAgICAgICAgICAgICAgICAgICAgICAgKyAiIG1Db250ZW50Qm90dG9tPSIgKyBtQ29udGVudEJvdHRvbQorICAgICAgICAgICAgICAgICAgICAgICAgKyAiIG1DdXJCb3R0b209IiArIG1DdXJCb3R0b20pOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQpAQCAtMTM1NCw3ICsxMzk4LDcgQEAKICAgICAgICAgICAgIGF0dHJzLmdyYXZpdHkgPSBHcmF2aXR5LkJPVFRPTTsKICAgICAgICAgICAgIG1Eb2NrTGF5ZXIgPSB3aW4uZ2V0U3VyZmFjZUxheWVyKCk7CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpZiAoKGZsICYKKyAgICAgICAgICAgIGlmIChtU3RhdHVzQmFyQ2FuSGlkZSAmJiAoZmwgJgogICAgICAgICAgICAgICAgICAgICAoRkxBR19MQVlPVVRfSU5fU0NSRUVOIHwgRkxBR19GVUxMU0NSRUVOIHwgRkxBR19MQVlPVVRfSU5TRVRfREVDT1IpKQogICAgICAgICAgICAgICAgICAgICA9PSAoRkxBR19MQVlPVVRfSU5fU0NSRUVOIHwgRkxBR19MQVlPVVRfSU5TRVRfREVDT1IpKSB7CiAgICAgICAgICAgICAgICAgLy8gVGhpcyBpcyB0aGUgY2FzZSBmb3IgYSBub3JtYWwgYWN0aXZpdHkgd2luZG93OiB3ZSB3YW50IGl0CkBAIC0xMzg2LDcgKzE0MzAsNyBAQAogICAgICAgICAgICAgICAgICAgICB2Zi5yaWdodCA9IG1DdXJSaWdodDsKICAgICAgICAgICAgICAgICAgICAgdmYuYm90dG9tID0gbUN1ckJvdHRvbTsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKChmbCAmIEZMQUdfTEFZT1VUX0lOX1NDUkVFTikgIT0gMCkgeworICAgICAgICAgICAgfSBlbHNlIGlmIChtU3RhdHVzQmFyQ2FuSGlkZSAmJiAoZmwgJiBGTEFHX0xBWU9VVF9JTl9TQ1JFRU4pICE9IDApIHsKICAgICAgICAgICAgICAgICAvLyBBIHdpbmRvdyB0aGF0IGhhcyByZXF1ZXN0ZWQgdG8gZmlsbCB0aGUgZW50aXJlIHNjcmVlbiBqdXN0CiAgICAgICAgICAgICAgICAgLy8gZ2V0cyBldmVyeXRoaW5nLCBwZXJpb2QuCiAgICAgICAgICAgICAgICAgcGYubGVmdCA9IGRmLmxlZnQgPSBjZi5sZWZ0ID0gMDsKQEAgLTE1MTMsOCArMTU1Nyw4IEBACiAgICAgLyoqIHtAaW5oZXJpdERvY30gKi8KICAgICBwdWJsaWMgaW50IGZpbmlzaEFuaW1hdGlvbkx3KCkgewogICAgICAgICBpbnQgY2hhbmdlcyA9IDA7Ci0gICAgICAgIAotICAgICAgICBib29sZWFuIGhpZGluZyA9IGZhbHNlOworCisgICAgICAgIGJvb2xlYW4gdG9wSXNGdWxsc2NyZWVuID0gZmFsc2U7CiAgICAgICAgIGlmIChtU3RhdHVzQmFyICE9IG51bGwpIHsKICAgICAgICAgICAgIGlmIChsb2NhbExPR1YpIExvZy5pKFRBRywgImZvcmNlPSIgKyBtRm9yY2VTdGF0dXNCYXIKICAgICAgICAgICAgICAgICAgICAgKyAiIHRvcD0iICsgbVRvcEZ1bGxzY3JlZW5PcGFxdWVXaW5kb3dTdGF0ZSk7CkBAIC0xNTIyLDE3ICsxNTY2LDI1IEBACiAgICAgICAgICAgICAgICAgaWYgKERFQlVHX0xBWU9VVCkgTG9nLnYoVEFHLCAiU2hvd2luZyBzdGF0dXMgYmFyIik7CiAgICAgICAgICAgICAgICAgaWYgKG1TdGF0dXNCYXIuc2hvd0x3KHRydWUpKSBjaGFuZ2VzIHw9IEZJTklTSF9MQVlPVVRfUkVET19MQVlPVVQ7CiAgICAgICAgICAgICB9IGVsc2UgaWYgKG1Ub3BGdWxsc2NyZWVuT3BhcXVlV2luZG93U3RhdGUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIC8vTG9nLmkoVEFHLCAiZnJhbWU6ICIgKyBtVG9wRnVsbHNjcmVlbk9wYXF1ZVdpbmRvd1N0YXRlLmdldEZyYW1lTHcoKQotICAgICAgICAgICAgICAgIC8vICAgICAgICArICIgc2hvd24gZnJhbWU6ICIgKyBtVG9wRnVsbHNjcmVlbk9wYXF1ZVdpbmRvd1N0YXRlLmdldFNob3duRnJhbWVMdygpKTsKLSAgICAgICAgICAgICAgICAvL0xvZy5pKFRBRywgImF0dHI6ICIgKyBtVG9wRnVsbHNjcmVlbk9wYXF1ZVdpbmRvd1N0YXRlLmdldEF0dHJzKCkpOwotICAgICAgICAgICAgICAgIFdpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zIGxwID0KLSAgICAgICAgICAgICAgICAgICAgbVRvcEZ1bGxzY3JlZW5PcGFxdWVXaW5kb3dTdGF0ZS5nZXRBdHRycygpOwotICAgICAgICAgICAgICAgIGJvb2xlYW4gaGlkZVN0YXR1c0JhciA9Ci0gICAgICAgICAgICAgICAgICAgIChscC5mbGFncyAmIFdpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zLkZMQUdfRlVMTFNDUkVFTikgIT0gMDsKLSAgICAgICAgICAgICAgICBpZiAoaGlkZVN0YXR1c0JhcikgewotICAgICAgICAgICAgICAgICAgICBpZiAoREVCVUdfTEFZT1VUKSBMb2cudihUQUcsICJIaWRpbmcgc3RhdHVzIGJhciIpOwotICAgICAgICAgICAgICAgICAgICBpZiAobVN0YXR1c0Jhci5oaWRlTHcodHJ1ZSkpIGNoYW5nZXMgfD0gRklOSVNIX0xBWU9VVF9SRURPX0xBWU9VVDsKLSAgICAgICAgICAgICAgICAgICAgaGlkaW5nID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBmaW5hbCBXaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcyBscCA9IG1Ub3BGdWxsc2NyZWVuT3BhcXVlV2luZG93U3RhdGUuZ2V0QXR0cnMoKTsKKyAgICAgICAgICAgICAgICBpZiAobG9jYWxMT0dWKSB7CisgICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgImZyYW1lOiAiICsgbVRvcEZ1bGxzY3JlZW5PcGFxdWVXaW5kb3dTdGF0ZS5nZXRGcmFtZUx3KCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgc2hvd24gZnJhbWU6ICIgKyBtVG9wRnVsbHNjcmVlbk9wYXF1ZVdpbmRvd1N0YXRlLmdldFNob3duRnJhbWVMdygpKTsKKyAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiYXR0cjogIiArIG1Ub3BGdWxsc2NyZWVuT3BhcXVlV2luZG93U3RhdGUuZ2V0QXR0cnMoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBscC5mbGFncz0weCIgKyBJbnRlZ2VyLnRvSGV4U3RyaW5nKGxwLmZsYWdzKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHRvcElzRnVsbHNjcmVlbiA9IChscC5mbGFncyAmIFdpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zLkZMQUdfRlVMTFNDUkVFTikgIT0gMDsKKyAgICAgICAgICAgICAgICAvLyBUaGUgc3VidGxlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgd2luZG93IGZvciBtVG9wRnVsbHNjcmVlbk9wYXF1ZVdpbmRvd1N0YXRlCisgICAgICAgICAgICAgICAgLy8gYW5kIG1Ub3BJc0Z1bGxzY3JlZW4gaXMgdGhhdCB0aGF0IG1Ub3BJc0Z1bGxzY3JlZW4gaXMgc2V0IG9ubHkgaWYgdGhlIHdpbmRvdworICAgICAgICAgICAgICAgIC8vIGhhcyB0aGUgRkxBR19GVUxMU0NSRUVOIHNldC4gIE5vdCBzdXJlIGlmIHRoZXJlIGlzIGFub3RoZXIgd2F5IHRoYXQgdG8gYmUgdGhlCisgICAgICAgICAgICAgICAgLy8gY2FzZSB0aG91Z2guCisgICAgICAgICAgICAgICAgaWYgKHRvcElzRnVsbHNjcmVlbikgeworICAgICAgICAgICAgICAgICAgICBpZiAobVN0YXR1c0JhckNhbkhpZGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChERUJVR19MQVlPVVQpIExvZy52KFRBRywgIkhpZGluZyBzdGF0dXMgYmFyIik7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobVN0YXR1c0Jhci5oaWRlTHcodHJ1ZSkpIGNoYW5nZXMgfD0gRklOSVNIX0xBWU9VVF9SRURPX0xBWU9VVDsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChsb2NhbExPR1YpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIExvZy52KFRBRywgIlByZXZlbnRpbmcgc3RhdHVzIGJhciBmcm9tIGhpZGluZyBieSBwb2xpY3kiKTsKKyAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgIGlmIChERUJVR19MQVlPVVQpIExvZy52KFRBRywgIlNob3dpbmcgc3RhdHVzIGJhciIpOwogICAgICAgICAgICAgICAgICAgICBpZiAobVN0YXR1c0Jhci5zaG93THcodHJ1ZSkpIGNoYW5nZXMgfD0gRklOSVNIX0xBWU9VVF9SRURPX0xBWU9VVDsKQEAgLTE1NDAsMjEgKzE1OTIsMzYgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICAKLSAgICAgICAgaWYgKGNoYW5nZXMgIT0gMCAmJiBoaWRpbmcpIHsKLSAgICAgICAgICAgIElTdGF0dXNCYXJTZXJ2aWNlIHNicyA9IElTdGF0dXNCYXJTZXJ2aWNlLlN0dWIuYXNJbnRlcmZhY2UoU2VydmljZU1hbmFnZXIuZ2V0U2VydmljZSgic3RhdHVzYmFyIikpOwotICAgICAgICAgICAgaWYgKHNicyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgLy8gTWFrZSBzdXJlIHRoZSB3aW5kb3cgc2hhZGUgaXMgaGlkZGVuLgotICAgICAgICAgICAgICAgICAgICBzYnMuY29sbGFwc2UoKTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KKyAgICAgICAgaWYgKHRvcElzRnVsbHNjcmVlbiAhPSBtVG9wSXNGdWxsc2NyZWVuKSB7CisgICAgICAgICAgICBmaW5hbCBib29sZWFuIHRvcElzRnVsbHNjcmVlbkYgPSB0b3BJc0Z1bGxzY3JlZW47CisgICAgICAgICAgICBtVG9wSXNGdWxsc2NyZWVuID0gdG9wSXNGdWxsc2NyZWVuOworICAgICAgICAgICAgbUhhbmRsZXIucG9zdChuZXcgUnVubmFibGUoKSB7CisgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtU3RhdHVzQmFyU2VydmljZSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhpcyBpcyB0aGUgb25lIHRoYXQgY2FuIG5vdCBnbyBhd2F5LCBidXQgaXQgZG9lc24ndCBjb21lIHVwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYmVmb3JlIHRoZSB3aW5kb3cgbWFuYWdlciBkb2VzLCBzbyBkb24ndCBmYWlsIGlmIGl0IGRvZXNuJ3QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBleGlzdC4gVGhpcyB3b3JrcyBhcyBsb25nIGFzIG5vIGZ1bGxzY3JlZW4gd2luZG93cyBjb21lIHVwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYmVmb3JlIHRoZSBzdGF0dXMgYmFyIHNlcnZpY2UgZG9lcy4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtU3RhdHVzQmFyU2VydmljZSA9IElTdGF0dXNCYXJTZXJ2aWNlLlN0dWIuYXNJbnRlcmZhY2UoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZXJ2aWNlTWFuYWdlci5nZXRTZXJ2aWNlKCJzdGF0dXNiYXIiKSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBJU3RhdHVzQmFyU2VydmljZSBzYnMgPSBtU3RhdHVzQmFyU2VydmljZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtU3RhdHVzQmFyU2VydmljZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2JzLnNldEFjdGl2ZVdpbmRvd0lzRnVsbHNjcmVlbih0b3BJc0Z1bGxzY3JlZW5GKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGlzIHNob3VsZCBiZSBpbXBvc3NpYmxlIGJlY2F1c2Ugd2UncmUgaW4gdGhlIHNhbWUgcHJvY2Vzcy4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVN0YXR1c0JhclNlcnZpY2UgPSBudWxsOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0pOwogICAgICAgICB9CiAKICAgICAgICAgLy8gSGlkZSB0aGUga2V5IGd1YXJkIGlmIGEgdmlzaWJsZSB3aW5kb3cgZXhwbGljaXRseSBzcGVjaWZpZXMgdGhhdCBpdCB3YW50cyB0byBiZSBkaXNwbGF5ZWQKICAgICAgICAgLy8gd2hlbiB0aGUgc2NyZWVuIGlzIGxvY2tlZAogICAgICAgICBpZiAobUtleWd1YXJkICE9IG51bGwpIHsKLSAgICAgICAgICAgIGlmIChsb2NhbExPR1YpIExvZy52KFRBRywgImZpbmlzaExheW91dEx3OjptSGlkZUtleWd1YXJkPSIrbUhpZGVMb2NrU2NyZWVuKTsKKyAgICAgICAgICAgIGlmIChsb2NhbExPR1YpIExvZy52KFRBRywgImZpbmlzaEFuaW1hdGlvbkx3OjptSGlkZUtleWd1YXJkPSIrbUhpZGVMb2NrU2NyZWVuKTsKICAgICAgICAgICAgIGlmIChtRGlzbWlzc0tleWd1YXJkICYmICFtS2V5Z3VhcmRNZWRpYXRvci5pc1NlY3VyZSgpKSB7CiAgICAgICAgICAgICAgICAgaWYgKG1LZXlndWFyZC5oaWRlTHcodHJ1ZSkpIHsKICAgICAgICAgICAgICAgICAgICAgY2hhbmdlcyB8PSBGSU5JU0hfTEFZT1VUX1JFRE9fTEFZT1VUCmRpZmYgLS1naXQgYS9wb2xpY3kvc3JjL2NvbS9hbmRyb2lkL2ludGVybmFsL3BvbGljeS9pbXBsL1N0YXR1c1ZpZXcuamF2YSBiL3BvbGljeS9zcmMvY29tL2FuZHJvaWQvaW50ZXJuYWwvcG9saWN5L2ltcGwvU3RhdHVzVmlldy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNmMDhjZmQKLS0tIC9kZXYvbnVsbAorKysgYi9wb2xpY3kvc3JjL2NvbS9hbmRyb2lkL2ludGVybmFsL3BvbGljeS9pbXBsL1N0YXR1c1ZpZXcuamF2YQpAQCAtMCwwICsxLDI1NSBAQAorLy8gQ29weXJpZ2h0IDIwMTAgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKworcGFja2FnZSBjb20uYW5kcm9pZC5pbnRlcm5hbC5wb2xpY3kuaW1wbDsKKworaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLlI7CitpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwud2lkZ2V0LkxvY2tQYXR0ZXJuVXRpbHM7CisKK2ltcG9ydCBqYXZhLnV0aWwuRGF0ZTsKKworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuRHJhd2FibGU7CitpbXBvcnQgYW5kcm9pZC50ZXh0LlRleHRVdGlsczsKK2ltcG9ydCBhbmRyb2lkLnRleHQuZm9ybWF0LkRhdGVGb3JtYXQ7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5UZXh0VmlldzsKKworY2xhc3MgU3RhdHVzVmlldyB7CisgICAgcHJpdmF0ZSBTdHJpbmcgbURhdGVGb3JtYXRTdHJpbmc7CisKKyAgICBwcml2YXRlIFRleHRWaWV3IG1DYXJyaWVyOworICAgIHByaXZhdGUgVGV4dFZpZXcgbURhdGU7CisKKyAgICAvLyBhcmUgd2Ugc2hvd2luZyBiYXR0ZXJ5IGluZm9ybWF0aW9uPworICAgIHByaXZhdGUgYm9vbGVhbiBtU2hvd2luZ0JhdHRlcnlJbmZvID0gZmFsc2U7CisKKyAgICAvLyBsYXN0IGtub3duIHBsdWdnZWQgaW4gc3RhdGUKKyAgICBwcml2YXRlIGJvb2xlYW4gbVBsdWdnZWRJbiA9IGZhbHNlOworCisgICAgLy8gbGFzdCBrbm93biBiYXR0ZXJ5IGxldmVsCisgICAgcHJpdmF0ZSBpbnQgbUJhdHRlcnlMZXZlbCA9IDEwMDsKKworICAgIHByaXZhdGUgU3RyaW5nIG1OZXh0QWxhcm0gPSBudWxsOworCisgICAgcHJpdmF0ZSBTdHJpbmcgbUluc3RydWN0aW9ucyA9IG51bGw7CisgICAgcHJpdmF0ZSBUZXh0VmlldyBtU3RhdHVzMTsKKyAgICBwcml2YXRlIFRleHRWaWV3IG1TdGF0dXMyOworICAgIHByaXZhdGUgVGV4dFZpZXcgbVByb3BlcnR5T2Y7CisKKyAgICBwcml2YXRlIGJvb2xlYW4gbUhhc1N0YXR1czI7CisgICAgcHJpdmF0ZSBib29sZWFuIG1IYXNDYXJyaWVyOworICAgIHByaXZhdGUgYm9vbGVhbiBtSGFzRGF0ZTsKKyAgICBwcml2YXRlIGJvb2xlYW4gbUhhc1Byb3BlcnR5OworCisgICAgcHJpdmF0ZSBWaWV3IG1WaWV3OworCisgICAgcHJpdmF0ZSBWaWV3IGZpbmRWaWV3QnlJZChpbnQgaWQpIHsKKyAgICAgICAgcmV0dXJuIG1WaWV3LmZpbmRWaWV3QnlJZChpZCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBDb250ZXh0IGdldENvbnRleHQoKSB7CisgICAgICAgIHJldHVybiBtVmlldy5nZXRDb250ZXh0KCk7CisgICAgfQorCisgICAgdm9pZCBzZXRJbnN0cnVjdGlvbnMoU3RyaW5nIGluc3RydWN0aW9ucykgeworICAgICAgICBtSW5zdHJ1Y3Rpb25zID0gaW5zdHJ1Y3Rpb25zOworICAgIH0KKworICAgIHZvaWQgc2V0Q2FycmllclRleHQoQ2hhclNlcXVlbmNlIGNhcnJpZXJUZXh0KSB7CisgICAgICAgIGlmIChtQ2FycmllciAhPSBudWxsKSB7CisgICAgICAgICAgICBtQ2Fycmllci5zZXRUZXh0KGNhcnJpZXJUZXh0KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHZvaWQgb25SZWZyZXNoQmF0dGVyeUluZm8oYm9vbGVhbiBzaG93QmF0dGVyeUluZm8sIGJvb2xlYW4gcGx1Z2dlZEluLCBpbnQgYmF0dGVyeUxldmVsKSB7CisgICAgICAgIG1TaG93aW5nQmF0dGVyeUluZm8gPSBzaG93QmF0dGVyeUluZm87CisgICAgICAgIG1QbHVnZ2VkSW4gPSBwbHVnZ2VkSW47CisgICAgICAgIG1CYXR0ZXJ5TGV2ZWwgPSBiYXR0ZXJ5TGV2ZWw7CisgICAgICAgIHVwZGF0ZVN0YXR1c0xpbmVzKCk7CisgICAgfQorCisgICAgdm9pZCBvblRpbWVDaGFuZ2VkKCkgeworICAgICAgICByZWZyZXNoVGltZUFuZERhdGVEaXNwbGF5KCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgb25SaW5nZXJNb2RlQ2hhbmdlZChpbnQgc3RhdGUpIHsKKyAgICB9CisKKyAgICB2b2lkIG9uUmVmcmVzaENhcnJpZXJJbmZvKENoYXJTZXF1ZW5jZSBwbG1uLCBDaGFyU2VxdWVuY2Ugc3BuKSB7CisgICAgICAgIHNldENhcnJpZXJUZXh0KExvY2tTY3JlZW4uZ2V0Q2FycmllclN0cmluZyhwbG1uLCBzcG4pKTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RhdHVzVmlldyhWaWV3IHZpZXcsIEtleWd1YXJkVXBkYXRlTW9uaXRvciB1cGRhdGVNb25pdG9yLAorICAgICAgICAgICAgICAgICAgTG9ja1BhdHRlcm5VdGlscyBsb2NrUGF0dGVyblV0aWxzKSB7CisgICAgICAgIG1WaWV3ID0gdmlldzsKKyAgICAgICAgbUNhcnJpZXIgPSAoVGV4dFZpZXcpIGZpbmRWaWV3QnlJZChSLmlkLmNhcnJpZXIpOworICAgICAgICBtSGFzQ2FycmllciA9IChtQ2FycmllciAhPSBudWxsKTsKKyAgICAgICAgbURhdGUgPSAoVGV4dFZpZXcpIGZpbmRWaWV3QnlJZChSLmlkLmRhdGUpOworICAgICAgICBtSGFzRGF0ZSA9IChtRGF0ZSAhPSBudWxsKTsKKyAgICAgICAgbURhdGVGb3JtYXRTdHJpbmcgPSBnZXRDb250ZXh0KCkuZ2V0U3RyaW5nKFIuc3RyaW5nLmZ1bGxfd2RheV9tb250aF9kYXlfbm9feWVhcik7CisKKyAgICAgICAgcmVmcmVzaFRpbWVBbmREYXRlRGlzcGxheSgpOworCisgICAgICAgIG1TdGF0dXMxID0gKFRleHRWaWV3KSBmaW5kVmlld0J5SWQoUi5pZC5zdGF0dXMxKTsKKyAgICAgICAgbVN0YXR1czIgPSAoVGV4dFZpZXcpIGZpbmRWaWV3QnlJZChSLmlkLnN0YXR1czIpOworICAgICAgICBtSGFzU3RhdHVzMiA9IChtU3RhdHVzMiAhPSBudWxsKTsKKyAgICAgICAgbVByb3BlcnR5T2YgPSAoVGV4dFZpZXcpIGZpbmRWaWV3QnlJZChSLmlkLnByb3BlcnR5T2YpOworICAgICAgICBtSGFzUHJvcGVydHkgPSAobVByb3BlcnR5T2YgIT0gbnVsbCk7CisKKyAgICAgICAgcmVzZXRTdGF0dXNJbmZvKHVwZGF0ZU1vbml0b3IsIGxvY2tQYXR0ZXJuVXRpbHMpOworCisgICAgICAgIC8vIFJlcXVpcmVkIHRvIGdldCBNYXJxdWVlIHRvIHdvcmsuCisgICAgICAgIGlmIChtSGFzQ2FycmllcikgeworICAgICAgICAgICAgbUNhcnJpZXIuc2V0U2VsZWN0ZWQodHJ1ZSk7CisgICAgICAgICAgICBtQ2Fycmllci5zZXRUZXh0Q29sb3IoMHhmZmZmZmZmZik7CisgICAgICAgIH0KKworICAgIH0KKworICAgIHZvaWQgcmVzZXRTdGF0dXNJbmZvKEtleWd1YXJkVXBkYXRlTW9uaXRvciB1cGRhdGVNb25pdG9yLCBMb2NrUGF0dGVyblV0aWxzIGxvY2tQYXR0ZXJuVXRpbHMpIHsKKyAgICAgICAgbUluc3RydWN0aW9ucyA9IG51bGw7CisgICAgICAgIG1TaG93aW5nQmF0dGVyeUluZm8gPSB1cGRhdGVNb25pdG9yLnNob3VsZFNob3dCYXR0ZXJ5SW5mbygpOworICAgICAgICBtUGx1Z2dlZEluID0gdXBkYXRlTW9uaXRvci5pc0RldmljZVBsdWdnZWRJbigpOworICAgICAgICBtQmF0dGVyeUxldmVsID0gdXBkYXRlTW9uaXRvci5nZXRCYXR0ZXJ5TGV2ZWwoKTsKKyAgICAgICAgbU5leHRBbGFybSA9IGxvY2tQYXR0ZXJuVXRpbHMuZ2V0TmV4dEFsYXJtKCk7CisgICAgICAgIHVwZGF0ZVN0YXR1c0xpbmVzKCk7CisgICAgfQorCisgICAgdm9pZCBzZXRJbnN0cnVjdGlvblRleHQoaW50IHN0cmluZ0lkKSB7CisgICAgICAgIG1TdGF0dXMxLnNldFRleHQoc3RyaW5nSWQpOworICAgICAgICBtU3RhdHVzMS5zZXRDb21wb3VuZERyYXdhYmxlc1dpdGhJbnRyaW5zaWNCb3VuZHMoUi5kcmF3YWJsZS5pY19sb2NrX2lkbGVfbG9jaywgMCwgMCwgMCk7CisgICAgICAgIG1TdGF0dXMxLnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKKyAgICB9CisKKyAgICB2b2lkIHNldEluc3RydWN0aW9uVGV4dChTdHJpbmcgc3RyaW5nKSB7CisgICAgICAgIG1TdGF0dXMxLnNldFRleHQoc3RyaW5nKTsKKyAgICAgICAgbVN0YXR1czEuc2V0Q29tcG91bmREcmF3YWJsZXNXaXRoSW50cmluc2ljQm91bmRzKFIuZHJhd2FibGUuaWNfbG9ja19pZGxlX2xvY2ssIDAsIDAsIDApOworICAgICAgICBtU3RhdHVzMS5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7CisgICAgfQorCisgICAgdm9pZCBzZXRDYXJyaWVyVGV4dChpbnQgc3RyaW5nSWQpIHsKKyAgICAgICAgbUNhcnJpZXIuc2V0VGV4dChzdHJpbmdJZCk7CisgICAgfQorICAgIHZvaWQgc2V0Q2FycmllclRleHQoU3RyaW5nIHN0cmluZykgeworICAgICAgICBtQ2Fycmllci5zZXRUZXh0KHN0cmluZyk7CisgICAgfQorCisgICAgLyoqIE9yaWdpbmF0ZWQgZnJvbSBQYXR0ZXJuVW5sb2NrU2NyZWVuICoqLworICAgIHZvaWQgdXBkYXRlU3RhdHVzTGluZXMoKSB7CisgICAgICAgIGlmIChtSGFzUHJvcGVydHkpIHsKKyAgICAgICAgICAgIC8vIFRPRE8gR2V0IGFjdHVhbCBuYW1lICYgZW1haWwKKyAgICAgICAgICAgIFN0cmluZyBuYW1lID0gIkpvaG4gU21pdGgiOworICAgICAgICAgICAgU3RyaW5nIGVtYWlsID0gImpzbWl0aEBnbWFpbC5jb20iOworICAgICAgICAgICAgbVByb3BlcnR5T2Yuc2V0VGV4dCgiUHJvcGVydHkgb2Y6XG4iICsgbmFtZSArICJcbiIgKyBlbWFpbCk7CisgICAgICAgICAgICBtUHJvcGVydHlPZi5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoIW1IYXNTdGF0dXMyKSByZXR1cm47CisKKyAgICAgICAgaWYgKG1JbnN0cnVjdGlvbnMgIT0gbnVsbCkgeworICAgICAgICAgICAgLy8gaW5zdHJ1Y3Rpb25zIG9ubHkKKyAgICAgICAgICAgIG1TdGF0dXMxLnNldFRleHQobUluc3RydWN0aW9ucyk7CisgICAgICAgICAgICBpZiAoVGV4dFV0aWxzLmlzRW1wdHkobUluc3RydWN0aW9ucykpIHsKKyAgICAgICAgICAgICAgICBtU3RhdHVzMS5zZXRDb21wb3VuZERyYXdhYmxlc1dpdGhJbnRyaW5zaWNCb3VuZHMoMCwgMCwgMCwgMCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG1TdGF0dXMxLnNldENvbXBvdW5kRHJhd2FibGVzV2l0aEludHJpbnNpY0JvdW5kcygKKyAgICAgICAgICAgICAgICAgICAgICAgIFIuZHJhd2FibGUuaWNfbG9ja19pZGxlX2xvY2ssIDAsIDAsIDApOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBtU3RhdHVzMS5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7CisgICAgICAgICAgICBtU3RhdHVzMi5zZXRWaXNpYmlsaXR5KFZpZXcuSU5WSVNJQkxFKTsKKyAgICAgICAgfSBlbHNlIGlmIChtU2hvd2luZ0JhdHRlcnlJbmZvICYmIG1OZXh0QWxhcm0gPT0gbnVsbCkgeworICAgICAgICAgICAgLy8gYmF0dGVyeSBvbmx5CisgICAgICAgICAgICBpZiAobVBsdWdnZWRJbikgeworICAgICAgICAgICAgICBpZiAobUJhdHRlcnlMZXZlbCA+PSAxMDApIHsKKyAgICAgICAgICAgICAgICBtU3RhdHVzMS5zZXRUZXh0KGdldENvbnRleHQoKS5nZXRTdHJpbmcoUi5zdHJpbmcubG9ja3NjcmVlbl9jaGFyZ2VkKSk7CisgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICBtU3RhdHVzMS5zZXRUZXh0KGdldENvbnRleHQoKS5nZXRTdHJpbmcoUi5zdHJpbmcubG9ja3NjcmVlbl9wbHVnZ2VkX2luLAorICAgICAgICAgICAgICAgICAgICAgICAgICBtQmF0dGVyeUxldmVsKSk7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbVN0YXR1czEuc2V0VGV4dChnZXRDb250ZXh0KCkuZ2V0U3RyaW5nKFIuc3RyaW5nLmxvY2tzY3JlZW5fbG93X2JhdHRlcnkpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1TdGF0dXMxLnNldENvbXBvdW5kRHJhd2FibGVzV2l0aEludHJpbnNpY0JvdW5kcyhSLmRyYXdhYmxlLmljX2xvY2tfaWRsZV9jaGFyZ2luZywgMCwKKyAgICAgICAgICAgICAgICAgICAgMCwgMCk7CisKKyAgICAgICAgICAgIG1TdGF0dXMxLnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKKyAgICAgICAgICAgIG1TdGF0dXMyLnNldFZpc2liaWxpdHkoVmlldy5JTlZJU0lCTEUpOworCisgICAgICAgIH0gZWxzZSBpZiAobU5leHRBbGFybSAhPSBudWxsICYmICFtU2hvd2luZ0JhdHRlcnlJbmZvKSB7CisgICAgICAgICAgICAvLyBhbGFybSBvbmx5CisgICAgICAgICAgICBtU3RhdHVzMS5zZXRUZXh0KG1OZXh0QWxhcm0pOworICAgICAgICAgICAgbVN0YXR1czEuc2V0Q29tcG91bmREcmF3YWJsZXNXaXRoSW50cmluc2ljQm91bmRzKFIuZHJhd2FibGUuaWNfbG9ja19pZGxlX2FsYXJtLCAwLAorICAgICAgICAgICAgICAgICAgICAwLCAwKTsKKworICAgICAgICAgICAgbVN0YXR1czEuc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOworICAgICAgICAgICAgbVN0YXR1czIuc2V0VmlzaWJpbGl0eShWaWV3LklOVklTSUJMRSk7CisgICAgICAgIH0gZWxzZSBpZiAobU5leHRBbGFybSAhPSBudWxsICYmIG1TaG93aW5nQmF0dGVyeUluZm8pIHsKKyAgICAgICAgICAgIC8vIGJvdGggYmF0dGVyeSBhbmQgbmV4dCBhbGFybQorICAgICAgICAgICAgbVN0YXR1czEuc2V0VGV4dChtTmV4dEFsYXJtKTsKKyAgICAgICAgICAgIG1TdGF0dXMyLnNldFRleHQoZ2V0Q29udGV4dCgpLmdldFN0cmluZygKKyAgICAgICAgICAgICAgICAgICAgUi5zdHJpbmcubG9ja3NjcmVlbl9iYXR0ZXJ5X3Nob3J0LAorICAgICAgICAgICAgICAgICAgICBNYXRoLm1pbigxMDAsIG1CYXR0ZXJ5TGV2ZWwpKSk7CisgICAgICAgICAgICBtU3RhdHVzMS5zZXRDb21wb3VuZERyYXdhYmxlc1dpdGhJbnRyaW5zaWNCb3VuZHMoUi5kcmF3YWJsZS5pY19sb2NrX2lkbGVfYWxhcm0sIDAsCisgICAgICAgICAgICAgICAgICAgIDAsIDApOworICAgICAgICAgICAgaWYgKG1QbHVnZ2VkSW4pIHsKKyAgICAgICAgICAgICAgICBtU3RhdHVzMi5zZXRDb21wb3VuZERyYXdhYmxlc1dpdGhJbnRyaW5zaWNCb3VuZHMoUi5kcmF3YWJsZS5pY19sb2NrX2lkbGVfY2hhcmdpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAwLCAwLCAwKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbVN0YXR1czIuc2V0Q29tcG91bmREcmF3YWJsZXNXaXRoSW50cmluc2ljQm91bmRzKDAsIDAsIDAsIDApOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBtU3RhdHVzMS5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7CisgICAgICAgICAgICBtU3RhdHVzMi5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBub3RoaW5nIHNwZWNpZmljIHRvIHNob3c7IHNob3cgZ2VuZXJhbCBpbnN0cnVjdGlvbnMKKyAgICAgICAgICAgIG1TdGF0dXMxLnNldFRleHQoUi5zdHJpbmcubG9ja3NjcmVlbl9wYXR0ZXJuX2luc3RydWN0aW9ucyk7CisgICAgICAgICAgICBtU3RhdHVzMS5zZXRDb21wb3VuZERyYXdhYmxlc1dpdGhJbnRyaW5zaWNCb3VuZHMoUi5kcmF3YWJsZS5pY19sb2NrX2lkbGVfbG9jaywgMCwKKyAgICAgICAgICAgICAgICAgICAgMCwgMCk7CisKKyAgICAgICAgICAgIG1TdGF0dXMxLnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKKyAgICAgICAgICAgIG1TdGF0dXMyLnNldFZpc2liaWxpdHkoVmlldy5JTlZJU0lCTEUpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqIE9yaWdpbmF0ZWQgZnJvbSBMb2NrU2NyZWVuICoqLworICAgIC8vIFRPRE8gTWVyZ2Ugd2l0aCBmdW5jdGlvbiBhYm92ZQorICAgIHZvaWQgdXBkYXRlU3RhdHVzTGluZXMoYm9vbGVhbiBzaG93U3RhdHVzTGluZXMsIFN0cmluZyBjaGFyZ2luZywgRHJhd2FibGUgY2hhcmdpbmdJY29uLAorICAgICAgICAgICAgRHJhd2FibGUgYWxhcm1JY29uKSB7CisgICAgICAgIGlmICghc2hvd1N0YXR1c0xpbmVzIHx8IChjaGFyZ2luZyA9PSBudWxsICYmIG1OZXh0QWxhcm0gPT0gbnVsbCkpIHsKKyAgICAgICAgICAgIG1TdGF0dXMxLnNldFZpc2liaWxpdHkoVmlldy5JTlZJU0lCTEUpOworICAgICAgICAgICAgbVN0YXR1czIuc2V0VmlzaWJpbGl0eShWaWV3LklOVklTSUJMRSk7CisgICAgICAgIH0gZWxzZSBpZiAoY2hhcmdpbmcgIT0gbnVsbCAmJiBtTmV4dEFsYXJtID09IG51bGwpIHsKKyAgICAgICAgICAgIC8vIGNoYXJnaW5nIG9ubHkKKyAgICAgICAgICAgIG1TdGF0dXMxLnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKKyAgICAgICAgICAgIG1TdGF0dXMyLnNldFZpc2liaWxpdHkoVmlldy5JTlZJU0lCTEUpOworCisgICAgICAgICAgICBtU3RhdHVzMS5zZXRUZXh0KGNoYXJnaW5nKTsKKyAgICAgICAgICAgIG1TdGF0dXMxLnNldENvbXBvdW5kRHJhd2FibGVzV2l0aEludHJpbnNpY0JvdW5kcyhjaGFyZ2luZ0ljb24sIG51bGwsIG51bGwsIG51bGwpOworICAgICAgICB9IGVsc2UgaWYgKG1OZXh0QWxhcm0gIT0gbnVsbCAmJiBjaGFyZ2luZyA9PSBudWxsKSB7CisgICAgICAgICAgICAvLyBuZXh0IGFsYXJtIG9ubHkKKyAgICAgICAgICAgIG1TdGF0dXMxLnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKKyAgICAgICAgICAgIG1TdGF0dXMyLnNldFZpc2liaWxpdHkoVmlldy5JTlZJU0lCTEUpOworCisgICAgICAgICAgICBtU3RhdHVzMS5zZXRUZXh0KG1OZXh0QWxhcm0pOworICAgICAgICAgICAgbVN0YXR1czEuc2V0Q29tcG91bmREcmF3YWJsZXNXaXRoSW50cmluc2ljQm91bmRzKGFsYXJtSWNvbiwgbnVsbCwgbnVsbCwgbnVsbCk7CisgICAgICAgIH0gZWxzZSBpZiAoY2hhcmdpbmcgIT0gbnVsbCAmJiBtTmV4dEFsYXJtICE9IG51bGwpIHsKKyAgICAgICAgICAgIC8vIGJvdGggY2hhcmdpbmcgYW5kIG5leHQgYWxhcm0KKyAgICAgICAgICAgIG1TdGF0dXMxLnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKKyAgICAgICAgICAgIG1TdGF0dXMyLnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKKworICAgICAgICAgICAgbVN0YXR1czEuc2V0VGV4dChjaGFyZ2luZyk7CisgICAgICAgICAgICBtU3RhdHVzMS5zZXRDb21wb3VuZERyYXdhYmxlc1dpdGhJbnRyaW5zaWNCb3VuZHMoY2hhcmdpbmdJY29uLCBudWxsLCBudWxsLCBudWxsKTsKKyAgICAgICAgICAgIG1TdGF0dXMyLnNldFRleHQobU5leHRBbGFybSk7CisgICAgICAgICAgICBtU3RhdHVzMi5zZXRDb21wb3VuZERyYXdhYmxlc1dpdGhJbnRyaW5zaWNCb3VuZHMoYWxhcm1JY29uLCBudWxsLCBudWxsLCBudWxsKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHZvaWQgcmVmcmVzaFRpbWVBbmREYXRlRGlzcGxheSgpIHsKKyAgICAgICAgaWYgKG1IYXNEYXRlKSB7CisgICAgICAgICAgICBtRGF0ZS5zZXRUZXh0KERhdGVGb3JtYXQuZm9ybWF0KG1EYXRlRm9ybWF0U3RyaW5nLCBuZXcgRGF0ZSgpKSk7CisgICAgICAgIH0KKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL3ByZWxvYWRlZC1jbGFzc2VzIGIvcHJlbG9hZGVkLWNsYXNzZXMKaW5kZXggMWQ1ZmJjMDguLjMzMTcyODYgMTAwNjQ0Ci0tLSBhL3ByZWxvYWRlZC1jbGFzc2VzCisrKyBiL3ByZWxvYWRlZC1jbGFzc2VzCkBAIC0xMzgsNyArMTM4LDYgQEAKIGFuZHJvaWQuZGF0YWJhc2UuTWF0cml4Q3Vyc29yCiBhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZS5TUUxpdGVDbG9zYWJsZQogYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGUuU1FMaXRlQ29tcGlsZWRTcWwKLWFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlLlNRTGl0ZUNvbnRlbnRIZWxwZXIKIGFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlLlNRTGl0ZUN1cnNvcgogYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGUuU1FMaXRlRGF0YWJhc2UKIGFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlLlNRTGl0ZURlYnVnCkBAIC01NjMsOCArNTYyLDYgQEAKIGFuZHJvaWQud2lkZ2V0LkFkYXB0ZXJWaWV3CiBhbmRyb2lkLndpZGdldC5BcnJheUFkYXB0ZXIKIGFuZHJvaWQud2lkZ2V0LkF1dG9Db21wbGV0ZVRleHRWaWV3Ci1hbmRyb2lkLndpZGdldC5BdXRvQ29tcGxldGVUZXh0VmlldyREcm9wRG93bkl0ZW1DbGlja0xpc3RlbmVyCi1hbmRyb2lkLndpZGdldC5BdXRvQ29tcGxldGVUZXh0VmlldyREcm9wRG93bkxpc3RWaWV3CiBhbmRyb2lkLndpZGdldC5CYXNlQWRhcHRlcgogYW5kcm9pZC53aWRnZXQuQmFzZUV4cGFuZGFibGVMaXN0QWRhcHRlcgogYW5kcm9pZC53aWRnZXQuQ2hlY2tCb3gKQEAgLTU4Miw2ICs1NzksNyBAQAogYW5kcm9pZC53aWRnZXQuSW1hZ2VWaWV3CiBhbmRyb2lkLndpZGdldC5JbWFnZVZpZXckU2NhbGVUeXBlCiBhbmRyb2lkLndpZGdldC5MaW5lYXJMYXlvdXQKK2FuZHJvaWQud2lkZ2V0Lkxpc3RQb3B1cFdpbmRvdwogYW5kcm9pZC53aWRnZXQuTGlzdFZpZXcKIGFuZHJvaWQud2lkZ2V0Lkxpc3RWaWV3JFNhdmVkU3RhdGUKIGFuZHJvaWQud2lkZ2V0Lk1lZGlhQ29udHJvbGxlcgpAQCAtNjg1LDcgKzY4Myw2IEBACiBjb20uYW5kcm9pZC5pbnRlcm5hbC52aWV3Lm1lbnUuTWVudUJ1aWxkZXIKIGNvbS5hbmRyb2lkLmludGVybmFsLnZpZXcubWVudS5NZW51SXRlbUltcGwKIGNvbS5hbmRyb2lkLmludGVybmFsLnZpZXcubWVudS5TdWJNZW51QnVpbGRlcgotY29tLmFuZHJvaWQuaW50ZXJuYWwud2lkZ2V0LkNvbnRhY3RIZWFkZXJXaWRnZXQKIGNvbS5hbmRyb2lkLmludGVybmFsLndpZGdldC5EaWFsb2dUaXRsZQogY29tLmFuZHJvaWQuaW50ZXJuYWwud2lkZ2V0LkVkaXRhYmxlSW5wdXRDb25uZWN0aW9uCiBjb20uYW5kcm9pZC5pbnRlcm5hbC53aWRnZXQuTGluZWFyTGF5b3V0V2l0aERlZmF1bHRUb3VjaFJlY2VwaWVudApAQCAtNzI3LDcgKzcyNCw2IEBACiBqYXZhLmlvLkZpbGUKIGphdmEuaW8uRmlsZURlc2NyaXB0b3IKIGphdmEuaW8uRmlsZUlucHV0U3RyZWFtCi1qYXZhLmlvLkZpbGVJbnB1dFN0cmVhbSRSZXBvc2l0aW9uaW5nTG9jawogamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb24KIGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbQogamF2YS5pby5GaWx0ZXJJbnB1dFN0cmVhbQpAQCAtMTEzMSw3ICsxMTI3LDYgQEAKIG9yZy5hcGFjaGUuaGFybW9ueS5uaW8uRmlsZUNoYW5uZWxGYWN0b3J5CiBvcmcuYXBhY2hlLmhhcm1vbnkubmlvLmludGVybmFsLkRpcmVjdEJ1ZmZlcgogb3JnLmFwYWNoZS5oYXJtb255Lm5pby5pbnRlcm5hbC5GaWxlQ2hhbm5lbEltcGwKLW9yZy5hcGFjaGUuaGFybW9ueS5uaW8uaW50ZXJuYWwuRmlsZUNoYW5uZWxJbXBsJFJlcG9zaXRpb25pbmdMb2NrCiBvcmcuYXBhY2hlLmhhcm1vbnkubmlvLmludGVybmFsLkZpbGVMb2NrSW1wbAogb3JnLmFwYWNoZS5oYXJtb255Lm5pby5pbnRlcm5hbC5Mb2NrTWFuYWdlcgogb3JnLmFwYWNoZS5oYXJtb255Lm5pby5pbnRlcm5hbC5Mb2NrTWFuYWdlciQxCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9Qb2xpY3lNYW5hZ2VyQmFzZS5jcHAgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9Qb2xpY3lNYW5hZ2VyQmFzZS5jcHAKaW5kZXggNDI1Y2EzMS4uNjVkOWVmNyAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvUG9saWN5TWFuYWdlckJhc2UuY3BwCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb1BvbGljeU1hbmFnZXJCYXNlLmNwcApAQCAtMTAxNyw4ICsxMDE3LDggQEAKICNpZmRlZiBBVURJT19QT0xJQ1lfVEVTVAogICAgIFRocmVhZChmYWxzZSksCiAjZW5kaWYgLy9BVURJT19QT0xJQ1lfVEVTVAotICAgIG1QaG9uZVN0YXRlKEF1ZGlvU3lzdGVtOjpNT0RFX05PUk1BTCksIG1SaW5nZXJNb2RlKDApLCBtTXVzaWNTdG9wVGltZSgwKSwKLSAgICBtTGltaXRSaW5ndG9uZVZvbHVtZShmYWxzZSksIG1Ub3RhbEVmZmVjdHNDcHVMb2FkKDApLCBtVG90YWxFZmZlY3RzTWVtb3J5KDApCisgICAgbVBob25lU3RhdGUoQXVkaW9TeXN0ZW06Ok1PREVfTk9STUFMKSwgbVJpbmdlck1vZGUoMCksIG1NdXNpY1N0b3BUaW1lKDApLCBtTGltaXRSaW5ndG9uZVZvbHVtZShmYWxzZSksCisgICAgbUxhc3RWb2ljZVZvbHVtZSgtMS4wZiksIG1Ub3RhbEVmZmVjdHNDcHVMb2FkKDApLCBtVG90YWxFZmZlY3RzTWVtb3J5KDApCiB7CiAgICAgbXBDbGllbnRJbnRlcmZhY2UgPSBjbGllbnRJbnRlcmZhY2U7CiAKQEAgLTE4MzUsMjkgKzE4MzUsMzggQEAKICAgICB9CiAKICAgICBmbG9hdCB2b2x1bWUgPSBjb21wdXRlVm9sdW1lKHN0cmVhbSwgaW5kZXgsIG91dHB1dCwgZGV2aWNlKTsKLSAgICAvLyBkbyBub3Qgc2V0IHZvbHVtZSBpZiB0aGUgZmxvYXQgdmFsdWUgZGlkIG5vdCBjaGFuZ2UKLSAgICBpZiAodm9sdW1lICE9IG1PdXRwdXRzLnZhbHVlRm9yKG91dHB1dCktPm1DdXJWb2x1bWVbc3RyZWFtXSB8fCBmb3JjZSkgeworICAgIC8vIFdlIGFjdHVhbGx5IGNoYW5nZSB0aGUgdm9sdW1lIGlmOgorICAgIC8vIC0gdGhlIGZsb2F0IHZhbHVlIHJldHVybmVkIGJ5IGNvbXB1dGVWb2x1bWUoKSBjaGFuZ2VkCisgICAgLy8gLSB0aGUgZm9yY2UgZmxhZyBpcyBzZXQKKyAgICBpZiAodm9sdW1lICE9IG1PdXRwdXRzLnZhbHVlRm9yKG91dHB1dCktPm1DdXJWb2x1bWVbc3RyZWFtXSB8fAorICAgICAgICAgICAgZm9yY2UpIHsKICAgICAgICAgbU91dHB1dHMudmFsdWVGb3Iob3V0cHV0KS0+bUN1clZvbHVtZVtzdHJlYW1dID0gdm9sdW1lOwogICAgICAgICBMT0dWKCJzZXRTdHJlYW1Wb2x1bWUoKSBmb3Igb3V0cHV0ICVkIHN0cmVhbSAlZCwgdm9sdW1lICVmLCBkZWxheSAlZCIsIG91dHB1dCwgc3RyZWFtLCB2b2x1bWUsIGRlbGF5TXMpOwogICAgICAgICBpZiAoc3RyZWFtID09IEF1ZGlvU3lzdGVtOjpWT0lDRV9DQUxMIHx8CiAgICAgICAgICAgICBzdHJlYW0gPT0gQXVkaW9TeXN0ZW06OkRUTUYgfHwKICAgICAgICAgICAgIHN0cmVhbSA9PSBBdWRpb1N5c3RlbTo6QkxVRVRPT1RIX1NDTykgewotICAgICAgICAgICAgZmxvYXQgdm9pY2VWb2x1bWUgPSAtMS4wOwogICAgICAgICAgICAgLy8gb2Zmc2V0IHZhbHVlIHRvIHJlZmxlY3QgYWN0dWFsIGhhcmR3YXJlIHZvbHVtZSB0aGF0IG5ldmVyIHJlYWNoZXMgMAogICAgICAgICAgICAgLy8gMSUgY29ycmVzcG9uZHMgcm91Z2hseSB0byBmaXJzdCBzdGVwIGluIFZPSUNFX0NBTEwgc3RyZWFtIHZvbHVtZSBzZXR0aW5nIChzZWUgQXVkaW9TZXJ2aWNlLmphdmEpCiAgICAgICAgICAgICB2b2x1bWUgPSAwLjAxICsgMC45OSAqIHZvbHVtZTsKLSAgICAgICAgICAgIGlmIChzdHJlYW0gPT0gQXVkaW9TeXN0ZW06OlZPSUNFX0NBTEwpIHsKLSAgICAgICAgICAgICAgICB2b2ljZVZvbHVtZSA9IChmbG9hdClpbmRleC8oZmxvYXQpbVN0cmVhbXNbc3RyZWFtXS5tSW5kZXhNYXg7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKHN0cmVhbSA9PSBBdWRpb1N5c3RlbTo6QkxVRVRPT1RIX1NDTykgewotICAgICAgICAgICAgICAgIHZvaWNlVm9sdW1lID0gMS4wOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHZvaWNlVm9sdW1lID49IDAgJiYgb3V0cHV0ID09IG1IYXJkd2FyZU91dHB1dCkgewotICAgICAgICAgICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5zZXRWb2ljZVZvbHVtZSh2b2ljZVZvbHVtZSwgZGVsYXlNcyk7Ci0gICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPnNldFN0cmVhbVZvbHVtZSgoQXVkaW9TeXN0ZW06OnN0cmVhbV90eXBlKXN0cmVhbSwgdm9sdW1lLCBvdXRwdXQsIGRlbGF5TXMpOwogICAgIH0KIAorICAgIGlmIChzdHJlYW0gPT0gQXVkaW9TeXN0ZW06OlZPSUNFX0NBTEwgfHwKKyAgICAgICAgc3RyZWFtID09IEF1ZGlvU3lzdGVtOjpCTFVFVE9PVEhfU0NPKSB7CisgICAgICAgIGZsb2F0IHZvaWNlVm9sdW1lOworICAgICAgICAvLyBGb3JjZSB2b2ljZSB2b2x1bWUgdG8gbWF4IGZvciBibHVldG9vdGggU0NPIGFzIHZvbHVtZSBpcyBtYW5hZ2VkIGJ5IHRoZSBoZWFkc2V0CisgICAgICAgIGlmIChzdHJlYW0gPT0gQXVkaW9TeXN0ZW06OlZPSUNFX0NBTEwpIHsKKyAgICAgICAgICAgIHZvaWNlVm9sdW1lID0gKGZsb2F0KWluZGV4LyhmbG9hdCltU3RyZWFtc1tzdHJlYW1dLm1JbmRleE1heDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHZvaWNlVm9sdW1lID0gMS4wOworICAgICAgICB9CisgICAgICAgIGlmICh2b2ljZVZvbHVtZSAhPSBtTGFzdFZvaWNlVm9sdW1lICYmIG91dHB1dCA9PSBtSGFyZHdhcmVPdXRwdXQpIHsKKyAgICAgICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5zZXRWb2ljZVZvbHVtZSh2b2ljZVZvbHVtZSwgZGVsYXlNcyk7CisgICAgICAgICAgICBtTGFzdFZvaWNlVm9sdW1lID0gdm9pY2VWb2x1bWU7CisgICAgICAgIH0KKyAgICB9CisKICAgICByZXR1cm4gTk9fRVJST1I7CiB9CiAKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL0NhbWVyYUhhcmR3YXJlU3R1Yi5jcHAgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9DYW1lcmFIYXJkd2FyZVN0dWIuY3BwCmluZGV4IGIzZTBlZTYuLjA3YjVhMzcgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL0NhbWVyYUhhcmR3YXJlU3R1Yi5jcHAKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvQ2FtZXJhSGFyZHdhcmVTdHViLmNwcApAQCAtMTAxLDkgKzEwMSw5IEBACiAgICAgbUZha2VDYW1lcmEgPSAwOyAvLyBwYXJhbm9pYQogfQogCi1zcDxJTWVtb3J5SGVhcD4gQ2FtZXJhSGFyZHdhcmVTdHViOjpnZXRQcmV2aWV3SGVhcCgpIGNvbnN0CitzdGF0dXNfdCBDYW1lcmFIYXJkd2FyZVN0dWI6OnNldFByZXZpZXdXaW5kb3coY29uc3Qgc3A8QU5hdGl2ZVdpbmRvdz4mIGJ1ZikKIHsKLSAgICByZXR1cm4gbVByZXZpZXdIZWFwOworICAgIHJldHVybiBOT19FUlJPUjsKIH0KIAogc3A8SU1lbW9yeUhlYXA+IENhbWVyYUhhcmR3YXJlU3R1Yjo6Z2V0UmF3SGVhcCgpIGNvbnN0CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9DYW1lcmFIYXJkd2FyZVN0dWIuaCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL0NhbWVyYUhhcmR3YXJlU3R1Yi5oCmluZGV4IGQzNDI3YmEuLjliNjZhNzYgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL0NhbWVyYUhhcmR3YXJlU3R1Yi5oCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL0NhbWVyYUhhcmR3YXJlU3R1Yi5oCkBAIC0yOSw3ICsyOSw3IEBACiAKIGNsYXNzIENhbWVyYUhhcmR3YXJlU3R1YiA6IHB1YmxpYyBDYW1lcmFIYXJkd2FyZUludGVyZmFjZSB7CiBwdWJsaWM6Ci0gICAgdmlydHVhbCBzcDxJTWVtb3J5SGVhcD4gZ2V0UHJldmlld0hlYXAoKSBjb25zdDsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldFByZXZpZXdXaW5kb3coY29uc3Qgc3A8QU5hdGl2ZVdpbmRvdz4mIGJ1Zik7CiAgICAgdmlydHVhbCBzcDxJTWVtb3J5SGVhcD4gZ2V0UmF3SGVhcCgpIGNvbnN0OwogCiAgICAgdmlydHVhbCB2b2lkICAgICAgICBzZXRDYWxsYmFja3Mobm90aWZ5X2NhbGxiYWNrIG5vdGlmeV9jYiwKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL0NhbWVyYVNlcnZpY2UuY3BwIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvQ2FtZXJhU2VydmljZS5jcHAKaW5kZXggZWEyYzVkNC4uZjk0M2ExMCAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvQ2FtZXJhU2VydmljZS5jcHAKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvQ2FtZXJhU2VydmljZS5jcHAKQEAgLTI2LDYgKzI2LDcgQEAKICNpbmNsdWRlIDxiaW5kZXIvTWVtb3J5QmFzZS5oPgogI2luY2x1ZGUgPGJpbmRlci9NZW1vcnlIZWFwQmFzZS5oPgogI2luY2x1ZGUgPGN1dGlscy9hdG9taWMuaD4KKyNpbmNsdWRlIDxjdXRpbHMvcHJvcGVydGllcy5oPgogI2luY2x1ZGUgPGhhcmR3YXJlL2hhcmR3YXJlLmg+CiAjaW5jbHVkZSA8bWVkaWEvQXVkaW9TeXN0ZW0uaD4KICNpbmNsdWRlIDxtZWRpYS9tZWRpYXBsYXllci5oPgpAQCAtMzE5LDYgKzMyMCw3IEBACiAgICAgLy8gQ2FsbGJhY2sgaXMgZGlzYWJsZWQgYnkgZGVmYXVsdAogICAgIG1QcmV2aWV3Q2FsbGJhY2tGbGFnID0gRlJBTUVfQ0FMTEJBQ0tfRkxBR19OT09QOwogICAgIG1PcmllbnRhdGlvbiA9IDA7CisgICAgbVBsYXlTaHV0dGVyU291bmQgPSB0cnVlOwogICAgIGNhbWVyYVNlcnZpY2UtPnNldENhbWVyYUJ1c3koY2FtZXJhSWQpOwogICAgIGNhbWVyYVNlcnZpY2UtPmxvYWRTb3VuZCgpOwogICAgIExPRzEoIkNsaWVudDo6Q2xpZW50IFggKHBpZCAlZCkiLCBjYWxsaW5nUGlkKTsKQEAgLTMzNiwxOCArMzM4LDYgQEAKICAgICBpbnQgY2FsbGluZ1BpZCA9IGdldENhbGxpbmdQaWQoKTsKICAgICBMT0cxKCJDbGllbnQ6On5DbGllbnQgRSAocGlkICVkLCB0aGlzICVwKSIsIGNhbGxpbmdQaWQsIHRoaXMpOwogCi0gICAgaWYgKG1TdXJmYWNlICE9IDAgJiYgIW1Vc2VPdmVybGF5KSB7Ci0gICAgICAgIHB0aHJlYWRfdCB0aHI7Ci0gICAgICAgIC8vIFdlIHVucmVnaXN0ZXIgdGhlIGJ1ZmZlcnMgaW4gYSBkaWZmZXJlbnQgdGhyZWFkIGJlY2F1c2UgYmluZGVyIGRvZXMKLSAgICAgICAgLy8gbm90IGxldCB1cyBtYWtlIHN5Y2hyb25vdXMgdHJhbnNhY3Rpb25zIGluIGEgYmluZGVyIGRlc3RydWN0b3IgKHRoYXQKLSAgICAgICAgLy8gaXMsIHVwb24gb3VyIHJlYWNoaW5nIGEgcmVmY291bnQgb2YgemVyby4pCi0gICAgICAgIHB0aHJlYWRfY3JlYXRlKCZ0aHIsCi0gICAgICAgICAgICAgICAgICAgICAgIE5VTEwsICAvLyBhdHRyCi0gICAgICAgICAgICAgICAgICAgICAgIHVucmVnaXN0ZXJfc3VyZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgbVN1cmZhY2UuZ2V0KCkpOwotICAgICAgICBwdGhyZWFkX2pvaW4odGhyLCBOVUxMKTsKLSAgICB9Ci0KICAgICAvLyBzZXQgbUNsaWVudFBpZCB0byBsZXQgZGlzY29ubmV0KCkgdGVhciBkb3duIHRoZSBoYXJkd2FyZQogICAgIG1DbGllbnRQaWQgPSBjYWxsaW5nUGlkOwogICAgIGRpc2Nvbm5lY3QoKTsKQEAgLTQ2NSw2ICs0NTUsMTEgQEAKICAgICBpZiAobVVzZU92ZXJsYXkpIHsKICAgICAgICAgbU92ZXJsYXlSZWYgPSAwOwogICAgIH0KKyAgICAvLyBSZWxlYXNlIHRoZSBoZWxkIEFOYXRpdmVXaW5kb3cgcmVzb3VyY2VzLgorICAgIGlmIChtUHJldmlld1dpbmRvdyAhPSAwKSB7CisgICAgICAgIG1QcmV2aWV3V2luZG93ID0gMDsKKyAgICAgICAgbUhhcmR3YXJlLT5zZXRQcmV2aWV3V2luZG93KG1QcmV2aWV3V2luZG93KTsKKyAgICB9CiAgICAgbUhhcmR3YXJlLmNsZWFyKCk7CiAKICAgICBtQ2FtZXJhU2VydmljZS0+cmVtb3ZlQ2xpZW50KG1DYW1lcmFDbGllbnQpOwpAQCAtNDc1LDggKzQ3MCw4IEBACiAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAotLy8gc2V0IHRoZSBJU3VyZmFjZSB0aGF0IHRoZSBwcmV2aWV3IHdpbGwgdXNlCi1zdGF0dXNfdCBDYW1lcmFTZXJ2aWNlOjpDbGllbnQ6OnNldFByZXZpZXdEaXNwbGF5KGNvbnN0IHNwPElTdXJmYWNlPiYgc3VyZmFjZSkgeworLy8gc2V0IHRoZSBTdXJmYWNlIHRoYXQgdGhlIHByZXZpZXcgd2lsbCB1c2UKK3N0YXR1c190IENhbWVyYVNlcnZpY2U6OkNsaWVudDo6c2V0UHJldmlld0Rpc3BsYXkoY29uc3Qgc3A8U3VyZmFjZT4mIHN1cmZhY2UpIHsKICAgICBMT0cxKCJzZXRQcmV2aWV3RGlzcGxheSglcCkgKHBpZCAlZCkiLCBzdXJmYWNlLmdldCgpLCBnZXRDYWxsaW5nUGlkKCkpOwogICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKICAgICBzdGF0dXNfdCByZXN1bHQgPSBjaGVja1BpZEFuZEhhcmR3YXJlKCk7CkBAIC00ODYsNyArNDgxLDcgQEAKIAogICAgIC8vIHJldHVybiBpZiBubyBjaGFuZ2UgaW4gc3VyZmFjZS4KICAgICAvLyBhc0JpbmRlcigpIGlzIHNhZmUgb24gTlVMTCAocmV0dXJucyBOVUxMKQotICAgIGlmIChzdXJmYWNlLT5hc0JpbmRlcigpID09IG1TdXJmYWNlLT5hc0JpbmRlcigpKSB7CisgICAgaWYgKGdldElTdXJmYWNlKHN1cmZhY2UpLT5hc0JpbmRlcigpID09IG1TdXJmYWNlLT5hc0JpbmRlcigpKSB7CiAgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgfQogCkBAIC00OTYsNDQgKzQ5MSwyOCBAQAogICAgICAgICAgICAgLy8gRm9yY2UgdGhlIGRlc3RydWN0aW9uIG9mIGFueSBwcmV2aW91cyBvdmVybGF5CiAgICAgICAgICAgICBzcDxPdmVybGF5PiBkdW1teTsKICAgICAgICAgICAgIG1IYXJkd2FyZS0+c2V0T3ZlcmxheShkdW1teSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtU3VyZmFjZS0+dW5yZWdpc3RlckJ1ZmZlcnMoKTsKICAgICAgICAgfQogICAgIH0KLSAgICBtU3VyZmFjZSA9IHN1cmZhY2U7CisgICAgaWYgKHN1cmZhY2UgIT0gMCkgeworICAgICAgICBtU3VyZmFjZSA9IGdldElTdXJmYWNlKHN1cmZhY2UpOworICAgIH0gZWxzZSB7CisgICAgICAgIG1TdXJmYWNlID0gMDsKKyAgICB9CisgICAgbVByZXZpZXdXaW5kb3cgPSBzdXJmYWNlOwogICAgIG1PdmVybGF5UmVmID0gMDsKICAgICAvLyBJZiBwcmV2aWV3IGhhcyBiZWVuIGFscmVhZHkgc3RhcnRlZCwgc2V0IG92ZXJsYXkgb3IgcmVnaXN0ZXIgcHJldmlldwogICAgIC8vIGJ1ZmZlcnMgbm93LgogICAgIGlmIChtSGFyZHdhcmUtPnByZXZpZXdFbmFibGVkKCkpIHsKICAgICAgICAgaWYgKG1Vc2VPdmVybGF5KSB7CiAgICAgICAgICAgICByZXN1bHQgPSBzZXRPdmVybGF5KCk7Ci0gICAgICAgIH0gZWxzZSBpZiAobVN1cmZhY2UgIT0gMCkgewotICAgICAgICAgICAgcmVzdWx0ID0gcmVnaXN0ZXJQcmV2aWV3QnVmZmVycygpOworICAgICAgICB9IGVsc2UgaWYgKG1QcmV2aWV3V2luZG93ICE9IDApIHsKKyAgICAgICAgICAgIHJlc3VsdCA9IG1IYXJkd2FyZS0+c2V0UHJldmlld1dpbmRvdyhtUHJldmlld1dpbmRvdyk7CiAgICAgICAgIH0KICAgICB9CiAKICAgICByZXR1cm4gcmVzdWx0OwogfQogCi1zdGF0dXNfdCBDYW1lcmFTZXJ2aWNlOjpDbGllbnQ6OnJlZ2lzdGVyUHJldmlld0J1ZmZlcnMoKSB7Ci0gICAgaW50IHcsIGg7Ci0gICAgQ2FtZXJhUGFyYW1ldGVycyBwYXJhbXMobUhhcmR3YXJlLT5nZXRQYXJhbWV0ZXJzKCkpOwotICAgIHBhcmFtcy5nZXRQcmV2aWV3U2l6ZSgmdywgJmgpOwotCi0gICAgLy8gRklYTUU6IGRvbid0IHVzZSBhIGhhcmRjb2RlZCBmb3JtYXQgaGVyZS4KLSAgICBJU3VyZmFjZTo6QnVmZmVySGVhcCBidWZmZXJzKHcsIGgsIHcsIGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQUxfUElYRUxfRk9STUFUX1lDckNiXzQyMF9TUCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1PcmllbnRhdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtSGFyZHdhcmUtPmdldFByZXZpZXdIZWFwKCkpOwotCi0gICAgc3RhdHVzX3QgcmVzdWx0ID0gbVN1cmZhY2UtPnJlZ2lzdGVyQnVmZmVycyhidWZmZXJzKTsKLSAgICBpZiAocmVzdWx0ICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgIExPR0UoInJlZ2lzdGVyQnVmZmVycyBmYWlsZWQgd2l0aCBzdGF0dXMgJWQiLCByZXN1bHQpOwotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotfQotCiBzdGF0dXNfdCBDYW1lcmFTZXJ2aWNlOjpDbGllbnQ6OnNldE92ZXJsYXkoKSB7CiAgICAgaW50IHcsIGg7CiAgICAgQ2FtZXJhUGFyYW1ldGVycyBwYXJhbXMobUhhcmR3YXJlLT5nZXRQYXJhbWV0ZXJzKCkpOwpAQCAtNTkwLDE2ICs1NjksMTAgQEAKICAgICBpZiAoY2hlY2tQaWRBbmRIYXJkd2FyZSgpICE9IE5PX0VSUk9SKSByZXR1cm47CiAKICAgICBtUHJldmlld0NhbGxiYWNrRmxhZyA9IGNhbGxiYWNrX2ZsYWc7Ci0KLSAgICAvLyBJZiB3ZSBkb24ndCB1c2Ugb3ZlcmxheSwgd2UgYWx3YXlzIG5lZWQgdGhlIHByZXZpZXcgZnJhbWUgZm9yIGRpc3BsYXkuCi0gICAgLy8gSWYgd2UgZG8gdXNlIG92ZXJsYXksIHdlIG9ubHkgbmVlZCB0aGUgcHJldmlldyBmcmFtZSBpZiB0aGUgdXNlcgotICAgIC8vIHdhbnRzIHRoZSBkYXRhLgotICAgIGlmIChtVXNlT3ZlcmxheSkgewotICAgICAgICBpZihtUHJldmlld0NhbGxiYWNrRmxhZyAmIEZSQU1FX0NBTExCQUNLX0ZMQUdfRU5BQkxFX01BU0spIHsKLSAgICAgICAgICAgIGVuYWJsZU1zZ1R5cGUoQ0FNRVJBX01TR19QUkVWSUVXX0ZSQU1FKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGRpc2FibGVNc2dUeXBlKENBTUVSQV9NU0dfUFJFVklFV19GUkFNRSk7Ci0gICAgICAgIH0KKyAgICBpZiAobVByZXZpZXdDYWxsYmFja0ZsYWcgJiBGUkFNRV9DQUxMQkFDS19GTEFHX0VOQUJMRV9NQVNLKSB7CisgICAgICAgIGVuYWJsZU1zZ1R5cGUoQ0FNRVJBX01TR19QUkVWSUVXX0ZSQU1FKTsKKyAgICB9IGVsc2UgeworICAgICAgICBkaXNhYmxlTXNnVHlwZShDQU1FUkFfTVNHX1BSRVZJRVdfRlJBTUUpOwogICAgIH0KIH0KIApAQCAtNjI0LDE0ICs1OTcsMTQgQEAKIAogICAgIHN3aXRjaChtb2RlKSB7CiAgICAgICAgIGNhc2UgQ0FNRVJBX1BSRVZJRVdfTU9ERToKLSAgICAgICAgICAgIGlmIChtU3VyZmFjZSA9PSAwKSB7CisgICAgICAgICAgICBpZiAobVN1cmZhY2UgPT0gMCAmJiBtUHJldmlld1dpbmRvdyA9PSAwKSB7CiAgICAgICAgICAgICAgICAgTE9HMSgibVN1cmZhY2UgaXMgbm90IHNldCB5ZXQuIik7CiAgICAgICAgICAgICAgICAgLy8gc3RpbGwgYWJsZSB0byBzdGFydCBwcmV2aWV3IGluIHRoaXMgY2FzZS4KICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHJldHVybiBzdGFydFByZXZpZXdNb2RlKCk7CiAgICAgICAgIGNhc2UgQ0FNRVJBX1JFQ09SRElOR19NT0RFOgotICAgICAgICAgICAgaWYgKG1TdXJmYWNlID09IDApIHsKLSAgICAgICAgICAgICAgICBMT0dFKCJtU3VyZmFjZSBtdXN0IGJlIHNldCBiZWZvcmUgc3RhcnRSZWNvcmRpbmdNb2RlLiIpOworICAgICAgICAgICAgaWYgKG1TdXJmYWNlID09IDAgJiYgbVByZXZpZXdXaW5kb3cgPT0gMCkgeworICAgICAgICAgICAgICAgIExPR0UoIm1TdXJmYWNlIG9yIG1QcmV2aWV3V2luZG93IG11c3QgYmUgc2V0IGJlZm9yZSBzdGFydFJlY29yZGluZ01vZGUuIik7CiAgICAgICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgcmV0dXJuIHN0YXJ0UmVjb3JkaW5nTW9kZSgpOwpAQCAtNjU3LDE2ICs2MzAsOSBAQAogICAgICAgICBpZiAocmVzdWx0ICE9IE5PX0VSUk9SKSByZXR1cm4gcmVzdWx0OwogICAgICAgICByZXN1bHQgPSBtSGFyZHdhcmUtPnN0YXJ0UHJldmlldygpOwogICAgIH0gZWxzZSB7Ci0gICAgICAgIGVuYWJsZU1zZ1R5cGUoQ0FNRVJBX01TR19QUkVWSUVXX0ZSQU1FKTsKKyAgICAgICAgLy8gWFhYOiBTZXQgdGhlIG9yaWVudGF0aW9uIG9mIHRoZSBBTmF0aXZlV2luZG93LgorICAgICAgICBtSGFyZHdhcmUtPnNldFByZXZpZXdXaW5kb3cobVByZXZpZXdXaW5kb3cpOwogICAgICAgICByZXN1bHQgPSBtSGFyZHdhcmUtPnN0YXJ0UHJldmlldygpOwotICAgICAgICBpZiAocmVzdWx0ICE9IE5PX0VSUk9SKSByZXR1cm4gcmVzdWx0OwotICAgICAgICAvLyBJZiBwcmV2aWV3IGRpc3BsYXkgaGFzIGJlZW4gc2V0LCByZWdpc3RlciBwcmV2aWV3IGJ1ZmZlcnMgbm93LgotICAgICAgICBpZiAobVN1cmZhY2UgIT0gMCkgewotICAgICAgICAgICAvLyBVbnJlZ2lzdGVyIGhlcmUgYmVjYXVzZSB0aGUgc3VyZmFjZSBtYXkgYmUgcHJldmlvdXNseSByZWdpc3RlcmVkCi0gICAgICAgICAgIC8vIHdpdGggdGhlIHJhdyAoc25hcHNob3QpIGhlYXAuCi0gICAgICAgICAgIG1TdXJmYWNlLT51bnJlZ2lzdGVyQnVmZmVycygpOwotICAgICAgICAgICByZXN1bHQgPSByZWdpc3RlclByZXZpZXdCdWZmZXJzKCk7Ci0gICAgICAgIH0KICAgICB9CiAgICAgcmV0dXJuIHJlc3VsdDsKIH0KQEAgLTcwNCwxMyArNjcwLDEwIEBACiAgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOwogICAgIGlmIChjaGVja1BpZEFuZEhhcmR3YXJlKCkgIT0gTk9fRVJST1IpIHJldHVybjsKIAorCiAgICAgZGlzYWJsZU1zZ1R5cGUoQ0FNRVJBX01TR19QUkVWSUVXX0ZSQU1FKTsKICAgICBtSGFyZHdhcmUtPnN0b3BQcmV2aWV3KCk7CiAKLSAgICBpZiAobVN1cmZhY2UgIT0gMCAmJiAhbVVzZU92ZXJsYXkpIHsKLSAgICAgICAgbVN1cmZhY2UtPnVucmVnaXN0ZXJCdWZmZXJzKCk7Ci0gICAgfQotCiAgICAgbVByZXZpZXdCdWZmZXIuY2xlYXIoKTsKIH0KIApAQCAtODA4LDYgKzc3MSwzNSBAQAogICAgIHJldHVybiBwYXJhbXM7CiB9CiAKKy8vIGVuYWJsZSBzaHV0dGVyIHNvdW5kCitzdGF0dXNfdCBDYW1lcmFTZXJ2aWNlOjpDbGllbnQ6OmVuYWJsZVNodXR0ZXJTb3VuZChib29sIGVuYWJsZSkgeworICAgIExPRzEoImVuYWJsZVNodXR0ZXJTb3VuZCAocGlkICVkKSIsIGdldENhbGxpbmdQaWQoKSk7CisKKyAgICBzdGF0dXNfdCByZXN1bHQgPSBjaGVja1BpZEFuZEhhcmR3YXJlKCk7CisgICAgaWYgKHJlc3VsdCAhPSBOT19FUlJPUikgcmV0dXJuIHJlc3VsdDsKKworICAgIGlmIChlbmFibGUpIHsKKyAgICAgICAgbVBsYXlTaHV0dGVyU291bmQgPSB0cnVlOworICAgICAgICByZXR1cm4gT0s7CisgICAgfQorCisgICAgLy8gRGlzYWJsaW5nIHNodXR0ZXIgc291bmQgbWF5IG5vdCBiZSBhbGxvd2VkLiBJbiB0aGF0IGNhc2Ugb25seQorICAgIC8vIGFsbG93IHRoZSBtZWRpYXNlcnZlciBwcm9jZXNzIHRvIGRpc2FibGUgdGhlIHNvdW5kLgorICAgIGNoYXIgdmFsdWVbUFJPUEVSVFlfVkFMVUVfTUFYXTsKKyAgICBwcm9wZXJ0eV9nZXQoInJvLmNhbWVyYS5zb3VuZC5mb3JjZWQiLCB2YWx1ZSwgIjAiKTsKKyAgICBpZiAoc3RyY21wKHZhbHVlLCAiMCIpICE9IDApIHsKKyAgICAgICAgLy8gRGlzYWJsaW5nIHNodXR0ZXIgc291bmQgaXMgbm90IGFsbG93ZWQuIERlbnkgaWYgdGhlIGN1cnJlbnQKKyAgICAgICAgLy8gcHJvY2VzcyBpcyBub3QgbWVkaWFzZXJ2ZXIuCisgICAgICAgIGlmIChnZXRDYWxsaW5nUGlkKCkgIT0gZ2V0cGlkKCkpIHsKKyAgICAgICAgICAgIExPR0UoIkZhaWxlZCB0byBkaXNhYmxlIHNodXR0ZXIgc291bmQuIFBlcm1pc3Npb24gZGVuaWVkIChwaWQgJWQpIiwgZ2V0Q2FsbGluZ1BpZCgpKTsKKyAgICAgICAgICAgIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKKyAgICAgICAgfQorICAgIH0KKworICAgIG1QbGF5U2h1dHRlclNvdW5kID0gZmFsc2U7CisgICAgcmV0dXJuIE9LOworfQorCiBzdGF0dXNfdCBDYW1lcmFTZXJ2aWNlOjpDbGllbnQ6OnNlbmRDb21tYW5kKGludDMyX3QgY21kLCBpbnQzMl90IGFyZzEsIGludDMyX3QgYXJnMikgewogICAgIExPRzEoInNlbmRDb21tYW5kIChwaWQgJWQpIiwgZ2V0Q2FsbGluZ1BpZCgpKTsKICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7CkBAIC04MzYsNiArODI4LDIwIEBACiAgICAgICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICAgICAgfQogICAgICAgICByZXR1cm4gT0s7CisgICAgfSBlbHNlIGlmIChjbWQgPT0gQ0FNRVJBX0NNRF9FTkFCTEVfU0hVVFRFUl9TT1VORCkgeworICAgICAgICBzd2l0Y2ggKGFyZzEpIHsKKyAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICBlbmFibGVTaHV0dGVyU291bmQoZmFsc2UpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgICAgIGVuYWJsZVNodXR0ZXJTb3VuZCh0cnVlKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gT0s7CisgICAgfSBlbHNlIGlmIChjbWQgPT0gQ0FNRVJBX0NNRF9QTEFZX1JFQ09SRElOR19TT1VORCkgeworICAgICAgICBtQ2FtZXJhU2VydmljZS0+cGxheVNvdW5kKFNPVU5EX1JFQ09SRElORyk7CiAgICAgfQogCiAgICAgcmV0dXJuIG1IYXJkd2FyZS0+c2VuZENvbW1hbmQoY21kLCBhcmcxLCBhcmcyKTsKQEAgLTk5NiwxMSArMTAwMiw4IEBACiAvLyAic2l6ZSIgaXMgdGhlIHdpZHRoIGFuZCBoZWlnaHQgb2YgeXV2IHBpY3R1cmUgZm9yIHJlZ2lzdGVyQnVmZmVyLgogLy8gSWYgaXQgaXMgTlVMTCwgdXNlIHRoZSBwaWN0dXJlIHNpemUgZnJvbSBwYXJhbWV0ZXJzLgogdm9pZCBDYW1lcmFTZXJ2aWNlOjpDbGllbnQ6OmhhbmRsZVNodXR0ZXIoaW1hZ2VfcmVjdF90eXBlICpzaXplKSB7Ci0gICAgbUNhbWVyYVNlcnZpY2UtPnBsYXlTb3VuZChTT1VORF9TSFVUVEVSKTsKLQotICAgIC8vIFNjcmVlbiBnb2VzIGJsYWNrIGFmdGVyIHRoZSBidWZmZXIgaXMgdW5yZWdpc3RlcmVkLgotICAgIGlmIChtU3VyZmFjZSAhPSAwICYmICFtVXNlT3ZlcmxheSkgewotICAgICAgICBtU3VyZmFjZS0+dW5yZWdpc3RlckJ1ZmZlcnMoKTsKKyAgICBpZiAobVBsYXlTaHV0dGVyU291bmQpIHsKKyAgICAgICAgbUNhbWVyYVNlcnZpY2UtPnBsYXlTb3VuZChTT1VORF9TSFVUVEVSKTsKICAgICB9CiAKICAgICBzcDxJQ2FtZXJhQ2xpZW50PiBjID0gbUNhbWVyYUNsaWVudDsKQEAgLTEwMzAsNyArMTAzMyw2IEBACiAgICAgICAgICAgICBIQUxfUElYRUxfRk9STUFUX1lDckNiXzQyMF9TUCwgbU9yaWVudGF0aW9uLCAwLAogICAgICAgICAgICAgbUhhcmR3YXJlLT5nZXRSYXdIZWFwKCkpOwogCi0gICAgICAgIG1TdXJmYWNlLT5yZWdpc3RlckJ1ZmZlcnMoYnVmZmVycyk7CiAgICAgICAgIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmZsdXNoQ29tbWFuZHMoKTsKICAgICB9CiAKQEAgLTEwNDMsMTIgKzEwNDUsNiBAQAogICAgIHNpemVfdCBzaXplOwogICAgIHNwPElNZW1vcnlIZWFwPiBoZWFwID0gbWVtLT5nZXRNZW1vcnkoJm9mZnNldCwgJnNpemUpOwogCi0gICAgaWYgKCFtVXNlT3ZlcmxheSkgewotICAgICAgICBpZiAobVN1cmZhY2UgIT0gMCkgewotICAgICAgICAgICAgbVN1cmZhY2UtPnBvc3RCdWZmZXIob2Zmc2V0KTsKLSAgICAgICAgfQotICAgIH0KLQogICAgIC8vIGxvY2FsIGNvcHkgb2YgdGhlIGNhbGxiYWNrIGZsYWdzCiAgICAgaW50IGZsYWdzID0gbVByZXZpZXdDYWxsYmFja0ZsYWc7CiAKQEAgLTEwNjksOSArMTA2NSw3IEBACiAgICAgICAgIG1QcmV2aWV3Q2FsbGJhY2tGbGFnICY9IH4oRlJBTUVfQ0FMTEJBQ0tfRkxBR19PTkVfU0hPVF9NQVNLIHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUkFNRV9DQUxMQkFDS19GTEFHX0NPUFlfT1VUX01BU0sgfAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZSQU1FX0NBTExCQUNLX0ZMQUdfRU5BQkxFX01BU0spOwotICAgICAgICBpZiAobVVzZU92ZXJsYXkpIHsKLSAgICAgICAgICAgIGRpc2FibGVNc2dUeXBlKENBTUVSQV9NU0dfUFJFVklFV19GUkFNRSk7Ci0gICAgICAgIH0KKyAgICAgICAgZGlzYWJsZU1zZ1R5cGUoQ0FNRVJBX01TR19QUkVWSUVXX0ZSQU1FKTsKICAgICB9CiAKICAgICBpZiAoYyAhPSAwKSB7CkBAIC0xMTA4LDExICsxMTAyLDYgQEAKICAgICBzaXplX3Qgc2l6ZTsKICAgICBzcDxJTWVtb3J5SGVhcD4gaGVhcCA9IG1lbS0+Z2V0TWVtb3J5KCZvZmZzZXQsICZzaXplKTsKIAotICAgIC8vIFB1dCB0aGUgWVVWIHZlcnNpb24gb2YgdGhlIHNuYXBzaG90IGluIHRoZSBwcmV2aWV3IGRpc3BsYXkuCi0gICAgaWYgKG1TdXJmYWNlICE9IDAgJiYgIW1Vc2VPdmVybGF5KSB7Ci0gICAgICAgIG1TdXJmYWNlLT5wb3N0QnVmZmVyKG9mZnNldCk7Ci0gICAgfQotCiAgICAgc3A8SUNhbWVyYUNsaWVudD4gYyA9IG1DYW1lcmFDbGllbnQ7CiAgICAgbUxvY2sudW5sb2NrKCk7CiAgICAgaWYgKGMgIT0gMCkgewpAQCAtMTI3MCw0ICsxMjU5LDEyIEBACiAgICAgcmV0dXJuIE5PX0VSUk9SOwogfQogCitzcDxJU3VyZmFjZT4gQ2FtZXJhU2VydmljZTo6Z2V0SVN1cmZhY2UoY29uc3Qgc3A8U3VyZmFjZT4mIHN1cmZhY2UpIHsKKyAgICBpZiAoc3VyZmFjZSAhPSAwKSB7CisgICAgICAgIHJldHVybiBzdXJmYWNlLT5nZXRJU3VyZmFjZSgpOworICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiBzcDxJU3VyZmFjZT4oMCk7CisgICAgfQorfQorCiB9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvQ2FtZXJhU2VydmljZS5oIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvQ2FtZXJhU2VydmljZS5oCmluZGV4IDBkNjk4MzYuLjJiNWM1MTEgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL0NhbWVyYVNlcnZpY2UuaAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9DYW1lcmFTZXJ2aWNlLmgKQEAgLTc5LDYgKzc5LDEyIEBACiAgICAgc3A8TWVkaWFQbGF5ZXI+ICAgICBtU291bmRQbGF5ZXJbTlVNX1NPVU5EU107CiAgICAgaW50ICAgICAgICAgICAgICAgICBtU291bmRSZWY7ICAvLyByZWZlcmVuY2UgY291bnQgKHJlbGVhc2UgYWxsIE1lZGlhUGxheWVyIHdoZW4gMCkKIAorICAgIC8vIFVzZWQgYnkgQ2xpZW50IG9iamVjdHMgdG8gZXh0cmFjdCB0aGUgSVN1cmZhY2UgZnJvbSBhIFN1cmZhY2Ugb2JqZWN0LgorICAgIC8vIFRoaXMgaXMgdXNlZCBiZWNhdXNlIG1ha2luZyBDbGllbnQgYSBmcmllbmQgY2xhc3Mgb2YgU3VyZmFjZSB3b3VsZAorICAgIC8vIHJlcXVpcmUgaW5jbHVkaW5nIHRoaXMgaGVhZGVyIGluIFN1cmZhY2UuaCBzaW5jZSBDbGllbnQgaXMgYSBuZXN0ZWQKKyAgICAvLyBjbGFzcy4KKyAgICBzdGF0aWMgc3A8SVN1cmZhY2U+IGdldElTdXJmYWNlKGNvbnN0IHNwPFN1cmZhY2U+JiBzdXJmYWNlKTsKKwogICAgIGNsYXNzIENsaWVudCA6IHB1YmxpYyBCbkNhbWVyYQogICAgIHsKICAgICBwdWJsaWM6CkBAIC04Nyw3ICs5Myw3IEBACiAgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICAgIGNvbm5lY3QoY29uc3Qgc3A8SUNhbWVyYUNsaWVudD4mIGNsaWVudCk7CiAgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICAgIGxvY2soKTsKICAgICAgICAgdmlydHVhbCBzdGF0dXNfdCAgICAgICAgdW5sb2NrKCk7Ci0gICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICAgIHNldFByZXZpZXdEaXNwbGF5KGNvbnN0IHNwPElTdXJmYWNlPiYgc3VyZmFjZSk7CisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICAgIHNldFByZXZpZXdEaXNwbGF5KGNvbnN0IHNwPFN1cmZhY2U+JiBzdXJmYWNlKTsKICAgICAgICAgdmlydHVhbCB2b2lkICAgICAgICAgICAgc2V0UHJldmlld0NhbGxiYWNrRmxhZyhpbnQgZmxhZyk7CiAgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICAgIHN0YXJ0UHJldmlldygpOwogICAgICAgICB2aXJ0dWFsIHZvaWQgICAgICAgICAgICBzdG9wUHJldmlldygpOwpAQCAtMTMyLDYgKzEzOCw5IEBACiAgICAgICAgIHN0YXR1c190ICAgICAgICAgICAgICAgIHN0YXJ0UHJldmlld01vZGUoKTsKICAgICAgICAgc3RhdHVzX3QgICAgICAgICAgICAgICAgc3RhcnRSZWNvcmRpbmdNb2RlKCk7CiAKKyAgICAgICAgLy8gaW50ZXJuYWwgZnVuY3Rpb24gdXNlZCBieSBzZW5kQ29tbWFuZCB0byBlbmFibGUvZGlzYWJsZSBzaHV0dGVyIHNvdW5kLgorICAgICAgICBzdGF0dXNfdCAgICAgICAgICAgICAgICBlbmFibGVTaHV0dGVyU291bmQoYm9vbCBlbmFibGUpOworCiAgICAgICAgIC8vIHRoZXNlIGFyZSBzdGF0aWMgY2FsbGJhY2sgZnVuY3Rpb25zCiAgICAgICAgIHN0YXRpYyB2b2lkICAgICAgICAgICAgIG5vdGlmeUNhbGxiYWNrKGludDMyX3QgbXNnVHlwZSwgaW50MzJfdCBleHQxLCBpbnQzMl90IGV4dDIsIHZvaWQqIHVzZXIpOwogICAgICAgICBzdGF0aWMgdm9pZCAgICAgICAgICAgICBkYXRhQ2FsbGJhY2soaW50MzJfdCBtc2dUeXBlLCBjb25zdCBzcDxJTWVtb3J5PiYgZGF0YVB0ciwgdm9pZCogdXNlcik7CkBAIC0xNjUsMTAgKzE3NCwxMiBAQAogICAgICAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1PdmVybGF5SDsKICAgICAgICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtUHJldmlld0NhbGxiYWNrRmxhZzsKICAgICAgICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtT3JpZW50YXRpb247CisgICAgICAgIGJvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVBsYXlTaHV0dGVyU291bmQ7CiAKICAgICAgICAgLy8gRW5zdXJlcyBhdG9taWNpdHkgYW1vbmcgdGhlIHB1YmxpYyBtZXRob2RzCiAgICAgICAgIG11dGFibGUgTXV0ZXggICAgICAgICAgICAgICAgICAgbUxvY2s7CiAgICAgICAgIHNwPElTdXJmYWNlPiAgICAgICAgICAgICAgICAgICAgbVN1cmZhY2U7CisgICAgICAgIHNwPEFOYXRpdmVXaW5kb3c+ICAgICAgICAgICAgICAgbVByZXZpZXdXaW5kb3c7CiAKICAgICAgICAgLy8gSWYgdGhlIHVzZXIgd2FudCB1cyB0byByZXR1cm4gYSBjb3B5IG9mIHRoZSBwcmV2aWV3IGZyYW1lIChpbnN0ZWFkCiAgICAgICAgIC8vIG9mIHRoZSBvcmlnaW5hbCBvbmUpLCB3ZSBhbGxvY2F0ZSBtUHJldmlld0J1ZmZlciBhbmQgcmV1c2UgaXQgaWYgcG9zc2libGUuCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9BY2Nlc3NpYmlsaXR5TWFuYWdlclNlcnZpY2UuamF2YSBiL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL0FjY2Vzc2liaWxpdHlNYW5hZ2VyU2VydmljZS5qYXZhCmluZGV4IDg3ZGU3OWEuLjgzY2UzZTMgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL0FjY2Vzc2liaWxpdHlNYW5hZ2VyU2VydmljZS5qYXZhCisrKyBiL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL0FjY2Vzc2liaWxpdHlNYW5hZ2VyU2VydmljZS5qYXZhCkBAIC0yNjksMTQgKzI2OSwxMCBAQAogICAgICAgICAgICAgfSk7CiAgICAgfQogCi0gICAgcHVibGljIHZvaWQgYWRkQ2xpZW50KElBY2Nlc3NpYmlsaXR5TWFuYWdlckNsaWVudCBjbGllbnQpIHsKKyAgICBwdWJsaWMgYm9vbGVhbiBhZGRDbGllbnQoSUFjY2Vzc2liaWxpdHlNYW5hZ2VyQ2xpZW50IGNsaWVudCkgewogICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGNsaWVudC5zZXRFbmFibGVkKG1Jc0VuYWJsZWQpOwotICAgICAgICAgICAgICAgIG1DbGllbnRzLmFkZChjbGllbnQpOwotICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIHJlKSB7Ci0gICAgICAgICAgICAgICAgU2xvZy53KExPR19UQUcsICJEZWFkIEFjY2Vzc2liaWxpdHlNYW5hZ2VyQ2xpZW50OiAiICsgY2xpZW50LCByZSk7Ci0gICAgICAgICAgICB9CisgICAgICAgICAgICBtQ2xpZW50cy5hZGQoY2xpZW50KTsKKyAgICAgICAgICAgIHJldHVybiBtSXNFbmFibGVkOwogICAgICAgICB9CiAgICAgfQogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9BcHBXaWRnZXRTZXJ2aWNlLmphdmEgYi9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9BcHBXaWRnZXRTZXJ2aWNlLmphdmEKaW5kZXggNzMxZmIyMi4uNWVmM2QzNSAxMDA2NDQKLS0tIGEvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvQXBwV2lkZ2V0U2VydmljZS5qYXZhCisrKyBiL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL0FwcFdpZGdldFNlcnZpY2UuamF2YQpAQCAtNDI2LDYgKzQyNiw0MCBAQAogICAgICAgICB9CiAgICAgfQogCisgICAgcHVibGljIHZvaWQgcGFydGlhbGx5VXBkYXRlQXBwV2lkZ2V0SWRzKGludFtdIGFwcFdpZGdldElkcywgUmVtb3RlVmlld3Mgdmlld3MpIHsKKyAgICAgICAgaWYgKGFwcFdpZGdldElkcyA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgaWYgKGFwcFdpZGdldElkcy5sZW5ndGggPT0gMCkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGZpbmFsIGludCBOID0gYXBwV2lkZ2V0SWRzLmxlbmd0aDsKKworICAgICAgICBzeW5jaHJvbml6ZWQgKG1BcHBXaWRnZXRJZHMpIHsKKyAgICAgICAgICAgIGZvciAoaW50IGk9MDsgaTxOOyBpKyspIHsKKyAgICAgICAgICAgICAgICBBcHBXaWRnZXRJZCBpZCA9IGxvb2t1cEFwcFdpZGdldElkTG9ja2VkKGFwcFdpZGdldElkc1tpXSk7CisgICAgICAgICAgICAgICAgdXBkYXRlQXBwV2lkZ2V0SW5zdGFuY2VMb2NrZWQoaWQsIHZpZXdzLCB0cnVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIG5vdGlmeUFwcFdpZGdldFZpZXdEYXRhQ2hhbmdlZChpbnRbXSBhcHBXaWRnZXRJZHMsIGludCB2aWV3SWQpIHsKKyAgICAgICAgaWYgKGFwcFdpZGdldElkcyA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgaWYgKGFwcFdpZGdldElkcy5sZW5ndGggPT0gMCkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGZpbmFsIGludCBOID0gYXBwV2lkZ2V0SWRzLmxlbmd0aDsKKworICAgICAgICBzeW5jaHJvbml6ZWQgKG1BcHBXaWRnZXRJZHMpIHsKKyAgICAgICAgICAgIGZvciAoaW50IGk9MDsgaTxOOyBpKyspIHsKKyAgICAgICAgICAgICAgICBBcHBXaWRnZXRJZCBpZCA9IGxvb2t1cEFwcFdpZGdldElkTG9ja2VkKGFwcFdpZGdldElkc1tpXSk7CisgICAgICAgICAgICAgICAgbm90aWZ5QXBwV2lkZ2V0Vmlld0RhdGFDaGFuZ2VkSW5zdGFuY2VMb2NrZWQoaWQsIHZpZXdJZCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKICAgICBwdWJsaWMgdm9pZCB1cGRhdGVBcHBXaWRnZXRQcm92aWRlcihDb21wb25lbnROYW1lIHByb3ZpZGVyLCBSZW1vdGVWaWV3cyB2aWV3cykgewogICAgICAgICBzeW5jaHJvbml6ZWQgKG1BcHBXaWRnZXRJZHMpIHsKICAgICAgICAgICAgIFByb3ZpZGVyIHAgPSBsb29rdXBQcm92aWRlckxvY2tlZChwcm92aWRlcik7CkBAIC00NDMsMTEgKzQ3NywxNyBAQAogICAgIH0KIAogICAgIHZvaWQgdXBkYXRlQXBwV2lkZ2V0SW5zdGFuY2VMb2NrZWQoQXBwV2lkZ2V0SWQgaWQsIFJlbW90ZVZpZXdzIHZpZXdzKSB7CisgICAgICAgIHVwZGF0ZUFwcFdpZGdldEluc3RhbmNlTG9ja2VkKGlkLCB2aWV3cywgZmFsc2UpOworICAgIH0KKworICAgIHZvaWQgdXBkYXRlQXBwV2lkZ2V0SW5zdGFuY2VMb2NrZWQoQXBwV2lkZ2V0SWQgaWQsIFJlbW90ZVZpZXdzIHZpZXdzLCBib29sZWFuIGlzUGFydGlhbFVwZGF0ZSkgewogICAgICAgICAvLyBhbGxvdyBmb3Igc3RhbGUgYXBwV2lkZ2V0SWRzIGFuZCBvdGhlciBiYWRuZXNzCiAgICAgICAgIC8vIGxvb2t1cCBhbHNvIGNoZWNrcyB0aGF0IHRoZSBjYWxsaW5nIHByb2Nlc3MgY2FuIGFjY2VzcyB0aGUgYXBwV2lkZ2V0SWQKICAgICAgICAgLy8gZHJvcCB1bmJvdW5kIGFwcFdpZGdldElkcyAoc2hvdWxkbid0IGJlIHBvc3NpYmxlIHVuZGVyIG5vcm1hbCBjaXJjdW1zdGFuY2VzKQogICAgICAgICBpZiAoaWQgIT0gbnVsbCAmJiBpZC5wcm92aWRlciAhPSBudWxsICYmICFpZC5wcm92aWRlci56b21iaWUgJiYgIWlkLmhvc3Quem9tYmllKSB7Ci0gICAgICAgICAgICBpZC52aWV3cyA9IHZpZXdzOworCisgICAgICAgICAgICAvLyBXZSBkbyBub3Qgd2FudCB0byBzYXZlIHRoaXMgUmVtb3RlVmlld3MKKyAgICAgICAgICAgIGlmICghaXNQYXJ0aWFsVXBkYXRlKSBpZC52aWV3cyA9IHZpZXdzOwogCiAgICAgICAgICAgICAvLyBpcyBhbnlvbmUgbGlzdGVuaW5nPwogICAgICAgICAgICAgaWYgKGlkLmhvc3QuY2FsbGJhY2tzICE9IG51bGwpIHsKQEAgLTQ2Myw2ICs1MDMsMjUgQEAKICAgICAgICAgfQogICAgIH0KIAorICAgIHZvaWQgbm90aWZ5QXBwV2lkZ2V0Vmlld0RhdGFDaGFuZ2VkSW5zdGFuY2VMb2NrZWQoQXBwV2lkZ2V0SWQgaWQsIGludCB2aWV3SWQpIHsKKyAgICAgICAgLy8gYWxsb3cgZm9yIHN0YWxlIGFwcFdpZGdldElkcyBhbmQgb3RoZXIgYmFkbmVzcworICAgICAgICAvLyBsb29rdXAgYWxzbyBjaGVja3MgdGhhdCB0aGUgY2FsbGluZyBwcm9jZXNzIGNhbiBhY2Nlc3MgdGhlIGFwcFdpZGdldElkCisgICAgICAgIC8vIGRyb3AgdW5ib3VuZCBhcHBXaWRnZXRJZHMgKHNob3VsZG4ndCBiZSBwb3NzaWJsZSB1bmRlciBub3JtYWwgY2lyY3Vtc3RhbmNlcykKKyAgICAgICAgaWYgKGlkICE9IG51bGwgJiYgaWQucHJvdmlkZXIgIT0gbnVsbCAmJiAhaWQucHJvdmlkZXIuem9tYmllICYmICFpZC5ob3N0LnpvbWJpZSkgeworICAgICAgICAgICAgLy8gaXMgYW55b25lIGxpc3RlbmluZz8KKyAgICAgICAgICAgIGlmIChpZC5ob3N0LmNhbGxiYWNrcyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgLy8gdGhlIGxvY2sgaXMgaGVsZCwgYnV0IHRoaXMgaXMgYSBvbmV3YXkgY2FsbAorICAgICAgICAgICAgICAgICAgICBpZC5ob3N0LmNhbGxiYWNrcy52aWV3RGF0YUNoYW5nZWQoaWQuYXBwV2lkZ2V0SWQsIHZpZXdJZCk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gSXQgZmFpbGVkOyByZW1vdmUgdGhlIGNhbGxiYWNrLiBObyBuZWVkIHRvIHBydW5lIGJlY2F1c2UKKyAgICAgICAgICAgICAgICAgICAgLy8gd2Uga25vdyB0aGF0IHRoaXMgaG9zdCBpcyBzdGlsbCByZWZlcmVuY2VkIGJ5IHRoaXMgaW5zdGFuY2UuCisgICAgICAgICAgICAgICAgICAgIGlkLmhvc3QuY2FsbGJhY2tzID0gbnVsbDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKICAgICBwdWJsaWMgaW50W10gc3RhcnRMaXN0ZW5pbmcoSUFwcFdpZGdldEhvc3QgY2FsbGJhY2tzLCBTdHJpbmcgcGFja2FnZU5hbWUsIGludCBob3N0SWQsCiAgICAgICAgICAgICBMaXN0PFJlbW90ZVZpZXdzPiB1cGRhdGVkVmlld3MpIHsKICAgICAgICAgaW50IGNhbGxpbmdVaWQgPSBlbmZvcmNlQ2FsbGluZ1VpZChwYWNrYWdlTmFtZSk7CkBAIC03NDIsNiArODAxLDkgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGluZm8ubGFiZWwgPSBhY3Rpdml0eUluZm8ubG9hZExhYmVsKG1QYWNrYWdlTWFuYWdlcikudG9TdHJpbmcoKTsKICAgICAgICAgICAgIGluZm8uaWNvbiA9IHJpLmdldEljb25SZXNvdXJjZSgpOworICAgICAgICAgICAgaW5mby5wcmV2aWV3SW1hZ2UgPSBzYS5nZXRSZXNvdXJjZUlkKAorICAgICAgICAgICAgCQljb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZS5BcHBXaWRnZXRQcm92aWRlckluZm9fcHJldmlld0ltYWdlLCAwKTsKKwogICAgICAgICAgICAgc2EucmVjeWNsZSgpOwogICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewogICAgICAgICAgICAgLy8gT2sgdG8gY2F0Y2ggRXhjZXB0aW9uIGhlcmUsIGJlY2F1c2UgYW55dGhpbmcgZ29pbmcgd3JvbmcgYmVjYXVzZQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvQ2xpcGJvYXJkU2VydmljZS5qYXZhIGIvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvQ2xpcGJvYXJkU2VydmljZS5qYXZhCmluZGV4IGFhOGNkZWQuLjMwOGM5YzAgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL0NsaXBib2FyZFNlcnZpY2UuamF2YQorKysgYi9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9DbGlwYm9hcmRTZXJ2aWNlLmphdmEKQEAgLTE2LDQyICsxNiw4NCBAQAogCiBwYWNrYWdlIGNvbS5hbmRyb2lkLnNlcnZlcjsKIAotaW1wb3J0IGFuZHJvaWQudGV4dC5JQ2xpcGJvYXJkOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5DbGlwRGF0YTsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ2xpcERlc2NyaXB0aW9uOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5JQ2xpcGJvYXJkOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5JT25QcmltYXJ5Q2xpcENoYW5nZWRMaXN0ZW5lcjsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLm9zLlJlbW90ZUNhbGxiYWNrTGlzdDsKK2ltcG9ydCBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbjsKIAogLyoqCiAgKiBJbXBsZW1lbnRhdGlvbiBvZiB0aGUgY2xpcGJvYXJkIGZvciBjb3B5IGFuZCBwYXN0ZS4KICAqLwogcHVibGljIGNsYXNzIENsaXBib2FyZFNlcnZpY2UgZXh0ZW5kcyBJQ2xpcGJvYXJkLlN0dWIgewotICAgIHByaXZhdGUgQ2hhclNlcXVlbmNlIG1DbGlwYm9hcmQgPSAiIjsKKyAgICBwcml2YXRlIENsaXBEYXRhIG1QcmltYXJ5Q2xpcDsKKyAgICBwcml2YXRlIGZpbmFsIFJlbW90ZUNhbGxiYWNrTGlzdDxJT25QcmltYXJ5Q2xpcENoYW5nZWRMaXN0ZW5lcj4gbVByaW1hcnlDbGlwTGlzdGVuZXJzCisgICAgICAgICAgICA9IG5ldyBSZW1vdGVDYWxsYmFja0xpc3Q8SU9uUHJpbWFyeUNsaXBDaGFuZ2VkTGlzdGVuZXI+KCk7CiAKICAgICAvKioKICAgICAgKiBJbnN0YW50aWF0ZXMgdGhlIGNsaXBib2FyZC4KICAgICAgKi8KICAgICBwdWJsaWMgQ2xpcGJvYXJkU2VydmljZShDb250ZXh0IGNvbnRleHQpIHsgfQogCi0gICAgLy8gamF2YWRvYyBmcm9tIGludGVyZmFjZQotICAgIHB1YmxpYyB2b2lkIHNldENsaXBib2FyZFRleHQoQ2hhclNlcXVlbmNlIHRleHQpIHsKKyAgICBwdWJsaWMgdm9pZCBzZXRQcmltYXJ5Q2xpcChDbGlwRGF0YSBjbGlwKSB7CiAgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgewotICAgICAgICAgICAgaWYgKHRleHQgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRleHQgPSAiIjsKKyAgICAgICAgICAgIGlmIChjbGlwICE9IG51bGwgJiYgY2xpcC5nZXRJdGVtQ291bnQoKSA8PSAwKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiTm8gaXRlbXMiKTsKICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1QcmltYXJ5Q2xpcCA9IGNsaXA7CisgICAgICAgICAgICBmaW5hbCBpbnQgbiA9IG1QcmltYXJ5Q2xpcExpc3RlbmVycy5iZWdpbkJyb2FkY2FzdCgpOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuOyBpKyspIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBtUHJpbWFyeUNsaXBMaXN0ZW5lcnMuZ2V0QnJvYWRjYXN0SXRlbShpKS5kaXNwYXRjaFByaW1hcnlDbGlwQ2hhbmdlZCgpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisKKyAgICAgICAgICAgICAgICAgICAgLy8gVGhlIFJlbW90ZUNhbGxiYWNrTGlzdCB3aWxsIHRha2UgY2FyZSBvZiByZW1vdmluZworICAgICAgICAgICAgICAgICAgICAvLyB0aGUgZGVhZCBvYmplY3QgZm9yIHVzLgorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1QcmltYXJ5Q2xpcExpc3RlbmVycy5maW5pc2hCcm9hZGNhc3QoKTsKKyAgICAgICAgfQorICAgIH0KICAgICAKLSAgICAgICAgICAgIG1DbGlwYm9hcmQgPSB0ZXh0OwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8gamF2YWRvYyBmcm9tIGludGVyZmFjZQotICAgIHB1YmxpYyBDaGFyU2VxdWVuY2UgZ2V0Q2xpcGJvYXJkVGV4dCgpIHsKKyAgICBwdWJsaWMgQ2xpcERhdGEgZ2V0UHJpbWFyeUNsaXAoKSB7CiAgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgewotICAgICAgICAgICAgcmV0dXJuIG1DbGlwYm9hcmQ7CisgICAgICAgICAgICByZXR1cm4gbVByaW1hcnlDbGlwOwogICAgICAgICB9CiAgICAgfQogCi0gICAgLy8gamF2YWRvYyBmcm9tIGludGVyZmFjZQorICAgIHB1YmxpYyBDbGlwRGVzY3JpcHRpb24gZ2V0UHJpbWFyeUNsaXBEZXNjcmlwdGlvbigpIHsKKyAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IENsaXBEZXNjcmlwdGlvbihtUHJpbWFyeUNsaXApOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaGFzUHJpbWFyeUNsaXAoKSB7CisgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgeworICAgICAgICAgICAgcmV0dXJuIG1QcmltYXJ5Q2xpcCAhPSBudWxsOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgYWRkUHJpbWFyeUNsaXBDaGFuZ2VkTGlzdGVuZXIoSU9uUHJpbWFyeUNsaXBDaGFuZ2VkTGlzdGVuZXIgbGlzdGVuZXIpIHsKKyAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7CisgICAgICAgICAgICBtUHJpbWFyeUNsaXBMaXN0ZW5lcnMucmVnaXN0ZXIobGlzdGVuZXIpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgcmVtb3ZlUHJpbWFyeUNsaXBDaGFuZ2VkTGlzdGVuZXIoSU9uUHJpbWFyeUNsaXBDaGFuZ2VkTGlzdGVuZXIgbGlzdGVuZXIpIHsKKyAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7CisgICAgICAgICAgICBtUHJpbWFyeUNsaXBMaXN0ZW5lcnMudW5yZWdpc3RlcihsaXN0ZW5lcik7CisgICAgICAgIH0KKyAgICB9CisKICAgICBwdWJsaWMgYm9vbGVhbiBoYXNDbGlwYm9hcmRUZXh0KCkgewogICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKLSAgICAgICAgICAgIHJldHVybiBtQ2xpcGJvYXJkLmxlbmd0aCgpID4gMDsKKyAgICAgICAgICAgIGlmIChtUHJpbWFyeUNsaXAgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIENoYXJTZXF1ZW5jZSB0ZXh0ID0gbVByaW1hcnlDbGlwLmdldEl0ZW0oMCkuZ2V0VGV4dCgpOworICAgICAgICAgICAgICAgIHJldHVybiB0ZXh0ICE9IG51bGwgJiYgdGV4dC5sZW5ndGgoKSA+IDA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KICAgICB9CiB9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9Db25uZWN0aXZpdHlTZXJ2aWNlLmphdmEgYi9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9Db25uZWN0aXZpdHlTZXJ2aWNlLmphdmEKaW5kZXggNzJlNzQzNS4uOTZhMjM5ZCAxMDA2NDQKLS0tIGEvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvQ29ubmVjdGl2aXR5U2VydmljZS5qYXZhCisrKyBiL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL0Nvbm5lY3Rpdml0eVNlcnZpY2UuamF2YQpAQCAtMjYsMTQgKzI2LDE4IEBACiBpbXBvcnQgYW5kcm9pZC5uZXQuSUNvbm5lY3Rpdml0eU1hbmFnZXI7CiBpbXBvcnQgYW5kcm9pZC5uZXQuTW9iaWxlRGF0YVN0YXRlVHJhY2tlcjsKIGltcG9ydCBhbmRyb2lkLm5ldC5OZXR3b3JrSW5mbzsKK2ltcG9ydCBhbmRyb2lkLm5ldC5MaW5rUHJvcGVydGllczsKIGltcG9ydCBhbmRyb2lkLm5ldC5OZXR3b3JrU3RhdGVUcmFja2VyOwogaW1wb3J0IGFuZHJvaWQubmV0Lk5ldHdvcmtVdGlsczsKIGltcG9ydCBhbmRyb2lkLm5ldC53aWZpLldpZmlTdGF0ZVRyYWNrZXI7CitpbXBvcnQgYW5kcm9pZC5uZXQuTmV0d29ya1V0aWxzOwogaW1wb3J0IGFuZHJvaWQub3MuQmluZGVyOwogaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXJUaHJlYWQ7CiBpbXBvcnQgYW5kcm9pZC5vcy5JQmluZGVyOwogaW1wb3J0IGFuZHJvaWQub3MuTG9vcGVyOwogaW1wb3J0IGFuZHJvaWQub3MuTWVzc2FnZTsKK2ltcG9ydCBhbmRyb2lkLm9zLlBvd2VyTWFuYWdlcjsKIGltcG9ydCBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbjsKIGltcG9ydCBhbmRyb2lkLm9zLlNlcnZpY2VNYW5hZ2VyOwogaW1wb3J0IGFuZHJvaWQub3MuU3lzdGVtUHJvcGVydGllczsKQEAgLTQ3LDggKzUxLDEzIEBACiBpbXBvcnQgY29tLmFuZHJvaWQuc2VydmVyLmNvbm5lY3Rpdml0eS5UZXRoZXJpbmc7CiAKIGltcG9ydCBqYXZhLmlvLkZpbGVEZXNjcmlwdG9yOworaW1wb3J0IGphdmEuaW8uRmlsZVdyaXRlcjsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwogaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7CitpbXBvcnQgamF2YS5uZXQuSW5ldEFkZHJlc3M7CitpbXBvcnQgamF2YS5uZXQuVW5rbm93bkhvc3RFeGNlcHRpb247CiBpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKIGltcG9ydCBqYXZhLm5ldC5JbmV0QWRkcmVzczsKIGltcG9ydCBqYXZhLm5ldC5Vbmtub3duSG9zdEV4Y2VwdGlvbjsKQEAgLTY3LDcgKzc2LDYgQEAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkVUV09SS19SRVNUT1JFX0RFTEFZX1BST1BfTkFNRSA9CiAgICAgICAgICAgICAiYW5kcm9pZC50ZWxlcGhvbnkuYXBuLXJlc3RvcmUiOwogCi0KICAgICBwcml2YXRlIFRldGhlcmluZyBtVGV0aGVyaW5nOwogICAgIHByaXZhdGUgYm9vbGVhbiBtVGV0aGVyaW5nQ29uZmlnVmFsaWQgPSBmYWxzZTsKIApAQCAtODQsNiArOTIsOCBAQAogICAgICAqLwogICAgIHByaXZhdGUgTGlzdCBtTmV0UmVxdWVzdGVyc1BpZHNbXTsKIAorICAgIHByaXZhdGUgV2lmaVdhdGNoZG9nU2VydmljZSBtV2lmaVdhdGNoZG9nU2VydmljZTsKKwogICAgIC8vIHByaW9yaXR5IG9yZGVyIG9mIHRoZSBuZXR0cmFja2VycwogICAgIC8vIChleGNsdWRpbmcgZHluYW1pY2FsbHkgc2V0IG1OZXR3b3JrUHJlZmVyZW5jZSkKICAgICAvLyBUT0RPIC0gbW92ZSBtTmV0d29ya1R5cGVQcmVmZXJlbmNlIGludG8gdGhpcwpAQCAtMTEyLDYgKzEyMiwxMyBAQAogICAgIHByaXZhdGUgYm9vbGVhbiBtU3lzdGVtUmVhZHk7CiAgICAgcHJpdmF0ZSBJbnRlbnQgbUluaXRpYWxCcm9hZGNhc3Q7CiAKKyAgICBwcml2YXRlIFBvd2VyTWFuYWdlci5XYWtlTG9jayBtTmV0VHJhbnNpdGlvbldha2VMb2NrOworICAgIHByaXZhdGUgU3RyaW5nIG1OZXRUcmFuc2l0aW9uV2FrZUxvY2tDYXVzZWRCeSA9ICIiOworICAgIHByaXZhdGUgaW50IG1OZXRUcmFuc2l0aW9uV2FrZUxvY2tTZXJpYWxOdW1iZXI7CisgICAgcHJpdmF0ZSBpbnQgbU5ldFRyYW5zaXRpb25XYWtlTG9ja1RpbWVvdXQ7CisKKyAgICBwcml2YXRlIEluZXRBZGRyZXNzIG1EZWZhdWx0RG5zOworCiAgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgTmV0d29ya0F0dHJpYnV0ZXMgewogICAgICAgICAvKioKICAgICAgICAgICogQ2xhc3MgZm9yIGhvbGRpbmcgc2V0dGluZ3MgcmVhZCBmcm9tIHJlc291cmNlcy4KQEAgLTE0Nyw1MiArMTY0LDIwIEBACiAgICAgfQogICAgIFJhZGlvQXR0cmlidXRlc1tdIG1SYWRpb0F0dHJpYnV0ZXM7CiAKLSAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBDb25uZWN0aXZpdHlUaHJlYWQgZXh0ZW5kcyBUaHJlYWQgewotICAgICAgICBwcml2YXRlIENvbnRleHQgbUNvbnRleHQ7Ci0KLSAgICAgICAgcHJpdmF0ZSBDb25uZWN0aXZpdHlUaHJlYWQoQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgICAgICBzdXBlcigiQ29ubmVjdGl2aXR5VGhyZWFkIik7Ci0gICAgICAgICAgICBtQ29udGV4dCA9IGNvbnRleHQ7CisgICAgcHVibGljIHN0YXRpYyBzeW5jaHJvbml6ZWQgQ29ubmVjdGl2aXR5U2VydmljZSBnZXRJbnN0YW5jZShDb250ZXh0IGNvbnRleHQpIHsKKyAgICAgICAgaWYgKHNTZXJ2aWNlSW5zdGFuY2UgPT0gbnVsbCkgeworICAgICAgICAgICAgc1NlcnZpY2VJbnN0YW5jZSA9IG5ldyBDb25uZWN0aXZpdHlTZXJ2aWNlKGNvbnRleHQpOwogICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgICAgIExvb3Blci5wcmVwYXJlKCk7Ci0gICAgICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKLSAgICAgICAgICAgICAgICBzU2VydmljZUluc3RhbmNlID0gbmV3IENvbm5lY3Rpdml0eVNlcnZpY2UobUNvbnRleHQpOwotICAgICAgICAgICAgICAgIG5vdGlmeUFsbCgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgTG9vcGVyLmxvb3AoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgQ29ubmVjdGl2aXR5U2VydmljZSBnZXRTZXJ2aWNlSW5zdGFuY2UoQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgICAgICBDb25uZWN0aXZpdHlUaHJlYWQgdGhyZWFkID0gbmV3IENvbm5lY3Rpdml0eVRocmVhZChjb250ZXh0KTsKLSAgICAgICAgICAgIHRocmVhZC5zdGFydCgpOwotCi0gICAgICAgICAgICBzeW5jaHJvbml6ZWQgKHRocmVhZCkgewotICAgICAgICAgICAgICAgIHdoaWxlIChzU2VydmljZUluc3RhbmNlID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdhaXQgdW50aWwgc1NlcnZpY2VJbnN0YW5jZSBoYXMgYmVlbiBpbml0aWFsaXplZC4KLSAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZC53YWl0KCk7Ci0gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGlnbm9yZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgU2xvZy5lKFRBRywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVW5leHBlY3RlZCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB3aGlsZSB3YWl0aW5nIisKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIGZvciBDb25uZWN0aXZpdHlTZXJ2aWNlIHRocmVhZCIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gc1NlcnZpY2VJbnN0YW5jZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgQ29ubmVjdGl2aXR5U2VydmljZSBnZXRJbnN0YW5jZShDb250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgcmV0dXJuIENvbm5lY3Rpdml0eVRocmVhZC5nZXRTZXJ2aWNlSW5zdGFuY2UoY29udGV4dCk7CisgICAgICAgIHJldHVybiBzU2VydmljZUluc3RhbmNlOwogICAgIH0KIAogICAgIHByaXZhdGUgQ29ubmVjdGl2aXR5U2VydmljZShDb250ZXh0IGNvbnRleHQpIHsKICAgICAgICAgaWYgKERCRykgU2xvZy52KFRBRywgIkNvbm5lY3Rpdml0eVNlcnZpY2Ugc3RhcnRpbmcgdXAiKTsKIAorICAgICAgICBIYW5kbGVyVGhyZWFkIGhhbmRsZXJUaHJlYWQgPSBuZXcgSGFuZGxlclRocmVhZCgiQ29ubmVjdGl2aXR5U2VydmljZVRocmVhZCIpOworICAgICAgICBoYW5kbGVyVGhyZWFkLnN0YXJ0KCk7CisgICAgICAgIG1IYW5kbGVyID0gbmV3IE15SGFuZGxlcihoYW5kbGVyVGhyZWFkLmdldExvb3BlcigpKTsKKwogICAgICAgICAvLyBzZXR1cCBvdXIgdW5pcXVlIGRldmljZSBuYW1lCiAgICAgICAgIFN0cmluZyBpZCA9IFNldHRpbmdzLlNlY3VyZS5nZXRTdHJpbmcoY29udGV4dC5nZXRDb250ZW50UmVzb2x2ZXIoKSwKICAgICAgICAgICAgICAgICBTZXR0aW5ncy5TZWN1cmUuQU5EUk9JRF9JRCk7CkBAIC0yMDEsMTAgKzE4NiwyOCBAQAogICAgICAgICAgICAgU3lzdGVtUHJvcGVydGllcy5zZXQoIm5ldC5ob3N0bmFtZSIsIG5hbWUpOwogICAgICAgICB9CiAKKyAgICAgICAgLy8gcmVhZCBvdXIgZGVmYXVsdCBkbnMgc2VydmVyIGlwCisgICAgICAgIFN0cmluZyBkbnMgPSBTZXR0aW5ncy5TZWN1cmUuZ2V0U3RyaW5nKGNvbnRleHQuZ2V0Q29udGVudFJlc29sdmVyKCksCisgICAgICAgICAgICAgICAgU2V0dGluZ3MuU2VjdXJlLkRFRkFVTFRfRE5TX1NFUlZFUik7CisgICAgICAgIGlmIChkbnMgPT0gbnVsbCB8fCBkbnMubGVuZ3RoKCkgPT0gMCkgeworICAgICAgICAgICAgZG5zID0gY29udGV4dC5nZXRSZXNvdXJjZXMoKS5nZXRTdHJpbmcoCisgICAgICAgICAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3RyaW5nLmNvbmZpZ19kZWZhdWx0X2Ruc19zZXJ2ZXIpOworICAgICAgICB9CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBtRGVmYXVsdERucyA9IEluZXRBZGRyZXNzLmdldEJ5TmFtZShkbnMpOworICAgICAgICB9IGNhdGNoIChVbmtub3duSG9zdEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBTbG9nLmUoVEFHLCAiRXJyb3Igc2V0dGluZyBkZWZhdWx0RG5zIHVzaW5nICIgKyBkbnMpOworICAgICAgICB9CisKICAgICAgICAgbUNvbnRleHQgPSBjb250ZXh0OworCisgICAgICAgIFBvd2VyTWFuYWdlciBwb3dlck1hbmFnZXIgPSAoUG93ZXJNYW5hZ2VyKW1Db250ZXh0LmdldFN5c3RlbVNlcnZpY2UoQ29udGV4dC5QT1dFUl9TRVJWSUNFKTsKKyAgICAgICAgbU5ldFRyYW5zaXRpb25XYWtlTG9jayA9IHBvd2VyTWFuYWdlci5uZXdXYWtlTG9jayhQb3dlck1hbmFnZXIuUEFSVElBTF9XQUtFX0xPQ0ssIFRBRyk7CisgICAgICAgIG1OZXRUcmFuc2l0aW9uV2FrZUxvY2tUaW1lb3V0ID0gbUNvbnRleHQuZ2V0UmVzb3VyY2VzKCkuZ2V0SW50ZWdlcigKKyAgICAgICAgICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmludGVnZXIuY29uZmlnX25ldHdvcmtUcmFuc2l0aW9uVGltZW91dCk7CisKICAgICAgICAgbU5ldFRyYWNrZXJzID0gbmV3IE5ldHdvcmtTdGF0ZVRyYWNrZXJbCiAgICAgICAgICAgICAgICAgQ29ubmVjdGl2aXR5TWFuYWdlci5NQVhfTkVUV09SS19UWVBFKzFdOwotICAgICAgICBtSGFuZGxlciA9IG5ldyBNeUhhbmRsZXIoKTsKIAogICAgICAgICBtTmV0d29ya1ByZWZlcmVuY2UgPSBnZXRQZXJzaXN0ZWROZXR3b3JrUHJlZmVyZW5jZSgpOwogCkBAIC0zMDEsMTggKzMwNCwyMSBAQAogICAgICAgICAgICAgc3dpdGNoIChtTmV0QXR0cmlidXRlc1tuZXRUeXBlXS5tUmFkaW8pIHsKICAgICAgICAgICAgIGNhc2UgQ29ubmVjdGl2aXR5TWFuYWdlci5UWVBFX1dJRkk6CiAgICAgICAgICAgICAgICAgaWYgKERCRykgU2xvZy52KFRBRywgIlN0YXJ0aW5nIFdpZmkgU2VydmljZS4iKTsKLSAgICAgICAgICAgICAgICBXaWZpU3RhdGVUcmFja2VyIHdzdCA9IG5ldyBXaWZpU3RhdGVUcmFja2VyKGNvbnRleHQsIG1IYW5kbGVyKTsKLSAgICAgICAgICAgICAgICBXaWZpU2VydmljZSB3aWZpU2VydmljZSA9IG5ldyBXaWZpU2VydmljZShjb250ZXh0LCB3c3QpOworICAgICAgICAgICAgICAgIFdpZmlTdGF0ZVRyYWNrZXIgd3N0ID0gbmV3IFdpZmlTdGF0ZVRyYWNrZXIoKTsKKyAgICAgICAgICAgICAgICBXaWZpU2VydmljZSB3aWZpU2VydmljZSA9IG5ldyBXaWZpU2VydmljZShjb250ZXh0KTsKICAgICAgICAgICAgICAgICBTZXJ2aWNlTWFuYWdlci5hZGRTZXJ2aWNlKENvbnRleHQuV0lGSV9TRVJWSUNFLCB3aWZpU2VydmljZSk7Ci0gICAgICAgICAgICAgICAgd2lmaVNlcnZpY2Uuc3RhcnRXaWZpKCk7CisgICAgICAgICAgICAgICAgd2lmaVNlcnZpY2UuY2hlY2tBbmRTdGFydFdpZmkoKTsKICAgICAgICAgICAgICAgICBtTmV0VHJhY2tlcnNbQ29ubmVjdGl2aXR5TWFuYWdlci5UWVBFX1dJRkldID0gd3N0OwotICAgICAgICAgICAgICAgIHdzdC5zdGFydE1vbml0b3JpbmcoKTsKKyAgICAgICAgICAgICAgICB3c3Quc3RhcnRNb25pdG9yaW5nKGNvbnRleHQsIG1IYW5kbGVyKTsKKworICAgICAgICAgICAgICAgIC8vVE9ETzogYXMgcGFydCBvZiBXV1MgcmVmYWN0b3IsIGNyZWF0ZSBvbmx5IHdoZW4gbmVlZGVkCisgICAgICAgICAgICAgICAgbVdpZmlXYXRjaGRvZ1NlcnZpY2UgPSBuZXcgV2lmaVdhdGNoZG9nU2VydmljZShjb250ZXh0KTsKIAogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgY2FzZSBDb25uZWN0aXZpdHlNYW5hZ2VyLlRZUEVfTU9CSUxFOgotICAgICAgICAgICAgICAgIG1OZXRUcmFja2Vyc1tuZXRUeXBlXSA9IG5ldyBNb2JpbGVEYXRhU3RhdGVUcmFja2VyKGNvbnRleHQsIG1IYW5kbGVyLAotICAgICAgICAgICAgICAgICAgICBuZXRUeXBlLCBtTmV0QXR0cmlidXRlc1tuZXRUeXBlXS5tTmFtZSk7Ci0gICAgICAgICAgICAgICAgbU5ldFRyYWNrZXJzW25ldFR5cGVdLnN0YXJ0TW9uaXRvcmluZygpOworICAgICAgICAgICAgICAgIG1OZXRUcmFja2Vyc1tuZXRUeXBlXSA9IG5ldyBNb2JpbGVEYXRhU3RhdGVUcmFja2VyKG5ldFR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICBtTmV0QXR0cmlidXRlc1tuZXRUeXBlXS5tTmFtZSk7CisgICAgICAgICAgICAgICAgbU5ldFRyYWNrZXJzW25ldFR5cGVdLnN0YXJ0TW9uaXRvcmluZyhjb250ZXh0LCBtSGFuZGxlcik7CiAgICAgICAgICAgICAgICAgaWYgKG5vTW9iaWxlRGF0YSkgewogICAgICAgICAgICAgICAgICAgICBpZiAoREJHKSBTbG9nLmQoVEFHLCAidGVhcmluZyBkb3duIE1vYmlsZSBuZXR3b3JrcyBkdWUgdG8gc2V0dGluZyIpOwogICAgICAgICAgICAgICAgICAgICBtTmV0VHJhY2tlcnNbbmV0VHlwZV0udGVhcmRvd24oKTsKQEAgLTMyOSw3ICszMzUsOCBAQAogICAgICAgICBtVGV0aGVyaW5nQ29uZmlnVmFsaWQgPSAoKChtTmV0VHJhY2tlcnNbQ29ubmVjdGl2aXR5TWFuYWdlci5UWVBFX01PQklMRV9EVU5dICE9IG51bGwpIHx8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIW1UZXRoZXJpbmcuaXNEdW5SZXF1aXJlZCgpKSAmJgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1UZXRoZXJpbmcuZ2V0VGV0aGVyYWJsZVVzYlJlZ2V4cygpLmxlbmd0aCAhPSAwIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVRldGhlcmluZy5nZXRUZXRoZXJhYmxlV2lmaVJlZ2V4cygpLmxlbmd0aCAhPSAwKSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1UZXRoZXJpbmcuZ2V0VGV0aGVyYWJsZVdpZmlSZWdleHMoKS5sZW5ndGggIT0gMCB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1UZXRoZXJpbmcuZ2V0VGV0aGVyYWJsZUJsdWV0b290aFJlZ2V4cygpLmxlbmd0aCAhPSAwKSAmJgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVRldGhlcmluZy5nZXRVcHN0cmVhbUlmYWNlUmVnZXhzKCkubGVuZ3RoICE9IDApOwogCiAgICAgfQpAQCAtNjA1LDE1ICs2MTIsNyBAQAogICAgICAgICAgICAgICAgIG5ldHdvcmsucmVjb25uZWN0KCk7CiAgICAgICAgICAgICAgICAgcmV0dXJuIFBob25lLkFQTl9SRVFVRVNUX1NUQVJURUQ7CiAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHN5bmNocm9uaXplZCh0aGlzKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1GZWF0dXJlVXNlcnMuYWRkKGYpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBtSGFuZGxlci5zZW5kTWVzc2FnZURlbGF5ZWQobUhhbmRsZXIub2J0YWluTWVzc2FnZSgKLSAgICAgICAgICAgICAgICAgICAgICAgIE5ldHdvcmtTdGF0ZVRyYWNrZXIuRVZFTlRfUkVTVE9SRV9ERUZBVUxUX05FVFdPUkssCi0gICAgICAgICAgICAgICAgICAgICAgICBmKSwgZ2V0UmVzdG9yZURlZmF1bHROZXR3b3JrRGVsYXkoKSk7Ci0KLSAgICAgICAgICAgICAgICByZXR1cm4gbmV0d29yay5zdGFydFVzaW5nTmV0d29ya0ZlYXR1cmUoZmVhdHVyZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGdldENhbGxpbmdQaWQoKSwgZ2V0Q2FsbGluZ1VpZCgpKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIFBob25lLkFQTl9UWVBFX05PVF9BVkFJTEFCTEU7CkBAIC03MzIsOCArNzMxLDcgQEAKICAgICAgICAgICAgIHRyYWNrZXIudGVhcmRvd24oKTsKICAgICAgICAgICAgIHJldHVybiAxOwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy8gZG8gaXQgdGhlIG9sZCBmYXNoaW9uZWQgd2F5Ci0gICAgICAgICAgICByZXR1cm4gdHJhY2tlci5zdG9wVXNpbmdOZXR3b3JrRmVhdHVyZShmZWF0dXJlLCBwaWQsIHVpZCk7CisgICAgICAgICAgICByZXR1cm4gLTE7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTc4MiwxMSArNzgwLDM3IEBACiAgICAgICAgICAgICB9CiAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KLQogICAgICAgICB0cnkgewotICAgICAgICAgICAgSW5ldEFkZHJlc3MgaW5ldEFkZHJlc3MgPSBJbmV0QWRkcmVzcy5nZXRCeUFkZHJlc3MoaG9zdEFkZHJlc3MpOwotICAgICAgICAgICAgcmV0dXJuIHRyYWNrZXIucmVxdWVzdFJvdXRlVG9Ib3N0KGluZXRBZGRyZXNzKTsKLSAgICAgICAgfSBjYXRjaCAoVW5rbm93bkhvc3RFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgSW5ldEFkZHJlc3MgYWRkciA9IEluZXRBZGRyZXNzLmdldEJ5QWRkcmVzcyhob3N0QWRkcmVzcyk7CisgICAgICAgICAgICByZXR1cm4gYWRkSG9zdFJvdXRlKHRyYWNrZXIsIGFkZHIpOworICAgICAgICB9IGNhdGNoIChVbmtub3duSG9zdEV4Y2VwdGlvbiBlKSB7fQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLyoqCisgICAgICogRW5zdXJlIHRoYXQgYSBuZXR3b3JrIHJvdXRlIGV4aXN0cyB0byBkZWxpdmVyIHRyYWZmaWMgdG8gdGhlIHNwZWNpZmllZAorICAgICAqIGhvc3QgdmlhIHRoZSBtb2JpbGUgZGF0YSBuZXR3b3JrLgorICAgICAqIEBwYXJhbSBob3N0QWRkcmVzcyB0aGUgSVAgYWRkcmVzcyBvZiB0aGUgaG9zdCB0byB3aGljaCB0aGUgcm91dGUgaXMgZGVzaXJlZCwKKyAgICAgKiBpbiBuZXR3b3JrIGJ5dGUgb3JkZXIuCisgICAgICogVE9ETyAtIGRlcHJlY2F0ZQorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IG9uIHN1Y2Nlc3MsIHtAY29kZSBmYWxzZX0gb24gZmFpbHVyZQorICAgICAqLworICAgIHByaXZhdGUgYm9vbGVhbiBhZGRIb3N0Um91dGUoTmV0d29ya1N0YXRlVHJhY2tlciBudCwgSW5ldEFkZHJlc3MgaG9zdEFkZHJlc3MpIHsKKyAgICAgICAgaWYgKG50LmdldE5ldHdvcmtJbmZvKCkuZ2V0VHlwZSgpID09IENvbm5lY3Rpdml0eU1hbmFnZXIuVFlQRV9XSUZJKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICBMaW5rUHJvcGVydGllcyBwID0gbnQuZ2V0TGlua1Byb3BlcnRpZXMoKTsKKyAgICAgICAgaWYgKHAgPT0gbnVsbCkgcmV0dXJuIGZhbHNlOworICAgICAgICBTdHJpbmcgaW50ZXJmYWNlTmFtZSA9IHAuZ2V0SW50ZXJmYWNlTmFtZSgpOworCisgICAgICAgIGlmIChEQkcpIHsKKyAgICAgICAgICAgIFNsb2cuZChUQUcsICJSZXF1ZXN0ZWQgaG9zdCByb3V0ZSB0byAiICsgaG9zdEFkZHJlc3MgKyAiKCIgKyBpbnRlcmZhY2VOYW1lICsgIikiKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoaW50ZXJmYWNlTmFtZSAhPSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gTmV0d29ya1V0aWxzLmFkZEhvc3RSb3V0ZShpbnRlcmZhY2VOYW1lLCBob3N0QWRkcmVzcywgbnVsbCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAoREJHKSBTbG9nLmUoVEFHLCAiYWRkSG9zdFJvdXRlIGZhaWxlZCBkdWUgdG8gbnVsbCBpbnRlcmZhY2UgbmFtZSIpOwogICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9CiAgICAgfQpAQCAtODk1LDYgKzkxOSwxMiBAQAogICAgICAgICAgICAgICAgICJDb25uZWN0aXZpdHlTZXJ2aWNlIik7CiAgICAgfQogCisgICAgcHJpdmF0ZSB2b2lkIGVuZm9yY2VDb25uZWN0aXZpdHlJbnRlcm5hbFBlcm1pc3Npb24oKSB7CisgICAgICAgIG1Db250ZXh0LmVuZm9yY2VDYWxsaW5nT3JTZWxmUGVybWlzc2lvbigKKyAgICAgICAgICAgICAgICBhbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24uQ09OTkVDVElWSVRZX0lOVEVSTkFMLAorICAgICAgICAgICAgICAgICJDb25uZWN0aXZpdHlTZXJ2aWNlIik7CisgICAgfQorCiAgICAgLyoqCiAgICAgICogSGFuZGxlIGEge0Bjb2RlIERJU0NPTk5FQ1RFRH0gZXZlbnQuIElmIHRoaXMgcGVydGFpbnMgdG8gdGhlIG5vbi1hY3RpdmUKICAgICAgKiBuZXR3b3JrLCB3ZSBpZ25vcmUgaXQuIElmIGl0IGlzIGZvciB0aGUgYWN0aXZlIG5ldHdvcmssIHdlIHNlbmQgb3V0IGEKQEAgLTExNjUsOSArMTE5NSwxNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgU2xvZy5lKFRBRywgIk5ldHdvcmsgZGVjbGluZWQgdGVhcmRvd24gcmVxdWVzdCIpOwogICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGlmIChpc0ZhaWxvdmVyKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvdGhlck5ldC5yZWxlYXNlV2FrZUxvY2soKTsKLSAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHN5bmNocm9uaXplZCAoQ29ubmVjdGl2aXR5U2VydmljZS50aGlzKSB7CisgICAgICAgICAgICAgICAgLy8gaGF2ZSBhIG5ldyBkZWZhdWx0IG5ldHdvcmssIHJlbGVhc2UgdGhlIHRyYW5zaXRpb24gd2FrZWxvY2sgaW4gYSBzZWNvbmQKKyAgICAgICAgICAgICAgICAvLyBpZiBpdCdzIGhlbGQuICBUaGUgc2Vjb25kIHBhdXNlIGlzIHRvIGFsbG93IGFwcHMgdG8gcmVjb25uZWN0IG92ZXIgdGhlCisgICAgICAgICAgICAgICAgLy8gbmV3IG5ldHdvcmsKKyAgICAgICAgICAgICAgICBpZiAobU5ldFRyYW5zaXRpb25XYWtlTG9jay5pc0hlbGQoKSkgeworICAgICAgICAgICAgICAgICAgICBtSGFuZGxlci5zZW5kTWVzc2FnZURlbGF5ZWQobUhhbmRsZXIub2J0YWluTWVzc2FnZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBOZXR3b3JrU3RhdGVUcmFja2VyLkVWRU5UX0NMRUFSX05FVF9UUkFOU0lUSU9OX1dBS0VMT0NLLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1OZXRUcmFuc2l0aW9uV2FrZUxvY2tTZXJpYWxOdW1iZXIsIDApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEwMDApOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgICAgIG1BY3RpdmVEZWZhdWx0TmV0d29yayA9IHR5cGU7CkBAIC0xMTgxLDM2ICsxMjE5LDE0IEBACiAgICAgICAgICAgICAvL3JlcG9ydE5ldHdvcmtDb25kaXRpb24obUFjdGl2ZURlZmF1bHROZXR3b3JrLCAxMDApOwogICAgICAgICB9CiAgICAgICAgIHRoaXNOZXQuc2V0VGVhcmRvd25SZXF1ZXN0ZWQoZmFsc2UpOwotICAgICAgICB0aGlzTmV0LnVwZGF0ZU5ldHdvcmtTZXR0aW5ncygpOworICAgICAgICB1cGRhdGVOZXR3b3JrU2V0dGluZ3ModGhpc05ldCk7CiAgICAgICAgIGhhbmRsZUNvbm5lY3Rpdml0eUNoYW5nZSh0eXBlKTsKICAgICAgICAgc2VuZENvbm5lY3RlZEJyb2FkY2FzdChpbmZvKTsKICAgICB9CiAKLSAgICBwcml2YXRlIHZvaWQgaGFuZGxlU2NhblJlc3VsdHNBdmFpbGFibGUoTmV0d29ya0luZm8gaW5mbykgewotICAgICAgICBpbnQgbmV0d29ya1R5cGUgPSBpbmZvLmdldFR5cGUoKTsKLSAgICAgICAgaWYgKG5ldHdvcmtUeXBlICE9IENvbm5lY3Rpdml0eU1hbmFnZXIuVFlQRV9XSUZJKSB7Ci0gICAgICAgICAgICBpZiAoREJHKSBTbG9nLnYoVEFHLCAiR290IFNjYW5SZXN1bHRzQXZhaWxhYmxlIGZvciAiICsKLSAgICAgICAgICAgICAgICAgICAgaW5mby5nZXRUeXBlTmFtZSgpICsgIiBuZXR3b3JrLiBEb24ndCBrbm93IGhvdyB0byBoYW5kbGUuIik7Ci0gICAgICAgIH0KLQotICAgICAgICBtTmV0VHJhY2tlcnNbbmV0d29ya1R5cGVdLmludGVycHJldFNjYW5SZXN1bHRzQXZhaWxhYmxlKCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGhhbmRsZU5vdGlmaWNhdGlvbkNoYW5nZShib29sZWFuIHZpc2libGUsIGludCBpZCwKLSAgICAgICAgICAgIE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLSAgICAgICAgTm90aWZpY2F0aW9uTWFuYWdlciBub3RpZmljYXRpb25NYW5hZ2VyID0gKE5vdGlmaWNhdGlvbk1hbmFnZXIpIG1Db250ZXh0Ci0gICAgICAgICAgICAgICAgLmdldFN5c3RlbVNlcnZpY2UoQ29udGV4dC5OT1RJRklDQVRJT05fU0VSVklDRSk7Ci0KLSAgICAgICAgaWYgKHZpc2libGUpIHsKLSAgICAgICAgICAgIG5vdGlmaWNhdGlvbk1hbmFnZXIubm90aWZ5KGlkLCBub3RpZmljYXRpb24pOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbm90aWZpY2F0aW9uTWFuYWdlci5jYW5jZWwoaWQpOwotICAgICAgICB9Ci0gICAgfQotCiAgICAgLyoqCi0gICAgICogQWZ0ZXIgYSBjaGFuZ2UgaW4gdGhlIGNvbm5lY3Rpdml0eSBzdGF0ZSBvZiBhbnkgbmV0d29yaywgV2UncmUgbWFpbmx5Ci0gICAgICogY29uY2VybmVkIHdpdGggbWFraW5nIHN1cmUgdGhhdCB0aGUgbGlzdCBvZiBETlMgc2VydmVycyBpcyBzZXR1cHVwCisgICAgICogQWZ0ZXIgYSBjaGFuZ2UgaW4gdGhlIGNvbm5lY3Rpdml0eSBzdGF0ZSBvZiBhIG5ldHdvcmsuIFdlJ3JlIG1haW5seQorICAgICAqIGNvbmNlcm5lZCB3aXRoIG1ha2luZyBzdXJlIHRoYXQgdGhlIGxpc3Qgb2YgRE5TIHNlcnZlcnMgaXMgc2V0IHVwCiAgICAgICogYWNjb3JkaW5nIHRvIHdoaWNoIG5ldHdvcmtzIGFyZSBjb25uZWN0ZWQsIGFuZCBlbnN1cmluZyB0aGF0IHRoZQogICAgICAqIHJpZ2h0IHJvdXRpbmcgdGFibGUgZW50cmllcyBleGlzdC4KICAgICAgKi8KQEAgLTEyMjMsMTkgKzEyMzksMTU4IEBACiAKICAgICAgICAgaWYgKG1OZXRUcmFja2Vyc1tuZXRUeXBlXS5nZXROZXR3b3JrSW5mbygpLmlzQ29ubmVjdGVkKCkpIHsKICAgICAgICAgICAgIGlmIChtTmV0QXR0cmlidXRlc1tuZXRUeXBlXS5pc0RlZmF1bHQoKSkgewotICAgICAgICAgICAgICAgIG1OZXRUcmFja2Vyc1tuZXRUeXBlXS5hZGREZWZhdWx0Um91dGUoKTsKKyAgICAgICAgICAgICAgICBhZGREZWZhdWx0Um91dGUobU5ldFRyYWNrZXJzW25ldFR5cGVdKTsKICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgbU5ldFRyYWNrZXJzW25ldFR5cGVdLmFkZFByaXZhdGVEbnNSb3V0ZXMoKTsKKyAgICAgICAgICAgICAgICBhZGRQcml2YXRlRG5zUm91dGVzKG1OZXRUcmFja2Vyc1tuZXRUeXBlXSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBpZiAobU5ldEF0dHJpYnV0ZXNbbmV0VHlwZV0uaXNEZWZhdWx0KCkpIHsKLSAgICAgICAgICAgICAgICBtTmV0VHJhY2tlcnNbbmV0VHlwZV0ucmVtb3ZlRGVmYXVsdFJvdXRlKCk7CisgICAgICAgICAgICAgICAgcmVtb3ZlRGVmYXVsdFJvdXRlKG1OZXRUcmFja2Vyc1tuZXRUeXBlXSk7CiAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIG1OZXRUcmFja2Vyc1tuZXRUeXBlXS5yZW1vdmVQcml2YXRlRG5zUm91dGVzKCk7CisgICAgICAgICAgICAgICAgcmVtb3ZlUHJpdmF0ZURuc1JvdXRlcyhtTmV0VHJhY2tlcnNbbmV0VHlwZV0pOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQogCisgICAgcHJpdmF0ZSB2b2lkIGFkZFByaXZhdGVEbnNSb3V0ZXMoTmV0d29ya1N0YXRlVHJhY2tlciBudCkgeworICAgICAgICBib29sZWFuIHByaXZhdGVEbnNSb3V0ZVNldCA9IG50LmlzUHJpdmF0ZURuc1JvdXRlU2V0KCk7CisgICAgICAgIExpbmtQcm9wZXJ0aWVzIHAgPSBudC5nZXRMaW5rUHJvcGVydGllcygpOworICAgICAgICBpZiAocCA9PSBudWxsKSByZXR1cm47CisgICAgICAgIFN0cmluZyBpbnRlcmZhY2VOYW1lID0gcC5nZXRJbnRlcmZhY2VOYW1lKCk7CisKKyAgICAgICAgaWYgKERCRykgeworICAgICAgICAgICAgU2xvZy5kKFRBRywgImFkZFByaXZhdGVEbnNSb3V0ZXMgZm9yICIgKyBudCArCisgICAgICAgICAgICAgICAgICAgICIoIiArIGludGVyZmFjZU5hbWUgKyAiKSAtIG1Qcml2YXRlRG5zUm91dGVTZXQgPSAiICsgcHJpdmF0ZURuc1JvdXRlU2V0KTsKKyAgICAgICAgfQorICAgICAgICBpZiAoaW50ZXJmYWNlTmFtZSAhPSBudWxsICYmICFwcml2YXRlRG5zUm91dGVTZXQpIHsKKyAgICAgICAgICAgIENvbGxlY3Rpb248SW5ldEFkZHJlc3M+IGRuc0xpc3QgPSBwLmdldERuc2VzKCk7CisgICAgICAgICAgICBmb3IgKEluZXRBZGRyZXNzIGRucyA6IGRuc0xpc3QpIHsKKyAgICAgICAgICAgICAgICBpZiAoREJHKSBTbG9nLmQoVEFHLCAiICBhZGRpbmcgIiArIGRucyk7CisgICAgICAgICAgICAgICAgTmV0d29ya1V0aWxzLmFkZEhvc3RSb3V0ZShpbnRlcmZhY2VOYW1lLCBkbnMsIG51bGwpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbnQucHJpdmF0ZURuc1JvdXRlU2V0KHRydWUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHJlbW92ZVByaXZhdGVEbnNSb3V0ZXMoTmV0d29ya1N0YXRlVHJhY2tlciBudCkgeworICAgICAgICAvLyBUT0RPIC0gd2Ugc2hvdWxkIGRvIHRoaXMgZXhwbGljaXRseSBidXQgdGhlIE5ldFV0aWxzIGFwaSBkb2VzbnQKKyAgICAgICAgLy8gc3VwcG9ydCB0aGlzIHlldCAtIG11c3QgcmVtb3ZlIGFsbC4gIE5vIHdvcnNlIHRoYW4gYmVmb3JlCisgICAgICAgIExpbmtQcm9wZXJ0aWVzIHAgPSBudC5nZXRMaW5rUHJvcGVydGllcygpOworICAgICAgICBpZiAocCA9PSBudWxsKSByZXR1cm47CisgICAgICAgIFN0cmluZyBpbnRlcmZhY2VOYW1lID0gcC5nZXRJbnRlcmZhY2VOYW1lKCk7CisgICAgICAgIGJvb2xlYW4gcHJpdmF0ZURuc1JvdXRlU2V0ID0gbnQuaXNQcml2YXRlRG5zUm91dGVTZXQoKTsKKyAgICAgICAgaWYgKGludGVyZmFjZU5hbWUgIT0gbnVsbCAmJiBwcml2YXRlRG5zUm91dGVTZXQpIHsKKyAgICAgICAgICAgIGlmIChEQkcpIHsKKyAgICAgICAgICAgICAgICBTbG9nLmQoVEFHLCAicmVtb3ZlUHJpdmF0ZURuc1JvdXRlcyBmb3IgIiArIG50LmdldE5ldHdvcmtJbmZvKCkuZ2V0VHlwZU5hbWUoKSArCisgICAgICAgICAgICAgICAgICAgICAgICAiICgiICsgaW50ZXJmYWNlTmFtZSArICIpIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBOZXR3b3JrVXRpbHMucmVtb3ZlSG9zdFJvdXRlcyhpbnRlcmZhY2VOYW1lKTsKKyAgICAgICAgICAgIG50LnByaXZhdGVEbnNSb3V0ZVNldChmYWxzZSk7CisgICAgICAgIH0KKyAgICB9CisKKworICAgIHByaXZhdGUgdm9pZCBhZGREZWZhdWx0Um91dGUoTmV0d29ya1N0YXRlVHJhY2tlciBudCkgeworICAgICAgICBMaW5rUHJvcGVydGllcyBwID0gbnQuZ2V0TGlua1Byb3BlcnRpZXMoKTsKKyAgICAgICAgaWYgKHAgPT0gbnVsbCkgcmV0dXJuOworICAgICAgICBTdHJpbmcgaW50ZXJmYWNlTmFtZSA9IHAuZ2V0SW50ZXJmYWNlTmFtZSgpOworICAgICAgICBJbmV0QWRkcmVzcyBkZWZhdWx0R2F0ZXdheUFkZHIgPSBwLmdldEdhdGV3YXkoKTsKKworICAgICAgICBpZiAoKGludGVyZmFjZU5hbWUgIT0gbnVsbCkgJiYgKGRlZmF1bHRHYXRld2F5QWRkciAhPSBudWxsICkpIHsKKyAgICAgICAgICAgIGlmICghTmV0d29ya1V0aWxzLmFkZERlZmF1bHRSb3V0ZShpbnRlcmZhY2VOYW1lLCBkZWZhdWx0R2F0ZXdheUFkZHIpICYmIERCRykgeworICAgICAgICAgICAgICAgIE5ldHdvcmtJbmZvIG5ldHdvcmtJbmZvID0gbnQuZ2V0TmV0d29ya0luZm8oKTsKKyAgICAgICAgICAgICAgICBTbG9nLmQoVEFHLCAiYWRkRGVmYXVsdFJvdXRlIGZvciAiICsgbmV0d29ya0luZm8uZ2V0VHlwZU5hbWUoKSArCisgICAgICAgICAgICAgICAgICAgICAgICAiICgiICsgaW50ZXJmYWNlTmFtZSArICIpLCBHYXRld2F5QWRkcj0iICsgZGVmYXVsdEdhdGV3YXlBZGRyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworCisgICAgcHVibGljIHZvaWQgcmVtb3ZlRGVmYXVsdFJvdXRlKE5ldHdvcmtTdGF0ZVRyYWNrZXIgbnQpIHsKKyAgICAgICAgTGlua1Byb3BlcnRpZXMgcCA9IG50LmdldExpbmtQcm9wZXJ0aWVzKCk7CisgICAgICAgIGlmIChwID09IG51bGwpIHJldHVybjsKKyAgICAgICAgU3RyaW5nIGludGVyZmFjZU5hbWUgPSBwLmdldEludGVyZmFjZU5hbWUoKTsKKworICAgICAgICBpZiAoaW50ZXJmYWNlTmFtZSAhPSBudWxsKSB7CisgICAgICAgICAgICBpZiAoKE5ldHdvcmtVdGlscy5yZW1vdmVEZWZhdWx0Um91dGUoaW50ZXJmYWNlTmFtZSkgPj0gMCkgJiYgREJHKSB7CisgICAgICAgICAgICAgICAgTmV0d29ya0luZm8gbmV0d29ya0luZm8gPSBudC5nZXROZXR3b3JrSW5mbygpOworICAgICAgICAgICAgICAgIFNsb2cuZChUQUcsICJyZW1vdmVEZWZhdWx0Um91dGUgZm9yICIgKyBuZXR3b3JrSW5mby5nZXRUeXBlTmFtZSgpICsgIiAoIiArCisgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcmZhY2VOYW1lICsgIikiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgLyoqCisgICAgICogUmVhZHMgdGhlIG5ldHdvcmsgc3BlY2lmaWMgVENQIGJ1ZmZlciBzaXplcyBmcm9tIFN5c3RlbVByb3BlcnRpZXMKKyAgICAgKiBuZXQudGNwLmJ1ZmZlcnNpemUuW2RlZmF1bHR8d2lmaXx1bXRzfGVkZ2V8Z3Byc10gYW5kIHNldCB0aGVtIGZvciBzeXN0ZW0KKyAgICAgKiB3aWRlIHVzZQorICAgICAqLworICAgcHVibGljIHZvaWQgdXBkYXRlTmV0d29ya1NldHRpbmdzKE5ldHdvcmtTdGF0ZVRyYWNrZXIgbnQpIHsKKyAgICAgICAgU3RyaW5nIGtleSA9IG50LmdldFRjcEJ1ZmZlclNpemVzUHJvcE5hbWUoKTsKKyAgICAgICAgU3RyaW5nIGJ1ZmZlclNpemVzID0gU3lzdGVtUHJvcGVydGllcy5nZXQoa2V5KTsKKworICAgICAgICBpZiAoYnVmZmVyU2l6ZXMubGVuZ3RoKCkgPT0gMCkgeworICAgICAgICAgICAgU2xvZy5lKFRBRywga2V5ICsgIiBub3QgZm91bmQgaW4gc3lzdGVtIHByb3BlcnRpZXMuIFVzaW5nIGRlZmF1bHRzIik7CisKKyAgICAgICAgICAgIC8vIFNldHRpbmcgdG8gZGVmYXVsdCB2YWx1ZXMgc28gd2Ugd29uJ3QgYmUgc3R1Y2sgdG8gcHJldmlvdXMgdmFsdWVzCisgICAgICAgICAgICBrZXkgPSAibmV0LnRjcC5idWZmZXJzaXplLmRlZmF1bHQiOworICAgICAgICAgICAgYnVmZmVyU2l6ZXMgPSBTeXN0ZW1Qcm9wZXJ0aWVzLmdldChrZXkpOworICAgICAgICB9CisKKyAgICAgICAgLy8gU2V0IHZhbHVlcyBpbiBrZXJuZWwKKyAgICAgICAgaWYgKGJ1ZmZlclNpemVzLmxlbmd0aCgpICE9IDApIHsKKyAgICAgICAgICAgIGlmIChEQkcpIHsKKyAgICAgICAgICAgICAgICBTbG9nLnYoVEFHLCAiU2V0dGluZyBUQ1AgdmFsdWVzOiBbIiArIGJ1ZmZlclNpemVzCisgICAgICAgICAgICAgICAgICAgICAgICArICJdIHdoaWNoIGNvbWVzIGZyb20gWyIgKyBrZXkgKyAiXSIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2V0QnVmZmVyU2l6ZShidWZmZXJTaXplcyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgIC8qKgorICAgICAqIFdyaXRlcyBUQ1AgYnVmZmVyIHNpemVzIHRvIC9zeXMva2VybmVsL2lwdjQvdGNwX1tyL3ddbWVtX1ttaW4vZGVmL21heF0KKyAgICAgKiB3aGljaCBtYXBzIHRvIC9wcm9jL3N5cy9uZXQvaXB2NC90Y3Bfcm1lbSBhbmQgdGNwd21lbQorICAgICAqCisgICAgICogQHBhcmFtIGJ1ZmZlclNpemVzIGluIHRoZSBmb3JtYXQgb2YgInJlYWRNaW4sIHJlYWRJbml0aWFsLCByZWFkTWF4LAorICAgICAqICAgICAgICB3cml0ZU1pbiwgd3JpdGVJbml0aWFsLCB3cml0ZU1heCIKKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgc2V0QnVmZmVyU2l6ZShTdHJpbmcgYnVmZmVyU2l6ZXMpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIFN0cmluZ1tdIHZhbHVlcyA9IGJ1ZmZlclNpemVzLnNwbGl0KCIsIik7CisKKyAgICAgICAgICAgIGlmICh2YWx1ZXMubGVuZ3RoID09IDYpIHsKKyAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIHByZWZpeCA9ICIvc3lzL2tlcm5lbC9pcHY0L3RjcF8iOworICAgICAgICAgICAgICAgIHN0cmluZ1RvRmlsZShwcmVmaXggKyAicm1lbV9taW4iLCB2YWx1ZXNbMF0pOworICAgICAgICAgICAgICAgIHN0cmluZ1RvRmlsZShwcmVmaXggKyAicm1lbV9kZWYiLCB2YWx1ZXNbMV0pOworICAgICAgICAgICAgICAgIHN0cmluZ1RvRmlsZShwcmVmaXggKyAicm1lbV9tYXgiLCB2YWx1ZXNbMl0pOworICAgICAgICAgICAgICAgIHN0cmluZ1RvRmlsZShwcmVmaXggKyAid21lbV9taW4iLCB2YWx1ZXNbM10pOworICAgICAgICAgICAgICAgIHN0cmluZ1RvRmlsZShwcmVmaXggKyAid21lbV9kZWYiLCB2YWx1ZXNbNF0pOworICAgICAgICAgICAgICAgIHN0cmluZ1RvRmlsZShwcmVmaXggKyAid21lbV9tYXgiLCB2YWx1ZXNbNV0pOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBTbG9nLmUoVEFHLCAiSW52YWxpZCBidWZmZXJzaXplIHN0cmluZzogIiArIGJ1ZmZlclNpemVzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgU2xvZy5lKFRBRywgIkNhbid0IHNldCB0Y3AgYnVmZmVyIHNpemVzOiIgKyBlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgLyoqCisgICAgICogV3JpdGVzIHN0cmluZyB0byBmaWxlLiBCYXNpY2FsbHkgc2FtZSBhcyAiZWNobyAtbiAkc3RyaW5nID4gJGZpbGVuYW1lIgorICAgICAqCisgICAgICogQHBhcmFtIGZpbGVuYW1lCisgICAgICogQHBhcmFtIHN0cmluZworICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgc3RyaW5nVG9GaWxlKFN0cmluZyBmaWxlbmFtZSwgU3RyaW5nIHN0cmluZykgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgRmlsZVdyaXRlciBvdXQgPSBuZXcgRmlsZVdyaXRlcihmaWxlbmFtZSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBvdXQud3JpdGUoc3RyaW5nKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIG91dC5jbG9zZSgpOworICAgICAgICB9CisgICAgfQorCisKICAgICAvKioKICAgICAgKiBBZGp1c3QgdGhlIHBlci1wcm9jZXNzIGRucyBlbnRyaWVzIChuZXQuZG5zPHg+LjxwaWQ+KSBiYXNlZAogICAgICAqIG9uIHRoZSBoaWdoZXN0IHByaW9yaXR5IGFjdGl2ZSBuZXQgd2hpY2ggdGhpcyBwcm9jZXNzIHJlcXVlc3RlZC4KQEAgLTEyNTEsMTIgKzE0MDYsMTQgQEAKICAgICAgICAgICAgIE5ldHdvcmtTdGF0ZVRyYWNrZXIgbnQgPSBtTmV0VHJhY2tlcnNbaV07CiAgICAgICAgICAgICBpZiAobnQuZ2V0TmV0d29ya0luZm8oKS5pc0Nvbm5lY3RlZCgpICYmCiAgICAgICAgICAgICAgICAgICAgICFudC5pc1RlYXJkb3duUmVxdWVzdGVkKCkpIHsKKyAgICAgICAgICAgICAgICBMaW5rUHJvcGVydGllcyBwID0gbnQuZ2V0TGlua1Byb3BlcnRpZXMoKTsKKyAgICAgICAgICAgICAgICBpZiAocCA9PSBudWxsKSBjb250aW51ZTsKICAgICAgICAgICAgICAgICBMaXN0IHBpZHMgPSBtTmV0UmVxdWVzdGVyc1BpZHNbaV07CiAgICAgICAgICAgICAgICAgZm9yIChpbnQgaj0wOyBqPHBpZHMuc2l6ZSgpOyBqKyspIHsKICAgICAgICAgICAgICAgICAgICAgSW50ZWdlciBwaWQgPSAoSW50ZWdlcilwaWRzLmdldChqKTsKICAgICAgICAgICAgICAgICAgICAgaWYgKHBpZC5pbnRWYWx1ZSgpID09IG15UGlkKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdbXSBkbnNMaXN0ID0gbnQuZ2V0TmFtZVNlcnZlcnMoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlUGlkRG5zKGRuc0xpc3QsIG15UGlkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIENvbGxlY3Rpb248SW5ldEFkZHJlc3M+IGRuc2VzID0gcC5nZXREbnNlcygpOworICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVQaWREbnMoZG5zZXMsIG15UGlkKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkb0J1bXApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidW1wRG5zKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICB9CkBAIC0xMjc4LDEyICsxNDM1LDEwIEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICBwcml2YXRlIHZvaWQgd3JpdGVQaWREbnMoU3RyaW5nW10gZG5zTGlzdCwgaW50IHBpZCkgeworICAgIHByaXZhdGUgdm9pZCB3cml0ZVBpZERucyhDb2xsZWN0aW9uIDxJbmV0QWRkcmVzcz4gZG5zZXMsIGludCBwaWQpIHsKICAgICAgICAgaW50IGogPSAxOwotICAgICAgICBmb3IgKFN0cmluZyBkbnMgOiBkbnNMaXN0KSB7Ci0gICAgICAgICAgICBpZiAoZG5zICE9IG51bGwgJiYgIVRleHRVdGlscy5lcXVhbHMoZG5zLCAiMC4wLjAuMCIpKSB7Ci0gICAgICAgICAgICAgICAgU3lzdGVtUHJvcGVydGllcy5zZXQoIm5ldC5kbnMiICsgaisrICsgIi4iICsgcGlkLCBkbnMpOwotICAgICAgICAgICAgfQorICAgICAgICBmb3IgKEluZXRBZGRyZXNzIGRucyA6IGRuc2VzKSB7CisgICAgICAgICAgICBTeXN0ZW1Qcm9wZXJ0aWVzLnNldCgibmV0LmRucyIgKyBqKysgKyAiLiIgKyBwaWQsIGRucy5nZXRIb3N0QWRkcmVzcygpKTsKICAgICAgICAgfQogICAgIH0KIApAQCAtMTMwNiwxNiArMTQ2MSwyNCBAQAogICAgICAgICAvLyBhZGQgZGVmYXVsdCBuZXQncyBkbnMgZW50cmllcwogICAgICAgICBOZXR3b3JrU3RhdGVUcmFja2VyIG50ID0gbU5ldFRyYWNrZXJzW25ldFR5cGVdOwogICAgICAgICBpZiAobnQgIT0gbnVsbCAmJiBudC5nZXROZXR3b3JrSW5mbygpLmlzQ29ubmVjdGVkKCkgJiYgIW50LmlzVGVhcmRvd25SZXF1ZXN0ZWQoKSkgewotICAgICAgICAgICAgU3RyaW5nW10gZG5zTGlzdCA9IG50LmdldE5hbWVTZXJ2ZXJzKCk7CisgICAgICAgICAgICBMaW5rUHJvcGVydGllcyBwID0gbnQuZ2V0TGlua1Byb3BlcnRpZXMoKTsKKyAgICAgICAgICAgIGlmIChwID09IG51bGwpIHJldHVybjsKKyAgICAgICAgICAgIENvbGxlY3Rpb248SW5ldEFkZHJlc3M+IGRuc2VzID0gcC5nZXREbnNlcygpOwogICAgICAgICAgICAgaWYgKG1OZXRBdHRyaWJ1dGVzW25ldFR5cGVdLmlzRGVmYXVsdCgpKSB7CiAgICAgICAgICAgICAgICAgaW50IGogPSAxOwotICAgICAgICAgICAgICAgIGZvciAoU3RyaW5nIGRucyA6IGRuc0xpc3QpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGRucyAhPSBudWxsICYmICFUZXh0VXRpbHMuZXF1YWxzKGRucywgIjAuMC4wLjAiKSkgeworICAgICAgICAgICAgICAgIGlmIChkbnNlcy5zaXplKCkgPT0gMCAmJiBtRGVmYXVsdERucyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChEQkcpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFNsb2cuZChUQUcsICJubyBkbnMgcHJvdmlkZWQgLSB1c2luZyAiICsgbURlZmF1bHREbnMuZ2V0SG9zdEFkZHJlc3MoKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgU3lzdGVtUHJvcGVydGllcy5zZXQoIm5ldC5kbnMxIiwgbURlZmF1bHREbnMuZ2V0SG9zdEFkZHJlc3MoKSk7CisgICAgICAgICAgICAgICAgICAgIGorKzsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBmb3IgKEluZXRBZGRyZXNzIGRucyA6IGRuc2VzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoREJHKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2xvZy5kKFRBRywgImFkZGluZyBkbnMgIiArIGRucyArICIgZm9yICIgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnQuZ2V0TmV0d29ya0luZm8oKS5nZXRUeXBlTmFtZSgpKTsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbVByb3BlcnRpZXMuc2V0KCJuZXQuZG5zIiArIGorKywgZG5zKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbVByb3BlcnRpZXMuc2V0KCJuZXQuZG5zIiArIGorKywgZG5zLmdldEhvc3RBZGRyZXNzKCkpOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGZvciAoaW50IGs9aiA7IGs8bU51bURuc0VudHJpZXM7IGsrKykgewpAQCAtMTMyOCwxMSArMTQ5MSwxMSBAQAogICAgICAgICAgICAgICAgIExpc3QgcGlkcyA9IG1OZXRSZXF1ZXN0ZXJzUGlkc1tuZXRUeXBlXTsKICAgICAgICAgICAgICAgICBmb3IgKGludCB5PTA7IHk8IHBpZHMuc2l6ZSgpOyB5KyspIHsKICAgICAgICAgICAgICAgICAgICAgSW50ZWdlciBwaWQgPSAoSW50ZWdlcilwaWRzLmdldCh5KTsKLSAgICAgICAgICAgICAgICAgICAgd3JpdGVQaWREbnMoZG5zTGlzdCwgcGlkLmludFZhbHVlKCkpOworICAgICAgICAgICAgICAgICAgICB3cml0ZVBpZERucyhkbnNlcywgcGlkLmludFZhbHVlKCkpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJ1bXBEbnMoKTsKICAgICAgICAgfQotICAgICAgICBidW1wRG5zKCk7CiAgICAgfQogCiAgICAgcHJpdmF0ZSBpbnQgZ2V0UmVzdG9yZURlZmF1bHROZXR3b3JrRGVsYXkoKSB7CkBAIC0xMzg3LDExICsxNTUwLDIyIEBACiAgICAgICAgIH0KICAgICAgICAgcHcucHJpbnRsbigpOwogCisgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgeworICAgICAgICAgICAgcHcucHJpbnRsbigiTmV0d29ya1RyYW5zdGlvbldha2VMb2NrIGlzIGN1cnJlbnRseSAiICsKKyAgICAgICAgICAgICAgICAgICAgKG1OZXRUcmFuc2l0aW9uV2FrZUxvY2suaXNIZWxkKCkgPyAiIiA6ICJub3QgIikgKyAiaGVsZC4iKTsKKyAgICAgICAgICAgIHB3LnByaW50bG4oIkl0IHdhcyBsYXN0IHJlcXVlc3RlZCBmb3IgIittTmV0VHJhbnNpdGlvbldha2VMb2NrQ2F1c2VkQnkpOworICAgICAgICB9CisgICAgICAgIHB3LnByaW50bG4oKTsKKwogICAgICAgICBtVGV0aGVyaW5nLmR1bXAoZmQsIHB3LCBhcmdzKTsKICAgICB9CiAKICAgICAvLyBtdXN0IGJlIHN0YXRlbGVzcyAtIHRoaW5ncyBjaGFuZ2UgdW5kZXIgdXMuCiAgICAgcHJpdmF0ZSBjbGFzcyBNeUhhbmRsZXIgZXh0ZW5kcyBIYW5kbGVyIHsKKyAgICAgICAgcHVibGljIE15SGFuZGxlcihMb29wZXIgbG9vcGVyKSB7CisgICAgICAgICAgICBzdXBlcihsb29wZXIpOworICAgICAgICB9CisKICAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgIHB1YmxpYyB2b2lkIGhhbmRsZU1lc3NhZ2UoTWVzc2FnZSBtc2cpIHsKICAgICAgICAgICAgIE5ldHdvcmtJbmZvIGluZm87CkBAIC0xNDUzLDM0ICsxNjI3LDMwIEBACiAgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVDb25uZWN0KGluZm8pOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgY2FzZSBOZXR3b3JrU3RhdGVUcmFja2VyLkVWRU5UX1NDQU5fUkVTVUxUU19BVkFJTEFCTEU6Ci0gICAgICAgICAgICAgICAgICAgIGluZm8gPSAoTmV0d29ya0luZm8pIG1zZy5vYmo7Ci0gICAgICAgICAgICAgICAgICAgIGhhbmRsZVNjYW5SZXN1bHRzQXZhaWxhYmxlKGluZm8pOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGNhc2UgTmV0d29ya1N0YXRlVHJhY2tlci5FVkVOVF9OT1RJRklDQVRJT05fQ0hBTkdFRDoKLSAgICAgICAgICAgICAgICAgICAgaGFuZGxlTm90aWZpY2F0aW9uQ2hhbmdlKG1zZy5hcmcxID09IDEsIG1zZy5hcmcyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChOb3RpZmljYXRpb24pIG1zZy5vYmopOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQogICAgICAgICAgICAgICAgIGNhc2UgTmV0d29ya1N0YXRlVHJhY2tlci5FVkVOVF9DT05GSUdVUkFUSU9OX0NIQU5HRUQ6CisgICAgICAgICAgICAgICAgICAgIC8vIFRPRE8gLSBtYWtlIHRoaXMgaGFuZGxlIGlwL3Byb3h5L2dhdGV3YXkvZG5zIGNoYW5nZXMKICAgICAgICAgICAgICAgICAgICAgaW5mbyA9IChOZXR3b3JrSW5mbykgbXNnLm9iajsKICAgICAgICAgICAgICAgICAgICAgdHlwZSA9IGluZm8uZ2V0VHlwZSgpOwogICAgICAgICAgICAgICAgICAgICBoYW5kbGVEbnNDb25maWd1cmF0aW9uQ2hhbmdlKHR5cGUpOwogICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGNhc2UgTmV0d29ya1N0YXRlVHJhY2tlci5FVkVOVF9ST0FNSU5HX0NIQU5HRUQ6Ci0gICAgICAgICAgICAgICAgICAgIC8vIGZpbGwgbWUgaW4KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBjYXNlIE5ldHdvcmtTdGF0ZVRyYWNrZXIuRVZFTlRfTkVUV09SS19TVUJUWVBFX0NIQU5HRUQ6Ci0gICAgICAgICAgICAgICAgICAgIC8vIGZpbGwgbWUgaW4KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgY2FzZSBOZXR3b3JrU3RhdGVUcmFja2VyLkVWRU5UX1JFU1RPUkVfREVGQVVMVF9ORVRXT1JLOgogICAgICAgICAgICAgICAgICAgICBGZWF0dXJlVXNlciB1ID0gKEZlYXR1cmVVc2VyKW1zZy5vYmo7CiAgICAgICAgICAgICAgICAgICAgIHUuZXhwaXJlKCk7CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgTmV0d29ya1N0YXRlVHJhY2tlci5FVkVOVF9DTEVBUl9ORVRfVFJBTlNJVElPTl9XQUtFTE9DSzoKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGNhdXNlZEJ5ID0gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgc3luY2hyb25pemVkIChDb25uZWN0aXZpdHlTZXJ2aWNlLnRoaXMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtc2cuYXJnMSA9PSBtTmV0VHJhbnNpdGlvbldha2VMb2NrU2VyaWFsTnVtYmVyICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1OZXRUcmFuc2l0aW9uV2FrZUxvY2suaXNIZWxkKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTmV0VHJhbnNpdGlvbldha2VMb2NrLnJlbGVhc2UoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXVzZWRCeSA9IG1OZXRUcmFuc2l0aW9uV2FrZUxvY2tDYXVzZWRCeTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAoY2F1c2VkQnkgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgU2xvZy5kKFRBRywgIk5ldFRyYW5zaXRpb24gV2FrZWxvY2sgZm9yICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXVzZWRCeSArICIgcmVsZWFzZWQgYnkgdGltZW91dCIpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIGNhc2UgTmV0d29ya1N0YXRlVHJhY2tlci5FVkVOVF9JTkVUX0NPTkRJVElPTl9DSEFOR0U6CiAgICAgICAgICAgICAgICAgICAgIGlmIChEQkcpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIFNsb2cuZChUQUcsICJJbmV0IGNvbm5lY3Rpdml0eSBjaGFuZ2UsIG5ldD0iICsKQEAgLTE2MDEsNiArMTc3MSwxNSBAQAogICAgICAgICB9CiAgICAgfQogCisgICAgcHVibGljIFN0cmluZ1tdIGdldFRldGhlcmFibGVCbHVldG9vdGhSZWdleHMoKSB7CisgICAgICAgIGVuZm9yY2VUZXRoZXJBY2Nlc3NQZXJtaXNzaW9uKCk7CisgICAgICAgIGlmIChpc1RldGhlcmluZ1N1cHBvcnRlZCgpKSB7CisgICAgICAgICAgICByZXR1cm4gbVRldGhlcmluZy5nZXRUZXRoZXJhYmxlQmx1ZXRvb3RoUmVnZXhzKCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IFN0cmluZ1swXTsKKyAgICAgICAgfQorICAgIH0KKwogICAgIC8vIFRPRE8gLSBtb3ZlIGlmYWNlIGxpc3RpbmcsIHF1ZXJpZXMsIGV0YyB0byBuZXcgbW9kdWxlCiAgICAgLy8gamF2YWRvYyBmcm9tIGludGVyZmFjZQogICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRUZXRoZXJhYmxlSWZhY2VzKCkgewpAQCAtMTYyOSw2ICsxODA4LDI1IEBACiAgICAgICAgIHJldHVybiB0ZXRoZXJFbmFibGVkSW5TZXR0aW5ncyAmJiBtVGV0aGVyaW5nQ29uZmlnVmFsaWQ7CiAgICAgfQogCisgICAgLy8gQW4gQVBJIE5ldHdvcmtTdGF0ZVRyYWNrZXJzIGNhbiBjYWxsIHdoZW4gdGhleSBsb3NlIHRoZWlyIG5ldHdvcmsuCisgICAgLy8gVGhpcyB3aWxsIGF1dG9tYXRpY2FsbHkgYmUgY2xlYXJlZCBhZnRlciBYIHNlY29uZHMgb3IgYSBuZXR3b3JrIGJlY29tZXMgQ09OTkVDVEVELAorICAgIC8vIHdoaWNoZXZlciBoYXBwZW5zIGZpcnN0LiAgVGhlIHRpbWVyIGlzIHN0YXJ0ZWQgYnkgdGhlIGZpcnN0IGNhbGxlciBhbmQgbm90CisgICAgLy8gcmVzdGFydGVkIGJ5IHN1YnNlcXVlbnQgY2FsbGVycy4KKyAgICBwdWJsaWMgdm9pZCByZXF1ZXN0TmV0d29ya1RyYW5zaXRpb25XYWtlbG9jayhTdHJpbmcgZm9yV2hvbSkgeworICAgICAgICBlbmZvcmNlQ29ubmVjdGl2aXR5SW50ZXJuYWxQZXJtaXNzaW9uKCk7CisgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgeworICAgICAgICAgICAgaWYgKG1OZXRUcmFuc2l0aW9uV2FrZUxvY2suaXNIZWxkKCkpIHJldHVybjsKKyAgICAgICAgICAgIG1OZXRUcmFuc2l0aW9uV2FrZUxvY2tTZXJpYWxOdW1iZXIrKzsKKyAgICAgICAgICAgIG1OZXRUcmFuc2l0aW9uV2FrZUxvY2suYWNxdWlyZSgpOworICAgICAgICAgICAgbU5ldFRyYW5zaXRpb25XYWtlTG9ja0NhdXNlZEJ5ID0gZm9yV2hvbTsKKyAgICAgICAgfQorICAgICAgICBtSGFuZGxlci5zZW5kTWVzc2FnZURlbGF5ZWQobUhhbmRsZXIub2J0YWluTWVzc2FnZSgKKyAgICAgICAgICAgICAgICBOZXR3b3JrU3RhdGVUcmFja2VyLkVWRU5UX0NMRUFSX05FVF9UUkFOU0lUSU9OX1dBS0VMT0NLLAorICAgICAgICAgICAgICAgIG1OZXRUcmFuc2l0aW9uV2FrZUxvY2tTZXJpYWxOdW1iZXIsIDApLAorICAgICAgICAgICAgICAgIG1OZXRUcmFuc2l0aW9uV2FrZUxvY2tUaW1lb3V0KTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKwogICAgIC8vIDEwMCBwZXJjZW50IGlzIGZ1bGwgZ29vZCwgMCBpcyBmdWxsIGJhZC4KICAgICBwdWJsaWMgdm9pZCByZXBvcnRJbmV0Q29uZGl0aW9uKGludCBuZXR3b3JrVHlwZSwgaW50IHBlcmNlbnRhZ2UpIHsKICAgICAgICAgaWYgKERCRykgU2xvZy5kKFRBRywgInJlcG9ydE5ldHdvcmtDb25kaXRpb24oIiArIG5ldHdvcmtUeXBlICsgIiwgIiArIHBlcmNlbnRhZ2UgKyAiKSIpOwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvQ291bnRyeURldGVjdG9yU2VydmljZS5qYXZhIGIvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvQ291bnRyeURldGVjdG9yU2VydmljZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMwODFlYmUKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9Db3VudHJ5RGV0ZWN0b3JTZXJ2aWNlLmphdmEKQEAgLTAsMCArMSwyMDQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdAorICogdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKKyAqIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgV0lUSE9VVAorICogV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlCisgKiBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlcgorICogdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5zZXJ2ZXI7CisKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKKworaW1wb3J0IGNvbS5hbmRyb2lkLnNlcnZlci5sb2NhdGlvbi5Db21wcmVoZW5zaXZlQ291bnRyeURldGVjdG9yOworCitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5sb2NhdGlvbi5Db3VudHJ5OworaW1wb3J0IGFuZHJvaWQubG9jYXRpb24uQ291bnRyeUxpc3RlbmVyOworaW1wb3J0IGFuZHJvaWQubG9jYXRpb24uSUNvdW50cnlEZXRlY3RvcjsKK2ltcG9ydCBhbmRyb2lkLmxvY2F0aW9uLklDb3VudHJ5TGlzdGVuZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyOworaW1wb3J0IGFuZHJvaWQub3MuSUJpbmRlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLkxvb3BlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLlByb2Nlc3M7CitpbXBvcnQgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb247CitpbXBvcnQgYW5kcm9pZC51dGlsLlNsb2c7CisKKy8qKgorICogVGhpcyBjbGFzcyBkZXRlY3RzIHRoZSBjb3VudHJ5IHRoYXQgdGhlIHVzZXIgaXMgaW4gdGhyb3VnaAorICoge0BsaW5rIENvbXByZWhlbnNpdmVDb3VudHJ5RGV0ZWN0b3J9LgorICoKKyAqIEBoaWRlCisgKi8KK3B1YmxpYyBjbGFzcyBDb3VudHJ5RGV0ZWN0b3JTZXJ2aWNlIGV4dGVuZHMgSUNvdW50cnlEZXRlY3Rvci5TdHViIGltcGxlbWVudHMgUnVubmFibGUgeworCisgICAgLyoqCisgICAgICogVGhlIGNsYXNzIHJlcHJlc2VudHMgdGhlIHJlbW90ZSBsaXN0ZW5lciwgaXQgd2lsbCBhbHNvIHJlbW92ZXMgaXRzZWxmCisgICAgICogZnJvbSBsaXN0ZW5lciBsaXN0IHdoZW4gdGhlIHJlbW90ZSBwcm9jZXNzIHdhcyBkaWVkLgorICAgICAqLworICAgIHByaXZhdGUgZmluYWwgY2xhc3MgUmVjZWl2ZXIgaW1wbGVtZW50cyBJQmluZGVyLkRlYXRoUmVjaXBpZW50IHsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBJQ291bnRyeUxpc3RlbmVyIG1MaXN0ZW5lcjsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBJQmluZGVyIG1LZXk7CisKKyAgICAgICAgcHVibGljIFJlY2VpdmVyKElDb3VudHJ5TGlzdGVuZXIgbGlzdGVuZXIpIHsKKyAgICAgICAgICAgIG1MaXN0ZW5lciA9IGxpc3RlbmVyOworICAgICAgICAgICAgbUtleSA9IGxpc3RlbmVyLmFzQmluZGVyKCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBiaW5kZXJEaWVkKCkgeworICAgICAgICAgICAgcmVtb3ZlTGlzdGVuZXIobUtleSk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvdGhlck9iaikgeworICAgICAgICAgICAgaWYgKG90aGVyT2JqIGluc3RhbmNlb2YgUmVjZWl2ZXIpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbUtleS5lcXVhbHMoKChSZWNlaXZlcikgb3RoZXJPYmopLm1LZXkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7CisgICAgICAgICAgICByZXR1cm4gbUtleS5oYXNoQ29kZSgpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIElDb3VudHJ5TGlzdGVuZXIgZ2V0TGlzdGVuZXIoKSB7CisgICAgICAgICAgICByZXR1cm4gbUxpc3RlbmVyOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIFRBRyA9ICJDb3VudHJ5RGV0ZWN0b3JTZXJ2aWNlIjsKKworICAgIHByaXZhdGUgZmluYWwgSGFzaE1hcDxJQmluZGVyLCBSZWNlaXZlcj4gbVJlY2VpdmVyczsKKyAgICBwcml2YXRlIGZpbmFsIENvbnRleHQgbUNvbnRleHQ7CisgICAgcHJpdmF0ZSBDb21wcmVoZW5zaXZlQ291bnRyeURldGVjdG9yIG1Db3VudHJ5RGV0ZWN0b3I7CisgICAgcHJpdmF0ZSBib29sZWFuIG1TeXN0ZW1SZWFkeTsKKyAgICBwcml2YXRlIEhhbmRsZXIgbUhhbmRsZXI7CisgICAgcHJpdmF0ZSBDb3VudHJ5TGlzdGVuZXIgbUxvY2F0aW9uQmFzZWREZXRlY3Rvckxpc3RlbmVyOworCisgICAgcHVibGljIENvdW50cnlEZXRlY3RvclNlcnZpY2UoQ29udGV4dCBjb250ZXh0KSB7CisgICAgICAgIHN1cGVyKCk7CisgICAgICAgIG1SZWNlaXZlcnMgPSBuZXcgSGFzaE1hcDxJQmluZGVyLCBSZWNlaXZlcj4oKTsKKyAgICAgICAgbUNvbnRleHQgPSBjb250ZXh0OworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBDb3VudHJ5IGRldGVjdENvdW50cnkoKSB0aHJvd3MgUmVtb3RlRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKCFtU3lzdGVtUmVhZHkpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBSZW1vdGVFeGNlcHRpb24oKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbUNvdW50cnlEZXRlY3Rvci5kZXRlY3RDb3VudHJ5KCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkIHRoZSBJQ291bnRyeUxpc3RlbmVyIGludG8gdGhlIGxpc3RlbmVyIGxpc3QuCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgYWRkQ291bnRyeUxpc3RlbmVyKElDb3VudHJ5TGlzdGVuZXIgbGlzdGVuZXIpIHRocm93cyBSZW1vdGVFeGNlcHRpb24geworICAgICAgICBpZiAoIW1TeXN0ZW1SZWFkeSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFJlbW90ZUV4Y2VwdGlvbigpOworICAgICAgICB9CisgICAgICAgIGFkZExpc3RlbmVyKGxpc3RlbmVyKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZW1vdmUgdGhlIElDb3VudHJ5TGlzdGVuZXIgZnJvbSB0aGUgbGlzdGVuZXIgbGlzdC4KKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCByZW1vdmVDb3VudHJ5TGlzdGVuZXIoSUNvdW50cnlMaXN0ZW5lciBsaXN0ZW5lcikgdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbiB7CisgICAgICAgIGlmICghbVN5c3RlbVJlYWR5KSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgUmVtb3RlRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKyAgICAgICAgcmVtb3ZlTGlzdGVuZXIobGlzdGVuZXIuYXNCaW5kZXIoKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGFkZExpc3RlbmVyKElDb3VudHJ5TGlzdGVuZXIgbGlzdGVuZXIpIHsKKyAgICAgICAgc3luY2hyb25pemVkIChtUmVjZWl2ZXJzKSB7CisgICAgICAgICAgICBSZWNlaXZlciByID0gbmV3IFJlY2VpdmVyKGxpc3RlbmVyKTsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgbGlzdGVuZXIuYXNCaW5kZXIoKS5saW5rVG9EZWF0aChyLCAwKTsKKyAgICAgICAgICAgICAgICBtUmVjZWl2ZXJzLnB1dChsaXN0ZW5lci5hc0JpbmRlcigpLCByKTsKKyAgICAgICAgICAgICAgICBpZiAobVJlY2VpdmVycy5zaXplKCkgPT0gMSkgeworICAgICAgICAgICAgICAgICAgICBTbG9nLmQoVEFHLCAiVGhlIGZpcnN0IGxpc3RlbmVyIGlzIGFkZGVkIik7CisgICAgICAgICAgICAgICAgICAgIHNldENvdW50cnlMaXN0ZW5lcihtTG9jYXRpb25CYXNlZERldGVjdG9yTGlzdGVuZXIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgU2xvZy5lKFRBRywgImxpbmtUb0RlYXRoIGZhaWxlZDoiLCBlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCByZW1vdmVMaXN0ZW5lcihJQmluZGVyIGtleSkgeworICAgICAgICBzeW5jaHJvbml6ZWQgKG1SZWNlaXZlcnMpIHsKKyAgICAgICAgICAgIG1SZWNlaXZlcnMucmVtb3ZlKGtleSk7CisgICAgICAgICAgICBpZiAobVJlY2VpdmVycy5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICBzZXRDb3VudHJ5TGlzdGVuZXIobnVsbCk7CisgICAgICAgICAgICAgICAgU2xvZy5kKFRBRywgIk5vIGxpc3RlbmVyIGlzIGxlZnQiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworCisgICAgcHJvdGVjdGVkIHZvaWQgbm90aWZ5UmVjZWl2ZXJzKENvdW50cnkgY291bnRyeSkgeworICAgICAgICBzeW5jaHJvbml6ZWQobVJlY2VpdmVycykgeworICAgICAgICAgICAgZm9yIChSZWNlaXZlciByZWNlaXZlciA6IG1SZWNlaXZlcnMudmFsdWVzKCkpIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICByZWNlaXZlci5nZXRMaXN0ZW5lcigpLm9uQ291bnRyeURldGVjdGVkKGNvdW50cnkpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIFRPRE86IFNoYWxsIHdlIHJlbW92ZSB0aGUgcmVjZWl2ZXI/CisgICAgICAgICAgICAgICAgICAgIFNsb2cuZShUQUcsICJub3RpZnlSZWNlaXZlcnMgZmFpbGVkOiIsIGUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHZvaWQgc3lzdGVtUmVhZHkoKSB7CisgICAgICAgIC8vIFNoYWxsIHdlIHdhaXQgZm9yIHRoZSBpbml0aWFsaXphdGlvbiBmaW5pc2guCisgICAgICAgIFRocmVhZCB0aHJlYWQgPSBuZXcgVGhyZWFkKHRoaXMsICJDb3VudHJ5RGV0ZWN0b3JTZXJ2aWNlIik7CisgICAgICAgIHRocmVhZC5zdGFydCgpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBpbml0aWFsaXplKCkgeworICAgICAgICBtQ291bnRyeURldGVjdG9yID0gbmV3IENvbXByZWhlbnNpdmVDb3VudHJ5RGV0ZWN0b3IobUNvbnRleHQpOworICAgICAgICBtTG9jYXRpb25CYXNlZERldGVjdG9yTGlzdGVuZXIgPSBuZXcgQ291bnRyeUxpc3RlbmVyKCkgeworICAgICAgICAgICAgcHVibGljIHZvaWQgb25Db3VudHJ5RGV0ZWN0ZWQoZmluYWwgQ291bnRyeSBjb3VudHJ5KSB7CisgICAgICAgICAgICAgICAgbUhhbmRsZXIucG9zdChuZXcgUnVubmFibGUoKSB7CisgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5vdGlmeVJlY2VpdmVycyhjb3VudHJ5KTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgfQorICAgICAgICB9OworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgUHJvY2Vzcy5zZXRUaHJlYWRQcmlvcml0eShQcm9jZXNzLlRIUkVBRF9QUklPUklUWV9CQUNLR1JPVU5EKTsKKyAgICAgICAgTG9vcGVyLnByZXBhcmUoKTsKKyAgICAgICAgbUhhbmRsZXIgPSBuZXcgSGFuZGxlcigpOworICAgICAgICBpbml0aWFsaXplKCk7CisgICAgICAgIG1TeXN0ZW1SZWFkeSA9IHRydWU7CisgICAgICAgIExvb3Blci5sb29wKCk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIHZvaWQgc2V0Q291bnRyeUxpc3RlbmVyKGZpbmFsIENvdW50cnlMaXN0ZW5lciBsaXN0ZW5lcikgeworICAgICAgICBtSGFuZGxlci5wb3N0KG5ldyBSdW5uYWJsZSgpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgIG1Db3VudHJ5RGV0ZWN0b3Iuc2V0Q291bnRyeUxpc3RlbmVyKGxpc3RlbmVyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisgICAgfQorCisgICAgLy8gRm9yIHRlc3RpbmcKKyAgICBib29sZWFuIGlzU3lzdGVtUmVhZHkoKSB7CisgICAgICAgIHJldHVybiBtU3lzdGVtUmVhZHk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvRGVtb0RhdGFTZXQuamF2YSBiL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL0RlbW9EYXRhU2V0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI3Nzk4NWYuLjAwMDAwMDAKLS0tIGEvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvRGVtb0RhdGFTZXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5zZXJ2ZXI7Ci0KLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFJlc29sdmVyOwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZW50VmFsdWVzOwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5Bc3NldE1hbmFnZXI7Ci1pbXBvcnQgYW5kcm9pZC5uZXQuVXJpOwotaW1wb3J0IGFuZHJvaWQub3MuRW52aXJvbm1lbnQ7Ci1pbXBvcnQgYW5kcm9pZC5wcm92aWRlci5Db250YWN0czsKLWltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLlNldHRpbmdzOwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuTWVkaWFTdG9yZS5JbWFnZXM7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkNvbmZpZzsKLWltcG9ydCBhbmRyb2lkLnV0aWwuU2xvZzsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwotCi1wdWJsaWMgY2xhc3MgRGVtb0RhdGFTZXQKLXsKLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgTE9HX1RBRyA9ICJEZW1vRGF0YVNldCI7Ci0KLSAgICBwcml2YXRlIENvbnRlbnRSZXNvbHZlciBtQ29udGVudFJlc29sdmVyOwotCi0gICAgcHVibGljIGZpbmFsIHZvaWQgYWRkKENvbnRleHQgY29udGV4dCkKLSAgICB7Ci0gICAgICAgIG1Db250ZW50UmVzb2x2ZXIgPSBjb250ZXh0LmdldENvbnRlbnRSZXNvbHZlcigpOwotCi0gICAgICAgIC8vIFJlbW92ZSBhbGwgdGhlIG9sZCBkYXRhCi0gICAgICAgIG1Db250ZW50UmVzb2x2ZXIuZGVsZXRlKENvbnRhY3RzLlBlb3BsZS5DT05URU5UX1VSSSwgbnVsbCwgbnVsbCk7Ci0KLSAgICAgICAgLy8gQWRkIHRoZSBuZXcgZGF0YQotICAgICAgICBhZGREZWZhdWx0RGF0YSgpOwotICAgICAgICAKLSAgICAgICAgLy8gQWRkIGltYWdlcyBmcm9tIC9hbmRyb2lkL2ltYWdlcwotICAgICAgICBhZGREZWZhdWx0SW1hZ2VzKCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBmaW5hbCB2b2lkIGFkZERlZmF1bHRJbWFnZXMoKQotICAgIHsKLSAgICAgICAgRmlsZSByb290RGlyZWN0b3J5ID0gRW52aXJvbm1lbnQuZ2V0Um9vdERpcmVjdG9yeSgpOwotICAgICAgICBTdHJpbmcgW10gZmlsZXMKLSAgICAgICAgICAgID0gbmV3IEZpbGUocm9vdERpcmVjdG9yeSwgImltYWdlcyIpLmxpc3QoKTsKLSAgICAgICAgaW50IGNvdW50ID0gZmlsZXMubGVuZ3RoOwotCi0gICAgICAgIGlmIChjb3VudCA9PSAwKSB7Ci0gICAgICAgICAgICBTbG9nLmkoTE9HX1RBRywgImFkZERlZmF1bHRJbWFnZXM6IG5vIGltYWdlcyBmb3VuZCEiKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSBmaWxlc1tpXTsKLSAgICAgICAgICAgIFN0cmluZyBwYXRoID0gcm9vdERpcmVjdG9yeSArICIvIiArIG5hbWU7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgSW1hZ2VzLk1lZGlhLmluc2VydEltYWdlKG1Db250ZW50UmVzb2x2ZXIsIHBhdGgsIG5hbWUsIG51bGwpOwotICAgICAgICAgICAgfSBjYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICBTbG9nLmUoTE9HX1RBRywgIkZhaWxlZCB0byBpbXBvcnQgaW1hZ2UgIiArIHBhdGgsIGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgZmluYWwgdm9pZCBhZGREZWZhdWx0RGF0YSgpCi0gICAgewotICAgICAgICBTbG9nLmkoTE9HX1RBRywgIkFkZGluZyBkZWZhdWx0IGRhdGEuLi4iKTsKLQotLy8gICAgICAgYWRkSW1hZ2UoIlZpb2xldCIsICJpbWFnZXMvdmlvbGV0LnBuZyIpOwotLy8gICAgICAgYWRkSW1hZ2UoIkNvcmt5IiwgImltYWdlcy9jb3JreS5wbmciKTsKLQotICAgICAgICAvLyBQRU5ESU5HOiBzaG91bGQgdGhpcyBiZSBkb25lIGhlcmU/IT8hCi0gICAgICAgIEludGVudCBpbnRlbnQgPSBuZXcgSW50ZW50KAotICAgICAgICAgICAgICAgIEludGVudC5BQ1RJT05fQ0FMTCwgVXJpLmZyb21QYXJ0cygidm9pY2VtYWlsIiwgIiIsIG51bGwpKTsKLSAgICAgICAgYWRkU2hvcnRjdXQoIjEiLCBpbnRlbnQpOwotICAgIH0KLQotICAgIHByaXZhdGUgZmluYWwgVXJpIGFkZEltYWdlKFN0cmluZyBuYW1lLCBVcmkgZmlsZSkKLSAgICB7Ci0gICAgICAgIENvbnRlbnRWYWx1ZXMgaW1hZ2V2ID0gbmV3IENvbnRlbnRWYWx1ZXMoKTsKLSAgICAgICAgaW1hZ2V2LnB1dCgibmFtZSIsIG5hbWUpOwotCi0gICAgICAgIFVyaSB1cmwgPSBudWxsOwotCi0gICAgICAgIEFzc2V0TWFuYWdlciBhc3MgPSBBc3NldE1hbmFnZXIuZ2V0U3lzdGVtKCk7Ci0gICAgICAgIElucHV0U3RyZWFtIGluID0gbnVsbDsKLSAgICAgICAgT3V0cHV0U3RyZWFtIG91dCA9IG51bGw7Ci0gICAgICAgIAotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgaW4gPSBhc3Mub3BlbihmaWxlLnRvU3RyaW5nKCkpOwotCi0gICAgICAgICAgICB1cmwgPSBtQ29udGVudFJlc29sdmVyLmluc2VydChJbWFnZXMuTWVkaWEuSU5URVJOQUxfQ09OVEVOVF9VUkksIGltYWdldik7Ci0gICAgICAgICAgICBvdXQgPSBtQ29udGVudFJlc29sdmVyLm9wZW5PdXRwdXRTdHJlYW0odXJsKTsKLQotICAgICAgICAgICAgZmluYWwgaW50IHNpemUgPSA4ICogMTAyNDsKLSAgICAgICAgICAgIGJ5dGVbXSBidWYgPSBuZXcgYnl0ZVtzaXplXTsKLQotICAgICAgICAgICAgaW50IGNvdW50ID0gMDsKLSAgICAgICAgICAgIGRvCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY291bnQgPSBpbi5yZWFkKGJ1ZiwgMCwgc2l6ZSk7Ci0gICAgICAgICAgICAgICAgaWYgKGNvdW50ID4gMCkgewotICAgICAgICAgICAgICAgICAgICBvdXQud3JpdGUoYnVmLCAwLCBjb3VudCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSB3aGlsZSAoY291bnQgPiAwKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFNsb2cuZShMT0dfVEFHLCAiRmFpbGVkIHRvIGluc2VydCBpbWFnZSAnIiArIGZpbGUgKyAiJyIsIGUpOwotICAgICAgICAgICAgdXJsID0gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiB1cmw7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBmaW5hbCBVcmkgYWRkU2hvcnRjdXQoU3RyaW5nIHNob3J0Y3V0LCBJbnRlbnQgaW50ZW50KQotICAgIHsKLSAgICAgICAgaWYgKENvbmZpZy5MT0dWKSBTbG9nLnYoTE9HX1RBRywgImFkZFNob3J0Y3V0OiBzaG9ydGN1dD0iICsgc2hvcnRjdXQgKyAiLCBpbnRlbnQ9IiArIGludGVudCk7Ci0gICAgICAgIHJldHVybiBTZXR0aW5ncy5Cb29rbWFya3MuYWRkKG1Db250ZW50UmVzb2x2ZXIsIGludGVudCwgbnVsbCwgbnVsbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvcnRjdXQgIT0gbnVsbCA/IHNob3J0Y3V0LmNoYXJBdCgwKSA6IDAsIDApOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL0RldmljZVBvbGljeU1hbmFnZXJTZXJ2aWNlLmphdmEgYi9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9EZXZpY2VQb2xpY3lNYW5hZ2VyU2VydmljZS5qYXZhCmluZGV4IDE5ZDE0NmQuLjBjM2EwZTYgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL0RldmljZVBvbGljeU1hbmFnZXJTZXJ2aWNlLmphdmEKKysrIGIvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvRGV2aWNlUG9saWN5TWFuYWdlclNlcnZpY2UuamF2YQpAQCAtMzMsNiArMzMsNyBAQAogaW1wb3J0IGFuZHJvaWQuYXBwLmFkbWluLklEZXZpY2VQb2xpY3lNYW5hZ2VyOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Ccm9hZGNhc3RSZWNlaXZlcjsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29tcG9uZW50TmFtZTsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFJlc29sdmVyOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLlBhY2thZ2VNYW5hZ2VyOwpAQCAtNDYsNiArNDcsOCBAQAogaW1wb3J0IGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uOwogaW1wb3J0IGFuZHJvaWQub3MuU2VydmljZU1hbmFnZXI7CiBpbXBvcnQgYW5kcm9pZC5vcy5TeXN0ZW1DbG9jazsKK2ltcG9ydCBhbmRyb2lkLm5ldC5Qcm94eTsKK2ltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLlNldHRpbmdzOwogaW1wb3J0IGFuZHJvaWQudXRpbC5TbG9nOwogaW1wb3J0IGFuZHJvaWQudXRpbC5QcmludFdyaXRlclByaW50ZXI7CiBpbXBvcnQgYW5kcm9pZC51dGlsLlByaW50ZXI7CkBAIC01OCw0NiArNjEsNjYgQEAKIGltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07CiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOworaW1wb3J0IGphdmEubmV0LkluZXRTb2NrZXRBZGRyZXNzOwogaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CiBpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLlNldDsKIAogLyoqCiAgKiBJbXBsZW1lbnRhdGlvbiBvZiB0aGUgZGV2aWNlIHBvbGljeSBBUElzLgogICovCiBwdWJsaWMgY2xhc3MgRGV2aWNlUG9saWN5TWFuYWdlclNlcnZpY2UgZXh0ZW5kcyBJRGV2aWNlUG9saWN5TWFuYWdlci5TdHViIHsKICAgICBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJEZXZpY2VQb2xpY3lNYW5hZ2VyU2VydmljZSI7Ci0gICAgCisKICAgICBmaW5hbCBDb250ZXh0IG1Db250ZXh0OwogICAgIGZpbmFsIE15UGFja2FnZU1vbml0b3IgbU1vbml0b3I7CiAKICAgICBJUG93ZXJNYW5hZ2VyIG1JUG93ZXJNYW5hZ2VyOwotICAgIAorCiAgICAgaW50IG1BY3RpdmVQYXNzd29yZFF1YWxpdHkgPSBEZXZpY2VQb2xpY3lNYW5hZ2VyLlBBU1NXT1JEX1FVQUxJVFlfVU5TUEVDSUZJRUQ7CiAgICAgaW50IG1BY3RpdmVQYXNzd29yZExlbmd0aCA9IDA7CisgICAgaW50IG1BY3RpdmVQYXNzd29yZFVwcGVyQ2FzZSA9IDA7CisgICAgaW50IG1BY3RpdmVQYXNzd29yZExvd2VyQ2FzZSA9IDA7CisgICAgaW50IG1BY3RpdmVQYXNzd29yZExldHRlcnMgPSAwOworICAgIGludCBtQWN0aXZlUGFzc3dvcmROdW1lcmljID0gMDsKKyAgICBpbnQgbUFjdGl2ZVBhc3N3b3JkU3ltYm9scyA9IDA7CisgICAgaW50IG1BY3RpdmVQYXNzd29yZE5vbkxldHRlciA9IDA7CiAgICAgaW50IG1GYWlsZWRQYXNzd29yZEF0dGVtcHRzID0gMDsKLSAgICAKKwogICAgIGludCBtUGFzc3dvcmRPd25lciA9IC0xOwotICAgIAorCiAgICAgZmluYWwgSGFzaE1hcDxDb21wb25lbnROYW1lLCBBY3RpdmVBZG1pbj4gbUFkbWluTWFwCiAgICAgICAgICAgICA9IG5ldyBIYXNoTWFwPENvbXBvbmVudE5hbWUsIEFjdGl2ZUFkbWluPigpOwogICAgIGZpbmFsIEFycmF5TGlzdDxBY3RpdmVBZG1pbj4gbUFkbWluTGlzdAogICAgICAgICAgICAgPSBuZXcgQXJyYXlMaXN0PEFjdGl2ZUFkbWluPigpOwotICAgIAorCiAgICAgc3RhdGljIGNsYXNzIEFjdGl2ZUFkbWluIHsKICAgICAgICAgZmluYWwgRGV2aWNlQWRtaW5JbmZvIGluZm87Ci0gICAgICAgIAorCiAgICAgICAgIGludCBwYXNzd29yZFF1YWxpdHkgPSBEZXZpY2VQb2xpY3lNYW5hZ2VyLlBBU1NXT1JEX1FVQUxJVFlfVU5TUEVDSUZJRUQ7CiAgICAgICAgIGludCBtaW5pbXVtUGFzc3dvcmRMZW5ndGggPSAwOworICAgICAgICBpbnQgcGFzc3dvcmRIaXN0b3J5TGVuZ3RoID0gMDsKKyAgICAgICAgaW50IG1pbmltdW1QYXNzd29yZFVwcGVyQ2FzZSA9IDA7CisgICAgICAgIGludCBtaW5pbXVtUGFzc3dvcmRMb3dlckNhc2UgPSAwOworICAgICAgICBpbnQgbWluaW11bVBhc3N3b3JkTGV0dGVycyA9IDE7CisgICAgICAgIGludCBtaW5pbXVtUGFzc3dvcmROdW1lcmljID0gMTsKKyAgICAgICAgaW50IG1pbmltdW1QYXNzd29yZFN5bWJvbHMgPSAxOworICAgICAgICBpbnQgbWluaW11bVBhc3N3b3JkTm9uTGV0dGVyID0gMDsKICAgICAgICAgbG9uZyBtYXhpbXVtVGltZVRvVW5sb2NrID0gMDsKICAgICAgICAgaW50IG1heGltdW1GYWlsZWRQYXNzd29yZHNGb3JXaXBlID0gMDsKLSAgICAgICAgCisKKyAgICAgICAgLy8gVE9ETzogcmV2aWV3IGltcGxlbWVudGF0aW9uIGRlY2lzaW9ucyB3aXRoIGZyYW1ld29ya3MgdGVhbQorICAgICAgICBib29sZWFuIHNwZWNpZmllc0dsb2JhbFByb3h5ID0gZmFsc2U7CisgICAgICAgIFN0cmluZyBnbG9iYWxQcm94eVNwZWMgPSBudWxsOworICAgICAgICBTdHJpbmcgZ2xvYmFsUHJveHlFeGNsdXNpb25MaXN0ID0gbnVsbDsKKwogICAgICAgICBBY3RpdmVBZG1pbihEZXZpY2VBZG1pbkluZm8gX2luZm8pIHsKICAgICAgICAgICAgIGluZm8gPSBfaW5mbzsKICAgICAgICAgfQotICAgICAgICAKKwogICAgICAgICBpbnQgZ2V0VWlkKCkgeyByZXR1cm4gaW5mby5nZXRBY3Rpdml0eUluZm8oKS5hcHBsaWNhdGlvbkluZm8udWlkOyB9Ci0gICAgICAgIAorCiAgICAgICAgIHZvaWQgd3JpdGVUb1htbChYbWxTZXJpYWxpemVyIG91dCkKICAgICAgICAgICAgICAgICB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uLCBJbGxlZ2FsU3RhdGVFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKICAgICAgICAgICAgIG91dC5zdGFydFRhZyhudWxsLCAicG9saWNpZXMiKTsKQEAgLTExMCw3ICsxMzMsNDIgQEAKICAgICAgICAgICAgICAgICBpZiAobWluaW11bVBhc3N3b3JkTGVuZ3RoID4gMCkgewogICAgICAgICAgICAgICAgICAgICBvdXQuc3RhcnRUYWcobnVsbCwgIm1pbi1wYXNzd29yZC1sZW5ndGgiKTsKICAgICAgICAgICAgICAgICAgICAgb3V0LmF0dHJpYnV0ZShudWxsLCAidmFsdWUiLCBJbnRlZ2VyLnRvU3RyaW5nKG1pbmltdW1QYXNzd29yZExlbmd0aCkpOwotICAgICAgICAgICAgICAgICAgICBvdXQuZW5kVGFnKG51bGwsICJtbi1wYXNzd29yZC1sZW5ndGgiKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0LmVuZFRhZyhudWxsLCAibWluLXBhc3N3b3JkLWxlbmd0aCIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZihwYXNzd29yZEhpc3RvcnlMZW5ndGggPiAwKSB7CisgICAgICAgICAgICAgICAgICAgIG91dC5zdGFydFRhZyhudWxsLCAicGFzc3dvcmQtaGlzdG9yeS1sZW5ndGgiKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0LmF0dHJpYnV0ZShudWxsLCAidmFsdWUiLCBJbnRlZ2VyLnRvU3RyaW5nKHBhc3N3b3JkSGlzdG9yeUxlbmd0aCkpOworICAgICAgICAgICAgICAgICAgICBvdXQuZW5kVGFnKG51bGwsICJwYXNzd29yZC1oaXN0b3J5LWxlbmd0aCIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAobWluaW11bVBhc3N3b3JkVXBwZXJDYXNlID4gMCkgeworICAgICAgICAgICAgICAgICAgICBvdXQuc3RhcnRUYWcobnVsbCwgIm1pbi1wYXNzd29yZC11cHBlcmNhc2UiKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0LmF0dHJpYnV0ZShudWxsLCAidmFsdWUiLCBJbnRlZ2VyLnRvU3RyaW5nKG1pbmltdW1QYXNzd29yZFVwcGVyQ2FzZSkpOworICAgICAgICAgICAgICAgICAgICBvdXQuZW5kVGFnKG51bGwsICJtaW4tcGFzc3dvcmQtdXBwZXJjYXNlIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChtaW5pbXVtUGFzc3dvcmRMb3dlckNhc2UgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgIG91dC5zdGFydFRhZyhudWxsLCAibWluLXBhc3N3b3JkLWxvd2VyY2FzZSIpOworICAgICAgICAgICAgICAgICAgICBvdXQuYXR0cmlidXRlKG51bGwsICJ2YWx1ZSIsIEludGVnZXIudG9TdHJpbmcobWluaW11bVBhc3N3b3JkTG93ZXJDYXNlKSk7CisgICAgICAgICAgICAgICAgICAgIG91dC5lbmRUYWcobnVsbCwgIm1pbi1wYXNzd29yZC1sb3dlcmNhc2UiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKG1pbmltdW1QYXNzd29yZExldHRlcnMgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgIG91dC5zdGFydFRhZyhudWxsLCAibWluLXBhc3N3b3JkLWxldHRlcnMiKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0LmF0dHJpYnV0ZShudWxsLCAidmFsdWUiLCBJbnRlZ2VyLnRvU3RyaW5nKG1pbmltdW1QYXNzd29yZExldHRlcnMpKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0LmVuZFRhZyhudWxsLCAibWluLXBhc3N3b3JkLWxldHRlcnMiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKG1pbmltdW1QYXNzd29yZE51bWVyaWMgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgIG91dC5zdGFydFRhZyhudWxsLCAibWluLXBhc3N3b3JkLW51bWVyaWMiKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0LmF0dHJpYnV0ZShudWxsLCAidmFsdWUiLCBJbnRlZ2VyLnRvU3RyaW5nKG1pbmltdW1QYXNzd29yZE51bWVyaWMpKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0LmVuZFRhZyhudWxsLCAibWluLXBhc3N3b3JkLW51bWVyaWMiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKG1pbmltdW1QYXNzd29yZFN5bWJvbHMgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgIG91dC5zdGFydFRhZyhudWxsLCAibWluLXBhc3N3b3JkLXN5bWJvbHMiKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0LmF0dHJpYnV0ZShudWxsLCAidmFsdWUiLCBJbnRlZ2VyLnRvU3RyaW5nKG1pbmltdW1QYXNzd29yZFN5bWJvbHMpKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0LmVuZFRhZyhudWxsLCAibWluLXBhc3N3b3JkLXN5bWJvbHMiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKG1pbmltdW1QYXNzd29yZE5vbkxldHRlciA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgb3V0LnN0YXJ0VGFnKG51bGwsICJtaW4tcGFzc3dvcmQtbm9ubGV0dGVyIik7CisgICAgICAgICAgICAgICAgICAgIG91dC5hdHRyaWJ1dGUobnVsbCwgInZhbHVlIiwgSW50ZWdlci50b1N0cmluZyhtaW5pbXVtUGFzc3dvcmROb25MZXR0ZXIpKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0LmVuZFRhZyhudWxsLCAibWluLXBhc3N3b3JkLW5vbmxldHRlciIpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmIChtYXhpbXVtVGltZVRvVW5sb2NrICE9IERldmljZVBvbGljeU1hbmFnZXIuUEFTU1dPUkRfUVVBTElUWV9VTlNQRUNJRklFRCkgewpAQCAtMTIzLDggKzE4MSwyMyBAQAogICAgICAgICAgICAgICAgIG91dC5hdHRyaWJ1dGUobnVsbCwgInZhbHVlIiwgSW50ZWdlci50b1N0cmluZyhtYXhpbXVtRmFpbGVkUGFzc3dvcmRzRm9yV2lwZSkpOwogICAgICAgICAgICAgICAgIG91dC5lbmRUYWcobnVsbCwgIm1heC1mYWlsZWQtcGFzc3dvcmQtd2lwZSIpOwogICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHNwZWNpZmllc0dsb2JhbFByb3h5KSB7CisgICAgICAgICAgICAgICAgb3V0LnN0YXJ0VGFnKG51bGwsICJzcGVjaWZpZXMtZ2xvYmFsLXByb3h5Iik7CisgICAgICAgICAgICAgICAgb3V0LmF0dHJpYnV0ZShudWxsLCAidmFsdWUiLCBCb29sZWFuLnRvU3RyaW5nKHNwZWNpZmllc0dsb2JhbFByb3h5KSk7CisgICAgICAgICAgICAgICAgb3V0LmVuZFRhZyhudWxsLCAic3BlY2lmaWVzX2dsb2JhbF9wcm94eSIpOworICAgICAgICAgICAgICAgIGlmIChnbG9iYWxQcm94eVNwZWMgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBvdXQuc3RhcnRUYWcobnVsbCwgImdsb2JhbC1wcm94eS1zcGVjIik7CisgICAgICAgICAgICAgICAgICAgIG91dC5hdHRyaWJ1dGUobnVsbCwgInZhbHVlIiwgZ2xvYmFsUHJveHlTcGVjKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0LmVuZFRhZyhudWxsLCAiZ2xvYmFsLXByb3h5LXNwZWMiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGdsb2JhbFByb3h5RXhjbHVzaW9uTGlzdCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIG91dC5zdGFydFRhZyhudWxsLCAiZ2xvYmFsLXByb3h5LWV4Y2x1c2lvbi1saXN0Iik7CisgICAgICAgICAgICAgICAgICAgIG91dC5hdHRyaWJ1dGUobnVsbCwgInZhbHVlIiwgZ2xvYmFsUHJveHlFeGNsdXNpb25MaXN0KTsKKyAgICAgICAgICAgICAgICAgICAgb3V0LmVuZFRhZyhudWxsLCAiZ2xvYmFsLXByb3h5LWV4Y2x1c2lvbi1saXN0Iik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQogICAgICAgICB9Ci0gICAgICAgIAorCiAgICAgICAgIHZvaWQgcmVhZEZyb21YbWwoWG1sUHVsbFBhcnNlciBwYXJzZXIpCiAgICAgICAgICAgICAgICAgdGhyb3dzIFhtbFB1bGxQYXJzZXJFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKICAgICAgICAgICAgIGludCBvdXRlckRlcHRoID0gcGFyc2VyLmdldERlcHRoKCk7CkBAIC0xNDMsMTkgKzIxNiw0OSBAQAogICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIm1pbi1wYXNzd29yZC1sZW5ndGgiLmVxdWFscyh0YWcpKSB7CiAgICAgICAgICAgICAgICAgICAgIG1pbmltdW1QYXNzd29yZExlbmd0aCA9IEludGVnZXIucGFyc2VJbnQoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2VyLmdldEF0dHJpYnV0ZVZhbHVlKG51bGwsICJ2YWx1ZSIpKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCJwYXNzd29yZC1oaXN0b3J5LWxlbmd0aCIuZXF1YWxzKHRhZykpIHsKKyAgICAgICAgICAgICAgICAgICAgcGFzc3dvcmRIaXN0b3J5TGVuZ3RoID0gSW50ZWdlci5wYXJzZUludCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJzZXIuZ2V0QXR0cmlidXRlVmFsdWUobnVsbCwgInZhbHVlIikpOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIm1pbi1wYXNzd29yZC11cHBlcmNhc2UiLmVxdWFscyh0YWcpKSB7CisgICAgICAgICAgICAgICAgICAgIG1pbmltdW1QYXNzd29yZFVwcGVyQ2FzZSA9IEludGVnZXIucGFyc2VJbnQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2VyLmdldEF0dHJpYnV0ZVZhbHVlKG51bGwsICJ2YWx1ZSIpKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCJtaW4tcGFzc3dvcmQtbG93ZXJjYXNlIi5lcXVhbHModGFnKSkgeworICAgICAgICAgICAgICAgICAgICBtaW5pbXVtUGFzc3dvcmRMb3dlckNhc2UgPSBJbnRlZ2VyLnBhcnNlSW50KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlci5nZXRBdHRyaWJ1dGVWYWx1ZShudWxsLCAidmFsdWUiKSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmICgibWluLXBhc3N3b3JkLWxldHRlcnMiLmVxdWFscyh0YWcpKSB7CisgICAgICAgICAgICAgICAgICAgIG1pbmltdW1QYXNzd29yZExldHRlcnMgPSBJbnRlZ2VyLnBhcnNlSW50KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlci5nZXRBdHRyaWJ1dGVWYWx1ZShudWxsLCAidmFsdWUiKSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmICgibWluLXBhc3N3b3JkLW51bWVyaWMiLmVxdWFscyh0YWcpKSB7CisgICAgICAgICAgICAgICAgICAgIG1pbmltdW1QYXNzd29yZE51bWVyaWMgPSBJbnRlZ2VyLnBhcnNlSW50KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlci5nZXRBdHRyaWJ1dGVWYWx1ZShudWxsLCAidmFsdWUiKSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmICgibWluLXBhc3N3b3JkLXN5bWJvbHMiLmVxdWFscyh0YWcpKSB7CisgICAgICAgICAgICAgICAgICAgIG1pbmltdW1QYXNzd29yZFN5bWJvbHMgPSBJbnRlZ2VyLnBhcnNlSW50KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlci5nZXRBdHRyaWJ1dGVWYWx1ZShudWxsLCAidmFsdWUiKSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmICgibWluLXBhc3N3b3JkLW5vbmxldHRlciIuZXF1YWxzKHRhZykpIHsKKyAgICAgICAgICAgICAgICAgICAgbWluaW11bVBhc3N3b3JkTm9uTGV0dGVyID0gSW50ZWdlci5wYXJzZUludCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJzZXIuZ2V0QXR0cmlidXRlVmFsdWUobnVsbCwgInZhbHVlIikpOwogICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIm1heC10aW1lLXRvLXVubG9jayIuZXF1YWxzKHRhZykpIHsKICAgICAgICAgICAgICAgICAgICAgbWF4aW11bVRpbWVUb1VubG9jayA9IExvbmcucGFyc2VMb25nKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlci5nZXRBdHRyaWJ1dGVWYWx1ZShudWxsLCAidmFsdWUiKSk7CiAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICgibWF4LWZhaWxlZC1wYXNzd29yZC13aXBlIi5lcXVhbHModGFnKSkgewogICAgICAgICAgICAgICAgICAgICBtYXhpbXVtRmFpbGVkUGFzc3dvcmRzRm9yV2lwZSA9IEludGVnZXIucGFyc2VJbnQoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2VyLmdldEF0dHJpYnV0ZVZhbHVlKG51bGwsICJ2YWx1ZSIpKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCJzcGVjaWZpZXMtZ2xvYmFsLXByb3h5Ii5lcXVhbHModGFnKSkgeworICAgICAgICAgICAgICAgICAgICBzcGVjaWZpZXNHbG9iYWxQcm94eSA9IEJvb2xlYW4uZ2V0Qm9vbGVhbigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJzZXIuZ2V0QXR0cmlidXRlVmFsdWUobnVsbCwgInZhbHVlIikpOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoImdsb2JhbC1wcm94eS1zcGVjIi5lcXVhbHModGFnKSkgeworICAgICAgICAgICAgICAgICAgICBnbG9iYWxQcm94eVNwZWMgPQorICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2VyLmdldEF0dHJpYnV0ZVZhbHVlKG51bGwsICJ2YWx1ZSIpOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoImdsb2JhbC1wcm94eS1leGNsdXNpb24tbGlzdCIuZXF1YWxzKHRhZykpIHsKKyAgICAgICAgICAgICAgICAgICAgZ2xvYmFsUHJveHlFeGNsdXNpb25MaXN0ID0KKyAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlci5nZXRBdHRyaWJ1dGVWYWx1ZShudWxsLCAidmFsdWUiKTsKICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICBTbG9nLncoVEFHLCAiVW5rbm93biBhZG1pbiB0YWc6ICIgKyB0YWcpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBYbWxVdGlscy5za2lwQ3VycmVudFRhZyhwYXJzZXIpOwogICAgICAgICAgICAgfQogICAgICAgICB9Ci0gICAgICAgIAorCiAgICAgICAgIHZvaWQgZHVtcChTdHJpbmcgcHJlZml4LCBQcmludFdyaXRlciBwdykgewogICAgICAgICAgICAgcHcucHJpbnQocHJlZml4KTsgcHcucHJpbnQoInVpZD0iKTsgcHcucHJpbnRsbihnZXRVaWQoKSk7CiAgICAgICAgICAgICBwdy5wcmludChwcmVmaXgpOyBwdy5wcmludGxuKCJwb2xpY2llczoiKTsKQEAgLTE2NiwyMyArMjY5LDQ3IEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICAgICAgcHcucHJpbnQocHJlZml4KTsgcHcucHJpbnQoInBhc3N3b3JkUXVhbGl0eT0weCIpOwotICAgICAgICAgICAgICAgICAgICBwdy5wcmludChJbnRlZ2VyLnRvSGV4U3RyaW5nKHBhc3N3b3JkUXVhbGl0eSkpOwotICAgICAgICAgICAgICAgICAgICBwdy5wcmludCgiIG1pbmltdW1QYXNzd29yZExlbmd0aD0iKTsKKyAgICAgICAgICAgICAgICAgICAgcHcucHJpbnRsbihJbnRlZ2VyLnRvSGV4U3RyaW5nKHBhc3N3b3JkUXVhbGl0eSkpOworICAgICAgICAgICAgcHcucHJpbnQocHJlZml4KTsgcHcucHJpbnQoIm1pbmltdW1QYXNzd29yZExlbmd0aD0iKTsKICAgICAgICAgICAgICAgICAgICAgcHcucHJpbnRsbihtaW5pbXVtUGFzc3dvcmRMZW5ndGgpOworICAgICAgICAgICAgcHcucHJpbnQocHJlZml4KTsgcHcucHJpbnQoInBhc3N3b3JkSGlzdG9yeUxlbmd0aD0iKTsKKyAgICAgICAgICAgICAgICAgICAgcHcucHJpbnRsbihwYXNzd29yZEhpc3RvcnlMZW5ndGgpOworICAgICAgICAgICAgcHcucHJpbnQocHJlZml4KTsgcHcucHJpbnQoIm1pbmltdW1QYXNzd29yZFVwcGVyQ2FzZT0iKTsKKyAgICAgICAgICAgICAgICAgICAgcHcucHJpbnRsbihtaW5pbXVtUGFzc3dvcmRVcHBlckNhc2UpOworICAgICAgICAgICAgcHcucHJpbnQocHJlZml4KTsgcHcucHJpbnQoIm1pbmltdW1QYXNzd29yZExvd2VyQ2FzZT0iKTsKKyAgICAgICAgICAgICAgICAgICAgcHcucHJpbnRsbihtaW5pbXVtUGFzc3dvcmRMb3dlckNhc2UpOworICAgICAgICAgICAgcHcucHJpbnQocHJlZml4KTsgcHcucHJpbnQoIm1pbmltdW1QYXNzd29yZExldHRlcnM9Iik7CisgICAgICAgICAgICAgICAgICAgIHB3LnByaW50bG4obWluaW11bVBhc3N3b3JkTGV0dGVycyk7CisgICAgICAgICAgICBwdy5wcmludChwcmVmaXgpOyBwdy5wcmludCgibWluaW11bVBhc3N3b3JkTnVtZXJpYz0iKTsKKyAgICAgICAgICAgICAgICAgICAgcHcucHJpbnRsbihtaW5pbXVtUGFzc3dvcmROdW1lcmljKTsKKyAgICAgICAgICAgIHB3LnByaW50KHByZWZpeCk7IHB3LnByaW50KCJtaW5pbXVtUGFzc3dvcmRTeW1ib2xzPSIpOworICAgICAgICAgICAgICAgICAgICBwdy5wcmludGxuKG1pbmltdW1QYXNzd29yZFN5bWJvbHMpOworICAgICAgICAgICAgcHcucHJpbnQocHJlZml4KTsgcHcucHJpbnQoIm1pbmltdW1QYXNzd29yZE5vbkxldHRlcj0iKTsKKyAgICAgICAgICAgICAgICAgICAgcHcucHJpbnRsbihtaW5pbXVtUGFzc3dvcmROb25MZXR0ZXIpOwogICAgICAgICAgICAgcHcucHJpbnQocHJlZml4KTsgcHcucHJpbnQoIm1heGltdW1UaW1lVG9VbmxvY2s9Iik7CiAgICAgICAgICAgICAgICAgICAgIHB3LnByaW50bG4obWF4aW11bVRpbWVUb1VubG9jayk7CiAgICAgICAgICAgICBwdy5wcmludChwcmVmaXgpOyBwdy5wcmludCgibWF4aW11bUZhaWxlZFBhc3N3b3Jkc0ZvcldpcGU9Iik7CiAgICAgICAgICAgICAgICAgICAgIHB3LnByaW50bG4obWF4aW11bUZhaWxlZFBhc3N3b3Jkc0ZvcldpcGUpOworICAgICAgICAgICAgcHcucHJpbnQocHJlZml4KTsgcHcucHJpbnQoInNwZWNpZmllc0dsb2JhbFByb3h5PSIpOworICAgICAgICAgICAgICAgICAgICBwdy5wcmludGxuKHNwZWNpZmllc0dsb2JhbFByb3h5KTsKKyAgICAgICAgICAgIGlmIChnbG9iYWxQcm94eVNwZWMgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHB3LnByaW50KHByZWZpeCk7IHB3LnByaW50KCJnbG9iYWxQcm94eVNwZWM9Iik7CisgICAgICAgICAgICAgICAgICAgICAgICBwdy5wcmludGxuKGdsb2JhbFByb3h5U3BlYyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoZ2xvYmFsUHJveHlFeGNsdXNpb25MaXN0ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBwdy5wcmludChwcmVmaXgpOyBwdy5wcmludCgiZ2xvYmFsUHJveHlFY2x1c2lvbkxpc3Q9Iik7CisgICAgICAgICAgICAgICAgICAgICAgICBwdy5wcmludGxuKGdsb2JhbFByb3h5RXhjbHVzaW9uTGlzdCk7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9Ci0gICAgCisKICAgICBjbGFzcyBNeVBhY2thZ2VNb25pdG9yIGV4dGVuZHMgUGFja2FnZU1vbml0b3IgewogICAgICAgICBwdWJsaWMgdm9pZCBvblNvbWVQYWNrYWdlc0NoYW5nZWQoKSB7CiAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKERldmljZVBvbGljeU1hbmFnZXJTZXJ2aWNlLnRoaXMpIHsKICAgICAgICAgICAgICAgICBib29sZWFuIHJlbW92ZWQgPSBmYWxzZTsKICAgICAgICAgICAgICAgICBmb3IgKGludCBpPW1BZG1pbkxpc3Quc2l6ZSgpLTE7IGk+PTA7IGktLSkgewogICAgICAgICAgICAgICAgICAgICBBY3RpdmVBZG1pbiBhYSA9IG1BZG1pbkxpc3QuZ2V0KGkpOwotICAgICAgICAgICAgICAgICAgICBpbnQgY2hhbmdlID0gaXNQYWNrYWdlRGlzYXBwZWFyaW5nKGFhLmluZm8uZ2V0UGFja2FnZU5hbWUoKSk7IAorICAgICAgICAgICAgICAgICAgICBpbnQgY2hhbmdlID0gaXNQYWNrYWdlRGlzYXBwZWFyaW5nKGFhLmluZm8uZ2V0UGFja2FnZU5hbWUoKSk7CiAgICAgICAgICAgICAgICAgICAgIGlmIChjaGFuZ2UgPT0gUEFDS0FHRV9QRVJNQU5FTlRfQ0hBTkdFCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgY2hhbmdlID09IFBBQ0tBR0VfVEVNUE9SQVJZX0NIQU5HRSkgewogICAgICAgICAgICAgICAgICAgICAgICAgU2xvZy53KFRBRywgIkFkbWluIHVuZXhwZWN0ZWRseSB1bmluc3RhbGxlZDogIgpAQCAtMjA3LDcgKzMzNCw3IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9Ci0gICAgCisKICAgICAvKioKICAgICAgKiBJbnN0YW50aWF0ZXMgdGhlIHNlcnZpY2UuCiAgICAgICovCkBAIC0yMjQsNyArMzUxLDcgQEAKICAgICAgICAgfQogICAgICAgICByZXR1cm4gbUlQb3dlck1hbmFnZXI7CiAgICAgfQotICAgIAorCiAgICAgQWN0aXZlQWRtaW4gZ2V0QWN0aXZlQWRtaW5VbmNoZWNrZWRMb2NrZWQoQ29tcG9uZW50TmFtZSB3aG8pIHsKICAgICAgICAgQWN0aXZlQWRtaW4gYWRtaW4gPSBtQWRtaW5NYXAuZ2V0KHdobyk7CiAgICAgICAgIGlmIChhZG1pbiAhPSBudWxsCkBAIC0yMzQsNyArMzYxLDcgQEAKICAgICAgICAgfQogICAgICAgICByZXR1cm4gbnVsbDsKICAgICB9Ci0gICAgCisKICAgICBBY3RpdmVBZG1pbiBnZXRBY3RpdmVBZG1pbkZvckNhbGxlckxvY2tlZChDb21wb25lbnROYW1lIHdobywgaW50IHJlcVBvbGljeSkKICAgICAgICAgICAgIHRocm93cyBTZWN1cml0eUV4Y2VwdGlvbiB7CiAgICAgICAgIGZpbmFsIGludCBjYWxsaW5nVWlkID0gQmluZGVyLmdldENhbGxpbmdVaWQoKTsKQEAgLTI2NSwxMyArMzkyLDEzIEBACiAgICAgICAgICAgICAgICAgICAgICsgQmluZGVyLmdldENhbGxpbmdVaWQoKSArICIgZm9yIHBvbGljeSAjIiArIHJlcVBvbGljeSk7CiAgICAgICAgIH0KICAgICB9Ci0gICAgCisKICAgICB2b2lkIHNlbmRBZG1pbkNvbW1hbmRMb2NrZWQoQWN0aXZlQWRtaW4gYWRtaW4sIFN0cmluZyBhY3Rpb24pIHsKICAgICAgICAgSW50ZW50IGludGVudCA9IG5ldyBJbnRlbnQoYWN0aW9uKTsKICAgICAgICAgaW50ZW50LnNldENvbXBvbmVudChhZG1pbi5pbmZvLmdldENvbXBvbmVudCgpKTsKICAgICAgICAgbUNvbnRleHQuc2VuZEJyb2FkY2FzdChpbnRlbnQpOwogICAgIH0KLSAgICAKKwogICAgIHZvaWQgc2VuZEFkbWluQ29tbWFuZExvY2tlZChTdHJpbmcgYWN0aW9uLCBpbnQgcmVxUG9saWN5KSB7CiAgICAgICAgIGZpbmFsIGludCBOID0gbUFkbWluTGlzdC5zaXplKCk7CiAgICAgICAgIGlmIChOID4gMCkgewpAQCAtMjgzLDE5ICs0MTAsMjQgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KLSAgICAKKwogICAgIHZvaWQgcmVtb3ZlQWN0aXZlQWRtaW5Mb2NrZWQoQ29tcG9uZW50TmFtZSBhZG1pblJlY2VpdmVyKSB7CiAgICAgICAgIEFjdGl2ZUFkbWluIGFkbWluID0gZ2V0QWN0aXZlQWRtaW5VbmNoZWNrZWRMb2NrZWQoYWRtaW5SZWNlaXZlcik7CiAgICAgICAgIGlmIChhZG1pbiAhPSBudWxsKSB7CisgICAgICAgICAgICBib29sZWFuIGRvUHJveHlDbGVhbnVwID0KKyAgICAgICAgICAgICAgICBhZG1pbi5pbmZvLnVzZXNQb2xpY3koRGV2aWNlQWRtaW5JbmZvLlVTRVNfUE9MSUNZX1NFVFNfR0xPQkFMX1BST1hZKTsKICAgICAgICAgICAgIHNlbmRBZG1pbkNvbW1hbmRMb2NrZWQoYWRtaW4sCiAgICAgICAgICAgICAgICAgICAgIERldmljZUFkbWluUmVjZWl2ZXIuQUNUSU9OX0RFVklDRV9BRE1JTl9ESVNBQkxFRCk7CiAgICAgICAgICAgICAvLyBYWFggbmVlZCB0byB3YWl0IGZvciBpdCB0byBjb21wbGV0ZS4KICAgICAgICAgICAgIG1BZG1pbkxpc3QucmVtb3ZlKGFkbWluKTsKICAgICAgICAgICAgIG1BZG1pbk1hcC5yZW1vdmUoYWRtaW5SZWNlaXZlcik7CiAgICAgICAgICAgICB2YWxpZGF0ZVBhc3N3b3JkT3duZXJMb2NrZWQoKTsKKyAgICAgICAgICAgIGlmIChkb1Byb3h5Q2xlYW51cCkgeworICAgICAgICAgICAgICAgIHJlc2V0R2xvYmFsUHJveHkoKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KLSAgICAKKwogICAgIHB1YmxpYyBEZXZpY2VBZG1pbkluZm8gZmluZEFkbWluKENvbXBvbmVudE5hbWUgYWRtaW5OYW1lKSB7CiAgICAgICAgIEludGVudCByZXNvbHZlSW50ZW50ID0gbmV3IEludGVudCgpOwogICAgICAgICByZXNvbHZlSW50ZW50LnNldENvbXBvbmVudChhZG1pbk5hbWUpOwpAQCAtMzA0LDcgKzQzNiw3IEBACiAgICAgICAgIGlmIChpbmZvcyA9PSBudWxsIHx8IGluZm9zLnNpemUoKSA8PSAwKSB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJVbmtub3duIGFkbWluOiAiICsgYWRtaW5OYW1lKTsKICAgICAgICAgfQotICAgICAgICAKKwogICAgICAgICB0cnkgewogICAgICAgICAgICAgcmV0dXJuIG5ldyBEZXZpY2VBZG1pbkluZm8obUNvbnRleHQsIGluZm9zLmdldCgwKSk7CiAgICAgICAgIH0gY2F0Y2ggKFhtbFB1bGxQYXJzZXJFeGNlcHRpb24gZSkgewpAQCAtMzE1LDcgKzQ0Nyw3IEBACiAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgfQogICAgIH0KLSAgICAKKwogICAgIHByaXZhdGUgc3RhdGljIEpvdXJuYWxlZEZpbGUgbWFrZUpvdXJuYWxlZEZpbGUoKSB7CiAgICAgICAgIGZpbmFsIFN0cmluZyBiYXNlID0gIi9kYXRhL3N5c3RlbS9kZXZpY2VfcG9saWNpZXMueG1sIjsKICAgICAgICAgcmV0dXJuIG5ldyBKb3VybmFsZWRGaWxlKG5ldyBGaWxlKGJhc2UpLCBuZXcgRmlsZShiYXNlICsgIi50bXAiKSk7CkBAIC0zMzEsNyArNDYzLDcgQEAKICAgICAgICAgICAgIG91dC5zdGFydERvY3VtZW50KG51bGwsIHRydWUpOwogCiAgICAgICAgICAgICBvdXQuc3RhcnRUYWcobnVsbCwgInBvbGljaWVzIik7Ci0gICAgICAgICAgICAKKwogICAgICAgICAgICAgZmluYWwgaW50IE4gPSBtQWRtaW5MaXN0LnNpemUoKTsKICAgICAgICAgICAgIGZvciAoaW50IGk9MDsgaTxOOyBpKyspIHsKICAgICAgICAgICAgICAgICBBY3RpdmVBZG1pbiBhcCA9IG1BZG1pbkxpc3QuZ2V0KGkpOwpAQCAtMzQyLDI2ICs0NzQsMzYgQEAKICAgICAgICAgICAgICAgICAgICAgb3V0LmVuZFRhZyhudWxsLCAiYWRtaW4iKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAKKwogICAgICAgICAgICAgaWYgKG1QYXNzd29yZE93bmVyID49IDApIHsKICAgICAgICAgICAgICAgICBvdXQuc3RhcnRUYWcobnVsbCwgInBhc3N3b3JkLW93bmVyIik7CiAgICAgICAgICAgICAgICAgb3V0LmF0dHJpYnV0ZShudWxsLCAidmFsdWUiLCBJbnRlZ2VyLnRvU3RyaW5nKG1QYXNzd29yZE93bmVyKSk7CiAgICAgICAgICAgICAgICAgb3V0LmVuZFRhZyhudWxsLCAicGFzc3dvcmQtb3duZXIiKTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAorCiAgICAgICAgICAgICBpZiAobUZhaWxlZFBhc3N3b3JkQXR0ZW1wdHMgIT0gMCkgewogICAgICAgICAgICAgICAgIG91dC5zdGFydFRhZyhudWxsLCAiZmFpbGVkLXBhc3N3b3JkLWF0dGVtcHRzIik7CiAgICAgICAgICAgICAgICAgb3V0LmF0dHJpYnV0ZShudWxsLCAidmFsdWUiLCBJbnRlZ2VyLnRvU3RyaW5nKG1GYWlsZWRQYXNzd29yZEF0dGVtcHRzKSk7CiAgICAgICAgICAgICAgICAgb3V0LmVuZFRhZyhudWxsLCAiZmFpbGVkLXBhc3N3b3JkLWF0dGVtcHRzIik7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmIChtQWN0aXZlUGFzc3dvcmRRdWFsaXR5ICE9IDAgfHwgbUFjdGl2ZVBhc3N3b3JkTGVuZ3RoICE9IDApIHsKKworICAgICAgICAgICAgaWYgKG1BY3RpdmVQYXNzd29yZFF1YWxpdHkgIT0gMCB8fCBtQWN0aXZlUGFzc3dvcmRMZW5ndGggIT0gMAorICAgICAgICAgICAgICAgICAgICB8fCBtQWN0aXZlUGFzc3dvcmRVcHBlckNhc2UgIT0gMCB8fCBtQWN0aXZlUGFzc3dvcmRMb3dlckNhc2UgIT0gMAorICAgICAgICAgICAgICAgICAgICB8fCBtQWN0aXZlUGFzc3dvcmRMZXR0ZXJzICE9IDAgfHwgbUFjdGl2ZVBhc3N3b3JkTnVtZXJpYyAhPSAwCisgICAgICAgICAgICAgICAgICAgIHx8IG1BY3RpdmVQYXNzd29yZFN5bWJvbHMgIT0gMCB8fCBtQWN0aXZlUGFzc3dvcmROb25MZXR0ZXIgIT0gMCkgewogICAgICAgICAgICAgICAgIG91dC5zdGFydFRhZyhudWxsLCAiYWN0aXZlLXBhc3N3b3JkIik7CiAgICAgICAgICAgICAgICAgb3V0LmF0dHJpYnV0ZShudWxsLCAicXVhbGl0eSIsIEludGVnZXIudG9TdHJpbmcobUFjdGl2ZVBhc3N3b3JkUXVhbGl0eSkpOwogICAgICAgICAgICAgICAgIG91dC5hdHRyaWJ1dGUobnVsbCwgImxlbmd0aCIsIEludGVnZXIudG9TdHJpbmcobUFjdGl2ZVBhc3N3b3JkTGVuZ3RoKSk7CisgICAgICAgICAgICAgICAgb3V0LmF0dHJpYnV0ZShudWxsLCAidXBwZXJjYXNlIiwgSW50ZWdlci50b1N0cmluZyhtQWN0aXZlUGFzc3dvcmRVcHBlckNhc2UpKTsKKyAgICAgICAgICAgICAgICBvdXQuYXR0cmlidXRlKG51bGwsICJsb3dlcmNhc2UiLCBJbnRlZ2VyLnRvU3RyaW5nKG1BY3RpdmVQYXNzd29yZExvd2VyQ2FzZSkpOworICAgICAgICAgICAgICAgIG91dC5hdHRyaWJ1dGUobnVsbCwgImxldHRlcnMiLCBJbnRlZ2VyLnRvU3RyaW5nKG1BY3RpdmVQYXNzd29yZExldHRlcnMpKTsKKyAgICAgICAgICAgICAgICBvdXQuYXR0cmlidXRlKG51bGwsICJudW1lcmljIiwgSW50ZWdlcgorICAgICAgICAgICAgICAgICAgICAgICAgLnRvU3RyaW5nKG1BY3RpdmVQYXNzd29yZE51bWVyaWMpKTsKKyAgICAgICAgICAgICAgICBvdXQuYXR0cmlidXRlKG51bGwsICJzeW1ib2xzIiwgSW50ZWdlci50b1N0cmluZyhtQWN0aXZlUGFzc3dvcmRTeW1ib2xzKSk7CisgICAgICAgICAgICAgICAgb3V0LmF0dHJpYnV0ZShudWxsLCAibm9ubGV0dGVyIiwgSW50ZWdlci50b1N0cmluZyhtQWN0aXZlUGFzc3dvcmROb25MZXR0ZXIpKTsKICAgICAgICAgICAgICAgICBvdXQuZW5kVGFnKG51bGwsICJhY3RpdmUtcGFzc3dvcmQiKTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAorCiAgICAgICAgICAgICBvdXQuZW5kVGFnKG51bGwsICJwb2xpY2llcyIpOwogCiAgICAgICAgICAgICBvdXQuZW5kRG9jdW1lbnQoKTsKQEAgLTQzOSw2ICs1ODEsMTggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJzZXIuZ2V0QXR0cmlidXRlVmFsdWUobnVsbCwgInF1YWxpdHkiKSk7CiAgICAgICAgICAgICAgICAgICAgIG1BY3RpdmVQYXNzd29yZExlbmd0aCA9IEludGVnZXIucGFyc2VJbnQoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2VyLmdldEF0dHJpYnV0ZVZhbHVlKG51bGwsICJsZW5ndGgiKSk7CisgICAgICAgICAgICAgICAgICAgIG1BY3RpdmVQYXNzd29yZFVwcGVyQ2FzZSA9IEludGVnZXIucGFyc2VJbnQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2VyLmdldEF0dHJpYnV0ZVZhbHVlKG51bGwsICJ1cHBlcmNhc2UiKSk7CisgICAgICAgICAgICAgICAgICAgIG1BY3RpdmVQYXNzd29yZExvd2VyQ2FzZSA9IEludGVnZXIucGFyc2VJbnQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2VyLmdldEF0dHJpYnV0ZVZhbHVlKG51bGwsICJsb3dlcmNhc2UiKSk7CisgICAgICAgICAgICAgICAgICAgIG1BY3RpdmVQYXNzd29yZExldHRlcnMgPSBJbnRlZ2VyLnBhcnNlSW50KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlci5nZXRBdHRyaWJ1dGVWYWx1ZShudWxsLCAibGV0dGVycyIpKTsKKyAgICAgICAgICAgICAgICAgICAgbUFjdGl2ZVBhc3N3b3JkTnVtZXJpYyA9IEludGVnZXIucGFyc2VJbnQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2VyLmdldEF0dHJpYnV0ZVZhbHVlKG51bGwsICJudW1lcmljIikpOworICAgICAgICAgICAgICAgICAgICBtQWN0aXZlUGFzc3dvcmRTeW1ib2xzID0gSW50ZWdlci5wYXJzZUludCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJzZXIuZ2V0QXR0cmlidXRlVmFsdWUobnVsbCwgInN5bWJvbHMiKSk7CisgICAgICAgICAgICAgICAgICAgIG1BY3RpdmVQYXNzd29yZE5vbkxldHRlciA9IEludGVnZXIucGFyc2VJbnQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2VyLmdldEF0dHJpYnV0ZVZhbHVlKG51bGwsICJub25sZXR0ZXIiKSk7CiAgICAgICAgICAgICAgICAgICAgIFhtbFV0aWxzLnNraXBDdXJyZW50VGFnKHBhcnNlcik7CiAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgU2xvZy53KFRBRywgIlVua25vd24gdGFnOiAiICsgdGFnKTsKQEAgLTQ3NiwxMCArNjMwLDE2IEBACiAgICAgICAgICAgICAgICAgICAgICsgSW50ZWdlci50b0hleFN0cmluZyh1dGlscy5nZXRBY3RpdmVQYXNzd29yZFF1YWxpdHkoKSkpOwogICAgICAgICAgICAgbUFjdGl2ZVBhc3N3b3JkUXVhbGl0eSA9IERldmljZVBvbGljeU1hbmFnZXIuUEFTU1dPUkRfUVVBTElUWV9VTlNQRUNJRklFRDsKICAgICAgICAgICAgIG1BY3RpdmVQYXNzd29yZExlbmd0aCA9IDA7CisgICAgICAgICAgICBtQWN0aXZlUGFzc3dvcmRVcHBlckNhc2UgPSAwOworICAgICAgICAgICAgbUFjdGl2ZVBhc3N3b3JkTG93ZXJDYXNlID0gMDsKKyAgICAgICAgICAgIG1BY3RpdmVQYXNzd29yZExldHRlcnMgPSAwOworICAgICAgICAgICAgbUFjdGl2ZVBhc3N3b3JkTnVtZXJpYyA9IDA7CisgICAgICAgICAgICBtQWN0aXZlUGFzc3dvcmRTeW1ib2xzID0gMDsKKyAgICAgICAgICAgIG1BY3RpdmVQYXNzd29yZE5vbkxldHRlciA9IDA7CiAgICAgICAgIH0KLSAgICAgICAgCisKICAgICAgICAgdmFsaWRhdGVQYXNzd29yZE93bmVyTG9ja2VkKCk7Ci0gICAgICAgIAorCiAgICAgICAgIGxvbmcgdGltZU1zID0gZ2V0TWF4aW11bVRpbWVUb0xvY2sobnVsbCk7CiAgICAgICAgIGlmICh0aW1lTXMgPD0gMCkgewogICAgICAgICAgICAgdGltZU1zID0gSW50ZWdlci5NQVhfVkFMVUU7CkBAIC00OTgsMTIgKzY1OCwxMyBAQAogICAgICAgICAgICAgY2FzZSBEZXZpY2VQb2xpY3lNYW5hZ2VyLlBBU1NXT1JEX1FVQUxJVFlfTlVNRVJJQzoKICAgICAgICAgICAgIGNhc2UgRGV2aWNlUG9saWN5TWFuYWdlci5QQVNTV09SRF9RVUFMSVRZX0FMUEhBQkVUSUM6CiAgICAgICAgICAgICBjYXNlIERldmljZVBvbGljeU1hbmFnZXIuUEFTU1dPUkRfUVVBTElUWV9BTFBIQU5VTUVSSUM6CisgICAgICAgICAgICBjYXNlIERldmljZVBvbGljeU1hbmFnZXIuUEFTU1dPUkRfUVVBTElUWV9DT01QTEVYOgogICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQogICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJJbnZhbGlkIHF1YWxpdHkgY29uc3RhbnQ6IDB4IgogICAgICAgICAgICAgICAgICsgSW50ZWdlci50b0hleFN0cmluZyhxdWFsaXR5KSk7CiAgICAgfQotICAgIAorCiAgICAgdm9pZCB2YWxpZGF0ZVBhc3N3b3JkT3duZXJMb2NrZWQoKSB7CiAgICAgICAgIGlmIChtUGFzc3dvcmRPd25lciA+PSAwKSB7CiAgICAgICAgICAgICBib29sZWFuIGhhdmVPd25lciA9IGZhbHNlOwpAQCAtNTIwLDE3ICs2ODEsMTcgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KLSAgICAKKwogICAgIHB1YmxpYyB2b2lkIHN5c3RlbVJlYWR5KCkgewogICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKICAgICAgICAgICAgIGxvYWRTZXR0aW5nc0xvY2tlZCgpOwogICAgICAgICB9CiAgICAgfQotICAgIAorCiAgICAgcHVibGljIHZvaWQgc2V0QWN0aXZlQWRtaW4oQ29tcG9uZW50TmFtZSBhZG1pblJlY2VpdmVyKSB7CiAgICAgICAgIG1Db250ZXh0LmVuZm9yY2VDYWxsaW5nT3JTZWxmUGVybWlzc2lvbigKICAgICAgICAgICAgICAgICBhbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24uQklORF9ERVZJQ0VfQURNSU4sIG51bGwpOwotICAgICAgICAKKwogICAgICAgICBEZXZpY2VBZG1pbkluZm8gaW5mbyA9IGZpbmRBZG1pbihhZG1pblJlY2VpdmVyKTsKICAgICAgICAgaWYgKGluZm8gPT0gbnVsbCkgewogICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiQmFkIGFkbWluOiAiICsgYWRtaW5SZWNlaXZlcik7CkBAIC01NTIsMTMgKzcxMywxMyBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQotICAgIAorCiAgICAgcHVibGljIGJvb2xlYW4gaXNBZG1pbkFjdGl2ZShDb21wb25lbnROYW1lIGFkbWluUmVjZWl2ZXIpIHsKICAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7CiAgICAgICAgICAgICByZXR1cm4gZ2V0QWN0aXZlQWRtaW5VbmNoZWNrZWRMb2NrZWQoYWRtaW5SZWNlaXZlcikgIT0gbnVsbDsKICAgICAgICAgfQogICAgIH0KLSAgICAKKwogICAgIHB1YmxpYyBMaXN0PENvbXBvbmVudE5hbWU+IGdldEFjdGl2ZUFkbWlucygpIHsKICAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7CiAgICAgICAgICAgICBmaW5hbCBpbnQgTiA9IG1BZG1pbkxpc3Quc2l6ZSgpOwpAQCAtNTcyLDcgKzczMyw3IEBACiAgICAgICAgICAgICByZXR1cm4gcmVzOwogICAgICAgICB9CiAgICAgfQotICAgIAorCiAgICAgcHVibGljIGJvb2xlYW4gcGFja2FnZUhhc0FjdGl2ZUFkbWlucyhTdHJpbmcgcGFja2FnZU5hbWUpIHsKICAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7CiAgICAgICAgICAgICBmaW5hbCBpbnQgTiA9IG1BZG1pbkxpc3Quc2l6ZSgpOwpAQCAtNTg0LDcgKzc0NSw3IEBACiAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KICAgICB9Ci0gICAgCisKICAgICBwdWJsaWMgdm9pZCByZW1vdmVBY3RpdmVBZG1pbihDb21wb25lbnROYW1lIGFkbWluUmVjZWl2ZXIpIHsKICAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7CiAgICAgICAgICAgICBBY3RpdmVBZG1pbiBhZG1pbiA9IGdldEFjdGl2ZUFkbWluVW5jaGVja2VkTG9ja2VkKGFkbWluUmVjZWl2ZXIpOwpAQCAtNjAzLDEwICs3NjQsMTAgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KLSAgICAKKwogICAgIHB1YmxpYyB2b2lkIHNldFBhc3N3b3JkUXVhbGl0eShDb21wb25lbnROYW1lIHdobywgaW50IHF1YWxpdHkpIHsKICAgICAgICAgdmFsaWRhdGVRdWFsaXR5Q29uc3RhbnQocXVhbGl0eSk7Ci0gICAgICAgIAorCiAgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgewogICAgICAgICAgICAgaWYgKHdobyA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCJDb21wb25lbnROYW1lIGlzIG51bGwiKTsKQEAgLTYxOSwxNiArNzgwLDE2IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9Ci0gICAgCisKICAgICBwdWJsaWMgaW50IGdldFBhc3N3b3JkUXVhbGl0eShDb21wb25lbnROYW1lIHdobykgewogICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKICAgICAgICAgICAgIGludCBtb2RlID0gRGV2aWNlUG9saWN5TWFuYWdlci5QQVNTV09SRF9RVUFMSVRZX1VOU1BFQ0lGSUVEOwotICAgICAgICAgICAgCisKICAgICAgICAgICAgIGlmICh3aG8gIT0gbnVsbCkgewogICAgICAgICAgICAgICAgIEFjdGl2ZUFkbWluIGFkbWluID0gZ2V0QWN0aXZlQWRtaW5VbmNoZWNrZWRMb2NrZWQod2hvKTsKICAgICAgICAgICAgICAgICByZXR1cm4gYWRtaW4gIT0gbnVsbCA/IGFkbWluLnBhc3N3b3JkUXVhbGl0eSA6IG1vZGU7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAKKwogICAgICAgICAgICAgZmluYWwgaW50IE4gPSBtQWRtaW5MaXN0LnNpemUoKTsKICAgICAgICAgICAgIGZvciAgKGludCBpPTA7IGk8TjsgaSsrKSB7CiAgICAgICAgICAgICAgICAgQWN0aXZlQWRtaW4gYWRtaW4gPSBtQWRtaW5MaXN0LmdldChpKTsKQEAgLTYzOSw3ICs4MDAsNyBAQAogICAgICAgICAgICAgcmV0dXJuIG1vZGU7CiAgICAgICAgIH0KICAgICB9Ci0gICAgCisKICAgICBwdWJsaWMgdm9pZCBzZXRQYXNzd29yZE1pbmltdW1MZW5ndGgoQ29tcG9uZW50TmFtZSB3aG8sIGludCBsZW5ndGgpIHsKICAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7CiAgICAgICAgICAgICBpZiAod2hvID09IG51bGwpIHsKQEAgLTY1MywxNiArODE0LDE2IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9Ci0gICAgCisKICAgICBwdWJsaWMgaW50IGdldFBhc3N3b3JkTWluaW11bUxlbmd0aChDb21wb25lbnROYW1lIHdobykgewogICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKICAgICAgICAgICAgIGludCBsZW5ndGggPSAwOwotICAgICAgICAgICAgCisKICAgICAgICAgICAgIGlmICh3aG8gIT0gbnVsbCkgewogICAgICAgICAgICAgICAgIEFjdGl2ZUFkbWluIGFkbWluID0gZ2V0QWN0aXZlQWRtaW5VbmNoZWNrZWRMb2NrZWQod2hvKTsKICAgICAgICAgICAgICAgICByZXR1cm4gYWRtaW4gIT0gbnVsbCA/IGFkbWluLm1pbmltdW1QYXNzd29yZExlbmd0aCA6IGxlbmd0aDsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAorCiAgICAgICAgICAgICBmaW5hbCBpbnQgTiA9IG1BZG1pbkxpc3Quc2l6ZSgpOwogICAgICAgICAgICAgZm9yICAoaW50IGk9MDsgaTxOOyBpKyspIHsKICAgICAgICAgICAgICAgICBBY3RpdmVBZG1pbiBhZG1pbiA9IG1BZG1pbkxpc3QuZ2V0KGkpOwpAQCAtNjczLDE4ICs4MzQsMjY3IEBACiAgICAgICAgICAgICByZXR1cm4gbGVuZ3RoOwogICAgICAgICB9CiAgICAgfQotICAgIAorCisgICAgcHVibGljIHZvaWQgc2V0UGFzc3dvcmRIaXN0b3J5TGVuZ3RoKENvbXBvbmVudE5hbWUgd2hvLCBpbnQgbGVuZ3RoKSB7CisgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgeworICAgICAgICAgICAgaWYgKHdobyA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCJDb21wb25lbnROYW1lIGlzIG51bGwiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEFjdGl2ZUFkbWluIGFwID0gZ2V0QWN0aXZlQWRtaW5Gb3JDYWxsZXJMb2NrZWQod2hvLAorICAgICAgICAgICAgICAgICAgICBEZXZpY2VBZG1pbkluZm8uVVNFU19QT0xJQ1lfTElNSVRfUEFTU1dPUkQpOworICAgICAgICAgICAgaWYgKGFwLnBhc3N3b3JkSGlzdG9yeUxlbmd0aCAhPSBsZW5ndGgpIHsKKyAgICAgICAgICAgICAgICBhcC5wYXNzd29yZEhpc3RvcnlMZW5ndGggPSBsZW5ndGg7CisgICAgICAgICAgICAgICAgc2F2ZVNldHRpbmdzTG9ja2VkKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGdldFBhc3N3b3JkSGlzdG9yeUxlbmd0aChDb21wb25lbnROYW1lIHdobykgeworICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKKyAgICAgICAgICAgIGludCBsZW5ndGggPSAwOworCisgICAgICAgICAgICBpZiAod2hvICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBBY3RpdmVBZG1pbiBhZG1pbiA9IGdldEFjdGl2ZUFkbWluVW5jaGVja2VkTG9ja2VkKHdobyk7CisgICAgICAgICAgICAgICAgcmV0dXJuIGFkbWluICE9IG51bGwgPyBhZG1pbi5wYXNzd29yZEhpc3RvcnlMZW5ndGggOiBsZW5ndGg7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZpbmFsIGludCBOID0gbUFkbWluTGlzdC5zaXplKCk7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IE47IGkrKykgeworICAgICAgICAgICAgICAgIEFjdGl2ZUFkbWluIGFkbWluID0gbUFkbWluTGlzdC5nZXQoaSk7CisgICAgICAgICAgICAgICAgaWYgKGxlbmd0aCA8IGFkbWluLnBhc3N3b3JkSGlzdG9yeUxlbmd0aCkgeworICAgICAgICAgICAgICAgICAgICBsZW5ndGggPSBhZG1pbi5wYXNzd29yZEhpc3RvcnlMZW5ndGg7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGxlbmd0aDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFBhc3N3b3JkTWluaW11bVVwcGVyQ2FzZShDb21wb25lbnROYW1lIHdobywgaW50IGxlbmd0aCkgeworICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKKyAgICAgICAgICAgIGlmICh3aG8gPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigiQ29tcG9uZW50TmFtZSBpcyBudWxsIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBBY3RpdmVBZG1pbiBhcCA9IGdldEFjdGl2ZUFkbWluRm9yQ2FsbGVyTG9ja2VkKHdobywKKyAgICAgICAgICAgICAgICAgICAgRGV2aWNlQWRtaW5JbmZvLlVTRVNfUE9MSUNZX0xJTUlUX1BBU1NXT1JEKTsKKyAgICAgICAgICAgIGlmIChhcC5taW5pbXVtUGFzc3dvcmRVcHBlckNhc2UgIT0gbGVuZ3RoKSB7CisgICAgICAgICAgICAgICAgYXAubWluaW11bVBhc3N3b3JkVXBwZXJDYXNlID0gbGVuZ3RoOworICAgICAgICAgICAgICAgIHNhdmVTZXR0aW5nc0xvY2tlZCgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIGludCBnZXRQYXNzd29yZE1pbmltdW1VcHBlckNhc2UoQ29tcG9uZW50TmFtZSB3aG8pIHsKKyAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7CisgICAgICAgICAgICBpbnQgbGVuZ3RoID0gMDsKKworICAgICAgICAgICAgaWYgKHdobyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgQWN0aXZlQWRtaW4gYWRtaW4gPSBnZXRBY3RpdmVBZG1pblVuY2hlY2tlZExvY2tlZCh3aG8pOworICAgICAgICAgICAgICAgIHJldHVybiBhZG1pbiAhPSBudWxsID8gYWRtaW4ubWluaW11bVBhc3N3b3JkVXBwZXJDYXNlIDogbGVuZ3RoOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmaW5hbCBpbnQgTiA9IG1BZG1pbkxpc3Quc2l6ZSgpOworICAgICAgICAgICAgZm9yIChpbnQgaT0wOyBpPE47IGkrKykgeworICAgICAgICAgICAgICAgIEFjdGl2ZUFkbWluIGFkbWluID0gbUFkbWluTGlzdC5nZXQoaSk7CisgICAgICAgICAgICAgICAgaWYgKGxlbmd0aCA8IGFkbWluLm1pbmltdW1QYXNzd29yZFVwcGVyQ2FzZSkgeworICAgICAgICAgICAgICAgICAgICBsZW5ndGggPSBhZG1pbi5taW5pbXVtUGFzc3dvcmRVcHBlckNhc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGxlbmd0aDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFBhc3N3b3JkTWluaW11bUxvd2VyQ2FzZShDb21wb25lbnROYW1lIHdobywgaW50IGxlbmd0aCkgeworICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKKyAgICAgICAgICAgIGlmICh3aG8gPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigiQ29tcG9uZW50TmFtZSBpcyBudWxsIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBBY3RpdmVBZG1pbiBhcCA9IGdldEFjdGl2ZUFkbWluRm9yQ2FsbGVyTG9ja2VkKHdobywKKyAgICAgICAgICAgICAgICAgICAgRGV2aWNlQWRtaW5JbmZvLlVTRVNfUE9MSUNZX0xJTUlUX1BBU1NXT1JEKTsKKyAgICAgICAgICAgIGlmIChhcC5taW5pbXVtUGFzc3dvcmRMb3dlckNhc2UgIT0gbGVuZ3RoKSB7CisgICAgICAgICAgICAgICAgYXAubWluaW11bVBhc3N3b3JkTG93ZXJDYXNlID0gbGVuZ3RoOworICAgICAgICAgICAgICAgIHNhdmVTZXR0aW5nc0xvY2tlZCgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIGludCBnZXRQYXNzd29yZE1pbmltdW1Mb3dlckNhc2UoQ29tcG9uZW50TmFtZSB3aG8pIHsKKyAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7CisgICAgICAgICAgICBpbnQgbGVuZ3RoID0gMDsKKworICAgICAgICAgICAgaWYgKHdobyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgQWN0aXZlQWRtaW4gYWRtaW4gPSBnZXRBY3RpdmVBZG1pblVuY2hlY2tlZExvY2tlZCh3aG8pOworICAgICAgICAgICAgICAgIHJldHVybiBhZG1pbiAhPSBudWxsID8gYWRtaW4ubWluaW11bVBhc3N3b3JkTG93ZXJDYXNlIDogbGVuZ3RoOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmaW5hbCBpbnQgTiA9IG1BZG1pbkxpc3Quc2l6ZSgpOworICAgICAgICAgICAgZm9yIChpbnQgaT0wOyBpPE47IGkrKykgeworICAgICAgICAgICAgICAgIEFjdGl2ZUFkbWluIGFkbWluID0gbUFkbWluTGlzdC5nZXQoaSk7CisgICAgICAgICAgICAgICAgaWYgKGxlbmd0aCA8IGFkbWluLm1pbmltdW1QYXNzd29yZExvd2VyQ2FzZSkgeworICAgICAgICAgICAgICAgICAgICBsZW5ndGggPSBhZG1pbi5taW5pbXVtUGFzc3dvcmRMb3dlckNhc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGxlbmd0aDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFBhc3N3b3JkTWluaW11bUxldHRlcnMoQ29tcG9uZW50TmFtZSB3aG8sIGludCBsZW5ndGgpIHsKKyAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7CisgICAgICAgICAgICBpZiAod2hvID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oIkNvbXBvbmVudE5hbWUgaXMgbnVsbCIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQWN0aXZlQWRtaW4gYXAgPSBnZXRBY3RpdmVBZG1pbkZvckNhbGxlckxvY2tlZCh3aG8sCisgICAgICAgICAgICAgICAgICAgIERldmljZUFkbWluSW5mby5VU0VTX1BPTElDWV9MSU1JVF9QQVNTV09SRCk7CisgICAgICAgICAgICBpZiAoYXAubWluaW11bVBhc3N3b3JkTGV0dGVycyAhPSBsZW5ndGgpIHsKKyAgICAgICAgICAgICAgICBhcC5taW5pbXVtUGFzc3dvcmRMZXR0ZXJzID0gbGVuZ3RoOworICAgICAgICAgICAgICAgIHNhdmVTZXR0aW5nc0xvY2tlZCgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIGludCBnZXRQYXNzd29yZE1pbmltdW1MZXR0ZXJzKENvbXBvbmVudE5hbWUgd2hvKSB7CisgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgeworICAgICAgICAgICAgaW50IGxlbmd0aCA9IDA7CisKKyAgICAgICAgICAgIGlmICh3aG8gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIEFjdGl2ZUFkbWluIGFkbWluID0gZ2V0QWN0aXZlQWRtaW5VbmNoZWNrZWRMb2NrZWQod2hvKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gYWRtaW4gIT0gbnVsbCA/IGFkbWluLm1pbmltdW1QYXNzd29yZExldHRlcnMgOiBsZW5ndGg7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZpbmFsIGludCBOID0gbUFkbWluTGlzdC5zaXplKCk7CisgICAgICAgICAgICBmb3IgKGludCBpPTA7IGk8TjsgaSsrKSB7CisgICAgICAgICAgICAgICAgQWN0aXZlQWRtaW4gYWRtaW4gPSBtQWRtaW5MaXN0LmdldChpKTsKKyAgICAgICAgICAgICAgICBpZiAobGVuZ3RoIDwgYWRtaW4ubWluaW11bVBhc3N3b3JkTGV0dGVycykgeworICAgICAgICAgICAgICAgICAgICBsZW5ndGggPSBhZG1pbi5taW5pbXVtUGFzc3dvcmRMZXR0ZXJzOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBsZW5ndGg7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRQYXNzd29yZE1pbmltdW1OdW1lcmljKENvbXBvbmVudE5hbWUgd2hvLCBpbnQgbGVuZ3RoKSB7CisgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgeworICAgICAgICAgICAgaWYgKHdobyA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCJDb21wb25lbnROYW1lIGlzIG51bGwiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEFjdGl2ZUFkbWluIGFwID0gZ2V0QWN0aXZlQWRtaW5Gb3JDYWxsZXJMb2NrZWQod2hvLAorICAgICAgICAgICAgICAgICAgICBEZXZpY2VBZG1pbkluZm8uVVNFU19QT0xJQ1lfTElNSVRfUEFTU1dPUkQpOworICAgICAgICAgICAgaWYgKGFwLm1pbmltdW1QYXNzd29yZE51bWVyaWMgIT0gbGVuZ3RoKSB7CisgICAgICAgICAgICAgICAgYXAubWluaW11bVBhc3N3b3JkTnVtZXJpYyA9IGxlbmd0aDsKKyAgICAgICAgICAgICAgICBzYXZlU2V0dGluZ3NMb2NrZWQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBpbnQgZ2V0UGFzc3dvcmRNaW5pbXVtTnVtZXJpYyhDb21wb25lbnROYW1lIHdobykgeworICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKKyAgICAgICAgICAgIGludCBsZW5ndGggPSAwOworCisgICAgICAgICAgICBpZiAod2hvICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBBY3RpdmVBZG1pbiBhZG1pbiA9IGdldEFjdGl2ZUFkbWluVW5jaGVja2VkTG9ja2VkKHdobyk7CisgICAgICAgICAgICAgICAgcmV0dXJuIGFkbWluICE9IG51bGwgPyBhZG1pbi5taW5pbXVtUGFzc3dvcmROdW1lcmljIDogbGVuZ3RoOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmaW5hbCBpbnQgTiA9IG1BZG1pbkxpc3Quc2l6ZSgpOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBOOyBpKyspIHsKKyAgICAgICAgICAgICAgICBBY3RpdmVBZG1pbiBhZG1pbiA9IG1BZG1pbkxpc3QuZ2V0KGkpOworICAgICAgICAgICAgICAgIGlmIChsZW5ndGggPCBhZG1pbi5taW5pbXVtUGFzc3dvcmROdW1lcmljKSB7CisgICAgICAgICAgICAgICAgICAgIGxlbmd0aCA9IGFkbWluLm1pbmltdW1QYXNzd29yZE51bWVyaWM7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGxlbmd0aDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFBhc3N3b3JkTWluaW11bVN5bWJvbHMoQ29tcG9uZW50TmFtZSB3aG8sIGludCBsZW5ndGgpIHsKKyAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7CisgICAgICAgICAgICBpZiAod2hvID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oIkNvbXBvbmVudE5hbWUgaXMgbnVsbCIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQWN0aXZlQWRtaW4gYXAgPSBnZXRBY3RpdmVBZG1pbkZvckNhbGxlckxvY2tlZCh3aG8sCisgICAgICAgICAgICAgICAgICAgIERldmljZUFkbWluSW5mby5VU0VTX1BPTElDWV9MSU1JVF9QQVNTV09SRCk7CisgICAgICAgICAgICBpZiAoYXAubWluaW11bVBhc3N3b3JkU3ltYm9scyAhPSBsZW5ndGgpIHsKKyAgICAgICAgICAgICAgICBhcC5taW5pbXVtUGFzc3dvcmRTeW1ib2xzID0gbGVuZ3RoOworICAgICAgICAgICAgICAgIHNhdmVTZXR0aW5nc0xvY2tlZCgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIGludCBnZXRQYXNzd29yZE1pbmltdW1TeW1ib2xzKENvbXBvbmVudE5hbWUgd2hvKSB7CisgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgeworICAgICAgICAgICAgaW50IGxlbmd0aCA9IDA7CisKKyAgICAgICAgICAgIGlmICh3aG8gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIEFjdGl2ZUFkbWluIGFkbWluID0gZ2V0QWN0aXZlQWRtaW5VbmNoZWNrZWRMb2NrZWQod2hvKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gYWRtaW4gIT0gbnVsbCA/IGFkbWluLm1pbmltdW1QYXNzd29yZFN5bWJvbHMgOiBsZW5ndGg7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZpbmFsIGludCBOID0gbUFkbWluTGlzdC5zaXplKCk7CisgICAgICAgICAgICBmb3IgIChpbnQgaT0wOyBpPE47IGkrKykgeworICAgICAgICAgICAgICAgIEFjdGl2ZUFkbWluIGFkbWluID0gbUFkbWluTGlzdC5nZXQoaSk7CisgICAgICAgICAgICAgICAgaWYgKGxlbmd0aCA8IGFkbWluLm1pbmltdW1QYXNzd29yZFN5bWJvbHMpIHsKKyAgICAgICAgICAgICAgICAgICAgbGVuZ3RoID0gYWRtaW4ubWluaW11bVBhc3N3b3JkU3ltYm9sczsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gbGVuZ3RoOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0UGFzc3dvcmRNaW5pbXVtTm9uTGV0dGVyKENvbXBvbmVudE5hbWUgd2hvLCBpbnQgbGVuZ3RoKSB7CisgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgeworICAgICAgICAgICAgaWYgKHdobyA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCJDb21wb25lbnROYW1lIGlzIG51bGwiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEFjdGl2ZUFkbWluIGFwID0gZ2V0QWN0aXZlQWRtaW5Gb3JDYWxsZXJMb2NrZWQod2hvLAorICAgICAgICAgICAgICAgICAgICBEZXZpY2VBZG1pbkluZm8uVVNFU19QT0xJQ1lfTElNSVRfUEFTU1dPUkQpOworICAgICAgICAgICAgaWYgKGFwLm1pbmltdW1QYXNzd29yZE5vbkxldHRlciAhPSBsZW5ndGgpIHsKKyAgICAgICAgICAgICAgICBhcC5taW5pbXVtUGFzc3dvcmROb25MZXR0ZXIgPSBsZW5ndGg7CisgICAgICAgICAgICAgICAgc2F2ZVNldHRpbmdzTG9ja2VkKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGdldFBhc3N3b3JkTWluaW11bU5vbkxldHRlcihDb21wb25lbnROYW1lIHdobykgeworICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKKyAgICAgICAgICAgIGludCBsZW5ndGggPSAwOworCisgICAgICAgICAgICBpZiAod2hvICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBBY3RpdmVBZG1pbiBhZG1pbiA9IGdldEFjdGl2ZUFkbWluVW5jaGVja2VkTG9ja2VkKHdobyk7CisgICAgICAgICAgICAgICAgcmV0dXJuIGFkbWluICE9IG51bGwgPyBhZG1pbi5taW5pbXVtUGFzc3dvcmROb25MZXR0ZXIgOiBsZW5ndGg7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZpbmFsIGludCBOID0gbUFkbWluTGlzdC5zaXplKCk7CisgICAgICAgICAgICBmb3IgKGludCBpPTA7IGk8TjsgaSsrKSB7CisgICAgICAgICAgICAgICAgQWN0aXZlQWRtaW4gYWRtaW4gPSBtQWRtaW5MaXN0LmdldChpKTsKKyAgICAgICAgICAgICAgICBpZiAobGVuZ3RoIDwgYWRtaW4ubWluaW11bVBhc3N3b3JkTm9uTGV0dGVyKSB7CisgICAgICAgICAgICAgICAgICAgIGxlbmd0aCA9IGFkbWluLm1pbmltdW1QYXNzd29yZE5vbkxldHRlcjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gbGVuZ3RoOworICAgICAgICB9CisgICAgfQorCiAgICAgcHVibGljIGJvb2xlYW4gaXNBY3RpdmVQYXNzd29yZFN1ZmZpY2llbnQoKSB7CiAgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgewogICAgICAgICAgICAgLy8gVGhpcyBBUEkgY2FuIG9ubHkgYmUgY2FsbGVkIGJ5IGFuIGFjdGl2ZSBkZXZpY2UgYWRtaW4sCiAgICAgICAgICAgICAvLyBzbyB0cnkgdG8gcmV0cmlldmUgaXQgdG8gY2hlY2sgdGhhdCB0aGUgY2FsbGVyIGlzIG9uZS4KICAgICAgICAgICAgIGdldEFjdGl2ZUFkbWluRm9yQ2FsbGVyTG9ja2VkKG51bGwsCiAgICAgICAgICAgICAgICAgICAgIERldmljZUFkbWluSW5mby5VU0VTX1BPTElDWV9MSU1JVF9QQVNTV09SRCk7Ci0gICAgICAgICAgICByZXR1cm4gbUFjdGl2ZVBhc3N3b3JkUXVhbGl0eSA+PSBnZXRQYXNzd29yZFF1YWxpdHkobnVsbCkKLSAgICAgICAgICAgICAgICAgICAgJiYgbUFjdGl2ZVBhc3N3b3JkTGVuZ3RoID49IGdldFBhc3N3b3JkTWluaW11bUxlbmd0aChudWxsKTsKKyAgICAgICAgICAgIGlmIChtQWN0aXZlUGFzc3dvcmRRdWFsaXR5IDwgZ2V0UGFzc3dvcmRRdWFsaXR5KG51bGwpCisgICAgICAgICAgICAgICAgICAgIHx8IG1BY3RpdmVQYXNzd29yZExlbmd0aCA8IGdldFBhc3N3b3JkTWluaW11bUxlbmd0aChudWxsKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmKG1BY3RpdmVQYXNzd29yZFF1YWxpdHkgIT0gRGV2aWNlUG9saWN5TWFuYWdlci5QQVNTV09SRF9RVUFMSVRZX0NPTVBMRVgpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBtQWN0aXZlUGFzc3dvcmRVcHBlckNhc2UgPj0gZ2V0UGFzc3dvcmRNaW5pbXVtVXBwZXJDYXNlKG51bGwpCisgICAgICAgICAgICAgICAgICAgICYmIG1BY3RpdmVQYXNzd29yZExvd2VyQ2FzZSA+PSBnZXRQYXNzd29yZE1pbmltdW1Mb3dlckNhc2UobnVsbCkKKyAgICAgICAgICAgICAgICAgICAgJiYgbUFjdGl2ZVBhc3N3b3JkTGV0dGVycyA+PSBnZXRQYXNzd29yZE1pbmltdW1MZXR0ZXJzKG51bGwpCisgICAgICAgICAgICAgICAgICAgICYmIG1BY3RpdmVQYXNzd29yZE51bWVyaWMgPj0gZ2V0UGFzc3dvcmRNaW5pbXVtTnVtZXJpYyhudWxsKQorICAgICAgICAgICAgICAgICAgICAmJiBtQWN0aXZlUGFzc3dvcmRTeW1ib2xzID49IGdldFBhc3N3b3JkTWluaW11bVN5bWJvbHMobnVsbCkKKyAgICAgICAgICAgICAgICAgICAgJiYgbUFjdGl2ZVBhc3N3b3JkTm9uTGV0dGVyID49IGdldFBhc3N3b3JkTWluaW11bU5vbkxldHRlcihudWxsKTsKICAgICAgICAgfQogICAgIH0KLSAgICAKKwogICAgIHB1YmxpYyBpbnQgZ2V0Q3VycmVudEZhaWxlZFBhc3N3b3JkQXR0ZW1wdHMoKSB7CiAgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgewogICAgICAgICAgICAgLy8gVGhpcyBBUEkgY2FuIG9ubHkgYmUgY2FsbGVkIGJ5IGFuIGFjdGl2ZSBkZXZpY2UgYWRtaW4sCkBAIC02OTQsNyArMTEwNCw3IEBACiAgICAgICAgICAgICByZXR1cm4gbUZhaWxlZFBhc3N3b3JkQXR0ZW1wdHM7CiAgICAgICAgIH0KICAgICB9Ci0gICAgCisKICAgICBwdWJsaWMgdm9pZCBzZXRNYXhpbXVtRmFpbGVkUGFzc3dvcmRzRm9yV2lwZShDb21wb25lbnROYW1lIHdobywgaW50IG51bSkgewogICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKICAgICAgICAgICAgIC8vIFRoaXMgQVBJIGNhbiBvbmx5IGJlIGNhbGxlZCBieSBhbiBhY3RpdmUgZGV2aWNlIGFkbWluLApAQCAtNzA5LDE2ICsxMTE5LDE2IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9Ci0gICAgCisKICAgICBwdWJsaWMgaW50IGdldE1heGltdW1GYWlsZWRQYXNzd29yZHNGb3JXaXBlKENvbXBvbmVudE5hbWUgd2hvKSB7CiAgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgewogICAgICAgICAgICAgaW50IGNvdW50ID0gMDsKLSAgICAgICAgICAgIAorCiAgICAgICAgICAgICBpZiAod2hvICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICBBY3RpdmVBZG1pbiBhZG1pbiA9IGdldEFjdGl2ZUFkbWluVW5jaGVja2VkTG9ja2VkKHdobyk7CiAgICAgICAgICAgICAgICAgcmV0dXJuIGFkbWluICE9IG51bGwgPyBhZG1pbi5tYXhpbXVtRmFpbGVkUGFzc3dvcmRzRm9yV2lwZSA6IGNvdW50OwogICAgICAgICAgICAgfQotICAgICAgICAgICAgCisKICAgICAgICAgICAgIGZpbmFsIGludCBOID0gbUFkbWluTGlzdC5zaXplKCk7CiAgICAgICAgICAgICBmb3IgIChpbnQgaT0wOyBpPE47IGkrKykgewogICAgICAgICAgICAgICAgIEFjdGl2ZUFkbWluIGFkbWluID0gbUFkbWluTGlzdC5nZXQoaSk7CkBAIC03MzIsNyArMTE0Miw3IEBACiAgICAgICAgICAgICByZXR1cm4gY291bnQ7CiAgICAgICAgIH0KICAgICB9Ci0gICAgCisKICAgICBwdWJsaWMgYm9vbGVhbiByZXNldFBhc3N3b3JkKFN0cmluZyBwYXNzd29yZCwgaW50IGZsYWdzKSB7CiAgICAgICAgIGludCBxdWFsaXR5OwogICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKQEAgLTc0MywxNCArMTE1MywxNSBAQAogICAgICAgICAgICAgcXVhbGl0eSA9IGdldFBhc3N3b3JkUXVhbGl0eShudWxsKTsKICAgICAgICAgICAgIGlmIChxdWFsaXR5ICE9IERldmljZVBvbGljeU1hbmFnZXIuUEFTU1dPUkRfUVVBTElUWV9VTlNQRUNJRklFRCkgewogICAgICAgICAgICAgICAgIGludCByZWFsUXVhbGl0eSA9IExvY2tQYXR0ZXJuVXRpbHMuY29tcHV0ZVBhc3N3b3JkUXVhbGl0eShwYXNzd29yZCk7Ci0gICAgICAgICAgICAgICAgaWYgKHJlYWxRdWFsaXR5IDwgcXVhbGl0eSkgeworICAgICAgICAgICAgICAgIGlmIChyZWFsUXVhbGl0eSA8IHF1YWxpdHkKKyAgICAgICAgICAgICAgICAgICAgICAgICYmIHF1YWxpdHkgIT0gRGV2aWNlUG9saWN5TWFuYWdlci5QQVNTV09SRF9RVUFMSVRZX0NPTVBMRVgpIHsKICAgICAgICAgICAgICAgICAgICAgU2xvZy53KFRBRywgInJlc2V0UGFzc3dvcmQ6IHBhc3N3b3JkIHF1YWxpdHkgMHgiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBJbnRlZ2VyLnRvSGV4U3RyaW5nKHF1YWxpdHkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGRvZXMgbm90IG1lZXQgcmVxdWlyZWQgcXVhbGl0eSAweCIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIEludGVnZXIudG9IZXhTdHJpbmcocXVhbGl0eSkpOwogICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHF1YWxpdHkgPSByZWFsUXVhbGl0eTsKKyAgICAgICAgICAgICAgICBxdWFsaXR5ID0gTWF0aC5tYXgocmVhbFF1YWxpdHksIHF1YWxpdHkpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgaW50IGxlbmd0aCA9IGdldFBhc3N3b3JkTWluaW11bUxlbmd0aChudWxsKTsKICAgICAgICAgICAgIGlmIChwYXNzd29yZC5sZW5ndGgoKSA8IGxlbmd0aCkgewpAQCAtNzU4LDE0ICsxMTY5LDg2IEBACiAgICAgICAgICAgICAgICAgICAgICAgICArICIgZG9lcyBub3QgbWVldCByZXF1aXJlZCBsZW5ndGggIiArIGxlbmd0aCk7CiAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHF1YWxpdHkgPT0gRGV2aWNlUG9saWN5TWFuYWdlci5QQVNTV09SRF9RVUFMSVRZX0NPTVBMRVgpIHsKKyAgICAgICAgICAgICAgICBpbnQgbGV0dGVycyA9IDA7CisgICAgICAgICAgICAgICAgaW50IHVwcGVyY2FzZSA9IDA7CisgICAgICAgICAgICAgICAgaW50IGxvd2VyY2FzZSA9IDA7CisgICAgICAgICAgICAgICAgaW50IG51bWJlcnMgPSAwOworICAgICAgICAgICAgICAgIGludCBzeW1ib2xzID0gMDsKKyAgICAgICAgICAgICAgICBpbnQgbm9ubGV0dGVyID0gMDsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHBhc3N3b3JkLmxlbmd0aCgpOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgY2hhciBjID0gcGFzc3dvcmQuY2hhckF0KGkpOworICAgICAgICAgICAgICAgICAgICBpZiAoYyA+PSAnQScgJiYgYyA8PSAnWicpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxldHRlcnMrKzsKKyAgICAgICAgICAgICAgICAgICAgICAgIHVwcGVyY2FzZSsrOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGMgPj0gJ2EnICYmIGMgPD0gJ3onKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBsZXR0ZXJzKys7CisgICAgICAgICAgICAgICAgICAgICAgICBsb3dlcmNhc2UrKzsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjID49ICcwJyAmJiBjIDw9ICc5JykgeworICAgICAgICAgICAgICAgICAgICAgICAgbnVtYmVycysrOworICAgICAgICAgICAgICAgICAgICAgICAgbm9ubGV0dGVyKys7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzeW1ib2xzKys7CisgICAgICAgICAgICAgICAgICAgICAgICBub25sZXR0ZXIrKzsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpbnQgbmVlZGVkTGV0dGVycyA9IGdldFBhc3N3b3JkTWluaW11bUxldHRlcnMobnVsbCk7CisgICAgICAgICAgICAgICAgaWYobGV0dGVycyA8IG5lZWRlZExldHRlcnMpIHsKKyAgICAgICAgICAgICAgICAgICAgU2xvZy53KFRBRywgInJlc2V0UGFzc3dvcmQ6IG51bWJlciBvZiBsZXR0ZXJzICIgKyBsZXR0ZXJzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGRvZXMgbm90IG1lZXQgcmVxdWlyZWQgbnVtYmVyIG9mIGxldHRlcnMgIiArIG5lZWRlZExldHRlcnMpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGludCBuZWVkZWROdW1iZXJzID0gZ2V0UGFzc3dvcmRNaW5pbXVtTnVtZXJpYyhudWxsKTsKKyAgICAgICAgICAgICAgICBpZiAobnVtYmVycyA8IG5lZWRlZE51bWJlcnMpIHsKKyAgICAgICAgICAgICAgICAgICAgU2xvZworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC53KFRBRywgInJlc2V0UGFzc3dvcmQ6IG51bWJlciBvZiBudW1lcmljYWwgZGlnaXRzICIgKyBudW1iZXJzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgZG9lcyBub3QgbWVldCByZXF1aXJlZCBudW1iZXIgb2YgbnVtZXJpY2FsIGRpZ2l0cyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIG5lZWRlZE51bWJlcnMpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGludCBuZWVkZWRMb3dlckNhc2UgPSBnZXRQYXNzd29yZE1pbmltdW1Mb3dlckNhc2UobnVsbCk7CisgICAgICAgICAgICAgICAgaWYgKGxvd2VyY2FzZSA8IG5lZWRlZExvd2VyQ2FzZSkgeworICAgICAgICAgICAgICAgICAgICBTbG9nLncoVEFHLCAicmVzZXRQYXNzd29yZDogbnVtYmVyIG9mIGxvd2VyY2FzZSBsZXR0ZXJzICIgKyBsb3dlcmNhc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgZG9lcyBub3QgbWVldCByZXF1aXJlZCBudW1iZXIgb2YgbG93ZXJjYXNlIGxldHRlcnMgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgbmVlZGVkTG93ZXJDYXNlKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpbnQgbmVlZGVkVXBwZXJDYXNlID0gZ2V0UGFzc3dvcmRNaW5pbXVtVXBwZXJDYXNlKG51bGwpOworICAgICAgICAgICAgICAgIGlmICh1cHBlcmNhc2UgPCBuZWVkZWRVcHBlckNhc2UpIHsKKyAgICAgICAgICAgICAgICAgICAgU2xvZy53KFRBRywgInJlc2V0UGFzc3dvcmQ6IG51bWJlciBvZiB1cHBlcmNhc2UgbGV0dGVycyAiICsgdXBwZXJjYXNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGRvZXMgbm90IG1lZXQgcmVxdWlyZWQgbnVtYmVyIG9mIHVwcGVyY2FzZSBsZXR0ZXJzICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArIG5lZWRlZFVwcGVyQ2FzZSk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaW50IG5lZWRlZFN5bWJvbHMgPSBnZXRQYXNzd29yZE1pbmltdW1TeW1ib2xzKG51bGwpOworICAgICAgICAgICAgICAgIGlmIChzeW1ib2xzIDwgbmVlZGVkU3ltYm9scykgeworICAgICAgICAgICAgICAgICAgICBTbG9nLncoVEFHLCAicmVzZXRQYXNzd29yZDogbnVtYmVyIG9mIHNwZWNpYWwgc3ltYm9scyAiICsgc3ltYm9scworICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBkb2VzIG5vdCBtZWV0IHJlcXVpcmVkIG51bWJlciBvZiBzcGVjaWFsIHN5bWJvbHMgIiArIG5lZWRlZFN5bWJvbHMpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGludCBuZWVkZWROb25MZXR0ZXIgPSBnZXRQYXNzd29yZE1pbmltdW1Ob25MZXR0ZXIobnVsbCk7CisgICAgICAgICAgICAgICAgaWYgKG5vbmxldHRlciA8IG5lZWRlZE5vbkxldHRlcikgeworICAgICAgICAgICAgICAgICAgICBTbG9nLncoVEFHLCAicmVzZXRQYXNzd29yZDogbnVtYmVyIG9mIG5vbi1sZXR0ZXIgY2hhcmFjdGVycyAiICsgbm9ubGV0dGVyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGRvZXMgbm90IG1lZXQgcmVxdWlyZWQgbnVtYmVyIG9mIG5vbi1sZXR0ZXIgY2hhcmFjdGVycyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBuZWVkZWROb25MZXR0ZXIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBMb2NrUGF0dGVyblV0aWxzIHV0aWxzID0gbmV3IExvY2tQYXR0ZXJuVXRpbHMobUNvbnRleHQpOworICAgICAgICAgICAgaWYodXRpbHMuY2hlY2tQYXNzd29yZEhpc3RvcnkocGFzc3dvcmQpKSB7CisgICAgICAgICAgICAgICAgU2xvZy53KFRBRywgInJlc2V0UGFzc3dvcmQ6IHBhc3N3b3JkIGlzIHRoZSBzYW1lIGFzIG9uZSBvZiB0aGUgbGFzdCAiCisgICAgICAgICAgICAgICAgICAgICAgICArIGdldFBhc3N3b3JkSGlzdG9yeUxlbmd0aChudWxsKSArICIgcGFzc3dvcmRzIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQogICAgICAgICB9Ci0gICAgICAgIAorCiAgICAgICAgIGludCBjYWxsaW5nVWlkID0gQmluZGVyLmdldENhbGxpbmdVaWQoKTsKICAgICAgICAgaWYgKG1QYXNzd29yZE93bmVyID49IDAgJiYgbVBhc3N3b3JkT3duZXIgIT0gY2FsbGluZ1VpZCkgewogICAgICAgICAgICAgU2xvZy53KFRBRywgInJlc2V0UGFzc3dvcmQ6IGFscmVhZHkgc2V0IGJ5IGFub3RoZXIgdWlkIGFuZCBub3QgZW50ZXJlZCBieSB1c2VyIik7CiAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KLSAgICAgICAgCisKICAgICAgICAgLy8gRG9uJ3QgZG8gdGhpcyB3aXRoIHRoZSBsb2NrIGhlbGQsIGJlY2F1c2UgaXQgaXMgZ29pbmcgdG8gY2FsbAogICAgICAgICAvLyBiYWNrIGluIHRvIHRoZSBzZXJ2aWNlLgogICAgICAgICBsb25nIGlkZW50ID0gQmluZGVyLmNsZWFyQ2FsbGluZ0lkZW50aXR5KCk7CkBAIC03ODMsMTAgKzEyNjYsMTAgQEAKICAgICAgICAgfSBmaW5hbGx5IHsKICAgICAgICAgICAgIEJpbmRlci5yZXN0b3JlQ2FsbGluZ0lkZW50aXR5KGlkZW50KTsKICAgICAgICAgfQotICAgICAgICAKKwogICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9Ci0gICAgCisKICAgICBwdWJsaWMgdm9pZCBzZXRNYXhpbXVtVGltZVRvTG9jayhDb21wb25lbnROYW1lIHdobywgbG9uZyB0aW1lTXMpIHsKICAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7CiAgICAgICAgICAgICBpZiAod2hvID09IG51bGwpIHsKQEAgLTc5NiwxNiArMTI3OSwxNiBAQAogICAgICAgICAgICAgICAgICAgICBEZXZpY2VBZG1pbkluZm8uVVNFU19QT0xJQ1lfRk9SQ0VfTE9DSyk7CiAgICAgICAgICAgICBpZiAoYXAubWF4aW11bVRpbWVUb1VubG9jayAhPSB0aW1lTXMpIHsKICAgICAgICAgICAgICAgICBhcC5tYXhpbXVtVGltZVRvVW5sb2NrID0gdGltZU1zOwotICAgICAgICAgICAgICAgIAorCiAgICAgICAgICAgICAgICAgbG9uZyBpZGVudCA9IEJpbmRlci5jbGVhckNhbGxpbmdJZGVudGl0eSgpOwogICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgIHNhdmVTZXR0aW5nc0xvY2tlZCgpOwotICAgICAgICAgICAgICAgICAgICAKKwogICAgICAgICAgICAgICAgICAgICB0aW1lTXMgPSBnZXRNYXhpbXVtVGltZVRvTG9jayhudWxsKTsKICAgICAgICAgICAgICAgICAgICAgaWYgKHRpbWVNcyA8PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lTXMgPSBJbnRlZ2VyLk1BWF9WQUxVRTsKICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAKKwogICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgZ2V0SVBvd2VyTWFuYWdlcigpLnNldE1heGltdW1TY3JlZW5PZmZUaW1lb3VudCgoaW50KXRpbWVNcyk7CiAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CkBAIC04MTcsMTYgKzEzMDAsMTYgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KLSAgICAKKwogICAgIHB1YmxpYyBsb25nIGdldE1heGltdW1UaW1lVG9Mb2NrKENvbXBvbmVudE5hbWUgd2hvKSB7CiAgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgewogICAgICAgICAgICAgbG9uZyB0aW1lID0gMDsKLSAgICAgICAgICAgIAorCiAgICAgICAgICAgICBpZiAod2hvICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICBBY3RpdmVBZG1pbiBhZG1pbiA9IGdldEFjdGl2ZUFkbWluVW5jaGVja2VkTG9ja2VkKHdobyk7CiAgICAgICAgICAgICAgICAgcmV0dXJuIGFkbWluICE9IG51bGwgPyBhZG1pbi5tYXhpbXVtVGltZVRvVW5sb2NrIDogdGltZTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAorCiAgICAgICAgICAgICBmaW5hbCBpbnQgTiA9IG1BZG1pbkxpc3Quc2l6ZSgpOwogICAgICAgICAgICAgZm9yICAoaW50IGk9MDsgaTxOOyBpKyspIHsKICAgICAgICAgICAgICAgICBBY3RpdmVBZG1pbiBhZG1pbiA9IG1BZG1pbkxpc3QuZ2V0KGkpOwpAQCAtODQwLDcgKzEzMjMsNyBAQAogICAgICAgICAgICAgcmV0dXJuIHRpbWU7CiAgICAgICAgIH0KICAgICB9Ci0gICAgCisKICAgICBwdWJsaWMgdm9pZCBsb2NrTm93KCkgewogICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKICAgICAgICAgICAgIC8vIFRoaXMgQVBJIGNhbiBvbmx5IGJlIGNhbGxlZCBieSBhbiBhY3RpdmUgZGV2aWNlIGFkbWluLApAQCAtODU3LDcgKzEzNDAsNyBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQotICAgIAorCiAgICAgdm9pZCB3aXBlRGF0YUxvY2tlZChpbnQgZmxhZ3MpIHsKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIFJlY292ZXJ5U3lzdGVtLnJlYm9vdFdpcGVVc2VyRGF0YShtQ29udGV4dCk7CkBAIC04NjUsNyArMTM0OCw3IEBACiAgICAgICAgICAgICBTbG9nLncoVEFHLCAiRmFpbGVkIHJlcXVlc3RpbmcgZGF0YSB3aXBlIiwgZSk7CiAgICAgICAgIH0KICAgICB9Ci0gICAgCisKICAgICBwdWJsaWMgdm9pZCB3aXBlRGF0YShpbnQgZmxhZ3MpIHsKICAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7CiAgICAgICAgICAgICAvLyBUaGlzIEFQSSBjYW4gb25seSBiZSBjYWxsZWQgYnkgYW4gYWN0aXZlIGRldmljZSBhZG1pbiwKQEAgLTg4MCwxMSArMTM2MywxMSBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQotICAgIAorCiAgICAgcHVibGljIHZvaWQgZ2V0UmVtb3ZlV2FybmluZyhDb21wb25lbnROYW1lIGNvbXAsIGZpbmFsIFJlbW90ZUNhbGxiYWNrIHJlc3VsdCkgewogICAgICAgICBtQ29udGV4dC5lbmZvcmNlQ2FsbGluZ09yU2VsZlBlcm1pc3Npb24oCiAgICAgICAgICAgICAgICAgYW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uLkJJTkRfREVWSUNFX0FETUlOLCBudWxsKTsKLSAgICAgICAgCisKICAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7CiAgICAgICAgICAgICBBY3RpdmVBZG1pbiBhZG1pbiA9IGdldEFjdGl2ZUFkbWluVW5jaGVja2VkTG9ja2VkKGNvbXApOwogICAgICAgICAgICAgaWYgKGFkbWluID09IG51bGwpIHsKQEAgLTkwNywyMCArMTM5MCwzMCBAQAogICAgICAgICAgICAgfSwgbnVsbCwgQWN0aXZpdHkuUkVTVUxUX09LLCBudWxsLCBudWxsKTsKICAgICAgICAgfQogICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBzZXRBY3RpdmVQYXNzd29yZFN0YXRlKGludCBxdWFsaXR5LCBpbnQgbGVuZ3RoKSB7CisKKyAgICBwdWJsaWMgdm9pZCBzZXRBY3RpdmVQYXNzd29yZFN0YXRlKGludCBxdWFsaXR5LCBpbnQgbGVuZ3RoLCBpbnQgbGV0dGVycywgaW50IHVwcGVyY2FzZSwKKyAgICAgICAgICAgIGludCBsb3dlcmNhc2UsIGludCBudW1iZXJzLCBpbnQgc3ltYm9scywgaW50IG5vbmxldHRlcikgewogICAgICAgICBtQ29udGV4dC5lbmZvcmNlQ2FsbGluZ09yU2VsZlBlcm1pc3Npb24oCiAgICAgICAgICAgICAgICAgYW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uLkJJTkRfREVWSUNFX0FETUlOLCBudWxsKTsKLSAgICAgICAgCisKICAgICAgICAgdmFsaWRhdGVRdWFsaXR5Q29uc3RhbnQocXVhbGl0eSk7Ci0gICAgICAgIAorCiAgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgewogICAgICAgICAgICAgaWYgKG1BY3RpdmVQYXNzd29yZFF1YWxpdHkgIT0gcXVhbGl0eSB8fCBtQWN0aXZlUGFzc3dvcmRMZW5ndGggIT0gbGVuZ3RoCi0gICAgICAgICAgICAgICAgICAgIHx8IG1GYWlsZWRQYXNzd29yZEF0dGVtcHRzICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgfHwgbUZhaWxlZFBhc3N3b3JkQXR0ZW1wdHMgIT0gMCB8fCBtQWN0aXZlUGFzc3dvcmRMZXR0ZXJzICE9IGxldHRlcnMKKyAgICAgICAgICAgICAgICAgICAgfHwgbUFjdGl2ZVBhc3N3b3JkVXBwZXJDYXNlICE9IHVwcGVyY2FzZQorICAgICAgICAgICAgICAgICAgICB8fCBtQWN0aXZlUGFzc3dvcmRMb3dlckNhc2UgIT0gbG93ZXJjYXNlIHx8IG1BY3RpdmVQYXNzd29yZE51bWVyaWMgIT0gbnVtYmVycworICAgICAgICAgICAgICAgICAgICB8fCBtQWN0aXZlUGFzc3dvcmRTeW1ib2xzICE9IHN5bWJvbHMgfHwgbUFjdGl2ZVBhc3N3b3JkTm9uTGV0dGVyICE9IG5vbmxldHRlcikgewogICAgICAgICAgICAgICAgIGxvbmcgaWRlbnQgPSBCaW5kZXIuY2xlYXJDYWxsaW5nSWRlbnRpdHkoKTsKICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICBtQWN0aXZlUGFzc3dvcmRRdWFsaXR5ID0gcXVhbGl0eTsKICAgICAgICAgICAgICAgICAgICAgbUFjdGl2ZVBhc3N3b3JkTGVuZ3RoID0gbGVuZ3RoOworICAgICAgICAgICAgICAgICAgICBtQWN0aXZlUGFzc3dvcmRMZXR0ZXJzID0gbGV0dGVyczsKKyAgICAgICAgICAgICAgICAgICAgbUFjdGl2ZVBhc3N3b3JkTG93ZXJDYXNlID0gbG93ZXJjYXNlOworICAgICAgICAgICAgICAgICAgICBtQWN0aXZlUGFzc3dvcmRVcHBlckNhc2UgPSB1cHBlcmNhc2U7CisgICAgICAgICAgICAgICAgICAgIG1BY3RpdmVQYXNzd29yZE51bWVyaWMgPSBudW1iZXJzOworICAgICAgICAgICAgICAgICAgICBtQWN0aXZlUGFzc3dvcmRTeW1ib2xzID0gc3ltYm9sczsKKyAgICAgICAgICAgICAgICAgICAgbUFjdGl2ZVBhc3N3b3JkTm9uTGV0dGVyID0gbm9ubGV0dGVyOwogICAgICAgICAgICAgICAgICAgICBtRmFpbGVkUGFzc3dvcmRBdHRlbXB0cyA9IDA7CiAgICAgICAgICAgICAgICAgICAgIHNhdmVTZXR0aW5nc0xvY2tlZCgpOwogICAgICAgICAgICAgICAgICAgICBzZW5kQWRtaW5Db21tYW5kTG9ja2VkKERldmljZUFkbWluUmVjZWl2ZXIuQUNUSU9OX1BBU1NXT1JEX0NIQU5HRUQsCkBAIC05MzEsMTEgKzE0MjQsMTEgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KLSAgICAKKwogICAgIHB1YmxpYyB2b2lkIHJlcG9ydEZhaWxlZFBhc3N3b3JkQXR0ZW1wdCgpIHsKICAgICAgICAgbUNvbnRleHQuZW5mb3JjZUNhbGxpbmdPclNlbGZQZXJtaXNzaW9uKAogICAgICAgICAgICAgICAgIGFuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbi5CSU5EX0RFVklDRV9BRE1JTiwgbnVsbCk7Ci0gICAgICAgIAorCiAgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgewogICAgICAgICAgICAgbG9uZyBpZGVudCA9IEJpbmRlci5jbGVhckNhbGxpbmdJZGVudGl0eSgpOwogICAgICAgICAgICAgdHJ5IHsKQEAgLTk1MiwxMSArMTQ0NSwxMSBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQotICAgIAorCiAgICAgcHVibGljIHZvaWQgcmVwb3J0U3VjY2Vzc2Z1bFBhc3N3b3JkQXR0ZW1wdCgpIHsKICAgICAgICAgbUNvbnRleHQuZW5mb3JjZUNhbGxpbmdPclNlbGZQZXJtaXNzaW9uKAogICAgICAgICAgICAgICAgIGFuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbi5CSU5EX0RFVklDRV9BRE1JTiwgbnVsbCk7Ci0gICAgICAgIAorCiAgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgewogICAgICAgICAgICAgaWYgKG1GYWlsZWRQYXNzd29yZEF0dGVtcHRzICE9IDAgfHwgbVBhc3N3b3JkT3duZXIgPj0gMCkgewogICAgICAgICAgICAgICAgIGxvbmcgaWRlbnQgPSBCaW5kZXIuY2xlYXJDYWxsaW5nSWRlbnRpdHkoKTsKQEAgLTk3Miw3ICsxNDY1LDk1IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9Ci0gICAgCisKKyAgICBwdWJsaWMgQ29tcG9uZW50TmFtZSBzZXRHbG9iYWxQcm94eShDb21wb25lbnROYW1lIHdobywgU3RyaW5nIHByb3h5U3BlYywKKyAgICAgICAgICAgIFN0cmluZyBleGNsdXNpb25MaXN0KSB7CisgICAgICAgIHN5bmNocm9uaXplZCh0aGlzKSB7CisgICAgICAgICAgICBpZiAod2hvID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oIkNvbXBvbmVudE5hbWUgaXMgbnVsbCIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBBY3RpdmVBZG1pbiBhZG1pbiA9IGdldEFjdGl2ZUFkbWluRm9yQ2FsbGVyTG9ja2VkKHdobywKKyAgICAgICAgICAgICAgICAgICAgRGV2aWNlQWRtaW5JbmZvLlVTRVNfUE9MSUNZX1NFVFNfR0xPQkFMX1BST1hZKTsKKworICAgICAgICAgICAgLy8gU2NhbiB0aHJvdWdoIGFjdGl2ZSBhZG1pbnMgYW5kIGZpbmQgaWYgYW55b25lIGhhcyBhbHJlYWR5CisgICAgICAgICAgICAvLyBzZXQgdGhlIGdsb2JhbCBwcm94eS4KKyAgICAgICAgICAgIGZpbmFsIGludCBOID0gbUFkbWluTGlzdC5zaXplKCk7CisgICAgICAgICAgICBTZXQ8Q29tcG9uZW50TmFtZT4gY29tcFNldCA9IG1BZG1pbk1hcC5rZXlTZXQoKTsKKyAgICAgICAgICAgIGZvciAgKENvbXBvbmVudE5hbWUgY29tcG9uZW50IDogY29tcFNldCkgeworICAgICAgICAgICAgICAgIEFjdGl2ZUFkbWluIGFwID0gbUFkbWluTWFwLmdldChjb21wb25lbnQpOworICAgICAgICAgICAgICAgIGlmICgoYXAuc3BlY2lmaWVzR2xvYmFsUHJveHkpICYmICghY29tcG9uZW50LmVxdWFscyh3aG8pKSkgeworICAgICAgICAgICAgICAgICAgICAvLyBBbm90aGVyIGFkbWluIGFscmVhZHkgc2V0cyB0aGUgZ2xvYmFsIHByb3h5CisgICAgICAgICAgICAgICAgICAgIC8vIFJldHVybiBpdCB0byB0aGUgY2FsbGVyLgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29tcG9uZW50OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChwcm94eVNwZWMgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGFkbWluLnNwZWNpZmllc0dsb2JhbFByb3h5ID0gZmFsc2U7CisgICAgICAgICAgICAgICAgYWRtaW4uZ2xvYmFsUHJveHlTcGVjID0gbnVsbDsKKyAgICAgICAgICAgICAgICBhZG1pbi5nbG9iYWxQcm94eUV4Y2x1c2lvbkxpc3QgPSBudWxsOworICAgICAgICAgICAgfSBlbHNlIHsKKworICAgICAgICAgICAgICAgIGFkbWluLnNwZWNpZmllc0dsb2JhbFByb3h5ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBhZG1pbi5nbG9iYWxQcm94eVNwZWMgPSBwcm94eVNwZWM7CisgICAgICAgICAgICAgICAgYWRtaW4uZ2xvYmFsUHJveHlFeGNsdXNpb25MaXN0ID0gZXhjbHVzaW9uTGlzdDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gUmVzZXQgdGhlIGdsb2JhbCBwcm94eSBhY2NvcmRpbmdseQorICAgICAgICAgICAgLy8gRG8gdGhpcyB1c2luZyBzeXN0ZW0gcGVybWlzc2lvbnMsIGFzIGFwcHMgY2Fubm90IHdyaXRlIHRvIHNlY3VyZSBzZXR0aW5ncworICAgICAgICAgICAgbG9uZyBvcmlnSWQgPSBCaW5kZXIuY2xlYXJDYWxsaW5nSWRlbnRpdHkoKTsKKyAgICAgICAgICAgIHJlc2V0R2xvYmFsUHJveHkoKTsKKyAgICAgICAgICAgIEJpbmRlci5yZXN0b3JlQ2FsbGluZ0lkZW50aXR5KG9yaWdJZCk7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBDb21wb25lbnROYW1lIGdldEdsb2JhbFByb3h5QWRtaW4oKSB7CisgICAgICAgIHN5bmNocm9uaXplZCh0aGlzKSB7CisgICAgICAgICAgICAvLyBTY2FuIHRocm91Z2ggYWN0aXZlIGFkbWlucyBhbmQgZmluZCBpZiBhbnlvbmUgaGFzIGFscmVhZHkKKyAgICAgICAgICAgIC8vIHNldCB0aGUgZ2xvYmFsIHByb3h5LgorICAgICAgICAgICAgZmluYWwgaW50IE4gPSBtQWRtaW5MaXN0LnNpemUoKTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTjsgaSsrKSB7CisgICAgICAgICAgICAgICAgQWN0aXZlQWRtaW4gYXAgPSBtQWRtaW5MaXN0LmdldChpKTsKKyAgICAgICAgICAgICAgICBpZiAoYXAuc3BlY2lmaWVzR2xvYmFsUHJveHkpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gRGV2aWNlIGFkbWluIHNldHMgdGhlIGdsb2JhbCBwcm94eQorICAgICAgICAgICAgICAgICAgICAvLyBSZXR1cm4gaXQgdG8gdGhlIGNhbGxlci4KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGFwLmluZm8uZ2V0Q29tcG9uZW50KCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8vIE5vIGRldmljZSBhZG1pbiBzZXRzIHRoZSBnbG9iYWwgcHJveHkuCisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCByZXNldEdsb2JhbFByb3h5KCkgeworICAgICAgICBmaW5hbCBpbnQgTiA9IG1BZG1pbkxpc3Quc2l6ZSgpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IE47IGkrKykgeworICAgICAgICAgICAgQWN0aXZlQWRtaW4gYXAgPSBtQWRtaW5MaXN0LmdldChpKTsKKyAgICAgICAgICAgIGlmIChhcC5zcGVjaWZpZXNHbG9iYWxQcm94eSkgeworICAgICAgICAgICAgICAgIHNhdmVHbG9iYWxQcm94eShhcC5nbG9iYWxQcm94eVNwZWMsIGFwLmdsb2JhbFByb3h5RXhjbHVzaW9uTGlzdCk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8vIE5vIGRldmljZSBhZG1pbnMgZGVmaW5pbmcgZ2xvYmFsIHByb3hpZXMgLSByZXNldCBnbG9iYWwgcHJveHkgc2V0dGluZ3MgdG8gbm9uZQorICAgICAgICBzYXZlR2xvYmFsUHJveHkobnVsbCwgbnVsbCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHNhdmVHbG9iYWxQcm94eShTdHJpbmcgcHJveHlTcGVjLCBTdHJpbmcgZXhjbHVzaW9uTGlzdCkgeworICAgICAgICBpZiAoZXhjbHVzaW9uTGlzdCA9PSBudWxsKSB7CisgICAgICAgICAgICBleGNsdXNpb25MaXN0ID0gIiI7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHByb3h5U3BlYyA9PSBudWxsKSB7CisgICAgICAgICAgICBwcm94eVNwZWMgPSAiIjsKKyAgICAgICAgfQorICAgICAgICAvLyBSZW1vdmUgd2hpdGUgc3BhY2VzCisgICAgICAgIHByb3h5U3BlYyA9IHByb3h5U3BlYy50cmltKCk7CisgICAgICAgIGV4Y2x1c2lvbkxpc3QgPSBleGNsdXNpb25MaXN0LnRyaW0oKTsKKyAgICAgICAgQ29udGVudFJlc29sdmVyIHJlcyA9IG1Db250ZXh0LmdldENvbnRlbnRSZXNvbHZlcigpOworICAgICAgICBTZXR0aW5ncy5TZWN1cmUucHV0U3RyaW5nKHJlcywgU2V0dGluZ3MuU2VjdXJlLkhUVFBfUFJPWFksIHByb3h5U3BlYyk7CisgICAgICAgIFNldHRpbmdzLlNlY3VyZS5wdXRTdHJpbmcocmVzLCBTZXR0aW5ncy5TZWN1cmUuSFRUUF9QUk9YWV9FWENMVVNJT05fTElTVCwgZXhjbHVzaW9uTGlzdCk7CisgICAgfQorCiAgICAgQE92ZXJyaWRlCiAgICAgcHJvdGVjdGVkIHZvaWQgZHVtcChGaWxlRGVzY3JpcHRvciBmZCwgUHJpbnRXcml0ZXIgcHcsIFN0cmluZ1tdIGFyZ3MpIHsKICAgICAgICAgaWYgKG1Db250ZXh0LmNoZWNrQ2FsbGluZ09yU2VsZlBlcm1pc3Npb24oYW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uLkRVTVApCkBAIC05ODMsMTIgKzE1NjQsMTIgQEAKICAgICAgICAgICAgICAgICAgICAgKyAiLCB1aWQ9IiArIEJpbmRlci5nZXRDYWxsaW5nVWlkKCkpOwogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9Ci0gICAgICAgIAorCiAgICAgICAgIGZpbmFsIFByaW50ZXIgcCA9IG5ldyBQcmludFdyaXRlclByaW50ZXIocHcpOwotICAgICAgICAKKwogICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKICAgICAgICAgICAgIHAucHJpbnRsbigiQ3VycmVudCBEZXZpY2UgUG9saWN5IE1hbmFnZXIgc3RhdGU6Iik7Ci0gICAgICAgICAgICAKKwogICAgICAgICAgICAgcC5wcmludGxuKCIgIEVuYWJsZWQgRGV2aWNlIEFkbWluczoiKTsKICAgICAgICAgICAgIGZpbmFsIGludCBOID0gbUFkbWluTGlzdC5zaXplKCk7CiAgICAgICAgICAgICBmb3IgKGludCBpPTA7IGk8TjsgaSsrKSB7CkBAIC05OTksMTEgKzE1ODAsMTcgQEAKICAgICAgICAgICAgICAgICAgICAgYXAuZHVtcCgiICAgICIsIHB3KTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAKKwogICAgICAgICAgICAgcHcucHJpbnRsbigiICIpOwogICAgICAgICAgICAgcHcucHJpbnQoIiAgbUFjdGl2ZVBhc3N3b3JkUXVhbGl0eT0weCIpOwogICAgICAgICAgICAgICAgICAgICBwdy5wcmludGxuKEludGVnZXIudG9IZXhTdHJpbmcobUFjdGl2ZVBhc3N3b3JkUXVhbGl0eSkpOwogICAgICAgICAgICAgcHcucHJpbnQoIiAgbUFjdGl2ZVBhc3N3b3JkTGVuZ3RoPSIpOyBwdy5wcmludGxuKG1BY3RpdmVQYXNzd29yZExlbmd0aCk7CisgICAgICAgICAgICBwdy5wcmludCgiICBtQWN0aXZlUGFzc3dvcmRVcHBlckNhc2U9Iik7IHB3LnByaW50bG4obUFjdGl2ZVBhc3N3b3JkVXBwZXJDYXNlKTsKKyAgICAgICAgICAgIHB3LnByaW50KCIgIG1BY3RpdmVQYXNzd29yZExvd2VyQ2FzZT0iKTsgcHcucHJpbnRsbihtQWN0aXZlUGFzc3dvcmRMb3dlckNhc2UpOworICAgICAgICAgICAgcHcucHJpbnQoIiAgbUFjdGl2ZVBhc3N3b3JkTGV0dGVycz0iKTsgcHcucHJpbnRsbihtQWN0aXZlUGFzc3dvcmRMZXR0ZXJzKTsKKyAgICAgICAgICAgIHB3LnByaW50KCIgIG1BY3RpdmVQYXNzd29yZE51bWVyaWM9Iik7IHB3LnByaW50bG4obUFjdGl2ZVBhc3N3b3JkTnVtZXJpYyk7CisgICAgICAgICAgICBwdy5wcmludCgiICBtQWN0aXZlUGFzc3dvcmRTeW1ib2xzPSIpOyBwdy5wcmludGxuKG1BY3RpdmVQYXNzd29yZFN5bWJvbHMpOworICAgICAgICAgICAgcHcucHJpbnQoIiAgbUFjdGl2ZVBhc3N3b3JkTm9uTGV0dGVyPSIpOyBwdy5wcmludGxuKG1BY3RpdmVQYXNzd29yZE5vbkxldHRlcik7CiAgICAgICAgICAgICBwdy5wcmludCgiICBtRmFpbGVkUGFzc3dvcmRBdHRlbXB0cz0iKTsgcHcucHJpbnRsbihtRmFpbGVkUGFzc3dvcmRBdHRlbXB0cyk7CiAgICAgICAgICAgICBwdy5wcmludCgiICBtUGFzc3dvcmRPd25lcj0iKTsgcHcucHJpbnRsbihtUGFzc3dvcmRPd25lcik7CiAgICAgICAgIH0KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL0xvY2F0aW9uTWFuYWdlclNlcnZpY2UuamF2YSBiL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL0xvY2F0aW9uTWFuYWdlclNlcnZpY2UuamF2YQppbmRleCBmM2NlOGJhLi44NDUyYTlmIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9Mb2NhdGlvbk1hbmFnZXJTZXJ2aWNlLmphdmEKKysrIGIvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvTG9jYXRpb25NYW5hZ2VyU2VydmljZS5qYXZhCkBAIC00NzIsMTAgKzQ3MiwxMSBAQAogICAgICAgICBtRW5hYmxlZFByb3ZpZGVycy5hZGQocGFzc2l2ZVByb3ZpZGVyLmdldE5hbWUoKSk7CiAKICAgICAgICAgLy8gaW5pdGlhbGl6ZSBleHRlcm5hbCBuZXR3b3JrIGxvY2F0aW9uIGFuZCBnZW9jb2RlciBzZXJ2aWNlcworICAgICAgICBQYWNrYWdlTWFuYWdlciBwbSA9IG1Db250ZXh0LiBnZXRQYWNrYWdlTWFuYWdlcigpOwogICAgICAgICBSZXNvdXJjZXMgcmVzb3VyY2VzID0gbUNvbnRleHQuZ2V0UmVzb3VyY2VzKCk7CiAgICAgICAgIFN0cmluZyBzZXJ2aWNlTmFtZSA9IHJlc291cmNlcy5nZXRTdHJpbmcoCiAgICAgICAgICAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHJpbmcuY29uZmlnX25ldHdvcmtMb2NhdGlvblByb3ZpZGVyKTsKLSAgICAgICAgaWYgKHNlcnZpY2VOYW1lICE9IG51bGwpIHsKKyAgICAgICAgaWYgKHNlcnZpY2VOYW1lICE9IG51bGwgJiYgcG0ucmVzb2x2ZVNlcnZpY2UobmV3IEludGVudChzZXJ2aWNlTmFtZSksIDApICE9IG51bGwpIHsKICAgICAgICAgICAgIG1OZXR3b3JrTG9jYXRpb25Qcm92aWRlciA9CiAgICAgICAgICAgICAgICAgbmV3IExvY2F0aW9uUHJvdmlkZXJQcm94eShtQ29udGV4dCwgTG9jYXRpb25NYW5hZ2VyLk5FVFdPUktfUFJPVklERVIsCiAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlTmFtZSwgbUxvY2F0aW9uSGFuZGxlcik7CkBAIC00ODMsNyArNDg0LDcgQEAKICAgICAgICAgfQogCiAgICAgICAgIHNlcnZpY2VOYW1lID0gcmVzb3VyY2VzLmdldFN0cmluZyhjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0cmluZy5jb25maWdfZ2VvY29kZVByb3ZpZGVyKTsKLSAgICAgICAgaWYgKHNlcnZpY2VOYW1lICE9IG51bGwpIHsKKyAgICAgICAgaWYgKHNlcnZpY2VOYW1lICE9IG51bGwgJiYgcG0ucmVzb2x2ZVNlcnZpY2UobmV3IEludGVudChzZXJ2aWNlTmFtZSksIDApICE9IG51bGwpIHsKICAgICAgICAgICAgIG1HZW9jb2RlUHJvdmlkZXIgPSBuZXcgR2VvY29kZXJQcm94eShtQ29udGV4dCwgc2VydmljZU5hbWUpOwogICAgICAgICB9CiAKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL01vdW50U2VydmljZS5qYXZhIGIvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvTW91bnRTZXJ2aWNlLmphdmEKaW5kZXggMTMxZGRlZC4uMzJmNWU3MyAxMDA2NDQKLS0tIGEvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvTW91bnRTZXJ2aWNlLmphdmEKKysrIGIvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvTW91bnRTZXJ2aWNlLmphdmEKQEAgLTEzNyw2ICsxMzcsOCBAQAogICAgIHByaXZhdGUgYm9vbGVhbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQm9vdGVkID0gZmFsc2U7CiAgICAgcHJpdmF0ZSBib29sZWFuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1SZWFkeSA9IGZhbHNlOwogICAgIHByaXZhdGUgYm9vbGVhbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtU2VuZFVtc0Nvbm5lY3RlZE9uQm9vdCA9IGZhbHNlOworICAgIC8vIHRydWUgaWYgd2Ugc2hvdWxkIGZha2UgTUVESUFfTU9VTlRFRCBzdGF0ZSBmb3IgZXh0ZXJuYWwgc3RvcmFnZQorICAgIHByaXZhdGUgYm9vbGVhbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtRW11bGF0ZUV4dGVybmFsU3RvcmFnZSA9IGZhbHNlOwogCiAgICAgLyoqCiAgICAgICogUHJpdmF0ZSBoYXNoIG9mIGN1cnJlbnRseSBtb3VudGVkIHNlY3VyZSBjb250YWluZXJzLgpAQCAtMzk3LDcgKzM5OSw5IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHBhdGggPSBFbnZpcm9ubWVudC5nZXRFeHRlcm5hbFN0b3JhZ2VEaXJlY3RvcnkoKS5nZXRQYXRoKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHN0YXRlID0gZ2V0Vm9sdW1lU3RhdGUocGF0aCk7CiAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdGUuZXF1YWxzKEVudmlyb25tZW50Lk1FRElBX1VOTU9VTlRFRCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobUVtdWxhdGVFeHRlcm5hbFN0b3JhZ2UpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm90aWZ5Vm9sdW1lU3RhdGVDaGFuZ2UobnVsbCwgcGF0aCwgVm9sdW1lU3RhdGUuTm9NZWRpYSwgVm9sdW1lU3RhdGUuTW91bnRlZCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzdGF0ZS5lcXVhbHMoRW52aXJvbm1lbnQuTUVESUFfVU5NT1VOVEVEKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcmMgPSBkb01vdW50Vm9sdW1lKHBhdGgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmMgIT0gU3RvcmFnZVJlc3VsdENvZGUuT3BlcmF0aW9uU3VjY2VlZGVkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTbG9nLmUoVEFHLCBTdHJpbmcuZm9ybWF0KCJCb290LXRpbWUgbW91bnQgZmFpbGVkICglZCkiLCByYykpOwpAQCAtNDY4LDExICs0NzIsMTMgQEAKICAgICAgICAgICAgIFNsb2cudyhUQUcsIFN0cmluZy5mb3JtYXQoIkR1cGxpY2F0ZSBzdGF0ZSB0cmFuc2l0aW9uICglcyAtPiAlcykiLCBtTGVnYWN5U3RhdGUsIHN0YXRlKSk7CiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KLSAgICAgICAgLy8gVXBkYXRlIHN0YXRlIG9uIFBhY2thZ2VNYW5hZ2VyCi0gICAgICAgIGlmIChFbnZpcm9ubWVudC5NRURJQV9VTk1PVU5URUQuZXF1YWxzKHN0YXRlKSkgewotICAgICAgICAgICAgbVBtcy51cGRhdGVFeHRlcm5hbE1lZGlhU3RhdHVzKGZhbHNlLCBmYWxzZSk7Ci0gICAgICAgIH0gZWxzZSBpZiAoRW52aXJvbm1lbnQuTUVESUFfTU9VTlRFRC5lcXVhbHMoc3RhdGUpKSB7Ci0gICAgICAgICAgICBtUG1zLnVwZGF0ZUV4dGVybmFsTWVkaWFTdGF0dXModHJ1ZSwgZmFsc2UpOworICAgICAgICAvLyBVcGRhdGUgc3RhdGUgb24gUGFja2FnZU1hbmFnZXIsIGJ1dCBvbmx5IG9mIHJlYWwgZXZlbnRzCisgICAgICAgIGlmICghbUVtdWxhdGVFeHRlcm5hbFN0b3JhZ2UpIHsKKyAgICAgICAgICAgIGlmIChFbnZpcm9ubWVudC5NRURJQV9VTk1PVU5URUQuZXF1YWxzKHN0YXRlKSkgeworICAgICAgICAgICAgICAgIG1QbXMudXBkYXRlRXh0ZXJuYWxNZWRpYVN0YXR1cyhmYWxzZSwgZmFsc2UpOworICAgICAgICAgICAgfSBlbHNlIGlmIChFbnZpcm9ubWVudC5NRURJQV9NT1VOVEVELmVxdWFscyhzdGF0ZSkpIHsKKyAgICAgICAgICAgICAgICBtUG1zLnVwZGF0ZUV4dGVybmFsTWVkaWFTdGF0dXModHJ1ZSwgZmFsc2UpOworICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIFN0cmluZyBvbGRTdGF0ZSA9IG1MZWdhY3lTdGF0ZTsKICAgICAgICAgbUxlZ2FjeVN0YXRlID0gc3RhdGU7CkBAIC05ODEsNiArOTg3LDEzIEBACiAgICAgcHVibGljIE1vdW50U2VydmljZShDb250ZXh0IGNvbnRleHQpIHsKICAgICAgICAgbUNvbnRleHQgPSBjb250ZXh0OwogCisgICAgICAgIG1FbXVsYXRlRXh0ZXJuYWxTdG9yYWdlID0gY29udGV4dC5nZXRSZXNvdXJjZXMoKS5nZXRCb29sZWFuKAorICAgICAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuYm9vbC5jb25maWdfZW11bGF0ZUV4dGVybmFsU3RvcmFnZSk7CisgICAgICAgIGlmIChtRW11bGF0ZUV4dGVybmFsU3RvcmFnZSkgeworICAgICAgICAgICAgU2xvZy5kKFRBRywgInVzaW5nIGVtdWxhdGVkIGV4dGVybmFsIHN0b3JhZ2UiKTsKKyAgICAgICAgICAgIG1MZWdhY3lTdGF0ZSA9IEVudmlyb25tZW50Lk1FRElBX01PVU5URUQ7CisgICAgICAgIH0KKwogICAgICAgICAvLyBYWFg6IFRoaXMgd2lsbCBnbyBhd2F5IHNvb24gaW4gZmF2b3Igb2YgSU1vdW50U2VydmljZU9ic2VydmVyCiAgICAgICAgIG1QbXMgPSAoUGFja2FnZU1hbmFnZXJTZXJ2aWNlKSBTZXJ2aWNlTWFuYWdlci5nZXRTZXJ2aWNlKCJwYWNrYWdlIik7CiAKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL05hdGl2ZURhZW1vbkNvbm5lY3Rvci5qYXZhIGIvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvTmF0aXZlRGFlbW9uQ29ubmVjdG9yLmphdmEKaW5kZXggZjNjYjliNy4uMDNmOGRhZSAxMDA2NDQKLS0tIGEvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvTmF0aXZlRGFlbW9uQ29ubmVjdG9yLmphdmEKKysrIGIvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvTmF0aXZlRGFlbW9uQ29ubmVjdG9yLmphdmEKQEAgLTEzMiwxMSArMTMyLDEyIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTbG9nLmUoVEFHLCBTdHJpbmcuZm9ybWF0KAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRXJyb3IgaGFuZGxpbmcgJyVzJyIsIGV2ZW50KSwgZXgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1SZXNwb25zZVF1ZXVlLnB1dChldmVudCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2xvZy5lKFRBRywgIkZhaWxlZCB0byBwdXQgcmVzcG9uc2Ugb250byBxdWV1ZSIsIGV4KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVJlc3BvbnNlUXVldWUucHV0KGV2ZW50KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNsb2cuZShUQUcsICJGYWlsZWQgdG8gcHV0IHJlc3BvbnNlIG9udG8gcXVldWUiLCBleCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gbmZlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2xvZy53KFRBRywgU3RyaW5nLmZvcm1hdCgiQmFkIG1zZyAoJXMpIiwgZXZlbnQpKTsKQEAgLTIxNiw2ICsyMTcsNyBAQAogICAgICAqLwogICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgQXJyYXlMaXN0PFN0cmluZz4gZG9Db21tYW5kKFN0cmluZyBjbWQpCiAgICAgICAgICAgICB0aHJvd3MgTmF0aXZlRGFlbW9uQ29ubmVjdG9yRXhjZXB0aW9uICB7CisgICAgICAgIG1SZXNwb25zZVF1ZXVlLmNsZWFyKCk7CiAgICAgICAgIHNlbmRDb21tYW5kKGNtZCk7CiAKICAgICAgICAgQXJyYXlMaXN0PFN0cmluZz4gcmVzcG9uc2UgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL05ldHdvcmtNYW5hZ2VtZW50U2VydmljZS5qYXZhIGIvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvTmV0d29ya01hbmFnZW1lbnRTZXJ2aWNlLmphdmEKaW5kZXggNGE2OWYyMC4uZGU0NTlhYiAxMDA2NDQKLS0tIGEvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvTmV0d29ya01hbmFnZW1lbnRTZXJ2aWNlLmphdmEKKysrIGIvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvTmV0d29ya01hbmFnZW1lbnRTZXJ2aWNlLmphdmEKQEAgLTIwNSwxMCArMjA1LDEwIEBACiAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFVua25vd25Ib3N0RXhjZXB0aW9uKGFkZHJTdHJpbmcpOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBpbnQgYSA9IEludGVnZXIucGFyc2VJbnQocGFydHNbMF0pICAgICAgOwotICAgICAgICAgICAgaW50IGIgPSBJbnRlZ2VyLnBhcnNlSW50KHBhcnRzWzFdKSA8PCAgODsKLSAgICAgICAgICAgIGludCBjID0gSW50ZWdlci5wYXJzZUludChwYXJ0c1syXSkgPDwgMTY7Ci0gICAgICAgICAgICBpbnQgZCA9IEludGVnZXIucGFyc2VJbnQocGFydHNbM10pIDw8IDI0OworICAgICAgICAgICAgaW50IGEgPSBJbnRlZ2VyLnBhcnNlSW50KHBhcnRzWzBdKSA8PCAyNDsKKyAgICAgICAgICAgIGludCBiID0gSW50ZWdlci5wYXJzZUludChwYXJ0c1sxXSkgPDwgMTY7CisgICAgICAgICAgICBpbnQgYyA9IEludGVnZXIucGFyc2VJbnQocGFydHNbMl0pIDw8ICA4OworICAgICAgICAgICAgaW50IGQgPSBJbnRlZ2VyLnBhcnNlSW50KHBhcnRzWzNdKSAgICAgIDsKIAogICAgICAgICAgICAgcmV0dXJuIGEgfCBiIHwgYyB8IGQ7CiAgICAgICAgIH0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBleCkgewpkaWZmIC0tZ2l0IGEvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvTmV0d29ya1RpbWVVcGRhdGVTZXJ2aWNlLmphdmEgYi9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9OZXR3b3JrVGltZVVwZGF0ZVNlcnZpY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MmY4NGViCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvTmV0d29ya1RpbWVVcGRhdGVTZXJ2aWNlLmphdmEKQEAgLTAsMCArMSwyOTcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLnNlcnZlcjsKKworaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5UZWxlcGhvbnlJbnRlbnRzOworCitpbXBvcnQgYW5kcm9pZC5hcHAuQWxhcm1NYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQuYXBwLlBlbmRpbmdJbnRlbnQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkJyb2FkY2FzdFJlY2VpdmVyOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZW50UmVzb2x2ZXI7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50RmlsdGVyOworaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2UuQ29udGVudE9ic2VydmVyOworaW1wb3J0IGFuZHJvaWQubmV0LlNudHBDbGllbnQ7CitpbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyOworaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlclRocmVhZDsKK2ltcG9ydCBhbmRyb2lkLm9zLkxvb3BlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLk1lc3NhZ2U7CitpbXBvcnQgYW5kcm9pZC5vcy5TeXN0ZW1DbG9jazsKK2ltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLlNldHRpbmdzOworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CitpbXBvcnQgYW5kcm9pZC51dGlsLlNsb2c7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsKKworLyoqCisgKiBNb25pdG9ycyB0aGUgbmV0d29yayB0aW1lIGFuZCB1cGRhdGVzIHRoZSBzeXN0ZW0gdGltZSBpZiBpdCBpcyBvdXQgb2Ygc3luYworICogYW5kIHRoZXJlIGhhc24ndCBiZWVuIGFueSBOSVRaIHVwZGF0ZSBmcm9tIHRoZSBjYXJyaWVyIHJlY2VudGx5LgorICogSWYgbG9va2luZyB1cCB0aGUgbmV0d29yayB0aW1lIGZhaWxzIGZvciBzb21lIHJlYXNvbiwgaXQgdHJpZXMgYSBmZXcgdGltZXMgd2l0aCBhIHNob3J0CisgKiBpbnRlcnZhbCBhbmQgdGhlbiByZXNldHMgdG8gY2hlY2tpbmcgb24gbG9uZ2VyIGludGVydmFscy4KKyAqIDxwPgorICogSWYgdGhlIHVzZXIgZW5hYmxlcyBBVVRPX1RJTUUsIGl0IHdpbGwgY2hlY2sgaW1tZWRpYXRlbHkgZm9yIHRoZSBuZXR3b3JrIHRpbWUsIGlmIE5JVFogd2Fzbid0CisgKiBhdmFpbGFibGUuCisgKiA8L3A+CisgKi8KK3B1YmxpYyBjbGFzcyBOZXR3b3JrVGltZVVwZGF0ZVNlcnZpY2UgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJOZXR3b3JrVGltZVVwZGF0ZVNlcnZpY2UiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gREJHID0gZmFsc2U7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRVZFTlRfQVVUT19USU1FX0NIQU5HRUQgPSAxOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBFVkVOVF9QT0xMX05FVFdPUktfVElNRSA9IDI7CisKKyAgICAvKiogTm9ybWFsIHBvbGxpbmcgZnJlcXVlbmN5ICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBQT0xMSU5HX0lOVEVSVkFMX01TID0gMjRMICogNjAgKiA2MCAqIDEwMDA7IC8vIDI0IGhycworICAgIC8qKiBUcnktYWdhaW4gcG9sbGluZyBpbnRlcnZhbCwgaW4gY2FzZSB0aGUgbmV0d29yayByZXF1ZXN0IGZhaWxlZCAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgUE9MTElOR19JTlRFUlZBTF9TSE9SVEVSX01TID0gNjAgKiAxMDAwTDsgLy8gNjAgc2Vjb25kcworICAgIC8qKiBOdW1iZXIgb2YgdGltZXMgdG8gdHJ5IGFnYWluICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFRSWV9BR0FJTl9USU1FU19NQVggPSAzOworICAgIC8qKiBIb3cgbG9uZyB0byB3YWl0IGZvciB0aGUgTlRQIHNlcnZlciB0byByZXNwb25kLiAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNQVhfTlRQX0ZFVENIX1dBSVRfTVMgPSAyMCAqIDEwMDA7CisgICAgLyoqIElmIHRoZSB0aW1lIGRpZmZlcmVuY2UgaXMgZ3JlYXRlciB0aGFuIHRoaXMgdGhyZXNob2xkLCB0aGVuIHVwZGF0ZSB0aGUgdGltZS4gKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgVElNRV9FUlJPUl9USFJFU0hPTERfTVMgPSA1ICogMTAwMDsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBQ1RJT05fUE9MTCA9CisgICAgICAgICAgICAiY29tLmFuZHJvaWQuc2VydmVyLk5ldHdvcmtUaW1lVXBkYXRlU2VydmljZS5hY3Rpb24uUE9MTCI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BFUlRJRVNfRklMRSA9ICIvZXRjL2dwcy5jb25mIjsKKyAgICBwcml2YXRlIHN0YXRpYyBpbnQgUE9MTF9SRVFVRVNUID0gMDsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgTk9UX1NFVCA9IC0xOworICAgIHByaXZhdGUgbG9uZyBtTml0elRpbWVTZXRUaW1lID0gTk9UX1NFVDsKKyAgICAvLyBUT0RPOiBIYXZlIGEgd2F5IHRvIGxvb2sgdXAgdGhlIHRpbWV6b25lIHdlIGFyZSBpbgorICAgIHByaXZhdGUgbG9uZyBtTml0elpvbmVTZXRUaW1lID0gTk9UX1NFVDsKKworICAgIHByaXZhdGUgQ29udGV4dCBtQ29udGV4dDsKKyAgICAvLyBOVFAgbG9va3VwIGlzIGRvbmUgb24gdGhpcyB0aHJlYWQgYW5kIGhhbmRsZXIKKyAgICBwcml2YXRlIEhhbmRsZXIgbUhhbmRsZXI7CisgICAgcHJpdmF0ZSBIYW5kbGVyVGhyZWFkIG1UaHJlYWQ7CisgICAgcHJpdmF0ZSBBbGFybU1hbmFnZXIgbUFsYXJtTWFuYWdlcjsKKyAgICBwcml2YXRlIFBlbmRpbmdJbnRlbnQgbVBlbmRpbmdQb2xsSW50ZW50OworICAgIHByaXZhdGUgU2V0dGluZ3NPYnNlcnZlciBtU2V0dGluZ3NPYnNlcnZlcjsKKyAgICAvLyBBZGRyZXNzIG9mIHRoZSBOVFAgc2VydmVyCisgICAgcHJpdmF0ZSBTdHJpbmcgbU50cFNlcnZlcjsKKyAgICAvLyBUaGUgbGFzdCB0aW1lIHRoYXQgd2Ugc3VjY2Vzc2Z1bGx5IGZldGNoZWQgdGhlIE5UUCB0aW1lLgorICAgIHByaXZhdGUgbG9uZyBtTGFzdE50cEZldGNoVGltZSA9IE5PVF9TRVQ7CisgICAgLy8gS2VlcHMgdHJhY2sgb2YgaG93IG1hbnkgcXVpY2sgYXR0ZW1wdHMgd2VyZSBtYWRlIHRvIGZldGNoIE5UUCB0aW1lLgorICAgIC8vIER1cmluZyBib290dXAsIHRoZSBuZXR3b3JrIG1heSBub3QgaGF2ZSBiZWVuIHVwIHlldCwgb3IgaXQncyB0YWtpbmcgdGltZSBmb3IgdGhlCisgICAgLy8gY29ubmVjdGlvbiB0byBoYXBwZW4uCisgICAgcHJpdmF0ZSBpbnQgbVRyeUFnYWluQ291bnRlcjsKKworICAgIHB1YmxpYyBOZXR3b3JrVGltZVVwZGF0ZVNlcnZpY2UoQ29udGV4dCBjb250ZXh0KSB7CisgICAgICAgIG1Db250ZXh0ID0gY29udGV4dDsKKyAgICAgICAgbUFsYXJtTWFuYWdlciA9IChBbGFybU1hbmFnZXIpIG1Db250ZXh0LmdldFN5c3RlbVNlcnZpY2UoQ29udGV4dC5BTEFSTV9TRVJWSUNFKTsKKyAgICAgICAgSW50ZW50IHBvbGxJbnRlbnQgPSBuZXcgSW50ZW50KEFDVElPTl9QT0xMLCBudWxsKTsKKyAgICAgICAgbVBlbmRpbmdQb2xsSW50ZW50ID0gUGVuZGluZ0ludGVudC5nZXRCcm9hZGNhc3QobUNvbnRleHQsIFBPTExfUkVRVUVTVCwgcG9sbEludGVudCwgMCk7CisgICAgfQorCisgICAgLyoqIEluaXRpYWxpemUgdGhlIHJlY2VpdmVycyBhbmQgaW5pdGlhdGUgdGhlIGZpcnN0IE5UUCByZXF1ZXN0ICovCisgICAgcHVibGljIHZvaWQgc3lzdGVtUmVhZHkoKSB7CisgICAgICAgIG1OdHBTZXJ2ZXIgPSBnZXROdHBTZXJ2ZXJBZGRyZXNzKCk7CisgICAgICAgIGlmIChtTnRwU2VydmVyID09IG51bGwpIHsKKyAgICAgICAgICAgIFNsb2cuZShUQUcsICJOVFAgc2VydmVyIGFkZHJlc3Mgbm90IGZvdW5kLCBub3Qgc3luY2luZyB0byBOVFAgdGltZSIpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgcmVnaXN0ZXJGb3JUZWxlcGhvbnlJbnRlbnRzKCk7CisgICAgICAgIHJlZ2lzdGVyRm9yQWxhcm1zKCk7CisKKyAgICAgICAgbVRocmVhZCA9IG5ldyBIYW5kbGVyVGhyZWFkKFRBRyk7CisgICAgICAgIG1UaHJlYWQuc3RhcnQoKTsKKyAgICAgICAgbUhhbmRsZXIgPSBuZXcgTXlIYW5kbGVyKG1UaHJlYWQuZ2V0TG9vcGVyKCkpOworICAgICAgICAvLyBDaGVjayB0aGUgbmV0d29yayB0aW1lIG9uIHRoZSBuZXcgdGhyZWFkCisgICAgICAgIG1IYW5kbGVyLm9idGFpbk1lc3NhZ2UoRVZFTlRfUE9MTF9ORVRXT1JLX1RJTUUpLnNlbmRUb1RhcmdldCgpOworCisgICAgICAgIG1TZXR0aW5nc09ic2VydmVyID0gbmV3IFNldHRpbmdzT2JzZXJ2ZXIobUhhbmRsZXIsIEVWRU5UX0FVVE9fVElNRV9DSEFOR0VEKTsKKyAgICAgICAgbVNldHRpbmdzT2JzZXJ2ZXIub2JzZXJ2ZShtQ29udGV4dCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBTdHJpbmcgZ2V0TnRwU2VydmVyQWRkcmVzcygpIHsKKyAgICAgICAgU3RyaW5nIHNlcnZlckFkZHJlc3MgPSBudWxsOworICAgICAgICBGaWxlSW5wdXRTdHJlYW0gc3RyZWFtID0gbnVsbDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIFByb3BlcnRpZXMgcHJvcGVydGllcyA9IG5ldyBQcm9wZXJ0aWVzKCk7CisgICAgICAgICAgICBGaWxlIGZpbGUgPSBuZXcgRmlsZShQUk9QRVJUSUVTX0ZJTEUpOworICAgICAgICAgICAgc3RyZWFtID0gbmV3IEZpbGVJbnB1dFN0cmVhbShmaWxlKTsKKyAgICAgICAgICAgIHByb3BlcnRpZXMubG9hZChzdHJlYW0pOworICAgICAgICAgICAgc2VydmVyQWRkcmVzcyA9IHByb3BlcnRpZXMuZ2V0UHJvcGVydHkoIk5UUF9TRVJWRVIiLCBudWxsKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgU2xvZy5lKFRBRywgIkNvdWxkIG5vdCBvcGVuIEdQUyBjb25maWd1cmF0aW9uIGZpbGUgIiArIFBST1BFUlRJRVNfRklMRSk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBpZiAoc3RyZWFtICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBzdHJlYW0uY2xvc2UoKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkge30KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc2VydmVyQWRkcmVzczsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgcmVnaXN0ZXJGb3JUZWxlcGhvbnlJbnRlbnRzKCkgeworICAgICAgICBJbnRlbnRGaWx0ZXIgaW50ZW50RmlsdGVyID0gbmV3IEludGVudEZpbHRlcigpOworICAgICAgICBpbnRlbnRGaWx0ZXIuYWRkQWN0aW9uKFRlbGVwaG9ueUludGVudHMuQUNUSU9OX05FVFdPUktfU0VUX1RJTUUpOworICAgICAgICBpbnRlbnRGaWx0ZXIuYWRkQWN0aW9uKFRlbGVwaG9ueUludGVudHMuQUNUSU9OX05FVFdPUktfU0VUX1RJTUVaT05FKTsKKyAgICAgICAgbUNvbnRleHQucmVnaXN0ZXJSZWNlaXZlcihtTml0elJlY2VpdmVyLCBpbnRlbnRGaWx0ZXIpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCByZWdpc3RlckZvckFsYXJtcygpIHsKKyAgICAgICAgbUNvbnRleHQucmVnaXN0ZXJSZWNlaXZlcigKKyAgICAgICAgICAgIG5ldyBCcm9hZGNhc3RSZWNlaXZlcigpIHsKKyAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBvblJlY2VpdmUoQ29udGV4dCBjb250ZXh0LCBJbnRlbnQgaW50ZW50KSB7CisgICAgICAgICAgICAgICAgICAgIG1IYW5kbGVyLm9idGFpbk1lc3NhZ2UoRVZFTlRfUE9MTF9ORVRXT1JLX1RJTUUpLnNlbmRUb1RhcmdldCgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0sIG5ldyBJbnRlbnRGaWx0ZXIoQUNUSU9OX1BPTEwpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgb25Qb2xsTmV0d29ya1RpbWUoaW50IGV2ZW50KSB7CisgICAgICAgIC8vIElmIEF1dG9tYXRpYyB0aW1lIGlzIG5vdCBzZXQsIGRvbid0IGJvdGhlci4KKyAgICAgICAgaWYgKCFpc0F1dG9tYXRpY1RpbWVSZXF1ZXN0ZWQoKSkgcmV0dXJuOworCisgICAgICAgIGZpbmFsIGxvbmcgcmVmVGltZSA9IFN5c3RlbUNsb2NrLmVsYXBzZWRSZWFsdGltZSgpOworICAgICAgICAvLyBJZiBOSVRaIHRpbWUgd2FzIHJlY2VpdmVkIGxlc3MgdGhhbiBQT0xMSU5HX0lOVEVSVkFMX01TIHRpbWUgYWdvLAorICAgICAgICAvLyBubyBuZWVkIHRvIHN5bmMgdG8gTlRQLgorICAgICAgICBpZiAobU5pdHpUaW1lU2V0VGltZSAhPSBOT1RfU0VUICYmIHJlZlRpbWUgLSBtTml0elRpbWVTZXRUaW1lIDwgUE9MTElOR19JTlRFUlZBTF9NUykgeworICAgICAgICAgICAgcmVzZXRBbGFybShQT0xMSU5HX0lOVEVSVkFMX01TKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBmaW5hbCBsb25nIGN1cnJlbnRUaW1lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisgICAgICAgIGlmIChEQkcpIExvZy5kKFRBRywgIlN5c3RlbSB0aW1lID0gIiArIGN1cnJlbnRUaW1lKTsKKyAgICAgICAgLy8gR2V0IHRoZSBOVFAgdGltZQorICAgICAgICBpZiAobUxhc3ROdHBGZXRjaFRpbWUgPT0gTk9UX1NFVCB8fCByZWZUaW1lID49IG1MYXN0TnRwRmV0Y2hUaW1lICsgUE9MTElOR19JTlRFUlZBTF9NUworICAgICAgICAgICAgICAgIHx8IGV2ZW50ID09IEVWRU5UX0FVVE9fVElNRV9DSEFOR0VEKSB7CisgICAgICAgICAgICBpZiAoREJHKSBMb2cuZChUQUcsICJCZWZvcmUgTnRwIGZldGNoIik7CisgICAgICAgICAgICBsb25nIG50cCA9IGdldE50cFRpbWUoKTsKKyAgICAgICAgICAgIGlmIChEQkcpIExvZy5kKFRBRywgIk50cCA9ICIgKyBudHApOworICAgICAgICAgICAgaWYgKG50cCA+IDApIHsKKyAgICAgICAgICAgICAgICBtVHJ5QWdhaW5Db3VudGVyID0gMDsKKyAgICAgICAgICAgICAgICBtTGFzdE50cEZldGNoVGltZSA9IFN5c3RlbUNsb2NrLmVsYXBzZWRSZWFsdGltZSgpOworICAgICAgICAgICAgICAgIGlmIChNYXRoLmFicyhudHAgLSBjdXJyZW50VGltZSkgPiBUSU1FX0VSUk9SX1RIUkVTSE9MRF9NUykgeworICAgICAgICAgICAgICAgICAgICAvLyBTZXQgdGhlIHN5c3RlbSB0aW1lCisgICAgICAgICAgICAgICAgICAgIGlmIChEQkcpIExvZy5kKFRBRywgIk50cCB0aW1lIHRvIGJlIHNldCA9ICIgKyBudHApOworICAgICAgICAgICAgICAgICAgICAvLyBNYWtlIHN1cmUgd2UgZG9uJ3Qgb3ZlcmZsb3csIHNpbmNlIGl0J3MgZ29pbmcgdG8gYmUgY29udmVydGVkIHRvIGFuIGludAorICAgICAgICAgICAgICAgICAgICBpZiAobnRwIC8gMTAwMCA8IEludGVnZXIuTUFYX1ZBTFVFKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBTeXN0ZW1DbG9jay5zZXRDdXJyZW50VGltZU1pbGxpcyhudHApOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKERCRykgTG9nLmQoVEFHLCAiTnRwIHRpbWUgaXMgY2xvc2UgZW5vdWdoID0gIiArIG50cCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvLyBUcnkgYWdhaW4gc2hvcnRseQorICAgICAgICAgICAgICAgIG1UcnlBZ2FpbkNvdW50ZXIrKzsKKyAgICAgICAgICAgICAgICBpZiAobVRyeUFnYWluQ291bnRlciA8PSBUUllfQUdBSU5fVElNRVNfTUFYKSB7CisgICAgICAgICAgICAgICAgICAgIHJlc2V0QWxhcm0oUE9MTElOR19JTlRFUlZBTF9TSE9SVEVSX01TKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAvLyBUcnkgbXVjaCBsYXRlcgorICAgICAgICAgICAgICAgICAgICBtVHJ5QWdhaW5Db3VudGVyID0gMDsKKyAgICAgICAgICAgICAgICAgICAgcmVzZXRBbGFybShQT0xMSU5HX0lOVEVSVkFMX01TKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJlc2V0QWxhcm0oUE9MTElOR19JTlRFUlZBTF9NUyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2FuY2VsIG9sZCBhbGFybSBhbmQgc3RhcnRzIGEgbmV3IG9uZSBmb3IgdGhlIHNwZWNpZmllZCBpbnRlcnZhbC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBpbnRlcnZhbCB3aGVuIHRvIHRyaWdnZXIgdGhlIGFsYXJtLCBzdGFydGluZyBmcm9tIG5vdy4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgcmVzZXRBbGFybShsb25nIGludGVydmFsKSB7CisgICAgICAgIG1BbGFybU1hbmFnZXIuY2FuY2VsKG1QZW5kaW5nUG9sbEludGVudCk7CisgICAgICAgIGxvbmcgbm93ID0gU3lzdGVtQ2xvY2suZWxhcHNlZFJlYWx0aW1lKCk7CisgICAgICAgIGxvbmcgbmV4dCA9IG5vdyArIGludGVydmFsOworICAgICAgICBtQWxhcm1NYW5hZ2VyLnNldChBbGFybU1hbmFnZXIuRUxBUFNFRF9SRUFMVElNRSwgbmV4dCwgbVBlbmRpbmdQb2xsSW50ZW50KTsKKyAgICB9CisKKyAgICBwcml2YXRlIGxvbmcgZ2V0TnRwVGltZSgpIHsKKyAgICAgICAgU250cENsaWVudCBjbGllbnQgPSBuZXcgU250cENsaWVudCgpOworICAgICAgICBpZiAoY2xpZW50LnJlcXVlc3RUaW1lKG1OdHBTZXJ2ZXIsIE1BWF9OVFBfRkVUQ0hfV0FJVF9NUykpIHsKKyAgICAgICAgICAgIHJldHVybiBjbGllbnQuZ2V0TnRwVGltZSgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDaGVja3MgaWYgdGhlIHVzZXIgcHJlZmVycyB0byBhdXRvbWF0aWNhbGx5IHNldCB0aGUgdGltZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gaXNBdXRvbWF0aWNUaW1lUmVxdWVzdGVkKCkgeworICAgICAgICByZXR1cm4gU2V0dGluZ3MuU3lzdGVtLmdldEludChtQ29udGV4dC5nZXRDb250ZW50UmVzb2x2ZXIoKSwgU2V0dGluZ3MuU3lzdGVtLkFVVE9fVElNRSwgMCkKKyAgICAgICAgICAgICAgICAhPSAwOworICAgIH0KKworICAgIC8qKiBSZWNlaXZlciBmb3IgTml0eiB0aW1lIGV2ZW50cyAqLworICAgIHByaXZhdGUgQnJvYWRjYXN0UmVjZWl2ZXIgbU5pdHpSZWNlaXZlciA9IG5ldyBCcm9hZGNhc3RSZWNlaXZlcigpIHsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgb25SZWNlaXZlKENvbnRleHQgY29udGV4dCwgSW50ZW50IGludGVudCkgeworICAgICAgICAgICAgU3RyaW5nIGFjdGlvbiA9IGludGVudC5nZXRBY3Rpb24oKTsKKyAgICAgICAgICAgIGlmIChUZWxlcGhvbnlJbnRlbnRzLkFDVElPTl9ORVRXT1JLX1NFVF9USU1FLmVxdWFscyhhY3Rpb24pKSB7CisgICAgICAgICAgICAgICAgbU5pdHpUaW1lU2V0VGltZSA9IFN5c3RlbUNsb2NrLmVsYXBzZWRSZWFsdGltZSgpOworICAgICAgICAgICAgfSBlbHNlIGlmIChUZWxlcGhvbnlJbnRlbnRzLkFDVElPTl9ORVRXT1JLX1NFVF9USU1FWk9ORS5lcXVhbHMoYWN0aW9uKSkgeworICAgICAgICAgICAgICAgIG1OaXR6Wm9uZVNldFRpbWUgPSBTeXN0ZW1DbG9jay5lbGFwc2VkUmVhbHRpbWUoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH07CisKKyAgICAvKiogSGFuZGxlciB0byBkbyB0aGUgbmV0d29yayBhY2Nlc3NlcyBvbiAqLworICAgIHByaXZhdGUgY2xhc3MgTXlIYW5kbGVyIGV4dGVuZHMgSGFuZGxlciB7CisKKyAgICAgICAgcHVibGljIE15SGFuZGxlcihMb29wZXIgbCkgeworICAgICAgICAgICAgc3VwZXIobCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgaGFuZGxlTWVzc2FnZShNZXNzYWdlIG1zZykgeworICAgICAgICAgICAgc3dpdGNoIChtc2cud2hhdCkgeworICAgICAgICAgICAgICAgIGNhc2UgRVZFTlRfQVVUT19USU1FX0NIQU5HRUQ6CisgICAgICAgICAgICAgICAgY2FzZSBFVkVOVF9QT0xMX05FVFdPUktfVElNRToKKyAgICAgICAgICAgICAgICAgICAgb25Qb2xsTmV0d29ya1RpbWUobXNnLndoYXQpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKiBPYnNlcnZlciB0byB3YXRjaCBmb3IgY2hhbmdlcyB0byB0aGUgQVVUT19USU1FIHNldHRpbmcgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBTZXR0aW5nc09ic2VydmVyIGV4dGVuZHMgQ29udGVudE9ic2VydmVyIHsKKworICAgICAgICBwcml2YXRlIGludCBtTXNnOworICAgICAgICBwcml2YXRlIEhhbmRsZXIgbUhhbmRsZXI7CisKKyAgICAgICAgU2V0dGluZ3NPYnNlcnZlcihIYW5kbGVyIGhhbmRsZXIsIGludCBtc2cpIHsKKyAgICAgICAgICAgIHN1cGVyKGhhbmRsZXIpOworICAgICAgICAgICAgbUhhbmRsZXIgPSBoYW5kbGVyOworICAgICAgICAgICAgbU1zZyA9IG1zZzsKKyAgICAgICAgfQorCisgICAgICAgIHZvaWQgb2JzZXJ2ZShDb250ZXh0IGNvbnRleHQpIHsKKyAgICAgICAgICAgIENvbnRlbnRSZXNvbHZlciByZXNvbHZlciA9IGNvbnRleHQuZ2V0Q29udGVudFJlc29sdmVyKCk7CisgICAgICAgICAgICByZXNvbHZlci5yZWdpc3RlckNvbnRlbnRPYnNlcnZlcihTZXR0aW5ncy5TeXN0ZW0uZ2V0VXJpRm9yKFNldHRpbmdzLlN5c3RlbS5BVVRPX1RJTUUpLAorICAgICAgICAgICAgICAgICAgICBmYWxzZSwgdGhpcyk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgb25DaGFuZ2UoYm9vbGVhbiBzZWxmQ2hhbmdlKSB7CisgICAgICAgICAgICBtSGFuZGxlci5vYnRhaW5NZXNzYWdlKG1Nc2cpLnNlbmRUb1RhcmdldCgpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvTm90aWZpY2F0aW9uTWFuYWdlclNlcnZpY2UuamF2YSBiL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL05vdGlmaWNhdGlvbk1hbmFnZXJTZXJ2aWNlLmphdmEKaW5kZXggNTE4Y2ZkOS4uNWFmYWJiZCAxMDA3NTUKLS0tIGEvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvTm90aWZpY2F0aW9uTWFuYWdlclNlcnZpY2UuamF2YQorKysgYi9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9Ob3RpZmljYXRpb25NYW5hZ2VyU2VydmljZS5qYXZhCkBAIC02MSw2ICs2MSw3IEBACiBpbXBvcnQgYW5kcm9pZC52aWV3LmFjY2Vzc2liaWxpdHkuQWNjZXNzaWJpbGl0eUV2ZW50OwogaW1wb3J0IGFuZHJvaWQudmlldy5hY2Nlc3NpYmlsaXR5LkFjY2Vzc2liaWxpdHlNYW5hZ2VyOwogaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlRvYXN0OworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlRvYXN0OwogCiBpbXBvcnQgamF2YS5pby5GaWxlRGVzY3JpcHRvcjsKIGltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOwpAQCAtMjg1LDYgKzI4NiwxMCBAQAogICAgICAgICAgICAgICAgICAgICBOb3RpZmljYXRpb24uRkxBR19GT1JFR1JPVU5EX1NFUlZJQ0UpOwogICAgICAgICB9CiAKKyAgICAgICAgcHVibGljIHZvaWQgb25Ob3RpZmljYXRpb25DbGVhcihTdHJpbmcgcGtnLCBTdHJpbmcgdGFnLCBpbnQgaWQpIHsKKyAgICAgICAgICAgIGNhbmNlbE5vdGlmaWNhdGlvbihwa2csIHRhZywgaWQsIDAsIDApOyAvLyBtYXliZSBhZGQgc29tZSBmbGFncz8KKyAgICAgICAgfQorCiAgICAgICAgIHB1YmxpYyB2b2lkIG9uUGFuZWxSZXZlYWxlZCgpIHsKICAgICAgICAgICAgIHN5bmNocm9uaXplZCAobU5vdGlmaWNhdGlvbkxpc3QpIHsKICAgICAgICAgICAgICAgICAvLyBzb3VuZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvUGFja2FnZU1hbmFnZXJTZXJ2aWNlLmphdmEgYi9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9QYWNrYWdlTWFuYWdlclNlcnZpY2UuamF2YQppbmRleCA3Mjc4NGQ1Li4xMDY5MjE2IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9QYWNrYWdlTWFuYWdlclNlcnZpY2UuamF2YQorKysgYi9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9QYWNrYWdlTWFuYWdlclNlcnZpY2UuamF2YQpAQCAtOTQwMyw3ICs5NDAzLDggQEAKICAgICAqIFVwZGF0ZSBtZWRpYSBzdGF0dXMgb24gUGFja2FnZU1hbmFnZXIuCiAgICAgKi8KICAgIHB1YmxpYyB2b2lkIHVwZGF0ZUV4dGVybmFsTWVkaWFTdGF0dXMoZmluYWwgYm9vbGVhbiBtZWRpYVN0YXR1cywgZmluYWwgYm9vbGVhbiByZXBvcnRTdGF0dXMpIHsKLSAgICAgICBpZiAoQmluZGVyLmdldENhbGxpbmdVaWQoKSAhPSBQcm9jZXNzLlNZU1RFTV9VSUQpIHsKKyAgICAgICBpbnQgY2FsbGluZ1VpZCA9IEJpbmRlci5nZXRDYWxsaW5nVWlkKCk7CisgICAgICAgaWYgKGNhbGxpbmdVaWQgIT0gMCAmJiBjYWxsaW5nVWlkICE9IFByb2Nlc3MuU1lTVEVNX1VJRCkgewogICAgICAgICAgICB0aHJvdyBuZXcgU2VjdXJpdHlFeGNlcHRpb24oIk1lZGlhIHN0YXR1cyBjYW4gb25seSBiZSB1cGRhdGVkIGJ5IHRoZSBzeXN0ZW0iKTsKICAgICAgICB9CiAgICAgICAgc3luY2hyb25pemVkIChtUGFja2FnZXMpIHsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL1Bvd2VyTWFuYWdlclNlcnZpY2UuamF2YSBiL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL1Bvd2VyTWFuYWdlclNlcnZpY2UuamF2YQppbmRleCA4YWIxYmI4Li4wMjNkYTQ2IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9Qb3dlck1hbmFnZXJTZXJ2aWNlLmphdmEKKysrIGIvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvUG93ZXJNYW5hZ2VyU2VydmljZS5qYXZhCkBAIC0yNTI3LDcgKzI1MjcsOCBAQAogICAgICAgICAgICAgfQogICAgICAgICAgICAgbUtleWxpZ2h0RGVsYXkgPSBMT05HX0tFWUxJR0hUX0RFTEFZOwogICAgICAgICAgICAgaWYgKHRvdGFsRGVsYXkgPCAwKSB7Ci0gICAgICAgICAgICAgICAgbVNjcmVlbk9mZkRlbGF5ID0gSW50ZWdlci5NQVhfVkFMVUU7CisgICAgICAgICAgICAgICAgLy8gbmVnYXRpdmUgbnVtYmVyIG1lYW5zIHN0YXkgb24gYXMgbG9uZyBhcyBwb3NzaWJsZS4KKyAgICAgICAgICAgICAgICBtU2NyZWVuT2ZmRGVsYXkgPSBtTWF4aW11bVNjcmVlbk9mZlRpbWVvdXQ7CiAgICAgICAgICAgICB9IGVsc2UgaWYgKG1LZXlsaWdodERlbGF5IDwgdG90YWxEZWxheSkgewogICAgICAgICAgICAgICAgIC8vIHN1YnRyYWN0IHRoZSB0aW1lIHRoYXQgdGhlIGtleWxpZ2h0IGRlbGF5LiBUaGlzIHdpbGwgZ2l2ZSB1cyB0aGUKICAgICAgICAgICAgICAgICAvLyByZW1haW5kZXIgb2YgdGhlIHRpbWUgdGhhdCB3ZSBuZWVkIHRvIHNsZWVwIHRvIGdldCB0aGUgYWNjdXJhdGUKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL1NhbXBsaW5nUHJvZmlsZXJTZXJ2aWNlLmphdmEgYi9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9TYW1wbGluZ1Byb2ZpbGVyU2VydmljZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI2YWY3ZjcKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9TYW1wbGluZ1Byb2ZpbGVyU2VydmljZS5qYXZhCkBAIC0wLDAgKzEsMTE4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5zZXJ2ZXI7CisKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFJlc29sdmVyOworaW1wb3J0IGFuZHJvaWQub3MuRHJvcEJveE1hbmFnZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5GaWxlT2JzZXJ2ZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5CaW5kZXI7CisKK2ltcG9ydCBhbmRyb2lkLnV0aWwuU2xvZzsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLkNvbnRlbnRPYnNlcnZlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLlN5c3RlbVByb3BlcnRpZXM7CitpbXBvcnQgYW5kcm9pZC5wcm92aWRlci5TZXR0aW5nczsKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC5vcy5TYW1wbGluZ1Byb2ZpbGVySW50ZWdyYXRpb247CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5GaWxlRGVzY3JpcHRvcjsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7CisKK3B1YmxpYyBjbGFzcyBTYW1wbGluZ1Byb2ZpbGVyU2VydmljZSBleHRlbmRzIEJpbmRlciB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIlNhbXBsaW5nUHJvZmlsZXJTZXJ2aWNlIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIExPQ0FMX0xPR1YgPSBmYWxzZTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTTkFQU0hPVF9ESVIgPSBTYW1wbGluZ1Byb2ZpbGVySW50ZWdyYXRpb24uU05BUFNIT1RfRElSOworCisgICAgcHJpdmF0ZSBGaWxlT2JzZXJ2ZXIgc25hcHNob3RPYnNlcnZlcjsKKworICAgIHB1YmxpYyBTYW1wbGluZ1Byb2ZpbGVyU2VydmljZShDb250ZXh0IGNvbnRleHQpIHsKKyAgICAgICAgcmVnaXN0ZXJTZXR0aW5nT2JzZXJ2ZXIoY29udGV4dCk7CisgICAgICAgIHN0YXJ0V29ya2luZyhjb250ZXh0KTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgc3RhcnRXb3JraW5nKENvbnRleHQgY29udGV4dCkgeworICAgICAgICBpZiAoTE9DQUxfTE9HVikgU2xvZy52KFRBRywgInN0YXJ0aW5nIFNhbXBsaW5nUHJvZmlsZXJTZXJ2aWNlISIpOworCisgICAgICAgIGZpbmFsIERyb3BCb3hNYW5hZ2VyIGRyb3Bib3ggPQorICAgICAgICAgICAgICAgIChEcm9wQm94TWFuYWdlcikgY29udGV4dC5nZXRTeXN0ZW1TZXJ2aWNlKENvbnRleHQuRFJPUEJPWF9TRVJWSUNFKTsKKworICAgICAgICAvLyBiZWZvcmUgRmlsZU9ic2VydmVyIGlzIHJlYWR5LCB0aGVyZSBjb3VsZCBoYXZlIGFscmVhZHkgYmVlbiBzb21lIHNuYXBzaG90cworICAgICAgICAvLyBpbiB0aGUgZGlyZWN0b3J5LCB3ZSBkb24ndCB3YW50IHRvIG1pc3MgdGhlbQorICAgICAgICBGaWxlW10gc25hcHNob3RGaWxlcyA9IG5ldyBGaWxlKFNOQVBTSE9UX0RJUikubGlzdEZpbGVzKCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBzbmFwc2hvdEZpbGVzICE9IG51bGwgJiYgaSA8IHNuYXBzaG90RmlsZXMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIGhhbmRsZVNuYXBzaG90RmlsZShzbmFwc2hvdEZpbGVzW2ldLCBkcm9wYm94KTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIGRldGVjdCBuZXcgc25hcHNob3QgYW5kIHB1dCBpdCBpbiBkcm9wYm94CisgICAgICAgIC8vIGRlbGV0ZSBpdCBhZnRlcndhcmRzIG5vIG1hdHRlciB3aGF0IGhhcHBlbmVkIGJlZm9yZQorICAgICAgICAvLyBOb3RlOiBuZWVkcyBsaXN0ZW5pbmcgYXQgZXZlbnQgQVRUUklCIHJhdGhlciB0aGFuIENMT1NFX1dSSVRFLCBiZWNhdXNlIHdlIHNldCB0aGUKKyAgICAgICAgLy8gcmVhZGFiaWxpdHkgb2Ygc25hcHNob3QgZmlsZXMgYWZ0ZXIgd3JpdGluZyB0aGVtIQorICAgICAgICBzbmFwc2hvdE9ic2VydmVyID0gbmV3IEZpbGVPYnNlcnZlcihTTkFQU0hPVF9ESVIsIEZpbGVPYnNlcnZlci5BVFRSSUIpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgb25FdmVudChpbnQgZXZlbnQsIFN0cmluZyBwYXRoKSB7CisgICAgICAgICAgICAgICAgaGFuZGxlU25hcHNob3RGaWxlKG5ldyBGaWxlKFNOQVBTSE9UX0RJUiwgcGF0aCksIGRyb3Bib3gpOworICAgICAgICAgICAgfQorICAgICAgICB9OworICAgICAgICBzbmFwc2hvdE9ic2VydmVyLnN0YXJ0V2F0Y2hpbmcoKTsKKworICAgICAgICBpZiAoTE9DQUxfTE9HVikgU2xvZy52KFRBRywgIlNhbXBsaW5nUHJvZmlsZXJTZXJ2aWNlIGFjdGl2YXRlZCIpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBoYW5kbGVTbmFwc2hvdEZpbGUoRmlsZSBmaWxlLCBEcm9wQm94TWFuYWdlciBkcm9wYm94KSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBkcm9wYm94LmFkZEZpbGUoVEFHLCBmaWxlLCAwKTsKKyAgICAgICAgICAgIGlmIChMT0NBTF9MT0dWKSBTbG9nLnYoVEFHLCBmaWxlLmdldFBhdGgoKSArICIgYWRkZWQgdG8gZHJvcGJveCIpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBTbG9nLmUoVEFHLCAiQ2FuJ3QgYWRkICIgKyBmaWxlLmdldFBhdGgoKSArICIgdG8gZHJvcGJveCIsIGUpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgZmlsZS5kZWxldGUoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCByZWdpc3RlclNldHRpbmdPYnNlcnZlcihDb250ZXh0IGNvbnRleHQpIHsKKyAgICAgICAgQ29udGVudFJlc29sdmVyIGNvbnRlbnRSZXNvbHZlciA9IGNvbnRleHQuZ2V0Q29udGVudFJlc29sdmVyKCk7CisgICAgICAgIGNvbnRlbnRSZXNvbHZlci5yZWdpc3RlckNvbnRlbnRPYnNlcnZlcigKKyAgICAgICAgICAgICAgICBTZXR0aW5ncy5TZWN1cmUuZ2V0VXJpRm9yKFNldHRpbmdzLlNlY3VyZS5TQU1QTElOR19QUk9GSUxFUl9IWiksCisgICAgICAgICAgICAgICAgZmFsc2UsIG5ldyBTYW1wbGluZ1Byb2ZpbGVyU2V0dGluZ3NPYnNlcnZlcihjb250ZW50UmVzb2x2ZXIpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBkdW1wKEZpbGVEZXNjcmlwdG9yIGZkLCBQcmludFdyaXRlciBwdywgU3RyaW5nW10gYXJncykgeworICAgICAgICBwdy5wcmludGxuKCJTYW1wbGluZ1Byb2ZpbGVyU2VydmljZToiKTsKKyAgICAgICAgcHcucHJpbnRsbigiV2F0Y2hpbmcgZGlyZWN0b3J5OiAiICsgU05BUFNIT1RfRElSKTsKKyAgICB9CisKKyAgICBwcml2YXRlIGNsYXNzIFNhbXBsaW5nUHJvZmlsZXJTZXR0aW5nc09ic2VydmVyIGV4dGVuZHMgQ29udGVudE9ic2VydmVyIHsKKyAgICAgICAgcHJpdmF0ZSBDb250ZW50UmVzb2x2ZXIgbUNvbnRlbnRSZXNvbHZlcjsKKyAgICAgICAgcHVibGljIFNhbXBsaW5nUHJvZmlsZXJTZXR0aW5nc09ic2VydmVyKENvbnRlbnRSZXNvbHZlciBjb250ZW50UmVzb2x2ZXIpIHsKKyAgICAgICAgICAgIHN1cGVyKG51bGwpOworICAgICAgICAgICAgbUNvbnRlbnRSZXNvbHZlciA9IGNvbnRlbnRSZXNvbHZlcjsKKyAgICAgICAgICAgIG9uQ2hhbmdlKGZhbHNlKTsKKyAgICAgICAgfQorICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgb25DaGFuZ2UoYm9vbGVhbiBzZWxmQ2hhbmdlKSB7CisgICAgICAgICAgICBJbnRlZ2VyIHNhbXBsaW5nUHJvZmlsZXJIeiA9IFNldHRpbmdzLlNlY3VyZS5nZXRJbnQoCisgICAgICAgICAgICAgICAgICAgIG1Db250ZW50UmVzb2x2ZXIsIFNldHRpbmdzLlNlY3VyZS5TQU1QTElOR19QUk9GSUxFUl9IWiwgMCk7CisgICAgICAgICAgICAvLyBzZXR0aW5nIHRoaXMgc2VjdXJlIHByb3BlcnR5IHdpbGwgc3RhcnQgb3Igc3RvcCBzYW1wbGluZyBwcm9maWxlciwKKyAgICAgICAgICAgIC8vIGFzIHdlbGwgYXMgYWRqdXN0IHRoZSBmcmVxdWVuY3kgb2YgdGFraW5nIHNuYXBzaG90cy4KKyAgICAgICAgICAgIFN5c3RlbVByb3BlcnRpZXMuc2V0KCJwZXJzaXN0LnN5cy5wcm9maWxlcl9oeiIsIHNhbXBsaW5nUHJvZmlsZXJIei50b1N0cmluZygpKTsKKyAgICAgICAgfQorICAgIH0KK30KKwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvU2h1dGRvd25BY3Rpdml0eS5qYXZhIGIvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvU2h1dGRvd25BY3Rpdml0eS5qYXZhCmluZGV4IDY0YjljNWQuLmM5ZDRkMDEgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL1NodXRkb3duQWN0aXZpdHkuamF2YQorKysgYi9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9TaHV0ZG93bkFjdGl2aXR5LmphdmEKQEAgLTI3LDE5ICsyNywyNiBAQAogcHVibGljIGNsYXNzIFNodXRkb3duQWN0aXZpdHkgZXh0ZW5kcyBBY3Rpdml0eSB7CiAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIlNodXRkb3duQWN0aXZpdHkiOworICAgIHByaXZhdGUgYm9vbGVhbiBtUmVib290OwogICAgIHByaXZhdGUgYm9vbGVhbiBtQ29uZmlybTsKIAogICAgIEBPdmVycmlkZQogICAgIHByb3RlY3RlZCB2b2lkIG9uQ3JlYXRlKEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpIHsKICAgICAgICAgc3VwZXIub25DcmVhdGUoc2F2ZWRJbnN0YW5jZVN0YXRlKTsKIAotICAgICAgICBtQ29uZmlybSA9IGdldEludGVudCgpLmdldEJvb2xlYW5FeHRyYShJbnRlbnQuRVhUUkFfS0VZX0NPTkZJUk0sIGZhbHNlKTsKKyAgICAgICAgSW50ZW50IGludGVudCA9IGdldEludGVudCgpOworICAgICAgICBtUmVib290ID0gSW50ZW50LkFDVElPTl9SRUJPT1QuZXF1YWxzKGludGVudC5nZXRBY3Rpb24oKSk7CisgICAgICAgIG1Db25maXJtID0gaW50ZW50LmdldEJvb2xlYW5FeHRyYShJbnRlbnQuRVhUUkFfS0VZX0NPTkZJUk0sIGZhbHNlKTsKICAgICAgICAgU2xvZy5pKFRBRywgIm9uQ3JlYXRlKCk6IGNvbmZpcm09IiArIG1Db25maXJtKTsKIAogICAgICAgICBIYW5kbGVyIGggPSBuZXcgSGFuZGxlcigpOwogICAgICAgICBoLnBvc3QobmV3IFJ1bm5hYmxlKCkgewogICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgewotICAgICAgICAgICAgICAgIFNodXRkb3duVGhyZWFkLnNodXRkb3duKFNodXRkb3duQWN0aXZpdHkudGhpcywgbUNvbmZpcm0pOworICAgICAgICAgICAgICAgIGlmIChtUmVib290KSB7CisgICAgICAgICAgICAgICAgICAgIFNodXRkb3duVGhyZWFkLnJlYm9vdChTaHV0ZG93bkFjdGl2aXR5LnRoaXMsIG51bGwsIG1Db25maXJtKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBTaHV0ZG93blRocmVhZC5zaHV0ZG93bihTaHV0ZG93bkFjdGl2aXR5LnRoaXMsIG1Db25maXJtKTsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgIH0pOwogICAgIH0KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL1N0YXR1c0Jhck1hbmFnZXJTZXJ2aWNlLmphdmEgYi9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9TdGF0dXNCYXJNYW5hZ2VyU2VydmljZS5qYXZhCmluZGV4IDQxNzc0MzIuLmIxYmFlYzUgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL1N0YXR1c0Jhck1hbmFnZXJTZXJ2aWNlLmphdmEKKysrIGIvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvU3RhdHVzQmFyTWFuYWdlclNlcnZpY2UuamF2YQpAQCAtNjgsNiArNjgsMTAgQEAKICAgICBBcnJheUxpc3Q8RGlzYWJsZVJlY29yZD4gbURpc2FibGVSZWNvcmRzID0gbmV3IEFycmF5TGlzdDxEaXNhYmxlUmVjb3JkPigpOwogICAgIGludCBtRGlzYWJsZWQgPSAwOwogCisgICAgT2JqZWN0IG1Mb2NrID0gbmV3IE9iamVjdCgpOworICAgIC8vIFdlIHVzdWFsbHkgY2FsbCBpdCBsaWdodHMgb3V0IG1vZGUsIGJ1dCBkb3VibGUgbmVnYXRpdmVzIGFyZSBhbm5veWluZworICAgIGJvb2xlYW4gbUxpZ2h0c09uID0gdHJ1ZTsKKwogICAgIHByaXZhdGUgY2xhc3MgRGlzYWJsZVJlY29yZCBpbXBsZW1lbnRzIElCaW5kZXIuRGVhdGhSZWNpcGllbnQgewogICAgICAgICBTdHJpbmcgcGtnOwogICAgICAgICBpbnQgd2hhdDsKQEAgLTg0LDYgKzg4LDcgQEAKICAgICAgICAgdm9pZCBvblNldERpc2FibGVkKGludCBzdGF0dXMpOwogICAgICAgICB2b2lkIG9uQ2xlYXJBbGwoKTsKICAgICAgICAgdm9pZCBvbk5vdGlmaWNhdGlvbkNsaWNrKFN0cmluZyBwa2csIFN0cmluZyB0YWcsIGludCBpZCk7CisgICAgICAgIHZvaWQgb25Ob3RpZmljYXRpb25DbGVhcihTdHJpbmcgcGtnLCBTdHJpbmcgdGFnLCBpbnQgaWQpOwogICAgICAgICB2b2lkIG9uUGFuZWxSZXZlYWxlZCgpOwogICAgICAgICB2b2lkIG9uTm90aWZpY2F0aW9uRXJyb3IoU3RyaW5nIHBrZywgU3RyaW5nIHRhZywgaW50IGlkLAogICAgICAgICAgICAgICAgIGludCB1aWQsIGludCBpbml0aWFsUGlkLCBTdHJpbmcgbWVzc2FnZSk7CkBAIC0yNDEsNiArMjQ2LDU2IEBACiAgICAgICAgIH0KICAgICB9CiAKKyAgICAvKioKKyAgICAgKiBUaGlzIGlzIHVzZWQgZm9yIHRoZSBhdXRvbWF0aWMgdmVyc2lvbiBvZiBsaWdodHMtb3V0IG1vZGUuICBPbmx5IGNhbGwgdGhpcyBmcm9tCisgICAgICogdGhlIHdpbmRvdyBtYW5hZ2VyLgorICAgICAqCisgICAgICogQHNlZSBzZXRMaWdodHNPbihib29sZWFuKQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEFjdGl2ZVdpbmRvd0lzRnVsbHNjcmVlbihib29sZWFuIGZ1bGxzY3JlZW4pIHsKKyAgICAgICAgLy8gV2UgY291bGQgZ2V0IGF3YXkgd2l0aCBhIHNlcGFyYXRlIHBlcm1pc3Npb24gaGVyZSwgYnV0IFNUQVRVU19CQVIgaXMKKyAgICAgICAgLy8gc2lnbmF0dXJlT3JTeXN0ZW0gd2hpY2ggaXMgcHJvYmFibHkgZ29vZCBlbm91Z2guICBUaGVyZSBpcyBubyBwdWJsaWMgQVBJCisgICAgICAgIC8vIGZvciB0aGlzLCBzbyB0aGUgcXVlc3Rpb24gaXMgYSBzZWN1cml0eSBpc3N1ZSwgbm90IGFuIEFQSSBjb21wYXRpYmlsaXR5IGlzc3VlLgorICAgICAgICBlbmZvcmNlU3RhdHVzQmFyKCk7CisKKyAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgeworICAgICAgICAgICAgdXBkYXRlTGlnaHRzT25Mb2NrZWQoIWZ1bGxzY3JlZW4pOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhpcyBpcyB1c2VkIGZvciB0aGUgdXNlci1jb250cm9sbGVkIHZlcnNpb24gb2YgbGlnaHRzLW91dCBtb2RlLiAgT25seSBjYWxsIHRoaXMgZnJvbQorICAgICAqIHRoZSBzdGF0dXMgYmFyIGl0c2VsZi4KKyAgICAgKgorICAgICAqIFdlIGhhdmUgdHdvIGRpZmZlcmVudCBmdW5jdGlvbnMgaGVyZSwgYmVjYXVzZSBJIHRoaW5rIHdlJ3JlIGdvaW5nIHRvIHdhbnQgdG8KKyAgICAgKiB0d2VhayB0aGUgYmVoYXZpb3Igd2hlbiB0aGUgdXNlciBrZWVwcyB0dXJuaW5nIGxpZ2h0cy1vdXQgbW9kZSBvZmYgYW5kIHRoZQorICAgICAqIGFwcCBrZWVwcyB0cnlpbmcgdG8gdHVybiBpdCBvbi4gIEZvciBub3cgdGhleSBjYW4ganVzdCBmaWdodCBpdCBvdXQuICBIYXZpbmcKKyAgICAgKiB0aGVzZSB0d28gc2VwYXJ0ZSBpbnB1dHMgd2lsbCBhbGxvdyB1cyB0byBrZWVwIHRoYXQgY2hhbmdlIGxvY2FsIHRvIGhlcmUuICAtLWpvZW8KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRMaWdodHNPbihib29sZWFuIGxpZ2h0c09uKSB7CisgICAgICAgIGVuZm9yY2VTdGF0dXNCYXJTZXJ2aWNlKCk7CisKKyAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgeworICAgICAgICAgICAgdXBkYXRlTGlnaHRzT25Mb2NrZWQobGlnaHRzT24pOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHVwZGF0ZUxpZ2h0c09uTG9ja2VkKGZpbmFsIGJvb2xlYW4gbGlnaHRzT24pIHsKKyAgICAgICAgaWYgKG1MaWdodHNPbiAhPSBsaWdodHNPbikgeworICAgICAgICAgICAgbUxpZ2h0c09uID0gbGlnaHRzT247CisgICAgICAgICAgICBtSGFuZGxlci5wb3N0KG5ldyBSdW5uYWJsZSgpIHsKKyAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1CYXIgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1CYXIuc2V0TGlnaHRzT24obGlnaHRzT24pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0pOworICAgICAgICB9CisgICAgfQorCiAgICAgcHJpdmF0ZSB2b2lkIGVuZm9yY2VTdGF0dXNCYXIoKSB7CiAgICAgICAgIG1Db250ZXh0LmVuZm9yY2VDYWxsaW5nT3JTZWxmUGVybWlzc2lvbihhbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24uU1RBVFVTX0JBUiwKICAgICAgICAgICAgICAgICAiU3RhdHVzQmFyTWFuYWdlclNlcnZpY2UiKTsKQEAgLTI2MSw3ICszMTYsOCBAQAogICAgIC8vIENhbGxiYWNrcyBmcm9tIHRoZSBzdGF0dXMgYmFyIHNlcnZpY2UuCiAgICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgICBwdWJsaWMgdm9pZCByZWdpc3RlclN0YXR1c0JhcihJU3RhdHVzQmFyIGJhciwgU3RhdHVzQmFySWNvbkxpc3QgaWNvbkxpc3QsCi0gICAgICAgICAgICBMaXN0PElCaW5kZXI+IG5vdGlmaWNhdGlvbktleXMsIExpc3Q8U3RhdHVzQmFyTm90aWZpY2F0aW9uPiBub3RpZmljYXRpb25zKSB7CisgICAgICAgICAgICBMaXN0PElCaW5kZXI+IG5vdGlmaWNhdGlvbktleXMsIExpc3Q8U3RhdHVzQmFyTm90aWZpY2F0aW9uPiBub3RpZmljYXRpb25zLAorICAgICAgICAgICAgYm9vbGVhbiBsaWdodHNPbltdKSB7CiAgICAgICAgIGVuZm9yY2VTdGF0dXNCYXJTZXJ2aWNlKCk7CiAKICAgICAgICAgU2xvZy5pKFRBRywgInJlZ2lzdGVyU3RhdHVzQmFyIGJhcj0iICsgYmFyKTsKQEAgLTI3NSw2ICszMzEsOSBAQAogICAgICAgICAgICAgICAgIG5vdGlmaWNhdGlvbnMuYWRkKGUuZ2V0VmFsdWUoKSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KKyAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgeworICAgICAgICAgICAgbGlnaHRzT25bMF0gPSBtTGlnaHRzT247CisgICAgICAgIH0KICAgICB9CiAKICAgICAvKioKQEAgLTMwMiw2ICszNjEsMTIgQEAKICAgICAgICAgbU5vdGlmaWNhdGlvbkNhbGxiYWNrcy5vbk5vdGlmaWNhdGlvbkVycm9yKHBrZywgdGFnLCBpZCwgdWlkLCBpbml0aWFsUGlkLCBtZXNzYWdlKTsKICAgICB9CiAKKyAgICBwdWJsaWMgdm9pZCBvbk5vdGlmaWNhdGlvbkNsZWFyKFN0cmluZyBwa2csIFN0cmluZyB0YWcsIGludCBpZCkgeworICAgICAgICBlbmZvcmNlU3RhdHVzQmFyU2VydmljZSgpOworCisgICAgICAgIG1Ob3RpZmljYXRpb25DYWxsYmFja3Mub25Ob3RpZmljYXRpb25DbGVhcihwa2csIHRhZywgaWQpOworICAgIH0KKwogICAgIHB1YmxpYyB2b2lkIG9uQ2xlYXJBbGxOb3RpZmljYXRpb25zKCkgewogICAgICAgICBlbmZvcmNlU3RhdHVzQmFyU2VydmljZSgpOwogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9TeXN0ZW1TZXJ2ZXIuamF2YSBiL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL1N5c3RlbVNlcnZlci5qYXZhCmluZGV4IDg1OWRlNDYuLjRmMDUwMDcgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL1N5c3RlbVNlcnZlci5qYXZhCisrKyBiL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL1N5c3RlbVNlcnZlci5qYXZhCkBAIC0yNCwyNiArMjQsMjggQEAKIGltcG9ydCBkYWx2aWsuc3lzdGVtLlZNUnVudGltZTsKIGltcG9ydCBkYWx2aWsuc3lzdGVtLlp5Z290ZTsKIAoraW1wb3J0IGFuZHJvaWQuYWNjb3VudHMuQWNjb3VudE1hbmFnZXJTZXJ2aWNlOwogaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5TWFuYWdlck5hdGl2ZTsKIGltcG9ydCBhbmRyb2lkLmJsdWV0b290aC5CbHVldG9vdGhBZGFwdGVyOwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db21wb25lbnROYW1lOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZW50UmVzb2x2ZXI7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRTZXJ2aWNlOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLklQYWNrYWdlTWFuYWdlcjsKIGltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLkNvbnRlbnRPYnNlcnZlcjsKLWltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLkN1cnNvcjsKIGltcG9ydCBhbmRyb2lkLm1lZGlhLkF1ZGlvU2VydmljZTsKLWltcG9ydCBhbmRyb2lkLm9zLio7Ci1pbXBvcnQgYW5kcm9pZC5wcm92aWRlci5Db250YWN0cy5QZW9wbGU7CitpbXBvcnQgYW5kcm9pZC5vcy5CdWlsZDsKK2ltcG9ydCBhbmRyb2lkLm9zLkxvb3BlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbjsKK2ltcG9ydCBhbmRyb2lkLm9zLlNlcnZpY2VNYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQub3MuU3RyaWN0TW9kZTsKK2ltcG9ydCBhbmRyb2lkLm9zLlN5c3RlbUNsb2NrOworaW1wb3J0IGFuZHJvaWQub3MuU3lzdGVtUHJvcGVydGllczsKIGltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLlNldHRpbmdzOwogaW1wb3J0IGFuZHJvaWQuc2VydmVyLkJsdWV0b290aEEyZHBTZXJ2aWNlOwogaW1wb3J0IGFuZHJvaWQuc2VydmVyLkJsdWV0b290aFNlcnZpY2U7CiBpbXBvcnQgYW5kcm9pZC5zZXJ2ZXIuc2VhcmNoLlNlYXJjaE1hbmFnZXJTZXJ2aWNlOwogaW1wb3J0IGFuZHJvaWQudXRpbC5FdmVudExvZzsKIGltcG9ydCBhbmRyb2lkLnV0aWwuU2xvZzsKLWltcG9ydCBhbmRyb2lkLmFjY291bnRzLkFjY291bnRNYW5hZ2VyU2VydmljZTsKIAogaW1wb3J0IGphdmEuaW8uRmlsZTsKIGltcG9ydCBqYXZhLnV0aWwuVGltZXI7CkBAIC01MSwxMSArNTMsOCBAQAogCiBjbGFzcyBTZXJ2ZXJUaHJlYWQgZXh0ZW5kcyBUaHJlYWQgewogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiU3lzdGVtU2VydmVyIjsKLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBib29sZWFuIElOQ0xVREVfREVNTyA9IGZhbHNlOwogCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IExPR19CT09UX1BST0dSRVNTX1NZU1RFTV9SVU4gPSAzMDEwOwotCi0gICAgcHJpdmF0ZSBDb250ZW50UmVzb2x2ZXIgbUNvbnRlbnRSZXNvbHZlcjsKKyAgICBDb250ZW50UmVzb2x2ZXIgbUNvbnRlbnRSZXNvbHZlcjsKIAogICAgIHByaXZhdGUgY2xhc3MgQWRiU2V0dGluZ3NPYnNlcnZlciBleHRlbmRzIENvbnRlbnRPYnNlcnZlciB7CiAgICAgICAgIHB1YmxpYyBBZGJTZXR0aW5nc09ic2VydmVyKCkgewpAQCAtMTAyLDYgKzEwMSw3IEBACiAgICAgICAgIFVpTW9kZU1hbmFnZXJTZXJ2aWNlIHVpTW9kZSA9IG51bGw7CiAgICAgICAgIFJlY29nbml0aW9uTWFuYWdlclNlcnZpY2UgcmVjb2duaXRpb24gPSBudWxsOwogICAgICAgICBUaHJvdHRsZVNlcnZpY2UgdGhyb3R0bGUgPSBudWxsOworICAgICAgICBOZXR3b3JrVGltZVVwZGF0ZVNlcnZpY2UgbmV0d29ya1RpbWVVcGRhdGVyID0gbnVsbDsKIAogICAgICAgICAvLyBDcml0aWNhbCBzZXJ2aWNlcy4uLgogICAgICAgICB0cnkgewpAQCAtMjEwLDYgKzIxMCw3IEBACiAgICAgICAgIE5vdGlmaWNhdGlvbk1hbmFnZXJTZXJ2aWNlIG5vdGlmaWNhdGlvbiA9IG51bGw7CiAgICAgICAgIFdhbGxwYXBlck1hbmFnZXJTZXJ2aWNlIHdhbGxwYXBlciA9IG51bGw7CiAgICAgICAgIExvY2F0aW9uTWFuYWdlclNlcnZpY2UgbG9jYXRpb24gPSBudWxsOworICAgICAgICBDb3VudHJ5RGV0ZWN0b3JTZXJ2aWNlIGNvdW50cnlEZXRlY3RvciA9IG51bGw7CiAKICAgICAgICAgaWYgKGZhY3RvcnlUZXN0ICE9IFN5c3RlbVNlcnZlci5GQUNUT1JZX1RFU1RfTE9XX0xFVkVMKSB7CiAgICAgICAgICAgICB0cnkgewpAQCAtMzIwLDYgKzMyMSwxNCBAQAogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIFNsb2cuaShUQUcsICJDb3VudHJ5IERldGVjdG9yIik7CisgICAgICAgICAgICAgICAgY291bnRyeURldGVjdG9yID0gbmV3IENvdW50cnlEZXRlY3RvclNlcnZpY2UoY29udGV4dCk7CisgICAgICAgICAgICAgICAgU2VydmljZU1hbmFnZXIuYWRkU2VydmljZShDb250ZXh0LkNPVU5UUllfREVURUNUT1IsIGNvdW50cnlEZXRlY3Rvcik7CisgICAgICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgZSkgeworICAgICAgICAgICAgICAgIFNsb2cuZShUQUcsICJGYWlsdXJlIHN0YXJ0aW5nIENvdW50cnkgRGV0ZWN0b3IiLCBlKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICBTbG9nLmkoVEFHLCAiU2VhcmNoIFNlcnZpY2UiKTsKICAgICAgICAgICAgICAgICBTZXJ2aWNlTWFuYWdlci5hZGRTZXJ2aWNlKENvbnRleHQuU0VBUkNIX1NFUlZJQ0UsCiAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgU2VhcmNoTWFuYWdlclNlcnZpY2UoY29udGV4dCkpOwpAQCAtMzI3LDExICszMzYsNiBAQAogICAgICAgICAgICAgICAgIFNsb2cuZShUQUcsICJGYWlsdXJlIHN0YXJ0aW5nIFNlYXJjaCBTZXJ2aWNlIiwgZSk7CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIGlmIChJTkNMVURFX0RFTU8pIHsKLSAgICAgICAgICAgICAgICBTbG9nLmkoVEFHLCAiSW5zdGFsbGluZyBkZW1vIGRhdGEuLi4iKTsKLSAgICAgICAgICAgICAgICAobmV3IERlbW9UaHJlYWQoY29udGV4dCkpLnN0YXJ0KCk7Ci0gICAgICAgICAgICB9Ci0KICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgU2xvZy5pKFRBRywgIkRyb3BCb3ggU2VydmljZSIpOwogICAgICAgICAgICAgICAgIFNlcnZpY2VNYW5hZ2VyLmFkZFNlcnZpY2UoQ29udGV4dC5EUk9QQk9YX1NFUlZJQ0UsCkBAIC00MTgsNiArNDIyLDE4IEBACiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgLy8gbmVlZCB0byBhZGQgdGhpcyBzZXJ2aWNlIGV2ZW4gaWYgU2FtcGxpbmdQcm9maWxlckludGVncmF0aW9uLmlzRW5hYmxlZCgpCisgICAgICAgICAgICAgICAgLy8gaXMgZmFsc2UsIGJlY2F1c2UgaXQgaXMgdGhpcyBzZXJ2aWNlIHRoYXQgZGV0ZWN0cyBzeXN0ZW0gcHJvcGVydHkgY2hhbmdlIGFuZAorICAgICAgICAgICAgICAgIC8vIHR1cm5zIG9uIFNhbXBsaW5nUHJvZmlsZXJJbnRlZ3JhdGlvbi4gUGx1cywgd2hlbiBzYW1wbGluZyBwcm9maWxlciBkb2Vzbid0IHdvcmssCisgICAgICAgICAgICAgICAgLy8gdGhlcmUgaXMgbGl0dGxlIG92ZXJoZWFkIGZvciBydW5uaW5nIHRoaXMgc2VydmljZS4KKyAgICAgICAgICAgICAgICBTbG9nLmkoVEFHLCAiU2FtcGxpbmdQcm9maWxlciBTZXJ2aWNlIik7CisgICAgICAgICAgICAgICAgU2VydmljZU1hbmFnZXIuYWRkU2VydmljZSgic2FtcGxpbmdwcm9maWxlciIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFNhbXBsaW5nUHJvZmlsZXJTZXJ2aWNlKGNvbnRleHQpKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSBlKSB7CisgICAgICAgICAgICAgICAgU2xvZy5lKFRBRywgIkZhaWx1cmUgc3RhcnRpbmcgU2FtcGxpbmdQcm9maWxlciBTZXJ2aWNlIiwgZSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgU2lwU2VydmljZSBzaXBTZXJ2aWNlID0gU2lwU2VydmljZS5jcmVhdGUoY29udGV4dCk7CiAgICAgICAgICAgICAgICAgaWYgKHNpcFNlcnZpY2UgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgICBTbG9nLmkoVEFHLCAiU2lwIFNlcnZpY2UiKTsKQEAgLTQyNiw2ICs0NDIsMTMgQEAKICAgICAgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSBlKSB7CiAgICAgICAgICAgICAgICAgU2xvZy5lKFRBRywgIkZhaWx1cmUgc3RhcnRpbmcgU0lQIFNlcnZpY2UiLCBlKTsKICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBTbG9nLmkoVEFHLCAiTmV0d29ya1RpbWVVcGRhdGVTZXJ2aWNlIik7CisgICAgICAgICAgICAgICAgbmV0d29ya1RpbWVVcGRhdGVyID0gbmV3IE5ldHdvcmtUaW1lVXBkYXRlU2VydmljZShjb250ZXh0KTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSBlKSB7CisgICAgICAgICAgICAgICAgU2xvZy5lKFRBRywgIkZhaWx1cmUgc3RhcnRpbmcgTmV0d29ya1RpbWVVcGRhdGUgc2VydmljZSIpOworICAgICAgICAgICAgfQogICAgICAgICB9CiAKICAgICAgICAgLy8gbWFrZSBzdXJlIHRoZSBBREJfRU5BQkxFRCBzZXR0aW5nIHZhbHVlIG1hdGNoZXMgdGhlIHNlY3VyZSBwcm9wZXJ0eSB2YWx1ZQpAQCAtNDg2LDYgKzUwOSw4IEBACiAgICAgICAgIGZpbmFsIElucHV0TWV0aG9kTWFuYWdlclNlcnZpY2UgaW1tRiA9IGltbTsKICAgICAgICAgZmluYWwgUmVjb2duaXRpb25NYW5hZ2VyU2VydmljZSByZWNvZ25pdGlvbkYgPSByZWNvZ25pdGlvbjsKICAgICAgICAgZmluYWwgTG9jYXRpb25NYW5hZ2VyU2VydmljZSBsb2NhdGlvbkYgPSBsb2NhdGlvbjsKKyAgICAgICAgZmluYWwgQ291bnRyeURldGVjdG9yU2VydmljZSBjb3VudHJ5RGV0ZWN0b3JGID0gY291bnRyeURldGVjdG9yOworICAgICAgICBmaW5hbCBOZXR3b3JrVGltZVVwZGF0ZVNlcnZpY2UgbmV0d29ya1RpbWVVcGRhdGVyRiA9IG5ldHdvcmtUaW1lVXBkYXRlcjsKIAogICAgICAgICAvLyBXZSBub3cgdGVsbCB0aGUgYWN0aXZpdHkgbWFuYWdlciBpdCBpcyBva2F5IHRvIHJ1biB0aGlyZCBwYXJ0eQogICAgICAgICAvLyBjb2RlLiAgSXQgd2lsbCBjYWxsIGJhY2sgaW50byB1cyBvbmNlIGl0IGhhcyBnb3R0ZW4gdG8gdGhlIHN0YXRlCkBAIC01MTMsNyArNTM4LDkgQEAKICAgICAgICAgICAgICAgICBpZiAod2FsbHBhcGVyRiAhPSBudWxsKSB3YWxscGFwZXJGLnN5c3RlbVJlYWR5KCk7CiAgICAgICAgICAgICAgICAgaWYgKGltbUYgIT0gbnVsbCkgaW1tRi5zeXN0ZW1SZWFkeSgpOwogICAgICAgICAgICAgICAgIGlmIChsb2NhdGlvbkYgIT0gbnVsbCkgbG9jYXRpb25GLnN5c3RlbVJlYWR5KCk7CisgICAgICAgICAgICAgICAgaWYgKGNvdW50cnlEZXRlY3RvckYgIT0gbnVsbCkgY291bnRyeURldGVjdG9yRi5zeXN0ZW1SZWFkeSgpOwogICAgICAgICAgICAgICAgIGlmICh0aHJvdHRsZUYgIT0gbnVsbCkgdGhyb3R0bGVGLnN5c3RlbVJlYWR5KCk7CisgICAgICAgICAgICAgICAgaWYgKG5ldHdvcmtUaW1lVXBkYXRlckYgIT0gbnVsbCkgbmV0d29ya1RpbWVVcGRhdGVyRi5zeXN0ZW1SZWFkeSgpOwogICAgICAgICAgICAgfQogICAgICAgICB9KTsKIApAQCAtNTI3LDM3ICs1NTQsNyBAQAogICAgIH0KIH0KIAotY2xhc3MgRGVtb1RocmVhZCBleHRlbmRzIFRocmVhZAotewotICAgIERlbW9UaHJlYWQoQ29udGV4dCBjb250ZXh0KQotICAgIHsKLSAgICAgICAgbUNvbnRleHQgPSBjb250ZXh0OwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHJ1bigpCi0gICAgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgQ3Vyc29yIGMgPSBtQ29udGV4dC5nZXRDb250ZW50UmVzb2x2ZXIoKS5xdWVyeShQZW9wbGUuQ09OVEVOVF9VUkksIG51bGwsIG51bGwsIG51bGwsIG51bGwpOwotICAgICAgICAgICAgYm9vbGVhbiBoYXNEYXRhID0gYyAhPSBudWxsICYmIGMubW92ZVRvRmlyc3QoKTsKLSAgICAgICAgICAgIGlmIChjICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBjLmRlYWN0aXZhdGUoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICghaGFzRGF0YSkgewotICAgICAgICAgICAgICAgIERlbW9EYXRhU2V0IGRhdGFzZXQgPSBuZXcgRGVtb0RhdGFTZXQoKTsKLSAgICAgICAgICAgICAgICBkYXRhc2V0LmFkZChtQ29udGV4dCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSBlKSB7Ci0gICAgICAgICAgICBTbG9nLmUoIlN5c3RlbVNlcnZlciIsICJGYWlsdXJlIGluc3RhbGxpbmcgZGVtbyBkYXRhIiwgZSk7Ci0gICAgICAgIH0KLQotICAgIH0KLQotICAgIENvbnRleHQgbUNvbnRleHQ7Ci19Ci0KLXB1YmxpYyBjbGFzcyBTeXN0ZW1TZXJ2ZXIKLXsKK3B1YmxpYyBjbGFzcyBTeXN0ZW1TZXJ2ZXIgewogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiU3lzdGVtU2VydmVyIjsKIAogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZBQ1RPUllfVEVTVF9PRkYgPSAwOwpAQCAtNTgxLDcgKzU3OCw3IEBACiAgICAgICAgICAgICB0aW1lci5zY2hlZHVsZShuZXcgVGltZXJUYXNrKCkgewogICAgICAgICAgICAgICAgIEBPdmVycmlkZQogICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgICAgICAgICAgICAgU2FtcGxpbmdQcm9maWxlckludGVncmF0aW9uLndyaXRlU25hcHNob3QoInN5c3RlbV9zZXJ2ZXIiKTsKKyAgICAgICAgICAgICAgICAgICAgU2FtcGxpbmdQcm9maWxlckludGVncmF0aW9uLndyaXRlU25hcHNob3QoInN5c3RlbV9zZXJ2ZXIiLCBudWxsKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9LCBTTkFQU0hPVF9JTlRFUlZBTCwgU05BUFNIT1RfSU5URVJWQUwpOwogICAgICAgICB9CkBAIC01ODksNyArNTg2LDcgQEAKICAgICAgICAgLy8gVGhlIHN5c3RlbSBzZXJ2ZXIgaGFzIHRvIHJ1biBhbGwgb2YgdGhlIHRpbWUsIHNvIGl0IG5lZWRzIHRvIGJlCiAgICAgICAgIC8vIGFzIGVmZmljaWVudCBhcyBwb3NzaWJsZSB3aXRoIGl0cyBtZW1vcnkgdXNhZ2UuCiAgICAgICAgIFZNUnVudGltZS5nZXRSdW50aW1lKCkuc2V0VGFyZ2V0SGVhcFV0aWxpemF0aW9uKDAuOGYpOwotICAgICAgICAKKwogICAgICAgICBTeXN0ZW0ubG9hZExpYnJhcnkoImFuZHJvaWRfc2VydmVycyIpOwogICAgICAgICBpbml0MShhcmdzKTsKICAgICB9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9UZWxlcGhvbnlSZWdpc3RyeS5qYXZhIGIvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvVGVsZXBob255UmVnaXN0cnkuamF2YQppbmRleCA3ZTIzNDIyLi4wYTkwYTRjIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9UZWxlcGhvbnlSZWdpc3RyeS5qYXZhCisrKyBiL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL1RlbGVwaG9ueVJlZ2lzdHJ5LmphdmEKQEAgLTE5LDcgKzE5LDcgQEAKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5QYWNrYWdlTWFuYWdlcjsKLWltcG9ydCBhbmRyb2lkLm5ldC5OZXR3b3JrVXRpbHM7CitpbXBvcnQgYW5kcm9pZC5uZXQuTGlua1Byb3BlcnRpZXM7CiBpbXBvcnQgYW5kcm9pZC5vcy5CaW5kZXI7CiBpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CiBpbXBvcnQgYW5kcm9pZC5vcy5JQmluZGVyOwpAQCAtMzUsNiArMzUsNyBAQAogaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CiBpbXBvcnQgamF2YS5pby5GaWxlRGVzY3JpcHRvcjsKIGltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOworaW1wb3J0IGphdmEubmV0Lk5ldHdvcmtJbnRlcmZhY2U7CiAKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC5hcHAuSUJhdHRlcnlTdGF0czsKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuSVRlbGVwaG9ueVJlZ2lzdHJ5OwpAQCAtODksOSArOTAsOSBAQAogCiAgICAgcHJpdmF0ZSBTdHJpbmcgbURhdGFDb25uZWN0aW9uQXBuID0gIiI7CiAKLSAgICBwcml2YXRlIFN0cmluZ1tdIG1EYXRhQ29ubmVjdGlvbkFwblR5cGVzID0gbnVsbDsKKyAgICBwcml2YXRlIEFycmF5TGlzdDxTdHJpbmc+IG1Db25uZWN0ZWRBcG5zOwogCi0gICAgcHJpdmF0ZSBTdHJpbmcgbURhdGFDb25uZWN0aW9uSW50ZXJmYWNlTmFtZSA9ICIiOworICAgIHByaXZhdGUgTGlua1Byb3BlcnRpZXMgbURhdGFDb25uZWN0aW9uUHJvcGVydGllczsKIAogICAgIHByaXZhdGUgQnVuZGxlIG1DZWxsTG9jYXRpb24gPSBuZXcgQnVuZGxlKCk7CiAKQEAgLTEyMSw2ICsxMjIsNyBAQAogICAgICAgICB9CiAgICAgICAgIG1Db250ZXh0ID0gY29udGV4dDsKICAgICAgICAgbUJhdHRlcnlTdGF0cyA9IEJhdHRlcnlTdGF0c1NlcnZpY2UuZ2V0U2VydmljZSgpOworICAgICAgICBtQ29ubmVjdGVkQXBucyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwogICAgIH0KIAogICAgIHB1YmxpYyB2b2lkIGxpc3RlbihTdHJpbmcgcGtnRm9yRGVidWcsIElQaG9uZVN0YXRlTGlzdGVuZXIgY2FsbGJhY2ssIGludCBldmVudHMsCkBAIC0yMzMsMTkgKzIzNSwyMCBAQAogICAgICAgICBpZiAoIWNoZWNrTm90aWZ5UGVybWlzc2lvbigibm90aWZ5Q2FsbFN0YXRlKCkiKSkgewogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CisgICAgICAgIEFycmF5TGlzdDxJQmluZGVyPiByZW1vdmVMaXN0ID0gbmV3IEFycmF5TGlzdDxJQmluZGVyPigpOwogICAgICAgICBzeW5jaHJvbml6ZWQgKG1SZWNvcmRzKSB7CiAgICAgICAgICAgICBtQ2FsbFN0YXRlID0gc3RhdGU7CiAgICAgICAgICAgICBtQ2FsbEluY29taW5nTnVtYmVyID0gaW5jb21pbmdOdW1iZXI7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gbVJlY29yZHMuc2l6ZSgpIC0gMTsgaSA+PSAwOyBpLS0pIHsKLSAgICAgICAgICAgICAgICBSZWNvcmQgciA9IG1SZWNvcmRzLmdldChpKTsKKyAgICAgICAgICAgIGZvciAoUmVjb3JkIHIgOiBtUmVjb3JkcykgewogICAgICAgICAgICAgICAgIGlmICgoci5ldmVudHMgJiBQaG9uZVN0YXRlTGlzdGVuZXIuTElTVEVOX0NBTExfU1RBVEUpICE9IDApIHsKICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgIHIuY2FsbGJhY2sub25DYWxsU3RhdGVDaGFuZ2VkKHN0YXRlLCBpbmNvbWluZ051bWJlcik7CiAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmVtb3ZlKHIuYmluZGVyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlbW92ZUxpc3QuYWRkKHIuYmluZGVyKTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZvciAoSUJpbmRlciBiIDogcmVtb3ZlTGlzdCkgcmVtb3ZlKGIpOwogICAgICAgICB9CiAgICAgICAgIGJyb2FkY2FzdENhbGxTdGF0ZUNoYW5nZWQoc3RhdGUsIGluY29taW5nTnVtYmVyKTsKICAgICB9CkBAIC0yNTYsOCArMjU5LDcgQEAKICAgICAgICAgfQogICAgICAgICBzeW5jaHJvbml6ZWQgKG1SZWNvcmRzKSB7CiAgICAgICAgICAgICBtU2VydmljZVN0YXRlID0gc3RhdGU7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gbVJlY29yZHMuc2l6ZSgpIC0gMTsgaSA+PSAwOyBpLS0pIHsKLSAgICAgICAgICAgICAgICBSZWNvcmQgciA9IG1SZWNvcmRzLmdldChpKTsKKyAgICAgICAgICAgIGZvciAoUmVjb3JkIHIgOiBtUmVjb3JkcykgewogICAgICAgICAgICAgICAgIGlmICgoci5ldmVudHMgJiBQaG9uZVN0YXRlTGlzdGVuZXIuTElTVEVOX1NFUlZJQ0VfU1RBVEUpICE9IDApIHsKICAgICAgICAgICAgICAgICAgICAgc2VuZFNlcnZpY2VTdGF0ZShyLCBzdGF0ZSk7CiAgICAgICAgICAgICAgICAgfQpAQCAtMjcwLDEwICsyNzIsMTAgQEAKICAgICAgICAgaWYgKCFjaGVja05vdGlmeVBlcm1pc3Npb24oIm5vdGlmeVNpZ25hbFN0cmVuZ3RoKCkiKSkgewogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CisgICAgICAgIEFycmF5TGlzdDxJQmluZGVyPiByZW1vdmVMaXN0ID0gbmV3IEFycmF5TGlzdDxJQmluZGVyPigpOwogICAgICAgICBzeW5jaHJvbml6ZWQgKG1SZWNvcmRzKSB7CiAgICAgICAgICAgICBtU2lnbmFsU3RyZW5ndGggPSBzaWduYWxTdHJlbmd0aDsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSBtUmVjb3Jkcy5zaXplKCkgLSAxOyBpID49IDA7IGktLSkgewotICAgICAgICAgICAgICAgIFJlY29yZCByID0gbVJlY29yZHMuZ2V0KGkpOworICAgICAgICAgICAgZm9yIChSZWNvcmQgciA6IG1SZWNvcmRzKSB7CiAgICAgICAgICAgICAgICAgaWYgKChyLmV2ZW50cyAmIFBob25lU3RhdGVMaXN0ZW5lci5MSVNURU5fU0lHTkFMX1NUUkVOR1RIUykgIT0gMCkgewogICAgICAgICAgICAgICAgICAgICBzZW5kU2lnbmFsU3RyZW5ndGgociwgc2lnbmFsU3RyZW5ndGgpOwogICAgICAgICAgICAgICAgIH0KQEAgLTI4MywxMCArMjg1LDExIEBACiAgICAgICAgICAgICAgICAgICAgICAgICByLmNhbGxiYWNrLm9uU2lnbmFsU3RyZW5ndGhDaGFuZ2VkKChnc21TaWduYWxTdHJlbmd0aCA9PSA5OSA/IC0xCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogZ3NtU2lnbmFsU3RyZW5ndGgpKTsKICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZW1vdmUoci5iaW5kZXIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmVtb3ZlTGlzdC5hZGQoci5iaW5kZXIpOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQorICAgICAgICAgICAgZm9yIChJQmluZGVyIGIgOiByZW1vdmVMaXN0KSByZW1vdmUoYik7CiAgICAgICAgIH0KICAgICAgICAgYnJvYWRjYXN0U2lnbmFsU3RyZW5ndGhDaGFuZ2VkKHNpZ25hbFN0cmVuZ3RoKTsKICAgICB9CkBAIC0yOTUsMTggKzI5OCwxOSBAQAogICAgICAgICBpZiAoIWNoZWNrTm90aWZ5UGVybWlzc2lvbigibm90aWZ5TWVzc2FnZVdhaXRpbmdDaGFuZ2VkKCkiKSkgewogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CisgICAgICAgIEFycmF5TGlzdDxJQmluZGVyPiByZW1vdmVMaXN0ID0gbmV3IEFycmF5TGlzdDxJQmluZGVyPigpOwogICAgICAgICBzeW5jaHJvbml6ZWQgKG1SZWNvcmRzKSB7CiAgICAgICAgICAgICBtTWVzc2FnZVdhaXRpbmcgPSBtd2k7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gbVJlY29yZHMuc2l6ZSgpIC0gMTsgaSA+PSAwOyBpLS0pIHsKLSAgICAgICAgICAgICAgICBSZWNvcmQgciA9IG1SZWNvcmRzLmdldChpKTsKKyAgICAgICAgICAgIGZvciAoUmVjb3JkIHIgOiBtUmVjb3JkcykgewogICAgICAgICAgICAgICAgIGlmICgoci5ldmVudHMgJiBQaG9uZVN0YXRlTGlzdGVuZXIuTElTVEVOX01FU1NBR0VfV0FJVElOR19JTkRJQ0FUT1IpICE9IDApIHsKICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgIHIuY2FsbGJhY2sub25NZXNzYWdlV2FpdGluZ0luZGljYXRvckNoYW5nZWQobXdpKTsKICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZW1vdmUoci5iaW5kZXIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmVtb3ZlTGlzdC5hZGQoci5iaW5kZXIpOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQorICAgICAgICAgICAgZm9yIChJQmluZGVyIGIgOiByZW1vdmVMaXN0KSByZW1vdmUoYik7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTMxNCwxOCArMzE4LDE5IEBACiAgICAgICAgIGlmICghY2hlY2tOb3RpZnlQZXJtaXNzaW9uKCJub3RpZnlDYWxsRm9yd2FyZGluZ0NoYW5nZWQoKSIpKSB7CiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KKyAgICAgICAgQXJyYXlMaXN0PElCaW5kZXI+IHJlbW92ZUxpc3QgPSBuZXcgQXJyYXlMaXN0PElCaW5kZXI+KCk7CiAgICAgICAgIHN5bmNocm9uaXplZCAobVJlY29yZHMpIHsKICAgICAgICAgICAgIG1DYWxsRm9yd2FyZGluZyA9IGNmaTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSBtUmVjb3Jkcy5zaXplKCkgLSAxOyBpID49IDA7IGktLSkgewotICAgICAgICAgICAgICAgIFJlY29yZCByID0gbVJlY29yZHMuZ2V0KGkpOworICAgICAgICAgICAgZm9yIChSZWNvcmQgciA6IG1SZWNvcmRzKSB7CiAgICAgICAgICAgICAgICAgaWYgKChyLmV2ZW50cyAmIFBob25lU3RhdGVMaXN0ZW5lci5MSVNURU5fQ0FMTF9GT1JXQVJESU5HX0lORElDQVRPUikgIT0gMCkgewogICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgci5jYWxsYmFjay5vbkNhbGxGb3J3YXJkaW5nSW5kaWNhdG9yQ2hhbmdlZChjZmkpOwogICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlbW92ZShyLmJpbmRlcik7CisgICAgICAgICAgICAgICAgICAgICAgICByZW1vdmVMaXN0LmFkZChyLmJpbmRlcik7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CisgICAgICAgICAgICBmb3IgKElCaW5kZXIgYiA6IHJlbW92ZUxpc3QpIHJlbW92ZShiKTsKICAgICAgICAgfQogICAgIH0KIApAQCAtMzMzLDU3ICszMzgsODEgQEAKICAgICAgICAgaWYgKCFjaGVja05vdGlmeVBlcm1pc3Npb24oIm5vdGlmeURhdGFBY3Rpdml0eSgpIiApKSB7CiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KKyAgICAgICAgQXJyYXlMaXN0PElCaW5kZXI+IHJlbW92ZUxpc3QgPSBuZXcgQXJyYXlMaXN0PElCaW5kZXI+KCk7CiAgICAgICAgIHN5bmNocm9uaXplZCAobVJlY29yZHMpIHsKICAgICAgICAgICAgIG1EYXRhQWN0aXZpdHkgPSBzdGF0ZTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSBtUmVjb3Jkcy5zaXplKCkgLSAxOyBpID49IDA7IGktLSkgewotICAgICAgICAgICAgICAgIFJlY29yZCByID0gbVJlY29yZHMuZ2V0KGkpOworICAgICAgICAgICAgZm9yIChSZWNvcmQgciA6IG1SZWNvcmRzKSB7CiAgICAgICAgICAgICAgICAgaWYgKChyLmV2ZW50cyAmIFBob25lU3RhdGVMaXN0ZW5lci5MSVNURU5fREFUQV9BQ1RJVklUWSkgIT0gMCkgewogICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgci5jYWxsYmFjay5vbkRhdGFBY3Rpdml0eShzdGF0ZSk7CiAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmVtb3ZlKHIuYmluZGVyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlbW92ZUxpc3QuYWRkKHIuYmluZGVyKTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZvciAoSUJpbmRlciBiIDogcmVtb3ZlTGlzdCkgcmVtb3ZlKGIpOwogICAgICAgICB9CiAgICAgfQogCiAgICAgcHVibGljIHZvaWQgbm90aWZ5RGF0YUNvbm5lY3Rpb24oaW50IHN0YXRlLCBib29sZWFuIGlzRGF0YUNvbm5lY3Rpdml0eVBvc3NpYmxlLAotICAgICAgICAgICAgU3RyaW5nIHJlYXNvbiwgU3RyaW5nIGFwbiwgU3RyaW5nW10gYXBuVHlwZXMsIFN0cmluZyBpbnRlcmZhY2VOYW1lLCBpbnQgbmV0d29ya1R5cGUsCi0gICAgICAgICAgICBTdHJpbmcgZ2F0ZXdheSkgeworICAgICAgICAgICAgU3RyaW5nIHJlYXNvbiwgU3RyaW5nIGFwbiwgU3RyaW5nIGFwblR5cGUsIExpbmtQcm9wZXJ0aWVzIGxpbmtQcm9wZXJ0aWVzLAorICAgICAgICAgICAgaW50IG5ldHdvcmtUeXBlKSB7CiAgICAgICAgIGlmICghY2hlY2tOb3RpZnlQZXJtaXNzaW9uKCJub3RpZnlEYXRhQ29ubmVjdGlvbigpIiApKSB7CiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KICAgICAgICAgc3luY2hyb25pemVkIChtUmVjb3JkcykgewotICAgICAgICAgICAgbURhdGFDb25uZWN0aW9uU3RhdGUgPSBzdGF0ZTsKKyAgICAgICAgICAgIGJvb2xlYW4gbW9kaWZpZWQgPSBmYWxzZTsKKyAgICAgICAgICAgIGlmIChzdGF0ZSA9PSBUZWxlcGhvbnlNYW5hZ2VyLkRBVEFfQ09OTkVDVEVEKSB7CisgICAgICAgICAgICAgICAgaWYgKCFtQ29ubmVjdGVkQXBucy5jb250YWlucyhhcG5UeXBlKSkgeworICAgICAgICAgICAgICAgICAgICBtQ29ubmVjdGVkQXBucy5hZGQoYXBuVHlwZSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChtRGF0YUNvbm5lY3Rpb25TdGF0ZSAhPSBzdGF0ZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgbURhdGFDb25uZWN0aW9uU3RhdGUgPSBzdGF0ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1vZGlmaWVkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbUNvbm5lY3RlZEFwbnMucmVtb3ZlKGFwblR5cGUpOworICAgICAgICAgICAgICAgIGlmIChtQ29ubmVjdGVkQXBucy5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgbURhdGFDb25uZWN0aW9uU3RhdGUgPSBzdGF0ZTsKKyAgICAgICAgICAgICAgICAgICAgbW9kaWZpZWQgPSB0cnVlOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIC8vIGxlYXZlIG1EYXRhQ29ubmVjdGlvblN0YXRlIGFzIGlzIGFuZAorICAgICAgICAgICAgICAgICAgICAvLyBzZW5kIG91dCB0aGUgbmV3IHN0YXR1cyBmb3IgdGhlIEFQTiBpbiBxdWVzdGlvbi4KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CiAgICAgICAgICAgICBtRGF0YUNvbm5lY3Rpb25Qb3NzaWJsZSA9IGlzRGF0YUNvbm5lY3Rpdml0eVBvc3NpYmxlOwogICAgICAgICAgICAgbURhdGFDb25uZWN0aW9uUmVhc29uID0gcmVhc29uOwogICAgICAgICAgICAgbURhdGFDb25uZWN0aW9uQXBuID0gYXBuOwotICAgICAgICAgICAgbURhdGFDb25uZWN0aW9uQXBuVHlwZXMgPSBhcG5UeXBlczsKLSAgICAgICAgICAgIG1EYXRhQ29ubmVjdGlvbkludGVyZmFjZU5hbWUgPSBpbnRlcmZhY2VOYW1lOwotICAgICAgICAgICAgbURhdGFDb25uZWN0aW9uTmV0d29ya1R5cGUgPSBuZXR3b3JrVHlwZTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSBtUmVjb3Jkcy5zaXplKCkgLSAxOyBpID49IDA7IGktLSkgewotICAgICAgICAgICAgICAgIFJlY29yZCByID0gbVJlY29yZHMuZ2V0KGkpOwotICAgICAgICAgICAgICAgIGlmICgoci5ldmVudHMgJiBQaG9uZVN0YXRlTGlzdGVuZXIuTElTVEVOX0RBVEFfQ09OTkVDVElPTl9TVEFURSkgIT0gMCkgewotICAgICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAgICAgci5jYWxsYmFjay5vbkRhdGFDb25uZWN0aW9uU3RhdGVDaGFuZ2VkKHN0YXRlLCBuZXR3b3JrVHlwZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmVtb3ZlKHIuYmluZGVyKTsKKyAgICAgICAgICAgIG1EYXRhQ29ubmVjdGlvblByb3BlcnRpZXMgPSBsaW5rUHJvcGVydGllczsKKyAgICAgICAgICAgIGlmIChtRGF0YUNvbm5lY3Rpb25OZXR3b3JrVHlwZSAhPSBuZXR3b3JrVHlwZSkgeworICAgICAgICAgICAgICAgIG1EYXRhQ29ubmVjdGlvbk5ldHdvcmtUeXBlID0gbmV0d29ya1R5cGU7CisgICAgICAgICAgICAgICAgbW9kaWZpZWQgPSB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG1vZGlmaWVkKSB7CisgICAgICAgICAgICAgICAgQXJyYXlMaXN0PElCaW5kZXI+IHJlbW92ZUxpc3QgPSBuZXcgQXJyYXlMaXN0PElCaW5kZXI+KCk7CisgICAgICAgICAgICAgICAgZm9yIChSZWNvcmQgciA6IG1SZWNvcmRzKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICgoci5ldmVudHMgJiBQaG9uZVN0YXRlTGlzdGVuZXIuTElTVEVOX0RBVEFfQ09OTkVDVElPTl9TVEFURSkgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByLmNhbGxiYWNrLm9uRGF0YUNvbm5lY3Rpb25TdGF0ZUNoYW5nZWQoc3RhdGUsIG5ldHdvcmtUeXBlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbW92ZUxpc3QuYWRkKHIuYmluZGVyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBmb3IgKElCaW5kZXIgYiA6IHJlbW92ZUxpc3QpIHJlbW92ZShiKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICBicm9hZGNhc3REYXRhQ29ubmVjdGlvblN0YXRlQ2hhbmdlZChzdGF0ZSwgaXNEYXRhQ29ubmVjdGl2aXR5UG9zc2libGUsIHJlYXNvbiwgYXBuLAotICAgICAgICAgICAgICAgIGFwblR5cGVzLCBpbnRlcmZhY2VOYW1lLCBnYXRld2F5KTsKKyAgICAgICAgICAgICAgICBhcG5UeXBlLCBsaW5rUHJvcGVydGllcyk7CiAgICAgfQogCi0gICAgcHVibGljIHZvaWQgbm90aWZ5RGF0YUNvbm5lY3Rpb25GYWlsZWQoU3RyaW5nIHJlYXNvbikgeworICAgIHB1YmxpYyB2b2lkIG5vdGlmeURhdGFDb25uZWN0aW9uRmFpbGVkKFN0cmluZyByZWFzb24sIFN0cmluZyBhcG5UeXBlKSB7CiAgICAgICAgIGlmICghY2hlY2tOb3RpZnlQZXJtaXNzaW9uKCJub3RpZnlEYXRhQ29ubmVjdGlvbkZhaWxlZCgpIikpIHsKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQogICAgICAgICAvKgotICAgICAgICAgKiBUaGlzIGlzIGNvbW1lbnRlZCBvdXQgYmVjYXVzZSB0aGVyZSBpcyBvbiBvbkRhdGFDb25uZWN0aW9uRmFpbGVkIGNhbGxiYWNrCi0gICAgICAgICAqIG9uIFBob25lU3RhdGVMaXN0ZW5lci4gVGhlcmUgc2hvdWxkIGJlCisgICAgICAgICAqIFRoaXMgaXMgY29tbWVudGVkIG91dCBiZWNhdXNlIHRoZXJlIGlzIG5vIG9uRGF0YUNvbm5lY3Rpb25GYWlsZWQgY2FsbGJhY2sKKyAgICAgICAgICogaW4gUGhvbmVTdGF0ZUxpc3RlbmVyLiBUaGVyZSBzaG91bGQgYmUuCiAgICAgICAgIHN5bmNocm9uaXplZCAobVJlY29yZHMpIHsKICAgICAgICAgICAgIG1EYXRhQ29ubmVjdGlvbkZhaWxlZFJlYXNvbiA9IHJlYXNvbjsKICAgICAgICAgICAgIGZpbmFsIGludCBOID0gbVJlY29yZHMuc2l6ZSgpOwpAQCAtMzk1LDcgKzQyNCw3IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgKi8KLSAgICAgICAgYnJvYWRjYXN0RGF0YUNvbm5lY3Rpb25GYWlsZWQocmVhc29uKTsKKyAgICAgICAgYnJvYWRjYXN0RGF0YUNvbm5lY3Rpb25GYWlsZWQocmVhc29uLCBhcG5UeXBlKTsKICAgICB9CiAKICAgICBwdWJsaWMgdm9pZCBub3RpZnlDZWxsTG9jYXRpb24oQnVuZGxlIGNlbGxMb2NhdGlvbikgewpAQCAtNDA0LDggKzQzMyw3IEBACiAgICAgICAgIH0KICAgICAgICAgc3luY2hyb25pemVkIChtUmVjb3JkcykgewogICAgICAgICAgICAgbUNlbGxMb2NhdGlvbiA9IGNlbGxMb2NhdGlvbjsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSBtUmVjb3Jkcy5zaXplKCkgLSAxOyBpID49IDA7IGktLSkgewotICAgICAgICAgICAgICAgIFJlY29yZCByID0gbVJlY29yZHMuZ2V0KGkpOworICAgICAgICAgICAgZm9yIChSZWNvcmQgciA6IG1SZWNvcmRzKSB7CiAgICAgICAgICAgICAgICAgaWYgKChyLmV2ZW50cyAmIFBob25lU3RhdGVMaXN0ZW5lci5MSVNURU5fQ0VMTF9MT0NBVElPTikgIT0gMCkgewogICAgICAgICAgICAgICAgICAgICBzZW5kQ2VsbExvY2F0aW9uKHIsIGNlbGxMb2NhdGlvbik7CiAgICAgICAgICAgICAgICAgfQpAQCAtNDE2LDcgKzQ0NCw3IEBACiAgICAgLyoqCiAgICAgICogQ29weSB0aGUgc2VydmljZSBzdGF0ZSBvYmplY3Qgc28gdGhleSBjYW4ndCBtZXNzIGl0IHVwIGluIHRoZSBsb2NhbCBjYWxscwogICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNlbmRTZXJ2aWNlU3RhdGUoUmVjb3JkIHIsIFNlcnZpY2VTdGF0ZSBzdGF0ZSkgeworICAgIHByaXZhdGUgdm9pZCBzZW5kU2VydmljZVN0YXRlKFJlY29yZCByLCBTZXJ2aWNlU3RhdGUgc3RhdGUpIHsKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIHIuY2FsbGJhY2sub25TZXJ2aWNlU3RhdGVDaGFuZ2VkKG5ldyBTZXJ2aWNlU3RhdGUoc3RhdGUpKTsKICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGV4KSB7CkBAIC00NjIsMTEgKzQ5MCwxMCBAQAogICAgICAgICAgICAgcHcucHJpbnRsbigiICBtRGF0YUNvbm5lY3Rpb25Qb3NzaWJsZT0iICsgbURhdGFDb25uZWN0aW9uUG9zc2libGUpOwogICAgICAgICAgICAgcHcucHJpbnRsbigiICBtRGF0YUNvbm5lY3Rpb25SZWFzb249IiArIG1EYXRhQ29ubmVjdGlvblJlYXNvbik7CiAgICAgICAgICAgICBwdy5wcmludGxuKCIgIG1EYXRhQ29ubmVjdGlvbkFwbj0iICsgbURhdGFDb25uZWN0aW9uQXBuKTsKLSAgICAgICAgICAgIHB3LnByaW50bG4oIiAgbURhdGFDb25uZWN0aW9uSW50ZXJmYWNlTmFtZT0iICsgbURhdGFDb25uZWN0aW9uSW50ZXJmYWNlTmFtZSk7CisgICAgICAgICAgICBwdy5wcmludGxuKCIgIG1EYXRhQ29ubmVjdGlvblByb3BlcnRpZXM9IiArIG1EYXRhQ29ubmVjdGlvblByb3BlcnRpZXMpOwogICAgICAgICAgICAgcHcucHJpbnRsbigiICBtQ2VsbExvY2F0aW9uPSIgKyBtQ2VsbExvY2F0aW9uKTsKICAgICAgICAgICAgIHB3LnByaW50bG4oInJlZ2lzdHJhdGlvbnM6IGNvdW50PSIgKyByZWNvcmRDb3VudCk7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHJlY29yZENvdW50OyBpKyspIHsKLSAgICAgICAgICAgICAgICBSZWNvcmQgciA9IG1SZWNvcmRzLmdldChpKTsKKyAgICAgICAgICAgIGZvciAoUmVjb3JkIHIgOiBtUmVjb3JkcykgewogICAgICAgICAgICAgICAgIHB3LnByaW50bG4oIiAgIiArIHIucGtnRm9yRGVidWcgKyAiIDB4IiArIEludGVnZXIudG9IZXhTdHJpbmcoci5ldmVudHMpKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQpAQCAtNTM3LDcgKzU2NCw3IEBACiAKICAgICBwcml2YXRlIHZvaWQgYnJvYWRjYXN0RGF0YUNvbm5lY3Rpb25TdGF0ZUNoYW5nZWQoaW50IHN0YXRlLAogICAgICAgICAgICAgYm9vbGVhbiBpc0RhdGFDb25uZWN0aXZpdHlQb3NzaWJsZSwKLSAgICAgICAgICAgIFN0cmluZyByZWFzb24sIFN0cmluZyBhcG4sIFN0cmluZ1tdIGFwblR5cGVzLCBTdHJpbmcgaW50ZXJmYWNlTmFtZSwgU3RyaW5nIGdhdGV3YXkpIHsKKyAgICAgICAgICAgIFN0cmluZyByZWFzb24sIFN0cmluZyBhcG4sIFN0cmluZyBhcG5UeXBlLCBMaW5rUHJvcGVydGllcyBsaW5rUHJvcGVydGllcykgewogICAgICAgICAvLyBOb3RlOiBub3QgcmVwb3J0aW5nIHRvIHRoZSBiYXR0ZXJ5IHN0YXRzIHNlcnZpY2UgaGVyZSwgYmVjYXVzZSB0aGUKICAgICAgICAgLy8gc3RhdHVzIGJhciB0YWtlcyBjYXJlIG9mIHRoYXQgYWZ0ZXIgdGFraW5nIGludG8gYWNjb3VudCBhbGwgb2YgdGhlCiAgICAgICAgIC8vIHJlcXVpcmVkIGluZm8uCkBAIC01NTAsMjkgKzU3NywyMyBAQAogICAgICAgICBpZiAocmVhc29uICE9IG51bGwpIHsKICAgICAgICAgICAgIGludGVudC5wdXRFeHRyYShQaG9uZS5TVEFURV9DSEFOR0VfUkVBU09OX0tFWSwgcmVhc29uKTsKICAgICAgICAgfQotICAgICAgICBpbnRlbnQucHV0RXh0cmEoUGhvbmUuREFUQV9BUE5fS0VZLCBhcG4pOwotICAgICAgICBTdHJpbmcgdHlwZXMgPSBuZXcgU3RyaW5nKCIiKTsKLSAgICAgICAgaWYgKGFwblR5cGVzLmxlbmd0aCA+IDApIHsKLSAgICAgICAgICAgIHR5cGVzID0gYXBuVHlwZXNbMF07Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMTsgaSA8IGFwblR5cGVzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgdHlwZXMgPSB0eXBlcysiLCIrYXBuVHlwZXNbaV07CisgICAgICAgIGlmIChsaW5rUHJvcGVydGllcyAhPSBudWxsKSB7CisgICAgICAgICAgICBpbnRlbnQucHV0RXh0cmEoUGhvbmUuREFUQV9MSU5LX1BST1BFUlRJRVNfS0VZLCBsaW5rUHJvcGVydGllcyk7CisgICAgICAgICAgICBOZXR3b3JrSW50ZXJmYWNlIGlmYWNlID0gbGlua1Byb3BlcnRpZXMuZ2V0SW50ZXJmYWNlKCk7CisgICAgICAgICAgICBpZiAoaWZhY2UgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGludGVudC5wdXRFeHRyYShQaG9uZS5EQVRBX0lGQUNFX05BTUVfS0VZLCBpZmFjZS5nZXROYW1lKCkpOwogICAgICAgICAgICAgfQogICAgICAgICB9Ci0gICAgICAgIGludGVudC5wdXRFeHRyYShQaG9uZS5EQVRBX0FQTl9UWVBFU19LRVksIHR5cGVzKTsKLSAgICAgICAgaW50ZW50LnB1dEV4dHJhKFBob25lLkRBVEFfSUZBQ0VfTkFNRV9LRVksIGludGVyZmFjZU5hbWUpOwotICAgICAgICBpbnQgZ2F0ZXdheUFkZHIgPSAwOwotICAgICAgICBpZiAoZ2F0ZXdheSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBnYXRld2F5QWRkciA9IE5ldHdvcmtVdGlscy52NFN0cmluZ1RvSW50KGdhdGV3YXkpOwotICAgICAgICB9Ci0gICAgICAgIGludGVudC5wdXRFeHRyYShQaG9uZS5EQVRBX0dBVEVXQVlfS0VZLCBnYXRld2F5QWRkcik7Ci0KKyAgICAgICAgaW50ZW50LnB1dEV4dHJhKFBob25lLkRBVEFfQVBOX0tFWSwgYXBuKTsKKyAgICAgICAgaW50ZW50LnB1dEV4dHJhKFBob25lLkRBVEFfQVBOX1RZUEVfS0VZLCBhcG5UeXBlKTsKICAgICAgICAgbUNvbnRleHQuc2VuZFN0aWNreUJyb2FkY2FzdChpbnRlbnQpOwogICAgIH0KIAotICAgIHByaXZhdGUgdm9pZCBicm9hZGNhc3REYXRhQ29ubmVjdGlvbkZhaWxlZChTdHJpbmcgcmVhc29uKSB7CisgICAgcHJpdmF0ZSB2b2lkIGJyb2FkY2FzdERhdGFDb25uZWN0aW9uRmFpbGVkKFN0cmluZyByZWFzb24sIFN0cmluZyBhcG5UeXBlKSB7CiAgICAgICAgIEludGVudCBpbnRlbnQgPSBuZXcgSW50ZW50KFRlbGVwaG9ueUludGVudHMuQUNUSU9OX0RBVEFfQ09OTkVDVElPTl9GQUlMRUQpOwogICAgICAgICBpbnRlbnQuYWRkRmxhZ3MoSW50ZW50LkZMQUdfUkVDRUlWRVJfUkVQTEFDRV9QRU5ESU5HKTsKICAgICAgICAgaW50ZW50LnB1dEV4dHJhKFBob25lLkZBSUxVUkVfUkVBU09OX0tFWSwgcmVhc29uKTsKKyAgICAgICAgaW50ZW50LnB1dEV4dHJhKFBob25lLkRBVEFfQVBOX1RZUEVfS0VZLCBhcG5UeXBlKTsKICAgICAgICAgbUNvbnRleHQuc2VuZFN0aWNreUJyb2FkY2FzdChpbnRlbnQpOwogICAgIH0KIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvVGhyb3R0bGVTZXJ2aWNlLmphdmEgYi9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9UaHJvdHRsZVNlcnZpY2UuamF2YQppbmRleCBhOTNhNmVlLi5kODQxY2IzIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9UaHJvdHRsZVNlcnZpY2UuamF2YQorKysgYi9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9UaHJvdHRsZVNlcnZpY2UuamF2YQpAQCAtNjAsNiArNjAsOCBAQAogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CiBpbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKIGltcG9ydCBqYXZhLnV0aWwuQ2FsZW5kYXI7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuYXRvbWljLkF0b21pY0ludGVnZXI7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuYXRvbWljLkF0b21pY0xvbmc7CiBpbXBvcnQgamF2YS51dGlsLkdyZWdvcmlhbkNhbGVuZGFyOwogaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0aWVzOwogaW1wb3J0IGphdmEudXRpbC5SYW5kb207CkBAIC04Myw4ICs4NSw4IEBACiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBURVNUSU5HX1RIUkVTSE9MRCA9IDEgKiAxMDI0ICogMTAyNDsKIAogICAgIHByaXZhdGUgaW50IG1Qb2xpY3lQb2xsUGVyaW9kU2VjOwotICAgIHByaXZhdGUgbG9uZyBtUG9saWN5VGhyZXNob2xkOwotICAgIHByaXZhdGUgaW50IG1Qb2xpY3lUaHJvdHRsZVZhbHVlOworICAgIHByaXZhdGUgQXRvbWljTG9uZyBtUG9saWN5VGhyZXNob2xkOworICAgIHByaXZhdGUgQXRvbWljSW50ZWdlciBtUG9saWN5VGhyb3R0bGVWYWx1ZTsKICAgICBwcml2YXRlIGludCBtUG9saWN5UmVzZXREYXk7IC8vIDEtMjgKICAgICBwcml2YXRlIGludCBtUG9saWN5Tm90aWZpY2F0aW9uc0FsbG93ZWRNYXNrOwogCkBAIC0xMTQsNyArMTE2LDcgQEAKICAgICBwcml2YXRlIEludGVyZmFjZU9ic2VydmVyIG1JbnRlcmZhY2VPYnNlcnZlcjsKICAgICBwcml2YXRlIFNldHRpbmdzT2JzZXJ2ZXIgbVNldHRpbmdzT2JzZXJ2ZXI7CiAKLSAgICBwcml2YXRlIGludCBtVGhyb3R0bGVJbmRleDsgLy8gMCBmb3Igbm9uZSwgMSBmb3IgZmlyc3QgdGhyb3R0bGUgdmFsLCAyIGZvciBuZXh0LCBldGMKKyAgICBwcml2YXRlIEF0b21pY0ludGVnZXIgbVRocm90dGxlSW5kZXg7IC8vIDAgZm9yIG5vbmUsIDEgZm9yIGZpcnN0IHRocm90dGxlIHZhbCwgMiBmb3IgbmV4dCwgZXRjCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFRIUk9UVExFX0lOREVYX1VOSU5JVElBTElaRUQgPSAtMTsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgVEhST1RUTEVfSU5ERVhfVU5USFJPVFRMRUQgICA9ICAwOwogCkBAIC0xMjYsNiArMTI4LDEwIEBACiAgICAgICAgIGlmIChWREJHKSBTbG9nLnYoVEFHLCAiU3RhcnRpbmcgVGhyb3R0bGVTZXJ2aWNlIik7CiAgICAgICAgIG1Db250ZXh0ID0gY29udGV4dDsKIAorICAgICAgICBtUG9saWN5VGhyZXNob2xkID0gbmV3IEF0b21pY0xvbmcoKTsKKyAgICAgICAgbVBvbGljeVRocm90dGxlVmFsdWUgPSBuZXcgQXRvbWljSW50ZWdlcigpOworICAgICAgICBtVGhyb3R0bGVJbmRleCA9IG5ldyBBdG9taWNJbnRlZ2VyKCk7CisKICAgICAgICAgbU50cEFjdGl2ZSA9IGZhbHNlOwogCiAgICAgICAgIG1JZmFjZSA9IG1Db250ZXh0LmdldFJlc291cmNlcygpLmdldFN0cmluZyhSLnN0cmluZy5jb25maWdfZGF0YXVzZV9pZmFjZSk7CkBAIC0yMTQsNyArMjIwLDcgQEAKICAgICB9CiAKICAgICBwcml2YXRlIGxvbmcgbnRwVG9XYWxsVGltZShsb25nIG50cFRpbWUpIHsKLSAgICAgICAgbG9uZyBiZXN0Tm93ID0gZ2V0QmVzdFRpbWUoKTsKKyAgICAgICAgbG9uZyBiZXN0Tm93ID0gZ2V0QmVzdFRpbWUodHJ1ZSk7IC8vIGRvIGl0IHF1aWNrbHkKICAgICAgICAgbG9uZyBsb2NhbE5vdyA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwogICAgICAgICByZXR1cm4gbG9jYWxOb3cgKyAobnRwVGltZSAtIGJlc3ROb3cpOwogICAgIH0KQEAgLTIyMiw0MCArMjI4LDQyIEBACiAgICAgLy8gVE9ETyAtIGZldGNoIGZvciB0aGUgaWZhY2UKICAgICAvLyByZXR1cm4gdGltZSBpbiB0aGUgbG9jYWwsIHN5c3RlbSB3YWxsIHRpbWUsIGNvcnJlY3RpbmcgZm9yIHRoZSB1c2Ugb2YgbnRwCiAKLSAgICBwdWJsaWMgc3luY2hyb25pemVkIGxvbmcgZ2V0UmVzZXRUaW1lKFN0cmluZyBpZmFjZSkgeworICAgIHB1YmxpYyBsb25nIGdldFJlc2V0VGltZShTdHJpbmcgaWZhY2UpIHsKICAgICAgICAgZW5mb3JjZUFjY2Vzc1Blcm1pc3Npb24oKTsKICAgICAgICAgbG9uZyByZXNldFRpbWUgPSAwOwogICAgICAgICBpZiAobVJlY29yZGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJlc2V0VGltZSA9IG50cFRvV2FsbFRpbWUobVJlY29yZGVyLmdldFBlcmlvZEVuZCgpKTsKKyAgICAgICAgICAgIHJlc2V0VGltZSA9IG1SZWNvcmRlci5nZXRQZXJpb2RFbmQoKTsKICAgICAgICAgfQorICAgICAgICByZXNldFRpbWUgPSBudHBUb1dhbGxUaW1lKHJlc2V0VGltZSk7CiAgICAgICAgIHJldHVybiByZXNldFRpbWU7CiAgICAgfQogCiAgICAgLy8gVE9ETyAtIGZldGNoIGZvciB0aGUgaWZhY2UKICAgICAvLyByZXR1cm4gdGltZSBpbiB0aGUgbG9jYWwsIHN5c3RlbSB3YWxsIHRpbWUsIGNvcnJlY3RpbmcgZm9yIHRoZSB1c2Ugb2YgbnRwCi0gICAgcHVibGljIHN5bmNocm9uaXplZCBsb25nIGdldFBlcmlvZFN0YXJ0VGltZShTdHJpbmcgaWZhY2UpIHsKLSAgICAgICAgZW5mb3JjZUFjY2Vzc1Blcm1pc3Npb24oKTsKKyAgICBwdWJsaWMgbG9uZyBnZXRQZXJpb2RTdGFydFRpbWUoU3RyaW5nIGlmYWNlKSB7CiAgICAgICAgIGxvbmcgc3RhcnRUaW1lID0gMDsKKyAgICAgICAgZW5mb3JjZUFjY2Vzc1Blcm1pc3Npb24oKTsKICAgICAgICAgaWYgKG1SZWNvcmRlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBzdGFydFRpbWUgPSBudHBUb1dhbGxUaW1lKG1SZWNvcmRlci5nZXRQZXJpb2RTdGFydCgpKTsKKyAgICAgICAgICAgIHN0YXJ0VGltZSA9IG1SZWNvcmRlci5nZXRQZXJpb2RTdGFydCgpOwogICAgICAgICB9CisgICAgICAgIHN0YXJ0VGltZSA9IG50cFRvV2FsbFRpbWUoc3RhcnRUaW1lKTsKICAgICAgICAgcmV0dXJuIHN0YXJ0VGltZTsKICAgICB9CiAgICAgLy9UT0RPIC0gYSBiZXR0ZXIgbmFtZT8gIGdldENsaWZmQnl0ZUNvdW50VGhyZXNob2xkPwogICAgIC8vIFRPRE8gLSBmZXRjaCBmb3IgdGhlIGlmYWNlCi0gICAgcHVibGljIHN5bmNocm9uaXplZCBsb25nIGdldENsaWZmVGhyZXNob2xkKFN0cmluZyBpZmFjZSwgaW50IGNsaWZmKSB7CisgICAgcHVibGljIGxvbmcgZ2V0Q2xpZmZUaHJlc2hvbGQoU3RyaW5nIGlmYWNlLCBpbnQgY2xpZmYpIHsKICAgICAgICAgZW5mb3JjZUFjY2Vzc1Blcm1pc3Npb24oKTsKICAgICAgICAgaWYgKGNsaWZmID09IDEpIHsKLSAgICAgICAgICAgIHJldHVybiBtUG9saWN5VGhyZXNob2xkOworICAgICAgICAgICByZXR1cm4gbVBvbGljeVRocmVzaG9sZC5nZXQoKTsKICAgICAgICAgfQogICAgICAgICByZXR1cm4gMDsKICAgICB9CiAgICAgLy8gVE9ETyAtIGEgYmV0dGVyIG5hbWU/IGdldFRocm90dGxlUmF0ZT8KICAgICAvLyBUT0RPIC0gZmV0Y2ggZm9yIHRoZSBpZmFjZQotICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgaW50IGdldENsaWZmTGV2ZWwoU3RyaW5nIGlmYWNlLCBpbnQgY2xpZmYpIHsKKyAgICBwdWJsaWMgaW50IGdldENsaWZmTGV2ZWwoU3RyaW5nIGlmYWNlLCBpbnQgY2xpZmYpIHsKICAgICAgICAgZW5mb3JjZUFjY2Vzc1Blcm1pc3Npb24oKTsKICAgICAgICAgaWYgKGNsaWZmID09IDEpIHsKLSAgICAgICAgICAgIHJldHVybiBtUG9saWN5VGhyb3R0bGVWYWx1ZTsKKyAgICAgICAgICAgIHJldHVybiBtUG9saWN5VGhyb3R0bGVWYWx1ZS5nZXQoKTsKICAgICAgICAgfQogICAgICAgICByZXR1cm4gMDsKICAgICB9CkBAIC0yNjcsMTAgKzI3NSw5IEBACiAgICAgfQogCiAgICAgLy8gVE9ETyAtIGZldGNoIGZvciB0aGUgaWZhY2UKLSAgICBwdWJsaWMgc3luY2hyb25pemVkIGxvbmcgZ2V0Qnl0ZUNvdW50KFN0cmluZyBpZmFjZSwgaW50IGRpciwgaW50IHBlcmlvZCwgaW50IGFnbykgeworICAgIHB1YmxpYyBsb25nIGdldEJ5dGVDb3VudChTdHJpbmcgaWZhY2UsIGludCBkaXIsIGludCBwZXJpb2QsIGludCBhZ28pIHsKICAgICAgICAgZW5mb3JjZUFjY2Vzc1Blcm1pc3Npb24oKTsKLSAgICAgICAgaWYgKChwZXJpb2QgPT0gVGhyb3R0bGVNYW5hZ2VyLlBFUklPRF9DWUNMRSkgJiYKLSAgICAgICAgICAgICAgICAobVJlY29yZGVyICE9IG51bGwpKSB7CisgICAgICAgIGlmICgocGVyaW9kID09IFRocm90dGxlTWFuYWdlci5QRVJJT0RfQ1lDTEUpICYmIChtUmVjb3JkZXIgIT0gbnVsbCkpIHsKICAgICAgICAgICAgIGlmIChkaXIgPT0gVGhyb3R0bGVNYW5hZ2VyLkRJUkVDVElPTl9UWCkgcmV0dXJuIG1SZWNvcmRlci5nZXRQZXJpb2RUeChhZ28pOwogICAgICAgICAgICAgaWYgKGRpciA9PSBUaHJvdHRsZU1hbmFnZXIuRElSRUNUSU9OX1JYKSByZXR1cm4gbVJlY29yZGVyLmdldFBlcmlvZFJ4KGFnbyk7CiAgICAgICAgIH0KQEAgLTI3OSwxMCArMjg2LDEwIEBACiAKICAgICAvLyBUT0RPIC0gYSBiZXR0ZXIgbmFtZSAtIGdldEN1cnJlbnRUaHJvdHRsZVJhdGU/CiAgICAgLy8gVE9ETyAtIGZldGNoIGZvciB0aGUgaWZhY2UKLSAgICBwdWJsaWMgc3luY2hyb25pemVkIGludCBnZXRUaHJvdHRsZShTdHJpbmcgaWZhY2UpIHsKKyAgICBwdWJsaWMgaW50IGdldFRocm90dGxlKFN0cmluZyBpZmFjZSkgewogICAgICAgICBlbmZvcmNlQWNjZXNzUGVybWlzc2lvbigpOwotICAgICAgICBpZiAobVRocm90dGxlSW5kZXggPT0gMSkgewotICAgICAgICAgICAgcmV0dXJuIG1Qb2xpY3lUaHJvdHRsZVZhbHVlOworICAgICAgICBpZiAobVRocm90dGxlSW5kZXguZ2V0KCkgPT0gMSkgeworICAgICAgICAgICAgcmV0dXJuIG1Qb2xpY3lUaHJvdHRsZVZhbHVlLmdldCgpOwogICAgICAgICB9CiAgICAgICAgIHJldHVybiAwOwogICAgIH0KQEAgLTMwNSwyMiArMzEyLDYgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9LCBuZXcgSW50ZW50RmlsdGVyKEFDVElPTl9SRVNFVCkpOwogCi0gICAgICAgIC8vIHVzZSBhIG5ldyB0aHJlYWQgYXMgd2UgZG9uJ3Qgd2FudCB0byBzdGFsbCB0aGUgc3lzdGVtIGZvciBmaWxlIHdyaXRlcwotICAgICAgICBtVGhyZWFkID0gbmV3IEhhbmRsZXJUaHJlYWQoVEFHKTsKLSAgICAgICAgbVRocmVhZC5zdGFydCgpOwotICAgICAgICBtSGFuZGxlciA9IG5ldyBNeUhhbmRsZXIobVRocmVhZC5nZXRMb29wZXIoKSk7Ci0gICAgICAgIG1IYW5kbGVyLm9idGFpbk1lc3NhZ2UoRVZFTlRfUkVCT09UX1JFQ09WRVJZKS5zZW5kVG9UYXJnZXQoKTsKLQotICAgICAgICBtSW50ZXJmYWNlT2JzZXJ2ZXIgPSBuZXcgSW50ZXJmYWNlT2JzZXJ2ZXIobUhhbmRsZXIsIEVWRU5UX0lGQUNFX1VQLCBtSWZhY2UpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgbU5NU2VydmljZS5yZWdpc3Rlck9ic2VydmVyKG1JbnRlcmZhY2VPYnNlcnZlcik7Ci0gICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBTbG9nLmUoVEFHLCAiQ291bGQgbm90IHJlZ2lzdGVyIEludGVyZmFjZU9ic2VydmVyICIgKyBlKTsKLSAgICAgICAgfQotCi0gICAgICAgIG1TZXR0aW5nc09ic2VydmVyID0gbmV3IFNldHRpbmdzT2JzZXJ2ZXIobUhhbmRsZXIsIEVWRU5UX1BPTElDWV9DSEFOR0VEKTsKLSAgICAgICAgbVNldHRpbmdzT2JzZXJ2ZXIub2JzZXJ2ZShtQ29udGV4dCk7Ci0KICAgICAgICAgRmlsZUlucHV0U3RyZWFtIHN0cmVhbSA9IG51bGw7CiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBQcm9wZXJ0aWVzIHByb3BlcnRpZXMgPSBuZXcgUHJvcGVydGllcygpOwpAQCAtMzM3LDYgKzMyOCwyMiBAQAogICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7fQogICAgICAgICAgICAgfQogICAgICAgICB9CisKKyAgICAgICAgLy8gdXNlIGEgbmV3IHRocmVhZCBhcyB3ZSBkb24ndCB3YW50IHRvIHN0YWxsIHRoZSBzeXN0ZW0gZm9yIGZpbGUgd3JpdGVzCisgICAgICAgIG1UaHJlYWQgPSBuZXcgSGFuZGxlclRocmVhZChUQUcpOworICAgICAgICBtVGhyZWFkLnN0YXJ0KCk7CisgICAgICAgIG1IYW5kbGVyID0gbmV3IE15SGFuZGxlcihtVGhyZWFkLmdldExvb3BlcigpKTsKKyAgICAgICAgbUhhbmRsZXIub2J0YWluTWVzc2FnZShFVkVOVF9SRUJPT1RfUkVDT1ZFUlkpLnNlbmRUb1RhcmdldCgpOworCisgICAgICAgIG1JbnRlcmZhY2VPYnNlcnZlciA9IG5ldyBJbnRlcmZhY2VPYnNlcnZlcihtSGFuZGxlciwgRVZFTlRfSUZBQ0VfVVAsIG1JZmFjZSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBtTk1TZXJ2aWNlLnJlZ2lzdGVyT2JzZXJ2ZXIobUludGVyZmFjZU9ic2VydmVyKTsKKyAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIFNsb2cuZShUQUcsICJDb3VsZCBub3QgcmVnaXN0ZXIgSW50ZXJmYWNlT2JzZXJ2ZXIgIiArIGUpOworICAgICAgICB9CisKKyAgICAgICAgbVNldHRpbmdzT2JzZXJ2ZXIgPSBuZXcgU2V0dGluZ3NPYnNlcnZlcihtSGFuZGxlciwgRVZFTlRfUE9MSUNZX0NIQU5HRUQpOworICAgICAgICBtU2V0dGluZ3NPYnNlcnZlci5vYnNlcnZlKG1Db250ZXh0KTsKICAgICB9CiAKIApAQCAtMzc1LDcgKzM4Miw3IEBACiAgICAgICAgICAgICAvLyBjaGVjayBmb3Igc2ltIGNoYW5nZSBUT0RPCiAgICAgICAgICAgICAvLyByZXJlZ2lzdGVyIGZvciBub3RpZmljYXRpb24gb2YgcG9saWN5IGNoYW5nZQogCi0gICAgICAgICAgICBtVGhyb3R0bGVJbmRleCA9IFRIUk9UVExFX0lOREVYX1VOSU5JVElBTElaRUQ7CisgICAgICAgICAgICBtVGhyb3R0bGVJbmRleC5zZXQoVEhST1RUTEVfSU5ERVhfVU5JTklUSUFMSVpFRCk7CiAKICAgICAgICAgICAgIG1SZWNvcmRlciA9IG5ldyBEYXRhUmVjb3JkZXIobUNvbnRleHQsIFRocm90dGxlU2VydmljZS50aGlzKTsKIApAQCAtNDAzLDE1ICs0MTAsMTYgQEAKICAgICAgICAgICAgICAgICAgICAgUi5pbnRlZ2VyLmNvbmZpZ19kYXRhdXNlX3RocmVzaG9sZF9ieXRlcyk7CiAgICAgICAgICAgICBpbnQgZGVmYXVsdFZhbHVlID0gbUNvbnRleHQuZ2V0UmVzb3VyY2VzKCkuZ2V0SW50ZWdlcigKICAgICAgICAgICAgICAgICAgICAgUi5pbnRlZ2VyLmNvbmZpZ19kYXRhdXNlX3Rocm90dGxlX2tiaXRzcHMpOwotICAgICAgICAgICAgc3luY2hyb25pemVkIChUaHJvdHRsZVNlcnZpY2UudGhpcykgewotICAgICAgICAgICAgICAgIG1Qb2xpY3lUaHJlc2hvbGQgPSBTZXR0aW5ncy5TZWN1cmUuZ2V0TG9uZyhtQ29udGV4dC5nZXRDb250ZW50UmVzb2x2ZXIoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIFNldHRpbmdzLlNlY3VyZS5USFJPVFRMRV9USFJFU0hPTERfQllURVMsIGRlZmF1bHRUaHJlc2hvbGQpOwotICAgICAgICAgICAgICAgIG1Qb2xpY3lUaHJvdHRsZVZhbHVlID0gU2V0dGluZ3MuU2VjdXJlLmdldEludChtQ29udGV4dC5nZXRDb250ZW50UmVzb2x2ZXIoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIFNldHRpbmdzLlNlY3VyZS5USFJPVFRMRV9WQUxVRV9LQklUU1BTLCBkZWZhdWx0VmFsdWUpOwotICAgICAgICAgICAgICAgIGlmICh0ZXN0aW5nKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1Qb2xpY3lQb2xsUGVyaW9kU2VjID0gVEVTVElOR19QT0xMSU5HX1BFUklPRF9TRUM7Ci0gICAgICAgICAgICAgICAgICAgIG1Qb2xpY3lUaHJlc2hvbGQgPSBURVNUSU5HX1RIUkVTSE9MRDsKLSAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICBsb25nIHRocmVzaG9sZCA9IFNldHRpbmdzLlNlY3VyZS5nZXRMb25nKG1Db250ZXh0LmdldENvbnRlbnRSZXNvbHZlcigpLAorICAgICAgICAgICAgICAgICAgICBTZXR0aW5ncy5TZWN1cmUuVEhST1RUTEVfVEhSRVNIT0xEX0JZVEVTLCBkZWZhdWx0VGhyZXNob2xkKTsKKyAgICAgICAgICAgIGludCB2YWx1ZSA9IFNldHRpbmdzLlNlY3VyZS5nZXRJbnQobUNvbnRleHQuZ2V0Q29udGVudFJlc29sdmVyKCksCisgICAgICAgICAgICAgICAgICAgIFNldHRpbmdzLlNlY3VyZS5USFJPVFRMRV9WQUxVRV9LQklUU1BTLCBkZWZhdWx0VmFsdWUpOworCisgICAgICAgICAgICBtUG9saWN5VGhyZXNob2xkLnNldCh0aHJlc2hvbGQpOworICAgICAgICAgICAgbVBvbGljeVRocm90dGxlVmFsdWUuc2V0KHZhbHVlKTsKKyAgICAgICAgICAgIGlmICh0ZXN0aW5nKSB7CisgICAgICAgICAgICAgICAgbVBvbGljeVBvbGxQZXJpb2RTZWMgPSBURVNUSU5HX1BPTExJTkdfUEVSSU9EX1NFQzsKKyAgICAgICAgICAgICAgICBtUG9saWN5VGhyZXNob2xkLnNldChURVNUSU5HX1RIUkVTSE9MRCk7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIG1Qb2xpY3lSZXNldERheSA9IFNldHRpbmdzLlNlY3VyZS5nZXRJbnQobUNvbnRleHQuZ2V0Q29udGVudFJlc29sdmVyKCksCkBAIC00MjMsMTAgKzQzMSw4IEBACiAgICAgICAgICAgICAgICAgU2V0dGluZ3MuU2VjdXJlLnB1dEludChtQ29udGV4dC5nZXRDb250ZW50UmVzb2x2ZXIoKSwKICAgICAgICAgICAgICAgICBTZXR0aW5ncy5TZWN1cmUuVEhST1RUTEVfUkVTRVRfREFZLCBtUG9saWN5UmVzZXREYXkpOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgc3luY2hyb25pemVkIChUaHJvdHRsZVNlcnZpY2UudGhpcykgewotICAgICAgICAgICAgICAgIGlmIChtSWZhY2UgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBtUG9saWN5VGhyZXNob2xkID0gMDsKLSAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobUlmYWNlID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBtUG9saWN5VGhyZXNob2xkLnNldCgwKTsKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgaW50IGRlZmF1bHROb3RpZmljYXRpb25UeXBlID0gbUNvbnRleHQuZ2V0UmVzb3VyY2VzKCkuZ2V0SW50ZWdlcigKQEAgLTQzNywxNSArNDQzLDE2IEBACiAgICAgICAgICAgICBtTWF4TnRwQ2FjaGVBZ2VTZWMgPSBTZXR0aW5ncy5TZWN1cmUuZ2V0SW50KG1Db250ZXh0LmdldENvbnRlbnRSZXNvbHZlcigpLAogICAgICAgICAgICAgICAgICAgICBTZXR0aW5ncy5TZWN1cmUuVEhST1RUTEVfTUFYX05UUF9DQUNIRV9BR0VfU0VDLCBNQVhfTlRQX0NBQ0hFX0FHRV9TRUMpOwogCi0gICAgICAgICAgICBpZiAoVkRCRyB8fCAobVBvbGljeVRocmVzaG9sZCAhPSAwKSkgeworICAgICAgICAgICAgaWYgKFZEQkcgfHwgKG1Qb2xpY3lUaHJlc2hvbGQuZ2V0KCkgIT0gMCkpIHsKICAgICAgICAgICAgICAgICBTbG9nLmQoVEFHLCAib25Qb2xpY3lDaGFuZ2VkIHRlc3Rpbmc9IiArIHRlc3RpbmcgKyIsIHBlcmlvZD0iICsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1Qb2xpY3lQb2xsUGVyaW9kU2VjICsgIiwgdGhyZXNob2xkPSIgKyBtUG9saWN5VGhyZXNob2xkICsgIiwgdmFsdWU9IiArCi0gICAgICAgICAgICAgICAgICAgICAgICBtUG9saWN5VGhyb3R0bGVWYWx1ZSArICIsIHJlc2V0RGF5PSIgKyBtUG9saWN5UmVzZXREYXkgKyAiLCBub3RlVHlwZT0iICsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1Qb2xpY3lOb3RpZmljYXRpb25zQWxsb3dlZE1hc2sgKyAiLCBtYXhOdHBDYWNoZUFnZT0iICsgbU1heE50cENhY2hlQWdlU2VjKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1Qb2xpY3lQb2xsUGVyaW9kU2VjICsgIiwgdGhyZXNob2xkPSIgKyBtUG9saWN5VGhyZXNob2xkLmdldCgpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICIsIHZhbHVlPSIgKyBtUG9saWN5VGhyb3R0bGVWYWx1ZS5nZXQoKSArICIsIHJlc2V0RGF5PSIgKyBtUG9saWN5UmVzZXREYXkgKworICAgICAgICAgICAgICAgICAgICAgICAgIiwgbm90ZVR5cGU9IiArIG1Qb2xpY3lOb3RpZmljYXRpb25zQWxsb3dlZE1hc2sgKyAiLCBtYXhOdHBDYWNoZUFnZT0iICsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1NYXhOdHBDYWNoZUFnZVNlYyk7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIC8vIGZvcmNlIHVwZGF0ZXMKLSAgICAgICAgICAgIG1UaHJvdHRsZUluZGV4ID0gVEhST1RUTEVfSU5ERVhfVU5JTklUSUFMSVpFRDsKKyAgICAgICAgICAgIG1UaHJvdHRsZUluZGV4LnNldChUSFJPVFRMRV9JTkRFWF9VTklOSVRJQUxJWkVEKTsKIAogICAgICAgICAgICAgb25SZXNldEFsYXJtKCk7CiAKQEAgLTQ4Nyw3ICs0OTQsNyBAQAogICAgICAgICAgICAgbG9uZyBwZXJpb2RSeCA9IG1SZWNvcmRlci5nZXRQZXJpb2RSeCgwKTsKICAgICAgICAgICAgIGxvbmcgcGVyaW9kVHggPSBtUmVjb3JkZXIuZ2V0UGVyaW9kVHgoMCk7CiAgICAgICAgICAgICBsb25nIHRvdGFsID0gcGVyaW9kUnggKyBwZXJpb2RUeDsKLSAgICAgICAgICAgIGlmIChWREJHIHx8IChtUG9saWN5VGhyZXNob2xkICE9IDApKSB7CisgICAgICAgICAgICBpZiAoVkRCRyB8fCAobVBvbGljeVRocmVzaG9sZC5nZXQoKSAhPSAwKSkgewogICAgICAgICAgICAgICAgIFNsb2cuZChUQUcsICJvblBvbGxBbGFybSAtIHJvYW1pbmcgPSIgKyByb2FtaW5nICsKICAgICAgICAgICAgICAgICAgICAgICAgICIsIHJlYWQgPSIgKyBpbmNSZWFkICsgIiwgd3JpdHRlbiA9IiArIGluY1dyaXRlICsgIiwgbmV3IHRvdGFsID0iICsgdG90YWwpOwogICAgICAgICAgICAgfQpAQCAtNTEwLDExICs1MTcsMTEgQEAKICAgICAgICAgcHJpdmF0ZSB2b2lkIG9uSWZhY2VVcCgpIHsKICAgICAgICAgICAgIC8vIGlmIHdlIHdlcmUgdGhyb3R0bGVkIGJlZm9yZSwgYmUgc3VyZSBhbmQgc2V0IGl0IGFnYWluIC0gdGhlIGlmYWNlIHdlbnQgZG93bgogICAgICAgICAgICAgLy8gKGFuZCBtYXkgaGF2ZSBkaXNhcHBlYXJlZCBhbGwgdG9nZXRoZXIpIGFuZCB0aGVzZSBzZXR0aW5ncyB3ZXJlIGxvc3QKLSAgICAgICAgICAgIGlmIChtVGhyb3R0bGVJbmRleCA9PSAxKSB7CisgICAgICAgICAgICBpZiAobVRocm90dGxlSW5kZXguZ2V0KCkgPT0gMSkgewogICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgIG1OTVNlcnZpY2Uuc2V0SW50ZXJmYWNlVGhyb3R0bGUobUlmYWNlLCAtMSwgLTEpOwogICAgICAgICAgICAgICAgICAgICBtTk1TZXJ2aWNlLnNldEludGVyZmFjZVRocm90dGxlKG1JZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtUG9saWN5VGhyb3R0bGVWYWx1ZSwgbVBvbGljeVRocm90dGxlVmFsdWUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Qb2xpY3lUaHJvdHRsZVZhbHVlLmdldCgpLCBtUG9saWN5VGhyb3R0bGVWYWx1ZS5nZXQoKSk7CiAgICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKICAgICAgICAgICAgICAgICAgICAgU2xvZy5lKFRBRywgImVycm9yIHNldHRpbmcgVGhyb3R0bGU6ICIgKyBlKTsKICAgICAgICAgICAgICAgICB9CkBAIC01MjMsNyArNTMwLDggQEAKIAogICAgICAgICBwcml2YXRlIHZvaWQgY2hlY2tUaHJvdHRsZUFuZFBvc3ROb3RpZmljYXRpb24obG9uZyBjdXJyZW50VG90YWwpIHsKICAgICAgICAgICAgIC8vIGlzIHRocm90dGxpbmcgZW5hYmxlZD8KLSAgICAgICAgICAgIGlmIChtUG9saWN5VGhyZXNob2xkID09IDApIHsKKyAgICAgICAgICAgIGxvbmcgdGhyZXNob2xkID0gbVBvbGljeVRocmVzaG9sZC5nZXQoKTsKKyAgICAgICAgICAgIGlmICh0aHJlc2hvbGQgPT0gMCkgewogICAgICAgICAgICAgICAgIGNsZWFyVGhyb3R0bGVBbmROb3RpZmljYXRpb24oKTsKICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICB9CkBAIC01MzUsMTUgKzU0MywxMyBAQAogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAvLyBjaGVjayBpZiB3ZSBuZWVkIHRvIHRocm90dGxlCi0gICAgICAgICAgICBpZiAoY3VycmVudFRvdGFsID4gbVBvbGljeVRocmVzaG9sZCkgewotICAgICAgICAgICAgICAgIGlmIChtVGhyb3R0bGVJbmRleCAhPSAxKSB7Ci0gICAgICAgICAgICAgICAgICAgIHN5bmNocm9uaXplZCAoVGhyb3R0bGVTZXJ2aWNlLnRoaXMpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1UaHJvdHRsZUluZGV4ID0gMTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpZiAoREJHKSBTbG9nLmQoVEFHLCAiVGhyZXNob2xkICIgKyBtUG9saWN5VGhyZXNob2xkICsgIiBleGNlZWRlZCEiKTsKKyAgICAgICAgICAgIGlmIChjdXJyZW50VG90YWwgPiB0aHJlc2hvbGQpIHsKKyAgICAgICAgICAgICAgICBpZiAobVRocm90dGxlSW5kZXguZ2V0KCkgIT0gMSkgeworICAgICAgICAgICAgICAgICAgICBtVGhyb3R0bGVJbmRleC5zZXQoMSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChEQkcpIFNsb2cuZChUQUcsICJUaHJlc2hvbGQgIiArIHRocmVzaG9sZCArICIgZXhjZWVkZWQhIik7CiAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBtTk1TZXJ2aWNlLnNldEludGVyZmFjZVRocm90dGxlKG1JZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVBvbGljeVRocm90dGxlVmFsdWUsIG1Qb2xpY3lUaHJvdHRsZVZhbHVlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVBvbGljeVRocm90dGxlVmFsdWUuZ2V0KCksIG1Qb2xpY3lUaHJvdHRsZVZhbHVlLmdldCgpKTsKICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIFNsb2cuZShUQUcsICJlcnJvciBzZXR0aW5nIFRocm90dGxlOiAiICsgZSk7CiAgICAgICAgICAgICAgICAgICAgIH0KQEAgLTU1Niw3ICs1NjIsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvbi5GTEFHX09OR09JTkdfRVZFTlQpOwogCiAgICAgICAgICAgICAgICAgICAgIEludGVudCBicm9hZGNhc3QgPSBuZXcgSW50ZW50KFRocm90dGxlTWFuYWdlci5USFJPVFRMRV9BQ1RJT04pOwotICAgICAgICAgICAgICAgICAgICBicm9hZGNhc3QucHV0RXh0cmEoVGhyb3R0bGVNYW5hZ2VyLkVYVFJBX1RIUk9UVExFX0xFVkVMLCBtUG9saWN5VGhyb3R0bGVWYWx1ZSk7CisgICAgICAgICAgICAgICAgICAgIGJyb2FkY2FzdC5wdXRFeHRyYShUaHJvdHRsZU1hbmFnZXIuRVhUUkFfVEhST1RUTEVfTEVWRUwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVBvbGljeVRocm90dGxlVmFsdWUuZ2V0KCkpOwogICAgICAgICAgICAgICAgICAgICBtQ29udGV4dC5zZW5kU3RpY2t5QnJvYWRjYXN0KGJyb2FkY2FzdCk7CiAKICAgICAgICAgICAgICAgICB9IC8vIGVsc2UgYWxyZWFkeSB1cCEKQEAgLTU3OSw4ICs1ODYsOCBAQAogICAgICAgICAgICAgICAgICAgICBsb25nIHBlcmlvZExlbmd0aCA9IGVuZCAtIHN0YXJ0OwogICAgICAgICAgICAgICAgICAgICBsb25nIG5vdyA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwogICAgICAgICAgICAgICAgICAgICBsb25nIHRpbWVVc2VkID0gbm93IC0gc3RhcnQ7Ci0gICAgICAgICAgICAgICAgICAgIGxvbmcgd2FybmluZ1RocmVzaG9sZCA9IDIqbVBvbGljeVRocmVzaG9sZCp0aW1lVXNlZC8odGltZVVzZWQrcGVyaW9kTGVuZ3RoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKChjdXJyZW50VG90YWwgPiB3YXJuaW5nVGhyZXNob2xkKSAmJiAoY3VycmVudFRvdGFsID4gbVBvbGljeVRocmVzaG9sZC80KSkgeworICAgICAgICAgICAgICAgICAgICBsb25nIHdhcm5pbmdUaHJlc2hvbGQgPSAyKnRocmVzaG9sZCp0aW1lVXNlZC8odGltZVVzZWQrcGVyaW9kTGVuZ3RoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKChjdXJyZW50VG90YWwgPiB3YXJuaW5nVGhyZXNob2xkKSAmJiAoY3VycmVudFRvdGFsID4gdGhyZXNob2xkLzQpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobVdhcm5pbmdOb3RpZmljYXRpb25TZW50ID09IGZhbHNlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVdhcm5pbmdOb3RpZmljYXRpb25TZW50ID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTm90aWZpY2F0aW9uTWFuYWdlci5jYW5jZWwoUi5kcmF3YWJsZS5zdGF0X3N5c190aHJvdHRsZWQpOwpAQCAtNjI1LDExICs2MzIsOSBAQAogICAgICAgICB9CiAKIAotICAgICAgICBwcml2YXRlIHN5bmNocm9uaXplZCB2b2lkIGNsZWFyVGhyb3R0bGVBbmROb3RpZmljYXRpb24oKSB7Ci0gICAgICAgICAgICBpZiAobVRocm90dGxlSW5kZXggIT0gVEhST1RUTEVfSU5ERVhfVU5USFJPVFRMRUQpIHsKLSAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKFRocm90dGxlU2VydmljZS50aGlzKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1UaHJvdHRsZUluZGV4ID0gVEhST1RUTEVfSU5ERVhfVU5USFJPVFRMRUQ7Ci0gICAgICAgICAgICAgICAgfQorICAgICAgICBwcml2YXRlIHZvaWQgY2xlYXJUaHJvdHRsZUFuZE5vdGlmaWNhdGlvbigpIHsKKyAgICAgICAgICAgIGlmIChtVGhyb3R0bGVJbmRleC5nZXQoKSAhPSBUSFJPVFRMRV9JTkRFWF9VTlRIUk9UVExFRCkgeworICAgICAgICAgICAgICAgIG1UaHJvdHRsZUluZGV4LnNldChUSFJPVFRMRV9JTkRFWF9VTlRIUk9UVExFRCk7CiAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgbU5NU2VydmljZS5zZXRJbnRlcmZhY2VUaHJvdHRsZShtSWZhY2UsIC0xLCAtMSk7CiAgICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKQEAgLTY4NywxMiArNjkyLDEyIEBACiAgICAgICAgIH0KIAogICAgICAgICBwcml2YXRlIHZvaWQgb25SZXNldEFsYXJtKCkgewotICAgICAgICAgICAgaWYgKFZEQkcgfHwgKG1Qb2xpY3lUaHJlc2hvbGQgIT0gMCkpIHsKKyAgICAgICAgICAgIGlmIChWREJHIHx8IChtUG9saWN5VGhyZXNob2xkLmdldCgpICE9IDApKSB7CiAgICAgICAgICAgICAgICAgU2xvZy5kKFRBRywgIm9uUmVzZXRBbGFybSAtIGxhc3QgcGVyaW9kIGhhZCAiICsgbVJlY29yZGVyLmdldFBlcmlvZFJ4KDApICsKICAgICAgICAgICAgICAgICAgICAgICAgICIgYnl0ZXMgcmVhZCBhbmQgIiArIG1SZWNvcmRlci5nZXRQZXJpb2RUeCgwKSArICIgd3JpdHRlbiIpOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBsb25nIG5vdyA9IGdldEJlc3RUaW1lKCk7CisgICAgICAgICAgICBsb25nIG5vdyA9IGdldEJlc3RUaW1lKGZhbHNlKTsKIAogICAgICAgICAgICAgaWYgKG1OdHBBY3RpdmUgfHwgKG1OdHBTZXJ2ZXIgPT0gbnVsbCkpIHsKICAgICAgICAgICAgICAgICBDYWxlbmRhciBlbmQgPSBjYWxjdWxhdGVQZXJpb2RFbmQobm93KTsKQEAgLTcxOSwyMCArNzI0LDIzIEBACiAKICAgICAgICAgLy8gd2lsbCB0cnkgdG8gZ2V0IHRoZSBudHAgdGltZSBhbmQgc3dpdGNoIHRvIGl0IGlmIGZvdW5kLgogICAgICAgICAvLyB3aWxsIGFsc28gY2FjaGUgdGhlIHRpbWUgc28gd2UgZG9uJ3QgZmV0Y2ggaXQgcmVwZWF0ZWRseS4KLSAgICAgICAgZ2V0QmVzdFRpbWUoKTsKKyAgICAgICAgZ2V0QmVzdFRpbWUoZmFsc2UpOwogICAgIH0KIAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNQVhfTlRQX0NBQ0hFX0FHRV9TRUMgPSA2MCAqIDYwICogMjQ7IC8vIDEgZGF5Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1BWF9OVFBfRkVUQ0hfV0FJVCA9IDEwICogMTAwMDsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUFYX05UUF9GRVRDSF9XQUlUID0gMjAgKiAxMDAwOwogICAgIHByaXZhdGUgaW50IG1NYXhOdHBDYWNoZUFnZVNlYyA9IE1BWF9OVFBfQ0FDSEVfQUdFX1NFQzsKICAgICBwcml2YXRlIGxvbmcgY2FjaGVkTnRwOwogICAgIHByaXZhdGUgbG9uZyBjYWNoZWROdHBUaW1lc3RhbXA7CiAKLSAgICBwcml2YXRlIGxvbmcgZ2V0QmVzdFRpbWUoKSB7CisgICAgLy8gaWYgdGhlIHJlcXVlc3QgaXMgdGllZCB0byBVSSBhbmQgQU5SJ3MgYXJlIGEgZGFuZ2VyLCByZXF1ZXN0IGEgZmFzdCByZXN1bHQKKyAgICAvLyB0aGUgcmVndWxhciBwb2xsaW5nIHNob3VsZCBoYXZlIHVwZGF0ZWQgdGhlIGNhY2hlZCB0aW1lIHJlY2VudGx5IHVzaW5nIHRoZQorICAgIC8vIHNsb3dlciBtZXRob2QgKCFmYXN0KQorICAgIHByaXZhdGUgbG9uZyBnZXRCZXN0VGltZShib29sZWFuIGZhc3QpIHsKICAgICAgICAgaWYgKG1OdHBTZXJ2ZXIgIT0gbnVsbCkgewogICAgICAgICAgICAgaWYgKG1OdHBBY3RpdmUpIHsKICAgICAgICAgICAgICAgICBsb25nIG50cEFnZSA9IFN5c3RlbUNsb2NrLmVsYXBzZWRSZWFsdGltZSgpIC0gY2FjaGVkTnRwVGltZXN0YW1wOwotICAgICAgICAgICAgICAgIGlmIChudHBBZ2UgPCBtTWF4TnRwQ2FjaGVBZ2VTZWMgKiAxMDAwKSB7CisgICAgICAgICAgICAgICAgaWYgKG50cEFnZSA8IG1NYXhOdHBDYWNoZUFnZVNlYyAqIDEwMDAgfHwgZmFzdCkgewogICAgICAgICAgICAgICAgICAgICBpZiAoVkRCRykgU2xvZy52KFRBRywgInVzaW5nIGNhY2hlZCB0aW1lIik7CiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjYWNoZWROdHAgKyBudHBBZ2U7CiAgICAgICAgICAgICAgICAgfQpAQCAtMTAyNSwzOSArMTAzMyw1NyBAQAogICAgICAgICAgICAgICAgIGlmIChEQkcpIFNsb2cuZChUQUcsICJkYXRhIGZpbGUgZW1wdHkiKTsKICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG1QYXJlbnQpIHsKLSAgICAgICAgICAgICAgICBTdHJpbmdbXSBwYXJzZWQgPSBkYXRhLnNwbGl0KCI6Iik7Ci0gICAgICAgICAgICAgICAgaW50IHBhcnNlZFVzZWQgPSAwOwotICAgICAgICAgICAgICAgIGlmIChwYXJzZWQubGVuZ3RoIDwgNikgewotICAgICAgICAgICAgICAgICAgICBTbG9nLmUoVEFHLCAicmVhZGluZyBkYXRhIGZpbGUgd2l0aCBpbnN1ZmZpY2llbnQgbGVuZ3RoIC0gaWdub3JpbmciKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFN0cmluZ1tdIHBhcnNlZCA9IGRhdGEuc3BsaXQoIjoiKTsKKyAgICAgICAgICAgIGludCBwYXJzZWRVc2VkID0gMDsKKyAgICAgICAgICAgIGlmIChwYXJzZWQubGVuZ3RoIDwgNikgeworICAgICAgICAgICAgICAgIFNsb2cuZShUQUcsICJyZWFkaW5nIGRhdGEgZmlsZSB3aXRoIGluc3VmZmljaWVudCBsZW5ndGggLSBpZ25vcmluZyIpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KIAorICAgICAgICAgICAgaW50IHBlcmlvZENvdW50OworICAgICAgICAgICAgbG9uZ1tdIHBlcmlvZFJ4RGF0YTsKKyAgICAgICAgICAgIGxvbmdbXSBwZXJpb2RUeERhdGE7CisgICAgICAgICAgICBpbnQgY3VycmVudFBlcmlvZDsKKyAgICAgICAgICAgIENhbGVuZGFyIHBlcmlvZFN0YXJ0OworICAgICAgICAgICAgQ2FsZW5kYXIgcGVyaW9kRW5kOworICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICBpZiAoSW50ZWdlci5wYXJzZUludChwYXJzZWRbcGFyc2VkVXNlZCsrXSkgIT0gREFUQV9GSUxFX1ZFUlNJT04pIHsKICAgICAgICAgICAgICAgICAgICAgU2xvZy5lKFRBRywgInJlYWRpbmcgZGF0YSBmaWxlIHdpdGggYmFkIHZlcnNpb24gLSBpZ25vcmluZyIpOwogICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgbVBlcmlvZENvdW50ID0gSW50ZWdlci5wYXJzZUludChwYXJzZWRbcGFyc2VkVXNlZCsrXSk7Ci0gICAgICAgICAgICAgICAgaWYgKHBhcnNlZC5sZW5ndGggIT0gNSArICgyICogbVBlcmlvZENvdW50KSkgeworICAgICAgICAgICAgICAgIHBlcmlvZENvdW50ID0gSW50ZWdlci5wYXJzZUludChwYXJzZWRbcGFyc2VkVXNlZCsrXSk7CisgICAgICAgICAgICAgICAgaWYgKHBhcnNlZC5sZW5ndGggIT0gNSArICgyICogcGVyaW9kQ291bnQpKSB7CiAgICAgICAgICAgICAgICAgICAgIFNsb2cuZShUQUcsICJyZWFkaW5nIGRhdGEgZmlsZSB3aXRoIGJhZCBsZW5ndGggKCIgKyBwYXJzZWQubGVuZ3RoICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICE9ICIgKyAoNSsoMiptUGVyaW9kQ291bnQpKSArICIpIC0gaWdub3JpbmciKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICE9ICIgKyAoNSArICgyICogcGVyaW9kQ291bnQpKSArICIpIC0gaWdub3JpbmciKTsKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBwZXJpb2RSeERhdGEgPSBuZXcgbG9uZ1twZXJpb2RDb3VudF07CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwZXJpb2RDb3VudDsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIHBlcmlvZFJ4RGF0YVtpXSA9IExvbmcucGFyc2VMb25nKHBhcnNlZFtwYXJzZWRVc2VkKytdKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcGVyaW9kVHhEYXRhID0gbmV3IGxvbmdbcGVyaW9kQ291bnRdOworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcGVyaW9kQ291bnQ7IGkrKykgeworICAgICAgICAgICAgICAgICAgICBwZXJpb2RUeERhdGFbaV0gPSBMb25nLnBhcnNlTG9uZyhwYXJzZWRbcGFyc2VkVXNlZCsrXSk7CisgICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgbVBlcmlvZFJ4RGF0YSA9IG5ldyBsb25nW21QZXJpb2RDb3VudF07Ci0gICAgICAgICAgICAgICAgZm9yKGludCBpID0gMDsgaSA8IG1QZXJpb2RDb3VudDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1QZXJpb2RSeERhdGFbaV0gPSBMb25nLnBhcnNlTG9uZyhwYXJzZWRbcGFyc2VkVXNlZCsrXSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG1QZXJpb2RUeERhdGEgPSBuZXcgbG9uZ1ttUGVyaW9kQ291bnRdOwotICAgICAgICAgICAgICAgIGZvcihpbnQgaSA9IDA7IGkgPCBtUGVyaW9kQ291bnQ7IGkrKykgewotICAgICAgICAgICAgICAgICAgICBtUGVyaW9kVHhEYXRhW2ldID0gTG9uZy5wYXJzZUxvbmcocGFyc2VkW3BhcnNlZFVzZWQrK10pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBtQ3VycmVudFBlcmlvZCA9IEludGVnZXIucGFyc2VJbnQocGFyc2VkW3BhcnNlZFVzZWQrK10pOwotICAgICAgICAgICAgICAgIG1QZXJpb2RTdGFydCA9IG5ldyBHcmVnb3JpYW5DYWxlbmRhcigpOwotICAgICAgICAgICAgICAgIG1QZXJpb2RTdGFydC5zZXRUaW1lSW5NaWxsaXMoTG9uZy5wYXJzZUxvbmcocGFyc2VkW3BhcnNlZFVzZWQrK10pKTsKLSAgICAgICAgICAgICAgICBtUGVyaW9kRW5kID0gbmV3IEdyZWdvcmlhbkNhbGVuZGFyKCk7Ci0gICAgICAgICAgICAgICAgbVBlcmlvZEVuZC5zZXRUaW1lSW5NaWxsaXMoTG9uZy5wYXJzZUxvbmcocGFyc2VkW3BhcnNlZFVzZWQrK10pKTsKKyAgICAgICAgICAgICAgICBjdXJyZW50UGVyaW9kID0gSW50ZWdlci5wYXJzZUludChwYXJzZWRbcGFyc2VkVXNlZCsrXSk7CisKKyAgICAgICAgICAgICAgICBwZXJpb2RTdGFydCA9IG5ldyBHcmVnb3JpYW5DYWxlbmRhcigpOworICAgICAgICAgICAgICAgIHBlcmlvZFN0YXJ0LnNldFRpbWVJbk1pbGxpcyhMb25nLnBhcnNlTG9uZyhwYXJzZWRbcGFyc2VkVXNlZCsrXSkpOworICAgICAgICAgICAgICAgIHBlcmlvZEVuZCA9IG5ldyBHcmVnb3JpYW5DYWxlbmRhcigpOworICAgICAgICAgICAgICAgIHBlcmlvZEVuZC5zZXRUaW1lSW5NaWxsaXMoTG9uZy5wYXJzZUxvbmcocGFyc2VkW3BhcnNlZFVzZWQrK10pKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgU2xvZy5lKFRBRywgIkVycm9yIHBhcnNpbmcgZGF0YSBmaWxlIC0gaWdub3JpbmciKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG1QYXJlbnQpIHsKKyAgICAgICAgICAgICAgICBtUGVyaW9kQ291bnQgPSBwZXJpb2RDb3VudDsKKyAgICAgICAgICAgICAgICBtUGVyaW9kUnhEYXRhID0gcGVyaW9kUnhEYXRhOworICAgICAgICAgICAgICAgIG1QZXJpb2RUeERhdGEgPSBwZXJpb2RUeERhdGE7CisgICAgICAgICAgICAgICAgbUN1cnJlbnRQZXJpb2QgPSBjdXJyZW50UGVyaW9kOworICAgICAgICAgICAgICAgIG1QZXJpb2RTdGFydCA9IHBlcmlvZFN0YXJ0OworICAgICAgICAgICAgICAgIG1QZXJpb2RFbmQgPSBwZXJpb2RFbmQ7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIApAQCAtMTA5MSwxNSArMTExNywxNSBAQAogICAgICAgICB9CiAgICAgICAgIHB3LnByaW50bG4oKTsKIAotICAgICAgICBwdy5wcmludGxuKCJUaGUgdGhyZXNob2xkIGlzICIgKyBtUG9saWN5VGhyZXNob2xkICsKKyAgICAgICAgcHcucHJpbnRsbigiVGhlIHRocmVzaG9sZCBpcyAiICsgbVBvbGljeVRocmVzaG9sZC5nZXQoKSArCiAgICAgICAgICAgICAgICAgIiwgYWZ0ZXIgd2hpY2ggeW91IGV4cGVyaW5jZSB0aHJvdHRsaW5nIHRvICIgKwotICAgICAgICAgICAgICAgIG1Qb2xpY3lUaHJvdHRsZVZhbHVlICsgImticHMiKTsKKyAgICAgICAgICAgICAgICBtUG9saWN5VGhyb3R0bGVWYWx1ZS5nZXQoKSArICJrYnBzIik7CiAgICAgICAgIHB3LnByaW50bG4oIkN1cnJlbnQgcGVyaW9kIGlzICIgKwogICAgICAgICAgICAgICAgIChtUmVjb3JkZXIuZ2V0UGVyaW9kRW5kKCkgLSBtUmVjb3JkZXIuZ2V0UGVyaW9kU3RhcnQoKSkvMTAwMCArICIgc2Vjb25kcyBsb25nICIgKwogICAgICAgICAgICAgICAgICJhbmQgZW5kcyBpbiAiICsgKGdldFJlc2V0VGltZShtSWZhY2UpIC0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkpIC8gMTAwMCArCiAgICAgICAgICAgICAgICAgIiBzZWNvbmRzLiIpOwogICAgICAgICBwdy5wcmludGxuKCJQb2xsaW5nIGV2ZXJ5ICIgKyBtUG9saWN5UG9sbFBlcmlvZFNlYyArICIgc2Vjb25kcyIpOwotICAgICAgICBwdy5wcmludGxuKCJDdXJyZW50IFRocm90dGxlIEluZGV4IGlzICIgKyBtVGhyb3R0bGVJbmRleCk7CisgICAgICAgIHB3LnByaW50bG4oIkN1cnJlbnQgVGhyb3R0bGUgSW5kZXggaXMgIiArIG1UaHJvdHRsZUluZGV4LmdldCgpKTsKICAgICAgICAgcHcucHJpbnRsbigiTWF4IE5UUCBDYWNoZSBBZ2UgaXMgIiArIG1NYXhOdHBDYWNoZUFnZVNlYyk7CiAKICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtUmVjb3JkZXIuZ2V0UGVyaW9kQ291bnQoKTsgaSsrKSB7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9Vc2JPYnNlcnZlci5qYXZhIGIvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvVXNiT2JzZXJ2ZXIuamF2YQppbmRleCBkMDhmZTliLi41NDZlNWY4IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9Vc2JPYnNlcnZlci5qYXZhCisrKyBiL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL1VzYk9ic2VydmVyLmphdmEKQEAgLTI0LDYgKzI0LDcgQEAKIGltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXI7CiBpbXBvcnQgYW5kcm9pZC5vcy5NZXNzYWdlOwogaW1wb3J0IGFuZHJvaWQub3MuVUV2ZW50T2JzZXJ2ZXI7CitpbXBvcnQgYW5kcm9pZC5wcm92aWRlci5NdHA7CiBpbXBvcnQgYW5kcm9pZC5wcm92aWRlci5TZXR0aW5nczsKIGltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwogaW1wb3J0IGFuZHJvaWQudXRpbC5TbG9nOwpAQCAtMTQ3LDggKzE0OCw0MyBAQAogICAgICAgICB9CiAgICAgfQogCisgICAgcHJpdmF0ZSBuYXRpdmUgdm9pZCBtb25pdG9yVXNiSG9zdEJ1cygpOworCisgICAgLy8gY2FsbGVkIGZyb20gSk5JIGluIG1vbml0b3JVc2JIb3N0QnVzKCkKKyAgICBwcml2YXRlIHZvaWQgdXNiQ2FtZXJhQWRkZWQoaW50IGRldmljZUlEKSB7CisgICAgICAgIEludGVudCBpbnRlbnQgPSBuZXcgSW50ZW50KFVzYi5BQ1RJT05fVVNCX0NBTUVSQV9BVFRBQ0hFRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXRwLkRldmljZS5nZXRDb250ZW50VXJpKGRldmljZUlEKSk7CisgICAgICAgIExvZy5kKFRBRywgInVzYkNhbWVyYUFkZGVkLCBzZW5kaW5nICIgKyBpbnRlbnQpOworICAgICAgICBtQ29udGV4dC5zZW5kQnJvYWRjYXN0KGludGVudCk7CisgICAgfQorCisgICAgLy8gY2FsbGVkIGZyb20gSk5JIGluIG1vbml0b3JVc2JIb3N0QnVzKCkKKyAgICBwcml2YXRlIHZvaWQgdXNiQ2FtZXJhUmVtb3ZlZChpbnQgZGV2aWNlSUQpIHsKKyAgICAgICAgSW50ZW50IGludGVudCA9IG5ldyBJbnRlbnQoVXNiLkFDVElPTl9VU0JfQ0FNRVJBX0RFVEFDSEVELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdHAuRGV2aWNlLmdldENvbnRlbnRVcmkoZGV2aWNlSUQpKTsKKyAgICAgICAgTG9nLmQoVEFHLCAidXNiQ2FtZXJhUmVtb3ZlZCwgc2VuZGluZyAiICsgaW50ZW50KTsKKyAgICAgICAgbUNvbnRleHQuc2VuZEJyb2FkY2FzdChpbnRlbnQpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBpbml0SG9zdFN1cHBvcnQoKSB7CisgICAgICAgIC8vIENyZWF0ZSBhIHRocmVhZCB0byBjYWxsIGludG8gbmF0aXZlIGNvZGUgdG8gd2FpdCBmb3IgVVNCIGhvc3QgZXZlbnRzLgorICAgICAgICAvLyBUaGlzIHRocmVhZCB3aWxsIGNhbGwgdXMgYmFjayBvbiB1c2JDYW1lcmFBZGRlZCBhbmQgdXNiQ2FtZXJhUmVtb3ZlZC4KKyAgICAgICAgUnVubmFibGUgcnVubmFibGUgPSBuZXcgUnVubmFibGUoKSB7CisgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgbW9uaXRvclVzYkhvc3RCdXMoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKyAgICAgICAgbmV3IFRocmVhZChudWxsLCBydW5uYWJsZSwgIlVzYk9ic2VydmVyIGhvc3QgdGhyZWFkIikuc3RhcnQoKTsKKyAgICB9CisKICAgICB2b2lkIHN5c3RlbVJlYWR5KCkgewogICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKKyAgICAgICAgICAgIGlmIChtQ29udGV4dC5nZXRSZXNvdXJjZXMoKS5nZXRCb29sZWFuKAorICAgICAgICAgICAgICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmJvb2wuY29uZmlnX2hhc1VzYkhvc3RTdXBwb3J0KSkgeworICAgICAgICAgICAgICAgIC8vIHN0YXJ0IG1vbml0b3JpbmcgZm9yIGNvbm5lY3RlZCBVU0IgZGV2aWNlcworICAgICAgICAgICAgICAgIGluaXRIb3N0U3VwcG9ydCgpOworICAgICAgICAgICAgfQorCiAgICAgICAgICAgICB1cGRhdGUoKTsKICAgICAgICAgICAgIG1TeXN0ZW1SZWFkeSA9IHRydWU7CiAgICAgICAgIH0KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL1dpZmlTZXJ2aWNlLmphdmEgYi9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9XaWZpU2VydmljZS5qYXZhCmluZGV4IGYxMWMwZjcuLmU4NTAyZmEgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL1dpZmlTZXJ2aWNlLmphdmEKKysrIGIvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvV2lmaVNlcnZpY2UuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKICAqCiAgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKICAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KQEAgLTE2LDE5ICsxNiw5IEBACiAKIHBhY2thZ2UgY29tLmFuZHJvaWQuc2VydmVyOwogCi1pbXBvcnQgc3RhdGljIGFuZHJvaWQubmV0LndpZmkuV2lmaU1hbmFnZXIuV0lGSV9TVEFURV9ESVNBQkxFRDsKLWltcG9ydCBzdGF0aWMgYW5kcm9pZC5uZXQud2lmaS5XaWZpTWFuYWdlci5XSUZJX1NUQVRFX0RJU0FCTElORzsKLWltcG9ydCBzdGF0aWMgYW5kcm9pZC5uZXQud2lmaS5XaWZpTWFuYWdlci5XSUZJX1NUQVRFX0VOQUJMRUQ7Ci1pbXBvcnQgc3RhdGljIGFuZHJvaWQubmV0LndpZmkuV2lmaU1hbmFnZXIuV0lGSV9TVEFURV9FTkFCTElORzsKLWltcG9ydCBzdGF0aWMgYW5kcm9pZC5uZXQud2lmaS5XaWZpTWFuYWdlci5XSUZJX1NUQVRFX1VOS05PV047Ci0KLWltcG9ydCBzdGF0aWMgYW5kcm9pZC5uZXQud2lmaS5XaWZpTWFuYWdlci5XSUZJX0FQX1NUQVRFX0RJU0FCTEVEOwotaW1wb3J0IHN0YXRpYyBhbmRyb2lkLm5ldC53aWZpLldpZmlNYW5hZ2VyLldJRklfQVBfU1RBVEVfRElTQUJMSU5HOwotaW1wb3J0IHN0YXRpYyBhbmRyb2lkLm5ldC53aWZpLldpZmlNYW5hZ2VyLldJRklfQVBfU1RBVEVfRU5BQkxFRDsKLWltcG9ydCBzdGF0aWMgYW5kcm9pZC5uZXQud2lmaS5XaWZpTWFuYWdlci5XSUZJX0FQX1NUQVRFX0VOQUJMSU5HOwotaW1wb3J0IHN0YXRpYyBhbmRyb2lkLm5ldC53aWZpLldpZmlNYW5hZ2VyLldJRklfQVBfU1RBVEVfRkFJTEVEOwotCiBpbXBvcnQgYW5kcm9pZC5hcHAuQWxhcm1NYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQuYXBwLk5vdGlmaWNhdGlvbjsKK2ltcG9ydCBhbmRyb2lkLmFwcC5Ob3RpZmljYXRpb25NYW5hZ2VyOwogaW1wb3J0IGFuZHJvaWQuYXBwLlBlbmRpbmdJbnRlbnQ7CiBpbXBvcnQgYW5kcm9pZC5ibHVldG9vdGguQmx1ZXRvb3RoQTJkcDsKIGltcG9ydCBhbmRyb2lkLmJsdWV0b290aC5CbHVldG9vdGhEZXZpY2U7CkBAIC0zOCw3MCArMjgsNjEgQEAKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnRGaWx0ZXI7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLlBhY2thZ2VNYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2UuQ29udGVudE9ic2VydmVyOwogaW1wb3J0IGFuZHJvaWQubmV0LndpZmkuSVdpZmlNYW5hZ2VyOwogaW1wb3J0IGFuZHJvaWQubmV0LndpZmkuV2lmaUluZm87CiBpbXBvcnQgYW5kcm9pZC5uZXQud2lmaS5XaWZpTWFuYWdlcjsKLWltcG9ydCBhbmRyb2lkLm5ldC53aWZpLldpZmlOYXRpdmU7Ci1pbXBvcnQgYW5kcm9pZC5uZXQud2lmaS5XaWZpU3RhdGVUcmFja2VyOworaW1wb3J0IGFuZHJvaWQubmV0LndpZmkuV2lmaVN0YXRlTWFjaGluZTsKIGltcG9ydCBhbmRyb2lkLm5ldC53aWZpLlNjYW5SZXN1bHQ7CiBpbXBvcnQgYW5kcm9pZC5uZXQud2lmaS5XaWZpQ29uZmlndXJhdGlvbjsKIGltcG9ydCBhbmRyb2lkLm5ldC53aWZpLlN1cHBsaWNhbnRTdGF0ZTsKIGltcG9ydCBhbmRyb2lkLm5ldC53aWZpLldpZmlDb25maWd1cmF0aW9uLktleU1nbXQ7CiBpbXBvcnQgYW5kcm9pZC5uZXQuQ29ubmVjdGl2aXR5TWFuYWdlcjsKIGltcG9ydCBhbmRyb2lkLm5ldC5JbnRlcmZhY2VDb25maWd1cmF0aW9uOwotaW1wb3J0IGFuZHJvaWQubmV0Lk5ldHdvcmtTdGF0ZVRyYWNrZXI7CiBpbXBvcnQgYW5kcm9pZC5uZXQuRGhjcEluZm87Ci1pbXBvcnQgYW5kcm9pZC5uZXQuTmV0d29ya1V0aWxzOworaW1wb3J0IGFuZHJvaWQubmV0Lk5ldHdvcmtJbmZvOworaW1wb3J0IGFuZHJvaWQubmV0Lk5ldHdvcmtJbmZvLlN0YXRlOwogaW1wb3J0IGFuZHJvaWQub3MuQmluZGVyOwogaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlcjsKIGltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXJUaHJlYWQ7CiBpbXBvcnQgYW5kcm9pZC5vcy5JQmluZGVyOwogaW1wb3J0IGFuZHJvaWQub3MuSU5ldHdvcmtNYW5hZ2VtZW50U2VydmljZTsKLWltcG9ydCBhbmRyb2lkLm9zLkxvb3BlcjsKIGltcG9ydCBhbmRyb2lkLm9zLk1lc3NhZ2U7Ci1pbXBvcnQgYW5kcm9pZC5vcy5Qb3dlck1hbmFnZXI7Ci1pbXBvcnQgYW5kcm9pZC5vcy5Qcm9jZXNzOwogaW1wb3J0IGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uOwogaW1wb3J0IGFuZHJvaWQub3MuU2VydmljZU1hbmFnZXI7CiBpbXBvcnQgYW5kcm9pZC5vcy5Xb3JrU291cmNlOwogaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuU2V0dGluZ3M7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLlNsb2c7CiBpbXBvcnQgYW5kcm9pZC50ZXh0LlRleHRVdGlsczsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuU2xvZzsKIAogaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkJpdFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTGlua2VkSGFzaE1hcDsKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwogaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci1pbXBvcnQgamF2YS51dGlsLnJlZ2V4LlBhdHRlcm47CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuYXRvbWljLkF0b21pY0Jvb2xlYW47CiBpbXBvcnQgamF2YS5pby5GaWxlRGVzY3JpcHRvcjsKIGltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOwotaW1wb3J0IGphdmEubmV0LlVua25vd25Ib3N0RXhjZXB0aW9uOwogCiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwuYXBwLklCYXR0ZXJ5U3RhdHM7Ci1pbXBvcnQgYW5kcm9pZC5hcHAuYmFja3VwLklCYWNrdXBNYW5hZ2VyOwogaW1wb3J0IGNvbS5hbmRyb2lkLnNlcnZlci5hbS5CYXR0ZXJ5U3RhdHNTZXJ2aWNlOwogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLlI7CiAKIC8qKgogICogV2lmaVNlcnZpY2UgaGFuZGxlcyByZW1vdGUgV2lGaSBvcGVyYXRpb24gcmVxdWVzdHMgYnkgaW1wbGVtZW50aW5nCi0gKiB0aGUgSVdpZmlNYW5hZ2VyIGludGVyZmFjZS4gSXQgYWxzbyBjcmVhdGVzIGEgV2lmaU1vbml0b3IgdG8gbGlzdGVuCi0gKiBmb3IgV2lmaS1yZWxhdGVkIGV2ZW50cy4KKyAqIHRoZSBJV2lmaU1hbmFnZXIgaW50ZXJmYWNlLgogICoKICAqIEBoaWRlCiAgKi8KKy8vVE9ETzogQ2xlYW4gdXAgbXVsdGlwbGUgbG9ja3MgYW5kIGltcGxlbWVudCBXaWZpU2VydmljZQorLy8gYXMgYSBTTSB0byB0cmFjayBzb2Z0IEFQL2NsaWVudC9hZGhvYyBicmluZyB1cCBiYXNlZAorLy8gb24gZGV2aWNlIGlkbGUgc3RhdGUsIGFpcnBsYW5lIG1vZGUgYW5kIGJvb3QuCisKIHB1YmxpYyBjbGFzcyBXaWZpU2VydmljZSBleHRlbmRzIElXaWZpTWFuYWdlci5TdHViIHsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIldpZmlTZXJ2aWNlIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIERCRyA9IGZhbHNlOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFBhdHRlcm4gc2NhblJlc3VsdFBhdHRlcm4gPSBQYXR0ZXJuLmNvbXBpbGUoIlx0KyIpOwotICAgIHByaXZhdGUgZmluYWwgV2lmaVN0YXRlVHJhY2tlciBtV2lmaVN0YXRlVHJhY2tlcjsKLSAgICAvKiBUT0RPOiBmZXRjaCBhIGNvbmZpZ3VyYWJsZSBpbnRlcmZhY2UgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU09GVEFQX0lGQUNFID0gIndsMC4xIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIERCRyA9IHRydWU7CisKKyAgICBwcml2YXRlIGZpbmFsIFdpZmlTdGF0ZU1hY2hpbmUgbVdpZmlTdGF0ZU1hY2hpbmU7CiAKICAgICBwcml2YXRlIENvbnRleHQgbUNvbnRleHQ7Ci0gICAgcHJpdmF0ZSBpbnQgbVdpZmlBcFN0YXRlOwogCiAgICAgcHJpdmF0ZSBBbGFybU1hbmFnZXIgbUFsYXJtTWFuYWdlcjsKICAgICBwcml2YXRlIFBlbmRpbmdJbnRlbnQgbUlkbGVJbnRlbnQ7CkBAIC0xMTAsMTUgKzkxLDExIEBACiAgICAgcHJpdmF0ZSBib29sZWFuIG1EZXZpY2VJZGxlOwogICAgIHByaXZhdGUgaW50IG1QbHVnZ2VkVHlwZTsKIAotICAgIHByaXZhdGUgZW51bSBEcml2ZXJBY3Rpb24ge0RSSVZFUl9VTkxPQUQsIE5PX0RSSVZFUl9VTkxPQUR9OwotCiAgICAgLy8gdHJ1ZSBpZiB0aGUgdXNlciBlbmFibGVkIFdpZmkgd2hpbGUgaW4gYWlycGxhbmUgbW9kZQotICAgIHByaXZhdGUgYm9vbGVhbiBtQWlycGxhbmVNb2RlT3ZlcndyaWRkZW47CisgICAgcHJpdmF0ZSBBdG9taWNCb29sZWFuIG1BaXJwbGFuZU1vZGVPdmVyd3JpZGRlbiA9IG5ldyBBdG9taWNCb29sZWFuKGZhbHNlKTsKIAogICAgIHByaXZhdGUgZmluYWwgTG9ja0xpc3QgbUxvY2tzID0gbmV3IExvY2tMaXN0KCk7CiAgICAgLy8gc29tZSB3aWZpIGxvY2sgc3RhdGlzdGljcwotICAgIHByaXZhdGUgaW50IG1GdWxsSGlnaFBlcmZMb2Nrc0FjcXVpcmVkOwotICAgIHByaXZhdGUgaW50IG1GdWxsSGlnaFBlcmZMb2Nrc1JlbGVhc2VkOwogICAgIHByaXZhdGUgaW50IG1GdWxsTG9ja3NBY3F1aXJlZDsKICAgICBwcml2YXRlIGludCBtRnVsbExvY2tzUmVsZWFzZWQ7CiAgICAgcHJpdmF0ZSBpbnQgbVNjYW5Mb2Nrc0FjcXVpcmVkOwpAQCAtMTMxLDkgKzEwOCw3IEBACiAKICAgICBwcml2YXRlIGZpbmFsIElCYXR0ZXJ5U3RhdHMgbUJhdHRlcnlTdGF0czsKIAotICAgIHByaXZhdGUgSU5ldHdvcmtNYW5hZ2VtZW50U2VydmljZSBud1NlcnZpY2U7CiAgICAgQ29ubmVjdGl2aXR5TWFuYWdlciBtQ207Ci0gICAgcHJpdmF0ZSBXaWZpV2F0Y2hkb2dTZXJ2aWNlIG1XaWZpV2F0Y2hkb2dTZXJ2aWNlID0gbnVsbDsKICAgICBwcml2YXRlIFN0cmluZ1tdIG1XaWZpUmVnZXhzOwogCiAgICAgLyoqCkBAIC0xNDUsNjEgKzEyMCw2IEBACiAgICAgICovCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBERUZBVUxUX0lETEVfTUlMTElTID0gMTUgKiA2MCAqIDEwMDA7IC8qIDE1IG1pbnV0ZXMgKi8KIAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBXQUtFTE9DS19UQUcgPSAiV2lmaVNlcnZpY2UiOwotCi0gICAgLyoqCi0gICAgICogVGhlIG1heGltdW0gYW1vdW50IG9mIHRpbWUgdG8gaG9sZCB0aGUgd2FrZSBsb2NrIGFmdGVyIGEgZGlzY29ubmVjdAotICAgICAqIGNhdXNlZCBieSBzdG9wcGluZyB0aGUgZHJpdmVyLiBFc3RhYmxpc2hpbmcgYW4gRURHRSBjb25uZWN0aW9uIGhhcyBiZWVuCi0gICAgICogb2JzZXJ2ZWQgdG8gdGFrZSBhYm91dCA1IHNlY29uZHMgdW5kZXIgbm9ybWFsIGNpcmN1bXN0YW5jZXMuIFRoaXMKLSAgICAgKiBwcm92aWRlcyBhIGJpdCBvZiBleHRyYSBtYXJnaW4uCi0gICAgICogPHA+Ci0gICAgICogU2VlIHtAbGluayBhbmRyb2lkLnByb3ZpZGVyLlNldHRpbmdzLlNlY3VyZSNXSUZJX01PQklMRV9EQVRBX1RSQU5TSVRJT05fV0FLRUxPQ0tfVElNRU9VVF9NU30uCi0gICAgICogVGhpcyBpcyB0aGUgZGVmYXVsdCB2YWx1ZSBpZiBhIFNldHRpbmdzLlNlY3VyZSB2YWx1ZSBpcyBub3QgcHJlc2VudC4KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgREVGQVVMVF9XQUtFTE9DS19USU1FT1VUID0gODAwMDsKLQotICAgIC8vIFdha2UgbG9jayB1c2VkIGJ5IGRyaXZlci1zdG9wIG9wZXJhdGlvbgotICAgIHByaXZhdGUgc3RhdGljIFBvd2VyTWFuYWdlci5XYWtlTG9jayBzRHJpdmVyU3RvcFdha2VMb2NrOwotICAgIC8vIFdha2UgbG9jayB1c2VkIGJ5IG90aGVyIG9wZXJhdGlvbnMKLSAgICBwcml2YXRlIHN0YXRpYyBQb3dlck1hbmFnZXIuV2FrZUxvY2sgc1dha2VMb2NrOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1FU1NBR0VfRU5BQkxFX1dJRkkgICAgICAgID0gMDsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUVTU0FHRV9ESVNBQkxFX1dJRkkgICAgICAgPSAxOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNRVNTQUdFX1NUT1BfV0lGSSAgICAgICAgICA9IDI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1FU1NBR0VfU1RBUlRfV0lGSSAgICAgICAgID0gMzsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUVTU0FHRV9SRUxFQVNFX1dBS0VMT0NLICAgPSA0OwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNRVNTQUdFX1VQREFURV9TVEFURSAgICAgICA9IDU7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1FU1NBR0VfU1RBUlRfQUNDRVNTX1BPSU5UID0gNjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUVTU0FHRV9TVE9QX0FDQ0VTU19QT0lOVCAgPSA3OwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNRVNTQUdFX1NFVF9DSEFOTkVMUyAgICAgICA9IDg7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1FU1NBR0VfRU5BQkxFX05FVFdPUktTICAgID0gOTsKLQotCi0gICAgcHJpdmF0ZSBmaW5hbCAgV2lmaUhhbmRsZXIgbVdpZmlIYW5kbGVyOwotCi0gICAgLyoKLSAgICAgKiBDYWNoZSBvZiBzY2FuIHJlc3VsdHMgb2JqZWN0cyAoc2l6ZSBpcyBzb21ld2hhdCBhcmJpdHJhcnkpCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNDQU5fUkVTVUxUX0NBQ0hFX1NJWkUgPSA4MDsKLSAgICBwcml2YXRlIGZpbmFsIExpbmtlZEhhc2hNYXA8U3RyaW5nLCBTY2FuUmVzdWx0PiBtU2NhblJlc3VsdENhY2hlOwotCi0gICAgLyoKLSAgICAgKiBDaGFyYWN0ZXIgYnVmZmVyIHVzZWQgdG8gcGFyc2Ugc2NhbiByZXN1bHRzIChvcHRpbWl6YXRpb24pCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNDQU5fUkVTVUxUX0JVRkZFUl9TSVpFID0gNTEyOwotICAgIHByaXZhdGUgYm9vbGVhbiBtTmVlZFJlY29uZmlnOwotCi0gICAgLyoKLSAgICAgKiBMYXN0IFVJRCB0aGF0IGFza2VkIHRvIGVuYWJsZSBXSUZJLgotICAgICAqLwotICAgIHByaXZhdGUgaW50IG1MYXN0RW5hYmxlVWlkID0gUHJvY2Vzcy5teVVpZCgpOwotCi0gICAgLyoKLSAgICAgKiBMYXN0IFVJRCB0aGF0IGFza2VkIHRvIGVuYWJsZSBXSUZJIEFQLgotICAgICAqLwotICAgIHByaXZhdGUgaW50IG1MYXN0QXBFbmFibGVVaWQgPSBQcm9jZXNzLm15VWlkKCk7Ci0KLQogICAgIC8qKgogICAgICAqIE51bWJlciBvZiBhbGxvd2VkIHJhZGlvIGZyZXF1ZW5jeSBjaGFubmVscyBpbiB2YXJpb3VzIHJlZ3VsYXRvcnkgZG9tYWlucy4KICAgICAgKiBUaGlzIGxpc3QgaXMgc3VmZmljaWVudCBmb3IgODAyLjExYi9nIG5ldHdvcmtzICgyLjRHSHogcmFuZ2UpLgpAQCAtMjA5LDQ3ICsxMjksODAgQEAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUNUSU9OX0RFVklDRV9JRExFID0KICAgICAgICAgICAgICJjb20uYW5kcm9pZC5zZXJ2ZXIuV2lmaU1hbmFnZXIuYWN0aW9uLkRFVklDRV9JRExFIjsKIAotICAgIFdpZmlTZXJ2aWNlKENvbnRleHQgY29udGV4dCwgV2lmaVN0YXRlVHJhY2tlciB0cmFja2VyKSB7CisgICAgcHJpdmF0ZSBib29sZWFuIG1Jc1JlY2VpdmVyUmVnaXN0ZXJlZCA9IGZhbHNlOworCisKKyAgICBOZXR3b3JrSW5mbyBtTmV0d29ya0luZm8gPSBuZXcgTmV0d29ya0luZm8oQ29ubmVjdGl2aXR5TWFuYWdlci5UWVBFX1dJRkksIDAsICJXSUZJIiwgIiIpOworCisgICAgLy8gVmFyaWFibGVzIHJlbGF0aW5nIHRvIHRoZSAnYXZhaWxhYmxlIG5ldHdvcmtzJyBub3RpZmljYXRpb24KKyAgICAvKioKKyAgICAgKiBUaGUgaWNvbiB0byBzaG93IGluIHRoZSAnYXZhaWxhYmxlIG5ldHdvcmtzJyBub3RpZmljYXRpb24uIFRoaXMgd2lsbCBhbHNvCisgICAgICogYmUgdGhlIElEIG9mIHRoZSBOb3RpZmljYXRpb24gZ2l2ZW4gdG8gdGhlIE5vdGlmaWNhdGlvbk1hbmFnZXIuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IElDT05fTkVUV09SS1NfQVZBSUxBQkxFID0KKyAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuZHJhd2FibGUuc3RhdF9ub3RpZnlfd2lmaV9pbl9yYW5nZTsKKyAgICAvKioKKyAgICAgKiBXaGVuIGEgbm90aWZpY2F0aW9uIGlzIHNob3duLCB3ZSB3YWl0IHRoaXMgYW1vdW50IGJlZm9yZSBwb3NzaWJseSBzaG93aW5nIGl0IGFnYWluLgorICAgICAqLworICAgIHByaXZhdGUgZmluYWwgbG9uZyBOT1RJRklDQVRJT05fUkVQRUFUX0RFTEFZX01TOworICAgIC8qKgorICAgICAqIFdoZXRoZXIgdGhlIHVzZXIgaGFzIHNldCB0aGUgc2V0dGluZyB0byBzaG93IHRoZSAnYXZhaWxhYmxlIG5ldHdvcmtzJyBub3RpZmljYXRpb24uCisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIG1Ob3RpZmljYXRpb25FbmFibGVkOworICAgIC8qKgorICAgICAqIE9ic2VydmVzIHRoZSB1c2VyIHNldHRpbmcgdG8ga2VlcCB7QGxpbmsgI21Ob3RpZmljYXRpb25FbmFibGVkfSBpbiBzeW5jLgorICAgICAqLworICAgIHByaXZhdGUgTm90aWZpY2F0aW9uRW5hYmxlZFNldHRpbmdPYnNlcnZlciBtTm90aWZpY2F0aW9uRW5hYmxlZFNldHRpbmdPYnNlcnZlcjsKKyAgICAvKioKKyAgICAgKiBUaGUge0BsaW5rIFN5c3RlbSNjdXJyZW50VGltZU1pbGxpcygpfSBtdXN0IGJlIGF0IGxlYXN0IHRoaXMgdmFsdWUgZm9yIHVzCisgICAgICogdG8gc2hvdyB0aGUgbm90aWZpY2F0aW9uIGFnYWluLgorICAgICAqLworICAgIHByaXZhdGUgbG9uZyBtTm90aWZpY2F0aW9uUmVwZWF0VGltZTsKKyAgICAvKioKKyAgICAgKiBUaGUgTm90aWZpY2F0aW9uIG9iamVjdCBnaXZlbiB0byB0aGUgTm90aWZpY2F0aW9uTWFuYWdlci4KKyAgICAgKi8KKyAgICBwcml2YXRlIE5vdGlmaWNhdGlvbiBtTm90aWZpY2F0aW9uOworICAgIC8qKgorICAgICAqIFdoZXRoZXIgdGhlIG5vdGlmaWNhdGlvbiBpcyBiZWluZyBzaG93biwgYXMgc2V0IGJ5IHVzLiBUaGF0IGlzLCBpZiB0aGUKKyAgICAgKiB1c2VyIGNhbmNlbHMgdGhlIG5vdGlmaWNhdGlvbiwgd2Ugd2lsbCBub3QgcmVjZWl2ZSB0aGUgY2FsbGJhY2sgc28gdGhpcworICAgICAqIHdpbGwgc3RpbGwgYmUgdHJ1ZS4gV2Ugb25seSBndWFyYW50ZWUgaWYgdGhpcyBpcyBmYWxzZSwgdGhlbiB0aGUKKyAgICAgKiBub3RpZmljYXRpb24gaXMgbm90IHNob3dpbmcuCisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIG1Ob3RpZmljYXRpb25TaG93bjsKKyAgICAvKioKKyAgICAgKiBUaGUgbnVtYmVyIG9mIGNvbnRpbnVvdXMgc2NhbnMgdGhhdCBtdXN0IG9jY3VyIGJlZm9yZSBjb25zaWRlciB0aGUKKyAgICAgKiBzdXBwbGljYW50IGluIGEgc2Nhbm5pbmcgc3RhdGUuIFRoaXMgYWxsb3dzIHN1cHBsaWNhbnQgdG8gYXNzb2NpYXRlIHdpdGgKKyAgICAgKiByZW1lbWJlcmVkIG5ldHdvcmtzIHRoYXQgYXJlIGluIHRoZSBzY2FuIHJlc3VsdHMuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE5VTV9TQ0FOU19CRUZPUkVfQUNUVUFMTFlfU0NBTk5JTkcgPSAzOworICAgIC8qKgorICAgICAqIFRoZSBudW1iZXIgb2Ygc2NhbnMgc2luY2UgdGhlIGxhc3QgbmV0d29yayBzdGF0ZSBjaGFuZ2UuIFdoZW4gdGhpcworICAgICAqIGV4Y2VlZHMge0BsaW5rICNOVU1fU0NBTlNfQkVGT1JFX0FDVFVBTExZX1NDQU5OSU5HfSwgd2UgY29uc2lkZXIgdGhlCisgICAgICogc3VwcGxpY2FudCB0byBhY3R1YWxseSBiZSBzY2FubmluZy4gV2hlbiB0aGUgbmV0d29yayBzdGF0ZSBjaGFuZ2VzIHRvCisgICAgICogc29tZXRoaW5nIG90aGVyIHRoYW4gc2Nhbm5pbmcsIHdlIHJlc2V0IHRoaXMgdG8gMC4KKyAgICAgKi8KKyAgICBwcml2YXRlIGludCBtTnVtU2NhbnNTaW5jZU5ldHdvcmtTdGF0ZUNoYW5nZTsKKworCisgICAgV2lmaVNlcnZpY2UoQ29udGV4dCBjb250ZXh0KSB7CiAgICAgICAgIG1Db250ZXh0ID0gY29udGV4dDsKLSAgICAgICAgbVdpZmlTdGF0ZVRyYWNrZXIgPSB0cmFja2VyOwotICAgICAgICBtV2lmaVN0YXRlVHJhY2tlci5lbmFibGVSc3NpUG9sbGluZyh0cnVlKTsKKyAgICAgICAgbVdpZmlTdGF0ZU1hY2hpbmUgPSBuZXcgV2lmaVN0YXRlTWFjaGluZShtQ29udGV4dCk7CisgICAgICAgIG1XaWZpU3RhdGVNYWNoaW5lLmVuYWJsZVJzc2lQb2xsaW5nKHRydWUpOwogICAgICAgICBtQmF0dGVyeVN0YXRzID0gQmF0dGVyeVN0YXRzU2VydmljZS5nZXRTZXJ2aWNlKCk7CiAKLSAgICAgICAgSUJpbmRlciBiID0gU2VydmljZU1hbmFnZXIuZ2V0U2VydmljZShDb250ZXh0Lk5FVFdPUktNQU5BR0VNRU5UX1NFUlZJQ0UpOwotICAgICAgICBud1NlcnZpY2UgPSBJTmV0d29ya01hbmFnZW1lbnRTZXJ2aWNlLlN0dWIuYXNJbnRlcmZhY2UoYik7Ci0KLSAgICAgICAgbVNjYW5SZXN1bHRDYWNoZSA9IG5ldyBMaW5rZWRIYXNoTWFwPFN0cmluZywgU2NhblJlc3VsdD4oCi0gICAgICAgICAgICBTQ0FOX1JFU1VMVF9DQUNIRV9TSVpFLCAwLjc1ZiwgdHJ1ZSkgewotICAgICAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgICAgICogTGltaXQgdGhlIGNhY2hlIHNpemUgYnkgU0NBTl9SRVNVTFRfQ0FDSEVfU0laRQotICAgICAgICAgICAgICAgICAqIGVsZW1lbnRzCi0gICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gcmVtb3ZlRWxkZXN0RW50cnkoTWFwLkVudHJ5IGVsZGVzdCkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gU0NBTl9SRVNVTFRfQ0FDSEVfU0laRSA8IHRoaXMuc2l6ZSgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH07Ci0KLSAgICAgICAgSGFuZGxlclRocmVhZCB3aWZpVGhyZWFkID0gbmV3IEhhbmRsZXJUaHJlYWQoIldpZmlTZXJ2aWNlIik7Ci0gICAgICAgIHdpZmlUaHJlYWQuc3RhcnQoKTsKLSAgICAgICAgbVdpZmlIYW5kbGVyID0gbmV3IFdpZmlIYW5kbGVyKHdpZmlUaHJlYWQuZ2V0TG9vcGVyKCkpOwotCi0gICAgICAgIG1XaWZpU3RhdGVUcmFja2VyLnNldFdpZmlTdGF0ZShXSUZJX1NUQVRFX0RJU0FCTEVEKTsKLSAgICAgICAgbVdpZmlBcFN0YXRlID0gV0lGSV9BUF9TVEFURV9ESVNBQkxFRDsKLQogICAgICAgICBtQWxhcm1NYW5hZ2VyID0gKEFsYXJtTWFuYWdlciltQ29udGV4dC5nZXRTeXN0ZW1TZXJ2aWNlKENvbnRleHQuQUxBUk1fU0VSVklDRSk7CiAgICAgICAgIEludGVudCBpZGxlSW50ZW50ID0gbmV3IEludGVudChBQ1RJT05fREVWSUNFX0lETEUsIG51bGwpOwogICAgICAgICBtSWRsZUludGVudCA9IFBlbmRpbmdJbnRlbnQuZ2V0QnJvYWRjYXN0KG1Db250ZXh0LCBJRExFX1JFUVVFU1QsIGlkbGVJbnRlbnQsIDApOwogCi0gICAgICAgIFBvd2VyTWFuYWdlciBwb3dlck1hbmFnZXIgPSAoUG93ZXJNYW5hZ2VyKW1Db250ZXh0LmdldFN5c3RlbVNlcnZpY2UoQ29udGV4dC5QT1dFUl9TRVJWSUNFKTsKLSAgICAgICAgc1dha2VMb2NrID0gcG93ZXJNYW5hZ2VyLm5ld1dha2VMb2NrKFBvd2VyTWFuYWdlci5QQVJUSUFMX1dBS0VfTE9DSywgV0FLRUxPQ0tfVEFHKTsKLSAgICAgICAgc0RyaXZlclN0b3BXYWtlTG9jayA9IHBvd2VyTWFuYWdlci5uZXdXYWtlTG9jayhQb3dlck1hbmFnZXIuUEFSVElBTF9XQUtFX0xPQ0ssIFdBS0VMT0NLX1RBRyk7CisgICAgICAgIEhhbmRsZXJUaHJlYWQgd2lmaVRocmVhZCA9IG5ldyBIYW5kbGVyVGhyZWFkKCJXaWZpU2VydmljZSIpOworICAgICAgICB3aWZpVGhyZWFkLnN0YXJ0KCk7CiAKICAgICAgICAgbUNvbnRleHQucmVnaXN0ZXJSZWNlaXZlcigKICAgICAgICAgICAgICAgICBuZXcgQnJvYWRjYXN0UmVjZWl2ZXIoKSB7CiAgICAgICAgICAgICAgICAgICAgIEBPdmVycmlkZQogICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBvblJlY2VpdmUoQ29udGV4dCBjb250ZXh0LCBJbnRlbnQgaW50ZW50KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjbGVhciBvdXIgZmxhZyBpbmRpY2F0aW5nIHRoZSB1c2VyIGhhcyBvdmVyd3JpZGRlbiBhaXJwbGFuZSBtb2RlCi0gICAgICAgICAgICAgICAgICAgICAgICBtQWlycGxhbmVNb2RlT3ZlcndyaWRkZW4gPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1BaXJwbGFuZU1vZGVPdmVyd3JpZGRlbi5zZXQoZmFsc2UpOwogICAgICAgICAgICAgICAgICAgICAgICAgLy8gb24gYWlycGxhbmUgZGlzYWJsZSwgcmVzdG9yZSBXaWZpIGlmIHRoZSBzYXZlZCBzdGF0ZSBpbmRpY2F0ZXMgc28KICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaXNBaXJwbGFuZU1vZGVPbigpICYmIHRlc3RBbmRDbGVhcldpZmlTYXZlZFN0YXRlKCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZXJzaXN0V2lmaUVuYWJsZWQodHJ1ZSk7CkBAIC0yNjQsMTQgKzIxNyw1MCBAQAogICAgICAgICAgICAgICAgIEBPdmVycmlkZQogICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uUmVjZWl2ZShDb250ZXh0IGNvbnRleHQsIEludGVudCBpbnRlbnQpIHsKIAotICAgICAgICAgICAgICAgICAgQXJyYXlMaXN0PFN0cmluZz4gYXZhaWxhYmxlID0gaW50ZW50LmdldFN0cmluZ0FycmF5TGlzdEV4dHJhKAotICAgICAgICAgICAgICAgICAgICAgICAgICBDb25uZWN0aXZpdHlNYW5hZ2VyLkVYVFJBX0FWQUlMQUJMRV9URVRIRVIpOwotICAgICAgICAgICAgICAgICAgQXJyYXlMaXN0PFN0cmluZz4gYWN0aXZlID0gaW50ZW50LmdldFN0cmluZ0FycmF5TGlzdEV4dHJhKAotICAgICAgICAgICAgICAgICAgICAgICAgICBDb25uZWN0aXZpdHlNYW5hZ2VyLkVYVFJBX0FDVElWRV9URVRIRVIpOwotICAgICAgICAgICAgICAgICAgdXBkYXRlVGV0aGVyU3RhdGUoYXZhaWxhYmxlLCBhY3RpdmUpOworICAgICAgICAgICAgICAgICAgICBBcnJheUxpc3Q8U3RyaW5nPiBhdmFpbGFibGUgPSBpbnRlbnQuZ2V0U3RyaW5nQXJyYXlMaXN0RXh0cmEoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29ubmVjdGl2aXR5TWFuYWdlci5FWFRSQV9BVkFJTEFCTEVfVEVUSEVSKTsKKyAgICAgICAgICAgICAgICAgICAgQXJyYXlMaXN0PFN0cmluZz4gYWN0aXZlID0gaW50ZW50LmdldFN0cmluZ0FycmF5TGlzdEV4dHJhKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbm5lY3Rpdml0eU1hbmFnZXIuRVhUUkFfQUNUSVZFX1RFVEhFUik7CisgICAgICAgICAgICAgICAgICAgIHVwZGF0ZVRldGhlclN0YXRlKGF2YWlsYWJsZSwgYWN0aXZlKTsKIAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0sbmV3IEludGVudEZpbHRlcihDb25uZWN0aXZpdHlNYW5hZ2VyLkFDVElPTl9URVRIRVJfU1RBVEVfQ0hBTkdFRCkpOworCisgICAgICAgIEludGVudEZpbHRlciBmaWx0ZXIgPSBuZXcgSW50ZW50RmlsdGVyKCk7CisgICAgICAgIGZpbHRlci5hZGRBY3Rpb24oV2lmaU1hbmFnZXIuV0lGSV9TVEFURV9DSEFOR0VEX0FDVElPTik7CisgICAgICAgIGZpbHRlci5hZGRBY3Rpb24oV2lmaU1hbmFnZXIuTkVUV09SS19TVEFURV9DSEFOR0VEX0FDVElPTik7CisgICAgICAgIGZpbHRlci5hZGRBY3Rpb24oV2lmaU1hbmFnZXIuU0NBTl9SRVNVTFRTX0FWQUlMQUJMRV9BQ1RJT04pOworCisgICAgICAgIG1Db250ZXh0LnJlZ2lzdGVyUmVjZWl2ZXIoCisgICAgICAgICAgICAgICAgbmV3IEJyb2FkY2FzdFJlY2VpdmVyKCkgeworICAgICAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgb25SZWNlaXZlKENvbnRleHQgY29udGV4dCwgSW50ZW50IGludGVudCkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGludGVudC5nZXRBY3Rpb24oKS5lcXVhbHMoV2lmaU1hbmFnZXIuV0lGSV9TVEFURV9DSEFOR0VEX0FDVElPTikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZXNldCAmIGNsZWFyIG5vdGlmaWNhdGlvbiBvbiBhbnkgd2lmaSBzdGF0ZSBjaGFuZ2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNldE5vdGlmaWNhdGlvbigpOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChpbnRlbnQuZ2V0QWN0aW9uKCkuZXF1YWxzKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXaWZpTWFuYWdlci5ORVRXT1JLX1NUQVRFX0NIQU5HRURfQUNUSU9OKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1OZXR3b3JrSW5mbyA9IChOZXR3b3JrSW5mbykgaW50ZW50LmdldFBhcmNlbGFibGVFeHRyYSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdpZmlNYW5hZ2VyLkVYVFJBX05FVFdPUktfSU5GTyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVzZXQgJiBjbGVhciBub3RpZmljYXRpb24gb24gYSBuZXR3b3JrIGNvbm5lY3QgJiBkaXNjb25uZWN0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoKG1OZXR3b3JrSW5mby5nZXREZXRhaWxlZFN0YXRlKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBDT05ORUNURUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgRElTQ09OTkVDVEVEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzZXROb3RpZmljYXRpb24oKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoaW50ZW50LmdldEFjdGlvbigpLmVxdWFscygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2lmaU1hbmFnZXIuU0NBTl9SRVNVTFRTX0FWQUlMQUJMRV9BQ1RJT04pKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2tBbmRTZXROb3RpZmljYXRpb24oKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0sIGZpbHRlcik7CisKKyAgICAgICAgLy8gU2V0dGluZyBpcyBpbiBzZWNvbmRzCisgICAgICAgIE5PVElGSUNBVElPTl9SRVBFQVRfREVMQVlfTVMgPSBTZXR0aW5ncy5TZWN1cmUuZ2V0SW50KGNvbnRleHQuZ2V0Q29udGVudFJlc29sdmVyKCksCisgICAgICAgICAgICAgICAgU2V0dGluZ3MuU2VjdXJlLldJRklfTkVUV09SS1NfQVZBSUxBQkxFX1JFUEVBVF9ERUxBWSwgOTAwKSAqIDEwMDBsOworICAgICAgICBtTm90aWZpY2F0aW9uRW5hYmxlZFNldHRpbmdPYnNlcnZlciA9IG5ldyBOb3RpZmljYXRpb25FbmFibGVkU2V0dGluZ09ic2VydmVyKG5ldyBIYW5kbGVyKCkpOworICAgICAgICBtTm90aWZpY2F0aW9uRW5hYmxlZFNldHRpbmdPYnNlcnZlci5yZWdpc3RlcigpOwogICAgIH0KIAogICAgIC8qKgpAQCAtMjgwLDcgKzI2OSw3IEBACiAgICAgICoKICAgICAgKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgb25seSBhdCBib290IHRpbWUKICAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzdGFydFdpZmkoKSB7CisgICAgcHVibGljIHZvaWQgY2hlY2tBbmRTdGFydFdpZmkoKSB7CiAgICAgICAgIC8qIFN0YXJ0IGlmIFdpLUZpIGlzIGVuYWJsZWQgb3IgdGhlIHNhdmVkIHN0YXRlIGluZGljYXRlcyBXaS1GaSB3YXMgb24gKi8KICAgICAgICAgYm9vbGVhbiB3aWZpRW5hYmxlZCA9ICFpc0FpcnBsYW5lTW9kZU9uKCkKICAgICAgICAgICAgICAgICAmJiAoZ2V0UGVyc2lzdGVkV2lmaUVuYWJsZWQoKSB8fCB0ZXN0QW5kQ2xlYXJXaWZpU2F2ZWRTdGF0ZSgpKTsKQEAgLTI5Nyw3ICsyODYsMTAgQEAKICAgICAgICAgSUJpbmRlciBiID0gU2VydmljZU1hbmFnZXIuZ2V0U2VydmljZShDb250ZXh0Lk5FVFdPUktNQU5BR0VNRU5UX1NFUlZJQ0UpOwogICAgICAgICBJTmV0d29ya01hbmFnZW1lbnRTZXJ2aWNlIHNlcnZpY2UgPSBJTmV0d29ya01hbmFnZW1lbnRTZXJ2aWNlLlN0dWIuYXNJbnRlcmZhY2UoYik7CiAKLSAgICAgICAgbUNtID0gKENvbm5lY3Rpdml0eU1hbmFnZXIpbUNvbnRleHQuZ2V0U3lzdGVtU2VydmljZShDb250ZXh0LkNPTk5FQ1RJVklUWV9TRVJWSUNFKTsKKyAgICAgICAgaWYgKG1DbSA9PSBudWxsKSB7CisgICAgICAgICAgICBtQ20gPSAoQ29ubmVjdGl2aXR5TWFuYWdlciltQ29udGV4dC5nZXRTeXN0ZW1TZXJ2aWNlKENvbnRleHQuQ09OTkVDVElWSVRZX1NFUlZJQ0UpOworICAgICAgICB9CisKICAgICAgICAgbVdpZmlSZWdleHMgPSBtQ20uZ2V0VGV0aGVyYWJsZVdpZmlSZWdleHMoKTsKIAogICAgICAgICBmb3IgKFN0cmluZyBpbnRmIDogYXZhaWxhYmxlKSB7CkBAIC0zMTcsMTcgKzMwOSwxNCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgU2xvZy5lKFRBRywgIkVycm9yIGNvbmZpZ3VyaW5nIGludGVyZmFjZSAiICsgaW50ZiArICIsIDoiICsgZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG53U2VydmljZS5zdG9wQWNjZXNzUG9pbnQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNsb2cuZShUQUcsICJDb3VsZCBub3Qgc3RvcCBBUCwgOiIgKyBlZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBzZXRXaWZpQXBFbmFibGVkU3RhdGUoV0lGSV9BUF9TVEFURV9GQUlMRUQsIDAsIERyaXZlckFjdGlvbi5EUklWRVJfVU5MT0FEKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNldFdpZmlBcEVuYWJsZWQobnVsbCwgZmFsc2UpOwogICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICAgICAgaWYobUNtLnRldGhlcihpbnRmKSAhPSBDb25uZWN0aXZpdHlNYW5hZ2VyLlRFVEhFUl9FUlJPUl9OT19FUlJPUikgewotICAgICAgICAgICAgICAgICAgICAgICAgU2xvZy5lKFRBRywgIkVycm9yIHRldGhlcmluZyAiK2ludGYpOworICAgICAgICAgICAgICAgICAgICAgICAgU2xvZy5lKFRBRywgIkVycm9yIHRldGhlcmluZyBvbiAiICsgaW50Zik7CisgICAgICAgICAgICAgICAgICAgICAgICBzZXRXaWZpQXBFbmFibGVkKG51bGwsIGZhbHNlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICB9CkBAIC0zNjMsMTkwICszNTIsMjEgQEAKICAgICAgICAgU2V0dGluZ3MuU2VjdXJlLnB1dEludChjciwgU2V0dGluZ3MuU2VjdXJlLldJRklfT04sIGVuYWJsZWQgPyAxIDogMCk7CiAgICAgfQogCi0gICAgTmV0d29ya1N0YXRlVHJhY2tlciBnZXROZXR3b3JrU3RhdGVUcmFja2VyKCkgewotICAgICAgICByZXR1cm4gbVdpZmlTdGF0ZVRyYWNrZXI7Ci0gICAgfQotCiAgICAgLyoqCiAgICAgICogc2VlIHtAbGluayBhbmRyb2lkLm5ldC53aWZpLldpZmlNYW5hZ2VyI3BpbmdTdXBwbGljYW50KCl9Ci0gICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhlIG9wZXJhdGlvbiBzdWNjZWVkcworICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoZSBvcGVyYXRpb24gc3VjY2VlZHMsIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gcGluZ1N1cHBsaWNhbnQoKSB7Ci0gICAgICAgIGVuZm9yY2VDaGFuZ2VQZXJtaXNzaW9uKCk7Ci0KLSAgICAgICAgcmV0dXJuIG1XaWZpU3RhdGVUcmFja2VyLnBpbmcoKTsKKyAgICAgICAgZW5mb3JjZUFjY2Vzc1Blcm1pc3Npb24oKTsKKyAgICAgICAgcmV0dXJuIG1XaWZpU3RhdGVNYWNoaW5lLnN5bmNQaW5nU3VwcGxpY2FudCgpOwogICAgIH0KIAogICAgIC8qKgogICAgICAqIHNlZSB7QGxpbmsgYW5kcm9pZC5uZXQud2lmaS5XaWZpTWFuYWdlciNzdGFydFNjYW4oKX0KLSAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGUgb3BlcmF0aW9uIHN1Y2NlZWRzCiAgICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gc3RhcnRTY2FuKGJvb2xlYW4gZm9yY2VBY3RpdmUpIHsKKyAgICBwdWJsaWMgdm9pZCBzdGFydFNjYW4oYm9vbGVhbiBmb3JjZUFjdGl2ZSkgewogICAgICAgICBlbmZvcmNlQ2hhbmdlUGVybWlzc2lvbigpOwotCi0gICAgICAgIHN3aXRjaCAobVdpZmlTdGF0ZVRyYWNrZXIuZ2V0U3VwcGxpY2FudFN0YXRlKCkpIHsKLSAgICAgICAgICAgIGNhc2UgRElTQ09OTkVDVEVEOgotICAgICAgICAgICAgY2FzZSBJTkFDVElWRToKLSAgICAgICAgICAgIGNhc2UgU0NBTk5JTkc6Ci0gICAgICAgICAgICBjYXNlIERPUk1BTlQ6Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIG1XaWZpU3RhdGVUcmFja2VyLnNldFNjYW5SZXN1bHRIYW5kbGluZygKLSAgICAgICAgICAgICAgICAgICAgICAgIFdpZmlTdGF0ZVRyYWNrZXIuU1VQUExfU0NBTl9IQU5ETElOR19MSVNUX09OTFkpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBtV2lmaVN0YXRlVHJhY2tlci5zY2FuKGZvcmNlQWN0aXZlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBzZWUge0BsaW5rIGFuZHJvaWQubmV0LndpZmkuV2lmaU1hbmFnZXIjc2V0V2lmaUVuYWJsZWQoYm9vbGVhbil9Ci0gICAgICogQHBhcmFtIGVuYWJsZSB7QGNvZGUgdHJ1ZX0gdG8gZW5hYmxlLCB7QGNvZGUgZmFsc2V9IHRvIGRpc2FibGUuCi0gICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhlIGVuYWJsZS9kaXNhYmxlIG9wZXJhdGlvbiB3YXMKLSAgICAgKiAgICAgICAgIHN0YXJ0ZWQgb3IgaXMgYWxyZWFkeSBpbiB0aGUgcXVldWUuCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gc2V0V2lmaUVuYWJsZWQoYm9vbGVhbiBlbmFibGUpIHsKLSAgICAgICAgZW5mb3JjZUNoYW5nZVBlcm1pc3Npb24oKTsKLSAgICAgICAgaWYgKG1XaWZpSGFuZGxlciA9PSBudWxsKSByZXR1cm4gZmFsc2U7Ci0KLSAgICAgICAgc3luY2hyb25pemVkIChtV2lmaUhhbmRsZXIpIHsKLSAgICAgICAgICAgIC8vIGNhbGxlciBtYXkgbm90IGhhdmUgV0FLRV9MT0NLIHBlcm1pc3Npb24gLSBpdCdzIG5vdCByZXF1aXJlZCBoZXJlCi0gICAgICAgICAgICBsb25nIGlkZW50ID0gQmluZGVyLmNsZWFyQ2FsbGluZ0lkZW50aXR5KCk7Ci0gICAgICAgICAgICBzV2FrZUxvY2suYWNxdWlyZSgpOwotICAgICAgICAgICAgQmluZGVyLnJlc3RvcmVDYWxsaW5nSWRlbnRpdHkoaWRlbnQpOwotCi0gICAgICAgICAgICBtTGFzdEVuYWJsZVVpZCA9IEJpbmRlci5nZXRDYWxsaW5nVWlkKCk7Ci0gICAgICAgICAgICAvLyBzZXQgYSBmbGFnIGlmIHRoZSB1c2VyIGlzIGVuYWJsaW5nIFdpZmkgd2hpbGUgaW4gYWlycGxhbmUgbW9kZQotICAgICAgICAgICAgbUFpcnBsYW5lTW9kZU92ZXJ3cmlkZGVuID0gKGVuYWJsZSAmJiBpc0FpcnBsYW5lTW9kZU9uKCkgJiYgaXNBaXJwbGFuZVRvZ2dsZWFibGUoKSk7Ci0gICAgICAgICAgICBzZW5kRW5hYmxlTWVzc2FnZShlbmFibGUsIHRydWUsIEJpbmRlci5nZXRDYWxsaW5nVWlkKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRW5hYmxlcy9kaXNhYmxlcyBXaS1GaSBzeW5jaHJvbm91c2x5LgotICAgICAqIEBwYXJhbSBlbmFibGUge0Bjb2RlIHRydWV9IHRvIHR1cm4gV2ktRmkgb24sIHtAY29kZSBmYWxzZX0gdG8gdHVybiBpdCBvZmYuCi0gICAgICogQHBhcmFtIHBlcnNpc3Qge0Bjb2RlIHRydWV9IGlmIHRoZSBzZXR0aW5nIHNob3VsZCBiZSBwZXJzaXN0ZWQuCi0gICAgICogQHBhcmFtIHVpZCBUaGUgVUlEIG9mIHRoZSBwcm9jZXNzIG1ha2luZyB0aGUgcmVxdWVzdC4KLSAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGUgb3BlcmF0aW9uIHN1Y2NlZWRzIChvciBpZiB0aGUgZXhpc3Rpbmcgc3RhdGUKLSAgICAgKiAgICAgICAgIGlzIHRoZSBzYW1lIGFzIHRoZSByZXF1ZXN0ZWQgc3RhdGUpCi0gICAgICovCi0gICAgcHJpdmF0ZSBib29sZWFuIHNldFdpZmlFbmFibGVkQmxvY2tpbmcoYm9vbGVhbiBlbmFibGUsIGJvb2xlYW4gcGVyc2lzdCwgaW50IHVpZCkgewotICAgICAgICBmaW5hbCBpbnQgZXZlbnR1YWxXaWZpU3RhdGUgPSBlbmFibGUgPyBXSUZJX1NUQVRFX0VOQUJMRUQgOiBXSUZJX1NUQVRFX0RJU0FCTEVEOwotICAgICAgICBmaW5hbCBpbnQgd2lmaVN0YXRlID0gbVdpZmlTdGF0ZVRyYWNrZXIuZ2V0V2lmaVN0YXRlKCk7Ci0KLSAgICAgICAgaWYgKHdpZmlTdGF0ZSA9PSBldmVudHVhbFdpZmlTdGF0ZSkgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGVuYWJsZSAmJiBpc0FpcnBsYW5lTW9kZU9uKCkgJiYgIW1BaXJwbGFuZU1vZGVPdmVyd3JpZGRlbikgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIE11bHRpcGxlIGNhbGxzIHRvIHVucmVnaXN0ZXJSZWNlaXZlcigpIGNhdXNlIGV4Y2VwdGlvbiBhbmQgYSBzeXN0ZW0gY3Jhc2guCi0gICAgICAgICAqIFRoaXMgY2FuIGhhcHBlbiBpZiBhIHN1cHBsaWNhbnQgaXMgbG9zdCAob3IgZmlybXdhcmUgY3Jhc2ggb2NjdXJzKSBhbmQgdXNlciBpbmRpY2F0ZXMKLSAgICAgICAgICogZGlzYWJsZSB3aWZpIGF0IHRoZSBzYW1lIHRpbWUuCi0gICAgICAgICAqIEF2b2lkIGRvaW5nIGEgZGlzYWJsZSB3aGVuIHRoZSBjdXJyZW50IFdpZmkgc3RhdGUgaXMgVU5LTk9XTgotICAgICAgICAgKiBUT0RPOiBIYW5kbGUgZHJpdmVyIGxvYWQgZmFpbCBhbmQgc3VwcGxpY2FudCBsb3N0IGFzIHNlcGVyYXRlIHN0YXRlcwotICAgICAgICAgKi8KLSAgICAgICAgaWYgKCh3aWZpU3RhdGUgPT0gV0lGSV9TVEFURV9VTktOT1dOKSAmJiAhZW5hYmxlKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogRmFpbCBXaWZpIGlmIEFQIGlzIGVuYWJsZWQKLSAgICAgICAgICogVE9ETzogRGVwcmVjYXRlIFdJRklfU1RBVEVfVU5LTk9XTiBhbmQgcmVuYW1lIGl0Ci0gICAgICAgICAqIFdJRklfU1RBVEVfRkFJTEVECi0gICAgICAgICAqLwotICAgICAgICBpZiAoKG1XaWZpQXBTdGF0ZSA9PSBXSUZJX0FQX1NUQVRFX0VOQUJMRUQpICYmIGVuYWJsZSkgewotICAgICAgICAgICAgc2V0V2lmaUVuYWJsZWRTdGF0ZShXSUZJX1NUQVRFX1VOS05PV04sIHVpZCk7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICBzZXRXaWZpRW5hYmxlZFN0YXRlKGVuYWJsZSA/IFdJRklfU1RBVEVfRU5BQkxJTkcgOiBXSUZJX1NUQVRFX0RJU0FCTElORywgdWlkKTsKLQotICAgICAgICBpZiAoZW5hYmxlKSB7Ci0gICAgICAgICAgICBpZiAoIW1XaWZpU3RhdGVUcmFja2VyLmxvYWREcml2ZXIoKSkgewotICAgICAgICAgICAgICAgIFNsb2cuZShUQUcsICJGYWlsZWQgdG8gbG9hZCBXaS1GaSBkcml2ZXIuIik7Ci0gICAgICAgICAgICAgICAgc2V0V2lmaUVuYWJsZWRTdGF0ZShXSUZJX1NUQVRFX1VOS05PV04sIHVpZCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKCFtV2lmaVN0YXRlVHJhY2tlci5zdGFydFN1cHBsaWNhbnQoKSkgewotICAgICAgICAgICAgICAgIG1XaWZpU3RhdGVUcmFja2VyLnVubG9hZERyaXZlcigpOwotICAgICAgICAgICAgICAgIFNsb2cuZShUQUcsICJGYWlsZWQgdG8gc3RhcnQgc3VwcGxpY2FudCBkYWVtb24uIik7Ci0gICAgICAgICAgICAgICAgc2V0V2lmaUVuYWJsZWRTdGF0ZShXSUZJX1NUQVRFX1VOS05PV04sIHVpZCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZWdpc3RlckZvckJyb2FkY2FzdHMoKTsKLSAgICAgICAgICAgIG1XaWZpU3RhdGVUcmFja2VyLnN0YXJ0RXZlbnRMb29wKCk7Ci0KLSAgICAgICAgfSBlbHNlIHsKLQotICAgICAgICAgICAgbUNvbnRleHQudW5yZWdpc3RlclJlY2VpdmVyKG1SZWNlaXZlcik7Ci0gICAgICAgICAgIC8vIFJlbW92ZSBub3RpZmljYXRpb24gKGl0IHdpbGwgbm8tb3AgaWYgaXQgaXNuJ3QgdmlzaWJsZSkKLSAgICAgICAgICAgIG1XaWZpU3RhdGVUcmFja2VyLnNldE5vdGlmaWNhdGlvblZpc2libGUoZmFsc2UsIDAsIGZhbHNlLCAwKTsKLQotICAgICAgICAgICAgYm9vbGVhbiBmYWlsZWRUb1N0b3BTdXBwbGljYW50T3JVbmxvYWREcml2ZXIgPSBmYWxzZTsKLQotICAgICAgICAgICAgaWYgKCFtV2lmaVN0YXRlVHJhY2tlci5zdG9wU3VwcGxpY2FudCgpKSB7Ci0gICAgICAgICAgICAgICAgU2xvZy5lKFRBRywgIkZhaWxlZCB0byBzdG9wIHN1cHBsaWNhbnQgZGFlbW9uLiIpOwotICAgICAgICAgICAgICAgIHNldFdpZmlFbmFibGVkU3RhdGUoV0lGSV9TVEFURV9VTktOT1dOLCB1aWQpOwotICAgICAgICAgICAgICAgIGZhaWxlZFRvU3RvcFN1cHBsaWNhbnRPclVubG9hZERyaXZlciA9IHRydWU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICogUmVzZXQgY29ubmVjdGlvbnMgYW5kIGRpc2FibGUgaW50ZXJmYWNlCi0gICAgICAgICAgICAgKiBiZWZvcmUgd2UgdW5sb2FkIHRoZSBkcml2ZXIKLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgbVdpZmlTdGF0ZVRyYWNrZXIucmVzZXRDb25uZWN0aW9ucyh0cnVlKTsKLQotICAgICAgICAgICAgaWYgKCFtV2lmaVN0YXRlVHJhY2tlci51bmxvYWREcml2ZXIoKSkgewotICAgICAgICAgICAgICAgIFNsb2cuZShUQUcsICJGYWlsZWQgdG8gdW5sb2FkIFdpLUZpIGRyaXZlci4iKTsKLSAgICAgICAgICAgICAgICBpZiAoIWZhaWxlZFRvU3RvcFN1cHBsaWNhbnRPclVubG9hZERyaXZlcikgewotICAgICAgICAgICAgICAgICAgICBzZXRXaWZpRW5hYmxlZFN0YXRlKFdJRklfU1RBVEVfVU5LTk9XTiwgdWlkKTsKLSAgICAgICAgICAgICAgICAgICAgZmFpbGVkVG9TdG9wU3VwcGxpY2FudE9yVW5sb2FkRHJpdmVyID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChmYWlsZWRUb1N0b3BTdXBwbGljYW50T3JVbmxvYWREcml2ZXIpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBTdWNjZXNzIQotCi0gICAgICAgIGlmIChwZXJzaXN0KSB7Ci0gICAgICAgICAgICBwZXJzaXN0V2lmaUVuYWJsZWQoZW5hYmxlKTsKLSAgICAgICAgfQotICAgICAgICBzZXRXaWZpRW5hYmxlZFN0YXRlKGV2ZW50dWFsV2lmaVN0YXRlLCB1aWQpOwotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgc2V0V2lmaUVuYWJsZWRTdGF0ZShpbnQgd2lmaVN0YXRlLCBpbnQgdWlkKSB7Ci0gICAgICAgIGZpbmFsIGludCBwcmV2aW91c1dpZmlTdGF0ZSA9IG1XaWZpU3RhdGVUcmFja2VyLmdldFdpZmlTdGF0ZSgpOwotCi0gICAgICAgIGxvbmcgaWRlbnQgPSBCaW5kZXIuY2xlYXJDYWxsaW5nSWRlbnRpdHkoKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGlmICh3aWZpU3RhdGUgPT0gV0lGSV9TVEFURV9FTkFCTEVEKSB7Ci0gICAgICAgICAgICAgICAgbUJhdHRlcnlTdGF0cy5ub3RlV2lmaU9uKHVpZCk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKHdpZmlTdGF0ZSA9PSBXSUZJX1NUQVRFX0RJU0FCTEVEKSB7Ci0gICAgICAgICAgICAgICAgbUJhdHRlcnlTdGF0cy5ub3RlV2lmaU9mZih1aWQpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgewotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgQmluZGVyLnJlc3RvcmVDYWxsaW5nSWRlbnRpdHkoaWRlbnQpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gVXBkYXRlIHN0YXRlCi0gICAgICAgIG1XaWZpU3RhdGVUcmFja2VyLnNldFdpZmlTdGF0ZSh3aWZpU3RhdGUpOwotCi0gICAgICAgIC8vIEJyb2FkY2FzdAotICAgICAgICBmaW5hbCBJbnRlbnQgaW50ZW50ID0gbmV3IEludGVudChXaWZpTWFuYWdlci5XSUZJX1NUQVRFX0NIQU5HRURfQUNUSU9OKTsKLSAgICAgICAgaW50ZW50LmFkZEZsYWdzKEludGVudC5GTEFHX1JFQ0VJVkVSX1JFR0lTVEVSRURfT05MWV9CRUZPUkVfQk9PVCk7Ci0gICAgICAgIGludGVudC5wdXRFeHRyYShXaWZpTWFuYWdlci5FWFRSQV9XSUZJX1NUQVRFLCB3aWZpU3RhdGUpOwotICAgICAgICBpbnRlbnQucHV0RXh0cmEoV2lmaU1hbmFnZXIuRVhUUkFfUFJFVklPVVNfV0lGSV9TVEFURSwgcHJldmlvdXNXaWZpU3RhdGUpOwotICAgICAgICBtQ29udGV4dC5zZW5kU3RpY2t5QnJvYWRjYXN0KGludGVudCk7CisgICAgICAgIG1XaWZpU3RhdGVNYWNoaW5lLnN0YXJ0U2Nhbihmb3JjZUFjdGl2ZSk7CiAgICAgfQogCiAgICAgcHJpdmF0ZSB2b2lkIGVuZm9yY2VBY2Nlc3NQZXJtaXNzaW9uKCkgewpAQCAtNTY3LDYgKzM4Nyw0NyBAQAogICAgIH0KIAogICAgIC8qKgorICAgICAqIHNlZSB7QGxpbmsgYW5kcm9pZC5uZXQud2lmaS5XaWZpTWFuYWdlciNzZXRXaWZpRW5hYmxlZChib29sZWFuKX0KKyAgICAgKiBAcGFyYW0gZW5hYmxlIHtAY29kZSB0cnVlfSB0byBlbmFibGUsIHtAY29kZSBmYWxzZX0gdG8gZGlzYWJsZS4KKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGUgZW5hYmxlL2Rpc2FibGUgb3BlcmF0aW9uIHdhcworICAgICAqICAgICAgICAgc3RhcnRlZCBvciBpcyBhbHJlYWR5IGluIHRoZSBxdWV1ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4gc2V0V2lmaUVuYWJsZWQoYm9vbGVhbiBlbmFibGUpIHsKKyAgICAgICAgZW5mb3JjZUNoYW5nZVBlcm1pc3Npb24oKTsKKworICAgICAgICBpZiAoREJHKSB7CisgICAgICAgICAgICBTbG9nLmUoVEFHLCAiSW52b2tpbmcgbVdpZmlTdGF0ZU1hY2hpbmUuc2V0V2lmaUVuYWJsZWRcbiIpOworICAgICAgICB9CisKKyAgICAgICAgLy8gc2V0IGEgZmxhZyBpZiB0aGUgdXNlciBpcyBlbmFibGluZyBXaWZpIHdoaWxlIGluIGFpcnBsYW5lIG1vZGUKKyAgICAgICAgaWYgKGVuYWJsZSAmJiBpc0FpcnBsYW5lTW9kZU9uKCkgJiYgaXNBaXJwbGFuZVRvZ2dsZWFibGUoKSkgeworICAgICAgICAgICAgbUFpcnBsYW5lTW9kZU92ZXJ3cmlkZGVuLnNldCh0cnVlKTsKKyAgICAgICAgfQorCisgICAgICAgIG1XaWZpU3RhdGVNYWNoaW5lLnNldFdpZmlFbmFibGVkKGVuYWJsZSk7CisKKyAgICAgICAgLyoKKyAgICAgICAgICogQ2FsbGVyIG1pZ2h0IG5vdCBoYXZlIFdSSVRFX1NFQ1VSRV9TRVRUSU5HUywKKyAgICAgICAgICogb25seSBDSEFOR0VfV0lGSV9TVEFURSBpcyBlbmZvcmNlZAorICAgICAgICAgKi8KKyAgICAgICAgbG9uZyBpZGVudCA9IEJpbmRlci5jbGVhckNhbGxpbmdJZGVudGl0eSgpOworICAgICAgICBwZXJzaXN0V2lmaUVuYWJsZWQoZW5hYmxlKTsKKyAgICAgICAgQmluZGVyLnJlc3RvcmVDYWxsaW5nSWRlbnRpdHkoaWRlbnQpOworCisgICAgICAgIGlmIChlbmFibGUpIHsKKyAgICAgICAgICAgIGlmICghbUlzUmVjZWl2ZXJSZWdpc3RlcmVkKSB7CisgICAgICAgICAgICAgICAgcmVnaXN0ZXJGb3JCcm9hZGNhc3RzKCk7CisgICAgICAgICAgICAgICAgbUlzUmVjZWl2ZXJSZWdpc3RlcmVkID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmIChtSXNSZWNlaXZlclJlZ2lzdGVyZWQpeworICAgICAgICAgICAgbUNvbnRleHQudW5yZWdpc3RlclJlY2VpdmVyKG1SZWNlaXZlcik7CisgICAgICAgICAgICBtSXNSZWNlaXZlclJlZ2lzdGVyZWQgPSBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIC8qKgogICAgICAqIHNlZSB7QGxpbmsgV2lmaU1hbmFnZXIjZ2V0V2lmaVN0YXRlKCl9CiAgICAgICogQHJldHVybiBPbmUgb2Yge0BsaW5rIFdpZmlNYW5hZ2VyI1dJRklfU1RBVEVfRElTQUJMRUR9LAogICAgICAqICAgICAgICAge0BsaW5rIFdpZmlNYW5hZ2VyI1dJRklfU1RBVEVfRElTQUJMSU5HfSwKQEAgLTU3Niw2NiArNDM3LDU5IEBACiAgICAgICovCiAgICAgcHVibGljIGludCBnZXRXaWZpRW5hYmxlZFN0YXRlKCkgewogICAgICAgICBlbmZvcmNlQWNjZXNzUGVybWlzc2lvbigpOwotICAgICAgICByZXR1cm4gbVdpZmlTdGF0ZVRyYWNrZXIuZ2V0V2lmaVN0YXRlKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogc2VlIHtAbGluayBhbmRyb2lkLm5ldC53aWZpLldpZmlNYW5hZ2VyI2Rpc2Nvbm5lY3QoKX0KLSAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGUgb3BlcmF0aW9uIHN1Y2NlZWRzCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gZGlzY29ubmVjdCgpIHsKLSAgICAgICAgZW5mb3JjZUNoYW5nZVBlcm1pc3Npb24oKTsKLQotICAgICAgICByZXR1cm4gbVdpZmlTdGF0ZVRyYWNrZXIuZGlzY29ubmVjdCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIHNlZSB7QGxpbmsgYW5kcm9pZC5uZXQud2lmaS5XaWZpTWFuYWdlciNyZWNvbm5lY3QoKX0KLSAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGUgb3BlcmF0aW9uIHN1Y2NlZWRzCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gcmVjb25uZWN0KCkgewotICAgICAgICBlbmZvcmNlQ2hhbmdlUGVybWlzc2lvbigpOwotCi0gICAgICAgIHJldHVybiBtV2lmaVN0YXRlVHJhY2tlci5yZWNvbm5lY3RDb21tYW5kKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogc2VlIHtAbGluayBhbmRyb2lkLm5ldC53aWZpLldpZmlNYW5hZ2VyI3JlYXNzb2NpYXRlKCl9Ci0gICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhlIG9wZXJhdGlvbiBzdWNjZWVkcwotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIHJlYXNzb2NpYXRlKCkgewotICAgICAgICBlbmZvcmNlQ2hhbmdlUGVybWlzc2lvbigpOwotCi0gICAgICAgIHJldHVybiBtV2lmaVN0YXRlVHJhY2tlci5yZWFzc29jaWF0ZSgpOworICAgICAgICByZXR1cm4gbVdpZmlTdGF0ZU1hY2hpbmUuc3luY0dldFdpZmlTdGF0ZSgpOwogICAgIH0KIAogICAgIC8qKgogICAgICAqIHNlZSB7QGxpbmsgYW5kcm9pZC5uZXQud2lmaS5XaWZpTWFuYWdlciNzZXRXaWZpQXBFbmFibGVkKFdpZmlDb25maWd1cmF0aW9uLCBib29sZWFuKX0KICAgICAgKiBAcGFyYW0gd2lmaUNvbmZpZyBTU0lELCBzZWN1cml0eSBhbmQgY2hhbm5lbCBkZXRhaWxzIGFzCiAgICAgICogICAgICAgIHBhcnQgb2YgV2lmaUNvbmZpZ3VyYXRpb24KLSAgICAgKiBAcGFyYW0gZW5hYmxlZCwgdHJ1ZSB0byBlbmFibGUgYW5kIGZhbHNlIHRvIGRpc2FibGUKKyAgICAgKiBAcGFyYW0gZW5hYmxlZCB0cnVlIHRvIGVuYWJsZSBhbmQgZmFsc2UgdG8gZGlzYWJsZQogICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoZSBzdGFydCBvcGVyYXRpb24gd2FzCiAgICAgICogICAgICAgICBzdGFydGVkIG9yIGlzIGFscmVhZHkgaW4gdGhlIHF1ZXVlLgogICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIHNldFdpZmlBcEVuYWJsZWQoV2lmaUNvbmZpZ3VyYXRpb24gd2lmaUNvbmZpZywgYm9vbGVhbiBlbmFibGVkKSB7CisgICAgcHVibGljIHN5bmNocm9uaXplZCBib29sZWFuIHNldFdpZmlBcEVuYWJsZWQoV2lmaUNvbmZpZ3VyYXRpb24gd2lmaUNvbmZpZywgYm9vbGVhbiBlbmFibGVkKSB7CiAgICAgICAgIGVuZm9yY2VDaGFuZ2VQZXJtaXNzaW9uKCk7Ci0gICAgICAgIGlmIChtV2lmaUhhbmRsZXIgPT0gbnVsbCkgcmV0dXJuIGZhbHNlOwogCi0gICAgICAgIHN5bmNocm9uaXplZCAobVdpZmlIYW5kbGVyKSB7Ci0KKyAgICAgICAgaWYgKGVuYWJsZWQpIHsKKyAgICAgICAgICAgIC8qIFVzZSBkZWZhdWx0IGNvbmZpZyBpZiB0aGVyZSBpcyBubyBleGlzdGluZyBjb25maWcgKi8KKyAgICAgICAgICAgIGlmICh3aWZpQ29uZmlnID09IG51bGwgJiYgKCh3aWZpQ29uZmlnID0gZ2V0V2lmaUFwQ29uZmlndXJhdGlvbigpKSA9PSBudWxsKSkgeworICAgICAgICAgICAgICAgIHdpZmlDb25maWcgPSBuZXcgV2lmaUNvbmZpZ3VyYXRpb24oKTsKKyAgICAgICAgICAgICAgICB3aWZpQ29uZmlnLlNTSUQgPSBtQ29udGV4dC5nZXRTdHJpbmcoUi5zdHJpbmcud2lmaV90ZXRoZXJfY29uZmlndXJlX3NzaWRfZGVmYXVsdCk7CisgICAgICAgICAgICAgICAgd2lmaUNvbmZpZy5hbGxvd2VkS2V5TWFuYWdlbWVudC5zZXQoS2V5TWdtdC5OT05FKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgKiBDYWxsZXIgbWlnaHQgbm90IGhhdmUgV1JJVEVfU0VDVVJFX1NFVFRJTkdTLAorICAgICAgICAgICAgICogb25seSBDSEFOR0VfV0lGSV9TVEFURSBpcyBlbmZvcmNlZAorICAgICAgICAgICAgICovCiAgICAgICAgICAgICBsb25nIGlkZW50ID0gQmluZGVyLmNsZWFyQ2FsbGluZ0lkZW50aXR5KCk7Ci0gICAgICAgICAgICBzV2FrZUxvY2suYWNxdWlyZSgpOworICAgICAgICAgICAgc2V0V2lmaUFwQ29uZmlndXJhdGlvbih3aWZpQ29uZmlnKTsKICAgICAgICAgICAgIEJpbmRlci5yZXN0b3JlQ2FsbGluZ0lkZW50aXR5KGlkZW50KTsKLQotICAgICAgICAgICAgbUxhc3RBcEVuYWJsZVVpZCA9IEJpbmRlci5nZXRDYWxsaW5nVWlkKCk7Ci0gICAgICAgICAgICBzZW5kQWNjZXNzUG9pbnRNZXNzYWdlKGVuYWJsZWQsIHdpZmlDb25maWcsIEJpbmRlci5nZXRDYWxsaW5nVWlkKCkpOwogICAgICAgICB9CiAKKyAgICAgICAgbVdpZmlTdGF0ZU1hY2hpbmUuc2V0V2lmaUFwRW5hYmxlZCh3aWZpQ29uZmlnLCBlbmFibGVkKTsKKwogICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CiAKLSAgICBwdWJsaWMgV2lmaUNvbmZpZ3VyYXRpb24gZ2V0V2lmaUFwQ29uZmlndXJhdGlvbigpIHsKKyAgICAvKioKKyAgICAgKiBzZWUge0BsaW5rIFdpZmlNYW5hZ2VyI2dldFdpZmlBcFN0YXRlKCl9CisgICAgICogQHJldHVybiBPbmUgb2Yge0BsaW5rIFdpZmlNYW5hZ2VyI1dJRklfQVBfU1RBVEVfRElTQUJMRUR9LAorICAgICAqICAgICAgICAge0BsaW5rIFdpZmlNYW5hZ2VyI1dJRklfQVBfU1RBVEVfRElTQUJMSU5HfSwKKyAgICAgKiAgICAgICAgIHtAbGluayBXaWZpTWFuYWdlciNXSUZJX0FQX1NUQVRFX0VOQUJMRUR9LAorICAgICAqICAgICAgICAge0BsaW5rIFdpZmlNYW5hZ2VyI1dJRklfQVBfU1RBVEVfRU5BQkxJTkd9LAorICAgICAqICAgICAgICAge0BsaW5rIFdpZmlNYW5hZ2VyI1dJRklfQVBfU1RBVEVfRkFJTEVEfQorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0V2lmaUFwRW5hYmxlZFN0YXRlKCkgewogICAgICAgICBlbmZvcmNlQWNjZXNzUGVybWlzc2lvbigpOworICAgICAgICByZXR1cm4gbVdpZmlTdGF0ZU1hY2hpbmUuc3luY0dldFdpZmlBcFN0YXRlKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogc2VlIHtAbGluayBXaWZpTWFuYWdlciNnZXRXaWZpQXBDb25maWd1cmF0aW9uKCl9CisgICAgICogQHJldHVybiBzb2Z0IGFjY2VzcyBwb2ludCBjb25maWd1cmF0aW9uCisgICAgICovCisgICAgcHVibGljIHN5bmNocm9uaXplZCBXaWZpQ29uZmlndXJhdGlvbiBnZXRXaWZpQXBDb25maWd1cmF0aW9uKCkgewogICAgICAgICBmaW5hbCBDb250ZW50UmVzb2x2ZXIgY3IgPSBtQ29udGV4dC5nZXRDb250ZW50UmVzb2x2ZXIoKTsKICAgICAgICAgV2lmaUNvbmZpZ3VyYXRpb24gd2lmaUNvbmZpZyA9IG5ldyBXaWZpQ29uZmlndXJhdGlvbigpOwogICAgICAgICBpbnQgYXV0aFR5cGU7CkBAIC02NTMsNyArNTA3LDExIEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICBwdWJsaWMgdm9pZCBzZXRXaWZpQXBDb25maWd1cmF0aW9uKFdpZmlDb25maWd1cmF0aW9uIHdpZmlDb25maWcpIHsKKyAgICAvKioKKyAgICAgKiBzZWUge0BsaW5rIFdpZmlNYW5hZ2VyI3NldFdpZmlBcENvbmZpZ3VyYXRpb24oV2lmaUNvbmZpZ3VyYXRpb24pfQorICAgICAqIEBwYXJhbSB3aWZpQ29uZmlnIFdpZmlDb25maWd1cmF0aW9uIGRldGFpbHMgZm9yIHNvZnQgYWNjZXNzIHBvaW50CisgICAgICovCisgICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHNldFdpZmlBcENvbmZpZ3VyYXRpb24oV2lmaUNvbmZpZ3VyYXRpb24gd2lmaUNvbmZpZykgewogICAgICAgICBlbmZvcmNlQ2hhbmdlUGVybWlzc2lvbigpOwogICAgICAgICBmaW5hbCBDb250ZW50UmVzb2x2ZXIgY3IgPSBtQ29udGV4dC5nZXRDb250ZW50UmVzb2x2ZXIoKTsKICAgICAgICAgYm9vbGVhbiBpc1dwYTsKQEAgLTY2OSwxNDMgKzUyNywyNyBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEVuYWJsZXMvZGlzYWJsZXMgV2ktRmkgQVAgc3luY2hyb25vdXNseS4gVGhlIGRyaXZlciBpcyBsb2FkZWQKLSAgICAgKiBhbmQgc29mdCBhY2Nlc3MgcG9pbnQgY29uZmlndXJlZCBhcyBhIHNpbmdsZSBvcGVyYXRpb24uCi0gICAgICogQHBhcmFtIGVuYWJsZSB7QGNvZGUgdHJ1ZX0gdG8gdHVybiBXaS1GaSBvbiwge0Bjb2RlIGZhbHNlfSB0byB0dXJuIGl0IG9mZi4KLSAgICAgKiBAcGFyYW0gdWlkIFRoZSBVSUQgb2YgdGhlIHByb2Nlc3MgbWFraW5nIHRoZSByZXF1ZXN0LgotICAgICAqIEBwYXJhbSB3aWZpQ29uZmlnIFRoZSBXaWZpQ29uZmlndXJhdGlvbiBmb3IgQVAKLSAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGUgb3BlcmF0aW9uIHN1Y2NlZWRzIChvciBpZiB0aGUgZXhpc3Rpbmcgc3RhdGUKLSAgICAgKiAgICAgICAgIGlzIHRoZSBzYW1lIGFzIHRoZSByZXF1ZXN0ZWQgc3RhdGUpCisgICAgICogc2VlIHtAbGluayBhbmRyb2lkLm5ldC53aWZpLldpZmlNYW5hZ2VyI2Rpc2Nvbm5lY3QoKX0KICAgICAgKi8KLSAgICBwcml2YXRlIGJvb2xlYW4gc2V0V2lmaUFwRW5hYmxlZEJsb2NraW5nKGJvb2xlYW4gZW5hYmxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdWlkLCBXaWZpQ29uZmlndXJhdGlvbiB3aWZpQ29uZmlnKSB7Ci0gICAgICAgIGZpbmFsIGludCBldmVudHVhbFdpZmlBcFN0YXRlID0gZW5hYmxlID8gV0lGSV9BUF9TVEFURV9FTkFCTEVEIDogV0lGSV9BUF9TVEFURV9ESVNBQkxFRDsKLQotICAgICAgICBpZiAobVdpZmlBcFN0YXRlID09IGV2ZW50dWFsV2lmaUFwU3RhdGUpIHsKLSAgICAgICAgICAgIC8qIENvbmZpZ3VyYXRpb24gY2hhbmdlZCBvbiBhIHJ1bm5pbmcgYWNjZXNzIHBvaW50ICovCi0gICAgICAgICAgICBpZihlbmFibGUgJiYgKHdpZmlDb25maWcgIT0gbnVsbCkpIHsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBud1NlcnZpY2Uuc2V0QWNjZXNzUG9pbnQod2lmaUNvbmZpZywgbVdpZmlTdGF0ZVRyYWNrZXIuZ2V0SW50ZXJmYWNlTmFtZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU09GVEFQX0lGQUNFKTsKLSAgICAgICAgICAgICAgICAgICAgc2V0V2lmaUFwQ29uZmlndXJhdGlvbih3aWZpQ29uZmlnKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICBTbG9nLmUoVEFHLCAiRXhjZXB0aW9uIGluIG53U2VydmljZSBkdXJpbmcgQVAgcmVzdGFydCIpOwotICAgICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAgICAgbndTZXJ2aWNlLnN0b3BBY2Nlc3NQb2ludCgpOwotICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZWUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFNsb2cuZShUQUcsICJDb3VsZCBub3Qgc3RvcCBBUCwgOiIgKyBlZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgc2V0V2lmaUFwRW5hYmxlZFN0YXRlKFdJRklfQVBfU1RBVEVfRkFJTEVELCB1aWQsIERyaXZlckFjdGlvbi5EUklWRVJfVU5MT0FEKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogRmFpbCBBUCBpZiBXaWZpIGlzIGVuYWJsZWQKLSAgICAgICAgICovCi0gICAgICAgIGlmICgobVdpZmlTdGF0ZVRyYWNrZXIuZ2V0V2lmaVN0YXRlKCkgPT0gV0lGSV9TVEFURV9FTkFCTEVEKSAmJiBlbmFibGUpIHsKLSAgICAgICAgICAgIHNldFdpZmlBcEVuYWJsZWRTdGF0ZShXSUZJX0FQX1NUQVRFX0ZBSUxFRCwgdWlkLCBEcml2ZXJBY3Rpb24uTk9fRFJJVkVSX1VOTE9BRCk7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICBzZXRXaWZpQXBFbmFibGVkU3RhdGUoZW5hYmxlID8gV0lGSV9BUF9TVEFURV9FTkFCTElORyA6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSUZJX0FQX1NUQVRFX0RJU0FCTElORywgdWlkLCBEcml2ZXJBY3Rpb24uTk9fRFJJVkVSX1VOTE9BRCk7Ci0KLSAgICAgICAgaWYgKGVuYWJsZSkgewotCi0gICAgICAgICAgICAvKiBVc2UgZGVmYXVsdCBjb25maWcgaWYgdGhlcmUgaXMgbm8gZXhpc3RpbmcgY29uZmlnICovCi0gICAgICAgICAgICBpZiAod2lmaUNvbmZpZyA9PSBudWxsICYmICgod2lmaUNvbmZpZyA9IGdldFdpZmlBcENvbmZpZ3VyYXRpb24oKSkgPT0gbnVsbCkpIHsKLSAgICAgICAgICAgICAgICB3aWZpQ29uZmlnID0gbmV3IFdpZmlDb25maWd1cmF0aW9uKCk7Ci0gICAgICAgICAgICAgICAgd2lmaUNvbmZpZy5TU0lEID0gbUNvbnRleHQuZ2V0U3RyaW5nKFIuc3RyaW5nLndpZmlfdGV0aGVyX2NvbmZpZ3VyZV9zc2lkX2RlZmF1bHQpOwotICAgICAgICAgICAgICAgIHdpZmlDb25maWcuYWxsb3dlZEtleU1hbmFnZW1lbnQuc2V0KEtleU1nbXQuTk9ORSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmICghbVdpZmlTdGF0ZVRyYWNrZXIubG9hZERyaXZlcigpKSB7Ci0gICAgICAgICAgICAgICAgU2xvZy5lKFRBRywgIkZhaWxlZCB0byBsb2FkIFdpLUZpIGRyaXZlciBmb3IgQVAgbW9kZSIpOwotICAgICAgICAgICAgICAgIHNldFdpZmlBcEVuYWJsZWRTdGF0ZShXSUZJX0FQX1NUQVRFX0ZBSUxFRCwgdWlkLCBEcml2ZXJBY3Rpb24uTk9fRFJJVkVSX1VOTE9BRCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIG53U2VydmljZS5zdGFydEFjY2Vzc1BvaW50KHdpZmlDb25maWcsIG1XaWZpU3RhdGVUcmFja2VyLmdldEludGVyZmFjZU5hbWUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTT0ZUQVBfSUZBQ0UpOwotICAgICAgICAgICAgfSBjYXRjaChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIFNsb2cuZShUQUcsICJFeGNlcHRpb24gaW4gc3RhcnRBY2Nlc3NQb2ludCgpIik7Ci0gICAgICAgICAgICAgICAgc2V0V2lmaUFwRW5hYmxlZFN0YXRlKFdJRklfQVBfU1RBVEVfRkFJTEVELCB1aWQsIERyaXZlckFjdGlvbi5EUklWRVJfVU5MT0FEKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHNldFdpZmlBcENvbmZpZ3VyYXRpb24od2lmaUNvbmZpZyk7Ci0KLSAgICAgICAgfSBlbHNlIHsKLQotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBud1NlcnZpY2Uuc3RvcEFjY2Vzc1BvaW50KCk7Ci0gICAgICAgICAgICB9IGNhdGNoKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgU2xvZy5lKFRBRywgIkV4Y2VwdGlvbiBpbiBzdG9wQWNjZXNzUG9pbnQoKSIpOwotICAgICAgICAgICAgICAgIHNldFdpZmlBcEVuYWJsZWRTdGF0ZShXSUZJX0FQX1NUQVRFX0ZBSUxFRCwgdWlkLCBEcml2ZXJBY3Rpb24uRFJJVkVSX1VOTE9BRCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoIW1XaWZpU3RhdGVUcmFja2VyLnVubG9hZERyaXZlcigpKSB7Ci0gICAgICAgICAgICAgICAgU2xvZy5lKFRBRywgIkZhaWxlZCB0byB1bmxvYWQgV2ktRmkgZHJpdmVyIGZvciBBUCBtb2RlIik7Ci0gICAgICAgICAgICAgICAgc2V0V2lmaUFwRW5hYmxlZFN0YXRlKFdJRklfQVBfU1RBVEVfRkFJTEVELCB1aWQsIERyaXZlckFjdGlvbi5OT19EUklWRVJfVU5MT0FEKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBzZXRXaWZpQXBFbmFibGVkU3RhdGUoZXZlbnR1YWxXaWZpQXBTdGF0ZSwgdWlkLCBEcml2ZXJBY3Rpb24uTk9fRFJJVkVSX1VOTE9BRCk7Ci0gICAgICAgIHJldHVybiB0cnVlOworICAgIHB1YmxpYyB2b2lkIGRpc2Nvbm5lY3QoKSB7CisgICAgICAgIGVuZm9yY2VDaGFuZ2VQZXJtaXNzaW9uKCk7CisgICAgICAgIG1XaWZpU3RhdGVNYWNoaW5lLmRpc2Nvbm5lY3RDb21tYW5kKCk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogc2VlIHtAbGluayBXaWZpTWFuYWdlciNnZXRXaWZpQXBTdGF0ZSgpfQotICAgICAqIEByZXR1cm4gT25lIG9mIHtAbGluayBXaWZpTWFuYWdlciNXSUZJX0FQX1NUQVRFX0RJU0FCTEVEfSwKLSAgICAgKiAgICAgICAgIHtAbGluayBXaWZpTWFuYWdlciNXSUZJX0FQX1NUQVRFX0RJU0FCTElOR30sCi0gICAgICogICAgICAgICB7QGxpbmsgV2lmaU1hbmFnZXIjV0lGSV9BUF9TVEFURV9FTkFCTEVEfSwKLSAgICAgKiAgICAgICAgIHtAbGluayBXaWZpTWFuYWdlciNXSUZJX0FQX1NUQVRFX0VOQUJMSU5HfSwKLSAgICAgKiAgICAgICAgIHtAbGluayBXaWZpTWFuYWdlciNXSUZJX0FQX1NUQVRFX0ZBSUxFRH0KKyAgICAgKiBzZWUge0BsaW5rIGFuZHJvaWQubmV0LndpZmkuV2lmaU1hbmFnZXIjcmVjb25uZWN0KCl9CiAgICAgICovCi0gICAgcHVibGljIGludCBnZXRXaWZpQXBFbmFibGVkU3RhdGUoKSB7Ci0gICAgICAgIGVuZm9yY2VBY2Nlc3NQZXJtaXNzaW9uKCk7Ci0gICAgICAgIHJldHVybiBtV2lmaUFwU3RhdGU7CisgICAgcHVibGljIHZvaWQgcmVjb25uZWN0KCkgeworICAgICAgICBlbmZvcmNlQ2hhbmdlUGVybWlzc2lvbigpOworICAgICAgICBtV2lmaVN0YXRlTWFjaGluZS5yZWNvbm5lY3RDb21tYW5kKCk7CiAgICAgfQogCi0gICAgcHJpdmF0ZSB2b2lkIHNldFdpZmlBcEVuYWJsZWRTdGF0ZShpbnQgd2lmaUFQU3RhdGUsIGludCB1aWQsIERyaXZlckFjdGlvbiBmbGFnKSB7Ci0gICAgICAgIGZpbmFsIGludCBwcmV2aW91c1dpZmlBcFN0YXRlID0gbVdpZmlBcFN0YXRlOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBVbmxvYWQgdGhlIGRyaXZlciBpZiBnb2luZyB0byBhIGZhaWxlZCBzdGF0ZQotICAgICAgICAgKi8KLSAgICAgICAgaWYgKChtV2lmaUFwU3RhdGUgPT0gV0lGSV9BUF9TVEFURV9GQUlMRUQpICYmIChmbGFnID09IERyaXZlckFjdGlvbi5EUklWRVJfVU5MT0FEKSkgewotICAgICAgICAgICAgbVdpZmlTdGF0ZVRyYWNrZXIudW5sb2FkRHJpdmVyKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBsb25nIGlkZW50ID0gQmluZGVyLmNsZWFyQ2FsbGluZ0lkZW50aXR5KCk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBpZiAod2lmaUFQU3RhdGUgPT0gV0lGSV9BUF9TVEFURV9FTkFCTEVEKSB7Ci0gICAgICAgICAgICAgICAgbUJhdHRlcnlTdGF0cy5ub3RlV2lmaU9uKHVpZCk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKHdpZmlBUFN0YXRlID09IFdJRklfQVBfU1RBVEVfRElTQUJMRUQpIHsKLSAgICAgICAgICAgICAgICBtQmF0dGVyeVN0YXRzLm5vdGVXaWZpT2ZmKHVpZCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBCaW5kZXIucmVzdG9yZUNhbGxpbmdJZGVudGl0eShpZGVudCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBVcGRhdGUgc3RhdGUKLSAgICAgICAgbVdpZmlBcFN0YXRlID0gd2lmaUFQU3RhdGU7Ci0KLSAgICAgICAgLy8gQnJvYWRjYXN0Ci0gICAgICAgIGZpbmFsIEludGVudCBpbnRlbnQgPSBuZXcgSW50ZW50KFdpZmlNYW5hZ2VyLldJRklfQVBfU1RBVEVfQ0hBTkdFRF9BQ1RJT04pOwotICAgICAgICBpbnRlbnQuYWRkRmxhZ3MoSW50ZW50LkZMQUdfUkVDRUlWRVJfUkVHSVNURVJFRF9PTkxZX0JFRk9SRV9CT09UKTsKLSAgICAgICAgaW50ZW50LnB1dEV4dHJhKFdpZmlNYW5hZ2VyLkVYVFJBX1dJRklfQVBfU1RBVEUsIHdpZmlBUFN0YXRlKTsKLSAgICAgICAgaW50ZW50LnB1dEV4dHJhKFdpZmlNYW5hZ2VyLkVYVFJBX1BSRVZJT1VTX1dJRklfQVBfU1RBVEUsIHByZXZpb3VzV2lmaUFwU3RhdGUpOwotICAgICAgICBtQ29udGV4dC5zZW5kU3RpY2t5QnJvYWRjYXN0KGludGVudCk7CisgICAgLyoqCisgICAgICogc2VlIHtAbGluayBhbmRyb2lkLm5ldC53aWZpLldpZmlNYW5hZ2VyI3JlYXNzb2NpYXRlKCl9CisgICAgICovCisgICAgcHVibGljIHZvaWQgcmVhc3NvY2lhdGUoKSB7CisgICAgICAgIGVuZm9yY2VDaGFuZ2VQZXJtaXNzaW9uKCk7CisgICAgICAgIG1XaWZpU3RhdGVNYWNoaW5lLnJlYXNzb2NpYXRlQ29tbWFuZCgpOwogICAgIH0KIAogICAgIC8qKgpAQCAtODE0LDIxNyArNTU2LDcgQEAKICAgICAgKi8KICAgICBwdWJsaWMgTGlzdDxXaWZpQ29uZmlndXJhdGlvbj4gZ2V0Q29uZmlndXJlZE5ldHdvcmtzKCkgewogICAgICAgICBlbmZvcmNlQWNjZXNzUGVybWlzc2lvbigpOwotICAgICAgICBTdHJpbmcgbGlzdFN0cjsKLQotICAgICAgICAvKgotICAgICAgICAgKiBXZSBkb24ndCBjYWNoZSB0aGUgbGlzdCwgYmVjYXVzZSB3ZSB3YW50IHRvIGFsbG93Ci0gICAgICAgICAqIGZvciB0aGUgcG9zc2liaWxpdHkgdGhhdCB0aGUgY29uZmlndXJhdGlvbiBmaWxlCi0gICAgICAgICAqIGhhcyBiZWVuIG1vZGlmaWVkIHRocm91Z2ggc29tZSBleHRlcm5hbCBtZWFucywKLSAgICAgICAgICogc3VjaCBhcyB0aGUgd3BhX2NsaSBjb21tYW5kIGxpbmUgcHJvZ3JhbS4KLSAgICAgICAgICovCi0gICAgICAgIGxpc3RTdHIgPSBtV2lmaVN0YXRlVHJhY2tlci5saXN0TmV0d29ya3MoKTsKLQotICAgICAgICBMaXN0PFdpZmlDb25maWd1cmF0aW9uPiBuZXR3b3JrcyA9Ci0gICAgICAgICAgICBuZXcgQXJyYXlMaXN0PFdpZmlDb25maWd1cmF0aW9uPigpOwotICAgICAgICBpZiAobGlzdFN0ciA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIG5ldHdvcmtzOwotCi0gICAgICAgIFN0cmluZ1tdIGxpbmVzID0gbGlzdFN0ci5zcGxpdCgiXG4iKTsKLSAgICAgICAgLy8gU2tpcCB0aGUgZmlyc3QgbGluZSwgd2hpY2ggaXMgYSBoZWFkZXIKLSAgICAgICBmb3IgKGludCBpID0gMTsgaSA8IGxpbmVzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgIFN0cmluZ1tdIHJlc3VsdCA9IGxpbmVzW2ldLnNwbGl0KCJcdCIpOwotICAgICAgICAgICAvLyBuZXR3b3JrLWlkIHwgc3NpZCB8IGJzc2lkIHwgZmxhZ3MKLSAgICAgICAgICAgV2lmaUNvbmZpZ3VyYXRpb24gY29uZmlnID0gbmV3IFdpZmlDb25maWd1cmF0aW9uKCk7Ci0gICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICBjb25maWcubmV0d29ya0lkID0gSW50ZWdlci5wYXJzZUludChyZXN1bHRbMF0pOwotICAgICAgICAgICB9IGNhdGNoKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgfQotICAgICAgICAgICBpZiAocmVzdWx0Lmxlbmd0aCA+IDMpIHsKLSAgICAgICAgICAgICAgIGlmIChyZXN1bHRbM10uaW5kZXhPZigiW0NVUlJFTlRdIikgIT0gLTEpCi0gICAgICAgICAgICAgICAgICAgY29uZmlnLnN0YXR1cyA9IFdpZmlDb25maWd1cmF0aW9uLlN0YXR1cy5DVVJSRU5UOwotICAgICAgICAgICAgICAgZWxzZSBpZiAocmVzdWx0WzNdLmluZGV4T2YoIltESVNBQkxFRF0iKSAhPSAtMSkKLSAgICAgICAgICAgICAgICAgICBjb25maWcuc3RhdHVzID0gV2lmaUNvbmZpZ3VyYXRpb24uU3RhdHVzLkRJU0FCTEVEOwotICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgIGNvbmZpZy5zdGF0dXMgPSBXaWZpQ29uZmlndXJhdGlvbi5TdGF0dXMuRU5BQkxFRDsKLSAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgIGNvbmZpZy5zdGF0dXMgPSBXaWZpQ29uZmlndXJhdGlvbi5TdGF0dXMuRU5BQkxFRDsKLSAgICAgICAgICAgfQotICAgICAgICAgICByZWFkTmV0d29ya1ZhcmlhYmxlcyhjb25maWcpOwotICAgICAgICAgICBuZXR3b3Jrcy5hZGQoY29uZmlnKTsKLSAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIG5ldHdvcmtzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJlYWQgdGhlIHZhcmlhYmxlcyBmcm9tIHRoZSBzdXBwbGljYW50IGRhZW1vbiB0aGF0IGFyZSBuZWVkZWQgdG8KLSAgICAgKiBmaWxsIGluIHRoZSBXaWZpQ29uZmlndXJhdGlvbiBvYmplY3QuCi0gICAgICogPHAvPgotICAgICAqIFRoZSBjYWxsZXIgbXVzdCBob2xkIHRoZSBzeW5jaHJvbml6YXRpb24gbW9uaXRvci4KLSAgICAgKiBAcGFyYW0gY29uZmlnIHRoZSB7QGxpbmsgV2lmaUNvbmZpZ3VyYXRpb259IG9iamVjdCB0byBiZSBmaWxsZWQgaW4uCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHJlYWROZXR3b3JrVmFyaWFibGVzKFdpZmlDb25maWd1cmF0aW9uIGNvbmZpZykgewotCi0gICAgICAgIGludCBuZXRJZCA9IGNvbmZpZy5uZXR3b3JrSWQ7Ci0gICAgICAgIGlmIChuZXRJZCA8IDApCi0gICAgICAgICAgICByZXR1cm47Ci0KLSAgICAgICAgLyoKLSAgICAgICAgICogVE9ETzogbWF5YmUgc2hvdWxkIGhhdmUgYSBuYXRpdmUgbWV0aG9kIHRoYXQgdGFrZXMgYW4gYXJyYXkgb2YKLSAgICAgICAgICogdmFyaWFibGUgbmFtZXMgYW5kIHJldHVybnMgYW4gYXJyYXkgb2YgdmFsdWVzLiBCdXQgd2UnZCBzdGlsbAotICAgICAgICAgKiBiZSBkb2luZyBhIHJvdW5kIHRyaXAgdG8gdGhlIHN1cHBsaWNhbnQgZGFlbW9uIGZvciBlYWNoIHZhcmlhYmxlLgotICAgICAgICAgKi8KLSAgICAgICAgU3RyaW5nIHZhbHVlOwotCi0gICAgICAgIHZhbHVlID0gbVdpZmlTdGF0ZVRyYWNrZXIuZ2V0TmV0d29ya1ZhcmlhYmxlKG5ldElkLCBXaWZpQ29uZmlndXJhdGlvbi5zc2lkVmFyTmFtZSk7Ci0gICAgICAgIGlmICghVGV4dFV0aWxzLmlzRW1wdHkodmFsdWUpKSB7Ci0gICAgICAgICAgICBjb25maWcuU1NJRCA9IHZhbHVlOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgY29uZmlnLlNTSUQgPSBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgdmFsdWUgPSBtV2lmaVN0YXRlVHJhY2tlci5nZXROZXR3b3JrVmFyaWFibGUobmV0SWQsIFdpZmlDb25maWd1cmF0aW9uLmJzc2lkVmFyTmFtZSk7Ci0gICAgICAgIGlmICghVGV4dFV0aWxzLmlzRW1wdHkodmFsdWUpKSB7Ci0gICAgICAgICAgICBjb25maWcuQlNTSUQgPSB2YWx1ZTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGNvbmZpZy5CU1NJRCA9IG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICB2YWx1ZSA9IG1XaWZpU3RhdGVUcmFja2VyLmdldE5ldHdvcmtWYXJpYWJsZShuZXRJZCwgV2lmaUNvbmZpZ3VyYXRpb24ucHJpb3JpdHlWYXJOYW1lKTsKLSAgICAgICAgY29uZmlnLnByaW9yaXR5ID0gLTE7Ci0gICAgICAgIGlmICghVGV4dFV0aWxzLmlzRW1wdHkodmFsdWUpKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGNvbmZpZy5wcmlvcml0eSA9IEludGVnZXIucGFyc2VJbnQodmFsdWUpOwotICAgICAgICAgICAgfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGlnbm9yZSkgewotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgdmFsdWUgPSBtV2lmaVN0YXRlVHJhY2tlci5nZXROZXR3b3JrVmFyaWFibGUobmV0SWQsIFdpZmlDb25maWd1cmF0aW9uLmhpZGRlblNTSURWYXJOYW1lKTsKLSAgICAgICAgY29uZmlnLmhpZGRlblNTSUQgPSBmYWxzZTsKLSAgICAgICAgaWYgKCFUZXh0VXRpbHMuaXNFbXB0eSh2YWx1ZSkpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgY29uZmlnLmhpZGRlblNTSUQgPSBJbnRlZ2VyLnBhcnNlSW50KHZhbHVlKSAhPSAwOwotICAgICAgICAgICAgfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGlnbm9yZSkgewotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgdmFsdWUgPSBtV2lmaVN0YXRlVHJhY2tlci5nZXROZXR3b3JrVmFyaWFibGUobmV0SWQsIFdpZmlDb25maWd1cmF0aW9uLndlcFR4S2V5SWR4VmFyTmFtZSk7Ci0gICAgICAgIGNvbmZpZy53ZXBUeEtleUluZGV4ID0gLTE7Ci0gICAgICAgIGlmICghVGV4dFV0aWxzLmlzRW1wdHkodmFsdWUpKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGNvbmZpZy53ZXBUeEtleUluZGV4ID0gSW50ZWdlci5wYXJzZUludCh2YWx1ZSk7Ci0gICAgICAgICAgICB9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gaWdub3JlKSB7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvKgotICAgICAgICAgKiBHZXQgdXAgdG8gNCBXRVAga2V5cy4gTm90ZSB0aGF0IHRoZSBhY3R1YWwga2V5cyBhcmUgbm90IHBhc3NlZCBiYWNrLAotICAgICAgICAgKiBqdXN0IGEgIioiIGlmIHRoZSBrZXkgaXMgc2V0LCBvciB0aGUgbnVsbCBzdHJpbmcgb3RoZXJ3aXNlLgotICAgICAgICAgKi8KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCA0OyBpKyspIHsKLSAgICAgICAgICAgIHZhbHVlID0gbVdpZmlTdGF0ZVRyYWNrZXIuZ2V0TmV0d29ya1ZhcmlhYmxlKG5ldElkLCBXaWZpQ29uZmlndXJhdGlvbi53ZXBLZXlWYXJOYW1lc1tpXSk7Ci0gICAgICAgICAgICBpZiAoIVRleHRVdGlscy5pc0VtcHR5KHZhbHVlKSkgewotICAgICAgICAgICAgICAgIGNvbmZpZy53ZXBLZXlzW2ldID0gdmFsdWU7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGNvbmZpZy53ZXBLZXlzW2ldID0gbnVsbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8qCi0gICAgICAgICAqIEdldCB0aGUgcHJpdmF0ZSBzaGFyZWQga2V5LiBOb3RlIHRoYXQgdGhlIGFjdHVhbCBrZXlzIGFyZSBub3QgcGFzc2VkIGJhY2ssCi0gICAgICAgICAqIGp1c3QgYSAiKiIgaWYgdGhlIGtleSBpcyBzZXQsIG9yIHRoZSBudWxsIHN0cmluZyBvdGhlcndpc2UuCi0gICAgICAgICAqLwotICAgICAgICB2YWx1ZSA9IG1XaWZpU3RhdGVUcmFja2VyLmdldE5ldHdvcmtWYXJpYWJsZShuZXRJZCwgV2lmaUNvbmZpZ3VyYXRpb24ucHNrVmFyTmFtZSk7Ci0gICAgICAgIGlmICghVGV4dFV0aWxzLmlzRW1wdHkodmFsdWUpKSB7Ci0gICAgICAgICAgICBjb25maWcucHJlU2hhcmVkS2V5ID0gdmFsdWU7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBjb25maWcucHJlU2hhcmVkS2V5ID0gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIHZhbHVlID0gbVdpZmlTdGF0ZVRyYWNrZXIuZ2V0TmV0d29ya1ZhcmlhYmxlKGNvbmZpZy5uZXR3b3JrSWQsCi0gICAgICAgICAgICAgICAgV2lmaUNvbmZpZ3VyYXRpb24uUHJvdG9jb2wudmFyTmFtZSk7Ci0gICAgICAgIGlmICghVGV4dFV0aWxzLmlzRW1wdHkodmFsdWUpKSB7Ci0gICAgICAgICAgICBTdHJpbmcgdmFsc1tdID0gdmFsdWUuc3BsaXQoIiAiKTsKLSAgICAgICAgICAgIGZvciAoU3RyaW5nIHZhbCA6IHZhbHMpIHsKLSAgICAgICAgICAgICAgICBpbnQgaW5kZXggPQotICAgICAgICAgICAgICAgICAgICBsb29rdXBTdHJpbmcodmFsLCBXaWZpQ29uZmlndXJhdGlvbi5Qcm90b2NvbC5zdHJpbmdzKTsKLSAgICAgICAgICAgICAgICBpZiAoMCA8PSBpbmRleCkgewotICAgICAgICAgICAgICAgICAgICBjb25maWcuYWxsb3dlZFByb3RvY29scy5zZXQoaW5kZXgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHZhbHVlID0gbVdpZmlTdGF0ZVRyYWNrZXIuZ2V0TmV0d29ya1ZhcmlhYmxlKGNvbmZpZy5uZXR3b3JrSWQsCi0gICAgICAgICAgICAgICAgV2lmaUNvbmZpZ3VyYXRpb24uS2V5TWdtdC52YXJOYW1lKTsKLSAgICAgICAgaWYgKCFUZXh0VXRpbHMuaXNFbXB0eSh2YWx1ZSkpIHsKLSAgICAgICAgICAgIFN0cmluZyB2YWxzW10gPSB2YWx1ZS5zcGxpdCgiICIpOwotICAgICAgICAgICAgZm9yIChTdHJpbmcgdmFsIDogdmFscykgewotICAgICAgICAgICAgICAgIGludCBpbmRleCA9Ci0gICAgICAgICAgICAgICAgICAgIGxvb2t1cFN0cmluZyh2YWwsIFdpZmlDb25maWd1cmF0aW9uLktleU1nbXQuc3RyaW5ncyk7Ci0gICAgICAgICAgICAgICAgaWYgKDAgPD0gaW5kZXgpIHsKLSAgICAgICAgICAgICAgICAgICAgY29uZmlnLmFsbG93ZWRLZXlNYW5hZ2VtZW50LnNldChpbmRleCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgdmFsdWUgPSBtV2lmaVN0YXRlVHJhY2tlci5nZXROZXR3b3JrVmFyaWFibGUoY29uZmlnLm5ldHdvcmtJZCwKLSAgICAgICAgICAgICAgICBXaWZpQ29uZmlndXJhdGlvbi5BdXRoQWxnb3JpdGhtLnZhck5hbWUpOwotICAgICAgICBpZiAoIVRleHRVdGlscy5pc0VtcHR5KHZhbHVlKSkgewotICAgICAgICAgICAgU3RyaW5nIHZhbHNbXSA9IHZhbHVlLnNwbGl0KCIgIik7Ci0gICAgICAgICAgICBmb3IgKFN0cmluZyB2YWwgOiB2YWxzKSB7Ci0gICAgICAgICAgICAgICAgaW50IGluZGV4ID0KLSAgICAgICAgICAgICAgICAgICAgbG9va3VwU3RyaW5nKHZhbCwgV2lmaUNvbmZpZ3VyYXRpb24uQXV0aEFsZ29yaXRobS5zdHJpbmdzKTsKLSAgICAgICAgICAgICAgICBpZiAoMCA8PSBpbmRleCkgewotICAgICAgICAgICAgICAgICAgICBjb25maWcuYWxsb3dlZEF1dGhBbGdvcml0aG1zLnNldChpbmRleCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgdmFsdWUgPSBtV2lmaVN0YXRlVHJhY2tlci5nZXROZXR3b3JrVmFyaWFibGUoY29uZmlnLm5ldHdvcmtJZCwKLSAgICAgICAgICAgICAgICBXaWZpQ29uZmlndXJhdGlvbi5QYWlyd2lzZUNpcGhlci52YXJOYW1lKTsKLSAgICAgICAgaWYgKCFUZXh0VXRpbHMuaXNFbXB0eSh2YWx1ZSkpIHsKLSAgICAgICAgICAgIFN0cmluZyB2YWxzW10gPSB2YWx1ZS5zcGxpdCgiICIpOwotICAgICAgICAgICAgZm9yIChTdHJpbmcgdmFsIDogdmFscykgewotICAgICAgICAgICAgICAgIGludCBpbmRleCA9Ci0gICAgICAgICAgICAgICAgICAgIGxvb2t1cFN0cmluZyh2YWwsIFdpZmlDb25maWd1cmF0aW9uLlBhaXJ3aXNlQ2lwaGVyLnN0cmluZ3MpOwotICAgICAgICAgICAgICAgIGlmICgwIDw9IGluZGV4KSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbmZpZy5hbGxvd2VkUGFpcndpc2VDaXBoZXJzLnNldChpbmRleCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgdmFsdWUgPSBtV2lmaVN0YXRlVHJhY2tlci5nZXROZXR3b3JrVmFyaWFibGUoY29uZmlnLm5ldHdvcmtJZCwKLSAgICAgICAgICAgICAgICBXaWZpQ29uZmlndXJhdGlvbi5Hcm91cENpcGhlci52YXJOYW1lKTsKLSAgICAgICAgaWYgKCFUZXh0VXRpbHMuaXNFbXB0eSh2YWx1ZSkpIHsKLSAgICAgICAgICAgIFN0cmluZyB2YWxzW10gPSB2YWx1ZS5zcGxpdCgiICIpOwotICAgICAgICAgICAgZm9yIChTdHJpbmcgdmFsIDogdmFscykgewotICAgICAgICAgICAgICAgIGludCBpbmRleCA9Ci0gICAgICAgICAgICAgICAgICAgIGxvb2t1cFN0cmluZyh2YWwsIFdpZmlDb25maWd1cmF0aW9uLkdyb3VwQ2lwaGVyLnN0cmluZ3MpOwotICAgICAgICAgICAgICAgIGlmICgwIDw9IGluZGV4KSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbmZpZy5hbGxvd2VkR3JvdXBDaXBoZXJzLnNldChpbmRleCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgZm9yIChXaWZpQ29uZmlndXJhdGlvbi5FbnRlcnByaXNlRmllbGQgZmllbGQgOgotICAgICAgICAgICAgICAgIGNvbmZpZy5lbnRlcnByaXNlRmllbGRzKSB7Ci0gICAgICAgICAgICB2YWx1ZSA9IG1XaWZpU3RhdGVUcmFja2VyLmdldE5ldHdvcmtWYXJpYWJsZShuZXRJZCwKLSAgICAgICAgICAgICAgICAgICAgZmllbGQudmFyTmFtZSgpKTsKLSAgICAgICAgICAgIGlmICghVGV4dFV0aWxzLmlzRW1wdHkodmFsdWUpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGZpZWxkICE9IGNvbmZpZy5lYXApIHZhbHVlID0gcmVtb3ZlRG91YmxlUXVvdGVzKHZhbHVlKTsKLSAgICAgICAgICAgICAgICBmaWVsZC5zZXRWYWx1ZSh2YWx1ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgcmVtb3ZlRG91YmxlUXVvdGVzKFN0cmluZyBzdHJpbmcpIHsKLSAgICAgICAgaWYgKHN0cmluZy5sZW5ndGgoKSA8PSAyKSByZXR1cm4gIiI7Ci0gICAgICAgIHJldHVybiBzdHJpbmcuc3Vic3RyaW5nKDEsIHN0cmluZy5sZW5ndGgoKSAtIDEpOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBjb252ZXJ0VG9RdW90ZWRTdHJpbmcoU3RyaW5nIHN0cmluZykgewotICAgICAgICByZXR1cm4gIlwiIiArIHN0cmluZyArICJcIiI7CisgICAgICAgIHJldHVybiBtV2lmaVN0YXRlTWFjaGluZS5zeW5jR2V0Q29uZmlndXJlZE5ldHdvcmtzKCk7CiAgICAgfQogCiAgICAgLyoqCkBAIC0xMDM0LDI4MCArNTY2LDEwIEBACiAgICAgICovCiAgICAgcHVibGljIGludCBhZGRPclVwZGF0ZU5ldHdvcmsoV2lmaUNvbmZpZ3VyYXRpb24gY29uZmlnKSB7CiAgICAgICAgIGVuZm9yY2VDaGFuZ2VQZXJtaXNzaW9uKCk7Ci0KLSAgICAgICAgLyoKLSAgICAgICAgICogSWYgdGhlIHN1cHBsaWVkIG5ldHdvcmtJZCBpcyAtMSwgd2UgY3JlYXRlIGEgbmV3IGVtcHR5Ci0gICAgICAgICAqIG5ldHdvcmsgY29uZmlndXJhdGlvbi4gT3RoZXJ3aXNlLCB0aGUgbmV0d29ya0lkIHNob3VsZAotICAgICAgICAgKiByZWZlciB0byBhbiBleGlzdGluZyBjb25maWd1cmF0aW9uLgotICAgICAgICAgKi8KLSAgICAgICAgaW50IG5ldElkID0gY29uZmlnLm5ldHdvcmtJZDsKLSAgICAgICAgYm9vbGVhbiBuZXdOZXR3b3JrID0gbmV0SWQgPT0gLTE7Ci0gICAgICAgIGJvb2xlYW4gZG9SZWNvbmZpZyA9IGZhbHNlOwotICAgICAgICAvLyBuZXR3b3JrSWQgb2YgLTEgbWVhbnMgd2Ugd2FudCB0byBjcmVhdGUgYSBuZXcgbmV0d29yawotICAgICAgICBzeW5jaHJvbml6ZWQgKG1XaWZpU3RhdGVUcmFja2VyKSB7Ci0gICAgICAgICAgICBpZiAobmV3TmV0d29yaykgewotICAgICAgICAgICAgICAgIG5ldElkID0gbVdpZmlTdGF0ZVRyYWNrZXIuYWRkTmV0d29yaygpOwotICAgICAgICAgICAgICAgIGlmIChuZXRJZCA8IDApIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKERCRykgewotICAgICAgICAgICAgICAgICAgICAgICAgU2xvZy5kKFRBRywgIkZhaWxlZCB0byBhZGQgYSBuZXR3b3JrISIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZG9SZWNvbmZpZyA9IHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtTmVlZFJlY29uZmlnID0gbU5lZWRSZWNvbmZpZyB8fCBkb1JlY29uZmlnOwotICAgICAgICB9Ci0KLSAgICAgICAgc2V0VmFyaWFibGVzOiB7Ci0gICAgICAgICAgICAvKgotICAgICAgICAgICAgICogTm90ZSB0aGF0IGlmIGEgbmV0d29ya0lkIGZvciBhIG5vbi1leGlzdGVudCBuZXR3b3JrCi0gICAgICAgICAgICAgKiB3YXMgc3VwcGxpZWQsIHRoZW4gdGhlIGZpcnN0IHNldE5ldHdvcmtWYXJpYWJsZSgpCi0gICAgICAgICAgICAgKiB3aWxsIGZhaWwsIHNvIHdlIGRvbid0IGJvdGhlciB0byBtYWtlIGEgc2VwYXJhdGUgY2hlY2sKLSAgICAgICAgICAgICAqIGZvciB0aGUgdmFsaWRpdHkgb2YgdGhlIElEIHVwIGZyb250LgotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBpZiAoY29uZmlnLlNTSUQgIT0gbnVsbCAmJgotICAgICAgICAgICAgICAgICAgICAhbVdpZmlTdGF0ZVRyYWNrZXIuc2V0TmV0d29ya1ZhcmlhYmxlKAotICAgICAgICAgICAgICAgICAgICAgICAgbmV0SWQsCi0gICAgICAgICAgICAgICAgICAgICAgICBXaWZpQ29uZmlndXJhdGlvbi5zc2lkVmFyTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy5TU0lEKSkgewotICAgICAgICAgICAgICAgIGlmIChEQkcpIHsKLSAgICAgICAgICAgICAgICAgICAgU2xvZy5kKFRBRywgImZhaWxlZCB0byBzZXQgU1NJRDogIitjb25maWcuU1NJRCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrIHNldFZhcmlhYmxlczsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKGNvbmZpZy5CU1NJRCAhPSBudWxsICYmCi0gICAgICAgICAgICAgICAgICAgICFtV2lmaVN0YXRlVHJhY2tlci5zZXROZXR3b3JrVmFyaWFibGUoCi0gICAgICAgICAgICAgICAgICAgICAgICBuZXRJZCwKLSAgICAgICAgICAgICAgICAgICAgICAgIFdpZmlDb25maWd1cmF0aW9uLmJzc2lkVmFyTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy5CU1NJRCkpIHsKLSAgICAgICAgICAgICAgICBpZiAoREJHKSB7Ci0gICAgICAgICAgICAgICAgICAgIFNsb2cuZChUQUcsICJmYWlsZWQgdG8gc2V0IEJTU0lEOiAiK2NvbmZpZy5CU1NJRCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrIHNldFZhcmlhYmxlczsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgU3RyaW5nIGFsbG93ZWRLZXlNYW5hZ2VtZW50U3RyaW5nID0KLSAgICAgICAgICAgICAgICBtYWtlU3RyaW5nKGNvbmZpZy5hbGxvd2VkS2V5TWFuYWdlbWVudCwgV2lmaUNvbmZpZ3VyYXRpb24uS2V5TWdtdC5zdHJpbmdzKTsKLSAgICAgICAgICAgIGlmIChjb25maWcuYWxsb3dlZEtleU1hbmFnZW1lbnQuY2FyZGluYWxpdHkoKSAhPSAwICYmCi0gICAgICAgICAgICAgICAgICAgICFtV2lmaVN0YXRlVHJhY2tlci5zZXROZXR3b3JrVmFyaWFibGUoCi0gICAgICAgICAgICAgICAgICAgICAgICBuZXRJZCwKLSAgICAgICAgICAgICAgICAgICAgICAgIFdpZmlDb25maWd1cmF0aW9uLktleU1nbXQudmFyTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93ZWRLZXlNYW5hZ2VtZW50U3RyaW5nKSkgewotICAgICAgICAgICAgICAgIGlmIChEQkcpIHsKLSAgICAgICAgICAgICAgICAgICAgU2xvZy5kKFRBRywgImZhaWxlZCB0byBzZXQga2V5X21nbXQ6ICIrCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dlZEtleU1hbmFnZW1lbnRTdHJpbmcpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhayBzZXRWYXJpYWJsZXM7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIFN0cmluZyBhbGxvd2VkUHJvdG9jb2xzU3RyaW5nID0KLSAgICAgICAgICAgICAgICBtYWtlU3RyaW5nKGNvbmZpZy5hbGxvd2VkUHJvdG9jb2xzLCBXaWZpQ29uZmlndXJhdGlvbi5Qcm90b2NvbC5zdHJpbmdzKTsKLSAgICAgICAgICAgIGlmIChjb25maWcuYWxsb3dlZFByb3RvY29scy5jYXJkaW5hbGl0eSgpICE9IDAgJiYKLSAgICAgICAgICAgICAgICAgICAgIW1XaWZpU3RhdGVUcmFja2VyLnNldE5ldHdvcmtWYXJpYWJsZSgKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldElkLAotICAgICAgICAgICAgICAgICAgICAgICAgV2lmaUNvbmZpZ3VyYXRpb24uUHJvdG9jb2wudmFyTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93ZWRQcm90b2NvbHNTdHJpbmcpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKERCRykgewotICAgICAgICAgICAgICAgICAgICBTbG9nLmQoVEFHLCAiZmFpbGVkIHRvIHNldCBwcm90bzogIisKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvd2VkUHJvdG9jb2xzU3RyaW5nKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWsgc2V0VmFyaWFibGVzOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBTdHJpbmcgYWxsb3dlZEF1dGhBbGdvcml0aG1zU3RyaW5nID0KLSAgICAgICAgICAgICAgICBtYWtlU3RyaW5nKGNvbmZpZy5hbGxvd2VkQXV0aEFsZ29yaXRobXMsIFdpZmlDb25maWd1cmF0aW9uLkF1dGhBbGdvcml0aG0uc3RyaW5ncyk7Ci0gICAgICAgICAgICBpZiAoY29uZmlnLmFsbG93ZWRBdXRoQWxnb3JpdGhtcy5jYXJkaW5hbGl0eSgpICE9IDAgJiYKLSAgICAgICAgICAgICAgICAgICAgIW1XaWZpU3RhdGVUcmFja2VyLnNldE5ldHdvcmtWYXJpYWJsZSgKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldElkLAotICAgICAgICAgICAgICAgICAgICAgICAgV2lmaUNvbmZpZ3VyYXRpb24uQXV0aEFsZ29yaXRobS52YXJOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dlZEF1dGhBbGdvcml0aG1zU3RyaW5nKSkgewotICAgICAgICAgICAgICAgIGlmIChEQkcpIHsKLSAgICAgICAgICAgICAgICAgICAgU2xvZy5kKFRBRywgImZhaWxlZCB0byBzZXQgYXV0aF9hbGc6ICIrCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dlZEF1dGhBbGdvcml0aG1zU3RyaW5nKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWsgc2V0VmFyaWFibGVzOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBTdHJpbmcgYWxsb3dlZFBhaXJ3aXNlQ2lwaGVyc1N0cmluZyA9Ci0gICAgICAgICAgICAgICAgbWFrZVN0cmluZyhjb25maWcuYWxsb3dlZFBhaXJ3aXNlQ2lwaGVycywgV2lmaUNvbmZpZ3VyYXRpb24uUGFpcndpc2VDaXBoZXIuc3RyaW5ncyk7Ci0gICAgICAgICAgICBpZiAoY29uZmlnLmFsbG93ZWRQYWlyd2lzZUNpcGhlcnMuY2FyZGluYWxpdHkoKSAhPSAwICYmCi0gICAgICAgICAgICAgICAgICAgICFtV2lmaVN0YXRlVHJhY2tlci5zZXROZXR3b3JrVmFyaWFibGUoCi0gICAgICAgICAgICAgICAgICAgICAgICBuZXRJZCwKLSAgICAgICAgICAgICAgICAgICAgICAgIFdpZmlDb25maWd1cmF0aW9uLlBhaXJ3aXNlQ2lwaGVyLnZhck5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICBhbGxvd2VkUGFpcndpc2VDaXBoZXJzU3RyaW5nKSkgewotICAgICAgICAgICAgICAgIGlmIChEQkcpIHsKLSAgICAgICAgICAgICAgICAgICAgU2xvZy5kKFRBRywgImZhaWxlZCB0byBzZXQgcGFpcndpc2U6ICIrCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dlZFBhaXJ3aXNlQ2lwaGVyc1N0cmluZyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrIHNldFZhcmlhYmxlczsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgU3RyaW5nIGFsbG93ZWRHcm91cENpcGhlcnNTdHJpbmcgPQotICAgICAgICAgICAgICAgIG1ha2VTdHJpbmcoY29uZmlnLmFsbG93ZWRHcm91cENpcGhlcnMsIFdpZmlDb25maWd1cmF0aW9uLkdyb3VwQ2lwaGVyLnN0cmluZ3MpOwotICAgICAgICAgICAgaWYgKGNvbmZpZy5hbGxvd2VkR3JvdXBDaXBoZXJzLmNhcmRpbmFsaXR5KCkgIT0gMCAmJgotICAgICAgICAgICAgICAgICAgICAhbVdpZmlTdGF0ZVRyYWNrZXIuc2V0TmV0d29ya1ZhcmlhYmxlKAotICAgICAgICAgICAgICAgICAgICAgICAgbmV0SWQsCi0gICAgICAgICAgICAgICAgICAgICAgICBXaWZpQ29uZmlndXJhdGlvbi5Hcm91cENpcGhlci52YXJOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dlZEdyb3VwQ2lwaGVyc1N0cmluZykpIHsKLSAgICAgICAgICAgICAgICBpZiAoREJHKSB7Ci0gICAgICAgICAgICAgICAgICAgIFNsb2cuZChUQUcsICJmYWlsZWQgdG8gc2V0IGdyb3VwOiAiKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93ZWRHcm91cENpcGhlcnNTdHJpbmcpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhayBzZXRWYXJpYWJsZXM7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIFByZXZlbnQgY2xpZW50IHNjcmV3LXVwIGJ5IHBhc3NpbmcgaW4gYSBXaWZpQ29uZmlndXJhdGlvbiB3ZSBnYXZlIGl0Ci0gICAgICAgICAgICAvLyBieSBwcmV2ZW50aW5nICIqIiBhcyBhIGtleS4KLSAgICAgICAgICAgIGlmIChjb25maWcucHJlU2hhcmVkS2V5ICE9IG51bGwgJiYgIWNvbmZpZy5wcmVTaGFyZWRLZXkuZXF1YWxzKCIqIikgJiYKLSAgICAgICAgICAgICAgICAgICAgIW1XaWZpU3RhdGVUcmFja2VyLnNldE5ldHdvcmtWYXJpYWJsZSgKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldElkLAotICAgICAgICAgICAgICAgICAgICAgICAgV2lmaUNvbmZpZ3VyYXRpb24ucHNrVmFyTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy5wcmVTaGFyZWRLZXkpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKERCRykgewotICAgICAgICAgICAgICAgICAgICBTbG9nLmQoVEFHLCAiZmFpbGVkIHRvIHNldCBwc2s6ICIrY29uZmlnLnByZVNoYXJlZEtleSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrIHNldFZhcmlhYmxlczsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgYm9vbGVhbiBoYXNTZXRLZXkgPSBmYWxzZTsKLSAgICAgICAgICAgIGlmIChjb25maWcud2VwS2V5cyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb25maWcud2VwS2V5cy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgICAgICAvLyBQcmV2ZW50IGNsaWVudCBzY3Jldy11cCBieSBwYXNzaW5nIGluIGEgV2lmaUNvbmZpZ3VyYXRpb24gd2UgZ2F2ZSBpdAotICAgICAgICAgICAgICAgICAgICAvLyBieSBwcmV2ZW50aW5nICIqIiBhcyBhIGtleS4KLSAgICAgICAgICAgICAgICAgICAgaWYgKGNvbmZpZy53ZXBLZXlzW2ldICE9IG51bGwgJiYgIWNvbmZpZy53ZXBLZXlzW2ldLmVxdWFscygiKiIpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIW1XaWZpU3RhdGVUcmFja2VyLnNldE5ldHdvcmtWYXJpYWJsZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldElkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2lmaUNvbmZpZ3VyYXRpb24ud2VwS2V5VmFyTmFtZXNbaV0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWcud2VwS2V5c1tpXSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoREJHKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNsb2cuZChUQUcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImZhaWxlZCB0byBzZXQgd2VwX2tleSIraSsiOiAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWcud2VwS2V5c1tpXSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrIHNldFZhcmlhYmxlczsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGhhc1NldEtleSA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChoYXNTZXRLZXkpIHsKLSAgICAgICAgICAgICAgICBpZiAoIW1XaWZpU3RhdGVUcmFja2VyLnNldE5ldHdvcmtWYXJpYWJsZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXRJZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBXaWZpQ29uZmlndXJhdGlvbi53ZXBUeEtleUlkeFZhck5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgSW50ZWdlci50b1N0cmluZyhjb25maWcud2VwVHhLZXlJbmRleCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChEQkcpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFNsb2cuZChUQUcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmYWlsZWQgdG8gc2V0IHdlcF90eF9rZXlpZHg6ICIrCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy53ZXBUeEtleUluZGV4KTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBicmVhayBzZXRWYXJpYWJsZXM7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoIW1XaWZpU3RhdGVUcmFja2VyLnNldE5ldHdvcmtWYXJpYWJsZSgKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldElkLAotICAgICAgICAgICAgICAgICAgICAgICAgV2lmaUNvbmZpZ3VyYXRpb24ucHJpb3JpdHlWYXJOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgSW50ZWdlci50b1N0cmluZyhjb25maWcucHJpb3JpdHkpKSkgewotICAgICAgICAgICAgICAgIGlmIChEQkcpIHsKLSAgICAgICAgICAgICAgICAgICAgU2xvZy5kKFRBRywgY29uZmlnLlNTSUQgKyAiOiBmYWlsZWQgdG8gc2V0IHByaW9yaXR5OiAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgK2NvbmZpZy5wcmlvcml0eSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrIHNldFZhcmlhYmxlczsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKGNvbmZpZy5oaWRkZW5TU0lEICYmICFtV2lmaVN0YXRlVHJhY2tlci5zZXROZXR3b3JrVmFyaWFibGUoCi0gICAgICAgICAgICAgICAgICAgICAgICBuZXRJZCwKLSAgICAgICAgICAgICAgICAgICAgICAgIFdpZmlDb25maWd1cmF0aW9uLmhpZGRlblNTSURWYXJOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgSW50ZWdlci50b1N0cmluZyhjb25maWcuaGlkZGVuU1NJRCA/IDEgOiAwKSkpIHsKLSAgICAgICAgICAgICAgICBpZiAoREJHKSB7Ci0gICAgICAgICAgICAgICAgICAgIFNsb2cuZChUQUcsIGNvbmZpZy5TU0lEICsgIjogZmFpbGVkIHRvIHNldCBoaWRkZW5TU0lEOiAiKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy5oaWRkZW5TU0lEKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWsgc2V0VmFyaWFibGVzOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBmb3IgKFdpZmlDb25maWd1cmF0aW9uLkVudGVycHJpc2VGaWVsZCBmaWVsZAotICAgICAgICAgICAgICAgICAgICA6IGNvbmZpZy5lbnRlcnByaXNlRmllbGRzKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHZhck5hbWUgPSBmaWVsZC52YXJOYW1lKCk7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHZhbHVlID0gZmllbGQudmFsdWUoKTsKLSAgICAgICAgICAgICAgICBpZiAodmFsdWUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBpZiAoZmllbGQgIT0gY29uZmlnLmVhcCkgewotICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSAodmFsdWUubGVuZ3RoKCkgPT0gMCkgPyAiTlVMTCIgOiBjb252ZXJ0VG9RdW90ZWRTdHJpbmcodmFsdWUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGlmICghbVdpZmlTdGF0ZVRyYWNrZXIuc2V0TmV0d29ya1ZhcmlhYmxlKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXRJZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoREJHKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgU2xvZy5kKFRBRywgY29uZmlnLlNTSUQgKyAiOiBmYWlsZWQgdG8gc2V0ICIgKyB2YXJOYW1lICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI6ICIgKyB2YWx1ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhayBzZXRWYXJpYWJsZXM7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gbmV0SWQ7Ci0gICAgICAgIH0KLQotICAgICAgICAvKgotICAgICAgICAgKiBGb3IgYW4gdXBkYXRlLCBpZiBvbmUgb2YgdGhlIHNldE5ldHdvcmtWYXJpYWJsZSBvcGVyYXRpb25zIGZhaWxzLAotICAgICAgICAgKiB3ZSBtaWdodCB3YW50IHRvIHJvbGwgYmFjayBhbGwgdGhlIGNoYW5nZXMgYWxyZWFkeSBtYWRlLiBCdXQgdGhlCi0gICAgICAgICAqIGNoYW5jZXMgYXJlIHRoYXQgaWYgYW55dGhpbmcgaXMgZ29pbmcgdG8gZ28gd3JvbmcsIGl0J2xsIGhhcHBlbgotICAgICAgICAgKiB0aGUgZmlyc3QgdGltZSB3ZSB0cnkgdG8gc2V0IG9uZSBvZiB0aGUgdmFyaWFibGVzLgotICAgICAgICAgKi8KLSAgICAgICAgaWYgKG5ld05ldHdvcmspIHsKLSAgICAgICAgICAgIHJlbW92ZU5ldHdvcmsobmV0SWQpOwotICAgICAgICAgICAgaWYgKERCRykgewotICAgICAgICAgICAgICAgIFNsb2cuZChUQUcsCi0gICAgICAgICAgICAgICAgICAgICAgICAiRmFpbGVkIHRvIHNldCBhIG5ldHdvcmsgdmFyaWFibGUsIHJlbW92ZWQgbmV0d29yazogIgotICAgICAgICAgICAgICAgICAgICAgICAgKyBuZXRJZCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIC0xOworICAgICAgICByZXR1cm4gbVdpZmlTdGF0ZU1hY2hpbmUuc3luY0FkZE9yVXBkYXRlTmV0d29yayhjb25maWcpOwogICAgIH0KIAotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBtYWtlU3RyaW5nKEJpdFNldCBzZXQsIFN0cmluZ1tdIHN0cmluZ3MpIHsKLSAgICAgICAgU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICAgICAgaW50IG5leHRTZXRCaXQgPSAtMTsKLQotICAgICAgICAvKiBNYWtlIHN1cmUgYWxsIHNldCBiaXRzIGFyZSBpbiBbMCwgc3RyaW5ncy5sZW5ndGgpIHRvIGF2b2lkCi0gICAgICAgICAqIGdvaW5nIG91dCBvZiBib3VuZHMgb24gc3RyaW5ncy4gIChTaG91bGRuJ3QgaGFwcGVuLCBidXQuLi4pICovCi0gICAgICAgIHNldCA9IHNldC5nZXQoMCwgc3RyaW5ncy5sZW5ndGgpOwotCi0gICAgICAgIHdoaWxlICgobmV4dFNldEJpdCA9IHNldC5uZXh0U2V0Qml0KG5leHRTZXRCaXQgKyAxKSkgIT0gLTEpIHsKLSAgICAgICAgICAgIGJ1Zi5hcHBlbmQoc3RyaW5nc1tuZXh0U2V0Qml0XS5yZXBsYWNlKCdfJywgJy0nKSkuYXBwZW5kKCcgJyk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyByZW1vdmUgdHJhaWxpbmcgc3BhY2UKLSAgICAgICAgaWYgKHNldC5jYXJkaW5hbGl0eSgpID4gMCkgewotICAgICAgICAgICAgYnVmLnNldExlbmd0aChidWYubGVuZ3RoKCkgLSAxKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBidWYudG9TdHJpbmcoKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBpbnQgbG9va3VwU3RyaW5nKFN0cmluZyBzdHJpbmcsIFN0cmluZ1tdIHN0cmluZ3MpIHsKLSAgICAgICAgaW50IHNpemUgPSBzdHJpbmdzLmxlbmd0aDsKLQotICAgICAgICBzdHJpbmcgPSBzdHJpbmcucmVwbGFjZSgnLScsICdfJyk7Ci0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspCi0gICAgICAgICAgICBpZiAoc3RyaW5nLmVxdWFscyhzdHJpbmdzW2ldKSkKLSAgICAgICAgICAgICAgICByZXR1cm4gaTsKLQotICAgICAgICBpZiAoREJHKSB7Ci0gICAgICAgICAgICAvLyBpZiB3ZSBldmVyIGdldCBoZXJlLCB3ZSBzaG91bGQgcHJvYmFibHkgYWRkIHRoZQotICAgICAgICAgICAgLy8gdmFsdWUgdG8gV2lmaUNvbmZpZ3VyYXRpb24gdG8gcmVmbGVjdCB0aGF0IGl0J3MKLSAgICAgICAgICAgIC8vIHN1cHBvcnRlZCBieSB0aGUgV1BBIHN1cHBsaWNhbnQKLSAgICAgICAgICAgIFNsb2cudyhUQUcsICJGYWlsZWQgdG8gbG9vay11cCBhIHN0cmluZzogIiArIHN0cmluZyk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQotCi0gICAgLyoqCisgICAgIC8qKgogICAgICAqIFNlZSB7QGxpbmsgYW5kcm9pZC5uZXQud2lmaS5XaWZpTWFuYWdlciNyZW1vdmVOZXR3b3JrKGludCl9CiAgICAgICogQHBhcmFtIG5ldElkIHRoZSBpbnRlZ2VyIHRoYXQgaWRlbnRpZmllcyB0aGUgbmV0d29yayBjb25maWd1cmF0aW9uCiAgICAgICogdG8gdGhlIHN1cHBsaWNhbnQKQEAgLTEzMTUsOCArNTc3LDcgQEAKICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiByZW1vdmVOZXR3b3JrKGludCBuZXRJZCkgewogICAgICAgICBlbmZvcmNlQ2hhbmdlUGVybWlzc2lvbigpOwotCi0gICAgICAgIHJldHVybiBtV2lmaVN0YXRlVHJhY2tlci5yZW1vdmVOZXR3b3JrKG5ldElkKTsKKyAgICAgICAgcmV0dXJuIG1XaWZpU3RhdGVNYWNoaW5lLnN5bmNSZW1vdmVOZXR3b3JrKG5ldElkKTsKICAgICB9CiAKICAgICAvKioKQEAgLTEzMjgsMTQgKzU4OSw3IEBACiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gZW5hYmxlTmV0d29yayhpbnQgbmV0SWQsIGJvb2xlYW4gZGlzYWJsZU90aGVycykgewogICAgICAgICBlbmZvcmNlQ2hhbmdlUGVybWlzc2lvbigpOwotCi0gICAgICAgIFN0cmluZyBpZm5hbWUgPSBtV2lmaVN0YXRlVHJhY2tlci5nZXRJbnRlcmZhY2VOYW1lKCk7Ci0gICAgICAgIE5ldHdvcmtVdGlscy5lbmFibGVJbnRlcmZhY2UoaWZuYW1lKTsKLSAgICAgICAgYm9vbGVhbiByZXN1bHQgPSBtV2lmaVN0YXRlVHJhY2tlci5lbmFibGVOZXR3b3JrKG5ldElkLCBkaXNhYmxlT3RoZXJzKTsKLSAgICAgICAgaWYgKCFyZXN1bHQpIHsKLSAgICAgICAgICAgIE5ldHdvcmtVdGlscy5kaXNhYmxlSW50ZXJmYWNlKGlmbmFtZSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgcmV0dXJuIG1XaWZpU3RhdGVNYWNoaW5lLnN5bmNFbmFibGVOZXR3b3JrKG5ldElkLCBkaXNhYmxlT3RoZXJzKTsKICAgICB9CiAKICAgICAvKioKQEAgLTEzNDYsOCArNjAwLDcgQEAKICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiBkaXNhYmxlTmV0d29yayhpbnQgbmV0SWQpIHsKICAgICAgICAgZW5mb3JjZUNoYW5nZVBlcm1pc3Npb24oKTsKLQotICAgICAgICByZXR1cm4gbVdpZmlTdGF0ZVRyYWNrZXIuZGlzYWJsZU5ldHdvcmsobmV0SWQpOworICAgICAgICByZXR1cm4gbVdpZmlTdGF0ZU1hY2hpbmUuc3luY0Rpc2FibGVOZXR3b3JrKG5ldElkKTsKICAgICB9CiAKICAgICAvKioKQEAgLTEzNjAsNyArNjEzLDcgQEAKICAgICAgICAgICogTWFrZSBzdXJlIHdlIGhhdmUgdGhlIGxhdGVzdCBpbmZvcm1hdGlvbiwgYnkgc2VuZGluZwogICAgICAgICAgKiBhIHN0YXR1cyByZXF1ZXN0IHRvIHRoZSBzdXBwbGljYW50LgogICAgICAgICAgKi8KLSAgICAgICAgcmV0dXJuIG1XaWZpU3RhdGVUcmFja2VyLnJlcXVlc3RDb25uZWN0aW9uSW5mbygpOworICAgICAgICByZXR1cm4gbVdpZmlTdGF0ZU1hY2hpbmUuc3luY1JlcXVlc3RDb25uZWN0aW9uSW5mbygpOwogICAgIH0KIAogICAgIC8qKgpAQCAtMTM3MCwxODAgKzYyMywxOSBAQAogICAgICAqLwogICAgIHB1YmxpYyBMaXN0PFNjYW5SZXN1bHQ+IGdldFNjYW5SZXN1bHRzKCkgewogICAgICAgICBlbmZvcmNlQWNjZXNzUGVybWlzc2lvbigpOwotICAgICAgICBTdHJpbmcgcmVwbHk7Ci0KLSAgICAgICAgcmVwbHkgPSBtV2lmaVN0YXRlVHJhY2tlci5zY2FuUmVzdWx0cygpOwotICAgICAgICBpZiAocmVwbHkgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICBMaXN0PFNjYW5SZXN1bHQ+IHNjYW5MaXN0ID0gbmV3IEFycmF5TGlzdDxTY2FuUmVzdWx0PigpOwotCi0gICAgICAgIGludCBsaW5lQ291bnQgPSAwOwotCi0gICAgICAgIGludCByZXBseUxlbiA9IHJlcGx5Lmxlbmd0aCgpOwotICAgICAgICAvLyBQYXJzZSB0aGUgcmVzdWx0IHN0cmluZywga2VlcGluZyBpbiBtaW5kIHRoYXQgdGhlIGxhc3QgbGluZSBkb2VzCi0gICAgICAgIC8vIG5vdCBlbmQgd2l0aCBhIG5ld2xpbmUuCi0gICAgICAgIGZvciAoaW50IGxpbmVCZWcgPSAwLCBsaW5lRW5kID0gMDsgbGluZUVuZCA8PSByZXBseUxlbjsgKytsaW5lRW5kKSB7Ci0gICAgICAgICAgICBpZiAobGluZUVuZCA9PSByZXBseUxlbiB8fCByZXBseS5jaGFyQXQobGluZUVuZCkgPT0gJ1xuJykgewotICAgICAgICAgICAgICAgICsrbGluZUNvdW50OwotICAgICAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgICAgICogU2tpcCB0aGUgZmlyc3QgbGluZSwgd2hpY2ggaXMgYSBoZWFkZXIKLSAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICBpZiAobGluZUNvdW50ID09IDEpIHsKLSAgICAgICAgICAgICAgICAgICAgbGluZUJlZyA9IGxpbmVFbmQgKyAxOwotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKGxpbmVFbmQgPiBsaW5lQmVnKSB7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBsaW5lID0gcmVwbHkuc3Vic3RyaW5nKGxpbmVCZWcsIGxpbmVFbmQpOwotICAgICAgICAgICAgICAgICAgICBTY2FuUmVzdWx0IHNjYW5SZXN1bHQgPSBwYXJzZVNjYW5SZXN1bHQobGluZSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChzY2FuUmVzdWx0ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNjYW5MaXN0LmFkZChzY2FuUmVzdWx0KTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChEQkcpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFNsb2cudyhUQUcsICJtaXNmb3JtYXR0ZWQgc2NhbiByZXN1bHQgZm9yOiAiICsgbGluZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbGluZUJlZyA9IGxpbmVFbmQgKyAxOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIG1XaWZpU3RhdGVUcmFja2VyLnNldFNjYW5SZXN1bHRzTGlzdChzY2FuTGlzdCk7Ci0gICAgICAgIHJldHVybiBzY2FuTGlzdDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBQYXJzZSB0aGUgc2NhbiByZXN1bHQgbGluZSBwYXNzZWQgdG8gdXMgYnkgd3BhX3N1cHBsaWNhbnQgKGhlbHBlcikuCi0gICAgICogQHBhcmFtIGxpbmUgdGhlIGxpbmUgdG8gcGFyc2UKLSAgICAgKiBAcmV0dXJuIHRoZSB7QGxpbmsgU2NhblJlc3VsdH0gb2JqZWN0Ci0gICAgICovCi0gICAgcHJpdmF0ZSBTY2FuUmVzdWx0IHBhcnNlU2NhblJlc3VsdChTdHJpbmcgbGluZSkgewotICAgICAgICBTY2FuUmVzdWx0IHNjYW5SZXN1bHQgPSBudWxsOwotICAgICAgICBpZiAobGluZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAvKgotICAgICAgICAgICAgICogQ2FjaGUgaW1wbGVtZW50YXRpb24gKExpbmtlZEhhc2hNYXApIGlzIG5vdCBzeW5jaHJvbml6ZWQsIHRodXMsCi0gICAgICAgICAgICAgKiBtdXN0IHN5bmNocm9uaXplZCBoZXJlIQotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG1TY2FuUmVzdWx0Q2FjaGUpIHsKLSAgICAgICAgICAgICAgICBTdHJpbmdbXSByZXN1bHQgPSBzY2FuUmVzdWx0UGF0dGVybi5zcGxpdChsaW5lKTsKLSAgICAgICAgICAgICAgICBpZiAoMyA8PSByZXN1bHQubGVuZ3RoICYmIHJlc3VsdC5sZW5ndGggPD0gNSkgewotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgYnNzaWQgPSByZXN1bHRbMF07Ci0gICAgICAgICAgICAgICAgICAgIC8vIGJzc2lkIHwgZnJlcXVlbmN5IHwgbGV2ZWwgfCBmbGFncyB8IHNzaWQKLSAgICAgICAgICAgICAgICAgICAgaW50IGZyZXF1ZW5jeTsKLSAgICAgICAgICAgICAgICAgICAgaW50IGxldmVsOwotICAgICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAgICAgZnJlcXVlbmN5ID0gSW50ZWdlci5wYXJzZUludChyZXN1bHRbMV0pOwotICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWwgPSBJbnRlZ2VyLnBhcnNlSW50KHJlc3VsdFsyXSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKiBzb21lIGltcGxlbWVudGF0aW9ucyBhdm9pZCBuZWdhdGl2ZSB2YWx1ZXMgYnkgYWRkaW5nIDI1NgotICAgICAgICAgICAgICAgICAgICAgICAgICogc28gd2UgbmVlZCB0byBhZGp1c3QgZm9yIHRoYXQgaGVyZS4KLSAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxldmVsID4gMCkgbGV2ZWwgLT0gMjU2OwotICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgZnJlcXVlbmN5ID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxldmVsID0gMDsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgICAgICAgICAqIFRoZSBmb3JtYXR0aW5nIG9mIHRoZSByZXN1bHRzIHJldHVybmVkIGJ5Ci0gICAgICAgICAgICAgICAgICAgICAqIHdwYV9zdXBwbGljYW50IGlzIGludGVuZGVkIHRvIG1ha2UgdGhlIGZpZWxkcwotICAgICAgICAgICAgICAgICAgICAgKiBsaW5lIHVwIG5pY2VseSB3aGVuIHByaW50ZWQsCi0gICAgICAgICAgICAgICAgICAgICAqIG5vdCB0byBtYWtlIHRoZW0gZWFzeSB0byBwYXJzZS4gU28gd2UgaGF2ZSB0bwotICAgICAgICAgICAgICAgICAgICAgKiBhcHBseSBzb21lIGhldXJpc3RpY3MgdG8gZmlndXJlIG91dCB3aGljaCBmaWVsZAotICAgICAgICAgICAgICAgICAgICAgKiBpcyB0aGUgU1NJRCBhbmQgd2hpY2ggZmllbGQgaXMgdGhlIGZsYWdzLgotICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHNzaWQ7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBmbGFnczsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdC5sZW5ndGggPT0gNCkgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdFszXS5jaGFyQXQoMCkgPT0gJ1snKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MgPSByZXN1bHRbM107Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3NpZCA9ICIiOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncyA9ICIiOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNzaWQgPSByZXN1bHRbM107Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocmVzdWx0Lmxlbmd0aCA9PSA1KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmbGFncyA9IHJlc3VsdFszXTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNzaWQgPSByZXN1bHRbNF07Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBIZXJlLCB3ZSBtdXN0IGhhdmUgMyBmaWVsZHM6IG5vIGZsYWdzIGFuZCBzc2lkCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBzZXQKLSAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzID0gIiI7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzc2lkID0gIiI7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAvLyBic3NpZCArIHNzaWQgaXMgdGhlIGhhc2gga2V5Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBrZXkgPSBic3NpZCArIHNzaWQ7Ci0gICAgICAgICAgICAgICAgICAgIHNjYW5SZXN1bHQgPSBtU2NhblJlc3VsdENhY2hlLmdldChrZXkpOwotICAgICAgICAgICAgICAgICAgICBpZiAoc2NhblJlc3VsdCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzY2FuUmVzdWx0LmxldmVsID0gbGV2ZWw7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzY2FuUmVzdWx0LlNTSUQgPSBzc2lkOwotICAgICAgICAgICAgICAgICAgICAgICAgc2NhblJlc3VsdC5jYXBhYmlsaXRpZXMgPSBmbGFnczsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNjYW5SZXN1bHQuZnJlcXVlbmN5ID0gZnJlcXVlbmN5OwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gRG8gbm90IGFkZCBzY2FuIHJlc3VsdHMgdGhhdCBoYXZlIG5vIFNTSUQgc2V0Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoMCA8IHNzaWQudHJpbSgpLmxlbmd0aCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NhblJlc3VsdCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBTY2FuUmVzdWx0KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3NpZCwgYnNzaWQsIGZsYWdzLCBsZXZlbCwgZnJlcXVlbmN5KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtU2NhblJlc3VsdENhY2hlLnB1dChrZXksIHNjYW5SZXN1bHQpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgU2xvZy53KFRBRywgIk1pc2Zvcm1hdHRlZCBzY2FuIHJlc3VsdCB0ZXh0IHdpdGggIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5sZW5ndGggKyAiIGZpZWxkczogIiArIGxpbmUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBzY2FuUmVzdWx0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFBhcnNlIHRoZSAiZmxhZ3MiIGZpZWxkIHBhc3NlZCBiYWNrIGluIGEgc2NhbiByZXN1bHQgYnkgd3BhX3N1cHBsaWNhbnQsCi0gICAgICogYW5kIGNvbnN0cnVjdCBhIHtAY29kZSBXaWZpQ29uZmlndXJhdGlvbn0gdGhhdCBkZXNjcmliZXMgdGhlIGVuY3J5cHRpb24sCi0gICAgICoga2V5IG1hbmFnZW1lbnQsIGFuZCBhdXRoZW50aWNhaW9uIGNhcGFiaWxpdGllcyBvZiB0aGUgYWNjZXNzIHBvaW50LgotICAgICAqIEBwYXJhbSBmbGFncyB0aGUgc3RyaW5nIHJldHVybmVkIGJ5IHdwYV9zdXBwbGljYW50Ci0gICAgICogQHJldHVybiB0aGUge0BsaW5rIFdpZmlDb25maWd1cmF0aW9ufSBvYmplY3QsIGZpbGxlZCBpbgotICAgICAqLwotICAgIFdpZmlDb25maWd1cmF0aW9uIHBhcnNlU2NhbkZsYWdzKFN0cmluZyBmbGFncykgewotICAgICAgICBXaWZpQ29uZmlndXJhdGlvbiBjb25maWcgPSBuZXcgV2lmaUNvbmZpZ3VyYXRpb24oKTsKLQotICAgICAgICBpZiAoZmxhZ3MubGVuZ3RoKCkgPT0gMCkgewotICAgICAgICAgICAgY29uZmlnLmFsbG93ZWRLZXlNYW5hZ2VtZW50LnNldChXaWZpQ29uZmlndXJhdGlvbi5LZXlNZ210Lk5PTkUpOwotICAgICAgICB9Ci0gICAgICAgIC8vIC4uLiB0byBiZSBpbXBsZW1lbnRlZAotICAgICAgICByZXR1cm4gY29uZmlnOworICAgICAgICByZXR1cm4gbVdpZmlTdGF0ZU1hY2hpbmUuc3luY0dldFNjYW5SZXN1bHRzTGlzdCgpOwogICAgIH0KIAogICAgIC8qKgogICAgICAqIFRlbGwgdGhlIHN1cHBsaWNhbnQgdG8gcGVyc2lzdCB0aGUgY3VycmVudCBsaXN0IG9mIGNvbmZpZ3VyZWQgbmV0d29ya3MuCiAgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhlIG9wZXJhdGlvbiBzdWNjZWVkZWQKKyAgICAgKgorICAgICAqIFRPRE86IGRlcHJlY2F0ZSB0aGlzCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gc2F2ZUNvbmZpZ3VyYXRpb24oKSB7Ci0gICAgICAgIGJvb2xlYW4gcmVzdWx0OworICAgICAgICBib29sZWFuIHJlc3VsdCA9IHRydWU7CiAgICAgICAgIGVuZm9yY2VDaGFuZ2VQZXJtaXNzaW9uKCk7Ci0KLSAgICAgICAgc3luY2hyb25pemVkIChtV2lmaVN0YXRlVHJhY2tlcikgewotICAgICAgICAgICAgcmVzdWx0ID0gbVdpZmlTdGF0ZVRyYWNrZXIuc2F2ZUNvbmZpZygpOwotICAgICAgICAgICAgaWYgKHJlc3VsdCAmJiBtTmVlZFJlY29uZmlnKSB7Ci0gICAgICAgICAgICAgICAgbU5lZWRSZWNvbmZpZyA9IGZhbHNlOwotICAgICAgICAgICAgICAgIHJlc3VsdCA9IG1XaWZpU3RhdGVUcmFja2VyLnJlbG9hZENvbmZpZygpOwotCi0gICAgICAgICAgICAgICAgaWYgKHJlc3VsdCkgewotICAgICAgICAgICAgICAgICAgICBJbnRlbnQgaW50ZW50ID0gbmV3IEludGVudChXaWZpTWFuYWdlci5ORVRXT1JLX0lEU19DSEFOR0VEX0FDVElPTik7Ci0gICAgICAgICAgICAgICAgICAgIG1Db250ZXh0LnNlbmRCcm9hZGNhc3QoaW50ZW50KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgLy8gSW5mb3JtIHRoZSBiYWNrdXAgbWFuYWdlciBhYm91dCBhIGRhdGEgY2hhbmdlCi0gICAgICAgIElCYWNrdXBNYW5hZ2VyIGlibSA9IElCYWNrdXBNYW5hZ2VyLlN0dWIuYXNJbnRlcmZhY2UoCi0gICAgICAgICAgICAgICAgU2VydmljZU1hbmFnZXIuZ2V0U2VydmljZShDb250ZXh0LkJBQ0tVUF9TRVJWSUNFKSk7Ci0gICAgICAgIGlmIChpYm0gIT0gbnVsbCkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBpYm0uZGF0YUNoYW5nZWQoImNvbS5hbmRyb2lkLnByb3ZpZGVycy5zZXR0aW5ncyIpOwotICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAvLyBUcnkgYWdhaW4gbGF0ZXIKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICByZXR1cm4gbVdpZmlTdGF0ZU1hY2hpbmUuc3luY1NhdmVDb25maWcoKTsKICAgICB9CiAKICAgICAvKioKQEAgLTE1NTgsNyArNjUwLDcgQEAKICAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGUgb3BlcmF0aW9uIHN1Y2NlZWRzLCB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZSwgZS5nLiwKICAgICAgKiB7QGNvZGUgbnVtQ2hhbm5lbHN9IGlzIG91dHNpZGUgdGhlIHZhbGlkIHJhbmdlLgogICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIHNldE51bUFsbG93ZWRDaGFubmVscyhpbnQgbnVtQ2hhbm5lbHMsIGJvb2xlYW4gcGVyc2lzdCkgeworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgYm9vbGVhbiBzZXROdW1BbGxvd2VkQ2hhbm5lbHMoaW50IG51bUNoYW5uZWxzLCBib29sZWFuIHBlcnNpc3QpIHsKICAgICAgICAgU2xvZy5pKFRBRywgIldpZmlTZXJ2aWNlIHRyeWluZyB0byBzZXROdW1BbGxvd2VkIHRvICIrbnVtQ2hhbm5lbHMrCiAgICAgICAgICAgICAgICAgIiB3aXRoIHBlcnNpc3Qgc2V0IHRvICIrcGVyc2lzdCk7CiAgICAgICAgIGVuZm9yY2VDaGFuZ2VQZXJtaXNzaW9uKCk7CkBAIC0xNTgwLDI4ICs2NzIsMTUgQEAKICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfQogCi0gICAgICAgIGlmIChtV2lmaUhhbmRsZXIgPT0gbnVsbCkgcmV0dXJuIGZhbHNlOwotCi0gICAgICAgIE1lc3NhZ2Uub2J0YWluKG1XaWZpSGFuZGxlciwKLSAgICAgICAgICAgICAgICBNRVNTQUdFX1NFVF9DSEFOTkVMUywgbnVtQ2hhbm5lbHMsIChwZXJzaXN0ID8gMSA6IDApKS5zZW5kVG9UYXJnZXQoKTsKLQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBzZXRzIHRoZSBudW1iZXIgb2YgYWxsb3dlZCByYWRpbyBmcmVxdWVuY3kgY2hhbm5lbHMgc3luY2hyb25vdXNseQotICAgICAqIEBwYXJhbSBudW1DaGFubmVscyB0aGUgbnVtYmVyIG9mIGFsbG93ZWQgY2hhbm5lbHMuIE11c3QgYmUgZ3JlYXRlciB0aGFuIDAKLSAgICAgKiBhbmQgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIDE2LgotICAgICAqIEBwYXJhbSBwZXJzaXN0IHtAY29kZSB0cnVlfSBpZiB0aGUgc2V0dGluZyBzaG91bGQgYmUgcmVtZW1iZXJlZC4KLSAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGUgb3BlcmF0aW9uIHN1Y2NlZWRzLCB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZQotICAgICAqLwotICAgIHByaXZhdGUgYm9vbGVhbiBzZXROdW1BbGxvd2VkQ2hhbm5lbHNCbG9ja2luZyhpbnQgbnVtQ2hhbm5lbHMsIGJvb2xlYW4gcGVyc2lzdCkgewogICAgICAgICBpZiAocGVyc2lzdCkgewogICAgICAgICAgICAgU2V0dGluZ3MuU2VjdXJlLnB1dEludChtQ29udGV4dC5nZXRDb250ZW50UmVzb2x2ZXIoKSwKICAgICAgICAgICAgICAgICAgICAgU2V0dGluZ3MuU2VjdXJlLldJRklfTlVNX0FMTE9XRURfQ0hBTk5FTFMsCiAgICAgICAgICAgICAgICAgICAgIG51bUNoYW5uZWxzKTsKICAgICAgICAgfQotICAgICAgICByZXR1cm4gbVdpZmlTdGF0ZVRyYWNrZXIuc2V0TnVtQWxsb3dlZENoYW5uZWxzKG51bUNoYW5uZWxzKTsKKworICAgICAgICBtV2lmaVN0YXRlTWFjaGluZS5zZXROdW1BbGxvd2VkQ2hhbm5lbHMobnVtQ2hhbm5lbHMpOworCisgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KIAogICAgIC8qKgpAQCAtMTYxOSw3ICs2OTgsNyBAQAogICAgICAgICAgKiBXaS1GaSBpcyBub3QgY3VycmVudGx5IGVuYWJsZWQpLCBnZXQgdGhlIHZhbHVlIGZyb20KICAgICAgICAgICogU2V0dGluZ3MuCiAgICAgICAgICAqLwotICAgICAgICBudW1DaGFubmVscyA9IG1XaWZpU3RhdGVUcmFja2VyLmdldE51bUFsbG93ZWRDaGFubmVscygpOworICAgICAgICBudW1DaGFubmVscyA9IG1XaWZpU3RhdGVNYWNoaW5lLmdldE51bUFsbG93ZWRDaGFubmVscygpOwogICAgICAgICBpZiAobnVtQ2hhbm5lbHMgPCAwKSB7CiAgICAgICAgICAgICBudW1DaGFubmVscyA9IFNldHRpbmdzLlNlY3VyZS5nZXRJbnQobUNvbnRleHQuZ2V0Q29udGVudFJlc29sdmVyKCksCiAgICAgICAgICAgICAgICAgICAgIFNldHRpbmdzLlNlY3VyZS5XSUZJX05VTV9BTExPV0VEX0NIQU5ORUxTLApAQCAtMTY0NSw3ICs3MjQsNzYgQEAKICAgICAgKi8KICAgICBwdWJsaWMgRGhjcEluZm8gZ2V0RGhjcEluZm8oKSB7CiAgICAgICAgIGVuZm9yY2VBY2Nlc3NQZXJtaXNzaW9uKCk7Ci0gICAgICAgIHJldHVybiBtV2lmaVN0YXRlVHJhY2tlci5nZXREaGNwSW5mbygpOworICAgICAgICByZXR1cm4gbVdpZmlTdGF0ZU1hY2hpbmUuc3luY0dldERoY3BJbmZvKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogc2VlIHtAbGluayBhbmRyb2lkLm5ldC53aWZpLldpZmlNYW5hZ2VyI3N0YXJ0V2lmaX0KKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHN0YXJ0V2lmaSgpIHsKKyAgICAgICAgZW5mb3JjZUNoYW5nZVBlcm1pc3Npb24oKTsKKyAgICAgICAgLyogVE9ETzogbWF5IGJlIGFkZCBwZXJtaXNzaW9ucyBmb3IgYWNjZXNzIG9ubHkgdG8gY29ubmVjdGl2aXR5IHNlcnZpY2UKKyAgICAgICAgICogVE9ETzogaWYgYSBzdGFydCBpc3N1ZWQsIGtlZXAgd2lmaSBhbGl2ZSB1bnRpbCBhIHN0b3AgaXNzdWVkIGlycmVzcGVjdGl2ZQorICAgICAgICAgKiBvZiBXaWZpTG9jayAmIGRldmljZSBpZGxlIHN0YXR1cyB1bmxlc3Mgd2lmaSBlbmFibGVkIHN0YXR1cyBpcyB0b2dnbGVkCisgICAgICAgICAqLworCisgICAgICAgIG1XaWZpU3RhdGVNYWNoaW5lLnNldERyaXZlclN0YXJ0KHRydWUpOworICAgICAgICBtV2lmaVN0YXRlTWFjaGluZS5yZWNvbm5lY3RDb21tYW5kKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogc2VlIHtAbGluayBhbmRyb2lkLm5ldC53aWZpLldpZmlNYW5hZ2VyI3N0b3BXaWZpfQorICAgICAqCisgICAgICovCisgICAgcHVibGljIHZvaWQgc3RvcFdpZmkoKSB7CisgICAgICAgIGVuZm9yY2VDaGFuZ2VQZXJtaXNzaW9uKCk7CisgICAgICAgIC8qIFRPRE86IG1heSBiZSBhZGQgcGVybWlzc2lvbnMgZm9yIGFjY2VzcyBvbmx5IHRvIGNvbm5lY3Rpdml0eSBzZXJ2aWNlCisgICAgICAgICAqIFRPRE86IGlmIGEgc3RvcCBpcyBpc3N1ZWQsIHdpZmkgaXMgYnJvdWdodCB1cCBvbmx5IGJ5IHN0YXJ0V2lmaQorICAgICAgICAgKiB1bmxlc3Mgd2lmaSBlbmFibGVkIHN0YXR1cyBpcyB0b2dnbGVkCisgICAgICAgICAqLworICAgICAgICBtV2lmaVN0YXRlTWFjaGluZS5zZXREcml2ZXJTdGFydChmYWxzZSk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBzZWUge0BsaW5rIGFuZHJvaWQubmV0LndpZmkuV2lmaU1hbmFnZXIjYWRkVG9CbGFja2xpc3R9CisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRUb0JsYWNrbGlzdChTdHJpbmcgYnNzaWQpIHsKKyAgICAgICAgZW5mb3JjZUNoYW5nZVBlcm1pc3Npb24oKTsKKworICAgICAgICBtV2lmaVN0YXRlTWFjaGluZS5hZGRUb0JsYWNrbGlzdChic3NpZCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogc2VlIHtAbGluayBhbmRyb2lkLm5ldC53aWZpLldpZmlNYW5hZ2VyI2NsZWFyQmxhY2tsaXN0fQorICAgICAqCisgICAgICovCisgICAgcHVibGljIHZvaWQgY2xlYXJCbGFja2xpc3QoKSB7CisgICAgICAgIGVuZm9yY2VDaGFuZ2VQZXJtaXNzaW9uKCk7CisKKyAgICAgICAgbVdpZmlTdGF0ZU1hY2hpbmUuY2xlYXJCbGFja2xpc3QoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBjb25uZWN0TmV0d29ya1dpdGhJZChpbnQgbmV0d29ya0lkKSB7CisgICAgICAgIGVuZm9yY2VDaGFuZ2VQZXJtaXNzaW9uKCk7CisgICAgICAgIG1XaWZpU3RhdGVNYWNoaW5lLmNvbm5lY3ROZXR3b3JrKG5ldHdvcmtJZCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgY29ubmVjdE5ldHdvcmtXaXRoQ29uZmlnKFdpZmlDb25maWd1cmF0aW9uIGNvbmZpZykgeworICAgICAgICBlbmZvcmNlQ2hhbmdlUGVybWlzc2lvbigpOworICAgICAgICBtV2lmaVN0YXRlTWFjaGluZS5jb25uZWN0TmV0d29yayhjb25maWcpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNhdmVOZXR3b3JrKFdpZmlDb25maWd1cmF0aW9uIGNvbmZpZykgeworICAgICAgICBlbmZvcmNlQ2hhbmdlUGVybWlzc2lvbigpOworICAgICAgICBtV2lmaVN0YXRlTWFjaGluZS5zYXZlTmV0d29yayhjb25maWcpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGZvcmdldE5ldHdvcmsoaW50IG5ldElkKSB7CisgICAgICAgIGVuZm9yY2VDaGFuZ2VQZXJtaXNzaW9uKCk7CisgICAgICAgIG1XaWZpU3RhdGVNYWNoaW5lLmZvcmdldE5ldHdvcmsobmV0SWQpOwogICAgIH0KIAogICAgIHByaXZhdGUgZmluYWwgQnJvYWRjYXN0UmVjZWl2ZXIgbVJlY2VpdmVyID0gbmV3IEJyb2FkY2FzdFJlY2VpdmVyKCkgewpAQCAtMTY2NCwxNyArODEyLDExIEBACiAgICAgICAgICAgICAgICAgbUFsYXJtTWFuYWdlci5jYW5jZWwobUlkbGVJbnRlbnQpOwogICAgICAgICAgICAgICAgIG1EZXZpY2VJZGxlID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgbVNjcmVlbk9mZiA9IGZhbHNlOwotICAgICAgICAgICAgICAgIG1XaWZpU3RhdGVUcmFja2VyLmVuYWJsZVJzc2lQb2xsaW5nKHRydWUpOwotICAgICAgICAgICAgICAgIC8qIERIQ1Agb3Igb3RoZXIgdGVtcG9yYXJ5IGZhaWx1cmVzIGluIHRoZSBwYXN0IGNhbiBwcmV2ZW50Ci0gICAgICAgICAgICAgICAgICogYSBkaXNhYmxlZCBuZXR3b3JrIGZyb20gYmVpbmcgY29ubmVjdGVkIHRvLCBlbmFibGUgb24gc2NyZWVuIG9uCi0gICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgaWYgKG1XaWZpU3RhdGVUcmFja2VyLmlzQW55TmV0d29ya0Rpc2FibGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgc2VuZEVuYWJsZU5ldHdvcmtzTWVzc2FnZSgpOwotICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBtV2lmaVN0YXRlTWFjaGluZS5lbmFibGVSc3NpUG9sbGluZyh0cnVlKTsKICAgICAgICAgICAgIH0gZWxzZSBpZiAoYWN0aW9uLmVxdWFscyhJbnRlbnQuQUNUSU9OX1NDUkVFTl9PRkYpKSB7CiAgICAgICAgICAgICAgICAgU2xvZy5kKFRBRywgIkFDVElPTl9TQ1JFRU5fT0ZGIik7CiAgICAgICAgICAgICAgICAgbVNjcmVlbk9mZiA9IHRydWU7Ci0gICAgICAgICAgICAgICAgbVdpZmlTdGF0ZVRyYWNrZXIuZW5hYmxlUnNzaVBvbGxpbmcoZmFsc2UpOworICAgICAgICAgICAgICAgIG1XaWZpU3RhdGVNYWNoaW5lLmVuYWJsZVJzc2lQb2xsaW5nKGZhbHNlKTsKICAgICAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICAgICAqIFNldCBhIHRpbWVyIHRvIHB1dCBXaS1GaSB0byBzbGVlcCwgYnV0IG9ubHkgaWYgdGhlIHNjcmVlbiBpcyBvZmYKICAgICAgICAgICAgICAgICAgKiBBTkQgdGhlICJzdGF5IG9uIHdoaWxlIHBsdWdnZWQgaW4iIHNldHRpbmcgZG9lc24ndCBtYXRjaCB0aGUKQEAgLTE2ODIsMTEgKzgyNCwxMSBAQAogICAgICAgICAgICAgICAgICAqIG9yIHBsdWdnZWQgaW4gdG8gQUMpLgogICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgIGlmICghc2hvdWxkV2lmaVN0YXlBd2FrZShzdGF5QXdha2VDb25kaXRpb25zLCBtUGx1Z2dlZFR5cGUpKSB7Ci0gICAgICAgICAgICAgICAgICAgIFdpZmlJbmZvIGluZm8gPSBtV2lmaVN0YXRlVHJhY2tlci5yZXF1ZXN0Q29ubmVjdGlvbkluZm8oKTsKKyAgICAgICAgICAgICAgICAgICAgV2lmaUluZm8gaW5mbyA9IG1XaWZpU3RhdGVNYWNoaW5lLnN5bmNSZXF1ZXN0Q29ubmVjdGlvbkluZm8oKTsKICAgICAgICAgICAgICAgICAgICAgaWYgKGluZm8uZ2V0U3VwcGxpY2FudFN0YXRlKCkgIT0gU3VwcGxpY2FudFN0YXRlLkNPTVBMRVRFRCkgewogICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2UgdXNlZCB0byBnbyB0byBzbGVlcCBpbW1lZGlhdGVseSwgYnV0IHRoaXMgY2F1c2VkIHNvbWUgcmFjZSBjb25kaXRpb25zCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyB3ZSBkb24ndCBoYXZlIHRpbWUgdG8gdHJhY2sgZG93biBmb3IgdGhpcyByZWxlYXNlLiAgRGVsYXkgaW5zdGVhZCwgYnV0IG5vdAotICAgICAgICAgICAgICAgICAgICAgICAgLy8gYXMgbG9uZyBhcyB3ZSB3b3VsZCBpZiBjb25uZWN0ZWQgKGJlbG93KQorICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2UgZG9uJ3QgaGF2ZSB0aW1lIHRvIHRyYWNrIGRvd24gZm9yIHRoaXMgcmVsZWFzZS4gIERlbGF5IGluc3RlYWQsCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBidXQgbm90IGFzIGxvbmcgYXMgd2Ugd291bGQgaWYgY29ubmVjdGVkIChiZWxvdykKICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPRE8gLSBmaXggdGhlIHJhY2UgY29uZGl0aW9ucyBhbmQgc3dpdGNoIGJhY2sgdG8gdGhlIGltbWVkaWF0ZSB0dXJuLW9mZgogICAgICAgICAgICAgICAgICAgICAgICAgbG9uZyB0cmlnZ2VyVGltZSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpICsgKDIqNjAqMTAwMCk7IC8vIDIgbWluCiAgICAgICAgICAgICAgICAgICAgICAgICBTbG9nLmQoVEFHLCAic2V0dGluZyBBQ1RJT05fREVWSUNFX0lETEUgdGltZXIgZm9yIDEyMCwwMDAgbXMiKTsKQEAgLTE3MzMsNyArODc1LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIGlzQmx1ZXRvb3RoUGxheWluZyA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbVdpZmlTdGF0ZVRyYWNrZXIuc2V0Qmx1ZXRvb3RoU2Nhbk1vZGUoaXNCbHVldG9vdGhQbGF5aW5nKTsKKyAgICAgICAgICAgICAgICBtV2lmaVN0YXRlTWFjaGluZS5zZXRCbHVldG9vdGhTY2FuTW9kZShpc0JsdWV0b290aFBsYXlpbmcpOwogCiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIHJldHVybjsKQEAgLTE3NzIsNyArOTE0LDcgQEAKICAgICAgICAgICogb2Yge0Bjb2RlIDB9IGlzbid0IHJlYWxseSBhIHBsdWdnZWQgdHlwZSwgYnV0IHJhdGhlciBhbiBpbmRpY2F0aW9uIHRoYXQgdGhlCiAgICAgICAgICAqIGRldmljZSBpc24ndCBwbHVnZ2VkIGluIGF0IGFsbCwgdGhlcmUgaXMgbm8gYml0IHZhbHVlIGNvcnJlc3BvbmRpbmcgdG8gYQogICAgICAgICAgKiB7QGNvZGUgcGx1Z2dlZFR5cGV9IHZhbHVlIG9mIHtAY29kZSAwfS4gVGhhdCBpcyB3aHkgd2Ugc2hpZnQgYnkKLSAgICAgICAgICoge0Bjb2RlIHBsdWdnZWRUeXBlJm5ic3A7JiM4MjEyOyZuYnNwOzF9IGluc3RlYWQgb2YgYnkge0Bjb2RlIHBsdWdnZWRUeXBlfS4KKyAgICAgICAgICoge0Bjb2RlIHBsdWdnZWRUeXBlIC0gMX0gaW5zdGVhZCBvZiBieSB7QGNvZGUgcGx1Z2dlZFR5cGV9LgogICAgICAgICAgKiBAcGFyYW0gc3RheUF3YWtlQ29uZGl0aW9ucyBhIGJpdCBzdHJpbmcgc3BlY2lmeWluZyB3aGljaCAicGx1Z2dlZCB0eXBlcyIgc2hvdWxkCiAgICAgICAgICAqIGtlZXAgdGhlIGRldmljZSAoYW5kIGhlbmNlIFdpLUZpKSBhd2FrZS4KICAgICAgICAgICogQHBhcmFtIHBsdWdnZWRUeXBlIHRoZSB0eXBlIG9mIHBsdWcgKFVTQiwgQUMsIG9yIG5vbmUpIGZvciB3aGljaCB0aGUgY2hlY2sgaXMKQEAgLTE3ODUsODUgKzkyNywzNiBAQAogICAgICAgICB9CiAgICAgfTsKIAotICAgIHByaXZhdGUgdm9pZCBzZW5kRW5hYmxlTWVzc2FnZShib29sZWFuIGVuYWJsZSwgYm9vbGVhbiBwZXJzaXN0LCBpbnQgdWlkKSB7Ci0gICAgICAgIE1lc3NhZ2UgbXNnID0gTWVzc2FnZS5vYnRhaW4obVdpZmlIYW5kbGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChlbmFibGUgPyBNRVNTQUdFX0VOQUJMRV9XSUZJIDogTUVTU0FHRV9ESVNBQkxFX1dJRkkpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwZXJzaXN0ID8gMSA6IDApLCB1aWQpOwotICAgICAgICBtc2cuc2VuZFRvVGFyZ2V0KCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHNlbmRTdGFydE1lc3NhZ2UoaW50IGxvY2tNb2RlKSB7Ci0gICAgICAgIE1lc3NhZ2Uub2J0YWluKG1XaWZpSGFuZGxlciwgTUVTU0FHRV9TVEFSVF9XSUZJLCBsb2NrTW9kZSwgMCkuc2VuZFRvVGFyZ2V0KCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHNlbmRBY2Nlc3NQb2ludE1lc3NhZ2UoYm9vbGVhbiBlbmFibGUsIFdpZmlDb25maWd1cmF0aW9uIHdpZmlDb25maWcsIGludCB1aWQpIHsKLSAgICAgICAgTWVzc2FnZS5vYnRhaW4obVdpZmlIYW5kbGVyLAotICAgICAgICAgICAgICAgIChlbmFibGUgPyBNRVNTQUdFX1NUQVJUX0FDQ0VTU19QT0lOVCA6IE1FU1NBR0VfU1RPUF9BQ0NFU1NfUE9JTlQpLAotICAgICAgICAgICAgICAgIHVpZCwgMCwgd2lmaUNvbmZpZykuc2VuZFRvVGFyZ2V0KCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHNlbmRFbmFibGVOZXR3b3Jrc01lc3NhZ2UoKSB7Ci0gICAgICAgIE1lc3NhZ2Uub2J0YWluKG1XaWZpSGFuZGxlciwgTUVTU0FHRV9FTkFCTEVfTkVUV09SS1MpLnNlbmRUb1RhcmdldCgpOwotICAgIH0KLQogICAgIHByaXZhdGUgdm9pZCB1cGRhdGVXaWZpU3RhdGUoKSB7Ci0gICAgICAgIC8vIHNlbmQgYSBtZXNzYWdlIHNvIGl0J3MgYWxsIHNlcmlhbGl6ZWQKLSAgICAgICAgTWVzc2FnZS5vYnRhaW4obVdpZmlIYW5kbGVyLCBNRVNTQUdFX1VQREFURV9TVEFURSwgMCwgMCkuc2VuZFRvVGFyZ2V0KCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGRvVXBkYXRlV2lmaVN0YXRlKCkgewogICAgICAgICBib29sZWFuIHdpZmlFbmFibGVkID0gZ2V0UGVyc2lzdGVkV2lmaUVuYWJsZWQoKTsKLSAgICAgICAgYm9vbGVhbiBhaXJwbGFuZU1vZGUgPSBpc0FpcnBsYW5lTW9kZU9uKCkgJiYgIW1BaXJwbGFuZU1vZGVPdmVyd3JpZGRlbjsKKyAgICAgICAgYm9vbGVhbiBhaXJwbGFuZU1vZGUgPSBpc0FpcnBsYW5lTW9kZU9uKCkgJiYgIW1BaXJwbGFuZU1vZGVPdmVyd3JpZGRlbi5nZXQoKTsKICAgICAgICAgYm9vbGVhbiBsb2NrSGVsZCA9IG1Mb2Nrcy5oYXNMb2NrcygpOwotICAgICAgICBpbnQgc3Ryb25nZXN0TG9ja01vZGUgPSBXaWZpTWFuYWdlci5XSUZJX01PREVfRlVMTDsKKyAgICAgICAgaW50IHN0cm9uZ2VzdExvY2tNb2RlOwogICAgICAgICBib29sZWFuIHdpZmlTaG91bGRCZUVuYWJsZWQgPSB3aWZpRW5hYmxlZCAmJiAhYWlycGxhbmVNb2RlOwogICAgICAgICBib29sZWFuIHdpZmlTaG91bGRCZVN0YXJ0ZWQgPSAhbURldmljZUlkbGUgfHwgbG9ja0hlbGQ7Ci0KLSAgICAgICAgaWYgKGxvY2tIZWxkKSB7CisgICAgICAgIGlmIChtRGV2aWNlSWRsZSAmJiBsb2NrSGVsZCkgewogICAgICAgICAgICAgc3Ryb25nZXN0TG9ja01vZGUgPSBtTG9ja3MuZ2V0U3Ryb25nZXN0TG9ja01vZGUoKTsKLSAgICAgICAgfQotICAgICAgICAvKiBJZiBkZXZpY2UgaXMgbm90IGlkbGUsIGxvY2ttb2RlIGNhbm5vdCBiZSBzY2FuIG9ubHkgKi8KLSAgICAgICAgaWYgKCFtRGV2aWNlSWRsZSAmJiBzdHJvbmdlc3RMb2NrTW9kZSA9PSBXaWZpTWFuYWdlci5XSUZJX01PREVfU0NBTl9PTkxZKSB7CisgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBzdHJvbmdlc3RMb2NrTW9kZSA9IFdpZmlNYW5hZ2VyLldJRklfTU9ERV9GVUxMOwogICAgICAgICB9CiAKLSAgICAgICAgc3luY2hyb25pemVkIChtV2lmaUhhbmRsZXIpIHsKLSAgICAgICAgICAgIGlmICgobVdpZmlTdGF0ZVRyYWNrZXIuZ2V0V2lmaVN0YXRlKCkgPT0gV0lGSV9TVEFURV9FTkFCTElORykgJiYgIWFpcnBsYW5lTW9kZSkgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KKyAgICAgICAgLyogRGlzYWJsZSB0ZXRoZXJpbmcgd2hlbiBhaXJwbGFuZSBtb2RlIGlzIGVuYWJsZWQgKi8KKyAgICAgICAgaWYgKGFpcnBsYW5lTW9kZSkgeworICAgICAgICAgICAgbVdpZmlTdGF0ZU1hY2hpbmUuc2V0V2lmaUFwRW5hYmxlZChudWxsLCBmYWxzZSk7CisgICAgICAgIH0KIAotICAgICAgICAgICAgLyogRGlzYWJsZSB0ZXRoZXJpbmcgd2hlbiBhaXJwbGFuZSBtb2RlIGlzIGVuYWJsZWQgKi8KLSAgICAgICAgICAgIGlmIChhaXJwbGFuZU1vZGUgJiYKLSAgICAgICAgICAgICAgICAobVdpZmlBcFN0YXRlID09IFdJRklfQVBfU1RBVEVfRU5BQkxJTkcgfHwgbVdpZmlBcFN0YXRlID09IFdJRklfQVBfU1RBVEVfRU5BQkxFRCkpIHsKLSAgICAgICAgICAgICAgICBzV2FrZUxvY2suYWNxdWlyZSgpOwotICAgICAgICAgICAgICAgIHNlbmRBY2Nlc3NQb2ludE1lc3NhZ2UoZmFsc2UsIG51bGwsIG1MYXN0QXBFbmFibGVVaWQpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAod2lmaVNob3VsZEJlRW5hYmxlZCkgewotICAgICAgICAgICAgICAgIGlmICh3aWZpU2hvdWxkQmVTdGFydGVkKSB7Ci0gICAgICAgICAgICAgICAgICAgIHNXYWtlTG9jay5hY3F1aXJlKCk7Ci0gICAgICAgICAgICAgICAgICAgIHNlbmRFbmFibGVNZXNzYWdlKHRydWUsIGZhbHNlLCBtTGFzdEVuYWJsZVVpZCk7Ci0gICAgICAgICAgICAgICAgICAgIHNXYWtlTG9jay5hY3F1aXJlKCk7Ci0gICAgICAgICAgICAgICAgICAgIHNlbmRTdGFydE1lc3NhZ2Uoc3Ryb25nZXN0TG9ja01vZGUpOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIW1XaWZpU3RhdGVUcmFja2VyLmlzRHJpdmVyU3RvcHBlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGludCB3YWtlTG9ja1RpbWVvdXQgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNldHRpbmdzLlNlY3VyZS5nZXRJbnQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ29udGV4dC5nZXRDb250ZW50UmVzb2x2ZXIoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNldHRpbmdzLlNlY3VyZS5XSUZJX01PQklMRV9EQVRBX1RSQU5TSVRJT05fV0FLRUxPQ0tfVElNRU9VVF9NUywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFRkFVTFRfV0FLRUxPQ0tfVElNRU9VVCk7Ci0gICAgICAgICAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgICAgICAgICAqIFdlIGFyZSBhc3N1bWluZyB0aGF0IENvbm5lY3Rpdml0eVNlcnZpY2UgY2FuIG1ha2UKLSAgICAgICAgICAgICAgICAgICAgICogYSB0cmFuc2l0aW9uIHRvIGNlbGx1bGFyIGRhdGEgd2l0aGluIHdha2VMb2NrVGltZW91dCB0aW1lLgotICAgICAgICAgICAgICAgICAgICAgKiBUaGUgd2FrZWxvY2sgaXMgcmVsZWFzZWQgYnkgdGhlIGRlbGF5ZWQgbWVzc2FnZS4KLSAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgICAgIHNEcml2ZXJTdG9wV2FrZUxvY2suYWNxdWlyZSgpOwotICAgICAgICAgICAgICAgICAgICBtV2lmaUhhbmRsZXIuc2VuZEVtcHR5TWVzc2FnZShNRVNTQUdFX1NUT1BfV0lGSSk7Ci0gICAgICAgICAgICAgICAgICAgIG1XaWZpSGFuZGxlci5zZW5kRW1wdHlNZXNzYWdlRGVsYXllZChNRVNTQUdFX1JFTEVBU0VfV0FLRUxPQ0ssIHdha2VMb2NrVGltZW91dCk7Ci0gICAgICAgICAgICAgICAgfQorICAgICAgICBpZiAod2lmaVNob3VsZEJlRW5hYmxlZCkgeworICAgICAgICAgICAgaWYgKHdpZmlTaG91bGRCZVN0YXJ0ZWQpIHsKKyAgICAgICAgICAgICAgICBtV2lmaVN0YXRlTWFjaGluZS5zZXRXaWZpRW5hYmxlZCh0cnVlKTsKKyAgICAgICAgICAgICAgICBtV2lmaVN0YXRlTWFjaGluZS5zZXRTY2FuT25seU1vZGUoCisgICAgICAgICAgICAgICAgICAgICAgICBzdHJvbmdlc3RMb2NrTW9kZSA9PSBXaWZpTWFuYWdlci5XSUZJX01PREVfU0NBTl9PTkxZKTsKKyAgICAgICAgICAgICAgICBtV2lmaVN0YXRlTWFjaGluZS5zZXREcml2ZXJTdGFydCh0cnVlKTsKICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgc1dha2VMb2NrLmFjcXVpcmUoKTsKLSAgICAgICAgICAgICAgICBzZW5kRW5hYmxlTWVzc2FnZShmYWxzZSwgZmFsc2UsIG1MYXN0RW5hYmxlVWlkKTsKKyAgICAgICAgICAgICAgICBtV2lmaVN0YXRlTWFjaGluZS5yZXF1ZXN0Q21XYWtlTG9jaygpOworICAgICAgICAgICAgICAgIG1XaWZpU3RhdGVNYWNoaW5lLnNldERyaXZlclN0YXJ0KGZhbHNlKTsKICAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1XaWZpU3RhdGVNYWNoaW5lLnNldFdpZmlFbmFibGVkKGZhbHNlKTsKICAgICAgICAgfQogICAgIH0KIApAQCAtMTkwMSw4MSArOTk0LDYgQEAKICAgICAgICAgICAgICAgICBTZXR0aW5ncy5TeXN0ZW0uQUlSUExBTkVfTU9ERV9PTiwgMCkgPT0gMTsKICAgICB9CiAKLSAgICAvKioKLSAgICAgKiBIYW5kbGVyIHRoYXQgYWxsb3dzIHBvc3RpbmcgdG8gdGhlIFdpZmlUaHJlYWQuCi0gICAgICovCi0gICAgcHJpdmF0ZSBjbGFzcyBXaWZpSGFuZGxlciBleHRlbmRzIEhhbmRsZXIgewotICAgICAgICBwdWJsaWMgV2lmaUhhbmRsZXIoTG9vcGVyIGxvb3BlcikgewotICAgICAgICAgICAgc3VwZXIobG9vcGVyKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBoYW5kbGVNZXNzYWdlKE1lc3NhZ2UgbXNnKSB7Ci0gICAgICAgICAgICBzd2l0Y2ggKG1zZy53aGF0KSB7Ci0KLSAgICAgICAgICAgICAgICBjYXNlIE1FU1NBR0VfRU5BQkxFX1dJRkk6Ci0gICAgICAgICAgICAgICAgICAgIHNldFdpZmlFbmFibGVkQmxvY2tpbmcodHJ1ZSwgbXNnLmFyZzEgPT0gMSwgbXNnLmFyZzIpOwotICAgICAgICAgICAgICAgICAgICBpZiAobVdpZmlXYXRjaGRvZ1NlcnZpY2UgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgbVdpZmlXYXRjaGRvZ1NlcnZpY2UgPSBuZXcgV2lmaVdhdGNoZG9nU2VydmljZShtQ29udGV4dCwgbVdpZmlTdGF0ZVRyYWNrZXIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHNXYWtlTG9jay5yZWxlYXNlKCk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgY2FzZSBNRVNTQUdFX1NUQVJUX1dJRkk6Ci0gICAgICAgICAgICAgICAgICAgIG1XaWZpU3RhdGVUcmFja2VyLnNldFNjYW5Pbmx5TW9kZShtc2cuYXJnMSA9PSBXaWZpTWFuYWdlci5XSUZJX01PREVfU0NBTl9PTkxZKTsKLSAgICAgICAgICAgICAgICAgICAgbVdpZmlTdGF0ZVRyYWNrZXIucmVzdGFydCgpOwotICAgICAgICAgICAgICAgICAgICBtV2lmaVN0YXRlVHJhY2tlci5zZXRIaWdoUGVyZk1vZGUobXNnLmFyZzEgPT0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBXaWZpTWFuYWdlci5XSUZJX01PREVfRlVMTF9ISUdIX1BFUkYpOwotICAgICAgICAgICAgICAgICAgICBzV2FrZUxvY2sucmVsZWFzZSgpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGNhc2UgTUVTU0FHRV9VUERBVEVfU1RBVEU6Ci0gICAgICAgICAgICAgICAgICAgIGRvVXBkYXRlV2lmaVN0YXRlKCk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgY2FzZSBNRVNTQUdFX0RJU0FCTEVfV0lGSToKLSAgICAgICAgICAgICAgICAgICAgLy8gYSBub24temVybyBtc2cuYXJnMSB2YWx1ZSBtZWFucyB0aGUgImVuYWJsZWQiIHNldHRpbmcKLSAgICAgICAgICAgICAgICAgICAgLy8gc2hvdWxkIGJlIHBlcnNpc3RlZAotICAgICAgICAgICAgICAgICAgICBzZXRXaWZpRW5hYmxlZEJsb2NraW5nKGZhbHNlLCBtc2cuYXJnMSA9PSAxLCBtc2cuYXJnMik7Ci0gICAgICAgICAgICAgICAgICAgIG1XaWZpV2F0Y2hkb2dTZXJ2aWNlID0gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgc1dha2VMb2NrLnJlbGVhc2UoKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBjYXNlIE1FU1NBR0VfU1RPUF9XSUZJOgotICAgICAgICAgICAgICAgICAgICBtV2lmaVN0YXRlVHJhY2tlci5kaXNjb25uZWN0QW5kU3RvcCgpOwotICAgICAgICAgICAgICAgICAgICAvLyBkb24ndCByZWxlYXNlIHdha2Vsb2NrCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgY2FzZSBNRVNTQUdFX1JFTEVBU0VfV0FLRUxPQ0s6Ci0gICAgICAgICAgICAgICAgICAgIHNEcml2ZXJTdG9wV2FrZUxvY2sucmVsZWFzZSgpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGNhc2UgTUVTU0FHRV9TVEFSVF9BQ0NFU1NfUE9JTlQ6Ci0gICAgICAgICAgICAgICAgICAgIHNldFdpZmlBcEVuYWJsZWRCbG9ja2luZyh0cnVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXNnLmFyZzEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoV2lmaUNvbmZpZ3VyYXRpb24pIG1zZy5vYmopOwotICAgICAgICAgICAgICAgICAgICBzV2FrZUxvY2sucmVsZWFzZSgpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGNhc2UgTUVTU0FHRV9TVE9QX0FDQ0VTU19QT0lOVDoKLSAgICAgICAgICAgICAgICAgICAgc2V0V2lmaUFwRW5hYmxlZEJsb2NraW5nKGZhbHNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXNnLmFyZzEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoV2lmaUNvbmZpZ3VyYXRpb24pIG1zZy5vYmopOwotICAgICAgICAgICAgICAgICAgICBzV2FrZUxvY2sucmVsZWFzZSgpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGNhc2UgTUVTU0FHRV9TRVRfQ0hBTk5FTFM6Ci0gICAgICAgICAgICAgICAgICAgIHNldE51bUFsbG93ZWRDaGFubmVsc0Jsb2NraW5nKG1zZy5hcmcxLCBtc2cuYXJnMiA9PSAxKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBjYXNlIE1FU1NBR0VfRU5BQkxFX05FVFdPUktTOgotICAgICAgICAgICAgICAgICAgICBtV2lmaVN0YXRlVHJhY2tlci5lbmFibGVBbGxOZXR3b3JrcyhnZXRDb25maWd1cmVkTmV0d29ya3MoKSk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KICAgICBAT3ZlcnJpZGUKICAgICBwcm90ZWN0ZWQgdm9pZCBkdW1wKEZpbGVEZXNjcmlwdG9yIGZkLCBQcmludFdyaXRlciBwdywgU3RyaW5nW10gYXJncykgewogICAgICAgICBpZiAobUNvbnRleHQuY2hlY2tDYWxsaW5nT3JTZWxmUGVybWlzc2lvbihhbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24uRFVNUCkKQEAgLTE5ODUsMTcgKzEwMDMsMTcgQEAKICAgICAgICAgICAgICAgICAgICAgKyAiLCB1aWQ9IiArIEJpbmRlci5nZXRDYWxsaW5nVWlkKCkpOwogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9Ci0gICAgICAgIHB3LnByaW50bG4oIldpLUZpIGlzICIgKyBzdGF0ZU5hbWUobVdpZmlTdGF0ZVRyYWNrZXIuZ2V0V2lmaVN0YXRlKCkpKTsKKyAgICAgICAgcHcucHJpbnRsbigiV2ktRmkgaXMgIiArIG1XaWZpU3RhdGVNYWNoaW5lLnN5bmNHZXRXaWZpU3RhdGVCeU5hbWUoKSk7CiAgICAgICAgIHB3LnByaW50bG4oIlN0YXktYXdha2UgY29uZGl0aW9uczogIiArCiAgICAgICAgICAgICAgICAgU2V0dGluZ3MuU3lzdGVtLmdldEludChtQ29udGV4dC5nZXRDb250ZW50UmVzb2x2ZXIoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNldHRpbmdzLlN5c3RlbS5TVEFZX09OX1dISUxFX1BMVUdHRURfSU4sIDApKTsKICAgICAgICAgcHcucHJpbnRsbigpOwogCiAgICAgICAgIHB3LnByaW50bG4oIkludGVybmFsIHN0YXRlOiIpOwotICAgICAgICBwdy5wcmludGxuKG1XaWZpU3RhdGVUcmFja2VyKTsKKyAgICAgICAgcHcucHJpbnRsbihtV2lmaVN0YXRlTWFjaGluZSk7CiAgICAgICAgIHB3LnByaW50bG4oKTsKICAgICAgICAgcHcucHJpbnRsbigiTGF0ZXN0IHNjYW4gcmVzdWx0czoiKTsKLSAgICAgICAgTGlzdDxTY2FuUmVzdWx0PiBzY2FuUmVzdWx0cyA9IG1XaWZpU3RhdGVUcmFja2VyLmdldFNjYW5SZXN1bHRzTGlzdCgpOworICAgICAgICBMaXN0PFNjYW5SZXN1bHQ+IHNjYW5SZXN1bHRzID0gbVdpZmlTdGF0ZU1hY2hpbmUuc3luY0dldFNjYW5SZXN1bHRzTGlzdCgpOwogICAgICAgICBpZiAoc2NhblJlc3VsdHMgIT0gbnVsbCAmJiBzY2FuUmVzdWx0cy5zaXplKCkgIT0gMCkgewogICAgICAgICAgICAgcHcucHJpbnRsbigiICBCU1NJRCAgICAgICAgICAgICAgRnJlcXVlbmN5ICAgUlNTSSAgRmxhZ3MgICAgICAgICAgICAgU1NJRCIpOwogICAgICAgICAgICAgZm9yIChTY2FuUmVzdWx0IHIgOiBzY2FuUmVzdWx0cykgewpAQCAtMjAwOSwzMyArMTAyNywxNCBAQAogICAgICAgICB9CiAgICAgICAgIHB3LnByaW50bG4oKTsKICAgICAgICAgcHcucHJpbnRsbigiTG9ja3MgYWNxdWlyZWQ6ICIgKyBtRnVsbExvY2tzQWNxdWlyZWQgKyAiIGZ1bGwsICIgKwotICAgICAgICAgICAgICAgIG1GdWxsSGlnaFBlcmZMb2Nrc0FjcXVpcmVkICsgIiBmdWxsIGhpZ2ggcGVyZiwgIiArCiAgICAgICAgICAgICAgICAgbVNjYW5Mb2Nrc0FjcXVpcmVkICsgIiBzY2FuIik7CiAgICAgICAgIHB3LnByaW50bG4oIkxvY2tzIHJlbGVhc2VkOiAiICsgbUZ1bGxMb2Nrc1JlbGVhc2VkICsgIiBmdWxsLCAiICsKLSAgICAgICAgICAgICAgICBtRnVsbEhpZ2hQZXJmTG9ja3NSZWxlYXNlZCArICIgZnVsbCBoaWdoIHBlcmYsICIgKwogICAgICAgICAgICAgICAgIG1TY2FuTG9ja3NSZWxlYXNlZCArICIgc2NhbiIpOwogICAgICAgICBwdy5wcmludGxuKCk7CiAgICAgICAgIHB3LnByaW50bG4oIkxvY2tzIGhlbGQ6Iik7CiAgICAgICAgIG1Mb2Nrcy5kdW1wKHB3KTsKICAgICB9CiAKLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgc3RhdGVOYW1lKGludCB3aWZpU3RhdGUpIHsKLSAgICAgICAgc3dpdGNoICh3aWZpU3RhdGUpIHsKLSAgICAgICAgICAgIGNhc2UgV0lGSV9TVEFURV9ESVNBQkxJTkc6Ci0gICAgICAgICAgICAgICAgcmV0dXJuICJkaXNhYmxpbmciOwotICAgICAgICAgICAgY2FzZSBXSUZJX1NUQVRFX0RJU0FCTEVEOgotICAgICAgICAgICAgICAgIHJldHVybiAiZGlzYWJsZWQiOwotICAgICAgICAgICAgY2FzZSBXSUZJX1NUQVRFX0VOQUJMSU5HOgotICAgICAgICAgICAgICAgIHJldHVybiAiZW5hYmxpbmciOwotICAgICAgICAgICAgY2FzZSBXSUZJX1NUQVRFX0VOQUJMRUQ6Ci0gICAgICAgICAgICAgICAgcmV0dXJuICJlbmFibGVkIjsKLSAgICAgICAgICAgIGNhc2UgV0lGSV9TVEFURV9VTktOT1dOOgotICAgICAgICAgICAgICAgIHJldHVybiAidW5rbm93biBzdGF0ZSI7Ci0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIHJldHVybiAiW2ludmFsaWQgc3RhdGVdIjsKLSAgICAgICAgfQotICAgIH0KLQogICAgIHByaXZhdGUgY2xhc3MgV2lmaUxvY2sgZXh0ZW5kcyBEZWF0aFJlY2lwaWVudCB7CiAgICAgICAgIFdpZmlMb2NrKGludCBsb2NrTW9kZSwgU3RyaW5nIHRhZywgSUJpbmRlciBiaW5kZXIsIFdvcmtTb3VyY2Ugd3MpIHsKICAgICAgICAgICAgIHN1cGVyKGxvY2tNb2RlLCB0YWcsIGJpbmRlciwgd3MpOwpAQCAtMjA2NywxNSArMTA2NiwxMSBAQAogICAgICAgICAgICAgaWYgKG1MaXN0LmlzRW1wdHkoKSkgewogICAgICAgICAgICAgICAgIHJldHVybiBXaWZpTWFuYWdlci5XSUZJX01PREVfRlVMTDsKICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKG1GdWxsSGlnaFBlcmZMb2Nrc0FjcXVpcmVkID4gbUZ1bGxIaWdoUGVyZkxvY2tzUmVsZWFzZWQpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gV2lmaU1hbmFnZXIuV0lGSV9NT0RFX0ZVTExfSElHSF9QRVJGOworICAgICAgICAgICAgZm9yIChXaWZpTG9jayBsIDogbUxpc3QpIHsKKyAgICAgICAgICAgICAgICBpZiAobC5tTW9kZSA9PSBXaWZpTWFuYWdlci5XSUZJX01PREVfRlVMTCkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gV2lmaU1hbmFnZXIuV0lGSV9NT0RFX0ZVTEw7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAobUZ1bGxMb2Nrc0FjcXVpcmVkID4gbUZ1bGxMb2Nrc1JlbGVhc2VkKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFdpZmlNYW5hZ2VyLldJRklfTU9ERV9GVUxMOwotICAgICAgICAgICAgfQotCiAgICAgICAgICAgICByZXR1cm4gV2lmaU1hbmFnZXIuV0lGSV9NT0RFX1NDQU5fT05MWTsKICAgICAgICAgfQogCkBAIC0yMTEzLDcgKzExMDgsNyBAQAogICAgIH0KIAogICAgIHZvaWQgZW5mb3JjZVdha2VTb3VyY2VQZXJtaXNzaW9uKGludCB1aWQsIGludCBwaWQpIHsKLSAgICAgICAgaWYgKHVpZCA9PSBQcm9jZXNzLm15VWlkKCkpIHsKKyAgICAgICAgaWYgKHVpZCA9PSBhbmRyb2lkLm9zLlByb2Nlc3MubXlVaWQoKSkgewogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CiAgICAgICAgIG1Db250ZXh0LmVuZm9yY2VQZXJtaXNzaW9uKGFuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbi5VUERBVEVfREVWSUNFX1NUQVRTLApAQCAtMjEyMiwxMSArMTExNyw3IEBACiAKICAgICBwdWJsaWMgYm9vbGVhbiBhY3F1aXJlV2lmaUxvY2soSUJpbmRlciBiaW5kZXIsIGludCBsb2NrTW9kZSwgU3RyaW5nIHRhZywgV29ya1NvdXJjZSB3cykgewogICAgICAgICBtQ29udGV4dC5lbmZvcmNlQ2FsbGluZ09yU2VsZlBlcm1pc3Npb24oYW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uLldBS0VfTE9DSywgbnVsbCk7Ci0gICAgICAgIGlmIChsb2NrTW9kZSAhPSBXaWZpTWFuYWdlci5XSUZJX01PREVfRlVMTCAmJgotICAgICAgICAgICAgICAgIGxvY2tNb2RlICE9IFdpZmlNYW5hZ2VyLldJRklfTU9ERV9TQ0FOX09OTFkgJiYKLSAgICAgICAgICAgICAgICBsb2NrTW9kZSAhPSBXaWZpTWFuYWdlci5XSUZJX01PREVfRlVMTF9ISUdIX1BFUkYpIHsKLSAgICAgICAgICAgIFNsb2cuZShUQUcsICJJbGxlZ2FsIGFyZ3VtZW50LCBsb2NrTW9kZT0gIiArIGxvY2tNb2RlKTsKLSAgICAgICAgICAgIGlmIChEQkcpIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImxvY2tNb2RlPSIgKyBsb2NrTW9kZSk7CisgICAgICAgIGlmIChsb2NrTW9kZSAhPSBXaWZpTWFuYWdlci5XSUZJX01PREVfRlVMTCAmJiBsb2NrTW9kZSAhPSBXaWZpTWFuYWdlci5XSUZJX01PREVfU0NBTl9PTkxZKSB7CiAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KICAgICAgICAgaWYgKHdzICE9IG51bGwpIHsKQEAgLTIxNDksMTAgKzExNDAsNiBAQAogICAgICAgICAgICAgY2FzZSBXaWZpTWFuYWdlci5XSUZJX01PREVfRlVMTDoKICAgICAgICAgICAgICAgICBtQmF0dGVyeVN0YXRzLm5vdGVGdWxsV2lmaUxvY2tBY3F1aXJlZEZyb21Tb3VyY2Uod2lmaUxvY2subVdvcmtTb3VyY2UpOwogICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBXaWZpTWFuYWdlci5XSUZJX01PREVfRlVMTF9ISUdIX1BFUkY6Ci0gICAgICAgICAgICAgICAgLyogVHJlYXQgaGlnaCBwb3dlciBhcyBhIGZ1bGwgbG9jayBmb3IgYmF0dGVyeSBzdGF0cyAqLwotICAgICAgICAgICAgICAgIG1CYXR0ZXJ5U3RhdHMubm90ZUZ1bGxXaWZpTG9ja0FjcXVpcmVkRnJvbVNvdXJjZSh3aWZpTG9jay5tV29ya1NvdXJjZSk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICBjYXNlIFdpZmlNYW5hZ2VyLldJRklfTU9ERV9TQ0FOX09OTFk6CiAgICAgICAgICAgICAgICAgbUJhdHRlcnlTdGF0cy5ub3RlU2NhbldpZmlMb2NrQWNxdWlyZWRGcm9tU291cmNlKHdpZmlMb2NrLm1Xb3JrU291cmNlKTsKICAgICAgICAgICAgICAgICBicmVhazsKQEAgLTIxNjQsMTAgKzExNTEsNiBAQAogICAgICAgICAgICAgY2FzZSBXaWZpTWFuYWdlci5XSUZJX01PREVfRlVMTDoKICAgICAgICAgICAgICAgICBtQmF0dGVyeVN0YXRzLm5vdGVGdWxsV2lmaUxvY2tSZWxlYXNlZEZyb21Tb3VyY2Uod2lmaUxvY2subVdvcmtTb3VyY2UpOwogICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBXaWZpTWFuYWdlci5XSUZJX01PREVfRlVMTF9ISUdIX1BFUkY6Ci0gICAgICAgICAgICAgICAgLyogVHJlYXQgaGlnaCBwb3dlciBhcyBhIGZ1bGwgbG9jayBmb3IgYmF0dGVyeSBzdGF0cyAqLwotICAgICAgICAgICAgICAgIG1CYXR0ZXJ5U3RhdHMubm90ZUZ1bGxXaWZpTG9ja1JlbGVhc2VkRnJvbVNvdXJjZSh3aWZpTG9jay5tV29ya1NvdXJjZSk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICBjYXNlIFdpZmlNYW5hZ2VyLldJRklfTU9ERV9TQ0FOX09OTFk6CiAgICAgICAgICAgICAgICAgbUJhdHRlcnlTdGF0cy5ub3RlU2NhbldpZmlMb2NrUmVsZWFzZWRGcm9tU291cmNlKHdpZmlMb2NrLm1Xb3JrU291cmNlKTsKICAgICAgICAgICAgICAgICBicmVhazsKQEAgLTIxODYsOSArMTE2OSw2IEBACiAgICAgICAgICAgICBjYXNlIFdpZmlNYW5hZ2VyLldJRklfTU9ERV9GVUxMOgogICAgICAgICAgICAgICAgICsrbUZ1bGxMb2Nrc0FjcXVpcmVkOwogICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBXaWZpTWFuYWdlci5XSUZJX01PREVfRlVMTF9ISUdIX1BFUkY6Ci0gICAgICAgICAgICAgICAgKyttRnVsbEhpZ2hQZXJmTG9ja3NBY3F1aXJlZDsKLSAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIGNhc2UgV2lmaU1hbmFnZXIuV0lGSV9NT0RFX1NDQU5fT05MWToKICAgICAgICAgICAgICAgICArK21TY2FuTG9ja3NBY3F1aXJlZDsKICAgICAgICAgICAgICAgICBicmVhazsKQEAgLTIyNTMsOSArMTIzMyw2IEBACiAgICAgICAgICAgICAgICAgICAgIGNhc2UgV2lmaU1hbmFnZXIuV0lGSV9NT0RFX0ZVTEw6CiAgICAgICAgICAgICAgICAgICAgICAgICArK21GdWxsTG9ja3NSZWxlYXNlZDsKICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBjYXNlIFdpZmlNYW5hZ2VyLldJRklfTU9ERV9GVUxMX0hJR0hfUEVSRjoKLSAgICAgICAgICAgICAgICAgICAgICAgICsrbUZ1bGxIaWdoUGVyZkxvY2tzUmVsZWFzZWQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgY2FzZSBXaWZpTWFuYWdlci5XSUZJX01PREVfU0NBTl9PTkxZOgogICAgICAgICAgICAgICAgICAgICAgICAgKyttU2NhbkxvY2tzUmVsZWFzZWQ7CiAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKQEAgLTIzMjcsNyArMTMwNCw3IEBACiAgICAgICAgICAgICBpZiAobU11bHRpY2FzdGVycy5zaXplKCkgIT0gMCkgewogICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgbVdpZmlTdGF0ZVRyYWNrZXIuc3RhcnRQYWNrZXRGaWx0ZXJpbmcoKTsKKyAgICAgICAgICAgICAgICBtV2lmaVN0YXRlTWFjaGluZS5zdGFydFBhY2tldEZpbHRlcmluZygpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQpAQCAtMjM0Miw3ICsxMzE5LDcgQEAKICAgICAgICAgICAgIC8vIG91ciBuZXcgc2l6ZSA9PSAxIChmaXJzdCBjYWxsKSwgYnV0IHRoaXMgZnVuY3Rpb24gd29uJ3QKICAgICAgICAgICAgIC8vIGJlIGNhbGxlZCBvZnRlbiBhbmQgYnkgbWFraW5nIHRoZSBzdG9wUGFja2V0IGNhbGwgZWFjaAogICAgICAgICAgICAgLy8gdGltZSB3ZSdyZSBsZXNzIGZyYWdpbGUgYW5kIHNlbGYtaGVhbGluZy4KLSAgICAgICAgICAgIG1XaWZpU3RhdGVUcmFja2VyLnN0b3BQYWNrZXRGaWx0ZXJpbmcoKTsKKyAgICAgICAgICAgIG1XaWZpU3RhdGVNYWNoaW5lLnN0b3BQYWNrZXRGaWx0ZXJpbmcoKTsKICAgICAgICAgfQogCiAgICAgICAgIGludCB1aWQgPSBCaW5kZXIuZ2V0Q2FsbGluZ1VpZCgpOwpAQCAtMjM3OSw3ICsxMzU2LDcgQEAKICAgICAgICAgICAgIHJlbW92ZWQudW5saW5rRGVhdGhSZWNpcGllbnQoKTsKICAgICAgICAgfQogICAgICAgICBpZiAobU11bHRpY2FzdGVycy5zaXplKCkgPT0gMCkgewotICAgICAgICAgICAgbVdpZmlTdGF0ZVRyYWNrZXIuc3RhcnRQYWNrZXRGaWx0ZXJpbmcoKTsKKyAgICAgICAgICAgIG1XaWZpU3RhdGVNYWNoaW5lLnN0YXJ0UGFja2V0RmlsdGVyaW5nKCk7CiAgICAgICAgIH0KIAogICAgICAgICBMb25nIGlkZW50ID0gQmluZGVyLmNsZWFyQ2FsbGluZ0lkZW50aXR5KCk7CkBAIC0yMzk4LDQgKzEzNzUsMTQ0IEBACiAgICAgICAgICAgICByZXR1cm4gKG1NdWx0aWNhc3RlcnMuc2l6ZSgpID4gMCk7CiAgICAgICAgIH0KICAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgY2hlY2tBbmRTZXROb3RpZmljYXRpb24oKSB7CisgICAgICAgIC8vIElmIHdlIHNob3VsZG4ndCBwbGFjZSBhIG5vdGlmaWNhdGlvbiBvbiBhdmFpbGFibGUgbmV0d29ya3MsIHRoZW4KKyAgICAgICAgLy8gZG9uJ3QgYm90aGVyIGRvaW5nIGFueSBvZiB0aGUgZm9sbG93aW5nCisgICAgICAgIGlmICghbU5vdGlmaWNhdGlvbkVuYWJsZWQpIHJldHVybjsKKworICAgICAgICBTdGF0ZSBzdGF0ZSA9IG1OZXR3b3JrSW5mby5nZXRTdGF0ZSgpOworICAgICAgICBpZiAoKHN0YXRlID09IE5ldHdvcmtJbmZvLlN0YXRlLkRJU0NPTk5FQ1RFRCkKKyAgICAgICAgICAgICAgICB8fCAoc3RhdGUgPT0gTmV0d29ya0luZm8uU3RhdGUuVU5LTk9XTikpIHsKKyAgICAgICAgICAgIC8vIExvb2sgZm9yIGFuIG9wZW4gbmV0d29yaworICAgICAgICAgICAgTGlzdDxTY2FuUmVzdWx0PiBzY2FuUmVzdWx0cyA9IG1XaWZpU3RhdGVNYWNoaW5lLnN5bmNHZXRTY2FuUmVzdWx0c0xpc3QoKTsKKyAgICAgICAgICAgIGlmIChzY2FuUmVzdWx0cyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgaW50IG51bU9wZW5OZXR3b3JrcyA9IDA7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IHNjYW5SZXN1bHRzLnNpemUoKSAtIDE7IGkgPj0gMDsgaS0tKSB7CisgICAgICAgICAgICAgICAgICAgIFNjYW5SZXN1bHQgc2NhblJlc3VsdCA9IHNjYW5SZXN1bHRzLmdldChpKTsKKworICAgICAgICAgICAgICAgICAgICBpZiAoVGV4dFV0aWxzLmlzRW1wdHkoc2NhblJlc3VsdC5jYXBhYmlsaXRpZXMpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBudW1PcGVuTmV0d29ya3MrKzsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChudW1PcGVuTmV0d29ya3MgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICgrK21OdW1TY2Fuc1NpbmNlTmV0d29ya1N0YXRlQ2hhbmdlID49IE5VTV9TQ0FOU19CRUZPUkVfQUNUVUFMTFlfU0NBTk5JTkcpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgICAgICAgICAgICAgKiBXZSd2ZSBzY2FubmVkIGNvbnRpbnVvdXNseSBhdCBsZWFzdAorICAgICAgICAgICAgICAgICAgICAgICAgICogTlVNX1NDQU5TX0JFRk9SRV9OT1RJRklDQVRJT04gdGltZXMuIFRoZSB1c2VyCisgICAgICAgICAgICAgICAgICAgICAgICAgKiBwcm9iYWJseSBkb2VzIG5vdCBoYXZlIGEgcmVtZW1iZXJlZCBuZXR3b3JrIGluIHJhbmdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICogc2luY2Ugb3RoZXJ3aXNlIHN1cHBsaWNhbnQgd291bGQgaGF2ZSB0cmllZCB0bworICAgICAgICAgICAgICAgICAgICAgICAgICogYXNzb2NpYXRlIGFuZCB0aHVzIHJlc2V0dGluZyB0aGlzIGNvdW50ZXIuCisgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIHNldE5vdGlmaWNhdGlvblZpc2libGUodHJ1ZSwgbnVtT3Blbk5ldHdvcmtzLCBmYWxzZSwgMCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIE5vIG9wZW4gbmV0d29ya3MgaW4gcmFuZ2UsIHJlbW92ZSB0aGUgbm90aWZpY2F0aW9uCisgICAgICAgIHNldE5vdGlmaWNhdGlvblZpc2libGUoZmFsc2UsIDAsIGZhbHNlLCAwKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDbGVhcnMgdmFyaWFibGVzIHJlbGF0ZWQgdG8gdHJhY2tpbmcgd2hldGhlciBhIG5vdGlmaWNhdGlvbiBoYXMgYmVlbgorICAgICAqIHNob3duIHJlY2VudGx5IGFuZCBjbGVhcnMgdGhlIGN1cnJlbnQgbm90aWZpY2F0aW9uLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCByZXNldE5vdGlmaWNhdGlvbigpIHsKKyAgICAgICAgbU5vdGlmaWNhdGlvblJlcGVhdFRpbWUgPSAwOworICAgICAgICBtTnVtU2NhbnNTaW5jZU5ldHdvcmtTdGF0ZUNoYW5nZSA9IDA7CisgICAgICAgIHNldE5vdGlmaWNhdGlvblZpc2libGUoZmFsc2UsIDAsIGZhbHNlLCAwKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBEaXNwbGF5IG9yIGRvbid0IGRpc3BsYXkgYSBub3RpZmljYXRpb24gdGhhdCB0aGVyZSBhcmUgb3BlbiBXaS1GaSBuZXR3b3Jrcy4KKyAgICAgKiBAcGFyYW0gdmlzaWJsZSB7QGNvZGUgdHJ1ZX0gaWYgbm90aWZpY2F0aW9uIHNob3VsZCBiZSB2aXNpYmxlLCB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZQorICAgICAqIEBwYXJhbSBudW1OZXR3b3JrcyB0aGUgbnVtYmVyIG5ldHdvcmtzIHNlZW4KKyAgICAgKiBAcGFyYW0gZm9yY2Uge0Bjb2RlIHRydWV9IHRvIGZvcmNlIG5vdGlmaWNhdGlvbiB0byBiZSBzaG93bi9ub3Qtc2hvd24sCisgICAgICogZXZlbiBpZiBpdCBpcyBhbHJlYWR5IHNob3duL25vdC1zaG93bi4KKyAgICAgKiBAcGFyYW0gZGVsYXkgdGltZSBpbiBtaWxsaXNlY29uZHMgYWZ0ZXIgd2hpY2ggdGhlIG5vdGlmaWNhdGlvbiBzaG91bGQgYmUgbWFkZQorICAgICAqIHZpc2libGUgb3IgaW52aXNpYmxlLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBzZXROb3RpZmljYXRpb25WaXNpYmxlKGJvb2xlYW4gdmlzaWJsZSwgaW50IG51bU5ldHdvcmtzLCBib29sZWFuIGZvcmNlLAorICAgICAgICAgICAgaW50IGRlbGF5KSB7CisKKyAgICAgICAgLy8gU2luY2Ugd2UgdXNlIGF1dG8gY2FuY2VsIG9uIHRoZSBub3RpZmljYXRpb24sIHdoZW4gdGhlCisgICAgICAgIC8vIG1OZXR3b3Jrc0F2YWlsYWJsZU5vdGlmaWNhdGlvblNob3duIGlzIHRydWUsIHRoZSBub3RpZmljYXRpb24gbWF5CisgICAgICAgIC8vIGhhdmUgYWN0dWFsbHkgYmVlbiBjYW5jZWxlZC4gIEhvd2V2ZXIsIHdoZW4gaXQgaXMgZmFsc2Ugd2Uga25vdworICAgICAgICAvLyBmb3Igc3VyZSB0aGF0IGl0IGlzIG5vdCBiZWluZyBzaG93biAoaXQgd2lsbCBub3QgYmUgc2hvd24gYW55IG90aGVyCisgICAgICAgIC8vIHBsYWNlIHRoYW4gaGVyZSkKKworICAgICAgICAvLyBJZiBpdCBzaG91bGQgYmUgaGlkZGVuIGFuZCBpdCBpcyBhbHJlYWR5IGhpZGRlbiwgdGhlbiBub29wCisgICAgICAgIGlmICghdmlzaWJsZSAmJiAhbU5vdGlmaWNhdGlvblNob3duICYmICFmb3JjZSkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgTm90aWZpY2F0aW9uTWFuYWdlciBub3RpZmljYXRpb25NYW5hZ2VyID0gKE5vdGlmaWNhdGlvbk1hbmFnZXIpIG1Db250ZXh0CisgICAgICAgICAgICAgICAgLmdldFN5c3RlbVNlcnZpY2UoQ29udGV4dC5OT1RJRklDQVRJT05fU0VSVklDRSk7CisKKyAgICAgICAgTWVzc2FnZSBtZXNzYWdlOworICAgICAgICBpZiAodmlzaWJsZSkgeworCisgICAgICAgICAgICAvLyBOb3QgZW5vdWdoIHRpbWUgaGFzIHBhc3NlZCB0byBzaG93IHRoZSBub3RpZmljYXRpb24gYWdhaW4KKyAgICAgICAgICAgIGlmIChTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSA8IG1Ob3RpZmljYXRpb25SZXBlYXRUaW1lKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAobU5vdGlmaWNhdGlvbiA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgLy8gQ2FjaGUgdGhlIE5vdGlmaWNhdGlvbiBvYmplY3QuCisgICAgICAgICAgICAgICAgbU5vdGlmaWNhdGlvbiA9IG5ldyBOb3RpZmljYXRpb24oKTsKKyAgICAgICAgICAgICAgICBtTm90aWZpY2F0aW9uLndoZW4gPSAwOworICAgICAgICAgICAgICAgIG1Ob3RpZmljYXRpb24uaWNvbiA9IElDT05fTkVUV09SS1NfQVZBSUxBQkxFOworICAgICAgICAgICAgICAgIG1Ob3RpZmljYXRpb24uZmxhZ3MgPSBOb3RpZmljYXRpb24uRkxBR19BVVRPX0NBTkNFTDsKKyAgICAgICAgICAgICAgICBtTm90aWZpY2F0aW9uLmNvbnRlbnRJbnRlbnQgPSBQZW5kaW5nSW50ZW50LmdldEFjdGl2aXR5KG1Db250ZXh0LCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEludGVudChXaWZpTWFuYWdlci5BQ1RJT05fUElDS19XSUZJX05FVFdPUkspLCAwKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQ2hhclNlcXVlbmNlIHRpdGxlID0gbUNvbnRleHQuZ2V0UmVzb3VyY2VzKCkuZ2V0UXVhbnRpdHlUZXh0KAorICAgICAgICAgICAgICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnBsdXJhbHMud2lmaV9hdmFpbGFibGUsIG51bU5ldHdvcmtzKTsKKyAgICAgICAgICAgIENoYXJTZXF1ZW5jZSBkZXRhaWxzID0gbUNvbnRleHQuZ2V0UmVzb3VyY2VzKCkuZ2V0UXVhbnRpdHlUZXh0KAorICAgICAgICAgICAgICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnBsdXJhbHMud2lmaV9hdmFpbGFibGVfZGV0YWlsZWQsIG51bU5ldHdvcmtzKTsKKyAgICAgICAgICAgIG1Ob3RpZmljYXRpb24udGlja2VyVGV4dCA9IHRpdGxlOworICAgICAgICAgICAgbU5vdGlmaWNhdGlvbi5zZXRMYXRlc3RFdmVudEluZm8obUNvbnRleHQsIHRpdGxlLCBkZXRhaWxzLCBtTm90aWZpY2F0aW9uLmNvbnRlbnRJbnRlbnQpOworCisgICAgICAgICAgICBtTm90aWZpY2F0aW9uUmVwZWF0VGltZSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpICsgTk9USUZJQ0FUSU9OX1JFUEVBVF9ERUxBWV9NUzsKKworICAgICAgICAgICAgbm90aWZpY2F0aW9uTWFuYWdlci5ub3RpZnkoSUNPTl9ORVRXT1JLU19BVkFJTEFCTEUsIG1Ob3RpZmljYXRpb24pOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbm90aWZpY2F0aW9uTWFuYWdlci5jYW5jZWwoSUNPTl9ORVRXT1JLU19BVkFJTEFCTEUpOworICAgICAgICB9CisKKyAgICAgICAgbU5vdGlmaWNhdGlvblNob3duID0gdmlzaWJsZTsKKyAgICB9CisKKyAgICBwcml2YXRlIGNsYXNzIE5vdGlmaWNhdGlvbkVuYWJsZWRTZXR0aW5nT2JzZXJ2ZXIgZXh0ZW5kcyBDb250ZW50T2JzZXJ2ZXIgeworCisgICAgICAgIHB1YmxpYyBOb3RpZmljYXRpb25FbmFibGVkU2V0dGluZ09ic2VydmVyKEhhbmRsZXIgaGFuZGxlcikgeworICAgICAgICAgICAgc3VwZXIoaGFuZGxlcik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCByZWdpc3RlcigpIHsKKyAgICAgICAgICAgIENvbnRlbnRSZXNvbHZlciBjciA9IG1Db250ZXh0LmdldENvbnRlbnRSZXNvbHZlcigpOworICAgICAgICAgICAgY3IucmVnaXN0ZXJDb250ZW50T2JzZXJ2ZXIoU2V0dGluZ3MuU2VjdXJlLmdldFVyaUZvcigKKyAgICAgICAgICAgICAgICBTZXR0aW5ncy5TZWN1cmUuV0lGSV9ORVRXT1JLU19BVkFJTEFCTEVfTk9USUZJQ0FUSU9OX09OKSwgdHJ1ZSwgdGhpcyk7CisgICAgICAgICAgICBtTm90aWZpY2F0aW9uRW5hYmxlZCA9IGdldFZhbHVlKCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgb25DaGFuZ2UoYm9vbGVhbiBzZWxmQ2hhbmdlKSB7CisgICAgICAgICAgICBzdXBlci5vbkNoYW5nZShzZWxmQ2hhbmdlKTsKKworICAgICAgICAgICAgbU5vdGlmaWNhdGlvbkVuYWJsZWQgPSBnZXRWYWx1ZSgpOworICAgICAgICAgICAgcmVzZXROb3RpZmljYXRpb24oKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgYm9vbGVhbiBnZXRWYWx1ZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBTZXR0aW5ncy5TZWN1cmUuZ2V0SW50KG1Db250ZXh0LmdldENvbnRlbnRSZXNvbHZlcigpLAorICAgICAgICAgICAgICAgICAgICBTZXR0aW5ncy5TZWN1cmUuV0lGSV9ORVRXT1JLU19BVkFJTEFCTEVfTk9USUZJQ0FUSU9OX09OLCAxKSA9PSAxOworICAgICAgICB9CisgICAgfQorCisKIH0KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL1dpZmlXYXRjaGRvZ1NlcnZpY2UuamF2YSBiL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL1dpZmlXYXRjaGRvZ1NlcnZpY2UuamF2YQppbmRleCA0NDVkZDAzLi40NmQ2YmVmIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9XaWZpV2F0Y2hkb2dTZXJ2aWNlLmphdmEKKysrIGIvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvV2lmaVdhdGNoZG9nU2VydmljZS5qYXZhCkBAIC0yNyw3ICsyNyw2IEBACiBpbXBvcnQgYW5kcm9pZC5uZXQud2lmaS5TY2FuUmVzdWx0OwogaW1wb3J0IGFuZHJvaWQubmV0LndpZmkuV2lmaUluZm87CiBpbXBvcnQgYW5kcm9pZC5uZXQud2lmaS5XaWZpTWFuYWdlcjsKLWltcG9ydCBhbmRyb2lkLm5ldC53aWZpLldpZmlTdGF0ZVRyYWNrZXI7CiBpbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyOwogaW1wb3J0IGFuZHJvaWQub3MuTG9vcGVyOwogaW1wb3J0IGFuZHJvaWQub3MuTWVzc2FnZTsKQEAgLTc3LDcgKzc2LDYgQEAKICAgICAKICAgICBwcml2YXRlIENvbnRleHQgbUNvbnRleHQ7CiAgICAgcHJpdmF0ZSBDb250ZW50UmVzb2x2ZXIgbUNvbnRlbnRSZXNvbHZlcjsKLSAgICBwcml2YXRlIFdpZmlTdGF0ZVRyYWNrZXIgbVdpZmlTdGF0ZVRyYWNrZXI7CiAgICAgcHJpdmF0ZSBXaWZpTWFuYWdlciBtV2lmaU1hbmFnZXI7CiAgICAgCiAgICAgLyoqCkBAIC0xMDgsMTAgKzEwNiw5IEBACiAgICAgLyoqIFdoZXRoZXIgdGhlIGN1cnJlbnQgQVAgY2hlY2sgc2hvdWxkIGJlIGNhbmNlbGVkLiAqLwogICAgIHByaXZhdGUgYm9vbGVhbiBtU2hvdWxkQ2FuY2VsOwogICAgIAotICAgIFdpZmlXYXRjaGRvZ1NlcnZpY2UoQ29udGV4dCBjb250ZXh0LCBXaWZpU3RhdGVUcmFja2VyIHdpZmlTdGF0ZVRyYWNrZXIpIHsKKyAgICBXaWZpV2F0Y2hkb2dTZXJ2aWNlKENvbnRleHQgY29udGV4dCkgewogICAgICAgICBtQ29udGV4dCA9IGNvbnRleHQ7CiAgICAgICAgIG1Db250ZW50UmVzb2x2ZXIgPSBjb250ZXh0LmdldENvbnRlbnRSZXNvbHZlcigpOwotICAgICAgICBtV2lmaVN0YXRlVHJhY2tlciA9IHdpZmlTdGF0ZVRyYWNrZXI7CiAgICAgICAgIG1XaWZpTWFuYWdlciA9IChXaWZpTWFuYWdlcikgY29udGV4dC5nZXRTeXN0ZW1TZXJ2aWNlKENvbnRleHQuV0lGSV9TRVJWSUNFKTsKICAgICAgICAgCiAgICAgICAgIGNyZWF0ZVRocmVhZCgpOwpAQCAtMjc1LDEyICsyNzIsMTMgQEAKICAgICAvKioKICAgICAgKiBVbnJlZ2lzdGVyIGJyb2FkY2FzdHMgYW5kIHF1aXQgdGhlIHdhdGNoZG9nIHRocmVhZAogICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBxdWl0KCkgewotICAgICAgICB1bnJlZ2lzdGVyRm9yV2lmaUJyb2FkY2FzdHMoKTsKLSAgICAgICAgbUNvbnRleHQuZ2V0Q29udGVudFJlc29sdmVyKCkudW5yZWdpc3RlckNvbnRlbnRPYnNlcnZlcihtQ29udGVudE9ic2VydmVyKTsKLSAgICAgICAgbUhhbmRsZXIucmVtb3ZlQWxsQWN0aW9ucygpOwotICAgICAgICBtSGFuZGxlci5nZXRMb29wZXIoKS5xdWl0KCk7Ci0gICAgfQorICAgIC8vVE9ETzogQ2hhbmdlIGJhY2sgdG8gcnVubmluZyBXV1Mgd2hlbiBuZWVkZWQKKy8vICAgIHByaXZhdGUgdm9pZCBxdWl0KCkgeworLy8gICAgICAgIHVucmVnaXN0ZXJGb3JXaWZpQnJvYWRjYXN0cygpOworLy8gICAgICAgIG1Db250ZXh0LmdldENvbnRlbnRSZXNvbHZlcigpLnVucmVnaXN0ZXJDb250ZW50T2JzZXJ2ZXIobUNvbnRlbnRPYnNlcnZlcik7CisvLyAgICAgICAgbUhhbmRsZXIucmVtb3ZlQWxsQWN0aW9ucygpOworLy8gICAgICAgIG1IYW5kbGVyLmdldExvb3BlcigpLnF1aXQoKTsKKy8vICAgIH0KIAogICAgIC8qKgogICAgICAqIFdhaXRzIGZvciB0aGUgbWFpbiB3YXRjaGRvZyB0aHJlYWQgdG8gY3JlYXRlIHRoZSBoYW5kbGVyLgpAQCAtNzUxLDcgKzc0OSw3IEBACiAgICAgICAgIC8vIEJsYWNrIGxpc3QgdGhpcyAiYmFkIiBBUCwgdGhpcyB3aWxsIGNhdXNlIGFuIGF0dGVtcHQgdG8gY29ubmVjdCB0byBhbm90aGVyCiAgICAgICAgIGJsYWNrbGlzdEFwKGFwLmJzc2lkKTsKICAgICAgICAgLy8gSW5pdGlhdGUgYW4gYXNzb2NpYXRpb24gdG8gYW4gYWx0ZXJuYXRlIEFQCi0gICAgICAgIG1XaWZpU3RhdGVUcmFja2VyLnJlYXNzb2NpYXRlKCk7CisgICAgICAgIG1XaWZpTWFuYWdlci5yZWFzc29jaWF0ZSgpOwogICAgIH0KIAogICAgIHByaXZhdGUgdm9pZCBibGFja2xpc3RBcChTdHJpbmcgYnNzaWQpIHsKQEAgLTc2MiwxMCArNzYwLDcgQEAKICAgICAgICAgLy8gQmVmb3JlIHRha2luZyBhY3Rpb24sIG1ha2Ugc3VyZSB3ZSBzaG91bGQgbm90IGNhbmNlbCBvdXIgcHJvY2Vzc2luZwogICAgICAgICBpZiAoc2hvdWxkQ2FuY2VsKCkpIHJldHVybjsKICAgICAgICAgCi0gICAgICAgIGlmICghbVdpZmlTdGF0ZVRyYWNrZXIuYWRkVG9CbGFja2xpc3QoYnNzaWQpKSB7Ci0gICAgICAgICAgICAvLyBUaGVyZSdzIGEga25vd24gYnVnIHdoZXJlIHRoaXMgbWV0aG9kIHJldHVybnMgZmFpbHVyZSBvbiBzdWNjZXNzCi0gICAgICAgICAgICAvL1Nsb2cuZShUQUcsICJCbGFja2xpc3RpbmcgIiArIGJzc2lkICsgIiBmYWlsZWQiKTsKLSAgICAgICAgfQorICAgICAgICBtV2lmaU1hbmFnZXIuYWRkVG9CbGFja2xpc3QoYnNzaWQpOwogCiAgICAgICAgIGlmIChEKSB7CiAgICAgICAgICAgICBteUxvZ0QoIkJsYWNrbGlzdGluZyAiICsgYnNzaWQpOwpAQCAtODYwLDEwICs4NTUsNyBAQAogICAgICAgICAgICAgICogKGFuZCBibGFja2xpc3RlZCB0aGVtKS4gQ2xlYXIgdGhlIGJsYWNrbGlzdCBzbyB0aGUgQVAgd2l0aCBiZXN0CiAgICAgICAgICAgICAgKiBzaWduYWwgaXMgY2hvc2VuLgogICAgICAgICAgICAgICovCi0gICAgICAgICAgICBpZiAoIW1XaWZpU3RhdGVUcmFja2VyLmNsZWFyQmxhY2tsaXN0KCkpIHsKLSAgICAgICAgICAgICAgICAvLyBUaGVyZSdzIGEga25vd24gYnVnIHdoZXJlIHRoaXMgbWV0aG9kIHJldHVybnMgZmFpbHVyZSBvbiBzdWNjZXNzCi0gICAgICAgICAgICAgICAgLy9TbG9nLmUoVEFHLCAiQ2xlYXJpbmcgYmxhY2tsaXN0IGZhaWxlZCIpOwotICAgICAgICAgICAgfQorICAgICAgICAgICAgbVdpZmlNYW5hZ2VyLmNsZWFyQmxhY2tsaXN0KCk7CiAgICAgICAgICAgICAKICAgICAgICAgICAgIGlmIChWKSB7CiAgICAgICAgICAgICAgICAgbXlMb2dWKCJoYW5kbGVTbGVlcDogU2V0IHN0YXRlIHRvIFNMRUVQIGFuZCBjbGVhcmVkIGJsYWNrbGlzdCIpOwpAQCAtOTM0LDcgKzkyNiw3IEBACiAgICAgICogc2hvdWxkIHJldmVydCBhbnl0aGluZyBkb25lIGJ5IHRoZSB3YXRjaGRvZyBtb25pdG9yaW5nLgogICAgICAqLwogICAgIHByaXZhdGUgdm9pZCBoYW5kbGVSZXNldCgpIHsKLSAgICAgICAgbVdpZmlTdGF0ZVRyYWNrZXIuY2xlYXJCbGFja2xpc3QoKTsKKyAgICAgICAgbVdpZmlNYW5hZ2VyLmNsZWFyQmxhY2tsaXN0KCk7CiAgICAgICAgIHNldElkbGVTdGF0ZSh0cnVlKTsKICAgICB9CiAgICAgCkBAIC0xMTUxLDcgKzExNDMsNyBAQAogCiAgICAgICAgIHByaXZhdGUgdm9pZCBoYW5kbGVXaWZpU3RhdGVDaGFuZ2VkKGludCB3aWZpU3RhdGUpIHsKICAgICAgICAgICAgIGlmICh3aWZpU3RhdGUgPT0gV2lmaU1hbmFnZXIuV0lGSV9TVEFURV9ESVNBQkxFRCkgewotICAgICAgICAgICAgICAgIHF1aXQoKTsKKyAgICAgICAgICAgICAgICBvbkRpc2Nvbm5lY3RlZCgpOwogICAgICAgICAgICAgfSBlbHNlIGlmICh3aWZpU3RhdGUgPT0gV2lmaU1hbmFnZXIuV0lGSV9TVEFURV9FTkFCTEVEKSB7CiAgICAgICAgICAgICAgICAgb25FbmFibGVkKCk7CiAgICAgICAgICAgICB9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9XaW5kb3dNYW5hZ2VyU2VydmljZS5qYXZhIGIvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvV2luZG93TWFuYWdlclNlcnZpY2UuamF2YQppbmRleCA5MTQwYTkzLi5kYWNkZDdkIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9XaW5kb3dNYW5hZ2VyU2VydmljZS5qYXZhCisrKyBiL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL1dpbmRvd01hbmFnZXJTZXJ2aWNlLmphdmEKQEAgLTIzLDYgKzIzLDcgQEAKIGltcG9ydCBzdGF0aWMgYW5kcm9pZC52aWV3LldpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zLkZMQUdfRElNX0JFSElORDsKIGltcG9ydCBzdGF0aWMgYW5kcm9pZC52aWV3LldpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zLkZMQUdfS0VFUF9TQ1JFRU5fT047CiBpbXBvcnQgc3RhdGljIGFuZHJvaWQudmlldy5XaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcy5GTEFHX0xBWU9VVF9OT19MSU1JVFM7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQudmlldy5XaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcy5GTEFHX0ZVTExTQ1JFRU47CiBpbXBvcnQgc3RhdGljIGFuZHJvaWQudmlldy5XaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcy5GTEFHX1NZU1RFTV9FUlJPUjsKIGltcG9ydCBzdGF0aWMgYW5kcm9pZC52aWV3LldpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zLkZMQUdfTk9UX0ZPQ1VTQUJMRTsKIGltcG9ydCBzdGF0aWMgYW5kcm9pZC52aWV3LldpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zLkZMQUdfQUxUX0ZPQ1VTQUJMRV9JTTsKQEAgLTE1OCw3ICsxNTksNiBAQAogICAgIHN0YXRpYyBmaW5hbCBib29sZWFuIERFQlVHX1NUQVJUSU5HX1dJTkRPVyA9IGZhbHNlOwogICAgIHN0YXRpYyBmaW5hbCBib29sZWFuIERFQlVHX1JFT1JERVIgPSBmYWxzZTsKICAgICBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVR19XQUxMUEFQRVIgPSBmYWxzZTsKLSAgICBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVR19GUkVFWkUgPSBmYWxzZTsKICAgICBzdGF0aWMgZmluYWwgYm9vbGVhbiBTSE9XX1RSQU5TQUNUSU9OUyA9IGZhbHNlOwogICAgIHN0YXRpYyBmaW5hbCBib29sZWFuIEhJREVfU1RBQ0tfQ1JBV0xTID0gdHJ1ZTsKIApAQCAtMTc4OSwxOCArMTc4OSwxMSBAQAogICAgICAgICBib29sZWFuIHJlcG9ydE5ld0NvbmZpZyA9IGZhbHNlOwogICAgICAgICBXaW5kb3dTdGF0ZSBhdHRhY2hlZFdpbmRvdyA9IG51bGw7CiAgICAgICAgIFdpbmRvd1N0YXRlIHdpbiA9IG51bGw7CisgICAgICAgIGxvbmcgb3JpZ0lkOwogCiAgICAgICAgIHN5bmNocm9uaXplZChtV2luZG93TWFwKSB7Ci0gICAgICAgICAgICAvLyBJbnN0YW50aWF0aW5nIGEgRGlzcGxheSByZXF1aXJlcyB0YWxraW5nIHdpdGggdGhlIHNpbXVsYXRvciwKLSAgICAgICAgICAgIC8vIHNvIGRvbid0IGRvIGl0IHVudGlsIHdlIGtub3cgdGhlIHN5c3RlbSBpcyBtb3N0bHkgdXAgYW5kCi0gICAgICAgICAgICAvLyBydW5uaW5nLgogICAgICAgICAgICAgaWYgKG1EaXNwbGF5ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBXaW5kb3dNYW5hZ2VyIHdtID0gKFdpbmRvd01hbmFnZXIpbUNvbnRleHQuZ2V0U3lzdGVtU2VydmljZShDb250ZXh0LldJTkRPV19TRVJWSUNFKTsKLSAgICAgICAgICAgICAgICBtRGlzcGxheSA9IHdtLmdldERlZmF1bHREaXNwbGF5KCk7Ci0gICAgICAgICAgICAgICAgbUluaXRpYWxEaXNwbGF5V2lkdGggPSBtRGlzcGxheS5nZXRXaWR0aCgpOwotICAgICAgICAgICAgICAgIG1Jbml0aWFsRGlzcGxheUhlaWdodCA9IG1EaXNwbGF5LmdldEhlaWdodCgpOwotICAgICAgICAgICAgICAgIG1JbnB1dE1hbmFnZXIuc2V0RGlzcGxheVNpemUoMCwgbUluaXRpYWxEaXNwbGF5V2lkdGgsIG1Jbml0aWFsRGlzcGxheUhlaWdodCk7Ci0gICAgICAgICAgICAgICAgcmVwb3J0TmV3Q29uZmlnID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJEaXNwbGF5IGhhcyBub3QgYmVlbiBpbml0aWFsaWFsaXplZCIpOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBpZiAobVdpbmRvd01hcC5jb250YWluc0tleShjbGllbnQuYXNCaW5kZXIoKSkpIHsKQEAgLTE5MDYsNyArMTg5OSw3IEBACiAKICAgICAgICAgICAgIHJlcyA9IFdpbmRvd01hbmFnZXJJbXBsLkFERF9PS0FZOwogCi0gICAgICAgICAgICBmaW5hbCBsb25nIG9yaWdJZCA9IEJpbmRlci5jbGVhckNhbGxpbmdJZGVudGl0eSgpOworICAgICAgICAgICAgb3JpZ0lkID0gQmluZGVyLmNsZWFyQ2FsbGluZ0lkZW50aXR5KCk7CiAKICAgICAgICAgICAgIGlmIChhZGRUb2tlbikgewogICAgICAgICAgICAgICAgIG1Ub2tlbk1hcC5wdXQoYXR0cnMudG9rZW4sIHRva2VuKTsKQEAgLTE5ODMsMTQgKzE5NzYsMTAgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCi0gICAgICAgIC8vIHNlbmROZXdDb25maWd1cmF0aW9uKCkgY2hlY2tzIGNhbGxlciBwZXJtaXNzaW9ucyBzbyB3ZSBtdXN0IGNhbGwgaXQgd2l0aAotICAgICAgICAvLyBwcml2aWxlZ2UuICB1cGRhdGVPcmllbnRhdGlvbkZyb21BcHBUb2tlbnMoKSBjbGVhcnMgYW5kIHJlc2V0cyB0aGUgY2FsbGVyCi0gICAgICAgIC8vIGlkZW50aXR5IGFueXdheSwgc28gaXQncyBzYWZlIHRvIGp1c3QgY2xlYXIgJiByZXN0b3JlIGFyb3VuZCB0aGlzIHdob2xlCi0gICAgICAgIC8vIGJsb2NrLgotICAgICAgICBmaW5hbCBsb25nIG9yaWdJZCA9IEJpbmRlci5jbGVhckNhbGxpbmdJZGVudGl0eSgpOwogICAgICAgICBpZiAocmVwb3J0TmV3Q29uZmlnKSB7CiAgICAgICAgICAgICBzZW5kTmV3Q29uZmlndXJhdGlvbigpOwogICAgICAgICB9CisKICAgICAgICAgQmluZGVyLnJlc3RvcmVDYWxsaW5nSWRlbnRpdHkob3JpZ0lkKTsKIAogICAgICAgICByZXR1cm4gcmVzOwpAQCAtMzEwMyw4ICszMDkyLDExIEBACiAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICB9IGVsc2UgaWYgKGN1cnJlbnRDb25maWcgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgIC8vIE5vIG9idmlvdXMgYWN0aW9uIHdlIG5lZWQgdG8gdGFrZSwgYnV0IGlmIG91ciBjdXJyZW50Ci0gICAgICAgICAgICAgICAgLy8gc3RhdGUgbWlzbWF0Y2hlcyB0aGUgYWN0aXZpdHkgbWFhbmFnZXIncywgdXBkYXRlIGl0CisgICAgICAgICAgICAgICAgLy8gc3RhdGUgbWlzbWF0Y2hlcyB0aGUgYWN0aXZpdHkgbWFuYWdlcidzLCB1cGRhdGUgaXQsCisgICAgICAgICAgICAgICAgLy8gZGlzcmVnYXJkaW5nIGZvbnQgc2NhbGUsIHdoaWNoIHNob3VsZCByZW1haW4gc2V0IHRvCisgICAgICAgICAgICAgICAgLy8gdGhlIHZhbHVlIG9mIHRoZSBwcmV2aW91cyBjb25maWd1cmF0aW9uLgogICAgICAgICAgICAgICAgIG1UZW1wQ29uZmlndXJhdGlvbi5zZXRUb0RlZmF1bHRzKCk7CisgICAgICAgICAgICAgICAgbVRlbXBDb25maWd1cmF0aW9uLmZvbnRTY2FsZSA9IGN1cnJlbnRDb25maWcuZm9udFNjYWxlOwogICAgICAgICAgICAgICAgIGlmIChjb21wdXRlTmV3Q29uZmlndXJhdGlvbkxvY2tlZChtVGVtcENvbmZpZ3VyYXRpb24pKSB7CiAgICAgICAgICAgICAgICAgICAgIGlmIChjdXJyZW50Q29uZmlnLmRpZmYobVRlbXBDb25maWd1cmF0aW9uKSAhPSAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBtV2FpdGluZ0ZvckNvbmZpZyA9IHRydWU7CkBAIC00NDM2LDggKzQ0MjgsNyBAQAogICAgICAgICAgICAgZmluYWwgaW50IE4gPSBtV2luZG93cy5zaXplKCk7CiAgICAgICAgICAgICBmb3IgKGludCBpPTA7IGk8TjsgaSsrKSB7CiAgICAgICAgICAgICAgICAgV2luZG93U3RhdGUgdyA9IG1XaW5kb3dzLmdldChpKTsKLSAgICAgICAgICAgICAgICBpZiAody5pc1Zpc2libGVMdygpICYmICF3Lm1PYnNjdXJlZAotICAgICAgICAgICAgICAgICAgICAgICAgJiYgKHcubU9yaWVudGF0aW9uQ2hhbmdpbmcgfHwgIXcuaXNEcmF3bkx3KCkpKSB7CisgICAgICAgICAgICAgICAgaWYgKHcuaXNWaXNpYmxlTHcoKSAmJiAhdy5tT2JzY3VyZWQgJiYgIXcuaXNEcmF3bkx3KCkpIHsKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KQEAgLTU2MTMsNiArNTYwNCwyMiBAQAogICAgIH0KIAogICAgIHB1YmxpYyB2b2lkIHN5c3RlbVJlYWR5KCkgeworICAgICAgICBzeW5jaHJvbml6ZWQobVdpbmRvd01hcCkgeworICAgICAgICAgICAgaWYgKG1EaXNwbGF5ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJEaXNwbGF5IGFscmVhZHkgaW5pdGlhbGl6ZWQiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFdpbmRvd01hbmFnZXIgd20gPSAoV2luZG93TWFuYWdlciltQ29udGV4dC5nZXRTeXN0ZW1TZXJ2aWNlKENvbnRleHQuV0lORE9XX1NFUlZJQ0UpOworICAgICAgICAgICAgbURpc3BsYXkgPSB3bS5nZXREZWZhdWx0RGlzcGxheSgpOworICAgICAgICAgICAgbUluaXRpYWxEaXNwbGF5V2lkdGggPSBtRGlzcGxheS5nZXRXaWR0aCgpOworICAgICAgICAgICAgbUluaXRpYWxEaXNwbGF5SGVpZ2h0ID0gbURpc3BsYXkuZ2V0SGVpZ2h0KCk7CisgICAgICAgICAgICBtSW5wdXRNYW5hZ2VyLnNldERpc3BsYXlTaXplKDAsIG1Jbml0aWFsRGlzcGxheVdpZHRoLCBtSW5pdGlhbERpc3BsYXlIZWlnaHQpOworICAgICAgICB9CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG1BY3Rpdml0eU1hbmFnZXIudXBkYXRlQ29uZmlndXJhdGlvbihudWxsKTsKKyAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgfQorICAgICAgICAKICAgICAgICAgbVBvbGljeS5zeXN0ZW1SZWFkeSgpOwogICAgIH0KIApAQCAtNjg5MCw3ICs2ODk3LDcgQEAKICAgICAgICAgICAgIGZpbmFsIEFwcFdpbmRvd1Rva2VuIGF0b2tlbiA9IG1BcHBUb2tlbjsKICAgICAgICAgICAgIHJldHVybiBtU3VyZmFjZSAhPSBudWxsICYmICFtQXR0YWNoZWRIaWRkZW4KICAgICAgICAgICAgICAgICAgICAgJiYgKGF0b2tlbiA9PSBudWxsID8gbVBvbGljeVZpc2liaWxpdHkgOiAhYXRva2VuLmhpZGRlblJlcXVlc3RlZCkKLSAgICAgICAgICAgICAgICAgICAgJiYgKG1PcmllbnRhdGlvbkNoYW5naW5nIHx8ICghbURyYXdQZW5kaW5nICYmICFtQ29tbWl0RHJhd1BlbmRpbmcpKQorICAgICAgICAgICAgICAgICAgICAmJiAhbURyYXdQZW5kaW5nICYmICFtQ29tbWl0RHJhd1BlbmRpbmcKICAgICAgICAgICAgICAgICAgICAgJiYgIW1FeGl0aW5nICYmICFtRGVzdHJveWluZzsKICAgICAgICAgfQogCkBAIC02OTk0LDE0ICs3MDAxLDEyIEBACiAKICAgICAgICAgLyoqCiAgICAgICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgd2luZG93IGhhcyBhIHN1cmZhY2UgdGhhdCBpdCBoYXMgZHJhd24gYQotICAgICAgICAgKiBjb21wbGV0ZSBVSSBpbiB0by4gIE5vdGUgdGhhdCB0aGlzIHJldHVybnMgdHJ1ZSBpZiB0aGUgb3JpZW50YXRpb24KLSAgICAgICAgICogaXMgY2hhbmdpbmcgZXZlbiBpZiB0aGUgd2luZG93IGhhc24ndCByZWRyYXduIGJlY2F1c2Ugd2UgZG9uJ3Qgd2FudAotICAgICAgICAgKiB0byBzdG9wIHRoaW5ncyBmcm9tIGV4ZWN1dGluZyBkdXJpbmcgdGhhdCB0aW1lLgorICAgICAgICAgKiBjb21wbGV0ZSBVSSBpbiB0by4KICAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyBib29sZWFuIGlzRHJhd25MdygpIHsKICAgICAgICAgICAgIGZpbmFsIEFwcFdpbmRvd1Rva2VuIGF0b2tlbiA9IG1BcHBUb2tlbjsKICAgICAgICAgICAgIHJldHVybiBtU3VyZmFjZSAhPSBudWxsICYmICFtRGVzdHJveWluZwotICAgICAgICAgICAgICAgICYmIChtT3JpZW50YXRpb25DaGFuZ2luZyB8fCAoIW1EcmF3UGVuZGluZyAmJiAhbUNvbW1pdERyYXdQZW5kaW5nKSk7CisgICAgICAgICAgICAgICAgJiYgIW1EcmF3UGVuZGluZyAmJiAhbUNvbW1pdERyYXdQZW5kaW5nOwogICAgICAgICB9CiAKICAgICAgICAgcHVibGljIGJvb2xlYW4gZmlsbHNTY3JlZW5MdyhpbnQgc2NyZWVuV2lkdGgsIGludCBzY3JlZW5IZWlnaHQsCkBAIC03MDIzLDYgKzcwMjgsOSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWUucmlnaHQgPj0gbUNvbXBhdGlibGVTY3JlZW5GcmFtZS5yaWdodCAmJgogICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWUuYm90dG9tID49IG1Db21wYXRpYmxlU2NyZWVuRnJhbWUuYm90dG9tOwogICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZiAoKG1BdHRycy5mbGFncyAmIEZMQUdfRlVMTFNDUkVFTikgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgcmV0dXJuIGZyYW1lLmxlZnQgPD0gMCAmJiBmcmFtZS50b3AgPD0gMAogICAgICAgICAgICAgICAgICAgICAgICAgJiYgZnJhbWUucmlnaHQgPj0gc2NyZWVuV2lkdGgKICAgICAgICAgICAgICAgICAgICAgICAgICYmIGZyYW1lLmJvdHRvbSA+PSBzY3JlZW5IZWlnaHQ7CkBAIC04NTIyLDYgKzg1MzAsMTEgQEAKIAogICAgIHByaXZhdGUgZmluYWwgdm9pZCBwZXJmb3JtTGF5b3V0QW5kUGxhY2VTdXJmYWNlc0xvY2tlZElubmVyKAogICAgICAgICAgICAgYm9vbGVhbiByZWNvdmVyaW5nTWVtb3J5KSB7CisgICAgICAgIGlmIChtRGlzcGxheSA9PSBudWxsKSB7CisgICAgICAgICAgICBTbG9nLmkoVEFHLCAic2tpcHBpbmcgcGVyZm9ybUxheW91dEFuZFBsYWNlU3VyZmFjZXNMb2NrZWRJbm5lciB3aXRoIG5vIG1EaXNwbGF5Iik7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKwogICAgICAgICBmaW5hbCBsb25nIGN1cnJlbnRUaW1lID0gU3lzdGVtQ2xvY2sudXB0aW1lTWlsbGlzKCk7CiAgICAgICAgIGZpbmFsIGludCBkdyA9IG1EaXNwbGF5LmdldFdpZHRoKCk7CiAgICAgICAgIGZpbmFsIGludCBkaCA9IG1EaXNwbGF5LmdldEhlaWdodCgpOwpAQCAtOTMxMCwxMiArOTMyMyw2IEBACiAgICAgICAgICAgICAgICAgICAgIGlmICh3Lm1BdHRhY2hlZEhpZGRlbiB8fCAhdy5pc1JlYWR5Rm9yRGlzcGxheSgpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXcubUxhc3RIaWRkZW4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2R1bXAoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoREVCVUdfQ09ORklHVVJBVElPTikgU2xvZy52KFRBRywgIldpbmRvdyBoaWRpbmc6IHdhaXRpbmdUb1Nob3c9IgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyB3Lm1Sb290VG9rZW4ud2FpdGluZ1RvU2hvdyArICIgcG9sdmlzPSIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgdy5tUG9saWN5VmlzaWJpbGl0eSArICIgYXR0aGlkPSIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgdy5tQXR0YWNoZWRIaWRkZW4gKyAiIHRva2hpZD0iCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHcubVJvb3RUb2tlbi5oaWRkZW4gKyAiIHZpcz0iCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHcubVZpZXdWaXNpYmlsaXR5KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3Lm1MYXN0SGlkZGVuID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoU0hPV19UUkFOU0FDVElPTlMpIGxvZ1N1cmZhY2UodywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJISURFIChwZXJmb3JtTGF5b3V0KSIsIG51bGwpOwpAQCAtOTcxNiwzMCArOTcyMywyNiBAQAogICAgICAgICB9IGVsc2UgaWYgKGFuaW1hdGluZykgewogICAgICAgICAgICAgcmVxdWVzdEFuaW1hdGlvbkxvY2tlZChjdXJyZW50VGltZSsoMTAwMC82MCktU3lzdGVtQ2xvY2sudXB0aW1lTWlsbGlzKCkpOwogICAgICAgICB9Ci0gICAgICAgIAorCiAgICAgICAgIG1JbnB1dE1vbml0b3IudXBkYXRlSW5wdXRXaW5kb3dzTHcoKTsKLSAgICAgICAgCi0gICAgICAgIGlmIChERUJVR19GUkVFWkUpIFNsb2cudihUQUcsICJMYXlvdXQ6IG1EaXNwbGF5RnJvemVuPSIgKyBtRGlzcGxheUZyb3plbgotICAgICAgICAgICAgICAgICsgIiBob2xkU2NyZWVuPSIgKyBob2xkU2NyZWVuKTsKLSAgICAgICAgaWYgKCFtRGlzcGxheUZyb3plbikgewotICAgICAgICAgICAgc2V0SG9sZFNjcmVlbkxvY2tlZChob2xkU2NyZWVuICE9IG51bGwpOwotICAgICAgICAgICAgaWYgKHNjcmVlbkJyaWdodG5lc3MgPCAwIHx8IHNjcmVlbkJyaWdodG5lc3MgPiAxLjBmKSB7Ci0gICAgICAgICAgICAgICAgbVBvd2VyTWFuYWdlci5zZXRTY3JlZW5CcmlnaHRuZXNzT3ZlcnJpZGUoLTEpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBtUG93ZXJNYW5hZ2VyLnNldFNjcmVlbkJyaWdodG5lc3NPdmVycmlkZSgoaW50KQotICAgICAgICAgICAgICAgICAgICAgICAgKHNjcmVlbkJyaWdodG5lc3MgKiBQb3dlci5CUklHSFRORVNTX09OKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoYnV0dG9uQnJpZ2h0bmVzcyA8IDAgfHwgYnV0dG9uQnJpZ2h0bmVzcyA+IDEuMGYpIHsKLSAgICAgICAgICAgICAgICBtUG93ZXJNYW5hZ2VyLnNldEJ1dHRvbkJyaWdodG5lc3NPdmVycmlkZSgtMSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIG1Qb3dlck1hbmFnZXIuc2V0QnV0dG9uQnJpZ2h0bmVzc092ZXJyaWRlKChpbnQpCi0gICAgICAgICAgICAgICAgICAgICAgICAoYnV0dG9uQnJpZ2h0bmVzcyAqIFBvd2VyLkJSSUdIVE5FU1NfT04pKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChob2xkU2NyZWVuICE9IG1Ib2xkaW5nU2NyZWVuT24pIHsKLSAgICAgICAgICAgICAgICBtSG9sZGluZ1NjcmVlbk9uID0gaG9sZFNjcmVlbjsKLSAgICAgICAgICAgICAgICBNZXNzYWdlIG0gPSBtSC5vYnRhaW5NZXNzYWdlKEguSE9MRF9TQ1JFRU5fQ0hBTkdFRCwgaG9sZFNjcmVlbik7Ci0gICAgICAgICAgICAgICAgbUguc2VuZE1lc3NhZ2UobSk7Ci0gICAgICAgICAgICB9CisKKyAgICAgICAgc2V0SG9sZFNjcmVlbkxvY2tlZChob2xkU2NyZWVuICE9IG51bGwpOworICAgICAgICBpZiAoc2NyZWVuQnJpZ2h0bmVzcyA8IDAgfHwgc2NyZWVuQnJpZ2h0bmVzcyA+IDEuMGYpIHsKKyAgICAgICAgICAgIG1Qb3dlck1hbmFnZXIuc2V0U2NyZWVuQnJpZ2h0bmVzc092ZXJyaWRlKC0xKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1Qb3dlck1hbmFnZXIuc2V0U2NyZWVuQnJpZ2h0bmVzc092ZXJyaWRlKChpbnQpCisgICAgICAgICAgICAgICAgICAgIChzY3JlZW5CcmlnaHRuZXNzICogUG93ZXIuQlJJR0hUTkVTU19PTikpOworICAgICAgICB9CisgICAgICAgIGlmIChidXR0b25CcmlnaHRuZXNzIDwgMCB8fCBidXR0b25CcmlnaHRuZXNzID4gMS4wZikgeworICAgICAgICAgICAgbVBvd2VyTWFuYWdlci5zZXRCdXR0b25CcmlnaHRuZXNzT3ZlcnJpZGUoLTEpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbVBvd2VyTWFuYWdlci5zZXRCdXR0b25CcmlnaHRuZXNzT3ZlcnJpZGUoKGludCkKKyAgICAgICAgICAgICAgICAgICAgKGJ1dHRvbkJyaWdodG5lc3MgKiBQb3dlci5CUklHSFRORVNTX09OKSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGhvbGRTY3JlZW4gIT0gbUhvbGRpbmdTY3JlZW5PbikgeworICAgICAgICAgICAgbUhvbGRpbmdTY3JlZW5PbiA9IGhvbGRTY3JlZW47CisgICAgICAgICAgICBNZXNzYWdlIG0gPSBtSC5vYnRhaW5NZXNzYWdlKEguSE9MRF9TQ1JFRU5fQ0hBTkdFRCwgaG9sZFNjcmVlbik7CisgICAgICAgICAgICBtSC5zZW5kTWVzc2FnZShtKTsKICAgICAgICAgfQogCiAgICAgICAgIGlmIChtVHVybk9uU2NyZWVuKSB7CkBAIC0xMDAyOCw4ICsxMDAzMSw2IEBACiAgICAgICAgICAgICBtRnJlZXplR2NQZW5kaW5nID0gbm93OwogICAgICAgICB9CiAKLSAgICAgICAgaWYgKERFQlVHX0ZSRUVaRSkgU2xvZy52KFRBRywgIioqKiBGUkVFWklORyBESVNQTEFZIiwgbmV3IFJ1bnRpbWVFeGNlcHRpb24oKSk7Ci0gICAgICAgIAogICAgICAgICBtRGlzcGxheUZyb3plbiA9IHRydWU7CiAgICAgICAgIAogICAgICAgICBtSW5wdXRNb25pdG9yLmZyZWV6ZUlucHV0RGlzcGF0Y2hpbmdMdygpOwpAQCAtMTAwNTYsOCArMTAwNTcsNiBAQAogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CiAgICAgICAgIAotICAgICAgICBpZiAoREVCVUdfRlJFRVpFKSBTbG9nLnYoVEFHLCAiKioqIFVORlJFRVpJTkcgRElTUExBWSIsIG5ldyBSdW50aW1lRXhjZXB0aW9uKCkpOwotICAgICAgICAKICAgICAgICAgbURpc3BsYXlGcm96ZW4gPSBmYWxzZTsKICAgICAgICAgbUgucmVtb3ZlTWVzc2FnZXMoSC5BUFBfRlJFRVpFX1RJTUVPVVQpOwogICAgICAgICBpZiAoUFJPRklMRV9PUklFTlRBVElPTikgewpkaWZmIC0tZ2l0IGEvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvYW0vQWN0aXZpdHlNYW5hZ2VyU2VydmljZS5qYXZhIGIvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvYW0vQWN0aXZpdHlNYW5hZ2VyU2VydmljZS5qYXZhCmluZGV4IGNiNGRlZjUuLjU0MzI4OTAgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL2FtL0FjdGl2aXR5TWFuYWdlclNlcnZpY2UuamF2YQorKysgYi9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9hbS9BY3Rpdml0eU1hbmFnZXJTZXJ2aWNlLmphdmEKQEAgLTI0MTAsNiArMjQxMCwxMCBAQAogICAgICAgICAgICAgfQogICAgICAgICAgICAgCiAgICAgICAgICAgICBpZiAocHJvYy50aHJlYWQgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGlmIChwcm9jLnBpZCA9PSBQcm9jZXNzLm15UGlkKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiY3Jhc2hBcHBsaWNhdGlvbjogdHJ5aW5nIHRvIGNyYXNoIHNlbGYhIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgbG9uZyBpZGVudCA9IEJpbmRlci5jbGVhckNhbGxpbmdJZGVudGl0eSgpOwogICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgIHByb2MudGhyZWFkLnNjaGVkdWxlQ3Jhc2gobWVzc2FnZSk7CkBAIC01ODA2LDYgKzU4MTAsMzUgQEAKICAgICAgICAgfQogICAgIH0KIAorICAgIHB1YmxpYyB2b2lkIHNldEltbWVyc2l2ZShJQmluZGVyIHRva2VuLCBib29sZWFuIGltbWVyc2l2ZSkgeworICAgICAgICBzeW5jaHJvbml6ZWQodGhpcykgeworICAgICAgICAgICAgaW50IGluZGV4ID0gKHRva2VuICE9IG51bGwpID8gbU1haW5TdGFjay5pbmRleE9mVG9rZW5Mb2NrZWQodG9rZW4pIDogLTE7CisgICAgICAgICAgICBpZiAoaW5kZXggPCAwKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQWN0aXZpdHlSZWNvcmQgciA9IChBY3Rpdml0eVJlY29yZCltTWFpblN0YWNrLm1IaXN0b3J5LmdldChpbmRleCk7CisgICAgICAgICAgICByLmltbWVyc2l2ZSA9IGltbWVyc2l2ZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGlzSW1tZXJzaXZlKElCaW5kZXIgdG9rZW4pIHsKKyAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7CisgICAgICAgICAgICBpbnQgaW5kZXggPSAodG9rZW4gIT0gbnVsbCkgPyBtTWFpblN0YWNrLmluZGV4T2ZUb2tlbkxvY2tlZCh0b2tlbikgOiAtMTsKKyAgICAgICAgICAgIGlmIChpbmRleCA8IDApIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBBY3Rpdml0eVJlY29yZCByID0gKEFjdGl2aXR5UmVjb3JkKW1NYWluU3RhY2subUhpc3RvcnkuZ2V0KGluZGV4KTsKKyAgICAgICAgICAgIHJldHVybiByLmltbWVyc2l2ZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGlzVG9wQWN0aXZpdHlJbW1lcnNpdmUoKSB7CisgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgeworICAgICAgICAgICAgQWN0aXZpdHlSZWNvcmQgciA9IG1NYWluU3RhY2sudG9wUnVubmluZ0FjdGl2aXR5TG9ja2VkKG51bGwpOworICAgICAgICAgICAgcmV0dXJuIChyICE9IG51bGwpID8gci5pbW1lcnNpdmUgOiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIGVudGVyU2FmZU1vZGUoKSB7CiAgICAgICAgIHN5bmNocm9uaXplZCh0aGlzKSB7CiAgICAgICAgICAgICAvLyBJdCBvbmx5IG1ha2VzIHNlbnNlIHRvIGRvIHRoaXMgYmVmb3JlIHRoZSBzeXN0ZW0gaXMgcmVhZHkKQEAgLTEyMDczLDcgKzEyMTA2LDY5IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9Ci0gICAgCisKKyAgICBwdWJsaWMgYm9vbGVhbiBkdW1wSGVhcChTdHJpbmcgcHJvY2VzcywgYm9vbGVhbiBtYW5hZ2VkLAorICAgICAgICAgICAgU3RyaW5nIHBhdGgsIFBhcmNlbEZpbGVEZXNjcmlwdG9yIGZkKSB0aHJvd3MgUmVtb3RlRXhjZXB0aW9uIHsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7CisgICAgICAgICAgICAgICAgLy8gbm90ZTogaGlqYWNraW5nIFNFVF9BQ1RJVklUWV9XQVRDSEVSLCBidXQgc2hvdWxkIGJlIGNoYW5nZWQgdG8KKyAgICAgICAgICAgICAgICAvLyBpdHMgb3duIHBlcm1pc3Npb24gKHNhbWUgYXMgcHJvZmlsZUNvbnRyb2wpLgorICAgICAgICAgICAgICAgIGlmIChjaGVja0NhbGxpbmdQZXJtaXNzaW9uKGFuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbi5TRVRfQUNUSVZJVFlfV0FUQ0hFUikKKyAgICAgICAgICAgICAgICAgICAgICAgICE9IFBhY2thZ2VNYW5hZ2VyLlBFUk1JU1NJT05fR1JBTlRFRCkgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU2VjdXJpdHlFeGNlcHRpb24oIlJlcXVpcmVzIHBlcm1pc3Npb24gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgYW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uLlNFVF9BQ1RJVklUWV9XQVRDSEVSKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoZmQgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJudWxsIGZkIik7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgUHJvY2Vzc1JlY29yZCBwcm9jID0gbnVsbDsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBpbnQgcGlkID0gSW50ZWdlci5wYXJzZUludChwcm9jZXNzKTsKKyAgICAgICAgICAgICAgICAgICAgc3luY2hyb25pemVkIChtUGlkc1NlbGZMb2NrZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByb2MgPSBtUGlkc1NlbGZMb2NrZWQuZ2V0KHBpZCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChwcm9jID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgSGFzaE1hcDxTdHJpbmcsIFNwYXJzZUFycmF5PFByb2Nlc3NSZWNvcmQ+PiBhbGwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IG1Qcm9jZXNzTmFtZXMuZ2V0TWFwKCk7CisgICAgICAgICAgICAgICAgICAgIFNwYXJzZUFycmF5PFByb2Nlc3NSZWNvcmQ+IHByb2NzID0gYWxsLmdldChwcm9jZXNzKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHByb2NzICE9IG51bGwgJiYgcHJvY3Muc2l6ZSgpID4gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgcHJvYyA9IHByb2NzLnZhbHVlQXQoMCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAocHJvYyA9PSBudWxsIHx8IHByb2MudGhyZWFkID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVW5rbm93biBwcm9jZXNzOiAiICsgcHJvY2Vzcyk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYm9vbGVhbiBpc1NlY3VyZSA9ICIxIi5lcXVhbHMoU3lzdGVtUHJvcGVydGllcy5nZXQoU1lTVEVNX1NFQ1VSRSwgIjAiKSk7CisgICAgICAgICAgICAgICAgaWYgKGlzU2VjdXJlKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICgocHJvYy5pbmZvLmZsYWdzJkFwcGxpY2F0aW9uSW5mby5GTEFHX0RFQlVHR0FCTEUpID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBTZWN1cml0eUV4Y2VwdGlvbigiUHJvY2VzcyBub3QgZGVidWdnYWJsZTogIiArIHByb2MpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcHJvYy50aHJlYWQuZHVtcEhlYXAobWFuYWdlZCwgcGF0aCwgZmQpOworICAgICAgICAgICAgICAgIGZkID0gbnVsbDsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIlByb2Nlc3MgZGlzYXBwZWFyZWQiKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIGlmIChmZCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgZmQuY2xvc2UoKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCiAgICAgLyoqIEluIHRoaXMgbWV0aG9kIHdlIHRyeSB0byBhY3F1aXJlIG91ciBsb2NrIHRvIG1ha2Ugc3VyZSB0aGF0IHdlIGhhdmUgbm90IGRlYWRsb2NrZWQgKi8KICAgICBwdWJsaWMgdm9pZCBtb25pdG9yKCkgewogICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsgfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvYW0vQWN0aXZpdHlSZWNvcmQuamF2YSBiL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL2FtL0FjdGl2aXR5UmVjb3JkLmphdmEKaW5kZXggOTM1ODQ2OS4uYmY0ZGI4MCAxMDA2NDQKLS0tIGEvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvYW0vQWN0aXZpdHlSZWNvcmQuamF2YQorKysgYi9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9hbS9BY3Rpdml0eVJlY29yZC5qYXZhCkBAIC0xMDUsNiArMTA1LDcgQEAKICAgICBib29sZWFuIGlkbGU7ICAgICAgICAgICAvLyBoYXMgdGhlIGFjdGl2aXR5IGdvbmUgaWRsZT8KICAgICBib29sZWFuIGhhc0JlZW5MYXVuY2hlZDsvLyBoYXMgdGhpcyBhY3Rpdml0eSBldmVyIGJlZW4gbGF1bmNoZWQ/CiAgICAgYm9vbGVhbiBmcm96ZW5CZWZvcmVEZXN0cm95Oy8vIGhhcyBiZWVuIGZyb3plbiBidXQgbm90IHlldCBkZXN0cm95ZWQuCisgICAgYm9vbGVhbiBpbW1lcnNpdmU7ICAgICAgLy8gaW1tZXJzaXZlIG1vZGUgKGRvbid0IGludGVycnVwdCBpZiBwb3NzaWJsZSkKIAogICAgIFN0cmluZyBzdHJpbmdOYW1lOyAgICAgIC8vIGZvciBjYWNoaW5nIG9mIHRvU3RyaW5nKCkuCiAgICAgCkBAIC0xNjEsNiArMTYyLDcgQEAKICAgICAgICAgcHcucHJpbnQocHJlZml4KTsgcHcucHJpbnQoImtleXNQYXVzZWQ9Iik7IHB3LnByaW50KGtleXNQYXVzZWQpOwogICAgICAgICAgICAgICAgIHB3LnByaW50KCIgaW5IaXN0b3J5PSIpOyBwdy5wcmludChpbkhpc3RvcnkpOwogICAgICAgICAgICAgICAgIHB3LnByaW50KCIgcGVyc2lzdGVudD0iKTsgcHcucHJpbnQocGVyc2lzdGVudCk7CisgICAgICAgICAgICAgICAgcHcucHJpbnQoIiBpbW1lcnNpdmU9Iik7IHB3LnByaW50KGltbWVyc2l2ZSk7CiAgICAgICAgICAgICAgICAgcHcucHJpbnQoIiBsYXVuY2hNb2RlPSIpOyBwdy5wcmludGxuKGxhdW5jaE1vZGUpOwogICAgICAgICBwdy5wcmludChwcmVmaXgpOyBwdy5wcmludCgiZnVsbHNjcmVlbj0iKTsgcHcucHJpbnQoZnVsbHNjcmVlbik7CiAgICAgICAgICAgICAgICAgcHcucHJpbnQoIiB2aXNpYmxlPSIpOyBwdy5wcmludCh2aXNpYmxlKTsKQEAgLTI5Miw2ICsyOTQsOCBAQAogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICBpc0hvbWVBY3Rpdml0eSA9IGZhbHNlOwogICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpbW1lcnNpdmUgPSAoYUluZm8uZmxhZ3MgJiBBY3Rpdml0eUluZm8uRkxBR19JTU1FUlNJVkUpICE9IDA7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICByZWFsQWN0aXZpdHkgPSBudWxsOwogICAgICAgICAgICAgdGFza0FmZmluaXR5ID0gbnVsbDsKQEAgLTMwMyw2ICszMDcsNyBAQAogICAgICAgICAgICAgcGFja2FnZU5hbWUgPSBudWxsOwogICAgICAgICAgICAgZnVsbHNjcmVlbiA9IHRydWU7CiAgICAgICAgICAgICBpc0hvbWVBY3Rpdml0eSA9IGZhbHNlOworICAgICAgICAgICAgaW1tZXJzaXZlID0gZmFsc2U7CiAgICAgICAgIH0KICAgICB9CiAKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL2Nvbm5lY3Rpdml0eS9UZXRoZXJpbmcuamF2YSBiL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL2Nvbm5lY3Rpdml0eS9UZXRoZXJpbmcuamF2YQppbmRleCBlYjBhOGE5Li5iZmFjMzQ2IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9jb25uZWN0aXZpdHkvVGV0aGVyaW5nLmphdmEKKysrIGIvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvY29ubmVjdGl2aXR5L1RldGhlcmluZy5qYXZhCkBAIC0xOSw4ICsxOSw4IEBACiBpbXBvcnQgYW5kcm9pZC5hcHAuTm90aWZpY2F0aW9uOwogaW1wb3J0IGFuZHJvaWQuYXBwLk5vdGlmaWNhdGlvbk1hbmFnZXI7CiBpbXBvcnQgYW5kcm9pZC5hcHAuUGVuZGluZ0ludGVudDsKK2ltcG9ydCBhbmRyb2lkLmJsdWV0b290aC5CbHVldG9vdGhQYW47CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkJyb2FkY2FzdFJlY2VpdmVyOwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZW50UmVzb2x2ZXI7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50RmlsdGVyOwpAQCAtMzIsOSArMzIsOSBAQAogaW1wb3J0IGFuZHJvaWQubmV0LklDb25uZWN0aXZpdHlNYW5hZ2VyOwogaW1wb3J0IGFuZHJvaWQubmV0LklOZXR3b3JrTWFuYWdlbWVudEV2ZW50T2JzZXJ2ZXI7CiBpbXBvcnQgYW5kcm9pZC5uZXQuTmV0d29ya0luZm87Ci1pbXBvcnQgYW5kcm9pZC5uZXQuTmV0d29ya1V0aWxzOwogaW1wb3J0IGFuZHJvaWQub3MuQmluZGVyOwogaW1wb3J0IGFuZHJvaWQub3MuRW52aXJvbm1lbnQ7CitpbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyOwogaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlclRocmVhZDsKIGltcG9ydCBhbmRyb2lkLm9zLklCaW5kZXI7CiBpbXBvcnQgYW5kcm9pZC5vcy5JTmV0d29ya01hbmFnZW1lbnRTZXJ2aWNlOwpAQCAtNTMsNiArNTMsNyBAQAogaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7CiBpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuU2V0OwogLyoqCiAgKiBAaGlkZQpAQCAtNjUsNyArNjYsOCBAQAogcHVibGljIGNsYXNzIFRldGhlcmluZyBleHRlbmRzIElOZXR3b3JrTWFuYWdlbWVudEV2ZW50T2JzZXJ2ZXIuU3R1YiB7CiAKICAgICBwcml2YXRlIENvbnRleHQgbUNvbnRleHQ7Ci0gICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgVEFHID0gIlRldGhlcmluZyI7CisgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIFRBRyA9ICJUZXRoZXJpbmciOworICAgIHByaXZhdGUgZmluYWwgc3RhdGljIGJvb2xlYW4gREVCVUcgPSBmYWxzZTsKIAogICAgIHByaXZhdGUgYm9vbGVhbiBtQm9vdGVkID0gZmFsc2U7CiAgICAgLy91c2VkIHRvIHJlbWVtYmVyIGlmIHdlIGdvdCBjb25uZWN0ZWQgYmVmb3JlIGJvb3QgZmluaXNoZWQKQEAgLTc0LDYgKzc2LDcgQEAKICAgICAvLyBUT0RPIC0gcmVtb3ZlIGJvdGggb2YgdGhlc2UgLSBzaG91bGQgYmUgcGFydCBvZiBpbnRlcmZhY2UgaW5zcGVjdGlvbi9zZWxlY3Rpb24gc3R1ZmYKICAgICBwcml2YXRlIFN0cmluZ1tdIG1UZXRoZXJhYmxlVXNiUmVnZXhzOwogICAgIHByaXZhdGUgU3RyaW5nW10gbVRldGhlcmFibGVXaWZpUmVnZXhzOworICAgIHByaXZhdGUgU3RyaW5nW10gbVRldGhlcmFibGVCbHVldG9vdGhSZWdleHM7CiAgICAgcHJpdmF0ZSBTdHJpbmdbXSBtVXBzdHJlYW1JZmFjZVJlZ2V4czsKIAogICAgIHByaXZhdGUgTG9vcGVyIG1Mb29wZXI7CkBAIC04NiwxMyArODksMjcgQEAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVNCX05FQVJfSUZBQ0VfQUREUiAgICAgID0gIjE5Mi4xNjguNDIuMTI5IjsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVNCX05FVE1BU0sgICAgICAgICAgICAgID0gIjI1NS4yNTUuMjU1LjAiOwogCi0gICAgLy8gRllJIC0gdGhlIGRlZmF1bHQgd2lmaSBpcyAxOTIuMTY4LjQzLjEgYW5kIDI1NS4yNTUuMjU1LjAKKyAgICAvLyBVU0IgaXMgIDE5Mi4xNjguNDIuMSBhbmQgMjU1LjI1NS4yNTUuMAorICAgIC8vIFdpZmkgaXMgMTkyLjE2OC40My4xIGFuZCAyNTUuMjU1LjI1NS4wCisgICAgLy8gQlQgaXMgbGltaXRlZCB0byBtYXggZGVmYXVsdCBvZiA1IGNvbm5lY3Rpb25zLiAxOTIuMTY4LjQ0LjEgdG8gMTkyLjE2OC40OC4xCisgICAgLy8gd2l0aCAyNTUuMjU1LjI1NS4wCiAKICAgICBwcml2YXRlIFN0cmluZ1tdIG1EaGNwUmFuZ2U7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERIQ1BfREVGQVVMVF9SQU5HRTFfU1RBUlQgPSAiMTkyLjE2OC40Mi4yIjsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREhDUF9ERUZBVUxUX1JBTkdFMV9TVE9QICA9ICIxOTIuMTY4LjQyLjI1NCI7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERIQ1BfREVGQVVMVF9SQU5HRTJfU1RBUlQgPSAiMTkyLjE2OC40My4yIjsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREhDUF9ERUZBVUxUX1JBTkdFMl9TVE9QICA9ICIxOTIuMTY4LjQzLjI1NCI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERIQ1BfREVGQVVMVF9SQU5HRTNfU1RBUlQgPSAiMTkyLjE2OC40NC4yIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREhDUF9ERUZBVUxUX1JBTkdFM19TVE9QICA9ICIxOTIuMTY4LjQ0LjI1NCI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERIQ1BfREVGQVVMVF9SQU5HRTRfU1RBUlQgPSAiMTkyLjE2OC40NS4yIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREhDUF9ERUZBVUxUX1JBTkdFNF9TVE9QICA9ICIxOTIuMTY4LjQ1LjI1NCI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERIQ1BfREVGQVVMVF9SQU5HRTVfU1RBUlQgPSAiMTkyLjE2OC40Ni4yIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREhDUF9ERUZBVUxUX1JBTkdFNV9TVE9QICA9ICIxOTIuMTY4LjQ2LjI1NCI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERIQ1BfREVGQVVMVF9SQU5HRTZfU1RBUlQgPSAiMTkyLjE2OC40Ny4yIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREhDUF9ERUZBVUxUX1JBTkdFNl9TVE9QICA9ICIxOTIuMTY4LjQ3LjI1NCI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERIQ1BfREVGQVVMVF9SQU5HRTdfU1RBUlQgPSAiMTkyLjE2OC40OC4yIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREhDUF9ERUZBVUxUX1JBTkdFN19TVE9QICA9ICIxOTIuMTY4LjQ4LjI1NCI7CisKIAogICAgIHByaXZhdGUgU3RyaW5nW10gbURuc1NlcnZlcnM7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEROU19ERUZBVUxUX1NFUlZFUjEgPSAiOC44LjguOCI7CkBAIC0xMTAsNiArMTI3LDE0IEBACiAgICAgcHJpdmF0ZSBib29sZWFuIG1Vc2JNYXNzU3RvcmFnZU9mZjsgIC8vIHRyYWNrIHRoZSBzdGF0dXMgb2YgVVNCIE1hc3MgU3RvcmFnZQogICAgIHByaXZhdGUgYm9vbGVhbiBtVXNiQ29ubmVjdGVkOyAgICAgICAvLyB0cmFjayB0aGUgc3RhdHVzIG9mIFVTQiBjb25uZWN0aW9uCiAKKyAgICAvLyBtVXNiSGFuZGxlciBtZXNzYWdlCisgICAgc3RhdGljIGZpbmFsIGludCBVU0JfU1RBVEVfQ0hBTkdFID0gMTsKKyAgICBzdGF0aWMgZmluYWwgaW50IFVTQl9ESVNDT05ORUNURUQgPSAwOworICAgIHN0YXRpYyBmaW5hbCBpbnQgVVNCX0NPTk5FQ1RFRCA9IDE7CisKKyAgICAvLyBUaW1lIHRvIGRlbGF5IGJlZm9yZSBwcm9jZXNzaW5nIFVTQiBkaXNjb25uZWN0IGV2ZW50cworICAgIHN0YXRpYyBmaW5hbCBsb25nIFVTQl9ESVNDT05ORUNUX0RFTEFZID0gMTAwMDsKKwogICAgIHB1YmxpYyBUZXRoZXJpbmcoQ29udGV4dCBjb250ZXh0LCBMb29wZXIgbG9vcGVyKSB7CiAgICAgICAgIExvZy5kKFRBRywgIlRldGhlcmluZyBzdGFydGluZyIpOwogICAgICAgICBtQ29udGV4dCA9IGNvbnRleHQ7CkBAIC0xNTIsMTEgKzE3NywyMSBAQAogICAgICAgICBtRGhjcFJhbmdlID0gY29udGV4dC5nZXRSZXNvdXJjZXMoKS5nZXRTdHJpbmdBcnJheSgKICAgICAgICAgICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmFycmF5LmNvbmZpZ190ZXRoZXJfZGhjcF9yYW5nZSk7CiAgICAgICAgIGlmICgobURoY3BSYW5nZS5sZW5ndGggPT0gMCkgfHwgKG1EaGNwUmFuZ2UubGVuZ3RoICUgMiA9PTEpKSB7Ci0gICAgICAgICAgICBtRGhjcFJhbmdlID0gbmV3IFN0cmluZ1s0XTsKKyAgICAgICAgICAgIG1EaGNwUmFuZ2UgPSBuZXcgU3RyaW5nWzE0XTsKICAgICAgICAgICAgIG1EaGNwUmFuZ2VbMF0gPSBESENQX0RFRkFVTFRfUkFOR0UxX1NUQVJUOwogICAgICAgICAgICAgbURoY3BSYW5nZVsxXSA9IERIQ1BfREVGQVVMVF9SQU5HRTFfU1RPUDsKICAgICAgICAgICAgIG1EaGNwUmFuZ2VbMl0gPSBESENQX0RFRkFVTFRfUkFOR0UyX1NUQVJUOwogICAgICAgICAgICAgbURoY3BSYW5nZVszXSA9IERIQ1BfREVGQVVMVF9SQU5HRTJfU1RPUDsKKyAgICAgICAgICAgIG1EaGNwUmFuZ2VbNF0gPSBESENQX0RFRkFVTFRfUkFOR0UzX1NUQVJUOworICAgICAgICAgICAgbURoY3BSYW5nZVs1XSA9IERIQ1BfREVGQVVMVF9SQU5HRTNfU1RPUDsKKyAgICAgICAgICAgIG1EaGNwUmFuZ2VbNl0gPSBESENQX0RFRkFVTFRfUkFOR0U0X1NUQVJUOworICAgICAgICAgICAgbURoY3BSYW5nZVs3XSA9IERIQ1BfREVGQVVMVF9SQU5HRTRfU1RPUDsKKyAgICAgICAgICAgIG1EaGNwUmFuZ2VbOF0gPSBESENQX0RFRkFVTFRfUkFOR0U1X1NUQVJUOworICAgICAgICAgICAgbURoY3BSYW5nZVs5XSA9IERIQ1BfREVGQVVMVF9SQU5HRTVfU1RPUDsKKyAgICAgICAgICAgIG1EaGNwUmFuZ2VbMTBdID0gREhDUF9ERUZBVUxUX1JBTkdFNl9TVEFSVDsKKyAgICAgICAgICAgIG1EaGNwUmFuZ2VbMTFdID0gREhDUF9ERUZBVUxUX1JBTkdFNl9TVE9QOworICAgICAgICAgICAgbURoY3BSYW5nZVsxMl0gPSBESENQX0RFRkFVTFRfUkFOR0U3X1NUQVJUOworICAgICAgICAgICAgbURoY3BSYW5nZVsxM10gPSBESENQX0RFRkFVTFRfUkFOR0U3X1NUT1A7CiAgICAgICAgIH0KICAgICAgICAgbUR1blJlcXVpcmVkID0gZmFsc2U7IC8vIHJlc2FtcGxlIHdoZW4gd2UgdHVybiBvbgogCkBAIC0xNjQsNiArMTk5LDggQEAKICAgICAgICAgICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmFycmF5LmNvbmZpZ190ZXRoZXJfdXNiX3JlZ2V4cyk7CiAgICAgICAgIG1UZXRoZXJhYmxlV2lmaVJlZ2V4cyA9IGNvbnRleHQuZ2V0UmVzb3VyY2VzKCkuZ2V0U3RyaW5nQXJyYXkoCiAgICAgICAgICAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5hcnJheS5jb25maWdfdGV0aGVyX3dpZmlfcmVnZXhzKTsKKyAgICAgICAgbVRldGhlcmFibGVCbHVldG9vdGhSZWdleHMgPSBjb250ZXh0LmdldFJlc291cmNlcygpLmdldFN0cmluZ0FycmF5KAorICAgICAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuYXJyYXkuY29uZmlnX3RldGhlcl9ibHVldG9vdGhfcmVnZXhzKTsKICAgICAgICAgbVVwc3RyZWFtSWZhY2VSZWdleHMgPSBjb250ZXh0LmdldFJlc291cmNlcygpLmdldFN0cmluZ0FycmF5KAogICAgICAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuYXJyYXkuY29uZmlnX3RldGhlcl91cHN0cmVhbV9yZWdleHMpOwogCkBAIC0xNzQsNyArMjExLDcgQEAKICAgICB9CiAKICAgICBwdWJsaWMgdm9pZCBpbnRlcmZhY2VMaW5rU3RhdHVzQ2hhbmdlZChTdHJpbmcgaWZhY2UsIGJvb2xlYW4gbGluaykgewotICAgICAgICBMb2cuZChUQUcsICJpbnRlcmZhY2VMaW5rU3RhdHVzQ2hhbmdlZCAiICsgaWZhY2UgKyAiLCAiICsgbGluayk7CisgICAgICAgIGlmIChERUJVRykgTG9nLmQoVEFHLCAiaW50ZXJmYWNlTGlua1N0YXR1c0NoYW5nZWQgIiArIGlmYWNlICsgIiwgIiArIGxpbmspOwogICAgICAgICBib29sZWFuIGZvdW5kID0gZmFsc2U7CiAgICAgICAgIGJvb2xlYW4gdXNiID0gZmFsc2U7CiAgICAgICAgIGlmIChpc1dpZmkoaWZhY2UpKSB7CkBAIC0xODIsNiArMjE5LDggQEAKICAgICAgICAgfSBlbHNlIGlmIChpc1VzYihpZmFjZSkpIHsKICAgICAgICAgICAgIGZvdW5kID0gdHJ1ZTsKICAgICAgICAgICAgIHVzYiA9IHRydWU7CisgICAgICAgIH0gZWxzZSBpZiAoaXNCbHVldG9vdGgoaWZhY2UpKSB7CisgICAgICAgICAgICBmb3VuZCA9IHRydWU7CiAgICAgICAgIH0KICAgICAgICAgaWYgKGZvdW5kID09IGZhbHNlKSByZXR1cm47CiAKQEAgLTIxNiw2ICsyNTUsMTIgQEAKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIAorICAgIHB1YmxpYyBib29sZWFuIGlzQmx1ZXRvb3RoKFN0cmluZyBpZmFjZSkgeworICAgICAgICBmb3IgKFN0cmluZyByZWdleCA6IG1UZXRoZXJhYmxlQmx1ZXRvb3RoUmVnZXhzKSB7CisgICAgICAgICAgICBpZiAoaWZhY2UubWF0Y2hlcyhyZWdleCkpIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CiAgICAgcHVibGljIHZvaWQgaW50ZXJmYWNlQWRkZWQoU3RyaW5nIGlmYWNlKSB7CiAgICAgICAgIElCaW5kZXIgYiA9IFNlcnZpY2VNYW5hZ2VyLmdldFNlcnZpY2UoQ29udGV4dC5ORVRXT1JLTUFOQUdFTUVOVF9TRVJWSUNFKTsKICAgICAgICAgSU5ldHdvcmtNYW5hZ2VtZW50U2VydmljZSBzZXJ2aWNlID0gSU5ldHdvcmtNYW5hZ2VtZW50U2VydmljZS5TdHViLmFzSW50ZXJmYWNlKGIpOwpAQCAtMjI4LDI5ICsyNzMsMzQgQEAKICAgICAgICAgICAgIGZvdW5kID0gdHJ1ZTsKICAgICAgICAgICAgIHVzYiA9IHRydWU7CiAgICAgICAgIH0KKyAgICAgICAgaWYgKGlzQmx1ZXRvb3RoKGlmYWNlKSkgeworICAgICAgICAgICAgZm91bmQgPSB0cnVlOworICAgICAgICB9CiAgICAgICAgIGlmIChmb3VuZCA9PSBmYWxzZSkgewotICAgICAgICAgICAgTG9nLmQoVEFHLCBpZmFjZSArICIgaXMgbm90IGEgdGV0aGVyYWJsZSBpZmFjZSwgaWdub3JpbmciKTsKKyAgICAgICAgICAgIGlmIChERUJVRykgTG9nLmQoVEFHLCBpZmFjZSArICIgaXMgbm90IGEgdGV0aGVyYWJsZSBpZmFjZSwgaWdub3JpbmciKTsKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQogCiAgICAgICAgIHN5bmNocm9uaXplZCAobUlmYWNlcykgewogICAgICAgICAgICAgVGV0aGVySW50ZXJmYWNlU00gc20gPSBtSWZhY2VzLmdldChpZmFjZSk7CiAgICAgICAgICAgICBpZiAoc20gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIExvZy5lKFRBRywgImFjdGl2ZSBpZmFjZSAoIiArIGlmYWNlICsgIikgcmVwb3J0ZWQgYXMgYWRkZWQsIGlnbm9yaW5nIik7CisgICAgICAgICAgICAgICAgaWYgKERFQlVHKSBMb2cuZChUQUcsICJhY3RpdmUgaWZhY2UgKCIgKyBpZmFjZSArICIpIHJlcG9ydGVkIGFzIGFkZGVkLCBpZ25vcmluZyIpOwogICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHNtID0gbmV3IFRldGhlckludGVyZmFjZVNNKGlmYWNlLCBtTG9vcGVyLCB1c2IpOwogICAgICAgICAgICAgbUlmYWNlcy5wdXQoaWZhY2UsIHNtKTsKICAgICAgICAgICAgIHNtLnN0YXJ0KCk7CiAgICAgICAgIH0KLSAgICAgICAgTG9nLmQoVEFHLCAiaW50ZXJmYWNlQWRkZWQgOiIgKyBpZmFjZSk7CisgICAgICAgIGlmIChERUJVRykgTG9nLmQoVEFHLCAiaW50ZXJmYWNlQWRkZWQgOiIgKyBpZmFjZSk7CiAgICAgfQogCiAgICAgcHVibGljIHZvaWQgaW50ZXJmYWNlUmVtb3ZlZChTdHJpbmcgaWZhY2UpIHsKICAgICAgICAgc3luY2hyb25pemVkIChtSWZhY2VzKSB7CiAgICAgICAgICAgICBUZXRoZXJJbnRlcmZhY2VTTSBzbSA9IG1JZmFjZXMuZ2V0KGlmYWNlKTsKICAgICAgICAgICAgIGlmIChzbSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAiYXR0ZW1wdGluZyB0byByZW1vdmUgdW5rbm93biBpZmFjZSAoIiArIGlmYWNlICsgIiksIGlnbm9yaW5nIik7CisgICAgICAgICAgICAgICAgaWYgKERFQlVHKSB7CisgICAgICAgICAgICAgICAgICAgIExvZy5lKFRBRywgImF0dGVtcHRpbmcgdG8gcmVtb3ZlIHVua25vd24gaWZhY2UgKCIgKyBpZmFjZSArICIpLCBpZ25vcmluZyIpOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBzbS5zZW5kTWVzc2FnZShUZXRoZXJJbnRlcmZhY2VTTS5DTURfSU5URVJGQUNFX0RPV04pOwpAQCAtMzIxLDEzICszNzEsMTQgQEAKIAogICAgICAgICBib29sZWFuIHdpZmlUZXRoZXJlZCA9IGZhbHNlOwogICAgICAgICBib29sZWFuIHVzYlRldGhlcmVkID0gZmFsc2U7CisgICAgICAgIGJvb2xlYW4gYmx1ZXRvb3RoVGV0aGVyZWQgPSBmYWxzZTsKIAogICAgICAgICBzeW5jaHJvbml6ZWQgKG1JZmFjZXMpIHsKICAgICAgICAgICAgIFNldCBpZmFjZXMgPSBtSWZhY2VzLmtleVNldCgpOwogICAgICAgICAgICAgZm9yIChPYmplY3QgaWZhY2UgOiBpZmFjZXMpIHsKICAgICAgICAgICAgICAgICBUZXRoZXJJbnRlcmZhY2VTTSBzbSA9IG1JZmFjZXMuZ2V0KGlmYWNlKTsKICAgICAgICAgICAgICAgICBpZiAoc20gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBpZihzbS5pc0Vycm9yZWQoKSkgeworICAgICAgICAgICAgICAgICAgICBpZiAoc20uaXNFcnJvcmVkKCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yZWRMaXN0LmFkZCgoU3RyaW5nKWlmYWNlKTsKICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzbS5pc0F2YWlsYWJsZSgpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBhdmFpbGFibGVMaXN0LmFkZCgoU3RyaW5nKWlmYWNlKTsKQEAgLTMzNiw2ICszODcsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzYlRldGhlcmVkID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoaXNXaWZpKChTdHJpbmcpaWZhY2UpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lmaVRldGhlcmVkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGlzQmx1ZXRvb3RoKChTdHJpbmcpaWZhY2UpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmx1ZXRvb3RoVGV0aGVyZWQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgYWN0aXZlTGlzdC5hZGQoKFN0cmluZylpZmFjZSk7CiAgICAgICAgICAgICAgICAgICAgIH0KQEAgLTM1MCwxNyArNDAzLDI1IEBACiAgICAgICAgIGJyb2FkY2FzdC5wdXRTdHJpbmdBcnJheUxpc3RFeHRyYShDb25uZWN0aXZpdHlNYW5hZ2VyLkVYVFJBX0VSUk9SRURfVEVUSEVSLAogICAgICAgICAgICAgICAgIGVycm9yZWRMaXN0KTsKICAgICAgICAgbUNvbnRleHQuc2VuZFN0aWNreUJyb2FkY2FzdChicm9hZGNhc3QpOwotICAgICAgICBMb2cuZChUQUcsICJzZW5kVGV0aGVyU3RhdGVDaGFuZ2VkQnJvYWRjYXN0ICIgKyBhdmFpbGFibGVMaXN0LnNpemUoKSArICIsICIgKwotICAgICAgICAgICAgICAgIGFjdGl2ZUxpc3Quc2l6ZSgpICsgIiwgIiArIGVycm9yZWRMaXN0LnNpemUoKSk7CisgICAgICAgIGlmIChERUJVRykgeworICAgICAgICAgICAgTG9nLmQoVEFHLCAic2VuZFRldGhlclN0YXRlQ2hhbmdlZEJyb2FkY2FzdCAiICsgYXZhaWxhYmxlTGlzdC5zaXplKCkgKyAiLCAiICsKKyAgICAgICAgICAgICAgICAgICAgYWN0aXZlTGlzdC5zaXplKCkgKyAiLCAiICsgZXJyb3JlZExpc3Quc2l6ZSgpKTsKKyAgICAgICAgfQogCiAgICAgICAgIGlmICh1c2JUZXRoZXJlZCkgewotICAgICAgICAgICAgaWYgKHdpZmlUZXRoZXJlZCkgeworICAgICAgICAgICAgaWYgKHdpZmlUZXRoZXJlZCB8fCBibHVldG9vdGhUZXRoZXJlZCkgewogICAgICAgICAgICAgICAgIHNob3dUZXRoZXJlZE5vdGlmaWNhdGlvbihjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmRyYXdhYmxlLnN0YXRfc3lzX3RldGhlcl9nZW5lcmFsKTsKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgc2hvd1RldGhlcmVkTm90aWZpY2F0aW9uKGNvbS5hbmRyb2lkLmludGVybmFsLlIuZHJhd2FibGUuc3RhdF9zeXNfdGV0aGVyX3VzYik7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSBpZiAod2lmaVRldGhlcmVkKSB7Ci0gICAgICAgICAgICBzaG93VGV0aGVyZWROb3RpZmljYXRpb24oY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5kcmF3YWJsZS5zdGF0X3N5c190ZXRoZXJfd2lmaSk7CisgICAgICAgICAgICBpZiAoYmx1ZXRvb3RoVGV0aGVyZWQpIHsKKyAgICAgICAgICAgICAgICBzaG93VGV0aGVyZWROb3RpZmljYXRpb24oY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5kcmF3YWJsZS5zdGF0X3N5c190ZXRoZXJfZ2VuZXJhbCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHNob3dUZXRoZXJlZE5vdGlmaWNhdGlvbihjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmRyYXdhYmxlLnN0YXRfc3lzX3RldGhlcl93aWZpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmIChibHVldG9vdGhUZXRoZXJlZCkgeworICAgICAgICAgICAgc2hvd1RldGhlcmVkTm90aWZpY2F0aW9uKGNvbS5hbmRyb2lkLmludGVybmFsLlIuZHJhd2FibGUuc3RhdF9zeXNfdGV0aGVyX2JsdWV0b290aCk7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBjbGVhclRldGhlcmVkTm90aWZpY2F0aW9uKCk7CiAgICAgICAgIH0KQEAgLTM5MSw3ICs0NTIsNyBAQAogICAgICAgICBDaGFyU2VxdWVuY2UgbWVzc2FnZSA9IHIuZ2V0VGV4dChjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0cmluZy4KICAgICAgICAgICAgICAgICB0ZXRoZXJlZF9ub3RpZmljYXRpb25fbWVzc2FnZSk7CiAKLSAgICAgICAgaWYobVRldGhlcmVkTm90aWZpY2F0aW9uID09IG51bGwpIHsKKyAgICAgICAgaWYgKG1UZXRoZXJlZE5vdGlmaWNhdGlvbiA9PSBudWxsKSB7CiAgICAgICAgICAgICBtVGV0aGVyZWROb3RpZmljYXRpb24gPSBuZXcgTm90aWZpY2F0aW9uKCk7CiAgICAgICAgICAgICBtVGV0aGVyZWROb3RpZmljYXRpb24ud2hlbiA9IDA7CiAgICAgICAgIH0KQEAgLTQyMSwxMiArNDgyLDI1IEBACiAgICAgICAgIH0KICAgICB9CiAKKyAgICBwcml2YXRlIEhhbmRsZXIgbVVzYkhhbmRsZXIgPSBuZXcgSGFuZGxlcigpIHsKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIGhhbmRsZU1lc3NhZ2UoTWVzc2FnZSBtc2cpIHsKKyAgICAgICAgICAgIG1Vc2JDb25uZWN0ZWQgPSAobXNnLmFyZzEgPT0gVVNCX0NPTk5FQ1RFRCk7CisgICAgICAgICAgICB1cGRhdGVVc2JTdGF0dXMoKTsKKyAgICAgICAgfQorICAgIH07CisKICAgICBwcml2YXRlIGNsYXNzIFN0YXRlUmVjZWl2ZXIgZXh0ZW5kcyBCcm9hZGNhc3RSZWNlaXZlciB7CiAgICAgICAgIHB1YmxpYyB2b2lkIG9uUmVjZWl2ZShDb250ZXh0IGNvbnRlbnQsIEludGVudCBpbnRlbnQpIHsKICAgICAgICAgICAgIFN0cmluZyBhY3Rpb24gPSBpbnRlbnQuZ2V0QWN0aW9uKCk7CiAgICAgICAgICAgICBpZiAoYWN0aW9uLmVxdWFscyhVc2IuQUNUSU9OX1VTQl9TVEFURSkpIHsKLSAgICAgICAgICAgICAgICBtVXNiQ29ubmVjdGVkID0gaW50ZW50LmdldEV4dHJhcygpLmdldEJvb2xlYW4oVXNiLlVTQl9DT05ORUNURUQpOwotICAgICAgICAgICAgICAgIHVwZGF0ZVVzYlN0YXR1cygpOworICAgICAgICAgICAgICAgIC8vIHByb2Nlc3MgY29ubmVjdCBldmVudHMgaW1tZWRpYXRlbHksIGJ1dCBkZWxheSBoYW5kbGluZyBkaXNjb25uZWN0cworICAgICAgICAgICAgICAgIC8vIHRvIGRlYm91bmNlIFVTQiBjb25maWd1cmF0aW9uIGNoYW5nZXMKKyAgICAgICAgICAgICAgICBib29sZWFuIGNvbm5lY3RlZCA9IGludGVudC5nZXRFeHRyYXMoKS5nZXRCb29sZWFuKFVzYi5VU0JfQ09OTkVDVEVEKTsKKyAgICAgICAgICAgICAgICBNZXNzYWdlIG1zZyA9IE1lc3NhZ2Uub2J0YWluKG1Vc2JIYW5kbGVyLCBVU0JfU1RBVEVfQ0hBTkdFLAorICAgICAgICAgICAgICAgICAgICAgICAgKGNvbm5lY3RlZCA/IFVTQl9DT05ORUNURUQgOiBVU0JfRElTQ09OTkVDVEVEKSwgMCk7CisgICAgICAgICAgICAgICAgbVVzYkhhbmRsZXIucmVtb3ZlTWVzc2FnZXMoVVNCX1NUQVRFX0NIQU5HRSk7CisgICAgICAgICAgICAgICAgbVVzYkhhbmRsZXIuc2VuZE1lc3NhZ2VEZWxheWVkKG1zZywgY29ubmVjdGVkID8gMCA6IFVTQl9ESVNDT05ORUNUX0RFTEFZKTsKICAgICAgICAgICAgIH0gZWxzZSBpZiAoYWN0aW9uLmVxdWFscyhJbnRlbnQuQUNUSU9OX01FRElBX1NIQVJFRCkpIHsKICAgICAgICAgICAgICAgICBtVXNiTWFzc1N0b3JhZ2VPZmYgPSBmYWxzZTsKICAgICAgICAgICAgICAgICB1cGRhdGVVc2JTdGF0dXMoKTsKQEAgLTQzNSw3ICs1MDksNyBAQAogICAgICAgICAgICAgICAgIG1Vc2JNYXNzU3RvcmFnZU9mZiA9IHRydWU7CiAgICAgICAgICAgICAgICAgdXBkYXRlVXNiU3RhdHVzKCk7CiAgICAgICAgICAgICB9IGVsc2UgaWYgKGFjdGlvbi5lcXVhbHMoQ29ubmVjdGl2aXR5TWFuYWdlci5DT05ORUNUSVZJVFlfQUNUSU9OKSkgewotICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIlRldGhlcmluZyBnb3QgQ09OTkVDVElWSVRZX0FDVElPTiIpOworICAgICAgICAgICAgICAgIGlmIChERUJVRykgTG9nLmQoVEFHLCAiVGV0aGVyaW5nIGdvdCBDT05ORUNUSVZJVFlfQUNUSU9OIik7CiAgICAgICAgICAgICAgICAgbVRldGhlck1hc3RlclNNLnNlbmRNZXNzYWdlKFRldGhlck1hc3RlclNNLkNNRF9VUFNUUkVBTV9DSEFOR0VEKTsKICAgICAgICAgICAgIH0gZWxzZSBpZiAoYWN0aW9uLmVxdWFscyhJbnRlbnQuQUNUSU9OX0JPT1RfQ09NUExFVEVEKSkgewogICAgICAgICAgICAgICAgIG1Cb290ZWQgPSB0cnVlOwpAQCAtNDY2LDkgKzU0MCw5IEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICAvLyB0b2dnbGVkIHdoZW4gd2UgZW50ZXIvbGVhdmUgdGhlIGZ1bGx5IHRlYXRoZXJlZCBzdGF0ZQorICAgIC8vIHRvZ2dsZWQgd2hlbiB3ZSBlbnRlci9sZWF2ZSB0aGUgZnVsbHkgdGV0aGVyZWQgc3RhdGUKICAgICBwcml2YXRlIGJvb2xlYW4gZW5hYmxlVXNiUm5kaXMoYm9vbGVhbiBlbmFibGVkKSB7Ci0gICAgICAgIExvZy5kKFRBRywgImVuYWJsZVVzYlJuZGlzKCIgKyBlbmFibGVkICsgIikiKTsKKyAgICAgICAgaWYgKERFQlVHKSBMb2cuZChUQUcsICJlbmFibGVVc2JSbmRpcygiICsgZW5hYmxlZCArICIpIik7CiAgICAgICAgIElCaW5kZXIgYiA9IFNlcnZpY2VNYW5hZ2VyLmdldFNlcnZpY2UoQ29udGV4dC5ORVRXT1JLTUFOQUdFTUVOVF9TRVJWSUNFKTsKICAgICAgICAgICAgICAgICBJTmV0d29ya01hbmFnZW1lbnRTZXJ2aWNlIHNlcnZpY2UgPSBJTmV0d29ya01hbmFnZW1lbnRTZXJ2aWNlLlN0dWIuYXNJbnRlcmZhY2UoYik7CiAKQEAgLTQ5Myw3ICs1NjcsNyBAQAogCiAgICAgLy8gY29uZmlndXJlZCB3aGVuIHdlIHN0YXJ0IHRldGhlcmluZyBhbmQgdW5jb25maWcnZCBvbiBlcnJvciBvciBjb25jbHVzaW9uCiAgICAgcHJpdmF0ZSBib29sZWFuIGNvbmZpZ3VyZVVzYklmYWNlKGJvb2xlYW4gZW5hYmxlZCkgewotICAgICAgICBMb2cuZChUQUcsICJjb25maWd1cmVVc2JJZmFjZSgiICsgZW5hYmxlZCArICIpIik7CisgICAgICAgIGlmIChERUJVRykgTG9nLmQoVEFHLCAiY29uZmlndXJlVXNiSWZhY2UoIiArIGVuYWJsZWQgKyAiKSIpOwogCiAgICAgICAgIElCaW5kZXIgYiA9IFNlcnZpY2VNYW5hZ2VyLmdldFNlcnZpY2UoQ29udGV4dC5ORVRXT1JLTUFOQUdFTUVOVF9TRVJWSUNFKTsKICAgICAgICAgSU5ldHdvcmtNYW5hZ2VtZW50U2VydmljZSBzZXJ2aWNlID0gSU5ldHdvcmtNYW5hZ2VtZW50U2VydmljZS5TdHViLmFzSW50ZXJmYWNlKGIpOwpAQCAtNTQ5LDYgKzYyMywxMCBAQAogICAgICAgICByZXR1cm4gbVRldGhlcmFibGVXaWZpUmVnZXhzOwogICAgIH0KIAorICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRUZXRoZXJhYmxlQmx1ZXRvb3RoUmVnZXhzKCkgeworICAgICAgICByZXR1cm4gbVRldGhlcmFibGVCbHVldG9vdGhSZWdleHM7CisgICAgfQorCiAgICAgcHVibGljIFN0cmluZ1tdIGdldFVwc3RyZWFtSWZhY2VSZWdleHMoKSB7CiAgICAgICAgIHJldHVybiBtVXBzdHJlYW1JZmFjZVJlZ2V4czsKICAgICB9CkBAIC03NDAsNyArODE4LDcgQEAKIAogICAgICAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBwcm9jZXNzTWVzc2FnZShNZXNzYWdlIG1lc3NhZ2UpIHsKLSAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJJbml0aWFsU3RhdGUucHJvY2Vzc01lc3NhZ2Ugd2hhdD0iICsgbWVzc2FnZS53aGF0KTsKKyAgICAgICAgICAgICAgICBpZiAoREVCVUcpIExvZy5kKFRBRywgIkluaXRpYWxTdGF0ZS5wcm9jZXNzTWVzc2FnZSB3aGF0PSIgKyBtZXNzYWdlLndoYXQpOwogICAgICAgICAgICAgICAgIGJvb2xlYW4gcmV0VmFsdWUgPSB0cnVlOwogICAgICAgICAgICAgICAgIHN3aXRjaCAobWVzc2FnZS53aGF0KSB7CiAgICAgICAgICAgICAgICAgICAgIGNhc2UgQ01EX1RFVEhFUl9SRVFVRVNURUQ6CkBAIC03ODEsNyArODU5LDcgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIEBPdmVycmlkZQogICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gcHJvY2Vzc01lc3NhZ2UoTWVzc2FnZSBtZXNzYWdlKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiU3RhcnRpbmdTdGF0ZS5wcm9jZXNzTWVzc2FnZSB3aGF0PSIgKyBtZXNzYWdlLndoYXQpOworICAgICAgICAgICAgICAgIGlmIChERUJVRykgTG9nLmQoVEFHLCAiU3RhcnRpbmdTdGF0ZS5wcm9jZXNzTWVzc2FnZSB3aGF0PSIgKyBtZXNzYWdlLndoYXQpOwogICAgICAgICAgICAgICAgIGJvb2xlYW4gcmV0VmFsdWUgPSB0cnVlOwogICAgICAgICAgICAgICAgIHN3aXRjaCAobWVzc2FnZS53aGF0KSB7CiAgICAgICAgICAgICAgICAgICAgIC8vIG1heWJlIGEgcGFyZW50IGNsYXNzPwpAQCAtODMzLDcgKzkxMSw3IEBACiAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgaWYgKG1Vc2IpIFRldGhlcmluZy50aGlzLmVuYWJsZVVzYlJuZGlzKHRydWUpOwotICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIlRldGhlcmVkICIgKyBtSWZhY2VOYW1lKTsKKyAgICAgICAgICAgICAgICBpZiAoREVCVUcpIExvZy5kKFRBRywgIlRldGhlcmVkICIgKyBtSWZhY2VOYW1lKTsKICAgICAgICAgICAgICAgICBzZXRBdmFpbGFibGUoZmFsc2UpOwogICAgICAgICAgICAgICAgIHNldFRldGhlcmVkKHRydWUpOwogICAgICAgICAgICAgICAgIHNlbmRUZXRoZXJTdGF0ZUNoYW5nZWRCcm9hZGNhc3QoKTsKQEAgLTg0NCw3ICs5MjIsNyBAQAogICAgICAgICAgICAgfQogICAgICAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBwcm9jZXNzTWVzc2FnZShNZXNzYWdlIG1lc3NhZ2UpIHsKLSAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJUZXRoZXJlZFN0YXRlLnByb2Nlc3NNZXNzYWdlIHdoYXQ9IiArIG1lc3NhZ2Uud2hhdCk7CisgICAgICAgICAgICAgICAgaWYgKERFQlVHKSBMb2cuZChUQUcsICJUZXRoZXJlZFN0YXRlLnByb2Nlc3NNZXNzYWdlIHdoYXQ9IiArIG1lc3NhZ2Uud2hhdCk7CiAgICAgICAgICAgICAgICAgYm9vbGVhbiByZXRWYWx1ZSA9IHRydWU7CiAgICAgICAgICAgICAgICAgYm9vbGVhbiBlcnJvciA9IGZhbHNlOwogICAgICAgICAgICAgICAgIHN3aXRjaCAobWVzc2FnZS53aGF0KSB7CkBAIC04ODcsNyArOTY1LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobWVzc2FnZS53aGF0ID09IENNRF9JTlRFUkZBQ0VfRE9XTikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zaXRpb25UbyhtVW5hdmFpbGFibGVTdGF0ZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJVbnRldGhlcmVkICIgKyBtSWZhY2VOYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChERUJVRykgTG9nLmQoVEFHLCAiVW50ZXRoZXJlZCAiICsgbUlmYWNlTmFtZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgY2FzZSBDTURfVEVUSEVSX0NPTk5FQ1RJT05fQ0hBTkdFRDoKICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBuZXdVcHN0cmVhbUlmYWNlTmFtZSA9IChTdHJpbmcpKG1lc3NhZ2Uub2JqKTsKQEAgLTk2MCw3ICsxMDM4LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbm5lY3Rpdml0eU1hbmFnZXIuVEVUSEVSX0VSUk9SX01BU1RFUl9FUlJPUik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJUZXRoZXIgbG9zdCB1cHN0cmVhbSBjb25uZWN0aW9uICIgKyBtSWZhY2VOYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChERUJVRykgTG9nLmQoVEFHLCAiVGV0aGVyIGxvc3QgdXBzdHJlYW0gY29ubmVjdGlvbiAiICsgbUlmYWNlTmFtZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICBzZW5kVGV0aGVyU3RhdGVDaGFuZ2VkQnJvYWRjYXN0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobVVzYikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghVGV0aGVyaW5nLnRoaXMuY29uZmlndXJlVXNiSWZhY2UoZmFsc2UpKSB7CkBAIC0xMTk4LDggKzEyNzYsMTAgQEAKICAgICAgICAgICAgICAgICBJQmluZGVyIGIgPSBTZXJ2aWNlTWFuYWdlci5nZXRTZXJ2aWNlKENvbnRleHQuQ09OTkVDVElWSVRZX1NFUlZJQ0UpOwogICAgICAgICAgICAgICAgIElDb25uZWN0aXZpdHlNYW5hZ2VyIGNtID0gSUNvbm5lY3Rpdml0eU1hbmFnZXIuU3R1Yi5hc0ludGVyZmFjZShiKTsKICAgICAgICAgICAgICAgICBtQ29ubmVjdGlvblJlcXVlc3RlZCA9IGZhbHNlOwotICAgICAgICAgICAgICAgIExvZy5kKFRBRywgImNob29zZVVwc3RyZWFtVHlwZSgiICsgdHJ5Q2VsbCArICIpLCAgZHVuUmVxdWlyZWQgPSIKLSAgICAgICAgICAgICAgICAgICAgICAgICsgbUR1blJlcXVpcmVkICsgIiwgaWZhY2U9IiArIGlmYWNlKTsKKyAgICAgICAgICAgICAgICBpZiAoREVCVUcpIHsKKyAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiY2hvb3NlVXBzdHJlYW1UeXBlKCIgKyB0cnlDZWxsICsgIiksICBkdW5SZXF1aXJlZCA9IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgbUR1blJlcXVpcmVkICsgIiwgaWZhY2U9IiArIGlmYWNlKTsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgaWYgKGlmYWNlICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtRHVuUmVxdWlyZWQpIHsKQEAgLTEyMDcsNyArMTI4Nyw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTmV0d29ya0luZm8gaW5mbyA9IGNtLmdldE5ldHdvcmtJbmZvKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29ubmVjdGl2aXR5TWFuYWdlci5UWVBFX01PQklMRV9EVU4pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbmZvLmlzQ29ubmVjdGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAic2V0dGluZyBkdW4gaWZhY2VuYW1lID0iICsgaWZhY2UpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoREVCVUcpIExvZy5kKFRBRywgInNldHRpbmcgZHVuIGlmYWNlbmFtZSA9IiArIGlmYWNlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZXZlbiBpZiB3ZSdyZSBhbHJlYWR5IGNvbm5lY3RlZCAtIGl0IG1heSBiZSBzb21lYm9keSBlbHNlJ3MKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVmY291bnQsIHNvIGFkZCBvdXIgb3duCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR1cm5Pbk1vYmlsZUNvbm5lY3Rpb24oKTsKQEAgLTEyMTksMTEgKzEyOTksMTEgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiY2hlY2tpbmcgaWYgaGlwcmkgYnJvdWdodCB1cyB0aGlzIGNvbm5lY3Rpb24iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoREVCVUcpIExvZy5kKFRBRywgImNoZWNraW5nIGlmIGhpcHJpIGJyb3VnaHQgdXMgdGhpcyBjb25uZWN0aW9uIik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTmV0d29ya0luZm8gaW5mbyA9IGNtLmdldE5ldHdvcmtJbmZvKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29ubmVjdGl2aXR5TWFuYWdlci5UWVBFX01PQklMRV9ISVBSSSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGluZm8uaXNDb25uZWN0ZWQoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJ5ZXMgLSBoaXByaSBpbiB1c2UiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKERFQlVHKSBMb2cuZChUQUcsICJ5ZXMgLSBoaXByaSBpbiB1c2UiKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZXZlbiBpZiB3ZSdyZSBhbHJlYWR5IGNvbm5lY3RlZCAtIGl0IG1heSBiZSBzb21ib2R5IGVsc2UncwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZWZjb3VudCwgc28gYWRkIG91ciBvd24KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHVybk9uTW9iaWxlQ29ubmVjdGlvbigpOwpAQCAtMTI0NSw3ICsxMzI1LDcgQEAKICAgICAgICAgICAgICAgICBub3RpZnlUZXRoZXJlZE9mTmV3VXBzdHJlYW1JZmFjZShpZmFjZSk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBwcm90ZWN0ZWQgdm9pZCBub3RpZnlUZXRoZXJlZE9mTmV3VXBzdHJlYW1JZmFjZShTdHJpbmcgaWZhY2VOYW1lKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAibm90aWZ5aW5nIHRldGhlcmVkIHdpdGggaWZhY2UgPSIgKyBpZmFjZU5hbWUpOworICAgICAgICAgICAgICAgIGlmIChERUJVRykgTG9nLmQoVEFHLCAibm90aWZ5aW5nIHRldGhlcmVkIHdpdGggaWZhY2UgPSIgKyBpZmFjZU5hbWUpOwogICAgICAgICAgICAgICAgIG1VcHN0cmVhbUlmYWNlTmFtZSA9IGlmYWNlTmFtZTsKICAgICAgICAgICAgICAgICBmb3IgKE9iamVjdCBvIDogbU5vdGlmeUxpc3QpIHsKICAgICAgICAgICAgICAgICAgICAgVGV0aGVySW50ZXJmYWNlU00gc20gPSAoVGV0aGVySW50ZXJmYWNlU00pbzsKQEAgLTEyNjIsMTkgKzEzNDIsMTkgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIEBPdmVycmlkZQogICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gcHJvY2Vzc01lc3NhZ2UoTWVzc2FnZSBtZXNzYWdlKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiTWFzdGVySW5pdGlhbFN0YXRlLnByb2Nlc3NNZXNzYWdlIHdoYXQ9IiArIG1lc3NhZ2Uud2hhdCk7CisgICAgICAgICAgICAgICAgaWYgKERFQlVHKSBMb2cuZChUQUcsICJNYXN0ZXJJbml0aWFsU3RhdGUucHJvY2Vzc01lc3NhZ2Ugd2hhdD0iICsgbWVzc2FnZS53aGF0KTsKICAgICAgICAgICAgICAgICBib29sZWFuIHJldFZhbHVlID0gdHJ1ZTsKICAgICAgICAgICAgICAgICBzd2l0Y2ggKG1lc3NhZ2Uud2hhdCkgewogICAgICAgICAgICAgICAgICAgICBjYXNlIENNRF9URVRIRVJfTU9ERV9SRVFVRVNURUQ6CiAgICAgICAgICAgICAgICAgICAgICAgICBtRHVuUmVxdWlyZWQgPSBpc0R1blJlcXVpcmVkKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBUZXRoZXJJbnRlcmZhY2VTTSB3aG8gPSAoVGV0aGVySW50ZXJmYWNlU00pbWVzc2FnZS5vYmo7Ci0gICAgICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJUZXRoZXIgTW9kZSByZXF1ZXN0ZWQgYnkgIiArIHdoby50b1N0cmluZygpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChERUJVRykgTG9nLmQoVEFHLCAiVGV0aGVyIE1vZGUgcmVxdWVzdGVkIGJ5ICIgKyB3aG8udG9TdHJpbmcoKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICBtTm90aWZ5TGlzdC5hZGQod2hvKTsKICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zaXRpb25UbyhtVGV0aGVyTW9kZUFsaXZlU3RhdGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgIGNhc2UgQ01EX1RFVEhFUl9NT0RFX1VOUkVRVUVTVEVEOgogICAgICAgICAgICAgICAgICAgICAgICAgd2hvID0gKFRldGhlckludGVyZmFjZVNNKW1lc3NhZ2Uub2JqOwotICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiVGV0aGVyIE1vZGUgdW5yZXF1ZXN0ZWQgYnkgIiArIHdoby50b1N0cmluZygpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChERUJVRykgTG9nLmQoVEFHLCAiVGV0aGVyIE1vZGUgdW5yZXF1ZXN0ZWQgYnkgIiArIHdoby50b1N0cmluZygpKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleCA9IG1Ob3RpZnlMaXN0LmluZGV4T2Yod2hvKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbmRleCAhPSAtMSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Ob3RpZnlMaXN0LnJlbW92ZSh3aG8pOwpAQCAtMTMwNCw3ICsxMzg0LDcgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIEBPdmVycmlkZQogICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gcHJvY2Vzc01lc3NhZ2UoTWVzc2FnZSBtZXNzYWdlKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiVGV0aGVyTW9kZUFsaXZlU3RhdGUucHJvY2Vzc01lc3NhZ2Ugd2hhdD0iICsgbWVzc2FnZS53aGF0KTsKKyAgICAgICAgICAgICAgICBpZiAoREVCVUcpIExvZy5kKFRBRywgIlRldGhlck1vZGVBbGl2ZVN0YXRlLnByb2Nlc3NNZXNzYWdlIHdoYXQ9IiArIG1lc3NhZ2Uud2hhdCk7CiAgICAgICAgICAgICAgICAgYm9vbGVhbiByZXRWYWx1ZSA9IHRydWU7CiAgICAgICAgICAgICAgICAgc3dpdGNoIChtZXNzYWdlLndoYXQpIHsKICAgICAgICAgICAgICAgICAgICAgY2FzZSBDTURfVEVUSEVSX01PREVfUkVRVUVTVEVEOgpAQCAtMTMzMiw4ICsxNDEyLDEwIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBtYWtlIHN1cmUgd2UncmUgc3RpbGwgdXNpbmcgYSByZXF1ZXN0ZWQgY29ubmVjdGlvbiAtIG1heSBoYXZlIGZvdW5kCiAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3aWZpIG9yIHNvbWV0aGluZyBzaW5jZSB0aGVuLgogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1Db25uZWN0aW9uUmVxdWVzdGVkKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAicmVuZXdpbmcgbW9iaWxlIGNvbm5lY3Rpb24gLSByZXF1ZXVpbmcgZm9yIGFub3RoZXIgIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRUxMX0NPTk5FQ1RJT05fUkVORVdfTVMgKyAibXMiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoREVCVUcpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAicmVuZXdpbmcgbW9iaWxlIGNvbm5lY3Rpb24gLSByZXF1ZXVpbmcgZm9yIGFub3RoZXIgIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0VMTF9DT05ORUNUSU9OX1JFTkVXX01TICsgIm1zIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR1cm5Pbk1vYmlsZUNvbm5lY3Rpb24oKTsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvbG9jYXRpb24vQ29tcHJlaGVuc2l2ZUNvdW50cnlEZXRlY3Rvci5qYXZhIGIvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvbG9jYXRpb24vQ29tcHJlaGVuc2l2ZUNvdW50cnlEZXRlY3Rvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmU2OTJmOGQKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9sb2NhdGlvbi9Db21wcmVoZW5zaXZlQ291bnRyeURldGVjdG9yLmphdmEKQEAgLTAsMCArMSwzNTkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZQorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQuc2VydmVyLmxvY2F0aW9uOworCitpbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKK2ltcG9ydCBqYXZhLnV0aWwuVGltZXI7CitpbXBvcnQgamF2YS51dGlsLlRpbWVyVGFzazsKKworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQubG9jYXRpb24uQ291bnRyeTsKK2ltcG9ydCBhbmRyb2lkLmxvY2F0aW9uLkNvdW50cnlMaXN0ZW5lcjsKK2ltcG9ydCBhbmRyb2lkLmxvY2F0aW9uLkdlb2NvZGVyOworaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuU2V0dGluZ3M7CitpbXBvcnQgYW5kcm9pZC50ZWxlcGhvbnkuUGhvbmVTdGF0ZUxpc3RlbmVyOworaW1wb3J0IGFuZHJvaWQudGVsZXBob255LlNlcnZpY2VTdGF0ZTsKK2ltcG9ydCBhbmRyb2lkLnRlbGVwaG9ueS5UZWxlcGhvbnlNYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQudGV4dC5UZXh0VXRpbHM7CitpbXBvcnQgYW5kcm9pZC51dGlsLlNsb2c7CisKKy8qKgorICogVGhpcyBjbGFzcyBpcyB1c2VkIHRvIGRldGVjdCB0aGUgY291bnRyeSB3aGVyZSB0aGUgdXNlciBpcy4gVGhlIHNvdXJjZXMgb2YKKyAqIGNvdW50cnkgYXJlIHF1ZXJpZWQgaW4gb3JkZXIgb2YgcmVsaWFiaWxpdHksIGxpa2UKKyAqIDx1bD4KKyAqIDxsaT5Nb2JpbGUgbmV0d29yazwvbGk+CisgKiA8bGk+TG9jYXRpb248L2xpPgorICogPGxpPlNJTSdzIGNvdW50cnk8L2xpPgorICogPGxpPlBob25lJ3MgbG9jYWxlPC9saT4KKyAqIDwvdWw+CisgKiA8cD4KKyAqIENhbGwgdGhlIHtAbGluayAjZGV0ZWN0Q291bnRyeSgpfSB0byBnZXQgdGhlIGF2YWlsYWJsZSBjb3VudHJ5IGltbWVkaWF0ZWx5LgorICogPHA+CisgKiBUbyBiZSBub3RpZmllZCBvZiB0aGUgZnV0dXJlIGNvdW50cnkgY2hhbmdlLCB1c2luZyB0aGUKKyAqIHtAbGluayAjc2V0Q291bnRyeUxpc3RlbmVyKENvdW50cnlMaXN0ZW5lcil9CisgKiA8cD4KKyAqIFVzaW5nIHRoZSB7QGxpbmsgI3N0b3AoKX0gdG8gc3RvcCBsaXN0ZW5pbmcgdG8gdGhlIGNvdW50cnkgY2hhbmdlLgorICogPHA+CisgKiBUaGUgY291bnRyeSBpbmZvcm1hdGlvbiB3aWxsIGJlIHJlZnJlc2hlZCBldmVyeQorICoge0BsaW5rICNMT0NBVElPTl9SRUZSRVNIX0lOVEVSVkFMfSBvbmNlIHRoZSBsb2NhdGlvbiBiYXNlZCBjb3VudHJ5IGlzIHVzZWQuCisgKgorICogQGhpZGUKKyAqLworcHVibGljIGNsYXNzIENvbXByZWhlbnNpdmVDb3VudHJ5RGV0ZWN0b3IgZXh0ZW5kcyBDb3VudHJ5RGV0ZWN0b3JCYXNlIHsKKworICAgIHByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBUQUcgPSAiQ29tcHJlaGVuc2l2ZUNvdW50cnlEZXRlY3RvciI7CisKKyAgICAvKioKKyAgICAgKiBUaGUgcmVmcmVzaCBpbnRlcnZhbCB3aGVuIHRoZSBsb2NhdGlvbiBiYXNlZCBjb3VudHJ5IHdhcyB1c2VkCisgICAgICovCisgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgbG9uZyBMT0NBVElPTl9SRUZSRVNIX0lOVEVSVkFMID0gMTAwMCAqIDYwICogNjAgKiAyNDsgLy8gMSBkYXkKKworICAgIHByb3RlY3RlZCBDb3VudHJ5RGV0ZWN0b3JCYXNlIG1Mb2NhdGlvbkJhc2VkQ291bnRyeURldGVjdG9yOworICAgIHByb3RlY3RlZCBUaW1lciBtTG9jYXRpb25SZWZyZXNoVGltZXI7CisKKyAgICBwcml2YXRlIGZpbmFsIGludCBtUGhvbmVUeXBlOworICAgIHByaXZhdGUgQ291bnRyeSBtQ291bnRyeTsKKyAgICBwcml2YXRlIFRlbGVwaG9ueU1hbmFnZXIgbVRlbGVwaG9ueU1hbmFnZXI7CisgICAgcHJpdmF0ZSBDb3VudHJ5IG1Db3VudHJ5RnJvbUxvY2F0aW9uOworICAgIHByaXZhdGUgYm9vbGVhbiBtU3RvcHBlZCA9IGZhbHNlOworICAgIHByaXZhdGUgU2VydmljZVN0YXRlIG1MYXN0U3RhdGU7CisKKyAgICBwcml2YXRlIFBob25lU3RhdGVMaXN0ZW5lciBtUGhvbmVTdGF0ZUxpc3RlbmVyID0gbmV3IFBob25lU3RhdGVMaXN0ZW5lcigpIHsKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIG9uU2VydmljZVN0YXRlQ2hhbmdlZChTZXJ2aWNlU3RhdGUgc2VydmljZVN0YXRlKSB7CisgICAgICAgICAgICAvLyBUT0RPOiBGaW5kIG91dCBob3cgb2Z0ZW4gd2Ugd2lsbCBiZSBub3RpZmllZCwgaWYgdGhpcyBtZXRob2QgaXMgY2FsbGVkIHRvbworICAgICAgICAgICAgLy8gbWFueSB0aW1lcywgbGV0J3MgY29uc2lkZXIgcXVlcnlpbmcgdGhlIG5ldHdvcmsuCisgICAgICAgICAgICBTbG9nLmQoVEFHLCAib25TZXJ2aWNlU3RhdGVDaGFuZ2VkIik7CisgICAgICAgICAgICAvLyBXZSBvbmx5IGNhcmUgdGhlIHN0YXRlIGNoYW5nZQorICAgICAgICAgICAgaWYgKG1MYXN0U3RhdGUgPT0gbnVsbCB8fCBtTGFzdFN0YXRlLmdldFN0YXRlKCkgIT0gc2VydmljZVN0YXRlLmdldFN0YXRlKCkpIHsKKyAgICAgICAgICAgICAgICBkZXRlY3RDb3VudHJ5KHRydWUsIHRydWUpOworICAgICAgICAgICAgICAgIG1MYXN0U3RhdGUgPSBuZXcgU2VydmljZVN0YXRlKHNlcnZpY2VTdGF0ZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9OworCisgICAgLyoqCisgICAgICogVGhlIGxpc3RlbmVyIGZvciByZWNlaXZpbmcgdGhlIG5vdGlmaWNhdGlvbiBmcm9tIExvY2F0aW9uQmFzZWRDb3VudHJ5RGV0ZWN0b3IuCisgICAgICovCisgICAgcHJpdmF0ZSBDb3VudHJ5TGlzdGVuZXIgbUxvY2F0aW9uQmFzZWRDb3VudHJ5RGV0ZWN0aW9uTGlzdGVuZXIgPSBuZXcgQ291bnRyeUxpc3RlbmVyKCkgeworICAgICAgICBwdWJsaWMgdm9pZCBvbkNvdW50cnlEZXRlY3RlZChDb3VudHJ5IGNvdW50cnkpIHsKKyAgICAgICAgICAgIG1Db3VudHJ5RnJvbUxvY2F0aW9uID0gY291bnRyeTsKKyAgICAgICAgICAgIC8vIERvbid0IHN0YXJ0IHRoZSBMb2NhdGlvbkJhc2VkQ291bnRyeURldGVjdG9yLgorICAgICAgICAgICAgZGV0ZWN0Q291bnRyeSh0cnVlLCBmYWxzZSk7CisgICAgICAgICAgICBzdG9wTG9jYXRpb25CYXNlZERldGVjdG9yKCk7CisgICAgICAgIH0KKyAgICB9OworCisgICAgcHVibGljIENvbXByZWhlbnNpdmVDb3VudHJ5RGV0ZWN0b3IoQ29udGV4dCBjb250ZXh0KSB7CisgICAgICAgIHN1cGVyKGNvbnRleHQpOworICAgICAgICBtVGVsZXBob255TWFuYWdlciA9IChUZWxlcGhvbnlNYW5hZ2VyKSBjb250ZXh0LmdldFN5c3RlbVNlcnZpY2UoQ29udGV4dC5URUxFUEhPTllfU0VSVklDRSk7CisgICAgICAgIG1QaG9uZVR5cGUgPSBtVGVsZXBob255TWFuYWdlci5nZXRQaG9uZVR5cGUoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgQ291bnRyeSBkZXRlY3RDb3VudHJ5KCkgeworICAgICAgICAvLyBEb24ndCBzdGFydCB0aGUgTG9jYXRpb25CYXNlZENvdW50cnlEZXRlY3RvciBpZiB3ZSBoYXZlIGJlZW4gc3RvcHBlZC4KKyAgICAgICAgcmV0dXJuIGRldGVjdENvdW50cnkoZmFsc2UsICFtU3RvcHBlZCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgc3RvcCgpIHsKKyAgICAgICAgU2xvZy5pKFRBRywgIlN0b3AgdGhlIGRldGVjdG9yLiIpOworICAgICAgICBjYW5jZWxMb2NhdGlvblJlZnJlc2goKTsKKyAgICAgICAgcmVtb3ZlUGhvbmVTdGF0ZUxpc3RlbmVyKCk7CisgICAgICAgIHN0b3BMb2NhdGlvbkJhc2VkRGV0ZWN0b3IoKTsKKyAgICAgICAgbUxpc3RlbmVyID0gbnVsbDsKKyAgICAgICAgbVN0b3BwZWQgPSB0cnVlOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB0aGUgY291bnRyeSBmcm9tIGRpZmZlcmVudCBzb3VyY2VzIGluIG9yZGVyIG9mIHRoZSByZWxpYWJpbGl0eS4KKyAgICAgKi8KKyAgICBwcml2YXRlIENvdW50cnkgZ2V0Q291bnRyeSgpIHsKKyAgICAgICAgQ291bnRyeSByZXN1bHQgPSBudWxsOworICAgICAgICByZXN1bHQgPSBnZXROZXR3b3JrQmFzZWRDb3VudHJ5KCk7CisgICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkgeworICAgICAgICAgICAgcmVzdWx0ID0gZ2V0TGFzdEtub3duTG9jYXRpb25CYXNlZENvdW50cnkoKTsKKyAgICAgICAgfQorICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpIHsKKyAgICAgICAgICAgIHJlc3VsdCA9IGdldFNpbUJhc2VkQ291bnRyeSgpOworICAgICAgICB9CisgICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkgeworICAgICAgICAgICAgcmVzdWx0ID0gZ2V0TG9jYWxlQ291bnRyeSgpOworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHJldHVybiB0aGUgY291bnRyeSBmcm9tIHRoZSBtb2JpbGUgbmV0d29yay4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgQ291bnRyeSBnZXROZXR3b3JrQmFzZWRDb3VudHJ5KCkgeworICAgICAgICBTdHJpbmcgY291bnRyeUlzbyA9IG51bGw7CisgICAgICAgIC8vIFRPRE86IFRoZSBkb2N1bWVudCBzYXlzIHRoZSByZXN1bHQgbWF5IGJlIHVucmVsaWFibGUgb24gQ0RNQSBuZXR3b3Jrcy4gU2hhbGwgd2UgdXNlCisgICAgICAgIC8vIGl0IG9uIENETUEgcGhvbmU/IFdlIG1heSB0ZXN0IHRoZSBBbmRyb2lkIHByaW1hcmlseSB1c2VkIGNvdW50cmllcy4KKyAgICAgICAgaWYgKG1QaG9uZVR5cGUgPT0gVGVsZXBob255TWFuYWdlci5QSE9ORV9UWVBFX0dTTSkgeworICAgICAgICAgICAgY291bnRyeUlzbyA9IG1UZWxlcGhvbnlNYW5hZ2VyLmdldE5ldHdvcmtDb3VudHJ5SXNvKCk7CisgICAgICAgICAgICBpZiAoIVRleHRVdGlscy5pc0VtcHR5KGNvdW50cnlJc28pKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBDb3VudHJ5KGNvdW50cnlJc28sIENvdW50cnkuQ09VTlRSWV9TT1VSQ0VfTkVUV09SSyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHJldHVybiB0aGUgY2FjaGVkIGxvY2F0aW9uIGJhc2VkIGNvdW50cnkuCisgICAgICovCisgICAgcHJvdGVjdGVkIENvdW50cnkgZ2V0TGFzdEtub3duTG9jYXRpb25CYXNlZENvdW50cnkoKSB7CisgICAgICAgIHJldHVybiBtQ291bnRyeUZyb21Mb2NhdGlvbjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIHRoZSBjb3VudHJ5IGZyb20gU0lNIGNhcmQKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgQ291bnRyeSBnZXRTaW1CYXNlZENvdW50cnkoKSB7CisgICAgICAgIFN0cmluZyBjb3VudHJ5SXNvID0gbnVsbDsKKyAgICAgICAgY291bnRyeUlzbyA9IG1UZWxlcGhvbnlNYW5hZ2VyLmdldFNpbUNvdW50cnlJc28oKTsKKyAgICAgICAgaWYgKCFUZXh0VXRpbHMuaXNFbXB0eShjb3VudHJ5SXNvKSkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBDb3VudHJ5KGNvdW50cnlJc28sIENvdW50cnkuQ09VTlRSWV9TT1VSQ0VfU0lNKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIHRoZSBjb3VudHJ5IGZyb20gdGhlIHN5c3RlbSdzIGxvY2FsZS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgQ291bnRyeSBnZXRMb2NhbGVDb3VudHJ5KCkgeworICAgICAgICBMb2NhbGUgZGVmYXVsdExvY2FsZSA9IExvY2FsZS5nZXREZWZhdWx0KCk7CisgICAgICAgIGlmIChkZWZhdWx0TG9jYWxlICE9IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgQ291bnRyeShkZWZhdWx0TG9jYWxlLmdldENvdW50cnkoKSwgQ291bnRyeS5DT1VOVFJZX1NPVVJDRV9MT0NBTEUpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcGFyYW0gbm90aWZ5Q2hhbmdlIGluZGljYXRlcyB3aGV0aGVyIHRoZSBsaXN0ZW5lciBzaG91bGQgYmUgbm90aWZpZWQgdGhlIGNoYW5nZSBvZiB0aGUKKyAgICAgKiBjb3VudHJ5CisgICAgICogQHBhcmFtIHN0YXJ0TG9jYXRpb25CYXNlZERldGVjdGlvbiBpbmRpY2F0ZXMgd2hldGhlciB0aGUgTG9jYXRpb25CYXNlZENvdW50cnlEZXRlY3RvciBjb3VsZAorICAgICAqIGJlIHN0YXJ0ZWQgaWYgdGhlIGN1cnJlbnQgY291bnRyeSBzb3VyY2UgaXMgbGVzcyByZWxpYWJsZSB0aGFuIHRoZSBsb2NhdGlvbi4KKyAgICAgKiBAcmV0dXJuIHRoZSBjdXJyZW50IGF2YWlsYWJsZSBVc2VyQ291bnRyeQorICAgICAqLworICAgIHByaXZhdGUgQ291bnRyeSBkZXRlY3RDb3VudHJ5KGJvb2xlYW4gbm90aWZ5Q2hhbmdlLCBib29sZWFuIHN0YXJ0TG9jYXRpb25CYXNlZERldGVjdGlvbikgeworICAgICAgICBDb3VudHJ5IGNvdW50cnkgPSBnZXRDb3VudHJ5KCk7CisgICAgICAgIHJ1bkFmdGVyRGV0ZWN0aW9uQXN5bmMobUNvdW50cnkgIT0gbnVsbCA/IG5ldyBDb3VudHJ5KG1Db3VudHJ5KSA6IG1Db3VudHJ5LCBjb3VudHJ5LAorICAgICAgICAgICAgICAgIG5vdGlmeUNoYW5nZSwgc3RhcnRMb2NhdGlvbkJhc2VkRGV0ZWN0aW9uKTsKKyAgICAgICAgbUNvdW50cnkgPSBjb3VudHJ5OworICAgICAgICByZXR1cm4gbUNvdW50cnk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUnVuIHRoZSB0YXNrcyBpbiB0aGUgc2VydmljZSdzIHRocmVhZC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBydW5BZnRlckRldGVjdGlvbkFzeW5jKGZpbmFsIENvdW50cnkgY291bnRyeSwgZmluYWwgQ291bnRyeSBkZXRlY3RlZENvdW50cnksCisgICAgICAgICAgICBmaW5hbCBib29sZWFuIG5vdGlmeUNoYW5nZSwgZmluYWwgYm9vbGVhbiBzdGFydExvY2F0aW9uQmFzZWREZXRlY3Rpb24pIHsKKyAgICAgICAgbUhhbmRsZXIucG9zdChuZXcgUnVubmFibGUoKSB7CisgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgcnVuQWZ0ZXJEZXRlY3Rpb24oCisgICAgICAgICAgICAgICAgICAgICAgICBjb3VudHJ5LCBkZXRlY3RlZENvdW50cnksIG5vdGlmeUNoYW5nZSwgc3RhcnRMb2NhdGlvbkJhc2VkRGV0ZWN0aW9uKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgc2V0Q291bnRyeUxpc3RlbmVyKENvdW50cnlMaXN0ZW5lciBsaXN0ZW5lcikgeworICAgICAgICBDb3VudHJ5TGlzdGVuZXIgcHJldkxpc3RlbmVyID0gbUxpc3RlbmVyOworICAgICAgICBtTGlzdGVuZXIgPSBsaXN0ZW5lcjsKKyAgICAgICAgaWYgKG1MaXN0ZW5lciA9PSBudWxsKSB7CisgICAgICAgICAgICAvLyBTdG9wIGxpc3RlbmluZyBhbGwgc2VydmljZXMKKyAgICAgICAgICAgIHJlbW92ZVBob25lU3RhdGVMaXN0ZW5lcigpOworICAgICAgICAgICAgc3RvcExvY2F0aW9uQmFzZWREZXRlY3RvcigpOworICAgICAgICAgICAgY2FuY2VsTG9jYXRpb25SZWZyZXNoKCk7CisgICAgICAgIH0gZWxzZSBpZiAocHJldkxpc3RlbmVyID09IG51bGwpIHsKKyAgICAgICAgICAgIGFkZFBob25lU3RhdGVMaXN0ZW5lcigpOworICAgICAgICAgICAgZGV0ZWN0Q291bnRyeShmYWxzZSwgdHJ1ZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICB2b2lkIHJ1bkFmdGVyRGV0ZWN0aW9uKGZpbmFsIENvdW50cnkgY291bnRyeSwgZmluYWwgQ291bnRyeSBkZXRlY3RlZENvdW50cnksCisgICAgICAgICAgICBmaW5hbCBib29sZWFuIG5vdGlmeUNoYW5nZSwgZmluYWwgYm9vbGVhbiBzdGFydExvY2F0aW9uQmFzZWREZXRlY3Rpb24pIHsKKyAgICAgICAgaWYgKG5vdGlmeUNoYW5nZSkgeworICAgICAgICAgICAgbm90aWZ5SWZDb3VudHJ5Q2hhbmdlZChjb3VudHJ5LCBkZXRlY3RlZENvdW50cnkpOworICAgICAgICB9CisgICAgICAgIGlmIChzdGFydExvY2F0aW9uQmFzZWREZXRlY3Rpb24gJiYgKGRldGVjdGVkQ291bnRyeSA9PSBudWxsCisgICAgICAgICAgICAgICAgfHwgZGV0ZWN0ZWRDb3VudHJ5LmdldFNvdXJjZSgpID4gQ291bnRyeS5DT1VOVFJZX1NPVVJDRV9MT0NBVElPTikKKyAgICAgICAgICAgICAgICAmJiBpc0FpcnBsYW5lTW9kZU9mZigpICYmIG1MaXN0ZW5lciAhPSBudWxsICYmIGlzR2VvQ29kZXJJbXBsZW1lbnRlZCgpKSB7CisgICAgICAgICAgICAvLyBTdGFydCBmaW5kaW5nIGxvY2F0aW9uIHdoZW4gdGhlIHNvdXJjZSBpcyBsZXNzIHJlbGlhYmxlIHRoYW4gdGhlCisgICAgICAgICAgICAvLyBsb2NhdGlvbiBhbmQgdGhlIGFpcnBsYW5lIG1vZGUgaXMgb2ZmIChhcyBnZW9jb2RlciB3aWxsIG5vdAorICAgICAgICAgICAgLy8gd29yaykuCisgICAgICAgICAgICAvLyBUT0RPIDogU2hhbGwgd2UgZ2l2ZSB1cCBzdGFydGluZyB0aGUgZGV0ZWN0b3Igd2l0aGluIGEKKyAgICAgICAgICAgIC8vIHBlcmlvZCBvZiB0aW1lPworICAgICAgICAgICAgc3RhcnRMb2NhdGlvbkJhc2VkRGV0ZWN0b3IobUxvY2F0aW9uQmFzZWRDb3VudHJ5RGV0ZWN0aW9uTGlzdGVuZXIpOworICAgICAgICB9CisgICAgICAgIGlmIChkZXRlY3RlZENvdW50cnkgPT0gbnVsbAorICAgICAgICAgICAgICAgIHx8IGRldGVjdGVkQ291bnRyeS5nZXRTb3VyY2UoKSA+PSBDb3VudHJ5LkNPVU5UUllfU09VUkNFX0xPQ0FUSU9OKSB7CisgICAgICAgICAgICAvLyBTY2hlZHVsZSB0aGUgbG9jYXRpb24gcmVmcmVzaCBpZiB0aGUgY291bnRyeSBzb3VyY2UgaXMKKyAgICAgICAgICAgIC8vIG5vdCBtb3JlIHJlbGlhYmxlIHRoYW4gdGhlIGxvY2F0aW9uIG9yIG5vIGNvdW50cnkgaXMKKyAgICAgICAgICAgIC8vIGZvdW5kLgorICAgICAgICAgICAgLy8gVE9ETzogTGlzdGVuIHRvIHRoZSBwcmVmZXJlbmNlIGNoYW5nZSBvZiBHUFMsIFdpZmkgZXRjLAorICAgICAgICAgICAgLy8gYW5kIHN0YXJ0IGRldGVjdGluZyB0aGUgY291bnRyeS4KKyAgICAgICAgICAgIHNjaGVkdWxlTG9jYXRpb25SZWZyZXNoKCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBDYW5jZWwgdGhlIGxvY2F0aW9uIHJlZnJlc2ggb25jZSB0aGUgY3VycmVudCBzb3VyY2UgaXMKKyAgICAgICAgICAgIC8vIG1vcmUgcmVsaWFibGUgdGhhbiB0aGUgbG9jYXRpb24uCisgICAgICAgICAgICBjYW5jZWxMb2NhdGlvblJlZnJlc2goKTsKKyAgICAgICAgICAgIHN0b3BMb2NhdGlvbkJhc2VkRGV0ZWN0b3IoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEZpbmQgdGhlIGNvdW50cnkgZnJvbSBMb2NhdGlvblByb3ZpZGVyLgorICAgICAqLworICAgIHByaXZhdGUgc3luY2hyb25pemVkIHZvaWQgc3RhcnRMb2NhdGlvbkJhc2VkRGV0ZWN0b3IoQ291bnRyeUxpc3RlbmVyIGxpc3RlbmVyKSB7CisgICAgICAgIGlmIChtTG9jYXRpb25CYXNlZENvdW50cnlEZXRlY3RvciAhPSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgbUxvY2F0aW9uQmFzZWRDb3VudHJ5RGV0ZWN0b3IgPSBjcmVhdGVMb2NhdGlvbkJhc2VkQ291bnRyeURldGVjdG9yKCk7CisgICAgICAgIG1Mb2NhdGlvbkJhc2VkQ291bnRyeURldGVjdG9yLnNldENvdW50cnlMaXN0ZW5lcihsaXN0ZW5lcik7CisgICAgICAgIG1Mb2NhdGlvbkJhc2VkQ291bnRyeURldGVjdG9yLmRldGVjdENvdW50cnkoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN5bmNocm9uaXplZCB2b2lkIHN0b3BMb2NhdGlvbkJhc2VkRGV0ZWN0b3IoKSB7CisgICAgICAgIGlmIChtTG9jYXRpb25CYXNlZENvdW50cnlEZXRlY3RvciAhPSBudWxsKSB7CisgICAgICAgICAgICBtTG9jYXRpb25CYXNlZENvdW50cnlEZXRlY3Rvci5zdG9wKCk7CisgICAgICAgICAgICBtTG9jYXRpb25CYXNlZENvdW50cnlEZXRlY3RvciA9IG51bGw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgQ291bnRyeURldGVjdG9yQmFzZSBjcmVhdGVMb2NhdGlvbkJhc2VkQ291bnRyeURldGVjdG9yKCkgeworICAgICAgICByZXR1cm4gbmV3IExvY2F0aW9uQmFzZWRDb3VudHJ5RGV0ZWN0b3IobUNvbnRleHQpOworICAgIH0KKworICAgIHByb3RlY3RlZCBib29sZWFuIGlzQWlycGxhbmVNb2RlT2ZmKCkgeworICAgICAgICByZXR1cm4gU2V0dGluZ3MuU3lzdGVtLmdldEludCgKKyAgICAgICAgICAgICAgICBtQ29udGV4dC5nZXRDb250ZW50UmVzb2x2ZXIoKSwgU2V0dGluZ3MuU3lzdGVtLkFJUlBMQU5FX01PREVfT04sIDApID09IDA7CisgICAgfQorCisgICAgLyoqCisgICAgICogTm90aWZ5IHRoZSBjb3VudHJ5IGNoYW5nZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgbm90aWZ5SWZDb3VudHJ5Q2hhbmdlZChmaW5hbCBDb3VudHJ5IGNvdW50cnksIGZpbmFsIENvdW50cnkgZGV0ZWN0ZWRDb3VudHJ5KSB7CisgICAgICAgIGlmIChkZXRlY3RlZENvdW50cnkgIT0gbnVsbCAmJiBtTGlzdGVuZXIgIT0gbnVsbAorICAgICAgICAgICAgICAgICYmIChjb3VudHJ5ID09IG51bGwgfHwgIWNvdW50cnkuZXF1YWxzKGRldGVjdGVkQ291bnRyeSkpKSB7CisgICAgICAgICAgICBTbG9nLmQoVEFHLAorICAgICAgICAgICAgICAgICAgICAiVGhlIGNvdW50cnkgd2FzIGNoYW5nZWQgZnJvbSAiICsgY291bnRyeSAhPSBudWxsID8gY291bnRyeS5nZXRDb3VudHJ5SXNvKCkgOgorICAgICAgICAgICAgICAgICAgICAgICAgY291bnRyeSArICIgdG8gIiArIGRldGVjdGVkQ291bnRyeS5nZXRDb3VudHJ5SXNvKCkpOworICAgICAgICAgICAgbm90aWZ5TGlzdGVuZXIoZGV0ZWN0ZWRDb3VudHJ5KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFNjaGVkdWxlIHRoZSBuZXh0IGxvY2F0aW9uIHJlZnJlc2guIFdlIHdpbGwgZG8gbm90aGluZyBpZiB0aGUgc2NoZWR1bGVkIHRhc2sgZXhpc3RzLgorICAgICAqLworICAgIHByaXZhdGUgc3luY2hyb25pemVkIHZvaWQgc2NoZWR1bGVMb2NhdGlvblJlZnJlc2goKSB7CisgICAgICAgIGlmIChtTG9jYXRpb25SZWZyZXNoVGltZXIgIT0gbnVsbCkgcmV0dXJuOworICAgICAgICBtTG9jYXRpb25SZWZyZXNoVGltZXIgPSBuZXcgVGltZXIoKTsKKyAgICAgICAgbUxvY2F0aW9uUmVmcmVzaFRpbWVyLnNjaGVkdWxlKG5ldyBUaW1lclRhc2soKSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICBtTG9jYXRpb25SZWZyZXNoVGltZXIgPSBudWxsOworICAgICAgICAgICAgICAgIGRldGVjdENvdW50cnkoZmFsc2UsIHRydWUpOworICAgICAgICAgICAgfQorICAgICAgICB9LCBMT0NBVElPTl9SRUZSRVNIX0lOVEVSVkFMKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDYW5jZWwgdGhlIHNjaGVkdWxlZCByZWZyZXNoIHRhc2sgaWYgaXQgZXhpc3RzCisgICAgICovCisgICAgcHJpdmF0ZSBzeW5jaHJvbml6ZWQgdm9pZCBjYW5jZWxMb2NhdGlvblJlZnJlc2goKSB7CisgICAgICAgIGlmIChtTG9jYXRpb25SZWZyZXNoVGltZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgbUxvY2F0aW9uUmVmcmVzaFRpbWVyLmNhbmNlbCgpOworICAgICAgICAgICAgbUxvY2F0aW9uUmVmcmVzaFRpbWVyID0gbnVsbDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByb3RlY3RlZCBzeW5jaHJvbml6ZWQgdm9pZCBhZGRQaG9uZVN0YXRlTGlzdGVuZXIoKSB7CisgICAgICAgIGlmIChtUGhvbmVTdGF0ZUxpc3RlbmVyID09IG51bGwgJiYgbVBob25lVHlwZSA9PSBUZWxlcGhvbnlNYW5hZ2VyLlBIT05FX1RZUEVfR1NNKSB7CisgICAgICAgICAgICBtTGFzdFN0YXRlID0gbnVsbDsKKyAgICAgICAgICAgIG1QaG9uZVN0YXRlTGlzdGVuZXIgPSBuZXcgUGhvbmVTdGF0ZUxpc3RlbmVyKCkgeworICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uU2VydmljZVN0YXRlQ2hhbmdlZChTZXJ2aWNlU3RhdGUgc2VydmljZVN0YXRlKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIFRPRE86IEZpbmQgb3V0IGhvdyBvZnRlbiB3ZSB3aWxsIGJlIG5vdGlmaWVkLCBpZiB0aGlzCisgICAgICAgICAgICAgICAgICAgIC8vIG1ldGhvZCBpcyBjYWxsZWQgdG9vCisgICAgICAgICAgICAgICAgICAgIC8vIG1hbnkgdGltZXMsIGxldCdzIGNvbnNpZGVyIHF1ZXJ5aW5nIHRoZSBuZXR3b3JrLgorICAgICAgICAgICAgICAgICAgICBTbG9nLmQoVEFHLCAib25TZXJ2aWNlU3RhdGVDaGFuZ2VkIik7CisgICAgICAgICAgICAgICAgICAgIC8vIFdlIG9ubHkgY2FyZSB0aGUgc3RhdGUgY2hhbmdlCisgICAgICAgICAgICAgICAgICAgIGlmIChtTGFzdFN0YXRlID09IG51bGwgfHwgbUxhc3RTdGF0ZS5nZXRTdGF0ZSgpICE9IHNlcnZpY2VTdGF0ZS5nZXRTdGF0ZSgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBkZXRlY3RDb3VudHJ5KHRydWUsIHRydWUpOworICAgICAgICAgICAgICAgICAgICAgICAgbUxhc3RTdGF0ZSA9IG5ldyBTZXJ2aWNlU3RhdGUoc2VydmljZVN0YXRlKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH07CisgICAgICAgICAgICBtVGVsZXBob255TWFuYWdlci5saXN0ZW4obVBob25lU3RhdGVMaXN0ZW5lciwgUGhvbmVTdGF0ZUxpc3RlbmVyLkxJU1RFTl9TRVJWSUNFX1NUQVRFKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByb3RlY3RlZCBzeW5jaHJvbml6ZWQgdm9pZCByZW1vdmVQaG9uZVN0YXRlTGlzdGVuZXIoKSB7CisgICAgICAgIGlmIChtUGhvbmVTdGF0ZUxpc3RlbmVyICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1UZWxlcGhvbnlNYW5hZ2VyLmxpc3RlbihtUGhvbmVTdGF0ZUxpc3RlbmVyLCBQaG9uZVN0YXRlTGlzdGVuZXIuTElTVEVOX05PTkUpOworICAgICAgICAgICAgbVBob25lU3RhdGVMaXN0ZW5lciA9IG51bGw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiBpc0dlb0NvZGVySW1wbGVtZW50ZWQoKSB7CisgICAgICAgIHJldHVybiBHZW9jb2Rlci5pc0ltcGxlbWVudGVkKCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvbG9jYXRpb24vQ291bnRyeURldGVjdG9yQmFzZS5qYXZhIGIvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvbG9jYXRpb24vQ291bnRyeURldGVjdG9yQmFzZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgzMjZlZjkKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9sb2NhdGlvbi9Db3VudHJ5RGV0ZWN0b3JCYXNlLmphdmEKQEAgLTAsMCArMSw3MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5zZXJ2ZXIubG9jYXRpb247CisKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmxvY2F0aW9uLkNvdW50cnk7CitpbXBvcnQgYW5kcm9pZC5sb2NhdGlvbi5Db3VudHJ5TGlzdGVuZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyOworCisvKioKKyAqIFRoaXMgY2xhc3MgZGVmaW5lcyB0aGUgbWV0aG9kcyBuZWVkIHRvIGJlIGltcGxlbWVudGVkIGJ5IHRoZSBjb3VudHJ5CisgKiBkZXRlY3Rvci4KKyAqIDxwPgorICogQ2FsbGluZyB7QGxpbmsgI2RldGVjdENvdW50cnl9IHRvIHN0YXJ0IGRldGVjdGluZyB0aGUgY291bnRyeS4gVGhlIGNvdW50cnkKKyAqIGNvdWxkIGJlIHJldHVybmVkIGltbWVkaWF0ZWx5IGlmIGl0IGlzIGF2YWlsYWJsZS4KKyAqCisgKiBAaGlkZQorICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQ291bnRyeURldGVjdG9yQmFzZSB7CisgICAgcHJvdGVjdGVkIGZpbmFsIEhhbmRsZXIgbUhhbmRsZXI7CisgICAgcHJvdGVjdGVkIGZpbmFsIENvbnRleHQgbUNvbnRleHQ7CisgICAgcHJvdGVjdGVkIENvdW50cnlMaXN0ZW5lciBtTGlzdGVuZXI7CisgICAgcHJvdGVjdGVkIENvdW50cnkgbURldGVjdGVkQ291bnRyeTsKKworICAgIHB1YmxpYyBDb3VudHJ5RGV0ZWN0b3JCYXNlKENvbnRleHQgY3R4KSB7CisgICAgICAgIG1Db250ZXh0ID0gY3R4OworICAgICAgICBtSGFuZGxlciA9IG5ldyBIYW5kbGVyKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU3RhcnQgZGV0ZWN0aW5nIHRoZSBjb3VudHJ5IHRoYXQgdGhlIHVzZXIgaXMgaW4uCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSBjb3VudHJ5IGlmIGl0IGlzIGF2YWlsYWJsZSBpbW1lZGlhdGVseSwgb3RoZXJ3aXNlIG51bGwgc2hvdWxkCisgICAgICogICAgICAgICBiZSByZXR1cm5lZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgYWJzdHJhY3QgQ291bnRyeSBkZXRlY3RDb3VudHJ5KCk7CisKKyAgICAvKioKKyAgICAgKiBSZWdpc3RlciBhIGxpc3RlbmVyIHRvIHJlY2VpdmUgdGhlIG5vdGlmaWNhdGlvbiB3aGVuIHRoZSBjb3VudHJ5IGlzIGRldGVjdGVkIG9yIGNoYW5nZWQuCisgICAgICogPHA+CisgICAgICogVGhlIHByZXZpb3VzIGxpc3RlbmVyIHdpbGwgYmUgcmVwbGFjZWQgaWYgaXQgZXhpc3RzLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldENvdW50cnlMaXN0ZW5lcihDb3VudHJ5TGlzdGVuZXIgbGlzdGVuZXIpIHsKKyAgICAgICAgbUxpc3RlbmVyID0gbGlzdGVuZXI7CisgICAgfQorCisgICAgLyoqCisgICAgICogU3RvcCBkZXRlY3RpbmcgdGhlIGNvdW50cnkuIFRoZSBkZXRlY3RvciBzaG91bGQgcmVsZWFzZSBhbGwgc3lzdGVtIHNlcnZpY2VzIGFuZCBiZSByZWFkeSB0bworICAgICAqIGJlIGZyZWVkCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IHZvaWQgc3RvcCgpOworCisgICAgcHJvdGVjdGVkIHZvaWQgbm90aWZ5TGlzdGVuZXIoQ291bnRyeSBjb3VudHJ5KSB7CisgICAgICAgIGlmIChtTGlzdGVuZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgbUxpc3RlbmVyLm9uQ291bnRyeURldGVjdGVkKGNvdW50cnkpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvbG9jYXRpb24vTG9jYXRpb25CYXNlZENvdW50cnlEZXRlY3Rvci5qYXZhIGIvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvbG9jYXRpb24vTG9jYXRpb25CYXNlZENvdW50cnlEZXRlY3Rvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjEzOWYwNWQKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9sb2NhdGlvbi9Mb2NhdGlvbkJhc2VkQ291bnRyeURldGVjdG9yLmphdmEKQEAgLTAsMCArMSwyMzUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZQorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQuc2VydmVyLmxvY2F0aW9uOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5UaW1lcjsKK2ltcG9ydCBqYXZhLnV0aWwuVGltZXJUYXNrOworCitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5sb2NhdGlvbi5BZGRyZXNzOworaW1wb3J0IGFuZHJvaWQubG9jYXRpb24uQ291bnRyeTsKK2ltcG9ydCBhbmRyb2lkLmxvY2F0aW9uLkdlb2NvZGVyOworaW1wb3J0IGFuZHJvaWQubG9jYXRpb24uTG9jYXRpb247CitpbXBvcnQgYW5kcm9pZC5sb2NhdGlvbi5Mb2NhdGlvbkxpc3RlbmVyOworaW1wb3J0IGFuZHJvaWQubG9jYXRpb24uTG9jYXRpb25NYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworaW1wb3J0IGFuZHJvaWQudXRpbC5TbG9nOworCisvKioKKyAqIFRoaXMgY2xhc3MgZGV0ZWN0cyB3aGljaCBjb3VudHJ5IHRoZSB1c2VyIGN1cnJlbnRseSBpcyBpbiB0aHJvdWdoIHRoZSBlbmFibGVkCisgKiBsb2NhdGlvbiBwcm92aWRlcnMgYW5kIHRoZSBHZW9Db2RlcgorICogPHA+CisgKiBVc2Uge0BsaW5rICNkZXRlY3RDb3VudHJ5fSB0byBzdGFydCBxdWVyeWluZy4gSWYgdGhlIGxvY2F0aW9uIGNhbiBub3QgYmUKKyAqIHJlc29sdmVkIHdpdGhpbiB0aGUgZ2l2ZW4gdGltZSwgdGhlIGxhc3Qga25vd24gbG9jYXRpb24gd2lsbCBiZSB1c2VkIHRvIGdldAorICogdGhlIHVzZXIgY291bnRyeSB0aHJvdWdoIHRoZSBHZW9Db2Rlci4gVGhlIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiB3aWxsIGJlCisgKiB0aHJvd24gaWYgdGhlcmUgaXMgYSBvbmdvaW5nIHF1ZXJ5LgorICogPHA+CisgKiBUaGUgY3VycmVudCBxdWVyeSBjYW4gYmUgc3RvcHBlZCBieSB7QGxpbmsgI3N0b3AoKX0KKyAqCisgKiBAaGlkZQorICovCitwdWJsaWMgY2xhc3MgTG9jYXRpb25CYXNlZENvdW50cnlEZXRlY3RvciBleHRlbmRzIENvdW50cnlEZXRlY3RvckJhc2UgeworICAgIHByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBUQUcgPSAiTG9jYXRpb25CYXNlZENvdW50cnlEZXRlY3RvciI7CisgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgbG9uZyBRVUVSWV9MT0NBVElPTl9USU1FT1VUID0gMTAwMCAqIDYwICogNTsgLy8gNSBtaW5zCisKKyAgICAvKioKKyAgICAgKiBVc2VkIGZvciBjYW5jZWxpbmcgbG9jYXRpb24gcXVlcnkKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgVGltZXIgbVRpbWVyOworCisgICAgLyoqCisgICAgICogVGhlIHRocmVhZCB0byBxdWVyeSB0aGUgY291bnRyeSBmcm9tIHRoZSBHZW9Db2Rlci4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgVGhyZWFkIG1RdWVyeVRocmVhZDsKKyAgICBwcm90ZWN0ZWQgTGlzdDxMb2NhdGlvbkxpc3RlbmVyPiBtTG9jYXRpb25MaXN0ZW5lcnM7CisKKyAgICBwcml2YXRlIExvY2F0aW9uTWFuYWdlciBtTG9jYXRpb25NYW5hZ2VyOworICAgIHByaXZhdGUgTGlzdDxTdHJpbmc+IG1FbmFibGVkUHJvdmlkZXJzOworCisgICAgcHVibGljIExvY2F0aW9uQmFzZWRDb3VudHJ5RGV0ZWN0b3IoQ29udGV4dCBjdHgpIHsKKyAgICAgICAgc3VwZXIoY3R4KTsKKyAgICAgICAgbUxvY2F0aW9uTWFuYWdlciA9IChMb2NhdGlvbk1hbmFnZXIpIGN0eC5nZXRTeXN0ZW1TZXJ2aWNlKENvbnRleHQuTE9DQVRJT05fU0VSVklDRSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHJldHVybiB0aGUgSVNPIDMxNjYtMSB0d28gbGV0dGVycyBjb3VudHJ5IGNvZGUgZnJvbSB0aGUgbG9jYXRpb24KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldENvdW50cnlGcm9tTG9jYXRpb24oTG9jYXRpb24gbG9jYXRpb24pIHsKKyAgICAgICAgU3RyaW5nIGNvdW50cnkgPSBudWxsOworICAgICAgICBHZW9jb2RlciBnZW9Db2RlciA9IG5ldyBHZW9jb2RlcihtQ29udGV4dCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBMaXN0PEFkZHJlc3M+IGFkZHJlc3NlcyA9IGdlb0NvZGVyLmdldEZyb21Mb2NhdGlvbigKKyAgICAgICAgICAgICAgICAgICAgbG9jYXRpb24uZ2V0TGF0aXR1ZGUoKSwgbG9jYXRpb24uZ2V0TG9uZ2l0dWRlKCksIDEpOworICAgICAgICAgICAgaWYgKGFkZHJlc3NlcyAhPSBudWxsICYmIGFkZHJlc3Nlcy5zaXplKCkgPiAwKSB7CisgICAgICAgICAgICAgICAgY291bnRyeSA9IGFkZHJlc3Nlcy5nZXQoMCkuZ2V0Q291bnRyeUNvZGUoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgU2xvZy53KFRBRywgIkV4Y2VwdGlvbiBvY2N1cnMgd2hlbiBnZXR0aW5nIGNvdW50cnkgZnJvbSBsb2NhdGlvbiIpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBjb3VudHJ5OworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlZ2lzdGVyIHRoZSBsaXN0ZW5lcnMgd2l0aCB0aGUgbG9jYXRpb24gcHJvdmlkZXJzCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgcmVnaXN0ZXJFbmFibGVkUHJvdmlkZXJzKExpc3Q8TG9jYXRpb25MaXN0ZW5lcj4gbGlzdGVuZXJzKSB7CisgICAgICAgIGludCB0b3RhbCA9IGxpc3RlbmVycy5zaXplKCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpPCB0b3RhbDsgaSsrKSB7CisgICAgICAgICAgICBtTG9jYXRpb25NYW5hZ2VyLnJlcXVlc3RMb2NhdGlvblVwZGF0ZXMoCisgICAgICAgICAgICAgICAgICAgIG1FbmFibGVkUHJvdmlkZXJzLmdldChpKSwgMCwgMCwgbGlzdGVuZXJzLmdldChpKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBVbnJlZ2lzdGVyIHRoZSBsaXN0ZW5lcnMgd2l0aCB0aGUgbG9jYXRpb24gcHJvdmlkZXJzCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgdW5yZWdpc3RlclByb3ZpZGVycyhMaXN0PExvY2F0aW9uTGlzdGVuZXI+IGxpc3RlbmVycykgeworICAgICAgICBmb3IgKExvY2F0aW9uTGlzdGVuZXIgbGlzdGVuZXIgOiBsaXN0ZW5lcnMpIHsKKyAgICAgICAgICAgIG1Mb2NhdGlvbk1hbmFnZXIucmVtb3ZlVXBkYXRlcyhsaXN0ZW5lcik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIHRoZSBsYXN0IGtub3duIGxvY2F0aW9uIGZyb20gYWxsIHByb3ZpZGVycworICAgICAqLworICAgIHByb3RlY3RlZCBMb2NhdGlvbiBnZXRMYXN0S25vd25Mb2NhdGlvbigpIHsKKyAgICAgICAgTGlzdDxTdHJpbmc+IHByb3ZpZGVycyA9IG1Mb2NhdGlvbk1hbmFnZXIuZ2V0QWxsUHJvdmlkZXJzKCk7CisgICAgICAgIExvY2F0aW9uIGJlc3RMb2NhdGlvbiA9IG51bGw7CisgICAgICAgIGZvciAoU3RyaW5nIHByb3ZpZGVyIDogcHJvdmlkZXJzKSB7CisgICAgICAgICAgICBMb2NhdGlvbiBsYXN0S25vd25Mb2NhdGlvbiA9IG1Mb2NhdGlvbk1hbmFnZXIuZ2V0TGFzdEtub3duTG9jYXRpb24ocHJvdmlkZXIpOworICAgICAgICAgICAgaWYgKGxhc3RLbm93bkxvY2F0aW9uICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBpZiAoYmVzdExvY2F0aW9uID09IG51bGwgfHwgYmVzdExvY2F0aW9uLmdldFRpbWUoKSA8IGxhc3RLbm93bkxvY2F0aW9uLmdldFRpbWUoKSkgeworICAgICAgICAgICAgICAgICAgICBiZXN0TG9jYXRpb24gPSBsYXN0S25vd25Mb2NhdGlvbjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGJlc3RMb2NhdGlvbjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIHRoZSB0aW1lb3V0IGZvciBxdWVyeWluZyB0aGUgbG9jYXRpb24uCisgICAgICovCisgICAgcHJvdGVjdGVkIGxvbmcgZ2V0UXVlcnlMb2NhdGlvblRpbWVvdXQoKSB7CisgICAgICAgIHJldHVybiBRVUVSWV9MT0NBVElPTl9USU1FT1VUOworICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4gdGhlIHRvdGFsIG51bWJlciBvZiBlbmFibGVkIGxvY2F0aW9uIHByb3ZpZGVycworICAgICAqLworICAgIHByb3RlY3RlZCBpbnQgZ2V0VG90YWxFbmFibGVkUHJvdmlkZXJzKCkgeworICAgICAgICBpZiAobUVuYWJsZWRQcm92aWRlcnMgPT0gbnVsbCkgeworICAgICAgICAgICAgbUVuYWJsZWRQcm92aWRlcnMgPSBtTG9jYXRpb25NYW5hZ2VyLmdldFByb3ZpZGVycyh0cnVlKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbUVuYWJsZWRQcm92aWRlcnMuc2l6ZSgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFN0YXJ0IGRldGVjdGluZyB0aGUgY291bnRyeS4KKyAgICAgKiA8cD4KKyAgICAgKiBRdWVyaWVzIHRoZSBsb2NhdGlvbiBmcm9tIGFsbCBsb2NhdGlvbiBwcm92aWRlcnMsIHRoZW4gc3RhcnRzIGEgdGhyZWFkIHRvIHF1ZXJ5IHRoZQorICAgICAqIGNvdW50cnkgZnJvbSBHZW9Db2Rlci4KKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgc3luY2hyb25pemVkIENvdW50cnkgZGV0ZWN0Q291bnRyeSgpIHsKKyAgICAgICAgaWYgKG1Mb2NhdGlvbkxpc3RlbmVycyAgIT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOworICAgICAgICB9CisgICAgICAgIC8vIFJlcXVlc3QgdGhlIGxvY2F0aW9uIGZyb20gYWxsIGVuYWJsZWQgcHJvdmlkZXJzLgorICAgICAgICBpbnQgdG90YWxQcm92aWRlcnMgPSBnZXRUb3RhbEVuYWJsZWRQcm92aWRlcnMoKTsKKyAgICAgICAgaWYgKHRvdGFsUHJvdmlkZXJzID4gMCkgeworICAgICAgICAgICAgbUxvY2F0aW9uTGlzdGVuZXJzID0gbmV3IEFycmF5TGlzdDxMb2NhdGlvbkxpc3RlbmVyPih0b3RhbFByb3ZpZGVycyk7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHRvdGFsUHJvdmlkZXJzOyBpKyspIHsKKyAgICAgICAgICAgICAgICBMb2NhdGlvbkxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IExvY2F0aW9uTGlzdGVuZXIgKCkgeworICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkxvY2F0aW9uQ2hhbmdlZChMb2NhdGlvbiBsb2NhdGlvbikgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxvY2F0aW9uICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2NhdGlvbkJhc2VkQ291bnRyeURldGVjdG9yLnRoaXMuc3RvcCgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXJ5Q291bnRyeUNvZGUobG9jYXRpb24pOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uUHJvdmlkZXJEaXNhYmxlZChTdHJpbmcgcHJvdmlkZXIpIHsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBvblByb3ZpZGVyRW5hYmxlZChTdHJpbmcgcHJvdmlkZXIpIHsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBvblN0YXR1c0NoYW5nZWQoU3RyaW5nIHByb3ZpZGVyLCBpbnQgc3RhdHVzLCBCdW5kbGUgZXh0cmFzKSB7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9OworICAgICAgICAgICAgICAgIG1Mb2NhdGlvbkxpc3RlbmVycy5hZGQobGlzdGVuZXIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmVnaXN0ZXJFbmFibGVkUHJvdmlkZXJzKG1Mb2NhdGlvbkxpc3RlbmVycyk7CisgICAgICAgICAgICBtVGltZXIgPSBuZXcgVGltZXIoKTsKKyAgICAgICAgICAgIG1UaW1lci5zY2hlZHVsZShuZXcgVGltZXJUYXNrKCkgeworICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICAgICAgbVRpbWVyID0gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgTG9jYXRpb25CYXNlZENvdW50cnlEZXRlY3Rvci50aGlzLnN0b3AoKTsKKyAgICAgICAgICAgICAgICAgICAgLy8gTG9va3MgbGlrZSBubyBwcm92aWRlciBjb3VsZCBwcm92aWRlIHRoZSBsb2NhdGlvbiwgbGV0J3MgdHJ5IHRoZSBsYXN0CisgICAgICAgICAgICAgICAgICAgIC8vIGtub3duIGxvY2F0aW9uLgorICAgICAgICAgICAgICAgICAgICBxdWVyeUNvdW50cnlDb2RlKGdldExhc3RLbm93bkxvY2F0aW9uKCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0sIGdldFF1ZXJ5TG9jYXRpb25UaW1lb3V0KCkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gVGhlcmUgaXMgbm8gcHJvdmlkZXIgZW5hYmxlZC4KKyAgICAgICAgICAgIHF1ZXJ5Q291bnRyeUNvZGUoZ2V0TGFzdEtub3duTG9jYXRpb24oKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG1EZXRlY3RlZENvdW50cnk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU3RvcCB0aGUgY3VycmVudCBxdWVyeSB3aXRob3V0IG5vdGlmeWluZyB0aGUgbGlzdGVuZXIuCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHN0b3AoKSB7CisgICAgICAgIGlmIChtTG9jYXRpb25MaXN0ZW5lcnMgIT0gbnVsbCkgeworICAgICAgICAgICAgdW5yZWdpc3RlclByb3ZpZGVycyhtTG9jYXRpb25MaXN0ZW5lcnMpOworICAgICAgICAgICAgbUxvY2F0aW9uTGlzdGVuZXJzID0gbnVsbDsKKyAgICAgICAgfQorICAgICAgICBpZiAobVRpbWVyICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1UaW1lci5jYW5jZWwoKTsKKyAgICAgICAgICAgIG1UaW1lciA9IG51bGw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTdGFydCBhIG5ldyB0aHJlYWQgdG8gcXVlcnkgdGhlIGNvdW50cnkgZnJvbSBHZW9jb2Rlci4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN5bmNocm9uaXplZCB2b2lkIHF1ZXJ5Q291bnRyeUNvZGUoZmluYWwgTG9jYXRpb24gbG9jYXRpb24pIHsKKyAgICAgICAgaWYgKGxvY2F0aW9uID09IG51bGwpIHsKKyAgICAgICAgICAgIG5vdGlmeUxpc3RlbmVyKG51bGwpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGlmIChtUXVlcnlUaHJlYWQgIT0gbnVsbCkgcmV0dXJuOworICAgICAgICBtUXVlcnlUaHJlYWQgPSBuZXcgVGhyZWFkKG5ldyBSdW5uYWJsZSgpIHsKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICBTdHJpbmcgY291bnRyeUlzbyA9IG51bGw7CisgICAgICAgICAgICAgICAgaWYgKGxvY2F0aW9uICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnRyeUlzbyA9IGdldENvdW50cnlGcm9tTG9jYXRpb24obG9jYXRpb24pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoY291bnRyeUlzbyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIG1EZXRlY3RlZENvdW50cnkgPSBuZXcgQ291bnRyeShjb3VudHJ5SXNvLCBDb3VudHJ5LkNPVU5UUllfU09VUkNFX0xPQ0FUSU9OKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBtRGV0ZWN0ZWRDb3VudHJ5ID0gbnVsbDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbm90aWZ5TGlzdGVuZXIobURldGVjdGVkQ291bnRyeSk7CisgICAgICAgICAgICAgICAgbVF1ZXJ5VGhyZWFkID0gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisgICAgICAgIG1RdWVyeVRocmVhZC5zdGFydCgpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2puaS9BbmRyb2lkLm1rIGIvc2VydmljZXMvam5pL0FuZHJvaWQubWsKaW5kZXggY2RjMGE2Zi4uNDU5NTUxZCAxMDA2NDQKLS0tIGEvc2VydmljZXMvam5pL0FuZHJvaWQubWsKKysrIGIvc2VydmljZXMvam5pL0FuZHJvaWQubWsKQEAgLTgsNiArOCw3IEBACiAgICAgY29tX2FuZHJvaWRfc2VydmVyX0xpZ2h0c1NlcnZpY2UuY3BwIFwKICAgICBjb21fYW5kcm9pZF9zZXJ2ZXJfUG93ZXJNYW5hZ2VyU2VydmljZS5jcHAgXAogICAgIGNvbV9hbmRyb2lkX3NlcnZlcl9TeXN0ZW1TZXJ2ZXIuY3BwIFwKKyAgICBjb21fYW5kcm9pZF9zZXJ2ZXJfVXNiT2JzZXJ2ZXIuY3BwIFwKICAgICBjb21fYW5kcm9pZF9zZXJ2ZXJfVmlicmF0b3JTZXJ2aWNlLmNwcCBcCiAJY29tX2FuZHJvaWRfc2VydmVyX2xvY2F0aW9uX0dwc0xvY2F0aW9uUHJvdmlkZXIuY3BwIFwKICAgICBvbmxvYWQuY3BwCkBAIC0yNSw2ICsyNiw4IEBACiAJbGlidXRpbHMgXAogCWxpYnVpCiAKK0xPQ0FMX1NUQVRJQ19MSUJSQVJJRVMgOj0gbGlidXNiaG9zdAorCiBpZmVxICgkKFRBUkdFVF9TSU1VTEFUT1IpLHRydWUpCiBpZmVxICgkKFRBUkdFVF9PUyksbGludXgpCiBpZmVxICgkKFRBUkdFVF9BUkNIKSx4ODYpCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9qbmkvY29tX2FuZHJvaWRfc2VydmVyX1VzYk9ic2VydmVyLmNwcCBiL3NlcnZpY2VzL2puaS9jb21fYW5kcm9pZF9zZXJ2ZXJfVXNiT2JzZXJ2ZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdjNDc4ZDUKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9qbmkvY29tX2FuZHJvaWRfc2VydmVyX1VzYk9ic2VydmVyLmNwcApAQCAtMCwwICsxLDE3NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiVXNiT2JzZXJ2ZXIiCisjaW5jbHVkZSAidXRpbHMvTG9nLmgiCisKKyNpbmNsdWRlICJqbmkuaCIKKyNpbmNsdWRlICJKTklIZWxwLmgiCisjaW5jbHVkZSAiYW5kcm9pZF9ydW50aW1lL0FuZHJvaWRSdW50aW1lLmgiCisjaW5jbHVkZSAidXRpbHMvVmVjdG9yLmgiCisKKyNpbmNsdWRlIDx1c2Job3N0L3VzYmhvc3QuaD4KKyNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CisjaWYgTElOVVhfVkVSU0lPTl9DT0RFID4gS0VSTkVMX1ZFUlNJT04oMiwgNiwgMjApCisjaW5jbHVkZSA8bGludXgvdXNiL2NoOS5oPgorI2Vsc2UKKyNpbmNsdWRlIDxsaW51eC91c2JfY2g5Lmg+CisjZW5kaWYKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkCit7CisKK3N0YXRpYyBqbWV0aG9kSUQgbWV0aG9kX3VzYkNhbWVyYUFkZGVkOworc3RhdGljIGptZXRob2RJRCBtZXRob2RfdXNiQ2FtZXJhUmVtb3ZlZDsKKworVmVjdG9yPGludD4gbURldmljZUxpc3Q7CisKK3N0YXRpYyB2b2lkIGNoZWNrQW5kQ2xlYXJFeGNlcHRpb25Gcm9tQ2FsbGJhY2soSk5JRW52KiBlbnYsIGNvbnN0IGNoYXIqIG1ldGhvZE5hbWUpIHsKKyAgICBpZiAoZW52LT5FeGNlcHRpb25DaGVjaygpKSB7CisgICAgICAgIExPR0UoIkFuIGV4Y2VwdGlvbiB3YXMgdGhyb3duIGJ5IGNhbGxiYWNrICclcycuIiwgbWV0aG9kTmFtZSk7CisgICAgICAgIExPR0VfRVgoZW52KTsKKyAgICAgICAgZW52LT5FeGNlcHRpb25DbGVhcigpOworICAgIH0KK30KKworc3RhdGljIGludCB1c2JfZGV2aWNlX2FkZGVkKGNvbnN0IGNoYXIgKmRldm5hbWUsIHZvaWQqIGNsaWVudF9kYXRhKSB7CisgICAgLy8gY2hlY2sgdG8gc2VlIGlmIGl0IGlzIGEgY2FtZXJhCisgICAgc3RydWN0IHVzYl9kZXNjcmlwdG9yX2hlYWRlciogZGVzYzsKKyAgICBzdHJ1Y3QgdXNiX2Rlc2NyaXB0b3JfaXRlciBpdGVyOworCisgICAgc3RydWN0IHVzYl9kZXZpY2UgKmRldmljZSA9IHVzYl9kZXZpY2Vfb3BlbihkZXZuYW1lKTsKKyAgICBpZiAoIWRldmljZSkgeworICAgICAgICBMT0dFKCJ1c2JfZGV2aWNlX29wZW4gZmFpbGVkXG4iKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgdXNiX2Rlc2NyaXB0b3JfaXRlcl9pbml0KGRldmljZSwgJml0ZXIpOworCisgICAgd2hpbGUgKChkZXNjID0gdXNiX2Rlc2NyaXB0b3JfaXRlcl9uZXh0KCZpdGVyKSkgIT0gTlVMTCkgeworICAgICAgICBpZiAoZGVzYy0+YkRlc2NyaXB0b3JUeXBlID09IFVTQl9EVF9JTlRFUkZBQ0UpIHsKKyAgICAgICAgICAgIHN0cnVjdCB1c2JfaW50ZXJmYWNlX2Rlc2NyaXB0b3IgKmludGVyZmFjZSA9IChzdHJ1Y3QgdXNiX2ludGVyZmFjZV9kZXNjcmlwdG9yICopZGVzYzsKKworICAgICAgICAgICAgaWYgKGludGVyZmFjZS0+YkludGVyZmFjZUNsYXNzID09IFVTQl9DTEFTU19TVElMTF9JTUFHRSAmJgorICAgICAgICAgICAgICAgIGludGVyZmFjZS0+YkludGVyZmFjZVN1YkNsYXNzID09IDEgJiYgLy8gU3RpbGwgSW1hZ2UgQ2FwdHVyZQorICAgICAgICAgICAgICAgIGludGVyZmFjZS0+YkludGVyZmFjZVByb3RvY29sID09IDEpICAgICAvLyBQaWN0dXJlIFRyYW5zZmVyIFByb3RvY29sIChQSU1BIDE1NDcwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIExPR0QoIkZvdW5kIGNhbWVyYTogXCIlc1wiIFwiJXNcIlxuIiwgdXNiX2RldmljZV9nZXRfbWFudWZhY3R1cmVyX25hbWUoZGV2aWNlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHVzYl9kZXZpY2VfZ2V0X3Byb2R1Y3RfbmFtZShkZXZpY2UpKTsKKworICAgICAgICAgICAgICAgIC8vIGludGVyZmFjZSBzaG91bGQgYmUgZm9sbG93ZWQgYnkgdGhyZWUgZW5kcG9pbnRzCisgICAgICAgICAgICAgICAgc3RydWN0IHVzYl9lbmRwb2ludF9kZXNjcmlwdG9yICplcDsKKyAgICAgICAgICAgICAgICBzdHJ1Y3QgdXNiX2VuZHBvaW50X2Rlc2NyaXB0b3IgKmVwX2luX2Rlc2MgPSBOVUxMOworICAgICAgICAgICAgICAgIHN0cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvciAqZXBfb3V0X2Rlc2MgPSBOVUxMOworICAgICAgICAgICAgICAgIHN0cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvciAqZXBfaW50cl9kZXNjID0gTlVMTDsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDM7IGkrKykgeworICAgICAgICAgICAgICAgICAgICBlcCA9IChzdHJ1Y3QgdXNiX2VuZHBvaW50X2Rlc2NyaXB0b3IgKil1c2JfZGVzY3JpcHRvcl9pdGVyX25leHQoJml0ZXIpOworICAgICAgICAgICAgICAgICAgICBpZiAoIWVwIHx8IGVwLT5iRGVzY3JpcHRvclR5cGUgIT0gVVNCX0RUX0VORFBPSU5UKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBMT0dFKCJlbmRwb2ludHMgbm90IGZvdW5kXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gZG9uZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAoZXAtPmJtQXR0cmlidXRlcyA9PSBVU0JfRU5EUE9JTlRfWEZFUl9CVUxLKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXAtPmJFbmRwb2ludEFkZHJlc3MgJiBVU0JfRU5EUE9JTlRfRElSX01BU0spCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXBfaW5fZGVzYyA9IGVwOworICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVwX291dF9kZXNjID0gZXA7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZXAtPmJtQXR0cmlidXRlcyA9PSBVU0JfRU5EUE9JTlRfWEZFUl9JTlQgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgIGVwLT5iRW5kcG9pbnRBZGRyZXNzICYgVVNCX0VORFBPSU5UX0RJUl9NQVNLKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBlcF9pbnRyX2Rlc2MgPSBlcDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoIWVwX2luX2Rlc2MgfHwgIWVwX291dF9kZXNjIHx8ICFlcF9pbnRyX2Rlc2MpIHsKKyAgICAgICAgICAgICAgICAgICAgTE9HRSgiZW5kcG9pbnRzIG5vdCBmb3VuZFxuIik7CisgICAgICAgICAgICAgICAgICAgIGdvdG8gZG9uZTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvLyBpZiB3ZSBnb3QgaGVyZSwgd2UgZm91bmQgYSBjYW1lcmEKKyAgICAgICAgICAgICAgICBKTklFbnYqIGVudiA9IEFuZHJvaWRSdW50aW1lOjpnZXRKTklFbnYoKTsKKyAgICAgICAgICAgICAgICBqb2JqZWN0IHRoaXogPSAoam9iamVjdCljbGllbnRfZGF0YTsKKworICAgICAgICAgICAgICAgIGludCBpZCA9IHVzYl9kZXZpY2VfZ2V0X3VuaXF1ZV9pZF9mcm9tX25hbWUoZGV2bmFtZSk7CisgICAgICAgICAgICAgICAgbURldmljZUxpc3QuYWRkKGlkKTsKKworICAgICAgICAgICAgICAgIGVudi0+Q2FsbFZvaWRNZXRob2QodGhpeiwgbWV0aG9kX3VzYkNhbWVyYUFkZGVkLCBpZCk7CisgICAgICAgICAgICAgICAgY2hlY2tBbmRDbGVhckV4Y2VwdGlvbkZyb21DYWxsYmFjayhlbnYsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Citkb25lOgorICAgIHVzYl9kZXZpY2VfY2xvc2UoZGV2aWNlKTsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCB1c2JfZGV2aWNlX3JlbW92ZWQoY29uc3QgY2hhciAqZGV2bmFtZSwgdm9pZCogY2xpZW50X2RhdGEpIHsKKyAgICBpbnQgaWQgPSB1c2JfZGV2aWNlX2dldF91bmlxdWVfaWRfZnJvbV9uYW1lKGRldm5hbWUpOworCisgICAgLy8gc2VlIGlmIGl0IGlzIGEgZGV2aWNlIHdlIGtub3cgYWJvdXQKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IG1EZXZpY2VMaXN0LnNpemUoKTsgaSsrKSB7CisgICAgICAgIGlmIChpZCAgPT0gbURldmljZUxpc3RbaV0pIHsKKyAgICAgICAgICAgIG1EZXZpY2VMaXN0LnJlbW92ZUF0KGkpOworCisgICAgICAgICAgICBKTklFbnYqIGVudiA9IEFuZHJvaWRSdW50aW1lOjpnZXRKTklFbnYoKTsKKyAgICAgICAgICAgIGpvYmplY3QgdGhpeiA9IChqb2JqZWN0KWNsaWVudF9kYXRhOworCisgICAgICAgICAgICBlbnYtPkNhbGxWb2lkTWV0aG9kKHRoaXosIG1ldGhvZF91c2JDYW1lcmFSZW1vdmVkLCBpZCk7CisgICAgICAgICAgICBjaGVja0FuZENsZWFyRXhjZXB0aW9uRnJvbUNhbGxiYWNrKGVudiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBhbmRyb2lkX3NlcnZlcl9Vc2JPYnNlcnZlcl9tb25pdG9yVXNiSG9zdEJ1cyhKTklFbnYgKmVudiwgam9iamVjdCB0aGl6KQoreworICAgIHN0cnVjdCB1c2JfaG9zdF9jb250ZXh0KiBjb250ZXh0ID0gdXNiX2hvc3RfaW5pdCgpOworICAgIGlmICghY29udGV4dCkgeworICAgICAgICBMT0dFKCJ1c2JfaG9zdF9pbml0IGZhaWxlZCIpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIC8vIHRoaXMgd2lsbCBuZXZlciByZXR1cm4gc28gaXQgaXMgc2FmZSB0byBwYXNzIHRoaXogZGlyZWN0bHkKKyAgICB1c2JfaG9zdF9ydW4oY29udGV4dCwgdXNiX2RldmljZV9hZGRlZCwgdXNiX2RldmljZV9yZW1vdmVkLCBOVUxMLCAodm9pZCAqKXRoaXopOworfQorCitzdGF0aWMgSk5JTmF0aXZlTWV0aG9kIG1ldGhvZF90YWJsZVtdID0geworICAgIHsgIm1vbml0b3JVc2JIb3N0QnVzIiwgIigpViIsICh2b2lkKilhbmRyb2lkX3NlcnZlcl9Vc2JPYnNlcnZlcl9tb25pdG9yVXNiSG9zdEJ1cyB9Cit9OworCitpbnQgcmVnaXN0ZXJfYW5kcm9pZF9zZXJ2ZXJfVXNiT2JzZXJ2ZXIoSk5JRW52ICplbnYpCit7CisgICAgamNsYXNzIGNsYXp6ID0gZW52LT5GaW5kQ2xhc3MoImNvbS9hbmRyb2lkL3NlcnZlci9Vc2JPYnNlcnZlciIpOworICAgIGlmIChjbGF6eiA9PSBOVUxMKSB7CisgICAgICAgIExPR0UoIkNhbid0IGZpbmQgY29tL2FuZHJvaWQvc2VydmVyL1VzYk9ic2VydmVyIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgbWV0aG9kX3VzYkNhbWVyYUFkZGVkID0gZW52LT5HZXRNZXRob2RJRChjbGF6eiwgInVzYkNhbWVyYUFkZGVkIiwgIihJKVYiKTsKKyAgICBpZiAobWV0aG9kX3VzYkNhbWVyYUFkZGVkID09IE5VTEwpIHsKKyAgICAgICAgTE9HRSgiQ2FuJ3QgZmluZCB1c2JDYW1lcmFBZGRlZCIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIG1ldGhvZF91c2JDYW1lcmFSZW1vdmVkID0gZW52LT5HZXRNZXRob2RJRChjbGF6eiwgInVzYkNhbWVyYVJlbW92ZWQiLCAiKEkpViIpOworICAgIGlmIChtZXRob2RfdXNiQ2FtZXJhUmVtb3ZlZCA9PSBOVUxMKSB7CisgICAgICAgIExPR0UoIkNhbid0IGZpbmQgdXNiQ2FtZXJhUmVtb3ZlZCIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgcmV0dXJuIGpuaVJlZ2lzdGVyTmF0aXZlTWV0aG9kcyhlbnYsICJjb20vYW5kcm9pZC9zZXJ2ZXIvVXNiT2JzZXJ2ZXIiLAorICAgICAgICAgICAgbWV0aG9kX3RhYmxlLCBORUxFTShtZXRob2RfdGFibGUpKTsKK30KKworfTsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2puaS9jb21fYW5kcm9pZF9zZXJ2ZXJfbG9jYXRpb25fR3BzTG9jYXRpb25Qcm92aWRlci5jcHAgYi9zZXJ2aWNlcy9qbmkvY29tX2FuZHJvaWRfc2VydmVyX2xvY2F0aW9uX0dwc0xvY2F0aW9uUHJvdmlkZXIuY3BwCmluZGV4IDU5ZDdjZGUuLjkzMDY4ZTYgMTAwNzU1Ci0tLSBhL3NlcnZpY2VzL2puaS9jb21fYW5kcm9pZF9zZXJ2ZXJfbG9jYXRpb25fR3BzTG9jYXRpb25Qcm92aWRlci5jcHAKKysrIGIvc2VydmljZXMvam5pL2NvbV9hbmRyb2lkX3NlcnZlcl9sb2NhdGlvbl9HcHNMb2NhdGlvblByb3ZpZGVyLmNwcApAQCAtMjQ1LDkgKzI0NSw5IEBACiAgICAgICAgIHNBR3BzSW50ZXJmYWNlLT5pbml0KCZzQUdwc0NhbGxiYWNrcyk7CiAKICAgICBpZiAoIXNHcHNOaUludGVyZmFjZSkKLSAgICAgICBzR3BzTmlJbnRlcmZhY2UgPSAoY29uc3QgR3BzTmlJbnRlcmZhY2UqKXNHcHNJbnRlcmZhY2UtPmdldF9leHRlbnNpb24oR1BTX05JX0lOVEVSRkFDRSk7CisgICAgICAgIHNHcHNOaUludGVyZmFjZSA9IChjb25zdCBHcHNOaUludGVyZmFjZSopc0dwc0ludGVyZmFjZS0+Z2V0X2V4dGVuc2lvbihHUFNfTklfSU5URVJGQUNFKTsKICAgICBpZiAoc0dwc05pSW50ZXJmYWNlKQotICAgICAgIHNHcHNOaUludGVyZmFjZS0+aW5pdCgmc0dwc05pQ2FsbGJhY2tzKTsKKyAgICAgICAgc0dwc05pSW50ZXJmYWNlLT5pbml0KCZzR3BzTmlDYWxsYmFja3MpOwogCiAgICAgaWYgKCFzR3BzRGVidWdJbnRlcmZhY2UpCiAgICAgICAgc0dwc0RlYnVnSW50ZXJmYWNlID0gKGNvbnN0IEdwc0RlYnVnSW50ZXJmYWNlKilzR3BzSW50ZXJmYWNlLT5nZXRfZXh0ZW5zaW9uKEdQU19ERUJVR19JTlRFUkZBQ0UpOwpAQCAtNDEzLDEyICs0MTMsMTAgQEAKIHN0YXRpYyB2b2lkIGFuZHJvaWRfbG9jYXRpb25fR3BzTG9jYXRpb25Qcm92aWRlcl9zZW5kX25pX3Jlc3BvbnNlKEpOSUVudiogZW52LCBqb2JqZWN0IG9iaiwKICAgICAgIGppbnQgbm90aWZJZCwgamludCByZXNwb25zZSkKIHsKLSAgICBpZiAoIXNHcHNOaUludGVyZmFjZSkgeworICAgIGlmICghc0dwc05pSW50ZXJmYWNlKQogICAgICAgICBzR3BzTmlJbnRlcmZhY2UgPSAoY29uc3QgR3BzTmlJbnRlcmZhY2UqKXNHcHNJbnRlcmZhY2UtPmdldF9leHRlbnNpb24oR1BTX05JX0lOVEVSRkFDRSk7Ci0gICAgfQotICAgIGlmIChzR3BzTmlJbnRlcmZhY2UpIHsKKyAgICBpZiAoc0dwc05pSW50ZXJmYWNlKQogICAgICAgICBzR3BzTmlJbnRlcmZhY2UtPnJlc3BvbmQobm90aWZJZCwgcmVzcG9uc2UpOwotICAgIH0KIH0KIAogc3RhdGljIGpzdHJpbmcgYW5kcm9pZF9sb2NhdGlvbl9HcHNMb2NhdGlvblByb3ZpZGVyX2dldF9pbnRlcm5hbF9zdGF0ZShKTklFbnYqIGVudiwgam9iamVjdCBvYmopCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9qbmkvb25sb2FkLmNwcCBiL3NlcnZpY2VzL2puaS9vbmxvYWQuY3BwCmluZGV4IGNkNGYwYTQuLjM1MDJhY2EgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2puaS9vbmxvYWQuY3BwCisrKyBiL3NlcnZpY2VzL2puaS9vbmxvYWQuY3BwCkBAIC05LDYgKzksNyBAQAogaW50IHJlZ2lzdGVyX2FuZHJvaWRfc2VydmVyX0lucHV0TWFuYWdlcihKTklFbnYqIGVudik7CiBpbnQgcmVnaXN0ZXJfYW5kcm9pZF9zZXJ2ZXJfTGlnaHRzU2VydmljZShKTklFbnYqIGVudik7CiBpbnQgcmVnaXN0ZXJfYW5kcm9pZF9zZXJ2ZXJfUG93ZXJNYW5hZ2VyU2VydmljZShKTklFbnYqIGVudik7CitpbnQgcmVnaXN0ZXJfYW5kcm9pZF9zZXJ2ZXJfVXNiT2JzZXJ2ZXIoSk5JRW52KiBlbnYpOwogaW50IHJlZ2lzdGVyX2FuZHJvaWRfc2VydmVyX1ZpYnJhdG9yU2VydmljZShKTklFbnYqIGVudik7CiBpbnQgcmVnaXN0ZXJfYW5kcm9pZF9zZXJ2ZXJfU3lzdGVtU2VydmVyKEpOSUVudiogZW52KTsKIGludCByZWdpc3Rlcl9hbmRyb2lkX3NlcnZlcl9sb2NhdGlvbl9HcHNMb2NhdGlvblByb3ZpZGVyKEpOSUVudiogZW52KTsKQEAgLTMyLDYgKzMzLDcgQEAKICAgICByZWdpc3Rlcl9hbmRyb2lkX3NlcnZlcl9MaWdodHNTZXJ2aWNlKGVudik7CiAgICAgcmVnaXN0ZXJfYW5kcm9pZF9zZXJ2ZXJfQWxhcm1NYW5hZ2VyU2VydmljZShlbnYpOwogICAgIHJlZ2lzdGVyX2FuZHJvaWRfc2VydmVyX0JhdHRlcnlTZXJ2aWNlKGVudik7CisgICAgcmVnaXN0ZXJfYW5kcm9pZF9zZXJ2ZXJfVXNiT2JzZXJ2ZXIoZW52KTsKICAgICByZWdpc3Rlcl9hbmRyb2lkX3NlcnZlcl9WaWJyYXRvclNlcnZpY2UoZW52KTsKICAgICByZWdpc3Rlcl9hbmRyb2lkX3NlcnZlcl9TeXN0ZW1TZXJ2ZXIoZW52KTsKICAgICByZWdpc3Rlcl9hbmRyb2lkX3NlcnZlcl9sb2NhdGlvbl9HcHNMb2NhdGlvblByb3ZpZGVyKGVudik7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9zdXJmYWNlZmxpbmdlci9BbmRyb2lkLm1rIGIvc2VydmljZXMvc3VyZmFjZWZsaW5nZXIvQW5kcm9pZC5tawppbmRleCBhMTRiZmI1Li5lNDgyNWQwIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9zdXJmYWNlZmxpbmdlci9BbmRyb2lkLm1rCisrKyBiL3NlcnZpY2VzL3N1cmZhY2VmbGluZ2VyL0FuZHJvaWQubWsKQEAgLTUsNiArNSw3IEBACiAgICAgY2x6LmNwcC5hcm0gXAogICAgIERpc3BsYXlIYXJkd2FyZS9EaXNwbGF5SGFyZHdhcmUuY3BwIFwKICAgICBEaXNwbGF5SGFyZHdhcmUvRGlzcGxheUhhcmR3YXJlQmFzZS5jcHAgXAorICAgIERpc3BsYXlIYXJkd2FyZS9IV0NvbXBvc2VyLmNwcCBcCiAgICAgQmx1ckZpbHRlci5jcHAuYXJtIFwKICAgICBHTEV4dGVuc2lvbnMuY3BwIFwKICAgICBMYXllci5jcHAgXApAQCAtMjEsNyArMjIsNyBAQAogTE9DQUxfQ0ZMQUdTICs9IC1ER0xfR0xFWFRfUFJPVE9UWVBFUyAtREVHTF9FR0xFWFRfUFJPVE9UWVBFUwogCiBpZmVxICgkKFRBUkdFVF9CT0FSRF9QTEFURk9STSksIG9tYXAzKQotCUxPQ0FMX0NGTEFHUyArPSAtRE5PX1JHQlhfODg4OAorCUxPQ0FMX0NGTEFHUyArPSAtRE5PX1JHQlhfODg4OCAtREhBU19QVVNIX0JVRkZFUlMKIGVuZGlmCiAKICMgbmVlZCAiLWxydCIgb24gTGludXggc2ltdWxhdG9yIHRvIHBpY2sgdXAgY2xvY2tfZ2V0dGltZQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvc3VyZmFjZWZsaW5nZXIvRGlzcGxheUhhcmR3YXJlL0Rpc3BsYXlIYXJkd2FyZS5jcHAgYi9zZXJ2aWNlcy9zdXJmYWNlZmxpbmdlci9EaXNwbGF5SGFyZHdhcmUvRGlzcGxheUhhcmR3YXJlLmNwcAppbmRleCAwNTE1MTEwLi5iZDM0OGJmIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9zdXJmYWNlZmxpbmdlci9EaXNwbGF5SGFyZHdhcmUvRGlzcGxheUhhcmR3YXJlLmNwcAorKysgYi9zZXJ2aWNlcy9zdXJmYWNlZmxpbmdlci9EaXNwbGF5SGFyZHdhcmUvRGlzcGxheUhhcmR3YXJlLmNwcApAQCAtMzYsMTEgKzM2LDExIEBACiAKICNpbmNsdWRlICJEaXNwbGF5SGFyZHdhcmUvRGlzcGxheUhhcmR3YXJlLmgiCiAKLSNpbmNsdWRlIDxoYXJkd2FyZS9jb3B5Yml0Lmg+CiAjaW5jbHVkZSA8aGFyZHdhcmUvb3ZlcmxheS5oPgogI2luY2x1ZGUgPGhhcmR3YXJlL2dyYWxsb2MuaD4KIAogI2luY2x1ZGUgIkdMRXh0ZW5zaW9ucy5oIgorI2luY2x1ZGUgIkhXQ29tcG9zZXIuaCIKIAogdXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7CiAKQEAgLTc2LDcgKzc2LDcgQEAKICAgICAgICAgY29uc3Qgc3A8U3VyZmFjZUZsaW5nZXI+JiBmbGluZ2VyLAogICAgICAgICB1aW50MzJfdCBkcHkpCiAgICAgOiBEaXNwbGF5SGFyZHdhcmVCYXNlKGZsaW5nZXIsIGRweSksCi0gICAgICBtRmxhZ3MoMCkKKyAgICAgIG1GbGFncygwKSwgbUh3YygwKQogewogICAgIGluaXQoZHB5KTsKIH0KQEAgLTI2Miw2ICsyNjIsMTcgQEAKIAogICAgIC8vIFVuYmluZCB0aGUgY29udGV4dCBmcm9tIHRoaXMgdGhyZWFkCiAgICAgZWdsTWFrZUN1cnJlbnQoZGlzcGxheSwgRUdMX05PX1NVUkZBQ0UsIEVHTF9OT19TVVJGQUNFLCBFR0xfTk9fQ09OVEVYVCk7CisKKworICAgIC8vIGluaXRpYWxpemUgdGhlIEgvVyBjb21wb3NlcgorICAgIG1Id2MgPSBuZXcgSFdDb21wb3NlcigpOworICAgIGlmIChtSHdjLT5pbml0Q2hlY2soKSA9PSBOT19FUlJPUikgeworICAgICAgICBtSHdjLT5zZXRGcmFtZUJ1ZmZlcihtRGlzcGxheSwgbVN1cmZhY2UpOworICAgIH0KK30KKworSFdDb21wb3NlciYgRGlzcGxheUhhcmR3YXJlOjpnZXRId0NvbXBvc2VyKCkgY29uc3QgeworICAgIHJldHVybiAqbUh3YzsKIH0KIAogLyoKQEAgLTI4MSw2ICsyOTIsOSBAQAogdm9pZCBEaXNwbGF5SGFyZHdhcmU6OnJlbGVhc2VTY3JlZW4oKSBjb25zdAogewogICAgIERpc3BsYXlIYXJkd2FyZUJhc2U6OnJlbGVhc2VTY3JlZW4oKTsKKyAgICBpZiAobUh3Yy0+aW5pdENoZWNrKCkgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgbUh3Yy0+cmVsZWFzZSgpOworICAgIH0KIH0KIAogdm9pZCBEaXNwbGF5SGFyZHdhcmU6OmFjcXVpcmVTY3JlZW4oKSBjb25zdApAQCAtMzIxLDcgKzMzNSwxMiBAQAogICAgIH0KICAgICAKICAgICBtUGFnZUZsaXBDb3VudCsrOwotICAgIGVnbFN3YXBCdWZmZXJzKGRweSwgc3VyZmFjZSk7CisKKyAgICBpZiAobUh3Yy0+aW5pdENoZWNrKCkgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgbUh3Yy0+Y29tbWl0KCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZWdsU3dhcEJ1ZmZlcnMoZHB5LCBzdXJmYWNlKTsKKyAgICB9CiAgICAgY2hlY2tFR0xFcnJvcnMoImVnbFN3YXBCdWZmZXJzIik7CiAKICAgICAvLyBmb3IgZGVidWdnaW5nCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9zdXJmYWNlZmxpbmdlci9EaXNwbGF5SGFyZHdhcmUvRGlzcGxheUhhcmR3YXJlLmggYi9zZXJ2aWNlcy9zdXJmYWNlZmxpbmdlci9EaXNwbGF5SGFyZHdhcmUvRGlzcGxheUhhcmR3YXJlLmgKaW5kZXggMmQ3OTAwYy4uNzViNTVkZiAxMDA2NDQKLS0tIGEvc2VydmljZXMvc3VyZmFjZWZsaW5nZXIvRGlzcGxheUhhcmR3YXJlL0Rpc3BsYXlIYXJkd2FyZS5oCisrKyBiL3NlcnZpY2VzL3N1cmZhY2VmbGluZ2VyL0Rpc3BsYXlIYXJkd2FyZS9EaXNwbGF5SGFyZHdhcmUuaApAQCAtMzQsMTIgKzM0LDExIEBACiAjaW5jbHVkZSAiRGlzcGxheUhhcmR3YXJlL0Rpc3BsYXlIYXJkd2FyZUJhc2UuaCIKIAogc3RydWN0IG92ZXJsYXlfY29udHJvbF9kZXZpY2VfdDsKLXN0cnVjdCBmcmFtZWJ1ZmZlcl9kZXZpY2VfdDsKLXN0cnVjdCBjb3B5Yml0X2ltYWdlX3Q7CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogY2xhc3MgRnJhbWVidWZmZXJOYXRpdmVXaW5kb3c7CitjbGFzcyBIV0NvbXBvc2VyOwogCiBjbGFzcyBEaXNwbGF5SGFyZHdhcmUgOiBwdWJsaWMgRGlzcGxheUhhcmR3YXJlQmFzZQogewpAQCAtODAsNiArNzksOSBAQAogICAgIHVpbnQzMl90IGdldFBhZ2VGbGlwQ291bnQoKSBjb25zdDsKICAgICBFR0xEaXNwbGF5IGdldEVHTERpc3BsYXkoKSBjb25zdCB7IHJldHVybiBtRGlzcGxheTsgfQogICAgIG92ZXJsYXlfY29udHJvbF9kZXZpY2VfdCogZ2V0T3ZlcmxheUVuZ2luZSgpIGNvbnN0IHsgcmV0dXJuIG1PdmVybGF5RW5naW5lOyB9CisKKyAgICAvLyBIYXJkd2FyZSBDb21wb3NlcgorICAgIEhXQ29tcG9zZXImIGdldEh3Q29tcG9zZXIoKSBjb25zdDsKICAgICAKICAgICBzdGF0dXNfdCBjb21wb3NpdGlvbkNvbXBsZXRlKCkgY29uc3Q7CiAgICAgCkBAIC0xMTAsNiArMTEyLDggQEAKICAgICBHTGludCAgICAgICAgICAgbU1heFZpZXdwb3J0RGltczsKICAgICBHTGludCAgICAgICAgICAgbU1heFRleHR1cmVTaXplOwogICAgIAorICAgIEhXQ29tcG9zZXIqICAgICBtSHdjOworCiAgICAgc3A8RnJhbWVidWZmZXJOYXRpdmVXaW5kb3c+IG1OYXRpdmVXaW5kb3c7CiAgICAgb3ZlcmxheV9jb250cm9sX2RldmljZV90KiBtT3ZlcmxheUVuZ2luZTsKIH07CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9zdXJmYWNlZmxpbmdlci9EaXNwbGF5SGFyZHdhcmUvSFdDb21wb3Nlci5jcHAgYi9zZXJ2aWNlcy9zdXJmYWNlZmxpbmdlci9EaXNwbGF5SGFyZHdhcmUvSFdDb21wb3Nlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTI5YmU0ZQotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL3N1cmZhY2VmbGluZ2VyL0Rpc3BsYXlIYXJkd2FyZS9IV0NvbXBvc2VyLmNwcApAQCAtMCwwICsxLDEwNCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCisjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+CisKKyNpbmNsdWRlIDxoYXJkd2FyZS9oYXJkd2FyZS5oPgorCisjaW5jbHVkZSA8Y3V0aWxzL2xvZy5oPgorCisjaW5jbHVkZSA8RUdML2VnbC5oPgorCisjaW5jbHVkZSAiSFdDb21wb3Nlci5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworSFdDb21wb3Nlcjo6SFdDb21wb3NlcigpCisgICAgOiBtTW9kdWxlKDApLCBtSHdjKDApLCBtTGlzdCgwKSwgbUNhcGFjaXR5KDApLAorICAgICAgbURweShFR0xfTk9fRElTUExBWSksIG1TdXIoRUdMX05PX1NVUkZBQ0UpCit7CisgICAgaW50IGVyciA9IGh3X2dldF9tb2R1bGUoSFdDX0hBUkRXQVJFX01PRFVMRV9JRCwgJm1Nb2R1bGUpOworICAgIExPR1dfSUYoZXJyLCAiJXMgbW9kdWxlIG5vdCBmb3VuZCIsIEhXQ19IQVJEV0FSRV9NT0RVTEVfSUQpOworICAgIGlmIChlcnIgPT0gMCkgeworICAgICAgICBlcnIgPSBod2Nfb3BlbihtTW9kdWxlLCAmbUh3Yyk7CisgICAgICAgIExPR0VfSUYoZXJyLCAiJXMgZGV2aWNlIGZhaWxlZCB0byBpbml0aWFsaXplICglcykiLAorICAgICAgICAgICAgICAgIEhXQ19IQVJEV0FSRV9DT01QT1NFUiwgc3RyZXJyb3IoLWVycikpOworICAgIH0KK30KKworSFdDb21wb3Nlcjo6fkhXQ29tcG9zZXIoKSB7CisgICAgZnJlZShtTGlzdCk7CisgICAgaWYgKG1Id2MpIHsKKyAgICAgICAgaHdjX2Nsb3NlKG1Id2MpOworICAgIH0KK30KKworc3RhdHVzX3QgSFdDb21wb3Nlcjo6aW5pdENoZWNrKCkgY29uc3QgeworICAgIHJldHVybiBtSHdjID8gTk9fRVJST1IgOiBOT19JTklUOworfQorCit2b2lkIEhXQ29tcG9zZXI6OnNldEZyYW1lQnVmZmVyKEVHTERpc3BsYXkgZHB5LCBFR0xTdXJmYWNlIHN1cikgeworICAgIG1EcHkgPSAoaHdjX2Rpc3BsYXlfdClkcHk7CisgICAgbVN1ciA9IChod2Nfc3VyZmFjZV90KXN1cjsKK30KKworc3RhdHVzX3QgSFdDb21wb3Nlcjo6Y3JlYXRlV29ya0xpc3Qoc2l6ZV90IG51bUxheWVycykgeworICAgIGlmIChtSHdjKSB7CisgICAgICAgIGlmICghbUxpc3QgfHwgbUNhcGFjaXR5IDwgbnVtTGF5ZXJzKSB7CisgICAgICAgICAgICBmcmVlKG1MaXN0KTsKKyAgICAgICAgICAgIHNpemVfdCBzaXplID0gc2l6ZW9mKGh3Y19sYXllcl9saXN0KSArIG51bUxheWVycypzaXplb2YoaHdjX2xheWVyX3QpOworICAgICAgICAgICAgbUxpc3QgPSAoaHdjX2xheWVyX2xpc3RfdCopbWFsbG9jKHNpemUpOworICAgICAgICAgICAgbUNhcGFjaXR5ID0gbnVtTGF5ZXJzOworICAgICAgICB9CisgICAgICAgIG1MaXN0LT5mbGFncyA9IEhXQ19HRU9NRVRSWV9DSEFOR0VEOworICAgICAgICBtTGlzdC0+bnVtSHdMYXllcnMgPSBudW1MYXllcnM7CisgICAgfQorICAgIHJldHVybiBOT19FUlJPUjsKK30KKworc3RhdHVzX3QgSFdDb21wb3Nlcjo6cHJlcGFyZSgpIGNvbnN0IHsKKyAgICBpbnQgZXJyID0gbUh3Yy0+cHJlcGFyZShtSHdjLCBtTGlzdCk7CisgICAgcmV0dXJuIChzdGF0dXNfdCllcnI7Cit9CisKK3N0YXR1c190IEhXQ29tcG9zZXI6OmNvbW1pdCgpIGNvbnN0IHsKKyAgICBpbnQgZXJyID0gbUh3Yy0+c2V0KG1Id2MsIG1EcHksIG1TdXIsIG1MaXN0KTsKKyAgICBtTGlzdC0+ZmxhZ3MgJj0gfkhXQ19HRU9NRVRSWV9DSEFOR0VEOworICAgIHJldHVybiAoc3RhdHVzX3QpZXJyOworfQorCitzdGF0dXNfdCBIV0NvbXBvc2VyOjpyZWxlYXNlKCkgY29uc3QgeworICAgIGludCBlcnIgPSBtSHdjLT5zZXQobUh3YywgTlVMTCwgTlVMTCwgTlVMTCk7CisgICAgcmV0dXJuIChzdGF0dXNfdCllcnI7Cit9CisKK3NpemVfdCBIV0NvbXBvc2VyOjpnZXROdW1MYXllcnMoKSBjb25zdCB7CisgICAgcmV0dXJuIG1MaXN0ID8gbUxpc3QtPm51bUh3TGF5ZXJzIDogMDsKK30KKworaHdjX2xheWVyX3QqIEhXQ29tcG9zZXI6OmdldExheWVycygpIGNvbnN0IHsKKyAgICByZXR1cm4gbUxpc3QgPyBtTGlzdC0+aHdMYXllcnMgOiAwOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9zdXJmYWNlZmxpbmdlci9EaXNwbGF5SGFyZHdhcmUvSFdDb21wb3Nlci5oIGIvc2VydmljZXMvc3VyZmFjZWZsaW5nZXIvRGlzcGxheUhhcmR3YXJlL0hXQ29tcG9zZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMmZmMTBjCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvc3VyZmFjZWZsaW5nZXIvRGlzcGxheUhhcmR3YXJlL0hXQ29tcG9zZXIuaApAQCAtMCwwICsxLDcwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX1NGX0hXQ09NUE9TRVJfSAorI2RlZmluZSBBTkRST0lEX1NGX0hXQ09NUE9TRVJfSAorCisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisKKyNpbmNsdWRlIDxFR0wvZWdsLmg+CisKKyNpbmNsdWRlIDxoYXJkd2FyZS9od2NvbXBvc2VyLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitjbGFzcyBIV0NvbXBvc2VyCit7CitwdWJsaWM6CisKKyAgICBIV0NvbXBvc2VyKCk7CisgICAgfkhXQ29tcG9zZXIoKTsKKworICAgIHN0YXR1c190IGluaXRDaGVjaygpIGNvbnN0OworCisgICAgLy8gdGVsbHMgdGhlIEhBTCB3aGF0IHRoZSBmcmFtZWJ1ZmZlciBpcworICAgIHZvaWQgc2V0RnJhbWVCdWZmZXIoRUdMRGlzcGxheSBkcHksIEVHTFN1cmZhY2Ugc3VyKTsKKworICAgIC8vIGNyZWF0ZSBhIHdvcmsgbGlzdCBmb3IgbnVtTGF5ZXJzIGxheWVyCisgICAgc3RhdHVzX3QgY3JlYXRlV29ya0xpc3Qoc2l6ZV90IG51bUxheWVycyk7CisKKyAgICAvLyBBc2tzIHRoZSBIQUwgd2hhdCBpdCBjYW4gZG8KKyAgICBzdGF0dXNfdCBwcmVwYXJlKCkgY29uc3Q7CisKKyAgICAvLyBjb21taXRzIHRoZSBsaXN0CisgICAgc3RhdHVzX3QgY29tbWl0KCkgY29uc3Q7CisKKyAgICAvLyByZWxlYXNlIGhhcmR3YXJlIHJlc291cmNlcworICAgIHN0YXR1c190IHJlbGVhc2UoKSBjb25zdDsKKworICAgIHNpemVfdCBnZXROdW1MYXllcnMoKSBjb25zdDsKKyAgICBod2NfbGF5ZXJfdCogZ2V0TGF5ZXJzKCkgY29uc3Q7CisKK3ByaXZhdGU6CisgICAgaHdfbW9kdWxlX3QgY29uc3QqICAgICAgbU1vZHVsZTsKKyAgICBod2NfY29tcG9zZXJfZGV2aWNlX3QqICBtSHdjOworICAgIGh3Y19sYXllcl9saXN0X3QqICAgICAgIG1MaXN0OworICAgIHNpemVfdCAgICAgICAgICAgICAgICAgIG1DYXBhY2l0eTsKKyAgICBod2NfZGlzcGxheV90ICAgICAgICAgICBtRHB5OworICAgIGh3Y19zdXJmYWNlX3QgICAgICAgICAgIG1TdXI7Cit9OworCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmIC8vIEFORFJPSURfU0ZfSFdDT01QT1NFUl9ICmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9zdXJmYWNlZmxpbmdlci9MYXllci5jcHAgYi9zZXJ2aWNlcy9zdXJmYWNlZmxpbmdlci9MYXllci5jcHAKaW5kZXggNjk1Y2JmYS4uMTk0YzI5NSAxMDA2NDQKLS0tIGEvc2VydmljZXMvc3VyZmFjZWZsaW5nZXIvTGF5ZXIuY3BwCisrKyBiL3NlcnZpY2VzL3N1cmZhY2VmbGluZ2VyL0xheWVyLmNwcApAQCAtMzUsNiArMzUsNyBAQAogI2luY2x1ZGUgIkxheWVyLmgiCiAjaW5jbHVkZSAiU3VyZmFjZUZsaW5nZXIuaCIKICNpbmNsdWRlICJEaXNwbGF5SGFyZHdhcmUvRGlzcGxheUhhcmR3YXJlLmgiCisjaW5jbHVkZSAiRGlzcGxheUhhcmR3YXJlL0hXQ29tcG9zZXIuaCIKIAogCiAjZGVmaW5lIERFQlVHX1JFU0laRSAgICAwCkBAIC0xODEsNiArMTgyLDYyIEBACiAgICAgcmV0dXJuIE5PX0VSUk9SOwogfQogCit2b2lkIExheWVyOjpzZXRHZW9tZXRyeShod2NfbGF5ZXJfdCogaHdjbCkKK3sKKyAgICBod2NsLT5jb21wb3NpdGlvblR5cGUgPSBIV0NfRlJBTUVCVUZGRVI7CisgICAgaHdjbC0+aGludHMgPSAwOworICAgIGh3Y2wtPmZsYWdzID0gMDsKKyAgICBod2NsLT50cmFuc2Zvcm0gPSAwOworICAgIGh3Y2wtPmJsZW5kaW5nID0gSFdDX0JMRU5ESU5HX05PTkU7CisKKyAgICAvLyB3ZSBjYW4ndCBkbyBhbHBoYS1mYWRlIHdpdGggdGhlIGh3YyBIQUwKKyAgICBjb25zdCBTdGF0ZSYgcyhkcmF3aW5nU3RhdGUoKSk7CisgICAgaWYgKHMuYWxwaGEgPCAweEZGKSB7CisgICAgICAgIGh3Y2wtPmZsYWdzID0gSFdDX1NLSVBfTEFZRVI7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvLyB3ZSBjYW4gb25seSBoYW5kbGUgc2ltcGxlIHRyYW5zZm9ybWF0aW9uCisgICAgaWYgKG1PcmllbnRhdGlvbiAmIFRyYW5zZm9ybTo6Uk9UX0lOVkFMSUQpIHsKKyAgICAgICAgaHdjbC0+ZmxhZ3MgPSBIV0NfU0tJUF9MQVlFUjsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGh3Y2wtPnRyYW5zZm9ybSA9IG1PcmllbnRhdGlvbjsKKworICAgIGlmIChuZWVkc0JsZW5kaW5nKCkpIHsKKyAgICAgICAgaHdjbC0+YmxlbmRpbmcgPSBtUHJlbXVsdGlwbGllZEFscGhhID8KKyAgICAgICAgICAgICAgICBIV0NfQkxFTkRJTkdfUFJFTVVMVCA6IEhXQ19CTEVORElOR19DT1ZFUkFHRTsKKyAgICB9CisKKyAgICBod2NsLT5kaXNwbGF5RnJhbWUubGVmdCAgID0gbVRyYW5zZm9ybWVkQm91bmRzLmxlZnQ7CisgICAgaHdjbC0+ZGlzcGxheUZyYW1lLnRvcCAgICA9IG1UcmFuc2Zvcm1lZEJvdW5kcy50b3A7CisgICAgaHdjbC0+ZGlzcGxheUZyYW1lLnJpZ2h0ICA9IG1UcmFuc2Zvcm1lZEJvdW5kcy5yaWdodDsKKyAgICBod2NsLT5kaXNwbGF5RnJhbWUuYm90dG9tID0gbVRyYW5zZm9ybWVkQm91bmRzLmJvdHRvbTsKKworICAgIGh3Y2wtPnZpc2libGVSZWdpb25TY3JlZW4ucmVjdHMgPQorICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxod2NfcmVjdF90IGNvbnN0ICo+KAorICAgICAgICAgICAgICAgICAgICB2aXNpYmxlUmVnaW9uU2NyZWVuLmdldEFycmF5KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICZod2NsLT52aXNpYmxlUmVnaW9uU2NyZWVuLm51bVJlY3RzKSk7Cit9CisKK3ZvaWQgTGF5ZXI6OnNldFBlckZyYW1lRGF0YShod2NfbGF5ZXJfdCogaHdjbCkgeworICAgIHNwPEdyYXBoaWNCdWZmZXI+IGJ1ZmZlcihtQnVmZmVyTWFuYWdlci5nZXRBY3RpdmVCdWZmZXIoKSk7CisgICAgaWYgKGJ1ZmZlciA9PSBOVUxMKSB7CisgICAgICAgIC8vIHRoaXMgc2l0dWF0aW9uIGNhbiBoYXBwZW4gaWYgd2UgcmFuIG91dCBvZiBtZW1vcnkgZm9yIGluc3RhbmNlLgorICAgICAgICAvLyBub3QgbXVjaCB3ZSBjYW4gZG8uIGNvbnRpbnVlIHRvIHVzZSB3aGF0ZXZlciB0ZXh0dXJlIHdhcyBib3VuZAorICAgICAgICAvLyB0byB0aGlzIGNvbnRleHQuCisgICAgICAgIGh3Y2wtPmhhbmRsZSA9IE5VTEw7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgaHdjbC0+aGFuZGxlID0gY29uc3RfY2FzdDxuYXRpdmVfaGFuZGxlX3QqPihidWZmZXItPmhhbmRsZSk7CisgICAgLy8gVE9ETzogc2V0IHRoZSBjcm9wIHZhbHVlIHByb3Blcmx5CisgICAgaHdjbC0+c291cmNlQ3JvcC5sZWZ0ICAgPSAwOworICAgIGh3Y2wtPnNvdXJjZUNyb3AudG9wICAgID0gMDsKKyAgICBod2NsLT5zb3VyY2VDcm9wLnJpZ2h0ICA9IGJ1ZmZlci0+d2lkdGg7CisgICAgaHdjbC0+c291cmNlQ3JvcC5ib3R0b20gPSBidWZmZXItPmhlaWdodDsKK30KKwogdm9pZCBMYXllcjo6cmVsb2FkVGV4dHVyZShjb25zdCBSZWdpb24mIGRpcnR5KQogewogICAgIHNwPEdyYXBoaWNCdWZmZXI+IGJ1ZmZlcihtQnVmZmVyTWFuYWdlci5nZXRBY3RpdmVCdWZmZXIoKSk7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9zdXJmYWNlZmxpbmdlci9MYXllci5oIGIvc2VydmljZXMvc3VyZmFjZWZsaW5nZXIvTGF5ZXIuaAppbmRleCBlMWQyODNiLi4xODhkYTZhIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9zdXJmYWNlZmxpbmdlci9MYXllci5oCisrKyBiL3NlcnZpY2VzL3N1cmZhY2VmbGluZ2VyL0xheWVyLmgKQEAgLTY4LDYgKzY4LDggQEAKICAgICBib29sIGlzRml4ZWRTaXplKCkgY29uc3Q7CiAKICAgICAvLyBMYXllckJhc2UgaW50ZXJmYWNlCisgICAgdmlydHVhbCB2b2lkIHNldEdlb21ldHJ5KGh3Y19sYXllcl90KiBod2NsKTsKKyAgICB2aXJ0dWFsIHZvaWQgc2V0UGVyRnJhbWVEYXRhKGh3Y19sYXllcl90KiBod2NsKTsKICAgICB2aXJ0dWFsIHZvaWQgb25EcmF3KGNvbnN0IFJlZ2lvbiYgY2xpcCkgY29uc3Q7CiAgICAgdmlydHVhbCB1aW50MzJfdCBkb1RyYW5zYWN0aW9uKHVpbnQzMl90IHRyYW5zYWN0aW9uRmxhZ3MpOwogICAgIHZpcnR1YWwgdm9pZCBsb2NrUGFnZUZsaXAoYm9vbCYgcmVjb21wdXRlVmlzaWJsZVJlZ2lvbnMpOwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvc3VyZmFjZWZsaW5nZXIvTGF5ZXJCYXNlLmNwcCBiL3NlcnZpY2VzL3N1cmZhY2VmbGluZ2VyL0xheWVyQmFzZS5jcHAKaW5kZXggNmZjNTAxMC4uM2QwNDlhNyAxMDA2NDQKLS0tIGEvc2VydmljZXMvc3VyZmFjZWZsaW5nZXIvTGF5ZXJCYXNlLmNwcAorKysgYi9zZXJ2aWNlcy9zdXJmYWNlZmxpbmdlci9MYXllckJhc2UuY3BwCkBAIC0zMDksNiArMzA5LDE1IEBACiAgICAgfQogfQogCit2b2lkIExheWVyQmFzZTo6c2V0R2VvbWV0cnkoaHdjX2xheWVyX3QqIGh3Y2wpIHsKKyAgICBod2NsLT5mbGFncyB8PSBIV0NfU0tJUF9MQVlFUjsKK30KKwordm9pZCBMYXllckJhc2U6OnNldFBlckZyYW1lRGF0YShod2NfbGF5ZXJfdCogaHdjbCkgeworICAgIGh3Y2wtPmNvbXBvc2l0aW9uVHlwZSA9IEhXQ19GUkFNRUJVRkZFUjsKKyAgICBod2NsLT5oYW5kbGUgPSBOVUxMOworfQorCiB2b2lkIExheWVyQmFzZTo6ZHJhdyhjb25zdCBSZWdpb24mIGNsaXApIGNvbnN0CiB7CiAgICAgLy8gcmVzZXQgR0wgc3RhdGUKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL3N1cmZhY2VmbGluZ2VyL0xheWVyQmFzZS5oIGIvc2VydmljZXMvc3VyZmFjZWZsaW5nZXIvTGF5ZXJCYXNlLmgKaW5kZXggOGNiYTI4Ny4uYzY2ZGMzNCAxMDA2NDQKLS0tIGEvc2VydmljZXMvc3VyZmFjZWZsaW5nZXIvTGF5ZXJCYXNlLmgKKysrIGIvc2VydmljZXMvc3VyZmFjZWZsaW5nZXIvTGF5ZXJCYXNlLmgKQEAgLTM1LDYgKzM1LDggQEAKIAogI2luY2x1ZGUgPHBpeGVsZmxpbmdlci9waXhlbGZsaW5nZXIuaD4KIAorI2luY2x1ZGUgPGhhcmR3YXJlL2h3Y29tcG9zZXIuaD4KKwogI2luY2x1ZGUgIlRyYW5zZm9ybS5oIgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CkBAIC0xMDgsNiArMTEwLDEwIEBACiAKICAgICB2aXJ0dWFsIGNvbnN0IGNoYXIqIGdldFR5cGVJZCgpIGNvbnN0IHsgcmV0dXJuICJMYXllckJhc2UiOyB9CiAKKyAgICB2aXJ0dWFsIHZvaWQgc2V0R2VvbWV0cnkoaHdjX2xheWVyX3QqIGh3Y2wpOworCisgICAgdmlydHVhbCB2b2lkIHNldFBlckZyYW1lRGF0YShod2NfbGF5ZXJfdCogaHdjbCk7CisKICAgICAvKioKICAgICAgKiBkcmF3IC0gcGVyZm9ybXMgc29tZSBnbG9iYWwgY2xpcHBpbmcgb3B0aW1pemF0aW9ucwogICAgICAqIGFuZCBjYWxscyBvbkRyYXcoKS4KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL3N1cmZhY2VmbGluZ2VyL1N1cmZhY2VGbGluZ2VyLmNwcCBiL3NlcnZpY2VzL3N1cmZhY2VmbGluZ2VyL1N1cmZhY2VGbGluZ2VyLmNwcAppbmRleCBmMTk5Y2E5Li41YTI3ZmM1IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9zdXJmYWNlZmxpbmdlci9TdXJmYWNlRmxpbmdlci5jcHAKKysrIGIvc2VydmljZXMvc3VyZmFjZWZsaW5nZXIvU3VyZmFjZUZsaW5nZXIuY3BwCkBAIC01Myw2ICs1Myw3IEBACiAjaW5jbHVkZSAiU3VyZmFjZUZsaW5nZXIuaCIKIAogI2luY2x1ZGUgIkRpc3BsYXlIYXJkd2FyZS9EaXNwbGF5SGFyZHdhcmUuaCIKKyNpbmNsdWRlICJEaXNwbGF5SGFyZHdhcmUvSFdDb21wb3Nlci5oIgogCiAvKiBpZGVhbGx5IEFJRF9HUkFQSElDUyB3b3VsZCBiZSBpbiBhIHNlbWktcHVibGljIGhlYWRlcgogICogb3IgdGhlcmUgd291bGQgYmUgYSB3YXkgdG8gbWFwIGEgdXNlci9ncm91cCBuYW1lIHRvIGl0cyBpZApAQCAtNzcsNiArNzgsNyBAQAogICAgICAgICBtQWNjZXNzU3VyZmFjZUZsaW5nZXIoImFuZHJvaWQucGVybWlzc2lvbi5BQ0NFU1NfU1VSRkFDRV9GTElOR0VSIiksCiAgICAgICAgIG1EdW1wKCJhbmRyb2lkLnBlcm1pc3Npb24uRFVNUCIpLAogICAgICAgICBtVmlzaWJsZVJlZ2lvbnNEaXJ0eShmYWxzZSksCisgICAgICAgIG1Id1dvcmtMaXN0RGlydHkoZmFsc2UpLAogICAgICAgICBtRGVmZXJSZWxlYXNlQ29uc29sZShmYWxzZSksCiAgICAgICAgIG1GcmVlemVEaXNwbGF5KGZhbHNlKSwKICAgICAgICAgbUZyZWV6ZUNvdW50KDApLApAQCAtMTY0LDcgKzE2Niw3IEBACiB7CiAgICAgY29uc3QgbnNlY3NfdCBub3cgPSBzeXN0ZW1UaW1lKCk7CiAgICAgY29uc3QgbnNlY3NfdCBkdXJhdGlvbiA9IG5vdyAtIG1Cb290VGltZTsKLSAgICBMT0dJKCJCb290IGlzIGZpbmlzaGVkICglbGQgbXMpIiwgbG9uZyhuczJtcyhkdXJhdGlvbikpICk7ICAKKyAgICBMT0dJKCJCb290IGlzIGZpbmlzaGVkICglbGQgbXMpIiwgbG9uZyhuczJtcyhkdXJhdGlvbikpICk7CiAgICAgbUJvb3RGaW5pc2hlZCA9IHRydWU7CiAgICAgcHJvcGVydHlfc2V0KCJjdGwuc3RvcCIsICJib290YW5pbSIpOwogfQpAQCAtMjAwLDEwICsyMDIsMTAgQEAKICAgICBtU2VydmVySGVhcCA9IG5ldyBNZW1vcnlIZWFwQmFzZSg0MDk2LAogICAgICAgICAgICAgTWVtb3J5SGVhcEJhc2U6OlJFQURfT05MWSwgIlN1cmZhY2VGbGluZ2VyIHJlYWQtb25seSBoZWFwIik7CiAgICAgTE9HRV9JRihtU2VydmVySGVhcD09MCwgImNhbid0IGNyZWF0ZSBzaGFyZWQgbWVtb3J5IGRlYWxlciIpOwotICAgIAorCiAgICAgbVNlcnZlckNibGsgPSBzdGF0aWNfY2FzdDxzdXJmYWNlX2ZsaW5nZXJfY2Jsa190Kj4obVNlcnZlckhlYXAtPmdldEJhc2UoKSk7CiAgICAgTE9HRV9JRihtU2VydmVyQ2Jsaz09MCwgImNhbid0IGdldCB0byBzaGFyZWQgY29udHJvbCBibG9jaydzIGFkZHJlc3MiKTsKLSAgICAKKwogICAgIG5ldyhtU2VydmVyQ2Jsaykgc3VyZmFjZV9mbGluZ2VyX2NibGtfdDsKIAogICAgIC8vIGluaXRpYWxpemUgcHJpbWFyeSBzY3JlZW4KQEAgLTIzMiw3ICsyMzQsNyBAQAogCiAgICAgLy8gSW5pdGlhbGl6ZSBPcGVuR0x8RVMKICAgICBnbFBpeGVsU3RvcmVpKEdMX1VOUEFDS19BTElHTk1FTlQsIDQpOwotICAgIGdsUGl4ZWxTdG9yZWkoR0xfUEFDS19BTElHTk1FTlQsIDQpOyAKKyAgICBnbFBpeGVsU3RvcmVpKEdMX1BBQ0tfQUxJR05NRU5ULCA0KTsKICAgICBnbEVuYWJsZUNsaWVudFN0YXRlKEdMX1ZFUlRFWF9BUlJBWSk7CiAgICAgZ2xFbmFibGUoR0xfU0NJU1NPUl9URVNUKTsKICAgICBnbFNoYWRlTW9kZWwoR0xfRkxBVCk7CkBAIC0yNjYsNyArMjY4LDcgQEAKIAogICAgIC8vIHN0YXJ0IGJvb3QgYW5pbWF0aW9uCiAgICAgcHJvcGVydHlfc2V0KCJjdGwuc3RhcnQiLCAiYm9vdGFuaW0iKTsKLSAgICAKKwogICAgIHJldHVybiBOT19FUlJPUjsKIH0KIApAQCAtMzY5LDYgKzM3MSwxMSBAQAogICAgIC8vIHBvc3Qgc3VyZmFjZXMgKGlmIG5lZWRlZCkKICAgICBoYW5kbGVQYWdlRmxpcCgpOwogCisgICAgaWYgKFVOTElLRUxZKG1Id1dvcmtMaXN0RGlydHkpKSB7CisgICAgICAgIC8vIGJ1aWxkIHRoZSBoL3cgd29yayBsaXN0CisgICAgICAgIGhhbmRsZVdvcmtMaXN0KCk7CisgICAgfQorCiAgICAgY29uc3QgRGlzcGxheUhhcmR3YXJlJiBodyhncmFwaGljUGxhbmUoMCkuZGlzcGxheUhhcmR3YXJlKCkpOwogICAgIGlmIChMSUtFTFkoaHcuY2FuRHJhdygpICYmICFpc0Zyb3plbigpKSkgewogICAgICAgICAvLyByZXBhaW50IHRoZSBmcmFtZWJ1ZmZlciAoaWYgbmVlZGVkKQpAQCAtMzgzLDEzICszOTAsMTIgQEAKICAgICAgICAgbG9nZ2VyLmxvZyhHcmFwaGljTG9nOjpTRl9DT01QT1NJVElPTl9DT01QTEVURSwgaW5kZXgpOwogICAgICAgICBody5jb21wb3NpdGlvbkNvbXBsZXRlKCk7CiAKLSAgICAgICAgLy8gcmVsZWFzZSB0aGUgY2xpZW50cyBiZWZvcmUgd2UgZmxpcCAoJ2NhdXNlIGZsaXAgbWlnaHQgYmxvY2spCi0gICAgICAgIGxvZ2dlci5sb2coR3JhcGhpY0xvZzo6U0ZfVU5MT0NLX0NMSUVOVFMsIGluZGV4KTsKLSAgICAgICAgdW5sb2NrQ2xpZW50cygpOwotCiAgICAgICAgIGxvZ2dlci5sb2coR3JhcGhpY0xvZzo6U0ZfU1dBUF9CVUZGRVJTLCBpbmRleCk7CiAgICAgICAgIHBvc3RGcmFtZWJ1ZmZlcigpOwogCisgICAgICAgIGxvZ2dlci5sb2coR3JhcGhpY0xvZzo6U0ZfVU5MT0NLX0NMSUVOVFMsIGluZGV4KTsKKyAgICAgICAgdW5sb2NrQ2xpZW50cygpOworCiAgICAgICAgIGxvZ2dlci5sb2coR3JhcGhpY0xvZzo6U0ZfUkVQQUlOVF9ET05FLCBpbmRleCk7CiAgICAgfSBlbHNlIHsKICAgICAgICAgLy8gcHJldGVuZCB3ZSBkaWQgdGhlIHBvc3QKQEAgLTQ1NCw2ICs0NjAsNyBAQAogICAgICAgICBoYW5kbGVUcmFuc2FjdGlvbkxvY2tlZCh0cmFuc2FjdGlvbkZsYWdzLCBkaXRjaGVkTGF5ZXJzKTsKICAgICAgICAgbUxhc3RUcmFuc2FjdGlvblRpbWUgPSBzeXN0ZW1UaW1lKCkgLSBub3c7CiAgICAgICAgIG1EZWJ1Z0luVHJhbnNhY3Rpb24gPSAwOworICAgICAgICBtSHdXb3JrTGlzdERpcnR5ID0gdHJ1ZTsKICAgICAgICAgLy8gaGVyZSB0aGUgdHJhbnNhY3Rpb24gaGFzIGJlZW4gY29tbWl0dGVkCiAgICAgfQogCkBAIC00NjEsNiArNDY4LDcgQEAKICAgICAgKiBDbGVhbi11cCBhbGwgbGF5ZXJzIHRoYXQgd2VudCBhd2F5CiAgICAgICogKGRvIHRoaXMgd2l0aG91dCB0aGUgbG9jayBoZWxkKQogICAgICAqLworCiAgICAgY29uc3Qgc2l6ZV90IGNvdW50ID0gZGl0Y2hlZExheWVycy5zaXplKCk7CiAgICAgZm9yIChzaXplX3QgaT0wIDsgaTxjb3VudCA7IGkrKykgewogICAgICAgICBpZiAoZGl0Y2hlZExheWVyc1tpXSAhPSAwKSB7CkBAIC02NjQsNyArNjcyLDcgQEAKIAogICAgICAgICAvLyBVcGRhdGUgYWJvdmVPcGFxdWVMYXllcnMgZm9yIG5leHQgKGxvd2VyKSBsYXllcgogICAgICAgICBhYm92ZU9wYXF1ZUxheWVycy5vclNlbGYob3BhcXVlUmVnaW9uKTsKLSAgICAgICAgCisKICAgICAgICAgLy8gU3RvcmUgdGhlIHZpc2libGUgcmVnaW9uIGlzIHNjcmVlbiBzcGFjZQogICAgICAgICBsYXllci0+c2V0VmlzaWJsZVJlZ2lvbih2aXNpYmxlUmVnaW9uKTsKICAgICAgICAgbGF5ZXItPnNldENvdmVyZWRSZWdpb24oY292ZXJlZFJlZ2lvbik7CkBAIC02OTQsOCArNzAyLDggQEAKIHZvaWQgU3VyZmFjZUZsaW5nZXI6OmhhbmRsZVBhZ2VGbGlwKCkKIHsKICAgICBib29sIHZpc2libGVSZWdpb25zID0gbVZpc2libGVSZWdpb25zRGlydHk7Ci0gICAgTGF5ZXJWZWN0b3ImIGN1cnJlbnRMYXllcnMgPSBjb25zdF9jYXN0PExheWVyVmVjdG9yJj4oCi0gICAgICAgICAgICBtRHJhd2luZ1N0YXRlLmxheWVyc1NvcnRlZEJ5Wik7CisgICAgTGF5ZXJWZWN0b3ImIGN1cnJlbnRMYXllcnMoCisgICAgICAgICAgICBjb25zdF9jYXN0PExheWVyVmVjdG9yJj4obURyYXdpbmdTdGF0ZS5sYXllcnNTb3J0ZWRCeVopKTsKICAgICB2aXNpYmxlUmVnaW9ucyB8PSBsb2NrUGFnZUZsaXAoY3VycmVudExheWVycyk7CiAKICAgICAgICAgY29uc3QgRGlzcGxheUhhcmR3YXJlJiBodyA9IGdyYXBoaWNQbGFuZSgwKS5kaXNwbGF5SGFyZHdhcmUoKTsKQEAgLTcxOCw2ICs3MjYsNyBAQAogCiAgICAgICAgICAgICBtV29ybWhvbGVSZWdpb24gPSBzY3JlZW5SZWdpb24uc3VidHJhY3Qob3BhcXVlUmVnaW9uKTsKICAgICAgICAgICAgIG1WaXNpYmxlUmVnaW9uc0RpcnR5ID0gZmFsc2U7CisgICAgICAgICAgICBtSHdXb3JrTGlzdERpcnR5ID0gdHJ1ZTsKICAgICAgICAgfQogCiAgICAgdW5sb2NrUGFnZUZsaXAoY3VycmVudExheWVycyk7CkBAIC03NDgsNiArNzU3LDIwIEBACiAgICAgfQogfQogCit2b2lkIFN1cmZhY2VGbGluZ2VyOjpoYW5kbGVXb3JrTGlzdCgpCit7CisgICAgbUh3V29ya0xpc3REaXJ0eSA9IGZhbHNlOworICAgIEhXQ29tcG9zZXImIGh3YyhncmFwaGljUGxhbmUoMCkuZGlzcGxheUhhcmR3YXJlKCkuZ2V0SHdDb21wb3NlcigpKTsKKyAgICBpZiAoaHdjLmluaXRDaGVjaygpID09IE5PX0VSUk9SKSB7CisgICAgICAgIGNvbnN0IFZlY3Rvcjwgc3A8TGF5ZXJCYXNlPiA+JiBjdXJyZW50TGF5ZXJzKG1WaXNpYmxlTGF5ZXJzU29ydGVkQnlaKTsKKyAgICAgICAgY29uc3Qgc2l6ZV90IGNvdW50ID0gY3VycmVudExheWVycy5zaXplKCk7CisgICAgICAgIGh3Yy5jcmVhdGVXb3JrTGlzdChjb3VudCk7CisgICAgICAgIGh3Y19sYXllcl90KiBjb25zdCBjdXIoaHdjLmdldExheWVycygpKTsKKyAgICAgICAgZm9yIChzaXplX3QgaT0wIDsgY3VyICYmIGk8Y291bnQgOyBpKyspIHsKKyAgICAgICAgICAgIGN1cnJlbnRMYXllcnNbaV0tPnNldEdlb21ldHJ5KCZjdXJbaV0pOworICAgICAgICB9CisgICAgfQorfQogCiB2b2lkIFN1cmZhY2VGbGluZ2VyOjpoYW5kbGVSZXBhaW50KCkKIHsKQEAgLTc2OCw4ICs3OTEsOCBAQAogICAgIGdsTG9hZElkZW50aXR5KCk7CiAKICAgICB1aW50MzJfdCBmbGFncyA9IGh3LmdldEZsYWdzKCk7Ci0gICAgaWYgKChmbGFncyAmIERpc3BsYXlIYXJkd2FyZTo6U1dBUF9SRUNUQU5HTEUpIHx8IAotICAgICAgICAoZmxhZ3MgJiBEaXNwbGF5SGFyZHdhcmU6OkJVRkZFUl9QUkVTRVJWRUQpKSAKKyAgICBpZiAoKGZsYWdzICYgRGlzcGxheUhhcmR3YXJlOjpTV0FQX1JFQ1RBTkdMRSkgfHwKKyAgICAgICAgKGZsYWdzICYgRGlzcGxheUhhcmR3YXJlOjpCVUZGRVJfUFJFU0VSVkVEKSkKICAgICB7CiAgICAgICAgIC8vIHdlIGNhbiByZWRyYXcgb25seSB3aGF0J3MgZGlydHksIGJ1dCBzaW5jZSBTV0FQX1JFQ1RBTkdMRSBvbmx5CiAgICAgICAgIC8vIHRha2VzIGEgcmVjdGFuZ2xlLCB3ZSBtdXN0IG1ha2Ugc3VyZSB0byB1cGRhdGUgdGhhdCB3aG9sZQpAQCAtODEyLDkgKzgzNSw3MiBAQAogICAgICAgICAvLyBkcmF3IHNvbWV0aGluZy4uLgogICAgICAgICBkcmF3V29ybWhvbGUoKTsKICAgICB9CisKKyAgICBzdGF0dXNfdCBlcnIgPSBOT19FUlJPUjsKICAgICBjb25zdCBWZWN0b3I8IHNwPExheWVyQmFzZT4gPiYgbGF5ZXJzKG1WaXNpYmxlTGF5ZXJzU29ydGVkQnlaKTsKLSAgICBjb25zdCBzaXplX3QgY291bnQgPSBsYXllcnMuc2l6ZSgpOwotICAgIGZvciAoc2l6ZV90IGk9MCA7IGk8Y291bnQgOyArK2kpIHsKKyAgICBzaXplX3QgY291bnQgPSBsYXllcnMuc2l6ZSgpOworCisgICAgY29uc3QgRGlzcGxheUhhcmR3YXJlJiBodyhncmFwaGljUGxhbmUoMCkuZGlzcGxheUhhcmR3YXJlKCkpOworICAgIEhXQ29tcG9zZXImIGh3Yyhody5nZXRId0NvbXBvc2VyKCkpOworICAgIGh3Y19sYXllcl90KiBjb25zdCBjdXIoaHdjLmdldExheWVycygpKTsKKworICAgIExPR0VfSUYoY3VyICYmIGh3Yy5nZXROdW1MYXllcnMoKSAhPSBjb3VudCwKKyAgICAgICAgICAgICJIQUwgbnVtYmVyIG9mIGxheWVycyAoJWQpIGRvZXNuJ3QgbWF0Y2ggc3VyZmFjZWZsaW5nZXIgKCVkKSIsCisgICAgICAgICAgICBod2MuZ2V0TnVtTGF5ZXJzKCksIGNvdW50KTsKKworICAgIC8vIGp1c3QgdG8gYmUgZXh0cmEtc2FmZSwgdXNlIHRoZSBzbWFsbGVzdCBjb3VudAorICAgIGlmIChod2MuaW5pdENoZWNrKCkgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgY291bnQgPSBjb3VudCA8IGh3Yy5nZXROdW1MYXllcnMoKSA/IGNvdW50IDogaHdjLmdldE51bUxheWVycygpOworICAgIH0KKworICAgIC8qCisgICAgICogIHVwZGF0ZSB0aGUgcGVyLWZyYW1lIGgvdyBjb21wb3NlciBkYXRhIGZvciBlYWNoIGxheWVyCisgICAgICogIGFuZCBidWlsZCB0aGUgdHJhbnNwYXJlbnQgcmVnaW9uIG9mIHRoZSBGQgorICAgICAqLworICAgIFJlZ2lvbiB0cmFuc3BhcmVudDsKKyAgICBpZiAoY3VyKSB7CisgICAgICAgIGZvciAoc2l6ZV90IGk9MCA7IGk8Y291bnQgOyBpKyspIHsKKyAgICAgICAgICAgIGNvbnN0IHNwPExheWVyQmFzZT4mIGxheWVyKGxheWVyc1tpXSk7CisgICAgICAgICAgICBsYXllci0+c2V0UGVyRnJhbWVEYXRhKCZjdXJbaV0pOworICAgICAgICAgICAgaWYgKGN1cltpXS5oaW50cyAmIEhXQ19ISU5UX0NMRUFSX0ZCKSB7CisgICAgICAgICAgICAgICAgaWYgKCEobGF5ZXItPm5lZWRzQmxlbmRpbmcoKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgdHJhbnNwYXJlbnQub3JTZWxmKGxheWVyLT52aXNpYmxlUmVnaW9uU2NyZWVuKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZXJyID0gaHdjLnByZXBhcmUoKTsKKyAgICAgICAgTE9HRV9JRihlcnIsICJIV0NvbXBvc2VyOjpwcmVwYXJlIGZhaWxlZCAoJXMpIiwgc3RyZXJyb3IoLWVycikpOworICAgIH0KKworICAgIC8qCisgICAgICogIGNsZWFyIHRoZSBhcmVhIG9mIHRoZSBGQiB0aGF0IG5lZWQgdG8gYmUgdHJhbnNwYXJlbnQKKyAgICAgKi8KKyAgICB0cmFuc3BhcmVudC5hbmRTZWxmKGRpcnR5KTsKKyAgICBpZiAoIXRyYW5zcGFyZW50LmlzRW1wdHkoKSkgeworICAgICAgICBnbENsZWFyQ29sb3IoMCwwLDAsMCk7CisgICAgICAgIFJlZ2lvbjo6Y29uc3RfaXRlcmF0b3IgaXQgPSB0cmFuc3BhcmVudC5iZWdpbigpOworICAgICAgICBSZWdpb246OmNvbnN0X2l0ZXJhdG9yIGNvbnN0IGVuZCA9IHRyYW5zcGFyZW50LmVuZCgpOworICAgICAgICBjb25zdCBpbnQzMl90IGhlaWdodCA9IGh3LmdldEhlaWdodCgpOworICAgICAgICB3aGlsZSAoaXQgIT0gZW5kKSB7CisgICAgICAgICAgICBjb25zdCBSZWN0JiByKCppdCsrKTsKKyAgICAgICAgICAgIGNvbnN0IEdMaW50IHN5ID0gaGVpZ2h0IC0gKHIudG9wICsgci5oZWlnaHQoKSk7CisgICAgICAgICAgICBnbFNjaXNzb3Ioci5sZWZ0LCBzeSwgci53aWR0aCgpLCByLmhlaWdodCgpKTsKKyAgICAgICAgICAgIGdsQ2xlYXIoR0xfQ09MT1JfQlVGRkVSX0JJVCk7CisgICAgICAgIH0KKyAgICB9CisKKworICAgIC8qCisgICAgICogYW5kIHRoZW4sIHJlbmRlciB0aGUgbGF5ZXJzIHRhcmdldGVkIGF0IHRoZSBmcmFtZWJ1ZmZlcgorICAgICAqLworICAgIGZvciAoc2l6ZV90IGk9MCA7IGk8Y291bnQgOyBpKyspIHsKKyAgICAgICAgaWYgKGN1cikgeworICAgICAgICAgICAgaWYgKChjdXJbaV0uY29tcG9zaXRpb25UeXBlICE9IEhXQ19GUkFNRUJVRkZFUikgJiYKKyAgICAgICAgICAgICAgICAhKGN1cltpXS5mbGFncyAmIEhXQ19TS0lQX0xBWUVSKSkgeworICAgICAgICAgICAgICAgIC8vIHNraXAgbGF5ZXJzIGhhbmRsZWQgYnkgdGhlIEhBTAorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CiAgICAgICAgIGNvbnN0IHNwPExheWVyQmFzZT4mIGxheWVyKGxheWVyc1tpXSk7CiAgICAgICAgIGNvbnN0IFJlZ2lvbiBjbGlwKGRpcnR5LmludGVyc2VjdChsYXllci0+dmlzaWJsZVJlZ2lvblNjcmVlbikpOwogICAgICAgICBpZiAoIWNsaXAuaXNFbXB0eSgpKSB7CkBAIC0xMDUzLDcgKzExMzksNyBAQAogICAgIGlmIChhbmRyb2lkX2F0b21pY19kZWMoJm1UcmFuc2FjdGlvbkNvdW50KSA9PSAxKSB7CiAgICAgICAgIHNpZ25hbEV2ZW50KCk7CiAKLSAgICAgICAgLy8gaWYgdGhlcmUgaXMgYSB0cmFuc2FjdGlvbiB3aXRoIGEgcmVzaXplLCB3YWl0IGZvciBpdCB0byAKKyAgICAgICAgLy8gaWYgdGhlcmUgaXMgYSB0cmFuc2FjdGlvbiB3aXRoIGEgcmVzaXplLCB3YWl0IGZvciBpdCB0bwogICAgICAgICAvLyB0YWtlIGVmZmVjdCBiZWZvcmUgcmV0dXJuaW5nLgogICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2wobVN0YXRlTG9jayk7CiAgICAgICAgIHdoaWxlIChtUmVzaXplVHJhbnNhdGlvblBlbmRpbmcpIHsKQEAgLTEwOTcsNyArMTE4Myw3IEBACiAgICAgcmV0dXJuIE5PX0VSUk9SOwogfQogCi1pbnQgU3VyZmFjZUZsaW5nZXI6OnNldE9yaWVudGF0aW9uKERpc3BsYXlJRCBkcHksIAoraW50IFN1cmZhY2VGbGluZ2VyOjpzZXRPcmllbnRhdGlvbihEaXNwbGF5SUQgZHB5LAogICAgICAgICBpbnQgb3JpZW50YXRpb24sIHVpbnQzMl90IGZsYWdzKQogewogICAgIGlmIChVTkxJS0VMWSh1aW50MzJfdChkcHkpID49IERJU1BMQVlfQ09VTlQpKQpAQCAtMTEzMCwxNCArMTIxNiwxNyBAQAogICAgICAgICAgICAgICAgIGludCh3KSwgaW50KGgpKTsKICAgICAgICAgcmV0dXJuIHN1cmZhY2VIYW5kbGU7CiAgICAgfQotICAgIAorCiAgICAgLy9MT0dEKCJjcmVhdGVTdXJmYWNlIGZvciBwaWQgJWQgKCVkIHggJWQpIiwgcGlkLCB3LCBoKTsKICAgICBzcDxMYXllcj4gbm9ybWFsTGF5ZXI7CiAgICAgc3dpdGNoIChmbGFncyAmIGVGWFN1cmZhY2VNYXNrKSB7CiAgICAgICAgIGNhc2UgZUZYU3VyZmFjZU5vcm1hbDoKKyNpZiBIQVNfUFVTSF9CVUZGRVJTCiAgICAgICAgICAgICBpZiAoVU5MSUtFTFkoZmxhZ3MgJiBlUHVzaEJ1ZmZlcnMpKSB7CiAgICAgICAgICAgICAgICAgbGF5ZXIgPSBjcmVhdGVQdXNoQnVmZmVyc1N1cmZhY2UoY2xpZW50LCBkLCB3LCBoLCBmbGFncyk7Ci0gICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgfSBlbHNlCisjZW5kaWYKKyAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICBub3JtYWxMYXllciA9IGNyZWF0ZU5vcm1hbFN1cmZhY2UoY2xpZW50LCBkLCB3LCBoLCBmbGFncywgZm9ybWF0KTsKICAgICAgICAgICAgICAgICBsYXllciA9IG5vcm1hbExheWVyOwogICAgICAgICAgICAgfQpAQCAtMTE1Niw3ICsxMjQ1LDcgQEAKICAgICAgICAgc3NpemVfdCB0b2tlbiA9IGFkZENsaWVudExheWVyKGNsaWVudCwgbGF5ZXIpOwogCiAgICAgICAgIHN1cmZhY2VIYW5kbGUgPSBsYXllci0+Z2V0U3VyZmFjZSgpOwotICAgICAgICBpZiAoc3VyZmFjZUhhbmRsZSAhPSAwKSB7IAorICAgICAgICBpZiAoc3VyZmFjZUhhbmRsZSAhPSAwKSB7CiAgICAgICAgICAgICBwYXJhbXMtPnRva2VuID0gdG9rZW47CiAgICAgICAgICAgICBwYXJhbXMtPmlkZW50aXR5ID0gc3VyZmFjZUhhbmRsZS0+Z2V0SWRlbnRpdHkoKTsKICAgICAgICAgICAgIHBhcmFtcy0+d2lkdGggPSB3OwpAQCAtMTI0MCw3ICsxMzI5LDcgQEAKICAgICAvKgogICAgICAqIGNhbGxlZCBieSB0aGUgd2luZG93IG1hbmFnZXIsIHdoZW4gYSBzdXJmYWNlIHNob3VsZCBiZSBtYXJrZWQgZm9yCiAgICAgICogZGVzdHJ1Y3Rpb24uCi0gICAgICogCisgICAgICoKICAgICAgKiBUaGUgc3VyZmFjZSBpcyByZW1vdmVkIGZyb20gdGhlIGN1cnJlbnQgYW5kIGRyYXdpbmcgbGlzdHMsIGJ1dCBwbGFjZWQKICAgICAgKiBpbiB0aGUgcHVyZ2F0b3J5IHF1ZXVlLCBzbyBpdCdzIG5vdCBkZXN0cm95ZWQgcmlnaHQtYXdheSAod2UgbmVlZAogICAgICAqIHRvIHdhaXQgZm9yIGFsbCBjbGllbnQncyByZWZlcmVuY2VzIHRvIGdvIGF3YXkgZmlyc3QpLgpAQCAtMTI2MSw3ICsxMzUwLDcgQEAKIHN0YXR1c190IFN1cmZhY2VGbGluZ2VyOjpkZXN0cm95U3VyZmFjZShjb25zdCBzcDxMYXllckJhc2VDbGllbnQ+JiBsYXllcikKIHsKICAgICAvLyBjYWxsZWQgYnkgfklTdXJmYWNlKCkgd2hlbiBhbGwgcmVmZXJlbmNlcyBhcmUgZ29uZQotICAgIAorCiAgICAgY2xhc3MgTWVzc2FnZURlc3Ryb3lTdXJmYWNlIDogcHVibGljIE1lc3NhZ2VCYXNlIHsKICAgICAgICAgU3VyZmFjZUZsaW5nZXIqIGZsaW5nZXI7CiAgICAgICAgIHNwPExheWVyQmFzZUNsaWVudD4gbGF5ZXI7CkBAIC0xMjc0LDkgKzEzNjMsOSBAQAogICAgICAgICAgICAgbGF5ZXIuY2xlYXIoKTsgLy8gY2xlYXIgaXQgb3V0c2lkZSBvZiB0aGUgbG9jazsKICAgICAgICAgICAgIE11dGV4OjpBdXRvbG9jayBfbChmbGluZ2VyLT5tU3RhdGVMb2NrKTsKICAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgKiByZW1vdmUgdGhlIGxheWVyIGZyb20gdGhlIGN1cnJlbnQgbGlzdCAtLSBjaGFuY2VzIGFyZSB0aGF0IGl0J3MgCi0gICAgICAgICAgICAgKiBub3QgaW4gdGhlIGxpc3QgYW55d2F5LCBiZWNhdXNlIGl0IHNob3VsZCBoYXZlIGJlZW4gcmVtb3ZlZCAKLSAgICAgICAgICAgICAqIGFscmVhZHkgdXBvbiByZXF1ZXN0IG9mIHRoZSBjbGllbnQgKGVnOiB3aW5kb3cgbWFuYWdlcikuIAorICAgICAgICAgICAgICogcmVtb3ZlIHRoZSBsYXllciBmcm9tIHRoZSBjdXJyZW50IGxpc3QgLS0gY2hhbmNlcyBhcmUgdGhhdCBpdCdzCisgICAgICAgICAgICAgKiBub3QgaW4gdGhlIGxpc3QgYW55d2F5LCBiZWNhdXNlIGl0IHNob3VsZCBoYXZlIGJlZW4gcmVtb3ZlZAorICAgICAgICAgICAgICogYWxyZWFkeSB1cG9uIHJlcXVlc3Qgb2YgdGhlIGNsaWVudCAoZWc6IHdpbmRvdyBtYW5hZ2VyKS4KICAgICAgICAgICAgICAqIEhvd2V2ZXIsIGEgYnVnZ3kgY2xpZW50IGNvdWxkIGhhdmUgbm90IGRvbmUgdGhhdC4KICAgICAgICAgICAgICAqIFNpbmNlIHdlIGtub3cgd2UgZG9uJ3QgaGF2ZSBhbnkgbW9yZSBjbGllbnRzLCB3ZSBkb24ndCBuZWVkCiAgICAgICAgICAgICAgKiB0byB1c2UgdGhlIHB1cmdhdG9yeS4KQEAgLTEzOTEsNyArMTQ4MCw3IEBACiAgICAgICAgIH0KICAgICAgICAgY29uc3QgYm9vbCBsb2NrZWQocmV0cnkgPj0gMCk7CiAgICAgICAgIGlmICghbG9ja2VkKSB7Ci0gICAgICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsIAorICAgICAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLAogICAgICAgICAgICAgICAgICAgICAiU3VyZmFjZUZsaW5nZXIgYXBwZWFycyB0byBiZSB1bnJlc3BvbnNpdmUsICIKICAgICAgICAgICAgICAgICAgICAgImR1bXBpbmcgYW55d2F5cyAobm8gbG9ja3MgaGVsZClcbiIpOwogICAgICAgICAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwpAQCAtMTY3MCwxMiArMTc1OSwxNSBAQAogewogICAgIGludDMyX3QgbmFtZSA9IE5BTUVfTk9UX0ZPVU5EOwogICAgIHNwPExheWVyPiBsYXllcihtRmxpbmdlci0+Z2V0TGF5ZXIoc3VyKSk7Ci0gICAgaWYgKGxheWVyID09IDApIHJldHVybiBuYW1lOworICAgIGlmIChsYXllciA9PSAwKSB7CisgICAgICAgIHJldHVybiBuYW1lOworICAgIH0KIAogICAgIC8vIGlmIHRoaXMgbGF5ZXIgYWxyZWFkeSBoYXMgYSB0b2tlbiwganVzdCByZXR1cm4gaXQKICAgICBuYW1lID0gbGF5ZXItPmdldFRva2VuKCk7Ci0gICAgaWYgKChuYW1lID49IDApICYmIChsYXllci0+Z2V0Q2xpZW50KCkgPT0gdGhpcykpCisgICAgaWYgKChuYW1lID49IDApICYmIChsYXllci0+Z2V0Q2xpZW50KCkgPT0gdGhpcykpIHsKICAgICAgICAgcmV0dXJuIG5hbWU7CisgICAgfQogCiAgICAgbmFtZSA9IDA7CiAgICAgZG8gewpkaWZmIC0tZ2l0IGEvc2VydmljZXMvc3VyZmFjZWZsaW5nZXIvU3VyZmFjZUZsaW5nZXIuaCBiL3NlcnZpY2VzL3N1cmZhY2VmbGluZ2VyL1N1cmZhY2VGbGluZ2VyLmgKaW5kZXggOGVjZmMwMS4uOGUyODZlNSAxMDA2NDQKLS0tIGEvc2VydmljZXMvc3VyZmFjZWZsaW5nZXIvU3VyZmFjZUZsaW5nZXIuaAorKysgYi9zZXJ2aWNlcy9zdXJmYWNlZmxpbmdlci9TdXJmYWNlRmxpbmdlci5oCkBAIC0yOTYsNiArMjk2LDcgQEAKICAgICAgICAgICAgIHZvaWQgICAgICAgIGhhbmRsZVBhZ2VGbGlwKCk7CiAgICAgICAgICAgICBib29sICAgICAgICBsb2NrUGFnZUZsaXAoY29uc3QgTGF5ZXJWZWN0b3ImIGN1cnJlbnRMYXllcnMpOwogICAgICAgICAgICAgdm9pZCAgICAgICAgdW5sb2NrUGFnZUZsaXAoY29uc3QgTGF5ZXJWZWN0b3ImIGN1cnJlbnRMYXllcnMpOworICAgICAgICAgICAgdm9pZCAgICAgICAgaGFuZGxlV29ya0xpc3QoKTsKICAgICAgICAgICAgIHZvaWQgICAgICAgIGhhbmRsZVJlcGFpbnQoKTsKICAgICAgICAgICAgIHZvaWQgICAgICAgIHBvc3RGcmFtZWJ1ZmZlcigpOwogICAgICAgICAgICAgdm9pZCAgICAgICAgY29tcG9zZVN1cmZhY2VzKGNvbnN0IFJlZ2lvbiYgZGlydHkpOwpAQCAtMzcwLDYgKzM3MSw3IEBACiAgICAgICAgICAgICAgICAgUmVnaW9uICAgICAgICAgICAgICAgICAgICAgIG1JbnZhbGlkUmVnaW9uOwogICAgICAgICAgICAgICAgIFJlZ2lvbiAgICAgICAgICAgICAgICAgICAgICBtV29ybWhvbGVSZWdpb247CiAgICAgICAgICAgICAgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgICAgIG1WaXNpYmxlUmVnaW9uc0RpcnR5OworICAgICAgICAgICAgICAgIGJvb2wgICAgICAgICAgICAgICAgICAgICAgICBtSHdXb3JrTGlzdERpcnR5OwogICAgICAgICAgICAgICAgIGJvb2wgICAgICAgICAgICAgICAgICAgICAgICBtRGVmZXJSZWxlYXNlQ29uc29sZTsKICAgICAgICAgICAgICAgICBib29sICAgICAgICAgICAgICAgICAgICAgICAgbUZyZWV6ZURpc3BsYXk7CiAgICAgICAgICAgICAgICAgaW50MzJfdCAgICAgICAgICAgICAgICAgICAgIG1GcmVlemVDb3VudDsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL3Rlc3RzL3NlcnZpY2VzdGVzdHMvQW5kcm9pZC5tayBiL3NlcnZpY2VzL3Rlc3RzL3NlcnZpY2VzdGVzdHMvQW5kcm9pZC5tawppbmRleCBiMDdhMTBiLi4xODZiMzQ5IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy90ZXN0cy9zZXJ2aWNlc3Rlc3RzL0FuZHJvaWQubWsKKysrIGIvc2VydmljZXMvdGVzdHMvc2VydmljZXN0ZXN0cy9BbmRyb2lkLm1rCkBAIC03LDggKzcsMTAgQEAKICMgSW5jbHVkZSBhbGwgdGVzdCBqYXZhIGZpbGVzLgogTE9DQUxfU1JDX0ZJTEVTIDo9ICQoY2FsbCBhbGwtamF2YS1maWxlcy11bmRlciwgc3JjKQogCitMT0NBTF9TVEFUSUNfSkFWQV9MSUJSQVJJRVMgOj0gZWFzeW1vY2tsaWIKIAogTE9DQUxfSkFWQV9MSUJSQVJJRVMgOj0gYW5kcm9pZC50ZXN0LnJ1bm5lciBzZXJ2aWNlcworCiBMT0NBTF9QQUNLQUdFX05BTUUgOj0gRnJhbWV3b3Jrc1NlcnZpY2VzVGVzdHMKIAogTE9DQUxfQ0VSVElGSUNBVEUgOj0gcGxhdGZvcm0KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL3Rlc3RzL3NlcnZpY2VzdGVzdHMvQW5kcm9pZE1hbmlmZXN0LnhtbCBiL3NlcnZpY2VzL3Rlc3RzL3NlcnZpY2VzdGVzdHMvQW5kcm9pZE1hbmlmZXN0LnhtbAppbmRleCA1Y2UxMDlmLi5mMTE1ZjQyIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy90ZXN0cy9zZXJ2aWNlc3Rlc3RzL0FuZHJvaWRNYW5pZmVzdC54bWwKKysrIGIvc2VydmljZXMvdGVzdHMvc2VydmljZXN0ZXN0cy9BbmRyb2lkTWFuaWZlc3QueG1sCkBAIC0yMyw2ICsyMywxOSBAQAogICAgIAogICAgIDxhcHBsaWNhdGlvbj4KICAgICAgICAgPHVzZXMtbGlicmFyeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQudGVzdC5ydW5uZXIiIC8+CisKKyAgICAgICAgPHNlcnZpY2UgYW5kcm9pZDpuYW1lPSJjb20uYW5kcm9pZC5zZXJ2ZXIuQWNjZXNzaWJpbGl0eU1hbmFnZXJTZXJ2aWNlVGVzdCRNeUZpcnN0TW9ja0FjY2Vzc2liaWxpdHlTZXJ2aWNlIj4KKyAgICAgICAgICA8aW50ZW50LWZpbHRlcj4KKyAgICAgICAgICAgIDxhY3Rpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmFjY2Vzc2liaWxpdHlzZXJ2aWNlLkFjY2Vzc2liaWxpdHlTZXJ2aWNlIi8+CisgICAgICAgICAgPC9pbnRlbnQtZmlsdGVyPgorICAgICAgICA8L3NlcnZpY2U+CisKKyAgICAgICAgPHNlcnZpY2UgYW5kcm9pZDpuYW1lPSJjb20uYW5kcm9pZC5zZXJ2ZXIuQWNjZXNzaWJpbGl0eU1hbmFnZXJTZXJ2aWNlVGVzdCRNeVNlY29uZE1vY2tBY2Nlc3NpYmlsaXR5U2VydmljZSI+CisgICAgICAgICAgPGludGVudC1maWx0ZXI+CisgICAgICAgICAgICA8YWN0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5hY2Nlc3NpYmlsaXR5c2VydmljZS5BY2Nlc3NpYmlsaXR5U2VydmljZSIvPgorICAgICAgICAgIDwvaW50ZW50LWZpbHRlcj4KKyAgICAgICAgPC9zZXJ2aWNlPgorCiAgICAgPC9hcHBsaWNhdGlvbj4KIAogICAgIDxpbnN0cnVtZW50YXRpb24KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL3Rlc3RzL3NlcnZpY2VzdGVzdHMvc3JjL2NvbS9hbmRyb2lkL3NlcnZlci9BY2Nlc3NpYmlsaXR5TWFuYWdlclNlcnZpY2VUZXN0LmphdmEgYi9zZXJ2aWNlcy90ZXN0cy9zZXJ2aWNlc3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9zZXJ2ZXIvQWNjZXNzaWJpbGl0eU1hbmFnZXJTZXJ2aWNlVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY2ZTNhODIKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy90ZXN0cy9zZXJ2aWNlc3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9zZXJ2ZXIvQWNjZXNzaWJpbGl0eU1hbmFnZXJTZXJ2aWNlVGVzdC5qYXZhCkBAIC0wLDAgKzEsNzI5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5zZXJ2ZXI7CisKK2ltcG9ydCBhbmRyb2lkLmFjY2Vzc2liaWxpdHlzZXJ2aWNlLkFjY2Vzc2liaWxpdHlTZXJ2aWNlOworaW1wb3J0IGFuZHJvaWQuYWNjZXNzaWJpbGl0eXNlcnZpY2UuQWNjZXNzaWJpbGl0eVNlcnZpY2VJbmZvOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db21wb25lbnROYW1lOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5TZXJ2aWNlSW5mbzsKK2ltcG9ydCBhbmRyb2lkLm9zLklCaW5kZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5NZXNzYWdlOworaW1wb3J0IGFuZHJvaWQub3MuU2VydmljZU1hbmFnZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5TeXN0ZW1DbG9jazsKK2ltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLlNldHRpbmdzOworaW1wb3J0IGFuZHJvaWQudGVzdC5BbmRyb2lkVGVzdENhc2U7CitpbXBvcnQgYW5kcm9pZC50ZXN0LnN1aXRlYnVpbGRlci5hbm5vdGF0aW9uLkxhcmdlVGVzdDsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmlsaXR5RXZlbnQ7CitpbXBvcnQgYW5kcm9pZC52aWV3LmFjY2Vzc2liaWxpdHkuSUFjY2Vzc2liaWxpdHlNYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQudmlldy5hY2Nlc3NpYmlsaXR5LklBY2Nlc3NpYmlsaXR5TWFuYWdlckNsaWVudDsKKworLyoqCisgKiBUaGlzIHRlc3QgZXhlcmNpc2VzIHRoZQorICoge0BsaW5rIGNvbS5hbmRyb2lkLnNlcnZlci5BY2Nlc3NpYmlsaXR5TWFuYWdlclNlcnZpY2V9IGJ5IG1vY2tpbmcgdGhlCisgKiB7QGxpbmsgYW5kcm9pZC52aWV3LmFjY2Vzc2liaWxpdHkuQWNjZXNzaWJpbGl0eU1hbmFnZXJ9IHdoaWNoIHRhbGtzIHRvIHRvIHRoZQorICogc2VydmljZS4gVGhlIHNlcnZpY2UgaXRzZWxmIGlzIGludGVyYWN0aW5nIHdpdGggdGhlIHBsYXRmb3JtLiBOb3RlOiBUZXN0aW5nCisgKiB0aGUgc2VydmljZSBpbiBmdWxsIGlzb2xhdGlvbiB3b3VsZCByZXF1aXJlIHNpZ25pZmljYW50IGFtb3VudCBvZiB3b3JrIGZvcgorICogbW9ja2luZyBhbGwgc3lzdGVtIGludGVyYWN0aW9ucy4gSXQgd291bGQgYWxzbyByZXF1aXJlIGEgbG90IG9mIG1vY2tpbmcgY29kZS4KKyAqLworcHVibGljIGNsYXNzIEFjY2Vzc2liaWxpdHlNYW5hZ2VyU2VydmljZVRlc3QgZXh0ZW5kcyBBbmRyb2lkVGVzdENhc2UgeworCisgICAgLyoqCisgICAgICogVGltZW91dCByZXF1aXJlZCBmb3IgcGVuZGluZyBCaW5kZXIgY2FsbHMgb3IgZXZlbnQgcHJvY2Vzc2luZyB0bworICAgICAqIGNvbXBsZXRlLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgVElNRU9VVF9CSU5ERVJfQ0FMTCA9IDEwMDsKKworICAgIC8qKgorICAgICAqIFRpbWVvdXQgaW4gd2hpY2ggd2UgYXJlIHdhaXRpbmcgZm9yIHRoZSBzeXN0ZW0gdG8gc3RhcnQgdGhlIG1vY2sKKyAgICAgKiBhY2Nlc3NpYmlsaXR5IHNlcnZpY2VzLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgVElNRU9VVF9TVEFSVF9NT0NLX0FDQ0VTU0lCSUxJVFlfU0VSVklDRVMgPSAzMDA7CisKKyAgICAvKioKKyAgICAgKiBUaW1lb3V0IHVzZWQgZm9yIHRlc3RpbmcgdGhhdCBhIHNlcnZpY2UgaXMgbm90aWZpZWQgb25seSB1cG9uIGEKKyAgICAgKiBub3RpZmljYXRpb24gdGltZW91dC4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIFRJTUVPVVRfVEVTVF9OT1RJRklDQVRJT05fVElNRU9VVCA9IDMwMDsKKworICAgIC8qKgorICAgICAqIFRoZSBwYWNrYWdlIG5hbWUuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHNQYWNrYWdlTmFtZTsKKworICAgIC8qKgorICAgICAqIFRoZSBpbnRlcmZhY2UgdXNlZCB0byB0YWxrIHRvIHRoZSB0ZXN0ZWQgc2VydmljZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIElBY2Nlc3NpYmlsaXR5TWFuYWdlciBtTWFuYWdlclNlcnZpY2U7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBzZXRDb250ZXh0KENvbnRleHQgY29udGV4dCkgeworICAgICAgICBzdXBlci5zZXRDb250ZXh0KGNvbnRleHQpOworICAgICAgICBpZiAoc1BhY2thZ2VOYW1lID09IG51bGwpIHsKKyAgICAgICAgICAgIHNQYWNrYWdlTmFtZSA9IGNvbnRleHQuZ2V0UGFja2FnZU5hbWUoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCisgICAgICovCisgICAgcHVibGljIEFjY2Vzc2liaWxpdHlNYW5hZ2VyU2VydmljZVRlc3QoKSB7CisgICAgICAgIElCaW5kZXIgaUJpbmRlciA9IFNlcnZpY2VNYW5hZ2VyLmdldFNlcnZpY2UoQ29udGV4dC5BQ0NFU1NJQklMSVRZX1NFUlZJQ0UpOworICAgICAgICBtTWFuYWdlclNlcnZpY2UgPSBJQWNjZXNzaWJpbGl0eU1hbmFnZXIuU3R1Yi5hc0ludGVyZmFjZShpQmluZGVyKTsKKyAgICB9CisKKyAgICBATGFyZ2VUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEFkZENsaWVudF9BY2Nlc3NpYmlsaXR5RGlzYWJsZWRUaGVuRW5hYmxlZCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICAvLyBtYWtlIHN1cmUgYWNjZXNzaWJpbGl0eSBpcyBkaXNhYmxlZAorICAgICAgICBlbnN1cmVBY2Nlc3NpYmlsaXR5RW5hYmxlZChtQ29udGV4dCwgZmFsc2UpOworCisgICAgICAgIC8vIGNyZWF0ZSBhIGNsaWVudCBtb2NrIGluc3RhbmNlCisgICAgICAgIE15TW9ja0FjY2Vzc2liaWxpdHlNYW5hZ2VyQ2xpZW50IG1vY2tDbGllbnQgPSBuZXcgTXlNb2NrQWNjZXNzaWJpbGl0eU1hbmFnZXJDbGllbnQoKTsKKworICAgICAgICAvLyBpbnZva2UgdGhlIG1ldGhvZCB1bmRlciB0ZXN0CisgICAgICAgIGJvb2xlYW4gZW5hYmxlZEFjY2Vzc2liaWxpdHlEaXNhYmxlZCA9IG1NYW5hZ2VyU2VydmljZS5hZGRDbGllbnQobW9ja0NsaWVudCk7CisKKyAgICAgICAgLy8gY2hlY2sgZXhwZWN0ZWQgcmVzdWx0CisgICAgICAgIGFzc2VydEZhbHNlKCJUaGUgY2xpZW50IG11c3QgYmUgZGlzYWJsZWQgc2luY2UgYWNjZXNzaWJpbGl0eSBpcyBkaXNhYmxlZC4iLAorICAgICAgICAgICAgICAgIGVuYWJsZWRBY2Nlc3NpYmlsaXR5RGlzYWJsZWQpOworCisgICAgICAgIC8vIGVuYWJsZSBhY2Nlc3NpYmlsaXR5CisgICAgICAgIGVuc3VyZUFjY2Vzc2liaWxpdHlFbmFibGVkKG1Db250ZXh0LCB0cnVlKTsKKworICAgICAgICAvLyBpbnZva2UgdGhlIG1ldGhvZCB1bmRlciB0ZXN0CisgICAgICAgIGJvb2xlYW4gZW5hYmxlZEFjY2Vzc2liaWxpdHlFbmFibGVkID0gbU1hbmFnZXJTZXJ2aWNlLmFkZENsaWVudChtb2NrQ2xpZW50KTsKKworICAgICAgICAvLyBjaGVjayBleHBlY3RlZCByZXN1bHQKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiVGhlIGNsaWVudCBtdXN0IGJlIGVuYWJsZWQgc2luY2UgYWNjZXNzaWJpbGl0eSBpcyBlbmFibGVkLiIsCisgICAgICAgICAgICAgICAgZW5hYmxlZEFjY2Vzc2liaWxpdHlFbmFibGVkKTsKKyAgICB9CisKKyAgICBATGFyZ2VUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEFkZENsaWVudF9BY2Nlc3NpYmlsaXR5RW5hYmxlZFRoZW5EaXNhYmxlZCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICAvLyBlbmFibGUgYWNjZXNzaWJpbGl0eSBiZWZvcmUgcmVnaXN0ZXJpbmcgdGhlIGNsaWVudAorICAgICAgICBlbnN1cmVBY2Nlc3NpYmlsaXR5RW5hYmxlZChtQ29udGV4dCwgdHJ1ZSk7CisKKyAgICAgICAgLy8gY3JlYXRlIGEgY2xpZW50IG1vY2sgaW5zdGFuY2UKKyAgICAgICAgTXlNb2NrQWNjZXNzaWJpbGl0eU1hbmFnZXJDbGllbnQgbW9ja0NsaWVudCA9IG5ldyBNeU1vY2tBY2Nlc3NpYmlsaXR5TWFuYWdlckNsaWVudCgpOworCisgICAgICAgIC8vIGludm9rZSB0aGUgbWV0aG9kIHVuZGVyIHRlc3QKKyAgICAgICAgYm9vbGVhbiBlbmFibGVkQWNjZXNzaWJpbGl0eUVuYWJsZWQgPSBtTWFuYWdlclNlcnZpY2UuYWRkQ2xpZW50KG1vY2tDbGllbnQpOworCisgICAgICAgIC8vIGNoZWNrIGV4cGVjdGVkIHJlc3VsdAorICAgICAgICBhc3NlcnRUcnVlKCJUaGUgY2xpZW50IG11c3QgYmUgZW5hYmxlZCBzaW5jZSBhY2Nlc3NpYmlsaXR5IGlzIGVuYWJsZWQuIiwKKyAgICAgICAgICAgICAgICBlbmFibGVkQWNjZXNzaWJpbGl0eUVuYWJsZWQpOworCisgICAgICAgIC8vIGRpc2FibGUgYWNjZXNzaWJpbGl0eQorICAgICAgICBlbnN1cmVBY2Nlc3NpYmlsaXR5RW5hYmxlZChtQ29udGV4dCwgZmFsc2UpOworCisgICAgICAgIC8vIGludm9rZSB0aGUgbWV0aG9kIHVuZGVyIHRlc3QKKyAgICAgICAgYm9vbGVhbiBlbmFibGVkQWNjZXNzaWJpbGl0eURpc2FibGVkID0gbU1hbmFnZXJTZXJ2aWNlLmFkZENsaWVudChtb2NrQ2xpZW50KTsKKworICAgICAgICAvLyBjaGVjayBleHBlY3RlZCByZXN1bHQKKyAgICAgICAgYXNzZXJ0RmFsc2UoIlRoZSBjbGllbnQgbXVzdCBiZSBkaXNhYmxlZCBzaW5jZSBhY2Nlc3NpYmlsaXR5IGlzIGRpc2FibGVkLiIsCisgICAgICAgICAgICAgICAgZW5hYmxlZEFjY2Vzc2liaWxpdHlEaXNhYmxlZCk7CisgICAgfQorCisgICAgQExhcmdlVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRBY2Nlc3NpYmlsaXR5U2VydmljZXNMaXN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGJvb2xlYW4gZmlyc3RNb2NrU2VydmljZUluc3RhbGxlZCA9IGZhbHNlOworICAgICAgICBib29sZWFuIHNlY29uZE1vY2tTZXJ2aWNlSW5zdGFsbGVkID0gZmFsc2U7CisKKyAgICAgICAgU3RyaW5nIHBhY2thZ2VOYW1lID0gZ2V0Q29udGV4dCgpLmdldFBhY2thZ2VOYW1lKCk7CisgICAgICAgIFN0cmluZyBmaXJzdE1vY2tTZXJ2aWNlQ2xhc3NOYW1lID0gTXlGaXJzdE1vY2tBY2Nlc3NpYmlsaXR5U2VydmljZS5jbGFzcy5nZXROYW1lKCk7CisgICAgICAgIFN0cmluZyBzZWNvbmRNb2NrU2VydmljZUNsYXNzTmFtZSA9IE15U2Vjb25kTW9ja0FjY2Vzc2liaWxpdHlTZXJ2aWNlLmNsYXNzLmdldE5hbWUoKTsKKworICAgICAgICAvLyBsb29rIGZvciB0aGUgdHdvIG1vY2sgc2VydmljZXMKKyAgICAgICAgZm9yIChTZXJ2aWNlSW5mbyBzZXJ2aWNlSW5mbyA6IG1NYW5hZ2VyU2VydmljZS5nZXRBY2Nlc3NpYmlsaXR5U2VydmljZUxpc3QoKSkgeworICAgICAgICAgICAgaWYgKHBhY2thZ2VOYW1lLmVxdWFscyhzZXJ2aWNlSW5mby5wYWNrYWdlTmFtZSkpIHsKKyAgICAgICAgICAgICAgICBpZiAoZmlyc3RNb2NrU2VydmljZUNsYXNzTmFtZS5lcXVhbHMoc2VydmljZUluZm8ubmFtZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgZmlyc3RNb2NrU2VydmljZUluc3RhbGxlZCA9IHRydWU7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzZWNvbmRNb2NrU2VydmljZUNsYXNzTmFtZS5lcXVhbHMoc2VydmljZUluZm8ubmFtZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgc2Vjb25kTW9ja1NlcnZpY2VJbnN0YWxsZWQgPSB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIGNoZWNrIGV4cGVjdGVkIHJlc3VsdAorICAgICAgICBhc3NlcnRUcnVlKCJGaXJzdCBtb2NrIHNlcnZpY2UgbXVzdCBiZSBpbnN0YWxsZWQiLCBmaXJzdE1vY2tTZXJ2aWNlSW5zdGFsbGVkKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiU2Vjb25kIG1vY2sgc2VydmljZSBtdXN0IGJlIGluc3RhbGxlZCIsIHNlY29uZE1vY2tTZXJ2aWNlSW5zdGFsbGVkKTsKKyAgICB9CisKKyAgICBATGFyZ2VUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFNlbmRBY2Nlc3NpYmlsaXR5RXZlbnRfT25lU2VydmljZV9NYXRjaGluZ1BhY2thZ2VBbmRFdmVudFR5cGUoKQorICAgICAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIC8vIHNldCB0aGUgYWNjZXNzaWJpbGl0eSBzZXR0aW5nIHZhbHVlCisgICAgICAgIGVuc3VyZUFjY2Vzc2liaWxpdHlFbmFibGVkKG1Db250ZXh0LCB0cnVlKTsKKworICAgICAgICAvLyBlbmFibGUgdGhlIG1vY2sgYWNjZXNzaWJpbGl0eSBzZXJ2aWNlCisgICAgICAgIGVuc3VyZU9ubHlNb2NrU2VydmljZXNFbmFibGVkKG1Db250ZXh0LCB0cnVlLCBmYWxzZSk7CisKKyAgICAgICAgLy8gY29uZmlndXJlIHRoZSBtb2NrIHNlcnZpY2UKKyAgICAgICAgTW9ja0FjY2Vzc2liaWxpdHlTZXJ2aWNlIHNlcnZpY2UgPSBNeUZpcnN0TW9ja0FjY2Vzc2liaWxpdHlTZXJ2aWNlLnNJbnN0YW5jZTsKKyAgICAgICAgc2VydmljZS5zZXRTZXJ2aWNlSW5mbyhNb2NrQWNjZXNzaWJpbGl0eVNlcnZpY2UuY3JlYXRlRGVmYXVsdEluZm8oKSk7CisKKyAgICAgICAgLy8gd2FpdCBmb3IgdGhlIGJpbmRlciBjYWxsIHRvICNzZXRTZXJ2aWNlIHRvIGNvbXBsZXRlCisgICAgICAgIFRocmVhZC5zbGVlcChUSU1FT1VUX0JJTkRFUl9DQUxMKTsKKworICAgICAgICAvLyBjcmVhdGUgYW5kIHBvcHVsYXRlIGFuIGV2ZW50IHRvIGJlIHNlbnQKKyAgICAgICAgQWNjZXNzaWJpbGl0eUV2ZW50IHNlbnRFdmVudCA9IEFjY2Vzc2liaWxpdHlFdmVudC5vYnRhaW4oKTsKKyAgICAgICAgZnVsbHlQb3B1bGF0ZURlZmF1bHRBY2Nlc3NpYmlsaXR5RXZlbnQoc2VudEV2ZW50KTsKKworICAgICAgICAvLyBzZXQgZXhwZWN0YXRpb25zCisgICAgICAgIHNlcnZpY2UuZXhwZWN0RXZlbnQoc2VudEV2ZW50KTsKKyAgICAgICAgc2VydmljZS5yZXBsYXkoKTsKKworICAgICAgICAvLyBzZW5kIHRoZSBldmVudAorICAgICAgICBtTWFuYWdlclNlcnZpY2Uuc2VuZEFjY2Vzc2liaWxpdHlFdmVudChzZW50RXZlbnQpOworCisgICAgICAgIC8vIHZlcmlmeSBpZiBhbGwgZXhwZWN0ZWQgbWV0aG9kcyBoYXZlIGJlZW4gY2FsbGVkCisgICAgICAgIGFzc2VydE1vY2tTZXJ2aWNlVmVyaWZpZWRXaXRoaW5UaW1lb3V0KHNlcnZpY2UpOworICAgIH0KKworICAgIEBMYXJnZVRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2VuZEFjY2Vzc2liaWxpdHlFdmVudF9PbmVTZXJ2aWNlX05vdE1hdGNoaW5nUGFja2FnZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICAvLyBzZXQgdGhlIGFjY2Vzc2liaWxpdHkgc2V0dGluZyB2YWx1ZQorICAgICAgICBlbnN1cmVBY2Nlc3NpYmlsaXR5RW5hYmxlZChtQ29udGV4dCwgdHJ1ZSk7CisKKyAgICAgICAgLy8gZW5hYmxlIHRoZSBtb2NrIGFjY2Vzc2liaWxpdHkgc2VydmljZQorICAgICAgICBlbnN1cmVPbmx5TW9ja1NlcnZpY2VzRW5hYmxlZChtQ29udGV4dCwgdHJ1ZSwgZmFsc2UpOworCisgICAgICAgIC8vIGNvbmZpZ3VyZSB0aGUgbW9jayBzZXJ2aWNlCisgICAgICAgIE1vY2tBY2Nlc3NpYmlsaXR5U2VydmljZSBzZXJ2aWNlID0gTXlGaXJzdE1vY2tBY2Nlc3NpYmlsaXR5U2VydmljZS5zSW5zdGFuY2U7CisgICAgICAgIHNlcnZpY2Uuc2V0U2VydmljZUluZm8oTW9ja0FjY2Vzc2liaWxpdHlTZXJ2aWNlLmNyZWF0ZURlZmF1bHRJbmZvKCkpOworCisgICAgICAgIC8vIHdhaXQgZm9yIHRoZSBiaW5kZXIgY2FsbCB0byAjc2V0U2VydmljZSB0byBjb21wbGV0ZQorICAgICAgICBUaHJlYWQuc2xlZXAoVElNRU9VVF9CSU5ERVJfQ0FMTCk7CisKKyAgICAgICAgLy8gY3JlYXRlIGFuZCBwb3B1bGF0ZSBhbiBldmVudCB0byBiZSBzZW50CisgICAgICAgIEFjY2Vzc2liaWxpdHlFdmVudCBzZW50RXZlbnQgPSBBY2Nlc3NpYmlsaXR5RXZlbnQub2J0YWluKCk7CisgICAgICAgIGZ1bGx5UG9wdWxhdGVEZWZhdWx0QWNjZXNzaWJpbGl0eUV2ZW50KHNlbnRFdmVudCk7CisgICAgICAgIHNlbnRFdmVudC5zZXRQYWNrYWdlTmFtZSgibm8uc2VydmljZS5yZWdpc3RlcmVkLmZvci50aGlzLnBhY2thZ2UiKTsKKworICAgICAgICAvLyBzZXQgZXhwZWN0YXRpb25zCisgICAgICAgIHNlcnZpY2UucmVwbGF5KCk7CisKKyAgICAgICAgLy8gc2VuZCB0aGUgZXZlbnQKKyAgICAgICAgbU1hbmFnZXJTZXJ2aWNlLnNlbmRBY2Nlc3NpYmlsaXR5RXZlbnQoc2VudEV2ZW50KTsKKworICAgICAgICAvLyB2ZXJpZnkgaWYgYWxsIGV4cGVjdGVkIG1ldGhvZHMgaGF2ZSBiZWVuIGNhbGxlZAorICAgICAgICBhc3NlcnRNb2NrU2VydmljZVZlcmlmaWVkV2l0aGluVGltZW91dChzZXJ2aWNlKTsKKyAgICB9CisKKyAgICBATGFyZ2VUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFNlbmRBY2Nlc3NpYmlsaXR5RXZlbnRfT25lU2VydmljZV9Ob3RNYXRjaGluZ0V2ZW50VHlwZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICAvLyBzZXQgdGhlIGFjY2Vzc2liaWxpdHkgc2V0dGluZyB2YWx1ZQorICAgICAgICBlbnN1cmVBY2Nlc3NpYmlsaXR5RW5hYmxlZChtQ29udGV4dCwgdHJ1ZSk7CisKKyAgICAgICAgLy8gZW5hYmxlIHRoZSBtb2NrIGFjY2Vzc2liaWxpdHkgc2VydmljZQorICAgICAgICBlbnN1cmVPbmx5TW9ja1NlcnZpY2VzRW5hYmxlZChtQ29udGV4dCwgdHJ1ZSwgZmFsc2UpOworCisgICAgICAgIC8vIGNvbmZpZ3VyZSB0aGUgbW9jayBzZXJ2aWNlCisgICAgICAgIE1vY2tBY2Nlc3NpYmlsaXR5U2VydmljZSBzZXJ2aWNlID0gTXlGaXJzdE1vY2tBY2Nlc3NpYmlsaXR5U2VydmljZS5zSW5zdGFuY2U7CisgICAgICAgIHNlcnZpY2Uuc2V0U2VydmljZUluZm8oTW9ja0FjY2Vzc2liaWxpdHlTZXJ2aWNlLmNyZWF0ZURlZmF1bHRJbmZvKCkpOworCisgICAgICAgIC8vIHdhaXQgZm9yIHRoZSBiaW5kZXIgY2FsbCB0byAjc2V0U2VydmljZSB0byBjb21wbGV0ZQorICAgICAgICBUaHJlYWQuc2xlZXAoVElNRU9VVF9CSU5ERVJfQ0FMTCk7CisKKyAgICAgICAgLy8gY3JlYXRlIGFuZCBwb3B1bGF0ZSBhbiBldmVudCB0byBiZSBzZW50CisgICAgICAgIEFjY2Vzc2liaWxpdHlFdmVudCBzZW50RXZlbnQgPSBBY2Nlc3NpYmlsaXR5RXZlbnQub2J0YWluKCk7CisgICAgICAgIGZ1bGx5UG9wdWxhdGVEZWZhdWx0QWNjZXNzaWJpbGl0eUV2ZW50KHNlbnRFdmVudCk7CisgICAgICAgIHNlbnRFdmVudC5zZXRFdmVudFR5cGUoQWNjZXNzaWJpbGl0eUV2ZW50LlRZUEVfTk9USUZJQ0FUSU9OX1NUQVRFX0NIQU5HRUQpOworCisgICAgICAgIC8vIHNldCBleHBlY3RhdGlvbnMKKyAgICAgICAgc2VydmljZS5yZXBsYXkoKTsKKworICAgICAgICAvLyBzZW5kIHRoZSBldmVudAorICAgICAgICBtTWFuYWdlclNlcnZpY2Uuc2VuZEFjY2Vzc2liaWxpdHlFdmVudChzZW50RXZlbnQpOworCisgICAgICAgIC8vIHZlcmlmeSBpZiBhbGwgZXhwZWN0ZWQgbWV0aG9kcyBoYXZlIGJlZW4gY2FsbGVkCisgICAgICAgIGFzc2VydE1vY2tTZXJ2aWNlVmVyaWZpZWRXaXRoaW5UaW1lb3V0KHNlcnZpY2UpOworICAgIH0KKworICAgIEBMYXJnZVRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2VuZEFjY2Vzc2liaWxpdHlFdmVudF9PbmVTZXJ2aWNlX05vdGlmaXZhdGlvbkFmdGVyVGltZW91dCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICAvLyBzZXQgdGhlIGFjY2Vzc2liaWxpdHkgc2V0dGluZyB2YWx1ZQorICAgICAgICBlbnN1cmVBY2Nlc3NpYmlsaXR5RW5hYmxlZChtQ29udGV4dCwgdHJ1ZSk7CisKKyAgICAgICAgLy8gZW5hYmxlIHRoZSBtb2NrIGFjY2Vzc2liaWxpdHkgc2VydmljZQorICAgICAgICBlbnN1cmVPbmx5TW9ja1NlcnZpY2VzRW5hYmxlZChtQ29udGV4dCwgdHJ1ZSwgZmFsc2UpOworCisgICAgICAgIC8vIGNvbmZpZ3VyZSB0aGUgbW9jayBzZXJ2aWNlCisgICAgICAgIE1vY2tBY2Nlc3NpYmlsaXR5U2VydmljZSBzZXJ2aWNlID0gTXlGaXJzdE1vY2tBY2Nlc3NpYmlsaXR5U2VydmljZS5zSW5zdGFuY2U7CisgICAgICAgIEFjY2Vzc2liaWxpdHlTZXJ2aWNlSW5mbyBpbmZvID0gTW9ja0FjY2Vzc2liaWxpdHlTZXJ2aWNlLmNyZWF0ZURlZmF1bHRJbmZvKCk7CisgICAgICAgIGluZm8ubm90aWZpY2F0aW9uVGltZW91dCA9IFRJTUVPVVRfVEVTVF9OT1RJRklDQVRJT05fVElNRU9VVDsKKyAgICAgICAgc2VydmljZS5zZXRTZXJ2aWNlSW5mbyhpbmZvKTsKKworICAgICAgICAvLyB3YWl0IGZvciB0aGUgYmluZGVyIGNhbGwgdG8gI3NldFNlcnZpY2UgdG8gY29tcGxldGUKKyAgICAgICAgVGhyZWFkLnNsZWVwKFRJTUVPVVRfQklOREVSX0NBTEwpOworCisgICAgICAgIC8vIGNyZWF0ZSBhbmQgcG9wdWxhdGUgdGhlIGZpcnN0IGV2ZW50IHRvIGJlIHNlbnQKKyAgICAgICAgQWNjZXNzaWJpbGl0eUV2ZW50IGZpcnN0RXZlbnQgPSBBY2Nlc3NpYmlsaXR5RXZlbnQub2J0YWluKCk7CisgICAgICAgIGZ1bGx5UG9wdWxhdGVEZWZhdWx0QWNjZXNzaWJpbGl0eUV2ZW50KGZpcnN0RXZlbnQpOworCisgICAgICAgIC8vIGNyZWF0ZSBhbmQgcG9wdWxhdGUgdGhlIHNlY29uZCBldmVudCB0byBiZSBzZW50CisgICAgICAgIEFjY2Vzc2liaWxpdHlFdmVudCBzZWNvbmRFdmVudCA9IEFjY2Vzc2liaWxpdHlFdmVudC5vYnRhaW4oKTsKKyAgICAgICAgZnVsbHlQb3B1bGF0ZURlZmF1bHRBY2Nlc3NpYmlsaXR5RXZlbnQoc2Vjb25kRXZlbnQpOworCisgICAgICAgIC8vIHNldCBleHBlY3RhdGlvbnMKKyAgICAgICAgc2VydmljZS5leHBlY3RFdmVudChzZWNvbmRFdmVudCk7CisgICAgICAgIHNlcnZpY2UucmVwbGF5KCk7CisKKyAgICAgICAgLy8gc2VuZCB0aGUgZXZlbnRzCisgICAgICAgIG1NYW5hZ2VyU2VydmljZS5zZW5kQWNjZXNzaWJpbGl0eUV2ZW50KGZpcnN0RXZlbnQpOworICAgICAgICBtTWFuYWdlclNlcnZpY2Uuc2VuZEFjY2Vzc2liaWxpdHlFdmVudChzZWNvbmRFdmVudCk7CisKKyAgICAgICAgLy8gd2FpdCBmb3IgI3NlbmRBY2Nlc3NpYmlsaXR5RXZlbnQgdG8gcmVhY2ggdGhlIGJhY2tpbmcgc2VydmljZQorICAgICAgICBUaHJlYWQuc2xlZXAoVElNRU9VVF9CSU5ERVJfQ0FMTCk7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHNlcnZpY2UudmVyaWZ5KCk7CisgICAgICAgICAgICBmYWlsKCJObyBldmVudHMgbXVzdCBiZSBkaXNwYXRjaGVkIGJlZm9yZSB0aGUgZXhwaXJhdGlvbiBvZiB0aGUgbm90aWZpY2F0aW9uIHRpbWVvdXQuIik7CisgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBpc2UpIHsKKyAgICAgICAgICAgIC8qIGV4cGVjdGVkICovCisgICAgICAgIH0KKworICAgICAgICAvLyB3YWl0IGZvciB0aGUgY29uZmlndXJlZCBub3RpZmljYXRpb24gdGltZW91dCB0byBleHBpcmUKKyAgICAgICAgVGhyZWFkLnNsZWVwKFRJTUVPVVRfVEVTVF9OT1RJRklDQVRJT05fVElNRU9VVCk7CisKKyAgICAgICAgLy8gdmVyaWZ5IGlmIGFsbCBleHBlY3RlZCBtZXRob2RzIGhhdmUgYmVlbiBjYWxsZWQKKyAgICAgICAgYXNzZXJ0TW9ja1NlcnZpY2VWZXJpZmllZFdpdGhpblRpbWVvdXQoc2VydmljZSk7CisgICAgfQorCisgICAgQExhcmdlVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTZW5kQWNjZXNzaWJpbGl0eUV2ZW50X1R3b1NlcnZpY2VzX01hdGNoaW5nUGFja2FnZUFuZEV2ZW50VHlwZV9EaWZmRmVlZGJhY2soKQorICAgICAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIC8vIHNldCB0aGUgYWNjZXNzaWJpbGl0eSBzZXR0aW5nIHZhbHVlCisgICAgICAgIGVuc3VyZUFjY2Vzc2liaWxpdHlFbmFibGVkKG1Db250ZXh0LCB0cnVlKTsKKworICAgICAgICAvLyBlbmFibGUgdGhlIG1vY2sgYWNjZXNzaWJpbGl0eSBzZXJ2aWNlcworICAgICAgICBlbnN1cmVPbmx5TW9ja1NlcnZpY2VzRW5hYmxlZChtQ29udGV4dCwgdHJ1ZSwgdHJ1ZSk7CisKKyAgICAgICAgLy8gY29uZmlndXJlIHRoZSBmaXJzdCBtb2NrIHNlcnZpY2UKKyAgICAgICAgTW9ja0FjY2Vzc2liaWxpdHlTZXJ2aWNlIGZpcnN0U2VydmljZSA9IE15Rmlyc3RNb2NrQWNjZXNzaWJpbGl0eVNlcnZpY2Uuc0luc3RhbmNlOworICAgICAgICBBY2Nlc3NpYmlsaXR5U2VydmljZUluZm8gZmlyc3RJbmZvID0gTW9ja0FjY2Vzc2liaWxpdHlTZXJ2aWNlLmNyZWF0ZURlZmF1bHRJbmZvKCk7CisgICAgICAgIGZpcnN0SW5mby5mZWVkYmFja1R5cGUgPSBBY2Nlc3NpYmlsaXR5U2VydmljZUluZm8uRkVFREJBQ0tfQVVESUJMRTsKKyAgICAgICAgZmlyc3RTZXJ2aWNlLnNldFNlcnZpY2VJbmZvKGZpcnN0SW5mbyk7CisKKyAgICAgICAgLy8gY29uZmlndXJlIHRoZSBzZWNvbmQgbW9jayBzZXJ2aWNlCisgICAgICAgIE1vY2tBY2Nlc3NpYmlsaXR5U2VydmljZSBzZWNvbmRTZXJ2aWNlID0gTXlTZWNvbmRNb2NrQWNjZXNzaWJpbGl0eVNlcnZpY2Uuc0luc3RhbmNlOworICAgICAgICBBY2Nlc3NpYmlsaXR5U2VydmljZUluZm8gc2Vjb25kSW5mbyA9IE1vY2tBY2Nlc3NpYmlsaXR5U2VydmljZS5jcmVhdGVEZWZhdWx0SW5mbygpOworICAgICAgICBzZWNvbmRJbmZvLmZlZWRiYWNrVHlwZSA9IEFjY2Vzc2liaWxpdHlTZXJ2aWNlSW5mby5GRUVEQkFDS19IQVBUSUM7CisgICAgICAgIHNlY29uZFNlcnZpY2Uuc2V0U2VydmljZUluZm8oc2Vjb25kSW5mbyk7CisKKyAgICAgICAgLy8gd2FpdCBmb3IgdGhlIGJpbmRlciBjYWxscyB0byAjc2V0U2VydmljZSB0byBjb21wbGV0ZQorICAgICAgICBUaHJlYWQuc2xlZXAoVElNRU9VVF9CSU5ERVJfQ0FMTCk7CisKKyAgICAgICAgLy8gY3JlYXRlIGFuZCBwb3B1bGF0ZSBhbiBldmVudCB0byBiZSBzZW50CisgICAgICAgIEFjY2Vzc2liaWxpdHlFdmVudCBzZW50RXZlbnQgPSBBY2Nlc3NpYmlsaXR5RXZlbnQub2J0YWluKCk7CisgICAgICAgIGZ1bGx5UG9wdWxhdGVEZWZhdWx0QWNjZXNzaWJpbGl0eUV2ZW50KHNlbnRFdmVudCk7CisKKyAgICAgICAgLy8gc2V0IGV4cGVjdGF0aW9ucyBmb3IgdGhlIGZpcnN0IG1vY2sgc2VydmljZQorICAgICAgICBmaXJzdFNlcnZpY2UuZXhwZWN0RXZlbnQoc2VudEV2ZW50KTsKKyAgICAgICAgZmlyc3RTZXJ2aWNlLnJlcGxheSgpOworCisgICAgICAgIC8vIHNldCBleHBlY3RhdGlvbnMgZm9yIHRoZSBzZWNvbmQgbW9jayBzZXJ2aWNlCisgICAgICAgIHNlY29uZFNlcnZpY2UuZXhwZWN0RXZlbnQoc2VudEV2ZW50KTsKKyAgICAgICAgc2Vjb25kU2VydmljZS5yZXBsYXkoKTsKKworICAgICAgICAvLyBzZW5kIHRoZSBldmVudAorICAgICAgICBtTWFuYWdlclNlcnZpY2Uuc2VuZEFjY2Vzc2liaWxpdHlFdmVudChzZW50RXZlbnQpOworCisgICAgICAgIC8vIHZlcmlmeSBpZiBhbGwgZXhwZWN0ZWQgbWV0aG9kcyBoYXZlIGJlZW4gY2FsbGVkCisgICAgICAgIGFzc2VydE1vY2tTZXJ2aWNlVmVyaWZpZWRXaXRoaW5UaW1lb3V0KGZpcnN0U2VydmljZSk7CisgICAgICAgIGFzc2VydE1vY2tTZXJ2aWNlVmVyaWZpZWRXaXRoaW5UaW1lb3V0KHNlY29uZFNlcnZpY2UpOworICAgIH0KKworICAgIEBMYXJnZVRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2VuZEFjY2Vzc2liaWxpdHlFdmVudF9Ud29TZXJ2aWNlc19NYXRjaGluZ1BhY2thZ2VBbmRFdmVudFR5cGUoKQorICAgICAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIC8vIHNldCB0aGUgYWNjZXNzaWJpbGl0eSBzZXR0aW5nIHZhbHVlCisgICAgICAgIGVuc3VyZUFjY2Vzc2liaWxpdHlFbmFibGVkKG1Db250ZXh0LCB0cnVlKTsKKworICAgICAgICAvLyBlbmFibGUgdGhlIG1vY2sgYWNjZXNzaWJpbGl0eSBzZXJ2aWNlcworICAgICAgICBlbnN1cmVPbmx5TW9ja1NlcnZpY2VzRW5hYmxlZChtQ29udGV4dCwgdHJ1ZSwgdHJ1ZSk7CisKKyAgICAgICAgLy8gY29uZmlndXJlIHRoZSBmaXJzdCBtb2NrIHNlcnZpY2UKKyAgICAgICAgTW9ja0FjY2Vzc2liaWxpdHlTZXJ2aWNlIGZpcnN0U2VydmljZSA9IE15Rmlyc3RNb2NrQWNjZXNzaWJpbGl0eVNlcnZpY2Uuc0luc3RhbmNlOworICAgICAgICBmaXJzdFNlcnZpY2Uuc2V0U2VydmljZUluZm8oTW9ja0FjY2Vzc2liaWxpdHlTZXJ2aWNlLmNyZWF0ZURlZmF1bHRJbmZvKCkpOworCisgICAgICAgIC8vIGNvbmZpZ3VyZSB0aGUgc2Vjb25kIG1vY2sgc2VydmljZQorICAgICAgICBNb2NrQWNjZXNzaWJpbGl0eVNlcnZpY2Ugc2Vjb25kU2VydmljZSA9IE15U2Vjb25kTW9ja0FjY2Vzc2liaWxpdHlTZXJ2aWNlLnNJbnN0YW5jZTsKKyAgICAgICAgc2Vjb25kU2VydmljZS5zZXRTZXJ2aWNlSW5mbyhNb2NrQWNjZXNzaWJpbGl0eVNlcnZpY2UuY3JlYXRlRGVmYXVsdEluZm8oKSk7CisKKyAgICAgICAgLy8gd2FpdCBmb3IgdGhlIGJpbmRlciBjYWxscyB0byAjc2V0U2VydmljZSB0byBjb21wbGV0ZQorICAgICAgICBUaHJlYWQuc2xlZXAoVElNRU9VVF9CSU5ERVJfQ0FMTCk7CisKKyAgICAgICAgLy8gY3JlYXRlIGFuZCBwb3B1bGF0ZSBhbiBldmVudCB0byBiZSBzZW50CisgICAgICAgIEFjY2Vzc2liaWxpdHlFdmVudCBzZW50RXZlbnQgPSBBY2Nlc3NpYmlsaXR5RXZlbnQub2J0YWluKCk7CisgICAgICAgIGZ1bGx5UG9wdWxhdGVEZWZhdWx0QWNjZXNzaWJpbGl0eUV2ZW50KHNlbnRFdmVudCk7CisKKyAgICAgICAgLy8gc2V0IGV4cGVjdGF0aW9ucyBmb3IgdGhlIGZpcnN0IG1vY2sgc2VydmljZQorICAgICAgICBmaXJzdFNlcnZpY2UuZXhwZWN0RXZlbnQoc2VudEV2ZW50KTsKKyAgICAgICAgZmlyc3RTZXJ2aWNlLnJlcGxheSgpOworCisgICAgICAgIC8vIHNldCBleHBlY3RhdGlvbnMgZm9yIHRoZSBzZWNvbmQgbW9jayBzZXJ2aWNlCisgICAgICAgIHNlY29uZFNlcnZpY2UucmVwbGF5KCk7CisKKyAgICAgICAgLy8gc2VuZCB0aGUgZXZlbnQKKyAgICAgICAgbU1hbmFnZXJTZXJ2aWNlLnNlbmRBY2Nlc3NpYmlsaXR5RXZlbnQoc2VudEV2ZW50KTsKKworICAgICAgICAvLyB2ZXJpZnkgaWYgYWxsIGV4cGVjdGVkIG1ldGhvZHMgaGF2ZSBiZWVuIGNhbGxlZAorICAgICAgICBhc3NlcnRNb2NrU2VydmljZVZlcmlmaWVkV2l0aGluVGltZW91dChmaXJzdFNlcnZpY2UpOworICAgICAgICBhc3NlcnRNb2NrU2VydmljZVZlcmlmaWVkV2l0aGluVGltZW91dChzZWNvbmRTZXJ2aWNlKTsKKyAgICB9CisKKyAgICBATGFyZ2VUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFNlbmRBY2Nlc3NpYmlsaXR5RXZlbnRfVHdvU2VydmljZXNfTWF0Y2hpbmdQYWNrYWdlQW5kRXZlbnRUeXBlX09uZURlZmF1bHQoKQorICAgICAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIC8vIHNldCB0aGUgYWNjZXNzaWJpbGl0eSBzZXR0aW5nIHZhbHVlCisgICAgICAgIGVuc3VyZUFjY2Vzc2liaWxpdHlFbmFibGVkKG1Db250ZXh0LCB0cnVlKTsKKworICAgICAgICAvLyBlbmFibGUgdGhlIG1vY2sgYWNjZXNzaWJpbGl0eSBzZXJ2aWNlcworICAgICAgICBlbnN1cmVPbmx5TW9ja1NlcnZpY2VzRW5hYmxlZChtQ29udGV4dCwgdHJ1ZSwgdHJ1ZSk7CisKKyAgICAgICAgLy8gY29uZmlndXJlIHRoZSBmaXJzdCBtb2NrIHNlcnZpY2UKKyAgICAgICAgTW9ja0FjY2Vzc2liaWxpdHlTZXJ2aWNlIGZpcnN0U2VydmljZSA9IE15Rmlyc3RNb2NrQWNjZXNzaWJpbGl0eVNlcnZpY2Uuc0luc3RhbmNlOworICAgICAgICBBY2Nlc3NpYmlsaXR5U2VydmljZUluZm8gZmlyc3RJbmZvID0gTXlGaXJzdE1vY2tBY2Nlc3NpYmlsaXR5U2VydmljZS5jcmVhdGVEZWZhdWx0SW5mbygpOworICAgICAgICBmaXJzdEluZm8uZmxhZ3MgPSBBY2Nlc3NpYmlsaXR5U2VydmljZUluZm8uREVGQVVMVDsKKyAgICAgICAgZmlyc3RTZXJ2aWNlLnNldFNlcnZpY2VJbmZvKGZpcnN0SW5mbyk7CisKKyAgICAgICAgLy8gY29uZmlndXJlIHRoZSBzZWNvbmQgbW9jayBzZXJ2aWNlCisgICAgICAgIE1vY2tBY2Nlc3NpYmlsaXR5U2VydmljZSBzZWNvbmRTZXJ2aWNlID0gTXlTZWNvbmRNb2NrQWNjZXNzaWJpbGl0eVNlcnZpY2Uuc0luc3RhbmNlOworICAgICAgICBzZWNvbmRTZXJ2aWNlLnNldFNlcnZpY2VJbmZvKE15U2Vjb25kTW9ja0FjY2Vzc2liaWxpdHlTZXJ2aWNlLmNyZWF0ZURlZmF1bHRJbmZvKCkpOworCisgICAgICAgIC8vIHdhaXQgZm9yIHRoZSBiaW5kZXIgY2FsbHMgdG8gI3NldFNlcnZpY2UgdG8gY29tcGxldGUKKyAgICAgICAgVGhyZWFkLnNsZWVwKFRJTUVPVVRfQklOREVSX0NBTEwpOworCisgICAgICAgIC8vIGNyZWF0ZSBhbmQgcG9wdWxhdGUgYW4gZXZlbnQgdG8gYmUgc2VudAorICAgICAgICBBY2Nlc3NpYmlsaXR5RXZlbnQgc2VudEV2ZW50ID0gQWNjZXNzaWJpbGl0eUV2ZW50Lm9idGFpbigpOworICAgICAgICBmdWxseVBvcHVsYXRlRGVmYXVsdEFjY2Vzc2liaWxpdHlFdmVudChzZW50RXZlbnQpOworCisgICAgICAgIC8vIHNldCBleHBlY3RhdGlvbnMgZm9yIHRoZSBmaXJzdCBtb2NrIHNlcnZpY2UKKyAgICAgICAgZmlyc3RTZXJ2aWNlLnJlcGxheSgpOworCisgICAgICAgIC8vIHNldCBleHBlY3RhdGlvbnMgZm9yIHRoZSBzZWNvbmQgbW9jayBzZXJ2aWNlCisgICAgICAgIHNlY29uZFNlcnZpY2UuZXhwZWN0RXZlbnQoc2VudEV2ZW50KTsKKyAgICAgICAgc2Vjb25kU2VydmljZS5yZXBsYXkoKTsKKworICAgICAgICAvLyBzZW5kIHRoZSBldmVudAorICAgICAgICBtTWFuYWdlclNlcnZpY2Uuc2VuZEFjY2Vzc2liaWxpdHlFdmVudChzZW50RXZlbnQpOworCisgICAgICAgIC8vIHZlcmlmeSBpZiBhbGwgZXhwZWN0ZWQgbWV0aG9kcyBoYXZlIGJlZW4gY2FsbGVkCisgICAgICAgIGFzc2VydE1vY2tTZXJ2aWNlVmVyaWZpZWRXaXRoaW5UaW1lb3V0KGZpcnN0U2VydmljZSk7CisgICAgICAgIGFzc2VydE1vY2tTZXJ2aWNlVmVyaWZpZWRXaXRoaW5UaW1lb3V0KHNlY29uZFNlcnZpY2UpOworICAgIH0KKworICAgIEBMYXJnZVRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2VuZEFjY2Vzc2liaWxpdHlFdmVudF9Ud29TZXJ2aWNlc19NYXRjaGluZ1BhY2thZ2VBbmRFdmVudFR5cGVfVHdvRGVmYXVsdCgpCisgICAgICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gc2V0IHRoZSBhY2Nlc3NpYmlsaXR5IHNldHRpbmcgdmFsdWUKKyAgICAgICAgZW5zdXJlQWNjZXNzaWJpbGl0eUVuYWJsZWQobUNvbnRleHQsIHRydWUpOworCisgICAgICAgIC8vIGVuYWJsZSB0aGUgbW9jayBhY2Nlc3NpYmlsaXR5IHNlcnZpY2VzCisgICAgICAgIGVuc3VyZU9ubHlNb2NrU2VydmljZXNFbmFibGVkKG1Db250ZXh0LCB0cnVlLCB0cnVlKTsKKworICAgICAgICAvLyBjb25maWd1cmUgdGhlIGZpcnN0IG1vY2sgc2VydmljZQorICAgICAgICBNb2NrQWNjZXNzaWJpbGl0eVNlcnZpY2UgZmlyc3RTZXJ2aWNlID0gTXlGaXJzdE1vY2tBY2Nlc3NpYmlsaXR5U2VydmljZS5zSW5zdGFuY2U7CisgICAgICAgIEFjY2Vzc2liaWxpdHlTZXJ2aWNlSW5mbyBmaXJzdEluZm8gPSBNeUZpcnN0TW9ja0FjY2Vzc2liaWxpdHlTZXJ2aWNlLmNyZWF0ZURlZmF1bHRJbmZvKCk7CisgICAgICAgIGZpcnN0SW5mby5mbGFncyA9IEFjY2Vzc2liaWxpdHlTZXJ2aWNlSW5mby5ERUZBVUxUOworICAgICAgICBmaXJzdFNlcnZpY2Uuc2V0U2VydmljZUluZm8oZmlyc3RJbmZvKTsKKworICAgICAgICAvLyBjb25maWd1cmUgdGhlIHNlY29uZCBtb2NrIHNlcnZpY2UKKyAgICAgICAgTW9ja0FjY2Vzc2liaWxpdHlTZXJ2aWNlIHNlY29uZFNlcnZpY2UgPSBNeVNlY29uZE1vY2tBY2Nlc3NpYmlsaXR5U2VydmljZS5zSW5zdGFuY2U7CisgICAgICAgIEFjY2Vzc2liaWxpdHlTZXJ2aWNlSW5mbyBzZWNvbmRJbmZvID0gTXlGaXJzdE1vY2tBY2Nlc3NpYmlsaXR5U2VydmljZS5jcmVhdGVEZWZhdWx0SW5mbygpOworICAgICAgICBzZWNvbmRJbmZvLmZsYWdzID0gQWNjZXNzaWJpbGl0eVNlcnZpY2VJbmZvLkRFRkFVTFQ7CisgICAgICAgIHNlY29uZFNlcnZpY2Uuc2V0U2VydmljZUluZm8oZmlyc3RJbmZvKTsKKworICAgICAgICAvLyB3YWl0IGZvciB0aGUgYmluZGVyIGNhbGxzIHRvICNzZXRTZXJ2aWNlIHRvIGNvbXBsZXRlCisgICAgICAgIFRocmVhZC5zbGVlcChUSU1FT1VUX0JJTkRFUl9DQUxMKTsKKworICAgICAgICAvLyBjcmVhdGUgYW5kIHBvcHVsYXRlIGFuIGV2ZW50IHRvIGJlIHNlbnQKKyAgICAgICAgQWNjZXNzaWJpbGl0eUV2ZW50IHNlbnRFdmVudCA9IEFjY2Vzc2liaWxpdHlFdmVudC5vYnRhaW4oKTsKKyAgICAgICAgZnVsbHlQb3B1bGF0ZURlZmF1bHRBY2Nlc3NpYmlsaXR5RXZlbnQoc2VudEV2ZW50KTsKKworICAgICAgICAvLyBzZXQgZXhwZWN0YXRpb25zIGZvciB0aGUgZmlyc3QgbW9jayBzZXJ2aWNlCisgICAgICAgIGZpcnN0U2VydmljZS5leHBlY3RFdmVudChzZW50RXZlbnQpOworICAgICAgICBmaXJzdFNlcnZpY2UucmVwbGF5KCk7CisKKyAgICAgICAgLy8gc2V0IGV4cGVjdGF0aW9ucyBmb3IgdGhlIHNlY29uZCBtb2NrIHNlcnZpY2UKKyAgICAgICAgc2Vjb25kU2VydmljZS5yZXBsYXkoKTsKKworICAgICAgICAvLyBzZW5kIHRoZSBldmVudAorICAgICAgICBtTWFuYWdlclNlcnZpY2Uuc2VuZEFjY2Vzc2liaWxpdHlFdmVudChzZW50RXZlbnQpOworCisgICAgICAgIC8vIHZlcmlmeSBpZiBhbGwgZXhwZWN0ZWQgbWV0aG9kcyBoYXZlIGJlZW4gY2FsbGVkCisgICAgICAgIGFzc2VydE1vY2tTZXJ2aWNlVmVyaWZpZWRXaXRoaW5UaW1lb3V0KGZpcnN0U2VydmljZSk7CisgICAgICAgIGFzc2VydE1vY2tTZXJ2aWNlVmVyaWZpZWRXaXRoaW5UaW1lb3V0KHNlY29uZFNlcnZpY2UpOworICAgIH0KKworICAgIEBMYXJnZVRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SW50ZXJydXB0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIC8vIHNldCB0aGUgYWNjZXNzaWJpbGl0eSBzZXR0aW5nIHZhbHVlCisgICAgICAgIGVuc3VyZUFjY2Vzc2liaWxpdHlFbmFibGVkKG1Db250ZXh0LCB0cnVlKTsKKworICAgICAgICAvLyBlbmFibGUgdGhlIG1vY2sgYWNjZXNzaWJpbGl0eSBzZXJ2aWNlcworICAgICAgICBlbnN1cmVPbmx5TW9ja1NlcnZpY2VzRW5hYmxlZChtQ29udGV4dCwgdHJ1ZSwgdHJ1ZSk7CisKKyAgICAgICAgLy8gY29uZmlndXJlIHRoZSBmaXJzdCBtb2NrIHNlcnZpY2UKKyAgICAgICAgTW9ja0FjY2Vzc2liaWxpdHlTZXJ2aWNlIGZpcnN0U2VydmljZSA9IE15Rmlyc3RNb2NrQWNjZXNzaWJpbGl0eVNlcnZpY2Uuc0luc3RhbmNlOworICAgICAgICBmaXJzdFNlcnZpY2Uuc2V0U2VydmljZUluZm8oTW9ja0FjY2Vzc2liaWxpdHlTZXJ2aWNlLmNyZWF0ZURlZmF1bHRJbmZvKCkpOworCisgICAgICAgIC8vIGNvbmZpZ3VyZSB0aGUgc2Vjb25kIG1vY2sgc2VydmljZQorICAgICAgICBNb2NrQWNjZXNzaWJpbGl0eVNlcnZpY2Ugc2Vjb25kU2VydmljZSA9IE15U2Vjb25kTW9ja0FjY2Vzc2liaWxpdHlTZXJ2aWNlLnNJbnN0YW5jZTsKKyAgICAgICAgc2Vjb25kU2VydmljZS5zZXRTZXJ2aWNlSW5mbyhNb2NrQWNjZXNzaWJpbGl0eVNlcnZpY2UuY3JlYXRlRGVmYXVsdEluZm8oKSk7CisKKyAgICAgICAgLy8gd2FpdCBmb3IgdGhlIGJpbmRlciBjYWxscyB0byAjc2V0U2VydmljZSB0byBjb21wbGV0ZQorICAgICAgICBUaHJlYWQuc2xlZXAoVElNRU9VVF9CSU5ERVJfQ0FMTCk7CisKKyAgICAgICAgLy8gc2V0IGV4cGVjdGF0aW9ucyBmb3IgdGhlIGZpcnN0IG1vY2sgc2VydmljZQorICAgICAgICBmaXJzdFNlcnZpY2UuZXhwZWN0SW50ZXJydXB0KCk7CisgICAgICAgIGZpcnN0U2VydmljZS5yZXBsYXkoKTsKKworICAgICAgICAvLyBzZXQgZXhwZWN0YXRpb25zIGZvciB0aGUgc2Vjb25kIG1vY2sgc2VydmljZQorICAgICAgICBzZWNvbmRTZXJ2aWNlLmV4cGVjdEludGVycnVwdCgpOworICAgICAgICBzZWNvbmRTZXJ2aWNlLnJlcGxheSgpOworCisgICAgICAgIC8vIGNhbGwgdGhlIG1ldGhvZCB1bmRlciB0ZXN0CisgICAgICAgIG1NYW5hZ2VyU2VydmljZS5pbnRlcnJ1cHQoKTsKKworICAgICAgICAvLyB2ZXJpZnkgaWYgYWxsIGV4cGVjdGVkIG1ldGhvZHMgaGF2ZSBiZWVuIGNhbGxlZAorICAgICAgICBhc3NlcnRNb2NrU2VydmljZVZlcmlmaWVkV2l0aGluVGltZW91dChmaXJzdFNlcnZpY2UpOworICAgICAgICBhc3NlcnRNb2NrU2VydmljZVZlcmlmaWVkV2l0aGluVGltZW91dChzZWNvbmRTZXJ2aWNlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBGdWxseSBwb3B1bGF0ZXMgdGhlIHtAbGluayBBY2Nlc3NpYmlsaXR5RXZlbnR9IHRvIG1hcnNoYWwuCisgICAgICoKKyAgICAgKiBAcGFyYW0gc2VudEV2ZW50IFRoZSBldmVudCB0byBwb3B1bGF0ZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgZnVsbHlQb3B1bGF0ZURlZmF1bHRBY2Nlc3NpYmlsaXR5RXZlbnQoQWNjZXNzaWJpbGl0eUV2ZW50IHNlbnRFdmVudCkgeworICAgICAgICBzZW50RXZlbnQuc2V0QWRkZWRDb3VudCgxKTsKKyAgICAgICAgc2VudEV2ZW50LnNldEJlZm9yZVRleHQoIkJlZm9yZVRleHQiKTsKKyAgICAgICAgc2VudEV2ZW50LnNldENoZWNrZWQodHJ1ZSk7CisgICAgICAgIHNlbnRFdmVudC5zZXRDbGFzc05hbWUoImZvby5iYXIuYmF6LkNsYXNzIik7CisgICAgICAgIHNlbnRFdmVudC5zZXRDb250ZW50RGVzY3JpcHRpb24oIkNvbnRlbnREZXNjcmlwdGlvbiIpOworICAgICAgICBzZW50RXZlbnQuc2V0Q3VycmVudEl0ZW1JbmRleCgxKTsKKyAgICAgICAgc2VudEV2ZW50LnNldEVuYWJsZWQodHJ1ZSk7CisgICAgICAgIHNlbnRFdmVudC5zZXRFdmVudFR5cGUoQWNjZXNzaWJpbGl0eUV2ZW50LlRZUEVfVklFV19DTElDS0VEKTsKKyAgICAgICAgc2VudEV2ZW50LnNldEV2ZW50VGltZSgxMDAwKTsKKyAgICAgICAgc2VudEV2ZW50LnNldEZyb21JbmRleCgxKTsKKyAgICAgICAgc2VudEV2ZW50LnNldEZ1bGxTY3JlZW4odHJ1ZSk7CisgICAgICAgIHNlbnRFdmVudC5zZXRJdGVtQ291bnQoMSk7CisgICAgICAgIHNlbnRFdmVudC5zZXRQYWNrYWdlTmFtZSgiZm9vLmJhci5iYXoiKTsKKyAgICAgICAgc2VudEV2ZW50LnNldFBhcmNlbGFibGVEYXRhKE1lc3NhZ2Uub2J0YWluKG51bGwsIDEsIG51bGwpKTsKKyAgICAgICAgc2VudEV2ZW50LnNldFBhc3N3b3JkKHRydWUpOworICAgICAgICBzZW50RXZlbnQuc2V0UmVtb3ZlZENvdW50KDEpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoaXMgY2xhc3MgaXMgYSBtb2NrIHtAbGluayBJQWNjZXNzaWJpbGl0eU1hbmFnZXJDbGllbnR9LgorICAgICAqLworICAgIHB1YmxpYyBjbGFzcyBNeU1vY2tBY2Nlc3NpYmlsaXR5TWFuYWdlckNsaWVudCBleHRlbmRzIElBY2Nlc3NpYmlsaXR5TWFuYWdlckNsaWVudC5TdHViIHsKKyAgICAgICAgYm9vbGVhbiBtSXNFbmFibGVkOworCisgICAgICAgIHB1YmxpYyB2b2lkIHNldEVuYWJsZWQoYm9vbGVhbiBlbmFibGVkKSB7CisgICAgICAgICAgICBtSXNFbmFibGVkID0gZW5hYmxlZDsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEVuc3VyZXMgYWNjZXNzaWJpbGl0eSBpcyBpbiBhIGdpdmVuIHN0YXRlIGJ5IHdyaXRpbmcgdGhlIHN0YXRlIHRvIHRoZQorICAgICAqIHNldHRpbmdzIGFuZCB3YWl0aW5nIHVudGlsIHRoZSBhY2Nlc3NpYmlsaXR5IG1hbmFnZXIgc2VydmljZSBwaWNrIGl0IHVwLgorICAgICAqCisgICAgICogQHBhcmFtIGNvbnRleHQgQSBjb250ZXh0IGhhbmRsZSB0byBhY2Nlc3MgdGhlIHNldHRpbmdzLgorICAgICAqIEBwYXJhbSBlbmFibGVkIFRoZSBhY2Nlc3NpYmlsaXR5IHN0YXRlIHRvIHdyaXRlIHRvIHRoZSBzZXR0aW5ncy4KKyAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbiBJZiBhbnkgZXJyb3Igb2NjdXJzLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBlbnN1cmVBY2Nlc3NpYmlsaXR5RW5hYmxlZChDb250ZXh0IGNvbnRleHQsIGJvb2xlYW4gZW5hYmxlZCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGJvb2xlYW4gaXNFbmFibGVkID0gKFNldHRpbmdzLlNlY3VyZS5nZXRJbnQoY29udGV4dC5nZXRDb250ZW50UmVzb2x2ZXIoKSwKKyAgICAgICAgICAgICAgICBTZXR0aW5ncy5TZWN1cmUuQUNDRVNTSUJJTElUWV9FTkFCTEVELCAwKSA9PSAxID8gdHJ1ZSA6IGZhbHNlKTsKKworICAgICAgICBpZiAoaXNFbmFibGVkID09IGVuYWJsZWQpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIFNldHRpbmdzLlNlY3VyZS5wdXRJbnQoY29udGV4dC5nZXRDb250ZW50UmVzb2x2ZXIoKSwgU2V0dGluZ3MuU2VjdXJlLkFDQ0VTU0lCSUxJVFlfRU5BQkxFRCwKKyAgICAgICAgICAgICAgICBlbmFibGVkID8gMSA6IDApOworCisgICAgICAgIC8vIHdhaXQgdGhlIGFjY2Vzc2liaWxpdHkgbWFuYWdlciBzZXJ2aWNlIHRvIHBpY2sgdGhlIGNoYW5nZSB1cAorICAgICAgICBUaHJlYWQuc2xlZXAoVElNRU9VVF9CSU5ERVJfQ0FMTCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogRW5zdXJlcyB0aGUgb25seSB7QGxpbmsgTW9ja0FjY2Vzc2liaWxpdHlTZXJ2aWNlfXMgd2l0aCBnaXZlbiBjb21wb25lbnQKKyAgICAgKiBuYW1lcyBhcmUgZW5hYmxlZCBieSB3cml0aW5nIHRvIHRoZSBzeXN0ZW0gc2V0dGluZ3MgYW5kIHdhaXRpbmcgdW50aWwgdGhlCisgICAgICogYWNjZXNzaWJpbGl0eSBtYW5hZ2VyIHNlcnZpY2UgcGlja3MgdGhhdCB1cCBvciB0aGUKKyAgICAgKiB7QGxpbmsgI1RJTUVPVVRfU1RBUlRfTU9DS19BQ0NFU1NJQklMSVRZX1NFUlZJQ0VTfSBpcyBleGNlZWRlZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb250ZXh0IEEgY29udGV4dCBoYW5kbGUgdG8gYWNjZXNzIHRoZSBzZXR0aW5ncy4KKyAgICAgKiBAcGFyYW0gZmlyc3RNb2NrU2VydmljZUVuYWJsZWQgSWYgdGhlIGZpcnN0IG1vY2sgYWNjZXNzaWJpbGl0eSBzZXJ2aWNlIGlzIGVuYWJsZWQuCisgICAgICogQHBhcmFtIHNlY29uZE1vY2tTZXJ2aWNlRW5hYmxlZCBJZiB0aGUgc2Vjb25kIG1vY2sgYWNjZXNzaWJpbGl0eSBzZXJ2aWNlIGlzIGVuYWJsZWQuCisgICAgICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gSWYgc29tZSBvZiB0aGUgcmVxdWVzdGVkIGZvciBlbmFibGluZyBtb2NrIHNlcnZpY2VzCisgICAgICogICAgICAgICBpcyBub3QgcHJvcGVybHkgc3RhcnRlZC4KKyAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbiBFeGNlcHRpb24gSWYgYW55IGVycm9yIG9jY3Vycy4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgZW5zdXJlT25seU1vY2tTZXJ2aWNlc0VuYWJsZWQoQ29udGV4dCBjb250ZXh0LCBib29sZWFuIGZpcnN0TW9ja1NlcnZpY2VFbmFibGVkLAorICAgICAgICAgICAgYm9vbGVhbiBzZWNvbmRNb2NrU2VydmljZUVuYWJsZWQpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBTdHJpbmcgZW5hYmxlZFNlcnZpY2VzID0gU2V0dGluZ3MuU2VjdXJlLmdldFN0cmluZyhjb250ZXh0LmdldENvbnRlbnRSZXNvbHZlcigpLAorICAgICAgICAgICAgICAgIFNldHRpbmdzLlNlY3VyZS5FTkFCTEVEX0FDQ0VTU0lCSUxJVFlfU0VSVklDRVMpOworCisgICAgICAgIFN0cmluZ0J1aWxkZXIgc2VydmljZXNUb0VuYWJsZSA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisgICAgICAgIGlmIChmaXJzdE1vY2tTZXJ2aWNlRW5hYmxlZCkgeworICAgICAgICAgICAgc2VydmljZXNUb0VuYWJsZS5hcHBlbmQoTXlGaXJzdE1vY2tBY2Nlc3NpYmlsaXR5U2VydmljZS5zQ29tcG9uZW50TmFtZSkuYXBwZW5kKCI6Iik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHNlY29uZE1vY2tTZXJ2aWNlRW5hYmxlZCkgeworICAgICAgICAgICAgc2VydmljZXNUb0VuYWJsZS5hcHBlbmQoTXlTZWNvbmRNb2NrQWNjZXNzaWJpbGl0eVNlcnZpY2Uuc0NvbXBvbmVudE5hbWUpLmFwcGVuZCgiOiIpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHNlcnZpY2VzVG9FbmFibGUuZXF1YWxzKGVuYWJsZWRTZXJ2aWNlcykpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIFNldHRpbmdzLlNlY3VyZS5wdXRTdHJpbmcoY29udGV4dC5nZXRDb250ZW50UmVzb2x2ZXIoKSwKKyAgICAgICAgICAgICAgICBTZXR0aW5ncy5TZWN1cmUuRU5BQkxFRF9BQ0NFU1NJQklMSVRZX1NFUlZJQ0VTLCBzZXJ2aWNlc1RvRW5hYmxlLnRvU3RyaW5nKCkpOworCisgICAgICAgIC8vIHdlIGhhdmUgZW5hYmxlZCB0aGUgc2VydmljZXMgb2YgaW50ZXJlc3QgYW5kIG5lZWQgdG8gd2FpdCB1bnRpbCB0aGV5CisgICAgICAgIC8vIGFyZSBpbnN0YW50aWF0ZWQgYW5kIHN0YXJ0ZWQgKGlmIG5lZWRlZCkgYW5kIHRoZSBzeXN0ZW0gYmluZHMgdG8gdGhlbQorICAgICAgICBib29sZWFuIGZpcnN0TW9ja1NlcnZpY2VPSyA9IGZhbHNlOworICAgICAgICBib29sZWFuIHNlY29uZE1vY2tTZXJ2aWNlT0sgPSBmYWxzZTsKKyAgICAgICAgbG9uZyBzdGFydCA9IFN5c3RlbUNsb2NrLnVwdGltZU1pbGxpcygpOworICAgICAgICBsb25nIHBvbGxpbmdJbnRlcnZhbCA9IFRJTUVPVVRfU1RBUlRfTU9DS19BQ0NFU1NJQklMSVRZX1NFUlZJQ0VTIC8gNjsKKworICAgICAgICB3aGlsZSAoU3lzdGVtQ2xvY2sudXB0aW1lTWlsbGlzKCkgLSBzdGFydCA8IFRJTUVPVVRfU1RBUlRfTU9DS19BQ0NFU1NJQklMSVRZX1NFUlZJQ0VTKSAgeworICAgICAgICAgICAgZmlyc3RNb2NrU2VydmljZU9LID0gIWZpcnN0TW9ja1NlcnZpY2VFbmFibGVkCisgICAgICAgICAgICAgICAgICAgIHx8IChNeUZpcnN0TW9ja0FjY2Vzc2liaWxpdHlTZXJ2aWNlLnNJbnN0YW5jZSAhPSBudWxsCisgICAgICAgICAgICAgICAgICAgICYmIE15Rmlyc3RNb2NrQWNjZXNzaWJpbGl0eVNlcnZpY2Uuc0luc3RhbmNlLmlzU3lzdGVtQm91bmRBc0NsaWVudCgpKTsKKworICAgICAgICAgICAgc2Vjb25kTW9ja1NlcnZpY2VPSyA9ICFzZWNvbmRNb2NrU2VydmljZUVuYWJsZWQKKyAgICAgICAgICAgICAgICAgICAgfHwgKE15U2Vjb25kTW9ja0FjY2Vzc2liaWxpdHlTZXJ2aWNlLnNJbnN0YW5jZSAhPSBudWxsCisgICAgICAgICAgICAgICAgICAgICYmIE15U2Vjb25kTW9ja0FjY2Vzc2liaWxpdHlTZXJ2aWNlLnNJbnN0YW5jZS5pc1N5c3RlbUJvdW5kQXNDbGllbnQoKSk7CisKKyAgICAgICAgICAgIGlmIChmaXJzdE1vY2tTZXJ2aWNlT0sgJiYgc2Vjb25kTW9ja1NlcnZpY2VPSykgeworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgVGhyZWFkLnNsZWVwKHBvbGxpbmdJbnRlcnZhbCk7CisgICAgICAgIH0KKworICAgICAgICBTdHJpbmdCdWlsZGVyIG1lc3NhZ2UgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgICAgICBtZXNzYWdlLmFwcGVuZCgiTW9jayBhY2Nlc3NpYmlsaXR5IHNlcnZpY2VzIG5vdCBzdGFydGVkIG9yIHN5c3RlbSBub3QgYm91bmQgYXMgYSBjbGllbnQ6ICIpOworICAgICAgICBpZiAoIWZpcnN0TW9ja1NlcnZpY2VPSykgeworICAgICAgICAgICAgbWVzc2FnZS5hcHBlbmQoTXlGaXJzdE1vY2tBY2Nlc3NpYmlsaXR5U2VydmljZS5zQ29tcG9uZW50TmFtZSk7CisgICAgICAgICAgICBtZXNzYWdlLmFwcGVuZCgiICIpOworICAgICAgICB9CisgICAgICAgIGlmICghc2Vjb25kTW9ja1NlcnZpY2VPSykgeworICAgICAgICAgICAgbWVzc2FnZS5hcHBlbmQoTXlTZWNvbmRNb2NrQWNjZXNzaWJpbGl0eVNlcnZpY2Uuc0NvbXBvbmVudE5hbWUpOworICAgICAgICB9CisgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24obWVzc2FnZS50b1N0cmluZygpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBc3NlcnRzIHRoZSB0aGUgbW9jayBhY2Nlc3NpYmlsaXR5IHNlcnZpY2UgaGFzIGJlZW4gc3VjY2Vzc2Z1bGx5IHZlcmlmaWVkCisgICAgICogKHdoaWNoIGlzIGl0IGhhcyByZWNlaXZlZCB0aGUgZXhwZWN0ZWQgbWV0aG9kIGNhbGxzIHdpdGggZXhwZWN0ZWQKKyAgICAgKiBhcmd1bWVudHMpIHdpdGhpbiB0aGUge0BsaW5rICNUSU1FT1VUX0JJTkRFUl9DQUxMfS4gVGhlIHZlcmlmaWVkIHN0YXRlIGlzCisgICAgICogY2hlY2tlZCBieSBwb2xsaW5nIHVwb24gc21hbGwgaW50ZXJ2YWxzLgorICAgICAqCisgICAgICogQHBhcmFtIHNlcnZpY2UgVGhlIHNlcnZpY2UgdG8gdmVyaWZ5LgorICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uIElmIHRoZSB2ZXJpZmljYXRpb24gaGFzIGZhaWxlZCB3aXRoIGV4Y2VwdGlvbiBhZnRlciB0aGUKKyAgICAgKiAgICAgICAgICAgICB7QGxpbmsgI1RJTUVPVVRfQklOREVSX0NBTEx9LgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBhc3NlcnRNb2NrU2VydmljZVZlcmlmaWVkV2l0aGluVGltZW91dChNb2NrQWNjZXNzaWJpbGl0eVNlcnZpY2Ugc2VydmljZSkKKyAgICAgICAgICAgIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBFeGNlcHRpb24gbGFzdFZlcmlmeUV4Y2VwdGlvbiA9IG51bGw7CisgICAgICAgIGxvbmcgYmVnaW5UaW1lID0gU3lzdGVtQ2xvY2sudXB0aW1lTWlsbGlzKCk7CisgICAgICAgIGxvbmcgcG9sbFRtZW91dCA9IFRJTUVPVVRfQklOREVSX0NBTEwgLyA1OworCisgICAgICAgIC8vIHBvbGwgdW50aWwgdGhlIHRpbWVvdXQgaGFzIGVsYXBzZWQKKyAgICAgICAgd2hpbGUgKFN5c3RlbUNsb2NrLnVwdGltZU1pbGxpcygpIC0gYmVnaW5UaW1lIDwgVElNRU9VVF9CSU5ERVJfQ0FMTCkgeworICAgICAgICAgICAgLy8gc2xlZXAgZmlyc3Qgc2luY2UgaW1tZWRpYXRlIGNhbGwgd2lsbCBhbHdheXMgZmFpbAorICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBUaHJlYWQuc2xlZXAocG9sbFRtZW91dCk7CisgICAgICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBpZSkgeworICAgICAgICAgICAgICAgIC8qIGlnbm9yZSAqLworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gcG9sbCBmb3IgdmVyaWZpY2F0aW9uIGFuZCBpZiB0aGlzIGZhaWxzIHNhdmUgdGhlIGV4Y2VwdGlvbiBhbmQKKyAgICAgICAgICAgIC8vIGtlZXAgcG9sbGluZworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBzZXJ2aWNlLnZlcmlmeSgpOworICAgICAgICAgICAgICAgIC8vIHJlc2V0IHNvIGl0IGRvZXMgbm90IGFjY2VwdCBtb3JlIGV2ZW50cworICAgICAgICAgICAgICAgIHNlcnZpY2UucmVzZXQoKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIGxhc3RWZXJpZnlFeGNlcHRpb24gPSBlOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gcmVzZXQsIHdlIGhhdmUgYWxyZWFkeSBmYWlsZWQKKyAgICAgICAgc2VydmljZS5yZXNldCgpOworCisgICAgICAgIC8vIGFsd2F5cyBub3QgbnVsbAorICAgICAgICB0aHJvdyBsYXN0VmVyaWZ5RXhjZXB0aW9uOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoaXMgY2xhc3MgaXMgdGhlIGZpcnN0IG1vY2sge0BsaW5rIEFjY2Vzc2liaWxpdHlTZXJ2aWNlfS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIE15Rmlyc3RNb2NrQWNjZXNzaWJpbGl0eVNlcnZpY2UgZXh0ZW5kcyBNb2NrQWNjZXNzaWJpbGl0eVNlcnZpY2UgeworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgc2VydmljZSB7QGxpbmsgQ29tcG9uZW50TmFtZX0gZmxhdHRlbmVkIGFzIGEgc3RyaW5nLgorICAgICAgICAgKi8KKyAgICAgICAgc3RhdGljIGZpbmFsIFN0cmluZyBzQ29tcG9uZW50TmFtZSA9IG5ldyBDb21wb25lbnROYW1lKAorICAgICAgICAgICAgICAgIHNQYWNrYWdlTmFtZSwKKyAgICAgICAgICAgICAgICBNeUZpcnN0TW9ja0FjY2Vzc2liaWxpdHlTZXJ2aWNlLmNsYXNzLmdldE5hbWUoKQorICAgICAgICAgICAgICAgICkuZmxhdHRlblRvU2hvcnRTdHJpbmcoKTsKKworICAgICAgICAvKioKKyAgICAgICAgICogSGFuZGxlIHRvIHRoZSBzZXJ2aWNlIGluc3RhbmNlLgorICAgICAgICAgKi8KKyAgICAgICAgc3RhdGljIE15Rmlyc3RNb2NrQWNjZXNzaWJpbGl0eVNlcnZpY2Ugc0luc3RhbmNlOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIE15Rmlyc3RNb2NrQWNjZXNzaWJpbGl0eVNlcnZpY2UoKSB7CisgICAgICAgICAgICBzSW5zdGFuY2UgPSB0aGlzOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhpcyBjbGFzcyBpcyB0aGUgZmlyc3QgbW9jayB7QGxpbmsgQWNjZXNzaWJpbGl0eVNlcnZpY2V9LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgTXlTZWNvbmRNb2NrQWNjZXNzaWJpbGl0eVNlcnZpY2UgZXh0ZW5kcyBNb2NrQWNjZXNzaWJpbGl0eVNlcnZpY2UgeworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgc2VydmljZSB7QGxpbmsgQ29tcG9uZW50TmFtZX0gZmxhdHRlbmVkIGFzIGEgc3RyaW5nLgorICAgICAgICAgKi8KKyAgICAgICAgc3RhdGljIGZpbmFsIFN0cmluZyBzQ29tcG9uZW50TmFtZSA9IG5ldyBDb21wb25lbnROYW1lKAorICAgICAgICAgICAgICAgIHNQYWNrYWdlTmFtZSwKKyAgICAgICAgICAgICAgICBNeVNlY29uZE1vY2tBY2Nlc3NpYmlsaXR5U2VydmljZS5jbGFzcy5nZXROYW1lKCkKKyAgICAgICAgICAgICAgICApLmZsYXR0ZW5Ub1Nob3J0U3RyaW5nKCk7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEhhbmRsZSB0byB0aGUgc2VydmljZSBpbnN0YW5jZS4KKyAgICAgICAgICovCisgICAgICAgIHN0YXRpYyBNeVNlY29uZE1vY2tBY2Nlc3NpYmlsaXR5U2VydmljZSBzSW5zdGFuY2U7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgTXlTZWNvbmRNb2NrQWNjZXNzaWJpbGl0eVNlcnZpY2UoKSB7CisgICAgICAgICAgICBzSW5zdGFuY2UgPSB0aGlzOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvdGVzdHMvc2VydmljZXN0ZXN0cy9zcmMvY29tL2FuZHJvaWQvc2VydmVyL0FjY2Vzc2liaWxpdHlNYW5hZ2VyVGVzdC5qYXZhIGIvc2VydmljZXMvdGVzdHMvc2VydmljZXN0ZXN0cy9zcmMvY29tL2FuZHJvaWQvc2VydmVyL0FjY2Vzc2liaWxpdHlNYW5hZ2VyVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM4ZmVkMjIKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy90ZXN0cy9zZXJ2aWNlc3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9zZXJ2ZXIvQWNjZXNzaWJpbGl0eU1hbmFnZXJUZXN0LmphdmEKQEAgLTAsMCArMSwyNTcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLnNlcnZlcjsKKworaW1wb3J0IHN0YXRpYyBvcmcuZWFzeW1vY2suRWFzeU1vY2suY3JlYXRlU3RyaWN0TW9jazsKK2ltcG9ydCBzdGF0aWMgb3JnLmVhc3ltb2NrLkVhc3lNb2NrLmV4cGVjdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmVhc3ltb2NrLkVhc3lNb2NrLnJlcGxheTsKK2ltcG9ydCBzdGF0aWMgb3JnLmVhc3ltb2NrLkVhc3lNb2NrLnJlcG9ydE1hdGNoZXI7CitpbXBvcnQgc3RhdGljIG9yZy5lYXN5bW9jay5FYXN5TW9jay5yZXNldDsKK2ltcG9ydCBzdGF0aWMgb3JnLmVhc3ltb2NrLkVhc3lNb2NrLnZlcmlmeTsKKworaW1wb3J0IG9yZy5lYXN5bW9jay5JQXJndW1lbnRNYXRjaGVyOworCitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLlNlcnZpY2VJbmZvOworaW1wb3J0IGFuZHJvaWQudGVzdC5BbmRyb2lkVGVzdENhc2U7CitpbXBvcnQgYW5kcm9pZC50ZXN0LnN1aXRlYnVpbGRlci5hbm5vdGF0aW9uLkxhcmdlVGVzdDsKK2ltcG9ydCBhbmRyb2lkLnRlc3Quc3VpdGVidWlsZGVyLmFubm90YXRpb24uTWVkaXVtVGVzdDsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmlsaXR5RXZlbnQ7CitpbXBvcnQgYW5kcm9pZC52aWV3LmFjY2Vzc2liaWxpdHkuQWNjZXNzaWJpbGl0eU1hbmFnZXI7CitpbXBvcnQgYW5kcm9pZC52aWV3LmFjY2Vzc2liaWxpdHkuSUFjY2Vzc2liaWxpdHlNYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQudmlldy5hY2Nlc3NpYmlsaXR5LklBY2Nlc3NpYmlsaXR5TWFuYWdlckNsaWVudDsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKKy8qKgorICogVGVzdHMgZm9yIHRoZSBBY2Nlc3NpYmlsaXR5TWFuYWdlciB3aGljaCBtb2NraW5nIHRoZSBiYWNraW5nIHNlcnZpY2UuCisgKi8KK3B1YmxpYyBjbGFzcyBBY2Nlc3NpYmlsaXR5TWFuYWdlclRlc3QgZXh0ZW5kcyBBbmRyb2lkVGVzdENhc2UgeworCisgICAgLyoqCisgICAgICogVGltZW91dCByZXF1aXJlZCBmb3IgcGVuZGluZyBCaW5kZXIgY2FsbHMgb3IgZXZlbnQgcHJvY2Vzc2luZyB0bworICAgICAqIGNvbXBsZXRlLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgbG9uZyBUSU1FT1VUX0JJTkRFUl9DQUxMID0gNTA7CisKKyAgICAvKioKKyAgICAgKiBUaGUgcmV1c2FibGUgbW9jayB7QGxpbmsgSUFjY2Vzc2liaWxpdHlNYW5hZ2VyfS4KKyAgICAgKi8KKyAgICBwcml2YXRlIGZpbmFsIElBY2Nlc3NpYmlsaXR5TWFuYWdlciBtTW9ja1NlcnZpY2VJbnRlcmZhY2UgPQorICAgICAgICBjcmVhdGVTdHJpY3RNb2NrKElBY2Nlc3NpYmlsaXR5TWFuYWdlci5jbGFzcyk7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICByZXNldChtTW9ja1NlcnZpY2VJbnRlcmZhY2UpOworICAgIH0KKworICAgIEBNZWRpdW1UZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEdldEFjY2Vzc2liaWxpdHlTZXJ2aWNlTGlzdCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICAvLyBjcmVhdGUgYSBsaXN0IG9mIGluc3RhbGxlZCBhY2Nlc3NpYmlsaXR5IHNlcnZpY2VzIHRoZSBtb2NrIHNlcnZpY2UgcmV0dXJucworICAgICAgICBMaXN0PFNlcnZpY2VJbmZvPiBleHBlY3RlZFNlcnZpY2VzID0gbmV3IEFycmF5TGlzdDxTZXJ2aWNlSW5mbz4oKTsKKyAgICAgICAgU2VydmljZUluZm8gc2VydmljZUluZm8gPSBuZXcgU2VydmljZUluZm8oKTsKKyAgICAgICAgc2VydmljZUluZm8ubmFtZSA9ICJUZXN0U2VydmljZUluZm9OYW1lIjsKKyAgICAgICAgZXhwZWN0ZWRTZXJ2aWNlcy5hZGQoc2VydmljZUluZm8pOworCisgICAgICAgIC8vIGNvbmZpZ3VyZSB0aGUgbW9jayBzZXJ2aWNlIGJlaGF2aW9yCisgICAgICAgIElBY2Nlc3NpYmlsaXR5TWFuYWdlciBtb2NrU2VydmljZUludGVyZmFjZSA9IG1Nb2NrU2VydmljZUludGVyZmFjZTsKKyAgICAgICAgZXhwZWN0KG1vY2tTZXJ2aWNlSW50ZXJmYWNlLmFkZENsaWVudChhbnlJQWNjZXNzaWJpbGl0eU1hbmFnZXJDbGllbnQoKSkpLmFuZFJldHVybih0cnVlKTsKKyAgICAgICAgZXhwZWN0KG1vY2tTZXJ2aWNlSW50ZXJmYWNlLmdldEFjY2Vzc2liaWxpdHlTZXJ2aWNlTGlzdCgpKS5hbmRSZXR1cm4oZXhwZWN0ZWRTZXJ2aWNlcyk7CisgICAgICAgIHJlcGxheShtb2NrU2VydmljZUludGVyZmFjZSk7CisKKyAgICAgICAgLy8gaW52b2tlIHRoZSBtZXRob2QgdW5kZXIgdGVzdAorICAgICAgICBBY2Nlc3NpYmlsaXR5TWFuYWdlciBtYW5hZ2VyID0gbmV3IEFjY2Vzc2liaWxpdHlNYW5hZ2VyKG1Db250ZXh0LCBtb2NrU2VydmljZUludGVyZmFjZSk7CisgICAgICAgIExpc3Q8U2VydmljZUluZm8+IHJlY2VpdmVkU2VydmljZXMgPSBtYW5hZ2VyLmdldEFjY2Vzc2liaWxpdHlTZXJ2aWNlTGlzdCgpOworCisgICAgICAgIC8vIGNoZWNrIGV4cGVjdGVkIHJlc3VsdCAobGlzdCBlcXVhbHMoKSBjb21wYXJlcyBpdCBjb250ZW50cyBhcyB3ZWxsKQorICAgICAgICBhc3NlcnRFcXVhbHMoIkFsbCBleHBlY3RlZCBzZXJ2aWNlcyBtdXN0IGJlIHJldHVybmVkIiwgcmVjZWl2ZWRTZXJ2aWNlcywgZXhwZWN0ZWRTZXJ2aWNlcyk7CisKKyAgICAgICAgLy8gdmVyaWZ5IHRoZSBtb2NrIHNlcnZpY2Ugd2FzIHByb3Blcmx5IGNhbGxlZAorICAgICAgICB2ZXJpZnkobW9ja1NlcnZpY2VJbnRlcmZhY2UpOworICAgIH0KKworICAgIEBNZWRpdW1UZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEludGVycnVwdCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICAvLyBjb25maWd1cmUgdGhlIG1vY2sgc2VydmljZSBiZWhhdmlvcgorICAgICAgICBJQWNjZXNzaWJpbGl0eU1hbmFnZXIgbW9ja1NlcnZpY2VJbnRlcmZhY2UgPSBtTW9ja1NlcnZpY2VJbnRlcmZhY2U7CisgICAgICAgIGV4cGVjdChtb2NrU2VydmljZUludGVyZmFjZS5hZGRDbGllbnQoYW55SUFjY2Vzc2liaWxpdHlNYW5hZ2VyQ2xpZW50KCkpKS5hbmRSZXR1cm4odHJ1ZSk7CisgICAgICAgIG1vY2tTZXJ2aWNlSW50ZXJmYWNlLmludGVycnVwdCgpOworICAgICAgICByZXBsYXkobW9ja1NlcnZpY2VJbnRlcmZhY2UpOworCisgICAgICAgIC8vIGludm9rZSB0aGUgbWV0aG9kIHVuZGVyIHRlc3QKKyAgICAgICAgQWNjZXNzaWJpbGl0eU1hbmFnZXIgbWFuYWdlciA9IG5ldyBBY2Nlc3NpYmlsaXR5TWFuYWdlcihtQ29udGV4dCwgbW9ja1NlcnZpY2VJbnRlcmZhY2UpOworICAgICAgICBtYW5hZ2VyLmludGVycnVwdCgpOworCisgICAgICAgIC8vIHZlcmlmeSB0aGUgbW9jayBzZXJ2aWNlIHdhcyBwcm9wZXJseSBjYWxsZWQKKyAgICAgICAgdmVyaWZ5KG1vY2tTZXJ2aWNlSW50ZXJmYWNlKTsKKyAgICB9CisKKyAgICBATGFyZ2VUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdElzRW5hYmxlZCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICAvLyBjb25maWd1cmUgdGhlIG1vY2sgc2VydmljZSBiZWhhdmlvcgorICAgICAgICBJQWNjZXNzaWJpbGl0eU1hbmFnZXIgbW9ja1NlcnZpY2VJbnRlcmZhY2UgPSBtTW9ja1NlcnZpY2VJbnRlcmZhY2U7CisgICAgICAgIGV4cGVjdChtb2NrU2VydmljZUludGVyZmFjZS5hZGRDbGllbnQoYW55SUFjY2Vzc2liaWxpdHlNYW5hZ2VyQ2xpZW50KCkpKS5hbmRSZXR1cm4odHJ1ZSk7CisgICAgICAgIHJlcGxheShtb2NrU2VydmljZUludGVyZmFjZSk7CisKKyAgICAgICAgLy8gaW52b2tlIHRoZSBtZXRob2QgdW5kZXIgdGVzdAorICAgICAgICBBY2Nlc3NpYmlsaXR5TWFuYWdlciBtYW5hZ2VyID0gbmV3IEFjY2Vzc2liaWxpdHlNYW5hZ2VyKG1Db250ZXh0LCBtb2NrU2VydmljZUludGVyZmFjZSk7CisgICAgICAgIGJvb2xlYW4gaXNFbmFibGVkU2VydmljZUVuYWJsZWQgPSBtYW5hZ2VyLmlzRW5hYmxlZCgpOworCisgICAgICAgIC8vIGNoZWNrIGV4cGVjdGVkIHJlc3VsdAorICAgICAgICBhc3NlcnRUcnVlKCJNdXN0IGJlIGVuYWJsZWQgc2luY2UgdGhlIG1vY2sgc2VydmljZSBpcyBlbmFibGVkIiwgaXNFbmFibGVkU2VydmljZUVuYWJsZWQpOworCisgICAgICAgIC8vIGRpc2FibGUgYWNjZXNzaWJpbGl0eQorICAgICAgICBtYW5hZ2VyLmdldENsaWVudCgpLnNldEVuYWJsZWQoZmFsc2UpOworCisgICAgICAgIC8vIHdhaXQgZm9yIHRoZSBhc3luY2hyb25vdXMgSUJpbmRlciBjYWxsIHRvIGNvbXBsZXRlCisgICAgICAgIFRocmVhZC5zbGVlcChUSU1FT1VUX0JJTkRFUl9DQUxMKTsKKworICAgICAgICAvLyBpbnZva2UgdGhlIG1ldGhvZCB1bmRlciB0ZXN0CisgICAgICAgIGJvb2xlYW4gaXNFbmFibGVkU2VydmNpZURpc2FibGVkID0gbWFuYWdlci5pc0VuYWJsZWQoKTsKKworICAgICAgICAvLyBjaGVjayBleHBlY3RlZCByZXN1bHQKKyAgICAgICAgYXNzZXJ0RmFsc2UoIk11c3QgYmUgZGlzYWJsZWQgc2luY2UgdGhlIG1vY2sgc2VydmljZSBpcyBkaXNhYmxlZCIsCisgICAgICAgICAgICAgICAgaXNFbmFibGVkU2VydmNpZURpc2FibGVkKTsKKworICAgICAgICAvLyB2ZXJpZnkgdGhlIG1vY2sgc2VydmljZSB3YXMgcHJvcGVybHkgY2FsbGVkCisgICAgICAgIHZlcmlmeShtb2NrU2VydmljZUludGVyZmFjZSk7CisgICAgfQorCisgICAgQE1lZGl1bVRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2VuZEFjY2Vzc2liaWxpdHlFdmVudF9BY2Nlc3NpYmlsaXR5RW5hYmxlZCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICAvLyBjcmVhdGUgYW4gZXZlbnQgdG8gYmUgZGlzcGF0Y2hlZAorICAgICAgICBBY2Nlc3NpYmlsaXR5RXZlbnQgc2VudEV2ZW50ID0gQWNjZXNzaWJpbGl0eUV2ZW50Lm9idGFpbigpOworCisgICAgICAgIC8vIGNvbmZpZ3VyZSB0aGUgbW9jayBzZXJ2aWNlIGJlaGF2aW9yCisgICAgICAgIElBY2Nlc3NpYmlsaXR5TWFuYWdlciBtb2NrU2VydmljZUludGVyZmFjZSA9IG1Nb2NrU2VydmljZUludGVyZmFjZTsKKyAgICAgICAgZXhwZWN0KG1vY2tTZXJ2aWNlSW50ZXJmYWNlLmFkZENsaWVudChhbnlJQWNjZXNzaWJpbGl0eU1hbmFnZXJDbGllbnQoKSkpLmFuZFJldHVybih0cnVlKTsKKyAgICAgICAgZXhwZWN0KG1vY2tTZXJ2aWNlSW50ZXJmYWNlLnNlbmRBY2Nlc3NpYmlsaXR5RXZlbnQoZXFBY2Nlc3NpYmlsaXR5RXZlbnQoc2VudEV2ZW50KSkpCisgICAgICAgICAgICAgICAgLmFuZFJldHVybih0cnVlKTsKKyAgICAgICAgZXhwZWN0KG1vY2tTZXJ2aWNlSW50ZXJmYWNlLnNlbmRBY2Nlc3NpYmlsaXR5RXZlbnQoZXFBY2Nlc3NpYmlsaXR5RXZlbnQoc2VudEV2ZW50KSkpCisgICAgICAgICAgICAgICAgLmFuZFJldHVybihmYWxzZSk7CisgICAgICAgIHJlcGxheShtb2NrU2VydmljZUludGVyZmFjZSk7CisKKyAgICAgICAgLy8gaW52b2tlIHRoZSBtZXRob2QgdW5kZXIgdGVzdCAobWFuYWdlciBhbmQgc2VydmljZSBpbiBkaWZmZXJlbnQgcHJvY2Vzc2VzKQorICAgICAgICBBY2Nlc3NpYmlsaXR5TWFuYWdlciBtYW5hZ2VyID0gbmV3IEFjY2Vzc2liaWxpdHlNYW5hZ2VyKG1Db250ZXh0LCBtb2NrU2VydmljZUludGVyZmFjZSk7CisgICAgICAgIG1hbmFnZXIuc2VuZEFjY2Vzc2liaWxpdHlFdmVudChzZW50RXZlbnQpOworCisgICAgICAgIC8vIGNoZWNrIGV4cGVjdGVkIHJlc3VsdAorICAgICAgICBBY2Nlc3NpYmlsaXR5RXZlbnQgbmV4dEV2ZW50RGlmZmVyZW50UHJvY2Vzc2VzID0gQWNjZXNzaWJpbGl0eUV2ZW50Lm9idGFpbigpOworICAgICAgICBhc3NlcnRTYW1lKCJUaGUgbWFuYWdlciBhbmQgdGhlIHNlcnZpY2UgYXJlIGluIGRpZmZlcmVudCBwcm9jZXNzZXMsIHNvIHRoZSBldmVudCBtdXN0IGJlICIgKworICAgICAgICAgICAgICAgICJyZWN5Y2xlZCIsIHNlbnRFdmVudCwgbmV4dEV2ZW50RGlmZmVyZW50UHJvY2Vzc2VzKTsKKworICAgICAgICAvLyBpbnZva2UgdGhlIG1ldGhvZCB1bmRlciB0ZXN0IChtYW5hZ2VyIGFuZCBzZXJ2aWNlIGluIHRoZSBzYW1lIHByb2Nlc3MpCisgICAgICAgIG1hbmFnZXIuc2VuZEFjY2Vzc2liaWxpdHlFdmVudChzZW50RXZlbnQpOworCisgICAgICAgIC8vIGNoZWNrIGV4cGVjdGVkIHJlc3VsdAorICAgICAgICBBY2Nlc3NpYmlsaXR5RXZlbnQgbmV4dEV2ZW50U2FtZVByb2Nlc3MgPSBBY2Nlc3NpYmlsaXR5RXZlbnQub2J0YWluKCk7CisgICAgICAgIGFzc2VydE5vdFNhbWUoIlRoZSBtYW5hZ2VyIGFuZCB0aGUgc2VydmljZSBhcmUgaW4gdGhlIHNhbWUgcHJvY2Vzcywgc28gdGhlIGV2ZW50IG11c3Qgbm90IiArCisgICAgICAgICAgICAgICAgImJlIHJlY3ljbGVkIiwgc2VudEV2ZW50LCBuZXh0RXZlbnRTYW1lUHJvY2Vzcyk7CisKKyAgICAgICAgLy8gdmVyaWZ5IHRoZSBtb2NrIHNlcnZpY2Ugd2FzIHByb3Blcmx5IGNhbGxlZAorICAgICAgICB2ZXJpZnkobW9ja1NlcnZpY2VJbnRlcmZhY2UpOworICAgIH0KKworICAgIEBNZWRpdW1UZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFNlbmRBY2Nlc3NpYmlsaXR5RXZlbnRfQWNjZXNzaWJpbGl0eURpc2FibGVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIC8vIGNyZWF0ZSBhbiBldmVudCB0byBiZSBkaXNwYXRjaGVkCisgICAgICAgIEFjY2Vzc2liaWxpdHlFdmVudCBzZW50RXZlbnQgPSBBY2Nlc3NpYmlsaXR5RXZlbnQub2J0YWluKCk7CisKKyAgICAgICAgLy8gY29uZmlndXJlIHRoZSBtb2NrIHNlcnZpY2UgYmVoYXZpb3IKKyAgICAgICAgSUFjY2Vzc2liaWxpdHlNYW5hZ2VyIG1vY2tTZXJ2aWNlSW50ZXJmYWNlID0gbU1vY2tTZXJ2aWNlSW50ZXJmYWNlOworICAgICAgICBleHBlY3QobW9ja1NlcnZpY2VJbnRlcmZhY2UuYWRkQ2xpZW50KGFueUlBY2Nlc3NpYmlsaXR5TWFuYWdlckNsaWVudCgpKSkuYW5kUmV0dXJuKGZhbHNlKTsKKyAgICAgICAgcmVwbGF5KG1vY2tTZXJ2aWNlSW50ZXJmYWNlKTsKKworICAgICAgICAvLyBpbnZva2UgdGhlIG1ldGhvZCB1bmRlciB0ZXN0IChhY2Nlc3NpYmlsaXR5IGRpc2FibGVkKQorICAgICAgICBBY2Nlc3NpYmlsaXR5TWFuYWdlciBtYW5hZ2VyID0gbmV3IEFjY2Vzc2liaWxpdHlNYW5hZ2VyKG1Db250ZXh0LCBtb2NrU2VydmljZUludGVyZmFjZSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBtYW5hZ2VyLnNlbmRBY2Nlc3NpYmlsaXR5RXZlbnQoc2VudEV2ZW50KTsKKyAgICAgICAgICAgIGZhaWwoIk5vIGFjY2Vzc2liaWxpdHkgZXZlbnRzIGFyZSBzZW50IGlmIGFjY2Vzc2liaWxpdHkgaXMgZGlzYWJsZWQiKTsKKyAgICAgICAgfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGlzZSkgeworICAgICAgICAgICAgLy8gY2hlY2sgZXhwZWN0ZWQgcmVzdWx0CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIkFjY2Vzc2liaWxpdHkgb2ZmLiBEaWQgeW91IGZvcmdldCB0byBjaGVjayB0aGF0PyIsIGlzZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9CisKKyAgICAgICAgLy8gdmVyaWZ5IHRoZSBtb2NrIHNlcnZpY2Ugd2FzIHByb3Blcmx5IGNhbGxlZAorICAgICAgICB2ZXJpZnkobW9ja1NlcnZpY2VJbnRlcmZhY2UpOworICAgIH0KKworICAgIC8qKgorICAgICAqIERldGVybWluZXMgaWYgYW4ge0BsaW5rIEFjY2Vzc2liaWxpdHlFdmVudH0gcGFzc2VkIGFzIGEgbWV0aG9kIGFyZ3VtZW50CisgICAgICogbWF0Y2hlcyBleHBlY3RhdGlvbnMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbWF0Y2hlZCBUaGUgZXZlbnQgdG8gY2hlY2suCisgICAgICogQHJldHVybiBUcnVlIGlmIGV4cGVjdGF0aW9ucyBhcmUgbWF0Y2hlZC4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBBY2Nlc3NpYmlsaXR5RXZlbnQgZXFBY2Nlc3NpYmlsaXR5RXZlbnQoQWNjZXNzaWJpbGl0eUV2ZW50IG1hdGNoZWQpIHsKKyAgICAgICAgcmVwb3J0TWF0Y2hlcihuZXcgQWNjZXNzaWJpbGl0eUV2ZW50TWF0aGVyKG1hdGNoZWQpKTsKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgLyoqCisgICAgICogRGV0ZXJtaW5lcyBpZiBhbiB7QGxpbmsgSUFjY2Vzc2liaWxpdHlNYW5hZ2VyQ2xpZW50fSBwYXNzZWQgYXMgYSBtZXRob2QgYXJndW1lbnQKKyAgICAgKiBtYXRjaGVzIGV4cGVjdGF0aW9ucyB3aGljaCBpbiB0aGlzIGNhc2UgYXJlIHRoYXQgYW55IGluc3RhbmNlIGlzIGFjY2VwdGVkLgorICAgICAqCisgICAgICogQHJldHVybiA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBJQWNjZXNzaWJpbGl0eU1hbmFnZXJDbGllbnQgYW55SUFjY2Vzc2liaWxpdHlNYW5hZ2VyQ2xpZW50KCkgeworICAgICAgICByZXBvcnRNYXRjaGVyKG5ldyBBbnlJQWNjZXNzaWJpbGl0eU1hbmFnZXJDbGllbnRNYXRoZXIoKSk7CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIC8qKgorICAgICAqIE1hdGNoZXIgZm9yIHtAbGluayBBY2Nlc3NpYmlsaXR5RXZlbnR9cy4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBBY2Nlc3NpYmlsaXR5RXZlbnRNYXRoZXIgaW1wbGVtZW50cyBJQXJndW1lbnRNYXRjaGVyIHsKKyAgICAgICAgcHJpdmF0ZSBBY2Nlc3NpYmlsaXR5RXZlbnQgbUV4cGVjdGVkRXZlbnQ7CisKKyAgICAgICAgcHVibGljIEFjY2Vzc2liaWxpdHlFdmVudE1hdGhlcihBY2Nlc3NpYmlsaXR5RXZlbnQgZXhwZWN0ZWRFdmVudCkgeworICAgICAgICAgICAgbUV4cGVjdGVkRXZlbnQgPSBleHBlY3RlZEV2ZW50OworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGJvb2xlYW4gbWF0Y2hlcyhPYmplY3QgbWF0Y2hlZCkgeworICAgICAgICAgICAgaWYgKCEobWF0Y2hlZCBpbnN0YW5jZW9mIEFjY2Vzc2liaWxpdHlFdmVudCkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBBY2Nlc3NpYmlsaXR5RXZlbnQgcmVjZWl2ZWRFdmVudCA9IChBY2Nlc3NpYmlsaXR5RXZlbnQpIG1hdGNoZWQ7CisgICAgICAgICAgICByZXR1cm4gbUV4cGVjdGVkRXZlbnQuZ2V0RXZlbnRUeXBlKCkgPT0gcmVjZWl2ZWRFdmVudC5nZXRFdmVudFR5cGUoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIGFwcGVuZFRvKFN0cmluZ0J1ZmZlciBidWZmZXIpIHsKKyAgICAgICAgICAgIGJ1ZmZlci5hcHBlbmQoInNlbmRBY2Nlc3NpYmlsaXR5RXZlbnQoKSIpOworICAgICAgICAgICAgYnVmZmVyLmFwcGVuZCgiIHdpdGggZXZlbnQgdHlwZSBcIiIpOworICAgICAgICAgICAgYnVmZmVyLmFwcGVuZChtRXhwZWN0ZWRFdmVudC5nZXRFdmVudFR5cGUoKSk7CisgICAgICAgICAgICBidWZmZXIuYXBwZW5kKCJcIiIpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogTWF0Y2hlciBmb3Ige0BsaW5rIElBY2Nlc3NpYmlsaXR5TWFuYWdlckNsaWVudH1zLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIEFueUlBY2Nlc3NpYmlsaXR5TWFuYWdlckNsaWVudE1hdGhlciBpbXBsZW1lbnRzIElBcmd1bWVudE1hdGNoZXIgeworICAgICAgICBwdWJsaWMgYm9vbGVhbiBtYXRjaGVzKE9iamVjdCBtYXRjaGVkKSB7CisgICAgICAgICAgICBpZiAoIShtYXRjaGVkIGluc3RhbmNlb2YgSUFjY2Vzc2liaWxpdHlNYW5hZ2VyQ2xpZW50KSkgeworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgYXBwZW5kVG8oU3RyaW5nQnVmZmVyIGJ1ZmZlcikgeworICAgICAgICAgICAgYnVmZmVyLmFwcGVuZCgiYWRkQ2xpZW50KCkgd2l0aCBhbnkgSUFjY2Vzc2liaWxpdHlNYW5hZ2VyQ2xpZW50Iik7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy90ZXN0cy9zZXJ2aWNlc3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9zZXJ2ZXIvQ291bnRyeURldGVjdG9yU2VydmljZVRlc3QuamF2YSBiL3NlcnZpY2VzL3Rlc3RzL3NlcnZpY2VzdGVzdHMvc3JjL2NvbS9hbmRyb2lkL3NlcnZlci9Db3VudHJ5RGV0ZWN0b3JTZXJ2aWNlVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE3YTE1ODUKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy90ZXN0cy9zZXJ2aWNlc3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9zZXJ2ZXIvQ291bnRyeURldGVjdG9yU2VydmljZVRlc3QuamF2YQpAQCAtMCwwICsxLDEwOSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5zZXJ2ZXI7CisKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmxvY2F0aW9uLkNvdW50cnk7CitpbXBvcnQgYW5kcm9pZC5sb2NhdGlvbi5Db3VudHJ5TGlzdGVuZXI7CitpbXBvcnQgYW5kcm9pZC5sb2NhdGlvbi5JQ291bnRyeUxpc3RlbmVyOworaW1wb3J0IGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uOworaW1wb3J0IGFuZHJvaWQudGVzdC5BbmRyb2lkVGVzdENhc2U7CisKK3B1YmxpYyBjbGFzcyBDb3VudHJ5RGV0ZWN0b3JTZXJ2aWNlVGVzdCBleHRlbmRzIEFuZHJvaWRUZXN0Q2FzZSB7CisgICAgcHJpdmF0ZSBjbGFzcyBDb3VudHJ5TGlzdGVuZXJUZXN0ZXIgZXh0ZW5kcyBJQ291bnRyeUxpc3RlbmVyLlN0dWIgeworICAgICAgICBwcml2YXRlIENvdW50cnkgbUNvdW50cnk7CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIG9uQ291bnRyeURldGVjdGVkKENvdW50cnkgY291bnRyeSkgdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbiB7CisgICAgICAgICAgICBtQ291bnRyeSA9IGNvdW50cnk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgQ291bnRyeSBnZXRDb3VudHJ5KCkgeworICAgICAgICAgICAgcmV0dXJuIG1Db3VudHJ5OworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGJvb2xlYW4gaXNOb3RpZmllZCgpIHsKKyAgICAgICAgICAgIHJldHVybiBtQ291bnRyeSAhPSBudWxsOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBjbGFzcyBDb3VudHJ5RGV0ZWN0b3JTZXJ2aWNlVGVzdGVyIGV4dGVuZHMgQ291bnRyeURldGVjdG9yU2VydmljZSB7CisKKyAgICAgICAgcHJpdmF0ZSBDb3VudHJ5TGlzdGVuZXIgbUxpc3RlbmVyOworCisgICAgICAgIHB1YmxpYyBDb3VudHJ5RGV0ZWN0b3JTZXJ2aWNlVGVzdGVyKENvbnRleHQgY29udGV4dCkgeworICAgICAgICAgICAgc3VwZXIoY29udGV4dCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgbm90aWZ5UmVjZWl2ZXJzKENvdW50cnkgY291bnRyeSkgeworICAgICAgICAgICAgc3VwZXIubm90aWZ5UmVjZWl2ZXJzKGNvdW50cnkpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHByb3RlY3RlZCB2b2lkIHNldENvdW50cnlMaXN0ZW5lcihmaW5hbCBDb3VudHJ5TGlzdGVuZXIgbGlzdGVuZXIpIHsKKyAgICAgICAgICAgIG1MaXN0ZW5lciA9IGxpc3RlbmVyOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGJvb2xlYW4gaXNMaXN0ZW5lclNldCgpIHsKKyAgICAgICAgICAgIHJldHVybiBtTGlzdGVuZXIgIT0gbnVsbDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RBZGRSZW1vdmVMaXN0ZW5lcigpIHRocm93cyBSZW1vdGVFeGNlcHRpb24geworICAgICAgICBDb3VudHJ5RGV0ZWN0b3JTZXJ2aWNlVGVzdGVyIHNlcnZpY2VUZXN0ZXIgPSBuZXcgQ291bnRyeURldGVjdG9yU2VydmljZVRlc3RlcihnZXRDb250ZXh0KCkpOworICAgICAgICBzZXJ2aWNlVGVzdGVyLnN5c3RlbVJlYWR5KCk7CisgICAgICAgIHdhaXRGb3JTeXN0ZW1SZWFkeShzZXJ2aWNlVGVzdGVyKTsKKyAgICAgICAgQ291bnRyeUxpc3RlbmVyVGVzdGVyIGxpc3RlbmVyVGVzdGVyID0gbmV3IENvdW50cnlMaXN0ZW5lclRlc3RlcigpOworICAgICAgICBzZXJ2aWNlVGVzdGVyLmFkZENvdW50cnlMaXN0ZW5lcihsaXN0ZW5lclRlc3Rlcik7CisgICAgICAgIGFzc2VydFRydWUoc2VydmljZVRlc3Rlci5pc0xpc3RlbmVyU2V0KCkpOworICAgICAgICBzZXJ2aWNlVGVzdGVyLnJlbW92ZUNvdW50cnlMaXN0ZW5lcihsaXN0ZW5lclRlc3Rlcik7CisgICAgICAgIGFzc2VydEZhbHNlKHNlcnZpY2VUZXN0ZXIuaXNMaXN0ZW5lclNldCgpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Tm90aWZ5TGlzdGVuZXJzKCkgdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbiB7CisgICAgICAgIENvdW50cnlEZXRlY3RvclNlcnZpY2VUZXN0ZXIgc2VydmljZVRlc3RlciA9IG5ldyBDb3VudHJ5RGV0ZWN0b3JTZXJ2aWNlVGVzdGVyKGdldENvbnRleHQoKSk7CisgICAgICAgIENvdW50cnlMaXN0ZW5lclRlc3RlciBsaXN0ZW5lclRlc3RlckEgPSBuZXcgQ291bnRyeUxpc3RlbmVyVGVzdGVyKCk7CisgICAgICAgIENvdW50cnlMaXN0ZW5lclRlc3RlciBsaXN0ZW5lclRlc3RlckIgPSBuZXcgQ291bnRyeUxpc3RlbmVyVGVzdGVyKCk7CisgICAgICAgIENvdW50cnkgY291bnRyeSA9IG5ldyBDb3VudHJ5KCJVUyIsIENvdW50cnkuQ09VTlRSWV9TT1VSQ0VfTkVUV09SSyk7CisgICAgICAgIHNlcnZpY2VUZXN0ZXIuc3lzdGVtUmVhZHkoKTsKKyAgICAgICAgd2FpdEZvclN5c3RlbVJlYWR5KHNlcnZpY2VUZXN0ZXIpOworICAgICAgICBzZXJ2aWNlVGVzdGVyLmFkZENvdW50cnlMaXN0ZW5lcihsaXN0ZW5lclRlc3RlckEpOworICAgICAgICBzZXJ2aWNlVGVzdGVyLmFkZENvdW50cnlMaXN0ZW5lcihsaXN0ZW5lclRlc3RlckIpOworICAgICAgICBzZXJ2aWNlVGVzdGVyLm5vdGlmeVJlY2VpdmVycyhjb3VudHJ5KTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShzZXJ2aWNlVGVzdGVyLmlzTGlzdGVuZXJTZXQoKSk7CisgICAgICAgIGFzc2VydFRydWUobGlzdGVuZXJUZXN0ZXJBLmlzTm90aWZpZWQoKSk7CisgICAgICAgIGFzc2VydFRydWUobGlzdGVuZXJUZXN0ZXJCLmlzTm90aWZpZWQoKSk7CisgICAgICAgIHNlcnZpY2VUZXN0ZXIucmVtb3ZlQ291bnRyeUxpc3RlbmVyKGxpc3RlbmVyVGVzdGVyQSk7CisgICAgICAgIHNlcnZpY2VUZXN0ZXIucmVtb3ZlQ291bnRyeUxpc3RlbmVyKGxpc3RlbmVyVGVzdGVyQik7CisgICAgICAgIGFzc2VydEZhbHNlKHNlcnZpY2VUZXN0ZXIuaXNMaXN0ZW5lclNldCgpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgd2FpdEZvclN5c3RlbVJlYWR5KENvdW50cnlEZXRlY3RvclNlcnZpY2Ugc2VydmljZSkgeworICAgICAgICBpbnQgY291bnQgPSA1OworICAgICAgICB3aGlsZSAoY291bnQtLSA+IDApIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgVGhyZWFkLnNsZWVwKDUwMCk7CisgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHNlcnZpY2UuaXNTeXN0ZW1SZWFkeSgpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJXYWl0IFN5c3RlbSBSZWFkeSB0aW1lb3V0Iik7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvdGVzdHMvc2VydmljZXN0ZXN0cy9zcmMvY29tL2FuZHJvaWQvc2VydmVyL01vY2tBY2Nlc3NpYmlsaXR5U2VydmljZS5qYXZhIGIvc2VydmljZXMvdGVzdHMvc2VydmljZXN0ZXN0cy9zcmMvY29tL2FuZHJvaWQvc2VydmVyL01vY2tBY2Nlc3NpYmlsaXR5U2VydmljZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFiYzliODYKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy90ZXN0cy9zZXJ2aWNlc3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9zZXJ2ZXIvTW9ja0FjY2Vzc2liaWxpdHlTZXJ2aWNlLmphdmEKQEAgLTAsMCArMSwyNTYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLnNlcnZlcjsKKworaW1wb3J0IGFuZHJvaWQuYWNjZXNzaWJpbGl0eXNlcnZpY2UuQWNjZXNzaWJpbGl0eVNlcnZpY2U7CitpbXBvcnQgYW5kcm9pZC5hY2Nlc3NpYmlsaXR5c2VydmljZS5BY2Nlc3NpYmlsaXR5U2VydmljZUluZm87CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKK2ltcG9ydCBhbmRyb2lkLm9zLk1lc3NhZ2U7CitpbXBvcnQgYW5kcm9pZC52aWV3LmFjY2Vzc2liaWxpdHkuQWNjZXNzaWJpbGl0eUV2ZW50OworCitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5RdWV1ZTsKKworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKKworLyoqCisgKiBUaGlzIGlzIHRoZSBiYXNlIGNsYXNzIGZvciBtb2NrIHtAbGluayBBY2Nlc3NpYmlsaXR5U2VydmljZX1zLgorICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgTW9ja0FjY2Vzc2liaWxpdHlTZXJ2aWNlIGV4dGVuZHMgQWNjZXNzaWJpbGl0eVNlcnZpY2UgeworCisgICAgLyoqCisgICAgICogVGhlIGV2ZW50IHRoaXMgc2VydmljZSBleHBlY3RzIHRvIHJlY2VpdmUuCisgICAgICovCisgICAgcHJpdmF0ZSBmaW5hbCBRdWV1ZTxBY2Nlc3NpYmlsaXR5RXZlbnQ+IG1FeHBlY3RlZEV2ZW50cyA9IG5ldyBMaW5rZWRMaXN0PEFjY2Vzc2liaWxpdHlFdmVudD4oKTsKKworICAgIC8qKgorICAgICAqIEludGVycnVwdGlvbiBjYWxsIHRoaXMgc2VydmljZSBleHBlY3RzIHRvIHJlY2VpdmUuCisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIG1FeHBlY3RlZEludGVycnVwdDsKKworICAgIC8qKgorICAgICAqIEZsYWcgaWYgdGhlIG1vY2sgaXMgY3VycmVudGx5IHJlcGxheWluZy4KKyAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gbVJlcGxheWluZzsKKworICAgIC8qKgorICAgICAqIEZsYWcgaWYgdGhlIHN5c3RlbSBpcyBib3VuZCBhcyBhIGNsaWVudCB0byB0aGlzIHNlcnZpY2UuCisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIG1Jc1N5c3RlbUJvdW5kQXNDbGllbnQ7CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGFuIHtAbGluayBBY2Nlc3NpYmlsaXR5U2VydmljZUluZm99IHBvcHVsYXRlZCB3aXRoIGRlZmF1bHQKKyAgICAgKiB2YWx1ZXMuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFRoZSBkZWZhdWx0IGluZm8uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBBY2Nlc3NpYmlsaXR5U2VydmljZUluZm8gY3JlYXRlRGVmYXVsdEluZm8oKSB7CisgICAgICAgIEFjY2Vzc2liaWxpdHlTZXJ2aWNlSW5mbyBkZWZhdWx0SW5mbyA9IG5ldyBBY2Nlc3NpYmlsaXR5U2VydmljZUluZm8oKTsKKyAgICAgICAgZGVmYXVsdEluZm8uZXZlbnRUeXBlcyA9IEFjY2Vzc2liaWxpdHlFdmVudC5UWVBFX1ZJRVdfQ0xJQ0tFRDsKKyAgICAgICAgZGVmYXVsdEluZm8uZmVlZGJhY2tUeXBlID0gQWNjZXNzaWJpbGl0eVNlcnZpY2VJbmZvLkZFRURCQUNLX0FVRElCTEU7CisgICAgICAgIGRlZmF1bHRJbmZvLmZsYWdzID0gMDsKKyAgICAgICAgZGVmYXVsdEluZm8ubm90aWZpY2F0aW9uVGltZW91dCA9IDA7CisgICAgICAgIGRlZmF1bHRJbmZvLnBhY2thZ2VOYW1lcyA9IG5ldyBTdHJpbmdbXSB7CisgICAgICAgICAgICAiZm9vLmJhci5iYXoiCisgICAgICAgIH07CisKKyAgICAgICAgcmV0dXJuIGRlZmF1bHRJbmZvOworICAgIH0KKworICAgIC8qKgorICAgICAqIFN0YXJ0cyByZXBsYXlpbmcgdGhlIG1vY2suCisgICAgICovCisgICAgcHVibGljIHZvaWQgcmVwbGF5KCkgeworICAgICAgICBtUmVwbGF5aW5nID0gdHJ1ZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBWZXJpZmllcyBpZiBhbGwgZXhwZWN0ZWQgc2VydmljZSBtZXRob2RzIGhhdmUgYmVlbiBjYWxsZWQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgdmVyaWZ5KCkgeworICAgICAgICBpZiAoIW1SZXBsYXlpbmcpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkRpZCB5b3UgZm9yZ2V0IHRvIGNhbGwgcmVwbGF5KCkiKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChtRXhwZWN0ZWRJbnRlcnJ1cHQpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkV4cGVjdGVkIGNhbGwgdG8gI2ludGVycnVwdCgpIG5vdCByZWNlaXZlZCIpOworICAgICAgICB9CisgICAgICAgIGlmICghbUV4cGVjdGVkRXZlbnRzLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiRXhwZWN0ZWQgYSBjYWxsIHRvIG9uQWNjZXNzaWJpbGl0eUV2ZW50KCkgZm9yICIKKyAgICAgICAgICAgICAgICAgICAgKyAiZXZlbnRzIFwiIiArIG1FeHBlY3RlZEV2ZW50cyArICJcIiBub3QgcmVjZWl2ZWQiKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFJlc2V0cyB0aGlzIGluc3RhbmNlIHNvIGl0IGNhbiBiZSByZXVzZWQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgcmVzZXQoKSB7CisgICAgICAgIG1FeHBlY3RlZEV2ZW50cy5jbGVhcigpOworICAgICAgICBtRXhwZWN0ZWRJbnRlcnJ1cHQgPSBmYWxzZTsKKyAgICAgICAgbVJlcGxheWluZyA9IGZhbHNlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgYW4gZXhwZWN0ZWQgY2FsbCB0bworICAgICAqIHtAbGluayAjb25BY2Nlc3NpYmlsaXR5RXZlbnQoQWNjZXNzaWJpbGl0eUV2ZW50KX0gd2l0aCBnaXZlbiBldmVudCBhcworICAgICAqIGFyZ3VtZW50LgorICAgICAqCisgICAgICogQHBhcmFtIGV4cGVjdGVkRXZlbnQgVGhlIGV4cGVjdGVkIGV2ZW50IGFyZ3VtZW50LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGV4cGVjdEV2ZW50KEFjY2Vzc2liaWxpdHlFdmVudCBleHBlY3RlZEV2ZW50KSB7CisgICAgICAgIG1FeHBlY3RlZEV2ZW50cy5hZGQoZXhwZWN0ZWRFdmVudCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyBhbiBleHBlY3RlZCBjYWxsIG9mIHtAbGluayAjb25JbnRlcnJ1cHQoKX0uCisgICAgICovCisgICAgcHVibGljIHZvaWQgZXhwZWN0SW50ZXJydXB0KCkgeworICAgICAgICBtRXhwZWN0ZWRJbnRlcnJ1cHQgPSB0cnVlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9uQWNjZXNzaWJpbGl0eUV2ZW50KEFjY2Vzc2liaWxpdHlFdmVudCByZWNlaXZlZEV2ZW50KSB7CisgICAgICAgIGlmICghbVJlcGxheWluZykgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG1FeHBlY3RlZEV2ZW50cy5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIlVuZXhwZWN0ZWQgZXZlbnQ6ICIgKyByZWNlaXZlZEV2ZW50KTsKKyAgICAgICAgfQorCisgICAgICAgIEFjY2Vzc2liaWxpdHlFdmVudCBleHBlY3RlZEV2ZW50ID0gbUV4cGVjdGVkRXZlbnRzLnBvbGwoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzQWNjZXNzaWJsaXR5RXZlbnQoZXhwZWN0ZWRFdmVudCwgcmVjZWl2ZWRFdmVudCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb25JbnRlcnJ1cHQoKSB7CisgICAgICAgIGlmICghbVJlcGxheWluZykgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCFtRXhwZWN0ZWRJbnRlcnJ1cHQpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIlVuZXhwZWN0ZWQgY2FsbCB0byBvbkludGVycnVwdCgpIik7CisgICAgICAgIH0KKworICAgICAgICBtRXhwZWN0ZWRJbnRlcnJ1cHQgPSBmYWxzZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvblNlcnZpY2VDb25uZWN0ZWQoKSB7CisgICAgICAgIG1Jc1N5c3RlbUJvdW5kQXNDbGllbnQgPSB0cnVlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIG9uVW5iaW5kKEludGVudCBpbnRlbnQpIHsKKyAgICAgICAgbUlzU3lzdGVtQm91bmRBc0NsaWVudCA9IGZhbHNlOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyBpZiB0aGUgc3lzdGVtIGlzIGJvdW5kIGFzIGNsaWVudCB0byB0aGlzIHNlcnZpY2UuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFRydWUgaWYgdGhlIHN5c3RlbSBpcyBib3VuZCwgZmFsc2Ugb3RoZXJ3aXNlLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzU3lzdGVtQm91bmRBc0NsaWVudCgpIHsKKyAgICAgICAgcmV0dXJuIG1Jc1N5c3RlbUJvdW5kQXNDbGllbnQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29tcGFyZXMgYWxsIHByb3BlcnRpZXMgb2YgdGhlIDxjb2RlPmV4cGVjdGVkRXZlbnQ8L2NvZGU+IGFuZCB0aGUKKyAgICAgKiA8Y29kZT5yZWNldmllZEV2ZW50PC9jb2RlPiB0byB2ZXJpZnkgdGhhdCB0aGUgcmVjZWl2ZWQgZXZlbnQgaXMgdGhlIG9uZQorICAgICAqIHRoYXQgaXMgZXhwZWN0ZWQuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIGFzc2VydEVxdWFsc0FjY2Vzc2libGl0eUV2ZW50KEFjY2Vzc2liaWxpdHlFdmVudCBleHBlY3RlZEV2ZW50LAorICAgICAgICAgICAgQWNjZXNzaWJpbGl0eUV2ZW50IHJlY2VpdmVkRXZlbnQpIHsKKyAgICAgICAgVGVzdENhc2UuYXNzZXJ0RXF1YWxzKCJhZGRlZENvdW50IGhhcyBpbmNvcnJlY3QgdmFsdWUiLCBleHBlY3RlZEV2ZW50LmdldEFkZGVkQ291bnQoKSwKKyAgICAgICAgICAgICAgICByZWNlaXZlZEV2ZW50LmdldEFkZGVkQ291bnQoKSk7CisgICAgICAgIFRlc3RDYXNlLmFzc2VydEVxdWFscygiYmVmb3JlVGV4dCBoYXMgaW5jb3JyZWN0IHZhbHVlIiwgZXhwZWN0ZWRFdmVudC5nZXRCZWZvcmVUZXh0KCksCisgICAgICAgICAgICAgICAgcmVjZWl2ZWRFdmVudC5nZXRCZWZvcmVUZXh0KCkpOworICAgICAgICBUZXN0Q2FzZS5hc3NlcnRFcXVhbHMoImNoZWNrZWQgaGFzIGluY29ycmVjdCB2YWx1ZSIsIGV4cGVjdGVkRXZlbnQuaXNDaGVja2VkKCksCisgICAgICAgICAgICAgICAgcmVjZWl2ZWRFdmVudC5pc0NoZWNrZWQoKSk7CisgICAgICAgIFRlc3RDYXNlLmFzc2VydEVxdWFscygiY2xhc3NOYW1lIGhhcyBpbmNvcnJlY3QgdmFsdWUiLCBleHBlY3RlZEV2ZW50LmdldENsYXNzTmFtZSgpLAorICAgICAgICAgICAgICAgIHJlY2VpdmVkRXZlbnQuZ2V0Q2xhc3NOYW1lKCkpOworICAgICAgICBUZXN0Q2FzZS5hc3NlcnRFcXVhbHMoImNvbnRlbnREZXNjcmlwdGlvbiBoYXMgaW5jb3JyZWN0IHZhbHVlIiwgZXhwZWN0ZWRFdmVudAorICAgICAgICAgICAgICAgIC5nZXRDb250ZW50RGVzY3JpcHRpb24oKSwgcmVjZWl2ZWRFdmVudC5nZXRDb250ZW50RGVzY3JpcHRpb24oKSk7CisgICAgICAgIFRlc3RDYXNlLmFzc2VydEVxdWFscygiY3VycmVudEl0ZW1JbmRleCBoYXMgaW5jb3JyZWN0IHZhbHVlIiwgZXhwZWN0ZWRFdmVudAorICAgICAgICAgICAgICAgIC5nZXRDdXJyZW50SXRlbUluZGV4KCksIHJlY2VpdmVkRXZlbnQuZ2V0Q3VycmVudEl0ZW1JbmRleCgpKTsKKyAgICAgICAgVGVzdENhc2UuYXNzZXJ0RXF1YWxzKCJlbmFibGVkIGhhcyBpbmNvcnJlY3QgdmFsdWUiLCBleHBlY3RlZEV2ZW50LmlzRW5hYmxlZCgpLAorICAgICAgICAgICAgICAgIHJlY2VpdmVkRXZlbnQuaXNFbmFibGVkKCkpOworICAgICAgICBUZXN0Q2FzZS5hc3NlcnRFcXVhbHMoImV2ZW50VHlwZSBoYXMgaW5jb3JyZWN0IHZhbHVlIiwgZXhwZWN0ZWRFdmVudC5nZXRFdmVudFR5cGUoKSwKKyAgICAgICAgICAgICAgICByZWNlaXZlZEV2ZW50LmdldEV2ZW50VHlwZSgpKTsKKyAgICAgICAgVGVzdENhc2UuYXNzZXJ0RXF1YWxzKCJmcm9tSW5kZXggaGFzIGluY29ycmVjdCB2YWx1ZSIsIGV4cGVjdGVkRXZlbnQuZ2V0RnJvbUluZGV4KCksCisgICAgICAgICAgICAgICAgcmVjZWl2ZWRFdmVudC5nZXRGcm9tSW5kZXgoKSk7CisgICAgICAgIFRlc3RDYXNlLmFzc2VydEVxdWFscygiZnVsbFNjcmVlbiBoYXMgaW5jb3JyZWN0IHZhbHVlIiwgZXhwZWN0ZWRFdmVudC5pc0Z1bGxTY3JlZW4oKSwKKyAgICAgICAgICAgICAgICByZWNlaXZlZEV2ZW50LmlzRnVsbFNjcmVlbigpKTsKKyAgICAgICAgVGVzdENhc2UuYXNzZXJ0RXF1YWxzKCJpdGVtQ291bnQgaGFzIGluY29ycmVjdCB2YWx1ZSIsIGV4cGVjdGVkRXZlbnQuZ2V0SXRlbUNvdW50KCksCisgICAgICAgICAgICAgICAgcmVjZWl2ZWRFdmVudC5nZXRJdGVtQ291bnQoKSk7CisgICAgICAgIGFzc2VydEVxdWFsc05vdGlmaWNhdGlvbkFzUGFyY2VsYWJsZURhdGEoZXhwZWN0ZWRFdmVudCwgcmVjZWl2ZWRFdmVudCk7CisgICAgICAgIFRlc3RDYXNlLmFzc2VydEVxdWFscygicGFzc3dvcmQgaGFzIGluY29ycmVjdCB2YWx1ZSIsIGV4cGVjdGVkRXZlbnQuaXNQYXNzd29yZCgpLAorICAgICAgICAgICAgICAgIHJlY2VpdmVkRXZlbnQuaXNQYXNzd29yZCgpKTsKKyAgICAgICAgVGVzdENhc2UuYXNzZXJ0RXF1YWxzKCJyZW1vdmVkQ291bnQgaGFzIGluY29ycmVjdCB2YWx1ZSIsIGV4cGVjdGVkRXZlbnQuZ2V0UmVtb3ZlZENvdW50KCksCisgICAgICAgICAgICAgICAgcmVjZWl2ZWRFdmVudC5nZXRSZW1vdmVkQ291bnQoKSk7CisgICAgICAgIGFzc2VydEVxdWFsc1RleHQoZXhwZWN0ZWRFdmVudCwgcmVjZWl2ZWRFdmVudCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29tcGFyZXMgdGhlIHtAbGluayBhbmRyb2lkLm9zLlBhcmNlbGFibGV9IGRhdGEgb2YgdGhlCisgICAgICogPGNvZGU+ZXhwZWN0ZWRFdmVudDwvY29kZT4gYW5kIDxjb2RlPnJlY2VpdmVkRXZlbnQ8L2NvZGU+IHRvIHZlcmlmeSB0aGF0CisgICAgICogdGhlIHJlY2VpdmVkIGV2ZW50IGlzIHRoZSBvbmUgdGhhdCBpcyBleHBlY3RlZC4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgYXNzZXJ0RXF1YWxzTm90aWZpY2F0aW9uQXNQYXJjZWxhYmxlRGF0YShBY2Nlc3NpYmlsaXR5RXZlbnQgZXhwZWN0ZWRFdmVudCwKKyAgICAgICAgICAgIEFjY2Vzc2liaWxpdHlFdmVudCByZWNlaXZlZEV2ZW50KSB7CisgICAgICAgIFN0cmluZyBtZXNzYWdlID0gInBhcmNlbGFibGVEYXRhIGhhcyBpbmNvcnJlY3QgdmFsdWUiOworICAgICAgICBNZXNzYWdlIGV4cGVjdGVkTWVzc2FnZSA9IChNZXNzYWdlKSBleHBlY3RlZEV2ZW50LmdldFBhcmNlbGFibGVEYXRhKCk7CisgICAgICAgIE1lc3NhZ2UgcmVjZWl2ZWRNZXNzYWdlID0gKE1lc3NhZ2UpIHJlY2VpdmVkRXZlbnQuZ2V0UGFyY2VsYWJsZURhdGEoKTsKKworICAgICAgICBpZiAoZXhwZWN0ZWRNZXNzYWdlID09IG51bGwpIHsKKyAgICAgICAgICAgIGlmIChyZWNlaXZlZE1lc3NhZ2UgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIFRlc3RDYXNlLmFzc2VydE5vdE51bGwobWVzc2FnZSwgcmVjZWl2ZWRNZXNzYWdlKTsKKworICAgICAgICAvLyB3ZSBkbyBhIHZlcnkgc2ltcGxlIHNhbml0eSBjaGVjayBzaW5jZSB3ZSBkbyBub3QgdGVzdCBNZXNzYWdlCisgICAgICAgIFRlc3RDYXNlLmFzc2VydEVxdWFscyhtZXNzYWdlLCBleHBlY3RlZE1lc3NhZ2Uud2hhdCwgcmVjZWl2ZWRNZXNzYWdlLndoYXQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbXBhcmVzIHRoZSB0ZXh0IG9mIHRoZSA8Y29kZT5leHBlY3RlZEV2ZW50PC9jb2RlPiBhbmQKKyAgICAgKiA8Y29kZT5yZWNlaXZlZEV2ZW50PC9jb2RlPiBieSBjb21wYXJpbmcgdGhlIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUKKyAgICAgKiBjb3JyZXNwb25kaW5nIHtAbGluayBDaGFyU2VxdWVuY2V9cy4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgYXNzZXJ0RXF1YWxzVGV4dChBY2Nlc3NpYmlsaXR5RXZlbnQgZXhwZWN0ZWRFdmVudCwKKyAgICAgICAgICAgIEFjY2Vzc2liaWxpdHlFdmVudCByZWNlaXZlZEV2ZW50KSB7CisgICAgICAgIFN0cmluZyBtZXNzYWdlID0gInRleHQgaGFzIGluY29ycmVjdCB2YWx1ZSI7CisgICAgICAgIExpc3Q8Q2hhclNlcXVlbmNlPiBleHBlY3RlZFRleHQgPSBleHBlY3RlZEV2ZW50LmdldFRleHQoKTsKKyAgICAgICAgTGlzdDxDaGFyU2VxdWVuY2U+IHJlY2VpdmVkVGV4dCA9IHJlY2VpdmVkRXZlbnQuZ2V0VGV4dCgpOworCisgICAgICAgIFRlc3RDYXNlLmFzc2VydEVxdWFscyhtZXNzYWdlLCBleHBlY3RlZFRleHQuc2l6ZSgpLCByZWNlaXZlZFRleHQuc2l6ZSgpKTsKKworICAgICAgICBJdGVyYXRvcjxDaGFyU2VxdWVuY2U+IGV4cGVjdGVkVGV4dEl0ZXJhdG9yID0gZXhwZWN0ZWRUZXh0Lml0ZXJhdG9yKCk7CisgICAgICAgIEl0ZXJhdG9yPENoYXJTZXF1ZW5jZT4gcmVjZWl2ZWRUZXh0SXRlcmF0b3IgPSByZWNlaXZlZFRleHQuaXRlcmF0b3IoKTsKKworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGV4cGVjdGVkVGV4dC5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgLy8gY29tcGFyZSB0aGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uCisgICAgICAgICAgICBUZXN0Q2FzZS5hc3NlcnRFcXVhbHMobWVzc2FnZSwgZXhwZWN0ZWRUZXh0SXRlcmF0b3IubmV4dCgpLnRvU3RyaW5nKCksCisgICAgICAgICAgICAgICAgICAgIHJlY2VpdmVkVGV4dEl0ZXJhdG9yLm5leHQoKS50b1N0cmluZygpKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL3Rlc3RzL3NlcnZpY2VzdGVzdHMvc3JjL2NvbS9hbmRyb2lkL3NlcnZlci9sb2NhdGlvbi9Db21wcmVoZW5zaXZlQ291bnRyeURldGVjdG9yVGVzdC5qYXZhIGIvc2VydmljZXMvdGVzdHMvc2VydmljZXN0ZXN0cy9zcmMvY29tL2FuZHJvaWQvc2VydmVyL2xvY2F0aW9uL0NvbXByZWhlbnNpdmVDb3VudHJ5RGV0ZWN0b3JUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTg5NjZjMAotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL3Rlc3RzL3NlcnZpY2VzdGVzdHMvc3JjL2NvbS9hbmRyb2lkL3NlcnZlci9sb2NhdGlvbi9Db21wcmVoZW5zaXZlQ291bnRyeURldGVjdG9yVGVzdC5qYXZhCkBAIC0wLDAgKzEsMjk5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UKKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLnNlcnZlci5sb2NhdGlvbjsKKworaW1wb3J0IGFuZHJvaWQubG9jYXRpb24uQ291bnRyeTsKK2ltcG9ydCBhbmRyb2lkLmxvY2F0aW9uLkNvdW50cnlMaXN0ZW5lcjsKK2ltcG9ydCBhbmRyb2lkLnRlc3QuQW5kcm9pZFRlc3RDYXNlOworCitwdWJsaWMgY2xhc3MgQ29tcHJlaGVuc2l2ZUNvdW50cnlEZXRlY3RvclRlc3QgZXh0ZW5kcyBBbmRyb2lkVGVzdENhc2UgeworICAgIHByaXZhdGUgY2xhc3MgVGVzdENvdW50cnlEZXRlY3RvciBleHRlbmRzIENvbXByZWhlbnNpdmVDb3VudHJ5RGV0ZWN0b3IgeworICAgICAgICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBDT1VOVFJZX0lTTyA9ICJ1cyI7CisgICAgICAgIHByaXZhdGUgYm9vbGVhbiBtTG9jYXRpb25CYXNlZERldGVjdG9yU3RhcnRlZDsKKyAgICAgICAgcHJpdmF0ZSBib29sZWFuIG1Mb2NhdGlvbkJhc2VkRGV0ZWN0b3JTdG9wcGVkOworICAgICAgICBwcm90ZWN0ZWQgYm9vbGVhbiBtTm90aWZpZWQ7CisgICAgICAgIHByaXZhdGUgYm9vbGVhbiBsaXN0ZW5lckFkZGVkID0gZmFsc2U7CisKKyAgICAgICAgcHJpdmF0ZSBDb3VudHJ5IG1Ob3RpZmllZENvdW50cnk7CisgICAgICAgIHB1YmxpYyBUZXN0Q291bnRyeURldGVjdG9yKCkgeworICAgICAgICAgICAgc3VwZXIoZ2V0Q29udGV4dCgpKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIG5vdGlmeUxvY2F0aW9uQmFzZWRMaXN0ZW5lcihDb3VudHJ5IGNvdW50cnkpIHsKKyAgICAgICAgICAgIG1Ob3RpZmllZCA9IHRydWU7CisgICAgICAgICAgICBtTm90aWZpZWRDb3VudHJ5ID0gY291bnRyeTsKKyAgICAgICAgICAgIG1Mb2NhdGlvbkJhc2VkQ291bnRyeURldGVjdG9yLm5vdGlmeUxpc3RlbmVyKGNvdW50cnkpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGJvb2xlYW4gbG9jYXRpb25CYXNlZERldGVjdG9yU3RhcnRlZCgpIHsKKyAgICAgICAgICAgIHJldHVybiBtTG9jYXRpb25CYXNlZENvdW50cnlEZXRlY3RvciAhPSBudWxsICYmIG1Mb2NhdGlvbkJhc2VkRGV0ZWN0b3JTdGFydGVkOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGJvb2xlYW4gbG9jYXRpb25CYXNlZERldGVjdG9yU3RvcHBlZCgpIHsKKyAgICAgICAgICAgIHJldHVybiBtTG9jYXRpb25CYXNlZENvdW50cnlEZXRlY3RvciA9PSBudWxsICYmIG1Mb2NhdGlvbkJhc2VkRGV0ZWN0b3JTdG9wcGVkOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGJvb2xlYW4gbG9jYXRpb25SZWZyZXNoU3RhcnRlZCgpIHsKKyAgICAgICAgICAgIHJldHVybiBtTG9jYXRpb25SZWZyZXNoVGltZXIgIT0gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBib29sZWFuIGxvY2F0aW9uUmVmcmVzaENhbmNlbGxlZCgpIHsKKyAgICAgICAgICAgIHJldHVybiBtTG9jYXRpb25SZWZyZXNoVGltZXIgPT0gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwcm90ZWN0ZWQgQ291bnRyeURldGVjdG9yQmFzZSBjcmVhdGVMb2NhdGlvbkJhc2VkQ291bnRyeURldGVjdG9yKCkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBDb3VudHJ5RGV0ZWN0b3JCYXNlKG1Db250ZXh0KSB7CisgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgcHVibGljIENvdW50cnkgZGV0ZWN0Q291bnRyeSgpIHsKKyAgICAgICAgICAgICAgICAgICAgbUxvY2F0aW9uQmFzZWREZXRlY3RvclN0YXJ0ZWQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBzdG9wKCkgeworICAgICAgICAgICAgICAgICAgICBtTG9jYXRpb25CYXNlZERldGVjdG9yU3RvcHBlZCA9IHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwcm90ZWN0ZWQgQ291bnRyeSBnZXROZXR3b3JrQmFzZWRDb3VudHJ5KCkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHJvdGVjdGVkIENvdW50cnkgZ2V0TGFzdEtub3duTG9jYXRpb25CYXNlZENvdW50cnkoKSB7CisgICAgICAgICAgICByZXR1cm4gbU5vdGlmaWVkQ291bnRyeTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwcm90ZWN0ZWQgQ291bnRyeSBnZXRTaW1CYXNlZENvdW50cnkoKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwcm90ZWN0ZWQgQ291bnRyeSBnZXRMb2NhbGVDb3VudHJ5KCkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHJvdGVjdGVkIHZvaWQgcnVuQWZ0ZXJEZXRlY3Rpb25Bc3luYyhmaW5hbCBDb3VudHJ5IGNvdW50cnksIGZpbmFsIENvdW50cnkgZGV0ZWN0ZWRDb3VudHJ5LAorICAgICAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gbm90aWZ5Q2hhbmdlLCBmaW5hbCBib29sZWFuIHN0YXJ0TG9jYXRpb25CYXNlZERldGVjdGlvbikgeworICAgICAgICAgICAgcnVuQWZ0ZXJEZXRlY3Rpb24oY291bnRyeSwgZGV0ZWN0ZWRDb3VudHJ5LCBub3RpZnlDaGFuZ2UsIHN0YXJ0TG9jYXRpb25CYXNlZERldGVjdGlvbik7CisgICAgICAgIH07CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHByb3RlY3RlZCBib29sZWFuIGlzQWlycGxhbmVNb2RlT2ZmKCkgeworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHJvdGVjdGVkIHN5bmNocm9uaXplZCB2b2lkIGFkZFBob25lU3RhdGVMaXN0ZW5lcigpIHsKKyAgICAgICAgICAgIGxpc3RlbmVyQWRkZWQgPSB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHByb3RlY3RlZCBzeW5jaHJvbml6ZWQgdm9pZCByZW1vdmVQaG9uZVN0YXRlTGlzdGVuZXIoKSB7CisgICAgICAgICAgICBsaXN0ZW5lckFkZGVkID0gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHJvdGVjdGVkIGJvb2xlYW4gaXNHZW9Db2RlckltcGxlbWVudGVkKCkgeworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc1Bob25lU3RhdGVMaXN0ZW5lckFkZGVkKCkgeworICAgICAgICAgICAgcmV0dXJuIGxpc3RlbmVyQWRkZWQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIGNsYXNzIENvdW50cnlMaXN0ZW5lckltcGwgaW1wbGVtZW50cyBDb3VudHJ5TGlzdGVuZXIgeworICAgICAgICBwcml2YXRlIGJvb2xlYW4gbU5vdGlmaWVkOworICAgICAgICBwcml2YXRlIENvdW50cnkgbUNvdW50cnk7CisKKyAgICAgICAgcHVibGljIHZvaWQgb25Db3VudHJ5RGV0ZWN0ZWQoQ291bnRyeSBjb3VudHJ5KSB7CisgICAgICAgICAgICBtTm90aWZpZWQgPSB0cnVlOworICAgICAgICAgICAgbUNvdW50cnkgPSBjb3VudHJ5OworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGJvb2xlYW4gbm90aWZpZWQoKSB7CisgICAgICAgICAgICByZXR1cm4gbU5vdGlmaWVkOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIENvdW50cnkgZ2V0Q291bnRyeSgpIHsKKyAgICAgICAgICAgIHJldHVybiBtQ291bnRyeTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3REZXRlY3ROZXR3b3JrQmFzZWRDb3VudHJ5KCkgeworICAgICAgICBmaW5hbCBDb3VudHJ5IHJlc3VsdENvdW50cnkgPSBuZXcgQ291bnRyeSgKKyAgICAgICAgICAgICAgICBUZXN0Q291bnRyeURldGVjdG9yLkNPVU5UUllfSVNPLCBDb3VudHJ5LkNPVU5UUllfU09VUkNFX05FVFdPUkspOworICAgICAgICBUZXN0Q291bnRyeURldGVjdG9yIGNvdW50cnlEZXRlY3RvciA9IG5ldyBUZXN0Q291bnRyeURldGVjdG9yKCkgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwcm90ZWN0ZWQgQ291bnRyeSBnZXROZXR3b3JrQmFzZWRDb3VudHJ5KCkgeworICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHRDb3VudHJ5OworICAgICAgICAgICAgfQorICAgICAgICB9OworICAgICAgICBDb3VudHJ5TGlzdGVuZXJJbXBsIGxpc3RlbmVyID0gbmV3IENvdW50cnlMaXN0ZW5lckltcGwoKTsKKyAgICAgICAgY291bnRyeURldGVjdG9yLnNldENvdW50cnlMaXN0ZW5lcihsaXN0ZW5lcik7CisgICAgICAgIENvdW50cnkgY291bnRyeSA9IGNvdW50cnlEZXRlY3Rvci5kZXRlY3RDb3VudHJ5KCk7CisgICAgICAgIGFzc2VydFRydWUoc2FtZUNvdW50cnkoY291bnRyeSwgcmVzdWx0Q291bnRyeSkpOworICAgICAgICBhc3NlcnRGYWxzZShsaXN0ZW5lci5ub3RpZmllZCgpKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UoY291bnRyeURldGVjdG9yLmxvY2F0aW9uQmFzZWREZXRlY3RvclN0YXJ0ZWQoKSk7CisgICAgICAgIGFzc2VydEZhbHNlKGNvdW50cnlEZXRlY3Rvci5sb2NhdGlvblJlZnJlc2hTdGFydGVkKCkpOworICAgICAgICBjb3VudHJ5RGV0ZWN0b3Iuc3RvcCgpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3REZXRlY3RMb2NhdGlvbkJhc2VkQ291bnRyeSgpIHsKKyAgICAgICAgZmluYWwgQ291bnRyeSByZXN1bHRDb3VudHJ5ID0gbmV3IENvdW50cnkoCisgICAgICAgICAgICAgICAgVGVzdENvdW50cnlEZXRlY3Rvci5DT1VOVFJZX0lTTywgQ291bnRyeS5DT1VOVFJZX1NPVVJDRV9TSU0pOworICAgICAgICBmaW5hbCBDb3VudHJ5IGxvY2F0aW9uQmFzZWRDb3VudHJ5ID0gbmV3IENvdW50cnkoCisgICAgICAgICAgICAgICAgVGVzdENvdW50cnlEZXRlY3Rvci5DT1VOVFJZX0lTTywgQ291bnRyeS5DT1VOVFJZX1NPVVJDRV9MT0NBVElPTik7CisgICAgICAgIFRlc3RDb3VudHJ5RGV0ZWN0b3IgY291bnRyeURldGVjdG9yID0gbmV3IFRlc3RDb3VudHJ5RGV0ZWN0b3IoKSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHByb3RlY3RlZCBDb3VudHJ5IGdldFNpbUJhc2VkQ291bnRyeSgpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0Q291bnRyeTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKyAgICAgICAgQ291bnRyeUxpc3RlbmVySW1wbCBsaXN0ZW5lciA9IG5ldyBDb3VudHJ5TGlzdGVuZXJJbXBsKCk7CisgICAgICAgIGNvdW50cnlEZXRlY3Rvci5zZXRDb3VudHJ5TGlzdGVuZXIobGlzdGVuZXIpOworICAgICAgICBDb3VudHJ5IGNvdW50cnkgPSBjb3VudHJ5RGV0ZWN0b3IuZGV0ZWN0Q291bnRyeSgpOworICAgICAgICBhc3NlcnRUcnVlKHNhbWVDb3VudHJ5KGNvdW50cnksIHJlc3VsdENvdW50cnkpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShjb3VudHJ5RGV0ZWN0b3IubG9jYXRpb25CYXNlZERldGVjdG9yU3RhcnRlZCgpKTsKKyAgICAgICAgY291bnRyeURldGVjdG9yLm5vdGlmeUxvY2F0aW9uQmFzZWRMaXN0ZW5lcihsb2NhdGlvbkJhc2VkQ291bnRyeSk7CisgICAgICAgIGFzc2VydFRydWUobGlzdGVuZXIubm90aWZpZWQoKSk7CisgICAgICAgIGFzc2VydFRydWUoc2FtZUNvdW50cnkobGlzdGVuZXIuZ2V0Q291bnRyeSgpLCBsb2NhdGlvbkJhc2VkQ291bnRyeSkpOworICAgICAgICBhc3NlcnRUcnVlKGNvdW50cnlEZXRlY3Rvci5sb2NhdGlvbkJhc2VkRGV0ZWN0b3JTdG9wcGVkKCkpOworICAgICAgICBhc3NlcnRUcnVlKGNvdW50cnlEZXRlY3Rvci5sb2NhdGlvblJlZnJlc2hTdGFydGVkKCkpOworICAgICAgICBjb3VudHJ5RGV0ZWN0b3Iuc3RvcCgpOworICAgICAgICBhc3NlcnRUcnVlKGNvdW50cnlEZXRlY3Rvci5sb2NhdGlvblJlZnJlc2hDYW5jZWxsZWQoKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdExvY2FsZUJhc2VkQ291bnRyeSgpIHsKKyAgICAgICAgZmluYWwgQ291bnRyeSByZXN1bHRDb3VudHJ5ID0gbmV3IENvdW50cnkoCisgICAgICAgICAgICAgICAgVGVzdENvdW50cnlEZXRlY3Rvci5DT1VOVFJZX0lTTywgQ291bnRyeS5DT1VOVFJZX1NPVVJDRV9MT0NBTEUpOworICAgICAgICBUZXN0Q291bnRyeURldGVjdG9yIGNvdW50cnlEZXRlY3RvciA9IG5ldyBUZXN0Q291bnRyeURldGVjdG9yKCkgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwcm90ZWN0ZWQgQ291bnRyeSBnZXRMb2NhbGVDb3VudHJ5KCkgeworICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHRDb3VudHJ5OworICAgICAgICAgICAgfQorICAgICAgICB9OworICAgICAgICBDb3VudHJ5TGlzdGVuZXJJbXBsIGxpc3RlbmVyID0gbmV3IENvdW50cnlMaXN0ZW5lckltcGwoKTsKKyAgICAgICAgY291bnRyeURldGVjdG9yLnNldENvdW50cnlMaXN0ZW5lcihsaXN0ZW5lcik7CisgICAgICAgIENvdW50cnkgY291bnRyeSA9IGNvdW50cnlEZXRlY3Rvci5kZXRlY3RDb3VudHJ5KCk7CisgICAgICAgIGFzc2VydFRydWUoc2FtZUNvdW50cnkoY291bnRyeSwgcmVzdWx0Q291bnRyeSkpOworICAgICAgICBhc3NlcnRGYWxzZShsaXN0ZW5lci5ub3RpZmllZCgpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShjb3VudHJ5RGV0ZWN0b3IubG9jYXRpb25CYXNlZERldGVjdG9yU3RhcnRlZCgpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShjb3VudHJ5RGV0ZWN0b3IubG9jYXRpb25SZWZyZXNoU3RhcnRlZCgpKTsKKyAgICAgICAgY291bnRyeURldGVjdG9yLnN0b3AoKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShjb3VudHJ5RGV0ZWN0b3IubG9jYXRpb25SZWZyZXNoQ2FuY2VsbGVkKCkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RTdG9wcGluZ0RldGVjdG9yKCkgeworICAgICAgICAvLyBUZXN0IHN0b3BwaW5nIGRldGVjdG9yIHdoZW4gTG9jYXRpb25CYXNlZENvdW50cnlEZXRlY3RvciB3YXMgc3RhcnRlZAorICAgICAgICBmaW5hbCBDb3VudHJ5IHJlc3VsdENvdW50cnkgPSBuZXcgQ291bnRyeSgKKyAgICAgICAgICAgICAgICBUZXN0Q291bnRyeURldGVjdG9yLkNPVU5UUllfSVNPLCBDb3VudHJ5LkNPVU5UUllfU09VUkNFX1NJTSk7CisgICAgICAgIFRlc3RDb3VudHJ5RGV0ZWN0b3IgY291bnRyeURldGVjdG9yID0gbmV3IFRlc3RDb3VudHJ5RGV0ZWN0b3IoKSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHByb3RlY3RlZCBDb3VudHJ5IGdldFNpbUJhc2VkQ291bnRyeSgpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0Q291bnRyeTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKyAgICAgICAgQ291bnRyeUxpc3RlbmVySW1wbCBsaXN0ZW5lciA9IG5ldyBDb3VudHJ5TGlzdGVuZXJJbXBsKCk7CisgICAgICAgIGNvdW50cnlEZXRlY3Rvci5zZXRDb3VudHJ5TGlzdGVuZXIobGlzdGVuZXIpOworICAgICAgICBDb3VudHJ5IGNvdW50cnkgPSBjb3VudHJ5RGV0ZWN0b3IuZGV0ZWN0Q291bnRyeSgpOworICAgICAgICBhc3NlcnRUcnVlKHNhbWVDb3VudHJ5KGNvdW50cnksIHJlc3VsdENvdW50cnkpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShjb3VudHJ5RGV0ZWN0b3IubG9jYXRpb25CYXNlZERldGVjdG9yU3RhcnRlZCgpKTsKKyAgICAgICAgY291bnRyeURldGVjdG9yLnN0b3AoKTsKKyAgICAgICAgLy8gVGhlIExvY2F0aW9uQmFzZWREZXRlY3RvciBzaG91bGQgYmUgc3RvcHBlZC4KKyAgICAgICAgYXNzZXJ0VHJ1ZShjb3VudHJ5RGV0ZWN0b3IubG9jYXRpb25CYXNlZERldGVjdG9yU3RvcHBlZCgpKTsKKyAgICAgICAgLy8gVGhlIGxvY2F0aW9uIHJlZnJlc2ggc2hvdWxkIG5vdCBydW5uaW5nLgorICAgICAgICBhc3NlcnRUcnVlKGNvdW50cnlEZXRlY3Rvci5sb2NhdGlvblJlZnJlc2hDYW5jZWxsZWQoKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdExvY2F0aW9uQmFzZWRDb3VudHJ5Tm90Rm91bmQoKSB7CisgICAgICAgIGZpbmFsIENvdW50cnkgcmVzdWx0Q291bnRyeSA9IG5ldyBDb3VudHJ5KAorICAgICAgICAgICAgICAgIFRlc3RDb3VudHJ5RGV0ZWN0b3IuQ09VTlRSWV9JU08sIENvdW50cnkuQ09VTlRSWV9TT1VSQ0VfU0lNKTsKKyAgICAgICAgVGVzdENvdW50cnlEZXRlY3RvciBjb3VudHJ5RGV0ZWN0b3IgPSBuZXcgVGVzdENvdW50cnlEZXRlY3RvcigpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHJvdGVjdGVkIENvdW50cnkgZ2V0U2ltQmFzZWRDb3VudHJ5KCkgeworICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHRDb3VudHJ5OworICAgICAgICAgICAgfQorICAgICAgICB9OworICAgICAgICBDb3VudHJ5TGlzdGVuZXJJbXBsIGxpc3RlbmVyID0gbmV3IENvdW50cnlMaXN0ZW5lckltcGwoKTsKKyAgICAgICAgY291bnRyeURldGVjdG9yLnNldENvdW50cnlMaXN0ZW5lcihsaXN0ZW5lcik7CisgICAgICAgIENvdW50cnkgY291bnRyeSA9IGNvdW50cnlEZXRlY3Rvci5kZXRlY3RDb3VudHJ5KCk7CisgICAgICAgIGFzc2VydFRydWUoc2FtZUNvdW50cnkoY291bnRyeSwgcmVzdWx0Q291bnRyeSkpOworICAgICAgICBhc3NlcnRUcnVlKGNvdW50cnlEZXRlY3Rvci5sb2NhdGlvbkJhc2VkRGV0ZWN0b3JTdGFydGVkKCkpOworICAgICAgICBjb3VudHJ5RGV0ZWN0b3Iubm90aWZ5TG9jYXRpb25CYXNlZExpc3RlbmVyKG51bGwpOworICAgICAgICBhc3NlcnRGYWxzZShsaXN0ZW5lci5ub3RpZmllZCgpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShzYW1lQ291bnRyeShsaXN0ZW5lci5nZXRDb3VudHJ5KCksIG51bGwpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShjb3VudHJ5RGV0ZWN0b3IubG9jYXRpb25CYXNlZERldGVjdG9yU3RvcHBlZCgpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShjb3VudHJ5RGV0ZWN0b3IubG9jYXRpb25SZWZyZXNoU3RhcnRlZCgpKTsKKyAgICAgICAgY291bnRyeURldGVjdG9yLnN0b3AoKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShjb3VudHJ5RGV0ZWN0b3IubG9jYXRpb25SZWZyZXNoQ2FuY2VsbGVkKCkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3ROb0NvdW50cnlGb3VuZCgpIHsKKyAgICAgICAgVGVzdENvdW50cnlEZXRlY3RvciBjb3VudHJ5RGV0ZWN0b3IgPSBuZXcgVGVzdENvdW50cnlEZXRlY3RvcigpOworICAgICAgICBDb3VudHJ5TGlzdGVuZXJJbXBsIGxpc3RlbmVyID0gbmV3IENvdW50cnlMaXN0ZW5lckltcGwoKTsKKyAgICAgICAgY291bnRyeURldGVjdG9yLnNldENvdW50cnlMaXN0ZW5lcihsaXN0ZW5lcik7CisgICAgICAgIENvdW50cnkgY291bnRyeSA9IGNvdW50cnlEZXRlY3Rvci5kZXRlY3RDb3VudHJ5KCk7CisgICAgICAgIGFzc2VydFRydWUoc2FtZUNvdW50cnkoY291bnRyeSwgbnVsbCkpOworICAgICAgICBhc3NlcnRUcnVlKGNvdW50cnlEZXRlY3Rvci5sb2NhdGlvbkJhc2VkRGV0ZWN0b3JTdGFydGVkKCkpOworICAgICAgICBjb3VudHJ5RGV0ZWN0b3Iubm90aWZ5TG9jYXRpb25CYXNlZExpc3RlbmVyKG51bGwpOworICAgICAgICBhc3NlcnRGYWxzZShsaXN0ZW5lci5ub3RpZmllZCgpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShzYW1lQ291bnRyeShsaXN0ZW5lci5nZXRDb3VudHJ5KCksIG51bGwpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShjb3VudHJ5RGV0ZWN0b3IubG9jYXRpb25CYXNlZERldGVjdG9yU3RvcHBlZCgpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShjb3VudHJ5RGV0ZWN0b3IubG9jYXRpb25SZWZyZXNoU3RhcnRlZCgpKTsKKyAgICAgICAgY291bnRyeURldGVjdG9yLnN0b3AoKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShjb3VudHJ5RGV0ZWN0b3IubG9jYXRpb25SZWZyZXNoQ2FuY2VsbGVkKCkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RBZGRSZW1vdmVMaXN0ZW5lcigpIHsKKyAgICAgICAgVGVzdENvdW50cnlEZXRlY3RvciBjb3VudHJ5RGV0ZWN0b3IgPSBuZXcgVGVzdENvdW50cnlEZXRlY3RvcigpOworICAgICAgICBDb3VudHJ5TGlzdGVuZXJJbXBsIGxpc3RlbmVyID0gbmV3IENvdW50cnlMaXN0ZW5lckltcGwoKTsKKyAgICAgICAgY291bnRyeURldGVjdG9yLnNldENvdW50cnlMaXN0ZW5lcihsaXN0ZW5lcik7CisgICAgICAgIGFzc2VydFRydWUoY291bnRyeURldGVjdG9yLmlzUGhvbmVTdGF0ZUxpc3RlbmVyQWRkZWQoKSk7CisgICAgICAgIGFzc2VydFRydWUoY291bnRyeURldGVjdG9yLmxvY2F0aW9uQmFzZWREZXRlY3RvclN0YXJ0ZWQoKSk7CisgICAgICAgIGNvdW50cnlEZXRlY3Rvci5zZXRDb3VudHJ5TGlzdGVuZXIobnVsbCk7CisgICAgICAgIGFzc2VydEZhbHNlKGNvdW50cnlEZXRlY3Rvci5pc1Bob25lU3RhdGVMaXN0ZW5lckFkZGVkKCkpOworICAgICAgICBhc3NlcnRUcnVlKGNvdW50cnlEZXRlY3Rvci5sb2NhdGlvbkJhc2VkRGV0ZWN0b3JTdG9wcGVkKCkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RHZW9jb2Rlck5vdEltcGxlbWVudGVkKCkgeworICAgICAgICBUZXN0Q291bnRyeURldGVjdG9yIGNvdW50cnlEZXRlY3RvciA9IG5ldyBUZXN0Q291bnRyeURldGVjdG9yKCkgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwcm90ZWN0ZWQgYm9vbGVhbiBpc0dlb0NvZGVySW1wbGVtZW50ZWQoKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICB9OworICAgICAgICBDb3VudHJ5TGlzdGVuZXJJbXBsIGxpc3RlbmVyID0gbmV3IENvdW50cnlMaXN0ZW5lckltcGwoKTsKKyAgICAgICAgY291bnRyeURldGVjdG9yLnNldENvdW50cnlMaXN0ZW5lcihsaXN0ZW5lcik7CisgICAgICAgIGFzc2VydFRydWUoY291bnRyeURldGVjdG9yLmlzUGhvbmVTdGF0ZUxpc3RlbmVyQWRkZWQoKSk7CisgICAgICAgIGFzc2VydEZhbHNlKGNvdW50cnlEZXRlY3Rvci5sb2NhdGlvbkJhc2VkRGV0ZWN0b3JTdGFydGVkKCkpOworICAgICAgICBjb3VudHJ5RGV0ZWN0b3Iuc2V0Q291bnRyeUxpc3RlbmVyKG51bGwpOworICAgICAgICBhc3NlcnRGYWxzZShjb3VudHJ5RGV0ZWN0b3IuaXNQaG9uZVN0YXRlTGlzdGVuZXJBZGRlZCgpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIGJvb2xlYW4gc2FtZUNvdW50cnkoQ291bnRyeSBjb3VudHJ5MSwgQ291bnRyeSBjb3VudHJ5MikgeworICAgICAgICByZXR1cm4gY291bnRyeTEgPT0gbnVsbCAmJiBjb3VudHJ5MiA9PSBudWxsIHx8IGNvdW50cnkxICE9IG51bGwgJiYgY291bnRyeTIgIT0gbnVsbCAmJgorICAgICAgICBjb3VudHJ5MS5nZXRDb3VudHJ5SXNvKCkuZXF1YWxzSWdub3JlQ2FzZShjb3VudHJ5Mi5nZXRDb3VudHJ5SXNvKCkpICYmCisgICAgICAgIGNvdW50cnkxLmdldFNvdXJjZSgpID09IGNvdW50cnkyLmdldFNvdXJjZSgpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL3Rlc3RzL3NlcnZpY2VzdGVzdHMvc3JjL2NvbS9hbmRyb2lkL3NlcnZlci9sb2NhdGlvbi9Mb2NhdGlvbkJhc2VkQ291bnRyeURldGVjdG9yVGVzdC5qYXZhIGIvc2VydmljZXMvdGVzdHMvc2VydmljZXN0ZXN0cy9zcmMvY29tL2FuZHJvaWQvc2VydmVyL2xvY2F0aW9uL0xvY2F0aW9uQmFzZWRDb3VudHJ5RGV0ZWN0b3JUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNzFlOGUyYQotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL3Rlc3RzL3NlcnZpY2VzdGVzdHMvc3JjL2NvbS9hbmRyb2lkL3NlcnZlci9sb2NhdGlvbi9Mb2NhdGlvbkJhc2VkQ291bnRyeURldGVjdG9yVGVzdC5qYXZhCkBAIC0wLDAgKzEsMzI0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UKKyAqLworcGFja2FnZSBjb20uYW5kcm9pZC5zZXJ2ZXIubG9jYXRpb247CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5UaW1lcjsKKworaW1wb3J0IGFuZHJvaWQubG9jYXRpb24uQ291bnRyeTsKK2ltcG9ydCBhbmRyb2lkLmxvY2F0aW9uLkNvdW50cnlMaXN0ZW5lcjsKK2ltcG9ydCBhbmRyb2lkLmxvY2F0aW9uLkxvY2F0aW9uOworaW1wb3J0IGFuZHJvaWQubG9jYXRpb24uTG9jYXRpb25MaXN0ZW5lcjsKK2ltcG9ydCBhbmRyb2lkLnRlc3QuQW5kcm9pZFRlc3RDYXNlOworCitwdWJsaWMgY2xhc3MgTG9jYXRpb25CYXNlZENvdW50cnlEZXRlY3RvclRlc3QgZXh0ZW5kcyBBbmRyb2lkVGVzdENhc2UgeworICAgIHByaXZhdGUgY2xhc3MgVGVzdENvdW50cnlEZXRlY3RvciBleHRlbmRzIExvY2F0aW9uQmFzZWRDb3VudHJ5RGV0ZWN0b3IgeworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUT1RBTF9QUk9WSURFUlMgPSAyOworICAgICAgICBwcm90ZWN0ZWQgT2JqZWN0IGNvdW50cnlGb3VuZExvY2tlciA9IG5ldyBPYmplY3QoKTsKKyAgICAgICAgcHJvdGVjdGVkIGJvb2xlYW4gbm90aWZ5Q291bnRyeSA9IGZhbHNlOworICAgICAgICBwcml2YXRlIGZpbmFsIExvY2F0aW9uIG1Mb2NhdGlvbjsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbUNvdW50cnk7CisgICAgICAgIHByaXZhdGUgZmluYWwgbG9uZyBtUXVlcnlMb2NhdGlvblRpbWVvdXQ7CisgICAgICAgIHByaXZhdGUgTGlzdDxMb2NhdGlvbkxpc3RlbmVyPiBtTGlzdGVuZXJzOworCisgICAgICAgIHB1YmxpYyBUZXN0Q291bnRyeURldGVjdG9yKFN0cmluZyBjb3VudHJ5LCBTdHJpbmcgcHJvdmlkZXIpIHsKKyAgICAgICAgICAgIHRoaXMoY291bnRyeSwgcHJvdmlkZXIsIDEwMDAgKiA2MCAqIDUpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFRlc3RDb3VudHJ5RGV0ZWN0b3IoU3RyaW5nIGNvdW50cnksIFN0cmluZyBwcm92aWRlciwgbG9uZyBxdWVyeUxvY2F0aW9uVGltZW91dCkgeworICAgICAgICAgICAgc3VwZXIoZ2V0Q29udGV4dCgpKTsKKyAgICAgICAgICAgIG1Db3VudHJ5ID0gY291bnRyeTsKKyAgICAgICAgICAgIG1Mb2NhdGlvbiA9IG5ldyBMb2NhdGlvbihwcm92aWRlcik7CisgICAgICAgICAgICBtUXVlcnlMb2NhdGlvblRpbWVvdXQgPSBxdWVyeUxvY2F0aW9uVGltZW91dDsKKyAgICAgICAgICAgIG1MaXN0ZW5lcnMgPSBuZXcgQXJyYXlMaXN0PExvY2F0aW9uTGlzdGVuZXI+KCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHJvdGVjdGVkIFN0cmluZyBnZXRDb3VudHJ5RnJvbUxvY2F0aW9uKExvY2F0aW9uIGxvY2F0aW9uKSB7CisgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKGNvdW50cnlGb3VuZExvY2tlcikgeworICAgICAgICAgICAgICAgIGlmICghbm90aWZ5Q291bnRyeSkgeworICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgY291bnRyeUZvdW5kTG9ja2VyLndhaXQoKTsKKyAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG1Mb2NhdGlvbi5nZXRQcm92aWRlcigpLmVuZHNXaXRoKGxvY2F0aW9uLmdldFByb3ZpZGVyKCkpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG1Db3VudHJ5OworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwcm90ZWN0ZWQgTG9jYXRpb24gZ2V0TGFzdEtub3duTG9jYXRpb24oKSB7CisgICAgICAgICAgICByZXR1cm4gbUxvY2F0aW9uOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHByb3RlY3RlZCB2b2lkIHJlZ2lzdGVyRW5hYmxlZFByb3ZpZGVycyhMaXN0PExvY2F0aW9uTGlzdGVuZXI+IGxpc3RlbmVycykgeworICAgICAgICAgICAgbUxpc3RlbmVycy5hZGRBbGwobGlzdGVuZXJzKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwcm90ZWN0ZWQgdm9pZCB1bnJlZ2lzdGVyUHJvdmlkZXJzKExpc3Q8TG9jYXRpb25MaXN0ZW5lcj4gbGlzdGVuZXJzKSB7CisgICAgICAgICAgICBmb3IgKExvY2F0aW9uTGlzdGVuZXIgbGlzdGVuZXIgOiBtTG9jYXRpb25MaXN0ZW5lcnMpIHsKKyAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKG1MaXN0ZW5lcnMucmVtb3ZlKGxpc3RlbmVyKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHJvdGVjdGVkIGxvbmcgZ2V0UXVlcnlMb2NhdGlvblRpbWVvdXQoKSB7CisgICAgICAgICAgICByZXR1cm4gbVF1ZXJ5TG9jYXRpb25UaW1lb3V0OworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHByb3RlY3RlZCBpbnQgZ2V0VG90YWxFbmFibGVkUHJvdmlkZXJzKCkgeworICAgICAgICAgICAgcmV0dXJuIFRPVEFMX1BST1ZJREVSUzsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIG5vdGlmeUxvY2F0aW9uRm91bmQoKSB7CisgICAgICAgICAgICAvLyBMaXN0ZW5lciBjb3VsZCBiZSByZW1vdmVkIGluIHRoZSBub3RpZmljYXRpb24uCisgICAgICAgICAgICBMb2NhdGlvbkxpc3RlbmVyW10gbGlzdGVuZXJzID0gbmV3IExvY2F0aW9uTGlzdGVuZXJbbUxpc3RlbmVycy5zaXplKCldOworICAgICAgICAgICAgbUxvY2F0aW9uTGlzdGVuZXJzLnRvQXJyYXkobGlzdGVuZXJzKTsKKyAgICAgICAgICAgIGZvciAoTG9jYXRpb25MaXN0ZW5lciBsaXN0ZW5lciA6bGlzdGVuZXJzKSB7CisgICAgICAgICAgICAgICAgbGlzdGVuZXIub25Mb2NhdGlvbkNoYW5nZWQobUxvY2F0aW9uKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBpbnQgZ2V0TGlzdGVuZXJzQ291bnQoKSB7CisgICAgICAgICAgICByZXR1cm4gbUxpc3RlbmVycy5zaXplKCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBub3RpZnlDb3VudHJ5Rm91bmQoKSB7CisgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKGNvdW50cnlGb3VuZExvY2tlcikgeworICAgICAgICAgICAgICAgIG5vdGlmeUNvdW50cnkgPSB0cnVlOworICAgICAgICAgICAgICAgIGNvdW50cnlGb3VuZExvY2tlci5ub3RpZnkoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBUaW1lciBnZXRUaW1lcigpIHsKKyAgICAgICAgICAgIHJldHVybiBtVGltZXI7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgVGhyZWFkIGdldFF1ZXJ5VGhyZWFkKCkgeworICAgICAgICAgICAgcmV0dXJuIG1RdWVyeVRocmVhZDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgY2xhc3MgQ291bnRyeUxpc3RlbmVySW1wbCBpbXBsZW1lbnRzIENvdW50cnlMaXN0ZW5lciB7CisgICAgICAgIHByaXZhdGUgYm9vbGVhbiBtTm90aWZpZWQ7CisgICAgICAgIHByaXZhdGUgU3RyaW5nIG1Db3VudHJ5Q29kZTsKKyAgICAgICAgcHVibGljIHZvaWQgb25Db3VudHJ5RGV0ZWN0ZWQoQ291bnRyeSBjb3VudHJ5KSB7CisgICAgICAgICAgICBtTm90aWZpZWQgPSB0cnVlOworICAgICAgICAgICAgaWYgKGNvdW50cnkgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG1Db3VudHJ5Q29kZSA9IGNvdW50cnkuZ2V0Q291bnRyeUlzbygpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGJvb2xlYW4gbm90aWZpZWQoKSB7CisgICAgICAgICAgICByZXR1cm4gbU5vdGlmaWVkOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRDb3VudHJ5KCkgeworICAgICAgICAgICAgcmV0dXJuIG1Db3VudHJ5Q29kZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RGaW5kaW5nQ291bnRyeSgpIHsKKyAgICAgICAgZmluYWwgU3RyaW5nIGNvdW50cnkgPSAidXMiOworICAgICAgICBmaW5hbCBTdHJpbmcgcHJvdmlkZXIgPSAiR29vZCI7CisgICAgICAgIENvdW50cnlMaXN0ZW5lckltcGwgY291bnRyeUxpc3RlbmVyID0gbmV3IENvdW50cnlMaXN0ZW5lckltcGwoKTsKKyAgICAgICAgVGVzdENvdW50cnlEZXRlY3RvciBkZXRlY3RvciA9IG5ldyBUZXN0Q291bnRyeURldGVjdG9yKGNvdW50cnksIHByb3ZpZGVyKTsKKyAgICAgICAgZGV0ZWN0b3Iuc2V0Q291bnRyeUxpc3RlbmVyKGNvdW50cnlMaXN0ZW5lcik7CisgICAgICAgIGRldGVjdG9yLmRldGVjdENvdW50cnkoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGRldGVjdG9yLmdldExpc3RlbmVyc0NvdW50KCksIFRlc3RDb3VudHJ5RGV0ZWN0b3IuVE9UQUxfUFJPVklERVJTKTsKKyAgICAgICAgZGV0ZWN0b3Iubm90aWZ5TG9jYXRpb25Gb3VuZCgpOworICAgICAgICAvLyBBbGwgbGlzdGVuZXJzIHNob3VsZCBiZSB1bnJlZ2lzdGVyZWQKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGRldGVjdG9yLmdldExpc3RlbmVyc0NvdW50KCksIDApOworICAgICAgICBhc3NlcnROdWxsKGRldGVjdG9yLmdldFRpbWVyKCkpOworICAgICAgICBUaHJlYWQgcXVlcnlUaHJlYWQgPSB3YWl0Rm9yUXVlcnlUaHJlYWRMYXVuY2hlZChkZXRlY3Rvcik7CisgICAgICAgIGRldGVjdG9yLm5vdGlmeUNvdW50cnlGb3VuZCgpOworICAgICAgICAvLyBXYWl0IGZvciBxdWVyeSB0aHJlYWQgZW5kaW5nCisgICAgICAgIHdhaXRGb3JUaHJlYWRFbmRpbmcocXVlcnlUaHJlYWQpOworICAgICAgICAvLyBRdWVyeVRocmVhZCBzaG91bGQgYmUgc2V0IHRvIE5VTEwKKyAgICAgICAgYXNzZXJ0TnVsbChkZXRlY3Rvci5nZXRRdWVyeVRocmVhZCgpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShjb3VudHJ5TGlzdGVuZXIubm90aWZpZWQoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhjb3VudHJ5TGlzdGVuZXIuZ2V0Q291bnRyeSgpLCBjb3VudHJ5KTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RmluZGluZ0NvdW50cnlDYW5jZWxsZWQoKSB7CisgICAgICAgIGZpbmFsIFN0cmluZyBjb3VudHJ5ID0gInVzIjsKKyAgICAgICAgZmluYWwgU3RyaW5nIHByb3ZpZGVyID0gIkdvb2QiOworICAgICAgICBDb3VudHJ5TGlzdGVuZXJJbXBsIGNvdW50cnlMaXN0ZW5lciA9IG5ldyBDb3VudHJ5TGlzdGVuZXJJbXBsKCk7CisgICAgICAgIFRlc3RDb3VudHJ5RGV0ZWN0b3IgZGV0ZWN0b3IgPSBuZXcgVGVzdENvdW50cnlEZXRlY3Rvcihjb3VudHJ5LCBwcm92aWRlcik7CisgICAgICAgIGRldGVjdG9yLnNldENvdW50cnlMaXN0ZW5lcihjb3VudHJ5TGlzdGVuZXIpOworICAgICAgICBkZXRlY3Rvci5kZXRlY3RDb3VudHJ5KCk7CisgICAgICAgIGFzc2VydEVxdWFscyhkZXRlY3Rvci5nZXRMaXN0ZW5lcnNDb3VudCgpLCBUZXN0Q291bnRyeURldGVjdG9yLlRPVEFMX1BST1ZJREVSUyk7CisgICAgICAgIGRldGVjdG9yLm5vdGlmeUxvY2F0aW9uRm91bmQoKTsKKyAgICAgICAgLy8gQWxsIGxpc3RlbmVycyBzaG91bGQgYmUgdW5yZWdpc3RlcmVkCisgICAgICAgIGFzc2VydEVxdWFscyhkZXRlY3Rvci5nZXRMaXN0ZW5lcnNDb3VudCgpLCAwKTsKKyAgICAgICAgLy8gVGhlIHRpbWUgc2hvdWxkIGJlIHN0b3BwZWQKKyAgICAgICAgYXNzZXJ0TnVsbChkZXRlY3Rvci5nZXRUaW1lcigpKTsKKyAgICAgICAgVGhyZWFkIHF1ZXJ5VGhyZWFkID0gd2FpdEZvclF1ZXJ5VGhyZWFkTGF1bmNoZWQoZGV0ZWN0b3IpOworICAgICAgICBkZXRlY3Rvci5zdG9wKCk7CisgICAgICAgIC8vIFRoZXJlIGlzIG5vIHdheSB0byBzdG9wIHRoZSB0aHJlYWQsIGxldCdzIHRlc3QgaXQgY291bGQgYmUgc3RvcHBlZCwgYWZ0ZXIgZ2V0IGNvdW50cnkKKyAgICAgICAgZGV0ZWN0b3Iubm90aWZ5Q291bnRyeUZvdW5kKCk7CisgICAgICAgIC8vIFdhaXQgZm9yIHF1ZXJ5IHRocmVhZCBlbmRpbmcKKyAgICAgICAgd2FpdEZvclRocmVhZEVuZGluZyhxdWVyeVRocmVhZCk7CisgICAgICAgIC8vIFF1ZXJ5VGhyZWFkIHNob3VsZCBiZSBzZXQgdG8gTlVMTAorICAgICAgICBhc3NlcnROdWxsKGRldGVjdG9yLmdldFF1ZXJ5VGhyZWFkKCkpOworICAgICAgICBhc3NlcnRUcnVlKGNvdW50cnlMaXN0ZW5lci5ub3RpZmllZCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGNvdW50cnlMaXN0ZW5lci5nZXRDb3VudHJ5KCksIGNvdW50cnkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RGaW5kaW5nTG9jYXRpb25DYW5jZWxsZWQoKSB7CisgICAgICAgIGZpbmFsIFN0cmluZyBjb3VudHJ5ID0gInVzIjsKKyAgICAgICAgZmluYWwgU3RyaW5nIHByb3ZpZGVyID0gIkdvb2QiOworICAgICAgICBDb3VudHJ5TGlzdGVuZXJJbXBsIGNvdW50cnlMaXN0ZW5lciA9IG5ldyBDb3VudHJ5TGlzdGVuZXJJbXBsKCk7CisgICAgICAgIFRlc3RDb3VudHJ5RGV0ZWN0b3IgZGV0ZWN0b3IgPSBuZXcgVGVzdENvdW50cnlEZXRlY3Rvcihjb3VudHJ5LCBwcm92aWRlcik7CisgICAgICAgIGRldGVjdG9yLnNldENvdW50cnlMaXN0ZW5lcihjb3VudHJ5TGlzdGVuZXIpOworICAgICAgICBkZXRlY3Rvci5kZXRlY3RDb3VudHJ5KCk7CisgICAgICAgIGFzc2VydEVxdWFscyhkZXRlY3Rvci5nZXRMaXN0ZW5lcnNDb3VudCgpLCBUZXN0Q291bnRyeURldGVjdG9yLlRPVEFMX1BST1ZJREVSUyk7CisgICAgICAgIGRldGVjdG9yLnN0b3AoKTsKKyAgICAgICAgLy8gQWxsIGxpc3RlbmVycyBzaG91bGQgYmUgdW5yZWdpc3RlcmVkCisgICAgICAgIGFzc2VydEVxdWFscyhkZXRlY3Rvci5nZXRMaXN0ZW5lcnNDb3VudCgpLCAwKTsKKyAgICAgICAgLy8gVGhlIHRpbWUgc2hvdWxkIGJlIHN0b3BwZWQKKyAgICAgICAgYXNzZXJ0TnVsbChkZXRlY3Rvci5nZXRUaW1lcigpKTsKKyAgICAgICAgLy8gUXVlcnlUaHJlYWQgc2hvdWxkIHN0aWxsIGJlIE5VTEwKKyAgICAgICAgYXNzZXJ0TnVsbChkZXRlY3Rvci5nZXRRdWVyeVRocmVhZCgpKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UoY291bnRyeUxpc3RlbmVyLm5vdGlmaWVkKCkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RGaW5kaW5nTG9jYXRpb25GYWlsZWQoKSB7CisgICAgICAgIGZpbmFsIFN0cmluZyBjb3VudHJ5ID0gInVzIjsKKyAgICAgICAgZmluYWwgU3RyaW5nIHByb3ZpZGVyID0gIkdvb2QiOworICAgICAgICBsb25nIHRpbWVvdXQgPSAxMDAwOworICAgICAgICBUZXN0Q291bnRyeURldGVjdG9yIGRldGVjdG9yID0gbmV3IFRlc3RDb3VudHJ5RGV0ZWN0b3IoY291bnRyeSwgcHJvdmlkZXIsIHRpbWVvdXQpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHJvdGVjdGVkIExvY2F0aW9uIGdldExhc3RLbm93bkxvY2F0aW9uKCkgeworICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgfQorICAgICAgICB9OworICAgICAgICBDb3VudHJ5TGlzdGVuZXJJbXBsIGNvdW50cnlMaXN0ZW5lciA9IG5ldyBDb3VudHJ5TGlzdGVuZXJJbXBsKCk7CisgICAgICAgIGRldGVjdG9yLnNldENvdW50cnlMaXN0ZW5lcihjb3VudHJ5TGlzdGVuZXIpOworICAgICAgICBkZXRlY3Rvci5kZXRlY3RDb3VudHJ5KCk7CisgICAgICAgIGFzc2VydEVxdWFscyhkZXRlY3Rvci5nZXRMaXN0ZW5lcnNDb3VudCgpLCBUZXN0Q291bnRyeURldGVjdG9yLlRPVEFMX1BST1ZJREVSUyk7CisgICAgICAgIHdhaXRGb3JUaW1lclJlc2V0KGRldGVjdG9yKTsKKyAgICAgICAgLy8gQWxsIGxpc3RlbmVycyBzaG91bGQgYmUgdW5yZWdpc3RlcmVkCisgICAgICAgIGFzc2VydEVxdWFscyhkZXRlY3Rvci5nZXRMaXN0ZW5lcnNDb3VudCgpLCAwKTsKKyAgICAgICAgLy8gUXVlcnlUaHJlYWQgc2hvdWxkIHN0aWxsIGJlIE5VTEwKKyAgICAgICAgYXNzZXJ0TnVsbChkZXRlY3Rvci5nZXRRdWVyeVRocmVhZCgpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShjb3VudHJ5TGlzdGVuZXIubm90aWZpZWQoKSk7CisgICAgICAgIGFzc2VydE51bGwoY291bnRyeUxpc3RlbmVyLmdldENvdW50cnkoKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEZpbmRpbmdDb3VudHJ5RmFpbGVkKCkgeworICAgICAgICBmaW5hbCBTdHJpbmcgY291bnRyeSA9ICJ1cyI7CisgICAgICAgIGZpbmFsIFN0cmluZyBwcm92aWRlciA9ICJHb29kIjsKKyAgICAgICAgVGVzdENvdW50cnlEZXRlY3RvciBkZXRlY3RvciA9IG5ldyBUZXN0Q291bnRyeURldGVjdG9yKGNvdW50cnksIHByb3ZpZGVyKSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0Q291bnRyeUZyb21Mb2NhdGlvbihMb2NhdGlvbiBsb2NhdGlvbikgeworICAgICAgICAgICAgICAgIHN5bmNocm9uaXplZCAoY291bnRyeUZvdW5kTG9ja2VyKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICghIG5vdGlmeUNvdW50cnkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnRyeUZvdW5kTG9ja2VyLndhaXQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAvLyBXZSBkaWRuJ3QgZmluZCBjb3VudHJ5LgorICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgfQorICAgICAgICB9OworICAgICAgICBDb3VudHJ5TGlzdGVuZXJJbXBsIGNvdW50cnlMaXN0ZW5lciA9IG5ldyBDb3VudHJ5TGlzdGVuZXJJbXBsKCk7CisgICAgICAgIGRldGVjdG9yLnNldENvdW50cnlMaXN0ZW5lcihjb3VudHJ5TGlzdGVuZXIpOworICAgICAgICBkZXRlY3Rvci5kZXRlY3RDb3VudHJ5KCk7CisgICAgICAgIGFzc2VydEVxdWFscyhkZXRlY3Rvci5nZXRMaXN0ZW5lcnNDb3VudCgpLCBUZXN0Q291bnRyeURldGVjdG9yLlRPVEFMX1BST1ZJREVSUyk7CisgICAgICAgIGRldGVjdG9yLm5vdGlmeUxvY2F0aW9uRm91bmQoKTsKKyAgICAgICAgLy8gQWxsIGxpc3RlbmVycyBzaG91bGQgYmUgdW5yZWdpc3RlcmVkCisgICAgICAgIGFzc2VydEVxdWFscyhkZXRlY3Rvci5nZXRMaXN0ZW5lcnNDb3VudCgpLCAwKTsKKyAgICAgICAgYXNzZXJ0TnVsbChkZXRlY3Rvci5nZXRUaW1lcigpKTsKKyAgICAgICAgVGhyZWFkIHF1ZXJ5VGhyZWFkID0gd2FpdEZvclF1ZXJ5VGhyZWFkTGF1bmNoZWQoZGV0ZWN0b3IpOworICAgICAgICBkZXRlY3Rvci5ub3RpZnlDb3VudHJ5Rm91bmQoKTsKKyAgICAgICAgLy8gV2FpdCBmb3IgcXVlcnkgdGhyZWFkIGVuZGluZworICAgICAgICB3YWl0Rm9yVGhyZWFkRW5kaW5nKHF1ZXJ5VGhyZWFkKTsKKyAgICAgICAgLy8gUXVlcnlUaHJlYWQgc2hvdWxkIGJlIHNldCB0byBOVUxMCisgICAgICAgIGFzc2VydE51bGwoZGV0ZWN0b3IuZ2V0UXVlcnlUaHJlYWQoKSk7CisgICAgICAgIC8vIENvdW50cnlMaXN0ZW5lciBzaG91bGQgYmUgbm90aWZpZWQKKyAgICAgICAgYXNzZXJ0VHJ1ZShjb3VudHJ5TGlzdGVuZXIubm90aWZpZWQoKSk7CisgICAgICAgIGFzc2VydE51bGwoY291bnRyeUxpc3RlbmVyLmdldENvdW50cnkoKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEZpbmRpbmdDb3VudHJ5V2l0aExhc3RLbm93bkxvY2F0aW9uKCkgeworICAgICAgICBmaW5hbCBTdHJpbmcgY291bnRyeSA9ICJ1cyI7CisgICAgICAgIGZpbmFsIFN0cmluZyBwcm92aWRlciA9ICJHb29kIjsKKyAgICAgICAgbG9uZyB0aW1lb3V0ID0gMTAwMDsKKyAgICAgICAgVGVzdENvdW50cnlEZXRlY3RvciBkZXRlY3RvciA9IG5ldyBUZXN0Q291bnRyeURldGVjdG9yKGNvdW50cnksIHByb3ZpZGVyLCB0aW1lb3V0KTsKKyAgICAgICAgQ291bnRyeUxpc3RlbmVySW1wbCBjb3VudHJ5TGlzdGVuZXIgPSBuZXcgQ291bnRyeUxpc3RlbmVySW1wbCgpOworICAgICAgICBkZXRlY3Rvci5zZXRDb3VudHJ5TGlzdGVuZXIoY291bnRyeUxpc3RlbmVyKTsKKyAgICAgICAgZGV0ZWN0b3IuZGV0ZWN0Q291bnRyeSgpOworICAgICAgICBhc3NlcnRFcXVhbHMoZGV0ZWN0b3IuZ2V0TGlzdGVuZXJzQ291bnQoKSwgVGVzdENvdW50cnlEZXRlY3Rvci5UT1RBTF9QUk9WSURFUlMpOworICAgICAgICB3YWl0Rm9yVGltZXJSZXNldChkZXRlY3Rvcik7CisgICAgICAgIC8vIEFsbCBsaXN0ZW5lcnMgc2hvdWxkIGJlIHVucmVnaXN0ZXJlZAorICAgICAgICBhc3NlcnRFcXVhbHMoZGV0ZWN0b3IuZ2V0TGlzdGVuZXJzQ291bnQoKSwgMCk7CisgICAgICAgIFRocmVhZCBxdWVyeVRocmVhZCA9IHdhaXRGb3JRdWVyeVRocmVhZExhdW5jaGVkKGRldGVjdG9yKTsKKyAgICAgICAgZGV0ZWN0b3Iubm90aWZ5Q291bnRyeUZvdW5kKCk7CisgICAgICAgIC8vIFdhaXQgZm9yIHF1ZXJ5IHRocmVhZCBlbmRpbmcKKyAgICAgICAgd2FpdEZvclRocmVhZEVuZGluZyhxdWVyeVRocmVhZCk7CisgICAgICAgIC8vIFF1ZXJ5VGhyZWFkIHNob3VsZCBiZSBzZXQgdG8gTlVMTAorICAgICAgICBhc3NlcnROdWxsKGRldGVjdG9yLmdldFF1ZXJ5VGhyZWFkKCkpOworICAgICAgICAvLyBDb3VudHJ5TGlzdGVuZXIgc2hvdWxkIGJlIG5vdGlmaWVkCisgICAgICAgIGFzc2VydFRydWUoY291bnRyeUxpc3RlbmVyLm5vdGlmaWVkKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoY291bnRyeUxpc3RlbmVyLmdldENvdW50cnkoKSwgY291bnRyeSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHdhaXRGb3JUaW1lclJlc2V0KFRlc3RDb3VudHJ5RGV0ZWN0b3IgZGV0ZWN0b3IpIHsKKyAgICAgICAgaW50IGNvdW50ID0gNTsKKyAgICAgICAgbG9uZyBpbnRlcnZhbCA9IDEwMDA7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICB3aGlsZSAoY291bnQtLSA+IDAgJiYgZGV0ZWN0b3IuZ2V0VGltZXIoKSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgVGhyZWFkLnNsZWVwKGludGVydmFsKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgeworICAgICAgICB9CisgICAgICAgIFRpbWVyIHRpbWVyID0gZGV0ZWN0b3IuZ2V0VGltZXIoKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSh0aW1lciA9PSBudWxsKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgd2FpdEZvclRocmVhZEVuZGluZyhUaHJlYWQgdGhyZWFkKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICB0aHJlYWQuam9pbig1MDAwKTsKKyAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgVGhyZWFkIHdhaXRGb3JRdWVyeVRocmVhZExhdW5jaGVkKFRlc3RDb3VudHJ5RGV0ZWN0b3IgZGV0ZWN0b3IpIHsKKyAgICAgICAgaW50IGNvdW50ID0gNTsKKyAgICAgICAgbG9uZyBpbnRlcnZhbCA9IDEwMDA7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICB3aGlsZSAoY291bnQtLSA+IDAgJiYgZGV0ZWN0b3IuZ2V0UXVlcnlUaHJlYWQoKSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgVGhyZWFkLnNsZWVwKGludGVydmFsKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgeworICAgICAgICB9CisgICAgICAgIFRocmVhZCB0aHJlYWQgPSBkZXRlY3Rvci5nZXRRdWVyeVRocmVhZCgpOworICAgICAgICBhc3NlcnRUcnVlKHRocmVhZCAhPSBudWxsKTsKKyAgICAgICAgcmV0dXJuIHRocmVhZDsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZWxlcGhvbnkvamF2YS9hbmRyb2lkL3RlbGVwaG9ueS9QaG9uZU51bWJlckZvcm1hdHRpbmdUZXh0V2F0Y2hlci5qYXZhIGIvdGVsZXBob255L2phdmEvYW5kcm9pZC90ZWxlcGhvbnkvUGhvbmVOdW1iZXJGb3JtYXR0aW5nVGV4dFdhdGNoZXIuamF2YQppbmRleCA4YTQ3MzM5Li5mZmFiYjdiIDEwMDY0NAotLS0gYS90ZWxlcGhvbnkvamF2YS9hbmRyb2lkL3RlbGVwaG9ueS9QaG9uZU51bWJlckZvcm1hdHRpbmdUZXh0V2F0Y2hlci5qYXZhCisrKyBiL3RlbGVwaG9ueS9qYXZhL2FuZHJvaWQvdGVsZXBob255L1Bob25lTnVtYmVyRm9ybWF0dGluZ1RleHRXYXRjaGVyLmphdmEKQEAgLTE2LDgzICsxNiwyMDAgQEAKIAogcGFja2FnZSBhbmRyb2lkLnRlbGVwaG9ueTsKIAoraW1wb3J0IGNvbS5nb29nbGUuaTE4bi5waG9uZW51bWJlcnMuQXNZb3VUeXBlRm9ybWF0dGVyOworaW1wb3J0IGNvbS5nb29nbGUuaTE4bi5waG9uZW51bWJlcnMuUGhvbmVOdW1iZXJVdGlsOworCitpbXBvcnQgYW5kcm9pZC50ZWxlcGhvbnkuUGhvbmVOdW1iZXJVdGlsczsKIGltcG9ydCBhbmRyb2lkLnRleHQuRWRpdGFibGU7CiBpbXBvcnQgYW5kcm9pZC50ZXh0LlNlbGVjdGlvbjsKIGltcG9ydCBhbmRyb2lkLnRleHQuVGV4dFdhdGNoZXI7Ci1pbXBvcnQgYW5kcm9pZC53aWRnZXQuVGV4dFZpZXc7CiAKIGltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOwogCiAvKioKLSAqIFdhdGNoZXMgYSB7QGxpbmsgVGV4dFZpZXd9IGFuZCBpZiBhIHBob25lIG51bWJlciBpcyBlbnRlcmVkIHdpbGwgZm9ybWF0IGl0IHVzaW5nCi0gKiB7QGxpbmsgUGhvbmVOdW1iZXJVdGlscyNmb3JtYXROdW1iZXIoRWRpdGFibGUsIGludCl9LiBUaGUgZm9ybWF0dGluZyBpcyBiYXNlZCBvbgotICogdGhlIGN1cnJlbnQgc3lzdGVtIGxvY2FsZSB3aGVuIHRoaXMgb2JqZWN0IGlzIGNyZWF0ZWQgYW5kIGZ1dHVyZSBsb2NhbGUgY2hhbmdlcwotICogbWF5IG5vdCB0YWtlIGVmZmVjdCBvbiB0aGlzIGluc3RhbmNlLgorICogV2F0Y2hlcyBhIHtAbGluayBhbmRyb2lkLndpZGdldC5UZXh0Vmlld30gYW5kIGlmIGEgcGhvbmUgbnVtYmVyIGlzIGVudGVyZWQKKyAqIHdpbGwgZm9ybWF0IGl0LgorICogPHA+CisgKiBTdG9wIGZvcm1hdHRpbmcgd2hlbiB0aGUgdXNlcgorICogPHVsPgorICogPGxpPklucHV0cyBub24tZGlhbGFibGUgY2hhcmFjdGVyczwvbGk+CisgKiA8bGk+UmVtb3ZlcyB0aGUgc2VwYXJhdG9yIGluIHRoZSBtaWRkbGUgb2Ygc3RyaW5nLjwvbGk+CisgKiA8L3VsPgorICogPHA+CisgKiBUaGUgZm9ybWF0dGluZyB3aWxsIGJlIHJlc3RhcnRlZCBvbmNlIHRoZSB0ZXh0IGlzIGNsZWFyZWQuCiAgKi8KIHB1YmxpYyBjbGFzcyBQaG9uZU51bWJlckZvcm1hdHRpbmdUZXh0V2F0Y2hlciBpbXBsZW1lbnRzIFRleHRXYXRjaGVyIHsKKyAgICAvKioKKyAgICAgKiBPbmUgb3IgbW9yZSBjaGFyYWN0ZXJzIHdlcmUgcmVtb3ZlZCBmcm9tIHRoZSBlbmQuCisgICAgICovCisgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgaW50IFNUQVRFX1JFTU9WRV9MQVNUID0gMDsKIAotICAgIHN0YXRpYyBwcml2YXRlIGludCBzRm9ybWF0VHlwZTsKLSAgICBzdGF0aWMgcHJpdmF0ZSBMb2NhbGUgc0NhY2hlZExvY2FsZTsKLSAgICBwcml2YXRlIGJvb2xlYW4gbUZvcm1hdHRpbmc7Ci0gICAgcHJpdmF0ZSBib29sZWFuIG1EZWxldGluZ0h5cGhlbjsKLSAgICBwcml2YXRlIGludCBtSHlwaGVuU3RhcnQ7Ci0gICAgcHJpdmF0ZSBib29sZWFuIG1EZWxldGluZ0JhY2t3YXJkOworICAgIC8qKgorICAgICAqIE9uZSBvciBtb3JlIGNoYXJhY3RlcnMgd2VyZSBhcHBlbmRlZC4KKyAgICAgKi8KKyAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBpbnQgU1RBVEVfQVBQRU5EID0gMTsKIAorICAgIC8qKgorICAgICAqIE9uZSBvciBtb3JlIGRpZ2l0cyB3ZXJlIGNoYW5nZWQgaW4gdGhlIGJlZ2lubmluZyBvciB0aGUgbWlkZGxlIG9mIHRleHQuCisgICAgICovCisgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgaW50IFNUQVRFX01PRElGWV9ESUdJVFMgPSAyOworCisgICAgLyoqCisgICAgICogVGhlIGNoYW5nZXMgb3RoZXIgdGhhbiB0aGUgYWJvdmUuCisgICAgICovCisgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgaW50IFNUQVRFX09USEVSID0gMzsKKworICAgIC8qKgorICAgICAqIFRoZSBzdGF0ZSBvZiB0aGlzIGNoYW5nZSBjb3VsZCBiZSBvbmUgdmFsdWUgb2YgdGhlIGFib3ZlCisgICAgICovCisgICAgcHJpdmF0ZSBpbnQgbVN0YXRlOworCisgICAgLyoqCisgICAgICogSW5kaWNhdGVzIHRoZSBjaGFuZ2Ugd2FzIGNhdXNlZCBieSBvdXJzZWx2ZXMuCisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIG1TZWxmQ2hhbmdlID0gZmFsc2U7CisKKyAgICAvKioKKyAgICAgKiBJbmRpY2F0ZXMgdGhlIGZvcm1hdHRpbmcgaGFzIGJlZW4gc3RvcHBlZC4KKyAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gbVN0b3BGb3JtYXR0aW5nOworCisgICAgcHJpdmF0ZSBBc1lvdVR5cGVGb3JtYXR0ZXIgbUZvcm1hdHRlcjsKKworICAgIC8qKgorICAgICAqIFRoZSBmb3JtYXR0aW5nIGlzIGJhc2VkIG9uIHRoZSBjdXJyZW50IHN5c3RlbSBsb2NhbGUgYW5kIGZ1dHVyZSBsb2NhbGUgY2hhbmdlcworICAgICAqIG1heSBub3QgdGFrZSBlZmZlY3Qgb24gdGhpcyBpbnN0YW5jZS4KKyAgICAgKi8KICAgICBwdWJsaWMgUGhvbmVOdW1iZXJGb3JtYXR0aW5nVGV4dFdhdGNoZXIoKSB7Ci0gICAgICAgIGlmIChzQ2FjaGVkTG9jYWxlID09IG51bGwgfHwgc0NhY2hlZExvY2FsZSAhPSBMb2NhbGUuZ2V0RGVmYXVsdCgpKSB7Ci0gICAgICAgICAgICBzQ2FjaGVkTG9jYWxlID0gTG9jYWxlLmdldERlZmF1bHQoKTsKLSAgICAgICAgICAgIHNGb3JtYXRUeXBlID0gUGhvbmVOdW1iZXJVdGlscy5nZXRGb3JtYXRUeXBlRm9yTG9jYWxlKHNDYWNoZWRMb2NhbGUpOwotICAgICAgICB9CisgICAgICAgIHRoaXMoTG9jYWxlLmdldERlZmF1bHQoKS5nZXRDb3VudHJ5KCkpOwogICAgIH0KIAotICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBhZnRlclRleHRDaGFuZ2VkKEVkaXRhYmxlIHRleHQpIHsKLSAgICAgICAgLy8gTWFrZSBzdXJlIHRvIGlnbm9yZSBjYWxscyB0byBhZnRlclRleHRDaGFuZ2VkIGNhdXNlZCBieSB0aGUgd29yayBkb25lIGJlbG93Ci0gICAgICAgIGlmICghbUZvcm1hdHRpbmcpIHsKLSAgICAgICAgICAgIG1Gb3JtYXR0aW5nID0gdHJ1ZTsKLQotICAgICAgICAgICAgLy8gSWYgZGVsZXRpbmcgdGhlIGh5cGhlbiwgYWxzbyBkZWxldGUgdGhlIGNoYXIgYmVmb3JlIG9yIGFmdGVyIHRoYXQKLSAgICAgICAgICAgIGlmIChtRGVsZXRpbmdIeXBoZW4gJiYgbUh5cGhlblN0YXJ0ID4gMCkgewotICAgICAgICAgICAgICAgIGlmIChtRGVsZXRpbmdCYWNrd2FyZCkgewotICAgICAgICAgICAgICAgICAgICBpZiAobUh5cGhlblN0YXJ0IC0gMSA8IHRleHQubGVuZ3RoKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRleHQuZGVsZXRlKG1IeXBoZW5TdGFydCAtIDEsIG1IeXBoZW5TdGFydCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG1IeXBoZW5TdGFydCA8IHRleHQubGVuZ3RoKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgdGV4dC5kZWxldGUobUh5cGhlblN0YXJ0LCBtSHlwaGVuU3RhcnQgKyAxKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuZm9ybWF0TnVtYmVyKHRleHQsIHNGb3JtYXRUeXBlKTsKLQotICAgICAgICAgICAgbUZvcm1hdHRpbmcgPSBmYWxzZTsKLSAgICAgICAgfQorICAgIC8qKgorICAgICAqIFRoZSBmb3JtYXR0aW5nIGlzIGJhc2VkIG9uIHRoZSBnaXZlbiA8Y29kZT5jb3VudHJ5Q29kZTwvY29kZT4uCisgICAgICoKKyAgICAgKiBAcGFyYW0gY291bnRyeUNvZGUgdGhlIElTTyAzMTY2LTEgdHdvLWxldHRlciBjb3VudHJ5IGNvZGUgdGhhdCBpbmRpY2F0ZXMgdGhlIGNvdW50cnkvcmVnaW9uCisgICAgICogd2hlcmUgdGhlIHBob25lIG51bWJlciBpcyBiZWluZyBlbnRlcmVkLgorICAgICAqCisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgUGhvbmVOdW1iZXJGb3JtYXR0aW5nVGV4dFdhdGNoZXIoU3RyaW5nIGNvdW50cnlDb2RlKSB7CisgICAgICAgIGlmIChjb3VudHJ5Q29kZSA9PSBudWxsKSB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7CisgICAgICAgIG1Gb3JtYXR0ZXIgPSBQaG9uZU51bWJlclV0aWwuZ2V0SW5zdGFuY2UoKS5nZXRBc1lvdVR5cGVGb3JtYXR0ZXIoY291bnRyeUNvZGUpOwogICAgIH0KIAotICAgIHB1YmxpYyB2b2lkIGJlZm9yZVRleHRDaGFuZ2VkKENoYXJTZXF1ZW5jZSBzLCBpbnQgc3RhcnQsIGludCBjb3VudCwgaW50IGFmdGVyKSB7Ci0gICAgICAgIC8vIENoZWNrIGlmIHRoZSB1c2VyIGlzIGRlbGV0aW5nIGEgaHlwaGVuCi0gICAgICAgIGlmICghbUZvcm1hdHRpbmcpIHsKLSAgICAgICAgICAgIC8vIE1ha2Ugc3VyZSB1c2VyIGlzIGRlbGV0aW5nIG9uZSBjaGFyLCB3aXRob3V0IGEgc2VsZWN0aW9uCi0gICAgICAgICAgICBmaW5hbCBpbnQgc2VsU3RhcnQgPSBTZWxlY3Rpb24uZ2V0U2VsZWN0aW9uU3RhcnQocyk7Ci0gICAgICAgICAgICBmaW5hbCBpbnQgc2VsRW5kID0gU2VsZWN0aW9uLmdldFNlbGVjdGlvbkVuZChzKTsKLSAgICAgICAgICAgIGlmIChzLmxlbmd0aCgpID4gMSAvLyBDYW4gZGVsZXRlIGFub3RoZXIgY2hhcmFjdGVyCi0gICAgICAgICAgICAgICAgICAgICYmIGNvdW50ID09IDEgLy8gRGVsZXRpbmcgb25seSBvbmUgY2hhcmFjdGVyCi0gICAgICAgICAgICAgICAgICAgICYmIGFmdGVyID09IDAgLy8gRGVsZXRpbmcKLSAgICAgICAgICAgICAgICAgICAgJiYgcy5jaGFyQXQoc3RhcnQpID09ICctJyAvLyBhIGh5cGhlbgotICAgICAgICAgICAgICAgICAgICAmJiBzZWxTdGFydCA9PSBzZWxFbmQpIHsgLy8gbm8gc2VsZWN0aW9uCi0gICAgICAgICAgICAgICAgbURlbGV0aW5nSHlwaGVuID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBtSHlwaGVuU3RhcnQgPSBzdGFydDsKLSAgICAgICAgICAgICAgICAvLyBDaGVjayBpZiB0aGUgdXNlciBpcyBkZWxldGluZyBmb3J3YXJkIG9yIGJhY2t3YXJkCi0gICAgICAgICAgICAgICAgaWYgKHNlbFN0YXJ0ID09IHN0YXJ0ICsgMSkgewotICAgICAgICAgICAgICAgICAgICBtRGVsZXRpbmdCYWNrd2FyZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgbURlbGV0aW5nQmFja3dhcmQgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIG1EZWxldGluZ0h5cGhlbiA9IGZhbHNlOwotICAgICAgICAgICAgfQorICAgIHB1YmxpYyB2b2lkIGJlZm9yZVRleHRDaGFuZ2VkKENoYXJTZXF1ZW5jZSBzLCBpbnQgc3RhcnQsIGludCBjb3VudCwKKyAgICAgICAgICAgIGludCBhZnRlcikgeworICAgICAgICBpZiAobVNlbGZDaGFuZ2UgfHwgbVN0b3BGb3JtYXR0aW5nKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgaWYgKGNvdW50ID09IDAgJiYgcy5sZW5ndGgoKSA9PSBzdGFydCkgeworICAgICAgICAgICAgLy8gQXBwZW5kIG9uZSBvciBtb3JlIG5ldyBjaGFycworICAgICAgICAgICAgbVN0YXRlID0gU1RBVEVfQVBQRU5EOworICAgICAgICB9IGVsc2UgaWYgKGFmdGVyID09IDAgJiYgc3RhcnQgKyBjb3VudCA9PSBzLmxlbmd0aCgpICYmIGNvdW50ID4gMCkgeworICAgICAgICAgICAgLy8gUmVtb3ZlIG9uZSBvciBtb3JlIGNoYXJzIGZyb20gdGhlIGVuZCBvZiBzdHJpbmcuCisgICAgICAgICAgICBtU3RhdGUgPSBTVEFURV9SRU1PVkVfTEFTVDsKKyAgICAgICAgfSBlbHNlIGlmIChjb3VudCA+IDAgJiYgIWhhc1NlcGFyYXRvcihzLCBzdGFydCwgY291bnQpKSB7CisgICAgICAgICAgICAvLyBSZW1vdmUgdGhlIGRpYWxhYmxlIGNoYXJzIGluIHRoZSBiZWdpbiBvciBtaWRkbGUgb2YgdGV4dC4KKyAgICAgICAgICAgIG1TdGF0ZSA9IFNUQVRFX01PRElGWV9ESUdJVFM7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtU3RhdGUgPSBTVEFURV9PVEhFUjsKICAgICAgICAgfQogICAgIH0KIAogICAgIHB1YmxpYyB2b2lkIG9uVGV4dENoYW5nZWQoQ2hhclNlcXVlbmNlIHMsIGludCBzdGFydCwgaW50IGJlZm9yZSwgaW50IGNvdW50KSB7Ci0gICAgICAgIC8vIERvZXMgbm90aGluZworICAgICAgICBpZiAobVNlbGZDaGFuZ2UgfHwgbVN0b3BGb3JtYXR0aW5nKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1TdGF0ZSA9PSBTVEFURV9PVEhFUikgeworICAgICAgICAgICAgaWYgKGNvdW50ID4gMCAmJiAhaGFzU2VwYXJhdG9yKHMsIHN0YXJ0LCBjb3VudCkpIHsKKyAgICAgICAgICAgICAgICAvLyBVc2VyIGluc2VydGVkIHRoZSBkaWFsYWJsZSBjaGFyYWN0ZXJzIGluIHRoZSBtaWRkbGUgb2YgdGV4dC4KKyAgICAgICAgICAgICAgICBtU3RhdGUgPSBTVEFURV9NT0RJRllfRElHSVRTOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8vIENoZWNrIHdoZXRoZXIgd2Ugc2hvdWxkIHN0b3AgZm9ybWF0dGluZy4KKyAgICAgICAgaWYgKG1TdGF0ZSA9PSBTVEFURV9BUFBFTkQgJiYgY291bnQgPiAwICYmIGhhc1NlcGFyYXRvcihzLCBzdGFydCwgY291bnQpKSB7CisgICAgICAgICAgICAvLyBVc2VyIGFwcGVuZGVkIHRoZSBub24tZGlhbGFibGUgY2hhcmFjdGVyLCBzdG9wIGZvcm1hdHRpbmcuCisgICAgICAgICAgICBzdG9wRm9ybWF0dGluZygpOworICAgICAgICB9IGVsc2UgaWYgKG1TdGF0ZSA9PSBTVEFURV9PVEhFUikgeworICAgICAgICAgICAgLy8gVXNlciBtdXN0IGluc2VydCBvciByZW1vdmUgdGhlIG5vbi1kaWFsYWJsZSBjaGFyYWN0ZXJzIGluIHRoZSBiZWdpbiBvciBtaWRkbGUgb2YKKyAgICAgICAgICAgIC8vIG51bWJlciwgc3RvcCBmb3JtYXR0aW5nLgorICAgICAgICAgICAgc3RvcEZvcm1hdHRpbmcoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBhZnRlclRleHRDaGFuZ2VkKEVkaXRhYmxlIHMpIHsKKyAgICAgICAgaWYgKG1TdG9wRm9ybWF0dGluZykgeworICAgICAgICAgICAgLy8gUmVzdGFydCB0aGUgZm9ybWF0dGluZyB3aGVuIGFsbCB0ZXh0cyB3ZXJlIGNsZWFyLgorICAgICAgICAgICAgbVN0b3BGb3JtYXR0aW5nID0gIShzLmxlbmd0aCgpID09IDApOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGlmIChtU2VsZkNoYW5nZSkgeworICAgICAgICAgICAgLy8gSWdub3JlIHRoZSBjaGFuZ2UgY2F1c2VkIGJ5IHMucmVwbGFjZSgpLgorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIFN0cmluZyBmb3JtYXR0ZWQgPSByZWZvcm1hdChzLCBTZWxlY3Rpb24uZ2V0U2VsZWN0aW9uRW5kKHMpKTsKKyAgICAgICAgaWYgKGZvcm1hdHRlZCAhPSBudWxsKSB7CisgICAgICAgICAgICBpbnQgcmVtZW1iZXJlZFBvcyA9IG1Gb3JtYXR0ZXIuZ2V0UmVtZW1iZXJlZFBvc2l0aW9uKCk7CisgICAgICAgICAgICBtU2VsZkNoYW5nZSA9IHRydWU7CisgICAgICAgICAgICBzLnJlcGxhY2UoMCwgcy5sZW5ndGgoKSwgZm9ybWF0dGVkLCAwLCBmb3JtYXR0ZWQubGVuZ3RoKCkpOworICAgICAgICAgICAgLy8gVGhlIHRleHQgY291bGQgYmUgY2hhbmdlZCBieSBvdGhlciBUZXh0V2F0Y2hlciBhZnRlciB3ZSBjaGFuZ2VkIGl0LiBJZiB3ZSBmb3VuZCB0aGUKKyAgICAgICAgICAgIC8vIHRleHQgaXMgbm90IHRoZSBvbmUgd2Ugd2VyZSBleHBlY3RpbmcsIGp1c3QgZ2l2ZSB1cCBjYWxsaW5nIHNldFNlbGVjdGlvbigpLgorICAgICAgICAgICAgaWYgKGZvcm1hdHRlZC5lcXVhbHMocy50b1N0cmluZygpKSkgeworICAgICAgICAgICAgICAgIFNlbGVjdGlvbi5zZXRTZWxlY3Rpb24ocywgcmVtZW1iZXJlZFBvcyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtU2VsZkNoYW5nZSA9IGZhbHNlOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogR2VuZXJhdGUgdGhlIGZvcm1hdHRlZCBudW1iZXIgYnkgaWdub3JpbmcgYWxsIG5vbi1kaWFsYWJsZSBjaGFycyBhbmQgc3RpY2sgdGhlIGN1cnNvciB0byB0aGUKKyAgICAgKiBuZWFyZXN0IGRpYWxhYmxlIGNoYXIgdG8gdGhlIGxlZnQuIEZvciBpbnN0YW5jZSwgaWYgdGhlIG51bWJlciBpcyAgKDY1MCkgMTIzLTQ1Njc4IGFuZCAnNCcgaXMKKyAgICAgKiByZW1vdmVkIHRoZW4gdGhlIGN1cnNvciBzaG91bGQgYmUgYmVoaW5kICczJyBpbnN0ZWFkIG9mICctJy4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyByZWZvcm1hdChDaGFyU2VxdWVuY2UgcywgaW50IGN1cnNvcikgeworICAgICAgICAvLyBUaGUgaW5kZXggb2YgY2hhciB0byB0aGUgbGVmdHdhcmQgb2YgdGhlIGN1cnNvci4KKyAgICAgICAgaW50IGN1ckluZGV4ID0gY3Vyc29yIC0gMTsKKyAgICAgICAgU3RyaW5nIGZvcm1hdHRlZCA9IG51bGw7CisgICAgICAgIG1Gb3JtYXR0ZXIuY2xlYXIoKTsKKyAgICAgICAgY2hhciBsYXN0Tm9uU2VwYXJhdG9yID0gMDsKKyAgICAgICAgYm9vbGVhbiBoYXNDdXJzb3IgPSBmYWxzZTsKKyAgICAgICAgaW50IGxlbiA9IHMubGVuZ3RoKCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKKyAgICAgICAgICAgIGNoYXIgYyA9IHMuY2hhckF0KGkpOworICAgICAgICAgICAgaWYgKFBob25lTnVtYmVyVXRpbHMuaXNOb25TZXBhcmF0b3IoYykpIHsKKyAgICAgICAgICAgICAgICBpZiAobGFzdE5vblNlcGFyYXRvciAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgIGZvcm1hdHRlZCA9IGdldEZvcm1hdHRlZE51bWJlcihsYXN0Tm9uU2VwYXJhdG9yLCBoYXNDdXJzb3IpOworICAgICAgICAgICAgICAgICAgICBoYXNDdXJzb3IgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbGFzdE5vblNlcGFyYXRvciA9IGM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoaSA9PSBjdXJJbmRleCkgeworICAgICAgICAgICAgICAgIGhhc0N1cnNvciA9IHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKGxhc3ROb25TZXBhcmF0b3IgIT0gMCkgeworICAgICAgICAgICAgZm9ybWF0dGVkID0gZ2V0Rm9ybWF0dGVkTnVtYmVyKGxhc3ROb25TZXBhcmF0b3IsIGhhc0N1cnNvcik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZvcm1hdHRlZDsKKyAgICB9CisKKyAgICBwcml2YXRlIFN0cmluZyBnZXRGb3JtYXR0ZWROdW1iZXIoY2hhciBsYXN0Tm9uU2VwYXJhdG9yLCBib29sZWFuIGhhc0N1cnNvcikgeworICAgICAgICByZXR1cm4gaGFzQ3Vyc29yID8gbUZvcm1hdHRlci5pbnB1dERpZ2l0QW5kUmVtZW1iZXJQb3NpdGlvbihsYXN0Tm9uU2VwYXJhdG9yKQorICAgICAgICAgICAgICAgIDogbUZvcm1hdHRlci5pbnB1dERpZ2l0KGxhc3ROb25TZXBhcmF0b3IpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBzdG9wRm9ybWF0dGluZygpIHsKKyAgICAgICAgbVN0b3BGb3JtYXR0aW5nID0gdHJ1ZTsKKyAgICAgICAgbUZvcm1hdHRlci5jbGVhcigpOworICAgIH0KKworICAgIHByaXZhdGUgYm9vbGVhbiBoYXNTZXBhcmF0b3IoZmluYWwgQ2hhclNlcXVlbmNlIHMsIGZpbmFsIGludCBzdGFydCwgZmluYWwgaW50IGNvdW50KSB7CisgICAgICAgIGZvciAoaW50IGkgPSBzdGFydDsgaSA8IHN0YXJ0ICsgY291bnQ7IGkrKykgeworICAgICAgICAgICAgY2hhciBjID0gcy5jaGFyQXQoaSk7CisgICAgICAgICAgICBpZiAoIVBob25lTnVtYmVyVXRpbHMuaXNOb25TZXBhcmF0b3IoYykpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvdGVsZXBob255L2phdmEvYW5kcm9pZC90ZWxlcGhvbnkvUGhvbmVOdW1iZXJVdGlscy5qYXZhIGIvdGVsZXBob255L2phdmEvYW5kcm9pZC90ZWxlcGhvbnkvUGhvbmVOdW1iZXJVdGlscy5qYXZhCmluZGV4IGRkZmM1MjAuLmUzNzczM2MgMTAwNjQ0Ci0tLSBhL3RlbGVwaG9ueS9qYXZhL2FuZHJvaWQvdGVsZXBob255L1Bob25lTnVtYmVyVXRpbHMuamF2YQorKysgYi90ZWxlcGhvbnkvamF2YS9hbmRyb2lkL3RlbGVwaG9ueS9QaG9uZU51bWJlclV0aWxzLmphdmEKQEAgLTE2LDYgKzE2LDExIEBACiAKIHBhY2thZ2UgYW5kcm9pZC50ZWxlcGhvbnk7CiAKK2ltcG9ydCBjb20uZ29vZ2xlLmkxOG4ucGhvbmVudW1iZXJzLk51bWJlclBhcnNlRXhjZXB0aW9uOworaW1wb3J0IGNvbS5nb29nbGUuaTE4bi5waG9uZW51bWJlcnMuUGhvbmVOdW1iZXJVdGlsOworaW1wb3J0IGNvbS5nb29nbGUuaTE4bi5waG9uZW51bWJlcnMuUGhvbmVOdW1iZXJVdGlsLlBob25lTnVtYmVyRm9ybWF0OworaW1wb3J0IGNvbS5nb29nbGUuaTE4bi5waG9uZW51bWJlcnMuUGhvbmVudW1iZXIuUGhvbmVOdW1iZXI7CisKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OwogaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2UuQ3Vyc29yOwpAQCAtNjE3LDcgKzYyMiw3IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAvLyBJbiB0aGUgVVMsIDEtNjUwLTU1NS0xMjM0IG11c3QgYmUgZXF1YWwgdG8gNjUwLTU1NS0xMjM0LAotICAgICAgICAgICAgLy8gd2hpbGUgMDkwLTEyMzQtMTIzNCBtdXN0IG5vdCBiZSBlcXVhbHQgdG8gOTAtMTIzNC0xMjM0IGluIEphcGFuLgorICAgICAgICAgICAgLy8gd2hpbGUgMDkwLTEyMzQtMTIzNCBtdXN0IG5vdCBiZSBlcXVhbCB0byA5MC0xMjM0LTEyMzQgaW4gSmFwYW4uCiAgICAgICAgICAgICAvLyBUaGlzIHJlcXVlc3QgZXhpc3RzIGp1c3QgaW4gVVMgKHdpdGggMSB0cnVuayAoTkREKSBwcmVmaXgpLgogICAgICAgICAgICAgLy8gSW4gYWRkaXRpb24sICIwMTEgMTEgNzAwNTU1NDE0MSIgbXVzdCBub3QgZXF1YWwgdG8gIisxNzAwNTU1NDE0MSIsCiAgICAgICAgICAgICAvLyB3aGlsZSAiMDExIDEgNzAwNTU1NDE0MSIgbXVzdCBlcXVhbCB0byAiKzE3MDA1NTU0MTQxIgpAQCAtNzc5LDEwICs3ODQsMTAgQEAKICAgICAgICAgaWYgKHByZXBlbmRQbHVzKSB7CiAgICAgICAgICAgICAvLyBUaGlzIGlzIGFuICJpbnRlcm5hdGlvbmFsIG51bWJlciIgYW5kIHNob3VsZCBoYXZlCiAgICAgICAgICAgICAvLyBhIHBsdXMgcHJlcGVuZGVkIHRvIHRoZSBkaWFsaW5nIG51bWJlci4gQnV0IHRoZXJlCi0gICAgICAgICAgICAvLyBjYW4gYWxzbyBiZSBHc20gTU1JIGNvZGVzIGFzIGRlZmluZWQgaW4gVFMgMjIuMDMwIDYuNS4yCisgICAgICAgICAgICAvLyBjYW4gYWxzbyBiZSBHU00gTU1JIGNvZGVzIGFzIGRlZmluZWQgaW4gVFMgMjIuMDMwIDYuNS4yCiAgICAgICAgICAgICAvLyBzbyB3ZSBuZWVkIHRvIGhhbmRsZSB0aG9zZSBhbHNvLgogICAgICAgICAgICAgLy8KLSAgICAgICAgICAgIC8vIGh0dHA6Ly93ZWIudGVsaWEuY29tL351NDc5MDQ3NzYvZ3Nta29kZS5odG0gaXMgYQorICAgICAgICAgICAgLy8gaHR0cDovL3dlYi50ZWxpYS5jb20vfnU0NzkwNDc3Ni9nc21rb2RlLmh0bQogICAgICAgICAgICAgLy8gaGFzIGEgbmljZSBsaXN0IG9mIHNvbWUgb2YgdGhlc2UgR1NNIGNvZGVzLgogICAgICAgICAgICAgLy8KICAgICAgICAgICAgIC8vIEV4YW1wbGVzIGFyZToKQEAgLTg3MCwxMCArODc1LDEwIEBACiAKICAgICAgICAgICAgIC8vIEZJWE1FKG1rZikgVFMgMjMuMDQwIDkuMS4yLjMgc2F5cwogICAgICAgICAgICAgLy8gImlmIGEgbW9iaWxlIHJlY2VpdmVzIDExMTEgaW4gYSBwb3NpdGlvbiBwcmlvciB0bwotICAgICAgICAgICAgLy8gdGhlIGxhc3Qgc2VtaS1vY3RldCB0aGVuIHByb2Nlc3Npbmcgc2hhbGwgY29tbWVuc2Ugd2l0aAorICAgICAgICAgICAgLy8gdGhlIGxhc3Qgc2VtaS1vY3RldCB0aGVuIHByb2Nlc3Npbmcgc2hhbGwgY29tbWVuY2Ugd2l0aAogICAgICAgICAgICAgLy8gdGhlIG5leHQgc2VtaS1vY3RldCBhbmQgdGhlIGludGVydmVuaW5nCiAgICAgICAgICAgICAvLyBzZW1pLW9jdGV0IHNoYWxsIGJlIGlnbm9yZWQiCi0gICAgICAgICAgICAvLyBIb3cgZG9lcyB0aGlzIGppdmUgd2l0aCAyNCwwMDggMTAuNS40LjcKKyAgICAgICAgICAgIC8vIEhvdyBkb2VzIHRoaXMgaml2ZSB3aXRoIDI0LjAwOCAxMC41LjQuNwogCiAgICAgICAgICAgICBiID0gKGJ5dGUpKChieXRlc1tpXSA+PiA0KSAmIDB4Zik7CiAKQEAgLTEwMDQsNyArMTAwOSw3IEBACiAgICAgICogQ29udmVydCBhIGRpYWxpbmcgbnVtYmVyIHRvIEJDRCBieXRlIGFycmF5CiAgICAgICoKICAgICAgKiBAcGFyYW0gbnVtYmVyIGRpYWxpbmcgbnVtYmVyIHN0cmluZwotICAgICAqICAgICAgICBpZiB0aGUgZGlhbGluZyBudW1iZXIgc3RhcnRzIHdpdGggJysnLCBzZXQgdG8gaW50ZXJuYXRpb25sIFRPQQorICAgICAqICAgICAgICBpZiB0aGUgZGlhbGluZyBudW1iZXIgc3RhcnRzIHdpdGggJysnLCBzZXQgdG8gaW50ZXJuYXRpb25hbCBUT0EKICAgICAgKiBAcmV0dXJuIEJDRCBieXRlIGFycmF5CiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBieXRlW10KQEAgLTExMDgsMTAgKzExMTMsMTAgQEAKICAgICAgKgogICAgICAqIEBwYXJhbSBzb3VyY2UgdGhlIHBob25lIG51bWJlciB0byBmb3JtYXQKICAgICAgKiBAcGFyYW0gZGVmYXVsdEZvcm1hdHRpbmdUeXBlIFRoZSBkZWZhdWx0IGZvcm1hdHRpbmcgcnVsZXMgdG8gYXBwbHkgaWYgdGhlIG51bWJlciBkb2VzCi0gICAgICogbm90IGJlZ2luIHdpdGggKzxjb3VudHJ5X2NvZGU+CisgICAgICogbm90IGJlZ2luIHdpdGggK1tjb3VudHJ5X2NvZGVdCiAgICAgICogQHJldHVybiBUaGUgcGhvbmUgbnVtYmVyIGZvcm1hdHRlZCB3aXRoIHRoZSBnaXZlbiBmb3JtYXR0aW5nIHR5cGUuCiAgICAgICoKLSAgICAgKiBAaGlkZSBUT0RPOlNodW9sZCBiZSB1bmhpZGRlbi4KKyAgICAgKiBAaGlkZSBUT0RPOiBTaG91bGQgYmUgdW5oaWRkZW4uCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZm9ybWF0TnVtYmVyKFN0cmluZyBzb3VyY2UsIGludCBkZWZhdWx0Rm9ybWF0dGluZ1R5cGUpIHsKICAgICAgICAgU3Bhbm5hYmxlU3RyaW5nQnVpbGRlciB0ZXh0ID0gbmV3IFNwYW5uYWJsZVN0cmluZ0J1aWxkZXIoc291cmNlKTsKQEAgLTExMzgsNyArMTE0Myw3IEBACiAgICAgICoKICAgICAgKiBAcGFyYW0gdGV4dCBUaGUgbnVtYmVyIHRvIGJlIGZvcm1hdHRlZCwgd2lsbCBiZSBtb2RpZmllZCB3aXRoIHRoZSBmb3JtYXR0aW5nCiAgICAgICogQHBhcmFtIGRlZmF1bHRGb3JtYXR0aW5nVHlwZSBUaGUgZGVmYXVsdCBmb3JtYXR0aW5nIHJ1bGVzIHRvIGFwcGx5IGlmIHRoZSBudW1iZXIgZG9lcwotICAgICAqIG5vdCBiZWdpbiB3aXRoICs8Y291bnRyeV9jb2RlPgorICAgICAqIG5vdCBiZWdpbiB3aXRoICtbY291bnRyeV9jb2RlXQogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBmb3JtYXROdW1iZXIoRWRpdGFibGUgdGV4dCwgaW50IGRlZmF1bHRGb3JtYXR0aW5nVHlwZSkgewogICAgICAgICBpbnQgZm9ybWF0VHlwZSA9IGRlZmF1bHRGb3JtYXR0aW5nVHlwZTsKQEAgLTEzMTksNiArMTMyNCwxMzIgQEAKICAgICAgICAgfQogICAgIH0KIAorICAgIC8qKgorICAgICAqIEZvcm1hdCB0aGUgZ2l2ZW4gcGhvbmVOdW1iZXIgdG8gdGhlIEUuMTY0IHJlcHJlc2VudGF0aW9uLgorICAgICAqIDxwPgorICAgICAqIFRoZSBnaXZlbiBwaG9uZSBudW1iZXIgbXVzdCBoYXZlIGFuIGFyZWEgY29kZSBhbmQgY291bGQgaGF2ZSBhIGNvdW50cnkKKyAgICAgKiBjb2RlLgorICAgICAqIDxwPgorICAgICAqIFRoZSBkZWZhdWx0Q291bnRyeUlzbyBpcyB1c2VkIHRvIHZhbGlkYXRlIHRoZSBnaXZlbiBudW1iZXIgYW5kIGdlbmVyYXRlCisgICAgICogdGhlIEUuMTY0IHBob25lIG51bWJlciBpZiB0aGUgZ2l2ZW4gbnVtYmVyIGRvZXNuJ3QgaGF2ZSBhIGNvdW50cnkgY29kZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwaG9uZU51bWJlcgorICAgICAqICAgICAgICAgICAgdGhlIHBob25lIG51bWJlciB0byBmb3JtYXQKKyAgICAgKiBAcGFyYW0gZGVmYXVsdENvdW50cnlJc28KKyAgICAgKiAgICAgICAgICAgIHRoZSBJU08gMzE2Ni0xIHR3byBsZXR0ZXJzIGNvdW50cnkgY29kZQorICAgICAqIEByZXR1cm4gdGhlIEUuMTY0IHJlcHJlc2VudGF0aW9uLCBvciBudWxsIGlmIHRoZSBnaXZlbiBwaG9uZSBudW1iZXIgaXMKKyAgICAgKiAgICAgICAgIG5vdCB2YWxpZC4KKyAgICAgKgorICAgICAqIEBoaWRlCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZm9ybWF0TnVtYmVyVG9FMTY0KFN0cmluZyBwaG9uZU51bWJlciwgU3RyaW5nIGRlZmF1bHRDb3VudHJ5SXNvKSB7CisgICAgICAgIFBob25lTnVtYmVyVXRpbCB1dGlsID0gUGhvbmVOdW1iZXJVdGlsLmdldEluc3RhbmNlKCk7CisgICAgICAgIFN0cmluZyByZXN1bHQgPSBudWxsOworICAgICAgICB0cnkgeworICAgICAgICAgICAgUGhvbmVOdW1iZXIgcG4gPSB1dGlsLnBhcnNlKHBob25lTnVtYmVyLCBkZWZhdWx0Q291bnRyeUlzbyk7CisgICAgICAgICAgICBpZiAodXRpbC5pc1ZhbGlkTnVtYmVyKHBuKSkgeworICAgICAgICAgICAgICAgIHJlc3VsdCA9IHV0aWwuZm9ybWF0KHBuLCBQaG9uZU51bWJlckZvcm1hdC5FMTY0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoTnVtYmVyUGFyc2VFeGNlcHRpb24gZSkgeworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogRm9ybWF0IGEgcGhvbmUgbnVtYmVyLgorICAgICAqIDxwPgorICAgICAqIElmIHRoZSBnaXZlbiBudW1iZXIgZG9lc24ndCBoYXZlIHRoZSBjb3VudHJ5IGNvZGUsIHRoZSBwaG9uZSB3aWxsIGJlCisgICAgICogZm9ybWF0dGVkIHRvIHRoZSBkZWZhdWx0IGNvdW50cnkncyBjb252ZW50aW9uLgorICAgICAqCisgICAgICogQHBhcmFtIHBob25lTnVtYmVyCisgICAgICogICAgICAgICAgICB0aGUgbnVtYmVyIHRvIGJlIGZvcm1hdHRlZC4KKyAgICAgKiBAcGFyYW0gZGVmYXVsdENvdW50cnlJc28KKyAgICAgKiAgICAgICAgICAgIHRoZSBJU08gMzE2Ni0xIHR3byBsZXR0ZXJzIGNvdW50cnkgY29kZSB3aG9zZSBjb252ZW50aW9uIHdpbGwKKyAgICAgKiAgICAgICAgICAgIGJlIHVzZWQgaWYgdGhlIGdpdmVuIG51bWJlciBkb2Vzbid0IGhhdmUgdGhlIGNvdW50cnkgY29kZS4KKyAgICAgKiBAcmV0dXJuIHRoZSBmb3JtYXR0ZWQgbnVtYmVyLCBvciBudWxsIGlmIHRoZSBnaXZlbiBudW1iZXIgaXMgbm90IHZhbGlkLgorICAgICAqCisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBmb3JtYXROdW1iZXIoU3RyaW5nIHBob25lTnVtYmVyLCBTdHJpbmcgZGVmYXVsdENvdW50cnlJc28pIHsKKyAgICAgICAgUGhvbmVOdW1iZXJVdGlsIHV0aWwgPSBQaG9uZU51bWJlclV0aWwuZ2V0SW5zdGFuY2UoKTsKKyAgICAgICAgU3RyaW5nIHJlc3VsdCA9IG51bGw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBQaG9uZU51bWJlciBwbiA9IHV0aWwucGFyc2VBbmRLZWVwUmF3SW5wdXQocGhvbmVOdW1iZXIsIGRlZmF1bHRDb3VudHJ5SXNvKTsKKyAgICAgICAgICAgIHJlc3VsdCA9IHV0aWwuZm9ybWF0SW5PcmlnaW5hbEZvcm1hdChwbiwgZGVmYXVsdENvdW50cnlJc28pOworICAgICAgICB9IGNhdGNoIChOdW1iZXJQYXJzZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBGb3JtYXQgdGhlIHBob25lIG51bWJlciBvbmx5IGlmIHRoZSBnaXZlbiBudW1iZXIgaGFzbid0IGJlZW4gZm9ybWF0dGVkLgorICAgICAqIDxwPgorICAgICAqIFRoZSBudW1iZXIgd2hpY2ggaGFzIG9ubHkgZGFpbGFibGUgY2hhcmFjdGVyIGlzIHRyZWF0ZWQgYXMgbm90IGJlaW5nCisgICAgICogZm9ybWF0dGVkLgorICAgICAqCisgICAgICogQHBhcmFtIHBob25lTnVtYmVyCisgICAgICogICAgICAgICAgICB0aGUgbnVtYmVyIHRvIGJlIGZvcm1hdHRlZC4KKyAgICAgKiBAcGFyYW0gcGhvbmVOdW1iZXJFMTY0CisgICAgICogICAgICAgICAgICB0aGUgRTE2NCBmb3JtYXQgbnVtYmVyIHdob3NlIGNvdW50cnkgY29kZSBpcyB1c2VkIGlmIHRoZSBnaXZlbgorICAgICAqICAgICAgICAgICAgcGhvbmVOdW1iZXIgZG9lc24ndCBoYXZlIHRoZSBjb3VudHJ5IGNvZGUuCisgICAgICogQHBhcmFtIGRlZmF1bHRDb3VudHJ5SXNvCisgICAgICogICAgICAgICAgICB0aGUgSVNPIDMxNjYtMSB0d28gbGV0dGVycyBjb3VudHJ5IGNvZGUgd2hvc2UgY29udmVudGlvbiB3aWxsCisgICAgICogICAgICAgICAgICBiZSB1c2VkIGlmIHRoZSBwaG9uZU51bWJlckUxNjQgaXMgbnVsbCBvciBpbnZhbGlkLgorICAgICAqIEByZXR1cm4gdGhlIGZvcm1hdHRlZCBudW1iZXIgaWYgdGhlIGdpdmVuIG51bWJlciBoYXMgYmVlbiBmb3JtYXR0ZWQsCisgICAgICogICAgICAgICAgICBvdGhlcndpc2UsIHJldHVybiB0aGUgZ2l2ZW4gbnVtYmVyLgorICAgICAqCisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBmb3JtYXROdW1iZXIoCisgICAgICAgICAgICBTdHJpbmcgcGhvbmVOdW1iZXIsIFN0cmluZyBwaG9uZU51bWJlckUxNjQsIFN0cmluZyBkZWZhdWx0Q291bnRyeUlzbykgeworICAgICAgICBpbnQgbGVuID0gcGhvbmVOdW1iZXIubGVuZ3RoKCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKKyAgICAgICAgICAgIGlmICghaXNEaWFsYWJsZShwaG9uZU51bWJlci5jaGFyQXQoaSkpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHBob25lTnVtYmVyOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIFBob25lTnVtYmVyVXRpbCB1dGlsID0gUGhvbmVOdW1iZXJVdGlsLmdldEluc3RhbmNlKCk7CisgICAgICAgIC8vIEdldCB0aGUgY291bnRyeSBjb2RlIGZyb20gcGhvbmVOdW1iZXJFMTY0CisgICAgICAgIGlmIChwaG9uZU51bWJlckUxNjQgIT0gbnVsbCAmJiBwaG9uZU51bWJlckUxNjQubGVuZ3RoKCkgPj0gMgorICAgICAgICAgICAgICAgICYmIHBob25lTnVtYmVyRTE2NC5jaGFyQXQoMCkgPT0gJysnKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIFBob25lTnVtYmVyIHBuID0gdXRpbC5wYXJzZShwaG9uZU51bWJlckUxNjQsIGRlZmF1bHRDb3VudHJ5SXNvKTsKKyAgICAgICAgICAgICAgICBTdHJpbmcgcmVnaW9uQ29kZSA9IHV0aWwuZ2V0UmVnaW9uQ29kZUZvck51bWJlcihwbik7CisgICAgICAgICAgICAgICAgaWYgKCFUZXh0VXRpbHMuaXNFbXB0eShyZWdpb25Db2RlKSkgeworICAgICAgICAgICAgICAgICAgICBkZWZhdWx0Q291bnRyeUlzbyA9IHJlZ2lvbkNvZGU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBjYXRjaCAoTnVtYmVyUGFyc2VFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIFN0cmluZyByZXN1bHQgPSBmb3JtYXROdW1iZXIocGhvbmVOdW1iZXIsIGRlZmF1bHRDb3VudHJ5SXNvKTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdCAhPSBudWxsID8gcmVzdWx0IDogcGhvbmVOdW1iZXI7CisgICAgfQorCisgICAgLyoqCisgICAgICogTm9ybWFsaXplIGEgcGhvbmUgbnVtYmVyIGJ5IHJlbW92aW5nIHRoZSBjaGFyYWN0ZXJzIG90aGVyIHRoYW4gZGlnaXRzLiBJZgorICAgICAqIHRoZSBnaXZlbiBudW1iZXIgaGFzIGtleXBhZCBsZXR0ZXJzLCB0aGUgbGV0dGVycyB3aWxsIGJlIGNvbnZlcnRlZCB0bworICAgICAqIGRpZ2l0cyBmaXJzdC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwaG9uZU51bWJlcgorICAgICAqICAgICAgICAgICAgdGhlIG51bWJlciB0byBiZSBub3JtYWxpemVkLgorICAgICAqIEByZXR1cm4gdGhlIG5vcm1hbGl6ZWQgbnVtYmVyLgorICAgICAqCisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBub3JtYWxpemVOdW1iZXIoU3RyaW5nIHBob25lTnVtYmVyKSB7CisgICAgICAgIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgICAgICBpbnQgbGVuID0gcGhvbmVOdW1iZXIubGVuZ3RoKCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKKyAgICAgICAgICAgIGNoYXIgYyA9IHBob25lTnVtYmVyLmNoYXJBdChpKTsKKyAgICAgICAgICAgIGlmICgoaSA9PSAwICYmIGMgPT0gJysnKSB8fCBQaG9uZU51bWJlclV0aWxzLmlzSVNPRGlnaXQoYykpIHsKKyAgICAgICAgICAgICAgICBzYi5hcHBlbmQoYyk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKChjID49ICdhJyAmJiBjIDw9ICd6JykgfHwgKGMgPj0gJ0EnICYmIGMgPD0gJ1onKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBub3JtYWxpemVOdW1iZXIoUGhvbmVOdW1iZXJVdGlscy5jb252ZXJ0S2V5cGFkTGV0dGVyc1RvRGlnaXRzKHBob25lTnVtYmVyKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7CisgICAgfQorCiAgICAgLy8gVGhyZWUgYW5kIGZvdXIgZGlnaXQgcGhvbmUgbnVtYmVycyBmb3IgZWl0aGVyIHNwZWNpYWwgc2VydmljZXMsCiAgICAgLy8gb3IgMy02IGRpZ2l0IGFkZHJlc3NlcyBmcm9tIHRoZSBuZXR3b3JrIChlZyBjYXJyaWVyLW9yaWdpbmF0ZWQgU01TIG1lc3NhZ2VzKSBzaG91bGQKICAgICAvLyBub3QgbWF0Y2guCkBAIC0xNTQ2LDcgKzE2NzcsNyBAQAogICAgICAqIEBoaWRlCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBTdHJpbmcKLSAgICBjZG1hQ2hlY2tBbmRQcm9jZXNzUGx1c0NvZGVCeU51bWJlckZvcm1hdChTdHJpbmcgZGlhbFN0cixpbnQgY3VyckZvcm1hdCxpbnQgZGVmYXVsdEZvcm10KSB7CisgICAgY2RtYUNoZWNrQW5kUHJvY2Vzc1BsdXNDb2RlQnlOdW1iZXJGb3JtYXQoU3RyaW5nIGRpYWxTdHIsaW50IGN1cnJGb3JtYXQsaW50IGRlZmF1bHRGb3JtYXQpIHsKICAgICAgICAgU3RyaW5nIHJldFN0ciA9IGRpYWxTdHI7CiAKICAgICAgICAgLy8gQ2hlY2tzIGlmIHRoZSBwbHVzIHNpZ24gY2hhcmFjdGVyIGlzIGluIHRoZSBwYXNzZWQtaW4gZGlhbCBzdHJpbmcKQEAgLTE1NTQsNyArMTY4NSw3IEBACiAgICAgICAgICAgICBkaWFsU3RyLmxhc3RJbmRleE9mKFBMVVNfU0lHTl9TVFJJTkcpICE9IC0xKSB7CiAgICAgICAgICAgICAvLyBGb3JtYXQgdGhlIHN0cmluZyBiYXNlZCBvbiB0aGUgcnVsZXMgZm9yIHRoZSBjb3VudHJ5IHRoZSBudW1iZXIgaXMgZnJvbSwKICAgICAgICAgICAgIC8vIGFuZCB0aGUgY3VycmVudCBjb3VudHJ5IHRoZSBwaG9uZSBpcyBjYW1wZWQgb24uCi0gICAgICAgICAgICBpZiAoKGN1cnJGb3JtYXQgPT0gZGVmYXVsdEZvcm10KSAmJiAoY3VyckZvcm1hdCA9PSBGT1JNQVRfTkFOUCkpIHsKKyAgICAgICAgICAgIGlmICgoY3VyckZvcm1hdCA9PSBkZWZhdWx0Rm9ybWF0KSAmJiAoY3VyckZvcm1hdCA9PSBGT1JNQVRfTkFOUCkpIHsKICAgICAgICAgICAgICAgICAvLyBIYW5kbGUgY2FzZSB3aGVyZSBkZWZhdWx0IGFuZCBjdXJyZW50IHRlbGVwaG9uZSBudW1iZXJpbmcgcGxhbnMgYXJlIE5BTlAuCiAgICAgICAgICAgICAgICAgU3RyaW5nIHBvc3REaWFsU3RyID0gbnVsbDsKICAgICAgICAgICAgICAgICBTdHJpbmcgdGVtcERpYWxTdHIgPSBkaWFsU3RyOwpAQCAtMTc0MSw3ICsxODcyLDcgQEAKICAgICAgICAgcmV0dXJuIC0xOwogICAgIH0KIAotICAgIC8vIFRoaXMgZnVuY3Rpb24gYXBwZW5kcyB0aGUgbm9uLWRpYWJsYWJsZSBQL1cgY2hhcmFjdGVyIHRvIHRoZSBvcmlnaW5hbAorICAgIC8vIFRoaXMgZnVuY3Rpb24gYXBwZW5kcyB0aGUgbm9uLWRpYWxhYmxlIFAvVyBjaGFyYWN0ZXIgdG8gdGhlIG9yaWdpbmFsCiAgICAgLy8gZGlhbCBzdHJpbmcgYmFzZWQgb24gdGhlIGRpYWxhYmxlIGluZGV4IHBhc3NlZCBpbgogICAgIHByaXZhdGUgc3RhdGljIFN0cmluZwogICAgIGFwcGVuZFB3Q2hhckJhY2tUb09yaWdEaWFsU3RyKGludCBkaWFsYWJsZUluZGV4LFN0cmluZyBvcmlnU3RyLCBTdHJpbmcgZGlhbFN0cikgewpAQCAtMTc2MSw3ICsxODkyLDcgQEAKICAgICAgICAgcmV0dXJuIHJldFN0cjsKICAgICB9CiAKLSAgICAvLz09PT09IEJlZ2luaW5nIG9mIHV0aWxpdHkgbWV0aG9kcyB1c2VkIGluIGNvbXBhcmVMb29zZWx5KCkgPT09PT0KKyAgICAvLz09PT09IEJlZ2lubmluZyBvZiB1dGlsaXR5IG1ldGhvZHMgdXNlZCBpbiBjb21wYXJlTG9vc2VseSgpID09PT09CiAKICAgICAvKioKICAgICAgKiBQaG9uZSBudW1iZXJzIGFyZSBzdG9yZWQgaW4gImxvb2t1cCIgZm9ybSBpbiB0aGUgZGF0YWJhc2UKQEAgLTE4ODMsMTIgKzIwMTQsMTIgQEAKIAogICAgIC8vPT09PT0gRW5kIG9mIHV0aWxpdHkgbWV0aG9kcyB1c2VkIG9ubHkgaW4gY29tcGFyZUxvb3NlbHkoKSA9PT09PQogCi0gICAgLy89PT09PSBCZWdnaW5pbmcgb2YgdXRpbGl0eSBtZXRob2RzIHVzZWQgb25seSBpbiBjb21wYXJlU3RyaWN0bHkoKSA9PT09CisgICAgLy89PT09PSBCZWdpbm5pbmcgb2YgdXRpbGl0eSBtZXRob2RzIHVzZWQgb25seSBpbiBjb21wYXJlU3RyaWN0bHkoKSA9PT09CiAKICAgICAvKgogICAgICAqIElmIHRydWUsIHRoZSBudW1iZXIgaXMgY291bnRyeSBjYWxsaW5nIGNvZGUuCiAgICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBDT1VOVExZX0NBTExJTkdfQ0FMTFtdID0geworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gQ09VTlRSWV9DQUxMSU5HX0NBTExbXSA9IHsKICAgICAgICAgdHJ1ZSwgdHJ1ZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCB0cnVlLCBmYWxzZSwgZmFsc2UsCiAgICAgICAgIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLAogICAgICAgICB0cnVlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCB0cnVlLCB0cnVlLCBmYWxzZSwKQEAgLTE5MDAsMTggKzIwMzEsMTggQEAKICAgICAgICAgZmFsc2UsIHRydWUsIHRydWUsIHRydWUsIHRydWUsIGZhbHNlLCB0cnVlLCBmYWxzZSwgZmFsc2UsIHRydWUsCiAgICAgICAgIHRydWUsIHRydWUsIHRydWUsIHRydWUsIHRydWUsIHRydWUsIGZhbHNlLCBmYWxzZSwgdHJ1ZSwgZmFsc2UsCiAgICAgfTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQ0NDX0xFTkdUSCA9IENPVU5UTFlfQ0FMTElOR19DQUxMLmxlbmd0aDsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQ0NDX0xFTkdUSCA9IENPVU5UUllfQ0FMTElOR19DQUxMLmxlbmd0aDsKIAogICAgIC8qKgogICAgICAqIEByZXR1cm4gdHJ1ZSB3aGVuIGlucHV0IGlzIHZhbGlkIENvdW50cnkgQ2FsbGluZyBDb2RlLgogICAgICAqLwogICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNDb3VudHJ5Q2FsbGluZ0NvZGUoaW50IGNvdW50cnlDYWxsaW5nQ29kZUNhbmRpZGF0ZSkgewogICAgICAgICByZXR1cm4gY291bnRyeUNhbGxpbmdDb2RlQ2FuZGlkYXRlID4gMCAmJiBjb3VudHJ5Q2FsbGluZ0NvZGVDYW5kaWRhdGUgPCBDQ0NfTEVOR1RIICYmCi0gICAgICAgICAgICAgICAgQ09VTlRMWV9DQUxMSU5HX0NBTExbY291bnRyeUNhbGxpbmdDb2RlQ2FuZGlkYXRlXTsKKyAgICAgICAgICAgICAgICBDT1VOVFJZX0NBTExJTkdfQ0FMTFtjb3VudHJ5Q2FsbGluZ0NvZGVDYW5kaWRhdGVdOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgaW50ZXJnZXIgY29ycmVzcG9uZGluZyB0byB0aGUgaW5wdXQgaWYgaW5wdXQgImNoIiBpcworICAgICAqIFJldHVybnMgaW50ZWdlciBjb3JyZXNwb25kaW5nIHRvIHRoZSBpbnB1dCBpZiBpbnB1dCAiY2giIGlzCiAgICAgICogSVNPLUxBVElOIGNoYXJhY3RlcnMgMC05LgogICAgICAqIFJldHVybnMgLTEgb3RoZXJ3aXNlCiAgICAgICovCkBAIC0yMDQ2LDcgKzIxNzcsNyBAQAogCiAgICAgLyoqCiAgICAgICogUmV0dXJuIHRydWUgaWYgdGhlIHByZWZpeCBvZiAic3RyIiBpcyAiaWdub3JhYmxlIi4gSGVyZSwgImlnbm9yYWJsZSIgbWVhbnMKLSAgICAgKiB0aGF0ICJzdHIiIGhhcyBvbmx5IG9uZSBkaWdpdCBhbmQgc2VwYXJhdGVyIGNoYXJhY3RlcnMuIFRoZSBvbmUgZGlnaXQgaXMKKyAgICAgKiB0aGF0ICJzdHIiIGhhcyBvbmx5IG9uZSBkaWdpdCBhbmQgc2VwYXJhdG9yIGNoYXJhY3RlcnMuIFRoZSBvbmUgZGlnaXQgaXMKICAgICAgKiBhc3N1bWVkIHRvIGJlIHRydW5rIHByZWZpeC4KICAgICAgKi8KICAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGNoZWNrUHJlZml4SXNJZ25vcmFibGUoZmluYWwgU3RyaW5nIHN0ciwKZGlmZiAtLWdpdCBhL3RlbGVwaG9ueS9qYXZhL2FuZHJvaWQvdGVsZXBob255L1Bob25lU3RhdGVMaXN0ZW5lci5qYXZhIGIvdGVsZXBob255L2phdmEvYW5kcm9pZC90ZWxlcGhvbnkvUGhvbmVTdGF0ZUxpc3RlbmVyLmphdmEKaW5kZXggODMwYWY0Ny4uMzhmNDRkOCAxMDA2NDQKLS0tIGEvdGVsZXBob255L2phdmEvYW5kcm9pZC90ZWxlcGhvbnkvUGhvbmVTdGF0ZUxpc3RlbmVyLmphdmEKKysrIGIvdGVsZXBob255L2phdmEvYW5kcm9pZC90ZWxlcGhvbnkvUGhvbmVTdGF0ZUxpc3RlbmVyLmphdmEKQEAgLTI1LDYgKzI1LDcgQEAKIGltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwogCiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LklQaG9uZVN0YXRlTGlzdGVuZXI7CitpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LlBob25lOwogCiAvKioKICAqIEEgbGlzdGVuZXIgY2xhc3MgZm9yIG1vbml0b3JpbmcgY2hhbmdlcyBpbiBzcGVjaWZpYyB0ZWxlcGhvbnkgc3RhdGVzCkBAIC0yODQsNyArMjg1LDcgQEAKICAgICAgICAgfQogCiAgICAgICAgIHB1YmxpYyB2b2lkIG9uRGF0YUNvbm5lY3Rpb25TdGF0ZUNoYW5nZWQoaW50IHN0YXRlLCBpbnQgbmV0d29ya1R5cGUpIHsKLSAgICAgICAgICAgIE1lc3NhZ2Uub2J0YWluKG1IYW5kbGVyLCBMSVNURU5fREFUQV9DT05ORUNUSU9OX1NUQVRFLCBzdGF0ZSwgbmV0d29ya1R5cGUsIG51bGwpLgorICAgICAgICAgICAgTWVzc2FnZS5vYnRhaW4obUhhbmRsZXIsIExJU1RFTl9EQVRBX0NPTk5FQ1RJT05fU1RBVEUsIHN0YXRlLCBuZXR3b3JrVHlwZSkuCiAgICAgICAgICAgICAgICAgICAgIHNlbmRUb1RhcmdldCgpOwogICAgICAgICB9CiAKZGlmZiAtLWdpdCBhL3RlbGVwaG9ueS9qYXZhL2FuZHJvaWQvdGVsZXBob255L1Ntc01hbmFnZXIuamF2YSBiL3RlbGVwaG9ueS9qYXZhL2FuZHJvaWQvdGVsZXBob255L1Ntc01hbmFnZXIuamF2YQppbmRleCBmNWU5NzUxLi45NTM2OTZiIDEwMDY0NAotLS0gYS90ZWxlcGhvbnkvamF2YS9hbmRyb2lkL3RlbGVwaG9ueS9TbXNNYW5hZ2VyLmphdmEKKysrIGIvdGVsZXBob255L2phdmEvYW5kcm9pZC90ZWxlcGhvbnkvU21zTWFuYWdlci5qYXZhCkBAIC0yMSw3ICsyMSw2IEBACiBpbXBvcnQgYW5kcm9pZC5vcy5TZXJ2aWNlTWFuYWdlcjsKIGltcG9ydCBhbmRyb2lkLnRleHQuVGV4dFV0aWxzOwogCi1pbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LkVuY29kZUV4Y2VwdGlvbjsKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuSVNtczsKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuSWNjQ29uc3RhbnRzOwogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5TbXNSYXdEYXRhOwpAQCAtMzMsNyArMzIsNyBAQAogLyoKICAqIFRPRE8oY29kZSByZXZpZXcpOiBDdXJpb3VzIHF1ZXN0aW9uLi4uIFdoeSBhcmUgYSBsb3Qgb2YgdGhlc2UKICAqIG1ldGhvZHMgbm90IGRlY2xhcmVkIGFzIHN0YXRpYywgc2luY2UgdGhleSBkbyBub3Qgc2VlbSB0byByZXF1aXJlCi0gKiBhbnkgbG9jYWwgb2JqZWN0IHN0YXRlPyAgQXNzdW1lZGx5IHRoaXMgY2Fubm90IGJlIGNoYW5nZWQgd2l0aG91dAorICogYW55IGxvY2FsIG9iamVjdCBzdGF0ZT8gIFByZXN1bWFibHkgdGhpcyBjYW5ub3QgYmUgY2hhbmdlZCB3aXRob3V0CiAgKiBpbnRlcmZlcmluZyB3aXRoIHRoZSBBUEkuLi4KICAqLwogCkBAIC00Miw3ICs0MSw4IEBACiAgKiBHZXQgdGhpcyBvYmplY3QgYnkgY2FsbGluZyB0aGUgc3RhdGljIG1ldGhvZCBTbXNNYW5hZ2VyLmdldERlZmF1bHQoKS4KICAqLwogcHVibGljIGZpbmFsIGNsYXNzIFNtc01hbmFnZXIgewotICAgIHByaXZhdGUgc3RhdGljIFNtc01hbmFnZXIgc0luc3RhbmNlOworICAgIC8qKiBTaW5nbGV0b24gb2JqZWN0IGNvbnN0cnVjdGVkIGR1cmluZyBjbGFzcyBpbml0aWFsaXphdGlvbi4gKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTbXNNYW5hZ2VyIHNJbnN0YW5jZSA9IG5ldyBTbXNNYW5hZ2VyKCk7CiAKICAgICAvKioKICAgICAgKiBTZW5kIGEgdGV4dCBiYXNlZCBTTVMuCkBAIC01Miw4ICs1Miw4IEBACiAgICAgICogIHRoZSBjdXJyZW50IGRlZmF1bHQgU01TQwogICAgICAqIEBwYXJhbSB0ZXh0IHRoZSBib2R5IG9mIHRoZSBtZXNzYWdlIHRvIHNlbmQKICAgICAgKiBAcGFyYW0gc2VudEludGVudCBpZiBub3QgTlVMTCB0aGlzIDxjb2RlPlBlbmRpbmdJbnRlbnQ8L2NvZGU+IGlzCi0gICAgICogIGJyb2FkY2FzdCB3aGVuIHRoZSBtZXNzYWdlIGlzIHN1Y2Vzc2Z1bGx5IHNlbnQsIG9yIGZhaWxlZC4KLSAgICAgKiAgVGhlIHJlc3VsdCBjb2RlIHdpbGwgYmUgPGNvZGU+QWN0aXZpdHkuUkVTVUxUX09LPGNvZGU+IGZvciBzdWNjZXNzLAorICAgICAqICBicm9hZGNhc3Qgd2hlbiB0aGUgbWVzc2FnZSBpcyBzdWNjZXNzZnVsbHkgc2VudCwgb3IgZmFpbGVkLgorICAgICAqICBUaGUgcmVzdWx0IGNvZGUgd2lsbCBiZSA8Y29kZT5BY3Rpdml0eS5SRVNVTFRfT0s8L2NvZGU+IGZvciBzdWNjZXNzLAogICAgICAqICBvciBvbmUgb2YgdGhlc2UgZXJyb3JzOjxicj4KICAgICAgKiAgPGNvZGU+UkVTVUxUX0VSUk9SX0dFTkVSSUNfRkFJTFVSRTwvY29kZT48YnI+CiAgICAgICogIDxjb2RlPlJFU1VMVF9FUlJPUl9SQURJT19PRkY8L2NvZGU+PGJyPgpAQCAtMTE2LDcgKzExNiw3IEBACiAgICAgICogQHBhcmFtIHNlbnRJbnRlbnRzIGlmIG5vdCBudWxsLCBhbiA8Y29kZT5BcnJheUxpc3Q8L2NvZGU+IG9mCiAgICAgICogICA8Y29kZT5QZW5kaW5nSW50ZW50PC9jb2RlPnMgKG9uZSBmb3IgZWFjaCBtZXNzYWdlIHBhcnQpIHRoYXQgaXMKICAgICAgKiAgIGJyb2FkY2FzdCB3aGVuIHRoZSBjb3JyZXNwb25kaW5nIG1lc3NhZ2UgcGFydCBoYXMgYmVlbiBzZW50LgotICAgICAqICAgVGhlIHJlc3VsdCBjb2RlIHdpbGwgYmUgPGNvZGU+QWN0aXZpdHkuUkVTVUxUX09LPGNvZGU+IGZvciBzdWNjZXNzLAorICAgICAqICAgVGhlIHJlc3VsdCBjb2RlIHdpbGwgYmUgPGNvZGU+QWN0aXZpdHkuUkVTVUxUX09LPC9jb2RlPiBmb3Igc3VjY2VzcywKICAgICAgKiAgIG9yIG9uZSBvZiB0aGVzZSBlcnJvcnM6PGJyPgogICAgICAqICAgPGNvZGU+UkVTVUxUX0VSUk9SX0dFTkVSSUNfRkFJTFVSRTwvY29kZT48YnI+CiAgICAgICogICA8Y29kZT5SRVNVTFRfRVJST1JfUkFESU9fT0ZGPC9jb2RlPjxicj4KQEAgLTEyNSw3ICsxMjUsNyBAQAogICAgICAqICAgdGhlIGV4dHJhICJlcnJvckNvZGUiIGNvbnRhaW5pbmcgYSByYWRpbyB0ZWNobm9sb2d5IHNwZWNpZmljIHZhbHVlLAogICAgICAqICAgZ2VuZXJhbGx5IG9ubHkgdXNlZnVsIGZvciB0cm91Ymxlc2hvb3RpbmcuPGJyPgogICAgICAqICAgVGhlIHBlci1hcHBsaWNhdGlvbiBiYXNlZCBTTVMgY29udHJvbCBjaGVja3Mgc2VudEludGVudC4gSWYgc2VudEludGVudAotICAgICAqICAgaXMgTlVMTCB0aGUgY2FsbGVyIHdpbGwgYmUgY2hlY2tlZCBhZ2FpbnN0IGFsbCB1bmtub3duIGFwcGxpY2FpdG9ucywKKyAgICAgKiAgIGlzIE5VTEwgdGhlIGNhbGxlciB3aWxsIGJlIGNoZWNrZWQgYWdhaW5zdCBhbGwgdW5rbm93biBhcHBsaWNhdGlvbnMsCiAgICAgICogICB3aGljaCBjYXVzZSBzbWFsbGVyIG51bWJlciBvZiBTTVMgdG8gYmUgc2VudCBpbiBjaGVja2luZyBwZXJpb2QuCiAgICAgICogQHBhcmFtIGRlbGl2ZXJ5SW50ZW50cyBpZiBub3QgbnVsbCwgYW4gPGNvZGU+QXJyYXlMaXN0PC9jb2RlPiBvZgogICAgICAqICAgPGNvZGU+UGVuZGluZ0ludGVudDwvY29kZT5zIChvbmUgZm9yIGVhY2ggbWVzc2FnZSBwYXJ0KSB0aGF0IGlzCkBAIC0xNzgsOCArMTc4LDggQEAKICAgICAgKiBAcGFyYW0gZGVzdGluYXRpb25Qb3J0IHRoZSBwb3J0IHRvIGRlbGl2ZXIgdGhlIG1lc3NhZ2UgdG8KICAgICAgKiBAcGFyYW0gZGF0YSB0aGUgYm9keSBvZiB0aGUgbWVzc2FnZSB0byBzZW5kCiAgICAgICogQHBhcmFtIHNlbnRJbnRlbnQgaWYgbm90IE5VTEwgdGhpcyA8Y29kZT5QZW5kaW5nSW50ZW50PC9jb2RlPiBpcwotICAgICAqICBicm9hZGNhc3Qgd2hlbiB0aGUgbWVzc2FnZSBpcyBzdWNlc3NmdWxseSBzZW50LCBvciBmYWlsZWQuCi0gICAgICogIFRoZSByZXN1bHQgY29kZSB3aWxsIGJlIDxjb2RlPkFjdGl2aXR5LlJFU1VMVF9PSzxjb2RlPiBmb3Igc3VjY2VzcywKKyAgICAgKiAgYnJvYWRjYXN0IHdoZW4gdGhlIG1lc3NhZ2UgaXMgc3VjY2Vzc2Z1bGx5IHNlbnQsIG9yIGZhaWxlZC4KKyAgICAgKiAgVGhlIHJlc3VsdCBjb2RlIHdpbGwgYmUgPGNvZGU+QWN0aXZpdHkuUkVTVUxUX09LPC9jb2RlPiBmb3Igc3VjY2VzcywKICAgICAgKiAgb3Igb25lIG9mIHRoZXNlIGVycm9yczo8YnI+CiAgICAgICogIDxjb2RlPlJFU1VMVF9FUlJPUl9HRU5FUklDX0ZBSUxVUkU8L2NvZGU+PGJyPgogICAgICAqICA8Y29kZT5SRVNVTFRfRVJST1JfUkFESU9fT0ZGPC9jb2RlPjxicj4KQEAgLTE4OCw3ICsxODgsNyBAQAogICAgICAqICB0aGUgZXh0cmEgImVycm9yQ29kZSIgY29udGFpbmluZyBhIHJhZGlvIHRlY2hub2xvZ3kgc3BlY2lmaWMgdmFsdWUsCiAgICAgICogIGdlbmVyYWxseSBvbmx5IHVzZWZ1bCBmb3IgdHJvdWJsZXNob290aW5nLjxicj4KICAgICAgKiAgVGhlIHBlci1hcHBsaWNhdGlvbiBiYXNlZCBTTVMgY29udHJvbCBjaGVja3Mgc2VudEludGVudC4gSWYgc2VudEludGVudAotICAgICAqICBpcyBOVUxMIHRoZSBjYWxsZXIgd2lsbCBiZSBjaGVja2VkIGFnYWluc3QgYWxsIHVua25vd24gYXBwbGljYWl0b25zLAorICAgICAqICBpcyBOVUxMIHRoZSBjYWxsZXIgd2lsbCBiZSBjaGVja2VkIGFnYWluc3QgYWxsIHVua25vd24gYXBwbGljYXRpb25zLAogICAgICAqICB3aGljaCBjYXVzZSBzbWFsbGVyIG51bWJlciBvZiBTTVMgdG8gYmUgc2VudCBpbiBjaGVja2luZyBwZXJpb2QuCiAgICAgICogQHBhcmFtIGRlbGl2ZXJ5SW50ZW50IGlmIG5vdCBOVUxMIHRoaXMgPGNvZGU+UGVuZGluZ0ludGVudDwvY29kZT4gaXMKICAgICAgKiAgYnJvYWRjYXN0IHdoZW4gdGhlIG1lc3NhZ2UgaXMgZGVsaXZlcmVkIHRvIHRoZSByZWNpcGllbnQuICBUaGUKQEAgLTIyNCw5ICsyMjQsNiBAQAogICAgICAqIEByZXR1cm4gdGhlIGRlZmF1bHQgaW5zdGFuY2Ugb2YgdGhlIFNtc01hbmFnZXIKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIFNtc01hbmFnZXIgZ2V0RGVmYXVsdCgpIHsKLSAgICAgICAgaWYgKHNJbnN0YW5jZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICBzSW5zdGFuY2UgPSBuZXcgU21zTWFuYWdlcigpOwotICAgICAgICB9CiAgICAgICAgIHJldHVybiBzSW5zdGFuY2U7CiAgICAgfQogCmRpZmYgLS1naXQgYS90ZWxlcGhvbnkvamF2YS9hbmRyb2lkL3RlbGVwaG9ueS9TbXNNZXNzYWdlLmphdmEgYi90ZWxlcGhvbnkvamF2YS9hbmRyb2lkL3RlbGVwaG9ueS9TbXNNZXNzYWdlLmphdmEKaW5kZXggYTI4NGVhNS4uMDc0NjU2MiAxMDA2NDQKLS0tIGEvdGVsZXBob255L2phdmEvYW5kcm9pZC90ZWxlcGhvbnkvU21zTWVzc2FnZS5qYXZhCisrKyBiL3RlbGVwaG9ueS9qYXZhL2FuZHJvaWQvdGVsZXBob255L1Ntc01lc3NhZ2UuamF2YQpAQCAtMjAsNyArMjAsNiBAQAogaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CiAKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuR3NtQWxwaGFiZXQ7Ci1pbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LkVuY29kZUV4Y2VwdGlvbjsKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuU21zSGVhZGVyOwogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5TbXNNZXNzYWdlQmFzZTsKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuU21zTWVzc2FnZUJhc2UuU3VibWl0UGR1QmFzZTsKQEAgLTU0LDYgKzUzLDEwIEBACiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRU5DT0RJTkdfN0JJVCA9IDE7CiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRU5DT0RJTkdfOEJJVCA9IDI7CiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRU5DT0RJTkdfMTZCSVQgPSAzOworICAgIC8qKgorICAgICAqIEBoaWRlIFRoaXMgdmFsdWUgaXMgbm90IGRlZmluZWQgaW4gZ2xvYmFsIHN0YW5kYXJkLiBPbmx5IGluIEtvcmVhLCB0aGlzIGlzIHVzZWQuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRU5DT0RJTkdfS1NDNTYwMSA9IDQ7CiAKICAgICAvKiogVGhlIG1heGltdW0gbnVtYmVyIG9mIHBheWxvYWQgYnl0ZXMgcGVyIG1lc3NhZ2UgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNQVhfVVNFUl9EQVRBX0JZVEVTID0gMTQwOwpkaWZmIC0tZ2l0IGEvdGVsZXBob255L2phdmEvYW5kcm9pZC90ZWxlcGhvbnkvVGVsZXBob255TWFuYWdlci5qYXZhIGIvdGVsZXBob255L2phdmEvYW5kcm9pZC90ZWxlcGhvbnkvVGVsZXBob255TWFuYWdlci5qYXZhCmluZGV4IDI3ZTA4ZDQuLjIzNzBhZGQgMTAwNjQ0Ci0tLSBhL3RlbGVwaG9ueS9qYXZhL2FuZHJvaWQvdGVsZXBob255L1RlbGVwaG9ueU1hbmFnZXIuamF2YQorKysgYi90ZWxlcGhvbnkvamF2YS9hbmRyb2lkL3RlbGVwaG9ueS9UZWxlcGhvbnlNYW5hZ2VyLmphdmEKQEAgLTkxMiw0ICs5MTIsMjUgQEAKICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICB9CiAgICAgfQorCisgICAgLyoqCisgICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBjdXJyZW50IGRldmljZSBpcyAidm9pY2UgY2FwYWJsZSIuCisgICAgICogPHA+CisgICAgICogIlZvaWNlIGNhcGFibGUiIG1lYW5zIHRoYXQgdGhpcyBkZXZpY2Ugc3VwcG9ydHMgY2lyY3VpdC1zd2l0Y2hlZAorICAgICAqIChpLmUuIHZvaWNlKSBwaG9uZSBjYWxscyBvdmVyIHRoZSB0ZWxlcGhvbnkgbmV0d29yaywgYW5kIGlzIGFsbG93ZWQKKyAgICAgKiB0byBkaXNwbGF5IHRoZSBpbi1jYWxsIFVJIHdoaWxlIGEgY2VsbHVsYXIgdm9pY2UgY2FsbCBpcyBhY3RpdmUuCisgICAgICogVGhpcyB3aWxsIGJlIGZhbHNlIG9uICJkYXRhIG9ubHkiIGRldmljZXMgd2hpY2ggY2FuJ3QgbWFrZSB2b2ljZQorICAgICAqIGNhbGxzIGFuZCBkb24ndCBzdXBwb3J0IGFueSBpbi1jYWxsIFVJLgorICAgICAqIDxwPgorICAgICAqIE5vdGU6IHRoZSBtZWFuaW5nIG9mIHRoaXMgZmxhZyBpcyBzdWJ0bHkgZGlmZmVyZW50IGZyb20gdGhlCisgICAgICogUGFja2FnZU1hbmFnZXIuRkVBVFVSRV9URUxFUEhPTlkgc3lzdGVtIGZlYXR1cmUsIHdoaWNoIGlzIGF2YWlsYWJsZQorICAgICAqIG9uIGFueSBkZXZpY2Ugd2l0aCBhIHRlbGVwaG9ueSByYWRpbywgZXZlbiBpZiB0aGUgZGV2aWNlIGlzCisgICAgICogZGF0YS1vbmx5LgorICAgICAqCisgICAgICogQGhpZGUgcGVuZGluZyBBUEkgcmV2aWV3CisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNWb2ljZUNhcGFibGUoKSB7CisgICAgICAgIHJldHVybiBtQ29udGV4dC5nZXRSZXNvdXJjZXMoKS5nZXRCb29sZWFuKAorICAgICAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuYm9vbC5jb25maWdfdm9pY2VfY2FwYWJsZSk7CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L0NvbW1hbmRzSW50ZXJmYWNlLmphdmEgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvQ29tbWFuZHNJbnRlcmZhY2UuamF2YQppbmRleCA1ZGUwNDI2Li4yN2E0ZGNhIDEwMDY0NAotLS0gYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvQ29tbWFuZHNJbnRlcmZhY2UuamF2YQorKysgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvQ29tbWFuZHNJbnRlcmZhY2UuamF2YQpAQCAtMjcsOCArMjcsOCBAQAogICovCiBwdWJsaWMgaW50ZXJmYWNlIENvbW1hbmRzSW50ZXJmYWNlIHsKICAgICBlbnVtIFJhZGlvU3RhdGUgewotICAgICAgICBSQURJT19PRkYsICAgICAgICAgLyogUmFkaW8gZXhwbGljdGx5IHBvd2VyZWQgb2ZmIChlZyBDRlVOPTApICovCi0gICAgICAgIFJBRElPX1VOQVZBSUxBQkxFLCAvKiBSYWRpbyB1bmF2YWlsYWJsZSAoZWcsIHJlc2V0dGluZyBvciBub3QgYm9vdGVkKSAqLworICAgICAgICBSQURJT19PRkYsICAgICAgICAgLyogUmFkaW8gZXhwbGljaXRseSBwb3dlcmVkIG9mZiAoZS5nLiBDRlVOPTApICovCisgICAgICAgIFJBRElPX1VOQVZBSUxBQkxFLCAvKiBSYWRpbyB1bmF2YWlsYWJsZSAoZS5nLiByZXNldHRpbmcgb3Igbm90IGJvb3RlZCkgKi8KICAgICAgICAgU0lNX05PVF9SRUFEWSwgICAgIC8qIFJhZGlvIGlzIG9uLCBidXQgdGhlIFNJTSBpbnRlcmZhY2UgaXMgbm90IHJlYWR5ICovCiAgICAgICAgIFNJTV9MT0NLRURfT1JfQUJTRU5ULCAgLyogU0lNIFBJTiBsb2NrZWQsIFBVSyByZXF1aXJlZCwgbmV0d29yawogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlcnNvbmFsaXphdGlvbiwgb3IgU0lNIGFic2VudCAqLwpAQCAtMTIxLDcgKzEyMSw3IEBACiAgICAgLy8gU2VlIDI3LjAwNyArQ0NGQyBvciArQ0xDSwogICAgIHN0YXRpYyBmaW5hbCBpbnQgU0VSVklDRV9DTEFTU19OT05FICAgICA9IDA7IC8vIG5vIHVzZXIgaW5wdXQKICAgICBzdGF0aWMgZmluYWwgaW50IFNFUlZJQ0VfQ0xBU1NfVk9JQ0UgICAgPSAoMSA8PCAwKTsKLSAgICBzdGF0aWMgZmluYWwgaW50IFNFUlZJQ0VfQ0xBU1NfREFUQSAgICAgPSAoMSA8PCAxKTsgLy9zeW5veW0gZm9yIDE2KzMyKzY0KzEyOAorICAgIHN0YXRpYyBmaW5hbCBpbnQgU0VSVklDRV9DTEFTU19EQVRBICAgICA9ICgxIDw8IDEpOyAvL3N5bm9ueW0gZm9yIDE2KzMyKzY0KzEyOAogICAgIHN0YXRpYyBmaW5hbCBpbnQgU0VSVklDRV9DTEFTU19GQVggICAgICA9ICgxIDw8IDIpOwogICAgIHN0YXRpYyBmaW5hbCBpbnQgU0VSVklDRV9DTEFTU19TTVMgICAgICA9ICgxIDw8IDMpOwogICAgIHN0YXRpYyBmaW5hbCBpbnQgU0VSVklDRV9DTEFTU19EQVRBX1NZTkMgPSAoMSA8PCA0KTsKQEAgLTk1MiwxOSArOTUyLDE5IEBACiAgICAgdm9pZCB3cml0ZVNtc1RvUnVpbShpbnQgc3RhdHVzLCBTdHJpbmcgcGR1LCBNZXNzYWdlIHJlc3BvbnNlKTsKIAogICAgIC8qKgotICAgICAqIEBkZXByZWNhdGVkCiAgICAgICogQHBhcmFtIGFwbgogICAgICAqIEBwYXJhbSB1c2VyCiAgICAgICogQHBhcmFtIHBhc3N3b3JkCiAgICAgICogQHBhcmFtIHJlc3BvbnNlCiAgICAgICovCisgICAgQERlcHJlY2F0ZWQKICAgICB2b2lkIHNldHVwRGVmYXVsdFBEUChTdHJpbmcgYXBuLCBTdHJpbmcgdXNlciwgU3RyaW5nIHBhc3N3b3JkLCBNZXNzYWdlIHJlc3BvbnNlKTsKIAogICAgIC8qKgotICAgICAqIEBkZXByZWNhdGVkCiAgICAgICogQHBhcmFtIGNpZAogICAgICAqIEBwYXJhbSByZXNwb25zZQogICAgICAqLworICAgIEBEZXByZWNhdGVkCiAgICAgdm9pZCBkZWFjdGl2YXRlRGVmYXVsdFBEUChpbnQgY2lkLCBNZXNzYWdlIHJlc3BvbnNlKTsKIAogICAgIHZvaWQgc2V0UmFkaW9Qb3dlcihib29sZWFuIG9uLCBNZXNzYWdlIHJlc3BvbnNlKTsKQEAgLTk3NCw3ICs5NzQsNyBAQAogICAgIHZvaWQgYWNrbm93bGVkZ2VMYXN0SW5jb21pbmdDZG1hU21zKGJvb2xlYW4gc3VjY2VzcywgaW50IGNhdXNlLCBNZXNzYWdlIHJlc3BvbnNlKTsKIAogICAgIC8qKgotICAgICAqIHBhcmFtZXRlcnMgZXF1aXZpbGllbnQgdG8gMjcuMDA3IEFUK0NSU00gY29tbWFuZAorICAgICAqIHBhcmFtZXRlcnMgZXF1aXZhbGVudCB0byAyNy4wMDcgQVQrQ1JTTSBjb21tYW5kCiAgICAgICogcmVzcG9uc2Uub2JqIHdpbGwgYmUgYW4gQXN5bmNSZXN1bHQKICAgICAgKiByZXNwb25zZS5vYmoudXNlck9iaiB3aWxsIGJlIGEgSWNjSW9SZXN1bHQgb24gc3VjY2VzcwogICAgICAqLwpAQCAtMTA3OSw3ICsxMDc5LDcgQEAKIAogICAgIC8qKgogICAgICAqIChBc3luY1Jlc3VsdClyZXNwb25zZS5vYmopLnJlc3VsdCB3aWxsIGJlIGFuIEludGVnZXIgcmVwcmVzZW50aW5nCi0gICAgICogdGhlIHN1bSBvZiBlbmFibGVkIHNlcml2aWNlIGNsYXNzZXMgKHN1bSBvZiBTRVJWSUNFX0NMQVNTXyopCisgICAgICogdGhlIHN1bSBvZiBlbmFibGVkIHNlcnZpY2UgY2xhc3NlcyAoc3VtIG9mIFNFUlZJQ0VfQ0xBU1NfKikKICAgICAgKgogICAgICAqIEBwYXJhbSBmYWNpbGl0eSBvbmUgb2YgQ0JfRkFDSUxUWV8qCiAgICAgICogQHBhcmFtIHBhc3N3b3JkIHBhc3N3b3JkIG9yICIiIGlmIG5vdCByZXF1aXJlZApAQCAtMTE1Miw3ICsxMTUyLDcgQEAKIAogICAgIC8qKgogICAgICAqIFJlcXVlc3QgdG8gZW5hYmxlL2Rpc2FibGUgbmV0d29yayBzdGF0ZSBjaGFuZ2Ugbm90aWZpY2F0aW9ucyB3aGVuCi0gICAgICogbG9jYXRpb24gaW5mb3JtYXRlaW9uIChsYWMgYW5kL29yIGNpZCkgaGFzIGNoYW5nZWQuCisgICAgICogbG9jYXRpb24gaW5mb3JtYXRpb24gKGxhYyBhbmQvb3IgY2lkKSBoYXMgY2hhbmdlZC4KICAgICAgKgogICAgICAqIEBwYXJhbSBlbmFibGUgdHJ1ZSB0byBlbmFibGUsIGZhbHNlIHRvIGRpc2FibGUKICAgICAgKiBAcGFyYW0gcmVzcG9uc2UgY2FsbGJhY2sgbWVzc2FnZQpAQCAtMTE4Myw3ICsxMTgzLDcgQEAKIAogICAgIC8qKgogICAgICAqIEluZGljYXRlcyB0byB0aGUgdmVuZG9yIHJpbCB0aGF0IFN0a1NlcnZpY2UgaXMgcnVubmluZwotICAgICAqIHJhbmQgaXMgZWFkeSB0byByZWNlaXZlIFJJTF9VTlNPTF9TVEtfWFhYWCBjb21tYW5kcy4KKyAgICAgKiBhbmQgaXMgcmVhZHkgdG8gcmVjZWl2ZSBSSUxfVU5TT0xfU1RLX1hYWFggY29tbWFuZHMuCiAgICAgICoKICAgICAgKiBAcGFyYW0gcmVzdWx0IGNhbGxiYWNrIG1lc3NhZ2UKICAgICAgKi8KZGlmZiAtLWdpdCBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9EYXRhQ29ubmVjdGlvbi5qYXZhIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L0RhdGFDb25uZWN0aW9uLmphdmEKaW5kZXggNjYzNDAxNy4uNTIxZDkwYyAxMDA2NDQKLS0tIGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L0RhdGFDb25uZWN0aW9uLmphdmEKKysrIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L0RhdGFDb25uZWN0aW9uLmphdmEKQEAgLTIxLDExICsyMSwxNyBAQAogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnV0aWwuSGllcmFyY2hpY2FsU3RhdGU7CiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudXRpbC5IaWVyYXJjaGljYWxTdGF0ZU1hY2hpbmU7CiAKK2ltcG9ydCBhbmRyb2lkLm5ldC5MaW5rUHJvcGVydGllczsKIGltcG9ydCBhbmRyb2lkLm9zLkFzeW5jUmVzdWx0OwogaW1wb3J0IGFuZHJvaWQub3MuTWVzc2FnZTsKIGltcG9ydCBhbmRyb2lkLm9zLlN5c3RlbVByb3BlcnRpZXM7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkV2ZW50TG9nOwogCitpbXBvcnQgamF2YS5uZXQuSW5ldEFkZHJlc3M7CitpbXBvcnQgamF2YS5uZXQuTmV0d29ya0ludGVyZmFjZTsKK2ltcG9ydCBqYXZhLm5ldC5Tb2NrZXRFeGNlcHRpb247CitpbXBvcnQgamF2YS5uZXQuVW5rbm93bkhvc3RFeGNlcHRpb247CisKIC8qKgogICoge0BoaWRlfQogICoKQEAgLTI1NSwxMCArMjYxLDcgQEAKICAgICBwcm90ZWN0ZWQgaW50IG1UYWc7CiAgICAgcHJvdGVjdGVkIFBob25lQmFzZSBwaG9uZTsKICAgICBwcm90ZWN0ZWQgaW50IGNpZDsKLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGludGVyZmFjZU5hbWU7Ci0gICAgcHJvdGVjdGVkIFN0cmluZyBpcEFkZHJlc3M7Ci0gICAgcHJvdGVjdGVkIFN0cmluZyBnYXRld2F5QWRkcmVzczsKLSAgICBwcm90ZWN0ZWQgU3RyaW5nW10gZG5zU2VydmVyczsKKyAgICBwcm90ZWN0ZWQgTGlua1Byb3BlcnRpZXMgbUxpbmtQcm9wZXJ0aWVzID0gbmV3IExpbmtQcm9wZXJ0aWVzKCk7CiAgICAgcHJvdGVjdGVkIGxvbmcgY3JlYXRlVGltZTsKICAgICBwcm90ZWN0ZWQgbG9uZyBsYXN0RmFpbFRpbWU7CiAgICAgcHJvdGVjdGVkIEZhaWxDYXVzZSBsYXN0RmFpbENhdXNlOwpAQCAtMjgzLDggKzI4Niw2IEBACiAgICAgICAgIGlmIChEQkcpIGxvZygiRGF0YUNvbm5lY3Rpb24gY29uc3RydWN0b3IgRSIpOwogICAgICAgICB0aGlzLnBob25lID0gcGhvbmU7CiAgICAgICAgIHRoaXMuY2lkID0gLTE7Ci0gICAgICAgIHRoaXMuZG5zU2VydmVycyA9IG5ldyBTdHJpbmdbMl07Ci0KICAgICAgICAgY2xlYXJTZXR0aW5ncygpOwogCiAgICAgICAgIHNldERiZyhmYWxzZSk7CkBAIC0zNzcsMTEgKzM3OCw3IEBACiAgICAgICAgIHRoaXMubGFzdEZhaWxUaW1lID0gLTE7CiAgICAgICAgIHRoaXMubGFzdEZhaWxDYXVzZSA9IEZhaWxDYXVzZS5OT05FOwogCi0gICAgICAgIGludGVyZmFjZU5hbWUgPSBudWxsOwotICAgICAgICBpcEFkZHJlc3MgPSBudWxsOwotICAgICAgICBnYXRld2F5QWRkcmVzcyA9IG51bGw7Ci0gICAgICAgIGRuc1NlcnZlcnNbMF0gPSBudWxsOwotICAgICAgICBkbnNTZXJ2ZXJzWzFdID0gbnVsbDsKKyAgICAgICAgbUxpbmtQcm9wZXJ0aWVzID0gbmV3IExpbmtQcm9wZXJ0aWVzKCk7CiAgICAgfQogCiAgICAgLyoqCkBAIC00MTYsMzUgKzQxMyw2OCBAQAogLy8gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHJlc3BvbnNlLmxlbmd0aDsgaSsrKSB7CiAvLyAgICAgICAgICAgICAgICBsb2coIiAgcmVzcG9uc2VbIiArIGkgKyAiXT0nIiArIHJlc3BvbnNlW2ldICsgIiciKTsKIC8vICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBTdGFydCB3aXRoIGNsZWFuIG5ldHdvcmsgcHJvcGVydGllcyBhbmQgaWYgd2UgaGF2ZQorICAgICAgICAgICAgLy8gYSBmYWlsdXJlIHdlJ2xsIGNsZWFyIGFnYWluIGF0IHRoZSBib3R0b20gb2YgdGhpcyBjb2RlLgorICAgICAgICAgICAgTGlua1Byb3BlcnRpZXMgbGlua1Byb3BlcnRpZXMgPSBuZXcgTGlua1Byb3BlcnRpZXMoKTsKICAgICAgICAgICAgIGlmIChyZXNwb25zZS5sZW5ndGggPj0gMikgewogICAgICAgICAgICAgICAgIGNpZCA9IEludGVnZXIucGFyc2VJbnQocmVzcG9uc2VbMF0pOwotICAgICAgICAgICAgICAgIGludGVyZmFjZU5hbWUgPSByZXNwb25zZVsxXTsKLSAgICAgICAgICAgICAgICBpZiAocmVzcG9uc2UubGVuZ3RoID4gMikgewotICAgICAgICAgICAgICAgICAgICBpcEFkZHJlc3MgPSByZXNwb25zZVsyXTsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHByZWZpeCA9ICJuZXQuIiArIGludGVyZmFjZU5hbWUgKyAiLiI7Ci0gICAgICAgICAgICAgICAgICAgIGdhdGV3YXlBZGRyZXNzID0gU3lzdGVtUHJvcGVydGllcy5nZXQocHJlZml4ICsgImd3Iik7Ci0gICAgICAgICAgICAgICAgICAgIGRuc1NlcnZlcnNbMF0gPSBTeXN0ZW1Qcm9wZXJ0aWVzLmdldChwcmVmaXggKyAiZG5zMSIpOwotICAgICAgICAgICAgICAgICAgICBkbnNTZXJ2ZXJzWzFdID0gU3lzdGVtUHJvcGVydGllcy5nZXQocHJlZml4ICsgImRuczIiKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKERCRykgewotICAgICAgICAgICAgICAgICAgICAgICAgbG9nKCJpbnRlcmZhY2U9IiArIGludGVyZmFjZU5hbWUgKyAiIGlwQWRkcmVzcz0iICsgaXBBZGRyZXNzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGdhdGV3YXk9IiArIGdhdGV3YXlBZGRyZXNzICsgIiBETlMxPSIgKyBkbnNTZXJ2ZXJzWzBdCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIEROUzI9IiArIGRuc1NlcnZlcnNbMV0pOwotICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgU3RyaW5nIGludGVyZmFjZU5hbWUgPSByZXNwb25zZVsxXTsKKyAgICAgICAgICAgICAgICByZXN1bHQgPSBTZXR1cFJlc3VsdC5TVUNDRVNTOwogCi0gICAgICAgICAgICAgICAgICAgIGlmIChpc0Ruc09rKGRuc1NlcnZlcnMpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBTZXR1cFJlc3VsdC5TVUNDRVNTOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gU2V0dXBSZXN1bHQuRVJSX0JhZERuczsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcHJlZml4ID0gIm5ldC4iICsgaW50ZXJmYWNlTmFtZSArICIuIjsKKworICAgICAgICAgICAgICAgICAgICBsaW5rUHJvcGVydGllcy5zZXRJbnRlcmZhY2UoTmV0d29ya0ludGVyZmFjZS5nZXRCeU5hbWUoaW50ZXJmYWNlTmFtZSkpOworCisgICAgICAgICAgICAgICAgICAgIC8vIFRPRE86IEdldCBnYXRld2F5IGFuZCBkbnMgdmlhIFJJTCBpbnRlcmZhY2Ugbm90IHByb3BlcnR5PworICAgICAgICAgICAgICAgICAgICBTdHJpbmcgZ2F0ZXdheUFkZHJlc3MgPSBTeXN0ZW1Qcm9wZXJ0aWVzLmdldChwcmVmaXggKyAiZ3ciKTsKKyAgICAgICAgICAgICAgICAgICAgbGlua1Byb3BlcnRpZXMuc2V0R2F0ZXdheShJbmV0QWRkcmVzcy5nZXRCeU5hbWUoZ2F0ZXdheUFkZHJlc3MpKTsKKworICAgICAgICAgICAgICAgICAgICBpZiAocmVzcG9uc2UubGVuZ3RoID4gMikgeworICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGlwQWRkcmVzcyA9IHJlc3BvbnNlWzJdOworICAgICAgICAgICAgICAgICAgICAgICAgbGlua1Byb3BlcnRpZXMuYWRkQWRkcmVzcyhJbmV0QWRkcmVzcy5nZXRCeU5hbWUoaXBBZGRyZXNzKSk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPRE86IEdldCBnYXRld2F5IGFuZCBkbnMgdmlhIFJJTCBpbnRlcmZhY2Ugbm90IHByb3BlcnR5PworICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGRuc1NlcnZlcnNbXSA9IG5ldyBTdHJpbmdbMl07CisgICAgICAgICAgICAgICAgICAgICAgICBkbnNTZXJ2ZXJzWzBdID0gU3lzdGVtUHJvcGVydGllcy5nZXQocHJlZml4ICsgImRuczEiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRuc1NlcnZlcnNbMV0gPSBTeXN0ZW1Qcm9wZXJ0aWVzLmdldChwcmVmaXggKyAiZG5zMiIpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzRG5zT2soZG5zU2VydmVycykpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5rUHJvcGVydGllcy5hZGREbnMoSW5ldEFkZHJlc3MuZ2V0QnlOYW1lKGRuc1NlcnZlcnNbMF0pKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5rUHJvcGVydGllcy5hZGREbnMoSW5ldEFkZHJlc3MuZ2V0QnlOYW1lKGRuc1NlcnZlcnNbMV0pKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gU2V0dXBSZXN1bHQuRVJSX0JhZERuczsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IFNldHVwUmVzdWx0LlNVQ0NFU1M7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoVW5rbm93bkhvc3RFeGNlcHRpb24gZTEpIHsKKyAgICAgICAgICAgICAgICAgICAgbG9nKCJvblNldHVwQ29tcGxldGVkOiBVbmtub3dIb3N0RXhjZXB0aW9uICIgKyBlMSk7CisgICAgICAgICAgICAgICAgICAgIGUxLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBTZXR1cFJlc3VsdC5FUlJfT3RoZXI7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoU29ja2V0RXhjZXB0aW9uIGUyKSB7CisgICAgICAgICAgICAgICAgICAgIGxvZygib25TZXR1cENvbXBsZXRlZDogU29ja2V0RXhjZXB0aW9uICIgKyBlMik7CisgICAgICAgICAgICAgICAgICAgIGUyLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBTZXR1cFJlc3VsdC5FUlJfT3RoZXI7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBsb2coIm9uU2V0dXBDb21wbGV0ZWQ6IGVycm9yOyBleHBlY3RlZCBudW1iZXIgb2YgcmVzcG9uc2VzID49IDIgd2FzICIgKworICAgICAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2UubGVuZ3RoKTsKICAgICAgICAgICAgICAgICByZXN1bHQgPSBTZXR1cFJlc3VsdC5FUlJfT3RoZXI7CiAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIEFuIGVycm9yIG9jY3VycmVkIHNvIGNsZWFyIHByb3BlcnRpZXMKKyAgICAgICAgICAgIGlmIChyZXN1bHQgIT0gU2V0dXBSZXN1bHQuU1VDQ0VTUykgeworICAgICAgICAgICAgICAgIGxvZygib25TZXR1cENvbXBsZXRlZCB3aXRoIGFuIGVycm9yIGNsZWFyaW5nIExpbmtQcm9wZXJ0aWVzIik7CisgICAgICAgICAgICAgICAgbGlua1Byb3BlcnRpZXMuY2xlYXIoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1MaW5rUHJvcGVydGllcyA9IGxpbmtQcm9wZXJ0aWVzOwogICAgICAgICB9CiAKLSAgICAgICAgaWYgKERCRykgbG9nKCJEYXRhQ29ubmVjdGlvbiBzZXR1cCByZXN1bHQ9JyIgKyByZXN1bHQgKyAiJyBvbiBjaWQ9IiArIGNpZCk7CisgICAgICAgIGlmIChEQkcpIHsKKyAgICAgICAgICAgIGxvZygiRGF0YUNvbm5lY3Rpb24gc2V0dXAgcmVzdWx0PSciICsgcmVzdWx0ICsgIicgb24gY2lkPSIgKyBjaWQpOworICAgICAgICAgICAgaWYgKHJlc3VsdCA9PSBTZXR1cFJlc3VsdC5TVUNDRVNTKSB7CisgICAgICAgICAgICAgICAgbG9nKCJMaW5rUHJvcGVydGllczogIiArIG1MaW5rUHJvcGVydGllcy50b1N0cmluZygpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQogICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgIH0KIApAQCAtNjA2LDcgKzYzNiwxNiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBFUlJfQmFkRG5zOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIENvbm5lY3Rpb24gc3VjY2VlZGVkIGJ1dCBETlMgaW5mbyBpcyBiYWQgc28gZGlzY29ubmVjdAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV2ZW50TG9nLndyaXRlRXZlbnQoRXZlbnRMb2dUYWdzLlBEUF9CQURfRE5TX0FERFJFU1MsIGRuc1NlcnZlcnNbMF0pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ0J1aWxkZXIgZG5zQWRkcmVzc2VzU2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoSW5ldEFkZHJlc3MgYWRkciA6IG1MaW5rUHJvcGVydGllcy5nZXREbnNlcygpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkbnNBZGRyZXNzZXNTYi5sZW5ndGgoKSAhPSAwKSBkbnNBZGRyZXNzZXNTYi5hcHBlbmQoIiAiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG5zQWRkcmVzc2VzU2IuYXBwZW5kKGFkZHIudG9TdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkbnNBZGRyZXNzZXNTYi5sZW5ndGgoKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRuc0FkZHJlc3Nlc1NiLmFwcGVuZCgibm8tZG5zLWFkZHJlc3NlcyIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBFdmVudExvZy53cml0ZUV2ZW50KEV2ZW50TG9nVGFncy5QRFBfQkFEX0ROU19BRERSRVNTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG5zQWRkcmVzc2VzU2IudG9TdHJpbmcoKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVhckRvd25EYXRhKGNwKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2l0aW9uVG8obURpc2Nvbm5lY3RpbmdCYWREbnNTdGF0ZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CkBAIC04NzMsMzEgKzkxMiwxMCBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEByZXR1cm4gdGhlIGludGVyZmFjZSBuYW1lIGFzIGEgc3RyaW5nLgorICAgICAqIEByZXR1cm4gdGhlIGNvbm5lY3Rpb25zIExpbmtQcm9wZXJ0aWVzCiAgICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRJbnRlcmZhY2UoKSB7Ci0gICAgICAgIHJldHVybiBpbnRlcmZhY2VOYW1lOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gdGhlIGlwIGFkZHJlc3MgYXMgYSBzdHJpbmcuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRJcEFkZHJlc3MoKSB7Ci0gICAgICAgIHJldHVybiBpcEFkZHJlc3M7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHJldHVybiB0aGUgZ2F0ZXdheSBhZGRyZXNzIGFzIGEgc3RyaW5nLgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0R2F0ZXdheUFkZHJlc3MoKSB7Ci0gICAgICAgIHJldHVybiBnYXRld2F5QWRkcmVzczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIGFuIGFycmF5IG9mIGFzc29jaWF0ZWQgRE5TIGFkZHJlc3Nlcy4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nW10gZ2V0RG5zU2VydmVycygpIHsKLSAgICAgICAgcmV0dXJuIGRuc1NlcnZlcnM7CisgICAgcHVibGljIExpbmtQcm9wZXJ0aWVzIGdldExpbmtQcm9wZXJ0aWVzKCkgeworICAgICAgICByZXR1cm4gbmV3IExpbmtQcm9wZXJ0aWVzKG1MaW5rUHJvcGVydGllcyk7CiAgICAgfQogCiAgICAgLyoqCmRpZmYgLS1naXQgYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvRGF0YUNvbm5lY3Rpb25UcmFja2VyLmphdmEgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvRGF0YUNvbm5lY3Rpb25UcmFja2VyLmphdmEKaW5kZXggM2I5ZTZjYy4uNzY1ZjY0YiAxMDA2NDQKLS0tIGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L0RhdGFDb25uZWN0aW9uVHJhY2tlci5qYXZhCisrKyBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9EYXRhQ29ubmVjdGlvblRyYWNrZXIuamF2YQpAQCAtMTcsMTAgKzE3LDEwIEBACiBwYWNrYWdlIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueTsKIAogaW1wb3J0IGFuZHJvaWQuYXBwLlBlbmRpbmdJbnRlbnQ7CitpbXBvcnQgYW5kcm9pZC5uZXQuTGlua1Byb3BlcnRpZXM7CiBpbXBvcnQgYW5kcm9pZC5vcy5Bc3luY1Jlc3VsdDsKIGltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXI7CiBpbXBvcnQgYW5kcm9pZC5vcy5NZXNzYWdlOwotaW1wb3J0IGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uOwogaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuU2V0dGluZ3M7CiBpbXBvcnQgYW5kcm9pZC5wcm92aWRlci5TZXR0aW5ncy5TZXR0aW5nTm90Rm91bmRFeGNlcHRpb247CiBpbXBvcnQgYW5kcm9pZC50ZXh0LlRleHRVdGlsczsKQEAgLTI4LDYgKzI4LDcgQEAKIAogaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CiAKKwogLyoqCiAgKiB7QGhpZGV9CiAgKgpAQCAtMTg4LDcgKzE4OSwxMyBAQAogICAgIC8qKiBDSUQgb2YgYWN0aXZlIGRhdGEgY29ubmVjdGlvbiAqLwogICAgIHByb3RlY3RlZCBpbnQgY2lkQWN0aXZlOwogCi0gICAvKioKKyAgICAvKiogaW5kaWNhdGlvbiBvZiBvdXIgYXZhaWxhYmlsaXR5IChwcmVjb25kaXRpb25zIHRvIHRyeXNldHVwRGF0YSBhcmUgbWV0KSAqKi8KKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiBtQXZhaWxhYmlsaXR5ID0gZmFsc2U7CisKKyAgICAvKiogYWxsIG91ciBsaW5rIHByb3BlcnRpZXMgKGRucywgZ2F0ZXdheSwgaXAsIGV0YykgKi8KKyAgICBwcm90ZWN0ZWQgTGlua1Byb3BlcnRpZXMgbUxpbmtQcm9wZXJ0aWVzOworCisgICAgLyoqCiAgICAgICogRGVmYXVsdCBjb25zdHJ1Y3RvcgogICAgICAqLwogICAgIHByb3RlY3RlZCBEYXRhQ29ubmVjdGlvblRyYWNrZXIoUGhvbmVCYXNlIHBob25lKSB7CkBAIC00MTEsMTcgKzQxOCw5NSBAQAogCiAgICAgcHVibGljIGFic3RyYWN0IEFycmF5TGlzdDxEYXRhQ29ubmVjdGlvbj4gZ2V0QWxsRGF0YUNvbm5lY3Rpb25zKCk7CiAKLSAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgU3RyaW5nIGdldEludGVyZmFjZU5hbWUoU3RyaW5nIGFwblR5cGUpOwotCi0gICAgcHJvdGVjdGVkIGFic3RyYWN0IFN0cmluZyBnZXRJcEFkZHJlc3MoU3RyaW5nIGFwblR5cGUpOwotCi0gICAgcHJvdGVjdGVkIGFic3RyYWN0IFN0cmluZyBnZXRHYXRld2F5KFN0cmluZyBhcG5UeXBlKTsKLQotICAgIHByb3RlY3RlZCBhYnN0cmFjdCBTdHJpbmdbXSBnZXREbnNTZXJ2ZXJzKFN0cmluZyBhcG5UeXBlKTsKLQogICAgIHByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIHNldFN0YXRlKFN0YXRlIHMpOwogCi0gICAgcHJvdGVjdGVkIHN5bmNocm9uaXplZCBib29sZWFuIGlzRW5hYmxlZChpbnQgaWQpIHsKKyAgICBwcm90ZWN0ZWQgTGlua1Byb3BlcnRpZXMgZ2V0TGlua1Byb3BlcnRpZXMoU3RyaW5nIGFwblR5cGUpIHsKKyAgICAgICAgaW50IGlkID0gYXBuVHlwZVRvSWQoYXBuVHlwZSk7CisgICAgICAgIGlmIChpc0FwbklkRW5hYmxlZChpZCkpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgTGlua1Byb3BlcnRpZXMobUxpbmtQcm9wZXJ0aWVzKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gdGVsbCBhbGwgYWN0aXZlIGFwbnMgb2YgdGhlIGN1cnJlbnQgY29uZGl0aW9uCisgICAgcHJvdGVjdGVkIHZvaWQgbm90aWZ5RGF0YUNvbm5lY3Rpb24oU3RyaW5nIHJlYXNvbikgeworICAgICAgICBmb3IgKGludCBpZCA9IDA7IGlkIDwgQVBOX05VTV9UWVBFUzsgaWQrKykgeworICAgICAgICAgICAgaWYgKGRhdGFFbmFibGVkW2lkXSkgeworICAgICAgICAgICAgICAgIHBob25lLm5vdGlmeURhdGFDb25uZWN0aW9uKHJlYXNvbiwgYXBuSWRUb1R5cGUoaWQpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBub3RpZnlEYXRhQXZhaWxhYmlsaXR5KHJlYXNvbik7CisgICAgfQorCisgICAgLy8gYSBuZXcgQVBOIGhhcyBnb25lIGFjdGl2ZSBhbmQgbmVlZHMgdG8gc2VuZCBldmVudHMgdG8gY2F0Y2ggdXAgd2l0aCB0aGUgY3VycmVudCBjb25kaXRpb24KKyAgICBwcml2YXRlIHZvaWQgbm90aWZ5QXBuSWRVcFRvQ3VycmVudChTdHJpbmcgcmVhc29uLCBpbnQgYXBuSWQpIHsKKyAgICAgICAgc3dpdGNoIChzdGF0ZSkgeworICAgICAgICAgICAgY2FzZSBJRExFOgorICAgICAgICAgICAgY2FzZSBJTklUSU5HOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBDT05ORUNUSU5HOgorICAgICAgICAgICAgY2FzZSBTQ0FOTklORzoKKyAgICAgICAgICAgICAgICBwaG9uZS5ub3RpZnlEYXRhQ29ubmVjdGlvbihyZWFzb24sIGFwbklkVG9UeXBlKGFwbklkKSwgUGhvbmUuRGF0YVN0YXRlLkNPTk5FQ1RJTkcpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBDT05ORUNURUQ6CisgICAgICAgICAgICBjYXNlIERJU0NPTk5FQ1RJTkc6CisgICAgICAgICAgICAgICAgcGhvbmUubm90aWZ5RGF0YUNvbm5lY3Rpb24ocmVhc29uLCBhcG5JZFRvVHlwZShhcG5JZCksIFBob25lLkRhdGFTdGF0ZS5DT05ORUNUSU5HKTsKKyAgICAgICAgICAgICAgICBwaG9uZS5ub3RpZnlEYXRhQ29ubmVjdGlvbihyZWFzb24sIGFwbklkVG9UeXBlKGFwbklkKSwgUGhvbmUuRGF0YVN0YXRlLkNPTk5FQ1RFRCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBzaW5jZSB3ZSBub3JtYWxseSBkb24ndCBzZW5kIGluZm8gdG8gYSBkaXNjb25uZWN0ZWQgQVBOLCB3ZSBuZWVkIHRvIGRvIHRoaXMgc3BlY2lhbGx5CisgICAgcHJpdmF0ZSB2b2lkIG5vdGlmeUFwbklkRGlzY29ubmVjdGVkKFN0cmluZyByZWFzb24sIGludCBhcG5JZCkgeworICAgICAgICBwaG9uZS5ub3RpZnlEYXRhQ29ubmVjdGlvbihyZWFzb24sIGFwbklkVG9UeXBlKGFwbklkKSwgUGhvbmUuRGF0YVN0YXRlLkRJU0NPTk5FQ1RFRCk7CisgICAgfQorCisgICAgLy8gZGlzYWJsZWQgYXBuJ3Mgc3RpbGwgbmVlZCBhdmFpbC91bmF2YWlsIG5vdGlmaWNpYXRpb25zIC0gc2VuZCB0aGVtIG91dAorICAgIHByb3RlY3RlZCB2b2lkIG5vdGlmeU9mZkFwbnNPZkF2YWlsYWJpbGl0eShTdHJpbmcgcmVhc29uLCBib29sZWFuIGF2YWlsYWJpbGl0eSkgeworICAgICAgICBpZiAobUF2YWlsYWJpbGl0eSA9PSBhdmFpbGFiaWxpdHkpIHJldHVybjsKKyAgICAgICAgbUF2YWlsYWJpbGl0eSA9IGF2YWlsYWJpbGl0eTsKKyAgICAgICAgZm9yIChpbnQgaWQgPSAwOyBpZCA8IEFQTl9OVU1fVFlQRVM7IGlkKyspIHsKKyAgICAgICAgICAgIGlmICghaXNBcG5JZEVuYWJsZWQoaWQpKSB7CisgICAgICAgICAgICAgICAgbm90aWZ5QXBuSWREaXNjb25uZWN0ZWQocmVhc29uLCBpZCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyB3ZSBoYWQgYW4gYXZhaWxhYmlsaXR5IGNoYW5nZSAtIHRlbGwgdGhlIGxpc3RlbmVycworICAgIHByb3RlY3RlZCB2b2lkIG5vdGlmeURhdGFBdmFpbGFiaWxpdHkoU3RyaW5nIHJlYXNvbikgeworICAgICAgICAvLyBub3RlIHRoYXQgd2UgZWl0aGVyIGp1c3QgdHVybmVkIGFsbCBvZmYgYmVjYXVzZSB3ZSBsb3N0IGF2YWlsYWJpbGl0eQorICAgICAgICAvLyBvciBhbGwgd2VyZSBvZmYgYW5kIGNvdWxkIG5vdyBnbyBvbiwgc28gb25seSBoYXZlIG9mZiBhcG5zIHRvIHdvcnJ5IGFib3V0CisgICAgICAgIG5vdGlmeU9mZkFwbnNPZkF2YWlsYWJpbGl0eShyZWFzb24sIGlzRGF0YVBvc3NpYmxlKCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSBvbmx5IGNpcmN1bXN0YW5jZXMgdW5kZXIgd2hpY2ggd2UgcmVwb3J0IHRoYXQgZGF0YSBjb25uZWN0aXZpdHkgaXMgbm90CisgICAgICogcG9zc2libGUgYXJlCisgICAgICogPHVsPgorICAgICAqIDxsaT5EYXRhIGlzIGRpc2FsbG93ZWQgKHJvYW1pbmcsIHBvd2VyIHN0YXRlLCB2b2ljZSBjYWxsLCBldGMpLjwvbGk+CisgICAgICogPGxpPlRoZSBjdXJyZW50IGRhdGEgc3RhdGUgaXMge0Bjb2RlIERJU0NPTk5FQ1RFRH0gZm9yIGEgcmVhc29uIG90aGVyIHRoYW4KKyAgICAgKiBoYXZpbmcgZXhwbGljaXRseSBkaXNhYmxlZCBjb25uZWN0aXZpdHkuIEluIG90aGVyIHdvcmRzLCBkYXRhIGlzIG5vdCBhdmFpbGFibGUKKyAgICAgKiBiZWNhdXNlIHRoZSBwaG9uZSBpcyBvdXQgb2YgY292ZXJhZ2Ugb3Igc29tZSBsaWtlIHJlYXNvbi48L2xpPgorICAgICAqIDwvdWw+CisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgZGF0YSBjb25uZWN0aXZpdHkgaXMgcG9zc2libGUsIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlLgorICAgICAqLworICAgIHByb3RlY3RlZCBib29sZWFuIGlzRGF0YVBvc3NpYmxlKCkgeworICAgICAgICBib29sZWFuIHBvc3NpYmxlID0gKGlzRGF0YUFsbG93ZWQoKSAmJgorICAgICAgICAgICAgIShnZXREYXRhRW5hYmxlZCgpICYmIChzdGF0ZSA9PSBTdGF0ZS5GQUlMRUQgfHwgc3RhdGUgPT0gU3RhdGUuSURMRSkpKTsKKyAgICAgICAgaWYgKCFwb3NzaWJsZSAmJiBEQkcgJiYgaXNEYXRhQWxsb3dlZCgpKSB7CisgICAgICAgICAgICBsb2coIkRhdGEgbm90IHBvc3NpYmxlLiAgTm8gY292ZXJhZ2U6IGRhdGFTdGF0ZSA9ICIgKyBzdGF0ZSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHBvc3NpYmxlOworICAgIH0KKworICAgIHByb3RlY3RlZCBhYnN0cmFjdCBib29sZWFuIGlzRGF0YUFsbG93ZWQoKTsKKworICAgIHB1YmxpYyBib29sZWFuIGlzQXBuVHlwZUVuYWJsZWQoU3RyaW5nIGFwblR5cGUpIHsKKyAgICAgICAgcmV0dXJuIGlzQXBuSWRFbmFibGVkKGFwblR5cGVUb0lkKGFwblR5cGUpKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgc3luY2hyb25pemVkIGJvb2xlYW4gaXNBcG5JZEVuYWJsZWQoaW50IGlkKSB7CiAgICAgICAgIGlmIChpZCAhPSBBUE5fSU5WQUxJRF9JRCkgewogICAgICAgICAgICAgcmV0dXJuIGRhdGFFbmFibGVkW2lkXTsKICAgICAgICAgfQpAQCAtNDQ0LDIyICs1MjksMjEgQEAKICAgICAgICAgICAgIHJldHVybiBQaG9uZS5BUE5fUkVRVUVTVF9GQUlMRUQ7CiAgICAgICAgIH0KIAotICAgICAgICBpZiAoREJHKSBMb2cuZChMT0dfVEFHLCAiZW5hYmxlQXBuVHlwZSgiK3R5cGUrIiksIGlzQXBuVHlwZUFjdGl2ZSA9ICIKLSAgICAgICAgICAgICAgICArIGlzQXBuVHlwZUFjdGl2ZSh0eXBlKSArICIgYW5kIHN0YXRlID0gIiArIHN0YXRlKTsKKyAgICAgICAgaWYgKERCRykgeworICAgICAgICAgICAgTG9nLmQoTE9HX1RBRywgImVuYWJsZUFwblR5cGUoIiArIHR5cGUgKyAiKSwgaXNBcG5UeXBlQWN0aXZlID0gIgorICAgICAgICAgICAgICAgICAgICArIGlzQXBuVHlwZUFjdGl2ZSh0eXBlKSArICIsIGlzQXBuSWRFbmFibGVkID0iICsgaXNBcG5JZEVuYWJsZWQoaWQpICsKKyAgICAgICAgICAgICAgICAgICAgIiBhbmQgc3RhdGUgPSAiICsgc3RhdGUpOworICAgICAgICB9CiAKICAgICAgICAgaWYgKCFpc0FwblR5cGVBdmFpbGFibGUodHlwZSkpIHsKICAgICAgICAgICAgIGlmIChEQkcpIExvZy5kKExPR19UQUcsICJ0eXBlIG5vdCBhdmFpbGFibGUiKTsKICAgICAgICAgICAgIHJldHVybiBQaG9uZS5BUE5fVFlQRV9OT1RfQVZBSUxBQkxFOwogICAgICAgICB9CiAKLSAgICAgICAgLy8ganVzdCBiZWNhdXNlIGl0J3MgYWN0aXZlIGRvZXNuJ3QgbWVhbiB3ZSBoYWQgaXQgZXhwbGljaXRseSByZXF1ZXN0ZWQgYmVmb3JlCi0gICAgICAgIC8vIChhIGJyb2FkIGRlZmF1bHQgbWF5IGhhbmRsZSBtYW55IHR5cGVzKS4gIG1ha2Ugc3VyZSB3ZSBtYXJrIGl0IGVuYWJsZWQKLSAgICAgICAgLy8gc28gaWYgdGhlIGRlZmF1bHQgaXMgZGlzYWJsZWQgd2Uga2VlcCB0aGUgY29ubmVjdGlvbiBmb3Igb3RoZXJzCi0gICAgICAgIHNldEVuYWJsZWQoaWQsIHRydWUpOwotCi0gICAgICAgIGlmIChpc0FwblR5cGVBY3RpdmUodHlwZSkpIHsKLSAgICAgICAgICAgIGlmIChzdGF0ZSA9PSBTdGF0ZS5JTklUSU5HKSByZXR1cm4gUGhvbmUuQVBOX1JFUVVFU1RfU1RBUlRFRDsKLSAgICAgICAgICAgIGVsc2UgaWYgKHN0YXRlID09IFN0YXRlLkNPTk5FQ1RFRCkgcmV0dXJuIFBob25lLkFQTl9BTFJFQURZX0FDVElWRTsKKyAgICAgICAgaWYgKGlzQXBuSWRFbmFibGVkKGlkKSkgeworICAgICAgICAgICAgcmV0dXJuIFBob25lLkFQTl9BTFJFQURZX0FDVElWRTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHNldEVuYWJsZWQoaWQsIHRydWUpOwogICAgICAgICB9CiAgICAgICAgIHJldHVybiBQaG9uZS5BUE5fUkVRVUVTVF9TVEFSVEVEOwogICAgIH0KQEAgLTQ3OCw3ICs1NjIsNyBAQAogICAgICAgICBpZiAoaWQgPT0gQVBOX0lOVkFMSURfSUQpIHsKICAgICAgICAgICAgIHJldHVybiBQaG9uZS5BUE5fUkVRVUVTVF9GQUlMRUQ7CiAgICAgICAgIH0KLSAgICAgICAgaWYgKGlzRW5hYmxlZChpZCkpIHsKKyAgICAgICAgaWYgKGlzQXBuSWRFbmFibGVkKGlkKSkgewogICAgICAgICAgICAgc2V0RW5hYmxlZChpZCwgZmFsc2UpOwogICAgICAgICAgICAgaWYgKGlzQXBuVHlwZUFjdGl2ZShQaG9uZS5BUE5fVFlQRV9ERUZBVUxUKSkgewogICAgICAgICAgICAgICAgIGlmIChkYXRhRW5hYmxlZFtBUE5fREVGQVVMVF9JRF0pIHsKQEAgLTQ5NSw5ICs1NzksMTAgQEAKICAgICB9CiAKICAgICBwcml2YXRlIHZvaWQgc2V0RW5hYmxlZChpbnQgaWQsIGJvb2xlYW4gZW5hYmxlKSB7Ci0gICAgICAgIGlmIChEQkcpIExvZy5kKExPR19UQUcsICJzZXRFbmFibGVkKCIgKyBpZCArICIsICIgKyBlbmFibGUgKyAiKSB3aXRoIG9sZCBzdGF0ZSA9ICIgKwotICAgICAgICAgICAgICAgIGRhdGFFbmFibGVkW2lkXSArICIgYW5kIGVuYWJsZWRDb3VudCA9ICIgKyBlbmFibGVkQ291bnQpOwotCisgICAgICAgIGlmIChEQkcpIHsKKyAgICAgICAgICAgIExvZy5kKExPR19UQUcsICJzZXRFbmFibGVkKCIgKyBpZCArICIsICIgKyBlbmFibGUgKyAiKSB3aXRoIG9sZCBzdGF0ZSA9ICIKKyAgICAgICAgICAgICAgICAgICAgKyBkYXRhRW5hYmxlZFtpZF0gKyAiIGFuZCBlbmFibGVkQ291bnQgPSAiICsgZW5hYmxlZENvdW50KTsKKyAgICAgICAgfQogICAgICAgICBNZXNzYWdlIG1zZyA9IG9idGFpbk1lc3NhZ2UoRVZFTlRfRU5BQkxFX05FV19BUE4pOwogICAgICAgICBtc2cuYXJnMSA9IGlkOwogICAgICAgICBtc2cuYXJnMiA9IChlbmFibGUgPyBFTkFCTEVEIDogRElTQUJMRUQpOwpAQCAtNTA3LDkgKzU5Miw4IEBACiAgICAgcHJvdGVjdGVkIHN5bmNocm9uaXplZCB2b2lkIG9uRW5hYmxlQXBuKGludCBhcG5JZCwgaW50IGVuYWJsZWQpIHsKICAgICAgICAgaWYgKERCRykgewogICAgICAgICAgICAgTG9nLmQoTE9HX1RBRywgIkVWRU5UX0FQTl9FTkFCTEVfUkVRVUVTVCAiICsgYXBuSWQgKyAiLCAiICsgZW5hYmxlZCk7Ci0gICAgICAgICAgICBMb2cuZChMT0dfVEFHLCAiIGRhdGFFbmFibGVkID0gIiArIGRhdGFFbmFibGVkW2FwbklkXSArCi0gICAgICAgICAgICAgICAgICAgICIsIGVuYWJsZWRDb3VudCA9ICIgKyBlbmFibGVkQ291bnQgKwotICAgICAgICAgICAgICAgICAgICAiLCBpc0FwblR5cGVBY3RpdmUgPSAiICsgaXNBcG5UeXBlQWN0aXZlKGFwbklkVG9UeXBlKGFwbklkKSkpOworICAgICAgICAgICAgTG9nLmQoTE9HX1RBRywgIiBkYXRhRW5hYmxlZCA9ICIgKyBkYXRhRW5hYmxlZFthcG5JZF0gKyAiLCBlbmFibGVkQ291bnQgPSAiCisgICAgICAgICAgICAgICAgICAgICsgZW5hYmxlZENvdW50ICsgIiwgaXNBcG5UeXBlQWN0aXZlID0gIiArIGlzQXBuVHlwZUFjdGl2ZShhcG5JZFRvVHlwZShhcG5JZCkpKTsKICAgICAgICAgfQogICAgICAgICBpZiAoZW5hYmxlZCA9PSBFTkFCTEVEKSB7CiAgICAgICAgICAgICBpZiAoIWRhdGFFbmFibGVkW2FwbklkXSkgewpAQCAtNTIwLDYgKzYwNCw4IEBACiAgICAgICAgICAgICBpZiAoIWlzQXBuVHlwZUFjdGl2ZSh0eXBlKSkgewogICAgICAgICAgICAgICAgIG1SZXF1ZXN0ZWRBcG5UeXBlID0gdHlwZTsKICAgICAgICAgICAgICAgICBvbkVuYWJsZU5ld0FwbigpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBub3RpZnlBcG5JZFVwVG9DdXJyZW50KFBob25lLlJFQVNPTl9BUE5fU1dJVENIRUQsIGFwbklkKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIC8vIGRpc2FibGUKQEAgLTUyOCw4ICs2MTQsMTcgQEAKICAgICAgICAgICAgICAgICBlbmFibGVkQ291bnQtLTsKICAgICAgICAgICAgICAgICBpZiAoZW5hYmxlZENvdW50ID09IDApIHsKICAgICAgICAgICAgICAgICAgICAgb25DbGVhblVwQ29ubmVjdGlvbih0cnVlLCBQaG9uZS5SRUFTT05fREFUQV9ESVNBQkxFRCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChkYXRhRW5hYmxlZFtBUE5fREVGQVVMVF9JRF0gPT0gdHJ1ZSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgIWlzQXBuVHlwZUFjdGl2ZShQaG9uZS5BUE5fVFlQRV9ERUZBVUxUKSkgeworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vIHNlbmQgdGhlIGRpc2Nvbm5lY3QgbXNnIG1hbnVhbGx5LCBzaW5jZSB0aGUgbm9ybWFsIHJvdXRlIHdvbnQgc2VuZAorICAgICAgICAgICAgICAgIC8vIGl0IChpdCdzIG5vdCBlbmFibGVkKQorICAgICAgICAgICAgICAgIG5vdGlmeUFwbklkRGlzY29ubmVjdGVkKFBob25lLlJFQVNPTl9EQVRBX0RJU0FCTEVELCBhcG5JZCk7CisgICAgICAgICAgICAgICAgaWYgKGRhdGFFbmFibGVkW0FQTl9ERUZBVUxUX0lEXSA9PSB0cnVlCisgICAgICAgICAgICAgICAgICAgICAgICAmJiAhaXNBcG5UeXBlQWN0aXZlKFBob25lLkFQTl9UWVBFX0RFRkFVTFQpKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIFRPRE8gLSB0aGlzIGlzIGFuIHVnbHkgd2F5IHRvIHJlc3RvcmUgdGhlIGRlZmF1bHQgY29ubiAtIHNob3VsZCBiZSBkb25lCisgICAgICAgICAgICAgICAgICAgIC8vIGJ5IGEgcmVhbCBjb250ZW50aW9uIG1hbmFnZXIgYW5kIHBvbGljeSB0aGF0IGRpc2Nvbm5lY3RzIHRoZSBsb3dlciBwcmkKKyAgICAgICAgICAgICAgICAgICAgLy8gc3R1ZmYgYXMgZW5hYmxlIHJlcXVlc3RzIGNvbWUgaW4gYW5kIHBvcHMgdGhlbSBiYWNrIG9uIGFzIHdlIGRpc2FibGUgYmFjaworICAgICAgICAgICAgICAgICAgICAvLyBkb3duIHRvIHRoZSBsb3dlciBwcmkgc3R1ZmYKICAgICAgICAgICAgICAgICAgICAgbVJlcXVlc3RlZEFwblR5cGUgPSBQaG9uZS5BUE5fVFlQRV9ERUZBVUxUOwogICAgICAgICAgICAgICAgICAgICBvbkVuYWJsZU5ld0FwbigpOwogICAgICAgICAgICAgICAgIH0KQEAgLTU3NCw5ICs2NjksMTEgQEAKICAgICAgICAgICAgICAgICBvblRyeVNldHVwRGF0YShQaG9uZS5SRUFTT05fREFUQV9FTkFCTEVEKTsKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgb25DbGVhblVwQ29ubmVjdGlvbih0cnVlLCBQaG9uZS5SRUFTT05fREFUQV9ESVNBQkxFRCk7Ci0gICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KIAotCisgICAgcHJvdGVjdGVkIExpbmtQcm9wZXJ0aWVzIGdldExpbmtQcm9wZXJ0aWVzKERhdGFDb25uZWN0aW9uIGNvbm5lY3Rpb24pIHsKKyAgICAgICAgcmV0dXJuIGNvbm5lY3Rpb24uZ2V0TGlua1Byb3BlcnRpZXMoKTsKKyAgICB9CiB9CmRpZmYgLS1naXQgYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvRGVmYXVsdFBob25lTm90aWZpZXIuamF2YSBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9EZWZhdWx0UGhvbmVOb3RpZmllci5qYXZhCmluZGV4IDA1N2JhMGEuLmJmM2M0ZDEgMTAwNjQ0Ci0tLSBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9EZWZhdWx0UGhvbmVOb3RpZmllci5qYXZhCisrKyBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9EZWZhdWx0UGhvbmVOb3RpZmllci5qYXZhCkBAIC0xNiw2ICsxNiw3IEBACiAKIHBhY2thZ2UgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255OwogCitpbXBvcnQgYW5kcm9pZC5uZXQuTGlua1Byb3BlcnRpZXM7CiBpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CiBpbXBvcnQgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb247CiBpbXBvcnQgYW5kcm9pZC5vcy5TZXJ2aWNlTWFuYWdlcjsKQEAgLTkyLDI2ICs5Myw0MiBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgcHVibGljIHZvaWQgbm90aWZ5RGF0YUNvbm5lY3Rpb24oUGhvbmUgc2VuZGVyLCBTdHJpbmcgcmVhc29uKSB7CisgICAgcHVibGljIHZvaWQgbm90aWZ5RGF0YUNvbm5lY3Rpb24oUGhvbmUgc2VuZGVyLCBTdHJpbmcgcmVhc29uLCBTdHJpbmcgYXBuVHlwZSkgeworICAgICAgICBkb05vdGlmeURhdGFDb25uZWN0aW9uKHNlbmRlciwgcmVhc29uLCBhcG5UeXBlLCBzZW5kZXIuZ2V0RGF0YUNvbm5lY3Rpb25TdGF0ZShhcG5UeXBlKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgbm90aWZ5RGF0YUNvbm5lY3Rpb24oUGhvbmUgc2VuZGVyLCBTdHJpbmcgcmVhc29uLCBTdHJpbmcgYXBuVHlwZSwKKyAgICAgICAgICAgIFBob25lLkRhdGFTdGF0ZSBzdGF0ZSkgeworICAgICAgICBkb05vdGlmeURhdGFDb25uZWN0aW9uKHNlbmRlciwgcmVhc29uLCBhcG5UeXBlLCBzdGF0ZSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGRvTm90aWZ5RGF0YUNvbm5lY3Rpb24oUGhvbmUgc2VuZGVyLCBTdHJpbmcgcmVhc29uLCBTdHJpbmcgYXBuVHlwZSwKKyAgICAgICAgICAgIFBob25lLkRhdGFTdGF0ZSBzdGF0ZSkgeworICAgICAgICAvLyBUT0RPCisgICAgICAgIC8vIHVzZSBhcG5UeXBlIGFzIHRoZSBrZXkgdG8gd2hpY2ggY29ubmVjdGlvbiB3ZSdyZSB0YWxraW5nIGFib3V0LgorICAgICAgICAvLyBwYXNzIGFwblR5cGUgYmFjayB1cCB0byBmZXRjaCBwYXJ0aWN1bGFyIGZvciB0aGlzIG9uZS4KICAgICAgICAgVGVsZXBob255TWFuYWdlciB0ZWxlcGhvbnkgPSBUZWxlcGhvbnlNYW5hZ2VyLmdldERlZmF1bHQoKTsKKyAgICAgICAgTGlua1Byb3BlcnRpZXMgbGlua1Byb3BlcnRpZXMgPSBudWxsOworICAgICAgICBpZiAoc3RhdGUgPT0gUGhvbmUuRGF0YVN0YXRlLkNPTk5FQ1RFRCkgeworICAgICAgICAgICAgbGlua1Byb3BlcnRpZXMgPSBzZW5kZXIuZ2V0TGlua1Byb3BlcnRpZXMoYXBuVHlwZSk7CisgICAgICAgIH0KICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIG1SZWdpc3RyeS5ub3RpZnlEYXRhQ29ubmVjdGlvbigKLSAgICAgICAgICAgICAgICAgICAgY29udmVydERhdGFTdGF0ZShzZW5kZXIuZ2V0RGF0YUNvbm5lY3Rpb25TdGF0ZSgpKSwKKyAgICAgICAgICAgICAgICAgICAgY29udmVydERhdGFTdGF0ZShzdGF0ZSksCiAgICAgICAgICAgICAgICAgICAgIHNlbmRlci5pc0RhdGFDb25uZWN0aXZpdHlQb3NzaWJsZSgpLCByZWFzb24sCiAgICAgICAgICAgICAgICAgICAgIHNlbmRlci5nZXRBY3RpdmVBcG4oKSwKLSAgICAgICAgICAgICAgICAgICAgc2VuZGVyLmdldEFjdGl2ZUFwblR5cGVzKCksCi0gICAgICAgICAgICAgICAgICAgIHNlbmRlci5nZXRJbnRlcmZhY2VOYW1lKG51bGwpLAorICAgICAgICAgICAgICAgICAgICBhcG5UeXBlLAorICAgICAgICAgICAgICAgICAgICBsaW5rUHJvcGVydGllcywKICAgICAgICAgICAgICAgICAgICAgKCh0ZWxlcGhvbnkhPW51bGwpID8gdGVsZXBob255LmdldE5ldHdvcmtUeXBlKCkgOgotICAgICAgICAgICAgICAgICAgICBUZWxlcGhvbnlNYW5hZ2VyLk5FVFdPUktfVFlQRV9VTktOT1dOKSwKLSAgICAgICAgICAgICAgICAgICAgc2VuZGVyLmdldEdhdGV3YXkobnVsbCkpOworICAgICAgICAgICAgICAgICAgICBUZWxlcGhvbnlNYW5hZ2VyLk5FVFdPUktfVFlQRV9VTktOT1dOKSk7CiAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBleCkgewogICAgICAgICAgICAgLy8gc3lzdGVtIHByb2Nlc3MgaXMgZGVhZAogICAgICAgICB9CiAgICAgfQogCi0gICAgcHVibGljIHZvaWQgbm90aWZ5RGF0YUNvbm5lY3Rpb25GYWlsZWQoUGhvbmUgc2VuZGVyLCBTdHJpbmcgcmVhc29uKSB7CisgICAgcHVibGljIHZvaWQgbm90aWZ5RGF0YUNvbm5lY3Rpb25GYWlsZWQoUGhvbmUgc2VuZGVyLCBTdHJpbmcgcmVhc29uLCBTdHJpbmcgYXBuVHlwZSkgewogICAgICAgICB0cnkgewotICAgICAgICAgICAgbVJlZ2lzdHJ5Lm5vdGlmeURhdGFDb25uZWN0aW9uRmFpbGVkKHJlYXNvbik7CisgICAgICAgICAgICBtUmVnaXN0cnkubm90aWZ5RGF0YUNvbm5lY3Rpb25GYWlsZWQocmVhc29uLCBhcG5UeXBlKTsKICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGV4KSB7CiAgICAgICAgICAgICAvLyBzeXN0ZW0gcHJvY2VzcyBpcyBkZWFkCiAgICAgICAgIH0KZGlmZiAtLWdpdCBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9Hc21BbHBoYWJldC5qYXZhIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L0dzbUFscGhhYmV0LmphdmEKaW5kZXggN2VkZjA2NS4uZTQyODI3ZiAxMDA2NDQKLS0tIGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L0dzbUFscGhhYmV0LmphdmEKKysrIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L0dzbUFscGhhYmV0LmphdmEKQEAgLTE2LDExICsxNiwxNCBAQAogCiBwYWNrYWdlIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueTsKIAotaW1wb3J0IGFuZHJvaWQudGVsZXBob255LlNtc01lc3NhZ2U7CitpbXBvcnQgYW5kcm9pZC50ZXh0LlRleHRVdGlsczsKIGltcG9ydCBhbmRyb2lkLnV0aWwuU3BhcnNlSW50QXJyYXk7CiAKIGltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwogCitpbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKK2ltcG9ydCBqYXZhLm5pby5jaGFyc2V0LkNoYXJzZXQ7CisKIC8qKgogICogVGhpcyBjbGFzcyBpbXBsZW1lbnRzIHRoZSBjaGFyYWN0ZXIgc2V0IG1hcHBpbmcgYmV0d2VlbgogICogdGhlIEdTTSBTTVMgNy1iaXQgYWxwaGFiZXQgc3BlY2lmaWVkIGluIFRTIDIzLjAzOCA2LjIuMQpAQCAtMTcxLDcgKzE3NCw3IEBACiAgICAgICogYXJyYXkgY2Fubm90IGNvbnRhaW4gbW9yZSB0aGFuIDI1NSBzZXB0ZXRzLgogICAgICAqCiAgICAgICogQHBhcmFtIGRhdGEgVGhlIHRleHQgc3RyaW5nIHRvIGVuY29kZS4KLSAgICAgKiBAcGFyYW0gaGVhZGVyIE9wdGlvbmFsIGhlYWRlciAoaW5jbHVkZWluZyBsZW5ndGggYnl0ZSkgdGhhdCBwcmVjZWRlcworICAgICAqIEBwYXJhbSBoZWFkZXIgT3B0aW9uYWwgaGVhZGVyIChpbmNsdWRpbmcgbGVuZ3RoIGJ5dGUpIHRoYXQgcHJlY2VkZXMKICAgICAgKiB0aGUgZW5jb2RlZCBkYXRhLCBwYWRkZWQgdG8gc2VwdGV0IGJvdW5kYXJ5LgogICAgICAqIEByZXR1cm4gQnl0ZSBhcnJheSBjb250YWluaW5nIGhlYWRlciBhbmQgZW5jb2RlZCBkYXRhLgogICAgICAqLwpAQCAtMjA0LDcgKzIwNyw3IEBACiAgICAgICogdGhlIHBhY2tlZCBzZXB0ZXRzLiBUaGUgcmV0dXJuZWQgYXJyYXkgY2Fubm90IGNvbnRhaW4gbW9yZSB0aGFuIDI1NQogICAgICAqIHNlcHRldHMuCiAgICAgICoKLSAgICAgKiBAcGFyYW0gZGF0YSB0aGUgZGF0YSBzdHJpbmcgdG8gZW5kY29kZQorICAgICAqIEBwYXJhbSBkYXRhIHRoZSBkYXRhIHN0cmluZyB0byBlbmNvZGUKICAgICAgKiBAdGhyb3dzIEVuY29kZUV4Y2VwdGlvbiBpZiBTdHJpbmcgaXMgdG9vIGxhcmdlIHRvIGVuY29kZQogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgYnl0ZVtdIHN0cmluZ1RvR3NtN0JpdFBhY2tlZChTdHJpbmcgZGF0YSkKQEAgLTIyMyw3ICsyMjYsNyBAQAogICAgICAqCiAgICAgICogQHBhcmFtIGRhdGEgdGhlIHRleHQgdG8gY29udmVydCB0byBzZXB0ZXRzCiAgICAgICogQHBhcmFtIHN0YXJ0aW5nU2VwdGV0T2Zmc2V0IHRoZSBudW1iZXIgb2YgcGFkZGluZyBzZXB0ZXRzIHRvIHB1dCBiZWZvcmUKLSAgICAgKiAgdGhlIGNoYXJhY3RlciBkYXRhIGF0IHRoZSBiZWdpbmluZyBvZiB0aGUgYXJyYXkKKyAgICAgKiAgdGhlIGNoYXJhY3RlciBkYXRhIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIGFycmF5CiAgICAgICogQHBhcmFtIHRocm93RXhjZXB0aW9uIElmIHRydWUsIHRocm93cyBFbmNvZGVFeGNlcHRpb24gb24gaW52YWxpZCBjaGFyLgogICAgICAqICAgSWYgZmFsc2UsIHJlcGxhY2VzIHVuZW5jb2RhYmxlIGNoYXIgd2l0aCBHU00gYWxwaGFiZXQgc3BhY2UgY2hhci4KICAgICAgKgpAQCAtMjU3LDcgKzI2MCw3IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUGFjayBhIDctYml0IGNoYXIgaW50byBpdHMgYXBwcm9waXJhdGUgcGxhY2UgaW4gYSBieXRlIGFycmF5CisgICAgICogUGFjayBhIDctYml0IGNoYXIgaW50byBpdHMgYXBwcm9wcmlhdGUgcGxhY2UgaW4gYSBieXRlIGFycmF5CiAgICAgICoKICAgICAgKiBAcGFyYW0gYml0T2Zmc2V0IHRoZSBiaXQgb2Zmc2V0IHRoYXQgdGhlIHNlcHRldCBzaG91bGQgYmUgcGFja2VkIGF0CiAgICAgICogICAgICAgICAgICAgICAgICAoc2VwdGV0IGluZGV4ICogNykKQEAgLTMyMCw3ICszMjMsNyBAQAogCiAgICAgICAgICAgICAgICAgZ3NtVmFsID0gKDB4N2YgJiAocGR1W29mZnNldCArIGJ5dGVPZmZzZXRdID4+IHNoaWZ0KSk7CiAKLSAgICAgICAgICAgICAgICAvLyBpZiBpdCBjcm9zc2VzIGEgYnl0ZSBib3VuZHJ5CisgICAgICAgICAgICAgICAgLy8gaWYgaXQgY3Jvc3NlcyBhIGJ5dGUgYm91bmRhcnkKICAgICAgICAgICAgICAgICBpZiAoc2hpZnQgPiAxKSB7CiAgICAgICAgICAgICAgICAgICAgIC8vIHNldCBtc2IgYml0cyB0byAwCiAgICAgICAgICAgICAgICAgICAgIGdzbVZhbCAmPSAweDdmID4+IChzaGlmdCAtIDEpOwpAQCAtMzU1LDYgKzM1OCwzMiBAQAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nCiAgICAgZ3NtOEJpdFVucGFja2VkVG9TdHJpbmcoYnl0ZVtdIGRhdGEsIGludCBvZmZzZXQsIGludCBsZW5ndGgpIHsKKyAgICAgICAgcmV0dXJuIGdzbThCaXRVbnBhY2tlZFRvU3RyaW5nKGRhdGEsIG9mZnNldCwgbGVuZ3RoLCAiIik7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29udmVydCBhIEdTTSBhbHBoYWJldCBzdHJpbmcgdGhhdCdzIHN0b3JlZCBpbiA4LWJpdCB1bnBhY2tlZAorICAgICAqIGZvcm1hdCAoYXMgaXQgb2Z0ZW4gYXBwZWFycyBpbiBTSU0gcmVjb3JkcykgaW50byBhIFN0cmluZworICAgICAqCisgICAgICogRmllbGQgbWF5IGJlIHBhZGRlZCB3aXRoIHRyYWlsaW5nIDB4ZmYncy4gVGhlIGRlY29kZSBzdG9wcworICAgICAqIGF0IHRoZSBmaXJzdCAweGZmIGVuY291bnRlcmVkLgorICAgICAqCisgICAgICogQWRkaXRpb25hbGx5LCBpbiBzb21lIGNvdW50cnkoZXguIEtvcmVhKSwgdGhlcmUgYXJlIG5vbi1BU0NJSSBvciBNQkNTIGNoYXJhY3RlcnMuCisgICAgICogSWYgYSBjaGFyYWN0ZXIgc2V0IGlzIGdpdmVuLCBjaGFyYWN0ZXJzIGluIGRhdGEgYXJlIHRyZWF0IGFzIE1CQ1MuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcKKyAgICBnc204Qml0VW5wYWNrZWRUb1N0cmluZyhieXRlW10gZGF0YSwgaW50IG9mZnNldCwgaW50IGxlbmd0aCwgU3RyaW5nIGNoYXJhY3RlcnNldCkgeworICAgICAgICBib29sZWFuIGlzTWJjcyA9IGZhbHNlOworICAgICAgICBDaGFyc2V0IGNoYXJzZXQgPSBudWxsOworICAgICAgICBCeXRlQnVmZmVyIG1iY3NCdWZmZXIgPSBudWxsOworCisgICAgICAgIGlmICghVGV4dFV0aWxzLmlzRW1wdHkoY2hhcmFjdGVyc2V0KQorICAgICAgICAgICAgICAgICYmICFjaGFyYWN0ZXJzZXQuZXF1YWxzSWdub3JlQ2FzZSgidXMtYXNjaWkiKQorICAgICAgICAgICAgICAgICYmIENoYXJzZXQuaXNTdXBwb3J0ZWQoY2hhcmFjdGVyc2V0KSkgeworICAgICAgICAgICAgaXNNYmNzID0gdHJ1ZTsKKyAgICAgICAgICAgIGNoYXJzZXQgPSBDaGFyc2V0LmZvck5hbWUoY2hhcmFjdGVyc2V0KTsKKyAgICAgICAgICAgIG1iY3NCdWZmZXIgPSBCeXRlQnVmZmVyLmFsbG9jYXRlKDIpOworICAgICAgICB9CiAgICAgICAgIGJvb2xlYW4gcHJldldhc0VzY2FwZTsKICAgICAgICAgU3RyaW5nQnVpbGRlciByZXQgPSBuZXcgU3RyaW5nQnVpbGRlcihsZW5ndGgpOwogCkBAIC0zODAsNyArNDA5LDE1IEBACiAgICAgICAgICAgICAgICAgaWYgKHByZXZXYXNFc2NhcGUpIHsKICAgICAgICAgICAgICAgICAgICAgcmV0LmFwcGVuZCgoY2hhcilnc21FeHRlbmRlZFRvQ2hhci5nZXQoYywgJyAnKSk7CiAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0LmFwcGVuZCgoY2hhcilnc21Ub0NoYXIuZ2V0KGMsICcgJykpOworICAgICAgICAgICAgICAgICAgICBpZiAoIWlzTWJjcyB8fCBjIDwgMHg4MCB8fCBpICsgMSA+PSBvZmZzZXQgKyBsZW5ndGgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldC5hcHBlbmQoKGNoYXIpZ3NtVG9DaGFyLmdldChjLCAnICcpKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlzTWJjcyBtdXN0IGJlIHRydWUuIFNvIGJvdGggbWJjc0J1ZmZlciBhbmQgY2hhcnNldCBhcmUgaW5pdGlhbGl6ZWQuCisgICAgICAgICAgICAgICAgICAgICAgICBtYmNzQnVmZmVyLmNsZWFyKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBtYmNzQnVmZmVyLnB1dChkYXRhLCBpKyssIDIpOworICAgICAgICAgICAgICAgICAgICAgICAgbWJjc0J1ZmZlci5mbGlwKCk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXQuYXBwZW5kKGNoYXJzZXQuZGVjb2RlKG1iY3NCdWZmZXIpLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIHByZXZXYXNFc2NhcGUgPSBmYWxzZTsKICAgICAgICAgICAgIH0KZGlmZiAtLWdpdCBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9JVGVsZXBob255LmFpZGwgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvSVRlbGVwaG9ueS5haWRsCmluZGV4IDIzMjg3MTcuLjdhMTU4N2IgMTAwNjQ0Ci0tLSBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9JVGVsZXBob255LmFpZGwKKysrIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L0lUZWxlcGhvbnkuYWlkbApAQCAtMjM5LDkgKzIzOSwxMSBAQAogICAgIFN0cmluZyBnZXRDZG1hRXJpVGV4dCgpOwogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyB0cnVlIGlmIENETUEgcHJvdmlzaW9uaW5nIG5lZWRzIHRvIHJ1bi4KKyAgICAgKiBSZXR1cm5zIHRydWUgaWYgT1RBIHNlcnZpY2UgcHJvdmlzaW9uaW5nIG5lZWRzIHRvIHJ1bi4KKyAgICAgKiBPbmx5IHJlbGV2YW50IG9uIHNvbWUgdGVjaG5vbG9naWVzLCBvdGhlcnMgd2lsbCBhbHdheXMKKyAgICAgKiByZXR1cm4gZmFsc2UuCiAgICAgICovCi0gICAgYm9vbGVhbiBnZXRDZG1hTmVlZHNQcm92aXNpb25pbmcoKTsKKyAgICBib29sZWFuIG5lZWRzT3RhU2VydmljZVByb3Zpc2lvbmluZygpOwogCiAgICAgLyoqCiAgICAgICAqIFJldHVybnMgdGhlIHVucmVhZCBjb3VudCBvZiB2b2ljZW1haWxzCmRpZmYgLS1naXQgYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvSVRlbGVwaG9ueVJlZ2lzdHJ5LmFpZGwgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvSVRlbGVwaG9ueVJlZ2lzdHJ5LmFpZGwKaW5kZXggODdlNGI1Mi4uZWI3ZTU2NiAxMDA2NDQKLS0tIGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L0lUZWxlcGhvbnlSZWdpc3RyeS5haWRsCisrKyBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9JVGVsZXBob255UmVnaXN0cnkuYWlkbApAQCAtMTcsNiArMTcsNyBAQAogcGFja2FnZSBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnk7CiAKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OworaW1wb3J0IGFuZHJvaWQubmV0LkxpbmtQcm9wZXJ0aWVzOwogaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOwogaW1wb3J0IGFuZHJvaWQudGVsZXBob255LlNlcnZpY2VTdGF0ZTsKIGltcG9ydCBhbmRyb2lkLnRlbGVwaG9ueS5TaWduYWxTdHJlbmd0aDsKQEAgLTMyLDggKzMzLDggQEAKICAgICB2b2lkIG5vdGlmeUNhbGxGb3J3YXJkaW5nQ2hhbmdlZChib29sZWFuIGNmaSk7CiAgICAgdm9pZCBub3RpZnlEYXRhQWN0aXZpdHkoaW50IHN0YXRlKTsKICAgICB2b2lkIG5vdGlmeURhdGFDb25uZWN0aW9uKGludCBzdGF0ZSwgYm9vbGVhbiBpc0RhdGFDb25uZWN0aXZpdHlQb3NzaWJsZSwKLSAgICAgICAgICAgIFN0cmluZyByZWFzb24sIFN0cmluZyBhcG4sIGluIFN0cmluZ1tdIGFwblR5cGVzLCBTdHJpbmcgaW50ZXJmYWNlTmFtZSwgaW50IG5ldHdvcmtUeXBlLAotICAgICAgICAgICAgU3RyaW5nIGdhdGV3YXkpOwotICAgIHZvaWQgbm90aWZ5RGF0YUNvbm5lY3Rpb25GYWlsZWQoU3RyaW5nIHJlYXNvbik7CisgICAgICAgICAgICBTdHJpbmcgcmVhc29uLCBTdHJpbmcgYXBuLCBTdHJpbmcgYXBuVHlwZSwgaW4gTGlua1Byb3BlcnRpZXMgbGlua1Byb3BlcnRpZXMsCisgICAgICAgICAgICBpbnQgbmV0d29ya1R5cGUpOworICAgIHZvaWQgbm90aWZ5RGF0YUNvbm5lY3Rpb25GYWlsZWQoU3RyaW5nIHJlYXNvbiwgU3RyaW5nIGFwblR5cGUpOwogICAgIHZvaWQgbm90aWZ5Q2VsbExvY2F0aW9uKGluIEJ1bmRsZSBjZWxsTG9jYXRpb24pOwogfQpkaWZmIC0tZ2l0IGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L0ljY1V0aWxzLmphdmEgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvSWNjVXRpbHMuamF2YQppbmRleCA5NTdlZGRkLi5kZjU3OWIwIDEwMDY0NAotLS0gYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvSWNjVXRpbHMuamF2YQorKysgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvSWNjVXRpbHMuamF2YQpAQCAtMTYsMTMgKzE2LDE2IEBACiAKIHBhY2thZ2UgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255OwogCitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5SZXNvdXJjZXM7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5SZXNvdXJjZXMuTm90Rm91bmRFeGNlcHRpb247CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5CaXRtYXA7CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5Db2xvcjsKIGltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwogCiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LkdzbUFscGhhYmV0OwotCiBpbXBvcnQgamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7CitpbXBvcnQgamF2YS5uaW8uY2hhcnNldC5DaGFyc2V0OwogCiAvKioKICAqIFZhcmlvdXMgbWV0aG9kcywgdXNlZnVsIGZvciBkZWFsaW5nIHdpdGggU0lNIGRhdGEuCkBAIC0xNTAsNiArMTUzLDkgQEAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIFN0cmluZwogICAgIGFkblN0cmluZ0ZpZWxkVG9TdHJpbmcoYnl0ZVtdIGRhdGEsIGludCBvZmZzZXQsIGludCBsZW5ndGgpIHsKKyAgICAgICAgaWYgKGxlbmd0aCA9PSAwKSB7CisgICAgICAgICAgICByZXR1cm4gIiI7CisgICAgICAgIH0KICAgICAgICAgaWYgKGxlbmd0aCA+PSAxKSB7CiAgICAgICAgICAgICBpZiAoZGF0YVtvZmZzZXRdID09IChieXRlKSAweDgwKSB7CiAgICAgICAgICAgICAgICAgaW50IHVjc2xlbiA9IChsZW5ndGggLSAxKSAvIDI7CkBAIC0yMjUsNyArMjMxLDE1IEBACiAgICAgICAgICAgICByZXR1cm4gcmV0LnRvU3RyaW5nKCk7CiAgICAgICAgIH0KIAotICAgICAgICByZXR1cm4gR3NtQWxwaGFiZXQuZ3NtOEJpdFVucGFja2VkVG9TdHJpbmcoZGF0YSwgb2Zmc2V0LCBsZW5ndGgpOworICAgICAgICBSZXNvdXJjZXMgcmVzb3VyY2UgPSBSZXNvdXJjZXMuZ2V0U3lzdGVtKCk7CisgICAgICAgIFN0cmluZyBkZWZhdWx0Q2hhcnNldCA9ICIiOworICAgICAgICB0cnkgeworICAgICAgICAgICAgZGVmYXVsdENoYXJzZXQgPQorICAgICAgICAgICAgICAgICAgICByZXNvdXJjZS5nZXRTdHJpbmcoY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHJpbmcuZ3NtX2FscGhhYmV0X2RlZmF1bHRfY2hhcnNldCk7CisgICAgICAgIH0gY2F0Y2ggKE5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIC8vIElnbm9yZSBFeGNlcHRpb24gYW5kIGRlZmF1bHRDaGFyc2V0IGlzIHNldCB0byBhIGVtcHR5IHN0cmluZy4KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gR3NtQWxwaGFiZXQuZ3NtOEJpdFVucGFja2VkVG9TdHJpbmcoZGF0YSwgb2Zmc2V0LCBsZW5ndGgsIGRlZmF1bHRDaGFyc2V0LnRyaW0oKSk7CiAgICAgfQogCiAgICAgc3RhdGljIGludApAQCAtMjY3LDkgKzI4MSwxMSBAQAogCiAKICAgICAvKioKLSAgICAgKiBDb252ZXJ0cyBhIGJ5dGUgYXJyYXkgaW50byBhIFN0cmluZyBoZXhpZGVjaW1hbCBjaGFyYWN0ZXJzCisgICAgICogQ29udmVydHMgYSBieXRlIGFycmF5IGludG8gYSBTdHJpbmcgb2YgaGV4YWRlY2ltYWwgY2hhcmFjdGVycy4KICAgICAgKgotICAgICAqIG51bGwgcmV0dXJucyBudWxsCisgICAgICogQHBhcmFtIGJ5dGVzIGFuIGFycmF5IG9mIGJ5dGVzCisgICAgICoKKyAgICAgKiBAcmV0dXJuIGhleCBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgYnl0ZXMgYXJyYXkKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIFN0cmluZwogICAgIGJ5dGVzVG9IZXhTdHJpbmcoYnl0ZVtdIGJ5dGVzKSB7CmRpZmYgLS1naXQgYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvTWNjVGFibGUuamF2YSBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9NY2NUYWJsZS5qYXZhCmluZGV4IGI3M2MyZjcuLjliMGFhM2MgMTAwNjQ0Ci0tLSBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9NY2NUYWJsZS5qYXZhCisrKyBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9NY2NUYWJsZS5qYXZhCkBAIC0yMywzNDYgKzIzLDEzIEBACiBpbXBvcnQgYW5kcm9pZC5uZXQud2lmaS5XaWZpTWFuYWdlcjsKIGltcG9ydCBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbjsKIGltcG9ydCBhbmRyb2lkLm9zLlN5c3RlbVByb3BlcnRpZXM7Ci1pbXBvcnQgYW5kcm9pZC5wcm92aWRlci5TZXR0aW5nczsKIGltcG9ydCBhbmRyb2lkLnRleHQuVGV4dFV0aWxzOwogaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CiAKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotCi0vKioKLSAqIFRoZSB0YWJsZSBiZWxvdyBpcyBidWlsdCBmcm9tIHR3byByZXNvdXJjZXM6Ci0gKgotICogMSkgSVRVICJNb2JpbGUgTmV0d29yayBDb2RlIChNTkMpIGZvciB0aGUgaW50ZXJuYXRpb25hbAotICogICBpZGVudGlmaWNhdGlvbiBwbGFuIGZvciBtb2JpbGUgdGVybWluYWxzIGFuZCBtb2JpbGUgdXNlcnMiCi0gKiAgIHdoaWNoIGlzIGF2YWlsYWJsZSBhcyBhbiBhbm5leCB0byB0aGUgSVRVIG9wZXJhdGlvbmFsIGJ1bGxldGluCi0gKiAgIGF2YWlsYWJsZSBoZXJlOiBodHRwOi8vd3d3Lml0dS5pbnQvaXR1LXQvYnVsbGV0aW4vYW5uZXguaHRtbAotICoKLSAqIDIpIFRoZSBJU08gMzE2NiBjb3VudHJ5IGNvZGVzIGxpc3QsIGF2YWlsYWJsZSBoZXJlOgotICogICAgaHR0cDovL3d3dy5pc28ub3JnL2lzby9lbi9wcm9kcy1zZXJ2aWNlcy9pc28zMTY2bWEvMDJpc28tMzE2Ni1jb2RlLWxpc3RzL2luZGV4Lmh0bWwKLSAqCi0gKiBUaGlzIHRhYmxlIHdhcyB2ZXJpZmllZCAoMjggQXVnIDIwMDkpIGFnYWluc3QKLSAqIGh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvTGlzdF9vZl9tb2JpbGVfY291bnRyeV9jb2RlcyB3aXRoIHRoZQotICogb25seSB1bnJlc29sdmVkIGRpc2NyZXBhbmN5IGJlaW5nIHRoYXQgdGhpcyBsaXN0IGhhcyBhbiBleHRyYSBlbnRyeQotICogKDQ2MSkgZm9yIENoaW5hLgotICoKLSAqIFRPRE86IENvbXBsZXRlIHRoZSBtYXBwaW5ncyBmb3IgdGltZXpvbmVzIGFuZCBsYW5ndWFnZS9sb2NhbGUgY29kZXMuCi0gKgotICogVGhlIGFjdHVhbCB0YWJsZSBkYXRhIHVzZWQgaW4gdGhlIEphdmEgY29kZSBpcyBnZW5lcmF0ZWQgZnJvbSB0aGUKLSAqIGJlbG93IFB5dGhvbiBjb2RlIGZvciBlZmZpY2llbmN5LiAgVGhlIGluZm9ybWF0aW9uIGlzIGV4cGVjdGVkIHRvCi0gKiBiZSBzdGF0aWMsIGJ1dCBpZiBjaGFuZ2VzIGFyZSByZXF1aXJlZCwgdGhlIHRhYmxlIGluIHRoZSBweXRob24KLSAqIGNvZGUgY2FuIGJlIG1vZGlmaWVkIGFuZCB0aGUgdHJhaWxpbmcgY29kZSBydW4gdG8gcmUtZ2VuZXJhdGUgdGhlCi0gKiB0YWJsZXMgdGhhdCBhcmUgdG8gYmUgdXNlZCBieSBKYXZhLgotCi1tY2NfdGFibGUgPSBbCi0gICgyMDIsICdncicsIDIsICdHcmVlY2UnKSwKLSAgKDIwNCwgJ25sJywgMiwgJ0V1cm9wZS9BbXN0ZXJkYW0nLCAnbmwnLCAxMywgJ05ldGhlcmxhbmRzIChLaW5nZG9tIG9mIHRoZSknKSwKLSAgKDIwNiwgJ2JlJywgMiwgJ0JlbGdpdW0nKSwKLSAgKDIwOCwgJ2ZyJywgMiwgJ0V1cm9wZS9QYXJpcycsICdmcicsICdGcmFuY2UnKSwKLSAgKDIxMiwgJ21jJywgMiwgJ01vbmFjbyAoUHJpbmNpcGFsaXR5IG9mKScpLAotICAoMjEzLCAnYWQnLCAyLCAnQW5kb3JyYSAoUHJpbmNpcGFsaXR5IG9mKScpLAotICAoMjE0LCAnZXMnLCAyLCAnRXVyb3BlL01hZHJpZCcsICdlcycsICdTcGFpbicpLAotICAoMjE2LCAnaHUnLCAyLCAnSHVuZ2FyeSAoUmVwdWJsaWMgb2YpJyksCi0gICgyMTgsICdiYScsIDIsICdCb3NuaWEgYW5kIEhlcnplZ292aW5hJyksCi0gICgyMTksICdocicsIDIsICdDcm9hdGlhIChSZXB1YmxpYyBvZiknKSwKLSAgKDIyMCwgJ3JzJywgMiwgJ1NlcmJpYSBhbmQgTW9udGVuZWdybycpLAotICAoMjIyLCAnaXQnLCAyLCAnRXVyb3BlL1JvbWUnLCAnaXQnLCAnSXRhbHknKSwKLSAgKDIyNSwgJ3ZhJywgMiwgJ0V1cm9wZS9Sb21lJywgJ2l0JywgJ1ZhdGljYW4gQ2l0eSBTdGF0ZScpLAotICAoMjI2LCAncm8nLCAyLCAnUm9tYW5pYScpLAotICAoMjI4LCAnY2gnLCAyLCAnRXVyb3BlL1p1cmljaCcsICdkZScsICdTd2l0emVybGFuZCAoQ29uZmVkZXJhdGlvbiBvZiknKSwKLSAgKDIzMCwgJ2N6JywgMiwgJ0V1cm9wZS9QcmFndWUnLCAnY3MnLCAxMywgJ0N6ZWNoIFJlcHVibGljJyksCi0gICgyMzEsICdzaycsIDIsICdTbG92YWsgUmVwdWJsaWMnKSwKLSAgKDIzMiwgJ2F0JywgMiwgJ0V1cm9wZS9WaWVubmEnLCAnZGUnLCAxMywgJ0F1c3RyaWEnKSwKLSAgKDIzNCwgJ2diJywgMiwgJ0V1cm9wZS9Mb25kb24nLCAnZW4nLCAxMywgJ1VuaXRlZCBLaW5nZG9tIG9mIEdyZWF0IEJyaXRhaW4gYW5kIE5vcnRoZXJuIElyZWxhbmQnKSwKLSAgKDIzNSwgJ2diJywgMiwgJ0V1cm9wZS9Mb25kb24nLCAnZW4nLCAxMywgJ1VuaXRlZCBLaW5nZG9tIG9mIEdyZWF0IEJyaXRhaW4gYW5kIE5vcnRoZXJuIElyZWxhbmQnKSwKLSAgKDIzOCwgJ2RrJywgMiwgJ0Rlbm1hcmsnKSwKLSAgKDI0MCwgJ3NlJywgMiwgJ1N3ZWRlbicpLAotICAoMjQyLCAnbm8nLCAyLCAnTm9yd2F5JyksCi0gICgyNDQsICdmaScsIDIsICdGaW5sYW5kJyksCi0gICgyNDYsICdsdCcsIDIsICdMaXRodWFuaWEgKFJlcHVibGljIG9mKScpLAotICAoMjQ3LCAnbHYnLCAyLCAnTGF0dmlhIChSZXB1YmxpYyBvZiknKSwKLSAgKDI0OCwgJ2VlJywgMiwgJ0VzdG9uaWEgKFJlcHVibGljIG9mKScpLAotICAoMjUwLCAncnUnLCAyLCAnUnVzc2lhbiBGZWRlcmF0aW9uJyksCi0gICgyNTUsICd1YScsIDIsICdVa3JhaW5lJyksCi0gICgyNTcsICdieScsIDIsICdCZWxhcnVzIChSZXB1YmxpYyBvZiknKSwKLSAgKDI1OSwgJ21kJywgMiwgJ01vbGRvdmEgKFJlcHVibGljIG9mKScpLAotICAoMjYwLCAncGwnLCAyLCAnRXVyb3BlL1dhcnNhdycsICdQb2xhbmQgKFJlcHVibGljIG9mKScpLAotICAoMjYyLCAnZGUnLCAyLCAnRXVyb3BlL0JlcmxpbicsICdkZScsIDEzLCAnR2VybWFueSAoRmVkZXJhbCBSZXB1YmxpYyBvZiknKSwKLSAgKDI2NiwgJ2dpJywgMiwgJ0dpYnJhbHRhcicpLAotICAoMjY4LCAncHQnLCAyLCAnUG9ydHVnYWwnKSwKLSAgKDI3MCwgJ2x1JywgMiwgJ0x1eGVtYm91cmcnKSwKLSAgKDI3MiwgJ2llJywgMiwgJ0V1cm9wZS9EdWJsaW4nLCAnZW4nLCAnSXJlbGFuZCcpLAotICAoMjc0LCAnaXMnLCAyLCAnSWNlbGFuZCcpLAotICAoMjc2LCAnYWwnLCAyLCAnQWxiYW5pYSAoUmVwdWJsaWMgb2YpJyksCi0gICgyNzgsICdtdCcsIDIsICdNYWx0YScpLAotICAoMjgwLCAnY3knLCAyLCAnQ3lwcnVzIChSZXB1YmxpYyBvZiknKSwKLSAgKDI4MiwgJ2dlJywgMiwgJ0dlb3JnaWEnKSwKLSAgKDI4MywgJ2FtJywgMiwgJ0FybWVuaWEgKFJlcHVibGljIG9mKScpLAotICAoMjg0LCAnYmcnLCAyLCAnQnVsZ2FyaWEgKFJlcHVibGljIG9mKScpLAotICAoMjg2LCAndHInLCAyLCAnVHVya2V5JyksCi0gICgyODgsICdmbycsIDIsICdGYXJvZSBJc2xhbmRzJyksCi0gICgyODksICdnZScsIDIsICdBYmtoYXppYSAoR2VvcmdpYSknKSwKLSAgKDI5MCwgJ2dsJywgMiwgJ0dyZWVubGFuZCAoRGVubWFyayknKSwKLSAgKDI5MiwgJ3NtJywgMiwgJ1NhbiBNYXJpbm8gKFJlcHVibGljIG9mKScpLAotICAoMjkzLCAnc2wnLCAyLCAnU2xvdmVuaWEgKFJlcHVibGljIG9mKScpLAotICAoMjk0LCAnbWsnLCAyLCAnVGhlIEZvcm1lciBZdWdvc2xhdiBSZXB1YmxpYyBvZiBNYWNlZG9uaWEnKSwKLSAgKDI5NSwgJ2xpJywgMiwgJ0xpZWNodGVuc3RlaW4gKFByaW5jaXBhbGl0eSBvZiknKSwKLSAgKDI5NywgJ21lJywgMiwgJ01vbnRlbmVncm8gKFJlcHVibGljIG9mKScpLAotICAoMzAyLCAnY2EnLCAzLCAnJywgJycsIDExLCAnQ2FuYWRhJyksCi0gICgzMDgsICdwbScsIDIsICdTYWludCBQaWVycmUgYW5kIE1pcXVlbG9uIChDb2xsZWN0aXZpdCB0ZXJyaXRvcmlhbGUgZGUgbGEgUnB1YmxpcXVlIGZyYW5haXNlKScpLAotICAoMzEwLCAndXMnLCAzLCAnJywgJ2VuJywgMTEsICdVbml0ZWQgU3RhdGVzIG9mIEFtZXJpY2EnKSwKLSAgKDMxMSwgJ3VzJywgMywgJycsICdlbicsIDExLCAnVW5pdGVkIFN0YXRlcyBvZiBBbWVyaWNhJyksCi0gICgzMTIsICd1cycsIDMsICcnLCAnZW4nLCAxMSwgJ1VuaXRlZCBTdGF0ZXMgb2YgQW1lcmljYScpLAotICAoMzEzLCAndXMnLCAzLCAnJywgJ2VuJywgMTEsICdVbml0ZWQgU3RhdGVzIG9mIEFtZXJpY2EnKSwKLSAgKDMxNCwgJ3VzJywgMywgJycsICdlbicsIDExLCAnVW5pdGVkIFN0YXRlcyBvZiBBbWVyaWNhJyksCi0gICgzMTUsICd1cycsIDMsICcnLCAnZW4nLCAxMSwgJ1VuaXRlZCBTdGF0ZXMgb2YgQW1lcmljYScpLAotICAoMzE2LCAndXMnLCAzLCAnJywgJ2VuJywgMTEsICdVbml0ZWQgU3RhdGVzIG9mIEFtZXJpY2EnKSwKLSAgKDMzMCwgJ3ByJywgMiwgJ1B1ZXJ0byBSaWNvJyksCi0gICgzMzIsICd2aScsIDIsICdVbml0ZWQgU3RhdGVzIFZpcmdpbiBJc2xhbmRzJyksCi0gICgzMzQsICdteCcsIDMsICdNZXhpY28nKSwKLSAgKDMzOCwgJ2ptJywgMywgJ0phbWFpY2EnKSwKLSAgKDM0MCwgJ2dwJywgMiwgJ0d1YWRlbG91cGUgKEZyZW5jaCBEZXBhcnRtZW50IG9mKScpLAotICAoMzQyLCAnYmInLCAzLCAnQmFyYmFkb3MnKSwKLSAgKDM0NCwgJ2FnJywgMywgJ0FudGlndWEgYW5kIEJhcmJ1ZGEnKSwKLSAgKDM0NiwgJ2t5JywgMywgJ0NheW1hbiBJc2xhbmRzJyksCi0gICgzNDgsICd2ZycsIDMsICdCcml0aXNoIFZpcmdpbiBJc2xhbmRzJyksCi0gICgzNTAsICdibScsIDIsICdCZXJtdWRhJyksCi0gICgzNTIsICdnZCcsIDIsICdHcmVuYWRhJyksCi0gICgzNTQsICdtcycsIDIsICdNb250c2VycmF0JyksCi0gICgzNTYsICdrbicsIDIsICdTYWludCBLaXR0cyBhbmQgTmV2aXMnKSwKLSAgKDM1OCwgJ2xjJywgMiwgJ1NhaW50IEx1Y2lhJyksCi0gICgzNjAsICd2YycsIDIsICdTYWludCBWaW5jZW50IGFuZCB0aGUgR3JlbmFkaW5lcycpLAotICAoMzYyLCAnbmwnLCAyLCAnTmV0aGVybGFuZHMgQW50aWxsZXMnKSwKLSAgKDM2MywgJ2F3JywgMiwgJ0FydWJhJyksCi0gICgzNjQsICdicycsIDIsICdCYWhhbWFzIChDb21tb253ZWFsdGggb2YgdGhlKScpLAotICAoMzY1LCAnYWknLCAzLCAnQW5ndWlsbGEnKSwKLSAgKDM2NiwgJ2RtJywgMiwgJ0RvbWluaWNhIChDb21tb253ZWFsdGggb2YpJyksCi0gICgzNjgsICdjdScsIDIsICdDdWJhJyksCi0gICgzNzAsICdkbycsIDIsICdEb21pbmljYW4gUmVwdWJsaWMnKSwKLSAgKDM3MiwgJ2h0JywgMiwgJ0hhaXRpIChSZXB1YmxpYyBvZiknKSwKLSAgKDM3NCwgJ3R0JywgMiwgJ1RyaW5pZGFkIGFuZCBUb2JhZ28nKSwKLSAgKDM3NiwgJ3RjJywgMiwgJ1R1cmtzIGFuZCBDYWljb3MgSXNsYW5kcycpLAotICAoNDAwLCAnYXonLCAyLCAnQXplcmJhaWphbmkgUmVwdWJsaWMnKSwKLSAgKDQwMSwgJ2t6JywgMiwgJ0themFraHN0YW4gKFJlcHVibGljIG9mKScpLAotICAoNDAyLCAnYnQnLCAyLCAnQmh1dGFuIChLaW5nZG9tIG9mKScpLAotICAoNDA0LCAnaW4nLCAyLCAnSW5kaWEgKFJlcHVibGljIG9mKScpLAotICAoNDA1LCAnaW4nLCAyLCAnSW5kaWEgKFJlcHVibGljIG9mKScpLAotICAoNDEwLCAncGsnLCAyLCAnUGFraXN0YW4gKElzbGFtaWMgUmVwdWJsaWMgb2YpJyksCi0gICg0MTIsICdhZicsIDIsICdBZmdoYW5pc3RhbicpLAotICAoNDEzLCAnbGsnLCAyLCAnU3JpIExhbmthIChEZW1vY3JhdGljIFNvY2lhbGlzdCBSZXB1YmxpYyBvZiknKSwKLSAgKDQxNCwgJ21tJywgMiwgJ015YW5tYXIgKFVuaW9uIG9mKScpLAotICAoNDE1LCAnbGInLCAyLCAnTGViYW5vbicpLAotICAoNDE2LCAnam8nLCAyLCAnSm9yZGFuIChIYXNoZW1pdGUgS2luZ2RvbSBvZiknKSwKLSAgKDQxNywgJ3N5JywgMiwgJ1N5cmlhbiBBcmFiIFJlcHVibGljJyksCi0gICg0MTgsICdpcScsIDIsICdJcmFxIChSZXB1YmxpYyBvZiknKSwKLSAgKDQxOSwgJ2t3JywgMiwgJ0t1d2FpdCAoU3RhdGUgb2YpJyksCi0gICg0MjAsICdzYScsIDIsICdTYXVkaSBBcmFiaWEgKEtpbmdkb20gb2YpJyksCi0gICg0MjEsICd5ZScsIDIsICdZZW1lbiAoUmVwdWJsaWMgb2YpJyksCi0gICg0MjIsICdvbScsIDIsICdPbWFuIChTdWx0YW5hdGUgb2YpJyksCi0gICg0MjMsICdwcycsIDIsICdQYWxlc3RpbmUnKSwKLSAgKDQyNCwgJ2FlJywgMiwgJ1VuaXRlZCBBcmFiIEVtaXJhdGVzJyksCi0gICg0MjUsICdpbCcsIDIsICdJc3JhZWwgKFN0YXRlIG9mKScpLAotICAoNDI2LCAnYmgnLCAyLCAnQmFocmFpbiAoS2luZ2RvbSBvZiknKSwKLSAgKDQyNywgJ3FhJywgMiwgJ1FhdGFyIChTdGF0ZSBvZiknKSwKLSAgKDQyOCwgJ21uJywgMiwgJ01vbmdvbGlhJyksCi0gICg0MjksICducCcsIDIsICdOZXBhbCcpLAotICAoNDMwLCAnYWUnLCAyLCAnVW5pdGVkIEFyYWIgRW1pcmF0ZXMnKSwKLSAgKDQzMSwgJ2FlJywgMiwgJ1VuaXRlZCBBcmFiIEVtaXJhdGVzJyksCi0gICg0MzIsICdpcicsIDIsICdJcmFuIChJc2xhbWljIFJlcHVibGljIG9mKScpLAotICAoNDM0LCAndXonLCAyLCAnVXpiZWtpc3RhbiAoUmVwdWJsaWMgb2YpJyksCi0gICg0MzYsICd0aicsIDIsICdUYWppa2lzdGFuIChSZXB1YmxpYyBvZiknKSwKLSAgKDQzNywgJ2tnJywgMiwgJ0t5cmd5eiBSZXB1YmxpYycpLAotICAoNDM4LCAndG0nLCAyLCAnVHVya21lbmlzdGFuJyksCi0gICg0NDAsICdqcCcsIDIsICdBc2lhL1Rva3lvJywgJ2phJywgMTQsICdKYXBhbicpLAotICAoNDQxLCAnanAnLCAyLCAnQXNpYS9Ub2t5bycsICdqYScsIDE0LCAnSmFwYW4nKSwKLSAgKDQ1MCwgJ2tyJywgMiwgJ0tvcmVhIChSZXB1YmxpYyBvZiknKSwKLSAgKDQ1MiwgJ3ZuJywgMiwgJ1ZpZXQgTmFtIChTb2NpYWxpc3QgUmVwdWJsaWMgb2YpJyksCi0gICg0NTQsICdoaycsIDIsICciSG9uZyBLb25nLCBDaGluYSInKSwKLSAgKDQ1NSwgJ21vJywgMiwgJyJNYWNhbywgQ2hpbmEiJyksCi0gICg0NTYsICdraCcsIDIsICdDYW1ib2RpYSAoS2luZ2RvbSBvZiknKSwKLSAgKDQ1NywgJ2xhJywgMiwgIkxhbyBQZW9wbGUncyBEZW1vY3JhdGljIFJlcHVibGljIiksCi0gICg0NjAsICdjbicsIDIsICJBc2lhL0JlaWppbmciLCAnemgnLCAxMywgIkNoaW5hIChQZW9wbGUncyBSZXB1YmxpYyBvZikiKSwKLSAgKDQ2MSwgJ2NuJywgMiwgIkFzaWEvQmVpamluZyIsICd6aCcsIDEzLCAiQ2hpbmEgKFBlb3BsZSdzIFJlcHVibGljIG9mKSIpLAotICAoNDY2LCAndHcnLCAyLCAiVGFpd2FuIChSZXB1YmxpYyBvZiBDaGluYSkiKSwKLSAgKDQ2NywgJ2twJywgMiwgIkRlbW9jcmF0aWMgUGVvcGxlJ3MgUmVwdWJsaWMgb2YgS29yZWEiKSwKLSAgKDQ3MCwgJ2JkJywgMiwgIkJhbmdsYWRlc2ggKFBlb3BsZSdzIFJlcHVibGljIG9mKSIpLAotICAoNDcyLCAnbXYnLCAyLCAnTWFsZGl2ZXMgKFJlcHVibGljIG9mKScpLAotICAoNTAyLCAnbXknLCAyLCAnTWFsYXlzaWEnKSwKLSAgKDUwNSwgJ2F1JywgMiwgJ0F1c3RyYWxpYS9TeWRuZXknLCAnZW4nLCAxMSwgJ0F1c3RyYWxpYScpLAotICAoNTEwLCAnaWQnLCAyLCAnSW5kb25lc2lhIChSZXB1YmxpYyBvZiknKSwKLSAgKDUxNCwgJ3RsJywgMiwgJ0RlbW9jcmF0aWMgUmVwdWJsaWMgb2YgVGltb3ItTGVzdGUnKSwKLSAgKDUxNSwgJ3BoJywgMiwgJ1BoaWxpcHBpbmVzIChSZXB1YmxpYyBvZiB0aGUpJyksCi0gICg1MjAsICd0aCcsIDIsICdUaGFpbGFuZCcpLAotICAoNTI1LCAnc2cnLCAyLCAnQXNpYS9TaW5nYXBvcmUnLCAnZW4nLCAxMSwgJ1NpbmdhcG9yZSAoUmVwdWJsaWMgb2YpJyksCi0gICg1MjgsICdibicsIDIsICdCcnVuZWkgRGFydXNzYWxhbScpLAotICAoNTMwLCAnbnonLCAyLCAnUGFjaWZpYy9BdWNrbGFuZCcsICdlbicsICdOZXcgWmVhbGFuZCcpLAotICAoNTM0LCAnbXAnLCAyLCAnTm9ydGhlcm4gTWFyaWFuYSBJc2xhbmRzIChDb21tb253ZWFsdGggb2YgdGhlKScpLAotICAoNTM1LCAnZ3UnLCAyLCAnR3VhbScpLAotICAoNTM2LCAnbnInLCAyLCAnTmF1cnUgKFJlcHVibGljIG9mKScpLAotICAoNTM3LCAncGcnLCAyLCAnUGFwdWEgTmV3IEd1aW5lYScpLAotICAoNTM5LCAndG8nLCAyLCAnVG9uZ2EgKEtpbmdkb20gb2YpJyksCi0gICg1NDAsICdzYicsIDIsICdTb2xvbW9uIElzbGFuZHMnKSwKLSAgKDU0MSwgJ3Z1JywgMiwgJ1ZhbnVhdHUgKFJlcHVibGljIG9mKScpLAotICAoNTQyLCAnZmonLCAyLCAnRmlqaSAoUmVwdWJsaWMgb2YpJyksCi0gICg1NDMsICd3ZicsIDIsICJXYWxsaXMgYW5kIEZ1dHVuYSAoVGVycml0b2lyZSBmcmFuYWlzIGQnb3V0cmUtbWVyKSIpLAotICAoNTQ0LCAnYXMnLCAyLCAnQW1lcmljYW4gU2Ftb2EnKSwKLSAgKDU0NSwgJ2tpJywgMiwgJ0tpcmliYXRpIChSZXB1YmxpYyBvZiknKSwKLSAgKDU0NiwgJ25jJywgMiwgIk5ldyBDYWxlZG9uaWEgKFRlcnJpdG9pcmUgZnJhbmFpcyBkJ291dHJlLW1lcikiKSwKLSAgKDU0NywgJ3BmJywgMiwgIkZyZW5jaCBQb2x5bmVzaWEgKFRlcnJpdG9pcmUgZnJhbmFpcyBkJ291dHJlLW1lcikiKSwKLSAgKDU0OCwgJ2NrJywgMiwgJ0Nvb2sgSXNsYW5kcycpLAotICAoNTQ5LCAnd3MnLCAyLCAnU2Ftb2EgKEluZGVwZW5kZW50IFN0YXRlIG9mKScpLAotICAoNTUwLCAnZm0nLCAyLCAnTWljcm9uZXNpYSAoRmVkZXJhdGVkIFN0YXRlcyBvZiknKSwKLSAgKDU1MSwgJ21oJywgMiwgJ01hcnNoYWxsIElzbGFuZHMgKFJlcHVibGljIG9mIHRoZSknKSwKLSAgKDU1MiwgJ3B3JywgMiwgJ1BhbGF1IChSZXB1YmxpYyBvZiknKSwKLSAgKDYwMiwgJ2VnJywgMiwgJ0VneXB0IChBcmFiIFJlcHVibGljIG9mKScpLAotICAoNjAzLCAnZHonLCAyLCAiQWxnZXJpYSAoUGVvcGxlJ3MgRGVtb2NyYXRpYyBSZXB1YmxpYyBvZikiKSwKLSAgKDYwNCwgJ21hJywgMiwgJ01vcm9jY28gKEtpbmdkb20gb2YpJyksCi0gICg2MDUsICd0bicsIDIsICdUdW5pc2lhJyksCi0gICg2MDYsICdseScsIDIsICJMaWJ5YSAoU29jaWFsaXN0IFBlb3BsZSdzIExpYnlhbiBBcmFiIEphbWFoaXJpeWEpIiksCi0gICg2MDcsICdnbScsIDIsICdHYW1iaWEgKFJlcHVibGljIG9mIHRoZSknKSwKLSAgKDYwOCwgJ3NuJywgMiwgJ1NlbmVnYWwgKFJlcHVibGljIG9mKScpLAotICAoNjA5LCAnbXInLCAyLCAnTWF1cml0YW5pYSAoSXNsYW1pYyBSZXB1YmxpYyBvZiknKSwKLSAgKDYxMCwgJ21sJywgMiwgJ01hbGkgKFJlcHVibGljIG9mKScpLAotICAoNjExLCAnZ24nLCAyLCAnR3VpbmVhIChSZXB1YmxpYyBvZiknKSwKLSAgKDYxMiwgJ2NpJywgMiwgIkN0ZSBkJ0l2b2lyZSAoUmVwdWJsaWMgb2YpIiksCi0gICg2MTMsICdiZicsIDIsICdCdXJraW5hIEZhc28nKSwKLSAgKDYxNCwgJ25lJywgMiwgJ05pZ2VyIChSZXB1YmxpYyBvZiB0aGUpJyksCi0gICg2MTUsICd0ZycsIDIsICdUb2dvbGVzZSBSZXB1YmxpYycpLAotICAoNjE2LCAnYmonLCAyLCAnQmVuaW4gKFJlcHVibGljIG9mKScpLAotICAoNjE3LCAnbXUnLCAyLCAnTWF1cml0aXVzIChSZXB1YmxpYyBvZiknKSwKLSAgKDYxOCwgJ2xyJywgMiwgJ0xpYmVyaWEgKFJlcHVibGljIG9mKScpLAotICAoNjE5LCAnc2wnLCAyLCAnU2llcnJhIExlb25lJyksCi0gICg2MjAsICdnaCcsIDIsICdHaGFuYScpLAotICAoNjIxLCAnbmcnLCAyLCAnTmlnZXJpYSAoRmVkZXJhbCBSZXB1YmxpYyBvZiknKSwKLSAgKDYyMiwgJ3RkJywgMiwgJ0NoYWQgKFJlcHVibGljIG9mKScpLAotICAoNjIzLCAnY2YnLCAyLCAnQ2VudHJhbCBBZnJpY2FuIFJlcHVibGljJyksCi0gICg2MjQsICdjbScsIDIsICdDYW1lcm9vbiAoUmVwdWJsaWMgb2YpJyksCi0gICg2MjUsICdjdicsIDIsICdDYXBlIFZlcmRlIChSZXB1YmxpYyBvZiknKSwKLSAgKDYyNiwgJ3N0JywgMiwgJ1NhbyBUb21lIGFuZCBQcmluY2lwZSAoRGVtb2NyYXRpYyBSZXB1YmxpYyBvZiknKSwKLSAgKDYyNywgJ2dxJywgMiwgJ0VxdWF0b3JpYWwgR3VpbmVhIChSZXB1YmxpYyBvZiknKSwKLSAgKDYyOCwgJ2dhJywgMiwgJ0dhYm9uZXNlIFJlcHVibGljJyksCi0gICg2MjksICdjZycsIDIsICdDb25nbyAoUmVwdWJsaWMgb2YgdGhlKScpLAotICAoNjMwLCAnY2cnLCAyLCAnRGVtb2NyYXRpYyBSZXB1YmxpYyBvZiB0aGUgQ29uZ28nKSwKLSAgKDYzMSwgJ2FvJywgMiwgJ0FuZ29sYSAoUmVwdWJsaWMgb2YpJyksCi0gICg2MzIsICdndycsIDIsICdHdWluZWEtQmlzc2F1IChSZXB1YmxpYyBvZiknKSwKLSAgKDYzMywgJ3NjJywgMiwgJ1NleWNoZWxsZXMgKFJlcHVibGljIG9mKScpLAotICAoNjM0LCAnc2QnLCAyLCAnU3VkYW4gKFJlcHVibGljIG9mIHRoZSknKSwKLSAgKDYzNSwgJ3J3JywgMiwgJ1J3YW5kYSAoUmVwdWJsaWMgb2YpJyksCi0gICg2MzYsICdldCcsIDIsICdFdGhpb3BpYSAoRmVkZXJhbCBEZW1vY3JhdGljIFJlcHVibGljIG9mKScpLAotICAoNjM3LCAnc28nLCAyLCAnU29tYWxpIERlbW9jcmF0aWMgUmVwdWJsaWMnKSwKLSAgKDYzOCwgJ2RqJywgMiwgJ0RqaWJvdXRpIChSZXB1YmxpYyBvZiknKSwKLSAgKDYzOSwgJ2tlJywgMiwgJ0tlbnlhIChSZXB1YmxpYyBvZiknKSwKLSAgKDY0MCwgJ3R6JywgMiwgJ1RhbnphbmlhIChVbml0ZWQgUmVwdWJsaWMgb2YpJyksCi0gICg2NDEsICd1ZycsIDIsICdVZ2FuZGEgKFJlcHVibGljIG9mKScpLAotICAoNjQyLCAnYmknLCAyLCAnQnVydW5kaSAoUmVwdWJsaWMgb2YpJyksCi0gICg2NDMsICdteicsIDIsICdNb3phbWJpcXVlIChSZXB1YmxpYyBvZiknKSwKLSAgKDY0NSwgJ3ptJywgMiwgJ1phbWJpYSAoUmVwdWJsaWMgb2YpJyksCi0gICg2NDYsICdtZycsIDIsICdNYWRhZ2FzY2FyIChSZXB1YmxpYyBvZiknKSwKLSAgKDY0NywgJ3JlJywgMiwgJ1JldW5pb24gKEZyZW5jaCBEZXBhcnRtZW50IG9mKScpLAotICAoNjQ4LCAnencnLCAyLCAnWmltYmFid2UgKFJlcHVibGljIG9mKScpLAotICAoNjQ5LCAnbmEnLCAyLCAnTmFtaWJpYSAoUmVwdWJsaWMgb2YpJyksCi0gICg2NTAsICdtdycsIDIsICdNYWxhd2knKSwKLSAgKDY1MSwgJ2xzJywgMiwgJ0xlc290aG8gKEtpbmdkb20gb2YpJyksCi0gICg2NTIsICdidycsIDIsICdCb3Rzd2FuYSAoUmVwdWJsaWMgb2YpJyksCi0gICg2NTMsICdzeicsIDIsICdTd2F6aWxhbmQgKEtpbmdkb20gb2YpJyksCi0gICg2NTQsICdrbScsIDIsICdDb21vcm9zIChVbmlvbiBvZiB0aGUpJyksCi0gICg2NTUsICd6YScsIDIsICdBZnJpY2EvSm9oYW5uZXNidXJnJywgJ2VuJywgJ1NvdXRoIEFmcmljYSAoUmVwdWJsaWMgb2YpJyksCi0gICg2NTcsICdlcicsIDIsICdFcml0cmVhJyksCi0gICg3MDIsICdieicsIDIsICdCZWxpemUnKSwKLSAgKDcwNCwgJ2d0JywgMiwgJ0d1YXRlbWFsYSAoUmVwdWJsaWMgb2YpJyksCi0gICg3MDYsICdzdicsIDIsICdFbCBTYWx2YWRvciAoUmVwdWJsaWMgb2YpJyksCi0gICg3MDgsICdobicsIDMsICdIb25kdXJhcyAoUmVwdWJsaWMgb2YpJyksCi0gICg3MTAsICduaScsIDIsICdOaWNhcmFndWEnKSwKLSAgKDcxMiwgJ2NyJywgMiwgJ0Nvc3RhIFJpY2EnKSwKLSAgKDcxNCwgJ3BhJywgMiwgJ1BhbmFtYSAoUmVwdWJsaWMgb2YpJyksCi0gICg3MTYsICdwZScsIDIsICdQZXJ1JyksCi0gICg3MjIsICdhcicsIDMsICdBcmdlbnRpbmUgUmVwdWJsaWMnKSwKLSAgKDcyNCwgJ2JyJywgMiwgJ0JyYXppbCAoRmVkZXJhdGl2ZSBSZXB1YmxpYyBvZiknKSwKLSAgKDczMCwgJ2NsJywgMiwgJ0NoaWxlJyksCi0gICg3MzIsICdjbycsIDMsICdDb2xvbWJpYSAoUmVwdWJsaWMgb2YpJyksCi0gICg3MzQsICd2ZScsIDIsICdWZW5lenVlbGEgKEJvbGl2YXJpYW4gUmVwdWJsaWMgb2YpJyksCi0gICg3MzYsICdibycsIDIsICdCb2xpdmlhIChSZXB1YmxpYyBvZiknKSwKLSAgKDczOCwgJ2d5JywgMiwgJ0d1eWFuYScpLAotICAoNzQwLCAnZWMnLCAyLCAnRWN1YWRvcicpLAotICAoNzQyLCAnZ2YnLCAyLCAnRnJlbmNoIEd1aWFuYSAoRnJlbmNoIERlcGFydG1lbnQgb2YpJyksCi0gICg3NDQsICdweScsIDIsICdQYXJhZ3VheSAoUmVwdWJsaWMgb2YpJyksCi0gICg3NDYsICdzcicsIDIsICdTdXJpbmFtZSAoUmVwdWJsaWMgb2YpJyksCi0gICg3NDgsICd1eScsIDIsICdVcnVndWF5IChFYXN0ZXJuIFJlcHVibGljIG9mKScpLAotICAoNzUwLCAnZmsnLCAyLCAnRmFsa2xhbmQgSXNsYW5kcyAoTWFsdmluYXMpJyldCi0KLWdldF9tY2MgPSBsYW1iZGEgZWx0OiBlbHRbMF0KLWdldF9pc28gPSBsYW1iZGEgZWx0OiBlbHRbMV0KLWdldF9zZCA9IGxhbWJkYSBlbHQ6IGVsdFsyXQotZ2V0X3R6ID0gbGFtYmRhIGVsdDogbGVuKGVsdCkgPiA0IGFuZCBlbHRbM10gb3IgJycKLWdldF9sYW5nID0gbGFtYmRhIGVsdDogbGVuKGVsdCkgPiA1IGFuZCBlbHRbNF0gb3IgJycKLWdldF93aWZpID0gbGFtYmRhIGVsdDogbGVuKGVsdCkgPiA2IGFuZCBlbHRbNV0gb3IgMAotCi1tY2NfY29kZXMgPSBbJzB4JTA0eCcgJSBnZXRfbWNjKGVsdCkgZm9yIGVsdCBpbiBtY2NfdGFibGVdCi10el9zZXQgPSBzb3J0ZWQoeCBmb3IgeCBpbiBzZXQoZ2V0X3R6KGVsdCkgZm9yIGVsdCBpbiBtY2NfdGFibGUpKQotbGFuZ19zZXQgPSBzb3J0ZWQoeCBmb3IgeCBpbiBzZXQoZ2V0X2xhbmcoZWx0KSBmb3IgZWx0IGluIG1jY190YWJsZSkpCi0KLWRlZiBta19pbmRfY29kZShlbHQpOgotICBpc28gPSBnZXRfaXNvKGVsdCkKLSAgaXNvX2NvZGUgPSAoKG9yZChpc29bMF0pIDw8IDgpIHwgb3JkKGlzb1sxXSkpICYgMHhGRkZGICMgMTYgYml0cwotICB3aWZpID0gZ2V0X3dpZmkoZWx0KSAmIDB4MDAwRiAgICAgICAgICAgICAgICAgICAgICAgICAgIyAgNCBiaXRzCi0gIHNkID0gZ2V0X3NkKGVsdCkgJiAweDAwMDMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjICAyIGJpdHMKLSAgdHpfaW5kID0gdHpfc2V0LmluZGV4KGdldF90eihlbHQpKSAmIDB4MDAxRiAgICAgICAgICAgICMgIDUgYml0cwotICBsYW5nX2luZCA9IGxhbmdfc2V0LmluZGV4KGdldF9sYW5nKGVsdCkpICYgMHgwMDBGICAgICAgIyAgNCBiaXRzCi0gIHJldHVybiAoaXNvX2NvZGUgPDwgMTYpIHwgKHdpZmkgPDwgMTEpIHwgKHNkIDw8IDkpIHwgKHR6X2luZCA8PCA0KSB8IGxhbmdfaW5kCi0KLWluZF9jb2RlcyA9IFsnMHglMDh4JyAlIG1rX2luZF9jb2RlKGVsdCkgZm9yIGVsdCBpbiBtY2NfdGFibGVdCi0KLWRlZiBmbXRfbGlzdCh0aXRsZSwgbCwgYmF0Y2hfc3opOgotICBzbCA9IFtdCi0gIGZvciBpIGluIHJhbmdlKGxlbihsKSAvIGJhdGNoX3N6ICsgKGxlbihsKSAlIGJhdGNoX3N6IGFuZCAxIG9yIDApKToKLSAgICBqID0gaSAqIGJhdGNoX3N6Ci0gICAgc2wuYXBwZW5kKCgnICcgKiA4KSArICcsICcuam9pbihsW2o6aiArIGJhdGNoX3N6XSkpCi0gIHJldHVybiAnICAgIHByaXZhdGUgc3RhdGljIGZpbmFsICVzID0ge1xuJyAlIHRpdGxlICsgJyxcbicuam9pbihzbCkgKyAnXG4gICAgfTtcbicKLQotZGVmIGRvX2F1dG9nZW5fY29tbWVudChleHRyYV9kZXNjPVtdKToKLSAgcHJpbnQgJyAgICAvJyArICcqKlxuICAgICogQVVUTyBHRU5FUkFURUQgKGJ5IHRoZSBQeXRob24gY29kZSBhYm92ZSknCi0gIGZvciBsaW5lIGluIGV4dHJhX2Rlc2M6Ci0gICAgcHJpbnQgJyAgICAqICVzJyAlIGxpbmUKLSAgcHJpbnQgJyAgICAqJyArICcvJwotCi1kb19hdXRvZ2VuX2NvbW1lbnQoKQotcHJpbnQgZm10X2xpc3QoJ1N0cmluZ1tdIFRaX1NUUklOR1MnLCBbJyIlcyInICUgeCBmb3IgeCBpbiB0el9zZXRdLCAxKQotZG9fYXV0b2dlbl9jb21tZW50KCkKLXByaW50IGZtdF9saXN0KCdTdHJpbmdbXSBMQU5HX1NUUklOR1MnLCBbJyIlcyInICUgeCBmb3IgeCBpbiBsYW5nX3NldF0sIDEwKQotZG9fYXV0b2dlbl9jb21tZW50KFsnVGhpcyB0YWJsZSBpcyBhIGxpc3Qgb2YgTUNDIGNvZGVzLiAgVGhlIGluZGV4IGluIHRoaXMgdGFibGUnLAotICAgICAgICAgICAgICAgICAgICAnb2YgYSBnaXZlbiBNQ0MgY29kZSBpcyB0aGUgaW5kZXggb2YgZXh0cmEgaW5mb3JtYXRpb24gYWJvdXQnLAotICAgICAgICAgICAgICAgICAgICAndGhhdCBNQ0MgaW4gdGhlIElORF9DT0RFUyB0YWJsZS4nXSkKLXByaW50IGZtdF9saXN0KCdzaG9ydFtdIE1DQ19DT0RFUycsIG1jY19jb2RlcywgMTApCi1kb19hdXRvZ2VuX2NvbW1lbnQoWydUaGUgdmFsdWVzIGluIHRoaXMgdGFibGUgYXJlIGJyb2tlbiBkb3duIGFzIGZvbGxvd3MgKG1zYiB0byBsc2IpOicsCi0gICAgICAgICAgICAgICAgICAgICcgICAgaXNvIGNvdW50cnkgY29kZSAxNiBiaXRzJywKLSAgICAgICAgICAgICAgICAgICAgJyAgICAodW51c2VkKSAgICAgICAgICAxIGJpdCcsCi0gICAgICAgICAgICAgICAgICAgICcgICAgd2lmaSBjaGFubmVsICAgICAgNCBiaXRzJywKLSAgICAgICAgICAgICAgICAgICAgJyAgICBzbWFsbGVkIGRpZ2l0ICAgICAyIGJpdHMnLAotICAgICAgICAgICAgICAgICAgICAnICAgIGRlZmF1bHQgdGltZXpvbmUgIDUgYml0cycsCi0gICAgICAgICAgICAgICAgICAgICcgICAgZGVmYXVsdCBsYW5ndWFnZSAgNCBiaXRzJ10pCi1wcmludCBmbXRfbGlzdCgnaW50W10gSU5EX0NPREVTJywgaW5kX2NvZGVzLCA2KQotCi1kZWYgcGFyc2VfaW5kX2NvZGUoaW5kKToKLSAgbWNjID0gZXZhbChtY2NfY29kZXNbaW5kXSkKLSAgY29kZSA9IGV2YWwoaW5kX2NvZGVzW2luZF0pCi0gIGlzb19sc2IgPSBpbnQoKGNvZGUgPj4gMTYpICYgMHgwMEZGKQotICBpc29fbXNiID0gaW50KChjb2RlID4+IDI0KSAmIDB4MDBGRikKLSAgaXNvID0gJyVzJXMnICUgKGNocihpc29fbXNiKSwgY2hyKGlzb19sc2IpKQotICB3aWZpID0gaW50KChjb2RlID4+IDExKSAmIDB4MDAwRikKLSAgc2QgPSBpbnQoKGNvZGUgPj4gOSkgJiAweDAwMDMpCi0gIHR6X2luZCA9IChjb2RlID4+IDQpICYgMHgwMDFGCi0gIGxhbmdfaW5kID0gKGNvZGUgPj4gMCkgJiAweDAwMEYKLSAgcmV0dXJuIChtY2MsIGlzbywgc2QsIHR6X3NldFt0el9pbmRdLCBsYW5nX3NldFtsYW5nX2luZF0sIHdpZmkpCi0KLWZtdF9zdHIgPSAnbWNjID0gJXMsIGlzbyA9ICVzLCBzZCA9ICVzLCB0eiA9ICVzLCBsYW5nID0gJXMsIHdpZmkgPSAlcycKLW9yaWdfdGFibGUgPSBbZm10X3N0ciAlIChnZXRfbWNjKGVsdCksIGdldF9pc28oZWx0KSwgZ2V0X3NkKGVsdCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgZ2V0X3R6KGVsdCksIGdldF9sYW5nKGVsdCksIGdldF93aWZpKGVsdCkpCi0gICAgICAgICAgICAgIGZvciBlbHQgaW4gbWNjX3RhYmxlXQotZGVyaXZlZF90YWJsZSA9IFtmbXRfc3RyICUgcGFyc2VfaW5kX2NvZGUoaSkgZm9yIGkgaW4gcmFuZ2UobGVuKGluZF9jb2RlcykpXQotZm9yIGkgaW4gcmFuZ2UobGVuKG9yaWdfdGFibGUpKToKLSAgaWYgb3JpZ190YWJsZVtpXSA9PSBkZXJpdmVkX3RhYmxlW2ldOiBjb250aW51ZQotICBwcmludCAnTUlTTUFUQ0ggRVJST1IgOiAnLCBvcmlnX3RhYmxlW2ldLCAiICE9ICIsIGRlcml2ZWRfdGFibGVbaV0KLQotKi8KK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOworaW1wb3J0IGxpYmNvcmUuaWN1LlRpbWVab25lczsKIAogLyoqCiAgKiBNb2JpbGUgQ291bnRyeSBDb2RlCkBAIC0zNzEsMjAwICszOCwxNTMgQEAKICAqLwogcHVibGljIGZpbmFsIGNsYXNzIE1jY1RhYmxlCiB7Ci0gICAgLyoqCi0gICAgICogQVVUTyBHRU5FUkFURUQgKGJ5IHRoZSBQeXRob24gY29kZSBhYm92ZSkKLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBUWl9TVFJJTkdTID0gewotICAgICAgICAiIiwKLSAgICAgICAgIkFmcmljYS9Kb2hhbm5lc2J1cmciLAotICAgICAgICAiQXNpYS9CZWlqaW5nIiwKLSAgICAgICAgIkFzaWEvU2luZ2Fwb3JlIiwKLSAgICAgICAgIkFzaWEvVG9reW8iLAotICAgICAgICAiQXVzdHJhbGlhL1N5ZG5leSIsCi0gICAgICAgICJFdXJvcGUvQW1zdGVyZGFtIiwKLSAgICAgICAgIkV1cm9wZS9CZXJsaW4iLAotICAgICAgICAiRXVyb3BlL0R1YmxpbiIsCi0gICAgICAgICJFdXJvcGUvTG9uZG9uIiwKLSAgICAgICAgIkV1cm9wZS9NYWRyaWQiLAotICAgICAgICAiRXVyb3BlL1BhcmlzIiwKLSAgICAgICAgIkV1cm9wZS9QcmFndWUiLAotICAgICAgICAiRXVyb3BlL1JvbWUiLAotICAgICAgICAiRXVyb3BlL1ZpZW5uYSIsCi0gICAgICAgICJFdXJvcGUvV2Fyc2F3IiwKLSAgICAgICAgIkV1cm9wZS9adXJpY2giLAotICAgICAgICAiUGFjaWZpYy9BdWNrbGFuZCIKLSAgICB9OwotCi0gICAgLyoqCi0gICAgICogQVVUTyBHRU5FUkFURUQgKGJ5IHRoZSBQeXRob24gY29kZSBhYm92ZSkKLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBMQU5HX1NUUklOR1MgPSB7Ci0gICAgICAgICIiLCAiY3MiLCAiZGUiLCAiZW4iLCAiZXMiLCAiZnIiLCAiaXQiLCAiamEiLCAibmwiLCAiemgiCi0gICAgfTsKLQotICAgIC8qKgotICAgICAqIEFVVE8gR0VORVJBVEVEIChieSB0aGUgUHl0aG9uIGNvZGUgYWJvdmUpCi0gICAgICogVGhpcyB0YWJsZSBpcyBhIGxpc3Qgb2YgTUNDIGNvZGVzLiAgVGhlIGluZGV4IGluIHRoaXMgdGFibGUKLSAgICAgKiBvZiBhIGdpdmVuIE1DQyBjb2RlIGlzIHRoZSBpbmRleCBvZiBleHRyYSBpbmZvcm1hdGlvbiBhYm91dAotICAgICAqIHRoYXQgTUNDIGluIHRoZSBJTkRfQ09ERVMgdGFibGUuCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgc2hvcnRbXSBNQ0NfQ09ERVMgPSB7Ci0gICAgICAgIDB4MDBjYSwgMHgwMGNjLCAweDAwY2UsIDB4MDBkMCwgMHgwMGQ0LCAweDAwZDUsIDB4MDBkNiwgMHgwMGQ4LCAweDAwZGEsIDB4MDBkYiwKLSAgICAgICAgMHgwMGRjLCAweDAwZGUsIDB4MDBlMSwgMHgwMGUyLCAweDAwZTQsIDB4MDBlNiwgMHgwMGU3LCAweDAwZTgsIDB4MDBlYSwgMHgwMGViLAotICAgICAgICAweDAwZWUsIDB4MDBmMCwgMHgwMGYyLCAweDAwZjQsIDB4MDBmNiwgMHgwMGY3LCAweDAwZjgsIDB4MDBmYSwgMHgwMGZmLCAweDAxMDEsCi0gICAgICAgIDB4MDEwMywgMHgwMTA0LCAweDAxMDYsIDB4MDEwYSwgMHgwMTBjLCAweDAxMGUsIDB4MDExMCwgMHgwMTEyLCAweDAxMTQsIDB4MDExNiwKLSAgICAgICAgMHgwMTE4LCAweDAxMWEsIDB4MDExYiwgMHgwMTFjLCAweDAxMWUsIDB4MDEyMCwgMHgwMTIxLCAweDAxMjIsIDB4MDEyNCwgMHgwMTI1LAotICAgICAgICAweDAxMjYsIDB4MDEyNywgMHgwMTI5LCAweDAxMmUsIDB4MDEzNCwgMHgwMTM2LCAweDAxMzcsIDB4MDEzOCwgMHgwMTM5LCAweDAxM2EsCi0gICAgICAgIDB4MDEzYiwgMHgwMTNjLCAweDAxNGEsIDB4MDE0YywgMHgwMTRlLCAweDAxNTIsIDB4MDE1NCwgMHgwMTU2LCAweDAxNTgsIDB4MDE1YSwKLSAgICAgICAgMHgwMTVjLCAweDAxNWUsIDB4MDE2MCwgMHgwMTYyLCAweDAxNjQsIDB4MDE2NiwgMHgwMTY4LCAweDAxNmEsIDB4MDE2YiwgMHgwMTZjLAotICAgICAgICAweDAxNmQsIDB4MDE2ZSwgMHgwMTcwLCAweDAxNzIsIDB4MDE3NCwgMHgwMTc2LCAweDAxNzgsIDB4MDE5MCwgMHgwMTkxLCAweDAxOTIsCi0gICAgICAgIDB4MDE5NCwgMHgwMTk1LCAweDAxOWEsIDB4MDE5YywgMHgwMTlkLCAweDAxOWUsIDB4MDE5ZiwgMHgwMWEwLCAweDAxYTEsIDB4MDFhMiwKLSAgICAgICAgMHgwMWEzLCAweDAxYTQsIDB4MDFhNSwgMHgwMWE2LCAweDAxYTcsIDB4MDFhOCwgMHgwMWE5LCAweDAxYWEsIDB4MDFhYiwgMHgwMWFjLAotICAgICAgICAweDAxYWQsIDB4MDFhZSwgMHgwMWFmLCAweDAxYjAsIDB4MDFiMiwgMHgwMWI0LCAweDAxYjUsIDB4MDFiNiwgMHgwMWI4LCAweDAxYjksCi0gICAgICAgIDB4MDFjMiwgMHgwMWM0LCAweDAxYzYsIDB4MDFjNywgMHgwMWM4LCAweDAxYzksIDB4MDFjYywgMHgwMWNkLCAweDAxZDIsIDB4MDFkMywKLSAgICAgICAgMHgwMWQ2LCAweDAxZDgsIDB4MDFmNiwgMHgwMWY5LCAweDAxZmUsIDB4MDIwMiwgMHgwMjAzLCAweDAyMDgsIDB4MDIwZCwgMHgwMjEwLAotICAgICAgICAweDAyMTIsIDB4MDIxNiwgMHgwMjE3LCAweDAyMTgsIDB4MDIxOSwgMHgwMjFiLCAweDAyMWMsIDB4MDIxZCwgMHgwMjFlLCAweDAyMWYsCi0gICAgICAgIDB4MDIyMCwgMHgwMjIxLCAweDAyMjIsIDB4MDIyMywgMHgwMjI0LCAweDAyMjUsIDB4MDIyNiwgMHgwMjI3LCAweDAyMjgsIDB4MDI1YSwKLSAgICAgICAgMHgwMjViLCAweDAyNWMsIDB4MDI1ZCwgMHgwMjVlLCAweDAyNWYsIDB4MDI2MCwgMHgwMjYxLCAweDAyNjIsIDB4MDI2MywgMHgwMjY0LAotICAgICAgICAweDAyNjUsIDB4MDI2NiwgMHgwMjY3LCAweDAyNjgsIDB4MDI2OSwgMHgwMjZhLCAweDAyNmIsIDB4MDI2YywgMHgwMjZkLCAweDAyNmUsCi0gICAgICAgIDB4MDI2ZiwgMHgwMjcwLCAweDAyNzEsIDB4MDI3MiwgMHgwMjczLCAweDAyNzQsIDB4MDI3NSwgMHgwMjc2LCAweDAyNzcsIDB4MDI3OCwKLSAgICAgICAgMHgwMjc5LCAweDAyN2EsIDB4MDI3YiwgMHgwMjdjLCAweDAyN2QsIDB4MDI3ZSwgMHgwMjdmLCAweDAyODAsIDB4MDI4MSwgMHgwMjgyLAotICAgICAgICAweDAyODMsIDB4MDI4NSwgMHgwMjg2LCAweDAyODcsIDB4MDI4OCwgMHgwMjg5LCAweDAyOGEsIDB4MDI4YiwgMHgwMjhjLCAweDAyOGQsCi0gICAgICAgIDB4MDI4ZSwgMHgwMjhmLCAweDAyOTEsIDB4MDJiZSwgMHgwMmMwLCAweDAyYzIsIDB4MDJjNCwgMHgwMmM2LCAweDAyYzgsIDB4MDJjYSwKLSAgICAgICAgMHgwMmNjLCAweDAyZDIsIDB4MDJkNCwgMHgwMmRhLCAweDAyZGMsIDB4MDJkZSwgMHgwMmUwLCAweDAyZTIsIDB4MDJlNCwgMHgwMmU2LAotICAgICAgICAweDAyZTgsIDB4MDJlYSwgMHgwMmVjLCAweDAyZWUKLSAgICB9OwotCi0gICAgLyoqCi0gICAgICogQVVUTyBHRU5FUkFURUQgKGJ5IHRoZSBQeXRob24gY29kZSBhYm92ZSkKLSAgICAgKiBUaGUgdmFsdWVzIGluIHRoaXMgdGFibGUgYXJlIGJyb2tlbiBkb3duIGFzIGZvbGxvd3MgKG1zYiB0byBsc2IpOgotICAgICAqICAgICBpc28gY291bnRyeSBjb2RlIDE2IGJpdHMKLSAgICAgKiAgICAgKHVudXNlZCkgICAgICAgICAgMSBiaXQKLSAgICAgKiAgICAgd2lmaSBjaGFubmVsICAgICAgNCBiaXRzCi0gICAgICogICAgIHNtYWxsZWQgZGlnaXQgICAgIDIgYml0cwotICAgICAqICAgICBkZWZhdWx0IHRpbWV6b25lICA1IGJpdHMKLSAgICAgKiAgICAgZGVmYXVsdCBsYW5ndWFnZSAgNCBiaXRzCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50W10gSU5EX0NPREVTID0gewotICAgICAgICAweDY3NzIwNDAwLCAweDZlNmM2YzY4LCAweDYyNjUwNDAwLCAweDY2NzIwNGI1LCAweDZkNjMwNDAwLCAweDYxNjQwNDAwLAotICAgICAgICAweDY1NzMwNGE0LCAweDY4NzUwNDAwLCAweDYyNjEwNDAwLCAweDY4NzIwNDAwLCAweDcyNzMwNDAwLCAweDY5NzQwNGQ2LAotICAgICAgICAweDc2NjEwNGQ2LCAweDcyNmYwNDAwLCAweDYzNjgwNTAyLCAweDYzN2E2Y2MxLCAweDczNmIwNDAwLCAweDYxNzQ2Y2UyLAotICAgICAgICAweDY3NjI2YzkzLCAweDY3NjI2YzkzLCAweDY0NmIwNDAwLCAweDczNjUwNDAwLCAweDZlNmYwNDAwLCAweDY2NjkwNDAwLAotICAgICAgICAweDZjNzQwNDAwLCAweDZjNzYwNDAwLCAweDY1NjUwNDAwLCAweDcyNzUwNDAwLCAweDc1NjEwNDAwLCAweDYyNzkwNDAwLAotICAgICAgICAweDZkNjQwNDAwLCAweDcwNmMwNGYwLCAweDY0NjU2YzcyLCAweDY3NjkwNDAwLCAweDcwNzQwNDAwLCAweDZjNzUwNDAwLAotICAgICAgICAweDY5NjUwNDgzLCAweDY5NzMwNDAwLCAweDYxNmMwNDAwLCAweDZkNzQwNDAwLCAweDYzNzkwNDAwLCAweDY3NjUwNDAwLAotICAgICAgICAweDYxNmQwNDAwLCAweDYyNjcwNDAwLCAweDc0NzIwNDAwLCAweDY2NmYwNDAwLCAweDY3NjUwNDAwLCAweDY3NmMwNDAwLAotICAgICAgICAweDczNmQwNDAwLCAweDczNmMwNDAwLCAweDZkNmIwNDAwLCAweDZjNjkwNDAwLCAweDZkNjUwNDAwLCAweDYzNjE1ZTAwLAotICAgICAgICAweDcwNmQwNDAwLCAweDc1NzM1ZTAzLCAweDc1NzM1ZTAzLCAweDc1NzM1ZTAzLCAweDc1NzM1ZTAzLCAweDc1NzM1ZTAzLAotICAgICAgICAweDc1NzM1ZTAzLCAweDc1NzM1ZTAzLCAweDcwNzIwNDAwLCAweDc2NjkwNDAwLCAweDZkNzgwNjAwLCAweDZhNmQwNjAwLAotICAgICAgICAweDY3NzAwNDAwLCAweDYyNjIwNjAwLCAweDYxNjcwNjAwLCAweDZiNzkwNjAwLCAweDc2NjcwNjAwLCAweDYyNmQwNDAwLAotICAgICAgICAweDY3NjQwNDAwLCAweDZkNzMwNDAwLCAweDZiNmUwNDAwLCAweDZjNjMwNDAwLCAweDc2NjMwNDAwLCAweDZlNmMwNDAwLAotICAgICAgICAweDYxNzcwNDAwLCAweDYyNzMwNDAwLCAweDYxNjkwNjAwLCAweDY0NmQwNDAwLCAweDYzNzUwNDAwLCAweDY0NmYwNDAwLAotICAgICAgICAweDY4NzQwNDAwLCAweDc0NzQwNDAwLCAweDc0NjMwNDAwLCAweDYxN2EwNDAwLCAweDZiN2EwNDAwLCAweDYyNzQwNDAwLAotICAgICAgICAweDY5NmUwNDAwLCAweDY5NmUwNDAwLCAweDcwNmIwNDAwLCAweDYxNjYwNDAwLCAweDZjNmIwNDAwLCAweDZkNmQwNDAwLAotICAgICAgICAweDZjNjIwNDAwLCAweDZhNmYwNDAwLCAweDczNzkwNDAwLCAweDY5NzEwNDAwLCAweDZiNzcwNDAwLCAweDczNjEwNDAwLAotICAgICAgICAweDc5NjUwNDAwLCAweDZmNmQwNDAwLCAweDcwNzMwNDAwLCAweDYxNjUwNDAwLCAweDY5NmMwNDAwLCAweDYyNjgwNDAwLAotICAgICAgICAweDcxNjEwNDAwLCAweDZkNmUwNDAwLCAweDZlNzAwNDAwLCAweDYxNjUwNDAwLCAweDYxNjUwNDAwLCAweDY5NzIwNDAwLAotICAgICAgICAweDc1N2EwNDAwLCAweDc0NmEwNDAwLCAweDZiNjcwNDAwLCAweDc0NmQwNDAwLCAweDZhNzA3NDQ3LCAweDZhNzA3NDQ3LAotICAgICAgICAweDZiNzIwNDAwLCAweDc2NmUwNDAwLCAweDY4NmIwNDAwLCAweDZkNmYwNDAwLCAweDZiNjgwNDAwLCAweDZjNjEwNDAwLAotICAgICAgICAweDYzNmU2YzI5LCAweDYzNmU2YzI5LCAweDc0NzcwNDAwLCAweDZiNzAwNDAwLCAweDYyNjQwNDAwLCAweDZkNzYwNDAwLAotICAgICAgICAweDZkNzkwNDAwLCAweDYxNzU1YzUzLCAweDY5NjQwNDAwLCAweDc0NmMwNDAwLCAweDcwNjgwNDAwLCAweDc0NjgwNDAwLAotICAgICAgICAweDczNjc1YzMzLCAweDYyNmUwNDAwLCAweDZlN2EwNTEzLCAweDZkNzAwNDAwLCAweDY3NzUwNDAwLCAweDZlNzIwNDAwLAotICAgICAgICAweDcwNjcwNDAwLCAweDc0NmYwNDAwLCAweDczNjIwNDAwLCAweDc2NzUwNDAwLCAweDY2NmEwNDAwLCAweDc3NjYwNDAwLAotICAgICAgICAweDYxNzMwNDAwLCAweDZiNjkwNDAwLCAweDZlNjMwNDAwLCAweDcwNjYwNDAwLCAweDYzNmIwNDAwLCAweDc3NzMwNDAwLAotICAgICAgICAweDY2NmQwNDAwLCAweDZkNjgwNDAwLCAweDcwNzcwNDAwLCAweDY1NjcwNDAwLCAweDY0N2EwNDAwLCAweDZkNjEwNDAwLAotICAgICAgICAweDc0NmUwNDAwLCAweDZjNzkwNDAwLCAweDY3NmQwNDAwLCAweDczNmUwNDAwLCAweDZkNzIwNDAwLCAweDZkNmMwNDAwLAotICAgICAgICAweDY3NmUwNDAwLCAweDYzNjkwNDAwLCAweDYyNjYwNDAwLCAweDZlNjUwNDAwLCAweDc0NjcwNDAwLCAweDYyNmEwNDAwLAotICAgICAgICAweDZkNzUwNDAwLCAweDZjNzIwNDAwLCAweDczNmMwNDAwLCAweDY3NjgwNDAwLCAweDZlNjcwNDAwLCAweDc0NjQwNDAwLAotICAgICAgICAweDYzNjYwNDAwLCAweDYzNmQwNDAwLCAweDYzNzYwNDAwLCAweDczNzQwNDAwLCAweDY3NzEwNDAwLCAweDY3NjEwNDAwLAotICAgICAgICAweDYzNjcwNDAwLCAweDYzNjcwNDAwLCAweDYxNmYwNDAwLCAweDY3NzcwNDAwLCAweDczNjMwNDAwLCAweDczNjQwNDAwLAotICAgICAgICAweDcyNzcwNDAwLCAweDY1NzQwNDAwLCAweDczNmYwNDAwLCAweDY0NmEwNDAwLCAweDZiNjUwNDAwLCAweDc0N2EwNDAwLAotICAgICAgICAweDc1NjcwNDAwLCAweDYyNjkwNDAwLCAweDZkN2EwNDAwLCAweDdhNmQwNDAwLCAweDZkNjcwNDAwLCAweDcyNjUwNDAwLAotICAgICAgICAweDdhNzcwNDAwLCAweDZlNjEwNDAwLCAweDZkNzcwNDAwLCAweDZjNzMwNDAwLCAweDYyNzcwNDAwLCAweDczN2EwNDAwLAotICAgICAgICAweDZiNmQwNDAwLCAweDdhNjEwNDEzLCAweDY1NzIwNDAwLCAweDYyN2EwNDAwLCAweDY3NzQwNDAwLCAweDczNzYwNDAwLAotICAgICAgICAweDY4NmUwNjAwLCAweDZlNjkwNDAwLCAweDYzNzIwNDAwLCAweDcwNjEwNDAwLCAweDcwNjUwNDAwLCAweDYxNzIwNjAwLAotICAgICAgICAweDYyNzIwNDAwLCAweDYzNmMwNDAwLCAweDYzNmYwNjAwLCAweDc2NjUwNDAwLCAweDYyNmYwNDAwLCAweDY3NzkwNDAwLAotICAgICAgICAweDY1NjMwNDAwLCAweDY3NjYwNDAwLCAweDcwNzkwNDAwLCAweDczNzIwNDAwLCAweDc1NzkwNDAwLCAweDY2NmIwNDAwCi0gICAgfTsKLQogICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgTE9HX1RBRyA9ICJNY2NUYWJsZSI7CiAKKyAgICBzdGF0aWMgQXJyYXlMaXN0PE1jY0VudHJ5PiB0YWJsZTsKKworICAgIHN0YXRpYyBjbGFzcyBNY2NFbnRyeSBpbXBsZW1lbnRzIENvbXBhcmFibGU8TWNjRW50cnk+CisgICAgeworICAgICAgICBpbnQgbWNjOworICAgICAgICBTdHJpbmcgaXNvOworICAgICAgICBpbnQgc21hbGxlc3REaWdpdHNNbmM7CisgICAgICAgIFN0cmluZyBsYW5ndWFnZTsKKyAgICAgICAgaW50IHdpZmlDaGFubmVsczsKKworICAgICAgICBNY2NFbnRyeShpbnQgbW5jLCBTdHJpbmcgaXNvLCBpbnQgc21hbGxlc3REaWdpdHNNQ0MpIHsKKyAgICAgICAgICAgIHRoaXMobW5jLCBpc28sIHNtYWxsZXN0RGlnaXRzTUNDLCBudWxsKTsKKyAgICAgICAgfQorCisgICAgICAgIE1jY0VudHJ5KGludCBtbmMsIFN0cmluZyBpc28sIGludCBzbWFsbGVzdERpZ2l0c01DQywgU3RyaW5nIGxhbmd1YWdlKSB7CisgICAgICAgICAgICB0aGlzKG1uYywgaXNvLCBzbWFsbGVzdERpZ2l0c01DQywgbGFuZ3VhZ2UsIDApOworICAgICAgICB9CisKKyAgICAgICAgTWNjRW50cnkoaW50IG1uYywgU3RyaW5nIGlzbywgaW50IHNtYWxsZXN0RGlnaXRzTUNDLCBTdHJpbmcgbGFuZ3VhZ2UsIGludCB3aWZpQ2hhbm5lbHMpIHsKKyAgICAgICAgICAgIHRoaXMubWNjID0gbW5jOworICAgICAgICAgICAgdGhpcy5pc28gPSBpc287CisgICAgICAgICAgICB0aGlzLnNtYWxsZXN0RGlnaXRzTW5jID0gc21hbGxlc3REaWdpdHNNQ0M7CisgICAgICAgICAgICB0aGlzLmxhbmd1YWdlID0gbGFuZ3VhZ2U7CisgICAgICAgICAgICB0aGlzLndpZmlDaGFubmVscyA9IHdpZmlDaGFubmVsczsKKyAgICAgICAgfQorCisKKyAgICAgICAgcHVibGljIGludCBjb21wYXJlVG8oTWNjRW50cnkgbykKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIG1jYyAtIG8ubWNjOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgTWNjRW50cnkKKyAgICBlbnRyeUZvck1jYyhpbnQgbWNjKQorICAgIHsKKyAgICAgICAgaW50IGluZGV4OworCisgICAgICAgIE1jY0VudHJ5IG07CisKKyAgICAgICAgbSA9IG5ldyBNY2NFbnRyeShtY2MsIG51bGwsIDApOworCisgICAgICAgIGluZGV4ID0gQ29sbGVjdGlvbnMuYmluYXJ5U2VhcmNoKHRhYmxlLCBtKTsKKworICAgICAgICBpZiAoaW5kZXggPCAwKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiB0YWJsZS5nZXQoaW5kZXgpOworICAgICAgICB9CisgICAgfQorCiAgICAgLyoqCi0gICAgICogR2l2ZW4gYSBNb2JpbGUgQ291bnRyeSBDb2RlLCByZXR1cm5zIGEgZGVmYXVsdCB0aW1lIHpvbmUgSUQKLSAgICAgKiBpZiBhdmFpbGFibGUuICBSZXR1cm5zIG51bGwgaWYgdW5hdmFpbGFibGUuCisgICAgICogUmV0dXJucyBhIGRlZmF1bHQgdGltZSB6b25lIElEIGZvciB0aGUgZ2l2ZW4gTUNDLgorICAgICAqIEBwYXJhbSBtY2MgTW9iaWxlIENvdW50cnkgQ29kZQorICAgICAqIEByZXR1cm4gZGVmYXVsdCBUaW1lWm9uZSBJRCwgb3IgbnVsbCBpZiBub3Qgc3BlY2lmaWVkCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZGVmYXVsdFRpbWVab25lRm9yTWNjKGludCBtY2MpIHsKLSAgICAgICAgaW50IGluZGV4ID0gQXJyYXlzLmJpbmFyeVNlYXJjaChNQ0NfQ09ERVMsIChzaG9ydCltY2MpOwotICAgICAgICBpZiAoaW5kZXggPCAwKSB7CisgICAgICAgIE1jY0VudHJ5IGVudHJ5OworCisgICAgICAgIGVudHJ5ID0gZW50cnlGb3JNY2MobWNjKTsKKyAgICAgICAgaWYgKGVudHJ5ID09IG51bGwgfHwgZW50cnkuaXNvID09IG51bGwpIHsKICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgTG9jYWxlIGxvY2FsZTsKKyAgICAgICAgICAgIGlmIChlbnRyeS5sYW5ndWFnZSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgbG9jYWxlID0gbmV3IExvY2FsZShlbnRyeS5pc28pOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBsb2NhbGUgPSBuZXcgTG9jYWxlKGVudHJ5Lmxhbmd1YWdlLCBlbnRyeS5pc28pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgU3RyaW5nW10gdHogPSBUaW1lWm9uZXMuZm9yTG9jYWxlKGxvY2FsZSk7CisgICAgICAgICAgICBpZiAodHoubGVuZ3RoID09IDApIHJldHVybiBudWxsOworICAgICAgICAgICAgcmV0dXJuIHR6WzBdOwogICAgICAgICB9Ci0gICAgICAgIGludCBpbmRDb2RlID0gSU5EX0NPREVTW2luZGV4XTsKLSAgICAgICAgaW50IHR6SW5kID0gKGluZENvZGUgPj4+IDQpICYgMHgwMDFGOwotICAgICAgICBTdHJpbmcgdHogPSBUWl9TVFJJTkdTW3R6SW5kXTsKLSAgICAgICAgaWYgKHR6ID09ICIiKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdHo7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogR2l2ZW4gYSBNb2JpbGUgQ291bnRyeSBDb2RlLCByZXR1cm5zIGFuIElTTyB0d28tY2hhcmFjdGVyCi0gICAgICogY291bnRyeSBjb2RlIGlmIGF2YWlsYWJsZS4gIFJldHVybnMgIiIgaWYgdW5hdmFpbGFibGUuCisgICAgICogR2l2ZW4gYSBHU00gTW9iaWxlIENvdW50cnkgQ29kZSwgcmV0dXJucworICAgICAqIGFuIElTTyB0d28tY2hhcmFjdGVyIGNvdW50cnkgY29kZSBpZiBhdmFpbGFibGUuCisgICAgICogUmV0dXJucyAiIiBpZiB1bmF2YWlsYWJsZS4KICAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBjb3VudHJ5Q29kZUZvck1jYyhpbnQgbWNjKSB7Ci0gICAgICAgIGludCBpbmRleCA9IEFycmF5cy5iaW5hcnlTZWFyY2goTUNDX0NPREVTLCAoc2hvcnQpbWNjKTsKLSAgICAgICAgaWYgKGluZGV4IDwgMCkgeworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nCisgICAgY291bnRyeUNvZGVGb3JNY2MoaW50IG1jYykKKyAgICB7CisgICAgICAgIE1jY0VudHJ5IGVudHJ5OworCisgICAgICAgIGVudHJ5ID0gZW50cnlGb3JNY2MobWNjKTsKKworICAgICAgICBpZiAoZW50cnkgPT0gbnVsbCkgewogICAgICAgICAgICAgcmV0dXJuICIiOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIGVudHJ5LmlzbzsKICAgICAgICAgfQotICAgICAgICBpbnQgaW5kQ29kZSA9IElORF9DT0RFU1tpbmRleF07Ci0gICAgICAgIGJ5dGVbXSBpc28gPSB7KGJ5dGUpKChpbmRDb2RlID4+PiAyNCkgJiAweDAwRkYpLCAoYnl0ZSkoKGluZENvZGUgPj4+IDE2KSAmIDB4MDBGRil9OwotICAgICAgICByZXR1cm4gbmV3IFN0cmluZyhpc28pOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIEdpdmVuIGEgR1NNIE1vYmlsZSBDb3VudHJ5IENvZGUsIHJldHVybnMgYW4gSVNPIDItMyBjaGFyYWN0ZXIKLSAgICAgKiBsYW5ndWFnZSBjb2RlIGlmIGF2YWlsYWJsZS4gIFJldHVybnMgbnVsbCBpZiB1bmF2YWlsYWJsZS4KKyAgICAgKiBHaXZlbiBhIEdTTSBNb2JpbGUgQ291bnRyeSBDb2RlLCByZXR1cm5zCisgICAgICogYW4gSVNPIDItMyBjaGFyYWN0ZXIgbGFuZ3VhZ2UgY29kZSBpZiBhdmFpbGFibGUuCisgICAgICogUmV0dXJucyBudWxsIGlmIHVuYXZhaWxhYmxlLgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGRlZmF1bHRMYW5ndWFnZUZvck1jYyhpbnQgbWNjKSB7Ci0gICAgICAgIGludCBpbmRleCA9IEFycmF5cy5iaW5hcnlTZWFyY2goTUNDX0NPREVTLCAoc2hvcnQpbWNjKTsKLSAgICAgICAgaWYgKGluZGV4IDwgMCkgeworICAgICAgICBNY2NFbnRyeSBlbnRyeTsKKworICAgICAgICBlbnRyeSA9IGVudHJ5Rm9yTWNjKG1jYyk7CisKKyAgICAgICAgaWYgKGVudHJ5ID09IG51bGwpIHsKICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIGVudHJ5Lmxhbmd1YWdlOwogICAgICAgICB9Ci0gICAgICAgIGludCBpbmRDb2RlID0gSU5EX0NPREVTW2luZGV4XTsKLSAgICAgICAgaW50IGxhbmdJbmQgPSBpbmRDb2RlICYgMHgwMDBGOwotICAgICAgICBTdHJpbmcgbGFuZyA9IExBTkdfU1RSSU5HU1tsYW5nSW5kXTsKLSAgICAgICAgaWYgKGxhbmcgPT0gIiIpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBsYW5nOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIEdpdmVuIGEgR1NNIE1vYmlsZSBDb3VudHJ5IENvZGUsIHJldHVybnMgdGhlIGNvcnJlc3BvbmRpbmcKLSAgICAgKiBzbWFsbGVzdCBudW1iZXIgb2YgZGlnaXRzIGZpZWxkLiAgUmV0dXJucyAyIGlmIHVuYXZhaWxhYmxlLgorICAgICAqIEdpdmVuIGEgR1NNIE1vYmlsZSBDb3VudHJ5IENvZGUsIHJldHVybnMKKyAgICAgKiB0aGUgc21hbGxlc3QgbnVtYmVyIG9mIGRpZ2l0cyB0aGF0IE0gaWYgYXZhaWxhYmxlLgorICAgICAqIFJldHVybnMgMiBpZiB1bmF2YWlsYWJsZS4KICAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGludCBzbWFsbGVzdERpZ2l0c01jY0Zvck1uYyhpbnQgbWNjKSB7Ci0gICAgICAgIGludCBpbmRleCA9IEFycmF5cy5iaW5hcnlTZWFyY2goTUNDX0NPREVTLCAoc2hvcnQpbWNjKTsKLSAgICAgICAgaWYgKGluZGV4IDwgMCkgeworICAgIHB1YmxpYyBzdGF0aWMgaW50CisgICAgc21hbGxlc3REaWdpdHNNY2NGb3JNbmMoaW50IG1jYykKKyAgICB7CisgICAgICAgIE1jY0VudHJ5IGVudHJ5OworCisgICAgICAgIGVudHJ5ID0gZW50cnlGb3JNY2MobWNjKTsKKworICAgICAgICBpZiAoZW50cnkgPT0gbnVsbCkgewogICAgICAgICAgICAgcmV0dXJuIDI7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gZW50cnkuc21hbGxlc3REaWdpdHNNbmM7CiAgICAgICAgIH0KLSAgICAgICAgaW50IGluZENvZGUgPSBJTkRfQ09ERVNbaW5kZXhdOwotICAgICAgICBpbnQgc21EaWcgPSAoaW5kQ29kZSA+Pj4gOSkgJiAweDAwMDM7Ci0gICAgICAgIHJldHVybiBzbURpZzsKICAgICB9CiAKICAgICAvKioKICAgICAgKiBHaXZlbiBhIEdTTSBNb2JpbGUgQ291bnRyeSBDb2RlLCByZXR1cm5zIHRoZSBudW1iZXIgb2Ygd2lmaQogICAgICAqIGNoYW5uZWxzIGFsbG93ZWQgaW4gdGhhdCBjb3VudHJ5LiAgUmV0dXJucyAwIGlmIHVuYXZhaWxhYmxlLgogICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgaW50IHdpZmlDaGFubmVsc0Zvck1jYyhpbnQgbWNjKSB7Ci0gICAgICAgIGludCBpbmRleCA9IEFycmF5cy5iaW5hcnlTZWFyY2goTUNDX0NPREVTLCAoc2hvcnQpbWNjKTsKLSAgICAgICAgaWYgKGluZGV4IDwgMCkgeworICAgIHB1YmxpYyBzdGF0aWMgaW50CisgICAgd2lmaUNoYW5uZWxzRm9yTWNjKGludCBtY2MpIHsKKyAgICAgICAgTWNjRW50cnkgZW50cnk7CisKKyAgICAgICAgZW50cnkgPSBlbnRyeUZvck1jYyhtY2MpOworCisgICAgICAgIGlmIChlbnRyeSA9PSBudWxsKSB7CiAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiBlbnRyeS53aWZpQ2hhbm5lbHM7CiAgICAgICAgIH0KLSAgICAgICAgaW50IGluZENvZGUgPSBJTkRfQ09ERVNbaW5kZXhdOwotICAgICAgICBpbnQgd2lmaSA9IChpbmRDb2RlID4+PiAxMSkgJiAweDAwMEY7Ci0gICAgICAgIHJldHVybiB3aWZpOwogICAgIH0KIAogICAgIC8qKgpAQCAtNjU2LDQgKzI3NiwyNjIgQEAKICAgICAgICAgICAgIHdNLnNldE51bUFsbG93ZWRDaGFubmVscyh3aWZpQ2hhbm5lbHMsIHRydWUpOwogICAgICAgICB9CiAgICAgfQorCisgICAgc3RhdGljIHsKKyAgICAgICAgdGFibGUgPSBuZXcgQXJyYXlMaXN0PE1jY0VudHJ5PigyNDApOworCisKKyAgICAgICAgLyoKKyAgICAgICAgICogVGhlIHRhYmxlIGJlbG93IGlzIGJ1aWx0IGZyb20gdHdvIHJlc291cmNlczoKKyAgICAgICAgICoKKyAgICAgICAgICogMSkgSVRVICJNb2JpbGUgTmV0d29yayBDb2RlIChNTkMpIGZvciB0aGUgaW50ZXJuYXRpb25hbAorICAgICAgICAgKiAgIGlkZW50aWZpY2F0aW9uIHBsYW4gZm9yIG1vYmlsZSB0ZXJtaW5hbHMgYW5kIG1vYmlsZSB1c2VycyIKKyAgICAgICAgICogICB3aGljaCBpcyBhdmFpbGFibGUgYXMgYW4gYW5uZXggdG8gdGhlIElUVSBvcGVyYXRpb25hbCBidWxsZXRpbgorICAgICAgICAgKiAgIGF2YWlsYWJsZSBoZXJlOiBodHRwOi8vd3d3Lml0dS5pbnQvaXR1LXQvYnVsbGV0aW4vYW5uZXguaHRtbAorICAgICAgICAgKgorICAgICAgICAgKiAyKSBUaGUgSVNPIDMxNjYgY291bnRyeSBjb2RlcyBsaXN0LCBhdmFpbGFibGUgaGVyZToKKyAgICAgICAgICogICAgaHR0cDovL3d3dy5pc28ub3JnL2lzby9lbi9wcm9kcy1zZXJ2aWNlcy9pc28zMTY2bWEvMDJpc28tMzE2Ni1jb2RlLWxpc3RzL2luZGV4Lmh0bWwKKyAgICAgICAgICoKKyAgICAgICAgICogVGhpcyB0YWJsZSBoYXMgbm90IGJlZW4gdmVyaWZpZWQuCisgICAgICAgICAqCisgICAgICAgICAqLworCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoMjAyLCJnciIsMikpOwkvL0dyZWVjZQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDIwNCwibmwiLDIsIm5sIiwxMykpOwkvL05ldGhlcmxhbmRzIChLaW5nZG9tIG9mIHRoZSkKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSgyMDYsImJlIiwyKSk7CS8vQmVsZ2l1bQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDIwOCwiZnIiLDIsImZyIikpOwkvL0ZyYW5jZQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDIxMiwibWMiLDIpKTsJLy9Nb25hY28gKFByaW5jaXBhbGl0eSBvZikKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSgyMTMsImFkIiwyKSk7CS8vQW5kb3JyYSAoUHJpbmNpcGFsaXR5IG9mKQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDIxNCwiZXMiLDIsImVzIikpOwkvL1NwYWluCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoMjE2LCJodSIsMikpOwkvL0h1bmdhcnkgKFJlcHVibGljIG9mKQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDIxOCwiYmEiLDIpKTsJLy9Cb3NuaWEgYW5kIEhlcnplZ292aW5hCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoMjE5LCJociIsMikpOwkvL0Nyb2F0aWEgKFJlcHVibGljIG9mKQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDIyMCwicnMiLDIpKTsJLy9TZXJiaWEgYW5kIE1vbnRlbmVncm8KKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSgyMjIsIml0IiwyLCJpdCIpKTsJLy9JdGFseQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDIyNSwidmEiLDIsIml0IikpOwkvL1ZhdGljYW4gQ2l0eSBTdGF0ZQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDIyNiwicm8iLDIpKTsJLy9Sb21hbmlhCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoMjI4LCJjaCIsMiwiZGUiKSk7CS8vU3dpdHplcmxhbmQgKENvbmZlZGVyYXRpb24gb2YpCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoMjMwLCJjeiIsMiwiY3MiLDEzKSk7CS8vQ3plY2ggUmVwdWJsaWMKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSgyMzEsInNrIiwyKSk7CS8vU2xvdmFrIFJlcHVibGljCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoMjMyLCJhdCIsMiwiZGUiLDEzKSk7CS8vQXVzdHJpYQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDIzNCwiZ2IiLDIsImVuIiwxMykpOwkvL1VuaXRlZCBLaW5nZG9tIG9mIEdyZWF0IEJyaXRhaW4gYW5kIE5vcnRoZXJuIElyZWxhbmQKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSgyMzUsImdiIiwyLCJlbiIsMTMpKTsJLy9Vbml0ZWQgS2luZ2RvbSBvZiBHcmVhdCBCcml0YWluIGFuZCBOb3J0aGVybiBJcmVsYW5kCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoMjM4LCJkayIsMikpOwkvL0Rlbm1hcmsKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSgyNDAsInNlIiwyKSk7CS8vU3dlZGVuCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoMjQyLCJubyIsMikpOwkvL05vcndheQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDI0NCwiZmkiLDIpKTsJLy9GaW5sYW5kCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoMjQ2LCJsdCIsMikpOwkvL0xpdGh1YW5pYSAoUmVwdWJsaWMgb2YpCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoMjQ3LCJsdiIsMikpOwkvL0xhdHZpYSAoUmVwdWJsaWMgb2YpCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoMjQ4LCJlZSIsMikpOwkvL0VzdG9uaWEgKFJlcHVibGljIG9mKQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDI1MCwicnUiLDIpKTsJLy9SdXNzaWFuIEZlZGVyYXRpb24KKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSgyNTUsInVhIiwyKSk7CS8vVWtyYWluZQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDI1NywiYnkiLDIpKTsJLy9CZWxhcnVzIChSZXB1YmxpYyBvZikKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSgyNTksIm1kIiwyKSk7CS8vTW9sZG92YSAoUmVwdWJsaWMgb2YpCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoMjYwLCJwbCIsMikpOwkvL1BvbGFuZCAoUmVwdWJsaWMgb2YpCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoMjYyLCJkZSIsMiwiZGUiLDEzKSk7CS8vR2VybWFueSAoRmVkZXJhbCBSZXB1YmxpYyBvZikKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSgyNjYsImdpIiwyKSk7CS8vR2licmFsdGFyCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoMjY4LCJwdCIsMikpOwkvL1BvcnR1Z2FsCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoMjcwLCJsdSIsMikpOwkvL0x1eGVtYm91cmcKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSgyNzIsImllIiwyLCJlbiIpKTsJLy9JcmVsYW5kCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoMjc0LCJpcyIsMikpOwkvL0ljZWxhbmQKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSgyNzYsImFsIiwyKSk7CS8vQWxiYW5pYSAoUmVwdWJsaWMgb2YpCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoMjc4LCJtdCIsMikpOwkvL01hbHRhCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoMjgwLCJjeSIsMikpOwkvL0N5cHJ1cyAoUmVwdWJsaWMgb2YpCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoMjgyLCJnZSIsMikpOwkvL0dlb3JnaWEKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSgyODMsImFtIiwyKSk7CS8vQXJtZW5pYSAoUmVwdWJsaWMgb2YpCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoMjg0LCJiZyIsMikpOwkvL0J1bGdhcmlhIChSZXB1YmxpYyBvZikKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSgyODYsInRyIiwyKSk7CS8vVHVya2V5CisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoMjg4LCJmbyIsMikpOwkvL0Zhcm9lIElzbGFuZHMKKyAgICAgICAgICAgICAgICB0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDI4OSwiZ2UiLDIpKTsgICAgLy9BYmtoYXppYSAoR2VvcmdpYSkKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSgyOTAsImdsIiwyKSk7CS8vR3JlZW5sYW5kIChEZW5tYXJrKQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDI5Miwic20iLDIpKTsJLy9TYW4gTWFyaW5vIChSZXB1YmxpYyBvZikKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSgyOTMsInNsIiwyKSk7CS8vU2xvdmVuaWEgKFJlcHVibGljIG9mKQorICAgICAgICAgICAgICAgIHRhYmxlLmFkZChuZXcgTWNjRW50cnkoMjk0LCJtayIsMikpOyAgIC8vVGhlIEZvcm1lciBZdWdvc2xhdiBSZXB1YmxpYyBvZiBNYWNlZG9uaWEKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSgyOTUsImxpIiwyKSk7CS8vTGllY2h0ZW5zdGVpbiAoUHJpbmNpcGFsaXR5IG9mKQorICAgICAgICAgICAgICAgIHRhYmxlLmFkZChuZXcgTWNjRW50cnkoMjk3LCJtZSIsMikpOyAgICAvL01vbnRlbmVncm8gKFJlcHVibGljIG9mKQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDMwMiwiY2EiLDMsIiIsMTEpKTsJLy9DYW5hZGEKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSgzMDgsInBtIiwyKSk7CS8vU2FpbnQgUGllcnJlIGFuZCBNaXF1ZWxvbiAoQ29sbGVjdGl2aXQgdGVycml0b3JpYWxlIGRlIGxhIFJwdWJsaXF1ZSBmcmFuYWlzZSkKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSgzMTAsInVzIiwzLCJlbiIsMTEpKTsJLy9Vbml0ZWQgU3RhdGVzIG9mIEFtZXJpY2EKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSgzMTEsInVzIiwzLCJlbiIsMTEpKTsJLy9Vbml0ZWQgU3RhdGVzIG9mIEFtZXJpY2EKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSgzMTIsInVzIiwzLCJlbiIsMTEpKTsJLy9Vbml0ZWQgU3RhdGVzIG9mIEFtZXJpY2EKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSgzMTMsInVzIiwzLCJlbiIsMTEpKTsJLy9Vbml0ZWQgU3RhdGVzIG9mIEFtZXJpY2EKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSgzMTQsInVzIiwzLCJlbiIsMTEpKTsJLy9Vbml0ZWQgU3RhdGVzIG9mIEFtZXJpY2EKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSgzMTUsInVzIiwzLCJlbiIsMTEpKTsJLy9Vbml0ZWQgU3RhdGVzIG9mIEFtZXJpY2EKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSgzMTYsInVzIiwzLCJlbiIsMTEpKTsJLy9Vbml0ZWQgU3RhdGVzIG9mIEFtZXJpY2EKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSgzMzAsInByIiwyKSk7CS8vUHVlcnRvIFJpY28KKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSgzMzIsInZpIiwyKSk7CS8vVW5pdGVkIFN0YXRlcyBWaXJnaW4gSXNsYW5kcworCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDMzNCwibXgiLDMpKTsJLy9NZXhpY28KKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSgzMzgsImptIiwzKSk7CS8vSmFtYWljYQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDM0MCwiZ3AiLDIpKTsJLy9HdWFkZWxvdXBlIChGcmVuY2ggRGVwYXJ0bWVudCBvZikKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSgzNDIsImJiIiwzKSk7CS8vQmFyYmFkb3MKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSgzNDQsImFnIiwzKSk7CS8vQW50aWd1YSBhbmQgQmFyYnVkYQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDM0Niwia3kiLDMpKTsJLy9DYXltYW4gSXNsYW5kcworCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDM0OCwidmciLDMpKTsJLy9Ccml0aXNoIFZpcmdpbiBJc2xhbmRzCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoMzUwLCJibSIsMikpOwkvL0Jlcm11ZGEKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSgzNTIsImdkIiwyKSk7CS8vR3JlbmFkYQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDM1NCwibXMiLDIpKTsJLy9Nb250c2VycmF0CisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoMzU2LCJrbiIsMikpOwkvL1NhaW50IEtpdHRzIGFuZCBOZXZpcworCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDM1OCwibGMiLDIpKTsJLy9TYWludCBMdWNpYQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDM2MCwidmMiLDIpKTsJLy9TYWludCBWaW5jZW50IGFuZCB0aGUgR3JlbmFkaW5lcworCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDM2MiwibmwiLDIpKTsJLy9OZXRoZXJsYW5kcyBBbnRpbGxlcworCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDM2MywiYXciLDIpKTsJLy9BcnViYQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDM2NCwiYnMiLDIpKTsJLy9CYWhhbWFzIChDb21tb253ZWFsdGggb2YgdGhlKQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDM2NSwiYWkiLDMpKTsJLy9Bbmd1aWxsYQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDM2NiwiZG0iLDIpKTsJLy9Eb21pbmljYSAoQ29tbW9ud2VhbHRoIG9mKQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDM2OCwiY3UiLDIpKTsJLy9DdWJhCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoMzcwLCJkbyIsMikpOwkvL0RvbWluaWNhbiBSZXB1YmxpYworCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDM3MiwiaHQiLDIpKTsJLy9IYWl0aSAoUmVwdWJsaWMgb2YpCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoMzc0LCJ0dCIsMikpOwkvL1RyaW5pZGFkIGFuZCBUb2JhZ28KKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSgzNzYsInRjIiwyKSk7CS8vVHVya3MgYW5kIENhaWNvcyBJc2xhbmRzCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNDAwLCJheiIsMikpOwkvL0F6ZXJiYWlqYW5pIFJlcHVibGljCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNDAxLCJreiIsMikpOwkvL0themFraHN0YW4gKFJlcHVibGljIG9mKQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDQwMiwiYnQiLDIpKTsJLy9CaHV0YW4gKEtpbmdkb20gb2YpCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNDA0LCJpbiIsMikpOwkvL0luZGlhIChSZXB1YmxpYyBvZikKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg0MDUsImluIiwyKSk7CS8vSW5kaWEgKFJlcHVibGljIG9mKQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDQxMCwicGsiLDIpKTsJLy9QYWtpc3RhbiAoSXNsYW1pYyBSZXB1YmxpYyBvZikKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg0MTIsImFmIiwyKSk7CS8vQWZnaGFuaXN0YW4KKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg0MTMsImxrIiwyKSk7CS8vU3JpIExhbmthIChEZW1vY3JhdGljIFNvY2lhbGlzdCBSZXB1YmxpYyBvZikKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg0MTQsIm1tIiwyKSk7CS8vTXlhbm1hciAoVW5pb24gb2YpCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNDE1LCJsYiIsMikpOwkvL0xlYmFub24KKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg0MTYsImpvIiwyKSk7CS8vSm9yZGFuIChIYXNoZW1pdGUgS2luZ2RvbSBvZikKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg0MTcsInN5IiwyKSk7CS8vU3lyaWFuIEFyYWIgUmVwdWJsaWMKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg0MTgsImlxIiwyKSk7CS8vSXJhcSAoUmVwdWJsaWMgb2YpCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNDE5LCJrdyIsMikpOwkvL0t1d2FpdCAoU3RhdGUgb2YpCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNDIwLCJzYSIsMikpOwkvL1NhdWRpIEFyYWJpYSAoS2luZ2RvbSBvZikKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg0MjEsInllIiwyKSk7CS8vWWVtZW4gKFJlcHVibGljIG9mKQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDQyMiwib20iLDIpKTsJLy9PbWFuIChTdWx0YW5hdGUgb2YpCisgICAgICAgICAgICAgICAgdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg0MjMsInBzIiwyKSk7ICAgIC8vUGFsZXN0aW5lCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNDI0LCJhZSIsMikpOwkvL1VuaXRlZCBBcmFiIEVtaXJhdGVzCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNDI1LCJpbCIsMikpOwkvL0lzcmFlbCAoU3RhdGUgb2YpCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNDI2LCJiaCIsMikpOwkvL0JhaHJhaW4gKEtpbmdkb20gb2YpCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNDI3LCJxYSIsMikpOwkvL1FhdGFyIChTdGF0ZSBvZikKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg0MjgsIm1uIiwyKSk7CS8vTW9uZ29saWEKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg0MjksIm5wIiwyKSk7CS8vTmVwYWwKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg0MzAsImFlIiwyKSk7CS8vVW5pdGVkIEFyYWIgRW1pcmF0ZXMKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg0MzEsImFlIiwyKSk7CS8vVW5pdGVkIEFyYWIgRW1pcmF0ZXMKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg0MzIsImlyIiwyKSk7CS8vSXJhbiAoSXNsYW1pYyBSZXB1YmxpYyBvZikKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg0MzQsInV6IiwyKSk7CS8vVXpiZWtpc3RhbiAoUmVwdWJsaWMgb2YpCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNDM2LCJ0aiIsMikpOwkvL1RhamlraXN0YW4gKFJlcHVibGljIG9mKQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDQzNywia2ciLDIpKTsJLy9LeXJneXogUmVwdWJsaWMKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg0MzgsInRtIiwyKSk7CS8vVHVya21lbmlzdGFuCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNDQwLCJqcCIsMiwiamEiLDE0KSk7CS8vSmFwYW4KKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg0NDEsImpwIiwyLCJqYSIsMTQpKTsJLy9KYXBhbgorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDQ1MCwia3IiLDIsImtvIiwxMykpOwkvL0tvcmVhIChSZXB1YmxpYyBvZikKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg0NTIsInZuIiwyKSk7CS8vVmlldCBOYW0gKFNvY2lhbGlzdCBSZXB1YmxpYyBvZikKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg0NTQsImhrIiwyKSk7CS8vIkhvbmcgS29uZywgQ2hpbmEiCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNDU1LCJtbyIsMikpOwkvLyJNYWNhbywgQ2hpbmEiCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNDU2LCJraCIsMikpOwkvL0NhbWJvZGlhIChLaW5nZG9tIG9mKQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDQ1NywibGEiLDIpKTsJLy9MYW8gUGVvcGxlJ3MgRGVtb2NyYXRpYyBSZXB1YmxpYworCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDQ2MCwiY24iLDIsInpoIiwxMykpOwkvL0NoaW5hIChQZW9wbGUncyBSZXB1YmxpYyBvZikKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg0NjEsImNuIiwyLCJ6aCIsMTMpKTsJLy9DaGluYSAoUGVvcGxlJ3MgUmVwdWJsaWMgb2YpCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNDY2LCJ0dyIsMikpOwkvLyJUYWl3YW4sIENoaW5hIgorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDQ2Nywia3AiLDIpKTsJLy9EZW1vY3JhdGljIFBlb3BsZSdzIFJlcHVibGljIG9mIEtvcmVhCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNDcwLCJiZCIsMikpOwkvL0JhbmdsYWRlc2ggKFBlb3BsZSdzIFJlcHVibGljIG9mKQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDQ3MiwibXYiLDIpKTsJLy9NYWxkaXZlcyAoUmVwdWJsaWMgb2YpCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNTAyLCJteSIsMikpOwkvL01hbGF5c2lhCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNTA1LCJhdSIsMiwiZW4iLDExKSk7CS8vQXVzdHJhbGlhCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNTEwLCJpZCIsMikpOwkvL0luZG9uZXNpYSAoUmVwdWJsaWMgb2YpCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNTE0LCJ0bCIsMikpOwkvL0RlbW9jcmF0aWMgUmVwdWJsaWMgb2YgVGltb3ItTGVzdGUKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg1MTUsInBoIiwyKSk7CS8vUGhpbGlwcGluZXMgKFJlcHVibGljIG9mIHRoZSkKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg1MjAsInRoIiwyKSk7CS8vVGhhaWxhbmQKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg1MjUsInNnIiwyLCJlbiIsMTEpKTsJLy9TaW5nYXBvcmUgKFJlcHVibGljIG9mKQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDUyOCwiYm4iLDIpKTsJLy9CcnVuZWkgRGFydXNzYWxhbQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDUzMCwibnoiLDIsICJlbiIpKTsJLy9OZXcgWmVhbGFuZAorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDUzNCwibXAiLDIpKTsJLy9Ob3J0aGVybiBNYXJpYW5hIElzbGFuZHMgKENvbW1vbndlYWx0aCBvZiB0aGUpCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNTM1LCJndSIsMikpOwkvL0d1YW0KKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg1MzYsIm5yIiwyKSk7CS8vTmF1cnUgKFJlcHVibGljIG9mKQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDUzNywicGciLDIpKTsJLy9QYXB1YSBOZXcgR3VpbmVhCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNTM5LCJ0byIsMikpOwkvL1RvbmdhIChLaW5nZG9tIG9mKQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDU0MCwic2IiLDIpKTsJLy9Tb2xvbW9uIElzbGFuZHMKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg1NDEsInZ1IiwyKSk7CS8vVmFudWF0dSAoUmVwdWJsaWMgb2YpCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNTQyLCJmaiIsMikpOwkvL0ZpamkgKFJlcHVibGljIG9mKQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDU0Mywid2YiLDIpKTsJLy9XYWxsaXMgYW5kIEZ1dHVuYSAoVGVycml0b2lyZSBmcmFuYWlzIGQnb3V0cmUtbWVyKQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDU0NCwiYXMiLDIpKTsJLy9BbWVyaWNhbiBTYW1vYQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDU0NSwia2kiLDIpKTsJLy9LaXJpYmF0aSAoUmVwdWJsaWMgb2YpCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNTQ2LCJuYyIsMikpOwkvL05ldyBDYWxlZG9uaWEgKFRlcnJpdG9pcmUgZnJhbmFpcyBkJ291dHJlLW1lcikKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg1NDcsInBmIiwyKSk7CS8vRnJlbmNoIFBvbHluZXNpYSAoVGVycml0b2lyZSBmcmFuYWlzIGQnb3V0cmUtbWVyKQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDU0OCwiY2siLDIpKTsJLy9Db29rIElzbGFuZHMKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg1NDksIndzIiwyKSk7CS8vU2Ftb2EgKEluZGVwZW5kZW50IFN0YXRlIG9mKQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDU1MCwiZm0iLDIpKTsJLy9NaWNyb25lc2lhIChGZWRlcmF0ZWQgU3RhdGVzIG9mKQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDU1MSwibWgiLDIpKTsJLy9NYXJzaGFsbCBJc2xhbmRzIChSZXB1YmxpYyBvZiB0aGUpCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNTUyLCJwdyIsMikpOwkvL1BhbGF1IChSZXB1YmxpYyBvZikKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg2MDIsImVnIiwyKSk7CS8vRWd5cHQgKEFyYWIgUmVwdWJsaWMgb2YpCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNjAzLCJkeiIsMikpOwkvL0FsZ2VyaWEgKFBlb3BsZSdzIERlbW9jcmF0aWMgUmVwdWJsaWMgb2YpCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNjA0LCJtYSIsMikpOwkvL01vcm9jY28gKEtpbmdkb20gb2YpCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNjA1LCJ0biIsMikpOwkvL1R1bmlzaWEKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg2MDYsImx5IiwyKSk7CS8vTGlieWEgKFNvY2lhbGlzdCBQZW9wbGUncyBMaWJ5YW4gQXJhYiBKYW1haGlyaXlhKQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDYwNywiZ20iLDIpKTsJLy9HYW1iaWEgKFJlcHVibGljIG9mIHRoZSkKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg2MDgsInNuIiwyKSk7CS8vU2VuZWdhbCAoUmVwdWJsaWMgb2YpCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNjA5LCJtciIsMikpOwkvL01hdXJpdGFuaWEgKElzbGFtaWMgUmVwdWJsaWMgb2YpCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNjEwLCJtbCIsMikpOwkvL01hbGkgKFJlcHVibGljIG9mKQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDYxMSwiZ24iLDIpKTsJLy9HdWluZWEgKFJlcHVibGljIG9mKQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDYxMiwiY2kiLDIpKTsJLy9DdGUgZCdJdm9pcmUgKFJlcHVibGljIG9mKQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDYxMywiYmYiLDIpKTsJLy9CdXJraW5hIEZhc28KKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg2MTQsIm5lIiwyKSk7CS8vTmlnZXIgKFJlcHVibGljIG9mIHRoZSkKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg2MTUsInRnIiwyKSk7CS8vVG9nb2xlc2UgUmVwdWJsaWMKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg2MTYsImJqIiwyKSk7CS8vQmVuaW4gKFJlcHVibGljIG9mKQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDYxNywibXUiLDIpKTsJLy9NYXVyaXRpdXMgKFJlcHVibGljIG9mKQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDYxOCwibHIiLDIpKTsJLy9MaWJlcmlhIChSZXB1YmxpYyBvZikKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg2MTksInNsIiwyKSk7CS8vU2llcnJhIExlb25lCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNjIwLCJnaCIsMikpOwkvL0doYW5hCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNjIxLCJuZyIsMikpOwkvL05pZ2VyaWEgKEZlZGVyYWwgUmVwdWJsaWMgb2YpCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNjIyLCJ0ZCIsMikpOwkvL0NoYWQgKFJlcHVibGljIG9mKQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDYyMywiY2YiLDIpKTsJLy9DZW50cmFsIEFmcmljYW4gUmVwdWJsaWMKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg2MjQsImNtIiwyKSk7CS8vQ2FtZXJvb24gKFJlcHVibGljIG9mKQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDYyNSwiY3YiLDIpKTsJLy9DYXBlIFZlcmRlIChSZXB1YmxpYyBvZikKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg2MjYsInN0IiwyKSk7CS8vU2FvIFRvbWUgYW5kIFByaW5jaXBlIChEZW1vY3JhdGljIFJlcHVibGljIG9mKQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDYyNywiZ3EiLDIpKTsJLy9FcXVhdG9yaWFsIEd1aW5lYSAoUmVwdWJsaWMgb2YpCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNjI4LCJnYSIsMikpOwkvL0dhYm9uZXNlIFJlcHVibGljCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNjI5LCJjZyIsMikpOwkvL0NvbmdvIChSZXB1YmxpYyBvZiB0aGUpCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNjMwLCJjZyIsMikpOwkvL0RlbW9jcmF0aWMgUmVwdWJsaWMgb2YgdGhlIENvbmdvCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNjMxLCJhbyIsMikpOwkvL0FuZ29sYSAoUmVwdWJsaWMgb2YpCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNjMyLCJndyIsMikpOwkvL0d1aW5lYS1CaXNzYXUgKFJlcHVibGljIG9mKQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDYzMywic2MiLDIpKTsJLy9TZXljaGVsbGVzIChSZXB1YmxpYyBvZikKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg2MzQsInNkIiwyKSk7CS8vU3VkYW4gKFJlcHVibGljIG9mIHRoZSkKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg2MzUsInJ3IiwyKSk7CS8vUndhbmRhIChSZXB1YmxpYyBvZikKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg2MzYsImV0IiwyKSk7CS8vRXRoaW9waWEgKEZlZGVyYWwgRGVtb2NyYXRpYyBSZXB1YmxpYyBvZikKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg2MzcsInNvIiwyKSk7CS8vU29tYWxpIERlbW9jcmF0aWMgUmVwdWJsaWMKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg2MzgsImRqIiwyKSk7CS8vRGppYm91dGkgKFJlcHVibGljIG9mKQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDYzOSwia2UiLDIpKTsJLy9LZW55YSAoUmVwdWJsaWMgb2YpCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNjQwLCJ0eiIsMikpOwkvL1RhbnphbmlhIChVbml0ZWQgUmVwdWJsaWMgb2YpCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNjQxLCJ1ZyIsMikpOwkvL1VnYW5kYSAoUmVwdWJsaWMgb2YpCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNjQyLCJiaSIsMikpOwkvL0J1cnVuZGkgKFJlcHVibGljIG9mKQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDY0MywibXoiLDIpKTsJLy9Nb3phbWJpcXVlIChSZXB1YmxpYyBvZikKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg2NDUsInptIiwyKSk7CS8vWmFtYmlhIChSZXB1YmxpYyBvZikKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg2NDYsIm1nIiwyKSk7CS8vTWFkYWdhc2NhciAoUmVwdWJsaWMgb2YpCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNjQ3LCJyZSIsMikpOwkvL1JldW5pb24gKEZyZW5jaCBEZXBhcnRtZW50IG9mKQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDY0OCwienciLDIpKTsJLy9aaW1iYWJ3ZSAoUmVwdWJsaWMgb2YpCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNjQ5LCJuYSIsMikpOwkvL05hbWliaWEgKFJlcHVibGljIG9mKQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDY1MCwibXciLDIpKTsJLy9NYWxhd2kKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg2NTEsImxzIiwyKSk7CS8vTGVzb3RobyAoS2luZ2RvbSBvZikKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg2NTIsImJ3IiwyKSk7CS8vQm90c3dhbmEgKFJlcHVibGljIG9mKQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDY1Mywic3oiLDIpKTsJLy9Td2F6aWxhbmQgKEtpbmdkb20gb2YpCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNjU0LCJrbSIsMikpOwkvL0NvbW9yb3MgKFVuaW9uIG9mIHRoZSkKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg2NTUsInphIiwyLCJlbiIpKTsJLy9Tb3V0aCBBZnJpY2EgKFJlcHVibGljIG9mKQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDY1NywiZXIiLDIpKTsJLy9Fcml0cmVhCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNzAyLCJieiIsMikpOwkvL0JlbGl6ZQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDcwNCwiZ3QiLDIpKTsJLy9HdWF0ZW1hbGEgKFJlcHVibGljIG9mKQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDcwNiwic3YiLDIpKTsJLy9FbCBTYWx2YWRvciAoUmVwdWJsaWMgb2YpCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNzA4LCJobiIsMykpOwkvL0hvbmR1cmFzIChSZXB1YmxpYyBvZikKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg3MTAsIm5pIiwyKSk7CS8vTmljYXJhZ3VhCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNzEyLCJjciIsMikpOwkvL0Nvc3RhIFJpY2EKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg3MTQsInBhIiwyKSk7CS8vUGFuYW1hIChSZXB1YmxpYyBvZikKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg3MTYsInBlIiwyKSk7CS8vUGVydQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDcyMiwiYXIiLDMpKTsJLy9BcmdlbnRpbmUgUmVwdWJsaWMKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg3MjQsImJyIiwyKSk7CS8vQnJhemlsIChGZWRlcmF0aXZlIFJlcHVibGljIG9mKQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDczMCwiY2wiLDIpKTsJLy9DaGlsZQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDczMiwiY28iLDMpKTsJLy9Db2xvbWJpYSAoUmVwdWJsaWMgb2YpCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNzM0LCJ2ZSIsMikpOwkvL1ZlbmV6dWVsYSAoQm9saXZhcmlhbiBSZXB1YmxpYyBvZikKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg3MzYsImJvIiwyKSk7CS8vQm9saXZpYSAoUmVwdWJsaWMgb2YpCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNzM4LCJneSIsMikpOwkvL0d1eWFuYQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDc0MCwiZWMiLDIpKTsJLy9FY3VhZG9yCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNzQyLCJnZiIsMikpOwkvL0ZyZW5jaCBHdWlhbmEgKEZyZW5jaCBEZXBhcnRtZW50IG9mKQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDc0NCwicHkiLDIpKTsJLy9QYXJhZ3VheSAoUmVwdWJsaWMgb2YpCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNzQ2LCJzciIsMikpOwkvL1N1cmluYW1lIChSZXB1YmxpYyBvZikKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg3NDgsInV5IiwyKSk7CS8vVXJ1Z3VheSAoRWFzdGVybiBSZXB1YmxpYyBvZikKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg3NTAsImZrIiwyKSk7CS8vRmFsa2xhbmQgSXNsYW5kcyAoTWFsdmluYXMpCisgICAgICAgIC8vdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg5MDEsIiIsMikpOwkvLyJJbnRlcm5hdGlvbmFsIE1vYmlsZSwgc2hhcmVkIGNvZGUiCisKKyAgICAgICAgQ29sbGVjdGlvbnMuc29ydCh0YWJsZSk7CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L1Bob25lLmphdmEgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvUGhvbmUuamF2YQppbmRleCAzZGQ5YTAxLi5mZmZlMDU3IDEwMDY0NAotLS0gYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvUGhvbmUuamF2YQorKysgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvUGhvbmUuamF2YQpAQCAtMTcsMTAgKzE3LDkgQEAKIHBhY2thZ2UgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255OwogCiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LlNoYXJlZFByZWZlcmVuY2VzOworaW1wb3J0IGFuZHJvaWQubmV0LkxpbmtQcm9wZXJ0aWVzOwogaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlcjsKIGltcG9ydCBhbmRyb2lkLm9zLk1lc3NhZ2U7Ci1pbXBvcnQgYW5kcm9pZC5wcmVmZXJlbmNlLlByZWZlcmVuY2VNYW5hZ2VyOwogaW1wb3J0IGFuZHJvaWQudGVsZXBob255LkNlbGxMb2NhdGlvbjsKIGltcG9ydCBhbmRyb2lkLnRlbGVwaG9ueS5QaG9uZVN0YXRlTGlzdGVuZXI7CiBpbXBvcnQgYW5kcm9pZC50ZWxlcGhvbnkuU2VydmljZVN0YXRlOwpAQCAtMjgsNyArMjcsNiBAQAogCiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LkRhdGFDb25uZWN0aW9uOwogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uTmV0d29ya0luZm87Ci1pbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmdzbS5Hc21EYXRhQ29ubmVjdGlvbjsKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkudGVzdC5TaW11bGF0ZWRSYWRpb0NvbnRyb2w7CiAKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKQEAgLTk5LDExICs5NywxMSBAQAogICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEhPTkVfTkFNRV9LRVkgPSAicGhvbmVOYW1lIjsKICAgICBzdGF0aWMgZmluYWwgU3RyaW5nIEZBSUxVUkVfUkVBU09OX0tFWSA9ICJyZWFzb24iOwogICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RBVEVfQ0hBTkdFX1JFQVNPTl9LRVkgPSAicmVhc29uIjsKLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIERBVEFfQVBOX1RZUEVTX0tFWSA9ICJhcG5UeXBlIjsKKyAgICBzdGF0aWMgZmluYWwgU3RyaW5nIERBVEFfQVBOX1RZUEVfS0VZID0gImFwblR5cGUiOwogICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgREFUQV9BUE5fS0VZID0gImFwbiI7CisgICAgc3RhdGljIGZpbmFsIFN0cmluZyBEQVRBX0xJTktfUFJPUEVSVElFU19LRVkgPSAibGlua1Byb3BlcnRpZXMiOwogCiAgICAgc3RhdGljIGZpbmFsIFN0cmluZyBEQVRBX0lGQUNFX05BTUVfS0VZID0gImlmYWNlIjsKLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIERBVEFfR0FURVdBWV9LRVkgPSAiZ2F0ZXdheSI7CiAgICAgc3RhdGljIGZpbmFsIFN0cmluZyBORVRXT1JLX1VOQVZBSUxBQkxFX0tFWSA9ICJuZXR3b3JrVW52YWlsYWJsZSI7CiAgICAgc3RhdGljIGZpbmFsIFN0cmluZyBQSE9ORV9JTl9FQ01fU1RBVEUgPSAicGhvbmVpbkVDTVN0YXRlIjsKIApAQCAtMjQzLDEzICsyNDEsMjEgQEAKICAgICBDZWxsTG9jYXRpb24gZ2V0Q2VsbExvY2F0aW9uKCk7CiAKICAgICAvKioKLSAgICAgKiBHZXQgdGhlIGN1cnJlbnQgRGF0YVN0YXRlLiBObyBjaGFuZ2Ugbm90aWZpY2F0aW9uIGV4aXN0cyBhdCB0aGlzCi0gICAgICogaW50ZXJmYWNlIC0tIHVzZQorICAgICAqIEdldCB0aGUgY3VycmVudCBmb3IgdGhlIGRlZmF1bHQgYXBuIERhdGFTdGF0ZS4gTm8gY2hhbmdlIG5vdGlmaWNhdGlvbgorICAgICAqIGV4aXN0cyBhdCB0aGlzIGludGVyZmFjZSAtLSB1c2UKICAgICAgKiB7QGxpbmsgYW5kcm9pZC50ZWxlcGhvbnkuUGhvbmVTdGF0ZUxpc3RlbmVyfSBpbnN0ZWFkLgogICAgICAqLwogICAgIERhdGFTdGF0ZSBnZXREYXRhQ29ubmVjdGlvblN0YXRlKCk7CiAKICAgICAvKioKKyAgICAgKiBHZXQgdGhlIGN1cnJlbnQgRGF0YVN0YXRlLiBObyBjaGFuZ2Ugbm90aWZpY2F0aW9uIGV4aXN0cyBhdCB0aGlzCisgICAgICogaW50ZXJmYWNlIC0tIHVzZQorICAgICAqIHtAbGluayBhbmRyb2lkLnRlbGVwaG9ueS5QaG9uZVN0YXRlTGlzdGVuZXJ9IGluc3RlYWQuCisgICAgICogQHBhcmFtIGFwblR5cGUgc3BlY2lmeSBmb3Igd2hpY2ggYXBuIHRvIGdldCBjb25uZWN0aW9uIHN0YXRlIGluZm8uCisgICAgICovCisgICAgRGF0YVN0YXRlIGdldERhdGFDb25uZWN0aW9uU3RhdGUoU3RyaW5nIGFwblR5cGUpOworCisgICAgLyoqCiAgICAgICogR2V0IHRoZSBjdXJyZW50IERhdGFBY3Rpdml0eVN0YXRlLiBObyBjaGFuZ2Ugbm90aWZpY2F0aW9uIGV4aXN0cyBhdCB0aGlzCiAgICAgICogaW50ZXJmYWNlIC0tIHVzZQogICAgICAqIHtAbGluayBhbmRyb2lkLnRlbGVwaG9ueS5UZWxlcGhvbnlNYW5hZ2VyfSBpbnN0ZWFkLgpAQCAtMzEzLDYgKzMxOSwxMSBAQAogICAgIFN0cmluZyBnZXRBY3RpdmVBcG4oKTsKIAogICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgTGlua1Byb3BlcnRpZXMgZm9yIHRoZSBuYW1lZCBhcG4gb3IgbnVsbCBpZiBub3QgYXZhaWxhYmxlCisgICAgICovCisgICAgTGlua1Byb3BlcnRpZXMgZ2V0TGlua1Byb3BlcnRpZXMoU3RyaW5nIGFwblR5cGUpOworCisgICAgLyoqCiAgICAgICogR2V0IGN1cnJlbnQgc2lnbmFsIHN0cmVuZ3RoLiBObyBjaGFuZ2Ugbm90aWZpY2F0aW9uIGF2YWlsYWJsZSBvbiB0aGlzCiAgICAgICogaW50ZXJmYWNlLiBVc2UgPGNvZGU+UGhvbmVTdGF0ZU5vdGlmaWVyPC9jb2RlPiBvciBhbiBlcXVpdmFsZW50LgogICAgICAqIEFuIEFTVSBpcyAwLTMxIG9yIC0xIGlmIHVua25vd24gKGZvciBHU00sIGRCbSA9IC0xMTMgLSAyICogYXN1KS4KQEAgLTEzNjgsMjkgKzEzNzksNiBAQAogICAgIGJvb2xlYW4gaXNEYXRhQ29ubmVjdGl2aXR5UG9zc2libGUoKTsKIAogICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG5hbWUgb2YgdGhlIG5ldHdvcmsgaW50ZXJmYWNlIHVzZWQgYnkgdGhlIHNwZWNpZmllZCBBUE4gdHlwZS4KLSAgICAgKi8KLSAgICBTdHJpbmcgZ2V0SW50ZXJmYWNlTmFtZShTdHJpbmcgYXBuVHlwZSk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBJUCBhZGRyZXNzIG9mIHRoZSBuZXR3b3JrIGludGVyZmFjZSB1c2VkIGJ5IHRoZSBzcGVjaWZpZWQKLSAgICAgKiBBUE4gdHlwZS4KLSAgICAgKi8KLSAgICBTdHJpbmcgZ2V0SXBBZGRyZXNzKFN0cmluZyBhcG5UeXBlKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGdhdGV3YXkgZm9yIHRoZSBuZXR3b3JrIGludGVyZmFjZSB1c2VkIGJ5IHRoZSBzcGVjaWZpZWQgQVBOCi0gICAgICogdHlwZS4KLSAgICAgKi8KLSAgICBTdHJpbmcgZ2V0R2F0ZXdheShTdHJpbmcgYXBuVHlwZSk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBETlMgc2VydmVycyBmb3IgdGhlIG5ldHdvcmsgaW50ZXJmYWNlIHVzZWQgYnkgdGhlIHNwZWNpZmllZAotICAgICAqIEFQTiB0eXBlLgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmdbXSBnZXREbnNTZXJ2ZXJzKFN0cmluZyBhcG5UeXBlKTsKLQotICAgIC8qKgogICAgICAqIFJldHJpZXZlcyB0aGUgdW5pcXVlIGRldmljZSBJRCwgZS5nLiwgSU1FSSBmb3IgR1NNIHBob25lcyBhbmQgTUVJRCBmb3IgQ0RNQSBwaG9uZXMuCiAgICAgICovCiAgICAgU3RyaW5nIGdldERldmljZUlkKCk7CkBAIC0xNTM1LDYgKzE1MjMsMTEgQEAKICAgICBib29sZWFuIGlzT3RhU3BOdW1iZXIoU3RyaW5nIGRpYWxTdHIpOwogCiAgICAgLyoqCisgICAgICogUmV0dXJucyB0cnVlIGlmIE9UQSBTZXJ2aWNlIFByb3Zpc2lvbmluZyBuZWVkcyB0byBiZSBwZXJmb3JtZWQuCisgICAgICovCisgICAgYm9vbGVhbiBuZWVkc090YVNlcnZpY2VQcm92aXNpb25pbmcoKTsKKworICAgIC8qKgogICAgICAqIFJlZ2lzdGVyIGZvciBub3RpZmljYXRpb25zIHdoZW4gQ0RNQSBjYWxsIHdhaXRpbmcgY29tZXMKICAgICAgKgogICAgICAqIEBwYXJhbSBoIEhhbmRsZXIgdGhhdCByZWNlaXZlcyB0aGUgbm90aWZpY2F0aW9uIG1lc3NhZ2UuCmRpZmYgLS1naXQgYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvUGhvbmVCYXNlLmphdmEgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvUGhvbmVCYXNlLmphdmEKaW5kZXggMWRhOWQ0ZC4uNzhjZTQ3MyAxMDA2NDQKLS0tIGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L1Bob25lQmFzZS5qYXZhCisrKyBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9QaG9uZUJhc2UuamF2YQpAQCAtMjEsNiArMjEsNyBAQAogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuQ29uZmlndXJhdGlvbjsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuU2hhcmVkUHJlZmVyZW5jZXM7CitpbXBvcnQgYW5kcm9pZC5uZXQuTGlua1Byb3BlcnRpZXM7CiBpbXBvcnQgYW5kcm9pZC5uZXQud2lmaS5XaWZpTWFuYWdlcjsKIGltcG9ydCBhbmRyb2lkLm9zLkFzeW5jUmVzdWx0OwogaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlcjsKQEAgLTM1LDEwICszNiw4IEBACiBpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKIAogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLlI7Ci1pbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmdzbS5Hc21EYXRhQ29ubmVjdGlvbjsKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkudGVzdC5TaW11bGF0ZWRSYWRpb0NvbnRyb2w7CiAKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOwogCiAKQEAgLTczNyw4ICs3MzYsMTMgQEAKICAgICAgICAgbU5vdGlmaWVyLm5vdGlmeU1lc3NhZ2VXYWl0aW5nQ2hhbmdlZCh0aGlzKTsKICAgICB9CiAKLSAgICBwdWJsaWMgdm9pZCBub3RpZnlEYXRhQ29ubmVjdGlvbihTdHJpbmcgcmVhc29uKSB7Ci0gICAgICAgIG1Ob3RpZmllci5ub3RpZnlEYXRhQ29ubmVjdGlvbih0aGlzLCByZWFzb24pOworICAgIHB1YmxpYyB2b2lkIG5vdGlmeURhdGFDb25uZWN0aW9uKFN0cmluZyByZWFzb24sIFN0cmluZyBhcG5UeXBlLAorICAgICAgICAgICAgUGhvbmUuRGF0YVN0YXRlIHN0YXRlKSB7CisgICAgICAgIG1Ob3RpZmllci5ub3RpZnlEYXRhQ29ubmVjdGlvbih0aGlzLCByZWFzb24sIGFwblR5cGUsIHN0YXRlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBub3RpZnlEYXRhQ29ubmVjdGlvbihTdHJpbmcgcmVhc29uLCBTdHJpbmcgYXBuVHlwZSkgeworICAgICAgICBtTm90aWZpZXIubm90aWZ5RGF0YUNvbm5lY3Rpb24odGhpcywgcmVhc29uLCBhcG5UeXBlKTsKICAgICB9CiAKICAgICBwdWJsaWMgYWJzdHJhY3QgU3RyaW5nIGdldFBob25lTmFtZSgpOwpAQCAtODI0LDkgKzgyOCwxOSBAQAogICAgICAgICBsb2dVbmV4cGVjdGVkQ2RtYU1ldGhvZENhbGwoInVucmVnaXN0ZXJGb3JTdWJzY3JpcHRpb25JbmZvUmVhZHkiKTsKICAgICB9CiAKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRydWUgaWYgT1RBIFNlcnZpY2UgUHJvdmlzaW9uaW5nIG5lZWRzIHRvIGJlIHBlcmZvcm1lZC4KKyAgICAgKiBJZiBub3Qgb3ZlcnJpZGRlbiByZXR1cm4gZmFsc2UuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gbmVlZHNPdGFTZXJ2aWNlUHJvdmlzaW9uaW5nKCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRydWUgaWYgbnVtYmVyIGlzIGFuIE9UQVNQIG51bWJlci4KKyAgICAgKiBJZiBub3Qgb3ZlcnJpZGRlbiByZXR1cm4gZmFsc2UuCisgICAgICovCiAgICAgcHVibGljICBib29sZWFuIGlzT3RhU3BOdW1iZXIoU3RyaW5nIGRpYWxTdHIpIHsKLSAgICAgICAgLy8gVGhpcyBmdW5jdGlvbiBzaG91bGQgYmUgb3ZlcnJpZGRlbiBieSB0aGUgY2xhc3MgQ0RNQVBob25lLiBOb3QgaW1wbGVtZW50ZWQgaW4gR1NNUGhvbmUuCi0gICAgICAgIGxvZ1VuZXhwZWN0ZWRDZG1hTWV0aG9kQ2FsbCgiaXNPdGFTcE51bWJlciIpOwogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogCkBAIC05MTYsMzAgKzkzMCwxOCBAQAogICAgICAgICAgbG9nVW5leHBlY3RlZENkbWFNZXRob2RDYWxsKCJ1bnNldE9uRWNiTW9kZUV4aXRSZXNwb25zZSIpOwogICAgICB9CiAKLSAgICBwdWJsaWMgU3RyaW5nIGdldEludGVyZmFjZU5hbWUoU3RyaW5nIGFwblR5cGUpIHsKLSAgICAgICAgcmV0dXJuIG1EYXRhQ29ubmVjdGlvbi5nZXRJbnRlcmZhY2VOYW1lKGFwblR5cGUpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0SXBBZGRyZXNzKFN0cmluZyBhcG5UeXBlKSB7Ci0gICAgICAgIHJldHVybiBtRGF0YUNvbm5lY3Rpb24uZ2V0SXBBZGRyZXNzKGFwblR5cGUpOwotICAgIH0KLQogICAgIHB1YmxpYyBib29sZWFuIGlzRGF0YUNvbm5lY3Rpdml0eUVuYWJsZWQoKSB7CiAgICAgICAgIHJldHVybiBtRGF0YUNvbm5lY3Rpb24uZ2V0RGF0YUVuYWJsZWQoKTsKICAgICB9CiAKLSAgICBwdWJsaWMgU3RyaW5nIGdldEdhdGV3YXkoU3RyaW5nIGFwblR5cGUpIHsKLSAgICAgICAgcmV0dXJuIG1EYXRhQ29ubmVjdGlvbi5nZXRHYXRld2F5KGFwblR5cGUpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmdbXSBnZXREbnNTZXJ2ZXJzKFN0cmluZyBhcG5UeXBlKSB7Ci0gICAgICAgIHJldHVybiBtRGF0YUNvbm5lY3Rpb24uZ2V0RG5zU2VydmVycyhhcG5UeXBlKTsKLSAgICB9Ci0KICAgICBwdWJsaWMgU3RyaW5nW10gZ2V0QWN0aXZlQXBuVHlwZXMoKSB7CiAgICAgICAgIHJldHVybiBtRGF0YUNvbm5lY3Rpb24uZ2V0QWN0aXZlQXBuVHlwZXMoKTsKICAgICB9CiAKKyAgICBwdWJsaWMgTGlua1Byb3BlcnRpZXMgZ2V0TGlua1Byb3BlcnRpZXMoU3RyaW5nIGFwblR5cGUpIHsKKyAgICAgICAgcmV0dXJuIG1EYXRhQ29ubmVjdGlvbi5nZXRMaW5rUHJvcGVydGllcyhhcG5UeXBlKTsKKyAgICB9CisKICAgICBwdWJsaWMgU3RyaW5nIGdldEFjdGl2ZUFwbigpIHsKICAgICAgICAgcmV0dXJuIG1EYXRhQ29ubmVjdGlvbi5nZXRBY3RpdmVBcG5TdHJpbmcoKTsKICAgICB9CkBAIC05NTIsNiArOTU0LDEwIEBACiAgICAgICAgIHJldHVybiBtRGF0YUNvbm5lY3Rpb24uZGlzYWJsZUFwblR5cGUodHlwZSk7CiAgICAgfQogCisgICAgcHVibGljIGJvb2xlYW4gaXNEYXRhQ29ubmVjdGl2aXR5UG9zc2libGUoKSB7CisgICAgICAgIHJldHVybiAoKG1EYXRhQ29ubmVjdGlvbiAhPSBudWxsKSAmJiAobURhdGFDb25uZWN0aW9uLmlzRGF0YVBvc3NpYmxlKCkpKTsKKyAgICB9CisKICAgICAvKioKICAgICAgKiBzaW11bGF0ZURhdGFDb25uZWN0aW9uCiAgICAgICoKQEAgLTk4MCw3ICs5ODYsNyBAQAogICAgICAgICB9CiAKICAgICAgICAgbURhdGFDb25uZWN0aW9uLnNldFN0YXRlKGRjU3RhdGUpOwotICAgICAgICBub3RpZnlEYXRhQ29ubmVjdGlvbihudWxsKTsKKyAgICAgICAgbm90aWZ5RGF0YUNvbm5lY3Rpb24obnVsbCwgUGhvbmUuQVBOX1RZUEVfREVGQVVMVCk7CiAgICAgfQogCiAgICAgLyoqCkBAIC0xMDM0LDYgKzEwNDAsMTAgQEAKICAgICAgICAgICAgICAgICAiY2FsbGVkLCBDRE1BUGhvbmUgaW5hY3RpdmUuIik7CiAgICAgfQogCisgICAgcHVibGljIERhdGFTdGF0ZSBnZXREYXRhQ29ubmVjdGlvblN0YXRlKCkgeworICAgICAgICByZXR1cm4gZ2V0RGF0YUNvbm5lY3Rpb25TdGF0ZShBUE5fVFlQRV9ERUZBVUxUKTsKKyAgICB9CisKICAgICAvKioKICAgICAgKiBDb21tb24gZXJyb3IgbG9nZ2VyIG1ldGhvZCBmb3IgdW5leHBlY3RlZCBjYWxscyB0byBHU00vV0NETUEtb25seSBtZXRob2RzLgogICAgICAqLwpkaWZmIC0tZ2l0IGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L1Bob25lTm90aWZpZXIuamF2YSBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9QaG9uZU5vdGlmaWVyLmphdmEKaW5kZXggZTk2ZWVhZS4uNjkxMjcxZiAxMDA2NDQKLS0tIGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L1Bob25lTm90aWZpZXIuamF2YQorKysgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvUGhvbmVOb3RpZmllci5qYXZhCkBAIC0zMyw5ICszMywxMiBAQAogCiAgICAgcHVibGljIHZvaWQgbm90aWZ5Q2FsbEZvcndhcmRpbmdDaGFuZ2VkKFBob25lIHNlbmRlcik7CiAKLSAgICBwdWJsaWMgdm9pZCBub3RpZnlEYXRhQ29ubmVjdGlvbihQaG9uZSBzZW5kZXIsIFN0cmluZyByZWFzb24pOworICAgIHB1YmxpYyB2b2lkIG5vdGlmeURhdGFDb25uZWN0aW9uKFBob25lIHNlbmRlciwgU3RyaW5nIHJlYXNvbiwgU3RyaW5nIGFwblR5cGUpOwogCi0gICAgcHVibGljIHZvaWQgbm90aWZ5RGF0YUNvbm5lY3Rpb25GYWlsZWQoUGhvbmUgc2VuZGVyLCBTdHJpbmcgcmVhc29uKTsKKyAgICBwdWJsaWMgdm9pZCBub3RpZnlEYXRhQ29ubmVjdGlvbihQaG9uZSBzZW5kZXIsIFN0cmluZyByZWFzb24sIFN0cmluZyBhcG5UeXBlLAorICAgICAgICAgICAgUGhvbmUuRGF0YVN0YXRlIHN0YXRlKTsKKworICAgIHB1YmxpYyB2b2lkIG5vdGlmeURhdGFDb25uZWN0aW9uRmFpbGVkKFBob25lIHNlbmRlciwgU3RyaW5nIHJlYXNvbiwgU3RyaW5nIGFwblR5cGUpOwogCiAgICAgcHVibGljIHZvaWQgbm90aWZ5RGF0YUFjdGl2aXR5KFBob25lIHNlbmRlcik7CiAKZGlmZiAtLWdpdCBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9QaG9uZVByb3h5LmphdmEgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvUGhvbmVQcm94eS5qYXZhCmluZGV4IDVlN2RjYjAuLmI2ZTRjZGEgMTAwNjQ0Ci0tLSBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9QaG9uZVByb3h5LmphdmEKKysrIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L1Bob25lUHJveHkuamF2YQpAQCAtMjAsMTMgKzIwLDExIEBACiBpbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHlNYW5hZ2VyTmF0aXZlOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LlNoYXJlZFByZWZlcmVuY2VzOworaW1wb3J0IGFuZHJvaWQubmV0LkxpbmtQcm9wZXJ0aWVzOwogaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlcjsKIGltcG9ydCBhbmRyb2lkLm9zLk1lc3NhZ2U7CiBpbXBvcnQgYW5kcm9pZC5vcy5TeXN0ZW1Qcm9wZXJ0aWVzOwotaW1wb3J0IGFuZHJvaWQucHJlZmVyZW5jZS5QcmVmZXJlbmNlTWFuYWdlcjsKIGltcG9ydCBhbmRyb2lkLnRlbGVwaG9ueS5DZWxsTG9jYXRpb247Ci1pbXBvcnQgYW5kcm9pZC50ZWxlcGhvbnkuUGhvbmVTdGF0ZUxpc3RlbmVyOwogaW1wb3J0IGFuZHJvaWQudGVsZXBob255LlNlcnZpY2VTdGF0ZTsKIGltcG9ydCBhbmRyb2lkLnRlbGVwaG9ueS5TaWduYWxTdHJlbmd0aDsKIGltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwpAQCAtMzQsNyArMzIsNiBAQAogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5jZG1hLkNETUFQaG9uZTsKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuZ3NtLkdTTVBob25lOwogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uTmV0d29ya0luZm87Ci1pbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmdzbS5Hc21EYXRhQ29ubmVjdGlvbjsKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkudGVzdC5TaW11bGF0ZWRSYWRpb0NvbnRyb2w7CiAKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKQEAgLTE3Miw3ICsxNjksMTEgQEAKICAgICB9CiAKICAgICBwdWJsaWMgRGF0YVN0YXRlIGdldERhdGFDb25uZWN0aW9uU3RhdGUoKSB7Ci0gICAgICAgIHJldHVybiBtQWN0aXZlUGhvbmUuZ2V0RGF0YUNvbm5lY3Rpb25TdGF0ZSgpOworICAgICAgICByZXR1cm4gbUFjdGl2ZVBob25lLmdldERhdGFDb25uZWN0aW9uU3RhdGUoUGhvbmUuQVBOX1RZUEVfREVGQVVMVCk7CisgICAgfQorCisgICAgcHVibGljIERhdGFTdGF0ZSBnZXREYXRhQ29ubmVjdGlvblN0YXRlKFN0cmluZyBhcG5UeXBlKSB7CisgICAgICAgIHJldHVybiBtQWN0aXZlUGhvbmUuZ2V0RGF0YUNvbm5lY3Rpb25TdGF0ZShhcG5UeXBlKTsKICAgICB9CiAKICAgICBwdWJsaWMgRGF0YUFjdGl2aXR5U3RhdGUgZ2V0RGF0YUFjdGl2aXR5U3RhdGUoKSB7CkBAIC0yMDcsNiArMjA4LDEwIEBACiAgICAgICAgIHJldHVybiBtQWN0aXZlUGhvbmUuZ2V0QWN0aXZlQXBuVHlwZXMoKTsKICAgICB9CiAKKyAgICBwdWJsaWMgTGlua1Byb3BlcnRpZXMgZ2V0TGlua1Byb3BlcnRpZXMoU3RyaW5nIGFwblR5cGUpIHsKKyAgICAgICAgcmV0dXJuIG1BY3RpdmVQaG9uZS5nZXRMaW5rUHJvcGVydGllcyhhcG5UeXBlKTsKKyAgICB9CisKICAgICBwdWJsaWMgU3RyaW5nIGdldEFjdGl2ZUFwbigpIHsKICAgICAgICAgcmV0dXJuIG1BY3RpdmVQaG9uZS5nZXRBY3RpdmVBcG4oKTsKICAgICB9CkBAIC02NjAsMjIgKzY2NSw2IEBACiAgICAgICAgIHJldHVybiBtQWN0aXZlUGhvbmUuaXNEYXRhQ29ubmVjdGl2aXR5UG9zc2libGUoKTsKICAgICB9CiAKLSAgICBwdWJsaWMgU3RyaW5nIGdldEludGVyZmFjZU5hbWUoU3RyaW5nIGFwblR5cGUpIHsKLSAgICAgICAgcmV0dXJuIG1BY3RpdmVQaG9uZS5nZXRJbnRlcmZhY2VOYW1lKGFwblR5cGUpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0SXBBZGRyZXNzKFN0cmluZyBhcG5UeXBlKSB7Ci0gICAgICAgIHJldHVybiBtQWN0aXZlUGhvbmUuZ2V0SXBBZGRyZXNzKGFwblR5cGUpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0R2F0ZXdheShTdHJpbmcgYXBuVHlwZSkgewotICAgICAgICByZXR1cm4gbUFjdGl2ZVBob25lLmdldEdhdGV3YXkoYXBuVHlwZSk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZ1tdIGdldERuc1NlcnZlcnMoU3RyaW5nIGFwblR5cGUpIHsKLSAgICAgICAgcmV0dXJuIG1BY3RpdmVQaG9uZS5nZXREbnNTZXJ2ZXJzKGFwblR5cGUpOwotICAgIH0KLQogICAgIHB1YmxpYyBTdHJpbmcgZ2V0RGV2aWNlSWQoKSB7CiAgICAgICAgIHJldHVybiBtQWN0aXZlUGhvbmUuZ2V0RGV2aWNlSWQoKTsKICAgICB9CkBAIC03NjQsNiArNzUzLDEwIEBACiAgICAgICAgIG1BY3RpdmVQaG9uZS5leGl0RW1lcmdlbmN5Q2FsbGJhY2tNb2RlKCk7CiAgICAgfQogCisgICAgcHVibGljIGJvb2xlYW4gbmVlZHNPdGFTZXJ2aWNlUHJvdmlzaW9uaW5nKCl7CisgICAgICAgIHJldHVybiBtQWN0aXZlUGhvbmUubmVlZHNPdGFTZXJ2aWNlUHJvdmlzaW9uaW5nKCk7CisgICAgfQorCiAgICAgcHVibGljIGJvb2xlYW4gaXNPdGFTcE51bWJlcihTdHJpbmcgZGlhbFN0cil7CiAgICAgICAgIHJldHVybiBtQWN0aXZlUGhvbmUuaXNPdGFTcE51bWJlcihkaWFsU3RyKTsKICAgICB9CmRpZmYgLS1naXQgYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvUklMLmphdmEgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvUklMLmphdmEKaW5kZXggNTY5YWM1Yy4uOGMyMjgwYiAxMDA2NDQKLS0tIGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L1JJTC5qYXZhCisrKyBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9SSUwuamF2YQpAQCAtMjg1LDkgKzI4NSw4IEBACiAgICAgICAgIH0KIAogCi0gICAgICAgIC8vKioqKiogSGFuZGxlciBpbXBsZW1lbWVudGF0aW9uCi0KLSAgICAgICAgcHVibGljIHZvaWQKKyAgICAgICAgLy8qKioqKiBIYW5kbGVyIGltcGxlbWVudGF0aW9uCisgICAgICAgIEBPdmVycmlkZSBwdWJsaWMgdm9pZAogICAgICAgICBoYW5kbGVNZXNzYWdlKE1lc3NhZ2UgbXNnKSB7CiAgICAgICAgICAgICBSSUxSZXF1ZXN0IHJyID0gKFJJTFJlcXVlc3QpKG1zZy5vYmopOwogICAgICAgICAgICAgUklMUmVxdWVzdCByZXEgPSBudWxsOwpAQCAtNzgwLDcgKzc3OSw3IEBACiAgICAgICAgIHNlbmQocnIpOwogICAgIH0KIAotICAgIHB1YmxpYyB2b2lkCisgICAgQERlcHJlY2F0ZWQgcHVibGljIHZvaWQKICAgICBnZXRQRFBDb250ZXh0TGlzdChNZXNzYWdlIHJlc3VsdCkgewogICAgICAgICBnZXREYXRhQ2FsbExpc3QocmVzdWx0KTsKICAgICB9CkBAIC0xMjk5LDEwICsxMjk4LDE4IEBACiAgICAgcHVibGljIHZvaWQKICAgICBzZXR1cERhdGFDYWxsKFN0cmluZyByYWRpb1RlY2hub2xvZ3ksIFN0cmluZyBwcm9maWxlLCBTdHJpbmcgYXBuLAogICAgICAgICAgICAgU3RyaW5nIHVzZXIsIFN0cmluZyBwYXNzd29yZCwgU3RyaW5nIGF1dGhUeXBlLCBNZXNzYWdlIHJlc3VsdCkgeworICAgICAgICBzZXR1cERhdGFDYWxsV2l0aFByb3RvY29sKHJhZGlvVGVjaG5vbG9neSwgcHJvZmlsZSwgYXBuLCB1c2VyLCBwYXNzd29yZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1dGhUeXBlLCAiSVAiLCByZXN1bHQpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkCisgICAgc2V0dXBEYXRhQ2FsbFdpdGhQcm90b2NvbChTdHJpbmcgcmFkaW9UZWNobm9sb2d5LCBTdHJpbmcgcHJvZmlsZSwKKyAgICAgICAgICAgIFN0cmluZyBhcG4sIFN0cmluZyB1c2VyLCBTdHJpbmcgcGFzc3dvcmQsIFN0cmluZyBhdXRoVHlwZSwKKyAgICAgICAgICAgIFN0cmluZyBwcm90b2NvbFR5cGUsIE1lc3NhZ2UgcmVzdWx0KSB7CiAgICAgICAgIFJJTFJlcXVlc3QgcnIKICAgICAgICAgICAgICAgICA9IFJJTFJlcXVlc3Qub2J0YWluKFJJTF9SRVFVRVNUX1NFVFVQX0RBVEFfQ0FMTCwgcmVzdWx0KTsKIAotICAgICAgICByci5tcC53cml0ZUludCg2KTsKKyAgICAgICAgcnIubXAud3JpdGVJbnQoNyk7CiAKICAgICAgICAgcnIubXAud3JpdGVTdHJpbmcocmFkaW9UZWNobm9sb2d5KTsKICAgICAgICAgcnIubXAud3JpdGVTdHJpbmcocHJvZmlsZSk7CkBAIC0xMzEwLDExICsxMzE3LDEyIEBACiAgICAgICAgIHJyLm1wLndyaXRlU3RyaW5nKHVzZXIpOwogICAgICAgICByci5tcC53cml0ZVN0cmluZyhwYXNzd29yZCk7CiAgICAgICAgIHJyLm1wLndyaXRlU3RyaW5nKGF1dGhUeXBlKTsKKyAgICAgICAgcnIubXAud3JpdGVTdHJpbmcocHJvdG9jb2xUeXBlKTsKIAogICAgICAgICBpZiAoUklMSl9MT0dEKSByaWxqTG9nKHJyLnNlcmlhbFN0cmluZygpICsgIj4gIgogICAgICAgICAgICAgICAgICsgcmVxdWVzdFRvU3RyaW5nKHJyLm1SZXF1ZXN0KSArICIgIiArIHJhZGlvVGVjaG5vbG9neSArICIgIgogICAgICAgICAgICAgICAgICsgcHJvZmlsZSArICIgIiArIGFwbiArICIgIiArIHVzZXIgKyAiICIKLSAgICAgICAgICAgICAgICArIHBhc3N3b3JkICsgIiAiICsgYXV0aFR5cGUpOworICAgICAgICAgICAgICAgICsgcGFzc3dvcmQgKyAiICIgKyBhdXRoVHlwZSArICIgIiArIHByb3RvY29sVHlwZSk7CiAKICAgICAgICAgc2VuZChycik7CiAgICAgfQpAQCAtMjkwMiw3ICsyOTEwLDExIEBACiAgICAgICAgICAgICBkYXRhQ2FsbC5hY3RpdmUgPSBwLnJlYWRJbnQoKTsKICAgICAgICAgICAgIGRhdGFDYWxsLnR5cGUgPSBwLnJlYWRTdHJpbmcoKTsKICAgICAgICAgICAgIGRhdGFDYWxsLmFwbiA9IHAucmVhZFN0cmluZygpOwotICAgICAgICAgICAgZGF0YUNhbGwuYWRkcmVzcyA9IHAucmVhZFN0cmluZygpOworICAgICAgICAgICAgU3RyaW5nIGFkZHJlc3MgPSBwLnJlYWRTdHJpbmcoKTsKKyAgICAgICAgICAgIGlmIChhZGRyZXNzICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBhZGRyZXNzID0gYWRkcmVzcy5zcGxpdCgiICIpWzBdOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZGF0YUNhbGwuYWRkcmVzcyA9IGFkZHJlc3M7CiAKICAgICAgICAgICAgIHJlc3BvbnNlLmFkZChkYXRhQ2FsbCk7CiAgICAgICAgIH0KZGlmZiAtLWdpdCBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9TTVNEaXNwYXRjaGVyLmphdmEgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvU01TRGlzcGF0Y2hlci5qYXZhCmluZGV4IDkxN2UxZDguLjNhN2NlNDcgMTAwNjQ0Ci0tLSBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9TTVNEaXNwYXRjaGVyLmphdmEKKysrIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L1NNU0Rpc3BhdGNoZXIuamF2YQpAQCAtMjU1LDYgKzI1NSw3IEBACiAgICAgICAgIG1DbS51bnJlZ2lzdGVyRm9yT24odGhpcyk7CiAgICAgfQogCisgICAgQE92ZXJyaWRlCiAgICAgcHJvdGVjdGVkIHZvaWQgZmluYWxpemUoKSB7CiAgICAgICAgIExvZy5kKFRBRywgIlNNU0Rpc3BhdGNoZXIgZmluYWxpemVkIik7CiAgICAgfQpAQCAtOTI3LDE0ICs5MjgsMTQgQEAKICAgICAgKi8KICAgICBzdGF0aWMgcHJvdGVjdGVkIGNsYXNzIFNtc1RyYWNrZXIgewogICAgICAgICAvLyBmaWVsZHMgbmVlZCB0byBiZSBwdWJsaWMgZm9yIGRlcml2ZWQgU21zRGlzcGF0Y2hlcnMKLSAgICAgICAgcHVibGljIEhhc2hNYXAgbURhdGE7CisgICAgICAgIHB1YmxpYyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PiBtRGF0YTsKICAgICAgICAgcHVibGljIGludCBtUmV0cnlDb3VudDsKICAgICAgICAgcHVibGljIGludCBtTWVzc2FnZVJlZjsKIAogICAgICAgICBwdWJsaWMgUGVuZGluZ0ludGVudCBtU2VudEludGVudDsKICAgICAgICAgcHVibGljIFBlbmRpbmdJbnRlbnQgbURlbGl2ZXJ5SW50ZW50OwogCi0gICAgICAgIFNtc1RyYWNrZXIoSGFzaE1hcCBkYXRhLCBQZW5kaW5nSW50ZW50IHNlbnRJbnRlbnQsCisgICAgICAgIFNtc1RyYWNrZXIoSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4gZGF0YSwgUGVuZGluZ0ludGVudCBzZW50SW50ZW50LAogICAgICAgICAgICAgICAgIFBlbmRpbmdJbnRlbnQgZGVsaXZlcnlJbnRlbnQpIHsKICAgICAgICAgICAgIG1EYXRhID0gZGF0YTsKICAgICAgICAgICAgIG1TZW50SW50ZW50ID0gc2VudEludGVudDsKQEAgLTk0Myw3ICs5NDQsNyBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgcHJvdGVjdGVkIFNtc1RyYWNrZXIgU21zVHJhY2tlckZhY3RvcnkoSGFzaE1hcCBkYXRhLCBQZW5kaW5nSW50ZW50IHNlbnRJbnRlbnQsCisgICAgcHJvdGVjdGVkIFNtc1RyYWNrZXIgU21zVHJhY2tlckZhY3RvcnkoSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4gZGF0YSwgUGVuZGluZ0ludGVudCBzZW50SW50ZW50LAogICAgICAgICAgICAgUGVuZGluZ0ludGVudCBkZWxpdmVyeUludGVudCkgewogICAgICAgICByZXR1cm4gbmV3IFNtc1RyYWNrZXIoZGF0YSwgc2VudEludGVudCwgZGVsaXZlcnlJbnRlbnQpOwogICAgIH0KZGlmZiAtLWdpdCBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9TaXBQaG9uZU5vdGlmaWVyLmphdmEgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvU2lwUGhvbmVOb3RpZmllci5qYXZhCmluZGV4IDQwOTJjNjkuLjMwZDA2ZDggMTAwNjQ0Ci0tLSBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9TaXBQaG9uZU5vdGlmaWVyLmphdmEKKysrIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L1NpcFBob25lTm90aWZpZXIuamF2YQpAQCAtMTYsNiArMTYsNyBAQAogCiBwYWNrYWdlIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueTsKIAoraW1wb3J0IGFuZHJvaWQubmV0LkxpbmtQcm9wZXJ0aWVzOwogaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOwogaW1wb3J0IGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uOwogaW1wb3J0IGFuZHJvaWQub3MuU2VydmljZU1hbmFnZXI7CkBAIC05NCwyNiArOTUsNDIgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIHB1YmxpYyB2b2lkIG5vdGlmeURhdGFDb25uZWN0aW9uKFBob25lIHNlbmRlciwgU3RyaW5nIHJlYXNvbikgeworICAgIHB1YmxpYyB2b2lkIG5vdGlmeURhdGFDb25uZWN0aW9uKFBob25lIHNlbmRlciwgU3RyaW5nIHJlYXNvbiwgU3RyaW5nIGFwblR5cGUpIHsKKyAgICAgICAgZG9Ob3RpZnlEYXRhQ29ubmVjdGlvbihzZW5kZXIsIHJlYXNvbiwgYXBuVHlwZSwgc2VuZGVyLmdldERhdGFDb25uZWN0aW9uU3RhdGUoYXBuVHlwZSkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIG5vdGlmeURhdGFDb25uZWN0aW9uKFBob25lIHNlbmRlciwgU3RyaW5nIHJlYXNvbiwgU3RyaW5nIGFwblR5cGUsCisgICAgICAgICAgICBQaG9uZS5EYXRhU3RhdGUgc3RhdGUpIHsKKyAgICAgICAgZG9Ob3RpZnlEYXRhQ29ubmVjdGlvbihzZW5kZXIsIHJlYXNvbiwgYXBuVHlwZSwgc3RhdGUpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBkb05vdGlmeURhdGFDb25uZWN0aW9uKFBob25lIHNlbmRlciwgU3RyaW5nIHJlYXNvbiwgU3RyaW5nIGFwblR5cGUsCisgICAgICAgICAgICBQaG9uZS5EYXRhU3RhdGUgc3RhdGUpIHsKKyAgICAgICAgLy8gVE9ETworICAgICAgICAvLyB1c2UgYXBuVHlwZSBhcyB0aGUga2V5IHRvIHdoaWNoIGNvbm5lY3Rpb24gd2UncmUgdGFsa2luZyBhYm91dC4KKyAgICAgICAgLy8gcGFzcyBhcG5UeXBlIGJhY2sgdXAgdG8gZmV0Y2ggcGFydGljdWxhciBmb3IgdGhpcyBvbmUuCiAgICAgICAgIFRlbGVwaG9ueU1hbmFnZXIgdGVsZXBob255ID0gVGVsZXBob255TWFuYWdlci5nZXREZWZhdWx0KCk7CisgICAgICAgIExpbmtQcm9wZXJ0aWVzIGxpbmtQcm9wZXJ0aWVzID0gbnVsbDsKKyAgICAgICAgaWYgKHN0YXRlID09IFBob25lLkRhdGFTdGF0ZS5DT05ORUNURUQpIHsKKyAgICAgICAgICAgIGxpbmtQcm9wZXJ0aWVzID0gc2VuZGVyLmdldExpbmtQcm9wZXJ0aWVzKGFwblR5cGUpOworICAgICAgICB9CiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBtUmVnaXN0cnkubm90aWZ5RGF0YUNvbm5lY3Rpb24oCi0gICAgICAgICAgICAgICAgICAgIGNvbnZlcnREYXRhU3RhdGUoc2VuZGVyLmdldERhdGFDb25uZWN0aW9uU3RhdGUoKSksCisgICAgICAgICAgICAgICAgICAgIGNvbnZlcnREYXRhU3RhdGUoc3RhdGUpLAogICAgICAgICAgICAgICAgICAgICBzZW5kZXIuaXNEYXRhQ29ubmVjdGl2aXR5UG9zc2libGUoKSwgcmVhc29uLAogICAgICAgICAgICAgICAgICAgICBzZW5kZXIuZ2V0QWN0aXZlQXBuKCksCi0gICAgICAgICAgICAgICAgICAgIHNlbmRlci5nZXRBY3RpdmVBcG5UeXBlcygpLAotICAgICAgICAgICAgICAgICAgICBzZW5kZXIuZ2V0SW50ZXJmYWNlTmFtZShudWxsKSwKKyAgICAgICAgICAgICAgICAgICAgYXBuVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgbGlua1Byb3BlcnRpZXMsCiAgICAgICAgICAgICAgICAgICAgICgodGVsZXBob255IT1udWxsKSA/IHRlbGVwaG9ueS5nZXROZXR3b3JrVHlwZSgpIDoKLSAgICAgICAgICAgICAgICAgICAgVGVsZXBob255TWFuYWdlci5ORVRXT1JLX1RZUEVfVU5LTk9XTiksCi0gICAgICAgICAgICAgICAgICAgIHNlbmRlci5nZXRHYXRld2F5KG51bGwpKTsKKyAgICAgICAgICAgICAgICAgICAgVGVsZXBob255TWFuYWdlci5ORVRXT1JLX1RZUEVfVU5LTk9XTikpOwogICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZXgpIHsKICAgICAgICAgICAgIC8vIHN5c3RlbSBwcm9jZXNzIGlzIGRlYWQKICAgICAgICAgfQogICAgIH0KIAotICAgIHB1YmxpYyB2b2lkIG5vdGlmeURhdGFDb25uZWN0aW9uRmFpbGVkKFBob25lIHNlbmRlciwgU3RyaW5nIHJlYXNvbikgeworICAgIHB1YmxpYyB2b2lkIG5vdGlmeURhdGFDb25uZWN0aW9uRmFpbGVkKFBob25lIHNlbmRlciwgU3RyaW5nIHJlYXNvbiwgU3RyaW5nIGFwblR5cGUpIHsKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIG1SZWdpc3RyeS5ub3RpZnlEYXRhQ29ubmVjdGlvbkZhaWxlZChyZWFzb24pOworICAgICAgICAgICAgbVJlZ2lzdHJ5Lm5vdGlmeURhdGFDb25uZWN0aW9uRmFpbGVkKHJlYXNvbiwgYXBuVHlwZSk7CiAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBleCkgewogICAgICAgICAgICAgLy8gc3lzdGVtIHByb2Nlc3MgaXMgZGVhZAogICAgICAgICB9CmRpZmYgLS1naXQgYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvU21zSGVhZGVyLmphdmEgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvU21zSGVhZGVyLmphdmEKaW5kZXggNzg3MmVlYy4uN2E2NTE2MiAxMDA2NDQKLS0tIGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L1Ntc0hlYWRlci5qYXZhCisrKyBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9TbXNIZWFkZXIuamF2YQpAQCAtMzAsNyArMzAsNyBAQAogICovCiBwdWJsaWMgY2xhc3MgU21zSGVhZGVyIHsKIAotICAgIC8vIFRPRE8oY2xlYW51cCk6IHRoaXMgZGF0YXN0cnVjdHVyZSBpcyBnZW5lcmFsbHkgcmVmZXJyZWQgdG8gYXMKKyAgICAvLyBUT0RPKGNsZWFudXApOiB0aGlzIGRhdGEgc3RydWN0dXJlIGlzIGdlbmVyYWxseSByZWZlcnJlZCB0byBhcwogICAgIC8vIHRoZSAndXNlciBkYXRhIGhlYWRlcicgb3IgVURILCBhbmQgc28gdGhlIGNsYXNzIG5hbWUgc2hvdWxkCiAgICAgLy8gY2hhbmdlIHRvIHJlZmxlY3QgdGhpcy4uLgogCmRpZmYgLS1naXQgYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvU21zTWVzc2FnZUJhc2UuamF2YSBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9TbXNNZXNzYWdlQmFzZS5qYXZhCmluZGV4IGFmNmM1ZjguLmNiZDg2MDYgMTAwNjQ0Ci0tLSBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9TbXNNZXNzYWdlQmFzZS5qYXZhCisrKyBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9TbXNNZXNzYWdlQmFzZS5qYXZhCkBAIC0xNiw3ICsxNiw2IEBACiAKIHBhY2thZ2UgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255OwogCi1pbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuU21zSGVhZGVyOwogaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CiAKQEAgLTM2NiwxMyArMzY1LDEzIEBACiAgICAgLyoqCiAgICAgICogVHJ5IHRvIHBhcnNlIHRoaXMgbWVzc2FnZSBhcyBhbiBlbWFpbCBnYXRld2F5IG1lc3NhZ2UKICAgICAgKiBUaGVyZSBhcmUgdHdvIHdheXMgc3BlY2lmaWVkIGluIFRTIDIzLjA0MCBTZWN0aW9uIDMuOCA6Ci0gICAgICogIC0gU01TIG1lc3NhZ2UgIm1heSBoYXZlIGl0cyBUUC1QSUQgc2V0IGZvciBpbnRlcm5ldCBlbGVjdHJvbmljIG1haWwgLSBNVAorICAgICAqICAtIFNNUyBtZXNzYWdlICJtYXkgaGF2ZSBpdHMgVFAtUElEIHNldCBmb3IgSW50ZXJuZXQgZWxlY3Ryb25pYyBtYWlsIC0gTVQKICAgICAgKiBTTVMgZm9ybWF0OiBbPGZyb20tYWRkcmVzcz48c3BhY2U+XTxtZXNzYWdlPiAtICJEZXBlbmRpbmcgb24gdGhlCiAgICAgICogbmF0dXJlIG9mIHRoZSBnYXRld2F5LCB0aGUgZGVzdGluYXRpb24vb3JpZ2luYXRpb24gYWRkcmVzcyBpcyBlaXRoZXIKICAgICAgKiBkZXJpdmVkIGZyb20gdGhlIGNvbnRlbnQgb2YgdGhlIFNNUyBUUC1PQSBvciBUUC1EQSBmaWVsZCwgb3IgdGhlCiAgICAgICogVFAtT0EvVFAtREEgZmllbGQgY29udGFpbnMgYSBnZW5lcmljIGdhdGV3YXkgYWRkcmVzcyBhbmQgdGhlIHRvL2Zyb20KICAgICAgKiBhZGRyZXNzIGlzIGFkZGVkIGF0IHRoZSBiZWdpbm5pbmcgYXMgc2hvd24gYWJvdmUuIiAod2hpY2ggaXMgc3VwcG9ydGVkIGhlcmUpCi0gICAgICogLSBNdWx0aXBsZSBhZGRyZXNlcyBzZXBhcmF0ZWQgYnkgY29tbWFzLCBubyBzcGFjZXMsIFN1YmplY3QgZmllbGQgZGVsaW1pdGVkCisgICAgICogLSBNdWx0aXBsZSBhZGRyZXNzZXMgc2VwYXJhdGVkIGJ5IGNvbW1hcywgbm8gc3BhY2VzLCBTdWJqZWN0IGZpZWxkIGRlbGltaXRlZAogICAgICAqIGJ5ICcoKScgb3IgJyMjJyBhbmQgJyMnIFNlY3Rpb24gOS4yLjMuMjQuMTEgKHdoaWNoIGFyZSBOT1Qgc3VwcG9ydGVkIGhlcmUpCiAgICAgICovCiAgICAgcHJvdGVjdGVkIHZvaWQgZXh0cmFjdEVtYWlsQWRkcmVzc0Zyb21NZXNzYWdlQm9keSgpIHsKZGlmZiAtLWdpdCBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9UZWxlcGhvbnlQcm9wZXJ0aWVzLmphdmEgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvVGVsZXBob255UHJvcGVydGllcy5qYXZhCmluZGV4IGExMTM3ODcuLjEzNmQ1YjEgMTAwNjQ0Ci0tLSBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9UZWxlcGhvbnlQcm9wZXJ0aWVzLmphdmEKKysrIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L1RlbGVwaG9ueVByb3BlcnRpZXMuamF2YQpAQCAtNDUsNyArNDUsNyBAQAogICAgICAqICBDRE1BIG5ldHdvcmtzLgogICAgICAqLwogICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVFlfT1BFUkFUT1JfQUxQSEEgPSAiZ3NtLm9wZXJhdG9yLmFscGhhIjsKLSAgICAvL1RPRE86IG1vc3Qgb2YgdGhlc2UgcHJvcHJpZXRpZXMgYXJlIGdlbmVyaWMsIHN1YnN0aXR1dGUgZ3NtLiB3aXRoIHBob25lLiBidWcgMTg1Njk1OQorICAgIC8vVE9ETzogbW9zdCBvZiB0aGVzZSBwcm9wZXJ0aWVzIGFyZSBnZW5lcmljLCBzdWJzdGl0dXRlIGdzbS4gd2l0aCBwaG9uZS4gYnVnIDE4NTY5NTkKIAogICAgIC8qKiBOdW1lcmljIG5hbWUgKE1DQytNTkMpIG9mIGN1cnJlbnQgcmVnaXN0ZXJlZCBvcGVyYXRvci48cD4KICAgICAgKiAgQXZhaWxhYmlsaXR5OiB3aGVuIHJlZ2lzdGVyZWQgdG8gYSBuZXR3b3JrLiBSZXN1bHQgbWF5IGJlIHVucmVsaWFibGUgb24KQEAgLTgzLDEyICs4MywxMiBAQAogCiAgICAgLyoqIFRoZSBNQ0MrTU5DIChtb2JpbGUgY291bnRyeSBjb2RlK21vYmlsZSBuZXR3b3JrIGNvZGUpIG9mIHRoZQogICAgICAqICBwcm92aWRlciBvZiB0aGUgU0lNLiA1IG9yIDYgZGVjaW1hbCBkaWdpdHMuCi0gICAgICogIEF2YWlsYWJsaXR5OiBTSU0gc3RhdGUgbXVzdCBiZSAiUkVBRFkiCisgICAgICogIEF2YWlsYWJpbGl0eTogU0lNIHN0YXRlIG11c3QgYmUgIlJFQURZIgogICAgICAqLwogICAgIHN0YXRpYyBTdHJpbmcgUFJPUEVSVFlfSUNDX09QRVJBVE9SX05VTUVSSUMgPSAiZ3NtLnNpbS5vcGVyYXRvci5udW1lcmljIjsKIAogICAgIC8qKiBQUk9QRVJUWV9JQ0NfT1BFUkFUT1JfQUxQSEEgaXMgYWxzbyBrbm93biBhcyB0aGUgU1BOLCBvciBTZXJ2aWNlIFByb3ZpZGVyIE5hbWUuCi0gICAgICogIEF2YWlsYWJsaXR5OiBTSU0gc3RhdGUgbXVzdCBiZSAiUkVBRFkiCisgICAgICogIEF2YWlsYWJpbGl0eTogU0lNIHN0YXRlIG11c3QgYmUgIlJFQURZIgogICAgICAqLwogICAgIHN0YXRpYyBTdHJpbmcgUFJPUEVSVFlfSUNDX09QRVJBVE9SX0FMUEhBID0gImdzbS5zaW0ub3BlcmF0b3IuYWxwaGEiOwogCkBAIC0xMjcsNyArMTI3LDcgQEAKICAgICAgICAgInJvLnRlbGVwaG9ueS5jYWxsX3JpbmcubXVsdGlwbGUiOwogCiAgICAgLyoqCi0gICAgICogVGhlIG51bWJlciBvZiBtaWxsaS1zZWNvbmRzIGJldHdlZW4gQ0FMTF9SSU5HIG5vdGlmaWNhdGlvbnMuCisgICAgICogVGhlIG51bWJlciBvZiBtaWxsaXNlY29uZHMgYmV0d2VlbiBDQUxMX1JJTkcgbm90aWZpY2F0aW9ucy4KICAgICAgKi8KICAgICBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BFUlRZX0NBTExfUklOR19ERUxBWSA9ICJyby50ZWxlcGhvbnkuY2FsbF9yaW5nLmRlbGF5IjsKIApkaWZmIC0tZ2l0IGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2NkbWEvQ0RNQVBob25lLmphdmEgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvY2RtYS9DRE1BUGhvbmUuamF2YQppbmRleCBmMzFiZjI0Li42ZTUzZWM1IDEwMDc1NQotLS0gYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvY2RtYS9DRE1BUGhvbmUuamF2YQorKysgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvY2RtYS9DRE1BUGhvbmUuamF2YQpAQCAtNTE1LDE0ICs1MTUsNiBAQAogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogCi0gICAgcHVibGljIGJvb2xlYW4gaXNEYXRhQ29ubmVjdGl2aXR5UG9zc2libGUoKSB7Ci0gICAgICAgIGJvb2xlYW4gbm9EYXRhID0gbURhdGFDb25uZWN0aW9uLmdldERhdGFFbmFibGVkKCkgJiYKLSAgICAgICAgICAgICAgICBnZXREYXRhQ29ubmVjdGlvblN0YXRlKCkgPT0gRGF0YVN0YXRlLkRJU0NPTk5FQ1RFRDsKLSAgICAgICAgcmV0dXJuICFub0RhdGEgJiYgZ2V0SWNjQ2FyZCgpLmdldFN0YXRlKCkgPT0gSWNjQ2FyZC5TdGF0ZS5SRUFEWSAmJgotICAgICAgICAgICAgICAgIGdldFNlcnZpY2VTdGF0ZSgpLmdldFN0YXRlKCkgPT0gU2VydmljZVN0YXRlLlNUQVRFX0lOX1NFUlZJQ0UgJiYKLSAgICAgICAgICAgICAgICAobURhdGFDb25uZWN0aW9uLmdldERhdGFPblJvYW1pbmdFbmFibGVkKCkgfHwgIWdldFNlcnZpY2VTdGF0ZSgpLmdldFJvYW1pbmcoKSk7Ci0gICAgfQotCiAgICAgLyoqCiAgICAgICogUmVtb3ZlcyB0aGUgZ2l2ZW4gTU1JIGZyb20gdGhlIHBlbmRpbmcgbGlzdCBhbmQgbm90aWZpZXMgcmVnaXN0cmFudHMgdGhhdAogICAgICAqIGl0IGlzIGNvbXBsZXRlLgpAQCAtNjEzLDcgKzYwNSw3IEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICBwdWJsaWMgRGF0YVN0YXRlIGdldERhdGFDb25uZWN0aW9uU3RhdGUoKSB7CisgICAgcHVibGljIERhdGFTdGF0ZSBnZXREYXRhQ29ubmVjdGlvblN0YXRlKFN0cmluZyBhcG5UeXBlKSB7CiAgICAgICAgIERhdGFTdGF0ZSByZXQgPSBEYXRhU3RhdGUuRElTQ09OTkVDVEVEOwogCiAgICAgICAgIGlmIChtU1NUID09IG51bGwpIHsKQEAgLTYyNSw2ICs2MTcsOCBAQAogICAgICAgICAgICAgLy8gSWYgd2UncmUgb3V0IG9mIHNlcnZpY2UsIG9wZW4gVENQIHNvY2tldHMgbWF5IHN0aWxsIHdvcmsKICAgICAgICAgICAgIC8vIGJ1dCBubyBkYXRhIHdpbGwgZmxvdwogICAgICAgICAgICAgcmV0ID0gRGF0YVN0YXRlLkRJU0NPTk5FQ1RFRDsKKyAgICAgICAgfSBlbHNlIGlmIChtRGF0YUNvbm5lY3Rpb24uaXNBcG5UeXBlRW5hYmxlZChhcG5UeXBlKSA9PSBmYWxzZSkgeworICAgICAgICAgICAgcmV0ID0gRGF0YVN0YXRlLkRJU0NPTk5FQ1RFRDsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIHN3aXRjaCAobURhdGFDb25uZWN0aW9uLmdldFN0YXRlKCkpIHsKICAgICAgICAgICAgICAgICBjYXNlIEZBSUxFRDoKQEAgLTg3OCwyNiArODcyLDYgQEAKICAgICAgICAgbVJ1aW1SZWNvcmRzLnNldFZvaWNlTWVzc2FnZVdhaXRpbmcoMSwgbXdpKTsKICAgICB9CiAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRydWUgaWYgQ0RNQSBPVEEgU2VydmljZSBQcm92aXNpb25pbmcgbmVlZHMgdG8gYmUgcGVyZm9ybWVkLgotICAgICAqLwotICAgIC8qIHBhY2thZ2UgKi8gYm9vbGVhbgotICAgIG5lZWRzT3RhU2VydmljZVByb3Zpc2lvbmluZygpIHsKLSAgICAgICAgU3RyaW5nIGNkbWFNaW4gPSBnZXRDZG1hTWluKCk7Ci0gICAgICAgIGJvb2xlYW4gbmVlZHNQcm92aXNpb25pbmc7Ci0gICAgICAgIGlmIChjZG1hTWluID09IG51bGwgfHwgKGNkbWFNaW4ubGVuZ3RoKCkgPCA2KSkgewotICAgICAgICAgICAgaWYgKERCRykgTG9nLmQoTE9HX1RBRywgIm5lZWRzT3RhU2VydmljZVByb3Zpc2lvbmluZzogaWxsZWdhbCBjZG1hTWluPSciCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGNkbWFNaW4gKyAiJyBhc3N1bWUgcHJvdmlzaW9uaW5nIG5lZWRlZC4iKTsKLSAgICAgICAgICAgIG5lZWRzUHJvdmlzaW9uaW5nID0gdHJ1ZTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG5lZWRzUHJvdmlzaW9uaW5nID0gKGNkbWFNaW4uZXF1YWxzKFVOQUNUSVZBVEVEX01JTl9WQUxVRSkKLSAgICAgICAgICAgICAgICAgICAgfHwgY2RtYU1pbi5zdWJzdHJpbmcoMCw2KS5lcXVhbHMoVU5BQ1RJVkFURURfTUlOMl9WQUxVRSkpCi0gICAgICAgICAgICAgICAgICAgIHx8IFN5c3RlbVByb3BlcnRpZXMuZ2V0Qm9vbGVhbigidGVzdF9jZG1hX3NldHVwIiwgZmFsc2UpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChEQkcpIExvZy5kKExPR19UQUcsICJuZWVkc090YVNlcnZpY2VQcm92aXNpb25pbmc6IHJldD0iICsgbmVlZHNQcm92aXNpb25pbmcpOwotICAgICAgICByZXR1cm4gbmVlZHNQcm92aXNpb25pbmc7Ci0gICAgfQotCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgZXhpdEVtZXJnZW5jeUNhbGxiYWNrTW9kZSgpIHsKICAgICAgICAgaWYgKG1XYWtlTG9jay5pc0hlbGQoKSkgewpAQCAtMTE5MSw2ICsxMTY1LDI2IEBACiAgICAgICAgIG1TTVMuc2V0Q2VsbEJyb2FkY2FzdENvbmZpZyhjb25maWdWYWx1ZXNBcnJheSwgcmVzcG9uc2UpOwogICAgIH0KIAorICAgIC8qKgorICAgICAqIFJldHVybnMgdHJ1ZSBpZiBPVEEgU2VydmljZSBQcm92aXNpb25pbmcgbmVlZHMgdG8gYmUgcGVyZm9ybWVkLgorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIG5lZWRzT3RhU2VydmljZVByb3Zpc2lvbmluZygpIHsKKyAgICAgICAgU3RyaW5nIGNkbWFNaW4gPSBnZXRDZG1hTWluKCk7CisgICAgICAgIGJvb2xlYW4gbmVlZHNQcm92aXNpb25pbmc7CisgICAgICAgIGlmIChjZG1hTWluID09IG51bGwgfHwgKGNkbWFNaW4ubGVuZ3RoKCkgPCA2KSkgeworICAgICAgICAgICAgaWYgKERCRykgTG9nLmQoTE9HX1RBRywgIm5lZWRzT3RhU2VydmljZVByb3Zpc2lvbmluZzogaWxsZWdhbCBjZG1hTWluPSciCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGNkbWFNaW4gKyAiJyBhc3N1bWUgcHJvdmlzaW9uaW5nIG5lZWRlZC4iKTsKKyAgICAgICAgICAgIG5lZWRzUHJvdmlzaW9uaW5nID0gdHJ1ZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG5lZWRzUHJvdmlzaW9uaW5nID0gKGNkbWFNaW4uZXF1YWxzKFVOQUNUSVZBVEVEX01JTl9WQUxVRSkKKyAgICAgICAgICAgICAgICAgICAgfHwgY2RtYU1pbi5zdWJzdHJpbmcoMCw2KS5lcXVhbHMoVU5BQ1RJVkFURURfTUlOMl9WQUxVRSkpCisgICAgICAgICAgICAgICAgICAgIHx8IFN5c3RlbVByb3BlcnRpZXMuZ2V0Qm9vbGVhbigidGVzdF9jZG1hX3NldHVwIiwgZmFsc2UpOworICAgICAgICB9CisgICAgICAgIGlmIChEQkcpIExvZy5kKExPR19UQUcsICJuZWVkc090YVNlcnZpY2VQcm92aXNpb25pbmc6IHJldD0iICsgbmVlZHNQcm92aXNpb25pbmcpOworICAgICAgICByZXR1cm4gbmVlZHNQcm92aXNpb25pbmc7CisgICAgfQorCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIElTNjgzQV9GRUFUVVJFX0NPREUgPSAiKjIyOCI7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IElTNjgzQV9GRUFUVVJFX0NPREVfTlVNX0RJR0lUUyA9IDQ7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IElTNjgzQV9TWVNfU0VMX0NPREVfTlVNX0RJR0lUUyA9IDI7CmRpZmYgLS1naXQgYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvY2RtYS9DZG1hRGF0YUNvbm5lY3Rpb25UcmFja2VyLmphdmEgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvY2RtYS9DZG1hRGF0YUNvbm5lY3Rpb25UcmFja2VyLmphdmEKaW5kZXggOWYyYTQ0Yi4uNTkxODI0NSAxMDA2NDQKLS0tIGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2NkbWEvQ2RtYURhdGFDb25uZWN0aW9uVHJhY2tlci5qYXZhCisrKyBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9jZG1hL0NkbWFEYXRhQ29ubmVjdGlvblRyYWNrZXIuamF2YQpAQCAtMjMsMTQgKzIzLDEyIEBACiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50RmlsdGVyOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5TaGFyZWRQcmVmZXJlbmNlczsKLWltcG9ydCBhbmRyb2lkLm5ldC5Db25uZWN0aXZpdHlNYW5hZ2VyOwogaW1wb3J0IGFuZHJvaWQubmV0LklDb25uZWN0aXZpdHlNYW5hZ2VyOwogaW1wb3J0IGFuZHJvaWQubmV0Lk5ldHdvcmtJbmZvOwogaW1wb3J0IGFuZHJvaWQubmV0LlRyYWZmaWNTdGF0czsKIGltcG9ydCBhbmRyb2lkLm5ldC53aWZpLldpZmlNYW5hZ2VyOwogaW1wb3J0IGFuZHJvaWQub3MuQXN5bmNSZXN1bHQ7CiBpbXBvcnQgYW5kcm9pZC5vcy5NZXNzYWdlOwotaW1wb3J0IGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uOwogaW1wb3J0IGFuZHJvaWQub3MuU2VydmljZU1hbmFnZXI7CiBpbXBvcnQgYW5kcm9pZC5vcy5TeXN0ZW1DbG9jazsKIGltcG9ydCBhbmRyb2lkLm9zLlN5c3RlbVByb3BlcnRpZXM7CkBAIC01MCw4ICs0OCw2IEBACiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LkV2ZW50TG9nVGFnczsKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuZ3NtLkFwblNldHRpbmc7CiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LlBob25lOwotaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5SZXRyeU1hbmFnZXI7Ci1pbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LlNlcnZpY2VTdGF0ZVRyYWNrZXI7CiAKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwogCkBAIC0zMDUsOSArMzAxLDQwIEBACiAgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KIAotICAgIHByaXZhdGUgYm9vbGVhbiBpc0RhdGFBbGxvd2VkKCkgewotICAgICAgICBib29sZWFuIHJvYW1pbmcgPSBwaG9uZS5nZXRTZXJ2aWNlU3RhdGUoKS5nZXRSb2FtaW5nKCk7Ci0gICAgICAgIHJldHVybiBnZXRBbnlEYXRhRW5hYmxlZCgpICYmICghcm9hbWluZyB8fCBnZXREYXRhT25Sb2FtaW5nRW5hYmxlZCgpKSAmJiBtTWFzdGVyRGF0YUVuYWJsZWQ7CisgICAgcHJvdGVjdGVkIGJvb2xlYW4gaXNEYXRhQWxsb3dlZCgpIHsKKyAgICAgICAgaW50IHBzU3RhdGUgPSBtQ2RtYVBob25lLm1TU1QuZ2V0Q3VycmVudENkbWFEYXRhQ29ubmVjdGlvblN0YXRlKCk7CisgICAgICAgIGJvb2xlYW4gcm9hbWluZyA9IChwaG9uZS5nZXRTZXJ2aWNlU3RhdGUoKS5nZXRSb2FtaW5nKCkgJiYgIWdldERhdGFPblJvYW1pbmdFbmFibGVkKCkpOworICAgICAgICBib29sZWFuIGRlc2lyZWRQb3dlclN0YXRlID0gbUNkbWFQaG9uZS5tU1NULmdldERlc2lyZWRQb3dlclN0YXRlKCk7CisKKyAgICAgICAgYm9vbGVhbiBhbGxvd2VkID0gKHBzU3RhdGUgPT0gU2VydmljZVN0YXRlLlNUQVRFX0lOX1NFUlZJQ0UgJiYKKyAgICAgICAgICAgICAgICAocGhvbmUubUNNLmdldFJhZGlvU3RhdGUoKSA9PSBDb21tYW5kc0ludGVyZmFjZS5SYWRpb1N0YXRlLk5WX1JFQURZIHx8CisgICAgICAgICAgICAgICAgIG1DZG1hUGhvbmUubVJ1aW1SZWNvcmRzLmdldFJlY29yZHNMb2FkZWQoKSkgJiYKKyAgICAgICAgICAgICAgICAobUNkbWFQaG9uZS5tU1NULmlzQ29uY3VycmVudFZvaWNlQW5kRGF0YSgpIHx8CisgICAgICAgICAgICAgICAgIHBob25lLmdldFN0YXRlKCkgPT0gUGhvbmUuU3RhdGUuSURMRSkgJiYKKyAgICAgICAgICAgICAgICAhcm9hbWluZyAmJgorICAgICAgICAgICAgICAgIG1NYXN0ZXJEYXRhRW5hYmxlZCAmJgorICAgICAgICAgICAgICAgIGRlc2lyZWRQb3dlclN0YXRlICYmCisgICAgICAgICAgICAgICAgIW1QZW5kaW5nUmVzdGFydFJhZGlvICYmCisgICAgICAgICAgICAgICAgIW1DZG1hUGhvbmUubmVlZHNPdGFTZXJ2aWNlUHJvdmlzaW9uaW5nKCkpOworICAgICAgICBpZiAoIWFsbG93ZWQgJiYgREJHKSB7CisgICAgICAgICAgICBTdHJpbmcgcmVhc29uID0gIiI7CisgICAgICAgICAgICBpZiAocHNTdGF0ZSAhPSBTZXJ2aWNlU3RhdGUuU1RBVEVfSU5fU0VSVklDRSkgcmVhc29uICs9ICIgLSBwc1N0YXRlPSAiICsgcHNTdGF0ZTsKKyAgICAgICAgICAgIGlmIChwaG9uZS5tQ00uZ2V0UmFkaW9TdGF0ZSgpICE9IENvbW1hbmRzSW50ZXJmYWNlLlJhZGlvU3RhdGUuTlZfUkVBRFkgJiYKKyAgICAgICAgICAgICAgICAgICAgIW1DZG1hUGhvbmUubVJ1aW1SZWNvcmRzLmdldFJlY29yZHNMb2FkZWQoKSkgeworICAgICAgICAgICAgICAgIHJlYXNvbiArPSAiIC0gcmFkaW9TdGF0ZT0gIiArIHBob25lLm1DTS5nZXRSYWRpb1N0YXRlKCkgKyAiIC0gUlVJTSBub3QgbG9hZGVkIjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChwaG9uZS5nZXRTdGF0ZSgpICE9IFBob25lLlN0YXRlLklETEUgJiYKKyAgICAgICAgICAgICAgICAgICAgbUNkbWFQaG9uZS5tU1NULmlzQ29uY3VycmVudFZvaWNlQW5kRGF0YSgpKSB7CisgICAgICAgICAgICAgICAgcmVhc29uICs9ICIgLSBjb25jdXJyZW50Vm9pY2VBbmREYXRhIG5vdCBhbGxvd2VkIGFuZCBzdGF0ZT0gIiArIHBob25lLmdldFN0YXRlKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAocm9hbWluZykgcmVhc29uICs9ICIgLSBSb2FtaW5nIjsKKyAgICAgICAgICAgIGlmICghbU1hc3RlckRhdGFFbmFibGVkKSByZWFzb24gKz0gIiAtIG1NYXN0ZXJEYXRhRW5hYmxlZD0gZmFsc2UiOworICAgICAgICAgICAgaWYgKCFkZXNpcmVkUG93ZXJTdGF0ZSkgcmVhc29uICs9ICIgLSBkZXNpcmVkUG93ZXJTdGF0ZT0gZmFsc2UiOworICAgICAgICAgICAgaWYgKG1QZW5kaW5nUmVzdGFydFJhZGlvKSByZWFzb24gKz0gIiAtIG1QZW5kaW5nUmVzdGFydFJhZGlvPSB0cnVlIjsKKyAgICAgICAgICAgIGlmIChtQ2RtYVBob25lLm5lZWRzT3RhU2VydmljZVByb3Zpc2lvbmluZygpKSByZWFzb24gKz0gIiAtIG5lZWRzIFByb3Zpc2lvbmluZyI7CisgICAgICAgICAgICBsb2coIkRhdGEgbm90IGFsbG93ZWQgZHVlIHRvIiArIHJlYXNvbik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGFsbG93ZWQ7CiAgICAgfQogCiAgICAgcHJpdmF0ZSBib29sZWFuIHRyeVNldHVwRGF0YShTdHJpbmcgcmVhc29uKSB7CkBAIC0zMTcsNyArMzQ0LDggQEAKICAgICAgICAgICAgIC8vIEFzc3VtZSBkYXRhIGlzIGNvbm5lY3RlZCBvbiB0aGUgc2ltdWxhdG9yCiAgICAgICAgICAgICAvLyBGSVhNRSAgdGhpcyBjYW4gYmUgaW1wcm92ZWQKICAgICAgICAgICAgIHNldFN0YXRlKFN0YXRlLkNPTk5FQ1RFRCk7Ci0gICAgICAgICAgICBwaG9uZS5ub3RpZnlEYXRhQ29ubmVjdGlvbihyZWFzb24pOworICAgICAgICAgICAgbm90aWZ5RGF0YUNvbm5lY3Rpb24ocmVhc29uKTsKKyAgICAgICAgICAgIG5vdGlmeU9mZkFwbnNPZkF2YWlsYWJpbGl0eShyZWFzb24sIHRydWUpOwogCiAgICAgICAgICAgICBMb2cuaShMT0dfVEFHLCAiKGZpeD8pIFdlJ3JlIG9uIHRoZSBzaW11bGF0b3I7IGFzc3VtaW5nIGRhdGEgaXMgY29ubmVjdGVkIik7CiAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKQEAgLTMyNywzNiArMzU1LDEzIEBACiAgICAgICAgIGJvb2xlYW4gcm9hbWluZyA9IHBob25lLmdldFNlcnZpY2VTdGF0ZSgpLmdldFJvYW1pbmcoKTsKICAgICAgICAgYm9vbGVhbiBkZXNpcmVkUG93ZXJTdGF0ZSA9IG1DZG1hUGhvbmUubVNTVC5nZXREZXNpcmVkUG93ZXJTdGF0ZSgpOwogCi0gICAgICAgIGlmICgoc3RhdGUgPT0gU3RhdGUuSURMRSB8fCBzdGF0ZSA9PSBTdGF0ZS5TQ0FOTklORykKLSAgICAgICAgICAgICAgICAmJiAocHNTdGF0ZSA9PSBTZXJ2aWNlU3RhdGUuU1RBVEVfSU5fU0VSVklDRSkKLSAgICAgICAgICAgICAgICAmJiAoKHBob25lLm1DTS5nZXRSYWRpb1N0YXRlKCkgPT0gQ29tbWFuZHNJbnRlcmZhY2UuUmFkaW9TdGF0ZS5OVl9SRUFEWSkgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgIG1DZG1hUGhvbmUubVJ1aW1SZWNvcmRzLmdldFJlY29yZHNMb2FkZWQoKSkKLSAgICAgICAgICAgICAgICAmJiAobUNkbWFQaG9uZS5tU1NULmlzQ29uY3VycmVudFZvaWNlQW5kRGF0YSgpIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICBwaG9uZS5nZXRTdGF0ZSgpID09IFBob25lLlN0YXRlLklETEUgKQotICAgICAgICAgICAgICAgICYmIGlzRGF0YUFsbG93ZWQoKQotICAgICAgICAgICAgICAgICYmIGRlc2lyZWRQb3dlclN0YXRlCi0gICAgICAgICAgICAgICAgJiYgIW1QZW5kaW5nUmVzdGFydFJhZGlvCi0gICAgICAgICAgICAgICAgJiYgIW1DZG1hUGhvbmUubmVlZHNPdGFTZXJ2aWNlUHJvdmlzaW9uaW5nKCkpIHsKLQotICAgICAgICAgICAgcmV0dXJuIHNldHVwRGF0YShyZWFzb24pOwotCisgICAgICAgIGlmICgoc3RhdGUgPT0gU3RhdGUuSURMRSB8fCBzdGF0ZSA9PSBTdGF0ZS5TQ0FOTklORykgJiYKKyAgICAgICAgICAgICAgICBpc0RhdGFBbGxvd2VkKCkgJiYgZ2V0QW55RGF0YUVuYWJsZWQoKSkgeworICAgICAgICAgICAgYm9vbGVhbiByZXRWYWx1ZSA9IHNldHVwRGF0YShyZWFzb24pOworICAgICAgICAgICAgbm90aWZ5T2ZmQXBuc09mQXZhaWxhYmlsaXR5KHJlYXNvbiwgcmV0VmFsdWUpOworICAgICAgICAgICAgcmV0dXJuIHJldFZhbHVlOwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaWYgKERCRykgewotICAgICAgICAgICAgICAgICAgICBsb2coInRyeVNldHVwRGF0YTogTm90IHJlYWR5IGZvciBkYXRhOiAiICsKLSAgICAgICAgICAgICAgICAgICAgIiBkYXRhU3RhdGU9IiArIHN0YXRlICsKLSAgICAgICAgICAgICAgICAgICAgIiBQUyBzdGF0ZT0iICsgcHNTdGF0ZSArCi0gICAgICAgICAgICAgICAgICAgICIgcmFkaW8gc3RhdGU9IiArIHBob25lLm1DTS5nZXRSYWRpb1N0YXRlKCkgKwotICAgICAgICAgICAgICAgICAgICAiIHJ1aW09IiArIG1DZG1hUGhvbmUubVJ1aW1SZWNvcmRzLmdldFJlY29yZHNMb2FkZWQoKSArCi0gICAgICAgICAgICAgICAgICAgICIgY29uY3VycmVudFZvaWNlJkRhdGE9IiArIG1DZG1hUGhvbmUubVNTVC5pc0NvbmN1cnJlbnRWb2ljZUFuZERhdGEoKSArCi0gICAgICAgICAgICAgICAgICAgICIgcGhvbmVTdGF0ZT0iICsgcGhvbmUuZ2V0U3RhdGUoKSArCi0gICAgICAgICAgICAgICAgICAgICIgZGF0YUVuYWJsZWQ9IiArIGdldEFueURhdGFFbmFibGVkKCkgKwotICAgICAgICAgICAgICAgICAgICAiIHJvYW1pbmc9IiArIHJvYW1pbmcgKwotICAgICAgICAgICAgICAgICAgICAiIGRhdGFPblJvYW1pbmdFbmFibGU9IiArIGdldERhdGFPblJvYW1pbmdFbmFibGVkKCkgKwotICAgICAgICAgICAgICAgICAgICAiIGRlc2lyZWRQb3dlclN0YXRlPSIgKyBkZXNpcmVkUG93ZXJTdGF0ZSArCi0gICAgICAgICAgICAgICAgICAgICIgUGVuZGluZ1Jlc3RhcnRSYWRpbz0iICsgbVBlbmRpbmdSZXN0YXJ0UmFkaW8gKwotICAgICAgICAgICAgICAgICAgICAiIE1hc3RlckRhdGFFbmFibGVkPSIgKyBtTWFzdGVyRGF0YUVuYWJsZWQgKwotICAgICAgICAgICAgICAgICAgICAiIG5lZWRzT3RhU2VydmljZVByb3Zpc2lvbmluZz0iICsgbUNkbWFQaG9uZS5uZWVkc090YVNlcnZpY2VQcm92aXNpb25pbmcoKSk7Ci0gICAgICAgICAgICB9CisgICAgICAgICAgICBub3RpZnlPZmZBcG5zT2ZBdmFpbGFiaWxpdHkocmVhc29uLCBmYWxzZSk7CiAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KICAgICB9CkBAIC0zODIsNiArMzg3LDcgQEAKICAgICAgICAgfQogCiAgICAgICAgIHNldFN0YXRlKFN0YXRlLkRJU0NPTk5FQ1RJTkcpOworICAgICAgICBub3RpZnlEYXRhQXZhaWxhYmlsaXR5KHJlYXNvbik7CiAKICAgICAgICAgYm9vbGVhbiBub3RpZmljYXRpb25EZWZlcnJlZCA9IGZhbHNlOwogICAgICAgICBmb3IgKERhdGFDb25uZWN0aW9uIGNvbm4gOiBkYXRhQ29ubmVjdGlvbkxpc3QpIHsKQEAgLTQ0MCwxMyArNDQ2LDEzIEBACiAgICAgICAgIGNvbm4uY29ubmVjdChtc2csIG1BY3RpdmVBcG4pOwogCiAgICAgICAgIHNldFN0YXRlKFN0YXRlLklOSVRJTkcpOwotICAgICAgICBwaG9uZS5ub3RpZnlEYXRhQ29ubmVjdGlvbihyZWFzb24pOworICAgICAgICBub3RpZnlEYXRhQ29ubmVjdGlvbihyZWFzb24pOwogICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CiAKICAgICBwcml2YXRlIHZvaWQgbm90aWZ5RGVmYXVsdERhdGEoU3RyaW5nIHJlYXNvbikgewogICAgICAgICBzZXRTdGF0ZShTdGF0ZS5DT05ORUNURUQpOwotICAgICAgICBwaG9uZS5ub3RpZnlEYXRhQ29ubmVjdGlvbihyZWFzb24pOworICAgICAgICBub3RpZnlEYXRhQ29ubmVjdGlvbihyZWFzb24pOwogICAgICAgICBzdGFydE5ldFN0YXRQb2xsKCk7CiAgICAgICAgIG1SZXRyeU1nci5yZXNldFJldHJ5Q291bnQoKTsKICAgICB9CkBAIC02MjIsMTIgKzYyOCwxMyBAQAogCiAgICAgcHJpdmF0ZSB2b2lkIG5vdGlmeU5vRGF0YShGYWlsQ2F1c2UgbGFzdEZhaWxDYXVzZUNvZGUpIHsKICAgICAgICAgc2V0U3RhdGUoU3RhdGUuRkFJTEVEKTsKKyAgICAgICAgbm90aWZ5RGF0YUF2YWlsYWJpbGl0eShudWxsKTsKICAgICB9CiAKICAgICBwcml2YXRlIHZvaWQgZ290b0lkbGVBbmROb3RpZnlEYXRhQ29ubmVjdGlvbihTdHJpbmcgcmVhc29uKSB7CiAgICAgICAgIGlmIChEQkcpIGxvZygiZ290b0lkbGVBbmROb3RpZnlEYXRhQ29ubmVjdGlvbjogcmVhc29uPSIgKyByZWFzb24pOwogICAgICAgICBzZXRTdGF0ZShTdGF0ZS5JRExFKTsKLSAgICAgICAgcGhvbmUubm90aWZ5RGF0YUNvbm5lY3Rpb24ocmVhc29uKTsKKyAgICAgICAgbm90aWZ5RGF0YUNvbm5lY3Rpb24ocmVhc29uKTsKICAgICAgICAgbUFjdGl2ZUFwbiA9IG51bGw7CiAgICAgfQogCkBAIC02ODcsMTEgKzY5NCwxMyBAQAogICAgICAgICAgICAgLy8gQXNzdW1lIGRhdGEgaXMgY29ubmVjdGVkIG9uIHRoZSBzaW11bGF0b3IKICAgICAgICAgICAgIC8vIEZJWE1FICB0aGlzIGNhbiBiZSBpbXByb3ZlZAogICAgICAgICAgICAgc2V0U3RhdGUoU3RhdGUuQ09OTkVDVEVEKTsKLSAgICAgICAgICAgIHBob25lLm5vdGlmeURhdGFDb25uZWN0aW9uKG51bGwpOworICAgICAgICAgICAgbm90aWZ5RGF0YUNvbm5lY3Rpb24obnVsbCk7CiAKICAgICAgICAgICAgIExvZy5pKExPR19UQUcsICJXZSdyZSBvbiB0aGUgc2ltdWxhdG9yOyBhc3N1bWluZyBkYXRhIGlzIGNvbm5lY3RlZCIpOwogICAgICAgICB9CiAKKyAgICAgICAgbm90aWZ5RGF0YUF2YWlsYWJpbGl0eShudWxsKTsKKwogICAgICAgICBpZiAoc3RhdGUgIT0gU3RhdGUuSURMRSkgewogICAgICAgICAgICAgY2xlYW5VcENvbm5lY3Rpb24odHJ1ZSwgbnVsbCk7CiAgICAgICAgIH0KQEAgLTcyMyw2ICs3MzIsOCBAQAogICAgICAgICB9CiAKICAgICAgICAgaWYgKGFyLmV4Y2VwdGlvbiA9PSBudWxsKSB7CisgICAgICAgICAgICBtTGlua1Byb3BlcnRpZXMgPSBnZXRMaW5rUHJvcGVydGllcyhtQWN0aXZlRGF0YUNvbm5lY3Rpb24pOworCiAgICAgICAgICAgICAvLyBldmVyeXRoaW5nIGlzIHNldHVwCiAgICAgICAgICAgICBub3RpZnlEZWZhdWx0RGF0YShyZWFzb24pOwogICAgICAgICB9IGVsc2UgewpAQCAtNzYyLDcgKzc3Myw3IEBACiAgICAgICAgICAgICBvblJlc3RhcnRSYWRpbygpOwogICAgICAgICB9CiAKLSAgICAgICAgcGhvbmUubm90aWZ5RGF0YUNvbm5lY3Rpb24ocmVhc29uKTsKKyAgICAgICAgbm90aWZ5RGF0YUNvbm5lY3Rpb24ocmVhc29uKTsKICAgICAgICAgbUFjdGl2ZUFwbiA9IG51bGw7CiAgICAgICAgIGlmIChyZXRyeUFmdGVyRGlzY29ubmVjdGVkKHJlYXNvbikpIHsKICAgICAgICAgICB0cnlTZXR1cERhdGEocmVhc29uKTsKQEAgLTc4OSw3ICs4MDAsOCBAQAogICAgIHByb3RlY3RlZCB2b2lkIG9uVm9pY2VDYWxsU3RhcnRlZCgpIHsKICAgICAgICAgaWYgKHN0YXRlID09IFN0YXRlLkNPTk5FQ1RFRCAmJiAhbUNkbWFQaG9uZS5tU1NULmlzQ29uY3VycmVudFZvaWNlQW5kRGF0YSgpKSB7CiAgICAgICAgICAgICBzdG9wTmV0U3RhdFBvbGwoKTsKLSAgICAgICAgICAgIHBob25lLm5vdGlmeURhdGFDb25uZWN0aW9uKFBob25lLlJFQVNPTl9WT0lDRV9DQUxMX1NUQVJURUQpOworICAgICAgICAgICAgbm90aWZ5RGF0YUNvbm5lY3Rpb24oUGhvbmUuUkVBU09OX1ZPSUNFX0NBTExfU1RBUlRFRCk7CisgICAgICAgICAgICBub3RpZnlEYXRhQXZhaWxhYmlsaXR5KFBob25lLlJFQVNPTl9WT0lDRV9DQUxMX1NUQVJURUQpOwogICAgICAgICB9CiAgICAgfQogCkBAIC04MDAsMTEgKzgxMiwxMiBAQAogICAgICAgICBpZiAoc3RhdGUgPT0gU3RhdGUuQ09OTkVDVEVEKSB7CiAgICAgICAgICAgICBpZiAoIW1DZG1hUGhvbmUubVNTVC5pc0NvbmN1cnJlbnRWb2ljZUFuZERhdGEoKSkgewogICAgICAgICAgICAgICAgIHN0YXJ0TmV0U3RhdFBvbGwoKTsKLSAgICAgICAgICAgICAgICBwaG9uZS5ub3RpZnlEYXRhQ29ubmVjdGlvbihQaG9uZS5SRUFTT05fVk9JQ0VfQ0FMTF9FTkRFRCk7CisgICAgICAgICAgICAgICAgbm90aWZ5RGF0YUNvbm5lY3Rpb24oUGhvbmUuUkVBU09OX1ZPSUNFX0NBTExfRU5ERUQpOwogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAvLyBjbGVhbiBzbGF0ZSBhZnRlciBjYWxsIGVuZC4KICAgICAgICAgICAgICAgICByZXNldFBvbGxTdGF0cygpOwogICAgICAgICAgICAgfQorICAgICAgICAgICAgbm90aWZ5RGF0YUF2YWlsYWJpbGl0eShQaG9uZS5SRUFTT05fVk9JQ0VfQ0FMTF9FTkRFRCk7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBtUmV0cnlNZ3IucmVzZXRSZXRyeUNvdW50KCk7CiAgICAgICAgICAgICAvLyBpbiBjYXNlIGRhdGEgc2V0dXAgd2FzIGF0dGVtcHRlZCB3aGVuIHdlIHdlcmUgb24gYSB2b2ljZSBjYWxsCkBAIC04MzgsNyArODUxLDcgQEAKICAgICBwcml2YXRlIHZvaWQgb25DZG1hRGF0YURldGFjaGVkKCkgewogICAgICAgICBpZiAoc3RhdGUgPT0gU3RhdGUuQ09OTkVDVEVEKSB7CiAgICAgICAgICAgICBzdGFydE5ldFN0YXRQb2xsKCk7Ci0gICAgICAgICAgICBwaG9uZS5ub3RpZnlEYXRhQ29ubmVjdGlvbihQaG9uZS5SRUFTT05fQ0RNQV9EQVRBX0RFVEFDSEVEKTsKKyAgICAgICAgICAgIG5vdGlmeURhdGFDb25uZWN0aW9uKFBob25lLlJFQVNPTl9DRE1BX0RBVEFfREVUQUNIRUQpOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgaWYgKHN0YXRlID09IFN0YXRlLkZBSUxFRCkgewogICAgICAgICAgICAgICAgIGNsZWFuVXBDb25uZWN0aW9uKGZhbHNlLCBQaG9uZS5SRUFTT05fQ0RNQV9EQVRBX0RFVEFDSEVEKTsKQEAgLTk0OSwzNCArOTYyLDYgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0SW50ZXJmYWNlTmFtZShTdHJpbmcgYXBuVHlwZSkgewotICAgICAgICBpZiAobUFjdGl2ZURhdGFDb25uZWN0aW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBtQWN0aXZlRGF0YUNvbm5lY3Rpb24uZ2V0SW50ZXJmYWNlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRJcEFkZHJlc3MoU3RyaW5nIGFwblR5cGUpIHsKLSAgICAgICAgaWYgKG1BY3RpdmVEYXRhQ29ubmVjdGlvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gbUFjdGl2ZURhdGFDb25uZWN0aW9uLmdldElwQWRkcmVzcygpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0R2F0ZXdheShTdHJpbmcgYXBuVHlwZSkgewotICAgICAgICBpZiAobUFjdGl2ZURhdGFDb25uZWN0aW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBtQWN0aXZlRGF0YUNvbm5lY3Rpb24uZ2V0R2F0ZXdheUFkZHJlc3MoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nW10gZ2V0RG5zU2VydmVycyhTdHJpbmcgYXBuVHlwZSkgewotICAgICAgICBpZiAobUFjdGl2ZURhdGFDb25uZWN0aW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBtQWN0aXZlRGF0YUNvbm5lY3Rpb24uZ2V0RG5zU2VydmVycygpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQogICAgIHB1YmxpYyBBcnJheUxpc3Q8RGF0YUNvbm5lY3Rpb24+IGdldEFsbERhdGFDb25uZWN0aW9ucygpIHsKICAgICAgICAgcmV0dXJuIGRhdGFDb25uZWN0aW9uTGlzdDsKICAgICB9CmRpZmYgLS1naXQgYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvY2RtYS9DZG1hU01TRGlzcGF0Y2hlci5qYXZhIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2NkbWEvQ2RtYVNNU0Rpc3BhdGNoZXIuamF2YQppbmRleCBkY2VmZjJhLi4zN2EzM2JjIDEwMDY0NAotLS0gYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvY2RtYS9DZG1hU01TRGlzcGF0Y2hlci5qYXZhCisrKyBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9jZG1hL0NkbWFTTVNEaXNwYXRjaGVyLmphdmEKQEAgLTcwLDYgKzcwLDcgQEAKICAgICAgKiBAcGFyYW0gYXIgQXN5bmNSZXN1bHQgcGFzc2VkIGludG8gdGhlIG1lc3NhZ2UgaGFuZGxlci4gIGFyLnJlc3VsdCBzaG91bGQKICAgICAgKiAgICAgICAgICAgYmUgYSBTdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBzdGF0dXMgcmVwb3J0IFBEVSwgYXMgQVNDSUkgaGV4LgogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHByb3RlY3RlZCB2b2lkIGhhbmRsZVN0YXR1c1JlcG9ydChBc3luY1Jlc3VsdCBhcikgewogICAgICAgICBMb2cuZChUQUcsICJoYW5kbGVTdGF0dXNSZXBvcnQgaXMgYSBzcGVjaWFsIEdTTSBmdW5jdGlvbiwgc2hvdWxkIG5ldmVyIGJlIGNhbGxlZCBpbiBDRE1BISIpOwogICAgIH0KQEAgLTkyLDYgKzkzLDcgQEAKICAgICB9CiAKICAgICAvKioge0Bpbmhlcml0RG9jfSAqLworICAgIEBPdmVycmlkZQogICAgIHByb3RlY3RlZCBpbnQgZGlzcGF0Y2hNZXNzYWdlKFNtc01lc3NhZ2VCYXNlIHNtc2IpIHsKIAogICAgICAgICAvLyBJZiBzbXMgaXMgbnVsbCwgbWVhbnMgdGhlcmUgd2FzIGEgcGFyc2luZyBlcnJvci4KQEAgLTMzNSw2ICszMzcsNyBAQAogICAgIH0KIAogICAgIC8qKiB7QGluaGVyaXREb2N9ICovCisgICAgQE92ZXJyaWRlCiAgICAgcHJvdGVjdGVkIHZvaWQgc2VuZERhdGEoU3RyaW5nIGRlc3RBZGRyLCBTdHJpbmcgc2NBZGRyLCBpbnQgZGVzdFBvcnQsCiAgICAgICAgICAgICBieXRlW10gZGF0YSwgUGVuZGluZ0ludGVudCBzZW50SW50ZW50LCBQZW5kaW5nSW50ZW50IGRlbGl2ZXJ5SW50ZW50KSB7CiAgICAgICAgIFNtc01lc3NhZ2UuU3VibWl0UGR1IHBkdSA9IFNtc01lc3NhZ2UuZ2V0U3VibWl0UGR1KApAQCAtMzQzLDYgKzM0Niw3IEBACiAgICAgfQogCiAgICAgLyoqIHtAaW5oZXJpdERvY30gKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwcm90ZWN0ZWQgdm9pZCBzZW5kVGV4dChTdHJpbmcgZGVzdEFkZHIsIFN0cmluZyBzY0FkZHIsIFN0cmluZyB0ZXh0LAogICAgICAgICAgICAgUGVuZGluZ0ludGVudCBzZW50SW50ZW50LCBQZW5kaW5nSW50ZW50IGRlbGl2ZXJ5SW50ZW50KSB7CiAgICAgICAgIFNtc01lc3NhZ2UuU3VibWl0UGR1IHBkdSA9IFNtc01lc3NhZ2UuZ2V0U3VibWl0UGR1KApAQCAtMzUxLDYgKzM1NSw3IEBACiAgICAgfQogCiAgICAgLyoqIHtAaW5oZXJpdERvY30gKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwcm90ZWN0ZWQgdm9pZCBzZW5kTXVsdGlwYXJ0VGV4dChTdHJpbmcgZGVzdEFkZHIsIFN0cmluZyBzY0FkZHIsCiAgICAgICAgICAgICBBcnJheUxpc3Q8U3RyaW5nPiBwYXJ0cywgQXJyYXlMaXN0PFBlbmRpbmdJbnRlbnQ+IHNlbnRJbnRlbnRzLAogICAgICAgICAgICAgQXJyYXlMaXN0PFBlbmRpbmdJbnRlbnQ+IGRlbGl2ZXJ5SW50ZW50cykgewpAQCAtMzU5LDcgKzM2NCw3IEBACiAgICAgICAgICAqIFRPRE8oY2xlYW51cCk6IFRoZXJlIGlzIG5vIHJlYWwgY29kZSBkaWZmZXJlbmNlIGJldHdlZW4KICAgICAgICAgICogdGhpcyBhbmQgdGhlIEdTTSB2ZXJzaW9uLCBhbmQgaGVuY2UgaXQgc2hvdWxkIGJlIG1vdmVkIHRvCiAgICAgICAgICAqIHRoZSBiYXNlIGNsYXNzIG9yIGNvbnNvbGlkYXRlZCBzb21laG93LCBwcm92aWRlZCBjYWxsaW5nCi0gICAgICAgICAqIHRoZSBwcm9wZXIgc3VibWl0cGR1IHN0dWZmIGNhbiBiZSBhcnJhbmdlZC4KKyAgICAgICAgICogdGhlIHByb3BlciBzdWJtaXQgcGR1IHN0dWZmIGNhbiBiZSBhcnJhbmdlZC4KICAgICAgICAgICovCiAKICAgICAgICAgaW50IHJlZk51bWJlciA9IGdldE5leHRDb25jYXRlbmF0ZWRSZWYoKSAmIDB4MDBGRjsKQEAgLTQzMiw4ICs0MzcsOSBAQAogICAgIH0KIAogICAgIC8qKiB7QGluaGVyaXREb2N9ICovCisgICAgQE92ZXJyaWRlCiAgICAgcHJvdGVjdGVkIHZvaWQgc2VuZFNtcyhTbXNUcmFja2VyIHRyYWNrZXIpIHsKLSAgICAgICAgSGFzaE1hcCBtYXAgPSB0cmFja2VyLm1EYXRhOworICAgICAgICBIYXNoTWFwPFN0cmluZywgT2JqZWN0PiBtYXAgPSB0cmFja2VyLm1EYXRhOwogCiAgICAgICAgIC8vIGJ5dGUgc21zY1tdID0gKGJ5dGVbXSkgbWFwLmdldCgic21zYyIpOyAgLy8gdW51c2VkIGZvciBDRE1BCiAgICAgICAgIGJ5dGUgcGR1W10gPSAoYnl0ZVtdKSBtYXAuZ2V0KCJwZHUiKTsKQEAgLTQ0NCwxMSArNDUwLDEzIEBACiAgICAgfQogCiAgICAgIC8qKiB7QGluaGVyaXREb2N9ICovCisgICAgQE92ZXJyaWRlCiAgICAgcHJvdGVjdGVkIHZvaWQgc2VuZE11bHRpcGFydFNtcyAoU21zVHJhY2tlciB0cmFja2VyKSB7CiAgICAgICAgIExvZy5kKFRBRywgIlRPRE86IENkbWFTTVNEaXNwYXRjaGVyLnNlbmRNdWx0aXBhcnRTbXMgbm90IGltcGxlbWVudGVkIik7CiAgICAgfQogCiAgICAgLyoqIHtAaW5oZXJpdERvY30gKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwcm90ZWN0ZWQgdm9pZCBhY2tub3dsZWRnZUxhc3RJbmNvbWluZ1Ntcyhib29sZWFuIHN1Y2Nlc3MsIGludCByZXN1bHQsIE1lc3NhZ2UgcmVzcG9uc2UpewogICAgICAgICAvLyBGSVhNRSB1bml0IHRlc3QgbGVhdmVzIGNtID09IG51bGwuIHRoaXMgc2hvdWxkIGNoYW5nZQogCkBAIC00NjksMTYgKzQ3NywxOSBAQAogICAgIH0KIAogICAgIC8qKiB7QGluaGVyaXREb2N9ICovCisgICAgQE92ZXJyaWRlCiAgICAgcHJvdGVjdGVkIHZvaWQgYWN0aXZhdGVDZWxsQnJvYWRjYXN0U21zKGludCBhY3RpdmF0ZSwgTWVzc2FnZSByZXNwb25zZSkgewogICAgICAgICBtQ20uc2V0Q2RtYUJyb2FkY2FzdEFjdGl2YXRpb24oKGFjdGl2YXRlID09IDApLCByZXNwb25zZSk7CiAgICAgfQogCiAgICAgLyoqIHtAaW5oZXJpdERvY30gKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwcm90ZWN0ZWQgdm9pZCBnZXRDZWxsQnJvYWRjYXN0U21zQ29uZmlnKE1lc3NhZ2UgcmVzcG9uc2UpIHsKICAgICAgICAgbUNtLmdldENkbWFCcm9hZGNhc3RDb25maWcocmVzcG9uc2UpOwogICAgIH0KIAogICAgIC8qKiB7QGluaGVyaXREb2N9ICovCisgICAgQE92ZXJyaWRlCiAgICAgcHJvdGVjdGVkIHZvaWQgc2V0Q2VsbEJyb2FkY2FzdENvbmZpZyhpbnRbXSBjb25maWdWYWx1ZXNBcnJheSwgTWVzc2FnZSByZXNwb25zZSkgewogICAgICAgICBtQ20uc2V0Q2RtYUJyb2FkY2FzdENvbmZpZyhjb25maWdWYWx1ZXNBcnJheSwgcmVzcG9uc2UpOwogICAgIH0KZGlmZiAtLWdpdCBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9jZG1hL0NkbWFTZXJ2aWNlU3RhdGVUcmFja2VyLmphdmEgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvY2RtYS9DZG1hU2VydmljZVN0YXRlVHJhY2tlci5qYXZhCmluZGV4IDJjYWQ2Y2MuLjVkNGRjNTggMTAwNjQ0Ci0tLSBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9jZG1hL0NkbWFTZXJ2aWNlU3RhdGVUcmFja2VyLmphdmEKKysrIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2NkbWEvQ2RtYVNlcnZpY2VTdGF0ZVRyYWNrZXIuamF2YQpAQCAtMTExOSw3ICsxMTE5LDcgQEAKICAgICAgICAgfQogCiAgICAgICAgIGlmIChoYXNDZG1hRGF0YUNvbm5lY3Rpb25DaGFuZ2VkIHx8IGhhc05ldHdvcmtUeXBlQ2hhbmdlZCkgewotICAgICAgICAgICAgcGhvbmUubm90aWZ5RGF0YUNvbm5lY3Rpb24obnVsbCk7CisgICAgICAgICAgICBwaG9uZS5ub3RpZnlEYXRhQ29ubmVjdGlvbihudWxsLCBudWxsKTsKICAgICAgICAgfQogCiAgICAgICAgIGlmIChoYXNSb2FtaW5nT24pIHsKZGlmZiAtLWdpdCBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9jZG1hL1J1aW1TbXNJbnRlcmZhY2VNYW5hZ2VyLmphdmEgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvY2RtYS9SdWltU21zSW50ZXJmYWNlTWFuYWdlci5qYXZhCmluZGV4IGU5NzU0OWQuLmQ4NGI2YWIgMTAwNjQ0Ci0tLSBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9jZG1hL1J1aW1TbXNJbnRlcmZhY2VNYW5hZ2VyLmphdmEKKysrIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2NkbWEvUnVpbVNtc0ludGVyZmFjZU1hbmFnZXIuamF2YQpAQCAtNjgsOCArNjgsNyBAQAogICAgICAgICAgICAgICAgICAgICBhciA9IChBc3luY1Jlc3VsdCltc2cub2JqOwogICAgICAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYXIuZXhjZXB0aW9uID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtU21zICA9IChMaXN0PFNtc1Jhd0RhdGE+KQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVpbGRWYWxpZFJhd0RhdGEoKEFycmF5TGlzdDxieXRlW10+KSBhci5yZXN1bHQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1TbXMgPSBidWlsZFZhbGlkUmF3RGF0YSgoQXJyYXlMaXN0PGJ5dGVbXT4pIGFyLnJlc3VsdCk7CiAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKERCRykgbG9nKCJDYW5ub3QgbG9hZCBTbXMgcmVjb3JkcyIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtU21zICE9IG51bGwpCmRpZmYgLS1naXQgYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvY2RtYS9TbXNNZXNzYWdlLmphdmEgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvY2RtYS9TbXNNZXNzYWdlLmphdmEKaW5kZXggMGYzYjhmZi4uZTk1YjJmOSAxMDA3NTUKLS0tIGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2NkbWEvU21zTWVzc2FnZS5qYXZhCisrKyBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9jZG1hL1Ntc01lc3NhZ2UuamF2YQpAQCAtMTgsMTEgKzE4LDggQEAKIAogaW1wb3J0IGFuZHJvaWQub3MuUGFyY2VsOwogaW1wb3J0IGFuZHJvaWQub3MuU3lzdGVtUHJvcGVydGllczsKLWltcG9ydCBhbmRyb2lkLnRleHQuZm9ybWF0LlRpbWU7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkNvbmZpZzsKIGltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwotaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5FbmNvZGVFeGNlcHRpb247Ci1pbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LkdzbUFscGhhYmV0OwogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5JY2NVdGlsczsKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuU21zSGVhZGVyOwogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5TbXNNZXNzYWdlQmFzZTsKQEAgLTMzLDcgKzMwLDYgQEAKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuY2RtYS5zbXMuVXNlckRhdGE7CiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudXRpbC5IZXhEdW1wOwogCi1pbXBvcnQgamF2YS5pby5CdWZmZXJlZElucHV0U3RyZWFtOwogaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRPdXRwdXRTdHJlYW07CiBpbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsKQEAgLTU4LDcgKzU0LDcgQEAKIC8qKgogICogVE9ETyhjbGVhbnVwKTogaW50ZXJuYWxseSByZXR1cm5pbmcgbnVsbCBpbiBtYW55IHBsYWNlcyBtYWtlcwogICogZGVidWdnaW5nIHZlcnkgaGFyZCAoYW1vbmcgbWFueSBvdGhlciByZWFzb25zKSBhbmQgc2hvdWxkIGJlIG1hZGUKLSAqIG1vcmUgbWVhbmluZ2Z1bCAocmVwbGFjZWQgd2l0aCBleGVjcHRpb25zIGZvciBleGFtcGxlKS4gIE51bGwKKyAqIG1vcmUgbWVhbmluZ2Z1bCAocmVwbGFjZWQgd2l0aCBleGNlcHRpb25zIGZvciBleGFtcGxlKS4gIE51bGwKICAqIHJldHVybnMgc2hvdWxkIG9ubHkgb2NjdXIgYXQgdGhlIHZlcnkgb3V0c2lkZSBvZiB0aGUgbW9kdWxlL2NsYXNzCiAgKiBzY29wZS4KICAqLwpAQCAtNjE0LDcgKzYxMCw3IEBACiAgICAgICogaW5jcmVtZW50aW5nIHdpdGhpbiB0aGUgcmFuZ2UgMS4uNjU1MzUgcmVtZW1iZXJpbmcgdGhlIHN0YXRlCiAgICAgICogdmlhIGEgcGVyc2lzdGVudCBzeXN0ZW0gcHJvcGVydHkuICAoU2VlIEMuUzAwMTUtQiwgdjIuMCwKICAgICAgKiA0LjMuMS41KSBTaW5jZSB0aGlzIHJvdXRpbmUgaXMgZXhwZWN0ZWQgdG8gYmUgYWNjZXNzZWQgdmlhIHZpYQotICAgICAqIGJpbmRlci1jYWxsLCBhbmQgaGVuY2Ugc2hvdWxkIGJlIHRocmVhZHNhZmUsIGl0IGhhcyBiZWVuCisgICAgICogYmluZGVyLWNhbGwsIGFuZCBoZW5jZSBzaG91bGQgYmUgdGhyZWFkLXNhZmUsIGl0IGhhcyBiZWVuCiAgICAgICogc3luY2hyb25pemVkLgogICAgICAqLwogICAgIHByaXZhdGUgc3luY2hyb25pemVkIHN0YXRpYyBpbnQgZ2V0TmV4dE1lc3NhZ2VJZCgpIHsKZGlmZiAtLWdpdCBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9jZG1hL3Ntcy9CZWFyZXJEYXRhLmphdmEgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvY2RtYS9zbXMvQmVhcmVyRGF0YS5qYXZhCmluZGV4IGFiNzlmZTkuLmNmMDZkYWIgMTAwNjQ0Ci0tLSBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9jZG1hL3Ntcy9CZWFyZXJEYXRhLmphdmEKKysrIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2NkbWEvc21zL0JlYXJlckRhdGEuamF2YQpAQCAtMjEsNyArMjEsNiBAQAogaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnRlbGVwaG9ueS5TbXNNZXNzYWdlLk1BWF9VU0VSX0RBVEFfQllURVNfV0lUSF9IRUFERVI7CiAKIGltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwotaW1wb3J0IGFuZHJvaWQudXRpbC5TcGFyc2VJbnRBcnJheTsKIAogaW1wb3J0IGFuZHJvaWQudGVsZXBob255LlNtc01lc3NhZ2U7CiAKQEAgLTMwLDEwICsyOSw4IEBACiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LkljY1V0aWxzOwogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5Hc21BbHBoYWJldDsKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuU21zSGVhZGVyOwotaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5jZG1hLnNtcy5Vc2VyRGF0YTsKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuU21zTWVzc2FnZUJhc2UuVGV4dEVuY29kaW5nRGV0YWlsczsKIAotaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnV0aWwuSGV4RHVtcDsKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC51dGlsLkJpdHdpc2VJbnB1dFN0cmVhbTsKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC51dGlsLkJpdHdpc2VPdXRwdXRTdHJlYW07CiAKQEAgLTQ1LDEzICs0MiwxMyBAQAogICAgIHByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBMT0dfVEFHID0gIlNNUyI7CiAKICAgICAvKioKLSAgICAgKiBCZWFyZXIgRGF0YSBTdWJwYXJhbWV0ZXIgSW5kZW50aWZpZXJzCisgICAgICogQmVhcmVyIERhdGEgU3VicGFyYW1ldGVyIElkZW50aWZpZXJzCiAgICAgICogKFNlZSAzR1BQMiBDLlMwMDE1LUIsIHYyLjAsIHRhYmxlIDQuNS0xKQogICAgICAqIE5PVEU6IENvbW1lbnRlZCBzdWJwYXJhbWV0ZXIgdHlwZXMgYXJlIG5vdCBpbXBsZW1lbnRlZC4KICAgICAgKi8KICAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBieXRlIFNVQlBBUkFNX01FU1NBR0VfSURFTlRJRklFUiAgICAgICAgICAgICAgID0gMHgwMDsKICAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBieXRlIFNVQlBBUkFNX1VTRVJfREFUQSAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwMTsKLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBieXRlIFNVQlBBUkFNX1VTRVJfUkVQT05TRV9DT0RFICAgICAgICAgICAgICAgID0gMHgwMjsKKyAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBieXRlIFNVQlBBUkFNX1VTRVJfUkVTUE9OU0VfQ09ERSAgICAgICAgICAgICAgID0gMHgwMjsKICAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBieXRlIFNVQlBBUkFNX01FU1NBR0VfQ0VOVEVSX1RJTUVfU1RBTVAgICAgICAgID0gMHgwMzsKICAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBieXRlIFNVQlBBUkFNX1ZBTElESVRZX1BFUklPRF9BQlNPTFVURSAgICAgICAgID0gMHgwNDsKICAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBieXRlIFNVQlBBUkFNX1ZBTElESVRZX1BFUklPRF9SRUxBVElWRSAgICAgICAgID0gMHgwNTsKQEAgLTY5Nyw3ICs2OTQsNyBAQAogICAgIC8qCiAgICAgICogVE9ETyhjbGVhbnVwKTogQ2RtYVNtc0FkZHJlc3MgZW5jb2Rpbmcgc2hvdWxkIG1ha2UgdXNlIG9mCiAgICAgICogQ2RtYVNtc0FkZHJlc3MucGFyc2UgcHJvdmlkZWQgdGhhdCBEVE1GIGVuY29kaW5nIGlzIHVuaWZpZWQsCi0gICAgICogYW5kIHRoZSBkaWZmZXJlbmNlIGluIDRiaXQgdnMgOGJpdCBpcyByZXNvbHZlZC4KKyAgICAgKiBhbmQgdGhlIGRpZmZlcmVuY2UgaW4gNC1iaXQgdnMuIDgtYml0IGlzIHJlc29sdmVkLgogICAgICAqLwogCiAgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBlbmNvZGVDZG1hU21zQWRkcmVzcyhDZG1hU21zQWRkcmVzcyBhZGRyKSB0aHJvd3MgQ29kaW5nRXhjZXB0aW9uIHsKQEAgLTgwNSw2ICs4MDIsNyBAQAogICAgICAqIChTZWUgM0dQUDIgQy5SMTAwMS1GLCB2MS4wLCBzZWN0aW9uIDQuNSBmb3IgbGF5b3V0IGRldGFpbHMpCiAgICAgICoKICAgICAgKiBAcGFyYW0gYkRhdGEgYW4gaW5zdGFuY2Ugb2YgQmVhcmVyRGF0YS4KKyAgICAgKgogICAgICAqIEByZXR1cm4gYnl0ZSBhcnJheSBvZiByYXcgZW5jb2RlZCBTTVMgYmVhcmVyIGRhdGEuCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBieXRlW10gZW5jb2RlKEJlYXJlckRhdGEgYkRhdGEpIHsKQEAgLTkxNSw3ICs5MTMsNyBAQAogICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBkZWNvZGVVdGYxNihieXRlW10gZGF0YSwgaW50IG9mZnNldCwgaW50IG51bUZpZWxkcykKICAgICAgICAgdGhyb3dzIENvZGluZ0V4Y2VwdGlvbgogICAgIHsKLSAgICAgICAgLy8gU3RhcnQgcmVhZGluZyBmcm9tIHRoZSBuZXh0IDE2LWJpdCBhbGlnbmVkIGJvdW5kcnkgYWZ0ZXIgb2Zmc2V0LgorICAgICAgICAvLyBTdGFydCByZWFkaW5nIGZyb20gdGhlIG5leHQgMTYtYml0IGFsaWduZWQgYm91bmRhcnkgYWZ0ZXIgb2Zmc2V0LgogICAgICAgICBpbnQgcGFkZGluZyA9IG9mZnNldCAlIDI7CiAgICAgICAgIG51bUZpZWxkcyAtPSAob2Zmc2V0ICsgcGFkZGluZykgLyAyOwogICAgICAgICB0cnkgewpAQCAtOTYxLDcgKzk1OSw3IEBACiAgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGRlY29kZTdiaXRHc20oYnl0ZVtdIGRhdGEsIGludCBvZmZzZXQsIGludCBudW1GaWVsZHMpCiAgICAgICAgIHRocm93cyBDb2RpbmdFeGNlcHRpb24KICAgICB7Ci0gICAgICAgIC8vIFN0YXJ0IHJlYWRpbmcgZnJvbSB0aGUgbmV4dCA3LWJpdCBhbGlnbmVkIGJvdW5kcnkgYWZ0ZXIgb2Zmc2V0LgorICAgICAgICAvLyBTdGFydCByZWFkaW5nIGZyb20gdGhlIG5leHQgNy1iaXQgYWxpZ25lZCBib3VuZGFyeSBhZnRlciBvZmZzZXQuCiAgICAgICAgIGludCBvZmZzZXRCaXRzID0gb2Zmc2V0ICogODsKICAgICAgICAgaW50IG9mZnNldFNlcHRldHMgPSAob2Zmc2V0Qml0cyArIDYpIC8gNzsKICAgICAgICAgbnVtRmllbGRzIC09IG9mZnNldFNlcHRldHM7CkBAIC0xNTU0LDcgKzE1NTIsNyBAQAogICAgICAgICAgICAgICAgIGNhc2UgU1VCUEFSQU1fVVNFUl9EQVRBOgogICAgICAgICAgICAgICAgICAgICBkZWNvZGVTdWNjZXNzID0gZGVjb2RlVXNlckRhdGEoYkRhdGEsIGluU3RyZWFtKTsKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBTVUJQQVJBTV9VU0VSX1JFUE9OU0VfQ09ERToKKyAgICAgICAgICAgICAgICBjYXNlIFNVQlBBUkFNX1VTRVJfUkVTUE9OU0VfQ09ERToKICAgICAgICAgICAgICAgICAgICAgZGVjb2RlU3VjY2VzcyA9IGRlY29kZVVzZXJSZXNwb25zZUNvZGUoYkRhdGEsIGluU3RyZWFtKTsKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgY2FzZSBTVUJQQVJBTV9SRVBMWV9PUFRJT046CmRpZmYgLS1naXQgYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvY2RtYS9zbXMvU21zRW52ZWxvcGUuamF2YSBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9jZG1hL3Ntcy9TbXNFbnZlbG9wZS5qYXZhCmluZGV4IDBkY2FjYzEuLmE2NzMyN2EgMTAwNjQ0Ci0tLSBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9jZG1hL3Ntcy9TbXNFbnZlbG9wZS5qYXZhCisrKyBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9jZG1hL3Ntcy9TbXNFbnZlbG9wZS5qYXZhCkBAIC0xNyw3ICsxNyw3IEBACiBwYWNrYWdlIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5jZG1hLnNtczsKIAogCi1wdWJsaWMgZmluYWwgY2xhc3MgU21zRW52ZWxvcGV7CitwdWJsaWMgZmluYWwgY2xhc3MgU21zRW52ZWxvcGUgewogICAgIC8qKgogICAgICAqIE1lc3NhZ2UgVHlwZXMKICAgICAgKiAoU2VlIDNHUFAyIEMuUzAwMTUtQiAzLjQuMSkKZGlmZiAtLWdpdCBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9nc20vR1NNUGhvbmUuamF2YSBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9nc20vR1NNUGhvbmUuamF2YQppbmRleCA0Mzk3MWZmLi4zMGE2MzI0IDEwMDY0NAotLS0gYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvZ3NtL0dTTVBob25lLmphdmEKKysrIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2dzbS9HU01QaG9uZS5qYXZhCkBAIC0yODcsNyArMjg3LDcgQEAKICAgICAgICAgcmV0dXJuIG1QZW5kaW5nTU1JczsKICAgICB9CiAKLSAgICBwdWJsaWMgRGF0YVN0YXRlIGdldERhdGFDb25uZWN0aW9uU3RhdGUoKSB7CisgICAgcHVibGljIERhdGFTdGF0ZSBnZXREYXRhQ29ubmVjdGlvblN0YXRlKFN0cmluZyBhcG5UeXBlKSB7CiAgICAgICAgIERhdGFTdGF0ZSByZXQgPSBEYXRhU3RhdGUuRElTQ09OTkVDVEVEOwogCiAgICAgICAgIGlmIChtU1NUID09IG51bGwpIHsKQEAgLTMwMCw2ICszMDAsOCBAQAogICAgICAgICAgICAgLy8gSWYgd2UncmUgb3V0IG9mIHNlcnZpY2UsIG9wZW4gVENQIHNvY2tldHMgbWF5IHN0aWxsIHdvcmsKICAgICAgICAgICAgIC8vIGJ1dCBubyBkYXRhIHdpbGwgZmxvdwogICAgICAgICAgICAgcmV0ID0gRGF0YVN0YXRlLkRJU0NPTk5FQ1RFRDsKKyAgICAgICAgfSBlbHNlIGlmIChtRGF0YUNvbm5lY3Rpb24uaXNBcG5UeXBlRW5hYmxlZChhcG5UeXBlKSA9PSBmYWxzZSkgeworICAgICAgICAgICAgcmV0ID0gRGF0YVN0YXRlLkRJU0NPTk5FQ1RFRDsKICAgICAgICAgfSBlbHNlIHsgLyogbVNTVC5ncHJzU3RhdGUgPT0gU2VydmljZVN0YXRlLlNUQVRFX0lOX1NFUlZJQ0UgKi8KICAgICAgICAgICAgIHN3aXRjaCAobURhdGFDb25uZWN0aW9uLmdldFN0YXRlKCkpIHsKICAgICAgICAgICAgICAgICBjYXNlIEZBSUxFRDoKQEAgLTQwMSw4ICs0MDMsOCBAQAogICAgIH0KIAogICAgIC8qcGFja2FnZSovIHZvaWQKLSAgICBub3RpZnlEYXRhQ29ubmVjdGlvbkZhaWxlZChTdHJpbmcgcmVhc29uKSB7Ci0gICAgICAgIG1Ob3RpZmllci5ub3RpZnlEYXRhQ29ubmVjdGlvbkZhaWxlZCh0aGlzLCByZWFzb24pOworICAgIG5vdGlmeURhdGFDb25uZWN0aW9uRmFpbGVkKFN0cmluZyByZWFzb24sIFN0cmluZyBhcG5UeXBlKSB7CisgICAgICAgIG1Ob3RpZmllci5ub3RpZnlEYXRhQ29ubmVjdGlvbkZhaWxlZCh0aGlzLCByZWFzb24sIGFwblR5cGUpOwogICAgIH0KIAogICAgIC8qcGFja2FnZSovIHZvaWQKQEAgLTEwOTEsMjcgKzEwOTMsNiBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFRoZSBvbmx5IGNpcmN1bXN0YW5jZXMgdW5kZXIgd2hpY2ggd2UgcmVwb3J0IHRoYXQgZGF0YSBjb25uZWN0aXZpdHkgaXMgbm90Ci0gICAgICogcG9zc2libGUgYXJlCi0gICAgICogPHVsPgotICAgICAqIDxsaT5EYXRhIHJvYW1pbmcgaXMgZGlzYWxsb3dlZCBhbmQgd2UgYXJlIHJvYW1pbmcuPC9saT4KLSAgICAgKiA8bGk+VGhlIGN1cnJlbnQgZGF0YSBzdGF0ZSBpcyB7QGNvZGUgRElTQ09OTkVDVEVEfSBmb3IgYSByZWFzb24gb3RoZXIgdGhhbgotICAgICAqIGhhdmluZyBleHBsaWNpdGx5IGRpc2FibGVkIGNvbm5lY3Rpdml0eS4gSW4gb3RoZXIgd29yZHMsIGRhdGEgaXMgbm90IGF2YWlsYWJsZQotICAgICAqIGJlY2F1c2UgdGhlIHBob25lIGlzIG91dCBvZiBjb3ZlcmFnZSBvciBzb21lIGxpa2UgcmVhc29uLjwvbGk+Ci0gICAgICogPC91bD4KLSAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiBkYXRhIGNvbm5lY3Rpdml0eSBpcyBwb3NzaWJsZSwge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UuCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNEYXRhQ29ubmVjdGl2aXR5UG9zc2libGUoKSB7Ci0gICAgICAgIC8vIFRPRE86IEN1cnJlbnRseSBjaGVja3MgaWYgYW55IEdQUlMgY29ubmVjdGlvbiBpcyBhY3RpdmUuIFNob3VsZCBpdCBvbmx5Ci0gICAgICAgIC8vIGNoZWNrIGZvciAiZGVmYXVsdCI/Ci0gICAgICAgIGJvb2xlYW4gbm9EYXRhID0gbURhdGFDb25uZWN0aW9uLmdldERhdGFFbmFibGVkKCkgJiYKLSAgICAgICAgICAgIGdldERhdGFDb25uZWN0aW9uU3RhdGUoKSA9PSBEYXRhU3RhdGUuRElTQ09OTkVDVEVEOwotICAgICAgICByZXR1cm4gIW5vRGF0YSAmJiBnZXRJY2NDYXJkKCkuZ2V0U3RhdGUoKSA9PSBTaW1DYXJkLlN0YXRlLlJFQURZICYmCi0gICAgICAgICAgICAgICAgZ2V0U2VydmljZVN0YXRlKCkuZ2V0U3RhdGUoKSA9PSBTZXJ2aWNlU3RhdGUuU1RBVEVfSU5fU0VSVklDRSAmJgotICAgICAgICAgICAgKG1EYXRhQ29ubmVjdGlvbi5nZXREYXRhT25Sb2FtaW5nRW5hYmxlZCgpIHx8ICFnZXRTZXJ2aWNlU3RhdGUoKS5nZXRSb2FtaW5nKCkpOwotICAgIH0KLQotICAgIC8qKgogICAgICAqIFJlbW92ZXMgdGhlIGdpdmVuIE1NSSBmcm9tIHRoZSBwZW5kaW5nIGxpc3QgYW5kIG5vdGlmaWVzCiAgICAgICogcmVnaXN0cmFudHMgdGhhdCBpdCBpcyBjb21wbGV0ZS4KICAgICAgKiBAcGFyYW0gbW1pIE1NSSB0aGF0IGlzIGRvbmUKZGlmZiAtLWdpdCBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9nc20vR3NtRGF0YUNvbm5lY3Rpb24uamF2YSBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9nc20vR3NtRGF0YUNvbm5lY3Rpb24uamF2YQppbmRleCAwOWQ0NmRkLi4xNTcyZjA5IDEwMDY0NAotLS0gYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvZ3NtL0dzbURhdGFDb25uZWN0aW9uLmphdmEKKysrIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2dzbS9Hc21EYXRhQ29ubmVjdGlvbi5qYXZhCkBAIC0xODAsOCArMTgwLDggQEAKIAogICAgIEBPdmVycmlkZQogICAgIHByb3RlY3RlZCBib29sZWFuIGlzRG5zT2soU3RyaW5nW10gZG9tYWluTmFtZVNlcnZlcnMpIHsKLSAgICAgICAgaWYgKE5VTExfSVAuZXF1YWxzKGRuc1NlcnZlcnNbMF0pICYmIE5VTExfSVAuZXF1YWxzKGRuc1NlcnZlcnNbMV0pCi0gICAgICAgICAgICAgICAgICAgICYmICEoKEdTTVBob25lKSBwaG9uZSkuaXNEbnNDaGVja0Rpc2FibGVkKCkpIHsKKyAgICAgICAgaWYgKE5VTExfSVAuZXF1YWxzKGRvbWFpbk5hbWVTZXJ2ZXJzWzBdKSAmJiBOVUxMX0lQLmVxdWFscyhkb21haW5OYW1lU2VydmVyc1sxXSkKKyAgICAgICAgICAgICAgICAmJiAhKChHU01QaG9uZSkgcGhvbmUpLmlzRG5zQ2hlY2tEaXNhYmxlZCgpKSB7CiAgICAgICAgICAgICAvLyBXb3JrIGFyb3VuZCBhIHJhY2UgY29uZGl0aW9uIHdoZXJlIFFNSSBkb2VzIG5vdCBmaWxsIGluIEROUzoKICAgICAgICAgICAgIC8vIERlYWN0aXZhdGUgUERQIGFuZCBsZXQgRGF0YUNvbm5lY3Rpb25UcmFja2VyIHJldHJ5LgogICAgICAgICAgICAgLy8gRG8gbm90IGFwcGx5IHRoZSByYWNlIGNvbmRpdGlvbiB3b3JrYXJvdW5kIGZvciBNTVMgQVBOCkBAIC0xODksNiArMTg5LDkgQEAKICAgICAgICAgICAgIC8vIE90aGVyd2lzZSwgdGhlIGRlZmF1bHQgQVBOIHdpbGwgbm90IGJlIHJlc3RvcmVkIGFueW1vcmUuCiAgICAgICAgICAgICBpZiAoIWFwbi50eXBlc1swXS5lcXVhbHMoUGhvbmUuQVBOX1RZUEVfTU1TKQogICAgICAgICAgICAgICAgIHx8ICFpc0lwQWRkcmVzcyhhcG4ubW1zUHJveHkpKSB7CisgICAgICAgICAgICAgICAgbG9nKFN0cmluZy5mb3JtYXQoCisgICAgICAgICAgICAgICAgICAgICAgICAiaXNEbnNPazogcmV0dXJuIGZhbHNlIGFwbi50eXBlc1swXT0lcyBBUE5fVFlQRV9NTVM9JXMgaXNJcEFkZHJlc3MoJXMpPSVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGFwbi50eXBlc1swXSwgUGhvbmUuQVBOX1RZUEVfTU1TLCBhcG4ubW1zUHJveHksIGlzSXBBZGRyZXNzKGFwbi5tbXNQcm94eSkpKTsKICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KZGlmZiAtLWdpdCBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9nc20vR3NtRGF0YUNvbm5lY3Rpb25UcmFja2VyLmphdmEgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvZ3NtL0dzbURhdGFDb25uZWN0aW9uVHJhY2tlci5qYXZhCmluZGV4IGU3ZDU3YmMuLmY2ODg3ZWIgMTAwNjQ0Ci0tLSBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9nc20vR3NtRGF0YUNvbm5lY3Rpb25UcmFja2VyLmphdmEKKysrIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2dzbS9Hc21EYXRhQ29ubmVjdGlvblRyYWNrZXIuamF2YQpAQCAtMjcsMTUgKzI3LDE0IEBACiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LlNoYXJlZFByZWZlcmVuY2VzOwogaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2UuQ29udGVudE9ic2VydmVyOwogaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2UuQ3Vyc29yOwotaW1wb3J0IGFuZHJvaWQubmV0LkNvbm5lY3Rpdml0eU1hbmFnZXI7CiBpbXBvcnQgYW5kcm9pZC5uZXQuSUNvbm5lY3Rpdml0eU1hbmFnZXI7CiBpbXBvcnQgYW5kcm9pZC5uZXQuTmV0d29ya0luZm87CitpbXBvcnQgYW5kcm9pZC5uZXQuUHJveHlQcm9wZXJ0aWVzOwogaW1wb3J0IGFuZHJvaWQubmV0LlRyYWZmaWNTdGF0czsKIGltcG9ydCBhbmRyb2lkLm5ldC5Vcmk7CiBpbXBvcnQgYW5kcm9pZC5uZXQud2lmaS5XaWZpTWFuYWdlcjsKIGltcG9ydCBhbmRyb2lkLm9zLkFzeW5jUmVzdWx0OwogaW1wb3J0IGFuZHJvaWQub3MuTWVzc2FnZTsKLWltcG9ydCBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbjsKIGltcG9ydCBhbmRyb2lkLm9zLlNlcnZpY2VNYW5hZ2VyOwogaW1wb3J0IGFuZHJvaWQub3MuU3lzdGVtQ2xvY2s7CiBpbXBvcnQgYW5kcm9pZC5vcy5TeXN0ZW1Qcm9wZXJ0aWVzOwpAQCAtNTgsNiArNTcsOSBAQAogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5EYXRhQ29ubmVjdGlvbi5GYWlsQ2F1c2U7CiAKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmV0LkluZXRBZGRyZXNzOworaW1wb3J0IGphdmEubmV0LkluZXRTb2NrZXRBZGRyZXNzOworaW1wb3J0IGphdmEubmV0LlVua25vd25Ib3N0RXhjZXB0aW9uOwogaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CiAKIC8qKgpAQCAtMzg4LDEyICszOTAsNiBAQAogICAgICAgICByZXR1cm4gcGRwczsKICAgICB9CiAKLSAgICBwcml2YXRlIGJvb2xlYW4gaXNEYXRhQWxsb3dlZCgpIHsKLSAgICAgICAgYm9vbGVhbiByb2FtaW5nID0gcGhvbmUuZ2V0U2VydmljZVN0YXRlKCkuZ2V0Um9hbWluZygpOwotICAgICAgICByZXR1cm4gZ2V0QW55RGF0YUVuYWJsZWQoKSAmJiAoIXJvYW1pbmcgfHwgZ2V0RGF0YU9uUm9hbWluZ0VuYWJsZWQoKSkgJiYKLSAgICAgICAgICAgICAgICBtTWFzdGVyRGF0YUVuYWJsZWQ7Ci0gICAgfQotCiAgICAgLy8qKioqKiogQ2FsbGVkIGZyb20gU2VydmljZVN0YXRlVHJhY2tlcgogICAgIC8qKgogICAgICAqIEludm9rZWQgd2hlbiBTZXJ2aWNlU3RhdGVUcmFja2VyIG9ic2VydmVzIGEgdHJhbnNpdGlvbiBmcm9tIEdQUlMKQEAgLTQwNSwxMyArNDAxLDEzIEBACiAgICAgICAgICAqIHdoZW4gR1BSUyBkZXRhY2hlcywgYnV0IHdlIHNob3VsZCBzdG9wIHRoZSBuZXR3b3JrIHBvbGxpbmcuCiAgICAgICAgICAqLwogICAgICAgICBzdG9wTmV0U3RhdFBvbGwoKTsKLSAgICAgICAgcGhvbmUubm90aWZ5RGF0YUNvbm5lY3Rpb24oUGhvbmUuUkVBU09OX0dQUlNfREVUQUNIRUQpOworICAgICAgICBub3RpZnlEYXRhQ29ubmVjdGlvbihQaG9uZS5SRUFTT05fR1BSU19ERVRBQ0hFRCk7CiAgICAgfQogCiAgICAgcHJpdmF0ZSB2b2lkIG9uR3Byc0F0dGFjaGVkKCkgewogICAgICAgICBpZiAoc3RhdGUgPT0gU3RhdGUuQ09OTkVDVEVEKSB7CiAgICAgICAgICAgICBzdGFydE5ldFN0YXRQb2xsKCk7Ci0gICAgICAgICAgICBwaG9uZS5ub3RpZnlEYXRhQ29ubmVjdGlvbihQaG9uZS5SRUFTT05fR1BSU19BVFRBQ0hFRCk7CisgICAgICAgICAgICBub3RpZnlEYXRhQ29ubmVjdGlvbihQaG9uZS5SRUFTT05fR1BSU19BVFRBQ0hFRCk7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBpZiAoc3RhdGUgPT0gU3RhdGUuRkFJTEVEKSB7CiAgICAgICAgICAgICAgICAgY2xlYW5VcENvbm5lY3Rpb24oZmFsc2UsIFBob25lLlJFQVNPTl9HUFJTX0FUVEFDSEVEKTsKQEAgLTQyMSw2ICs0MTcsMzUgQEAKICAgICAgICAgfQogICAgIH0KIAorICAgIHByb3RlY3RlZCBib29sZWFuIGlzRGF0YUFsbG93ZWQoKSB7CisgICAgICAgIGludCBncHJzU3RhdGUgPSBtR3NtUGhvbmUubVNTVC5nZXRDdXJyZW50R3Byc1N0YXRlKCk7CisgICAgICAgIGJvb2xlYW4gZGVzaXJlZFBvd2VyU3RhdGUgPSBtR3NtUGhvbmUubVNTVC5nZXREZXNpcmVkUG93ZXJTdGF0ZSgpOworCisgICAgICAgIGJvb2xlYW4gYWxsb3dlZCA9ICgoZ3Byc1N0YXRlID09IFNlcnZpY2VTdGF0ZS5TVEFURV9JTl9TRVJWSUNFIHx8IG5vQXV0b0F0dGFjaCkgJiYKKyAgICAgICAgICAgICAgICBtR3NtUGhvbmUubVNJTVJlY29yZHMuZ2V0UmVjb3Jkc0xvYWRlZCgpICYmCisgICAgICAgICAgICAgICAgcGhvbmUuZ2V0U3RhdGUoKSA9PSBQaG9uZS5TdGF0ZS5JRExFICYmCisgICAgICAgICAgICAgICAgbU1hc3RlckRhdGFFbmFibGVkICYmCisgICAgICAgICAgICAgICAgKCFwaG9uZS5nZXRTZXJ2aWNlU3RhdGUoKS5nZXRSb2FtaW5nKCkgfHwgZ2V0RGF0YU9uUm9hbWluZ0VuYWJsZWQoKSkgJiYKKyAgICAgICAgICAgICAgICAhbUlzUHNSZXN0cmljdGVkICYmCisgICAgICAgICAgICAgICAgZGVzaXJlZFBvd2VyU3RhdGUpOworICAgICAgICBpZiAoIWFsbG93ZWQgJiYgREJHKSB7CisgICAgICAgICAgICBTdHJpbmcgcmVhc29uID0gIiI7CisgICAgICAgICAgICBpZiAoZ3Byc1N0YXRlICE9IFNlcnZpY2VTdGF0ZS5TVEFURV9JTl9TRVJWSUNFKSByZWFzb24gKz0gIiAtIGdwcnM9ICIgKyBncHJzU3RhdGU7CisgICAgICAgICAgICBpZiAoIW1Hc21QaG9uZS5tU0lNUmVjb3Jkcy5nZXRSZWNvcmRzTG9hZGVkKCkpIHJlYXNvbiArPSAiIC0gU0lNIG5vdCBsb2FkZWQiOworICAgICAgICAgICAgaWYgKHBob25lLmdldFN0YXRlKCkgIT0gUGhvbmUuU3RhdGUuSURMRSkgeworICAgICAgICAgICAgICAgIHJlYXNvbiArPSAiIC0gUGhvbmVTdGF0ZT0gIiArIHBob25lLmdldFN0YXRlKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIW1NYXN0ZXJEYXRhRW5hYmxlZCkgcmVhc29uICs9ICIgLSBtTWFzdGVyRGF0YUVuYWJsZWQ9IGZhbHNlIjsKKyAgICAgICAgICAgIGlmIChwaG9uZS5nZXRTZXJ2aWNlU3RhdGUoKS5nZXRSb2FtaW5nKCkgJiYgZ2V0RGF0YU9uUm9hbWluZ0VuYWJsZWQoKSkgeworICAgICAgICAgICAgICAgIHJlYXNvbiArPSAiIC0gUm9hbWluZyI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobUlzUHNSZXN0cmljdGVkKSByZWFzb24gKz0gIiAtIG1Jc1BzUmVzdHJpY3RlZD0gdHJ1ZSI7CisgICAgICAgICAgICBpZiAoIWRlc2lyZWRQb3dlclN0YXRlKSByZWFzb24gKz0gIiAtIGRlc2lyZWRQb3dlclN0YXRlPSBmYWxzZSI7CisgICAgICAgICAgICBsb2coIkRhdGEgbm90IGFsbG93ZWQgZHVlIHRvIiArIHJlYXNvbik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGFsbG93ZWQ7CisgICAgfQorCiAgICAgcHJpdmF0ZSBib29sZWFuIHRyeVNldHVwRGF0YShTdHJpbmcgcmVhc29uKSB7CiAgICAgICAgIGlmIChEQkcpIGxvZygiKioqdHJ5U2V0dXBEYXRhIGR1ZSB0byAiICsgKHJlYXNvbiA9PSBudWxsID8gIih1bnNwZWNpZmllZCkiIDogcmVhc29uKSk7CiAKQEAgLTQzMCw3ICs0NTUsNyBAQAogICAgICAgICAgICAgLy8gQXNzdW1lIGRhdGEgaXMgY29ubmVjdGVkIG9uIHRoZSBzaW11bGF0b3IKICAgICAgICAgICAgIC8vIEZJWE1FICB0aGlzIGNhbiBiZSBpbXByb3ZlZAogICAgICAgICAgICAgc2V0U3RhdGUoU3RhdGUuQ09OTkVDVEVEKTsKLSAgICAgICAgICAgIHBob25lLm5vdGlmeURhdGFDb25uZWN0aW9uKHJlYXNvbik7CisgICAgICAgICAgICBub3RpZnlEYXRhQ29ubmVjdGlvbihyZWFzb24pOwogCiAgICAgICAgICAgICBMb2cuaShMT0dfVEFHLCAiKGZpeD8pIFdlJ3JlIG9uIHRoZSBzaW11bGF0b3I7IGFzc3VtaW5nIGRhdGEgaXMgY29ubmVjdGVkIik7CiAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKQEAgLTQzOSwxOSArNDY0LDE1IEBACiAgICAgICAgIGludCBncHJzU3RhdGUgPSBtR3NtUGhvbmUubVNTVC5nZXRDdXJyZW50R3Byc1N0YXRlKCk7CiAgICAgICAgIGJvb2xlYW4gZGVzaXJlZFBvd2VyU3RhdGUgPSBtR3NtUGhvbmUubVNTVC5nZXREZXNpcmVkUG93ZXJTdGF0ZSgpOwogCi0gICAgICAgIGlmICgoc3RhdGUgPT0gU3RhdGUuSURMRSB8fCBzdGF0ZSA9PSBTdGF0ZS5TQ0FOTklORykKLSAgICAgICAgICAgICAgICAmJiAoZ3Byc1N0YXRlID09IFNlcnZpY2VTdGF0ZS5TVEFURV9JTl9TRVJWSUNFIHx8IG5vQXV0b0F0dGFjaCkKLSAgICAgICAgICAgICAgICAmJiBtR3NtUGhvbmUubVNJTVJlY29yZHMuZ2V0UmVjb3Jkc0xvYWRlZCgpCi0gICAgICAgICAgICAgICAgJiYgcGhvbmUuZ2V0U3RhdGUoKSA9PSBQaG9uZS5TdGF0ZS5JRExFCi0gICAgICAgICAgICAgICAgJiYgaXNEYXRhQWxsb3dlZCgpCi0gICAgICAgICAgICAgICAgJiYgIW1Jc1BzUmVzdHJpY3RlZAotICAgICAgICAgICAgICAgICYmIGRlc2lyZWRQb3dlclN0YXRlICkgeworICAgICAgICBpZiAoKChzdGF0ZSA9PSBTdGF0ZS5JRExFKSB8fCAoc3RhdGUgPT0gU3RhdGUuU0NBTk5JTkcpKSAmJgorICAgICAgICAgICAgICAgIGlzRGF0YUFsbG93ZWQoKSAmJiBnZXRBbnlEYXRhRW5hYmxlZCgpKSB7CiAKICAgICAgICAgICAgIGlmIChzdGF0ZSA9PSBTdGF0ZS5JRExFKSB7CiAgICAgICAgICAgICAgICAgd2FpdGluZ0FwbnMgPSBidWlsZFdhaXRpbmdBcG5zKCk7CiAgICAgICAgICAgICAgICAgaWYgKHdhaXRpbmdBcG5zLmlzRW1wdHkoKSkgewogICAgICAgICAgICAgICAgICAgICBpZiAoREJHKSBsb2coIk5vIEFQTiBmb3VuZCIpOwogICAgICAgICAgICAgICAgICAgICBub3RpZnlOb0RhdGEoR3NtRGF0YUNvbm5lY3Rpb24uRmFpbENhdXNlLk1JU1NJTkdfVU5LTk9XTl9BUE4pOworICAgICAgICAgICAgICAgICAgICBub3RpZnlPZmZBcG5zT2ZBdmFpbGFiaWxpdHkocmVhc29uLCBmYWxzZSk7CiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICBsb2cgKCJDcmVhdGUgZnJvbSBhbGxBcG5zIDogIiArIGFwbkxpc3RUb1N0cmluZyhhbGxBcG5zKSk7CkBAIC00NjEsMjIgKzQ4MiwxMSBAQAogICAgICAgICAgICAgaWYgKERCRykgewogICAgICAgICAgICAgICAgIGxvZyAoIlNldHVwIHdhaXRuZ0FwbnMgOiAiICsgYXBuTGlzdFRvU3RyaW5nKHdhaXRpbmdBcG5zKSk7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gc2V0dXBEYXRhKHJlYXNvbik7CisgICAgICAgICAgICBib29sZWFuIHJldFZhbHVlID0gc2V0dXBEYXRhKHJlYXNvbik7CisgICAgICAgICAgICBub3RpZnlPZmZBcG5zT2ZBdmFpbGFiaWxpdHkocmVhc29uLCByZXRWYWx1ZSk7CisgICAgICAgICAgICByZXR1cm4gcmV0VmFsdWU7CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpZiAoREJHKQotICAgICAgICAgICAgICAgIGxvZygidHJ5U2V0dXBEYXRhOiBOb3QgcmVhZHkgZm9yIGRhdGE6ICIgKwotICAgICAgICAgICAgICAgICAgICAiIGRhdGFTdGF0ZT0iICsgc3RhdGUgKwotICAgICAgICAgICAgICAgICAgICAiIGdwcnNTdGF0ZT0iICsgZ3Byc1N0YXRlICsKLSAgICAgICAgICAgICAgICAgICAgIiBzaW09IiArIG1Hc21QaG9uZS5tU0lNUmVjb3Jkcy5nZXRSZWNvcmRzTG9hZGVkKCkgKwotICAgICAgICAgICAgICAgICAgICAiIFVNVFM9IiArIG1Hc21QaG9uZS5tU1NULmlzQ29uY3VycmVudFZvaWNlQW5kRGF0YSgpICsKLSAgICAgICAgICAgICAgICAgICAgIiBwaG9uZVN0YXRlPSIgKyBwaG9uZS5nZXRTdGF0ZSgpICsKLSAgICAgICAgICAgICAgICAgICAgIiBpc0RhdGFBbGxvd2VkPSIgKyBpc0RhdGFBbGxvd2VkKCkgKwotICAgICAgICAgICAgICAgICAgICAiIGRhdGFFbmFibGVkPSIgKyBnZXRBbnlEYXRhRW5hYmxlZCgpICsKLSAgICAgICAgICAgICAgICAgICAgIiByb2FtaW5nPSIgKyBwaG9uZS5nZXRTZXJ2aWNlU3RhdGUoKS5nZXRSb2FtaW5nKCkgKwotICAgICAgICAgICAgICAgICAgICAiIGRhdGFPblJvYW1pbmdFbmFibGU9IiArIGdldERhdGFPblJvYW1pbmdFbmFibGVkKCkgKwotICAgICAgICAgICAgICAgICAgICAiIHBzIHJlc3RyaWN0ZWQ9IiArIG1Jc1BzUmVzdHJpY3RlZCArCi0gICAgICAgICAgICAgICAgICAgICIgZGVzaXJlZFBvd2VyU3RhdGU9IiArIGRlc2lyZWRQb3dlclN0YXRlICsKLSAgICAgICAgICAgICAgICAgICAgIiBNYXN0ZXJEYXRhRW5hYmxlZD0iICsgbU1hc3RlckRhdGFFbmFibGVkKTsKKyAgICAgICAgICAgIG5vdGlmeU9mZkFwbnNPZkF2YWlsYWJpbGl0eShyZWFzb24sIGZhbHNlKTsKICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfQogICAgIH0KQEAgLTU5NSw0NiArNjA1LDEwIEBACiAgICAgICAgIHBkcC5jb25uZWN0KG1zZywgYXBuKTsKIAogICAgICAgICBzZXRTdGF0ZShTdGF0ZS5JTklUSU5HKTsKLSAgICAgICAgcGhvbmUubm90aWZ5RGF0YUNvbm5lY3Rpb24ocmVhc29uKTsKKyAgICAgICAgbm90aWZ5RGF0YUNvbm5lY3Rpb24ocmVhc29uKTsKICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQogCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRJbnRlcmZhY2VOYW1lKFN0cmluZyBhcG5UeXBlKSB7Ci0gICAgICAgIGlmIChtQWN0aXZlUGRwICE9IG51bGwgJiYKLSAgICAgICAgICAgICAgICAoYXBuVHlwZSA9PSBudWxsIHx8Ci0gICAgICAgICAgICAgICAgKG1BY3RpdmVBcG4gIT0gbnVsbCAmJiBtQWN0aXZlQXBuLmNhbkhhbmRsZVR5cGUoYXBuVHlwZSkpKSkgewotICAgICAgICAgICAgcmV0dXJuIG1BY3RpdmVQZHAuZ2V0SW50ZXJmYWNlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRJcEFkZHJlc3MoU3RyaW5nIGFwblR5cGUpIHsKLSAgICAgICAgaWYgKG1BY3RpdmVQZHAgIT0gbnVsbCAmJgotICAgICAgICAgICAgICAgIChhcG5UeXBlID09IG51bGwgfHwKLSAgICAgICAgICAgICAgICAobUFjdGl2ZUFwbiAhPSBudWxsICYmIG1BY3RpdmVBcG4uY2FuSGFuZGxlVHlwZShhcG5UeXBlKSkpKSB7Ci0gICAgICAgICAgICByZXR1cm4gbUFjdGl2ZVBkcC5nZXRJcEFkZHJlc3MoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEdhdGV3YXkoU3RyaW5nIGFwblR5cGUpIHsKLSAgICAgICAgaWYgKG1BY3RpdmVQZHAgIT0gbnVsbCAmJgotICAgICAgICAgICAgICAgIChhcG5UeXBlID09IG51bGwgfHwKLSAgICAgICAgICAgICAgICAobUFjdGl2ZUFwbiAhPSBudWxsICYmIG1BY3RpdmVBcG4uY2FuSGFuZGxlVHlwZShhcG5UeXBlKSkpKSB7Ci0gICAgICAgICAgICByZXR1cm4gbUFjdGl2ZVBkcC5nZXRHYXRld2F5QWRkcmVzcygpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBTdHJpbmdbXSBnZXREbnNTZXJ2ZXJzKFN0cmluZyBhcG5UeXBlKSB7Ci0gICAgICAgIGlmIChtQWN0aXZlUGRwICE9IG51bGwgJiYKLSAgICAgICAgICAgICAgICAoYXBuVHlwZSA9PSBudWxsIHx8Ci0gICAgICAgICAgICAgICAgKG1BY3RpdmVBcG4gIT0gbnVsbCAmJiBtQWN0aXZlQXBuLmNhbkhhbmRsZVR5cGUoYXBuVHlwZSkpKSkgewotICAgICAgICAgICAgcmV0dXJuIG1BY3RpdmVQZHAuZ2V0RG5zU2VydmVycygpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQogICAgIHByaXZhdGUgYm9vbGVhbgogICAgIHBkcFN0YXRlc0hhc0NJRCAoQXJyYXlMaXN0PERhdGFDYWxsU3RhdGU+IHN0YXRlcywgaW50IGNpZCkgewogICAgICAgICBmb3IgKGludCBpID0gMCwgcyA9IHN0YXRlcy5zaXplKCkgOyBpIDwgcyA7IGkrKykgewpAQCAtNzQ2LDcgKzcyMCw3IEBACiAKICAgICBwcml2YXRlIHZvaWQgbm90aWZ5RGVmYXVsdERhdGEoU3RyaW5nIHJlYXNvbikgewogICAgICAgICBzZXRTdGF0ZShTdGF0ZS5DT05ORUNURUQpOwotICAgICAgICBwaG9uZS5ub3RpZnlEYXRhQ29ubmVjdGlvbihyZWFzb24pOworICAgICAgICBub3RpZnlEYXRhQ29ubmVjdGlvbihyZWFzb24pOwogICAgICAgICBzdGFydE5ldFN0YXRQb2xsKCk7CiAgICAgICAgIC8vIHJlc2V0IHJlY29ubmVjdCB0aW1lcgogICAgICAgICBtUmV0cnlNZ3IucmVzZXRSZXRyeUNvdW50KCk7CkBAIC03NTYsNyArNzMwLDcgQEAKICAgICBwcml2YXRlIHZvaWQgZ290b0lkbGVBbmROb3RpZnlEYXRhQ29ubmVjdGlvbihTdHJpbmcgcmVhc29uKSB7CiAgICAgICAgIGlmIChEQkcpIGxvZygiZ290b0lkbGVBbmROb3RpZnlEYXRhQ29ubmVjdGlvbjogcmVhc29uPSIgKyByZWFzb24pOwogICAgICAgICBzZXRTdGF0ZShTdGF0ZS5JRExFKTsKLSAgICAgICAgcGhvbmUubm90aWZ5RGF0YUNvbm5lY3Rpb24ocmVhc29uKTsKKyAgICAgICAgbm90aWZ5RGF0YUNvbm5lY3Rpb24ocmVhc29uKTsKICAgICAgICAgbUFjdGl2ZUFwbiA9IG51bGw7CiAgICAgfQogCkBAIC05OTgsNyArOTcyLDcgQEAKICAgICAgICAgICAgIGlmICghbVJldHJ5TWdyLmlzUmV0cnlOZWVkZWQoKSkgewogICAgICAgICAgICAgICAgIGlmICghbVJlcXVlc3RlZEFwblR5cGUuZXF1YWxzKFBob25lLkFQTl9UWVBFX0RFRkFVTFQpKSB7CiAgICAgICAgICAgICAgICAgICAgIC8vIGlmIG5vIG1vcmUgcmV0cmllcyBvbiBhIHNlY29uZGFyeSBBUE4gYXR0ZW1wdCwgdGVsbCB0aGUgd29ybGQgYW5kIHJldmVydC4KLSAgICAgICAgICAgICAgICAgICAgcGhvbmUubm90aWZ5RGF0YUNvbm5lY3Rpb24oUGhvbmUuUkVBU09OX0FQTl9GQUlMRUQpOworICAgICAgICAgICAgICAgICAgICBub3RpZnlEYXRhQ29ubmVjdGlvbihQaG9uZS5SRUFTT05fQVBOX0ZBSUxFRCk7CiAgICAgICAgICAgICAgICAgICAgIG9uRW5hYmxlQXBuKGFwblR5cGVUb0lkKG1SZXF1ZXN0ZWRBcG5UeXBlKSwgRElTQUJMRUQpOwogICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgfQpAQCAtMTA5MSw3ICsxMDY1LDcgQEAKICAgICAgICAgICAgIC8vIEFzc3VtZSBkYXRhIGlzIGNvbm5lY3RlZCBvbiB0aGUgc2ltdWxhdG9yCiAgICAgICAgICAgICAvLyBGSVhNRSAgdGhpcyBjYW4gYmUgaW1wcm92ZWQKICAgICAgICAgICAgIHNldFN0YXRlKFN0YXRlLkNPTk5FQ1RFRCk7Ci0gICAgICAgICAgICBwaG9uZS5ub3RpZnlEYXRhQ29ubmVjdGlvbihudWxsKTsKKyAgICAgICAgICAgIG5vdGlmeURhdGFDb25uZWN0aW9uKG51bGwpOwogCiAgICAgICAgICAgICBMb2cuaShMT0dfVEFHLCAiV2UncmUgb24gdGhlIHNpbXVsYXRvcjsgYXNzdW1pbmcgZGF0YSBpcyBjb25uZWN0ZWQiKTsKICAgICAgICAgfQpAQCAtMTEyNSw2ICsxMDk5LDI1IEBACiAgICAgICAgIH0KIAogICAgICAgICBpZiAoYXIuZXhjZXB0aW9uID09IG51bGwpIHsKKyAgICAgICAgICAgIG1MaW5rUHJvcGVydGllcyA9IGdldExpbmtQcm9wZXJ0aWVzKG1BY3RpdmVQZHApOworCisgICAgICAgICAgICBBcG5TZXR0aW5nIGFwbiA9IG1BY3RpdmVQZHAuZ2V0QXBuKCk7CisgICAgICAgICAgICBpZiAoYXBuLnByb3h5ICE9IG51bGwgJiYgYXBuLnByb3h5Lmxlbmd0aCgpICE9IDApIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBQcm94eVByb3BlcnRpZXMgcHJveHkgPSBuZXcgUHJveHlQcm9wZXJ0aWVzKCk7CisgICAgICAgICAgICAgICAgICAgIHByb3h5LnNldFNvY2tldEFkZHJlc3MobmV3IEluZXRTb2NrZXRBZGRyZXNzKEluZXRBZGRyZXNzLmdldEJ5TmFtZShhcG4ucHJveHkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEludGVnZXIucGFyc2VJbnQoYXBuLnBvcnQpKSk7CisgICAgICAgICAgICAgICAgICAgIG1MaW5rUHJvcGVydGllcy5zZXRIdHRwUHJveHkocHJveHkpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFVua25vd25Ib3N0RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgTG9nLmUoTE9HX1RBRywgIlVua25vd25Ib3N0RXhjZXB0aW9uIG1ha2luZyBQcm94eVByb3BlcnRpZXM6ICIgKyBlKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChTZWN1cml0eUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIExvZy5lKExPR19UQUcsICJTZWN1cml0eUV4Y2VwdGlvbiBtYWtpbmcgUHJveHlQcm9wZXJ0aWVzOiAiICsgZSk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgTG9nLmUoTE9HX1RBRywgIk51bWJlckZvcm1hdEV4Y2VwdGlvbiBtYWtpbmcgUHJveHlQcm9wZXJ0aWVzICgiICsgYXBuLnBvcnQgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICIpOiAiICsgZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCiAgICAgICAgICAgICAvLyBldmVyeXRoaW5nIGlzIHNldHVwCiAgICAgICAgICAgICBpZiAoaXNBcG5UeXBlQWN0aXZlKFBob25lLkFQTl9UWVBFX0RFRkFVTFQpKSB7CiAgICAgICAgICAgICAgICAgU3lzdGVtUHJvcGVydGllcy5zZXQoImdzbS5kZWZhdWx0cGRwY29udGV4dC5hY3RpdmUiLCAidHJ1ZSIpOwpAQCAtMTE1Nyw3ICsxMTUwLDcgQEAKICAgICAgICAgICAgIC8vIE5vIHRyeSBmb3IgcGVybWFuZW50IGZhaWx1cmUKICAgICAgICAgICAgIGlmIChjYXVzZS5pc1Blcm1hbmVudEZhaWwoKSkgewogICAgICAgICAgICAgICAgIG5vdGlmeU5vRGF0YShjYXVzZSk7Ci0gICAgICAgICAgICAgICAgcGhvbmUubm90aWZ5RGF0YUNvbm5lY3Rpb24oUGhvbmUuUkVBU09OX0FQTl9GQUlMRUQpOworICAgICAgICAgICAgICAgIG5vdGlmeURhdGFDb25uZWN0aW9uKFBob25lLlJFQVNPTl9BUE5fRkFJTEVEKTsKICAgICAgICAgICAgICAgICBvbkVuYWJsZUFwbihhcG5UeXBlVG9JZChtUmVxdWVzdGVkQXBuVHlwZSksIERJU0FCTEVEKTsKICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICB9CkBAIC0xMTg2LDcgKzExNzksNyBAQAogICAgICAgICAgICByZWFzb24gPSAoU3RyaW5nKSBhci51c2VyT2JqOwogICAgICAgICB9CiAgICAgICAgIHNldFN0YXRlKFN0YXRlLklETEUpOwotICAgICAgICBwaG9uZS5ub3RpZnlEYXRhQ29ubmVjdGlvbihyZWFzb24pOworICAgICAgICBub3RpZnlEYXRhQ29ubmVjdGlvbihyZWFzb24pOwogICAgICAgICBtQWN0aXZlQXBuID0gbnVsbDsKICAgICAgICAgaWYgKHJldHJ5QWZ0ZXJEaXNjb25uZWN0ZWQocmVhc29uKSkgewogICAgICAgICAgICAgdHJ5U2V0dXBEYXRhKHJlYXNvbik7CkBAIC0xMjE3LDcgKzEyMTAsNyBAQAogICAgIHByb3RlY3RlZCB2b2lkIG9uVm9pY2VDYWxsU3RhcnRlZCgpIHsKICAgICAgICAgaWYgKHN0YXRlID09IFN0YXRlLkNPTk5FQ1RFRCAmJiAhIG1Hc21QaG9uZS5tU1NULmlzQ29uY3VycmVudFZvaWNlQW5kRGF0YSgpKSB7CiAgICAgICAgICAgICBzdG9wTmV0U3RhdFBvbGwoKTsKLSAgICAgICAgICAgIHBob25lLm5vdGlmeURhdGFDb25uZWN0aW9uKFBob25lLlJFQVNPTl9WT0lDRV9DQUxMX1NUQVJURUQpOworICAgICAgICAgICAgbm90aWZ5RGF0YUNvbm5lY3Rpb24oUGhvbmUuUkVBU09OX1ZPSUNFX0NBTExfU1RBUlRFRCk7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTEyMjUsNyArMTIxOCw3IEBACiAgICAgICAgIGlmIChzdGF0ZSA9PSBTdGF0ZS5DT05ORUNURUQpIHsKICAgICAgICAgICAgIGlmICghbUdzbVBob25lLm1TU1QuaXNDb25jdXJyZW50Vm9pY2VBbmREYXRhKCkpIHsKICAgICAgICAgICAgICAgICBzdGFydE5ldFN0YXRQb2xsKCk7Ci0gICAgICAgICAgICAgICAgcGhvbmUubm90aWZ5RGF0YUNvbm5lY3Rpb24oUGhvbmUuUkVBU09OX1ZPSUNFX0NBTExfRU5ERUQpOworICAgICAgICAgICAgICAgIG5vdGlmeURhdGFDb25uZWN0aW9uKFBob25lLlJFQVNPTl9WT0lDRV9DQUxMX0VOREVEKTsKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgLy8gY2xlYW4gc2xhdGUgYWZ0ZXIgY2FsbCBlbmQuCiAgICAgICAgICAgICAgICAgcmVzZXRQb2xsU3RhdHMoKTsKZGlmZiAtLWdpdCBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9nc20vR3NtU01TRGlzcGF0Y2hlci5qYXZhIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2dzbS9Hc21TTVNEaXNwYXRjaGVyLmphdmEKaW5kZXggMzA3OWE2NC4uZWQ3MDY2YiAxMDA2NDQKLS0tIGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2dzbS9Hc21TTVNEaXNwYXRjaGVyLmphdmEKKysrIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2dzbS9Hc21TTVNEaXNwYXRjaGVyLmphdmEKQEAgLTU2LDYgKzU2LDcgQEAKICAgICAgKiBAcGFyYW0gYXIgQXN5bmNSZXN1bHQgcGFzc2VkIGludG8gdGhlIG1lc3NhZ2UgaGFuZGxlci4gIGFyLnJlc3VsdCBzaG91bGQKICAgICAgKiAgICAgICAgICAgYmUgYSBTdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBzdGF0dXMgcmVwb3J0IFBEVSwgYXMgQVNDSUkgaGV4LgogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHByb3RlY3RlZCB2b2lkIGhhbmRsZVN0YXR1c1JlcG9ydChBc3luY1Jlc3VsdCBhcikgewogICAgICAgICBTdHJpbmcgcGR1U3RyaW5nID0gKFN0cmluZykgYXIucmVzdWx0OwogICAgICAgICBTbXNNZXNzYWdlIHNtcyA9IFNtc01lc3NhZ2UubmV3RnJvbUNEUyhwZHVTdHJpbmcpOwpAQCAtODQsNiArODUsNyBAQAogCiAKICAgICAvKioge0Bpbmhlcml0RG9jfSAqLworICAgIEBPdmVycmlkZQogICAgIHByb3RlY3RlZCBpbnQgZGlzcGF0Y2hNZXNzYWdlKFNtc01lc3NhZ2VCYXNlIHNtc2IpIHsKIAogICAgICAgICAvLyBJZiBzbXMgaXMgbnVsbCwgbWVhbnMgdGhlcmUgd2FzIGEgcGFyc2luZyBlcnJvci4KQEAgLTE1MSw2ICsxNTMsNyBAQAogICAgIH0KIAogICAgIC8qKiB7QGluaGVyaXREb2N9ICovCisgICAgQE92ZXJyaWRlCiAgICAgcHJvdGVjdGVkIHZvaWQgc2VuZERhdGEoU3RyaW5nIGRlc3RBZGRyLCBTdHJpbmcgc2NBZGRyLCBpbnQgZGVzdFBvcnQsCiAgICAgICAgICAgICBieXRlW10gZGF0YSwgUGVuZGluZ0ludGVudCBzZW50SW50ZW50LCBQZW5kaW5nSW50ZW50IGRlbGl2ZXJ5SW50ZW50KSB7CiAgICAgICAgIFNtc01lc3NhZ2UuU3VibWl0UGR1IHBkdSA9IFNtc01lc3NhZ2UuZ2V0U3VibWl0UGR1KApAQCAtMTU5LDYgKzE2Miw3IEBACiAgICAgfQogCiAgICAgLyoqIHtAaW5oZXJpdERvY30gKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwcm90ZWN0ZWQgdm9pZCBzZW5kVGV4dChTdHJpbmcgZGVzdEFkZHIsIFN0cmluZyBzY0FkZHIsIFN0cmluZyB0ZXh0LAogICAgICAgICAgICAgUGVuZGluZ0ludGVudCBzZW50SW50ZW50LCBQZW5kaW5nSW50ZW50IGRlbGl2ZXJ5SW50ZW50KSB7CiAgICAgICAgIFNtc01lc3NhZ2UuU3VibWl0UGR1IHBkdSA9IFNtc01lc3NhZ2UuZ2V0U3VibWl0UGR1KApAQCAtMTY3LDYgKzE3MSw3IEBACiAgICAgfQogCiAgICAgLyoqIHtAaW5oZXJpdERvY30gKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwcm90ZWN0ZWQgdm9pZCBzZW5kTXVsdGlwYXJ0VGV4dChTdHJpbmcgZGVzdGluYXRpb25BZGRyZXNzLCBTdHJpbmcgc2NBZGRyZXNzLAogICAgICAgICAgICAgQXJyYXlMaXN0PFN0cmluZz4gcGFydHMsIEFycmF5TGlzdDxQZW5kaW5nSW50ZW50PiBzZW50SW50ZW50cywKICAgICAgICAgICAgIEFycmF5TGlzdDxQZW5kaW5nSW50ZW50PiBkZWxpdmVyeUludGVudHMpIHsKQEAgLTMwNiw4ICszMTEsOSBAQAogICAgIH0KIAogICAgIC8qKiB7QGluaGVyaXREb2N9ICovCisgICAgQE92ZXJyaWRlCiAgICAgcHJvdGVjdGVkIHZvaWQgc2VuZFNtcyhTbXNUcmFja2VyIHRyYWNrZXIpIHsKLSAgICAgICAgSGFzaE1hcCBtYXAgPSB0cmFja2VyLm1EYXRhOworICAgICAgICBIYXNoTWFwPFN0cmluZywgT2JqZWN0PiBtYXAgPSB0cmFja2VyLm1EYXRhOwogCiAgICAgICAgIGJ5dGUgc21zY1tdID0gKGJ5dGVbXSkgbWFwLmdldCgic21zYyIpOwogICAgICAgICBieXRlIHBkdVtdID0gKGJ5dGVbXSkgbWFwLmdldCgicGR1Iik7CkBAIC0zMjIsMTIgKzMyOCwxMyBAQAogICAgICAqCiAgICAgICogQHBhcmFtIHRyYWNrZXIgaG9sZHMgdGhlIG11bHRpcGFydCBTbXMgdHJhY2tlciByZWFkeSB0byBiZSBzZW50CiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHJvdGVjdGVkIHZvaWQgc2VuZE11bHRpcGFydFNtcyAoU21zVHJhY2tlciB0cmFja2VyKSB7CiAgICAgICAgIEFycmF5TGlzdDxTdHJpbmc+IHBhcnRzOwogICAgICAgICBBcnJheUxpc3Q8UGVuZGluZ0ludGVudD4gc2VudEludGVudHM7CiAgICAgICAgIEFycmF5TGlzdDxQZW5kaW5nSW50ZW50PiBkZWxpdmVyeUludGVudHM7CiAKLSAgICAgICAgSGFzaE1hcCBtYXAgPSB0cmFja2VyLm1EYXRhOworICAgICAgICBIYXNoTWFwPFN0cmluZywgT2JqZWN0PiBtYXAgPSB0cmFja2VyLm1EYXRhOwogCiAgICAgICAgIFN0cmluZyBkZXN0aW5hdGlvbkFkZHJlc3MgPSAoU3RyaW5nKSBtYXAuZ2V0KCJkZXN0aW5hdGlvbiIpOwogICAgICAgICBTdHJpbmcgc2NBZGRyZXNzID0gKFN0cmluZykgbWFwLmdldCgic2NhZGRyZXNzIik7CkBAIC0zNDIsNiArMzQ5LDcgQEAKICAgICB9CiAKICAgICAvKioge0Bpbmhlcml0RG9jfSAqLworICAgIEBPdmVycmlkZQogICAgIHByb3RlY3RlZCB2b2lkIGFja25vd2xlZGdlTGFzdEluY29taW5nU21zKGJvb2xlYW4gc3VjY2VzcywgaW50IHJlc3VsdCwgTWVzc2FnZSByZXNwb25zZSl7CiAgICAgICAgIC8vIEZJWE1FIHVuaXQgdGVzdCBsZWF2ZXMgY20gPT0gbnVsbC4gdGhpcyBzaG91bGQgY2hhbmdlCiAgICAgICAgIGlmIChtQ20gIT0gbnVsbCkgewpAQCAtMzUwLDYgKzM1OCw3IEBACiAgICAgfQogCiAgICAgLyoqIHtAaW5oZXJpdERvY30gKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwcm90ZWN0ZWQgdm9pZCBhY3RpdmF0ZUNlbGxCcm9hZGNhc3RTbXMoaW50IGFjdGl2YXRlLCBNZXNzYWdlIHJlc3BvbnNlKSB7CiAgICAgICAgIC8vIFVubGVzcyBDQlMgaXMgaW1wbGVtZW50ZWQgZm9yIEdTTSwgdGhpcyBwb2ludCBzaG91bGQgYmUgdW5yZWFjaGFibGUuCiAgICAgICAgIExvZy5lKFRBRywgIkVycm9yISBUaGUgZnVuY3Rpb25hbGl0eSBjZWxsIGJyb2FkY2FzdCBzbXMgaXMgbm90IGltcGxlbWVudGVkIGZvciBHU00uIik7CkBAIC0zNTcsNiArMzY2LDcgQEAKICAgICB9CiAKICAgICAvKioge0Bpbmhlcml0RG9jfSAqLworICAgIEBPdmVycmlkZQogICAgIHByb3RlY3RlZCB2b2lkIGdldENlbGxCcm9hZGNhc3RTbXNDb25maWcoTWVzc2FnZSByZXNwb25zZSl7CiAgICAgICAgIC8vIFVubGVzcyBDQlMgaXMgaW1wbGVtZW50ZWQgZm9yIEdTTSwgdGhpcyBwb2ludCBzaG91bGQgYmUgdW5yZWFjaGFibGUuCiAgICAgICAgIExvZy5lKFRBRywgIkVycm9yISBUaGUgZnVuY3Rpb25hbGl0eSBjZWxsIGJyb2FkY2FzdCBzbXMgaXMgbm90IGltcGxlbWVudGVkIGZvciBHU00uIik7CkBAIC0zNjQsNiArMzc0LDcgQEAKICAgICB9CiAKICAgICAvKioge0Bpbmhlcml0RG9jfSAqLworICAgIEBPdmVycmlkZQogICAgIHByb3RlY3RlZCAgdm9pZCBzZXRDZWxsQnJvYWRjYXN0Q29uZmlnKGludFtdIGNvbmZpZ1ZhbHVlc0FycmF5LCBNZXNzYWdlIHJlc3BvbnNlKSB7CiAgICAgICAgIC8vIFVubGVzcyBDQlMgaXMgaW1wbGVtZW50ZWQgZm9yIEdTTSwgdGhpcyBwb2ludCBzaG91bGQgYmUgdW5yZWFjaGFibGUuCiAgICAgICAgIExvZy5lKFRBRywgIkVycm9yISBUaGUgZnVuY3Rpb25hbGl0eSBjZWxsIGJyb2FkY2FzdCBzbXMgaXMgbm90IGltcGxlbWVudGVkIGZvciBHU00uIik7CmRpZmYgLS1naXQgYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvZ3NtL0dzbVNlcnZpY2VTdGF0ZVRyYWNrZXIuamF2YSBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9nc20vR3NtU2VydmljZVN0YXRlVHJhY2tlci5qYXZhCmluZGV4IDkwZWNiZDcuLmI2MzllZWEgMTAwNjQ0Ci0tLSBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9nc20vR3NtU2VydmljZVN0YXRlVHJhY2tlci5qYXZhCisrKyBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9nc20vR3NtU2VydmljZVN0YXRlVHJhY2tlci5qYXZhCkBAIC0xMDE4LDcgKzEwMTgsOCBAQAogICAgICAgICB9CiAKICAgICAgICAgaWYgKGhhc05ldHdvcmtUeXBlQ2hhbmdlZCkgewotICAgICAgICAgICAgcGhvbmUubm90aWZ5RGF0YUNvbm5lY3Rpb24obnVsbCk7CisgICAgICAgICAgICAvLyBUT0RPIC0gZG8gd2UgcmVhbGx5IHdhbnQgdGhpcz8KKyAgICAgICAgICAgIHBob25lLm5vdGlmeURhdGFDb25uZWN0aW9uKG51bGwsIG51bGwpOwogICAgICAgICB9CiAKICAgICAgICAgaWYgKGhhc1JvYW1pbmdPbikgewpkaWZmIC0tZ2l0IGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2dzbS9TaW1TbXNJbnRlcmZhY2VNYW5hZ2VyLmphdmEgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvZ3NtL1NpbVNtc0ludGVyZmFjZU1hbmFnZXIuamF2YQppbmRleCA2N2VjYzc3Li5hYWIzNTlmIDEwMDY0NAotLS0gYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvZ3NtL1NpbVNtc0ludGVyZmFjZU1hbmFnZXIuamF2YQorKysgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvZ3NtL1NpbVNtc0ludGVyZmFjZU1hbmFnZXIuamF2YQpAQCAtODcsNiArODcsNyBAQAogICAgIHB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7CiAgICAgfQogCisgICAgQE92ZXJyaWRlCiAgICAgcHJvdGVjdGVkIHZvaWQgZmluYWxpemUoKSB7CiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBzdXBlci5maW5hbGl6ZSgpOwpAQCAtMTkyLDYgKzE5Myw3IEBACiAgICAgICAgIHJldHVybiBtU21zOwogICAgIH0KIAorICAgIEBPdmVycmlkZQogICAgIHByb3RlY3RlZCB2b2lkIGxvZyhTdHJpbmcgbXNnKSB7CiAgICAgICAgIExvZy5kKExPR19UQUcsICJbU2ltU21zSW50ZXJmYWNlTWFuYWdlcl0gIiArIG1zZyk7CiAgICAgfQpkaWZmIC0tZ2l0IGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2dzbS9TbXNNZXNzYWdlLmphdmEgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvZ3NtL1Ntc01lc3NhZ2UuamF2YQppbmRleCA5YTNjNDc2Li5lMjQ2MTNmIDEwMDY0NAotLS0gYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvZ3NtL1Ntc01lc3NhZ2UuamF2YQorKysgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvZ3NtL1Ntc01lc3NhZ2UuamF2YQpAQCAtMjYsNyArMjYsNiBAQAogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5Hc21BbHBoYWJldDsKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuU21zSGVhZGVyOwogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5TbXNNZXNzYWdlQmFzZTsKLWltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuU21zTWVzc2FnZUJhc2UuVGV4dEVuY29kaW5nRGV0YWlsczsKIAogaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOwogaW1wb3J0IGphdmEuaW8uVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbjsKQEAgLTM0LDYgKzMzLDcgQEAKIGltcG9ydCBzdGF0aWMgYW5kcm9pZC50ZWxlcGhvbnkuU21zTWVzc2FnZS5FTkNPRElOR183QklUOwogaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnRlbGVwaG9ueS5TbXNNZXNzYWdlLkVOQ09ESU5HXzhCSVQ7CiBpbXBvcnQgc3RhdGljIGFuZHJvaWQudGVsZXBob255LlNtc01lc3NhZ2UuRU5DT0RJTkdfMTZCSVQ7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQudGVsZXBob255LlNtc01lc3NhZ2UuRU5DT0RJTkdfS1NDNTYwMTsKIGltcG9ydCBzdGF0aWMgYW5kcm9pZC50ZWxlcGhvbnkuU21zTWVzc2FnZS5FTkNPRElOR19VTktOT1dOOwogaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnRlbGVwaG9ueS5TbXNNZXNzYWdlLk1BWF9VU0VSX0RBVEFfQllURVM7CiBpbXBvcnQgc3RhdGljIGFuZHJvaWQudGVsZXBob255LlNtc01lc3NhZ2UuTUFYX1VTRVJfREFUQV9CWVRFU19XSVRIX0hFQURFUjsKQEAgLTQ1LDcgKzQ1LDcgQEAKICAqIEEgU2hvcnQgTWVzc2FnZSBTZXJ2aWNlIG1lc3NhZ2UuCiAgKgogICovCi1wdWJsaWMgY2xhc3MgU21zTWVzc2FnZSBleHRlbmRzIFNtc01lc3NhZ2VCYXNleworcHVibGljIGNsYXNzIFNtc01lc3NhZ2UgZXh0ZW5kcyBTbXNNZXNzYWdlQmFzZSB7CiAgICAgc3RhdGljIGZpbmFsIFN0cmluZyBMT0dfVEFHID0gIkdTTSI7CiAKICAgICBwcml2YXRlIE1lc3NhZ2VDbGFzcyBtZXNzYWdlQ2xhc3M7CkBAIC0zMTEsNyArMzExLDcgQEAKICAgICAgICAgICAgIC8vIHRoZSByZWNlaXZlcidzIFNJTSBjYXJkLiBZb3UgY2FuIHRoZW4gc2VuZCBtZXNzYWdlcyB0byB5b3Vyc2VsZgogICAgICAgICAgICAgLy8gKG9uIGEgcGhvbmUgd2l0aCB0aGlzIGNoYW5nZSkgYW5kIHRoZXknbGwgZW5kIHVwIG9uIHRoZSBTSU0gY2FyZC4KICAgICAgICAgICAgIGJvLndyaXRlKDB4MDApOwotICAgICAgICB9IGVsc2UgeyAvL2Fzc3VtZSBVQ1MtMgorICAgICAgICB9IGVsc2UgeyAvLyBhc3N1bWUgVUNTLTIKICAgICAgICAgICAgIGlmICgoMHhmZiAmIHVzZXJEYXRhWzBdKSA+IE1BWF9VU0VSX0RBVEFfQllURVMpIHsKICAgICAgICAgICAgICAgICAvLyBNZXNzYWdlIHRvbyBsb25nCiAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CkBAIC0zNzcsNyArMzc3LDcgQEAKICAgICAgKiBAcGFyYW0gZGVzdGluYXRpb25BZGRyZXNzIHRoZSBhZGRyZXNzIG9mIHRoZSBkZXN0aW5hdGlvbiBmb3IgdGhlIG1lc3NhZ2UKICAgICAgKiBAcGFyYW0gZGVzdGluYXRpb25Qb3J0IHRoZSBwb3J0IHRvIGRlbGl2ZXIgdGhlIG1lc3NhZ2UgdG8gYXQgdGhlCiAgICAgICogICAgICAgIGRlc3RpbmF0aW9uCi0gICAgICogQHBhcmFtIGRhdGEgdGhlIGRhdCBmb3IgdGhlIG1lc3NhZ2UKKyAgICAgKiBAcGFyYW0gZGF0YSB0aGUgZGF0YSBmb3IgdGhlIG1lc3NhZ2UKICAgICAgKiBAcmV0dXJuIGEgPGNvZGU+U3VibWl0UGR1PC9jb2RlPiBjb250YWluaW5nIHRoZSBlbmNvZGVkIFNDCiAgICAgICogICAgICAgICBhZGRyZXNzLCBpZiBhcHBsaWNhYmxlLCBhbmQgdGhlIGVuY29kZWQgbWVzc2FnZS4KICAgICAgKiAgICAgICAgIFJldHVybnMgbnVsbCBvbiBlbmNvZGUgZXJyb3IuCkBAIC00ODIsNyArNDgyLDcgQEAKICAgICAgICAgcmV0dXJuIGJvOwogICAgIH0KIAotICAgIHN0YXRpYyBjbGFzcyBQZHVQYXJzZXIgeworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIFBkdVBhcnNlciB7CiAgICAgICAgIGJ5dGUgcGR1W107CiAgICAgICAgIGludCBjdXI7CiAgICAgICAgIFNtc0hlYWRlciB1c2VyRGF0YUhlYWRlcjsKQEAgLTQ5MCwxMCArNDkwLDYgQEAKICAgICAgICAgaW50IG1Vc2VyRGF0YVNlcHRldFBhZGRpbmc7CiAgICAgICAgIGludCBtVXNlckRhdGFTaXplOwogCi0gICAgICAgIFBkdVBhcnNlcihTdHJpbmcgcykgewotICAgICAgICAgICAgdGhpcyhJY2NVdGlscy5oZXhTdHJpbmdUb0J5dGVzKHMpKTsKLSAgICAgICAgfQotCiAgICAgICAgIFBkdVBhcnNlcihieXRlW10gcGR1KSB7CiAgICAgICAgICAgICB0aGlzLnBkdSA9IHBkdTsKICAgICAgICAgICAgIGN1ciA9IDA7CkBAIC01NDUsNyArNTQxLDcgQEAKICAgICAgICAgICAgIEdzbVNtc0FkZHJlc3MgcmV0OwogCiAgICAgICAgICAgICAvLyAiVGhlIEFkZHJlc3MtTGVuZ3RoIGZpZWxkIGlzIGFuIGludGVnZXIgcmVwcmVzZW50YXRpb24gb2YKLSAgICAgICAgICAgIC8vIHRoZSBudW1iZXIgZmllbGQsIGkuZS4gZXhjbHVkZXMgYW55IHNlbWkgb2N0ZXQgY29udGFpbmluZyBvbmx5CisgICAgICAgICAgICAvLyB0aGUgbnVtYmVyIGZpZWxkLCBpLmUuIGV4Y2x1ZGVzIGFueSBzZW1pLW9jdGV0IGNvbnRhaW5pbmcgb25seQogICAgICAgICAgICAgLy8gZmlsbCBiaXRzLiIKICAgICAgICAgICAgIC8vIFRoZSBUT0EgZmllbGQgaXMgbm90IGluY2x1ZGVkIGFzIHBhcnQgb2YgdGhpcwogICAgICAgICAgICAgaW50IGFkZHJlc3NMZW5ndGggPSBwZHVbY3VyXSAmIDB4ZmY7CkBAIC01NzMsNyArNTY5LDcgQEAKICAgICAgICAgICAgIGludCBzZWNvbmQgPSBJY2NVdGlscy5nc21CY2RCeXRlVG9JbnQocGR1W2N1cisrXSk7CiAKICAgICAgICAgICAgIC8vIEZvciB0aGUgdGltZXpvbmUsIHRoZSBtb3N0IHNpZ25pZmljYW50IGJpdCBvZiB0aGUKLSAgICAgICAgICAgIC8vIGxlYXN0IHNpZ25maWNhbnQgbmliYmxlIGlzIHRoZSBzaWduIGJ5dGUKKyAgICAgICAgICAgIC8vIGxlYXN0IHNpZ25pZmljYW50IG5pYmJsZSBpcyB0aGUgc2lnbiBieXRlCiAgICAgICAgICAgICAvLyAobWVhbmluZyB0aGUgbWF4IHJhbmdlIG9mIHRoaXMgZmllbGQgaXMgNzkgcXVhcnRlci1ob3VycywKICAgICAgICAgICAgIC8vIHdoaWNoIGlzIG1vcmUgdGhhbiBlbm91Z2gpCiAKQEAgLTYzMiw3ICs2MjgsNyBAQAogICAgICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgICAgICogSGVyZSB3ZSBqdXN0IGNyZWF0ZSB0aGUgdXNlciBkYXRhIGxlbmd0aCB0byBiZSB0aGUgcmVtYWluZGVyIG9mCiAgICAgICAgICAgICAgICAgICogdGhlIHBkdSBtaW51cyB0aGUgdXNlciBkYXRhIGhlYWRlciwgc2luY2UgdXNlckRhdGFMZW5ndGggbWVhbnMKLSAgICAgICAgICAgICAgICAgKiB0aGUgbnVtYmVyIG9mIHVuY29tcHJlc3NlZCBzZXBldHMuCisgICAgICAgICAgICAgICAgICogdGhlIG51bWJlciBvZiB1bmNvbXByZXNzZWQgc2VwdGV0cy4KICAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgICBidWZmZXJMZW4gPSBwZHUubGVuZ3RoIC0gb2Zmc2V0OwogICAgICAgICAgICAgfSBlbHNlIHsKQEAgLTY3MSwxMCArNjY3LDEwIEBACiAgICAgICAgIH0KIAogICAgICAgICAvKioKLSAgICAgICAgICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIHBhZGRpbmcgYml0cyBhdCB0aGUgYmVnaW5pbmcgb2YgdGhlIHVzZXIgZGF0YQorICAgICAgICAgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgcGFkZGluZyBiaXRzIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIHVzZXIgZGF0YQogICAgICAgICAgKiBhcnJheSBiZWZvcmUgdGhlIHN0YXJ0IG9mIHRoZSBzZXB0ZXRzLgogICAgICAgICAgKgotICAgICAgICAgKiBAcmV0dXJuIHRoZSBudW1iZXIgb2YgcGFkZGluZyBiaXRzIGF0IHRoZSBiZWdpbmluZyBvZiB0aGUgdXNlciBkYXRhCisgICAgICAgICAqIEByZXR1cm4gdGhlIG51bWJlciBvZiBwYWRkaW5nIGJpdHMgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgdXNlciBkYXRhCiAgICAgICAgICAqIGFycmF5IGJlZm9yZSB0aGUgc3RhcnQgb2YgdGhlIHNlcHRldHMKICAgICAgICAgICovCiAgICAgICAgIGludCBnZXRVc2VyRGF0YVNlcHRldFBhZGRpbmcoKSB7CkBAIC02OTQsNyArNjkwLDcgQEAKICAgICAgICAgWFhYIE5vdCBzdXJlIHdoYXQgdGhpcyBvbmUgaXMgc3VwcG9zZWQgdG8gYmUgZG9pbmcsIGFuZCBubyBvbmUgaXMgdXNpbmcKICAgICAgICAgaXQuCiAgICAgICAgIFN0cmluZyBnZXRVc2VyRGF0YUdTTThiaXQoKSB7Ci0gICAgICAgICAgICAvLyBTeXN0ZW0ub3V0LnByaW50bG4oInJlbWFpbmRlciBvZiBwdWQ6IiArCisgICAgICAgICAgICAvLyBTeXN0ZW0ub3V0LnByaW50bG4oInJlbWFpbmRlciBvZiBwZHU6IiArCiAgICAgICAgICAgICAvLyBIZXhEdW1wLmR1bXBIZXhTdHJpbmcocGR1LCBjdXIsIHBkdS5sZW5ndGggLSBjdXIpKTsKICAgICAgICAgICAgIGludCBjb3VudCA9IHBkdVtjdXIrK10gJiAweGZmOwogICAgICAgICAgICAgaW50IHNpemUgPSBwZHVbY3VyKytdOwpAQCAtNzgxLDYgKzc3NywyNyBAQAogICAgICAgICAgICAgcmV0dXJuIHJldDsKICAgICAgICAgfQogCisgICAgICAgIC8qKgorICAgICAgICAgKiBJbnRlcnByZXRzIHRoZSB1c2VyIGRhdGEgcGF5bG9hZCBhcyBLU0MtNTYwMSBjaGFyYWN0ZXJzLCBhbmQKKyAgICAgICAgICogZGVjb2RlcyB0aGVtIGludG8gYSBTdHJpbmcuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBieXRlQ291bnQgdGhlIG51bWJlciBvZiBieXRlcyBpbiB0aGUgdXNlciBkYXRhIHBheWxvYWQKKyAgICAgICAgICogQHJldHVybiBhIFN0cmluZyB3aXRoIHRoZSBkZWNvZGVkIGNoYXJhY3RlcnMKKyAgICAgICAgICovCisgICAgICAgIFN0cmluZyBnZXRVc2VyRGF0YUtTQzU2MDEoaW50IGJ5dGVDb3VudCkgeworICAgICAgICAgICAgU3RyaW5nIHJldDsKKworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICByZXQgPSBuZXcgU3RyaW5nKHBkdSwgY3VyLCBieXRlQ291bnQsICJLU0M1NjAxIik7CisgICAgICAgICAgICB9IGNhdGNoIChVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICAgICAgcmV0ID0gIiI7CisgICAgICAgICAgICAgICAgTG9nLmUoTE9HX1RBRywgImltcGxhdXNpYmxlIFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24iLCBleCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGN1ciArPSBieXRlQ291bnQ7CisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICB9CisKICAgICAgICAgYm9vbGVhbiBtb3JlRGF0YVByZXNlbnQoKSB7CiAgICAgICAgICAgICByZXR1cm4gKHBkdS5sZW5ndGggPiBjdXIpOwogICAgICAgICB9CkBAIC04MjcsMTEgKzg0NCwxMyBAQAogICAgIH0KIAogICAgIC8qKiB7QGluaGVyaXREb2N9ICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGludCBnZXRQcm90b2NvbElkZW50aWZpZXIoKSB7CiAgICAgICAgIHJldHVybiBwcm90b2NvbElkZW50aWZpZXI7CiAgICAgfQogCiAgICAgLyoqIHtAaW5oZXJpdERvY30gKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgYm9vbGVhbiBpc1JlcGxhY2UoKSB7CiAgICAgICAgIHJldHVybiAocHJvdG9jb2xJZGVudGlmaWVyICYgMHhjMCkgPT0gMHg0MAogICAgICAgICAgICAgICAgICYmIChwcm90b2NvbElkZW50aWZpZXIgJiAweDNmKSA+IDAKQEAgLTgzOSwxMiArODU4LDE0IEBACiAgICAgfQogCiAgICAgLyoqIHtAaW5oZXJpdERvY30gKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgYm9vbGVhbiBpc0NwaHNNd2lNZXNzYWdlKCkgewogICAgICAgICByZXR1cm4gKChHc21TbXNBZGRyZXNzKSBvcmlnaW5hdGluZ0FkZHJlc3MpLmlzQ3Boc1ZvaWNlTWVzc2FnZUNsZWFyKCkKICAgICAgICAgICAgICAgICB8fCAoKEdzbVNtc0FkZHJlc3MpIG9yaWdpbmF0aW5nQWRkcmVzcykuaXNDcGhzVm9pY2VNZXNzYWdlU2V0KCk7CiAgICAgfQogCiAgICAgLyoqIHtAaW5oZXJpdERvY30gKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgYm9vbGVhbiBpc01XSUNsZWFyTWVzc2FnZSgpIHsKICAgICAgICAgaWYgKGlzTXdpICYmIChtd2lTZW5zZSA9PSBmYWxzZSkpIHsKICAgICAgICAgICAgIHJldHVybiB0cnVlOwpAQCAtODU1LDYgKzg3Niw3IEBACiAgICAgfQogCiAgICAgLyoqIHtAaW5oZXJpdERvY30gKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgYm9vbGVhbiBpc01XSVNldE1lc3NhZ2UoKSB7CiAgICAgICAgIGlmIChpc013aSAmJiAobXdpU2Vuc2UgPT0gdHJ1ZSkpIHsKICAgICAgICAgICAgIHJldHVybiB0cnVlOwpAQCAtODY1LDYgKzg4Nyw3IEBACiAgICAgfQogCiAgICAgLyoqIHtAaW5oZXJpdERvY30gKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgYm9vbGVhbiBpc013aURvbnRTdG9yZSgpIHsKICAgICAgICAgaWYgKGlzTXdpICYmIG13aURvbnRTdG9yZSkgewogICAgICAgICAgICAgcmV0dXJuIHRydWU7CkBAIC04ODQsMzEgKzkwNywzNCBAQAogICAgIH0KIAogICAgIC8qKiB7QGluaGVyaXREb2N9ICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGludCBnZXRTdGF0dXMoKSB7CiAgICAgICAgIHJldHVybiBzdGF0dXM7CiAgICAgfQogCiAgICAgLyoqIHtAaW5oZXJpdERvY30gKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgYm9vbGVhbiBpc1N0YXR1c1JlcG9ydE1lc3NhZ2UoKSB7CiAgICAgICAgIHJldHVybiBpc1N0YXR1c1JlcG9ydE1lc3NhZ2U7CiAgICAgfQogCiAgICAgLyoqIHtAaW5oZXJpdERvY30gKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgYm9vbGVhbiBpc1JlcGx5UGF0aFByZXNlbnQoKSB7CiAgICAgICAgIHJldHVybiByZXBseVBhdGhQcmVzZW50OwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFRTIDI3LjAwNSAzLjEsIDxwZHU+IGRlZmluaXRpb24gIkluIHRoZSBjYXNlIG9mIFNNUzogM0dQUCBUUyAyNC4wMTEgWzZdCisgICAgICogVFMgMjcuMDA1IDMuMSwgJmx0O3BkdSZndDsgZGVmaW5pdGlvbiAiSW4gdGhlIGNhc2Ugb2YgU01TOiAzR1BQIFRTIDI0LjAxMSBbNl0KICAgICAgKiBTQyBhZGRyZXNzIGZvbGxvd2VkIGJ5IDNHUFAgVFMgMjMuMDQwIFszXSBUUERVIGluIGhleGFkZWNpbWFsIGZvcm1hdDoKICAgICAgKiBNRS9UQSBjb252ZXJ0cyBlYWNoIG9jdGV0IG9mIFRQIGRhdGEgdW5pdCBpbnRvIHR3byBJUkEgY2hhcmFjdGVyIGxvbmcKLSAgICAgKiBoZXhhZCBudW1iZXIgKGUuZy4gb2N0ZXQgd2l0aCBpbnRlZ2VyIHZhbHVlIDQyIGlzIHByZXNlbnRlZCB0byBURSBhcyB0d28KKyAgICAgKiBoZXggbnVtYmVyIChlLmcuIG9jdGV0IHdpdGggaW50ZWdlciB2YWx1ZSA0MiBpcyBwcmVzZW50ZWQgdG8gVEUgYXMgdHdvCiAgICAgICogY2hhcmFjdGVycyAyQSAoSVJBIDUwIGFuZCA2NSkpIiAuLi5pbiB0aGUgY2FzZSBvZiBjZWxsIGJyb2FkY2FzdCwKICAgICAgKiBzb21ldGhpbmcgZWxzZS4uLgogICAgICAqLwogICAgIHByaXZhdGUgdm9pZCBwYXJzZVBkdShieXRlW10gcGR1KSB7CiAgICAgICAgIG1QZHUgPSBwZHU7Ci0gICAgICAgIC8vIExvZy5kKExPR19UQUcsICJyYXcgc21zIG1lc2FnZToiKTsKKyAgICAgICAgLy8gTG9nLmQoTE9HX1RBRywgInJhdyBzbXMgbWVzc2FnZToiKTsKICAgICAgICAgLy8gTG9nLmQoTE9HX1RBRywgcyk7CiAKICAgICAgICAgUGR1UGFyc2VyIHAgPSBuZXcgUGR1UGFyc2VyKHBkdSk7CkBAIC0xMTA3LDYgKzExMzMsMTYgQEAKICAgICAgICAgICAgICAgICBMb2cudyhMT0dfVEFHLCAiTVdJIGZvciBmYXgsIGVtYWlsLCBvciBvdGhlciAiCiAgICAgICAgICAgICAgICAgICAgICAgICArIChkYXRhQ29kaW5nU2NoZW1lICYgMHhmZikpOwogICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKChkYXRhQ29kaW5nU2NoZW1lICYgMHhDMCkgPT0gMHg4MCkgeworICAgICAgICAgICAgLy8gM0dQUCBUUyAyMy4wMzggVjcuMC4wICgyMDA2LTAzKSBzZWN0aW9uIDQKKyAgICAgICAgICAgIC8vIDB4ODAuLjB4QkYgPT0gUmVzZXJ2ZWQgY29kaW5nIGdyb3VwcworICAgICAgICAgICAgaWYgKGRhdGFDb2RpbmdTY2hlbWUgPT0gMHg4NCkgeworICAgICAgICAgICAgICAgIC8vIFRoaXMgdmFsdWUgdXNlZCBmb3IgS1NDNTYwMSBieSBjYXJyaWVycyBpbiBLb3JlYS4KKyAgICAgICAgICAgICAgICBlbmNvZGluZ1R5cGUgPSBFTkNPRElOR19LU0M1NjAxOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBMb2cudyhMT0dfVEFHLCAiNSAtIFVuc3VwcG9ydGVkIFNNUyBkYXRhIGNvZGluZyBzY2hlbWUgIgorICAgICAgICAgICAgICAgICAgICAgICAgKyAoZGF0YUNvZGluZ1NjaGVtZSAmIDB4ZmYpKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIExvZy53KExPR19UQUcsICIzIC0gVW5zdXBwb3J0ZWQgU01TIGRhdGEgY29kaW5nIHNjaGVtZSAiCiAgICAgICAgICAgICAgICAgICAgICsgKGRhdGFDb2RpbmdTY2hlbWUgJiAweGZmKSk7CkBAIC0xMTMxLDYgKzExNjcsMTAgQEAKICAgICAgICAgY2FzZSBFTkNPRElOR18xNkJJVDoKICAgICAgICAgICAgIG1lc3NhZ2VCb2R5ID0gcC5nZXRVc2VyRGF0YVVDUzIoY291bnQpOwogICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBFTkNPRElOR19LU0M1NjAxOgorICAgICAgICAgICAgbWVzc2FnZUJvZHkgPSBwLmdldFVzZXJEYXRhS1NDNTYwMShjb3VudCk7CisgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogCiAgICAgICAgIGlmIChDb25maWcuTE9HVikgTG9nLnYoTE9HX1RBRywgIlNNUyBtZXNzYWdlIGJvZHkgKHJhdyk6ICciICsgbWVzc2FnZUJvZHkgKyAiJyIpOwpAQCAtMTE2Miw2ICsxMjAyLDcgQEAKICAgICAvKioKICAgICAgKiB7QGluaGVyaXREb2N9CiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIE1lc3NhZ2VDbGFzcyBnZXRNZXNzYWdlQ2xhc3MoKSB7CiAgICAgICAgIHJldHVybiBtZXNzYWdlQ2xhc3M7CiAgICAgfQpkaWZmIC0tZ2l0IGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2dzbS9Vc2ltUGhvbmVCb29rTWFuYWdlci5qYXZhIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2dzbS9Vc2ltUGhvbmVCb29rTWFuYWdlci5qYXZhCmluZGV4IGI2NDI1NDEuLjQxZjNiMjMgMTAwNzU1Ci0tLSBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9nc20vVXNpbVBob25lQm9va01hbmFnZXIuamF2YQorKysgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvZ3NtL1VzaW1QaG9uZUJvb2tNYW5hZ2VyLmphdmEKQEAgLTI3LDggKzI3LDYgQEAKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuSWNjVXRpbHM7CiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LlBob25lQmFzZTsKIAotaW1wb3J0IG9yZy5hcGFjaGUuaGFybW9ueS5sdW5pLmxhbmcucmVmbGVjdC5MaXN0T2ZUeXBlczsKLQogaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CiBpbXBvcnQgamF2YS51dGlsLk1hcDsKZGlmZiAtLWdpdCBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9zaXAvU2lwQ29ubmVjdGlvbkJhc2UuamF2YSBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9zaXAvU2lwQ29ubmVjdGlvbkJhc2UuamF2YQppbmRleCA2Yzk4OWI0Li5mNWQ4NGViIDEwMDY0NAotLS0gYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvc2lwL1NpcENvbm5lY3Rpb25CYXNlLmphdmEKKysrIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L3NpcC9TaXBDb25uZWN0aW9uQmFzZS5qYXZhCkBAIC0yMzgsMTEgKzIzOCw5IEBACiAgICAgICAgIHJldHVybiBDb25uZWN0aW9uLlBSRVNFTlRBVElPTl9BTExPV0VEOwogICAgIH0KIAotICAgIC8qCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIFVVU0luZm8gZ2V0VVVTSW5mbygpIHsKICAgICAgICAgLy8gRklYTUU6IHdoYXQncyB0aGlzIGZvciBTSVA/CiAgICAgICAgIHJldHVybiBudWxsOwogICAgIH0KLSAgICAqLwogfQpkaWZmIC0tZ2l0IGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L3NpcC9TaXBQaG9uZS5qYXZhIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L3NpcC9TaXBQaG9uZS5qYXZhCmluZGV4IDk0M2YyMWMuLjVkNjFhNmUgMTAwNzU1Ci0tLSBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9zaXAvU2lwUGhvbmUuamF2YQorKysgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvc2lwL1NpcFBob25lLmphdmEKQEAgLTYxLDcgKzYxLDYgQEAKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuUGhvbmVQcm94eTsKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuUGhvbmVTdWJJbmZvOwogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5UZWxlcGhvbnlQcm9wZXJ0aWVzOwotaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5VVVNJbmZvOwogCiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLnRleHQuUGFyc2VFeGNlcHRpb247CkBAIC05OSw2ICs5OCwxNCBAQAogICAgICAgICAvLyAgICAgICAgbmV3IEludGVnZXIoUGhvbmUuUEhPTkVfVFlQRV9HU00pLnRvU3RyaW5nKCkpOwogICAgIH0KIAorICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgbykgeworICAgICAgICBpZiAobyA9PSB0aGlzKSByZXR1cm4gdHJ1ZTsKKyAgICAgICAgaWYgKCEobyBpbnN0YW5jZW9mIFNpcFBob25lKSkgcmV0dXJuIGZhbHNlOworICAgICAgICBTaXBQaG9uZSB0aGF0ID0gKFNpcFBob25lKSBvOworICAgICAgICByZXR1cm4gbVByb2ZpbGUuZ2V0VXJpU3RyaW5nKCkuZXF1YWxzKHRoYXQubVByb2ZpbGUuZ2V0VXJpU3RyaW5nKCkpOworICAgIH0KKwogICAgIHB1YmxpYyBTdHJpbmcgZ2V0UGhvbmVOYW1lKCkgewogICAgICAgICByZXR1cm4gIlNJUDoiICsgZ2V0VXJpU3RyaW5nKG1Qcm9maWxlKTsKICAgICB9CkBAIC0xNzIsMTAgKzE3OSw2IEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICBwdWJsaWMgQ29ubmVjdGlvbiBkaWFsKFN0cmluZyBkaWFsU3RyaW5nLCBVVVNJbmZvIHV1c2luZm8pIHRocm93cyBDYWxsU3RhdGVFeGNlcHRpb24gewotICAgICAgICByZXR1cm4gZGlhbChkaWFsU3RyaW5nKTsKLSAgICB9Ci0KICAgICBwdWJsaWMgQ29ubmVjdGlvbiBkaWFsKFN0cmluZyBkaWFsU3RyaW5nKSB0aHJvd3MgQ2FsbFN0YXRlRXhjZXB0aW9uIHsKICAgICAgICAgc3luY2hyb25pemVkIChTaXBQaG9uZS5jbGFzcykgewogICAgICAgICAgICAgcmV0dXJuIGRpYWxJbnRlcm5hbChkaWFsU3RyaW5nKTsKQEAgLTc4MSwxMCArNzg0LDYgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgVVVTSW5mbyBnZXRVVVNJbmZvKCkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KICAgICB9CiAKICAgICBwcml2YXRlIHN0YXRpYyBDYWxsLlN0YXRlIGdldENhbGxTdGF0ZUZyb20oU2lwQXVkaW9DYWxsIHNpcEF1ZGlvQ2FsbCkgewpkaWZmIC0tZ2l0IGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L3NpcC9TaXBQaG9uZUJhc2UuamF2YSBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9zaXAvU2lwUGhvbmVCYXNlLmphdmEKaW5kZXggOTA5OGU2Zi4uNWYyNmFmNCAxMDA3NTUKLS0tIGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L3NpcC9TaXBQaG9uZUJhc2UuamF2YQorKysgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvc2lwL1NpcFBob25lQmFzZS5qYXZhCkBAIC0xOSw2ICsxOSw3IEBACiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRWYWx1ZXM7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LlNoYXJlZFByZWZlcmVuY2VzOworaW1wb3J0IGFuZHJvaWQubmV0LkxpbmtQcm9wZXJ0aWVzOwogaW1wb3J0IGFuZHJvaWQubmV0LlVyaTsKIGltcG9ydCBhbmRyb2lkLm9zLkFzeW5jUmVzdWx0OwogaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlcjsKQEAgLTY1LDcgKzY2LDcgQEAKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuUGhvbmVQcm94eTsKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuUGhvbmVTdWJJbmZvOwogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5UZWxlcGhvbnlQcm9wZXJ0aWVzOwotLy9pbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LlVVU0luZm87CitpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LlVVU0luZm87CiAKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwogaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CkBAIC0xMDIsMTMgKzEwMywxMSBAQAogCiAgICAgcHVibGljIGFic3RyYWN0IENhbGwgZ2V0UmluZ2luZ0NhbGwoKTsKIAotICAgIC8qCiAgICAgcHVibGljIENvbm5lY3Rpb24gZGlhbChTdHJpbmcgZGlhbFN0cmluZywgVVVTSW5mbyB1dXNJbmZvKQogICAgICAgICAgICAgdGhyb3dzIENhbGxTdGF0ZUV4Y2VwdGlvbiB7CiAgICAgICAgIC8vIGlnbm9yZSBVVVNJbmZvCiAgICAgICAgIHJldHVybiBkaWFsKGRpYWxTdHJpbmcpOwogICAgIH0KLSAgICAqLwogCiAgICAgdm9pZCBtaWdyYXRlRnJvbShTaXBQaG9uZUJhc2UgZnJvbSkgewogICAgICAgICBtaWdyYXRlKG1SaW5nYmFja1JlZ2lzdHJhbnRzLCBmcm9tLm1SaW5nYmFja1JlZ2lzdHJhbnRzKTsKQEAgLTUzMyw2ICs1MzIsMTggQEAKICAgICAgICAgTG9nLmUoTE9HX1RBRywgIkVycm9yISBUaGlzIGZ1bmN0aW9uYWxpdHkgaXMgbm90IGltcGxlbWVudGVkIGZvciBTSVAuIik7CiAgICAgfQogCisgICAgLy9AT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBuZWVkc090YVNlcnZpY2VQcm92aXNpb25pbmcoKSB7CisgICAgICAgIC8vIEZJWE1FOiB3aGF0J3MgdGhpcyBmb3IgU0lQPworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLy9AT3ZlcnJpZGUKKyAgICBwdWJsaWMgTGlua1Byb3BlcnRpZXMgZ2V0TGlua1Byb3BlcnRpZXMoU3RyaW5nIGFwblR5cGUpIHsKKyAgICAgICAgLy8gRklYTUU6IHdoYXQncyB0aGlzIGZvciBTSVA/CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKwogICAgIHZvaWQgdXBkYXRlUGhvbmVTdGF0ZSgpIHsKICAgICAgICAgU3RhdGUgb2xkU3RhdGUgPSBzdGF0ZTsKIApkaWZmIC0tZ2l0IGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L3Rlc3QvU2ltdWxhdGVkQ29tbWFuZHMuamF2YSBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS90ZXN0L1NpbXVsYXRlZENvbW1hbmRzLmphdmEKaW5kZXggOWM3MmU1YS4uZmRjZjc4ZCAxMDA2NDQKLS0tIGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L3Rlc3QvU2ltdWxhdGVkQ29tbWFuZHMuamF2YQorKysgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvdGVzdC9TaW11bGF0ZWRDb21tYW5kcy5qYXZhCkBAIC0xNiw3ICsxNiw2IEBACiAKIHBhY2thZ2UgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LnRlc3Q7CiAKLQogaW1wb3J0IGFuZHJvaWQub3MuQXN5bmNSZXN1bHQ7CiBpbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyVGhyZWFkOwogaW1wb3J0IGFuZHJvaWQub3MuTG9vcGVyOwpAQCAtMjcsNyArMjYsNiBAQAogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5Db21tYW5kRXhjZXB0aW9uOwogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5Db21tYW5kc0ludGVyZmFjZTsKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuRGF0YUNhbGxTdGF0ZTsKLWltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuSWNjQ2FyZDsKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuUGhvbmU7CiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LlVVU0luZm87CiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmdzbS5DYWxsRmFpbENhdXNlOwpAQCAtMzM1LDcgKzMzMyw3IEBACiAKICAgICAvKioKICAgICAgKiAoQXN5bmNSZXN1bHQpcmVzcG9uc2Uub2JqKS5yZXN1bHQgd2lsbCBiZSBhbiBJbnRlZ2VyIHJlcHJlc2VudGluZwotICAgICAqIHRoZSBzdW0gb2YgZW5hYmxlZCBzZXJpdmljZSBjbGFzc2VzIChzdW0gb2YgU0VSVklDRV9DTEFTU18qKQorICAgICAqIHRoZSBzdW0gb2YgZW5hYmxlZCBzZXJ2aWNlIGNsYXNzZXMgKHN1bSBvZiBTRVJWSUNFX0NMQVNTXyopCiAgICAgICoKICAgICAgKiBAcGFyYW0gZmFjaWxpdHkgb25lIG9mIENCX0ZBQ0lMVFlfKgogICAgICAqIEBwYXJhbSBwaW4gcGFzc3dvcmQgb3IgIiIgaWYgbm90IHJlcXVpcmVkCkBAIC00NDEsNyArNDM5LDcgQEAKICAgICAgKiAgcmV0dXJuZWQgbWVzc2FnZQogICAgICAqICByZXRNc2cub2JqID0gQXN5bmNSZXN1bHQgYXIKICAgICAgKiAgYXIuZXhjZXB0aW9uIGNhcnJpZXMgZXhjZXB0aW9uIG9uIGZhaWx1cmUKLSAgICAgKiAgYXIudXNlck9iamVjdCBjb250YWlucyB0aGUgb3JpZ25hbCB2YWx1ZSBvZiByZXN1bHQub2JqCisgICAgICogIGFyLnVzZXJPYmplY3QgY29udGFpbnMgdGhlIG9yaWdpbmFsIHZhbHVlIG9mIHJlc3VsdC5vYmoKICAgICAgKiAgYXIucmVzdWx0IGNvbnRhaW5zIGEgTGlzdCBvZiBEcml2ZXJDYWxsCiAgICAgICogICAgICBUaGUgYXIucmVzdWx0IExpc3QgaXMgc29ydGVkIGJ5IERyaXZlckNhbGwuaW5kZXgKICAgICAgKi8KQEAgLTQ2OCw3ICs0NjYsNyBAQAogICAgICAqICByZXR1cm5lZCBtZXNzYWdlCiAgICAgICogIHJldE1zZy5vYmogPSBBc3luY1Jlc3VsdCBhcgogICAgICAqICBhci5leGNlcHRpb24gY2FycmllcyBleGNlcHRpb24gb24gZmFpbHVyZQotICAgICAqICBhci51c2VyT2JqZWN0IGNvbnRhaW5zIHRoZSBvcmlnbmFsIHZhbHVlIG9mIHJlc3VsdC5vYmoKKyAgICAgKiAgYXIudXNlck9iamVjdCBjb250YWlucyB0aGUgb3JpZ2luYWwgdmFsdWUgb2YgcmVzdWx0Lm9iagogICAgICAqICBhci5yZXN1bHQgY29udGFpbnMgYSBMaXN0IG9mIERhdGFDYWxsU3RhdGUKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBnZXREYXRhQ2FsbExpc3QoTWVzc2FnZSByZXN1bHQpIHsKQEAgLTQ3OSw3ICs0NzcsNyBAQAogICAgICAqICByZXR1cm5lZCBtZXNzYWdlCiAgICAgICogIHJldE1zZy5vYmogPSBBc3luY1Jlc3VsdCBhcgogICAgICAqICBhci5leGNlcHRpb24gY2FycmllcyBleGNlcHRpb24gb24gZmFpbHVyZQotICAgICAqICBhci51c2VyT2JqZWN0IGNvbnRhaW5zIHRoZSBvcmlnbmFsIHZhbHVlIG9mIHJlc3VsdC5vYmoKKyAgICAgKiAgYXIudXNlck9iamVjdCBjb250YWlucyB0aGUgb3JpZ2luYWwgdmFsdWUgb2YgcmVzdWx0Lm9iagogICAgICAqICBhci5yZXN1bHQgaXMgbnVsbCBvbiBzdWNjZXNzIGFuZCBmYWlsdXJlCiAgICAgICoKICAgICAgKiBDTElSX0RFRkFVTFQgICAgID09IG9uICJ1c2Ugc3Vic2NyaXB0aW9uIGRlZmF1bHQgdmFsdWUiCkBAIC00OTYsNyArNDk0LDcgQEAKICAgICAgKiAgcmV0dXJuZWQgbWVzc2FnZQogICAgICAqICByZXRNc2cub2JqID0gQXN5bmNSZXN1bHQgYXIKICAgICAgKiAgYXIuZXhjZXB0aW9uIGNhcnJpZXMgZXhjZXB0aW9uIG9uIGZhaWx1cmUKLSAgICAgKiAgYXIudXNlck9iamVjdCBjb250YWlucyB0aGUgb3JpZ25hbCB2YWx1ZSBvZiByZXN1bHQub2JqCisgICAgICogIGFyLnVzZXJPYmplY3QgY29udGFpbnMgdGhlIG9yaWdpbmFsIHZhbHVlIG9mIHJlc3VsdC5vYmoKICAgICAgKiAgYXIucmVzdWx0IGlzIG51bGwgb24gc3VjY2VzcyBhbmQgZmFpbHVyZQogICAgICAqCiAgICAgICogQ0xJUl9ERUZBVUxUICAgICA9PSBvbiAidXNlIHN1YnNjcmlwdGlvbiBkZWZhdWx0IHZhbHVlIgpAQCAtNTEzLDcgKzUxMSw3IEBACiAgICAgICogIHJldHVybmVkIG1lc3NhZ2UKICAgICAgKiAgcmV0TXNnLm9iaiA9IEFzeW5jUmVzdWx0IGFyCiAgICAgICogIGFyLmV4Y2VwdGlvbiBjYXJyaWVzIGV4Y2VwdGlvbiBvbiBmYWlsdXJlCi0gICAgICogIGFyLnVzZXJPYmplY3QgY29udGFpbnMgdGhlIG9yaWduYWwgdmFsdWUgb2YgcmVzdWx0Lm9iagorICAgICAqICBhci51c2VyT2JqZWN0IGNvbnRhaW5zIHRoZSBvcmlnaW5hbCB2YWx1ZSBvZiByZXN1bHQub2JqCiAgICAgICogIGFyLnJlc3VsdCBpcyBTdHJpbmcgY29udGFpbmluZyBJTVNJIG9uIHN1Y2Nlc3MKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBnZXRJTVNJKE1lc3NhZ2UgcmVzdWx0KSB7CkBAIC01MjQsNyArNTIyLDcgQEAKICAgICAgKiAgcmV0dXJuZWQgbWVzc2FnZQogICAgICAqICByZXRNc2cub2JqID0gQXN5bmNSZXN1bHQgYXIKICAgICAgKiAgYXIuZXhjZXB0aW9uIGNhcnJpZXMgZXhjZXB0aW9uIG9uIGZhaWx1cmUKLSAgICAgKiAgYXIudXNlck9iamVjdCBjb250YWlucyB0aGUgb3JpZ25hbCB2YWx1ZSBvZiByZXN1bHQub2JqCisgICAgICogIGFyLnVzZXJPYmplY3QgY29udGFpbnMgdGhlIG9yaWdpbmFsIHZhbHVlIG9mIHJlc3VsdC5vYmoKICAgICAgKiAgYXIucmVzdWx0IGlzIFN0cmluZyBjb250YWluaW5nIElNRUkgb24gc3VjY2VzcwogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIGdldElNRUkoTWVzc2FnZSByZXN1bHQpIHsKQEAgLTUzNSw3ICs1MzMsNyBAQAogICAgICAqICByZXR1cm5lZCBtZXNzYWdlCiAgICAgICogIHJldE1zZy5vYmogPSBBc3luY1Jlc3VsdCBhcgogICAgICAqICBhci5leGNlcHRpb24gY2FycmllcyBleGNlcHRpb24gb24gZmFpbHVyZQotICAgICAqICBhci51c2VyT2JqZWN0IGNvbnRhaW5zIHRoZSBvcmlnbmFsIHZhbHVlIG9mIHJlc3VsdC5vYmoKKyAgICAgKiAgYXIudXNlck9iamVjdCBjb250YWlucyB0aGUgb3JpZ2luYWwgdmFsdWUgb2YgcmVzdWx0Lm9iagogICAgICAqICBhci5yZXN1bHQgaXMgU3RyaW5nIGNvbnRhaW5pbmcgSU1FSVNWIG9uIHN1Y2Nlc3MKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBnZXRJTUVJU1YoTWVzc2FnZSByZXN1bHQpIHsKQEAgLTU0Nyw3ICs1NDUsNyBAQAogICAgICAqICByZXR1cm5lZCBtZXNzYWdlCiAgICAgICogIHJldE1zZy5vYmogPSBBc3luY1Jlc3VsdCBhcgogICAgICAqICBhci5leGNlcHRpb24gY2FycmllcyBleGNlcHRpb24gb24gZmFpbHVyZQotICAgICAqICBhci51c2VyT2JqZWN0IGNvbnRhaW5zIHRoZSBvcmlnbmFsIHZhbHVlIG9mIHJlc3VsdC5vYmoKKyAgICAgKiAgYXIudXNlck9iamVjdCBjb250YWlucyB0aGUgb3JpZ2luYWwgdmFsdWUgb2YgcmVzdWx0Lm9iagogICAgICAqICBhci5yZXN1bHQgaXMgbnVsbCBvbiBzdWNjZXNzIGFuZCBmYWlsdXJlCiAgICAgICoKICAgICAgKiAgM0dQUCAyMi4wMzAgNi41LjUKQEAgLTU3Miw3ICs1NzAsNyBAQAogICAgICAqICAiUmVsZWFzZXMgYWxsIGhlbGQgY2FsbHMgb3Igc2V0cyBVc2VyIERldGVybWluZWQgVXNlciBCdXN5IChVRFVCKQogICAgICAqICAgZm9yIGEgd2FpdGluZyBjYWxsLiIKICAgICAgKiAgYXIuZXhjZXB0aW9uIGNhcnJpZXMgZXhjZXB0aW9uIG9uIGZhaWx1cmUKLSAgICAgKiAgYXIudXNlck9iamVjdCBjb250YWlucyB0aGUgb3JpZ25hbCB2YWx1ZSBvZiByZXN1bHQub2JqCisgICAgICogIGFyLnVzZXJPYmplY3QgY29udGFpbnMgdGhlIG9yaWdpbmFsIHZhbHVlIG9mIHJlc3VsdC5vYmoKICAgICAgKiAgYXIucmVzdWx0IGlzIG51bGwgb24gc3VjY2VzcyBhbmQgZmFpbHVyZQogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIGhhbmd1cFdhaXRpbmdPckJhY2tncm91bmQgKE1lc3NhZ2UgcmVzdWx0KSB7CkBAIC01OTMsNyArNTkxLDcgQEAKICAgICAgKiAgdGhlIG90aGVyIChoZWxkIG9yIHdhaXRpbmcpIGNhbGwuIgogICAgICAqCiAgICAgICogIGFyLmV4Y2VwdGlvbiBjYXJyaWVzIGV4Y2VwdGlvbiBvbiBmYWlsdXJlCi0gICAgICogIGFyLnVzZXJPYmplY3QgY29udGFpbnMgdGhlIG9yaWduYWwgdmFsdWUgb2YgcmVzdWx0Lm9iagorICAgICAqICBhci51c2VyT2JqZWN0IGNvbnRhaW5zIHRoZSBvcmlnaW5hbCB2YWx1ZSBvZiByZXN1bHQub2JqCiAgICAgICogIGFyLnJlc3VsdCBpcyBudWxsIG9uIHN1Y2Nlc3MgYW5kIGZhaWx1cmUKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBoYW5ndXBGb3JlZ3JvdW5kUmVzdW1lQmFja2dyb3VuZCAoTWVzc2FnZSByZXN1bHQpIHsKQEAgLTYxNCw3ICs2MTIsNyBAQAogICAgICAqICB0aGUgb3RoZXIgKGhlbGQgb3Igd2FpdGluZykgY2FsbC4iCiAgICAgICoKICAgICAgKiAgYXIuZXhjZXB0aW9uIGNhcnJpZXMgZXhjZXB0aW9uIG9uIGZhaWx1cmUKLSAgICAgKiAgYXIudXNlck9iamVjdCBjb250YWlucyB0aGUgb3JpZ25hbCB2YWx1ZSBvZiByZXN1bHQub2JqCisgICAgICogIGFyLnVzZXJPYmplY3QgY29udGFpbnMgdGhlIG9yaWdpbmFsIHZhbHVlIG9mIHJlc3VsdC5vYmoKICAgICAgKiAgYXIucmVzdWx0IGlzIG51bGwgb24gc3VjY2VzcyBhbmQgZmFpbHVyZQogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHN3aXRjaFdhaXRpbmdPckhvbGRpbmdBbmRBY3RpdmUgKE1lc3NhZ2UgcmVzdWx0KSB7CkBAIC02MzQsNyArNjMyLDcgQEAKICAgICAgKiAiQWRkcyBhIGhlbGQgY2FsbCB0byB0aGUgY29udmVyc2F0aW9uIgogICAgICAqCiAgICAgICogIGFyLmV4Y2VwdGlvbiBjYXJyaWVzIGV4Y2VwdGlvbiBvbiBmYWlsdXJlCi0gICAgICogIGFyLnVzZXJPYmplY3QgY29udGFpbnMgdGhlIG9yaWduYWwgdmFsdWUgb2YgcmVzdWx0Lm9iagorICAgICAqICBhci51c2VyT2JqZWN0IGNvbnRhaW5zIHRoZSBvcmlnaW5hbCB2YWx1ZSBvZiByZXN1bHQub2JqCiAgICAgICogIGFyLnJlc3VsdCBpcyBudWxsIG9uIHN1Y2Nlc3MgYW5kIGZhaWx1cmUKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBjb25mZXJlbmNlIChNZXNzYWdlIHJlc3VsdCkgewpAQCAtNjU0LDcgKzY1Miw3IEBACiAgICAgICogIkNvbm5lY3RzIHRoZSB0d28gY2FsbHMgYW5kIGRpc2Nvbm5lY3RzIHRoZSBzdWJzY3JpYmVyIGZyb20gYm90aCBjYWxscyIKICAgICAgKgogICAgICAqICBhci5leGNlcHRpb24gY2FycmllcyBleGNlcHRpb24gb24gZmFpbHVyZQotICAgICAqICBhci51c2VyT2JqZWN0IGNvbnRhaW5zIHRoZSBvcmlnbmFsIHZhbHVlIG9mIHJlc3VsdC5vYmoKKyAgICAgKiAgYXIudXNlck9iamVjdCBjb250YWlucyB0aGUgb3JpZ2luYWwgdmFsdWUgb2YgcmVzdWx0Lm9iagogICAgICAqICBhci5yZXN1bHQgaXMgbnVsbCBvbiBzdWNjZXNzIGFuZCBmYWlsdXJlCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgZXhwbGljaXRDYWxsVHJhbnNmZXIgKE1lc3NhZ2UgcmVzdWx0KSB7CkBAIC02OTAsNyArNjg4LDcgQEAKICAgICAvKioKICAgICAgKgogICAgICAqICBhci5leGNlcHRpb24gY2FycmllcyBleGNlcHRpb24gb24gZmFpbHVyZQotICAgICAqICBhci51c2VyT2JqZWN0IGNvbnRhaW5zIHRoZSBvcmlnbmFsIHZhbHVlIG9mIHJlc3VsdC5vYmoKKyAgICAgKiAgYXIudXNlck9iamVjdCBjb250YWlucyB0aGUgb3JpZ2luYWwgdmFsdWUgb2YgcmVzdWx0Lm9iagogICAgICAqICBhci5yZXN1bHQgaXMgbnVsbCBvbiBzdWNjZXNzIGFuZCBmYWlsdXJlCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgYWNjZXB0Q2FsbCAoTWVzc2FnZSByZXN1bHQpIHsKQEAgLTcwOCw3ICs3MDYsNyBAQAogICAgIC8qKgogICAgICAqICBhbHNvIGtub3duIGFzIFVEVUIKICAgICAgKiAgYXIuZXhjZXB0aW9uIGNhcnJpZXMgZXhjZXB0aW9uIG9uIGZhaWx1cmUKLSAgICAgKiAgYXIudXNlck9iamVjdCBjb250YWlucyB0aGUgb3JpZ25hbCB2YWx1ZSBvZiByZXN1bHQub2JqCisgICAgICogIGFyLnVzZXJPYmplY3QgY29udGFpbnMgdGhlIG9yaWdpbmFsIHZhbHVlIG9mIHJlc3VsdC5vYmoKICAgICAgKiAgYXIucmVzdWx0IGlzIG51bGwgb24gc3VjY2VzcyBhbmQgZmFpbHVyZQogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHJlamVjdENhbGwgKE1lc3NhZ2UgcmVzdWx0KSB7CkBAIC03ODUsNyArNzgzLDcgQEAKICAgICAgKgogICAgICAqIEBwYXJhbSByZXN1bHQgaXMgY2FsbGJhY2sgbWVzc2FnZQogICAgICAqICAgICAgICAoKEFzeW5jUmVzdWx0KXJlc3BvbnNlLm9iaikucmVzdWx0ICBpcyBhbiBpbnRbXSB3aXRoIGV2ZXJ5Ci0gICAgICogICAgICAgIGVsZW1lbnQgcmVwcmVzZW50aW5nIG9uZSBhdmlhbGFibGUgQk1fKl9CQU5ECisgICAgICogICAgICAgIGVsZW1lbnQgcmVwcmVzZW50aW5nIG9uZSBhdmFpbGFibGUgQk1fKl9CQU5ECiAgICAgICovCiAgICAgcHVibGljIHZvaWQgcXVlcnlBdmFpbGFibGVCYW5kTW9kZSAoTWVzc2FnZSByZXN1bHQpIHsKICAgICAgICAgaW50IHJldFtdID0gbmV3IGludCBbNF07CkBAIC04OTQsNyArODkyLDcgQEAKIAogICAgIC8qKgogICAgICAqICBhci5leGNlcHRpb24gY2FycmllcyBleGNlcHRpb24gb24gZmFpbHVyZQotICAgICAqICBhci51c2VyT2JqZWN0IGNvbnRhaW5zIHRoZSBvcmlnbmFsIHZhbHVlIG9mIHJlc3VsdC5vYmoKKyAgICAgKiAgYXIudXNlck9iamVjdCBjb250YWlucyB0aGUgb3JpZ2luYWwgdmFsdWUgb2YgcmVzdWx0Lm9iagogICAgICAqICBhci5yZXN1bHQgaXMgbnVsbCBvbiBzdWNjZXNzIGFuZCBmYWlsdXJlCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2VuZER0bWYoY2hhciBjLCBNZXNzYWdlIHJlc3VsdCkgewpAQCAtOTAzLDcgKzkwMSw3IEBACiAKICAgICAvKioKICAgICAgKiAgYXIuZXhjZXB0aW9uIGNhcnJpZXMgZXhjZXB0aW9uIG9uIGZhaWx1cmUKLSAgICAgKiAgYXIudXNlck9iamVjdCBjb250YWlucyB0aGUgb3JpZ25hbCB2YWx1ZSBvZiByZXN1bHQub2JqCisgICAgICogIGFyLnVzZXJPYmplY3QgY29udGFpbnMgdGhlIG9yaWdpbmFsIHZhbHVlIG9mIHJlc3VsdC5vYmoKICAgICAgKiAgYXIucmVzdWx0IGlzIG51bGwgb24gc3VjY2VzcyBhbmQgZmFpbHVyZQogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHN0YXJ0RHRtZihjaGFyIGMsIE1lc3NhZ2UgcmVzdWx0KSB7CkBAIC05MTIsNyArOTEwLDcgQEAKIAogICAgIC8qKgogICAgICAqICBhci5leGNlcHRpb24gY2FycmllcyBleGNlcHRpb24gb24gZmFpbHVyZQotICAgICAqICBhci51c2VyT2JqZWN0IGNvbnRhaW5zIHRoZSBvcmlnbmFsIHZhbHVlIG9mIHJlc3VsdC5vYmoKKyAgICAgKiAgYXIudXNlck9iamVjdCBjb250YWlucyB0aGUgb3JpZ2luYWwgdmFsdWUgb2YgcmVzdWx0Lm9iagogICAgICAqICBhci5yZXN1bHQgaXMgbnVsbCBvbiBzdWNjZXNzIGFuZCBmYWlsdXJlCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc3RvcER0bWYoTWVzc2FnZSByZXN1bHQpIHsKQEAgLTkyMSw3ICs5MTksNyBAQAogCiAgICAgLyoqCiAgICAgICogIGFyLmV4Y2VwdGlvbiBjYXJyaWVzIGV4Y2VwdGlvbiBvbiBmYWlsdXJlCi0gICAgICogIGFyLnVzZXJPYmplY3QgY29udGFpbnMgdGhlIG9yaWduYWwgdmFsdWUgb2YgcmVzdWx0Lm9iagorICAgICAqICBhci51c2VyT2JqZWN0IGNvbnRhaW5zIHRoZSBvcmlnaW5hbCB2YWx1ZSBvZiByZXN1bHQub2JqCiAgICAgICogIGFyLnJlc3VsdCBpcyBudWxsIG9uIHN1Y2Nlc3MgYW5kIGZhaWx1cmUKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZW5kQnVyc3REdG1mKFN0cmluZyBkdG1mU3RyaW5nLCBpbnQgb24sIGludCBvZmYsIE1lc3NhZ2UgcmVzdWx0KSB7CkBAIC05NTYsNiArOTU0LDcgQEAKICAgICAgICAgdW5pbXBsZW1lbnRlZChyZXNwb25zZSk7CiAgICAgfQogCisgICAgQERlcHJlY2F0ZWQKICAgICBwdWJsaWMgdm9pZCBzZXR1cERlZmF1bHRQRFAoU3RyaW5nIGFwbiwgU3RyaW5nIHVzZXIsIFN0cmluZyBwYXNzd29yZCwgTWVzc2FnZSByZXN1bHQpIHsKICAgICAgICAgdW5pbXBsZW1lbnRlZChyZXN1bHQpOwogICAgIH0KQEAgLTk2Nyw5ICs5NjYsNyBAQAogCiAgICAgcHVibGljIHZvaWQgZGVhY3RpdmF0ZURhdGFDYWxsKGludCBjaWQsIE1lc3NhZ2UgcmVzdWx0KSB7dW5pbXBsZW1lbnRlZChyZXN1bHQpO30KIAotICAgIC8qKgotICAgICAqIEBkZXByZWNhdGVkCi0gICAgICovCisgICAgQERlcHJlY2F0ZWQKICAgICBwdWJsaWMgdm9pZCBkZWFjdGl2YXRlRGVmYXVsdFBEUChpbnQgY2lkLCBNZXNzYWdlIHJlc3VsdCkge3VuaW1wbGVtZW50ZWQocmVzdWx0KTt9CiAKICAgICBwdWJsaWMgdm9pZCBzZXRQcmVmZXJyZWROZXR3b3JrVHlwZShpbnQgbmV0d29ya1R5cGUgLCBNZXNzYWdlIHJlc3VsdCkgewpAQCAtMTA0Niw3ICsxMDQzLDcgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBwYXJhbWV0ZXJzIGVxdWl2aWxpZW50IHRvIDI3LjAwNyBBVCtDUlNNIGNvbW1hbmQKKyAgICAgKiBwYXJhbWV0ZXJzIGVxdWl2YWxlbnQgdG8gMjcuMDA3IEFUK0NSU00gY29tbWFuZAogICAgICAqIHJlc3BvbnNlLm9iaiB3aWxsIGJlIGFuIEFzeW5jUmVzdWx0CiAgICAgICogcmVzcG9uc2Uub2JqLnVzZXJPYmogd2lsbCBiZSBhIFNpbUlvUmVzdWx0IG9uIHN1Y2Nlc3MKICAgICAgKi8KZGlmZiAtLWdpdCBhL3RlbGVwaG9ueS9tb2NrcmlsL0FuZHJvaWQubWsgYi90ZWxlcGhvbnkvbW9ja3JpbC9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk1YWU4NGMKLS0tIC9kZXYvbnVsbAorKysgYi90ZWxlcGhvbnkvbW9ja3JpbC9BbmRyb2lkLm1rCkBAIC0wLDAgKzEsMzAgQEAKKyMKKyMgQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKyMKKworTE9DQUxfUEFUSDo9JChjYWxsIG15LWRpcikKKworaW5jbHVkZSAkKENMRUFSX1ZBUlMpCisKK0xPQ0FMX1NSQ19GSUxFUyA6PSAkKGNhbGwgYWxsLWphdmEtZmlsZXMtdW5kZXIsIHNyYykKKworTE9DQUxfSkFWQV9MSUJSQVJJRVMgOj0gY29yZSBmcmFtZXdvcmsKKworTE9DQUxfU1RBVElDX0pBVkFfTElCUkFSSUVTIDo9IGxpYnJpbHByb3RvLWphdmEKKworTE9DQUxfTU9EVUxFIDo9IG1vY2tyaWxjb250cm9sbGVyCisKK2luY2x1ZGUgJChCVUlMRF9TVEFUSUNfSkFWQV9MSUJSQVJZKQpkaWZmIC0tZ2l0IGEvdGVsZXBob255L21vY2tyaWwvc3JjL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9tb2NrcmlsL01vY2tSaWxDb250cm9sbGVyLmphdmEgYi90ZWxlcGhvbnkvbW9ja3JpbC9zcmMvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L21vY2tyaWwvTW9ja1JpbENvbnRyb2xsZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNTEzOWJkCi0tLSAvZGV2L251bGwKKysrIGIvdGVsZXBob255L21vY2tyaWwvc3JjL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9tb2NrcmlsL01vY2tSaWxDb250cm9sbGVyLmphdmEKQEAgLTAsMCArMSwxMzUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkubW9ja3JpbDsKKworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CisKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC5jb21tdW5pY2F0aW9uLk1zZ0hlYWRlcjsKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC5jb21tdW5pY2F0aW9uLk1zZzsKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuUmlsQ2hhbm5lbDsKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkucmlsX3Byb3RvLlJpbEN0cmxDbWRzOworaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5yaWxfcHJvdG8uUmlsQ21kczsKK2ltcG9ydCBjb20uZ29vZ2xlLnByb3RvYnVmLm1pY3JvLk1lc3NhZ2VNaWNybzsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CisKKy8qKgorICogQ29udGFpbiBhIGxpc3Qgb2YgY29tbWFuZHMgdG8gY29udHJvbCBNb2NrIFJJTC4gQmVmb3JlIHVzaW5nIHRoZXNlIGNvbW1hbmRzIHRoZSBkZXZpY2VzCisgKiBuZWVkcyB0byBiZSBzZXQgd2l0aCBNb2NrIFJJTC4gUmVmZXIgdG8gaGFyZHdhcmUvcmlsL21vY2tyaWwvUkVBRE1FLnR4dCBmb3IgZGV0YWlscy4KKyAqCisgKi8KK3B1YmxpYyBjbGFzcyBNb2NrUmlsQ29udHJvbGxlciB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJNb2NrUklMQ29udHJvbGxlciI7CisgICAgcHJpdmF0ZSBSaWxDaGFubmVsIG1SaWxDaGFubmVsID0gbnVsbDsKKyAgICBwcml2YXRlIE1zZyBtTWVzc2FnZSA9IG51bGw7CisKKyAgICBwdWJsaWMgTW9ja1JpbENvbnRyb2xsZXIoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBtUmlsQ2hhbm5lbCA9IFJpbENoYW5uZWwubWFrZVJpbENoYW5uZWwoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDbG9zZSB0aGUgY2hhbm5lbCBhZnRlciB0aGUgY29tbXVuaWNhdGlvbiBpcyBkb25lLgorICAgICAqIFRoaXMgbWV0aG9kIGhhcyB0byBiZSBjYWxsZWQgYWZ0ZXIgdGhlIHRlc3QgaXMgZmluaXNoZWQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgY2xvc2VDaGFubmVsKCkgeworICAgICAgICBtUmlsQ2hhbm5lbC5jbG9zZSgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNlbmQgY29tbWFuZHMgYW5kIHJldHVybiB0cnVlIG9uIHN1Y2Nlc3MKKyAgICAgKiBAcGFyYW0gY21kIGZvciBNc2dIZWFkZXIKKyAgICAgKiBAcGFyYW0gdG9rZW4gZm9yIE1zZ0hlYWRlcgorICAgICAqIEBwYXJhbSBzdGF0dXMgZm9yIE1zZ0hlYWRlcgorICAgICAqIEBwYXJhbSBwYkRhdGEgZm9yIE1zZyBkYXRhCisgICAgICogQHJldHVybiB0cnVlIGlmIGNvbW1hbmQgaXMgc2VudCBzdWNjZXNzZnVsbHksIGZhbHNlIGlmIGl0IGZhaWxzCisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIHNlbmRDdHJsQ29tbWFuZChpbnQgY21kLCBsb25nIHRva2VuLCBpbnQgc3RhdHVzLCBNZXNzYWdlTWljcm8gcGJEYXRhKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBNc2cuc2VuZChtUmlsQ2hhbm5lbCwgY21kLCB0b2tlbiwgc3RhdHVzLCBwYkRhdGEpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBMb2cudihUQUcsICJzZW5kIGNvbW1hbmQgOiAlZCBmYWlsZWQ6ICIgKyBlLmdldFN0YWNrVHJhY2UoKSk7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IGNvbnRyb2wgcmVzcG9uc2UKKyAgICAgKiBAcmV0dXJuIE1zZyBpZiByZXNwb25zZSBpcyByZWNlaXZlZCwgZWxzZSByZXR1cm4gbnVsbC4KKyAgICAgKi8KKyAgICBwcml2YXRlIE1zZyBnZXRDdHJsUmVzcG9uc2UoKSB7CisgICAgICAgIE1zZyByZXNwb25zZSA9IG51bGw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXNwb25zZSA9IE1zZy5yZWN2KG1SaWxDaGFubmVsKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgTG9nLnYoVEFHLCAicmVjZWl2ZSByZXNwb25zZSBmb3IgZ2V0UmFkaW9TdGF0ZSgpIGVycm9yOiAiICsgZS5nZXRTdGFja1RyYWNlKCkpOworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlc3BvbnNlOworICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4gdGhlIHJhZGlvIHN0YXRlIGlmIGl0IGlzIHZhbGlkLCBvdGhlcndpc2UgcmV0dXJuIC0xCisgICAgICovCisgICAgcHVibGljIGludCBnZXRSYWRpb1N0YXRlKCkgeworICAgICAgICBpZiAoIXNlbmRDdHJsQ29tbWFuZChSaWxDdHJsQ21kcy5DVFJMX0NNRF9HRVRfUkFESU9fU1RBVEUsIDAsIDAsIG51bGwpKSB7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICAgICAgTXNnIHJlc3BvbnNlID0gZ2V0Q3RybFJlc3BvbnNlKCk7CisgICAgICAgIGlmIChyZXNwb25zZSA9PSBudWxsKSB7CisgICAgICAgICAgICBMb2cudihUQUcsICJmYWlsZWQgdG8gZ2V0IHJlc3BvbnNlIik7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICAgICAgcmVzcG9uc2UucHJpbnRIZWFkZXIoVEFHKTsKKyAgICAgICAgUmlsQ3RybENtZHMuQ3RybFJzcFJhZGlvU3RhdGUgcmVzcCA9CisgICAgICAgICAgICByZXNwb25zZS5nZXREYXRhQXMoUmlsQ3RybENtZHMuQ3RybFJzcFJhZGlvU3RhdGUuY2xhc3MpOworICAgICAgICBpbnQgc3RhdGUgPSByZXNwLmdldFN0YXRlKCk7CisgICAgICAgIGlmICgoc3RhdGUgPj0gUmlsQ21kcy5SQURJT1NUQVRFX09GRikgJiYgKHN0YXRlIDw9IFJpbENtZHMuUkFESU9TVEFURV9OVl9SRUFEWSkpCisgICAgICAgICAgICByZXR1cm4gc3RhdGU7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIHJhZGlvIHN0YXRlIG9mIG1vY2sgcmlsIHRvIHRoZSBnaXZlbiBzdGF0ZQorICAgICAqIEBwYXJhbSBzdGF0ZSBmb3IgZ2l2ZW4gcmFkaW8gc3RhdGUKKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHN0YXRlIGlzIHNldCBzdWNjZXNzZnVsLCBmYWxzZSBpZiBpdCBmYWlscworICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIHNldFJhZGlvU3RhdGUoaW50IHN0YXRlKSB7CisgICAgICAgIFJpbEN0cmxDbWRzLkN0cmxSZXFSYWRpb1N0YXRlIHJlcSA9IG5ldyBSaWxDdHJsQ21kcy5DdHJsUmVxUmFkaW9TdGF0ZSgpOworICAgICAgICBpZiAoc3RhdGUgPCAwIHx8IHN0YXRlID4gUmlsQ21kcy5SQURJT1NUQVRFX05WX1JFQURZKSB7CisgICAgICAgICAgICBMb2cudihUQUcsICJ0aGUgZ2l2ZSByYWRpbyBzdGF0ZSBpcyBub3QgdmFsaWQuIik7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgcmVxLnNldFN0YXRlKHN0YXRlKTsKKyAgICAgICAgaWYgKCFzZW5kQ3RybENvbW1hbmQoUmlsQ3RybENtZHMuQ1RSTF9DTURfU0VUX1JBRElPX1NUQVRFLCAwLCAwLCByZXEpKSB7CisgICAgICAgICAgICBMb2cudihUQUcsICJzZW5kIHNldCByYWRpbyBzdGF0ZSByZXF1ZXN0IGZhaWxlZC4iKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBNc2cgcmVzcG9uc2UgPSBnZXRDdHJsUmVzcG9uc2UoKTsKKyAgICAgICAgaWYgKHJlc3BvbnNlID09IG51bGwpIHsKKyAgICAgICAgICAgIExvZy52KFRBRywgImZhaWxlZCB0byBnZXQgcmVzcG9uc2UgZm9yIHNldFJhZGlvU3RhdGUiKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICByZXNwb25zZS5wcmludEhlYWRlcihUQUcpOworICAgICAgICBSaWxDdHJsQ21kcy5DdHJsUnNwUmFkaW9TdGF0ZSByZXNwID0KKyAgICAgICAgICAgIHJlc3BvbnNlLmdldERhdGFBcyhSaWxDdHJsQ21kcy5DdHJsUnNwUmFkaW9TdGF0ZS5jbGFzcyk7CisgICAgICAgIGludCBjdXJzdGF0ZSA9IHJlc3AuZ2V0U3RhdGUoKTsKKyAgICAgICAgcmV0dXJuIGN1cnN0YXRlID09IHN0YXRlOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3RlbGVwaG9ueS90ZXN0cy90ZWxlcGhvbnltb2NrcmlsdGVzdHMvQW5kcm9pZC5tayBiL3RlbGVwaG9ueS90ZXN0cy90ZWxlcGhvbnltb2NrcmlsdGVzdHMvQW5kcm9pZC5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NzMxZDBkCi0tLSAvZGV2L251bGwKKysrIGIvdGVsZXBob255L3Rlc3RzL3RlbGVwaG9ueW1vY2tyaWx0ZXN0cy9BbmRyb2lkLm1rCkBAIC0wLDAgKzEsMTQgQEAKK0xPQ0FMX1BBVEg6PSAkKGNhbGwgbXktZGlyKQoraW5jbHVkZSAkKENMRUFSX1ZBUlMpCisKK0xPQ0FMX01PRFVMRV9UQUdTIDo9IHRlc3RzCisKK0xPQ0FMX1NSQ19GSUxFUyA6PSAkKGNhbGwgYWxsLXN1YmRpci1qYXZhLWZpbGVzKQorCitMT0NBTF9TVEFUSUNfSkFWQV9MSUJSQVJJRVMgOj0gbW9ja3JpbGNvbnRyb2xsZXIKKworTE9DQUxfSkFWQV9MSUJSQVJJRVMgOj0gYW5kcm9pZC50ZXN0LnJ1bm5lcgorCitMT0NBTF9QQUNLQUdFX05BTUUgOj0gVGVsZXBob255TW9ja1JpbFRlc3RzCisKK2luY2x1ZGUgJChCVUlMRF9QQUNLQUdFKQpkaWZmIC0tZ2l0IGEvdGVsZXBob255L3Rlc3RzL3RlbGVwaG9ueW1vY2tyaWx0ZXN0cy9BbmRyb2lkTWFuaWZlc3QueG1sIGIvdGVsZXBob255L3Rlc3RzL3RlbGVwaG9ueW1vY2tyaWx0ZXN0cy9BbmRyb2lkTWFuaWZlc3QueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYzZjQ0YTIKLS0tIC9kZXYvbnVsbAorKysgYi90ZWxlcGhvbnkvdGVzdHMvdGVsZXBob255bW9ja3JpbHRlc3RzL0FuZHJvaWRNYW5pZmVzdC54bWwKQEAgLTAsMCArMSw0MCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKworPCEtLSBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8bWFuaWZlc3QgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgIHBhY2thZ2U9ImNvbS5hbmRyb2lkLnRlbGVwaG9ueW1vY2tyaWx0ZXN0cyI+CisKKyAgICA8YXBwbGljYXRpb24+CisgICAgICAgIDx1c2VzLWxpYnJhcnkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnRlc3QucnVubmVyIiAvPgorICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpsYWJlbD0iVGVsZXBob255TW9ja1JpbFRlc3QiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpuYW1lPSJUZWxlcGhvbnlNb2NrUmlsVGVzdCI+CisgICAgICAgICAgICA8aW50ZW50LWZpbHRlcj4KKyAgICAgICAgICAgICAgICA8YWN0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuYWN0aW9uLk1BSU4iIC8+CisgICAgICAgICAgICAgICAgPGNhdGVnb3J5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuY2F0ZWdvcnkuTEFVTkNIRVIiLz4KKyAgICAgICAgICAgIDwvaW50ZW50LWZpbHRlcj4KKyAgICAgICAgPC9hY3Rpdml0eT4KKyAgICA8L2FwcGxpY2F0aW9uPgorCisgICAgPGluc3RydW1lbnRhdGlvbiBhbmRyb2lkOm5hbWU9Ii5UZWxlcGhvbnlNb2NrVGVzdFJ1bm5lciIKKyAgICAgICAgYW5kcm9pZDp0YXJnZXRQYWNrYWdlPSJjb20uYW5kcm9pZC50ZWxlcGhvbnltb2NrcmlsdGVzdHMiCisgICAgICAgIGFuZHJvaWQ6bGFiZWw9IlRlc3QgcnVubmVyIGZvciBUZWxlcGhvbnkgVGVzdHMgVXNpbmcgTW9jayBSSUwiCisgICAgLz4KKworICAgIDx1c2VzLXBlcm1pc3Npb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnBlcm1pc3Npb24uUkVBRF9QSE9ORV9TVEFURSIgLz4KKyAgICA8dXNlcy1wZXJtaXNzaW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5wZXJtaXNzaW9uLklOVEVSTkVUIiAvPgorCis8L21hbmlmZXN0PgpkaWZmIC0tZ2l0IGEvdGVsZXBob255L3Rlc3RzL3RlbGVwaG9ueW1vY2tyaWx0ZXN0cy9zcmMvY29tL2FuZHJvaWQvdGVsZXBob255bW9ja3JpbHRlc3RzL1RlbGVwaG9ueU1vY2tUZXN0UnVubmVyLmphdmEgYi90ZWxlcGhvbnkvdGVzdHMvdGVsZXBob255bW9ja3JpbHRlc3RzL3NyYy9jb20vYW5kcm9pZC90ZWxlcGhvbnltb2NrcmlsdGVzdHMvVGVsZXBob255TW9ja1Rlc3RSdW5uZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OGVlNzM4Ci0tLSAvZGV2L251bGwKKysrIGIvdGVsZXBob255L3Rlc3RzL3RlbGVwaG9ueW1vY2tyaWx0ZXN0cy9zcmMvY29tL2FuZHJvaWQvdGVsZXBob255bW9ja3JpbHRlc3RzL1RlbGVwaG9ueU1vY2tUZXN0UnVubmVyLmphdmEKQEAgLTAsMCArMSw2NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLnRlbGVwaG9ueW1vY2tyaWx0ZXN0czsKKworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworaW1wb3J0IGFuZHJvaWQudGVzdC5JbnN0cnVtZW50YXRpb25UZXN0UnVubmVyOworaW1wb3J0IGFuZHJvaWQudGVzdC5JbnN0cnVtZW50YXRpb25UZXN0U3VpdGU7CitpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255Lm1vY2tyaWwuTW9ja1JpbENvbnRyb2xsZXI7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKKworaW1wb3J0IGNvbS5hbmRyb2lkLnRlbGVwaG9ueW1vY2tyaWx0ZXN0cy5mdW5jdGlvbmFsLlNpbXBsZVRlc3RVc2luZ01vY2tSaWw7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7CitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworCisvKioKKyAqIFRlc3QgcnVubmVyIGZvciB0ZWxlcGhvbnkgdGVzdHMgdGhhdCB1c2luZyBNb2NrIFJJTAorICoKKyAqLworcHVibGljIGNsYXNzIFRlbGVwaG9ueU1vY2tUZXN0UnVubmVyIGV4dGVuZHMgSW5zdHJ1bWVudGF0aW9uVGVzdFJ1bm5lciB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRz0iVGVsZXBob255TW9ja1Rlc3RSdW5uZXIiOworICAgIHB1YmxpYyBNb2NrUmlsQ29udHJvbGxlciBtQ29udHJvbGxlcjsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBUZXN0U3VpdGUgZ2V0QWxsVGVzdHMoKSB7CisgICAgICAgIFRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBJbnN0cnVtZW50YXRpb25UZXN0U3VpdGUodGhpcyk7CisgICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShTaW1wbGVUZXN0VXNpbmdNb2NrUmlsLmNsYXNzKTsKKyAgICAgICAgcmV0dXJuIHN1aXRlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9uQ3JlYXRlKEJ1bmRsZSBpY2ljbGUpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG1Db250cm9sbGVyID0gbmV3IE1vY2tSaWxDb250cm9sbGVyKCk7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICBUZXN0Q2FzZS5hc3NlcnRUcnVlKCJDcmVhdGUgTW9jayBSSWwgQ29udHJvbGxlciBmYWlsZWQiLCBmYWxzZSk7CisgICAgICAgIH0KKyAgICAgICAgVGVzdENhc2UuYXNzZXJ0Tm90TnVsbChtQ29udHJvbGxlcik7CisgICAgICAgIHN1cGVyLm9uQ3JlYXRlKGljaWNsZSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgZmluaXNoKGludCByZXN1bHRDb2RlLCBCdW5kbGUgcmVzdWx0cykgeworICAgICAgICBpZiAobUNvbnRyb2xsZXIgIT0gbnVsbCkKKyAgICAgICAgICAgIG1Db250cm9sbGVyLmNsb3NlQ2hhbm5lbCgpOworICAgICAgICBzdXBlci5maW5pc2gocmVzdWx0Q29kZSwgcmVzdWx0cyk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVsZXBob255L3Rlc3RzL3RlbGVwaG9ueW1vY2tyaWx0ZXN0cy9zcmMvY29tL2FuZHJvaWQvdGVsZXBob255bW9ja3JpbHRlc3RzL2Z1bmN0aW9uYWwvU2ltcGxlVGVzdFVzaW5nTW9ja1JpbC5qYXZhIGIvdGVsZXBob255L3Rlc3RzL3RlbGVwaG9ueW1vY2tyaWx0ZXN0cy9zcmMvY29tL2FuZHJvaWQvdGVsZXBob255bW9ja3JpbHRlc3RzL2Z1bmN0aW9uYWwvU2ltcGxlVGVzdFVzaW5nTW9ja1JpbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNlYTFjZjIKLS0tIC9kZXYvbnVsbAorKysgYi90ZWxlcGhvbnkvdGVzdHMvdGVsZXBob255bW9ja3JpbHRlc3RzL3NyYy9jb20vYW5kcm9pZC90ZWxlcGhvbnltb2NrcmlsdGVzdHMvZnVuY3Rpb25hbC9TaW1wbGVUZXN0VXNpbmdNb2NrUmlsLmphdmEKQEAgLTAsMCArMSw2MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQudGVsZXBob255bW9ja3JpbHRlc3RzLmZ1bmN0aW9uYWw7CisKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkubW9ja3JpbC5Nb2NrUmlsQ29udHJvbGxlcjsKK2ltcG9ydCBhbmRyb2lkLnRlc3QuSW5zdHJ1bWVudGF0aW9uVGVzdENhc2U7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKKworaW1wb3J0IGNvbS5hbmRyb2lkLnRlbGVwaG9ueW1vY2tyaWx0ZXN0cy5UZWxlcGhvbnlNb2NrVGVzdFJ1bm5lcjsKKworLyoqCisgKiBBIHNpbXBsZSB0ZXN0IHRoYXQgdXNpbmcgTW9jayBSSUwgQ29udHJvbGxlcgorICovCitwdWJsaWMgY2xhc3MgU2ltcGxlVGVzdFVzaW5nTW9ja1JpbCBleHRlbmRzIEluc3RydW1lbnRhdGlvblRlc3RDYXNlIHsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIlNpbXBsZVRlc3RVc2luZ01vY2tSaWwiOworICAgIHByaXZhdGUgTW9ja1JpbENvbnRyb2xsZXIgbU1vY2tSaWxDdHJsID0gbnVsbDsKKyAgICBwcml2YXRlIFRlbGVwaG9ueU1vY2tUZXN0UnVubmVyIG1SdW5uZXI7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBzdXBlci5zZXRVcCgpOworICAgICAgICBtUnVubmVyID0gKFRlbGVwaG9ueU1vY2tUZXN0UnVubmVyKWdldEluc3RydW1lbnRhdGlvbigpOworICAgICAgICBtTW9ja1JpbEN0cmwgPSBtUnVubmVyLm1Db250cm9sbGVyOworICAgICAgICBhc3NlcnROb3ROdWxsKG1Nb2NrUmlsQ3RybCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSBjdXJyZW50IHJhZGlvIHN0YXRlIG9mIFJJTAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRSYWRpb1N0YXRlKCkgeworICAgICAgICBpbnQgc3RhdGUgPSBtTW9ja1JpbEN0cmwuZ2V0UmFkaW9TdGF0ZSgpOworICAgICAgICBMb2cudihUQUcsICJ0ZXN0R2V0UmFkaW9TdGF0ZTogIiArIHN0YXRlKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShzdGF0ZSA+PSAwICYmIHN0YXRlIDw9IDkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgY3VycmVudCByYWRpbyBzdGF0ZSBvZiBSSUwKKyAgICAgKiBhbmQgdmVyaWZ5IHRoZSByYWRpbyBzdGF0ZSBpcyBzZXQgY29ycmVjdGx5CisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdFNldFJhZGlvU3RhdGUoKSB7CisgICAgICAgIGZvciAoaW50IHN0YXRlID0gMDsgc3RhdGUgPD0gOTsgc3RhdGUrKykgeworICAgICAgICAgICAgTG9nLnYoVEFHLCAic2V0IHJhZGlvIHN0YXRlIHRvIGJlICIgKyBzdGF0ZSk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKCJzZXQgcmFkaW8gc3RhdGU6ICIgKyBzdGF0ZSArICIgZmFpbGVkLiIsCisgICAgICAgICAgICAgICAgICAgICAgIG1Nb2NrUmlsQ3RybC5zZXRSYWRpb1N0YXRlKHN0YXRlKSk7CisgICAgICAgIH0KKyAgICAgICAgYXNzZXJ0RmFsc2UoInVzZSBhbiBpbnZhbGlkIHJhZGlvIHN0YXRlIiwgbU1vY2tSaWxDdHJsLnNldFJhZGlvU3RhdGUoLTEpKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UoInRoZSByYWRpbyBzdGF0ZSBkb2Vzbid0IGV4aXN0IiwgbU1vY2tSaWxDdHJsLnNldFJhZGlvU3RhdGUoMTApKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZWxlcGhvbnkvdGVzdHMvdGVsZXBob255dGVzdHMvQW5kcm9pZC5tayBiL3RlbGVwaG9ueS90ZXN0cy90ZWxlcGhvbnl0ZXN0cy9BbmRyb2lkLm1rCmluZGV4IDQ1ZTI2NWEuLjk4ZTQ0MDMgMTAwNjQ0Ci0tLSBhL3RlbGVwaG9ueS90ZXN0cy90ZWxlcGhvbnl0ZXN0cy9BbmRyb2lkLm1rCisrKyBiL3RlbGVwaG9ueS90ZXN0cy90ZWxlcGhvbnl0ZXN0cy9BbmRyb2lkLm1rCkBAIC01LDYgKzUsOCBAQAogCiBMT0NBTF9TUkNfRklMRVMgOj0gJChjYWxsIGFsbC1zdWJkaXItamF2YS1maWxlcykKIAorTE9DQUxfU1RBVElDX0pBVkFfTElCUkFSSUVTIDo9IGxpYnJpbHByb3RvLWphdmEKKwogTE9DQUxfSkFWQV9MSUJSQVJJRVMgOj0gYW5kcm9pZC50ZXN0LnJ1bm5lcgogCiBMT0NBTF9QQUNLQUdFX05BTUUgOj0gRnJhbWV3b3Jrc1RlbGVwaG9ueVRlc3RzCmRpZmYgLS1naXQgYS90ZWxlcGhvbnkvdGVzdHMvdGVsZXBob255dGVzdHMvQW5kcm9pZE1hbmlmZXN0LnhtbCBiL3RlbGVwaG9ueS90ZXN0cy90ZWxlcGhvbnl0ZXN0cy9BbmRyb2lkTWFuaWZlc3QueG1sCmluZGV4IDZhOTc0MjMuLmJhMWQ5NTcgMTAwNjQ0Ci0tLSBhL3RlbGVwaG9ueS90ZXN0cy90ZWxlcGhvbnl0ZXN0cy9BbmRyb2lkTWFuaWZlc3QueG1sCisrKyBiL3RlbGVwaG9ueS90ZXN0cy90ZWxlcGhvbnl0ZXN0cy9BbmRyb2lkTWFuaWZlc3QueG1sCkBAIC0zMiw2ICszMiwxMyBAQAogICAgICAgICBhbmRyb2lkOnRhcmdldFBhY2thZ2U9ImNvbS5hbmRyb2lkLmZyYW1ld29ya3MudGVsZXBob255dGVzdHMiCiAgICAgICAgIGFuZHJvaWQ6bGFiZWw9IkZyYW1ld29ya3MgVGVsZXBob255IFRlc3RzIj4KICAgICA8L2luc3RydW1lbnRhdGlvbj4KKworICAgIDxpbnN0cnVtZW50YXRpb24gYW5kcm9pZDpuYW1lPSIuVGVsZXBob255TW9ja1JpbFRlc3RSdW5uZXIiCisgICAgICAgIGFuZHJvaWQ6dGFyZ2V0UGFja2FnZT0iY29tLmFuZHJvaWQuZnJhbWV3b3Jrcy50ZWxlcGhvbnl0ZXN0cyIKKyAgICAgICAgYW5kcm9pZDpsYWJlbD0iVGVzdCBSdW5uZXIgZm9yIE1vY2sgUmlsIFRlc3RzIgorICAgIC8+CisKICAgICA8dXNlcy1wZXJtaXNzaW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5wZXJtaXNzaW9uLlJFQURfUEhPTkVfU1RBVEUiIC8+CisgICAgPHVzZXMtcGVybWlzc2lvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQucGVybWlzc2lvbi5JTlRFUk5FVCIgLz4KIAogPC9tYW5pZmVzdD4KZGlmZiAtLWdpdCBhL3RlbGVwaG9ueS90ZXN0cy90ZWxlcGhvbnl0ZXN0cy9zcmMvYW5kcm9pZC90ZWxlcGhvbnkvUGhvbmVOdW1iZXJVdGlsc1Rlc3QuamF2YSBiL3RlbGVwaG9ueS90ZXN0cy90ZWxlcGhvbnl0ZXN0cy9zcmMvYW5kcm9pZC90ZWxlcGhvbnkvUGhvbmVOdW1iZXJVdGlsc1Rlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGU1OWI4MS4uMDAwMDAwMAotLS0gYS90ZWxlcGhvbnkvdGVzdHMvdGVsZXBob255dGVzdHMvc3JjL2FuZHJvaWQvdGVsZXBob255L1Bob25lTnVtYmVyVXRpbHNUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MDYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255OwotCi1pbXBvcnQgYW5kcm9pZC50ZXN0LkFuZHJvaWRUZXN0Q2FzZTsKLWltcG9ydCBhbmRyb2lkLnRlc3Quc3VpdGVidWlsZGVyLmFubm90YXRpb24uU21hbGxUZXN0OwotaW1wb3J0IGFuZHJvaWQudGV4dC5TcGFubmFibGVTdHJpbmdCdWlsZGVyOwotaW1wb3J0IGFuZHJvaWQudGVsZXBob255LlBob25lTnVtYmVyVXRpbHM7Ci1pbXBvcnQgYW5kcm9pZC50ZWxlcGhvbnkuVGVsZXBob255TWFuYWdlcjsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotcHVibGljIGNsYXNzIFBob25lTnVtYmVyVXRpbHNUZXN0IGV4dGVuZHMgQW5kcm9pZFRlc3RDYXNlIHsKLQotICAgIEBTbWFsbFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0RXh0cmFjdE5ldHdvcmtQb3J0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGFzc2VydEVxdWFscygKLSAgICAgICAgICAgICAgICAiKzE3MDA1NTU0MTQxIiwKLSAgICAgICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLmV4dHJhY3ROZXR3b3JrUG9ydGlvbigiKzE3MDA1NTU0MTQxIikKLSAgICAgICAgKTsKLQotICAgICAgICBhc3NlcnRFcXVhbHMoCi0gICAgICAgICAgICAgICAgIisxNzAwNTU1NDE0MSIsCi0gICAgICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5leHRyYWN0TmV0d29ya1BvcnRpb24oIisxICg3MDApLjU1NS00MTQxIikKLSAgICAgICAgKTsKLQotICAgICAgICBhc3NlcnRFcXVhbHMoCi0gICAgICAgICAgICAgICAgIjE3MDA1NTU0MTQxIiwKLSAgICAgICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLmV4dHJhY3ROZXR3b3JrUG9ydGlvbigiMSAoNzAwKS41NTUtNDE0MSIpCi0gICAgICAgICk7Ci0KLSAgICAgICAgLy8gVGhpcyBtYXkgc2VlbSB3cm9uZywgYnV0IGl0J3MgcHJvYmFibHkgb2sKLSAgICAgICAgYXNzZXJ0RXF1YWxzKAotICAgICAgICAgICAgICAgICIxNzAwNTU1NDE0MSojIiwKLSAgICAgICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLmV4dHJhY3ROZXR3b3JrUG9ydGlvbigiMSAoNzAwKS41NTUtNDE0MSojIikKLSAgICAgICAgKTsKLQotICAgICAgICBhc3NlcnRFcXVhbHMoCi0gICAgICAgICAgICAgICAgIjE3MDA1NTU0MU5OIiwKLSAgICAgICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLmV4dHJhY3ROZXR3b3JrUG9ydGlvbigiMSAoNzAwKS41NTUtNDFOTiIpCi0gICAgICAgICk7Ci0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKAotICAgICAgICAgICAgICAgICIxNzAwNTU1NDFOTiIsCi0gICAgICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5leHRyYWN0TmV0d29ya1BvcnRpb24oIjEgKDcwMCkuNTU1LTQxTk4sMTIzNCIpCi0gICAgICAgICk7Ci0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKAotICAgICAgICAgICAgICAgICIxNzAwNTU1NDFOTiIsCi0gICAgICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5leHRyYWN0TmV0d29ya1BvcnRpb24oIjEgKDcwMCkuNTU1LTQxTk47MTIzNCIpCi0gICAgICAgICk7Ci0KLSAgICAgICAgLy8gQW4gTU1JIHN0cmluZyBpcyB1bnBlcnRlcmJlZCwgZXZlbiB0aG91Z2ggaXQgY29udGFpbnMgYQotICAgICAgICAvLyAodmFsaWQgaW4gdGhpcyBjYXNlKSBlbWJlZGRlZCArCi0gICAgICAgIGFzc2VydEVxdWFscygKLSAgICAgICAgICAgICAgICAiKioyMSoqMTcwMDU1NTQxNDEjIiwKLSAgICAgICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLmV4dHJhY3ROZXR3b3JrUG9ydGlvbigiKioyMSoqKzE3MDA1NTU0MTQxIyIpCi0gICAgICAgICAgICAgICAgLy9UT0RPIHRoaXMgaXMgdGhlIGNvcnJlY3QgcmVzdWx0LCBhbHRob3VnaCB0aGUgYWJvdmUKLSAgICAgICAgICAgICAgICAvL3Jlc3VsdCBoYXMgYmVlbiByZXR1cm5lZCBzaW5jZSBjaGFuZ2UgMzE3NzYKLSAgICAgICAgICAgICAgICAvLyIqKjIxKiorMTcwMDU1NTQxNDEjIgotICAgICAgICApOwotCi0gICAgICAgIGFzc2VydEVxdWFscygiIiwgUGhvbmVOdW1iZXJVdGlscy5leHRyYWN0TmV0d29ya1BvcnRpb24oIiIpKTsKLQotICAgICAgICBhc3NlcnRFcXVhbHMoIiIsIFBob25lTnVtYmVyVXRpbHMuZXh0cmFjdE5ldHdvcmtQb3J0aW9uKCIsMTIzNCIpKTsKLQotICAgICAgICBieXRlIFtdIGIgPSBuZXcgYnl0ZVsyMF07Ci0gICAgICAgIGJbMF0gPSAoYnl0ZSkgMHg4MTsgYlsxXSA9IChieXRlKSAweDcxOyBiWzJdID0gKGJ5dGUpIDB4MDA7IGJbM10gPSAoYnl0ZSkgMHg1NTsKLSAgICAgICAgYls0XSA9IChieXRlKSAweDA1OyBiWzVdID0gKGJ5dGUpIDB4MjA7IGJbNl0gPSAoYnl0ZSkgMHhGMDsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCIxNzAwNTU1MDAyMCIsCi0gICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLmNhbGxlZFBhcnR5QkNEVG9TdHJpbmcoYiwgMCwgNykpOwotCi0gICAgICAgIGJbMF0gPSAoYnl0ZSkgMHg4MDsgYlsxXSA9IChieXRlKSAweDcxOyBiWzJdID0gKGJ5dGUpIDB4MDA7IGJbM10gPSAoYnl0ZSkgMHg1NTsKLSAgICAgICAgYls0XSA9IChieXRlKSAweDA1OyBiWzVdID0gKGJ5dGUpIDB4MjA7IGJbNl0gPSAoYnl0ZSkgMHhGMDsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCIxNzAwNTU1MDAyMCIsCi0gICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLmNhbGxlZFBhcnR5QkNEVG9TdHJpbmcoYiwgMCwgNykpOwotCi0gICAgICAgIGJbMF0gPSAoYnl0ZSkgMHg5MDsgYlsxXSA9IChieXRlKSAweDcxOyBiWzJdID0gKGJ5dGUpIDB4MDA7IGJbM10gPSAoYnl0ZSkgMHg1NTsKLSAgICAgICAgYls0XSA9IChieXRlKSAweDA1OyBiWzVdID0gKGJ5dGUpIDB4MjA7IGJbNl0gPSAoYnl0ZSkgMHhGMDsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCIrMTcwMDU1NTAwMjAiLAotICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5jYWxsZWRQYXJ0eUJDRFRvU3RyaW5nKGIsIDAsIDcpKTsKLQotICAgICAgICBiWzBdID0gKGJ5dGUpIDB4OTE7IGJbMV0gPSAoYnl0ZSkgMHg3MTsgYlsyXSA9IChieXRlKSAweDAwOyBiWzNdID0gKGJ5dGUpIDB4NTU7Ci0gICAgICAgIGJbNF0gPSAoYnl0ZSkgMHgwNTsgYls1XSA9IChieXRlKSAweDIwOyBiWzZdID0gKGJ5dGUpIDB4RjA7Ci0gICAgICAgIGFzc2VydEVxdWFscygiKzE3MDA1NTUwMDIwIiwKLSAgICAgICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLmNhbGxlZFBhcnR5QkNEVG9TdHJpbmcoYiwgMCwgNykpOwotCi0gICAgICAgIGJ5dGVbXSBiUmV0ID0gUGhvbmVOdW1iZXJVdGlscy5uZXR3b3JrUG9ydGlvblRvQ2FsbGVkUGFydHlCQ0QoIisxNzAwNTU1MDAyMCIpOwotICAgICAgICBhc3NlcnRFcXVhbHMoNywgYlJldC5sZW5ndGgpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDc7IGkrKykgewotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGJbaV0sIGJSZXRbaV0pOwotICAgICAgICB9Ci0KLSAgICAgICAgYlJldCA9IFBob25lTnVtYmVyVXRpbHMubmV0d29ya1BvcnRpb25Ub0NhbGxlZFBhcnR5QkNEV2l0aExlbmd0aCgiKzE3MDA1NTUwMDIwIik7Ci0gICAgICAgIGFzc2VydEVxdWFscyg4LCBiUmV0Lmxlbmd0aCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhiUmV0WzBdLCA3KTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDE7IGkgPCA4OyBpKyspIHsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhiW2kgLSAxXSwgYlJldFtpXSk7Ci0gICAgICAgIH0KLQotICAgICAgICBiUmV0ID0gUGhvbmVOdW1iZXJVdGlscy5uZXR3b3JrUG9ydGlvblRvQ2FsbGVkUGFydHlCQ0QoIjcwMDU1NTAwMjAiKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCI3MDA1NTUwMDIwIiwKLSAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuY2FsbGVkUGFydHlCQ0RUb1N0cmluZyhiUmV0LCAwLCBiUmV0Lmxlbmd0aCkpOwotCi0gICAgICAgIGJbMF0gPSAoYnl0ZSkgMHg4MTsgYlsxXSA9IChieXRlKSAweDcxOyBiWzJdID0gKGJ5dGUpIDB4MDA7IGJbM10gPSAoYnl0ZSkgMHg1NTsKLSAgICAgICAgYls0XSA9IChieXRlKSAweDA1OyBiWzVdID0gKGJ5dGUpIDB4MjA7IGJbNl0gPSAoYnl0ZSkgMHhCMDsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCIxNzAwNTU1MDAyMCMiLAotICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5jYWxsZWRQYXJ0eUJDRFRvU3RyaW5nKGIsIDAsIDcpKTsKLQotICAgICAgICBiWzBdID0gKGJ5dGUpIDB4OTE7IGJbMV0gPSAoYnl0ZSkgMHg3MTsgYlsyXSA9IChieXRlKSAweDAwOyBiWzNdID0gKGJ5dGUpIDB4NTU7Ci0gICAgICAgIGJbNF0gPSAoYnl0ZSkgMHgwNTsgYls1XSA9IChieXRlKSAweDIwOyBiWzZdID0gKGJ5dGUpIDB4QjA7Ci0gICAgICAgIGFzc2VydEVxdWFscygiKzE3MDA1NTUwMDIwIyIsCi0gICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLmNhbGxlZFBhcnR5QkNEVG9TdHJpbmcoYiwgMCwgNykpOwotCi0gICAgICAgIGJbMF0gPSAoYnl0ZSkgMHg4MTsgYlsxXSA9IChieXRlKSAweDJBOyBiWzJdID0gKGJ5dGUpIDB4QjE7Ci0gICAgICAgIGFzc2VydEVxdWFscygiKjIxIyIsCi0gICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLmNhbGxlZFBhcnR5QkNEVG9TdHJpbmcoYiwgMCwgMykpOwotCi0gICAgICAgIGJbMF0gPSAoYnl0ZSkgMHg4MTsgYlsxXSA9IChieXRlKSAweDJCOyBiWzJdID0gKGJ5dGUpIDB4QjE7Ci0gICAgICAgIGFzc2VydEVxdWFscygiIzIxIyIsCi0gICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLmNhbGxlZFBhcnR5QkNEVG9TdHJpbmcoYiwgMCwgMykpOwotCi0gICAgICAgIGJbMF0gPSAoYnl0ZSkgMHg5MTsgYlsxXSA9IChieXRlKSAweDJBOyBiWzJdID0gKGJ5dGUpIDB4QjE7Ci0gICAgICAgIGFzc2VydEVxdWFscygiKjIxIysiLAotICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5jYWxsZWRQYXJ0eUJDRFRvU3RyaW5nKGIsIDAsIDMpKTsKLQotICAgICAgICBiWzBdID0gKGJ5dGUpIDB4ODE7IGJbMV0gPSAoYnl0ZSkgMHhBQTsgYlsyXSA9IChieXRlKSAweDEyOyBiWzNdID0gKGJ5dGUpIDB4RkI7Ci0gICAgICAgIGFzc2VydEVxdWFscygiKioyMSMiLAotICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5jYWxsZWRQYXJ0eUJDRFRvU3RyaW5nKGIsIDAsIDQpKTsKLQotICAgICAgICBiWzBdID0gKGJ5dGUpIDB4OTE7IGJbMV0gPSAoYnl0ZSkgMHhBQTsgYlsyXSA9IChieXRlKSAweDEyOyBiWzNdID0gKGJ5dGUpIDB4RkI7Ci0gICAgICAgIGFzc2VydEVxdWFscygiKioyMSMrIiwKLSAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuY2FsbGVkUGFydHlCQ0RUb1N0cmluZyhiLCAwLCA0KSk7Ci0KLSAgICAgICAgYlswXSA9IChieXRlKSAweDgxOyBiWzFdID0gKGJ5dGUpIDB4OUE7IGJbMl0gPSAoYnl0ZSkgMHhBOTsgYlszXSA9IChieXRlKSAweDcxOwotICAgICAgICBiWzRdID0gKGJ5dGUpIDB4MDA7IGJbNV0gPSAoYnl0ZSkgMHg1NTsgYls2XSA9IChieXRlKSAweDA1OyBiWzddID0gKGJ5dGUpIDB4MjA7Ci0gICAgICAgIGJbOF0gPSAoYnl0ZSkgMHhCMDsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCIqOTkqMTcwMDU1NTAwMjAjIiwKLSAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuY2FsbGVkUGFydHlCQ0RUb1N0cmluZyhiLCAwLCA5KSk7Ci0KLSAgICAgICAgYlswXSA9IChieXRlKSAweDkxOyBiWzFdID0gKGJ5dGUpIDB4OUE7IGJbMl0gPSAoYnl0ZSkgMHhBOTsgYlszXSA9IChieXRlKSAweDcxOwotICAgICAgICBiWzRdID0gKGJ5dGUpIDB4MDA7IGJbNV0gPSAoYnl0ZSkgMHg1NTsgYls2XSA9IChieXRlKSAweDA1OyBiWzddID0gKGJ5dGUpIDB4MjA7Ci0gICAgICAgIGJbOF0gPSAoYnl0ZSkgMHhCMDsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCIqOTkqKzE3MDA1NTUwMDIwIyIsCi0gICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLmNhbGxlZFBhcnR5QkNEVG9TdHJpbmcoYiwgMCwgOSkpOwotCi0gICAgICAgIGJbMF0gPSAoYnl0ZSkgMHg4MTsgYlsxXSA9IChieXRlKSAweEFBOyBiWzJdID0gKGJ5dGUpIDB4MTI7IGJbM10gPSAoYnl0ZSkgMHgxQTsKLSAgICAgICAgYls0XSA9IChieXRlKSAweDA3OyBiWzVdID0gKGJ5dGUpIDB4NTA7IGJbNl0gPSAoYnl0ZSkgMHg1NTsgYls3XSA9IChieXRlKSAweDAwOwotICAgICAgICBiWzhdID0gKGJ5dGUpIDB4MDI7IGJbOV0gPSAoYnl0ZSkgMHhGQjsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCIqKjIxKjE3MDA1NTUwMDIwIyIsCi0gICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLmNhbGxlZFBhcnR5QkNEVG9TdHJpbmcoYiwgMCwgMTApKTsKLQotICAgICAgICBiWzBdID0gKGJ5dGUpIDB4OTE7IGJbMV0gPSAoYnl0ZSkgMHhBQTsgYlsyXSA9IChieXRlKSAweDEyOyBiWzNdID0gKGJ5dGUpIDB4MUE7Ci0gICAgICAgIGJbNF0gPSAoYnl0ZSkgMHgwNzsgYls1XSA9IChieXRlKSAweDUwOyBiWzZdID0gKGJ5dGUpIDB4NTU7IGJbN10gPSAoYnl0ZSkgMHgwMDsKLSAgICAgICAgYls4XSA9IChieXRlKSAweDAyOyBiWzldID0gKGJ5dGUpIDB4RkI7Ci0gICAgICAgIGFzc2VydEVxdWFscygiKioyMSorMTcwMDU1NTAwMjAjIiwKLSAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuY2FsbGVkUGFydHlCQ0RUb1N0cmluZyhiLCAwLCAxMCkpOwotCi0gICAgICAgIGJbMF0gPSAoYnl0ZSkgMHg4MTsgYlsxXSA9IChieXRlKSAweDJBOyBiWzJdID0gKGJ5dGUpIDB4QTE7IGJbM10gPSAoYnl0ZSkgMHg3MTsKLSAgICAgICAgYls0XSA9IChieXRlKSAweDAwOyBiWzVdID0gKGJ5dGUpIDB4NTU7IGJbNl0gPSAoYnl0ZSkgMHgwNTsgYls3XSA9IChieXRlKSAweDIwOwotICAgICAgICBiWzhdID0gKGJ5dGUpIDB4RjA7Ci0gICAgICAgIGFzc2VydEVxdWFscygiKjIxKjE3MDA1NTUwMDIwIiwKLSAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuY2FsbGVkUGFydHlCQ0RUb1N0cmluZyhiLCAwLCA5KSk7Ci0KLSAgICAgICAgYlswXSA9IChieXRlKSAweDkxOyBiWzFdID0gKGJ5dGUpIDB4MkE7IGJbMl0gPSAoYnl0ZSkgMHhCMTsgYlszXSA9IChieXRlKSAweDcxOwotICAgICAgICBiWzRdID0gKGJ5dGUpIDB4MDA7IGJbNV0gPSAoYnl0ZSkgMHg1NTsgYls2XSA9IChieXRlKSAweDA1OyBiWzddID0gKGJ5dGUpIDB4MjA7Ci0gICAgICAgIGJbOF0gPSAoYnl0ZSkgMHhGMDsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCIqMjEjKzE3MDA1NTUwMDIwIiwKLSAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuY2FsbGVkUGFydHlCQ0RUb1N0cmluZyhiLCAwLCA5KSk7Ci0KLSAgICAgICAgYXNzZXJ0TnVsbChQaG9uZU51bWJlclV0aWxzLmV4dHJhY3ROZXR3b3JrUG9ydGlvbihudWxsKSk7Ci0gICAgICAgIGFzc2VydE51bGwoUGhvbmVOdW1iZXJVdGlscy5leHRyYWN0UG9zdERpYWxQb3J0aW9uKG51bGwpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShQaG9uZU51bWJlclV0aWxzLmNvbXBhcmUobnVsbCwgbnVsbCkpOwotICAgICAgICBhc3NlcnRGYWxzZShQaG9uZU51bWJlclV0aWxzLmNvbXBhcmUobnVsbCwgIjEyMyIpKTsKLSAgICAgICAgYXNzZXJ0RmFsc2UoUGhvbmVOdW1iZXJVdGlscy5jb21wYXJlKCIxMjMiLCBudWxsKSk7Ci0gICAgICAgIGFzc2VydE51bGwoUGhvbmVOdW1iZXJVdGlscy50b0NhbGxlcklETWluTWF0Y2gobnVsbCkpOwotICAgICAgICBhc3NlcnROdWxsKFBob25lTnVtYmVyVXRpbHMuZ2V0U3RyaXBwZWRSZXZlcnNlZChudWxsKSk7Ci0gICAgICAgIGFzc2VydE51bGwoUGhvbmVOdW1iZXJVdGlscy5zdHJpbmdGcm9tU3RyaW5nQW5kVE9BKG51bGwsIDEpKTsKLSAgICB9Ci0KLSAgICBAU21hbGxUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdEV4dHJhY3ROZXR3b3JrUG9ydGlvbkFsdCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBhc3NlcnRFcXVhbHMoCi0gICAgICAgICAgICAgICAgIisxNzAwNTU1NDE0MSIsCi0gICAgICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5leHRyYWN0TmV0d29ya1BvcnRpb25BbHQoIisxNzAwNTU1NDE0MSIpCi0gICAgICAgICk7Ci0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKAotICAgICAgICAgICAgICAgICIrMTcwMDU1NTQxNDEiLAotICAgICAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuZXh0cmFjdE5ldHdvcmtQb3J0aW9uQWx0KCIrMSAoNzAwKS41NTUtNDE0MSIpCi0gICAgICAgICk7Ci0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKAotICAgICAgICAgICAgICAgICIxNzAwNTU1NDE0MSIsCi0gICAgICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5leHRyYWN0TmV0d29ya1BvcnRpb25BbHQoIjEgKDcwMCkuNTU1LTQxNDEiKQotICAgICAgICApOwotCi0gICAgICAgIC8vIFRoaXMgbWF5IHNlZW0gd3JvbmcsIGJ1dCBpdCdzIHByb2JhYmx5IG9rCi0gICAgICAgIGFzc2VydEVxdWFscygKLSAgICAgICAgICAgICAgICAiMTcwMDU1NTQxNDEqIyIsCi0gICAgICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5leHRyYWN0TmV0d29ya1BvcnRpb25BbHQoIjEgKDcwMCkuNTU1LTQxNDEqIyIpCi0gICAgICAgICk7Ci0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKAotICAgICAgICAgICAgICAgICIxNzAwNTU1NDFOTiIsCi0gICAgICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5leHRyYWN0TmV0d29ya1BvcnRpb25BbHQoIjEgKDcwMCkuNTU1LTQxTk4iKQotICAgICAgICApOwotCi0gICAgICAgIGFzc2VydEVxdWFscygKLSAgICAgICAgICAgICAgICAiMTcwMDU1NTQxTk4iLAotICAgICAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuZXh0cmFjdE5ldHdvcmtQb3J0aW9uQWx0KCIxICg3MDApLjU1NS00MU5OLDEyMzQiKQotICAgICAgICApOwotCi0gICAgICAgIGFzc2VydEVxdWFscygKLSAgICAgICAgICAgICAgICAiMTcwMDU1NTQxTk4iLAotICAgICAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuZXh0cmFjdE5ldHdvcmtQb3J0aW9uQWx0KCIxICg3MDApLjU1NS00MU5OOzEyMzQiKQotICAgICAgICApOwotCi0gICAgICAgIC8vIEFuIE1NSSBzdHJpbmcgaXMgdW5wZXJ0ZXJiZWQsIGV2ZW4gdGhvdWdoIGl0IGNvbnRhaW5zIGEKLSAgICAgICAgLy8gKHZhbGlkIGluIHRoaXMgY2FzZSkgZW1iZWRkZWQgKwotICAgICAgICBhc3NlcnRFcXVhbHMoCi0gICAgICAgICAgICAgICAgIioqMjEqKisxNzAwNTU1NDE0MSMiLAotICAgICAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuZXh0cmFjdE5ldHdvcmtQb3J0aW9uQWx0KCIqKjIxKiorMTcwMDU1NTQxNDEjIikKLSAgICAgICAgKTsKLQotICAgICAgICBhc3NlcnRFcXVhbHMoCi0gICAgICAgICAgICAgICAgIiozMSMrNDQ3OTY2MTY0MjA4IiwKLSAgICAgICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLmV4dHJhY3ROZXR3b3JrUG9ydGlvbkFsdCgiKjMxIys0NDc5NjYxNjQyMDgiKQotICAgICAgICApOwotCi0gICAgICAgIGFzc2VydEVxdWFscygKLSAgICAgICAgICAgICAgICAiKjMxIys0NDc5NjYxNjQyMDgiLAotICAgICAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuZXh0cmFjdE5ldHdvcmtQb3J0aW9uQWx0KCIqMzEjICgrNDQpIDc5IDY2MTYgNDIwOCIpCi0gICAgICAgICk7Ci0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKCIiLCBQaG9uZU51bWJlclV0aWxzLmV4dHJhY3ROZXR3b3JrUG9ydGlvbkFsdCgiIikpOwotCi0gICAgICAgIGFzc2VydEVxdWFscygiIiwgUGhvbmVOdW1iZXJVdGlscy5leHRyYWN0TmV0d29ya1BvcnRpb25BbHQoIiwxMjM0IikpOwotCi0gICAgICAgIGFzc2VydE51bGwoUGhvbmVOdW1iZXJVdGlscy5leHRyYWN0TmV0d29ya1BvcnRpb25BbHQobnVsbCkpOwotICAgIH0KLQotICAgIEBTbWFsbFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0QigpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBhc3NlcnRFcXVhbHMoIiIsIFBob25lTnVtYmVyVXRpbHMuZXh0cmFjdFBvc3REaWFsUG9ydGlvbigiKzE3MDA1NTU0MTQxIikpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIiIsIFBob25lTnVtYmVyVXRpbHMuZXh0cmFjdFBvc3REaWFsUG9ydGlvbigiKzEgKDcwMCkuNTU1LTQxNDEiKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiIiwgUGhvbmVOdW1iZXJVdGlscy5leHRyYWN0UG9zdERpYWxQb3J0aW9uKCIrMSAoNzAwKS41NTUtNDFOTiIpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCIsMTIzNCIsIFBob25lTnVtYmVyVXRpbHMuZXh0cmFjdFBvc3REaWFsUG9ydGlvbigiKzEgKDcwMCkuNTU1LTQxTk4sMTIzNCIpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCI7MTIzNCIsIFBob25lTnVtYmVyVXRpbHMuZXh0cmFjdFBvc3REaWFsUG9ydGlvbigiKzEgKDcwMCkuNTU1LTQxTk47MTIzNCIpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCI7MTIzNCw7TiIsCi0gICAgICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5leHRyYWN0UG9zdERpYWxQb3J0aW9uKCIrMSAoNzAwKS41NTUtNDFOTjsxLTIuMzQgLDtOIikpOwotICAgIH0KLQotICAgIEBTbWFsbFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q29tcGFyZSgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICAvLyB0aGlzIGlzIG9kZAotICAgICAgICBhc3NlcnRGYWxzZShQaG9uZU51bWJlclV0aWxzLmNvbXBhcmUoIiIsICIiKSk7Ci0KLSAgICAgICAgYXNzZXJ0VHJ1ZShQaG9uZU51bWJlclV0aWxzLmNvbXBhcmUoIjkxMSIsICI5MTEiKSk7Ci0gICAgICAgIGFzc2VydEZhbHNlKFBob25lTnVtYmVyVXRpbHMuY29tcGFyZSgiOTExIiwgIjE4MDA1NTUwOTExIikpOwotICAgICAgICBhc3NlcnRUcnVlKFBob25lTnVtYmVyVXRpbHMuY29tcGFyZSgiNTU1NSIsICI1NTU1IikpOwotICAgICAgICBhc3NlcnRGYWxzZShQaG9uZU51bWJlclV0aWxzLmNvbXBhcmUoIjU1NTUiLCAiMTgwMDU1NTU1NTU1IikpOwotCi0gICAgICAgIGFzc2VydFRydWUoUGhvbmVOdW1iZXJVdGlscy5jb21wYXJlKCIrMTcwMDU1NTQxNDEiLCAiKzE3MDA1NTU0MTQxIikpOwotICAgICAgICBhc3NlcnRUcnVlKFBob25lTnVtYmVyVXRpbHMuY29tcGFyZSgiKzE3MDA1NTU0MTQxIiwgIisxICg3MDApLjU1NS00MTQxIikpOwotICAgICAgICBhc3NlcnRUcnVlKFBob25lTnVtYmVyVXRpbHMuY29tcGFyZSgiKzE3MDA1NTU0MTQxIiwgIisxICg3MDApLjU1NS00MTQxLDEyMzQiKSk7Ci0gICAgICAgIGFzc2VydFRydWUoUGhvbmVOdW1iZXJVdGlscy5jb21wYXJlKCIrMTcwMDU1NTQxNDEiLCAiMTcwMDU1NTQxNDEiKSk7Ci0gICAgICAgIGFzc2VydFRydWUoUGhvbmVOdW1iZXJVdGlscy5jb21wYXJlKCIrMTcwMDU1NTQxNDEiLCAiNzAwNTU1NDE0MSIpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShQaG9uZU51bWJlclV0aWxzLmNvbXBhcmUoIisxNzAwNTU1NDE0MSIsICI1NTU0MTQxIikpOwotICAgICAgICBhc3NlcnRUcnVlKFBob25lTnVtYmVyVXRpbHMuY29tcGFyZSgiMTcwMDU1NTQxNDEiLCAiNTU1NDE0MSIpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShQaG9uZU51bWJlclV0aWxzLmNvbXBhcmUoIisxNzAwNTU1NDE0MSIsICIwMTExNzAwNTU1NDE0MSIpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShQaG9uZU51bWJlclV0aWxzLmNvbXBhcmUoIisxNzAwNTU1NDE0MSIsICIwMDE3MDA1NTU0MTQxIikpOwotICAgICAgICBhc3NlcnRUcnVlKFBob25lTnVtYmVyVXRpbHMuY29tcGFyZSgiMTcwMDU1NTQxNDEiLCAiMDAxNzAwNTU1NDE0MSIpKTsKLQotCi0gICAgICAgIGFzc2VydFRydWUoUGhvbmVOdW1iZXJVdGlscy5jb21wYXJlKCIrMTcwMDU1NTQxNDEiLCAiKiozMSMrMTcwMDU1NTQxNDEiKSk7Ci0KLSAgICAgICAgYXNzZXJ0RmFsc2UoUGhvbmVOdW1iZXJVdGlscy5jb21wYXJlKCIrMSA5OTkgNzAwNTU1NDE0MSIsICIrMSA3MDA1NTU0MTQxIikpOwotICAgICAgICBhc3NlcnRUcnVlKFBob25lTnVtYmVyVXRpbHMuY29tcGFyZSgiMDExIDEgNzAwNTU1NDE0MSIsICI3MDA1NTU0MTQxIikpOwotCi0gICAgICAgIGFzc2VydEZhbHNlKFBob25lTnVtYmVyVXRpbHMuY29tcGFyZSgiMDExIDExIDcwMDU1NTQxNDEiLCAiKzE3MDA1NTU0MTQxIikpOwotCi0gICAgICAgIGFzc2VydEZhbHNlKFBob25lTnVtYmVyVXRpbHMuY29tcGFyZSgiKzE3MDA1NTU0MTQxIiwgIjcwODU4ODIzMDAiKSk7Ci0KLSAgICAgICAgYXNzZXJ0VHJ1ZShQaG9uZU51bWJlclV0aWxzLmNvbXBhcmUoIis0NCAyMDcgNzkyIDM0OTAiLCAiMCAyMDcgNzkyIDM0OTAiKSk7Ci0KLSAgICAgICAgYXNzZXJ0RmFsc2UoUGhvbmVOdW1iZXJVdGlscy5jb21wYXJlKCIrNDQgMjA3IDc5MiAzNDkwIiwgIjAwIDIwNyA3OTIgMzQ5MCIpKTsKLSAgICAgICAgYXNzZXJ0RmFsc2UoUGhvbmVOdW1iZXJVdGlscy5jb21wYXJlKCIrNDQgMjA3IDc5MiAzNDkwIiwgIjAxMSAyMDcgNzkyIDM0OTAiKSk7Ci0KLSAgICAgICAgLyoqKioqIEZJWE1FJ3MgKioqKioqLwotICAgICAgICAvLwotICAgICAgICAvLyBNTUkgaGVhZGVyIHNob3VsZCBiZSBpZ25vcmVkCi0gICAgICAgIGFzc2VydEZhbHNlKFBob25lTnVtYmVyVXRpbHMuY29tcGFyZSgiKzE3MDA1NTU0MTQxIiwgIioqMzEjMTcwMDU1NTQxNDEiKSk7Ci0KLSAgICAgICAgLy8gSXQncyB0b28gYmFkIHRoaXMgaXMgZmFsc2UKLSAgICAgICAgLy8gKzQ0ICgwKSAyMDcgNzkyIDM0OTAgaXMgbm90IGEgZGlhbGFibGUgbnVtYmVyCi0gICAgICAgIC8vIGJ1dCBpdCBpcyBjb21tb25seSBob3cgRXVyb3BlYW4gcGhvbmUgbnVtYmVycyBhcmUgd3JpdHRlbgotICAgICAgICBhc3NlcnRGYWxzZShQaG9uZU51bWJlclV0aWxzLmNvbXBhcmUoIis0NCAyMDcgNzkyIDM0OTAiLCAiKzQ0ICgwKSAyMDcgNzkyIDM0OTAiKSk7Ci0KLSAgICAgICAgLy8gVGhlIGphcGFuZXNlIGludGVybmF0aW9uYWwgcHJlZml4LCBmb3IgZXhhbXBsZSwgbWVzc2VzIHVzIHVwCi0gICAgICAgIC8vIEJ1dCB3aG8gdXNlcyBhIEdTTSBwaG9uZSBpbiBKYXBhbj8KLSAgICAgICAgYXNzZXJ0RmFsc2UoUGhvbmVOdW1iZXJVdGlscy5jb21wYXJlKCIrNDQgMjA3IDc5MiAzNDkwIiwgIjAxMCA0NCAyMDcgNzkyIDM0OTAiKSk7Ci0KLSAgICAgICAgLy8gVGhlIEF1c3RyYWxpYW4gb25lIG1lc3NlcyB1cyB1cCB0b28KLSAgICAgICAgYXNzZXJ0RmFsc2UoUGhvbmVOdW1iZXJVdGlscy5jb21wYXJlKCIrNDQgMjA3IDc5MiAzNDkwIiwgIjAwMTEgNDQgMjA3IDc5MiAzNDkwIikpOwotCi0gICAgICAgIC8vIFRoZSBSdXNzaWFuIHRydW5rIHByZWZpeCBtZXNzZXMgdXMgdXAsIGFzIGRvZXMgY3VycmVudAotICAgICAgICAvLyBSdXNzaWFuIGFyZWEgY29kZXMgKHdoaWNoIGJlaW4gd2l0aCAwKQotCi0gICAgICAgIGFzc2VydEZhbHNlKFBob25lTnVtYmVyVXRpbHMuY29tcGFyZSgiKzcoMDk1KTkxMDA3NjYiLCAiOCgwOTUpOTEwMDc2NiIpKTsKLQotICAgICAgICAvLyA0NDQgaXMgbm90IGEgdmFsaWQgY291bnRyeSBjb2RlLCBidXQKLSAgICAgICAgLy8gbWF0Y2hJbnRsUHJlZml4QW5kQ0MgZG9lc250IGtub3cgdGhpcwotICAgICAgICBhc3NlcnRUcnVlKFBob25lTnVtYmVyVXRpbHMuY29tcGFyZSgiKzQ0NCAyMDcgNzkyIDM0OTAiLCAiMCAyMDcgNzkyIDM0OTAiKSk7Ci0KLSAgICAgICAgLy8gY29tcGFyZSBTTVMgc2hvcnQgY29kZQotICAgICAgICBhc3NlcnRUcnVlKFBob25lTnVtYmVyVXRpbHMuY29tcGFyZSgiNDA0LTA0IiwgIjQwNDA0IikpOwotICAgIH0KLQotCi0gICAgQFNtYWxsVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RUb0NhbGxlcklESW5kZXhhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGFzc2VydEVxdWFscygiMTQxNDU1NSIsIFBob25lTnVtYmVyVXRpbHMudG9DYWxsZXJJRE1pbk1hdGNoKCIxNzAwNTU1NDE0MSIpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCIxNDE0NTU1IiwgUGhvbmVOdW1iZXJVdGlscy50b0NhbGxlcklETWluTWF0Y2goIjEtNzAwLTU1NS00MTQxIikpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIjE0MTQ1NTUiLCBQaG9uZU51bWJlclV0aWxzLnRvQ2FsbGVySURNaW5NYXRjaCgiMS03MDAtNTU1LTQxNDEsMTIzNCIpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCIxNDE0NTU1IiwgUGhvbmVOdW1iZXJVdGlscy50b0NhbGxlcklETWluTWF0Y2goIjEtNzAwLTU1NS00MTQxOzEyMzQiKSk7Ci0KLSAgICAgICAgLy90aGlzIHNlZW1zIHdyb25nLCBvciBhdCBsZWFzdCB1c2VsZXNzCi0gICAgICAgIGFzc2VydEVxdWFscygiTk4xNDU1NSIsIFBob25lTnVtYmVyVXRpbHMudG9DYWxsZXJJRE1pbk1hdGNoKCIxLTcwMC01NTUtNDFOTiIpKTsKLQotICAgICAgICAvLzxzaHJ1Zz4gLS0gdGhlc2UgYXJlIGFsbCBub3QgdXNlZnVsLCBidXQgbm90IHRlcnJpYmx5IHdyb25nCi0gICAgICAgIGFzc2VydEVxdWFscygiIiwgUGhvbmVOdW1iZXJVdGlscy50b0NhbGxlcklETWluTWF0Y2goIiIpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCIwMDMyIiwgUGhvbmVOdW1iZXJVdGlscy50b0NhbGxlcklETWluTWF0Y2goIjIzMDAiKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiMDAzMisiLCBQaG9uZU51bWJlclV0aWxzLnRvQ2FsbGVySURNaW5NYXRjaCgiKzIzMDAiKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiIzEzMCMqIiwgUGhvbmVOdW1iZXJVdGlscy50b0NhbGxlcklETWluTWF0Y2goIiojMDMxIyIpKTsKLSAgICB9Ci0KLSAgICBAU21hbGxUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdEdldEluZGV4YWJsZSgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBhc3NlcnRFcXVhbHMoIjE0MTQ1NTUwMDcxIiwgUGhvbmVOdW1iZXJVdGlscy5nZXRTdHJpcHBlZFJldmVyc2VkKCIxLTcwMC01NTUtNDE0MSIpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCIxNDE0NTU1MDA3MSIsIFBob25lTnVtYmVyVXRpbHMuZ2V0U3RyaXBwZWRSZXZlcnNlZCgiMS03MDAtNTU1LTQxNDEsMTIzNCIpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCIxNDE0NTU1MDA3MSIsIFBob25lTnVtYmVyVXRpbHMuZ2V0U3RyaXBwZWRSZXZlcnNlZCgiMS03MDAtNTU1LTQxNDE7MTIzNCIpKTsKLQotICAgICAgICAvL3RoaXMgc2VlbXMgd3JvbmcsIG9yIGF0IGxlYXN0IHVzZWxlc3MKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJOTjE0NTU1MDA3MSIsIFBob25lTnVtYmVyVXRpbHMuZ2V0U3RyaXBwZWRSZXZlcnNlZCgiMS03MDAtNTU1LTQxTk4iKSk7Ci0KLSAgICAgICAgLy88c2hydWc+IC0tIHRoZXNlIGFyZSBhbGwgbm90IHVzZWZ1bCwgYnV0IG5vdCB0ZXJyaWJseSB3cm9uZwotICAgICAgICBhc3NlcnRFcXVhbHMoIiIsIFBob25lTnVtYmVyVXRpbHMuZ2V0U3RyaXBwZWRSZXZlcnNlZCgiIikpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIjAwMzIiLCBQaG9uZU51bWJlclV0aWxzLmdldFN0cmlwcGVkUmV2ZXJzZWQoIjIzMDAiKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiMDAzMisiLCBQaG9uZU51bWJlclV0aWxzLmdldFN0cmlwcGVkUmV2ZXJzZWQoIisyMzAwIikpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIiMxMzAjKiIsIFBob25lTnVtYmVyVXRpbHMuZ2V0U3RyaXBwZWRSZXZlcnNlZCgiKiMwMzEjIikpOwotICAgIH0KLQotICAgIEBTbWFsbFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0TmFucEZvcm1hdHRpbmcoKSB7Ci0gICAgICAgIFNwYW5uYWJsZVN0cmluZ0J1aWxkZXIgbnVtYmVyID0gbmV3IFNwYW5uYWJsZVN0cmluZ0J1aWxkZXIoKTsKLSAgICAgICAgbnVtYmVyLmFwcGVuZCgiODAwNTU1MTIxMiIpOwotICAgICAgICBQaG9uZU51bWJlclV0aWxzLmZvcm1hdE5hbnBOdW1iZXIobnVtYmVyKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCI4MDAtNTU1LTEyMTIiLCBudW1iZXIudG9TdHJpbmcoKSk7Ci0KLSAgICAgICAgbnVtYmVyLmNsZWFyKCk7Ci0gICAgICAgIG51bWJlci5hcHBlbmQoIjgwMDU1NTEyMSIpOwotICAgICAgICBQaG9uZU51bWJlclV0aWxzLmZvcm1hdE5hbnBOdW1iZXIobnVtYmVyKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCI4MDAtNTU1LTEyMSIsIG51bWJlci50b1N0cmluZygpKTsKLQotICAgICAgICBudW1iZXIuY2xlYXIoKTsKLSAgICAgICAgbnVtYmVyLmFwcGVuZCgiNTU1LTEyMTIiKTsKLSAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5mb3JtYXROYW5wTnVtYmVyKG51bWJlcik7Ci0gICAgICAgIGFzc2VydEVxdWFscygiNTU1LTEyMTIiLCBudW1iZXIudG9TdHJpbmcoKSk7Ci0KLSAgICAgICAgbnVtYmVyLmNsZWFyKCk7Ci0gICAgICAgIG51bWJlci5hcHBlbmQoIjgwMC01NTUxMiIpOwotICAgICAgICBQaG9uZU51bWJlclV0aWxzLmZvcm1hdE5hbnBOdW1iZXIobnVtYmVyKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCI4MDAtNTU1LTEyIiwgbnVtYmVyLnRvU3RyaW5nKCkpOwotCi0gICAgICAgIG51bWJlci5jbGVhcigpOwotICAgICAgICBudW1iZXIuYXBwZW5kKCI0NjY0NSIpOwotICAgICAgICBQaG9uZU51bWJlclV0aWxzLmZvcm1hdE5hbnBOdW1iZXIobnVtYmVyKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCI0NjY0NSIsIG51bWJlci50b1N0cmluZygpKTsKLSAgICB9Ci0KLSAgICBAU21hbGxUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdENvbnZlcnRLZXlwYWRMZXR0ZXJzVG9EaWdpdHMoKSB7Ci0gICAgICAgIGFzc2VydEVxdWFscygiMS04MDAtNDY2NC00MTEiLAotICAgICAgICAgICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5jb252ZXJ0S2V5cGFkTGV0dGVyc1RvRGlnaXRzKCIxLTgwMC1HT09HLTQxMSIpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCIxODAwNDY2NDQxMSIsCi0gICAgICAgICAgICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLmNvbnZlcnRLZXlwYWRMZXR0ZXJzVG9EaWdpdHMoIjE4MDBHT09HNDExIikpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIjEtODAwLTQ2Ni00NDExIiwKLSAgICAgICAgICAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuY29udmVydEtleXBhZExldHRlcnNUb0RpZ2l0cygiMS04MDAtNDY2LTQ0MTEiKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiMTgwMDQ2NjQ0MTEiLAotICAgICAgICAgICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5jb252ZXJ0S2V5cGFkTGV0dGVyc1RvRGlnaXRzKCIxODAwNDY2NDQxMSIpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCIyMjItMzMzLTQ0NC01NTUtNjY2LTc3NzctODg4LTk5OTkiLAotICAgICAgICAgICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5jb252ZXJ0S2V5cGFkTGV0dGVyc1RvRGlnaXRzKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQUJDLURFRi1HSEktSktMLU1OTy1QUVJTLVRVVi1XWFlaIikpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIjIyMi0zMzMtNDQ0LTU1NS02NjYtNzc3Ny04ODgtOTk5OSIsCi0gICAgICAgICAgICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLmNvbnZlcnRLZXlwYWRMZXR0ZXJzVG9EaWdpdHMoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhYmMtZGVmLWdoaS1qa2wtbW5vLXBxcnMtdHV2LXd4eXoiKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiKDgwMCkgMjIyLTMzMzQiLAotICAgICAgICAgICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5jb252ZXJ0S2V5cGFkTGV0dGVyc1RvRGlnaXRzKCIoODAwKSBBQkMtREVGRyIpKTsKLSAgICB9Ci0KLSAgICAvLyBUbyBydW4gdGhpcyB0ZXN0LCB0aGUgZGV2aWNlIGhhcyB0byBiZSByZWdpc3RlcmVkIHdpdGggbmV0d29yawotICAgIHB1YmxpYyB2b2lkIHRlc3RDaGVja0FuZFByb2Nlc3NQbHVzQ29kZSgpIHsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCIwMTE4NDc1Nzk3MDAwIiwKLSAgICAgICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLmNkbWFDaGVja0FuZFByb2Nlc3NQbHVzQ29kZSgiKzg0NzU3OTcwMDAiKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiMTg0NzU3OTcwMDAiLAotICAgICAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuY2RtYUNoZWNrQW5kUHJvY2Vzc1BsdXNDb2RlKCIrMTg0NzU3OTcwMDAiKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiMDExMTIzNDU2NyIsCi0gICAgICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5jZG1hQ2hlY2tBbmRQcm9jZXNzUGx1c0NvZGUoIisxMjM0NTY3IikpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIjAxMTIzNDU2NzAwMDAwIiwKLSAgICAgICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLmNkbWFDaGVja0FuZFByb2Nlc3NQbHVzQ29kZSgiKzIzNDU2NzAwMDAwIikpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIjAxMTExODc1NzY3ODAwIiwKLSAgICAgICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLmNkbWFDaGVja0FuZFByb2Nlc3NQbHVzQ29kZSgiKzExODc1NzY3ODAwIikpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIjg0NzU3OTcwMDAsMTg0NzUyMzE3NTMiLAotICAgICAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuY2RtYUNoZWNrQW5kUHJvY2Vzc1BsdXNDb2RlKCI4NDc1Nzk3MDAwLCsxODQ3NTIzMTc1MyIpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCIwMTE4NDc1Nzk3MDAwLDE4NDc1MjMxNzUzIiwKLSAgICAgICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLmNkbWFDaGVja0FuZFByb2Nlc3NQbHVzQ29kZSgiKzg0NzU3OTcwMDAsKzE4NDc1MjMxNzUzIikpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIjg0NzU3OTcwMDA7MDExODQ2OTMxMjM0NSIsCi0gICAgICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5jZG1hQ2hlY2tBbmRQcm9jZXNzUGx1c0NvZGUoIjg0NzU3OTcwMDA7Kzg0NjkzMTIzNDUiKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiODQ3NTc5NzAwMCwwMTExMjM0NTY3IiwKLSAgICAgICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLmNkbWFDaGVja0FuZFByb2Nlc3NQbHVzQ29kZSgiODQ3NTc5NzAwMCwrMTIzNDU2NyIpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCI4NDc1OTcwMDA7MDExMTE4NzU3NjcwMDAiLAotICAgICAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuY2RtYUNoZWNrQW5kUHJvY2Vzc1BsdXNDb2RlKCI4NDc1OTcwMDA7KzExODc1NzY3MDAwIikpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIjg0NzU3OTcwMDAsLDAxMTg0NjkzMTIzNDUiLAotICAgICAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuY2RtYUNoZWNrQW5kUHJvY2Vzc1BsdXNDb2RlKCI4NDc1Nzk3MDAwLCwrODQ2OTMxMjM0NSIpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCI4NDc1Nzk3MDAwOywwMTE4NDY5MzEyMzQ1IiwKLSAgICAgICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLmNkbWFDaGVja0FuZFByb2Nlc3NQbHVzQ29kZSgiODQ3NTc5NzAwMDssKzg0NjkzMTIzNDUiKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiODQ3NTc5NzAwMCw7MTg0NzUyMzE3NTMiLAotICAgICAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuY2RtYUNoZWNrQW5kUHJvY2Vzc1BsdXNDb2RlKCI4NDc1Nzk3MDAwLDsrMTg0NzUyMzE3NTMiKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiODQ3NTc5NzAwMDssMDExMTE4NzU3NjcwMDAiLAotICAgICAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuY2RtYUNoZWNrQW5kUHJvY2Vzc1BsdXNDb2RlKCI4NDc1Nzk3MDAwOywrMTE4NzU3NjcwMDAiKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiODQ3NTc5NzAwMCw7MDExMTE4NzU3NjcwMDAiLAotICAgICAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuY2RtYUNoZWNrQW5kUHJvY2Vzc1BsdXNDb2RlKCI4NDc1Nzk3MDAwLDsrMTE4NzU3NjcwMDAiKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiODQ3NTc5NzAwMCwsLDAxMTExODc1NzY3MDAwIiwKLSAgICAgICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLmNkbWFDaGVja0FuZFByb2Nlc3NQbHVzQ29kZSgiODQ3NTc5NzAwMCwsLCsxMTg3NTc2NzAwMCIpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCI4NDc1Nzk3MDAwOywsMDExMTE4NzU3NjcwMDAiLAotICAgICAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuY2RtYUNoZWNrQW5kUHJvY2Vzc1BsdXNDb2RlKCI4NDc1Nzk3MDAwOywsKzExODc1NzY3MDAwIikpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIis7LDg0NzU3OTcwMDAiLAotICAgICAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuY2RtYUNoZWNrQW5kUHJvY2Vzc1BsdXNDb2RlKCIrOyw4NDc1Nzk3MDAwIikpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIjg0NzU3OTcwMDAsIiwKLSAgICAgICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLmNkbWFDaGVja0FuZFByb2Nlc3NQbHVzQ29kZSgiODQ3NTc5NzAwMCwiKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiODQ3KzU3OS03MDAwIiwKLSAgICAgICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLmNkbWFDaGVja0FuZFByb2Nlc3NQbHVzQ29kZSgiODQ3KzU3OS03MDAwIikpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIiw4NDc1Nzk3MDAwIiwKLSAgICAgICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLmNkbWFDaGVja0FuZFByb2Nlc3NQbHVzQ29kZSgiLDg0NzU3OTcwMDAiKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiOzs4NDc1Nzk3MDAwLCwiLAotICAgICAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuY2RtYUNoZWNrQW5kUHJvY2Vzc1BsdXNDb2RlKCI7Ozg0NzU3OTcwMDAsLCIpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCIrdGhpcytpcyR3ZWlyZDssKyIsCi0gICAgICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5jZG1hQ2hlY2tBbmRQcm9jZXNzUGx1c0NvZGUoIit0aGlzK2lzJHdlaXJkOywrIikpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIiIsCi0gICAgICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5jZG1hQ2hlY2tBbmRQcm9jZXNzUGx1c0NvZGUoIiIpKTsKLSAgICAgICAgYXNzZXJ0TnVsbChQaG9uZU51bWJlclV0aWxzLmNkbWFDaGVja0FuZFByb2Nlc3NQbHVzQ29kZShudWxsKSk7Ci0gICAgfQotCi0gICAgQFNtYWxsVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RDaGVja0FuZFByb2Nlc3NQbHVzQ29kZUJ5TnVtYmVyRm9ybWF0KCkgewotICAgICAgICBhc3NlcnRFcXVhbHMoIjE4NDc1Nzk3MDAwIiwKLSAgICAgICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLmNkbWFDaGVja0FuZFByb2Nlc3NQbHVzQ29kZUJ5TnVtYmVyRm9ybWF0KCIrMTg0NzU3OTcwMDAiLAotICAgICAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuRk9STUFUX05BTlAsUGhvbmVOdW1iZXJVdGlscy5GT1JNQVRfTkFOUCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIisxODQ3NTc5NzAwMCIsCi0gICAgICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5jZG1hQ2hlY2tBbmRQcm9jZXNzUGx1c0NvZGVCeU51bWJlckZvcm1hdCgiKzE4NDc1Nzk3MDAwIiwKLSAgICAgICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLkZPUk1BVF9OQU5QLFBob25lTnVtYmVyVXRpbHMuRk9STUFUX0pBUEFOKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiKzE4NDc1Nzk3MDAwIiwKLSAgICAgICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLmNkbWFDaGVja0FuZFByb2Nlc3NQbHVzQ29kZUJ5TnVtYmVyRm9ybWF0KCIrMTg0NzU3OTcwMDAiLAotICAgICAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuRk9STUFUX05BTlAsUGhvbmVOdW1iZXJVdGlscy5GT1JNQVRfVU5LTk9XTikpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIisxODQ3NTc5NzAwMCIsCi0gICAgICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5jZG1hQ2hlY2tBbmRQcm9jZXNzUGx1c0NvZGVCeU51bWJlckZvcm1hdCgiKzE4NDc1Nzk3MDAwIiwKLSAgICAgICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLkZPUk1BVF9KQVBBTixQaG9uZU51bWJlclV0aWxzLkZPUk1BVF9KQVBBTikpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIisxODQ3NTc5NzAwMCIsCi0gICAgICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5jZG1hQ2hlY2tBbmRQcm9jZXNzUGx1c0NvZGVCeU51bWJlckZvcm1hdCgiKzE4NDc1Nzk3MDAwIiwKLSAgICAgICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLkZPUk1BVF9VTktOT1dOLFBob25lTnVtYmVyVXRpbHMuRk9STUFUX1VOS05PV04pKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBCYXNpYyBjaGVja3MgZm9yIHRoZSBWb2ljZU1haWwgbnVtYmVyLgotICAgICAqLwotICAgIEBTbWFsbFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0V2l0aE51bWJlck5vdEVxdWFsVG9Wb2ljZU1haWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgYXNzZXJ0RmFsc2UoUGhvbmVOdW1iZXJVdGlscy5pc1ZvaWNlTWFpbE51bWJlcigiOTExIikpOwotICAgICAgICBhc3NlcnRGYWxzZShQaG9uZU51bWJlclV0aWxzLmlzVm9pY2VNYWlsTnVtYmVyKCJ0ZWw6OTExIikpOwotICAgICAgICBhc3NlcnRGYWxzZShQaG9uZU51bWJlclV0aWxzLmlzVm9pY2VNYWlsTnVtYmVyKCIrMTgwMDEyMzQ1NjciKSk7Ci0gICAgICAgIGFzc2VydEZhbHNlKFBob25lTnVtYmVyVXRpbHMuaXNWb2ljZU1haWxOdW1iZXIoIiIpKTsKLSAgICAgICAgYXNzZXJ0RmFsc2UoUGhvbmVOdW1iZXJVdGlscy5pc1ZvaWNlTWFpbE51bWJlcihudWxsKSk7Ci0gICAgICAgIC8vIFRoaXMgdGVzdCBmYWlscyBvbiBhIGRldmljZSB3aXRob3V0IGEgc2ltIGNhcmQKLSAgICAgICAgLypUZWxlcGhvbnlNYW5hZ2VyIG1UZWxlcGhvbnlNYW5hZ2VyID0KLSAgICAgICAgICAgIChUZWxlcGhvbnlNYW5hZ2VyKWdldENvbnRleHQoKS5nZXRTeXN0ZW1TZXJ2aWNlKENvbnRleHQuVEVMRVBIT05ZX1NFUlZJQ0UpOwotICAgICAgICBTdHJpbmcgbVZvaWNlTWFpbE51bWJlciA9IG1UZWxlcGhvbnlNYW5hZ2VyLmdldERlZmF1bHQoKS5nZXRWb2ljZU1haWxOdW1iZXIoKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShQaG9uZU51bWJlclV0aWxzLmlzVm9pY2VNYWlsTnVtYmVyKG1Wb2ljZU1haWxOdW1iZXIpKTsKLSAgICAgICAgKi8KLSAgICB9Ci19CmRpZmYgLS1naXQgYS90ZWxlcGhvbnkvdGVzdHMvdGVsZXBob255dGVzdHMvc3JjL2FuZHJvaWQvdGVsZXBob255L1Bob25lTnVtYmVyV2F0Y2hlclRlc3QuamF2YSBiL3RlbGVwaG9ueS90ZXN0cy90ZWxlcGhvbnl0ZXN0cy9zcmMvYW5kcm9pZC90ZWxlcGhvbnkvUGhvbmVOdW1iZXJXYXRjaGVyVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OGVhZWNkLi4wMDAwMDAwCi0tLSBhL3RlbGVwaG9ueS90ZXN0cy90ZWxlcGhvbnl0ZXN0cy9zcmMvYW5kcm9pZC90ZWxlcGhvbnkvUGhvbmVOdW1iZXJXYXRjaGVyVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255OwotCi1pbXBvcnQgYW5kcm9pZC50ZWxlcGhvbnkuUGhvbmVOdW1iZXJGb3JtYXR0aW5nVGV4dFdhdGNoZXI7Ci1pbXBvcnQgYW5kcm9pZC50ZXN0LnN1aXRlYnVpbGRlci5hbm5vdGF0aW9uLlNtYWxsVGVzdDsKLWltcG9ydCBhbmRyb2lkLnRleHQuU2VsZWN0aW9uOwotaW1wb3J0IGFuZHJvaWQudGV4dC5TcGFubmFibGVTdHJpbmdCdWlsZGVyOwotaW1wb3J0IGFuZHJvaWQudGV4dC5UZXh0V2F0Y2hlcjsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotcHVibGljIGNsYXNzIFBob25lTnVtYmVyV2F0Y2hlclRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0gICAgQFNtYWxsVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RIeXBoZW5hdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBTcGFubmFibGVTdHJpbmdCdWlsZGVyIG51bWJlciA9IG5ldyBTcGFubmFibGVTdHJpbmdCdWlsZGVyKCk7Ci0gICAgICAgIFRleHRXYXRjaGVyIHR3ID0gbmV3IFBob25lTnVtYmVyRm9ybWF0dGluZ1RleHRXYXRjaGVyKCk7Ci0gICAgICAgIG51bWJlci5hcHBlbmQoIjU1NS0xMjEyIik7Ci0gICAgICAgIC8vIE1vdmUgdGhlIGN1cnNvciB0byB0aGUgbGVmdCBlZGdlCi0gICAgICAgIFNlbGVjdGlvbi5zZXRTZWxlY3Rpb24obnVtYmVyLCAwKTsKLSAgICAgICAgdHcuYmVmb3JlVGV4dENoYW5nZWQobnVtYmVyLCAwLCAwLCAxKTsKLSAgICAgICAgLy8gSW5zZXJ0IGFuIDggYXQgdGhlIGJlZ2lubmluZwotICAgICAgICBudW1iZXIuaW5zZXJ0KDAsICI4Iik7Ci0gICAgICAgIHR3LmFmdGVyVGV4dENoYW5nZWQobnVtYmVyKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCI4NTUtNTEyLTEyIiwgbnVtYmVyLnRvU3RyaW5nKCkpOwotICAgIH0KLSAgICAKLSAgICBAU21hbGxUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdEh5cGhlbkRlbGV0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIFNwYW5uYWJsZVN0cmluZ0J1aWxkZXIgbnVtYmVyID0gbmV3IFNwYW5uYWJsZVN0cmluZ0J1aWxkZXIoKTsKLSAgICAgICAgVGV4dFdhdGNoZXIgdHcgPSBuZXcgUGhvbmVOdW1iZXJGb3JtYXR0aW5nVGV4dFdhdGNoZXIoKTsKLSAgICAgICAgbnVtYmVyLmFwcGVuZCgiNTU1LTEyMTIiKTsKLSAgICAgICAgLy8gTW92ZSB0aGUgY3Vyc29yIHRvIGFmdGVyIHRoZSBoeXBoZW4KLSAgICAgICAgU2VsZWN0aW9uLnNldFNlbGVjdGlvbihudW1iZXIsIDQpOwotICAgICAgICAvLyBEZWxldGUgdGhlIGh5cGhlbgotICAgICAgICB0dy5iZWZvcmVUZXh0Q2hhbmdlZChudW1iZXIsIDMsIDEsIDApOwotICAgICAgICBudW1iZXIuZGVsZXRlKDMsIDQpOwotICAgICAgICB0dy5hZnRlclRleHRDaGFuZ2VkKG51bWJlcik7Ci0gICAgICAgIC8vIE1ha2Ugc3VyZSB0aGF0IGl0IGRlbGV0ZWQgdGhlIGNoYXJhY3RlciBiZWZvcmUgdGhlIGh5cGhlbiAKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCI1NTEtMjEyIiwgbnVtYmVyLnRvU3RyaW5nKCkpOwotICAgICAgICAKLSAgICAgICAgLy8gTWFrZSBzdXJlIGl0IGRlYWxzIHdpdGggbGVmdCBlZGdlIGJvdW5kYXJ5IGNhc2UKLSAgICAgICAgbnVtYmVyLmluc2VydCgwLCAiLSIpOwotICAgICAgICBTZWxlY3Rpb24uc2V0U2VsZWN0aW9uKG51bWJlciwgMSk7Ci0gICAgICAgIHR3LmJlZm9yZVRleHRDaGFuZ2VkKG51bWJlciwgMCwgMSwgMCk7Ci0gICAgICAgIG51bWJlci5kZWxldGUoMCwgMSk7Ci0gICAgICAgIHR3LmFmdGVyVGV4dENoYW5nZWQobnVtYmVyKTsKLSAgICAgICAgLy8gTWFrZSBzdXJlIHRoYXQgaXQgZGVsZXRlZCB0aGUgY2hhcmFjdGVyIGJlZm9yZSB0aGUgaHlwaGVuIAotICAgICAgICBhc3NlcnRFcXVhbHMoIjU1MS0yMTIiLCBudW1iZXIudG9TdHJpbmcoKSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdGVsZXBob255L3Rlc3RzL3RlbGVwaG9ueXRlc3RzL3NyYy9jb20vYW5kcm9pZC9mcmFtZXdvcmtzL3RlbGVwaG9ueXRlc3RzL1RlbGVwaG9ueU1vY2tSaWxUZXN0UnVubmVyLmphdmEgYi90ZWxlcGhvbnkvdGVzdHMvdGVsZXBob255dGVzdHMvc3JjL2NvbS9hbmRyb2lkL2ZyYW1ld29ya3MvdGVsZXBob255dGVzdHMvVGVsZXBob255TW9ja1JpbFRlc3RSdW5uZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MTkyZjU3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVsZXBob255L3Rlc3RzL3RlbGVwaG9ueXRlc3RzL3NyYy9jb20vYW5kcm9pZC9mcmFtZXdvcmtzL3RlbGVwaG9ueXRlc3RzL1RlbGVwaG9ueU1vY2tSaWxUZXN0UnVubmVyLmphdmEKQEAgLTAsMCArMSw5MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLmZyYW1ld29ya3MudGVsZXBob255dGVzdHM7CisKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKKworaW1wb3J0IGFuZHJvaWQudGVzdC5JbnN0cnVtZW50YXRpb25UZXN0UnVubmVyOworaW1wb3J0IGFuZHJvaWQudGVzdC5JbnN0cnVtZW50YXRpb25UZXN0U3VpdGU7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CisKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuUmlsQ2hhbm5lbDsKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkubW9ja3JpbC5Nb2NrUmlsVGVzdDsKKworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7CisKK3B1YmxpYyBjbGFzcyBUZWxlcGhvbnlNb2NrUmlsVGVzdFJ1bm5lciBleHRlbmRzIEluc3RydW1lbnRhdGlvblRlc3RSdW5uZXIgeworCisgICAgcHVibGljIFJpbENoYW5uZWwgbU1vY2tSaWxDaGFubmVsOworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFRlc3RTdWl0ZSBnZXRBbGxUZXN0cygpIHsKKyAgICAgICAgbG9nKCJnZXRBbGxUZXN0cyBFIik7CisgICAgICAgIFRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBJbnN0cnVtZW50YXRpb25UZXN0U3VpdGUodGhpcyk7CisgICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShNb2NrUmlsVGVzdC5jbGFzcyk7CisgICAgICAgIGxvZygiZ2V0QWxsVGVzdHMgWCIpOworICAgICAgICByZXR1cm4gc3VpdGU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIENsYXNzTG9hZGVyIGdldExvYWRlcigpIHsKKyAgICAgICAgbG9nKCJnZXRMb2FkZXIgRVgiKTsKKyAgICAgICAgcmV0dXJuIFRlbGVwaG9ueU1vY2tSaWxUZXN0UnVubmVyLmNsYXNzLmdldENsYXNzTG9hZGVyKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb25DcmVhdGUoQnVuZGxlIGljaWNsZSkgeworICAgICAgICBsb2coIm9uQ3JlYXRlIEUiKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG1Nb2NrUmlsQ2hhbm5lbCA9IFJpbENoYW5uZWwubWFrZVJpbENoYW5uZWwoKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjYXRjaCBibG9jaworICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgfQorICAgICAgICBsb2coIm9uQ3JlYXRlIFgiKTsKKworICAgICAgICBzdXBlci5vbkNyZWF0ZShpY2ljbGUpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9uRGVzdHJveSgpIHsKKyAgICAgICAgLy8gSSd2ZSBub3Qgc2VlbiB0aGlzIGNhbGxlZAorICAgICAgICBsb2coIm9uRGVzdHJveSBFWCIpOworICAgICAgICBzdXBlci5vbkRlc3Ryb3koKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvblN0YXJ0KCkgeworICAgICAgICAvLyBDYWxsZWQgd2hlbiB0aGUgaW5zdHJ1bWVudGF0aW9uIHRocmVhZCBpcyBzdGFydGVkLgorICAgICAgICAvLyBBdCB0aGUgbW9tZW50IHdlIGRvbid0IG5lZWQgdGhlIHRocmVhZCBzbyByZXR1cm4KKyAgICAgICAgLy8gd2hpY2ggd2lsbCBzaHV0IGRvd24gdGhpcyB1bnVzZWQgdGhyZWFkLgorICAgICAgICBsb2coIm9uU3RhcnQgRVgiKTsKKyAgICAgICAgc3VwZXIub25TdGFydCgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGZpbmlzaChpbnQgcmVzdWx0Q29kZSwgQnVuZGxlIHJlc3VsdHMpIHsKKyAgICAgICAgLy8gQ2FsbGVkIHdoZW4gY29tcGxldGUgc28gSSBhc2sgdGhlIG1Nb2NrUmlsQ2hhbm5lbCB0byBxdWl0LgorICAgICAgICBsb2coImZpbmlzaCBFIik7CisgICAgICAgIG1Nb2NrUmlsQ2hhbm5lbC5jbG9zZSgpOworICAgICAgICBsb2coImZpbmlzaCBYIik7CisgICAgICAgIHN1cGVyLmZpbmlzaChyZXN1bHRDb2RlLCByZXN1bHRzKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgbG9nKFN0cmluZyBzKSB7CisgICAgICAgIExvZy5lKCJUZWxlcGhvbnlNb2NrUmlsVGVzdFJ1bm5lciIsIHMpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3RlbGVwaG9ueS90ZXN0cy90ZWxlcGhvbnl0ZXN0cy9zcmMvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L0dzbUFscGhhYmV0VGVzdC5qYXZhIGIvdGVsZXBob255L3Rlc3RzL3RlbGVwaG9ueXRlc3RzL3NyYy9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvR3NtQWxwaGFiZXRUZXN0LmphdmEKaW5kZXggM2E5YzUxMS4uNzAxMWFlYiAxMDA2NDQKLS0tIGEvdGVsZXBob255L3Rlc3RzL3RlbGVwaG9ueXRlc3RzL3NyYy9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvR3NtQWxwaGFiZXRUZXN0LmphdmEKKysrIGIvdGVsZXBob255L3Rlc3RzL3RlbGVwaG9ueXRlc3RzL3NyYy9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvR3NtQWxwaGFiZXRUZXN0LmphdmEKQEAgLTE2LDYgKzE2LDggQEAKIAogcGFja2FnZSBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnk7CiAKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuR3NtQWxwaGFiZXQ7CisKIGltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CiAKIGltcG9ydCBhbmRyb2lkLnRlc3Quc3VpdGVidWlsZGVyLmFubm90YXRpb24uTGFyZ2VUZXN0OwpAQCAtNTEsNyArNTMsNyBAQAogICAgICAgICAvLyAnQCcgbWFwcyB0byBjaGFyIDAKICAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIEdzbUFscGhhYmV0LmNoYXJUb0dzbSgnQCcpKTsKIAotICAgICAgICAvLyBgYSAoYSB3aXRoIGdyYXZlIGFjY2VudCkgbWFwcyB0byBsYXN0IEdTTSBjaGFyYXRlcgorICAgICAgICAvLyBgYSAoYSB3aXRoIGdyYXZlIGFjY2VudCkgbWFwcyB0byBsYXN0IEdTTSBjaGFyYWN0ZXIKICAgICAgICAgYXNzZXJ0RXF1YWxzKDB4N2YsIEdzbUFscGhhYmV0LmNoYXJUb0dzbSgnXHUwMGUwJykpOwogCiAgICAgICAgIC8vCkBAIC0zMDcsNCArMzA5LDI2IEBACiAgICAgICAgIGFzc2VydEVxdWFscygiYSIsCiAgICAgICAgICAgICAgICAgR3NtQWxwaGFiZXQuZ3NtOEJpdFVucGFja2VkVG9TdHJpbmcodW5wYWNrZWQsIDEsIHVucGFja2VkLmxlbmd0aCAtIDEpKTsKICAgICB9CisKKyAgICBAU21hbGxUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEdzbThCaXRVcGFja2VkV2l0aEV1Y2tyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIC8vIFNvbWUgZmVhdHVyZSBwaG9uZXMgaW4gS29yZWEgc3RvcmUgY29udGFjdHMgYXMgZXVjLWtyLgorICAgICAgICAvLyBUZXN0IHRoaXMgc2l0dWF0aW9ucy4KKyAgICAgICAgYnl0ZSB1bnBhY2tlZFtdOworCisgICAgICAgIC8vIFRlc3QgZ2VuZXJhbCBhbHBoYWJldCBzdHJpbmdzLgorICAgICAgICB1bnBhY2tlZCA9IEljY1V0aWxzLmhleFN0cmluZ1RvQnl0ZXMoIjYxNjI2MzIwNjQ2NTY2RkYiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJhYmMgZGVmIiwKKyAgICAgICAgICAgICAgICBHc21BbHBoYWJldC5nc204Qml0VW5wYWNrZWRUb1N0cmluZyh1bnBhY2tlZCwgMCwgdW5wYWNrZWQubGVuZ3RoLCAiZXVjLWtyIikpOworCisgICAgICAgIC8vIFRlc3Qga29yZWFuIHN0cmluZ3MuCisgICAgICAgIHVucGFja2VkID0gSWNjVXRpbHMuaGV4U3RyaW5nVG9CeXRlcygiQzVEN0JEQkFDNkFFRkYiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJcdUQxNENcdUMyQTRcdUQyQjgiLAorICAgICAgICAgICAgICAgIEdzbUFscGhhYmV0LmdzbThCaXRVbnBhY2tlZFRvU3RyaW5nKHVucGFja2VkLCAwLCB1bnBhY2tlZC5sZW5ndGgsICJldWMta3IiKSk7CisKKyAgICAgICAgLy8gVGVzdCBnc20gRXh0ZW50ZWQgQ2hhcmFjdGVycy4KKyAgICAgICAgdW5wYWNrZWQgPSBHc21BbHBoYWJldC5zdHJpbmdUb0dzbThCaXRQYWNrZWQoc0dzbUV4dGVuZGVkQ2hhcnMpOworICAgICAgICBhc3NlcnRFcXVhbHMoc0dzbUV4dGVuZGVkQ2hhcnMsCisgICAgICAgICAgICAgICAgR3NtQWxwaGFiZXQuZ3NtOEJpdFVucGFja2VkVG9TdHJpbmcodW5wYWNrZWQsIDAsIHVucGFja2VkLmxlbmd0aCwgImV1Yy1rciIpKTsKKyAgICB9CiB9CmRpZmYgLS1naXQgYS90ZWxlcGhvbnkvdGVzdHMvdGVsZXBob255dGVzdHMvc3JjL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9Hc21TbXNUZXN0LmphdmEgYi90ZWxlcGhvbnkvdGVzdHMvdGVsZXBob255dGVzdHMvc3JjL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9Hc21TbXNUZXN0LmphdmEKaW5kZXggMzEwM2ZjMS4uMjE1YzZjZSAxMDA2NDQKLS0tIGEvdGVsZXBob255L3Rlc3RzL3RlbGVwaG9ueXRlc3RzL3NyYy9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvR3NtU21zVGVzdC5qYXZhCisrKyBiL3RlbGVwaG9ueS90ZXN0cy90ZWxlcGhvbnl0ZXN0cy9zcmMvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L0dzbVNtc1Rlc3QuamF2YQpAQCAtMjQsOCArMjQsNiBAQAogaW1wb3J0IGFuZHJvaWQudGVzdC5BbmRyb2lkVGVzdENhc2U7CiBpbXBvcnQgYW5kcm9pZC50ZXN0LnN1aXRlYnVpbGRlci5hbm5vdGF0aW9uLlNtYWxsVGVzdDsKIAotaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7Ci0KIHB1YmxpYyBjbGFzcyBHc21TbXNUZXN0IGV4dGVuZHMgQW5kcm9pZFRlc3RDYXNlIHsKIAogICAgIEBTbWFsbFRlc3QKZGlmZiAtLWdpdCBhL3RlbGVwaG9ueS90ZXN0cy90ZWxlcGhvbnl0ZXN0cy9zcmMvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L01jY1RhYmxlVGVzdC5qYXZhIGIvdGVsZXBob255L3Rlc3RzL3RlbGVwaG9ueXRlc3RzL3NyYy9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvTWNjVGFibGVUZXN0LmphdmEKaW5kZXggMmQ2OTc3Yy4uN2ViM2RmOCAxMDA2NDQKLS0tIGEvdGVsZXBob255L3Rlc3RzL3RlbGVwaG9ueXRlc3RzL3NyYy9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvTWNjVGFibGVUZXN0LmphdmEKKysrIGIvdGVsZXBob255L3Rlc3RzL3RlbGVwaG9ueXRlc3RzL3NyYy9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvTWNjVGFibGVUZXN0LmphdmEKQEAgLTI4LDcgKzI4LDcgQEAKIAogICAgIEBTbWFsbFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0VGltZVpvbmUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKE1jY1RhYmxlLmRlZmF1bHRUaW1lWm9uZUZvck1jYygyMDgpLCAiRXVyb3BlL1BhcmlzIik7CisgICAgICAgIGFzc2VydEVxdWFscyhNY2NUYWJsZS5kZWZhdWx0VGltZVpvbmVGb3JNY2MoMjA4KSwgIkVDVCIpOwogICAgICAgICBhc3NlcnRFcXVhbHMoTWNjVGFibGUuZGVmYXVsdFRpbWVab25lRm9yTWNjKDIzMiksICJFdXJvcGUvVmllbm5hIik7CiAgICAgICAgIGFzc2VydEVxdWFscyhNY2NUYWJsZS5kZWZhdWx0VGltZVpvbmVGb3JNY2MoNjU1KSwgIkFmcmljYS9Kb2hhbm5lc2J1cmciKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKE1jY1RhYmxlLmRlZmF1bHRUaW1lWm9uZUZvck1jYyg0NDApLCAiQXNpYS9Ub2t5byIpOwpkaWZmIC0tZ2l0IGEvdGVsZXBob255L3Rlc3RzL3RlbGVwaG9ueXRlc3RzL3NyYy9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvUGhvbmVOdW1iZXJVdGlsc1Rlc3QuamF2YSBiL3RlbGVwaG9ueS90ZXN0cy90ZWxlcGhvbnl0ZXN0cy9zcmMvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L1Bob25lTnVtYmVyVXRpbHNUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzRhNmY1MwotLS0gL2Rldi9udWxsCisrKyBiL3RlbGVwaG9ueS90ZXN0cy90ZWxlcGhvbnl0ZXN0cy9zcmMvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L1Bob25lTnVtYmVyVXRpbHNUZXN0LmphdmEKQEAgLTAsMCArMSw1MzggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueTsKKworaW1wb3J0IGFuZHJvaWQudGVzdC5BbmRyb2lkVGVzdENhc2U7CitpbXBvcnQgYW5kcm9pZC50ZXN0LnN1aXRlYnVpbGRlci5hbm5vdGF0aW9uLlNtYWxsVGVzdDsKK2ltcG9ydCBhbmRyb2lkLnRleHQuU3Bhbm5hYmxlU3RyaW5nQnVpbGRlcjsKK2ltcG9ydCBhbmRyb2lkLnRlbGVwaG9ueS5QaG9uZU51bWJlclV0aWxzOworCitwdWJsaWMgY2xhc3MgUGhvbmVOdW1iZXJVdGlsc1Rlc3QgZXh0ZW5kcyBBbmRyb2lkVGVzdENhc2UgeworCisgICAgQFNtYWxsVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RFeHRyYWN0TmV0d29ya1BvcnRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKAorICAgICAgICAgICAgICAgICIrMTcwMDU1NTQxNDEiLAorICAgICAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuZXh0cmFjdE5ldHdvcmtQb3J0aW9uKCIrMTcwMDU1NTQxNDEiKQorICAgICAgICApOworCisgICAgICAgIGFzc2VydEVxdWFscygKKyAgICAgICAgICAgICAgICAiKzE3MDA1NTU0MTQxIiwKKyAgICAgICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLmV4dHJhY3ROZXR3b3JrUG9ydGlvbigiKzEgKDcwMCkuNTU1LTQxNDEiKQorICAgICAgICApOworCisgICAgICAgIGFzc2VydEVxdWFscygKKyAgICAgICAgICAgICAgICAiMTcwMDU1NTQxNDEiLAorICAgICAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuZXh0cmFjdE5ldHdvcmtQb3J0aW9uKCIxICg3MDApLjU1NS00MTQxIikKKyAgICAgICAgKTsKKworICAgICAgICAvLyBUaGlzIG1heSBzZWVtIHdyb25nLCBidXQgaXQncyBwcm9iYWJseSBvaworICAgICAgICBhc3NlcnRFcXVhbHMoCisgICAgICAgICAgICAgICAgIjE3MDA1NTU0MTQxKiMiLAorICAgICAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuZXh0cmFjdE5ldHdvcmtQb3J0aW9uKCIxICg3MDApLjU1NS00MTQxKiMiKQorICAgICAgICApOworCisgICAgICAgIGFzc2VydEVxdWFscygKKyAgICAgICAgICAgICAgICAiMTcwMDU1NTQxTk4iLAorICAgICAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuZXh0cmFjdE5ldHdvcmtQb3J0aW9uKCIxICg3MDApLjU1NS00MU5OIikKKyAgICAgICAgKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoCisgICAgICAgICAgICAgICAgIjE3MDA1NTU0MU5OIiwKKyAgICAgICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLmV4dHJhY3ROZXR3b3JrUG9ydGlvbigiMSAoNzAwKS41NTUtNDFOTiwxMjM0IikKKyAgICAgICAgKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoCisgICAgICAgICAgICAgICAgIjE3MDA1NTU0MU5OIiwKKyAgICAgICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLmV4dHJhY3ROZXR3b3JrUG9ydGlvbigiMSAoNzAwKS41NTUtNDFOTjsxMjM0IikKKyAgICAgICAgKTsKKworICAgICAgICAvLyBBbiBNTUkgc3RyaW5nIGlzIHVucGVydGVyYmVkLCBldmVuIHRob3VnaCBpdCBjb250YWlucyBhCisgICAgICAgIC8vICh2YWxpZCBpbiB0aGlzIGNhc2UpIGVtYmVkZGVkICsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKAorICAgICAgICAgICAgICAgICIqKjIxKioxNzAwNTU1NDE0MSMiLAorICAgICAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuZXh0cmFjdE5ldHdvcmtQb3J0aW9uKCIqKjIxKiorMTcwMDU1NTQxNDEjIikKKyAgICAgICAgICAgICAgICAvL1RPRE8gdGhpcyBpcyB0aGUgY29ycmVjdCByZXN1bHQsIGFsdGhvdWdoIHRoZSBhYm92ZQorICAgICAgICAgICAgICAgIC8vcmVzdWx0IGhhcyBiZWVuIHJldHVybmVkIHNpbmNlIGNoYW5nZSAzMTc3NgorICAgICAgICAgICAgICAgIC8vIioqMjEqKisxNzAwNTU1NDE0MSMiCisgICAgICAgICk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIiLCBQaG9uZU51bWJlclV0aWxzLmV4dHJhY3ROZXR3b3JrUG9ydGlvbigiIikpOworCisgICAgICAgIGFzc2VydEVxdWFscygiIiwgUGhvbmVOdW1iZXJVdGlscy5leHRyYWN0TmV0d29ya1BvcnRpb24oIiwxMjM0IikpOworCisgICAgICAgIGJ5dGUgW10gYiA9IG5ldyBieXRlWzIwXTsKKyAgICAgICAgYlswXSA9IChieXRlKSAweDgxOyBiWzFdID0gKGJ5dGUpIDB4NzE7IGJbMl0gPSAoYnl0ZSkgMHgwMDsgYlszXSA9IChieXRlKSAweDU1OworICAgICAgICBiWzRdID0gKGJ5dGUpIDB4MDU7IGJbNV0gPSAoYnl0ZSkgMHgyMDsgYls2XSA9IChieXRlKSAweEYwOworICAgICAgICBhc3NlcnRFcXVhbHMoIjE3MDA1NTUwMDIwIiwKKyAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuY2FsbGVkUGFydHlCQ0RUb1N0cmluZyhiLCAwLCA3KSk7CisKKyAgICAgICAgYlswXSA9IChieXRlKSAweDgwOyBiWzFdID0gKGJ5dGUpIDB4NzE7IGJbMl0gPSAoYnl0ZSkgMHgwMDsgYlszXSA9IChieXRlKSAweDU1OworICAgICAgICBiWzRdID0gKGJ5dGUpIDB4MDU7IGJbNV0gPSAoYnl0ZSkgMHgyMDsgYls2XSA9IChieXRlKSAweEYwOworICAgICAgICBhc3NlcnRFcXVhbHMoIjE3MDA1NTUwMDIwIiwKKyAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuY2FsbGVkUGFydHlCQ0RUb1N0cmluZyhiLCAwLCA3KSk7CisKKyAgICAgICAgYlswXSA9IChieXRlKSAweDkwOyBiWzFdID0gKGJ5dGUpIDB4NzE7IGJbMl0gPSAoYnl0ZSkgMHgwMDsgYlszXSA9IChieXRlKSAweDU1OworICAgICAgICBiWzRdID0gKGJ5dGUpIDB4MDU7IGJbNV0gPSAoYnl0ZSkgMHgyMDsgYls2XSA9IChieXRlKSAweEYwOworICAgICAgICBhc3NlcnRFcXVhbHMoIisxNzAwNTU1MDAyMCIsCisgICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLmNhbGxlZFBhcnR5QkNEVG9TdHJpbmcoYiwgMCwgNykpOworCisgICAgICAgIGJbMF0gPSAoYnl0ZSkgMHg5MTsgYlsxXSA9IChieXRlKSAweDcxOyBiWzJdID0gKGJ5dGUpIDB4MDA7IGJbM10gPSAoYnl0ZSkgMHg1NTsKKyAgICAgICAgYls0XSA9IChieXRlKSAweDA1OyBiWzVdID0gKGJ5dGUpIDB4MjA7IGJbNl0gPSAoYnl0ZSkgMHhGMDsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIrMTcwMDU1NTAwMjAiLAorICAgICAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuY2FsbGVkUGFydHlCQ0RUb1N0cmluZyhiLCAwLCA3KSk7CisKKyAgICAgICAgYnl0ZVtdIGJSZXQgPSBQaG9uZU51bWJlclV0aWxzLm5ldHdvcmtQb3J0aW9uVG9DYWxsZWRQYXJ0eUJDRCgiKzE3MDA1NTUwMDIwIik7CisgICAgICAgIGFzc2VydEVxdWFscyg3LCBiUmV0Lmxlbmd0aCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgNzsgaSsrKSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoYltpXSwgYlJldFtpXSk7CisgICAgICAgIH0KKworICAgICAgICBiUmV0ID0gUGhvbmVOdW1iZXJVdGlscy5uZXR3b3JrUG9ydGlvblRvQ2FsbGVkUGFydHlCQ0RXaXRoTGVuZ3RoKCIrMTcwMDU1NTAwMjAiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDgsIGJSZXQubGVuZ3RoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGJSZXRbMF0sIDcpOworICAgICAgICBmb3IgKGludCBpID0gMTsgaSA8IDg7IGkrKykgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGJbaSAtIDFdLCBiUmV0W2ldKTsKKyAgICAgICAgfQorCisgICAgICAgIGJSZXQgPSBQaG9uZU51bWJlclV0aWxzLm5ldHdvcmtQb3J0aW9uVG9DYWxsZWRQYXJ0eUJDRCgiNzAwNTU1MDAyMCIpOworICAgICAgICBhc3NlcnRFcXVhbHMoIjcwMDU1NTAwMjAiLAorICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5jYWxsZWRQYXJ0eUJDRFRvU3RyaW5nKGJSZXQsIDAsIGJSZXQubGVuZ3RoKSk7CisKKyAgICAgICAgYlswXSA9IChieXRlKSAweDgxOyBiWzFdID0gKGJ5dGUpIDB4NzE7IGJbMl0gPSAoYnl0ZSkgMHgwMDsgYlszXSA9IChieXRlKSAweDU1OworICAgICAgICBiWzRdID0gKGJ5dGUpIDB4MDU7IGJbNV0gPSAoYnl0ZSkgMHgyMDsgYls2XSA9IChieXRlKSAweEIwOworICAgICAgICBhc3NlcnRFcXVhbHMoIjE3MDA1NTUwMDIwIyIsCisgICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLmNhbGxlZFBhcnR5QkNEVG9TdHJpbmcoYiwgMCwgNykpOworCisgICAgICAgIGJbMF0gPSAoYnl0ZSkgMHg5MTsgYlsxXSA9IChieXRlKSAweDcxOyBiWzJdID0gKGJ5dGUpIDB4MDA7IGJbM10gPSAoYnl0ZSkgMHg1NTsKKyAgICAgICAgYls0XSA9IChieXRlKSAweDA1OyBiWzVdID0gKGJ5dGUpIDB4MjA7IGJbNl0gPSAoYnl0ZSkgMHhCMDsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIrMTcwMDU1NTAwMjAjIiwKKyAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuY2FsbGVkUGFydHlCQ0RUb1N0cmluZyhiLCAwLCA3KSk7CisKKyAgICAgICAgYlswXSA9IChieXRlKSAweDgxOyBiWzFdID0gKGJ5dGUpIDB4MkE7IGJbMl0gPSAoYnl0ZSkgMHhCMTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIqMjEjIiwKKyAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuY2FsbGVkUGFydHlCQ0RUb1N0cmluZyhiLCAwLCAzKSk7CisKKyAgICAgICAgYlswXSA9IChieXRlKSAweDgxOyBiWzFdID0gKGJ5dGUpIDB4MkI7IGJbMl0gPSAoYnl0ZSkgMHhCMTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIjMjEjIiwKKyAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuY2FsbGVkUGFydHlCQ0RUb1N0cmluZyhiLCAwLCAzKSk7CisKKyAgICAgICAgYlswXSA9IChieXRlKSAweDkxOyBiWzFdID0gKGJ5dGUpIDB4MkE7IGJbMl0gPSAoYnl0ZSkgMHhCMTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIqMjEjKyIsCisgICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLmNhbGxlZFBhcnR5QkNEVG9TdHJpbmcoYiwgMCwgMykpOworCisgICAgICAgIGJbMF0gPSAoYnl0ZSkgMHg4MTsgYlsxXSA9IChieXRlKSAweEFBOyBiWzJdID0gKGJ5dGUpIDB4MTI7IGJbM10gPSAoYnl0ZSkgMHhGQjsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIqKjIxIyIsCisgICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLmNhbGxlZFBhcnR5QkNEVG9TdHJpbmcoYiwgMCwgNCkpOworCisgICAgICAgIGJbMF0gPSAoYnl0ZSkgMHg5MTsgYlsxXSA9IChieXRlKSAweEFBOyBiWzJdID0gKGJ5dGUpIDB4MTI7IGJbM10gPSAoYnl0ZSkgMHhGQjsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIqKjIxIysiLAorICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5jYWxsZWRQYXJ0eUJDRFRvU3RyaW5nKGIsIDAsIDQpKTsKKworICAgICAgICBiWzBdID0gKGJ5dGUpIDB4ODE7IGJbMV0gPSAoYnl0ZSkgMHg5QTsgYlsyXSA9IChieXRlKSAweEE5OyBiWzNdID0gKGJ5dGUpIDB4NzE7CisgICAgICAgIGJbNF0gPSAoYnl0ZSkgMHgwMDsgYls1XSA9IChieXRlKSAweDU1OyBiWzZdID0gKGJ5dGUpIDB4MDU7IGJbN10gPSAoYnl0ZSkgMHgyMDsKKyAgICAgICAgYls4XSA9IChieXRlKSAweEIwOworICAgICAgICBhc3NlcnRFcXVhbHMoIio5OSoxNzAwNTU1MDAyMCMiLAorICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5jYWxsZWRQYXJ0eUJDRFRvU3RyaW5nKGIsIDAsIDkpKTsKKworICAgICAgICBiWzBdID0gKGJ5dGUpIDB4OTE7IGJbMV0gPSAoYnl0ZSkgMHg5QTsgYlsyXSA9IChieXRlKSAweEE5OyBiWzNdID0gKGJ5dGUpIDB4NzE7CisgICAgICAgIGJbNF0gPSAoYnl0ZSkgMHgwMDsgYls1XSA9IChieXRlKSAweDU1OyBiWzZdID0gKGJ5dGUpIDB4MDU7IGJbN10gPSAoYnl0ZSkgMHgyMDsKKyAgICAgICAgYls4XSA9IChieXRlKSAweEIwOworICAgICAgICBhc3NlcnRFcXVhbHMoIio5OSorMTcwMDU1NTAwMjAjIiwKKyAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuY2FsbGVkUGFydHlCQ0RUb1N0cmluZyhiLCAwLCA5KSk7CisKKyAgICAgICAgYlswXSA9IChieXRlKSAweDgxOyBiWzFdID0gKGJ5dGUpIDB4QUE7IGJbMl0gPSAoYnl0ZSkgMHgxMjsgYlszXSA9IChieXRlKSAweDFBOworICAgICAgICBiWzRdID0gKGJ5dGUpIDB4MDc7IGJbNV0gPSAoYnl0ZSkgMHg1MDsgYls2XSA9IChieXRlKSAweDU1OyBiWzddID0gKGJ5dGUpIDB4MDA7CisgICAgICAgIGJbOF0gPSAoYnl0ZSkgMHgwMjsgYls5XSA9IChieXRlKSAweEZCOworICAgICAgICBhc3NlcnRFcXVhbHMoIioqMjEqMTcwMDU1NTAwMjAjIiwKKyAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuY2FsbGVkUGFydHlCQ0RUb1N0cmluZyhiLCAwLCAxMCkpOworCisgICAgICAgIGJbMF0gPSAoYnl0ZSkgMHg5MTsgYlsxXSA9IChieXRlKSAweEFBOyBiWzJdID0gKGJ5dGUpIDB4MTI7IGJbM10gPSAoYnl0ZSkgMHgxQTsKKyAgICAgICAgYls0XSA9IChieXRlKSAweDA3OyBiWzVdID0gKGJ5dGUpIDB4NTA7IGJbNl0gPSAoYnl0ZSkgMHg1NTsgYls3XSA9IChieXRlKSAweDAwOworICAgICAgICBiWzhdID0gKGJ5dGUpIDB4MDI7IGJbOV0gPSAoYnl0ZSkgMHhGQjsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIqKjIxKisxNzAwNTU1MDAyMCMiLAorICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5jYWxsZWRQYXJ0eUJDRFRvU3RyaW5nKGIsIDAsIDEwKSk7CisKKyAgICAgICAgYlswXSA9IChieXRlKSAweDgxOyBiWzFdID0gKGJ5dGUpIDB4MkE7IGJbMl0gPSAoYnl0ZSkgMHhBMTsgYlszXSA9IChieXRlKSAweDcxOworICAgICAgICBiWzRdID0gKGJ5dGUpIDB4MDA7IGJbNV0gPSAoYnl0ZSkgMHg1NTsgYls2XSA9IChieXRlKSAweDA1OyBiWzddID0gKGJ5dGUpIDB4MjA7CisgICAgICAgIGJbOF0gPSAoYnl0ZSkgMHhGMDsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIqMjEqMTcwMDU1NTAwMjAiLAorICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5jYWxsZWRQYXJ0eUJDRFRvU3RyaW5nKGIsIDAsIDkpKTsKKworICAgICAgICBiWzBdID0gKGJ5dGUpIDB4OTE7IGJbMV0gPSAoYnl0ZSkgMHgyQTsgYlsyXSA9IChieXRlKSAweEIxOyBiWzNdID0gKGJ5dGUpIDB4NzE7CisgICAgICAgIGJbNF0gPSAoYnl0ZSkgMHgwMDsgYls1XSA9IChieXRlKSAweDU1OyBiWzZdID0gKGJ5dGUpIDB4MDU7IGJbN10gPSAoYnl0ZSkgMHgyMDsKKyAgICAgICAgYls4XSA9IChieXRlKSAweEYwOworICAgICAgICBhc3NlcnRFcXVhbHMoIioyMSMrMTcwMDU1NTAwMjAiLAorICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5jYWxsZWRQYXJ0eUJDRFRvU3RyaW5nKGIsIDAsIDkpKTsKKworICAgICAgICBhc3NlcnROdWxsKFBob25lTnVtYmVyVXRpbHMuZXh0cmFjdE5ldHdvcmtQb3J0aW9uKG51bGwpKTsKKyAgICAgICAgYXNzZXJ0TnVsbChQaG9uZU51bWJlclV0aWxzLmV4dHJhY3RQb3N0RGlhbFBvcnRpb24obnVsbCkpOworICAgICAgICBhc3NlcnRUcnVlKFBob25lTnVtYmVyVXRpbHMuY29tcGFyZShudWxsLCBudWxsKSk7CisgICAgICAgIGFzc2VydEZhbHNlKFBob25lTnVtYmVyVXRpbHMuY29tcGFyZShudWxsLCAiMTIzIikpOworICAgICAgICBhc3NlcnRGYWxzZShQaG9uZU51bWJlclV0aWxzLmNvbXBhcmUoIjEyMyIsIG51bGwpKTsKKyAgICAgICAgYXNzZXJ0TnVsbChQaG9uZU51bWJlclV0aWxzLnRvQ2FsbGVySURNaW5NYXRjaChudWxsKSk7CisgICAgICAgIGFzc2VydE51bGwoUGhvbmVOdW1iZXJVdGlscy5nZXRTdHJpcHBlZFJldmVyc2VkKG51bGwpKTsKKyAgICAgICAgYXNzZXJ0TnVsbChQaG9uZU51bWJlclV0aWxzLnN0cmluZ0Zyb21TdHJpbmdBbmRUT0EobnVsbCwgMSkpOworICAgIH0KKworICAgIEBTbWFsbFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RXh0cmFjdE5ldHdvcmtQb3J0aW9uQWx0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGFzc2VydEVxdWFscygKKyAgICAgICAgICAgICAgICAiKzE3MDA1NTU0MTQxIiwKKyAgICAgICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLmV4dHJhY3ROZXR3b3JrUG9ydGlvbkFsdCgiKzE3MDA1NTU0MTQxIikKKyAgICAgICAgKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoCisgICAgICAgICAgICAgICAgIisxNzAwNTU1NDE0MSIsCisgICAgICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5leHRyYWN0TmV0d29ya1BvcnRpb25BbHQoIisxICg3MDApLjU1NS00MTQxIikKKyAgICAgICAgKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoCisgICAgICAgICAgICAgICAgIjE3MDA1NTU0MTQxIiwKKyAgICAgICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLmV4dHJhY3ROZXR3b3JrUG9ydGlvbkFsdCgiMSAoNzAwKS41NTUtNDE0MSIpCisgICAgICAgICk7CisKKyAgICAgICAgLy8gVGhpcyBtYXkgc2VlbSB3cm9uZywgYnV0IGl0J3MgcHJvYmFibHkgb2sKKyAgICAgICAgYXNzZXJ0RXF1YWxzKAorICAgICAgICAgICAgICAgICIxNzAwNTU1NDE0MSojIiwKKyAgICAgICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLmV4dHJhY3ROZXR3b3JrUG9ydGlvbkFsdCgiMSAoNzAwKS41NTUtNDE0MSojIikKKyAgICAgICAgKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoCisgICAgICAgICAgICAgICAgIjE3MDA1NTU0MU5OIiwKKyAgICAgICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLmV4dHJhY3ROZXR3b3JrUG9ydGlvbkFsdCgiMSAoNzAwKS41NTUtNDFOTiIpCisgICAgICAgICk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKAorICAgICAgICAgICAgICAgICIxNzAwNTU1NDFOTiIsCisgICAgICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5leHRyYWN0TmV0d29ya1BvcnRpb25BbHQoIjEgKDcwMCkuNTU1LTQxTk4sMTIzNCIpCisgICAgICAgICk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKAorICAgICAgICAgICAgICAgICIxNzAwNTU1NDFOTiIsCisgICAgICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5leHRyYWN0TmV0d29ya1BvcnRpb25BbHQoIjEgKDcwMCkuNTU1LTQxTk47MTIzNCIpCisgICAgICAgICk7CisKKyAgICAgICAgLy8gQW4gTU1JIHN0cmluZyBpcyB1bnBlcnRlcmJlZCwgZXZlbiB0aG91Z2ggaXQgY29udGFpbnMgYQorICAgICAgICAvLyAodmFsaWQgaW4gdGhpcyBjYXNlKSBlbWJlZGRlZCArCisgICAgICAgIGFzc2VydEVxdWFscygKKyAgICAgICAgICAgICAgICAiKioyMSoqKzE3MDA1NTU0MTQxIyIsCisgICAgICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5leHRyYWN0TmV0d29ya1BvcnRpb25BbHQoIioqMjEqKisxNzAwNTU1NDE0MSMiKQorICAgICAgICApOworCisgICAgICAgIGFzc2VydEVxdWFscygKKyAgICAgICAgICAgICAgICAiKjMxIys0NDc5NjYxNjQyMDgiLAorICAgICAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuZXh0cmFjdE5ldHdvcmtQb3J0aW9uQWx0KCIqMzEjKzQ0Nzk2NjE2NDIwOCIpCisgICAgICAgICk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKAorICAgICAgICAgICAgICAgICIqMzEjKzQ0Nzk2NjE2NDIwOCIsCisgICAgICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5leHRyYWN0TmV0d29ya1BvcnRpb25BbHQoIiozMSMgKCs0NCkgNzkgNjYxNiA0MjA4IikKKyAgICAgICAgKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoIiIsIFBob25lTnVtYmVyVXRpbHMuZXh0cmFjdE5ldHdvcmtQb3J0aW9uQWx0KCIiKSk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIiLCBQaG9uZU51bWJlclV0aWxzLmV4dHJhY3ROZXR3b3JrUG9ydGlvbkFsdCgiLDEyMzQiKSk7CisKKyAgICAgICAgYXNzZXJ0TnVsbChQaG9uZU51bWJlclV0aWxzLmV4dHJhY3ROZXR3b3JrUG9ydGlvbkFsdChudWxsKSk7CisgICAgfQorCisgICAgQFNtYWxsVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RCKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGFzc2VydEVxdWFscygiIiwgUGhvbmVOdW1iZXJVdGlscy5leHRyYWN0UG9zdERpYWxQb3J0aW9uKCIrMTcwMDU1NTQxNDEiKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiIiwgUGhvbmVOdW1iZXJVdGlscy5leHRyYWN0UG9zdERpYWxQb3J0aW9uKCIrMSAoNzAwKS41NTUtNDE0MSIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIiLCBQaG9uZU51bWJlclV0aWxzLmV4dHJhY3RQb3N0RGlhbFBvcnRpb24oIisxICg3MDApLjU1NS00MU5OIikpOworICAgICAgICBhc3NlcnRFcXVhbHMoIiwxMjM0IiwgUGhvbmVOdW1iZXJVdGlscy5leHRyYWN0UG9zdERpYWxQb3J0aW9uKCIrMSAoNzAwKS41NTUtNDFOTiwxMjM0IikpOworICAgICAgICBhc3NlcnRFcXVhbHMoIjsxMjM0IiwgUGhvbmVOdW1iZXJVdGlscy5leHRyYWN0UG9zdERpYWxQb3J0aW9uKCIrMSAoNzAwKS41NTUtNDFOTjsxMjM0IikpOworICAgICAgICBhc3NlcnRFcXVhbHMoIjsxMjM0LDtOIiwKKyAgICAgICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLmV4dHJhY3RQb3N0RGlhbFBvcnRpb24oIisxICg3MDApLjU1NS00MU5OOzEtMi4zNCAsO04iKSk7CisgICAgfQorCisgICAgQFNtYWxsVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RDb21wYXJlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIC8vIHRoaXMgaXMgb2RkCisgICAgICAgIGFzc2VydEZhbHNlKFBob25lTnVtYmVyVXRpbHMuY29tcGFyZSgiIiwgIiIpKTsKKworICAgICAgICBhc3NlcnRUcnVlKFBob25lTnVtYmVyVXRpbHMuY29tcGFyZSgiOTExIiwgIjkxMSIpKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UoUGhvbmVOdW1iZXJVdGlscy5jb21wYXJlKCI5MTEiLCAiMTgwMDU1NTA5MTEiKSk7CisgICAgICAgIGFzc2VydFRydWUoUGhvbmVOdW1iZXJVdGlscy5jb21wYXJlKCI1NTU1IiwgIjU1NTUiKSk7CisgICAgICAgIGFzc2VydEZhbHNlKFBob25lTnVtYmVyVXRpbHMuY29tcGFyZSgiNTU1NSIsICIxODAwNTU1NTU1NTUiKSk7CisKKyAgICAgICAgYXNzZXJ0VHJ1ZShQaG9uZU51bWJlclV0aWxzLmNvbXBhcmUoIisxNzAwNTU1NDE0MSIsICIrMTcwMDU1NTQxNDEiKSk7CisgICAgICAgIGFzc2VydFRydWUoUGhvbmVOdW1iZXJVdGlscy5jb21wYXJlKCIrMTcwMDU1NTQxNDEiLCAiKzEgKDcwMCkuNTU1LTQxNDEiKSk7CisgICAgICAgIGFzc2VydFRydWUoUGhvbmVOdW1iZXJVdGlscy5jb21wYXJlKCIrMTcwMDU1NTQxNDEiLCAiKzEgKDcwMCkuNTU1LTQxNDEsMTIzNCIpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShQaG9uZU51bWJlclV0aWxzLmNvbXBhcmUoIisxNzAwNTU1NDE0MSIsICIxNzAwNTU1NDE0MSIpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShQaG9uZU51bWJlclV0aWxzLmNvbXBhcmUoIisxNzAwNTU1NDE0MSIsICI3MDA1NTU0MTQxIikpOworICAgICAgICBhc3NlcnRUcnVlKFBob25lTnVtYmVyVXRpbHMuY29tcGFyZSgiKzE3MDA1NTU0MTQxIiwgIjU1NTQxNDEiKSk7CisgICAgICAgIGFzc2VydFRydWUoUGhvbmVOdW1iZXJVdGlscy5jb21wYXJlKCIxNzAwNTU1NDE0MSIsICI1NTU0MTQxIikpOworICAgICAgICBhc3NlcnRUcnVlKFBob25lTnVtYmVyVXRpbHMuY29tcGFyZSgiKzE3MDA1NTU0MTQxIiwgIjAxMTE3MDA1NTU0MTQxIikpOworICAgICAgICBhc3NlcnRUcnVlKFBob25lTnVtYmVyVXRpbHMuY29tcGFyZSgiKzE3MDA1NTU0MTQxIiwgIjAwMTcwMDU1NTQxNDEiKSk7CisgICAgICAgIGFzc2VydFRydWUoUGhvbmVOdW1iZXJVdGlscy5jb21wYXJlKCIxNzAwNTU1NDE0MSIsICIwMDE3MDA1NTU0MTQxIikpOworCisKKyAgICAgICAgYXNzZXJ0VHJ1ZShQaG9uZU51bWJlclV0aWxzLmNvbXBhcmUoIisxNzAwNTU1NDE0MSIsICIqKjMxIysxNzAwNTU1NDE0MSIpKTsKKworICAgICAgICBhc3NlcnRGYWxzZShQaG9uZU51bWJlclV0aWxzLmNvbXBhcmUoIisxIDk5OSA3MDA1NTU0MTQxIiwgIisxIDcwMDU1NTQxNDEiKSk7CisgICAgICAgIGFzc2VydFRydWUoUGhvbmVOdW1iZXJVdGlscy5jb21wYXJlKCIwMTEgMSA3MDA1NTU0MTQxIiwgIjcwMDU1NTQxNDEiKSk7CisKKyAgICAgICAgYXNzZXJ0RmFsc2UoUGhvbmVOdW1iZXJVdGlscy5jb21wYXJlKCIwMTEgMTEgNzAwNTU1NDE0MSIsICIrMTcwMDU1NTQxNDEiKSk7CisKKyAgICAgICAgYXNzZXJ0RmFsc2UoUGhvbmVOdW1iZXJVdGlscy5jb21wYXJlKCIrMTcwMDU1NTQxNDEiLCAiNzA4NTg4MjMwMCIpKTsKKworICAgICAgICBhc3NlcnRUcnVlKFBob25lTnVtYmVyVXRpbHMuY29tcGFyZSgiKzQ0IDIwNyA3OTIgMzQ5MCIsICIwIDIwNyA3OTIgMzQ5MCIpKTsKKworICAgICAgICBhc3NlcnRGYWxzZShQaG9uZU51bWJlclV0aWxzLmNvbXBhcmUoIis0NCAyMDcgNzkyIDM0OTAiLCAiMDAgMjA3IDc5MiAzNDkwIikpOworICAgICAgICBhc3NlcnRGYWxzZShQaG9uZU51bWJlclV0aWxzLmNvbXBhcmUoIis0NCAyMDcgNzkyIDM0OTAiLCAiMDExIDIwNyA3OTIgMzQ5MCIpKTsKKworICAgICAgICAvKioqKiogRklYTUUncyAqKioqKiovCisgICAgICAgIC8vCisgICAgICAgIC8vIE1NSSBoZWFkZXIgc2hvdWxkIGJlIGlnbm9yZWQKKyAgICAgICAgYXNzZXJ0RmFsc2UoUGhvbmVOdW1iZXJVdGlscy5jb21wYXJlKCIrMTcwMDU1NTQxNDEiLCAiKiozMSMxNzAwNTU1NDE0MSIpKTsKKworICAgICAgICAvLyBJdCdzIHRvbyBiYWQgdGhpcyBpcyBmYWxzZQorICAgICAgICAvLyArNDQgKDApIDIwNyA3OTIgMzQ5MCBpcyBub3QgYSBkaWFsYWJsZSBudW1iZXIKKyAgICAgICAgLy8gYnV0IGl0IGlzIGNvbW1vbmx5IGhvdyBFdXJvcGVhbiBwaG9uZSBudW1iZXJzIGFyZSB3cml0dGVuCisgICAgICAgIGFzc2VydEZhbHNlKFBob25lTnVtYmVyVXRpbHMuY29tcGFyZSgiKzQ0IDIwNyA3OTIgMzQ5MCIsICIrNDQgKDApIDIwNyA3OTIgMzQ5MCIpKTsKKworICAgICAgICAvLyBUaGUgamFwYW5lc2UgaW50ZXJuYXRpb25hbCBwcmVmaXgsIGZvciBleGFtcGxlLCBtZXNzZXMgdXMgdXAKKyAgICAgICAgLy8gQnV0IHdobyB1c2VzIGEgR1NNIHBob25lIGluIEphcGFuPworICAgICAgICBhc3NlcnRGYWxzZShQaG9uZU51bWJlclV0aWxzLmNvbXBhcmUoIis0NCAyMDcgNzkyIDM0OTAiLCAiMDEwIDQ0IDIwNyA3OTIgMzQ5MCIpKTsKKworICAgICAgICAvLyBUaGUgQXVzdHJhbGlhbiBvbmUgbWVzc2VzIHVzIHVwIHRvbworICAgICAgICBhc3NlcnRGYWxzZShQaG9uZU51bWJlclV0aWxzLmNvbXBhcmUoIis0NCAyMDcgNzkyIDM0OTAiLCAiMDAxMSA0NCAyMDcgNzkyIDM0OTAiKSk7CisKKyAgICAgICAgLy8gVGhlIFJ1c3NpYW4gdHJ1bmsgcHJlZml4IG1lc3NlcyB1cyB1cCwgYXMgZG9lcyBjdXJyZW50CisgICAgICAgIC8vIFJ1c3NpYW4gYXJlYSBjb2RlcyAod2hpY2ggYmVpbiB3aXRoIDApCisKKyAgICAgICAgYXNzZXJ0RmFsc2UoUGhvbmVOdW1iZXJVdGlscy5jb21wYXJlKCIrNygwOTUpOTEwMDc2NiIsICI4KDA5NSk5MTAwNzY2IikpOworCisgICAgICAgIC8vIDQ0NCBpcyBub3QgYSB2YWxpZCBjb3VudHJ5IGNvZGUsIGJ1dAorICAgICAgICAvLyBtYXRjaEludGxQcmVmaXhBbmRDQyBkb2VzbnQga25vdyB0aGlzCisgICAgICAgIGFzc2VydFRydWUoUGhvbmVOdW1iZXJVdGlscy5jb21wYXJlKCIrNDQ0IDIwNyA3OTIgMzQ5MCIsICIwIDIwNyA3OTIgMzQ5MCIpKTsKKworICAgICAgICAvLyBjb21wYXJlIFNNUyBzaG9ydCBjb2RlCisgICAgICAgIGFzc2VydFRydWUoUGhvbmVOdW1iZXJVdGlscy5jb21wYXJlKCI0MDQtMDQiLCAiNDA0MDQiKSk7CisgICAgfQorCisKKyAgICBAU21hbGxUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFRvQ2FsbGVySURJbmRleGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIxNDE0NTU1IiwgUGhvbmVOdW1iZXJVdGlscy50b0NhbGxlcklETWluTWF0Y2goIjE3MDA1NTU0MTQxIikpOworICAgICAgICBhc3NlcnRFcXVhbHMoIjE0MTQ1NTUiLCBQaG9uZU51bWJlclV0aWxzLnRvQ2FsbGVySURNaW5NYXRjaCgiMS03MDAtNTU1LTQxNDEiKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiMTQxNDU1NSIsIFBob25lTnVtYmVyVXRpbHMudG9DYWxsZXJJRE1pbk1hdGNoKCIxLTcwMC01NTUtNDE0MSwxMjM0IikpOworICAgICAgICBhc3NlcnRFcXVhbHMoIjE0MTQ1NTUiLCBQaG9uZU51bWJlclV0aWxzLnRvQ2FsbGVySURNaW5NYXRjaCgiMS03MDAtNTU1LTQxNDE7MTIzNCIpKTsKKworICAgICAgICAvL3RoaXMgc2VlbXMgd3JvbmcsIG9yIGF0IGxlYXN0IHVzZWxlc3MKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJOTjE0NTU1IiwgUGhvbmVOdW1iZXJVdGlscy50b0NhbGxlcklETWluTWF0Y2goIjEtNzAwLTU1NS00MU5OIikpOworCisgICAgICAgIC8vPHNocnVnPiAtLSB0aGVzZSBhcmUgYWxsIG5vdCB1c2VmdWwsIGJ1dCBub3QgdGVycmlibHkgd3JvbmcKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIiLCBQaG9uZU51bWJlclV0aWxzLnRvQ2FsbGVySURNaW5NYXRjaCgiIikpOworICAgICAgICBhc3NlcnRFcXVhbHMoIjAwMzIiLCBQaG9uZU51bWJlclV0aWxzLnRvQ2FsbGVySURNaW5NYXRjaCgiMjMwMCIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIwMDMyKyIsIFBob25lTnVtYmVyVXRpbHMudG9DYWxsZXJJRE1pbk1hdGNoKCIrMjMwMCIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIjMTMwIyoiLCBQaG9uZU51bWJlclV0aWxzLnRvQ2FsbGVySURNaW5NYXRjaCgiKiMwMzEjIikpOworICAgIH0KKworICAgIEBTbWFsbFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0SW5kZXhhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGFzc2VydEVxdWFscygiMTQxNDU1NTAwNzEiLCBQaG9uZU51bWJlclV0aWxzLmdldFN0cmlwcGVkUmV2ZXJzZWQoIjEtNzAwLTU1NS00MTQxIikpOworICAgICAgICBhc3NlcnRFcXVhbHMoIjE0MTQ1NTUwMDcxIiwgUGhvbmVOdW1iZXJVdGlscy5nZXRTdHJpcHBlZFJldmVyc2VkKCIxLTcwMC01NTUtNDE0MSwxMjM0IikpOworICAgICAgICBhc3NlcnRFcXVhbHMoIjE0MTQ1NTUwMDcxIiwgUGhvbmVOdW1iZXJVdGlscy5nZXRTdHJpcHBlZFJldmVyc2VkKCIxLTcwMC01NTUtNDE0MTsxMjM0IikpOworCisgICAgICAgIC8vdGhpcyBzZWVtcyB3cm9uZywgb3IgYXQgbGVhc3QgdXNlbGVzcworICAgICAgICBhc3NlcnRFcXVhbHMoIk5OMTQ1NTUwMDcxIiwgUGhvbmVOdW1iZXJVdGlscy5nZXRTdHJpcHBlZFJldmVyc2VkKCIxLTcwMC01NTUtNDFOTiIpKTsKKworICAgICAgICAvLzxzaHJ1Zz4gLS0gdGhlc2UgYXJlIGFsbCBub3QgdXNlZnVsLCBidXQgbm90IHRlcnJpYmx5IHdyb25nCisgICAgICAgIGFzc2VydEVxdWFscygiIiwgUGhvbmVOdW1iZXJVdGlscy5nZXRTdHJpcHBlZFJldmVyc2VkKCIiKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiMDAzMiIsIFBob25lTnVtYmVyVXRpbHMuZ2V0U3RyaXBwZWRSZXZlcnNlZCgiMjMwMCIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIwMDMyKyIsIFBob25lTnVtYmVyVXRpbHMuZ2V0U3RyaXBwZWRSZXZlcnNlZCgiKzIzMDAiKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiIzEzMCMqIiwgUGhvbmVOdW1iZXJVdGlscy5nZXRTdHJpcHBlZFJldmVyc2VkKCIqIzAzMSMiKSk7CisgICAgfQorCisgICAgQFNtYWxsVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3ROYW5wRm9ybWF0dGluZygpIHsKKyAgICAgICAgU3Bhbm5hYmxlU3RyaW5nQnVpbGRlciBudW1iZXIgPSBuZXcgU3Bhbm5hYmxlU3RyaW5nQnVpbGRlcigpOworICAgICAgICBudW1iZXIuYXBwZW5kKCI4MDA1NTUxMjEyIik7CisgICAgICAgIFBob25lTnVtYmVyVXRpbHMuZm9ybWF0TmFucE51bWJlcihudW1iZXIpOworICAgICAgICBhc3NlcnRFcXVhbHMoIjgwMC01NTUtMTIxMiIsIG51bWJlci50b1N0cmluZygpKTsKKworICAgICAgICBudW1iZXIuY2xlYXIoKTsKKyAgICAgICAgbnVtYmVyLmFwcGVuZCgiODAwNTU1MTIxIik7CisgICAgICAgIFBob25lTnVtYmVyVXRpbHMuZm9ybWF0TmFucE51bWJlcihudW1iZXIpOworICAgICAgICBhc3NlcnRFcXVhbHMoIjgwMC01NTUtMTIxIiwgbnVtYmVyLnRvU3RyaW5nKCkpOworCisgICAgICAgIG51bWJlci5jbGVhcigpOworICAgICAgICBudW1iZXIuYXBwZW5kKCI1NTUtMTIxMiIpOworICAgICAgICBQaG9uZU51bWJlclV0aWxzLmZvcm1hdE5hbnBOdW1iZXIobnVtYmVyKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCI1NTUtMTIxMiIsIG51bWJlci50b1N0cmluZygpKTsKKworICAgICAgICBudW1iZXIuY2xlYXIoKTsKKyAgICAgICAgbnVtYmVyLmFwcGVuZCgiODAwLTU1NTEyIik7CisgICAgICAgIFBob25lTnVtYmVyVXRpbHMuZm9ybWF0TmFucE51bWJlcihudW1iZXIpOworICAgICAgICBhc3NlcnRFcXVhbHMoIjgwMC01NTUtMTIiLCBudW1iZXIudG9TdHJpbmcoKSk7CisKKyAgICAgICAgbnVtYmVyLmNsZWFyKCk7CisgICAgICAgIG51bWJlci5hcHBlbmQoIjQ2NjQ1Iik7CisgICAgICAgIFBob25lTnVtYmVyVXRpbHMuZm9ybWF0TmFucE51bWJlcihudW1iZXIpOworICAgICAgICBhc3NlcnRFcXVhbHMoIjQ2NjQ1IiwgbnVtYmVyLnRvU3RyaW5nKCkpOworICAgIH0KKworICAgIEBTbWFsbFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q29udmVydEtleXBhZExldHRlcnNUb0RpZ2l0cygpIHsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIxLTgwMC00NjY0LTQxMSIsCisgICAgICAgICAgICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLmNvbnZlcnRLZXlwYWRMZXR0ZXJzVG9EaWdpdHMoIjEtODAwLUdPT0ctNDExIikpOworICAgICAgICBhc3NlcnRFcXVhbHMoIjE4MDA0NjY0NDExIiwKKyAgICAgICAgICAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuY29udmVydEtleXBhZExldHRlcnNUb0RpZ2l0cygiMTgwMEdPT0c0MTEiKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiMS04MDAtNDY2LTQ0MTEiLAorICAgICAgICAgICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5jb252ZXJ0S2V5cGFkTGV0dGVyc1RvRGlnaXRzKCIxLTgwMC00NjYtNDQxMSIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIxODAwNDY2NDQxMSIsCisgICAgICAgICAgICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLmNvbnZlcnRLZXlwYWRMZXR0ZXJzVG9EaWdpdHMoIjE4MDA0NjY0NDExIikpOworICAgICAgICBhc3NlcnRFcXVhbHMoIjIyMi0zMzMtNDQ0LTU1NS02NjYtNzc3Ny04ODgtOTk5OSIsCisgICAgICAgICAgICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLmNvbnZlcnRLZXlwYWRMZXR0ZXJzVG9EaWdpdHMoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBQkMtREVGLUdISS1KS0wtTU5PLVBRUlMtVFVWLVdYWVoiKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiMjIyLTMzMy00NDQtNTU1LTY2Ni03Nzc3LTg4OC05OTk5IiwKKyAgICAgICAgICAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuY29udmVydEtleXBhZExldHRlcnNUb0RpZ2l0cygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFiYy1kZWYtZ2hpLWprbC1tbm8tcHFycy10dXYtd3h5eiIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIoODAwKSAyMjItMzMzNCIsCisgICAgICAgICAgICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLmNvbnZlcnRLZXlwYWRMZXR0ZXJzVG9EaWdpdHMoIig4MDApIEFCQy1ERUZHIikpOworICAgIH0KKworICAgIC8vIFRvIHJ1biB0aGlzIHRlc3QsIHRoZSBkZXZpY2UgaGFzIHRvIGJlIHJlZ2lzdGVyZWQgd2l0aCBuZXR3b3JrCisgICAgcHVibGljIHZvaWQgdGVzdENoZWNrQW5kUHJvY2Vzc1BsdXNDb2RlKCkgeworICAgICAgICBhc3NlcnRFcXVhbHMoIjAxMTg0NzU3OTcwMDAiLAorICAgICAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuY2RtYUNoZWNrQW5kUHJvY2Vzc1BsdXNDb2RlKCIrODQ3NTc5NzAwMCIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIxODQ3NTc5NzAwMCIsCisgICAgICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5jZG1hQ2hlY2tBbmRQcm9jZXNzUGx1c0NvZGUoIisxODQ3NTc5NzAwMCIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIwMTExMjM0NTY3IiwKKyAgICAgICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLmNkbWFDaGVja0FuZFByb2Nlc3NQbHVzQ29kZSgiKzEyMzQ1NjciKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiMDExMjM0NTY3MDAwMDAiLAorICAgICAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuY2RtYUNoZWNrQW5kUHJvY2Vzc1BsdXNDb2RlKCIrMjM0NTY3MDAwMDAiKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiMDExMTE4NzU3Njc4MDAiLAorICAgICAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuY2RtYUNoZWNrQW5kUHJvY2Vzc1BsdXNDb2RlKCIrMTE4NzU3Njc4MDAiKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiODQ3NTc5NzAwMCwxODQ3NTIzMTc1MyIsCisgICAgICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5jZG1hQ2hlY2tBbmRQcm9jZXNzUGx1c0NvZGUoIjg0NzU3OTcwMDAsKzE4NDc1MjMxNzUzIikpOworICAgICAgICBhc3NlcnRFcXVhbHMoIjAxMTg0NzU3OTcwMDAsMTg0NzUyMzE3NTMiLAorICAgICAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuY2RtYUNoZWNrQW5kUHJvY2Vzc1BsdXNDb2RlKCIrODQ3NTc5NzAwMCwrMTg0NzUyMzE3NTMiKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiODQ3NTc5NzAwMDswMTE4NDY5MzEyMzQ1IiwKKyAgICAgICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLmNkbWFDaGVja0FuZFByb2Nlc3NQbHVzQ29kZSgiODQ3NTc5NzAwMDsrODQ2OTMxMjM0NSIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCI4NDc1Nzk3MDAwLDAxMTEyMzQ1NjciLAorICAgICAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuY2RtYUNoZWNrQW5kUHJvY2Vzc1BsdXNDb2RlKCI4NDc1Nzk3MDAwLCsxMjM0NTY3IikpOworICAgICAgICBhc3NlcnRFcXVhbHMoIjg0NzU5NzAwMDswMTExMTg3NTc2NzAwMCIsCisgICAgICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5jZG1hQ2hlY2tBbmRQcm9jZXNzUGx1c0NvZGUoIjg0NzU5NzAwMDsrMTE4NzU3NjcwMDAiKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiODQ3NTc5NzAwMCwsMDExODQ2OTMxMjM0NSIsCisgICAgICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5jZG1hQ2hlY2tBbmRQcm9jZXNzUGx1c0NvZGUoIjg0NzU3OTcwMDAsLCs4NDY5MzEyMzQ1IikpOworICAgICAgICBhc3NlcnRFcXVhbHMoIjg0NzU3OTcwMDA7LDAxMTg0NjkzMTIzNDUiLAorICAgICAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuY2RtYUNoZWNrQW5kUHJvY2Vzc1BsdXNDb2RlKCI4NDc1Nzk3MDAwOywrODQ2OTMxMjM0NSIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCI4NDc1Nzk3MDAwLDsxODQ3NTIzMTc1MyIsCisgICAgICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5jZG1hQ2hlY2tBbmRQcm9jZXNzUGx1c0NvZGUoIjg0NzU3OTcwMDAsOysxODQ3NTIzMTc1MyIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCI4NDc1Nzk3MDAwOywwMTExMTg3NTc2NzAwMCIsCisgICAgICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5jZG1hQ2hlY2tBbmRQcm9jZXNzUGx1c0NvZGUoIjg0NzU3OTcwMDA7LCsxMTg3NTc2NzAwMCIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCI4NDc1Nzk3MDAwLDswMTExMTg3NTc2NzAwMCIsCisgICAgICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5jZG1hQ2hlY2tBbmRQcm9jZXNzUGx1c0NvZGUoIjg0NzU3OTcwMDAsOysxMTg3NTc2NzAwMCIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCI4NDc1Nzk3MDAwLCwsMDExMTE4NzU3NjcwMDAiLAorICAgICAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuY2RtYUNoZWNrQW5kUHJvY2Vzc1BsdXNDb2RlKCI4NDc1Nzk3MDAwLCwsKzExODc1NzY3MDAwIikpOworICAgICAgICBhc3NlcnRFcXVhbHMoIjg0NzU3OTcwMDA7LCwwMTExMTg3NTc2NzAwMCIsCisgICAgICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5jZG1hQ2hlY2tBbmRQcm9jZXNzUGx1c0NvZGUoIjg0NzU3OTcwMDA7LCwrMTE4NzU3NjcwMDAiKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiKzssODQ3NTc5NzAwMCIsCisgICAgICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5jZG1hQ2hlY2tBbmRQcm9jZXNzUGx1c0NvZGUoIis7LDg0NzU3OTcwMDAiKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiODQ3NTc5NzAwMCwiLAorICAgICAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuY2RtYUNoZWNrQW5kUHJvY2Vzc1BsdXNDb2RlKCI4NDc1Nzk3MDAwLCIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCI4NDcrNTc5LTcwMDAiLAorICAgICAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuY2RtYUNoZWNrQW5kUHJvY2Vzc1BsdXNDb2RlKCI4NDcrNTc5LTcwMDAiKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiLDg0NzU3OTcwMDAiLAorICAgICAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuY2RtYUNoZWNrQW5kUHJvY2Vzc1BsdXNDb2RlKCIsODQ3NTc5NzAwMCIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCI7Ozg0NzU3OTcwMDAsLCIsCisgICAgICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5jZG1hQ2hlY2tBbmRQcm9jZXNzUGx1c0NvZGUoIjs7ODQ3NTc5NzAwMCwsIikpOworICAgICAgICBhc3NlcnRFcXVhbHMoIit0aGlzK2lzJHdlaXJkOywrIiwKKyAgICAgICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLmNkbWFDaGVja0FuZFByb2Nlc3NQbHVzQ29kZSgiK3RoaXMraXMkd2VpcmQ7LCsiKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiIiwKKyAgICAgICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLmNkbWFDaGVja0FuZFByb2Nlc3NQbHVzQ29kZSgiIikpOworICAgICAgICBhc3NlcnROdWxsKFBob25lTnVtYmVyVXRpbHMuY2RtYUNoZWNrQW5kUHJvY2Vzc1BsdXNDb2RlKG51bGwpKTsKKyAgICB9CisKKyAgICBAU21hbGxUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdENoZWNrQW5kUHJvY2Vzc1BsdXNDb2RlQnlOdW1iZXJGb3JtYXQoKSB7CisgICAgICAgIGFzc2VydEVxdWFscygiMTg0NzU3OTcwMDAiLAorICAgICAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuY2RtYUNoZWNrQW5kUHJvY2Vzc1BsdXNDb2RlQnlOdW1iZXJGb3JtYXQoIisxODQ3NTc5NzAwMCIsCisgICAgICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5GT1JNQVRfTkFOUCxQaG9uZU51bWJlclV0aWxzLkZPUk1BVF9OQU5QKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiKzE4NDc1Nzk3MDAwIiwKKyAgICAgICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLmNkbWFDaGVja0FuZFByb2Nlc3NQbHVzQ29kZUJ5TnVtYmVyRm9ybWF0KCIrMTg0NzU3OTcwMDAiLAorICAgICAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuRk9STUFUX05BTlAsUGhvbmVOdW1iZXJVdGlscy5GT1JNQVRfSkFQQU4pKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIrMTg0NzU3OTcwMDAiLAorICAgICAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuY2RtYUNoZWNrQW5kUHJvY2Vzc1BsdXNDb2RlQnlOdW1iZXJGb3JtYXQoIisxODQ3NTc5NzAwMCIsCisgICAgICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5GT1JNQVRfTkFOUCxQaG9uZU51bWJlclV0aWxzLkZPUk1BVF9VTktOT1dOKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiKzE4NDc1Nzk3MDAwIiwKKyAgICAgICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLmNkbWFDaGVja0FuZFByb2Nlc3NQbHVzQ29kZUJ5TnVtYmVyRm9ybWF0KCIrMTg0NzU3OTcwMDAiLAorICAgICAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuRk9STUFUX0pBUEFOLFBob25lTnVtYmVyVXRpbHMuRk9STUFUX0pBUEFOKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiKzE4NDc1Nzk3MDAwIiwKKyAgICAgICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLmNkbWFDaGVja0FuZFByb2Nlc3NQbHVzQ29kZUJ5TnVtYmVyRm9ybWF0KCIrMTg0NzU3OTcwMDAiLAorICAgICAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuRk9STUFUX1VOS05PV04sUGhvbmVOdW1iZXJVdGlscy5GT1JNQVRfVU5LTk9XTikpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEJhc2ljIGNoZWNrcyBmb3IgdGhlIFZvaWNlTWFpbCBudW1iZXIuCisgICAgICovCisgICAgQFNtYWxsVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RXaXRoTnVtYmVyTm90RXF1YWxUb1ZvaWNlTWFpbCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBhc3NlcnRGYWxzZShQaG9uZU51bWJlclV0aWxzLmlzVm9pY2VNYWlsTnVtYmVyKCI5MTEiKSk7CisgICAgICAgIGFzc2VydEZhbHNlKFBob25lTnVtYmVyVXRpbHMuaXNWb2ljZU1haWxOdW1iZXIoInRlbDo5MTEiKSk7CisgICAgICAgIGFzc2VydEZhbHNlKFBob25lTnVtYmVyVXRpbHMuaXNWb2ljZU1haWxOdW1iZXIoIisxODAwMTIzNDU2NyIpKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UoUGhvbmVOdW1iZXJVdGlscy5pc1ZvaWNlTWFpbE51bWJlcigiIikpOworICAgICAgICBhc3NlcnRGYWxzZShQaG9uZU51bWJlclV0aWxzLmlzVm9pY2VNYWlsTnVtYmVyKG51bGwpKTsKKyAgICAgICAgLy8gVGhpcyB0ZXN0IGZhaWxzIG9uIGEgZGV2aWNlIHdpdGhvdXQgYSBzaW0gY2FyZAorICAgICAgICAvKlRlbGVwaG9ueU1hbmFnZXIgbVRlbGVwaG9ueU1hbmFnZXIgPQorICAgICAgICAgICAgKFRlbGVwaG9ueU1hbmFnZXIpZ2V0Q29udGV4dCgpLmdldFN5c3RlbVNlcnZpY2UoQ29udGV4dC5URUxFUEhPTllfU0VSVklDRSk7CisgICAgICAgIFN0cmluZyBtVm9pY2VNYWlsTnVtYmVyID0gbVRlbGVwaG9ueU1hbmFnZXIuZ2V0RGVmYXVsdCgpLmdldFZvaWNlTWFpbE51bWJlcigpOworICAgICAgICBhc3NlcnRUcnVlKFBob25lTnVtYmVyVXRpbHMuaXNWb2ljZU1haWxOdW1iZXIobVZvaWNlTWFpbE51bWJlcikpOworICAgICAgICAqLworICAgIH0KKworICAgIEBTbWFsbFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Rm9ybWF0TnVtYmVyVG9FMTY0KCkgeworICAgICAgICBhc3NlcnRFcXVhbHMoIisxNjUwMjkxMDAwMCIsIFBob25lTnVtYmVyVXRpbHMuZm9ybWF0TnVtYmVyVG9FMTY0KCI2NTAgMjkxMDAwMCIsICJ1cyIpKTsKKyAgICAgICAgYXNzZXJ0TnVsbChQaG9uZU51bWJlclV0aWxzLmZvcm1hdE51bWJlclRvRTE2NCgiMTIzNDU2NyIsICJ1cyIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIrMTgwMDQ2NjQxMTQiLCBQaG9uZU51bWJlclV0aWxzLmZvcm1hdE51bWJlclRvRTE2NCgiODAwLUdPT0ctMTE0IiwgInVzIikpOworICAgIH0KKworICAgIEBTbWFsbFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Rm9ybWF0TnVtYmVyKCkgeworICAgICAgICBhc3NlcnRFcXVhbHMoIig2NTApIDI5MS0wMDAwIiwgUGhvbmVOdW1iZXJVdGlscy5mb3JtYXROdW1iZXIoIjY1MCAyOTEwMDAwIiwgInVzIikpOworICAgICAgICBhc3NlcnRFcXVhbHMoIjEyMy00NTY3IiwgUGhvbmVOdW1iZXJVdGlscy5mb3JtYXROdW1iZXIoIjEyMzQ1NjciLCAidXMiKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiKDgwMCkgNDY2LTQxMTQiLCBQaG9uZU51bWJlclV0aWxzLmZvcm1hdE51bWJlcigiODAwLUdPT0ctMTE0IiwgInVzIikpOworCisgICAgfQorCisgICAgQFNtYWxsVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3ROb3JtYWxpemVOdW1iZXIoKSB7CisgICAgICAgIGFzc2VydEVxdWFscygiNjUwMjkxMDAwMCIsIFBob25lTnVtYmVyVXRpbHMubm9ybWFsaXplTnVtYmVyKCI2NTAgMjkxMDAwMCIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIxMjM0NTY3IiwgUGhvbmVOdW1iZXJVdGlscy5ub3JtYWxpemVOdW1iZXIoIjEyLDMjNCo1NjciKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiODAwNDY2NDExNCIsIFBob25lTnVtYmVyVXRpbHMubm9ybWFsaXplTnVtYmVyKCI4MDAtR09PRy0xMTQiKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiKzE2NTAyOTEwMDAwIiwgUGhvbmVOdW1iZXJVdGlscy5ub3JtYWxpemVOdW1iZXIoIisxIDY1MCAyOTEwMDAwIikpOworICAgIH0KKworICAgIEBTbWFsbFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Rm9ybWF0RGFpbGFiZU51bWJlcigpIHsKKyAgICAgICAgLy8gVXNpbmcgdGhlIHBob25lTnVtYmVyRTE2NCdzIGNvdW50cnkgY29kZQorICAgICAgICBhc3NlcnRFcXVhbHMoIig2NTApIDI5MS0wMDAwIiwKKyAgICAgICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLmZvcm1hdE51bWJlcigiNjUwMjkxMDAwMCIsICIrMTY1MDI5MTAwMDAiLCAiQ04iKSk7CisgICAgICAgIC8vIFRoZSBwaG9uZU51bWJlckUxNjQgaXMgbnVsbAorICAgICAgICBhc3NlcnRFcXVhbHMoIig2NTApIDI5MS0wMDAwIiwgUGhvbmVOdW1iZXJVdGlscy5mb3JtYXROdW1iZXIoIjY1MDI5MTAwMDAiLCBudWxsLCAiVVMiKSk7CisgICAgICAgIC8vIFRoZSBnaXZlbiBudW1iZXIgaGFzIGEgY291bnRyeSBjb2RlLgorICAgICAgICBhc3NlcnRFcXVhbHMoIisxIDY1MC0yOTEtMDAwMCIsIFBob25lTnVtYmVyVXRpbHMuZm9ybWF0TnVtYmVyKCIrMTY1MDI5MTAwMDAiLCBudWxsLCAiQ04iKSk7CisgICAgICAgIC8vIFRoZSBnaXZlbiBudW1iZXIgd2FzIGZvcm1hdHRlZC4KKyAgICAgICAgYXNzZXJ0RXF1YWxzKCI2NTAtMjkxLTAwMDAiLCBQaG9uZU51bWJlclV0aWxzLmZvcm1hdE51bWJlcigiNjUwLTI5MS0wMDAwIiwgbnVsbCwgIlVTIikpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3RlbGVwaG9ueS90ZXN0cy90ZWxlcGhvbnl0ZXN0cy9zcmMvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L1Bob25lTnVtYmVyV2F0Y2hlclRlc3QuamF2YSBiL3RlbGVwaG9ueS90ZXN0cy90ZWxlcGhvbnl0ZXN0cy9zcmMvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L1Bob25lTnVtYmVyV2F0Y2hlclRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMmU1NzNjCi0tLSAvZGV2L251bGwKKysrIGIvdGVsZXBob255L3Rlc3RzL3RlbGVwaG9ueXRlc3RzL3NyYy9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvUGhvbmVOdW1iZXJXYXRjaGVyVGVzdC5qYXZhCkBAIC0wLDAgKzEsMjE0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2UgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255OworCitpbXBvcnQgYW5kcm9pZC50ZWxlcGhvbnkuUGhvbmVOdW1iZXJGb3JtYXR0aW5nVGV4dFdhdGNoZXI7CitpbXBvcnQgYW5kcm9pZC50ZXN0LkFuZHJvaWRUZXN0Q2FzZTsKK2ltcG9ydCBhbmRyb2lkLnRleHQuRWRpdGFibGU7CitpbXBvcnQgYW5kcm9pZC50ZXh0LlNlbGVjdGlvbjsKK2ltcG9ydCBhbmRyb2lkLnRleHQuU3Bhbm5hYmxlU3RyaW5nQnVpbGRlcjsKK2ltcG9ydCBhbmRyb2lkLnRleHQuVGV4dFdhdGNoZXI7CisKK3B1YmxpYyBjbGFzcyBQaG9uZU51bWJlcldhdGNoZXJUZXN0IGV4dGVuZHMgQW5kcm9pZFRlc3RDYXNlIHsKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QXBwZW5kQ2hhcnMoKSB7CisgICAgICAgIGZpbmFsIFN0cmluZyBtdWx0aUNoYXJzID0gIjY1MDEyMzQ1IjsKKyAgICAgICAgZmluYWwgU3RyaW5nIGZvcm1hdHRlZDEgPSAiKDY1MCkgMTIzLTQ1IjsKKyAgICAgICAgVGV4dFdhdGNoZXIgdGV4dFdhdGNoZXIgPSBnZXRUZXh0V2F0Y2hlcigpOworICAgICAgICBTcGFubmFibGVTdHJpbmdCdWlsZGVyIG51bWJlciA9IG5ldyBTcGFubmFibGVTdHJpbmdCdWlsZGVyKCk7CisgICAgICAgIC8vIEFwcGVuZCBtb3JlIHRoYW4gb25lIGNoYXJzCisgICAgICAgIHRleHRXYXRjaGVyLmJlZm9yZVRleHRDaGFuZ2VkKG51bWJlciwgMCwgMCwgbXVsdGlDaGFycy5sZW5ndGgoKSk7CisgICAgICAgIG51bWJlci5hcHBlbmQobXVsdGlDaGFycyk7CisgICAgICAgIFNlbGVjdGlvbi5zZXRTZWxlY3Rpb24obnVtYmVyLCBudW1iZXIubGVuZ3RoKCkpOworICAgICAgICB0ZXh0V2F0Y2hlci5vblRleHRDaGFuZ2VkKG51bWJlciwgMCwgMCwgbnVtYmVyLmxlbmd0aCgpKTsKKyAgICAgICAgdGV4dFdhdGNoZXIuYWZ0ZXJUZXh0Q2hhbmdlZChudW1iZXIpOworICAgICAgICBhc3NlcnRFcXVhbHMoZm9ybWF0dGVkMSwgbnVtYmVyLnRvU3RyaW5nKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoZm9ybWF0dGVkMS5sZW5ndGgoKSwgU2VsZWN0aW9uLmdldFNlbGVjdGlvbkVuZChudW1iZXIpKTsKKyAgICAgICAgLy8gQXBwZW5kIG9uZSBjaGFycworICAgICAgICBmaW5hbCBjaGFyIGFwcGVuZENoYXIgPSAnNic7CisgICAgICAgIGZpbmFsIFN0cmluZyBmb3JtYXR0ZWQyID0gIig2NTApIDEyMy00NTYiOworICAgICAgICBpbnQgbGVuID0gbnVtYmVyLmxlbmd0aCgpOworICAgICAgICB0ZXh0V2F0Y2hlci5iZWZvcmVUZXh0Q2hhbmdlZChudW1iZXIsIG51bWJlci5sZW5ndGgoKSwgMCwgMSk7CisgICAgICAgIG51bWJlci5hcHBlbmQoYXBwZW5kQ2hhcik7CisgICAgICAgIFNlbGVjdGlvbi5zZXRTZWxlY3Rpb24obnVtYmVyLCBudW1iZXIubGVuZ3RoKCkpOworICAgICAgICB0ZXh0V2F0Y2hlci5vblRleHRDaGFuZ2VkKG51bWJlciwgbGVuLCAwLCAxKTsKKyAgICAgICAgdGV4dFdhdGNoZXIuYWZ0ZXJUZXh0Q2hhbmdlZChudW1iZXIpOworICAgICAgICBhc3NlcnRFcXVhbHMoZm9ybWF0dGVkMiwgbnVtYmVyLnRvU3RyaW5nKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoZm9ybWF0dGVkMi5sZW5ndGgoKSwgU2VsZWN0aW9uLmdldFNlbGVjdGlvbkVuZChudW1iZXIpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlTGFzdENoYXJzKCkgeworICAgICAgICBmaW5hbCBTdHJpbmcgaW5pdCA9ICI2NTAxMjM0NTY3OCI7CisgICAgICAgIGZpbmFsIFN0cmluZyByZXN1bHQxID0gIig2NTApIDEyMy00NTY3IjsKKyAgICAgICAgVGV4dFdhdGNoZXIgdGV4dFdhdGNoZXIgPSBnZXRUZXh0V2F0Y2hlcigpOworICAgICAgICAvLyBSZW1vdmUgdGhlIGxhc3QgY2hhci4KKyAgICAgICAgU3Bhbm5hYmxlU3RyaW5nQnVpbGRlciBudW1iZXIgPSBuZXcgU3Bhbm5hYmxlU3RyaW5nQnVpbGRlcihpbml0KTsKKyAgICAgICAgaW50IGxlbiA9IG51bWJlci5sZW5ndGgoKTsKKyAgICAgICAgdGV4dFdhdGNoZXIuYmVmb3JlVGV4dENoYW5nZWQobnVtYmVyLCBsZW4gLSAxLCAxLCAwKTsKKyAgICAgICAgbnVtYmVyLmRlbGV0ZShsZW4gLSAxLCBsZW4pOworICAgICAgICBTZWxlY3Rpb24uc2V0U2VsZWN0aW9uKG51bWJlciwgbnVtYmVyLmxlbmd0aCgpKTsKKyAgICAgICAgdGV4dFdhdGNoZXIub25UZXh0Q2hhbmdlZChudW1iZXIsIG51bWJlci5sZW5ndGgoKSAtIDEsIDEsIDApOworICAgICAgICB0ZXh0V2F0Y2hlci5hZnRlclRleHRDaGFuZ2VkKG51bWJlcik7CisgICAgICAgIGFzc2VydEVxdWFscyhyZXN1bHQxLCBudW1iZXIudG9TdHJpbmcoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhyZXN1bHQxLmxlbmd0aCgpLCBTZWxlY3Rpb24uZ2V0U2VsZWN0aW9uRW5kKG51bWJlcikpOworICAgICAgICAvLyBSZW1vdmUgbGFzdCA1IGNoYXJzCisgICAgICAgIGZpbmFsIFN0cmluZyByZXN1bHQyID0gIig2NTApIDEyMyI7CisgICAgICAgIHRleHRXYXRjaGVyLmJlZm9yZVRleHRDaGFuZ2VkKG51bWJlciwgbnVtYmVyLmxlbmd0aCgpIC0gNCwgNCwgMCk7CisgICAgICAgIG51bWJlci5kZWxldGUobnVtYmVyLmxlbmd0aCgpIC0gNSwgbnVtYmVyLmxlbmd0aCgpKTsKKyAgICAgICAgU2VsZWN0aW9uLnNldFNlbGVjdGlvbihudW1iZXIsIG51bWJlci5sZW5ndGgoKSk7CisgICAgICAgIHRleHRXYXRjaGVyLm9uVGV4dENoYW5nZWQobnVtYmVyLCBudW1iZXIubGVuZ3RoKCksIDQsIDApOworICAgICAgICB0ZXh0V2F0Y2hlci5hZnRlclRleHRDaGFuZ2VkKG51bWJlcik7CisgICAgICAgIGFzc2VydEVxdWFscyhyZXN1bHQyLCBudW1iZXIudG9TdHJpbmcoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhyZXN1bHQyLmxlbmd0aCgpLCBTZWxlY3Rpb24uZ2V0U2VsZWN0aW9uRW5kKG51bWJlcikpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RJbnNlcnRDaGFycygpIHsKKyAgICAgICAgZmluYWwgU3RyaW5nIGluaXQgPSAiKDY1MCkgMjMiOworICAgICAgICBmaW5hbCBTdHJpbmcgZXhwZWN0ZWQxID0gIig2NTApIDEyMyI7CisgICAgICAgIFRleHRXYXRjaGVyIHRleHRXYXRjaGVyID0gZ2V0VGV4dFdhdGNoZXIoKTsKKworICAgICAgICAvLyBJbnNlcnQgb25lIGNoYXIKKyAgICAgICAgU3Bhbm5hYmxlU3RyaW5nQnVpbGRlciBudW1iZXIgPSBuZXcgU3Bhbm5hYmxlU3RyaW5nQnVpbGRlcihpbml0KTsKKyAgICAgICAgdGV4dFdhdGNoZXIuYmVmb3JlVGV4dENoYW5nZWQobnVtYmVyLCA0LCAwLCAxKTsKKyAgICAgICAgbnVtYmVyLmluc2VydCg0LCAiMSIpOyAvLyAoNjUwMSkgMjMKKyAgICAgICAgU2VsZWN0aW9uLnNldFNlbGVjdGlvbihudW1iZXIsIDUpOyAvLyBtYWtlIHRoZSBjdXJzb3IgYXQgcmlnaHQgb2YgMQorICAgICAgICB0ZXh0V2F0Y2hlci5vblRleHRDaGFuZ2VkKG51bWJlciwgNCwgMCwgMSk7CisgICAgICAgIHRleHRXYXRjaGVyLmFmdGVyVGV4dENoYW5nZWQobnVtYmVyKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGV4cGVjdGVkMSwgbnVtYmVyLnRvU3RyaW5nKCkpOworICAgICAgICAvLyB0aGUgY3Vyc29yIHNob3VsZCBzdGlsbCBhdCB0aGUgcmlnaHQgb2YgJzEnCisgICAgICAgIGFzc2VydEVxdWFscyg3LCBTZWxlY3Rpb24uZ2V0U2VsZWN0aW9uRW5kKG51bWJlcikpOworCisgICAgICAgIC8vIEluc2VydCBtdWx0aXBsZSBjaGFycworICAgICAgICBmaW5hbCBTdHJpbmcgZXhwZWN0ZWQyID0gIig2NTApIDE0NS02NzIzIjsKKyAgICAgICAgdGV4dFdhdGNoZXIuYmVmb3JlVGV4dENoYW5nZWQobnVtYmVyLCA3LCAwLCA0KTsKKyAgICAgICAgbnVtYmVyLmluc2VydCg3LCAiNDU2NyIpOyAvLyBjaGFuZ2UgdG8gKDY1MCkgMTQ1NjcyMworICAgICAgICBTZWxlY3Rpb24uc2V0U2VsZWN0aW9uKG51bWJlciwgMTEpOyAvLyB0aGUgY3Vyc29yIGlzIGF0IHRoZSByaWdodCBvZiAnNycuCisgICAgICAgIHRleHRXYXRjaGVyLm9uVGV4dENoYW5nZWQobnVtYmVyLCA3LCAwLCA0KTsKKyAgICAgICAgdGV4dFdhdGNoZXIuYWZ0ZXJUZXh0Q2hhbmdlZChudW1iZXIpOworICAgICAgICBhc3NlcnRFcXVhbHMoZXhwZWN0ZWQyLCBudW1iZXIudG9TdHJpbmcoKSk7CisgICAgICAgIC8vIHRoZSBjdXJzb3Igc2hvdWxkIGJlIHN0aWxsIGF0IHRoZSByaWdodCBvZiAnNycKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEyLCBTZWxlY3Rpb24uZ2V0U2VsZWN0aW9uRW5kKG51bWJlcikpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RTdG9wRm9ybWF0dGluZygpIHsKKyAgICAgICAgZmluYWwgU3RyaW5nIGluaXQgPSAiKDY1MCkgMTIzIjsKKyAgICAgICAgZmluYWwgU3RyaW5nIGV4cGVjdGVkMSA9ICIoNjUwKSAxMjMgNCI7CisgICAgICAgIFRleHRXYXRjaGVyIHRleHRXYXRjaGVyID0gZ2V0VGV4dFdhdGNoZXIoKTsKKworICAgICAgICAvLyBBcHBlbmQgc3BhY2UKKyAgICAgICAgU3Bhbm5hYmxlU3RyaW5nQnVpbGRlciBudW1iZXIgPSBuZXcgU3Bhbm5hYmxlU3RyaW5nQnVpbGRlcihpbml0KTsKKyAgICAgICAgdGV4dFdhdGNoZXIuYmVmb3JlVGV4dENoYW5nZWQobnVtYmVyLCA5LCAwLCAyKTsKKyAgICAgICAgbnVtYmVyLmluc2VydCg5LCAiIDQiKTsgLy8gKDY1MDEpIDIzIDQKKyAgICAgICAgU2VsZWN0aW9uLnNldFNlbGVjdGlvbihudW1iZXIsIG51bWJlci5sZW5ndGgoKSk7IC8vIG1ha2UgdGhlIGN1cnNvciBhdCByaWdodCBvZiA0CisgICAgICAgIHRleHRXYXRjaGVyLm9uVGV4dENoYW5nZWQobnVtYmVyLCA5LCAwLCAyKTsKKyAgICAgICAgdGV4dFdhdGNoZXIuYWZ0ZXJUZXh0Q2hhbmdlZChudW1iZXIpOworICAgICAgICBhc3NlcnRFcXVhbHMoZXhwZWN0ZWQxLCBudW1iZXIudG9TdHJpbmcoKSk7CisgICAgICAgIC8vIHRoZSBjdXJzb3Igc2hvdWxkIHN0aWxsIGF0IHRoZSByaWdodCBvZiAnMScKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGV4cGVjdGVkMS5sZW5ndGgoKSwgU2VsZWN0aW9uLmdldFNlbGVjdGlvbkVuZChudW1iZXIpKTsKKworICAgICAgICAvLyBEZWxldGUgYSAnKScKKyAgICAgICAgZmluYWwgU3RyaW5nIGV4cGVjdGVkMiA9Iig2NTAgMTIzIjsKKyAgICAgICAgdGV4dFdhdGNoZXIgPSBnZXRUZXh0V2F0Y2hlcigpOworICAgICAgICBudW1iZXIgPSBuZXcgU3Bhbm5hYmxlU3RyaW5nQnVpbGRlcihpbml0KTsKKyAgICAgICAgdGV4dFdhdGNoZXIuYmVmb3JlVGV4dENoYW5nZWQobnVtYmVyLCA0LCAxLCAwKTsKKyAgICAgICAgbnVtYmVyLmRlbGV0ZSg0LCA1KTsgLy8gKDY1MDEgMjMgNAorICAgICAgICBTZWxlY3Rpb24uc2V0U2VsZWN0aW9uKG51bWJlciwgNSk7IC8vIG1ha2UgdGhlIGN1cnNvciBhdCByaWdodCBvZiAxCisgICAgICAgIHRleHRXYXRjaGVyLm9uVGV4dENoYW5nZWQobnVtYmVyLCA0LCAxLCAwKTsKKyAgICAgICAgdGV4dFdhdGNoZXIuYWZ0ZXJUZXh0Q2hhbmdlZChudW1iZXIpOworICAgICAgICBhc3NlcnRFcXVhbHMoZXhwZWN0ZWQyLCBudW1iZXIudG9TdHJpbmcoKSk7CisgICAgICAgIC8vIHRoZSBjdXJzb3Igc2hvdWxkIHN0aWxsIGF0IHRoZSByaWdodCBvZiAnMScKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDUsIFNlbGVjdGlvbi5nZXRTZWxlY3Rpb25FbmQobnVtYmVyKSk7CisKKyAgICAgICAgLy8gSW5zZXJ0IGEgaHlwaGVuCisgICAgICAgIGZpbmFsIFN0cmluZyBleHBlY3RlZDMgPSIoNjUwKSAxMi0zIjsKKyAgICAgICAgdGV4dFdhdGNoZXIgPSBnZXRUZXh0V2F0Y2hlcigpOworICAgICAgICBudW1iZXIgPSBuZXcgU3Bhbm5hYmxlU3RyaW5nQnVpbGRlcihpbml0KTsKKyAgICAgICAgdGV4dFdhdGNoZXIuYmVmb3JlVGV4dENoYW5nZWQobnVtYmVyLCA4LCAwLCAxKTsKKyAgICAgICAgbnVtYmVyLmluc2VydCg4LCAiLSIpOyAvLyAoNjUwKSAxMi0zCisgICAgICAgIFNlbGVjdGlvbi5zZXRTZWxlY3Rpb24obnVtYmVyLCA5KTsgLy8gbWFrZSB0aGUgY3Vyc29yIGF0IHJpZ2h0IG9mIC0KKyAgICAgICAgdGV4dFdhdGNoZXIub25UZXh0Q2hhbmdlZChudW1iZXIsIDgsIDAsIDEpOworICAgICAgICB0ZXh0V2F0Y2hlci5hZnRlclRleHRDaGFuZ2VkKG51bWJlcik7CisgICAgICAgIGFzc2VydEVxdWFscyhleHBlY3RlZDMsIG51bWJlci50b1N0cmluZygpKTsKKyAgICAgICAgLy8gdGhlIGN1cnNvciBzaG91bGQgc3RpbGwgYXQgdGhlIHJpZ2h0IG9mICctJworICAgICAgICBhc3NlcnRFcXVhbHMoOSwgU2VsZWN0aW9uLmdldFNlbGVjdGlvbkVuZChudW1iZXIpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVzdGFydEZvcm1hdHRpbmcoKSB7CisgICAgICAgIGZpbmFsIFN0cmluZyBpbml0ID0gIig2NTApIDEyMyI7CisgICAgICAgIGZpbmFsIFN0cmluZyBleHBlY3RlZDEgPSAiKDY1MCkgMTIzIDQiOworICAgICAgICBUZXh0V2F0Y2hlciB0ZXh0V2F0Y2hlciA9IGdldFRleHRXYXRjaGVyKCk7CisKKyAgICAgICAgLy8gQXBwZW5kIHNwYWNlCisgICAgICAgIFNwYW5uYWJsZVN0cmluZ0J1aWxkZXIgbnVtYmVyID0gbmV3IFNwYW5uYWJsZVN0cmluZ0J1aWxkZXIoaW5pdCk7CisgICAgICAgIHRleHRXYXRjaGVyLmJlZm9yZVRleHRDaGFuZ2VkKG51bWJlciwgOSwgMCwgMik7CisgICAgICAgIG51bWJlci5pbnNlcnQoOSwgIiA0Iik7IC8vICg2NTApIDEyMyA0CisgICAgICAgIFNlbGVjdGlvbi5zZXRTZWxlY3Rpb24obnVtYmVyLCBudW1iZXIubGVuZ3RoKCkpOyAvLyBtYWtlIHRoZSBjdXJzb3IgYXQgcmlnaHQgb2YgNAorICAgICAgICB0ZXh0V2F0Y2hlci5vblRleHRDaGFuZ2VkKG51bWJlciwgOSwgMCwgMik7CisgICAgICAgIHRleHRXYXRjaGVyLmFmdGVyVGV4dENoYW5nZWQobnVtYmVyKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGV4cGVjdGVkMSwgbnVtYmVyLnRvU3RyaW5nKCkpOworICAgICAgICAvLyB0aGUgY3Vyc29yIHNob3VsZCBzdGlsbCBhdCB0aGUgcmlnaHQgb2YgJzQnCisgICAgICAgIGFzc2VydEVxdWFscyhleHBlY3RlZDEubGVuZ3RoKCksIFNlbGVjdGlvbi5nZXRTZWxlY3Rpb25FbmQobnVtYmVyKSk7CisKKyAgICAgICAgLy8gQ2xlYXIgdGhlIGN1cnJlbnQgc3RyaW5nLCBhbmQgc3RhcnQgZm9ybWF0dGluZyBhZ2Fpbi4KKyAgICAgICAgaW50IGxlbiA9IG51bWJlci5sZW5ndGgoKTsKKyAgICAgICAgdGV4dFdhdGNoZXIuYmVmb3JlVGV4dENoYW5nZWQobnVtYmVyLCAwLCBsZW4sIDApOworICAgICAgICBudW1iZXIuZGVsZXRlKDAsIGxlbik7CisgICAgICAgIHRleHRXYXRjaGVyLm9uVGV4dENoYW5nZWQobnVtYmVyLCAwLCBsZW4sIDApOworICAgICAgICB0ZXh0V2F0Y2hlci5hZnRlclRleHRDaGFuZ2VkKG51bWJlcik7CisKKyAgICAgICAgZmluYWwgU3RyaW5nIGV4cGVjdGVkMiA9ICIoNjUwKSAxMjMtNCI7CisgICAgICAgIG51bWJlciA9IG5ldyBTcGFubmFibGVTdHJpbmdCdWlsZGVyKGluaXQpOworICAgICAgICB0ZXh0V2F0Y2hlci5iZWZvcmVUZXh0Q2hhbmdlZChudW1iZXIsIDksIDAsIDEpOworICAgICAgICBudW1iZXIuaW5zZXJ0KDksICI0Iik7IC8vICg2NTApIDEyMzQKKyAgICAgICAgU2VsZWN0aW9uLnNldFNlbGVjdGlvbihudW1iZXIsIG51bWJlci5sZW5ndGgoKSk7IC8vIG1ha2UgdGhlIGN1cnNvciBhdCByaWdodCBvZiA0CisgICAgICAgIHRleHRXYXRjaGVyLm9uVGV4dENoYW5nZWQobnVtYmVyLCA5LCAwLCAxKTsKKyAgICAgICAgdGV4dFdhdGNoZXIuYWZ0ZXJUZXh0Q2hhbmdlZChudW1iZXIpOworICAgICAgICBhc3NlcnRFcXVhbHMoZXhwZWN0ZWQyLCBudW1iZXIudG9TdHJpbmcoKSk7CisgICAgICAgIC8vIHRoZSBjdXJzb3Igc2hvdWxkIHN0aWxsIGF0IHRoZSByaWdodCBvZiAnNCcKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGV4cGVjdGVkMi5sZW5ndGgoKSwgU2VsZWN0aW9uLmdldFNlbGVjdGlvbkVuZChudW1iZXIpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VGV4dENoYW5nZWRCeU90aGVyVGV4dFdhdGNoZXIoKSB7CisgICAgICAgIGZpbmFsIFRleHRXYXRjaGVyIGNsZWFudXBUZXh0V2F0Y2hlciA9IG5ldyBUZXh0V2F0Y2hlcigpIHsKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIGFmdGVyVGV4dENoYW5nZWQoRWRpdGFibGUgcykgeworICAgICAgICAgICAgICAgIHMuY2xlYXIoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIHZvaWQgYmVmb3JlVGV4dENoYW5nZWQoQ2hhclNlcXVlbmNlIHMsIGludCBzdGFydCwgaW50IGNvdW50LAorICAgICAgICAgICAgICAgICAgICBpbnQgYWZ0ZXIpIHsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIHZvaWQgb25UZXh0Q2hhbmdlZChDaGFyU2VxdWVuY2UgcywgaW50IHN0YXJ0LCBpbnQgYmVmb3JlLAorICAgICAgICAgICAgICAgICAgICBpbnQgY291bnQpIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKyAgICAgICAgZmluYWwgU3RyaW5nIGluaXQgPSAiKDY1MCkgMTIzIjsKKyAgICAgICAgZmluYWwgU3RyaW5nIGV4cGVjdGVkMSA9ICIiOworICAgICAgICBUZXh0V2F0Y2hlciB0ZXh0V2F0Y2hlciA9IGdldFRleHRXYXRjaGVyKCk7CisKKyAgICAgICAgU3Bhbm5hYmxlU3RyaW5nQnVpbGRlciBudW1iZXIgPSBuZXcgU3Bhbm5hYmxlU3RyaW5nQnVpbGRlcihpbml0KTsKKyAgICAgICAgdGV4dFdhdGNoZXIuYmVmb3JlVGV4dENoYW5nZWQobnVtYmVyLCA1LCAwLCAxKTsKKyAgICAgICAgbnVtYmVyLmluc2VydCg1LCAiNCIpOyAvLyAoNjUwNCkgMTIzCisgICAgICAgIFNlbGVjdGlvbi5zZXRTZWxlY3Rpb24obnVtYmVyLCA1KTsgLy8gbWFrZSB0aGUgY3Vyc29yIGF0IHJpZ2h0IG9mIDQKKyAgICAgICAgdGV4dFdhdGNoZXIub25UZXh0Q2hhbmdlZChudW1iZXIsIDUsIDAsIDEpOworICAgICAgICBudW1iZXIuc2V0U3BhbihjbGVhbnVwVGV4dFdhdGNoZXIsIDAsIG51bWJlci5sZW5ndGgoKSwgMCk7CisgICAgICAgIHRleHRXYXRjaGVyLmFmdGVyVGV4dENoYW5nZWQobnVtYmVyKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGV4cGVjdGVkMSwgbnVtYmVyLnRvU3RyaW5nKCkpOworICAgIH0KKworICAgIHByaXZhdGUgVGV4dFdhdGNoZXIgZ2V0VGV4dFdhdGNoZXIoKSB7CisgICAgICAgIHJldHVybiBuZXcgUGhvbmVOdW1iZXJGb3JtYXR0aW5nVGV4dFdhdGNoZXIoIlVTIik7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVsZXBob255L3Rlc3RzL3RlbGVwaG9ueXRlc3RzL3NyYy9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvU2ltVXRpbHNUZXN0LmphdmEgYi90ZWxlcGhvbnkvdGVzdHMvdGVsZXBob255dGVzdHMvc3JjL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9TaW1VdGlsc1Rlc3QuamF2YQppbmRleCBkYjM4ZWRlLi5lZjYyZDg1IDEwMDY0NAotLS0gYS90ZWxlcGhvbnkvdGVzdHMvdGVsZXBob255dGVzdHMvc3JjL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9TaW1VdGlsc1Rlc3QuamF2YQorKysgYi90ZWxlcGhvbnkvdGVzdHMvdGVsZXBob255dGVzdHMvc3JjL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9TaW1VdGlsc1Rlc3QuamF2YQpAQCAtMjgsNyArMjgsNyBAQAogICAgIHB1YmxpYyB2b2lkIHRlc3RCYXNpYygpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBieXRlW10gZGF0YSwgZGF0YTI7CiAKLSAgICAgICAgLyogCisgICAgICAgIC8qCiAgICAgICAgICAqIGJjZFRvU3RyaW5nKCkKICAgICAgICAgICovCiAKQEAgLTQwLDkgKzQwLDEzIEBACiAgICAgICAgIGFzc2VydEVxdWFscygiMDEyNjA0NTAwMTQ0ODQ4NiIsIEljY1V0aWxzLmJjZFRvU3RyaW5nKGRhdGEsIDEsIGRhdGEubGVuZ3RoIC0gMikpOwogCiAgICAgICAgIC8vIFN0b3BzIG9uIGludmFsaWQgQkNEIHZhbHVlCi0gICAgICAgIGRhdGEgPSBJY2NVdGlscy5oZXhTdHJpbmdUb0J5dGVzKCI5OEYwNjI0MDA1MTA0NDQ4NjhmMiIpOworICAgICAgICBkYXRhID0gSWNjVXRpbHMuaGV4U3RyaW5nVG9CeXRlcygiOThFMDYyNDAwNTEwNDQ0ODY4ZjIiKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKCI4OTAiLCBJY2NVdGlscy5iY2RUb1N0cmluZyhkYXRhLCAwLCBkYXRhLmxlbmd0aCkpOwogCisgICAgICAgIC8vIHNraXAgdGhlIGhpZ2ggbmliYmxlICdGJyBzaW5jZSBzb21lIFBMTU5zIGhhdmUgaXQKKyAgICAgICAgZGF0YSA9IEljY1V0aWxzLmhleFN0cmluZ1RvQnl0ZXMoIjk4RjA2MjQwMDUxMDQ0NDg2OGYyIik7CisgICAgICAgIGFzc2VydEVxdWFscygiODkwMjYwNDUwMDE0NDg0ODYyIiwgSWNjVXRpbHMuYmNkVG9TdHJpbmcoZGF0YSwgMCwgZGF0YS5sZW5ndGgpKTsKKwogICAgICAgICAvKgogICAgICAgICAgKiBnc21CY2RCeXRlVG9JbnQoKQogICAgICAgICAgKi8KZGlmZiAtLWdpdCBhL3RlbGVwaG9ueS90ZXN0cy90ZWxlcGhvbnl0ZXN0cy9zcmMvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L1Rlc3RQaG9uZU5vdGlmaWVyLmphdmEgYi90ZWxlcGhvbnkvdGVzdHMvdGVsZXBob255dGVzdHMvc3JjL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9UZXN0UGhvbmVOb3RpZmllci5qYXZhCmluZGV4IDQyNzc5NWIuLjhjYjA1Y2MgMTAwNjQ0Ci0tLSBhL3RlbGVwaG9ueS90ZXN0cy90ZWxlcGhvbnl0ZXN0cy9zcmMvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L1Rlc3RQaG9uZU5vdGlmaWVyLmphdmEKKysrIGIvdGVsZXBob255L3Rlc3RzL3RlbGVwaG9ueXRlc3RzL3NyYy9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvVGVzdFBob25lTm90aWZpZXIuamF2YQpAQCAtMTYsNiArMTYsOCBAQAogCiBwYWNrYWdlIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueTsKIAoraW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5QaG9uZTsKKwogLyoqCiAgKiBTdHViIGNsYXNzIHVzZWQgZm9yIHVuaXQgdGVzdHMKICAqLwpAQCAtMzIsNyArMzQsNyBAQAogCiAgICAgcHVibGljIHZvaWQgbm90aWZ5Q2VsbExvY2F0aW9uKFBob25lIHNlbmRlcikgewogICAgIH0KLSAgICAKKwogICAgIHB1YmxpYyB2b2lkIG5vdGlmeVNpZ25hbFN0cmVuZ3RoKFBob25lIHNlbmRlcikgewogICAgIH0KIApAQCAtNDIsMTAgKzQ0LDE0IEBACiAgICAgcHVibGljIHZvaWQgbm90aWZ5Q2FsbEZvcndhcmRpbmdDaGFuZ2VkKFBob25lIHNlbmRlcikgewogICAgIH0KIAotICAgIHB1YmxpYyB2b2lkIG5vdGlmeURhdGFDb25uZWN0aW9uKFBob25lIHNlbmRlciwgU3RyaW5nIHJlYXNvbikgeworICAgIHB1YmxpYyB2b2lkIG5vdGlmeURhdGFDb25uZWN0aW9uKFBob25lIHNlbmRlciwgU3RyaW5nIHJlYXNvbiwgU3RyaW5nIGFwblR5cGUpIHsKICAgICB9CiAKLSAgICBwdWJsaWMgdm9pZCBub3RpZnlEYXRhQ29ubmVjdGlvbkZhaWxlZChQaG9uZSBzZW5kZXIsIFN0cmluZyByZWFzb24pIHsKKyAgICBwdWJsaWMgdm9pZCBub3RpZnlEYXRhQ29ubmVjdGlvbihQaG9uZSBzZW5kZXIsIFN0cmluZyByZWFzb24sIFN0cmluZyBhcG5UeXBlLAorICAgICAgICAgICAgUGhvbmUuRGF0YVN0YXRlIHN0YXRlKSB7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgbm90aWZ5RGF0YUNvbm5lY3Rpb25GYWlsZWQoUGhvbmUgc2VuZGVyLCBTdHJpbmcgcmVhc29uLCBTdHJpbmcgYXBuVHlwZSkgewogICAgIH0KIAogICAgIHB1YmxpYyB2b2lkIG5vdGlmeURhdGFBY3Rpdml0eShQaG9uZSBzZW5kZXIpIHsKZGlmZiAtLWdpdCBhL3RlbGVwaG9ueS90ZXN0cy90ZWxlcGhvbnl0ZXN0cy9zcmMvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2dzbS9HU01QaG9uZVRlc3QuamF2YSBiL3RlbGVwaG9ueS90ZXN0cy90ZWxlcGhvbnl0ZXN0cy9zcmMvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2dzbS9HU01QaG9uZVRlc3QuamF2YQppbmRleCBiOTY3NDNhLi40ODU1NDJiIDEwMDY0NAotLS0gYS90ZWxlcGhvbnkvdGVzdHMvdGVsZXBob255dGVzdHMvc3JjL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9nc20vR1NNUGhvbmVUZXN0LmphdmEKKysrIGIvdGVsZXBob255L3Rlc3RzL3RlbGVwaG9ueXRlc3RzL3NyYy9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvZ3NtL0dTTVBob25lVGVzdC5qYXZhCkBAIC0xOCwyNyArMTgsMjEgQEAKIAogaW1wb3J0IGFuZHJvaWQub3MuQXN5bmNSZXN1bHQ7CiBpbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyOwotaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlclRocmVhZDsKLWltcG9ydCBhbmRyb2lkLm9zLkxvb3BlcjsKIGltcG9ydCBhbmRyb2lkLm9zLk1lc3NhZ2U7Ci1pbXBvcnQgYW5kcm9pZC5vcy5Qcm9jZXNzOwogaW1wb3J0IGFuZHJvaWQudGVsZXBob255LlNlcnZpY2VTdGF0ZTsKIGltcG9ydCBhbmRyb2lkLnRlc3QuQW5kcm9pZFRlc3RDYXNlOwogaW1wb3J0IGFuZHJvaWQudGVzdC5QZXJmb3JtYW5jZVRlc3RDYXNlOwotaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CiAKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuQ2FsbDsKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuQ2FsbFN0YXRlRXhjZXB0aW9uOwogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5Db25uZWN0aW9uOwogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5NbWlDb2RlOwogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5QaG9uZTsKLWltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuVGVzdFBob25lTm90aWZpZXI7CiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmdzbS5DYWxsRmFpbENhdXNlOwogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uR1NNUGhvbmU7CiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmdzbS5HU01UZXN0SGFuZGxlcjsKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuZ3NtLkdzbU1taUNvZGU7CiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmdzbS5TdXBwU2VydmljZU5vdGlmaWNhdGlvbjsKLWltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkudGVzdC5TaW11bGF0ZWRDb21tYW5kczsKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkudGVzdC5TaW11bGF0ZWRSYWRpb0NvbnRyb2w7CiAKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKZGlmZiAtLWdpdCBhL3RlbGVwaG9ueS90ZXN0cy90ZWxlcGhvbnl0ZXN0cy9zcmMvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L21vY2tyaWwvTW9ja1JpbFRlc3QuamF2YSBiL3RlbGVwaG9ueS90ZXN0cy90ZWxlcGhvbnl0ZXN0cy9zcmMvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L21vY2tyaWwvTW9ja1JpbFRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMGQ1YjMxCi0tLSAvZGV2L251bGwKKysrIGIvdGVsZXBob255L3Rlc3RzL3RlbGVwaG9ueXRlc3RzL3NyYy9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvbW9ja3JpbC9Nb2NrUmlsVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTk3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkubW9ja3JpbDsKKworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CitpbXBvcnQgYW5kcm9pZC50ZXN0Lkluc3RydW1lbnRhdGlvblRlc3RDYXNlOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOworCitpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwuY29tbXVuaWNhdGlvbi5Nc2dIZWFkZXI7CitpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwuY29tbXVuaWNhdGlvbi5Nc2c7CitpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LlJpbENoYW5uZWw7CitpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LnJpbF9wcm90by5SaWxDdHJsQ21kczsKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkucmlsX3Byb3RvLlJpbENtZHM7CisKK2ltcG9ydCBjb20uYW5kcm9pZC5mcmFtZXdvcmtzLnRlbGVwaG9ueXRlc3RzLlRlbGVwaG9ueU1vY2tSaWxUZXN0UnVubmVyOworaW1wb3J0IGNvbS5nb29nbGUucHJvdG9idWYubWljcm8uSW52YWxpZFByb3RvY29sQnVmZmVyTWljcm9FeGNlcHRpb247CisKKy8vIFRlc3Qgc3VpdGUgZm9yIHRlc3QgcmlsCitwdWJsaWMgY2xhc3MgTW9ja1JpbFRlc3QgZXh0ZW5kcyBJbnN0cnVtZW50YXRpb25UZXN0Q2FzZSB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJNb2NrUmlsVGVzdCI7CisKKyAgICBSaWxDaGFubmVsIG1Nb2NrUmlsQ2hhbm5lbDsKKyAgICBUZWxlcGhvbnlNb2NrUmlsVGVzdFJ1bm5lciBtUnVubmVyOworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgc3VwZXIuc2V0VXAoKTsKKyAgICAgICAgbVJ1bm5lciA9IChUZWxlcGhvbnlNb2NrUmlsVGVzdFJ1bm5lcilnZXRJbnN0cnVtZW50YXRpb24oKTsKKyAgICAgICAgbU1vY2tSaWxDaGFubmVsID0gbVJ1bm5lci5tTW9ja1JpbENoYW5uZWw7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgc3VwZXIudGVhckRvd24oKTsKKyAgICB9CisKKyAgICBzdGF0aWMgdm9pZCBsb2coU3RyaW5nIHMpIHsKKyAgICAgICAgTG9nLnYoVEFHLCBzKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0IHByb3RvYnVmIHNlcmlhbGl6YXRpb24gYW5kIGRlc2VyaWFsaXphdGlvbgorICAgICAqIEB0aHJvd3MgSW52YWxpZFByb3RvY29sQnVmZmVyTWljcm9FeGNlcHRpb24KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0UHJvdG9idWZTZXJEZXMoKSB0aHJvd3MgSW52YWxpZFByb3RvY29sQnVmZmVyTWljcm9FeGNlcHRpb24geworICAgICAgICBsb2coInRlc3RQcm90b2J1ZlNlcmRlcyBFIik7CisKKyAgICAgICAgUmlsQ3RybENtZHMuQ3RybFJzcFJhZGlvU3RhdGUgcnMgPSBuZXcgUmlsQ3RybENtZHMuQ3RybFJzcFJhZGlvU3RhdGUoKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShTdHJpbmcuZm9ybWF0KCJleHBlY3RlZCBycy5zdGF0ZSA9PSAwIHdhcyAlZCIsIHJzLmdldFN0YXRlKCkpLAorICAgICAgICAgICAgICAgIHJzLmdldFN0YXRlKCkgPT0gMCk7CisgICAgICAgIHJzLnNldFN0YXRlKDEpOworICAgICAgICBhc3NlcnRUcnVlKFN0cmluZy5mb3JtYXQoImV4cGVjdGVkIHJzLnN0YXRlID09IDEgd2FzICVkIiwgcnMuZ2V0U3RhdGUoKSksCisgICAgICAgICAgICAgICAgcnMuZ2V0U3RhdGUoKSA9PSAxKTsKKworICAgICAgICBieXRlW10gcnNfc2VyID0gcnMudG9CeXRlQXJyYXkoKTsKKyAgICAgICAgUmlsQ3RybENtZHMuQ3RybFJzcFJhZGlvU3RhdGUgcnNOZXcgPSBSaWxDdHJsQ21kcy5DdHJsUnNwUmFkaW9TdGF0ZS5wYXJzZUZyb20ocnNfc2VyKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShTdHJpbmcuZm9ybWF0KCJleHBlY3RlZCByc05ldy5zdGF0ZSA9PSAxIHdhcyAlZCIsIHJzLmdldFN0YXRlKCkpLAorICAgICAgICAgICAgICAgIHJzLmdldFN0YXRlKCkgPT0gMSk7CisKKyAgICAgICAgbG9nKCJ0ZXN0UHJvdG9idWZTZXJkZXMgWCIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3QgZWNobyBjb21tYW5kIHdvcmtzIHVzaW5nIHdyaXRlTXNnICYgcmVhZE1zZworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RFY2hvTXNnKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgbG9nKCJ0ZXN0RWNob01zZyBFIik7CisKKyAgICAgICAgTXNnSGVhZGVyIG1oID0gbmV3IE1zZ0hlYWRlcigpOworICAgICAgICBtaC5zZXRDbWQoMCk7CisgICAgICAgIG1oLnNldFRva2VuKDEpOworICAgICAgICBtaC5zZXRTdGF0dXMoMik7CisgICAgICAgIEJ5dGVCdWZmZXIgZGF0YSA9IEJ5dGVCdWZmZXIuYWxsb2NhdGUoMyk7CisgICAgICAgIGRhdGEucHV0KChieXRlKTMpOworICAgICAgICBkYXRhLnB1dCgoYnl0ZSk0KTsKKyAgICAgICAgZGF0YS5wdXQoKGJ5dGUpNSk7CisgICAgICAgIE1zZy5zZW5kKG1Nb2NrUmlsQ2hhbm5lbCwgbWgsIGRhdGEpOworCisgICAgICAgIE1zZyByZXNwTXNnID0gTXNnLnJlY3YobU1vY2tSaWxDaGFubmVsKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShTdHJpbmcuZm9ybWF0KCJleHBlY3RlZCBtaGQuaGVhZGVyLmNtZCA9PSAwIHdhcyAlZCIscmVzcE1zZy5nZXRDbWQoKSksCisgICAgICAgICAgICAgICAgcmVzcE1zZy5nZXRDbWQoKSA9PSAwKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShTdHJpbmcuZm9ybWF0KCJleHBlY3RlZCBtaGQuaGVhZGVyLnRva2VuID09IDEgd2FzICVkIixyZXNwTXNnLmdldFRva2VuKCkpLAorICAgICAgICAgICAgICAgIHJlc3BNc2cuZ2V0VG9rZW4oKSA9PSAxKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShTdHJpbmcuZm9ybWF0KCJleHBlY3RlZCBtaGQuaGVhZGVyLnN0YXR1cyA9PSAyIHdhcyAlZCIsIHJlc3BNc2cuZ2V0U3RhdHVzKCkpLAorICAgICAgICAgICAgICAgIHJlc3BNc2cuZ2V0U3RhdHVzKCkgPT0gMik7CisgICAgICAgIGFzc2VydFRydWUoU3RyaW5nLmZvcm1hdCgiZXhwZWN0ZWQgbWhkLmRhdGFbMF0gPT0gMyB3YXMgJWQiLCByZXNwTXNnLmdldERhdGEoMCkpLAorICAgICAgICAgICAgICAgIHJlc3BNc2cuZ2V0RGF0YSgwKSA9PSAzKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShTdHJpbmcuZm9ybWF0KCJleHBlY3RlZCBtaGQuZGF0YVsxXSA9PSA0IHdhcyAlZCIsIHJlc3BNc2cuZ2V0RGF0YSgxKSksCisgICAgICAgICAgICAgICAgcmVzcE1zZy5nZXREYXRhKDEpID09IDQpOworICAgICAgICBhc3NlcnRUcnVlKFN0cmluZy5mb3JtYXQoImV4cGVjdGVkIG1oZC5kYXRhWzJdID09IDUgd2FzICVkIiwgcmVzcE1zZy5nZXREYXRhKDIpKSwKKyAgICAgICAgICAgICAgICByZXNwTXNnLmdldERhdGEoMikgPT0gNSk7CisKKyAgICAgICAgbG9nKCJ0ZXN0RWNob01zZyBYIik7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdCBnZXQgYXMKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0QXMoKSB7CisgICAgICAgIGxvZygidGVzdEdldEFzIEUiKTsKKworICAgICAgICAvLyBVc2UgYSBtZXNzYWdlIGhlYWRlciBhcyB0aGUgcHJvdG9idWYgZGF0YSBjb250ZW50CisgICAgICAgIE1zZ0hlYWRlciBtaCA9IG5ldyBNc2dIZWFkZXIoKTsKKyAgICAgICAgbWguc2V0Q21kKDEyMzQ1KTsKKyAgICAgICAgbWguc2V0VG9rZW4oOTg3Nik7CisgICAgICAgIG1oLnNldFN0YXR1cyg3NjU0KTsKKyAgICAgICAgbWguc2V0TGVuZ3RoRGF0YSg0MzIxKTsKKyAgICAgICAgYnl0ZVtdIGRhdGEgPSBtaC50b0J5dGVBcnJheSgpOworICAgICAgICBNc2dIZWFkZXIgbWhSZXN1bHQgPSBNc2cuZ2V0QXMoTXNnSGVhZGVyLmNsYXNzLCBkYXRhKTsKKworICAgICAgICBhc3NlcnRUcnVlKFN0cmluZy5mb3JtYXQoImV4cGVjdGVkIGNtZCA9PSAxMjM0NSB3YXMgJWQiLCBtaFJlc3VsdC5nZXRDbWQoKSksCisgICAgICAgICAgICAgICAgbWhSZXN1bHQuZ2V0Q21kKCkgPT0gMTIzNDUpOworICAgICAgICBhc3NlcnRUcnVlKFN0cmluZy5mb3JtYXQoImV4cGVjdGVkIHRva2VuID09IDk4NzYgd2FzICVkIiwgbWhSZXN1bHQuZ2V0VG9rZW4oKSksCisgICAgICAgICAgICAgICAgbWhSZXN1bHQuZ2V0VG9rZW4oKSA9PSA5ODc2KTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShTdHJpbmcuZm9ybWF0KCJleHBlY3RlZCBzdGF0dXMgPT0gNzY1NCB3YXMgJWQiLCBtaFJlc3VsdC5nZXRTdGF0dXMoKSksCisgICAgICAgICAgICAgICAgbWhSZXN1bHQuZ2V0U3RhdHVzKCkgPT0gNzY1NCk7CisgICAgICAgIGFzc2VydFRydWUoU3RyaW5nLmZvcm1hdCgiZXhwZWN0ZWQgbGVuZ3RoRGF0YSA9PSA0MzIxIHdhcyAlZCIsIG1oUmVzdWx0LmdldExlbmd0aERhdGEoKSksCisgICAgICAgICAgICAgICAgbWhSZXN1bHQuZ2V0TGVuZ3RoRGF0YSgpID09IDQzMjEpOworCisgICAgICAgIE1zZyBtc2cgPSBNc2cub2J0YWluKCk7CisgICAgICAgIG1zZy5zZXREYXRhKEJ5dGVCdWZmZXIud3JhcChkYXRhKSk7CisKKyAgICAgICAgbWhSZXN1bHQgPSBtc2cuZ2V0RGF0YUFzKE1zZ0hlYWRlci5jbGFzcyk7CisKKyAgICAgICAgYXNzZXJ0VHJ1ZShTdHJpbmcuZm9ybWF0KCJleHBlY3RlZCBjbWQgPT0gMTIzNDUgd2FzICVkIiwgbWhSZXN1bHQuZ2V0Q21kKCkpLAorICAgICAgICAgICAgICAgIG1oUmVzdWx0LmdldENtZCgpID09IDEyMzQ1KTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShTdHJpbmcuZm9ybWF0KCJleHBlY3RlZCB0b2tlbiA9PSA5ODc2IHdhcyAlZCIsIG1oUmVzdWx0LmdldFRva2VuKCkpLAorICAgICAgICAgICAgICAgIG1oUmVzdWx0LmdldFRva2VuKCkgPT0gOTg3Nik7CisgICAgICAgIGFzc2VydFRydWUoU3RyaW5nLmZvcm1hdCgiZXhwZWN0ZWQgc3RhdHVzID09IDc2NTQgd2FzICVkIiwgbWhSZXN1bHQuZ2V0U3RhdHVzKCkpLAorICAgICAgICAgICAgICAgIG1oUmVzdWx0LmdldFN0YXR1cygpID09IDc2NTQpOworICAgICAgICBhc3NlcnRUcnVlKFN0cmluZy5mb3JtYXQoImV4cGVjdGVkIGxlbmd0aERhdGEgPT0gNDMyMSB3YXMgJWQiLCBtaFJlc3VsdC5nZXRMZW5ndGhEYXRhKCkpLAorICAgICAgICAgICAgICAgIG1oUmVzdWx0LmdldExlbmd0aERhdGEoKSA9PSA0MzIxKTsKKworICAgICAgICBsb2coInRlc3RHZXRBcyBYIik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEdldFJhZGlvU3RhdGUoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBsb2coInRlc3RHZXRSYWRpb1N0YXRlIEUiKTsKKworICAgICAgICBNc2cuc2VuZChtTW9ja1JpbENoYW5uZWwsIDEsIDk4NzYsIDAsIG51bGwpOworCisgICAgICAgIE1zZyByZXNwID0gTXNnLnJlY3YobU1vY2tSaWxDaGFubmVsKTsKKyAgICAgICAgLy9yZXNwLnByaW50SGVhZGVyKCJ0ZXN0R2V0UmFkaW9TdGF0ZSIpOworCisgICAgICAgIGFzc2VydFRydWUoU3RyaW5nLmZvcm1hdCgiZXhwZWN0ZWQgY21kID09IDEgd2FzICVkIiwgcmVzcC5nZXRDbWQoKSksCisgICAgICAgICAgICAgICAgcmVzcC5nZXRDbWQoKSA9PSAxKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShTdHJpbmcuZm9ybWF0KCJleHBlY3RlZCB0b2tlbiA9PSA5ODc2IHdhcyAlZCIsIHJlc3AuZ2V0VG9rZW4oKSksCisgICAgICAgICAgICAgICAgcmVzcC5nZXRUb2tlbigpID09IDk4NzYpOworICAgICAgICBhc3NlcnRUcnVlKFN0cmluZy5mb3JtYXQoImV4cGVjdGVkIHN0YXR1cyA9PSAwIHdhcyAlZCIsIHJlc3AuZ2V0U3RhdHVzKCkpLAorICAgICAgICAgICAgICAgIHJlc3AuZ2V0U3RhdHVzKCkgPT0gMCk7CisKKyAgICAgICAgUmlsQ3RybENtZHMuQ3RybFJzcFJhZGlvU3RhdGUgcnNwID0gcmVzcC5nZXREYXRhQXMoUmlsQ3RybENtZHMuQ3RybFJzcFJhZGlvU3RhdGUuY2xhc3MpOworCisgICAgICAgIGludCBzdGF0ZSA9IHJzcC5nZXRTdGF0ZSgpOworICAgICAgICBsb2coInRlc3RHZXRSYWRpb1N0YXRlIHN0YXRlPSIgKyBzdGF0ZSk7CisgICAgICAgIGFzc2VydFRydWUoU3RyaW5nLmZvcm1hdCgiZXhwZWN0ZWQgUmFkaW9TdGF0ZSA+PSAwICYmIFJhZGlvU3RhdGUgPD0gOSB3YXMgJWQiLCBzdGF0ZSksCisgICAgICAgICAgICAgICAgKChzdGF0ZSA+PSAwKSAmJiAoc3RhdGUgPD0gOSkpKTsKKworICAgICAgICBsb2coInRlc3RHZXRSYWRpb1N0YXRlIFgiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2V0UmFkaW9TdGF0ZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGxvZygidGVzdFNldFJhZGlvU3RhdGUgRSIpOworCisgICAgICAgIFJpbEN0cmxDbWRzLkN0cmxSZXFSYWRpb1N0YXRlIGNtZHJzID0gbmV3IFJpbEN0cmxDbWRzLkN0cmxSZXFSYWRpb1N0YXRlKCk7CisgICAgICAgIGFzc2VydEVxdWFscygwLCBjbWRycy5nZXRTdGF0ZSgpKTsKKworICAgICAgICBjbWRycy5zZXRTdGF0ZShSaWxDbWRzLlJBRElPU1RBVEVfU0lNX05PVF9SRUFEWSk7CisgICAgICAgIGFzc2VydEVxdWFscygyLCBjbWRycy5nZXRTdGF0ZSgpKTsKKworICAgICAgICBNc2cuc2VuZChtTW9ja1JpbENoYW5uZWwsIFJpbEN0cmxDbWRzLkNUUkxfQ01EX1NFVF9SQURJT19TVEFURSwgMCwgMCwgY21kcnMpOworCisgICAgICAgIE1zZyByZXNwID0gTXNnLnJlY3YobU1vY2tSaWxDaGFubmVsKTsKKworICAgICAgICBSaWxDdHJsQ21kcy5DdHJsUnNwUmFkaW9TdGF0ZSByc3AgPSByZXNwLmdldERhdGFBcyhSaWxDdHJsQ21kcy5DdHJsUnNwUmFkaW9TdGF0ZS5jbGFzcyk7CisKKyAgICAgICAgaW50IHN0YXRlID0gcnNwLmdldFN0YXRlKCk7CisgICAgICAgIGxvZygiZ2V0IHJlc3BvbnNlIGZvciB0ZXN0U2V0UmFkaW9TdGF0ZTogIiArIHN0YXRlKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShSaWxDbWRzLlJBRElPU1RBVEVfU0lNX05PVF9SRUFEWSA9PSBzdGF0ZSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdC1ydW5uZXIvc3JjL2FuZHJvaWQvdGVzdC9Mb2FkZXJUZXN0Q2FzZS5qYXZhIGIvdGVzdC1ydW5uZXIvc3JjL2FuZHJvaWQvdGVzdC9Mb2FkZXJUZXN0Q2FzZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhiZTY1OTAKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0LXJ1bm5lci9zcmMvYW5kcm9pZC90ZXN0L0xvYWRlclRlc3RDYXNlLmphdmEKQEAgLTAsMCArMSwxMDEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZQorICovCisKK3BhY2thZ2UgYW5kcm9pZC50ZXN0OworCitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkxvYWRlcjsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuTG9hZGVyLk9uTG9hZENvbXBsZXRlTGlzdGVuZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5Bc3luY1Rhc2s7CitpbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyOworaW1wb3J0IGFuZHJvaWQub3MuTG9vcGVyOworaW1wb3J0IGFuZHJvaWQub3MuTWVzc2FnZTsKKworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkFycmF5QmxvY2tpbmdRdWV1ZTsKKworLyoqCisgKiBBIGNvbnZlbmllbmNlIGNsYXNzIGZvciB0ZXN0aW5nIHtAbGluayBMb2FkZXJ9cy4gVGhpcyB0ZXN0IGNhc2UKKyAqIHByb3ZpZGVzIGEgc2ltcGxlIHdheSB0byBzeW5jaHJvbm91c2x5IGdldCB0aGUgcmVzdWx0IGZyb20gYSBMb2FkZXIgbWFraW5nCisgKiBpdCBlYXN5IHRvIGFzc2VydCB0aGF0IHRoZSBMb2FkZXIgcmV0dXJucyB0aGUgZXhwZWN0ZWQgcmVzdWx0LgorICovCitwdWJsaWMgY2xhc3MgTG9hZGVyVGVzdENhc2UgZXh0ZW5kcyBBbmRyb2lkVGVzdENhc2UgeworICAgIHN0YXRpYyB7CisgICAgICAgIC8vIEZvcmNlIGNsYXNzIGxvYWRpbmcgb2YgQXN5bmNUYXNrIG9uIHRoZSBtYWluIHRocmVhZCBzbyB0aGF0IGl0J3MgaGFuZGxlcnMgYXJlIHRpZWQgdG8KKyAgICAgICAgLy8gdGhlIG1haW4gdGhyZWFkIGFuZCByZXNwb25zZXMgZnJvbSB0aGUgd29ya2VyIHRocmVhZCBnZXQgZGVsaXZlcmVkIG9uIHRoZSBtYWluIHRocmVhZC4KKyAgICAgICAgLy8gVGhlIHRlc3RzIGFyZSBydW4gb24gYW5vdGhlciB0aHJlYWQsIGFsbG93aW5nIHRoZW0gdG8gYmxvY2sgd2FpdGluZyBvbiBhIHJlc3BvbnNlIGZyb20KKyAgICAgICAgLy8gdGhlIGNvZGUgcnVubmluZyBvbiB0aGUgbWFpbiB0aHJlYWQuIFRoZSBtYWluIHRocmVhZCBjYW4ndCBibG9jayBzaW5jZSB0aGUgQXlzbmNUYXNrCisgICAgICAgIC8vIHJlc3VsdHMgY29tZSBpbiB2aWEgdGhlIGV2ZW50IGxvb3AuCisgICAgICAgIG5ldyBBc3luY1Rhc2s8Vm9pZCwgVm9pZCwgVm9pZD4oKSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHByb3RlY3RlZCBWb2lkIGRvSW5CYWNrZ3JvdW5kKFZvaWQuLi4gYXJncykge3JldHVybiBudWxsO30KKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHJvdGVjdGVkIHZvaWQgb25Qb3N0RXhlY3V0ZShWb2lkIHJlc3VsdCkge30KKyAgICAgICAgfTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSdW5zIGEgTG9hZGVyIHN5bmNocm9ub3VzbHkgYW5kIHJldHVybnMgdGhlIHJlc3VsdCBvZiB0aGUgbG9hZC4gVGhlIGxvYWRlciB3aWxsCisgICAgICogYmUgc3RhcnRlZCwgc3RvcHBlZCwgYW5kIGRlc3Ryb3llZCBieSB0aGlzIG1ldGhvZCBzbyBpdCBjYW5ub3QgYmUgcmV1c2VkLgorICAgICAqCisgICAgICogQHBhcmFtIGxvYWRlciBUaGUgbG9hZGVyIHRvIHJ1biBzeW5jaHJvbm91c2x5CisgICAgICogQHJldHVybiBUaGUgcmVzdWx0IGZyb20gdGhlIGxvYWRlcgorICAgICAqLworICAgIHB1YmxpYyA8VD4gVCBnZXRMb2FkZXJSZXN1bHRTeW5jaHJvbm91c2x5KGZpbmFsIExvYWRlcjxUPiBsb2FkZXIpIHsKKyAgICAgICAgLy8gVGhlIHRlc3QgdGhyZWFkIGJsb2NrcyBvbiB0aGlzIHF1ZXVlIHVudGlsIHRoZSBsb2FkZXIgcHV0cyBpdCdzIHJlc3VsdCBpbgorICAgICAgICBmaW5hbCBBcnJheUJsb2NraW5nUXVldWU8VD4gcXVldWUgPSBuZXcgQXJyYXlCbG9ja2luZ1F1ZXVlPFQ+KDEpOworCisgICAgICAgIC8vIFRoaXMgY2FsbGJhY2sgcnVucyBvbiB0aGUgIm1haW4iIHRocmVhZCBhbmQgdW5ibG9ja3MgdGhlIHRlc3QgdGhyZWFkCisgICAgICAgIC8vIHdoZW4gaXQgcHV0cyB0aGUgcmVzdWx0IGludG8gdGhlIGJsb2NraW5nIHF1ZXVlCisgICAgICAgIGZpbmFsIE9uTG9hZENvbXBsZXRlTGlzdGVuZXI8VD4gbGlzdGVuZXIgPSBuZXcgT25Mb2FkQ29tcGxldGVMaXN0ZW5lcjxUPigpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgb25Mb2FkQ29tcGxldGUoTG9hZGVyPFQ+IGNvbXBsZXRlZExvYWRlciwgVCBkYXRhKSB7CisgICAgICAgICAgICAgICAgLy8gU2h1dCB0aGUgbG9hZGVyIGRvd24KKyAgICAgICAgICAgICAgICBjb21wbGV0ZWRMb2FkZXIudW5yZWdpc3Rlckxpc3RlbmVyKHRoaXMpOworICAgICAgICAgICAgICAgIGNvbXBsZXRlZExvYWRlci5zdG9wTG9hZGluZygpOworICAgICAgICAgICAgICAgIGNvbXBsZXRlZExvYWRlci5kZXN0cm95KCk7CisKKyAgICAgICAgICAgICAgICAvLyBTdG9yZSB0aGUgcmVzdWx0LCB1bmJsb2NraW5nIHRoZSB0ZXN0IHRocmVhZAorICAgICAgICAgICAgICAgIHF1ZXVlLmFkZChkYXRhKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKworICAgICAgICAvLyBUaGlzIGhhbmRsZXIgcnVucyBvbiB0aGUgIm1haW4iIHRocmVhZCBvZiB0aGUgcHJvY2VzcyBzaW5jZSBBc3luY1Rhc2sKKyAgICAgICAgLy8gaXMgZG9jdW1lbnRlZCBhcyBuZWVkaW5nIHRvIHJ1biBvbiB0aGUgbWFpbiB0aHJlYWQgYW5kIG1hbnkgTG9hZGVycyB1c2UKKyAgICAgICAgLy8gQXN5bmNUYXNrCisgICAgICAgIGZpbmFsIEhhbmRsZXIgbWFpblRocmVhZEhhbmRsZXIgPSBuZXcgSGFuZGxlcihMb29wZXIuZ2V0TWFpbkxvb3BlcigpKSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIGhhbmRsZU1lc3NhZ2UoTWVzc2FnZSBtc2cpIHsKKyAgICAgICAgICAgICAgICBsb2FkZXIucmVnaXN0ZXJMaXN0ZW5lcigwLCBsaXN0ZW5lcik7CisgICAgICAgICAgICAgICAgbG9hZGVyLnN0YXJ0TG9hZGluZygpOworICAgICAgICAgICAgfQorICAgICAgICB9OworCisgICAgICAgIC8vIEFzayB0aGUgbWFpbiB0aHJlYWQgdG8gc3RhcnQgdGhlIGxvYWRpbmcgcHJvY2VzcworICAgICAgICBtYWluVGhyZWFkSGFuZGxlci5zZW5kRW1wdHlNZXNzYWdlKDApOworCisgICAgICAgIC8vIEJsb2NrIG9uIHRoZSBxdWV1ZSB3YWl0aW5nIGZvciB0aGUgcmVzdWx0IG9mIHRoZSBsb2FkIHRvIGJlIGluc2VydGVkCisgICAgICAgIFQgcmVzdWx0OworICAgICAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICByZXN1bHQgPSBxdWV1ZS50YWtlKCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIndhaXRpbmcgdGhyZWFkIGludGVycnVwdGVkIiwgZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3QtcnVubmVyL3NyYy9hbmRyb2lkL3Rlc3QvUHJvdmlkZXJUZXN0Q2FzZS5qYXZhIGIvdGVzdC1ydW5uZXIvc3JjL2FuZHJvaWQvdGVzdC9Qcm92aWRlclRlc3RDYXNlLmphdmEKaW5kZXggZTExNzJjZi4uNzRjZWJlZSAxMDA2NDQKLS0tIGEvdGVzdC1ydW5uZXIvc3JjL2FuZHJvaWQvdGVzdC9Qcm92aWRlclRlc3RDYXNlLmphdmEKKysrIGIvdGVzdC1ydW5uZXIvc3JjL2FuZHJvaWQvdGVzdC9Qcm92aWRlclRlc3RDYXNlLmphdmEKQEAgLTczLDYgKzczLDE4IEBACiAgICAgICAgIG1SZXNvbHZlci5hZGRQcm92aWRlcihtUHJvdmlkZXJBdXRob3JpdHksIGdldFByb3ZpZGVyKCkpOwogICAgIH0KIAorICAgIC8qKgorICAgICAqIFRlYXJzIGRvd24gdGhlIGVudmlyb25tZW50IGZvciB0aGUgdGVzdCBmaXh0dXJlLgorICAgICAqIDxwPgorICAgICAqIENhbGxzIHtAbGluayBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFByb3ZpZGVyI3NodXRkb3duKCl9IG9uIHRoZQorICAgICAqIHtAbGluayBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFByb3ZpZGVyfSByZXByZXNlbnRlZCBieSBtUHJvdmlkZXIuCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgbVByb3ZpZGVyLnNodXRkb3duKCk7CisgICAgICAgIHN1cGVyLnRlYXJEb3duKCk7CisgICAgfQorCiAgICAgcHVibGljIE1vY2tDb250ZW50UmVzb2x2ZXIgZ2V0TW9ja0NvbnRlbnRSZXNvbHZlcigpIHsKICAgICAgICAgcmV0dXJuIG1SZXNvbHZlcjsKICAgICB9CmRpZmYgLS1naXQgYS90ZXN0LXJ1bm5lci9zcmMvYW5kcm9pZC90ZXN0L1Byb3ZpZGVyVGVzdENhc2UyLmphdmEgYi90ZXN0LXJ1bm5lci9zcmMvYW5kcm9pZC90ZXN0L1Byb3ZpZGVyVGVzdENhc2UyLmphdmEKaW5kZXggMWZiNTUzOC4uMjgxMWIwZCAxMDA2NDQKLS0tIGEvdGVzdC1ydW5uZXIvc3JjL2FuZHJvaWQvdGVzdC9Qcm92aWRlclRlc3RDYXNlMi5qYXZhCisrKyBiL3Rlc3QtcnVubmVyL3NyYy9hbmRyb2lkL3Rlc3QvUHJvdmlkZXJUZXN0Q2FzZTIuamF2YQpAQCAtNzQsNyArNzQsNyBAQAogICAgIHByaXZhdGUgSXNvbGF0ZWRDb250ZXh0IG1Qcm92aWRlckNvbnRleHQ7CiAgICAgcHJpdmF0ZSBNb2NrQ29udGVudFJlc29sdmVyIG1SZXNvbHZlcjsKIAotICAgICAgIHByaXZhdGUgY2xhc3MgTW9ja0NvbnRleHQyIGV4dGVuZHMgTW9ja0NvbnRleHQgeworICAgIHByaXZhdGUgY2xhc3MgTW9ja0NvbnRleHQyIGV4dGVuZHMgTW9ja0NvbnRleHQgewogCiAgICAgICAgIEBPdmVycmlkZQogICAgICAgICBwdWJsaWMgUmVzb3VyY2VzIGdldFJlc291cmNlcygpIHsKQEAgLTg3LDYgKzg3LDExIEBACiAgICAgICAgICAgICAvLyBvbmUgY3JlYXRlZCB0aHJvdWdoIHRoZSByZWd1bGFyIENvbnRleHQKICAgICAgICAgICAgIHJldHVybiBnZXRDb250ZXh0KCkuZ2V0RGlyKCJtb2NrY29udGV4dDJfIiArIG5hbWUsIG1vZGUpOwogICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBDb250ZXh0IGdldEFwcGxpY2F0aW9uQ29udGV4dCgpIHsKKyAgICAgICAgICAgIHJldHVybiB0aGlzOworICAgICAgICB9CiAgICAgfQogICAgIC8qKgogICAgICAqIENvbnN0cnVjdG9yLgpAQCAtMTQxLDYgKzE0NiwxOCBAQAogICAgIH0KIAogICAgIC8qKgorICAgICAqIFRlYXJzIGRvd24gdGhlIGVudmlyb25tZW50IGZvciB0aGUgdGVzdCBmaXh0dXJlLgorICAgICAqIDxwPgorICAgICAqIENhbGxzIHtAbGluayBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFByb3ZpZGVyI3NodXRkb3duKCl9IG9uIHRoZQorICAgICAqIHtAbGluayBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFByb3ZpZGVyfSByZXByZXNlbnRlZCBieSBtUHJvdmlkZXIuCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgbVByb3ZpZGVyLnNodXRkb3duKCk7CisgICAgICAgIHN1cGVyLnRlYXJEb3duKCk7CisgICAgfQorCisgICAgLyoqCiAgICAgICogR2V0cyB0aGUge0BsaW5rIE1vY2tDb250ZW50UmVzb2x2ZXJ9IGNyZWF0ZWQgYnkgdGhpcyBjbGFzcyBkdXJpbmcgaW5pdGlhbGl6YXRpb24uIFlvdQogICAgICAqIG11c3QgdXNlIHRoZSBtZXRob2RzIG9mIHRoaXMgcmVzb2x2ZXIgdG8gYWNjZXNzIHRoZSBwcm92aWRlciB1bmRlciB0ZXN0LgogICAgICAqCmRpZmYgLS1naXQgYS90ZXN0LXJ1bm5lci9zcmMvYW5kcm9pZC90ZXN0L1JlbmFtaW5nRGVsZWdhdGluZ0NvbnRleHQuamF2YSBiL3Rlc3QtcnVubmVyL3NyYy9hbmRyb2lkL3Rlc3QvUmVuYW1pbmdEZWxlZ2F0aW5nQ29udGV4dC5qYXZhCmluZGV4IDk3M2I5ZjIuLmVlZTNhZDcgMTAwNjQ0Ci0tLSBhL3Rlc3QtcnVubmVyL3NyYy9hbmRyb2lkL3Rlc3QvUmVuYW1pbmdEZWxlZ2F0aW5nQ29udGV4dC5qYXZhCisrKyBiL3Rlc3QtcnVubmVyL3NyYy9hbmRyb2lkL3Rlc3QvUmVuYW1pbmdEZWxlZ2F0aW5nQ29udGV4dC5qYXZhCkBAIC0yMSw2ICsyMSw3IEBACiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHRXcmFwcGVyOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZW50UHJvdmlkZXI7CitpbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5EYXRhYmFzZUVycm9ySGFuZGxlcjsKIGltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZS5TUUxpdGVEYXRhYmFzZTsKIGltcG9ydCBhbmRyb2lkLm9zLkZpbGVVdGlsczsKIGltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwpAQCAtMTQ4LDYgKzE0OSwxNyBAQAogICAgIH0KIAogICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTUUxpdGVEYXRhYmFzZSBvcGVuT3JDcmVhdGVEYXRhYmFzZShTdHJpbmcgbmFtZSwKKyAgICAgICAgICAgIGludCBtb2RlLCBTUUxpdGVEYXRhYmFzZS5DdXJzb3JGYWN0b3J5IGZhY3RvcnksIERhdGFiYXNlRXJyb3JIYW5kbGVyIGVycm9ySGFuZGxlcikgeworICAgICAgICBmaW5hbCBTdHJpbmcgaW50ZXJuYWxOYW1lID0gcmVuYW1lZEZpbGVOYW1lKG5hbWUpOworICAgICAgICBpZiAoIW1EYXRhYmFzZU5hbWVzLmNvbnRhaW5zKG5hbWUpKSB7CisgICAgICAgICAgICBtRGF0YWJhc2VOYW1lcy5hZGQobmFtZSk7CisgICAgICAgICAgICBtRmlsZUNvbnRleHQuZGVsZXRlRGF0YWJhc2UoaW50ZXJuYWxOYW1lKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbUZpbGVDb250ZXh0Lm9wZW5PckNyZWF0ZURhdGFiYXNlKGludGVybmFsTmFtZSwgbW9kZSwgZmFjdG9yeSwgZXJyb3JIYW5kbGVyKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgYm9vbGVhbiBkZWxldGVEYXRhYmFzZShTdHJpbmcgbmFtZSkgewogICAgICAgICBpZiAobURhdGFiYXNlTmFtZXMuY29udGFpbnMobmFtZSkpIHsKICAgICAgICAgICAgIG1EYXRhYmFzZU5hbWVzLnJlbW92ZShuYW1lKTsKZGlmZiAtLWdpdCBhL3Rlc3QtcnVubmVyL3NyYy9hbmRyb2lkL3Rlc3QvbW9jay9Nb2NrQ29udGVudFByb3ZpZGVyLmphdmEgYi90ZXN0LXJ1bm5lci9zcmMvYW5kcm9pZC90ZXN0L21vY2svTW9ja0NvbnRlbnRQcm92aWRlci5qYXZhCmluZGV4IDNmZDcxYzguLmI2M2ZmM2QgMTAwNjQ0Ci0tLSBhL3Rlc3QtcnVubmVyL3NyYy9hbmRyb2lkL3Rlc3QvbW9jay9Nb2NrQ29udGVudFByb3ZpZGVyLmphdmEKKysrIGIvdGVzdC1ydW5uZXIvc3JjL2FuZHJvaWQvdGVzdC9tb2NrL01vY2tDb250ZW50UHJvdmlkZXIuamF2YQpAQCAtMTI3LDYgKzEyNywxNiBAQAogICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CiAgICAgICAgIH0KIAorICAgICAgICBAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikKKyAgICAgICAgcHVibGljIFN0cmluZ1tdIGdldFN0cmVhbVR5cGVzKFVyaSB1cmwsIFN0cmluZyBtaW1lVHlwZUZpbHRlcikgdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbiB7CisgICAgICAgICAgICByZXR1cm4gTW9ja0NvbnRlbnRQcm92aWRlci50aGlzLmdldFN0cmVhbVR5cGVzKHVybCwgbWltZVR5cGVGaWx0ZXIpOworICAgICAgICB9CisKKyAgICAgICAgQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpCisgICAgICAgIHB1YmxpYyBBc3NldEZpbGVEZXNjcmlwdG9yIG9wZW5UeXBlZEFzc2V0RmlsZShVcmkgdXJsLCBTdHJpbmcgbWltZVR5cGUsIEJ1bmRsZSBvcHRzKQorICAgICAgICAgICAgICAgIHRocm93cyBSZW1vdGVFeGNlcHRpb24sIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiB7CisgICAgICAgICAgICByZXR1cm4gTW9ja0NvbnRlbnRQcm92aWRlci50aGlzLm9wZW5UeXBlZEFzc2V0RmlsZSh1cmwsIG1pbWVUeXBlLCBvcHRzKTsKKyAgICAgICAgfQogICAgIH0KICAgICBwcml2YXRlIGZpbmFsIEludmVyc2lvbklDb250ZW50UHJvdmlkZXIgbUlDb250ZW50UHJvdmlkZXIgPSBuZXcgSW52ZXJzaW9uSUNvbnRlbnRQcm92aWRlcigpOwogCkBAIC0yMjIsNiArMjMyLDE0IEBACiAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigidW5pbXBsZW1lbnRlZCBtb2NrIG1ldGhvZCBjYWxsIik7CiAgICAgfQogCisgICAgcHVibGljIFN0cmluZ1tdIGdldFN0cmVhbVR5cGVzKFVyaSB1cmwsIFN0cmluZyBtaW1lVHlwZUZpbHRlcikgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oInVuaW1wbGVtZW50ZWQgbW9jayBtZXRob2QgY2FsbCIpOworICAgIH0KKworICAgIHB1YmxpYyBBc3NldEZpbGVEZXNjcmlwdG9yIG9wZW5UeXBlZEFzc2V0RmlsZShVcmkgdXJsLCBTdHJpbmcgbWltZVR5cGUsIEJ1bmRsZSBvcHRzKSB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigidW5pbXBsZW1lbnRlZCBtb2NrIG1ldGhvZCBjYWxsIik7CisgICAgfQorCiAgICAgLyoqCiAgICAgICogUmV0dXJucyBJQ29udGVudFByb3ZpZGVyIHdoaWNoIGNhbGxzIGJhY2sgc2FtZSBtZXRob2RzIGluIHRoaXMgY2xhc3MuCiAgICAgICogQnkgb3ZlcnJpZGluZyB0aGlzIGNsYXNzLCB3ZSBhdm9pZCB0aGUgbWVjaGFuaXNtIGhpZGRlbiBiZWhpbmQgQ29udGVudFByb3ZpZGVyCmRpZmYgLS1naXQgYS90ZXN0LXJ1bm5lci9zcmMvYW5kcm9pZC90ZXN0L21vY2svTW9ja0NvbnRleHQuamF2YSBiL3Rlc3QtcnVubmVyL3NyYy9hbmRyb2lkL3Rlc3QvbW9jay9Nb2NrQ29udGV4dC5qYXZhCmluZGV4IGZmZDc1N2MuLmMzMWM5Y2MgMTAwNjQ0Ci0tLSBhL3Rlc3QtcnVubmVyL3NyYy9hbmRyb2lkL3Rlc3QvbW9jay9Nb2NrQ29udGV4dC5qYXZhCisrKyBiL3Rlc3QtcnVubmVyL3NyYy9hbmRyb2lkL3Rlc3QvbW9jay9Nb2NrQ29udGV4dC5qYXZhCkBAIC0yOSw2ICsyOSw3IEBACiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLlBhY2thZ2VNYW5hZ2VyOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuQXNzZXRNYW5hZ2VyOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuUmVzb3VyY2VzOworaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2UuRGF0YWJhc2VFcnJvckhhbmRsZXI7CiBpbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGUuU1FMaXRlRGF0YWJhc2U7CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5CaXRtYXA7CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZTsKQEAgLTE4NCw2ICsxODUsMTIgQEAKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU1FMaXRlRGF0YWJhc2Ugb3Blbk9yQ3JlYXRlRGF0YWJhc2UoU3RyaW5nIGZpbGUsIGludCBtb2RlLAorICAgICAgICAgICAgU1FMaXRlRGF0YWJhc2UuQ3Vyc29yRmFjdG9yeSBmYWN0b3J5LCBEYXRhYmFzZUVycm9ySGFuZGxlciBlcnJvckhhbmRsZXIpIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIEZpbGUgZ2V0RGF0YWJhc2VQYXRoKFN0cmluZyBuYW1lKSB7CiAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwogICAgIH0KZGlmZiAtLWdpdCBhL3Rlc3QtcnVubmVyL3NyYy9hbmRyb2lkL3Rlc3QvbW9jay9Nb2NrQ3Vyc29yLmphdmEgYi90ZXN0LXJ1bm5lci9zcmMvYW5kcm9pZC90ZXN0L21vY2svTW9ja0N1cnNvci5qYXZhCmluZGV4IDliMWMwZWYuLmJhYTE1MGEgMTAwNjQ0Ci0tLSBhL3Rlc3QtcnVubmVyL3NyYy9hbmRyb2lkL3Rlc3QvbW9jay9Nb2NrQ3Vyc29yLmphdmEKKysrIGIvdGVzdC1ydW5uZXIvc3JjL2FuZHJvaWQvdGVzdC9tb2NrL01vY2tDdXJzb3IuamF2YQpAQCAtMTc4LDM2ICsxNzgsMTEgQEAKICAgICB9CiAKICAgICBAU3VwcHJlc3NXYXJuaW5ncygiZGVwcmVjYXRpb24iKQotICAgIHB1YmxpYyBib29sZWFuIGNvbW1pdFVwZGF0ZXMoKSB7Ci0gICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigidW5pbXBsZW1lbnRlZCBtb2NrIG1ldGhvZCIpOwotICAgIH0KLQotICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJkZXByZWNhdGlvbiIpCi0gICAgcHVibGljIGJvb2xlYW4gY29tbWl0VXBkYXRlcyhNYXA8PyBleHRlbmRzIExvbmcsID8gZXh0ZW5kcyBNYXA8U3RyaW5nLCBPYmplY3Q+PiB2YWx1ZXMpIHsKLSAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJ1bmltcGxlbWVudGVkIG1vY2sgbWV0aG9kIik7Ci0gICAgfQotCi0gICAgQFN1cHByZXNzV2FybmluZ3MoImRlcHJlY2F0aW9uIikKLSAgICBwdWJsaWMgYm9vbGVhbiBoYXNVcGRhdGVzKCkgewotICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oInVuaW1wbGVtZW50ZWQgbW9jayBtZXRob2QiKTsKLSAgICB9Ci0KLSAgICBAU3VwcHJlc3NXYXJuaW5ncygiZGVwcmVjYXRpb24iKQogICAgIHB1YmxpYyB2b2lkIHNldE5vdGlmaWNhdGlvblVyaShDb250ZW50UmVzb2x2ZXIgY3IsIFVyaSB1cmkpIHsKICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJ1bmltcGxlbWVudGVkIG1vY2sgbWV0aG9kIik7CiAgICAgfQogCiAgICAgQFN1cHByZXNzV2FybmluZ3MoImRlcHJlY2F0aW9uIikKLSAgICBwdWJsaWMgYm9vbGVhbiBzdXBwb3J0c1VwZGF0ZXMoKSB7Ci0gICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigidW5pbXBsZW1lbnRlZCBtb2NrIG1ldGhvZCIpOwotICAgIH0KLQotICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJkZXByZWNhdGlvbiIpCi0gICAgcHVibGljIGJvb2xlYW4gZGVsZXRlUm93KCkgewotICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oInVuaW1wbGVtZW50ZWQgbW9jayBtZXRob2QiKTsKLSAgICB9Ci0KLSAgICBAU3VwcHJlc3NXYXJuaW5ncygiZGVwcmVjYXRpb24iKQogICAgIHB1YmxpYyB2b2lkIHVucmVnaXN0ZXJDb250ZW50T2JzZXJ2ZXIoQ29udGVudE9ic2VydmVyIG9ic2VydmVyKSB7CiAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigidW5pbXBsZW1lbnRlZCBtb2NrIG1ldGhvZCIpOwogICAgIH0KQEAgLTIxNyw0OCArMTkyLDcgQEAKICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJ1bmltcGxlbWVudGVkIG1vY2sgbWV0aG9kIik7CiAgICAgfQogCi0gICAgQFN1cHByZXNzV2FybmluZ3MoImRlcHJlY2F0aW9uIikKLSAgICBwdWJsaWMgYm9vbGVhbiB1cGRhdGVCbG9iKGludCBjb2x1bW5JbmRleCwgYnl0ZVtdIHZhbHVlKSB7Ci0gICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigidW5pbXBsZW1lbnRlZCBtb2NrIG1ldGhvZCIpOwotICAgIH0KLQotICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJkZXByZWNhdGlvbiIpCi0gICAgcHVibGljIGJvb2xlYW4gdXBkYXRlRG91YmxlKGludCBjb2x1bW5JbmRleCwgZG91YmxlIHZhbHVlKSB7Ci0gICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigidW5pbXBsZW1lbnRlZCBtb2NrIG1ldGhvZCIpOwotICAgIH0KLQotICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJkZXByZWNhdGlvbiIpCi0gICAgcHVibGljIGJvb2xlYW4gdXBkYXRlRmxvYXQoaW50IGNvbHVtbkluZGV4LCBmbG9hdCB2YWx1ZSkgewotICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oInVuaW1wbGVtZW50ZWQgbW9jayBtZXRob2QiKTsKLSAgICB9Ci0KLSAgICBAU3VwcHJlc3NXYXJuaW5ncygiZGVwcmVjYXRpb24iKQotICAgIHB1YmxpYyBib29sZWFuIHVwZGF0ZUludChpbnQgY29sdW1uSW5kZXgsIGludCB2YWx1ZSkgewotICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oInVuaW1wbGVtZW50ZWQgbW9jayBtZXRob2QiKTsKLSAgICB9Ci0KLSAgICBAU3VwcHJlc3NXYXJuaW5ncygiZGVwcmVjYXRpb24iKQotICAgIHB1YmxpYyBib29sZWFuIHVwZGF0ZUxvbmcoaW50IGNvbHVtbkluZGV4LCBsb25nIHZhbHVlKSB7Ci0gICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigidW5pbXBsZW1lbnRlZCBtb2NrIG1ldGhvZCIpOwotICAgIH0KLQotICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJkZXByZWNhdGlvbiIpCi0gICAgcHVibGljIGJvb2xlYW4gdXBkYXRlU2hvcnQoaW50IGNvbHVtbkluZGV4LCBzaG9ydCB2YWx1ZSkgewotICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oInVuaW1wbGVtZW50ZWQgbW9jayBtZXRob2QiKTsKLSAgICB9Ci0KLSAgICBAU3VwcHJlc3NXYXJuaW5ncygiZGVwcmVjYXRpb24iKQotICAgIHB1YmxpYyBib29sZWFuIHVwZGF0ZVN0cmluZyhpbnQgY29sdW1uSW5kZXgsIFN0cmluZyB2YWx1ZSkgewotICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oInVuaW1wbGVtZW50ZWQgbW9jayBtZXRob2QiKTsKLSAgICB9Ci0KLSAgICBAU3VwcHJlc3NXYXJuaW5ncygiZGVwcmVjYXRpb24iKQotICAgIHB1YmxpYyBib29sZWFuIHVwZGF0ZVRvTnVsbChpbnQgY29sdW1uSW5kZXgpIHsKLSAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJ1bmltcGxlbWVudGVkIG1vY2sgbWV0aG9kIik7Ci0gICAgfQotCi0gICAgQFN1cHByZXNzV2FybmluZ3MoImRlcHJlY2F0aW9uIikKLSAgICBwdWJsaWMgdm9pZCBhYm9ydFVwZGF0ZXMoKSB7CisgICAgcHVibGljIGludCBnZXRUeXBlKGludCBjb2x1bW5JbmRleCkgewogICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oInVuaW1wbGVtZW50ZWQgbW9jayBtZXRob2QiKTsKICAgICB9CiB9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdC1ydW5uZXIvc3JjL2FuZHJvaWQvdGVzdC9tb2NrL01vY2tJQ29udGVudFByb3ZpZGVyLmphdmEgYi90ZXN0LXJ1bm5lci9zcmMvYW5kcm9pZC90ZXN0L21vY2svTW9ja0lDb250ZW50UHJvdmlkZXIuamF2YQppbmRleCAwYmU1YmVhLi4xODNiZTQxIDEwMDY0NAotLS0gYS90ZXN0LXJ1bm5lci9zcmMvYW5kcm9pZC90ZXN0L21vY2svTW9ja0lDb250ZW50UHJvdmlkZXIuamF2YQorKysgYi90ZXN0LXJ1bm5lci9zcmMvYW5kcm9pZC90ZXN0L21vY2svTW9ja0lDb250ZW50UHJvdmlkZXIuamF2YQpAQCAtMzIsNiArMzIsNyBAQAogaW1wb3J0IGFuZHJvaWQub3MuUGFyY2VsRmlsZURlc2NyaXB0b3I7CiBpbXBvcnQgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb247CiAKK2ltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwogCiAvKioKQEAgLTEwMiw0ICsxMDMsMTMgQEAKICAgICBwdWJsaWMgSUJpbmRlciBhc0JpbmRlcigpIHsKICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJ1bmltcGxlbWVudGVkIG1vY2sgbWV0aG9kIik7CiAgICAgfQorCisgICAgcHVibGljIFN0cmluZ1tdIGdldFN0cmVhbVR5cGVzKFVyaSB1cmwsIFN0cmluZyBtaW1lVHlwZUZpbHRlcikgdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbiB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigidW5pbXBsZW1lbnRlZCBtb2NrIG1ldGhvZCIpOworICAgIH0KKworICAgIHB1YmxpYyBBc3NldEZpbGVEZXNjcmlwdG9yIG9wZW5UeXBlZEFzc2V0RmlsZShVcmkgdXJsLCBTdHJpbmcgbWltZVR5cGUsIEJ1bmRsZSBvcHRzKQorICAgICAgICAgICAgdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbiwgRmlsZU5vdEZvdW5kRXhjZXB0aW9uIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJ1bmltcGxlbWVudGVkIG1vY2sgbWV0aG9kIik7CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvdGVzdC1ydW5uZXIvc3JjL2FuZHJvaWQvdGVzdC9zdWl0ZWJ1aWxkZXIvVGVzdEdyb3VwaW5nLmphdmEgYi90ZXN0LXJ1bm5lci9zcmMvYW5kcm9pZC90ZXN0L3N1aXRlYnVpbGRlci9UZXN0R3JvdXBpbmcuamF2YQppbmRleCBkZjZkYTcwLi5hMmI5NGZmIDEwMDY0NAotLS0gYS90ZXN0LXJ1bm5lci9zcmMvYW5kcm9pZC90ZXN0L3N1aXRlYnVpbGRlci9UZXN0R3JvdXBpbmcuamF2YQorKysgYi90ZXN0LXJ1bm5lci9zcmMvYW5kcm9pZC90ZXN0L3N1aXRlYnVpbGRlci9UZXN0R3JvdXBpbmcuamF2YQpAQCAtNDYsNiArNDYsOCBAQAogICovCiBwdWJsaWMgY2xhc3MgVGVzdEdyb3VwaW5nIHsKIAorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMT0dfVEFHID0gIlRlc3RHcm91cGluZyI7CisKICAgICBTb3J0ZWRTZXQ8Q2xhc3M8PyBleHRlbmRzIFRlc3RDYXNlPj4gdGVzdENhc2VDbGFzc2VzOwogCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBDb21wYXJhdG9yPENsYXNzPD8gZXh0ZW5kcyBUZXN0Q2FzZT4+IFNPUlRfQllfU0lNUExFX05BTUUKQEAgLTExNCw3ICsxMTYsNyBAQAogICAgICAgICBmb3IgKFN0cmluZyBwYWNrYWdlTmFtZSA6IHBhY2thZ2VOYW1lcykgewogICAgICAgICAgICAgTGlzdDxDbGFzczw/IGV4dGVuZHMgVGVzdENhc2U+PiBhZGRlZENsYXNzZXMgPSB0ZXN0Q2FzZUNsYXNzZXNJblBhY2thZ2UocGFja2FnZU5hbWUpOwogICAgICAgICAgICAgaWYgKGFkZGVkQ2xhc3Nlcy5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgICAgICBMb2cudygiVGVzdEdyb3VwaW5nIiwgIkludmFsaWQgUGFja2FnZTogJyIgKyBwYWNrYWdlTmFtZQorICAgICAgICAgICAgICAgIExvZy53KExPR19UQUcsICJJbnZhbGlkIFBhY2thZ2U6ICciICsgcGFja2FnZU5hbWUKICAgICAgICAgICAgICAgICAgICAgICAgICsgIicgY291bGQgbm90IGJlIGZvdW5kIG9yIGhhcyBubyB0ZXN0cyIpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgdGVzdENhc2VDbGFzc2VzLmFkZEFsbChhZGRlZENsYXNzZXMpOwpAQCAtMjM0LDYgKzIzNiwxMCBAQAogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQorICAgICAgICAgICAgTG9nLmkoTE9HX1RBRywgU3RyaW5nLmZvcm1hdCgKKyAgICAgICAgICAgICAgICAgICAgIlRlc3RDYXNlIGNsYXNzICVzIGlzIG1pc3NpbmcgYSBwdWJsaWMgY29uc3RydWN0b3Igd2l0aCBubyBwYXJhbWV0ZXJzICIgKworICAgICAgICAgICAgICAgICAgICAib3IgYSBzaW5nbGUgU3RyaW5nIHBhcmFtZXRlciAtIHNraXBwaW5nIiwKKyAgICAgICAgICAgICAgICAgICAgYUNsYXNzLmdldE5hbWUoKSkpOwogICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9CiAgICAgfQpkaWZmIC0tZ2l0IGEvdGVzdC1ydW5uZXIvdGVzdHMvc3JjL2FuZHJvaWQvdGVzdC9zdWl0ZWJ1aWxkZXIvVGVzdEdyb3VwaW5nVGVzdC5qYXZhIGIvdGVzdC1ydW5uZXIvdGVzdHMvc3JjL2FuZHJvaWQvdGVzdC9zdWl0ZWJ1aWxkZXIvVGVzdEdyb3VwaW5nVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY0NDc3ZDEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0LXJ1bm5lci90ZXN0cy9zcmMvYW5kcm9pZC90ZXN0L3N1aXRlYnVpbGRlci9UZXN0R3JvdXBpbmdUZXN0LmphdmEKQEAgLTAsMCArMSw0NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC50ZXN0LnN1aXRlYnVpbGRlcjsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworCisvKioKKyAqIFVuaXQgdGVzdHMgZm9yIHtAbGluayBUZXN0R3JvdXBpbmd9CisgKi8KK3B1YmxpYyBjbGFzcyBUZXN0R3JvdXBpbmdUZXN0IGV4dGVuZHMgVGVzdENhc2UgeworCisgICAgcHJpdmF0ZSBUZXN0R3JvdXBpbmcgbUdyb3VwaW5nOworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgc3VwZXIuc2V0VXAoKTsKKyAgICAgICAgbUdyb3VwaW5nID0gbmV3IFRlc3RHcm91cGluZyhUZXN0R3JvdXBpbmcuU09SVF9CWV9TSU1QTEVfTkFNRSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVmVyaWZpZXMgdGhhdCBUZXN0Q2FzZXMgd2l0aCBubyBwdWJsaWMgY29uc3RydWN0b3IgYXJlIG5vdCBsb2FkZWQuCisgICAgICogUmVsaWVzIG9uIGZpeHR1cmUgY2xhc3NlcyBpbiBhbmRyb2lkLnRlc3Quc3VpdGVidWlsZGVyLmV4YW1wbGVzLmNvbnN0cnVjdG9yCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdEdldFRlc3RzX25vUHVibGljQ29uc3RydWN0b3IoKSB7CisgICAgICAgIG1Hcm91cGluZy5hZGRQYWNrYWdlc1JlY3Vyc2l2ZSgiYW5kcm9pZC50ZXN0LnN1aXRlYnVpbGRlci5leGFtcGxlcy5jb25zdHJ1Y3RvciIpOworICAgICAgICBMaXN0PFRlc3RNZXRob2Q+IHRlc3RzID0gbUdyb3VwaW5nLmdldFRlc3RzKCk7CisgICAgICAgIC8vIG9ubHkgdGhlIFB1YmxpY0NvbnN0cnVjdG9yVGVzdCdzIHRlc3QgbWV0aG9kIHNob3VsZCBiZSBwcmVzZW50CisgICAgICAgIGFzc2VydEVxdWFscygxLCB0ZXN0cy5zaXplKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoInRlc3RQdWJsaWNDb25zdHJ1Y3RvciIsIHRlc3RzLmdldCgwKS5nZXROYW1lKCkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3QtcnVubmVyL3Rlc3RzL3NyYy9hbmRyb2lkL3Rlc3Qvc3VpdGVidWlsZGVyL2V4YW1wbGVzL2NvbnN0cnVjdG9yL05vUHVibGljQ29uc3RydWN0b3JUZXN0LmphdmEgYi90ZXN0LXJ1bm5lci90ZXN0cy9zcmMvYW5kcm9pZC90ZXN0L3N1aXRlYnVpbGRlci9leGFtcGxlcy9jb25zdHJ1Y3Rvci9Ob1B1YmxpY0NvbnN0cnVjdG9yVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ3OTA5YTEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0LXJ1bm5lci90ZXN0cy9zcmMvYW5kcm9pZC90ZXN0L3N1aXRlYnVpbGRlci9leGFtcGxlcy9jb25zdHJ1Y3Rvci9Ob1B1YmxpY0NvbnN0cnVjdG9yVGVzdC5qYXZhCkBAIC0wLDAgKzEsMzUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQudGVzdC5zdWl0ZWJ1aWxkZXIuZXhhbXBsZXMuY29uc3RydWN0b3I7CisKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CisKKy8qKgorICogQSB7QGxpbmsgVGVzdENhc2V9IHdoaWNoIHNob3VsZCBub3QgYmUgbG9hZGVkIHNpbmNlIGl0IGhhcyBub24tcHVibGljIGNvbnN0cnVjdG9ycyB3aXRoIG5vIGFyZ3MuCisgKi8KK3B1YmxpYyBjbGFzcyBOb1B1YmxpY0NvbnN0cnVjdG9yVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKKworICAgIE5vUHVibGljQ29uc3RydWN0b3JUZXN0KCkgeworICAgIH0KKworICAgIHB1YmxpYyBOb1B1YmxpY0NvbnN0cnVjdG9yVGVzdChTdHJpbmcgZm9vLCBTdHJpbmcgZm9vMikgeworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3ROb3RSdW4oKSB7CisgICAgICAgIGZhaWwoIm1ldGhvZCBpbiBOb1B1YmxpY0NvbnN0cnVjdG9yVGVzdCBydW4gdW5leHBlY3RlZGx5Iik7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdC1ydW5uZXIvdGVzdHMvc3JjL2FuZHJvaWQvdGVzdC9zdWl0ZWJ1aWxkZXIvZXhhbXBsZXMvY29uc3RydWN0b3IvUHJvdGVjdGVkQ29uc3RydWN0b3JUZXN0LmphdmEgYi90ZXN0LXJ1bm5lci90ZXN0cy9zcmMvYW5kcm9pZC90ZXN0L3N1aXRlYnVpbGRlci9leGFtcGxlcy9jb25zdHJ1Y3Rvci9Qcm90ZWN0ZWRDb25zdHJ1Y3RvclRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMjg2MmZkCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC1ydW5uZXIvdGVzdHMvc3JjL2FuZHJvaWQvdGVzdC9zdWl0ZWJ1aWxkZXIvZXhhbXBsZXMvY29uc3RydWN0b3IvUHJvdGVjdGVkQ29uc3RydWN0b3JUZXN0LmphdmEKQEAgLTAsMCArMSwzMyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC50ZXN0LnN1aXRlYnVpbGRlci5leGFtcGxlcy5jb25zdHJ1Y3RvcjsKKworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKKworLyoqCisgKiBBIHByb3RlY3RlZCBjb25zdHJ1Y3RvciB0ZXN0IGNhc2UgdGhhdCBzaG91bGQgbm90IGJlIGxvYWRlZC4KKyAqLworcHVibGljIGNsYXNzIFByb3RlY3RlZENvbnN0cnVjdG9yVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKKworICAgIHByb3RlY3RlZCBQcm90ZWN0ZWRDb25zdHJ1Y3RvclRlc3QoKSB7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdE5vdFJ1bigpIHsKKyAgICAgICAgZmFpbCgibWV0aG9kIGluIFByb3RlY3RlZENvbnN0cnVjdG9yVGVzdCBydW4gdW5leHBlY3RlZGx5Iik7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS90ZXN0LXJ1bm5lci90ZXN0cy9zcmMvYW5kcm9pZC90ZXN0L3N1aXRlYnVpbGRlci9leGFtcGxlcy9jb25zdHJ1Y3Rvci9QdWJsaWNDb25zdHJ1Y3RvclRlc3QuamF2YSBiL3Rlc3QtcnVubmVyL3Rlc3RzL3NyYy9hbmRyb2lkL3Rlc3Qvc3VpdGVidWlsZGVyL2V4YW1wbGVzL2NvbnN0cnVjdG9yL1B1YmxpY0NvbnN0cnVjdG9yVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmExMWUyNWQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0LXJ1bm5lci90ZXN0cy9zcmMvYW5kcm9pZC90ZXN0L3N1aXRlYnVpbGRlci9leGFtcGxlcy9jb25zdHJ1Y3Rvci9QdWJsaWNDb25zdHJ1Y3RvclRlc3QuamF2YQpAQCAtMCwwICsxLDI4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLnRlc3Quc3VpdGVidWlsZGVyLmV4YW1wbGVzLmNvbnN0cnVjdG9yOworCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworCisvKioKKyAqIEEgcHVibGljIGNvbnN0cnVjdG9yIHRlc3QgY2FzZSB0aGF0IHNob3VsZCBiZSBsb2FkZWQuCisgKi8KK3B1YmxpYyBjbGFzcyBQdWJsaWNDb25zdHJ1Y3RvclRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UHVibGljQ29uc3RydWN0b3IoKSB7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvQnJvd3NlclRlc3RQbHVnaW4vam5pL1BsdWdpbk9iamVjdC5oIGIvdGVzdHMvQnJvd3NlclRlc3RQbHVnaW4vam5pL1BsdWdpbk9iamVjdC5oCmluZGV4IGEwNThkNGEuLjAzNzM2N2UgMTAwNjQ0Ci0tLSBhL3Rlc3RzL0Jyb3dzZXJUZXN0UGx1Z2luL2puaS9QbHVnaW5PYmplY3QuaAorKysgYi90ZXN0cy9Ccm93c2VyVGVzdFBsdWdpbi9qbmkvUGx1Z2luT2JqZWN0LmgKQEAgLTY1LDcgKzY1LDcgQEAKIHB1YmxpYzoKICAgICBTdWJQbHVnaW4oTlBQIGluc3QpIDogbV9pbnN0KGluc3QpIHt9CiAgICAgdmlydHVhbCB+U3ViUGx1Z2luKCkge30KLSAgICB2aXJ0dWFsIGludDE2IGhhbmRsZUV2ZW50KGNvbnN0IEFOUEV2ZW50KiBldnQpID0gMDsKKyAgICB2aXJ0dWFsIGludDE2X3QgaGFuZGxlRXZlbnQoY29uc3QgQU5QRXZlbnQqIGV2dCkgPSAwOwogCiAgICAgTlBQIGluc3QoKSBjb25zdCB7IHJldHVybiBtX2luc3Q7IH0KIApkaWZmIC0tZ2l0IGEvdGVzdHMvQnJvd3NlclRlc3RQbHVnaW4vam5pL2V2ZW50L0V2ZW50UGx1Z2luLmNwcCBiL3Rlc3RzL0Jyb3dzZXJUZXN0UGx1Z2luL2puaS9ldmVudC9FdmVudFBsdWdpbi5jcHAKaW5kZXggMmVmZjM5NC4uOTFmMWIzZCAxMDA2NDQKLS0tIGEvdGVzdHMvQnJvd3NlclRlc3RQbHVnaW4vam5pL2V2ZW50L0V2ZW50UGx1Z2luLmNwcAorKysgYi90ZXN0cy9Ccm93c2VyVGVzdFBsdWdpbi9qbmkvZXZlbnQvRXZlbnRQbHVnaW4uY3BwCkBAIC0xMzgsNyArMTM4LDcgQEAKICAgICBicm93c2VyLT5tZW1mcmVlKGJlZ2luTWVtKTsKIH0KIAotaW50MTYgRXZlbnRQbHVnaW46OmhhbmRsZUV2ZW50KGNvbnN0IEFOUEV2ZW50KiBldnQpIHsKK2ludDE2X3QgRXZlbnRQbHVnaW46OmhhbmRsZUV2ZW50KGNvbnN0IEFOUEV2ZW50KiBldnQpIHsKICAgICBzd2l0Y2ggKGV2dC0+ZXZlbnRUeXBlKSB7CiAKICAgICAgICAgY2FzZSBrRHJhd19BTlBFdmVudFR5cGU6IHsKZGlmZiAtLWdpdCBhL3Rlc3RzL0Jyb3dzZXJUZXN0UGx1Z2luL2puaS9ldmVudC9FdmVudFBsdWdpbi5oIGIvdGVzdHMvQnJvd3NlclRlc3RQbHVnaW4vam5pL2V2ZW50L0V2ZW50UGx1Z2luLmgKaW5kZXggODhiN2M5ZC4uMDQzYmU4NSAxMDA2NDQKLS0tIGEvdGVzdHMvQnJvd3NlclRlc3RQbHVnaW4vam5pL2V2ZW50L0V2ZW50UGx1Z2luLmgKKysrIGIvdGVzdHMvQnJvd3NlclRlc3RQbHVnaW4vam5pL2V2ZW50L0V2ZW50UGx1Z2luLmgKQEAgLTMyLDcgKzMyLDcgQEAKIHB1YmxpYzoKICAgICBFdmVudFBsdWdpbihOUFAgaW5zdCk7CiAgICAgdmlydHVhbCB+RXZlbnRQbHVnaW4oKTsKLSAgICB2aXJ0dWFsIGludDE2IGhhbmRsZUV2ZW50KGNvbnN0IEFOUEV2ZW50KiBldnQpOworICAgIHZpcnR1YWwgaW50MTZfdCBoYW5kbGVFdmVudChjb25zdCBBTlBFdmVudCogZXZ0KTsKIAogcHJpdmF0ZToKICAgICB2b2lkIGRyYXdQbHVnaW4oY29uc3QgQU5QQml0bWFwJiBiaXRtYXAsIGNvbnN0IEFOUFJlY3RJJiBjbGlwKTsKZGlmZiAtLWdpdCBhL3Rlc3RzL0Jyb3dzZXJUZXN0UGx1Z2luL2puaS9tYWluLmNwcCBiL3Rlc3RzL0Jyb3dzZXJUZXN0UGx1Z2luL2puaS9tYWluLmNwcAppbmRleCA0MDJhN2UyLi41MTExODBjIDEwMDY0NAotLS0gYS90ZXN0cy9Ccm93c2VyVGVzdFBsdWdpbi9qbmkvbWFpbi5jcHAKKysrIGIvdGVzdHMvQnJvd3NlclRlc3RQbHVnaW4vam5pL21haW4uY3BwCkBAIC0zNCwxOSArMzQsMTkgQEAKIE5QTmV0c2NhcGVGdW5jcyogYnJvd3NlcjsKICNkZWZpbmUgRVhQT1JUIF9fYXR0cmlidXRlX18oKHZpc2liaWxpdHkoImRlZmF1bHQiKSkpCiAKLU5QRXJyb3IgTlBQX05ldyhOUE1JTUVUeXBlIHBsdWdpblR5cGUsIE5QUCBpbnN0YW5jZSwgdWludDE2IG1vZGUsIGludDE2IGFyZ2MsCitOUEVycm9yIE5QUF9OZXcoTlBNSU1FVHlwZSBwbHVnaW5UeXBlLCBOUFAgaW5zdGFuY2UsIHVpbnQxNl90IG1vZGUsIGludDE2X3QgYXJnYywKICAgICAgICAgY2hhciogYXJnbltdLCBjaGFyKiBhcmd2W10sIE5QU2F2ZWREYXRhKiBzYXZlZCk7CiBOUEVycm9yIE5QUF9EZXN0cm95KE5QUCBpbnN0YW5jZSwgTlBTYXZlZERhdGEqKiBzYXZlKTsKIE5QRXJyb3IgTlBQX1NldFdpbmRvdyhOUFAgaW5zdGFuY2UsIE5QV2luZG93KiB3aW5kb3cpOwogTlBFcnJvciBOUFBfTmV3U3RyZWFtKE5QUCBpbnN0YW5jZSwgTlBNSU1FVHlwZSB0eXBlLCBOUFN0cmVhbSogc3RyZWFtLAotICAgICAgICBOUEJvb2wgc2Vla2FibGUsIHVpbnQxNiogc3R5cGUpOworICAgICAgICBOUEJvb2wgc2Vla2FibGUsIHVpbnQxNl90KiBzdHlwZSk7CiBOUEVycm9yIE5QUF9EZXN0cm95U3RyZWFtKE5QUCBpbnN0YW5jZSwgTlBTdHJlYW0qIHN0cmVhbSwgTlBSZWFzb24gcmVhc29uKTsKLWludDMyICAgTlBQX1dyaXRlUmVhZHkoTlBQIGluc3RhbmNlLCBOUFN0cmVhbSogc3RyZWFtKTsKLWludDMyICAgTlBQX1dyaXRlKE5QUCBpbnN0YW5jZSwgTlBTdHJlYW0qIHN0cmVhbSwgaW50MzIgb2Zmc2V0LCBpbnQzMiBsZW4sCitpbnQzMl90ICAgTlBQX1dyaXRlUmVhZHkoTlBQIGluc3RhbmNlLCBOUFN0cmVhbSogc3RyZWFtKTsKK2ludDMyX3QgICBOUFBfV3JpdGUoTlBQIGluc3RhbmNlLCBOUFN0cmVhbSogc3RyZWFtLCBpbnQzMl90IG9mZnNldCwgaW50MzJfdCBsZW4sCiAgICAgICAgIHZvaWQqIGJ1ZmZlcik7CiB2b2lkICAgIE5QUF9TdHJlYW1Bc0ZpbGUoTlBQIGluc3RhbmNlLCBOUFN0cmVhbSogc3RyZWFtLCBjb25zdCBjaGFyKiBmbmFtZSk7CiB2b2lkICAgIE5QUF9QcmludChOUFAgaW5zdGFuY2UsIE5QUHJpbnQqIHBsYXRmb3JtUHJpbnQpOwotaW50MTYgICBOUFBfSGFuZGxlRXZlbnQoTlBQIGluc3RhbmNlLCB2b2lkKiBldmVudCk7CitpbnQxNl90ICAgTlBQX0hhbmRsZUV2ZW50KE5QUCBpbnN0YW5jZSwgdm9pZCogZXZlbnQpOwogdm9pZCAgICBOUFBfVVJMTm90aWZ5KE5QUCBpbnN0YW5jZSwgY29uc3QgY2hhciogVVJMLCBOUFJlYXNvbiByZWFzb24sCiAgICAgICAgIHZvaWQqIG5vdGlmeURhdGEpOwogTlBFcnJvciBOUFBfR2V0VmFsdWUoTlBQIGluc3RhbmNlLCBOUFBWYXJpYWJsZSB2YXJpYWJsZSwgdm9pZCAqdmFsdWUpOwpAQCAtMTI5LDcgKzEyOSw3IEBACiAgICAgcmV0dXJuICJhcHBsaWNhdGlvbi94LWJyb3dzZXJ0ZXN0cGx1Z2luOmJ0cDpBbmRyb2lkIEJyb3dzZXIgVGVzdCBQbHVnaW4iOwogfQogCi1OUEVycm9yIE5QUF9OZXcoTlBNSU1FVHlwZSBwbHVnaW5UeXBlLCBOUFAgaW5zdGFuY2UsIHVpbnQxNiBtb2RlLCBpbnQxNiBhcmdjLAorTlBFcnJvciBOUFBfTmV3KE5QTUlNRVR5cGUgcGx1Z2luVHlwZSwgTlBQIGluc3RhbmNlLCB1aW50MTZfdCBtb2RlLCBpbnQxNl90IGFyZ2MsCiAgICAgICAgICAgICAgICAgY2hhciogYXJnbltdLCBjaGFyKiBhcmd2W10sIE5QU2F2ZWREYXRhKiBzYXZlZCkKIHsKIApAQCAtMTg4LDcgKzE4OCw3IEBACiAgICAgcmV0dXJuIE5QRVJSX05PX0VSUk9SOwogfQogCi1OUEVycm9yIE5QUF9OZXdTdHJlYW0oTlBQIGluc3RhbmNlLCBOUE1JTUVUeXBlIHR5cGUsIE5QU3RyZWFtKiBzdHJlYW0sIE5QQm9vbCBzZWVrYWJsZSwgdWludDE2KiBzdHlwZSkKK05QRXJyb3IgTlBQX05ld1N0cmVhbShOUFAgaW5zdGFuY2UsIE5QTUlNRVR5cGUgdHlwZSwgTlBTdHJlYW0qIHN0cmVhbSwgTlBCb29sIHNlZWthYmxlLCB1aW50MTZfdCogc3R5cGUpCiB7CiAgICAgKnN0eXBlID0gTlBfQVNGSUxFT05MWTsKICAgICByZXR1cm4gTlBFUlJfTk9fRVJST1I7CkBAIC0xOTksMTIgKzE5OSwxMiBAQAogICAgIHJldHVybiBOUEVSUl9OT19FUlJPUjsKIH0KIAotaW50MzIgTlBQX1dyaXRlUmVhZHkoTlBQIGluc3RhbmNlLCBOUFN0cmVhbSogc3RyZWFtKQoraW50MzJfdCBOUFBfV3JpdGVSZWFkeShOUFAgaW5zdGFuY2UsIE5QU3RyZWFtKiBzdHJlYW0pCiB7CiAgICAgcmV0dXJuIDA7CiB9CiAKLWludDMyIE5QUF9Xcml0ZShOUFAgaW5zdGFuY2UsIE5QU3RyZWFtKiBzdHJlYW0sIGludDMyIG9mZnNldCwgaW50MzIgbGVuLCB2b2lkKiBidWZmZXIpCitpbnQzMl90IE5QUF9Xcml0ZShOUFAgaW5zdGFuY2UsIE5QU3RyZWFtKiBzdHJlYW0sIGludDMyX3Qgb2Zmc2V0LCBpbnQzMl90IGxlbiwgdm9pZCogYnVmZmVyKQogewogICAgIHJldHVybiAwOwogfQpAQCAtMjE3LDcgKzIxNyw3IEBACiB7CiB9CiAKLWludDE2IE5QUF9IYW5kbGVFdmVudChOUFAgaW5zdGFuY2UsIHZvaWQqIGV2ZW50KQoraW50MTZfdCBOUFBfSGFuZGxlRXZlbnQoTlBQIGluc3RhbmNlLCB2b2lkKiBldmVudCkKIHsKICAgICBQbHVnaW5PYmplY3QgKm9iaiA9IHJlaW50ZXJwcmV0X2Nhc3Q8UGx1Z2luT2JqZWN0Kj4oaW5zdGFuY2UtPnBkYXRhKTsKICAgICBjb25zdCBBTlBFdmVudCogZXZ0ID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBBTlBFdmVudCo+KGV2ZW50KTsKZGlmZiAtLWdpdCBhL3Rlc3RzL0R1bXBSZW5kZXJUcmVlL0FuZHJvaWRNYW5pZmVzdC54bWwgYi90ZXN0cy9EdW1wUmVuZGVyVHJlZS9BbmRyb2lkTWFuaWZlc3QueG1sCmluZGV4IDAzYjdlMjYuLmMxNTEyNTEgMTAwNjQ0Ci0tLSBhL3Rlc3RzL0R1bXBSZW5kZXJUcmVlL0FuZHJvaWRNYW5pZmVzdC54bWwKKysrIGIvdGVzdHMvRHVtcFJlbmRlclRyZWUvQW5kcm9pZE1hbmlmZXN0LnhtbApAQCAtMTgsMTUgKzE4LDE4IEBACiAgICAgPGFwcGxpY2F0aW9uIGFuZHJvaWQ6bmFtZT0iSFRNTEhvc3RBcHAiPgogICAgICAgICA8dXNlcy1saWJyYXJ5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC50ZXN0LnJ1bm5lciIgLz4KICAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iTWVudSIgYW5kcm9pZDpsYWJlbD0iRHVtcCBSZW5kZXIgVHJlZSIKLSAgICAgICAgICBhbmRyb2lkOnNjcmVlbk9yaWVudGF0aW9uPSJwb3J0cmFpdCI+CisgICAgICAgICAgYW5kcm9pZDpzY3JlZW5PcmllbnRhdGlvbj0icG9ydHJhaXQiCisgICAgICAgICAgYW5kcm9pZDp0aGVtZT0iQGFuZHJvaWQ6c3R5bGUvVGhlbWUuTGlnaHQiPgogICAgICAgICAgICAgPGludGVudC1maWx0ZXI+CiAgICAgICAgICAgICAgICAgPGFjdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmFjdGlvbi5NQUlOIiAvPgogICAgICAgICAgICAgICAgIDxjYXRlZ29yeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmNhdGVnb3J5LlRFU1QiIC8+CiAgICAgICAgICAgICA8L2ludGVudC1maWx0ZXI+CiAgICAgICAgIDwvYWN0aXZpdHk+CiAgICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9IlRlc3RTaGVsbEFjdGl2aXR5IiBhbmRyb2lkOmxhdW5jaE1vZGU9InNpbmdsZVRvcCIKLSAgICAgICAgICBhbmRyb2lkOnNjcmVlbk9yaWVudGF0aW9uPSJwb3J0cmFpdCIvPgotICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSJSZWxpYWJpbGl0eVRlc3RBY3Rpdml0eSIgYW5kcm9pZDpzY3JlZW5PcmllbnRhdGlvbj0icG9ydHJhaXQiLz4KKyAgICAgICAgICBhbmRyb2lkOnNjcmVlbk9yaWVudGF0aW9uPSJwb3J0cmFpdCIKKyAgICAgICAgICBhbmRyb2lkOnRoZW1lPSJAYW5kcm9pZDpzdHlsZS9UaGVtZS5MaWdodCIvPgorICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSJSZWxpYWJpbGl0eVRlc3RBY3Rpdml0eSIgYW5kcm9pZDpzY3JlZW5PcmllbnRhdGlvbj0icG9ydHJhaXQiCisgICAgICAgICAgYW5kcm9pZDp0aGVtZT0iQGFuZHJvaWQ6c3R5bGUvVGhlbWUuTGlnaHQiLz4KICAgICA8L2FwcGxpY2F0aW9uPgogCiAgICAgPGluc3RydW1lbnRhdGlvbiBhbmRyb2lkOm5hbWU9Ii5MYXlvdXRUZXN0c0F1dG9SdW5uZXIiCmRpZmYgLS1naXQgYS90ZXN0cy9EdW1wUmVuZGVyVHJlZS9hc3NldHMvcnVuX2xheW91dF90ZXN0cy5weSBiL3Rlc3RzL0R1bXBSZW5kZXJUcmVlL2Fzc2V0cy9ydW5fbGF5b3V0X3Rlc3RzLnB5CmluZGV4IGI2ZTdiZjMuLmNlYWM1ZDIgMTAwNzU1Ci0tLSBhL3Rlc3RzL0R1bXBSZW5kZXJUcmVlL2Fzc2V0cy9ydW5fbGF5b3V0X3Rlc3RzLnB5CisrKyBiL3Rlc3RzL0R1bXBSZW5kZXJUcmVlL2Fzc2V0cy9ydW5fbGF5b3V0X3Rlc3RzLnB5CkBAIC0xNzYsNyArMTc2LDcgQEAKICAgIyBDb3VudCBjcmFzaGVkIHRlc3RzLgogICBjcmFzaGVkX3Rlc3RzID0gW10KIAotICB0aW1lb3V0X21zID0gJzMwMDAwJworICB0aW1lb3V0X21zID0gJzE1MDAwJwogICBpZiBvcHRpb25zLnRpbWVfb3V0X21zOgogICAgIHRpbWVvdXRfbXMgPSBvcHRpb25zLnRpbWVfb3V0X21zCiAKZGlmZiAtLWdpdCBhL3Rlc3RzL0R1bXBSZW5kZXJUcmVlL3NyYy9jb20vYW5kcm9pZC9kdW1wcmVuZGVydHJlZS9DYWxsYmFja1Byb3h5LmphdmEgYi90ZXN0cy9EdW1wUmVuZGVyVHJlZS9zcmMvY29tL2FuZHJvaWQvZHVtcHJlbmRlcnRyZWUvQ2FsbGJhY2tQcm94eS5qYXZhCmluZGV4IDU3ODBjNDMuLjc0MGY1NDQgMTAwNjQ0Ci0tLSBhL3Rlc3RzL0R1bXBSZW5kZXJUcmVlL3NyYy9jb20vYW5kcm9pZC9kdW1wcmVuZGVydHJlZS9DYWxsYmFja1Byb3h5LmphdmEKKysrIGIvdGVzdHMvRHVtcFJlbmRlclRyZWUvc3JjL2NvbS9hbmRyb2lkL2R1bXByZW5kZXJ0cmVlL0NhbGxiYWNrUHJveHkuamF2YQpAQCAtNzQsNiArNzQsOCBAQAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBMQVlPVVRfU0VUX0NBTl9PUEVOX1dJTkRPV1MgPSA0MjsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU0VUX0dFT0xPQ0FUSU9OX1BFUk1JU1NJT04gPSA0MzsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgT1ZFUlJJREVfUFJFRkVSRU5DRSA9IDQ0OworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBMQVlPVVRfRFVNUF9DSElMRF9GUkFNRVNfVEVYVCA9IDQ1OworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTRVRfWFNTX0FVRElUT1JfRU5BQkxFRCA9IDQ2OwogICAgIAogICAgIENhbGxiYWNrUHJveHkoRXZlbnRTZW5kZXIgZXZlbnRTZW5kZXIsIAogICAgICAgICAgICAgTGF5b3V0VGVzdENvbnRyb2xsZXIgbGF5b3V0VGVzdENvbnRyb2xsZXIpIHsKQEAgLTE3NSw3ICsxNzcsMTEgQEAKICAgICAgICAgICAgIGJyZWFrOwogCiAgICAgICAgIGNhc2UgTEFZT1VUX0RVTVBfVEVYVDoKLSAgICAgICAgICAgIG1MYXlvdXRUZXN0Q29udHJvbGxlci5kdW1wQXNUZXh0KCk7CisgICAgICAgICAgICBtTGF5b3V0VGVzdENvbnRyb2xsZXIuZHVtcEFzVGV4dChtc2cuYXJnMSA9PSAxKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgTEFZT1VUX0RVTVBfQ0hJTERfRlJBTUVTX1RFWFQ6CisgICAgICAgICAgICBtTGF5b3V0VGVzdENvbnRyb2xsZXIuZHVtcENoaWxkRnJhbWVzQXNUZXh0KCk7CiAgICAgICAgICAgICBicmVhazsKIAogICAgICAgICBjYXNlIExBWU9VVF9EVU1QX0hJU1RPUlk6CkBAIC0yNzMsNiArMjc5LDEwIEBACiAgICAgICAgICAgICBib29sZWFuIHZhbHVlID0gbXNnLmdldERhdGEoKS5nZXRCb29sZWFuKCJ2YWx1ZSIpOwogICAgICAgICAgICAgbUxheW91dFRlc3RDb250cm9sbGVyLm92ZXJyaWRlUHJlZmVyZW5jZShrZXksIHZhbHVlKTsKICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgU0VUX1hTU19BVURJVE9SX0VOQUJMRUQ6CisgICAgICAgICAgICBtTGF5b3V0VGVzdENvbnRyb2xsZXIuc2V0WFNTQXVkaXRvckVuYWJsZWQobXNnLmFyZzEgPT0gMSk7CisgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogICAgIH0KIApAQCAtMzc3LDcgKzM4NywxNSBAQAogICAgIH0KIAogICAgIHB1YmxpYyB2b2lkIGR1bXBBc1RleHQoKSB7Ci0gICAgICAgIG9idGFpbk1lc3NhZ2UoTEFZT1VUX0RVTVBfVEVYVCkuc2VuZFRvVGFyZ2V0KCk7CisgICAgICAgIG9idGFpbk1lc3NhZ2UoTEFZT1VUX0RVTVBfVEVYVCwgMCkuc2VuZFRvVGFyZ2V0KCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZHVtcEFzVGV4dChib29sZWFuIGVuYWJsZVBpeGVsVGVzdHMpIHsKKyAgICAgICAgb2J0YWluTWVzc2FnZShMQVlPVVRfRFVNUF9URVhULCBlbmFibGVQaXhlbFRlc3RzID8gMSA6IDApLnNlbmRUb1RhcmdldCgpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGR1bXBDaGlsZEZyYW1lc0FzVGV4dCgpIHsKKyAgICAgICAgb2J0YWluTWVzc2FnZShMQVlPVVRfRFVNUF9DSElMRF9GUkFNRVNfVEVYVCkuc2VuZFRvVGFyZ2V0KCk7CiAgICAgfQogCiAgICAgcHVibGljIHZvaWQgZHVtcEJhY2tGb3J3YXJkTGlzdCgpIHsKQEAgLTQ5MiwxMCArNTEwLDIyIEBACiAgICAgICAgIG9idGFpbk1lc3NhZ2UoU0VUX0dFT0xPQ0FUSU9OX1BFUk1JU1NJT04sIGFsbG93ID8gMSA6IDAsIDApLnNlbmRUb1RhcmdldCgpOwogICAgIH0KIAorICAgIHB1YmxpYyB2b2lkIHNldE1vY2tEZXZpY2VPcmllbnRhdGlvbihib29sZWFuIGNhblByb3ZpZGVBbHBoYSwgZG91YmxlIGFscGhhLAorICAgICAgICAgICAgYm9vbGVhbiBjYW5Qcm92aWRlQmV0YSwgZG91YmxlIGJldGEsIGJvb2xlYW4gY2FuUHJvdmlkZUdhbW1hLCBkb3VibGUgZ2FtbWEpIHsKKyAgICAgICAgLy8gQ29uZmlndXJhdGlvbiBpcyBpbiBXZWJLaXQsIHNvIHN0YXkgb24gV2ViQ29yZSB0aHJlYWQsIGJ1dCBnbyB2aWEgdGhlIFRlc3RTaGVsbEFjdGl2aXR5CisgICAgICAgIC8vIGFzIHdlIG5lZWQgYWNjZXNzIHRvIHRoZSBXZWJ2aWV3LgorICAgICAgICBtTGF5b3V0VGVzdENvbnRyb2xsZXIuc2V0TW9ja0RldmljZU9yaWVudGF0aW9uKGNhblByb3ZpZGVBbHBoYSwgYWxwaGEsIGNhblByb3ZpZGVCZXRhLCBiZXRhLAorICAgICAgICAgICAgICAgIGNhblByb3ZpZGVHYW1tYSwgZ2FtbWEpOworICAgIH0KKwogICAgIHB1YmxpYyB2b2lkIG92ZXJyaWRlUHJlZmVyZW5jZShTdHJpbmcga2V5LCBib29sZWFuIHZhbHVlKSB7CiAgICAgICAgIE1lc3NhZ2UgbWVzc2FnZSA9IG9idGFpbk1lc3NhZ2UoT1ZFUlJJREVfUFJFRkVSRU5DRSk7CiAgICAgICAgIG1lc3NhZ2UuZ2V0RGF0YSgpLnB1dFN0cmluZygia2V5Iiwga2V5KTsKICAgICAgICAgbWVzc2FnZS5nZXREYXRhKCkucHV0Qm9vbGVhbigidmFsdWUiLCB2YWx1ZSk7CiAgICAgICAgIG1lc3NhZ2Uuc2VuZFRvVGFyZ2V0KCk7CiAgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0WFNTQXVkaXRvckVuYWJsZWQoYm9vbGVhbiBmbGFnKSB7CisgICAgICAgIG9idGFpbk1lc3NhZ2UoU0VUX1hTU19BVURJVE9SX0VOQUJMRUQsIGZsYWcgPyAxIDogMCwgMCkuc2VuZFRvVGFyZ2V0KCk7CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvdGVzdHMvRHVtcFJlbmRlclRyZWUvc3JjL2NvbS9hbmRyb2lkL2R1bXByZW5kZXJ0cmVlL0ZpbGVGaWx0ZXIuamF2YSBiL3Rlc3RzL0R1bXBSZW5kZXJUcmVlL3NyYy9jb20vYW5kcm9pZC9kdW1wcmVuZGVydHJlZS9GaWxlRmlsdGVyLmphdmEKaW5kZXggNzdmZDNlZC4uNjVkYTIxMCAxMDA2NDQKLS0tIGEvdGVzdHMvRHVtcFJlbmRlclRyZWUvc3JjL2NvbS9hbmRyb2lkL2R1bXByZW5kZXJ0cmVlL0ZpbGVGaWx0ZXIuamF2YQorKysgYi90ZXN0cy9EdW1wUmVuZGVyVHJlZS9zcmMvY29tL2FuZHJvaWQvZHVtcHJlbmRlcnRyZWUvRmlsZUZpbHRlci5qYXZhCkBAIC03Myw0MyArNzMsNzYgQEAKIAogICAgIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBpZ25vcmVUZXN0TGlzdCA9IHsKICAgICAgICAgImVkaXRpbmcvc2VsZWN0aW9uL21vdmUtbGVmdC1yaWdodC5odG1sIiwgLy8gQ2F1c2VzIER1bXBSZW5kZXJUcmVlIHRvIGhhbmcKKyAgICAgICAgImZhc3QvanMvZXhjZXNzaXZlLWNvbW1hLXVzYWdlLmh0bWwiLCAvLyBUZXN0cyBodWdlIGluaXRpYWxpemVyIGxpc3QsIGNhdXNlcyBPT00uCiAgICAgICAgICJmYXN0L2pzL3JlZ2V4cC1jaGFyY2xhc3MtY3Jhc2guaHRtbCIsIC8vIFJlZ0V4cCBpcyB0b28gbGFyZ2UsIGNhdXNpbmcgT09NCiAgICAgICAgICJmYXN0L3JlZ2V4L3Rlc3QxLmh0bWwiLCAvLyBDYXVzZXMgRHVtcFJlbmRlclRyZWUgdG8gaGFuZyB3aXRoIFY4Ci0gICAgICAgICJmYXN0L3JlZ2V4L3Nsb3cuaHRtbCIgLy8gQ2F1c2VzIER1bXBSZW5kZXJUcmVlIHRvIGhhbmcgd2l0aCBWOAorICAgICAgICAiZmFzdC9yZWdleC9zbG93Lmh0bWwiLCAvLyBDYXVzZXMgRHVtcFJlbmRlclRyZWUgdG8gaGFuZyB3aXRoIFY4CisgICAgICAgICJpZXRlc3RjZW50ZXIvSmF2YXNjcmlwdC8xNS40LjQuMTUtMy0xNC5odG1sIiwgLy8gaGFuZ3MgdGhlIGxheW91dCB0ZXN0cworICAgICAgICAvLyBodHRwOi8vYi9pc3N1ZT9pZD0yODg5NTk1CisgICAgICAgICJpZXRlc3RjZW50ZXIvSmF2YXNjcmlwdC8xNS40LjQuMTUtMy0yOS5odG1sIiwgLy8gaGFuZ3MgdGhlIGxheW91dCB0ZXN0cworICAgICAgICAvLyBodHRwOi8vYi9pc3N1ZT9pZD0yODg5NTk2CisgICAgICAgICJpZXRlc3RjZW50ZXIvSmF2YXNjcmlwdC8xNS40LjQuMTUtMy04Lmh0bWwiLCAvLyBoYW5ncyB0aGUgbGF5b3V0IHRlc3RzCisgICAgICAgIC8vIGh0dHA6Ly9iL2lzc3VlP2lkPTI4ODk1OTgKKyAgICAgICAgImh0dHAvdGVzdHMveG1saHR0cHJlcXVlc3Qvc2ltcGxlLWNyb3NzLW9yaWdpbi1wcm9ncmVzcy1ldmVudHMuaHRtbCIsIC8vIHJ1bnMgd2ViY29yZSBpbnRvIGJhZCBzdGF0ZQorICAgICAgICAvLyBodHRwOi8vYi8yOTgyNTAwCiAgICAgfTsKIAogICAgIHN0YXRpYyB2b2lkIGZpbGxJZ25vcmVSZXN1bHRMaXN0KCkgewotICAgICAgICAvLyBUaGlzIGZpcnN0IGJsb2NrIG9mIHRlc3RzIGFyZSBmb3IgSFRNTDUgZmVhdHVyZXMsIGZvciB3aGljaCBBbmRyb2lkCisgICAgICAgIC8vIFRoaXMgZmlyc3QgYmxvY2sgb2YgdGVzdHMgYXJlIGZvciBmZWF0dXJlcyBmb3Igd2hpY2ggQW5kcm9pZAogICAgICAgICAvLyBzaG91bGQgcGFzcyBhbGwgdGVzdHMuIFRoZXkgYXJlIHNraXBwZWQgb25seSB0ZW1wb3JhcmlseS4KICAgICAgICAgLy8gVE9ETzogRml4IHRoZXNlIGZhaWxpbmcgdGVzdHMgYW5kIHJlbW92ZSB0aGVtIGZyb20gdGhpcyBsaXN0LgorICAgICAgICBpZ25vcmVSZXN1bHRMaXN0LmFkZCgiZmFzdC9ldmVudHMvdG91Y2gvYmFzaWMtbXVsdGktdG91Y2gtZXZlbnRzLmh0bWwiKTsgLy8gUmVxdWlyZXMgbXVsdGktdG91Y2gKKyAgICAgICAgaWdub3JlUmVzdWx0TGlzdC5hZGQoImZhc3QvZXZlbnRzL3RvdWNoL3RvdWNoLXRhcmdldC5odG1sIik7IC8vIFJlcXVpcmVzIG11bHRpLXRvdWNoCiAgICAgICAgIGlnbm9yZVJlc3VsdExpc3QuYWRkKCJodHRwL3Rlc3RzL2FwcGNhY2hlL2VtcHR5LW1hbmlmZXN0Lmh0bWwiKTsgLy8gZmxha3kKKyAgICAgICAgaWdub3JlUmVzdWx0TGlzdC5hZGQoImh0dHAvdGVzdHMvYXBwY2FjaGUvZmFsbGJhY2suaHRtbCIpOyAvLyBodHRwOi8vYi9pc3N1ZT9pZD0yNzEzMDA0CiAgICAgICAgIGlnbm9yZVJlc3VsdExpc3QuYWRkKCJodHRwL3Rlc3RzL2FwcGNhY2hlL2ZvcmVpZ24taWZyYW1lLW1haW4uaHRtbCIpOyAvLyBmbGFreSAtIHNraXBzIHN0YXRlcwogICAgICAgICBpZ25vcmVSZXN1bHRMaXN0LmFkZCgiaHR0cC90ZXN0cy9hcHBjYWNoZS9tYW5pZmVzdC13aXRoLWVtcHR5LWZpbGUuaHRtbCIpOyAvLyBmbGFreQorICAgICAgICBpZ25vcmVSZXN1bHRMaXN0LmFkZCgiaHR0cC90ZXN0cy9hcHBjYWNoZS9vcmlnaW4tcXVvdGEuaHRtbCIpOyAvLyBuZWVkcyBjbGVhckFsbEFwcGxpY2F0aW9uQ2FjaGVzKCksIHNlZSBodHRwOi8vYi9pc3N1ZT9pZD0yOTQ0MTk2CiAgICAgICAgIGlnbm9yZVJlc3VsdExpc3QuYWRkKCJzdG9yYWdlL2RhdGFiYXNlLWxvY2stYWZ0ZXItcmVsb2FkLmh0bWwiKTsgLy8gU3VjY2VlZHMgYnV0IER1bXBSZW5kZXJUcmVlIGRvZXMgbm90IHJlYWQgcmVzdWx0IGNvcnJlY3RseQogICAgICAgICBpZ25vcmVSZXN1bHRMaXN0LmFkZCgic3RvcmFnZS9oYXNoLWNoYW5nZS13aXRoLXhoci5odG1sIik7IC8vIFN1Y2NlZWRzIGJ1dCBEdW1wUmVuZGVyVHJlZSBkb2VzIG5vdCByZWFkIHJlc3VsdCBjb3JyZWN0bHkKKyAgICAgICAgaWdub3JlUmVzdWx0TGlzdC5hZGQoInN0b3JhZ2Uvb3Blbi1kYXRhYmFzZS1jcmVhdGlvbi1jYWxsYmFjay1pc29sYXRlZC13b3JsZC5odG1sIik7IC8vIFJlcXVpcmVzIGxheW91dFRlc3RDb250cm9sbGVyLmV2YWx1YXRlU2NyaXB0SW5Jc29sYXRlZFdvcmxkKCkKKyAgICAgICAgaWdub3JlUmVzdWx0TGlzdC5hZGQoInN0b3JhZ2Uvc3RhdGVtZW50LWVycm9yLWNhbGxiYWNrLWlzb2xhdGVkLXdvcmxkLmh0bWwiKTsgLy8gUmVxdWlyZXMgbGF5b3V0VGVzdENvbnRyb2xsZXIuZXZhbHVhdGVTY3JpcHRJbklzb2xhdGVkV29ybGQoKQorICAgICAgICBpZ25vcmVSZXN1bHRMaXN0LmFkZCgic3RvcmFnZS9zdGF0ZW1lbnQtc3VjY2Vzcy1jYWxsYmFjay1pc29sYXRlZC13b3JsZC5odG1sIik7IC8vIFJlcXVpcmVzIGxheW91dFRlc3RDb250cm9sbGVyLmV2YWx1YXRlU2NyaXB0SW5Jc29sYXRlZFdvcmxkKCkKKyAgICAgICAgaWdub3JlUmVzdWx0TGlzdC5hZGQoInN0b3JhZ2UvdHJhbnNhY3Rpb24tY2FsbGJhY2staXNvbGF0ZWQtd29ybGQuaHRtbCIpOyAvLyBSZXF1aXJlcyBsYXlvdXRUZXN0Q29udHJvbGxlci5ldmFsdWF0ZVNjcmlwdEluSXNvbGF0ZWRXb3JsZCgpCisgICAgICAgIGlnbm9yZVJlc3VsdExpc3QuYWRkKCJzdG9yYWdlL3RyYW5zYWN0aW9uLWVycm9yLWNhbGxiYWNrLWlzb2xhdGVkLXdvcmxkLmh0bWwiKTsgLy8gUmVxdWlyZXMgbGF5b3V0VGVzdENvbnRyb2xsZXIuZXZhbHVhdGVTY3JpcHRJbklzb2xhdGVkV29ybGQoKQorICAgICAgICBpZ25vcmVSZXN1bHRMaXN0LmFkZCgic3RvcmFnZS90cmFuc2FjdGlvbi1zdWNjZXNzLWNhbGxiYWNrLWlzb2xhdGVkLXdvcmxkLmh0bWwiKTsgLy8gUmVxdWlyZXMgbGF5b3V0VGVzdENvbnRyb2xsZXIuZXZhbHVhdGVTY3JpcHRJbklzb2xhdGVkV29ybGQoKQogCi0gICAgICAgIC8vIFdpbGwgYWx3YXlzIGZhaWwKLSAgICAgICAgaWdub3JlUmVzdWx0TGlzdC5hZGQoImRvbS9zdmcvbGV2ZWwzL3hwYXRoIik7IC8vIFhQYXRoIG5vdCBzdXBwb3J0ZWQKKyAgICAgICAgLy8gRXhwZWN0ZWQgZmFpbHVyZXMgZHVlIHRvIHVuc3VwcG9ydGVkIGZlYXR1cmVzLgorICAgICAgICBpZ25vcmVSZXN1bHRMaXN0LmFkZCgiZmFzdC9ldmVudHMvdG91Y2gvdG91Y2gtY29vcmRzLWluLXpvb20tYW5kLXNjcm9sbC5odG1sIik7IC8vIFJlcXVpcmVzIGV2ZW50U2VuZGVyLnpvb21QYWdlSW4oKSx6b29tUGFnZU91dCgpCiAgICAgICAgIGlnbm9yZVJlc3VsdExpc3QuYWRkKCJmYXN0L3dvcmtlcnMiKTsgLy8gd29ya2VycyBub3Qgc3VwcG9ydGVkCi0gICAgICAgIGlnbm9yZVJlc3VsdExpc3QuYWRkKCJmYXN0L3hwYXRoIik7IC8vIFhQYXRoIG5vdCBzdXBwb3J0ZWQKICAgICAgICAgaWdub3JlUmVzdWx0TGlzdC5hZGQoImh0dHAvdGVzdHMvZXZlbnRzb3VyY2Uvd29ya2VycyIpOyAvLyB3b3JrZXJzIG5vdCBzdXBwb3J0ZWQKICAgICAgICAgaWdub3JlUmVzdWx0TGlzdC5hZGQoImh0dHAvdGVzdHMvd29ya2VycyIpOyAvLyB3b3JrZXJzIG5vdCBzdXBwb3J0ZWQKICAgICAgICAgaWdub3JlUmVzdWx0TGlzdC5hZGQoImh0dHAvdGVzdHMveG1saHR0cHJlcXVlc3Qvd29ya2VycyIpOyAvLyB3b3JrZXJzIG5vdCBzdXBwb3J0ZWQKICAgICAgICAgaWdub3JlUmVzdWx0TGlzdC5hZGQoInN0b3JhZ2UvZG9tc3RvcmFnZS9sb2NhbHN0b3JhZ2UvcHJpdmF0ZS1icm93c2luZy1hZmZlY3RzLXN0b3JhZ2UuaHRtbCIpOyAvLyBwcml2YXRlIGJyb3dzaW5nIG5vdCBzdXBwb3J0ZWQKICAgICAgICAgaWdub3JlUmVzdWx0TGlzdC5hZGQoInN0b3JhZ2UvZG9tc3RvcmFnZS9zZXNzaW9uc3RvcmFnZS9wcml2YXRlLWJyb3dzaW5nLWFmZmVjdHMtc3RvcmFnZS5odG1sIik7IC8vIHByaXZhdGUgYnJvd3Npbmcgbm90IHN1cHBvcnRlZAorICAgICAgICBpZ25vcmVSZXN1bHRMaXN0LmFkZCgic3RvcmFnZS9pbmRleGVkZGIiKTsgLy8gaW5kZXhlZGRiIG5vdCBzdXBwb3J0ZWQKICAgICAgICAgaWdub3JlUmVzdWx0TGlzdC5hZGQoInN0b3JhZ2UvcHJpdmF0ZS1icm93c2luZy1yZWFkb25seS5odG1sIik7IC8vIHByaXZhdGUgYnJvd3Npbmcgbm90IHN1cHBvcnRlZAogICAgICAgICBpZ25vcmVSZXN1bHRMaXN0LmFkZCgid2Vic29ja2V0L3Rlc3RzL3dvcmtlcnMiKTsgLy8gd29ya2VycyBub3Qgc3VwcG9ydGVkCiAKKyAgICAgICAgLy8gRXhwZWN0ZWQgZmFpbHVyZXMgZHVlIHRvIG1pc3NpbmcgZXhwZWN0ZWQgcmVzdWx0cworICAgICAgICBpZ25vcmVSZXN1bHRMaXN0LmFkZCgiZG9tL3hodG1sL2xldmVsMy9jb3JlL2Nhbm9uaWNhbGZvcm0wOC54aHRtbCIpOworICAgICAgICBpZ25vcmVSZXN1bHRMaXN0LmFkZCgiZG9tL3hodG1sL2xldmVsMy9jb3JlL2Nhbm9uaWNhbGZvcm0wOS54aHRtbCIpOworICAgICAgICBpZ25vcmVSZXN1bHRMaXN0LmFkZCgiZG9tL3hodG1sL2xldmVsMy9jb3JlL2RvY3VtZW50Z2V0aW5wdXRlbmNvZGluZzAzLnhodG1sIik7CisgICAgICAgIGlnbm9yZVJlc3VsdExpc3QuYWRkKCJkb20veGh0bWwvbGV2ZWwzL2NvcmUvZW50aXR5Z2V0aW5wdXRlbmNvZGluZzAyLnhodG1sIik7CisgICAgICAgIGlnbm9yZVJlc3VsdExpc3QuYWRkKCJkb20veGh0bWwvbGV2ZWwzL2NvcmUvZW50aXR5Z2V0eG1sdmVyc2lvbjAyLnhodG1sIik7CisgICAgICAgIGlnbm9yZVJlc3VsdExpc3QuYWRkKCJkb20veGh0bWwvbGV2ZWwzL2NvcmUvbm9kZWdldGJhc2V1cmkwNS54aHRtbCIpOworICAgICAgICBpZ25vcmVSZXN1bHRMaXN0LmFkZCgiZG9tL3hodG1sL2xldmVsMy9jb3JlL25vZGVnZXRiYXNldXJpMDcueGh0bWwiKTsKKyAgICAgICAgaWdub3JlUmVzdWx0TGlzdC5hZGQoImRvbS94aHRtbC9sZXZlbDMvY29yZS9ub2RlZ2V0YmFzZXVyaTA5LnhodG1sIik7CisgICAgICAgIGlnbm9yZVJlc3VsdExpc3QuYWRkKCJkb20veGh0bWwvbGV2ZWwzL2NvcmUvbm9kZWdldGJhc2V1cmkxMC54aHRtbCIpOworICAgICAgICBpZ25vcmVSZXN1bHRMaXN0LmFkZCgiZG9tL3hodG1sL2xldmVsMy9jb3JlL25vZGVnZXRiYXNldXJpMTEueGh0bWwiKTsKKyAgICAgICAgaWdub3JlUmVzdWx0TGlzdC5hZGQoImRvbS94aHRtbC9sZXZlbDMvY29yZS9ub2RlZ2V0YmFzZXVyaTE1LnhodG1sIik7CisgICAgICAgIGlnbm9yZVJlc3VsdExpc3QuYWRkKCJkb20veGh0bWwvbGV2ZWwzL2NvcmUvbm9kZWdldGJhc2V1cmkxNy54aHRtbCIpOworICAgICAgICBpZ25vcmVSZXN1bHRMaXN0LmFkZCgiZG9tL3hodG1sL2xldmVsMy9jb3JlL25vZGVnZXRiYXNldXJpMTgueGh0bWwiKTsKKyAgICAgICAgaWdub3JlUmVzdWx0TGlzdC5hZGQoImRvbS94aHRtbC9sZXZlbDMvY29yZS9ub2RlbG9va3VwbmFtZXNwYWNldXJpMDEueGh0bWwiKTsKKyAgICAgICAgaWdub3JlUmVzdWx0TGlzdC5hZGQoImRvbS94aHRtbC9sZXZlbDMvY29yZS9ub2RlbG9va3VwcHJlZml4MTkueGh0bWwiKTsKKwogICAgICAgICAvLyBUT0RPOiBUaGVzZSBuZWVkIHRvIGJlIHRyaWFnZWQKICAgICAgICAgaWdub3JlUmVzdWx0TGlzdC5hZGQoImZhc3QvY3NzL2Nhc2UtdHJhbnNmb3JtLmh0bWwiKTsgLy8gd2lsbCBub3QgZml4ICM2MTk3MDcKICAgICAgICAgaWdub3JlUmVzdWx0TGlzdC5hZGQoImZhc3QvZG9tL0VsZW1lbnQvb2Zmc2V0TGVmdC1vZmZzZXRUb3AtYm9keS1xdWlyay5odG1sIik7IC8vIGRpZmZlcmVudCBzY3JlZW4gc2l6ZSByZXN1bHQgaW4gZXh0cmEgc3BhY2VzIGluIEFwcGxlIGNvbXBhcmVkIHRvIHVzCiAgICAgICAgIGlnbm9yZVJlc3VsdExpc3QuYWRkKCJmYXN0L2RvbS9XaW5kb3cvUGx1Zy1pbnMuaHRtbCIpOyAvLyBuZWVkIHRlc3QgcGx1Z2luCi0gICAgICAgIGlnbm9yZVJlc3VsdExpc3QuYWRkKCJmYXN0L2RvbS9XaW5kb3cvd2luZG93LXByb3BlcnRpZXMuaHRtbCIpOyAvLyB4c2x0IGFuZCB4cGF0aCBlbGVtZW50cyBtaXNzaW5nIGZyb20gcHJvcGVydHkgbGlzdAogICAgICAgICBpZ25vcmVSZXN1bHRMaXN0LmFkZCgiZmFzdC9kb20vV2luZG93L3dpbmRvdy1zY3JlZW4tcHJvcGVydGllcy5odG1sIik7IC8vIHBpeGVsIGRlcHRoCiAgICAgICAgIGlnbm9yZVJlc3VsdExpc3QuYWRkKCJmYXN0L2RvbS9XaW5kb3cvd2luZG93LXh5LXByb3BlcnRpZXMuaHRtbCIpOyAvLyByZXF1aXJlcyBldmVudFNlbmRlci5tb3VzZURvd24oKSxtb3VzZVVwKCkKICAgICAgICAgaWdub3JlUmVzdWx0TGlzdC5hZGQoImZhc3QvZG9tL2F0dHJpYnV0ZS1uYW1lc3BhY2VzLWdldC1zZXQuaHRtbCIpOyAvLyBodHRwOi8vYi83MzMyMjkKLSAgICAgICAgaWdub3JlUmVzdWx0TGlzdC5hZGQoImZhc3QvZG9tL2djLTkuaHRtbCIpOyAvLyByZXF1aXJlcyB4cGF0aCBzdXBwb3J0Ci0gICAgICAgIGlnbm9yZVJlc3VsdExpc3QuYWRkKCJmYXN0L2RvbS9nbG9iYWwtY29uc3RydWN0b3JzLmh0bWwiKTsgLy8gcmVxdWlyZXMgeHNsdCBhbmQgeHBhdGggc3VwcG9ydAogICAgICAgICBpZ25vcmVSZXN1bHRMaXN0LmFkZCgiZmFzdC9kb20vb2JqZWN0LWVtYmVkLXBsdWdpbi1zY3JpcHRpbmcuaHRtbCIpOyAvLyBkeW5hbWljIHBsdWdpbnMgbm90IHN1cHBvcnRlZAogICAgICAgICBpZ25vcmVSZXN1bHRMaXN0LmFkZCgiZmFzdC9kb20vdGFiaW5kZXgtY2xhbXAuaHRtbCIpOyAvLyB0aGVyZSBpcyBleHRyYSBzcGFjaW5nIGluIHRoZSBmaWxlIGR1ZSB0byBtdWx0aXBsZSBpbnB1dCBib3hlcyBmaXR0aW5nIG9uIG9uZSBsaW5lIG9uIEFwcGxlLCBvdXJzIGFyZSB3cmFwcGVkLiBTcGFjZSBhdCBsaW5lIGVuZHMgYXJlIHN0cmlwcGVkLgogICAgICAgICBpZ25vcmVSZXN1bHRMaXN0LmFkZCgiZmFzdC9ldmVudHMvYW5jaG9yLWltYWdlLXNjcm9sbGVkLXgteS5odG1sIik7IC8vIHJlcXVpcmVzIGV2ZW50U2VuZGVyLm1vdXNlRG93bigpLG1vdXNlVXAoKQpAQCAtMTcyLDggKzIwNSw2IEBACiAgICAgICAgIGlnbm9yZVJlc3VsdExpc3QuYWRkKCJmYXN0L3JlcGxhY2VkL2ltYWdlLW1hcC5odG1sIik7IC8vIHJlcXVpcmVzIGV2ZW50U2VuZGVyLm1vdXNlRG93bigpLG1vdXNlVXAoKQogICAgICAgICBpZ25vcmVSZXN1bHRMaXN0LmFkZCgiZmFzdC90ZXh0L3BsYWluLXRleHQtbGluZS1icmVha3MuaHRtbCIpOyAvLyBleHRyYSBzcGFjaW5nIGJlY2F1c2UgaUZyYW1lcyByZW5kZXJlZCBuZXh0IHRvIGVhY2ggb3RoZXIgb24gQXBwbGUKICAgICAgICAgaWdub3JlUmVzdWx0TGlzdC5hZGQoInByb2ZpbGVyIik7IC8vIHByb2ZpbGVyIGlzIG5vdCBzdXBwb3J0ZWQKLSAgICAgICAgaWdub3JlUmVzdWx0TGlzdC5hZGQoInN2ZyIpOyAvLyBzdmcgaXMgbm90IHN1cHBvcnRlZAotCiAgICAgfQogCiB9CmRpZmYgLS1naXQgYS90ZXN0cy9EdW1wUmVuZGVyVHJlZS9zcmMvY29tL2FuZHJvaWQvZHVtcHJlbmRlcnRyZWUvRnNVdGlscy5qYXZhIGIvdGVzdHMvRHVtcFJlbmRlclRyZWUvc3JjL2NvbS9hbmRyb2lkL2R1bXByZW5kZXJ0cmVlL0ZzVXRpbHMuamF2YQppbmRleCA2Y2ZjZTQxLi41ZDM0ZTI1IDEwMDY0NAotLS0gYS90ZXN0cy9EdW1wUmVuZGVyVHJlZS9zcmMvY29tL2FuZHJvaWQvZHVtcHJlbmRlcnRyZWUvRnNVdGlscy5qYXZhCisrKyBiL3Rlc3RzL0R1bXBSZW5kZXJUcmVlL3NyYy9jb20vYW5kcm9pZC9kdW1wcmVuZGVydHJlZS9Gc1V0aWxzLmphdmEKQEAgLTQ5LDggKzQ5LDEzIEBACiAgICAgICAgIC8vbm8gY3JlYXRpb24gb2YgaW5zdGFuY2VzCiAgICAgfQogCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGZpbmRMYXlvdXRUZXN0c1JlY3Vyc2l2ZWx5KEJ1ZmZlcmVkT3V0cHV0U3RyZWFtIGJvcywKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIHRoZSBudW1iZXIgb2YgdGVzdHMgaW4gdGhlIGxpc3QuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBpbnQgd3JpdGVMYXlvdXRUZXN0TGlzdFJlY3Vyc2l2ZWx5KEJ1ZmZlcmVkT3V0cHV0U3RyZWFtIGJvcywKICAgICAgICAgICAgIFN0cmluZyBkaXIsIGJvb2xlYW4gaWdub3JlUmVzdWx0c0luRGlyKSB0aHJvd3MgSU9FeGNlcHRpb24geworCisgICAgICAgIGludCB0ZXN0Q291bnQgPSAwOwogICAgICAgICBMb2cudihMT0dUQUcsICJTZWFyY2hpbmcgdGVzdHMgdW5kZXIgIiArIGRpcik7CiAKICAgICAgICAgRmlsZSBkID0gbmV3IEZpbGUoZGlyKTsKQEAgLTY4LDcgKzczLDcgQEAKICAgICAgICAgICAgICAgICAvLyBJZiB0aGlzIGlzIG5vdCBhIHRlc3QgZGlyZWN0b3J5LCB3ZSBkb24ndCByZWN1cnNlIGludG8gaXQuCiAgICAgICAgICAgICAgICAgaWYgKCFGaWxlRmlsdGVyLmlzTm9uVGVzdERpcihzKSkgewogICAgICAgICAgICAgICAgICAgICBMb2cudihMT0dUQUcsICJSZWN1cnNpbmcgb24gIiArIHMpOwotICAgICAgICAgICAgICAgICAgICBmaW5kTGF5b3V0VGVzdHNSZWN1cnNpdmVseShib3MsIHMsIGlnbm9yZVJlc3VsdHNJbkRpcik7CisgICAgICAgICAgICAgICAgICAgIHRlc3RDb3VudCArPSB3cml0ZUxheW91dFRlc3RMaXN0UmVjdXJzaXZlbHkoYm9zLCBzLCBpZ25vcmVSZXN1bHRzSW5EaXIpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgIH0KQEAgLTc5LDcgKzg0LDkgQEAKICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgaWYgKChzLnRvTG93ZXJDYXNlKCkuZW5kc1dpdGgoIi5odG1sIikgfHwgcy50b0xvd2VyQ2FzZSgpLmVuZHNXaXRoKCIueG1sIikpCisgICAgICAgICAgICBpZiAoKHMudG9Mb3dlckNhc2UoKS5lbmRzV2l0aCgiLmh0bWwiKQorICAgICAgICAgICAgICAgICAgICB8fCBzLnRvTG93ZXJDYXNlKCkuZW5kc1dpdGgoIi54bWwiKQorICAgICAgICAgICAgICAgICAgICB8fCBzLnRvTG93ZXJDYXNlKCkuZW5kc1dpdGgoIi54aHRtbCIpKQogICAgICAgICAgICAgICAgICAgICAmJiAhcy5lbmRzV2l0aCgiVEVNUExBVEUuaHRtbCIpKSB7CiAgICAgICAgICAgICAgICAgTG9nLnYoTE9HVEFHLCAiUmVjb3JkaW5nICIgKyBzKTsKICAgICAgICAgICAgICAgICBib3Mud3JpdGUocy5nZXRCeXRlcygpKTsKQEAgLTg4LDggKzk1LDEwIEBACiAgICAgICAgICAgICAgICAgICAgIGJvcy53cml0ZSgoIiBJR05PUkVfUkVTVUxUIikuZ2V0Qnl0ZXMoKSk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGJvcy53cml0ZSgnXG4nKTsKKyAgICAgICAgICAgICAgICB0ZXN0Q291bnQrKzsKICAgICAgICAgICAgIH0KICAgICAgICAgfQorICAgICAgICByZXR1cm4gdGVzdENvdW50OwogICAgIH0KIAogICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB1cGRhdGVUZXN0U3RhdHVzKFN0cmluZyBzdGF0dXNGaWxlLCBTdHJpbmcgcykgewpkaWZmIC0tZ2l0IGEvdGVzdHMvRHVtcFJlbmRlclRyZWUvc3JjL2NvbS9hbmRyb2lkL2R1bXByZW5kZXJ0cmVlL0xheW91dFRlc3RDb250cm9sbGVyLmphdmEgYi90ZXN0cy9EdW1wUmVuZGVyVHJlZS9zcmMvY29tL2FuZHJvaWQvZHVtcHJlbmRlcnRyZWUvTGF5b3V0VGVzdENvbnRyb2xsZXIuamF2YQppbmRleCA5MjM2MzQ1Li45YmUyZjFjIDEwMDY0NAotLS0gYS90ZXN0cy9EdW1wUmVuZGVyVHJlZS9zcmMvY29tL2FuZHJvaWQvZHVtcHJlbmRlcnRyZWUvTGF5b3V0VGVzdENvbnRyb2xsZXIuamF2YQorKysgYi90ZXN0cy9EdW1wUmVuZGVyVHJlZS9zcmMvY29tL2FuZHJvaWQvZHVtcHJlbmRlcnRyZWUvTGF5b3V0VGVzdENvbnRyb2xsZXIuamF2YQpAQCAtMTgsMjkgKzE4LDMwIEBACiAKIHB1YmxpYyBpbnRlcmZhY2UgTGF5b3V0VGVzdENvbnRyb2xsZXIgewogCi0JcHVibGljIHZvaWQgZHVtcEFzVGV4dCgpOwotCXB1YmxpYyB2b2lkIHdhaXRVbnRpbERvbmUoKTsKLQlwdWJsaWMgdm9pZCBub3RpZnlEb25lKCk7Ci0JCi0JLy8gRm9yY2UgYSByZWRyYXcgb2YgdGhlIHBhZ2UKLQlwdWJsaWMgdm9pZCBkaXNwbGF5KCk7Ci0JLy8gVXNlZCB3aXRoIHBpeGVsIGR1bXBzIG9mIGNvbnRlbnQKLQlwdWJsaWMgdm9pZCB0ZXN0UmVwYWludCgpOwotCQotCS8vIElmIHRoZSBwYWdlIHRpdGxlIGNoYW5nZXMsIGFkZCB0aGUgaW5mb3JtYXRpb24gdG8gdGhlIG91dHB1dC4KLQlwdWJsaWMgdm9pZCBkdW1wVGl0bGVDaGFuZ2VzKCk7Ci0JcHVibGljIHZvaWQgZHVtcEJhY2tGb3J3YXJkTGlzdCgpOwotCXB1YmxpYyB2b2lkIGR1bXBDaGlsZEZyYW1lU2Nyb2xsUG9zaXRpb25zKCk7Ci0JcHVibGljIHZvaWQgZHVtcEVkaXRpbmdDYWxsYmFja3MoKTsKLQkKLQkvLyBTaG93L0hpZGUgd2luZG93IGZvciB3aW5kb3cub25CbHVyKCkgdGVzdGluZwotCXB1YmxpYyB2b2lkIHNldFdpbmRvd0lzS2V5KGJvb2xlYW4gYik7Ci0JLy8gTWFjIGZ1bmN0aW9uLCB1c2VkIHRvIGRpc2FibGUgZXZlbnRzIGdvaW5nIHRvIHRoZSB3aW5kb3cKLQlwdWJsaWMgdm9pZCBzZXRNYWluRnJhbWVJc0ZpcnN0UmVzcG9uZGVyKGJvb2xlYW4gYik7Ci0JCi0JcHVibGljIHZvaWQgZHVtcFNlbGVjdGlvblJlY3QoKTsKLQkKLQkvLyBpbnZhbGlkYXRlIGFuZCBkcmF3IG9uZSBsaW5lIGF0IGEgdGltZSBvZiB0aGUgd2ViIHZpZXcuCisgICAgcHVibGljIHZvaWQgZHVtcEFzVGV4dChib29sZWFuIGVuYWJsZVBpeGVsVGVzdHMpOworICAgIHB1YmxpYyB2b2lkIGR1bXBDaGlsZEZyYW1lc0FzVGV4dCgpOworICAgIHB1YmxpYyB2b2lkIHdhaXRVbnRpbERvbmUoKTsKKyAgICBwdWJsaWMgdm9pZCBub3RpZnlEb25lKCk7CisKKyAgICAvLyBGb3JjZSBhIHJlZHJhdyBvZiB0aGUgcGFnZQorICAgIHB1YmxpYyB2b2lkIGRpc3BsYXkoKTsKKyAgICAvLyBVc2VkIHdpdGggcGl4ZWwgZHVtcHMgb2YgY29udGVudAorICAgIHB1YmxpYyB2b2lkIHRlc3RSZXBhaW50KCk7CisKKyAgICAvLyBJZiB0aGUgcGFnZSB0aXRsZSBjaGFuZ2VzLCBhZGQgdGhlIGluZm9ybWF0aW9uIHRvIHRoZSBvdXRwdXQuCisgICAgcHVibGljIHZvaWQgZHVtcFRpdGxlQ2hhbmdlcygpOworICAgIHB1YmxpYyB2b2lkIGR1bXBCYWNrRm9yd2FyZExpc3QoKTsKKyAgICBwdWJsaWMgdm9pZCBkdW1wQ2hpbGRGcmFtZVNjcm9sbFBvc2l0aW9ucygpOworICAgIHB1YmxpYyB2b2lkIGR1bXBFZGl0aW5nQ2FsbGJhY2tzKCk7CisKKyAgICAvLyBTaG93L0hpZGUgd2luZG93IGZvciB3aW5kb3cub25CbHVyKCkgdGVzdGluZworICAgIHB1YmxpYyB2b2lkIHNldFdpbmRvd0lzS2V5KGJvb2xlYW4gYik7CisgICAgLy8gTWFjIGZ1bmN0aW9uLCB1c2VkIHRvIGRpc2FibGUgZXZlbnRzIGdvaW5nIHRvIHRoZSB3aW5kb3cKKyAgICBwdWJsaWMgdm9pZCBzZXRNYWluRnJhbWVJc0ZpcnN0UmVzcG9uZGVyKGJvb2xlYW4gYik7CisKKyAgICBwdWJsaWMgdm9pZCBkdW1wU2VsZWN0aW9uUmVjdCgpOworCisgICAgLy8gaW52YWxpZGF0ZSBhbmQgZHJhdyBvbmUgbGluZSBhdCBhIHRpbWUgb2YgdGhlIHdlYiB2aWV3LgogICAgIHB1YmxpYyB2b2lkIHJlcGFpbnRTd2VlcEhvcml6b250YWxseSgpOwogICAgIAogICAgIC8vIEhpc3RvcnkgdGVzdGluZyBmdW5jdGlvbnMKQEAgLTY3LDQgKzY4LDExIEBACiAgICAgcHVibGljIHZvaWQgc2V0R2VvbG9jYXRpb25QZXJtaXNzaW9uKGJvb2xlYW4gYWxsb3cpOwogCiAgICAgcHVibGljIHZvaWQgb3ZlcnJpZGVQcmVmZXJlbmNlKFN0cmluZyBrZXksIGJvb2xlYW4gdmFsdWUpOworCisgICAgLy8gRm9yIFhTU0F1ZGl0b3IgdGVzdHMKKyAgICBwdWJsaWMgdm9pZCBzZXRYU1NBdWRpdG9yRW5hYmxlZChib29sZWFuIGZsYWcpOworCisgICAgLy8gRm9yIERldmljZU9yaWVudGF0aW9uIHRlc3RzCisgICAgcHVibGljIHZvaWQgc2V0TW9ja0RldmljZU9yaWVudGF0aW9uKGJvb2xlYW4gY2FuUHJvdmlkZUFscGhhLCBkb3VibGUgYWxwaGEsCisgICAgICAgICAgICBib29sZWFuIGNhblByb3ZpZGVCZXRhLCBkb3VibGUgYmV0YSwgYm9vbGVhbiBjYW5Qcm92aWRlR2FtbWEsIGRvdWJsZSBnYW1tYSk7CiB9CmRpZmYgLS1naXQgYS90ZXN0cy9EdW1wUmVuZGVyVHJlZS9zcmMvY29tL2FuZHJvaWQvZHVtcHJlbmRlcnRyZWUvTGF5b3V0VGVzdHNBdXRvVGVzdC5qYXZhIGIvdGVzdHMvRHVtcFJlbmRlclRyZWUvc3JjL2NvbS9hbmRyb2lkL2R1bXByZW5kZXJ0cmVlL0xheW91dFRlc3RzQXV0b1Rlc3QuamF2YQppbmRleCA5Y2NmNTQ5Li4xMzJmMTdhIDEwMDY0NAotLS0gYS90ZXN0cy9EdW1wUmVuZGVyVHJlZS9zcmMvY29tL2FuZHJvaWQvZHVtcHJlbmRlcnRyZWUvTGF5b3V0VGVzdHNBdXRvVGVzdC5qYXZhCisrKyBiL3Rlc3RzL0R1bXBSZW5kZXJUcmVlL3NyYy9jb20vYW5kcm9pZC9kdW1wcmVuZGVydHJlZS9MYXlvdXRUZXN0c0F1dG9UZXN0LmphdmEKQEAgLTIwLDkgKzIwLDcgQEAKIGltcG9ydCBjb20uYW5kcm9pZC5kdW1wcmVuZGVydHJlZS5mb3J3YXJkZXIuQWRiVXRpbHM7CiBpbXBvcnQgY29tLmFuZHJvaWQuZHVtcHJlbmRlcnRyZWUuZm9yd2FyZGVyLkZvcndhcmRTZXJ2aWNlOwogCi1pbXBvcnQgYW5kcm9pZC5hcHAuSW5zdHJ1bWVudGF0aW9uOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7Ci1pbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CiBpbXBvcnQgYW5kcm9pZC5vcy5FbnZpcm9ubWVudDsKIGltcG9ydCBhbmRyb2lkLnRlc3QuQWN0aXZpdHlJbnN0cnVtZW50YXRpb25UZXN0Q2FzZTI7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKQEAgLTE1OCwxOCArMTU2LDExIEBACiAgICAgcHJpdmF0ZSBTdHJpbmcgbUpzRW5naW5lOwogICAgIHByaXZhdGUgU3RyaW5nIG1UZXN0UGF0aFByZWZpeDsKICAgICBwcml2YXRlIGJvb2xlYW4gbUZpbmlzaGVkOworICAgIHByaXZhdGUgaW50IG1UZXN0Q291bnQ7CisgICAgcHJpdmF0ZSBpbnQgbVJlc3VtZUluZGV4OwogCiAgICAgcHVibGljIExheW91dFRlc3RzQXV0b1Rlc3QoKSB7Ci0gICAgICBzdXBlcigiY29tLmFuZHJvaWQuZHVtcHJlbmRlcnRyZWUiLCBUZXN0U2hlbGxBY3Rpdml0eS5jbGFzcyk7Ci0gICAgfQotCi0gICAgLy8gVGhpcyBmdW5jdGlvbiB3cml0ZXMgdGhlIHJlc3VsdCBvZiB0aGUgbGF5b3V0IHRlc3QgdG8KLSAgICAvLyBBbSBzdGF0dXMgc28gdGhhdCBpdCBjYW4gYmUgcGlja2VkIHVwIGZyb20gYSBzY3JpcHQuCi0gICAgcHJpdmF0ZSB2b2lkIHBhc3NPckZhaWxDYWxsYmFjayhTdHJpbmcgZmlsZSwgYm9vbGVhbiByZXN1bHQpIHsKLSAgICAgIEluc3RydW1lbnRhdGlvbiBpbnN0ID0gZ2V0SW5zdHJ1bWVudGF0aW9uKCk7Ci0gICAgICBCdW5kbGUgYnVuZGxlID0gbmV3IEJ1bmRsZSgpOwotICAgICAgYnVuZGxlLnB1dEJvb2xlYW4oZmlsZSwgcmVzdWx0KTsKLSAgICAgIGluc3Quc2VuZFN0YXR1cygwLCBidW5kbGUpOworICAgICAgc3VwZXIoVGVzdFNoZWxsQWN0aXZpdHkuY2xhc3MpOwogICAgIH0KIAogICAgIHByaXZhdGUgdm9pZCBnZXRUZXN0TGlzdCgpIHsKQEAgLTE5MCw2ICsxODEsNyBAQAogICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewogICAgICAgICAgICAgTG9nLmUoTE9HVEFHLCAiRXJyb3Igd2hpbGUgcmVhZGluZyB0ZXN0IGxpc3QgOiAiICsgZS5nZXRNZXNzYWdlKCkpOwogICAgICAgICB9CisgICAgICAgIG1UZXN0Q291bnQgPSBtVGVzdExpc3Quc2l6ZSgpOwogICAgIH0KIAogICAgIHByaXZhdGUgdm9pZCByZXN1bWVUZXN0TGlzdCgpIHsKQEAgLTIwMCw2ICsxOTIsNyBAQAogICAgICAgICAgICAgICAgIGlmIChtVGVzdExpc3QuZWxlbWVudEF0KGkpLmVxdWFscyhsaW5lKSkgewogICAgICAgICAgICAgICAgICAgICBtVGVzdExpc3QgPSBuZXcgVmVjdG9yPFN0cmluZz4obVRlc3RMaXN0LnN1Ykxpc3QoaSsxLCBtVGVzdExpc3Quc2l6ZSgpKSk7CiAgICAgICAgICAgICAgICAgICAgIG1UZXN0TGlzdElnbm9yZVJlc3VsdCA9IG5ldyBWZWN0b3I8Qm9vbGVhbj4obVRlc3RMaXN0SWdub3JlUmVzdWx0LnN1Ykxpc3QoaSsxLCBtVGVzdExpc3RJZ25vcmVSZXN1bHQuc2l6ZSgpKSk7CisgICAgICAgICAgICAgICAgICAgIG1SZXN1bWVJbmRleCA9IGkgKyAxOwogICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CkBAIC0yMzIsMTQgKzIyNSwyMiBAQAogICAgICAgICAvLyBUaGUgZ2VuZXJpYyByZXN1bHQgaXMgYXQgPHBhdGg+LzxuYW1lPi1leHBlY3RlZC50eHQKICAgICAgICAgLy8gRmlyc3QgdHJ5IHRoZSBBbmRyb2lkLXNwZWNpZmljIHJlc3VsdCBhdAogICAgICAgICAvLyBwbGF0Zm9ybS9hbmRyb2lkLTxqcy1lbmdpbmU+LzxwYXRoPi88bmFtZT4tZXhwZWN0ZWQudHh0CisgICAgICAgIC8vIHRoZW4KKyAgICAgICAgLy8gcGxhdGZvcm0vYW5kcm9pZC88cGF0aD4vPG5hbWU+LWV4cGVjdGVkLnR4dAogICAgICAgICBpbnQgcG9zID0gdGVzdC5sYXN0SW5kZXhPZignLicpOwogICAgICAgICBpZiAocG9zID09IC0xKQogICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgIFN0cmluZyBnZW5lcmljRXhwZWN0ZWRSZXN1bHQgPSB0ZXN0LnN1YnN0cmluZygwLCBwb3MpICsgIi1leHBlY3RlZC50eHQiOwogICAgICAgICBTdHJpbmcgYW5kcm9pZEV4cGVjdGVkUmVzdWx0c0RpciA9ICJwbGF0Zm9ybS9hbmRyb2lkLSIgKyBtSnNFbmdpbmUgKyAiLyI7Ci0gICAgICAgIFN0cmluZyBhbmRyb2lkRXhwZWN0ZWRSZXN1bHQgPQotICAgICAgICAgICAgZ2VuZXJpY0V4cGVjdGVkUmVzdWx0LnJlcGxhY2VGaXJzdChMQVlPVVRfVEVTVFNfUk9PVCwgTEFZT1VUX1RFU1RTX1JPT1QgKyBhbmRyb2lkRXhwZWN0ZWRSZXN1bHRzRGlyKTsKKyAgICAgICAgU3RyaW5nIGFuZHJvaWRFeHBlY3RlZFJlc3VsdCA9IGdlbmVyaWNFeHBlY3RlZFJlc3VsdC5yZXBsYWNlRmlyc3QoTEFZT1VUX1RFU1RTX1JPT1QsCisgICAgICAgICAgICAgICAgTEFZT1VUX1RFU1RTX1JPT1QgKyBhbmRyb2lkRXhwZWN0ZWRSZXN1bHRzRGlyKTsKICAgICAgICAgRmlsZSBmID0gbmV3IEZpbGUoYW5kcm9pZEV4cGVjdGVkUmVzdWx0KTsKKyAgICAgICAgaWYgKGYuZXhpc3RzKCkpCisgICAgICAgICAgICByZXR1cm4gYW5kcm9pZEV4cGVjdGVkUmVzdWx0OworICAgICAgICBhbmRyb2lkRXhwZWN0ZWRSZXN1bHRzRGlyID0gInBsYXRmb3JtL2FuZHJvaWQvIjsKKyAgICAgICAgYW5kcm9pZEV4cGVjdGVkUmVzdWx0ID0gZ2VuZXJpY0V4cGVjdGVkUmVzdWx0LnJlcGxhY2VGaXJzdChMQVlPVVRfVEVTVFNfUk9PVCwKKyAgICAgICAgICAgICAgICBMQVlPVVRfVEVTVFNfUk9PVCArIGFuZHJvaWRFeHBlY3RlZFJlc3VsdHNEaXIpOworICAgICAgICBmID0gbmV3IEZpbGUoYW5kcm9pZEV4cGVjdGVkUmVzdWx0KTsKICAgICAgICAgcmV0dXJuIGYuZXhpc3RzKCkgPyBhbmRyb2lkRXhwZWN0ZWRSZXN1bHQgOiBnZW5lcmljRXhwZWN0ZWRSZXN1bHQ7CiAgICAgfQogCkBAIC0zMDAsNyArMzAxLDcgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIHByaXZhdGUgdm9pZCBydW5UZXN0QW5kV2FpdFVudGlsRG9uZShUZXN0U2hlbGxBY3Rpdml0eSBhY3Rpdml0eSwgU3RyaW5nIHRlc3QsIGludCB0aW1lb3V0LCBib29sZWFuIGlnbm9yZVJlc3VsdCkgeworICAgIHByaXZhdGUgdm9pZCBydW5UZXN0QW5kV2FpdFVudGlsRG9uZShUZXN0U2hlbGxBY3Rpdml0eSBhY3Rpdml0eSwgU3RyaW5nIHRlc3QsIGludCB0aW1lb3V0LCBib29sZWFuIGlnbm9yZVJlc3VsdCwgaW50IHRlc3ROdW1iZXIpIHsKICAgICAgICAgYWN0aXZpdHkuc2V0Q2FsbGJhY2sobmV3IFRlc3RTaGVsbENhbGxiYWNrKCkgewogICAgICAgICAgICAgcHVibGljIHZvaWQgZmluaXNoZWQoKSB7CiAgICAgICAgICAgICAgICAgc3luY2hyb25pemVkIChMYXlvdXRUZXN0c0F1dG9UZXN0LnRoaXMpIHsKQEAgLTMzNiw2ICszMzcsOSBAQAogICAgICAgICBpbnRlbnQucHV0RXh0cmEoVGVzdFNoZWxsQWN0aXZpdHkuVEVTVF9VUkwsIEZzVXRpbHMuZ2V0VGVzdFVybCh0ZXN0KSk7CiAgICAgICAgIGludGVudC5wdXRFeHRyYShUZXN0U2hlbGxBY3Rpdml0eS5SRVNVTFRfRklMRSwgcmVzdWx0RmlsZSk7CiAgICAgICAgIGludGVudC5wdXRFeHRyYShUZXN0U2hlbGxBY3Rpdml0eS5USU1FT1VUX0lOX01JTExJUywgdGltZW91dCk7CisgICAgICAgIGludGVudC5wdXRFeHRyYShUZXN0U2hlbGxBY3Rpdml0eS5UT1RBTF9URVNUX0NPVU5ULCBtVGVzdENvdW50KTsKKyAgICAgICAgaW50ZW50LnB1dEV4dHJhKFRlc3RTaGVsbEFjdGl2aXR5LkNVUlJFTlRfVEVTVF9OVU1CRVIsIHRlc3ROdW1iZXIpOworICAgICAgICBpbnRlbnQucHV0RXh0cmEoVGVzdFNoZWxsQWN0aXZpdHkuU1RPUF9PTl9SRUZfRVJST1IsIHRydWUpOwogICAgICAgICBhY3Rpdml0eS5zdGFydEFjdGl2aXR5KGludGVudCk7CiAKICAgICAgICAgLy8gV2FpdCB1bnRpbCBkb25lLgpAQCAtMzc1LDggKzM3OSw4IEBACiAgICAgICAgIC8vIFJlYWQgc2V0dGluZ3MKICAgICAgICAgbVRlc3RQYXRoUHJlZml4ID0gKG5ldyBGaWxlKExBWU9VVF9URVNUU19ST09UICsgcnVubmVyLm1UZXN0UGF0aCkpLmdldEFic29sdXRlUGF0aCgpOwogICAgICAgICBtUmViYXNlbGluZVJlc3VsdHMgPSBydW5uZXIubVJlYmFzZWxpbmU7Ci0gICAgICAgIC8vIEpTQyBpcyB0aGUgZGVmYXVsdCBKYXZhU2NyaXB0IGVuZ2luZS4KLSAgICAgICAgbUpzRW5naW5lID0gcnVubmVyLm1Kc0VuZ2luZSA9PSBudWxsID8gImpzYyIgOiBydW5uZXIubUpzRW5naW5lOworICAgICAgICAvLyBWOCBpcyB0aGUgZGVmYXVsdCBKYXZhU2NyaXB0IGVuZ2luZS4KKyAgICAgICAgbUpzRW5naW5lID0gcnVubmVyLm1Kc0VuZ2luZSA9PSBudWxsID8gInY4IiA6IHJ1bm5lci5tSnNFbmdpbmU7CiAKICAgICAgICAgaW50IHRpbWVvdXQgPSBydW5uZXIubVRpbWVvdXRJbk1pbGxpczsKICAgICAgICAgaWYgKHRpbWVvdXQgPD0gMCkgewpAQCAtMzkzLDcgKzM5Nyw3IEBACiAgICAgICAgICAgICByZXN1bWVUZXN0TGlzdCgpOwogCiAgICAgICAgIFRlc3RTaGVsbEFjdGl2aXR5IGFjdGl2aXR5ID0gZ2V0QWN0aXZpdHkoKTsKLSAgICAgICAgYWN0aXZpdHkuc2V0RGVmYXVsdER1bXBEYXRhVHlwZShEdW1wRGF0YVR5cGUuRFVNUF9BU19URVhUKTsKKyAgICAgICAgYWN0aXZpdHkuc2V0RGVmYXVsdER1bXBEYXRhVHlwZShEdW1wRGF0YVR5cGUuRVhUX1JFUFIpOwogCiAgICAgICAgIC8vIFJ1biB0ZXN0cy4KICAgICAgICAgaW50IGFkZHIgPSAtMTsKQEAgLTQxMCw3ICs0MTQsOSBAQAogICAgICAgICAgICAgYm9vbGVhbiBpZ25vcmVSZXN1bHQgPSBtVGVzdExpc3RJZ25vcmVSZXN1bHQuZWxlbWVudEF0KGkpOwogICAgICAgICAgICAgRnNVdGlscy51cGRhdGVUZXN0U3RhdHVzKFRFU1RfU1RBVFVTX0ZJTEUsIHMpOwogICAgICAgICAgICAgLy8gUnVuIHRlc3RzCi0gICAgICAgICAgICBydW5UZXN0QW5kV2FpdFVudGlsRG9uZShhY3Rpdml0eSwgcywgcnVubmVyLm1UaW1lb3V0SW5NaWxsaXMsIGlnbm9yZVJlc3VsdCk7CisgICAgICAgICAgICAvLyBpIGlzIDAgYmFzZWQsIGJ1dCB0ZXN0IGNvdW50IGlzIDEgYmFzZWQgc28gYWRkIDEgdG8gaSBoZXJlLgorICAgICAgICAgICAgcnVuVGVzdEFuZFdhaXRVbnRpbERvbmUoYWN0aXZpdHksIHMsIHJ1bm5lci5tVGltZW91dEluTWlsbGlzLCBpZ25vcmVSZXN1bHQsCisgICAgICAgICAgICAgICAgICAgIGkgKyAxICsgbVJlc3VtZUluZGV4KTsKICAgICAgICAgfQogCiAgICAgICAgIEZzVXRpbHMudXBkYXRlVGVzdFN0YXR1cyhURVNUX1NUQVRVU19GSUxFLCAiI0RPTkUiKTsKQEAgLTQzNSw3ICs0NDEsNyBAQAogICAgICAgICB0cnkgewogICAgICAgICAgICAgRmlsZSB0ZXN0c19saXN0ID0gbmV3IEZpbGUoTEFZT1VUX1RFU1RTX0xJU1RfRklMRSk7CiAgICAgICAgICAgICBCdWZmZXJlZE91dHB1dFN0cmVhbSBib3MgPSBuZXcgQnVmZmVyZWRPdXRwdXRTdHJlYW0obmV3IEZpbGVPdXRwdXRTdHJlYW0odGVzdHNfbGlzdCwgZmFsc2UpKTsKLSAgICAgICAgICAgIEZzVXRpbHMuZmluZExheW91dFRlc3RzUmVjdXJzaXZlbHkoYm9zLCBnZXRUZXN0UGF0aCgpLCBmYWxzZSk7IC8vIERvbid0IGlnbm9yZSByZXN1bHRzCisgICAgICAgICAgICBGc1V0aWxzLndyaXRlTGF5b3V0VGVzdExpc3RSZWN1cnNpdmVseShib3MsIGdldFRlc3RQYXRoKCksIGZhbHNlKTsgLy8gRG9uJ3QgaWdub3JlIHJlc3VsdHMKICAgICAgICAgICAgIGJvcy5mbHVzaCgpOwogICAgICAgICAgICAgYm9zLmNsb3NlKCk7CiAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKZGlmZiAtLWdpdCBhL3Rlc3RzL0R1bXBSZW5kZXJUcmVlL3NyYy9jb20vYW5kcm9pZC9kdW1wcmVuZGVydHJlZS9NZW51LmphdmEgYi90ZXN0cy9EdW1wUmVuZGVyVHJlZS9zcmMvY29tL2FuZHJvaWQvZHVtcHJlbmRlcnRyZWUvTWVudS5qYXZhCmluZGV4IDljNGI1NzI1Ni4uMGIwMGQ2NSAxMDA2NDQKLS0tIGEvdGVzdHMvRHVtcFJlbmRlclRyZWUvc3JjL2NvbS9hbmRyb2lkL2R1bXByZW5kZXJ0cmVlL01lbnUuamF2YQorKysgYi90ZXN0cy9EdW1wUmVuZGVyVHJlZS9zcmMvY29tL2FuZHJvaWQvZHVtcHJlbmRlcnRyZWUvTWVudS5qYXZhCkBAIC01MywyOSArNTMsMzggQEAKICAgICAgICAgaW50ZW50LnNldENsYXNzKHRoaXMsIFRlc3RTaGVsbEFjdGl2aXR5LmNsYXNzKTsKICAgICAgICAgaW50ZW50LmFkZEZsYWdzKEludGVudC5GTEFHX0FDVElWSVRZX1NJTkdMRV9UT1ApOwogICAgICAgICBpbnRlbnQucHV0RXh0cmEoVGVzdFNoZWxsQWN0aXZpdHkuVEVTVF9VUkwsICJmaWxlOi8vIiArIGZpbGVuYW1lKTsKKyAgICAgICAgaW50ZW50LnB1dEV4dHJhKFRlc3RTaGVsbEFjdGl2aXR5LlRPVEFMX1RFU1RfQ09VTlQsIDEpOworICAgICAgICBpbnRlbnQucHV0RXh0cmEoVGVzdFNoZWxsQWN0aXZpdHkuQ1VSUkVOVF9URVNUX05VTUJFUiwgMSk7CiAgICAgICAgIHN0YXJ0QWN0aXZpdHkoaW50ZW50KTsKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKICAgICB2b2lkIHByb2Nlc3NEaXJlY3RvcnkoU3RyaW5nIHBhdGgsIGJvb2xlYW4gc2VsZWN0aW9uKSB7Ci0gICAgICAgIGdlbmVyYXRlVGVzdExpc3QocGF0aCk7CisgICAgICAgIGludCB0ZXN0Q291bnQgPSBnZW5lcmF0ZVRlc3RMaXN0KHBhdGgpOwogICAgICAgICBJbnRlbnQgaW50ZW50ID0gbmV3IEludGVudChJbnRlbnQuQUNUSU9OX1ZJRVcpOwogICAgICAgICBpbnRlbnQuc2V0Q2xhc3ModGhpcywgVGVzdFNoZWxsQWN0aXZpdHkuY2xhc3MpOwogICAgICAgICBpbnRlbnQuYWRkRmxhZ3MoSW50ZW50LkZMQUdfQUNUSVZJVFlfU0lOR0xFX1RPUCk7CiAgICAgICAgIGludGVudC5wdXRFeHRyYShUZXN0U2hlbGxBY3Rpdml0eS5VSV9BVVRPX1RFU1QsIExBWU9VVF9URVNUU19MSVNUX0ZJTEUpOworICAgICAgICBpbnRlbnQucHV0RXh0cmEoVGVzdFNoZWxsQWN0aXZpdHkuVE9UQUxfVEVTVF9DT1VOVCwgdGVzdENvdW50KTsKKyAgICAgICAgLy8gVGVzdFNoZWxsQWN0aXZpdHkgd2lsbCBwcm9jZXNzIHRoaXMgaW50ZW50IG9uY2UgYW5kIGluY3JlbWVudCB0aGUgdGVzdCBpbmRleAorICAgICAgICAvLyBiZWZvcmUgcnVubmluZyB0aGUgZmlyc3QgdGVzdCwgc28gcGFzcyAwIGhlcmUgdG8gYWxsb3cgZm9yIHRoYXQuCisgICAgICAgIGludGVudC5wdXRFeHRyYShUZXN0U2hlbGxBY3Rpdml0eS5DVVJSRU5UX1RFU1RfTlVNQkVSLCAwKTsKICAgICAgICAgc3RhcnRBY3Rpdml0eShpbnRlbnQpOwogICAgIH0KIAotICAgIHByaXZhdGUgdm9pZCBnZW5lcmF0ZVRlc3RMaXN0KFN0cmluZyBwYXRoKSB7CisgICAgcHJpdmF0ZSBpbnQgZ2VuZXJhdGVUZXN0TGlzdChTdHJpbmcgcGF0aCkgeworICAgICAgICBpbnQgdGVzdENvdW50ID0gMDsKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIEZpbGUgdGVzdHNfbGlzdCA9IG5ldyBGaWxlKExBWU9VVF9URVNUU19MSVNUX0ZJTEUpOwogICAgICAgICAgICAgQnVmZmVyZWRPdXRwdXRTdHJlYW0gYm9zID0gbmV3IEJ1ZmZlcmVkT3V0cHV0U3RyZWFtKG5ldyBGaWxlT3V0cHV0U3RyZWFtKHRlc3RzX2xpc3QsIGZhbHNlKSk7Ci0gICAgICAgICAgICBGc1V0aWxzLmZpbmRMYXlvdXRUZXN0c1JlY3Vyc2l2ZWx5KGJvcywgcGF0aCwgZmFsc2UpOyAvLyBEb24ndCBpZ25vcmUgcmVzdWx0cworICAgICAgICAgICAgdGVzdENvdW50ID0gRnNVdGlscy53cml0ZUxheW91dFRlc3RMaXN0UmVjdXJzaXZlbHkoCisgICAgICAgICAgICAgICAgICAgIGJvcywgcGF0aCwgZmFsc2UpOyAvLyBEb24ndCBpZ25vcmUgcmVzdWx0cwogICAgICAgICAgICAgYm9zLmZsdXNoKCk7CiAgICAgICAgICAgICBib3MuY2xvc2UoKTsKICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewogICAgICAgICAgICBMb2cuZShMT0dUQUcsICJFcnJvciB3aGVuIGNyZWF0aW5nIHRlc3QgbGlzdDogIiArIGUuZ2V0TWVzc2FnZSgpKTsKICAgICAgICB9CisgICAgICAgcmV0dXJuIHRlc3RDb3VudDsKICAgICB9CiAKIH0KZGlmZiAtLWdpdCBhL3Rlc3RzL0R1bXBSZW5kZXJUcmVlL3NyYy9jb20vYW5kcm9pZC9kdW1wcmVuZGVydHJlZS9UZXN0U2hlbGxBY3Rpdml0eS5qYXZhIGIvdGVzdHMvRHVtcFJlbmRlclRyZWUvc3JjL2NvbS9hbmRyb2lkL2R1bXByZW5kZXJ0cmVlL1Rlc3RTaGVsbEFjdGl2aXR5LmphdmEKaW5kZXggNzQ3NTcxOS4uNDBhZjhjMCAxMDA2NDQKLS0tIGEvdGVzdHMvRHVtcFJlbmRlclRyZWUvc3JjL2NvbS9hbmRyb2lkL2R1bXByZW5kZXJ0cmVlL1Rlc3RTaGVsbEFjdGl2aXR5LmphdmEKKysrIGIvdGVzdHMvRHVtcFJlbmRlclRyZWUvc3JjL2NvbS9hbmRyb2lkL2R1bXByZW5kZXJ0cmVlL1Rlc3RTaGVsbEFjdGl2aXR5LmphdmEKQEAgLTM1LDYgKzM1LDggQEAKIGltcG9ydCBhbmRyb2lkLm9zLk1lc3NhZ2U7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKIGltcG9ydCBhbmRyb2lkLnZpZXcuVmlld0dyb3VwOworaW1wb3J0IGFuZHJvaWQudmlldy5XaW5kb3c7CitpbXBvcnQgYW5kcm9pZC53ZWJraXQuQ29uc29sZU1lc3NhZ2U7CiBpbXBvcnQgYW5kcm9pZC53ZWJraXQuR2VvbG9jYXRpb25QZXJtaXNzaW9uczsKIGltcG9ydCBhbmRyb2lkLndlYmtpdC5IdHRwQXV0aEhhbmRsZXI7CiBpbXBvcnQgYW5kcm9pZC53ZWJraXQuSnNQcm9tcHRSZXN1bHQ7CkBAIC01NSw2ICs1Nyw3IEBACiBpbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOwogaW1wb3J0IGphdmEubmV0LlVSTDsKIGltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CiBpbXBvcnQgamF2YS51dGlsLk1hcDsKIGltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwogCkBAIC05OSw2ICsxMDIsOCBAQAogICAgICAgICBMb2cudihMT0dUQUcsICJtZXNzYWdlIHNlbnQgdG8gV2ViVmlldyB0byBkdW1wIHRleHQuIik7CiAgICAgICAgIHN3aXRjaCAobUR1bXBEYXRhVHlwZSkgewogICAgICAgICAgICAgY2FzZSBEVU1QX0FTX1RFWFQ6CisgICAgICAgICAgICAgICAgY2FsbGJhY2suYXJnMSA9IG1EdW1wVG9wRnJhbWVBc1RleHQgPyAxIDogMDsKKyAgICAgICAgICAgICAgICBjYWxsYmFjay5hcmcyID0gbUR1bXBDaGlsZEZyYW1lc0FzVGV4dCA/IDEgOiAwOwogICAgICAgICAgICAgICAgIG1XZWJWaWV3LmRvY3VtZW50QXNUZXh0KGNhbGxiYWNrKTsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIGNhc2UgRVhUX1JFUFI6CkBAIC0xMTcsNiArMTIyLDcgQEAKICAgICBAT3ZlcnJpZGUKICAgICBwcm90ZWN0ZWQgdm9pZCBvbkNyZWF0ZShCdW5kbGUgaWNpY2xlKSB7CiAgICAgICAgIHN1cGVyLm9uQ3JlYXRlKGljaWNsZSk7CisgICAgICAgIHJlcXVlc3RXaW5kb3dGZWF0dXJlKFdpbmRvdy5GRUFUVVJFX1BST0dSRVNTKTsKIAogICAgICAgICBMaW5lYXJMYXlvdXQgY29udGVudFZpZXcgPSBuZXcgTGluZWFyTGF5b3V0KHRoaXMpOwogICAgICAgICBjb250ZW50Vmlldy5zZXRPcmllbnRhdGlvbihMaW5lYXJMYXlvdXQuVkVSVElDQUwpOwpAQCAtMTQ1LDYgKzE1MSw5IEBACiAgICAgICAgIGlmIChpbnRlbnQgIT0gbnVsbCkgewogICAgICAgICAgICAgZXhlY3V0ZUludGVudChpbnRlbnQpOwogICAgICAgICB9CisKKyAgICAgICAgLy8gVGhpcyBpcyBhc3luY2hyb25vdXMsIGJ1dCBpdCBnZXRzIHByb2Nlc3NlZCBieSBXZWJDb3JlIGJlZm9yZSBpdCBzdGFydHMgbG9hZGluZyBwYWdlcy4KKyAgICAgICAgbVdlYlZpZXcudXNlTW9ja0RldmljZU9yaWVudGF0aW9uKCk7CiAgICAgfQogCiAgICAgQE92ZXJyaWRlCkBAIC0xNTksNiArMTY4LDkgQEAKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQogCisgICAgICAgIG1Ub3RhbFRlc3RDb3VudCA9IGludGVudC5nZXRJbnRFeHRyYShUT1RBTF9URVNUX0NPVU5ULCBtVG90YWxUZXN0Q291bnQpOworICAgICAgICBtQ3VycmVudFRlc3ROdW1iZXIgPSBpbnRlbnQuZ2V0SW50RXh0cmEoQ1VSUkVOVF9URVNUX05VTUJFUiwgbUN1cnJlbnRUZXN0TnVtYmVyKTsKKwogICAgICAgICBtVGVzdFVybCA9IGludGVudC5nZXRTdHJpbmdFeHRyYShURVNUX1VSTCk7CiAgICAgICAgIGlmIChtVGVzdFVybCA9PSBudWxsKSB7CiAgICAgICAgICAgICBtVWlBdXRvVGVzdFBhdGggPSBpbnRlbnQuZ2V0U3RyaW5nRXh0cmEoVUlfQVVUT19URVNUKTsKQEAgLTE3Miw2ICsxODQsMTEgQEAKICAgICAgICAgbVRpbWVvdXRJbk1pbGxpcyA9IGludGVudC5nZXRJbnRFeHRyYShUSU1FT1VUX0lOX01JTExJUywgMCk7CiAgICAgICAgIG1HZXREcmF3dGltZSA9IGludGVudC5nZXRCb29sZWFuRXh0cmEoR0VUX0RSQVdfVElNRSwgZmFsc2UpOwogICAgICAgICBtU2F2ZUltYWdlUGF0aCA9IGludGVudC5nZXRTdHJpbmdFeHRyYShTQVZFX0lNQUdFKTsKKyAgICAgICAgbVN0b3BPblJlZkVycm9yID0gaW50ZW50LmdldEJvb2xlYW5FeHRyYShTVE9QX09OX1JFRl9FUlJPUiwgZmFsc2UpOworICAgICAgICBzZXRUaXRsZSgiVGVzdCAiICsgbUN1cnJlbnRUZXN0TnVtYmVyICsgIiBvZiAiICsgbVRvdGFsVGVzdENvdW50KTsKKyAgICAgICAgZmxvYXQgcmF0aW8gPSAoZmxvYXQpbUN1cnJlbnRUZXN0TnVtYmVyIC8gbVRvdGFsVGVzdENvdW50OworICAgICAgICBpbnQgcHJvZ3Jlc3MgPSAoaW50KShyYXRpbyAqIFdpbmRvdy5QUk9HUkVTU19FTkQpOworICAgICAgICBnZXRXaW5kb3coKS5zZXRGZWF0dXJlSW50KFdpbmRvdy5GRUFUVVJFX1BST0dSRVNTLCBwcm9ncmVzcyk7CiAKICAgICAgICAgTG9nLnYoTE9HVEFHLCAiICBMb2FkaW5nICIgKyBtVGVzdFVybCk7CiAgICAgICAgIG1XZWJWaWV3LmxvYWRVcmwobVRlc3RVcmwpOwpAQCAtMjM3LDYgKzI1NCw3IEBACiAgICAgICAgIEludGVudCBpbnRlbnQgPSBuZXcgSW50ZW50KEludGVudC5BQ1RJT05fVklFVyk7CiAgICAgICAgIGludGVudC5hZGRGbGFncyhJbnRlbnQuRkxBR19BQ1RJVklUWV9TSU5HTEVfVE9QKTsKICAgICAgICAgaW50ZW50LnB1dEV4dHJhKFRlc3RTaGVsbEFjdGl2aXR5LlRFU1RfVVJMLCBGc1V0aWxzLmdldFRlc3RVcmwodXJsKSk7CisgICAgICAgIGludGVudC5wdXRFeHRyYShUZXN0U2hlbGxBY3Rpdml0eS5DVVJSRU5UX1RFU1RfTlVNQkVSLCArK21DdXJyZW50VGVzdE51bWJlcik7CiAgICAgICAgIGludGVudC5wdXRFeHRyYShUSU1FT1VUX0lOX01JTExJUywgMTAwMDApOwogICAgICAgICBleGVjdXRlSW50ZW50KGludGVudCk7CiAgICAgfQpAQCAtMzI5LDE0ICszNDcsMjkgQEAKIAogICAgIC8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLgogICAgIC8vIExheW91dFRlc3RDb250cm9sbGVyIEZ1bmN0aW9ucwotICAgIHB1YmxpYyB2b2lkIGR1bXBBc1RleHQoKSB7CisgICAgcHVibGljIHZvaWQgZHVtcEFzVGV4dChib29sZWFuIGVuYWJsZVBpeGVsVGVzdHMpIHsKKyAgICAgICAgLy8gQWRkZWQgYWZ0ZXIgd2Via2l0IHVwZGF0ZSB0byByNjM4NTkuIFNlZSB0cmFjLndlYmtpdC5vcmcvY2hhbmdlc2V0LzYzNzMwLgorICAgICAgICBpZiAoZW5hYmxlUGl4ZWxUZXN0cykgeworICAgICAgICAgICAgTG9nLnYoTE9HVEFHLCAiZHVtcEFzVGV4dChlbmFibGVQaXhlbFRlc3RzID09IHRydWUpIG5vdCBpbXBsZW1lbnRlZCBvbiBBbmRyb2lkISIpOworICAgICAgICB9CisKICAgICAgICAgbUR1bXBEYXRhVHlwZSA9IER1bXBEYXRhVHlwZS5EVU1QX0FTX1RFWFQ7CisgICAgICAgIG1EdW1wVG9wRnJhbWVBc1RleHQgPSB0cnVlOwogICAgICAgICBpZiAobVdlYlZpZXcgIT0gbnVsbCkgewogICAgICAgICAgICAgU3RyaW5nIHVybCA9IG1XZWJWaWV3LmdldFVybCgpOwogICAgICAgICAgICAgTG9nLnYoTE9HVEFHLCAiZHVtcEFzVGV4dCBjYWxsZWQ6ICIrdXJsKTsKICAgICAgICAgfQogICAgIH0KIAorICAgIHB1YmxpYyB2b2lkIGR1bXBDaGlsZEZyYW1lc0FzVGV4dCgpIHsKKyAgICAgICAgbUR1bXBEYXRhVHlwZSA9IER1bXBEYXRhVHlwZS5EVU1QX0FTX1RFWFQ7CisgICAgICAgIG1EdW1wQ2hpbGRGcmFtZXNBc1RleHQgPSB0cnVlOworICAgICAgICBpZiAobVdlYlZpZXcgIT0gbnVsbCkgeworICAgICAgICAgICAgU3RyaW5nIHVybCA9IG1XZWJWaWV3LmdldFVybCgpOworICAgICAgICAgICAgTG9nLnYoTE9HVEFHLCAiZHVtcENoaWxkRnJhbWVzQXNUZXh0IGNhbGxlZDogIit1cmwpOworICAgICAgICB9CisgICAgfQorCiAgICAgcHVibGljIHZvaWQgd2FpdFVudGlsRG9uZSgpIHsKICAgICAgICAgbVdhaXRVbnRpbERvbmUgPSB0cnVlOwogICAgICAgICBTdHJpbmcgdXJsID0gbVdlYlZpZXcuZ2V0VXJsKCk7CkBAIC0zNDgsNyArMzgxLDkgQEAKICAgICAgICAgTG9nLnYoTE9HVEFHLCAibm90aWZ5RG9uZSBjYWxsZWQ6ICIgKyB1cmwpOwogICAgICAgICBpZiAobVdhaXRVbnRpbERvbmUpIHsKICAgICAgICAgICAgIG1XYWl0VW50aWxEb25lID0gZmFsc2U7Ci0gICAgICAgICAgICBtQ2hyb21lQ2xpZW50Lm9uUHJvZ3Jlc3NDaGFuZ2VkKG1XZWJWaWV3LCAxMDEpOworICAgICAgICAgICAgaWYgKCFtUmVxdWVzdGVkV2ViS2l0RGF0YSAmJiAhbVRpbWVkT3V0ICYmICFmaW5pc2hlZCgpKSB7CisgICAgICAgICAgICAgICAgcmVxdWVzdFdlYktpdERhdGEoKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KIApAQCAtNDU5LDggKzQ5NCwyNSBAQAogICAgICAqIFNldHMgdGhlIEdlb2xvY2F0aW9uIHBlcm1pc3Npb24gc3RhdGUgdG8gYmUgdXNlZCBmb3IgYWxsIGZ1dHVyZSByZXF1ZXN0cy4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXRHZW9sb2NhdGlvblBlcm1pc3Npb24oYm9vbGVhbiBhbGxvdykgewotICAgICAgICBtR2VvbG9jYXRpb25QZXJtaXNzaW9uU2V0ID0gdHJ1ZTsKKyAgICAgICAgbUlzR2VvbG9jYXRpb25QZXJtaXNzaW9uU2V0ID0gdHJ1ZTsKICAgICAgICAgbUdlb2xvY2F0aW9uUGVybWlzc2lvbiA9IGFsbG93OworCisgICAgICAgIGlmIChtUGVuZGluZ0dlb2xvY2F0aW9uUGVybWlzc2lvbkNhbGxiYWNrcyAhPSBudWxsKSB7CisgICAgICAgICAgICBJdGVyYXRvciBpdGVyID0gbVBlbmRpbmdHZW9sb2NhdGlvblBlcm1pc3Npb25DYWxsYmFja3Mua2V5U2V0KCkuaXRlcmF0b3IoKTsKKyAgICAgICAgICAgIHdoaWxlIChpdGVyLmhhc05leHQoKSkgeworICAgICAgICAgICAgICAgIEdlb2xvY2F0aW9uUGVybWlzc2lvbnMuQ2FsbGJhY2sgY2FsbGJhY2sgPQorICAgICAgICAgICAgICAgICAgICAgICAgKEdlb2xvY2F0aW9uUGVybWlzc2lvbnMuQ2FsbGJhY2spIGl0ZXIubmV4dCgpOworICAgICAgICAgICAgICAgIFN0cmluZyBvcmlnaW4gPSAoU3RyaW5nKSBtUGVuZGluZ0dlb2xvY2F0aW9uUGVybWlzc2lvbkNhbGxiYWNrcy5nZXQoY2FsbGJhY2spOworICAgICAgICAgICAgICAgIGNhbGxiYWNrLmludm9rZShvcmlnaW4sIG1HZW9sb2NhdGlvblBlcm1pc3Npb24sIGZhbHNlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1QZW5kaW5nR2VvbG9jYXRpb25QZXJtaXNzaW9uQ2FsbGJhY2tzID0gbnVsbDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldE1vY2tEZXZpY2VPcmllbnRhdGlvbihib29sZWFuIGNhblByb3ZpZGVBbHBoYSwgZG91YmxlIGFscGhhLAorICAgICAgICAgICAgYm9vbGVhbiBjYW5Qcm92aWRlQmV0YSwgZG91YmxlIGJldGEsIGJvb2xlYW4gY2FuUHJvdmlkZUdhbW1hLCBkb3VibGUgZ2FtbWEpIHsKKyAgICAgICAgbVdlYlZpZXcuc2V0TW9ja0RldmljZU9yaWVudGF0aW9uKGNhblByb3ZpZGVBbHBoYSwgYWxwaGEsIGNhblByb3ZpZGVCZXRhLCBiZXRhLAorICAgICAgICAgICAgICAgIGNhblByb3ZpZGVHYW1tYSwgZ2FtbWEpOwogICAgIH0KIAogICAgIHB1YmxpYyB2b2lkIG92ZXJyaWRlUHJlZmVyZW5jZShTdHJpbmcga2V5LCBib29sZWFuIHZhbHVlKSB7CkBAIC00NzMsNiArNTI1LDEwIEBACiAgICAgICAgIH0KICAgICB9CiAKKyAgICBwdWJsaWMgdm9pZCBzZXRYU1NBdWRpdG9yRW5hYmxlZCAoYm9vbGVhbiBmbGFnKSB7CisgICAgICAgIG1XZWJWaWV3LmdldFNldHRpbmdzKCkuc2V0WFNTQXVkaXRvckVuYWJsZWQoZmxhZyk7CisgICAgfQorCiAgICAgcHJpdmF0ZSBmaW5hbCBXZWJWaWV3Q2xpZW50IG1WaWV3Q2xpZW50ID0gbmV3IFdlYlZpZXdDbGllbnQoKXsKICAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgIHB1YmxpYyB2b2lkIG9uUGFnZUZpbmlzaGVkKFdlYlZpZXcgdmlldywgU3RyaW5nIHVybCkgewpAQCAtNDkwLDExICs1NDYsMzAgQEAKICAgICAgICAgICAgICAgICAgICAgZHJhd1BhZ2VUb0ZpbGUobVNhdmVJbWFnZVBhdGggKyAiLyIgKyBuYW1lICsgIi5wbmciLCBtV2ViVmlldyk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQorCiAgICAgICAgICAgICAvLyBDYWxsaW5nIGZpbmlzaGVkKCkgd2lsbCBjaGVjayBpZiB3ZSd2ZSBtZXQgYWxsIHRoZSBjb25kaXRpb25zIGZvciBjb21wbGV0aW5nCi0gICAgICAgICAgICAvLyB0aGlzIHRlc3QgYW5kIG1vdmUgdG8gdGhlIG5leHQgb25lIGlmIHdlIGFyZSByZWFkeS4KKyAgICAgICAgICAgIC8vIHRoaXMgdGVzdCBhbmQgbW92ZSB0byB0aGUgbmV4dCBvbmUgaWYgd2UgYXJlIHJlYWR5LiBPdGhlcndpc2Ugd2UgYXNrIFdlYkNvcmUgdG8KKyAgICAgICAgICAgIC8vIGR1bXAgdGhlIHBhZ2UuCiAgICAgICAgICAgICBpZiAoZmluaXNoZWQoKSkgewogICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCFtV2FpdFVudGlsRG9uZSAmJiAhbVJlcXVlc3RlZFdlYktpdERhdGEgJiYgIW1UaW1lZE91dCkgeworICAgICAgICAgICAgICAgIHJlcXVlc3RXZWJLaXREYXRhKCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGlmIChtV2FpdFVudGlsRG9uZSkgeworICAgICAgICAgICAgICAgICAgICBMb2cudihMT0dUQUcsICJwYWdlIGZpbmlzaGVkIGxvYWRpbmcgYnV0IHdhaXRpbmcgZm9yIG5vdGlmeURvbmUgdG8gYmUgY2FsbGVkOiAiICsgdXJsKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAobVJlcXVlc3RlZFdlYktpdERhdGEpIHsKKyAgICAgICAgICAgICAgICAgICAgTG9nLnYoTE9HVEFHLCAicGFnZSBmaW5pc2hlZCBsb2FkaW5nIGJ1dCB3ZWJraXQgZGF0YSBoYXMgYWxyZWFkeSBiZWVuIHJlcXVlc3RlZDogIiArIHVybCk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKG1UaW1lZE91dCkgeworICAgICAgICAgICAgICAgICAgICBMb2cudihMT0dUQUcsICJwYWdlIGZpbmlzaGVkIGxvYWRpbmcgYnV0IGFscmVhZHkgdGltZWQgb3V0OiAiICsgdXJsKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKICAgICAgICAgICAgIHN1cGVyLm9uUGFnZUZpbmlzaGVkKHZpZXcsIHVybCk7CiAgICAgICAgIH0KIApAQCAtNTM2LDQ0ICs2MTEsOCBAQAogCiAgICAgcHJpdmF0ZSBmaW5hbCBXZWJDaHJvbWVDbGllbnQgbUNocm9tZUNsaWVudCA9IG5ldyBXZWJDaHJvbWVDbGllbnQoKSB7CiAgICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvblByb2dyZXNzQ2hhbmdlZChXZWJWaWV3IHZpZXcsIGludCBuZXdQcm9ncmVzcykgewotCi0gICAgICAgICAgICAvLyBub3RpZnlEb25lIGNhbGxzIHRoaXMgd2l0aCAxMDElLiBXZSBvbmx5IHdhbnQgdG8gdXBkYXRlIHRoaXMgZmxhZyBpZiB0aGlzCi0gICAgICAgICAgICAvLyBpcyB0aGUgcmVhbCBjYWxsIGZyb20gV2ViQ29yZS4KLSAgICAgICAgICAgIGlmIChuZXdQcm9ncmVzcyA9PSAxMDApIHsKLSAgICAgICAgICAgICAgICBtT25lSHVuZHJlZFBlcmNlbnRDb21wbGV0ZSA9IHRydWU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIFdpdGggdGhlIGZsYWcgdXBkYXRlZCwgd2UgY2FuIG5vdyBwcm9jZWVkIGFzIG5vcm1hbCB3aGV0aGVyIHRoZSBwcm9ncmVzcyB1cGRhdGUgY2FtZSBmcm9tCi0gICAgICAgICAgICAvLyBXZWJDb3JlIG9yIG5vdGlmeURvbmUuCi0gICAgICAgICAgICBpZiAobmV3UHJvZ3Jlc3MgPj0gMTAwKSB7Ci0gICAgICAgICAgICAgICAgLy8gZmluaXNoZWQoKSB3aWxsIGNoZWNrIGlmIHdlIGFyZSByZWFkeSB0byBtb3ZlIHRvIHRoZSBuZXh0IHRlc3QgYW5kIGRvIHNvIGlmIHdlIGFyZS4KLSAgICAgICAgICAgICAgICBpZiAoZmluaXNoZWQoKSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKCFtVGltZWRPdXQgJiYgIW1XYWl0VW50aWxEb25lICYmICFtUmVxdWVzdGVkV2ViS2l0RGF0YSkgewotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgdXJsID0gbVdlYlZpZXcuZ2V0VXJsKCk7Ci0gICAgICAgICAgICAgICAgICAgIExvZy52KExPR1RBRywgIkZpbmlzaGVkOiAiKyB1cmwpOwotICAgICAgICAgICAgICAgICAgICByZXF1ZXN0V2ViS2l0RGF0YSgpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyB1cmwgPSBtV2ViVmlldy5nZXRVcmwoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1UaW1lZE91dCkgewotICAgICAgICAgICAgICAgICAgICAgICAgTG9nLnYoTE9HVEFHLCAiVGltZWQgb3V0IGJlZm9yZSBmaW5pc2hpbmc6ICIgKyB1cmwpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG1XYWl0VW50aWxEb25lKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBMb2cudihMT0dUQUcsICJXYWl0aW5nIGZvciBub3RpZnlEb25lOiAiICsgdXJsKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChtUmVxdWVzdGVkV2ViS2l0RGF0YSkgewotICAgICAgICAgICAgICAgICAgICAgICAgTG9nLnYoTE9HVEFHLCAiUmVxdWVzdGVkIHdlYmtpdCBkYXRhIHJlYWR5OiAiICsgdXJsKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQogICAgICAgICBwdWJsaWMgdm9pZCBvblJlY2VpdmVkVGl0bGUoV2ViVmlldyB2aWV3LCBTdHJpbmcgdGl0bGUpIHsKLSAgICAgICAgICAgIGlmICh0aXRsZS5sZW5ndGgoKSA+IDMwKQotICAgICAgICAgICAgICAgIHRpdGxlID0gIi4uLiIrdGl0bGUuc3Vic3RyaW5nKHRpdGxlLmxlbmd0aCgpLTMwKTsKLSAgICAgICAgICAgIHNldFRpdGxlKHRpdGxlKTsKKyAgICAgICAgICAgIHNldFRpdGxlKCJUZXN0ICIgKyBtQ3VycmVudFRlc3ROdW1iZXIgKyAiIG9mICIgKyBtVG90YWxUZXN0Q291bnQgKyAiOiAiKyB0aXRsZSk7CiAgICAgICAgICAgICBpZiAobUR1bXBUaXRsZUNoYW5nZXMpIHsKICAgICAgICAgICAgICAgICBtVGl0bGVDaGFuZ2VzLmFwcGVuZCgiVElUTEUgQ0hBTkdFRDogIik7CiAgICAgICAgICAgICAgICAgbVRpdGxlQ2hhbmdlcy5hcHBlbmQodGl0bGUpOwpAQCAtNjcwLDIxICs3MDksNDAgQEAKICAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgIHB1YmxpYyB2b2lkIG9uR2VvbG9jYXRpb25QZXJtaXNzaW9uc1Nob3dQcm9tcHQoU3RyaW5nIG9yaWdpbiwKICAgICAgICAgICAgICAgICBHZW9sb2NhdGlvblBlcm1pc3Npb25zLkNhbGxiYWNrIGNhbGxiYWNrKSB7Ci0gICAgICAgICAgICBpZiAobUdlb2xvY2F0aW9uUGVybWlzc2lvblNldCkgeworICAgICAgICAgICAgaWYgKG1Jc0dlb2xvY2F0aW9uUGVybWlzc2lvblNldCkgewogICAgICAgICAgICAgICAgIGNhbGxiYWNrLmludm9rZShvcmlnaW4sIG1HZW9sb2NhdGlvblBlcm1pc3Npb24sIGZhbHNlKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobVBlbmRpbmdHZW9sb2NhdGlvblBlcm1pc3Npb25DYWxsYmFja3MgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG1QZW5kaW5nR2VvbG9jYXRpb25QZXJtaXNzaW9uQ2FsbGJhY2tzID0KKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBIYXNoTWFwPEdlb2xvY2F0aW9uUGVybWlzc2lvbnMuQ2FsbGJhY2ssIFN0cmluZz4oKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1QZW5kaW5nR2VvbG9jYXRpb25QZXJtaXNzaW9uQ2FsbGJhY2tzLnB1dChjYWxsYmFjaywgb3JpZ2luKTsKICAgICAgICAgfQogCiAgICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvbkNvbnNvbGVNZXNzYWdlKFN0cmluZyBtZXNzYWdlLCBpbnQgbGluZU51bWJlciwKLSAgICAgICAgICAgICAgICBTdHJpbmcgc291cmNlSUQpIHsKKyAgICAgICAgcHVibGljIGJvb2xlYW4gb25Db25zb2xlTWVzc2FnZShDb25zb2xlTWVzc2FnZSBjb25zb2xlTWVzc2FnZSkgeworICAgICAgICAgICAgU3RyaW5nIG1zZyA9ICJDT05TT0xFIE1FU1NBR0U6IGxpbmUgIiArIGNvbnNvbGVNZXNzYWdlLmxpbmVOdW1iZXIoKSArICI6ICIKKyAgICAgICAgICAgICAgICAgICAgKyBjb25zb2xlTWVzc2FnZS5tZXNzYWdlKCkgKyAiXG4iOwogICAgICAgICAgICAgaWYgKG1Db25zb2xlTWVzc2FnZXMgPT0gbnVsbCkgewogICAgICAgICAgICAgICAgIG1Db25zb2xlTWVzc2FnZXMgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBTdHJpbmcgY29uc29sZU1lc3NhZ2UgPSAiQ09OU09MRSBNRVNTQUdFOiBsaW5lICIKLSAgICAgICAgICAgICAgICAgICAgKyBsaW5lTnVtYmVyICsiOiAiKyBtZXNzYWdlICsiXG4iOwotICAgICAgICAgICAgbUNvbnNvbGVNZXNzYWdlcy5hcHBlbmQoY29uc29sZU1lc3NhZ2UpOwotICAgICAgICAgICAgTG9nLnYoTE9HVEFHLCAiTE9HOiAiK2NvbnNvbGVNZXNzYWdlKTsKKyAgICAgICAgICAgIG1Db25zb2xlTWVzc2FnZXMuYXBwZW5kKG1zZyk7CisgICAgICAgICAgICBMb2cudihMT0dUQUcsICJMT0c6ICIgKyBtc2cpOworICAgICAgICAgICAgLy8gdGhlIHJhdGlvbmFsZSBoZXJlIGlzIHRoYXQgaWYgdGhlcmUncyBhbiBlcnJvciBvZiBlaXRoZXIgdHlwZSwgYW5kIHRoZSB0ZXN0IHdhcworICAgICAgICAgICAgLy8gd2FpdGluZyBmb3IgIm5vdGlmeURvbmUiIHNpZ25hbCB0byBmaW5pc2gsIHRoZW4gdGhlcmUncyBubyBwb2ludCBpbiB3YWl0aW5nCisgICAgICAgICAgICAvLyBhbnltb3JlIGJlY2F1c2UgdGhlIEpTIGV4ZWN1dGlvbiBpcyBhbHJlYWR5IHRlcm1pbmF0ZWQgYXQgdGhpcyBwb2ludCBhbmQgYQorICAgICAgICAgICAgLy8gIm5vdGlmeURvbmUiIHdpbGwgbmV2ZXIgY29tZSBvdXQgc28gaXQncyBqdXN0IHdhc3RpbmcgdGltZSB0aWxsIHRpbWVvdXQga2lja3MgaW4KKyAgICAgICAgICAgIGlmICgobXNnLmNvbnRhaW5zKCJVbmNhdWdodCBSZWZlcmVuY2VFcnJvcjoiKSB8fCBtc2cuY29udGFpbnMoIlVuY2F1Z2h0IFR5cGVFcnJvcjoiKSkKKyAgICAgICAgICAgICAgICAgICAgJiYgbVdhaXRVbnRpbERvbmUgJiYgbVN0b3BPblJlZkVycm9yKSB7CisgICAgICAgICAgICAgICAgTG9nLncoTE9HVEFHLCAiVGVybWluYXRpbmcgdGVzdCBjYXNlIG9uIHVuY2F1Z2h0IFJlZmVyZW5jZUVycm9yIG9yIFR5cGVFcnJvci4iKTsKKyAgICAgICAgICAgICAgICBtSGFuZGxlci5wb3N0RGVsYXllZChuZXcgUnVubmFibGUoKSB7CisgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5vdGlmeURvbmUoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0sIDUwMCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgfQogCiAgICAgICAgIEBPdmVycmlkZQpAQCAtNzIzLDEzICs3ODEsMTUgQEAKIAogICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIE5ld1dpbmRvd1dlYlZpZXcgZXh0ZW5kcyBXZWJWaWV3IHsKICAgICAgICAgcHVibGljIE5ld1dpbmRvd1dlYlZpZXcoQ29udGV4dCBjb250ZXh0LCBNYXA8U3RyaW5nLCBPYmplY3Q+IGpzSWZhY2VzKSB7Ci0gICAgICAgICAgICBzdXBlcihjb250ZXh0LCBudWxsLCAwLCBqc0lmYWNlcyk7CisgICAgICAgICAgICBzdXBlcihjb250ZXh0LCBudWxsLCAwLCBqc0lmYWNlcywgZmFsc2UpOwogICAgICAgICB9CiAgICAgfQogCiAgICAgcHJpdmF0ZSB2b2lkIHJlc2V0VGVzdFN0YXR1cygpIHsKICAgICAgICAgbVdhaXRVbnRpbERvbmUgPSBmYWxzZTsKICAgICAgICAgbUR1bXBEYXRhVHlwZSA9IG1EZWZhdWx0RHVtcERhdGFUeXBlOworICAgICAgICBtRHVtcFRvcEZyYW1lQXNUZXh0ID0gZmFsc2U7CisgICAgICAgIG1EdW1wQ2hpbGRGcmFtZXNBc1RleHQgPSBmYWxzZTsKICAgICAgICAgbVRpbWVkT3V0ID0gZmFsc2U7CiAgICAgICAgIG1EdW1wVGl0bGVDaGFuZ2VzID0gZmFsc2U7CiAgICAgICAgIG1SZXF1ZXN0ZWRXZWJLaXREYXRhID0gZmFsc2U7CkBAIC03MzksMTAgKzc5OSwxMiBAQAogICAgICAgICBtRXZlbnRTZW5kZXIuY2xlYXJUb3VjaFBvaW50cygpOwogICAgICAgICBtRXZlbnRTZW5kZXIuY2xlYXJUb3VjaE1ldGFTdGF0ZSgpOwogICAgICAgICBtUGFnZUZpbmlzaGVkID0gZmFsc2U7Ci0gICAgICAgIG1PbmVIdW5kcmVkUGVyY2VudENvbXBsZXRlID0gZmFsc2U7CiAgICAgICAgIG1EdW1wV2ViS2l0RGF0YSA9IGZhbHNlOwogICAgICAgICBtR2V0RHJhd3RpbWUgPSBmYWxzZTsKICAgICAgICAgbVNhdmVJbWFnZVBhdGggPSBudWxsOworICAgICAgICBzZXREZWZhdWx0V2ViU2V0dGluZ3MobVdlYlZpZXcpOworICAgICAgICBtSXNHZW9sb2NhdGlvblBlcm1pc3Npb25TZXQgPSBmYWxzZTsKKyAgICAgICAgbVBlbmRpbmdHZW9sb2NhdGlvblBlcm1pc3Npb25DYWxsYmFja3MgPSBudWxsOwogICAgIH0KIAogICAgIHByaXZhdGUgbG9uZ1tdIGdldERyYXdXZWJWaWV3VGltZShXZWJWaWV3IHZpZXcsIGludCBjb3VudCkgewpAQCAtNzc5LDcgKzg0MSw3IEBACiAgICAgfQogCiAgICAgcHJpdmF0ZSBib29sZWFuIGNhbk1vdmVUb05leHRUZXN0KCkgewotICAgICAgICByZXR1cm4gKG1EdW1wV2ViS2l0RGF0YSAmJiBtT25lSHVuZHJlZFBlcmNlbnRDb21wbGV0ZSAmJiBtUGFnZUZpbmlzaGVkICYmICFtV2FpdFVudGlsRG9uZSkgfHwgbVRpbWVkT3V0OworICAgICAgICByZXR1cm4gKG1EdW1wV2ViS2l0RGF0YSAmJiBtUGFnZUZpbmlzaGVkICYmICFtV2FpdFVudGlsRG9uZSkgfHwgbVRpbWVkT3V0OwogICAgIH0KIAogICAgIHByaXZhdGUgdm9pZCBzZXR1cFdlYlZpZXdGb3JMYXlvdXRUZXN0cyhXZWJWaWV3IHdlYnZpZXcsIENhbGxiYWNrUHJveHkgY2FsbGJhY2tQcm94eSkgewpAQCAtNzg3LDYgKzg0OSwxOSBAQAogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CiAKKyAgICAgICAgc2V0RGVmYXVsdFdlYlNldHRpbmdzKHdlYnZpZXcpOworCisgICAgICAgIHdlYnZpZXcuc2V0V2ViQ2hyb21lQ2xpZW50KG1DaHJvbWVDbGllbnQpOworICAgICAgICB3ZWJ2aWV3LnNldFdlYlZpZXdDbGllbnQobVZpZXdDbGllbnQpOworICAgICAgICAvLyBTZXR0aW5nIGEgdG91Y2ggaW50ZXJ2YWwgb2YgLTEgZWZmZWN0aXZlbHkgZGlzYWJsZXMgdGhlIG9wdGltaXNhdGlvbiBpbiBXZWJWaWV3CisgICAgICAgIC8vIHRoYXQgc3RvcHMgcmVwZWF0ZWQgdG91Y2ggZXZlbnRzIGZsb29kaW5nIFdlYkNvcmUuIFRoZSBFdmVudCBTZW5kZXIgb25seSBzZW5kcyBhCisgICAgICAgIC8vIHNpbmdsZSBldmVudCByYXRoZXIgdGhhbiBhIHN0cmVhbSBvZiBldmVudHMgKGxpa2Ugd2hhdCB3b3VsZCBnZW5lcmFsbHkgaGFwcGVuIGluCisgICAgICAgIC8vIGEgcmVhbCB1c2Ugb2YgdG91Y2ggZXZlbnRzIGluIGEgV2ViVmlldykgIGFuZCBzbyBpZiB0aGUgV2ViVmlldyBkcm9wcyB0aGUgZXZlbnQsCisgICAgICAgIC8vIHRoZSB0ZXN0IHdpbGwgZmFpbCBhcyB0aGUgdGVzdCBleHBlY3RzIG9uZSBjYWxsYmFjayBmb3IgZXZlcnkgdG91Y2ggaXQgc3ludGhlc2l6ZXMuCisgICAgICAgIHdlYnZpZXcuc2V0VG91Y2hJbnRlcnZhbCgtMSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0RGVmYXVsdFdlYlNldHRpbmdzKFdlYlZpZXcgd2VidmlldykgewogICAgICAgICBXZWJTZXR0aW5ncyBzZXR0aW5ncyA9IHdlYnZpZXcuZ2V0U2V0dGluZ3MoKTsKICAgICAgICAgc2V0dGluZ3Muc2V0QXBwQ2FjaGVFbmFibGVkKHRydWUpOwogICAgICAgICBzZXR0aW5ncy5zZXRBcHBDYWNoZVBhdGgoZ2V0QXBwbGljYXRpb25Db250ZXh0KCkuZ2V0Q2FjaGVEaXIoKS5nZXRQYXRoKCkpOwpAQCAtNzk5LDE1ICs4NzQsNyBAQAogICAgICAgICBzZXR0aW5ncy5zZXREYXRhYmFzZVBhdGgoZ2V0RGlyKCJkYXRhYmFzZXMiLDApLmdldEFic29sdXRlUGF0aCgpKTsKICAgICAgICAgc2V0dGluZ3Muc2V0RG9tU3RvcmFnZUVuYWJsZWQodHJ1ZSk7CiAgICAgICAgIHNldHRpbmdzLnNldFdvcmtlcnNFbmFibGVkKGZhbHNlKTsKLQotICAgICAgICB3ZWJ2aWV3LnNldFdlYkNocm9tZUNsaWVudChtQ2hyb21lQ2xpZW50KTsKLSAgICAgICAgd2Vidmlldy5zZXRXZWJWaWV3Q2xpZW50KG1WaWV3Q2xpZW50KTsKLSAgICAgICAgLy8gU2V0dGluZyBhIHRvdWNoIGludGVydmFsIG9mIC0xIGVmZmVjdGl2ZWx5IGRpc2FibGVzIHRoZSBvcHRpbWlzYXRpb24gaW4gV2ViVmlldwotICAgICAgICAvLyB0aGF0IHN0b3BzIHJlcGVhdGVkIHRvdWNoIGV2ZW50cyBmbG9vZGluZyBXZWJDb3JlLiBUaGUgRXZlbnQgU2VuZGVyIG9ubHkgc2VuZHMgYQotICAgICAgICAvLyBzaW5nbGUgZXZlbnQgcmF0aGVyIHRoYW4gYSBzdHJlYW0gb2YgZXZlbnRzIChsaWtlIHdoYXQgd291bGQgZ2VuZXJhbGx5IGhhcHBlbiBpbgotICAgICAgICAvLyBhIHJlYWwgdXNlIG9mIHRvdWNoIGV2ZW50cyBpbiBhIFdlYlZpZXcpICBhbmQgc28gaWYgdGhlIFdlYlZpZXcgZHJvcHMgdGhlIGV2ZW50LAotICAgICAgICAvLyB0aGUgdGVzdCB3aWxsIGZhaWwgYXMgdGhlIHRlc3QgZXhwZWN0cyBvbmUgY2FsbGJhY2sgZm9yIGV2ZXJ5IHRvdWNoIGl0IHN5bnRoZXNpemVzLgotICAgICAgICB3ZWJ2aWV3LnNldFRvdWNoSW50ZXJ2YWwoLTEpOworICAgICAgICBzZXR0aW5ncy5zZXRYU1NBdWRpdG9yRW5hYmxlZChmYWxzZSk7CiAgICAgfQogCiAgICAgcHJpdmF0ZSBXZWJWaWV3IG1XZWJWaWV3OwpAQCAtODI0LDYgKzg5MSw5IEBACiAgICAgcHJpdmF0ZSBTdHJpbmcgbVNhdmVJbWFnZVBhdGg7CiAgICAgcHJpdmF0ZSBCdWZmZXJlZFJlYWRlciBtVGVzdExpc3RSZWFkZXI7CiAgICAgcHJpdmF0ZSBib29sZWFuIG1HZXREcmF3dGltZTsKKyAgICBwcml2YXRlIGludCBtVG90YWxUZXN0Q291bnQ7CisgICAgcHJpdmF0ZSBpbnQgbUN1cnJlbnRUZXN0TnVtYmVyOworICAgIHByaXZhdGUgYm9vbGVhbiBtU3RvcE9uUmVmRXJyb3I7CiAKICAgICAvLyBTdGF0ZXMKICAgICBwcml2YXRlIGJvb2xlYW4gbVRpbWVkT3V0OwpAQCAtODMzLDYgKzkwMyw4IEBACiAgICAgLy8gTGF5b3V0IHRlc3QgY29udHJvbGxlciB2YXJpYWJsZXMuCiAgICAgcHJpdmF0ZSBEdW1wRGF0YVR5cGUgbUR1bXBEYXRhVHlwZTsKICAgICBwcml2YXRlIER1bXBEYXRhVHlwZSBtRGVmYXVsdER1bXBEYXRhVHlwZSA9IER1bXBEYXRhVHlwZS5FWFRfUkVQUjsKKyAgICBwcml2YXRlIGJvb2xlYW4gbUR1bXBUb3BGcmFtZUFzVGV4dDsKKyAgICBwcml2YXRlIGJvb2xlYW4gbUR1bXBDaGlsZEZyYW1lc0FzVGV4dDsKICAgICBwcml2YXRlIGJvb2xlYW4gbVdhaXRVbnRpbERvbmU7CiAgICAgcHJpdmF0ZSBib29sZWFuIG1EdW1wVGl0bGVDaGFuZ2VzOwogICAgIHByaXZhdGUgU3RyaW5nQnVmZmVyIG1UaXRsZUNoYW5nZXM7CkBAIC04NDYsNyArOTE4LDYgQEAKIAogICAgIHByaXZhdGUgYm9vbGVhbiBtUGFnZUZpbmlzaGVkID0gZmFsc2U7CiAgICAgcHJpdmF0ZSBib29sZWFuIG1EdW1wV2ViS2l0RGF0YSA9IGZhbHNlOwotICAgIHByaXZhdGUgYm9vbGVhbiBtT25lSHVuZHJlZFBlcmNlbnRDb21wbGV0ZSA9IGZhbHNlOwogCiAgICAgc3RhdGljIGZpbmFsIFN0cmluZyBUSU1FT1VUX1NUUiA9ICIqKlRlc3QgdGltZW91dCI7CiAKQEAgLTg2MSwxMSArOTMyLDE1IEBACiAgICAgc3RhdGljIGZpbmFsIFN0cmluZyBVSV9BVVRPX1RFU1QgPSAiVWlBdXRvVGVzdCI7CiAgICAgc3RhdGljIGZpbmFsIFN0cmluZyBHRVRfRFJBV19USU1FID0gIkdldERyYXdUaW1lIjsKICAgICBzdGF0aWMgZmluYWwgU3RyaW5nIFNBVkVfSU1BR0UgPSAiU2F2ZUltYWdlIjsKKyAgICBzdGF0aWMgZmluYWwgU3RyaW5nIFRPVEFMX1RFU1RfQ09VTlQgPSAiVGVzdENvdW50IjsKKyAgICBzdGF0aWMgZmluYWwgU3RyaW5nIENVUlJFTlRfVEVTVF9OVU1CRVIgPSAiVGVzdE51bWJlciI7CisgICAgc3RhdGljIGZpbmFsIFN0cmluZyBTVE9QX09OX1JFRl9FUlJPUiA9ICJTdG9wT25SZWZlcmVuY2VFcnJvciI7CiAKICAgICBzdGF0aWMgZmluYWwgaW50IERSQVdfUlVOUyA9IDU7CiAgICAgc3RhdGljIGZpbmFsIFN0cmluZyBEUkFXX1RJTUVfTE9HID0gRW52aXJvbm1lbnQuZ2V0RXh0ZXJuYWxTdG9yYWdlRGlyZWN0b3J5KCkgKwogICAgICAgICAiL2FuZHJvaWQvcGFnZV9kcmF3X3RpbWUudHh0IjsKIAotICAgIHByaXZhdGUgYm9vbGVhbiBtR2VvbG9jYXRpb25QZXJtaXNzaW9uU2V0OworICAgIHByaXZhdGUgYm9vbGVhbiBtSXNHZW9sb2NhdGlvblBlcm1pc3Npb25TZXQ7CiAgICAgcHJpdmF0ZSBib29sZWFuIG1HZW9sb2NhdGlvblBlcm1pc3Npb247CisgICAgcHJpdmF0ZSBNYXAgbVBlbmRpbmdHZW9sb2NhdGlvblBlcm1pc3Npb25DYWxsYmFja3M7CiB9CmRpZmYgLS1naXQgYS90ZXN0cy9EdW1wUmVuZGVyVHJlZTIvQW5kcm9pZC5tayBiL3Rlc3RzL0R1bXBSZW5kZXJUcmVlMi9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgxZmM2MzMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9EdW1wUmVuZGVyVHJlZTIvQW5kcm9pZC5tawpAQCAtMCwwICsxLDI5IEBACisjCisjIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorIworTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKKworTE9DQUxfTU9EVUxFX1RBR1MgOj0gdGVzdHMKKworTE9DQUxfU1JDX0ZJTEVTIDo9ICQoY2FsbCBhbGwtc3ViZGlyLWphdmEtZmlsZXMpCisKK0xPQ0FMX0pBVkFfTElCUkFSSUVTIDo9IGFuZHJvaWQudGVzdC5ydW5uZXIKKworTE9DQUxfU1RBVElDX0pBVkFfTElCUkFSSUVTIDo9IGRpZmZfbWF0Y2hfcGF0Y2gKKworTE9DQUxfUEFDS0FHRV9OQU1FIDo9IER1bXBSZW5kZXJUcmVlMgorCitpbmNsdWRlICQoQlVJTERfUEFDS0FHRSkKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9EdW1wUmVuZGVyVHJlZTIvQW5kcm9pZE1hbmlmZXN0LnhtbCBiL3Rlc3RzL0R1bXBSZW5kZXJUcmVlMi9BbmRyb2lkTWFuaWZlc3QueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUyMzM2NzcKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9EdW1wUmVuZGVyVHJlZTIvQW5kcm9pZE1hbmlmZXN0LnhtbApAQCAtMCwwICsxLDYwIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLQorQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Cit5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCitZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKK1VubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKK2Rpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCitXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KK1NlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKK2xpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8bWFuaWZlc3QgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIiBwYWNrYWdlPSJjb20uYW5kcm9pZC5kdW1wcmVuZGVydHJlZTIiPgorICAgIDxhcHBsaWNhdGlvbj4KKyAgICAgICAgPHVzZXMtbGlicmFyeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQudGVzdC5ydW5uZXIiIC8+CisKKyAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iLnVpLkRpckxpc3RBY3Rpdml0eSIKKyAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGFiZWw9IkR1bXAgUmVuZGVyIFRyZWUgMiIKKyAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6Y29uZmlnQ2hhbmdlcz0ib3JpZW50YXRpb24iPgorICAgICAgICAgICAgPGludGVudC1maWx0ZXI+CisgICAgICAgICAgICAgICAgPGFjdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmFjdGlvbi5NQUlOIiAvPgorICAgICAgICAgICAgICAgIDxjYXRlZ29yeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmNhdGVnb3J5LkxBVU5DSEVSIiAvPgorICAgICAgICAgICAgPC9pbnRlbnQtZmlsdGVyPgorICAgICAgICA8L2FjdGl2aXR5PgorCisgICAgICAgIDwhLS0gYW5kcm9pZDpsYXVuY2hNb2RlPSJzaW5nbGVUYXNrIiBpcyB0aGVyZSBzbyB3ZSBvbmx5IGhhdmUgYSBvbmUgaW5zdGFuY2UKKyAgICAgICAgICAgICBvZiB0aGlzIGFjdGl2aXR5LiBIb3dldmVyLCBpdCBkb2Vzbid0IHNlZW0gdG8gd29yayBleGFjdGx5IGxpa2UgZGVzY3JpYmVkIGluIHRoZQorICAgICAgICAgICAgIGRvY3VtZW50YXRpb24sIGJlY2F1c2UgdGhlIGJlaGF2aW91ciBvZiB0aGUgYXBwbGljYXRpb24gc3VnZ2VzdAorICAgICAgICAgICAgIHRoZXJlIGlzIG9ubHkgYSBzaW5nbGUgdGFzayBmb3IgYWxsIDMgYWN0aXZpdGllcy4gV2UgZG9uJ3QgdW5kZXJzdGFuZAorICAgICAgICAgICAgIGhvdyBleGFjdGx5IGl0IGFsbCB3b3JrcywgYnV0IGF0IHRoZSBtb21lbnQgaXQgd29ya3MganVzdCBmaW5lLgorICAgICAgICAgICAgIEl0IGNhbiBsZWFkIHRvIHNvbWUgd2VpcmQgYmVoYXZpb3VyIGluIHRoZSBmdXR1cmUuIC0tPgorICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSIuVGVzdHNMaXN0QWN0aXZpdHkiCisgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxhYmVsPSJUZXN0cycgbGlzdCBhY3Rpdml0eSIKKyAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF1bmNoTW9kZT0ic2luZ2xlVGFzayIKKyAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6Y29uZmlnQ2hhbmdlcz0ib3JpZW50YXRpb24iPgorICAgICAgICA8L2FjdGl2aXR5PgorCisgICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9Ii5MYXlvdXRUZXN0c0V4ZWN1dG9yIgorICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0aGVtZT0iQHN0eWxlL1doaXRlQmFja2dyb3VuZCIKKyAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGFiZWw9IkxheW91dCB0ZXN0cycgZXhlY3V0b3IiCisgICAgICAgICAgICAgICAgICBhbmRyb2lkOnByb2Nlc3M9IjpleGVjdXRvciI+CisgICAgICAgIDwvYWN0aXZpdHk+CisKKyAgICAgICAgPHNlcnZpY2UgYW5kcm9pZDpuYW1lPSJNYW5hZ2VyU2VydmljZSI+CisgICAgICAgIDwvc2VydmljZT4KKyAgICA8L2FwcGxpY2F0aW9uPgorCisgICAgPGluc3RydW1lbnRhdGlvbiBhbmRyb2lkOm5hbWU9ImNvbS5hbmRyb2lkLmR1bXByZW5kZXJ0cmVlMi5zY3JpcHRzdXBwb3J0LlNjcmlwdFRlc3RSdW5uZXIiCisgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRhcmdldFBhY2thZ2U9ImNvbS5hbmRyb2lkLmR1bXByZW5kZXJ0cmVlMiIKKyAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGFiZWw9IkxheW91dCB0ZXN0cyBzY3JpcHQgcnVubmVyIiAvPgorCisgICAgPHVzZXMtcGVybWlzc2lvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQucGVybWlzc2lvbi5JTlRFUk5FVCIgLz4KKyAgICA8dXNlcy1wZXJtaXNzaW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5wZXJtaXNzaW9uLldSSVRFX1NEQ0FSRCIgLz4KKyAgICA8dXNlcy1wZXJtaXNzaW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5wZXJtaXNzaW9uLldSSVRFX0VYVEVSTkFMX1NUT1JBR0UiIC8+CisgICAgPHVzZXMtcGVybWlzc2lvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQucGVybWlzc2lvbi5XQUtFX0xPQ0siIC8+Cis8L21hbmlmZXN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL0R1bXBSZW5kZXJUcmVlMi9hc3NldHMvcnVuX2FwYWNoZTIucHkgYi90ZXN0cy9EdW1wUmVuZGVyVHJlZTIvYXNzZXRzL3J1bl9hcGFjaGUyLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjVkMWU2NmMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9EdW1wUmVuZGVyVHJlZTIvYXNzZXRzL3J1bl9hcGFjaGUyLnB5CkBAIC0wLDAgKzEsMTI0IEBACisjIS91c3IvYmluL3B5dGhvbgorIworIyBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKyIiIlN0YXJ0LCBzdG9wLCBvciByZXN0YXJ0IGFwYWNoZTIgc2VydmVyLgorCisgIEFwYWNoZTIgbXVzdCBiZSBpbnN0YWxsZWQgd2l0aCBtb2RfcGhwIQorCisgIFVzYWdlOgorICAgIHJ1bl9hcGFjaGUyLnB5IHN0YXJ0fHN0b3B8cmVzdGFydAorIiIiCisKK2ltcG9ydCBzeXMKK2ltcG9ydCBvcworaW1wb3J0IHN1YnByb2Nlc3MKK2ltcG9ydCBsb2dnaW5nCisKK2RlZiBtYWluKCk6CisgIGlmIGxlbihzeXMuYXJndikgPCAyOgorICAgIHJ1bl9jbWQgPSAiIgorICBlbHNlOgorICAgIHJ1bl9jbWQgPSBzeXMuYXJndlsxXQorCisgICMgU2V0dXAgbG9nZ2luZyBjbGFzcworICBsb2dnaW5nLmJhc2ljQ29uZmlnKGxldmVsPWxvZ2dpbmcuSU5GTywgZm9ybWF0PSclKG1lc3NhZ2UpcycpCisKKyAgaWYgbm90IHJ1bl9jbWQgaW4gKCJzdGFydCIsICJzdG9wIiwgInJlc3RhcnQiKToKKyAgICBsb2dnaW5nLmluZm8oImlsbGVnYWwgYXJndW1lbnQ6ICIgKyBydW5fY21kKQorICAgIGxvZ2dpbmcuaW5mbygiVXNhZ2U6IHB5dGhvbiBydW5fYXBhY2hlMi5weSBzdGFydHxzdG9wfHJlc3RhcnQiKQorICAgIHJldHVybgorCisgICMgQ3JlYXRlIC90bXAvV2ViS2l0IGlmIGl0IGRvZXNuJ3QgZXhpc3QuIFRoaXMgaXMgbmVlZGVkIGZvciB2YXJpb3VzIGZpbGVzIHVzZWQgYnkgYXBhY2hlMgorICB0bXBfV2ViS2l0ID0gb3MucGF0aC5qb2luKCIvdG1wIiwgIldlYktpdCIpCisgIGlmIG5vdCBvcy5wYXRoLmV4aXN0cyh0bXBfV2ViS2l0KToKKyAgICBvcy5ta2Rpcih0bXBfV2ViS2l0KQorCisgICMgR2V0IHRoZSBwYXRoIHRvIGFuZHJvaWQgdHJlZSByb290IGJhc2VkIG9uIHRoZSBzY3JpcHQgbG9jYXRpb24uCisgICMgQmFzaWNhbGx5IHdlIGdvIDUgbGV2ZWxzIHVwCisgIHBhcmVudCA9IG9zLnBhcmRpcgorICBzY3JpcHRfbG9jYXRpb24gPSBvcy5wYXRoLmFic3BhdGgob3MucGF0aC5kaXJuYW1lKHN5cy5hcmd2WzBdKSkKKyAgYW5kcm9pZF90cmVlX3Jvb3QgPSBvcy5wYXRoLmpvaW4oc2NyaXB0X2xvY2F0aW9uLCBwYXJlbnQsIHBhcmVudCwgcGFyZW50LCBwYXJlbnQsIHBhcmVudCkKKyAgYW5kcm9pZF90cmVlX3Jvb3QgPSBvcy5wYXRoLm5vcm1wYXRoKGFuZHJvaWRfdHJlZV9yb290KQorCisgICMgUGF0aHMgcmVsYXRpdmUgdG8gYW5kcm9pZF90cmVlX3Jvb3QKKyAgd2Via2l0X3BhdGggPSBvcy5wYXRoLmpvaW4oImV4dGVybmFsIiwgIndlYmtpdCIpCisgIGxheW91dF90ZXN0c19wYXRoID0gb3MucGF0aC5qb2luKHdlYmtpdF9wYXRoLCAiTGF5b3V0VGVzdHMiKQorICBodHRwX2NvbmZfcGF0aCA9IG9zLnBhdGguam9pbihsYXlvdXRfdGVzdHNfcGF0aCwgImh0dHAiLCAiY29uZiIpCisKKyAgIyBQcmVwYXJlIHRoZSBjb21tYW5kIHRvIHNldCAke0FQQUNIRV9SVU5fVVNFUn0gYW5kICR7QVBBQ0hFX1JVTl9HUk9VUH0KKyAgZW52dmFyc19wYXRoID0gb3MucGF0aC5qb2luKCIvZXRjIiwgImFwYWNoZTIiLCAiZW52dmFycyIpCisgIGV4cG9ydF9lbnZ2YXJzX2NtZCA9ICJzb3VyY2UgIiArIGVudnZhcnNfcGF0aAorCisgIGVycm9yX2xvZ19wYXRoID0gb3MucGF0aC5qb2luKHRtcF9XZWJLaXQsICJhcGFjaGUyLWVycm9yLmxvZyIpCisgIGN1c3RvbV9sb2dfcGF0aCA9IG9zLnBhdGguam9pbih0bXBfV2ViS2l0LCAiYXBhY2hlMi1hY2Nlc3MubG9nIikKKworICAjIFByZXBhcmUgdGhlIGNvbW1hbmQgdG8gKHJlKXN0YXJ0L3N0b3AgdGhlIHNlcnZlciB3aXRoIHNwZWNpZmllZCBzZXR0aW5ncworICBhcGFjaGUyX3Jlc3RhcnRfY21kID0gImFwYWNoZTIgLWsgIiArIHJ1bl9jbWQKKyAgZGlyZWN0aXZlcyAgPSAiIC1jIFwiU2VydmVyUm9vdCAiICsgYW5kcm9pZF90cmVlX3Jvb3QgKyAiXCIiCisKKyAgIyBXZSB1c2UgaHR0cC90ZXN0cyBhcyB0aGUgZG9jdW1lbnQgcm9vdCBhcyB0aGUgSFRUUCB0ZXN0cyB1c2UgaGFyZGNvZGVkCisgICMgcmVzb3VyY2VzIGF0IHRoZSBzZXJ2ZXIgcm9vdC4gV2UgdGhlbiB1c2UgYWxpYXNlcyB0byBtYWtlIGF2YWlsYWJsZSB0aGUKKyAgIyBjb21wbGV0ZSBzZXQgb2YgdGVzdHMgYW5kIHRoZSByZXF1aXJlZCBzY3JpcHRzLgorICBkaXJlY3RpdmVzICs9ICIgLWMgXCJEb2N1bWVudFJvb3QgIiArIG9zLnBhdGguam9pbihsYXlvdXRfdGVzdHNfcGF0aCwgImh0dHAiLCAidGVzdHMvIikgKyAiXCIiCisgIGRpcmVjdGl2ZXMgKz0gIiAtYyBcIkFsaWFzIC9MYXlvdXRUZXN0cyAiICsgbGF5b3V0X3Rlc3RzX3BhdGggKyAiXCIiCisgIGRpcmVjdGl2ZXMgKz0gIiAtYyBcIkFsaWFzIC9XZWJLaXRUb29scy9EdW1wUmVuZGVyVHJlZS9hbmRyb2lkICIgKyBcCisgICAgb3MucGF0aC5qb2luKHdlYmtpdF9wYXRoLCAiV2ViS2l0VG9vbHMiLCAiRHVtcFJlbmRlclRyZWUiLCAiYW5kcm9pZCIpICsgIlwiIgorICBkaXJlY3RpdmVzICs9ICIgLWMgXCJBbGlhcyAvVGhpcmRQYXJ0eVByb2plY3QucHJvcCAiICsgXAorICAgIG9zLnBhdGguam9pbih3ZWJraXRfcGF0aCwgIlRoaXJkUGFydHlQcm9qZWN0LnByb3AiKSArICJcIiIKKworICAjIFRoaXMgZGlyZWN0aXZlIGlzIGNvbW1lbnRlZCBvdXQgaW4gYXBhY2hlMi1kZWJpYW4taHR0cGQuY29uZiBmb3Igc29tZSByZWFzb24KKyAgIyBIb3dldmVyLCBpdCBpcyB1c2VmdWwgdG8gYnJvd3NlIHRocm91Z2ggdGVzdHMgaW4gdGhlIGJyb3dzZXIsIHNvIGl0J3MgYWRkZWQgaGVyZS4KKyAgIyBPbmUgdGhpbmcgdG8gbm90ZSBpcyB0aGF0IGJlY2F1c2Ugb2YgcHJvYmxlbXMgd2l0aCBtb2RfZGlyIGFuZCBwb3J0IG51bWJlcnMsIG1vZF9kaXIKKyAgIyBpcyB0dXJuZWQgb2ZmLiBUaGF0IG1lYW5zIHRoYXQgdGhlcmUgX211c3RfIGJlIGEgdHJhaWxpbmcgc2xhc2ggYXQgdGhlIGVuZCBvZiBVUkwKKyAgIyBmb3IgYXV0byBpbmRleGVzIHRvIHdvcmsgY29ycmVjdGx5LgorICBkaXJlY3RpdmVzICs9ICIgLWMgXCJMb2FkTW9kdWxlIGF1dG9pbmRleF9tb2R1bGUgL3Vzci9saWIvYXBhY2hlMi9tb2R1bGVzL21vZF9hdXRvaW5kZXguc29cIiIKKworICBkaXJlY3RpdmVzICs9ICIgLWMgXCJFcnJvckxvZyAiICsgZXJyb3JfbG9nX3BhdGggKyJcIiIKKyAgZGlyZWN0aXZlcyArPSAiIC1jIFwiQ3VzdG9tTG9nICIgKyBjdXN0b21fbG9nX3BhdGggKyAiIGNvbWJpbmVkXCIiCisgIGRpcmVjdGl2ZXMgKz0gIiAtYyBcIlNTTENlcnRpZmljYXRlRmlsZSAiICsgb3MucGF0aC5qb2luKGh0dHBfY29uZl9wYXRoLCAid2Via2l0LWh0dHBkLnBlbSIpICsgXAorICAgICJcIiIKKyAgZGlyZWN0aXZlcyArPSAiIC1jIFwiVXNlciAke0FQQUNIRV9SVU5fVVNFUn1cIiIKKyAgZGlyZWN0aXZlcyArPSAiIC1jIFwiR3JvdXAgJHtBUEFDSEVfUlVOX0dST1VQfVwiIgorICBkaXJlY3RpdmVzICs9ICIgLUMgXCJUeXBlc0NvbmZpZyAiICsgXAorICAgIG9zLnBhdGguam9pbihhbmRyb2lkX3RyZWVfcm9vdCwgaHR0cF9jb25mX3BhdGgsICJtaW1lLnR5cGVzIikgKyAiXCIiCisgIGNvbmZfZmlsZV9jbWQgPSAiIC1mICIgKyBcCisgICAgb3MucGF0aC5qb2luKGFuZHJvaWRfdHJlZV9yb290LCBodHRwX2NvbmZfcGF0aCwgImFwYWNoZTItZGViaWFuLWh0dHBkLmNvbmYiKQorCisgICMgVHJ5IHRvIGV4ZWN1dGUgdGhlIGNvbW1hbmRzCisgIGxvZ2dpbmcuaW5mbygiV2lsbCAiICsgcnVuX2NtZCArICIgYXBhY2hlMiBzZXJ2ZXIuIikKKyAgY21kID0gZXhwb3J0X2VudnZhcnNfY21kICsgIiAmJiAiICsgYXBhY2hlMl9yZXN0YXJ0X2NtZCArIGRpcmVjdGl2ZXMgKyBjb25mX2ZpbGVfY21kCisgIHAgPSBzdWJwcm9jZXNzLlBvcGVuKGNtZCwgc2hlbGw9VHJ1ZSwgc3Rkb3V0PXN1YnByb2Nlc3MuUElQRSwgc3RkZXJyPXN1YnByb2Nlc3MuUElQRSkKKyAgKG91dCwgZXJyKSA9IHAuY29tbXVuaWNhdGUoKQorCisgICMgT3V0cHV0IHRoZSBzdGRvdXQgZnJvbSB0aGUgY29tbWFuZCB0byBjb25zb2xlCisgIGxvZ2dpbmcuaW5mbyhvdXQpCisKKyAgIyBSZXBvcnQgYW55IGVycm9ycworICBpZiBwLnJldHVybmNvZGUgIT0gMDoKKyAgICBsb2dnaW5nLmluZm8oIiEhIEVSUk9SUzoiKQorCisgICAgaWYgZXJyLmZpbmQoZW52dmFyc19wYXRoKSAhPSAtMToKKyAgICAgIGxvZ2dpbmcuaW5mbyhlcnIpCisgICAgZWxpZiBlcnIuZmluZCgnY29tbWFuZCBub3QgZm91bmQnKSAhPSAtMToKKyAgICAgIGxvZ2dpbmcuaW5mbygiYXBhY2hlMiBpcyBwcm9iYWJseSBub3QgaW5zdGFsbGVkIikKKyAgICBlbHNlOgorICAgICAgbG9nZ2luZy5pbmZvKGVycikKKyAgICAgIGxvZ2dpbmcuaW5mbygiVHJ5IGxvb2tpbmcgaW4gIiArIGVycm9yX2xvZ19wYXRoICsgIiBmb3IgZGV0YWlscyIpCisgIGVsc2U6CisgICAgbG9nZ2luZy5pbmZvKCJPSyIpCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgIG1haW4oKTsKZGlmZiAtLWdpdCBhL3Rlc3RzL0R1bXBSZW5kZXJUcmVlMi9hc3NldHMvcnVuX2xheW91dF90ZXN0cy5weSBiL3Rlc3RzL0R1bXBSZW5kZXJUcmVlMi9hc3NldHMvcnVuX2xheW91dF90ZXN0cy5weQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5kNWJmOGIzCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvRHVtcFJlbmRlclRyZWUyL2Fzc2V0cy9ydW5fbGF5b3V0X3Rlc3RzLnB5CkBAIC0wLDAgKzEsNzcgQEAKKyMhL3Vzci9iaW4vcHl0aG9uCisKKyIiIlJ1biBsYXlvdXQgdGVzdHMgb24gdGhlIGRldmljZS4KKworICBJdCBydW5zIHRoZSBzcGVjaWZpZWQgdGVzdHMgb24gdGhlIGRldmljZSwgZG93bmxvYWRzIHRoZSBzdW1tYXJpZXMgdG8gdGhlIHRlbXBvcmFyeSBkaXJlY3RvcnkKKyAgYW5kIG9wdGlvbmFsbHkgc2hvd3MgdGhlIGRldGFpbGVkIHJlc3VsdHMgdGhlIGhvc3QncyBkZWZhdWx0IGJyb3dzZXIuCisKKyAgVXNhZ2U6CisgICAgcnVuX2xheW91dF90ZXN0cy5weSAtLXNob3ctcmVzdWx0cy1pbi1icm93c2VyIHRlc3QtcmVsYXRpdmUtcGF0aAorIiIiCisKK2ltcG9ydCBsb2dnaW5nCitpbXBvcnQgb3B0cGFyc2UKK2ltcG9ydCBvcworaW1wb3J0IHN5cworaW1wb3J0IHN1YnByb2Nlc3MKK2ltcG9ydCB0ZW1wZmlsZQoraW1wb3J0IHdlYmJyb3dzZXIKKworI1RPRE86IFRoZXNlIHNob3VsZCBub3QgYmUgaGFyZGNvZGVkCitSRVNVTFRTX0FCU09MVVRFX1BBVEggPSAiL3NkY2FyZC9sYXlvdXQtdGVzdC1yZXN1bHRzLyIKK0RFVEFJTFNfSFRNTCA9ICJkZXRhaWxzLmh0bWwiCitTVU1NQVJZX1RYVCA9ICJzdW1tYXJ5LnR4dCIKKworZGVmIG1haW4ob3B0aW9ucywgYXJncyk6CisgIGlmIGFyZ3M6CisgICAgcGF0aCA9ICIgIi5qb2luKGFyZ3MpOworICBlbHNlOgorICAgIHBhdGggPSAiIjsKKworICBsb2dnaW5nLmJhc2ljQ29uZmlnKGxldmVsPWxvZ2dpbmcuSU5GTywgZm9ybWF0PSclKG1lc3NhZ2UpcycpCisKKyAgdG1wZGlyID0gdGVtcGZpbGUuZ2V0dGVtcGRpcigpCisKKyAgIyBSZXN0YXJ0IHRoZSBzZXJ2ZXIKKyAgY21kID0gb3MucGF0aC5qb2luKG9zLnBhdGguYWJzcGF0aChvcy5wYXRoLmRpcm5hbWUoc3lzLmFyZ3ZbMF0pKSwgInJ1bl9hcGFjaGUyLnB5IikgKyAiIHJlc3RhcnQiCisgIG9zLnN5c3RlbShjbWQpOworCisgICMgUnVuIHRoZSB0ZXN0cyBpbiBwYXRoCisgIGNtZCA9ICJhZGIgc2hlbGwgYW0gaW5zdHJ1bWVudCAiCisgIGNtZCArPSAiLWUgY2xhc3MgY29tLmFuZHJvaWQuZHVtcHJlbmRlcnRyZWUyLnNjcmlwdHN1cHBvcnQuU3RhcnRlciNzdGFydExheW91dFRlc3RzICIKKyAgY21kICs9ICItZSBwYXRoIFwiIiArIHBhdGggKyAiXCIgIgorICBjbWQgKz0iLXcgY29tLmFuZHJvaWQuZHVtcHJlbmRlcnRyZWUyL2NvbS5hbmRyb2lkLmR1bXByZW5kZXJ0cmVlMi5zY3JpcHRzdXBwb3J0LlNjcmlwdFRlc3RSdW5uZXIiCisKKyAgbG9nZ2luZy5pbmZvKCJSdW5uaW5nIHRoZSB0ZXN0cy4uLiIpCisgIHN1YnByb2Nlc3MuUG9wZW4oY21kLCBzaGVsbD1UcnVlLCBzdGRvdXQ9c3VicHJvY2Vzcy5QSVBFLCBzdGRlcnI9c3VicHJvY2Vzcy5QSVBFKS5jb21tdW5pY2F0ZSgpCisKKyAgbG9nZ2luZy5pbmZvKCJEb3dubG9hZGluZyB0aGUgc3VtbWFyaWVzLi4uIikKKworICAjIERvd25sb2FkIHRoZSB0eHQgc3VtbWFyeSB0byB0bXAgZm9sZGVyCisgIHN1bW1hcnlfdHh0X3RtcF9wYXRoID0gb3MucGF0aC5qb2luKHRtcGRpciwgU1VNTUFSWV9UWFQpCisgIGNtZCA9ICJybSAtZiAiICsgc3VtbWFyeV90eHRfdG1wX3BhdGggKyAiOyIKKyAgY21kICs9ICJhZGIgcHVsbCAiICsgUkVTVUxUU19BQlNPTFVURV9QQVRIICsgU1VNTUFSWV9UWFQgKyAiICIgKyBzdW1tYXJ5X3R4dF90bXBfcGF0aAorICBzdWJwcm9jZXNzLlBvcGVuKGNtZCwgc2hlbGw9VHJ1ZSwgc3Rkb3V0PXN1YnByb2Nlc3MuUElQRSwgc3RkZXJyPXN1YnByb2Nlc3MuUElQRSkuY29tbXVuaWNhdGUoKQorCisgICMgRG93bmxvYWQgdGhlIGh0bWwgc3VtbWFyeSB0byB0bXAgZm9sZGVyCisgIGRldGFpbHNfaHRtbF90bXBfcGF0aCA9IG9zLnBhdGguam9pbih0bXBkaXIsIERFVEFJTFNfSFRNTCkKKyAgY21kID0gInJtIC1mICIgKyBkZXRhaWxzX2h0bWxfdG1wX3BhdGggKyAiOyIKKyAgY21kICs9ICJhZGIgcHVsbCAiICsgUkVTVUxUU19BQlNPTFVURV9QQVRIICsgREVUQUlMU19IVE1MICsgIiAiICsgZGV0YWlsc19odG1sX3RtcF9wYXRoCisgIHN1YnByb2Nlc3MuUG9wZW4oY21kLCBzaGVsbD1UcnVlLCBzdGRvdXQ9c3VicHJvY2Vzcy5QSVBFLCBzdGRlcnI9c3VicHJvY2Vzcy5QSVBFKS5jb21tdW5pY2F0ZSgpCisKKyAgIyBQcmludCBzdW1tYXJ5IHRvIGNvbnNvbGUKKyAgbG9nZ2luZy5pbmZvKCJBbGwgZG9uZS5cbiIpCisgIGNtZCA9ICJjYXQgIiArIHN1bW1hcnlfdHh0X3RtcF9wYXRoCisgIG9zLnN5c3RlbShjbWQpCisgIGxvZ2dpbmcuaW5mbygiIikKKworICAjIE9wZW4gdGhlIGJyb3dzZXIgd2l0aCBzdW1tYXJ5CisgIGlmIG9wdGlvbnMuc2hvd19yZXN1bHRzX2luX2Jyb3dzZXIgIT0gImZhbHNlIjoKKyAgICB3ZWJicm93c2VyLm9wZW4oZGV0YWlsc19odG1sX3RtcF9wYXRoKQorCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICBvcHRpb25fcGFyc2VyID0gb3B0cGFyc2UuT3B0aW9uUGFyc2VyKHVzYWdlPSJVc2FnZTogJXByb2cgW29wdGlvbnNdIHRlc3QtcmVsYXRpdmUtcGF0aCIpCisgIG9wdGlvbl9wYXJzZXIuYWRkX29wdGlvbigiIiwgIi0tc2hvdy1yZXN1bHRzLWluLWJyb3dzZXIiLCBkZWZhdWx0PSJ0cnVlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlbHA9IlNob3cgdGhlIHJlc3VsdHMgdGhlIGhvc3QncyBkZWZhdWx0IHdlYiBicm93c2VyLCBkZWZhdWx0PXRydWUiKQorICBvcHRpb25zLCBhcmdzID0gb3B0aW9uX3BhcnNlci5wYXJzZV9hcmdzKCk7CisgIG1haW4ob3B0aW9ucywgYXJncyk7CmRpZmYgLS1naXQgYS90ZXN0cy9EdW1wUmVuZGVyVHJlZTIvcmVzL2RyYXdhYmxlL2ZvbGRlci5wbmcgYi90ZXN0cy9EdW1wUmVuZGVyVHJlZTIvcmVzL2RyYXdhYmxlL2ZvbGRlci5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWIzZmNlYwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL0R1bXBSZW5kZXJUcmVlMi9yZXMvZHJhd2FibGUvZm9sZGVyLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0cy9EdW1wUmVuZGVyVHJlZTIvcmVzL2RyYXdhYmxlL3J1bnRlc3QucG5nIGIvdGVzdHMvRHVtcFJlbmRlclRyZWUyL3Jlcy9kcmF3YWJsZS9ydW50ZXN0LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MTBjNjU0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvRHVtcFJlbmRlclRyZWUyL3Jlcy9kcmF3YWJsZS9ydW50ZXN0LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0cy9EdW1wUmVuZGVyVHJlZTIvcmVzL2xheW91dC9kaXJsaXN0X3Jvdy54bWwgYi90ZXN0cy9EdW1wUmVuZGVyVHJlZTIvcmVzL2xheW91dC9kaXJsaXN0X3Jvdy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTU1NzhhNgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL0R1bXBSZW5kZXJUcmVlMi9yZXMvbGF5b3V0L2Rpcmxpc3Rfcm93LnhtbApAQCAtMCwwICsxLDQzIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLQorQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Cit5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCitZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKK1VubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKK2Rpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCitXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KK1NlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKK2xpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8TGluZWFyTGF5b3V0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJob3Jpem9udGFsIgorICAgIGFuZHJvaWQ6Z3Jhdml0eT0iY2VudGVyX3ZlcnRpY2FsIgorICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJmaWxsX3BhcmVudCIKKyAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCI+CisKKyAgICA8SW1hZ2VWaWV3CisgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvaWNvbiIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IjgwcHgiCisgICAgICAgIGFuZHJvaWQ6YWRqdXN0Vmlld0JvdW5kcz0idHJ1ZSIKKyAgICAgICAgYW5kcm9pZDpwYWRkaW5nTGVmdD0iMTVweCIKKyAgICAgICAgYW5kcm9pZDpwYWRkaW5nUmlnaHQ9IjE1cHgiCisgICAgICAgIGFuZHJvaWQ6cGFkZGluZ1RvcD0iMTVweCIKKyAgICAgICAgYW5kcm9pZDpwYWRkaW5nQm90dG9tPSIxNXB4IgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAvPgorCisgICAgPFRleHRWaWV3CisgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvbGFiZWwiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJmaWxsX3BhcmVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6bWluSGVpZ2h0PSI2MHB4IgorICAgICAgICBhbmRyb2lkOmdyYXZpdHk9ImNlbnRlcl92ZXJ0aWNhbCIKKyAgICAgICAgYW5kcm9pZDp0ZXh0U2l6ZT0iMTRzcCIKKyAgICAvPgorCis8L0xpbmVhckxheW91dD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9EdW1wUmVuZGVyVHJlZTIvcmVzL21lbnUvZ3VpX21lbnUueG1sIGIvdGVzdHMvRHVtcFJlbmRlclRyZWUyL3Jlcy9tZW51L2d1aV9tZW51LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNWIyYjY1Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvRHVtcFJlbmRlclRyZWUyL3Jlcy9tZW51L2d1aV9tZW51LnhtbApAQCAtMCwwICsxLDIwIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLQorQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Cit5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCitZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKK1VubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKK2Rpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCitXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KK1NlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKK2xpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8bWVudSB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiPgorICAgIDxpdGVtIGFuZHJvaWQ6aWQ9IkAraWQvcnVuX2FsbCIKKyAgICAgICAgICBhbmRyb2lkOnRpdGxlPSJAc3RyaW5nL3J1bl9hbGxfdGVzdHMiIC8+Cis8L21lbnU+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvRHVtcFJlbmRlclRyZWUyL3Jlcy92YWx1ZXMvc3RyaW5ncy54bWwgYi90ZXN0cy9EdW1wUmVuZGVyVHJlZTIvcmVzL3ZhbHVlcy9zdHJpbmdzLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNDk2NDA0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvRHVtcFJlbmRlclRyZWUyL3Jlcy92YWx1ZXMvc3RyaW5ncy54bWwKQEAgLTAsMCArMSwzMCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0KK0NvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKK0xpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKK2h0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCitVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCitkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCitTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCitsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPHJlc291cmNlcz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpYWxvZ19ydW5fYWJvcnRfZGlyX3RpdGxlX3ByZWZpeCI+RGlyZWN0b3J5Ojwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGlhbG9nX3J1bl9hYm9ydF9kaXJfbXNnIj5UaGlzIHdpbGwgcnVuIGFsbCB0aGUgdGVzdHMgaW4gdGhpcyBkaXJlY3RvcnkgYW5kIGFsbAorICAgICAgICAgICAgdGhlIHN1YmRpcmVjdG9yaWVzLiBJdCBtYXkgdGFrZSBhIGZldyBob3VycyE8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpYWxvZ19ydW5fYWJvcnRfZGlyX29rX2J1dHRvbiI+UnVuIHRlc3RzITwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGlhbG9nX3J1bl9hYm9ydF9kaXJfYWJvcnRfYnV0dG9uIj5BYm9ydDwvc3RyaW5nPgorCisgICAgPHN0cmluZyBuYW1lPSJkaWFsb2dfcHJvZ3Jlc3NfdGl0bGUiPkxvYWRpbmcgaXRlbXMuPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWFsb2dfcHJvZ3Jlc3NfbXNnIj5QbGVhc2Ugd2FpdC4uLjwvc3RyaW5nPgorCisgICAgPHN0cmluZyBuYW1lPSJydW5uZXJfcHJlbG9hZGluZ190aXRsZSI+UHJlbG9hZGluZyB0ZXN0cy4uLjwvc3RyaW5nPgorCisgICAgPHN0cmluZyBuYW1lPSJydW5fYWxsX3Rlc3RzIj5SdW4gYWxsIHRlc3RzIGluIHRoZSBjdXJyZW50IGRpcmVjdG9yeTwvc3RyaW5nPgorPC9yZXNvdXJjZXM+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvRHVtcFJlbmRlclRyZWUyL3Jlcy92YWx1ZXMvc3R5bGUueG1sIGIvdGVzdHMvRHVtcFJlbmRlclRyZWUyL3Jlcy92YWx1ZXMvc3R5bGUueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM1ZjM0MTkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9EdW1wUmVuZGVyVHJlZTIvcmVzL3ZhbHVlcy9zdHlsZS54bWwKQEAgLTAsMCArMSwyMSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0KK0NvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKK0xpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKK2h0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCitVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCitkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCitTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCitsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPHJlc291cmNlcz4KKyAgICA8c3R5bGUgbmFtZT0iV2hpdGVCYWNrZ3JvdW5kIj4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpiYWNrZ3JvdW5kIj5AYW5kcm9pZDpjb2xvci93aGl0ZTwvaXRlbT4KKyAgICA8L3N0eWxlPgorPC9yZXNvdXJjZXM+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvRHVtcFJlbmRlclRyZWUyL3NyYy9jb20vYW5kcm9pZC9kdW1wcmVuZGVydHJlZTIvQWJzdHJhY3RSZXN1bHQuamF2YSBiL3Rlc3RzL0R1bXBSZW5kZXJUcmVlMi9zcmMvY29tL2FuZHJvaWQvZHVtcHJlbmRlcnRyZWUyL0Fic3RyYWN0UmVzdWx0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2NiYjM5NwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL0R1bXBSZW5kZXJUcmVlMi9zcmMvY29tL2FuZHJvaWQvZHVtcHJlbmRlcnRyZWUyL0Fic3RyYWN0UmVzdWx0LmphdmEKQEAgLTAsMCArMSwxNTMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLmR1bXByZW5kZXJ0cmVlMjsKKworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworaW1wb3J0IGFuZHJvaWQub3MuTWVzc2FnZTsKK2ltcG9ydCBhbmRyb2lkLndlYmtpdC5XZWJWaWV3OworCisvKioKKyAqIEEgY2xhc3MgdGhhdCByZXByZXNlbnQgYSByZXN1bHQgb2YgdGhlIHRlc3QuIEl0IGlzIHJlc3BvbnNpYmxlIGZvciByZXR1cm5pbmcgdGhlIHJlc3VsdCdzCisgKiByYXcgZGF0YSBhbmQgZ2VuZXJhdGluZyBpdHMgb3duIGRpZmYgaW4gSFRNTCBmb3JtYXQuCisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFJlc3VsdCBpbXBsZW1lbnRzIENvbXBhcmFibGU8QWJzdHJhY3RSZXN1bHQ+IHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMT0dfVEFHID0gIkFic3RyYWN0UmVzdWx0IjsKKworICAgIHB1YmxpYyBlbnVtIFRlc3RUeXBlIHsKKyAgICAgICAgVEVYVCB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBBYnN0cmFjdFJlc3VsdCBjcmVhdGVSZXN1bHQoQnVuZGxlIGJ1bmRsZSkgeworICAgICAgICAgICAgICAgIHJldHVybiBuZXcgVGV4dFJlc3VsdChidW5kbGUpOworICAgICAgICAgICAgfQorICAgICAgICB9LAorICAgICAgICBSRU5ERVJfVFJFRSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBBYnN0cmFjdFJlc3VsdCBjcmVhdGVSZXN1bHQoQnVuZGxlIGJ1bmRsZSkgeworICAgICAgICAgICAgICAgIC8qKiBUT0RPOiBSZW5kZXJUcmVlIHRlc3RzIGFyZSBub3QgeWV0IHN1cHBvcnRlZCAqLworICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgfQorICAgICAgICB9OworCisgICAgICAgIHB1YmxpYyBhYnN0cmFjdCBBYnN0cmFjdFJlc3VsdCBjcmVhdGVSZXN1bHQoQnVuZGxlIGJ1bmRsZSk7CisgICAgfQorCisgICAgcHVibGljIGVudW0gUmVzdWx0Q29kZSB7CisgICAgICAgIFBBU1MoIlBhc3NlZCIpLAorICAgICAgICBGQUlMX1JFU1VMVF9ESUZGRVJTKCJSZXN1bHQgZGlmZmVycyIpLAorICAgICAgICBGQUlMX05PX0VYUEVDVEVEX1JFU1VMVCgiTm8gZXhwZWN0ZWQgcmVzdWx0IiksCisgICAgICAgIEZBSUxfVElNRURfT1VUKCJUaW1lZCBvdXQiKSwKKyAgICAgICAgRkFJTF9DUkFTSEVEKCJDcmFzaGVkIik7CisKKyAgICAgICAgcHJpdmF0ZSBTdHJpbmcgbVRpdGxlOworCisgICAgICAgIHByaXZhdGUgUmVzdWx0Q29kZShTdHJpbmcgdGl0bGUpIHsKKyAgICAgICAgICAgIG1UaXRsZSA9IHRpdGxlOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgICAgICByZXR1cm4gbVRpdGxlOworICAgICAgICB9CisgICAgfQorCisgICAgU3RyaW5nIG1BZGRpdGlvbmFsVGV4dE91dHB1dFN0cmluZzsKKworICAgIHB1YmxpYyBpbnQgY29tcGFyZVRvKEFic3RyYWN0UmVzdWx0IGFub3RoZXIpIHsKKyAgICAgICAgcmV0dXJuIGdldFJlbGF0aXZlUGF0aCgpLmNvbXBhcmVUbyhhbm90aGVyLmdldFJlbGF0aXZlUGF0aCgpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRBZGRpdGlvbmFsVGV4dE91dHB1dFN0cmluZyhTdHJpbmcgYWRkaXRpb25hbFRleHRPdXRwdXRTdHJpbmcpIHsKKyAgICAgICAgbUFkZGl0aW9uYWxUZXh0T3V0cHV0U3RyaW5nID0gYWRkaXRpb25hbFRleHRPdXRwdXRTdHJpbmc7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRBZGRpdGlvbmFsVGV4dE91dHB1dFN0cmluZygpIHsKKyAgICAgICAgcmV0dXJuIG1BZGRpdGlvbmFsVGV4dE91dHB1dFN0cmluZzsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBNYWtlcyB0aGUgcmVzdWx0IG9iamVjdCBvYnRhaW4gdGhlIHJlc3VsdHMgb2YgdGhlIHRlc3QgZnJvbSB0aGUgd2VidmlldworICAgICAqIGFuZCBzdG9yZSB0aGVtIGluIHRoZSBmb3JtYXQgdGhhdCBzdWl0cyBpdHNlbGYgYmVzdHMuIFRoaXMgbWV0aG9kIGlzIGFzeW5jaHJvbm91cy4KKyAgICAgKiBUaGUgbWVzc2FnZSBwYXNzZWQgYXMgYSBwYXJhbWV0ZXIgaXMgYSBtZXNzYWdlIHRoYXQgc2hvdWxkIGJlIHNlbnQgdG8gaXRzIHRhcmdldAorICAgICAqIHdoZW4gdGhlIHJlc3VsdCBmaW5pc2hlcyBvYnRhaW5pbmcgdGhlIHJlc3VsdC4KKyAgICAgKgorICAgICAqIEBwYXJhbSB3ZWJ2aWV3CisgICAgICogQHBhcmFtIHJlc3VsdE9idGFpbmVkTXNnCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IHZvaWQgb2J0YWluQWN0dWFsUmVzdWx0cyhXZWJWaWV3IHdlYnZpZXcsIE1lc3NhZ2UgcmVzdWx0T2J0YWluZWRNc2cpOworCisgICAgcHVibGljIGFic3RyYWN0IHZvaWQgc2V0RXhwZWN0ZWRJbWFnZVJlc3VsdChieXRlW10gZXhwZWN0ZWRSZXN1bHQpOworCisgICAgcHVibGljIGFic3RyYWN0IHZvaWQgc2V0RXhwZWN0ZWRJbWFnZVJlc3VsdFBhdGgoU3RyaW5nIHJlbGF0aXZlUGF0aCk7CisKKyAgICBwdWJsaWMgYWJzdHJhY3QgU3RyaW5nIGdldEV4cGVjdGVkSW1hZ2VSZXN1bHRQYXRoKCk7CisKKyAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZXRFeHBlY3RlZFRleHRSZXN1bHQoU3RyaW5nIGV4cGVjdGVkUmVzdWx0KTsKKworICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHNldEV4cGVjdGVkVGV4dFJlc3VsdFBhdGgoU3RyaW5nIHJlbGF0aXZlUGF0aCk7CisKKyAgICBwdWJsaWMgYWJzdHJhY3QgU3RyaW5nIGdldEV4cGVjdGVkVGV4dFJlc3VsdFBhdGgoKTsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgcmVzdWx0J3MgaW1hZ2UgZGF0YSB0aGF0IGNhbiBiZSB3cml0dGVuIHRvIHRoZSBkaXNrLiBJdCBjYW4gYmUgbnVsbAorICAgICAqIGlmIHRoZXJlIGlzIGFuIGVycm9yIG9mIHNvbWUgc29ydCBvciBmb3IgZXhhbXBsZSB0aGUgdGVzdCB0aW1lcyBvdXQuCisgICAgICoKKyAgICAgKiA8cD4gU29tZSB0ZXN0cyB3aWxsIG5vdCBwcm92aWRlIGRhdGEgKGxpa2UgdGV4dCB0ZXN0cykKKyAgICAgKgorICAgICAqIEByZXR1cm4KKyAgICAgKiAgICAgIHJlc3VsdHMgaW1hZ2UgZGF0YQorICAgICAqLworICAgIHB1YmxpYyBhYnN0cmFjdCBieXRlW10gZ2V0QWN0dWFsSW1hZ2VSZXN1bHQoKTsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgcmVzdWx0J3MgdGV4dCBkYXRhLiBJdCBjYW4gYmUgbnVsbAorICAgICAqIGlmIHRoZXJlIGlzIGFuIGVycm9yIG9mIHNvbWUgc29ydCBvciBmb3IgZXhhbXBsZSB0aGUgdGVzdCB0aW1lcyBvdXQuCisgICAgICoKKyAgICAgKiBAcmV0dXJuCisgICAgICogICAgICByZXN1bHRzIHRleHQgZGF0YQorICAgICAqLworICAgIHB1YmxpYyBhYnN0cmFjdCBTdHJpbmcgZ2V0QWN0dWFsVGV4dFJlc3VsdCgpOworCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgY29kZSBvZiB0aGlzIHJlc3VsdC4KKyAgICAgKgorICAgICAqIEByZXR1cm4KKyAgICAgKiAgICAgIHRoZSBjb2RlIG9mIHRoaXMgcmVzdWx0CisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IFJlc3VsdENvZGUgZ2V0UmVzdWx0Q29kZSgpOworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSB0eXBlIG9mIHRoZSByZXN1bHQgZGF0YS4KKyAgICAgKgorICAgICAqIEByZXR1cm4KKyAgICAgKiAgICAgIHRoZSB0eXBlIG9mIHRoZSByZXN1bHQgZGF0YS4KKyAgICAgKi8KKyAgICBwdWJsaWMgYWJzdHJhY3QgVGVzdFR5cGUgZ2V0VHlwZSgpOworCisgICAgcHVibGljIGFic3RyYWN0IFN0cmluZyBnZXRSZWxhdGl2ZVBhdGgoKTsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgYSBwaWVjZSBvZiBIVE1MIGNvZGUgdGhhdCBwcmVzZW50cyBhIHZpc3VhbCBkaWZmIGJldHdlZW4gYSByZXN1bHQgYW5kCisgICAgICogdGhlIGV4cGVjdGVkIHJlc3VsdC4KKyAgICAgKgorICAgICAqIEByZXR1cm4KKyAgICAgKiAgICAgIGEgcGllY2Ugb2YgSFRNTCBjb2RlIHdpdGggYSB2aXN1YWwgZGlmZiBiZXR3ZWVuIHRoZSByZXN1bHQgYW5kIHRoZSBleHBlY3RlZCByZXN1bHQKKyAgICAgKi8KKyAgICBwdWJsaWMgYWJzdHJhY3QgU3RyaW5nIGdldERpZmZBc0h0bWwoKTsKKworICAgIHB1YmxpYyBhYnN0cmFjdCBCdW5kbGUgZ2V0QnVuZGxlKCk7Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvRHVtcFJlbmRlclRyZWUyL3NyYy9jb20vYW5kcm9pZC9kdW1wcmVuZGVydHJlZTIvQWRkaXRpb25hbFRleHRPdXRwdXQuamF2YSBiL3Rlc3RzL0R1bXBSZW5kZXJUcmVlMi9zcmMvY29tL2FuZHJvaWQvZHVtcHJlbmRlcnRyZWUyL0FkZGl0aW9uYWxUZXh0T3V0cHV0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmI5YTkxNgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL0R1bXBSZW5kZXJUcmVlMi9zcmMvY29tL2FuZHJvaWQvZHVtcHJlbmRlcnRyZWUyL0FkZGl0aW9uYWxUZXh0T3V0cHV0LmphdmEKQEAgLTAsMCArMSwxMTkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLmR1bXByZW5kZXJ0cmVlMjsKKworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CitpbXBvcnQgYW5kcm9pZC53ZWJraXQuQ29uc29sZU1lc3NhZ2U7CisKK2ltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247CitpbXBvcnQgamF2YS5uZXQuVVJMOworCisvKioKKyAqIEEgY2xhc3MgdGhhdCBzdG9yZXMgY29uc29sZXMgbWVzc2FnZXMsIGRhdGFiYXNlIGNhbGxiYWNrcywgYWxlcnQgbWVzc2FnZXMsIGV0Yy4KKyAqLworcHVibGljIGNsYXNzIEFkZGl0aW9uYWxUZXh0T3V0cHV0IHsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTE9HX1RBRyA9ICJBZGRpdGlvbmFsVGV4dE91dHB1dCI7CisKKyAgICAvKioKKyAgICAgKiBPcmRlcmluZyBvZiBlbnVtcyBpcyBpbXBvcnRhbnQgYXMgaXQgZGV0ZXJtaW5lcyBvcmRlcmluZyBvZiB0aGUgdG9TdHJpbmcgbWV0aG9kIQorICAgICAqIFN0cmluZ0J1aWxkZXJzIHdpbGwgYmUgcHJpbnRlZCBpbiB0aGUgb3JkZXIgdGhlIGNvcnJlc3BvbmRpbmcgdHlwZXMgYXBwZWFyIGhlcmUuCisgICAgICovCisgICAgcHJpdmF0ZSBlbnVtIE91dHB1dFR5cGUgeworICAgICAgICBKU19ESUFMT0csCisgICAgICAgIEVYQ0VFREVEX0RCX1FVT1RBX01FU1NBR0UsCisgICAgICAgIENPTlNPTEVfTUVTU0FHRTsKKyAgICB9CisKKyAgICBTdHJpbmdCdWlsZGVyW10gbU91dHB1dHMgPSBuZXcgU3RyaW5nQnVpbGRlcltPdXRwdXRUeXBlLnZhbHVlcygpLmxlbmd0aF07CisKKyAgICBwcml2YXRlIFN0cmluZ0J1aWxkZXIgZ2V0U3RyaW5nQnVpbGRlckZvclR5cGUoT3V0cHV0VHlwZSBvdXRwdXRUeXBlKSB7CisgICAgICAgIGludCBpbmRleCA9IG91dHB1dFR5cGUub3JkaW5hbCgpOworICAgICAgICBpZiAobU91dHB1dHNbaW5kZXhdID09IG51bGwpIHsKKyAgICAgICAgICAgIG1PdXRwdXRzW2luZGV4XSA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG1PdXRwdXRzW2luZGV4XTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBhcHBlbmRFeGNlZWRlZERiUXVvdGFNZXNzYWdlKFN0cmluZyB1cmxTdHJpbmcsIFN0cmluZyBkYXRhYmFzZUlkZW50aWZpZXIpIHsKKyAgICAgICAgU3RyaW5nQnVpbGRlciBvdXRwdXQgPSBnZXRTdHJpbmdCdWlsZGVyRm9yVHlwZShPdXRwdXRUeXBlLkVYQ0VFREVEX0RCX1FVT1RBX01FU1NBR0UpOworCisgICAgICAgIFN0cmluZyBwcm90b2NvbCA9ICIiOworICAgICAgICBTdHJpbmcgaG9zdCA9ICIiOworICAgICAgICBpbnQgcG9ydCA9IDA7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIFVSTCB1cmwgPSBuZXcgVVJMKHVybFN0cmluZyk7CisgICAgICAgICAgICBwcm90b2NvbCA9IHVybC5nZXRQcm90b2NvbCgpOworICAgICAgICAgICAgaG9zdCA9IHVybC5nZXRIb3N0KCk7CisgICAgICAgICAgICBpZiAodXJsLmdldFBvcnQoKSA+IC0xKSB7CisgICAgICAgICAgICAgICAgcG9ydCA9IHVybC5nZXRQb3J0KCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBMb2cuZShMT0dfVEFHLCAidXJsU3RyaW5nPSIgKyB1cmxTdHJpbmcgKyAiIGRhdGFiYXNlSWRlbnRpZmllcj0iICsgZGF0YWJhc2VJZGVudGlmaWVyLAorICAgICAgICAgICAgICAgICAgICBlKTsKKyAgICAgICAgfQorCisgICAgICAgIG91dHB1dC5hcHBlbmQoIlVJIERFTEVHQVRFIERBVEFCQVNFIENBTExCQUNLOiAiKTsKKyAgICAgICAgb3V0cHV0LmFwcGVuZCgiZXhjZWVkZWREYXRhYmFzZVF1b3RhRm9yU2VjdXJpdHlPcmlnaW46eyIpOworICAgICAgICBvdXRwdXQuYXBwZW5kKHByb3RvY29sICsgIiwgIiArIGhvc3QgKyAiLCAiICsgcG9ydCArICJ9ICIpOworICAgICAgICBvdXRwdXQuYXBwZW5kKCJkYXRhYmFzZToiICsgZGF0YWJhc2VJZGVudGlmaWVyICsgIlxuIik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgYXBwZW5kQ29uc29sZU1lc3NhZ2UoQ29uc29sZU1lc3NhZ2UgY29uc29sZU1lc3NhZ2UpIHsKKyAgICAgICAgU3RyaW5nQnVpbGRlciBvdXRwdXQgPSBnZXRTdHJpbmdCdWlsZGVyRm9yVHlwZShPdXRwdXRUeXBlLkNPTlNPTEVfTUVTU0FHRSk7CisKKyAgICAgICAgb3V0cHV0LmFwcGVuZCgiQ09OU09MRSBNRVNTQUdFOiBsaW5lICIgKyBjb25zb2xlTWVzc2FnZS5saW5lTnVtYmVyKCkpOworICAgICAgICBvdXRwdXQuYXBwZW5kKCI6ICIgKyBjb25zb2xlTWVzc2FnZS5tZXNzYWdlKCkgKyAiXG4iKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBhcHBlbmRKc0FsZXJ0KFN0cmluZyBtZXNzYWdlKSB7CisgICAgICAgIFN0cmluZ0J1aWxkZXIgb3V0cHV0ID0gZ2V0U3RyaW5nQnVpbGRlckZvclR5cGUoT3V0cHV0VHlwZS5KU19ESUFMT0cpOworCisgICAgICAgIG91dHB1dC5hcHBlbmQoIkFMRVJUOiAiKTsKKyAgICAgICAgb3V0cHV0LmFwcGVuZChtZXNzYWdlKTsKKyAgICAgICAgb3V0cHV0LmFwcGVuZCgnXG4nKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBhcHBlbmRKc0NvbmZpcm0oU3RyaW5nIG1lc3NhZ2UpIHsKKyAgICAgICAgU3RyaW5nQnVpbGRlciBvdXRwdXQgPSBnZXRTdHJpbmdCdWlsZGVyRm9yVHlwZShPdXRwdXRUeXBlLkpTX0RJQUxPRyk7CisKKyAgICAgICAgb3V0cHV0LmFwcGVuZCgiQ09ORklSTTogIik7CisgICAgICAgIG91dHB1dC5hcHBlbmQobWVzc2FnZSk7CisgICAgICAgIG91dHB1dC5hcHBlbmQoJ1xuJyk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgYXBwZW5kSnNQcm9tcHQoU3RyaW5nIG1lc3NhZ2UsIFN0cmluZyBkZWZhdWx0VmFsdWUpIHsKKyAgICAgICAgU3RyaW5nQnVpbGRlciBvdXRwdXQgPSBnZXRTdHJpbmdCdWlsZGVyRm9yVHlwZShPdXRwdXRUeXBlLkpTX0RJQUxPRyk7CisKKyAgICAgICAgb3V0cHV0LmFwcGVuZCgiUFJPTVBUOiAiKTsKKyAgICAgICAgb3V0cHV0LmFwcGVuZChtZXNzYWdlKTsKKyAgICAgICAgb3V0cHV0LmFwcGVuZCgiLCBkZWZhdWx0IHRleHQ6ICIpOworICAgICAgICBvdXRwdXQuYXBwZW5kKGRlZmF1bHRWYWx1ZSk7CisgICAgICAgIG91dHB1dC5hcHBlbmQoJ1xuJyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgU3RyaW5nQnVpbGRlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1PdXRwdXRzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBpZiAobU91dHB1dHNbaV0gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQobU91dHB1dHNbaV0udG9TdHJpbmcoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOworICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9EdW1wUmVuZGVyVHJlZTIvc3JjL2NvbS9hbmRyb2lkL2R1bXByZW5kZXJ0cmVlMi9DcmFzaGVkRHVtbXlSZXN1bHQuamF2YSBiL3Rlc3RzL0R1bXBSZW5kZXJUcmVlMi9zcmMvY29tL2FuZHJvaWQvZHVtcHJlbmRlcnRyZWUyL0NyYXNoZWREdW1teVJlc3VsdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMxZGE3NzYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9EdW1wUmVuZGVyVHJlZTIvc3JjL2NvbS9hbmRyb2lkL2R1bXByZW5kZXJ0cmVlMi9DcmFzaGVkRHVtbXlSZXN1bHQuamF2YQpAQCAtMCwwICsxLDEwOSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQuZHVtcHJlbmRlcnRyZWUyOworCitpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CitpbXBvcnQgYW5kcm9pZC5vcy5NZXNzYWdlOworaW1wb3J0IGFuZHJvaWQud2Via2l0LldlYlZpZXc7CisKKy8qKgorICogQSBkdW1teSBjbGFzcyByZXByZXNlbnRpbmcgdGVzdCB0aGF0IGNyYXNoZWQuCisgKgorICogVE9ETzogQWxsIHRoZSBtZXRob2RzIHJlZ2FyZGluZyBleHBlY3RlZCByZXN1bHRzIG5lZWQgaW1wbGVtZW50aW5nLgorICovCitwdWJsaWMgY2xhc3MgQ3Jhc2hlZER1bW15UmVzdWx0IGV4dGVuZHMgQWJzdHJhY3RSZXN1bHQgeworICAgIFN0cmluZyBtUmVsYXRpdmVQYXRoOworCisgICAgcHVibGljIENyYXNoZWREdW1teVJlc3VsdChTdHJpbmcgcmVsYXRpdmVQYXRoKSB7CisgICAgICAgIG1SZWxhdGl2ZVBhdGggPSByZWxhdGl2ZVBhdGg7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJ5dGVbXSBnZXRBY3R1YWxJbWFnZVJlc3VsdCgpIHsKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyBnZXRBY3R1YWxUZXh0UmVzdWx0KCkgeworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgQnVuZGxlIGdldEJ1bmRsZSgpIHsKKyAgICAgICAgLyoqIFRPRE86ICAqLworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIGdldERpZmZBc0h0bWwoKSB7CisgICAgICAgIC8qKiBUT0RPOiBQcm9iYWJseSBzaG93IGF0IGxlYXN0IGV4cGVjdGVkIHJlc3VsdHMgKi8KKyAgICAgICAgcmV0dXJuICJPb29wcywgSSBjcmFzaGVkLi4uIjsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIGdldFJlbGF0aXZlUGF0aCgpIHsKKyAgICAgICAgcmV0dXJuIG1SZWxhdGl2ZVBhdGg7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFJlc3VsdENvZGUgZ2V0UmVzdWx0Q29kZSgpIHsKKyAgICAgICAgcmV0dXJuIFJlc3VsdENvZGUuRkFJTF9DUkFTSEVEOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBUZXN0VHlwZSBnZXRUeXBlKCkgeworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvYnRhaW5BY3R1YWxSZXN1bHRzKFdlYlZpZXcgd2VidmlldywgTWVzc2FnZSByZXN1bHRPYnRhaW5lZE1zZykgeworICAgICAgICAvKiogVGhpcyBtZXRob2QgaXMgbm90IGFwcGxpY2FibGUgZm9yIHRoaXMgdHlwZSBvZiByZXN1bHQgKi8KKyAgICAgICAgYXNzZXJ0IGZhbHNlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHNldEV4cGVjdGVkSW1hZ2VSZXN1bHQoYnl0ZVtdIGV4cGVjdGVkUmVzdWx0KSB7CisgICAgICAgIC8qKiBUT0RPICovCisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgc2V0RXhwZWN0ZWRUZXh0UmVzdWx0KFN0cmluZyBleHBlY3RlZFJlc3VsdCkgeworICAgICAgICAvKiogVE9ETyAqLworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0RXhwZWN0ZWRJbWFnZVJlc3VsdFBhdGgoKSB7CisgICAgICAgIC8qKiBUT0RPICovCisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0RXhwZWN0ZWRUZXh0UmVzdWx0UGF0aCgpIHsKKyAgICAgICAgLyoqIFRPRE8gKi8KKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgc2V0RXhwZWN0ZWRJbWFnZVJlc3VsdFBhdGgoU3RyaW5nIHJlbGF0aXZlUGF0aCkgeworICAgICAgICAvKiogVE9ETyAqLworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHNldEV4cGVjdGVkVGV4dFJlc3VsdFBhdGgoU3RyaW5nIHJlbGF0aXZlUGF0aCkgeworICAgICAgICAvKiogVE9ETyAqLworICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9EdW1wUmVuZGVyVHJlZTIvc3JjL2NvbS9hbmRyb2lkL2R1bXByZW5kZXJ0cmVlMi9FdmVudFNlbmRlci5qYXZhIGIvdGVzdHMvRHVtcFJlbmRlclRyZWUyL3NyYy9jb20vYW5kcm9pZC9kdW1wcmVuZGVydHJlZTIvRXZlbnRTZW5kZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YjdjYmM0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvRHVtcFJlbmRlclRyZWUyL3NyYy9jb20vYW5kcm9pZC9kdW1wcmVuZGVydHJlZTIvRXZlbnRTZW5kZXIuamF2YQpAQCAtMCwwICsxLDExMCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQuZHVtcHJlbmRlcnRyZWUyOworCitpbXBvcnQgYW5kcm9pZC53ZWJraXQuV2ViVmlldzsKKworLyoqCisgKiBBIGNsYXNzIHRoYXQgYWN0cyBhcyBhIEpTIGludGVyZmFjZSBmb3Igd2VidmlldyB0byBtb2NrIHZhcmlvdXMgdG91Y2ggZXZlbnRzLAorICogbW91c2UgYWN0aW9ucyBhbmQga2V5IHByZXNzZXMuCisgKgorICogVGhlIG1ldGhvZHMgaGVyZSBqdXN0IGNhbGwgY29ycmVzcG9uZGluZyBtZXRob2RzIG9uIEV2ZW50U2VuZGVySW1wbAorICogdGhhdCBjb250YWlucyB0aGUgbG9naWMgb2YgaG93IHRvIGV4ZWN1dGUgdGhlIG1ldGhvZHMuCisgKi8KK3B1YmxpYyBjbGFzcyBFdmVudFNlbmRlciB7CisgICAgRXZlbnRTZW5kZXJJbXBsIG1FdmVudFNlbmRlckltcGwgPSBuZXcgRXZlbnRTZW5kZXJJbXBsKCk7CisKKyAgICBwdWJsaWMgdm9pZCByZXNldChXZWJWaWV3IHdlYlZpZXcpIHsKKyAgICAgICAgbUV2ZW50U2VuZGVySW1wbC5yZXNldCh3ZWJWaWV3KTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBlbmFibGVET01VSUV2ZW50TG9nZ2luZyhpbnQgZG9tTm9kZSkgeworICAgICAgICBtRXZlbnRTZW5kZXJJbXBsLmVuYWJsZURPTVVJRXZlbnRMb2dnaW5nKGRvbU5vZGUpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGZpcmVLZXlib2FyZEV2ZW50c1RvRWxlbWVudChpbnQgZG9tTm9kZSkgeworICAgICAgICBtRXZlbnRTZW5kZXJJbXBsLmZpcmVLZXlib2FyZEV2ZW50c1RvRWxlbWVudChkb21Ob2RlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBrZXlEb3duKFN0cmluZyBjaGFyYWN0ZXIsIFN0cmluZ1tdIHdpdGhNb2RpZmllcnMpIHsKKyAgICAgICAgbUV2ZW50U2VuZGVySW1wbC5rZXlEb3duKGNoYXJhY3Rlciwgd2l0aE1vZGlmaWVycyk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQga2V5RG93bihTdHJpbmcgY2hhcmFjdGVyKSB7CisgICAgICAgIGtleURvd24oY2hhcmFjdGVyLCBudWxsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBsZWFwRm9yd2FyZChpbnQgbWlsbGlzZWNvbmRzKSB7CisgICAgICAgIG1FdmVudFNlbmRlckltcGwubGVhcEZvcndhcmQobWlsbGlzZWNvbmRzKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBtb3VzZUNsaWNrKCkgeworICAgICAgICBtRXZlbnRTZW5kZXJJbXBsLm1vdXNlQ2xpY2soKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBtb3VzZURvd24oKSB7CisgICAgICAgIG1FdmVudFNlbmRlckltcGwubW91c2VEb3duKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgbW91c2VNb3ZlVG8oaW50IHgsIGludCB5KSB7CisgICAgICAgIG1FdmVudFNlbmRlckltcGwubW91c2VNb3ZlVG8oeCwgeSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgbW91c2VVcCgpIHsKKyAgICAgICAgbUV2ZW50U2VuZGVySW1wbC5tb3VzZVVwKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdG91Y2hTdGFydCgpIHsKKyAgICAgICAgbUV2ZW50U2VuZGVySW1wbC50b3VjaFN0YXJ0KCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgYWRkVG91Y2hQb2ludChpbnQgeCwgaW50IHkpIHsKKyAgICAgICAgbUV2ZW50U2VuZGVySW1wbC5hZGRUb3VjaFBvaW50KHgsIHkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHVwZGF0ZVRvdWNoUG9pbnQoaW50IGlkLCBpbnQgeCwgaW50IHkpIHsKKyAgICAgICAgbUV2ZW50U2VuZGVySW1wbC51cGRhdGVUb3VjaFBvaW50KGlkLCB4LCB5KTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRUb3VjaE1vZGlmaWVyKFN0cmluZyBtb2RpZmllciwgYm9vbGVhbiBlbmFibGVkKSB7CisgICAgICAgIG1FdmVudFNlbmRlckltcGwuc2V0VG91Y2hNb2RpZmllcihtb2RpZmllciwgZW5hYmxlZCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdG91Y2hNb3ZlKCkgeworICAgICAgICBtRXZlbnRTZW5kZXJJbXBsLnRvdWNoTW92ZSgpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHJlbGVhc2VUb3VjaFBvaW50KGludCBpZCkgeworICAgICAgICBtRXZlbnRTZW5kZXJJbXBsLnJlbGVhc2VUb3VjaFBvaW50KGlkKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0b3VjaEVuZCgpIHsKKyAgICAgICAgbUV2ZW50U2VuZGVySW1wbC50b3VjaEVuZCgpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRvdWNoQ2FuY2VsKCkgeworICAgICAgICBtRXZlbnRTZW5kZXJJbXBsLnRvdWNoQ2FuY2VsKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgY2xlYXJUb3VjaFBvaW50cygpIHsKKyAgICAgICAgbUV2ZW50U2VuZGVySW1wbC5jbGVhclRvdWNoUG9pbnRzKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgY2FuY2VsVG91Y2hQb2ludChpbnQgaWQpIHsKKyAgICAgICAgbUV2ZW50U2VuZGVySW1wbC5jYW5jZWxUb3VjaFBvaW50KGlkKTsKKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvRHVtcFJlbmRlclRyZWUyL3NyYy9jb20vYW5kcm9pZC9kdW1wcmVuZGVydHJlZTIvRXZlbnRTZW5kZXJJbXBsLmphdmEgYi90ZXN0cy9EdW1wUmVuZGVyVHJlZTIvc3JjL2NvbS9hbmRyb2lkL2R1bXByZW5kZXJ0cmVlMi9FdmVudFNlbmRlckltcGwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45M2U2MTM3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvRHVtcFJlbmRlclRyZWUyL3NyYy9jb20vYW5kcm9pZC9kdW1wcmVuZGVydHJlZTIvRXZlbnRTZW5kZXJJbXBsLmphdmEKQEAgLTAsMCArMSw1NjMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLmR1bXByZW5kZXJ0cmVlMjsKKworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLk1lc3NhZ2U7CitpbXBvcnQgYW5kcm9pZC5vcy5TeXN0ZW1DbG9jazsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworaW1wb3J0IGFuZHJvaWQudmlldy5LZXlFdmVudDsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuTW90aW9uRXZlbnQ7CitpbXBvcnQgYW5kcm9pZC53ZWJraXQuV2ViVmlldzsKKworaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCisvKioKKyAqIEFuIGltcGxlbWVudGF0aW9uIG9mIEV2ZW50U2VuZGVyCisgKi8KK3B1YmxpYyBjbGFzcyBFdmVudFNlbmRlckltcGwgeworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMT0dfVEFHID0gIkV2ZW50U2VuZGVySW1wbCI7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTVNHX0VOQUJMRV9ET01fVUlfRVZFTlRfTE9HR0lORyA9IDA7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1TR19GSVJFX0tFWUJPQVJEX0VWRU5UU19UT19FTEVNRU5UID0gMTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTVNHX0xFQVBfRk9SV0FSRCA9IDI7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTVNHX0tFWV9ET1dOID0gMzsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNU0dfTU9VU0VfRE9XTiA9IDQ7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1TR19NT1VTRV9VUCA9IDU7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1TR19NT1VTRV9DTElDSyA9IDY7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1TR19NT1VTRV9NT1ZFX1RPID0gNzsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNU0dfQUREX1RPVUNIX1BPSU5UID0gODsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTVNHX1RPVUNIX1NUQVJUID0gOTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTVNHX1VQREFURV9UT1VDSF9QT0lOVCA9IDEwOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNU0dfVE9VQ0hfTU9WRSA9IDExOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNU0dfQ0xFQVJfVE9VQ0hfUE9JTlRTID0gMTI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1TR19UT1VDSF9DQU5DRUwgPSAxMzsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTVNHX1JFTEVBU0VfVE9VQ0hfUE9JTlQgPSAxNDsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTVNHX1RPVUNIX0VORCA9IDE1OworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNU0dfU0VUX1RPVUNIX01PRElGSUVSID0gMTY7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1TR19DQU5DRUxfVE9VQ0hfUE9JTlQgPSAxNzsKKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgVG91Y2hQb2ludCB7CisgICAgICAgIFdlYlZpZXcgbVdlYlZpZXc7CisgICAgICAgIHByaXZhdGUgaW50IG1YOworICAgICAgICBwcml2YXRlIGludCBtWTsKKyAgICAgICAgcHJpdmF0ZSBsb25nIG1Eb3duVGltZTsKKyAgICAgICAgcHJpdmF0ZSBib29sZWFuIG1SZWxlYXNlZCA9IGZhbHNlOworICAgICAgICBwcml2YXRlIGJvb2xlYW4gbU1vdmVkID0gZmFsc2U7CisgICAgICAgIHByaXZhdGUgYm9vbGVhbiBtQ2FuY2VsbGVkID0gZmFsc2U7CisKKyAgICAgICAgcHVibGljIFRvdWNoUG9pbnQoV2ViVmlldyB3ZWJWaWV3LCBpbnQgeCwgaW50IHkpIHsKKyAgICAgICAgICAgIG1XZWJWaWV3ID0gd2ViVmlldzsKKyAgICAgICAgICAgIG1YID0gc2NhbGVYKHgpOworICAgICAgICAgICAgbVkgPSBzY2FsZVkoeSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgaW50IGdldFgoKSB7CisgICAgICAgICAgICByZXR1cm4gbVg7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgaW50IGdldFkoKSB7CisgICAgICAgICAgICByZXR1cm4gbVk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYm9vbGVhbiBoYXNNb3ZlZCgpIHsKKyAgICAgICAgICAgIHJldHVybiBtTW92ZWQ7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBtb3ZlKGludCBuZXdYLCBpbnQgbmV3WSkgeworICAgICAgICAgICAgbVggPSBzY2FsZVgobmV3WCk7CisgICAgICAgICAgICBtWSA9IHNjYWxlWShuZXdZKTsKKyAgICAgICAgICAgIG1Nb3ZlZCA9IHRydWU7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCByZXNldEhhc01vdmVkKCkgeworICAgICAgICAgICAgbU1vdmVkID0gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgbG9uZyBnZXREb3duVGltZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBtRG93blRpbWU7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBzZXREb3duVGltZShsb25nIGRvd25UaW1lKSB7CisgICAgICAgICAgICBtRG93blRpbWUgPSBkb3duVGltZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBib29sZWFuIGlzUmVsZWFzZWQoKSB7CisgICAgICAgICAgICByZXR1cm4gbVJlbGVhc2VkOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgcmVsZWFzZSgpIHsKKyAgICAgICAgICAgIG1SZWxlYXNlZCA9IHRydWU7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc0NhbmNlbGxlZCgpIHsKKyAgICAgICAgICAgIHJldHVybiBtQ2FuY2VsbGVkOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgY2FuY2VsKCkgeworICAgICAgICAgICAgbUNhbmNlbGxlZCA9IHRydWU7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIGludCBzY2FsZVgoaW50IHgpIHsKKyAgICAgICAgICAgIHJldHVybiAoaW50KSh4ICogbVdlYlZpZXcuZ2V0U2NhbGUoKSkgLSBtV2ViVmlldy5nZXRTY3JvbGxYKCk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIGludCBzY2FsZVkoaW50IHkpIHsKKyAgICAgICAgICAgIHJldHVybiAoaW50KSh5ICogbVdlYlZpZXcuZ2V0U2NhbGUoKSkgLSBtV2ViVmlldy5nZXRTY3JvbGxZKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIExpc3Q8VG91Y2hQb2ludD4gbVRvdWNoUG9pbnRzOworICAgIHByaXZhdGUgaW50IG1Ub3VjaE1ldGFTdGF0ZTsKKyAgICBwcml2YXRlIGludCBtTW91c2VYOworICAgIHByaXZhdGUgaW50IG1Nb3VzZVk7CisKKyAgICBwcml2YXRlIFdlYlZpZXcgbVdlYlZpZXc7CisKKyAgICBwcml2YXRlIEhhbmRsZXIgbUV2ZW50U2VuZGVySGFuZGxlciA9IG5ldyBIYW5kbGVyKCkgeworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgaGFuZGxlTWVzc2FnZShNZXNzYWdlIG1zZykgeworICAgICAgICAgICAgVG91Y2hQb2ludCB0b3VjaFBvaW50OworICAgICAgICAgICAgQnVuZGxlIGJ1bmRsZTsKKyAgICAgICAgICAgIEtleUV2ZW50IGV2ZW50OworCisgICAgICAgICAgICBzd2l0Y2ggKG1zZy53aGF0KSB7CisgICAgICAgICAgICAgICAgY2FzZSBNU0dfRU5BQkxFX0RPTV9VSV9FVkVOVF9MT0dHSU5HOgorICAgICAgICAgICAgICAgICAgICAvKiogVE9ETzogaW1wbGVtZW50ICovCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSBNU0dfRklSRV9LRVlCT0FSRF9FVkVOVFNfVE9fRUxFTUVOVDoKKyAgICAgICAgICAgICAgICAgICAgLyoqIFRPRE86IGltcGxlbWVudCAqLworICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGNhc2UgTVNHX0xFQVBfRk9SV0FSRDoKKyAgICAgICAgICAgICAgICAgICAgLyoqIFRPRE86IGltcGxlbWVudCAqLworICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGNhc2UgTVNHX0tFWV9ET1dOOgorICAgICAgICAgICAgICAgICAgICBidW5kbGUgPSAoQnVuZGxlKW1zZy5vYmo7CisgICAgICAgICAgICAgICAgICAgIFN0cmluZyBjaGFyYWN0ZXIgPSBidW5kbGUuZ2V0U3RyaW5nKCJjaGFyYWN0ZXIiKTsKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nW10gd2l0aE1vZGlmaWVycyA9IGJ1bmRsZS5nZXRTdHJpbmdBcnJheSgid2l0aE1vZGlmaWVycyIpOworCisgICAgICAgICAgICAgICAgICAgIGlmICh3aXRoTW9kaWZpZXJzICE9IG51bGwgJiYgd2l0aE1vZGlmaWVycy5sZW5ndGggPiAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHdpdGhNb2RpZmllcnMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGVjdXRlS2V5RXZlbnQoS2V5RXZlbnQuQUNUSU9OX0RPV04sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RpZmllclRvS2V5Q29kZSh3aXRoTW9kaWZpZXJzW2ldKSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZUtleUV2ZW50KEtleUV2ZW50LkFDVElPTl9ET1dOLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXJUb0tleUNvZGUoY2hhcmFjdGVyLnRvTG93ZXJDYXNlKCkudG9DaGFyQXJyYXkoKVswXSkpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIC8qKiBNT1VTRSAqLworCisgICAgICAgICAgICAgICAgY2FzZSBNU0dfTU9VU0VfRE9XTjoKKyAgICAgICAgICAgICAgICAgICAgLyoqIFRPRE86IEltcGxlbWVudCAqLworICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGNhc2UgTVNHX01PVVNFX1VQOgorICAgICAgICAgICAgICAgICAgICAvKiogVE9ETzogSW1wbGVtZW50ICovCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSBNU0dfTU9VU0VfQ0xJQ0s6CisgICAgICAgICAgICAgICAgICAgIC8qKiBUT0RPOiBJbXBsZW1lbnQgKi8KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlIE1TR19NT1VTRV9NT1ZFX1RPOgorICAgICAgICAgICAgICAgICAgICBpbnQgeCA9IG1zZy5hcmcxOworICAgICAgICAgICAgICAgICAgICBpbnQgeSA9IG1zZy5hcmcyOworCisgICAgICAgICAgICAgICAgICAgIGV2ZW50ID0gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHggPiBtTW91c2VYKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBldmVudCA9IG5ldyBLZXlFdmVudChLZXlFdmVudC5BQ1RJT05fRE9XTiwgS2V5RXZlbnQuS0VZQ09ERV9EUEFEX1JJR0hUKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh4IDwgbU1vdXNlWCkgeworICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQgPSBuZXcgS2V5RXZlbnQoS2V5RXZlbnQuQUNUSU9OX0RPV04sIEtleUV2ZW50LktFWUNPREVfRFBBRF9MRUZUKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAoZXZlbnQgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgbVdlYlZpZXcub25LZXlEb3duKGV2ZW50LmdldEtleUNvZGUoKSwgZXZlbnQpOworICAgICAgICAgICAgICAgICAgICAgICAgbVdlYlZpZXcub25LZXlVcChldmVudC5nZXRLZXlDb2RlKCksIGV2ZW50KTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGV2ZW50ID0gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHkgPiBtTW91c2VZKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBldmVudCA9IG5ldyBLZXlFdmVudChLZXlFdmVudC5BQ1RJT05fRE9XTiwgS2V5RXZlbnQuS0VZQ09ERV9EUEFEX0RPV04pOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHkgPCBtTW91c2VZKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBldmVudCA9IG5ldyBLZXlFdmVudChLZXlFdmVudC5BQ1RJT05fRE9XTiwgS2V5RXZlbnQuS0VZQ09ERV9EUEFEX1VQKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAoZXZlbnQgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgbVdlYlZpZXcub25LZXlEb3duKGV2ZW50LmdldEtleUNvZGUoKSwgZXZlbnQpOworICAgICAgICAgICAgICAgICAgICAgICAgbVdlYlZpZXcub25LZXlVcChldmVudC5nZXRLZXlDb2RlKCksIGV2ZW50KTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIG1Nb3VzZVggPSB4OworICAgICAgICAgICAgICAgICAgICBtTW91c2VZID0geTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICAvKiogVE9VQ0ggKi8KKworICAgICAgICAgICAgICAgIGNhc2UgTVNHX0FERF9UT1VDSF9QT0lOVDoKKyAgICAgICAgICAgICAgICAgICAgZ2V0VG91Y2hQb2ludHMoKS5hZGQobmV3IFRvdWNoUG9pbnQobVdlYlZpZXcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXNnLmFyZzEsIG1zZy5hcmcyKSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChnZXRUb3VjaFBvaW50cygpLnNpemUoKSA+IDEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIExvZy53KExPR19UQUcgKyAiOjpNU0dfQUREX1RPVUNIX1BPSU5UIiwgIkFkZGVkIG1vcmUgdGhhbiBvbmUgdG91Y2ggcG9pbnQiKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGNhc2UgTVNHX1RPVUNIX1NUQVJUOgorICAgICAgICAgICAgICAgICAgICAvKioKKyAgICAgICAgICAgICAgICAgICAgICogRklYTUU6IEF0IHRoZSBtb21lbnQgd2UgZG9uJ3Qgc3VwcG9ydCBtdWx0aS10b3VjaC4gSGVuY2UsIHdlIG9ubHkgZXhhbWluZQorICAgICAgICAgICAgICAgICAgICAgKiB0aGUgZmlyc3QgdG91Y2ggcG9pbnQuIEluIGZ1dHVyZSB0aGlzIG1ldGhvZCB3aWxsIG5lZWQgcmV3cml0aW5nLgorICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgaWYgKGdldFRvdWNoUG9pbnRzKCkuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgdG91Y2hQb2ludCA9IGdldFRvdWNoUG9pbnRzKCkuZ2V0KDApOworCisgICAgICAgICAgICAgICAgICAgIHRvdWNoUG9pbnQuc2V0RG93blRpbWUoU3lzdGVtQ2xvY2sudXB0aW1lTWlsbGlzKCkpOworICAgICAgICAgICAgICAgICAgICBleGVjdXRlVG91Y2hFdmVudCh0b3VjaFBvaW50LCBNb3Rpb25FdmVudC5BQ1RJT05fRE9XTik7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSBNU0dfVVBEQVRFX1RPVUNIX1BPSU5UOgorICAgICAgICAgICAgICAgICAgICBidW5kbGUgPSAoQnVuZGxlKW1zZy5vYmo7CisKKyAgICAgICAgICAgICAgICAgICAgaW50IGlkID0gYnVuZGxlLmdldEludCgiaWQiKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGlkID49IGdldFRvdWNoUG9pbnRzKCkuc2l6ZSgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBMb2cudyhMT0dfVEFHICsgIjo6TVNHX1VQREFURV9UT1VDSF9QT0lOVCIsICJUb3VjaFBvaW50IG91dCBvZiBib3VuZHM6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBpZCk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGdldFRvdWNoUG9pbnRzKCkuZ2V0KGlkKS5tb3ZlKGJ1bmRsZS5nZXRJbnQoIngiKSwgYnVuZGxlLmdldEludCgieSIpKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlIE1TR19UT1VDSF9NT1ZFOgorICAgICAgICAgICAgICAgICAgICAvKioKKyAgICAgICAgICAgICAgICAgICAgICogRklYTUU6IEF0IHRoZSBtb21lbnQgd2UgZG9uJ3Qgc3VwcG9ydCBtdWx0aS10b3VjaC4gSGVuY2UsIHdlIG9ubHkgZXhhbWluZQorICAgICAgICAgICAgICAgICAgICAgKiB0aGUgZmlyc3QgdG91Y2ggcG9pbnQuIEluIGZ1dHVyZSB0aGlzIG1ldGhvZCB3aWxsIG5lZWQgcmV3cml0aW5nLgorICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgaWYgKGdldFRvdWNoUG9pbnRzKCkuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgdG91Y2hQb2ludCA9IGdldFRvdWNoUG9pbnRzKCkuZ2V0KDApOworCisgICAgICAgICAgICAgICAgICAgIGlmICghdG91Y2hQb2ludC5oYXNNb3ZlZCgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZVRvdWNoRXZlbnQodG91Y2hQb2ludCwgTW90aW9uRXZlbnQuQUNUSU9OX01PVkUpOworICAgICAgICAgICAgICAgICAgICB0b3VjaFBvaW50LnJlc2V0SGFzTW92ZWQoKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlIE1TR19DQU5DRUxfVE9VQ0hfUE9JTlQ6CisgICAgICAgICAgICAgICAgICAgIGlmIChtc2cuYXJnMSA+PSBnZXRUb3VjaFBvaW50cygpLnNpemUoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgTG9nLncoTE9HX1RBRyArICI6Ok1TR19SRUxFQVNFX1RPVUNIX1BPSU5UIiwgIlRvdWNoUG9pbnQgb3V0IG9mIGJvdW5kczogIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIG1zZy5hcmcxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgZ2V0VG91Y2hQb2ludHMoKS5nZXQobXNnLmFyZzEpLmNhbmNlbCgpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGNhc2UgTVNHX1RPVUNIX0NBTkNFTDoKKyAgICAgICAgICAgICAgICAgICAgLyoqCisgICAgICAgICAgICAgICAgICAgICAqIEZJWE1FOiBBdCB0aGUgbW9tZW50IHdlIGRvbid0IHN1cHBvcnQgbXVsdGktdG91Y2guIEhlbmNlLCB3ZSBvbmx5IGV4YW1pbmUKKyAgICAgICAgICAgICAgICAgICAgICogdGhlIGZpcnN0IHRvdWNoIHBvaW50LiBJbiBmdXR1cmUgdGhpcyBtZXRob2Qgd2lsbCBuZWVkIHJld3JpdGluZy4KKyAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgICAgIGlmIChnZXRUb3VjaFBvaW50cygpLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHRvdWNoUG9pbnQgPSBnZXRUb3VjaFBvaW50cygpLmdldCgwKTsKKworICAgICAgICAgICAgICAgICAgICBpZiAodG91Y2hQb2ludC5pc0NhbmNlbGxlZCgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBleGVjdXRlVG91Y2hFdmVudCh0b3VjaFBvaW50LCBNb3Rpb25FdmVudC5BQ1RJT05fQ0FOQ0VMKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGNhc2UgTVNHX1JFTEVBU0VfVE9VQ0hfUE9JTlQ6CisgICAgICAgICAgICAgICAgICAgIGlmIChtc2cuYXJnMSA+PSBnZXRUb3VjaFBvaW50cygpLnNpemUoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgTG9nLncoTE9HX1RBRyArICI6Ok1TR19SRUxFQVNFX1RPVUNIX1BPSU5UIiwgIlRvdWNoUG9pbnQgb3V0IG9mIGJvdW5kczogIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIG1zZy5hcmcxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgZ2V0VG91Y2hQb2ludHMoKS5nZXQobXNnLmFyZzEpLnJlbGVhc2UoKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlIE1TR19UT1VDSF9FTkQ6CisgICAgICAgICAgICAgICAgICAgIC8qKgorICAgICAgICAgICAgICAgICAgICAgKiBGSVhNRTogQXQgdGhlIG1vbWVudCB3ZSBkb24ndCBzdXBwb3J0IG11bHRpLXRvdWNoLiBIZW5jZSwgd2Ugb25seSBleGFtaW5lCisgICAgICAgICAgICAgICAgICAgICAqIHRoZSBmaXJzdCB0b3VjaCBwb2ludC4gSW4gZnV0dXJlIHRoaXMgbWV0aG9kIHdpbGwgbmVlZCByZXdyaXRpbmcuCisgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICAgICBpZiAoZ2V0VG91Y2hQb2ludHMoKS5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB0b3VjaFBvaW50ID0gZ2V0VG91Y2hQb2ludHMoKS5nZXQoMCk7CisKKyAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZVRvdWNoRXZlbnQodG91Y2hQb2ludCwgTW90aW9uRXZlbnQuQUNUSU9OX1VQKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHRvdWNoUG9pbnQuaXNSZWxlYXNlZCgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBnZXRUb3VjaFBvaW50cygpLnJlbW92ZSgwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRvdWNoUG9pbnQgPSBudWxsOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSBNU0dfU0VUX1RPVUNIX01PRElGSUVSOgorICAgICAgICAgICAgICAgICAgICBidW5kbGUgPSAoQnVuZGxlKW1zZy5vYmo7CisgICAgICAgICAgICAgICAgICAgIFN0cmluZyBtb2RpZmllciA9IGJ1bmRsZS5nZXRTdHJpbmcoIm1vZGlmaWVyIik7CisgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gZW5hYmxlZCA9IGJ1bmRsZS5nZXRCb29sZWFuKCJlbmFibGVkIik7CisKKyAgICAgICAgICAgICAgICAgICAgaW50IG1hc2sgPSAwOworICAgICAgICAgICAgICAgICAgICBpZiAoImFsdCIuZXF1YWxzKG1vZGlmaWVyLnRvTG93ZXJDYXNlKCkpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtYXNrID0gS2V5RXZlbnQuTUVUQV9BTFRfT047CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoInNoaWZ0Ii5lcXVhbHMobW9kaWZpZXIudG9Mb3dlckNhc2UoKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1hc2sgPSBLZXlFdmVudC5NRVRBX1NISUZUX09OOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCJjdHJsIi5lcXVhbHMobW9kaWZpZXIudG9Mb3dlckNhc2UoKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1hc2sgPSBLZXlFdmVudC5NRVRBX1NZTV9PTjsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGlmIChlbmFibGVkKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtVG91Y2hNZXRhU3RhdGUgfD0gbWFzazsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1Ub3VjaE1ldGFTdGF0ZSAmPSB+bWFzazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSBNU0dfQ0xFQVJfVE9VQ0hfUE9JTlRTOgorICAgICAgICAgICAgICAgICAgICBnZXRUb3VjaFBvaW50cygpLmNsZWFyKCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9OworCisgICAgcHVibGljIHZvaWQgcmVzZXQoV2ViVmlldyB3ZWJWaWV3KSB7CisgICAgICAgIG1XZWJWaWV3ID0gd2ViVmlldzsKKyAgICAgICAgbVRvdWNoUG9pbnRzID0gbnVsbDsKKyAgICAgICAgbVRvdWNoTWV0YVN0YXRlID0gMDsKKyAgICAgICAgbU1vdXNlWCA9IDA7CisgICAgICAgIG1Nb3VzZVkgPSAwOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGVuYWJsZURPTVVJRXZlbnRMb2dnaW5nKGludCBkb21Ob2RlKSB7CisgICAgICAgIE1lc3NhZ2UgbXNnID0gbUV2ZW50U2VuZGVySGFuZGxlci5vYnRhaW5NZXNzYWdlKE1TR19FTkFCTEVfRE9NX1VJX0VWRU5UX0xPR0dJTkcpOworICAgICAgICBtc2cuYXJnMSA9IGRvbU5vZGU7CisgICAgICAgIG1zZy5zZW5kVG9UYXJnZXQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBmaXJlS2V5Ym9hcmRFdmVudHNUb0VsZW1lbnQoaW50IGRvbU5vZGUpIHsKKyAgICAgICAgTWVzc2FnZSBtc2cgPSBtRXZlbnRTZW5kZXJIYW5kbGVyLm9idGFpbk1lc3NhZ2UoTVNHX0ZJUkVfS0VZQk9BUkRfRVZFTlRTX1RPX0VMRU1FTlQpOworICAgICAgICBtc2cuYXJnMSA9IGRvbU5vZGU7CisgICAgICAgIG1zZy5zZW5kVG9UYXJnZXQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBsZWFwRm9yd2FyZChpbnQgbWlsbGlzZWNvbmRzKSB7CisgICAgICAgIE1lc3NhZ2UgbXNnID0gbUV2ZW50U2VuZGVySGFuZGxlci5vYnRhaW5NZXNzYWdlKE1TR19MRUFQX0ZPUldBUkQpOworICAgICAgICBtc2cuYXJnMSA9IG1pbGxpc2Vjb25kczsKKyAgICAgICAgbXNnLnNlbmRUb1RhcmdldCgpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGtleURvd24oU3RyaW5nIGNoYXJhY3RlciwgU3RyaW5nW10gd2l0aE1vZGlmaWVycykgeworICAgICAgICBCdW5kbGUgYnVuZGxlID0gbmV3IEJ1bmRsZSgpOworICAgICAgICBidW5kbGUucHV0U3RyaW5nKCJjaGFyYWN0ZXIiLCBjaGFyYWN0ZXIpOworICAgICAgICBidW5kbGUucHV0U3RyaW5nQXJyYXkoIndpdGhNb2RpZmllcnMiLCB3aXRoTW9kaWZpZXJzKTsKKyAgICAgICAgbUV2ZW50U2VuZGVySGFuZGxlci5vYnRhaW5NZXNzYWdlKE1TR19LRVlfRE9XTiwgYnVuZGxlKS5zZW5kVG9UYXJnZXQoKTsKKyAgICB9CisKKyAgICAvKiogTU9VU0UgKi8KKworICAgIHB1YmxpYyB2b2lkIG1vdXNlRG93bigpIHsKKyAgICAgICAgbUV2ZW50U2VuZGVySGFuZGxlci5zZW5kRW1wdHlNZXNzYWdlKE1TR19NT1VTRV9ET1dOKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBtb3VzZVVwKCkgeworICAgICAgICBtRXZlbnRTZW5kZXJIYW5kbGVyLnNlbmRFbXB0eU1lc3NhZ2UoTVNHX01PVVNFX1VQKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBtb3VzZUNsaWNrKCkgeworICAgICAgICBtRXZlbnRTZW5kZXJIYW5kbGVyLnNlbmRFbXB0eU1lc3NhZ2UoTVNHX01PVVNFX0NMSUNLKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBtb3VzZU1vdmVUbyhpbnQgeCwgaW50IHkpIHsKKyAgICAgICAgbUV2ZW50U2VuZGVySGFuZGxlci5vYnRhaW5NZXNzYWdlKE1TR19NT1VTRV9NT1ZFX1RPLCB4LCB5KS5zZW5kVG9UYXJnZXQoKTsKKyAgICB9CisKKyAgICAvKiogVE9VQ0ggKi8KKworICAgIHB1YmxpYyB2b2lkIGFkZFRvdWNoUG9pbnQoaW50IHgsIGludCB5KSB7CisgICAgICAgIG1FdmVudFNlbmRlckhhbmRsZXIub2J0YWluTWVzc2FnZShNU0dfQUREX1RPVUNIX1BPSU5ULCB4LCB5KS5zZW5kVG9UYXJnZXQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0b3VjaFN0YXJ0KCkgeworICAgICAgICBtRXZlbnRTZW5kZXJIYW5kbGVyLnNlbmRFbXB0eU1lc3NhZ2UoTVNHX1RPVUNIX1NUQVJUKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB1cGRhdGVUb3VjaFBvaW50KGludCBpZCwgaW50IHgsIGludCB5KSB7CisgICAgICAgIEJ1bmRsZSBidW5kbGUgPSBuZXcgQnVuZGxlKCk7CisgICAgICAgIGJ1bmRsZS5wdXRJbnQoImlkIiwgaWQpOworICAgICAgICBidW5kbGUucHV0SW50KCJ4IiwgeCk7CisgICAgICAgIGJ1bmRsZS5wdXRJbnQoInkiLCB5KTsKKyAgICAgICAgbUV2ZW50U2VuZGVySGFuZGxlci5vYnRhaW5NZXNzYWdlKE1TR19VUERBVEVfVE9VQ0hfUE9JTlQsIGJ1bmRsZSkuc2VuZFRvVGFyZ2V0KCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdG91Y2hNb3ZlKCkgeworICAgICAgICBtRXZlbnRTZW5kZXJIYW5kbGVyLnNlbmRFbXB0eU1lc3NhZ2UoTVNHX1RPVUNIX01PVkUpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGNhbmNlbFRvdWNoUG9pbnQoaW50IGlkKSB7CisgICAgICAgIE1lc3NhZ2UgbXNnID0gbUV2ZW50U2VuZGVySGFuZGxlci5vYnRhaW5NZXNzYWdlKE1TR19DQU5DRUxfVE9VQ0hfUE9JTlQpOworICAgICAgICBtc2cuYXJnMSA9IGlkOworICAgICAgICBtc2cuc2VuZFRvVGFyZ2V0KCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdG91Y2hDYW5jZWwoKSB7CisgICAgICAgIG1FdmVudFNlbmRlckhhbmRsZXIuc2VuZEVtcHR5TWVzc2FnZShNU0dfVE9VQ0hfQ0FOQ0VMKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCByZWxlYXNlVG91Y2hQb2ludChpbnQgaWQpIHsKKyAgICAgICAgTWVzc2FnZSBtc2cgPSBtRXZlbnRTZW5kZXJIYW5kbGVyLm9idGFpbk1lc3NhZ2UoTVNHX1JFTEVBU0VfVE9VQ0hfUE9JTlQpOworICAgICAgICBtc2cuYXJnMSA9IGlkOworICAgICAgICBtc2cuc2VuZFRvVGFyZ2V0KCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdG91Y2hFbmQoKSB7CisgICAgICAgIG1FdmVudFNlbmRlckhhbmRsZXIuc2VuZEVtcHR5TWVzc2FnZShNU0dfVE9VQ0hfRU5EKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRUb3VjaE1vZGlmaWVyKFN0cmluZyBtb2RpZmllciwgYm9vbGVhbiBlbmFibGVkKSB7CisgICAgICAgIEJ1bmRsZSBidW5kbGUgPSBuZXcgQnVuZGxlKCk7CisgICAgICAgIGJ1bmRsZS5wdXRTdHJpbmcoIm1vZGlmaWVyIiwgbW9kaWZpZXIpOworICAgICAgICBidW5kbGUucHV0Qm9vbGVhbigiZW5hYmxlZCIsIGVuYWJsZWQpOworICAgICAgICBtRXZlbnRTZW5kZXJIYW5kbGVyLm9idGFpbk1lc3NhZ2UoTVNHX1NFVF9UT1VDSF9NT0RJRklFUiwgYnVuZGxlKS5zZW5kVG9UYXJnZXQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBjbGVhclRvdWNoUG9pbnRzKCkgeworICAgICAgICBtRXZlbnRTZW5kZXJIYW5kbGVyLnNlbmRFbXB0eU1lc3NhZ2UoTVNHX0NMRUFSX1RPVUNIX1BPSU5UUyk7CisgICAgfQorCisgICAgcHJpdmF0ZSBMaXN0PFRvdWNoUG9pbnQ+IGdldFRvdWNoUG9pbnRzKCkgeworICAgICAgICBpZiAobVRvdWNoUG9pbnRzID09IG51bGwpIHsKKyAgICAgICAgICAgIG1Ub3VjaFBvaW50cyA9IG5ldyBMaW5rZWRMaXN0PFRvdWNoUG9pbnQ+KCk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gbVRvdWNoUG9pbnRzOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBleGVjdXRlVG91Y2hFdmVudChUb3VjaFBvaW50IHRvdWNoUG9pbnQsIGludCBhY3Rpb24pIHsKKyAgICAgICAgTW90aW9uRXZlbnQgZXZlbnQgPQorICAgICAgICAgICAgICAgIE1vdGlvbkV2ZW50Lm9idGFpbih0b3VjaFBvaW50LmdldERvd25UaW1lKCksIFN5c3RlbUNsb2NrLnVwdGltZU1pbGxpcygpLAorICAgICAgICAgICAgICAgIGFjdGlvbiwgdG91Y2hQb2ludC5nZXRYKCksIHRvdWNoUG9pbnQuZ2V0WSgpLCBtVG91Y2hNZXRhU3RhdGUpOworICAgICAgICBtV2ViVmlldy5vblRvdWNoRXZlbnQoZXZlbnQpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBleGVjdXRlS2V5RXZlbnQoaW50IGFjdGlvbiwgaW50IGtleUNvZGUpIHsKKyAgICAgICAgS2V5RXZlbnQgZXZlbnQgPSBuZXcgS2V5RXZlbnQoYWN0aW9uLCBrZXlDb2RlKTsKKyAgICAgICAgbVdlYlZpZXcub25LZXlEb3duKGV2ZW50LmdldEtleUNvZGUoKSwgZXZlbnQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFzc3VtZXMgbG93ZXJjYXNlIGNoYXJzLCBjYXNlIG5lZWRzIHRvIGJlIGhhbmRsZWQgYnkgY2FsbGluZyBmdW5jdGlvbi4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBpbnQgY2hhclRvS2V5Q29kZShjaGFyIGMpIHsKKyAgICAgICAgLy8gaGFuZGxlIG51bWJlcnMKKyAgICAgICAgaWYgKGMgPj0gJzAnICYmIGMgPD0gJzknKSB7CisgICAgICAgICAgICBpbnQgb2Zmc2V0ID0gYyAtICcwJzsKKyAgICAgICAgICAgIHJldHVybiBLZXlFdmVudC5LRVlDT0RFXzAgKyBvZmZzZXQ7CisgICAgICAgIH0KKworICAgICAgICAvLyBoYW5kbGUgY2hhcmFjdGVycworICAgICAgICBpZiAoYyA+PSAnYScgJiYgYyA8PSAneicpIHsKKyAgICAgICAgICAgIGludCBvZmZzZXQgPSBjIC0gJ2EnOworICAgICAgICAgICAgcmV0dXJuIEtleUV2ZW50LktFWUNPREVfQSArIG9mZnNldDsKKyAgICAgICAgfQorCisgICAgICAgIC8vIGhhbmRsZSBhbGwgb3RoZXJzCisgICAgICAgIHN3aXRjaCAoYykgeworICAgICAgICAgICAgY2FzZSAnKic6CisgICAgICAgICAgICAgICAgcmV0dXJuIEtleUV2ZW50LktFWUNPREVfU1RBUjsKKworICAgICAgICAgICAgY2FzZSAnIyc6CisgICAgICAgICAgICAgICAgcmV0dXJuIEtleUV2ZW50LktFWUNPREVfUE9VTkQ7CisKKyAgICAgICAgICAgIGNhc2UgJywnOgorICAgICAgICAgICAgICAgIHJldHVybiBLZXlFdmVudC5LRVlDT0RFX0NPTU1BOworCisgICAgICAgICAgICBjYXNlICcuJzoKKyAgICAgICAgICAgICAgICByZXR1cm4gS2V5RXZlbnQuS0VZQ09ERV9QRVJJT0Q7CisKKyAgICAgICAgICAgIGNhc2UgJ1x0JzoKKyAgICAgICAgICAgICAgICByZXR1cm4gS2V5RXZlbnQuS0VZQ09ERV9UQUI7CisKKyAgICAgICAgICAgIGNhc2UgJyAnOgorICAgICAgICAgICAgICAgIHJldHVybiBLZXlFdmVudC5LRVlDT0RFX1NQQUNFOworCisgICAgICAgICAgICBjYXNlICdcbic6CisgICAgICAgICAgICAgICAgcmV0dXJuIEtleUV2ZW50LktFWUNPREVfRU5URVI7CisKKyAgICAgICAgICAgIGNhc2UgJ1xiJzoKKyAgICAgICAgICAgIGNhc2UgMHg3RjoKKyAgICAgICAgICAgICAgICByZXR1cm4gS2V5RXZlbnQuS0VZQ09ERV9ERUw7CisKKyAgICAgICAgICAgIGNhc2UgJ34nOgorICAgICAgICAgICAgICAgIHJldHVybiBLZXlFdmVudC5LRVlDT0RFX0dSQVZFOworCisgICAgICAgICAgICBjYXNlICctJzoKKyAgICAgICAgICAgICAgICByZXR1cm4gS2V5RXZlbnQuS0VZQ09ERV9NSU5VUzsKKworICAgICAgICAgICAgY2FzZSAnPSc6CisgICAgICAgICAgICAgICAgcmV0dXJuIEtleUV2ZW50LktFWUNPREVfRVFVQUxTOworCisgICAgICAgICAgICBjYXNlICcoJzoKKyAgICAgICAgICAgICAgICByZXR1cm4gS2V5RXZlbnQuS0VZQ09ERV9MRUZUX0JSQUNLRVQ7CisKKyAgICAgICAgICAgIGNhc2UgJyknOgorICAgICAgICAgICAgICAgIHJldHVybiBLZXlFdmVudC5LRVlDT0RFX1JJR0hUX0JSQUNLRVQ7CisKKyAgICAgICAgICAgIGNhc2UgJ1xcJzoKKyAgICAgICAgICAgICAgICByZXR1cm4gS2V5RXZlbnQuS0VZQ09ERV9CQUNLU0xBU0g7CisKKyAgICAgICAgICAgIGNhc2UgJzsnOgorICAgICAgICAgICAgICAgIHJldHVybiBLZXlFdmVudC5LRVlDT0RFX1NFTUlDT0xPTjsKKworICAgICAgICAgICAgY2FzZSAnXCcnOgorICAgICAgICAgICAgICAgIHJldHVybiBLZXlFdmVudC5LRVlDT0RFX0FQT1NUUk9QSEU7CisKKyAgICAgICAgICAgIGNhc2UgJy8nOgorICAgICAgICAgICAgICAgIHJldHVybiBLZXlFdmVudC5LRVlDT0RFX1NMQVNIOworCisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHJldHVybiBjOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgaW50IG1vZGlmaWVyVG9LZXlDb2RlKFN0cmluZyBtb2RpZmllcikgeworICAgICAgICBpZiAobW9kaWZpZXIuZXF1YWxzKCJjdHJsS2V5IikpIHsKKyAgICAgICAgICAgIHJldHVybiBLZXlFdmVudC5LRVlDT0RFX0FMVF9MRUZUOworICAgICAgICB9IGVsc2UgaWYgKG1vZGlmaWVyLmVxdWFscygic2hpZnRLZXkiKSkgeworICAgICAgICAgICAgcmV0dXJuIEtleUV2ZW50LktFWUNPREVfU0hJRlRfTEVGVDsKKyAgICAgICAgfSBlbHNlIGlmIChtb2RpZmllci5lcXVhbHMoImFsdEtleSIpKSB7CisgICAgICAgICAgICByZXR1cm4gS2V5RXZlbnQuS0VZQ09ERV9TWU07CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gS2V5RXZlbnQuS0VZQ09ERV9VTktOT1dOOworICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9EdW1wUmVuZGVyVHJlZTIvc3JjL2NvbS9hbmRyb2lkL2R1bXByZW5kZXJ0cmVlMi9GaWxlRmlsdGVyLmphdmEgYi90ZXN0cy9EdW1wUmVuZGVyVHJlZTIvc3JjL2NvbS9hbmRyb2lkL2R1bXByZW5kZXJ0cmVlMi9GaWxlRmlsdGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWJiZjY0YQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL0R1bXBSZW5kZXJUcmVlMi9zcmMvY29tL2FuZHJvaWQvZHVtcHJlbmRlcnRyZWUyL0ZpbGVGaWx0ZXIuamF2YQpAQCAtMCwwICsxLDMwMyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLmR1bXByZW5kZXJ0cmVlMjsKKworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CisKK2ltcG9ydCBjb20uYW5kcm9pZC5kdW1wcmVuZGVydHJlZTIuZm9yd2FyZGVyLkZvcndhcmRlck1hbmFnZXI7CisKK2ltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkUmVhZGVyOworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbVJlYWRlcjsKK2ltcG9ydCBqYXZhLmlvLlN0cmluZ1JlYWRlcjsKK2ltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247CitpbXBvcnQgamF2YS5uZXQuVVJMOworaW1wb3J0IGphdmEubmV0LlVSTENvbm5lY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5TZXQ7CisKKy8qKgorICogQSB1dGlsaXR5IHRvIGZpbHRlciBvdXQgc29tZSBmaWxlcy9kaXJlY3RvcmllcyBmcm9tIHRoZSB2aWV3cyBhbmQgdGVzdHMgdGhhdCBydW4uCisgKi8KK3B1YmxpYyBjbGFzcyBGaWxlRmlsdGVyIHsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTE9HX1RBRyA9ICJGaWxlRmlsdGVyIjsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBURVNUX0VYUEVDVEFUSU9OU19UWFRfUEFUSCA9CisgICAgICAgICAgICAicGxhdGZvcm0vYW5kcm9pZC90ZXN0X2V4cGVjdGF0aW9ucy50eHQiOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEhUVFBfVEVTVFNfUEFUSCA9ICJodHRwL3Rlc3RzLyI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNTTF9QQVRIID0gInNzbC8iOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRPS0VOX0NSQVNIID0gIkNSQVNIIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVE9LRU5fRkFJTCA9ICJGQUlMIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVE9LRU5fU0xPVyA9ICJTTE9XIjsKKworICAgIHByaXZhdGUgZmluYWwgU2V0PFN0cmluZz4gbUNyYXNoTGlzdCA9IG5ldyBIYXNoU2V0PFN0cmluZz4oKTsKKyAgICBwcml2YXRlIGZpbmFsIFNldDxTdHJpbmc+IG1GYWlsTGlzdCA9IG5ldyBIYXNoU2V0PFN0cmluZz4oKTsKKyAgICBwcml2YXRlIGZpbmFsIFNldDxTdHJpbmc+IG1TbG93TGlzdCA9IG5ldyBIYXNoU2V0PFN0cmluZz4oKTsKKworICAgIHB1YmxpYyBGaWxlRmlsdGVyKCkgeworICAgICAgICBsb2FkVGVzdEV4cGVjdGF0aW9ucygpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyB0cmltVHJhaWxpbmdTbGFzaElmUHJlc2VudChTdHJpbmcgcGF0aCkgeworICAgICAgICBGaWxlIGZpbGUgPSBuZXcgRmlsZShwYXRoKTsKKyAgICAgICAgcmV0dXJuIGZpbGUuZ2V0UGF0aCgpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGxvYWRUZXN0RXhwZWN0YXRpb25zKCkgeworICAgICAgICBVUkwgdXJsID0gbnVsbDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHVybCA9IG5ldyBVUkwoRm9yd2FyZGVyTWFuYWdlci5nZXRIb3N0U2NoZW1lUG9ydChmYWxzZSkgKyAiTGF5b3V0VGVzdHMvIiArCisgICAgICAgICAgICAgICAgICAgIFRFU1RfRVhQRUNUQVRJT05TX1RYVF9QQVRIKTsKKyAgICAgICAgfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGFzc2VydCBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSA9IG51bGw7CisgICAgICAgICAgICBCdWZmZXJlZFJlYWRlciBidWZmZXJlZFJlYWRlciA9IG51bGw7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGJ1ZmZlcmVkUmVhZGVyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKG5ldyBTdHJpbmdSZWFkZXIobmV3IFN0cmluZygKKyAgICAgICAgICAgICAgICAgICAgICAgIEZzVXRpbHMucmVhZERhdGFGcm9tVXJsKHVybCkpKSk7CisKKyAgICAgICAgICAgICAgICBTdHJpbmcgbGluZTsKKyAgICAgICAgICAgICAgICBTdHJpbmcgZW50cnk7CisgICAgICAgICAgICAgICAgU3RyaW5nW10gcGFydHM7CisgICAgICAgICAgICAgICAgU3RyaW5nIHBhdGg7CisgICAgICAgICAgICAgICAgU2V0PFN0cmluZz4gdG9rZW5zOworICAgICAgICAgICAgICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgICAgICAgICAgICAgIGxpbmUgPSBidWZmZXJlZFJlYWRlci5yZWFkTGluZSgpOworICAgICAgICAgICAgICAgICAgICBpZiAobGluZSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIC8qKiBSZW1vdmUgdGhlIGNvbW1lbnQgYW5kIHRyaW0gKi8KKyAgICAgICAgICAgICAgICAgICAgZW50cnkgPSBsaW5lLnNwbGl0KCIvLyIsIDIpWzBdLnRyaW0oKTsKKworICAgICAgICAgICAgICAgICAgICAvKiogT21pdCBlbXB0eSBsaW5lcywgYWR2YW5jZSB0byBuZXh0IGxpbmUgKi8KKyAgICAgICAgICAgICAgICAgICAgaWYgKGVudHJ5LmlzRW1wdHkoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAvKiogU3BsaXQgb24gd2hpdGVzcGFjZSBpbnRvIHBhdGggcGFydCBhbmQgdGhlIHJlc3QgKi8KKyAgICAgICAgICAgICAgICAgICAgcGFydHMgPSBlbnRyeS5zcGxpdCgiXFxzIiwgMik7CisKKyAgICAgICAgICAgICAgICAgICAgLyoqIEF0IHRoaXMgcG9pbnQgcGFydHMubGVuZ3RoID49IDEgKi8KKyAgICAgICAgICAgICAgICAgICAgaWYgKHBhcnRzLmxlbmd0aCA9PSAxKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBMb2cudyhMT0dfVEFHICsgIjo6cmVsb2FkQ29uZmlndXJhdGlvbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUaGVyZSBhcmUgbm8gb3B0aW9ucyBzcGVjaWZpZWQgZm9yIHRoZSB0ZXN0ISIpOworICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBwYXRoID0gdHJpbVRyYWlsaW5nU2xhc2hJZlByZXNlbnQocGFydHNbMF0pOworCisgICAgICAgICAgICAgICAgICAgIC8qKiBTcGxpdCBvbiB3aGl0ZXNwYWNlICovCisgICAgICAgICAgICAgICAgICAgIHRva2VucyA9IG5ldyBIYXNoU2V0PFN0cmluZz4oQXJyYXlzLmFzTGlzdChwYXJ0c1sxXS5zcGxpdCgiXFxzIiwgMCkpKTsKKworICAgICAgICAgICAgICAgICAgICAvKiogQ2hvc2UgdGhlIHJpZ2h0IGNvbGxlY3Rpb25zIHRvIGFkZCB0byAqLworICAgICAgICAgICAgICAgICAgICBpZiAodG9rZW5zLmNvbnRhaW5zKFRPS0VOX0NSQVNIKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgbUNyYXNoTGlzdC5hZGQocGF0aCk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qKiBJZiB0ZXN0IGlzIG9uIHNraXAgbGlzdCB3ZSBpZ25vcmUgYW55IGZ1cnRoZXIgb3B0aW9ucyAqLworICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBpZiAodG9rZW5zLmNvbnRhaW5zKFRPS0VOX0ZBSUwpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtRmFpbExpc3QuYWRkKHBhdGgpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmICh0b2tlbnMuY29udGFpbnMoVE9LRU5fU0xPVykpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1TbG93TGlzdC5hZGQocGF0aCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgIGlmIChpbnB1dFN0cmVhbSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGlucHV0U3RyZWFtLmNsb3NlKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChidWZmZXJlZFJlYWRlciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGJ1ZmZlcmVkUmVhZGVyLmNsb3NlKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgTG9nLncoTE9HX1RBRywgInJlbG9hZENvbmZpZ3VyYXRpb24oKTogRmlsZSBub3QgZm91bmQ6ICIgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIExvZy5lKExPR19UQUcsICJ1cmw9IiArIHVybCwgZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDaGVja3MgaWYgdGVzdCBpcyBleHBlY3RlZCB0byBjcmFzaC4KKyAgICAgKgorICAgICAqIDxwPgorICAgICAqIFBhdGggZ2l2ZW4gc2hvdWxkIHJlbGF0aXZlIHdpdGhpbiBMYXlvdXRUZXN0cyBmb2xkZXIsIGUuZy4gZmFzdC9kb20vZm9vLmh0bWwKKyAgICAgKgorICAgICAqIEBwYXJhbSB0ZXN0UGF0aAorICAgICAqICAgICAgICAgICAgLSBhIHJlbGF0aXZlIHBhdGggd2l0aGluIExheW91dFRlc3RzIGZvbGRlcgorICAgICAqIEByZXR1cm4gaWYgdGhlIHRlc3QgaXMgc3VwcG9zZWQgdG8gYmUgc2tpcHBlZAorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzQ3Jhc2goU3RyaW5nIHRlc3RQYXRoKSB7CisgICAgICAgIGZvciAoU3RyaW5nIHByZWZpeCA6IGdldFByZWZpeGVzKHRlc3RQYXRoKSkgeworICAgICAgICAgICAgaWYgKG1DcmFzaExpc3QuY29udGFpbnMocHJlZml4KSkgeworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8qKgorICAgICAqIENoZWNrcyBpZiB0ZXN0IHJlc3VsdCBpcyBzdXBwb3NlZCB0byBiZSAiZmFpbGVkIi4KKyAgICAgKgorICAgICAqIDxwPgorICAgICAqIFBhdGggZ2l2ZW4gc2hvdWxkIHJlbGF0aXZlIHdpdGhpbiBMYXlvdXRUZXN0cyBmb2xkZXIsIGUuZy4gZmFzdC9kb20vZm9vLmh0bWwKKyAgICAgKgorICAgICAqIEBwYXJhbSB0ZXN0UGF0aAorICAgICAqICAgICAgICAgICAgLSBhIHJlbGF0aXZlIHBhdGggd2l0aGluIExheW91dFRlc3RzIGZvbGRlcgorICAgICAqIEByZXR1cm4gaWYgdGhlIHRlc3QgcmVzdWx0IGlzIHN1cHBvc2VkIHRvIGJlICJmYWlsZWQiCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNGYWlsKFN0cmluZyB0ZXN0UGF0aCkgeworICAgICAgICBmb3IgKFN0cmluZyBwcmVmaXggOiBnZXRQcmVmaXhlcyh0ZXN0UGF0aCkpIHsKKyAgICAgICAgICAgIGlmIChtRmFpbExpc3QuY29udGFpbnMocHJlZml4KSkgeworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8qKgorICAgICAqIENoZWNrcyBpZiB0ZXN0IGlzIHNsb3cgYW5kIHNob3VsZCBoYXZlIHRpbWVvdXQgaW5jcmVhc2VkLgorICAgICAqCisgICAgICogPHA+CisgICAgICogUGF0aCBnaXZlbiBzaG91bGQgcmVsYXRpdmUgd2l0aGluIExheW91dFRlc3RzIGZvbGRlciwgZS5nLiBmYXN0L2RvbS9mb28uaHRtbAorICAgICAqCisgICAgICogQHBhcmFtIHRlc3RQYXRoCisgICAgICogICAgICAgICAgICAtIGEgcmVsYXRpdmUgcGF0aCB3aXRoaW4gTGF5b3V0VGVzdHMgZm9sZGVyCisgICAgICogQHJldHVybiBpZiB0aGUgdGVzdCBpcyBzbG93IGFuZCBzaG91bGQgaGF2ZSB0aW1lb3V0IGluY3JlYXNlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc1Nsb3coU3RyaW5nIHRlc3RQYXRoKSB7CisgICAgICAgIGZvciAoU3RyaW5nIHByZWZpeCA6IGdldFByZWZpeGVzKHRlc3RQYXRoKSkgeworICAgICAgICAgICAgaWYgKG1TbG93TGlzdC5jb250YWlucyhwcmVmaXgpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgbGlzdCBvZiBhbGwgcGF0aCBwcmVmaXhlcyBvZiB0aGUgZ2l2ZW4gcGF0aC4KKyAgICAgKgorICAgICAqIDxwPgorICAgICAqIGUuZy4gdGhpcy9pcy9hL3BhdGggcmV0dXJucyB0aGUgbGlzdDogdGhpcyB0aGlzL2lzIHRoaXMvaXMvYSB0aGlzL2lzL2EvcGF0aAorICAgICAqCisgICAgICogQHBhcmFtIHBhdGgKKyAgICAgKiBAcmV0dXJuIHRoZSBsaXN0IG9mIGFsbCBwYXRoIHByZWZpeGVzIG9mIHRoZSBnaXZlbiBwYXRoLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIExpc3Q8U3RyaW5nPiBnZXRQcmVmaXhlcyhTdHJpbmcgcGF0aCkgeworICAgICAgICBGaWxlIGZpbGUgPSBuZXcgRmlsZShwYXRoKTsKKyAgICAgICAgTGlzdDxTdHJpbmc+IHByZWZpeGVzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KDgpOworCisgICAgICAgIGRvIHsKKyAgICAgICAgICAgIHByZWZpeGVzLmFkZChmaWxlLmdldFBhdGgoKSk7CisgICAgICAgICAgICBmaWxlID0gZmlsZS5nZXRQYXJlbnRGaWxlKCk7CisgICAgICAgIH0gd2hpbGUgKGZpbGUgIT0gbnVsbCk7CisKKyAgICAgICAgcmV0dXJuIHByZWZpeGVzOworICAgIH0KKworICAgIC8qKgorICAgICAqIENoZWNrcyBpZiB0aGUgZGlyZWN0b3J5IG1heSBjb250YWluIHRlc3RzIG9yIGNvbnRhaW5zIGp1c3QgaGVscGVyIGZpbGVzLgorICAgICAqCisgICAgICogQHBhcmFtIGRpck5hbWUKKyAgICAgKiBAcmV0dXJuCisgICAgICogICAgICBpZiB0aGUgZGlyZWN0b3J5IG1heSBjb250YWluIHRlc3RzCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzVGVzdERpcihTdHJpbmcgZGlyTmFtZSkgeworICAgICAgICByZXR1cm4gKCFkaXJOYW1lLmVxdWFscygic2NyaXB0LXRlc3RzIikKKyAgICAgICAgICAgICAgICAmJiAhZGlyTmFtZS5lcXVhbHMoInJlc291cmNlcyIpICYmICFkaXJOYW1lLnN0YXJ0c1dpdGgoIi4iKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2hlY2tzIGlmIHRoZSBmaWxlIGlzIGEgdGVzdC4KKyAgICAgKiBDdXJyZW50bHkgd2UgcnVuIC5odG1sIGFuZCAueGh0bWwgdGVzdHMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdGVzdE5hbWUKKyAgICAgKiBAcmV0dXJuCisgICAgICogICAgICBpZiB0aGUgZmlsZSBpcyBhIHRlc3QKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNUZXN0RmlsZShTdHJpbmcgdGVzdE5hbWUpIHsKKyAgICAgICAgcmV0dXJuIHRlc3ROYW1lLmVuZHNXaXRoKCIuaHRtbCIpIHx8IHRlc3ROYW1lLmVuZHNXaXRoKCIueGh0bWwiKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gYSBVUkwgb2YgdGhlIHRlc3Qgb24gdGhlIHNlcnZlci4KKyAgICAgKgorICAgICAqIEBwYXJhbSByZWxhdGl2ZVBhdGgKKyAgICAgKiBAcmV0dXJuIGEgVVJMIG9mIHRoZSB0ZXN0IG9uIHRoZSBzZXJ2ZXIKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFVSTCBnZXRVcmwoU3RyaW5nIHJlbGF0aXZlUGF0aCkgeworICAgICAgICBTdHJpbmcgdXJsQmFzZSA9IEZvcndhcmRlck1hbmFnZXIuZ2V0SG9zdFNjaGVtZVBvcnQoZmFsc2UpOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBVUkwgaXMgZm9ybWVkIGRpZmZlcmVudGx5IGZvciBIVFRQIHZzIG5vbi1IVFRQIHRlc3RzLCBiZWNhdXNlIEhUVFAgdGVzdHMKKyAgICAgICAgICogZXhwZWN0IGRpZmZlcmVudCBkb2N1bWVudCByb290LiBTZWUgcnVuX2FwYWNoZTIucHkgYW5kIC5jb25mIGZpbGUgZm9yIGRldGFpbHMKKyAgICAgICAgICovCisgICAgICAgIGlmIChyZWxhdGl2ZVBhdGguc3RhcnRzV2l0aChIVFRQX1RFU1RTX1BBVEgpKSB7CisgICAgICAgICAgICByZWxhdGl2ZVBhdGggPSByZWxhdGl2ZVBhdGguc3Vic3RyaW5nKEhUVFBfVEVTVFNfUEFUSC5sZW5ndGgoKSk7CisgICAgICAgICAgICBpZiAocmVsYXRpdmVQYXRoLnN0YXJ0c1dpdGgoU1NMX1BBVEgpKSB7CisgICAgICAgICAgICAgICAgdXJsQmFzZSA9IEZvcndhcmRlck1hbmFnZXIuZ2V0SG9zdFNjaGVtZVBvcnQodHJ1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZWxhdGl2ZVBhdGggPSAiTGF5b3V0VGVzdHMvIiArIHJlbGF0aXZlUGF0aDsKKyAgICAgICAgfQorCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IFVSTCh1cmxCYXNlICsgcmVsYXRpdmVQYXRoKTsKKyAgICAgICAgfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIExvZy5lKExPR19UQUcsICJNYWxmb3JtZWQgVVJMISIsIGUpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgLyoqCisgICAgICogSWYgdGhlIHBhdGggY29udGFpbnMgZXh0ZW5zaW9uIChlLmcgLmZvbyBhdCB0aGUgZW5kIG9mIHRoZSBmaWxlKSB0aGVuIGl0IGNoYW5nZXMKKyAgICAgKiB0aGlzICguZm9vKSBpbnRvIG5ld0VuZGluZyAoc28gaXQgaGFzIHRvIGNvbnRhaW4gdGhlIGRvdCBpZiB3ZSB3YW50IHRvIHByZXNlcnZlIGl0KS4KKyAgICAgKgorICAgICAqIDxwPklmIHRoZSBwYXRoIGRvZXNuJ3QgY29udGFpbiBhbiBleHRlbnNpb24sIGl0IGFkZHMgdGhlIGVuZGluZyB0byB0aGUgcGF0aC4KKyAgICAgKgorICAgICAqIEBwYXJhbSByZWxhdGl2ZVBhdGgKKyAgICAgKiBAcGFyYW0gbmV3RW5kaW5nCisgICAgICogQHJldHVybgorICAgICAqICAgICAgYSBuZXcgcGF0aCwgY29udGFpbmluZyB0aGUgbmV3RXh0ZW5zaW9uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgc2V0UGF0aEVuZGluZyhTdHJpbmcgcmVsYXRpdmVQYXRoLCBTdHJpbmcgbmV3RW5kaW5nKSB7CisgICAgICAgIGludCBkb3RQb3MgPSByZWxhdGl2ZVBhdGgubGFzdEluZGV4T2YoJy4nKTsKKyAgICAgICAgaWYgKGRvdFBvcyA9PSAtMSkgeworICAgICAgICAgICAgcmV0dXJuIHJlbGF0aXZlUGF0aCArIG5ld0VuZGluZzsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiByZWxhdGl2ZVBhdGguc3Vic3RyaW5nKDAsIGRvdFBvcykgKyBuZXdFbmRpbmc7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvRHVtcFJlbmRlclRyZWUyL3NyYy9jb20vYW5kcm9pZC9kdW1wcmVuZGVydHJlZTIvRnNVdGlscy5qYXZhIGIvdGVzdHMvRHVtcFJlbmRlclRyZWUyL3NyYy9jb20vYW5kcm9pZC9kdW1wcmVuZGVydHJlZTIvRnNVdGlscy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ0Mzg4MTEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9EdW1wUmVuZGVyVHJlZTIvc3JjL2NvbS9hbmRyb2lkL2R1bXByZW5kZXJ0cmVlMi9Gc1V0aWxzLmphdmEKQEAgLTAsMCArMSwyNTEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLmR1bXByZW5kZXJ0cmVlMjsKKworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CisKK2ltcG9ydCBjb20uYW5kcm9pZC5kdW1wcmVuZGVydHJlZTIuZm9yd2FyZGVyLkZvcndhcmRlck1hbmFnZXI7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmh0dHAuSHR0cEVudGl0eTsKK2ltcG9ydCBvcmcuYXBhY2hlLmh0dHAuSHR0cFJlc3BvbnNlOworaW1wb3J0IG9yZy5hcGFjaGUuaHR0cC5IdHRwU3RhdHVzOworaW1wb3J0IG9yZy5hcGFjaGUuaHR0cC5jbGllbnQuSHR0cENsaWVudDsKK2ltcG9ydCBvcmcuYXBhY2hlLmh0dHAuY2xpZW50LlJlc3BvbnNlSGFuZGxlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmh0dHAuY2xpZW50Lm1ldGhvZHMuSHR0cEdldDsKK2ltcG9ydCBvcmcuYXBhY2hlLmh0dHAuY29ubi5DbGllbnRDb25uZWN0aW9uTWFuYWdlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmh0dHAuY29ubi5zY2hlbWUuUGxhaW5Tb2NrZXRGYWN0b3J5OworaW1wb3J0IG9yZy5hcGFjaGUuaHR0cC5jb25uLnNjaGVtZS5TY2hlbWU7CitpbXBvcnQgb3JnLmFwYWNoZS5odHRwLmNvbm4uc2NoZW1lLlNjaGVtZVJlZ2lzdHJ5OworaW1wb3J0IG9yZy5hcGFjaGUuaHR0cC5jb25uLnNzbC5TU0xTb2NrZXRGYWN0b3J5OworaW1wb3J0IG9yZy5hcGFjaGUuaHR0cC5pbXBsLmNsaWVudC5EZWZhdWx0SHR0cENsaWVudDsKK2ltcG9ydCBvcmcuYXBhY2hlLmh0dHAuaW1wbC5jb25uLnRzY2NtLlRocmVhZFNhZmVDbGllbnRDb25uTWFuYWdlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmh0dHAucGFyYW1zLkJhc2ljSHR0cFBhcmFtczsKK2ltcG9ydCBvcmcuYXBhY2hlLmh0dHAucGFyYW1zLkh0dHBDb25uZWN0aW9uUGFyYW1zOworaW1wb3J0IG9yZy5hcGFjaGUuaHR0cC5wYXJhbXMuSHR0cFBhcmFtczsKK2ltcG9ydCBvcmcuYXBhY2hlLmh0dHAudXRpbC5FbnRpdHlVdGlsczsKKworaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRSZWFkZXI7CitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbVJlYWRlcjsKK2ltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247CitpbXBvcnQgamF2YS5uZXQuU29ja2V0VGltZW91dEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5ldC5VUkw7CitpbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKKy8qKgorICoKKyAqLworcHVibGljIGNsYXNzIEZzVXRpbHMgeworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIExPR19UQUcgPSAiRnNVdGlscyI7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0NSSVBUX1VSTCA9IEZvcndhcmRlck1hbmFnZXIuZ2V0SG9zdFNjaGVtZVBvcnQoZmFsc2UpICsKKyAgICAgICAgICAgICJXZWJLaXRUb29scy9EdW1wUmVuZGVyVHJlZS9hbmRyb2lkL2dldF9sYXlvdXRfdGVzdHNfZGlyX2NvbnRlbnRzLnBocCI7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgSFRUUF9USU1FT1VUX01TID0gNTAwMDsKKworICAgIHByaXZhdGUgc3RhdGljIEh0dHBDbGllbnQgc0h0dHBDbGllbnQ7CisKKyAgICBwcml2YXRlIHN0YXRpYyBIdHRwQ2xpZW50IGdldEh0dHBDbGllbnQoKSB7CisgICAgICAgIGlmIChzSHR0cENsaWVudCA9PSBudWxsKSB7CisgICAgICAgICAgICBIdHRwUGFyYW1zIHBhcmFtcyA9IG5ldyBCYXNpY0h0dHBQYXJhbXMoKTsKKworICAgICAgICAgICAgU2NoZW1lUmVnaXN0cnkgc2NoZW1lUmVnaXN0cnkgPSBuZXcgU2NoZW1lUmVnaXN0cnkoKTsKKyAgICAgICAgICAgIHNjaGVtZVJlZ2lzdHJ5LnJlZ2lzdGVyKG5ldyBTY2hlbWUoImh0dHAiLCBQbGFpblNvY2tldEZhY3RvcnkuZ2V0U29ja2V0RmFjdG9yeSgpLAorICAgICAgICAgICAgICAgICAgICBGb3J3YXJkZXJNYW5hZ2VyLkhUVFBfUE9SVCkpOworICAgICAgICAgICAgc2NoZW1lUmVnaXN0cnkucmVnaXN0ZXIobmV3IFNjaGVtZSgiaHR0cHMiLCBTU0xTb2NrZXRGYWN0b3J5LmdldFNvY2tldEZhY3RvcnkoKSwKKyAgICAgICAgICAgICAgICAgICAgRm9yd2FyZGVyTWFuYWdlci5IVFRQU19QT1JUKSk7CisKKyAgICAgICAgICAgIENsaWVudENvbm5lY3Rpb25NYW5hZ2VyIGNvbm5lY3Rpb25NYW5hZ2VyID0gbmV3IFRocmVhZFNhZmVDbGllbnRDb25uTWFuYWdlcihwYXJhbXMsCisgICAgICAgICAgICAgICAgICAgIHNjaGVtZVJlZ2lzdHJ5KTsKKyAgICAgICAgICAgIHNIdHRwQ2xpZW50ID0gbmV3IERlZmF1bHRIdHRwQ2xpZW50KGNvbm5lY3Rpb25NYW5hZ2VyLCBwYXJhbXMpOworICAgICAgICAgICAgSHR0cENvbm5lY3Rpb25QYXJhbXMuc2V0U29UaW1lb3V0KHNIdHRwQ2xpZW50LmdldFBhcmFtcygpLCBIVFRQX1RJTUVPVVRfTVMpOworICAgICAgICAgICAgSHR0cENvbm5lY3Rpb25QYXJhbXMuc2V0Q29ubmVjdGlvblRpbWVvdXQoc0h0dHBDbGllbnQuZ2V0UGFyYW1zKCksIEhUVFBfVElNRU9VVF9NUyk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHNIdHRwQ2xpZW50OworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB3cml0ZURhdGFUb1N0b3JhZ2UoRmlsZSBmaWxlLCBieXRlW10gYnl0ZXMsIGJvb2xlYW4gYXBwZW5kKSB7CisgICAgICAgIExvZy5kKExPR19UQUcsICJ3cml0ZURhdGFUb1N0b3JhZ2UoKTogIiArIGZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgT3V0cHV0U3RyZWFtIG91dHB1dFN0cmVhbSA9IG51bGw7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGZpbGUuZ2V0UGFyZW50RmlsZSgpLm1rZGlycygpOworICAgICAgICAgICAgICAgIGZpbGUuY3JlYXRlTmV3RmlsZSgpOworICAgICAgICAgICAgICAgIExvZy5kKExPR19UQUcsICJ3cml0ZURhdGFUb1N0b3JhZ2UoKTogRmlsZSBjcmVhdGVkOiAiICsgZmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSk7CisgICAgICAgICAgICAgICAgb3V0cHV0U3RyZWFtID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0oZmlsZSwgYXBwZW5kKTsKKyAgICAgICAgICAgICAgICBvdXRwdXRTdHJlYW0ud3JpdGUoYnl0ZXMpOworICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICBpZiAob3V0cHV0U3RyZWFtICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgb3V0cHV0U3RyZWFtLmNsb3NlKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBMb2cuZShMT0dfVEFHLCAiZmlsZS5nZXRBYnNvbHV0ZVBhdGg9IiArIGZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkgKyAiIGFwcGVuZD0iICsgYXBwZW5kLAorICAgICAgICAgICAgICAgICAgICBlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgYnl0ZVtdIHJlYWREYXRhRnJvbVN0b3JhZ2UoRmlsZSBmaWxlKSB7CisgICAgICAgIGlmICghZmlsZS5leGlzdHMoKSkgeworICAgICAgICAgICAgTG9nLmQoTE9HX1RBRywgInJlYWREYXRhRnJvbVN0b3JhZ2UoKTogRmlsZSBkb2VzIG5vdCBleGlzdDogIgorICAgICAgICAgICAgICAgICAgICArIGZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkpOworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKworICAgICAgICBieXRlW10gYnl0ZXMgPSBudWxsOworICAgICAgICB0cnkgeworICAgICAgICAgICAgRmlsZUlucHV0U3RyZWFtIGZpcyA9IG51bGw7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGZpcyA9IG5ldyBGaWxlSW5wdXRTdHJlYW0oZmlsZSk7CisgICAgICAgICAgICAgICAgYnl0ZXMgPSBuZXcgYnl0ZVsoaW50KWZpbGUubGVuZ3RoKCldOworICAgICAgICAgICAgICAgIGZpcy5yZWFkKGJ5dGVzKTsKKyAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgaWYgKGZpcyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGZpcy5jbG9zZSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgTG9nLmUoTE9HX1RBRywgImZpbGUuZ2V0QWJzb2x1dGVQYXRoPSIgKyBmaWxlLmdldEFic29sdXRlUGF0aCgpLCBlKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBieXRlczsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGJ5dGVbXSByZWFkRGF0YUZyb21VcmwoVVJMIHVybCkgeworICAgICAgICBpZiAodXJsID09IG51bGwpIHsKKyAgICAgICAgICAgIExvZy53KExPR19UQUcsICJyZWFkRGF0YUZyb21VcmwoKTogdXJsIGlzIG51bGwhIik7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIEh0dHBHZXQgaHR0cFJlcXVlc3QgPSBuZXcgSHR0cEdldCh1cmwudG9TdHJpbmcoKSk7CisgICAgICAgIFJlc3BvbnNlSGFuZGxlcjxieXRlW10+IGhhbmRsZXIgPSBuZXcgUmVzcG9uc2VIYW5kbGVyPGJ5dGVbXT4oKSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBieXRlW10gaGFuZGxlUmVzcG9uc2UoSHR0cFJlc3BvbnNlIHJlc3BvbnNlKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAgICAgICAgIGlmIChyZXNwb25zZS5nZXRTdGF0dXNMaW5lKCkuZ2V0U3RhdHVzQ29kZSgpICE9IEh0dHBTdGF0dXMuU0NfT0spIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIEh0dHBFbnRpdHkgZW50aXR5ID0gcmVzcG9uc2UuZ2V0RW50aXR5KCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIChlbnRpdHkgPT0gbnVsbCA/IG51bGwgOiBFbnRpdHlVdGlscy50b0J5dGVBcnJheShlbnRpdHkpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKworICAgICAgICBieXRlW10gYnl0ZXMgPSBudWxsOworICAgICAgICB0cnkgeworICAgICAgICAgICAgLyoqCisgICAgICAgICAgICAgKiBUT0RPOiBOb3QgZXhhY3RseSBzdXJlIHdoeSBzb21lIHJlcXVlc3RzIGhhbmcgaW5kZWZpbml0ZWx5LCBidXQgYWRkaW5nIHRoaXMKKyAgICAgICAgICAgICAqIHRpbWVvdXQgKGluIHN0YXRpYyBnZXR0ZXIgZm9yIGh0dHAgY2xpZW50KSBpbiBsb29wIGhlbHBzLgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBib29sZWFuIHRpbWVkT3V0OworICAgICAgICAgICAgZG8geworICAgICAgICAgICAgICAgIHRpbWVkT3V0ID0gZmFsc2U7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgYnl0ZXMgPSBnZXRIdHRwQ2xpZW50KCkuZXhlY3V0ZShodHRwUmVxdWVzdCwgaGFuZGxlcik7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoU29ja2V0VGltZW91dEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIHRpbWVkT3V0ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgTG9nLncoTE9HX1RBRywgIkV4cGVjdGVkIFNvY2tldFRpbWVvdXRFeGNlcHRpb246ICIgKyB1cmwsIGUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gd2hpbGUgKHRpbWVkT3V0KTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgTG9nLmUoTE9HX1RBRywgInVybD0iICsgdXJsLCBlKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBieXRlczsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIExpc3Q8U3RyaW5nPiBnZXRMYXlvdXRUZXN0c0RpckNvbnRlbnRzKFN0cmluZyBkaXJSZWxhdGl2ZVBhdGgsIGJvb2xlYW4gcmVjdXJzZSwKKyAgICAgICAgICAgIGJvb2xlYW4gbW9kZSkgeworICAgICAgICBTdHJpbmcgbW9kZVN0cmluZyA9IChtb2RlID8gImZvbGRlcnMiIDogImZpbGVzIik7CisKKyAgICAgICAgVVJMIHVybCA9IG51bGw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICB1cmwgPSBuZXcgVVJMKFNDUklQVF9VUkwgKworICAgICAgICAgICAgICAgICAgICAiP3BhdGg9IiArIGRpclJlbGF0aXZlUGF0aCArCisgICAgICAgICAgICAgICAgICAgICImcmVjdXJzZT0iICsgcmVjdXJzZSArCisgICAgICAgICAgICAgICAgICAgICImbW9kZT0iICsgbW9kZVN0cmluZyk7CisgICAgICAgIH0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBMb2cuZShMT0dfVEFHLCAicGF0aD0iICsgZGlyUmVsYXRpdmVQYXRoICsgIiByZWN1cnNlPSIgKyByZWN1cnNlICsgIiBtb2RlPSIgKworICAgICAgICAgICAgICAgICAgICBtb2RlU3RyaW5nLCBlKTsKKyAgICAgICAgICAgIHJldHVybiBuZXcgTGlua2VkTGlzdDxTdHJpbmc+KCk7CisgICAgICAgIH0KKworICAgICAgICBIdHRwR2V0IGh0dHBSZXF1ZXN0ID0gbmV3IEh0dHBHZXQodXJsLnRvU3RyaW5nKCkpOworICAgICAgICBSZXNwb25zZUhhbmRsZXI8TGlua2VkTGlzdDxTdHJpbmc+PiBoYW5kbGVyID0gbmV3IFJlc3BvbnNlSGFuZGxlcjxMaW5rZWRMaXN0PFN0cmluZz4+KCkgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgTGlua2VkTGlzdDxTdHJpbmc+IGhhbmRsZVJlc3BvbnNlKEh0dHBSZXNwb25zZSByZXNwb25zZSkKKyAgICAgICAgICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgICAgICAgICBMaW5rZWRMaXN0PFN0cmluZz4gbGluZXMgPSBuZXcgTGlua2VkTGlzdDxTdHJpbmc+KCk7CisKKyAgICAgICAgICAgICAgICBpZiAocmVzcG9uc2UuZ2V0U3RhdHVzTGluZSgpLmdldFN0YXR1c0NvZGUoKSAhPSBIdHRwU3RhdHVzLlNDX09LKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBsaW5lczsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgSHR0cEVudGl0eSBlbnRpdHkgPSByZXNwb25zZS5nZXRFbnRpdHkoKTsKKyAgICAgICAgICAgICAgICBpZiAoZW50aXR5ID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxpbmVzOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIEJ1ZmZlcmVkUmVhZGVyIHJlYWRlciA9CisgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQnVmZmVyZWRSZWFkZXIobmV3IElucHV0U3RyZWFtUmVhZGVyKGVudGl0eS5nZXRDb250ZW50KCkpKTsKKyAgICAgICAgICAgICAgICBTdHJpbmcgbGluZTsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICB3aGlsZSAoKGxpbmUgPSByZWFkZXIucmVhZExpbmUoKSkgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgbGluZXMuYWRkKGxpbmUpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHJlYWRlciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZWFkZXIuY2xvc2UoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHJldHVybiBsaW5lczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuIGdldEh0dHBDbGllbnQoKS5leGVjdXRlKGh0dHBSZXF1ZXN0LCBoYW5kbGVyKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgTG9nLmUoTE9HX1RBRywgInVybD0iICsgdXJsLCBlKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBuZXcgTGlua2VkTGlzdDxTdHJpbmc+KCk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyB2b2lkIGNsb3NlSW5wdXRTdHJlYW0oSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0pIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGlmIChpbnB1dFN0cmVhbSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgaW5wdXRTdHJlYW0uY2xvc2UoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgTG9nLmUoTE9HX1RBRywgIkNvdWxkbid0IGNsb3NlIHN0cmVhbSEiLCBlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBjbG9zZU91dHB1dFN0cmVhbShPdXRwdXRTdHJlYW0gb3V0cHV0U3RyZWFtKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpZiAob3V0cHV0U3RyZWFtICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBvdXRwdXRTdHJlYW0uY2xvc2UoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgTG9nLmUoTE9HX1RBRywgIkNvdWxkbid0IGNsb3NlIHN0cmVhbSEiLCBlKTsKKyAgICAgICAgfQorICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9EdW1wUmVuZGVyVHJlZTIvc3JjL2NvbS9hbmRyb2lkL2R1bXByZW5kZXJ0cmVlMi9MYXlvdXRUZXN0Q29udHJvbGxlci5qYXZhIGIvdGVzdHMvRHVtcFJlbmRlclRyZWUyL3NyYy9jb20vYW5kcm9pZC9kdW1wcmVuZGVydHJlZTIvTGF5b3V0VGVzdENvbnRyb2xsZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjA4ZTJkCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvRHVtcFJlbmRlclRyZWUyL3NyYy9jb20vYW5kcm9pZC9kdW1wcmVuZGVydHJlZTIvTGF5b3V0VGVzdENvbnRyb2xsZXIuamF2YQpAQCAtMCwwICsxLDExNiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQuZHVtcHJlbmRlcnRyZWUyOworCitpbXBvcnQgYW5kcm9pZC5uZXQuVXJpOworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CitpbXBvcnQgYW5kcm9pZC53ZWJraXQuTW9ja0dlb2xvY2F0aW9uOworaW1wb3J0IGFuZHJvaWQud2Via2l0LldlYlN0b3JhZ2U7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CisKKy8qKgorICogQSBjbGFzcyB0aGF0IGlzIHJlZ2lzdGVyZWQgYXMgSlMgaW50ZXJmYWNlIGZvciB3ZWJ2aWV3IGluIExheW91dFRlc3RFeGVjdXRvcgorICovCitwdWJsaWMgY2xhc3MgTGF5b3V0VGVzdENvbnRyb2xsZXIgeworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMT0dfVEFHID0gIkxheW91dFRlc3RDb250cm9sbGVyIjsKKworICAgIExheW91dFRlc3RzRXhlY3V0b3IgbUxheW91dFRlc3RzRXhlY3V0b3I7CisKKyAgICBwdWJsaWMgTGF5b3V0VGVzdENvbnRyb2xsZXIoTGF5b3V0VGVzdHNFeGVjdXRvciBsYXlvdXRUZXN0c0V4ZWN1dG9yKSB7CisgICAgICAgIG1MYXlvdXRUZXN0c0V4ZWN1dG9yID0gbGF5b3V0VGVzdHNFeGVjdXRvcjsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBjbGVhckFsbERhdGFiYXNlcygpIHsKKyAgICAgICAgTG9nLmkoTE9HX1RBRywgImNsZWFyQWxsRGF0YWJhc2VzKCkgY2FsbGVkIik7CisgICAgICAgIFdlYlN0b3JhZ2UuZ2V0SW5zdGFuY2UoKS5kZWxldGVBbGxEYXRhKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZHVtcEFzVGV4dCgpIHsKKyAgICAgICAgZHVtcEFzVGV4dChmYWxzZSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZHVtcEFzVGV4dChib29sZWFuIGVuYWJsZVBpeGVsVGVzdCkgeworICAgICAgICBtTGF5b3V0VGVzdHNFeGVjdXRvci5kdW1wQXNUZXh0KGVuYWJsZVBpeGVsVGVzdCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZHVtcENoaWxkRnJhbWVzQXNUZXh0KCkgeworICAgICAgICBtTGF5b3V0VGVzdHNFeGVjdXRvci5kdW1wQ2hpbGRGcmFtZXNBc1RleHQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBkdW1wRGF0YWJhc2VDYWxsYmFja3MoKSB7CisgICAgICAgIG1MYXlvdXRUZXN0c0V4ZWN1dG9yLmR1bXBEYXRhYmFzZUNhbGxiYWNrcygpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIG5vdGlmeURvbmUoKSB7CisgICAgICAgIG1MYXlvdXRUZXN0c0V4ZWN1dG9yLm5vdGlmeURvbmUoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBvdmVycmlkZVByZWZlcmVuY2UoU3RyaW5nIGtleSwgYm9vbGVhbiB2YWx1ZSkgeworICAgICAgICBtTGF5b3V0VGVzdHNFeGVjdXRvci5vdmVycmlkZVByZWZlcmVuY2Uoa2V5LCB2YWx1ZSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0QXBwQ2FjaGVNYXhpbXVtU2l6ZShsb25nIHNpemUpIHsKKyAgICAgICAgTG9nLmkoTE9HX1RBRywgInNldEFwcENhY2hlTWF4aW11bVNpemUoKSBjYWxsZWQgd2l0aDogIiArIHNpemUpOworICAgICAgICBXZWJTdG9yYWdlLmdldEluc3RhbmNlKCkuc2V0QXBwQ2FjaGVNYXhpbXVtU2l6ZShzaXplKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRDYW5PcGVuV2luZG93cygpIHsKKyAgICAgICAgbUxheW91dFRlc3RzRXhlY3V0b3Iuc2V0Q2FuT3BlbldpbmRvd3MoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXREYXRhYmFzZVF1b3RhKGxvbmcgcXVvdGEpIHsKKyAgICAgICAgLyoqIFRPRE86IFJlc2V0IHRoaXMgYmVmb3JlIGV2ZXJ5IHRlc3QhICovCisgICAgICAgIExvZy5pKExPR19UQUcsICJzZXREYXRhYmFzZVF1b3RhKCkgY2FsbGVkIHdpdGg6ICIgKyBxdW90YSk7CisgICAgICAgIFdlYlN0b3JhZ2UuZ2V0SW5zdGFuY2UoKS5zZXRRdW90YUZvck9yaWdpbihVcmkuZnJvbUZpbGUobmV3IEZpbGUoIiIpKS50b1N0cmluZygpLAorICAgICAgICAgICAgICAgIHF1b3RhKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRHZW9sb2NhdGlvblBlcm1pc3Npb24oYm9vbGVhbiBhbGxvdykgeworICAgICAgICBtTGF5b3V0VGVzdHNFeGVjdXRvci5zZXRHZW9sb2NhdGlvblBlcm1pc3Npb24oYWxsb3cpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldE1vY2tEZXZpY2VPcmllbnRhdGlvbihib29sZWFuIGNhblByb3ZpZGVBbHBoYSwgZG91YmxlIGFscGhhLAorICAgICAgICAgICAgYm9vbGVhbiBjYW5Qcm92aWRlQmV0YSwgZG91YmxlIGJldGEsIGJvb2xlYW4gY2FuUHJvdmlkZUdhbW1hLCBkb3VibGUgZ2FtbWEpIHsKKyAgICAgICAgLy8gQ29uZmlndXJhdGlvbiBpcyBpbiBXZWJLaXQsIHNvIHN0YXkgb24gV2ViQ29yZSB0aHJlYWQsIGJ1dCBnbyB2aWEgTGF5b3V0VGVzdHNFeGVjdXRvcgorICAgICAgICAvLyBhcyB3ZSBuZWVkIGFjY2VzcyB0byB0aGUgV2Vidmlldy4KKyAgICAgICAgTG9nLmkoTE9HX1RBRywgInNldE1vY2tEZXZpY2VPcmllbnRhdGlvbigiICsgY2FuUHJvdmlkZUFscGhhICsKKyAgICAgICAgICAgICAgICAiLCAiICsgYWxwaGEgKyAiLCAiICsgY2FuUHJvdmlkZUJldGEgKyAiLCAiICsgYmV0YSArICIsICIgKyBjYW5Qcm92aWRlR2FtbWEgKworICAgICAgICAgICAgICAgICIsICIgKyBnYW1tYSArICIpIik7CisgICAgICAgIG1MYXlvdXRUZXN0c0V4ZWN1dG9yLnNldE1vY2tEZXZpY2VPcmllbnRhdGlvbigKKyAgICAgICAgICAgICAgICBjYW5Qcm92aWRlQWxwaGEsIGFscGhhLCBjYW5Qcm92aWRlQmV0YSwgYmV0YSwgY2FuUHJvdmlkZUdhbW1hLCBnYW1tYSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0TW9ja0dlb2xvY2F0aW9uRXJyb3IoaW50IGNvZGUsIFN0cmluZyBtZXNzYWdlKSB7CisgICAgICAgIExvZy5pKExPR19UQUcsICJzZXRNb2NrR2VvbG9jYXRpb25FcnJvcigpOiAiICsgImNvZGU9IiArIGNvZGUgKyAiIG1lc3NhZ2U9IiArIG1lc3NhZ2UpOworICAgICAgICBNb2NrR2VvbG9jYXRpb24uZ2V0SW5zdGFuY2UoKS5zZXRFcnJvcihjb2RlLCBtZXNzYWdlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRNb2NrR2VvbG9jYXRpb25Qb3NpdGlvbihkb3VibGUgbGF0aXR1ZGUsIGRvdWJsZSBsb25naXR1ZGUsIGRvdWJsZSBhY2N1cmFjeSkgeworICAgICAgICBMb2cuaShMT0dfVEFHLCAic2V0TW9ja0dlb2xvY2F0aW9uUG9zaXRpb24oKTogIiArICJsYXRpdHVkZT0iICsgbGF0aXR1ZGUgKworICAgICAgICAgICAgICAgICIgbG9uZ2l0dWRlPSIgKyBsb25naXR1ZGUgKyAiIGFjY3VyYWN5PSIgKyBhY2N1cmFjeSk7CisgICAgICAgIE1vY2tHZW9sb2NhdGlvbi5nZXRJbnN0YW5jZSgpLnNldFBvc2l0aW9uKGxhdGl0dWRlLCBsb25naXR1ZGUsIGFjY3VyYWN5KTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRYU1NBdWRpdG9yRW5hYmxlZChib29sZWFuIGZsYWcpIHsKKyAgICAgICAgbUxheW91dFRlc3RzRXhlY3V0b3Iuc2V0WFNTQXVkaXRvckVuYWJsZWQoZmxhZyk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgd2FpdFVudGlsRG9uZSgpIHsKKyAgICAgICAgbUxheW91dFRlc3RzRXhlY3V0b3Iud2FpdFVudGlsRG9uZSgpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL0R1bXBSZW5kZXJUcmVlMi9zcmMvY29tL2FuZHJvaWQvZHVtcHJlbmRlcnRyZWUyL0xheW91dFRlc3RzRXhlY3V0b3IuamF2YSBiL3Rlc3RzL0R1bXBSZW5kZXJUcmVlMi9zcmMvY29tL2FuZHJvaWQvZHVtcHJlbmRlcnRyZWUyL0xheW91dFRlc3RzRXhlY3V0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YTgyZjg0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvRHVtcFJlbmRlclRyZWUyL3NyYy9jb20vYW5kcm9pZC9kdW1wcmVuZGVydHJlZTIvTGF5b3V0VGVzdHNFeGVjdXRvci5qYXZhCkBAIC0wLDAgKzEsNjc3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5kdW1wcmVuZGVydHJlZTI7CisKK2ltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eTsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29tcG9uZW50TmFtZTsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5TZXJ2aWNlQ29ubmVjdGlvbjsKK2ltcG9ydCBhbmRyb2lkLm5ldC5Vcmk7CitpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CitpbXBvcnQgYW5kcm9pZC5vcy5FbnZpcm9ubWVudDsKK2ltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5JQmluZGVyOworaW1wb3J0IGFuZHJvaWQub3MuTWVzc2FnZTsKK2ltcG9ydCBhbmRyb2lkLm9zLk1lc3NlbmdlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLlBvd2VyTWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLlByb2Nlc3M7CitpbXBvcnQgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb247CitpbXBvcnQgYW5kcm9pZC5vcy5Qb3dlck1hbmFnZXIuV2FrZUxvY2s7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuV2luZG93OworaW1wb3J0IGFuZHJvaWQud2Via2l0LkNvbnNvbGVNZXNzYWdlOworaW1wb3J0IGFuZHJvaWQud2Via2l0LkpzUHJvbXB0UmVzdWx0OworaW1wb3J0IGFuZHJvaWQud2Via2l0LkpzUmVzdWx0OworaW1wb3J0IGFuZHJvaWQud2Via2l0LldlYkNocm9tZUNsaWVudDsKK2ltcG9ydCBhbmRyb2lkLndlYmtpdC5XZWJTZXR0aW5nczsKK2ltcG9ydCBhbmRyb2lkLndlYmtpdC5XZWJWaWV3OworaW1wb3J0IGFuZHJvaWQud2Via2l0LldlYlZpZXdDbGllbnQ7CitpbXBvcnQgYW5kcm9pZC53ZWJraXQuR2VvbG9jYXRpb25QZXJtaXNzaW9uczsKK2ltcG9ydCBhbmRyb2lkLndlYmtpdC5XZWJTdG9yYWdlLlF1b3RhVXBkYXRlcjsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmxhbmcuVGhyZWFkLlVuY2F1Z2h0RXhjZXB0aW9uSGFuZGxlcjsKK2ltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247CitpbXBvcnQgamF2YS5uZXQuVVJMOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCisvKioKKyAqIFRoaXMgYWN0aXZpdHkgZXhlY3V0ZXMgdGhlIHRlc3QuIEl0IGNvbnRhaW5zIFdlYlZpZXcgYW5kIGxvZ2ljIG9mIExheW91dFRlc3RDb250cm9sbGVyCisgKiBmdW5jdGlvbnMuIEl0IHJ1bnMgaW4gYSBzZXBhcmF0ZSBwcm9jZXNzIGFuZCBzZW5kcyB0aGUgcmVzdWx0cyBvZiBydW5uaW5nIHRoZSB0ZXN0CisgKiB0byBNYW5hZ2VyU2VydmljZS4gVGhlIHJlYXNvbiB3aHkgaXMgdG8gaGFuZGxlIGNyYXNoaW5nICh0ZXN0IHRoYXQgY3Jhc2hlcyBicmluZ3MgZG93bgorICogd2hvbGUgcHJvY2VzcyB3aXRoIGl0KS4KKyAqLworcHVibGljIGNsYXNzIExheW91dFRlc3RzRXhlY3V0b3IgZXh0ZW5kcyBBY3Rpdml0eSB7CisKKyAgICBwcml2YXRlIGVudW0gQ3VycmVudFN0YXRlIHsKKyAgICAgICAgSURMRSwKKyAgICAgICAgUkVOREVSSU5HX1BBR0UsCisgICAgICAgIFdBSVRJTkdfRk9SX0FTWU5DSFJPTk9VU19URVNULAorICAgICAgICBPQlRBSU5JTkdfUkVTVUxUOworCisgICAgICAgIHB1YmxpYyBib29sZWFuIGlzUnVubmluZ1N0YXRlKCkgeworICAgICAgICAgICAgcmV0dXJuIHRoaXMgPT0gQ3VycmVudFN0YXRlLlJFTkRFUklOR19QQUdFIHx8CisgICAgICAgICAgICAgICAgICAgIHRoaXMgPT0gQ3VycmVudFN0YXRlLldBSVRJTkdfRk9SX0FTWU5DSFJPTk9VU19URVNUOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIExPR19UQUcgPSAiTGF5b3V0VGVzdEV4ZWN1dG9yIjsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVFJBX1RFU1RTX0xJU1QgPSAiVGVzdHNMaXN0IjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRSQV9URVNUX0lOREVYID0gIlRlc3RJbmRleCI7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTVNHX0FDVFVBTF9SRVNVTFRfT0JUQUlORUQgPSAwOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNU0dfVEVTVF9USU1FRF9PVVQgPSAxOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IERFRkFVTFRfVElNRV9PVVRfTVMgPSAxNSAqIDEwMDA7CisKKyAgICAvKiogQSBsaXN0IG9mIHRlc3RzIHRoYXQgcmVtYWluIHRvIHJ1biBzaW5jZSBsYXN0IGNyYXNoICovCisgICAgcHJpdmF0ZSBMaXN0PFN0cmluZz4gbVRlc3RzTGlzdDsKKworICAgIC8qKgorICAgICAqIFRoaXMgaXMgYSBudW1iZXIgb2YgY3VycmVudGx5IHJ1bm5pbmcgdGVzdC4gSXQgaXMgMC1iYXNlZCBhbmQgZG9lc24ndCByZXNldCBhZnRlcgorICAgICAqIHRoZSBjcmFzaC4gSW5pdGlhbCBpbmRleCBpcyBwYXNzZWQgdG8gTGF5b3V0VGVzdHNFeGVjdXRlciBpbiB0aGUgaW50ZW50IHRoYXQgc3RhcnRzCisgICAgICogaXQuCisgICAgICovCisgICAgcHJpdmF0ZSBpbnQgbUN1cnJlbnRUZXN0SW5kZXg7CisKKyAgICAvKiogVGhlIHRvdGFsIG51bWJlciBvZiB0ZXN0cyB0byBydW4sIGRvZXNuJ3QgcmVzZXQgYWZ0ZXIgY3Jhc2ggKi8KKyAgICBwcml2YXRlIGludCBtVG90YWxUZXN0Q291bnQ7CisKKyAgICBwcml2YXRlIFdlYlZpZXcgbUN1cnJlbnRXZWJWaWV3OworICAgIHByaXZhdGUgU3RyaW5nIG1DdXJyZW50VGVzdFJlbGF0aXZlUGF0aDsKKyAgICBwcml2YXRlIFN0cmluZyBtQ3VycmVudFRlc3RVcmk7CisgICAgcHJpdmF0ZSBDdXJyZW50U3RhdGUgbUN1cnJlbnRTdGF0ZSA9IEN1cnJlbnRTdGF0ZS5JRExFOworCisgICAgcHJpdmF0ZSBib29sZWFuIG1DdXJyZW50VGVzdFRpbWVkT3V0OworICAgIHByaXZhdGUgQWJzdHJhY3RSZXN1bHQgbUN1cnJlbnRSZXN1bHQ7CisgICAgcHJpdmF0ZSBBZGRpdGlvbmFsVGV4dE91dHB1dCBtQ3VycmVudEFkZGl0aW9uYWxUZXh0T3V0cHV0OworCisgICAgcHJpdmF0ZSBMYXlvdXRUZXN0Q29udHJvbGxlciBtTGF5b3V0VGVzdENvbnRyb2xsZXIgPSBuZXcgTGF5b3V0VGVzdENvbnRyb2xsZXIodGhpcyk7CisgICAgcHJpdmF0ZSBib29sZWFuIG1DYW5PcGVuV2luZG93czsKKyAgICBwcml2YXRlIGJvb2xlYW4gbUR1bXBEYXRhYmFzZUNhbGxiYWNrczsKKyAgICBwcml2YXRlIGJvb2xlYW4gbUlzR2VvbG9jYXRpb25QZXJtaXNzaW9uU2V0OworICAgIHByaXZhdGUgYm9vbGVhbiBtR2VvbG9jYXRpb25QZXJtaXNzaW9uOworICAgIHByaXZhdGUgTWFwPEdlb2xvY2F0aW9uUGVybWlzc2lvbnMuQ2FsbGJhY2ssIFN0cmluZz4gbVBlbmRpbmdHZW9sb2NhdGlvblBlcm1pc3Npb25DYWxsYmFja3M7CisKKyAgICBwcml2YXRlIEV2ZW50U2VuZGVyIG1FdmVudFNlbmRlciA9IG5ldyBFdmVudFNlbmRlcigpOworCisgICAgcHJpdmF0ZSBXYWtlTG9jayBtU2NyZWVuRGltTG9jazsKKworICAgIC8qKiBDT01NVU5JQ0FUSU9OIFdJVEggTWFuYWdlclNlcnZpY2UgKi8KKworICAgIHByaXZhdGUgTWVzc2VuZ2VyIG1NYW5hZ2VyU2VydmljZU1lc3NlbmdlcjsKKworICAgIHByaXZhdGUgU2VydmljZUNvbm5lY3Rpb24gbVNlcnZpY2VDb25uZWN0aW9uID0gbmV3IFNlcnZpY2VDb25uZWN0aW9uKCkgeworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBvblNlcnZpY2VDb25uZWN0ZWQoQ29tcG9uZW50TmFtZSBuYW1lLCBJQmluZGVyIHNlcnZpY2UpIHsKKyAgICAgICAgICAgIG1NYW5hZ2VyU2VydmljZU1lc3NlbmdlciA9IG5ldyBNZXNzZW5nZXIoc2VydmljZSk7CisgICAgICAgICAgICBzdGFydFRlc3RzKCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgb25TZXJ2aWNlRGlzY29ubmVjdGVkKENvbXBvbmVudE5hbWUgbmFtZSkgeworICAgICAgICAgICAgLyoqIFRPRE8gKi8KKyAgICAgICAgfQorICAgIH07CisKKyAgICBwcml2YXRlIGZpbmFsIEhhbmRsZXIgbVJlc3VsdEhhbmRsZXIgPSBuZXcgSGFuZGxlcigpIHsKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIGhhbmRsZU1lc3NhZ2UoTWVzc2FnZSBtc2cpIHsKKyAgICAgICAgICAgIHN3aXRjaCAobXNnLndoYXQpIHsKKyAgICAgICAgICAgICAgICBjYXNlIE1TR19BQ1RVQUxfUkVTVUxUX09CVEFJTkVEOgorICAgICAgICAgICAgICAgICAgICBvbkFjdHVhbFJlc3VsdHNPYnRhaW5lZCgpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGNhc2UgTVNHX1RFU1RfVElNRURfT1VUOgorICAgICAgICAgICAgICAgICAgICBvblRlc3RUaW1lZE91dCgpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfTsKKworICAgIC8qKiBXRUJWSUVXIENPTkZJR1VSQVRJT04gKi8KKworICAgIHByaXZhdGUgV2ViVmlld0NsaWVudCBtV2ViVmlld0NsaWVudCA9IG5ldyBXZWJWaWV3Q2xpZW50KCkgeworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgb25QYWdlRmluaXNoZWQoV2ViVmlldyB2aWV3LCBTdHJpbmcgdXJsKSB7CisgICAgICAgICAgICAvKiogU29tZSB0ZXN0cyBmaXJlIHVwIG1hbnkgcGFnZSBsb2Fkcywgd2UgZG9uJ3Qgd2FudCB0byBkZXRlY3QgdGhlbSAqLworICAgICAgICAgICAgaWYgKCF1cmwuZXF1YWxzKG1DdXJyZW50VGVzdFVyaSkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChtQ3VycmVudFN0YXRlID09IEN1cnJlbnRTdGF0ZS5SRU5ERVJJTkdfUEFHRSkgeworICAgICAgICAgICAgICAgIG9uVGVzdEZpbmlzaGVkKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9OworCisgICAgcHJpdmF0ZSBXZWJDaHJvbWVDbGllbnQgbVdlYkNocm9tZUNsaWVudCA9IG5ldyBXZWJDaHJvbWVDbGllbnQoKSB7CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBvbkV4Y2VlZGVkRGF0YWJhc2VRdW90YShTdHJpbmcgdXJsLCBTdHJpbmcgZGF0YWJhc2VJZGVudGlmaWVyLAorICAgICAgICAgICAgICAgIGxvbmcgY3VycmVudFF1b3RhLCBsb25nIGVzdGltYXRlZFNpemUsIGxvbmcgdG90YWxVc2VkUXVvdGEsCisgICAgICAgICAgICAgICAgUXVvdGFVcGRhdGVyIHF1b3RhVXBkYXRlcikgeworICAgICAgICAgICAgLyoqIFRPRE86IFRoaXMgc2hvdWxkIGJlIHJlY29yZGVkIGFzIHBhcnQgb2YgdGhlIHRleHQgcmVzdWx0ICovCisgICAgICAgICAgICAvKiogVE9ETzogVGhlIHF1b3RhIHNob3VsZCBhbHNvIHByb2JhYmx5IGJlIHJlc2V0IHNvbWVob3cgZm9yIGV2ZXJ5IHRlc3Q/ICovCisgICAgICAgICAgICBpZiAobUR1bXBEYXRhYmFzZUNhbGxiYWNrcykgeworICAgICAgICAgICAgICAgIGdldEN1cnJlbnRBZGRpdGlvbmFsVGV4dE91dHB1dCgpLmFwcGVuZEV4Y2VlZGVkRGJRdW90YU1lc3NhZ2UodXJsLAorICAgICAgICAgICAgICAgICAgICAgICAgZGF0YWJhc2VJZGVudGlmaWVyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHF1b3RhVXBkYXRlci51cGRhdGVRdW90YShjdXJyZW50UXVvdGEgKyA1ICogMTAyNCAqIDEwMjQpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIG9uSnNBbGVydChXZWJWaWV3IHZpZXcsIFN0cmluZyB1cmwsIFN0cmluZyBtZXNzYWdlLCBKc1Jlc3VsdCByZXN1bHQpIHsKKyAgICAgICAgICAgIGdldEN1cnJlbnRBZGRpdGlvbmFsVGV4dE91dHB1dCgpLmFwcGVuZEpzQWxlcnQobWVzc2FnZSk7CisgICAgICAgICAgICByZXN1bHQuY29uZmlybSgpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gb25Kc0NvbmZpcm0oV2ViVmlldyB2aWV3LCBTdHJpbmcgdXJsLCBTdHJpbmcgbWVzc2FnZSwgSnNSZXN1bHQgcmVzdWx0KSB7CisgICAgICAgICAgICBnZXRDdXJyZW50QWRkaXRpb25hbFRleHRPdXRwdXQoKS5hcHBlbmRKc0NvbmZpcm0obWVzc2FnZSk7CisgICAgICAgICAgICByZXN1bHQuY29uZmlybSgpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gb25Kc1Byb21wdChXZWJWaWV3IHZpZXcsIFN0cmluZyB1cmwsIFN0cmluZyBtZXNzYWdlLCBTdHJpbmcgZGVmYXVsdFZhbHVlLAorICAgICAgICAgICAgICAgIEpzUHJvbXB0UmVzdWx0IHJlc3VsdCkgeworICAgICAgICAgICAgZ2V0Q3VycmVudEFkZGl0aW9uYWxUZXh0T3V0cHV0KCkuYXBwZW5kSnNQcm9tcHQobWVzc2FnZSwgZGVmYXVsdFZhbHVlKTsKKyAgICAgICAgICAgIHJlc3VsdC5jb25maXJtKCk7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBvbkNvbnNvbGVNZXNzYWdlKENvbnNvbGVNZXNzYWdlIGNvbnNvbGVNZXNzYWdlKSB7CisgICAgICAgICAgICBnZXRDdXJyZW50QWRkaXRpb25hbFRleHRPdXRwdXQoKS5hcHBlbmRDb25zb2xlTWVzc2FnZShjb25zb2xlTWVzc2FnZSk7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBvbkNyZWF0ZVdpbmRvdyhXZWJWaWV3IHZpZXcsIGJvb2xlYW4gZGlhbG9nLCBib29sZWFuIHVzZXJHZXN0dXJlLAorICAgICAgICAgICAgICAgIE1lc3NhZ2UgcmVzdWx0TXNnKSB7CisgICAgICAgICAgICBXZWJWaWV3LldlYlZpZXdUcmFuc3BvcnQgdHJhbnNwb3J0ID0gKFdlYlZpZXcuV2ViVmlld1RyYW5zcG9ydClyZXN1bHRNc2cub2JqOworICAgICAgICAgICAgLyoqIEJ5IGRlZmF1bHQgd2luZG93cyBjYW5ub3QgYmUgb3BlbmVkLCBzbyBqdXN0IHNlbmQgbnVsbCBiYWNrLiAqLworICAgICAgICAgICAgV2ViVmlldyBuZXdXaW5kb3dXZWJWaWV3ID0gbnVsbDsKKworICAgICAgICAgICAgaWYgKG1DYW5PcGVuV2luZG93cykgeworICAgICAgICAgICAgICAgIC8qKgorICAgICAgICAgICAgICAgICAqIFdlIG5ldmVyIGRpc3BsYXkgdGhlIG5ldyB3aW5kb3csIGp1c3QgY3JlYXRlIHRoZSB2aWV3IGFuZCBhbGxvdyBpdCdzIGNvbnRlbnQgdG8KKyAgICAgICAgICAgICAgICAgKiBleGVjdXRlIGFuZCBiZSByZWNvcmRlZCBieSB0aGUgZXhlY3V0b3IuCisgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgbmV3V2luZG93V2ViVmlldyA9IG5ldyBXZWJWaWV3KExheW91dFRlc3RzRXhlY3V0b3IudGhpcyk7CisgICAgICAgICAgICAgICAgc2V0dXBXZWJWaWV3KG5ld1dpbmRvd1dlYlZpZXcpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB0cmFuc3BvcnQuc2V0V2ViVmlldyhuZXdXaW5kb3dXZWJWaWV3KTsKKyAgICAgICAgICAgIHJlc3VsdE1zZy5zZW5kVG9UYXJnZXQoKTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIG9uR2VvbG9jYXRpb25QZXJtaXNzaW9uc1Nob3dQcm9tcHQoU3RyaW5nIG9yaWdpbiwKKyAgICAgICAgICAgICAgICBHZW9sb2NhdGlvblBlcm1pc3Npb25zLkNhbGxiYWNrIGNhbGxiYWNrKSB7CisgICAgICAgICAgICBpZiAobUlzR2VvbG9jYXRpb25QZXJtaXNzaW9uU2V0KSB7CisgICAgICAgICAgICAgICAgY2FsbGJhY2suaW52b2tlKG9yaWdpbiwgbUdlb2xvY2F0aW9uUGVybWlzc2lvbiwgZmFsc2UpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChtUGVuZGluZ0dlb2xvY2F0aW9uUGVybWlzc2lvbkNhbGxiYWNrcyA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgbVBlbmRpbmdHZW9sb2NhdGlvblBlcm1pc3Npb25DYWxsYmFja3MgPQorICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEhhc2hNYXA8R2VvbG9jYXRpb25QZXJtaXNzaW9ucy5DYWxsYmFjaywgU3RyaW5nPigpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbVBlbmRpbmdHZW9sb2NhdGlvblBlcm1pc3Npb25DYWxsYmFja3MucHV0KGNhbGxiYWNrLCBvcmlnaW4pOworICAgICAgICB9CisgICAgfTsKKworICAgIC8qKiBJTVBMRU1FTlRBVElPTiAqLworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25DcmVhdGUoQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgeworICAgICAgICBzdXBlci5vbkNyZWF0ZShzYXZlZEluc3RhbmNlU3RhdGUpOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBJdCBkZXRlY3RzIHRoZSBjcmFzaCBieSBjYXRjaGluZyBhbGwgdGhlIHVuY2F1Z2h0IGV4Y2VwdGlvbnMuIEhvd2V2ZXIsIHdlCisgICAgICAgICAqIHN0aWxsIGhhdmUgdG8ga2lsbCB0aGUgcHJvY2VzcywgYmVjYXVzZSBhZnRlciBjYXRjaGluZyB0aGUgZXhjZXB0aW9uIHRoZQorICAgICAgICAgKiBhY3Rpdml0eSByZW1haW5zIGluIGEgc3RyYW5nZSBzdGF0ZSwgd2hlcmUgaW50ZW50cyBkb24ndCByZXZpdmUgaXQuCisgICAgICAgICAqIEhvd2V2ZXIsIHdlIHNlbmQgdGhlIG1lc3NhZ2UgdG8gdGhlIHNlcnZpY2UgdG8gc3BlZWQgdXAgdGhlIHJlYm9vdGluZworICAgICAgICAgKiAod2UgZG9uJ3QgaGF2ZSB0byB3YWl0IGZvciB0aW1lLW91dCB0byBraWNrIGluKS4KKyAgICAgICAgICovCisgICAgICAgIFRocmVhZC5zZXREZWZhdWx0VW5jYXVnaHRFeGNlcHRpb25IYW5kbGVyKG5ldyBVbmNhdWdodEV4Y2VwdGlvbkhhbmRsZXIoKSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIHVuY2F1Z2h0RXhjZXB0aW9uKFRocmVhZCB0aHJlYWQsIFRocm93YWJsZSBlKSB7CisgICAgICAgICAgICAgICAgTG9nLncoTE9HX1RBRywKKyAgICAgICAgICAgICAgICAgICAgICAgICJvblRlc3RDcmFzaGVkKCk6ICIgKyBtQ3VycmVudFRlc3RSZWxhdGl2ZVBhdGggKyAiIHRocmVhZD0iICsgdGhyZWFkLCBlKTsKKworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2Ugc2VydmljZU1zZyA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZS5vYnRhaW4obnVsbCwgTWFuYWdlclNlcnZpY2UuTVNHX0NVUlJFTlRfVEVTVF9DUkFTSEVEKTsKKworICAgICAgICAgICAgICAgICAgICBtTWFuYWdlclNlcnZpY2VNZXNzZW5nZXIuc2VuZChzZXJ2aWNlTXNnKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZTIpIHsKKyAgICAgICAgICAgICAgICAgICAgTG9nLmUoTE9HX1RBRywgIm1DdXJyZW50VGVzdFJlbGF0aXZlUGF0aD0iICsgbUN1cnJlbnRUZXN0UmVsYXRpdmVQYXRoLCBlMik7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgUHJvY2Vzcy5raWxsUHJvY2VzcyhQcm9jZXNzLm15UGlkKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9KTsKKworICAgICAgICByZXF1ZXN0V2luZG93RmVhdHVyZShXaW5kb3cuRkVBVFVSRV9QUk9HUkVTUyk7CisKKyAgICAgICAgSW50ZW50IGludGVudCA9IGdldEludGVudCgpOworICAgICAgICBtVGVzdHNMaXN0ID0gaW50ZW50LmdldFN0cmluZ0FycmF5TGlzdEV4dHJhKEVYVFJBX1RFU1RTX0xJU1QpOworICAgICAgICBtQ3VycmVudFRlc3RJbmRleCA9IGludGVudC5nZXRJbnRFeHRyYShFWFRSQV9URVNUX0lOREVYLCAtMSk7CisgICAgICAgIG1Ub3RhbFRlc3RDb3VudCA9IG1DdXJyZW50VGVzdEluZGV4ICsgbVRlc3RzTGlzdC5zaXplKCk7CisKKyAgICAgICAgUG93ZXJNYW5hZ2VyIHBtID0gKFBvd2VyTWFuYWdlcilnZXRTeXN0ZW1TZXJ2aWNlKENvbnRleHQuUE9XRVJfU0VSVklDRSk7CisgICAgICAgIG1TY3JlZW5EaW1Mb2NrID0gcG0ubmV3V2FrZUxvY2soUG93ZXJNYW5hZ2VyLlNDUkVFTl9ESU1fV0FLRV9MT0NLCisgICAgICAgICAgICAgICAgfCBQb3dlck1hbmFnZXIuT05fQUZURVJfUkVMRUFTRSwgIldha2VMb2NrIGluIExheW91dFRlc3RlciIpOworICAgICAgICBtU2NyZWVuRGltTG9jay5hY3F1aXJlKCk7CisKKyAgICAgICAgYmluZFNlcnZpY2UobmV3IEludGVudCh0aGlzLCBNYW5hZ2VyU2VydmljZS5jbGFzcyksIG1TZXJ2aWNlQ29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICBDb250ZXh0LkJJTkRfQVVUT19DUkVBVEUpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCByZXNldCgpIHsKKyAgICAgICAgV2ViVmlldyBwcmV2aW91c1dlYlZpZXcgPSBtQ3VycmVudFdlYlZpZXc7CisKKyAgICAgICAgcmVzZXRMYXlvdXRUZXN0Q29udHJvbGxlcigpOworCisgICAgICAgIG1DdXJyZW50VGVzdFRpbWVkT3V0ID0gZmFsc2U7CisgICAgICAgIG1DdXJyZW50UmVzdWx0ID0gbnVsbDsKKyAgICAgICAgbUN1cnJlbnRBZGRpdGlvbmFsVGV4dE91dHB1dCA9IG51bGw7CisKKyAgICAgICAgbUN1cnJlbnRXZWJWaWV3ID0gbmV3IFdlYlZpZXcodGhpcyk7CisgICAgICAgIHNldHVwV2ViVmlldyhtQ3VycmVudFdlYlZpZXcpOworCisgICAgICAgIG1FdmVudFNlbmRlci5yZXNldChtQ3VycmVudFdlYlZpZXcpOworCisgICAgICAgIHNldENvbnRlbnRWaWV3KG1DdXJyZW50V2ViVmlldyk7CisgICAgICAgIGlmIChwcmV2aW91c1dlYlZpZXcgIT0gbnVsbCkgeworICAgICAgICAgICAgTG9nLmQoTE9HX1RBRyArICI6OnJlc2V0IiwgInByZXZpb3VzV2ViVmlldyAhPSBudWxsIik7CisgICAgICAgICAgICBwcmV2aW91c1dlYlZpZXcuZGVzdHJveSgpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHNldHVwV2ViVmlldyhXZWJWaWV3IHdlYlZpZXcpIHsKKyAgICAgICAgd2ViVmlldy5zZXRXZWJWaWV3Q2xpZW50KG1XZWJWaWV3Q2xpZW50KTsKKyAgICAgICAgd2ViVmlldy5zZXRXZWJDaHJvbWVDbGllbnQobVdlYkNocm9tZUNsaWVudCk7CisgICAgICAgIHdlYlZpZXcuYWRkSmF2YXNjcmlwdEludGVyZmFjZShtTGF5b3V0VGVzdENvbnRyb2xsZXIsICJsYXlvdXRUZXN0Q29udHJvbGxlciIpOworICAgICAgICB3ZWJWaWV3LmFkZEphdmFzY3JpcHRJbnRlcmZhY2UobUV2ZW50U2VuZGVyLCAiZXZlbnRTZW5kZXIiKTsKKworICAgICAgICAvKioKKyAgICAgICAgICogU2V0dGluZyBhIHRvdWNoIGludGVydmFsIG9mIC0xIGVmZmVjdGl2ZWx5IGRpc2FibGVzIHRoZSBvcHRpbWlzYXRpb24gaW4gV2ViVmlldworICAgICAgICAgKiB0aGF0IHN0b3BzIHJlcGVhdGVkIHRvdWNoIGV2ZW50cyBmbG9vZGluZyBXZWJDb3JlLiBUaGUgRXZlbnQgU2VuZGVyIG9ubHkgc2VuZHMgYQorICAgICAgICAgKiBzaW5nbGUgZXZlbnQgcmF0aGVyIHRoYW4gYSBzdHJlYW0gb2YgZXZlbnRzIChsaWtlIHdoYXQgd291bGQgZ2VuZXJhbGx5IGhhcHBlbiBpbgorICAgICAgICAgKiBhIHJlYWwgdXNlIG9mIHRvdWNoIGV2ZW50cyBpbiBhIFdlYlZpZXcpICBhbmQgc28gaWYgdGhlIFdlYlZpZXcgZHJvcHMgdGhlIGV2ZW50LAorICAgICAgICAgKiB0aGUgdGVzdCB3aWxsIGZhaWwgYXMgdGhlIHRlc3QgZXhwZWN0cyBvbmUgY2FsbGJhY2sgZm9yIGV2ZXJ5IHRvdWNoIGl0IHN5bnRoZXNpemVzLgorICAgICAgICAgKi8KKyAgICAgICAgd2ViVmlldy5zZXRUb3VjaEludGVydmFsKC0xKTsKKworICAgICAgICB3ZWJWaWV3LmNsZWFyQ2FjaGUodHJ1ZSk7CisKKyAgICAgICAgV2ViU2V0dGluZ3Mgd2ViVmlld1NldHRpbmdzID0gd2ViVmlldy5nZXRTZXR0aW5ncygpOworICAgICAgICB3ZWJWaWV3U2V0dGluZ3Muc2V0QXBwQ2FjaGVFbmFibGVkKHRydWUpOworICAgICAgICB3ZWJWaWV3U2V0dGluZ3Muc2V0QXBwQ2FjaGVQYXRoKGdldEFwcGxpY2F0aW9uQ29udGV4dCgpLmdldENhY2hlRGlyKCkuZ2V0UGF0aCgpKTsKKyAgICAgICAgd2ViVmlld1NldHRpbmdzLnNldEFwcENhY2hlTWF4U2l6ZShMb25nLk1BWF9WQUxVRSk7CisgICAgICAgIHdlYlZpZXdTZXR0aW5ncy5zZXRKYXZhU2NyaXB0RW5hYmxlZCh0cnVlKTsKKyAgICAgICAgd2ViVmlld1NldHRpbmdzLnNldEphdmFTY3JpcHRDYW5PcGVuV2luZG93c0F1dG9tYXRpY2FsbHkodHJ1ZSk7CisgICAgICAgIHdlYlZpZXdTZXR0aW5ncy5zZXRTdXBwb3J0TXVsdGlwbGVXaW5kb3dzKHRydWUpOworICAgICAgICB3ZWJWaWV3U2V0dGluZ3Muc2V0TGF5b3V0QWxnb3JpdGhtKFdlYlNldHRpbmdzLkxheW91dEFsZ29yaXRobS5OT1JNQUwpOworICAgICAgICB3ZWJWaWV3U2V0dGluZ3Muc2V0RGF0YWJhc2VFbmFibGVkKHRydWUpOworICAgICAgICB3ZWJWaWV3U2V0dGluZ3Muc2V0RGF0YWJhc2VQYXRoKGdldERpcigiZGF0YWJhc2VzIiwgMCkuZ2V0QWJzb2x1dGVQYXRoKCkpOworICAgICAgICB3ZWJWaWV3U2V0dGluZ3Muc2V0RG9tU3RvcmFnZUVuYWJsZWQodHJ1ZSk7CisgICAgICAgIHdlYlZpZXdTZXR0aW5ncy5zZXRXb3JrZXJzRW5hYmxlZChmYWxzZSk7CisgICAgICAgIHdlYlZpZXdTZXR0aW5ncy5zZXRYU1NBdWRpdG9yRW5hYmxlZChmYWxzZSk7CisKKyAgICAgICAgLy8gVGhpcyBpcyBhc3luY2hyb25vdXMsIGJ1dCBpdCBnZXRzIHByb2Nlc3NlZCBieSBXZWJDb3JlIGJlZm9yZSBpdCBzdGFydHMgbG9hZGluZyBwYWdlcy4KKyAgICAgICAgbUN1cnJlbnRXZWJWaWV3LnVzZU1vY2tEZXZpY2VPcmllbnRhdGlvbigpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBzdGFydFRlc3RzKCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgTWVzc2FnZSBzZXJ2aWNlTXNnID0KKyAgICAgICAgICAgICAgICAgICAgTWVzc2FnZS5vYnRhaW4obnVsbCwgTWFuYWdlclNlcnZpY2UuTVNHX0ZJUlNUX1RFU1QpOworCisgICAgICAgICAgICBCdW5kbGUgYnVuZGxlID0gbmV3IEJ1bmRsZSgpOworICAgICAgICAgICAgaWYgKCFtVGVzdHNMaXN0LmlzRW1wdHkoKSkgeworICAgICAgICAgICAgICAgIGJ1bmRsZS5wdXRTdHJpbmcoImZpcnN0VGVzdCIsIG1UZXN0c0xpc3QuZ2V0KDApKTsKKyAgICAgICAgICAgICAgICBidW5kbGUucHV0SW50KCJpbmRleCIsIG1DdXJyZW50VGVzdEluZGV4KTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc2VydmljZU1zZy5zZXREYXRhKGJ1bmRsZSk7CisgICAgICAgICAgICBtTWFuYWdlclNlcnZpY2VNZXNzZW5nZXIuc2VuZChzZXJ2aWNlTXNnKTsKKyAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIExvZy5lKExPR19UQUcsICJtQ3VycmVudFRlc3RSZWxhdGl2ZVBhdGg9IiArIG1DdXJyZW50VGVzdFJlbGF0aXZlUGF0aCwgZSk7CisgICAgICAgIH0KKworICAgICAgICBydW5OZXh0VGVzdCgpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBydW5OZXh0VGVzdCgpIHsKKyAgICAgICAgYXNzZXJ0IG1DdXJyZW50U3RhdGUgPT0gQ3VycmVudFN0YXRlLklETEUgOiAibUN1cnJlbnRTdGF0ZSA9ICIgKyBtQ3VycmVudFN0YXRlLm5hbWUoKTsKKworICAgICAgICBpZiAobVRlc3RzTGlzdC5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIG9uQWxsVGVzdHNGaW5pc2hlZCgpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgbUN1cnJlbnRUZXN0UmVsYXRpdmVQYXRoID0gbVRlc3RzTGlzdC5yZW1vdmUoMCk7CisKKyAgICAgICAgTG9nLmkoTE9HX1RBRywgInJ1bk5leHRUZXN0KCk6IFN0YXJ0OiAiICsgbUN1cnJlbnRUZXN0UmVsYXRpdmVQYXRoICsKKyAgICAgICAgICAgICAgICAiICgiICsgbUN1cnJlbnRUZXN0SW5kZXggKyAiKSIpOworCisgICAgICAgIG1DdXJyZW50VGVzdFVyaSA9IEZpbGVGaWx0ZXIuZ2V0VXJsKG1DdXJyZW50VGVzdFJlbGF0aXZlUGF0aCkudG9TdHJpbmcoKTsKKworICAgICAgICByZXNldCgpOworCisgICAgICAgIC8qKiBTdGFydCB0aW1lLW91dCBjb3VudGRvd24gYW5kIHRoZSB0ZXN0ICovCisgICAgICAgIG1DdXJyZW50U3RhdGUgPSBDdXJyZW50U3RhdGUuUkVOREVSSU5HX1BBR0U7CisgICAgICAgIG1SZXN1bHRIYW5kbGVyLnNlbmRFbXB0eU1lc3NhZ2VEZWxheWVkKE1TR19URVNUX1RJTUVEX09VVCwgREVGQVVMVF9USU1FX09VVF9NUyk7CisgICAgICAgIG1DdXJyZW50V2ViVmlldy5sb2FkVXJsKG1DdXJyZW50VGVzdFVyaSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIG9uVGVzdFRpbWVkT3V0KCkgeworICAgICAgICBhc3NlcnQgbUN1cnJlbnRTdGF0ZS5pc1J1bm5pbmdTdGF0ZSgpIDogIm1DdXJyZW50U3RhdGUgPSAiICsgbUN1cnJlbnRTdGF0ZS5uYW1lKCk7CisKKyAgICAgICAgTG9nLncoTE9HX1RBRywgIm9uVGVzdFRpbWVkT3V0KCk6ICIgKyBtQ3VycmVudFRlc3RSZWxhdGl2ZVBhdGgpOworICAgICAgICBtQ3VycmVudFRlc3RUaW1lZE91dCA9IHRydWU7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFdoaWxlIGl0IGlzIHRoZW9yZXRpY2FsbHkgcG9zc2libGUgdGhhdCB0aGUgdGVzdCB0aW1lcyBvdXQgYmVjYXVzZQorICAgICAgICAgKiBvZiB3ZWJ2aWV3IGJlY29taW5nIHVucmVzcG9uc2l2ZSwgaXQgaXMgdmVyeSB1bmxpa2VseS4gVGhlcmVmb3JlIGl0J3MKKyAgICAgICAgICogYXNzdW1lZCB0aGF0IG9idGFpbmluZyByZXN1bHRzICh0aGF0IGNhbGxzIHZhcmlvdXMgd2VidmlldyBtZXRob2RzKQorICAgICAgICAgKiB3aWxsIG5vdCBpdHNlbGYgaGFuZy4KKyAgICAgICAgICovCisgICAgICAgIG9idGFpbkFjdHVhbFJlc3VsdHNGcm9tV2ViVmlldygpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBvblRlc3RGaW5pc2hlZCgpIHsKKyAgICAgICAgYXNzZXJ0IG1DdXJyZW50U3RhdGUuaXNSdW5uaW5nU3RhdGUoKSA6ICJtQ3VycmVudFN0YXRlID0gIiArIG1DdXJyZW50U3RhdGUubmFtZSgpOworCisgICAgICAgIExvZy5pKExPR19UQUcsICJvblRlc3RGaW5pc2hlZCgpOiAiICsgbUN1cnJlbnRUZXN0UmVsYXRpdmVQYXRoKTsKKyAgICAgICAgb2J0YWluQWN0dWFsUmVzdWx0c0Zyb21XZWJWaWV3KCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIG9idGFpbkFjdHVhbFJlc3VsdHNGcm9tV2ViVmlldygpIHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIElmIHRoZSByZXN1bHQgaGFzIG5vdCBiZWVuIHNldCBieSB0aGUgdGltZSB0aGUgdGVzdCBmaW5pc2hlcyB3ZSBjcmVhdGUKKyAgICAgICAgICogYSBkZWZhdWx0IHR5cGUgb2YgcmVzdWx0LgorICAgICAgICAgKi8KKyAgICAgICAgaWYgKG1DdXJyZW50UmVzdWx0ID09IG51bGwpIHsKKyAgICAgICAgICAgIC8qKiBUT0RPOiBEZWZhdWx0IHR5cGUgc2hvdWxkIGJlIFJlbmRlclRyZWVSZXN1bHQuIFdlIGRvbid0IHN1cHBvcnQgaXQgbm93LiAqLworICAgICAgICAgICAgbUN1cnJlbnRSZXN1bHQgPSBuZXcgVGV4dFJlc3VsdChtQ3VycmVudFRlc3RSZWxhdGl2ZVBhdGgpOworICAgICAgICB9CisKKyAgICAgICAgbUN1cnJlbnRTdGF0ZSA9IEN1cnJlbnRTdGF0ZS5PQlRBSU5JTkdfUkVTVUxUOworCisgICAgICAgIG1DdXJyZW50UmVzdWx0Lm9idGFpbkFjdHVhbFJlc3VsdHMobUN1cnJlbnRXZWJWaWV3LAorICAgICAgICAgICAgICAgIG1SZXN1bHRIYW5kbGVyLm9idGFpbk1lc3NhZ2UoTVNHX0FDVFVBTF9SRVNVTFRfT0JUQUlORUQpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgb25BY3R1YWxSZXN1bHRzT2J0YWluZWQoKSB7CisgICAgICAgIGFzc2VydCBtQ3VycmVudFN0YXRlID09IEN1cnJlbnRTdGF0ZS5PQlRBSU5JTkdfUkVTVUxUCisgICAgICAgICAgICAgICAgOiAibUN1cnJlbnRTdGF0ZSA9ICIgKyBtQ3VycmVudFN0YXRlLm5hbWUoKTsKKworICAgICAgICBMb2cuaShMT0dfVEFHLCAib25BY3R1YWxSZXN1bHRzT2J0YWluZWQoKTogIiArIG1DdXJyZW50VGVzdFJlbGF0aXZlUGF0aCk7CisgICAgICAgIG1DdXJyZW50U3RhdGUgPSBDdXJyZW50U3RhdGUuSURMRTsKKworICAgICAgICBtUmVzdWx0SGFuZGxlci5yZW1vdmVNZXNzYWdlcyhNU0dfVEVTVF9USU1FRF9PVVQpOworICAgICAgICByZXBvcnRSZXN1bHRUb1NlcnZpY2UoKTsKKyAgICAgICAgbUN1cnJlbnRUZXN0SW5kZXgrKzsKKyAgICAgICAgdXBkYXRlUHJvZ3Jlc3NCYXIoKTsKKyAgICAgICAgcnVuTmV4dFRlc3QoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgcmVwb3J0UmVzdWx0VG9TZXJ2aWNlKCkgeworICAgICAgICBpZiAobUN1cnJlbnRBZGRpdGlvbmFsVGV4dE91dHB1dCAhPSBudWxsKSB7CisgICAgICAgICAgICBtQ3VycmVudFJlc3VsdC5zZXRBZGRpdGlvbmFsVGV4dE91dHB1dFN0cmluZyhtQ3VycmVudEFkZGl0aW9uYWxUZXh0T3V0cHV0LnRvU3RyaW5nKCkpOworICAgICAgICB9CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIE1lc3NhZ2Ugc2VydmljZU1zZyA9CisgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2Uub2J0YWluKG51bGwsIE1hbmFnZXJTZXJ2aWNlLk1TR19QUk9DRVNTX0FDVFVBTF9SRVNVTFRTKTsKKworICAgICAgICAgICAgQnVuZGxlIGJ1bmRsZSA9IG1DdXJyZW50UmVzdWx0LmdldEJ1bmRsZSgpOworICAgICAgICAgICAgYnVuZGxlLnB1dEludCgidGVzdEluZGV4IiwgbUN1cnJlbnRUZXN0SW5kZXgpOworICAgICAgICAgICAgaWYgKG1DdXJyZW50VGVzdFRpbWVkT3V0KSB7CisgICAgICAgICAgICAgICAgYnVuZGxlLnB1dFN0cmluZygicmVzdWx0Q29kZSIsIEFic3RyYWN0UmVzdWx0LlJlc3VsdENvZGUuRkFJTF9USU1FRF9PVVQubmFtZSgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICghbVRlc3RzTGlzdC5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICBidW5kbGUucHV0U3RyaW5nKCJuZXh0VGVzdCIsIG1UZXN0c0xpc3QuZ2V0KDApKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc2VydmljZU1zZy5zZXREYXRhKGJ1bmRsZSk7CisgICAgICAgICAgICBtTWFuYWdlclNlcnZpY2VNZXNzZW5nZXIuc2VuZChzZXJ2aWNlTXNnKTsKKyAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIExvZy5lKExPR19UQUcsICJtQ3VycmVudFRlc3RSZWxhdGl2ZVBhdGg9IiArIG1DdXJyZW50VGVzdFJlbGF0aXZlUGF0aCwgZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgdXBkYXRlUHJvZ3Jlc3NCYXIoKSB7CisgICAgICAgIGdldFdpbmRvdygpLnNldEZlYXR1cmVJbnQoV2luZG93LkZFQVRVUkVfUFJPR1JFU1MsCisgICAgICAgICAgICAgICAgbUN1cnJlbnRUZXN0SW5kZXggKiBXaW5kb3cuUFJPR1JFU1NfRU5EIC8gbVRvdGFsVGVzdENvdW50KTsKKyAgICAgICAgc2V0VGl0bGUobUN1cnJlbnRUZXN0SW5kZXggKiAxMDAgLyBtVG90YWxUZXN0Q291bnQgKyAiJSAiICsKKyAgICAgICAgICAgICAgICAiKCIgKyBtQ3VycmVudFRlc3RJbmRleCArICIvIiArIG1Ub3RhbFRlc3RDb3VudCArICIpIik7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIG9uQWxsVGVzdHNGaW5pc2hlZCgpIHsKKyAgICAgICAgbVNjcmVlbkRpbUxvY2sucmVsZWFzZSgpOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBNZXNzYWdlIHNlcnZpY2VNc2cgPQorICAgICAgICAgICAgICAgICAgICBNZXNzYWdlLm9idGFpbihudWxsLCBNYW5hZ2VyU2VydmljZS5NU0dfQUxMX1RFU1RTX0ZJTklTSEVEKTsKKyAgICAgICAgICAgIG1NYW5hZ2VyU2VydmljZU1lc3Nlbmdlci5zZW5kKHNlcnZpY2VNc2cpOworICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgTG9nLmUoTE9HX1RBRywgIm1DdXJyZW50VGVzdFJlbGF0aXZlUGF0aD0iICsgbUN1cnJlbnRUZXN0UmVsYXRpdmVQYXRoLCBlKTsKKyAgICAgICAgfQorCisgICAgICAgIHVuYmluZFNlcnZpY2UobVNlcnZpY2VDb25uZWN0aW9uKTsKKyAgICB9CisKKyAgICBwcml2YXRlIEFkZGl0aW9uYWxUZXh0T3V0cHV0IGdldEN1cnJlbnRBZGRpdGlvbmFsVGV4dE91dHB1dCgpIHsKKyAgICAgICAgaWYgKG1DdXJyZW50QWRkaXRpb25hbFRleHRPdXRwdXQgPT0gbnVsbCkgeworICAgICAgICAgICAgbUN1cnJlbnRBZGRpdGlvbmFsVGV4dE91dHB1dCA9IG5ldyBBZGRpdGlvbmFsVGV4dE91dHB1dCgpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBtQ3VycmVudEFkZGl0aW9uYWxUZXh0T3V0cHV0OworICAgIH0KKworICAgIC8qKiBMQVlPVVQgVEVTVCBDT05UUk9MTEVSICovCisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTVNHX1dBSVRfVU5USUxfRE9ORSA9IDA7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1TR19OT1RJRllfRE9ORSA9IDE7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1TR19EVU1QX0FTX1RFWFQgPSAyOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNU0dfRFVNUF9DSElMRF9GUkFNRVNfQVNfVEVYVCA9IDM7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1TR19TRVRfQ0FOX09QRU5fV0lORE9XUyA9IDQ7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1TR19EVU1QX0RBVEFCQVNFX0NBTExCQUNLUyA9IDU7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1TR19TRVRfR0VPTE9DQVRJT05fUEVSTUlTU0lPTiA9IDY7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1TR19PVkVSUklERV9QUkVGRVJFTkNFID0gNzsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTVNHX1NFVF9YU1NfQVVESVRPUl9FTkFCTEVEID0gODsKKworICAgIC8qKiBTdHJpbmcgY29uc3RhbnRzIGZvciB1c2Ugd2l0aCBsYXlvdXRUZXN0Q29udHJvbGxlci5vdmVycmlkZVByZWZlcmVuY2UoKSAqLworICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIFdFQktJVF9PRkZMSU5FX1dFQl9BUFBMSUNBVElPTl9DQUNIRV9FTkFCTEVEID0KKyAgICAgICAgICAgICJXZWJLaXRPZmZsaW5lV2ViQXBwbGljYXRpb25DYWNoZUVuYWJsZWQiOworCisgICAgSGFuZGxlciBtTGF5b3V0VGVzdENvbnRyb2xsZXJIYW5kbGVyID0gbmV3IEhhbmRsZXIoKSB7CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBoYW5kbGVNZXNzYWdlKE1lc3NhZ2UgbXNnKSB7CisgICAgICAgICAgICBhc3NlcnQgbUN1cnJlbnRTdGF0ZS5pc1J1bm5pbmdTdGF0ZSgpIDogIm1DdXJyZW50U3RhdGUgPSAiICsgbUN1cnJlbnRTdGF0ZS5uYW1lKCk7CisKKyAgICAgICAgICAgIHN3aXRjaCAobXNnLndoYXQpIHsKKyAgICAgICAgICAgICAgICBjYXNlIE1TR19EVU1QX0FTX1RFWFQ6CisgICAgICAgICAgICAgICAgICAgIGlmIChtQ3VycmVudFJlc3VsdCA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtQ3VycmVudFJlc3VsdCA9IG5ldyBUZXh0UmVzdWx0KG1DdXJyZW50VGVzdFJlbGF0aXZlUGF0aCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYXNzZXJ0IG1DdXJyZW50UmVzdWx0IGluc3RhbmNlb2YgVGV4dFJlc3VsdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogIm1DdXJyZW50UmVzdWx0IGluc3RhbmNlb2YiICsgbUN1cnJlbnRSZXN1bHQuZ2V0Q2xhc3MoKS5nZXROYW1lKCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSBNU0dfRFVNUF9DSElMRF9GUkFNRVNfQVNfVEVYVDoKKyAgICAgICAgICAgICAgICAgICAgLyoqIElmIGR1bXBBc1RleHQgd2FzIG5vdCBjYWxsZWQgd2UgYXNzdW1lIHRoYXQgdGhlIHJlc3VsdCBzaG91bGQgYmUgdGV4dCAqLworICAgICAgICAgICAgICAgICAgICBpZiAobUN1cnJlbnRSZXN1bHQgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgbUN1cnJlbnRSZXN1bHQgPSBuZXcgVGV4dFJlc3VsdChtQ3VycmVudFRlc3RSZWxhdGl2ZVBhdGgpOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgYXNzZXJ0IG1DdXJyZW50UmVzdWx0IGluc3RhbmNlb2YgVGV4dFJlc3VsdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogIm1DdXJyZW50UmVzdWx0IGluc3RhbmNlb2YiICsgbUN1cnJlbnRSZXN1bHQuZ2V0Q2xhc3MoKS5nZXROYW1lKCk7CisKKyAgICAgICAgICAgICAgICAgICAgKChUZXh0UmVzdWx0KW1DdXJyZW50UmVzdWx0KS5zZXREdW1wQ2hpbGRGcmFtZXNBc1RleHQodHJ1ZSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSBNU0dfRFVNUF9EQVRBQkFTRV9DQUxMQkFDS1M6CisgICAgICAgICAgICAgICAgICAgIG1EdW1wRGF0YWJhc2VDYWxsYmFja3MgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGNhc2UgTVNHX05PVElGWV9ET05FOgorICAgICAgICAgICAgICAgICAgICBpZiAobUN1cnJlbnRTdGF0ZSA9PSBDdXJyZW50U3RhdGUuV0FJVElOR19GT1JfQVNZTkNIUk9OT1VTX1RFU1QpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG9uVGVzdEZpbmlzaGVkKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlIE1TR19PVkVSUklERV9QUkVGRVJFTkNFOgorICAgICAgICAgICAgICAgICAgICAvKioKKyAgICAgICAgICAgICAgICAgICAgICogVE9ETzogV2Ugc2hvdWxkIGxvb2sgdXAgdGhlIGNvcnJlY3QgV2ViVmlldyBmb3IgdGhlIGZyYW1lIHdoaWNoCisgICAgICAgICAgICAgICAgICAgICAqIGNhbGxlZCB0aGUgbGF5b3V0VGVzdENvbnRyb2xsZXIgbWV0aG9kLiBDdXJyZW50bHksIHdlIGp1c3QgdXNlIHRoZQorICAgICAgICAgICAgICAgICAgICAgKiBXZWJWaWV3IGZvciB0aGUgbWFpbiBmcmFtZS4gRXZlbnRTZW5kZXIgc3VmZmVycyBmcm9tIHRoZSBzYW1lCisgICAgICAgICAgICAgICAgICAgICAqIHByb2JsZW0uCisgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICAgICBpZiAobXNnLmdldERhdGEoKS5nZXRTdHJpbmcoImtleSIpLmVxdWFscygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBXRUJLSVRfT0ZGTElORV9XRUJfQVBQTElDQVRJT05fQ0FDSEVfRU5BQkxFRCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1DdXJyZW50V2ViVmlldy5nZXRTZXR0aW5ncygpLnNldEFwcENhY2hlRW5hYmxlZChtc2cuZ2V0RGF0YSgpLmdldEJvb2xlYW4oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2YWx1ZSIpKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIExvZy53KExPR19UQUcsICJNU0dfT1ZFUlJJREVfUFJFRkVSRU5DRTogdW5zdXBwb3J0ZWQgcHJlZmVyZW5jZSEiKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGNhc2UgTVNHX1NFVF9DQU5fT1BFTl9XSU5ET1dTOgorICAgICAgICAgICAgICAgICAgICBtQ2FuT3BlbldpbmRvd3MgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGNhc2UgTVNHX1NFVF9HRU9MT0NBVElPTl9QRVJNSVNTSU9OOgorICAgICAgICAgICAgICAgICAgICBtSXNHZW9sb2NhdGlvblBlcm1pc3Npb25TZXQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICBtR2VvbG9jYXRpb25QZXJtaXNzaW9uID0gbXNnLmFyZzEgPT0gMTsKKworICAgICAgICAgICAgICAgICAgICBpZiAobVBlbmRpbmdHZW9sb2NhdGlvblBlcm1pc3Npb25DYWxsYmFja3MgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgSXRlcmF0b3I8R2VvbG9jYXRpb25QZXJtaXNzaW9ucy5DYWxsYmFjaz4gaXRlciA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1QZW5kaW5nR2VvbG9jYXRpb25QZXJtaXNzaW9uQ2FsbGJhY2tzLmtleVNldCgpLml0ZXJhdG9yKCk7CisgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBHZW9sb2NhdGlvblBlcm1pc3Npb25zLkNhbGxiYWNrIGNhbGxiYWNrID0gaXRlci5uZXh0KCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG9yaWdpbiA9IG1QZW5kaW5nR2VvbG9jYXRpb25QZXJtaXNzaW9uQ2FsbGJhY2tzLmdldChjYWxsYmFjayk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2suaW52b2tlKG9yaWdpbiwgbUdlb2xvY2F0aW9uUGVybWlzc2lvbiwgZmFsc2UpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgbVBlbmRpbmdHZW9sb2NhdGlvblBlcm1pc3Npb25DYWxsYmFja3MgPSBudWxsOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSBNU0dfU0VUX1hTU19BVURJVE9SX0VOQUJMRUQ6CisgICAgICAgICAgICAgICAgICAgIG1DdXJyZW50V2ViVmlldy5nZXRTZXR0aW5ncygpLnNldFhTU0F1ZGl0b3JFbmFibGVkKG1zZy5hcmcxID09IDEpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGNhc2UgTVNHX1dBSVRfVU5USUxfRE9ORToKKyAgICAgICAgICAgICAgICAgICAgbUN1cnJlbnRTdGF0ZSA9IEN1cnJlbnRTdGF0ZS5XQUlUSU5HX0ZPUl9BU1lOQ0hST05PVVNfVEVTVDsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICBhc3NlcnQgZmFsc2UgOiAibXNnLndoYXQ9IiArIG1zZy53aGF0OworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH07CisKKyAgICBwcml2YXRlIHZvaWQgcmVzZXRMYXlvdXRUZXN0Q29udHJvbGxlcigpIHsKKyAgICAgICAgbUNhbk9wZW5XaW5kb3dzID0gZmFsc2U7CisgICAgICAgIG1EdW1wRGF0YWJhc2VDYWxsYmFja3MgPSBmYWxzZTsKKyAgICAgICAgbUlzR2VvbG9jYXRpb25QZXJtaXNzaW9uU2V0ID0gZmFsc2U7CisgICAgICAgIG1QZW5kaW5nR2VvbG9jYXRpb25QZXJtaXNzaW9uQ2FsbGJhY2tzID0gbnVsbDsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBkdW1wQXNUZXh0KGJvb2xlYW4gZW5hYmxlUGl4ZWxUZXN0KSB7CisgICAgICAgIExvZy5pKExPR19UQUcsIG1DdXJyZW50VGVzdFJlbGF0aXZlUGF0aCArICI6IGR1bXBBc1RleHQoIiArIGVuYWJsZVBpeGVsVGVzdCArICIpIGNhbGxlZCIpOworICAgICAgICAvKiogVE9ETzogSW1wbGVtZW50ICovCisgICAgICAgIGlmIChlbmFibGVQaXhlbFRlc3QpIHsKKyAgICAgICAgICAgIExvZy53KExPR19UQUcsICJlbmFibGVQaXhlbFRlc3Qgbm90IGltcGxlbWVudGVkLCBzd2l0Y2hpbmcgdG8gZmFsc2UiKTsKKyAgICAgICAgfQorICAgICAgICBtTGF5b3V0VGVzdENvbnRyb2xsZXJIYW5kbGVyLnNlbmRFbXB0eU1lc3NhZ2UoTVNHX0RVTVBfQVNfVEVYVCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZHVtcENoaWxkRnJhbWVzQXNUZXh0KCkgeworICAgICAgICBMb2cuaShMT0dfVEFHLCBtQ3VycmVudFRlc3RSZWxhdGl2ZVBhdGggKyAiOiBkdW1wQ2hpbGRGcmFtZXNBc1RleHQoKSBjYWxsZWQiKTsKKyAgICAgICAgbUxheW91dFRlc3RDb250cm9sbGVySGFuZGxlci5zZW5kRW1wdHlNZXNzYWdlKE1TR19EVU1QX0NISUxEX0ZSQU1FU19BU19URVhUKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBkdW1wRGF0YWJhc2VDYWxsYmFja3MoKSB7CisgICAgICAgIExvZy5pKExPR19UQUcsIG1DdXJyZW50VGVzdFJlbGF0aXZlUGF0aCArICI6IGR1bXBEYXRhYmFzZUNhbGxiYWNrcygpIGNhbGxlZCIpOworICAgICAgICBtTGF5b3V0VGVzdENvbnRyb2xsZXJIYW5kbGVyLnNlbmRFbXB0eU1lc3NhZ2UoTVNHX0RVTVBfREFUQUJBU0VfQ0FMTEJBQ0tTKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBub3RpZnlEb25lKCkgeworICAgICAgICBMb2cuaShMT0dfVEFHLCBtQ3VycmVudFRlc3RSZWxhdGl2ZVBhdGggKyAiOiBub3RpZnlEb25lKCkgY2FsbGVkIik7CisgICAgICAgIG1MYXlvdXRUZXN0Q29udHJvbGxlckhhbmRsZXIuc2VuZEVtcHR5TWVzc2FnZShNU0dfTk9USUZZX0RPTkUpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIG92ZXJyaWRlUHJlZmVyZW5jZShTdHJpbmcga2V5LCBib29sZWFuIHZhbHVlKSB7CisgICAgICAgIExvZy5pKExPR19UQUcsIG1DdXJyZW50VGVzdFJlbGF0aXZlUGF0aCArICI6IG92ZXJyaWRlUHJlZmVyZW5jZSgiICsga2V5ICsgIiwgIiArIHZhbHVlICsKKyAgICAgICAgIikgY2FsbGVkIik7CisgICAgICAgIE1lc3NhZ2UgbXNnID0gbUxheW91dFRlc3RDb250cm9sbGVySGFuZGxlci5vYnRhaW5NZXNzYWdlKE1TR19PVkVSUklERV9QUkVGRVJFTkNFKTsKKyAgICAgICAgbXNnLmdldERhdGEoKS5wdXRTdHJpbmcoImtleSIsIGtleSk7CisgICAgICAgIG1zZy5nZXREYXRhKCkucHV0Qm9vbGVhbigidmFsdWUiLCB2YWx1ZSk7CisgICAgICAgIG1zZy5zZW5kVG9UYXJnZXQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRDYW5PcGVuV2luZG93cygpIHsKKyAgICAgICAgTG9nLmkoTE9HX1RBRywgbUN1cnJlbnRUZXN0UmVsYXRpdmVQYXRoICsgIjogc2V0Q2FuT3BlbldpbmRvd3MoKSBjYWxsZWQiKTsKKyAgICAgICAgbUxheW91dFRlc3RDb250cm9sbGVySGFuZGxlci5zZW5kRW1wdHlNZXNzYWdlKE1TR19TRVRfQ0FOX09QRU5fV0lORE9XUyk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0R2VvbG9jYXRpb25QZXJtaXNzaW9uKGJvb2xlYW4gYWxsb3cpIHsKKyAgICAgICAgTG9nLmkoTE9HX1RBRywgbUN1cnJlbnRUZXN0UmVsYXRpdmVQYXRoICsgIjogc2V0R2VvbG9jYXRpb25QZXJtaXNzaW9uKCIgKyBhbGxvdyArCisgICAgICAgICAgICAgICAgIikgY2FsbGVkIik7CisgICAgICAgIE1lc3NhZ2UgbXNnID0gbUxheW91dFRlc3RDb250cm9sbGVySGFuZGxlci5vYnRhaW5NZXNzYWdlKE1TR19TRVRfR0VPTE9DQVRJT05fUEVSTUlTU0lPTik7CisgICAgICAgIG1zZy5hcmcxID0gYWxsb3cgPyAxIDogMDsKKyAgICAgICAgbXNnLnNlbmRUb1RhcmdldCgpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldE1vY2tEZXZpY2VPcmllbnRhdGlvbihib29sZWFuIGNhblByb3ZpZGVBbHBoYSwgZG91YmxlIGFscGhhLAorICAgICAgICAgICAgYm9vbGVhbiBjYW5Qcm92aWRlQmV0YSwgZG91YmxlIGJldGEsIGJvb2xlYW4gY2FuUHJvdmlkZUdhbW1hLCBkb3VibGUgZ2FtbWEpIHsKKyAgICAgICAgTG9nLmkoTE9HX1RBRywgbUN1cnJlbnRUZXN0UmVsYXRpdmVQYXRoICsgIjogc2V0TW9ja0RldmljZU9yaWVudGF0aW9uKCIgKyBjYW5Qcm92aWRlQWxwaGEgKworICAgICAgICAgICAgICAgICIsICIgKyBhbHBoYSArICIsICIgKyBjYW5Qcm92aWRlQmV0YSArICIsICIgKyBiZXRhICsgIiwgIiArIGNhblByb3ZpZGVHYW1tYSArCisgICAgICAgICAgICAgICAgIiwgIiArIGdhbW1hICsgIikiKTsKKyAgICAgICAgbUN1cnJlbnRXZWJWaWV3LnNldE1vY2tEZXZpY2VPcmllbnRhdGlvbihjYW5Qcm92aWRlQWxwaGEsIGFscGhhLCBjYW5Qcm92aWRlQmV0YSwgYmV0YSwKKyAgICAgICAgICAgICAgICBjYW5Qcm92aWRlR2FtbWEsIGdhbW1hKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRYU1NBdWRpdG9yRW5hYmxlZChib29sZWFuIGZsYWcpIHsKKyAgICAgICAgTG9nLmkoTE9HX1RBRywgbUN1cnJlbnRUZXN0UmVsYXRpdmVQYXRoICsgIjogc2V0WFNTQXVkaXRvckVuYWJsZWQoIiArIGZsYWcgKyAiKSBjYWxsZWQiKTsKKyAgICAgICAgTWVzc2FnZSBtc2cgPSBtTGF5b3V0VGVzdENvbnRyb2xsZXJIYW5kbGVyLm9idGFpbk1lc3NhZ2UoTVNHX1NFVF9YU1NfQVVESVRPUl9FTkFCTEVEKTsKKyAgICAgICAgbXNnLmFyZzEgPSBmbGFnID8gMSA6IDA7CisgICAgICAgIG1zZy5zZW5kVG9UYXJnZXQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB3YWl0VW50aWxEb25lKCkgeworICAgICAgICBMb2cuaShMT0dfVEFHLCBtQ3VycmVudFRlc3RSZWxhdGl2ZVBhdGggKyAiOiB3YWl0VW50aWxEb25lKCkgY2FsbGVkIik7CisgICAgICAgIG1MYXlvdXRUZXN0Q29udHJvbGxlckhhbmRsZXIuc2VuZEVtcHR5TWVzc2FnZShNU0dfV0FJVF9VTlRJTF9ET05FKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9EdW1wUmVuZGVyVHJlZTIvc3JjL2NvbS9hbmRyb2lkL2R1bXByZW5kZXJ0cmVlMi9NYW5hZ2VyU2VydmljZS5qYXZhIGIvdGVzdHMvRHVtcFJlbmRlclRyZWUyL3NyYy9jb20vYW5kcm9pZC9kdW1wcmVuZGVydHJlZTIvTWFuYWdlclNlcnZpY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45Y2FhYmRiCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvRHVtcFJlbmRlclRyZWUyL3NyYy9jb20vYW5kcm9pZC9kdW1wcmVuZGVydHJlZTIvTWFuYWdlclNlcnZpY2UuamF2YQpAQCAtMCwwICsxLDI3OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQuZHVtcHJlbmRlcnRyZWUyOworCitpbXBvcnQgYW5kcm9pZC5hcHAuU2VydmljZTsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworaW1wb3J0IGFuZHJvaWQub3MuRW52aXJvbm1lbnQ7CitpbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyOworaW1wb3J0IGFuZHJvaWQub3MuSUJpbmRlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLk1lc3NhZ2U7CitpbXBvcnQgYW5kcm9pZC5vcy5NZXNzZW5nZXI7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCisvKioKKyAqIEEgc2VydmljZSB0aGF0IGhhbmRsZXMgbWFuYWdpbmcgdGhlIHJlc3VsdHMgb2YgdGVzdHMsIGluZm9ybWluZyBvZiBjcmFzaGVzLCBnZW5lcmF0aW5nCisgKiBzdW1tYXJpZXMsIGV0Yy4KKyAqLworcHVibGljIGNsYXNzIE1hbmFnZXJTZXJ2aWNlIGV4dGVuZHMgU2VydmljZSB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTE9HX1RBRyA9ICJNYW5hZ2VyU2VydmljZSI7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTVNHX0NSQVNIX1RJTUVPVVRfRVhQSVJFRCA9IDA7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQ1JBU0hfVElNRU9VVF9NUyA9IDIwICogMTAwMDsKKworICAgIC8qKiBUT0RPOiBtYWtlIGl0IGEgc2V0dGluZyAqLworICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVTVUxUU19ST09UX0RJUl9QQVRIID0KKyAgICAgICAgICAgIEVudmlyb25tZW50LmdldEV4dGVybmFsU3RvcmFnZURpcmVjdG9yeSgpICsgRmlsZS5zZXBhcmF0b3IgKyAibGF5b3V0LXRlc3QtcmVzdWx0cyI7CisKKyAgICAvKiogVE9ETzogTWFrZSBpdCBhIHNldHRpbmcgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMaXN0PFN0cmluZz4gRVhQRUNURURfUkVTVUxUX0xPQ0FUSU9OX1JFTEFUSVZFX0RJUl9QUkVGSVhFUyA9CisgICAgICAgICAgICBuZXcgQXJyYXlMaXN0PFN0cmluZz4oMyk7CisgICAgeworICAgICAgICBFWFBFQ1RFRF9SRVNVTFRfTE9DQVRJT05fUkVMQVRJVkVfRElSX1BSRUZJWEVTLmFkZCgicGxhdGZvcm0iICsgRmlsZS5zZXBhcmF0b3IgKworICAgICAgICAgICAgICAgICJhbmRyb2lkLXY4IiArIEZpbGUuc2VwYXJhdG9yKTsKKyAgICAgICAgRVhQRUNURURfUkVTVUxUX0xPQ0FUSU9OX1JFTEFUSVZFX0RJUl9QUkVGSVhFUy5hZGQoInBsYXRmb3JtIiArIEZpbGUuc2VwYXJhdG9yICsKKyAgICAgICAgICAgICAgICAiYW5kcm9pZCIgKyBGaWxlLnNlcGFyYXRvcik7CisgICAgICAgIEVYUEVDVEVEX1JFU1VMVF9MT0NBVElPTl9SRUxBVElWRV9ESVJfUFJFRklYRVMuYWRkKCIiKTsKKyAgICB9CisKKyAgICAvKiogVE9ETzogTWFrZSB0aGVzZSBzZXR0aW5ncyAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBURVhUX1JFU1VMVF9FWFRFTlNJT04gPSAidHh0IjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1BR0VfUkVTVUxUX0VYVEVOU0lPTiA9ICJwbmciOworCisgICAgc3RhdGljIGZpbmFsIGludCBNU0dfUFJPQ0VTU19BQ1RVQUxfUkVTVUxUUyA9IDA7CisgICAgc3RhdGljIGZpbmFsIGludCBNU0dfQUxMX1RFU1RTX0ZJTklTSEVEID0gMTsKKyAgICBzdGF0aWMgZmluYWwgaW50IE1TR19GSVJTVF9URVNUID0gMjsKKyAgICBzdGF0aWMgZmluYWwgaW50IE1TR19DVVJSRU5UX1RFU1RfQ1JBU0hFRCA9IDM7CisKKyAgICAvKioKKyAgICAgKiBUaGlzIGhhbmRsZXIgaXMgcHVyZWx5IGZvciBJUEMuIEl0IGlzIHVzZWQgdG8gY3JlYXRlIG1NZXNzZW5nZXIKKyAgICAgKiB0aGF0IGdlbmVyYXRlcyBhIGJpbmRlciByZXR1cm5lZCBpbiBvbkJpbmQgbWV0aG9kLgorICAgICAqLworICAgIHByaXZhdGUgSGFuZGxlciBtSW5jb21pbmdIYW5kbGVyID0gbmV3IEhhbmRsZXIoKSB7CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBoYW5kbGVNZXNzYWdlKE1lc3NhZ2UgbXNnKSB7CisgICAgICAgICAgICBzd2l0Y2ggKG1zZy53aGF0KSB7CisgICAgICAgICAgICAgICAgY2FzZSBNU0dfRklSU1RfVEVTVDoKKyAgICAgICAgICAgICAgICAgICAgbVN1bW1hcml6ZXIucmVzZXQoKTsKKyAgICAgICAgICAgICAgICAgICAgQnVuZGxlIGJ1bmRsZSA9IG1zZy5nZXREYXRhKCk7CisgICAgICAgICAgICAgICAgICAgIGVuc3VyZU5leHRUZXN0U2V0dXAoYnVuZGxlLmdldFN0cmluZygiZmlyc3RUZXN0IiksIGJ1bmRsZS5nZXRJbnQoImluZGV4IikpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGNhc2UgTVNHX1BST0NFU1NfQUNUVUFMX1JFU1VMVFM6CisgICAgICAgICAgICAgICAgICAgIExvZy5kKExPR19UQUcsIm1JbmNvbWluZ0hhbmRsZXI6ICIgKyBtc2cuZ2V0RGF0YSgpLmdldFN0cmluZygicmVsYXRpdmVQYXRoIikpOworICAgICAgICAgICAgICAgICAgICBvbkFjdHVhbFJlc3VsdHNPYnRhaW5lZChtc2cuZ2V0RGF0YSgpKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlIE1TR19DVVJSRU5UX1RFU1RfQ1JBU0hFRDoKKyAgICAgICAgICAgICAgICAgICAgbUNyYXNoTWVzc2FnZXNIYW5kbGVyLnJlbW92ZU1lc3NhZ2VzKE1TR19DUkFTSF9USU1FT1VUX0VYUElSRUQpOworICAgICAgICAgICAgICAgICAgICBvblRlc3RDcmFzaGVkKCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSBNU0dfQUxMX1RFU1RTX0ZJTklTSEVEOgorICAgICAgICAgICAgICAgICAgICBtU3VtbWFyaXplci5zZXRUZXN0c1JlbGF0aXZlUGF0aChtQWxsVGVzdHNSZWxhdGl2ZVBhdGgpOworICAgICAgICAgICAgICAgICAgICBtU3VtbWFyaXplci5zdW1tYXJpemUoKTsKKyAgICAgICAgICAgICAgICAgICAgSW50ZW50IGludGVudCA9IG5ldyBJbnRlbnQoTWFuYWdlclNlcnZpY2UudGhpcywgVGVzdHNMaXN0QWN0aXZpdHkuY2xhc3MpOworICAgICAgICAgICAgICAgICAgICBpbnRlbnQuc2V0QWN0aW9uKEludGVudC5BQ1RJT05fU0hVVERPV04pOworICAgICAgICAgICAgICAgICAgICAvKiogVGhpcyBmbGFnIGlzIG5lZWRlZCBiZWNhdXNlIHdlIHNlbmQgdGhlIGludGVudCBmcm9tIHRoZSBzZXJ2aWNlICovCisgICAgICAgICAgICAgICAgICAgIGludGVudC5hZGRGbGFncyhJbnRlbnQuRkxBR19BQ1RJVklUWV9ORVdfVEFTSyk7CisgICAgICAgICAgICAgICAgICAgIHN0YXJ0QWN0aXZpdHkoaW50ZW50KTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9OworCisgICAgcHJpdmF0ZSBNZXNzZW5nZXIgbU1lc3NlbmdlciA9IG5ldyBNZXNzZW5nZXIobUluY29taW5nSGFuZGxlcik7CisKKyAgICBwcml2YXRlIEhhbmRsZXIgbUNyYXNoTWVzc2FnZXNIYW5kbGVyID0gbmV3IEhhbmRsZXIoKSB7CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBoYW5kbGVNZXNzYWdlKE1lc3NhZ2UgbXNnKSB7CisgICAgICAgICAgICBpZiAobXNnLndoYXQgPT0gTVNHX0NSQVNIX1RJTUVPVVRfRVhQSVJFRCkgeworICAgICAgICAgICAgICAgIG9uVGVzdENyYXNoZWQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH07CisKKyAgICBwcml2YXRlIEZpbGVGaWx0ZXIgbUZpbGVGaWx0ZXI7CisgICAgcHJpdmF0ZSBTdW1tYXJpemVyIG1TdW1tYXJpemVyOworCisgICAgcHJpdmF0ZSBTdHJpbmcgbUN1cnJlbnRseVJ1bm5pbmdUZXN0OworICAgIHByaXZhdGUgaW50IG1DdXJyZW50bHlSdW5uaW5nVGVzdEluZGV4OworCisgICAgLyoqCisgICAgICogVGhlc2UgYXJlIGltcGxlbWVudGF0aW9uIGRldGFpbHMgb2YgZ2V0RXhwZWN0ZWRSZXN1bHRQYXRoKCkgdXNlZCB0byByZWR1Y2UgdGhlIG51bWJlcgorICAgICAqIG9mIHJlcXVlc3RzIHJlcXVpcmVkIHRvIHRoZSBob3N0IHNlcnZlci4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBtTGFzdEV4cGVjdGVkUmVzdWx0UGF0aFJlcXVlc3RlZDsKKyAgICBwcml2YXRlIFN0cmluZyBtTGFzdEV4cGVjdGVkUmVzdWx0UGF0aEZldGNoZWQ7CisKKyAgICBwcml2YXRlIFN0cmluZyBtQWxsVGVzdHNSZWxhdGl2ZVBhdGg7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvbkNyZWF0ZSgpIHsKKyAgICAgICAgc3VwZXIub25DcmVhdGUoKTsKKworICAgICAgICBtRmlsZUZpbHRlciA9IG5ldyBGaWxlRmlsdGVyKCk7CisgICAgICAgIG1TdW1tYXJpemVyID0gbmV3IFN1bW1hcml6ZXIobUZpbGVGaWx0ZXIsIFJFU1VMVFNfUk9PVF9ESVJfUEFUSCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGludCBvblN0YXJ0Q29tbWFuZChJbnRlbnQgaW50ZW50LCBpbnQgZmxhZ3MsIGludCBzdGFydElkKSB7CisgICAgICAgIG1BbGxUZXN0c1JlbGF0aXZlUGF0aCA9IGludGVudC5nZXRTdHJpbmdFeHRyYSgicGF0aCIpOworICAgICAgICBhc3NlcnQgbUFsbFRlc3RzUmVsYXRpdmVQYXRoICE9IG51bGw7CisgICAgICAgIHJldHVybiBTVEFSVF9TVElDS1k7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIElCaW5kZXIgb25CaW5kKEludGVudCBpbnRlbnQpIHsKKyAgICAgICAgcmV0dXJuIG1NZXNzZW5nZXIuZ2V0QmluZGVyKCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIG9uQWN0dWFsUmVzdWx0c09idGFpbmVkKEJ1bmRsZSBidW5kbGUpIHsKKyAgICAgICAgbUNyYXNoTWVzc2FnZXNIYW5kbGVyLnJlbW92ZU1lc3NhZ2VzKE1TR19DUkFTSF9USU1FT1VUX0VYUElSRUQpOworICAgICAgICBlbnN1cmVOZXh0VGVzdFNldHVwKGJ1bmRsZS5nZXRTdHJpbmcoIm5leHRUZXN0IiksIGJ1bmRsZS5nZXRJbnQoInRlc3RJbmRleCIpICsgMSk7CisKKyAgICAgICAgQWJzdHJhY3RSZXN1bHQgcmVzdWx0cyA9CisgICAgICAgICAgICAgICAgQWJzdHJhY3RSZXN1bHQuVGVzdFR5cGUudmFsdWVPZihidW5kbGUuZ2V0U3RyaW5nKCJ0eXBlIikpLmNyZWF0ZVJlc3VsdChidW5kbGUpOworCisgICAgICAgIExvZy5pKExPR19UQUcsICJvbkFjdHVhbFJlc3VsdE9idGFpbmVkOiAiICsgcmVzdWx0cy5nZXRSZWxhdGl2ZVBhdGgoKSk7CisgICAgICAgIGhhbmRsZVJlc3VsdHMocmVzdWx0cyk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGVuc3VyZU5leHRUZXN0U2V0dXAoU3RyaW5nIG5leHRUZXN0LCBpbnQgaW5kZXgpIHsKKyAgICAgICAgaWYgKG5leHRUZXN0ID09IG51bGwpIHsKKyAgICAgICAgICAgIExvZy53KExPR19UQUcsICJlbnN1cmVOZXh0VGVzdFNldHVwKCk6IG5leHRUZXN0PW51bGwiKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIG1DdXJyZW50bHlSdW5uaW5nVGVzdCA9IG5leHRUZXN0OworICAgICAgICBtQ3VycmVudGx5UnVubmluZ1Rlc3RJbmRleCA9IGluZGV4OworICAgICAgICBtQ3Jhc2hNZXNzYWdlc0hhbmRsZXIuc2VuZEVtcHR5TWVzc2FnZURlbGF5ZWQoTVNHX0NSQVNIX1RJTUVPVVRfRVhQSVJFRCwgQ1JBU0hfVElNRU9VVF9NUyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhpcyBzZW5kcyBhbiBpbnRlbnQgdG8gVGVzdHNMaXN0QWN0aXZpdHkgdG8gcmVzdGFydCBMYXlvdXRUZXN0c0V4ZWN1dG9yLgorICAgICAqIFRoZSBtb3JlIGRldGFpbGVkIGRlc2NyaXB0aW9uIG9mIHRoZSBmbG93IGlzIGluIHRoZSBjb21tZW50IG9mIG9uTmV3SW50ZW50CisgICAgICogbWV0aG9kIGluIFRlc3RzTGlzdEFjdGl2aXR5LgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBvblRlc3RDcmFzaGVkKCkgeworICAgICAgICBoYW5kbGVSZXN1bHRzKG5ldyBDcmFzaGVkRHVtbXlSZXN1bHQobUN1cnJlbnRseVJ1bm5pbmdUZXN0KSk7CisKKyAgICAgICAgTG9nLncoTE9HX1RBRywgIm9uVGVzdENyYXNoZWQoKTogIiArIG1DdXJyZW50bHlSdW5uaW5nVGVzdCArCisgICAgICAgICAgICAgICAgIiAoIiArIG1DdXJyZW50bHlSdW5uaW5nVGVzdEluZGV4ICsgIikiKTsKKworICAgICAgICBJbnRlbnQgaW50ZW50ID0gbmV3IEludGVudCh0aGlzLCBUZXN0c0xpc3RBY3Rpdml0eS5jbGFzcyk7CisgICAgICAgIGludGVudC5zZXRBY3Rpb24oSW50ZW50LkFDVElPTl9SRUJPT1QpOworICAgICAgICAvKiogVGhpcyBmbGFnIGlzIG5lZWRlZCBiZWNhdXNlIHdlIHNlbmQgdGhlIGludGVudCBmcm9tIHRoZSBzZXJ2aWNlICovCisgICAgICAgIGludGVudC5hZGRGbGFncyhJbnRlbnQuRkxBR19BQ1RJVklUWV9ORVdfVEFTSyk7CisgICAgICAgIGludGVudC5wdXRFeHRyYSgiY3Jhc2hlZFRlc3RJbmRleCIsIG1DdXJyZW50bHlSdW5uaW5nVGVzdEluZGV4KTsKKyAgICAgICAgc3RhcnRBY3Rpdml0eShpbnRlbnQpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBoYW5kbGVSZXN1bHRzKEFic3RyYWN0UmVzdWx0IHJlc3VsdHMpIHsKKyAgICAgICAgU3RyaW5nIHJlbGF0aXZlUGF0aCA9IHJlc3VsdHMuZ2V0UmVsYXRpdmVQYXRoKCk7CisgICAgICAgIHJlc3VsdHMuc2V0RXhwZWN0ZWRUZXh0UmVzdWx0KGdldEV4cGVjdGVkVGV4dFJlc3VsdChyZWxhdGl2ZVBhdGgpKTsKKyAgICAgICAgcmVzdWx0cy5zZXRFeHBlY3RlZFRleHRSZXN1bHRQYXRoKGdldEV4cGVjdGVkVGV4dFJlc3VsdFBhdGgocmVsYXRpdmVQYXRoKSk7CisgICAgICAgIHJlc3VsdHMuc2V0RXhwZWN0ZWRJbWFnZVJlc3VsdChnZXRFeHBlY3RlZEltYWdlUmVzdWx0KHJlbGF0aXZlUGF0aCkpOworICAgICAgICByZXN1bHRzLnNldEV4cGVjdGVkSW1hZ2VSZXN1bHRQYXRoKGdldEV4cGVjdGVkSW1hZ2VSZXN1bHRQYXRoKHJlbGF0aXZlUGF0aCkpOworCisgICAgICAgIGR1bXBBY3R1YWxUZXh0UmVzdWx0KHJlc3VsdHMpOworICAgICAgICBkdW1wQWN0dWFsSW1hZ2VSZXN1bHQocmVzdWx0cyk7CisKKyAgICAgICAgbVN1bW1hcml6ZXIuYXBwZW5kVGVzdChyZXN1bHRzKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgZHVtcEFjdHVhbFRleHRSZXN1bHQoQWJzdHJhY3RSZXN1bHQgcmVzdWx0KSB7CisgICAgICAgIFN0cmluZyB0ZXN0UGF0aCA9IHJlc3VsdC5nZXRSZWxhdGl2ZVBhdGgoKTsKKyAgICAgICAgU3RyaW5nIGFjdHVhbFRleHRSZXN1bHQgPSByZXN1bHQuZ2V0QWN0dWFsVGV4dFJlc3VsdCgpOworICAgICAgICBpZiAoYWN0dWFsVGV4dFJlc3VsdCA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBTdHJpbmcgcmVzdWx0UGF0aCA9IEZpbGVGaWx0ZXIuc2V0UGF0aEVuZGluZyh0ZXN0UGF0aCwgIi1hY3R1YWwuIiArIFRFWFRfUkVTVUxUX0VYVEVOU0lPTik7CisgICAgICAgIEZzVXRpbHMud3JpdGVEYXRhVG9TdG9yYWdlKG5ldyBGaWxlKFJFU1VMVFNfUk9PVF9ESVJfUEFUSCwgcmVzdWx0UGF0aCksCisgICAgICAgICAgICAgICAgYWN0dWFsVGV4dFJlc3VsdC5nZXRCeXRlcygpLCBmYWxzZSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGR1bXBBY3R1YWxJbWFnZVJlc3VsdChBYnN0cmFjdFJlc3VsdCByZXN1bHQpIHsKKyAgICAgICAgU3RyaW5nIHRlc3RQYXRoID0gcmVzdWx0LmdldFJlbGF0aXZlUGF0aCgpOworICAgICAgICBieXRlW10gYWN0dWFsSW1hZ2VSZXN1bHQgPSByZXN1bHQuZ2V0QWN0dWFsSW1hZ2VSZXN1bHQoKTsKKyAgICAgICAgaWYgKGFjdHVhbEltYWdlUmVzdWx0ID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIFN0cmluZyByZXN1bHRQYXRoID0gRmlsZUZpbHRlci5zZXRQYXRoRW5kaW5nKHRlc3RQYXRoLAorICAgICAgICAgICAgICAgICItYWN0dWFsLiIgKyBJTUFHRV9SRVNVTFRfRVhURU5TSU9OKTsKKyAgICAgICAgRnNVdGlscy53cml0ZURhdGFUb1N0b3JhZ2UobmV3IEZpbGUoUkVTVUxUU19ST09UX0RJUl9QQVRILCByZXN1bHRQYXRoKSwKKyAgICAgICAgICAgICAgICBhY3R1YWxJbWFnZVJlc3VsdCwgZmFsc2UpOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0RXhwZWN0ZWRUZXh0UmVzdWx0KFN0cmluZyByZWxhdGl2ZVBhdGgpIHsKKyAgICAgICAgYnl0ZVtdIHJlc3VsdCA9IGdldEV4cGVjdGVkUmVzdWx0KHJlbGF0aXZlUGF0aCwgVEVYVF9SRVNVTFRfRVhURU5TSU9OKTsKKyAgICAgICAgaWYgKHJlc3VsdCAhPSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IFN0cmluZyhyZXN1bHQpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIHB1YmxpYyBieXRlW10gZ2V0RXhwZWN0ZWRJbWFnZVJlc3VsdChTdHJpbmcgcmVsYXRpdmVQYXRoKSB7CisgICAgICAgIHJldHVybiBnZXRFeHBlY3RlZFJlc3VsdChyZWxhdGl2ZVBhdGgsIElNQUdFX1JFU1VMVF9FWFRFTlNJT04pOworICAgIH0KKworICAgIHByaXZhdGUgYnl0ZVtdIGdldEV4cGVjdGVkUmVzdWx0KFN0cmluZyByZWxhdGl2ZVBhdGgsIFN0cmluZyBleHRlbnNpb24pIHsKKyAgICAgICAgU3RyaW5nIG9yaWdpbmFsUmVsYXRpdmVQYXRoID0KKyAgICAgICAgICAgICAgICBGaWxlRmlsdGVyLnNldFBhdGhFbmRpbmcocmVsYXRpdmVQYXRoLCAiLWV4cGVjdGVkLiIgKyBleHRlbnNpb24pOworICAgICAgICBtTGFzdEV4cGVjdGVkUmVzdWx0UGF0aFJlcXVlc3RlZCA9IG9yaWdpbmFsUmVsYXRpdmVQYXRoOworCisgICAgICAgIGJ5dGVbXSBieXRlcyA9IG51bGw7CisgICAgICAgIExpc3Q8U3RyaW5nPiBsb2NhdGlvbnMgPSBFWFBFQ1RFRF9SRVNVTFRfTE9DQVRJT05fUkVMQVRJVkVfRElSX1BSRUZJWEVTOworCisgICAgICAgIGludCBzaXplID0gRVhQRUNURURfUkVTVUxUX0xPQ0FUSU9OX1JFTEFUSVZFX0RJUl9QUkVGSVhFUy5zaXplKCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBieXRlcyA9PSBudWxsICYmIGkgPCBzaXplOyBpKyspIHsKKyAgICAgICAgICAgIHJlbGF0aXZlUGF0aCA9IGxvY2F0aW9ucy5nZXQoaSkgKyBvcmlnaW5hbFJlbGF0aXZlUGF0aDsKKyAgICAgICAgICAgIGJ5dGVzID0gRnNVdGlscy5yZWFkRGF0YUZyb21VcmwoRmlsZUZpbHRlci5nZXRVcmwocmVsYXRpdmVQYXRoKSk7CisgICAgICAgIH0KKworICAgICAgICBtTGFzdEV4cGVjdGVkUmVzdWx0UGF0aEZldGNoZWQgPSByZWxhdGl2ZVBhdGg7CisgICAgICAgIHJldHVybiBieXRlczsKKyAgICB9CisKKyAgICBwcml2YXRlIFN0cmluZyBnZXRFeHBlY3RlZFRleHRSZXN1bHRQYXRoKFN0cmluZyByZWxhdGl2ZVBhdGgpIHsKKyAgICAgICAgcmV0dXJuIGdldEV4cGVjdGVkUmVzdWx0UGF0aChyZWxhdGl2ZVBhdGgsIFRFWFRfUkVTVUxUX0VYVEVOU0lPTik7CisgICAgfQorCisgICAgcHJpdmF0ZSBTdHJpbmcgZ2V0RXhwZWN0ZWRJbWFnZVJlc3VsdFBhdGgoU3RyaW5nIHJlbGF0aXZlUGF0aCkgeworICAgICAgICByZXR1cm4gZ2V0RXhwZWN0ZWRSZXN1bHRQYXRoKHJlbGF0aXZlUGF0aCwgSU1BR0VfUkVTVUxUX0VYVEVOU0lPTik7CisgICAgfQorCisgICAgcHJpdmF0ZSBTdHJpbmcgZ2V0RXhwZWN0ZWRSZXN1bHRQYXRoKFN0cmluZyByZWxhdGl2ZVBhdGgsIFN0cmluZyBleHRlbnNpb24pIHsKKyAgICAgICAgU3RyaW5nIG9yaWdpbmFsUmVsYXRpdmVQYXRoID0KKyAgICAgICAgICAgIEZpbGVGaWx0ZXIuc2V0UGF0aEVuZGluZyhyZWxhdGl2ZVBhdGgsICItZXhwZWN0ZWQuIiArIGV4dGVuc2lvbik7CisgICAgICAgIGlmICghb3JpZ2luYWxSZWxhdGl2ZVBhdGguZXF1YWxzKG1MYXN0RXhwZWN0ZWRSZXN1bHRQYXRoUmVxdWVzdGVkKSkgeworICAgICAgICAgICAgZ2V0RXhwZWN0ZWRSZXN1bHQocmVsYXRpdmVQYXRoLCBleHRlbnNpb24pOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIG1MYXN0RXhwZWN0ZWRSZXN1bHRQYXRoRmV0Y2hlZDsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9EdW1wUmVuZGVyVHJlZTIvc3JjL2NvbS9hbmRyb2lkL2R1bXByZW5kZXJ0cmVlMi9TdW1tYXJpemVyLmphdmEgYi90ZXN0cy9EdW1wUmVuZGVyVHJlZTIvc3JjL2NvbS9hbmRyb2lkL2R1bXByZW5kZXJ0cmVlMi9TdW1tYXJpemVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmNkZTI5NgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL0R1bXBSZW5kZXJUcmVlMi9zcmMvY29tL2FuZHJvaWQvZHVtcHJlbmRlcnRyZWUyL1N1bW1hcml6ZXIuamF2YQpAQCAtMCwwICsxLDQ4MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQuZHVtcHJlbmRlcnRyZWUyOworCitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5Bc3NldE1hbmFnZXI7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5Db25maWd1cmF0aW9uOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuUmVzb3VyY2VzOworaW1wb3J0IGFuZHJvaWQub3MuQnVpbGQ7CitpbXBvcnQgYW5kcm9pZC51dGlsLkRpc3BsYXlNZXRyaWNzOworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CisKK2ltcG9ydCBjb20uYW5kcm9pZC5kdW1wcmVuZGVydHJlZTIuZm9yd2FyZGVyLkZvcndhcmRlck1hbmFnZXI7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmV0LlVSSTsKK2ltcG9ydCBqYXZhLm5ldC5VUkw7CitpbXBvcnQgamF2YS50ZXh0LlNpbXBsZURhdGVGb3JtYXQ7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkRhdGU7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLnJlZ2V4Lk1hdGNoZXI7CitpbXBvcnQgamF2YS51dGlsLnJlZ2V4LlBhdHRlcm47CisKKy8qKgorICogQSBjbGFzcyB0aGF0IGNvbGxlY3RzIGluZm9ybWF0aW9uIGFib3V0IHRlc3RzIHRoYXQgcmFuIGFuZCBjYW4gY3JlYXRlIEhUTUwKKyAqIGZpbGVzIHdpdGggc3VtbWFyaWVzIGFuZCBlYXN5IG5hdmlnYXRpb24uCisgKi8KK3B1YmxpYyBjbGFzcyBTdW1tYXJpemVyIHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMT0dfVEFHID0gIlN1bW1hcml6ZXIiOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENTUyA9CisgICAgICAgICAgICAiPHN0eWxlIHR5cGU9XCJ0ZXh0L2Nzc1wiPiIgKworICAgICAgICAgICAgIiogeyIgKworICAgICAgICAgICAgIiAgICAgICBmb250LWZhbWlseTogVmVyZGFuYTsiICsKKyAgICAgICAgICAgICIgICAgICAgYm9yZGVyOiAwOyIgKworICAgICAgICAgICAgIiAgICAgICBtYXJnaW46IDA7IiArCisgICAgICAgICAgICAiICAgICAgIHBhZGRpbmc6IDA7fSIgKworICAgICAgICAgICAgImJvZHkgeyIgKworICAgICAgICAgICAgIiAgICAgICBtYXJnaW46IDEwcHg7fSIgKworICAgICAgICAgICAgImgxIHsiICsKKyAgICAgICAgICAgICIgICAgICAgZm9udC1zaXplOiAyNHB4OyIgKworICAgICAgICAgICAgIiAgICAgICBtYXJnaW46IDRweCAwIDRweCAwO30iICsKKyAgICAgICAgICAgICJoMiB7IiArCisgICAgICAgICAgICAiICAgICAgIGZvbnQtc2l6ZToxOHB4OyIgKworICAgICAgICAgICAgIiAgICAgICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlOyIgKworICAgICAgICAgICAgIiAgICAgICBtYXJnaW46IDIwcHggMCAzcHggMDt9IiArCisgICAgICAgICAgICAiaDMsIGgzIGEgeyIgKworICAgICAgICAgICAgIiAgICAgICBmb250LXNpemU6IDE0cHg7IiArCisgICAgICAgICAgICAiICAgICAgIGNvbG9yOiBibGFjazsiICsKKyAgICAgICAgICAgICIgICAgICAgdGV4dC1kZWNvcmF0aW9uOiBub25lOyIgKworICAgICAgICAgICAgIiAgICAgICBtYXJnaW4tdG9wOiA0cHg7IiArCisgICAgICAgICAgICAiICAgICAgIG1hcmdpbi1ib3R0b206IDJweDt9IiArCisgICAgICAgICAgICAiaDMgYSBzcGFuLnBhdGggeyIgKworICAgICAgICAgICAgIiAgICAgICB0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTt9IiArCisgICAgICAgICAgICAiaDMgc3Bhbi50cmkgeyIgKworICAgICAgICAgICAgIiAgICAgICB0ZXh0LWRlY29yYXRpb246IG5vbmU7IiArCisgICAgICAgICAgICAiICAgICAgIGZsb2F0OiBsZWZ0OyIgKworICAgICAgICAgICAgIiAgICAgICB3aWR0aDogMjBweDt9IiArCisgICAgICAgICAgICAiaDMgc3Bhbi5zcXIgeyIgKworICAgICAgICAgICAgIiAgICAgICB0ZXh0LWRlY29yYXRpb246IG5vbmU7IiArCisgICAgICAgICAgICAiICAgICAgIGNvbG9yOiAjOGVlMTAwOyIgKworICAgICAgICAgICAgIiAgICAgICBmbG9hdDogbGVmdDsiICsKKyAgICAgICAgICAgICIgICAgICAgd2lkdGg6IDIwcHg7fSIgKworICAgICAgICAgICAgInNwYW4uc291cmNlIHsiICsKKyAgICAgICAgICAgICIgICAgICAgZGlzcGxheTogYmxvY2s7IiArCisgICAgICAgICAgICAiICAgICAgIGZvbnQtc2l6ZTogMTBweDsiICsKKyAgICAgICAgICAgICIgICAgICAgY29sb3I6ICM4ODg7IiArCisgICAgICAgICAgICAiICAgICAgIG1hcmdpbi1sZWZ0OiAyMHB4OyIgKworICAgICAgICAgICAgIiAgICAgICBtYXJnaW4tYm90dG9tOiAxcHg7fSIgKworICAgICAgICAgICAgInNwYW4uc291cmNlIGEgeyIgKworICAgICAgICAgICAgIiAgICAgICBmb250LXNpemU6IDEwcHg7IiArCisgICAgICAgICAgICAiICAgICAgIGNvbG9yOiAjODg4O30iICsKKyAgICAgICAgICAgICJoMyBpbWcgeyIgKworICAgICAgICAgICAgIiAgICAgICB3aWR0aDogOHB4OyIgKworICAgICAgICAgICAgIiAgICAgICBtYXJnaW4tcmlnaHQ6IDRweDt9IiArCisgICAgICAgICAgICAiZGl2LmRpZmYgeyIgKworICAgICAgICAgICAgIiAgICAgICBtYXJnaW4tYm90dG9tOiAyNXB4O30iICsKKyAgICAgICAgICAgICJkaXYuZGlmZiBhIHsiICsKKyAgICAgICAgICAgICIgICAgICAgZm9udC1zaXplOiAxMnB4OyIgKworICAgICAgICAgICAgIiAgICAgICBjb2xvcjogIzg4ODt9IiArCisgICAgICAgICAgICAidGFibGUudmlzdWFsX2RpZmYgeyIgKworICAgICAgICAgICAgIiAgICAgICBib3JkZXItYm90dG9tOiAwcHggc29saWQ7IiArCisgICAgICAgICAgICAiICAgICAgIGJvcmRlci1jb2xsYXBzZTogY29sbGFwc2U7IiArCisgICAgICAgICAgICAiICAgICAgIHdpZHRoOiAxMDAlOyIgKworICAgICAgICAgICAgIiAgICAgICBtYXJnaW4tYm90dG9tOiAycHg7fSIgKworICAgICAgICAgICAgInRhYmxlLnZpc3VhbF9kaWZmIHRyLmhlYWRlcnMgdGQgeyIgKworICAgICAgICAgICAgIiAgICAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQ7IiArCisgICAgICAgICAgICAiICAgICAgIGJvcmRlci10b3A6IDA7IiArCisgICAgICAgICAgICAiICAgICAgIHBhZGRpbmctYm90dG9tOiAzcHg7fSIgKworICAgICAgICAgICAgInRhYmxlLnZpc3VhbF9kaWZmIHRyLnJlc3VsdHMgdGQgeyIgKworICAgICAgICAgICAgIiAgICAgICBib3JkZXItdG9wOiAxcHggZGFzaGVkOyIgKworICAgICAgICAgICAgIiAgICAgICBib3JkZXItcmlnaHQ6IDFweCBzb2xpZDsiICsKKyAgICAgICAgICAgICIgICAgICAgZm9udC1zaXplOiAxNXB4OyIgKworICAgICAgICAgICAgIiAgICAgICB2ZXJ0aWNhbC1hbGlnbjogdG9wO30iICsKKyAgICAgICAgICAgICJ0YWJsZS52aXN1YWxfZGlmZiB0ci5yZXN1bHRzIHRkLmxpbmVfY291bnQgeyIgKworICAgICAgICAgICAgIiAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiNhYWE7IiArCisgICAgICAgICAgICAiICAgICAgIG1pbi13aWR0aDoyMHB4OyIgKworICAgICAgICAgICAgIiAgICAgICB0ZXh0LWFsaWduOiByaWdodDsiICsKKyAgICAgICAgICAgICIgICAgICAgYm9yZGVyLXJpZ2h0OiAxcHggc29saWQ7IiArCisgICAgICAgICAgICAiICAgICAgIGJvcmRlci1sZWZ0OiAxcHggc29saWQ7IiArCisgICAgICAgICAgICAiICAgICAgIHBhZGRpbmc6IDJweCAxcHggMnB4IDBweDt9IiArCisgICAgICAgICAgICAidGFibGUudmlzdWFsX2RpZmYgdHIucmVzdWx0cyB0ZC5saW5lIHsiICsKKyAgICAgICAgICAgICIgICAgICAgcGFkZGluZzogMnB4IDBweCAycHggNHB4OyIgKworICAgICAgICAgICAgIiAgICAgICBib3JkZXItcmlnaHQ6IDFweCBzb2xpZDsiICsKKyAgICAgICAgICAgICIgICAgICAgd2lkdGg6IDQ5LjglO30iICsKKyAgICAgICAgICAgICJ0YWJsZS52aXN1YWxfZGlmZiB0ci5mb290ZXJzIHRkIHsiICsKKyAgICAgICAgICAgICIgICAgICAgYm9yZGVyLXRvcDogMXB4IHNvbGlkOyIgKworICAgICAgICAgICAgIiAgICAgICBib3JkZXItYm90dG9tOiAwO30iICsKKyAgICAgICAgICAgICJ0YWJsZS52aXN1YWxfZGlmZiB0ciB0ZC5zcGFjZSB7IiArCisgICAgICAgICAgICAiICAgICAgIGJvcmRlcjogMDsiICsKKyAgICAgICAgICAgICIgICAgICAgd2lkdGg6IDAuNCV9IiArCisgICAgICAgICAgICAiZGl2LnNwYWNlIHsiICsKKyAgICAgICAgICAgICIgICAgICAgbWFyZ2luLXRvcDo0cHg7fSIgKworICAgICAgICAgICAgInNwYW4uZXFsIHsiICsKKyAgICAgICAgICAgICIgICAgICAgYmFja2dyb3VuZC1jb2xvcjogI2YzZjNmMzt9IiArCisgICAgICAgICAgICAic3Bhbi5kZWwgeyIgKworICAgICAgICAgICAgIiAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmY4ODg4OyB9IiArCisgICAgICAgICAgICAic3Bhbi5pbnMgeyIgKworICAgICAgICAgICAgIiAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjODhmZjg4OyB9IiArCisgICAgICAgICAgICAic3Bhbi5mYWlsIHsiICsKKyAgICAgICAgICAgICIgICAgICAgY29sb3I6IHJlZDt9IiArCisgICAgICAgICAgICAic3Bhbi5wYXNzIHsiICsKKyAgICAgICAgICAgICIgICAgICAgY29sb3I6IGdyZWVuO30iICsKKyAgICAgICAgICAgICJzcGFuLnRpbWVfb3V0IHsiICsKKyAgICAgICAgICAgICIgICAgICAgY29sb3I6IG9yYW5nZTt9IiArCisgICAgICAgICAgICAidGFibGUuc3VtbWFyeSB7IiArCisgICAgICAgICAgICAiICAgICAgIGJvcmRlcjogMXB4IHNvbGlkIGJsYWNrOyIgKworICAgICAgICAgICAgIiAgICAgICBtYXJnaW4tdG9wOiAyMHB4O30iICsKKyAgICAgICAgICAgICJ0YWJsZS5zdW1tYXJ5IHRkIHsiICsKKyAgICAgICAgICAgICIgICAgICAgcGFkZGluZzogM3B4O30iICsKKyAgICAgICAgICAgICJzcGFuLmxpc3RJdGVtIHsiICsKKyAgICAgICAgICAgICIgICAgICAgZm9udC1zaXplOiAxMXB4OyIgKworICAgICAgICAgICAgIiAgICAgICBmb250LXdlaWdodDogbm9ybWFsOyIgKworICAgICAgICAgICAgIiAgICAgICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlOyIgKworICAgICAgICAgICAgIiAgICAgICBwYWRkaW5nOiAzcHg7IiArCisgICAgICAgICAgICAiICAgICAgIC13ZWJraXQtYm9yZGVyLXJhZGl1czogNHB4O30iICsKKyAgICAgICAgICAgICJzcGFuLiIgKyBBYnN0cmFjdFJlc3VsdC5SZXN1bHRDb2RlLlBBU1MubmFtZSgpICsgInsiICsKKyAgICAgICAgICAgICIgICAgICAgYmFja2dyb3VuZC1jb2xvcjogIzhlZTEwMDsiICsKKyAgICAgICAgICAgICIgICAgICAgY29sb3I6IGJsYWNrO30iICsKKyAgICAgICAgICAgICJzcGFuLiIgKyBBYnN0cmFjdFJlc3VsdC5SZXN1bHRDb2RlLkZBSUxfUkVTVUxUX0RJRkZFUlMubmFtZSgpICsgInsiICsKKyAgICAgICAgICAgICIgICAgICAgYmFja2dyb3VuZC1jb2xvcjogI2NjYzsiICsKKyAgICAgICAgICAgICIgICAgICAgY29sb3I6IGJsYWNrO30iICsKKyAgICAgICAgICAgICJzcGFuLiIgKyBBYnN0cmFjdFJlc3VsdC5SZXN1bHRDb2RlLkZBSUxfTk9fRVhQRUNURURfUkVTVUxULm5hbWUoKSArICJ7IiArCisgICAgICAgICAgICAiICAgICAgIGJhY2tncm91bmQtY29sb3I6ICNhNzAwZTQ7IiArCisgICAgICAgICAgICAiICAgICAgIGNvbG9yOiAjZmZmO30iICsKKyAgICAgICAgICAgICJzcGFuLiIgKyBBYnN0cmFjdFJlc3VsdC5SZXN1bHRDb2RlLkZBSUxfVElNRURfT1VULm5hbWUoKSArICJ7IiArCisgICAgICAgICAgICAiICAgICAgIGJhY2tncm91bmQtY29sb3I6ICNmM2NiMDA7IiArCisgICAgICAgICAgICAiICAgICAgIGNvbG9yOiBibGFjazt9IiArCisgICAgICAgICAgICAic3Bhbi4iICsgQWJzdHJhY3RSZXN1bHQuUmVzdWx0Q29kZS5GQUlMX0NSQVNIRUQubmFtZSgpICsgInsiICsKKyAgICAgICAgICAgICIgICAgICAgYmFja2dyb3VuZC1jb2xvcjogI2MzMDAwMDsiICsKKyAgICAgICAgICAgICIgICAgICAgY29sb3I6ICNmZmY7fSIgKworICAgICAgICAgICAgInNwYW4ubm9MdGMgeyIgKworICAgICAgICAgICAgIiAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjOTQ0MDAwOyIgKworICAgICAgICAgICAgIiAgICAgICBjb2xvcjogI2ZmZjt9IiArCisgICAgICAgICAgICAic3Bhbi5ub0V2ZW50U2VuZGVyIHsiICsKKyAgICAgICAgICAgICIgICAgICAgYmFja2dyb3VuZC1jb2xvcjogIzgxNTYwMDsiICsKKyAgICAgICAgICAgICIgICAgICAgY29sb3I6ICNmZmY7fSIgKworICAgICAgICAgICAgIjwvc3R5bGU+IjsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTQ1JJUFQgPQorICAgICAgICAgICAgIjxzY3JpcHQgdHlwZT1cInRleHQvamF2YXNjcmlwdFwiPiIgKworICAgICAgICAgICAgIiAgICBmdW5jdGlvbiB0b2dnbGVEaXNwbGF5KGlkKSB7IiArCisgICAgICAgICAgICAiICAgICAgICBlbGVtZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaWQpOyIgKworICAgICAgICAgICAgIiAgICAgICAgdHJpYW5nbGUgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndHJpLicgKyBpZCk7IiArCisgICAgICAgICAgICAiICAgICAgICBpZiAoZWxlbWVudC5zdHlsZS5kaXNwbGF5ID09ICdub25lJykgeyIgKworICAgICAgICAgICAgIiAgICAgICAgICAgIGVsZW1lbnQuc3R5bGUuZGlzcGxheSA9ICdpbmxpbmUnOyIgKworICAgICAgICAgICAgIiAgICAgICAgICAgIHRyaWFuZ2xlLmlubmVySFRNTCA9ICcmI3gyNWJjOyAnOyIgKworICAgICAgICAgICAgIiAgICAgICAgfSBlbHNlIHsiICsKKyAgICAgICAgICAgICIgICAgICAgICAgICBlbGVtZW50LnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7IiArCisgICAgICAgICAgICAiICAgICAgICAgICAgdHJpYW5nbGUuaW5uZXJIVE1MID0gJyYjeDI1YjY7ICc7IiArCisgICAgICAgICAgICAiICAgICAgICB9IiArCisgICAgICAgICAgICAiICAgIH0iICsKKyAgICAgICAgICAgICI8L3NjcmlwdD4iOworCisgICAgLyoqIFRPRE86IE1ha2UgaXQgYSBzZXR0aW5nICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEhUTUxfREVUQUlMU19SRUxBVElWRV9QQVRIID0gImRldGFpbHMuaHRtbCI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRYVF9TVU1NQVJZX1JFTEFUSVZFX1BBVEggPSAic3VtbWFyeS50eHQiOworCisgICAgcHJpdmF0ZSBpbnQgbUNyYXNoZWRUZXN0c0NvdW50ID0gMDsKKyAgICBwcml2YXRlIExpc3Q8QWJzdHJhY3RSZXN1bHQ+IG1VbmV4cGVjdGVkRmFpbHVyZXMgPSBuZXcgQXJyYXlMaXN0PEFic3RyYWN0UmVzdWx0PigpOworICAgIHByaXZhdGUgTGlzdDxBYnN0cmFjdFJlc3VsdD4gbUV4cGVjdGVkRmFpbHVyZXMgPSBuZXcgQXJyYXlMaXN0PEFic3RyYWN0UmVzdWx0PigpOworICAgIHByaXZhdGUgTGlzdDxBYnN0cmFjdFJlc3VsdD4gbUV4cGVjdGVkUGFzc2VzID0gbmV3IEFycmF5TGlzdDxBYnN0cmFjdFJlc3VsdD4oKTsKKyAgICBwcml2YXRlIExpc3Q8QWJzdHJhY3RSZXN1bHQ+IG1VbmV4cGVjdGVkUGFzc2VzID0gbmV3IEFycmF5TGlzdDxBYnN0cmFjdFJlc3VsdD4oKTsKKworICAgIHByaXZhdGUgRmlsZUZpbHRlciBtRmlsZUZpbHRlcjsKKyAgICBwcml2YXRlIFN0cmluZyBtUmVzdWx0c1Jvb3REaXJQYXRoOworICAgIHByaXZhdGUgU3RyaW5nIG1UZXN0c1JlbGF0aXZlUGF0aDsKKyAgICBwcml2YXRlIERhdGUgbURhdGU7CisKKyAgICBwdWJsaWMgU3VtbWFyaXplcihGaWxlRmlsdGVyIGZpbGVGaWx0ZXIsIFN0cmluZyByZXN1bHRzUm9vdERpclBhdGgpIHsKKyAgICAgICAgbUZpbGVGaWx0ZXIgPSBmaWxlRmlsdGVyOworICAgICAgICBtUmVzdWx0c1Jvb3REaXJQYXRoID0gcmVzdWx0c1Jvb3REaXJQYXRoOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgVVJJIGdldERldGFpbHNVcmkoKSB7CisgICAgICAgIHJldHVybiBuZXcgRmlsZShNYW5hZ2VyU2VydmljZS5SRVNVTFRTX1JPT1RfRElSX1BBVEggKyBGaWxlLnNlcGFyYXRvciArCisgICAgICAgICAgICAgICAgSFRNTF9ERVRBSUxTX1JFTEFUSVZFX1BBVEgpLnRvVVJJKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgYXBwZW5kVGVzdChBYnN0cmFjdFJlc3VsdCByZXN1bHQpIHsKKyAgICAgICAgU3RyaW5nIHJlbGF0aXZlUGF0aCA9IHJlc3VsdC5nZXRSZWxhdGl2ZVBhdGgoKTsKKworICAgICAgICBpZiAocmVzdWx0LmdldFJlc3VsdENvZGUoKSA9PSBBYnN0cmFjdFJlc3VsdC5SZXN1bHRDb2RlLkZBSUxfQ1JBU0hFRCkgeworICAgICAgICAgICAgbUNyYXNoZWRUZXN0c0NvdW50Kys7CisgICAgICAgIH0KKworICAgICAgICBpZiAocmVzdWx0LmdldFJlc3VsdENvZGUoKSA9PSBBYnN0cmFjdFJlc3VsdC5SZXN1bHRDb2RlLlBBU1MpIHsKKyAgICAgICAgICAgIGlmIChtRmlsZUZpbHRlci5pc0ZhaWwocmVsYXRpdmVQYXRoKSkgeworICAgICAgICAgICAgICAgIG1VbmV4cGVjdGVkUGFzc2VzLmFkZChyZXN1bHQpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBtRXhwZWN0ZWRQYXNzZXMuYWRkKHJlc3VsdCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAobUZpbGVGaWx0ZXIuaXNGYWlsKHJlbGF0aXZlUGF0aCkpIHsKKyAgICAgICAgICAgICAgICBtRXhwZWN0ZWRGYWlsdXJlcy5hZGQocmVzdWx0KTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbVVuZXhwZWN0ZWRGYWlsdXJlcy5hZGQocmVzdWx0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFRlc3RzUmVsYXRpdmVQYXRoKFN0cmluZyB0ZXN0c1JlbGF0aXZlUGF0aCkgeworICAgICAgICBtVGVzdHNSZWxhdGl2ZVBhdGggPSB0ZXN0c1JlbGF0aXZlUGF0aDsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzdW1tYXJpemUoKSB7CisgICAgICAgIFN0cmluZyB3ZWJLaXRSZXZpc2lvbiA9IGdldFdlYktpdFJldmlzaW9uKCk7CisgICAgICAgIGNyZWF0ZUh0bWxEZXRhaWxzKHdlYktpdFJldmlzaW9uKTsKKyAgICAgICAgY3JlYXRlVHh0U3VtbWFyeSh3ZWJLaXRSZXZpc2lvbik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgcmVzZXQoKSB7CisgICAgICAgIG1DcmFzaGVkVGVzdHNDb3VudCA9IDA7CisgICAgICAgIG1VbmV4cGVjdGVkRmFpbHVyZXMuY2xlYXIoKTsKKyAgICAgICAgbUV4cGVjdGVkRmFpbHVyZXMuY2xlYXIoKTsKKyAgICAgICAgbUV4cGVjdGVkUGFzc2VzLmNsZWFyKCk7CisgICAgICAgIG1EYXRlID0gbmV3IERhdGUoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgY3JlYXRlVHh0U3VtbWFyeShTdHJpbmcgd2ViS2l0UmV2aXNpb24pIHsKKyAgICAgICAgU3RyaW5nQnVpbGRlciB0eHQgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworCisgICAgICAgIFNpbXBsZURhdGVGb3JtYXQgZGF0ZUZvcm1hdCA9IG5ldyBTaW1wbGVEYXRlRm9ybWF0KCJ5eXl5L01NL2RkIEhIOm1tOnNzIik7CisgICAgICAgIHR4dC5hcHBlbmQoIlBhdGg6ICIgKyBtVGVzdHNSZWxhdGl2ZVBhdGggKyAiXG4iKTsKKyAgICAgICAgdHh0LmFwcGVuZCgiRGF0ZTogIiArIGRhdGVGb3JtYXQuZm9ybWF0KG1EYXRlKSArICJcbiIpOworICAgICAgICB0eHQuYXBwZW5kKCJCdWlsZCBmaW5nZXJwcmludDogIiArIEJ1aWxkLkZJTkdFUlBSSU5UICsgIlxuIik7CisgICAgICAgIHR4dC5hcHBlbmQoIldlYktpdCB2ZXJzaW9uOiAiICsgZ2V0V2ViS2l0VmVyc2lvbkZyb21Vc2VyQWdlbnRTdHJpbmcoKSArICJcbiIpOworICAgICAgICB0eHQuYXBwZW5kKCJXZWJLaXQgcmV2aXNpb246ICIgKyB3ZWJLaXRSZXZpc2lvbiArICJcbiIpOworCisgICAgICAgIHR4dC5hcHBlbmQoIlRPVEFMOiAgICAgICAgICAgICAgICAgICAgICIgKyBnZXRUb3RhbFRlc3RDb3VudCgpICsgIlxuIik7CisgICAgICAgIHR4dC5hcHBlbmQoIkNSQVNIRUQgKGFtb25nIGFsbCB0ZXN0cyk6ICIgKyBtQ3Jhc2hlZFRlc3RzQ291bnQgKyAiXG4iKTsKKyAgICAgICAgdHh0LmFwcGVuZCgiVU5FWFBFQ1RFRCBGQUlMVVJFUzogICAgICAgIiArIG1VbmV4cGVjdGVkRmFpbHVyZXMuc2l6ZSgpICsgIlxuIik7CisgICAgICAgIHR4dC5hcHBlbmQoIlVORVhQRUNURUQgUEFTU0VTOiAgICAgICAgICIgKyBtVW5leHBlY3RlZFBhc3Nlcy5zaXplKCkgKyAiXG4iKTsKKyAgICAgICAgdHh0LmFwcGVuZCgiRVhQRUNURUQgRkFJTFVSRVM6ICAgICAgICAgIiArIG1FeHBlY3RlZEZhaWx1cmVzLnNpemUoKSArICJcbiIpOworICAgICAgICB0eHQuYXBwZW5kKCJFWFBFQ1RFRCBQQVNTRVM6ICAgICAgICAgICAiICsgbUV4cGVjdGVkUGFzc2VzLnNpemUoKSArICJcbiIpOworCisgICAgICAgIEZzVXRpbHMud3JpdGVEYXRhVG9TdG9yYWdlKG5ldyBGaWxlKG1SZXN1bHRzUm9vdERpclBhdGgsIFRYVF9TVU1NQVJZX1JFTEFUSVZFX1BBVEgpLAorICAgICAgICAgICAgICAgIHR4dC50b1N0cmluZygpLmdldEJ5dGVzKCksIGZhbHNlKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgY3JlYXRlSHRtbERldGFpbHMoU3RyaW5nIHdlYktpdFJldmlzaW9uKSB7CisgICAgICAgIFN0cmluZ0J1aWxkZXIgaHRtbCA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisKKyAgICAgICAgaHRtbC5hcHBlbmQoIjxodG1sPjxoZWFkPiIpOworICAgICAgICBodG1sLmFwcGVuZChDU1MpOworICAgICAgICBodG1sLmFwcGVuZChTQ1JJUFQpOworICAgICAgICBodG1sLmFwcGVuZCgiPC9oZWFkPjxib2R5PiIpOworCisgICAgICAgIGNyZWF0ZVRvcFN1bW1hcnlUYWJsZSh3ZWJLaXRSZXZpc2lvbiwgaHRtbCk7CisKKyAgICAgICAgY3JlYXRlUmVzdWx0c0xpc3RXaXRoRGlmZihodG1sLCAiVW5leHBlY3RlZCBmYWlsdXJlcyIsIG1VbmV4cGVjdGVkRmFpbHVyZXMpOworCisgICAgICAgIGNyZWF0ZVJlc3VsdHNMaXN0Tm9EaWZmKGh0bWwsICJVbmV4cGVjdGVkIHBhc3NlcyIsIG1VbmV4cGVjdGVkUGFzc2VzKTsKKworICAgICAgICBjcmVhdGVSZXN1bHRzTGlzdFdpdGhEaWZmKGh0bWwsICJFeHBlY3RlZCBmYWlsdXJlcyIsIG1FeHBlY3RlZEZhaWx1cmVzKTsKKworICAgICAgICBjcmVhdGVSZXN1bHRzTGlzdE5vRGlmZihodG1sLCAiRXhwZWN0ZWQgcGFzc2VzIiwgbUV4cGVjdGVkUGFzc2VzKTsKKworICAgICAgICBodG1sLmFwcGVuZCgiPC9ib2R5PjwvaHRtbD4iKTsKKworICAgICAgICBGc1V0aWxzLndyaXRlRGF0YVRvU3RvcmFnZShuZXcgRmlsZShtUmVzdWx0c1Jvb3REaXJQYXRoLCBIVE1MX0RFVEFJTFNfUkVMQVRJVkVfUEFUSCksCisgICAgICAgICAgICAgICAgaHRtbC50b1N0cmluZygpLmdldEJ5dGVzKCksIGZhbHNlKTsKKyAgICB9CisKKyAgICBwcml2YXRlIGludCBnZXRUb3RhbFRlc3RDb3VudCgpIHsKKyAgICAgICAgcmV0dXJuIG1VbmV4cGVjdGVkRmFpbHVyZXMuc2l6ZSgpICsKKyAgICAgICAgICAgICAgICBtVW5leHBlY3RlZFBhc3Nlcy5zaXplKCkgKworICAgICAgICAgICAgICAgIG1FeHBlY3RlZFBhc3Nlcy5zaXplKCkgKworICAgICAgICAgICAgICAgIG1FeHBlY3RlZEZhaWx1cmVzLnNpemUoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIFN0cmluZyBnZXRXZWJLaXRWZXJzaW9uRnJvbVVzZXJBZ2VudFN0cmluZygpIHsKKyAgICAgICAgUmVzb3VyY2VzIHJlc291cmNlcyA9IG5ldyBSZXNvdXJjZXMobmV3IEFzc2V0TWFuYWdlcigpLCBuZXcgRGlzcGxheU1ldHJpY3MoKSwKKyAgICAgICAgICAgICAgICBuZXcgQ29uZmlndXJhdGlvbigpKTsKKyAgICAgICAgU3RyaW5nIHVzZXJBZ2VudCA9CisgICAgICAgICAgICAgICAgcmVzb3VyY2VzLmdldFN0cmluZyhjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0cmluZy53ZWJfdXNlcl9hZ2VudCk7CisKKyAgICAgICAgTWF0Y2hlciBtYXRjaGVyID0gUGF0dGVybi5jb21waWxlKCJBcHBsZVdlYktpdC8oWzAtOV0rP1xcLlswLTldKSIpLm1hdGNoZXIodXNlckFnZW50KTsKKyAgICAgICAgaWYgKG1hdGNoZXIuZmluZCgpKSB7CisgICAgICAgICAgICByZXR1cm4gbWF0Y2hlci5ncm91cCgxKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gInVua25vd24iOworICAgIH0KKworICAgIHByaXZhdGUgU3RyaW5nIGdldFdlYktpdFJldmlzaW9uKCkgeworICAgICAgICBVUkwgdXJsID0gbnVsbDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHVybCA9IG5ldyBVUkwoRm9yd2FyZGVyTWFuYWdlci5nZXRIb3N0U2NoZW1lUG9ydChmYWxzZSkgKyAiVGhpcmRQYXJ0eVByb2plY3QucHJvcCIpOworICAgICAgICB9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgYXNzZXJ0IGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgU3RyaW5nIHRoaXJkUGFydHlQcm9qZWN0Q29udGVudHMgPSBuZXcgU3RyaW5nKEZzVXRpbHMucmVhZERhdGFGcm9tVXJsKHVybCkpOworICAgICAgICBNYXRjaGVyIG1hdGNoZXIgPSBQYXR0ZXJuLmNvbXBpbGUoIl52ZXJzaW9uPShbMC05XSspIiwgUGF0dGVybi5NVUxUSUxJTkUpLm1hdGNoZXIoCisgICAgICAgICAgICAgICAgdGhpcmRQYXJ0eVByb2plY3RDb250ZW50cyk7CisgICAgICAgIGlmIChtYXRjaGVyLmZpbmQoKSkgeworICAgICAgICAgICAgcmV0dXJuIG1hdGNoZXIuZ3JvdXAoMSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuICJ1bmtub3duIjsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgY3JlYXRlVG9wU3VtbWFyeVRhYmxlKFN0cmluZyB3ZWJLaXRSZXZpc2lvbiwgU3RyaW5nQnVpbGRlciBodG1sKSB7CisgICAgICAgIFNpbXBsZURhdGVGb3JtYXQgZGF0ZUZvcm1hdCA9IG5ldyBTaW1wbGVEYXRlRm9ybWF0KCJ5eXl5L01NL2RkIEhIOm1tOnNzIik7CisgICAgICAgIGh0bWwuYXBwZW5kKCI8aDE+IiArICJMYXlvdXQgdGVzdHMnIHJlc3VsdHMgZm9yOiAiICsKKyAgICAgICAgICAgICAgICAobVRlc3RzUmVsYXRpdmVQYXRoLmVxdWFscygiIikgPyAiYWxsIHRlc3RzIiA6IG1UZXN0c1JlbGF0aXZlUGF0aCkgKyAiPC9oMT4iKTsKKyAgICAgICAgaHRtbC5hcHBlbmQoIjxoMz4iICsgIkRhdGU6ICIgKyBkYXRlRm9ybWF0LmZvcm1hdChuZXcgRGF0ZSgpKSArICI8L2gzPiIpOworICAgICAgICBodG1sLmFwcGVuZCgiPGgzPiIgKyAiQnVpbGQgZmluZ2VycHJpbnQ6ICIgKyBCdWlsZC5GSU5HRVJQUklOVCArICI8L2gzPiIpOworICAgICAgICBodG1sLmFwcGVuZCgiPGgzPiIgKyAiV2ViS2l0IHZlcnNpb246ICIgKyBnZXRXZWJLaXRWZXJzaW9uRnJvbVVzZXJBZ2VudFN0cmluZygpICsgIjwvaDM+Iik7CisKKyAgICAgICAgaHRtbC5hcHBlbmQoIjxoMz4iICsgIldlYktpdCByZXZpc2lvbjogIik7CisgICAgICAgIGh0bWwuYXBwZW5kKCI8YSBocmVmPVwiaHR0cDovL3RyYWMud2Via2l0Lm9yZy9icm93c2VyL3RydW5rP3Jldj0iICsgd2ViS2l0UmV2aXNpb24gKworICAgICAgICAgICAgICAgICJcIiB0YXJnZXQ9XCJfYmxhbmtcIj48c3BhbiBjbGFzcz1cInBhdGhcIj4iICsgd2ViS2l0UmV2aXNpb24gKyAiPC9zcGFuPjwvYT4iKTsKKyAgICAgICAgaHRtbC5hcHBlbmQoIjwvaDM+Iik7CisKKyAgICAgICAgaHRtbC5hcHBlbmQoIjx0YWJsZSBjbGFzcz1cInN1bW1hcnlcIj4iKTsKKyAgICAgICAgY3JlYXRlU3VtbWFyeVRhYmxlUm93KGh0bWwsICJUT1RBTCIsIGdldFRvdGFsVGVzdENvdW50KCkpOworICAgICAgICBjcmVhdGVTdW1tYXJ5VGFibGVSb3coaHRtbCwgIkNSQVNIRUQgKGFtb25nIGFsbCB0ZXN0cykiLCBtQ3Jhc2hlZFRlc3RzQ291bnQpOworICAgICAgICBjcmVhdGVTdW1tYXJ5VGFibGVSb3coaHRtbCwgIlVORVhQRUNURUQgRkFJTFVSRVMiLCBtVW5leHBlY3RlZEZhaWx1cmVzLnNpemUoKSk7CisgICAgICAgIGNyZWF0ZVN1bW1hcnlUYWJsZVJvdyhodG1sLCAiVU5FWFBFQ1RFRCBQQVNTRVMiLCBtVW5leHBlY3RlZFBhc3Nlcy5zaXplKCkpOworICAgICAgICBjcmVhdGVTdW1tYXJ5VGFibGVSb3coaHRtbCwgIkVYUEVDVEVEIEZBSUxVUkVTIiwgbUV4cGVjdGVkRmFpbHVyZXMuc2l6ZSgpKTsKKyAgICAgICAgY3JlYXRlU3VtbWFyeVRhYmxlUm93KGh0bWwsICJFWFBFQ1RFRCBQQVNTRVMiLCBtRXhwZWN0ZWRQYXNzZXMuc2l6ZSgpKTsKKyAgICAgICAgaHRtbC5hcHBlbmQoIjwvdGFibGU+Iik7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGNyZWF0ZVN1bW1hcnlUYWJsZVJvdyhTdHJpbmdCdWlsZGVyIGh0bWwsIFN0cmluZyBjYXB0aW9uLCBpbnQgc2l6ZSkgeworICAgICAgICBodG1sLmFwcGVuZCgiPHRyPiIpOworICAgICAgICBodG1sLmFwcGVuZCgiICAgIDx0ZD4iICsgY2FwdGlvbiArICI8L3RkPiIpOworICAgICAgICBodG1sLmFwcGVuZCgiICAgIDx0ZD4iICsgc2l6ZSArICI8L3RkPiIpOworICAgICAgICBodG1sLmFwcGVuZCgiPC90cj4iKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgY3JlYXRlUmVzdWx0c0xpc3RXaXRoRGlmZihTdHJpbmdCdWlsZGVyIGh0bWwsIFN0cmluZyB0aXRsZSwKKyAgICAgICAgICAgIExpc3Q8QWJzdHJhY3RSZXN1bHQ+IHJlc3VsdHNMaXN0KSB7CisgICAgICAgIFN0cmluZyByZWxhdGl2ZVBhdGg7CisgICAgICAgIFN0cmluZyBpZCA9ICIiOworICAgICAgICBBYnN0cmFjdFJlc3VsdC5SZXN1bHRDb2RlIHJlc3VsdENvZGU7CisKKyAgICAgICAgQ29sbGVjdGlvbnMuc29ydChyZXN1bHRzTGlzdCk7CisgICAgICAgIGh0bWwuYXBwZW5kKCI8aDI+IiArIHRpdGxlICsgIiBbIiArIHJlc3VsdHNMaXN0LnNpemUoKSArICJdPC9oMj4iKTsKKyAgICAgICAgZm9yIChBYnN0cmFjdFJlc3VsdCByZXN1bHQgOiByZXN1bHRzTGlzdCkgeworICAgICAgICAgICAgcmVsYXRpdmVQYXRoID0gcmVzdWx0LmdldFJlbGF0aXZlUGF0aCgpOworICAgICAgICAgICAgcmVzdWx0Q29kZSA9IHJlc3VsdC5nZXRSZXN1bHRDb2RlKCk7CisgICAgICAgICAgICBhc3NlcnQgcmVzdWx0Q29kZSAhPSBBYnN0cmFjdFJlc3VsdC5SZXN1bHRDb2RlLlBBU1MgOiAicmVzdWx0Q29kZT0iICsgcmVzdWx0Q29kZTsKKworICAgICAgICAgICAgaHRtbC5hcHBlbmQoIjxoMz4iKTsKKworICAgICAgICAgICAgLyoqCisgICAgICAgICAgICAgKiBUZWNobmljYWxseSwgdHdvIGRpZmZlcmVudCBwYXRocyBjb3VsZCBlbmQgdXAgYmVpbmcgdGhlIHNhbWUsIGJlY2F1c2UKKyAgICAgICAgICAgICAqICc6JyBpcyBhIHZhbGlkICBjaGFyYWN0ZXIgaW4gYSBwYXRoLiBIb3dldmVyLCBpdCBpcyBwcm9iYWJseSBub3QgZ29pbmcKKyAgICAgICAgICAgICAqIHRvIGNhdXNlIGFueSBwcm9ibGVtcyBpbiB0aGlzIGNhc2UKKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgaWQgPSByZWxhdGl2ZVBhdGgucmVwbGFjZShGaWxlLnNlcGFyYXRvciwgIjoiKTsKKyAgICAgICAgICAgIGh0bWwuYXBwZW5kKCI8YSBocmVmPVwiI1wiIG9uQ2xpY2s9XCJ0b2dnbGVEaXNwbGF5KCciICsgaWQgKyAiJyk7Iik7CisgICAgICAgICAgICBodG1sLmFwcGVuZCgicmV0dXJuIGZhbHNlO1wiPiIpOworICAgICAgICAgICAgaHRtbC5hcHBlbmQoIjxzcGFuIGNsYXNzPVwidHJpXCIgaWQ9XCJ0cmkuIiArIGlkICsgIlwiPiYjeDI1YjY7IDwvc3Bhbj4iKTsKKyAgICAgICAgICAgIGh0bWwuYXBwZW5kKCI8c3BhbiBjbGFzcz1cInBhdGhcIj4iICsgcmVsYXRpdmVQYXRoICsgIjwvc3Bhbj4iKTsKKyAgICAgICAgICAgIGh0bWwuYXBwZW5kKCI8L2E+Iik7CisKKyAgICAgICAgICAgIGh0bWwuYXBwZW5kKCIgPHNwYW4gY2xhc3M9XCJsaXN0SXRlbSAiICsgcmVzdWx0Q29kZS5uYW1lKCkgKyAiXCI+Iik7CisgICAgICAgICAgICBodG1sLmFwcGVuZChyZXN1bHRDb2RlLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgaHRtbC5hcHBlbmQoIjwvc3Bhbj4iKTsKKworICAgICAgICAgICAgLyoqIERldGVjdCBtaXNzaW5nIExUQyBmdW5jdGlvbiAqLworICAgICAgICAgICAgU3RyaW5nIGFkZGl0aW9uYWxUZXh0T3V0cHV0U3RyaW5nID0gcmVzdWx0LmdldEFkZGl0aW9uYWxUZXh0T3V0cHV0U3RyaW5nKCk7CisgICAgICAgICAgICBpZiAoYWRkaXRpb25hbFRleHRPdXRwdXRTdHJpbmcgIT0gbnVsbCAmJgorICAgICAgICAgICAgICAgICAgICBhZGRpdGlvbmFsVGV4dE91dHB1dFN0cmluZy5jb250YWlucygiY29tLmFuZHJvaWQuZHVtcHJlbmRlcnRyZWUiKSAmJgorICAgICAgICAgICAgICAgICAgICBhZGRpdGlvbmFsVGV4dE91dHB1dFN0cmluZy5jb250YWlucygiaGFzIG5vIG1ldGhvZCIpKSB7CisgICAgICAgICAgICAgICAgaWYgKGFkZGl0aW9uYWxUZXh0T3V0cHV0U3RyaW5nLmNvbnRhaW5zKCJMYXlvdXRUZXN0Q29udHJvbGxlciIpKSB7CisgICAgICAgICAgICAgICAgICAgIGh0bWwuYXBwZW5kKCIgPHNwYW4gY2xhc3M9XCJsaXN0SXRlbSBub0x0Y1wiPkxUQyBmdW5jdGlvbiBtaXNzaW5nPC9zcGFuPiIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoYWRkaXRpb25hbFRleHRPdXRwdXRTdHJpbmcuY29udGFpbnMoIkV2ZW50U2VuZGVyIikpIHsKKyAgICAgICAgICAgICAgICAgICAgaHRtbC5hcHBlbmQoIiA8c3BhbiBjbGFzcz1cImxpc3RJdGVtIG5vRXZlbnRTZW5kZXJcIj4iKTsKKyAgICAgICAgICAgICAgICAgICAgaHRtbC5hcHBlbmQoIkVTIGZ1bmN0aW9uIG1pc3Npbmc8L3NwYW4+Iik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBodG1sLmFwcGVuZCgiPC9oMz4iKTsKKyAgICAgICAgICAgIGFwcGVuZEV4cGVjdGVkUmVzdWx0c1NvdXJjZXMocmVzdWx0LCBodG1sKTsKKworICAgICAgICAgICAgaHRtbC5hcHBlbmQoIjxkaXYgY2xhc3M9XCJkaWZmXCIgc3R5bGU9XCJkaXNwbGF5OiBub25lO1wiIGlkPVwiIiArIGlkICsgIlwiPiIpOworICAgICAgICAgICAgaHRtbC5hcHBlbmQocmVzdWx0LmdldERpZmZBc0h0bWwoKSk7CisgICAgICAgICAgICBodG1sLmFwcGVuZCgiPGEgaHJlZj1cIiNcIiBvbkNsaWNrPVwidG9nZ2xlRGlzcGxheSgnIiArIGlkICsgIicpOyIpOworICAgICAgICAgICAgaHRtbC5hcHBlbmQoInJldHVybiBmYWxzZTtcIj5IaWRlPC9hPiIpOworICAgICAgICAgICAgaHRtbC5hcHBlbmQoIiB8ICIpOworICAgICAgICAgICAgaHRtbC5hcHBlbmQoIjxhIGhyZWY9XCIiICsgZ2V0Vmlld1NvdXJjZVVybChyZWxhdGl2ZVBhdGgpLnRvU3RyaW5nKCkgKyAiXCIiKTsKKyAgICAgICAgICAgIGh0bWwuYXBwZW5kKCIgdGFyZ2V0PVwiX2JsYW5rXCI+U2hvdyBzb3VyY2U8L2E+Iik7CisgICAgICAgICAgICBodG1sLmFwcGVuZCgiPC9kaXY+Iik7CisKKyAgICAgICAgICAgIGh0bWwuYXBwZW5kKCI8ZGl2IGNsYXNzPVwic3BhY2VcIj48L2Rpdj4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBjcmVhdGVSZXN1bHRzTGlzdE5vRGlmZihTdHJpbmdCdWlsZGVyIGh0bWwsIFN0cmluZyB0aXRsZSwKKyAgICAgICAgICAgIExpc3Q8QWJzdHJhY3RSZXN1bHQ+IHJlc3VsdHNMaXN0KSB7CisgICAgICAgIENvbGxlY3Rpb25zLnNvcnQocmVzdWx0c0xpc3QpOworICAgICAgICBodG1sLmFwcGVuZCgiPGgyPiIgKyB0aXRsZSArICIgWyIgKyByZXN1bHRzTGlzdC5zaXplKCkgKyAiXTwvaDI+Iik7CisgICAgICAgIGZvciAoQWJzdHJhY3RSZXN1bHQgcmVzdWx0IDogcmVzdWx0c0xpc3QpIHsKKyAgICAgICAgICAgIGh0bWwuYXBwZW5kKCI8aDM+Iik7CisgICAgICAgICAgICBodG1sLmFwcGVuZCgiPGEgaHJlZj1cIiIgKyBnZXRWaWV3U291cmNlVXJsKHJlc3VsdC5nZXRSZWxhdGl2ZVBhdGgoKSkudG9TdHJpbmcoKSArCisgICAgICAgICAgICAgICAgICAgICJcIiIpOworICAgICAgICAgICAgaHRtbC5hcHBlbmQoIiB0YXJnZXQ9XCJfYmxhbmtcIj4iKTsKKyAgICAgICAgICAgIGh0bWwuYXBwZW5kKCI8c3BhbiBjbGFzcz1cInNxclwiPiYjeDI1YTA7IDwvc3Bhbj4iKTsKKyAgICAgICAgICAgIGh0bWwuYXBwZW5kKCI8c3BhbiBjbGFzcz1cInBhdGhcIj4iICsgcmVzdWx0LmdldFJlbGF0aXZlUGF0aCgpICsgIjwvc3Bhbj4iKTsKKyAgICAgICAgICAgIGh0bWwuYXBwZW5kKCI8L2E+Iik7CisgICAgICAgICAgICBodG1sLmFwcGVuZCgiPC9oMz4iKTsKKyAgICAgICAgICAgIGFwcGVuZEV4cGVjdGVkUmVzdWx0c1NvdXJjZXMocmVzdWx0LCBodG1sKTsKKyAgICAgICAgICAgIGh0bWwuYXBwZW5kKCI8ZGl2IGNsYXNzPVwic3BhY2VcIj48L2Rpdj4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIHZvaWQgYXBwZW5kRXhwZWN0ZWRSZXN1bHRzU291cmNlcyhBYnN0cmFjdFJlc3VsdCByZXN1bHQsCisgICAgICAgICAgICBTdHJpbmdCdWlsZGVyIGh0bWwpIHsKKyAgICAgICAgU3RyaW5nIHRleHRTb3VyY2UgPSByZXN1bHQuZ2V0RXhwZWN0ZWRUZXh0UmVzdWx0UGF0aCgpOworICAgICAgICBTdHJpbmcgaW1hZ2VTb3VyY2UgPSByZXN1bHQuZ2V0RXhwZWN0ZWRJbWFnZVJlc3VsdFBhdGgoKTsKKworICAgICAgICBpZiAodGV4dFNvdXJjZSAhPSBudWxsKSB7CisgICAgICAgICAgICBodG1sLmFwcGVuZCgiPHNwYW4gY2xhc3M9XCJzb3VyY2VcIj5FeHBlY3RlZCB0ZXh0dWFsIHJlc3VsdCBmcm9tOiAiKTsKKyAgICAgICAgICAgIGh0bWwuYXBwZW5kKCI8YSBocmVmPVwiIiArIEZvcndhcmRlck1hbmFnZXIuZ2V0SG9zdFNjaGVtZVBvcnQoZmFsc2UpICsgIkxheW91dFRlc3RzLyIgKworICAgICAgICAgICAgICAgICAgICB0ZXh0U291cmNlICsgIlwiIik7CisgICAgICAgICAgICBodG1sLmFwcGVuZCgiIHRhcmdldD1cIl9ibGFua1wiPiIpOworICAgICAgICAgICAgaHRtbC5hcHBlbmQodGV4dFNvdXJjZSArICI8L2E+PC9zcGFuPiIpOworICAgICAgICB9CisgICAgICAgIGlmIChpbWFnZVNvdXJjZSAhPSBudWxsKSB7CisgICAgICAgICAgICBodG1sLmFwcGVuZCgiPHNwYW4gY2xhc3M9XCJzb3VyY2VcIj5FeHBlY3RlZCBpbWFnZSByZXN1bHQgZnJvbTogIik7CisgICAgICAgICAgICBodG1sLmFwcGVuZCgiPGEgaHJlZj1cIiIgKyBGb3J3YXJkZXJNYW5hZ2VyLmdldEhvc3RTY2hlbWVQb3J0KGZhbHNlKSArICJMYXlvdXRUZXN0cy8iICsKKyAgICAgICAgICAgICAgICAgICAgaW1hZ2VTb3VyY2UgKyAiXCIiKTsKKyAgICAgICAgICAgIGh0bWwuYXBwZW5kKCIgdGFyZ2V0PVwiX2JsYW5rXCI+Iik7CisgICAgICAgICAgICBodG1sLmFwcGVuZChpbWFnZVNvdXJjZSArICI8L2E+PC9zcGFuPiIpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgVVJMIGdldFZpZXdTb3VyY2VVcmwoU3RyaW5nIHJlbGF0aXZlUGF0aCkgeworICAgICAgICBVUkwgdXJsID0gbnVsbDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHVybCA9IG5ldyBVUkwoImh0dHAiLCAibG9jYWxob3N0IiwgRm9yd2FyZGVyTWFuYWdlci5IVFRQX1BPUlQsCisgICAgICAgICAgICAgICAgICAgICIvV2ViS2l0VG9vbHMvRHVtcFJlbmRlclRyZWUvYW5kcm9pZC92aWV3X3NvdXJjZS5waHA/c3JjPSIgKworICAgICAgICAgICAgICAgICAgICByZWxhdGl2ZVBhdGgpOworICAgICAgICB9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgYXNzZXJ0IGZhbHNlIDogInJlbGF0aXZlUGF0aD0iICsgcmVsYXRpdmVQYXRoOworICAgICAgICB9CisgICAgICAgIHJldHVybiB1cmw7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvRHVtcFJlbmRlclRyZWUyL3NyYy9jb20vYW5kcm9pZC9kdW1wcmVuZGVydHJlZTIvVGVzdHNMaXN0QWN0aXZpdHkuamF2YSBiL3Rlc3RzL0R1bXBSZW5kZXJUcmVlMi9zcmMvY29tL2FuZHJvaWQvZHVtcHJlbmRlcnRyZWUyL1Rlc3RzTGlzdEFjdGl2aXR5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWRiNGQyYgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL0R1bXBSZW5kZXJUcmVlMi9zcmMvY29tL2FuZHJvaWQvZHVtcHJlbmRlcnRyZWUyL1Rlc3RzTGlzdEFjdGl2aXR5LmphdmEKQEAgLTAsMCArMSwyMDIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLmR1bXByZW5kZXJ0cmVlMjsKKworaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5OworaW1wb3J0IGFuZHJvaWQuYXBwLlByb2dyZXNzRGlhbG9nOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5Db25maWd1cmF0aW9uOworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLk1lc3NhZ2U7CitpbXBvcnQgYW5kcm9pZC52aWV3LkdyYXZpdHk7CitpbXBvcnQgYW5kcm9pZC52aWV3LldpbmRvdzsKK2ltcG9ydCBhbmRyb2lkLndlYmtpdC5XZWJWaWV3OworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlRvYXN0OworCitpbXBvcnQgY29tLmFuZHJvaWQuZHVtcHJlbmRlcnRyZWUyLnNjcmlwdHN1cHBvcnQuT25FdmVyeXRoaW5nRmluaXNoZWRDYWxsYmFjazsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CisKKy8qKgorICogQW4gQWN0aXZpdHkgdGhhdCBnZW5lcmF0ZXMgYSBsaXN0IG9mIHRlc3RzIGFuZCBzZW5kcyB0aGUgaW50ZW50IHRvCisgKiBMYXlvdXRUZXN0c0V4ZWN1dGVyIHRvIHJ1biB0aGVtLiBJdCBhbHNvIHJlc3RhcnRzIHRoZSBMYXlvdXRUZXN0c0V4ZWN1dGVyCisgKiBhZnRlciBpdCBjcmFzaGVzLgorICovCitwdWJsaWMgY2xhc3MgVGVzdHNMaXN0QWN0aXZpdHkgZXh0ZW5kcyBBY3Rpdml0eSB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTVNHX1RFU1RfTElTVF9QUkVMT0FERVJfRE9ORSA9IDA7CisKKyAgICAvKiogQ29uc3RhbnRzIGZvciBhZGRpbmcgZXh0cmFzIHRvIGFuIGludGVudCAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVFJBX1RFU1RfUEFUSCA9ICJUZXN0UGF0aCI7CisKKyAgICBwcml2YXRlIHN0YXRpYyBQcm9ncmVzc0RpYWxvZyBzUHJvZ3Jlc3NEaWFsb2c7CisKKyAgICBwcml2YXRlIEhhbmRsZXIgbUhhbmRsZXIgPSBuZXcgSGFuZGxlcigpIHsKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIGhhbmRsZU1lc3NhZ2UoTWVzc2FnZSBtc2cpIHsKKyAgICAgICAgICAgIHN3aXRjaCAobXNnLndoYXQpIHsKKyAgICAgICAgICAgICAgICBjYXNlIE1TR19URVNUX0xJU1RfUFJFTE9BREVSX0RPTkU6CisgICAgICAgICAgICAgICAgICAgIHNQcm9ncmVzc0RpYWxvZy5kaXNtaXNzKCk7CisgICAgICAgICAgICAgICAgICAgIG1UZXN0c0xpc3QgPSAoQXJyYXlMaXN0PFN0cmluZz4pbXNnLm9iajsKKyAgICAgICAgICAgICAgICAgICAgbVRvdGFsVGVzdENvdW50ID0gbVRlc3RzTGlzdC5zaXplKCk7CisgICAgICAgICAgICAgICAgICAgIHJlc3RhcnRFeGVjdXRvcigwKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9OworCisgICAgcHJpdmF0ZSBBcnJheUxpc3Q8U3RyaW5nPiBtVGVzdHNMaXN0OworICAgIHByaXZhdGUgaW50IG1Ub3RhbFRlc3RDb3VudDsKKworICAgIHByaXZhdGUgT25FdmVyeXRoaW5nRmluaXNoZWRDYWxsYmFjayBtT25FdmVyeXRoaW5nRmluaXNoZWRDYWxsYmFjazsKKyAgICBwcml2YXRlIGJvb2xlYW4gbUV2ZXJ5dGhpbmdGaW5pc2hlZDsKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG9uQ3JlYXRlKEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpIHsKKyAgICAgICAgc3VwZXIub25DcmVhdGUoc2F2ZWRJbnN0YW5jZVN0YXRlKTsKKworICAgICAgICAvKiogUHJlcGFyZSB0aGUgcHJvZ3Jlc3MgZGlhbG9nICovCisgICAgICAgIHNQcm9ncmVzc0RpYWxvZyA9IG5ldyBQcm9ncmVzc0RpYWxvZyhUZXN0c0xpc3RBY3Rpdml0eS50aGlzKTsKKyAgICAgICAgc1Byb2dyZXNzRGlhbG9nLnNldENhbmNlbGFibGUoZmFsc2UpOworICAgICAgICBzUHJvZ3Jlc3NEaWFsb2cuc2V0UHJvZ3Jlc3NTdHlsZShQcm9ncmVzc0RpYWxvZy5TVFlMRV9TUElOTkVSKTsKKyAgICAgICAgc1Byb2dyZXNzRGlhbG9nLnNldFRpdGxlKFIuc3RyaW5nLmRpYWxvZ19wcm9ncmVzc190aXRsZSk7CisgICAgICAgIHNQcm9ncmVzc0RpYWxvZy5zZXRNZXNzYWdlKGdldFRleHQoUi5zdHJpbmcuZGlhbG9nX3Byb2dyZXNzX21zZykpOworCisgICAgICAgIHJlcXVlc3RXaW5kb3dGZWF0dXJlKFdpbmRvdy5GRUFUVVJFX1BST0dSRVNTKTsKKworICAgICAgICBJbnRlbnQgaW50ZW50ID0gZ2V0SW50ZW50KCk7CisgICAgICAgIGlmICghaW50ZW50LmdldEFjdGlvbigpLmVxdWFscyhJbnRlbnQuQUNUSU9OX1JVTikpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBTdHJpbmcgcGF0aCA9IGludGVudC5nZXRTdHJpbmdFeHRyYShFWFRSQV9URVNUX1BBVEgpOworCisgICAgICAgIHNQcm9ncmVzc0RpYWxvZy5zaG93KCk7CisgICAgICAgIE1lc3NhZ2UgZG9uZU1zZyA9IE1lc3NhZ2Uub2J0YWluKG1IYW5kbGVyLCBNU0dfVEVTVF9MSVNUX1BSRUxPQURFUl9ET05FKTsKKworICAgICAgICBJbnRlbnQgc2VydmljZUludGVudCA9IG5ldyBJbnRlbnQodGhpcywgTWFuYWdlclNlcnZpY2UuY2xhc3MpOworICAgICAgICBzZXJ2aWNlSW50ZW50LnB1dEV4dHJhKCJwYXRoIiwgcGF0aCk7CisgICAgICAgIHN0YXJ0U2VydmljZShzZXJ2aWNlSW50ZW50KTsKKworICAgICAgICBuZXcgVGVzdHNMaXN0UHJlbG9hZGVyVGhyZWFkKHBhdGgsIGRvbmVNc2cpLnN0YXJ0KCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25OZXdJbnRlbnQoSW50ZW50IGludGVudCkgeworICAgICAgICBpZiAoaW50ZW50LmdldEFjdGlvbigpLmVxdWFscyhJbnRlbnQuQUNUSU9OX1JFQk9PVCkpIHsKKyAgICAgICAgICAgIG9uQ3Jhc2hJbnRlbnQoaW50ZW50KTsKKyAgICAgICAgfSBlbHNlIGlmIChpbnRlbnQuZ2V0QWN0aW9uKCkuZXF1YWxzKEludGVudC5BQ1RJT05fU0hVVERPV04pKSB7CisgICAgICAgICAgICBvbkV2ZXJ5dGhpbmdGaW5pc2hlZEludGVudChpbnRlbnQpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhpcyBtZXRob2QgaGFuZGxlcyBhbiBpbnRlbnQgdGhhdCBjb21lcyBmcm9tIE1hbmFnZVNlcnZpY2Ugd2hlbiBjcmFzaCBpcyBkZXRlY3RlZC4KKyAgICAgKiBUaGUgaW50ZW50IGNvbnRhaW5zIGFuIGluZGV4IGluIG1UZXN0c0xpc3Qgb2YgdGhlIHRlc3QgdGhhdCBjcmFzaGVkLiBUZXN0c0xpc3RBY3Rpdml0eQorICAgICAqIHJlc3RhcnRzIHRoZSBMYXlvdXRUZXN0c0V4ZWN1dG9yIGZyb20gdGhlIGZvbGxvd2luZyB0ZXN0IGluIG1UZXN0c0xpc3QsIGJ5IHNlbmRpbmcKKyAgICAgKiBhbiBpbnRlbnQgdG8gaXQuIFRoaXMgbmV3IGludGVudCBjb250YWlucyBhIGxpc3Qgb2YgcmVtYWluaW5nIHRlc3RzIHRvIHJ1biwKKyAgICAgKiB0b3RhbCBjb3VudCBvZiBhbGwgdGVzdHMsIGFuZCB0aGUgaW5kZXggb2YgdGhlIGZpcnN0IHRlc3QgdG8gcnVuIGFmdGVyIHJlc3RhcnRpbmcuCisgICAgICogTGF5b3V0VGVzdEV4ZWN1dG9yIHJ1bnMgdGhlbiBhcyB1c3VhbCwgc2VuZGluZyByZXBvcnRzIHRvIE1hbmFnZXJTZXJ2aWNlLiBJZiBpdAorICAgICAqIGRldGVjdHMgdGhlIGNyYXNoIGl0IHNlbmRzIGEgbmV3IGludGVudCBhbmQgdGhlIGZsb3cgcmVwZWF0cy4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgb25DcmFzaEludGVudChJbnRlbnQgaW50ZW50KSB7CisgICAgICAgIGludCBuZXh0VGVzdFRvUnVuID0gaW50ZW50LmdldEludEV4dHJhKCJjcmFzaGVkVGVzdEluZGV4IiwgLTEpICsgMTsKKyAgICAgICAgaWYgKG5leHRUZXN0VG9SdW4gPiAwICYmIG5leHRUZXN0VG9SdW4gPD0gbVRvdGFsVGVzdENvdW50KSB7CisgICAgICAgICAgICByZXN0YXJ0RXhlY3V0b3IobmV4dFRlc3RUb1J1bik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCByZWdpc3Rlck9uRXZlcnl0aGluZ0ZpbmlzaGVkQ2FsbGJhY2soT25FdmVyeXRoaW5nRmluaXNoZWRDYWxsYmFjayBjYWxsYmFjaykgeworICAgICAgICBtT25FdmVyeXRoaW5nRmluaXNoZWRDYWxsYmFjayA9IGNhbGxiYWNrOworICAgICAgICBpZiAobUV2ZXJ5dGhpbmdGaW5pc2hlZCkgeworICAgICAgICAgICAgbU9uRXZlcnl0aGluZ0ZpbmlzaGVkQ2FsbGJhY2sub25GaW5pc2hlZCgpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIG9uRXZlcnl0aGluZ0ZpbmlzaGVkSW50ZW50KEludGVudCBpbnRlbnQpIHsKKyAgICAgICAgVG9hc3QgdG9hc3QgPSBUb2FzdC5tYWtlVGV4dCh0aGlzLAorICAgICAgICAgICAgICAgICJBbGwgdGVzdHMgZmluaXNoZWQuXG5QcmVzcyBiYWNrIGtleSB0byByZXR1cm4gdG8gdGhlIHRlc3RzJyBsaXN0LiIsCisgICAgICAgICAgICAgICAgVG9hc3QuTEVOR1RIX0xPTkcpOworICAgICAgICB0b2FzdC5zZXRHcmF2aXR5KEdyYXZpdHkuQ0VOVEVSLCAtNDAsIDApOworICAgICAgICB0b2FzdC5zaG93KCk7CisKKyAgICAgICAgLyoqIFNob3cgdGhlIGRldGFpbHMgdG8gdGhlIHVzZXIgKi8KKyAgICAgICAgV2ViVmlldyB3ZWJWaWV3ID0gbmV3IFdlYlZpZXcodGhpcyk7CisgICAgICAgIHdlYlZpZXcuZ2V0U2V0dGluZ3MoKS5zZXRKYXZhU2NyaXB0RW5hYmxlZCh0cnVlKTsKKyAgICAgICAgd2ViVmlldy5nZXRTZXR0aW5ncygpLnNldEJ1aWx0SW5ab29tQ29udHJvbHModHJ1ZSk7CisgICAgICAgIHdlYlZpZXcuZ2V0U2V0dGluZ3MoKS5zZXRFbmFibGVTbW9vdGhUcmFuc2l0aW9uKHRydWUpOworICAgICAgICAvKiogVGhpcyBlbmFibGVzIGRvdWJsZS10YXAgdG8gem9vbSAqLworICAgICAgICB3ZWJWaWV3LmdldFNldHRpbmdzKCkuc2V0VXNlV2lkZVZpZXdQb3J0KHRydWUpOworCisgICAgICAgIHNldENvbnRlbnRWaWV3KHdlYlZpZXcpOworICAgICAgICB3ZWJWaWV3LmxvYWRVcmwoU3VtbWFyaXplci5nZXREZXRhaWxzVXJpKCkudG9TdHJpbmcoKSk7CisKKyAgICAgICAgbUV2ZXJ5dGhpbmdGaW5pc2hlZCA9IHRydWU7CisgICAgICAgIGlmIChtT25FdmVyeXRoaW5nRmluaXNoZWRDYWxsYmFjayAhPSBudWxsKSB7CisgICAgICAgICAgICBtT25FdmVyeXRoaW5nRmluaXNoZWRDYWxsYmFjay5vbkZpbmlzaGVkKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGlzLCB0b2dldGhlciB3aXRoIGFuZHJvaWQ6Y29uZmlnQ2hhbmdlcz0ib3JpZW50YXRpb24iIGluIG1hbmlmZXN0IGZpbGUsIHByZXZlbnRzCisgICAgICogdGhlIGFjdGl2aXR5IGZyb20gcmVzdGFydGluZyBvbiBvcmllbnRhdGlvbiBjaGFuZ2UuCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb25Db25maWd1cmF0aW9uQ2hhbmdlZChDb25maWd1cmF0aW9uIG5ld0NvbmZpZykgeworICAgICAgICBzdXBlci5vbkNvbmZpZ3VyYXRpb25DaGFuZ2VkKG5ld0NvbmZpZyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25TYXZlSW5zdGFuY2VTdGF0ZShCdW5kbGUgb3V0U3RhdGUpIHsKKyAgICAgICAgb3V0U3RhdGUucHV0U3RyaW5nQXJyYXlMaXN0KCJ0ZXN0c0xpc3QiLCBtVGVzdHNMaXN0KTsKKyAgICAgICAgb3V0U3RhdGUucHV0SW50KCJ0b3RhbENvdW50IiwgbVRvdGFsVGVzdENvdW50KTsKKworICAgICAgICBzdXBlci5vblNhdmVJbnN0YW5jZVN0YXRlKG91dFN0YXRlKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvblJlc3RvcmVJbnN0YW5jZVN0YXRlKEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpIHsKKyAgICAgICAgc3VwZXIub25SZXN0b3JlSW5zdGFuY2VTdGF0ZShzYXZlZEluc3RhbmNlU3RhdGUpOworCisgICAgICAgIG1UZXN0c0xpc3QgPSBzYXZlZEluc3RhbmNlU3RhdGUuZ2V0U3RyaW5nQXJyYXlMaXN0KCJ0ZXN0c0xpc3QiKTsKKyAgICAgICAgbVRvdGFsVGVzdENvdW50ID0gc2F2ZWRJbnN0YW5jZVN0YXRlLmdldEludCgidG90YWxDb3VudCIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIChSZSlzdGFydHMgdGhlIGV4ZWN1dGVyIGFjdGl2aXR5IGZyb20gdGhlIGdpdmVuIHRlc3QgbnVtYmVyIChpbmNsdXNpdmUsIDAtYmFzZWQpLgorICAgICAqIFRoaXMgbnVtYmVyIGlzIGFuIGluZGV4IGluIG1UZXN0c0xpc3QsIG5vdCB0aGUgc3VibGlzdCBwYXNzZWQgaW4gdGhlIGludGVudC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzdGFydEZyb20KKyAgICAgKiAgICAgIHRlc3QgaW5kZXggaW4gbVRlc3RzTGlzdCB0byBzdGFydCB0aGUgdGVzdHMgZnJvbSAoaW5jbHVzaXZlLCAwLWJhc2VkKQorICAgICAqLworICAgIHByaXZhdGUgdm9pZCByZXN0YXJ0RXhlY3V0b3IoaW50IHN0YXJ0RnJvbSkgeworICAgICAgICBJbnRlbnQgaW50ZW50ID0gbmV3IEludGVudCgpOworICAgICAgICBpbnRlbnQuc2V0Q2xhc3ModGhpcywgTGF5b3V0VGVzdHNFeGVjdXRvci5jbGFzcyk7CisgICAgICAgIGludGVudC5zZXRBY3Rpb24oSW50ZW50LkFDVElPTl9SVU4pOworCisgICAgICAgIGlmIChzdGFydEZyb20gPCBtVG90YWxUZXN0Q291bnQpIHsKKyAgICAgICAgICAgIGludGVudC5wdXRTdHJpbmdBcnJheUxpc3RFeHRyYShMYXlvdXRUZXN0c0V4ZWN1dG9yLkVYVFJBX1RFU1RTX0xJU1QsCisgICAgICAgICAgICAgICAgICAgIG5ldyBBcnJheUxpc3Q8U3RyaW5nPihtVGVzdHNMaXN0LnN1Ykxpc3Qoc3RhcnRGcm9tLCBtVG90YWxUZXN0Q291bnQpKSk7CisgICAgICAgICAgICBpbnRlbnQucHV0RXh0cmEoTGF5b3V0VGVzdHNFeGVjdXRvci5FWFRSQV9URVNUX0lOREVYLCBzdGFydEZyb20pOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaW50ZW50LnB1dFN0cmluZ0FycmF5TGlzdEV4dHJhKExheW91dFRlc3RzRXhlY3V0b3IuRVhUUkFfVEVTVFNfTElTVCwKKyAgICAgICAgICAgICAgICAgICAgbmV3IEFycmF5TGlzdDxTdHJpbmc+KCkpOworICAgICAgICB9CisKKyAgICAgICAgc3RhcnRBY3Rpdml0eShpbnRlbnQpOworICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9EdW1wUmVuZGVyVHJlZTIvc3JjL2NvbS9hbmRyb2lkL2R1bXByZW5kZXJ0cmVlMi9UZXN0c0xpc3RQcmVsb2FkZXJUaHJlYWQuamF2YSBiL3Rlc3RzL0R1bXBSZW5kZXJUcmVlMi9zcmMvY29tL2FuZHJvaWQvZHVtcHJlbmRlcnRyZWUyL1Rlc3RzTGlzdFByZWxvYWRlclRocmVhZC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUwZjE0NTAwCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvRHVtcFJlbmRlclRyZWUyL3NyYy9jb20vYW5kcm9pZC9kdW1wcmVuZGVydHJlZTIvVGVzdHNMaXN0UHJlbG9hZGVyVGhyZWFkLmphdmEKQEAgLTAsMCArMSwxMDkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLmR1bXByZW5kZXJ0cmVlMjsKKworaW1wb3J0IGFuZHJvaWQub3MuRW52aXJvbm1lbnQ7CitpbXBvcnQgYW5kcm9pZC5vcy5NZXNzYWdlOworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OworCisvKioKKyAqIEEgVGhyZWFkIHRoYXQgaXMgcmVzcG9uc2libGUgZm9yIGdlbmVyYXRpbmcgYSBsaXN0cyBvZiB0ZXN0cyB0byBydW4uCisgKi8KK3B1YmxpYyBjbGFzcyBUZXN0c0xpc3RQcmVsb2FkZXJUaHJlYWQgZXh0ZW5kcyBUaHJlYWQgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIExPR19UQUcgPSAiVGVzdHNMaXN0UHJlbG9hZGVyVGhyZWFkIjsKKworICAgIC8qKiBBIGxpc3QgY29udGFpbmluZyByZWxhdGl2ZSBwYXRocyBvZiB0ZXN0cyB0byBydW4gKi8KKyAgICBwcml2YXRlIEFycmF5TGlzdDxTdHJpbmc+IG1UZXN0c0xpc3QgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKKworICAgIHByaXZhdGUgRmlsZUZpbHRlciBtRmlsZUZpbHRlcjsKKworICAgIC8qKgorICAgICAqIEEgcmVsYXRpdmUgcGF0aCB0byB0aGUgZm9sZGVyIHdpdGggdGhlIHRlc3RzIHdlIHdhbnQgdG8gcnVuIG9yIHBhcnRpY3VsYXIgdGVzdC4KKyAgICAgKiBVc2VkIHVwIHRvIGFuZCBpbmNsdWRpbmcgcHJlbG9hZFRlc3RzKCkuCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgbVJlbGF0aXZlUGF0aDsKKworICAgIHByaXZhdGUgTWVzc2FnZSBtRG9uZU1zZzsKKworICAgIC8qKgorICAgICAqIFRoZSBnaXZlbiBwYXRoIG11c3QgYmUgcmVsYXRpdmUgdG8gdGhlIHJvb3QgZGlyLgorICAgICAqCisgICAgICogQHBhcmFtIHBhdGgKKyAgICAgKiBAcGFyYW0gZG9uZU1zZworICAgICAqLworICAgIHB1YmxpYyBUZXN0c0xpc3RQcmVsb2FkZXJUaHJlYWQoU3RyaW5nIHBhdGgsIE1lc3NhZ2UgZG9uZU1zZykgeworICAgICAgICBtRmlsZUZpbHRlciA9IG5ldyBGaWxlRmlsdGVyKCk7CisgICAgICAgIG1SZWxhdGl2ZVBhdGggPSBwYXRoOworICAgICAgICBtRG9uZU1zZyA9IGRvbmVNc2c7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICBpZiAoRmlsZUZpbHRlci5pc1Rlc3RGaWxlKG1SZWxhdGl2ZVBhdGgpKSB7CisgICAgICAgICAgICBtVGVzdHNMaXN0LmFkZChtUmVsYXRpdmVQYXRoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGxvYWRUZXN0c0Zyb21VcmwobVJlbGF0aXZlUGF0aCk7CisgICAgICAgIH0KKworICAgICAgICBtRG9uZU1zZy5vYmogPSBtVGVzdHNMaXN0OworICAgICAgICBtRG9uZU1zZy5zZW5kVG9UYXJnZXQoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBMb2FkcyBhbGwgdGhlIHRlc3RzIGZyb20gdGhlIGdpdmVuIGZvbGRlcnMgYW5kIGFsbCB0aGUgc3ViZm9sZGVycworICAgICAqIGludG8gbVRlc3RzTGlzdC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBkaXJSZWxhdGl2ZVBhdGgKKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgbG9hZFRlc3RzRnJvbVVybChTdHJpbmcgZGlyUmVsYXRpdmVQYXRoKSB7CisgICAgICAgIExpbmtlZExpc3Q8U3RyaW5nPiBmb2xkZXJzTGlzdCA9IG5ldyBMaW5rZWRMaXN0PFN0cmluZz4oKTsKKyAgICAgICAgZm9sZGVyc0xpc3QuYWRkKGRpclJlbGF0aXZlUGF0aCk7CisKKyAgICAgICAgU3RyaW5nIHJlbGF0aXZlUGF0aDsKKyAgICAgICAgU3RyaW5nIGl0ZW1OYW1lOworICAgICAgICB3aGlsZSAoIWZvbGRlcnNMaXN0LmlzRW1wdHkoKSkgeworICAgICAgICAgICAgcmVsYXRpdmVQYXRoID0gZm9sZGVyc0xpc3QucmVtb3ZlRmlyc3QoKTsKKworICAgICAgICAgICAgZm9yIChTdHJpbmcgZm9sZGVyUmVsYXRpdmVQYXRoIDogRnNVdGlscy5nZXRMYXlvdXRUZXN0c0RpckNvbnRlbnRzKHJlbGF0aXZlUGF0aCwKKyAgICAgICAgICAgICAgICAgICAgZmFsc2UsIHRydWUpKSB7CisgICAgICAgICAgICAgICAgaXRlbU5hbWUgPSBuZXcgRmlsZShmb2xkZXJSZWxhdGl2ZVBhdGgpLmdldE5hbWUoKTsKKyAgICAgICAgICAgICAgICBpZiAoRmlsZUZpbHRlci5pc1Rlc3REaXIoaXRlbU5hbWUpKSB7CisgICAgICAgICAgICAgICAgICAgIGZvbGRlcnNMaXN0LmFkZChmb2xkZXJSZWxhdGl2ZVBhdGgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZm9yIChTdHJpbmcgdGVzdFJlbGF0aXZlUGF0aCA6IEZzVXRpbHMuZ2V0TGF5b3V0VGVzdHNEaXJDb250ZW50cyhyZWxhdGl2ZVBhdGgsCisgICAgICAgICAgICAgICAgICAgIGZhbHNlLCBmYWxzZSkpIHsKKyAgICAgICAgICAgICAgICBpdGVtTmFtZSA9IG5ldyBGaWxlKHRlc3RSZWxhdGl2ZVBhdGgpLmdldE5hbWUoKTsKKyAgICAgICAgICAgICAgICBpZiAoRmlsZUZpbHRlci5pc1Rlc3RGaWxlKGl0ZW1OYW1lKSkgeworICAgICAgICAgICAgICAgICAgICAvKiogV2UgY2hvc2UgdG8gc2tpcCBhbGwgdGhlIHRlc3RzIHRoYXQgYXJlIGV4cGVjdGVkIHRvIGNyYXNoLiAqLworICAgICAgICAgICAgICAgICAgICBpZiAoIW1GaWxlRmlsdGVyLmlzQ3Jhc2godGVzdFJlbGF0aXZlUGF0aCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1UZXN0c0xpc3QuYWRkKHRlc3RSZWxhdGl2ZVBhdGgpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgLyoqCisgICAgICAgICAgICAgICAgICAgICAgICAgKiBUT0RPOiBTdW1tYXJpemVyIGlzIG5vdyBpbiBzZXJ2aWNlIC0gZmlndXJlIG91dCBob3cgdG8gc2VuZCB0aGUgaW5mby4KKyAgICAgICAgICAgICAgICAgICAgICAgICAqIFByZXZpb3VzbHk6IG1TdW1tYXJpemVyLmFkZFNraXBwZWRUZXN0KHJlbGF0aXZlUGF0aCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL0R1bXBSZW5kZXJUcmVlMi9zcmMvY29tL2FuZHJvaWQvZHVtcHJlbmRlcnRyZWUyL1RleHRSZXN1bHQuamF2YSBiL3Rlc3RzL0R1bXBSZW5kZXJUcmVlMi9zcmMvY29tL2FuZHJvaWQvZHVtcHJlbmRlcnRyZWUyL1RleHRSZXN1bHQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NjY0ZWZlCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvRHVtcFJlbmRlclRyZWUyL3NyYy9jb20vYW5kcm9pZC9kdW1wcmVuZGVydHJlZTIvVGV4dFJlc3VsdC5qYXZhCkBAIC0wLDAgKzEsMjUzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5kdW1wcmVuZGVydHJlZTI7CisKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKK2ltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5NZXNzYWdlOworaW1wb3J0IGFuZHJvaWQud2Via2l0LldlYlZpZXc7CisKK2ltcG9ydCBuYW1lLmZyYXNlci5uZWlsLnBsYWludGV4dC5kaWZmX21hdGNoX3BhdGNoOworCitpbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7CisKKy8qKgorICogQSByZXN1bHQgb2JqZWN0IGZvciB3aGljaCB0aGUgZXhwZWN0ZWQgb3V0cHV0IGlzIHRleHQuIEl0IGRvZXMgbm90IGhhdmUgYW4gaW1hZ2UKKyAqIGV4cGVjdGVkIHJlc3VsdC4KKyAqCisgKiA8cD5DcmVhdGVkIGlmIGxheW91dFRlc3RDb250cm9sbGVyLmR1bXBBc1RleHQoKSB3YXMgY2FsbGVkLgorICovCitwdWJsaWMgY2xhc3MgVGV4dFJlc3VsdCBleHRlbmRzIEFic3RyYWN0UmVzdWx0IHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNU0dfRE9DVU1FTlRfQVNfVEVYVCA9IDA7CisKKyAgICBwcml2YXRlIFN0cmluZyBtRXhwZWN0ZWRSZXN1bHQ7CisgICAgcHJpdmF0ZSBTdHJpbmcgbUV4cGVjdGVkUmVzdWx0UGF0aDsKKyAgICBwcml2YXRlIFN0cmluZyBtQWN0dWFsUmVzdWx0OworICAgIHByaXZhdGUgU3RyaW5nIG1SZWxhdGl2ZVBhdGg7CisgICAgcHJpdmF0ZSBSZXN1bHRDb2RlIG1SZXN1bHRDb2RlOworICAgIHByaXZhdGUgTWVzc2FnZSBtUmVzdWx0T2J0YWluZWRNc2c7CisKKyAgICBwcml2YXRlIGJvb2xlYW4gbUR1bXBDaGlsZEZyYW1lc0FzVGV4dDsKKworICAgIHByaXZhdGUgSGFuZGxlciBtSGFuZGxlciA9IG5ldyBIYW5kbGVyKCkgeworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgaGFuZGxlTWVzc2FnZShNZXNzYWdlIG1zZykgeworICAgICAgICAgICAgaWYgKG1zZy53aGF0ID09IE1TR19ET0NVTUVOVF9BU19URVhUKSB7CisgICAgICAgICAgICAgICAgbUFjdHVhbFJlc3VsdCA9IChTdHJpbmcpbXNnLm9iajsKKyAgICAgICAgICAgICAgICBtUmVzdWx0T2J0YWluZWRNc2cuc2VuZFRvVGFyZ2V0KCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9OworCisgICAgcHVibGljIFRleHRSZXN1bHQoU3RyaW5nIHJlbGF0aXZlUGF0aCkgeworICAgICAgICBtUmVsYXRpdmVQYXRoID0gcmVsYXRpdmVQYXRoOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldER1bXBDaGlsZEZyYW1lc0FzVGV4dChib29sZWFuIGR1bXBDaGlsZEZyYW1lc0FzVGV4dCkgeworICAgICAgICBtRHVtcENoaWxkRnJhbWVzQXNUZXh0ID0gZHVtcENoaWxkRnJhbWVzQXNUZXh0OworICAgIH0KKworICAgIC8qKgorICAgICAqIFVzZWQgdG8gcmVjcmVhdGUgdGhlIFJlc3VsdCB3aGVuIHJlY2VpdmVkIGJ5IHRoZSBzZXJ2aWNlLgorICAgICAqCisgICAgICogQHBhcmFtIGJ1bmRsZQorICAgICAqICAgICAgYnVuZGxlIHdpdGggZGF0YSB1c2VkIHRvIHJlY3JlYXRlIHRoZSByZXN1bHQKKyAgICAgKi8KKyAgICBwdWJsaWMgVGV4dFJlc3VsdChCdW5kbGUgYnVuZGxlKSB7CisgICAgICAgIG1FeHBlY3RlZFJlc3VsdCA9IGJ1bmRsZS5nZXRTdHJpbmcoImV4cGVjdGVkVGV4dHVhbFJlc3VsdCIpOworICAgICAgICBtRXhwZWN0ZWRSZXN1bHRQYXRoID0gYnVuZGxlLmdldFN0cmluZygiZXhwZWN0ZWRUZXh0dWFsUmVzdWx0UGF0aCIpOworICAgICAgICBtQWN0dWFsUmVzdWx0ID0gYnVuZGxlLmdldFN0cmluZygiYWN0dWFsVGV4dHVhbFJlc3VsdCIpOworICAgICAgICBzZXRBZGRpdGlvbmFsVGV4dE91dHB1dFN0cmluZyhidW5kbGUuZ2V0U3RyaW5nKCJhZGRpdGlvbmFsVGV4dE91dHB1dFN0cmluZyIpKTsKKyAgICAgICAgbVJlbGF0aXZlUGF0aCA9IGJ1bmRsZS5nZXRTdHJpbmcoInJlbGF0aXZlUGF0aCIpOworICAgICAgICBTdHJpbmcgcmVzdWx0Q29kZSA9IGJ1bmRsZS5nZXRTdHJpbmcoInJlc3VsdENvZGUiKTsKKyAgICAgICAgaWYgKHJlc3VsdENvZGUgIT0gbnVsbCkgeworICAgICAgICAgICAgbVJlc3VsdENvZGUgPSBSZXN1bHRDb2RlLnZhbHVlT2YocmVzdWx0Q29kZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgUmVzdWx0Q29kZSBnZXRSZXN1bHRDb2RlKCkgeworICAgICAgICBpZiAobVJlc3VsdENvZGUgIT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIG1SZXN1bHRDb2RlOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG1FeHBlY3RlZFJlc3VsdCA9PSBudWxsKSB7CisgICAgICAgICAgICBtUmVzdWx0Q29kZSA9IEFic3RyYWN0UmVzdWx0LlJlc3VsdENvZGUuRkFJTF9OT19FWFBFQ1RFRF9SRVNVTFQ7CisgICAgICAgIH0gZWxzZSBpZiAoIW1FeHBlY3RlZFJlc3VsdC5lcXVhbHMobUFjdHVhbFJlc3VsdCkpIHsKKyAgICAgICAgICAgIG1SZXN1bHRDb2RlID0gQWJzdHJhY3RSZXN1bHQuUmVzdWx0Q29kZS5GQUlMX1JFU1VMVF9ESUZGRVJTOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbVJlc3VsdENvZGUgPSBBYnN0cmFjdFJlc3VsdC5SZXN1bHRDb2RlLlBBU1M7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gbVJlc3VsdENvZGU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJ5dGVbXSBnZXRBY3R1YWxJbWFnZVJlc3VsdCgpIHsKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyBnZXRBY3R1YWxUZXh0UmVzdWx0KCkgeworICAgICAgICBTdHJpbmcgYWRkaXRpb25hbFRleHRSZXN1bHRTdHJpbmcgPSBnZXRBZGRpdGlvbmFsVGV4dE91dHB1dFN0cmluZygpOworICAgICAgICBpZiAoYWRkaXRpb25hbFRleHRSZXN1bHRTdHJpbmcgIT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIGFkZGl0aW9uYWxUZXh0UmVzdWx0U3RyaW5nKyBtQWN0dWFsUmVzdWx0OworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIG1BY3R1YWxSZXN1bHQ7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgc2V0RXhwZWN0ZWRJbWFnZVJlc3VsdChieXRlW10gZXhwZWN0ZWRSZXN1bHQpIHsKKyAgICAgICAgLyoqIFRoaXMgbWV0aG9kIGlzIG5vdCBhcHBsaWNhYmxlIHRvIHRoaXMgdHlwZSBvZiByZXN1bHQgKi8KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBzZXRFeHBlY3RlZEltYWdlUmVzdWx0UGF0aChTdHJpbmcgcmVsYXRpdmVQYXRoKSB7CisgICAgICAgIC8qKiBUaGlzIG1ldGhvZCBpcyBub3QgYXBwbGljYWJsZSB0byB0aGlzIHR5cGUgb2YgcmVzdWx0ICovCisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyBnZXRFeHBlY3RlZEltYWdlUmVzdWx0UGF0aCgpIHsKKyAgICAgICAgLyoqIFRoaXMgbWV0aG9kIGlzIG5vdCBhcHBsaWNhYmxlIHRvIHRoaXMgdHlwZSBvZiByZXN1bHQgKi8KKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgc2V0RXhwZWN0ZWRUZXh0UmVzdWx0UGF0aChTdHJpbmcgcmVsYXRpdmVQYXRoKSB7CisgICAgICAgIG1FeHBlY3RlZFJlc3VsdFBhdGggPSByZWxhdGl2ZVBhdGg7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyBnZXRFeHBlY3RlZFRleHRSZXN1bHRQYXRoKCkgeworICAgICAgICByZXR1cm4gbUV4cGVjdGVkUmVzdWx0UGF0aDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBzZXRFeHBlY3RlZFRleHRSZXN1bHQoU3RyaW5nIGV4cGVjdGVkUmVzdWx0KSB7CisgICAgICAgIG1FeHBlY3RlZFJlc3VsdCA9IGV4cGVjdGVkUmVzdWx0OworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0RGlmZkFzSHRtbCgpIHsKKyAgICAgICAgU3RyaW5nQnVpbGRlciBodG1sID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKyAgICAgICAgaHRtbC5hcHBlbmQoIjx0YWJsZSBjbGFzcz1cInZpc3VhbF9kaWZmXCI+Iik7CisgICAgICAgIGh0bWwuYXBwZW5kKCIgICAgPHRyIGNsYXNzPVwiaGVhZGVyc1wiPiIpOworICAgICAgICBodG1sLmFwcGVuZCgiICAgICAgICA8dGQgY29sc3Bhbj1cIjJcIj5FeHBlY3RlZCByZXN1bHQ6PC90ZD4iKTsKKyAgICAgICAgaHRtbC5hcHBlbmQoIiAgICAgICAgPHRkIGNsYXNzPVwic3BhY2VcIj48L3RkPiIpOworICAgICAgICBodG1sLmFwcGVuZCgiICAgICAgICA8dGQgY29sc3Bhbj1cIjJcIj5BY3R1YWwgcmVzdWx0OjwvdGQ+Iik7CisgICAgICAgIGh0bWwuYXBwZW5kKCIgICAgPC90cj4iKTsKKworICAgICAgICBpZiAobUV4cGVjdGVkUmVzdWx0ID09IG51bGwgfHwgbUFjdHVhbFJlc3VsdCA9PSBudWxsKSB7CisgICAgICAgICAgICBhcHBlbmROdWxsc0h0bWwoaHRtbCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBhcHBlbmREaWZmSHRtbChodG1sKTsKKyAgICAgICAgfQorCisgICAgICAgIGh0bWwuYXBwZW5kKCIgICAgPHRyIGNsYXNzPVwiZm9vdGVyc1wiPiIpOworICAgICAgICBodG1sLmFwcGVuZCgiICAgICAgICA8dGQgY29sc3Bhbj1cIjJcIj48L3RkPiIpOworICAgICAgICBodG1sLmFwcGVuZCgiICAgICAgICA8dGQgY2xhc3M9XCJzcGFjZVwiPjwvdGQ+Iik7CisgICAgICAgIGh0bWwuYXBwZW5kKCIgICAgICAgIDx0ZCBjb2xzcGFuPVwiMlwiPjwvdGQ+Iik7CisgICAgICAgIGh0bWwuYXBwZW5kKCIgICAgPC90cj4iKTsKKyAgICAgICAgaHRtbC5hcHBlbmQoIjwvdGFibGU+Iik7CisKKyAgICAgICAgcmV0dXJuIGh0bWwudG9TdHJpbmcoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgYXBwZW5kRGlmZkh0bWwoU3RyaW5nQnVpbGRlciBodG1sKSB7CisgICAgICAgIExpbmtlZExpc3Q8ZGlmZl9tYXRjaF9wYXRjaC5EaWZmPiBkaWZmcyA9CisgICAgICAgICAgICAgICAgbmV3IGRpZmZfbWF0Y2hfcGF0Y2goKS5kaWZmX21haW4obUV4cGVjdGVkUmVzdWx0LCBtQWN0dWFsUmVzdWx0KTsKKworICAgICAgICBkaWZmcyA9IFZpc3VhbERpZmZVdGlscy5zcGxpdERpZmZzT25OZXdsaW5lKGRpZmZzKTsKKworICAgICAgICBMaW5rZWRMaXN0PFN0cmluZz4gZXhwZWN0ZWRMaW5lcyA9IG5ldyBMaW5rZWRMaXN0PFN0cmluZz4oKTsKKyAgICAgICAgTGlua2VkTGlzdDxJbnRlZ2VyPiBleHBlY3RlZExpbmVOdW1zID0gbmV3IExpbmtlZExpc3Q8SW50ZWdlcj4oKTsKKyAgICAgICAgTGlua2VkTGlzdDxTdHJpbmc+IGFjdHVhbExpbmVzID0gbmV3IExpbmtlZExpc3Q8U3RyaW5nPigpOworICAgICAgICBMaW5rZWRMaXN0PEludGVnZXI+IGFjdHVhbExpbmVOdW1zID0gbmV3IExpbmtlZExpc3Q8SW50ZWdlcj4oKTsKKworICAgICAgICBWaXN1YWxEaWZmVXRpbHMuZ2VuZXJhdGVFeHBlY3RlZFJlc3VsdExpbmVzKGRpZmZzLCBleHBlY3RlZExpbmVOdW1zLCBleHBlY3RlZExpbmVzKTsKKyAgICAgICAgVmlzdWFsRGlmZlV0aWxzLmdlbmVyYXRlQWN0dWFsUmVzdWx0TGluZXMoZGlmZnMsIGFjdHVhbExpbmVOdW1zLCBhY3R1YWxMaW5lcyk7CisKKyAgICAgICAgaHRtbC5hcHBlbmQoVmlzdWFsRGlmZlV0aWxzLmdldEh0bWwoZXhwZWN0ZWRMaW5lTnVtcywgZXhwZWN0ZWRMaW5lcywKKyAgICAgICAgICAgICAgICBhY3R1YWxMaW5lTnVtcywgYWN0dWFsTGluZXMpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgYXBwZW5kTnVsbHNIdG1sKFN0cmluZ0J1aWxkZXIgaHRtbCkgeworICAgICAgICAvKiogVE9ETzogQ3JlYXRlIGEgc2VwYXJhdGUgcm93IGZvciBlYWNoIGxpbmUgb2Ygbm90IG51bGwgcmVzdWx0ICovCisgICAgICAgIGh0bWwuYXBwZW5kKCIgICAgPHRyIGNsYXNzPVwicmVzdWx0c1wiPiIpOworICAgICAgICBodG1sLmFwcGVuZCgiICAgIDx0ZCBjbGFzcz1cImxpbmVfY291bnRcIj4iKTsKKyAgICAgICAgaHRtbC5hcHBlbmQoIiAgICA8L3RkPiIpOworICAgICAgICBodG1sLmFwcGVuZCgiICAgIDx0ZCBjbGFzcz1cImxpbmVcIj4iKTsKKyAgICAgICAgaWYgKG1FeHBlY3RlZFJlc3VsdCA9PSBudWxsKSB7CisgICAgICAgICAgICBodG1sLmFwcGVuZCgiRXhwZWN0ZWQgcmVzdWx0IHdhcyBOVUxMIik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBodG1sLmFwcGVuZChtRXhwZWN0ZWRSZXN1bHQucmVwbGFjZSgiXG4iLCAiPGJyIC8+IikpOworICAgICAgICB9CisgICAgICAgIGh0bWwuYXBwZW5kKCIgICAgICAgIDwvdGQ+Iik7CisgICAgICAgIGh0bWwuYXBwZW5kKCIgICAgICAgIDx0ZCBjbGFzcz1cInNwYWNlXCI+PC90ZD4iKTsKKyAgICAgICAgaHRtbC5hcHBlbmQoIiAgICA8dGQgY2xhc3M9XCJsaW5lX2NvdW50XCI+Iik7CisgICAgICAgIGh0bWwuYXBwZW5kKCIgICAgPC90ZD4iKTsKKyAgICAgICAgaHRtbC5hcHBlbmQoIiAgICA8dGQgY2xhc3M9XCJsaW5lXCI+Iik7CisgICAgICAgIGlmIChtQWN0dWFsUmVzdWx0ID09IG51bGwpIHsKKyAgICAgICAgICAgIGh0bWwuYXBwZW5kKCJBY3R1YWwgcmVzdWx0IHdhcyBOVUxMIik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBodG1sLmFwcGVuZChtQWN0dWFsUmVzdWx0LnJlcGxhY2UoIlxuIiwgIjxiciAvPiIpKTsKKyAgICAgICAgfQorICAgICAgICBodG1sLmFwcGVuZCgiICAgICAgICA8L3RkPiIpOworICAgICAgICBodG1sLmFwcGVuZCgiICAgIDwvdHI+Iik7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFRlc3RUeXBlIGdldFR5cGUoKSB7CisgICAgICAgIHJldHVybiBUZXN0VHlwZS5URVhUOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9idGFpbkFjdHVhbFJlc3VsdHMoV2ViVmlldyB3ZWJ2aWV3LCBNZXNzYWdlIHJlc3VsdE9idGFpbmVkTXNnKSB7CisgICAgICAgIG1SZXN1bHRPYnRhaW5lZE1zZyA9IHJlc3VsdE9idGFpbmVkTXNnOworICAgICAgICBNZXNzYWdlIG1zZyA9IG1IYW5kbGVyLm9idGFpbk1lc3NhZ2UoTVNHX0RPQ1VNRU5UX0FTX1RFWFQpOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBhcmcxIC0gc2hvdWxkIGR1bXAgdG9wIGZyYW1lIGFzIHRleHQKKyAgICAgICAgICogYXJnMiAtIHNob3VsZCBkdW1wIGNoaWxkIGZyYW1lcyBhcyB0ZXh0CisgICAgICAgICAqLworICAgICAgICBtc2cuYXJnMSA9IDE7CisgICAgICAgIG1zZy5hcmcyID0gbUR1bXBDaGlsZEZyYW1lc0FzVGV4dCA/IDEgOiAwOworICAgICAgICB3ZWJ2aWV3LmRvY3VtZW50QXNUZXh0KG1zZyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIEJ1bmRsZSBnZXRCdW5kbGUoKSB7CisgICAgICAgIEJ1bmRsZSBidW5kbGUgPSBuZXcgQnVuZGxlKCk7CisgICAgICAgIGJ1bmRsZS5wdXRTdHJpbmcoImV4cGVjdGVkVGV4dHVhbFJlc3VsdCIsIG1FeHBlY3RlZFJlc3VsdCk7CisgICAgICAgIGJ1bmRsZS5wdXRTdHJpbmcoImV4cGVjdGVkVGV4dHVhbFJlc3VsdFBhdGgiLCBtRXhwZWN0ZWRSZXN1bHRQYXRoKTsKKyAgICAgICAgYnVuZGxlLnB1dFN0cmluZygiYWN0dWFsVGV4dHVhbFJlc3VsdCIsIGdldEFjdHVhbFRleHRSZXN1bHQoKSk7CisgICAgICAgIGJ1bmRsZS5wdXRTdHJpbmcoImFkZGl0aW9uYWxUZXh0T3V0cHV0U3RyaW5nIiwgZ2V0QWRkaXRpb25hbFRleHRPdXRwdXRTdHJpbmcoKSk7CisgICAgICAgIGJ1bmRsZS5wdXRTdHJpbmcoInJlbGF0aXZlUGF0aCIsIG1SZWxhdGl2ZVBhdGgpOworICAgICAgICBpZiAobVJlc3VsdENvZGUgIT0gbnVsbCkgeworICAgICAgICAgICAgYnVuZGxlLnB1dFN0cmluZygicmVzdWx0Q29kZSIsIG1SZXN1bHRDb2RlLm5hbWUoKSk7CisgICAgICAgIH0KKyAgICAgICAgYnVuZGxlLnB1dFN0cmluZygidHlwZSIsIGdldFR5cGUoKS5uYW1lKCkpOworICAgICAgICByZXR1cm4gYnVuZGxlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0UmVsYXRpdmVQYXRoKCkgeworICAgICAgICByZXR1cm4gbVJlbGF0aXZlUGF0aDsKKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvRHVtcFJlbmRlclRyZWUyL3NyYy9jb20vYW5kcm9pZC9kdW1wcmVuZGVydHJlZTIvVmlzdWFsRGlmZlV0aWxzLmphdmEgYi90ZXN0cy9EdW1wUmVuZGVyVHJlZTIvc3JjL2NvbS9hbmRyb2lkL2R1bXByZW5kZXJ0cmVlMi9WaXN1YWxEaWZmVXRpbHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNmJmNzVjCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvRHVtcFJlbmRlclRyZWUyL3NyYy9jb20vYW5kcm9pZC9kdW1wcmVuZGVydHJlZTIvVmlzdWFsRGlmZlV0aWxzLmphdmEKQEAgLTAsMCArMSwyMDcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLmR1bXByZW5kZXJ0cmVlMjsKKworaW1wb3J0IG5hbWUuZnJhc2VyLm5laWwucGxhaW50ZXh0LmRpZmZfbWF0Y2hfcGF0Y2g7CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsKKworLyoqCisgKiBIZWxwZXIgbWV0aG9kcyBmbyBUZXh0UmVzdWx0LmdldERpZmZBc0h0bWwoKQorICovCitwdWJsaWMgY2xhc3MgVmlzdWFsRGlmZlV0aWxzIHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBET05UX1BSSU5UX0xJTkVfTlVNQkVSID0gLTE7CisKKyAgICAvKioKKyAgICAgKiBQcmVwcm9jZXNzZXMgdGhlIGxpc3Qgb2YgZGlmZnMgc28gdGhhdCBuZXcgbGluZSBjaGFyYWN0ZXJzIGFwcGVhciBvbmx5IGF0IHRoZSBlbmQgb2YKKyAgICAgKiBkaWZmLnRleHQKKyAgICAgKgorICAgICAqIEBwYXJhbSBkaWZmcworICAgICAqIEByZXR1cm4KKyAgICAgKiAgICAgIExpbmtlZExpc3Qgb2YgZGlmZnMgd2hlcmUgbmV3IGxpbmUgY2hhcmFjdGVyIGFwcGVhcnMgb25seSBvbiB0aGUgZW5kIG9mCisgICAgICogICAgICBkaWZmLnRleHQKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIExpbmtlZExpc3Q8ZGlmZl9tYXRjaF9wYXRjaC5EaWZmPiBzcGxpdERpZmZzT25OZXdsaW5lKAorICAgICAgICAgICAgTGlua2VkTGlzdDxkaWZmX21hdGNoX3BhdGNoLkRpZmY+IGRpZmZzKSB7CisgICAgICAgIExpbmtlZExpc3Q8ZGlmZl9tYXRjaF9wYXRjaC5EaWZmPiBuZXdEaWZmcyA9IG5ldyBMaW5rZWRMaXN0PGRpZmZfbWF0Y2hfcGF0Y2guRGlmZj4oKTsKKworICAgICAgICBTdHJpbmdbXSBwYXJ0czsKKyAgICAgICAgaW50IGxlbmd0aE1pbnVzT25lOworICAgICAgICBmb3IgKGRpZmZfbWF0Y2hfcGF0Y2guRGlmZiBkaWZmIDogZGlmZnMpIHsKKyAgICAgICAgICAgIHBhcnRzID0gZGlmZi50ZXh0LnNwbGl0KCJcbiIsIC0xKTsKKyAgICAgICAgICAgIGlmIChwYXJ0cy5sZW5ndGggPT0gMSkgeworICAgICAgICAgICAgICAgIG5ld0RpZmZzLmFkZChkaWZmKTsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgbGVuZ3RoTWludXNPbmUgPSBwYXJ0cy5sZW5ndGggLSAxOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGhNaW51c09uZTsgaSsrKSB7CisgICAgICAgICAgICAgICAgbmV3RGlmZnMuYWRkKG5ldyBkaWZmX21hdGNoX3BhdGNoLkRpZmYoZGlmZi5vcGVyYXRpb24sIHBhcnRzW2ldICsgIlxuIikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCFwYXJ0c1tsZW5ndGhNaW51c09uZV0uaXNFbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgbmV3RGlmZnMuYWRkKG5ldyBkaWZmX21hdGNoX3BhdGNoLkRpZmYoZGlmZi5vcGVyYXRpb24sIHBhcnRzW2xlbmd0aE1pbnVzT25lXSkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIG5ld0RpZmZzOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBnZW5lcmF0ZUV4cGVjdGVkUmVzdWx0TGluZXMoTGlua2VkTGlzdDxkaWZmX21hdGNoX3BhdGNoLkRpZmY+IGRpZmZzLAorICAgICAgICAgICAgTGlua2VkTGlzdDxJbnRlZ2VyPiBsaW5lTnVtcywgTGlua2VkTGlzdDxTdHJpbmc+IGxpbmVzKSB7CisgICAgICAgIFN0cmluZyBkZWxTcGFuID0gIjxzcGFuIGNsYXNzPVwiZGVsXCI+IjsKKyAgICAgICAgU3RyaW5nIGVxbFNwYW4gPSAiPHNwYW4gY2xhc3M9XCJlcWxcIj4iOworCisgICAgICAgIFN0cmluZyBsaW5lID0gIiI7CisgICAgICAgIGludCBpID0gMTsKKyAgICAgICAgZm9yIChkaWZmX21hdGNoX3BhdGNoLkRpZmYgZGlmZiA6IGRpZmZzKSB7CisgICAgICAgICAgICBzd2l0Y2ggKGRpZmYub3BlcmF0aW9uKSB7CisgICAgICAgICAgICAgICAgY2FzZSBERUxFVEU6CisgICAgICAgICAgICAgICAgICAgIGxpbmUgPSBwcm9jZXNzRGlmZihkaWZmLCBsaW5lTnVtcywgbGluZXMsIGxpbmUsIGksIGRlbFNwYW4pOworICAgICAgICAgICAgICAgICAgICBpZiAobGluZS5lcXVhbHMoIiIpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpKys7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlIElOU0VSVDoKKyAgICAgICAgICAgICAgICAgICAgaWYgKGRpZmYudGV4dC5lbmRzV2l0aCgiXG4iKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgbGluZU51bXMuYWRkKERPTlRfUFJJTlRfTElORV9OVU1CRVIpOworICAgICAgICAgICAgICAgICAgICAgICAgbGluZXMuYWRkKCIiKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGNhc2UgRVFVQUw6CisgICAgICAgICAgICAgICAgICAgIGxpbmUgPSBwcm9jZXNzRGlmZihkaWZmLCBsaW5lTnVtcywgbGluZXMsIGxpbmUsIGksIGVxbFNwYW4pOworICAgICAgICAgICAgICAgICAgICBpZiAobGluZS5lcXVhbHMoIiIpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpKys7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoIWxpbmUuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICBsaW5lcy5hZGQobGluZSk7CisgICAgICAgICAgICBsaW5lTnVtcy5hZGQoaSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgZ2VuZXJhdGVBY3R1YWxSZXN1bHRMaW5lcyhMaW5rZWRMaXN0PGRpZmZfbWF0Y2hfcGF0Y2guRGlmZj4gZGlmZnMsCisgICAgICAgICAgICBMaW5rZWRMaXN0PEludGVnZXI+IGxpbmVOdW1zLCBMaW5rZWRMaXN0PFN0cmluZz4gbGluZXMpIHsKKyAgICAgICAgU3RyaW5nIGluc1NwYW4gPSAiPHNwYW4gY2xhc3M9XCJpbnNcIj4iOworICAgICAgICBTdHJpbmcgZXFsU3BhbiA9ICI8c3BhbiBjbGFzcz1cImVxbFwiPiI7CisKKyAgICAgICAgU3RyaW5nIGxpbmUgPSAiIjsKKyAgICAgICAgaW50IGkgPSAxOworICAgICAgICBmb3IgKGRpZmZfbWF0Y2hfcGF0Y2guRGlmZiBkaWZmIDogZGlmZnMpIHsKKyAgICAgICAgICAgIHN3aXRjaCAoZGlmZi5vcGVyYXRpb24pIHsKKyAgICAgICAgICAgICAgICBjYXNlIElOU0VSVDoKKyAgICAgICAgICAgICAgICAgICAgbGluZSA9IHByb2Nlc3NEaWZmKGRpZmYsIGxpbmVOdW1zLCBsaW5lcywgbGluZSwgaSwgaW5zU3Bhbik7CisgICAgICAgICAgICAgICAgICAgIGlmIChsaW5lLmVxdWFscygiIikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGkrKzsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGNhc2UgREVMRVRFOgorICAgICAgICAgICAgICAgICAgICBpZiAoZGlmZi50ZXh0LmVuZHNXaXRoKCJcbiIpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBsaW5lTnVtcy5hZGQoRE9OVF9QUklOVF9MSU5FX05VTUJFUik7CisgICAgICAgICAgICAgICAgICAgICAgICBsaW5lcy5hZGQoIiIpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSBFUVVBTDoKKyAgICAgICAgICAgICAgICAgICAgbGluZSA9IHByb2Nlc3NEaWZmKGRpZmYsIGxpbmVOdW1zLCBsaW5lcywgbGluZSwgaSwgZXFsU3Bhbik7CisgICAgICAgICAgICAgICAgICAgIGlmIChsaW5lLmVxdWFscygiIikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGkrKzsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmICghbGluZS5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIGxpbmVzLmFkZChsaW5lKTsKKyAgICAgICAgICAgIGxpbmVOdW1zLmFkZChpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEdlbmVyYXRlIG9yIGFwcGVuZCBhIGxpbmUgZm9yIGEgZ2l2ZW4gZGlmZiBhbmQgYWRkIGl0IHRvIGdpdmVuIGNvbGxlY3Rpb25zIGlmIG5lY2Vzc2FyeS4KKyAgICAgKiBJdCBwdXRzIGRpZmZzIGluIEhUTUwgc3BhbnMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZGlmZgorICAgICAqIEBwYXJhbSBsaW5lTnVtcworICAgICAqIEBwYXJhbSBsaW5lcworICAgICAqIEBwYXJhbSBsaW5lCisgICAgICogQHBhcmFtIGkKKyAgICAgKiBAcGFyYW0gYmVnU3BhbgorICAgICAqIEByZXR1cm4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBwcm9jZXNzRGlmZihkaWZmX21hdGNoX3BhdGNoLkRpZmYgZGlmZiwgTGlua2VkTGlzdDxJbnRlZ2VyPiBsaW5lTnVtcywKKyAgICAgICAgICAgIExpbmtlZExpc3Q8U3RyaW5nPiBsaW5lcywgU3RyaW5nIGxpbmUsIGludCBpLCBTdHJpbmcgYmVnU3BhbikgeworICAgICAgICBTdHJpbmcgZW5kU3BhbiA9ICI8L3NwYW4+IjsKKyAgICAgICAgU3RyaW5nIGJyID0gIiZuYnNwOyI7CisKKyAgICAgICAgaWYgKGRpZmYudGV4dC5lbmRzV2l0aCgiXG4iKSkgeworICAgICAgICAgICAgbGluZU51bXMuYWRkKGkrKyk7CisgICAgICAgICAgICAvKiogVE9ETzogVGhpbmsgb2YgYmV0dGVyIHdheSB0byByZXBsYWNlIHN0dWZmICovCisgICAgICAgICAgICBsaW5lICs9IGJlZ1NwYW4gKyBkaWZmLnRleHQucmVwbGFjZSgiICAiLCAiJm5ic3A7Jm5ic3A7IikKKyAgICAgICAgICAgICAgICAgICAgKyBlbmRTcGFuICsgYnI7CisgICAgICAgICAgICBsaW5lcy5hZGQobGluZSk7CisgICAgICAgICAgICBsaW5lID0gIiI7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBsaW5lICs9IGJlZ1NwYW4gKyBkaWZmLnRleHQucmVwbGFjZSgiICAiLCAiJm5ic3A7Jm5ic3A7IikgKyBlbmRTcGFuOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGxpbmU7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0SHRtbChMaW5rZWRMaXN0PEludGVnZXI+IGxpbmVOdW1zMSwgTGlua2VkTGlzdDxTdHJpbmc+IGxpbmVzMSwKKyAgICAgICAgICAgIExpbmtlZExpc3Q8SW50ZWdlcj4gbGluZU51bXMyLCBMaW5rZWRMaXN0PFN0cmluZz4gbGluZXMyKSB7CisgICAgICAgIFN0cmluZ0J1aWxkZXIgaHRtbCA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisgICAgICAgIGludCBsaW5lTnVtOworICAgICAgICBpbnQgc2l6ZSA9IGxpbmVzMS5zaXplKCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CisgICAgICAgICAgICBodG1sLmFwcGVuZCgiPHRyIGNsYXNzPVwicmVzdWx0c1wiPiIpOworCisgICAgICAgICAgICBodG1sLmFwcGVuZCgiICAgIDx0ZCBjbGFzcz1cImxpbmVfY291bnRcIj4iKTsKKyAgICAgICAgICAgIGxpbmVOdW0gPSBsaW5lTnVtczEucmVtb3ZlRmlyc3QoKTsKKyAgICAgICAgICAgIGlmIChsaW5lTnVtID4gMCkgeworICAgICAgICAgICAgICAgIGh0bWwuYXBwZW5kKGxpbmVOdW0pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaHRtbC5hcHBlbmQoIiAgICA8L3RkPiIpOworCisgICAgICAgICAgICBodG1sLmFwcGVuZCgiICAgIDx0ZCBjbGFzcz1cImxpbmVcIj4iKTsKKyAgICAgICAgICAgIGh0bWwuYXBwZW5kKGxpbmVzMS5yZW1vdmVGaXJzdCgpKTsKKyAgICAgICAgICAgIGh0bWwuYXBwZW5kKCIgICAgPC90ZD4iKTsKKworICAgICAgICAgICAgaHRtbC5hcHBlbmQoIiAgICA8dGQgY2xhc3M9XCJzcGFjZVwiPjwvdGQ+Iik7CisKKyAgICAgICAgICAgIGh0bWwuYXBwZW5kKCIgICAgPHRkIGNsYXNzPVwibGluZV9jb3VudFwiPiIpOworICAgICAgICAgICAgbGluZU51bSA9IGxpbmVOdW1zMi5yZW1vdmVGaXJzdCgpOworICAgICAgICAgICAgaWYgKGxpbmVOdW0gPiAwKSB7CisgICAgICAgICAgICAgICAgaHRtbC5hcHBlbmQobGluZU51bSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBodG1sLmFwcGVuZCgiICAgIDwvdGQ+Iik7CisKKyAgICAgICAgICAgIGh0bWwuYXBwZW5kKCIgICAgPHRkIGNsYXNzPVwibGluZVwiPiIpOworICAgICAgICAgICAgaHRtbC5hcHBlbmQobGluZXMyLnJlbW92ZUZpcnN0KCkpOworICAgICAgICAgICAgaHRtbC5hcHBlbmQoIiAgICA8L3RkPiIpOworCisgICAgICAgICAgICBodG1sLmFwcGVuZCgiPC90cj4iKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gaHRtbC50b1N0cmluZygpOworICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9EdW1wUmVuZGVyVHJlZTIvc3JjL2NvbS9hbmRyb2lkL2R1bXByZW5kZXJ0cmVlMi9mb3J3YXJkZXIvQWRiVXRpbHMuamF2YSBiL3Rlc3RzL0R1bXBSZW5kZXJUcmVlMi9zcmMvY29tL2FuZHJvaWQvZHVtcHJlbmRlcnRyZWUyL2ZvcndhcmRlci9BZGJVdGlscy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA4NmZmNTkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9EdW1wUmVuZGVyVHJlZTIvc3JjL2NvbS9hbmRyb2lkL2R1bXByZW5kZXJ0cmVlMi9mb3J3YXJkZXIvQWRiVXRpbHMuamF2YQpAQCAtMCwwICsxLDgwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5kdW1wcmVuZGVydHJlZTIuZm9yd2FyZGVyOworCitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLm5ldC5Tb2NrZXQ7CisKKy8qKgorICogVGhlIHV0aWxpdHkgY2xhc3MgdGhhdCBjYW4gc2V0dXAgYSBzb2NrZXQgYWxsb3dpbmcgdGhlIGRldmljZSB0byBjb21tdW5pY2F0ZSB3aXRoIHJlbW90ZQorICogbWFjaGluZXMgdGhyb3VnaCB0aGUgbWFjaGluZSB0aGF0IHRoZSBkZXZpY2UgaXMgY29ubmVjdGVkIHRvIHZpYSBhZGIuCisgKi8KK3B1YmxpYyBjbGFzcyBBZGJVdGlscyB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIExPR19UQUcgPSAiQWRiVXRpbHMiOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFEQl9PSyA9ICJPS0FZIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQURCX1BPUlQgPSA1MDM3OworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBREJfSE9TVCA9ICIxMjcuMC4wLjEiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBBREJfUkVTUE9OU0VfU0laRSA9IDQ7CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgbmV3IHNvY2tldCB0aGF0IGNhbiBiZSBjb25maWd1cmVkIHRvIHNlcnZlIGFzIGEgdHJhbnNwYXJlbnQgcHJveHkgdG8gYQorICAgICAqIHJlbW90ZSBtYWNoaW5lLiBUaGlzIGNhbiBiZSBhY2hpZXZlZCBieSBjYWxsaW5nIGNvbmZpZ3VyZVNvY2tldCgpCisgICAgICoKKyAgICAgKiBAcmV0dXJuIGEgc29ja2V0IHRoYXQgY2FuIGJlIGNvbmZpZ3VyZWQgdG8gbGluayB0byByZW1vdGUgbWFjaGluZQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU29ja2V0IGNyZWF0ZVNvY2tldCgpIHsKKyAgICAgICAgU29ja2V0IHNvY2tldCA9IG51bGw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBzb2NrZXQgPSBuZXcgU29ja2V0KEFEQl9IT1NULCBBREJfUE9SVCk7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIExvZy5lKExPR19UQUcsICJDcmVhdGlvbiBmYWlsZWQuIiwgZSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHNvY2tldDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25maWd1cmVzIHRoZSBjb25uZWN0aW9uIHRvIHNlcnZlIGFzIGEgdHJhbnNwYXJlbnQgcHJveHkgdG8gYSByZW1vdGUgbWFjaGluZS4KKyAgICAgKiBUaGUgZ2l2ZW4gc3RyZWFtcyBtdXN0IGJlbG9uZyB0byBhIHNvY2tldCBjcmVhdGVkIGJ5IGNyZWF0ZVNvY2tldCgpLgorICAgICAqCisgICAgICogQHBhcmFtIGlucHV0U3RyZWFtIGlucHV0U3RyZWFtIG9mIHRoZSBzb2NrZXQgd2Ugd2FudCB0byBjb25maWd1cmUKKyAgICAgKiBAcGFyYW0gb3V0cHV0U3RyZWFtIG91dHB1dFN0cmVhbSBvZiB0aGUgc29ja2V0IHdlIHdhbnQgdG8gY29uZmlndXJlCisgICAgICogQHBhcmFtIHJlbW90ZUFkZHJlc3MgYWRkcmVzcyBvZiB0aGUgcmVtb3RlIG1hY2hpbmUgKGFzIHlvdSB3b3VsZCB0eXBlIGluIGEgYnJvd3NlcgorICAgICAqICAgICAgaW4gYSBtYWNoaW5lIHRoYXQgdGhlIGRldmljZSBpcyBjb25uZWN0ZWQgdG8gdmlhIGFkYikKKyAgICAgKiBAcGFyYW0gcmVtb3RlUG9ydCBwb3J0IG9uIHdoaWNoIHRvIGNvbm5lY3QKKyAgICAgKiBAcmV0dXJuIGlmIHRoZSBjb25maWd1cmF0aW9uIHN1Y2VlZGVkCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjb25maWd1cmVDb25uZWN0aW9uKElucHV0U3RyZWFtIGlucHV0U3RyZWFtLCBPdXRwdXRTdHJlYW0gb3V0cHV0U3RyZWFtLAorICAgICAgICAgICAgU3RyaW5nIHJlbW90ZUFkZHJlc3MsIGludCByZW1vdGVQb3J0KSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBTdHJpbmcgY21kID0gInRjcDoiICsgcmVtb3RlUG9ydCArICI6IiArIHJlbW90ZUFkZHJlc3M7CisgICAgICAgIGNtZCA9IFN0cmluZy5mb3JtYXQoIiUwNFgiLCBjbWQubGVuZ3RoKCkpICsgY21kOworCisgICAgICAgIGJ5dGVbXSBidWYgPSBuZXcgYnl0ZVtBREJfUkVTUE9OU0VfU0laRV07CisgICAgICAgIG91dHB1dFN0cmVhbS53cml0ZShjbWQuZ2V0Qnl0ZXMoKSk7CisgICAgICAgIGludCByZWFkID0gaW5wdXRTdHJlYW0ucmVhZChidWYpOworICAgICAgICBpZiAocmVhZCAhPSBBREJfUkVTUE9OU0VfU0laRSB8fCAhQURCX09LLmVxdWFscyhuZXcgU3RyaW5nKGJ1ZikpKSB7CisgICAgICAgICAgICBMb2cudyhMT0dfVEFHLCAiYWRiIGNtZCBmYWlsZC4iKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvRHVtcFJlbmRlclRyZWUyL3NyYy9jb20vYW5kcm9pZC9kdW1wcmVuZGVydHJlZTIvZm9yd2FyZGVyL0Nvbm5lY3Rpb25IYW5kbGVyLmphdmEgYi90ZXN0cy9EdW1wUmVuZGVyVHJlZTIvc3JjL2NvbS9hbmRyb2lkL2R1bXByZW5kZXJ0cmVlMi9mb3J3YXJkZXIvQ29ubmVjdGlvbkhhbmRsZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZjAxZGFlCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvRHVtcFJlbmRlclRyZWUyL3NyYy9jb20vYW5kcm9pZC9kdW1wcmVuZGVydHJlZTIvZm9yd2FyZGVyL0Nvbm5lY3Rpb25IYW5kbGVyLmphdmEKQEAgLTAsMCArMSwxNzMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLmR1bXByZW5kZXJ0cmVlMi5mb3J3YXJkZXI7CisKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworCitpbXBvcnQgY29tLmFuZHJvaWQuZHVtcHJlbmRlcnRyZWUyLkZzVXRpbHM7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5uZXQuU29ja2V0OworCisvKioKKyAqIFdvcmtlciBjbGFzcyBmb3Ige0BsaW5rIEZvcndhcmRlcn0uIEEgQ29ubmVjdGlvbkhhbmRsZXIgd2lsbCBiZSBjcmVhdGVkIG9uY2UgdGhlIEZvcndhcmRlcgorICogYWNjZXB0cyBhbiBpbmNvbWluZyBjb25uZWN0aW9uLCBhbmQgaXQgd2lsbCB0aGVuIGZvcndhcmQgdGhlIGluY29taW5nL291dGdvaW5nIHN0cmVhbXMgdG8gYQorICogY29ubmVjdGlvbiBhbHJlYWR5IHByb3hpZWQgYnkgYWRiIG5ldHdvcmtpbmcgKHNlZSBhbHNvIHtAbGluayBBZGJVdGlsc30pLgorICovCitwdWJsaWMgY2xhc3MgQ29ubmVjdGlvbkhhbmRsZXIgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIExPR19UQUcgPSAiQ29ubmVjdGlvbkhhbmRsZXIiOworCisgICAgcHVibGljIHN0YXRpYyBpbnRlcmZhY2UgT25GaW5pc2hlZENhbGxiYWNrIHsKKyAgICAgICAgcHVibGljIHZvaWQgb25GaW5pc2hlZCgpOworICAgIH0KKworICAgIHByaXZhdGUgY2xhc3MgU29ja2V0UGlwZVRocmVhZCBleHRlbmRzIFRocmVhZCB7CisKKyAgICAgICAgcHJpdmF0ZSBJbnB1dFN0cmVhbSBtSW5wdXRTdHJlYW07CisgICAgICAgIHByaXZhdGUgT3V0cHV0U3RyZWFtIG1PdXRwdXRTdHJlYW07CisKKyAgICAgICAgcHVibGljIFNvY2tldFBpcGVUaHJlYWQoSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0sIE91dHB1dFN0cmVhbSBvdXRwdXRTdHJlYW0pIHsKKyAgICAgICAgICAgIG1JbnB1dFN0cmVhbSA9IGlucHV0U3RyZWFtOworICAgICAgICAgICAgbU91dHB1dFN0cmVhbSA9IG91dHB1dFN0cmVhbTsKKyAgICAgICAgICAgIHNldE5hbWUoIlNvY2tldFBpcGVUaHJlYWQ6ICIgKyBnZXROYW1lKCkpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgIGJ5dGVbXSBidWZmZXIgPSBuZXcgYnl0ZVs0MDk2XTsKKyAgICAgICAgICAgIGludCBsZW5ndGg7CisgICAgICAgICAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIGlmICgobGVuZ3RoID0gbUlucHV0U3RyZWFtLnJlYWQoYnVmZmVyKSkgPCAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBtT3V0cHV0U3RyZWFtLndyaXRlKGJ1ZmZlciwgMCwgbGVuZ3RoKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIC8qKiBUaGlzIGV4Y2VwdGlvbiBtZWFucyBvbmUgb2YgdGhlIHN0cmVhbXMgaXMgY2xvc2VkICovCisgICAgICAgICAgICAgICAgICAgIExvZy52KExPR19UQUcsIHRoaXMudG9TdHJpbmcoKSwgZSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3luY2hyb25pemVkIChtVGhyZWFkc1J1bm5pbmcpIHsKKyAgICAgICAgICAgICAgICBtVGhyZWFkc1J1bm5pbmctLTsKKyAgICAgICAgICAgICAgICBpZiAobVRocmVhZHNSdW5uaW5nID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgQ29ubmVjdGlvbkhhbmRsZXIudGhpcy5zdG9wKCk7CisgICAgICAgICAgICAgICAgICAgIG1PbkZpbmlzaGVkQ2FsbGJhY2sub25GaW5pc2hlZCgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICAgICAgcmV0dXJuIGdldE5hbWUoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgSW50ZWdlciBtVGhyZWFkc1J1bm5pbmc7CisKKyAgICBwcml2YXRlIFNvY2tldCBtRnJvbVNvY2tldCwgbVRvU29ja2V0OworICAgIHByaXZhdGUgU29ja2V0UGlwZVRocmVhZCBtRnJvbVRvUGlwZSwgbVRvRnJvbVBpcGU7CisgICAgcHJpdmF0ZSBJbnB1dFN0cmVhbSBtRnJvbVNvY2tldElucHV0U3RyZWFtLCBtVG9Tb2NrZXRJbnB1dFN0cmVhbTsKKyAgICBwcml2YXRlIE91dHB1dFN0cmVhbSBtRnJvbVNvY2tldE91dHB1dFN0cmVhbSwgbVRvU29ja2V0T3V0cHV0U3RyZWFtOworCisgICAgcHJpdmF0ZSBpbnQgbVBvcnQ7CisgICAgcHJpdmF0ZSBTdHJpbmcgbVJlbW90ZU1hY2hpbmVJcEFkZHJlc3M7CisKKyAgICBwcml2YXRlIE9uRmluaXNoZWRDYWxsYmFjayBtT25GaW5pc2hlZENhbGxiYWNrOworCisgICAgcHVibGljIENvbm5lY3Rpb25IYW5kbGVyKFN0cmluZyByZW1vdGVNYWNoaW5lSXAsIGludCBwb3J0LCBTb2NrZXQgZnJvbVNvY2tldCwgU29ja2V0IHRvU29ja2V0KSB7CisgICAgICAgIG1SZW1vdGVNYWNoaW5lSXBBZGRyZXNzID0gcmVtb3RlTWFjaGluZUlwOworICAgICAgICBtUG9ydCA9IHBvcnQ7CisKKyAgICAgICAgbUZyb21Tb2NrZXQgPSBmcm9tU29ja2V0OworICAgICAgICBtVG9Tb2NrZXQgPSB0b1NvY2tldDsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgbUZyb21Tb2NrZXRJbnB1dFN0cmVhbSA9IG1Gcm9tU29ja2V0LmdldElucHV0U3RyZWFtKCk7CisgICAgICAgICAgICBtVG9Tb2NrZXRJbnB1dFN0cmVhbSA9IG1Ub1NvY2tldC5nZXRJbnB1dFN0cmVhbSgpOworICAgICAgICAgICAgbUZyb21Tb2NrZXRPdXRwdXRTdHJlYW0gPSBtRnJvbVNvY2tldC5nZXRPdXRwdXRTdHJlYW0oKTsKKyAgICAgICAgICAgIG1Ub1NvY2tldE91dHB1dFN0cmVhbSA9IG1Ub1NvY2tldC5nZXRPdXRwdXRTdHJlYW0oKTsKKyAgICAgICAgICAgIGlmICghQWRiVXRpbHMuY29uZmlndXJlQ29ubmVjdGlvbihtVG9Tb2NrZXRJbnB1dFN0cmVhbSwgbVRvU29ja2V0T3V0cHV0U3RyZWFtLAorICAgICAgICAgICAgICAgICAgICBtUmVtb3RlTWFjaGluZUlwQWRkcmVzcywgbVBvcnQpKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJDb25maWd1cmluZyBzb2NrZXQgZmFpbGVkISIpOworICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBMb2cuZShMT0dfVEFHLCAiVW5hYmxlIHRvIHN0YXJ0IENvbm5lY3Rpb25IYW5kbGVyIiwgZSk7CisgICAgICAgICAgICBjbG9zZVN0cmVhbXMoKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIG1Gcm9tVG9QaXBlID0gbmV3IFNvY2tldFBpcGVUaHJlYWQobUZyb21Tb2NrZXRJbnB1dFN0cmVhbSwgbVRvU29ja2V0T3V0cHV0U3RyZWFtKTsKKyAgICAgICAgbVRvRnJvbVBpcGUgPSBuZXcgU29ja2V0UGlwZVRocmVhZChtVG9Tb2NrZXRJbnB1dFN0cmVhbSwgbUZyb21Tb2NrZXRPdXRwdXRTdHJlYW0pOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHJlZ2lzdGVyT25Db25uZWN0aW9uSGFuZGxlckZpbmlzaGVkQ2FsbGJhY2soT25GaW5pc2hlZENhbGxiYWNrIGNhbGxiYWNrKSB7CisgICAgICAgIG1PbkZpbmlzaGVkQ2FsbGJhY2sgPSBjYWxsYmFjazsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgY2xvc2VTdHJlYW1zKCkgeworICAgICAgICBGc1V0aWxzLmNsb3NlSW5wdXRTdHJlYW0obUZyb21Tb2NrZXRJbnB1dFN0cmVhbSk7CisgICAgICAgIEZzVXRpbHMuY2xvc2VJbnB1dFN0cmVhbShtVG9Tb2NrZXRJbnB1dFN0cmVhbSk7CisgICAgICAgIEZzVXRpbHMuY2xvc2VPdXRwdXRTdHJlYW0obUZyb21Tb2NrZXRPdXRwdXRTdHJlYW0pOworICAgICAgICBGc1V0aWxzLmNsb3NlT3V0cHV0U3RyZWFtKG1Ub1NvY2tldE91dHB1dFN0cmVhbSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc3RhcnQoKSB7CisgICAgICAgIC8qKiBXZSBoYXZlIDIgdGhyZWFkcyBydW5uaW5nLCBvbmUgZm9yIGVhY2ggcGlwZSwgdGhhdCB3ZSBzdGFydCBoZXJlLiAqLworICAgICAgICBtVGhyZWFkc1J1bm5pbmcgPSAyOworICAgICAgICBtRnJvbVRvUGlwZS5zdGFydCgpOworICAgICAgICBtVG9Gcm9tUGlwZS5zdGFydCgpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHN0b3AoKSB7CisgICAgICAgIHNodXRkb3duKG1Gcm9tU29ja2V0KTsKKyAgICAgICAgc2h1dGRvd24obVRvU29ja2V0KTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgc2h1dGRvd24oU29ja2V0IHNvY2tldCkgeworICAgICAgICBzeW5jaHJvbml6ZWQgKG1Gcm9tVG9QaXBlKSB7CisgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG1Ub0Zyb21QaXBlKSB7CisgICAgICAgICAgICAgICAgLyoqIFRoaXMgd2lsbCBzdG9wIHRoZSB3aGlsZSBsb29wIGluIHRoZSBydW4gbWV0aG9kICovCisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFzb2NrZXQuaXNJbnB1dFNodXRkb3duKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNvY2tldC5zaHV0ZG93bklucHV0KCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIExvZy5lKExPR19UQUcsICJtRnJvbVRvUGlwZT0iICsgbUZyb21Ub1BpcGUgKyAiIG1Ub0Zyb21QaXBlPSIgKyBtVG9Gcm9tUGlwZSwgZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIGlmICghc29ja2V0LmlzT3V0cHV0U2h1dGRvd24oKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgc29ja2V0LnNodXRkb3duT3V0cHV0KCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIExvZy5lKExPR19UQUcsICJtRnJvbVRvUGlwZT0iICsgbUZyb21Ub1BpcGUgKyAiIG1Ub0Zyb21QaXBlPSIgKyBtVG9Gcm9tUGlwZSwgZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIGlmICghc29ja2V0LmlzQ2xvc2VkKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNvY2tldC5jbG9zZSgpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICBMb2cuZShMT0dfVEFHLCAibUZyb21Ub1BpcGU9IiArIG1Gcm9tVG9QaXBlICsgIiBtVG9Gcm9tUGlwZT0iICsgbVRvRnJvbVBpcGUsIGUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9EdW1wUmVuZGVyVHJlZTIvc3JjL2NvbS9hbmRyb2lkL2R1bXByZW5kZXJ0cmVlMi9mb3J3YXJkZXIvRm9yd2FyZGVyLmphdmEgYi90ZXN0cy9EdW1wUmVuZGVyVHJlZTIvc3JjL2NvbS9hbmRyb2lkL2R1bXByZW5kZXJ0cmVlMi9mb3J3YXJkZXIvRm9yd2FyZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjM2MWE4OQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL0R1bXBSZW5kZXJUcmVlMi9zcmMvY29tL2FuZHJvaWQvZHVtcHJlbmRlcnRyZWUyL2ZvcndhcmRlci9Gb3J3YXJkZXIuamF2YQpAQCAtMCwwICsxLDEyOSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQuZHVtcHJlbmRlcnRyZWUyLmZvcndhcmRlcjsKKworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmV0LlNlcnZlclNvY2tldDsKK2ltcG9ydCBqYXZhLm5ldC5Tb2NrZXQ7CitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CitpbXBvcnQgamF2YS51dGlsLlNldDsKKworLyoqCisgKiBBIHBvcnQgZm9yd2FyZGluZyBzZXJ2ZXIuIExpc3RlbnMgb24gbG9jYWxob3N0IG9uIHNwZWNpZmllZCBwb3J0IGFuZCBmb3J3YXJkcyB0aGUgdGNwCisgKiBjb21tdW5pY2F0aW9ucyB0byBleHRlcm5hbCBzb2NrZXQgdmlhIGFkYiBuZXR3b3JraW5nIHByb3h5LgorICovCitwdWJsaWMgY2xhc3MgRm9yd2FyZGVyIGV4dGVuZHMgVGhyZWFkIHsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTE9HX1RBRyA9ICJGb3J3YXJkZXIiOworCisgICAgcHJpdmF0ZSBpbnQgbVBvcnQ7CisgICAgcHJpdmF0ZSBTdHJpbmcgbVJlbW90ZU1hY2hpbmVJcEFkZHJlc3M7CisKKyAgICBwcml2YXRlIFNlcnZlclNvY2tldCBtU2VydmVyU29ja2V0OworCisgICAgcHJpdmF0ZSBTZXQ8Q29ubmVjdGlvbkhhbmRsZXI+IG1Db25uZWN0aW9uSGFuZGxlcnMgPSBuZXcgSGFzaFNldDxDb25uZWN0aW9uSGFuZGxlcj4oKTsKKworICAgIHB1YmxpYyBGb3J3YXJkZXIoaW50IHBvcnQsIFN0cmluZyByZW1vdGVNYWNoaW5lSXBBZGRyZXNzKSB7CisgICAgICAgIG1Qb3J0ID0gcG9ydDsKKyAgICAgICAgbVJlbW90ZU1hY2hpbmVJcEFkZHJlc3MgPSByZW1vdGVNYWNoaW5lSXBBZGRyZXNzOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHN0YXJ0KCkgeworICAgICAgICBMb2cuaShMT0dfVEFHLCAic3RhcnQoKTogU3RhcnRpbmcgZm93YXJkZXIgb24gcG9ydDogIiArIG1Qb3J0KTsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgbVNlcnZlclNvY2tldCA9IG5ldyBTZXJ2ZXJTb2NrZXQobVBvcnQpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBMb2cuZShMT0dfVEFHLCAibVBvcnQ9IiArIG1Qb3J0LCBlKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIHN1cGVyLnN0YXJ0KCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICAgICAgU29ja2V0IGxvY2FsU29ja2V0OworICAgICAgICAgICAgU29ja2V0IHJlbW90ZVNvY2tldDsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgbG9jYWxTb2NrZXQgPSBtU2VydmVyU29ja2V0LmFjY2VwdCgpOworICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIC8qKiBUaGlzIG1vc3QgbGlrZWx5IG1lYW5zIHRoYXQgbVNlcnZlclNvY2tldCBpcyBhbHJlYWR5IGNsb3NlZCAqLworICAgICAgICAgICAgICAgIExvZy53KExPR19UQUcsICJtUG9ydD0iICsgbVBvcnQsIGUpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZW1vdGVTb2NrZXQgPSBBZGJVdGlscy5jcmVhdGVTb2NrZXQoKTsKKworICAgICAgICAgICAgaWYgKHJlbW90ZVNvY2tldCA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgbG9jYWxTb2NrZXQuY2xvc2UoKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIExvZy5lKExPR19UQUcsICJtUG9ydD0iICsgbVBvcnQsIGUpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIExvZy5lKExPR19UQUcsICJydW4oKTogbVBvcnQ9ICIgKyBtUG9ydCArICIgRmFpbGVkIHRvIHN0YXJ0IGZvcndhcmRpbmcgZnJvbSAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxvY2FsU29ja2V0KTsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZmluYWwgQ29ubmVjdGlvbkhhbmRsZXIgY29ubmVjdGlvbkhhbmRsZXIgPQorICAgICAgICAgICAgICAgICAgICBuZXcgQ29ubmVjdGlvbkhhbmRsZXIobVJlbW90ZU1hY2hpbmVJcEFkZHJlc3MsIG1Qb3J0LCBsb2NhbFNvY2tldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZW1vdGVTb2NrZXQpOworCisgICAgICAgICAgICAvKioKKyAgICAgICAgICAgICAqIFdlIGhhdmUgdG8gY2xvc2UgdGhlIHNvY2tldHMgYWZ0ZXIgdGhlIENvbm5lY3Rpb25IYW5kbGVyIGZpbmlzaGVzLCBzbyB3ZQorICAgICAgICAgICAgICogZG9uJ3QgZ2V0ICJUb28gbWF5IG9wZW4gZmlsZXMiIGV4Y2VwdGlvbi4gV2UgYWxzbyByZW1vdmUgdGhlIENvbm5lY3Rpb25IYW5kbGVyCisgICAgICAgICAgICAgKiBmcm9tIHRoZSBjb2xsZWN0aW9uIHRvIGF2b2lkIG1lbW9yeSBpc3N1ZXMuCisgICAgICAgICAgICAgKiAqLworICAgICAgICAgICAgQ29ubmVjdGlvbkhhbmRsZXIuT25GaW5pc2hlZENhbGxiYWNrIGNhbGxiYWNrID0KKyAgICAgICAgICAgICAgICAgICAgbmV3IENvbm5lY3Rpb25IYW5kbGVyLk9uRmluaXNoZWRDYWxsYmFjaygpIHsKKyAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkZpbmlzaGVkKCkgeworICAgICAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghbUNvbm5lY3Rpb25IYW5kbGVycy5yZW1vdmUoY29ubmVjdGlvbkhhbmRsZXIpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0IGZhbHNlIDogInJlbW92ZUNvbm5lY3Rpb25IYW5kbGVyKCk6IG5vdCBpbiB0aGUgY29sbGVjdGlvbiI7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9OworICAgICAgICAgICAgY29ubmVjdGlvbkhhbmRsZXIucmVnaXN0ZXJPbkNvbm5lY3Rpb25IYW5kbGVyRmluaXNoZWRDYWxsYmFjayhjYWxsYmFjayk7CisKKyAgICAgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgeworICAgICAgICAgICAgICAgIG1Db25uZWN0aW9uSGFuZGxlcnMuYWRkKGNvbm5lY3Rpb25IYW5kbGVyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNvbm5lY3Rpb25IYW5kbGVyLnN0YXJ0KCk7CisgICAgICAgIH0KKworICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKKyAgICAgICAgICAgIGZvciAoQ29ubmVjdGlvbkhhbmRsZXIgY29ubmVjdGlvbkhhbmRsZXIgOiBtQ29ubmVjdGlvbkhhbmRsZXJzKSB7CisgICAgICAgICAgICAgICAgY29ubmVjdGlvbkhhbmRsZXIuc3RvcCgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZmluaXNoKCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgbVNlcnZlclNvY2tldC5jbG9zZSgpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBMb2cuZShMT0dfVEFHLCAibVBvcnQ9IiArIG1Qb3J0LCBlKTsKKyAgICAgICAgfQorICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9EdW1wUmVuZGVyVHJlZTIvc3JjL2NvbS9hbmRyb2lkL2R1bXByZW5kZXJ0cmVlMi9mb3J3YXJkZXIvRm9yd2FyZGVyTWFuYWdlci5qYXZhIGIvdGVzdHMvRHVtcFJlbmRlclRyZWUyL3NyYy9jb20vYW5kcm9pZC9kdW1wcmVuZGVydHJlZTIvZm9yd2FyZGVyL0ZvcndhcmRlck1hbmFnZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MzE3YTI3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvRHVtcFJlbmRlclRyZWUyL3NyYy9jb20vYW5kcm9pZC9kdW1wcmVuZGVydHJlZTIvZm9yd2FyZGVyL0ZvcndhcmRlck1hbmFnZXIuamF2YQpAQCAtMCwwICsxLDEyNSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQuZHVtcHJlbmRlcnRyZWUyLmZvcndhcmRlcjsKKworaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5ldC5VUkw7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKKworaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OworaW1wb3J0IGphdmEudXRpbC5TZXQ7CisKKy8qKgorICogQSBzaW1wbGUgY2xhc3MgdG8gc3RhcnQgYW5kIHN0b3AgRm9yd2FyZGVycyBydW5uaW5nIG9uIHNvbWUgcG9ydHMuCisgKgorICogSXQgdXNlcyBhIHNpbmdsZXRvbiBwYXR0ZXJuIGFuZCBpcyB0aHJlYWQgc2FmZS4KKyAqLworcHVibGljIGNsYXNzIEZvcndhcmRlck1hbmFnZXIgeworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMT0dfVEFHID0gIkZvcndhcmRlck1hbmFnZXIiOworCisgICAgLyoqCisgICAgICogVGhlIElQIGFkZHJlc3Mgb2YgdGhlIHNlcnZlciBzZXJ2aW5nIHRoZSB0ZXN0cy4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSE9TVF9JUCA9ICIxMjcuMC4wLjEiOworCisgICAgLyoqCisgICAgICogV2UgdXNlIHRoZXNlIHBvcnRzIGJlY2F1c2Ugb3RoZXIgd2Via2l0IHBsYXRmb3JtcyBkby4gVGhleSBhcmUgc2V0IHVwIGluCisgICAgICogZXh0ZXJuYWwvd2Via2l0L0xheW91dFRlc3RzL2h0dHAvY29uZi9hcGFjaGUyLWRlYmlhbi1odHRwZC5jb25mCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSFRUUF9QT1JUID0gODA4MDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBIVFRQU19QT1JUID0gODQ0MzsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEhPU1QgPSAibG9jYWxob3N0IjsKKworICAgIHByaXZhdGUgc3RhdGljIEZvcndhcmRlck1hbmFnZXIgZm9yd2FyZGVyTWFuYWdlcjsKKworICAgIHByaXZhdGUgU2V0PEZvcndhcmRlcj4gbUZvcndhcmRlcnM7CisgICAgcHJpdmF0ZSBib29sZWFuIG1Jc1N0YXJ0ZWQ7CisKKyAgICBwcml2YXRlIEZvcndhcmRlck1hbmFnZXIoKSB7CisgICAgICAgIG1Gb3J3YXJkZXJzID0gbmV3IEhhc2hTZXQ8Rm9yd2FyZGVyPigyKTsKKyAgICAgICAgbUZvcndhcmRlcnMuYWRkKG5ldyBGb3J3YXJkZXIoSFRUUF9QT1JULCBIT1NUX0lQKSk7CisgICAgICAgIG1Gb3J3YXJkZXJzLmFkZChuZXcgRm9yd2FyZGVyKEhUVFBTX1BPUlQsIEhPU1RfSVApKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBtYWluIHBhcnQgb2YgdGhlIFVSTCB3aXRoIHRoZSB0cmFpbGluZyBzbGFzaAorICAgICAqCisgICAgICogQHBhcmFtIGlzSHR0cHMKKyAgICAgKiBAcmV0dXJuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgZ2V0SG9zdFNjaGVtZVBvcnQoYm9vbGVhbiBpc0h0dHBzKSB7CisgICAgICAgIGludCBwb3J0OworICAgICAgICBTdHJpbmcgcHJvdG9jb2w7CisgICAgICAgIGlmIChpc0h0dHBzKSB7CisgICAgICAgICAgICBwcm90b2NvbCA9ICJodHRwcyI7CisgICAgICAgICAgICBwb3J0ID0gSFRUUFNfUE9SVDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHByb3RvY29sID0gImh0dHAiOworICAgICAgICAgICAgcG9ydCA9IEhUVFBfUE9SVDsKKyAgICAgICAgfQorCisgICAgICAgIFVSTCB1cmwgPSBudWxsOworICAgICAgICB0cnkgeworICAgICAgICAgICAgdXJsID0gbmV3IFVSTChwcm90b2NvbCwgSE9TVCwgcG9ydCwgIi8iKTsKKyAgICAgICAgfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGFzc2VydCBmYWxzZSA6ICJpc0h0dHBzPSIgKyBpc0h0dHBzOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHVybC50b1N0cmluZygpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgc3luY2hyb25pemVkIEZvcndhcmRlck1hbmFnZXIgZ2V0Rm9yd2FyZGVyTWFuYWdlcigpIHsKKyAgICAgICAgaWYgKGZvcndhcmRlck1hbmFnZXIgPT0gbnVsbCkgeworICAgICAgICAgICAgZm9yd2FyZGVyTWFuYWdlciA9IG5ldyBGb3J3YXJkZXJNYW5hZ2VyKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZvcndhcmRlck1hbmFnZXI7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIE9iamVjdCBjbG9uZSgpIHRocm93cyBDbG9uZU5vdFN1cHBvcnRlZEV4Y2VwdGlvbiB7CisgICAgICAgIHRocm93IG5ldyBDbG9uZU5vdFN1cHBvcnRlZEV4Y2VwdGlvbigpOworICAgIH0KKworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBzdGFydCgpIHsKKyAgICAgICAgaWYgKG1Jc1N0YXJ0ZWQpIHsKKyAgICAgICAgICAgIExvZy53KExPR19UQUcsICJzdGFydCgpOiBGb3J3YXJkZXJNYW5hZ2VyIGFscmVhZHkgcnVubmluZyEgTk9PUC4iKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGZvciAoRm9yd2FyZGVyIGZvcndhcmRlciA6IG1Gb3J3YXJkZXJzKSB7CisgICAgICAgICAgICBmb3J3YXJkZXIuc3RhcnQoKTsKKyAgICAgICAgfQorCisgICAgICAgIG1Jc1N0YXJ0ZWQgPSB0cnVlOworICAgICAgICBMb2cuaShMT0dfVEFHLCAiRm9yd2FyZGVyTWFuYWdlciBzdGFydGVkLiIpOworICAgIH0KKworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBzdG9wKCkgeworICAgICAgICBpZiAoIW1Jc1N0YXJ0ZWQpIHsKKyAgICAgICAgICAgIExvZy53KExPR19UQUcsICJzdG9wKCk6IEZvcndhcmRlck1hbmFnZXIgYWxyZWFkeSBzdG9wcGVkISBOT09QLiIpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgZm9yIChGb3J3YXJkZXIgZm9yd2FyZGVyIDogbUZvcndhcmRlcnMpIHsKKyAgICAgICAgICAgIGZvcndhcmRlci5maW5pc2goKTsKKyAgICAgICAgfQorCisgICAgICAgIG1Jc1N0YXJ0ZWQgPSBmYWxzZTsKKyAgICAgICAgTG9nLmkoTE9HX1RBRywgIkZvcndhcmRlck1hbmFnZXIgc3RvcHBlZC4iKTsKKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvRHVtcFJlbmRlclRyZWUyL3NyYy9jb20vYW5kcm9pZC9kdW1wcmVuZGVydHJlZTIvc2NyaXB0c3VwcG9ydC9PbkV2ZXJ5dGhpbmdGaW5pc2hlZENhbGxiYWNrLmphdmEgYi90ZXN0cy9EdW1wUmVuZGVyVHJlZTIvc3JjL2NvbS9hbmRyb2lkL2R1bXByZW5kZXJ0cmVlMi9zY3JpcHRzdXBwb3J0L09uRXZlcnl0aGluZ0ZpbmlzaGVkQ2FsbGJhY2suamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMWQ0MzY0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvRHVtcFJlbmRlclRyZWUyL3NyYy9jb20vYW5kcm9pZC9kdW1wcmVuZGVydHJlZTIvc2NyaXB0c3VwcG9ydC9PbkV2ZXJ5dGhpbmdGaW5pc2hlZENhbGxiYWNrLmphdmEKQEAgLTAsMCArMSwyNSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQuZHVtcHJlbmRlcnRyZWUyLnNjcmlwdHN1cHBvcnQ7CisKKy8qKgorICogQ2FsbGJhY2sgdXNlZCB0byBpbmZvcm0gc2NyaXB0c3VwcG9ydC5TdGFydGVyIHRoYXQgZXZlcnl0aGluZyBpcyBmaW5pc2hlZCBhbmQKKyAqIHdlIGNhbiBleGl0CisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgT25FdmVyeXRoaW5nRmluaXNoZWRDYWxsYmFjayB7CisgICAgcHVibGljIHZvaWQgb25GaW5pc2hlZCgpOworfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL0R1bXBSZW5kZXJUcmVlMi9zcmMvY29tL2FuZHJvaWQvZHVtcHJlbmRlcnRyZWUyL3NjcmlwdHN1cHBvcnQvU2NyaXB0VGVzdFJ1bm5lci5qYXZhIGIvdGVzdHMvRHVtcFJlbmRlclRyZWUyL3NyYy9jb20vYW5kcm9pZC9kdW1wcmVuZGVydHJlZTIvc2NyaXB0c3VwcG9ydC9TY3JpcHRUZXN0UnVubmVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzhmNThkNQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL0R1bXBSZW5kZXJUcmVlMi9zcmMvY29tL2FuZHJvaWQvZHVtcHJlbmRlcnRyZWUyL3NjcmlwdHN1cHBvcnQvU2NyaXB0VGVzdFJ1bm5lci5qYXZhCkBAIC0wLDAgKzEsMzcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLmR1bXByZW5kZXJ0cmVlMi5zY3JpcHRzdXBwb3J0OworCitpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CitpbXBvcnQgYW5kcm9pZC50ZXN0Lkluc3RydW1lbnRhdGlvblRlc3RSdW5uZXI7CisKKy8qKgorICogRXh0ZW5kcyBJbnN0cnVtZW50YXRpb25UZXN0UnVubmVyIHRvIGFsbG93IHRoZSBzY3JpcHQgdG8gcGFzcyBhcmd1bWVudHMgdG8gdGhlIGFwcGxpY2F0aW9uCisgKi8KK3B1YmxpYyBjbGFzcyBTY3JpcHRUZXN0UnVubmVyIGV4dGVuZHMgSW5zdHJ1bWVudGF0aW9uVGVzdFJ1bm5lciB7CisgICAgU3RyaW5nIG1UZXN0c1JlbGF0aXZlUGF0aDsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9uQ3JlYXRlKEJ1bmRsZSBhcmd1bWVudHMpIHsKKyAgICAgICAgbVRlc3RzUmVsYXRpdmVQYXRoID0gYXJndW1lbnRzLmdldFN0cmluZygicGF0aCIpOworICAgICAgICBzdXBlci5vbkNyZWF0ZShhcmd1bWVudHMpOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0VGVzdHNSZWxhdGl2ZVBhdGgoKSB7CisgICAgICAgIHJldHVybiBtVGVzdHNSZWxhdGl2ZVBhdGg7CisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL0R1bXBSZW5kZXJUcmVlMi9zcmMvY29tL2FuZHJvaWQvZHVtcHJlbmRlcnRyZWUyL3NjcmlwdHN1cHBvcnQvU3RhcnRlci5qYXZhIGIvdGVzdHMvRHVtcFJlbmRlclRyZWUyL3NyYy9jb20vYW5kcm9pZC9kdW1wcmVuZGVydHJlZTIvc2NyaXB0c3VwcG9ydC9TdGFydGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmY0MWEwZgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL0R1bXBSZW5kZXJUcmVlMi9zcmMvY29tL2FuZHJvaWQvZHVtcHJlbmRlcnRyZWUyL3NjcmlwdHN1cHBvcnQvU3RhcnRlci5qYXZhCkBAIC0wLDAgKzEsNzkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLmR1bXByZW5kZXJ0cmVlMi5zY3JpcHRzdXBwb3J0OworCitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKK2ltcG9ydCBhbmRyb2lkLnRlc3QuQWN0aXZpdHlJbnN0cnVtZW50YXRpb25UZXN0Q2FzZTI7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKKworaW1wb3J0IGNvbS5hbmRyb2lkLmR1bXByZW5kZXJ0cmVlMi5UZXN0c0xpc3RBY3Rpdml0eTsKK2ltcG9ydCBjb20uYW5kcm9pZC5kdW1wcmVuZGVydHJlZTIuZm9yd2FyZGVyLkZvcndhcmRlck1hbmFnZXI7CisKKy8qKgorICogQSBjbGFzcyB3aGljaCBwcm92aWRlcyBtZXRob2RzIHRoYXQgY2FuIGJlIGludm9rZWQgYnkgYSBzY3JpcHQgcnVubmluZyBvbiB0aGUgaG9zdCBtYWNoaW5lIHRvCisgKiBydW4gdGhlIHRlc3RzLgorICoKKyAqIEl0IHN0YXJ0cyBhIFRlc3RzTGlzdEFjdGl2aXR5IGFuZCBkb2VzIG5vdCByZXR1cm4gdW50aWwgYWxsIHRoZSB0ZXN0cyBmaW5pc2ggZXhlY3V0aW5nLgorICovCitwdWJsaWMgY2xhc3MgU3RhcnRlciBleHRlbmRzIEFjdGl2aXR5SW5zdHJ1bWVudGF0aW9uVGVzdENhc2UyPFRlc3RzTGlzdEFjdGl2aXR5PiB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIExPR19UQUcgPSAiU3RhcnRlciI7CisgICAgcHJpdmF0ZSBib29sZWFuIG1FdmVyeXRoaW5nRmluaXNoZWQ7CisKKyAgICBwdWJsaWMgU3RhcnRlcigpIHsKKyAgICAgICAgc3VwZXIoVGVzdHNMaXN0QWN0aXZpdHkuY2xhc3MpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBmcm9tIGFkYiB0byBzdGFydCBleGVjdXRpbmcgdGhlIHRlc3RzLiBJdCBkb2Vzbid0IHJldHVybgorICAgICAqIHVudGlsIGV2ZXJ5dGhpbmcgaXMgZmluaXNoZWQgc28gdGhhdCB0aGUgc2NyaXB0IGNhbiB3YWl0IGZvciB0aGUgZW5kIGlmIGl0IG5lZWRzCisgICAgICogdG8uCisgICAgICovCisgICAgcHVibGljIHZvaWQgc3RhcnRMYXlvdXRUZXN0cygpIHsKKyAgICAgICAgU2NyaXB0VGVzdFJ1bm5lciBydW5uZXIgPSAoU2NyaXB0VGVzdFJ1bm5lcilnZXRJbnN0cnVtZW50YXRpb24oKTsKKyAgICAgICAgU3RyaW5nIHJlbGF0aXZlUGF0aCA9IHJ1bm5lci5nZXRUZXN0c1JlbGF0aXZlUGF0aCgpOworCisgICAgICAgIEZvcndhcmRlck1hbmFnZXIuZ2V0Rm9yd2FyZGVyTWFuYWdlcigpLnN0YXJ0KCk7CisKKyAgICAgICAgSW50ZW50IGludGVudCA9IG5ldyBJbnRlbnQoKTsKKyAgICAgICAgaW50ZW50LnNldENsYXNzTmFtZSgiY29tLmFuZHJvaWQuZHVtcHJlbmRlcnRyZWUyIiwgIlRlc3RzTGlzdEFjdGl2aXR5Iik7CisgICAgICAgIGludGVudC5zZXRBY3Rpb24oSW50ZW50LkFDVElPTl9SVU4pOworICAgICAgICBpbnRlbnQucHV0RXh0cmEoVGVzdHNMaXN0QWN0aXZpdHkuRVhUUkFfVEVTVF9QQVRILCByZWxhdGl2ZVBhdGgpOworICAgICAgICBzZXRBY3Rpdml0eUludGVudChpbnRlbnQpOworICAgICAgICBnZXRBY3Rpdml0eSgpLnJlZ2lzdGVyT25FdmVyeXRoaW5nRmluaXNoZWRDYWxsYmFjayhuZXcgT25FdmVyeXRoaW5nRmluaXNoZWRDYWxsYmFjaygpIHsKKyAgICAgICAgICAgIC8qKiBUaGlzIG1ldGhvZCBpcyBzYWZlIHRvIGNhbGwgb24gYW55IHRocmVhZCAqLworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkZpbmlzaGVkKCkgeworICAgICAgICAgICAgICAgIHN5bmNocm9uaXplZCAoU3RhcnRlci50aGlzKSB7CisgICAgICAgICAgICAgICAgICAgIG1FdmVyeXRoaW5nRmluaXNoZWQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICBTdGFydGVyLnRoaXMubm90aWZ5QWxsKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9KTsKKworICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKKyAgICAgICAgICAgIHdoaWxlICghbUV2ZXJ5dGhpbmdGaW5pc2hlZCkgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIHRoaXMud2FpdCgpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgTG9nLmUoTE9HX1RBRywgInN0YXJ0TGF5b3V0VGVzdHMoKSIsIGUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIEZvcndhcmRlck1hbmFnZXIuZ2V0Rm9yd2FyZGVyTWFuYWdlcigpLnN0b3AoKTsKKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvRHVtcFJlbmRlclRyZWUyL3NyYy9jb20vYW5kcm9pZC9kdW1wcmVuZGVydHJlZTIvdWkvRGlyTGlzdEFjdGl2aXR5LmphdmEgYi90ZXN0cy9EdW1wUmVuZGVyVHJlZTIvc3JjL2NvbS9hbmRyb2lkL2R1bXByZW5kZXJ0cmVlMi91aS9EaXJMaXN0QWN0aXZpdHkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNWRlODhhCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvRHVtcFJlbmRlclRyZWUyL3NyYy9jb20vYW5kcm9pZC9kdW1wcmVuZGVydHJlZTIvdWkvRGlyTGlzdEFjdGl2aXR5LmphdmEKQEAgLTAsMCArMSw0MTEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLmR1bXByZW5kZXJ0cmVlMi51aTsKKworaW1wb3J0IGNvbS5hbmRyb2lkLmR1bXByZW5kZXJ0cmVlMi5GaWxlRmlsdGVyOworaW1wb3J0IGNvbS5hbmRyb2lkLmR1bXByZW5kZXJ0cmVlMi5Gc1V0aWxzOworaW1wb3J0IGNvbS5hbmRyb2lkLmR1bXByZW5kZXJ0cmVlMi5UZXN0c0xpc3RBY3Rpdml0eTsKK2ltcG9ydCBjb20uYW5kcm9pZC5kdW1wcmVuZGVydHJlZTIuUjsKK2ltcG9ydCBjb20uYW5kcm9pZC5kdW1wcmVuZGVydHJlZTIuZm9yd2FyZGVyLkZvcndhcmRlck1hbmFnZXI7CisKK2ltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eTsKK2ltcG9ydCBhbmRyb2lkLmFwcC5BbGVydERpYWxvZzsKK2ltcG9ydCBhbmRyb2lkLmFwcC5EaWFsb2c7CitpbXBvcnQgYW5kcm9pZC5hcHAuTGlzdEFjdGl2aXR5OworaW1wb3J0IGFuZHJvaWQuYXBwLlByb2dyZXNzRGlhbG9nOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5EaWFsb2dJbnRlcmZhY2U7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLkNvbmZpZ3VyYXRpb247CitpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CitpbXBvcnQgYW5kcm9pZC5vcy5FbnZpcm9ubWVudDsKK2ltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5NZXNzYWdlOworaW1wb3J0IGFuZHJvaWQudmlldy5MYXlvdXRJbmZsYXRlcjsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuTWVudTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuTWVudUluZmxhdGVyOworaW1wb3J0IGFuZHJvaWQudmlldy5NZW51SXRlbTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlld0dyb3VwOworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkFkYXB0ZXJWaWV3OworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkFycmF5QWRhcHRlcjsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5JbWFnZVZpZXc7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuTGlzdFZpZXc7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuVGV4dFZpZXc7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworLyoqCisgKiBBbiBBY3Rpdml0eSB0aGF0IGFsbG93cyBuYXZpZ2F0aW5nIHRocm91Z2ggdGVzdHMgZm9sZGVycyBhbmQgY2hvb3NpbmcgZm9sZGVycyBvciB0ZXN0cyB0byBydW4uCisgKi8KK3B1YmxpYyBjbGFzcyBEaXJMaXN0QWN0aXZpdHkgZXh0ZW5kcyBMaXN0QWN0aXZpdHkgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIExPR19UQUcgPSAiRGlyTGlzdEFjdGl2aXR5IjsKKworICAgIC8qKiBUT0RPOiBUaGlzIGlzIGp1c3QgYSBndWVzcyAtIHRoaW5rIG9mIGEgYmV0dGVyIHdheSB0byBhY2hpZXZlIGl0ICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1FQU5fVElUTEVfQ0hBUl9TSVpFID0gMTM7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUFJPR1JFU1NfRElBTE9HX0RFTEFZX01TID0gMjAwOworCisgICAgLyoqIENvZGUgZm9yIHRoZSBkaWFsb2csIHVzZWQgaW4gc2hvd0RpYWxvZyBhbmQgb25DcmVhdGVEaWFsb2cgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRElBTE9HX1JVTl9BQk9SVF9ESVIgPSAwOworCisgICAgLyoqIE1lc3NhZ2VzIGNvZGVzICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1TR19MT0FERURfSVRFTVMgPSAwOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNU0dfU0hPV19QUk9HUkVTU19ESUFMT0cgPSAxOworCisgICAgLyoqIEluaXRpYWxpemVkIGxhemlseSBiZWZvcmUgZmlyc3Qgc1Byb2dyZXNzRGlhbG9nLnNob3coKSAqLworICAgIHByaXZhdGUgc3RhdGljIFByb2dyZXNzRGlhbG9nIHNQcm9ncmVzc0RpYWxvZzsKKworICAgIHByaXZhdGUgTGlzdFZpZXcgbUxpc3RWaWV3OworCisgICAgLyoqIFRoaXMgaXMgYSByZWxhdGl2ZSBwYXRoISAqLworICAgIHByaXZhdGUgU3RyaW5nIG1DdXJyZW50RGlyUGF0aDsKKworICAgIC8qKgorICAgICAqIEEgdGhyZWFkIHJlc3BvbnNpYmxlIGZvciBsb2FkaW5nIHRoZSBjb250ZW50cyBvZiB0aGUgZGlyZWN0b3J5IGZyb20gc2QgY2FyZAorICAgICAqIGFuZCBzZW5kaW5nIHRoZW0gdmlhIE1lc3NhZ2UgdG8gbWFpbiB0aHJlYWQgdGhhdCB0aGVuIGxvYWRzIHRoZW0gaW50bworICAgICAqIExpc3RWaWV3CisgICAgICovCisgICAgcHJpdmF0ZSBjbGFzcyBMb2FkTGlzdEl0ZW1zVGhyZWFkIGV4dGVuZHMgVGhyZWFkIHsKKyAgICAgICAgcHJpdmF0ZSBIYW5kbGVyIG1IYW5kbGVyOworICAgICAgICBwcml2YXRlIFN0cmluZyBtUmVsYXRpdmVQYXRoOworCisgICAgICAgIHB1YmxpYyBMb2FkTGlzdEl0ZW1zVGhyZWFkKFN0cmluZyByZWxhdGl2ZVBhdGgsIEhhbmRsZXIgaGFuZGxlcikgeworICAgICAgICAgICAgbVJlbGF0aXZlUGF0aCA9IHJlbGF0aXZlUGF0aDsKKyAgICAgICAgICAgIG1IYW5kbGVyID0gaGFuZGxlcjsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICBNZXNzYWdlIG1zZyA9IG1IYW5kbGVyLm9idGFpbk1lc3NhZ2UoTVNHX0xPQURFRF9JVEVNUyk7CisgICAgICAgICAgICBtc2cub2JqID0gZ2V0RGlyTGlzdChtUmVsYXRpdmVQYXRoKTsKKyAgICAgICAgICAgIG1IYW5kbGVyLnNlbmRNZXNzYWdlKG1zZyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBWZXJ5IHNpbXBsZSBvYmplY3QgdG8gdXNlIGluc2lkZSBMaXN0VmlldyBhcyBhbiBpdGVtLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIExpc3RJdGVtIGltcGxlbWVudHMgQ29tcGFyYWJsZTxMaXN0SXRlbT4geworICAgICAgICBwcml2YXRlIFN0cmluZyBtUmVsYXRpdmVQYXRoOworICAgICAgICBwcml2YXRlIFN0cmluZyBtTmFtZTsKKyAgICAgICAgcHJpdmF0ZSBib29sZWFuIG1Jc0RpcmVjdG9yeTsKKworICAgICAgICBwdWJsaWMgTGlzdEl0ZW0oU3RyaW5nIHJlbGF0aXZlUGF0aCwgYm9vbGVhbiBpc0RpcmVjdG9yeSkgeworICAgICAgICAgICAgbVJlbGF0aXZlUGF0aCA9IHJlbGF0aXZlUGF0aDsKKyAgICAgICAgICAgIG1OYW1lID0gbmV3IEZpbGUocmVsYXRpdmVQYXRoKS5nZXROYW1lKCk7CisgICAgICAgICAgICBtSXNEaXJlY3RvcnkgPSBpc0RpcmVjdG9yeTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBib29sZWFuIGlzRGlyZWN0b3J5KCkgeworICAgICAgICAgICAgcmV0dXJuIG1Jc0RpcmVjdG9yeTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0UmVsYXRpdmVQYXRoKCkgeworICAgICAgICAgICAgcmV0dXJuIG1SZWxhdGl2ZVBhdGg7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CisgICAgICAgICAgICByZXR1cm4gbU5hbWU7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGludCBjb21wYXJlVG8oTGlzdEl0ZW0gYW5vdGhlcikgeworICAgICAgICAgICAgcmV0dXJuIG1SZWxhdGl2ZVBhdGguY29tcGFyZVRvKGFub3RoZXIuZ2V0UmVsYXRpdmVQYXRoKCkpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgbykgeworICAgICAgICAgICAgaWYgKCEobyBpbnN0YW5jZW9mIExpc3RJdGVtKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIG1SZWxhdGl2ZVBhdGguZXF1YWxzKCgoTGlzdEl0ZW0pbykuZ2V0UmVsYXRpdmVQYXRoKCkpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7CisgICAgICAgICAgICByZXR1cm4gbVJlbGF0aXZlUGF0aC5oYXNoQ29kZSgpOworICAgICAgICB9CisKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBIGN1c3RvbSBhZGFwdGVyIHRoYXQgc2V0cyB0aGUgcHJvcGVyIGljb24gYW5kIGxhYmVsIGluIHRoZSBsaXN0IHZpZXcuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgRGlyTGlzdEFkYXB0ZXIgZXh0ZW5kcyBBcnJheUFkYXB0ZXI8TGlzdEl0ZW0+IHsKKyAgICAgICAgcHJpdmF0ZSBBY3Rpdml0eSBtQ29udGV4dDsKKyAgICAgICAgcHJpdmF0ZSBMaXN0SXRlbVtdIG1JdGVtczsKKworICAgICAgICBwdWJsaWMgRGlyTGlzdEFkYXB0ZXIoQWN0aXZpdHkgY29udGV4dCwgTGlzdEl0ZW1bXSBpdGVtcykgeworICAgICAgICAgICAgc3VwZXIoY29udGV4dCwgUi5sYXlvdXQuZGlybGlzdF9yb3csIGl0ZW1zKTsKKworICAgICAgICAgICAgbUNvbnRleHQgPSBjb250ZXh0OworICAgICAgICAgICAgbUl0ZW1zID0gaXRlbXM7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFZpZXcgZ2V0VmlldyhpbnQgcG9zaXRpb24sIFZpZXcgY29udmVydFZpZXcsIFZpZXdHcm91cCBwYXJlbnQpIHsKKyAgICAgICAgICAgIExheW91dEluZmxhdGVyIGluZmxhdGVyID0gbUNvbnRleHQuZ2V0TGF5b3V0SW5mbGF0ZXIoKTsKKyAgICAgICAgICAgIFZpZXcgcm93ID0gaW5mbGF0ZXIuaW5mbGF0ZShSLmxheW91dC5kaXJsaXN0X3JvdywgbnVsbCk7CisKKyAgICAgICAgICAgIFRleHRWaWV3IGxhYmVsID0gKFRleHRWaWV3KXJvdy5maW5kVmlld0J5SWQoUi5pZC5sYWJlbCk7CisgICAgICAgICAgICBsYWJlbC5zZXRUZXh0KG1JdGVtc1twb3NpdGlvbl0uZ2V0TmFtZSgpKTsKKworICAgICAgICAgICAgSW1hZ2VWaWV3IGljb24gPSAoSW1hZ2VWaWV3KXJvdy5maW5kVmlld0J5SWQoUi5pZC5pY29uKTsKKyAgICAgICAgICAgIGlmIChtSXRlbXNbcG9zaXRpb25dLmlzRGlyZWN0b3J5KCkpIHsKKyAgICAgICAgICAgICAgICBpY29uLnNldEltYWdlUmVzb3VyY2UoUi5kcmF3YWJsZS5mb2xkZXIpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpY29uLnNldEltYWdlUmVzb3VyY2UoUi5kcmF3YWJsZS5ydW50ZXN0KTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIHJvdzsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG9uQ3JlYXRlKEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpIHsKKyAgICAgICAgc3VwZXIub25DcmVhdGUoc2F2ZWRJbnN0YW5jZVN0YXRlKTsKKworICAgICAgICBGb3J3YXJkZXJNYW5hZ2VyLmdldEZvcndhcmRlck1hbmFnZXIoKS5zdGFydCgpOworCisgICAgICAgIG1MaXN0VmlldyA9IGdldExpc3RWaWV3KCk7CisKKyAgICAgICAgbUxpc3RWaWV3LnNldE9uSXRlbUNsaWNrTGlzdGVuZXIobmV3IEFkYXB0ZXJWaWV3Lk9uSXRlbUNsaWNrTGlzdGVuZXIoKSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uSXRlbUNsaWNrKEFkYXB0ZXJWaWV3PD8+IHBhcmVudCwgVmlldyB2aWV3LCBpbnQgcG9zaXRpb24sIGxvbmcgaWQpIHsKKyAgICAgICAgICAgICAgICBMaXN0SXRlbSBpdGVtID0gKExpc3RJdGVtKXBhcmVudC5nZXRJdGVtQXRQb3NpdGlvbihwb3NpdGlvbik7CisKKyAgICAgICAgICAgICAgICBpZiAoaXRlbS5pc0RpcmVjdG9yeSgpKSB7CisgICAgICAgICAgICAgICAgICAgIHNob3dEaXIoaXRlbS5nZXRSZWxhdGl2ZVBhdGgoKSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgLyoqIFJ1biB0aGUgdGVzdCAqLworICAgICAgICAgICAgICAgICAgICBydW5BbGxUZXN0c1VuZGVyKGl0ZW0uZ2V0UmVsYXRpdmVQYXRoKCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisKKyAgICAgICAgbUxpc3RWaWV3LnNldE9uSXRlbUxvbmdDbGlja0xpc3RlbmVyKG5ldyBBZGFwdGVyVmlldy5Pbkl0ZW1Mb25nQ2xpY2tMaXN0ZW5lcigpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gb25JdGVtTG9uZ0NsaWNrKEFkYXB0ZXJWaWV3PD8+IHBhcmVudCwgVmlldyB2aWV3LCBpbnQgcG9zaXRpb24sIGxvbmcgaWQpIHsKKyAgICAgICAgICAgICAgICBMaXN0SXRlbSBpdGVtID0gKExpc3RJdGVtKXBhcmVudC5nZXRJdGVtQXRQb3NpdGlvbihwb3NpdGlvbik7CisKKyAgICAgICAgICAgICAgICBpZiAoaXRlbS5pc0RpcmVjdG9yeSgpKSB7CisgICAgICAgICAgICAgICAgICAgIEJ1bmRsZSBhcmd1bWVudHMgPSBuZXcgQnVuZGxlKDEpOworICAgICAgICAgICAgICAgICAgICBhcmd1bWVudHMucHV0U3RyaW5nKCJuYW1lIiwgaXRlbS5nZXROYW1lKCkpOworICAgICAgICAgICAgICAgICAgICBhcmd1bWVudHMucHV0U3RyaW5nKCJyZWxhdGl2ZVBhdGgiLCBpdGVtLmdldFJlbGF0aXZlUGF0aCgpKTsKKyAgICAgICAgICAgICAgICAgICAgc2hvd0RpYWxvZyhESUFMT0dfUlVOX0FCT1JUX0RJUiwgYXJndW1lbnRzKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAvKiogVE9ETzogTWF5YmUgc2hvdyBzb21lIGluZm8gYWJvdXQgYSB0ZXN0PyAqLworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9KTsKKworICAgICAgICAvKiogQWxsIHRoZSBwYXRocyBhcmUgcmVsYXRpdmUgdG8gdGVzdCByb290IGRpciB3aGVyZSBwb3NzaWJsZSAqLworICAgICAgICBzaG93RGlyKCIiKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgcnVuQWxsVGVzdHNVbmRlcihTdHJpbmcgcmVsYXRpdmVQYXRoKSB7CisgICAgICAgIEludGVudCBpbnRlbnQgPSBuZXcgSW50ZW50KCk7CisgICAgICAgIGludGVudC5zZXRDbGFzcyhEaXJMaXN0QWN0aXZpdHkudGhpcywgVGVzdHNMaXN0QWN0aXZpdHkuY2xhc3MpOworICAgICAgICBpbnRlbnQuc2V0QWN0aW9uKEludGVudC5BQ1RJT05fUlVOKTsKKyAgICAgICAgaW50ZW50LnB1dEV4dHJhKFRlc3RzTGlzdEFjdGl2aXR5LkVYVFJBX1RFU1RfUEFUSCwgcmVsYXRpdmVQYXRoKTsKKyAgICAgICAgc3RhcnRBY3Rpdml0eShpbnRlbnQpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIG9uQ3JlYXRlT3B0aW9uc01lbnUoTWVudSBtZW51KSB7CisgICAgICAgIE1lbnVJbmZsYXRlciBpbmZsYXRlciA9IGdldE1lbnVJbmZsYXRlcigpOworICAgICAgICBpbmZsYXRlci5pbmZsYXRlKFIubWVudS5ndWlfbWVudSwgbWVudSk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIG9uT3B0aW9uc0l0ZW1TZWxlY3RlZChNZW51SXRlbSBpdGVtKSB7CisgICAgICAgIHN3aXRjaCAoaXRlbS5nZXRJdGVtSWQoKSkgeworICAgICAgICAgICAgY2FzZSBSLmlkLnJ1bl9hbGw6CisgICAgICAgICAgICAgICAgcnVuQWxsVGVzdHNVbmRlcihtQ3VycmVudERpclBhdGgpOworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICByZXR1cm4gc3VwZXIub25PcHRpb25zSXRlbVNlbGVjdGVkKGl0ZW0pOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgLyoqCisgICAgICogTW92ZXMgdG8gdGhlIHBhcmVudCBkaXJlY3RvcnkgaWYgb25lIGV4aXN0cy4gRG9lcyBub3QgYWxsb3cgdG8gbW92ZSBhYm92ZQorICAgICAqIHRoZSB0ZXN0ICdyb290JyBkaXJlY3RvcnkuCisgICAgICovCisgICAgcHVibGljIHZvaWQgb25CYWNrUHJlc3NlZCgpIHsKKyAgICAgICAgRmlsZSBjdXJyZW50RGlyUGFyZW50ID0gbmV3IEZpbGUobUN1cnJlbnREaXJQYXRoKS5nZXRQYXJlbnRGaWxlKCk7CisgICAgICAgIGlmIChjdXJyZW50RGlyUGFyZW50ICE9IG51bGwpIHsKKyAgICAgICAgICAgIHNob3dEaXIoY3VycmVudERpclBhcmVudC5nZXRQYXRoKCkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc2hvd0RpcigiIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQcmV2ZW50cyB0aGUgYWN0aXZpdHkgZnJvbSByZWNyZWF0aW5nIG9uIGNoYW5nZSBvZiBvcmllbnRhdGlvbi4gVGhlIHRpdGxlIG5lZWRzIHRvCisgICAgICogYmUgcmVjYWxjdWxhdGVkLgorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9uQ29uZmlndXJhdGlvbkNoYW5nZWQoQ29uZmlndXJhdGlvbiBuZXdDb25maWcpIHsKKyAgICAgICAgc3VwZXIub25Db25maWd1cmF0aW9uQ2hhbmdlZChuZXdDb25maWcpOworCisgICAgICAgIHNldFRpdGxlKHNob3J0ZW5UaXRsZShtQ3VycmVudERpclBhdGgpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgRGlhbG9nIG9uQ3JlYXRlRGlhbG9nKGludCBpZCwgZmluYWwgQnVuZGxlIGFyZ3MpIHsKKyAgICAgICAgRGlhbG9nIGRpYWxvZyA9IG51bGw7CisgICAgICAgIEFsZXJ0RGlhbG9nLkJ1aWxkZXIgYnVpbGRlciA9IG5ldyBBbGVydERpYWxvZy5CdWlsZGVyKHRoaXMpOworCisgICAgICAgIHN3aXRjaCAoaWQpIHsKKyAgICAgICAgICAgIGNhc2UgRElBTE9HX1JVTl9BQk9SVF9ESVI6CisgICAgICAgICAgICAgICAgYnVpbGRlci5zZXRUaXRsZShnZXRUZXh0KFIuc3RyaW5nLmRpYWxvZ19ydW5fYWJvcnRfZGlyX3RpdGxlX3ByZWZpeCkgKyAiICIgKworICAgICAgICAgICAgICAgICAgICAgICAgYXJncy5nZXRTdHJpbmcoIm5hbWUiKSk7CisgICAgICAgICAgICAgICAgYnVpbGRlci5zZXRNZXNzYWdlKFIuc3RyaW5nLmRpYWxvZ19ydW5fYWJvcnRfZGlyX21zZyk7CisgICAgICAgICAgICAgICAgYnVpbGRlci5zZXRDYW5jZWxhYmxlKHRydWUpOworCisgICAgICAgICAgICAgICAgYnVpbGRlci5zZXRQb3NpdGl2ZUJ1dHRvbihSLnN0cmluZy5kaWFsb2dfcnVuX2Fib3J0X2Rpcl9va19idXR0b24sCisgICAgICAgICAgICAgICAgICAgICAgICBuZXcgRGlhbG9nSW50ZXJmYWNlLk9uQ2xpY2tMaXN0ZW5lcigpIHsKKyAgICAgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uQ2xpY2soRGlhbG9nSW50ZXJmYWNlIGRpYWxvZywgaW50IHdoaWNoKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZW1vdmVEaWFsb2coRElBTE9HX1JVTl9BQk9SVF9ESVIpOworICAgICAgICAgICAgICAgICAgICAgICAgcnVuQWxsVGVzdHNVbmRlcihhcmdzLmdldFN0cmluZygicmVsYXRpdmVQYXRoIikpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSk7CisKKyAgICAgICAgICAgICAgICBidWlsZGVyLnNldE5lZ2F0aXZlQnV0dG9uKFIuc3RyaW5nLmRpYWxvZ19ydW5fYWJvcnRfZGlyX2Fib3J0X2J1dHRvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBEaWFsb2dJbnRlcmZhY2UuT25DbGlja0xpc3RlbmVyKCkgeworICAgICAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgb25DbGljayhEaWFsb2dJbnRlcmZhY2UgZGlhbG9nLCBpbnQgd2hpY2gpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlbW92ZURpYWxvZyhESUFMT0dfUlVOX0FCT1JUX0RJUik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9KTsKKworICAgICAgICAgICAgICAgIGRpYWxvZyA9IGJ1aWxkZXIuY3JlYXRlKCk7CisgICAgICAgICAgICAgICAgZGlhbG9nLnNldE9uQ2FuY2VsTGlzdGVuZXIobmV3IERpYWxvZ0ludGVyZmFjZS5PbkNhbmNlbExpc3RlbmVyKCkgeworICAgICAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgb25DYW5jZWwoRGlhbG9nSW50ZXJmYWNlIGRpYWxvZykgeworICAgICAgICAgICAgICAgICAgICAgICAgcmVtb3ZlRGlhbG9nKERJQUxPR19SVU5fQUJPUlRfRElSKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGRpYWxvZzsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBMb2FkcyB0aGUgY29udGVudHMgb2YgZGlyIGludG8gdGhlIGxpc3Qgdmlldy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBkaXJQYXRoCisgICAgICogICAgICBkaXJlY3RvcnkgdG8gbG9hZCBpbnRvIGxpc3QgdmlldworICAgICAqLworICAgIHByaXZhdGUgdm9pZCBzaG93RGlyKFN0cmluZyBkaXJQYXRoKSB7CisgICAgICAgIG1DdXJyZW50RGlyUGF0aCA9IGRpclBhdGg7CisKKyAgICAgICAgLyoqIFNob3cgcHJvZ3Jlc3MgZGlhbG9nIHdpdGggYSBkZWxheSAqLworICAgICAgICBmaW5hbCBIYW5kbGVyIGRlbGF5ZWREaWFsb2dIYW5kbGVyID0gbmV3IEhhbmRsZXIoKSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIGhhbmRsZU1lc3NhZ2UoTWVzc2FnZSBtc2cpIHsKKyAgICAgICAgICAgICAgICBpZiAobXNnLndoYXQgPT0gTVNHX1NIT1dfUFJPR1JFU1NfRElBTE9HKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChzUHJvZ3Jlc3NEaWFsb2cgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgc1Byb2dyZXNzRGlhbG9nID0gbmV3IFByb2dyZXNzRGlhbG9nKERpckxpc3RBY3Rpdml0eS50aGlzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNQcm9ncmVzc0RpYWxvZy5zZXRDYW5jZWxhYmxlKGZhbHNlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNQcm9ncmVzc0RpYWxvZy5zZXRQcm9ncmVzc1N0eWxlKFByb2dyZXNzRGlhbG9nLlNUWUxFX1NQSU5ORVIpOworICAgICAgICAgICAgICAgICAgICAgICAgc1Byb2dyZXNzRGlhbG9nLnNldFRpdGxlKFIuc3RyaW5nLmRpYWxvZ19wcm9ncmVzc190aXRsZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBzUHJvZ3Jlc3NEaWFsb2cuc2V0TWVzc2FnZShnZXRUZXh0KFIuc3RyaW5nLmRpYWxvZ19wcm9ncmVzc19tc2cpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBzUHJvZ3Jlc3NEaWFsb2cuc2hvdygpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKyAgICAgICAgTWVzc2FnZSBtc2dTaG93RGlhbG9nID0gZGVsYXllZERpYWxvZ0hhbmRsZXIub2J0YWluTWVzc2FnZShNU0dfU0hPV19QUk9HUkVTU19ESUFMT0cpOworICAgICAgICBkZWxheWVkRGlhbG9nSGFuZGxlci5zZW5kTWVzc2FnZURlbGF5ZWQobXNnU2hvd0RpYWxvZywgUFJPR1JFU1NfRElBTE9HX0RFTEFZX01TKTsKKworICAgICAgICAvKiogRGVsZWdhdGUgbG9hZGluZyBjb250ZW50cyBmcm9tIFNEIGNhcmQgdG8gYSBuZXcgdGhyZWFkICovCisgICAgICAgIG5ldyBMb2FkTGlzdEl0ZW1zVGhyZWFkKG1DdXJyZW50RGlyUGF0aCwgbmV3IEhhbmRsZXIoKSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIGhhbmRsZU1lc3NhZ2UoTWVzc2FnZSBtc2cpIHsKKyAgICAgICAgICAgICAgICBpZiAobXNnLndoYXQgPT0gTVNHX0xPQURFRF9JVEVNUykgeworICAgICAgICAgICAgICAgICAgICBzZXRMaXN0QWRhcHRlcihuZXcgRGlyTGlzdEFkYXB0ZXIoRGlyTGlzdEFjdGl2aXR5LnRoaXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExpc3RJdGVtW10pbXNnLm9iaikpOworICAgICAgICAgICAgICAgICAgICBkZWxheWVkRGlhbG9nSGFuZGxlci5yZW1vdmVNZXNzYWdlcyhNU0dfU0hPV19QUk9HUkVTU19ESUFMT0cpOworICAgICAgICAgICAgICAgICAgICBzZXRUaXRsZShzaG9ydGVuVGl0bGUobUN1cnJlbnREaXJQYXRoKSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChzUHJvZ3Jlc3NEaWFsb2cgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgc1Byb2dyZXNzRGlhbG9nLmRpc21pc3MoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSkuc3RhcnQoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUT0RPOiBmaW5kIGEgbmVhdCB3YXkgdG8gZGV0ZXJtaW5lIG51bWJlciBvZiBjaGFyYWN0ZXJzIHRoYXQgZml0IGluIHRoZSB0aXRsZQorICAgICAqIGJhci4KKyAgICAgKiAqLworICAgIHByaXZhdGUgU3RyaW5nIHNob3J0ZW5UaXRsZShTdHJpbmcgdGl0bGUpIHsKKyAgICAgICAgaWYgKHRpdGxlLmVxdWFscygiIikpIHsKKyAgICAgICAgICAgIHJldHVybiAiVGVzdHMnIHJvb3QgZGlyOiI7CisgICAgICAgIH0KKyAgICAgICAgaW50IGNoYXJDb3VudCA9IG1MaXN0Vmlldy5nZXRXaWR0aCgpIC8gTUVBTl9USVRMRV9DSEFSX1NJWkU7CisKKyAgICAgICAgaWYgKHRpdGxlLmxlbmd0aCgpID4gY2hhckNvdW50KSB7CisgICAgICAgICAgICByZXR1cm4gIi4uLiIgKyB0aXRsZS5zdWJzdHJpbmcodGl0bGUubGVuZ3RoKCkgLSBjaGFyQ291bnQpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIHRpdGxlOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBhcnJheSB3aXRoIGNvbnRlbnRzIG9mIHRoZSBnaXZlbiBkaXJlY3RvcnkuCisgICAgICogRmlyc3QgaXQgY29udGFpbnMgdGhlIHN1YmZvbGRlcnMsIHRoZW4gdGhlIGZpbGVzLiBCb3RoIHNvcnRlZAorICAgICAqIGFscGhhYmV0aWNhbGx5LgorICAgICAqCisgICAgICogVGhlIGRpclBhdGggaXMgcmVsYXRpdmUuCisgICAgICovCisgICAgcHJpdmF0ZSBMaXN0SXRlbVtdIGdldERpckxpc3QoU3RyaW5nIGRpclBhdGgpIHsKKyAgICAgICAgTGlzdDxMaXN0SXRlbT4gc3ViRGlycyA9IG5ldyBBcnJheUxpc3Q8TGlzdEl0ZW0+KCk7CisgICAgICAgIExpc3Q8TGlzdEl0ZW0+IHN1YkZpbGVzID0gbmV3IEFycmF5TGlzdDxMaXN0SXRlbT4oKTsKKworICAgICAgICBmb3IgKFN0cmluZyBkaXJSZWxhdGl2ZVBhdGggOiBGc1V0aWxzLmdldExheW91dFRlc3RzRGlyQ29udGVudHMoZGlyUGF0aCwgZmFsc2UsCisgICAgICAgICAgICAgICAgdHJ1ZSkpIHsKKyAgICAgICAgICAgIGlmIChGaWxlRmlsdGVyLmlzVGVzdERpcihuZXcgRmlsZShkaXJSZWxhdGl2ZVBhdGgpLmdldE5hbWUoKSkpIHsKKyAgICAgICAgICAgICAgICBzdWJEaXJzLmFkZChuZXcgTGlzdEl0ZW0oZGlyUmVsYXRpdmVQYXRoLCB0cnVlKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBmb3IgKFN0cmluZyB0ZXN0UmVsYXRpdmVQYXRoIDogRnNVdGlscy5nZXRMYXlvdXRUZXN0c0RpckNvbnRlbnRzKGRpclBhdGgsIGZhbHNlLAorICAgICAgICAgICAgICAgIGZhbHNlKSkgeworICAgICAgICAgICAgaWYgKEZpbGVGaWx0ZXIuaXNUZXN0RmlsZShuZXcgRmlsZSh0ZXN0UmVsYXRpdmVQYXRoKS5nZXROYW1lKCkpKSB7CisgICAgICAgICAgICAgICAgc3ViRmlsZXMuYWRkKG5ldyBMaXN0SXRlbSh0ZXN0UmVsYXRpdmVQYXRoLCBmYWxzZSkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyoqIENvbmNhdGVuYXRlIHRoZSB0d28gbGlzdHMgKi8KKyAgICAgICAgc3ViRGlycy5hZGRBbGwoc3ViRmlsZXMpOworCisgICAgICAgIHJldHVybiBzdWJEaXJzLnRvQXJyYXkobmV3IExpc3RJdGVtW3N1YkRpcnMuc2l6ZSgpXSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvSHdBY2NlbGVyYXRpb25UZXN0L0FuZHJvaWQubWsgYi90ZXN0cy9Id0FjY2VsZXJhdGlvblRlc3QvQW5kcm9pZC5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNDc0M2Y5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvSHdBY2NlbGVyYXRpb25UZXN0L0FuZHJvaWQubWsKQEAgLTAsMCArMSwyNiBAQAorIworIyBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKKworTE9DQUxfU1JDX0ZJTEVTIDo9ICQoY2FsbCBhbGwtc3ViZGlyLWphdmEtZmlsZXMpCisKK0xPQ0FMX1BBQ0tBR0VfTkFNRSA6PSBId0FjY2VsZXJhdGlvblRlc3QKKworTE9DQUxfTU9EVUxFX1RBR1MgOj0gdGVzdHMKKworaW5jbHVkZSAkKEJVSUxEX1BBQ0tBR0UpCmRpZmYgLS1naXQgYS90ZXN0cy9Id0FjY2VsZXJhdGlvblRlc3QvQW5kcm9pZE1hbmlmZXN0LnhtbCBiL3Rlc3RzL0h3QWNjZWxlcmF0aW9uVGVzdC9BbmRyb2lkTWFuaWZlc3QueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU1OTc0MTUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9Id0FjY2VsZXJhdGlvblRlc3QvQW5kcm9pZE1hbmlmZXN0LnhtbApAQCAtMCwwICsxLDI4MCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAgCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgIAorICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzxtYW5pZmVzdCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgcGFja2FnZT0iY29tLmFuZHJvaWQudGVzdC5od3VpIj4KKworICAgIDxhcHBsaWNhdGlvbgorICAgICAgICBhbmRyb2lkOmxhYmVsPSJId1VpIgorICAgICAgICBhbmRyb2lkOmhhcmR3YXJlQWNjZWxlcmF0ZWQ9InRydWUiPgorCisgICAgICAgIDxhY3Rpdml0eQorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bmFtZT0iQWxwaGFMYXllcnNBY3Rpdml0eSIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxhYmVsPSJfzrFMYXllcnMiPgorICAgICAgICAgICAgPGludGVudC1maWx0ZXI+CisgICAgICAgICAgICAgICAgPGFjdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmFjdGlvbi5NQUlOIiAvPgorICAgICAgICAgICAgICAgIDxjYXRlZ29yeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmNhdGVnb3J5LkxBVU5DSEVSIiAvPgorICAgICAgICAgICAgPC9pbnRlbnQtZmlsdGVyPgorICAgICAgICA8L2FjdGl2aXR5PgorICAgICAgICAKKyAgICAgICAgPGFjdGl2aXR5CisgICAgICAgICAgICAgICAgYW5kcm9pZDpuYW1lPSJSZXNpemVBY3Rpdml0eSIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxhYmVsPSJfUmVzaXplIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6d2luZG93U29mdElucHV0TW9kZT0iYWRqdXN0UmVzaXplIj4KKyAgICAgICAgICAgIDxpbnRlbnQtZmlsdGVyPgorICAgICAgICAgICAgICAgIDxhY3Rpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5hY3Rpb24uTUFJTiIgLz4KKyAgICAgICAgICAgICAgICA8Y2F0ZWdvcnkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5jYXRlZ29yeS5MQVVOQ0hFUiIgLz4KKyAgICAgICAgICAgIDwvaW50ZW50LWZpbHRlcj4KKyAgICAgICAgPC9hY3Rpdml0eT4KKyAgICAgICAgCisgICAgICAgIDxhY3Rpdml0eQorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bmFtZT0iVGV4dEdhbW1hQWN0aXZpdHkiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYWJlbD0iX0dhbW1hIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGhlbWU9IkBhbmRyb2lkOnN0eWxlL1RoZW1lLlRyYW5zbHVjZW50Lk5vVGl0bGVCYXIiPgorICAgICAgICAgICAgPGludGVudC1maWx0ZXI+CisgICAgICAgICAgICAgICAgPGFjdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmFjdGlvbi5NQUlOIiAvPgorICAgICAgICAgICAgICAgIDxjYXRlZ29yeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmNhdGVnb3J5LkxBVU5DSEVSIiAvPgorICAgICAgICAgICAgPC9pbnRlbnQtZmlsdGVyPgorICAgICAgICA8L2FjdGl2aXR5PgorCisgICAgICAgICAgICA8YWN0aXZpdHkKKyAgICAgICAgICAgICAgICBhbmRyb2lkOm5hbWU9IlRleHRHYW1tYUFjdGl2aXR5JFN1YkdhbW1hQWN0aXZpdHkiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYWJlbD0iX1N1YiBHYW1tYSIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOnRoZW1lPSJAYW5kcm9pZDpzdHlsZS9UaGVtZS5UcmFuc2x1Y2VudC5Ob1RpdGxlQmFyIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6aGFyZHdhcmVBY2NlbGVyYXRlZD0iZmFsc2UiPgorICAgICAgICAgICAgPGludGVudC1maWx0ZXI+CisgICAgICAgICAgICAgICAgPGFjdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmFjdGlvbi5NQUlOIiAvPgorICAgICAgICAgICAgPC9pbnRlbnQtZmlsdGVyPgorICAgICAgICA8L2FjdGl2aXR5PgorICAgICAgICAKKyAgICAgICAgPGFjdGl2aXR5CisgICAgICAgICAgICAgICAgYW5kcm9pZDpuYW1lPSJMYXllcnNBY3Rpdml0eSIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxhYmVsPSJfTGF5ZXJzIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGhlbWU9IkBhbmRyb2lkOnN0eWxlL1RoZW1lLlRyYW5zbHVjZW50Lk5vVGl0bGVCYXIiPgorICAgICAgICAgICAgPGludGVudC1maWx0ZXI+CisgICAgICAgICAgICAgICAgPGFjdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmFjdGlvbi5NQUlOIiAvPgorICAgICAgICAgICAgICAgIDxjYXRlZ29yeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmNhdGVnb3J5LkxBVU5DSEVSIiAvPgorICAgICAgICAgICAgPC9pbnRlbnQtZmlsdGVyPgorICAgICAgICA8L2FjdGl2aXR5PgorCisgICAgICAgIDxhY3Rpdml0eQorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bmFtZT0iTmV3TGF5ZXJzQWN0aXZpdHkiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYWJlbD0iX05ld0xheWVycyI+CisgICAgICAgICAgICA8aW50ZW50LWZpbHRlcj4KKyAgICAgICAgICAgICAgICA8YWN0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuYWN0aW9uLk1BSU4iIC8+CisgICAgICAgICAgICAgICAgPGNhdGVnb3J5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuY2F0ZWdvcnkuTEFVTkNIRVIiIC8+CisgICAgICAgICAgICA8L2ludGVudC1maWx0ZXI+CisgICAgICAgIDwvYWN0aXZpdHk+CisgICAgICAgIAorICAgICAgICA8YWN0aXZpdHkKKyAgICAgICAgICAgICAgICBhbmRyb2lkOm5hbWU9IlhmZXJtb2RlQWN0aXZpdHkiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYWJlbD0iX1hmZXJtb2RlcyIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOnRoZW1lPSJAYW5kcm9pZDpzdHlsZS9UaGVtZS5UcmFuc2x1Y2VudC5Ob1RpdGxlQmFyIj4KKyAgICAgICAgICAgIDxpbnRlbnQtZmlsdGVyPgorICAgICAgICAgICAgICAgIDxhY3Rpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5hY3Rpb24uTUFJTiIgLz4KKyAgICAgICAgICAgICAgICA8Y2F0ZWdvcnkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5jYXRlZ29yeS5MQVVOQ0hFUiIgLz4KKyAgICAgICAgICAgIDwvaW50ZW50LWZpbHRlcj4KKyAgICAgICAgPC9hY3Rpdml0eT4KKyAgICAgICAgCisgICAgICAgIDxhY3Rpdml0eQorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bmFtZT0iQml0bWFwc0FjdGl2aXR5IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGFiZWw9Il9CaXRtYXBzIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGhlbWU9IkBhbmRyb2lkOnN0eWxlL1RoZW1lLlRyYW5zbHVjZW50Lk5vVGl0bGVCYXIiPgorICAgICAgICAgICAgPGludGVudC1maWx0ZXI+CisgICAgICAgICAgICAgICAgPGFjdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmFjdGlvbi5NQUlOIiAvPgorICAgICAgICAgICAgICAgIDxjYXRlZ29yeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmNhdGVnb3J5LkxBVU5DSEVSIiAvPgorICAgICAgICAgICAgPC9pbnRlbnQtZmlsdGVyPgorICAgICAgICA8L2FjdGl2aXR5PgorCisgICAgICAgIDxhY3Rpdml0eQorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bmFtZT0iQml0bWFwc0FscGhhQWN0aXZpdHkiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYWJlbD0iX0JpdG1hcHNBbHBoYSIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOnRoZW1lPSJAYW5kcm9pZDpzdHlsZS9UaGVtZS5UcmFuc2x1Y2VudC5Ob1RpdGxlQmFyIj4KKyAgICAgICAgICAgIDxpbnRlbnQtZmlsdGVyPgorICAgICAgICAgICAgICAgIDxhY3Rpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5hY3Rpb24uTUFJTiIgLz4KKyAgICAgICAgICAgICAgICA8Y2F0ZWdvcnkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5jYXRlZ29yeS5MQVVOQ0hFUiIgLz4KKyAgICAgICAgICAgIDwvaW50ZW50LWZpbHRlcj4KKyAgICAgICAgPC9hY3Rpdml0eT4KKyAgICAgICAgCisgICAgICAgIDxhY3Rpdml0eQorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bmFtZT0iQml0bWFwc1JlY3RBY3Rpdml0eSIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxhYmVsPSJfQml0bWFwc1JlY3QiCisgICAgICAgICAgICAgICAgYW5kcm9pZDp0aGVtZT0iQGFuZHJvaWQ6c3R5bGUvVGhlbWUuVHJhbnNsdWNlbnQuTm9UaXRsZUJhciI+CisgICAgICAgICAgICA8aW50ZW50LWZpbHRlcj4KKyAgICAgICAgICAgICAgICA8YWN0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuYWN0aW9uLk1BSU4iIC8+CisgICAgICAgICAgICAgICAgPGNhdGVnb3J5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuY2F0ZWdvcnkuTEFVTkNIRVIiIC8+CisgICAgICAgICAgICA8L2ludGVudC1maWx0ZXI+CisgICAgICAgIDwvYWN0aXZpdHk+CisKKyAgICAgICAgPGFjdGl2aXR5CisgICAgICAgICAgICAgICAgYW5kcm9pZDpuYW1lPSJUaGluUGF0Y2hlc0FjdGl2aXR5IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGFiZWw9Il85cGF0Y2hUaGluIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGhlbWU9IkBhbmRyb2lkOnN0eWxlL1RoZW1lLlRyYW5zbHVjZW50Lk5vVGl0bGVCYXIiPgorICAgICAgICAgICAgPGludGVudC1maWx0ZXI+CisgICAgICAgICAgICAgICAgPGFjdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmFjdGlvbi5NQUlOIiAvPgorICAgICAgICAgICAgICAgIDxjYXRlZ29yeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmNhdGVnb3J5LkxBVU5DSEVSIiAvPgorICAgICAgICAgICAgPC9pbnRlbnQtZmlsdGVyPgorICAgICAgICA8L2FjdGl2aXR5PgorICAgICAgICAKKyAgICAgICAgPGFjdGl2aXR5CisgICAgICAgICAgICAgICAgYW5kcm9pZDpuYW1lPSJOaW5lUGF0Y2hlc0FjdGl2aXR5IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGFiZWw9Il85cGF0Y2giPgorICAgICAgICAgICAgPGludGVudC1maWx0ZXI+CisgICAgICAgICAgICAgICAgPGFjdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmFjdGlvbi5NQUlOIiAvPgorICAgICAgICAgICAgICAgIDxjYXRlZ29yeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmNhdGVnb3J5LkxBVU5DSEVSIiAvPgorICAgICAgICAgICAgPC9pbnRlbnQtZmlsdGVyPgorICAgICAgICA8L2FjdGl2aXR5PgorICAgICAgICAKKyAgICAgICAgPGFjdGl2aXR5CisgICAgICAgICAgICAgICAgYW5kcm9pZDpuYW1lPSJRdWlja1JlamVjdEFjdGl2aXR5IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGFiZWw9Il9RdWlja1JlamVjdCI+CisgICAgICAgICAgICA8aW50ZW50LWZpbHRlcj4KKyAgICAgICAgICAgICAgICA8YWN0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuYWN0aW9uLk1BSU4iIC8+CisgICAgICAgICAgICAgICAgPGNhdGVnb3J5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuY2F0ZWdvcnkuTEFVTkNIRVIiIC8+CisgICAgICAgICAgICA8L2ludGVudC1maWx0ZXI+CisgICAgICAgIDwvYWN0aXZpdHk+CisgICAgICAgIAorICAgICAgICA8YWN0aXZpdHkKKyAgICAgICAgICAgICAgICBhbmRyb2lkOm5hbWU9IlJvdGF0aW9uQWN0aXZpdHkiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYWJlbD0iX1JvdGF0aW9uIj4KKyAgICAgICAgICAgIDxpbnRlbnQtZmlsdGVyPgorICAgICAgICAgICAgICAgIDxhY3Rpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5hY3Rpb24uTUFJTiIgLz4KKyAgICAgICAgICAgICAgICA8Y2F0ZWdvcnkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5jYXRlZ29yeS5MQVVOQ0hFUiIgLz4KKyAgICAgICAgICAgIDwvaW50ZW50LWZpbHRlcj4KKyAgICAgICAgPC9hY3Rpdml0eT4KKworICAgICAgICA8YWN0aXZpdHkKKyAgICAgICAgICAgICAgICBhbmRyb2lkOm5hbWU9IlNoYWRlcnNBY3Rpdml0eSIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxhYmVsPSJfU2hhZGVycyI+CisgICAgICAgICAgICA8aW50ZW50LWZpbHRlcj4KKyAgICAgICAgICAgICAgICA8YWN0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuYWN0aW9uLk1BSU4iIC8+CisgICAgICAgICAgICAgICAgPGNhdGVnb3J5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuY2F0ZWdvcnkuTEFVTkNIRVIiIC8+CisgICAgICAgICAgICA8L2ludGVudC1maWx0ZXI+CisgICAgICAgIDwvYWN0aXZpdHk+CisgICAgICAgIAorICAgICAgICA8YWN0aXZpdHkKKyAgICAgICAgICAgICAgICBhbmRyb2lkOm5hbWU9IlRleHRBY3Rpdml0eSIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxhYmVsPSJfVGV4dCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOnRoZW1lPSJAYW5kcm9pZDpzdHlsZS9UaGVtZS5Ob1RpdGxlQmFyIj4KKyAgICAgICAgICAgIDxpbnRlbnQtZmlsdGVyPgorICAgICAgICAgICAgICAgIDxhY3Rpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5hY3Rpb24uTUFJTiIgLz4KKyAgICAgICAgICAgICAgICA8Y2F0ZWdvcnkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5jYXRlZ29yeS5MQVVOQ0hFUiIgLz4KKyAgICAgICAgICAgIDwvaW50ZW50LWZpbHRlcj4KKyAgICAgICAgPC9hY3Rpdml0eT4KKworICAgICAgICA8YWN0aXZpdHkKKyAgICAgICAgICAgICAgICBhbmRyb2lkOm5hbWU9Ikxpc3RBY3Rpdml0eSIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxhYmVsPSJfTGlzdCI+CisgICAgICAgICAgICA8aW50ZW50LWZpbHRlcj4KKyAgICAgICAgICAgICAgICA8YWN0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuYWN0aW9uLk1BSU4iIC8+CisgICAgICAgICAgICAgICAgPGNhdGVnb3J5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuY2F0ZWdvcnkuTEFVTkNIRVIiIC8+CisgICAgICAgICAgICA8L2ludGVudC1maWx0ZXI+CisgICAgICAgIDwvYWN0aXZpdHk+CisKKyAgICAgICAgPGFjdGl2aXR5CisgICAgICAgICAgICAgICAgYW5kcm9pZDpuYW1lPSJUcmFuc3BhcmVudExpc3RBY3Rpdml0eSIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxhYmVsPSJfVHJhbnNwYXJlbnRMaXN0Ij4KKyAgICAgICAgICAgIDxpbnRlbnQtZmlsdGVyPgorICAgICAgICAgICAgICAgIDxhY3Rpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5hY3Rpb24uTUFJTiIgLz4KKyAgICAgICAgICAgICAgICA8Y2F0ZWdvcnkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5jYXRlZ29yeS5MQVVOQ0hFUiIgLz4KKyAgICAgICAgICAgIDwvaW50ZW50LWZpbHRlcj4KKyAgICAgICAgPC9hY3Rpdml0eT4KKyAgICAgICAgCisgICAgICAgIDxhY3Rpdml0eQorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bmFtZT0iTW9yZVNoYWRlcnNBY3Rpdml0eSIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxhYmVsPSJfU2hhZGVyczIiPgorICAgICAgICAgICAgPGludGVudC1maWx0ZXI+CisgICAgICAgICAgICAgICAgPGFjdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmFjdGlvbi5NQUlOIiAvPgorICAgICAgICAgICAgICAgIDxjYXRlZ29yeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmNhdGVnb3J5LkxBVU5DSEVSIiAvPgorICAgICAgICAgICAgPC9pbnRlbnQtZmlsdGVyPgorICAgICAgICA8L2FjdGl2aXR5PgorCisgICAgICAgIDxhY3Rpdml0eQorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bmFtZT0iQ29sb3JGaWx0ZXJzQWN0aXZpdHkiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYWJlbD0iX0NvbG9yRmlsdGVycyI+CisgICAgICAgICAgICA8aW50ZW50LWZpbHRlcj4KKyAgICAgICAgICAgICAgICA8YWN0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuYWN0aW9uLk1BSU4iIC8+CisgICAgICAgICAgICAgICAgPGNhdGVnb3J5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuY2F0ZWdvcnkuTEFVTkNIRVIiIC8+CisgICAgICAgICAgICA8L2ludGVudC1maWx0ZXI+CisgICAgICAgIDwvYWN0aXZpdHk+CisKKyAgICAgICAgPGFjdGl2aXR5CisgICAgICAgICAgICAgICAgYW5kcm9pZDpuYW1lPSJMaW5lc0FjdGl2aXR5IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGFiZWw9Il9MaW5lcyIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmhhcmR3YXJlQWNjZWxlcmF0ZWQ9ImZhbHNlIj4KKyAgICAgICAgICAgIDxpbnRlbnQtZmlsdGVyPgorICAgICAgICAgICAgICAgIDxhY3Rpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5hY3Rpb24uTUFJTiIgLz4KKyAgICAgICAgICAgICAgICA8Y2F0ZWdvcnkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5jYXRlZ29yeS5MQVVOQ0hFUiIgLz4KKyAgICAgICAgICAgIDwvaW50ZW50LWZpbHRlcj4KKyAgICAgICAgPC9hY3Rpdml0eT4KKworICAgICAgICA8YWN0aXZpdHkKKyAgICAgICAgICAgICAgICBhbmRyb2lkOm5hbWU9IlBhdGhzQWN0aXZpdHkiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYWJlbD0iX1BhdGhzIj4KKyAgICAgICAgICAgIDxpbnRlbnQtZmlsdGVyPgorICAgICAgICAgICAgICAgIDxhY3Rpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5hY3Rpb24uTUFJTiIgLz4KKyAgICAgICAgICAgICAgICA8Y2F0ZWdvcnkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5jYXRlZ29yeS5MQVVOQ0hFUiIgLz4KKyAgICAgICAgICAgIDwvaW50ZW50LWZpbHRlcj4KKyAgICAgICAgPC9hY3Rpdml0eT4KKworICAgICAgICA8YWN0aXZpdHkKKyAgICAgICAgICAgICAgICBhbmRyb2lkOm5hbWU9IlRyYW5zZm9ybTNkQWN0aXZpdHkiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYWJlbD0iXzNkIj4KKyAgICAgICAgICAgIDxpbnRlbnQtZmlsdGVyPgorICAgICAgICAgICAgICAgIDxhY3Rpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5hY3Rpb24uTUFJTiIgLz4KKyAgICAgICAgICAgICAgICA8Y2F0ZWdvcnkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5jYXRlZ29yeS5MQVVOQ0hFUiIgLz4KKyAgICAgICAgICAgIDwvaW50ZW50LWZpbHRlcj4KKyAgICAgICAgPC9hY3Rpdml0eT4KKworICAgICAgICA8YWN0aXZpdHkKKyAgICAgICAgICAgICAgICBhbmRyb2lkOm5hbWU9IlNpbXBsZVBhdGhzQWN0aXZpdHkiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYWJlbD0iX1NpbXBsZVBhdGhzIj4KKyAgICAgICAgICAgIDxpbnRlbnQtZmlsdGVyPgorICAgICAgICAgICAgICAgIDxhY3Rpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5hY3Rpb24uTUFJTiIgLz4KKyAgICAgICAgICAgICAgICA8Y2F0ZWdvcnkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5jYXRlZ29yeS5MQVVOQ0hFUiIgLz4KKyAgICAgICAgICAgIDwvaW50ZW50LWZpbHRlcj4KKyAgICAgICAgPC9hY3Rpdml0eT4KKworICAgICAgICA8YWN0aXZpdHkKKyAgICAgICAgICAgICAgICBhbmRyb2lkOm5hbWU9IkFkdmFuY2VkQmxlbmRBY3Rpdml0eSIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxhYmVsPSJfQWR2YW5jZWRCbGVuZCI+CisgICAgICAgICAgICA8aW50ZW50LWZpbHRlcj4KKyAgICAgICAgICAgICAgICA8YWN0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuYWN0aW9uLk1BSU4iIC8+CisgICAgICAgICAgICAgICAgPGNhdGVnb3J5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuY2F0ZWdvcnkuTEFVTkNIRVIiIC8+CisgICAgICAgICAgICA8L2ludGVudC1maWx0ZXI+CisgICAgICAgIDwvYWN0aXZpdHk+CisKKyAgICAgICAgPGFjdGl2aXR5CisgICAgICAgICAgICAgICAgYW5kcm9pZDpuYW1lPSJGcmFtZWJ1ZmZlckJsZW5kQWN0aXZpdHkiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYWJlbD0iX0ZyYW1lYnVmZmVyQmxlbmQiPgorICAgICAgICAgICAgPGludGVudC1maWx0ZXI+CisgICAgICAgICAgICAgICAgPGFjdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmFjdGlvbi5NQUlOIiAvPgorICAgICAgICAgICAgICAgIDxjYXRlZ29yeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmNhdGVnb3J5LkxBVU5DSEVSIiAvPgorICAgICAgICAgICAgPC9pbnRlbnQtZmlsdGVyPgorICAgICAgICA8L2FjdGl2aXR5PgorICAgICAgICAKKworICAgICAgICA8YWN0aXZpdHkKKyAgICAgICAgICAgICAgICBhbmRyb2lkOm5hbWU9IlN0YWNrQWN0aXZpdHkiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYWJlbD0iX1N0YWNrcyI+CisgICAgICAgICAgICA8aW50ZW50LWZpbHRlcj4KKyAgICAgICAgICAgICAgICA8YWN0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuYWN0aW9uLk1BSU4iIC8+CisgICAgICAgICAgICAgICAgPGNhdGVnb3J5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuY2F0ZWdvcnkuTEFVTkNIRVIiIC8+CisgICAgICAgICAgICA8L2ludGVudC1maWx0ZXI+CisgICAgICAgIDwvYWN0aXZpdHk+CisKKyAgICA8L2FwcGxpY2F0aW9uPgorPC9tYW5pZmVzdD4KZGlmZiAtLWdpdCBhL3Rlc3RzL0h3QWNjZWxlcmF0aW9uVGVzdC9yZXMvZHJhd2FibGUtaGRwaS9pY29uLnBuZyBiL3Rlc3RzL0h3QWNjZWxlcmF0aW9uVGVzdC9yZXMvZHJhd2FibGUtaGRwaS9pY29uLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MGZiZGY1Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvSHdBY2NlbGVyYXRpb25UZXN0L3Jlcy9kcmF3YWJsZS1oZHBpL2ljb24ucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL0h3QWNjZWxlcmF0aW9uVGVzdC9yZXMvZHJhd2FibGUtaGRwaS9zdW5zZXQxLmpwZyBiL3Rlc3RzL0h3QWNjZWxlcmF0aW9uVGVzdC9yZXMvZHJhd2FibGUtaGRwaS9zdW5zZXQxLmpwZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45Mjg1MWYzCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvSHdBY2NlbGVyYXRpb25UZXN0L3Jlcy9kcmF3YWJsZS1oZHBpL3N1bnNldDEuanBnCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL0h3QWNjZWxlcmF0aW9uVGVzdC9yZXMvZHJhd2FibGUtaGRwaS9zdW5zZXQyLnBuZyBiL3Rlc3RzL0h3QWNjZWxlcmF0aW9uVGVzdC9yZXMvZHJhd2FibGUtaGRwaS9zdW5zZXQyLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMjU4ZWU3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvSHdBY2NlbGVyYXRpb25UZXN0L3Jlcy9kcmF3YWJsZS1oZHBpL3N1bnNldDIucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL0h3QWNjZWxlcmF0aW9uVGVzdC9yZXMvZHJhd2FibGUtaGRwaS9zdW5zZXQzLnBuZyBiL3Rlc3RzL0h3QWNjZWxlcmF0aW9uVGVzdC9yZXMvZHJhd2FibGUtaGRwaS9zdW5zZXQzLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NTA4YjI3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvSHdBY2NlbGVyYXRpb25UZXN0L3Jlcy9kcmF3YWJsZS1oZHBpL3N1bnNldDMucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL0h3QWNjZWxlcmF0aW9uVGVzdC9yZXMvZHJhd2FibGUvYnRuX3RvZ2dsZV9vZmYuOS5wbmcgYi90ZXN0cy9Id0FjY2VsZXJhdGlvblRlc3QvcmVzL2RyYXdhYmxlL2J0bl90b2dnbGVfb2ZmLjkucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI2ZWUxYzIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9Id0FjY2VsZXJhdGlvblRlc3QvcmVzL2RyYXdhYmxlL2J0bl90b2dnbGVfb2ZmLjkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL0h3QWNjZWxlcmF0aW9uVGVzdC9yZXMvZHJhd2FibGUvYnRuX3RvZ2dsZV9vbi45LnBuZyBiL3Rlc3RzL0h3QWNjZWxlcmF0aW9uVGVzdC9yZXMvZHJhd2FibGUvYnRuX3RvZ2dsZV9vbi45LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41M2U5NWFmCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvSHdBY2NlbGVyYXRpb25UZXN0L3Jlcy9kcmF3YWJsZS9idG5fdG9nZ2xlX29uLjkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL0h3QWNjZWxlcmF0aW9uVGVzdC9yZXMvZHJhd2FibGUvZGVmYXVsdF93YWxscGFwZXIuanBnIGIvdGVzdHMvSHdBY2NlbGVyYXRpb25UZXN0L3Jlcy9kcmF3YWJsZS9kZWZhdWx0X3dhbGxwYXBlci5qcGcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWFjYWQ5NAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL0h3QWNjZWxlcmF0aW9uVGVzdC9yZXMvZHJhd2FibGUvZGVmYXVsdF93YWxscGFwZXIuanBnCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL0h3QWNjZWxlcmF0aW9uVGVzdC9yZXMvZHJhd2FibGUvaWNvbi5wbmcgYi90ZXN0cy9Id0FjY2VsZXJhdGlvblRlc3QvcmVzL2RyYXdhYmxlL2ljb24ucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNiNDBhMTkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9Id0FjY2VsZXJhdGlvblRlc3QvcmVzL2RyYXdhYmxlL2ljb24ucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL0h3QWNjZWxlcmF0aW9uVGVzdC9yZXMvZHJhd2FibGUvc3Vuc2V0MS5qcGcgYi90ZXN0cy9Id0FjY2VsZXJhdGlvblRlc3QvcmVzL2RyYXdhYmxlL3N1bnNldDEuanBnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkyODUxZjMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9Id0FjY2VsZXJhdGlvblRlc3QvcmVzL2RyYXdhYmxlL3N1bnNldDEuanBnCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL0h3QWNjZWxlcmF0aW9uVGVzdC9yZXMvZHJhd2FibGUvc3Vuc2V0Mi5wbmcgYi90ZXN0cy9Id0FjY2VsZXJhdGlvblRlc3QvcmVzL2RyYXdhYmxlL3N1bnNldDIucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMyNThlZTcKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9Id0FjY2VsZXJhdGlvblRlc3QvcmVzL2RyYXdhYmxlL3N1bnNldDIucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL0h3QWNjZWxlcmF0aW9uVGVzdC9yZXMvZHJhd2FibGUvc3Vuc2V0My5wbmcgYi90ZXN0cy9Id0FjY2VsZXJhdGlvblRlc3QvcmVzL2RyYXdhYmxlL3N1bnNldDMucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY1MDhiMjcKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9Id0FjY2VsZXJhdGlvblRlc3QvcmVzL2RyYXdhYmxlL3N1bnNldDMucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL0h3QWNjZWxlcmF0aW9uVGVzdC9yZXMvbGF5b3V0L2Zvcm0ueG1sIGIvdGVzdHMvSHdBY2NlbGVyYXRpb25UZXN0L3Jlcy9sYXlvdXQvZm9ybS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGIxN2RiMQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL0h3QWNjZWxlcmF0aW9uVGVzdC9yZXMvbGF5b3V0L2Zvcm0ueG1sCkBAIC0wLDAgKzEsNjYgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzxMaW5lYXJMYXlvdXQgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgIGFuZHJvaWQ6b3JpZW50YXRpb249InZlcnRpY2FsIgorICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJtYXRjaF9wYXJlbnQiPgorCisgICAgPExpbmVhckxheW91dAorICAgICAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJob3Jpem9udGFsIgorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCI+CisgICAgICAgIAorICAgICAgICA8VGV4dFZpZXcKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iRmlyc3QgbmFtZSIgLz4KKyAgICAgICAgCisgICAgICAgIDxFZGl0VGV4dAorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IjBkaXAiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93ZWlnaHQ9IjEuMCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luTGVmdD0iM2RpcCIKKyAgICAgICAgICAgIGFuZHJvaWQ6aGludD0iRW50ZXIgeW91ciBmaXJzdCBuYW1lIiAvPgorICAgICAgICAKKyAgICA8L0xpbmVhckxheW91dD4KKworICAgIDxMaW5lYXJMYXlvdXQKKyAgICAgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0iaG9yaXpvbnRhbCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiPgorICAgICAgICAKKyAgICAgICAgPFRleHRWaWV3CisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOnRleHQ9Ikxhc3QgbmFtZSIgLz4KKyAgICAgICAgCisgICAgICAgIDxFZGl0VGV4dAorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IjBkaXAiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93ZWlnaHQ9IjEuMCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luTGVmdD0iM2RpcCIKKyAgICAgICAgICAgIGFuZHJvaWQ6aGludD0iRW50ZXIgeW91ciBsYXN0IG5hbWUiIC8+CisgICAgICAgIAorICAgIDwvTGluZWFyTGF5b3V0PgorICAgIAorICAgIDxFZGl0VGV4dAorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF93ZWlnaHQ9IjEuMCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSIwZGlwIgorICAgICAgICBhbmRyb2lkOmJhY2tncm91bmQ9IiNmZjdmMDAwMCIgLz4KKyAgICAKKzwvTGluZWFyTGF5b3V0PgpkaWZmIC0tZ2l0IGEvdGVzdHMvSHdBY2NlbGVyYXRpb25UZXN0L3Jlcy9sYXlvdXQvbGlzdF9hY3Rpdml0eS54bWwgYi90ZXN0cy9Id0FjY2VsZXJhdGlvblRlc3QvcmVzL2xheW91dC9saXN0X2FjdGl2aXR5LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YmJhMzcwCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvSHdBY2NlbGVyYXRpb25UZXN0L3Jlcy9sYXlvdXQvbGlzdF9hY3Rpdml0eS54bWwKQEAgLTAsMCArMSw3OCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPExpbmVhckxheW91dCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0idmVydGljYWwiCisgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9Im1hdGNoX3BhcmVudCI+CisKKyAgICA8TGluZWFyTGF5b3V0CisgICAgICAgIGFuZHJvaWQ6b3JpZW50YXRpb249Imhvcml6b250YWwiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50Ij4KKyAgICAgICAgCisgICAgICAgIDxCdXR0b24KKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSIwZGlwIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2VpZ2h0PSIxLjAiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpbkxlZnQ9IjEwZGlwIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luUmlnaHQ9IjNkaXAiCisKKyAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iQWRkIiAvPgorICAgICAgICAKKyAgICAgICAgPEJ1dHRvbgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IjBkaXAiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93ZWlnaHQ9IjEuMCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luTGVmdD0iM2RpcCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpblJpZ2h0PSIxMGRpcCIKKworICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJSZW1vdmUiIC8+CisgICAgICAgIAorICAgIDwvTGluZWFyTGF5b3V0PgorICAgIAorICAgIDxMaXN0VmlldworICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL2xpc3QiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iMGRpcCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2VpZ2h0PSIxLjAiIC8+CisKKyAgICA8TGluZWFyTGF5b3V0CisgICAgICAgIGFuZHJvaWQ6b3JpZW50YXRpb249Imhvcml6b250YWwiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50Ij4KKyAgICAgICAgCisgICAgICAgIDxCdXR0b24KKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSIwZGlwIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2VpZ2h0PSIxLjAiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpbkxlZnQ9IjEwZGlwIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luUmlnaHQ9IjNkaXAiCisKKyAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iQWRkIiAvPgorICAgICAgICAKKyAgICAgICAgPEJ1dHRvbgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IjBkaXAiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93ZWlnaHQ9IjEuMCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luTGVmdD0iM2RpcCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpblJpZ2h0PSIxMGRpcCIKKworICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJSZW1vdmUiIC8+CisgICAgICAgIAorICAgIDwvTGluZWFyTGF5b3V0PgorCis8L0xpbmVhckxheW91dD4KZGlmZiAtLWdpdCBhL3Rlc3RzL0h3QWNjZWxlcmF0aW9uVGVzdC9yZXMvbGF5b3V0L3N0YWNrLnhtbCBiL3Rlc3RzL0h3QWNjZWxlcmF0aW9uVGVzdC9yZXMvbGF5b3V0L3N0YWNrLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNGQyZDczYQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL0h3QWNjZWxlcmF0aW9uVGVzdC9yZXMvbGF5b3V0L3N0YWNrLnhtbApAQCAtMCwwICsxLDMzIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8RnJhbWVMYXlvdXQgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJmaWxsX3BhcmVudCIKKyAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9ImZpbGxfcGFyZW50IgorICAgIGFuZHJvaWQ6cGFkZGluZ1RvcD0iMGRwIgorICAgIGFuZHJvaWQ6cGFkZGluZ0JvdHRvbT0iMGRwIgorICAgIGFuZHJvaWQ6cGFkZGluZ0xlZnQ9IjEyZHAiCisgICAgYW5kcm9pZDpwYWRkaW5nUmlnaHQ9IjEyZHAiCisgICAgYW5kcm9pZDpmb2N1c2FibGU9InRydWUiPgorICAgIDxTdGFja1ZpZXcKKyAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9zdGFja192aWV3IiAKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IjM0OHB4IiAKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSIzNzRweCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfZ3Jhdml0eT0iY2VudGVyIgorICAgICAgICBhbmRyb2lkOmJhY2tncm91bmQ9IiMwMDAwMDAwMCIKKyAgICAgICAgYW5kcm9pZDpjYWNoZUNvbG9ySGludD0iIzAwMDAwMDAwIgorICAgICAgICBhbmRyb2lkOmF1dG9TdGFydD0idHJ1ZSIgLz4KKzwvRnJhbWVMYXlvdXQ+CmRpZmYgLS1naXQgYS90ZXN0cy9Id0FjY2VsZXJhdGlvblRlc3QvcmVzL2xheW91dC9zdGFja19pdGVtLnhtbCBiL3Rlc3RzL0h3QWNjZWxlcmF0aW9uVGVzdC9yZXMvbGF5b3V0L3N0YWNrX2l0ZW0ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM1MDQwMTgKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9Id0FjY2VsZXJhdGlvblRlc3QvcmVzL2xheW91dC9zdGFja19pdGVtLnhtbApAQCAtMCwwICsxLDM4IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8RnJhbWVMYXlvdXQgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgIGFuZHJvaWQ6aWQ9IkAraWQvc3RhY2tfaXRlbSIgIAorICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJmaWxsX3BhcmVudCIKKyAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9ImZpbGxfcGFyZW50Ij4gCisgICAgPEZyYW1lTGF5b3V0ICAKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9ImZpbGxfcGFyZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9ImZpbGxfcGFyZW50Ij4gCisgICAgICAgIDxJbWFnZVZpZXcgYW5kcm9pZDppZD0iQCtpZC90ZXh0dmlld19pY29uIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSIyNTBkaXAiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iMjUwZGlwIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfZ3Jhdml0eT0iY2VudGVyIiAvPgorICAgICAgICA8VGV4dFZpZXcgYW5kcm9pZDppZD0iQCtpZC9taW5pX3RleHQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IiAKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IiAKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2dyYXZpdHk9ImNlbnRlciIgLz4KKyAgICA8L0ZyYW1lTGF5b3V0PgorICAgIDxUZXh0VmlldyAKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIgCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICBhbmRyb2lkOnZpc2liaWxpdHk9ImdvbmUiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2dyYXZpdHk9ImNlbnRlciIgLz4KKzwvRnJhbWVMYXlvdXQ+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvSHdBY2NlbGVyYXRpb25UZXN0L3Jlcy9sYXlvdXQvdGV4dF9sYXJnZS54bWwgYi90ZXN0cy9Id0FjY2VsZXJhdGlvblRlc3QvcmVzL2xheW91dC90ZXh0X2xhcmdlLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NWIzNzRjCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvSHdBY2NlbGVyYXRpb25UZXN0L3Jlcy9sYXlvdXQvdGV4dF9sYXJnZS54bWwKQEAgLTAsMCArMSwyMyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPFRleHRWaWV3IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpblRvcD0iNmRpcCIKKyAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5MZWZ0PSI2ZGlwIgorICAgIGFuZHJvaWQ6dGV4dEFwcGVhcmFuY2U9Ij9hbmRyb2lkOmF0dHIvdGV4dEFwcGVhcmFuY2VMYXJnZUludmVyc2UiCisgICAgYW5kcm9pZDp0ZXh0PSJXaWRnZXQgIi8+IApkaWZmIC0tZ2l0IGEvdGVzdHMvSHdBY2NlbGVyYXRpb25UZXN0L3Jlcy9sYXlvdXQvdGV4dF9tZWRpdW0ueG1sIGIvdGVzdHMvSHdBY2NlbGVyYXRpb25UZXN0L3Jlcy9sYXlvdXQvdGV4dF9tZWRpdW0ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhlMTk1ZTYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9Id0FjY2VsZXJhdGlvblRlc3QvcmVzL2xheW91dC90ZXh0X21lZGl1bS54bWwKQEAgLTAsMCArMSwyMyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPFRleHRWaWV3IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpblRvcD0iNmRpcCIKKyAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5MZWZ0PSI2ZGlwIgorICAgIGFuZHJvaWQ6dGV4dEFwcGVhcmFuY2U9Ij9hbmRyb2lkOmF0dHIvdGV4dEFwcGVhcmFuY2VNZWRpdW1JbnZlcnNlIgorICAgIGFuZHJvaWQ6dGV4dD0iV2lkZ2V0ICIvPiAKZGlmZiAtLWdpdCBhL3Rlc3RzL0h3QWNjZWxlcmF0aW9uVGVzdC9yZXMvbGF5b3V0L3RleHRfc21hbGwueG1sIGIvdGVzdHMvSHdBY2NlbGVyYXRpb25UZXN0L3Jlcy9sYXlvdXQvdGV4dF9zbWFsbC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDVlZWU2MAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL0h3QWNjZWxlcmF0aW9uVGVzdC9yZXMvbGF5b3V0L3RleHRfc21hbGwueG1sCkBAIC0wLDAgKzEsMjMgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzxUZXh0VmlldyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5Ub3A9IjZkaXAiCisgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luTGVmdD0iNmRpcCIKKyAgICBhbmRyb2lkOnRleHRBcHBlYXJhbmNlPSI/YW5kcm9pZDphdHRyL3RleHRBcHBlYXJhbmNlU21hbGxJbnZlcnNlIgorICAgIGFuZHJvaWQ6dGV4dD0iV2lkZ2V0ICIvPiAKZGlmZiAtLWdpdCBhL3Rlc3RzL0h3QWNjZWxlcmF0aW9uVGVzdC9zcmMvY29tL2FuZHJvaWQvdGVzdC9od3VpL0FkdmFuY2VkQmxlbmRBY3Rpdml0eS5qYXZhIGIvdGVzdHMvSHdBY2NlbGVyYXRpb25UZXN0L3NyYy9jb20vYW5kcm9pZC90ZXN0L2h3dWkvQWR2YW5jZWRCbGVuZEFjdGl2aXR5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWJhYTIwYwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL0h3QWNjZWxlcmF0aW9uVGVzdC9zcmMvY29tL2FuZHJvaWQvdGVzdC9od3VpL0FkdmFuY2VkQmxlbmRBY3Rpdml0eS5qYXZhCkBAIC0wLDAgKzEsMTM4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC50ZXN0Lmh3dWk7CisKK2ltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eTsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkJpdG1hcDsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkJpdG1hcEZhY3Rvcnk7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5CaXRtYXBTaGFkZXI7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5DYW52YXM7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5Db2xvcjsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkNvbXBvc2VTaGFkZXI7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5MaW5lYXJHcmFkaWVudDsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLk1hdHJpeDsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlBhaW50OworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUG9ydGVyRHVmZjsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlNoYWRlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKKworQFN1cHByZXNzV2FybmluZ3MoeyJVbnVzZWREZWNsYXJhdGlvbiJ9KQorcHVibGljIGNsYXNzIEFkdmFuY2VkQmxlbmRBY3Rpdml0eSBleHRlbmRzIEFjdGl2aXR5IHsKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvbkNyZWF0ZShCdW5kbGUgc2F2ZWRJbnN0YW5jZVN0YXRlKSB7CisgICAgICAgIHN1cGVyLm9uQ3JlYXRlKHNhdmVkSW5zdGFuY2VTdGF0ZSk7CisKKyAgICAgICAgc2V0Q29udGVudFZpZXcobmV3IFNoYWRlcnNWaWV3KHRoaXMpKTsKKyAgICB9CisKKyAgICBzdGF0aWMgY2xhc3MgU2hhZGVyc1ZpZXcgZXh0ZW5kcyBWaWV3IHsKKyAgICAgICAgcHJpdmF0ZSBCaXRtYXBTaGFkZXIgbVNjYWxlZFNoYWRlcjsKKyAgICAgICAgcHJpdmF0ZSBpbnQgbVRleFdpZHRoOworICAgICAgICBwcml2YXRlIGludCBtVGV4SGVpZ2h0OworICAgICAgICBwcml2YXRlIFBhaW50IG1QYWludDsKKyAgICAgICAgcHJpdmF0ZSBmbG9hdCBtRHJhd1dpZHRoOworICAgICAgICBwcml2YXRlIGZsb2F0IG1EcmF3SGVpZ2h0OworICAgICAgICBwcml2YXRlIExpbmVhckdyYWRpZW50IG1Ib3JHcmFkaWVudDsKKyAgICAgICAgcHJpdmF0ZSBDb21wb3NlU2hhZGVyIG1Db21wb3NlU2hhZGVyOworICAgICAgICBwcml2YXRlIENvbXBvc2VTaGFkZXIgbUNvbXBvc2UyU2hhZGVyOworICAgICAgICBwcml2YXRlIENvbXBvc2VTaGFkZXIgbUNvbXBvc2UzU2hhZGVyOworICAgICAgICBwcml2YXRlIENvbXBvc2VTaGFkZXIgbUNvbXBvc2U0U2hhZGVyOworICAgICAgICBwcml2YXRlIENvbXBvc2VTaGFkZXIgbUNvbXBvc2U1U2hhZGVyOworICAgICAgICBwcml2YXRlIENvbXBvc2VTaGFkZXIgbUNvbXBvc2U2U2hhZGVyOworICAgICAgICBwcml2YXRlIEJpdG1hcFNoYWRlciBtU2NhbGVkMlNoYWRlcjsKKworICAgICAgICBTaGFkZXJzVmlldyhDb250ZXh0IGMpIHsKKyAgICAgICAgICAgIHN1cGVyKGMpOworCisgICAgICAgICAgICBCaXRtYXAgdGV4dHVyZSA9IEJpdG1hcEZhY3RvcnkuZGVjb2RlUmVzb3VyY2UoYy5nZXRSZXNvdXJjZXMoKSwgUi5kcmF3YWJsZS5zdW5zZXQxKTsKKyAgICAgICAgICAgIG1UZXhXaWR0aCA9IHRleHR1cmUuZ2V0V2lkdGgoKTsKKyAgICAgICAgICAgIG1UZXhIZWlnaHQgPSB0ZXh0dXJlLmdldEhlaWdodCgpOworICAgICAgICAgICAgbURyYXdXaWR0aCA9IG1UZXhXaWR0aCAqIDIuMmY7CisgICAgICAgICAgICBtRHJhd0hlaWdodCA9IG1UZXhIZWlnaHQgKiAxLjJmOworCisgICAgICAgICAgICBtU2NhbGVkU2hhZGVyID0gbmV3IEJpdG1hcFNoYWRlcih0ZXh0dXJlLCBTaGFkZXIuVGlsZU1vZGUuTUlSUk9SLAorICAgICAgICAgICAgICAgICAgICBTaGFkZXIuVGlsZU1vZGUuTUlSUk9SKTsKKyAgICAgICAgICAgIE1hdHJpeCBtMiA9IG5ldyBNYXRyaXgoKTsKKyAgICAgICAgICAgIG0yLnNldFNjYWxlKDAuNWYsIDAuNWYpOworICAgICAgICAgICAgbVNjYWxlZFNoYWRlci5zZXRMb2NhbE1hdHJpeChtMik7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIG1TY2FsZWQyU2hhZGVyID0gbmV3IEJpdG1hcFNoYWRlcih0ZXh0dXJlLCBTaGFkZXIuVGlsZU1vZGUuTUlSUk9SLAorICAgICAgICAgICAgICAgICAgICBTaGFkZXIuVGlsZU1vZGUuTUlSUk9SKTsKKyAgICAgICAgICAgIE1hdHJpeCBtMyA9IG5ldyBNYXRyaXgoKTsKKyAgICAgICAgICAgIG0zLnNldFNjYWxlKDAuMWYsIDAuMWYpOworICAgICAgICAgICAgbVNjYWxlZDJTaGFkZXIuc2V0TG9jYWxNYXRyaXgobTMpOworCisgICAgICAgICAgICBtSG9yR3JhZGllbnQgPSBuZXcgTGluZWFyR3JhZGllbnQoMC4wZiwgMC4wZiwgbURyYXdXaWR0aCwgMC4wZiwKKyAgICAgICAgICAgICAgICAgICAgQ29sb3IuQkxBQ0ssIENvbG9yLldISVRFLCBTaGFkZXIuVGlsZU1vZGUuQ0xBTVApOworICAgICAgICAgICAgCisgICAgICAgICAgICBtQ29tcG9zZVNoYWRlciA9IG5ldyBDb21wb3NlU2hhZGVyKG1TY2FsZWRTaGFkZXIsIG1Ib3JHcmFkaWVudCwKKyAgICAgICAgICAgICAgICAgICAgUG9ydGVyRHVmZi5Nb2RlLkRBUktFTik7CisgICAgICAgICAgICBtQ29tcG9zZTJTaGFkZXIgPSBuZXcgQ29tcG9zZVNoYWRlcihtU2NhbGVkU2hhZGVyLCBtSG9yR3JhZGllbnQsCisgICAgICAgICAgICAgICAgICAgIFBvcnRlckR1ZmYuTW9kZS5MSUdIVEVOKTsKKyAgICAgICAgICAgIG1Db21wb3NlM1NoYWRlciA9IG5ldyBDb21wb3NlU2hhZGVyKG1TY2FsZWRTaGFkZXIsIG1Ib3JHcmFkaWVudCwKKyAgICAgICAgICAgICAgICAgICAgUG9ydGVyRHVmZi5Nb2RlLk1VTFRJUExZKTsKKyAgICAgICAgICAgIG1Db21wb3NlNFNoYWRlciA9IG5ldyBDb21wb3NlU2hhZGVyKG1TY2FsZWRTaGFkZXIsIG1Ib3JHcmFkaWVudCwKKyAgICAgICAgICAgICAgICAgICAgUG9ydGVyRHVmZi5Nb2RlLlNDUkVFTik7CisgICAgICAgICAgICBtQ29tcG9zZTVTaGFkZXIgPSBuZXcgQ29tcG9zZVNoYWRlcihtU2NhbGVkU2hhZGVyLCBtSG9yR3JhZGllbnQsCisgICAgICAgICAgICAgICAgICAgIFBvcnRlckR1ZmYuTW9kZS5BREQpOworICAgICAgICAgICAgbUNvbXBvc2U2U2hhZGVyID0gbmV3IENvbXBvc2VTaGFkZXIobUhvckdyYWRpZW50LCBtU2NhbGVkU2hhZGVyLAorICAgICAgICAgICAgICAgICAgICBQb3J0ZXJEdWZmLk1vZGUuT1ZFUkxBWSk7CisKKyAgICAgICAgICAgIG1QYWludCA9IG5ldyBQYWludCgpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHByb3RlY3RlZCB2b2lkIG9uRHJhdyhDYW52YXMgY2FudmFzKSB7CisgICAgICAgICAgICBzdXBlci5vbkRyYXcoY2FudmFzKTsKKyAgICAgICAgICAgIGNhbnZhcy5kcmF3UkdCKDI1NSwgMjU1LCAyNTUpOworCisgICAgICAgICAgICBjYW52YXMuc2F2ZSgpOworICAgICAgICAgICAgY2FudmFzLnRyYW5zbGF0ZSg0MC4wZiwgNDAuMGYpOworCisgICAgICAgICAgICBtUGFpbnQuc2V0U2hhZGVyKG1Db21wb3NlU2hhZGVyKTsKKyAgICAgICAgICAgIGNhbnZhcy5kcmF3UmVjdCgwLjBmLCAwLjBmLCBtRHJhd1dpZHRoLCBtRHJhd0hlaWdodCwgbVBhaW50KTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgY2FudmFzLnRyYW5zbGF0ZSgwLjBmLCA0MC4wZiArIG1EcmF3SGVpZ2h0KTsKKyAgICAgICAgICAgIG1QYWludC5zZXRTaGFkZXIobUNvbXBvc2UyU2hhZGVyKTsKKyAgICAgICAgICAgIGNhbnZhcy5kcmF3UmVjdCgwLjBmLCAwLjBmLCBtRHJhd1dpZHRoLCBtRHJhd0hlaWdodCwgbVBhaW50KTsKKworICAgICAgICAgICAgY2FudmFzLnRyYW5zbGF0ZSgwLjBmLCA0MC4wZiArIG1EcmF3SGVpZ2h0KTsKKyAgICAgICAgICAgIG1QYWludC5zZXRTaGFkZXIobUNvbXBvc2UzU2hhZGVyKTsKKyAgICAgICAgICAgIGNhbnZhcy5kcmF3UmVjdCgwLjBmLCAwLjBmLCBtRHJhd1dpZHRoLCBtRHJhd0hlaWdodCwgbVBhaW50KTsKKworICAgICAgICAgICAgY2FudmFzLnJlc3RvcmUoKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgY2FudmFzLnNhdmUoKTsKKyAgICAgICAgICAgIGNhbnZhcy50cmFuc2xhdGUoNDAuMGYgKyBtRHJhd1dpZHRoICsgNDAuMGYsIDQwLjBmKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgbVBhaW50LnNldFNoYWRlcihtQ29tcG9zZTRTaGFkZXIpOworICAgICAgICAgICAgY2FudmFzLmRyYXdSZWN0KDAuMGYsIDAuMGYsIG1EcmF3V2lkdGgsIG1EcmF3SGVpZ2h0LCBtUGFpbnQpOworCisgICAgICAgICAgICBjYW52YXMudHJhbnNsYXRlKDAuMGYsIDQwLjBmICsgbURyYXdIZWlnaHQpOworICAgICAgICAgICAgbVBhaW50LnNldFNoYWRlcihtQ29tcG9zZTVTaGFkZXIpOworICAgICAgICAgICAgY2FudmFzLmRyYXdSZWN0KDAuMGYsIDAuMGYsIG1EcmF3V2lkdGgsIG1EcmF3SGVpZ2h0LCBtUGFpbnQpOworCisgICAgICAgICAgICBjYW52YXMudHJhbnNsYXRlKDAuMGYsIDQwLjBmICsgbURyYXdIZWlnaHQpOworICAgICAgICAgICAgbVBhaW50LnNldFNoYWRlcihtQ29tcG9zZTZTaGFkZXIpOworICAgICAgICAgICAgY2FudmFzLmRyYXdSZWN0KDAuMGYsIDAuMGYsIG1EcmF3V2lkdGgsIG1EcmF3SGVpZ2h0LCBtUGFpbnQpOworICAgICAgICAgICAgCisgICAgICAgICAgICBjYW52YXMucmVzdG9yZSgpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvSHdBY2NlbGVyYXRpb25UZXN0L3NyYy9jb20vYW5kcm9pZC90ZXN0L2h3dWkvQWxwaGFMYXllcnNBY3Rpdml0eS5qYXZhIGIvdGVzdHMvSHdBY2NlbGVyYXRpb25UZXN0L3NyYy9jb20vYW5kcm9pZC90ZXN0L2h3dWkvQWxwaGFMYXllcnNBY3Rpdml0eS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFhNjhhOTMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9Id0FjY2VsZXJhdGlvblRlc3Qvc3JjL2NvbS9hbmRyb2lkL3Rlc3QvaHd1aS9BbHBoYUxheWVyc0FjdGl2aXR5LmphdmEKQEAgLTAsMCArMSwxNDEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLnRlc3QuaHd1aTsKKworaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQ2FudmFzOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUGFpbnQ7CitpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuR3Jhdml0eTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuYW5pbWF0aW9uLkFscGhhQW5pbWF0aW9uOworaW1wb3J0IGFuZHJvaWQudmlldy5hbmltYXRpb24uQW5pbWF0aW9uOworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkZyYW1lTGF5b3V0OworCitAU3VwcHJlc3NXYXJuaW5ncyh7IlVudXNlZERlY2xhcmF0aW9uIn0pCitwdWJsaWMgY2xhc3MgQWxwaGFMYXllcnNBY3Rpdml0eSBleHRlbmRzIEFjdGl2aXR5IHsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTE9HX1RBRyA9ICJId1VpIjsKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG9uQ3JlYXRlKEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpIHsKKyAgICAgICAgc3VwZXIub25DcmVhdGUoc2F2ZWRJbnN0YW5jZVN0YXRlKTsKKworICAgICAgICBEaXJ0eUJpdG1hcFZpZXcgY29udGFpbmVyID0gbmV3IERpcnR5Qml0bWFwVmlldyh0aGlzKTsKKworICAgICAgICBDb2xvclZpZXcgY29sb3IgPSBuZXcgQ29sb3JWaWV3KHRoaXMpOworICAgICAgICBjb250YWluZXIuYWRkVmlldyhjb2xvciwgbmV3IERpcnR5Qml0bWFwVmlldy5MYXlvdXRQYXJhbXMoCisgICAgICAgICAgICAgICAgZGlwVG9QeCh0aGlzLCAxMDApLCBkaXBUb1B4KHRoaXMsIDEwMCksIEdyYXZpdHkuQ0VOVEVSKSk7CisKKyAgICAgICAgQWxwaGFBbmltYXRpb24gYSA9IG5ldyBBbHBoYUFuaW1hdGlvbigxLjBmLCAwLjBmKTsKKyAgICAgICAgYS5zZXREdXJhdGlvbigyMDAwKTsKKyAgICAgICAgYS5zZXRSZXBlYXRDb3VudChBbmltYXRpb24uSU5GSU5JVEUpOworICAgICAgICBhLnNldFJlcGVhdE1vZGUoQW5pbWF0aW9uLlJFVkVSU0UpOworICAgICAgICBjb2xvci5zdGFydEFuaW1hdGlvbihhKTsKKworICAgICAgICBzZXRDb250ZW50Vmlldyhjb250YWluZXIpOworICAgIH0KKyAgICAKKyAgICBAU3VwcHJlc3NXYXJuaW5ncyh7IlVudXNlZERlY2xhcmF0aW9uIn0pCisgICAgc3RhdGljIGludCBkaXBUb1B4KENvbnRleHQgYywgaW50IGRpcCkgeworICAgICAgICByZXR1cm4gKGludCkgKGMuZ2V0UmVzb3VyY2VzKCkuZ2V0RGlzcGxheU1ldHJpY3MoKS5kZW5zaXR5ICogZGlwICsgMC41Zik7CisgICAgfQorCisgICAgc3RhdGljIGNsYXNzIENvbG9yVmlldyBleHRlbmRzIFZpZXcgeworICAgICAgICBDb2xvclZpZXcoQ29udGV4dCBjKSB7CisgICAgICAgICAgICBzdXBlcihjKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwcm90ZWN0ZWQgdm9pZCBvbkRyYXcoQ2FudmFzIGNhbnZhcykgeworICAgICAgICAgICAgc3VwZXIub25EcmF3KGNhbnZhcyk7CisgICAgICAgICAgICBjYW52YXMuZHJhd1JHQigwLCAyNTUsIDApOworICAgICAgICB9CisgICAgfQorCisgICAgc3RhdGljIGNsYXNzIERpcnR5Qml0bWFwVmlldyBleHRlbmRzIEZyYW1lTGF5b3V0IHsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBQYWludCBtUGFpbnQ7CisKKyAgICAgICAgRGlydHlCaXRtYXBWaWV3KENvbnRleHQgYykgeworICAgICAgICAgICAgc3VwZXIoYyk7CisgICAgICAgICAgICBtUGFpbnQgPSBuZXcgUGFpbnQoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBkaXNwYXRjaERyYXcoQ2FudmFzIGNhbnZhcykgeworICAgICAgICAgICAgY2FudmFzLmRyYXdSR0IoMjU1LCAyNTUsIDI1NSk7CisKKyAgICAgICAgICAgIG1QYWludC5zZXRDb2xvcigweGZmZmYwMDAwKTsKKyAgICAgICAgICAgIGNhbnZhcy5kcmF3UmVjdCgyMDAuMGYsIDAuMGYsIDIyMC4wZiwgMjAuMGYsIG1QYWludCk7CisKKyAgICAgICAgICAgIGNhbnZhcy5zYXZlKCk7CisgICAgICAgICAgICBjYW52YXMuY2xpcFJlY3QoMjAuMGYsIDAuMGYsIDQwLjBmLCAyMC4wZik7CisgICAgICAgICAgICBMb2cuZChMT0dfVEFHLCAiY2xpcFJlY3QgPSAiICsgY2FudmFzLmdldENsaXBCb3VuZHMoKSk7CisgICAgICAgICAgICBMb2cuZChMT0dfVEFHLCAicmVqZWN0ZWQgPSAiICsgY2FudmFzLnF1aWNrUmVqZWN0KDEwMC4wZiwgMTAwLjBmLCAxMTAuMGYsIDExMC4wZiwKKyAgICAgICAgICAgICAgICAgICAgQ2FudmFzLkVkZ2VUeXBlLkJXKSk7CisgICAgICAgICAgICBMb2cuZChMT0dfVEFHLCAicmVqZWN0ZWQgPSAiICsgY2FudmFzLnF1aWNrUmVqZWN0KDI1LjBmLCA1LjBmLCAzMC4wZiwgMTAuMGYsCisgICAgICAgICAgICAgICAgICAgIENhbnZhcy5FZGdlVHlwZS5CVykpOworICAgICAgICAgICAgY2FudmFzLnJlc3RvcmUoKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgY2FudmFzLnNhdmUoKTsKKyAgICAgICAgICAgIGNhbnZhcy5zY2FsZSgyLjBmLCAyLjBmKTsKKyAgICAgICAgICAgIGNhbnZhcy5jbGlwUmVjdCgyMC4wZiwgMC4wZiwgNDAuMGYsIDIwLjBmKTsKKyAgICAgICAgICAgIExvZy5kKExPR19UQUcsICJjbGlwUmVjdCA9ICIgKyBjYW52YXMuZ2V0Q2xpcEJvdW5kcygpKTsKKyAgICAgICAgICAgIExvZy5kKExPR19UQUcsICJyZWplY3RlZCA9ICIgKyBjYW52YXMucXVpY2tSZWplY3QoNTAuMGYsIDUwLjBmLCA2MC4wZiwgNjAuMGYsCisgICAgICAgICAgICAgICAgICAgIENhbnZhcy5FZGdlVHlwZS5CVykpOworICAgICAgICAgICAgTG9nLmQoTE9HX1RBRywgInJlamVjdGVkID0gIiArIGNhbnZhcy5xdWlja1JlamVjdCgyNS4wZiwgNS4wZiwgMzAuMGYsIDEwLjBmLAorICAgICAgICAgICAgICAgICAgICBDYW52YXMuRWRnZVR5cGUuQlcpKTsKKyAgICAgICAgICAgIGNhbnZhcy5yZXN0b3JlKCk7CisKKyAgICAgICAgICAgIGNhbnZhcy5zYXZlKCk7CisgICAgICAgICAgICBjYW52YXMudHJhbnNsYXRlKDIwLjBmLCAyMC4wZik7CisgICAgICAgICAgICBjYW52YXMuY2xpcFJlY3QoMjAuMGYsIDAuMGYsIDQwLjBmLCAyMC4wZik7CisgICAgICAgICAgICBMb2cuZChMT0dfVEFHLCAiY2xpcFJlY3QgPSAiICsgY2FudmFzLmdldENsaXBCb3VuZHMoKSk7CisgICAgICAgICAgICBMb2cuZChMT0dfVEFHLCAicmVqZWN0ZWQgPSAiICsgY2FudmFzLnF1aWNrUmVqZWN0KDgwLjBmLCA4MC4wZiwgOTAuMGYsIDkwLjBmLAorICAgICAgICAgICAgICAgICAgICBDYW52YXMuRWRnZVR5cGUuQlcpKTsKKyAgICAgICAgICAgIExvZy5kKExPR19UQUcsICJyZWplY3RlZCA9ICIgKyBjYW52YXMucXVpY2tSZWplY3QoMjUuMGYsIDUuMGYsIDMwLjBmLCAxMC4wZiwKKyAgICAgICAgICAgICAgICAgICAgQ2FudmFzLkVkZ2VUeXBlLkJXKSk7CisgICAgICAgICAgICBjYW52YXMucmVzdG9yZSgpOworCisgICAgICAgICAgICBjYW52YXMuc2F2ZSgpOworICAgICAgICAgICAgY2FudmFzLnNjYWxlKDIuMGYsIDIuMGYpOyAgICAgICAgICAgIAorICAgICAgICAgICAgY2FudmFzLmNsaXBSZWN0KDIwLjBmLCAwLjBmLCA0MC4wZiwgMjAuMGYpOworCisgICAgICAgICAgICBtUGFpbnQuc2V0Q29sb3IoMHhmZjAwZmYwMCk7CisgICAgICAgICAgICBjYW52YXMuZHJhd1JlY3QoMC4wZiwgMC4wZiwgMjAuMGYsIDIwLjBmLCBtUGFpbnQpOworICAgICAgICAgICAgCisgICAgICAgICAgICBtUGFpbnQuc2V0Q29sb3IoMHhmZjAwMDBmZik7CisgICAgICAgICAgICBjYW52YXMuZHJhd1JlY3QoMjAuMGYsIDAuMGYsIDQwLjBmLCAyMC4wZiwgbVBhaW50KTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgY2FudmFzLnJlc3RvcmUoKTsKKworICAgICAgICAgICAgZmluYWwgaW50IHJlc3RvcmVUbyA9IGNhbnZhcy5zYXZlKCk7CisgICAgICAgICAgICBjYW52YXMuc2F2ZUxheWVyQWxwaGEoMC4wZiwgMTAwLjBmLCBnZXRXaWR0aCgpLCAxNTAuMGYsIDEyNywKKyAgICAgICAgICAgICAgICAgICAgQ2FudmFzLkhBU19BTFBIQV9MQVlFUl9TQVZFX0ZMQUcgfCBDYW52YXMuQ0xJUF9UT19MQVlFUl9TQVZFX0ZMQUcpOworICAgICAgICAgICAgbVBhaW50LnNldENvbG9yKDB4ZmYwMDAwZmYpOworICAgICAgICAgICAgY2FudmFzLmRyYXdSZWN0KDAuMGYsIDEwMC4wZiwgNDAuMGYsIDE1MC4wZiwgbVBhaW50KTsKKyAgICAgICAgICAgIG1QYWludC5zZXRDb2xvcigweGZmMDBmZmZmKTsKKyAgICAgICAgICAgIGNhbnZhcy5kcmF3UmVjdCg0MC4wZiwgMTAwLjBmLCAxNDAuMGYsIDE1MC4wZiwgbVBhaW50KTsKKyAgICAgICAgICAgIG1QYWludC5zZXRDb2xvcigweGZmZmYwMGZmKTsKKyAgICAgICAgICAgIGNhbnZhcy5kcmF3UmVjdCgxNDAuMGYsIDEwMC4wZiwgMjQwLjBmLCAxNTAuMGYsIG1QYWludCk7CisgICAgICAgICAgICBjYW52YXMucmVzdG9yZVRvQ291bnQocmVzdG9yZVRvKTsKKworICAgICAgICAgICAgc3VwZXIuZGlzcGF0Y2hEcmF3KGNhbnZhcyk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9Id0FjY2VsZXJhdGlvblRlc3Qvc3JjL2NvbS9hbmRyb2lkL3Rlc3QvaHd1aS9CaXRtYXBzQWN0aXZpdHkuamF2YSBiL3Rlc3RzL0h3QWNjZWxlcmF0aW9uVGVzdC9zcmMvY29tL2FuZHJvaWQvdGVzdC9od3VpL0JpdG1hcHNBY3Rpdml0eS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQwNTQzNTMwCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvSHdBY2NlbGVyYXRpb25UZXN0L3NyYy9jb20vYW5kcm9pZC90ZXN0L2h3dWkvQml0bWFwc0FjdGl2aXR5LmphdmEKQEAgLTAsMCArMSw5NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQudGVzdC5od3VpOworCitpbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHk7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5CaXRtYXA7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5CaXRtYXBGYWN0b3J5OworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQ2FudmFzOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUGFpbnQ7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5Qb3J0ZXJEdWZmOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUG9ydGVyRHVmZlhmZXJtb2RlOworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworaW1wb3J0IGFuZHJvaWQudmlldy5HcmF2aXR5OworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OworaW1wb3J0IGFuZHJvaWQudmlldy5hbmltYXRpb24uQW5pbWF0aW9uOworaW1wb3J0IGFuZHJvaWQudmlldy5hbmltYXRpb24uU2NhbGVBbmltYXRpb247CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuRnJhbWVMYXlvdXQ7CisKK0BTdXBwcmVzc1dhcm5pbmdzKHsiVW51c2VkRGVjbGFyYXRpb24ifSkKK3B1YmxpYyBjbGFzcyBCaXRtYXBzQWN0aXZpdHkgZXh0ZW5kcyBBY3Rpdml0eSB7CisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25DcmVhdGUoQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgeworICAgICAgICBzdXBlci5vbkNyZWF0ZShzYXZlZEluc3RhbmNlU3RhdGUpOworICAgICAgICBmaW5hbCBCaXRtYXBzVmlldyB2aWV3ID0gbmV3IEJpdG1hcHNWaWV3KHRoaXMpOworICAgICAgICBmaW5hbCBGcmFtZUxheW91dCBsYXlvdXQgPSBuZXcgRnJhbWVMYXlvdXQodGhpcyk7CisgICAgICAgIGxheW91dC5hZGRWaWV3KHZpZXcsIG5ldyBGcmFtZUxheW91dC5MYXlvdXRQYXJhbXMoNDgwLCA4MDAsIEdyYXZpdHkuQ0VOVEVSKSk7CisgICAgICAgIHNldENvbnRlbnRWaWV3KGxheW91dCk7CisgICAgICAgIAorICAgICAgICBTY2FsZUFuaW1hdGlvbiBhID0gbmV3IFNjYWxlQW5pbWF0aW9uKDEuMGYsIDIuMGYsIDEuMGYsIDIuMGYsCisgICAgICAgICAgICAgICAgU2NhbGVBbmltYXRpb24uUkVMQVRJVkVfVE9fU0VMRiwgMC41ZiwKKyAgICAgICAgICAgICAgICBTY2FsZUFuaW1hdGlvbi5SRUxBVElWRV9UT19TRUxGLDAuNWYpOworICAgICAgICBhLnNldER1cmF0aW9uKDIwMDApOworICAgICAgICBhLnNldFJlcGVhdENvdW50KEFuaW1hdGlvbi5JTkZJTklURSk7CisgICAgICAgIGEuc2V0UmVwZWF0TW9kZShBbmltYXRpb24uUkVWRVJTRSk7CisgICAgICAgIHZpZXcuc3RhcnRBbmltYXRpb24oYSk7CisgICAgfQorCisgICAgc3RhdGljIGNsYXNzIEJpdG1hcHNWaWV3IGV4dGVuZHMgVmlldyB7CisgICAgICAgIHByaXZhdGUgUGFpbnQgbUJpdG1hcFBhaW50OworICAgICAgICBwcml2YXRlIGZpbmFsIEJpdG1hcCBtQml0bWFwMTsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBCaXRtYXAgbUJpdG1hcDI7CisgICAgICAgIHByaXZhdGUgZmluYWwgUG9ydGVyRHVmZlhmZXJtb2RlIG1Ec3RJbjsKKworICAgICAgICBCaXRtYXBzVmlldyhDb250ZXh0IGMpIHsKKyAgICAgICAgICAgIHN1cGVyKGMpOworCisgICAgICAgICAgICBtQml0bWFwMSA9IEJpdG1hcEZhY3RvcnkuZGVjb2RlUmVzb3VyY2UoYy5nZXRSZXNvdXJjZXMoKSwgUi5kcmF3YWJsZS5zdW5zZXQxKTsKKyAgICAgICAgICAgIG1CaXRtYXAyID0gQml0bWFwRmFjdG9yeS5kZWNvZGVSZXNvdXJjZShjLmdldFJlc291cmNlcygpLCBSLmRyYXdhYmxlLnN1bnNldDIpOworCisgICAgICAgICAgICBtQml0bWFwUGFpbnQgPSBuZXcgUGFpbnQoKTsKKyAgICAgICAgICAgIG1Ec3RJbiA9IG5ldyBQb3J0ZXJEdWZmWGZlcm1vZGUoUG9ydGVyRHVmZi5Nb2RlLkRTVF9JTik7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHJvdGVjdGVkIHZvaWQgb25EcmF3KENhbnZhcyBjYW52YXMpIHsKKyAgICAgICAgICAgIHN1cGVyLm9uRHJhdyhjYW52YXMpOworCisgICAgICAgICAgICBjYW52YXMudHJhbnNsYXRlKDEyMC4wZiwgNTAuMGYpOworICAgICAgICAgICAgY2FudmFzLmRyYXdCaXRtYXAobUJpdG1hcDEsIDAuMGYsIDAuMGYsIG1CaXRtYXBQYWludCk7CisKKyAgICAgICAgICAgIGNhbnZhcy50cmFuc2xhdGUoMC4wZiwgbUJpdG1hcDEuZ2V0SGVpZ2h0KCkpOworICAgICAgICAgICAgY2FudmFzLnRyYW5zbGF0ZSgwLjBmLCAyNS4wZik7CisgICAgICAgICAgICBjYW52YXMuZHJhd0JpdG1hcChtQml0bWFwMiwgMC4wZiwgMC4wZiwgbnVsbCk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIG1CaXRtYXBQYWludC5zZXRBbHBoYSgxMjcpOworICAgICAgICAgICAgY2FudmFzLnRyYW5zbGF0ZSgwLjBmLCBtQml0bWFwMi5nZXRIZWlnaHQoKSk7CisgICAgICAgICAgICBjYW52YXMudHJhbnNsYXRlKDAuMGYsIDI1LjBmKTsKKyAgICAgICAgICAgIGNhbnZhcy5kcmF3Qml0bWFwKG1CaXRtYXAxLCAwLjBmLCAwLjBmLCBtQml0bWFwUGFpbnQpOworICAgICAgICAgICAgCisgICAgICAgICAgICBtQml0bWFwUGFpbnQuc2V0QWxwaGEoMjU1KTsKKyAgICAgICAgICAgIGNhbnZhcy50cmFuc2xhdGUoMC4wZiwgbUJpdG1hcDEuZ2V0SGVpZ2h0KCkpOworICAgICAgICAgICAgY2FudmFzLnRyYW5zbGF0ZSgwLjBmLCAyNS4wZik7CisgICAgICAgICAgICBtQml0bWFwUGFpbnQuc2V0Q29sb3IoMHhmZmZmMDAwMCk7CisgICAgICAgICAgICBjYW52YXMuZHJhd1JlY3QoMC4wZiwgMC4wZiwgbUJpdG1hcDIuZ2V0V2lkdGgoKSwgbUJpdG1hcDIuZ2V0SGVpZ2h0KCksIG1CaXRtYXBQYWludCk7CisgICAgICAgICAgICBtQml0bWFwUGFpbnQuc2V0WGZlcm1vZGUobURzdEluKTsKKyAgICAgICAgICAgIGNhbnZhcy5kcmF3Qml0bWFwKG1CaXRtYXAyLCAwLjBmLCAwLjBmLCBtQml0bWFwUGFpbnQpOworCisgICAgICAgICAgICBtQml0bWFwUGFpbnQucmVzZXQoKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL0h3QWNjZWxlcmF0aW9uVGVzdC9zcmMvY29tL2FuZHJvaWQvdGVzdC9od3VpL0JpdG1hcHNBbHBoYUFjdGl2aXR5LmphdmEgYi90ZXN0cy9Id0FjY2VsZXJhdGlvblRlc3Qvc3JjL2NvbS9hbmRyb2lkL3Rlc3QvaHd1aS9CaXRtYXBzQWxwaGFBY3Rpdml0eS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVmNDljN2YKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9Id0FjY2VsZXJhdGlvblRlc3Qvc3JjL2NvbS9hbmRyb2lkL3Rlc3QvaHd1aS9CaXRtYXBzQWxwaGFBY3Rpdml0eS5qYXZhCkBAIC0wLDAgKzEsODIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLnRlc3QuaHd1aTsKKworaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwRmFjdG9yeTsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkNhbnZhczsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlBhaW50OworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CitpbXBvcnQgYW5kcm9pZC52aWV3LkdyYXZpdHk7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuRnJhbWVMYXlvdXQ7CisKK0BTdXBwcmVzc1dhcm5pbmdzKHsiVW51c2VkRGVjbGFyYXRpb24ifSkKK3B1YmxpYyBjbGFzcyBCaXRtYXBzQWxwaGFBY3Rpdml0eSBleHRlbmRzIEFjdGl2aXR5IHsKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvbkNyZWF0ZShCdW5kbGUgc2F2ZWRJbnN0YW5jZVN0YXRlKSB7CisgICAgICAgIHN1cGVyLm9uQ3JlYXRlKHNhdmVkSW5zdGFuY2VTdGF0ZSk7CisgICAgICAgIGZpbmFsIEJpdG1hcHNWaWV3IHZpZXcgPSBuZXcgQml0bWFwc1ZpZXcodGhpcyk7CisgICAgICAgIGZpbmFsIEZyYW1lTGF5b3V0IGxheW91dCA9IG5ldyBGcmFtZUxheW91dCh0aGlzKTsKKyAgICAgICAgbGF5b3V0LmFkZFZpZXcodmlldywgbmV3IEZyYW1lTGF5b3V0LkxheW91dFBhcmFtcyg0ODAsIDgwMCwgR3Jhdml0eS5DRU5URVIpKTsKKyAgICAgICAgc2V0Q29udGVudFZpZXcobGF5b3V0KTsKKyAgICB9CisKKyAgICBzdGF0aWMgY2xhc3MgQml0bWFwc1ZpZXcgZXh0ZW5kcyBWaWV3IHsKKyAgICAgICAgcHJpdmF0ZSBQYWludCBtQml0bWFwUGFpbnQ7CisgICAgICAgIHByaXZhdGUgZmluYWwgQml0bWFwIG1CaXRtYXAxOworICAgICAgICBwcml2YXRlIGZpbmFsIEJpdG1hcCBtQml0bWFwMjsKKyAgICAgICAgcHJpdmF0ZSBCaXRtYXAgbUJpdG1hcDM7CisKKyAgICAgICAgQml0bWFwc1ZpZXcoQ29udGV4dCBjKSB7CisgICAgICAgICAgICBzdXBlcihjKTsKKworICAgICAgICAgICAgTG9nLmQoIk9wZW5HTFJlbmRlcmVyIiwgIkxvYWRpbmcgc3Vuc2V0MSwgZGVmYXVsdCBvcHRpb25zIik7CisgICAgICAgICAgICBtQml0bWFwMSA9IEJpdG1hcEZhY3RvcnkuZGVjb2RlUmVzb3VyY2UoYy5nZXRSZXNvdXJjZXMoKSwgUi5kcmF3YWJsZS5zdW5zZXQxKTsKKyAgICAgICAgICAgIExvZy5kKCJPcGVuR0xSZW5kZXJlciIsICJMb2FkaW5nIHN1bnNldDIsIGRlZmF1bHQgb3B0aW9ucyIpOworICAgICAgICAgICAgbUJpdG1hcDIgPSBCaXRtYXBGYWN0b3J5LmRlY29kZVJlc291cmNlKGMuZ2V0UmVzb3VyY2VzKCksIFIuZHJhd2FibGUuc3Vuc2V0Mik7CisgICAgICAgICAgICBMb2cuZCgiT3BlbkdMUmVuZGVyZXIiLCAiTG9hZGluZyBzdW5zZXQzLCBmb3JjaW5nIEFSR0ItODg4OCIpOworICAgICAgICAgICAgQml0bWFwRmFjdG9yeS5PcHRpb25zIG9wdHMgPSBuZXcgQml0bWFwRmFjdG9yeS5PcHRpb25zKCk7CisgICAgICAgICAgICBvcHRzLmluUHJlZmVycmVkQ29uZmlnID0gQml0bWFwLkNvbmZpZy5BUkdCXzg4ODg7CisgICAgICAgICAgICBtQml0bWFwMyA9IEJpdG1hcEZhY3RvcnkuZGVjb2RlUmVzb3VyY2UoYy5nZXRSZXNvdXJjZXMoKSwgUi5kcmF3YWJsZS5zdW5zZXQzLCBvcHRzKTsKKyAgICAgICAgICAgIExvZy5kKCJPcGVuR0xSZW5kZXJlciIsICIgICAgaGFzIGJpdG1hcCBhbHBoYT8gIiArIG1CaXRtYXAzLmhhc0FscGhhKCkpOworCisgICAgICAgICAgICBtQml0bWFwUGFpbnQgPSBuZXcgUGFpbnQoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwcm90ZWN0ZWQgdm9pZCBvbkRyYXcoQ2FudmFzIGNhbnZhcykgeworICAgICAgICAgICAgc3VwZXIub25EcmF3KGNhbnZhcyk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIExvZy5kKCJPcGVuR0xSZW5kZXJlciIsICI9PT09PT09PT09PT09PT09PSBEcmF3Iik7CisKKyAgICAgICAgICAgIGNhbnZhcy50cmFuc2xhdGUoMTIwLjBmLCA1MC4wZik7CisgICAgICAgICAgICBjYW52YXMuZHJhd0JpdG1hcChtQml0bWFwMSwgMC4wZiwgMC4wZiwgbUJpdG1hcFBhaW50KTsKKworICAgICAgICAgICAgY2FudmFzLnRyYW5zbGF0ZSgwLjBmLCBtQml0bWFwMS5nZXRIZWlnaHQoKSk7CisgICAgICAgICAgICBjYW52YXMudHJhbnNsYXRlKDAuMGYsIDI1LjBmKTsKKyAgICAgICAgICAgIGNhbnZhcy5kcmF3Qml0bWFwKG1CaXRtYXAyLCAwLjBmLCAwLjBmLCBudWxsKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgY2FudmFzLnRyYW5zbGF0ZSgwLjBmLCBtQml0bWFwMi5nZXRIZWlnaHQoKSk7CisgICAgICAgICAgICBjYW52YXMudHJhbnNsYXRlKDAuMGYsIDI1LjBmKTsKKyAgICAgICAgICAgIGNhbnZhcy5kcmF3Qml0bWFwKG1CaXRtYXAzLCAwLjBmLCAwLjBmLCBudWxsKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL0h3QWNjZWxlcmF0aW9uVGVzdC9zcmMvY29tL2FuZHJvaWQvdGVzdC9od3VpL0JpdG1hcHNSZWN0QWN0aXZpdHkuamF2YSBiL3Rlc3RzL0h3QWNjZWxlcmF0aW9uVGVzdC9zcmMvY29tL2FuZHJvaWQvdGVzdC9od3VpL0JpdG1hcHNSZWN0QWN0aXZpdHkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMTkyMjA5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvSHdBY2NlbGVyYXRpb25UZXN0L3NyYy9jb20vYW5kcm9pZC90ZXN0L2h3dWkvQml0bWFwc1JlY3RBY3Rpdml0eS5qYXZhCkBAIC0wLDAgKzEsNzcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLnRlc3QuaHd1aTsKKworaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwRmFjdG9yeTsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkNhbnZhczsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlBhaW50OworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUmVjdDsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlJlY3RGOworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OworCitAU3VwcHJlc3NXYXJuaW5ncyh7IlVudXNlZERlY2xhcmF0aW9uIn0pCitwdWJsaWMgY2xhc3MgQml0bWFwc1JlY3RBY3Rpdml0eSBleHRlbmRzIEFjdGl2aXR5IHsKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvbkNyZWF0ZShCdW5kbGUgc2F2ZWRJbnN0YW5jZVN0YXRlKSB7CisgICAgICAgIHN1cGVyLm9uQ3JlYXRlKHNhdmVkSW5zdGFuY2VTdGF0ZSk7CisgICAgICAgIGZpbmFsIEJpdG1hcHNWaWV3IHZpZXcgPSBuZXcgQml0bWFwc1ZpZXcodGhpcyk7CisgICAgICAgIHNldENvbnRlbnRWaWV3KHZpZXcpOworICAgIH0KKworICAgIHN0YXRpYyBjbGFzcyBCaXRtYXBzVmlldyBleHRlbmRzIFZpZXcgeworICAgICAgICBwcml2YXRlIFBhaW50IG1CaXRtYXBQYWludDsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBCaXRtYXAgbUJpdG1hcDE7CisgICAgICAgIHByaXZhdGUgZmluYWwgQml0bWFwIG1CaXRtYXAyOworICAgICAgICBwcml2YXRlIGZpbmFsIFJlY3QgbVNyY1JlY3Q7CisgICAgICAgIHByaXZhdGUgZmluYWwgUmVjdEYgbURzdFJlY3Q7CisgICAgICAgIHByaXZhdGUgZmluYWwgUmVjdEYgbURzdFJlY3QyOworCisgICAgICAgIEJpdG1hcHNWaWV3KENvbnRleHQgYykgeworICAgICAgICAgICAgc3VwZXIoYyk7CisKKyAgICAgICAgICAgIG1CaXRtYXAxID0gQml0bWFwRmFjdG9yeS5kZWNvZGVSZXNvdXJjZShjLmdldFJlc291cmNlcygpLCBSLmRyYXdhYmxlLnN1bnNldDEpOworICAgICAgICAgICAgbUJpdG1hcDIgPSBCaXRtYXBGYWN0b3J5LmRlY29kZVJlc291cmNlKGMuZ2V0UmVzb3VyY2VzKCksIFIuZHJhd2FibGUuc3Vuc2V0Mik7CisKKyAgICAgICAgICAgIG1CaXRtYXBQYWludCA9IG5ldyBQYWludCgpOworICAgICAgICAgICAgbUJpdG1hcFBhaW50LnNldEZpbHRlckJpdG1hcCh0cnVlKTsKKworICAgICAgICAgICAgZmluYWwgZmxvYXQgZm91cnRoID0gbUJpdG1hcDEuZ2V0V2lkdGgoKSAvIDQuMGY7CisgICAgICAgICAgICBmaW5hbCBmbG9hdCBoYWxmID0gbUJpdG1hcDEuZ2V0SGVpZ2h0KCkgLyAyLjBmOworICAgICAgICAgICAgbVNyY1JlY3QgPSBuZXcgUmVjdCgoaW50KSBmb3VydGgsIChpbnQpIChoYWxmIC0gaGFsZiAvIDIuMGYpLAorICAgICAgICAgICAgICAgICAgICAoaW50KSAoZm91cnRoICsgZm91cnRoKSwgKGludCkgKGhhbGYgKyBoYWxmIC8gMi4wZikpOworICAgICAgICAgICAgbURzdFJlY3QgPSBuZXcgUmVjdEYoZm91cnRoLCBoYWxmIC0gaGFsZiAvIDIuMGYsIGZvdXJ0aCArIGZvdXJ0aCwgaGFsZiArIGhhbGYgLyAyLjBmKTsKKyAgICAgICAgICAgIG1Ec3RSZWN0MiA9IG5ldyBSZWN0Rihmb3VydGgsIGhhbGYgLSBoYWxmIC8gMi4wZiwKKyAgICAgICAgICAgICAgICAgICAgKGZvdXJ0aCArIGZvdXJ0aCkgKiAzLjBmLCAoaGFsZiArIGhhbGYgLyAyLjBmKSAqIDMuMGYpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHByb3RlY3RlZCB2b2lkIG9uRHJhdyhDYW52YXMgY2FudmFzKSB7CisgICAgICAgICAgICBzdXBlci5vbkRyYXcoY2FudmFzKTsKKworICAgICAgICAgICAgY2FudmFzLnRyYW5zbGF0ZSgxMjAuMGYsIDUwLjBmKTsKKyAgICAgICAgICAgIGNhbnZhcy5kcmF3Qml0bWFwKG1CaXRtYXAxLCBtU3JjUmVjdCwgbURzdFJlY3QsIG1CaXRtYXBQYWludCk7CisKKyAgICAgICAgICAgIGNhbnZhcy50cmFuc2xhdGUoMC4wZiwgbUJpdG1hcDEuZ2V0SGVpZ2h0KCkpOworICAgICAgICAgICAgY2FudmFzLnRyYW5zbGF0ZSgtMTAwLjBmLCAyNS4wZik7CisgICAgICAgICAgICBjYW52YXMuZHJhd0JpdG1hcChtQml0bWFwMSwgbVNyY1JlY3QsIG1Ec3RSZWN0MiwgbUJpdG1hcFBhaW50KTsKKyAgICAgICAgfQorICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9Id0FjY2VsZXJhdGlvblRlc3Qvc3JjL2NvbS9hbmRyb2lkL3Rlc3QvaHd1aS9Db2xvckZpbHRlcnNBY3Rpdml0eS5qYXZhIGIvdGVzdHMvSHdBY2NlbGVyYXRpb25UZXN0L3NyYy9jb20vYW5kcm9pZC90ZXN0L2h3dWkvQ29sb3JGaWx0ZXJzQWN0aXZpdHkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOWQ2M2Q2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvSHdBY2NlbGVyYXRpb25UZXN0L3NyYy9jb20vYW5kcm9pZC90ZXN0L2h3dWkvQ29sb3JGaWx0ZXJzQWN0aXZpdHkuamF2YQpAQCAtMCwwICsxLDk3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC50ZXN0Lmh3dWk7CisKK2ltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eTsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkJpdG1hcDsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkJpdG1hcEZhY3Rvcnk7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5DYW52YXM7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5Db2xvck1hdHJpeDsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkNvbG9yTWF0cml4Q29sb3JGaWx0ZXI7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5MaWdodGluZ0NvbG9yRmlsdGVyOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUGFpbnQ7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5Qb3J0ZXJEdWZmOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUG9ydGVyRHVmZkNvbG9yRmlsdGVyOworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OworCitAU3VwcHJlc3NXYXJuaW5ncyh7IlVudXNlZERlY2xhcmF0aW9uIn0pCitwdWJsaWMgY2xhc3MgQ29sb3JGaWx0ZXJzQWN0aXZpdHkgZXh0ZW5kcyBBY3Rpdml0eSB7CisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25DcmVhdGUoQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgeworICAgICAgICBzdXBlci5vbkNyZWF0ZShzYXZlZEluc3RhbmNlU3RhdGUpOworICAgICAgICBmaW5hbCBCaXRtYXBzVmlldyB2aWV3ID0gbmV3IEJpdG1hcHNWaWV3KHRoaXMpOworICAgICAgICBzZXRDb250ZW50Vmlldyh2aWV3KTsKKyAgICB9CisKKyAgICBzdGF0aWMgY2xhc3MgQml0bWFwc1ZpZXcgZXh0ZW5kcyBWaWV3IHsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBCaXRtYXAgbUJpdG1hcDE7CisgICAgICAgIHByaXZhdGUgZmluYWwgQml0bWFwIG1CaXRtYXAyOworICAgICAgICBwcml2YXRlIGZpbmFsIFBhaW50IG1Db2xvck1hdHJpeFBhaW50OworICAgICAgICBwcml2YXRlIGZpbmFsIFBhaW50IG1MaWdodGluZ1BhaW50OworICAgICAgICBwcml2YXRlIGZpbmFsIFBhaW50IG1CbGVuZFBhaW50OworCisgICAgICAgIEJpdG1hcHNWaWV3KENvbnRleHQgYykgeworICAgICAgICAgICAgc3VwZXIoYyk7CisKKyAgICAgICAgICAgIG1CaXRtYXAxID0gQml0bWFwRmFjdG9yeS5kZWNvZGVSZXNvdXJjZShjLmdldFJlc291cmNlcygpLCBSLmRyYXdhYmxlLnN1bnNldDEpOworICAgICAgICAgICAgbUJpdG1hcDIgPSBCaXRtYXBGYWN0b3J5LmRlY29kZVJlc291cmNlKGMuZ2V0UmVzb3VyY2VzKCksIFIuZHJhd2FibGUuc3Vuc2V0Mik7CisKKyAgICAgICAgICAgIG1Db2xvck1hdHJpeFBhaW50ID0gbmV3IFBhaW50KCk7CisgICAgICAgICAgICBmaW5hbCBDb2xvck1hdHJpeCBjb2xvck1hdHJpeCA9IG5ldyBDb2xvck1hdHJpeCgpOworICAgICAgICAgICAgY29sb3JNYXRyaXguc2V0U2F0dXJhdGlvbigwKTsKKyAgICAgICAgICAgIG1Db2xvck1hdHJpeFBhaW50LnNldENvbG9yRmlsdGVyKG5ldyBDb2xvck1hdHJpeENvbG9yRmlsdGVyKGNvbG9yTWF0cml4KSk7CisKKyAgICAgICAgICAgIG1MaWdodGluZ1BhaW50ID0gbmV3IFBhaW50KCk7CisgICAgICAgICAgICBtTGlnaHRpbmdQYWludC5zZXRDb2xvckZpbHRlcihuZXcgTGlnaHRpbmdDb2xvckZpbHRlcigweDAwNjBmZmZmLCAweDAwMTAxMDMwKSk7CisKKyAgICAgICAgICAgIG1CbGVuZFBhaW50ID0gbmV3IFBhaW50KCk7CisgICAgICAgICAgICBtQmxlbmRQYWludC5zZXRDb2xvckZpbHRlcihuZXcgUG9ydGVyRHVmZkNvbG9yRmlsdGVyKDB4N2Y5OTAwNDAsCisgICAgICAgICAgICAgICAgICAgIFBvcnRlckR1ZmYuTW9kZS5TUkNfT1ZFUikpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHByb3RlY3RlZCB2b2lkIG9uRHJhdyhDYW52YXMgY2FudmFzKSB7CisgICAgICAgICAgICBzdXBlci5vbkRyYXcoY2FudmFzKTsKKworICAgICAgICAgICAgY2FudmFzLmRyYXdBUkdCKDI1NSwgMjU1LCAyNTUsIDI1NSk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGNhbnZhcy5zYXZlKCk7CisgICAgICAgICAgICBjYW52YXMudHJhbnNsYXRlKDEyMC4wZiwgNTAuMGYpOworICAgICAgICAgICAgY2FudmFzLmRyYXdCaXRtYXAobUJpdG1hcDEsIDAuMGYsIDAuMGYsIG1Db2xvck1hdHJpeFBhaW50KTsKKworICAgICAgICAgICAgY2FudmFzLnRyYW5zbGF0ZSgwLjBmLCA1MC4wZiArIG1CaXRtYXAxLmdldEhlaWdodCgpKTsKKyAgICAgICAgICAgIGNhbnZhcy5kcmF3Qml0bWFwKG1CaXRtYXAxLCAwLjBmLCAwLjBmLCBtTGlnaHRpbmdQYWludCk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGNhbnZhcy50cmFuc2xhdGUoMC4wZiwgNTAuMGYgKyBtQml0bWFwMS5nZXRIZWlnaHQoKSk7CisgICAgICAgICAgICBjYW52YXMuZHJhd0JpdG1hcChtQml0bWFwMSwgMC4wZiwgMC4wZiwgbUJsZW5kUGFpbnQpOworICAgICAgICAgICAgY2FudmFzLnJlc3RvcmUoKTsKKworICAgICAgICAgICAgY2FudmFzLnNhdmUoKTsKKyAgICAgICAgICAgIGNhbnZhcy50cmFuc2xhdGUoMTIwLjBmICsgbUJpdG1hcDEuZ2V0V2lkdGgoKSArIDEyMC4wZiwgNTAuMGYpOworICAgICAgICAgICAgY2FudmFzLmRyYXdCaXRtYXAobUJpdG1hcDIsIDAuMGYsIDAuMGYsIG1Db2xvck1hdHJpeFBhaW50KTsKKworICAgICAgICAgICAgY2FudmFzLnRyYW5zbGF0ZSgwLjBmLCA1MC4wZiArIG1CaXRtYXAyLmdldEhlaWdodCgpKTsKKyAgICAgICAgICAgIGNhbnZhcy5kcmF3Qml0bWFwKG1CaXRtYXAyLCAwLjBmLCAwLjBmLCBtTGlnaHRpbmdQYWludCk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGNhbnZhcy50cmFuc2xhdGUoMC4wZiwgNTAuMGYgKyBtQml0bWFwMi5nZXRIZWlnaHQoKSk7CisgICAgICAgICAgICBjYW52YXMuZHJhd0JpdG1hcChtQml0bWFwMiwgMC4wZiwgMC4wZiwgbUJsZW5kUGFpbnQpOworICAgICAgICAgICAgY2FudmFzLnJlc3RvcmUoKTsgICAgICAgICAgICAKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL0h3QWNjZWxlcmF0aW9uVGVzdC9zcmMvY29tL2FuZHJvaWQvdGVzdC9od3VpL0ZyYW1lYnVmZmVyQmxlbmRBY3Rpdml0eS5qYXZhIGIvdGVzdHMvSHdBY2NlbGVyYXRpb25UZXN0L3NyYy9jb20vYW5kcm9pZC90ZXN0L2h3dWkvRnJhbWVidWZmZXJCbGVuZEFjdGl2aXR5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTU1NmJhZQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL0h3QWNjZWxlcmF0aW9uVGVzdC9zcmMvY29tL2FuZHJvaWQvdGVzdC9od3VpL0ZyYW1lYnVmZmVyQmxlbmRBY3Rpdml0eS5qYXZhCkBAIC0wLDAgKzEsMTExIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIGNvbS5hbmRyb2lkLnRlc3QuaHd1aTsKKworaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwRmFjdG9yeTsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkNhbnZhczsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkNvbG9yOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuTGluZWFyR3JhZGllbnQ7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5QYWludDsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlBvcnRlckR1ZmY7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5Qb3J0ZXJEdWZmWGZlcm1vZGU7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5TaGFkZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CisKK0BTdXBwcmVzc1dhcm5pbmdzKHsiVW51c2VkRGVjbGFyYXRpb24ifSkKK3B1YmxpYyBjbGFzcyBGcmFtZWJ1ZmZlckJsZW5kQWN0aXZpdHkgZXh0ZW5kcyBBY3Rpdml0eSB7CisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25DcmVhdGUoQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgeworICAgICAgICBzdXBlci5vbkNyZWF0ZShzYXZlZEluc3RhbmNlU3RhdGUpOworCisgICAgICAgIHNldENvbnRlbnRWaWV3KG5ldyBCbGVuZFZpZXcodGhpcykpOworICAgIH0KKworICAgIHN0YXRpYyBjbGFzcyBCbGVuZFZpZXcgZXh0ZW5kcyBWaWV3IHsKKyAgICAgICAgcHJpdmF0ZSBpbnQgbVRleFdpZHRoOworICAgICAgICBwcml2YXRlIGludCBtVGV4SGVpZ2h0OworICAgICAgICBwcml2YXRlIFBhaW50IG1QYWludDsKKyAgICAgICAgcHJpdmF0ZSBMaW5lYXJHcmFkaWVudCBtSG9yR3JhZGllbnQ7CisgICAgICAgIHByaXZhdGUgQml0bWFwIG1UZXh0dXJlOworCisgICAgICAgIEJsZW5kVmlldyhDb250ZXh0IGMpIHsKKyAgICAgICAgICAgIHN1cGVyKGMpOworCisgICAgICAgICAgICBtVGV4dHVyZSA9IEJpdG1hcEZhY3RvcnkuZGVjb2RlUmVzb3VyY2UoYy5nZXRSZXNvdXJjZXMoKSwgUi5kcmF3YWJsZS5zdW5zZXQxKTsKKyAgICAgICAgICAgIG1UZXhXaWR0aCA9IG1UZXh0dXJlLmdldFdpZHRoKCk7CisgICAgICAgICAgICBtVGV4SGVpZ2h0ID0gbVRleHR1cmUuZ2V0SGVpZ2h0KCk7CisKKyAgICAgICAgICAgIG1Ib3JHcmFkaWVudCA9IG5ldyBMaW5lYXJHcmFkaWVudCgwLjBmLCAwLjBmLCBtVGV4V2lkdGgsIDAuMGYsCisgICAgICAgICAgICAgICAgICAgIENvbG9yLkJMQUNLLCBDb2xvci5XSElURSwgU2hhZGVyLlRpbGVNb2RlLkNMQU1QKTsKKworICAgICAgICAgICAgbVBhaW50ID0gbmV3IFBhaW50KCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHJvdGVjdGVkIHZvaWQgb25EcmF3KENhbnZhcyBjYW52YXMpIHsKKyAgICAgICAgICAgIHN1cGVyLm9uRHJhdyhjYW52YXMpOworICAgICAgICAgICAgY2FudmFzLmRyYXdSR0IoMjU1LCAyNTUsIDI1NSk7CisKKyAgICAgICAgICAgIGNhbnZhcy5zYXZlKCk7CisgICAgICAgICAgICBjYW52YXMudHJhbnNsYXRlKDQwLjBmLCA0MC4wZik7CisKKyAgICAgICAgICAgIGRyYXdCbGVuZGVkQml0bWFwKGNhbnZhcywgUG9ydGVyRHVmZi5Nb2RlLkRBUktFTik7CisgICAgICAgICAgICBkcmF3QmxlbmRlZEJpdG1hcChjYW52YXMsIFBvcnRlckR1ZmYuTW9kZS5MSUdIVEVOKTsKKyAgICAgICAgICAgIGRyYXdCbGVuZGVkQml0bWFwKGNhbnZhcywgUG9ydGVyRHVmZi5Nb2RlLk1VTFRJUExZKTsKKworICAgICAgICAgICAgY2FudmFzLnJlc3RvcmUoKTsKKworICAgICAgICAgICAgY2FudmFzLnNhdmUoKTsKKyAgICAgICAgICAgIGNhbnZhcy50cmFuc2xhdGUoNDAuMGYgKyBtVGV4V2lkdGggKyA0MC4wZiwgNDAuMGYpOworCisgICAgICAgICAgICBkcmF3QmxlbmRlZEJpdG1hcChjYW52YXMsIFBvcnRlckR1ZmYuTW9kZS5TQ1JFRU4pOworICAgICAgICAgICAgZHJhd0JsZW5kZWRCaXRtYXAoY2FudmFzLCBQb3J0ZXJEdWZmLk1vZGUuQUREKTsKKyAgICAgICAgICAgIGRyYXdCbGVuZGVkQml0bWFwSW52ZXJzZShjYW52YXMsIFBvcnRlckR1ZmYuTW9kZS5PVkVSTEFZKTsKKworICAgICAgICAgICAgY2FudmFzLnJlc3RvcmUoKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgdm9pZCBkcmF3QmxlbmRlZEJpdG1hcChDYW52YXMgY2FudmFzLCBQb3J0ZXJEdWZmLk1vZGUgbW9kZSkgeworICAgICAgICAgICAgbVBhaW50LnNldFNoYWRlcihudWxsKTsKKyAgICAgICAgICAgIG1QYWludC5zZXRYZmVybW9kZShudWxsKTsKKyAgICAgICAgICAgIGNhbnZhcy5kcmF3Qml0bWFwKG1UZXh0dXJlLCAwLjBmLCAwLjBmLCBtUGFpbnQpOworCisgICAgICAgICAgICBtUGFpbnQuc2V0U2hhZGVyKG1Ib3JHcmFkaWVudCk7CisgICAgICAgICAgICBtUGFpbnQuc2V0WGZlcm1vZGUobmV3IFBvcnRlckR1ZmZYZmVybW9kZShtb2RlKSk7CisgICAgICAgICAgICBjYW52YXMuZHJhd1JlY3QoMC4wZiwgMC4wZiwgbVRleFdpZHRoLCBtVGV4SGVpZ2h0LCBtUGFpbnQpOworCisgICAgICAgICAgICBjYW52YXMudHJhbnNsYXRlKDAuMGYsIDQwLjBmICsgbVRleEhlaWdodCk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHZvaWQgZHJhd0JsZW5kZWRCaXRtYXBJbnZlcnNlKENhbnZhcyBjYW52YXMsIFBvcnRlckR1ZmYuTW9kZSBtb2RlKSB7CisgICAgICAgICAgICBtUGFpbnQuc2V0WGZlcm1vZGUobnVsbCk7CisgICAgICAgICAgICBtUGFpbnQuc2V0U2hhZGVyKG1Ib3JHcmFkaWVudCk7CisgICAgICAgICAgICBjYW52YXMuZHJhd1JlY3QoMC4wZiwgMC4wZiwgbVRleFdpZHRoLCBtVGV4SGVpZ2h0LCBtUGFpbnQpOworCisgICAgICAgICAgICBtUGFpbnQuc2V0WGZlcm1vZGUobmV3IFBvcnRlckR1ZmZYZmVybW9kZShtb2RlKSk7CisgICAgICAgICAgICBtUGFpbnQuc2V0U2hhZGVyKG51bGwpOworICAgICAgICAgICAgY2FudmFzLmRyYXdCaXRtYXAobVRleHR1cmUsIDAuMGYsIDAuMGYsIG1QYWludCk7CisKKyAgICAgICAgICAgIGNhbnZhcy50cmFuc2xhdGUoMC4wZiwgNDAuMGYgKyBtVGV4SGVpZ2h0KTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL0h3QWNjZWxlcmF0aW9uVGVzdC9zcmMvY29tL2FuZHJvaWQvdGVzdC9od3VpL0xheWVyc0FjdGl2aXR5LmphdmEgYi90ZXN0cy9Id0FjY2VsZXJhdGlvblRlc3Qvc3JjL2NvbS9hbmRyb2lkL3Rlc3QvaHd1aS9MYXllcnNBY3Rpdml0eS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI3MDUxMTcKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9Id0FjY2VsZXJhdGlvblRlc3Qvc3JjL2NvbS9hbmRyb2lkL3Rlc3QvaHd1aS9MYXllcnNBY3Rpdml0eS5qYXZhCkBAIC0wLDAgKzEsMTEwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC50ZXN0Lmh3dWk7CisKK2ltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eTsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkNhbnZhczsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlBhaW50OworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUG9ydGVyRHVmZjsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlBvcnRlckR1ZmZYZmVybW9kZTsKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKKworQFN1cHByZXNzV2FybmluZ3MoeyJVbnVzZWREZWNsYXJhdGlvbiJ9KQorcHVibGljIGNsYXNzIExheWVyc0FjdGl2aXR5IGV4dGVuZHMgQWN0aXZpdHkgeworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG9uQ3JlYXRlKEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpIHsKKyAgICAgICAgc3VwZXIub25DcmVhdGUoc2F2ZWRJbnN0YW5jZVN0YXRlKTsKKyAgICAgICAgc2V0Q29udGVudFZpZXcobmV3IExheWVyc1ZpZXcodGhpcykpOworICAgIH0KKworICAgIHN0YXRpYyBjbGFzcyBMYXllcnNWaWV3IGV4dGVuZHMgVmlldyB7CisgICAgICAgIHByaXZhdGUgUGFpbnQgbUxheWVyUGFpbnQ7CisgICAgICAgIHByaXZhdGUgZmluYWwgUGFpbnQgbVJlY3RQYWludDsKKworICAgICAgICBMYXllcnNWaWV3KENvbnRleHQgYykgeworICAgICAgICAgICAgc3VwZXIoYyk7CisKKyAgICAgICAgICAgIG1MYXllclBhaW50ID0gbmV3IFBhaW50KCk7CisgICAgICAgICAgICBtUmVjdFBhaW50ID0gbmV3IFBhaW50KCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHJvdGVjdGVkIHZvaWQgb25EcmF3KENhbnZhcyBjYW52YXMpIHsKKyAgICAgICAgICAgIHN1cGVyLm9uRHJhdyhjYW52YXMpOworICAgICAgICAgICAgCisgICAgICAgICAgICBjYW52YXMudHJhbnNsYXRlKDE0MC4wZiwgMTAwLjBmKTsKKworICAgICAgICAgICAgLy9jYW52YXMuZHJhd1JHQigyNTUsIDI1NSwgMjU1KTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgaW50IGNvdW50ID0gY2FudmFzLnNhdmVMYXllcigwLjBmLCAwLjBmLCAyMDAuMGYsIDEwMC4wZiwgbUxheWVyUGFpbnQsCisgICAgICAgICAgICAgICAgICAgIENhbnZhcy5BTExfU0FWRV9GTEFHKTsKKworICAgICAgICAgICAgbVJlY3RQYWludC5zZXRDb2xvcigweGZmZmYwMDAwKTsKKyAgICAgICAgICAgIGNhbnZhcy5kcmF3UmVjdCgwLjBmLCAwLjBmLCAyMDAuMGYsIDEwMC4wZiwgbVJlY3RQYWludCk7CisKKyAgICAgICAgICAgIGNhbnZhcy5yZXN0b3JlVG9Db3VudChjb3VudCk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGNhbnZhcy50cmFuc2xhdGUoMC4wZiwgMTI1LjBmKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgY291bnQgPSBjYW52YXMuc2F2ZUxheWVyKDAuMGYsIDAuMGYsIDIwMC4wZiwgMTAwLjBmLCBtTGF5ZXJQYWludCwKKyAgICAgICAgICAgICAgICAgICAgQ2FudmFzLkFMTF9TQVZFX0ZMQUcpOworCisgICAgICAgICAgICBtUmVjdFBhaW50LnNldENvbG9yKDB4ZmYwMGZmMDApOworICAgICAgICAgICAgbVJlY3RQYWludC5zZXRBbHBoYSg1MCk7CisgICAgICAgICAgICBjYW52YXMuZHJhd1JlY3QoMC4wZiwgMC4wZiwgMjAwLjBmLCAxMDAuMGYsIG1SZWN0UGFpbnQpOworCisgICAgICAgICAgICBjYW52YXMucmVzdG9yZVRvQ291bnQoY291bnQpOworCisgICAgICAgICAgICBjYW52YXMudHJhbnNsYXRlKDI1LjBmLCAxMjUuMGYpOworCisgICAgICAgICAgICBtUmVjdFBhaW50LnNldENvbG9yKDB4ZmYwMDAwZmYpOworICAgICAgICAgICAgbVJlY3RQYWludC5zZXRBbHBoYSgyNTUpOworICAgICAgICAgICAgY2FudmFzLmRyYXdSZWN0KDAuMGYsIDAuMGYsIDEwMC4wZiwgNTAuMGYsIG1SZWN0UGFpbnQpOyAgICAgICAgICAgIAorICAgICAgICAgICAgCisgICAgICAgICAgICBtTGF5ZXJQYWludC5zZXRBbHBoYSgxMjcpOworICAgICAgICAgICAgbUxheWVyUGFpbnQuc2V0WGZlcm1vZGUobmV3IFBvcnRlckR1ZmZYZmVybW9kZShQb3J0ZXJEdWZmLk1vZGUuU1JDX09VVCkpOworICAgICAgICAgICAgY291bnQgPSBjYW52YXMuc2F2ZUxheWVyKDUwLjBmLCAyNS4wZiwgMTUwLjBmLCA3NS4wZiwgbUxheWVyUGFpbnQsCisgICAgICAgICAgICAgICAgICAgIENhbnZhcy5BTExfU0FWRV9GTEFHKTsKKworICAgICAgICAgICAgbVJlY3RQYWludC5zZXRDb2xvcigweGZmZmYwMDAwKTsKKyAgICAgICAgICAgIGNhbnZhcy5kcmF3UmVjdCg1MC4wZiwgMjUuMGYsIDE1MC4wZiwgNzUuMGYsIG1SZWN0UGFpbnQpOworCisgICAgICAgICAgICBjYW52YXMucmVzdG9yZVRvQ291bnQoY291bnQpOworICAgICAgICAgICAgCisgICAgICAgICAgICBjYW52YXMudHJhbnNsYXRlKDAuMGYsIDEyNS4wZik7CisKKyAgICAgICAgICAgIG1SZWN0UGFpbnQuc2V0Q29sb3IoMHhmZjAwMDBmZik7CisgICAgICAgICAgICBtUmVjdFBhaW50LnNldEFscGhhKDI1NSk7CisgICAgICAgICAgICBjYW52YXMuZHJhd1JlY3QoMC4wZiwgMC4wZiwgMTAwLjBmLCA1MC4wZiwgbVJlY3RQYWludCk7ICAgICAgICAgICAgCisgICAgICAgICAgICAKKyAgICAgICAgICAgIG1MYXllclBhaW50LnNldENvbG9yKDB4ZmZmZjAwMDApOworICAgICAgICAgICAgbUxheWVyUGFpbnQuc2V0QWxwaGEoMTI3KTsKKyAgICAgICAgICAgIG1MYXllclBhaW50LnNldFhmZXJtb2RlKG5ldyBQb3J0ZXJEdWZmWGZlcm1vZGUoUG9ydGVyRHVmZi5Nb2RlLkRTVF9BVE9QKSk7CisgICAgICAgICAgICBjb3VudCA9IGNhbnZhcy5zYXZlTGF5ZXIoNTAuMGYsIDI1LjBmLCAxNTAuMGYsIDc1LjBmLCBtTGF5ZXJQYWludCwKKyAgICAgICAgICAgICAgICAgICAgQ2FudmFzLkFMTF9TQVZFX0ZMQUcpOworCisgICAgICAgICAgICBtUmVjdFBhaW50LnNldENvbG9yKDB4ZmZmZjAwMDApOworICAgICAgICAgICAgY2FudmFzLmRyYXdSZWN0KDUwLjBmLCAyNS4wZiwgMTUwLjBmLCA3NS4wZiwgbVJlY3RQYWludCk7CisKKyAgICAgICAgICAgIGNhbnZhcy5yZXN0b3JlVG9Db3VudChjb3VudCk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIG1MYXllclBhaW50ID0gbmV3IFBhaW50KCk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9Id0FjY2VsZXJhdGlvblRlc3Qvc3JjL2NvbS9hbmRyb2lkL3Rlc3QvaHd1aS9MaW5lc0FjdGl2aXR5LmphdmEgYi90ZXN0cy9Id0FjY2VsZXJhdGlvblRlc3Qvc3JjL2NvbS9hbmRyb2lkL3Rlc3QvaHd1aS9MaW5lc0FjdGl2aXR5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjA4ZGQ4OAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL0h3QWNjZWxlcmF0aW9uVGVzdC9zcmMvY29tL2FuZHJvaWQvdGVzdC9od3VpL0xpbmVzQWN0aXZpdHkuamF2YQpAQCAtMCwwICsxLDEwOSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQudGVzdC5od3VpOworCitpbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHk7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5CaXRtYXA7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5CaXRtYXBGYWN0b3J5OworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwU2hhZGVyOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQ2FudmFzOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUGFpbnQ7CitpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CisKK0BTdXBwcmVzc1dhcm5pbmdzKHsiVW51c2VkRGVjbGFyYXRpb24ifSkKK3B1YmxpYyBjbGFzcyBMaW5lc0FjdGl2aXR5IGV4dGVuZHMgQWN0aXZpdHkgeworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG9uQ3JlYXRlKEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpIHsKKyAgICAgICAgc3VwZXIub25DcmVhdGUoc2F2ZWRJbnN0YW5jZVN0YXRlKTsKKyAgICAgICAgZmluYWwgTGluZXNWaWV3IHZpZXcgPSBuZXcgTGluZXNWaWV3KHRoaXMpOworICAgICAgICBzZXRDb250ZW50Vmlldyh2aWV3KTsKKyAgICB9CisKKyAgICBzdGF0aWMgY2xhc3MgTGluZXNWaWV3IGV4dGVuZHMgVmlldyB7CisgICAgICAgIHByaXZhdGUgZmluYWwgQml0bWFwIG1CaXRtYXAxOworICAgICAgICBwcml2YXRlIGZpbmFsIFBhaW50IG1TbWFsbFBhaW50OworICAgICAgICBwcml2YXRlIGZpbmFsIFBhaW50IG1NZWRpdW1QYWludDsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBQYWludCBtTGFyZ2VQYWludDsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBCaXRtYXBTaGFkZXIgbVNoYWRlcjsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBmbG9hdFtdIG1Qb2ludHM7CisgICAgICAgIHByaXZhdGUgZmluYWwgUGFpbnQgbUFscGhhUGFpbnQ7CisKKyAgICAgICAgTGluZXNWaWV3KENvbnRleHQgYykgeworICAgICAgICAgICAgc3VwZXIoYyk7CisKKyAgICAgICAgICAgIG1CaXRtYXAxID0gQml0bWFwRmFjdG9yeS5kZWNvZGVSZXNvdXJjZShjLmdldFJlc291cmNlcygpLCBSLmRyYXdhYmxlLnN1bnNldDEpOworCisgICAgICAgICAgICBtU21hbGxQYWludCA9IG5ldyBQYWludCgpOworICAgICAgICAgICAgbVNtYWxsUGFpbnQuc2V0QW50aUFsaWFzKHRydWUpOworICAgICAgICAgICAgbVNtYWxsUGFpbnQuc2V0Q29sb3IoMHhmZmZmMDAwMCk7CisgICAgICAgICAgICBtU21hbGxQYWludC5zZXRTdHJva2VXaWR0aCgxLjBmKTsKKworICAgICAgICAgICAgbU1lZGl1bVBhaW50ID0gbmV3IFBhaW50KCk7CisgICAgICAgICAgICBtTWVkaXVtUGFpbnQuc2V0QW50aUFsaWFzKHRydWUpOworICAgICAgICAgICAgbU1lZGl1bVBhaW50LnNldENvbG9yKDB4ZmYwMDAwZmYpOworICAgICAgICAgICAgbU1lZGl1bVBhaW50LnNldFN0cm9rZVdpZHRoKDQuMGYpOworCisgICAgICAgICAgICBtTGFyZ2VQYWludCA9IG5ldyBQYWludCgpOworICAgICAgICAgICAgbUxhcmdlUGFpbnQuc2V0QW50aUFsaWFzKHRydWUpOworICAgICAgICAgICAgbUxhcmdlUGFpbnQuc2V0Q29sb3IoMHhmZjAwZmYwMCk7CisgICAgICAgICAgICBtTGFyZ2VQYWludC5zZXRTdHJva2VXaWR0aCgxNS4wZik7CisKKyAgICAgICAgICAgIG1BbHBoYVBhaW50ID0gbmV3IFBhaW50KCk7CisgICAgICAgICAgICBtQWxwaGFQYWludC5zZXRBbnRpQWxpYXModHJ1ZSk7CisgICAgICAgICAgICBtQWxwaGFQYWludC5zZXRDb2xvcigweDdmZmYwMDUwKTsKKyAgICAgICAgICAgIG1BbHBoYVBhaW50LnNldFN0cm9rZVdpZHRoKDEwLjBmKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgbVNoYWRlciA9IG5ldyBCaXRtYXBTaGFkZXIobUJpdG1hcDEsIEJpdG1hcFNoYWRlci5UaWxlTW9kZS5NSVJST1IsCisgICAgICAgICAgICAgICAgICAgIEJpdG1hcFNoYWRlci5UaWxlTW9kZS5NSVJST1IpOworCisgICAgICAgICAgICBtUG9pbnRzID0gbmV3IGZsb2F0W10geworICAgICAgICAgICAgICAgICAgICA2Mi4wZiwgMC4wZiwgMzAyLjBmLCA0MDAuMGYsCisgICAgICAgICAgICAgICAgICAgIDMwMi4wZiwgNDAwLjBmLCAzNTIuMGYsIDQwMC4wZiwKKyAgICAgICAgICAgICAgICAgICAgMzUyLjBmLCA0MDAuMGYsIDM1Mi4wZiwgNTAwLjBmCisgICAgICAgICAgICB9OworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHByb3RlY3RlZCB2b2lkIG9uRHJhdyhDYW52YXMgY2FudmFzKSB7CisgICAgICAgICAgICBzdXBlci5vbkRyYXcoY2FudmFzKTsKKworICAgICAgICAgICAgY2FudmFzLmRyYXdBUkdCKDI1NSwgMjU1LCAyNTUsIDI1NSk7CisKKyAgICAgICAgICAgIGNhbnZhcy5zYXZlKCk7CisgICAgICAgICAgICBjYW52YXMudHJhbnNsYXRlKDEwMC4wZiwgMjAuMGYpOworCisgICAgICAgICAgICBjYW52YXMuZHJhd0xpbmUoMC4wZiwgMC4wZiwgNDAuMGYsIDQwMC4wZiwgbVNtYWxsUGFpbnQpOworICAgICAgICAgICAgY2FudmFzLmRyYXdMaW5lKDUuMGYsIDAuMGYsIDk1LjBmLCA0MDAuMGYsIG1NZWRpdW1QYWludCk7CisgICAgICAgICAgICBjYW52YXMuZHJhd0xpbmUoMjIuMGYsIDAuMGYsIDE2Mi4wZiwgNDAwLjBmLCBtTGFyZ2VQYWludCk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIG1MYXJnZVBhaW50LnNldFNoYWRlcihtU2hhZGVyKTsKKyAgICAgICAgICAgIGNhbnZhcy5kcmF3TGluZSg0Mi4wZiwgMC4wZiwgMjIyLjBmLCA0MDAuMGYsIG1MYXJnZVBhaW50KTsKKyAgICAgICAgICAgIG1MYXJnZVBhaW50LnNldFNoYWRlcihudWxsKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgY2FudmFzLmRyYXdMaW5lcyhtUG9pbnRzLCBtQWxwaGFQYWludCk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGNhbnZhcy50cmFuc2xhdGUoMTIwLjBmLCAwLjBmKTsKKyAgICAgICAgICAgIG1BbHBoYVBhaW50LnNldFNoYWRlcihtU2hhZGVyKTsgICAgICAgICAgICAKKyAgICAgICAgICAgIGNhbnZhcy5kcmF3TGluZXMobVBvaW50cywgbUFscGhhUGFpbnQpOworICAgICAgICAgICAgbUFscGhhUGFpbnQuc2V0U2hhZGVyKG51bGwpOworCisgICAgICAgICAgICBjYW52YXMucmVzdG9yZSgpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvSHdBY2NlbGVyYXRpb25UZXN0L3NyYy9jb20vYW5kcm9pZC90ZXN0L2h3dWkvTGlzdEFjdGl2aXR5LmphdmEgYi90ZXN0cy9Id0FjY2VsZXJhdGlvblRlc3Qvc3JjL2NvbS9hbmRyb2lkL3Rlc3QvaHd1aS9MaXN0QWN0aXZpdHkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZmQ0ZjZiCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvSHdBY2NlbGVyYXRpb25UZXN0L3NyYy9jb20vYW5kcm9pZC90ZXN0L2h3dWkvTGlzdEFjdGl2aXR5LmphdmEKQEAgLTAsMCArMSwxMTYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLnRlc3QuaHd1aTsKKworaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuUmVzb3VyY2VzOworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworaW1wb3J0IGFuZHJvaWQudXRpbC5EaXNwbGF5TWV0cmljczsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuQ29udGV4dE1lbnU7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXdHcm91cDsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5BcnJheUFkYXB0ZXI7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuTGlzdEFkYXB0ZXI7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuTGlzdFZpZXc7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuVGV4dFZpZXc7CisKK0BTdXBwcmVzc1dhcm5pbmdzKHsiVW51c2VkRGVjbGFyYXRpb24ifSkKK3B1YmxpYyBjbGFzcyBMaXN0QWN0aXZpdHkgZXh0ZW5kcyBBY3Rpdml0eSB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gREFUQV9MSVNUID0geworICAgICAgICAgICAgIkFmZ2hhbmlzdGFuIiwgIkFsYmFuaWEiLCAiQWxnZXJpYSIsICJBbWVyaWNhbiBTYW1vYSIsICJBbmRvcnJhIiwKKyAgICAgICAgICAgICJBbmdvbGEiLCAiQW5ndWlsbGEiLCAiQW50YXJjdGljYSIsICJBbnRpZ3VhIGFuZCBCYXJidWRhIiwgIkFyZ2VudGluYSIsCisgICAgICAgICAgICAiQXJtZW5pYSIsICJBcnViYSIsICJBdXN0cmFsaWEiLCAiQXVzdHJpYSIsICJBemVyYmFpamFuIiwKKyAgICAgICAgICAgICJCYWhyYWluIiwgIkJhbmdsYWRlc2giLCAiQmFyYmFkb3MiLCAiQmVsYXJ1cyIsICJCZWxnaXVtIiwKKyAgICAgICAgICAgICJCZWxpemUiLCAiQmVuaW4iLCAiQmVybXVkYSIsICJCaHV0YW4iLCAiQm9saXZpYSIsCisgICAgICAgICAgICAiQm9zbmlhIGFuZCBIZXJ6ZWdvdmluYSIsICJCb3Rzd2FuYSIsICJCb3V2ZXQgSXNsYW5kIiwgIkJyYXppbCIsCisgICAgICAgICAgICAiQnJpdGlzaCBJbmRpYW4gT2NlYW4gVGVycml0b3J5IiwgIkJyaXRpc2ggVmlyZ2luIElzbGFuZHMiLCAiQnJ1bmVpIiwgIkJ1bGdhcmlhIiwKKyAgICAgICAgICAgICJCdXJraW5hIEZhc28iLCAiQnVydW5kaSIsICJDb3RlIGQnSXZvaXJlIiwgIkNhbWJvZGlhIiwgIkNhbWVyb29uIiwgIkNhbmFkYSIsICJDYXBlIFZlcmRlIiwKKyAgICAgICAgICAgICJDYXltYW4gSXNsYW5kcyIsICJDZW50cmFsIEFmcmljYW4gUmVwdWJsaWMiLCAiQ2hhZCIsICJDaGlsZSIsICJDaGluYSIsCisgICAgICAgICAgICAiQ2hyaXN0bWFzIElzbGFuZCIsICJDb2NvcyAoS2VlbGluZykgSXNsYW5kcyIsICJDb2xvbWJpYSIsICJDb21vcm9zIiwgIkNvbmdvIiwKKyAgICAgICAgICAgICJDb29rIElzbGFuZHMiLCAiQ29zdGEgUmljYSIsICJDcm9hdGlhIiwgIkN1YmEiLCAiQ3lwcnVzIiwgIkN6ZWNoIFJlcHVibGljIiwKKyAgICAgICAgICAgICJEZW1vY3JhdGljIFJlcHVibGljIG9mIHRoZSBDb25nbyIsICJEZW5tYXJrIiwgIkRqaWJvdXRpIiwgIkRvbWluaWNhIiwgIkRvbWluaWNhbiBSZXB1YmxpYyIsCisgICAgICAgICAgICAiRWFzdCBUaW1vciIsICJFY3VhZG9yIiwgIkVneXB0IiwgIkVsIFNhbHZhZG9yIiwgIkVxdWF0b3JpYWwgR3VpbmVhIiwgIkVyaXRyZWEiLAorICAgICAgICAgICAgIkVzdG9uaWEiLCAiRXRoaW9waWEiLCAiRmFlcm9lIElzbGFuZHMiLCAiRmFsa2xhbmQgSXNsYW5kcyIsICJGaWppIiwgIkZpbmxhbmQiLAorICAgICAgICAgICAgIkZvcm1lciBZdWdvc2xhdiBSZXB1YmxpYyBvZiBNYWNlZG9uaWEiLCAiRnJhbmNlIiwgIkZyZW5jaCBHdWlhbmEiLCAiRnJlbmNoIFBvbHluZXNpYSIsCisgICAgICAgICAgICAiRnJlbmNoIFNvdXRoZXJuIFRlcnJpdG9yaWVzIiwgIkdhYm9uIiwgIkdlb3JnaWEiLCAiR2VybWFueSIsICJHaGFuYSIsICJHaWJyYWx0YXIiLAorICAgICAgICAgICAgIkdyZWVjZSIsICJHcmVlbmxhbmQiLCAiR3JlbmFkYSIsICJHdWFkZWxvdXBlIiwgIkd1YW0iLCAiR3VhdGVtYWxhIiwgIkd1aW5lYSIsICJHdWluZWEtQmlzc2F1IiwKKyAgICAgICAgICAgICJHdXlhbmEiLCAiSGFpdGkiLCAiSGVhcmQgSXNsYW5kIGFuZCBNY0RvbmFsZCBJc2xhbmRzIiwgIkhvbmR1cmFzIiwgIkhvbmcgS29uZyIsICJIdW5nYXJ5IiwKKyAgICAgICAgICAgICJJY2VsYW5kIiwgIkluZGlhIiwgIkluZG9uZXNpYSIsICJJcmFuIiwgIklyYXEiLCAiSXJlbGFuZCIsICJJc3JhZWwiLCAiSXRhbHkiLCAiSmFtYWljYSIsCisgICAgICAgICAgICAiSmFwYW4iLCAiSm9yZGFuIiwgIkthemFraHN0YW4iLCAiS2VueWEiLCAiS2lyaWJhdGkiLCAiS3V3YWl0IiwgIkt5cmd5enN0YW4iLCAiTGFvcyIsCisgICAgICAgICAgICAiTGF0dmlhIiwgIkxlYmFub24iLCAiTGVzb3RobyIsICJMaWJlcmlhIiwgIkxpYnlhIiwgIkxpZWNodGVuc3RlaW4iLCAiTGl0aHVhbmlhIiwgIkx1eGVtYm91cmciLAorICAgICAgICAgICAgIk1hY2F1IiwgIk1hZGFnYXNjYXIiLCAiTWFsYXdpIiwgIk1hbGF5c2lhIiwgIk1hbGRpdmVzIiwgIk1hbGkiLCAiTWFsdGEiLCAiTWFyc2hhbGwgSXNsYW5kcyIsCisgICAgICAgICAgICAiTWFydGluaXF1ZSIsICJNYXVyaXRhbmlhIiwgIk1hdXJpdGl1cyIsICJNYXlvdHRlIiwgIk1leGljbyIsICJNaWNyb25lc2lhIiwgIk1vbGRvdmEiLAorICAgICAgICAgICAgIk1vbmFjbyIsICJNb25nb2xpYSIsICJNb250c2VycmF0IiwgIk1vcm9jY28iLCAiTW96YW1iaXF1ZSIsICJNeWFubWFyIiwgIk5hbWliaWEiLAorICAgICAgICAgICAgIk5hdXJ1IiwgIk5lcGFsIiwgIk5ldGhlcmxhbmRzIiwgIk5ldGhlcmxhbmRzIEFudGlsbGVzIiwgIk5ldyBDYWxlZG9uaWEiLCAiTmV3IFplYWxhbmQiLAorICAgICAgICAgICAgIk5pY2FyYWd1YSIsICJOaWdlciIsICJOaWdlcmlhIiwgIk5pdWUiLCAiTm9yZm9sayBJc2xhbmQiLCAiTm9ydGggS29yZWEiLCAiTm9ydGhlcm4gTWFyaWFuYXMiLAorICAgICAgICAgICAgIk5vcndheSIsICJPbWFuIiwgIlBha2lzdGFuIiwgIlBhbGF1IiwgIlBhbmFtYSIsICJQYXB1YSBOZXcgR3VpbmVhIiwgIlBhcmFndWF5IiwgIlBlcnUiLAorICAgICAgICAgICAgIlBoaWxpcHBpbmVzIiwgIlBpdGNhaXJuIElzbGFuZHMiLCAiUG9sYW5kIiwgIlBvcnR1Z2FsIiwgIlB1ZXJ0byBSaWNvIiwgIlFhdGFyIiwKKyAgICAgICAgICAgICJSZXVuaW9uIiwgIlJvbWFuaWEiLCAiUnVzc2lhIiwgIlJ3YW5kYSIsICJTcW8gVG9tZSBhbmQgUHJpbmNpcGUiLCAiU2FpbnQgSGVsZW5hIiwKKyAgICAgICAgICAgICJTYWludCBLaXR0cyBhbmQgTmV2aXMiLCAiU2FpbnQgTHVjaWEiLCAiU2FpbnQgUGllcnJlIGFuZCBNaXF1ZWxvbiIsCisgICAgICAgICAgICAiU2FpbnQgVmluY2VudCBhbmQgdGhlIEdyZW5hZGluZXMiLCAiU2Ftb2EiLCAiU2FuIE1hcmlubyIsICJTYXVkaSBBcmFiaWEiLCAiU2VuZWdhbCIsCisgICAgICAgICAgICAiU2V5Y2hlbGxlcyIsICJTaWVycmEgTGVvbmUiLCAiU2luZ2Fwb3JlIiwgIlNsb3Zha2lhIiwgIlNsb3ZlbmlhIiwgIlNvbG9tb24gSXNsYW5kcyIsCisgICAgICAgICAgICAiU29tYWxpYSIsICJTb3V0aCBBZnJpY2EiLCAiU291dGggR2VvcmdpYSBhbmQgdGhlIFNvdXRoIFNhbmR3aWNoIElzbGFuZHMiLCAiU291dGggS29yZWEiLAorICAgICAgICAgICAgIlNwYWluIiwgIlNyaSBMYW5rYSIsICJTdWRhbiIsICJTdXJpbmFtZSIsICJTdmFsYmFyZCBhbmQgSmFuIE1heWVuIiwgIlN3YXppbGFuZCIsICJTd2VkZW4iLAorICAgICAgICAgICAgIlN3aXR6ZXJsYW5kIiwgIlN5cmlhIiwgIlRhaXdhbiIsICJUYWppa2lzdGFuIiwgIlRhbnphbmlhIiwgIlRoYWlsYW5kIiwgIlRoZSBCYWhhbWFzIiwKKyAgICAgICAgICAgICJUaGUgR2FtYmlhIiwgIlRvZ28iLCAiVG9rZWxhdSIsICJUb25nYSIsICJUcmluaWRhZCBhbmQgVG9iYWdvIiwgIlR1bmlzaWEiLCAiVHVya2V5IiwKKyAgICAgICAgICAgICJUdXJrbWVuaXN0YW4iLCAiVHVya3MgYW5kIENhaWNvcyBJc2xhbmRzIiwgIlR1dmFsdSIsICJWaXJnaW4gSXNsYW5kcyIsICJVZ2FuZGEiLAorICAgICAgICAgICAgIlVrcmFpbmUiLCAiVW5pdGVkIEFyYWIgRW1pcmF0ZXMiLCAiVW5pdGVkIEtpbmdkb20iLAorICAgICAgICAgICAgIlVuaXRlZCBTdGF0ZXMiLCAiVW5pdGVkIFN0YXRlcyBNaW5vciBPdXRseWluZyBJc2xhbmRzIiwgIlVydWd1YXkiLCAiVXpiZWtpc3RhbiIsCisgICAgICAgICAgICAiVmFudWF0dSIsICJWYXRpY2FuIENpdHkiLCAiVmVuZXp1ZWxhIiwgIlZpZXRuYW0iLCAiV2FsbGlzIGFuZCBGdXR1bmEiLCAiV2VzdGVybiBTYWhhcmEiLAorICAgICAgICAgICAgIlllbWVuIiwgIll1Z29zbGF2aWEiLCAiWmFtYmlhIiwgIlppbWJhYndlIgorICAgIH07CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvbkNyZWF0ZShCdW5kbGUgc2F2ZWRJbnN0YW5jZVN0YXRlKSB7CisgICAgICAgIHN1cGVyLm9uQ3JlYXRlKHNhdmVkSW5zdGFuY2VTdGF0ZSk7CisgICAgICAgIHNldENvbnRlbnRWaWV3KFIubGF5b3V0Lmxpc3RfYWN0aXZpdHkpOworCisgICAgICAgIExpc3RBZGFwdGVyIGFkYXB0ZXIgPSBuZXcgU2ltcGxlTGlzdEFkYXB0ZXIodGhpcyk7CisKKyAgICAgICAgTGlzdFZpZXcgbGlzdCA9IChMaXN0VmlldykgZmluZFZpZXdCeUlkKFIuaWQubGlzdCk7CisgICAgICAgIGxpc3Quc2V0QWRhcHRlcihhZGFwdGVyKTsKKyAgICAgICAgCisgICAgICAgIHJlZ2lzdGVyRm9yQ29udGV4dE1lbnUobGlzdCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb25DcmVhdGVDb250ZXh0TWVudShDb250ZXh0TWVudSBtZW51LCBWaWV3IHYsIENvbnRleHRNZW51LkNvbnRleHRNZW51SW5mbyBtZW51SW5mbykgeworICAgICAgICBzdXBlci5vbkNyZWF0ZUNvbnRleHRNZW51KG1lbnUsIHYsIG1lbnVJbmZvKTsKKyAgICAgICAgbWVudS5zZXRIZWFkZXJUaXRsZSgiQ29udGV4dCBtZW51Iik7CisgICAgICAgIG1lbnUuYWRkKCJMaXN0IGl0ZW0gMSIpOworICAgICAgICBtZW51LmFkZCgiTGlzdCBpdGVtIDIiKTsKKyAgICAgICAgbWVudS5hZGQoIkxpc3QgaXRlbSAzIik7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgU2ltcGxlTGlzdEFkYXB0ZXIgZXh0ZW5kcyBBcnJheUFkYXB0ZXI8U3RyaW5nPiB7CisgICAgICAgIHB1YmxpYyBTaW1wbGVMaXN0QWRhcHRlcihDb250ZXh0IGNvbnRleHQpIHsKKyAgICAgICAgICAgIHN1cGVyKGNvbnRleHQsIGFuZHJvaWQuUi5sYXlvdXQuc2ltcGxlX2xpc3RfaXRlbV8xLCBEQVRBX0xJU1QpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBWaWV3IGdldFZpZXcoaW50IHBvc2l0aW9uLCBWaWV3IGNvbnZlcnRWaWV3LCBWaWV3R3JvdXAgcGFyZW50KSB7CisgICAgICAgICAgICBUZXh0VmlldyB2ID0gKFRleHRWaWV3KSBzdXBlci5nZXRWaWV3KHBvc2l0aW9uLCBjb252ZXJ0VmlldywgcGFyZW50KTsKKyAgICAgICAgICAgIGZpbmFsIFJlc291cmNlcyByID0gZ2V0Q29udGV4dCgpLmdldFJlc291cmNlcygpOworICAgICAgICAgICAgZmluYWwgRGlzcGxheU1ldHJpY3MgbWV0cmljcyA9IHIuZ2V0RGlzcGxheU1ldHJpY3MoKTsKKyAgICAgICAgICAgIHYuc2V0Q29tcG91bmREcmF3YWJsZVBhZGRpbmcoKGludCkgKDYgKiBtZXRyaWNzLmRlbnNpdHkgKyAwLjVmKSk7CisgICAgICAgICAgICB2LnNldENvbXBvdW5kRHJhd2FibGVzV2l0aEludHJpbnNpY0JvdW5kcyhyLmdldERyYXdhYmxlKFIuZHJhd2FibGUuaWNvbiksCisgICAgICAgICAgICAgICAgICAgIG51bGwsIG51bGwsIG51bGwpOworICAgICAgICAgICAgcmV0dXJuIHY7CisgICAgICAgIH0KKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvSHdBY2NlbGVyYXRpb25UZXN0L3NyYy9jb20vYW5kcm9pZC90ZXN0L2h3dWkvTW9yZVNoYWRlcnNBY3Rpdml0eS5qYXZhIGIvdGVzdHMvSHdBY2NlbGVyYXRpb25UZXN0L3NyYy9jb20vYW5kcm9pZC90ZXN0L2h3dWkvTW9yZVNoYWRlcnNBY3Rpdml0eS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE4MmE0NzQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9Id0FjY2VsZXJhdGlvblRlc3Qvc3JjL2NvbS9hbmRyb2lkL3Rlc3QvaHd1aS9Nb3JlU2hhZGVyc0FjdGl2aXR5LmphdmEKQEAgLTAsMCArMSwxNDEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLnRlc3QuaHd1aTsKKworaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwRmFjdG9yeTsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkJpdG1hcFNoYWRlcjsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkNhbnZhczsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkNvbG9yOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQ29sb3JGaWx0ZXI7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5Db21wb3NlU2hhZGVyOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuTGlnaHRpbmdDb2xvckZpbHRlcjsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkxpbmVhckdyYWRpZW50OworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuTWF0cml4OworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUGFpbnQ7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5Qb3J0ZXJEdWZmOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuU2hhZGVyOworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OworCitAU3VwcHJlc3NXYXJuaW5ncyh7IlVudXNlZERlY2xhcmF0aW9uIn0pCitwdWJsaWMgY2xhc3MgTW9yZVNoYWRlcnNBY3Rpdml0eSBleHRlbmRzIEFjdGl2aXR5IHsKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvbkNyZWF0ZShCdW5kbGUgc2F2ZWRJbnN0YW5jZVN0YXRlKSB7CisgICAgICAgIHN1cGVyLm9uQ3JlYXRlKHNhdmVkSW5zdGFuY2VTdGF0ZSk7CisKKyAgICAgICAgc2V0Q29udGVudFZpZXcobmV3IFNoYWRlcnNWaWV3KHRoaXMpKTsKKyAgICB9CisKKyAgICBzdGF0aWMgY2xhc3MgU2hhZGVyc1ZpZXcgZXh0ZW5kcyBWaWV3IHsKKyAgICAgICAgcHJpdmF0ZSBCaXRtYXBTaGFkZXIgbVNjYWxlZFNoYWRlcjsKKyAgICAgICAgcHJpdmF0ZSBpbnQgbVRleFdpZHRoOworICAgICAgICBwcml2YXRlIGludCBtVGV4SGVpZ2h0OworICAgICAgICBwcml2YXRlIFBhaW50IG1QYWludDsKKyAgICAgICAgcHJpdmF0ZSBmbG9hdCBtRHJhd1dpZHRoOworICAgICAgICBwcml2YXRlIGZsb2F0IG1EcmF3SGVpZ2h0OworICAgICAgICBwcml2YXRlIExpbmVhckdyYWRpZW50IG1Ib3JHcmFkaWVudDsKKyAgICAgICAgcHJpdmF0ZSBMaW5lYXJHcmFkaWVudCBtVmVydEdyYWRpZW50OworICAgICAgICBwcml2YXRlIENvbXBvc2VTaGFkZXIgbUNvbXBvc2VTaGFkZXI7CisgICAgICAgIHByaXZhdGUgQ29tcG9zZVNoYWRlciBtQ29tcG9zZTJTaGFkZXI7CisgICAgICAgIHByaXZhdGUgUGFpbnQgbUxhcmdlUGFpbnQ7CisgICAgICAgIHByaXZhdGUgQml0bWFwU2hhZGVyIG1TY2FsZWQyU2hhZGVyOworICAgICAgICBwcml2YXRlIENvbG9yRmlsdGVyIG1Db2xvckZpbHRlcjsKKworICAgICAgICBTaGFkZXJzVmlldyhDb250ZXh0IGMpIHsKKyAgICAgICAgICAgIHN1cGVyKGMpOworCisgICAgICAgICAgICBCaXRtYXAgdGV4dHVyZSA9IEJpdG1hcEZhY3RvcnkuZGVjb2RlUmVzb3VyY2UoYy5nZXRSZXNvdXJjZXMoKSwgUi5kcmF3YWJsZS5zdW5zZXQxKTsKKyAgICAgICAgICAgIG1UZXhXaWR0aCA9IHRleHR1cmUuZ2V0V2lkdGgoKTsKKyAgICAgICAgICAgIG1UZXhIZWlnaHQgPSB0ZXh0dXJlLmdldEhlaWdodCgpOworICAgICAgICAgICAgbURyYXdXaWR0aCA9IG1UZXhXaWR0aCAqIDIuMmY7CisgICAgICAgICAgICBtRHJhd0hlaWdodCA9IG1UZXhIZWlnaHQgKiAxLjJmOworCisgICAgICAgICAgICBtU2NhbGVkU2hhZGVyID0gbmV3IEJpdG1hcFNoYWRlcih0ZXh0dXJlLCBTaGFkZXIuVGlsZU1vZGUuTUlSUk9SLAorICAgICAgICAgICAgICAgICAgICBTaGFkZXIuVGlsZU1vZGUuTUlSUk9SKTsKKyAgICAgICAgICAgIE1hdHJpeCBtMiA9IG5ldyBNYXRyaXgoKTsKKyAgICAgICAgICAgIG0yLnNldFNjYWxlKDAuNWYsIDAuNWYpOworICAgICAgICAgICAgbVNjYWxlZFNoYWRlci5zZXRMb2NhbE1hdHJpeChtMik7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIG1TY2FsZWQyU2hhZGVyID0gbmV3IEJpdG1hcFNoYWRlcih0ZXh0dXJlLCBTaGFkZXIuVGlsZU1vZGUuTUlSUk9SLAorICAgICAgICAgICAgICAgICAgICBTaGFkZXIuVGlsZU1vZGUuTUlSUk9SKTsKKyAgICAgICAgICAgIE1hdHJpeCBtMyA9IG5ldyBNYXRyaXgoKTsKKyAgICAgICAgICAgIG0zLnNldFNjYWxlKDAuMWYsIDAuMWYpOworICAgICAgICAgICAgbVNjYWxlZDJTaGFkZXIuc2V0TG9jYWxNYXRyaXgobTMpOworCisgICAgICAgICAgICBtSG9yR3JhZGllbnQgPSBuZXcgTGluZWFyR3JhZGllbnQoMC4wZiwgMC4wZiwgbURyYXdXaWR0aCwgMC4wZiwKKyAgICAgICAgICAgICAgICAgICAgQ29sb3IuUkVELCAweDdmMDBmZjAwLCBTaGFkZXIuVGlsZU1vZGUuQ0xBTVApOworICAgICAgICAgICAgCisgICAgICAgICAgICBtVmVydEdyYWRpZW50ID0gbmV3IExpbmVhckdyYWRpZW50KDAuMGYsIDAuMGYsIDAuMGYsIG1EcmF3SGVpZ2h0IC8gMi4wZiwKKyAgICAgICAgICAgICAgICAgICAgQ29sb3IuWUVMTE9XLCBDb2xvci5NQUdFTlRBLCBTaGFkZXIuVGlsZU1vZGUuTUlSUk9SKTsKKworICAgICAgICAgICAgbUNvbXBvc2VTaGFkZXIgPSBuZXcgQ29tcG9zZVNoYWRlcihtU2NhbGVkU2hhZGVyLCBtSG9yR3JhZGllbnQsCisgICAgICAgICAgICAgICAgICAgIFBvcnRlckR1ZmYuTW9kZS5TUkNfT1ZFUik7CisgICAgICAgICAgICBtQ29tcG9zZTJTaGFkZXIgPSBuZXcgQ29tcG9zZVNoYWRlcihtSG9yR3JhZGllbnQsIG1TY2FsZWRTaGFkZXIsCisgICAgICAgICAgICAgICAgICAgIFBvcnRlckR1ZmYuTW9kZS5TUkNfT1VUKTsKKworICAgICAgICAgICAgbUNvbG9yRmlsdGVyID0gbmV3IExpZ2h0aW5nQ29sb3JGaWx0ZXIoMHgwMDYwZmZmZiwgMHgwMDEwMTAzMCk7CisgCisgICAgICAgICAgICBtTGFyZ2VQYWludCA9IG5ldyBQYWludCgpOworICAgICAgICAgICAgbUxhcmdlUGFpbnQuc2V0QW50aUFsaWFzKHRydWUpOworICAgICAgICAgICAgbUxhcmdlUGFpbnQuc2V0VGV4dFNpemUoMzYuMGYpOworICAgICAgICAgICAgbUxhcmdlUGFpbnQuc2V0Q29sb3IoMHhmZjAwMDAwMCk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIG1QYWludCA9IG5ldyBQYWludCgpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHByb3RlY3RlZCB2b2lkIG9uRHJhdyhDYW52YXMgY2FudmFzKSB7CisgICAgICAgICAgICBzdXBlci5vbkRyYXcoY2FudmFzKTsKKyAgICAgICAgICAgIGNhbnZhcy5kcmF3UkdCKDI1NSwgMjU1LCAyNTUpOworCisgICAgICAgICAgICBjYW52YXMuc2F2ZSgpOworICAgICAgICAgICAgY2FudmFzLnRyYW5zbGF0ZSg0MC4wZiwgNDAuMGYpOworCisgICAgICAgICAgICBtUGFpbnQuc2V0U2hhZGVyKG1Db21wb3NlU2hhZGVyKTsKKyAgICAgICAgICAgIGNhbnZhcy5kcmF3UmVjdCgwLjBmLCAwLjBmLCBtRHJhd1dpZHRoLCBtRHJhd0hlaWdodCwgbVBhaW50KTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgY2FudmFzLnRyYW5zbGF0ZSgwLjBmLCA0MC4wZiArIG1EcmF3SGVpZ2h0KTsKKyAgICAgICAgICAgIG1QYWludC5zZXRTaGFkZXIobUNvbXBvc2UyU2hhZGVyKTsKKyAgICAgICAgICAgIGNhbnZhcy5kcmF3UmVjdCgwLjBmLCAwLjBmLCBtRHJhd1dpZHRoLCBtRHJhd0hlaWdodCwgbVBhaW50KTsKKworICAgICAgICAgICAgY2FudmFzLnJlc3RvcmUoKTsKKworICAgICAgICAgICAgY2FudmFzLnNhdmUoKTsKKyAgICAgICAgICAgIGNhbnZhcy50cmFuc2xhdGUoNDAuMGYgKyBtRHJhd1dpZHRoICsgNDAuMGYsIDQwLjBmKTsKKworICAgICAgICAgICAgbUxhcmdlUGFpbnQuc2V0U2hhZGVyKG1Ib3JHcmFkaWVudCk7CisgICAgICAgICAgICBjYW52YXMuZHJhd1RleHQoIk9wZW5HTCByZW5kZXJpbmciLCAwLjBmLCAyMC4wZiwgbUxhcmdlUGFpbnQpOworICAgICAgICAgICAgCisgICAgICAgICAgICBtTGFyZ2VQYWludC5zZXRTaGFkZXIobVNjYWxlZDJTaGFkZXIpOworICAgICAgICAgICAgY2FudmFzLmRyYXdUZXh0KCJPcGVuR0wgcmVuZGVyaW5nIiwgMC4wZiwgNjAuMGYsIG1MYXJnZVBhaW50KTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgbUxhcmdlUGFpbnQuc2V0U2hhZGVyKG1Db21wb3NlMlNoYWRlcik7CisgICAgICAgICAgICBtTGFyZ2VQYWludC5zZXRDb2xvckZpbHRlcihtQ29sb3JGaWx0ZXIpOworICAgICAgICAgICAgY2FudmFzLmRyYXdUZXh0KCJPcGVuR0wgcmVuZGVyaW5nIiwgMC4wZiwgMTAwLjBmLCBtTGFyZ2VQYWludCk7CisgICAgICAgICAgICBtTGFyZ2VQYWludC5zZXRDb2xvckZpbHRlcihudWxsKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgY2FudmFzLnRyYW5zbGF0ZSgwLjBmLCA0MC4wZiArIG1EcmF3SGVpZ2h0KTsKKyAgICAgICAgICAgIG1MYXJnZVBhaW50LnNldFNoYWRlcihtVmVydEdyYWRpZW50KTsKKyAgICAgICAgICAgIGNhbnZhcy5kcmF3VGV4dCgiT3BlbkdMIHJlbmRlcmluZyIsIDAuMGYsIDIwLjBmLCBtTGFyZ2VQYWludCk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGNhbnZhcy5yZXN0b3JlKCk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9Id0FjY2VsZXJhdGlvblRlc3Qvc3JjL2NvbS9hbmRyb2lkL3Rlc3QvaHd1aS9OZXdMYXllcnNBY3Rpdml0eS5qYXZhIGIvdGVzdHMvSHdBY2NlbGVyYXRpb25UZXN0L3NyYy9jb20vYW5kcm9pZC90ZXN0L2h3dWkvTmV3TGF5ZXJzQWN0aXZpdHkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOWEyODkzCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvSHdBY2NlbGVyYXRpb25UZXN0L3NyYy9jb20vYW5kcm9pZC90ZXN0L2h3dWkvTmV3TGF5ZXJzQWN0aXZpdHkuamF2YQpAQCAtMCwwICsxLDc3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC50ZXN0Lmh3dWk7CisKK2ltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eTsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkNhbnZhczsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlBhaW50OworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OworCitAU3VwcHJlc3NXYXJuaW5ncyh7IlVudXNlZERlY2xhcmF0aW9uIn0pCitwdWJsaWMgY2xhc3MgTmV3TGF5ZXJzQWN0aXZpdHkgZXh0ZW5kcyBBY3Rpdml0eSB7CisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25DcmVhdGUoQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgeworICAgICAgICBzdXBlci5vbkNyZWF0ZShzYXZlZEluc3RhbmNlU3RhdGUpOworICAgICAgICBzZXRDb250ZW50VmlldyhuZXcgTGF5ZXJzVmlldyh0aGlzKSk7CisgICAgfQorCisgICAgc3RhdGljIGNsYXNzIExheWVyc1ZpZXcgZXh0ZW5kcyBWaWV3IHsKKyAgICAgICAgcHJpdmF0ZSBQYWludCBtTGF5ZXJQYWludDsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBQYWludCBtUmVjdFBhaW50OworCisgICAgICAgIExheWVyc1ZpZXcoQ29udGV4dCBjKSB7CisgICAgICAgICAgICBzdXBlcihjKTsKKworICAgICAgICAgICAgbUxheWVyUGFpbnQgPSBuZXcgUGFpbnQoKTsKKyAgICAgICAgICAgIG1MYXllclBhaW50LnNldEFscGhhKDEyNyk7CisgICAgICAgICAgICBtUmVjdFBhaW50ID0gbmV3IFBhaW50KCk7CisgICAgICAgICAgICBtUmVjdFBhaW50LnNldEFudGlBbGlhcyh0cnVlKTsKKyAgICAgICAgICAgIG1SZWN0UGFpbnQuc2V0VGV4dFNpemUoMjQuMGYpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHByb3RlY3RlZCB2b2lkIG9uRHJhdyhDYW52YXMgY2FudmFzKSB7CisgICAgICAgICAgICBzdXBlci5vbkRyYXcoY2FudmFzKTsKKyAgICAgICAgICAgIGNhbnZhcy5kcmF3UkdCKDEyOCwgMjU1LCAxMjgpOworCisgICAgICAgICAgICBjYW52YXMuc2F2ZSgpOworCisgICAgICAgICAgICBjYW52YXMudHJhbnNsYXRlKDE0MC4wZiwgMTAwLjBmKTsKKyAgICAgICAgICAgIGRyYXdTdHVmZihjYW52YXMsIENhbnZhcy5BTExfU0FWRV9GTEFHKTsKKworICAgICAgICAgICAgY2FudmFzLnRyYW5zbGF0ZSgwLjBmLCAyMDAuMGYpOworICAgICAgICAgICAgZHJhd1N0dWZmKGNhbnZhcywgQ2FudmFzLkhBU19BTFBIQV9MQVlFUl9TQVZFX0ZMQUcpOworICAgICAgICAgICAgCisgICAgICAgICAgICBjYW52YXMucmVzdG9yZSgpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSB2b2lkIGRyYXdTdHVmZihDYW52YXMgY2FudmFzLCBpbnQgc2F2ZUZsYWdzKSB7CisgICAgICAgICAgICBpbnQgY291bnQgPSBjYW52YXMuc2F2ZUxheWVyKDAuMGYsIDAuMGYsIDIwMC4wZiwgMTAwLjBmLCBtTGF5ZXJQYWludCwgc2F2ZUZsYWdzKTsKKworICAgICAgICAgICAgbVJlY3RQYWludC5zZXRDb2xvcigweDdmZmYwMDAwKTsKKyAgICAgICAgICAgIGNhbnZhcy5kcmF3UmVjdCgtMjAuMGYsIC0yMC4wZiwgMjIwLjBmLCAxMjAuMGYsIG1SZWN0UGFpbnQpOworCisgICAgICAgICAgICBtUmVjdFBhaW50LnNldENvbG9yKDB4ZmYwMDAwMDApOworICAgICAgICAgICAgY2FudmFzLmRyYXdUZXh0KCJUaGlzIGlzIGEgdmVyeSBsb25nIHN0cmluZyB0byBvdmVybGFwIGJldHdlZW4gbGF5ZXJzIGFuZCBmcmFtZWJ1ZmZlciIsCisgICAgICAgICAgICAgICAgICAgIC0xMDAuMGYsIDUwLjBmLCBtUmVjdFBhaW50KTsKKworICAgICAgICAgICAgY2FudmFzLnJlc3RvcmVUb0NvdW50KGNvdW50KTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL0h3QWNjZWxlcmF0aW9uVGVzdC9zcmMvY29tL2FuZHJvaWQvdGVzdC9od3VpL05pbmVQYXRjaGVzQWN0aXZpdHkuamF2YSBiL3Rlc3RzL0h3QWNjZWxlcmF0aW9uVGVzdC9zcmMvY29tL2FuZHJvaWQvdGVzdC9od3VpL05pbmVQYXRjaGVzQWN0aXZpdHkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NDEwZjc5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvSHdBY2NlbGVyYXRpb25UZXN0L3NyYy9jb20vYW5kcm9pZC90ZXN0L2h3dWkvTmluZVBhdGNoZXNBY3Rpdml0eS5qYXZhCkBAIC0wLDAgKzEsNDEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLnRlc3QuaHd1aTsKKworaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5OworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworaW1wb3J0IGFuZHJvaWQudmlldy5HcmF2aXR5OworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkJ1dHRvbjsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5GcmFtZUxheW91dDsKKworQFN1cHByZXNzV2FybmluZ3MoeyJVbnVzZWREZWNsYXJhdGlvbiJ9KQorcHVibGljIGNsYXNzIE5pbmVQYXRjaGVzQWN0aXZpdHkgZXh0ZW5kcyBBY3Rpdml0eSB7CisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25DcmVhdGUoQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgeworICAgICAgICBzdXBlci5vbkNyZWF0ZShzYXZlZEluc3RhbmNlU3RhdGUpOworICAgICAgICAKKyAgICAgICAgRnJhbWVMYXlvdXQgbGF5b3V0ID0gbmV3IEZyYW1lTGF5b3V0KHRoaXMpOworICAgICAgICBCdXR0b24gYiA9IG5ldyBCdXR0b24odGhpcyk7CisgICAgICAgIGIuc2V0TGF5b3V0UGFyYW1zKG5ldyBGcmFtZUxheW91dC5MYXlvdXRQYXJhbXMoRnJhbWVMYXlvdXQuTGF5b3V0UGFyYW1zLldSQVBfQ09OVEVOVCwKKyAgICAgICAgICAgICAgICBGcmFtZUxheW91dC5MYXlvdXRQYXJhbXMuV1JBUF9DT05URU5ULCBHcmF2aXR5LkNFTlRFUikpOworICAgICAgICBiLnNldFRleHQoIjkgcGF0Y2hlcyIpOworICAgICAgICBsYXlvdXQuYWRkVmlldyhiKTsKKyAgICAgICAgbGF5b3V0LnNldEJhY2tncm91bmRDb2xvcigweGZmZmZmZmZmKTsKKyAgICAgICAgCisgICAgICAgIHNldENvbnRlbnRWaWV3KGxheW91dCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvSHdBY2NlbGVyYXRpb25UZXN0L3NyYy9jb20vYW5kcm9pZC90ZXN0L2h3dWkvUGF0aHNBY3Rpdml0eS5qYXZhIGIvdGVzdHMvSHdBY2NlbGVyYXRpb25UZXN0L3NyYy9jb20vYW5kcm9pZC90ZXN0L2h3dWkvUGF0aHNBY3Rpdml0eS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhkOWJmMzcKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9Id0FjY2VsZXJhdGlvblRlc3Qvc3JjL2NvbS9hbmRyb2lkL3Rlc3QvaHd1aS9QYXRoc0FjdGl2aXR5LmphdmEKQEAgLTAsMCArMSwxNDQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLnRlc3QuaHd1aTsKKworaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwRmFjdG9yeTsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkJpdG1hcFNoYWRlcjsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkNhbnZhczsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlBhaW50OworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUGF0aDsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlJlY3RGOworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OworCitAU3VwcHJlc3NXYXJuaW5ncyh7IlVudXNlZERlY2xhcmF0aW9uIn0pCitwdWJsaWMgY2xhc3MgUGF0aHNBY3Rpdml0eSBleHRlbmRzIEFjdGl2aXR5IHsKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvbkNyZWF0ZShCdW5kbGUgc2F2ZWRJbnN0YW5jZVN0YXRlKSB7CisgICAgICAgIHN1cGVyLm9uQ3JlYXRlKHNhdmVkSW5zdGFuY2VTdGF0ZSk7CisgICAgICAgIGZpbmFsIFBhdGhzVmlldyB2aWV3ID0gbmV3IFBhdGhzVmlldyh0aGlzKTsKKyAgICAgICAgc2V0Q29udGVudFZpZXcodmlldyk7CisgICAgfQorCisgICAgc3RhdGljIGNsYXNzIFBhdGhzVmlldyBleHRlbmRzIFZpZXcgeworICAgICAgICBwcml2YXRlIGZpbmFsIEJpdG1hcCBtQml0bWFwMTsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBQYWludCBtU21hbGxQYWludDsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBQYWludCBtTWVkaXVtUGFpbnQ7CisgICAgICAgIHByaXZhdGUgZmluYWwgUGFpbnQgbUxhcmdlUGFpbnQ7CisgICAgICAgIHByaXZhdGUgZmluYWwgQml0bWFwU2hhZGVyIG1TaGFkZXI7CisgICAgICAgIHByaXZhdGUgZmluYWwgUGF0aCBtUGF0aDsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBSZWN0RiBtUGF0aEJvdW5kczsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBQYWludCBtQm91bmRzUGFpbnQ7CisgICAgICAgIHByaXZhdGUgZmluYWwgQml0bWFwIG1CaXRtYXA7CisgICAgICAgIHByaXZhdGUgZmluYWwgZmxvYXQgbU9mZnNldDsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBQYWludCBtTGluZVBhaW50OworCisgICAgICAgIFBhdGhzVmlldyhDb250ZXh0IGMpIHsKKyAgICAgICAgICAgIHN1cGVyKGMpOworCisgICAgICAgICAgICBtQml0bWFwMSA9IEJpdG1hcEZhY3RvcnkuZGVjb2RlUmVzb3VyY2UoYy5nZXRSZXNvdXJjZXMoKSwgUi5kcmF3YWJsZS5zdW5zZXQxKTsKKworICAgICAgICAgICAgbVNtYWxsUGFpbnQgPSBuZXcgUGFpbnQoKTsKKyAgICAgICAgICAgIG1TbWFsbFBhaW50LnNldEFudGlBbGlhcyh0cnVlKTsKKyAgICAgICAgICAgIG1TbWFsbFBhaW50LnNldENvbG9yKDB4ZmZmZjAwMDApOworICAgICAgICAgICAgbVNtYWxsUGFpbnQuc2V0U3Ryb2tlV2lkdGgoMS4wZik7CisgICAgICAgICAgICBtU21hbGxQYWludC5zZXRTdHlsZShQYWludC5TdHlsZS5TVFJPS0UpOworICAgICAgICAgICAgCisgICAgICAgICAgICBtTGluZVBhaW50ID0gbmV3IFBhaW50KCk7CisgICAgICAgICAgICBtTGluZVBhaW50LnNldEFudGlBbGlhcyh0cnVlKTsKKyAgICAgICAgICAgIG1MaW5lUGFpbnQuc2V0Q29sb3IoMHhmZmZmMDBmZik7CisgICAgICAgICAgICBtTGluZVBhaW50LnNldFN0cm9rZVdpZHRoKDEuMGYpOworICAgICAgICAgICAgbUxpbmVQYWludC5zZXRTdHlsZShQYWludC5TdHlsZS5TVFJPS0UpOworCisgICAgICAgICAgICBtTWVkaXVtUGFpbnQgPSBuZXcgUGFpbnQoKTsKKyAgICAgICAgICAgIG1NZWRpdW1QYWludC5zZXRBbnRpQWxpYXModHJ1ZSk7CisgICAgICAgICAgICBtTWVkaXVtUGFpbnQuc2V0Q29sb3IoMHhmZjAwMDBmZik7CisgICAgICAgICAgICBtTWVkaXVtUGFpbnQuc2V0U3Ryb2tlV2lkdGgoMTAuMGYpOworICAgICAgICAgICAgbU1lZGl1bVBhaW50LnNldFN0eWxlKFBhaW50LlN0eWxlLlNUUk9LRSk7CisKKyAgICAgICAgICAgIG1MYXJnZVBhaW50ID0gbmV3IFBhaW50KCk7CisgICAgICAgICAgICBtTGFyZ2VQYWludC5zZXRBbnRpQWxpYXModHJ1ZSk7CisgICAgICAgICAgICBtTGFyZ2VQYWludC5zZXRDb2xvcigweGZmMDBmZjAwKTsKKyAgICAgICAgICAgIG1MYXJnZVBhaW50LnNldFN0cm9rZVdpZHRoKDE1LjBmKTsKKyAgICAgICAgICAgIG1MYXJnZVBhaW50LnNldFN0eWxlKFBhaW50LlN0eWxlLkZJTEwpOworCisgICAgICAgICAgICBtU2hhZGVyID0gbmV3IEJpdG1hcFNoYWRlcihtQml0bWFwMSwgQml0bWFwU2hhZGVyLlRpbGVNb2RlLk1JUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgQml0bWFwU2hhZGVyLlRpbGVNb2RlLk1JUlJPUik7CisKKyAgICAgICAgICAgIG1QYXRoID0gbmV3IFBhdGgoKTsKKyAgICAgICAgICAgIG1QYXRoLm1vdmVUbygwLjBmLCAwLjBmKTsKKyAgICAgICAgICAgIG1QYXRoLmN1YmljVG8oMC4wZiwgMC4wZiwgMTAwLjBmLCAxNTAuMGYsIDEwMC4wZiwgMjAwLjBmKTsKKyAgICAgICAgICAgIG1QYXRoLmN1YmljVG8oMTAwLjBmLCAyMDAuMGYsIDUwLjBmLCAzMDAuMGYsIC04MC4wZiwgMjAwLjBmKTsKKyAgICAgICAgICAgIG1QYXRoLmN1YmljVG8oLTgwLjBmLCAyMDAuMGYsIDEwMC4wZiwgMjAwLjBmLCAyMDAuMGYsIDAuMGYpOworCisgICAgICAgICAgICBtUGF0aEJvdW5kcyA9IG5ldyBSZWN0RigpOworICAgICAgICAgICAgbVBhdGguY29tcHV0ZUJvdW5kcyhtUGF0aEJvdW5kcywgdHJ1ZSk7CisKKyAgICAgICAgICAgIG1Cb3VuZHNQYWludCA9IG5ldyBQYWludCgpOworICAgICAgICAgICAgbUJvdW5kc1BhaW50LnNldENvbG9yKDB4NDAwMGZmMDApOworCisgICAgICAgICAgICBtT2Zmc2V0ID0gbU1lZGl1bVBhaW50LmdldFN0cm9rZVdpZHRoKCk7CisgICAgICAgICAgICBmaW5hbCBpbnQgd2lkdGggPSAoaW50KSAobVBhdGhCb3VuZHMud2lkdGgoKSArIG1PZmZzZXQgKiAzLjBmICsgMC41Zik7CisgICAgICAgICAgICBmaW5hbCBpbnQgaGVpZ2h0ID0gKGludCkgKG1QYXRoQm91bmRzLmhlaWdodCgpICsgbU9mZnNldCAqIDMuMGYgKyAwLjVmKTsKKyAgICAgICAgICAgIG1CaXRtYXAgPSBCaXRtYXAuY3JlYXRlQml0bWFwKHdpZHRoLCBoZWlnaHQsIEJpdG1hcC5Db25maWcuQUxQSEFfOCk7CisgICAgICAgICAgICBDYW52YXMgY2FudmFzID0gbmV3IENhbnZhcyhtQml0bWFwKTsKKyAgICAgICAgICAgIGNhbnZhcy50cmFuc2xhdGUoLW1QYXRoQm91bmRzLmxlZnQgKyBtT2Zmc2V0ICogMS41ZiwgLW1QYXRoQm91bmRzLnRvcCArIG1PZmZzZXQgKiAxLjVmKTsKKyAgICAgICAgICAgIGNhbnZhcy5kcmF3UGF0aChtUGF0aCwgbU1lZGl1bVBhaW50KTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwcm90ZWN0ZWQgdm9pZCBvbkRyYXcoQ2FudmFzIGNhbnZhcykgeworICAgICAgICAgICAgc3VwZXIub25EcmF3KGNhbnZhcyk7CisKKyAgICAgICAgICAgIGNhbnZhcy5kcmF3QVJHQigyNTUsIDI1NSwgMjU1LCAyNTUpOworCisgICAgICAgICAgICBjYW52YXMuc2F2ZSgpOworICAgICAgICAgICAgY2FudmFzLnRyYW5zbGF0ZSgyMDAuMGYsIDYwLjBmKTsKKyAgICAgICAgICAgIGNhbnZhcy5kcmF3UGF0aChtUGF0aCwgbVNtYWxsUGFpbnQpOworICAgICAgICAgICAgCisgICAgICAgICAgICBjYW52YXMudHJhbnNsYXRlKDM1MC4wZiwgMC4wZik7CisgICAgICAgICAgICBjYW52YXMuZHJhd1BhdGgobVBhdGgsIG1NZWRpdW1QYWludCk7CisKKyAgICAgICAgICAgIG1MYXJnZVBhaW50LnNldFNoYWRlcihtU2hhZGVyKTsKKyAgICAgICAgICAgIGNhbnZhcy50cmFuc2xhdGUoMzUwLjBmLCAwLjBmKTsKKyAgICAgICAgICAgIGNhbnZhcy5kcmF3UGF0aChtUGF0aCwgbUxhcmdlUGFpbnQpOworICAgICAgICAgICAgbUxhcmdlUGFpbnQuc2V0U2hhZGVyKG51bGwpOworICAgICAgICAgICAgY2FudmFzLnJlc3RvcmUoKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgY2FudmFzLnNhdmUoKTsKKyAgICAgICAgICAgIGNhbnZhcy50cmFuc2xhdGUoMjAwLjBmLCAzNjAuMGYpOworICAgICAgICAgICAgY2FudmFzLmRyYXdQYXRoKG1QYXRoLCBtU21hbGxQYWludCk7CisgICAgICAgICAgICBjYW52YXMuZHJhd1JlY3QobVBhdGhCb3VuZHMsIG1Cb3VuZHNQYWludCk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGNhbnZhcy50cmFuc2xhdGUoMzUwLjBmLCAwLjBmKTsKKyAgICAgICAgICAgIGNhbnZhcy5kcmF3Qml0bWFwKG1CaXRtYXAsIG1QYXRoQm91bmRzLmxlZnQgLSBtT2Zmc2V0ICogMS41ZiwKKyAgICAgICAgICAgICAgICAgICAgbVBhdGhCb3VuZHMudG9wIC0gbU9mZnNldCAqIDEuNWYsIG51bGwpOworICAgICAgICAgICAgY2FudmFzLmRyYXdSZWN0KG1QYXRoQm91bmRzLCBtQm91bmRzUGFpbnQpOworICAgICAgICAgICAgY2FudmFzLmRyYXdMaW5lKDAuMGYsIC0zNjAuMGYsIDAuMGYsIDUwMC4wZiwgbUxpbmVQYWludCk7CisKKyAgICAgICAgICAgIG1MYXJnZVBhaW50LnNldFNoYWRlcihtU2hhZGVyKTsKKyAgICAgICAgICAgIGNhbnZhcy50cmFuc2xhdGUoMzUwLjBmLCAwLjBmKTsKKyAgICAgICAgICAgIGNhbnZhcy5kcmF3UGF0aChtUGF0aCwgbUxhcmdlUGFpbnQpOworICAgICAgICAgICAgY2FudmFzLmRyYXdSZWN0KG1QYXRoQm91bmRzLCBtQm91bmRzUGFpbnQpOworICAgICAgICAgICAgbUxhcmdlUGFpbnQuc2V0U2hhZGVyKG51bGwpOworICAgICAgICAgICAgY2FudmFzLnJlc3RvcmUoKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL0h3QWNjZWxlcmF0aW9uVGVzdC9zcmMvY29tL2FuZHJvaWQvdGVzdC9od3VpL1F1aWNrUmVqZWN0QWN0aXZpdHkuamF2YSBiL3Rlc3RzL0h3QWNjZWxlcmF0aW9uVGVzdC9zcmMvY29tL2FuZHJvaWQvdGVzdC9od3VpL1F1aWNrUmVqZWN0QWN0aXZpdHkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MTkyYmZlCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvSHdBY2NlbGVyYXRpb25UZXN0L3NyYy9jb20vYW5kcm9pZC90ZXN0L2h3dWkvUXVpY2tSZWplY3RBY3Rpdml0eS5qYXZhCkBAIC0wLDAgKzEsODkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLnRlc3QuaHd1aTsKKworaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwRmFjdG9yeTsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkNhbnZhczsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlBhaW50OworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CisKK0BTdXBwcmVzc1dhcm5pbmdzKHsiVW51c2VkRGVjbGFyYXRpb24ifSkKK3B1YmxpYyBjbGFzcyBRdWlja1JlamVjdEFjdGl2aXR5IGV4dGVuZHMgQWN0aXZpdHkgeworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG9uQ3JlYXRlKEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpIHsKKyAgICAgICAgc3VwZXIub25DcmVhdGUoc2F2ZWRJbnN0YW5jZVN0YXRlKTsKKyAgICAgICAgZmluYWwgUXVpY2tSZWplY3RWaWV3IHZpZXcgPSBuZXcgUXVpY2tSZWplY3RWaWV3KHRoaXMpOworICAgICAgICBzZXRDb250ZW50Vmlldyh2aWV3KTsKKyAgICB9CisKKyAgICBzdGF0aWMgY2xhc3MgUXVpY2tSZWplY3RWaWV3IGV4dGVuZHMgVmlldyB7CisgICAgICAgIHByaXZhdGUgUGFpbnQgbUJpdG1hcFBhaW50OworICAgICAgICBwcml2YXRlIGZpbmFsIEJpdG1hcCBtQml0bWFwMTsKKworICAgICAgICBRdWlja1JlamVjdFZpZXcoQ29udGV4dCBjKSB7CisgICAgICAgICAgICBzdXBlcihjKTsKKworICAgICAgICAgICAgbUJpdG1hcDEgPSBCaXRtYXBGYWN0b3J5LmRlY29kZVJlc291cmNlKGMuZ2V0UmVzb3VyY2VzKCksIFIuZHJhd2FibGUuc3Vuc2V0MSk7CisKKyAgICAgICAgICAgIG1CaXRtYXBQYWludCA9IG5ldyBQYWludCgpOworICAgICAgICAgICAgbUJpdG1hcFBhaW50LnNldEZpbHRlckJpdG1hcCh0cnVlKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwcm90ZWN0ZWQgdm9pZCBvbkRyYXcoQ2FudmFzIGNhbnZhcykgeworICAgICAgICAgICAgc3VwZXIub25EcmF3KGNhbnZhcyk7CisKKyAgICAgICAgICAgIGludCBjb3VudCA9IGNhbnZhcy5nZXRTYXZlQ291bnQoKTsKKyAgICAgICAgICAgIExvZy5kKCJPcGVuR0xSZW5kZXJlciIsICJjb3VudD0iICsgY291bnQpOworICAgICAgICAgICAgY291bnQgPSBjYW52YXMuc2F2ZSgpOworICAgICAgICAgICAgTG9nLmQoIk9wZW5HTFJlbmRlcmVyIiwgImNvdW50IGFmdGVyIHNhdmU9IiArIGNvdW50KTsKKyAgICAgICAgICAgIGNvdW50ID0gY2FudmFzLmdldFNhdmVDb3VudCgpOworICAgICAgICAgICAgTG9nLmQoIk9wZW5HTFJlbmRlcmVyIiwgImdldFNhdmVDb3VudCBhZnRlciBzYXZlPSIgKyBjb3VudCk7CisgICAgICAgICAgICBjYW52YXMucmVzdG9yZSgpOworICAgICAgICAgICAgY291bnQgPSBjYW52YXMuZ2V0U2F2ZUNvdW50KCk7CisgICAgICAgICAgICBMb2cuZCgiT3BlbkdMUmVuZGVyZXIiLCAiY291bnQgYWZ0ZXIgcmVzdG9yZT0iICsgY291bnQpOworICAgICAgICAgICAgY2FudmFzLnNhdmUoKTsKKyAgICAgICAgICAgIExvZy5kKCJPcGVuR0xSZW5kZXJlciIsICJjb3VudCBhZnRlciBzYXZlPSIgKyBjYW52YXMuZ2V0U2F2ZUNvdW50KCkpOworICAgICAgICAgICAgY2FudmFzLnNhdmUoKTsKKyAgICAgICAgICAgIExvZy5kKCJPcGVuR0xSZW5kZXJlciIsICJjb3VudCBhZnRlciBzYXZlPSIgKyBjYW52YXMuZ2V0U2F2ZUNvdW50KCkpOworICAgICAgICAgICAgY2FudmFzLnNhdmUoKTsKKyAgICAgICAgICAgIExvZy5kKCJPcGVuR0xSZW5kZXJlciIsICJjb3VudCBhZnRlciBzYXZlPSIgKyBjYW52YXMuZ2V0U2F2ZUNvdW50KCkpOworICAgICAgICAgICAgY2FudmFzLnJlc3RvcmVUb0NvdW50KGNvdW50KTsKKyAgICAgICAgICAgIGNvdW50ID0gY2FudmFzLmdldFNhdmVDb3VudCgpOworICAgICAgICAgICAgTG9nLmQoIk9wZW5HTFJlbmRlcmVyIiwgImNvdW50IGFmdGVyIHJlc3RvcmVUb0NvdW50PSIgKyBjb3VudCk7CisgICAgICAgICAgICBjb3VudCA9IGNhbnZhcy5zYXZlTGF5ZXIoMCwgMCwgMTAsIDEwLCBtQml0bWFwUGFpbnQsIENhbnZhcy5BTExfU0FWRV9GTEFHKTsKKyAgICAgICAgICAgIExvZy5kKCJPcGVuR0xSZW5kZXJlciIsICJjb3VudCBhZnRlciBzYXZlTGF5ZXI9IiArIGNvdW50KTsKKyAgICAgICAgICAgIGNvdW50ID0gY2FudmFzLmdldFNhdmVDb3VudCgpOworICAgICAgICAgICAgTG9nLmQoIk9wZW5HTFJlbmRlcmVyIiwgImdldFNhdmVDb3VudCBhZnRlciBzYXZlTGF5ZXI9IiArIGNvdW50KTsKKyAgICAgICAgICAgIGNhbnZhcy5yZXN0b3JlKCk7CisgICAgICAgICAgICBjb3VudCA9IGNhbnZhcy5nZXRTYXZlQ291bnQoKTsKKyAgICAgICAgICAgIExvZy5kKCJPcGVuR0xSZW5kZXJlciIsICJjb3VudCBhZnRlciByZXN0b3JlPSIgKyBjb3VudCk7CisKKyAgICAgICAgICAgIGNhbnZhcy5zYXZlKCk7CisgICAgICAgICAgICBjYW52YXMuY2xpcFJlY3QoMC4wZiwgMC4wZiwgNDAuMGYsIDQwLjBmKTsKKyAgICAgICAgICAgIGNhbnZhcy5kcmF3Qml0bWFwKG1CaXRtYXAxLCAwLjBmLCAwLjBmLCBtQml0bWFwUGFpbnQpOworICAgICAgICAgICAgY2FudmFzLmRyYXdCaXRtYXAobUJpdG1hcDEsIC1tQml0bWFwMS5nZXRXaWR0aCgpLCAwLjBmLCBtQml0bWFwUGFpbnQpOworICAgICAgICAgICAgY2FudmFzLmRyYXdCaXRtYXAobUJpdG1hcDEsIDUwLjBmLCAwLjBmLCBtQml0bWFwUGFpbnQpOworICAgICAgICAgICAgY2FudmFzLnJlc3RvcmUoKTsKKyAgICAgICAgfQorICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9Id0FjY2VsZXJhdGlvblRlc3Qvc3JjL2NvbS9hbmRyb2lkL3Rlc3QvaHd1aS9SZXNpemVBY3Rpdml0eS5qYXZhIGIvdGVzdHMvSHdBY2NlbGVyYXRpb25UZXN0L3NyYy9jb20vYW5kcm9pZC90ZXN0L2h3dWkvUmVzaXplQWN0aXZpdHkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNGY5ZGUxCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvSHdBY2NlbGVyYXRpb25UZXN0L3NyYy9jb20vYW5kcm9pZC90ZXN0L2h3dWkvUmVzaXplQWN0aXZpdHkuamF2YQpAQCAtMCwwICsxLDMwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC50ZXN0Lmh3dWk7CisKK2ltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eTsKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKKworQFN1cHByZXNzV2FybmluZ3MoeyJVbnVzZWREZWNsYXJhdGlvbiJ9KQorcHVibGljIGNsYXNzIFJlc2l6ZUFjdGl2aXR5IGV4dGVuZHMgQWN0aXZpdHkgeworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG9uQ3JlYXRlKEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpIHsKKyAgICAgICAgc3VwZXIub25DcmVhdGUoc2F2ZWRJbnN0YW5jZVN0YXRlKTsKKyAgICAgICAgCisgICAgICAgIHNldENvbnRlbnRWaWV3KFIubGF5b3V0LmZvcm0pOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL0h3QWNjZWxlcmF0aW9uVGVzdC9zcmMvY29tL2FuZHJvaWQvdGVzdC9od3VpL1JvdGF0aW9uQWN0aXZpdHkuamF2YSBiL3Rlc3RzL0h3QWNjZWxlcmF0aW9uVGVzdC9zcmMvY29tL2FuZHJvaWQvdGVzdC9od3VpL1JvdGF0aW9uQWN0aXZpdHkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YzMwOWI0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvSHdBY2NlbGVyYXRpb25UZXN0L3NyYy9jb20vYW5kcm9pZC90ZXN0L2h3dWkvUm90YXRpb25BY3Rpdml0eS5qYXZhCkBAIC0wLDAgKzEsNjMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLnRlc3QuaHd1aTsKKworaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQ2FudmFzOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUGFpbnQ7CitpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CisKK0BTdXBwcmVzc1dhcm5pbmdzKHsiVW51c2VkRGVjbGFyYXRpb24ifSkKK3B1YmxpYyBjbGFzcyBSb3RhdGlvbkFjdGl2aXR5IGV4dGVuZHMgQWN0aXZpdHkgeworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG9uQ3JlYXRlKEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpIHsKKyAgICAgICAgc3VwZXIub25DcmVhdGUoc2F2ZWRJbnN0YW5jZVN0YXRlKTsKKworICAgICAgICBEcmF3aW5nVmlldyBjb250YWluZXIgPSBuZXcgRHJhd2luZ1ZpZXcodGhpcyk7CisKKyAgICAgICAgc2V0Q29udGVudFZpZXcoY29udGFpbmVyKTsKKyAgICB9CisgICAgCisgICAgQFN1cHByZXNzV2FybmluZ3MoeyJVbnVzZWREZWNsYXJhdGlvbiJ9KQorICAgIHN0YXRpYyBpbnQgZGlwVG9QeChDb250ZXh0IGMsIGludCBkaXApIHsKKyAgICAgICAgcmV0dXJuIChpbnQpIChjLmdldFJlc291cmNlcygpLmdldERpc3BsYXlNZXRyaWNzKCkuZGVuc2l0eSAqIGRpcCArIDAuNWYpOworICAgIH0KKworICAgIHN0YXRpYyBjbGFzcyBEcmF3aW5nVmlldyBleHRlbmRzIFZpZXcgeworICAgICAgICBwcml2YXRlIGZpbmFsIFBhaW50IG1QYWludDsKKworICAgICAgICBEcmF3aW5nVmlldyhDb250ZXh0IGMpIHsKKyAgICAgICAgICAgIHN1cGVyKGMpOworICAgICAgICAgICAgbVBhaW50ID0gbmV3IFBhaW50KCk7CisgICAgICAgICAgICBtUGFpbnQuc2V0QW50aUFsaWFzKHRydWUpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHByb3RlY3RlZCB2b2lkIG9uRHJhdyhDYW52YXMgY2FudmFzKSB7CisgICAgICAgICAgICBjYW52YXMuc2F2ZSgpOworICAgICAgICAgICAgY2FudmFzLnRyYW5zbGF0ZShkaXBUb1B4KGdldENvbnRleHQoKSwgNDAwKSwgZGlwVG9QeChnZXRDb250ZXh0KCksIDIwMCkpOworICAgICAgICAgICAgY2FudmFzLnJvdGF0ZSg0NS4wZik7CisgICAgICAgICAgICBjYW52YXMuZHJhd1JHQigyNTUsIDI1NSwgMjU1KTsKKyAgICAgICAgICAgIG1QYWludC5zZXRDb2xvcigweGZmZmYwMDAwKTsKKyAgICAgICAgICAgIGNhbnZhcy5kcmF3UmVjdCgtODAuMGYsIC04MC4wZiwgODAuMGYsIDgwLjBmLCBtUGFpbnQpOworICAgICAgICAgICAgY2FudmFzLmRyYXdSZWN0KDAuMGYsIDAuMGYsIDIyMC4wZiwgMjIwLjBmLCBtUGFpbnQpOyAgICAgICAgICAgIAorICAgICAgICAgICAgY2FudmFzLnJlc3RvcmUoKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL0h3QWNjZWxlcmF0aW9uVGVzdC9zcmMvY29tL2FuZHJvaWQvdGVzdC9od3VpL1NoYWRlcnNBY3Rpdml0eS5qYXZhIGIvdGVzdHMvSHdBY2NlbGVyYXRpb25UZXN0L3NyYy9jb20vYW5kcm9pZC90ZXN0L2h3dWkvU2hhZGVyc0FjdGl2aXR5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWM4ZTdlYwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL0h3QWNjZWxlcmF0aW9uVGVzdC9zcmMvY29tL2FuZHJvaWQvdGVzdC9od3VpL1NoYWRlcnNBY3Rpdml0eS5qYXZhCkBAIC0wLDAgKzEsMTMyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC50ZXN0Lmh3dWk7CisKK2ltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eTsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkJpdG1hcDsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkJpdG1hcEZhY3Rvcnk7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5CaXRtYXBTaGFkZXI7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5DYW52YXM7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5Db2xvcjsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkxpbmVhckdyYWRpZW50OworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuTWF0cml4OworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUGFpbnQ7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5TaGFkZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CisKK0BTdXBwcmVzc1dhcm5pbmdzKHsiVW51c2VkRGVjbGFyYXRpb24ifSkKK3B1YmxpYyBjbGFzcyBTaGFkZXJzQWN0aXZpdHkgZXh0ZW5kcyBBY3Rpdml0eSB7CisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25DcmVhdGUoQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgeworICAgICAgICBzdXBlci5vbkNyZWF0ZShzYXZlZEluc3RhbmNlU3RhdGUpOworCisgICAgICAgIHNldENvbnRlbnRWaWV3KG5ldyBTaGFkZXJzVmlldyh0aGlzKSk7CisgICAgfQorCisgICAgc3RhdGljIGNsYXNzIFNoYWRlcnNWaWV3IGV4dGVuZHMgVmlldyB7CisgICAgICAgIHByaXZhdGUgQml0bWFwU2hhZGVyIG1SZXBlYXRTaGFkZXI7CisgICAgICAgIHByaXZhdGUgQml0bWFwU2hhZGVyIG1UcmFuc2xhdGVkU2hhZGVyOworICAgICAgICBwcml2YXRlIEJpdG1hcFNoYWRlciBtU2NhbGVkU2hhZGVyOworICAgICAgICBwcml2YXRlIGludCBtVGV4V2lkdGg7CisgICAgICAgIHByaXZhdGUgaW50IG1UZXhIZWlnaHQ7CisgICAgICAgIHByaXZhdGUgUGFpbnQgbVBhaW50OworICAgICAgICBwcml2YXRlIGZsb2F0IG1EcmF3V2lkdGg7CisgICAgICAgIHByaXZhdGUgZmxvYXQgbURyYXdIZWlnaHQ7CisgICAgICAgIHByaXZhdGUgTGluZWFyR3JhZGllbnQgbUhvckdyYWRpZW50OworICAgICAgICBwcml2YXRlIExpbmVhckdyYWRpZW50IG1EaWFnR3JhZGllbnQ7CisgICAgICAgIHByaXZhdGUgTGluZWFyR3JhZGllbnQgbVZlcnRHcmFkaWVudDsKKworICAgICAgICBTaGFkZXJzVmlldyhDb250ZXh0IGMpIHsKKyAgICAgICAgICAgIHN1cGVyKGMpOworCisgICAgICAgICAgICBCaXRtYXAgdGV4dHVyZSA9IEJpdG1hcEZhY3RvcnkuZGVjb2RlUmVzb3VyY2UoYy5nZXRSZXNvdXJjZXMoKSwgUi5kcmF3YWJsZS5zdW5zZXQxKTsKKyAgICAgICAgICAgIG1UZXhXaWR0aCA9IHRleHR1cmUuZ2V0V2lkdGgoKTsKKyAgICAgICAgICAgIG1UZXhIZWlnaHQgPSB0ZXh0dXJlLmdldEhlaWdodCgpOworICAgICAgICAgICAgbURyYXdXaWR0aCA9IG1UZXhXaWR0aCAqIDIuMmY7CisgICAgICAgICAgICBtRHJhd0hlaWdodCA9IG1UZXhIZWlnaHQgKiAxLjJmOworCisgICAgICAgICAgICBtUmVwZWF0U2hhZGVyID0gbmV3IEJpdG1hcFNoYWRlcih0ZXh0dXJlLCBTaGFkZXIuVGlsZU1vZGUuUkVQRUFULAorICAgICAgICAgICAgICAgICAgICBTaGFkZXIuVGlsZU1vZGUuUkVQRUFUKTsKKworICAgICAgICAgICAgbVRyYW5zbGF0ZWRTaGFkZXIgPSBuZXcgQml0bWFwU2hhZGVyKHRleHR1cmUsIFNoYWRlci5UaWxlTW9kZS5SRVBFQVQsCisgICAgICAgICAgICAgICAgICAgIFNoYWRlci5UaWxlTW9kZS5SRVBFQVQpOworICAgICAgICAgICAgTWF0cml4IG0xID0gbmV3IE1hdHJpeCgpOworICAgICAgICAgICAgbTEuc2V0VHJhbnNsYXRlKG1UZXhXaWR0aCAvIDIuMGYsIG1UZXhIZWlnaHQgLyAyLjBmKTsKKyAgICAgICAgICAgIG0xLnBvc3RSb3RhdGUoNDUsIDAsIDApOworICAgICAgICAgICAgbVRyYW5zbGF0ZWRTaGFkZXIuc2V0TG9jYWxNYXRyaXgobTEpOworICAgICAgICAgICAgCisgICAgICAgICAgICBtU2NhbGVkU2hhZGVyID0gbmV3IEJpdG1hcFNoYWRlcih0ZXh0dXJlLCBTaGFkZXIuVGlsZU1vZGUuTUlSUk9SLAorICAgICAgICAgICAgICAgICAgICBTaGFkZXIuVGlsZU1vZGUuTUlSUk9SKTsKKyAgICAgICAgICAgIE1hdHJpeCBtMiA9IG5ldyBNYXRyaXgoKTsKKyAgICAgICAgICAgIG0yLnNldFNjYWxlKDAuNWYsIDAuNWYpOworICAgICAgICAgICAgbVNjYWxlZFNoYWRlci5zZXRMb2NhbE1hdHJpeChtMik7CisKKyAgICAgICAgICAgIG1Ib3JHcmFkaWVudCA9IG5ldyBMaW5lYXJHcmFkaWVudCgwLjBmLCAwLjBmLCBtRHJhd1dpZHRoLCAwLjBmLAorICAgICAgICAgICAgICAgICAgICBDb2xvci5SRUQsIENvbG9yLkdSRUVOLCBTaGFkZXIuVGlsZU1vZGUuQ0xBTVApOworICAgICAgICAgICAgCisgICAgICAgICAgICBtRGlhZ0dyYWRpZW50ID0gbmV3IExpbmVhckdyYWRpZW50KDAuMGYsIDAuMGYsIG1EcmF3V2lkdGggLyAxLjVmLCBtRHJhd0hlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgQ29sb3IuQkxVRSwgQ29sb3IuTUFHRU5UQSwgU2hhZGVyLlRpbGVNb2RlLkNMQU1QKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgbVZlcnRHcmFkaWVudCA9IG5ldyBMaW5lYXJHcmFkaWVudCgwLjBmLCAwLjBmLCAwLjBmLCBtRHJhd0hlaWdodCAvIDIuMGYsCisgICAgICAgICAgICAgICAgICAgIENvbG9yLllFTExPVywgQ29sb3IuTUFHRU5UQSwgU2hhZGVyLlRpbGVNb2RlLk1JUlJPUik7CisKKyAgICAgICAgICAgIG1QYWludCA9IG5ldyBQYWludCgpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHByb3RlY3RlZCB2b2lkIG9uRHJhdyhDYW52YXMgY2FudmFzKSB7CisgICAgICAgICAgICBzdXBlci5vbkRyYXcoY2FudmFzKTsKKyAgICAgICAgICAgIC8vY2FudmFzLmRyYXdSR0IoMjU1LCAyNTUsIDI1NSk7CisKKyAgICAgICAgICAgIC8vIEJpdG1hcCBzaGFkZXJzCisgICAgICAgICAgICBjYW52YXMuc2F2ZSgpOworICAgICAgICAgICAgY2FudmFzLnRyYW5zbGF0ZSg0MC4wZiwgNDAuMGYpOworCisgICAgICAgICAgICBtUGFpbnQuc2V0U2hhZGVyKG1SZXBlYXRTaGFkZXIpOworICAgICAgICAgICAgY2FudmFzLmRyYXdSZWN0KDAuMGYsIDAuMGYsIG1EcmF3V2lkdGgsIG1EcmF3SGVpZ2h0LCBtUGFpbnQpOworICAgICAgICAgICAgCisgICAgICAgICAgICBjYW52YXMudHJhbnNsYXRlKDAuMGYsIDQwLjBmICsgbURyYXdIZWlnaHQpOworICAgICAgICAgICAgbVBhaW50LnNldFNoYWRlcihtVHJhbnNsYXRlZFNoYWRlcik7CisgICAgICAgICAgICBjYW52YXMuZHJhd1JlY3QoMC4wZiwgMC4wZiwgbURyYXdXaWR0aCwgbURyYXdIZWlnaHQsIG1QYWludCk7CisKKyAgICAgICAgICAgIGNhbnZhcy50cmFuc2xhdGUoMC4wZiwgNDAuMGYgKyBtRHJhd0hlaWdodCk7CisgICAgICAgICAgICBtUGFpbnQuc2V0U2hhZGVyKG1TY2FsZWRTaGFkZXIpOworICAgICAgICAgICAgY2FudmFzLmRyYXdSZWN0KDAuMGYsIDAuMGYsIG1EcmF3V2lkdGgsIG1EcmF3SGVpZ2h0LCBtUGFpbnQpOworCisgICAgICAgICAgICBjYW52YXMucmVzdG9yZSgpOworCisgICAgICAgICAgICAvLyBHcmFkaWVudHMKKyAgICAgICAgICAgIGNhbnZhcy5zYXZlKCk7CisgICAgICAgICAgICBjYW52YXMudHJhbnNsYXRlKDQwLjBmICsgbURyYXdXaWR0aCArIDQwLjBmLCA0MC4wZik7CisKKyAgICAgICAgICAgIG1QYWludC5zZXRTaGFkZXIobUhvckdyYWRpZW50KTsKKyAgICAgICAgICAgIGNhbnZhcy5kcmF3UmVjdCgwLjBmLCAwLjBmLCBtRHJhd1dpZHRoLCBtRHJhd0hlaWdodCwgbVBhaW50KTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgY2FudmFzLnRyYW5zbGF0ZSgwLjBmLCA0MC4wZiArIG1EcmF3SGVpZ2h0KTsKKyAgICAgICAgICAgIG1QYWludC5zZXRTaGFkZXIobURpYWdHcmFkaWVudCk7CisgICAgICAgICAgICBjYW52YXMuZHJhd1JlY3QoMC4wZiwgMC4wZiwgbURyYXdXaWR0aCwgbURyYXdIZWlnaHQsIG1QYWludCk7CisKKyAgICAgICAgICAgIGNhbnZhcy50cmFuc2xhdGUoMC4wZiwgNDAuMGYgKyBtRHJhd0hlaWdodCk7CisgICAgICAgICAgICBtUGFpbnQuc2V0U2hhZGVyKG1WZXJ0R3JhZGllbnQpOworICAgICAgICAgICAgY2FudmFzLmRyYXdSZWN0KDAuMGYsIDAuMGYsIG1EcmF3V2lkdGgsIG1EcmF3SGVpZ2h0LCBtUGFpbnQpOworICAgICAgICAgICAgCisgICAgICAgICAgICBjYW52YXMucmVzdG9yZSgpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvSHdBY2NlbGVyYXRpb25UZXN0L3NyYy9jb20vYW5kcm9pZC90ZXN0L2h3dWkvU2ltcGxlUGF0aHNBY3Rpdml0eS5qYXZhIGIvdGVzdHMvSHdBY2NlbGVyYXRpb25UZXN0L3NyYy9jb20vYW5kcm9pZC90ZXN0L2h3dWkvU2ltcGxlUGF0aHNBY3Rpdml0eS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMzZTE4YTMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9Id0FjY2VsZXJhdGlvblRlc3Qvc3JjL2NvbS9hbmRyb2lkL3Rlc3QvaHd1aS9TaW1wbGVQYXRoc0FjdGl2aXR5LmphdmEKQEAgLTAsMCArMSw0MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQudGVzdC5od3VpOworCitpbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHk7CitpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CitpbXBvcnQgYW5kcm9pZC52aWV3LkdyYXZpdHk7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuRWRpdFRleHQ7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuRnJhbWVMYXlvdXQ7CisKK0BTdXBwcmVzc1dhcm5pbmdzKHsiVW51c2VkRGVjbGFyYXRpb24ifSkKK3B1YmxpYyBjbGFzcyBTaW1wbGVQYXRoc0FjdGl2aXR5IGV4dGVuZHMgQWN0aXZpdHkgeworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG9uQ3JlYXRlKEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpIHsKKyAgICAgICAgc3VwZXIub25DcmVhdGUoc2F2ZWRJbnN0YW5jZVN0YXRlKTsKKworICAgICAgICBGcmFtZUxheW91dCBsYXlvdXQgPSBuZXcgRnJhbWVMYXlvdXQodGhpcyk7CisgICAgICAgIEVkaXRUZXh0IHRleHQgPSBuZXcgRWRpdFRleHQodGhpcyk7CisgICAgICAgIGxheW91dC5hZGRWaWV3KHRleHQsIG5ldyBGcmFtZUxheW91dC5MYXlvdXRQYXJhbXMoNjAwLCAzNTAsIEdyYXZpdHkuQ0VOVEVSKSk7CisgICAgICAgIHRleHQuc2V0VGV4dCgiVGhpcyBpcyBhbiBleGFtcGxlIG9mIGFuIEVkaXRUZXh0IHdpZGdldCBcbiIgKworICAgICAgICAgICAgICAgICJ1c2luZyBzaW1wbGUgcGF0aHMgdG8gY3JlYXRlIHRoZSBzZWxlY3Rpb24uIik7CisgICAgICAgIC8vdGV4dC5zZXRTZWxlY3Rpb24oMCwgdGV4dC5nZXRUZXh0KCkubGVuZ3RoKCkpOworCisgICAgICAgIHNldENvbnRlbnRWaWV3KGxheW91dCk7CisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL0h3QWNjZWxlcmF0aW9uVGVzdC9zcmMvY29tL2FuZHJvaWQvdGVzdC9od3VpL1N0YWNrQWN0aXZpdHkuamF2YSBiL3Rlc3RzL0h3QWNjZWxlcmF0aW9uVGVzdC9zcmMvY29tL2FuZHJvaWQvdGVzdC9od3VpL1N0YWNrQWN0aXZpdHkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NjU1YWRmCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvSHdBY2NlbGVyYXRpb25UZXN0L3NyYy9jb20vYW5kcm9pZC90ZXN0L2h3dWkvU3RhY2tBY3Rpdml0eS5qYXZhCkBAIC0wLDAgKzEsNTkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLnRlc3QuaHd1aTsKKworaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5OworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuRHJhd2FibGU7CitpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CitpbXBvcnQgYW5kcm9pZC52aWV3LkxheW91dEluZmxhdGVyOworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3R3JvdXA7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuQXJyYXlBZGFwdGVyOworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkltYWdlVmlldzsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5TdGFja1ZpZXc7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuVGV4dFZpZXc7CisKK0BTdXBwcmVzc1dhcm5pbmdzKHsiVW51c2VkRGVjbGFyYXRpb24ifSkKK3B1YmxpYyBjbGFzcyBTdGFja0FjdGl2aXR5IGV4dGVuZHMgQWN0aXZpdHkgeworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG9uQ3JlYXRlKEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpIHsKKyAgICAgICAgc3VwZXIub25DcmVhdGUoc2F2ZWRJbnN0YW5jZVN0YXRlKTsKKworICAgICAgICBzZXRDb250ZW50VmlldyhSLmxheW91dC5zdGFjayk7CisKKyAgICAgICAgU3RhY2tWaWV3IHN0YWNrID0gKFN0YWNrVmlldykgZmluZFZpZXdCeUlkKFIuaWQuc3RhY2tfdmlldyk7CisgICAgICAgIHN0YWNrLnNldEFkYXB0ZXIobmV3IEFycmF5QWRhcHRlcjxEcmF3YWJsZT4odGhpcywgYW5kcm9pZC5SLmxheW91dC5zaW1wbGVfbGlzdF9pdGVtXzEsCisgICAgICAgICAgICAgICAgYW5kcm9pZC5SLmlkLnRleHQxLCBuZXcgRHJhd2FibGVbXSB7CisgICAgICAgICAgICBnZXRSZXNvdXJjZXMoKS5nZXREcmF3YWJsZShSLmRyYXdhYmxlLnN1bnNldDEpLAorICAgICAgICAgICAgZ2V0UmVzb3VyY2VzKCkuZ2V0RHJhd2FibGUoUi5kcmF3YWJsZS5zdW5zZXQyKSwKKyAgICAgICAgfSkgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgVmlldyBnZXRWaWV3KGludCBwb3NpdGlvbiwgVmlldyBjb252ZXJ0VmlldywgVmlld0dyb3VwIHBhcmVudCkgeworICAgICAgICAgICAgICAgIFZpZXcgaXRlbSA9IGNvbnZlcnRWaWV3OworICAgICAgICAgICAgICAgIGlmIChpdGVtID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgaXRlbSA9IExheW91dEluZmxhdGVyLmZyb20oZ2V0Q29udGV4dCgpKS5pbmZsYXRlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFIubGF5b3V0LnN0YWNrX2l0ZW0sIG51bGwsIGZhbHNlKTsgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAoKEltYWdlVmlldykgaXRlbS5maW5kVmlld0J5SWQoUi5pZC50ZXh0dmlld19pY29uKSkuc2V0SW1hZ2VEcmF3YWJsZSgKKyAgICAgICAgICAgICAgICAgICAgICAgIGdldEl0ZW0ocG9zaXRpb24gJSBnZXRDb3VudCgpKSk7CisgICAgICAgICAgICAgICAgKChUZXh0VmlldykgaXRlbS5maW5kVmlld0J5SWQoUi5pZC5taW5pX3RleHQpKS5zZXRUZXh0KCIiICsgcG9zaXRpb24pOworICAgICAgICAgICAgICAgIHJldHVybiBpdGVtOworICAgICAgICAgICAgfQorICAgICAgICB9KTsKKyAgICAgICAgc3RhY2suc2V0RGlzcGxheWVkQ2hpbGQoMCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvSHdBY2NlbGVyYXRpb25UZXN0L3NyYy9jb20vYW5kcm9pZC90ZXN0L2h3dWkvVGV4dEFjdGl2aXR5LmphdmEgYi90ZXN0cy9Id0FjY2VsZXJhdGlvblRlc3Qvc3JjL2NvbS9hbmRyb2lkL3Rlc3QvaHd1aS9UZXh0QWN0aXZpdHkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYjBkZjUxCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvSHdBY2NlbGVyYXRpb25UZXN0L3NyYy9jb20vYW5kcm9pZC90ZXN0L2h3dWkvVGV4dEFjdGl2aXR5LmphdmEKQEAgLTAsMCArMSwxMDggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLnRlc3QuaHd1aTsKKworaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQ2FudmFzOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUGFpbnQ7CitpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CisKK0BTdXBwcmVzc1dhcm5pbmdzKHsiVW51c2VkRGVjbGFyYXRpb24ifSkKK3B1YmxpYyBjbGFzcyBUZXh0QWN0aXZpdHkgZXh0ZW5kcyBBY3Rpdml0eSB7CisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25DcmVhdGUoQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgeworICAgICAgICBzdXBlci5vbkNyZWF0ZShzYXZlZEluc3RhbmNlU3RhdGUpOworCisgICAgICAgIHNldENvbnRlbnRWaWV3KG5ldyBDdXN0b21UZXh0Vmlldyh0aGlzKSk7CisgICAgfQorCisgICAgc3RhdGljIGNsYXNzIEN1c3RvbVRleHRWaWV3IGV4dGVuZHMgVmlldyB7CisgICAgICAgIHByaXZhdGUgZmluYWwgUGFpbnQgbU1lZGl1bVBhaW50OworICAgICAgICBwcml2YXRlIGZpbmFsIFBhaW50IG1MYXJnZVBhaW50OworICAgICAgICBwcml2YXRlIGZpbmFsIFBhaW50IG1TdHJpa2VQYWludDsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBQYWludCBtU2NhbGVkUGFpbnQ7CisKKyAgICAgICAgQ3VzdG9tVGV4dFZpZXcoQ29udGV4dCBjKSB7CisgICAgICAgICAgICBzdXBlcihjKTsKKworICAgICAgICAgICAgbU1lZGl1bVBhaW50ID0gbmV3IFBhaW50KCk7CisgICAgICAgICAgICBtTWVkaXVtUGFpbnQuc2V0QW50aUFsaWFzKHRydWUpOworICAgICAgICAgICAgbU1lZGl1bVBhaW50LnNldENvbG9yKDB4ZmZmZjAwMDApOworCisgICAgICAgICAgICBtTGFyZ2VQYWludCA9IG5ldyBQYWludCgpOworICAgICAgICAgICAgbUxhcmdlUGFpbnQuc2V0QW50aUFsaWFzKHRydWUpOworICAgICAgICAgICAgbUxhcmdlUGFpbnQuc2V0VGV4dFNpemUoMzYuMGYpOworCisgICAgICAgICAgICBtU3RyaWtlUGFpbnQgPSBuZXcgUGFpbnQoKTsKKyAgICAgICAgICAgIG1TdHJpa2VQYWludC5zZXRBbnRpQWxpYXModHJ1ZSk7CisgICAgICAgICAgICBtU3RyaWtlUGFpbnQuc2V0VGV4dFNpemUoMTYuMGYpOworICAgICAgICAgICAgbVN0cmlrZVBhaW50LnNldFVuZGVybGluZVRleHQodHJ1ZSk7CisKKyAgICAgICAgICAgIG1TY2FsZWRQYWludCA9IG5ldyBQYWludCgpOworICAgICAgICAgICAgbVNjYWxlZFBhaW50LnNldEFudGlBbGlhcyh0cnVlKTsKKyAgICAgICAgICAgIG1TY2FsZWRQYWludC5zZXRUZXh0U2l6ZSgxNi4wZik7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHJvdGVjdGVkIHZvaWQgb25EcmF3KENhbnZhcyBjYW52YXMpIHsKKyAgICAgICAgICAgIHN1cGVyLm9uRHJhdyhjYW52YXMpOworICAgICAgICAgICAgY2FudmFzLmRyYXdSR0IoMjU1LCAyNTUsIDI1NSk7CisKKyAgICAgICAgICAgIGNhbnZhcy5kcmF3VGV4dCgiSGVsbG8gT3BlbkdMIHJlbmRlcmVyISIsIDEwMCwgMjAsIG1NZWRpdW1QYWludCk7CisgICAgICAgICAgICBtTWVkaXVtUGFpbnQuc2V0VGV4dEFsaWduKFBhaW50LkFsaWduLkNFTlRFUik7CisgICAgICAgICAgICBjYW52YXMuZHJhd1RleHQoIkhlbGxvIE9wZW5HTCByZW5kZXJlciEiLCAxMDAsIDQwLCBtTWVkaXVtUGFpbnQpOworICAgICAgICAgICAgbU1lZGl1bVBhaW50LnNldFRleHRBbGlnbihQYWludC5BbGlnbi5SSUdIVCk7CisgICAgICAgICAgICBjYW52YXMuZHJhd1RleHQoIkhlbGxvIE9wZW5HTCByZW5kZXJlciEiLCAxMDAsIDYwLCBtTWVkaXVtUGFpbnQpOworICAgICAgICAgICAgbU1lZGl1bVBhaW50LnNldFRleHRBbGlnbihQYWludC5BbGlnbi5MRUZUKTsKKyAgICAgICAgICAgIGNhbnZhcy5kcmF3VGV4dCgiSGVsbG8gT3BlbkdMIHJlbmRlcmVyISIsIDEwMCwgMTAwLCBtTWVkaXVtUGFpbnQpOworICAgICAgICAgICAgbU1lZGl1bVBhaW50LnNldFNoYWRvd0xheWVyKDIuNWYsIDAuMGYsIDAuMGYsIDB4ZmYwMDAwMDApOworICAgICAgICAgICAgY2FudmFzLmRyYXdUZXh0KCJIZWxsbyBPcGVuR0wgcmVuZGVyZXIhIiwgMTAwLCAxNTAsIG1NZWRpdW1QYWludCk7CisgICAgICAgICAgICBtTWVkaXVtUGFpbnQuY2xlYXJTaGFkb3dMYXllcigpOworICAgICAgICAgICAgY2FudmFzLmRyYXdUZXh0KCJIZWxsbyBPcGVuR0wgcmVuZGVyZXIhIiwgMTAwLCAyMDAsIG1MYXJnZVBhaW50KTsKKworICAgICAgICAgICAgbUxhcmdlUGFpbnQuc2V0U2hhZG93TGF5ZXIoMi41ZiwgMy4wZiwgMy4wZiwgMHhmZjAwMDAwMCk7CisgICAgICAgICAgICBjYW52YXMuZHJhd1RleHQoIkhlbGxvIE9wZW5HTCByZW5kZXJlciEiLCAxMDAsIDQwMCwgbUxhcmdlUGFpbnQpOworICAgICAgICAgICAgbUxhcmdlUGFpbnQuc2V0U2hhZG93TGF5ZXIoMy4wZiwgMy4wZiwgMy4wZiwgMHhmZjAwZmYwMCk7CisgICAgICAgICAgICBtTGFyZ2VQYWludC5zZXRBbHBoYSgxMDApOworICAgICAgICAgICAgY2FudmFzLmRyYXdUZXh0KCJIZWxsbyBPcGVuR0wgcmVuZGVyZXIhIiwgMTAwLCA1MDAsIG1MYXJnZVBhaW50KTsKKyAgICAgICAgICAgIG1MYXJnZVBhaW50LnNldEFscGhhKDI1NSk7CisgICAgICAgICAgICBtTGFyZ2VQYWludC5jbGVhclNoYWRvd0xheWVyKCk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGNhbnZhcy5kcmF3VGV4dCgiSGVsbG8gT3BlbkdMIHJlbmRlcmVyISIsIDUwMCwgNDAsIG1TdHJpa2VQYWludCk7CisgICAgICAgICAgICBtU3RyaWtlUGFpbnQuc2V0U3RyaWtlVGhydVRleHQodHJ1ZSk7CisgICAgICAgICAgICBjYW52YXMuZHJhd1RleHQoIkhlbGxvIE9wZW5HTCByZW5kZXJlciEiLCA1MDAsIDcwLCBtU3RyaWtlUGFpbnQpOworICAgICAgICAgICAgbVN0cmlrZVBhaW50LnNldFVuZGVybGluZVRleHQoZmFsc2UpOworICAgICAgICAgICAgY2FudmFzLmRyYXdUZXh0KCJIZWxsbyBPcGVuR0wgcmVuZGVyZXIhIiwgNTAwLCAxMDAsIG1TdHJpa2VQYWludCk7CisgICAgICAgICAgICBtU3RyaWtlUGFpbnQuc2V0U3RyaWtlVGhydVRleHQoZmFsc2UpOworICAgICAgICAgICAgbVN0cmlrZVBhaW50LnNldFVuZGVybGluZVRleHQodHJ1ZSk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIG1TY2FsZWRQYWludC5zZXRUZXh0U2NhbGVYKDAuNWYpOworICAgICAgICAgICAgY2FudmFzLmRyYXdUZXh0KCJIZWxsbyBPcGVuR0wgcmVuZGVyZXIhIiwgNTAwLCAyMDAsIG1TY2FsZWRQYWludCk7CisgICAgICAgICAgICBtU2NhbGVkUGFpbnQuc2V0VGV4dFNjYWxlWCgyLjBmKTsKKyAgICAgICAgICAgIGNhbnZhcy5kcmF3VGV4dCgiSGVsbG8gT3BlbkdMIHJlbmRlcmVyISIsIDUwMCwgMjMwLCBtU2NhbGVkUGFpbnQpOworICAgICAgICAgICAgbVNjYWxlZFBhaW50LnNldFRleHRTY2FsZVgoMS4wZik7CisgICAgICAgICAgICBjYW52YXMuZHJhd1RleHQoIkhlbGxvIE9wZW5HTCByZW5kZXJlciEiLCA1MDAsIDI2MCwgbVNjYWxlZFBhaW50KTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgY2FudmFzLnNhdmUoKTsKKyAgICAgICAgICAgIGNhbnZhcy5jbGlwUmVjdCgxNTAuMGYsIDIyMC4wZiwgNDUwLjBmLCAzMjAuMGYpOworICAgICAgICAgICAgY2FudmFzLmRyYXdUZXh0KCJIZWxsbyBPcGVuR0wgcmVuZGVyZXIhIiwgMTAwLCAzMDAsIG1MYXJnZVBhaW50KTsKKyAgICAgICAgICAgIGNhbnZhcy5yZXN0b3JlKCk7CisgICAgICAgIH0KKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvSHdBY2NlbGVyYXRpb25UZXN0L3NyYy9jb20vYW5kcm9pZC90ZXN0L2h3dWkvVGV4dEdhbW1hQWN0aXZpdHkuamF2YSBiL3Rlc3RzL0h3QWNjZWxlcmF0aW9uVGVzdC9zcmMvY29tL2FuZHJvaWQvdGVzdC9od3VpL1RleHRHYW1tYUFjdGl2aXR5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzczZDM5MAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL0h3QWNjZWxlcmF0aW9uVGVzdC9zcmMvY29tL2FuZHJvaWQvdGVzdC9od3VpL1RleHRHYW1tYUFjdGl2aXR5LmphdmEKQEAgLTAsMCArMSwxMDIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLnRlc3QuaHd1aTsKKworaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5CaXRtYXA7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5DYW52YXM7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5Qb3J0ZXJEdWZmOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuQ29sb3JEcmF3YWJsZTsKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuTGF5b3V0SW5mbGF0ZXI7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuSW1hZ2VWaWV3OworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkxpbmVhckxheW91dDsKKworQFN1cHByZXNzV2FybmluZ3MoeyJVbnVzZWREZWNsYXJhdGlvbiJ9KQorcHVibGljIGNsYXNzIFRleHRHYW1tYUFjdGl2aXR5IGV4dGVuZHMgQWN0aXZpdHkgeworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG9uQ3JlYXRlKEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpIHsKKyAgICAgICAgc3VwZXIub25DcmVhdGUoc2F2ZWRJbnN0YW5jZVN0YXRlKTsKKworICAgICAgICBmaW5hbCBMaW5lYXJMYXlvdXQgbGF5b3V0ID0gbmV3IExpbmVhckxheW91dCh0aGlzKTsKKyAgICAgICAgbGF5b3V0LnNldE9yaWVudGF0aW9uKExpbmVhckxheW91dC5WRVJUSUNBTCk7CisKKyAgICAgICAgZmluYWwgR2FtbWFUZXh0VmlldyBnYW1tYSA9IG5ldyBHYW1tYVRleHRWaWV3KHRoaXMpOworICAgICAgICBsYXlvdXQuYWRkVmlldyhnYW1tYSwgbmV3IExpbmVhckxheW91dC5MYXlvdXRQYXJhbXMoCisgICAgICAgICAgICAgICAgTGluZWFyTGF5b3V0LkxheW91dFBhcmFtcy5XUkFQX0NPTlRFTlQsIExpbmVhckxheW91dC5MYXlvdXRQYXJhbXMuV1JBUF9DT05URU5UCisgICAgICAgICkpOworCisgICAgICAgIHNldENvbnRlbnRWaWV3KGxheW91dCk7CisgICAgICAgIAorICAgICAgICBsYXlvdXQucG9zdChuZXcgUnVubmFibGUoKSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICBCaXRtYXAgYiA9IEJpdG1hcC5jcmVhdGVCaXRtYXAoZ2FtbWEuZ2V0V2lkdGgoKSwgZ2FtbWEuZ2V0SGVpZ2h0KCksCisgICAgICAgICAgICAgICAgICAgICAgICBCaXRtYXAuQ29uZmlnLkFSR0JfODg4OCk7CisgICAgICAgICAgICAgICAgQ2FudmFzIGMgPSBuZXcgQ2FudmFzKGIpOworICAgICAgICAgICAgICAgIGMuZHJhd0NvbG9yKDAsIFBvcnRlckR1ZmYuTW9kZS5DTEVBUik7CisgICAgICAgICAgICAgICAgZ2FtbWEuZHJhdyhjKTsKKworICAgICAgICAgICAgICAgIEltYWdlVmlldyBpbWFnZSA9IG5ldyBJbWFnZVZpZXcoVGV4dEdhbW1hQWN0aXZpdHkudGhpcyk7CisgICAgICAgICAgICAgICAgaW1hZ2Uuc2V0SW1hZ2VCaXRtYXAoYik7CisKKyAgICAgICAgICAgICAgICBsYXlvdXQuYWRkVmlldyhpbWFnZSwgbmV3IExpbmVhckxheW91dC5MYXlvdXRQYXJhbXMoCisgICAgICAgICAgICAgICAgICAgICAgICBMaW5lYXJMYXlvdXQuTGF5b3V0UGFyYW1zLldSQVBfQ09OVEVOVCwKKyAgICAgICAgICAgICAgICAgICAgICAgIExpbmVhckxheW91dC5MYXlvdXRQYXJhbXMuV1JBUF9DT05URU5UCisgICAgICAgICAgICAgICAgKSk7CisKKyAgICAgICAgICAgICAgICBzdGFydEFjdGl2aXR5KG5ldyBJbnRlbnQoVGV4dEdhbW1hQWN0aXZpdHkudGhpcywgU3ViR2FtbWFBY3Rpdml0eS5jbGFzcykpOworICAgICAgICAgICAgfQorICAgICAgICB9KTsKKworICAgICAgICBnZXRXaW5kb3coKS5zZXRCYWNrZ3JvdW5kRHJhd2FibGUobmV3IENvbG9yRHJhd2FibGUoMHhmZmZmZmZmZikpOworICAgIH0KKworICAgIHN0YXRpYyBjbGFzcyBHYW1tYVRleHRWaWV3IGV4dGVuZHMgTGluZWFyTGF5b3V0IHsKKyAgICAgICAgR2FtbWFUZXh0VmlldyhDb250ZXh0IGMpIHsKKyAgICAgICAgICAgIHN1cGVyKGMpOworCisgICAgICAgICAgICBzZXRCYWNrZ3JvdW5kQ29sb3IoMHhmZmZmZmZmZik7CisKKyAgICAgICAgICAgIGZpbmFsIExheW91dEluZmxhdGVyIGluZmxhdGVyID0gTGF5b3V0SW5mbGF0ZXIuZnJvbShjKTsKKyAgICAgICAgICAgIGluZmxhdGVyLmluZmxhdGUoUi5sYXlvdXQudGV4dF9sYXJnZSwgdGhpcywgdHJ1ZSk7CisgICAgICAgICAgICBpbmZsYXRlci5pbmZsYXRlKFIubGF5b3V0LnRleHRfbWVkaXVtLCB0aGlzLCB0cnVlKTsKKyAgICAgICAgICAgIGluZmxhdGVyLmluZmxhdGUoUi5sYXlvdXQudGV4dF9zbWFsbCwgdGhpcywgdHJ1ZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFN1YkdhbW1hQWN0aXZpdHkgZXh0ZW5kcyBBY3Rpdml0eSB7CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwcm90ZWN0ZWQgdm9pZCBvbkNyZWF0ZShCdW5kbGUgc2F2ZWRJbnN0YW5jZVN0YXRlKSB7CisgICAgICAgICAgICBzdXBlci5vbkNyZWF0ZShzYXZlZEluc3RhbmNlU3RhdGUpOworCisgICAgICAgICAgICBmaW5hbCBMaW5lYXJMYXlvdXQgbGF5b3V0ID0gbmV3IExpbmVhckxheW91dCh0aGlzKTsKKyAgICAgICAgICAgIGxheW91dC5zZXRPcmllbnRhdGlvbihMaW5lYXJMYXlvdXQuVkVSVElDQUwpOworICAgICAgICAKKyAgICAgICAgICAgIGZpbmFsIEdhbW1hVGV4dFZpZXcgZ2FtbWEgPSBuZXcgR2FtbWFUZXh0Vmlldyh0aGlzKTsKKyAgICAgICAgICAgIGZpbmFsIExpbmVhckxheW91dC5MYXlvdXRQYXJhbXMgbHAgPSBuZXcgTGluZWFyTGF5b3V0LkxheW91dFBhcmFtcygKKyAgICAgICAgICAgICAgICAgICAgTGluZWFyTGF5b3V0LkxheW91dFBhcmFtcy5XUkFQX0NPTlRFTlQsIExpbmVhckxheW91dC5MYXlvdXRQYXJhbXMuV1JBUF9DT05URU5UCisgICAgICAgICAgICApOworICAgICAgICAgICAgbHAuc2V0TWFyZ2lucygwLCA3NCwgMCwgMCk7CisgICAgICAgICAgICBsYXlvdXQuYWRkVmlldyhnYW1tYSwgbHApOworCisgICAgICAgICAgICBzZXRDb250ZW50VmlldyhsYXlvdXQpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvSHdBY2NlbGVyYXRpb25UZXN0L3NyYy9jb20vYW5kcm9pZC90ZXN0L2h3dWkvVGhpblBhdGNoZXNBY3Rpdml0eS5qYXZhIGIvdGVzdHMvSHdBY2NlbGVyYXRpb25UZXN0L3NyYy9jb20vYW5kcm9pZC90ZXN0L2h3dWkvVGhpblBhdGNoZXNBY3Rpdml0eS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQzNzRjMzIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9Id0FjY2VsZXJhdGlvblRlc3Qvc3JjL2NvbS9hbmRyb2lkL3Rlc3QvaHd1aS9UaGluUGF0Y2hlc0FjdGl2aXR5LmphdmEKQEAgLTAsMCArMSw2NSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQudGVzdC5od3VpOworCitpbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHk7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5SZXNvdXJjZXM7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5DYW52YXM7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZTsKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5GcmFtZUxheW91dDsKKworQFN1cHByZXNzV2FybmluZ3MoeyJVbnVzZWREZWNsYXJhdGlvbiJ9KQorcHVibGljIGNsYXNzIFRoaW5QYXRjaGVzQWN0aXZpdHkgZXh0ZW5kcyBBY3Rpdml0eSB7CisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25DcmVhdGUoQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgeworICAgICAgICBzdXBlci5vbkNyZWF0ZShzYXZlZEluc3RhbmNlU3RhdGUpOworICAgICAgICAKKyAgICAgICAgRnJhbWVMYXlvdXQgbGF5b3V0ID0gbmV3IEZyYW1lTGF5b3V0KHRoaXMpOworICAgICAgICBQYXRjaFZpZXcgYiA9IG5ldyBQYXRjaFZpZXcodGhpcyk7CisgICAgICAgIGIuc2V0TGF5b3V0UGFyYW1zKG5ldyBGcmFtZUxheW91dC5MYXlvdXRQYXJhbXMoRnJhbWVMYXlvdXQuTGF5b3V0UGFyYW1zLk1BVENIX1BBUkVOVCwKKyAgICAgICAgICAgICAgICBGcmFtZUxheW91dC5MYXlvdXRQYXJhbXMuTUFUQ0hfUEFSRU5UKSk7CisgICAgICAgIGxheW91dC5hZGRWaWV3KGIpOworICAgICAgICBsYXlvdXQuc2V0QmFja2dyb3VuZENvbG9yKDB4ZmZmZmZmZmYpOworICAgICAgICAKKyAgICAgICAgc2V0Q29udGVudFZpZXcobGF5b3V0KTsKKyAgICB9CisKKyAgICBwcml2YXRlIGNsYXNzIFBhdGNoVmlldyBleHRlbmRzIFZpZXcgeworICAgICAgICBwcml2YXRlIERyYXdhYmxlIG1QYXRjaDsKKworICAgICAgICBwdWJsaWMgUGF0Y2hWaWV3KEFjdGl2aXR5IGFjdGl2aXR5KSB7CisgICAgICAgICAgICBzdXBlcihhY3Rpdml0eSk7CisKKyAgICAgICAgICAgIGZpbmFsIFJlc291cmNlcyByZXNvdXJjZXMgPSBhY3Rpdml0eS5nZXRSZXNvdXJjZXMoKTsKKyAgICAgICAgICAgIG1QYXRjaCA9IHJlc291cmNlcy5nZXREcmF3YWJsZShSLmRyYXdhYmxlLmJ0bl90b2dnbGVfb24pOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHByb3RlY3RlZCB2b2lkIG9uRHJhdyhDYW52YXMgY2FudmFzKSB7CisgICAgICAgICAgICBmaW5hbCBpbnQgd2lkdGggPSAxMDA7CisgICAgICAgICAgICBmaW5hbCBpbnQgaGVpZ2h0ID0gNjA7CisKKyAgICAgICAgICAgIGZpbmFsIGludCBsZWZ0ID0gKGdldFdpZHRoKCkgLSB3aWR0aCkgLyAyOworICAgICAgICAgICAgZmluYWwgaW50IHRvcCAgPSAoZ2V0SGVpZ2h0KCkgLSBoZWlnaHQpIC8gMjsKKworICAgICAgICAgICAgbVBhdGNoLnNldEJvdW5kcyhsZWZ0LCB0b3AsIGxlZnQgKyB3aWR0aCwgdG9wICsgaGVpZ2h0KTsKKyAgICAgICAgICAgIG1QYXRjaC5kcmF3KGNhbnZhcyk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9Id0FjY2VsZXJhdGlvblRlc3Qvc3JjL2NvbS9hbmRyb2lkL3Rlc3QvaHd1aS9UcmFuc2Zvcm0zZEFjdGl2aXR5LmphdmEgYi90ZXN0cy9Id0FjY2VsZXJhdGlvblRlc3Qvc3JjL2NvbS9hbmRyb2lkL3Rlc3QvaHd1aS9UcmFuc2Zvcm0zZEFjdGl2aXR5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmRmNjZlNgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL0h3QWNjZWxlcmF0aW9uVGVzdC9zcmMvY29tL2FuZHJvaWQvdGVzdC9od3VpL1RyYW5zZm9ybTNkQWN0aXZpdHkuamF2YQpAQCAtMCwwICsxLDk3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC50ZXN0Lmh3dWk7CisKK2ltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eTsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkJpdG1hcDsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkJpdG1hcEZhY3Rvcnk7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5DYW1lcmE7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5DYW52YXM7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5NYXRyaXg7CitpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CisKK0BTdXBwcmVzc1dhcm5pbmdzKHsiVW51c2VkRGVjbGFyYXRpb24ifSkKK3B1YmxpYyBjbGFzcyBUcmFuc2Zvcm0zZEFjdGl2aXR5IGV4dGVuZHMgQWN0aXZpdHkgeworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG9uQ3JlYXRlKEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpIHsKKyAgICAgICAgc3VwZXIub25DcmVhdGUoc2F2ZWRJbnN0YW5jZVN0YXRlKTsKKyAgICAgICAgZmluYWwgVHJhbnNmb3JtM2RWaWV3IHZpZXcgPSBuZXcgVHJhbnNmb3JtM2RWaWV3KHRoaXMpOworICAgICAgICBzZXRDb250ZW50Vmlldyh2aWV3KTsKKyAgICB9CisKKyAgICBzdGF0aWMgY2xhc3MgVHJhbnNmb3JtM2RWaWV3IGV4dGVuZHMgVmlldyB7CisgICAgICAgIHByaXZhdGUgZmluYWwgQml0bWFwIG1CaXRtYXAxOworICAgICAgICBwcml2YXRlIENhbWVyYSBtQ2FtZXJhOworICAgICAgICBwcml2YXRlIE1hdHJpeCBtTWF0cml4OworCisgICAgICAgIFRyYW5zZm9ybTNkVmlldyhDb250ZXh0IGMpIHsKKyAgICAgICAgICAgIHN1cGVyKGMpOworCisgICAgICAgICAgICBtQml0bWFwMSA9IEJpdG1hcEZhY3RvcnkuZGVjb2RlUmVzb3VyY2UoYy5nZXRSZXNvdXJjZXMoKSwgUi5kcmF3YWJsZS5zdW5zZXQxKTsKKyAgICAgICAgICAgIG1DYW1lcmEgPSBuZXcgQ2FtZXJhKCk7CisgICAgICAgICAgICBtTWF0cml4ID0gbmV3IE1hdHJpeCgpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHByb3RlY3RlZCB2b2lkIG9uRHJhdyhDYW52YXMgY2FudmFzKSB7CisgICAgICAgICAgICBzdXBlci5vbkRyYXcoY2FudmFzKTsKKworICAgICAgICAgICAgY2FudmFzLmRyYXdBUkdCKDI1NSwgMjU1LCAyNTUsIDI1NSk7CisKKyAgICAgICAgICAgIGZpbmFsIGZsb2F0IGNlbnRlclggPSBnZXRXaWR0aCgpIC8gMi4wZiAtIG1CaXRtYXAxLmdldFdpZHRoKCkgLyAyLjBmOworICAgICAgICAgICAgZmluYWwgZmxvYXQgY2VudGVyWSA9IGdldEhlaWdodCgpIC8gMi4wZiAtIG1CaXRtYXAxLmdldEhlaWdodCgpIC8gMi4wZjsKKyAgICAgICAgICAgIGZpbmFsIENhbWVyYSBjYW1lcmEgPSBtQ2FtZXJhOworICAgICAgICAgICAgCisgICAgICAgICAgICBmaW5hbCBNYXRyaXggbWF0cml4ID0gbU1hdHJpeDsKKworICAgICAgICAgICAgcm90YXRlKGNlbnRlclgsIGNlbnRlclksIGNhbWVyYSwgbWF0cml4LCAzMi4wZik7CisgICAgICAgICAgICBkcmF3Qml0bWFwKGNhbnZhcywgY2VudGVyWCwgY2VudGVyWSwgMC4wZiwgbWF0cml4KTsKKworICAgICAgICAgICAgcm90YXRlKGNlbnRlclgsIGNlbnRlclksIGNhbWVyYSwgbWF0cml4LCAxMi4wZik7CisgICAgICAgICAgICBkcmF3Qml0bWFwKGNhbnZhcywgY2VudGVyWCwgY2VudGVyWSwgLW1CaXRtYXAxLmdldFdpZHRoKCksIG1hdHJpeCk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIHJvdGF0ZShjZW50ZXJYLCBjZW50ZXJZLCBjYW1lcmEsIG1hdHJpeCwgNTIuMGYpOworICAgICAgICAgICAgZHJhd0JpdG1hcChjYW52YXMsIGNlbnRlclgsIGNlbnRlclksIG1CaXRtYXAxLmdldFdpZHRoKCksIG1hdHJpeCk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIHJvdGF0ZShjZW50ZXJYLCBjZW50ZXJZLCBjYW1lcmEsIG1hdHJpeCwgMTIyLjBmKTsKKyAgICAgICAgICAgIGRyYXdCaXRtYXAoY2FudmFzLCBjZW50ZXJYLCBjZW50ZXJZLCBtQml0bWFwMS5nZXRXaWR0aCgpICogMi4wZiwgbWF0cml4KTsKKyAgICAgICAgICAgIAorICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSB2b2lkIGRyYXdCaXRtYXAoQ2FudmFzIGNhbnZhcywgZmxvYXQgY2VudGVyWCwgZmxvYXQgY2VudGVyWSwgZmxvYXQgb2Zmc2V0LAorICAgICAgICAgICAgICAgIE1hdHJpeCBtYXRyaXgpIHsKKyAgICAgICAgICAgIGNhbnZhcy5zYXZlKCk7CisgICAgICAgICAgICBjYW52YXMudHJhbnNsYXRlKG9mZnNldCwgMC4wZik7CisgICAgICAgICAgICBjYW52YXMuY29uY2F0KG1hdHJpeCk7CisgICAgICAgICAgICBjYW52YXMuZHJhd0JpdG1hcChtQml0bWFwMSwgY2VudGVyWCwgY2VudGVyWSwgbnVsbCk7CisgICAgICAgICAgICBjYW52YXMucmVzdG9yZSgpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSB2b2lkIHJvdGF0ZShmbG9hdCBjZW50ZXJYLCBmbG9hdCBjZW50ZXJZLCBDYW1lcmEgY2FtZXJhLAorICAgICAgICAgICAgICAgIE1hdHJpeCBtYXRyaXgsIGZsb2F0IGFuZ2xlKSB7CisgICAgICAgICAgICBjYW1lcmEuc2F2ZSgpOworICAgICAgICAgICAgY2FtZXJhLnJvdGF0ZVkoYW5nbGUpOworICAgICAgICAgICAgY2FtZXJhLmdldE1hdHJpeChtYXRyaXgpOworICAgICAgICAgICAgY2FtZXJhLnJlc3RvcmUoKTsKKworICAgICAgICAgICAgbWF0cml4LnByZVRyYW5zbGF0ZSgtY2VudGVyWCwgLWNlbnRlclkpOworICAgICAgICAgICAgbWF0cml4LnBvc3RUcmFuc2xhdGUoY2VudGVyWCwgY2VudGVyWSk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9Id0FjY2VsZXJhdGlvblRlc3Qvc3JjL2NvbS9hbmRyb2lkL3Rlc3QvaHd1aS9UcmFuc3BhcmVudExpc3RBY3Rpdml0eS5qYXZhIGIvdGVzdHMvSHdBY2NlbGVyYXRpb25UZXN0L3NyYy9jb20vYW5kcm9pZC90ZXN0L2h3dWkvVHJhbnNwYXJlbnRMaXN0QWN0aXZpdHkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNDdiMDBmCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvSHdBY2NlbGVyYXRpb25UZXN0L3NyYy9jb20vYW5kcm9pZC90ZXN0L2h3dWkvVHJhbnNwYXJlbnRMaXN0QWN0aXZpdHkuamF2YQpAQCAtMCwwICsxLDExOSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQudGVzdC5od3VpOworCitpbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHk7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5SZXNvdXJjZXM7CitpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CitpbXBvcnQgYW5kcm9pZC51dGlsLkRpc3BsYXlNZXRyaWNzOworaW1wb3J0IGFuZHJvaWQudmlldy5Db250ZXh0TWVudTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlld0dyb3VwOworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkFycmF5QWRhcHRlcjsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5MaXN0QWRhcHRlcjsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5MaXN0VmlldzsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5UZXh0VmlldzsKKworQFN1cHByZXNzV2FybmluZ3MoeyJVbnVzZWREZWNsYXJhdGlvbiJ9KQorcHVibGljIGNsYXNzIFRyYW5zcGFyZW50TGlzdEFjdGl2aXR5IGV4dGVuZHMgQWN0aXZpdHkgeworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIERBVEFfTElTVCA9IHsKKyAgICAgICAgICAgICJBZmdoYW5pc3RhbiIsICJBbGJhbmlhIiwgIkFsZ2VyaWEiLCAiQW1lcmljYW4gU2Ftb2EiLCAiQW5kb3JyYSIsCisgICAgICAgICAgICAiQW5nb2xhIiwgIkFuZ3VpbGxhIiwgIkFudGFyY3RpY2EiLCAiQW50aWd1YSBhbmQgQmFyYnVkYSIsICJBcmdlbnRpbmEiLAorICAgICAgICAgICAgIkFybWVuaWEiLCAiQXJ1YmEiLCAiQXVzdHJhbGlhIiwgIkF1c3RyaWEiLCAiQXplcmJhaWphbiIsCisgICAgICAgICAgICAiQmFocmFpbiIsICJCYW5nbGFkZXNoIiwgIkJhcmJhZG9zIiwgIkJlbGFydXMiLCAiQmVsZ2l1bSIsCisgICAgICAgICAgICAiQmVsaXplIiwgIkJlbmluIiwgIkJlcm11ZGEiLCAiQmh1dGFuIiwgIkJvbGl2aWEiLAorICAgICAgICAgICAgIkJvc25pYSBhbmQgSGVyemVnb3ZpbmEiLCAiQm90c3dhbmEiLCAiQm91dmV0IElzbGFuZCIsICJCcmF6aWwiLAorICAgICAgICAgICAgIkJyaXRpc2ggSW5kaWFuIE9jZWFuIFRlcnJpdG9yeSIsICJCcml0aXNoIFZpcmdpbiBJc2xhbmRzIiwgIkJydW5laSIsICJCdWxnYXJpYSIsCisgICAgICAgICAgICAiQnVya2luYSBGYXNvIiwgIkJ1cnVuZGkiLCAiQ290ZSBkJ0l2b2lyZSIsICJDYW1ib2RpYSIsICJDYW1lcm9vbiIsICJDYW5hZGEiLCAiQ2FwZSBWZXJkZSIsCisgICAgICAgICAgICAiQ2F5bWFuIElzbGFuZHMiLCAiQ2VudHJhbCBBZnJpY2FuIFJlcHVibGljIiwgIkNoYWQiLCAiQ2hpbGUiLCAiQ2hpbmEiLAorICAgICAgICAgICAgIkNocmlzdG1hcyBJc2xhbmQiLCAiQ29jb3MgKEtlZWxpbmcpIElzbGFuZHMiLCAiQ29sb21iaWEiLCAiQ29tb3JvcyIsICJDb25nbyIsCisgICAgICAgICAgICAiQ29vayBJc2xhbmRzIiwgIkNvc3RhIFJpY2EiLCAiQ3JvYXRpYSIsICJDdWJhIiwgIkN5cHJ1cyIsICJDemVjaCBSZXB1YmxpYyIsCisgICAgICAgICAgICAiRGVtb2NyYXRpYyBSZXB1YmxpYyBvZiB0aGUgQ29uZ28iLCAiRGVubWFyayIsICJEamlib3V0aSIsICJEb21pbmljYSIsICJEb21pbmljYW4gUmVwdWJsaWMiLAorICAgICAgICAgICAgIkVhc3QgVGltb3IiLCAiRWN1YWRvciIsICJFZ3lwdCIsICJFbCBTYWx2YWRvciIsICJFcXVhdG9yaWFsIEd1aW5lYSIsICJFcml0cmVhIiwKKyAgICAgICAgICAgICJFc3RvbmlhIiwgIkV0aGlvcGlhIiwgIkZhZXJvZSBJc2xhbmRzIiwgIkZhbGtsYW5kIElzbGFuZHMiLCAiRmlqaSIsICJGaW5sYW5kIiwKKyAgICAgICAgICAgICJGb3JtZXIgWXVnb3NsYXYgUmVwdWJsaWMgb2YgTWFjZWRvbmlhIiwgIkZyYW5jZSIsICJGcmVuY2ggR3VpYW5hIiwgIkZyZW5jaCBQb2x5bmVzaWEiLAorICAgICAgICAgICAgIkZyZW5jaCBTb3V0aGVybiBUZXJyaXRvcmllcyIsICJHYWJvbiIsICJHZW9yZ2lhIiwgIkdlcm1hbnkiLCAiR2hhbmEiLCAiR2licmFsdGFyIiwKKyAgICAgICAgICAgICJHcmVlY2UiLCAiR3JlZW5sYW5kIiwgIkdyZW5hZGEiLCAiR3VhZGVsb3VwZSIsICJHdWFtIiwgIkd1YXRlbWFsYSIsICJHdWluZWEiLCAiR3VpbmVhLUJpc3NhdSIsCisgICAgICAgICAgICAiR3V5YW5hIiwgIkhhaXRpIiwgIkhlYXJkIElzbGFuZCBhbmQgTWNEb25hbGQgSXNsYW5kcyIsICJIb25kdXJhcyIsICJIb25nIEtvbmciLCAiSHVuZ2FyeSIsCisgICAgICAgICAgICAiSWNlbGFuZCIsICJJbmRpYSIsICJJbmRvbmVzaWEiLCAiSXJhbiIsICJJcmFxIiwgIklyZWxhbmQiLCAiSXNyYWVsIiwgIkl0YWx5IiwgIkphbWFpY2EiLAorICAgICAgICAgICAgIkphcGFuIiwgIkpvcmRhbiIsICJLYXpha2hzdGFuIiwgIktlbnlhIiwgIktpcmliYXRpIiwgIkt1d2FpdCIsICJLeXJneXpzdGFuIiwgIkxhb3MiLAorICAgICAgICAgICAgIkxhdHZpYSIsICJMZWJhbm9uIiwgIkxlc290aG8iLCAiTGliZXJpYSIsICJMaWJ5YSIsICJMaWVjaHRlbnN0ZWluIiwgIkxpdGh1YW5pYSIsICJMdXhlbWJvdXJnIiwKKyAgICAgICAgICAgICJNYWNhdSIsICJNYWRhZ2FzY2FyIiwgIk1hbGF3aSIsICJNYWxheXNpYSIsICJNYWxkaXZlcyIsICJNYWxpIiwgIk1hbHRhIiwgIk1hcnNoYWxsIElzbGFuZHMiLAorICAgICAgICAgICAgIk1hcnRpbmlxdWUiLCAiTWF1cml0YW5pYSIsICJNYXVyaXRpdXMiLCAiTWF5b3R0ZSIsICJNZXhpY28iLCAiTWljcm9uZXNpYSIsICJNb2xkb3ZhIiwKKyAgICAgICAgICAgICJNb25hY28iLCAiTW9uZ29saWEiLCAiTW9udHNlcnJhdCIsICJNb3JvY2NvIiwgIk1vemFtYmlxdWUiLCAiTXlhbm1hciIsICJOYW1pYmlhIiwKKyAgICAgICAgICAgICJOYXVydSIsICJOZXBhbCIsICJOZXRoZXJsYW5kcyIsICJOZXRoZXJsYW5kcyBBbnRpbGxlcyIsICJOZXcgQ2FsZWRvbmlhIiwgIk5ldyBaZWFsYW5kIiwKKyAgICAgICAgICAgICJOaWNhcmFndWEiLCAiTmlnZXIiLCAiTmlnZXJpYSIsICJOaXVlIiwgIk5vcmZvbGsgSXNsYW5kIiwgIk5vcnRoIEtvcmVhIiwgIk5vcnRoZXJuIE1hcmlhbmFzIiwKKyAgICAgICAgICAgICJOb3J3YXkiLCAiT21hbiIsICJQYWtpc3RhbiIsICJQYWxhdSIsICJQYW5hbWEiLCAiUGFwdWEgTmV3IEd1aW5lYSIsICJQYXJhZ3VheSIsICJQZXJ1IiwKKyAgICAgICAgICAgICJQaGlsaXBwaW5lcyIsICJQaXRjYWlybiBJc2xhbmRzIiwgIlBvbGFuZCIsICJQb3J0dWdhbCIsICJQdWVydG8gUmljbyIsICJRYXRhciIsCisgICAgICAgICAgICAiUmV1bmlvbiIsICJSb21hbmlhIiwgIlJ1c3NpYSIsICJSd2FuZGEiLCAiU3FvIFRvbWUgYW5kIFByaW5jaXBlIiwgIlNhaW50IEhlbGVuYSIsCisgICAgICAgICAgICAiU2FpbnQgS2l0dHMgYW5kIE5ldmlzIiwgIlNhaW50IEx1Y2lhIiwgIlNhaW50IFBpZXJyZSBhbmQgTWlxdWVsb24iLAorICAgICAgICAgICAgIlNhaW50IFZpbmNlbnQgYW5kIHRoZSBHcmVuYWRpbmVzIiwgIlNhbW9hIiwgIlNhbiBNYXJpbm8iLCAiU2F1ZGkgQXJhYmlhIiwgIlNlbmVnYWwiLAorICAgICAgICAgICAgIlNleWNoZWxsZXMiLCAiU2llcnJhIExlb25lIiwgIlNpbmdhcG9yZSIsICJTbG92YWtpYSIsICJTbG92ZW5pYSIsICJTb2xvbW9uIElzbGFuZHMiLAorICAgICAgICAgICAgIlNvbWFsaWEiLCAiU291dGggQWZyaWNhIiwgIlNvdXRoIEdlb3JnaWEgYW5kIHRoZSBTb3V0aCBTYW5kd2ljaCBJc2xhbmRzIiwgIlNvdXRoIEtvcmVhIiwKKyAgICAgICAgICAgICJTcGFpbiIsICJTcmkgTGFua2EiLCAiU3VkYW4iLCAiU3VyaW5hbWUiLCAiU3ZhbGJhcmQgYW5kIEphbiBNYXllbiIsICJTd2F6aWxhbmQiLCAiU3dlZGVuIiwKKyAgICAgICAgICAgICJTd2l0emVybGFuZCIsICJTeXJpYSIsICJUYWl3YW4iLCAiVGFqaWtpc3RhbiIsICJUYW56YW5pYSIsICJUaGFpbGFuZCIsICJUaGUgQmFoYW1hcyIsCisgICAgICAgICAgICAiVGhlIEdhbWJpYSIsICJUb2dvIiwgIlRva2VsYXUiLCAiVG9uZ2EiLCAiVHJpbmlkYWQgYW5kIFRvYmFnbyIsICJUdW5pc2lhIiwgIlR1cmtleSIsCisgICAgICAgICAgICAiVHVya21lbmlzdGFuIiwgIlR1cmtzIGFuZCBDYWljb3MgSXNsYW5kcyIsICJUdXZhbHUiLCAiVmlyZ2luIElzbGFuZHMiLCAiVWdhbmRhIiwKKyAgICAgICAgICAgICJVa3JhaW5lIiwgIlVuaXRlZCBBcmFiIEVtaXJhdGVzIiwgIlVuaXRlZCBLaW5nZG9tIiwKKyAgICAgICAgICAgICJVbml0ZWQgU3RhdGVzIiwgIlVuaXRlZCBTdGF0ZXMgTWlub3IgT3V0bHlpbmcgSXNsYW5kcyIsICJVcnVndWF5IiwgIlV6YmVraXN0YW4iLAorICAgICAgICAgICAgIlZhbnVhdHUiLCAiVmF0aWNhbiBDaXR5IiwgIlZlbmV6dWVsYSIsICJWaWV0bmFtIiwgIldhbGxpcyBhbmQgRnV0dW5hIiwgIldlc3Rlcm4gU2FoYXJhIiwKKyAgICAgICAgICAgICJZZW1lbiIsICJZdWdvc2xhdmlhIiwgIlphbWJpYSIsICJaaW1iYWJ3ZSIKKyAgICB9OworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25DcmVhdGUoQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgeworICAgICAgICBzdXBlci5vbkNyZWF0ZShzYXZlZEluc3RhbmNlU3RhdGUpOworICAgICAgICAKKyAgICAgICAgZ2V0V2luZG93KCkuc2V0QmFja2dyb3VuZERyYXdhYmxlKGdldFJlc291cmNlcygpLmdldERyYXdhYmxlKFIuZHJhd2FibGUuZGVmYXVsdF93YWxscGFwZXIpKTsKKyAgICAgICAgc2V0Q29udGVudFZpZXcoUi5sYXlvdXQubGlzdF9hY3Rpdml0eSk7CisKKyAgICAgICAgTGlzdEFkYXB0ZXIgYWRhcHRlciA9IG5ldyBTaW1wbGVMaXN0QWRhcHRlcih0aGlzKTsKKworICAgICAgICBMaXN0VmlldyBsaXN0ID0gKExpc3RWaWV3KSBmaW5kVmlld0J5SWQoUi5pZC5saXN0KTsKKyAgICAgICAgbGlzdC5zZXRBZGFwdGVyKGFkYXB0ZXIpOworICAgICAgICBsaXN0LnNldENhY2hlQ29sb3JIaW50KDApOworCisgICAgICAgIHJlZ2lzdGVyRm9yQ29udGV4dE1lbnUobGlzdCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb25DcmVhdGVDb250ZXh0TWVudShDb250ZXh0TWVudSBtZW51LCBWaWV3IHYsIENvbnRleHRNZW51LkNvbnRleHRNZW51SW5mbyBtZW51SW5mbykgeworICAgICAgICBzdXBlci5vbkNyZWF0ZUNvbnRleHRNZW51KG1lbnUsIHYsIG1lbnVJbmZvKTsKKyAgICAgICAgbWVudS5zZXRIZWFkZXJUaXRsZSgiQ29udGV4dCBtZW51Iik7CisgICAgICAgIG1lbnUuYWRkKCJMaXN0IGl0ZW0gMSIpOworICAgICAgICBtZW51LmFkZCgiTGlzdCBpdGVtIDIiKTsKKyAgICAgICAgbWVudS5hZGQoIkxpc3QgaXRlbSAzIik7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgU2ltcGxlTGlzdEFkYXB0ZXIgZXh0ZW5kcyBBcnJheUFkYXB0ZXI8U3RyaW5nPiB7CisgICAgICAgIHB1YmxpYyBTaW1wbGVMaXN0QWRhcHRlcihDb250ZXh0IGNvbnRleHQpIHsKKyAgICAgICAgICAgIHN1cGVyKGNvbnRleHQsIGFuZHJvaWQuUi5sYXlvdXQuc2ltcGxlX2xpc3RfaXRlbV8xLCBEQVRBX0xJU1QpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBWaWV3IGdldFZpZXcoaW50IHBvc2l0aW9uLCBWaWV3IGNvbnZlcnRWaWV3LCBWaWV3R3JvdXAgcGFyZW50KSB7CisgICAgICAgICAgICBUZXh0VmlldyB2ID0gKFRleHRWaWV3KSBzdXBlci5nZXRWaWV3KHBvc2l0aW9uLCBjb252ZXJ0VmlldywgcGFyZW50KTsKKyAgICAgICAgICAgIGZpbmFsIFJlc291cmNlcyByID0gZ2V0Q29udGV4dCgpLmdldFJlc291cmNlcygpOworICAgICAgICAgICAgZmluYWwgRGlzcGxheU1ldHJpY3MgbWV0cmljcyA9IHIuZ2V0RGlzcGxheU1ldHJpY3MoKTsKKyAgICAgICAgICAgIHYuc2V0Q29tcG91bmREcmF3YWJsZVBhZGRpbmcoKGludCkgKDYgKiBtZXRyaWNzLmRlbnNpdHkgKyAwLjVmKSk7CisgICAgICAgICAgICB2LnNldENvbXBvdW5kRHJhd2FibGVzV2l0aEludHJpbnNpY0JvdW5kcyhyLmdldERyYXdhYmxlKFIuZHJhd2FibGUuaWNvbiksCisgICAgICAgICAgICAgICAgICAgIG51bGwsIG51bGwsIG51bGwpOworICAgICAgICAgICAgcmV0dXJuIHY7CisgICAgICAgIH0KKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvSHdBY2NlbGVyYXRpb25UZXN0L3NyYy9jb20vYW5kcm9pZC90ZXN0L2h3dWkvWGZlcm1vZGVBY3Rpdml0eS5qYXZhIGIvdGVzdHMvSHdBY2NlbGVyYXRpb25UZXN0L3NyYy9jb20vYW5kcm9pZC90ZXN0L2h3dWkvWGZlcm1vZGVBY3Rpdml0eS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQxMTA3N2YKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9Id0FjY2VsZXJhdGlvblRlc3Qvc3JjL2NvbS9hbmRyb2lkL3Rlc3QvaHd1aS9YZmVybW9kZUFjdGl2aXR5LmphdmEKQEAgLTAsMCArMSwxMzcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLnRlc3QuaHd1aTsKKworaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQ2FudmFzOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUGFpbnQ7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5Qb3J0ZXJEdWZmOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUG9ydGVyRHVmZlhmZXJtb2RlOworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OworCitpbXBvcnQgc3RhdGljIGFuZHJvaWQuZ3JhcGhpY3MuUG9ydGVyRHVmZi5Nb2RlOworCitAU3VwcHJlc3NXYXJuaW5ncyh7IlVudXNlZERlY2xhcmF0aW9uIn0pCitwdWJsaWMgY2xhc3MgWGZlcm1vZGVBY3Rpdml0eSBleHRlbmRzIEFjdGl2aXR5IHsKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvbkNyZWF0ZShCdW5kbGUgc2F2ZWRJbnN0YW5jZVN0YXRlKSB7CisgICAgICAgIHN1cGVyLm9uQ3JlYXRlKHNhdmVkSW5zdGFuY2VTdGF0ZSk7CisgICAgICAgIAorICAgICAgICBzZXRDb250ZW50VmlldyhuZXcgWGZlcm1vZGVzVmlldyh0aGlzKSk7CisgICAgfQorCisgICAgc3RhdGljIGNsYXNzIFhmZXJtb2Rlc1ZpZXcgZXh0ZW5kcyBWaWV3IHsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBQYWludCBtQmx1ZVBhaW50OworICAgICAgICBwcml2YXRlIGZpbmFsIFBhaW50IG1SZWRQYWludDsKKworICAgICAgICBYZmVybW9kZXNWaWV3KENvbnRleHQgYykgeworICAgICAgICAgICAgc3VwZXIoYyk7CisKKyAgICAgICAgICAgIG1CbHVlUGFpbnQgPSBuZXcgUGFpbnQoKTsKKyAgICAgICAgICAgIG1CbHVlUGFpbnQuc2V0Q29sb3IoMHhmZjAwMDBmZik7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIG1SZWRQYWludCA9IG5ldyBQYWludCgpOworICAgICAgICAgICAgbVJlZFBhaW50LnNldENvbG9yKDB4N2ZmZjAwMDApOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHByb3RlY3RlZCB2b2lkIG9uRHJhdyhDYW52YXMgY2FudmFzKSB7CisgICAgICAgICAgICBzdXBlci5vbkRyYXcoY2FudmFzKTsKKyAgICAgICAgICAgIC8vY2FudmFzLmRyYXdSR0IoMjU1LCAyNTUsIDI1NSk7CisKKyAgICAgICAgICAgIGNhbnZhcy50cmFuc2xhdGUoMTAwLjBmLCAxMDAuMGYpOworICAgICAgICAgICAgCisgICAgICAgICAgICAvLyBTUkMgbW9kZXMKKyAgICAgICAgICAgIGNhbnZhcy5zYXZlKCk7CisKKyAgICAgICAgICAgIGRyYXdSZWN0cyhjYW52YXMsIE1vZGUuU1JDX09WRVIpOworICAgICAgICAgICAgY2FudmFzLnRyYW5zbGF0ZSgwLjBmLCAxMDAuMGYpOworCisgICAgICAgICAgICBkcmF3UmVjdHMoY2FudmFzLCBNb2RlLlNSQ19JTik7CisgICAgICAgICAgICBjYW52YXMudHJhbnNsYXRlKDAuMGYsIDEwMC4wZik7ICAgICAgICAgICAgCisKKyAgICAgICAgICAgIGRyYXdSZWN0cyhjYW52YXMsIE1vZGUuU1JDX09VVCk7CisgICAgICAgICAgICBjYW52YXMudHJhbnNsYXRlKDAuMGYsIDEwMC4wZik7CisKKyAgICAgICAgICAgIGRyYXdSZWN0cyhjYW52YXMsIE1vZGUuU1JDX0FUT1ApOworICAgICAgICAgICAgY2FudmFzLnRyYW5zbGF0ZSgwLjBmLCAxMDAuMGYpOworICAgICAgICAgICAgCisgICAgICAgICAgICBkcmF3UmVjdHMoY2FudmFzLCBNb2RlLlNSQyk7CisKKyAgICAgICAgICAgIGNhbnZhcy5yZXN0b3JlKCk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGNhbnZhcy50cmFuc2xhdGUoMTAwLjBmLCAwLjBmKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgLy8gRFNUIG1vZGVzCisgICAgICAgICAgICBjYW52YXMuc2F2ZSgpOworCisgICAgICAgICAgICBkcmF3UmVjdHMoY2FudmFzLCBNb2RlLkRTVF9PVkVSKTsKKyAgICAgICAgICAgIGNhbnZhcy50cmFuc2xhdGUoMC4wZiwgMTAwLjBmKTsKKworICAgICAgICAgICAgZHJhd1JlY3RzKGNhbnZhcywgTW9kZS5EU1RfSU4pOworICAgICAgICAgICAgY2FudmFzLnRyYW5zbGF0ZSgwLjBmLCAxMDAuMGYpOyAgICAgICAgICAgIAorCisgICAgICAgICAgICBkcmF3UmVjdHMoY2FudmFzLCBNb2RlLkRTVF9PVVQpOworICAgICAgICAgICAgY2FudmFzLnRyYW5zbGF0ZSgwLjBmLCAxMDAuMGYpOworCisgICAgICAgICAgICBkcmF3UmVjdHMoY2FudmFzLCBNb2RlLkRTVF9BVE9QKTsKKyAgICAgICAgICAgIGNhbnZhcy50cmFuc2xhdGUoMC4wZiwgMTAwLjBmKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgZHJhd1JlY3RzKGNhbnZhcywgTW9kZS5EU1QpOworCisgICAgICAgICAgICBjYW52YXMucmVzdG9yZSgpOworICAgICAgICAgICAgCisgICAgICAgICAgICBjYW52YXMudHJhbnNsYXRlKDEwMC4wZiwgMC4wZik7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIC8vIE90aGVyIG1vZGVzCisgICAgICAgICAgICBjYW52YXMuc2F2ZSgpOworCisgICAgICAgICAgICBkcmF3UmVjdHMoY2FudmFzLCBNb2RlLkNMRUFSKTsKKyAgICAgICAgICAgIGNhbnZhcy50cmFuc2xhdGUoMC4wZiwgMTAwLjBmKTsKKworICAgICAgICAgICAgZHJhd1JlY3RzKGNhbnZhcywgTW9kZS5YT1IpOworICAgICAgICAgICAgCisgICAgICAgICAgICBjYW52YXMudHJhbnNsYXRlKDAuMGYsIDEwMC4wZik7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIG1CbHVlUGFpbnQuc2V0QWxwaGEoMTI3KTsKKyAgICAgICAgICAgIGNhbnZhcy5kcmF3UmVjdCgwLjBmLCAwLjBmLCA1MC4wZiwgNTAuMGYsIG1CbHVlUGFpbnQpOworICAgICAgICAgICAgCisgICAgICAgICAgICBjYW52YXMudHJhbnNsYXRlKDAuMGYsIDEwMC4wZik7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIG1CbHVlUGFpbnQuc2V0QWxwaGEoMTApOworICAgICAgICAgICAgbUJsdWVQYWludC5zZXRDb2xvcigweDdmMDAwMGZmKTsKKyAgICAgICAgICAgIGNhbnZhcy5kcmF3UmVjdCgwLjBmLCAwLjBmLCA1MC4wZiwgNTAuMGYsIG1CbHVlUGFpbnQpOworICAgICAgICAgICAgCisgICAgICAgICAgICBtQmx1ZVBhaW50LnNldENvbG9yKDB4ZmYwMDAwZmYpOworICAgICAgICAgICAgbUJsdWVQYWludC5zZXRBbHBoYSgyNTUpOworCisgICAgICAgICAgICBjYW52YXMucmVzdG9yZSgpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSB2b2lkIGRyYXdSZWN0cyhDYW52YXMgY2FudmFzLCBQb3J0ZXJEdWZmLk1vZGUgbW9kZSkgeworICAgICAgICAgICAgY2FudmFzLmRyYXdSZWN0KDAuMGYsIDAuMGYsIDUwLjBmLCA1MC4wZiwgbUJsdWVQYWludCk7CisKKyAgICAgICAgICAgIGNhbnZhcy5zYXZlKCk7CisgICAgICAgICAgICBjYW52YXMudHJhbnNsYXRlKDI1LjBmLCAyNS4wZik7CisgICAgICAgICAgICBtUmVkUGFpbnQuc2V0WGZlcm1vZGUobmV3IFBvcnRlckR1ZmZYZmVybW9kZShtb2RlKSk7CisgICAgICAgICAgICBjYW52YXMuZHJhd1JlY3QoMC4wZiwgMC4wZiwgNTAuMGYsIDUwLjBmLCBtUmVkUGFpbnQpOworICAgICAgICAgICAgY2FudmFzLnJlc3RvcmUoKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL1N0YXR1c0Jhci9yZXMvZHJhd2FibGUtaGRwaS9hcHBfZ21haWwucG5nIGIvdGVzdHMvU3RhdHVzQmFyL3Jlcy9kcmF3YWJsZS1oZHBpL2FwcF9nbWFpbC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjNkMzNlNQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL1N0YXR1c0Jhci9yZXMvZHJhd2FibGUtaGRwaS9hcHBfZ21haWwucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL1N0YXR1c0Jhci9yZXMvZHJhd2FibGUtaGRwaS9hcHBfcGhvbmUucG5nIGIvdGVzdHMvU3RhdHVzQmFyL3Jlcy9kcmF3YWJsZS1oZHBpL2FwcF9waG9uZS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzcyZTdkMwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL1N0YXR1c0Jhci9yZXMvZHJhd2FibGUtaGRwaS9hcHBfcGhvbmUucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL1N0YXR1c0Jhci9yZXMvZHJhd2FibGUtaGRwaS9pY19zdGF0dXNiYXJfY2hhdC5wbmcgYi90ZXN0cy9TdGF0dXNCYXIvcmVzL2RyYXdhYmxlLWhkcGkvaWNfc3RhdHVzYmFyX2NoYXQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUzYjRlMmIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9TdGF0dXNCYXIvcmVzL2RyYXdhYmxlLWhkcGkvaWNfc3RhdHVzYmFyX2NoYXQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL1N0YXR1c0Jhci9yZXMvZHJhd2FibGUtaGRwaS9pY19zdGF0dXNiYXJfZW1haWwucG5nIGIvdGVzdHMvU3RhdHVzQmFyL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX3N0YXR1c2Jhcl9lbWFpbC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGNlZmQzNgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL1N0YXR1c0Jhci9yZXMvZHJhd2FibGUtaGRwaS9pY19zdGF0dXNiYXJfZW1haWwucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL1N0YXR1c0Jhci9yZXMvZHJhd2FibGUtaGRwaS9pY19zdGF0dXNiYXJfbWlzc2VkY2FsbC5wbmcgYi90ZXN0cy9TdGF0dXNCYXIvcmVzL2RyYXdhYmxlLWhkcGkvaWNfc3RhdHVzYmFyX21pc3NlZGNhbGwucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRmZWVjMjgKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9TdGF0dXNCYXIvcmVzL2RyYXdhYmxlLWhkcGkvaWNfc3RhdHVzYmFyX21pc3NlZGNhbGwucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL1N0YXR1c0Jhci9yZXMvZHJhd2FibGUtaGRwaS9pY29uMS5wbmcgYi90ZXN0cy9TdGF0dXNCYXIvcmVzL2RyYXdhYmxlLWhkcGkvaWNvbjEucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA0ODUyNTcKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9TdGF0dXNCYXIvcmVzL2RyYXdhYmxlLWhkcGkvaWNvbjEucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL1N0YXR1c0Jhci9yZXMvZHJhd2FibGUtaGRwaS9pY29uMi5wbmcgYi90ZXN0cy9TdGF0dXNCYXIvcmVzL2RyYXdhYmxlLWhkcGkvaWNvbjIucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE2MzA5ODYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9TdGF0dXNCYXIvcmVzL2RyYXdhYmxlLWhkcGkvaWNvbjIucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL1N0YXR1c0Jhci9yZXMvZHJhd2FibGUtaGRwaS9pY29uMy5wbmcgYi90ZXN0cy9TdGF0dXNCYXIvcmVzL2RyYXdhYmxlLWhkcGkvaWNvbjMucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlkNzJiNjYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9TdGF0dXNCYXIvcmVzL2RyYXdhYmxlLWhkcGkvaWNvbjMucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL1N0YXR1c0Jhci9yZXMvZHJhd2FibGUtaGRwaS9pY29uNC5wbmcgYi90ZXN0cy9TdGF0dXNCYXIvcmVzL2RyYXdhYmxlLWhkcGkvaWNvbjQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE0YTQwZjIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9TdGF0dXNCYXIvcmVzL2RyYXdhYmxlLWhkcGkvaWNvbjQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL1N0YXR1c0Jhci9yZXMvZHJhd2FibGUvYXBwX2dtYWlsLnBuZyBiL3Rlc3RzL1N0YXR1c0Jhci9yZXMvZHJhd2FibGUtbWRwaS9hcHBfZ21haWwucG5nCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSB0ZXN0cy9TdGF0dXNCYXIvcmVzL2RyYXdhYmxlL2FwcF9nbWFpbC5wbmcKcmVuYW1lIHRvIHRlc3RzL1N0YXR1c0Jhci9yZXMvZHJhd2FibGUtbWRwaS9hcHBfZ21haWwucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL1N0YXR1c0Jhci9yZXMvZHJhd2FibGUvYXBwX3Bob25lLnBuZyBiL3Rlc3RzL1N0YXR1c0Jhci9yZXMvZHJhd2FibGUtbWRwaS9hcHBfcGhvbmUucG5nCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSB0ZXN0cy9TdGF0dXNCYXIvcmVzL2RyYXdhYmxlL2FwcF9waG9uZS5wbmcKcmVuYW1lIHRvIHRlc3RzL1N0YXR1c0Jhci9yZXMvZHJhd2FibGUtbWRwaS9hcHBfcGhvbmUucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL1N0YXR1c0Jhci9yZXMvZHJhd2FibGUvaWNfc3RhdHVzYmFyX2NoYXQucG5nIGIvdGVzdHMvU3RhdHVzQmFyL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX3N0YXR1c2Jhcl9jaGF0LnBuZwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gdGVzdHMvU3RhdHVzQmFyL3Jlcy9kcmF3YWJsZS9pY19zdGF0dXNiYXJfY2hhdC5wbmcKcmVuYW1lIHRvIHRlc3RzL1N0YXR1c0Jhci9yZXMvZHJhd2FibGUtbWRwaS9pY19zdGF0dXNiYXJfY2hhdC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvU3RhdHVzQmFyL3Jlcy9kcmF3YWJsZS9pY19zdGF0dXNiYXJfZW1haWwucG5nIGIvdGVzdHMvU3RhdHVzQmFyL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX3N0YXR1c2Jhcl9lbWFpbC5wbmcKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHRlc3RzL1N0YXR1c0Jhci9yZXMvZHJhd2FibGUvaWNfc3RhdHVzYmFyX2VtYWlsLnBuZwpyZW5hbWUgdG8gdGVzdHMvU3RhdHVzQmFyL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX3N0YXR1c2Jhcl9lbWFpbC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvU3RhdHVzQmFyL3Jlcy9kcmF3YWJsZS9pY19zdGF0dXNiYXJfbWlzc2VkY2FsbC5wbmcgYi90ZXN0cy9TdGF0dXNCYXIvcmVzL2RyYXdhYmxlLW1kcGkvaWNfc3RhdHVzYmFyX21pc3NlZGNhbGwucG5nCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSB0ZXN0cy9TdGF0dXNCYXIvcmVzL2RyYXdhYmxlL2ljX3N0YXR1c2Jhcl9taXNzZWRjYWxsLnBuZwpyZW5hbWUgdG8gdGVzdHMvU3RhdHVzQmFyL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX3N0YXR1c2Jhcl9taXNzZWRjYWxsLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0cy9TdGF0dXNCYXIvcmVzL2RyYXdhYmxlL2ljb24xLnBuZyBiL3Rlc3RzL1N0YXR1c0Jhci9yZXMvZHJhd2FibGUtbWRwaS9pY29uMS5wbmcKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHRlc3RzL1N0YXR1c0Jhci9yZXMvZHJhd2FibGUvaWNvbjEucG5nCnJlbmFtZSB0byB0ZXN0cy9TdGF0dXNCYXIvcmVzL2RyYXdhYmxlLW1kcGkvaWNvbjEucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL1N0YXR1c0Jhci9yZXMvZHJhd2FibGUvaWNvbjIucG5nIGIvdGVzdHMvU3RhdHVzQmFyL3Jlcy9kcmF3YWJsZS1tZHBpL2ljb24yLnBuZwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gdGVzdHMvU3RhdHVzQmFyL3Jlcy9kcmF3YWJsZS9pY29uMi5wbmcKcmVuYW1lIHRvIHRlc3RzL1N0YXR1c0Jhci9yZXMvZHJhd2FibGUtbWRwaS9pY29uMi5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvU3RhdHVzQmFyL3Jlcy9kcmF3YWJsZS9pY29uMy5wbmcgYi90ZXN0cy9TdGF0dXNCYXIvcmVzL2RyYXdhYmxlLW1kcGkvaWNvbjMucG5nCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSB0ZXN0cy9TdGF0dXNCYXIvcmVzL2RyYXdhYmxlL2ljb24zLnBuZwpyZW5hbWUgdG8gdGVzdHMvU3RhdHVzQmFyL3Jlcy9kcmF3YWJsZS1tZHBpL2ljb24zLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0cy9TdGF0dXNCYXIvcmVzL2RyYXdhYmxlL2ljb240LnBuZyBiL3Rlc3RzL1N0YXR1c0Jhci9yZXMvZHJhd2FibGUtbWRwaS9pY29uNC5wbmcKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHRlc3RzL1N0YXR1c0Jhci9yZXMvZHJhd2FibGUvaWNvbjQucG5nCnJlbmFtZSB0byB0ZXN0cy9TdGF0dXNCYXIvcmVzL2RyYXdhYmxlLW1kcGkvaWNvbjQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL1N0YXR1c0Jhci9zcmMvY29tL2FuZHJvaWQvc3RhdHVzYmFydGVzdC9Ob3RpZmljYXRpb25UZXN0TGlzdC5qYXZhIGIvdGVzdHMvU3RhdHVzQmFyL3NyYy9jb20vYW5kcm9pZC9zdGF0dXNiYXJ0ZXN0L05vdGlmaWNhdGlvblRlc3RMaXN0LmphdmEKaW5kZXggMzc5NzZlZS4uMTZiMzAwMSAxMDA2NDQKLS0tIGEvdGVzdHMvU3RhdHVzQmFyL3NyYy9jb20vYW5kcm9pZC9zdGF0dXNiYXJ0ZXN0L05vdGlmaWNhdGlvblRlc3RMaXN0LmphdmEKKysrIGIvdGVzdHMvU3RhdHVzQmFyL3NyYy9jb20vYW5kcm9pZC9zdGF0dXNiYXJ0ZXN0L05vdGlmaWNhdGlvblRlc3RMaXN0LmphdmEKQEAgLTYzMywyMCArNjMzLDYgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfSwKIAotICAgICAgICBuZXcgVGVzdCgiVGlja2VyIikgewotICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgewotICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvbiBub3QgPSBuZXcgTm90aWZpY2F0aW9uKAotICAgICAgICAgICAgICAgICAgICBSLmRyYXdhYmxlLmFwcF9nbWFpbCwgCi0gICAgICAgICAgICAgICAgICAgICJOZXcgbWFpbCBmcm9tIGpvZW9AZXhhbXBsZS5jb20sIG9uIHRoZSB0b3BpYyBvZiB2ZXJ5IGxvbmcgdGlja2VyIHRleHRzIiwKLSAgICAgICAgICAgICAgICAgICAgU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkpOwotICAgICAgICAgICAgICAgIG5vdC5zZXRMYXRlc3RFdmVudEluZm8oTm90aWZpY2F0aW9uVGVzdExpc3QudGhpcywKLSAgICAgICAgICAgICAgICAgICAgIkEgbmV3IG1lc3NhZ2UgYXdhaXRzIiwKLSAgICAgICAgICAgICAgICAgICAgIlRoZSBjb250ZW50cyBhcmUgdmVyeSBpbnRlcmVzdGluZyBhbmQgaW1wb3J0YW50IiwKLSAgICAgICAgICAgICAgICAgICAgbWFrZUludGVudCgpKTsKLSAgICAgICAgICAgICAgICBtTk0ubm90aWZ5KDEsIG5vdCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0sCi0KICAgICAgICAgbmV3IFRlc3QoIkNyYXNoIikgewogICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkKICAgICAgICAgICAgIHsKZGlmZiAtLWdpdCBhL3Rlc3RzL1N0YXR1c0Jhci9zcmMvY29tL2FuZHJvaWQvc3RhdHVzYmFydGVzdC9TdGF0dXNCYXJUZXN0LmphdmEgYi90ZXN0cy9TdGF0dXNCYXIvc3JjL2NvbS9hbmRyb2lkL3N0YXR1c2JhcnRlc3QvU3RhdHVzQmFyVGVzdC5qYXZhCmluZGV4IDEwNzg3MDEuLmUzMTcxMWUgMTAwNjQ0Ci0tLSBhL3Rlc3RzL1N0YXR1c0Jhci9zcmMvY29tL2FuZHJvaWQvc3RhdHVzYmFydGVzdC9TdGF0dXNCYXJUZXN0LmphdmEKKysrIGIvdGVzdHMvU3RhdHVzQmFyL3NyYy9jb20vYW5kcm9pZC9zdGF0dXNiYXJ0ZXN0L1N0YXR1c0JhclRlc3QuamF2YQpAQCAtNjAsMjMgKzYwLDMyIEBACiAgICAgfQogCiAgICAgcHJpdmF0ZSBUZXN0W10gbVRlc3RzID0gbmV3IFRlc3RbXSB7Ci0gICAgICAgIG5ldyBUZXN0KCJIaWRlIikgeworICAgICAgICBuZXcgVGVzdCgiSGlkZSAoRkxBR19GVUxMU0NSRUVOKSIpIHsKICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKICAgICAgICAgICAgICAgICBXaW5kb3cgd2luID0gZ2V0V2luZG93KCk7Ci0gICAgICAgICAgICAgICAgV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMgd2luUGFyYW1zID0gd2luLmdldEF0dHJpYnV0ZXMoKTsKLSAgICAgICAgICAgICAgICB3aW5QYXJhbXMuZmxhZ3MgfD0gV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMuRkxBR19GVUxMU0NSRUVOOwotICAgICAgICAgICAgICAgIHdpbi5zZXRBdHRyaWJ1dGVzKHdpblBhcmFtcyk7CisgICAgICAgICAgICAgICAgd2luLnNldEZsYWdzKFdpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zLkZMQUdfRlVMTFNDUkVFTiwKKyAgICAgICAgICAgICAgICAgICAgICAgIFdpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zLkZMQUdfRlVMTFNDUkVFTik7CisgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiZmxhZ3M9IiArIEludGVnZXIudG9IZXhTdHJpbmcod2luLmdldEF0dHJpYnV0ZXMoKS5mbGFncykpOwogICAgICAgICAgICAgfQogICAgICAgICB9LAotICAgICAgICBuZXcgVGVzdCgiU2hvdyIpIHsKKyAgICAgICAgbmV3IFRlc3QoIlNob3cgKH5GTEFHX0ZVTExTQ1JFRU4pIikgewogICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgewogICAgICAgICAgICAgICAgIFdpbmRvdyB3aW4gPSBnZXRXaW5kb3coKTsKLSAgICAgICAgICAgICAgICBXaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcyB3aW5QYXJhbXMgPSB3aW4uZ2V0QXR0cmlidXRlcygpOwotICAgICAgICAgICAgICAgIHdpblBhcmFtcy5mbGFncyAmPSB+V2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMuRkxBR19GVUxMU0NSRUVOOwotICAgICAgICAgICAgICAgIHdpbi5zZXRBdHRyaWJ1dGVzKHdpblBhcmFtcyk7CisgICAgICAgICAgICAgICAgd2luLnNldEZsYWdzKDAsIFdpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zLkZMQUdfRlVMTFNDUkVFTik7CisgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiZmxhZ3M9IiArIEludGVnZXIudG9IZXhTdHJpbmcod2luLmdldEF0dHJpYnV0ZXMoKS5mbGFncykpOwogICAgICAgICAgICAgfQogICAgICAgICB9LAotICAgICAgICBuZXcgVGVzdCgiZnVsbFNjcmVlbkludGVudCIpIHsKKyAgICAgICAgbmV3IFRlc3QoIkltbWVyc2l2ZTogRW50ZXIiKSB7CisgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgc2V0SW1tZXJzaXZlKHRydWUpOworICAgICAgICAgICAgfQorICAgICAgICB9LAorICAgICAgICBuZXcgVGVzdCgiSW1tZXJzaXZlOiBFeGl0IikgeworICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgIHNldEltbWVyc2l2ZShmYWxzZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0sCisgICAgICAgIG5ldyBUZXN0KCJQcmlvcml0eSBub3RpZmljYXRpb24iKSB7CiAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CiAgICAgICAgICAgICAgICAgTm90aWZpY2F0aW9uIG5vdCA9IG5ldyBOb3RpZmljYXRpb24oU3RhdHVzQmFyVGVzdC50aGlzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSLmRyYXdhYmxlLnN0YXRfc3lzX3Bob25lLApAQCAtODYsOCArOTUsOSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKDg4OCkgNTU1LTUwMzgiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgICAgICAgbm90LmZsYWdzIHw9IE5vdGlmaWNhdGlvbi5GTEFHX0hJR0hfUFJJT1JJVFk7CiAgICAgICAgICAgICAgICAgSW50ZW50IGZ1bGxTY3JlZW5JbnRlbnQgPSBuZXcgSW50ZW50KFN0YXR1c0JhclRlc3QudGhpcywgVGVzdEFsZXJ0QWN0aXZpdHkuY2xhc3MpOwotICAgICAgICAgICAgICAgIGludCBpZCA9IChpbnQpU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisgICAgICAgICAgICAgICAgaW50IGlkID0gKGludClTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsgLy8gWFhYIEhBWAogICAgICAgICAgICAgICAgIGZ1bGxTY3JlZW5JbnRlbnQucHV0RXh0cmEoImlkIiwgaWQpOwogICAgICAgICAgICAgICAgIG5vdC5mdWxsU2NyZWVuSW50ZW50ID0gUGVuZGluZ0ludGVudC5nZXRBY3Rpdml0eSgKICAgICAgICAgICAgICAgICAgICAgU3RhdHVzQmFyVGVzdC50aGlzLApkaWZmIC0tZ2l0IGEvdG9vbHMvYWFwdC9Db21tYW5kLmNwcCBiL3Rvb2xzL2FhcHQvQ29tbWFuZC5jcHAKaW5kZXggZjcxZWJiOS4uZWFmZjBmNCAxMDA2NDQKLS0tIGEvdG9vbHMvYWFwdC9Db21tYW5kLmNwcAorKysgYi90b29scy9hYXB0L0NvbW1hbmQuY3BwCkBAIC0xOTgsOCArMTk4LDEwIEBACiAgICAgICAgIGlmICgmcmVzID09IE5VTEwpIHsKICAgICAgICAgICAgIHByaW50ZigiXG5ObyByZXNvdXJjZSB0YWJsZSBmb3VuZC5cbiIpOwogICAgICAgICB9IGVsc2UgeworI2lmbmRlZiBIQVZFX0FORFJPSURfT1MKICAgICAgICAgICAgIHByaW50ZigiXG5SZXNvdXJjZSB0YWJsZTpcbiIpOwogICAgICAgICAgICAgcmVzLnByaW50KGZhbHNlKTsKKyNlbmRpZgogICAgICAgICB9CiAKICAgICAgICAgQXNzZXQqIG1hbmlmZXN0QXNzZXQgPSBhc3NldHMub3Blbk5vbkFzc2V0KCJBbmRyb2lkTWFuaWZlc3QueG1sIiwKQEAgLTM5MCw4ICszOTIsOSBAQAogICAgIH0KIAogICAgIGlmIChzdHJjbXAoInJlc291cmNlcyIsIG9wdGlvbikgPT0gMCkgeworI2lmbmRlZiBIQVZFX0FORFJPSURfT1MKICAgICAgICAgcmVzLnByaW50KGJ1bmRsZS0+Z2V0VmFsdWVzKCkpOwotCisjZW5kaWYKICAgICB9IGVsc2UgaWYgKHN0cmNtcCgieG1sdHJlZSIsIG9wdGlvbikgPT0gMCkgewogICAgICAgICBpZiAoYnVuZGxlLT5nZXRGaWxlU3BlY0NvdW50KCkgPCAzKSB7CiAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkVSUk9SOiBubyBkdW1wIHhtbHRyZWUgcmVzb3VyY2UgZmlsZSBzcGVjaWZpZWRcbiIpOwpkaWZmIC0tZ2l0IGEvdG9vbHMvYWFwdC9QYWNrYWdlLmNwcCBiL3Rvb2xzL2FhcHQvUGFja2FnZS5jcHAKaW5kZXggOTk5YTVjZi4uM2NiNjE0ZiAxMDA2NDQKLS0tIGEvdG9vbHMvYWFwdC9QYWNrYWdlLmNwcAorKysgYi90b29scy9hYXB0L1BhY2thZ2UuY3BwCkBAIC00NDEsNyArNDQxLDcgQEAKIAogc3NpemVfdCBwcm9jZXNzSmFyRmlsZXMoQnVuZGxlKiBidW5kbGUsIFppcEZpbGUqIHppcCkKIHsKLSAgICBzc2l6ZV90IGVycjsKKyAgICBzdGF0dXNfdCBlcnI7CiAgICAgc3NpemVfdCBjb3VudCA9IDA7CiAgICAgY29uc3QgYW5kcm9pZDo6VmVjdG9yPGNvbnN0IGNoYXIqPiYgamFycyA9IGJ1bmRsZS0+Z2V0SmFyRmlsZXMoKTsKIApkaWZmIC0tZ2l0IGEvdG9vbHMvYWFwdC9SZXNvdXJjZS5jcHAgYi90b29scy9hYXB0L1Jlc291cmNlLmNwcAppbmRleCBjOGJhOTA0Li44MjIyNjJlIDEwMDY0NAotLS0gYS90b29scy9hYXB0L1Jlc291cmNlLmNwcAorKysgYi90b29scy9hYXB0L1Jlc291cmNlLmNwcApAQCAtNTQyLDExICs1NDIsMTEgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIERlZmF1bHRLZXllZFZlY3RvcjxBYXB0R3JvdXBFbnRyeSwgc3A8QWFwdEZpbGU+ID4gYmFzZUZpbGVzID0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZUdyb3VwLT5nZXRGaWxlcygpOwogICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChzaXplX3QgaT0wOyBpIDwgYmFzZUZpbGVzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCJiYXNlRmlsZSAlbGQgaGFzIGZsYXZvciAlc1xuIiwgaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoImJhc2VGaWxlICVkIGhhcyBmbGF2b3IgJXNcbiIsIGksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlRmlsZXMua2V5QXQoaSkudG9TdHJpbmcoKS5zdHJpbmcoKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHNpemVfdCBpPTA7IGkgPCBvdmVybGF5RmlsZXMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIm92ZXJsYXlGaWxlICVsZCBoYXMgZmxhdm9yICVzXG4iLCBpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50Zigib3ZlcmxheUZpbGUgJWQgaGFzIGZsYXZvciAlc1xuIiwgaSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG92ZXJsYXlGaWxlcy5rZXlBdChpKS50b1N0cmluZygpLnN0cmluZygpKTsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgfQpAQCAtNTYwLDcgKzU2MCw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleUF0KG92ZXJsYXlHcm91cEluZGV4KSk7CiAgICAgICAgICAgICAgICAgICAgICAgICBpZihiYXNlRmlsZUluZGV4IDwgVU5LTk9XTl9FUlJPUikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChidW5kbGUtPmdldFZlcmJvc2UoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoImZvdW5kIGEgbWF0Y2ggKCVsZCkgZm9yIG92ZXJsYXkgZmlsZSAlcywgZm9yIGZsYXZvciAlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCJmb3VuZCBhIG1hdGNoICglZCkgZm9yIG92ZXJsYXkgZmlsZSAlcywgZm9yIGZsYXZvciAlc1xuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlRmlsZUluZGV4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG92ZXJsYXlHcm91cC0+Z2V0TGVhZigpLnN0cmluZygpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG92ZXJsYXlGaWxlcy5rZXlBdChvdmVybGF5R3JvdXBJbmRleCkudG9TdHJpbmcoKS5zdHJpbmcoKSk7CkBAIC0yMDgzLDEyICsyMDgzLDEzIEBACiAgICAgLy8gdGFnOmF0dHJpYnV0ZSBwYWlycyB0aGF0IHNob3VsZCBiZSBjaGVja2VkIGluIGxheW91dCBmaWxlcy4KICAgICBLZXllZFZlY3RvcjxTdHJpbmc4LCBOYW1lc3BhY2VBdHRyaWJ1dGVQYWlyPiBrTGF5b3V0VGFnQXR0clBhaXJzOwogICAgIGFkZFRhZ0F0dHJQYWlyKCZrTGF5b3V0VGFnQXR0clBhaXJzLCAidmlldyIsIE5VTEwsICJjbGFzcyIpOworICAgIGFkZFRhZ0F0dHJQYWlyKCZrTGF5b3V0VGFnQXR0clBhaXJzLCAiZnJhZ21lbnQiLCBOVUxMLCAiY2xhc3MiKTsKICAgICBhZGRUYWdBdHRyUGFpcigma0xheW91dFRhZ0F0dHJQYWlycywgImZyYWdtZW50IiwgUkVTT1VSQ0VTX0FORFJPSURfTkFNRVNQQUNFLCAibmFtZSIpOwogCiAgICAgLy8gdGFnOmF0dHJpYnV0ZSBwYWlycyB0aGF0IHNob3VsZCBiZSBjaGVja2VkIGluIHhtbCBmaWxlcy4KICAgICBLZXllZFZlY3RvcjxTdHJpbmc4LCBOYW1lc3BhY2VBdHRyaWJ1dGVQYWlyPiBrWG1sVGFnQXR0clBhaXJzOwogICAgIGFkZFRhZ0F0dHJQYWlyKCZrWG1sVGFnQXR0clBhaXJzLCAiUHJlZmVyZW5jZVNjcmVlbiIsIFJFU09VUkNFU19BTkRST0lEX05BTUVTUEFDRSwgImZyYWdtZW50Iik7Ci0gICAgYWRkVGFnQXR0clBhaXIoJmtYbWxUYWdBdHRyUGFpcnMsICJIZWFkZXIiLCBSRVNPVVJDRVNfQU5EUk9JRF9OQU1FU1BBQ0UsICJmcmFnbWVudCIpOworICAgIGFkZFRhZ0F0dHJQYWlyKCZrWG1sVGFnQXR0clBhaXJzLCAiaGVhZGVyIiwgUkVTT1VSQ0VTX0FORFJPSURfTkFNRVNQQUNFLCAiZnJhZ21lbnQiKTsKIAogICAgIGNvbnN0IFZlY3RvcjxzcDxBYXB0RGlyPiA+JiBkaXJzID0gYXNzZXRzLT5yZXNEaXJzKCk7CiAgICAgY29uc3Qgc2l6ZV90IEsgPSBkaXJzLnNpemUoKTsKZGlmZiAtLWdpdCBhL3Rvb2xzL2FhcHQvUmVzb3VyY2VUYWJsZS5jcHAgYi90b29scy9hYXB0L1Jlc291cmNlVGFibGUuY3BwCmluZGV4IDc1NWI5M2IuLmY0MGE4NzcgMTAwNjQ0Ci0tLSBhL3Rvb2xzL2FhcHQvUmVzb3VyY2VUYWJsZS5jcHAKKysrIGIvdG9vbHMvYWFwdC9SZXNvdXJjZVRhYmxlLmNwcApAQCAtMjM2Niw3ICsyMzY2LDcgQEAKICAgICAgICAgaWYgKGNvbmZpZ1NldC5jb3VudChkZWZhdWx0TG9jYWxlKSA9PSAwKSB7CiAgICAgICAgICAgICBmcHJpbnRmKHN0ZG91dCwgImFhcHQ6IHdhcm5pbmc6IHN0cmluZyAnJXMnIGhhcyBubyBkZWZhdWx0IHRyYW5zbGF0aW9uIGluICVzOyBmb3VuZDoiLAogICAgICAgICAgICAgICAgICAgICBTdHJpbmc4KG5hbWVJdGVyLT5maXJzdCkuc3RyaW5nKCksIG1CdW5kbGUtPmdldFJlc291cmNlU291cmNlRGlycygpWzBdKTsKLSAgICAgICAgICAgIGZvciAoc2V0PFN0cmluZzg+OjppdGVyYXRvciBsb2NhbGVzID0gY29uZmlnU2V0LmJlZ2luKCk7CisgICAgICAgICAgICBmb3IgKHNldDxTdHJpbmc4Pjo6Y29uc3RfaXRlcmF0b3IgbG9jYWxlcyA9IGNvbmZpZ1NldC5iZWdpbigpOwogICAgICAgICAgICAgICAgICBsb2NhbGVzICE9IGNvbmZpZ1NldC5lbmQoKTsKICAgICAgICAgICAgICAgICAgbG9jYWxlcysrKSB7CiAgICAgICAgICAgICAgICAgZnByaW50ZihzdGRvdXQsICIgJXMiLCAoKmxvY2FsZXMpLnN0cmluZygpKTsKZGlmZiAtLWdpdCBhL3Rvb2xzL2FhcHQvU3RyaW5nUG9vbC5jcHAgYi90b29scy9hYXB0L1N0cmluZ1Bvb2wuY3BwCmluZGV4IGEwOWNlYzAuLmUyOGJkZmYgMTAwNjQ0Ci0tLSBhL3Rvb2xzL2FhcHQvU3RyaW5nUG9vbC5jcHAKKysrIGIvdG9vbHMvYWFwdC9TdHJpbmdQb29sLmNwcApAQCAtMzAsNyArMzAsNyBAQAogICAgICAgICAgICAgc3RyID0gU3RyaW5nOChwb29sLT5zdHJpbmdBdChzLCAmbGVuKSkuc3RyaW5nKCk7CiAgICAgICAgIH0KIAotICAgICAgICBwcmludGYoIlN0cmluZyAjJWxkOiAlc1xuIiwgcywgc3RyKTsKKyAgICAgICAgcHJpbnRmKCJTdHJpbmcgIyVkOiAlc1xuIiwgcywgc3RyKTsKICAgICB9CiB9CiAKZGlmZiAtLWdpdCBhL3Rvb2xzL2FhcHQvWE1MTm9kZS5jcHAgYi90b29scy9hYXB0L1hNTE5vZGUuY3BwCmluZGV4IDg1NTFiMGYuLmNlZTg1NDYgMTAwNjQ0Ci0tLSBhL3Rvb2xzL2FhcHQvWE1MTm9kZS5jcHAKKysrIGIvdG9vbHMvYWFwdC9YTUxOb2RlLmNwcApAQCAtMjAzLDkgKzIwMywxMyBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmICh4bGlmZkRlcHRoID09IDAgJiYgcHNldWRvbG9jYWxpemUpIHsKKyNpZmRlZiBFTkFCTEVfUFNFVURPTE9DQUxJWkUKICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBvcmlnKFN0cmluZzgodGV4dCkuc3RyaW5nKCkpOwogICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHBzZXVkbyA9IHBzZXVkb2xvY2FsaXplX3N0cmluZyhvcmlnKTsKICAgICAgICAgICAgICAgICBjdXJTdHJpbmcuYXBwZW5kKFN0cmluZzE2KFN0cmluZzgocHNldWRvLmNfc3RyKCkpKSk7CisjZWxzZQorICAgICAgICAgICAgICAgIGFzc2VydChmYWxzZSk7CisjZW5kaWYKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgaWYgKGlzRm9ybWF0dGVkICYmIGhhc1N1YnN0aXR1dGlvbkVycm9ycyhmaWxlTmFtZSwgaW5YbWwsIHRleHQpICE9IE5PX0VSUk9SKSB7CiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOwpkaWZmIC0tZ2l0IGEvdG9vbHMvYWFwdC9aaXBGaWxlLmggYi90b29scy9hYXB0L1ppcEZpbGUuaAppbmRleCBkYmJkMDcyLi43ODc3NTUwIDEwMDY0NAotLS0gYS90b29scy9hYXB0L1ppcEZpbGUuaAorKysgYi90b29scy9hYXB0L1ppcEZpbGUuaApAQCAtNTcsNyArNTcsNyBAQAogICAgIC8qCiAgICAgICogT3BlbiBhIG5ldyBvciBleGlzdGluZyBhcmNoaXZlLgogICAgICAqLwotICAgIHR5cGVkZWYgZW51bSB7CisgICAgZW51bSB7CiAgICAgICAgIGtPcGVuUmVhZE9ubHkgICA9IDB4MDEsCiAgICAgICAgIGtPcGVuUmVhZFdyaXRlICA9IDB4MDIsCiAgICAgICAgIGtPcGVuQ3JlYXRlICAgICA9IDB4MDQsICAgICAvLyBjcmVhdGUgaWYgaXQgZG9lc24ndCBleGlzdApkaWZmIC0tZ2l0IGEvdG9vbHMvbGF5b3V0bGliL1JFQURNRSBiL3Rvb2xzL2xheW91dGxpYi9SRUFETUUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGZlYTliZAotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL2xheW91dGxpYi9SRUFETUUKQEAgLTAsMCArMSw0IEBACitMYXlvdXRsaWIgaXMgYSBjdXN0b20gdmVyc2lvbiBvZiB0aGUgYW5kcm9pZCBWaWV3IGZyYW1ld29yayBkZXNpZ25lZCB0byBydW4gaW5zaWRlIEVjbGlwc2UuCitUaGUgZ29hbCBvZiB0aGUgbGlicmFyeSBpcyB0byBwcm92aWRlIGxheW91dCByZW5kZXJpbmcgaW4gRWNsaXBzZSB0aGF0IGFyZSB2ZXJ5IHZlcnkgY2xvc2UgdG8gdGhlaXIgcmVuZGVyaW5nIG9uIGRldmljZXMuCisKK05vbmUgb2YgdGhlIGNvbS5hbmRyb2lkLiogb3IgYW5kcm9pZC4qIGNsYXNzZXMgaW4gbGF5b3V0bGliIHJ1biBvbiBkZXZpY2VzLgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rvb2xzL2xheW91dGxpYi9icmlkZ2Uvc3JjL2FuZHJvaWQvZ3JhcGhpY3MvQ2FudmFzLmphdmEgYi90b29scy9sYXlvdXRsaWIvYnJpZGdlL3NyYy9hbmRyb2lkL2dyYXBoaWNzL0NhbnZhcy5qYXZhCmluZGV4IGQ1ZDMxNWUuLjFlMWFiYTkgMTAwNjQ0Ci0tLSBhL3Rvb2xzL2xheW91dGxpYi9icmlkZ2Uvc3JjL2FuZHJvaWQvZ3JhcGhpY3MvQ2FudmFzLmphdmEKKysrIGIvdG9vbHMvbGF5b3V0bGliL2JyaWRnZS9zcmMvYW5kcm9pZC9ncmFwaGljcy9DYW52YXMuamF2YQpAQCAtNjksMTEgKzY5LDYgQEAKICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJDYW4ndCBjcmVhdGUgQ2FudmFzKGludCkiKTsKICAgICB9CiAKLSAgICBwdWJsaWMgQ2FudmFzKGphdmF4Lm1pY3JvZWRpdGlvbi5raHJvbm9zLm9wZW5nbGVzLkdMIGdsKSB7Ci0gICAgICAgIG1Mb2dnZXIgPSBudWxsOwotICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIkNhbid0IGNyZWF0ZSBDYW52YXMoamF2YXgubWljcm9lZGl0aW9uLmtocm9ub3Mub3BlbmdsZXMuR0wpIik7Ci0gICAgfQotCiAgICAgLy8gY3VzdG9tIGNvbnN0cnVjdG9ycyBmb3Igb3VyIHVzZS4KICAgICBwdWJsaWMgQ2FudmFzKGludCB3aWR0aCwgaW50IGhlaWdodCwgSUxheW91dExvZyBsb2dnZXIpIHsKICAgICAgICAgbUxvZ2dlciA9IGxvZ2dlcjsKQEAgLTExNzQsMTUgKzExNjksNiBAQAogICAgIH0KIAogICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIGFuZHJvaWQuZ3JhcGhpY3MuQ2FudmFzI2dldEdMKCkKLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgR0wgZ2V0R0woKSB7Ci0gICAgICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLSAgICAgICAgcmV0dXJuIHN1cGVyLmdldEdMKCk7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQogICAgICAqIEBzZWUgYW5kcm9pZC5ncmFwaGljcy5DYW52YXMjZ2V0TWF0cml4KCkKICAgICAgKi8KICAgICBAT3ZlcnJpZGUKQEAgLTEyNTcsMTUgKzEyNDMsNiBAQAogICAgIH0KIAogICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIGFuZHJvaWQuZ3JhcGhpY3MuQ2FudmFzI3NldFZpZXdwb3J0KGludCwgaW50KQotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNldFZpZXdwb3J0KGludCB3aWR0aCwgaW50IGhlaWdodCkgewotICAgICAgICAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0gICAgICAgIHN1cGVyLnNldFZpZXdwb3J0KHdpZHRoLCBoZWlnaHQpOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKICAgICAgKiBAc2VlIGFuZHJvaWQuZ3JhcGhpY3MuQ2FudmFzI3NrZXcoZmxvYXQsIGZsb2F0KQogICAgICAqLwogICAgIEBPdmVycmlkZQpkaWZmIC0tZ2l0IGEvdG9vbHMvbGF5b3V0bGliL2JyaWRnZS9zcmMvY29tL2FuZHJvaWQvbGF5b3V0bGliL2JyaWRnZS9CcmlkZ2VDb250ZXh0LmphdmEgYi90b29scy9sYXlvdXRsaWIvYnJpZGdlL3NyYy9jb20vYW5kcm9pZC9sYXlvdXRsaWIvYnJpZGdlL0JyaWRnZUNvbnRleHQuamF2YQppbmRleCA3NDRiZmJlLi41OGIxYjZjIDEwMDY0NAotLS0gYS90b29scy9sYXlvdXRsaWIvYnJpZGdlL3NyYy9jb20vYW5kcm9pZC9sYXlvdXRsaWIvYnJpZGdlL0JyaWRnZUNvbnRleHQuamF2YQorKysgYi90b29scy9sYXlvdXRsaWIvYnJpZGdlL3NyYy9jb20vYW5kcm9pZC9sYXlvdXRsaWIvYnJpZGdlL0JyaWRnZUNvbnRleHQuamF2YQpAQCAtMzcsNiArMzcsNyBAQAogaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuUmVzb3VyY2VzOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuVHlwZWRBcnJheTsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlJlc291cmNlcy5UaGVtZTsKK2ltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLkRhdGFiYXNlRXJyb3JIYW5kbGVyOwogaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlLlNRTGl0ZURhdGFiYXNlOwogaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlLlNRTGl0ZURhdGFiYXNlLkN1cnNvckZhY3Rvcnk7CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5CaXRtYXA7CkBAIC0xMDU5LDYgKzEwNjAsMTMgQEAKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU1FMaXRlRGF0YWJhc2Ugb3Blbk9yQ3JlYXRlRGF0YWJhc2UoU3RyaW5nIGFyZzAsIGludCBhcmcxLAorICAgICAgICAgICAgQ3Vyc29yRmFjdG9yeSBhcmcyLCBEYXRhYmFzZUVycm9ySGFuZGxlciBhcmczKSB7CisgICAgICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIERyYXdhYmxlIHBlZWtXYWxscGFwZXIoKSB7CiAgICAgICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKICAgICAgICAgcmV0dXJuIG51bGw7CmRpZmYgLS1naXQgYS92b2lwL2phdmEvYW5kcm9pZC9uZXQvc2lwL1NpcEF1ZGlvQ2FsbEltcGwuamF2YSBiL3ZvaXAvamF2YS9hbmRyb2lkL25ldC9zaXAvU2lwQXVkaW9DYWxsSW1wbC5qYXZhCmluZGV4IDhiZjQ4NmEuLmRkMjc1ZGEgMTAwNjQ0Ci0tLSBhL3ZvaXAvamF2YS9hbmRyb2lkL25ldC9zaXAvU2lwQXVkaW9DYWxsSW1wbC5qYXZhCisrKyBiL3ZvaXAvamF2YS9hbmRyb2lkL25ldC9zaXAvU2lwQXVkaW9DYWxsSW1wbC5qYXZhCkBAIC0yOCw3ICsyOCw2IEBACiBpbXBvcnQgYW5kcm9pZC5uZXQucnRwLkF1ZGlvR3JvdXA7CiBpbXBvcnQgYW5kcm9pZC5uZXQucnRwLkF1ZGlvU3RyZWFtOwogaW1wb3J0IGFuZHJvaWQubmV0LnJ0cC5SdHBTdHJlYW07Ci1pbXBvcnQgYW5kcm9pZC5uZXQud2lmaS5XaWZpTWFuYWdlcjsKIGltcG9ydCBhbmRyb2lkLm9zLk1lc3NhZ2U7CiBpbXBvcnQgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb247CiBpbXBvcnQgYW5kcm9pZC5vcy5WaWJyYXRvcjsKQEAgLTc2LDggKzc1LDYgQEAKICAgICBwcml2YXRlIFRvbmVHZW5lcmF0b3IgbVJpbmdiYWNrVG9uZTsKIAogICAgIHByaXZhdGUgU2lwUHJvZmlsZSBtUGVuZGluZ0NhbGxSZXF1ZXN0OwotICAgIHByaXZhdGUgV2lmaU1hbmFnZXIgbVdtOwotICAgIHByaXZhdGUgV2lmaU1hbmFnZXIuV2lmaUxvY2sgbVdpZmlIaWdoUGVyZkxvY2s7CiAKICAgICBwcml2YXRlIFNpcEVycm9yQ29kZSBtRXJyb3JDb2RlOwogICAgIHByaXZhdGUgU3RyaW5nIG1FcnJvck1lc3NhZ2U7CkBAIC04NSw3ICs4Miw2IEBACiAgICAgcHVibGljIFNpcEF1ZGlvQ2FsbEltcGwoQ29udGV4dCBjb250ZXh0LCBTaXBQcm9maWxlIGxvY2FsUHJvZmlsZSkgewogICAgICAgICBtQ29udGV4dCA9IGNvbnRleHQ7CiAgICAgICAgIG1Mb2NhbFByb2ZpbGUgPSBsb2NhbFByb2ZpbGU7Ci0gICAgICAgIG1XbSA9IChXaWZpTWFuYWdlcikgY29udGV4dC5nZXRTeXN0ZW1TZXJ2aWNlKENvbnRleHQuV0lGSV9TRVJWSUNFKTsKICAgICB9CiAKICAgICBwdWJsaWMgdm9pZCBzZXRMaXN0ZW5lcihTaXBBdWRpb0NhbGwuTGlzdGVuZXIgbGlzdGVuZXIpIHsKQEAgLTQ0NCwyOCArNDQwLDYgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIHByaXZhdGUgdm9pZCBncmFiV2lmaUhpZ2hQZXJmTG9jaygpIHsKLSAgICAgICAgaWYgKG1XaWZpSGlnaFBlcmZMb2NrID09IG51bGwpIHsKLSAgICAgICAgICAgIExvZy52KFRBRywgImFjcXVpcmUgd2lmaSBoaWdoIHBlcmYgbG9jayIpOwotICAgICAgICAgICAgbVdpZmlIaWdoUGVyZkxvY2sgPSAoKFdpZmlNYW5hZ2VyKQotICAgICAgICAgICAgICAgICAgICBtQ29udGV4dC5nZXRTeXN0ZW1TZXJ2aWNlKENvbnRleHQuV0lGSV9TRVJWSUNFKSkKLSAgICAgICAgICAgICAgICAgICAgLmNyZWF0ZVdpZmlMb2NrKFdpZmlNYW5hZ2VyLldJRklfTU9ERV9GVUxMX0hJR0hfUEVSRiwgVEFHKTsKLSAgICAgICAgICAgIG1XaWZpSGlnaFBlcmZMb2NrLmFjcXVpcmUoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCByZWxlYXNlV2lmaUhpZ2hQZXJmTG9jaygpIHsKLSAgICAgICAgaWYgKG1XaWZpSGlnaFBlcmZMb2NrICE9IG51bGwpIHsKLSAgICAgICAgICAgIExvZy52KFRBRywgInJlbGVhc2Ugd2lmaSBoaWdoIHBlcmYgbG9jayIpOwotICAgICAgICAgICAgbVdpZmlIaWdoUGVyZkxvY2sucmVsZWFzZSgpOwotICAgICAgICAgICAgbVdpZmlIaWdoUGVyZkxvY2sgPSBudWxsOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzV2lmaU9uKCkgewotICAgICAgICByZXR1cm4gKG1XbS5nZXRDb25uZWN0aW9uSW5mbygpLmdldEJTU0lEKCkgPT0gbnVsbCkgPyBmYWxzZSA6IHRydWU7Ci0gICAgfQotCiAgICAgcHJpdmF0ZSBTdHJpbmcgY3JlYXRlQ29udGludWVTZXNzaW9uRGVzY3JpcHRpb24oKSB7CiAgICAgICAgIHJldHVybiBjcmVhdGVTZHBCdWlsZGVyKHRydWUsIG1Db2RlYykuYnVpbGQoKTsKICAgICB9CkBAIC02MDAsNyArNTc0LDcgQEAKIAogICAgIHByaXZhdGUgdm9pZCBzdGFydENhbGwoU2RwU2Vzc2lvbkRlc2NyaXB0aW9uIHBlZXJTZCkgewogICAgICAgICBzdG9wQ2FsbChET05UX1JFTEVBU0VfU09DS0VUKTsKLSAgICAgICAgaWYgKGlzV2lmaU9uKCkpIGdyYWJXaWZpSGlnaFBlcmZMb2NrKCk7CisKICAgICAgICAgbVBlZXJTZCA9IHBlZXJTZDsKICAgICAgICAgU3RyaW5nIHBlZXJNZWRpYUFkZHJlc3MgPSBwZWVyU2QuZ2V0UGVlck1lZGlhQWRkcmVzcyhBVURJTyk7CiAgICAgICAgIC8vIFRPRE86IGhhbmRsZSBtdWx0aXBsZSBtZWRpYSBmaWVsZHMKQEAgLTY2Nyw3ICs2NDEsNiBAQAogCiAgICAgcHJpdmF0ZSB2b2lkIHN0b3BDYWxsKGJvb2xlYW4gcmVsZWFzZVNvY2tldCkgewogICAgICAgICBMb2cuZChUQUcsICJzdG9wIGF1ZGlvY2FsbCIpOwotICAgICAgICByZWxlYXNlV2lmaUhpZ2hQZXJmTG9jaygpOwogICAgICAgICBpZiAobUF1ZGlvU3RyZWFtICE9IG51bGwpIHsKICAgICAgICAgICAgIG1BdWRpb1N0cmVhbS5qb2luKG51bGwpOwogCmRpZmYgLS1naXQgYS93aWZpL2phdmEvYW5kcm9pZC9uZXQvd2lmaS9JV2lmaU1hbmFnZXIuYWlkbCBiL3dpZmkvamF2YS9hbmRyb2lkL25ldC93aWZpL0lXaWZpTWFuYWdlci5haWRsCmluZGV4IDBlZTU1OWUuLmU3M2JjYTAgMTAwNjQ0Ci0tLSBhL3dpZmkvamF2YS9hbmRyb2lkL25ldC93aWZpL0lXaWZpTWFuYWdlci5haWRsCisrKyBiL3dpZmkvamF2YS9hbmRyb2lkL25ldC93aWZpL0lXaWZpTWFuYWdlci5haWRsCkBAIC00MiwxNSArNDIsMTUgQEAKIAogICAgIGJvb2xlYW4gcGluZ1N1cHBsaWNhbnQoKTsKIAotICAgIGJvb2xlYW4gc3RhcnRTY2FuKGJvb2xlYW4gZm9yY2VBY3RpdmUpOworICAgIHZvaWQgc3RhcnRTY2FuKGJvb2xlYW4gZm9yY2VBY3RpdmUpOwogCiAgICAgTGlzdDxTY2FuUmVzdWx0PiBnZXRTY2FuUmVzdWx0cygpOwogCi0gICAgYm9vbGVhbiBkaXNjb25uZWN0KCk7CisgICAgdm9pZCBkaXNjb25uZWN0KCk7CiAKLSAgICBib29sZWFuIHJlY29ubmVjdCgpOworICAgIHZvaWQgcmVjb25uZWN0KCk7CiAKLSAgICBib29sZWFuIHJlYXNzb2NpYXRlKCk7CisgICAgdm9pZCByZWFzc29jaWF0ZSgpOwogCiAgICAgV2lmaUluZm8gZ2V0Q29ubmVjdGlvbkluZm8oKTsKIApAQCAtODksNSArODksMjEgQEAKICAgICBXaWZpQ29uZmlndXJhdGlvbiBnZXRXaWZpQXBDb25maWd1cmF0aW9uKCk7CiAKICAgICB2b2lkIHNldFdpZmlBcENvbmZpZ3VyYXRpb24oaW4gV2lmaUNvbmZpZ3VyYXRpb24gd2lmaUNvbmZpZyk7CisKKyAgICB2b2lkIHN0YXJ0V2lmaSgpOworCisgICAgdm9pZCBzdG9wV2lmaSgpOworCisgICAgdm9pZCBhZGRUb0JsYWNrbGlzdChTdHJpbmcgYnNzaWQpOworCisgICAgdm9pZCBjbGVhckJsYWNrbGlzdCgpOworCisgICAgdm9pZCBjb25uZWN0TmV0d29ya1dpdGhDb25maWcoaW4gV2lmaUNvbmZpZ3VyYXRpb24gd2lmaUNvbmZpZyk7CisKKyAgICB2b2lkIGNvbm5lY3ROZXR3b3JrV2l0aElkKGludCBuZXR3b3JrSWQpOworCisgICAgdm9pZCBzYXZlTmV0d29yayhpbiBXaWZpQ29uZmlndXJhdGlvbiB3aWZpQ29uZmlnKTsKKworICAgIHZvaWQgZm9yZ2V0TmV0d29yayhpbnQgbmV0d29ya0lkKTsKIH0KIApkaWZmIC0tZ2l0IGEvd2lmaS9qYXZhL2FuZHJvaWQvbmV0L3dpZmkvV2lmaUNvbmZpZ1N0b3JlLmphdmEgYi93aWZpL2phdmEvYW5kcm9pZC9uZXQvd2lmaS9XaWZpQ29uZmlnU3RvcmUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZmE5Zjc1Ci0tLSAvZGV2L251bGwKKysrIGIvd2lmaS9qYXZhL2FuZHJvaWQvbmV0L3dpZmkvV2lmaUNvbmZpZ1N0b3JlLmphdmEKQEAgLTAsMCArMSw5NjkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQubmV0LndpZmk7CisKK2ltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eU1hbmFnZXJOYXRpdmU7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKK2ltcG9ydCBhbmRyb2lkLm5ldC5EaGNwSW5mbzsKK2ltcG9ydCBhbmRyb2lkLm5ldC53aWZpLldpZmlDb25maWd1cmF0aW9uLklwQXNzaWdubWVudDsKK2ltcG9ydCBhbmRyb2lkLm5ldC53aWZpLldpZmlDb25maWd1cmF0aW9uLktleU1nbXQ7CitpbXBvcnQgYW5kcm9pZC5uZXQud2lmaS5XaWZpQ29uZmlndXJhdGlvbi5TdGF0dXM7CitpbXBvcnQgYW5kcm9pZC5vcy5FbnZpcm9ubWVudDsKK2ltcG9ydCBhbmRyb2lkLnRleHQuVGV4dFV0aWxzOworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CisKK2ltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkV3JpdGVyOworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVXcml0ZXI7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5CaXRTZXQ7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKKy8qKgorICogVGhpcyBjbGFzcyBwcm92aWRlcyB0aGUgQVBJIHRvIG1hbmFnZSBjb25maWd1cmVkCisgKiB3aWZpIG5ldHdvcmtzLiBUaGUgQVBJIGlzIG5vdCB0aHJlYWQgc2FmZSBpcyBiZWluZworICogdXNlZCBvbmx5IGZyb20gV2lmaVN0YXRlTWFjaGluZS4KKyAqCisgKiBJdCBkZWFscyB3aXRoIHRoZSBmb2xsb3dpbmcKKyAqIC0gQWRkL3VwZGF0ZS9yZW1vdmUgYSBXaWZpQ29uZmlndXJhdGlvbgorICogICBUaGUgY29uZmlndXJhdGlvbiBjb250YWlucyB0d28gdHlwZXMgb2YgaW5mb3JtYXRpb24uCisgKiAgICAgPSBJUCBjb25maWd1cmF0aW9uIHRoYXQgaXMgaGFuZGxlZCBieSBXaWZpQ29uZmlnU3RvcmUgYW5kCisgKiAgICAgICBpcyBzYXZlZCB0byBkaXNrIG9uIGFueSBjaGFuZ2UuCisgKiAgICAgPSBTU0lEICYgc2VjdXJpdHkgZGV0YWlscyB0aGF0IGlzIHB1c2hlZCB0byB0aGUgc3VwcGxpY2FudC4KKyAqICAgICAgIHN1cHBsaWNhbnQgc2F2ZXMgdGhlc2UgZGV0YWlscyB0byB0aGUgZGlzayBvbiBjYWxsaW5nCisgKiAgICAgICBzYXZlQ29uZmlnQ29tbWFuZCgpLgorICoKKyAqICAgICAgIFdlIGhhdmUgdHdvIGtpbmRzIG9mIEFQSXMgZXhwb3NlZDoKKyAqICAgICAgICA+IHB1YmxpYyBBUEkgY2FsbHMgdGhhdCBwcm92aWRlIGZpbmUgZ3JhaW5lZCBjb250cm9sCisgKiAgICAgICAgICAtIGVuYWJsZU5ldHdvcmssIGRpc2FibGVOZXR3b3JrLCBhZGRPclVwZGF0ZU5ldHdvcmsoKSwKKyAqICAgICAgICAgIHJlbW92ZU5ldHdvcmsoKS4gRm9yIHRoZXNlIGNhbGxzLCB0aGUgY29uZmlnIGlzIG5vdCBwZXJzaXN0ZWQKKyAqICAgICAgICAgIHRvIHRoZSBkaXNrLiAoVE9ETzogZGVwcmVjYXRlIHRoZXNlIGNhbGxzIGluIFdpZmlNYW5hZ2VyKQorICogICAgICAgID4gVGhlIG5ldyBBUEkgY2FsbHMgLSBzZWxlY3ROZXR3b3JrKCksIHNhdmVOZXR3b3JrKCkgJiBmb3JnZXROZXR3b3JrKCkuCisgKiAgICAgICAgICBUaGVzZSBjYWxscyBwZXJzaXN0IHRoZSBzdXBwbGljYW50IGNvbmZpZyB0byBkaXNrLgorICogLSBNYWludGFpbiBhIGxpc3Qgb2YgY29uZmlndXJlZCBuZXR3b3JrcyBmb3IgcXVpY2sgYWNjZXNzCisgKgorICogVE9ETzoKKyAqIC0gaGFuZGxlIHByb3h5IHBlciBjb25maWd1cmF0aW9uCisgKi8KK2NsYXNzIFdpZmlDb25maWdTdG9yZSB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBDb250ZXh0IHNDb250ZXh0OworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiV2lmaUNvbmZpZ1N0b3JlIjsKKworICAgIC8qIGNvbmZpZ3VyZWQgbmV0d29ya3Mgd2l0aCBuZXR3b3JrIGlkIGFzIHRoZSBrZXkgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBIYXNoTWFwPEludGVnZXIsIFdpZmlDb25maWd1cmF0aW9uPiBzQ29uZmlndXJlZE5ldHdvcmtzID0KKyAgICAgICAgICAgIG5ldyBIYXNoTWFwPEludGVnZXIsIFdpZmlDb25maWd1cmF0aW9uPigpOworCisgICAgLyogQSBuZXR3b3JrIGlkIGlzIGEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIGEgbmV0d29yayBjb25maWd1cmVkIGluIHRoZQorICAgICAqIHN1cHBsaWNhbnQuIE5ldHdvcmsgaWRzIGFyZSBnZW5lcmF0ZWQgd2hlbiB0aGUgc3VwcGxpY2FudCByZWFkcworICAgICAqIHRoZSBjb25maWd1cmF0aW9uIGZpbGUgYXQgc3RhcnQgYW5kIGNhbiB0aHVzIGNoYW5nZSBmb3IgbmV0d29ya3MuCisgICAgICogV2Ugc3RvcmUgdGhlIElQIGNvbmZpZ3VyYXRpb24gZm9yIG5ldHdvcmtzIGFsb25nIHdpdGggYSB1bmlxdWUgaWQKKyAgICAgKiB0aGF0IGlzIGdlbmVyYXRlZCBmcm9tIFNTSUQgYW5kIHNlY3VyaXR5IHR5cGUgb2YgdGhlIG5ldHdvcmsuIEEgbWFwcGluZworICAgICAqIGZyb20gdGhlIGdlbmVyYXRlZCB1bmlxdWUgaWQgdG8gbmV0d29yayBpZCBvZiB0aGUgbmV0d29yayBpcyBuZWVkZWQgdG8KKyAgICAgKiBtYXAgc3VwcGxpY2FudCBjb25maWcgdG8gSVAgY29uZmlndXJhdGlvbi4gKi8KKyAgICBwcml2YXRlIHN0YXRpYyBIYXNoTWFwPEludGVnZXIsIEludGVnZXI+IHNOZXR3b3JrSWRzID0KKyAgICAgICAgICAgIG5ldyBIYXNoTWFwPEludGVnZXIsIEludGVnZXI+KCk7CisKKyAgICAvKiBUcmFja3MgdGhlIGhpZ2hlc3QgcHJpb3JpdHkgb2YgY29uZmlndXJlZCBuZXR3b3JrcyAqLworICAgIHByaXZhdGUgc3RhdGljIGludCBzTGFzdFByaW9yaXR5ID0gLTE7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgaXBDb25maWdGaWxlID0gRW52aXJvbm1lbnQuZ2V0RGF0YURpcmVjdG9yeSgpICsKKyAgICAgICAgICAgICIvbWlzYy93aWZpL2lwY29uZmlnLnR4dCI7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgSVBDT05GSUdfRklMRV9WRVJTSU9OID0gMTsKKworICAgIC8qKgorICAgICAqIEluaXRpYWxpemUgY29udGV4dCwgZmV0Y2ggdGhlIGxpc3Qgb2YgY29uZmlndXJlZCBuZXR3b3JrcworICAgICAqIGFuZCBlbmFibGUgYWxsIHN0b3JlZCBuZXR3b3JrcyBpbiBzdXBwbGljYW50LgorICAgICAqLworICAgIHN0YXRpYyB2b2lkIGluaXRpYWxpemUoQ29udGV4dCBjb250ZXh0KSB7CisgICAgICAgIExvZy5kKFRBRywgIlVwZGF0aW5nIGNvbmZpZyBhbmQgZW5hYmxpbmcgYWxsIG5ldHdvcmtzIik7CisgICAgICAgIHNDb250ZXh0ID0gY29udGV4dDsKKyAgICAgICAgdXBkYXRlQ29uZmlndXJlZE5ldHdvcmtzKCk7CisgICAgICAgIGVuYWJsZUFsbE5ldHdvcmtzKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogRmV0Y2ggdGhlIGxpc3Qgb2YgY3VycmVudGx5IGNvbmZpZ3VyZWQgbmV0d29ya3MKKyAgICAgKiBAcmV0dXJuIExpc3Qgb2YgbmV0d29ya3MKKyAgICAgKi8KKyAgICBzdGF0aWMgTGlzdDxXaWZpQ29uZmlndXJhdGlvbj4gZ2V0Q29uZmlndXJlZE5ldHdvcmtzKCkgeworICAgICAgICBMaXN0PFdpZmlDb25maWd1cmF0aW9uPiBuZXR3b3JrcyA9IG5ldyBBcnJheUxpc3Q8V2lmaUNvbmZpZ3VyYXRpb24+KCk7CisgICAgICAgIHN5bmNocm9uaXplZCAoc0NvbmZpZ3VyZWROZXR3b3JrcykgeworICAgICAgICAgICAgZm9yKFdpZmlDb25maWd1cmF0aW9uIGNvbmZpZyA6IHNDb25maWd1cmVkTmV0d29ya3MudmFsdWVzKCkpIHsKKyAgICAgICAgICAgICAgICBuZXR3b3Jrcy5hZGQoY29uZmlnLmNsb25lKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBuZXR3b3JrczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBlbmFibGUgYWxsIG5ldHdvcmtzIGFuZCBzYXZlIGNvbmZpZy4gVGhpcyB3aWxsIGJlIGEgbm8tb3AgaWYgdGhlIGxpc3QKKyAgICAgKiBvZiBjb25maWd1cmVkIG5ldHdvcmtzIGluZGljYXRlcyBhbGwgbmV0d29ya3MgYXMgYmVpbmcgZW5hYmxlZAorICAgICAqLworICAgIHN0YXRpYyB2b2lkIGVuYWJsZUFsbE5ldHdvcmtzKCkgeworICAgICAgICBzeW5jaHJvbml6ZWQgKHNDb25maWd1cmVkTmV0d29ya3MpIHsKKyAgICAgICAgICAgIGZvcihXaWZpQ29uZmlndXJhdGlvbiBjb25maWcgOiBzQ29uZmlndXJlZE5ldHdvcmtzLnZhbHVlcygpKSB7CisgICAgICAgICAgICAgICAgaWYoY29uZmlnICE9IG51bGwgJiYgY29uZmlnLnN0YXR1cyA9PSBTdGF0dXMuRElTQUJMRUQpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYoV2lmaU5hdGl2ZS5lbmFibGVOZXR3b3JrQ29tbWFuZChjb25maWcubmV0d29ya0lkLCBmYWxzZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy5zdGF0dXMgPSBTdGF0dXMuRU5BQkxFRDsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIExvZy5lKFRBRywgIkVuYWJsZSBuZXR3b3JrIGZhaWxlZCBvbiAiICsgY29uZmlnLm5ldHdvcmtJZCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBXaWZpTmF0aXZlLnNhdmVDb25maWdDb21tYW5kKCk7CisgICAgICAgIHNlbmRDb25maWdDaGFuZ2VCcm9hZGNhc3QoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZWxlY3RzIHRoZSBzcGVjaWZpZWQgbmV0d29yayBjb25maWcgZm9yIGNvbm5lY3Rpb24uIFRoaXMgaW52b2x2ZXMKKyAgICAgKiBhZGRpdGlvbi91cGRhdGUgb2YgdGhlIHNwZWNpZmllZCBjb25maWcsIHVwZGF0aW5nIHRoZSBwcmlvcml0eSBvZgorICAgICAqIGFsbCB0aGUgbmV0d29ya3MgYW5kIGVuYWJsaW5nIHRoZSBnaXZlbiBuZXR3b3JrIHdoaWxlIGRpc2FibGluZyBvdGhlcnMuCisgICAgICoKKyAgICAgKiBTZWxlY3RpbmcgYSBuZXR3b3JrIHdpbGwgbGVhdmUgdGhlIG90aGVyIG5ldHdvcmtzIGRpc2FibGVkIGFuZAorICAgICAqIGEgY2FsbCB0byBlbmFibGVBbGxOZXR3b3JrcygpIG5lZWRzIHRvIGJlIGlzc3VlZCB1cG9uIGEgY29ubmVjdGlvbgorICAgICAqIG9yIGEgZmFpbHVyZSBldmVudCBmcm9tIHN1cHBsaWNhbnQKKyAgICAgKgorICAgICAqIEBwYXJhbSBjb25maWcgVGhlIGNvbmZpZ3VyYXRpb24gZGV0YWlscyBpbiBXaWZpQ29uZmlndXJhdGlvbgorICAgICAqLworICAgIHN0YXRpYyB2b2lkIHNlbGVjdE5ldHdvcmsoV2lmaUNvbmZpZ3VyYXRpb24gY29uZmlnKSB7CisgICAgICAgIGlmIChjb25maWcgIT0gbnVsbCkgeworICAgICAgICAgICAgaW50IG5ldElkID0gYWRkT3JVcGRhdGVOZXR3b3JrTmF0aXZlKGNvbmZpZyk7CisgICAgICAgICAgICBpZiAobmV0SWQgIT0gLTEpIHsKKyAgICAgICAgICAgICAgICBzZWxlY3ROZXR3b3JrKG5ldElkKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAiRmFpbGVkIHRvIHVwZGF0ZSBuZXR3b3JrICIgKyBjb25maWcpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogU2VsZWN0cyB0aGUgc3BlY2lmaWVkIG5ldHdvcmsgZm9yIGNvbm5lY3Rpb24uIFRoaXMgaW52b2x2ZXMKKyAgICAgKiB1cGRhdGluZyB0aGUgcHJpb3JpdHkgb2YgYWxsIHRoZSBuZXR3b3JrcyBhbmQgZW5hYmxpbmcgdGhlIGdpdmVuCisgICAgICogbmV0d29yayB3aGlsZSBkaXNhYmxpbmcgb3RoZXJzLgorICAgICAqCisgICAgICogU2VsZWN0aW5nIGEgbmV0d29yayB3aWxsIGxlYXZlIHRoZSBvdGhlciBuZXR3b3JrcyBkaXNhYmxlZCBhbmQKKyAgICAgKiBhIGNhbGwgdG8gZW5hYmxlQWxsTmV0d29ya3MoKSBuZWVkcyB0byBiZSBpc3N1ZWQgdXBvbiBhIGNvbm5lY3Rpb24KKyAgICAgKiBvciBhIGZhaWx1cmUgZXZlbnQgZnJvbSBzdXBwbGljYW50CisgICAgICoKKyAgICAgKiBAcGFyYW0gbmV0SWQgbmV0d29yayB0byBzZWxlY3QgZm9yIGNvbm5lY3Rpb24KKyAgICAgKi8KKyAgICBzdGF0aWMgdm9pZCBzZWxlY3ROZXR3b3JrKGludCBuZXRJZCkgeworICAgICAgICAvLyBSZXNldCB0aGUgcHJpb3JpdHkgb2YgZWFjaCBuZXR3b3JrIGF0IHN0YXJ0IG9yIGlmIGl0IGdvZXMgdG9vIGhpZ2guCisgICAgICAgIGlmIChzTGFzdFByaW9yaXR5ID09IC0xIHx8IHNMYXN0UHJpb3JpdHkgPiAxMDAwMDAwKSB7CisgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKHNDb25maWd1cmVkTmV0d29ya3MpIHsKKyAgICAgICAgICAgICAgICBmb3IoV2lmaUNvbmZpZ3VyYXRpb24gY29uZmlnIDogc0NvbmZpZ3VyZWROZXR3b3Jrcy52YWx1ZXMoKSkgeworICAgICAgICAgICAgICAgICAgICBpZiAoY29uZmlnLm5ldHdvcmtJZCAhPSAtMSkgeworICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnLnByaW9yaXR5ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFkZE9yVXBkYXRlTmV0d29ya05hdGl2ZShjb25maWcpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgc0xhc3RQcmlvcml0eSA9IDA7CisgICAgICAgIH0KKworICAgICAgICAvLyBTZXQgdG8gdGhlIGhpZ2hlc3QgcHJpb3JpdHkgYW5kIHNhdmUgdGhlIGNvbmZpZ3VyYXRpb24uCisgICAgICAgIFdpZmlDb25maWd1cmF0aW9uIGNvbmZpZyA9IG5ldyBXaWZpQ29uZmlndXJhdGlvbigpOworICAgICAgICBjb25maWcubmV0d29ya0lkID0gbmV0SWQ7CisgICAgICAgIGNvbmZpZy5wcmlvcml0eSA9ICsrc0xhc3RQcmlvcml0eTsKKworICAgICAgICBhZGRPclVwZGF0ZU5ldHdvcmtOYXRpdmUoY29uZmlnKTsKKyAgICAgICAgV2lmaU5hdGl2ZS5zYXZlQ29uZmlnQ29tbWFuZCgpOworCisgICAgICAgIC8qIEVuYWJsZSB0aGUgZ2l2ZW4gbmV0d29yayB3aGlsZSBkaXNhYmxpbmcgYWxsIG90aGVyIG5ldHdvcmtzICovCisgICAgICAgIGVuYWJsZU5ldHdvcmtXaXRob3V0QnJvYWRjYXN0KG5ldElkLCB0cnVlKTsKKworICAgICAgIC8qIEF2b2lkIHNhdmluZyB0aGUgY29uZmlnICYgc2VuZGluZyBhIGJyb2FkY2FzdCB0byBwcmV2ZW50IHNldHRpbmdzCisgICAgICAgICogZnJvbSBkaXNwbGF5aW5nIGEgZGlzYWJsZWQgbGlzdCBvZiBuZXR3b3JrcyAqLworICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZC91cGRhdGUgdGhlIHNwZWNpZmllZCBjb25maWd1cmF0aW9uIGFuZCBzYXZlIGNvbmZpZworICAgICAqCisgICAgICogQHBhcmFtIGNvbmZpZyBXaWZpQ29uZmlndXJhdGlvbiB0byBiZSBzYXZlZAorICAgICAqLworICAgIHN0YXRpYyB2b2lkIHNhdmVOZXR3b3JrKFdpZmlDb25maWd1cmF0aW9uIGNvbmZpZykgeworICAgICAgICBib29sZWFuIG5ld05ldHdvcmsgPSAoY29uZmlnLm5ldHdvcmtJZCA9PSAtMSk7CisgICAgICAgIGludCBuZXRJZCA9IGFkZE9yVXBkYXRlTmV0d29ya05hdGl2ZShjb25maWcpOworICAgICAgICAvKiBlbmFibGUgYSBuZXcgbmV0d29yayAqLworICAgICAgICBpZiAobmV3TmV0d29yayAmJiBuZXRJZCA+PSAwKSB7CisgICAgICAgICAgICBXaWZpTmF0aXZlLmVuYWJsZU5ldHdvcmtDb21tYW5kKG5ldElkLCBmYWxzZSk7CisgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKHNDb25maWd1cmVkTmV0d29ya3MpIHsKKyAgICAgICAgICAgICAgICBzQ29uZmlndXJlZE5ldHdvcmtzLmdldChuZXRJZCkuc3RhdHVzID0gU3RhdHVzLkVOQUJMRUQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgV2lmaU5hdGl2ZS5zYXZlQ29uZmlnQ29tbWFuZCgpOworICAgICAgICBzZW5kQ29uZmlnQ2hhbmdlQnJvYWRjYXN0KCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogRm9yZ2V0IHRoZSBzcGVjaWZpZWQgbmV0d29yayBhbmQgc2F2ZSBjb25maWcKKyAgICAgKgorICAgICAqIEBwYXJhbSBuZXRJZCBuZXR3b3JrIHRvIGZvcmdldAorICAgICAqLworICAgIHN0YXRpYyB2b2lkIGZvcmdldE5ldHdvcmsoaW50IG5ldElkKSB7CisgICAgICAgIGlmIChXaWZpTmF0aXZlLnJlbW92ZU5ldHdvcmtDb21tYW5kKG5ldElkKSkgeworICAgICAgICAgICAgV2lmaU5hdGl2ZS5zYXZlQ29uZmlnQ29tbWFuZCgpOworICAgICAgICAgICAgc3luY2hyb25pemVkIChzQ29uZmlndXJlZE5ldHdvcmtzKSB7CisgICAgICAgICAgICAgICAgc0NvbmZpZ3VyZWROZXR3b3Jrcy5yZW1vdmUobmV0SWQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2VuZENvbmZpZ0NoYW5nZUJyb2FkY2FzdCgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgTG9nLmUoVEFHLCAiRmFpbGVkIHRvIHJlbW92ZSBuZXR3b3JrICIgKyBuZXRJZCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGQvdXBkYXRlIGEgbmV0d29yay4gTm90ZSB0aGF0IHRoZXJlIGlzIG5vIHNhdmVDb25maWcgb3BlcmF0aW9uLgorICAgICAqIFRoaXMgZnVuY3Rpb24gaXMgcmV0YWluZWQgZm9yIGNvbXBhdGliaWxpdHkgd2l0aCB0aGUgcHVibGljCisgICAgICogQVBJLiBUaGUgbW9yZSBwb3dlcmZ1bCBzYXZlTmV0d29yaygpIGlzIHVzZWQgYnkgdGhlCisgICAgICogc3RhdGUgbWFjaGluZQorICAgICAqCisgICAgICogQHBhcmFtIGNvbmZpZyB3aWZpIGNvbmZpZ3VyYXRpb24gdG8gYWRkL3VwZGF0ZQorICAgICAqLworICAgIHN0YXRpYyBpbnQgYWRkT3JVcGRhdGVOZXR3b3JrKFdpZmlDb25maWd1cmF0aW9uIGNvbmZpZykgeworICAgICAgICBpbnQgcmV0ID0gYWRkT3JVcGRhdGVOZXR3b3JrTmF0aXZlKGNvbmZpZyk7CisgICAgICAgIHNlbmRDb25maWdDaGFuZ2VCcm9hZGNhc3QoKTsKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZW1vdmUgYSBuZXR3b3JrLiBOb3RlIHRoYXQgdGhlcmUgaXMgbm8gc2F2ZUNvbmZpZyBvcGVyYXRpb24uCisgICAgICogVGhpcyBmdW5jdGlvbiBpcyByZXRhaW5lZCBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIHRoZSBwdWJsaWMKKyAgICAgKiBBUEkuIFRoZSBtb3JlIHBvd2VyZnVsIGZvcmdldE5ldHdvcmsoKSBpcyB1c2VkIGJ5IHRoZQorICAgICAqIHN0YXRlIG1hY2hpbmUgZm9yIG5ldHdvcmsgcmVtb3ZhbAorICAgICAqCisgICAgICogQHBhcmFtIG5ldElkIG5ldHdvcmsgdG8gYmUgcmVtb3ZlZAorICAgICAqLworICAgIHN0YXRpYyBib29sZWFuIHJlbW92ZU5ldHdvcmsoaW50IG5ldElkKSB7CisgICAgICAgIGJvb2xlYW4gcmV0ID0gV2lmaU5hdGl2ZS5yZW1vdmVOZXR3b3JrQ29tbWFuZChuZXRJZCk7CisgICAgICAgIHN5bmNocm9uaXplZCAoc0NvbmZpZ3VyZWROZXR3b3JrcykgeworICAgICAgICAgICAgaWYgKHJldCkgc0NvbmZpZ3VyZWROZXR3b3Jrcy5yZW1vdmUobmV0SWQpOworICAgICAgICB9CisgICAgICAgIHNlbmRDb25maWdDaGFuZ2VCcm9hZGNhc3QoKTsKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBFbmFibGUgYSBuZXR3b3JrLiBOb3RlIHRoYXQgdGhlcmUgaXMgbm8gc2F2ZUNvbmZpZyBvcGVyYXRpb24uCisgICAgICogVGhpcyBmdW5jdGlvbiBpcyByZXRhaW5lZCBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIHRoZSBwdWJsaWMKKyAgICAgKiBBUEkuIFRoZSBtb3JlIHBvd2VyZnVsIHNlbGVjdE5ldHdvcmsoKS9zYXZlTmV0d29yaygpIGlzIHVzZWQgYnkgdGhlCisgICAgICogc3RhdGUgbWFjaGluZSBmb3IgY29ubmVjdGluZyB0byBhIG5ldHdvcmsKKyAgICAgKgorICAgICAqIEBwYXJhbSBuZXRJZCBuZXR3b3JrIHRvIGJlIHJlbW92ZWQKKyAgICAgKi8KKyAgICBzdGF0aWMgYm9vbGVhbiBlbmFibGVOZXR3b3JrKGludCBuZXRJZCwgYm9vbGVhbiBkaXNhYmxlT3RoZXJzKSB7CisgICAgICAgIGJvb2xlYW4gcmV0ID0gZW5hYmxlTmV0d29ya1dpdGhvdXRCcm9hZGNhc3QobmV0SWQsIGRpc2FibGVPdGhlcnMpOworICAgICAgICBzZW5kQ29uZmlnQ2hhbmdlQnJvYWRjYXN0KCk7CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorCisgICAgc3RhdGljIGJvb2xlYW4gZW5hYmxlTmV0d29ya1dpdGhvdXRCcm9hZGNhc3QoaW50IG5ldElkLCBib29sZWFuIGRpc2FibGVPdGhlcnMpIHsKKyAgICAgICAgYm9vbGVhbiByZXQgPSBXaWZpTmF0aXZlLmVuYWJsZU5ldHdvcmtDb21tYW5kKG5ldElkLCBkaXNhYmxlT3RoZXJzKTsKKworICAgICAgICBzeW5jaHJvbml6ZWQgKHNDb25maWd1cmVkTmV0d29ya3MpIHsKKyAgICAgICAgICAgIFdpZmlDb25maWd1cmF0aW9uIGNvbmZpZyA9IHNDb25maWd1cmVkTmV0d29ya3MuZ2V0KG5ldElkKTsKKyAgICAgICAgICAgIGlmIChjb25maWcgIT0gbnVsbCkgY29uZmlnLnN0YXR1cyA9IFN0YXR1cy5FTkFCTEVEOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGRpc2FibGVPdGhlcnMpIHsKKyAgICAgICAgICAgIHN5bmNocm9uaXplZCAoc0NvbmZpZ3VyZWROZXR3b3JrcykgeworICAgICAgICAgICAgICAgIGZvcihXaWZpQ29uZmlndXJhdGlvbiBjb25maWcgOiBzQ29uZmlndXJlZE5ldHdvcmtzLnZhbHVlcygpKSB7CisgICAgICAgICAgICAgICAgICAgIGlmKGNvbmZpZyAhPSBudWxsICYmIGNvbmZpZy5uZXR3b3JrSWQgIT0gbmV0SWQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy5zdGF0dXMgPSBTdGF0dXMuRElTQUJMRUQ7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBEaXNhYmxlIGEgbmV0d29yay4gTm90ZSB0aGF0IHRoZXJlIGlzIG5vIHNhdmVDb25maWcgb3BlcmF0aW9uLgorICAgICAqIEBwYXJhbSBuZXRJZCBuZXR3b3JrIHRvIGJlIGRpc2FibGVkCisgICAgICovCisgICAgc3RhdGljIGJvb2xlYW4gZGlzYWJsZU5ldHdvcmsoaW50IG5ldElkKSB7CisgICAgICAgIGJvb2xlYW4gcmV0ID0gV2lmaU5hdGl2ZS5kaXNhYmxlTmV0d29ya0NvbW1hbmQobmV0SWQpOworICAgICAgICBzeW5jaHJvbml6ZWQgKHNDb25maWd1cmVkTmV0d29ya3MpIHsKKyAgICAgICAgICAgIFdpZmlDb25maWd1cmF0aW9uIGNvbmZpZyA9IHNDb25maWd1cmVkTmV0d29ya3MuZ2V0KG5ldElkKTsKKyAgICAgICAgICAgIGlmIChjb25maWcgIT0gbnVsbCkgY29uZmlnLnN0YXR1cyA9IFN0YXR1cy5ESVNBQkxFRDsKKyAgICAgICAgfQorICAgICAgICBzZW5kQ29uZmlnQ2hhbmdlQnJvYWRjYXN0KCk7CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2F2ZSB0aGUgY29uZmlndXJlZCBuZXR3b3JrcyBpbiBzdXBwbGljYW50IHRvIGRpc2sKKyAgICAgKi8KKyAgICBzdGF0aWMgYm9vbGVhbiBzYXZlQ29uZmlnKCkgeworICAgICAgICByZXR1cm4gV2lmaU5hdGl2ZS5zYXZlQ29uZmlnQ29tbWFuZCgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEZldGNoIHRoZSBJUCBjb25maWd1cmF0aW9uIGZvciBhIGdpdmVuIG5ldHdvcmsgaWQKKyAgICAgKi8KKyAgICBzdGF0aWMgRGhjcEluZm8gZ2V0SXBDb25maWd1cmF0aW9uKGludCBuZXRJZCkgeworICAgICAgICBzeW5jaHJvbml6ZWQgKHNDb25maWd1cmVkTmV0d29ya3MpIHsKKyAgICAgICAgICAgIFdpZmlDb25maWd1cmF0aW9uIGNvbmZpZyA9IHNDb25maWd1cmVkTmV0d29ya3MuZ2V0KG5ldElkKTsKKyAgICAgICAgICAgIGlmIChjb25maWcgIT0gbnVsbCkgcmV0dXJuIG5ldyBEaGNwSW5mbyhjb25maWcuaXBDb25maWcpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiBpZiB0aGUgc3BlY2lmaWVkIG5ldHdvcmsgaXMgdXNpbmcgc3RhdGljIElQCisgICAgICovCisgICAgc3RhdGljIGJvb2xlYW4gaXNVc2luZ1N0YXRpY0lwKGludCBuZXRJZCkgeworICAgICAgICBzeW5jaHJvbml6ZWQgKHNDb25maWd1cmVkTmV0d29ya3MpIHsKKyAgICAgICAgICAgIFdpZmlDb25maWd1cmF0aW9uIGNvbmZpZyA9IHNDb25maWd1cmVkTmV0d29ya3MuZ2V0KG5ldElkKTsKKyAgICAgICAgICAgIGlmIChjb25maWcgIT0gbnVsbCAmJiBjb25maWcuaXBBc3NpZ25tZW50ID09IElwQXNzaWdubWVudC5TVEFUSUMpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBzZW5kQ29uZmlnQ2hhbmdlQnJvYWRjYXN0KCkgeworICAgICAgICBpZiAoIUFjdGl2aXR5TWFuYWdlck5hdGl2ZS5pc1N5c3RlbVJlYWR5KCkpIHJldHVybjsKKyAgICAgICAgSW50ZW50IGludGVudCA9IG5ldyBJbnRlbnQoV2lmaU1hbmFnZXIuU1VQUExJQ0FOVF9DT05GSUdfQ0hBTkdFRF9BQ1RJT04pOworICAgICAgICBzQ29udGV4dC5zZW5kQnJvYWRjYXN0KGludGVudCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCB1cGRhdGVDb25maWd1cmVkTmV0d29ya3MoKSB7CisgICAgICAgIFN0cmluZyBsaXN0U3RyID0gV2lmaU5hdGl2ZS5saXN0TmV0d29ya3NDb21tYW5kKCk7CisgICAgICAgIHNMYXN0UHJpb3JpdHkgPSAwOworCisgICAgICAgIHN5bmNocm9uaXplZCAoc0NvbmZpZ3VyZWROZXR3b3JrcykgeworICAgICAgICAgICAgc0NvbmZpZ3VyZWROZXR3b3Jrcy5jbGVhcigpOworICAgICAgICAgICAgc05ldHdvcmtJZHMuY2xlYXIoKTsKKworICAgICAgICAgICAgaWYgKGxpc3RTdHIgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgICAgIFN0cmluZ1tdIGxpbmVzID0gbGlzdFN0ci5zcGxpdCgiXG4iKTsKKyAgICAgICAgICAgIC8vIFNraXAgdGhlIGZpcnN0IGxpbmUsIHdoaWNoIGlzIGEgaGVhZGVyCisgICAgICAgICAgICBmb3IgKGludCBpID0gMTsgaSA8IGxpbmVzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgU3RyaW5nW10gcmVzdWx0ID0gbGluZXNbaV0uc3BsaXQoIlx0Iik7CisgICAgICAgICAgICAgICAgLy8gbmV0d29yay1pZCB8IHNzaWQgfCBic3NpZCB8IGZsYWdzCisgICAgICAgICAgICAgICAgV2lmaUNvbmZpZ3VyYXRpb24gY29uZmlnID0gbmV3IFdpZmlDb25maWd1cmF0aW9uKCk7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgY29uZmlnLm5ldHdvcmtJZCA9IEludGVnZXIucGFyc2VJbnQocmVzdWx0WzBdKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAocmVzdWx0Lmxlbmd0aCA+IDMpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdFszXS5pbmRleE9mKCJbQ1VSUkVOVF0iKSAhPSAtMSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy5zdGF0dXMgPSBXaWZpQ29uZmlndXJhdGlvbi5TdGF0dXMuQ1VSUkVOVDsKKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAocmVzdWx0WzNdLmluZGV4T2YoIltESVNBQkxFRF0iKSAhPSAtMSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy5zdGF0dXMgPSBXaWZpQ29uZmlndXJhdGlvbi5TdGF0dXMuRElTQUJMRUQ7CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy5zdGF0dXMgPSBXaWZpQ29uZmlndXJhdGlvbi5TdGF0dXMuRU5BQkxFRDsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBjb25maWcuc3RhdHVzID0gV2lmaUNvbmZpZ3VyYXRpb24uU3RhdHVzLkVOQUJMRUQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJlYWROZXR3b3JrVmFyaWFibGVzKGNvbmZpZyk7CisgICAgICAgICAgICAgICAgaWYgKGNvbmZpZy5wcmlvcml0eSA+IHNMYXN0UHJpb3JpdHkpIHsKKyAgICAgICAgICAgICAgICAgICAgc0xhc3RQcmlvcml0eSA9IGNvbmZpZy5wcmlvcml0eTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgc0NvbmZpZ3VyZWROZXR3b3Jrcy5wdXQoY29uZmlnLm5ldHdvcmtJZCwgY29uZmlnKTsKKyAgICAgICAgICAgICAgICBzTmV0d29ya0lkcy5wdXQoY29uZmlnS2V5KGNvbmZpZyksIGNvbmZpZy5uZXR3b3JrSWQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJlYWRJcENvbmZpZ3VyYXRpb25zKCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCB3cml0ZUlwQ29uZmlndXJhdGlvbnMoKSB7CisgICAgICAgIFN0cmluZ0J1aWxkZXIgYnVpbGRlciA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisgICAgICAgIEJ1ZmZlcmVkV3JpdGVyIG91dCA9IG51bGw7CisKKyAgICAgICAgYnVpbGRlci5hcHBlbmQoSVBDT05GSUdfRklMRV9WRVJTSU9OKTsKKyAgICAgICAgYnVpbGRlci5hcHBlbmQoIlxuIik7CisKKyAgICAgICAgc3luY2hyb25pemVkIChzQ29uZmlndXJlZE5ldHdvcmtzKSB7CisgICAgICAgICAgICBmb3IoV2lmaUNvbmZpZ3VyYXRpb24gY29uZmlnIDogc0NvbmZpZ3VyZWROZXR3b3Jrcy52YWx1ZXMoKSkgeworICAgICAgICAgICAgICAgIGlmIChjb25maWcuaXBBc3NpZ25tZW50ID09IFdpZmlDb25maWd1cmF0aW9uLklwQXNzaWdubWVudC5TVEFUSUMpIHsKKyAgICAgICAgICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoImlkPSIgKyBjb25maWdLZXkoY29uZmlnKSk7CisgICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKCI6Iik7CisgICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKCJpcD0iICsgY29uZmlnLmlwQ29uZmlnLmlwQWRkcmVzcyk7CisgICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKCI6Iik7CisgICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKCJnYXRld2F5PSIgKyBjb25maWcuaXBDb25maWcuZ2F0ZXdheSk7CisgICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKCI6Iik7CisgICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKCJuZXRtYXNrPSIgKyBjb25maWcuaXBDb25maWcubmV0bWFzayk7CisgICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKCI6Iik7CisgICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKCJkbnMxPSIgKyBjb25maWcuaXBDb25maWcuZG5zMSk7CisgICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKCI6Iik7CisgICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKCJkbnMyPSIgKyBjb25maWcuaXBDb25maWcuZG5zMik7CisgICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKCJcbiIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBvdXQgPSBuZXcgQnVmZmVyZWRXcml0ZXIobmV3IEZpbGVXcml0ZXIoaXBDb25maWdGaWxlKSwgYnVpbGRlci5sZW5ndGgoKSk7CisgICAgICAgICAgICBvdXQud3JpdGUoYnVpbGRlci50b1N0cmluZygpKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgTG9nLmUoVEFHLCAiRXJyb3Igd3JpdGluZyBkYXRhIGZpbGUiKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIGlmIChvdXQgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIG91dC5jbG9zZSgpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7fQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCByZWFkSXBDb25maWd1cmF0aW9ucygpIHsKKyAgICAgICAgRmlsZSBmID0gbmV3IEZpbGUoaXBDb25maWdGaWxlKTsKKyAgICAgICAgYnl0ZVtdIGJ1ZmZlcjsKKyAgICAgICAgRmlsZUlucHV0U3RyZWFtIHMgPSBudWxsOworICAgICAgICB0cnkgeworICAgICAgICAgICAgYnVmZmVyID0gbmV3IGJ5dGVbKGludClmLmxlbmd0aCgpXTsKKyAgICAgICAgICAgIHMgPSBuZXcgRmlsZUlucHV0U3RyZWFtKGYpOworICAgICAgICAgICAgcy5yZWFkKGJ1ZmZlcik7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIExvZy5lKFRBRywgIkVycm9yIHJlYWRpbmcgZGF0YSBmaWxlIik7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBpZiAocyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgcy5jbG9zZSgpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7fQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgU3RyaW5nIGRhdGEgPSBuZXcgU3RyaW5nKGJ1ZmZlcik7CisgICAgICAgIGlmIChkYXRhID09IG51bGwgfHwgZGF0YS5sZW5ndGgoKSA9PSAwKSB7CisgICAgICAgICAgICBMb2cuZChUQUcsICJJUCBjb25maWd1cmF0aW9uIGZpbGUgZW1wdHkiKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIFN0cmluZ1tdIHBhcnNlZCA9IGRhdGEuc3BsaXQoIlxuIik7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpZiAoSW50ZWdlci5wYXJzZUludChwYXJzZWRbMF0pICE9IElQQ09ORklHX0ZJTEVfVkVSU0lPTikgeworICAgICAgICAgICAgICAgIExvZy5lKFRBRywgIkJhZCB2ZXJzaW9uIG9uIElQIGNvbmZpZ3VyYXRpb24gZmlsZSwgaWdub3JlIHJlYWQiKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZvciAoU3RyaW5nIGxpbmUgOiBwYXJzZWQpIHsKKyAgICAgICAgICAgICAgICBpbnQgaGFzaEtleSA9IC0xOworICAgICAgICAgICAgICAgIERoY3BJbmZvIGlwQ29uZmlnID0gbmV3IERoY3BJbmZvKCk7CisgICAgICAgICAgICAgICAgU3RyaW5nW10ga2V5VmFscyA9IGxpbmUuc3BsaXQoIjoiKTsKKworICAgICAgICAgICAgICAgIGZvciAoU3RyaW5nIGtleVZhbCA6IGtleVZhbHMpIHsKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nW10ga2V5VmFsUGFpciA9IGtleVZhbC5zcGxpdCgiPSIpOworICAgICAgICAgICAgICAgICAgICBpZiAoa2V5VmFsUGFpclswXS5lcXVhbHMoImlkIikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGhhc2hLZXkgPSBJbnRlZ2VyLnBhcnNlSW50KGtleVZhbFBhaXJbMV0pOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGtleVZhbFBhaXJbMF0uZXF1YWxzKCJpcCIpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpcENvbmZpZy5pcEFkZHJlc3MgPSBJbnRlZ2VyLnBhcnNlSW50KGtleVZhbFBhaXJbMV0pOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGtleVZhbFBhaXJbMF0uZXF1YWxzKCJnYXRld2F5IikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlwQ29uZmlnLmdhdGV3YXkgPSBJbnRlZ2VyLnBhcnNlSW50KGtleVZhbFBhaXJbMV0pOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGtleVZhbFBhaXJbMF0uZXF1YWxzKCJuZXRtYXNrIikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlwQ29uZmlnLm5ldG1hc2sgPSBJbnRlZ2VyLnBhcnNlSW50KGtleVZhbFBhaXJbMV0pOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGtleVZhbFBhaXJbMF0uZXF1YWxzKCJkbnMxIikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlwQ29uZmlnLmRuczEgPSBJbnRlZ2VyLnBhcnNlSW50KGtleVZhbFBhaXJbMV0pOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGtleVZhbFBhaXJbMF0uZXF1YWxzKCJkbnMyIikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlwQ29uZmlnLmRuczIgPSBJbnRlZ2VyLnBhcnNlSW50KGtleVZhbFBhaXJbMV0pOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiSWdub3JpbmcgIiArIGtleVZhbCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoaGFzaEtleSAhPSAtMSkgeworICAgICAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKHNDb25maWd1cmVkTmV0d29ya3MpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFdpZmlDb25maWd1cmF0aW9uIGNvbmZpZyA9IHNDb25maWd1cmVkTmV0d29ya3MuZ2V0KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzTmV0d29ya0lkcy5nZXQoaGFzaEtleSkpOworCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29uZmlnID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2cuZShUQUcsICJJUCBjb25maWd1cmF0aW9uIGZvdW5kIGZvciBtaXNzaW5nIG5ldHdvcmssIGlnbm9yZWQiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnLmlwQXNzaWdubWVudCA9IFdpZmlDb25maWd1cmF0aW9uLklwQXNzaWdubWVudC5TVEFUSUM7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnLmlwQ29uZmlnID0gaXBDb25maWc7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBMb2cuZShUQUcsIk1pc3NpbmcgaWQgd2hpbGUgcGFyc2luZyBjb25maWd1cmF0aW9uIiArIGxpbmUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIExvZy5lKFRBRywgIkVycm9yIHBhcnNpbmcgY29uZmlndXJhdGlvbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgaW50IGFkZE9yVXBkYXRlTmV0d29ya05hdGl2ZShXaWZpQ29uZmlndXJhdGlvbiBjb25maWcpIHsKKyAgICAgICAgLyoKKyAgICAgICAgICogSWYgdGhlIHN1cHBsaWVkIG5ldHdvcmtJZCBpcyAtMSwgd2UgY3JlYXRlIGEgbmV3IGVtcHR5CisgICAgICAgICAqIG5ldHdvcmsgY29uZmlndXJhdGlvbi4gT3RoZXJ3aXNlLCB0aGUgbmV0d29ya0lkIHNob3VsZAorICAgICAgICAgKiByZWZlciB0byBhbiBleGlzdGluZyBjb25maWd1cmF0aW9uLgorICAgICAgICAgKi8KKyAgICAgICAgaW50IG5ldElkID0gY29uZmlnLm5ldHdvcmtJZDsKKyAgICAgICAgYm9vbGVhbiB1cGRhdGVGYWlsZWQgPSB0cnVlOworICAgICAgICBib29sZWFuIG5ld05ldHdvcmsgPSBuZXRJZCA9PSAtMTsKKyAgICAgICAgLy8gbmV0d29ya0lkIG9mIC0xIG1lYW5zIHdlIHdhbnQgdG8gY3JlYXRlIGEgbmV3IG5ldHdvcmsKKworICAgICAgICBpZiAobmV3TmV0d29yaykgeworICAgICAgICAgICAgbmV0SWQgPSBXaWZpTmF0aXZlLmFkZE5ldHdvcmtDb21tYW5kKCk7CisgICAgICAgICAgICBpZiAobmV0SWQgPCAwKSB7CisgICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAiRmFpbGVkIHRvIGFkZCBhIG5ldHdvcmshIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHNldFZhcmlhYmxlczogeworCisgICAgICAgICAgICBpZiAoY29uZmlnLlNTSUQgIT0gbnVsbCAmJgorICAgICAgICAgICAgICAgICAgICAhV2lmaU5hdGl2ZS5zZXROZXR3b3JrVmFyaWFibGVDb21tYW5kKAorICAgICAgICAgICAgICAgICAgICAgICAgbmV0SWQsCisgICAgICAgICAgICAgICAgICAgICAgICBXaWZpQ29uZmlndXJhdGlvbi5zc2lkVmFyTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy5TU0lEKSkgeworICAgICAgICAgICAgICAgIExvZy5kKFRBRywgImZhaWxlZCB0byBzZXQgU1NJRDogIitjb25maWcuU1NJRCk7CisgICAgICAgICAgICAgICAgYnJlYWsgc2V0VmFyaWFibGVzOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoY29uZmlnLkJTU0lEICE9IG51bGwgJiYKKyAgICAgICAgICAgICAgICAgICAgIVdpZmlOYXRpdmUuc2V0TmV0d29ya1ZhcmlhYmxlQ29tbWFuZCgKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldElkLAorICAgICAgICAgICAgICAgICAgICAgICAgV2lmaUNvbmZpZ3VyYXRpb24uYnNzaWRWYXJOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnLkJTU0lEKSkgeworICAgICAgICAgICAgICAgIExvZy5kKFRBRywgImZhaWxlZCB0byBzZXQgQlNTSUQ6ICIrY29uZmlnLkJTU0lEKTsKKyAgICAgICAgICAgICAgICBicmVhayBzZXRWYXJpYWJsZXM7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIFN0cmluZyBhbGxvd2VkS2V5TWFuYWdlbWVudFN0cmluZyA9CisgICAgICAgICAgICAgICAgbWFrZVN0cmluZyhjb25maWcuYWxsb3dlZEtleU1hbmFnZW1lbnQsIFdpZmlDb25maWd1cmF0aW9uLktleU1nbXQuc3RyaW5ncyk7CisgICAgICAgICAgICBpZiAoY29uZmlnLmFsbG93ZWRLZXlNYW5hZ2VtZW50LmNhcmRpbmFsaXR5KCkgIT0gMCAmJgorICAgICAgICAgICAgICAgICAgICAhV2lmaU5hdGl2ZS5zZXROZXR3b3JrVmFyaWFibGVDb21tYW5kKAorICAgICAgICAgICAgICAgICAgICAgICAgbmV0SWQsCisgICAgICAgICAgICAgICAgICAgICAgICBXaWZpQ29uZmlndXJhdGlvbi5LZXlNZ210LnZhck5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICBhbGxvd2VkS2V5TWFuYWdlbWVudFN0cmluZykpIHsKKyAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJmYWlsZWQgdG8gc2V0IGtleV9tZ210OiAiKworICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dlZEtleU1hbmFnZW1lbnRTdHJpbmcpOworICAgICAgICAgICAgICAgIGJyZWFrIHNldFZhcmlhYmxlczsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgU3RyaW5nIGFsbG93ZWRQcm90b2NvbHNTdHJpbmcgPQorICAgICAgICAgICAgICAgIG1ha2VTdHJpbmcoY29uZmlnLmFsbG93ZWRQcm90b2NvbHMsIFdpZmlDb25maWd1cmF0aW9uLlByb3RvY29sLnN0cmluZ3MpOworICAgICAgICAgICAgaWYgKGNvbmZpZy5hbGxvd2VkUHJvdG9jb2xzLmNhcmRpbmFsaXR5KCkgIT0gMCAmJgorICAgICAgICAgICAgICAgICAgICAhV2lmaU5hdGl2ZS5zZXROZXR3b3JrVmFyaWFibGVDb21tYW5kKAorICAgICAgICAgICAgICAgICAgICAgICAgbmV0SWQsCisgICAgICAgICAgICAgICAgICAgICAgICBXaWZpQ29uZmlndXJhdGlvbi5Qcm90b2NvbC52YXJOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dlZFByb3RvY29sc1N0cmluZykpIHsKKyAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJmYWlsZWQgdG8gc2V0IHByb3RvOiAiKworICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dlZFByb3RvY29sc1N0cmluZyk7CisgICAgICAgICAgICAgICAgYnJlYWsgc2V0VmFyaWFibGVzOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBTdHJpbmcgYWxsb3dlZEF1dGhBbGdvcml0aG1zU3RyaW5nID0KKyAgICAgICAgICAgICAgICBtYWtlU3RyaW5nKGNvbmZpZy5hbGxvd2VkQXV0aEFsZ29yaXRobXMsIFdpZmlDb25maWd1cmF0aW9uLkF1dGhBbGdvcml0aG0uc3RyaW5ncyk7CisgICAgICAgICAgICBpZiAoY29uZmlnLmFsbG93ZWRBdXRoQWxnb3JpdGhtcy5jYXJkaW5hbGl0eSgpICE9IDAgJiYKKyAgICAgICAgICAgICAgICAgICAgIVdpZmlOYXRpdmUuc2V0TmV0d29ya1ZhcmlhYmxlQ29tbWFuZCgKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldElkLAorICAgICAgICAgICAgICAgICAgICAgICAgV2lmaUNvbmZpZ3VyYXRpb24uQXV0aEFsZ29yaXRobS52YXJOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dlZEF1dGhBbGdvcml0aG1zU3RyaW5nKSkgeworICAgICAgICAgICAgICAgIExvZy5kKFRBRywgImZhaWxlZCB0byBzZXQgYXV0aF9hbGc6ICIrCisgICAgICAgICAgICAgICAgICAgICAgICBhbGxvd2VkQXV0aEFsZ29yaXRobXNTdHJpbmcpOworICAgICAgICAgICAgICAgIGJyZWFrIHNldFZhcmlhYmxlczsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgU3RyaW5nIGFsbG93ZWRQYWlyd2lzZUNpcGhlcnNTdHJpbmcgPQorICAgICAgICAgICAgICAgICAgICBtYWtlU3RyaW5nKGNvbmZpZy5hbGxvd2VkUGFpcndpc2VDaXBoZXJzLAorICAgICAgICAgICAgICAgICAgICBXaWZpQ29uZmlndXJhdGlvbi5QYWlyd2lzZUNpcGhlci5zdHJpbmdzKTsKKyAgICAgICAgICAgIGlmIChjb25maWcuYWxsb3dlZFBhaXJ3aXNlQ2lwaGVycy5jYXJkaW5hbGl0eSgpICE9IDAgJiYKKyAgICAgICAgICAgICAgICAgICAgIVdpZmlOYXRpdmUuc2V0TmV0d29ya1ZhcmlhYmxlQ29tbWFuZCgKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldElkLAorICAgICAgICAgICAgICAgICAgICAgICAgV2lmaUNvbmZpZ3VyYXRpb24uUGFpcndpc2VDaXBoZXIudmFyTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93ZWRQYWlyd2lzZUNpcGhlcnNTdHJpbmcpKSB7CisgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiZmFpbGVkIHRvIHNldCBwYWlyd2lzZTogIisKKyAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93ZWRQYWlyd2lzZUNpcGhlcnNTdHJpbmcpOworICAgICAgICAgICAgICAgIGJyZWFrIHNldFZhcmlhYmxlczsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgU3RyaW5nIGFsbG93ZWRHcm91cENpcGhlcnNTdHJpbmcgPQorICAgICAgICAgICAgICAgIG1ha2VTdHJpbmcoY29uZmlnLmFsbG93ZWRHcm91cENpcGhlcnMsIFdpZmlDb25maWd1cmF0aW9uLkdyb3VwQ2lwaGVyLnN0cmluZ3MpOworICAgICAgICAgICAgaWYgKGNvbmZpZy5hbGxvd2VkR3JvdXBDaXBoZXJzLmNhcmRpbmFsaXR5KCkgIT0gMCAmJgorICAgICAgICAgICAgICAgICAgICAhV2lmaU5hdGl2ZS5zZXROZXR3b3JrVmFyaWFibGVDb21tYW5kKAorICAgICAgICAgICAgICAgICAgICAgICAgbmV0SWQsCisgICAgICAgICAgICAgICAgICAgICAgICBXaWZpQ29uZmlndXJhdGlvbi5Hcm91cENpcGhlci52YXJOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dlZEdyb3VwQ2lwaGVyc1N0cmluZykpIHsKKyAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJmYWlsZWQgdG8gc2V0IGdyb3VwOiAiKworICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dlZEdyb3VwQ2lwaGVyc1N0cmluZyk7CisgICAgICAgICAgICAgICAgYnJlYWsgc2V0VmFyaWFibGVzOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBQcmV2ZW50IGNsaWVudCBzY3Jldy11cCBieSBwYXNzaW5nIGluIGEgV2lmaUNvbmZpZ3VyYXRpb24gd2UgZ2F2ZSBpdAorICAgICAgICAgICAgLy8gYnkgcHJldmVudGluZyAiKiIgYXMgYSBrZXkuCisgICAgICAgICAgICBpZiAoY29uZmlnLnByZVNoYXJlZEtleSAhPSBudWxsICYmICFjb25maWcucHJlU2hhcmVkS2V5LmVxdWFscygiKiIpICYmCisgICAgICAgICAgICAgICAgICAgICFXaWZpTmF0aXZlLnNldE5ldHdvcmtWYXJpYWJsZUNvbW1hbmQoCisgICAgICAgICAgICAgICAgICAgICAgICBuZXRJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgIFdpZmlDb25maWd1cmF0aW9uLnBza1Zhck5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25maWcucHJlU2hhcmVkS2V5KSkgeworICAgICAgICAgICAgICAgIExvZy5kKFRBRywgImZhaWxlZCB0byBzZXQgcHNrOiAiK2NvbmZpZy5wcmVTaGFyZWRLZXkpOworICAgICAgICAgICAgICAgIGJyZWFrIHNldFZhcmlhYmxlczsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYm9vbGVhbiBoYXNTZXRLZXkgPSBmYWxzZTsKKyAgICAgICAgICAgIGlmIChjb25maWcud2VwS2V5cyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb25maWcud2VwS2V5cy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgICAgICAvLyBQcmV2ZW50IGNsaWVudCBzY3Jldy11cCBieSBwYXNzaW5nIGluIGEgV2lmaUNvbmZpZ3VyYXRpb24gd2UgZ2F2ZSBpdAorICAgICAgICAgICAgICAgICAgICAvLyBieSBwcmV2ZW50aW5nICIqIiBhcyBhIGtleS4KKyAgICAgICAgICAgICAgICAgICAgaWYgKGNvbmZpZy53ZXBLZXlzW2ldICE9IG51bGwgJiYgIWNvbmZpZy53ZXBLZXlzW2ldLmVxdWFscygiKiIpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIVdpZmlOYXRpdmUuc2V0TmV0d29ya1ZhcmlhYmxlQ29tbWFuZCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldElkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2lmaUNvbmZpZ3VyYXRpb24ud2VwS2V5VmFyTmFtZXNbaV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWcud2VwS2V5c1tpXSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZmFpbGVkIHRvIHNldCB3ZXBfa2V5IitpKyI6ICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnLndlcEtleXNbaV0pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrIHNldFZhcmlhYmxlczsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGhhc1NldEtleSA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChoYXNTZXRLZXkpIHsKKyAgICAgICAgICAgICAgICBpZiAoIVdpZmlOYXRpdmUuc2V0TmV0d29ya1ZhcmlhYmxlQ29tbWFuZCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXRJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBXaWZpQ29uZmlndXJhdGlvbi53ZXBUeEtleUlkeFZhck5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW50ZWdlci50b1N0cmluZyhjb25maWcud2VwVHhLZXlJbmRleCkpKSB7CisgICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZmFpbGVkIHRvIHNldCB3ZXBfdHhfa2V5aWR4OiAiKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy53ZXBUeEtleUluZGV4KTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWsgc2V0VmFyaWFibGVzOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCFXaWZpTmF0aXZlLnNldE5ldHdvcmtWYXJpYWJsZUNvbW1hbmQoCisgICAgICAgICAgICAgICAgICAgICAgICBuZXRJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgIFdpZmlDb25maWd1cmF0aW9uLnByaW9yaXR5VmFyTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEludGVnZXIudG9TdHJpbmcoY29uZmlnLnByaW9yaXR5KSkpIHsKKyAgICAgICAgICAgICAgICBMb2cuZChUQUcsIGNvbmZpZy5TU0lEICsgIjogZmFpbGVkIHRvIHNldCBwcmlvcml0eTogIgorICAgICAgICAgICAgICAgICAgICAgICAgK2NvbmZpZy5wcmlvcml0eSk7CisgICAgICAgICAgICAgICAgYnJlYWsgc2V0VmFyaWFibGVzOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoY29uZmlnLmhpZGRlblNTSUQgJiYgIVdpZmlOYXRpdmUuc2V0TmV0d29ya1ZhcmlhYmxlQ29tbWFuZCgKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldElkLAorICAgICAgICAgICAgICAgICAgICAgICAgV2lmaUNvbmZpZ3VyYXRpb24uaGlkZGVuU1NJRFZhck5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICBJbnRlZ2VyLnRvU3RyaW5nKGNvbmZpZy5oaWRkZW5TU0lEID8gMSA6IDApKSkgeworICAgICAgICAgICAgICAgIExvZy5kKFRBRywgY29uZmlnLlNTSUQgKyAiOiBmYWlsZWQgdG8gc2V0IGhpZGRlblNTSUQ6ICIrCisgICAgICAgICAgICAgICAgICAgICAgICBjb25maWcuaGlkZGVuU1NJRCk7CisgICAgICAgICAgICAgICAgYnJlYWsgc2V0VmFyaWFibGVzOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmb3IgKFdpZmlDb25maWd1cmF0aW9uLkVudGVycHJpc2VGaWVsZCBmaWVsZAorICAgICAgICAgICAgICAgICAgICA6IGNvbmZpZy5lbnRlcnByaXNlRmllbGRzKSB7CisgICAgICAgICAgICAgICAgU3RyaW5nIHZhck5hbWUgPSBmaWVsZC52YXJOYW1lKCk7CisgICAgICAgICAgICAgICAgU3RyaW5nIHZhbHVlID0gZmllbGQudmFsdWUoKTsKKyAgICAgICAgICAgICAgICBpZiAodmFsdWUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBpZiAoZmllbGQgIT0gY29uZmlnLmVhcCkgeworICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSAodmFsdWUubGVuZ3RoKCkgPT0gMCkgPyAiTlVMTCIgOiBjb252ZXJ0VG9RdW90ZWRTdHJpbmcodmFsdWUpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmICghV2lmaU5hdGl2ZS5zZXROZXR3b3JrVmFyaWFibGVDb21tYW5kKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXRJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsIGNvbmZpZy5TU0lEICsgIjogZmFpbGVkIHRvIHNldCAiICsgdmFyTmFtZSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI6ICIgKyB2YWx1ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhayBzZXRWYXJpYWJsZXM7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICB1cGRhdGVGYWlsZWQgPSBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICh1cGRhdGVGYWlsZWQpIHsKKyAgICAgICAgICAgIGlmIChuZXdOZXR3b3JrKSB7CisgICAgICAgICAgICAgICAgV2lmaU5hdGl2ZS5yZW1vdmVOZXR3b3JrQ29tbWFuZChuZXRJZCk7CisgICAgICAgICAgICAgICAgTG9nLmQoVEFHLAorICAgICAgICAgICAgICAgICAgICAgICAgIkZhaWxlZCB0byBzZXQgYSBuZXR3b3JrIHZhcmlhYmxlLCByZW1vdmVkIG5ldHdvcms6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICsgbmV0SWQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisKKyAgICAgICAgLyogQW4gdXBkYXRlIG9mIHRoZSBuZXR3b3JrIHZhcmlhYmxlcyByZXF1aXJlcyByZWFkaW5nIHRoZW0KKyAgICAgICAgICogYmFjayBmcm9tIHRoZSBzdXBwbGljYW50IHRvIHVwZGF0ZSBzQ29uZmlndXJlZE5ldHdvcmtzLgorICAgICAgICAgKiBUaGlzIGlzIGJlY2F1c2Ugc29tZSBvZiB0aGUgdmFyaWFibGVzIChTU0lELCB3ZXAga2V5cyAmCisgICAgICAgICAqIHBhc3NwaHJhc2VzKSByZWZsZWN0IGRpZmZlcmVudCB2YWx1ZXMgd2hlbiByZWFkIGJhY2sgdGhhbgorICAgICAgICAgKiB3aGVuIHdyaXR0ZW4uIEZvciBleGFtcGxlLCB3ZXAga2V5IGlzIHN0b3JlZCBhcyAqIGlycmVzcGVjdGl2ZQorICAgICAgICAgKiBvZiB0aGUgdmFsdWUgc2VudCB0byB0aGUgc3VwcGxpY2FudAorICAgICAgICAgKi8KKyAgICAgICAgV2lmaUNvbmZpZ3VyYXRpb24gc0NvbmZpZzsKKyAgICAgICAgc3luY2hyb25pemVkIChzQ29uZmlndXJlZE5ldHdvcmtzKSB7CisgICAgICAgICAgICBzQ29uZmlnID0gc0NvbmZpZ3VyZWROZXR3b3Jrcy5nZXQobmV0SWQpOworICAgICAgICB9CisgICAgICAgIGlmIChzQ29uZmlnID09IG51bGwpIHsKKyAgICAgICAgICAgIHNDb25maWcgPSBuZXcgV2lmaUNvbmZpZ3VyYXRpb24oKTsKKyAgICAgICAgICAgIHNDb25maWcubmV0d29ya0lkID0gbmV0SWQ7CisgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKHNDb25maWd1cmVkTmV0d29ya3MpIHsKKyAgICAgICAgICAgICAgICBzQ29uZmlndXJlZE5ldHdvcmtzLnB1dChuZXRJZCwgc0NvbmZpZyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmVhZE5ldHdvcmtWYXJpYWJsZXMoc0NvbmZpZyk7CisKKyAgICAgICAgaWYgKGNvbmZpZy5pcEFzc2lnbm1lbnQgIT0gSXBBc3NpZ25tZW50LlVOQVNTSUdORUQpIHsKKyAgICAgICAgICAgIGlmIChuZXdOZXR3b3JrIHx8CisgICAgICAgICAgICAgICAgICAgIChzQ29uZmlnLmlwQXNzaWdubWVudCAhPSBjb25maWcuaXBBc3NpZ25tZW50KSB8fAorICAgICAgICAgICAgICAgICAgICAoc0NvbmZpZy5pcENvbmZpZy5pcEFkZHJlc3MgIT0gY29uZmlnLmlwQ29uZmlnLmlwQWRkcmVzcykgfHwKKyAgICAgICAgICAgICAgICAgICAgKHNDb25maWcuaXBDb25maWcuZ2F0ZXdheSAhPSBjb25maWcuaXBDb25maWcuZ2F0ZXdheSkgfHwKKyAgICAgICAgICAgICAgICAgICAgKHNDb25maWcuaXBDb25maWcubmV0bWFzayAhPSBjb25maWcuaXBDb25maWcubmV0bWFzaykgfHwKKyAgICAgICAgICAgICAgICAgICAgKHNDb25maWcuaXBDb25maWcuZG5zMSAhPSBjb25maWcuaXBDb25maWcuZG5zMSkgfHwKKyAgICAgICAgICAgICAgICAgICAgKHNDb25maWcuaXBDb25maWcuZG5zMiAhPSBjb25maWcuaXBDb25maWcuZG5zMikpIHsKKyAgICAgICAgICAgICAgICBzQ29uZmlnLmlwQXNzaWdubWVudCA9IGNvbmZpZy5pcEFzc2lnbm1lbnQ7CisgICAgICAgICAgICAgICAgc0NvbmZpZy5pcENvbmZpZyA9IGNvbmZpZy5pcENvbmZpZzsKKyAgICAgICAgICAgICAgICB3cml0ZUlwQ29uZmlndXJhdGlvbnMoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbmV0SWQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVhZCB0aGUgdmFyaWFibGVzIGZyb20gdGhlIHN1cHBsaWNhbnQgZGFlbW9uIHRoYXQgYXJlIG5lZWRlZCB0bworICAgICAqIGZpbGwgaW4gdGhlIFdpZmlDb25maWd1cmF0aW9uIG9iamVjdC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb25maWcgdGhlIHtAbGluayBXaWZpQ29uZmlndXJhdGlvbn0gb2JqZWN0IHRvIGJlIGZpbGxlZCBpbi4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHJlYWROZXR3b3JrVmFyaWFibGVzKFdpZmlDb25maWd1cmF0aW9uIGNvbmZpZykgeworCisgICAgICAgIGludCBuZXRJZCA9IGNvbmZpZy5uZXR3b3JrSWQ7CisgICAgICAgIGlmIChuZXRJZCA8IDApCisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgLyoKKyAgICAgICAgICogVE9ETzogbWF5YmUgc2hvdWxkIGhhdmUgYSBuYXRpdmUgbWV0aG9kIHRoYXQgdGFrZXMgYW4gYXJyYXkgb2YKKyAgICAgICAgICogdmFyaWFibGUgbmFtZXMgYW5kIHJldHVybnMgYW4gYXJyYXkgb2YgdmFsdWVzLiBCdXQgd2UnZCBzdGlsbAorICAgICAgICAgKiBiZSBkb2luZyBhIHJvdW5kIHRyaXAgdG8gdGhlIHN1cHBsaWNhbnQgZGFlbW9uIGZvciBlYWNoIHZhcmlhYmxlLgorICAgICAgICAgKi8KKyAgICAgICAgU3RyaW5nIHZhbHVlOworCisgICAgICAgIHZhbHVlID0gV2lmaU5hdGl2ZS5nZXROZXR3b3JrVmFyaWFibGVDb21tYW5kKG5ldElkLCBXaWZpQ29uZmlndXJhdGlvbi5zc2lkVmFyTmFtZSk7CisgICAgICAgIGlmICghVGV4dFV0aWxzLmlzRW1wdHkodmFsdWUpKSB7CisgICAgICAgICAgICBjb25maWcuU1NJRCA9IHJlbW92ZURvdWJsZVF1b3Rlcyh2YWx1ZSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBjb25maWcuU1NJRCA9IG51bGw7CisgICAgICAgIH0KKworICAgICAgICB2YWx1ZSA9IFdpZmlOYXRpdmUuZ2V0TmV0d29ya1ZhcmlhYmxlQ29tbWFuZChuZXRJZCwgV2lmaUNvbmZpZ3VyYXRpb24uYnNzaWRWYXJOYW1lKTsKKyAgICAgICAgaWYgKCFUZXh0VXRpbHMuaXNFbXB0eSh2YWx1ZSkpIHsKKyAgICAgICAgICAgIGNvbmZpZy5CU1NJRCA9IHZhbHVlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgY29uZmlnLkJTU0lEID0gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIHZhbHVlID0gV2lmaU5hdGl2ZS5nZXROZXR3b3JrVmFyaWFibGVDb21tYW5kKG5ldElkLCBXaWZpQ29uZmlndXJhdGlvbi5wcmlvcml0eVZhck5hbWUpOworICAgICAgICBjb25maWcucHJpb3JpdHkgPSAtMTsKKyAgICAgICAgaWYgKCFUZXh0VXRpbHMuaXNFbXB0eSh2YWx1ZSkpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgY29uZmlnLnByaW9yaXR5ID0gSW50ZWdlci5wYXJzZUludCh2YWx1ZSk7CisgICAgICAgICAgICB9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gaWdub3JlKSB7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICB2YWx1ZSA9IFdpZmlOYXRpdmUuZ2V0TmV0d29ya1ZhcmlhYmxlQ29tbWFuZChuZXRJZCwgV2lmaUNvbmZpZ3VyYXRpb24uaGlkZGVuU1NJRFZhck5hbWUpOworICAgICAgICBjb25maWcuaGlkZGVuU1NJRCA9IGZhbHNlOworICAgICAgICBpZiAoIVRleHRVdGlscy5pc0VtcHR5KHZhbHVlKSkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBjb25maWcuaGlkZGVuU1NJRCA9IEludGVnZXIucGFyc2VJbnQodmFsdWUpICE9IDA7CisgICAgICAgICAgICB9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gaWdub3JlKSB7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICB2YWx1ZSA9IFdpZmlOYXRpdmUuZ2V0TmV0d29ya1ZhcmlhYmxlQ29tbWFuZChuZXRJZCwgV2lmaUNvbmZpZ3VyYXRpb24ud2VwVHhLZXlJZHhWYXJOYW1lKTsKKyAgICAgICAgY29uZmlnLndlcFR4S2V5SW5kZXggPSAtMTsKKyAgICAgICAgaWYgKCFUZXh0VXRpbHMuaXNFbXB0eSh2YWx1ZSkpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgY29uZmlnLndlcFR4S2V5SW5kZXggPSBJbnRlZ2VyLnBhcnNlSW50KHZhbHVlKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBpZ25vcmUpIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgNDsgaSsrKSB7CisgICAgICAgICAgICB2YWx1ZSA9IFdpZmlOYXRpdmUuZ2V0TmV0d29ya1ZhcmlhYmxlQ29tbWFuZChuZXRJZCwKKyAgICAgICAgICAgICAgICAgICAgV2lmaUNvbmZpZ3VyYXRpb24ud2VwS2V5VmFyTmFtZXNbaV0pOworICAgICAgICAgICAgaWYgKCFUZXh0VXRpbHMuaXNFbXB0eSh2YWx1ZSkpIHsKKyAgICAgICAgICAgICAgICBjb25maWcud2VwS2V5c1tpXSA9IHZhbHVlOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBjb25maWcud2VwS2V5c1tpXSA9IG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICB2YWx1ZSA9IFdpZmlOYXRpdmUuZ2V0TmV0d29ya1ZhcmlhYmxlQ29tbWFuZChuZXRJZCwgV2lmaUNvbmZpZ3VyYXRpb24ucHNrVmFyTmFtZSk7CisgICAgICAgIGlmICghVGV4dFV0aWxzLmlzRW1wdHkodmFsdWUpKSB7CisgICAgICAgICAgICBjb25maWcucHJlU2hhcmVkS2V5ID0gdmFsdWU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBjb25maWcucHJlU2hhcmVkS2V5ID0gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIHZhbHVlID0gV2lmaU5hdGl2ZS5nZXROZXR3b3JrVmFyaWFibGVDb21tYW5kKGNvbmZpZy5uZXR3b3JrSWQsCisgICAgICAgICAgICAgICAgV2lmaUNvbmZpZ3VyYXRpb24uUHJvdG9jb2wudmFyTmFtZSk7CisgICAgICAgIGlmICghVGV4dFV0aWxzLmlzRW1wdHkodmFsdWUpKSB7CisgICAgICAgICAgICBTdHJpbmcgdmFsc1tdID0gdmFsdWUuc3BsaXQoIiAiKTsKKyAgICAgICAgICAgIGZvciAoU3RyaW5nIHZhbCA6IHZhbHMpIHsKKyAgICAgICAgICAgICAgICBpbnQgaW5kZXggPQorICAgICAgICAgICAgICAgICAgICBsb29rdXBTdHJpbmcodmFsLCBXaWZpQ29uZmlndXJhdGlvbi5Qcm90b2NvbC5zdHJpbmdzKTsKKyAgICAgICAgICAgICAgICBpZiAoMCA8PSBpbmRleCkgeworICAgICAgICAgICAgICAgICAgICBjb25maWcuYWxsb3dlZFByb3RvY29scy5zZXQoaW5kZXgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHZhbHVlID0gV2lmaU5hdGl2ZS5nZXROZXR3b3JrVmFyaWFibGVDb21tYW5kKGNvbmZpZy5uZXR3b3JrSWQsCisgICAgICAgICAgICAgICAgV2lmaUNvbmZpZ3VyYXRpb24uS2V5TWdtdC52YXJOYW1lKTsKKyAgICAgICAgaWYgKCFUZXh0VXRpbHMuaXNFbXB0eSh2YWx1ZSkpIHsKKyAgICAgICAgICAgIFN0cmluZyB2YWxzW10gPSB2YWx1ZS5zcGxpdCgiICIpOworICAgICAgICAgICAgZm9yIChTdHJpbmcgdmFsIDogdmFscykgeworICAgICAgICAgICAgICAgIGludCBpbmRleCA9CisgICAgICAgICAgICAgICAgICAgIGxvb2t1cFN0cmluZyh2YWwsIFdpZmlDb25maWd1cmF0aW9uLktleU1nbXQuc3RyaW5ncyk7CisgICAgICAgICAgICAgICAgaWYgKDAgPD0gaW5kZXgpIHsKKyAgICAgICAgICAgICAgICAgICAgY29uZmlnLmFsbG93ZWRLZXlNYW5hZ2VtZW50LnNldChpbmRleCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgdmFsdWUgPSBXaWZpTmF0aXZlLmdldE5ldHdvcmtWYXJpYWJsZUNvbW1hbmQoY29uZmlnLm5ldHdvcmtJZCwKKyAgICAgICAgICAgICAgICBXaWZpQ29uZmlndXJhdGlvbi5BdXRoQWxnb3JpdGhtLnZhck5hbWUpOworICAgICAgICBpZiAoIVRleHRVdGlscy5pc0VtcHR5KHZhbHVlKSkgeworICAgICAgICAgICAgU3RyaW5nIHZhbHNbXSA9IHZhbHVlLnNwbGl0KCIgIik7CisgICAgICAgICAgICBmb3IgKFN0cmluZyB2YWwgOiB2YWxzKSB7CisgICAgICAgICAgICAgICAgaW50IGluZGV4ID0KKyAgICAgICAgICAgICAgICAgICAgbG9va3VwU3RyaW5nKHZhbCwgV2lmaUNvbmZpZ3VyYXRpb24uQXV0aEFsZ29yaXRobS5zdHJpbmdzKTsKKyAgICAgICAgICAgICAgICBpZiAoMCA8PSBpbmRleCkgeworICAgICAgICAgICAgICAgICAgICBjb25maWcuYWxsb3dlZEF1dGhBbGdvcml0aG1zLnNldChpbmRleCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgdmFsdWUgPSBXaWZpTmF0aXZlLmdldE5ldHdvcmtWYXJpYWJsZUNvbW1hbmQoY29uZmlnLm5ldHdvcmtJZCwKKyAgICAgICAgICAgICAgICBXaWZpQ29uZmlndXJhdGlvbi5QYWlyd2lzZUNpcGhlci52YXJOYW1lKTsKKyAgICAgICAgaWYgKCFUZXh0VXRpbHMuaXNFbXB0eSh2YWx1ZSkpIHsKKyAgICAgICAgICAgIFN0cmluZyB2YWxzW10gPSB2YWx1ZS5zcGxpdCgiICIpOworICAgICAgICAgICAgZm9yIChTdHJpbmcgdmFsIDogdmFscykgeworICAgICAgICAgICAgICAgIGludCBpbmRleCA9CisgICAgICAgICAgICAgICAgICAgIGxvb2t1cFN0cmluZyh2YWwsIFdpZmlDb25maWd1cmF0aW9uLlBhaXJ3aXNlQ2lwaGVyLnN0cmluZ3MpOworICAgICAgICAgICAgICAgIGlmICgwIDw9IGluZGV4KSB7CisgICAgICAgICAgICAgICAgICAgIGNvbmZpZy5hbGxvd2VkUGFpcndpc2VDaXBoZXJzLnNldChpbmRleCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgdmFsdWUgPSBXaWZpTmF0aXZlLmdldE5ldHdvcmtWYXJpYWJsZUNvbW1hbmQoY29uZmlnLm5ldHdvcmtJZCwKKyAgICAgICAgICAgICAgICBXaWZpQ29uZmlndXJhdGlvbi5Hcm91cENpcGhlci52YXJOYW1lKTsKKyAgICAgICAgaWYgKCFUZXh0VXRpbHMuaXNFbXB0eSh2YWx1ZSkpIHsKKyAgICAgICAgICAgIFN0cmluZyB2YWxzW10gPSB2YWx1ZS5zcGxpdCgiICIpOworICAgICAgICAgICAgZm9yIChTdHJpbmcgdmFsIDogdmFscykgeworICAgICAgICAgICAgICAgIGludCBpbmRleCA9CisgICAgICAgICAgICAgICAgICAgIGxvb2t1cFN0cmluZyh2YWwsIFdpZmlDb25maWd1cmF0aW9uLkdyb3VwQ2lwaGVyLnN0cmluZ3MpOworICAgICAgICAgICAgICAgIGlmICgwIDw9IGluZGV4KSB7CisgICAgICAgICAgICAgICAgICAgIGNvbmZpZy5hbGxvd2VkR3JvdXBDaXBoZXJzLnNldChpbmRleCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgZm9yIChXaWZpQ29uZmlndXJhdGlvbi5FbnRlcnByaXNlRmllbGQgZmllbGQgOgorICAgICAgICAgICAgICAgIGNvbmZpZy5lbnRlcnByaXNlRmllbGRzKSB7CisgICAgICAgICAgICB2YWx1ZSA9IFdpZmlOYXRpdmUuZ2V0TmV0d29ya1ZhcmlhYmxlQ29tbWFuZChuZXRJZCwKKyAgICAgICAgICAgICAgICAgICAgZmllbGQudmFyTmFtZSgpKTsKKyAgICAgICAgICAgIGlmICghVGV4dFV0aWxzLmlzRW1wdHkodmFsdWUpKSB7CisgICAgICAgICAgICAgICAgaWYgKGZpZWxkICE9IGNvbmZpZy5lYXApIHZhbHVlID0gcmVtb3ZlRG91YmxlUXVvdGVzKHZhbHVlKTsKKyAgICAgICAgICAgICAgICBmaWVsZC5zZXRWYWx1ZSh2YWx1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgcmVtb3ZlRG91YmxlUXVvdGVzKFN0cmluZyBzdHJpbmcpIHsKKyAgICAgICAgaWYgKHN0cmluZy5sZW5ndGgoKSA8PSAyKSByZXR1cm4gIiI7CisgICAgICAgIHJldHVybiBzdHJpbmcuc3Vic3RyaW5nKDEsIHN0cmluZy5sZW5ndGgoKSAtIDEpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBjb252ZXJ0VG9RdW90ZWRTdHJpbmcoU3RyaW5nIHN0cmluZykgeworICAgICAgICByZXR1cm4gIlwiIiArIHN0cmluZyArICJcIiI7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIG1ha2VTdHJpbmcoQml0U2V0IHNldCwgU3RyaW5nW10gc3RyaW5ncykgeworICAgICAgICBTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOworICAgICAgICBpbnQgbmV4dFNldEJpdCA9IC0xOworCisgICAgICAgIC8qIE1ha2Ugc3VyZSBhbGwgc2V0IGJpdHMgYXJlIGluIFswLCBzdHJpbmdzLmxlbmd0aCkgdG8gYXZvaWQKKyAgICAgICAgICogZ29pbmcgb3V0IG9mIGJvdW5kcyBvbiBzdHJpbmdzLiAgKFNob3VsZG4ndCBoYXBwZW4sIGJ1dC4uLikgKi8KKyAgICAgICAgc2V0ID0gc2V0LmdldCgwLCBzdHJpbmdzLmxlbmd0aCk7CisKKyAgICAgICAgd2hpbGUgKChuZXh0U2V0Qml0ID0gc2V0Lm5leHRTZXRCaXQobmV4dFNldEJpdCArIDEpKSAhPSAtMSkgeworICAgICAgICAgICAgYnVmLmFwcGVuZChzdHJpbmdzW25leHRTZXRCaXRdLnJlcGxhY2UoJ18nLCAnLScpKS5hcHBlbmQoJyAnKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIHJlbW92ZSB0cmFpbGluZyBzcGFjZQorICAgICAgICBpZiAoc2V0LmNhcmRpbmFsaXR5KCkgPiAwKSB7CisgICAgICAgICAgICBidWYuc2V0TGVuZ3RoKGJ1Zi5sZW5ndGgoKSAtIDEpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGJ1Zi50b1N0cmluZygpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGludCBsb29rdXBTdHJpbmcoU3RyaW5nIHN0cmluZywgU3RyaW5nW10gc3RyaW5ncykgeworICAgICAgICBpbnQgc2l6ZSA9IHN0cmluZ3MubGVuZ3RoOworCisgICAgICAgIHN0cmluZyA9IHN0cmluZy5yZXBsYWNlKCctJywgJ18nKTsKKworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykKKyAgICAgICAgICAgIGlmIChzdHJpbmcuZXF1YWxzKHN0cmluZ3NbaV0pKQorICAgICAgICAgICAgICAgIHJldHVybiBpOworCisgICAgICAgIC8vIGlmIHdlIGV2ZXIgZ2V0IGhlcmUsIHdlIHNob3VsZCBwcm9iYWJseSBhZGQgdGhlCisgICAgICAgIC8vIHZhbHVlIHRvIFdpZmlDb25maWd1cmF0aW9uIHRvIHJlZmxlY3QgdGhhdCBpdCdzCisgICAgICAgIC8vIHN1cHBvcnRlZCBieSB0aGUgV1BBIHN1cHBsaWNhbnQKKyAgICAgICAgTG9nLncoVEFHLCAiRmFpbGVkIHRvIGxvb2stdXAgYSBzdHJpbmc6ICIgKyBzdHJpbmcpOworCisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICAvKiBSZXR1cm5zIGEgdW5pcXVlIGZvciBhIGdpdmVuIGNvbmZpZ3VyYXRpb24gKi8KKyAgICBwcml2YXRlIHN0YXRpYyBpbnQgY29uZmlnS2V5KFdpZmlDb25maWd1cmF0aW9uIGNvbmZpZykgeworICAgICAgICBTdHJpbmcga2V5OworCisgICAgICAgIGlmIChjb25maWcuYWxsb3dlZEtleU1hbmFnZW1lbnQuZ2V0KEtleU1nbXQuV1BBX1BTSykpIHsKKyAgICAgICAgICAgIGtleSA9IGNvbmZpZy5TU0lEICsgS2V5TWdtdC5zdHJpbmdzW0tleU1nbXQuV1BBX1BTS107CisgICAgICAgIH0gZWxzZSBpZiAoY29uZmlnLmFsbG93ZWRLZXlNYW5hZ2VtZW50LmdldChLZXlNZ210LldQQV9FQVApIHx8CisgICAgICAgICAgICAgICAgY29uZmlnLmFsbG93ZWRLZXlNYW5hZ2VtZW50LmdldChLZXlNZ210LklFRUU4MDIxWCkpIHsKKyAgICAgICAgICAgIGtleSA9IGNvbmZpZy5TU0lEICsgS2V5TWdtdC5zdHJpbmdzW0tleU1nbXQuV1BBX0VBUF07CisgICAgICAgIH0gZWxzZSBpZiAoY29uZmlnLndlcEtleXNbMF0gIT0gbnVsbCkgeworICAgICAgICAgICAga2V5ID0gY29uZmlnLlNTSUQgKyAiV0VQIjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGtleSA9IGNvbmZpZy5TU0lEICsgS2V5TWdtdC5zdHJpbmdzW0tleU1nbXQuTk9ORV07CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4ga2V5Lmhhc2hDb2RlKCk7CisgICAgfQorCisgICAgc3RhdGljIFN0cmluZyBkdW1wKCkgeworICAgICAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisgICAgICAgIFN0cmluZyBMUyA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgibGluZS5zZXBhcmF0b3IiKTsKKyAgICAgICAgc2IuYXBwZW5kKCJzTGFzdFByaW9yaXR5ICIpLmFwcGVuZChzTGFzdFByaW9yaXR5KS5hcHBlbmQoTFMpOworICAgICAgICBzYi5hcHBlbmQoIkNvbmZpZ3VyZWQgbmV0d29ya3MgIikuYXBwZW5kKExTKTsKKyAgICAgICAgZm9yIChXaWZpQ29uZmlndXJhdGlvbiBjb25mIDogZ2V0Q29uZmlndXJlZE5ldHdvcmtzKCkpIHsKKyAgICAgICAgICAgIHNiLmFwcGVuZChjb25mKS5hcHBlbmQoTFMpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBzYi50b1N0cmluZygpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3dpZmkvamF2YS9hbmRyb2lkL25ldC93aWZpL1dpZmlDb25maWd1cmF0aW9uLmphdmEgYi93aWZpL2phdmEvYW5kcm9pZC9uZXQvd2lmaS9XaWZpQ29uZmlndXJhdGlvbi5qYXZhCmluZGV4IDAxYmM5MTkuLjg5NzFiZGQgMTAwNjQ0Ci0tLSBhL3dpZmkvamF2YS9hbmRyb2lkL25ldC93aWZpL1dpZmlDb25maWd1cmF0aW9uLmphdmEKKysrIGIvd2lmaS9qYXZhL2FuZHJvaWQvbmV0L3dpZmkvV2lmaUNvbmZpZ3VyYXRpb24uamF2YQpAQCAtMTYsNiArMTYsNyBAQAogCiBwYWNrYWdlIGFuZHJvaWQubmV0LndpZmk7CiAKK2ltcG9ydCBhbmRyb2lkLm5ldC5EaGNwSW5mbzsKIGltcG9ydCBhbmRyb2lkLm9zLlBhcmNlbGFibGU7CiBpbXBvcnQgYW5kcm9pZC5vcy5QYXJjZWw7CiAKQEAgLTIxNiw3ICsyMTcsNyBAQAogICAgIC8qKgogICAgICAqIFRoZSBuZXR3b3JrJ3MgU1NJRC4gQ2FuIGVpdGhlciBiZSBhbiBBU0NJSSBzdHJpbmcsCiAgICAgICogd2hpY2ggbXVzdCBiZSBlbmNsb3NlZCBpbiBkb3VibGUgcXVvdGF0aW9uIG1hcmtzCi0gICAgICogKGUuZy4sIHtAY29kZSAmcXVvdDtNeU5ldHdvcmsmcXVvdDt9LCBvciBhIHN0cmluZyBvZgorICAgICAqIChlLmcuLCB7QGNvZGUgIk15TmV0d29yayJ9LCBvciBhIHN0cmluZyBvZgogICAgICAqIGhleCBkaWdpdHMsd2hpY2ggYXJlIG5vdCBlbmNsb3NlZCBpbiBxdW90ZXMKICAgICAgKiAoZS5nLiwge0Bjb2RlIDAxYTI0M2Y0MDV9KS4KICAgICAgKi8KQEAgLTIzOSw3ICsyNDAsNyBAQAogICAgIHB1YmxpYyBTdHJpbmcgcHJlU2hhcmVkS2V5OwogICAgIC8qKgogICAgICAqIFVwIHRvIGZvdXIgV0VQIGtleXMuIEVpdGhlciBhbiBBU0NJSSBzdHJpbmcgZW5jbG9zZWQgaW4gZG91YmxlCi0gICAgICogcXVvdGF0aW9uIG1hcmtzIChlLmcuLCB7QGNvZGUgJnF1b3Q7YWJjZGVmJnF1b3Q7fSBvciBhIHN0cmluZworICAgICAqIHF1b3RhdGlvbiBtYXJrcyAoZS5nLiwge0Bjb2RlICJhYmNkZWYifSBvciBhIHN0cmluZwogICAgICAqIG9mIGhleCBkaWdpdHMgKGUuZy4sIHtAY29kZSAwMTAyMDMwNDA1fSkuCiAgICAgICogPHAvPgogICAgICAqIFdoZW4gdGhlIHZhbHVlIG9mIG9uZSBvZiB0aGVzZSBrZXlzIGlzIHJlYWQsIHRoZSBhY3R1YWwga2V5IGlzCkBAIC0yOTQsNiArMjk1LDIyIEBACiAgICAgICovCiAgICAgcHVibGljIEJpdFNldCBhbGxvd2VkR3JvdXBDaXBoZXJzOwogCisgICAgLyoqCisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgZW51bSBJcEFzc2lnbm1lbnQgeworICAgICAgICBTVEFUSUMsCisgICAgICAgIERIQ1AsCisgICAgICAgIFVOQVNTSUdORUQKKyAgICB9CisgICAgLyoqCisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgSXBBc3NpZ25tZW50IGlwQXNzaWdubWVudDsKKyAgICAvKioKKyAgICAgKiBAaGlkZQorICAgICAqLworICAgIHB1YmxpYyBEaGNwSW5mbyBpcENvbmZpZzsKIAogICAgIHB1YmxpYyBXaWZpQ29uZmlndXJhdGlvbigpIHsKICAgICAgICAgbmV0d29ya0lkID0gLTE7CkBAIC0zMTIsNiArMzI5LDggQEAKICAgICAgICAgZm9yIChFbnRlcnByaXNlRmllbGQgZmllbGQgOiBlbnRlcnByaXNlRmllbGRzKSB7CiAgICAgICAgICAgICBmaWVsZC5zZXRWYWx1ZShudWxsKTsKICAgICAgICAgfQorICAgICAgICBpcEFzc2lnbm1lbnQgPSBJcEFzc2lnbm1lbnQuVU5BU1NJR05FRDsKKyAgICAgICAgaXBDb25maWcgPSBuZXcgRGhjcEluZm8oKTsKICAgICB9CiAKICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewpAQCAtMzkzLDYgKzQxMiwxMSBAQAogICAgICAgICAgICAgaWYgKHZhbHVlICE9IG51bGwpIHNidWYuYXBwZW5kKHZhbHVlKTsKICAgICAgICAgfQogICAgICAgICBzYnVmLmFwcGVuZCgnXG4nKTsKKyAgICAgICAgaWYgKGlwQXNzaWdubWVudCA9PSBJcEFzc2lnbm1lbnQuU1RBVElDKSB7CisgICAgICAgICAgICBzYnVmLmFwcGVuZCgiICIpLmFwcGVuZCgiU3RhdGljIElQIGNvbmZpZ3VyYXRpb246IikuYXBwZW5kKCdcbicpOworICAgICAgICAgICAgc2J1Zi5hcHBlbmQoIiAiKS5hcHBlbmQoaXBDb25maWcpOworICAgICAgICB9CisgICAgICAgIHNidWYuYXBwZW5kKCdcbicpOwogICAgICAgICByZXR1cm4gc2J1Zi50b1N0cmluZygpOwogICAgIH0KIApAQCAtNDMyLDYgKzQ1Niw0MCBAQAogICAgICAgICByZXR1cm4gMDsKICAgICB9CiAKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGEgY29weSBvZiB0aGlzIFdpZmlDb25maWd1cmF0aW9uLgorICAgICAqCisgICAgICogQHJldHVybiBhIGNvcHkgb2YgdGhpcyBXaWZpQ29uZmlndXJhdGlvbi4KKyAgICAgKiBAaGlkZQorICAgICAqLworICAgIHB1YmxpYyBXaWZpQ29uZmlndXJhdGlvbiBjbG9uZSgpIHsKKyAgICAgICAgV2lmaUNvbmZpZ3VyYXRpb24gY29uZmlnID0gbmV3IFdpZmlDb25maWd1cmF0aW9uKCk7CisgICAgICAgIGNvbmZpZy5uZXR3b3JrSWQgPSBuZXR3b3JrSWQ7CisgICAgICAgIGNvbmZpZy5zdGF0dXMgPSBzdGF0dXM7CisgICAgICAgIGNvbmZpZy5TU0lEID0gU1NJRDsKKyAgICAgICAgY29uZmlnLkJTU0lEID0gQlNTSUQ7CisgICAgICAgIGNvbmZpZy5wcmVTaGFyZWRLZXkgPSBwcmVTaGFyZWRLZXk7CisKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB3ZXBLZXlzLmxlbmd0aDsgaSsrKQorICAgICAgICAgICAgY29uZmlnLndlcEtleXNbaV0gPSB3ZXBLZXlzW2ldOworCisgICAgICAgIGNvbmZpZy53ZXBUeEtleUluZGV4ID0gd2VwVHhLZXlJbmRleDsKKyAgICAgICAgY29uZmlnLnByaW9yaXR5ID0gcHJpb3JpdHk7CisgICAgICAgIGNvbmZpZy5oaWRkZW5TU0lEID0gaGlkZGVuU1NJRDsKKyAgICAgICAgY29uZmlnLmFsbG93ZWRLZXlNYW5hZ2VtZW50ICAgPSAoQml0U2V0KSBhbGxvd2VkS2V5TWFuYWdlbWVudC5jbG9uZSgpOworICAgICAgICBjb25maWcuYWxsb3dlZFByb3RvY29scyAgICAgICA9IChCaXRTZXQpIGFsbG93ZWRQcm90b2NvbHMuY2xvbmUoKTsKKyAgICAgICAgY29uZmlnLmFsbG93ZWRBdXRoQWxnb3JpdGhtcyAgPSAoQml0U2V0KSBhbGxvd2VkQXV0aEFsZ29yaXRobXMuY2xvbmUoKTsKKyAgICAgICAgY29uZmlnLmFsbG93ZWRQYWlyd2lzZUNpcGhlcnMgPSAoQml0U2V0KSBhbGxvd2VkUGFpcndpc2VDaXBoZXJzLmNsb25lKCk7CisgICAgICAgIGNvbmZpZy5hbGxvd2VkR3JvdXBDaXBoZXJzICAgID0gKEJpdFNldCkgYWxsb3dlZEdyb3VwQ2lwaGVycy5jbG9uZSgpOworCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZW50ZXJwcmlzZUZpZWxkcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgY29uZmlnLmVudGVycHJpc2VGaWVsZHNbaV0uc2V0VmFsdWUoZW50ZXJwcmlzZUZpZWxkc1tpXS52YWx1ZSgpKTsKKyAgICAgICAgfQorICAgICAgICBjb25maWcuaXBBc3NpZ25tZW50ID0gaXBBc3NpZ25tZW50OworICAgICAgICBjb25maWcuaXBDb25maWcgPSBuZXcgRGhjcEluZm8oaXBDb25maWcpOworICAgICAgICByZXR1cm4gY29uZmlnOworICAgIH0KKwogICAgIC8qKiBJbXBsZW1lbnQgdGhlIFBhcmNlbGFibGUgaW50ZXJmYWNlIHtAaGlkZX0gKi8KICAgICBwdWJsaWMgdm9pZCB3cml0ZVRvUGFyY2VsKFBhcmNlbCBkZXN0LCBpbnQgZmxhZ3MpIHsKICAgICAgICAgZGVzdC53cml0ZUludChuZXR3b3JrSWQpOwpAQCAtNDU0LDYgKzUxMiwxNCBAQAogICAgICAgICBmb3IgKEVudGVycHJpc2VGaWVsZCBmaWVsZCA6IGVudGVycHJpc2VGaWVsZHMpIHsKICAgICAgICAgICAgIGRlc3Qud3JpdGVTdHJpbmcoZmllbGQudmFsdWUoKSk7CiAgICAgICAgIH0KKyAgICAgICAgZGVzdC53cml0ZVN0cmluZyhpcEFzc2lnbm1lbnQubmFtZSgpKTsKKyAgICAgICAgZGVzdC53cml0ZUludChpcENvbmZpZy5pcEFkZHJlc3MpOworICAgICAgICBkZXN0LndyaXRlSW50KGlwQ29uZmlnLm5ldG1hc2spOworICAgICAgICBkZXN0LndyaXRlSW50KGlwQ29uZmlnLmdhdGV3YXkpOworICAgICAgICBkZXN0LndyaXRlSW50KGlwQ29uZmlnLmRuczEpOworICAgICAgICBkZXN0LndyaXRlSW50KGlwQ29uZmlnLmRuczIpOworICAgICAgICBkZXN0LndyaXRlSW50KGlwQ29uZmlnLnNlcnZlckFkZHJlc3MpOworICAgICAgICBkZXN0LndyaXRlSW50KGlwQ29uZmlnLmxlYXNlRHVyYXRpb24pOwogICAgIH0KIAogICAgIC8qKiBJbXBsZW1lbnQgdGhlIFBhcmNlbGFibGUgaW50ZXJmYWNlIHtAaGlkZX0gKi8KQEAgLTQ4MCw2ICs1NDYsMTUgQEAKICAgICAgICAgICAgICAgICBmb3IgKEVudGVycHJpc2VGaWVsZCBmaWVsZCA6IGNvbmZpZy5lbnRlcnByaXNlRmllbGRzKSB7CiAgICAgICAgICAgICAgICAgICAgIGZpZWxkLnNldFZhbHVlKGluLnJlYWRTdHJpbmcoKSk7CiAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY29uZmlnLmlwQXNzaWdubWVudCA9IElwQXNzaWdubWVudC52YWx1ZU9mKGluLnJlYWRTdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgY29uZmlnLmlwQ29uZmlnLmlwQWRkcmVzcyA9IGluLnJlYWRJbnQoKTsKKyAgICAgICAgICAgICAgICBjb25maWcuaXBDb25maWcubmV0bWFzayA9IGluLnJlYWRJbnQoKTsKKyAgICAgICAgICAgICAgICBjb25maWcuaXBDb25maWcuZ2F0ZXdheSA9IGluLnJlYWRJbnQoKTsKKyAgICAgICAgICAgICAgICBjb25maWcuaXBDb25maWcuZG5zMSA9IGluLnJlYWRJbnQoKTsKKyAgICAgICAgICAgICAgICBjb25maWcuaXBDb25maWcuZG5zMiA9IGluLnJlYWRJbnQoKTsKKyAgICAgICAgICAgICAgICBjb25maWcuaXBDb25maWcuc2VydmVyQWRkcmVzcyA9IGluLnJlYWRJbnQoKTsKKyAgICAgICAgICAgICAgICBjb25maWcuaXBDb25maWcubGVhc2VEdXJhdGlvbiA9IGluLnJlYWRJbnQoKTsKICAgICAgICAgICAgICAgICByZXR1cm4gY29uZmlnOwogICAgICAgICAgICAgfQogCmRpZmYgLS1naXQgYS93aWZpL2phdmEvYW5kcm9pZC9uZXQvd2lmaS9XaWZpTWFuYWdlci5qYXZhIGIvd2lmaS9qYXZhL2FuZHJvaWQvbmV0L3dpZmkvV2lmaU1hbmFnZXIuamF2YQppbmRleCBkZDE2MmYyLi4yNmVkODc4IDEwMDY0NAotLS0gYS93aWZpL2phdmEvYW5kcm9pZC9uZXQvd2lmaS9XaWZpTWFuYWdlci5qYXZhCisrKyBiL3dpZmkvamF2YS9hbmRyb2lkL25ldC93aWZpL1dpZmlNYW5hZ2VyLmphdmEKQEAgLTE2Niw3ICsxNjYsNyBAQAogICAgICAqCiAgICAgICogQGhpZGUKICAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBXSUZJX0FQX1NUQVRFX0RJU0FCTElORyA9IDA7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0lGSV9BUF9TVEFURV9ESVNBQkxJTkcgPSAxMDsKICAgICAvKioKICAgICAgKiBXaS1GaSBBUCBpcyBkaXNhYmxlZC4KICAgICAgKgpAQCAtMTc1LDcgKzE3NSw3IEBACiAgICAgICoKICAgICAgKiBAaGlkZQogICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFdJRklfQVBfU1RBVEVfRElTQUJMRUQgPSAxOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFdJRklfQVBfU1RBVEVfRElTQUJMRUQgPSAxMTsKICAgICAvKioKICAgICAgKiBXaS1GaSBBUCBpcyBjdXJyZW50bHkgYmVpbmcgZW5hYmxlZC4gVGhlIHN0YXRlIHdpbGwgY2hhbmdlIHRvCiAgICAgICoge0BsaW5rICNXSUZJX0FQX1NUQVRFX0VOQUJMRUR9IGlmIGl0IGZpbmlzaGVzIHN1Y2Nlc3NmdWxseS4KQEAgLTE4NSw3ICsxODUsNyBAQAogICAgICAqCiAgICAgICogQGhpZGUKICAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBXSUZJX0FQX1NUQVRFX0VOQUJMSU5HID0gMjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBXSUZJX0FQX1NUQVRFX0VOQUJMSU5HID0gMTI7CiAgICAgLyoqCiAgICAgICogV2ktRmkgQVAgaXMgZW5hYmxlZC4KICAgICAgKgpAQCAtMTk0LDcgKzE5NCw3IEBACiAgICAgICoKICAgICAgKiBAaGlkZQogICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFdJRklfQVBfU1RBVEVfRU5BQkxFRCA9IDM7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0lGSV9BUF9TVEFURV9FTkFCTEVEID0gMTM7CiAgICAgLyoqCiAgICAgICogV2ktRmkgQVAgaXMgaW4gYSBmYWlsZWQgc3RhdGUuIFRoaXMgc3RhdGUgd2lsbCBvY2N1ciB3aGVuIGFuIGVycm9yIG9jY3VycyBkdXJpbmcKICAgICAgKiBlbmFibGluZyBvciBkaXNhYmxpbmcKQEAgLTIwNCw3ICsyMDQsNyBAQAogICAgICAqCiAgICAgICogQGhpZGUKICAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBXSUZJX0FQX1NUQVRFX0ZBSUxFRCA9IDQ7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0lGSV9BUF9TVEFURV9GQUlMRUQgPSAxNDsKIAogICAgIC8qKgogICAgICAqIEJyb2FkY2FzdCBpbnRlbnQgYWN0aW9uIGluZGljYXRpbmcgdGhhdCBhIGNvbm5lY3Rpb24gdG8gdGhlIHN1cHBsaWNhbnQgaGFzCkBAIC0yNzUsNyArMjc1LDE0IEBACiAgICAgICogQHNlZSAjRVJST1JfQVVUSEVOVElDQVRJTkcKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRSQV9TVVBQTElDQU5UX0VSUk9SID0gInN1cHBsaWNhbnRFcnJvciI7Ci0KKyAgICAvKioKKyAgICAgKiBCcm9hZGNhc3QgaW50ZW50IGFjdGlvbiBpbmRpY2F0aW5nIHRoYXQgdGhlIHN1cHBsaWNhbnQgY29uZmlndXJhdGlvbiBjaGFuZ2VkLgorICAgICAqIFRoaXMgY2FuIGJlIGFzIGEgcmVzdWx0IG9mIGFkZGluZy91cGRhdGluZy9kZWxldGluZyBhIG5ldHdvcmsKKyAgICAgKiBAaGlkZQorICAgICAqLworICAgIEBTZGtDb25zdGFudChTZGtDb25zdGFudFR5cGUuQlJPQURDQVNUX0lOVEVOVF9BQ1RJT04pCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1VQUExJQ0FOVF9DT05GSUdfQ0hBTkdFRF9BQ1RJT04gPQorICAgICAgICAiYW5kcm9pZC5uZXQud2lmaS5zdXBwbGljYW50LkNPTkZJR19DSEFOR0UiOwogICAgIC8qKgogICAgICAqIEFuIGFjY2VzcyBwb2ludCBzY2FuIGhhcyBjb21wbGV0ZWQsIGFuZCByZXN1bHRzIGFyZSBhdmFpbGFibGUgZnJvbSB0aGUgc3VwcGxpY2FudC4KICAgICAgKiBDYWxsIHtAbGluayAjZ2V0U2NhblJlc3VsdHMoKX0gdG8gb2J0YWluIHRoZSByZXN1bHRzLgpAQCAtMjk0LDExICszMDEsMjYgQEAKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRSQV9ORVdfUlNTSSA9ICJuZXdSc3NpIjsKIAogICAgIC8qKgorICAgICAqIEJyb2FkY2FzdCBpbnRlbnQgYWN0aW9uIGluZGljYXRpbmcgdGhhdCB0aGUgSVAgY29uZmlndXJhdGlvbgorICAgICAqIGNoYW5nZWQgb24gd2lmaS4KKyAgICAgKiBAaGlkZQorICAgICAqLworICAgIEBTZGtDb25zdGFudChTZGtDb25zdGFudFR5cGUuQlJPQURDQVNUX0lOVEVOVF9BQ1RJT04pCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09ORklHX0NIQU5HRURfQUNUSU9OID0gImFuZHJvaWQubmV0LndpZmkuQ09ORklHX0NIQU5HRUQiOworICAgIC8qKgorICAgICAqIFRoZSBsb29rdXAga2V5IGZvciBhIHtAbGluayBhbmRyb2lkLm5ldC5MaW5rUHJvcGVydGllc30gb2JqZWN0IGFzc29jaWF0ZWQgd2l0aCB0aGUKKyAgICAgKiBXaS1GaSBuZXR3b3JrLiBSZXRyaWV2ZSB3aXRoCisgICAgICoge0BsaW5rIGFuZHJvaWQuY29udGVudC5JbnRlbnQjZ2V0UGFyY2VsYWJsZUV4dHJhKFN0cmluZyl9LgorICAgICAqIEBoaWRlCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhUUkFfTElOS19QUk9QRVJUSUVTID0gImxpbmtQcm9wZXJ0aWVzIjsKKworICAgIC8qKgogICAgICAqIFRoZSBuZXR3b3JrIElEcyBvZiB0aGUgY29uZmlndXJlZCBuZXR3b3JrcyBjb3VsZCBoYXZlIGNoYW5nZWQuCiAgICAgICovCiAgICAgQFNka0NvbnN0YW50KFNka0NvbnN0YW50VHlwZS5CUk9BRENBU1RfSU5URU5UX0FDVElPTikKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBORVRXT1JLX0lEU19DSEFOR0VEX0FDVElPTiA9ICJhbmRyb2lkLm5ldC53aWZpLk5FVFdPUktfSURTX0NIQU5HRUQiOwotICAgIAorCiAgICAgLyoqCiAgICAgICogQWN0aXZpdHkgQWN0aW9uOiBQaWNrIGEgV2ktRmkgbmV0d29yayB0byBjb25uZWN0IHRvLgogICAgICAqIDxwPklucHV0OiBOb3RoaW5nLgpAQCAtMzA4LDE2ICszMzAsNiBAQAogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFDVElPTl9QSUNLX1dJRklfTkVUV09SSyA9ICJhbmRyb2lkLm5ldC53aWZpLlBJQ0tfV0lGSV9ORVRXT1JLIjsKIAogICAgIC8qKgotICAgICAqIEluIHRoaXMgV2ktRmkgbG9jayBtb2RlLCBXaS1GaSB3aWxsIGJlaGF2ZSBhcyBpbiB0aGUgbW9kZQotICAgICAqIHtAbGluayAjV0lGSV9NT0RFX0ZVTEx9IGJ1dCBpdCBvcGVyYXRlcyBhdCBoaWdoIHBlcmZvcm1hbmNlCi0gICAgICogYXQgdGhlIGV4cGVuc2Ugb2YgcG93ZXIuIFRoaXMgbW9kZSBzaG91bGQgYmUgdXNlZAotICAgICAqIG9ubHkgd2hlbiB0aGUgd2lmaSBjb25uZWN0aW9uIG5lZWRzIHRvIGhhdmUgbWluaW11bSBsb3NzIGFuZCBsb3cKLSAgICAgKiBsYXRlbmN5IGFzIGl0IGNhbiBpbXBhY3QgdGhlIGJhdHRlcnkgbGlmZS4KLSAgICAgKiBAaGlkZQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFdJRklfTU9ERV9GVUxMX0hJR0hfUEVSRiA9IDM7Ci0KLSAgICAvKioKICAgICAgKiBJbiB0aGlzIFdpLUZpIGxvY2sgbW9kZSwgV2ktRmkgd2lsbCBiZSBrZXB0IGFjdGl2ZSwKICAgICAgKiBhbmQgd2lsbCBiZWhhdmUgbm9ybWFsbHksIGkuZS4sIGl0IHdpbGwgYXR0ZW1wdCB0byBhdXRvbWF0aWNhbGx5CiAgICAgICogZXN0YWJsaXNoIGEgY29ubmVjdGlvbiB0byBhIHJlbWVtYmVyZWQgYWNjZXNzIHBvaW50IHRoYXQgaXMKQEAgLTUxMyw3ICs1MjUsOCBAQAogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIGRpc2Nvbm5lY3QoKSB7CiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZXR1cm4gbVNlcnZpY2UuZGlzY29ubmVjdCgpOworICAgICAgICAgICAgbVNlcnZpY2UuZGlzY29ubmVjdCgpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KQEAgLTUyNyw3ICs1NDAsOCBAQAogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIHJlY29ubmVjdCgpIHsKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJldHVybiBtU2VydmljZS5yZWNvbm5lY3QoKTsKKyAgICAgICAgICAgIG1TZXJ2aWNlLnJlY29ubmVjdCgpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KQEAgLTU0MSw3ICs1NTUsOCBAQAogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIHJlYXNzb2NpYXRlKCkgewogICAgICAgICB0cnkgewotICAgICAgICAgICAgcmV0dXJuIG1TZXJ2aWNlLnJlYXNzb2NpYXRlKCk7CisgICAgICAgICAgICBtU2VydmljZS5yZWFzc29jaWF0ZSgpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KQEAgLTU3MCw3ICs1ODUsOCBAQAogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIHN0YXJ0U2NhbigpIHsKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJldHVybiBtU2VydmljZS5zdGFydFNjYW4oZmFsc2UpOworICAgICAgICAgICAgbVNlcnZpY2Uuc3RhcnRTY2FuKGZhbHNlKTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgewogICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9CkBAIC01ODgsNyArNjA0LDggQEAKICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiBzdGFydFNjYW5BY3RpdmUoKSB7CiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZXR1cm4gbVNlcnZpY2Uuc3RhcnRTY2FuKHRydWUpOworICAgICAgICAgICAgbVNlcnZpY2Uuc3RhcnRTY2FuKHRydWUpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KQEAgLTc1NCw4ICs3NzEsOSBAQAogICAgICAgICB9IGVsc2UgaWYgKHJzc2kgPj0gTUFYX1JTU0kpIHsKICAgICAgICAgICAgIHJldHVybiBudW1MZXZlbHMgLSAxOwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaW50IHBhcnRpdGlvblNpemUgPSAoTUFYX1JTU0kgLSBNSU5fUlNTSSkgLyAobnVtTGV2ZWxzIC0gMSk7Ci0gICAgICAgICAgICByZXR1cm4gKHJzc2kgLSBNSU5fUlNTSSkgLyBwYXJ0aXRpb25TaXplOworICAgICAgICAgICAgZmxvYXQgaW5wdXRSYW5nZSA9IChNQVhfUlNTSSAtIE1JTl9SU1NJKTsKKyAgICAgICAgICAgIGZsb2F0IG91dHB1dFJhbmdlID0gKG51bUxldmVscyAtIDEpOworICAgICAgICAgICAgcmV0dXJuIChpbnQpKChmbG9hdCkocnNzaSAtIE1JTl9SU1NJKSAqIG91dHB1dFJhbmdlIC8gaW5wdXRSYW5nZSk7CiAgICAgICAgIH0KICAgICB9CiAgICAgCkBAIC04NDksNiArODY3LDE2NiBAQAogICAgICAgICB9CiAgICAgfQogCisgICAvKioKKyAgICAgKiBTdGFydCB0aGUgZHJpdmVyIGFuZCBjb25uZWN0IHRvIG5ldHdvcmsuCisgICAgICoKKyAgICAgKiBUaGlzIGZ1bmN0aW9uIHdpbGwgb3Zlci1yaWRlIFdpZmlMb2NrIGFuZCBkZXZpY2UgaWRsZSBzdGF0dXMuIEZvciBleGFtcGxlLAorICAgICAqIGV2ZW4gaWYgdGhlIGRldmljZSBpcyBpZGxlIG9yIHRoZXJlIGlzIG9ubHkgYSBzY2FuLW9ubHkgbG9jayBoZWxkLAorICAgICAqIGEgc3RhcnQgd2lmaSB3b3VsZCBtZWFuIHRoYXQgd2lmaSBjb25uZWN0aW9uIGlzIGtlcHQgYWN0aXZlIHVudGlsCisgICAgICogYSBzdG9wV2lmaSgpIGlzIHNlbnQuCisgICAgICoKKyAgICAgKiBUaGlzIEFQSSBpcyB1c2VkIGJ5IFdpZmlTdGF0ZVRyYWNrZXIKKyAgICAgKgorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoZSBvcGVyYXRpb24gc3VjY2VlZHMgZWxzZSB7QGNvZGUgZmFsc2V9CisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBzdGFydFdpZmkoKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBtU2VydmljZS5zdGFydFdpZmkoKTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogRGlzY29ubmVjdCBmcm9tIGEgbmV0d29yayAoaWYgYW55KSBhbmQgc3RvcCB0aGUgZHJpdmVyLgorICAgICAqCisgICAgICogVGhpcyBmdW5jdGlvbiB3aWxsIG92ZXItcmlkZSBXaWZpTG9jayBhbmQgZGV2aWNlIGlkbGUgc3RhdHVzLiBXaS1GaQorICAgICAqIHN0YXlzIGluYWN0aXZlIHVudGlsIGEgc3RhcnRXaWZpKCkgaXMgaXNzdWVkLgorICAgICAqCisgICAgICogVGhpcyBBUEkgaXMgdXNlZCBieSBXaWZpU3RhdGVUcmFja2VyCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGUgb3BlcmF0aW9uIHN1Y2NlZWRzIGVsc2Uge0Bjb2RlIGZhbHNlfQorICAgICAqIEBoaWRlCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gc3RvcFdpZmkoKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBtU2VydmljZS5zdG9wV2lmaSgpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGQgYSBic3NpZCB0byB0aGUgc3VwcGxpY2FudCBibGFja2xpc3QKKyAgICAgKgorICAgICAqIFRoaXMgQVBJIGlzIHVzZWQgYnkgV2lmaVdhdGNoZG9nU2VydmljZQorICAgICAqCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhlIG9wZXJhdGlvbiBzdWNjZWVkcyBlbHNlIHtAY29kZSBmYWxzZX0KKyAgICAgKiBAaGlkZQorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGFkZFRvQmxhY2tsaXN0KFN0cmluZyBic3NpZCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgbVNlcnZpY2UuYWRkVG9CbGFja2xpc3QoYnNzaWQpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDbGVhciB0aGUgc3VwcGxpY2FudCBibGFja2xpc3QKKyAgICAgKgorICAgICAqIFRoaXMgQVBJIGlzIHVzZWQgYnkgV2lmaVdhdGNoZG9nU2VydmljZQorICAgICAqCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhlIG9wZXJhdGlvbiBzdWNjZWVkcyBlbHNlIHtAY29kZSBmYWxzZX0KKyAgICAgKiBAaGlkZQorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGNsZWFyQmxhY2tsaXN0KCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgbVNlcnZpY2UuY2xlYXJCbGFja2xpc3QoKTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorCisgICAgLyogVE9ETzogZGVwcmVjYXRlIHN5bmNocm9ub3VzIEFQSSBhbmQgb3BlbiB1cCB0aGUgZm9sbG93aW5nIEFQSSAqLworICAgIC8qKgorICAgICAqIENvbm5lY3QgdG8gYSBuZXR3b3JrIHdpdGggdGhlIGdpdmVuIGNvbmZpZ3VyYXRpb24uIFRoZSBuZXR3b3JrIGFsc28KKyAgICAgKiBnZXRzIGFkZGVkIHRvIHRoZSBzdXBwbGljYW50IGNvbmZpZ3VyYXRpb24uCisgICAgICoKKyAgICAgKiBGb3IgYSBuZXcgbmV0d29yaywgdGhpcyBmdW5jdGlvbiBpcyB1c2VkIGluc3RlYWQgb2YgYQorICAgICAqIHNlcXVlbmNlIG9mIGFkZE5ldHdvcmsoKSwgZW5hYmxlTmV0d29yaygpLCBzYXZlQ29uZmlndXJhdGlvbigpIGFuZAorICAgICAqIHJlY29ubmVjdCgpCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29uZmlnIHRoZSBzZXQgb2YgdmFyaWFibGVzIHRoYXQgZGVzY3JpYmUgdGhlIGNvbmZpZ3VyYXRpb24sCisgICAgICogICAgICAgICAgICBjb250YWluZWQgaW4gYSB7QGxpbmsgV2lmaUNvbmZpZ3VyYXRpb259IG9iamVjdC4KKyAgICAgKiBAaGlkZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGNvbm5lY3ROZXR3b3JrKFdpZmlDb25maWd1cmF0aW9uIGNvbmZpZykgeworICAgICAgICBpZiAoY29uZmlnID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICB0cnkgeworICAgICAgICAgICAgbVNlcnZpY2UuY29ubmVjdE5ldHdvcmtXaXRoQ29uZmlnKGNvbmZpZyk7CisgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7IH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25uZWN0IHRvIGEgbmV0d29yayB3aXRoIHRoZSBnaXZlbiBuZXR3b3JrSWQuCisgICAgICoKKyAgICAgKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgaW5zdGVhZCBvZiBhIGVuYWJsZU5ldHdvcmsoKSwgc2F2ZUNvbmZpZ3VyYXRpb24oKSBhbmQKKyAgICAgKiByZWNvbm5lY3QoKQorICAgICAqCisgICAgICogQHBhcmFtIG5ldHdvcmtJZCB0aGUgbmV0d29yayBpZCBpZGVudGlmaXlpbmcgdGhlIG5ldHdvcmsgaW4gdGhlCisgICAgICogICAgICAgICAgICAgICAgc3VwcGxpY2FudCBjb25maWd1cmF0aW9uIGxpc3QKKyAgICAgKiBAaGlkZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGNvbm5lY3ROZXR3b3JrKGludCBuZXR3b3JrSWQpIHsKKyAgICAgICAgaWYgKG5ldHdvcmtJZCA8IDApIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICB0cnkgeworICAgICAgICAgICAgbVNlcnZpY2UuY29ubmVjdE5ldHdvcmtXaXRoSWQobmV0d29ya0lkKTsKKyAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFNhdmUgdGhlIGdpdmVuIG5ldHdvcmsgaW4gdGhlIHN1cHBsaWNhbnQgY29uZmlnLiBJZiB0aGUgbmV0d29yayBhbHJlYWR5CisgICAgICogZXhpc3RzLCB0aGUgY29uZmlndXJhdGlvbiBpcyB1cGRhdGVkLiBBIG5ldyBuZXR3b3JrIGlzIGVuYWJsZWQKKyAgICAgKiBieSBkZWZhdWx0LgorICAgICAqCisgICAgICogRm9yIGEgbmV3IG5ldHdvcmssIHRoaXMgZnVuY3Rpb24gaXMgdXNlZCBpbnN0ZWFkIG9mIGEKKyAgICAgKiBzZXF1ZW5jZSBvZiBhZGROZXR3b3JrKCksIGVuYWJsZU5ldHdvcmsoKSBhbmQgc2F2ZUNvbmZpZ3VyYXRpb24oKS4KKyAgICAgKgorICAgICAqIEZvciBhbiBleGlzdGluZyBuZXR3b3JrLCBpdCBhY2NvbXBsaXNoZXMgdGhlIHRhc2sgb2YgdXBkYXRlTmV0d29yaygpCisgICAgICogYW5kIHNhdmVDb25maWd1cmF0aW9uKCkKKyAgICAgKgorICAgICAqIEBwYXJhbSBjb25maWcgdGhlIHNldCBvZiB2YXJpYWJsZXMgdGhhdCBkZXNjcmliZSB0aGUgY29uZmlndXJhdGlvbiwKKyAgICAgKiAgICAgICAgICAgIGNvbnRhaW5lZCBpbiBhIHtAbGluayBXaWZpQ29uZmlndXJhdGlvbn0gb2JqZWN0LgorICAgICAqIEBoaWRlCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2F2ZU5ldHdvcmsoV2lmaUNvbmZpZ3VyYXRpb24gY29uZmlnKSB7CisgICAgICAgIGlmIChjb25maWcgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBtU2VydmljZS5zYXZlTmV0d29yayhjb25maWcpOworICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeyB9CisgICAgfQorCisgICAgLyoqCisgICAgICogRGVsZXRlIHRoZSBuZXR3b3JrIGluIHRoZSBzdXBwbGljYW50IGNvbmZpZy4KKyAgICAgKgorICAgICAqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCBpbnN0ZWFkIG9mIGEgc2VxdWVuY2Ugb2YgcmVtb3ZlTmV0d29yaygpCisgICAgICogYW5kIHNhdmVDb25maWd1cmF0aW9uKCkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29uZmlnIHRoZSBzZXQgb2YgdmFyaWFibGVzIHRoYXQgZGVzY3JpYmUgdGhlIGNvbmZpZ3VyYXRpb24sCisgICAgICogICAgICAgICAgICBjb250YWluZWQgaW4gYSB7QGxpbmsgV2lmaUNvbmZpZ3VyYXRpb259IG9iamVjdC4KKyAgICAgKiBAaGlkZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGZvcmdldE5ldHdvcmsoaW50IG5ldElkKSB7CisgICAgICAgIGlmIChuZXRJZCA8IDApIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICB0cnkgeworICAgICAgICAgICAgbVNlcnZpY2UuZm9yZ2V0TmV0d29yayhuZXRJZCk7CisgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7IH0KKyAgICB9CisKICAgICAvKioKICAgICAgKiBBbGxvd3MgYW4gYXBwbGljYXRpb24gdG8ga2VlcCB0aGUgV2ktRmkgcmFkaW8gYXdha2UuCiAgICAgICogTm9ybWFsbHkgdGhlIFdpLUZpIHJhZGlvIG1heSB0dXJuIG9mZiB3aGVuIHRoZSB1c2VyIGhhcyBub3QgdXNlZCB0aGUgZGV2aWNlIGluIGEgd2hpbGUuCkBAIC0xMDMxLDkgKzEyMDksOCBAQAogICAgIC8qKgogICAgICAqIENyZWF0ZXMgYSBuZXcgV2lmaUxvY2suCiAgICAgICoKLSAgICAgKiBAcGFyYW0gbG9ja1R5cGUgdGhlIHR5cGUgb2YgbG9jayB0byBjcmVhdGUuIFNlZSB7QGxpbmsgI1dJRklfTU9ERV9GVUxMfSwKLSAgICAgKiBhbmQge0BsaW5rICNXSUZJX01PREVfU0NBTl9PTkxZfSBmb3IgZGVzY3JpcHRpb25zIG9mIHRoZSB0eXBlcyBvZiBXaS1GaSBsb2Nrcy4KLSAgICAgKgorICAgICAqIEBwYXJhbSBsb2NrVHlwZSB0aGUgdHlwZSBvZiBsb2NrIHRvIGNyZWF0ZS4gU2VlIHtAbGluayAjV0lGSV9NT0RFX0ZVTEx9IGFuZAorICAgICAqIHtAbGluayAjV0lGSV9NT0RFX1NDQU5fT05MWX0gZm9yIGRlc2NyaXB0aW9ucyBvZiB0aGUgdHlwZXMgb2YgV2ktRmkgbG9ja3MuCiAgICAgICogQHBhcmFtIHRhZyBhIHRhZyBmb3IgdGhlIFdpZmlMb2NrIHRvIGlkZW50aWZ5IGl0IGluIGRlYnVnZ2luZyBtZXNzYWdlcy4gIFRoaXMgc3RyaW5nIGlzIAogICAgICAqICAgICAgICAgICAgbmV2ZXIgc2hvd24gdG8gdGhlIHVzZXIgdW5kZXIgbm9ybWFsIGNvbmRpdGlvbnMsIGJ1dCBzaG91bGQgYmUgZGVzY3JpcHRpdmUgCiAgICAgICogICAgICAgICAgICBlbm91Z2ggdG8gaWRlbnRpZnkgeW91ciBhcHBsaWNhdGlvbiBhbmQgdGhlIHNwZWNpZmljIFdpZmlMb2NrIHdpdGhpbiBpdCwgaWYgaXQKZGlmZiAtLWdpdCBhL3dpZmkvamF2YS9hbmRyb2lkL25ldC93aWZpL1dpZmlNb25pdG9yLmphdmEgYi93aWZpL2phdmEvYW5kcm9pZC9uZXQvd2lmaS9XaWZpTW9uaXRvci5qYXZhCmluZGV4IDI2NmQ4MDEuLmFmMzEzMmYgMTAwNjQ0Ci0tLSBhL3dpZmkvamF2YS9hbmRyb2lkL25ldC93aWZpL1dpZmlNb25pdG9yLmphdmEKKysrIGIvd2lmaS9qYXZhL2FuZHJvaWQvbmV0L3dpZmkvV2lmaU1vbml0b3IuamF2YQpAQCAtMTksMTQgKzE5LDEzIEBACiBpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKIGltcG9ydCBhbmRyb2lkLnV0aWwuQ29uZmlnOwogaW1wb3J0IGFuZHJvaWQubmV0Lk5ldHdvcmtJbmZvOwotaW1wb3J0IGFuZHJvaWQubmV0Lk5ldHdvcmtTdGF0ZVRyYWNrZXI7CiAKIGltcG9ydCBqYXZhLnV0aWwucmVnZXguUGF0dGVybjsKIGltcG9ydCBqYXZhLnV0aWwucmVnZXguTWF0Y2hlcjsKIAogLyoqCiAgKiBMaXN0ZW5zIGZvciBldmVudHMgZnJvbSB0aGUgd3BhX3N1cHBsaWNhbnQgc2VydmVyLCBhbmQgcGFzc2VzIHRoZW0gb24KLSAqIHRvIHRoZSB7QGxpbmsgV2lmaVN0YXRlVHJhY2tlcn0gZm9yIGhhbmRsaW5nLiBSdW5zIGluIGl0cyBvd24gdGhyZWFkLgorICogdG8gdGhlIHtAbGluayBXaWZpU3RhdGVNYWNoaW5lfSBmb3IgaGFuZGxpbmcuIFJ1bnMgaW4gaXRzIG93biB0aHJlYWQuCiAgKgogICogQGhpZGUKICAqLwpAQCAtMTE3LDcgKzExNiw3IEBACiAgICAgcHJpdmF0ZSBzdGF0aWMgUGF0dGVybiBtQ29ubmVjdGVkRXZlbnRQYXR0ZXJuID0KICAgICAgICAgUGF0dGVybi5jb21waWxlKCIoKD86WzAtOWEtZl17Mn06KXs1fVswLTlhLWZdezJ9KSAuKiBcXFtpZD0oWzAtOV0rKSAiKTsKIAotICAgIHByaXZhdGUgZmluYWwgV2lmaVN0YXRlVHJhY2tlciBtV2lmaVN0YXRlVHJhY2tlcjsKKyAgICBwcml2YXRlIGZpbmFsIFdpZmlTdGF0ZU1hY2hpbmUgbVdpZmlTdGF0ZU1hY2hpbmU7CiAKICAgICAvKioKICAgICAgKiBUaGlzIGluZGljYXRlcyB0aGUgc3VwcGxpY2FudCBjb25uZWN0aW9uIGZvciB0aGUgbW9uaXRvciBpcyBjbG9zZWQKQEAgLTEzOSwzMSArMTM4LDI3IEBACiAgICAgICovCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1BWF9SRUNWX0VSUk9SUyAgICA9IDEwOwogCi0gICAgcHVibGljIFdpZmlNb25pdG9yKFdpZmlTdGF0ZVRyYWNrZXIgdHJhY2tlcikgewotICAgICAgICBtV2lmaVN0YXRlVHJhY2tlciA9IHRyYWNrZXI7CisgICAgcHVibGljIFdpZmlNb25pdG9yKFdpZmlTdGF0ZU1hY2hpbmUgd2lmaVN0YXRlTWFjaGluZSkgeworICAgICAgICBtV2lmaVN0YXRlTWFjaGluZSA9IHdpZmlTdGF0ZU1hY2hpbmU7CiAgICAgfQogCiAgICAgcHVibGljIHZvaWQgc3RhcnRNb25pdG9yaW5nKCkgewogICAgICAgICBuZXcgTW9uaXRvclRocmVhZCgpLnN0YXJ0KCk7CiAgICAgfQogCi0gICAgcHVibGljIE5ldHdvcmtTdGF0ZVRyYWNrZXIgZ2V0TmV0d29ya1N0YXRlVHJhY2tlcigpIHsKLSAgICAgICAgcmV0dXJuIG1XaWZpU3RhdGVUcmFja2VyOwotICAgIH0KLQogICAgIGNsYXNzIE1vbml0b3JUaHJlYWQgZXh0ZW5kcyBUaHJlYWQgewogICAgICAgICBwdWJsaWMgTW9uaXRvclRocmVhZCgpIHsKICAgICAgICAgICAgIHN1cGVyKCJXaWZpTW9uaXRvciIpOwogICAgICAgICB9Ci0gICAgICAgIAorCiAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKIAogICAgICAgICAgICAgaWYgKGNvbm5lY3RUb1N1cHBsaWNhbnQoKSkgewogICAgICAgICAgICAgICAgIC8vIFNlbmQgYSBtZXNzYWdlIGluZGljYXRpbmcgdGhhdCBpdCBpcyBub3cgcG9zc2libGUgdG8gc2VuZCBjb21tYW5kcwogICAgICAgICAgICAgICAgIC8vIHRvIHRoZSBzdXBwbGljYW50Ci0gICAgICAgICAgICAgICAgbVdpZmlTdGF0ZVRyYWNrZXIubm90aWZ5U3VwcGxpY2FudENvbm5lY3Rpb24oKTsKKyAgICAgICAgICAgICAgICBtV2lmaVN0YXRlTWFjaGluZS5ub3RpZnlTdXBwbGljYW50Q29ubmVjdGlvbigpOwogICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBtV2lmaVN0YXRlVHJhY2tlci5ub3RpZnlTdXBwbGljYW50TG9zdCgpOworICAgICAgICAgICAgICAgIG1XaWZpU3RhdGVNYWNoaW5lLm5vdGlmeVN1cHBsaWNhbnRMb3N0KCk7CiAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgfQogCkBAIC0yNTksNyArMjU0LDcgQEAKICAgICAgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgICAgIC8vIG5vdGlmeSBhbmQgZXhpdAotICAgICAgICAgICAgICAgICAgICBtV2lmaVN0YXRlVHJhY2tlci5ub3RpZnlTdXBwbGljYW50TG9zdCgpOworICAgICAgICAgICAgICAgICAgICBtV2lmaVN0YXRlTWFjaGluZS5ub3RpZnlTdXBwbGljYW50TG9zdCgpOwogICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICBoYW5kbGVFdmVudChldmVudCwgZXZlbnREYXRhKTsKQEAgLTI3Miw3ICsyNjcsNyBAQAogICAgICAgICAgICAgaW50IGNvbm5lY3RUcmllcyA9IDA7CiAKICAgICAgICAgICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgICAgICAgICAgICAgaWYgKG1XaWZpU3RhdGVUcmFja2VyLmNvbm5lY3RUb1N1cHBsaWNhbnQoKSkgeworICAgICAgICAgICAgICAgIGlmIChXaWZpTmF0aXZlLmNvbm5lY3RUb1N1cHBsaWNhbnQoKSkgewogICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgaWYgKGNvbm5lY3RUcmllcysrIDwgMykgewpAQCAtMjg1LDcgKzI4MCw3IEBACiAgICAgICAgIH0KIAogICAgICAgICBwcml2YXRlIHZvaWQgaGFuZGxlUGFzc3dvcmRLZXlNYXlCZUluY29ycmVjdCgpIHsKLSAgICAgICAgICAgIG1XaWZpU3RhdGVUcmFja2VyLm5vdGlmeVBhc3N3b3JkS2V5TWF5QmVJbmNvcnJlY3QoKTsKKyAgICAgICAgICAgIG1XaWZpU3RhdGVNYWNoaW5lLm5vdGlmeVBhc3N3b3JkS2V5TWF5QmVJbmNvcnJlY3QoKTsKICAgICAgICAgfQogCiAgICAgICAgIHByaXZhdGUgdm9pZCBoYW5kbGVEcml2ZXJFdmVudChTdHJpbmcgc3RhdGUpIHsKQEAgLTI5MywxMSArMjg4LDExIEBACiAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKHN0YXRlLmVxdWFscygiU1RPUFBFRCIpKSB7Ci0gICAgICAgICAgICAgICAgbVdpZmlTdGF0ZVRyYWNrZXIubm90aWZ5RHJpdmVyU3RvcHBlZCgpOworICAgICAgICAgICAgICAgIG1XaWZpU3RhdGVNYWNoaW5lLm5vdGlmeURyaXZlclN0b3BwZWQoKTsKICAgICAgICAgICAgIH0gZWxzZSBpZiAoc3RhdGUuZXF1YWxzKCJTVEFSVEVEIikpIHsKLSAgICAgICAgICAgICAgICBtV2lmaVN0YXRlVHJhY2tlci5ub3RpZnlEcml2ZXJTdGFydGVkKCk7CisgICAgICAgICAgICAgICAgbVdpZmlTdGF0ZU1hY2hpbmUubm90aWZ5RHJpdmVyU3RhcnRlZCgpOwogICAgICAgICAgICAgfSBlbHNlIGlmIChzdGF0ZS5lcXVhbHMoIkhBTkdFRCIpKSB7Ci0gICAgICAgICAgICAgICAgbVdpZmlTdGF0ZVRyYWNrZXIubm90aWZ5RHJpdmVySHVuZygpOworICAgICAgICAgICAgICAgIG1XaWZpU3RhdGVNYWNoaW5lLm5vdGlmeURyaXZlckh1bmcoKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCkBAIC0zMTgsNyArMzEzLDcgQEAKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAKICAgICAgICAgICAgICAgICBjYXNlIFNDQU5fUkVTVUxUUzoKLSAgICAgICAgICAgICAgICAgICAgbVdpZmlTdGF0ZVRyYWNrZXIubm90aWZ5U2NhblJlc3VsdHNBdmFpbGFibGUoKTsKKyAgICAgICAgICAgICAgICAgICAgbVdpZmlTdGF0ZU1hY2hpbmUubm90aWZ5U2NhblJlc3VsdHNBdmFpbGFibGUoKTsKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAKICAgICAgICAgICAgICAgICBjYXNlIFVOS05PV046CkBAIC0zNzUsNyArMzcwLDcgQEAKICAgICAgICAgICAgIGlmIChuZXdTdXBwbGljYW50U3RhdGUgPT0gU3VwcGxpY2FudFN0YXRlLklOVkFMSUQpIHsKICAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJJbnZhbGlkIHN1cHBsaWNhbnQgc3RhdGU6ICIgKyBuZXdTdGF0ZSk7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBtV2lmaVN0YXRlVHJhY2tlci5ub3RpZnlTdGF0ZUNoYW5nZShuZXR3b3JrSWQsIEJTU0lELCBuZXdTdXBwbGljYW50U3RhdGUpOworICAgICAgICAgICAgbVdpZmlTdGF0ZU1hY2hpbmUubm90aWZ5U3VwcGxpY2FudFN0YXRlQ2hhbmdlKG5ldHdvcmtJZCwgQlNTSUQsIG5ld1N1cHBsaWNhbnRTdGF0ZSk7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTM5NSw3ICszOTAsNyBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgfQotICAgICAgICBtV2lmaVN0YXRlVHJhY2tlci5ub3RpZnlTdGF0ZUNoYW5nZShuZXdTdGF0ZSwgQlNTSUQsIG5ldHdvcmtJZCk7CisgICAgICAgIG1XaWZpU3RhdGVNYWNoaW5lLm5vdGlmeU5ldHdvcmtTdGF0ZUNoYW5nZShuZXdTdGF0ZSwgQlNTSUQsIG5ldHdvcmtJZCk7CiAgICAgfQogCiAgICAgLyoqCmRpZmYgLS1naXQgYS93aWZpL2phdmEvYW5kcm9pZC9uZXQvd2lmaS9XaWZpTmF0aXZlLmphdmEgYi93aWZpL2phdmEvYW5kcm9pZC9uZXQvd2lmaS9XaWZpTmF0aXZlLmphdmEKaW5kZXggMjVmMDVjMC4uODYyYTYxYiAxMDA2NDQKLS0tIGEvd2lmaS9qYXZhL2FuZHJvaWQvbmV0L3dpZmkvV2lmaU5hdGl2ZS5qYXZhCisrKyBiL3dpZmkvamF2YS9hbmRyb2lkL25ldC93aWZpL1dpZmlOYXRpdmUuamF2YQpAQCAtNDEsNiArNDEsOCBAQAogICAgIHB1YmxpYyBuYXRpdmUgc3RhdGljIFN0cmluZyBnZXRFcnJvclN0cmluZyhpbnQgZXJyb3JDb2RlKTsKIAogICAgIHB1YmxpYyBuYXRpdmUgc3RhdGljIGJvb2xlYW4gbG9hZERyaXZlcigpOworCisgICAgcHVibGljIG5hdGl2ZSBzdGF0aWMgYm9vbGVhbiBpc0RyaXZlckxvYWRlZCgpOwogICAgIAogICAgIHB1YmxpYyBuYXRpdmUgc3RhdGljIGJvb2xlYW4gdW5sb2FkRHJpdmVyKCk7CiAKQEAgLTEwOSw2ICsxMTEsMTAgQEAKIAogICAgIHB1YmxpYyBuYXRpdmUgc3RhdGljIGJvb2xlYW4gc2V0UG93ZXJNb2RlQ29tbWFuZChpbnQgbW9kZSk7CiAKKyAgICBwdWJsaWMgbmF0aXZlIHN0YXRpYyBpbnQgZ2V0QmFuZENvbW1hbmQoKTsKKworICAgIHB1YmxpYyBuYXRpdmUgc3RhdGljIGJvb2xlYW4gc2V0QmFuZENvbW1hbmQoaW50IGJhbmQpOworCiAgICAgcHVibGljIG5hdGl2ZSBzdGF0aWMgaW50IGdldFBvd2VyTW9kZUNvbW1hbmQoKTsKIAogICAgIHB1YmxpYyBuYXRpdmUgc3RhdGljIGJvb2xlYW4gc2V0TnVtQWxsb3dlZENoYW5uZWxzQ29tbWFuZChpbnQgbnVtQ2hhbm5lbHMpOwpAQCAtMTQ5LDggKzE1NSw2IEBACiAKICAgICBwdWJsaWMgbmF0aXZlIHN0YXRpYyBTdHJpbmcgZ2V0RGhjcEVycm9yKCk7CiAKLSAgICBwdWJsaWMgbmF0aXZlIHN0YXRpYyBib29sZWFuIHNldFN1c3BlbmRPcHRpbWl6YXRpb25zQ29tbWFuZChib29sZWFuIGVuYWJsZWQpOwotCiAgICAgLyoqCiAgICAgICogV2FpdCBmb3IgdGhlIHN1cHBsaWNhbnQgdG8gc2VuZCBhbiBldmVudCwgcmV0dXJuaW5nIHRoZSBldmVudCBzdHJpbmcuCiAgICAgICogQHJldHVybiB0aGUgZXZlbnQgc3RyaW5nIHNlbnQgYnkgdGhlIHN1cHBsaWNhbnQuCmRpZmYgLS1naXQgYS93aWZpL2phdmEvYW5kcm9pZC9uZXQvd2lmaS9XaWZpU3RhdGVNYWNoaW5lLmphdmEgYi93aWZpL2phdmEvYW5kcm9pZC9uZXQvd2lmaS9XaWZpU3RhdGVNYWNoaW5lLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDc1Y2NhNAotLS0gL2Rldi9udWxsCisrKyBiL3dpZmkvamF2YS9hbmRyb2lkL25ldC93aWZpL1dpZmlTdGF0ZU1hY2hpbmUuamF2YQpAQCAtMCwwICsxLDMwNDggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQubmV0LndpZmk7CisKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5uZXQud2lmaS5XaWZpTWFuYWdlci5XSUZJX1NUQVRFX0RJU0FCTEVEOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLm5ldC53aWZpLldpZmlNYW5hZ2VyLldJRklfU1RBVEVfRElTQUJMSU5HOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLm5ldC53aWZpLldpZmlNYW5hZ2VyLldJRklfU1RBVEVfRU5BQkxFRDsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5uZXQud2lmaS5XaWZpTWFuYWdlci5XSUZJX1NUQVRFX0VOQUJMSU5HOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLm5ldC53aWZpLldpZmlNYW5hZ2VyLldJRklfU1RBVEVfVU5LTk9XTjsKKworLyoqCisgKiBUT0RPOiBBZGQgc29mdCBBUCBzdGF0ZXMgYXMgcGFydCBvZiBXSUZJX1NUQVRFX1hYWAorICogUmV0YWluIFdJRklfU1RBVEVfRU5BQkxJTkcgdGhhdCBpbmRpY2F0ZXMgZHJpdmVyIGlzIGxvYWRpbmcKKyAqIEFkZCBXSUZJX1NUQVRFX0FQX0VOQUJMRUQgdG8gaW5kaWNhdGUgc29mdCBBUCBoYXMgc3RhcnRlZAorICogYW5kIFdJRklfU1RBVEVfRkFJTEVEIGZvciBmYWlsdXJlCisgKiBEZXByZWNhdGUgV0lGSV9TVEFURV9VTktOT1dOCisgKgorICogRG9pbmcgdGhpcyB3aWxsIHNpbXBsaWZ5IHRoZSBsb2dpYyBmb3Igc2VuZGluZyBicm9hZGNhc3RzCisgKi8KK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5uZXQud2lmaS5XaWZpTWFuYWdlci5XSUZJX0FQX1NUQVRFX0RJU0FCTEVEOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLm5ldC53aWZpLldpZmlNYW5hZ2VyLldJRklfQVBfU1RBVEVfRElTQUJMSU5HOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLm5ldC53aWZpLldpZmlNYW5hZ2VyLldJRklfQVBfU1RBVEVfRU5BQkxFRDsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5uZXQud2lmaS5XaWZpTWFuYWdlci5XSUZJX0FQX1NUQVRFX0VOQUJMSU5HOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLm5ldC53aWZpLldpZmlNYW5hZ2VyLldJRklfQVBfU1RBVEVfRkFJTEVEOworCitpbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHlNYW5hZ2VyTmF0aXZlOworaW1wb3J0IGFuZHJvaWQubmV0Lk5ldHdvcmtJbmZvOworaW1wb3J0IGFuZHJvaWQubmV0LkRoY3BJbmZvOworaW1wb3J0IGFuZHJvaWQubmV0Lk5ldHdvcmtVdGlsczsKK2ltcG9ydCBhbmRyb2lkLm5ldC5Db25uZWN0aXZpdHlNYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQubmV0Lk5ldHdvcmtJbmZvLkRldGFpbGVkU3RhdGU7CitpbXBvcnQgYW5kcm9pZC5uZXQuTGlua1Byb3BlcnRpZXM7CitpbXBvcnQgYW5kcm9pZC5uZXQud2lmaS5XaWZpQ29uZmlndXJhdGlvbi5TdGF0dXM7CitpbXBvcnQgYW5kcm9pZC5vcy5CaW5kZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5NZXNzYWdlOworaW1wb3J0IGFuZHJvaWQub3MuUGFyY2VsYWJsZTsKK2ltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5JQmluZGVyOworaW1wb3J0IGFuZHJvaWQub3MuSU5ldHdvcmtNYW5hZ2VtZW50U2VydmljZTsKK2ltcG9ydCBhbmRyb2lkLm9zLlBvd2VyTWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLlN5c3RlbVByb3BlcnRpZXM7CitpbXBvcnQgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb247CitpbXBvcnQgYW5kcm9pZC5vcy5TZXJ2aWNlTWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLlByb2Nlc3M7CitpbXBvcnQgYW5kcm9pZC5wcm92aWRlci5TZXR0aW5nczsKK2ltcG9ydCBhbmRyb2lkLnRleHQuVGV4dFV0aWxzOworaW1wb3J0IGFuZHJvaWQudXRpbC5FdmVudExvZzsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworaW1wb3J0IGFuZHJvaWQudXRpbC5TbG9nOworaW1wb3J0IGFuZHJvaWQuYXBwLmJhY2t1cC5JQmFja3VwTWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkLmJsdWV0b290aC5CbHVldG9vdGhEZXZpY2U7CitpbXBvcnQgYW5kcm9pZC5ibHVldG9vdGguQmx1ZXRvb3RoSGVhZHNldDsKK2ltcG9ydCBhbmRyb2lkLmJsdWV0b290aC5CbHVldG9vdGhBMmRwOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZW50UmVzb2x2ZXI7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLkNvbnRlbnRPYnNlcnZlcjsKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC5hcHAuSUJhdHRlcnlTdGF0czsKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC51dGlsLkhpZXJhcmNoaWNhbFN0YXRlOworaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnV0aWwuSGllcmFyY2hpY2FsU3RhdGVNYWNoaW5lOworCitpbXBvcnQgamF2YS5uZXQuSW5ldEFkZHJlc3M7CitpbXBvcnQgamF2YS5uZXQuTmV0d29ya0ludGVyZmFjZTsKK2ltcG9ydCBqYXZhLm5ldC5Tb2NrZXRFeGNlcHRpb247CitpbXBvcnQgamF2YS5uZXQuVW5rbm93bkhvc3RFeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQml0U2V0OworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlua2VkSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5TZXQ7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuYXRvbWljLkF0b21pY0Jvb2xlYW47CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuYXRvbWljLkF0b21pY0ludGVnZXI7CitpbXBvcnQgamF2YS51dGlsLnJlZ2V4LlBhdHRlcm47CisKKy8qKgorICogVHJhY2sgdGhlIHN0YXRlIG9mIFdpZmkgY29ubmVjdGl2aXR5LiBBbGwgZXZlbnQgaGFuZGxpbmcgaXMgZG9uZSBoZXJlLAorICogYW5kIGFsbCBjaGFuZ2VzIGluIGNvbm5lY3Rpdml0eSBzdGF0ZSBhcmUgaW5pdGlhdGVkIGhlcmUuCisgKgorICogQGhpZGUKKyAqLworLy9UT0RPOiB3ZSBzdGlsbCBuZWVkIGZyZXF1ZW50IHNjYW5uaW5nIGZvciB0aGUgY2FzZSB3aGVuCisvLyB3ZSBpc3N1ZSBkaXNjb25uZWN0IGJ1dCBuZWVkIHNjYW4gcmVzdWx0cyBmb3Igb3BlbiBuZXR3b3JrIG5vdGlmaWNhdGlvbgorcHVibGljIGNsYXNzIFdpZmlTdGF0ZU1hY2hpbmUgZXh0ZW5kcyBIaWVyYXJjaGljYWxTdGF0ZU1hY2hpbmUgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJXaWZpU3RhdGVNYWNoaW5lIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkVUV09SS1RZUEUgPSAiV0lGSSI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBEQkcgPSBmYWxzZTsKKworICAgIC8qIFRPRE86IGZldGNoIGEgY29uZmlndXJhYmxlIGludGVyZmFjZSAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTT0ZUQVBfSUZBQ0UgPSAid2wwLjEiOworCisgICAgcHJpdmF0ZSBXaWZpTW9uaXRvciBtV2lmaU1vbml0b3I7CisgICAgcHJpdmF0ZSBJTmV0d29ya01hbmFnZW1lbnRTZXJ2aWNlIG53U2VydmljZTsKKyAgICBwcml2YXRlIENvbm5lY3Rpdml0eU1hbmFnZXIgbUNtOworCisgICAgLyogU2NhbiByZXN1bHRzIGhhbmRsaW5nICovCisgICAgcHJpdmF0ZSBMaXN0PFNjYW5SZXN1bHQ+IG1TY2FuUmVzdWx0czsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBQYXR0ZXJuIHNjYW5SZXN1bHRQYXR0ZXJuID0gUGF0dGVybi5jb21waWxlKCJcdCsiKTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU0NBTl9SRVNVTFRfQ0FDSEVfU0laRSA9IDgwOworICAgIHByaXZhdGUgZmluYWwgTGlua2VkSGFzaE1hcDxTdHJpbmcsIFNjYW5SZXN1bHQ+IG1TY2FuUmVzdWx0Q2FjaGU7CisKKyAgICBwcml2YXRlIFN0cmluZyBtSW50ZXJmYWNlTmFtZTsKKworICAgIHByaXZhdGUgaW50IG1OdW1BbGxvd2VkQ2hhbm5lbHMgPSAwOworICAgIHByaXZhdGUgaW50IG1MYXN0U2lnbmFsTGV2ZWwgPSAtMTsKKyAgICBwcml2YXRlIFN0cmluZyBtTGFzdEJzc2lkOworICAgIHByaXZhdGUgaW50IG1MYXN0TmV0d29ya0lkOworICAgIHByaXZhdGUgYm9vbGVhbiBtRW5hYmxlUnNzaVBvbGxpbmcgPSBmYWxzZTsKKyAgICBwcml2YXRlIGJvb2xlYW4gbVBhc3N3b3JkS2V5TWF5QmVJbmNvcnJlY3QgPSBmYWxzZTsKKyAgICBwcml2YXRlIGludCBtUmVjb25uZWN0Q291bnQgPSAwOworICAgIHByaXZhdGUgYm9vbGVhbiBtSXNTY2FuTW9kZSA9IGZhbHNlOworCisgICAgLyoqCisgICAgICogSW5zdGFuY2Ugb2YgdGhlIGJsdWV0b290aCBoZWFkc2V0IGhlbHBlci4gVGhpcyBuZWVkcyB0byBiZSBjcmVhdGVkCisgICAgICogZWFybHkgYmVjYXVzZSB0aGVyZSBpcyBhIGRlbGF5IGJlZm9yZSBpdCBhY3R1YWxseSAnY29ubmVjdHMnLCBhcworICAgICAqIG5vdGVkIGJ5IGl0cyBqYXZhZG9jLiBJZiB3ZSBjaGVjayBiZWZvcmUgaXQgaXMgY29ubmVjdGVkLCBpdCB3aWxsIGJlCisgICAgICogaW4gYW4gZXJyb3Igc3RhdGUgYW5kIHdlIHdpbGwgbm90IGRpc2FibGUgY29leGlzdGVuY2UuCisgICAgICovCisgICAgcHJpdmF0ZSBCbHVldG9vdGhIZWFkc2V0IG1CbHVldG9vdGhIZWFkc2V0OworCisgICAgcHJpdmF0ZSBCbHVldG9vdGhBMmRwIG1CbHVldG9vdGhBMmRwOworCisgICAgcHJpdmF0ZSBMaW5rUHJvcGVydGllcyBtTGlua1Byb3BlcnRpZXM7CisKKyAgICAvLyBIZWxkIGR1cmluZyBkcml2ZXIgbG9hZCBhbmQgdW5sb2FkCisgICAgcHJpdmF0ZSBzdGF0aWMgUG93ZXJNYW5hZ2VyLldha2VMb2NrIHNXYWtlTG9jazsKKworICAgIHByaXZhdGUgQ29udGV4dCBtQ29udGV4dDsKKworICAgIHByaXZhdGUgRGhjcEluZm8gbURoY3BJbmZvOworICAgIHByaXZhdGUgV2lmaUluZm8gbVdpZmlJbmZvOworICAgIHByaXZhdGUgTmV0d29ya0luZm8gbU5ldHdvcmtJbmZvOworICAgIHByaXZhdGUgU3VwcGxpY2FudFN0YXRlVHJhY2tlciBtU3VwcGxpY2FudFN0YXRlVHJhY2tlcjsKKyAgICAvKiBDb25uZWN0aW9uIHRvIGEgc3BlY2lmaWMgbmV0d29yayBpbnZvbHZlcyBkaXNhYmxpbmcgYWxsIG5ldHdvcmtzLAorICAgICAqIHRoaXMgZmxhZyB0cmFja3MgaWYgbmV0d29ya3MgbmVlZCB0byBiZSByZS1lbmFibGVkICovCisgICAgcHJpdmF0ZSBib29sZWFuIG1FbmFibGVBbGxOZXR3b3JrcyA9IGZhbHNlOworCisKKyAgICAvLyBFdmVudCBsb2cgdGFncyAobXVzdCBiZSBpbiBzeW5jIHdpdGggZXZlbnQtbG9nLXRhZ3MpCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEVWRU5UTE9HX1dJRklfU1RBVEVfQ0hBTkdFRCAgICAgICAgPSA1MDAyMTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRVZFTlRMT0dfV0lGSV9FVkVOVF9IQU5ETEVEICAgICAgICA9IDUwMDIyOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBFVkVOVExPR19TVVBQTElDQU5UX1NUQVRFX0NIQU5HRUQgID0gNTAwMjM7CisKKyAgICAvKiBMb2FkIHRoZSBkcml2ZXIgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQ01EX0xPQURfRFJJVkVSICAgICAgICAgICAgICAgICAgICAgID0gMTsKKyAgICAvKiBVbmxvYWQgdGhlIGRyaXZlciAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDTURfVU5MT0FEX0RSSVZFUiAgICAgICAgICAgICAgICAgICAgPSAyOworICAgIC8qIEluZGljYXRlcyBkcml2ZXIgbG9hZCBzdWNjZWVkZWQgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQ01EX0xPQURfRFJJVkVSX1NVQ0NFU1MgICAgICAgICAgICAgID0gMzsKKyAgICAvKiBJbmRpY2F0ZXMgZHJpdmVyIGxvYWQgZmFpbGVkICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IENNRF9MT0FEX0RSSVZFUl9GQUlMVVJFICAgICAgICAgICAgICA9IDQ7CisgICAgLyogSW5kaWNhdGVzIGRyaXZlciB1bmxvYWQgc3VjY2VlZGVkICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IENNRF9VTkxPQURfRFJJVkVSX1NVQ0NFU1MgICAgICAgICAgICA9IDU7CisgICAgLyogSW5kaWNhdGVzIGRyaXZlciB1bmxvYWQgZmFpbGVkICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IENNRF9VTkxPQURfRFJJVkVSX0ZBSUxVUkUgICAgICAgICAgICA9IDY7CisKKyAgICAvKiBTdGFydCB0aGUgc3VwcGxpY2FudCAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDTURfU1RBUlRfU1VQUExJQ0FOVCAgICAgICAgICAgICAgICAgPSAxMTsKKyAgICAvKiBTdG9wIHRoZSBzdXBwbGljYW50ICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IENNRF9TVE9QX1NVUFBMSUNBTlQgICAgICAgICAgICAgICAgICA9IDEyOworICAgIC8qIFN0YXJ0IHRoZSBkcml2ZXIgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQ01EX1NUQVJUX0RSSVZFUiAgICAgICAgICAgICAgICAgICAgID0gMTM7CisgICAgLyogU3RhcnQgdGhlIGRyaXZlciAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDTURfU1RPUF9EUklWRVIgICAgICAgICAgICAgICAgICAgICAgPSAxNDsKKyAgICAvKiBJbmRpY2F0ZXMgREhDUCBzdWNjZWRlZCAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDTURfSVBfQ09ORklHX1NVQ0NFU1MgICAgICAgICAgICAgICAgPSAxNTsKKyAgICAvKiBJbmRpY2F0ZXMgREhDUCBmYWlsZWQgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQ01EX0lQX0NPTkZJR19GQUlMVVJFICAgICAgICAgICAgICAgID0gMTY7CisgICAgLyogUmUtY29uZmlndXJlIGludGVyZmFjZSAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDTURfUkVDT05GSUdVUkVfSVAgICAgICAgICAgICAgICAgICAgPSAxNzsKKworCisgICAgLyogU3RhcnQgdGhlIHNvZnQgYWNjZXNzIHBvaW50ICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IENNRF9TVEFSVF9BUCAgICAgICAgICAgICAgICAgICAgICAgICA9IDIxOworICAgIC8qIFN0b3AgdGhlIHNvZnQgYWNjZXNzIHBvaW50ICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IENNRF9TVE9QX0FQICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIyOworCisKKyAgICAvKiBTdXBwbGljYW50IGV2ZW50cyAqLworICAgIC8qIENvbm5lY3Rpb24gdG8gc3VwcGxpY2FudCBlc3RhYmxpc2hlZCAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTVVBfQ09OTkVDVElPTl9FVkVOVCAgICAgICAgICAgICAgICAgPSAzMTsKKyAgICAvKiBDb25uZWN0aW9uIHRvIHN1cHBsaWNhbnQgbG9zdCAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTVVBfRElTQ09OTkVDVElPTl9FVkVOVCAgICAgICAgICAgICAgPSAzMjsKKyAgICAvKiBEcml2ZXIgc3RhcnQgY29tcGxldGVkICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IERSSVZFUl9TVEFSVF9FVkVOVCAgICAgICAgICAgICAgICAgICA9IDMzOworICAgIC8qIERyaXZlciBzdG9wIGNvbXBsZXRlZCAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBEUklWRVJfU1RPUF9FVkVOVCAgICAgICAgICAgICAgICAgICAgPSAzNDsKKyAgICAvKiBOZXR3b3JrIGNvbm5lY3Rpb24gY29tcGxldGVkICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE5FVFdPUktfQ09OTkVDVElPTl9FVkVOVCAgICAgICAgICAgICA9IDM2OworICAgIC8qIE5ldHdvcmsgZGlzY29ubmVjdGlvbiBjb21wbGV0ZWQgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTkVUV09SS19ESVNDT05ORUNUSU9OX0VWRU5UICAgICAgICAgID0gMzc7CisgICAgLyogU2NhbiByZXN1bHRzIGFyZSBhdmFpbGFibGUgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU0NBTl9SRVNVTFRTX0VWRU5UICAgICAgICAgICAgICAgICAgID0gMzg7CisgICAgLyogU3VwcGxpY2F0ZSBzdGF0ZSBjaGFuZ2VkICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNVUFBMSUNBTlRfU1RBVEVfQ0hBTkdFX0VWRU5UICAgICAgICA9IDM5OworICAgIC8qIFBhc3N3b3JkIG1heSBiZSBpbmNvcnJlY3QgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUEFTU1dPUkRfTUFZX0JFX0lOQ09SUkVDVF9FVkVOVCAgICAgID0gNDA7CisKKyAgICAvKiBTdXBwbGljYW50IGNvbW1hbmRzICovCisgICAgLyogSXMgc3VwcGxpY2FudCBhbGl2ZSA/ICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IENNRF9QSU5HX1NVUFBMSUNBTlQgICAgICAgICAgICAgICAgICA9IDUxOworICAgIC8qIEFkZC91cGRhdGUgYSBuZXR3b3JrIGNvbmZpZ3VyYXRpb24gKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQ01EX0FERF9PUl9VUERBVEVfTkVUV09SSyAgICAgICAgICAgID0gNTI7CisgICAgLyogRGVsZXRlIGEgbmV0d29yayAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDTURfUkVNT1ZFX05FVFdPUksgICAgICAgICAgICAgICAgICAgPSA1MzsKKyAgICAvKiBFbmFibGUgYSBuZXR3b3JrLiBUaGUgZGV2aWNlIHdpbGwgYXR0ZW1wdCBhIGNvbm5lY3Rpb24gdG8gdGhlIGdpdmVuIG5ldHdvcmsuICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IENNRF9FTkFCTEVfTkVUV09SSyAgICAgICAgICAgICAgICAgICA9IDU0OworICAgIC8qIERpc2FibGUgYSBuZXR3b3JrLiBUaGUgZGV2aWNlIGRvZXMgbm90IGF0dGVtcHQgYSBjb25uZWN0aW9uIHRvIHRoZSBnaXZlbiBuZXR3b3JrLiAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDTURfRElTQUJMRV9ORVRXT1JLICAgICAgICAgICAgICAgICAgPSA1NTsKKyAgICAvKiBCbGFja2xpc3QgbmV0d29yay4gRGUtcHJpb3JpdGl6ZXMgdGhlIGdpdmVuIEJTU0lEIGZvciBjb25uZWN0aW9uLiAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDTURfQkxBQ0tMSVNUX05FVFdPUksgICAgICAgICAgICAgICAgPSA1NjsKKyAgICAvKiBDbGVhciB0aGUgYmxhY2tsaXN0IG5ldHdvcmsgbGlzdCAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDTURfQ0xFQVJfQkxBQ0tMSVNUICAgICAgICAgICAgICAgICAgPSA1NzsKKyAgICAvKiBTYXZlIGNvbmZpZ3VyYXRpb24gKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQ01EX1NBVkVfQ09ORklHICAgICAgICAgICAgICAgICAgICAgID0gNTg7CisKKyAgICAvKiBTdXBwbGljYW50IGNvbW1hbmRzIGFmdGVyIGRyaXZlciBzdGFydCovCisgICAgLyogSW5pdGlhdGUgYSBzY2FuICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IENNRF9TVEFSVF9TQ0FOICAgICAgICAgICAgICAgICAgICAgICA9IDcxOworICAgIC8qIFNldCBzY2FuIG1vZGUuIENPTk5FQ1RfTU9ERSBvciBTQ0FOX09OTFlfTU9ERSAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDTURfU0VUX1NDQU5fTU9ERSAgICAgICAgICAgICAgICAgICAgPSA3MjsKKyAgICAvKiBTZXQgc2NhbiB0eXBlLiBTQ0FOX0FDVElWRSBvciBTQ0FOX1BBU1NJVkUgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQ01EX1NFVF9TQ0FOX1RZUEUgICAgICAgICAgICAgICAgICAgID0gNzM7CisgICAgLyogRGlzY29ubmVjdCBmcm9tIGEgbmV0d29yayAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDTURfRElTQ09OTkVDVCAgICAgICAgICAgICAgICAgICAgICAgPSA3NDsKKyAgICAvKiBSZWNvbm5lY3QgdG8gYSBuZXR3b3JrICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IENNRF9SRUNPTk5FQ1QgICAgICAgICAgICAgICAgICAgICAgICA9IDc1OworICAgIC8qIFJlYXNzb2NpYXRlIHRvIGEgbmV0d29yayAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDTURfUkVBU1NPQ0lBVEUgICAgICAgICAgICAgICAgICAgICAgPSA3NjsKKyAgICAvKiBTZXQgcG93ZXIgbW9kZQorICAgICAqIFBPV0VSX01PREVfQUNUSVZFCisgICAgICogUE9XRVJfTU9ERV9BVVRPCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IENNRF9TRVRfUE9XRVJfTU9ERSAgICAgICAgICAgICAgICAgICA9IDc3OworICAgIC8qIFNldCBibHVldG9vdGggY28tZXhpc3RlbmNlCisgICAgICogQkxVRVRPT1RIX0NPRVhJU1RFTkNFX01PREVfRU5BQkxFRAorICAgICAqIEJMVUVUT09USF9DT0VYSVNURU5DRV9NT0RFX0RJU0FCTEVECisgICAgICogQkxVRVRPT1RIX0NPRVhJU1RFTkNFX01PREVfU0VOU0UKKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQ01EX1NFVF9CTFVFVE9PVEhfQ09FWElTVEVOQ0UgICAgICAgID0gNzg7CisgICAgLyogRW5hYmxlL2Rpc2FibGUgYmx1ZXRvb3RoIHNjYW4gbW9kZQorICAgICAqIHRydWUoMSkKKyAgICAgKiBmYWxzZSgwKQorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDTURfU0VUX0JMVUVUT09USF9TQ0FOX01PREUgICAgICAgICAgPSA3OTsKKyAgICAvKiBTZXQgbnVtYmVyIG9mIGFsbG93ZWQgY2hhbm5lbHMgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQ01EX1NFVF9OVU1fQUxMT1dFRF9DSEFOTkVMUyAgICAgICAgID0gODA7CisgICAgLyogUmVxdWVzdCBjb25uZWN0aXZpdHkgbWFuYWdlciB3YWtlIGxvY2sgYmVmb3JlIGRyaXZlciBzdG9wICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IENNRF9SRVFVRVNUX0NNX1dBS0VMT0NLICAgICAgICAgICAgICA9IDgxOworICAgIC8qIEVuYWJsZXMgUlNTSSBwb2xsICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IENNRF9FTkFCTEVfUlNTSV9QT0xMICAgICAgICAgICAgICAgICA9IDgyOworICAgIC8qIFJTU0kgcG9sbCAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDTURfUlNTSV9QT0xMICAgICAgICAgICAgICAgICAgICAgICAgPSA4MzsKKyAgICAvKiBHZXQgY3VycmVudCBSU1NJICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IENNRF9HRVRfUlNTSSAgICAgICAgICAgICAgICAgICAgICAgICA9IDg0OworICAgIC8qIEdldCBhcHByb3ggY3VycmVudCBSU1NJICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IENNRF9HRVRfUlNTSV9BUFBST1ggICAgICAgICAgICAgICAgICA9IDg1OworICAgIC8qIEdldCBsaW5rIHNwZWVkIG9uIGNvbm5lY3Rpb24gKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQ01EX0dFVF9MSU5LX1NQRUVEICAgICAgICAgICAgICAgICAgID0gODY7CisgICAgLyogUmFkaW8gbWFjIGFkZHJlc3MgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQ01EX0dFVF9NQUNfQUREUiAgICAgICAgICAgICAgICAgICAgID0gODc7CisgICAgLyogU2V0IHVwIHBhY2tldCBmaWx0ZXJpbmcgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQ01EX1NUQVJUX1BBQ0tFVF9GSUxURVJJTkcgICAgICAgICAgID0gODg7CisgICAgLyogQ2xlYXIgcGFja2V0IGZpbHRlciAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDTURfU1RPUF9QQUNLRVRfRklMVEVSSU5HICAgICAgICAgICAgPSA4OTsKKyAgICAvKiBDb25uZWN0IHRvIGEgc3BlY2lmaWVkIG5ldHdvcmsgKG5ldHdvcmsgaWQKKyAgICAgKiBvciBXaWZpQ29uZmlndXJhdGlvbikgVGhpcyBpbnZvbHZlcyBpbmNyZWFzaW5nCisgICAgICogdGhlIHByaW9yaXR5IG9mIHRoZSBuZXR3b3JrLCBlbmFibGluZyB0aGUgbmV0d29yaworICAgICAqICh3aGlsZSBkaXNhYmxpbmcgb3RoZXJzKSBhbmQgaXNzdWluZyBhIHJlY29ubmVjdC4KKyAgICAgKiBOb3RlIHRoYXQgQ01EX1JFQ09OTkVDVCBqdXN0IGRvZXMgYSByZWNvbm5lY3QgdG8KKyAgICAgKiBhbiBleGlzdGluZyBuZXR3b3JrLiBBbGwgdGhlIG5ldHdvcmtzIGdldCBlbmFibGVkCisgICAgICogdXBvbiBhIHN1Y2Nlc3NmdWwgY29ubmVjdGlvbiBvciBhIGZhaWx1cmUuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IENNRF9DT05ORUNUX05FVFdPUksgICAgICAgICAgICAgICAgICA9IDkwOworICAgIC8qIFNhdmUgdGhlIHNwZWNpZmllZCBuZXR3b3JrLiBUaGlzIGludm9sdmVzIGFkZGluZworICAgICAqIGFuIGVuYWJsZWQgbmV0d29yayAoaWYgbmV3KSBhbmQgdXBkYXRpbmcgdGhlCisgICAgICogY29uZmlnIGFuZCBpc3N1aW5nIGEgc2F2ZSBvbiBzdXBwbGljYW50IGNvbmZpZy4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQ01EX1NBVkVfTkVUV09SSyAgICAgICAgICAgICAgICAgICAgID0gOTE7CisgICAgLyogRGVsZXRlIHRoZSBzcGVjaWZpZWQgbmV0d29yay4gVGhpcyBpbnZvbHZlcworICAgICAqIHJlbW92aW5nIHRoZSBuZXR3b3JrIGFuZCBpc3N1aW5nIGEgc2F2ZSBvbgorICAgICAqIHN1cHBsaWNhbnQgY29uZmlnLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDTURfRk9SR0VUX05FVFdPUksgICAgICAgICAgICAgICAgICAgPSA5MjsKKworCisKKyAgICAvKioKKyAgICAgKiBJbnRlcnZhbCBpbiBtaWxsaXNlY29uZHMgYmV0d2VlbiBwb2xsaW5nIGZvciBjb25uZWN0aW9uCisgICAgICogc3RhdHVzIGl0ZW1zIHRoYXQgYXJlIG5vdCBzZW50IHZpYSBhc3luY2hyb25vdXMgZXZlbnRzLgorICAgICAqIEFuIGV4YW1wbGUgaXMgUlNTSSAoc2lnbmFsIHN0cmVuZ3RoKS4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUE9MTF9SU1NJX0lOVEVSVkFMX01TRUNTID0gMzAwMDsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDT05ORUNUX01PREUgICA9IDE7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNDQU5fT05MWV9NT0RFID0gMjsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTQ0FOX0FDVElWRSA9IDE7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNDQU5fUEFTU0lWRSA9IDI7CisKKyAgICAvKiBBdXRvIGFsbG93cyA4MDIuMTFBL0IvRyBvcGVyYXRpb24gKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQkFORF9BVVRPID0gMDsKKyAgICAvKiA1R0h6IGFsbG93cyA4MDIuMTFBIG9wZXJhdGlvbiAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBCQU5EXzVHID0gMTsKKyAgICAvKiAyLjRHSHogYWxsb3dzIDgwMi4xMUIvRyBvcGVyYXRpb24gKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQkFORF8yRyA9IDI7CisKKyAgICAvKioKKyAgICAgKiBUaGUgbWF4aW11bSBudW1iZXIgb2YgdGltZXMgd2Ugd2lsbCByZXRyeSBhIGNvbm5lY3Rpb24gdG8gYW4gYWNjZXNzIHBvaW50CisgICAgICogZm9yIHdoaWNoIHdlIGhhdmUgZmFpbGVkIGluIGFjcXVpcmluZyBhbiBJUCBhZGRyZXNzIGZyb20gREhDUC4gQSB2YWx1ZSBvZgorICAgICAqIE4gbWVhbnMgdGhhdCB3ZSB3aWxsIG1ha2UgTisxIGNvbm5lY3Rpb24gYXR0ZW1wdHMgaW4gYWxsLgorICAgICAqIDxwPgorICAgICAqIFNlZSB7QGxpbmsgU2V0dGluZ3MuU2VjdXJlI1dJRklfTUFYX0RIQ1BfUkVUUllfQ09VTlR9LiBUaGlzIGlzIHRoZSBkZWZhdWx0CisgICAgICogdmFsdWUgaWYgYSBTZXR0aW5ncyB2YWx1ZSBpcyBub3QgcHJlc2VudC4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgREVGQVVMVF9NQVhfREhDUF9SRVRSSUVTID0gOTsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBEUklWRVJfUE9XRVJfTU9ERV9BQ1RJVkUgPSAxOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBEUklWRVJfUE9XRVJfTU9ERV9BVVRPID0gMDsKKworICAgIC8qIERlZmF1bHQgcGFyZW50IHN0YXRlICovCisgICAgcHJpdmF0ZSBIaWVyYXJjaGljYWxTdGF0ZSBtRGVmYXVsdFN0YXRlID0gbmV3IERlZmF1bHRTdGF0ZSgpOworICAgIC8qIFRlbXBvcmFyeSBpbml0aWFsIHN0YXRlICovCisgICAgcHJpdmF0ZSBIaWVyYXJjaGljYWxTdGF0ZSBtSW5pdGlhbFN0YXRlID0gbmV3IEluaXRpYWxTdGF0ZSgpOworICAgIC8qIFVubG9hZGluZyB0aGUgZHJpdmVyICovCisgICAgcHJpdmF0ZSBIaWVyYXJjaGljYWxTdGF0ZSBtRHJpdmVyVW5sb2FkaW5nU3RhdGUgPSBuZXcgRHJpdmVyVW5sb2FkaW5nU3RhdGUoKTsKKyAgICAvKiBMb2FkaW5nIHRoZSBkcml2ZXIgKi8KKyAgICBwcml2YXRlIEhpZXJhcmNoaWNhbFN0YXRlIG1Ecml2ZXJVbmxvYWRlZFN0YXRlID0gbmV3IERyaXZlclVubG9hZGVkU3RhdGUoKTsKKyAgICAvKiBEcml2ZXIgbG9hZC91bmxvYWQgZmFpbGVkICovCisgICAgcHJpdmF0ZSBIaWVyYXJjaGljYWxTdGF0ZSBtRHJpdmVyRmFpbGVkU3RhdGUgPSBuZXcgRHJpdmVyRmFpbGVkU3RhdGUoKTsKKyAgICAvKiBEcml2ZXIgbG9hZGluZyAqLworICAgIHByaXZhdGUgSGllcmFyY2hpY2FsU3RhdGUgbURyaXZlckxvYWRpbmdTdGF0ZSA9IG5ldyBEcml2ZXJMb2FkaW5nU3RhdGUoKTsKKyAgICAvKiBEcml2ZXIgbG9hZGVkICovCisgICAgcHJpdmF0ZSBIaWVyYXJjaGljYWxTdGF0ZSBtRHJpdmVyTG9hZGVkU3RhdGUgPSBuZXcgRHJpdmVyTG9hZGVkU3RhdGUoKTsKKyAgICAvKiBEcml2ZXIgbG9hZGVkLCB3YWl0aW5nIGZvciBzdXBwbGljYW50IHRvIHN0YXJ0ICovCisgICAgcHJpdmF0ZSBIaWVyYXJjaGljYWxTdGF0ZSBtV2FpdEZvclN1cFN0YXRlID0gbmV3IFdhaXRGb3JTdXBTdGF0ZSgpOworCisgICAgLyogRHJpdmVyIGxvYWRlZCBhbmQgc3VwcGxpY2FudCByZWFkeSAqLworICAgIHByaXZhdGUgSGllcmFyY2hpY2FsU3RhdGUgbURyaXZlclN1cFJlYWR5U3RhdGUgPSBuZXcgRHJpdmVyU3VwUmVhZHlTdGF0ZSgpOworICAgIC8qIERyaXZlciBzdGFydCBpc3N1ZWQsIHdhaXRpbmcgZm9yIGNvbXBsZXRlZCBldmVudCAqLworICAgIHByaXZhdGUgSGllcmFyY2hpY2FsU3RhdGUgbURyaXZlclN0YXJ0aW5nU3RhdGUgPSBuZXcgRHJpdmVyU3RhcnRpbmdTdGF0ZSgpOworICAgIC8qIERyaXZlciBzdGFydGVkICovCisgICAgcHJpdmF0ZSBIaWVyYXJjaGljYWxTdGF0ZSBtRHJpdmVyU3RhcnRlZFN0YXRlID0gbmV3IERyaXZlclN0YXJ0ZWRTdGF0ZSgpOworICAgIC8qIERyaXZlciBzdG9wcGluZyAqLworICAgIHByaXZhdGUgSGllcmFyY2hpY2FsU3RhdGUgbURyaXZlclN0b3BwaW5nU3RhdGUgPSBuZXcgRHJpdmVyU3RvcHBpbmdTdGF0ZSgpOworICAgIC8qIERyaXZlciBzdG9wcGVkICovCisgICAgcHJpdmF0ZSBIaWVyYXJjaGljYWxTdGF0ZSBtRHJpdmVyU3RvcHBlZFN0YXRlID0gbmV3IERyaXZlclN0b3BwZWRTdGF0ZSgpOworICAgIC8qIFNjYW4gZm9yIG5ldHdvcmtzLCBubyBjb25uZWN0aW9uIHdpbGwgYmUgZXN0YWJsaXNoZWQgKi8KKyAgICBwcml2YXRlIEhpZXJhcmNoaWNhbFN0YXRlIG1TY2FuTW9kZVN0YXRlID0gbmV3IFNjYW5Nb2RlU3RhdGUoKTsKKyAgICAvKiBDb25uZWN0aW5nIHRvIGFuIGFjY2VzcyBwb2ludCAqLworICAgIHByaXZhdGUgSGllcmFyY2hpY2FsU3RhdGUgbUNvbm5lY3RNb2RlU3RhdGUgPSBuZXcgQ29ubmVjdE1vZGVTdGF0ZSgpOworICAgIC8qIEZldGNoaW5nIElQIGFmdGVyIG5ldHdvcmsgY29ubmVjdGlvbiAoYXNzb2MrYXV0aCBjb21wbGV0ZSkgKi8KKyAgICBwcml2YXRlIEhpZXJhcmNoaWNhbFN0YXRlIG1Db25uZWN0aW5nU3RhdGUgPSBuZXcgQ29ubmVjdGluZ1N0YXRlKCk7CisgICAgLyogQ29ubmVjdGVkIHdpdGggSVAgYWRkciAqLworICAgIHByaXZhdGUgSGllcmFyY2hpY2FsU3RhdGUgbUNvbm5lY3RlZFN0YXRlID0gbmV3IENvbm5lY3RlZFN0YXRlKCk7CisgICAgLyogZGlzY29ubmVjdCBpc3N1ZWQsIHdhaXRpbmcgZm9yIG5ldHdvcmsgZGlzY29ubmVjdCBjb25maXJtYXRpb24gKi8KKyAgICBwcml2YXRlIEhpZXJhcmNoaWNhbFN0YXRlIG1EaXNjb25uZWN0aW5nU3RhdGUgPSBuZXcgRGlzY29ubmVjdGluZ1N0YXRlKCk7CisgICAgLyogTmV0d29yayBpcyBub3QgY29ubmVjdGVkLCBzdXBwbGljYW50IGFzc29jK2F1dGggaXMgbm90IGNvbXBsZXRlICovCisgICAgcHJpdmF0ZSBIaWVyYXJjaGljYWxTdGF0ZSBtRGlzY29ubmVjdGVkU3RhdGUgPSBuZXcgRGlzY29ubmVjdGVkU3RhdGUoKTsKKworICAgIC8qIFNvZnQgQXAgaXMgcnVubmluZyAqLworICAgIHByaXZhdGUgSGllcmFyY2hpY2FsU3RhdGUgbVNvZnRBcFN0YXJ0ZWRTdGF0ZSA9IG5ldyBTb2Z0QXBTdGFydGVkU3RhdGUoKTsKKworCisgICAgLyoqCisgICAgICogT25lIG9mICB7QGxpbmsgV2lmaU1hbmFnZXIjV0lGSV9TVEFURV9ESVNBQkxFRH0sCisgICAgICogICAgICAgICB7QGxpbmsgV2lmaU1hbmFnZXIjV0lGSV9TVEFURV9ESVNBQkxJTkd9LAorICAgICAqICAgICAgICAge0BsaW5rIFdpZmlNYW5hZ2VyI1dJRklfU1RBVEVfRU5BQkxFRH0sCisgICAgICogICAgICAgICB7QGxpbmsgV2lmaU1hbmFnZXIjV0lGSV9TVEFURV9FTkFCTElOR30sCisgICAgICogICAgICAgICB7QGxpbmsgV2lmaU1hbmFnZXIjV0lGSV9TVEFURV9VTktOT1dOfQorICAgICAqCisgICAgICovCisgICAgcHJpdmF0ZSBmaW5hbCBBdG9taWNJbnRlZ2VyIG1XaWZpU3RhdGUgPSBuZXcgQXRvbWljSW50ZWdlcihXSUZJX1NUQVRFX0RJU0FCTEVEKTsKKworICAgIC8qKgorICAgICAqIE9uZSBvZiAge0BsaW5rIFdpZmlNYW5hZ2VyI1dJRklfQVBfU1RBVEVfRElTQUJMRUR9LAorICAgICAqICAgICAgICAge0BsaW5rIFdpZmlNYW5hZ2VyI1dJRklfQVBfU1RBVEVfRElTQUJMSU5HfSwKKyAgICAgKiAgICAgICAgIHtAbGluayBXaWZpTWFuYWdlciNXSUZJX0FQX1NUQVRFX0VOQUJMRUR9LAorICAgICAqICAgICAgICAge0BsaW5rIFdpZmlNYW5hZ2VyI1dJRklfQVBfU1RBVEVfRU5BQkxJTkd9LAorICAgICAqICAgICAgICAge0BsaW5rIFdpZmlNYW5hZ2VyI1dJRklfQVBfU1RBVEVfRkFJTEVEfQorICAgICAqCisgICAgICovCisgICAgcHJpdmF0ZSBmaW5hbCBBdG9taWNJbnRlZ2VyIG1XaWZpQXBTdGF0ZSA9IG5ldyBBdG9taWNJbnRlZ2VyKFdJRklfQVBfU1RBVEVfRElTQUJMRUQpOworCisgICAgcHJpdmF0ZSBmaW5hbCBBdG9taWNJbnRlZ2VyIG1MYXN0RW5hYmxlVWlkID0gbmV3IEF0b21pY0ludGVnZXIoUHJvY2Vzcy5teVVpZCgpKTsKKyAgICBwcml2YXRlIGZpbmFsIEF0b21pY0ludGVnZXIgbUxhc3RBcEVuYWJsZVVpZCA9IG5ldyBBdG9taWNJbnRlZ2VyKFByb2Nlc3MubXlVaWQoKSk7CisKKyAgICBwcml2YXRlIGZpbmFsIElCYXR0ZXJ5U3RhdHMgbUJhdHRlcnlTdGF0czsKKworICAgIHB1YmxpYyBXaWZpU3RhdGVNYWNoaW5lKENvbnRleHQgY29udGV4dCkgeworICAgICAgICBzdXBlcihUQUcpOworCisgICAgICAgIG1Db250ZXh0ID0gY29udGV4dDsKKworICAgICAgICBtTmV0d29ya0luZm8gPSBuZXcgTmV0d29ya0luZm8oQ29ubmVjdGl2aXR5TWFuYWdlci5UWVBFX1dJRkksIDAsIE5FVFdPUktUWVBFLCAiIik7CisgICAgICAgIG1CYXR0ZXJ5U3RhdHMgPSBJQmF0dGVyeVN0YXRzLlN0dWIuYXNJbnRlcmZhY2UoU2VydmljZU1hbmFnZXIuZ2V0U2VydmljZSgiYmF0dGVyeWluZm8iKSk7CisKKyAgICAgICAgSUJpbmRlciBiID0gU2VydmljZU1hbmFnZXIuZ2V0U2VydmljZShDb250ZXh0Lk5FVFdPUktNQU5BR0VNRU5UX1NFUlZJQ0UpOworICAgICAgICBud1NlcnZpY2UgPSBJTmV0d29ya01hbmFnZW1lbnRTZXJ2aWNlLlN0dWIuYXNJbnRlcmZhY2UoYik7CisKKyAgICAgICAgbVdpZmlNb25pdG9yID0gbmV3IFdpZmlNb25pdG9yKHRoaXMpOworICAgICAgICBtRGhjcEluZm8gPSBuZXcgRGhjcEluZm8oKTsKKyAgICAgICAgbVdpZmlJbmZvID0gbmV3IFdpZmlJbmZvKCk7CisgICAgICAgIG1JbnRlcmZhY2VOYW1lID0gU3lzdGVtUHJvcGVydGllcy5nZXQoIndpZmkuaW50ZXJmYWNlIiwgInRpd2xhbjAiKTsKKyAgICAgICAgbVN1cHBsaWNhbnRTdGF0ZVRyYWNrZXIgPSBuZXcgU3VwcGxpY2FudFN0YXRlVHJhY2tlcihjb250ZXh0LCBnZXRIYW5kbGVyKCkpOworCisgICAgICAgIG1CbHVldG9vdGhIZWFkc2V0ID0gbmV3IEJsdWV0b290aEhlYWRzZXQobUNvbnRleHQsIG51bGwpOworICAgICAgICBtTGlua1Byb3BlcnRpZXMgPSBuZXcgTGlua1Byb3BlcnRpZXMoKTsKKworICAgICAgICBtTmV0d29ya0luZm8uc2V0SXNBdmFpbGFibGUoZmFsc2UpOworICAgICAgICBtTGlua1Byb3BlcnRpZXMuY2xlYXIoKTsKKyAgICAgICAgbUxhc3RCc3NpZCA9IG51bGw7CisgICAgICAgIG1MYXN0TmV0d29ya0lkID0gLTE7CisgICAgICAgIG1MYXN0U2lnbmFsTGV2ZWwgPSAtMTsKKworICAgICAgICBtU2NhblJlc3VsdENhY2hlID0gbmV3IExpbmtlZEhhc2hNYXA8U3RyaW5nLCBTY2FuUmVzdWx0PigKKyAgICAgICAgICAgIFNDQU5fUkVTVUxUX0NBQ0hFX1NJWkUsIDAuNzVmLCB0cnVlKSB7CisgICAgICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgICAgKiBMaW1pdCB0aGUgY2FjaGUgc2l6ZSBieSBTQ0FOX1JFU1VMVF9DQUNIRV9TSVpFCisgICAgICAgICAgICAgICAgICogZWxlbWVudHMKKyAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiByZW1vdmVFbGRlc3RFbnRyeShNYXAuRW50cnkgZWxkZXN0KSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBTQ0FOX1JFU1VMVF9DQUNIRV9TSVpFIDwgdGhpcy5zaXplKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICB9OworCisgICAgICAgIFBvd2VyTWFuYWdlciBwb3dlck1hbmFnZXIgPSAoUG93ZXJNYW5hZ2VyKW1Db250ZXh0LmdldFN5c3RlbVNlcnZpY2UoQ29udGV4dC5QT1dFUl9TRVJWSUNFKTsKKyAgICAgICAgc1dha2VMb2NrID0gcG93ZXJNYW5hZ2VyLm5ld1dha2VMb2NrKFBvd2VyTWFuYWdlci5QQVJUSUFMX1dBS0VfTE9DSywgVEFHKTsKKworICAgICAgICBhZGRTdGF0ZShtRGVmYXVsdFN0YXRlKTsKKyAgICAgICAgICAgIGFkZFN0YXRlKG1Jbml0aWFsU3RhdGUsIG1EZWZhdWx0U3RhdGUpOworICAgICAgICAgICAgYWRkU3RhdGUobURyaXZlclVubG9hZGluZ1N0YXRlLCBtRGVmYXVsdFN0YXRlKTsKKyAgICAgICAgICAgIGFkZFN0YXRlKG1Ecml2ZXJVbmxvYWRlZFN0YXRlLCBtRGVmYXVsdFN0YXRlKTsKKyAgICAgICAgICAgICAgICBhZGRTdGF0ZShtRHJpdmVyRmFpbGVkU3RhdGUsIG1Ecml2ZXJVbmxvYWRlZFN0YXRlKTsKKyAgICAgICAgICAgIGFkZFN0YXRlKG1Ecml2ZXJMb2FkaW5nU3RhdGUsIG1EZWZhdWx0U3RhdGUpOworICAgICAgICAgICAgYWRkU3RhdGUobURyaXZlckxvYWRlZFN0YXRlLCBtRGVmYXVsdFN0YXRlKTsKKyAgICAgICAgICAgICAgICBhZGRTdGF0ZShtV2FpdEZvclN1cFN0YXRlLCBtRHJpdmVyTG9hZGVkU3RhdGUpOworICAgICAgICAgICAgYWRkU3RhdGUobURyaXZlclN1cFJlYWR5U3RhdGUsIG1EZWZhdWx0U3RhdGUpOworICAgICAgICAgICAgICAgIGFkZFN0YXRlKG1Ecml2ZXJTdGFydGluZ1N0YXRlLCBtRHJpdmVyU3VwUmVhZHlTdGF0ZSk7CisgICAgICAgICAgICAgICAgYWRkU3RhdGUobURyaXZlclN0YXJ0ZWRTdGF0ZSwgbURyaXZlclN1cFJlYWR5U3RhdGUpOworICAgICAgICAgICAgICAgICAgICBhZGRTdGF0ZShtU2Nhbk1vZGVTdGF0ZSwgbURyaXZlclN0YXJ0ZWRTdGF0ZSk7CisgICAgICAgICAgICAgICAgICAgIGFkZFN0YXRlKG1Db25uZWN0TW9kZVN0YXRlLCBtRHJpdmVyU3RhcnRlZFN0YXRlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFkZFN0YXRlKG1Db25uZWN0aW5nU3RhdGUsIG1Db25uZWN0TW9kZVN0YXRlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFkZFN0YXRlKG1Db25uZWN0ZWRTdGF0ZSwgbUNvbm5lY3RNb2RlU3RhdGUpOworICAgICAgICAgICAgICAgICAgICAgICAgYWRkU3RhdGUobURpc2Nvbm5lY3RpbmdTdGF0ZSwgbUNvbm5lY3RNb2RlU3RhdGUpOworICAgICAgICAgICAgICAgICAgICAgICAgYWRkU3RhdGUobURpc2Nvbm5lY3RlZFN0YXRlLCBtQ29ubmVjdE1vZGVTdGF0ZSk7CisgICAgICAgICAgICAgICAgYWRkU3RhdGUobURyaXZlclN0b3BwaW5nU3RhdGUsIG1Ecml2ZXJTdXBSZWFkeVN0YXRlKTsKKyAgICAgICAgICAgICAgICBhZGRTdGF0ZShtRHJpdmVyU3RvcHBlZFN0YXRlLCBtRHJpdmVyU3VwUmVhZHlTdGF0ZSk7CisgICAgICAgICAgICBhZGRTdGF0ZShtU29mdEFwU3RhcnRlZFN0YXRlLCBtRGVmYXVsdFN0YXRlKTsKKworICAgICAgICBzZXRJbml0aWFsU3RhdGUobUluaXRpYWxTdGF0ZSk7CisKKyAgICAgICAgaWYgKERCRykgc2V0RGJnKHRydWUpOworCisgICAgICAgIC8vc3RhcnQgdGhlIHN0YXRlIG1hY2hpbmUKKyAgICAgICAgc3RhcnQoKTsKKyAgICB9CisKKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICogTWV0aG9kcyBleHBvc2VkIGZvciBwdWJsaWMgdXNlCisgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgICAgLyoqCisgICAgICogVE9ETzogZG9jCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gc3luY1BpbmdTdXBwbGljYW50KCkgeworICAgICAgICByZXR1cm4gc2VuZFN5bmNNZXNzYWdlKENNRF9QSU5HX1NVUFBMSUNBTlQpLmJvb2xWYWx1ZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUT0RPOiBkb2MKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzdGFydFNjYW4oYm9vbGVhbiBmb3JjZUFjdGl2ZSkgeworICAgICAgICBzZW5kTWVzc2FnZShvYnRhaW5NZXNzYWdlKENNRF9TVEFSVF9TQ0FOLCBmb3JjZUFjdGl2ZSA/CisgICAgICAgICAgICAgICAgU0NBTl9BQ1RJVkUgOiBTQ0FOX1BBU1NJVkUsIDApKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUT0RPOiBkb2MKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRXaWZpRW5hYmxlZChib29sZWFuIGVuYWJsZSkgeworICAgICAgICBtTGFzdEVuYWJsZVVpZC5zZXQoQmluZGVyLmdldENhbGxpbmdVaWQoKSk7CisgICAgICAgIGlmIChlbmFibGUpIHsKKyAgICAgICAgICAgIC8qIEFyZ3VtZW50IGlzIHRoZSBzdGF0ZSB0aGF0IGlzIGVudGVyZWQgcHJpb3IgdG8gbG9hZCAqLworICAgICAgICAgICAgc2VuZE1lc3NhZ2Uob2J0YWluTWVzc2FnZShDTURfTE9BRF9EUklWRVIsIFdJRklfU1RBVEVfRU5BQkxJTkcsIDApKTsKKyAgICAgICAgICAgIHNlbmRNZXNzYWdlKENNRF9TVEFSVF9TVVBQTElDQU5UKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHNlbmRNZXNzYWdlKENNRF9TVE9QX1NVUFBMSUNBTlQpOworICAgICAgICAgICAgLyogQXJndW1lbnQgaXMgdGhlIHN0YXRlIHRoYXQgaXMgZW50ZXJlZCB1cG9uIHN1Y2Nlc3MgKi8KKyAgICAgICAgICAgIHNlbmRNZXNzYWdlKG9idGFpbk1lc3NhZ2UoQ01EX1VOTE9BRF9EUklWRVIsIFdJRklfU1RBVEVfRElTQUJMRUQsIDApKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFRPRE86IGRvYworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFdpZmlBcEVuYWJsZWQoV2lmaUNvbmZpZ3VyYXRpb24gd2lmaUNvbmZpZywgYm9vbGVhbiBlbmFibGUpIHsKKyAgICAgICAgbUxhc3RBcEVuYWJsZVVpZC5zZXQoQmluZGVyLmdldENhbGxpbmdVaWQoKSk7CisgICAgICAgIGlmIChlbmFibGUpIHsKKyAgICAgICAgICAgIC8qIEFyZ3VtZW50IGlzIHRoZSBzdGF0ZSB0aGF0IGlzIGVudGVyZWQgcHJpb3IgdG8gbG9hZCAqLworICAgICAgICAgICAgc2VuZE1lc3NhZ2Uob2J0YWluTWVzc2FnZShDTURfTE9BRF9EUklWRVIsIFdJRklfQVBfU1RBVEVfRU5BQkxJTkcsIDApKTsKKyAgICAgICAgICAgIHNlbmRNZXNzYWdlKG9idGFpbk1lc3NhZ2UoQ01EX1NUQVJUX0FQLCB3aWZpQ29uZmlnKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzZW5kTWVzc2FnZShDTURfU1RPUF9BUCk7CisgICAgICAgICAgICAvKiBBcmd1bWVudCBpcyB0aGUgc3RhdGUgdGhhdCBpcyBlbnRlcmVkIHVwb24gc3VjY2VzcyAqLworICAgICAgICAgICAgc2VuZE1lc3NhZ2Uob2J0YWluTWVzc2FnZShDTURfVU5MT0FEX0RSSVZFUiwgV0lGSV9BUF9TVEFURV9ESVNBQkxFRCwgMCkpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVE9ETzogZG9jCisgICAgICovCisgICAgcHVibGljIGludCBzeW5jR2V0V2lmaVN0YXRlKCkgeworICAgICAgICByZXR1cm4gbVdpZmlTdGF0ZS5nZXQoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUT0RPOiBkb2MKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIHN5bmNHZXRXaWZpU3RhdGVCeU5hbWUoKSB7CisgICAgICAgIHN3aXRjaCAobVdpZmlTdGF0ZS5nZXQoKSkgeworICAgICAgICAgICAgY2FzZSBXSUZJX1NUQVRFX0RJU0FCTElORzoKKyAgICAgICAgICAgICAgICByZXR1cm4gImRpc2FibGluZyI7CisgICAgICAgICAgICBjYXNlIFdJRklfU1RBVEVfRElTQUJMRUQ6CisgICAgICAgICAgICAgICAgcmV0dXJuICJkaXNhYmxlZCI7CisgICAgICAgICAgICBjYXNlIFdJRklfU1RBVEVfRU5BQkxJTkc6CisgICAgICAgICAgICAgICAgcmV0dXJuICJlbmFibGluZyI7CisgICAgICAgICAgICBjYXNlIFdJRklfU1RBVEVfRU5BQkxFRDoKKyAgICAgICAgICAgICAgICByZXR1cm4gImVuYWJsZWQiOworICAgICAgICAgICAgY2FzZSBXSUZJX1NUQVRFX1VOS05PV046CisgICAgICAgICAgICAgICAgcmV0dXJuICJ1bmtub3duIHN0YXRlIjsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgcmV0dXJuICJbaW52YWxpZCBzdGF0ZV0iOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVE9ETzogZG9jCisgICAgICovCisgICAgcHVibGljIGludCBzeW5jR2V0V2lmaUFwU3RhdGUoKSB7CisgICAgICAgIHJldHVybiBtV2lmaUFwU3RhdGUuZ2V0KCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVE9ETzogZG9jCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBzeW5jR2V0V2lmaUFwU3RhdGVCeU5hbWUoKSB7CisgICAgICAgIHN3aXRjaCAobVdpZmlBcFN0YXRlLmdldCgpKSB7CisgICAgICAgICAgICBjYXNlIFdJRklfQVBfU1RBVEVfRElTQUJMSU5HOgorICAgICAgICAgICAgICAgIHJldHVybiAiZGlzYWJsaW5nIjsKKyAgICAgICAgICAgIGNhc2UgV0lGSV9BUF9TVEFURV9ESVNBQkxFRDoKKyAgICAgICAgICAgICAgICByZXR1cm4gImRpc2FibGVkIjsKKyAgICAgICAgICAgIGNhc2UgV0lGSV9BUF9TVEFURV9FTkFCTElORzoKKyAgICAgICAgICAgICAgICByZXR1cm4gImVuYWJsaW5nIjsKKyAgICAgICAgICAgIGNhc2UgV0lGSV9BUF9TVEFURV9FTkFCTEVEOgorICAgICAgICAgICAgICAgIHJldHVybiAiZW5hYmxlZCI7CisgICAgICAgICAgICBjYXNlIFdJRklfQVBfU1RBVEVfRkFJTEVEOgorICAgICAgICAgICAgICAgIHJldHVybiAiZmFpbGVkIjsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgcmV0dXJuICJbaW52YWxpZCBzdGF0ZV0iOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHN0YXR1cyBpbmZvcm1hdGlvbiBmb3IgdGhlIGN1cnJlbnQgY29ubmVjdGlvbiwgaWYgYW55LgorICAgICAqIEByZXR1cm4gYSB7QGxpbmsgV2lmaUluZm99IG9iamVjdCBjb250YWluaW5nIGluZm9ybWF0aW9uIGFib3V0IHRoZSBjdXJyZW50IGNvbm5lY3Rpb24KKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBXaWZpSW5mbyBzeW5jUmVxdWVzdENvbm5lY3Rpb25JbmZvKCkgeworICAgICAgICByZXR1cm4gbVdpZmlJbmZvOworICAgIH0KKworICAgIHB1YmxpYyBEaGNwSW5mbyBzeW5jR2V0RGhjcEluZm8oKSB7CisgICAgICAgIHN5bmNocm9uaXplZCAobURoY3BJbmZvKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IERoY3BJbmZvKG1EaGNwSW5mbyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUT0RPOiBkb2MKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXREcml2ZXJTdGFydChib29sZWFuIGVuYWJsZSkgeworICAgICAgaWYgKGVuYWJsZSkgeworICAgICAgICAgIHNlbmRNZXNzYWdlKENNRF9TVEFSVF9EUklWRVIpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBzZW5kTWVzc2FnZShDTURfU1RPUF9EUklWRVIpOworICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFRPRE86IGRvYworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFNjYW5Pbmx5TW9kZShib29sZWFuIGVuYWJsZSkgeworICAgICAgaWYgKGVuYWJsZSkgeworICAgICAgICAgIHNlbmRNZXNzYWdlKG9idGFpbk1lc3NhZ2UoQ01EX1NFVF9TQ0FOX01PREUsIFNDQU5fT05MWV9NT0RFLCAwKSk7CisgICAgICB9IGVsc2UgeworICAgICAgICAgIHNlbmRNZXNzYWdlKG9idGFpbk1lc3NhZ2UoQ01EX1NFVF9TQ0FOX01PREUsIENPTk5FQ1RfTU9ERSwgMCkpOworICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFRPRE86IGRvYworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFNjYW5UeXBlKGJvb2xlYW4gYWN0aXZlKSB7CisgICAgICBpZiAoYWN0aXZlKSB7CisgICAgICAgICAgc2VuZE1lc3NhZ2Uob2J0YWluTWVzc2FnZShDTURfU0VUX1NDQU5fVFlQRSwgU0NBTl9BQ1RJVkUsIDApKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgICAgc2VuZE1lc3NhZ2Uob2J0YWluTWVzc2FnZShDTURfU0VUX1NDQU5fVFlQRSwgU0NBTl9QQVNTSVZFLCAwKSk7CisgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVE9ETzogZG9jCisgICAgICovCisgICAgcHVibGljIExpc3Q8U2NhblJlc3VsdD4gc3luY0dldFNjYW5SZXN1bHRzTGlzdCgpIHsKKyAgICAgICAgcmV0dXJuIG1TY2FuUmVzdWx0czsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBEaXNjb25uZWN0IGZyb20gQWNjZXNzIFBvaW50CisgICAgICovCisgICAgcHVibGljIHZvaWQgZGlzY29ubmVjdENvbW1hbmQoKSB7CisgICAgICAgIHNlbmRNZXNzYWdlKENNRF9ESVNDT05ORUNUKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJbml0aWF0ZSBhIHJlY29ubmVjdGlvbiB0byBBUAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJlY29ubmVjdENvbW1hbmQoKSB7CisgICAgICAgIHNlbmRNZXNzYWdlKENNRF9SRUNPTk5FQ1QpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEluaXRpYXRlIGEgcmUtYXNzb2NpYXRpb24gdG8gQVAKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZWFzc29jaWF0ZUNvbW1hbmQoKSB7CisgICAgICAgIHNlbmRNZXNzYWdlKENNRF9SRUFTU09DSUFURSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkIGEgbmV0d29yayBzeW5jaHJvbm91c2x5CisgICAgICoKKyAgICAgKiBAcmV0dXJuIG5ldHdvcmsgaWQgb2YgdGhlIG5ldyBuZXR3b3JrCisgICAgICovCisgICAgcHVibGljIGludCBzeW5jQWRkT3JVcGRhdGVOZXR3b3JrKFdpZmlDb25maWd1cmF0aW9uIGNvbmZpZykgeworICAgICAgICByZXR1cm4gc2VuZFN5bmNNZXNzYWdlKENNRF9BRERfT1JfVVBEQVRFX05FVFdPUkssIGNvbmZpZykuaW50VmFsdWU7CisgICAgfQorCisgICAgcHVibGljIExpc3Q8V2lmaUNvbmZpZ3VyYXRpb24+IHN5bmNHZXRDb25maWd1cmVkTmV0d29ya3MoKSB7CisgICAgICAgIHJldHVybiBXaWZpQ29uZmlnU3RvcmUuZ2V0Q29uZmlndXJlZE5ldHdvcmtzKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogRGVsZXRlIGEgbmV0d29yaworICAgICAqCisgICAgICogQHBhcmFtIG5ldHdvcmtJZCBpZCBvZiB0aGUgbmV0d29yayB0byBiZSByZW1vdmVkCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gc3luY1JlbW92ZU5ldHdvcmsoaW50IG5ldHdvcmtJZCkgeworICAgICAgICByZXR1cm4gc2VuZFN5bmNNZXNzYWdlKG9idGFpbk1lc3NhZ2UoQ01EX1JFTU9WRV9ORVRXT1JLLCBuZXR3b3JrSWQsIDApKS5ib29sVmFsdWU7CisgICAgfQorCisgICAgcHJpdmF0ZSBjbGFzcyBFbmFibGVOZXRQYXJhbXMgeworICAgICAgICBwcml2YXRlIGludCBuZXRJZDsKKyAgICAgICAgcHJpdmF0ZSBib29sZWFuIGRpc2FibGVPdGhlcnM7CisgICAgICAgIEVuYWJsZU5ldFBhcmFtcyhpbnQgbiwgYm9vbGVhbiBiKSB7CisgICAgICAgICAgICBuZXRJZCA9IG47CisgICAgICAgICAgICBkaXNhYmxlT3RoZXJzID0gYjsKKyAgICAgICAgfQorICAgIH0KKyAgICAvKioKKyAgICAgKiBFbmFibGUgYSBuZXR3b3JrCisgICAgICoKKyAgICAgKiBAcGFyYW0gbmV0SWQgbmV0d29yayBpZCBvZiB0aGUgbmV0d29yaworICAgICAqIEBwYXJhbSBkaXNhYmxlT3RoZXJzIHRydWUsIGlmIGFsbCBvdGhlciBuZXR3b3JrcyBoYXZlIHRvIGJlIGRpc2FibGVkCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhlIG9wZXJhdGlvbiBzdWNjZWVkcywge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBzeW5jRW5hYmxlTmV0d29yayhpbnQgbmV0SWQsIGJvb2xlYW4gZGlzYWJsZU90aGVycykgeworICAgICAgICByZXR1cm4gc2VuZFN5bmNNZXNzYWdlKENNRF9FTkFCTEVfTkVUV09SSywKKyAgICAgICAgICAgICAgICBuZXcgRW5hYmxlTmV0UGFyYW1zKG5ldElkLCBkaXNhYmxlT3RoZXJzKSkuYm9vbFZhbHVlOworICAgIH0KKworICAgIC8qKgorICAgICAqIERpc2FibGUgYSBuZXR3b3JrCisgICAgICoKKyAgICAgKiBAcGFyYW0gbmV0SWQgbmV0d29yayBpZCBvZiB0aGUgbmV0d29yaworICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoZSBvcGVyYXRpb24gc3VjY2VlZHMsIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gc3luY0Rpc2FibGVOZXR3b3JrKGludCBuZXRJZCkgeworICAgICAgICByZXR1cm4gc2VuZFN5bmNNZXNzYWdlKG9idGFpbk1lc3NhZ2UoQ01EX0RJU0FCTEVfTkVUV09SSywgbmV0SWQsIDApKS5ib29sVmFsdWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogQmxhY2tsaXN0IGEgQlNTSUQuIFRoaXMgd2lsbCBhdm9pZCB0aGUgQVAgaWYgdGhlcmUgYXJlCisgICAgICogYWx0ZXJuYXRlIEFQcyB0byBjb25uZWN0CisgICAgICoKKyAgICAgKiBAcGFyYW0gYnNzaWQgQlNTSUQgb2YgdGhlIG5ldHdvcmsKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRUb0JsYWNrbGlzdChTdHJpbmcgYnNzaWQpIHsKKyAgICAgICAgc2VuZE1lc3NhZ2Uob2J0YWluTWVzc2FnZShDTURfQkxBQ0tMSVNUX05FVFdPUkssIGJzc2lkKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2xlYXIgdGhlIGJsYWNrbGlzdCBsaXN0CisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBjbGVhckJsYWNrbGlzdCgpIHsKKyAgICAgICAgc2VuZE1lc3NhZ2Uob2J0YWluTWVzc2FnZShDTURfQ0xFQVJfQkxBQ0tMSVNUKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgY29ubmVjdE5ldHdvcmsoaW50IG5ldElkKSB7CisgICAgICAgIHNlbmRNZXNzYWdlKG9idGFpbk1lc3NhZ2UoQ01EX0NPTk5FQ1RfTkVUV09SSywgbmV0SWQsIDApKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBjb25uZWN0TmV0d29yayhXaWZpQ29uZmlndXJhdGlvbiB3aWZpQ29uZmlnKSB7CisgICAgICAgIC8qIGFyZzEgaXMgdXNlZCB0byBpbmRpY2F0ZSBuZXRJZCwgZm9yY2UgYSBuZXRJZCB2YWx1ZSBvZiAtMSB3aGVuCisgICAgICAgICAqIHdlIGFyZSBwYXNzaW5nIGEgY29uZmlndXJhdGlvbiBzaW5jZSB0aGUgZGVmYXVsdCB2YWx1ZSBvZgorICAgICAgICAgKiAwIGlzIGEgdmFsaWQgbmV0SWQKKyAgICAgICAgICovCisgICAgICAgIHNlbmRNZXNzYWdlKG9idGFpbk1lc3NhZ2UoQ01EX0NPTk5FQ1RfTkVUV09SSywgLTEsIDAsIHdpZmlDb25maWcpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzYXZlTmV0d29yayhXaWZpQ29uZmlndXJhdGlvbiB3aWZpQ29uZmlnKSB7CisgICAgICAgIHNlbmRNZXNzYWdlKG9idGFpbk1lc3NhZ2UoQ01EX1NBVkVfTkVUV09SSywgd2lmaUNvbmZpZykpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGZvcmdldE5ldHdvcmsoaW50IG5ldElkKSB7CisgICAgICAgIHNlbmRNZXNzYWdlKG9idGFpbk1lc3NhZ2UoQ01EX0ZPUkdFVF9ORVRXT1JLLCBuZXRJZCwgMCkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGVuYWJsZVJzc2lQb2xsaW5nKGJvb2xlYW4gZW5hYmxlZCkgeworICAgICAgIHNlbmRNZXNzYWdlKG9idGFpbk1lc3NhZ2UoQ01EX0VOQUJMRV9SU1NJX1BPTEwsIGVuYWJsZWQgPyAxIDogMCwgMCkpOworICAgIH0KKyAgICAvKioKKyAgICAgKiBHZXQgUlNTSSB0byBjdXJyZW50bHkgY29ubmVjdGVkIG5ldHdvcmsKKyAgICAgKgorICAgICAqIEByZXR1cm4gUlNTSSB2YWx1ZSwgLTEgb24gZmFpbHVyZQorICAgICAqLworICAgIHB1YmxpYyBpbnQgc3luY0dldFJzc2koKSB7CisgICAgICAgIHJldHVybiBzZW5kU3luY01lc3NhZ2UoQ01EX0dFVF9SU1NJKS5pbnRWYWx1ZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgYXBwcm94IFJTU0kgdG8gY3VycmVudGx5IGNvbm5lY3RlZCBuZXR3b3JrCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFJTU0kgdmFsdWUsIC0xIG9uIGZhaWx1cmUKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IHN5bmNHZXRSc3NpQXBwcm94KCkgeworICAgICAgICByZXR1cm4gc2VuZFN5bmNNZXNzYWdlKENNRF9HRVRfUlNTSV9BUFBST1gpLmludFZhbHVlOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCBsaW5rIHNwZWVkIHRvIGN1cnJlbnRseSBjb25uZWN0ZWQgbmV0d29yaworICAgICAqCisgICAgICogQHJldHVybiBsaW5rIHNwZWVkLCAtMSBvbiBmYWlsdXJlCisgICAgICovCisgICAgcHVibGljIGludCBzeW5jR2V0TGlua1NwZWVkKCkgeworICAgICAgICByZXR1cm4gc2VuZFN5bmNNZXNzYWdlKENNRF9HRVRfTElOS19TUEVFRCkuaW50VmFsdWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IE1BQyBhZGRyZXNzIG9mIHJhZGlvCisgICAgICoKKyAgICAgKiBAcmV0dXJuIE1BQyBhZGRyZXNzLCBudWxsIG9uIGZhaWx1cmUKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIHN5bmNHZXRNYWNBZGRyZXNzKCkgeworICAgICAgICByZXR1cm4gc2VuZFN5bmNNZXNzYWdlKENNRF9HRVRfTUFDX0FERFIpLnN0cmluZ1ZhbHVlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFN0YXJ0IHBhY2tldCBmaWx0ZXJpbmcKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzdGFydFBhY2tldEZpbHRlcmluZygpIHsKKyAgICAgICAgc2VuZE1lc3NhZ2UoQ01EX1NUQVJUX1BBQ0tFVF9GSUxURVJJTkcpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFN0b3AgcGFja2V0IGZpbHRlcmluZworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHN0b3BQYWNrZXRGaWx0ZXJpbmcoKSB7CisgICAgICAgIHNlbmRNZXNzYWdlKENNRF9TVE9QX1BBQ0tFVF9GSUxURVJJTkcpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCBwb3dlciBtb2RlCisgICAgICogQHBhcmFtIG1vZGUKKyAgICAgKiAgICAgRFJJVkVSX1BPV0VSX01PREVfQVVUTworICAgICAqICAgICBEUklWRVJfUE9XRVJfTU9ERV9BQ1RJVkUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRQb3dlck1vZGUoaW50IG1vZGUpIHsKKyAgICAgICAgc2VuZE1lc3NhZ2Uob2J0YWluTWVzc2FnZShDTURfU0VUX1BPV0VSX01PREUsIG1vZGUsIDApKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIG51bWJlciBvZiBhbGxvd2VkIHJhZGlvIGZyZXF1ZW5jeSBjaGFubmVscyBmcm9tIHRoZSBzeXN0ZW0KKyAgICAgKiBzZXR0aW5nIHZhbHVlLCBpZiBhbnkuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0TnVtQWxsb3dlZENoYW5uZWxzKCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgc2V0TnVtQWxsb3dlZENoYW5uZWxzKAorICAgICAgICAgICAgICAgICAgICBTZXR0aW5ncy5TZWN1cmUuZ2V0SW50KG1Db250ZXh0LmdldENvbnRlbnRSZXNvbHZlcigpLAorICAgICAgICAgICAgICAgICAgICBTZXR0aW5ncy5TZWN1cmUuV0lGSV9OVU1fQUxMT1dFRF9DSEFOTkVMUykpOworICAgICAgICB9IGNhdGNoIChTZXR0aW5ncy5TZXR0aW5nTm90Rm91bmRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgaWYgKG1OdW1BbGxvd2VkQ2hhbm5lbHMgIT0gMCkgeworICAgICAgICAgICAgICAgIHNldE51bUFsbG93ZWRDaGFubmVscyhtTnVtQWxsb3dlZENoYW5uZWxzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIG90aGVyd2lzZSwgdXNlIHRoZSBkcml2ZXIgZGVmYXVsdAorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBudW1iZXIgb2YgcmFkaW8gZnJlcXVlbmN5IGNoYW5uZWxzIHRoYXQgYXJlIGFsbG93ZWQgdG8gYmUgdXNlZAorICAgICAqIGluIHRoZSBjdXJyZW50IHJlZ3VsYXRvcnkgZG9tYWluLgorICAgICAqIEBwYXJhbSBudW1DaGFubmVscyB0aGUgbnVtYmVyIG9mIGFsbG93ZWQgY2hhbm5lbHMuIE11c3QgYmUgZ3JlYXRlciB0aGFuIDAKKyAgICAgKiBhbmQgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIDE2LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldE51bUFsbG93ZWRDaGFubmVscyhpbnQgbnVtQ2hhbm5lbHMpIHsKKyAgICAgICAgc2VuZE1lc3NhZ2Uob2J0YWluTWVzc2FnZShDTURfU0VUX05VTV9BTExPV0VEX0NIQU5ORUxTLCBudW1DaGFubmVscywgMCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCBudW1iZXIgb2YgYWxsb3dlZCBjaGFubmVscworICAgICAqCisgICAgICogQHJldHVybiBjaGFubmVsIGNvdW50LCAtMSBvbiBmYWlsdXJlCisgICAgICoKKyAgICAgKiBUT0RPOiB0aGlzIGlzIG5vdCBhIHB1YmxpYyBBUEkgYW5kIG5lZWRzIHRvIGJlIHJlbW92ZWQgaW4gZmF2b3IKKyAgICAgKiBvZiBhc3luY2hyb25vdXMgcmVwb3J0aW5nLiB1bnVzZWQgZm9yIG5vdy4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldE51bUFsbG93ZWRDaGFubmVscygpIHsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCBibHVldG9vdGggY29leCBtb2RlOgorICAgICAqCisgICAgICogQHBhcmFtIG1vZGUKKyAgICAgKiAgQkxVRVRPT1RIX0NPRVhJU1RFTkNFX01PREVfRU5BQkxFRAorICAgICAqICBCTFVFVE9PVEhfQ09FWElTVEVOQ0VfTU9ERV9ESVNBQkxFRAorICAgICAqICBCTFVFVE9PVEhfQ09FWElTVEVOQ0VfTU9ERV9TRU5TRQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEJsdWV0b290aENvZXhpc3RlbmNlTW9kZShpbnQgbW9kZSkgeworICAgICAgICBzZW5kTWVzc2FnZShvYnRhaW5NZXNzYWdlKENNRF9TRVRfQkxVRVRPT1RIX0NPRVhJU1RFTkNFLCBtb2RlLCAwKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogRW5hYmxlIG9yIGRpc2FibGUgQmx1ZXRvb3RoIGNvZXhpc3RlbmNlIHNjYW4gbW9kZS4gV2hlbiB0aGlzIG1vZGUgaXMgb24sCisgICAgICogc29tZSBvZiB0aGUgbG93LWxldmVsIHNjYW4gcGFyYW1ldGVycyB1c2VkIGJ5IHRoZSBkcml2ZXIgYXJlIGNoYW5nZWQgdG8KKyAgICAgKiByZWR1Y2UgaW50ZXJmZXJlbmNlIHdpdGggQTJEUCBzdHJlYW1pbmcuCisgICAgICoKKyAgICAgKiBAcGFyYW0gaXNCbHVldG9vdGhQbGF5aW5nIHdoZXRoZXIgdG8gZW5hYmxlIG9yIGRpc2FibGUgdGhpcyBtb2RlCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Qmx1ZXRvb3RoU2Nhbk1vZGUoYm9vbGVhbiBpc0JsdWV0b290aFBsYXlpbmcpIHsKKyAgICAgICAgc2VuZE1lc3NhZ2Uob2J0YWluTWVzc2FnZShDTURfU0VUX0JMVUVUT09USF9TQ0FOX01PREUsIGlzQmx1ZXRvb3RoUGxheWluZyA/IDEgOiAwLCAwKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2F2ZSBjb25maWd1cmF0aW9uIG9uIHN1cHBsaWNhbnQKKyAgICAgKgorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoZSBvcGVyYXRpb24gc3VjY2VlZHMsIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlCisgICAgICoKKyAgICAgKiBUT0RPOiBkZXByZWNhdGUgdGhpcworICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIHN5bmNTYXZlQ29uZmlnKCkgeworICAgICAgICByZXR1cm4gc2VuZFN5bmNNZXNzYWdlKENNRF9TQVZFX0NPTkZJRykuYm9vbFZhbHVlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRPRE86IGRvYworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJlcXVlc3RDbVdha2VMb2NrKCkgeworICAgICAgICBzZW5kTWVzc2FnZShDTURfUkVRVUVTVF9DTV9XQUtFTE9DSyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOworICAgICAgICBTdHJpbmcgTFMgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImxpbmUuc2VwYXJhdG9yIik7CisgICAgICAgIHNiLmFwcGVuZCgiY3VycmVudCBIU00gc3RhdGU6ICIpLmFwcGVuZChnZXRDdXJyZW50U3RhdGUoKS5nZXROYW1lKCkpLmFwcGVuZChMUyk7CisgICAgICAgIHNiLmFwcGVuZCgibUxpbmtQcm9wZXJ0aWVzICIpLmFwcGVuZChtTGlua1Byb3BlcnRpZXMpLmFwcGVuZChMUyk7CisgICAgICAgIHNiLmFwcGVuZCgibVdpZmlJbmZvICIpLmFwcGVuZChtV2lmaUluZm8pLmFwcGVuZChMUyk7CisgICAgICAgIHNiLmFwcGVuZCgibURoY3BJbmZvICIpLmFwcGVuZChtRGhjcEluZm8pLmFwcGVuZChMUyk7CisgICAgICAgIHNiLmFwcGVuZCgibU5ldHdvcmtJbmZvICIpLmFwcGVuZChtTmV0d29ya0luZm8pLmFwcGVuZChMUyk7CisgICAgICAgIHNiLmFwcGVuZCgibU51bUFsbG93ZWRDaGFubmVscyAiKS5hcHBlbmQobU51bUFsbG93ZWRDaGFubmVscykuYXBwZW5kKExTKTsKKyAgICAgICAgc2IuYXBwZW5kKCJtTGFzdFNpZ25hbExldmVsICIpLmFwcGVuZChtTGFzdFNpZ25hbExldmVsKS5hcHBlbmQoTFMpOworICAgICAgICBzYi5hcHBlbmQoIm1MYXN0QnNzaWQgIikuYXBwZW5kKG1MYXN0QnNzaWQpLmFwcGVuZChMUyk7CisgICAgICAgIHNiLmFwcGVuZCgibUxhc3ROZXR3b3JrSWQgIikuYXBwZW5kKG1MYXN0TmV0d29ya0lkKS5hcHBlbmQoTFMpOworICAgICAgICBzYi5hcHBlbmQoIm1FbmFibGVBbGxOZXR3b3JrcyAiKS5hcHBlbmQobUVuYWJsZUFsbE5ldHdvcmtzKS5hcHBlbmQoTFMpOworICAgICAgICBzYi5hcHBlbmQoIm1FbmFibGVSc3NpUG9sbGluZyAiKS5hcHBlbmQobUVuYWJsZVJzc2lQb2xsaW5nKS5hcHBlbmQoTFMpOworICAgICAgICBzYi5hcHBlbmQoIm1QYXNzd29yZEtleU1heUJlSW5jb3JyZWN0ICIpLmFwcGVuZChtUGFzc3dvcmRLZXlNYXlCZUluY29ycmVjdCkuYXBwZW5kKExTKTsKKyAgICAgICAgc2IuYXBwZW5kKCJtUmVjb25uZWN0Q291bnQgIikuYXBwZW5kKG1SZWNvbm5lY3RDb3VudCkuYXBwZW5kKExTKTsKKyAgICAgICAgc2IuYXBwZW5kKCJtSXNTY2FuTW9kZSAiKS5hcHBlbmQobUlzU2Nhbk1vZGUpLmFwcGVuZChMUyk7CisgICAgICAgIHNiLmFwcGVuZCgiU3VwcGxpY2FudCBzdGF0dXMiKS5hcHBlbmQoTFMpCisgICAgICAgICAgICAgICAgLmFwcGVuZChXaWZpTmF0aXZlLnN0YXR1c0NvbW1hbmQoKSkuYXBwZW5kKExTKS5hcHBlbmQoTFMpOworCisgICAgICAgIHNiLmFwcGVuZChXaWZpQ29uZmlnU3RvcmUuZHVtcCgpKTsKKyAgICAgICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7CisgICAgfQorCisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAqIEludGVybmFsIHByaXZhdGUgZnVuY3Rpb25zCisgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgICAgY2xhc3MgU3luY1JldHVybiB7CisgICAgICAgIGJvb2xlYW4gYm9vbFZhbHVlOworICAgICAgICBpbnQgaW50VmFsdWU7CisgICAgICAgIFN0cmluZyBzdHJpbmdWYWx1ZTsKKyAgICAgICAgT2JqZWN0IG9ialZhbHVlOworICAgIH0KKworICAgIGNsYXNzIFN5bmNQYXJhbXMgeworICAgICAgICBPYmplY3QgbVBhcmFtZXRlcjsKKyAgICAgICAgU3luY1JldHVybiBtU3luY1JldHVybjsKKyAgICAgICAgU3luY1BhcmFtcygpIHsKKyAgICAgICAgICAgIG1TeW5jUmV0dXJuID0gbmV3IFN5bmNSZXR1cm4oKTsKKyAgICAgICAgfQorICAgICAgICBTeW5jUGFyYW1zKE9iamVjdCBwKSB7CisgICAgICAgICAgICBtUGFyYW1ldGVyID0gcDsKKyAgICAgICAgICAgIG1TeW5jUmV0dXJuID0gbmV3IFN5bmNSZXR1cm4oKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIG1lc3NhZ2Uub2JqIGlzIHVzZWQgdG8gc3RvcmUgU3luY1BhcmFtcworICAgICAqLworICAgIHByaXZhdGUgU3luY1JldHVybiBzeW5jZWRTZW5kKE1lc3NhZ2UgbXNnKSB7CisgICAgICAgIFN5bmNQYXJhbXMgc3luY1BhcmFtcyA9IChTeW5jUGFyYW1zKSBtc2cub2JqOworICAgICAgICBzeW5jaHJvbml6ZWQoc3luY1BhcmFtcykgeworICAgICAgICAgICAgaWYgKERCRykgTG9nLmQoVEFHLCAic3luY2VkU2VuZCAiICsgbXNnKTsKKyAgICAgICAgICAgIHNlbmRNZXNzYWdlKG1zZyk7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHN5bmNQYXJhbXMud2FpdCgpOworICAgICAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIExvZy5lKFRBRywgInNlbmRTeW5jTWVzc2FnZTogdW5leHBlY3RlZCBpbnRlcnJ1cHRpb24gb2Ygd2FpdCgpIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHN5bmNQYXJhbXMubVN5bmNSZXR1cm47CisgICAgfQorCisgICAgcHJpdmF0ZSBTeW5jUmV0dXJuIHNlbmRTeW5jTWVzc2FnZShNZXNzYWdlIG1zZykgeworICAgICAgICBTeW5jUGFyYW1zIHN5bmNQYXJhbXMgPSBuZXcgU3luY1BhcmFtcygpOworICAgICAgICBtc2cub2JqID0gc3luY1BhcmFtczsKKyAgICAgICAgcmV0dXJuIHN5bmNlZFNlbmQobXNnKTsKKyAgICB9CisKKyAgICBwcml2YXRlIFN5bmNSZXR1cm4gc2VuZFN5bmNNZXNzYWdlKGludCB3aGF0LCBPYmplY3QgcGFyYW0pIHsKKyAgICAgICAgU3luY1BhcmFtcyBzeW5jUGFyYW1zID0gbmV3IFN5bmNQYXJhbXMocGFyYW0pOworICAgICAgICBNZXNzYWdlIG1zZyA9IG9idGFpbk1lc3NhZ2Uod2hhdCwgc3luY1BhcmFtcyk7CisgICAgICAgIHJldHVybiBzeW5jZWRTZW5kKG1zZyk7CisgICAgfQorCisKKyAgICBwcml2YXRlIFN5bmNSZXR1cm4gc2VuZFN5bmNNZXNzYWdlKGludCB3aGF0KSB7CisgICAgICAgIHJldHVybiBzZW5kU3luY01lc3NhZ2Uob2J0YWluTWVzc2FnZSh3aGF0KSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIG5vdGlmeU9uTXNnT2JqZWN0KE1lc3NhZ2UgbXNnKSB7CisgICAgICAgIFN5bmNQYXJhbXMgc3luY1BhcmFtcyA9IChTeW5jUGFyYW1zKSBtc2cub2JqOworICAgICAgICBpZiAoc3luY1BhcmFtcyAhPSBudWxsKSB7CisgICAgICAgICAgICBzeW5jaHJvbml6ZWQoc3luY1BhcmFtcykgeworICAgICAgICAgICAgICAgIGlmIChEQkcpIExvZy5kKFRBRywgIm5vdGlmeU9uTXNnT2JqZWN0ICIgKyBtc2cpOworICAgICAgICAgICAgICAgIHN5bmNQYXJhbXMubm90aWZ5KCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBMb2cuZShUQUcsICJFcnJvciEgc3luY1BhcmFtcyBpbiBub3RpZnlPbk1zZ09iamVjdCBpcyBudWxsIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgc2V0V2lmaVN0YXRlKGludCB3aWZpU3RhdGUpIHsKKyAgICAgICAgZmluYWwgaW50IHByZXZpb3VzV2lmaVN0YXRlID0gbVdpZmlTdGF0ZS5nZXQoKTsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgaWYgKHdpZmlTdGF0ZSA9PSBXSUZJX1NUQVRFX0VOQUJMRUQpIHsKKyAgICAgICAgICAgICAgICBtQmF0dGVyeVN0YXRzLm5vdGVXaWZpT24obUxhc3RFbmFibGVVaWQuZ2V0KCkpOworICAgICAgICAgICAgfSBlbHNlIGlmICh3aWZpU3RhdGUgPT0gV0lGSV9TVEFURV9ESVNBQkxFRCkgeworICAgICAgICAgICAgICAgIG1CYXR0ZXJ5U3RhdHMubm90ZVdpZmlPZmYobUxhc3RFbmFibGVVaWQuZ2V0KCkpOworICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgTG9nLmUoVEFHLCAiRmFpbGVkIHRvIG5vdGUgYmF0dGVyeSBzdGF0cyBpbiB3aWZpIik7CisgICAgICAgIH0KKworICAgICAgICBtV2lmaVN0YXRlLnNldCh3aWZpU3RhdGUpOworCisgICAgICAgIGlmIChEQkcpIExvZy5kKFRBRywgInNldFdpZmlTdGF0ZTogIiArIHN5bmNHZXRXaWZpU3RhdGVCeU5hbWUoKSk7CisKKyAgICAgICAgZmluYWwgSW50ZW50IGludGVudCA9IG5ldyBJbnRlbnQoV2lmaU1hbmFnZXIuV0lGSV9TVEFURV9DSEFOR0VEX0FDVElPTik7CisgICAgICAgIGludGVudC5hZGRGbGFncyhJbnRlbnQuRkxBR19SRUNFSVZFUl9SRUdJU1RFUkVEX09OTFlfQkVGT1JFX0JPT1QpOworICAgICAgICBpbnRlbnQucHV0RXh0cmEoV2lmaU1hbmFnZXIuRVhUUkFfV0lGSV9TVEFURSwgd2lmaVN0YXRlKTsKKyAgICAgICAgaW50ZW50LnB1dEV4dHJhKFdpZmlNYW5hZ2VyLkVYVFJBX1BSRVZJT1VTX1dJRklfU1RBVEUsIHByZXZpb3VzV2lmaVN0YXRlKTsKKyAgICAgICAgbUNvbnRleHQuc2VuZFN0aWNreUJyb2FkY2FzdChpbnRlbnQpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBzZXRXaWZpQXBTdGF0ZShpbnQgd2lmaUFwU3RhdGUpIHsKKyAgICAgICAgZmluYWwgaW50IHByZXZpb3VzV2lmaUFwU3RhdGUgPSBtV2lmaUFwU3RhdGUuZ2V0KCk7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGlmICh3aWZpQXBTdGF0ZSA9PSBXSUZJX0FQX1NUQVRFX0VOQUJMRUQpIHsKKyAgICAgICAgICAgICAgICBtQmF0dGVyeVN0YXRzLm5vdGVXaWZpT24obUxhc3RBcEVuYWJsZVVpZC5nZXQoKSk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHdpZmlBcFN0YXRlID09IFdJRklfQVBfU1RBVEVfRElTQUJMRUQpIHsKKyAgICAgICAgICAgICAgICBtQmF0dGVyeVN0YXRzLm5vdGVXaWZpT2ZmKG1MYXN0QXBFbmFibGVVaWQuZ2V0KCkpOworICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgTG9nLmQoVEFHLCAiRmFpbGVkIHRvIG5vdGUgYmF0dGVyeSBzdGF0cyBpbiB3aWZpIik7CisgICAgICAgIH0KKworICAgICAgICAvLyBVcGRhdGUgc3RhdGUKKyAgICAgICAgbVdpZmlBcFN0YXRlLnNldCh3aWZpQXBTdGF0ZSk7CisKKyAgICAgICAgaWYgKERCRykgTG9nLmQoVEFHLCAic2V0V2lmaUFwU3RhdGU6ICIgKyBzeW5jR2V0V2lmaUFwU3RhdGVCeU5hbWUoKSk7CisKKyAgICAgICAgZmluYWwgSW50ZW50IGludGVudCA9IG5ldyBJbnRlbnQoV2lmaU1hbmFnZXIuV0lGSV9BUF9TVEFURV9DSEFOR0VEX0FDVElPTik7CisgICAgICAgIGludGVudC5hZGRGbGFncyhJbnRlbnQuRkxBR19SRUNFSVZFUl9SRUdJU1RFUkVEX09OTFlfQkVGT1JFX0JPT1QpOworICAgICAgICBpbnRlbnQucHV0RXh0cmEoV2lmaU1hbmFnZXIuRVhUUkFfV0lGSV9BUF9TVEFURSwgd2lmaUFwU3RhdGUpOworICAgICAgICBpbnRlbnQucHV0RXh0cmEoV2lmaU1hbmFnZXIuRVhUUkFfUFJFVklPVVNfV0lGSV9BUF9TVEFURSwgcHJldmlvdXNXaWZpQXBTdGF0ZSk7CisgICAgICAgIG1Db250ZXh0LnNlbmRTdGlja3lCcm9hZGNhc3QoaW50ZW50KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQYXJzZSB0aGUgc2NhbiByZXN1bHQgbGluZSBwYXNzZWQgdG8gdXMgYnkgd3BhX3N1cHBsaWNhbnQgKGhlbHBlcikuCisgICAgICogQHBhcmFtIGxpbmUgdGhlIGxpbmUgdG8gcGFyc2UKKyAgICAgKiBAcmV0dXJuIHRoZSB7QGxpbmsgU2NhblJlc3VsdH0gb2JqZWN0CisgICAgICovCisgICAgcHJpdmF0ZSBTY2FuUmVzdWx0IHBhcnNlU2NhblJlc3VsdChTdHJpbmcgbGluZSkgeworICAgICAgICBTY2FuUmVzdWx0IHNjYW5SZXN1bHQgPSBudWxsOworICAgICAgICBpZiAobGluZSAhPSBudWxsKSB7CisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogQ2FjaGUgaW1wbGVtZW50YXRpb24gKExpbmtlZEhhc2hNYXApIGlzIG5vdCBzeW5jaHJvbml6ZWQsIHRodXMsCisgICAgICAgICAgICAgKiBtdXN0IHN5bmNocm9uaXplZCBoZXJlIQorICAgICAgICAgICAgICovCisgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG1TY2FuUmVzdWx0Q2FjaGUpIHsKKyAgICAgICAgICAgICAgICBTdHJpbmdbXSByZXN1bHQgPSBzY2FuUmVzdWx0UGF0dGVybi5zcGxpdChsaW5lKTsKKyAgICAgICAgICAgICAgICBpZiAoMyA8PSByZXN1bHQubGVuZ3RoICYmIHJlc3VsdC5sZW5ndGggPD0gNSkgeworICAgICAgICAgICAgICAgICAgICBTdHJpbmcgYnNzaWQgPSByZXN1bHRbMF07CisgICAgICAgICAgICAgICAgICAgIC8vIGJzc2lkIHwgZnJlcXVlbmN5IHwgbGV2ZWwgfCBmbGFncyB8IHNzaWQKKyAgICAgICAgICAgICAgICAgICAgaW50IGZyZXF1ZW5jeTsKKyAgICAgICAgICAgICAgICAgICAgaW50IGxldmVsOworICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgZnJlcXVlbmN5ID0gSW50ZWdlci5wYXJzZUludChyZXN1bHRbMV0pOworICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWwgPSBJbnRlZ2VyLnBhcnNlSW50KHJlc3VsdFsyXSk7CisgICAgICAgICAgICAgICAgICAgICAgICAvKiBzb21lIGltcGxlbWVudGF0aW9ucyBhdm9pZCBuZWdhdGl2ZSB2YWx1ZXMgYnkgYWRkaW5nIDI1NgorICAgICAgICAgICAgICAgICAgICAgICAgICogc28gd2UgbmVlZCB0byBhZGp1c3QgZm9yIHRoYXQgaGVyZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxldmVsID4gMCkgbGV2ZWwgLT0gMjU2OworICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgZnJlcXVlbmN5ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxldmVsID0gMDsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgICAgICAgICAqIFRoZSBmb3JtYXR0aW5nIG9mIHRoZSByZXN1bHRzIHJldHVybmVkIGJ5CisgICAgICAgICAgICAgICAgICAgICAqIHdwYV9zdXBwbGljYW50IGlzIGludGVuZGVkIHRvIG1ha2UgdGhlIGZpZWxkcworICAgICAgICAgICAgICAgICAgICAgKiBsaW5lIHVwIG5pY2VseSB3aGVuIHByaW50ZWQsCisgICAgICAgICAgICAgICAgICAgICAqIG5vdCB0byBtYWtlIHRoZW0gZWFzeSB0byBwYXJzZS4gU28gd2UgaGF2ZSB0bworICAgICAgICAgICAgICAgICAgICAgKiBhcHBseSBzb21lIGhldXJpc3RpY3MgdG8gZmlndXJlIG91dCB3aGljaCBmaWVsZAorICAgICAgICAgICAgICAgICAgICAgKiBpcyB0aGUgU1NJRCBhbmQgd2hpY2ggZmllbGQgaXMgdGhlIGZsYWdzLgorICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHNzaWQ7CisgICAgICAgICAgICAgICAgICAgIFN0cmluZyBmbGFnczsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdC5sZW5ndGggPT0gNCkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdFszXS5jaGFyQXQoMCkgPT0gJ1snKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MgPSByZXN1bHRbM107CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3NpZCA9ICIiOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncyA9ICIiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNzaWQgPSByZXN1bHRbM107CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocmVzdWx0Lmxlbmd0aCA9PSA1KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmbGFncyA9IHJlc3VsdFszXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNzaWQgPSByZXN1bHRbNF07CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBIZXJlLCB3ZSBtdXN0IGhhdmUgMyBmaWVsZHM6IG5vIGZsYWdzIGFuZCBzc2lkCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBzZXQKKyAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzID0gIiI7CisgICAgICAgICAgICAgICAgICAgICAgICBzc2lkID0gIiI7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAvLyBic3NpZCArIHNzaWQgaXMgdGhlIGhhc2gga2V5CisgICAgICAgICAgICAgICAgICAgIFN0cmluZyBrZXkgPSBic3NpZCArIHNzaWQ7CisgICAgICAgICAgICAgICAgICAgIHNjYW5SZXN1bHQgPSBtU2NhblJlc3VsdENhY2hlLmdldChrZXkpOworICAgICAgICAgICAgICAgICAgICBpZiAoc2NhblJlc3VsdCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzY2FuUmVzdWx0LmxldmVsID0gbGV2ZWw7CisgICAgICAgICAgICAgICAgICAgICAgICBzY2FuUmVzdWx0LlNTSUQgPSBzc2lkOworICAgICAgICAgICAgICAgICAgICAgICAgc2NhblJlc3VsdC5jYXBhYmlsaXRpZXMgPSBmbGFnczsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNjYW5SZXN1bHQuZnJlcXVlbmN5ID0gZnJlcXVlbmN5OworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gRG8gbm90IGFkZCBzY2FuIHJlc3VsdHMgdGhhdCBoYXZlIG5vIFNTSUQgc2V0CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoMCA8IHNzaWQudHJpbSgpLmxlbmd0aCgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NhblJlc3VsdCA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBTY2FuUmVzdWx0KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3NpZCwgYnNzaWQsIGZsYWdzLCBsZXZlbCwgZnJlcXVlbmN5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtU2NhblJlc3VsdENhY2hlLnB1dChrZXksIHNjYW5SZXN1bHQpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiTWlzZm9ybWF0dGVkIHNjYW4gcmVzdWx0IHRleHQgd2l0aCAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0Lmxlbmd0aCArICIgZmllbGRzOiAiICsgbGluZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHNjYW5SZXN1bHQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogc2NhblJlc3VsdHMgaW5wdXQgZm9ybWF0CisgICAgICogMDA6YmI6Y2M6ZGQ6Y2M6ZWUgICAgICAgMjQyNyAgICAxNjYgICAgIFtXUEEtRUFQLVRLSVBdW1dQQTItRUFQLUNDTVBdICAgTmV0MQorICAgICAqIDAwOmJiOmNjOmRkOmNjOmZmICAgICAgIDI0MTIgICAgMTY1ICAgICBbV1BBLUVBUC1US0lQXVtXUEEyLUVBUC1DQ01QXSAgIE5ldDIKKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgc2V0U2NhblJlc3VsdHMoU3RyaW5nIHNjYW5SZXN1bHRzKSB7CisgICAgICAgIGlmIChzY2FuUmVzdWx0cyA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBMaXN0PFNjYW5SZXN1bHQ+IHNjYW5MaXN0ID0gbmV3IEFycmF5TGlzdDxTY2FuUmVzdWx0PigpOworCisgICAgICAgIGludCBsaW5lQ291bnQgPSAwOworCisgICAgICAgIGludCBzY2FuUmVzdWx0c0xlbiA9IHNjYW5SZXN1bHRzLmxlbmd0aCgpOworICAgICAgICAvLyBQYXJzZSB0aGUgcmVzdWx0IHN0cmluZywga2VlcGluZyBpbiBtaW5kIHRoYXQgdGhlIGxhc3QgbGluZSBkb2VzCisgICAgICAgIC8vIG5vdCBlbmQgd2l0aCBhIG5ld2xpbmUuCisgICAgICAgIGZvciAoaW50IGxpbmVCZWcgPSAwLCBsaW5lRW5kID0gMDsgbGluZUVuZCA8PSBzY2FuUmVzdWx0c0xlbjsgKytsaW5lRW5kKSB7CisgICAgICAgICAgICBpZiAobGluZUVuZCA9PSBzY2FuUmVzdWx0c0xlbiB8fCBzY2FuUmVzdWx0cy5jaGFyQXQobGluZUVuZCkgPT0gJ1xuJykgeworICAgICAgICAgICAgICAgICsrbGluZUNvdW50OworCisgICAgICAgICAgICAgICAgaWYgKGxpbmVDb3VudCA9PSAxKSB7CisgICAgICAgICAgICAgICAgICAgIGxpbmVCZWcgPSBsaW5lRW5kICsgMTsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChsaW5lRW5kID4gbGluZUJlZykgeworICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbGluZSA9IHNjYW5SZXN1bHRzLnN1YnN0cmluZyhsaW5lQmVnLCBsaW5lRW5kKTsKKyAgICAgICAgICAgICAgICAgICAgU2NhblJlc3VsdCBzY2FuUmVzdWx0ID0gcGFyc2VTY2FuUmVzdWx0KGxpbmUpOworICAgICAgICAgICAgICAgICAgICBpZiAoc2NhblJlc3VsdCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzY2FuTGlzdC5hZGQoc2NhblJlc3VsdCk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJtaXNmb3JtYXR0ZWQgc2NhbiByZXN1bHQgZm9yOiAiICsgbGluZSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbGluZUJlZyA9IGxpbmVFbmQgKyAxOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgbVNjYW5SZXN1bHRzID0gc2Nhbkxpc3Q7CisgICAgfQorCisgICAgcHJpdmF0ZSBTdHJpbmcgZmV0Y2hTU0lEKCkgeworICAgICAgICBTdHJpbmcgc3RhdHVzID0gV2lmaU5hdGl2ZS5zdGF0dXNDb21tYW5kKCk7CisgICAgICAgIGlmIChzdGF0dXMgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICAgICAgLy8gZXh0cmFjdCBzc2lkIGZyb20gYSBzZXJpZXMgb2YgIm5hbWU9dmFsdWUiCisgICAgICAgIFN0cmluZ1tdIGxpbmVzID0gc3RhdHVzLnNwbGl0KCJcbiIpOworICAgICAgICBmb3IgKFN0cmluZyBsaW5lIDogbGluZXMpIHsKKyAgICAgICAgICAgIFN0cmluZ1tdIHByb3AgPSBsaW5lLnNwbGl0KCIgKj0gKiIpOworICAgICAgICAgICAgaWYgKHByb3AubGVuZ3RoIDwgMikgY29udGludWU7CisgICAgICAgICAgICBTdHJpbmcgbmFtZSA9IHByb3BbMF07CisgICAgICAgICAgICBTdHJpbmcgdmFsdWUgPSBwcm9wWzFdOworICAgICAgICAgICAgaWYgKG5hbWUuZXF1YWxzSWdub3JlQ2FzZSgic3NpZCIpKSByZXR1cm4gdmFsdWU7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGNvbmZpZ3VyZUxpbmtQcm9wZXJ0aWVzKCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgbUxpbmtQcm9wZXJ0aWVzLnNldEludGVyZmFjZShOZXR3b3JrSW50ZXJmYWNlLmdldEJ5TmFtZShtSW50ZXJmYWNlTmFtZSkpOworICAgICAgICB9IGNhdGNoIChTb2NrZXRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgTG9nLmUoVEFHLCAiU29ja2V0RXhjZXB0aW9uIGNyZWF0aW5nIE5ldHdvcmtJbnRlcmZhY2UgZnJvbSAiICsgbUludGVyZmFjZU5hbWUgKworICAgICAgICAgICAgICAgICAgICAiLiBlPSIgKyBlKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgTG9nLmUoVEFHLCAiTlBFIGNyZWF0aW5nIE5ldHdvcmtJbnRlcmZhY2UuIGU9IiArIGUpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIC8vIFRPRE8gLSBmaXggdGhpcyBmb3IgdjYKKyAgICAgICAgc3luY2hyb25pemVkIChtRGhjcEluZm8pIHsKKyAgICAgICAgICAgIG1MaW5rUHJvcGVydGllcy5hZGRBZGRyZXNzKE5ldHdvcmtVdGlscy5pbnRUb0luZXRBZGRyZXNzKG1EaGNwSW5mby5pcEFkZHJlc3MpKTsKKyAgICAgICAgICAgIG1MaW5rUHJvcGVydGllcy5zZXRHYXRld2F5KE5ldHdvcmtVdGlscy5pbnRUb0luZXRBZGRyZXNzKG1EaGNwSW5mby5nYXRld2F5KSk7CisgICAgICAgICAgICBtTGlua1Byb3BlcnRpZXMuYWRkRG5zKE5ldHdvcmtVdGlscy5pbnRUb0luZXRBZGRyZXNzKG1EaGNwSW5mby5kbnMxKSk7CisgICAgICAgICAgICBtTGlua1Byb3BlcnRpZXMuYWRkRG5zKE5ldHdvcmtVdGlscy5pbnRUb0luZXRBZGRyZXNzKG1EaGNwSW5mby5kbnMyKSk7CisgICAgICAgIH0KKyAgICAgICAgLy8gVE9ETyAtIGFkZCBwcm94eSBpbmZvCisgICAgfQorCisgICAgcHJpdmF0ZSBpbnQgZ2V0TWF4RGhjcFJldHJpZXMoKSB7CisgICAgICAgIHJldHVybiBTZXR0aW5ncy5TZWN1cmUuZ2V0SW50KG1Db250ZXh0LmdldENvbnRlbnRSZXNvbHZlcigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZXR0aW5ncy5TZWN1cmUuV0lGSV9NQVhfREhDUF9SRVRSWV9DT1VOVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREVGQVVMVF9NQVhfREhDUF9SRVRSSUVTKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXaGV0aGVyIHRvIGRpc2FibGUgY29leGlzdGVuY2UgbW9kZSB3aGlsZSBvYnRhaW5pbmcgSVAgYWRkcmVzcy4gVGhpcworICAgICAqIGxvZ2ljIHdpbGwgcmV0dXJuIHRydWUgb25seSBpZiB0aGUgY3VycmVudCBibHVldG9vdGgKKyAgICAgKiBoZWFkc2V0L2hhbmRzZnJlZSBzdGF0ZSBpcyBkaXNjb25uZWN0ZWQuIFRoaXMgbWVhbnMgaWYgaXQgaXMgaW4gYW4KKyAgICAgKiBlcnJvciBzdGF0ZSwgd2Ugd2lsbCBOT1QgZGlzYWJsZSBjb2V4aXN0ZW5jZSBtb2RlIHRvIGVyciBvbiB0aGUgc2lkZQorICAgICAqIG9mIHNhZmV0eS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gV2hldGhlciB0byBkaXNhYmxlIGNvZXhpc3RlbmNlIG1vZGUuCisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIHNob3VsZERpc2FibGVDb2V4aXN0ZW5jZU1vZGUoKSB7CisgICAgICAgIGludCBzdGF0ZSA9IG1CbHVldG9vdGhIZWFkc2V0LmdldFN0YXRlKG1CbHVldG9vdGhIZWFkc2V0LmdldEN1cnJlbnRIZWFkc2V0KCkpOworICAgICAgICByZXR1cm4gc3RhdGUgPT0gQmx1ZXRvb3RoSGVhZHNldC5TVEFURV9ESVNDT05ORUNURUQ7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGNoZWNrSXNCbHVldG9vdGhQbGF5aW5nKCkgeworICAgICAgICBib29sZWFuIGlzQmx1ZXRvb3RoUGxheWluZyA9IGZhbHNlOworICAgICAgICBTZXQ8Qmx1ZXRvb3RoRGV2aWNlPiBjb25uZWN0ZWQgPSBtQmx1ZXRvb3RoQTJkcC5nZXRDb25uZWN0ZWRTaW5rcygpOworCisgICAgICAgIGZvciAoQmx1ZXRvb3RoRGV2aWNlIGRldmljZSA6IGNvbm5lY3RlZCkgeworICAgICAgICAgICAgaWYgKG1CbHVldG9vdGhBMmRwLmdldFNpbmtTdGF0ZShkZXZpY2UpID09IEJsdWV0b290aEEyZHAuU1RBVEVfUExBWUlORykgeworICAgICAgICAgICAgICAgIGlzQmx1ZXRvb3RoUGxheWluZyA9IHRydWU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgc2V0Qmx1ZXRvb3RoU2Nhbk1vZGUoaXNCbHVldG9vdGhQbGF5aW5nKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgc2VuZFNjYW5SZXN1bHRzQXZhaWxhYmxlQnJvYWRjYXN0KCkgeworICAgICAgICBpZiAoIUFjdGl2aXR5TWFuYWdlck5hdGl2ZS5pc1N5c3RlbVJlYWR5KCkpIHJldHVybjsKKworICAgICAgICBtQ29udGV4dC5zZW5kQnJvYWRjYXN0KG5ldyBJbnRlbnQoV2lmaU1hbmFnZXIuU0NBTl9SRVNVTFRTX0FWQUlMQUJMRV9BQ1RJT04pKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgc2VuZFJzc2lDaGFuZ2VCcm9hZGNhc3QoZmluYWwgaW50IG5ld1Jzc2kpIHsKKyAgICAgICAgaWYgKCFBY3Rpdml0eU1hbmFnZXJOYXRpdmUuaXNTeXN0ZW1SZWFkeSgpKSByZXR1cm47CisKKyAgICAgICAgSW50ZW50IGludGVudCA9IG5ldyBJbnRlbnQoV2lmaU1hbmFnZXIuUlNTSV9DSEFOR0VEX0FDVElPTik7CisgICAgICAgIGludGVudC5wdXRFeHRyYShXaWZpTWFuYWdlci5FWFRSQV9ORVdfUlNTSSwgbmV3UnNzaSk7CisgICAgICAgIG1Db250ZXh0LnNlbmRCcm9hZGNhc3QoaW50ZW50KTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgc2VuZE5ldHdvcmtTdGF0ZUNoYW5nZUJyb2FkY2FzdChTdHJpbmcgYnNzaWQpIHsKKyAgICAgICAgSW50ZW50IGludGVudCA9IG5ldyBJbnRlbnQoV2lmaU1hbmFnZXIuTkVUV09SS19TVEFURV9DSEFOR0VEX0FDVElPTik7CisgICAgICAgIGludGVudC5hZGRGbGFncyhJbnRlbnQuRkxBR19SRUNFSVZFUl9SRUdJU1RFUkVEX09OTFlfQkVGT1JFX0JPT1QKKyAgICAgICAgICAgICAgICB8IEludGVudC5GTEFHX1JFQ0VJVkVSX1JFUExBQ0VfUEVORElORyk7CisgICAgICAgIGludGVudC5wdXRFeHRyYShXaWZpTWFuYWdlci5FWFRSQV9ORVRXT1JLX0lORk8sIG1OZXR3b3JrSW5mbyk7CisgICAgICAgIGludGVudC5wdXRFeHRyYShXaWZpTWFuYWdlci5FWFRSQV9MSU5LX1BST1BFUlRJRVMsIG1MaW5rUHJvcGVydGllcyk7CisgICAgICAgIGlmIChic3NpZCAhPSBudWxsKQorICAgICAgICAgICAgaW50ZW50LnB1dEV4dHJhKFdpZmlNYW5hZ2VyLkVYVFJBX0JTU0lELCBic3NpZCk7CisgICAgICAgIG1Db250ZXh0LnNlbmRTdGlja3lCcm9hZGNhc3QoaW50ZW50KTsKKyAgICB9CisKKyAgICAvKiBUT0RPOiBVbnVzZWQgZm9yIG5vdywgd2lsbCBiZSB1c2VkIHdoZW4gaXAgY2hhbmdlIG9uIGNvbm5lY3RlZCBuZXR3b3JrIGlzIGhhbmRsZWQgKi8KKyAgICBwcml2YXRlIHZvaWQgc2VuZENvbmZpZ0NoYW5nZUJyb2FkY2FzdCgpIHsKKyAgICAgICAgaWYgKCFBY3Rpdml0eU1hbmFnZXJOYXRpdmUuaXNTeXN0ZW1SZWFkeSgpKSByZXR1cm47CisgICAgICAgIEludGVudCBpbnRlbnQgPSBuZXcgSW50ZW50KFdpZmlNYW5hZ2VyLkNPTkZJR19DSEFOR0VEX0FDVElPTik7CisgICAgICAgIGludGVudC5wdXRFeHRyYShXaWZpTWFuYWdlci5FWFRSQV9MSU5LX1BST1BFUlRJRVMsIG1MaW5rUHJvcGVydGllcyk7CisgICAgICAgIG1Db250ZXh0LnNlbmRCcm9hZGNhc3QoaW50ZW50KTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgc2VuZFN1cHBsaWNhbnRTdGF0ZUNoYW5nZWRCcm9hZGNhc3QoU3RhdGVDaGFuZ2VSZXN1bHQgc2MsIGJvb2xlYW4gZmFpbGVkQXV0aCkgeworICAgICAgICBJbnRlbnQgaW50ZW50ID0gbmV3IEludGVudChXaWZpTWFuYWdlci5TVVBQTElDQU5UX1NUQVRFX0NIQU5HRURfQUNUSU9OKTsKKyAgICAgICAgaW50ZW50LmFkZEZsYWdzKEludGVudC5GTEFHX1JFQ0VJVkVSX1JFR0lTVEVSRURfT05MWV9CRUZPUkVfQk9PVAorICAgICAgICAgICAgICAgIHwgSW50ZW50LkZMQUdfUkVDRUlWRVJfUkVQTEFDRV9QRU5ESU5HKTsKKyAgICAgICAgaW50ZW50LnB1dEV4dHJhKFdpZmlNYW5hZ2VyLkVYVFJBX05FV19TVEFURSwgKFBhcmNlbGFibGUpc2Muc3RhdGUpOworICAgICAgICBpZiAoZmFpbGVkQXV0aCkgeworICAgICAgICAgICAgaW50ZW50LnB1dEV4dHJhKAorICAgICAgICAgICAgICAgIFdpZmlNYW5hZ2VyLkVYVFJBX1NVUFBMSUNBTlRfRVJST1IsCisgICAgICAgICAgICAgICAgV2lmaU1hbmFnZXIuRVJST1JfQVVUSEVOVElDQVRJTkcpOworICAgICAgICB9CisgICAgICAgIG1Db250ZXh0LnNlbmRTdGlja3lCcm9hZGNhc3QoaW50ZW50KTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgc2VuZFN1cHBsaWNhbnRDb25uZWN0aW9uQ2hhbmdlZEJyb2FkY2FzdChib29sZWFuIGNvbm5lY3RlZCkgeworICAgICAgICBpZiAoIUFjdGl2aXR5TWFuYWdlck5hdGl2ZS5pc1N5c3RlbVJlYWR5KCkpIHJldHVybjsKKworICAgICAgICBJbnRlbnQgaW50ZW50ID0gbmV3IEludGVudChXaWZpTWFuYWdlci5TVVBQTElDQU5UX0NPTk5FQ1RJT05fQ0hBTkdFX0FDVElPTik7CisgICAgICAgIGludGVudC5wdXRFeHRyYShXaWZpTWFuYWdlci5FWFRSQV9TVVBQTElDQU5UX0NPTk5FQ1RFRCwgY29ubmVjdGVkKTsKKyAgICAgICAgbUNvbnRleHQuc2VuZEJyb2FkY2FzdChpbnRlbnQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlY29yZCB0aGUgZGV0YWlsZWQgc3RhdGUgb2YgYSBuZXR3b3JrLgorICAgICAqIEBwYXJhbSBzdGF0ZSB0aGUgbmV3IEB7Y29kZSBEZXRhaWxlZFN0YXRlfQorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBzZXREZXRhaWxlZFN0YXRlKE5ldHdvcmtJbmZvLkRldGFpbGVkU3RhdGUgc3RhdGUpIHsKKyAgICAgICAgTG9nLmQoVEFHLCAic2V0RGV0YWlsZWQgc3RhdGUsIG9sZCA9IgorICAgICAgICAgICAgICAgICsgbU5ldHdvcmtJbmZvLmdldERldGFpbGVkU3RhdGUoKSArICIgYW5kIG5ldyBzdGF0ZT0iICsgc3RhdGUpOworICAgICAgICBpZiAoc3RhdGUgIT0gbU5ldHdvcmtJbmZvLmdldERldGFpbGVkU3RhdGUoKSkgeworICAgICAgICAgICAgbU5ldHdvcmtJbmZvLnNldERldGFpbGVkU3RhdGUoc3RhdGUsIG51bGwsIG51bGwpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUG9sbCBmb3IgaW5mbyBub3QgcmVwb3J0ZWQgdmlhIGV2ZW50cworICAgICAqIFJTU0kgJiBMaW5rc3BlZWQKKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgcmVxdWVzdFBvbGxlZEluZm8oKSB7CisgICAgICAgIGludCBuZXdSc3NpID0gV2lmaU5hdGl2ZS5nZXRSc3NpQ29tbWFuZCgpOworICAgICAgICBpZiAobmV3UnNzaSAhPSAtMSAmJiAtMjAwIDwgbmV3UnNzaSAmJiBuZXdSc3NpIDwgMjU2KSB7IC8vIHNjcmVlbiBvdXQgaW52YWxpZCB2YWx1ZXMKKyAgICAgICAgICAgIC8qIHNvbWUgaW1wbGVtZW50YXRpb25zIGF2b2lkIG5lZ2F0aXZlIHZhbHVlcyBieSBhZGRpbmcgMjU2CisgICAgICAgICAgICAgKiBzbyB3ZSBuZWVkIHRvIGFkanVzdCBmb3IgdGhhdCBoZXJlLgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBpZiAobmV3UnNzaSA+IDApIG5ld1Jzc2kgLT0gMjU2OworICAgICAgICAgICAgbVdpZmlJbmZvLnNldFJzc2kobmV3UnNzaSk7CisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogUmF0aGVyIHRoZW4gc2VuZGluZyB0aGUgcmF3IFJTU0kgb3V0IGV2ZXJ5IHRpbWUgaXQKKyAgICAgICAgICAgICAqIGNoYW5nZXMsIHdlIHByZWNhbGN1bGF0ZSB0aGUgc2lnbmFsIGxldmVsIHRoYXQgd291bGQKKyAgICAgICAgICAgICAqIGJlIGRpc3BsYXllZCBpbiB0aGUgc3RhdHVzIGJhciwgYW5kIG9ubHkgc2VuZCB0aGUKKyAgICAgICAgICAgICAqIGJyb2FkY2FzdCBpZiB0aGF0IG11Y2ggbW9yZSBjb2Fyc2UtZ3JhaW5lZCBudW1iZXIKKyAgICAgICAgICAgICAqIGNoYW5nZXMuIFRoaXMgY3V0cyBkb3duIGdyZWF0bHkgb24gdGhlIG51bWJlciBvZgorICAgICAgICAgICAgICogYnJvYWRjYXN0cywgYXQgdGhlIGNvc3Qgb2Ygbm90IG1XaWZpSW5mb3JtaW5nIG90aGVycworICAgICAgICAgICAgICogaW50ZXJlc3RlZCBpbiBSU1NJIG9mIGFsbCB0aGUgY2hhbmdlcyBpbiBzaWduYWwKKyAgICAgICAgICAgICAqIGxldmVsLgorICAgICAgICAgICAgICovCisgICAgICAgICAgICAvLyBUT0RPOiBUaGUgc2Vjb25kIGFyZyB0byB0aGUgY2FsbCBiZWxvdyBuZWVkcyB0byBiZSBhIHN5bWJvbCBzb21ld2hlcmUsIGJ1dAorICAgICAgICAgICAgLy8gaXQncyBhY3R1YWxseSB0aGUgc2l6ZSBvZiBhbiBhcnJheSBvZiBpY29ucyB0aGF0J3MgcHJpdmF0ZQorICAgICAgICAgICAgLy8gdG8gU3RhdHVzQmFyIFBvbGljeS4KKyAgICAgICAgICAgIGludCBuZXdTaWduYWxMZXZlbCA9IFdpZmlNYW5hZ2VyLmNhbGN1bGF0ZVNpZ25hbExldmVsKG5ld1Jzc2ksIDQpOworICAgICAgICAgICAgaWYgKG5ld1NpZ25hbExldmVsICE9IG1MYXN0U2lnbmFsTGV2ZWwpIHsKKyAgICAgICAgICAgICAgICBzZW5kUnNzaUNoYW5nZUJyb2FkY2FzdChuZXdSc3NpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1MYXN0U2lnbmFsTGV2ZWwgPSBuZXdTaWduYWxMZXZlbDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1XaWZpSW5mby5zZXRSc3NpKC0yMDApOworICAgICAgICB9CisgICAgICAgIGludCBuZXdMaW5rU3BlZWQgPSBXaWZpTmF0aXZlLmdldExpbmtTcGVlZENvbW1hbmQoKTsKKyAgICAgICAgaWYgKG5ld0xpbmtTcGVlZCAhPSAtMSkgeworICAgICAgICAgICAgbVdpZmlJbmZvLnNldExpbmtTcGVlZChuZXdMaW5rU3BlZWQpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVzZXRzIHRoZSBXaS1GaSBDb25uZWN0aW9ucyBieSBjbGVhcmluZyBhbnkgc3RhdGUsIHJlc2V0dGluZyBhbnkgc29ja2V0cworICAgICAqIHVzaW5nIHRoZSBpbnRlcmZhY2UsIHN0b3BwaW5nIERIQ1AgJiBkaXNhYmxpbmcgaW50ZXJmYWNlCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIGhhbmRsZU5ldHdvcmtEaXNjb25uZWN0KCkgeworICAgICAgICBMb2cuZChUQUcsICJSZXNldCBjb25uZWN0aW9ucyBhbmQgc3RvcHBpbmcgREhDUCIpOworCisgICAgICAgIC8qCisgICAgICAgICAqIFJlc2V0IGNvbm5lY3Rpb25zICYgc3RvcCBESENQCisgICAgICAgICAqLworICAgICAgICBOZXR3b3JrVXRpbHMucmVzZXRDb25uZWN0aW9ucyhtSW50ZXJmYWNlTmFtZSk7CisKKyAgICAgICAgaWYgKCFOZXR3b3JrVXRpbHMuc3RvcERoY3AobUludGVyZmFjZU5hbWUpKSB7CisgICAgICAgICAgICBMb2cuZShUQUcsICJDb3VsZCBub3Qgc3RvcCBESENQIik7CisgICAgICAgIH0KKworICAgICAgICAvKiBEaXNhYmxlIGludGVyZmFjZSAqLworICAgICAgICBOZXR3b3JrVXRpbHMuZGlzYWJsZUludGVyZmFjZShtSW50ZXJmYWNlTmFtZSk7CisKKyAgICAgICAgLyogc2VuZCBldmVudCB0byBDTSAmIG5ldHdvcmsgY2hhbmdlIGJyb2FkY2FzdCAqLworICAgICAgICBzZXREZXRhaWxlZFN0YXRlKERldGFpbGVkU3RhdGUuRElTQ09OTkVDVEVEKTsKKyAgICAgICAgc2VuZE5ldHdvcmtTdGF0ZUNoYW5nZUJyb2FkY2FzdChtTGFzdEJzc2lkKTsKKworICAgICAgICAvKiBSZXNldCBkYXRhIHN0cnVjdHVyZXMgKi8KKyAgICAgICAgbVdpZmlJbmZvLnNldElwQWRkcmVzcygwKTsKKyAgICAgICAgbVdpZmlJbmZvLnNldEJTU0lEKG51bGwpOworICAgICAgICBtV2lmaUluZm8uc2V0U1NJRChudWxsKTsKKyAgICAgICAgbVdpZmlJbmZvLnNldE5ldHdvcmtJZCgtMSk7CisKKyAgICAgICAgLyogQ2xlYXIgbmV0d29yayBwcm9wZXJ0aWVzICovCisgICAgICAgIG1MaW5rUHJvcGVydGllcy5jbGVhcigpOworCisgICAgICAgIG1MYXN0QnNzaWQ9IG51bGw7CisgICAgICAgIG1MYXN0TmV0d29ya0lkID0gLTE7CisKKyAgICB9CisKKworICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgKiBOb3RpZmljYXRpb25zIGZyb20gV2lmaU1vbml0b3IKKyAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyAgICAvKioKKyAgICAgKiBBIHN0cnVjdHVyZSBmb3Igc3VwcGx5aW5nIGluZm9ybWF0aW9uIGFib3V0IGEgc3VwcGxpY2FudCBzdGF0ZQorICAgICAqIGNoYW5nZSBpbiB0aGUgU1RBVEVfQ0hBTkdFIGV2ZW50IG1lc3NhZ2UgdGhhdCBjb21lcyBmcm9tIHRoZQorICAgICAqIFdpZmlNb25pdG9yCisgICAgICogdGhyZWFkLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIFN0YXRlQ2hhbmdlUmVzdWx0IHsKKyAgICAgICAgU3RhdGVDaGFuZ2VSZXN1bHQoaW50IG5ldHdvcmtJZCwgU3RyaW5nIEJTU0lELCBPYmplY3Qgc3RhdGUpIHsKKyAgICAgICAgICAgIHRoaXMuc3RhdGUgPSBzdGF0ZTsKKyAgICAgICAgICAgIHRoaXMuQlNTSUQgPSBCU1NJRDsKKyAgICAgICAgICAgIHRoaXMubmV0d29ya0lkID0gbmV0d29ya0lkOworICAgICAgICB9CisgICAgICAgIGludCBuZXR3b3JrSWQ7CisgICAgICAgIFN0cmluZyBCU1NJRDsKKyAgICAgICAgT2JqZWN0IHN0YXRlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNlbmQgdGhlIHRyYWNrZXIgYSBub3RpZmljYXRpb24gdGhhdCBhIHVzZXItZW50ZXJlZCBwYXNzd29yZCBrZXkKKyAgICAgKiBtYXkgYmUgaW5jb3JyZWN0IChpLmUuLCBjYXVzZWQgYXV0aGVudGljYXRpb24gdG8gZmFpbCkuCisgICAgICovCisgICAgdm9pZCBub3RpZnlQYXNzd29yZEtleU1heUJlSW5jb3JyZWN0KCkgeworICAgICAgICBzZW5kTWVzc2FnZShQQVNTV09SRF9NQVlfQkVfSU5DT1JSRUNUX0VWRU5UKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZW5kIHRoZSB0cmFja2VyIGEgbm90aWZpY2F0aW9uIHRoYXQgYSBjb25uZWN0aW9uIHRvIHRoZSBzdXBwbGljYW50CisgICAgICogZGFlbW9uIGhhcyBiZWVuIGVzdGFibGlzaGVkLgorICAgICAqLworICAgIHZvaWQgbm90aWZ5U3VwcGxpY2FudENvbm5lY3Rpb24oKSB7CisgICAgICAgIHNlbmRNZXNzYWdlKFNVUF9DT05ORUNUSU9OX0VWRU5UKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZW5kIHRoZSB0cmFja2VyIGEgbm90aWZpY2F0aW9uIHRoYXQgYSBjb25uZWN0aW9uIHRvIHRoZSBzdXBwbGljYW50CisgICAgICogZGFlbW9uIGhhcyBiZWVuIGVzdGFibGlzaGVkLgorICAgICAqLworICAgIHZvaWQgbm90aWZ5U3VwcGxpY2FudExvc3QoKSB7CisgICAgICAgIHNlbmRNZXNzYWdlKFNVUF9ESVNDT05ORUNUSU9OX0VWRU5UKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZW5kIHRoZSB0cmFja2VyIGEgbm90aWZpY2F0aW9uIHRoYXQgdGhlIHN0YXRlIG9mIFdpZmkgY29ubmVjdGl2aXR5CisgICAgICogaGFzIGNoYW5nZWQuCisgICAgICogQHBhcmFtIG5ldHdvcmtJZCB0aGUgY29uZmlndXJlZCBuZXR3b3JrIG9uIHdoaWNoIHRoZSBzdGF0ZSBjaGFuZ2Ugb2NjdXJyZWQKKyAgICAgKiBAcGFyYW0gbmV3U3RhdGUgdGhlIG5ldyBuZXR3b3JrIHN0YXRlCisgICAgICogQHBhcmFtIEJTU0lEIHdoZW4gdGhlIG5ldyBzdGF0ZSBpcyB7QGxpbmsgRGV0YWlsZWRTdGF0ZSNDT05ORUNURUQKKyAgICAgKiBOZXR3b3JrSW5mby5EZXRhaWxlZFN0YXRlLkNPTk5FQ1RFRH0sCisgICAgICogdGhpcyBpcyB0aGUgTUFDIGFkZHJlc3Mgb2YgdGhlIGFjY2VzcyBwb2ludC4gT3RoZXJ3aXNlLCBpdAorICAgICAqIGlzIHtAY29kZSBudWxsfS4KKyAgICAgKi8KKyAgICB2b2lkIG5vdGlmeU5ldHdvcmtTdGF0ZUNoYW5nZShEZXRhaWxlZFN0YXRlIG5ld1N0YXRlLCBTdHJpbmcgQlNTSUQsIGludCBuZXR3b3JrSWQpIHsKKyAgICAgICAgaWYgKG5ld1N0YXRlID09IE5ldHdvcmtJbmZvLkRldGFpbGVkU3RhdGUuQ09OTkVDVEVEKSB7CisgICAgICAgICAgICBzZW5kTWVzc2FnZShvYnRhaW5NZXNzYWdlKE5FVFdPUktfQ09OTkVDVElPTl9FVkVOVCwKKyAgICAgICAgICAgICAgICAgICAgbmV3IFN0YXRlQ2hhbmdlUmVzdWx0KG5ldHdvcmtJZCwgQlNTSUQsIG5ld1N0YXRlKSkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc2VuZE1lc3NhZ2Uob2J0YWluTWVzc2FnZShORVRXT1JLX0RJU0NPTk5FQ1RJT05fRVZFTlQsCisgICAgICAgICAgICAgICAgICAgIG5ldyBTdGF0ZUNoYW5nZVJlc3VsdChuZXR3b3JrSWQsIEJTU0lELCBuZXdTdGF0ZSkpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFNlbmQgdGhlIHRyYWNrZXIgYSBub3RpZmljYXRpb24gdGhhdCB0aGUgc3RhdGUgb2YgdGhlIHN1cHBsaWNhbnQKKyAgICAgKiBoYXMgY2hhbmdlZC4KKyAgICAgKiBAcGFyYW0gbmV0d29ya0lkIHRoZSBjb25maWd1cmVkIG5ldHdvcmsgb24gd2hpY2ggdGhlIHN0YXRlIGNoYW5nZSBvY2N1cnJlZAorICAgICAqIEBwYXJhbSBuZXdTdGF0ZSB0aGUgbmV3IHtAY29kZSBTdXBwbGljYW50U3RhdGV9CisgICAgICovCisgICAgdm9pZCBub3RpZnlTdXBwbGljYW50U3RhdGVDaGFuZ2UoaW50IG5ldHdvcmtJZCwgU3RyaW5nIEJTU0lELCBTdXBwbGljYW50U3RhdGUgbmV3U3RhdGUpIHsKKyAgICAgICAgc2VuZE1lc3NhZ2Uob2J0YWluTWVzc2FnZShTVVBQTElDQU5UX1NUQVRFX0NIQU5HRV9FVkVOVCwKKyAgICAgICAgICAgICAgICBuZXcgU3RhdGVDaGFuZ2VSZXN1bHQobmV0d29ya0lkLCBCU1NJRCwgbmV3U3RhdGUpKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2VuZCB0aGUgdHJhY2tlciBhIG5vdGlmaWNhdGlvbiB0aGF0IGEgc2NhbiBoYXMgY29tcGxldGVkLCBhbmQgcmVzdWx0cworICAgICAqIGFyZSBhdmFpbGFibGUuCisgICAgICovCisgICAgdm9pZCBub3RpZnlTY2FuUmVzdWx0c0F2YWlsYWJsZSgpIHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIFN3aXRjaCBzY2FuIG1vZGUgb3ZlciB0byBwYXNzaXZlLgorICAgICAgICAgKiBUdXJuaW5nIG9mZiBzY2FuLW9ubHkgbW9kZSBoYXBwZW5zIG9ubHkgaW4gIkNvbm5lY3QiIG1vZGUKKyAgICAgICAgICovCisgICAgICAgIHNldFNjYW5UeXBlKGZhbHNlKTsKKyAgICAgICAgc2VuZE1lc3NhZ2UoU0NBTl9SRVNVTFRTX0VWRU5UKTsKKyAgICB9CisKKyAgICB2b2lkIG5vdGlmeURyaXZlclN0YXJ0ZWQoKSB7CisgICAgICAgIHNlbmRNZXNzYWdlKERSSVZFUl9TVEFSVF9FVkVOVCk7CisgICAgfQorCisgICAgdm9pZCBub3RpZnlEcml2ZXJTdG9wcGVkKCkgeworICAgICAgICBzZW5kTWVzc2FnZShEUklWRVJfU1RPUF9FVkVOVCk7CisgICAgfQorCisgICAgdm9pZCBub3RpZnlEcml2ZXJIdW5nKCkgeworICAgICAgICBzZXRXaWZpRW5hYmxlZChmYWxzZSk7CisgICAgICAgIHNldFdpZmlFbmFibGVkKHRydWUpOworICAgIH0KKworCisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICogSFNNIHN0YXRlcworICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgICAgY2xhc3MgRGVmYXVsdFN0YXRlIGV4dGVuZHMgSGllcmFyY2hpY2FsU3RhdGUgeworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gcHJvY2Vzc01lc3NhZ2UoTWVzc2FnZSBtZXNzYWdlKSB7CisgICAgICAgICAgICBpZiAoREJHKSBMb2cuZChUQUcsIGdldE5hbWUoKSArIG1lc3NhZ2UudG9TdHJpbmcoKSArICJcbiIpOworICAgICAgICAgICAgU3luY1BhcmFtcyBzeW5jUGFyYW1zOworICAgICAgICAgICAgc3dpdGNoIChtZXNzYWdlLndoYXQpIHsKKyAgICAgICAgICAgICAgICAgICAgLyogU3luY2hyb25vdXMgY2FsbCByZXR1cm5zICovCisgICAgICAgICAgICAgICAgY2FzZSBDTURfUElOR19TVVBQTElDQU5UOgorICAgICAgICAgICAgICAgIGNhc2UgQ01EX1JFTU9WRV9ORVRXT1JLOgorICAgICAgICAgICAgICAgIGNhc2UgQ01EX0VOQUJMRV9ORVRXT1JLOgorICAgICAgICAgICAgICAgIGNhc2UgQ01EX0RJU0FCTEVfTkVUV09SSzoKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9BRERfT1JfVVBEQVRFX05FVFdPUks6CisgICAgICAgICAgICAgICAgY2FzZSBDTURfR0VUX1JTU0k6CisgICAgICAgICAgICAgICAgY2FzZSBDTURfR0VUX1JTU0lfQVBQUk9YOgorICAgICAgICAgICAgICAgIGNhc2UgQ01EX0dFVF9MSU5LX1NQRUVEOgorICAgICAgICAgICAgICAgIGNhc2UgQ01EX0dFVF9NQUNfQUREUjoKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9TQVZFX0NPTkZJRzoKKyAgICAgICAgICAgICAgICAgICAgc3luY1BhcmFtcyA9IChTeW5jUGFyYW1zKSBtZXNzYWdlLm9iajsKKyAgICAgICAgICAgICAgICAgICAgc3luY1BhcmFtcy5tU3luY1JldHVybi5ib29sVmFsdWUgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgc3luY1BhcmFtcy5tU3luY1JldHVybi5pbnRWYWx1ZSA9IC0xOworICAgICAgICAgICAgICAgICAgICBzeW5jUGFyYW1zLm1TeW5jUmV0dXJuLnN0cmluZ1ZhbHVlID0gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgbm90aWZ5T25Nc2dPYmplY3QobWVzc2FnZSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQ01EX0VOQUJMRV9SU1NJX1BPTEw6CisgICAgICAgICAgICAgICAgICAgIG1FbmFibGVSc3NpUG9sbGluZyA9IChtZXNzYWdlLmFyZzEgPT0gMSk7CisgICAgICAgICAgICAgICAgICAgIG1TdXBwbGljYW50U3RhdGVUcmFja2VyLnNlbmRNZXNzYWdlKENNRF9FTkFCTEVfUlNTSV9QT0xMKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIC8qIERpc2NhcmQgKi8KKyAgICAgICAgICAgICAgICBjYXNlIENNRF9MT0FEX0RSSVZFUjoKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9VTkxPQURfRFJJVkVSOgorICAgICAgICAgICAgICAgIGNhc2UgQ01EX1NUQVJUX1NVUFBMSUNBTlQ6CisgICAgICAgICAgICAgICAgY2FzZSBDTURfU1RPUF9TVVBQTElDQU5UOgorICAgICAgICAgICAgICAgIGNhc2UgQ01EX1NUQVJUX0RSSVZFUjoKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9TVE9QX0RSSVZFUjoKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9TVEFSVF9BUDoKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9TVE9QX0FQOgorICAgICAgICAgICAgICAgIGNhc2UgQ01EX1NUQVJUX1NDQU46CisgICAgICAgICAgICAgICAgY2FzZSBDTURfRElTQ09OTkVDVDoKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9SRUNPTk5FQ1Q6CisgICAgICAgICAgICAgICAgY2FzZSBDTURfUkVBU1NPQ0lBVEU6CisgICAgICAgICAgICAgICAgY2FzZSBDTURfUkVDT05GSUdVUkVfSVA6CisgICAgICAgICAgICAgICAgY2FzZSBTVVBfQ09OTkVDVElPTl9FVkVOVDoKKyAgICAgICAgICAgICAgICBjYXNlIFNVUF9ESVNDT05ORUNUSU9OX0VWRU5UOgorICAgICAgICAgICAgICAgIGNhc2UgRFJJVkVSX1NUQVJUX0VWRU5UOgorICAgICAgICAgICAgICAgIGNhc2UgRFJJVkVSX1NUT1BfRVZFTlQ6CisgICAgICAgICAgICAgICAgY2FzZSBORVRXT1JLX0NPTk5FQ1RJT05fRVZFTlQ6CisgICAgICAgICAgICAgICAgY2FzZSBORVRXT1JLX0RJU0NPTk5FQ1RJT05fRVZFTlQ6CisgICAgICAgICAgICAgICAgY2FzZSBTQ0FOX1JFU1VMVFNfRVZFTlQ6CisgICAgICAgICAgICAgICAgY2FzZSBTVVBQTElDQU5UX1NUQVRFX0NIQU5HRV9FVkVOVDoKKyAgICAgICAgICAgICAgICBjYXNlIFBBU1NXT1JEX01BWV9CRV9JTkNPUlJFQ1RfRVZFTlQ6CisgICAgICAgICAgICAgICAgY2FzZSBDTURfQkxBQ0tMSVNUX05FVFdPUks6CisgICAgICAgICAgICAgICAgY2FzZSBDTURfQ0xFQVJfQkxBQ0tMSVNUOgorICAgICAgICAgICAgICAgIGNhc2UgQ01EX1NFVF9TQ0FOX01PREU6CisgICAgICAgICAgICAgICAgY2FzZSBDTURfU0VUX1NDQU5fVFlQRToKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9TRVRfUE9XRVJfTU9ERToKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9TRVRfQkxVRVRPT1RIX0NPRVhJU1RFTkNFOgorICAgICAgICAgICAgICAgIGNhc2UgQ01EX1NFVF9CTFVFVE9PVEhfU0NBTl9NT0RFOgorICAgICAgICAgICAgICAgIGNhc2UgQ01EX1NFVF9OVU1fQUxMT1dFRF9DSEFOTkVMUzoKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9SRVFVRVNUX0NNX1dBS0VMT0NLOgorICAgICAgICAgICAgICAgIGNhc2UgQ01EX0NPTk5FQ1RfTkVUV09SSzoKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9TQVZFX05FVFdPUks6CisgICAgICAgICAgICAgICAgY2FzZSBDTURfRk9SR0VUX05FVFdPUks6CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIExvZy5lKFRBRywgIkVycm9yISB1bmhhbmRsZWQgbWVzc2FnZSIgKyBtZXNzYWdlKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gSEFORExFRDsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsYXNzIEluaXRpYWxTdGF0ZSBleHRlbmRzIEhpZXJhcmNoaWNhbFN0YXRlIHsKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIC8vVE9ETzogY291bGQgbW92ZSBsb2dnaW5nIGludG8gYSBjb21tb24gY2xhc3MKKyAgICAgICAgcHVibGljIHZvaWQgZW50ZXIoKSB7CisgICAgICAgICAgICBpZiAoREJHKSBMb2cuZChUQUcsIGdldE5hbWUoKSArICJcbiIpOworICAgICAgICAgICAgLy8gWzMxLThdIFJlc2VydmVkIGZvciBmdXR1cmUgdXNlCisgICAgICAgICAgICAvLyBbNyAtIDBdIEhTTSBzdGF0ZSBjaGFuZ2UKKyAgICAgICAgICAgIC8vIDUwMDIxIHdpZmlfc3RhdGVfY2hhbmdlZCAoY3VzdG9tfDF8NSkKKyAgICAgICAgICAgIEV2ZW50TG9nLndyaXRlRXZlbnQoRVZFTlRMT0dfV0lGSV9TVEFURV9DSEFOR0VELCBnZXROYW1lKCkpOworCisgICAgICAgICAgICBpZiAoV2lmaU5hdGl2ZS5pc0RyaXZlckxvYWRlZCgpKSB7CisgICAgICAgICAgICAgICAgdHJhbnNpdGlvblRvKG1Ecml2ZXJMb2FkZWRTdGF0ZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICB0cmFuc2l0aW9uVG8obURyaXZlclVubG9hZGVkU3RhdGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgY2xhc3MgRHJpdmVyTG9hZGluZ1N0YXRlIGV4dGVuZHMgSGllcmFyY2hpY2FsU3RhdGUgeworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgZW50ZXIoKSB7CisgICAgICAgICAgICBpZiAoREJHKSBMb2cuZChUQUcsIGdldE5hbWUoKSArICJcbiIpOworICAgICAgICAgICAgRXZlbnRMb2cud3JpdGVFdmVudChFVkVOVExPR19XSUZJX1NUQVRFX0NIQU5HRUQsIGdldE5hbWUoKSk7CisKKyAgICAgICAgICAgIGZpbmFsIE1lc3NhZ2UgbWVzc2FnZSA9IG5ldyBNZXNzYWdlKCk7CisgICAgICAgICAgICBtZXNzYWdlLmNvcHlGcm9tKGdldEN1cnJlbnRNZXNzYWdlKCkpOworICAgICAgICAgICAgLyogVE9ETzogYWRkIGEgdGltZW91dCB0byBmYWlsIHdoZW4gZHJpdmVyIGxvYWQgaXMgaHVuZy4KKyAgICAgICAgICAgICAqIFNpbWlsYXJseSBmb3IgZHJpdmVyIHVubG9hZC4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgbmV3IFRocmVhZChuZXcgUnVubmFibGUoKSB7CisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgICAgICBzV2FrZUxvY2suYWNxdWlyZSgpOworICAgICAgICAgICAgICAgICAgICAvL2VuYWJsaW5nIHN0YXRlCisgICAgICAgICAgICAgICAgICAgIHN3aXRjaChtZXNzYWdlLmFyZzEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgV0lGSV9TVEFURV9FTkFCTElORzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRXaWZpU3RhdGUoV0lGSV9TVEFURV9FTkFCTElORyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFdJRklfQVBfU1RBVEVfRU5BQkxJTkc6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0V2lmaUFwU3RhdGUoV0lGSV9BUF9TVEFURV9FTkFCTElORyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBpZihXaWZpTmF0aXZlLmxvYWREcml2ZXIoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiRHJpdmVyIGxvYWQgc3VjY2Vzc2Z1bCIpOworICAgICAgICAgICAgICAgICAgICAgICAgc2VuZE1lc3NhZ2UoQ01EX0xPQURfRFJJVkVSX1NVQ0NFU1MpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAiRmFpbGVkIHRvIGxvYWQgZHJpdmVyISIpOworICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoKG1lc3NhZ2UuYXJnMSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgV0lGSV9TVEFURV9FTkFCTElORzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0V2lmaVN0YXRlKFdJRklfU1RBVEVfVU5LTk9XTik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgV0lGSV9BUF9TVEFURV9FTkFCTElORzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0V2lmaUFwU3RhdGUoV0lGSV9BUF9TVEFURV9GQUlMRUQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbmRNZXNzYWdlKENNRF9MT0FEX0RSSVZFUl9GQUlMVVJFKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBzV2FrZUxvY2sucmVsZWFzZSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pLnN0YXJ0KCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gcHJvY2Vzc01lc3NhZ2UoTWVzc2FnZSBtZXNzYWdlKSB7CisgICAgICAgICAgICBpZiAoREJHKSBMb2cuZChUQUcsIGdldE5hbWUoKSArIG1lc3NhZ2UudG9TdHJpbmcoKSArICJcbiIpOworICAgICAgICAgICAgc3dpdGNoIChtZXNzYWdlLndoYXQpIHsKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9MT0FEX0RSSVZFUl9TVUNDRVNTOgorICAgICAgICAgICAgICAgICAgICB0cmFuc2l0aW9uVG8obURyaXZlckxvYWRlZFN0YXRlKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBDTURfTE9BRF9EUklWRVJfRkFJTFVSRToKKyAgICAgICAgICAgICAgICAgICAgdHJhbnNpdGlvblRvKG1Ecml2ZXJGYWlsZWRTdGF0ZSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQ01EX0xPQURfRFJJVkVSOgorICAgICAgICAgICAgICAgIGNhc2UgQ01EX1VOTE9BRF9EUklWRVI6CisgICAgICAgICAgICAgICAgY2FzZSBDTURfU1RBUlRfU1VQUExJQ0FOVDoKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9TVE9QX1NVUFBMSUNBTlQ6CisgICAgICAgICAgICAgICAgY2FzZSBDTURfU1RBUlRfQVA6CisgICAgICAgICAgICAgICAgY2FzZSBDTURfU1RPUF9BUDoKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9TVEFSVF9EUklWRVI6CisgICAgICAgICAgICAgICAgY2FzZSBDTURfU1RPUF9EUklWRVI6CisgICAgICAgICAgICAgICAgY2FzZSBDTURfU0VUX1NDQU5fTU9ERToKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9TRVRfU0NBTl9UWVBFOgorICAgICAgICAgICAgICAgIGNhc2UgQ01EX1NFVF9QT1dFUl9NT0RFOgorICAgICAgICAgICAgICAgIGNhc2UgQ01EX1NFVF9CTFVFVE9PVEhfQ09FWElTVEVOQ0U6CisgICAgICAgICAgICAgICAgY2FzZSBDTURfU0VUX0JMVUVUT09USF9TQ0FOX01PREU6CisgICAgICAgICAgICAgICAgY2FzZSBDTURfU0VUX05VTV9BTExPV0VEX0NIQU5ORUxTOgorICAgICAgICAgICAgICAgIGNhc2UgQ01EX1NUQVJUX1BBQ0tFVF9GSUxURVJJTkc6CisgICAgICAgICAgICAgICAgY2FzZSBDTURfU1RPUF9QQUNLRVRfRklMVEVSSU5HOgorICAgICAgICAgICAgICAgICAgICBkZWZlck1lc3NhZ2UobWVzc2FnZSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBOT1RfSEFORExFRDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEV2ZW50TG9nLndyaXRlRXZlbnQoRVZFTlRMT0dfV0lGSV9FVkVOVF9IQU5ETEVELCBtZXNzYWdlLndoYXQpOworICAgICAgICAgICAgcmV0dXJuIEhBTkRMRUQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGFzcyBEcml2ZXJMb2FkZWRTdGF0ZSBleHRlbmRzIEhpZXJhcmNoaWNhbFN0YXRlIHsKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIGVudGVyKCkgeworICAgICAgICAgICAgaWYgKERCRykgTG9nLmQoVEFHLCBnZXROYW1lKCkgKyAiXG4iKTsKKyAgICAgICAgICAgIEV2ZW50TG9nLndyaXRlRXZlbnQoRVZFTlRMT0dfV0lGSV9TVEFURV9DSEFOR0VELCBnZXROYW1lKCkpOworICAgICAgICB9CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBwcm9jZXNzTWVzc2FnZShNZXNzYWdlIG1lc3NhZ2UpIHsKKyAgICAgICAgICAgIGlmIChEQkcpIExvZy5kKFRBRywgZ2V0TmFtZSgpICsgbWVzc2FnZS50b1N0cmluZygpICsgIlxuIik7CisgICAgICAgICAgICBzd2l0Y2gobWVzc2FnZS53aGF0KSB7CisgICAgICAgICAgICAgICAgY2FzZSBDTURfVU5MT0FEX0RSSVZFUjoKKyAgICAgICAgICAgICAgICAgICAgdHJhbnNpdGlvblRvKG1Ecml2ZXJVbmxvYWRpbmdTdGF0ZSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQ01EX1NUQVJUX1NVUFBMSUNBTlQ6CisgICAgICAgICAgICAgICAgICAgIGlmKFdpZmlOYXRpdmUuc3RhcnRTdXBwbGljYW50KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIlN1cHBsaWNhbnQgc3RhcnQgc3VjY2Vzc2Z1bCIpOworICAgICAgICAgICAgICAgICAgICAgICAgbVdpZmlNb25pdG9yLnN0YXJ0TW9uaXRvcmluZygpOworICAgICAgICAgICAgICAgICAgICAgICAgc2V0V2lmaVN0YXRlKFdJRklfU1RBVEVfRU5BQkxFRCk7CisgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2l0aW9uVG8obVdhaXRGb3JTdXBTdGF0ZSk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBMb2cuZShUQUcsICJGYWlsZWQgdG8gc3RhcnQgc3VwcGxpY2FudCEiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbmRNZXNzYWdlKG9idGFpbk1lc3NhZ2UoQ01EX1VOTE9BRF9EUklWRVIsIFdJRklfU1RBVEVfVU5LTk9XTiwgMCkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQ01EX1NUQVJUX0FQOgorICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgbndTZXJ2aWNlLnN0YXJ0QWNjZXNzUG9pbnQoKFdpZmlDb25maWd1cmF0aW9uKSBtZXNzYWdlLm9iaiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1JbnRlcmZhY2VOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU09GVEFQX0lGQUNFKTsKKyAgICAgICAgICAgICAgICAgICAgfSBjYXRjaChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAiRXhjZXB0aW9uIGluIHN0YXJ0QWNjZXNzUG9pbnQoKSIpOworICAgICAgICAgICAgICAgICAgICAgICAgc2VuZE1lc3NhZ2Uob2J0YWluTWVzc2FnZShDTURfVU5MT0FEX0RSSVZFUiwgV0lGSV9BUF9TVEFURV9GQUlMRUQsIDApKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIlNvZnQgQVAgc3RhcnQgc3VjY2Vzc2Z1bCIpOworICAgICAgICAgICAgICAgICAgICBzZXRXaWZpQXBTdGF0ZShXSUZJX0FQX1NUQVRFX0VOQUJMRUQpOworICAgICAgICAgICAgICAgICAgICB0cmFuc2l0aW9uVG8obVNvZnRBcFN0YXJ0ZWRTdGF0ZSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBOT1RfSEFORExFRDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEV2ZW50TG9nLndyaXRlRXZlbnQoRVZFTlRMT0dfV0lGSV9FVkVOVF9IQU5ETEVELCBtZXNzYWdlLndoYXQpOworICAgICAgICAgICAgcmV0dXJuIEhBTkRMRUQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGFzcyBEcml2ZXJVbmxvYWRpbmdTdGF0ZSBleHRlbmRzIEhpZXJhcmNoaWNhbFN0YXRlIHsKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIGVudGVyKCkgeworICAgICAgICAgICAgaWYgKERCRykgTG9nLmQoVEFHLCBnZXROYW1lKCkgKyAiXG4iKTsKKyAgICAgICAgICAgIEV2ZW50TG9nLndyaXRlRXZlbnQoRVZFTlRMT0dfV0lGSV9TVEFURV9DSEFOR0VELCBnZXROYW1lKCkpOworCisgICAgICAgICAgICBmaW5hbCBNZXNzYWdlIG1lc3NhZ2UgPSBuZXcgTWVzc2FnZSgpOworICAgICAgICAgICAgbWVzc2FnZS5jb3B5RnJvbShnZXRDdXJyZW50TWVzc2FnZSgpKTsKKyAgICAgICAgICAgIG5ldyBUaHJlYWQobmV3IFJ1bm5hYmxlKCkgeworICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKERCRykgTG9nLmQoVEFHLCBnZXROYW1lKCkgKyBtZXNzYWdlLnRvU3RyaW5nKCkgKyAiXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgc1dha2VMb2NrLmFjcXVpcmUoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYoV2lmaU5hdGl2ZS51bmxvYWREcml2ZXIoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiRHJpdmVyIHVubG9hZCBzdWNjZXNzZnVsIik7CisgICAgICAgICAgICAgICAgICAgICAgICBzZW5kTWVzc2FnZShDTURfVU5MT0FEX0RSSVZFUl9TVUNDRVNTKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoKG1lc3NhZ2UuYXJnMSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgV0lGSV9TVEFURV9ESVNBQkxFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFdJRklfU1RBVEVfVU5LTk9XTjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0V2lmaVN0YXRlKG1lc3NhZ2UuYXJnMSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgV0lGSV9BUF9TVEFURV9ESVNBQkxFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFdJRklfQVBfU1RBVEVfRkFJTEVEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRXaWZpQXBTdGF0ZShtZXNzYWdlLmFyZzEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIExvZy5lKFRBRywgIkZhaWxlZCB0byB1bmxvYWQgZHJpdmVyISIpOworICAgICAgICAgICAgICAgICAgICAgICAgc2VuZE1lc3NhZ2UoQ01EX1VOTE9BRF9EUklWRVJfRkFJTFVSRSk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaChtZXNzYWdlLmFyZzEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFdJRklfU1RBVEVfRElTQUJMRUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBXSUZJX1NUQVRFX1VOS05PV046CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFdpZmlTdGF0ZShXSUZJX1NUQVRFX1VOS05PV04pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFdJRklfQVBfU1RBVEVfRElTQUJMRUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBXSUZJX0FQX1NUQVRFX0ZBSUxFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0V2lmaUFwU3RhdGUoV0lGSV9BUF9TVEFURV9GQUlMRUQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBzV2FrZUxvY2sucmVsZWFzZSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pLnN0YXJ0KCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gcHJvY2Vzc01lc3NhZ2UoTWVzc2FnZSBtZXNzYWdlKSB7CisgICAgICAgICAgICBpZiAoREJHKSBMb2cuZChUQUcsIGdldE5hbWUoKSArIG1lc3NhZ2UudG9TdHJpbmcoKSArICJcbiIpOworICAgICAgICAgICAgc3dpdGNoIChtZXNzYWdlLndoYXQpIHsKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9VTkxPQURfRFJJVkVSX1NVQ0NFU1M6CisgICAgICAgICAgICAgICAgICAgIHRyYW5zaXRpb25UbyhtRHJpdmVyVW5sb2FkZWRTdGF0ZSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQ01EX1VOTE9BRF9EUklWRVJfRkFJTFVSRToKKyAgICAgICAgICAgICAgICAgICAgdHJhbnNpdGlvblRvKG1Ecml2ZXJGYWlsZWRTdGF0ZSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQ01EX0xPQURfRFJJVkVSOgorICAgICAgICAgICAgICAgIGNhc2UgQ01EX1VOTE9BRF9EUklWRVI6CisgICAgICAgICAgICAgICAgY2FzZSBDTURfU1RBUlRfU1VQUExJQ0FOVDoKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9TVE9QX1NVUFBMSUNBTlQ6CisgICAgICAgICAgICAgICAgY2FzZSBDTURfU1RBUlRfQVA6CisgICAgICAgICAgICAgICAgY2FzZSBDTURfU1RPUF9BUDoKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9TVEFSVF9EUklWRVI6CisgICAgICAgICAgICAgICAgY2FzZSBDTURfU1RPUF9EUklWRVI6CisgICAgICAgICAgICAgICAgY2FzZSBDTURfU0VUX1NDQU5fTU9ERToKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9TRVRfU0NBTl9UWVBFOgorICAgICAgICAgICAgICAgIGNhc2UgQ01EX1NFVF9QT1dFUl9NT0RFOgorICAgICAgICAgICAgICAgIGNhc2UgQ01EX1NFVF9CTFVFVE9PVEhfQ09FWElTVEVOQ0U6CisgICAgICAgICAgICAgICAgY2FzZSBDTURfU0VUX0JMVUVUT09USF9TQ0FOX01PREU6CisgICAgICAgICAgICAgICAgY2FzZSBDTURfU0VUX05VTV9BTExPV0VEX0NIQU5ORUxTOgorICAgICAgICAgICAgICAgIGNhc2UgQ01EX1NUQVJUX1BBQ0tFVF9GSUxURVJJTkc6CisgICAgICAgICAgICAgICAgY2FzZSBDTURfU1RPUF9QQUNLRVRfRklMVEVSSU5HOgorICAgICAgICAgICAgICAgICAgICBkZWZlck1lc3NhZ2UobWVzc2FnZSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBOT1RfSEFORExFRDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEV2ZW50TG9nLndyaXRlRXZlbnQoRVZFTlRMT0dfV0lGSV9FVkVOVF9IQU5ETEVELCBtZXNzYWdlLndoYXQpOworICAgICAgICAgICAgcmV0dXJuIEhBTkRMRUQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGFzcyBEcml2ZXJVbmxvYWRlZFN0YXRlIGV4dGVuZHMgSGllcmFyY2hpY2FsU3RhdGUgeworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgZW50ZXIoKSB7CisgICAgICAgICAgICBpZiAoREJHKSBMb2cuZChUQUcsIGdldE5hbWUoKSArICJcbiIpOworICAgICAgICAgICAgRXZlbnRMb2cud3JpdGVFdmVudChFVkVOVExPR19XSUZJX1NUQVRFX0NIQU5HRUQsIGdldE5hbWUoKSk7CisgICAgICAgIH0KKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIHByb2Nlc3NNZXNzYWdlKE1lc3NhZ2UgbWVzc2FnZSkgeworICAgICAgICAgICAgaWYgKERCRykgTG9nLmQoVEFHLCBnZXROYW1lKCkgKyBtZXNzYWdlLnRvU3RyaW5nKCkgKyAiXG4iKTsKKyAgICAgICAgICAgIHN3aXRjaCAobWVzc2FnZS53aGF0KSB7CisgICAgICAgICAgICAgICAgY2FzZSBDTURfTE9BRF9EUklWRVI6CisgICAgICAgICAgICAgICAgICAgIHRyYW5zaXRpb25UbyhtRHJpdmVyTG9hZGluZ1N0YXRlKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5PVF9IQU5ETEVEOworICAgICAgICAgICAgfQorICAgICAgICAgICAgRXZlbnRMb2cud3JpdGVFdmVudChFVkVOVExPR19XSUZJX0VWRU5UX0hBTkRMRUQsIG1lc3NhZ2Uud2hhdCk7CisgICAgICAgICAgICByZXR1cm4gSEFORExFRDsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsYXNzIERyaXZlckZhaWxlZFN0YXRlIGV4dGVuZHMgSGllcmFyY2hpY2FsU3RhdGUgeworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgZW50ZXIoKSB7CisgICAgICAgICAgICBMb2cuZShUQUcsIGdldE5hbWUoKSArICJcbiIpOworICAgICAgICAgICAgRXZlbnRMb2cud3JpdGVFdmVudChFVkVOVExPR19XSUZJX1NUQVRFX0NIQU5HRUQsIGdldE5hbWUoKSk7CisgICAgICAgIH0KKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIHByb2Nlc3NNZXNzYWdlKE1lc3NhZ2UgbWVzc2FnZSkgeworICAgICAgICAgICAgaWYgKERCRykgTG9nLmQoVEFHLCBnZXROYW1lKCkgKyBtZXNzYWdlLnRvU3RyaW5nKCkgKyAiXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBOT1RfSEFORExFRDsKKyAgICAgICAgfQorICAgIH0KKworCisgICAgY2xhc3MgV2FpdEZvclN1cFN0YXRlIGV4dGVuZHMgSGllcmFyY2hpY2FsU3RhdGUgeworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgZW50ZXIoKSB7CisgICAgICAgICAgICBpZiAoREJHKSBMb2cuZChUQUcsIGdldE5hbWUoKSArICJcbiIpOworICAgICAgICAgICAgRXZlbnRMb2cud3JpdGVFdmVudChFVkVOVExPR19XSUZJX1NUQVRFX0NIQU5HRUQsIGdldE5hbWUoKSk7CisgICAgICAgIH0KKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIHByb2Nlc3NNZXNzYWdlKE1lc3NhZ2UgbWVzc2FnZSkgeworICAgICAgICAgICAgaWYgKERCRykgTG9nLmQoVEFHLCBnZXROYW1lKCkgKyBtZXNzYWdlLnRvU3RyaW5nKCkgKyAiXG4iKTsKKyAgICAgICAgICAgIHN3aXRjaChtZXNzYWdlLndoYXQpIHsKKyAgICAgICAgICAgICAgICBjYXNlIFNVUF9DT05ORUNUSU9OX0VWRU5UOgorICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJTdXBwbGljYW50IGNvbm5lY3Rpb24gZXN0YWJsaXNoZWQiKTsKKyAgICAgICAgICAgICAgICAgICAgbVN1cHBsaWNhbnRTdGF0ZVRyYWNrZXIucmVzZXRTdXBwbGljYW50U3RhdGUoKTsKKyAgICAgICAgICAgICAgICAgICAgLyogSW5pdGlhbGl6ZSBkYXRhIHN0cnVjdHVyZXMgKi8KKyAgICAgICAgICAgICAgICAgICAgbUxhc3RCc3NpZCA9IG51bGw7CisgICAgICAgICAgICAgICAgICAgIG1MYXN0TmV0d29ya0lkID0gLTE7CisgICAgICAgICAgICAgICAgICAgIG1MYXN0U2lnbmFsTGV2ZWwgPSAtMTsKKworICAgICAgICAgICAgICAgICAgICBtV2lmaUluZm8uc2V0TWFjQWRkcmVzcyhXaWZpTmF0aXZlLmdldE1hY0FkZHJlc3NDb21tYW5kKCkpOworCisgICAgICAgICAgICAgICAgICAgIFdpZmlDb25maWdTdG9yZS5pbml0aWFsaXplKG1Db250ZXh0KTsKKworICAgICAgICAgICAgICAgICAgICAvL1RPRE86IGluaXRpYWxpemUgYW5kIGZpeCBtdWx0aWNhc3QgZmlsdGVyaW5nCisgICAgICAgICAgICAgICAgICAgIC8vbVdNLmluaXRpYWxpemVNdWx0aWNhc3RGaWx0ZXJpbmcoKTsKKworICAgICAgICAgICAgICAgICAgICBpZiAobUJsdWV0b290aEEyZHAgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgbUJsdWV0b290aEEyZHAgPSBuZXcgQmx1ZXRvb3RoQTJkcChtQ29udGV4dCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgY2hlY2tJc0JsdWV0b290aFBsYXlpbmcoKTsKKworICAgICAgICAgICAgICAgICAgICBzZW5kU3VwcGxpY2FudENvbm5lY3Rpb25DaGFuZ2VkQnJvYWRjYXN0KHRydWUpOworICAgICAgICAgICAgICAgICAgICB0cmFuc2l0aW9uVG8obURyaXZlclN1cFJlYWR5U3RhdGUpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9TVE9QX1NVUFBMSUNBTlQ6CisgICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIlN0b3Agc3VwcGxpY2FudCByZWNlaXZlZCIpOworICAgICAgICAgICAgICAgICAgICBXaWZpTmF0aXZlLnN0b3BTdXBwbGljYW50KCk7CisgICAgICAgICAgICAgICAgICAgIHRyYW5zaXRpb25UbyhtRHJpdmVyTG9hZGVkU3RhdGUpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgLyogRmFpbCBzb2Z0IGFwIHdoZW4gd2FpdGluZyBmb3Igc3VwcGxpY2FudCBzdGFydCAqLworICAgICAgICAgICAgICAgIGNhc2UgQ01EX1NUQVJUX0FQOgorICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJGYWlsZWQgdG8gc3RhcnQgc29mdCBBUCB3aXRoIGEgcnVubmluZyBzdXBwbGljYW50Iik7CisgICAgICAgICAgICAgICAgICAgIHNldFdpZmlBcFN0YXRlKFdJRklfQVBfU1RBVEVfRkFJTEVEKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBDTURfU1RBUlRfRFJJVkVSOgorICAgICAgICAgICAgICAgIGNhc2UgQ01EX1NUT1BfRFJJVkVSOgorICAgICAgICAgICAgICAgIGNhc2UgQ01EX1NFVF9TQ0FOX01PREU6CisgICAgICAgICAgICAgICAgY2FzZSBDTURfU0VUX1NDQU5fVFlQRToKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9TRVRfUE9XRVJfTU9ERToKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9TRVRfQkxVRVRPT1RIX0NPRVhJU1RFTkNFOgorICAgICAgICAgICAgICAgIGNhc2UgQ01EX1NFVF9CTFVFVE9PVEhfU0NBTl9NT0RFOgorICAgICAgICAgICAgICAgIGNhc2UgQ01EX1NFVF9OVU1fQUxMT1dFRF9DSEFOTkVMUzoKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9TVEFSVF9QQUNLRVRfRklMVEVSSU5HOgorICAgICAgICAgICAgICAgIGNhc2UgQ01EX1NUT1BfUEFDS0VUX0ZJTFRFUklORzoKKyAgICAgICAgICAgICAgICAgICAgZGVmZXJNZXNzYWdlKG1lc3NhZ2UpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9TVE9QX0FQOgorICAgICAgICAgICAgICAgIGNhc2UgQ01EX1NUQVJUX1NVUFBMSUNBTlQ6CisgICAgICAgICAgICAgICAgY2FzZSBDTURfVU5MT0FEX0RSSVZFUjoKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5PVF9IQU5ETEVEOworICAgICAgICAgICAgfQorICAgICAgICAgICAgRXZlbnRMb2cud3JpdGVFdmVudChFVkVOVExPR19XSUZJX0VWRU5UX0hBTkRMRUQsIG1lc3NhZ2Uud2hhdCk7CisgICAgICAgICAgICByZXR1cm4gSEFORExFRDsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsYXNzIERyaXZlclN1cFJlYWR5U3RhdGUgZXh0ZW5kcyBIaWVyYXJjaGljYWxTdGF0ZSB7CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBlbnRlcigpIHsKKyAgICAgICAgICAgIGlmIChEQkcpIExvZy5kKFRBRywgZ2V0TmFtZSgpICsgIlxuIik7CisgICAgICAgICAgICBFdmVudExvZy53cml0ZUV2ZW50KEVWRU5UTE9HX1dJRklfU1RBVEVfQ0hBTkdFRCwgZ2V0TmFtZSgpKTsKKyAgICAgICAgICAgIC8qIEluaXRpYWxpemUgZm9yIGNvbm5lY3QgbW9kZSBvcGVyYXRpb24gYXQgc3RhcnQgKi8KKyAgICAgICAgICAgIG1Jc1NjYW5Nb2RlID0gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIHByb2Nlc3NNZXNzYWdlKE1lc3NhZ2UgbWVzc2FnZSkgeworICAgICAgICAgICAgaWYgKERCRykgTG9nLmQoVEFHLCBnZXROYW1lKCkgKyBtZXNzYWdlLnRvU3RyaW5nKCkgKyAiXG4iKTsKKyAgICAgICAgICAgIFN5bmNQYXJhbXMgc3luY1BhcmFtczsKKyAgICAgICAgICAgIFdpZmlDb25maWd1cmF0aW9uIGNvbmZpZzsKKyAgICAgICAgICAgIHN3aXRjaChtZXNzYWdlLndoYXQpIHsKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9TVE9QX1NVUFBMSUNBTlQ6ICAgLyogU3VwcGxpY2FudCBzdG9wcGVkIGJ5IHVzZXIgKi8KKyAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiU3RvcCBzdXBwbGljYW50IHJlY2VpdmVkIik7CisgICAgICAgICAgICAgICAgICAgIFdpZmlOYXRpdmUuc3RvcFN1cHBsaWNhbnQoKTsKKyAgICAgICAgICAgICAgICAgICAgLy8kRkFMTC1USFJPVUdIJAorICAgICAgICAgICAgICAgIGNhc2UgU1VQX0RJU0NPTk5FQ1RJT05fRVZFTlQ6ICAvKiBTdXBwbGljYW50IGRpZWQgKi8KKyAgICAgICAgICAgICAgICAgICAgRXZlbnRMb2cud3JpdGVFdmVudChFVkVOVExPR19XSUZJX0VWRU5UX0hBTkRMRUQsIG1lc3NhZ2Uud2hhdCk7CisgICAgICAgICAgICAgICAgICAgIFdpZmlOYXRpdmUuY2xvc2VTdXBwbGljYW50Q29ubmVjdGlvbigpOworICAgICAgICAgICAgICAgICAgICBoYW5kbGVOZXR3b3JrRGlzY29ubmVjdCgpOworICAgICAgICAgICAgICAgICAgICBzZW5kU3VwcGxpY2FudENvbm5lY3Rpb25DaGFuZ2VkQnJvYWRjYXN0KGZhbHNlKTsKKyAgICAgICAgICAgICAgICAgICAgbVN1cHBsaWNhbnRTdGF0ZVRyYWNrZXIucmVzZXRTdXBwbGljYW50U3RhdGUoKTsKKyAgICAgICAgICAgICAgICAgICAgdHJhbnNpdGlvblRvKG1Ecml2ZXJMb2FkZWRTdGF0ZSk7CisKKyAgICAgICAgICAgICAgICAgICAgLyogV2hlbiBzdXBwbGljYW50IGRpZXMsIHVubG9hZCBkcml2ZXIgYW5kIGVudGVyIGZhaWxlZCBzdGF0ZSAqLworICAgICAgICAgICAgICAgICAgICAvL1RPRE86IGNvbnNpZGVyIGJyaW5naW5nIHVwIHN1cHBsaWNhbnQgYWdhaW4KKyAgICAgICAgICAgICAgICAgICAgaWYgKG1lc3NhZ2Uud2hhdCA9PSBTVVBfRElTQ09OTkVDVElPTl9FVkVOVCkgeworICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiU3VwcGxpY2FudCBkaWVkLCB1bmxvYWRpbmcgZHJpdmVyIik7CisgICAgICAgICAgICAgICAgICAgICAgICBzZW5kTWVzc2FnZShvYnRhaW5NZXNzYWdlKENNRF9VTkxPQURfRFJJVkVSLCBXSUZJX1NUQVRFX1VOS05PV04sIDApKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9TVEFSVF9EUklWRVI6CisgICAgICAgICAgICAgICAgICAgIEV2ZW50TG9nLndyaXRlRXZlbnQoRVZFTlRMT0dfV0lGSV9FVkVOVF9IQU5ETEVELCBtZXNzYWdlLndoYXQpOworICAgICAgICAgICAgICAgICAgICBXaWZpTmF0aXZlLnN0YXJ0RHJpdmVyQ29tbWFuZCgpOworICAgICAgICAgICAgICAgICAgICB0cmFuc2l0aW9uVG8obURyaXZlclN0YXJ0aW5nU3RhdGUpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFNDQU5fUkVTVUxUU19FVkVOVDoKKyAgICAgICAgICAgICAgICAgICAgc2V0U2NhblJlc3VsdHMoV2lmaU5hdGl2ZS5zY2FuUmVzdWx0c0NvbW1hbmQoKSk7CisgICAgICAgICAgICAgICAgICAgIHNlbmRTY2FuUmVzdWx0c0F2YWlsYWJsZUJyb2FkY2FzdCgpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9QSU5HX1NVUFBMSUNBTlQ6CisgICAgICAgICAgICAgICAgICAgIHN5bmNQYXJhbXMgPSAoU3luY1BhcmFtcykgbWVzc2FnZS5vYmo7CisgICAgICAgICAgICAgICAgICAgIHN5bmNQYXJhbXMubVN5bmNSZXR1cm4uYm9vbFZhbHVlID0gV2lmaU5hdGl2ZS5waW5nQ29tbWFuZCgpOworICAgICAgICAgICAgICAgICAgICBub3RpZnlPbk1zZ09iamVjdChtZXNzYWdlKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBDTURfQUREX09SX1VQREFURV9ORVRXT1JLOgorICAgICAgICAgICAgICAgICAgICBFdmVudExvZy53cml0ZUV2ZW50KEVWRU5UTE9HX1dJRklfRVZFTlRfSEFORExFRCwgbWVzc2FnZS53aGF0KTsKKyAgICAgICAgICAgICAgICAgICAgc3luY1BhcmFtcyA9IChTeW5jUGFyYW1zKSBtZXNzYWdlLm9iajsKKyAgICAgICAgICAgICAgICAgICAgY29uZmlnID0gKFdpZmlDb25maWd1cmF0aW9uKSBzeW5jUGFyYW1zLm1QYXJhbWV0ZXI7CisgICAgICAgICAgICAgICAgICAgIHN5bmNQYXJhbXMubVN5bmNSZXR1cm4uaW50VmFsdWUgPSBXaWZpQ29uZmlnU3RvcmUuYWRkT3JVcGRhdGVOZXR3b3JrKGNvbmZpZyk7CisgICAgICAgICAgICAgICAgICAgIG5vdGlmeU9uTXNnT2JqZWN0KG1lc3NhZ2UpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9SRU1PVkVfTkVUV09SSzoKKyAgICAgICAgICAgICAgICAgICAgRXZlbnRMb2cud3JpdGVFdmVudChFVkVOVExPR19XSUZJX0VWRU5UX0hBTkRMRUQsIG1lc3NhZ2Uud2hhdCk7CisgICAgICAgICAgICAgICAgICAgIHN5bmNQYXJhbXMgPSAoU3luY1BhcmFtcykgbWVzc2FnZS5vYmo7CisgICAgICAgICAgICAgICAgICAgIHN5bmNQYXJhbXMubVN5bmNSZXR1cm4uYm9vbFZhbHVlID0gV2lmaUNvbmZpZ1N0b3JlLnJlbW92ZU5ldHdvcmsoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UuYXJnMSk7CisgICAgICAgICAgICAgICAgICAgIG5vdGlmeU9uTXNnT2JqZWN0KG1lc3NhZ2UpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9FTkFCTEVfTkVUV09SSzoKKyAgICAgICAgICAgICAgICAgICAgRXZlbnRMb2cud3JpdGVFdmVudChFVkVOVExPR19XSUZJX0VWRU5UX0hBTkRMRUQsIG1lc3NhZ2Uud2hhdCk7CisgICAgICAgICAgICAgICAgICAgIHN5bmNQYXJhbXMgPSAoU3luY1BhcmFtcykgbWVzc2FnZS5vYmo7CisgICAgICAgICAgICAgICAgICAgIEVuYWJsZU5ldFBhcmFtcyBlbmFibGVOZXRQYXJhbXMgPSAoRW5hYmxlTmV0UGFyYW1zKSBzeW5jUGFyYW1zLm1QYXJhbWV0ZXI7CisgICAgICAgICAgICAgICAgICAgIHN5bmNQYXJhbXMubVN5bmNSZXR1cm4uYm9vbFZhbHVlID0gV2lmaUNvbmZpZ1N0b3JlLmVuYWJsZU5ldHdvcmsoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5hYmxlTmV0UGFyYW1zLm5ldElkLCBlbmFibGVOZXRQYXJhbXMuZGlzYWJsZU90aGVycyk7CisgICAgICAgICAgICAgICAgICAgIG5vdGlmeU9uTXNnT2JqZWN0KG1lc3NhZ2UpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9ESVNBQkxFX05FVFdPUks6CisgICAgICAgICAgICAgICAgICAgIEV2ZW50TG9nLndyaXRlRXZlbnQoRVZFTlRMT0dfV0lGSV9FVkVOVF9IQU5ETEVELCBtZXNzYWdlLndoYXQpOworICAgICAgICAgICAgICAgICAgICBzeW5jUGFyYW1zID0gKFN5bmNQYXJhbXMpIG1lc3NhZ2Uub2JqOworICAgICAgICAgICAgICAgICAgICBzeW5jUGFyYW1zLm1TeW5jUmV0dXJuLmJvb2xWYWx1ZSA9IFdpZmlDb25maWdTdG9yZS5kaXNhYmxlTmV0d29yaygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLmFyZzEpOworICAgICAgICAgICAgICAgICAgICBub3RpZnlPbk1zZ09iamVjdChtZXNzYWdlKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBDTURfQkxBQ0tMSVNUX05FVFdPUks6CisgICAgICAgICAgICAgICAgICAgIEV2ZW50TG9nLndyaXRlRXZlbnQoRVZFTlRMT0dfV0lGSV9FVkVOVF9IQU5ETEVELCBtZXNzYWdlLndoYXQpOworICAgICAgICAgICAgICAgICAgICBXaWZpTmF0aXZlLmFkZFRvQmxhY2tsaXN0Q29tbWFuZCgoU3RyaW5nKW1lc3NhZ2Uub2JqKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBDTURfQ0xFQVJfQkxBQ0tMSVNUOgorICAgICAgICAgICAgICAgICAgICBXaWZpTmF0aXZlLmNsZWFyQmxhY2tsaXN0Q29tbWFuZCgpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9TQVZFX0NPTkZJRzoKKyAgICAgICAgICAgICAgICAgICAgc3luY1BhcmFtcyA9IChTeW5jUGFyYW1zKSBtZXNzYWdlLm9iajsKKyAgICAgICAgICAgICAgICAgICAgc3luY1BhcmFtcy5tU3luY1JldHVybi5ib29sVmFsdWUgPSBXaWZpQ29uZmlnU3RvcmUuc2F2ZUNvbmZpZygpOworICAgICAgICAgICAgICAgICAgICBub3RpZnlPbk1zZ09iamVjdChtZXNzYWdlKTsKKyAgICAgICAgICAgICAgICAgICAgLy8gSW5mb3JtIHRoZSBiYWNrdXAgbWFuYWdlciBhYm91dCBhIGRhdGEgY2hhbmdlCisgICAgICAgICAgICAgICAgICAgIElCYWNrdXBNYW5hZ2VyIGlibSA9IElCYWNrdXBNYW5hZ2VyLlN0dWIuYXNJbnRlcmZhY2UoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VydmljZU1hbmFnZXIuZ2V0U2VydmljZShDb250ZXh0LkJBQ0tVUF9TRVJWSUNFKSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChpYm0gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpYm0uZGF0YUNoYW5nZWQoImNvbS5hbmRyb2lkLnByb3ZpZGVycy5zZXR0aW5ncyIpOworICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUcnkgYWdhaW4gbGF0ZXIKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9HRVRfTUFDX0FERFI6CisgICAgICAgICAgICAgICAgICAgIHN5bmNQYXJhbXMgPSAoU3luY1BhcmFtcykgbWVzc2FnZS5vYmo7CisgICAgICAgICAgICAgICAgICAgIHN5bmNQYXJhbXMubVN5bmNSZXR1cm4uc3RyaW5nVmFsdWUgPSBXaWZpTmF0aXZlLmdldE1hY0FkZHJlc3NDb21tYW5kKCk7CisgICAgICAgICAgICAgICAgICAgIG5vdGlmeU9uTXNnT2JqZWN0KG1lc3NhZ2UpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgLyogQ2Fubm90IHN0YXJ0IHNvZnQgQVAgd2hpbGUgaW4gY2xpZW50IG1vZGUgKi8KKyAgICAgICAgICAgICAgICBjYXNlIENNRF9TVEFSVF9BUDoKKyAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiRmFpbGVkIHRvIHN0YXJ0IHNvZnQgQVAgd2l0aCBhIHJ1bm5pbmcgc3VwcGxpY2FudCIpOworICAgICAgICAgICAgICAgICAgICBFdmVudExvZy53cml0ZUV2ZW50KEVWRU5UTE9HX1dJRklfRVZFTlRfSEFORExFRCwgbWVzc2FnZS53aGF0KTsKKyAgICAgICAgICAgICAgICAgICAgc2V0V2lmaUFwU3RhdGUoV0lGSV9BUF9TVEFURV9GQUlMRUQpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9TRVRfU0NBTl9NT0RFOgorICAgICAgICAgICAgICAgICAgICBtSXNTY2FuTW9kZSA9IChtZXNzYWdlLmFyZzEgPT0gU0NBTl9PTkxZX01PREUpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9TQVZFX05FVFdPUks6CisgICAgICAgICAgICAgICAgICAgIGNvbmZpZyA9IChXaWZpQ29uZmlndXJhdGlvbikgbWVzc2FnZS5vYmo7CisgICAgICAgICAgICAgICAgICAgIFdpZmlDb25maWdTdG9yZS5zYXZlTmV0d29yayhjb25maWcpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9GT1JHRVRfTkVUV09SSzoKKyAgICAgICAgICAgICAgICAgICAgV2lmaUNvbmZpZ1N0b3JlLmZvcmdldE5ldHdvcmsobWVzc2FnZS5hcmcxKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5PVF9IQU5ETEVEOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIEhBTkRMRUQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGFzcyBEcml2ZXJTdGFydGluZ1N0YXRlIGV4dGVuZHMgSGllcmFyY2hpY2FsU3RhdGUgeworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgZW50ZXIoKSB7CisgICAgICAgICAgICBpZiAoREJHKSBMb2cuZChUQUcsIGdldE5hbWUoKSArICJcbiIpOworICAgICAgICAgICAgRXZlbnRMb2cud3JpdGVFdmVudChFVkVOVExPR19XSUZJX1NUQVRFX0NIQU5HRUQsIGdldE5hbWUoKSk7CisgICAgICAgIH0KKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIHByb2Nlc3NNZXNzYWdlKE1lc3NhZ2UgbWVzc2FnZSkgeworICAgICAgICAgICAgaWYgKERCRykgTG9nLmQoVEFHLCBnZXROYW1lKCkgKyBtZXNzYWdlLnRvU3RyaW5nKCkgKyAiXG4iKTsKKyAgICAgICAgICAgIHN3aXRjaChtZXNzYWdlLndoYXQpIHsKKyAgICAgICAgICAgICAgICBjYXNlIERSSVZFUl9TVEFSVF9FVkVOVDoKKyAgICAgICAgICAgICAgICAgICAgdHJhbnNpdGlvblRvKG1Ecml2ZXJTdGFydGVkU3RhdGUpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgLyogUXVldWUgZHJpdmVyIGNvbW1hbmRzICYgY29ubmVjdGlvbiBldmVudHMgKi8KKyAgICAgICAgICAgICAgICBjYXNlIENNRF9TVEFSVF9EUklWRVI6CisgICAgICAgICAgICAgICAgY2FzZSBDTURfU1RPUF9EUklWRVI6CisgICAgICAgICAgICAgICAgY2FzZSBTVVBQTElDQU5UX1NUQVRFX0NIQU5HRV9FVkVOVDoKKyAgICAgICAgICAgICAgICBjYXNlIE5FVFdPUktfQ09OTkVDVElPTl9FVkVOVDoKKyAgICAgICAgICAgICAgICBjYXNlIE5FVFdPUktfRElTQ09OTkVDVElPTl9FVkVOVDoKKyAgICAgICAgICAgICAgICBjYXNlIFBBU1NXT1JEX01BWV9CRV9JTkNPUlJFQ1RfRVZFTlQ6CisgICAgICAgICAgICAgICAgY2FzZSBDTURfU0VUX1NDQU5fVFlQRToKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9TRVRfUE9XRVJfTU9ERToKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9TRVRfQkxVRVRPT1RIX0NPRVhJU1RFTkNFOgorICAgICAgICAgICAgICAgIGNhc2UgQ01EX1NFVF9CTFVFVE9PVEhfU0NBTl9NT0RFOgorICAgICAgICAgICAgICAgIGNhc2UgQ01EX1NFVF9OVU1fQUxMT1dFRF9DSEFOTkVMUzoKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9TVEFSVF9QQUNLRVRfRklMVEVSSU5HOgorICAgICAgICAgICAgICAgIGNhc2UgQ01EX1NUT1BfUEFDS0VUX0ZJTFRFUklORzoKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9TVEFSVF9TQ0FOOgorICAgICAgICAgICAgICAgIGNhc2UgQ01EX0RJU0NPTk5FQ1Q6CisgICAgICAgICAgICAgICAgY2FzZSBDTURfUkVBU1NPQ0lBVEU6CisgICAgICAgICAgICAgICAgY2FzZSBDTURfUkVDT05ORUNUOgorICAgICAgICAgICAgICAgICAgICBkZWZlck1lc3NhZ2UobWVzc2FnZSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBOT1RfSEFORExFRDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEV2ZW50TG9nLndyaXRlRXZlbnQoRVZFTlRMT0dfV0lGSV9FVkVOVF9IQU5ETEVELCBtZXNzYWdlLndoYXQpOworICAgICAgICAgICAgcmV0dXJuIEhBTkRMRUQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGFzcyBEcml2ZXJTdGFydGVkU3RhdGUgZXh0ZW5kcyBIaWVyYXJjaGljYWxTdGF0ZSB7CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBlbnRlcigpIHsKKyAgICAgICAgICAgIGlmIChEQkcpIExvZy5kKFRBRywgZ2V0TmFtZSgpICsgIlxuIik7CisgICAgICAgICAgICBFdmVudExvZy53cml0ZUV2ZW50KEVWRU5UTE9HX1dJRklfU1RBVEVfQ0hBTkdFRCwgZ2V0TmFtZSgpKTsKKworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBtQmF0dGVyeVN0YXRzLm5vdGVXaWZpUnVubmluZygpOworICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGlnbm9yZSkge30KKworICAgICAgICAgICAgLyogSW5pdGlhbGl6ZSBjaGFubmVsIGNvdW50ICovCisgICAgICAgICAgICBzZXROdW1BbGxvd2VkQ2hhbm5lbHMoKTsKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgKiBTVE9QU0hJUAorICAgICAgICAgICAgICogVE9ETzogV2UgYXJlIGhhdmluZyAxMUEgaXNzdWVzIHRoYXQgQnJvYWRjb20gaXMgbG9va2luZworICAgICAgICAgICAgICogdG8gcmVzb2x2ZSwgdGhpcyBpcyBhIHRlbXBvcmFyeSBmaXggdG8gYWxsb3cgb25seSAxMUIvRworICAgICAgICAgICAgICogYW5kIGhlbHAgaW1wcm92ZSBHb29nbGVHdWVzdCBjb25uZWN0aXZpdHkKKyAgICAgICAgICAgICAqIFdlIGFsc28gbmVlZCB0byBhZGQgdGhlIFVJIGZvciBiYW5kIGNvbnRyb2wKKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgV2lmaU5hdGl2ZS5zZXRCYW5kQ29tbWFuZChCQU5EXzJHKTsKKworICAgICAgICAgICAgaWYgKG1Jc1NjYW5Nb2RlKSB7CisgICAgICAgICAgICAgICAgV2lmaU5hdGl2ZS5zZXRTY2FuUmVzdWx0SGFuZGxpbmdDb21tYW5kKFNDQU5fT05MWV9NT0RFKTsKKyAgICAgICAgICAgICAgICBXaWZpTmF0aXZlLmRpc2Nvbm5lY3RDb21tYW5kKCk7CisgICAgICAgICAgICAgICAgdHJhbnNpdGlvblRvKG1TY2FuTW9kZVN0YXRlKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgV2lmaU5hdGl2ZS5zZXRTY2FuUmVzdWx0SGFuZGxpbmdDb21tYW5kKENPTk5FQ1RfTU9ERSk7CisgICAgICAgICAgICAgICAgLyogSWYgc3VwcGxpY2FudCBoYXMgYWxyZWFkeSBjb25uZWN0ZWQsIGJlZm9yZSB3ZSBjb3VsZCBmaW5pc2ggZXN0YWJsaXNoaW5nCisgICAgICAgICAgICAgICAgICogdGhlIGNvbnRyb2wgY2hhbm5lbCBjb25uZWN0aW9uLCB3ZSBtaXNzIGFsbCB0aGUgc3VwcGxpY2FudCBldmVudHMuCisgICAgICAgICAgICAgICAgICogRGlzY29ubmVjdCBhbmQgcmVjb25uZWN0IHdoZW4gZHJpdmVyIGhhcyBzdGFydGVkIHRvIGVuc3VyZSB3ZSByZWNlaXZlCisgICAgICAgICAgICAgICAgICogYWxsIHN1cHBsaWNhbnQgZXZlbnRzLgorICAgICAgICAgICAgICAgICAqCisgICAgICAgICAgICAgICAgICogVE9ETzogVGhpcyBpcyBhIGJpdCB1bmNsZWFuLCBpZGVhbGx5IHRoZSBzdXBwbGljYW50IHNob3VsZCBuZXZlcgorICAgICAgICAgICAgICAgICAqIGNvbm5lY3QgdW50aWwgdG9sZCB0byBkbyBzbyBieSB0aGUgZnJhbWV3b3JrCisgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgV2lmaU5hdGl2ZS5kaXNjb25uZWN0Q29tbWFuZCgpOworICAgICAgICAgICAgICAgIFdpZmlOYXRpdmUucmVjb25uZWN0Q29tbWFuZCgpOworICAgICAgICAgICAgICAgIHRyYW5zaXRpb25UbyhtQ29ubmVjdE1vZGVTdGF0ZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIHByb2Nlc3NNZXNzYWdlKE1lc3NhZ2UgbWVzc2FnZSkgeworICAgICAgICAgICAgaWYgKERCRykgTG9nLmQoVEFHLCBnZXROYW1lKCkgKyBtZXNzYWdlLnRvU3RyaW5nKCkgKyAiXG4iKTsKKyAgICAgICAgICAgIFN5bmNQYXJhbXMgc3luY1BhcmFtczsKKyAgICAgICAgICAgIHN3aXRjaChtZXNzYWdlLndoYXQpIHsKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9TRVRfU0NBTl9UWVBFOgorICAgICAgICAgICAgICAgICAgICBpZiAobWVzc2FnZS5hcmcxID09IFNDQU5fQUNUSVZFKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBXaWZpTmF0aXZlLnNldFNjYW5Nb2RlQ29tbWFuZCh0cnVlKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFdpZmlOYXRpdmUuc2V0U2Nhbk1vZGVDb21tYW5kKGZhbHNlKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9TRVRfUE9XRVJfTU9ERToKKyAgICAgICAgICAgICAgICAgICAgV2lmaU5hdGl2ZS5zZXRQb3dlck1vZGVDb21tYW5kKG1lc3NhZ2UuYXJnMSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQ01EX1NFVF9CTFVFVE9PVEhfQ09FWElTVEVOQ0U6CisgICAgICAgICAgICAgICAgICAgIFdpZmlOYXRpdmUuc2V0Qmx1ZXRvb3RoQ29leGlzdGVuY2VNb2RlQ29tbWFuZChtZXNzYWdlLmFyZzEpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9TRVRfQkxVRVRPT1RIX1NDQU5fTU9ERToKKyAgICAgICAgICAgICAgICAgICAgV2lmaU5hdGl2ZS5zZXRCbHVldG9vdGhDb2V4aXN0ZW5jZVNjYW5Nb2RlQ29tbWFuZChtZXNzYWdlLmFyZzEgPT0gMSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQ01EX1NFVF9OVU1fQUxMT1dFRF9DSEFOTkVMUzoKKyAgICAgICAgICAgICAgICAgICAgbU51bUFsbG93ZWRDaGFubmVscyA9IG1lc3NhZ2UuYXJnMTsKKyAgICAgICAgICAgICAgICAgICAgV2lmaU5hdGl2ZS5zZXROdW1BbGxvd2VkQ2hhbm5lbHNDb21tYW5kKG1lc3NhZ2UuYXJnMSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQ01EX1NUQVJUX0RSSVZFUjoKKyAgICAgICAgICAgICAgICAgICAgLyogSWdub3JlIGFub3RoZXIgZHJpdmVyIHN0YXJ0ICovCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQ01EX1NUT1BfRFJJVkVSOgorICAgICAgICAgICAgICAgICAgICBXaWZpTmF0aXZlLnN0b3BEcml2ZXJDb21tYW5kKCk7CisgICAgICAgICAgICAgICAgICAgIHRyYW5zaXRpb25UbyhtRHJpdmVyU3RvcHBpbmdTdGF0ZSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQ01EX1JFUVVFU1RfQ01fV0FLRUxPQ0s6CisgICAgICAgICAgICAgICAgICAgIGlmIChtQ20gPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgbUNtID0gKENvbm5lY3Rpdml0eU1hbmFnZXIpbUNvbnRleHQuZ2V0U3lzdGVtU2VydmljZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udGV4dC5DT05ORUNUSVZJVFlfU0VSVklDRSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgbUNtLnJlcXVlc3ROZXR3b3JrVHJhbnNpdGlvbldha2Vsb2NrKFRBRyk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQ01EX1NUQVJUX1BBQ0tFVF9GSUxURVJJTkc6CisgICAgICAgICAgICAgICAgICAgIFdpZmlOYXRpdmUuc3RhcnRQYWNrZXRGaWx0ZXJpbmcoKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBDTURfU1RPUF9QQUNLRVRfRklMVEVSSU5HOgorICAgICAgICAgICAgICAgICAgICBXaWZpTmF0aXZlLnN0b3BQYWNrZXRGaWx0ZXJpbmcoKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5PVF9IQU5ETEVEOworICAgICAgICAgICAgfQorICAgICAgICAgICAgRXZlbnRMb2cud3JpdGVFdmVudChFVkVOVExPR19XSUZJX0VWRU5UX0hBTkRMRUQsIG1lc3NhZ2Uud2hhdCk7CisgICAgICAgICAgICByZXR1cm4gSEFORExFRDsKKyAgICAgICAgfQorICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgZXhpdCgpIHsKKyAgICAgICAgICAgIGlmIChEQkcpIExvZy5kKFRBRywgZ2V0TmFtZSgpICsgIlxuIik7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIG1CYXR0ZXJ5U3RhdHMubm90ZVdpZmlTdG9wcGVkKCk7CisgICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gaWdub3JlKSB7IH0KKyAgICAgICAgICAgIG1TY2FuUmVzdWx0cyA9IG51bGw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGFzcyBEcml2ZXJTdG9wcGluZ1N0YXRlIGV4dGVuZHMgSGllcmFyY2hpY2FsU3RhdGUgeworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgZW50ZXIoKSB7CisgICAgICAgICAgICBpZiAoREJHKSBMb2cuZChUQUcsIGdldE5hbWUoKSArICJcbiIpOworICAgICAgICAgICAgRXZlbnRMb2cud3JpdGVFdmVudChFVkVOVExPR19XSUZJX1NUQVRFX0NIQU5HRUQsIGdldE5hbWUoKSk7CisgICAgICAgIH0KKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIHByb2Nlc3NNZXNzYWdlKE1lc3NhZ2UgbWVzc2FnZSkgeworICAgICAgICAgICAgaWYgKERCRykgTG9nLmQoVEFHLCBnZXROYW1lKCkgKyBtZXNzYWdlLnRvU3RyaW5nKCkgKyAiXG4iKTsKKyAgICAgICAgICAgIHN3aXRjaChtZXNzYWdlLndoYXQpIHsKKyAgICAgICAgICAgICAgICBjYXNlIERSSVZFUl9TVE9QX0VWRU5UOgorICAgICAgICAgICAgICAgICAgICB0cmFuc2l0aW9uVG8obURyaXZlclN0b3BwZWRTdGF0ZSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAvKiBRdWV1ZSBkcml2ZXIgY29tbWFuZHMgKi8KKyAgICAgICAgICAgICAgICBjYXNlIENNRF9TVEFSVF9EUklWRVI6CisgICAgICAgICAgICAgICAgY2FzZSBDTURfU1RPUF9EUklWRVI6CisgICAgICAgICAgICAgICAgY2FzZSBDTURfU0VUX1NDQU5fVFlQRToKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9TRVRfUE9XRVJfTU9ERToKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9TRVRfQkxVRVRPT1RIX0NPRVhJU1RFTkNFOgorICAgICAgICAgICAgICAgIGNhc2UgQ01EX1NFVF9CTFVFVE9PVEhfU0NBTl9NT0RFOgorICAgICAgICAgICAgICAgIGNhc2UgQ01EX1NFVF9OVU1fQUxMT1dFRF9DSEFOTkVMUzoKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9TVEFSVF9QQUNLRVRfRklMVEVSSU5HOgorICAgICAgICAgICAgICAgIGNhc2UgQ01EX1NUT1BfUEFDS0VUX0ZJTFRFUklORzoKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9TVEFSVF9TQ0FOOgorICAgICAgICAgICAgICAgIGNhc2UgQ01EX0RJU0NPTk5FQ1Q6CisgICAgICAgICAgICAgICAgY2FzZSBDTURfUkVBU1NPQ0lBVEU6CisgICAgICAgICAgICAgICAgY2FzZSBDTURfUkVDT05ORUNUOgorICAgICAgICAgICAgICAgICAgICBkZWZlck1lc3NhZ2UobWVzc2FnZSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBOT1RfSEFORExFRDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEV2ZW50TG9nLndyaXRlRXZlbnQoRVZFTlRMT0dfV0lGSV9FVkVOVF9IQU5ETEVELCBtZXNzYWdlLndoYXQpOworICAgICAgICAgICAgcmV0dXJuIEhBTkRMRUQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGFzcyBEcml2ZXJTdG9wcGVkU3RhdGUgZXh0ZW5kcyBIaWVyYXJjaGljYWxTdGF0ZSB7CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBlbnRlcigpIHsKKyAgICAgICAgICAgIGlmIChEQkcpIExvZy5kKFRBRywgZ2V0TmFtZSgpICsgIlxuIik7CisgICAgICAgICAgICBFdmVudExvZy53cml0ZUV2ZW50KEVWRU5UTE9HX1dJRklfU1RBVEVfQ0hBTkdFRCwgZ2V0TmFtZSgpKTsKKyAgICAgICAgfQorICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gcHJvY2Vzc01lc3NhZ2UoTWVzc2FnZSBtZXNzYWdlKSB7CisgICAgICAgICAgICBpZiAoREJHKSBMb2cuZChUQUcsIGdldE5hbWUoKSArIG1lc3NhZ2UudG9TdHJpbmcoKSArICJcbiIpOworICAgICAgICAgICAgcmV0dXJuIE5PVF9IQU5ETEVEOworICAgICAgICB9CisgICAgfQorCisgICAgY2xhc3MgU2Nhbk1vZGVTdGF0ZSBleHRlbmRzIEhpZXJhcmNoaWNhbFN0YXRlIHsKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIGVudGVyKCkgeworICAgICAgICAgICAgaWYgKERCRykgTG9nLmQoVEFHLCBnZXROYW1lKCkgKyAiXG4iKTsKKyAgICAgICAgICAgIEV2ZW50TG9nLndyaXRlRXZlbnQoRVZFTlRMT0dfV0lGSV9TVEFURV9DSEFOR0VELCBnZXROYW1lKCkpOworICAgICAgICB9CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBwcm9jZXNzTWVzc2FnZShNZXNzYWdlIG1lc3NhZ2UpIHsKKyAgICAgICAgICAgIGlmIChEQkcpIExvZy5kKFRBRywgZ2V0TmFtZSgpICsgbWVzc2FnZS50b1N0cmluZygpICsgIlxuIik7CisgICAgICAgICAgICBTeW5jUGFyYW1zIHN5bmNQYXJhbXM7CisgICAgICAgICAgICBzd2l0Y2gobWVzc2FnZS53aGF0KSB7CisgICAgICAgICAgICAgICAgY2FzZSBDTURfU0VUX1NDQU5fTU9ERToKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1lc3NhZ2UuYXJnMSA9PSBTQ0FOX09OTFlfTU9ERSkgeworICAgICAgICAgICAgICAgICAgICAgICAgLyogSWdub3JlICovCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gSEFORExFRDsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFdpZmlOYXRpdmUuc2V0U2NhblJlc3VsdEhhbmRsaW5nQ29tbWFuZChtZXNzYWdlLmFyZzEpOworICAgICAgICAgICAgICAgICAgICAgICAgV2lmaU5hdGl2ZS5yZWNvbm5lY3RDb21tYW5kKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBtSXNTY2FuTW9kZSA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNpdGlvblRvKG1EaXNjb25uZWN0ZWRTdGF0ZSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBDTURfU1RBUlRfU0NBTjoKKyAgICAgICAgICAgICAgICAgICAgV2lmaU5hdGl2ZS5zY2FuQ29tbWFuZChtZXNzYWdlLmFyZzEgPT0gU0NBTl9BQ1RJVkUpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgLyogSWdub3JlICovCisgICAgICAgICAgICAgICAgY2FzZSBDTURfRElTQ09OTkVDVDoKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9SRUNPTk5FQ1Q6CisgICAgICAgICAgICAgICAgY2FzZSBDTURfUkVBU1NPQ0lBVEU6CisgICAgICAgICAgICAgICAgY2FzZSBTVVBQTElDQU5UX1NUQVRFX0NIQU5HRV9FVkVOVDoKKyAgICAgICAgICAgICAgICBjYXNlIE5FVFdPUktfQ09OTkVDVElPTl9FVkVOVDoKKyAgICAgICAgICAgICAgICBjYXNlIE5FVFdPUktfRElTQ09OTkVDVElPTl9FVkVOVDoKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5PVF9IQU5ETEVEOworICAgICAgICAgICAgfQorICAgICAgICAgICAgRXZlbnRMb2cud3JpdGVFdmVudChFVkVOVExPR19XSUZJX0VWRU5UX0hBTkRMRUQsIG1lc3NhZ2Uud2hhdCk7CisgICAgICAgICAgICByZXR1cm4gSEFORExFRDsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsYXNzIENvbm5lY3RNb2RlU3RhdGUgZXh0ZW5kcyBIaWVyYXJjaGljYWxTdGF0ZSB7CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBlbnRlcigpIHsKKyAgICAgICAgICAgIGlmIChEQkcpIExvZy5kKFRBRywgZ2V0TmFtZSgpICsgIlxuIik7CisgICAgICAgICAgICBFdmVudExvZy53cml0ZUV2ZW50KEVWRU5UTE9HX1dJRklfU1RBVEVfQ0hBTkdFRCwgZ2V0TmFtZSgpKTsKKyAgICAgICAgfQorICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gcHJvY2Vzc01lc3NhZ2UoTWVzc2FnZSBtZXNzYWdlKSB7CisgICAgICAgICAgICBpZiAoREJHKSBMb2cuZChUQUcsIGdldE5hbWUoKSArIG1lc3NhZ2UudG9TdHJpbmcoKSArICJcbiIpOworICAgICAgICAgICAgU3luY1BhcmFtcyBzeW5jUGFyYW1zOworICAgICAgICAgICAgU3RhdGVDaGFuZ2VSZXN1bHQgc3RhdGVDaGFuZ2VSZXN1bHQ7CisgICAgICAgICAgICBzd2l0Y2gobWVzc2FnZS53aGF0KSB7CisgICAgICAgICAgICAgICAgY2FzZSBQQVNTV09SRF9NQVlfQkVfSU5DT1JSRUNUX0VWRU5UOgorICAgICAgICAgICAgICAgICAgICBtUGFzc3dvcmRLZXlNYXlCZUluY29ycmVjdCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgU1VQUExJQ0FOVF9TVEFURV9DSEFOR0VfRVZFTlQ6CisgICAgICAgICAgICAgICAgICAgIHN0YXRlQ2hhbmdlUmVzdWx0ID0gKFN0YXRlQ2hhbmdlUmVzdWx0KSBtZXNzYWdlLm9iajsKKyAgICAgICAgICAgICAgICAgICAgbVN1cHBsaWNhbnRTdGF0ZVRyYWNrZXIuaGFuZGxlRXZlbnQoc3RhdGVDaGFuZ2VSZXN1bHQpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9TVEFSVF9TQ0FOOgorICAgICAgICAgICAgICAgICAgICAvKiBXZSBuZWVkIHRvIHNldCBzY2FuIHR5cGUgaW4gY29tcGxldGVkIHN0YXRlICovCisgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgbmV3TXNnID0gb2J0YWluTWVzc2FnZSgpOworICAgICAgICAgICAgICAgICAgICBuZXdNc2cuY29weUZyb20obWVzc2FnZSk7CisgICAgICAgICAgICAgICAgICAgIG1TdXBwbGljYW50U3RhdGVUcmFja2VyLnNlbmRNZXNzYWdlKG5ld01zZyk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAvKiBEbyBhIHJlZHVuZGFudCBkaXNjb25uZWN0IHdpdGhvdXQgdHJhbnNpdGlvbiAqLworICAgICAgICAgICAgICAgIGNhc2UgQ01EX0RJU0NPTk5FQ1Q6CisgICAgICAgICAgICAgICAgICAgIFdpZmlOYXRpdmUuZGlzY29ubmVjdENvbW1hbmQoKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBDTURfUkVDT05ORUNUOgorICAgICAgICAgICAgICAgICAgICBXaWZpTmF0aXZlLnJlY29ubmVjdENvbW1hbmQoKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBDTURfUkVBU1NPQ0lBVEU6CisgICAgICAgICAgICAgICAgICAgIFdpZmlOYXRpdmUucmVhc3NvY2lhdGVDb21tYW5kKCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQ01EX0NPTk5FQ1RfTkVUV09SSzoKKyAgICAgICAgICAgICAgICAgICAgaW50IG5ldElkID0gbWVzc2FnZS5hcmcxOworICAgICAgICAgICAgICAgICAgICBXaWZpQ29uZmlndXJhdGlvbiBjb25maWcgPSAoV2lmaUNvbmZpZ3VyYXRpb24pIG1lc3NhZ2Uub2JqOworCisgICAgICAgICAgICAgICAgICAgIC8qIFdlIGNvbm5lY3QgdG8gYSBzcGVjaWZpYyBuZXR3b3JrIGJ5IGlzc3VpbmcgYSBzZWxlY3QKKyAgICAgICAgICAgICAgICAgICAgICogdG8gdGhlIFdpZmlDb25maWdTdG9yZS4gVGhpcyBlbmFibGVzIHRoZSBuZXR3b3JrLAorICAgICAgICAgICAgICAgICAgICAgKiB3aGlsZSBkaXNhYmxpbmcgYWxsIG90aGVyIG5ldHdvcmtzIGluIHRoZSBzdXBwbGljYW50LgorICAgICAgICAgICAgICAgICAgICAgKiBEaXNhYmxpbmcgYSBjb25uZWN0ZWQgbmV0d29yayB3aWxsIGNhdXNlIGEgZGlzY29ubmVjdGlvbgorICAgICAgICAgICAgICAgICAgICAgKiBmcm9tIHRoZSBuZXR3b3JrLiBBIHJlY29ubmVjdENvbW1hbmQoKSB3aWxsIHRoZW4gaW5pdGlhdGUKKyAgICAgICAgICAgICAgICAgICAgICogYSBjb25uZWN0aW9uIHRvIHRoZSBlbmFibGVkIG5ldHdvcmsuCisgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICAgICBpZiAoY29uZmlnICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFdpZmlDb25maWdTdG9yZS5zZWxlY3ROZXR3b3JrKGNvbmZpZyk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBXaWZpQ29uZmlnU3RvcmUuc2VsZWN0TmV0d29yayhuZXRJZCk7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAvKiBTYXZlIGEgZmxhZyB0byBpbmRpY2F0ZSB0aGF0IHdlIG5lZWQgdG8gZW5hYmxlIGFsbAorICAgICAgICAgICAgICAgICAgICAgKiBuZXR3b3JrcyBhZnRlciBzdXBwbGljYW50IGluZGljYXRlcyBhIG5ldHdvcmsKKyAgICAgICAgICAgICAgICAgICAgICogc3RhdGUgY2hhbmdlIGV2ZW50CisgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICAgICBtRW5hYmxlQWxsTmV0d29ya3MgPSB0cnVlOworCisgICAgICAgICAgICAgICAgICAgIFdpZmlOYXRpdmUucmVjb25uZWN0Q29tbWFuZCgpOworCisgICAgICAgICAgICAgICAgICAgIC8qIEV4cGVjdCBhIGRpc2Nvbm5lY3Rpb24gZnJvbSB0aGUgb2xkIGNvbm5lY3Rpb24gKi8KKyAgICAgICAgICAgICAgICAgICAgdHJhbnNpdGlvblRvKG1EaXNjb25uZWN0aW5nU3RhdGUpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFNDQU5fUkVTVUxUU19FVkVOVDoKKyAgICAgICAgICAgICAgICAgICAgLyogU2V0IHRoZSBzY2FuIHNldHRpbmcgYmFjayB0byAiY29ubmVjdCIgbW9kZSAqLworICAgICAgICAgICAgICAgICAgICBXaWZpTmF0aXZlLnNldFNjYW5SZXN1bHRIYW5kbGluZ0NvbW1hbmQoQ09OTkVDVF9NT0RFKTsKKyAgICAgICAgICAgICAgICAgICAgLyogSGFuZGxlIHNjYW4gcmVzdWx0cyAqLworICAgICAgICAgICAgICAgICAgICByZXR1cm4gTk9UX0hBTkRMRUQ7CisgICAgICAgICAgICAgICAgY2FzZSBORVRXT1JLX0NPTk5FQ1RJT05fRVZFTlQ6CisgICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywiTmV0d29yayBjb25uZWN0aW9uIGVzdGFibGlzaGVkIik7CisgICAgICAgICAgICAgICAgICAgIHN0YXRlQ2hhbmdlUmVzdWx0ID0gKFN0YXRlQ2hhbmdlUmVzdWx0KSBtZXNzYWdlLm9iajsKKworICAgICAgICAgICAgICAgICAgICAvL1RPRE86IG1ha2Ugc3VwcGxpY2FudCBtb2RpZmljYXRpb24gdG8gcHVzaCB0aGlzIGluIGV2ZW50cworICAgICAgICAgICAgICAgICAgICBtV2lmaUluZm8uc2V0U1NJRChmZXRjaFNTSUQoKSk7CisgICAgICAgICAgICAgICAgICAgIG1XaWZpSW5mby5zZXRCU1NJRChtTGFzdEJzc2lkID0gc3RhdGVDaGFuZ2VSZXN1bHQuQlNTSUQpOworICAgICAgICAgICAgICAgICAgICBtV2lmaUluZm8uc2V0TmV0d29ya0lkKHN0YXRlQ2hhbmdlUmVzdWx0Lm5ldHdvcmtJZCk7CisgICAgICAgICAgICAgICAgICAgIG1MYXN0TmV0d29ya0lkID0gc3RhdGVDaGFuZ2VSZXN1bHQubmV0d29ya0lkOworICAgICAgICAgICAgICAgICAgICAvKiBzZW5kIGV2ZW50IHRvIENNICYgbmV0d29yayBjaGFuZ2UgYnJvYWRjYXN0ICovCisgICAgICAgICAgICAgICAgICAgIHNldERldGFpbGVkU3RhdGUoRGV0YWlsZWRTdGF0ZS5PQlRBSU5JTkdfSVBBRERSKTsKKyAgICAgICAgICAgICAgICAgICAgc2VuZE5ldHdvcmtTdGF0ZUNoYW5nZUJyb2FkY2FzdChtTGFzdEJzc2lkKTsKKyAgICAgICAgICAgICAgICAgICAgdHJhbnNpdGlvblRvKG1Db25uZWN0aW5nU3RhdGUpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIE5FVFdPUktfRElTQ09OTkVDVElPTl9FVkVOVDoKKyAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCJOZXR3b3JrIGNvbm5lY3Rpb24gbG9zdCIpOworICAgICAgICAgICAgICAgICAgICBoYW5kbGVOZXR3b3JrRGlzY29ubmVjdCgpOworICAgICAgICAgICAgICAgICAgICB0cmFuc2l0aW9uVG8obURpc2Nvbm5lY3RlZFN0YXRlKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBDTURfR0VUX1JTU0k6CisgICAgICAgICAgICAgICAgICAgIHN5bmNQYXJhbXMgPSAoU3luY1BhcmFtcykgbWVzc2FnZS5vYmo7CisgICAgICAgICAgICAgICAgICAgIHN5bmNQYXJhbXMubVN5bmNSZXR1cm4uaW50VmFsdWUgPSBXaWZpTmF0aXZlLmdldFJzc2lDb21tYW5kKCk7CisgICAgICAgICAgICAgICAgICAgIG5vdGlmeU9uTXNnT2JqZWN0KG1lc3NhZ2UpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9HRVRfUlNTSV9BUFBST1g6CisgICAgICAgICAgICAgICAgICAgIHN5bmNQYXJhbXMgPSAoU3luY1BhcmFtcykgbWVzc2FnZS5vYmo7CisgICAgICAgICAgICAgICAgICAgIHN5bmNQYXJhbXMubVN5bmNSZXR1cm4uaW50VmFsdWUgPSBXaWZpTmF0aXZlLmdldFJzc2lBcHByb3hDb21tYW5kKCk7CisgICAgICAgICAgICAgICAgICAgIG5vdGlmeU9uTXNnT2JqZWN0KG1lc3NhZ2UpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9HRVRfTElOS19TUEVFRDoKKyAgICAgICAgICAgICAgICAgICAgc3luY1BhcmFtcyA9IChTeW5jUGFyYW1zKSBtZXNzYWdlLm9iajsKKyAgICAgICAgICAgICAgICAgICAgc3luY1BhcmFtcy5tU3luY1JldHVybi5pbnRWYWx1ZSA9IFdpZmlOYXRpdmUuZ2V0TGlua1NwZWVkQ29tbWFuZCgpOworICAgICAgICAgICAgICAgICAgICBub3RpZnlPbk1zZ09iamVjdChtZXNzYWdlKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5PVF9IQU5ETEVEOworICAgICAgICAgICAgfQorICAgICAgICAgICAgRXZlbnRMb2cud3JpdGVFdmVudChFVkVOVExPR19XSUZJX0VWRU5UX0hBTkRMRUQsIG1lc3NhZ2Uud2hhdCk7CisgICAgICAgICAgICByZXR1cm4gSEFORExFRDsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsYXNzIENvbm5lY3RpbmdTdGF0ZSBleHRlbmRzIEhpZXJhcmNoaWNhbFN0YXRlIHsKKyAgICAgICAgYm9vbGVhbiBtTW9kaWZpZWRCbHVldG9vdGhDb2V4aXN0ZW5jZU1vZGU7CisgICAgICAgIGludCBtUG93ZXJNb2RlOworICAgICAgICBib29sZWFuIG1Vc2VTdGF0aWNJcDsKKyAgICAgICAgVGhyZWFkIG1EaGNwVGhyZWFkOworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBlbnRlcigpIHsKKyAgICAgICAgICAgIGlmIChEQkcpIExvZy5kKFRBRywgZ2V0TmFtZSgpICsgIlxuIik7CisgICAgICAgICAgICBFdmVudExvZy53cml0ZUV2ZW50KEVWRU5UTE9HX1dJRklfU1RBVEVfQ0hBTkdFRCwgZ2V0TmFtZSgpKTsKKworICAgICAgICAgICAgbVVzZVN0YXRpY0lwID0gV2lmaUNvbmZpZ1N0b3JlLmlzVXNpbmdTdGF0aWNJcChtTGFzdE5ldHdvcmtJZCk7CisgICAgICAgICAgICBpZiAoIW1Vc2VTdGF0aWNJcCkgeworICAgICAgICAgICAgICAgIG1EaGNwVGhyZWFkID0gbnVsbDsKKyAgICAgICAgICAgICAgICBtTW9kaWZpZWRCbHVldG9vdGhDb2V4aXN0ZW5jZU1vZGUgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICBtUG93ZXJNb2RlID0gRFJJVkVSX1BPV0VSX01PREVfQVVUTzsKKworICAgICAgICAgICAgICAgIGlmIChzaG91bGREaXNhYmxlQ29leGlzdGVuY2VNb2RlKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgICAgICAgICogVGhlcmUgYXJlIHByb2JsZW1zIHNldHRpbmcgdGhlIFdpLUZpIGRyaXZlcidzIHBvd2VyCisgICAgICAgICAgICAgICAgICAgICAqIG1vZGUgdG8gYWN0aXZlIHdoZW4gYmx1ZXRvb3RoIGNvZXhpc3RlbmNlIG1vZGUgaXMKKyAgICAgICAgICAgICAgICAgICAgICogZW5hYmxlZCBvciBzZW5zZS4KKyAgICAgICAgICAgICAgICAgICAgICogPHA+CisgICAgICAgICAgICAgICAgICAgICAqIFdlIHNldCBXaS1GaSB0byBhY3RpdmUgbW9kZSB3aGVuCisgICAgICAgICAgICAgICAgICAgICAqIG9idGFpbmluZyBhbiBJUCBhZGRyZXNzIGJlY2F1c2Ugd2UndmUgZm91bmQKKyAgICAgICAgICAgICAgICAgICAgICogY29tcGF0aWJpbGl0eSBpc3N1ZXMgd2l0aCBzb21lIHJvdXRlcnMgd2l0aCBsb3cgcG93ZXIKKyAgICAgICAgICAgICAgICAgICAgICogbW9kZS4KKyAgICAgICAgICAgICAgICAgICAgICogPHA+CisgICAgICAgICAgICAgICAgICAgICAqIEluIG9yZGVyIGZvciB0aGlzIGFjdGl2ZSBwb3dlciBtb2RlIHRvIHByb3Blcmx5IGJlIHNldCwKKyAgICAgICAgICAgICAgICAgICAgICogd2UgZGlzYWJsZSBjb2V4aXN0ZW5jZSBtb2RlIHVudGlsIHdlJ3JlIGRvbmUgd2l0aAorICAgICAgICAgICAgICAgICAgICAgKiBvYnRhaW5pbmcgYW4gSVAgYWRkcmVzcy4gIE9uZSBleGNlcHRpb24gaXMgaWYgd2UKKyAgICAgICAgICAgICAgICAgICAgICogYXJlIGN1cnJlbnRseSBjb25uZWN0ZWQgdG8gYSBoZWFkc2V0LCBzaW5jZSBkaXNhYmxpbmcKKyAgICAgICAgICAgICAgICAgICAgICogY29leGlzdGVuY2Ugd291bGQgaW50ZXJydXB0IHRoYXQgY29ubmVjdGlvbi4KKyAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgICAgIG1Nb2RpZmllZEJsdWV0b290aENvZXhpc3RlbmNlTW9kZSA9IHRydWU7CisKKyAgICAgICAgICAgICAgICAgICAgLy8gRGlzYWJsZSB0aGUgY29leGlzdGVuY2UgbW9kZQorICAgICAgICAgICAgICAgICAgICBXaWZpTmF0aXZlLnNldEJsdWV0b290aENvZXhpc3RlbmNlTW9kZUNvbW1hbmQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2lmaU5hdGl2ZS5CTFVFVE9PVEhfQ09FWElTVEVOQ0VfTU9ERV9ESVNBQkxFRCk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgbVBvd2VyTW9kZSA9ICBXaWZpTmF0aXZlLmdldFBvd2VyTW9kZUNvbW1hbmQoKTsKKyAgICAgICAgICAgICAgICBpZiAobVBvd2VyTW9kZSA8IDApIHsKKyAgICAgICAgICAgICAgICAgIC8vIEhhbmRsZSB0aGUgY2FzZSB3aGVyZSBzdXBwbGljYW50IGRyaXZlciBkb2VzIG5vdCBzdXBwb3J0CisgICAgICAgICAgICAgICAgICAvLyBnZXRQb3dlck1vZGVDb21tYW5kLgorICAgICAgICAgICAgICAgICAgICBtUG93ZXJNb2RlID0gRFJJVkVSX1BPV0VSX01PREVfQVVUTzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKG1Qb3dlck1vZGUgIT0gRFJJVkVSX1BPV0VSX01PREVfQUNUSVZFKSB7CisgICAgICAgICAgICAgICAgICAgIFdpZmlOYXRpdmUuc2V0UG93ZXJNb2RlQ29tbWFuZChEUklWRVJfUE9XRVJfTU9ERV9BQ1RJVkUpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIkRIQ1AgcmVxdWVzdCBzdGFydGVkIik7CisgICAgICAgICAgICAgICAgbURoY3BUaHJlYWQgPSBuZXcgVGhyZWFkKG5ldyBSdW5uYWJsZSgpIHsKKyAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgICAgICAgICAgRGhjcEluZm8gZGhjcEluZm8gPSBuZXcgRGhjcEluZm8oKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChOZXR3b3JrVXRpbHMucnVuRGhjcChtSW50ZXJmYWNlTmFtZSwgZGhjcEluZm8pKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiREhDUCByZXF1ZXN0IHN1Y2NlZWRlZCIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5bmNocm9uaXplZCAobURoY3BJbmZvKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1EaGNwSW5mbyA9IGRoY3BJbmZvOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZW5kTWVzc2FnZShDTURfSVBfQ09ORklHX1NVQ0NFU1MpOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJESENQIHJlcXVlc3QgZmFpbGVkOiAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5ldHdvcmtVdGlscy5nZXREaGNwRXJyb3IoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VuZE1lc3NhZ2UoQ01EX0lQX0NPTkZJR19GQUlMVVJFKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgICAgIG1EaGNwVGhyZWFkLnN0YXJ0KCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIERoY3BJbmZvIGRoY3BJbmZvID0gV2lmaUNvbmZpZ1N0b3JlLmdldElwQ29uZmlndXJhdGlvbihtTGFzdE5ldHdvcmtJZCk7CisgICAgICAgICAgICAgICAgaWYgKE5ldHdvcmtVdGlscy5jb25maWd1cmVJbnRlcmZhY2UobUludGVyZmFjZU5hbWUsIGRoY3BJbmZvKSkgeworICAgICAgICAgICAgICAgICAgICBMb2cudihUQUcsICJTdGF0aWMgSVAgY29uZmlndXJhdGlvbiBzdWNjZWVkZWQiKTsKKyAgICAgICAgICAgICAgICAgICAgc3luY2hyb25pemVkIChtRGhjcEluZm8pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1EaGNwSW5mbyA9IGRoY3BJbmZvOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHNlbmRNZXNzYWdlKENNRF9JUF9DT05GSUdfU1VDQ0VTUyk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgTG9nLnYoVEFHLCAiU3RhdGljIElQIGNvbmZpZ3VyYXRpb24gZmFpbGVkIik7CisgICAgICAgICAgICAgICAgICAgIHNlbmRNZXNzYWdlKENNRF9JUF9DT05GSUdfRkFJTFVSRSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgfQorICAgICAgQE92ZXJyaWRlCisgICAgICBwdWJsaWMgYm9vbGVhbiBwcm9jZXNzTWVzc2FnZShNZXNzYWdlIG1lc3NhZ2UpIHsKKyAgICAgICAgICBpZiAoREJHKSBMb2cuZChUQUcsIGdldE5hbWUoKSArIG1lc3NhZ2UudG9TdHJpbmcoKSArICJcbiIpOworCisgICAgICAgICAgc3dpdGNoKG1lc3NhZ2Uud2hhdCkgeworICAgICAgICAgICAgICBjYXNlIENNRF9JUF9DT05GSUdfU1VDQ0VTUzoKKyAgICAgICAgICAgICAgICAgIG1SZWNvbm5lY3RDb3VudCA9IDA7CisgICAgICAgICAgICAgICAgICBtTGFzdFNpZ25hbExldmVsID0gLTE7IC8vIGZvcmNlIHVwZGF0ZSBvZiBzaWduYWwgc3RyZW5ndGgKKyAgICAgICAgICAgICAgICAgIHN5bmNocm9uaXplZCAobURoY3BJbmZvKSB7CisgICAgICAgICAgICAgICAgICAgICAgbVdpZmlJbmZvLnNldElwQWRkcmVzcyhtRGhjcEluZm8uaXBBZGRyZXNzKTsKKyAgICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJJUCBjb25maWd1cmF0aW9uOiAiICsgbURoY3BJbmZvKTsKKyAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgIGNvbmZpZ3VyZUxpbmtQcm9wZXJ0aWVzKCk7CisgICAgICAgICAgICAgICAgICBzZXREZXRhaWxlZFN0YXRlKERldGFpbGVkU3RhdGUuQ09OTkVDVEVEKTsKKyAgICAgICAgICAgICAgICAgIHNlbmROZXR3b3JrU3RhdGVDaGFuZ2VCcm9hZGNhc3QobUxhc3RCc3NpZCk7CisgICAgICAgICAgICAgICAgICAvL1RPRE86IFRoZSBmcmFtZXdvcmsgaXMgbm90IGRldGVjdGluZyBhIERIQ1AgcmVuZXdhbCBhbmQgYSBwb3NzaWJsZQorICAgICAgICAgICAgICAgICAgLy9JUCBjaGFuZ2UuIHdlIHNob3VsZCBkZXRlY3QgdGhpcyBhbmQgc2VuZCBvdXQgYSBjb25maWcgY2hhbmdlIGJyb2FkY2FzdAorICAgICAgICAgICAgICAgICAgdHJhbnNpdGlvblRvKG1Db25uZWN0ZWRTdGF0ZSk7CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgY2FzZSBDTURfSVBfQ09ORklHX0ZBSUxVUkU6CisgICAgICAgICAgICAgICAgICBtV2lmaUluZm8uc2V0SXBBZGRyZXNzKDApOworCisgICAgICAgICAgICAgICAgICBMb2cuZShUQUcsICJJUCBjb25maWd1cmF0aW9uIGZhaWxlZCIpOworICAgICAgICAgICAgICAgICAgLyoqCisgICAgICAgICAgICAgICAgICAgKiBJZiB3ZSd2ZSBleGNlZWRlZCB0aGUgbWF4aW11bSBudW1iZXIgb2YgcmV0cmllcyBmb3IgREhDUAorICAgICAgICAgICAgICAgICAgICogdG8gYSBnaXZlbiBuZXR3b3JrLCBkaXNhYmxlIHRoZSBuZXR3b3JrCisgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgIGlmICgrK21SZWNvbm5lY3RDb3VudCA+IGdldE1heERoY3BSZXRyaWVzKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAiRmFpbGVkICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1SZWNvbm5lY3RDb3VudCArICIgdGltZXMsIERpc2FibGluZyAiICsgbUxhc3ROZXR3b3JrSWQpOworICAgICAgICAgICAgICAgICAgICAgIFdpZmlDb25maWdTdG9yZS5kaXNhYmxlTmV0d29yayhtTGFzdE5ldHdvcmtJZCk7CisgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgIC8qIERIQ1AgdGltZXMgb3V0IGFmdGVyIGFib3V0IDMwIHNlY29uZHMsIHdlIGRvIGEKKyAgICAgICAgICAgICAgICAgICAqIGRpc2Nvbm5lY3QgYW5kIGFuIGltbWVkaWF0ZSByZWNvbm5lY3QgdG8gdHJ5IGFnYWluCisgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgIFdpZmlOYXRpdmUuZGlzY29ubmVjdENvbW1hbmQoKTsKKyAgICAgICAgICAgICAgICAgIFdpZmlOYXRpdmUucmVjb25uZWN0Q29tbWFuZCgpOworICAgICAgICAgICAgICAgICAgdHJhbnNpdGlvblRvKG1EaXNjb25uZWN0aW5nU3RhdGUpOworICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIGNhc2UgQ01EX0RJU0NPTk5FQ1Q6CisgICAgICAgICAgICAgICAgICBXaWZpTmF0aXZlLmRpc2Nvbm5lY3RDb21tYW5kKCk7CisgICAgICAgICAgICAgICAgICB0cmFuc2l0aW9uVG8obURpc2Nvbm5lY3RpbmdTdGF0ZSk7CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgIC8qIElnbm9yZSBjb25uZWN0aW9uIHRvIHNhbWUgbmV0d29yayAqLworICAgICAgICAgICAgICBjYXNlIENNRF9DT05ORUNUX05FVFdPUks6CisgICAgICAgICAgICAgICAgICBpbnQgbmV0SWQgPSBtZXNzYWdlLmFyZzE7CisgICAgICAgICAgICAgICAgICBpZiAobVdpZmlJbmZvLmdldE5ldHdvcmtJZCgpID09IG5ldElkKSB7CisgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICByZXR1cm4gTk9UX0hBTkRMRUQ7CisgICAgICAgICAgICAgICAgICAvKiBJZ25vcmUgKi8KKyAgICAgICAgICAgICAgY2FzZSBORVRXT1JLX0NPTk5FQ1RJT05fRVZFTlQ6CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgY2FzZSBDTURfU1RPUF9EUklWRVI6CisgICAgICAgICAgICAgICAgICBzZW5kTWVzc2FnZShDTURfRElTQ09OTkVDVCk7CisgICAgICAgICAgICAgICAgICBkZWZlck1lc3NhZ2UobWVzc2FnZSk7CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgY2FzZSBDTURfU0VUX1NDQU5fTU9ERToKKyAgICAgICAgICAgICAgICAgIGlmIChtZXNzYWdlLmFyZzEgPT0gU0NBTl9PTkxZX01PREUpIHsKKyAgICAgICAgICAgICAgICAgICAgICBzZW5kTWVzc2FnZShDTURfRElTQ09OTkVDVCk7CisgICAgICAgICAgICAgICAgICAgICAgZGVmZXJNZXNzYWdlKG1lc3NhZ2UpOworICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIGNhc2UgQ01EX1JFQ09ORklHVVJFX0lQOgorICAgICAgICAgICAgICAgICAgZGVmZXJNZXNzYWdlKG1lc3NhZ2UpOworICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgcmV0dXJuIE5PVF9IQU5ETEVEOworICAgICAgICAgIH0KKyAgICAgICAgICBFdmVudExvZy53cml0ZUV2ZW50KEVWRU5UTE9HX1dJRklfRVZFTlRfSEFORExFRCwgbWVzc2FnZS53aGF0KTsKKyAgICAgICAgICByZXR1cm4gSEFORExFRDsKKyAgICAgIH0KKworICAgICAgQE92ZXJyaWRlCisgICAgICBwdWJsaWMgdm9pZCBleGl0KCkgeworICAgICAgICAgIC8qIHJlc2V0IHBvd2VyIHN0YXRlICYgYmx1ZXRvb3RoIGNvZXhpc3RlbmNlIGlmIG9uIERIQ1AgKi8KKyAgICAgICAgICBpZiAoIW1Vc2VTdGF0aWNJcCkgeworICAgICAgICAgICAgICBpZiAobVBvd2VyTW9kZSAhPSBEUklWRVJfUE9XRVJfTU9ERV9BQ1RJVkUpIHsKKyAgICAgICAgICAgICAgICAgIFdpZmlOYXRpdmUuc2V0UG93ZXJNb2RlQ29tbWFuZChtUG93ZXJNb2RlKTsKKyAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgIGlmIChtTW9kaWZpZWRCbHVldG9vdGhDb2V4aXN0ZW5jZU1vZGUpIHsKKyAgICAgICAgICAgICAgICAgIC8vIFNldCB0aGUgY29leGlzdGVuY2UgbW9kZSBiYWNrIHRvIGl0cyBkZWZhdWx0IHZhbHVlCisgICAgICAgICAgICAgICAgICBXaWZpTmF0aXZlLnNldEJsdWV0b290aENvZXhpc3RlbmNlTW9kZUNvbW1hbmQoCisgICAgICAgICAgICAgICAgICAgICAgICAgIFdpZmlOYXRpdmUuQkxVRVRPT1RIX0NPRVhJU1RFTkNFX01PREVfU0VOU0UpOworICAgICAgICAgICAgICB9CisgICAgICAgICAgfQorCisgICAgICB9CisgICAgfQorCisgICAgY2xhc3MgQ29ubmVjdGVkU3RhdGUgZXh0ZW5kcyBIaWVyYXJjaGljYWxTdGF0ZSB7CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBlbnRlcigpIHsKKyAgICAgICAgICAgIGlmIChEQkcpIExvZy5kKFRBRywgZ2V0TmFtZSgpICsgIlxuIik7CisgICAgICAgICAgICBFdmVudExvZy53cml0ZUV2ZW50KEVWRU5UTE9HX1dJRklfU1RBVEVfQ0hBTkdFRCwgZ2V0TmFtZSgpKTsKKyAgICAgICAgfQorICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gcHJvY2Vzc01lc3NhZ2UoTWVzc2FnZSBtZXNzYWdlKSB7CisgICAgICAgICAgICBpZiAoREJHKSBMb2cuZChUQUcsIGdldE5hbWUoKSArIG1lc3NhZ2UudG9TdHJpbmcoKSArICJcbiIpOworICAgICAgICAgICAgc3dpdGNoIChtZXNzYWdlLndoYXQpIHsKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9ESVNDT05ORUNUOgorICAgICAgICAgICAgICAgICAgICBXaWZpTmF0aXZlLmRpc2Nvbm5lY3RDb21tYW5kKCk7CisgICAgICAgICAgICAgICAgICAgIHRyYW5zaXRpb25UbyhtRGlzY29ubmVjdGluZ1N0YXRlKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBDTURfUkVDT05GSUdVUkVfSVA6CisgICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywiUmVjb25maWd1cmluZyBJUCBvbiBjb25uZWN0aW9uIik7CisgICAgICAgICAgICAgICAgICAgIE5ldHdvcmtVdGlscy5yZXNldENvbm5lY3Rpb25zKG1JbnRlcmZhY2VOYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgdHJhbnNpdGlvblRvKG1Db25uZWN0aW5nU3RhdGUpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9TVE9QX0RSSVZFUjoKKyAgICAgICAgICAgICAgICAgICAgc2VuZE1lc3NhZ2UoQ01EX0RJU0NPTk5FQ1QpOworICAgICAgICAgICAgICAgICAgICBkZWZlck1lc3NhZ2UobWVzc2FnZSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQ01EX1NFVF9TQ0FOX01PREU6CisgICAgICAgICAgICAgICAgICAgIGlmIChtZXNzYWdlLmFyZzEgPT0gU0NBTl9PTkxZX01PREUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbmRNZXNzYWdlKENNRF9ESVNDT05ORUNUKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmVyTWVzc2FnZShtZXNzYWdlKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgLyogSWdub3JlIGNvbm5lY3Rpb24gdG8gc2FtZSBuZXR3b3JrICovCisgICAgICAgICAgICAgICAgY2FzZSBDTURfQ09OTkVDVF9ORVRXT1JLOgorICAgICAgICAgICAgICAgICAgICBpbnQgbmV0SWQgPSBtZXNzYWdlLmFyZzE7CisgICAgICAgICAgICAgICAgICAgIGlmIChtV2lmaUluZm8uZ2V0TmV0d29ya0lkKCkgPT0gbmV0SWQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBOT1RfSEFORExFRDsKKyAgICAgICAgICAgICAgICAgICAgLyogSWdub3JlICovCisgICAgICAgICAgICAgICAgY2FzZSBORVRXT1JLX0NPTk5FQ1RJT05fRVZFTlQ6CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBOT1RfSEFORExFRDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEV2ZW50TG9nLndyaXRlRXZlbnQoRVZFTlRMT0dfV0lGSV9FVkVOVF9IQU5ETEVELCBtZXNzYWdlLndoYXQpOworICAgICAgICAgICAgcmV0dXJuIEhBTkRMRUQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGFzcyBEaXNjb25uZWN0aW5nU3RhdGUgZXh0ZW5kcyBIaWVyYXJjaGljYWxTdGF0ZSB7CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBlbnRlcigpIHsKKyAgICAgICAgICAgIGlmIChEQkcpIExvZy5kKFRBRywgZ2V0TmFtZSgpICsgIlxuIik7CisgICAgICAgICAgICBFdmVudExvZy53cml0ZUV2ZW50KEVWRU5UTE9HX1dJRklfU1RBVEVfQ0hBTkdFRCwgZ2V0TmFtZSgpKTsKKyAgICAgICAgfQorICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gcHJvY2Vzc01lc3NhZ2UoTWVzc2FnZSBtZXNzYWdlKSB7CisgICAgICAgICAgICBpZiAoREJHKSBMb2cuZChUQUcsIGdldE5hbWUoKSArIG1lc3NhZ2UudG9TdHJpbmcoKSArICJcbiIpOworICAgICAgICAgICAgc3dpdGNoIChtZXNzYWdlLndoYXQpIHsKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9TVE9QX0RSSVZFUjogLyogU3RvcCBkcml2ZXIgb25seSBhZnRlciBkaXNjb25uZWN0IGhhbmRsZWQgKi8KKyAgICAgICAgICAgICAgICAgICAgZGVmZXJNZXNzYWdlKG1lc3NhZ2UpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9TRVRfU0NBTl9NT0RFOgorICAgICAgICAgICAgICAgICAgICBpZiAobWVzc2FnZS5hcmcxID09IFNDQU5fT05MWV9NT0RFKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZlck1lc3NhZ2UobWVzc2FnZSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5PVF9IQU5ETEVEOworICAgICAgICAgICAgfQorICAgICAgICAgICAgRXZlbnRMb2cud3JpdGVFdmVudChFVkVOVExPR19XSUZJX0VWRU5UX0hBTkRMRUQsIG1lc3NhZ2Uud2hhdCk7CisgICAgICAgICAgICByZXR1cm4gSEFORExFRDsKKyAgICAgICAgfQorICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgZXhpdCgpIHsKKyAgICAgICAgICAgIGlmIChtRW5hYmxlQWxsTmV0d29ya3MpIHsKKyAgICAgICAgICAgICAgICBtRW5hYmxlQWxsTmV0d29ya3MgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICBXaWZpQ29uZmlnU3RvcmUuZW5hYmxlQWxsTmV0d29ya3MoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGNsYXNzIERpc2Nvbm5lY3RlZFN0YXRlIGV4dGVuZHMgSGllcmFyY2hpY2FsU3RhdGUgeworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgZW50ZXIoKSB7CisgICAgICAgICAgICBpZiAoREJHKSBMb2cuZChUQUcsIGdldE5hbWUoKSArICJcbiIpOworICAgICAgICAgICAgRXZlbnRMb2cud3JpdGVFdmVudChFVkVOVExPR19XSUZJX1NUQVRFX0NIQU5HRUQsIGdldE5hbWUoKSk7CisgICAgICAgIH0KKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIHByb2Nlc3NNZXNzYWdlKE1lc3NhZ2UgbWVzc2FnZSkgeworICAgICAgICAgICAgaWYgKERCRykgTG9nLmQoVEFHLCBnZXROYW1lKCkgKyBtZXNzYWdlLnRvU3RyaW5nKCkgKyAiXG4iKTsKKyAgICAgICAgICAgIHN3aXRjaCAobWVzc2FnZS53aGF0KSB7CisgICAgICAgICAgICAgICAgY2FzZSBDTURfU0VUX1NDQU5fTU9ERToKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1lc3NhZ2UuYXJnMSA9PSBTQ0FOX09OTFlfTU9ERSkgeworICAgICAgICAgICAgICAgICAgICAgICAgV2lmaU5hdGl2ZS5zZXRTY2FuUmVzdWx0SGFuZGxpbmdDb21tYW5kKG1lc3NhZ2UuYXJnMSk7CisgICAgICAgICAgICAgICAgICAgICAgICAvL1N1cHBsaWNhbnQgZGlzY29ubmVjdCB0byBwcmV2ZW50IGZ1cnRoZXIgY29ubmVjdHMKKyAgICAgICAgICAgICAgICAgICAgICAgIFdpZmlOYXRpdmUuZGlzY29ubmVjdENvbW1hbmQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1Jc1NjYW5Nb2RlID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zaXRpb25UbyhtU2Nhbk1vZGVTdGF0ZSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIC8qIElnbm9yZSBuZXR3b3JrIGRpc2Nvbm5lY3QgKi8KKyAgICAgICAgICAgICAgICBjYXNlIE5FVFdPUktfRElTQ09OTkVDVElPTl9FVkVOVDoKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5PVF9IQU5ETEVEOworICAgICAgICAgICAgfQorICAgICAgICAgICAgRXZlbnRMb2cud3JpdGVFdmVudChFVkVOVExPR19XSUZJX0VWRU5UX0hBTkRMRUQsIG1lc3NhZ2Uud2hhdCk7CisgICAgICAgICAgICByZXR1cm4gSEFORExFRDsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsYXNzIFNvZnRBcFN0YXJ0ZWRTdGF0ZSBleHRlbmRzIEhpZXJhcmNoaWNhbFN0YXRlIHsKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIGVudGVyKCkgeworICAgICAgICAgICAgaWYgKERCRykgTG9nLmQoVEFHLCBnZXROYW1lKCkgKyAiXG4iKTsKKyAgICAgICAgICAgIEV2ZW50TG9nLndyaXRlRXZlbnQoRVZFTlRMT0dfV0lGSV9TVEFURV9DSEFOR0VELCBnZXROYW1lKCkpOworICAgICAgICB9CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBwcm9jZXNzTWVzc2FnZShNZXNzYWdlIG1lc3NhZ2UpIHsKKyAgICAgICAgICAgIGlmIChEQkcpIExvZy5kKFRBRywgZ2V0TmFtZSgpICsgbWVzc2FnZS50b1N0cmluZygpICsgIlxuIik7CisgICAgICAgICAgICBzd2l0Y2gobWVzc2FnZS53aGF0KSB7CisgICAgICAgICAgICAgICAgY2FzZSBDTURfU1RPUF9BUDoKKyAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCJTdG9wcGluZyBTb2Z0IEFQIik7CisgICAgICAgICAgICAgICAgICAgIHNldFdpZmlBcFN0YXRlKFdJRklfQVBfU1RBVEVfRElTQUJMSU5HKTsKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG53U2VydmljZS5zdG9wQWNjZXNzUG9pbnQoKTsKKyAgICAgICAgICAgICAgICAgICAgfSBjYXRjaChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAiRXhjZXB0aW9uIGluIHN0b3BBY2Nlc3NQb2ludCgpIik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgdHJhbnNpdGlvblRvKG1Ecml2ZXJMb2FkZWRTdGF0ZSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQ01EX1NUQVJUX0FQOgorICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsIlNvZnRBUCBzZXQgb24gYSBydW5uaW5nIGFjY2VzcyBwb2ludCIpOworICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgbndTZXJ2aWNlLnNldEFjY2Vzc1BvaW50KChXaWZpQ29uZmlndXJhdGlvbikgbWVzc2FnZS5vYmosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtSW50ZXJmYWNlTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNPRlRBUF9JRkFDRSk7CisgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2goRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIExvZy5lKFRBRywgIkV4Y2VwdGlvbiBpbiBud1NlcnZpY2UgZHVyaW5nIHNvZnQgQVAgc2V0Iik7CisgICAgICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG53U2VydmljZS5zdG9wQWNjZXNzUG9pbnQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNsb2cuZShUQUcsICJDb3VsZCBub3Qgc3RvcCBBUCwgOiIgKyBlZSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBzZW5kTWVzc2FnZShvYnRhaW5NZXNzYWdlKENNRF9VTkxPQURfRFJJVkVSLCBXSUZJX0FQX1NUQVRFX0ZBSUxFRCwgMCkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIC8qIEZhaWwgY2xpZW50IG1vZGUgb3BlcmF0aW9uIHdoZW4gc29mdCBBUCBpcyBlbmFibGVkICovCisgICAgICAgICAgICAgICAgY2FzZSBDTURfU1RBUlRfU1VQUExJQ0FOVDoKKyAgICAgICAgICAgICAgICAgICAgTG9nLmUoVEFHLCJDYW5ub3Qgc3RhcnQgc3VwcGxpY2FudCB3aXRoIGEgcnVubmluZyBzb2Z0IEFQIik7CisgICAgICAgICAgICAgICAgICAgIHNldFdpZmlTdGF0ZShXSUZJX1NUQVRFX1VOS05PV04pOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gTk9UX0hBTkRMRUQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBFdmVudExvZy53cml0ZUV2ZW50KEVWRU5UTE9HX1dJRklfRVZFTlRfSEFORExFRCwgbWVzc2FnZS53aGF0KTsKKyAgICAgICAgICAgIHJldHVybiBIQU5ETEVEOworICAgICAgICB9CisgICAgfQorCisKKyAgICBjbGFzcyBTdXBwbGljYW50U3RhdGVUcmFja2VyIGV4dGVuZHMgSGllcmFyY2hpY2FsU3RhdGVNYWNoaW5lIHsKKworICAgICAgICBwcml2YXRlIGludCBtUnNzaVBvbGxUb2tlbiA9IDA7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBtYXggbnVtYmVyIG9mIHRoZSBXUEEgc3VwcGxpY2FudCBsb29wIGl0ZXJhdGlvbnMgYmVmb3JlIHdlCisgICAgICAgICAqIGRlY2lkZSB0aGF0IHRoZSBsb29wIHNob3VsZCBiZSB0ZXJtaW5hdGVkOgorICAgICAgICAgKi8KKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1BWF9TVVBQTElDQU5UX0xPT1BfSVRFUkFUSU9OUyA9IDQ7CisgICAgICAgIHByaXZhdGUgaW50IG1Mb29wRGV0ZWN0SW5kZXggPSAwOworICAgICAgICBwcml2YXRlIGludCBtTG9vcERldGVjdENvdW50ID0gMDsKKworICAgICAgICAvKioKKyAgICAgICAgICogIFN1cHBsaWNhbnQgc3RhdGUgY2hhbmdlIGNvbW1hbmRzIGZvbGxvdworICAgICAgICAgKiAgdGhlIG9yZGluYWwgdmFsdWVzIGRlZmluZWQgaW4gU3VwcGxpY2FudFN0YXRlLmphdmEKKyAgICAgICAgICovCisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBESVNDT05ORUNURUQgICAgICAgICAgID0gMDsKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IElOQUNUSVZFICAgICAgICAgICAgICAgPSAxOworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU0NBTk5JTkcgICAgICAgICAgICAgICA9IDI7CisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBBU1NPQ0lBVElORyAgICAgICAgICAgID0gMzsKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEFTU09DSUFURUQgICAgICAgICAgICAgPSA0OworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRk9VUl9XQVlfSEFORFNIQUtFICAgICA9IDU7CisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBHUk9VUF9IQU5EU0hBS0UgICAgICAgID0gNjsKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IENPTVBMRVRFRCAgICAgICAgICAgICAgPSA3OworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRE9STUFOVCAgICAgICAgICAgICAgICA9IDg7CisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBVTklOSVRJQUxJWkVEICAgICAgICAgID0gOTsKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IElOVkFMSUQgICAgICAgICAgICAgICAgPSAxMDsKKworICAgICAgICBwcml2YXRlIEhpZXJhcmNoaWNhbFN0YXRlIG1VbmluaXRpYWxpemVkU3RhdGUgPSBuZXcgVW5pbml0aWFsaXplZFN0YXRlKCk7CisgICAgICAgIHByaXZhdGUgSGllcmFyY2hpY2FsU3RhdGUgbUluaXRpYWxpemVkU3RhdGUgPSBuZXcgSW5pdGlhbGl6ZWRTdGF0ZSgpOzsKKyAgICAgICAgcHJpdmF0ZSBIaWVyYXJjaGljYWxTdGF0ZSBtSW5hY3RpdmVTdGF0ZSA9IG5ldyBJbmFjdGl2ZVN0YXRlKCk7CisgICAgICAgIHByaXZhdGUgSGllcmFyY2hpY2FsU3RhdGUgbURpc2Nvbm5lY3RTdGF0ZSA9IG5ldyBEaXNjb25uZWN0ZWRTdGF0ZSgpOworICAgICAgICBwcml2YXRlIEhpZXJhcmNoaWNhbFN0YXRlIG1TY2FuU3RhdGUgPSBuZXcgU2NhblN0YXRlKCk7CisgICAgICAgIHByaXZhdGUgSGllcmFyY2hpY2FsU3RhdGUgbUNvbm5lY3RTdGF0ZSA9IG5ldyBDb25uZWN0U3RhdGUoKTsKKyAgICAgICAgcHJpdmF0ZSBIaWVyYXJjaGljYWxTdGF0ZSBtSGFuZHNoYWtlU3RhdGUgPSBuZXcgSGFuZHNoYWtlU3RhdGUoKTsKKyAgICAgICAgcHJpdmF0ZSBIaWVyYXJjaGljYWxTdGF0ZSBtQ29tcGxldGVkU3RhdGUgPSBuZXcgQ29tcGxldGVkU3RhdGUoKTsKKyAgICAgICAgcHJpdmF0ZSBIaWVyYXJjaGljYWxTdGF0ZSBtRG9ybWFudFN0YXRlID0gbmV3IERvcm1hbnRTdGF0ZSgpOworCisgICAgICAgIHB1YmxpYyBTdXBwbGljYW50U3RhdGVUcmFja2VyKENvbnRleHQgY29udGV4dCwgSGFuZGxlciB0YXJnZXQpIHsKKyAgICAgICAgICAgIHN1cGVyKFRBRywgdGFyZ2V0LmdldExvb3BlcigpKTsKKworICAgICAgICAgICAgYWRkU3RhdGUobVVuaW5pdGlhbGl6ZWRTdGF0ZSk7CisgICAgICAgICAgICBhZGRTdGF0ZShtSW5pdGlhbGl6ZWRTdGF0ZSk7CisgICAgICAgICAgICAgICAgYWRkU3RhdGUobUluYWN0aXZlU3RhdGUsIG1Jbml0aWFsaXplZFN0YXRlKTsKKyAgICAgICAgICAgICAgICBhZGRTdGF0ZShtRGlzY29ubmVjdFN0YXRlLCBtSW5pdGlhbGl6ZWRTdGF0ZSk7CisgICAgICAgICAgICAgICAgYWRkU3RhdGUobVNjYW5TdGF0ZSwgbUluaXRpYWxpemVkU3RhdGUpOworICAgICAgICAgICAgICAgIGFkZFN0YXRlKG1Db25uZWN0U3RhdGUsIG1Jbml0aWFsaXplZFN0YXRlKTsKKyAgICAgICAgICAgICAgICAgICAgYWRkU3RhdGUobUhhbmRzaGFrZVN0YXRlLCBtQ29ubmVjdFN0YXRlKTsKKyAgICAgICAgICAgICAgICAgICAgYWRkU3RhdGUobUNvbXBsZXRlZFN0YXRlLCBtQ29ubmVjdFN0YXRlKTsKKyAgICAgICAgICAgICAgICBhZGRTdGF0ZShtRG9ybWFudFN0YXRlLCBtSW5pdGlhbGl6ZWRTdGF0ZSk7CisKKyAgICAgICAgICAgIHNldEluaXRpYWxTdGF0ZShtVW5pbml0aWFsaXplZFN0YXRlKTsKKworICAgICAgICAgICAgLy9zdGFydCB0aGUgc3RhdGUgbWFjaGluZQorICAgICAgICAgICAgc3RhcnQoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KFN0YXRlQ2hhbmdlUmVzdWx0IHN0YXRlQ2hhbmdlUmVzdWx0KSB7CisgICAgICAgICAgICBTdXBwbGljYW50U3RhdGUgbmV3U3RhdGUgPSAoU3VwcGxpY2FudFN0YXRlKSBzdGF0ZUNoYW5nZVJlc3VsdC5zdGF0ZTsKKworICAgICAgICAgICAgLy8gU3VwcGxpY2FudCBzdGF0ZSBjaGFuZ2UKKyAgICAgICAgICAgIC8vIFszMS0xM10gUmVzZXJ2ZWQgZm9yIGZ1dHVyZSB1c2UKKyAgICAgICAgICAgIC8vIFs4IC0gMF0gU3VwcGxpY2FudCBzdGF0ZSAoYXMgZGVmaW5lZCBpbiBTdXBwbGljYW50U3RhdGUuamF2YSkKKyAgICAgICAgICAgIC8vIDUwMDIzIHN1cHBsaWNhbnRfc3RhdGVfY2hhbmdlZCAoY3VzdG9tfDF8NSkKKyAgICAgICAgICAgIEV2ZW50TG9nLndyaXRlRXZlbnQoRVZFTlRMT0dfU1VQUExJQ0FOVF9TVEFURV9DSEFOR0VELCBuZXdTdGF0ZS5vcmRpbmFsKCkpOworCisgICAgICAgICAgICBzZW5kTWVzc2FnZShvYnRhaW5NZXNzYWdlKG5ld1N0YXRlLm9yZGluYWwoKSwgc3RhdGVDaGFuZ2VSZXN1bHQpKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHJlc2V0U3VwcGxpY2FudFN0YXRlKCkgeworICAgICAgICAgICAgdHJhbnNpdGlvblRvKG1VbmluaXRpYWxpemVkU3RhdGUpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSB2b2lkIHJlc2V0TG9vcERldGVjdGlvbigpIHsKKyAgICAgICAgICAgIG1Mb29wRGV0ZWN0Q291bnQgPSAwOworICAgICAgICAgICAgbUxvb3BEZXRlY3RJbmRleCA9IDA7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIGJvb2xlYW4gaGFuZGxlVHJhbnNpdGlvbihNZXNzYWdlIG1zZykgeworICAgICAgICAgICAgaWYgKERCRykgTG9nLmQoVEFHLCBnZXROYW1lKCkgKyBtc2cudG9TdHJpbmcoKSArICJcbiIpOworICAgICAgICAgICAgc3dpdGNoIChtc2cud2hhdCkgeworICAgICAgICAgICAgICAgIGNhc2UgRElTQ09OTkVDVEVEOgorICAgICAgICAgICAgICAgICAgICB0cmFuc2l0aW9uVG8obURpc2Nvbm5lY3RTdGF0ZSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgU0NBTk5JTkc6CisgICAgICAgICAgICAgICAgICAgIHRyYW5zaXRpb25UbyhtU2NhblN0YXRlKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBBU1NPQ0lBVElORzoKKyAgICAgICAgICAgICAgICAgICAgU3RhdGVDaGFuZ2VSZXN1bHQgc3RhdGVDaGFuZ2VSZXN1bHQgPSAoU3RhdGVDaGFuZ2VSZXN1bHQpIG1zZy5vYmo7CisgICAgICAgICAgICAgICAgICAgIC8qIEJTU0lEIGlzIHZhbGlkIG9ubHkgaW4gQVNTT0NJQVRJTkcgc3RhdGUgKi8KKyAgICAgICAgICAgICAgICAgICAgbVdpZmlJbmZvLnNldEJTU0lEKHN0YXRlQ2hhbmdlUmVzdWx0LkJTU0lEKTsKKyAgICAgICAgICAgICAgICAgICAgLy8kRkFMTC1USFJPVUdIJAorICAgICAgICAgICAgICAgIGNhc2UgQVNTT0NJQVRFRDoKKyAgICAgICAgICAgICAgICBjYXNlIEZPVVJfV0FZX0hBTkRTSEFLRToKKyAgICAgICAgICAgICAgICBjYXNlIEdST1VQX0hBTkRTSEFLRToKKyAgICAgICAgICAgICAgICAgICAgdHJhbnNpdGlvblRvKG1IYW5kc2hha2VTdGF0ZSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQ09NUExFVEVEOgorICAgICAgICAgICAgICAgICAgICB0cmFuc2l0aW9uVG8obUNvbXBsZXRlZFN0YXRlKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBET1JNQU5UOgorICAgICAgICAgICAgICAgICAgICB0cmFuc2l0aW9uVG8obURvcm1hbnRTdGF0ZSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgSU5BQ1RJVkU6CisgICAgICAgICAgICAgICAgICAgIHRyYW5zaXRpb25UbyhtSW5hY3RpdmVTdGF0ZSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgVU5JTklUSUFMSVpFRDoKKyAgICAgICAgICAgICAgICBjYXNlIElOVkFMSUQ6CisgICAgICAgICAgICAgICAgICAgIHRyYW5zaXRpb25UbyhtVW5pbml0aWFsaXplZFN0YXRlKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5PVF9IQU5ETEVEOworICAgICAgICAgICAgfQorICAgICAgICAgICAgU3RhdGVDaGFuZ2VSZXN1bHQgc3RhdGVDaGFuZ2VSZXN1bHQgPSAoU3RhdGVDaGFuZ2VSZXN1bHQpIG1zZy5vYmo7CisgICAgICAgICAgICBTdXBwbGljYW50U3RhdGUgc3VwU3RhdGUgPSAoU3VwcGxpY2FudFN0YXRlKSBzdGF0ZUNoYW5nZVJlc3VsdC5zdGF0ZTsKKyAgICAgICAgICAgIHNldERldGFpbGVkU3RhdGUoV2lmaUluZm8uZ2V0RGV0YWlsZWRTdGF0ZU9mKHN1cFN0YXRlKSk7CisgICAgICAgICAgICBtV2lmaUluZm8uc2V0U3VwcGxpY2FudFN0YXRlKHN1cFN0YXRlKTsKKyAgICAgICAgICAgIG1XaWZpSW5mby5zZXROZXR3b3JrSWQoc3RhdGVDaGFuZ2VSZXN1bHQubmV0d29ya0lkKTsKKyAgICAgICAgICAgIHJldHVybiBIQU5ETEVEOworICAgICAgICB9CisKKyAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgICAqIEhTTSBzdGF0ZXMKKyAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyAgICAgICAgY2xhc3MgSW5pdGlhbGl6ZWRTdGF0ZSBleHRlbmRzIEhpZXJhcmNoaWNhbFN0YXRlIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgIHB1YmxpYyB2b2lkIGVudGVyKCkgeworICAgICAgICAgICAgICAgICBpZiAoREJHKSBMb2cuZChUQUcsIGdldE5hbWUoKSArICJcbiIpOworICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gcHJvY2Vzc01lc3NhZ2UoTWVzc2FnZSBtZXNzYWdlKSB7CisgICAgICAgICAgICAgICAgaWYgKERCRykgTG9nLmQoVEFHLCBnZXROYW1lKCkgKyBtZXNzYWdlLnRvU3RyaW5nKCkgKyAiXG4iKTsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKG1lc3NhZ2Uud2hhdCkgeworICAgICAgICAgICAgICAgICAgICBjYXNlIENNRF9TVEFSVF9TQ0FOOgorICAgICAgICAgICAgICAgICAgICAgICAgV2lmaU5hdGl2ZS5zY2FuQ29tbWFuZChtZXNzYWdlLmFyZzEgPT0gU0NBTl9BQ1RJVkUpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoREJHKSBMb2cudyhUQUcsICJJZ25vcmluZyAiICsgbWVzc2FnZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIEhBTkRMRUQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBjbGFzcyBVbmluaXRpYWxpemVkU3RhdGUgZXh0ZW5kcyBIaWVyYXJjaGljYWxTdGF0ZSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICBwdWJsaWMgdm9pZCBlbnRlcigpIHsKKyAgICAgICAgICAgICAgICAgaWYgKERCRykgTG9nLmQoVEFHLCBnZXROYW1lKCkgKyAiXG4iKTsKKyAgICAgICAgICAgICAgICAgbU5ldHdvcmtJbmZvLnNldElzQXZhaWxhYmxlKGZhbHNlKTsKKyAgICAgICAgICAgICAgICAgcmVzZXRMb29wRGV0ZWN0aW9uKCk7CisgICAgICAgICAgICAgICAgIG1QYXNzd29yZEtleU1heUJlSW5jb3JyZWN0ID0gZmFsc2U7CisgICAgICAgICAgICAgfQorICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBwcm9jZXNzTWVzc2FnZShNZXNzYWdlIG1lc3NhZ2UpIHsKKyAgICAgICAgICAgICAgICBzd2l0Y2gobWVzc2FnZS53aGF0KSB7CisgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWhhbmRsZVRyYW5zaXRpb24obWVzc2FnZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoREJHKSBMb2cudyhUQUcsICJJZ25vcmluZyAiICsgbWVzc2FnZSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIEhBTkRMRUQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIGV4aXQoKSB7CisgICAgICAgICAgICAgICAgbU5ldHdvcmtJbmZvLnNldElzQXZhaWxhYmxlKHRydWUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgY2xhc3MgSW5hY3RpdmVTdGF0ZSBleHRlbmRzIEhpZXJhcmNoaWNhbFN0YXRlIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgIHB1YmxpYyB2b2lkIGVudGVyKCkgeworICAgICAgICAgICAgICAgICBpZiAoREJHKSBMb2cuZChUQUcsIGdldE5hbWUoKSArICJcbiIpOworICAgICAgICAgICAgICAgICBNZXNzYWdlIG1lc3NhZ2UgPSBnZXRDdXJyZW50TWVzc2FnZSgpOworICAgICAgICAgICAgICAgICBTdGF0ZUNoYW5nZVJlc3VsdCBzdGF0ZUNoYW5nZVJlc3VsdCA9IChTdGF0ZUNoYW5nZVJlc3VsdCkgbWVzc2FnZS5vYmo7CisKKyAgICAgICAgICAgICAgICAgbU5ldHdvcmtJbmZvLnNldElzQXZhaWxhYmxlKGZhbHNlKTsKKyAgICAgICAgICAgICAgICAgcmVzZXRMb29wRGV0ZWN0aW9uKCk7CisgICAgICAgICAgICAgICAgIG1QYXNzd29yZEtleU1heUJlSW5jb3JyZWN0ID0gZmFsc2U7CisKKyAgICAgICAgICAgICAgICAgc2VuZFN1cHBsaWNhbnRTdGF0ZUNoYW5nZWRCcm9hZGNhc3Qoc3RhdGVDaGFuZ2VSZXN1bHQsIGZhbHNlKTsKKyAgICAgICAgICAgICB9CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIHByb2Nlc3NNZXNzYWdlKE1lc3NhZ2UgbWVzc2FnZSkgeworICAgICAgICAgICAgICAgIHJldHVybiBoYW5kbGVUcmFuc2l0aW9uKG1lc3NhZ2UpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBleGl0KCkgeworICAgICAgICAgICAgICAgIG1OZXR3b3JrSW5mby5zZXRJc0F2YWlsYWJsZSh0cnVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisKKyAgICAgICAgY2xhc3MgRGlzY29ubmVjdGVkU3RhdGUgZXh0ZW5kcyBIaWVyYXJjaGljYWxTdGF0ZSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICBwdWJsaWMgdm9pZCBlbnRlcigpIHsKKyAgICAgICAgICAgICAgICAgaWYgKERCRykgTG9nLmQoVEFHLCBnZXROYW1lKCkgKyAiXG4iKTsKKyAgICAgICAgICAgICAgICAgTWVzc2FnZSBtZXNzYWdlID0gZ2V0Q3VycmVudE1lc3NhZ2UoKTsKKyAgICAgICAgICAgICAgICAgU3RhdGVDaGFuZ2VSZXN1bHQgc3RhdGVDaGFuZ2VSZXN1bHQgPSAoU3RhdGVDaGFuZ2VSZXN1bHQpIG1lc3NhZ2Uub2JqOworCisgICAgICAgICAgICAgICAgIHJlc2V0TG9vcERldGVjdGlvbigpOworCisgICAgICAgICAgICAgICAgIC8qIElmIGEgZGlzY29ubmVjdCBldmVudCBoYXBwZW5zIGFmdGVyIGEgcGFzc3dvcmQga2V5IGZhaWx1cmUKKyAgICAgICAgICAgICAgICAgICogZXZlbnQsIGRpc2FibGUgdGhlIG5ldHdvcmsKKyAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgIGlmIChtUGFzc3dvcmRLZXlNYXlCZUluY29ycmVjdCkgeworICAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiRmFpbGVkIHRvIGF1dGhlbnRpY2F0ZSwgZGlzYWJsaW5nIG5ldHdvcmsgIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1XaWZpSW5mby5nZXROZXR3b3JrSWQoKSk7CisgICAgICAgICAgICAgICAgICAgICBXaWZpQ29uZmlnU3RvcmUuZGlzYWJsZU5ldHdvcmsobVdpZmlJbmZvLmdldE5ldHdvcmtJZCgpKTsKKyAgICAgICAgICAgICAgICAgICAgIG1QYXNzd29yZEtleU1heUJlSW5jb3JyZWN0ID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICBzZW5kU3VwcGxpY2FudFN0YXRlQ2hhbmdlZEJyb2FkY2FzdChzdGF0ZUNoYW5nZVJlc3VsdCwgdHJ1ZSk7CisgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICBzZW5kU3VwcGxpY2FudFN0YXRlQ2hhbmdlZEJyb2FkY2FzdChzdGF0ZUNoYW5nZVJlc3VsdCwgZmFsc2UpOworICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgfQorICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBwcm9jZXNzTWVzc2FnZShNZXNzYWdlIG1lc3NhZ2UpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gaGFuZGxlVHJhbnNpdGlvbihtZXNzYWdlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGNsYXNzIFNjYW5TdGF0ZSBleHRlbmRzIEhpZXJhcmNoaWNhbFN0YXRlIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgIHB1YmxpYyB2b2lkIGVudGVyKCkgeworICAgICAgICAgICAgICAgICBpZiAoREJHKSBMb2cuZChUQUcsIGdldE5hbWUoKSArICJcbiIpOworICAgICAgICAgICAgICAgICBNZXNzYWdlIG1lc3NhZ2UgPSBnZXRDdXJyZW50TWVzc2FnZSgpOworICAgICAgICAgICAgICAgICBTdGF0ZUNoYW5nZVJlc3VsdCBzdGF0ZUNoYW5nZVJlc3VsdCA9IChTdGF0ZUNoYW5nZVJlc3VsdCkgbWVzc2FnZS5vYmo7CisKKyAgICAgICAgICAgICAgICAgbVBhc3N3b3JkS2V5TWF5QmVJbmNvcnJlY3QgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgcmVzZXRMb29wRGV0ZWN0aW9uKCk7CisgICAgICAgICAgICAgICAgIHNlbmRTdXBwbGljYW50U3RhdGVDaGFuZ2VkQnJvYWRjYXN0KHN0YXRlQ2hhbmdlUmVzdWx0LCBmYWxzZSk7CisgICAgICAgICAgICAgfQorICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBwcm9jZXNzTWVzc2FnZShNZXNzYWdlIG1lc3NhZ2UpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gaGFuZGxlVHJhbnNpdGlvbihtZXNzYWdlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGNsYXNzIENvbm5lY3RTdGF0ZSBleHRlbmRzIEhpZXJhcmNoaWNhbFN0YXRlIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgIHB1YmxpYyB2b2lkIGVudGVyKCkgeworICAgICAgICAgICAgICAgICBpZiAoREJHKSBMb2cuZChUQUcsIGdldE5hbWUoKSArICJcbiIpOworICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gcHJvY2Vzc01lc3NhZ2UoTWVzc2FnZSBtZXNzYWdlKSB7CisgICAgICAgICAgICAgICAgc3dpdGNoIChtZXNzYWdlLndoYXQpIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBDTURfU1RBUlRfU0NBTjoKKyAgICAgICAgICAgICAgICAgICAgICAgIFdpZmlOYXRpdmUuc2V0U2NhblJlc3VsdEhhbmRsaW5nQ29tbWFuZChTQ0FOX09OTFlfTU9ERSk7CisgICAgICAgICAgICAgICAgICAgICAgICBXaWZpTmF0aXZlLnNjYW5Db21tYW5kKG1lc3NhZ2UuYXJnMSA9PSBTQ0FOX0FDVElWRSk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBOT1RfSEFORExFRDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIEhBTkRMRUQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBjbGFzcyBIYW5kc2hha2VTdGF0ZSBleHRlbmRzIEhpZXJhcmNoaWNhbFN0YXRlIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgIHB1YmxpYyB2b2lkIGVudGVyKCkgeworICAgICAgICAgICAgICAgICBpZiAoREJHKSBMb2cuZChUQUcsIGdldE5hbWUoKSArICJcbiIpOworICAgICAgICAgICAgICAgICBmaW5hbCBNZXNzYWdlIG1lc3NhZ2UgPSBnZXRDdXJyZW50TWVzc2FnZSgpOworICAgICAgICAgICAgICAgICBTdGF0ZUNoYW5nZVJlc3VsdCBzdGF0ZUNoYW5nZVJlc3VsdCA9IChTdGF0ZUNoYW5nZVJlc3VsdCkgbWVzc2FnZS5vYmo7CisKKyAgICAgICAgICAgICAgICAgaWYgKG1Mb29wRGV0ZWN0SW5kZXggPiBtZXNzYWdlLndoYXQpIHsKKyAgICAgICAgICAgICAgICAgICAgIG1Mb29wRGV0ZWN0Q291bnQrKzsKKyAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICBpZiAobUxvb3BEZXRlY3RDb3VudCA+IE1BWF9TVVBQTElDQU5UX0xPT1BfSVRFUkFUSU9OUykgeworICAgICAgICAgICAgICAgICAgICAgV2lmaUNvbmZpZ1N0b3JlLmRpc2FibGVOZXR3b3JrKHN0YXRlQ2hhbmdlUmVzdWx0Lm5ldHdvcmtJZCk7CisgICAgICAgICAgICAgICAgICAgICBtTG9vcERldGVjdENvdW50ID0gMDsKKyAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgIG1Mb29wRGV0ZWN0SW5kZXggPSBtZXNzYWdlLndoYXQ7CisKKyAgICAgICAgICAgICAgICAgbVBhc3N3b3JkS2V5TWF5QmVJbmNvcnJlY3QgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgc2VuZFN1cHBsaWNhbnRTdGF0ZUNoYW5nZWRCcm9hZGNhc3Qoc3RhdGVDaGFuZ2VSZXN1bHQsIGZhbHNlKTsKKyAgICAgICAgICAgICB9CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIHByb2Nlc3NNZXNzYWdlKE1lc3NhZ2UgbWVzc2FnZSkgeworICAgICAgICAgICAgICAgIHJldHVybiBoYW5kbGVUcmFuc2l0aW9uKG1lc3NhZ2UpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgY2xhc3MgQ29tcGxldGVkU3RhdGUgZXh0ZW5kcyBIaWVyYXJjaGljYWxTdGF0ZSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICBwdWJsaWMgdm9pZCBlbnRlcigpIHsKKyAgICAgICAgICAgICAgICAgaWYgKERCRykgTG9nLmQoVEFHLCBnZXROYW1lKCkgKyAiXG4iKTsKKyAgICAgICAgICAgICAgICAgTWVzc2FnZSBtZXNzYWdlID0gZ2V0Q3VycmVudE1lc3NhZ2UoKTsKKyAgICAgICAgICAgICAgICAgU3RhdGVDaGFuZ2VSZXN1bHQgc3RhdGVDaGFuZ2VSZXN1bHQgPSAoU3RhdGVDaGFuZ2VSZXN1bHQpIG1lc3NhZ2Uub2JqOworCisgICAgICAgICAgICAgICAgIG1Sc3NpUG9sbFRva2VuKys7CisgICAgICAgICAgICAgICAgIGlmIChtRW5hYmxlUnNzaVBvbGxpbmcpIHsKKyAgICAgICAgICAgICAgICAgICAgIHNlbmRNZXNzYWdlRGVsYXllZChvYnRhaW5NZXNzYWdlKENNRF9SU1NJX1BPTEwsIG1Sc3NpUG9sbFRva2VuLCAwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUE9MTF9SU1NJX0lOVEVSVkFMX01TRUNTKTsKKyAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgIHJlc2V0TG9vcERldGVjdGlvbigpOworCisgICAgICAgICAgICAgICAgIG1QYXNzd29yZEtleU1heUJlSW5jb3JyZWN0ID0gZmFsc2U7CisgICAgICAgICAgICAgICAgIHNlbmRTdXBwbGljYW50U3RhdGVDaGFuZ2VkQnJvYWRjYXN0KHN0YXRlQ2hhbmdlUmVzdWx0LCBmYWxzZSk7CisgICAgICAgICAgICAgfQorICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBwcm9jZXNzTWVzc2FnZShNZXNzYWdlIG1lc3NhZ2UpIHsKKyAgICAgICAgICAgICAgICBzd2l0Y2gobWVzc2FnZS53aGF0KSB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgQVNTT0NJQVRJTkc6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgQVNTT0NJQVRFRDoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBGT1VSX1dBWV9IQU5EU0hBS0U6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgR1JPVVBfSEFORFNIQUtFOgorICAgICAgICAgICAgICAgICAgICBjYXNlIENPTVBMRVRFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIENNRF9SU1NJX1BPTEw6CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobWVzc2FnZS5hcmcxID09IG1Sc3NpUG9sbFRva2VuKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gR2V0IEluZm8gYW5kIGNvbnRpbnVlIHBvbGxpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0UG9sbGVkSW5mbygpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbmRNZXNzYWdlRGVsYXllZChvYnRhaW5NZXNzYWdlKENNRF9SU1NJX1BPTEwsIG1Sc3NpUG9sbFRva2VuLCAwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBPTExfUlNTSV9JTlRFUlZBTF9NU0VDUyk7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFBvbGxpbmcgaGFzIGNvbXBsZXRlZAorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgQ01EX0VOQUJMRV9SU1NJX1BPTEw6CisgICAgICAgICAgICAgICAgICAgICAgICBtUnNzaVBvbGxUb2tlbisrOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1FbmFibGVSc3NpUG9sbGluZykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZpcnN0IHBvbGwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0UG9sbGVkSW5mbygpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbmRNZXNzYWdlRGVsYXllZChvYnRhaW5NZXNzYWdlKENNRF9SU1NJX1BPTEwsIG1Sc3NpUG9sbFRva2VuLCAwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBPTExfUlNTSV9JTlRFUlZBTF9NU0VDUyk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBoYW5kbGVUcmFuc2l0aW9uKG1lc3NhZ2UpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gSEFORExFRDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGNsYXNzIERvcm1hbnRTdGF0ZSBleHRlbmRzIEhpZXJhcmNoaWNhbFN0YXRlIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgZW50ZXIoKSB7CisgICAgICAgICAgICAgICAgaWYgKERCRykgTG9nLmQoVEFHLCBnZXROYW1lKCkgKyAiXG4iKTsKKyAgICAgICAgICAgICAgICBNZXNzYWdlIG1lc3NhZ2UgPSBnZXRDdXJyZW50TWVzc2FnZSgpOworICAgICAgICAgICAgICAgIFN0YXRlQ2hhbmdlUmVzdWx0IHN0YXRlQ2hhbmdlUmVzdWx0ID0gKFN0YXRlQ2hhbmdlUmVzdWx0KSBtZXNzYWdlLm9iajsKKworICAgICAgICAgICAgICAgIHJlc2V0TG9vcERldGVjdGlvbigpOworICAgICAgICAgICAgICAgIG1QYXNzd29yZEtleU1heUJlSW5jb3JyZWN0ID0gZmFsc2U7CisKKyAgICAgICAgICAgICAgICBzZW5kU3VwcGxpY2FudFN0YXRlQ2hhbmdlZEJyb2FkY2FzdChzdGF0ZUNoYW5nZVJlc3VsdCwgZmFsc2UpOworCisgICAgICAgICAgICAgICAgLyogVE9ETzogcmVjb25uZWN0IGlzIG5vdyBiZWluZyBoYW5kbGVkIGF0IERIQ1AgZmFpbHVyZSBoYW5kbGluZworICAgICAgICAgICAgICAgICAqIElmIHdlIHJ1biBpbnRvIGlzc3VlcyB3aXRoIHN0YXlpbmcgaW4gRG9ybWFudCBzdGF0ZSwgbWlnaHQKKyAgICAgICAgICAgICAgICAgKiBuZWVkIGEgcmVjb25uZWN0IGhlcmUKKyAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gcHJvY2Vzc01lc3NhZ2UoTWVzc2FnZSBtZXNzYWdlKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGhhbmRsZVRyYW5zaXRpb24obWVzc2FnZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS93aWZpL2phdmEvYW5kcm9pZC9uZXQvd2lmaS9XaWZpU3RhdGVUcmFja2VyLmphdmEgYi93aWZpL2phdmEvYW5kcm9pZC9uZXQvd2lmaS9XaWZpU3RhdGVUcmFja2VyLmphdmEKaW5kZXggNTlmMjMxMi4uOWNjNDRiNSAxMDA2NDQKLS0tIGEvd2lmaS9qYXZhL2FuZHJvaWQvbmV0L3dpZmkvV2lmaVN0YXRlVHJhY2tlci5qYXZhCisrKyBiL3dpZmkvamF2YS9hbmRyb2lkL25ldC93aWZpL1dpZmlTdGF0ZVRyYWNrZXIuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKICAqCiAgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKICAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KQEAgLTE2LDQ1MCArMTYsMTA4IEBACiAKIHBhY2thZ2UgYW5kcm9pZC5uZXQud2lmaTsKIAotaW1wb3J0IHN0YXRpYyBhbmRyb2lkLm5ldC53aWZpLldpZmlNYW5hZ2VyLldJRklfU1RBVEVfRElTQUJMRUQ7Ci1pbXBvcnQgc3RhdGljIGFuZHJvaWQubmV0LndpZmkuV2lmaU1hbmFnZXIuV0lGSV9TVEFURV9ESVNBQkxJTkc7Ci1pbXBvcnQgc3RhdGljIGFuZHJvaWQubmV0LndpZmkuV2lmaU1hbmFnZXIuV0lGSV9TVEFURV9FTkFCTEVEOwotaW1wb3J0IHN0YXRpYyBhbmRyb2lkLm5ldC53aWZpLldpZmlNYW5hZ2VyLldJRklfU1RBVEVfRU5BQkxJTkc7Ci1pbXBvcnQgc3RhdGljIGFuZHJvaWQubmV0LndpZmkuV2lmaU1hbmFnZXIuV0lGSV9TVEFURV9VTktOT1dOOwogCi1pbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHlNYW5hZ2VyTmF0aXZlOwotaW1wb3J0IGFuZHJvaWQubmV0Lk5ldHdvcmtJbmZvOwotaW1wb3J0IGFuZHJvaWQubmV0Lk5ldHdvcmtTdGF0ZVRyYWNrZXI7Ci1pbXBvcnQgYW5kcm9pZC5uZXQuRGhjcEluZm87Ci1pbXBvcnQgYW5kcm9pZC5uZXQuTmV0d29ya1V0aWxzOwotaW1wb3J0IGFuZHJvaWQubmV0LkNvbm5lY3Rpdml0eU1hbmFnZXI7Ci1pbXBvcnQgYW5kcm9pZC5uZXQuTmV0d29ya0luZm8uRGV0YWlsZWRTdGF0ZTsKLWltcG9ydCBhbmRyb2lkLm5ldC5OZXR3b3JrSW5mby5TdGF0ZTsKLWltcG9ydCBhbmRyb2lkLm9zLk1lc3NhZ2U7Ci1pbXBvcnQgYW5kcm9pZC5vcy5QYXJjZWxhYmxlOwotaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlcjsKLWltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXJUaHJlYWQ7Ci1pbXBvcnQgYW5kcm9pZC5vcy5TeXN0ZW1Qcm9wZXJ0aWVzOwotaW1wb3J0IGFuZHJvaWQub3MuTG9vcGVyOwotaW1wb3J0IGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uOwotaW1wb3J0IGFuZHJvaWQub3MuU2VydmljZU1hbmFnZXI7Ci1pbXBvcnQgYW5kcm9pZC5wcm92aWRlci5TZXR0aW5nczsKLWltcG9ydCBhbmRyb2lkLnRleHQuVGV4dFV0aWxzOwotaW1wb3J0IGFuZHJvaWQudXRpbC5FdmVudExvZzsKLWltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwotaW1wb3J0IGFuZHJvaWQudXRpbC5Db25maWc7Ci1pbXBvcnQgYW5kcm9pZC5hcHAuTm90aWZpY2F0aW9uOwotaW1wb3J0IGFuZHJvaWQuYXBwLlBlbmRpbmdJbnRlbnQ7Ci1pbXBvcnQgYW5kcm9pZC5ibHVldG9vdGguQmx1ZXRvb3RoRGV2aWNlOwotaW1wb3J0IGFuZHJvaWQuYmx1ZXRvb3RoLkJsdWV0b290aEhlYWRzZXQ7Ci1pbXBvcnQgYW5kcm9pZC5ibHVldG9vdGguQmx1ZXRvb3RoQTJkcDsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFJlc29sdmVyOwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7CisKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQnJvYWRjYXN0UmVjZWl2ZXI7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7Ci1pbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5Db250ZW50T2JzZXJ2ZXI7Ci1pbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwuYXBwLklCYXR0ZXJ5U3RhdHM7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50RmlsdGVyOworaW1wb3J0IGFuZHJvaWQubmV0LkNvbm5lY3Rpdml0eU1hbmFnZXI7CitpbXBvcnQgYW5kcm9pZC5uZXQuTmV0d29ya0luZm87CitpbXBvcnQgYW5kcm9pZC5uZXQuTGlua1Byb3BlcnRpZXM7CitpbXBvcnQgYW5kcm9pZC5uZXQuTmV0d29ya1N0YXRlVHJhY2tlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5NZXNzYWdlOwogCi1pbXBvcnQgamF2YS5uZXQuVW5rbm93bkhvc3RFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LmF0b21pYy5BdG9taWNJbnRlZ2VyOwogaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LmF0b21pYy5BdG9taWNCb29sZWFuOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LmF0b21pYy5BdG9taWNJbnRlZ2VyOwogCiAvKioKLSAqIFRyYWNrIHRoZSBzdGF0ZSBvZiBXaWZpIGNvbm5lY3Rpdml0eS4gQWxsIGV2ZW50IGhhbmRsaW5nIGlzIGRvbmUgaGVyZSwKLSAqIGFuZCBhbGwgY2hhbmdlcyBpbiBjb25uZWN0aXZpdHkgc3RhdGUgYXJlIGluaXRpYXRlZCBoZXJlLgorICogVHJhY2sgdGhlIHN0YXRlIG9mIHdpZmkgZm9yIGNvbm5lY3Rpdml0eSBzZXJ2aWNlLgogICoKICAqIEBoaWRlCiAgKi8KLXB1YmxpYyBjbGFzcyBXaWZpU3RhdGVUcmFja2VyIGV4dGVuZHMgTmV0d29ya1N0YXRlVHJhY2tlciB7CitwdWJsaWMgY2xhc3MgV2lmaVN0YXRlVHJhY2tlciBpbXBsZW1lbnRzIE5ldHdvcmtTdGF0ZVRyYWNrZXIgewogCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBMT0NBTF9MT0dEID0gQ29uZmlnLkxPR0QgfHwgZmFsc2U7Ci0gICAgCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE5FVFdPUktUWVBFID0gIldJRkkiOwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiV2lmaVN0YXRlVHJhY2tlciI7CiAKLSAgICAvLyBFdmVudCBsb2cgdGFncyAobXVzdCBiZSBpbiBzeW5jIHdpdGggZXZlbnQtbG9nLXRhZ3MpCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEVWRU5UTE9HX05FVFdPUktfU1RBVEVfQ0hBTkdFRCA9IDUwMDIxOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBFVkVOVExPR19TVVBQTElDQU5UX1NUQVRFX0NIQU5HRUQgPSA1MDAyMjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRVZFTlRMT0dfRFJJVkVSX1NUQVRFX0NIQU5HRUQgPSA1MDAyMzsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRVZFTlRMT0dfSU5URVJGQUNFX0NPTkZJR1VSQVRJT05fU1RBVEVfQ0hBTkdFRCA9IDUwMDI0OwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBFVkVOVExPR19TVVBQTElDQU5UX0NPTk5FQ1RJT05fU1RBVEVfQ0hBTkdFRCA9IDUwMDI1OworICAgIHByaXZhdGUgQXRvbWljQm9vbGVhbiBtVGVhcmRvd25SZXF1ZXN0ZWQgPSBuZXcgQXRvbWljQm9vbGVhbihmYWxzZSk7CisgICAgcHJpdmF0ZSBBdG9taWNCb29sZWFuIG1Qcml2YXRlRG5zUm91dGVTZXQgPSBuZXcgQXRvbWljQm9vbGVhbihmYWxzZSk7CisgICAgcHJpdmF0ZSBBdG9taWNJbnRlZ2VyIG1EZWZhdWx0R2F0ZXdheUFkZHIgPSBuZXcgQXRvbWljSW50ZWdlcigwKTsKKyAgICBwcml2YXRlIEF0b21pY0Jvb2xlYW4gbURlZmF1bHRSb3V0ZVNldCA9IG5ldyBBdG9taWNCb29sZWFuKGZhbHNlKTsKIAotICAgIC8vIEV2ZW50IGNvZGVzCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEVWRU5UX1NVUFBMSUNBTlRfQ09OTkVDVElPTiAgICAgICAgICAgICA9IDE7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEVWRU5UX1NVUFBMSUNBTlRfRElTQ09OTkVDVCAgICAgICAgICAgICA9IDI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEVWRU5UX1NVUFBMSUNBTlRfU1RBVEVfQ0hBTkdFRCAgICAgICAgICA9IDM7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEVWRU5UX05FVFdPUktfU1RBVEVfQ0hBTkdFRCAgICAgICAgICAgICA9IDQ7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEVWRU5UX1NDQU5fUkVTVUxUU19BVkFJTEFCTEUgICAgICAgICAgICA9IDU7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEVWRU5UX0lOVEVSRkFDRV9DT05GSUdVUkFUSU9OX1NVQ0NFRURFRCA9IDY7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEVWRU5UX0lOVEVSRkFDRV9DT05GSUdVUkFUSU9OX0ZBSUxFRCAgICA9IDc7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEVWRU5UX1BPTExfSU5URVJWQUwgICAgICAgICAgICAgICAgICAgICA9IDg7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEVWRU5UX0RIQ1BfU1RBUlQgICAgICAgICAgICAgICAgICAgICAgICA9IDk7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEVWRU5UX0RFRkVSUkVEX0RJU0NPTk5FQ1QgICAgICAgICAgICAgICA9IDEwOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBFVkVOVF9ERUZFUlJFRF9SRUNPTk5FQ1QgICAgICAgICAgICAgICAgPSAxMTsKLSAgICAvKioKLSAgICAgKiBUaGUgZHJpdmVyIGlzIHN0YXJ0ZWQgb3Igc3RvcHBlZC4gVGhlIG9iamVjdCB3aWxsIGJlIHRoZSBzdGF0ZTogdHJ1ZSBmb3IKLSAgICAgKiBzdGFydGVkLCBmYWxzZSBmb3Igc3RvcHBlZC4KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRVZFTlRfRFJJVkVSX1NUQVRFX0NIQU5HRUQgICAgICAgICAgICAgID0gMTI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEVWRU5UX1BBU1NXT1JEX0tFWV9NQVlfQkVfSU5DT1JSRUNUICAgICA9IDEzOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBFVkVOVF9NQVlCRV9TVEFSVF9TQ0FOX1BPU1RfRElTQ09OTkVDVCAgPSAxNDsKKyAgICBwcml2YXRlIExpbmtQcm9wZXJ0aWVzIG1MaW5rUHJvcGVydGllczsKKyAgICBwcml2YXRlIE5ldHdvcmtJbmZvIG1OZXR3b3JrSW5mbzsKIAotICAgIC8qKgotICAgICAqIFRoZSBkcml2ZXIgc3RhdGUgaW5kaWNhdGlvbi4KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRFJJVkVSX1NUQVJURUQgICAgICAgICAgICAgICAgICAgICAgICAgID0gMDsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRFJJVkVSX1NUT1BQRUQgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRFJJVkVSX0hVTkcgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjsKKyAgICAvKiBGb3Igc2VuZGluZyBldmVudHMgdG8gY29ubmVjdGl2aXR5IHNlcnZpY2UgaGFuZGxlciAqLworICAgIHByaXZhdGUgSGFuZGxlciBtQ3NIYW5kbGVyOworICAgIHByaXZhdGUgQ29udGV4dCBtQ29udGV4dDsKKyAgICBwcml2YXRlIEJyb2FkY2FzdFJlY2VpdmVyIG1XaWZpU3RhdGVSZWNlaXZlcjsKKyAgICBwcml2YXRlIFdpZmlNYW5hZ2VyIG1XaWZpTWFuYWdlcjsKIAotICAgIC8qKgotICAgICAqIEludGVydmFsIGluIG1pbGxpc2Vjb25kcyBiZXR3ZWVuIHBvbGxpbmcgZm9yIGNvbm5lY3Rpb24KLSAgICAgKiBzdGF0dXMgaXRlbXMgdGhhdCBhcmUgbm90IHNlbnQgdmlhIGFzeW5jaHJvbm91cyBldmVudHMuCi0gICAgICogQW4gZXhhbXBsZSBpcyBSU1NJIChzaWduYWwgc3RyZW5ndGgpLgotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBQT0xMX1NUQVRVU19JTlRFUlZBTF9NU0VDUyA9IDMwMDA7CisgICAgcHVibGljIFdpZmlTdGF0ZVRyYWNrZXIoKSB7CisgICAgICAgIG1OZXR3b3JrSW5mbyA9IG5ldyBOZXR3b3JrSW5mbyhDb25uZWN0aXZpdHlNYW5hZ2VyLlRZUEVfV0lGSSwgMCwgTkVUV09SS1RZUEUsICIiKTsKKyAgICAgICAgbUxpbmtQcm9wZXJ0aWVzID0gbmV3IExpbmtQcm9wZXJ0aWVzKCk7CiAKLSAgICAvKioKLSAgICAgKiBUaGUgbWF4IG51bWJlciBvZiB0aGUgV1BBIHN1cHBsaWNhbnQgbG9vcCBpdGVyYXRpb25zIGJlZm9yZSB3ZQotICAgICAqIGRlY2lkZSB0aGF0IHRoZSBsb29wIHNob3VsZCBiZSB0ZXJtaW5hdGVkOgotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNQVhfU1VQUExJQ0FOVF9MT09QX0lURVJBVElPTlMgPSA0OworICAgICAgICBtTmV0d29ya0luZm8uc2V0SXNBdmFpbGFibGUoZmFsc2UpOworICAgICAgICBtTGlua1Byb3BlcnRpZXMuY2xlYXIoKTsKKyAgICAgICAgc2V0VGVhcmRvd25SZXF1ZXN0ZWQoZmFsc2UpOworICAgIH0KIAotICAgIC8qKgotICAgICAqIFdoZW4gYSBESVNDT05ORUNUIGV2ZW50IGlzIHJlY2VpdmVkLCB3ZSBkZWZlciBoYW5kbGluZyBpdCB0bwotICAgICAqIGFsbG93IGZvciB0aGUgcG9zc2liaWxpdHkgdGhhdCB0aGUgRElTQ09OTkVDVCBpcyBhYm91dCB0bwotICAgICAqIGJlIGZvbGxvd2VkIHNob3J0bHkgYnkgYSBDT05ORUNUIHRvIHRoZSBzYW1lIG5ldHdvcmsgd2Ugd2VyZQotICAgICAqIGp1c3QgY29ubmVjdGVkIHRvLiBJbiBzdWNoIGEgY2FzZSwgd2UgZG9uJ3Qgd2FudCB0byByZXBvcnQKLSAgICAgKiB0aGUgbmV0d29yayBhcyBkb3duLCBub3IgZG8gd2Ugd2FudCB0byByZWNvbmZpZ3VyZSB0aGUgbmV0d29yawotICAgICAqIGludGVyZmFjZSwgZXRjLiBJZiB3ZSBnZXQgYSBDT05ORUNUIGV2ZW50IGZvciBhbm90aGVyIG5ldHdvcmsKLSAgICAgKiB3aXRoaW4gdGhlIGRlbGF5IHdpbmRvdywgd2UgaW1tZWRpYXRlbHkgaGFuZGxlIHRoZSBwZW5kaW5nCi0gICAgICogZGlzY29ubmVjdCBiZWZvcmUgcHJvY2Vzc2luZyB0aGUgQ09OTkVDVC48cC8+Ci0gICAgICogVGhlIGZpdmUgc2Vjb25kIGRlbGF5IGlzIGNob3NlbiBzb21ld2hhdCBhcmJpdHJhcmlseSwgYnV0IGlzCi0gICAgICogbWVhbnQgdG8gY292ZXIgbW9zdCBvZiB0aGUgY2FzZXMgd2hlcmUgYSBESVNDT05ORUNUL0NPTk5FQ1QKLSAgICAgKiBoYXBwZW5zIHRvIGEgbmV0d29yay4KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRElTQ09OTkVDVF9ERUxBWV9NU0VDUyA9IDUwMDA7Ci0gICAgLyoqCi0gICAgICogV2hlbiB0aGUgc3VwcGxpY2FudCBnb2VzIGlkbGUgYWZ0ZXIgd2UgZG8gYW4gZXhwbGljaXQgZGlzY29ubmVjdAotICAgICAqIGZvbGxvd2luZyBhIERIQ1AgZmFpbHVyZSwgd2UgbmVlZCB0byBraWNrIHRoZSBzdXBwbGljYW50IGludG8KLSAgICAgKiB0cnlpbmcgdG8gYXNzb2NpYXRlIHdpdGggYWNjZXNzIHBvaW50cy4KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUkVDT05ORUNUX0RFTEFZX01TRUNTID0gMjAwMDsKIAotICAgIC8qKgotICAgICAqIFdoZW4gdGhlIHN1cHBsaWNhbnQgZGlzY29ubmVjdHMgZnJvbSBhbiBBUCBpdCBzb21ldGltZXMgZm9yZ2V0cwotICAgICAqIHRvIHJlc3RhcnQgc2Nhbm5pbmcuICBXYWl0IHRoaXMgZGVsYXkgYmVmb3JlIGFza2luZyBpdCB0byBzdGFydAotICAgICAqIHNjYW5uaW5nIChpbiBjYXNlIGl0IGZvcmdvdCkuICAxNSBzZWMgaXMgdGhlIHN0YW5kYXJkIGRlbGF5IGJldHdlZW4KLSAgICAgKiBzY2Fucy4KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgS0lDS1NUQVJUX1NDQU5OSU5HX0RFTEFZX01TRUNTID0gMTUwMDA7CisgICAgcHVibGljIHZvaWQgc2V0VGVhcmRvd25SZXF1ZXN0ZWQoYm9vbGVhbiBpc1JlcXVlc3RlZCkgeworICAgICAgICBtVGVhcmRvd25SZXF1ZXN0ZWQuc2V0KGlzUmVxdWVzdGVkKTsKKyAgICB9CiAKLSAgICAvKioKLSAgICAgKiBUaGUgbWF4aW11bSBudW1iZXIgb2YgdGltZXMgd2Ugd2lsbCByZXRyeSBhIGNvbm5lY3Rpb24gdG8gYW4gYWNjZXNzIHBvaW50Ci0gICAgICogZm9yIHdoaWNoIHdlIGhhdmUgZmFpbGVkIGluIGFjcXVpcmluZyBhbiBJUCBhZGRyZXNzIGZyb20gREhDUC4gQSB2YWx1ZSBvZgotICAgICAqIE4gbWVhbnMgdGhhdCB3ZSB3aWxsIG1ha2UgTisxIGNvbm5lY3Rpb24gYXR0ZW1wdHMgaW4gYWxsLgotICAgICAqIDxwPgotICAgICAqIFNlZSB7QGxpbmsgU2V0dGluZ3MuU2VjdXJlI1dJRklfTUFYX0RIQ1BfUkVUUllfQ09VTlR9LiBUaGlzIGlzIHRoZSBkZWZhdWx0Ci0gICAgICogdmFsdWUgaWYgYSBTZXR0aW5ncyB2YWx1ZSBpcyBub3QgcHJlc2VudC4KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgREVGQVVMVF9NQVhfREhDUF9SRVRSSUVTID0gOTsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBEUklWRVJfUE9XRVJfTU9ERV9BVVRPID0gMDsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRFJJVkVSX1BPV0VSX01PREVfQUNUSVZFID0gMTsKLQotICAgIC8qKgotICAgICAqIFRoZSBjdXJyZW50IFdQQSBzdXBwbGljYW50IGxvb3Agc3RhdGUgKHVzZWQgdG8gZGV0ZWN0IGxvb3BpbmcgYmVoYXZpb3IpOgotICAgICAqLwotICAgIHByaXZhdGUgU3VwcGxpY2FudFN0YXRlIG1TdXBwbGljYW50TG9vcFN0YXRlID0gU3VwcGxpY2FudFN0YXRlLkRJU0NPTk5FQ1RFRDsKLQotICAgIC8qKgotICAgICAqIFRoZSBjdXJyZW50IG51bWJlciBvZiBXUEEgc3VwcGxpY2FudCBsb29wIGl0ZXJhdGlvbnM6Ci0gICAgICovCi0gICAgcHJpdmF0ZSBpbnQgbU51bVN1cHBsaWNhbnRMb29wSXRlcmF0aW9ucyA9IDA7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgY3VycmVudCBudW1iZXIgb2Ygc3VwcGxpY2FudCBzdGF0ZSBjaGFuZ2VzLiAgVGhpcyBpcyB1c2VkIHRvIGRldGVybWluZQotICAgICAqIGlmIHdlJ3ZlIHJlY2VpdmVkIGFueSBuZXcgaW5mbyBzaW5jZSB3ZSBmb3VuZCBvdXQgaXQgd2FzIERJU0NPTk5FQ1RFRCBvcgotICAgICAqIElOQUNUSVZFLiAgSWYgd2UgaGF2ZW4ndCBmb3IgWCBtcywgd2UgdGhlbiByZXF1ZXN0IGEgc2NhbiAtIGl0IHNob3VsZCBoYXZlCi0gICAgICogZG9uZSB0aGF0IGF1dG9tYXRpY2FsbHksIGJ1dCBzb21ldGltZXMgc29tZSBmaXJtd2FyZSBkb2VzIG5vdC4KLSAgICAgKi8KLSAgICBwcml2YXRlIGludCBtTnVtU3VwcGxpY2FudFN0YXRlQ2hhbmdlcyA9IDA7Ci0KLSAgICAvKioKLSAgICAgKiBUcnVlIGlmIHdlIHJlY2VpdmVkIGFuIGV2ZW50IHRoYXQgdGhhdCBhIHBhc3N3b3JkLWtleSBtYXkgYmUgaW5jb3JyZWN0LgotICAgICAqIElmIHRoZSBuZXh0IGluY29taW5nIHN1cHBsaWNhbnQgc3RhdGUgY2hhbmdlIGV2ZW50IGlzIERJU0NPTk5FQ1QsCi0gICAgICogYnJvYWRjYXN0IGEgbWVzc2FnZSB0aGF0IHdlIGhhdmUgYSBwb3NzaWJsZSBwYXNzd29yZCBlcnJvciBhbmQgZGlzYWJsZQotICAgICAqIHRoZSBuZXR3b3JrLgotICAgICAqLwotICAgIHByaXZhdGUgYm9vbGVhbiBtUGFzc3dvcmRLZXlNYXlCZUluY29ycmVjdCA9IGZhbHNlOwotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1VQUExfU0NBTl9IQU5ETElOR19OT1JNQUwgPSAxOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNVUFBMX1NDQU5fSEFORExJTkdfTElTVF9PTkxZID0gMjsKLQotICAgIHByaXZhdGUgV2lmaU1vbml0b3IgbVdpZmlNb25pdG9yOwotICAgIHByaXZhdGUgV2lmaUluZm8gbVdpZmlJbmZvOwotICAgIHByaXZhdGUgTGlzdDxTY2FuUmVzdWx0PiBtU2NhblJlc3VsdHM7Ci0gICAgcHJpdmF0ZSBXaWZpTWFuYWdlciBtV007Ci0gICAgcHJpdmF0ZSBib29sZWFuIG1IYXZlSXBBZGRyZXNzOwotICAgIHByaXZhdGUgYm9vbGVhbiBtT2J0YWluaW5nSXBBZGRyZXNzOwotICAgIHByaXZhdGUgYm9vbGVhbiBtVG9ybkRvd25CeUNvbm5NZ3I7Ci0gICAgLyoqCi0gICAgICogQSBESVNDT05ORUNUIGV2ZW50IGhhcyBiZWVuIHJlY2VpdmVkLCBidXQgcHJvY2Vzc2luZyBpdAotICAgICAqIGlzIGJlaW5nIGRlZmVycmVkLgotICAgICAqLwotICAgIHByaXZhdGUgYm9vbGVhbiBtRGlzY29ubmVjdFBlbmRpbmc7Ci0gICAgLyoqCi0gICAgICogQW4gb3BlcmF0aW9uIGhhcyBiZWVuIHBlcmZvcm1lZCBhcyBhIHJlc3VsdCBvZiB3aGljaCB3ZSBleHBlY3QgdGhlIG5leHQgZXZlbnQKLSAgICAgKiB3aWxsIGJlIGEgRElTQ09OTkVDVC4KLSAgICAgKi8KLSAgICBwcml2YXRlIGJvb2xlYW4gbURpc2Nvbm5lY3RFeHBlY3RlZDsKLSAgICBwcml2YXRlIERoY3BIYW5kbGVyIG1EaGNwVGFyZ2V0OwotICAgIHByaXZhdGUgRGhjcEluZm8gbURoY3BJbmZvOwotICAgIHByaXZhdGUgaW50IG1MYXN0U2lnbmFsTGV2ZWwgPSAtMTsKLSAgICBwcml2YXRlIFN0cmluZyBtTGFzdEJzc2lkOwotICAgIHByaXZhdGUgU3RyaW5nIG1MYXN0U3NpZDsKLSAgICBwcml2YXRlIGludCBtTGFzdE5ldHdvcmtJZCA9IC0xOwotICAgIHByaXZhdGUgYm9vbGVhbiBtVXNlU3RhdGljSXAgPSBmYWxzZTsKLSAgICBwcml2YXRlIGludCBtUmVjb25uZWN0Q291bnQ7Ci0KLSAgICAvKiBUcmFja3MgaWYgYW55IG5ldHdvcmsgaW4gdGhlIGNvbmZpZ3VyYXRpb24gaXMgZGlzYWJsZWQgKi8KLSAgICBwcml2YXRlIEF0b21pY0Jvb2xlYW4gbUlzQW55TmV0d29ya0Rpc2FibGVkID0gbmV3IEF0b21pY0Jvb2xlYW4oZmFsc2UpOwotCi0gICAgLy8gdXNlZCB0byBzdG9yZSB0aGUgKG5vbi1wZXJzaXN0ZWQpIG51bSBkZXRlcm1pbmVkIGR1cmluZyBkZXZpY2UgYm9vdCAKLSAgICAvLyAoZnJvbSBtY2Mgb3Igb3RoZXIgcGhvbmUgaW5mbykgYmVmb3JlIHRoZSBkcml2ZXIgaXMgc3RhcnRlZC4KLSAgICBwcml2YXRlIGludCBtTnVtQWxsb3dlZENoYW5uZWxzID0gMDsKLQotICAgIC8vIFZhcmlhYmxlcyByZWxhdGluZyB0byB0aGUgJ2F2YWlsYWJsZSBuZXR3b3Jrcycgbm90aWZpY2F0aW9uCi0gICAgCi0gICAgLyoqCi0gICAgICogVGhlIGljb24gdG8gc2hvdyBpbiB0aGUgJ2F2YWlsYWJsZSBuZXR3b3Jrcycgbm90aWZpY2F0aW9uLiBUaGlzIHdpbGwgYWxzbwotICAgICAqIGJlIHRoZSBJRCBvZiB0aGUgTm90aWZpY2F0aW9uIGdpdmVuIHRvIHRoZSBOb3RpZmljYXRpb25NYW5hZ2VyLgotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBJQ09OX05FVFdPUktTX0FWQUlMQUJMRSA9Ci0gICAgICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmRyYXdhYmxlLnN0YXRfbm90aWZ5X3dpZmlfaW5fcmFuZ2U7Ci0gICAgLyoqCi0gICAgICogV2hlbiBhIG5vdGlmaWNhdGlvbiBpcyBzaG93biwgd2Ugd2FpdCB0aGlzIGFtb3VudCBiZWZvcmUgcG9zc2libHkgc2hvd2luZyBpdCBhZ2Fpbi4KLSAgICAgKi8KLSAgICBwcml2YXRlIGZpbmFsIGxvbmcgTk9USUZJQ0FUSU9OX1JFUEVBVF9ERUxBWV9NUzsKLSAgICAvKioKLSAgICAgKiBXaGV0aGVyIHRoZSB1c2VyIGhhcyBzZXQgdGhlIHNldHRpbmcgdG8gc2hvdyB0aGUgJ2F2YWlsYWJsZSBuZXR3b3Jrcycgbm90aWZpY2F0aW9uLgotICAgICAqLwotICAgIHByaXZhdGUgYm9vbGVhbiBtTm90aWZpY2F0aW9uRW5hYmxlZDsKLSAgICAvKioKLSAgICAgKiBPYnNlcnZlcyB0aGUgdXNlciBzZXR0aW5nIHRvIGtlZXAge0BsaW5rICNtTm90aWZpY2F0aW9uRW5hYmxlZH0gaW4gc3luYy4KLSAgICAgKi8KLSAgICBwcml2YXRlIE5vdGlmaWNhdGlvbkVuYWJsZWRTZXR0aW5nT2JzZXJ2ZXIgbU5vdGlmaWNhdGlvbkVuYWJsZWRTZXR0aW5nT2JzZXJ2ZXI7Ci0gICAgLyoqCi0gICAgICogVGhlIHtAbGluayBTeXN0ZW0jY3VycmVudFRpbWVNaWxsaXMoKX0gbXVzdCBiZSBhdCBsZWFzdCB0aGlzIHZhbHVlIGZvciB1cwotICAgICAqIHRvIHNob3cgdGhlIG5vdGlmaWNhdGlvbiBhZ2Fpbi4KLSAgICAgKi8KLSAgICBwcml2YXRlIGxvbmcgbU5vdGlmaWNhdGlvblJlcGVhdFRpbWU7Ci0gICAgLyoqCi0gICAgICogVGhlIE5vdGlmaWNhdGlvbiBvYmplY3QgZ2l2ZW4gdG8gdGhlIE5vdGlmaWNhdGlvbk1hbmFnZXIuCi0gICAgICovCi0gICAgcHJpdmF0ZSBOb3RpZmljYXRpb24gbU5vdGlmaWNhdGlvbjsKLSAgICAvKioKLSAgICAgKiBXaGV0aGVyIHRoZSBub3RpZmljYXRpb24gaXMgYmVpbmcgc2hvd24sIGFzIHNldCBieSB1cy4gVGhhdCBpcywgaWYgdGhlCi0gICAgICogdXNlciBjYW5jZWxzIHRoZSBub3RpZmljYXRpb24sIHdlIHdpbGwgbm90IHJlY2VpdmUgdGhlIGNhbGxiYWNrIHNvIHRoaXMKLSAgICAgKiB3aWxsIHN0aWxsIGJlIHRydWUuIFdlIG9ubHkgZ3VhcmFudGVlIGlmIHRoaXMgaXMgZmFsc2UsIHRoZW4gdGhlCi0gICAgICogbm90aWZpY2F0aW9uIGlzIG5vdCBzaG93aW5nLgotICAgICAqLwotICAgIHByaXZhdGUgYm9vbGVhbiBtTm90aWZpY2F0aW9uU2hvd247Ci0gICAgLyoqCi0gICAgICogVGhlIG51bWJlciBvZiBjb250aW51b3VzIHNjYW5zIHRoYXQgbXVzdCBvY2N1ciBiZWZvcmUgY29uc2lkZXIgdGhlCi0gICAgICogc3VwcGxpY2FudCBpbiBhIHNjYW5uaW5nIHN0YXRlLiBUaGlzIGFsbG93cyBzdXBwbGljYW50IHRvIGFzc29jaWF0ZSB3aXRoCi0gICAgICogcmVtZW1iZXJlZCBuZXR3b3JrcyB0aGF0IGFyZSBpbiB0aGUgc2NhbiByZXN1bHRzLgotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBOVU1fU0NBTlNfQkVGT1JFX0FDVFVBTExZX1NDQU5OSU5HID0gMzsKLSAgICAvKioKLSAgICAgKiBUaGUgbnVtYmVyIG9mIHNjYW5zIHNpbmNlIHRoZSBsYXN0IG5ldHdvcmsgc3RhdGUgY2hhbmdlLiBXaGVuIHRoaXMKLSAgICAgKiBleGNlZWRzIHtAbGluayAjTlVNX1NDQU5TX0JFRk9SRV9BQ1RVQUxMWV9TQ0FOTklOR30sIHdlIGNvbnNpZGVyIHRoZQotICAgICAqIHN1cHBsaWNhbnQgdG8gYWN0dWFsbHkgYmUgc2Nhbm5pbmcuIFdoZW4gdGhlIG5ldHdvcmsgc3RhdGUgY2hhbmdlcyB0bwotICAgICAqIHNvbWV0aGluZyBvdGhlciB0aGFuIHNjYW5uaW5nLCB3ZSByZXNldCB0aGlzIHRvIDAuCi0gICAgICovCi0gICAgcHJpdmF0ZSBpbnQgbU51bVNjYW5zU2luY2VOZXR3b3JrU3RhdGVDaGFuZ2U7Ci0gICAgLyoqCi0gICAgICogT2JzZXJ2ZXMgdGhlIHN0YXRpYyBJUCBhZGRyZXNzIHNldHRpbmdzLgotICAgICAqLwotICAgIHByaXZhdGUgU2V0dGluZ3NPYnNlcnZlciBtU2V0dGluZ3NPYnNlcnZlcjsKLSAgICAKLSAgICBwcml2YXRlIGJvb2xlYW4gbUlzU2Nhbk1vZGVBY3RpdmU7Ci0gICAgcHJpdmF0ZSBib29sZWFuIG1FbmFibGVSc3NpUG9sbGluZzsKLSAgICBwcml2YXRlIGJvb2xlYW4gbUlzSGlnaFBlcmZFbmFibGVkOwotICAgIHByaXZhdGUgaW50IG1Qb3dlck1vZGVSZWZDb3VudCA9IDA7Ci0gICAgcHJpdmF0ZSBpbnQgbU9wdGltaXphdGlvbnNEaXNhYmxlZFJlZkNvdW50ID0gMDsKLQotICAgIC8qKgotICAgICAqIE9uZSBvZiAge0BsaW5rIFdpZmlNYW5hZ2VyI1dJRklfU1RBVEVfRElTQUJMRUR9LAotICAgICAqICAgICAgICAge0BsaW5rIFdpZmlNYW5hZ2VyI1dJRklfU1RBVEVfRElTQUJMSU5HfSwKLSAgICAgKiAgICAgICAgIHtAbGluayBXaWZpTWFuYWdlciNXSUZJX1NUQVRFX0VOQUJMRUR9LAotICAgICAqICAgICAgICAge0BsaW5rIFdpZmlNYW5hZ2VyI1dJRklfU1RBVEVfRU5BQkxJTkd9LAotICAgICAqICAgICAgICAge0BsaW5rIFdpZmlNYW5hZ2VyI1dJRklfU1RBVEVfVU5LTk9XTn0KLSAgICAgKgotICAgICAqIGdldFdpZmlTdGF0ZSgpIGlzIG5vdCBzeW5jaHJvbml6ZWQgdG8gbWFrZSBzdXJlIGl0J3MgYWx3YXlzIGZhc3QsCi0gICAgICogZXZlbiB3aGVuIHRoZSBpbnN0YW5jZSBsb2NrIGlzIGhlbGQgb24gb3RoZXIgc2xvdyBvcGVyYXRpb25zLgotICAgICAqIFVzZSBhIGF0b21pYyB2YXJpYWJsZSBmb3Igc3RhdGUuCi0gICAgICovCi0gICAgcHJpdmF0ZSBmaW5hbCBBdG9taWNJbnRlZ2VyIG1XaWZpU3RhdGUgPSBuZXcgQXRvbWljSW50ZWdlcihXSUZJX1NUQVRFX1VOS05PV04pOwotCi0gICAgLy8gV2ktRmkgcnVuIHN0YXRlczoKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUlVOX1NUQVRFX1NUQVJUSU5HID0gMTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUlVOX1NUQVRFX1JVTk5JTkcgID0gMjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUlVOX1NUQVRFX1NUT1BQSU5HID0gMzsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUlVOX1NUQVRFX1NUT1BQRUQgID0gNDsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBtUnVuU3RhdGVOYW1lc1tdID0gewotICAgICAgICAgICAgIlN0YXJ0aW5nIiwKLSAgICAgICAgICAgICJSdW5uaW5nIiwKLSAgICAgICAgICAgICJTdG9wcGluZyIsCi0gICAgICAgICAgICAiU3RvcHBlZCIKLSAgICB9OwotICAgIHByaXZhdGUgaW50IG1SdW5TdGF0ZTsKLQotICAgIHByaXZhdGUgZmluYWwgSUJhdHRlcnlTdGF0cyBtQmF0dGVyeVN0YXRzOwotCi0gICAgcHJpdmF0ZSBib29sZWFuIG1Jc1NjYW5Pbmx5OwotCi0gICAgcHJpdmF0ZSBCbHVldG9vdGhBMmRwIG1CbHVldG9vdGhBMmRwOwotCi0gICAgcHJpdmF0ZSBTdHJpbmcgbUludGVyZmFjZU5hbWU7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIExTID0gU3lzdGVtLmdldFByb3BlcnR5KCJsaW5lLnNlcGFyYXRvciIpOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nW10gc0Ruc1Byb3BOYW1lczsKLSAgICBwcml2YXRlIFJ1bm5hYmxlIG1SZWxlYXNlV2FrZUxvY2tDYWxsYmFjazsKLQotICAgIC8qKgotICAgICAqIEEgc3RydWN0dXJlIGZvciBzdXBwbHlpbmcgaW5mb3JtYXRpb24gYWJvdXQgYSBzdXBwbGljYW50IHN0YXRlCi0gICAgICogY2hhbmdlIGluIHRoZSBTVEFURV9DSEFOR0UgZXZlbnQgbWVzc2FnZSB0aGF0IGNvbWVzIGZyb20gdGhlCi0gICAgICogV2lmaU1vbml0b3IKLSAgICAgKiB0aHJlYWQuCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgU3VwcGxpY2FudFN0YXRlQ2hhbmdlUmVzdWx0IHsKLSAgICAgICAgU3VwcGxpY2FudFN0YXRlQ2hhbmdlUmVzdWx0KGludCBuZXR3b3JrSWQsIFN0cmluZyBCU1NJRCwgU3VwcGxpY2FudFN0YXRlIHN0YXRlKSB7Ci0gICAgICAgICAgICB0aGlzLnN0YXRlID0gc3RhdGU7Ci0gICAgICAgICAgICB0aGlzLkJTU0lEID0gQlNTSUQ7Ci0gICAgICAgICAgICB0aGlzLm5ldHdvcmtJZCA9IG5ldHdvcmtJZDsKLSAgICAgICAgfQotICAgICAgICBpbnQgbmV0d29ya0lkOwotICAgICAgICBTdHJpbmcgQlNTSUQ7Ci0gICAgICAgIFN1cHBsaWNhbnRTdGF0ZSBzdGF0ZTsKKyAgICBwdWJsaWMgYm9vbGVhbiBpc1RlYXJkb3duUmVxdWVzdGVkKCkgeworICAgICAgICByZXR1cm4gbVRlYXJkb3duUmVxdWVzdGVkLmdldCgpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIEEgc3RydWN0dXJlIGZvciBzdXBwbHlpbmcgaW5mb3JtYXRpb24gYWJvdXQgYSBjb25uZWN0aW9uIGluCi0gICAgICogdGhlIENPTk5FQ1RFRCBldmVudCBtZXNzYWdlIHRoYXQgY29tZXMgZnJvbSB0aGUgV2lmaU1vbml0b3IKLSAgICAgKiB0aHJlYWQuCisgICAgICogQmVnaW4gbW9uaXRvcmluZyB3aWZpIGNvbm5lY3Rpdml0eQogICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIE5ldHdvcmtTdGF0ZUNoYW5nZVJlc3VsdCB7Ci0gICAgICAgIE5ldHdvcmtTdGF0ZUNoYW5nZVJlc3VsdChEZXRhaWxlZFN0YXRlIHN0YXRlLCBTdHJpbmcgQlNTSUQsIGludCBuZXR3b3JrSWQpIHsKLSAgICAgICAgICAgIHRoaXMuc3RhdGUgPSBzdGF0ZTsKLSAgICAgICAgICAgIHRoaXMuQlNTSUQgPSBCU1NJRDsKLSAgICAgICAgICAgIHRoaXMubmV0d29ya0lkID0gbmV0d29ya0lkOwotICAgICAgICB9Ci0gICAgICAgIERldGFpbGVkU3RhdGUgc3RhdGU7Ci0gICAgICAgIFN0cmluZyBCU1NJRDsKLSAgICAgICAgaW50IG5ldHdvcmtJZDsKLSAgICB9CisgICAgcHVibGljIHZvaWQgc3RhcnRNb25pdG9yaW5nKENvbnRleHQgY29udGV4dCwgSGFuZGxlciB0YXJnZXQpIHsKKyAgICAgICAgbUNzSGFuZGxlciA9IHRhcmdldDsKKyAgICAgICAgbUNvbnRleHQgPSBjb250ZXh0OwogCi0gICAgcHVibGljIFdpZmlTdGF0ZVRyYWNrZXIoQ29udGV4dCBjb250ZXh0LCBIYW5kbGVyIHRhcmdldCkgewotICAgICAgICBzdXBlcihjb250ZXh0LCB0YXJnZXQsIENvbm5lY3Rpdml0eU1hbmFnZXIuVFlQRV9XSUZJLCAwLCAiV0lGSSIsICIiKTsKLSAgICAgICAgCi0gICAgICAgIG1XaWZpSW5mbyA9IG5ldyBXaWZpSW5mbygpOwotICAgICAgICBtV2lmaU1vbml0b3IgPSBuZXcgV2lmaU1vbml0b3IodGhpcyk7Ci0gICAgICAgIG1IYXZlSXBBZGRyZXNzID0gZmFsc2U7Ci0gICAgICAgIG1PYnRhaW5pbmdJcEFkZHJlc3MgPSBmYWxzZTsKLSAgICAgICAgc2V0VG9ybkRvd25CeUNvbm5NZ3IoZmFsc2UpOwotICAgICAgICBtRGlzY29ubmVjdFBlbmRpbmcgPSBmYWxzZTsKLSAgICAgICAgbVNjYW5SZXN1bHRzID0gbmV3IEFycmF5TGlzdDxTY2FuUmVzdWx0PigpOwotICAgICAgICAvLyBBbGxvY2F0ZSBESENQIGluZm8gb2JqZWN0IG9uY2UsIGFuZCBmaWxsIGl0IGluIG9uIGVhY2ggcmVxdWVzdAotICAgICAgICBtRGhjcEluZm8gPSBuZXcgRGhjcEluZm8oKTsKLSAgICAgICAgbVJ1blN0YXRlID0gUlVOX1NUQVRFX1NUQVJUSU5HOworICAgICAgICBtV2lmaU1hbmFnZXIgPSAoV2lmaU1hbmFnZXIpIG1Db250ZXh0LmdldFN5c3RlbVNlcnZpY2UoQ29udGV4dC5XSUZJX1NFUlZJQ0UpOworICAgICAgICBJbnRlbnRGaWx0ZXIgZmlsdGVyID0gbmV3IEludGVudEZpbHRlcigpOworICAgICAgICBmaWx0ZXIuYWRkQWN0aW9uKFdpZmlNYW5hZ2VyLk5FVFdPUktfU1RBVEVfQ0hBTkdFRF9BQ1RJT04pOworICAgICAgICBmaWx0ZXIuYWRkQWN0aW9uKFdpZmlNYW5hZ2VyLkNPTkZJR19DSEFOR0VEX0FDVElPTik7CiAKLSAgICAgICAgLy8gU2V0dGluZyBpcyBpbiBzZWNvbmRzCi0gICAgICAgIE5PVElGSUNBVElPTl9SRVBFQVRfREVMQVlfTVMgPSBTZXR0aW5ncy5TZWN1cmUuZ2V0SW50KGNvbnRleHQuZ2V0Q29udGVudFJlc29sdmVyKCksIAotICAgICAgICAgICAgICAgIFNldHRpbmdzLlNlY3VyZS5XSUZJX05FVFdPUktTX0FWQUlMQUJMRV9SRVBFQVRfREVMQVksIDkwMCkgKiAxMDAwbDsKLSAgICAgICAgbU5vdGlmaWNhdGlvbkVuYWJsZWRTZXR0aW5nT2JzZXJ2ZXIgPSBuZXcgTm90aWZpY2F0aW9uRW5hYmxlZFNldHRpbmdPYnNlcnZlcihuZXcgSGFuZGxlcigpKTsKLSAgICAgICAgbU5vdGlmaWNhdGlvbkVuYWJsZWRTZXR0aW5nT2JzZXJ2ZXIucmVnaXN0ZXIoKTsKLQotICAgICAgICBtU2V0dGluZ3NPYnNlcnZlciA9IG5ldyBTZXR0aW5nc09ic2VydmVyKG5ldyBIYW5kbGVyKCkpOwotCi0gICAgICAgIG1JbnRlcmZhY2VOYW1lID0gU3lzdGVtUHJvcGVydGllcy5nZXQoIndpZmkuaW50ZXJmYWNlIiwgInRpd2xhbjAiKTsKLSAgICAgICAgc0Ruc1Byb3BOYW1lcyA9IG5ldyBTdHJpbmdbXSB7Ci0gICAgICAgICAgICAiZGhjcC4iICsgbUludGVyZmFjZU5hbWUgKyAiLmRuczEiLAotICAgICAgICAgICAgImRoY3AuIiArIG1JbnRlcmZhY2VOYW1lICsgIi5kbnMyIgotICAgICAgICB9OwotICAgICAgICBtQmF0dGVyeVN0YXRzID0gSUJhdHRlcnlTdGF0cy5TdHViLmFzSW50ZXJmYWNlKFNlcnZpY2VNYW5hZ2VyLmdldFNlcnZpY2UoImJhdHRlcnlpbmZvIikpOwotCisgICAgICAgIG1XaWZpU3RhdGVSZWNlaXZlciA9IG5ldyBXaWZpU3RhdGVSZWNlaXZlcigpOworICAgICAgICBtQ29udGV4dC5yZWdpc3RlclJlY2VpdmVyKG1XaWZpU3RhdGVSZWNlaXZlciwgZmlsdGVyKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBIZWxwZXIgbWV0aG9kOiBzZXRzIHRoZSBzdXBwbGljYW50IHN0YXRlIGFuZCBrZWVwcyB0aGUgbmV0d29yawotICAgICAqIGluZm8gdXBkYXRlZC4KLSAgICAgKiBAcGFyYW0gc3RhdGUgdGhlIG5ldyBzdGF0ZQorICAgICAqIERpc2FibGUgY29ubmVjdGl2aXR5IHRvIGEgbmV0d29yaworICAgICAqIFRPRE86IGRvIGF3YXkgd2l0aCByZXR1cm4gdmFsdWUgYWZ0ZXIgbWFraW5nIE1vYmlsZURhdGFTdGF0ZVRyYWNrZXIgYXN5bmMKICAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgc2V0U3VwcGxpY2FudFN0YXRlKFN1cHBsaWNhbnRTdGF0ZSBzdGF0ZSkgewotICAgICAgICBtV2lmaUluZm8uc2V0U3VwcGxpY2FudFN0YXRlKHN0YXRlKTsKLSAgICAgICAgdXBkYXRlTmV0d29ya0luZm8oKTsKLSAgICAgICAgY2hlY2tQb2xsVGltZXIoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3VwcGxpY2FudFN0YXRlIGdldFN1cHBsaWNhbnRTdGF0ZSgpIHsKLSAgICAgICAgcmV0dXJuIG1XaWZpSW5mby5nZXRTdXBwbGljYW50U3RhdGUoKTsKKyAgICBwdWJsaWMgYm9vbGVhbiB0ZWFyZG93bigpIHsKKyAgICAgICAgbVRlYXJkb3duUmVxdWVzdGVkLnNldCh0cnVlKTsKKyAgICAgICAgbVdpZmlNYW5hZ2VyLnN0b3BXaWZpKCk7CisgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIEhlbHBlciBtZXRob2Q6IHNldHMgdGhlIHN1cHBsaWNhbnQgc3RhdGUgYW5kIGtlZXBzIHRoZSBuZXR3b3JrCi0gICAgICogaW5mbyB1cGRhdGVkIChzdHJpbmcgdmVyc2lvbikuCi0gICAgICogQHBhcmFtIHN0YXRlTmFtZSB0aGUgc3RyaW5nIG5hbWUgb2YgdGhlIG5ldyBzdGF0ZQorICAgICAqIFJlLWVuYWJsZSBjb25uZWN0aXZpdHkgdG8gYSBuZXR3b3JrIGFmdGVyIGEge0BsaW5rICN0ZWFyZG93bigpfS4KKyAgICAgKiBUT0RPOiBkbyBhd2F5IHdpdGggcmV0dXJuIHZhbHVlIGFmdGVyIG1ha2luZyBNb2JpbGVEYXRhU3RhdGVUcmFja2VyIGFzeW5jCiAgICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHNldFN1cHBsaWNhbnRTdGF0ZShTdHJpbmcgc3RhdGVOYW1lKSB7Ci0gICAgICAgIG1XaWZpSW5mby5zZXRTdXBwbGljYW50U3RhdGUoc3RhdGVOYW1lKTsKLSAgICAgICAgdXBkYXRlTmV0d29ya0luZm8oKTsKLSAgICAgICAgY2hlY2tQb2xsVGltZXIoKTsKKyAgICBwdWJsaWMgYm9vbGVhbiByZWNvbm5lY3QoKSB7CisgICAgICAgIG1UZWFyZG93blJlcXVlc3RlZC5zZXQoZmFsc2UpOworICAgICAgICBtV2lmaU1hbmFnZXIuc3RhcnRXaWZpKCk7CisgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIEhlbHBlciBtZXRob2Q6IHNldHMgdGhlIGJvb2xlYW4gaW5kaWNhdGluZyB0aGF0IHRoZSBjb25uZWN0aW9uCi0gICAgICogbWFuYWdlciBhc2tlZCB0aGUgbmV0d29yayB0byBiZSB0b3JuIGRvd24gKGFuZCBzbyBvbmx5IHRoZSBjb25uZWN0aW9uCi0gICAgICogbWFuYWdlciBjYW4gc2V0IGl0IHVwIGFnYWluKS4KLSAgICAgKiBuZXR3b3JrIGluZm8gdXBkYXRlZC4KLSAgICAgKiBAcGFyYW0gZmxhZyB7QGNvZGUgdHJ1ZX0gaWYgZXhwbGljaXRseSBkaXNhYmxlZC4KKyAgICAgKiBUdXJuIHRoZSB3aXJlbGVzcyByYWRpbyBvZmYgZm9yIGEgbmV0d29yay4KKyAgICAgKiBAcGFyYW0gdHVybk9uIHtAY29kZSB0cnVlfSB0byB0dXJuIHRoZSByYWRpbyBvbiwge0Bjb2RlIGZhbHNlfQorICAgICAqIFRPRE86IGRvIGF3YXkgd2l0aCByZXR1cm4gdmFsdWUgYWZ0ZXIgbWFraW5nIE1vYmlsZURhdGFTdGF0ZVRyYWNrZXIgYXN5bmMKICAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgc2V0VG9ybkRvd25CeUNvbm5NZ3IoYm9vbGVhbiBmbGFnKSB7Ci0gICAgICAgIG1Ub3JuRG93bkJ5Q29ubk1nciA9IGZsYWc7Ci0gICAgICAgIHVwZGF0ZU5ldHdvcmtJbmZvKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJuIHRoZSBJUCBhZGRyZXNzZXMgb2YgdGhlIEROUyBzZXJ2ZXJzIGF2YWlsYWJsZSBmb3IgdGhlIFdMQU4KLSAgICAgKiBuZXR3b3JrIGludGVyZmFjZS4KLSAgICAgKiBAcmV0dXJuIGEgbGlzdCBvZiBETlMgYWRkcmVzc2VzLCB3aXRoIG5vIGhvbGVzLgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmdbXSBnZXROYW1lU2VydmVycygpIHsKLSAgICAgICAgcmV0dXJuIGdldE5hbWVTZXJ2ZXJMaXN0KHNEbnNQcm9wTmFtZXMpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybiB0aGUgbmFtZSBvZiBvdXIgV0xBTiBuZXR3b3JrIGludGVyZmFjZS4KLSAgICAgKiBAcmV0dXJuIHRoZSBuYW1lIG9mIG91ciBpbnRlcmZhY2UuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRJbnRlcmZhY2VOYW1lKCkgewotICAgICAgICByZXR1cm4gbUludGVyZmFjZU5hbWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJuIHRoZSBzeXN0ZW0gcHJvcGVydGllcyBuYW1lIGFzc29jaWF0ZWQgd2l0aCB0aGUgdGNwIGJ1ZmZlciBzaXplcwotICAgICAqIGZvciB0aGlzIG5ldHdvcmsuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRUY3BCdWZmZXJTaXplc1Byb3BOYW1lKCkgewotICAgICAgICByZXR1cm4gIm5ldC50Y3AuYnVmZmVyc2l6ZS53aWZpIjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzdGFydE1vbml0b3JpbmcoKSB7Ci0gICAgICAgIC8qCi0gICAgICAgICAqIEdldCBhIGhhbmRsZSBvbiB0aGUgV2lmaU1hbmFnZXIuIFRoaXMgY2Fubm90IGJlIGRvbmUgaW4gb3VyCi0gICAgICAgICAqIGNvbnN0cnVjdG9yLCBiZWNhdXNlIHRoZSBXaWZpIHNlcnZpY2UgaXMgbm90IHlldCByZWdpc3RlcmVkLgotICAgICAgICAgKi8KLSAgICAgICAgbVdNID0gKFdpZmlNYW5hZ2VyKW1Db250ZXh0LmdldFN5c3RlbVNlcnZpY2UoQ29udGV4dC5XSUZJX1NFUlZJQ0UpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHN0YXJ0RXZlbnRMb29wKCkgewotICAgICAgICBtV2lmaU1vbml0b3Iuc3RhcnRNb25pdG9yaW5nKCk7CisgICAgcHVibGljIGJvb2xlYW4gc2V0UmFkaW8oYm9vbGVhbiB0dXJuT24pIHsKKyAgICAgICAgbVdpZmlNYW5hZ2VyLnNldFdpZmlFbmFibGVkKHR1cm5Pbik7CisgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KIAogICAgIC8qKgpAQCAtNDcxLDIxNzIgKzEyOSwxMTggQEAKICAgICAgKiB1bmF2YWlsYWJsZS4KICAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiBXaS1GaSBjb25uZWN0aW9ucyBhcmUgcG9zc2libGUKICAgICAgKi8KLSAgICBwdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4gaXNBdmFpbGFibGUoKSB7Ci0gICAgICAgIC8qCi0gICAgICAgICAqIFRPRE86IE5lZWQgdG8gYWxzbyBsb29rIGF0IHNjYW4gcmVzdWx0cyB0byBzZWUgd2hldGhlciB3ZSdyZQotICAgICAgICAgKiBpbiByYW5nZSBvZiBhbnkgYWNjZXNzIHBvaW50cy4gSWYgd2UgaGF2ZSBzY2FuIHJlc3VsdHMgdGhhdAotICAgICAgICAgKiBhcmUgbm8gbW9yZSB0aGFuIE4gc2Vjb25kcyBvbGQsIHVzZSB0aG9zZSwgb3RoZXJ3aXNlLCBpbml0aWF0ZQotICAgICAgICAgKiBhIHNjYW4gYW5kIHdhaXQgZm9yIHRoZSByZXN1bHRzLiBUaGlzIG9ubHkgbWF0dGVycyBpZiB3ZQotICAgICAgICAgKiBhbGxvdyBtb2JpbGUgdG8gYmUgdGhlIHByZWZlcnJlZCBuZXR3b3JrLgotICAgICAgICAgKi8KLSAgICAgICAgU3VwcGxpY2FudFN0YXRlIHN1cHBTdGF0ZSA9IG1XaWZpSW5mby5nZXRTdXBwbGljYW50U3RhdGUoKTsKLSAgICAgICAgcmV0dXJuIHN1cHBTdGF0ZSAhPSBTdXBwbGljYW50U3RhdGUuVU5JTklUSUFMSVpFRCAmJgotICAgICAgICAgICAgICAgIHN1cHBTdGF0ZSAhPSBTdXBwbGljYW50U3RhdGUuSU5BQ1RJVkUgJiYKLSAgICAgICAgICAgICAgICAobVRvcm5Eb3duQnlDb25uTWdyIHx8ICFpc0RyaXZlclN0b3BwZWQoKSk7CisgICAgcHVibGljIGJvb2xlYW4gaXNBdmFpbGFibGUoKSB7CisgICAgICAgIHJldHVybiBtTmV0d29ya0luZm8uaXNBdmFpbGFibGUoKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICogVGhlcmUgYXJlIGN1cnJlbnRseSBubyBkZWZpbmVkIFdpLUZpIHN1YnR5cGVzLgotICAgICAqLwotICAgIHB1YmxpYyBpbnQgZ2V0TmV0d29ya1N1YnR5cGUoKSB7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEhlbHBlciBtZXRob2Q6IHVwZGF0ZXMgdGhlIG5ldHdvcmsgaW5mbyBvYmplY3QgdG8ga2VlcCBpdCBpbiBzeW5jIHdpdGgKLSAgICAgKiB0aGUgV2ktRmkgc3RhdGUgdHJhY2tlci4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgdXBkYXRlTmV0d29ya0luZm8oKSB7Ci0gICAgICAgIG1OZXR3b3JrSW5mby5zZXRJc0F2YWlsYWJsZShpc0F2YWlsYWJsZSgpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXBvcnQgd2hldGhlciB0aGUgV2ktRmkgY29ubmVjdGlvbiBpcyBmdWxseSBjb25maWd1cmVkIGZvciBkYXRhLgotICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoZSB7QGxpbmsgU3VwcGxpY2FudFN0YXRlfSBpcwotICAgICAqIHtAbGluayBhbmRyb2lkLm5ldC53aWZpLlN1cHBsaWNhbnRTdGF0ZSNDT01QTEVURUQgQ09NUExFVEVEfS4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0Nvbm5lY3Rpb25Db21wbGV0ZWQoKSB7Ci0gICAgICAgIHJldHVybiBtV2lmaUluZm8uZ2V0U3VwcGxpY2FudFN0YXRlKCkgPT0gU3VwcGxpY2FudFN0YXRlLkNPTVBMRVRFRDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXBvcnQgd2hldGhlciB0aGUgV2ktRmkgY29ubmVjdGlvbiBoYXMgc3VjY2Vzc2Z1bGx5IGFjcXVpcmVkIGFuIElQIGFkZHJlc3MuCi0gICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhlIFdpLUZpIGNvbm5lY3Rpb24gaGFzIGJlZW4gYXNzaWduZWQgYW4gSVAgYWRkcmVzcy4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBoYXNJcEFkZHJlc3MoKSB7Ci0gICAgICAgIHJldHVybiBtSGF2ZUlwQWRkcmVzczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZW5kIHRoZSB0cmFja2VyIGEgbm90aWZpY2F0aW9uIHRoYXQgYSB1c2VyLWVudGVyZWQgcGFzc3dvcmQga2V5Ci0gICAgICogbWF5IGJlIGluY29ycmVjdCAoaS5lLiwgY2F1c2VkIGF1dGhlbnRpY2F0aW9uIHRvIGZhaWwpLgotICAgICAqLwotICAgIHZvaWQgbm90aWZ5UGFzc3dvcmRLZXlNYXlCZUluY29ycmVjdCgpIHsKLSAgICAgICAgc2VuZEVtcHR5TWVzc2FnZShFVkVOVF9QQVNTV09SRF9LRVlfTUFZX0JFX0lOQ09SUkVDVCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2VuZCB0aGUgdHJhY2tlciBhIG5vdGlmaWNhdGlvbiB0aGF0IGEgY29ubmVjdGlvbiB0byB0aGUgc3VwcGxpY2FudAotICAgICAqIGRhZW1vbiBoYXMgYmVlbiBlc3RhYmxpc2hlZC4KLSAgICAgKi8KLSAgICB2b2lkIG5vdGlmeVN1cHBsaWNhbnRDb25uZWN0aW9uKCkgewotICAgICAgICBzZW5kRW1wdHlNZXNzYWdlKEVWRU5UX1NVUFBMSUNBTlRfQ09OTkVDVElPTik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2VuZCB0aGUgdHJhY2tlciBhIG5vdGlmaWNhdGlvbiB0aGF0IHRoZSBzdGF0ZSBvZiB0aGUgc3VwcGxpY2FudAotICAgICAqIGhhcyBjaGFuZ2VkLgotICAgICAqIEBwYXJhbSBuZXR3b3JrSWQgdGhlIGNvbmZpZ3VyZWQgbmV0d29yayBvbiB3aGljaCB0aGUgc3RhdGUgY2hhbmdlIG9jY3VycmVkCi0gICAgICogQHBhcmFtIG5ld1N0YXRlIHRoZSBuZXcge0Bjb2RlIFN1cHBsaWNhbnRTdGF0ZX0KLSAgICAgKi8KLSAgICB2b2lkIG5vdGlmeVN0YXRlQ2hhbmdlKGludCBuZXR3b3JrSWQsIFN0cmluZyBCU1NJRCwgU3VwcGxpY2FudFN0YXRlIG5ld1N0YXRlKSB7Ci0gICAgICAgIE1lc3NhZ2UgbXNnID0gTWVzc2FnZS5vYnRhaW4oCi0gICAgICAgICAgICB0aGlzLCBFVkVOVF9TVVBQTElDQU5UX1NUQVRFX0NIQU5HRUQsCi0gICAgICAgICAgICBuZXcgU3VwcGxpY2FudFN0YXRlQ2hhbmdlUmVzdWx0KG5ldHdvcmtJZCwgQlNTSUQsIG5ld1N0YXRlKSk7Ci0gICAgICAgIG1zZy5zZW5kVG9UYXJnZXQoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZW5kIHRoZSB0cmFja2VyIGEgbm90aWZpY2F0aW9uIHRoYXQgdGhlIHN0YXRlIG9mIFdpZmkgY29ubmVjdGl2aXR5Ci0gICAgICogaGFzIGNoYW5nZWQuCi0gICAgICogQHBhcmFtIG5ldHdvcmtJZCB0aGUgY29uZmlndXJlZCBuZXR3b3JrIG9uIHdoaWNoIHRoZSBzdGF0ZSBjaGFuZ2Ugb2NjdXJyZWQKLSAgICAgKiBAcGFyYW0gbmV3U3RhdGUgdGhlIG5ldyBuZXR3b3JrIHN0YXRlCi0gICAgICogQHBhcmFtIEJTU0lEIHdoZW4gdGhlIG5ldyBzdGF0ZSBpcyB7QGxpbmsgRGV0YWlsZWRTdGF0ZSNDT05ORUNURUQKLSAgICAgKiBOZXR3b3JrSW5mby5EZXRhaWxlZFN0YXRlLkNPTk5FQ1RFRH0sCi0gICAgICogdGhpcyBpcyB0aGUgTUFDIGFkZHJlc3Mgb2YgdGhlIGFjY2VzcyBwb2ludC4gT3RoZXJ3aXNlLCBpdAotICAgICAqIGlzIHtAY29kZSBudWxsfS4KLSAgICAgKi8KLSAgICB2b2lkIG5vdGlmeVN0YXRlQ2hhbmdlKERldGFpbGVkU3RhdGUgbmV3U3RhdGUsIFN0cmluZyBCU1NJRCwgaW50IG5ldHdvcmtJZCkgewotICAgICAgICBNZXNzYWdlIG1zZyA9IE1lc3NhZ2Uub2J0YWluKAotICAgICAgICAgICAgdGhpcywgRVZFTlRfTkVUV09SS19TVEFURV9DSEFOR0VELAotICAgICAgICAgICAgbmV3IE5ldHdvcmtTdGF0ZUNoYW5nZVJlc3VsdChuZXdTdGF0ZSwgQlNTSUQsIG5ldHdvcmtJZCkpOwotICAgICAgICBtc2cuc2VuZFRvVGFyZ2V0KCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2VuZCB0aGUgdHJhY2tlciBhIG5vdGlmaWNhdGlvbiB0aGF0IGEgc2NhbiBoYXMgY29tcGxldGVkLCBhbmQgcmVzdWx0cwotICAgICAqIGFyZSBhdmFpbGFibGUuCi0gICAgICovCi0gICAgdm9pZCBub3RpZnlTY2FuUmVzdWx0c0F2YWlsYWJsZSgpIHsKLSAgICAgICAgLy8gcmVzZXQgdGhlIHN1cHBsaWNhbnQncyBoYW5kbGluZyBvZiBzY2FuIHJlc3VsdHMgdG8gIm5vcm1hbCIgbW9kZQotICAgICAgICBzZXRTY2FuUmVzdWx0SGFuZGxpbmcoU1VQUExfU0NBTl9IQU5ETElOR19OT1JNQUwpOwotICAgICAgICBzZW5kRW1wdHlNZXNzYWdlKEVWRU5UX1NDQU5fUkVTVUxUU19BVkFJTEFCTEUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNlbmQgdGhlIHRyYWNrZXIgYSBub3RpZmljYXRpb24gdGhhdCB3ZSBjYW4gbm8gbG9uZ2VyIGNvbW11bmljYXRlIHdpdGgKLSAgICAgKiB0aGUgc3VwcGxpY2FudCBkYWVtb24uCi0gICAgICovCi0gICAgdm9pZCBub3RpZnlTdXBwbGljYW50TG9zdCgpIHsKLSAgICAgICAgc2VuZEVtcHR5TWVzc2FnZShFVkVOVF9TVVBQTElDQU5UX0RJU0NPTk5FQ1QpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNlbmQgdGhlIHRyYWNrZXIgYSBub3RpZmljYXRpb24gdGhhdCB0aGUgV2ktRmkgZHJpdmVyIGhhcyBiZWVuIHN0b3BwZWQuCi0gICAgICovCi0gICAgdm9pZCBub3RpZnlEcml2ZXJTdG9wcGVkKCkgewotICAgICAgICBtUnVuU3RhdGUgPSBSVU5fU1RBVEVfU1RPUFBFRDsKLQotICAgICAgICAvLyBTZW5kIGEgZHJpdmVyIHN0b3BwZWQgbWVzc2FnZSB0byBvdXIgaGFuZGxlcgotICAgICAgICBNZXNzYWdlLm9idGFpbih0aGlzLCBFVkVOVF9EUklWRVJfU1RBVEVfQ0hBTkdFRCwgRFJJVkVSX1NUT1BQRUQsIDApLnNlbmRUb1RhcmdldCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNlbmQgdGhlIHRyYWNrZXIgYSBub3RpZmljYXRpb24gdGhhdCB0aGUgV2ktRmkgZHJpdmVyIGhhcyBiZWVuIHJlc3RhcnRlZCBhZnRlcgotICAgICAqIGhhdmluZyBiZWVuIHN0b3BwZWQuCi0gICAgICovCi0gICAgdm9pZCBub3RpZnlEcml2ZXJTdGFydGVkKCkgewotICAgICAgICAvLyBTZW5kIGEgZHJpdmVyIHN0YXJ0ZWQgbWVzc2FnZSB0byBvdXIgaGFuZGxlcgotICAgICAgICBNZXNzYWdlLm9idGFpbih0aGlzLCBFVkVOVF9EUklWRVJfU1RBVEVfQ0hBTkdFRCwgRFJJVkVSX1NUQVJURUQsIDApLnNlbmRUb1RhcmdldCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNlbmQgdGhlIHRyYWNrZXIgYSBub3RpZmljYXRpb24gdGhhdCB0aGUgV2ktRmkgZHJpdmVyIGhhcyBodW5nIGFuZCBuZWVkcyByZXN0YXJ0aW5nLgotICAgICAqLwotICAgIHZvaWQgbm90aWZ5RHJpdmVySHVuZygpIHsKLSAgICAgICAgLy8gU2VuZCBhIGRyaXZlciBoYW5nZWQgbWVzc2FnZSB0byBvdXIgaGFuZGxlcgotICAgICAgICBNZXNzYWdlLm9idGFpbih0aGlzLCBFVkVOVF9EUklWRVJfU1RBVEVfQ0hBTkdFRCwgRFJJVkVSX0hVTkcsIDApLnNlbmRUb1RhcmdldCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldCB0aGUgaW50ZXJ2YWwgdGltZXIgZm9yIHBvbGxpbmcgY29ubmVjdGlvbiBpbmZvcm1hdGlvbgotICAgICAqIHRoYXQgaXMgbm90IGRlbGl2ZXJlZCBhc3luY2hyb25vdXNseS4KLSAgICAgKi8KLSAgICBwcml2YXRlIHN5bmNocm9uaXplZCB2b2lkIGNoZWNrUG9sbFRpbWVyKCkgewotICAgICAgICBpZiAobUVuYWJsZVJzc2lQb2xsaW5nICYmCi0gICAgICAgICAgICAgICAgbVdpZmlJbmZvLmdldFN1cHBsaWNhbnRTdGF0ZSgpID09IFN1cHBsaWNhbnRTdGF0ZS5DT01QTEVURUQgJiYKLSAgICAgICAgICAgICAgICAhaGFzTWVzc2FnZXMoRVZFTlRfUE9MTF9JTlRFUlZBTCkpIHsKLSAgICAgICAgICAgIHNlbmRFbXB0eU1lc3NhZ2VEZWxheWVkKEVWRU5UX1BPTExfSU5URVJWQUwsIFBPTExfU1RBVFVTX0lOVEVSVkFMX01TRUNTKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRPRE86IG1SdW5TdGF0ZSBpcyBub3Qgc3luY2hyb25pemVkIGluIHNvbWUgcGxhY2VzCi0gICAgICogYWRkcmVzcyB0aGlzIGFzIHBhcnQgb2YgcmUtYXJjaGl0ZWN0LgotICAgICAqCi0gICAgICogVE9ETzogV2UgYXJlIGV4cG9zaW5nIGFuIGFkZGl0aW9uYWwgcHVibGljIHN5bmNocm9uaXplZCBjYWxsCi0gICAgICogZm9yIGEgd2FrZWxvY2sgb3B0aW1pemF0aW9uIGluIFdpZmlTZXJ2aWNlLiBSZW1vdmUgaXQKLSAgICAgKiB3aGVuIHdlIGhhbmRsZSB0aGUgd2FrZWxvY2sgaW4gQ29ubmVjdGl2aXR5U2VydmljZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4gaXNEcml2ZXJTdG9wcGVkKCkgewotICAgICAgICByZXR1cm4gbVJ1blN0YXRlID09IFJVTl9TVEFURV9TVE9QUEVEIHx8IG1SdW5TdGF0ZSA9PSBSVU5fU1RBVEVfU1RPUFBJTkc7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIG5vdGVSdW5TdGF0ZSgpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGlmIChtUnVuU3RhdGUgPT0gUlVOX1NUQVRFX1JVTk5JTkcpIHsKLSAgICAgICAgICAgICAgICBtQmF0dGVyeVN0YXRzLm5vdGVXaWZpUnVubmluZygpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChtUnVuU3RhdGUgPT0gUlVOX1NUQVRFX1NUT1BQRUQpIHsKLSAgICAgICAgICAgICAgICBtQmF0dGVyeVN0YXRzLm5vdGVXaWZpU3RvcHBlZCgpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gaWdub3JlKSB7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXQgdGhlIHJ1biBzdGF0ZSB0byBlaXRoZXIgIm5vcm1hbCIgb3IgInNjYW4tb25seSIuCi0gICAgICogQHBhcmFtIHNjYW5Pbmx5TW9kZSB0cnVlIGlmIHRoZSBuZXcgbW9kZSBzaG91bGQgYmUgc2Nhbi1vbmx5LgotICAgICAqLwotICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBzZXRTY2FuT25seU1vZGUoYm9vbGVhbiBzY2FuT25seU1vZGUpIHsKLSAgICAgICAgLy8gZG8gbm90aGluZyB1bmxlc3Mgc2Nhbi1vbmx5IG1vZGUgaXMgY2hhbmdpbmcKLSAgICAgICAgaWYgKG1Jc1NjYW5Pbmx5ICE9IHNjYW5Pbmx5TW9kZSkgewotICAgICAgICAgICAgaW50IHNjYW5UeXBlID0gKHNjYW5Pbmx5TW9kZSA/Ci0gICAgICAgICAgICAgICAgICAgIFNVUFBMX1NDQU5fSEFORExJTkdfTElTVF9PTkxZIDogU1VQUExfU0NBTl9IQU5ETElOR19OT1JNQUwpOwotICAgICAgICAgICAgaWYgKExPQ0FMX0xPR0QpIExvZy52KFRBRywgIlNjYW4tb25seSBtb2RlIGNoYW5naW5nIHRvICIgKyBzY2FuT25seU1vZGUgKyAiIHNjYW5UeXBlPSIgKyBzY2FuVHlwZSk7Ci0gICAgICAgICAgICBpZiAoc2V0U2NhblJlc3VsdEhhbmRsaW5nKHNjYW5UeXBlKSkgewotICAgICAgICAgICAgICAgIG1Jc1NjYW5Pbmx5ID0gc2Nhbk9ubHlNb2RlOwotICAgICAgICAgICAgICAgIGlmICghaXNEcml2ZXJTdG9wcGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHNjYW5Pbmx5TW9kZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgZGlzY29ubmVjdCgpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgcmVjb25uZWN0Q29tbWFuZCgpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0IHN1c3BlbmQgbW9kZSBvcHRpbWl6YXRpb25zLiBUaGVzZSBpbmNsdWRlOgotICAgICAqIC0gcGFja2V0IGZpbHRlcmluZwotICAgICAqIC0gdHVybiBvZmYgcm9hbWluZwotICAgICAqIC0gRFRJTSBzZXR0aW5ncwotICAgICAqCi0gICAgICogVXNlcyByZWZlcmVuY2UgY291bnRpbmcgdG8ga2VlcCB0aGUgc3VzcGVuZCBvcHRpbWl6YXRpb25zIGRpc2FibGVkCi0gICAgICogYXMgbG9uZyBhcyBvbmUgZW50aXR5IHdhbnRzIG9wdGltaXphdGlvbnMgZGlzYWJsZWQuCi0gICAgICoKLSAgICAgKiBGb3IgZXhhbXBsZSwgV2lmaUxvY2sgY2FuIGtlZXAgc3VzcGVuZCBvcHRpbWl6YXRpb25zIGRpc2FibGVkCi0gICAgICogb3IgdGhlIHVzZXIgc2V0dGluZyAod2lmaSBuZXZlciBzbGVlcHMpIGNhbiBrZWVwIHN1c3BlbmQgb3B0aW1pemF0aW9ucwotICAgICAqIGRpc2FibGVkLiBBcyBsb25nIGFzIG9uZSBlbnRpdHkgd2FudHMgaXQgZGlzYWJsZWQsIGl0IHNob3VsZCBzdGF5Ci0gICAgICogdGhhdCB3YXkKLSAgICAgKgotICAgICAqIEBwYXJhbSBlbmFibGVkIHRydWUgaWYgb3B0aW1pemF0aW9ucyBuZWVkIGVuYWJsZWQsIGZhbHNlIG90aGVyd2lzZQotICAgICAqLwotICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBzZXRTdXNwZW5kTW9kZU9wdGltaXphdGlvbnMoYm9vbGVhbiBlbmFibGVkKSB7Ci0KLSAgICAgICAgLyogSXQgaXMgZ29vZCB0byBwbHVtYiBzdXNwZW5kIG9wdGltaXphdGlvbiBlbmFibGUKLSAgICAgICAgICogb3IgZGlzYWJsZSBldmVuIGlmIHJlZiBjb3VudCBpbmRpY2F0ZXMgYWxyZWFkeSBkb25lCi0gICAgICAgICAqIHNpbmNlIHdlIGNvdWxkIGhhdmUgYSBjYXNlIG9mIHByZXZpb3VzIGZhaWx1cmUuCi0gICAgICAgICAqLwotICAgICAgICBpZiAoIWVuYWJsZWQpIHsKLSAgICAgICAgICAgIG1PcHRpbWl6YXRpb25zRGlzYWJsZWRSZWZDb3VudCsrOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbU9wdGltaXphdGlvbnNEaXNhYmxlZFJlZkNvdW50LS07Ci0gICAgICAgICAgICBpZiAobU9wdGltaXphdGlvbnNEaXNhYmxlZFJlZkNvdW50ID4gMCkgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgLyogS2VlcCByZWZjb3VudCBmcm9tIGJlY29taW5nIG5lZ2F0aXZlICovCi0gICAgICAgICAgICAgICAgbU9wdGltaXphdGlvbnNEaXNhYmxlZFJlZkNvdW50ID0gMDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtV2lmaVN0YXRlLmdldCgpICE9IFdJRklfU1RBVEVfRU5BQkxFRCB8fCBpc0RyaXZlclN0b3BwZWQoKSkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgV2lmaU5hdGl2ZS5zZXRTdXNwZW5kT3B0aW1pemF0aW9uc0NvbW1hbmQoZW5hYmxlZCk7Ci0gICAgfQotCi0KLSAgICAvKioKLSAgICAgKiBTZXQgaGlnaCBwZXJmb3JtYW5jZSBtb2RlIG9mIG9wZXJhdGlvbi4gVGhpcyB3b3VsZCBtZWFuCi0gICAgICogdXNlIGFjdGl2ZSBwb3dlciBtb2RlIGFuZCBkaXNhYmxlIHN1c3BlbmQgb3B0aW1pemF0aW9ucwotICAgICAqIEBwYXJhbSBlbmFibGVkIHRydWUgaWYgZW5hYmxlZCwgZmFsc2Ugb3RoZXJ3aXNlCi0gICAgICovCi0gICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHNldEhpZ2hQZXJmTW9kZShib29sZWFuIGVuYWJsZWQpIHsKLSAgICAgICAgaWYgKG1Jc0hpZ2hQZXJmRW5hYmxlZCAhPSBlbmFibGVkKSB7Ci0gICAgICAgICAgICBpZiAoZW5hYmxlZCkgewotICAgICAgICAgICAgICAgIHNldFBvd2VyTW9kZShEUklWRVJfUE9XRVJfTU9ERV9BQ1RJVkUpOwotICAgICAgICAgICAgICAgIHNldFN1c3BlbmRNb2RlT3B0aW1pemF0aW9ucyhmYWxzZSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHNldFBvd2VyTW9kZShEUklWRVJfUE9XRVJfTU9ERV9BVVRPKTsKLSAgICAgICAgICAgICAgICBzZXRTdXNwZW5kTW9kZU9wdGltaXphdGlvbnModHJ1ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtSXNIaWdoUGVyZkVuYWJsZWQgPSBlbmFibGVkOwotICAgICAgICAgICAgTG9nLmQoVEFHLCJoaWdoIHBlcmZvcm1hbmNlIG1vZGU6ICIgKyBlbmFibGVkKTsKLSAgICAgICAgfQotICAgIH0KLQotCi0gICAgcHJpdmF0ZSB2b2lkIGNoZWNrSXNCbHVldG9vdGhQbGF5aW5nKCkgewotICAgICAgICBib29sZWFuIGlzQmx1ZXRvb3RoUGxheWluZyA9IGZhbHNlOwotICAgICAgICBTZXQ8Qmx1ZXRvb3RoRGV2aWNlPiBjb25uZWN0ZWQgPSBtQmx1ZXRvb3RoQTJkcC5nZXRDb25uZWN0ZWRTaW5rcygpOwotCi0gICAgICAgIGZvciAoQmx1ZXRvb3RoRGV2aWNlIGRldmljZSA6IGNvbm5lY3RlZCkgewotICAgICAgICAgICAgaWYgKG1CbHVldG9vdGhBMmRwLmdldFNpbmtTdGF0ZShkZXZpY2UpID09IEJsdWV0b290aEEyZHAuU1RBVEVfUExBWUlORykgewotICAgICAgICAgICAgICAgIGlzQmx1ZXRvb3RoUGxheWluZyA9IHRydWU7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgc2V0Qmx1ZXRvb3RoU2Nhbk1vZGUoaXNCbHVldG9vdGhQbGF5aW5nKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBlbmFibGVSc3NpUG9sbGluZyhib29sZWFuIGVuYWJsZSkgewotICAgICAgICBpZiAobUVuYWJsZVJzc2lQb2xsaW5nICE9IGVuYWJsZSkgewotICAgICAgICAgICAgbUVuYWJsZVJzc2lQb2xsaW5nID0gZW5hYmxlOwotICAgICAgICAgICAgY2hlY2tQb2xsVGltZXIoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFdlIHJlbGVhc2UgdGhlIHdha2Vsb2NrIGluIFdpZmlTZXJ2aWNlCi0gICAgICogdXNpbmcgYSB0aW1lci4KLSAgICAgKgotICAgICAqIFRPRE86Ci0gICAgICogUmVsZWFzaW5nIHdha2Vsb2NrIHVzaW5nIGJvdGggdGltZXIgYW5kCi0gICAgICogYSBjYWxsIGZyb20gQ29ubmVjdGl2aXR5U2VydmljZSByZXF1aXJlcwotICAgICAqIGEgcmV0aGluay4gV2UgaGFkIHByb2JsZW1zIHdoZXJlIFdpZmlTZXJ2aWNlCi0gICAgICogY291bGQga2VlcCBhIHdha2Vsb2NrIGZvcmV2ZXIgaWYgd2UgZGVsZXRlCi0gICAgICogbWVzc2FnZXMgaW4gdGhlIGFzeW5jaHJvbm91cyBjYWxsCi0gICAgICogZnJvbSBDb25uZWN0aXZpdHlTZXJ2aWNlCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgcmVsZWFzZVdha2VMb2NrKCkgewotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRyYWNrcyB0aGUgV1BBIHN1cHBsaWNhbnQgc3RhdGVzIHRvIGRldGVjdCAibG9vcCIgc2l0dWF0aW9ucy4KLSAgICAgKiBAcGFyYW0gbmV3U3VwcGxpY2FudFN0YXRlIFRoZSBuZXcgV1BBIHN1cHBsaWNhbnQgc3RhdGUuCi0gICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhlIHN1cHBsaWNhbnQgbG9vcCBzaG91bGQgYmUgc3RvcHBlZAotICAgICAqIGFuZCB7QGNvZGUgZmFsc2V9IGlmIGl0IHNob3VsZCBjb250aW51ZS4KLSAgICAgKi8KLSAgICBwcml2YXRlIGJvb2xlYW4gaXNTdXBwbGljYW50TG9vcGluZyhTdXBwbGljYW50U3RhdGUgbmV3U3VwcGxpY2FudFN0YXRlKSB7Ci0gICAgICAgIGlmIChTdXBwbGljYW50U3RhdGUuQVNTT0NJQVRJTkcub3JkaW5hbCgpIDw9IG5ld1N1cHBsaWNhbnRTdGF0ZS5vcmRpbmFsKCkKLSAgICAgICAgICAgICYmIG5ld1N1cHBsaWNhbnRTdGF0ZS5vcmRpbmFsKCkgPCBTdXBwbGljYW50U3RhdGUuQ09NUExFVEVELm9yZGluYWwoKSkgewotICAgICAgICAgICAgaWYgKG1TdXBwbGljYW50TG9vcFN0YXRlICE9IG5ld1N1cHBsaWNhbnRTdGF0ZSkgewotICAgICAgICAgICAgICAgIGlmIChuZXdTdXBwbGljYW50U3RhdGUub3JkaW5hbCgpIDwgbVN1cHBsaWNhbnRMb29wU3RhdGUub3JkaW5hbCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICsrbU51bVN1cHBsaWNhbnRMb29wSXRlcmF0aW9uczsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBtU3VwcGxpY2FudExvb3BTdGF0ZSA9IG5ld1N1cHBsaWNhbnRTdGF0ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmIChuZXdTdXBwbGljYW50U3RhdGUgPT0gU3VwcGxpY2FudFN0YXRlLkNPTVBMRVRFRCkgewotICAgICAgICAgICAgcmVzZXRTdXBwbGljYW50TG9vcFN0YXRlKCk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gbU51bVN1cHBsaWNhbnRMb29wSXRlcmF0aW9ucyA+PSBNQVhfU1VQUExJQ0FOVF9MT09QX0lURVJBVElPTlM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVzZXRzIHRoZSBXUEEgc3VwcGxpY2FudCBsb29wIHN0YXRlLgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCByZXNldFN1cHBsaWNhbnRMb29wU3RhdGUoKSB7Ci0gICAgICAgIG1OdW1TdXBwbGljYW50TG9vcEl0ZXJhdGlvbnMgPSAwOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGhhbmRsZU1lc3NhZ2UoTWVzc2FnZSBtc2cpIHsKLSAgICAgICAgSW50ZW50IGludGVudDsKLQotICAgICAgICBzd2l0Y2ggKG1zZy53aGF0KSB7Ci0gICAgICAgICAgICBjYXNlIEVWRU5UX1NVUFBMSUNBTlRfQ09OTkVDVElPTjoKLSAgICAgICAgICAgICAgICBtUnVuU3RhdGUgPSBSVU5fU1RBVEVfUlVOTklORzsKLSAgICAgICAgICAgICAgICBub3RlUnVuU3RhdGUoKTsKLSAgICAgICAgICAgICAgICBjaGVja1VzZVN0YXRpY0lwKCk7Ci0gICAgICAgICAgICAgICAgLyogUmVzZXQgbm90aWZpY2F0aW9uIHN0YXRlIG9uIG5ldyBjb25uZWN0aW9uICovCi0gICAgICAgICAgICAgICAgcmVzZXROb3RpZmljYXRpb25UaW1lcigpOwotICAgICAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgICAgICogREhDUCByZXF1ZXN0cyBhcmUgYmxvY2tpbmcsIHNvIHJ1biB0aGVtIGluIGEgc2VwYXJhdGUgdGhyZWFkLgotICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgIEhhbmRsZXJUaHJlYWQgZGhjcFRocmVhZCA9IG5ldyBIYW5kbGVyVGhyZWFkKCJESENQIEhhbmRsZXIgVGhyZWFkIik7Ci0gICAgICAgICAgICAgICAgZGhjcFRocmVhZC5zdGFydCgpOwotICAgICAgICAgICAgICAgIG1EaGNwVGFyZ2V0ID0gbmV3IERoY3BIYW5kbGVyKGRoY3BUaHJlYWQuZ2V0TG9vcGVyKCksIHRoaXMpOwotICAgICAgICAgICAgICAgIG1Jc1NjYW5Nb2RlQWN0aXZlID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBtSXNIaWdoUGVyZkVuYWJsZWQgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICBtT3B0aW1pemF0aW9uc0Rpc2FibGVkUmVmQ291bnQgPSAwOwotICAgICAgICAgICAgICAgIG1Qb3dlck1vZGVSZWZDb3VudCA9IDA7Ci0gICAgICAgICAgICAgICAgbVRvcm5Eb3duQnlDb25uTWdyID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgbUxhc3RCc3NpZCA9IG51bGw7Ci0gICAgICAgICAgICAgICAgbUxhc3RTc2lkID0gbnVsbDsKLSAgICAgICAgICAgICAgICBtSXNBbnlOZXR3b3JrRGlzYWJsZWQuc2V0KGZhbHNlKTsKLSAgICAgICAgICAgICAgICByZXF1ZXN0Q29ubmVjdGlvbkluZm8oKTsKLSAgICAgICAgICAgICAgICBTdXBwbGljYW50U3RhdGUgc3VwcGxTdGF0ZSA9IG1XaWZpSW5mby5nZXRTdXBwbGljYW50U3RhdGUoKTsKLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgKiBUaGUgTUFDIGFkZHJlc3MgaXNuJ3QgZ29pbmcgdG8gY2hhbmdlLCBzbyBqdXN0IHJlcXVlc3QgaXQKLSAgICAgICAgICAgICAgICAgKiBvbmNlIGhlcmUuCi0gICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgU3RyaW5nIG1hY2FkZHIgPSBnZXRNYWNBZGRyZXNzKCk7Ci0KLSAgICAgICAgICAgICAgICBpZiAobWFjYWRkciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1XaWZpSW5mby5zZXRNYWNBZGRyZXNzKG1hY2FkZHIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoTE9DQUxfTE9HRCkgTG9nLnYoVEFHLCAiQ29ubmVjdGlvbiB0byBzdXBwbGljYW50IGVzdGFibGlzaGVkLCBzdGF0ZT0iICsKLSAgICAgICAgICAgICAgICAgICAgc3VwcGxTdGF0ZSk7Ci0gICAgICAgICAgICAgICAgLy8gV2ktRmkgc3VwcGxpY2FudCBjb25uZWN0aW9uIHN0YXRlIGNoYW5nZWQ6Ci0gICAgICAgICAgICAgICAgLy8gWzMxLSAyXSBSZXNlcnZlZCBmb3IgZnV0dXJlIHVzZQotICAgICAgICAgICAgICAgIC8vIFsgMS0gMF0gQ29ubmVjdGVkIHRvIHN1cHBsaWNhbnQgKDEpLCBkaXNjb25uZWN0ZWQgZnJvbSBzdXBwbGljYW50ICgwKSAsCi0gICAgICAgICAgICAgICAgLy8gICAgICAgICBvciBzdXBwbGljYW50IGRpZWQgKDIpCi0gICAgICAgICAgICAgICAgRXZlbnRMb2cud3JpdGVFdmVudChFVkVOVExPR19TVVBQTElDQU5UX0NPTk5FQ1RJT05fU1RBVEVfQ0hBTkdFRCwgMSk7Ci0gICAgICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAgICAgKiBUaGUgQ09NUExFVEVEIHN0YXRlIGNoYW5nZSBmcm9tIHRoZSBzdXBwbGljYW50IG1heSBoYXZlIG9jY3VycmVkCi0gICAgICAgICAgICAgICAgICogaW4gYmV0d2VlbiBwb2xsaW5nIGZvciBzdXBwbGljYW50IGF2YWlsYWJpbGl0eSwgaW4gd2hpY2ggY2FzZQotICAgICAgICAgICAgICAgICAqIHdlIGRpZG4ndCBwZXJmb3JtIGEgREhDUCByZXF1ZXN0IHRvIGdldCBhbiBJUCBhZGRyZXNzLgotICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgIGlmIChzdXBwbFN0YXRlID09IFN1cHBsaWNhbnRTdGF0ZS5DT01QTEVURUQpIHsKLSAgICAgICAgICAgICAgICAgICAgbUxhc3RCc3NpZCA9IG1XaWZpSW5mby5nZXRCU1NJRCgpOwotICAgICAgICAgICAgICAgICAgICBtTGFzdFNzaWQgPSBtV2lmaUluZm8uZ2V0U1NJRCgpOwotICAgICAgICAgICAgICAgICAgICBjb25maWd1cmVJbnRlcmZhY2UoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKEFjdGl2aXR5TWFuYWdlck5hdGl2ZS5pc1N5c3RlbVJlYWR5KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgaW50ZW50ID0gbmV3IEludGVudChXaWZpTWFuYWdlci5TVVBQTElDQU5UX0NPTk5FQ1RJT05fQ0hBTkdFX0FDVElPTik7Ci0gICAgICAgICAgICAgICAgICAgIGludGVudC5wdXRFeHRyYShXaWZpTWFuYWdlci5FWFRSQV9TVVBQTElDQU5UX0NPTk5FQ1RFRCwgdHJ1ZSk7Ci0gICAgICAgICAgICAgICAgICAgIG1Db250ZXh0LnNlbmRCcm9hZGNhc3QoaW50ZW50KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKHN1cHBsU3RhdGUgPT0gU3VwcGxpY2FudFN0YXRlLkNPTVBMRVRFRCAmJiBtSGF2ZUlwQWRkcmVzcykgewotICAgICAgICAgICAgICAgICAgICBzZXREZXRhaWxlZFN0YXRlKERldGFpbGVkU3RhdGUuQ09OTkVDVEVEKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBzZXREZXRhaWxlZFN0YXRlKFdpZmlJbmZvLmdldERldGFpbGVkU3RhdGVPZihzdXBwbFN0YXRlKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgICAgICogRmlsdGVyIG91dCBtdWx0aWNhc3QgcGFja2V0cy4gVGhpcyBzYXZlcyBiYXR0ZXJ5IHBvd2VyLCBzaW5jZQotICAgICAgICAgICAgICAgICAqIHRoZSBDUFUgZG9lc24ndCBoYXZlIHRvIHNwZW5kIHRpbWUgcHJvY2Vzc2luZyBwYWNrZXRzIHRoYXQKLSAgICAgICAgICAgICAgICAgKiBhcmUgZ29pbmcgdG8gZW5kIHVwIGJlaW5nIHRocm93biBhd2F5LgotICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgIG1XTS5pbml0aWFsaXplTXVsdGljYXN0RmlsdGVyaW5nKCk7Ci0KLSAgICAgICAgICAgICAgICBpZiAobUJsdWV0b290aEEyZHAgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBtQmx1ZXRvb3RoQTJkcCA9IG5ldyBCbHVldG9vdGhBMmRwKG1Db250ZXh0KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY2hlY2tJc0JsdWV0b290aFBsYXlpbmcoKTsKLQotICAgICAgICAgICAgICAgIC8vIGluaXRpYWxpemUgdGhpcyBhZnRlciB0aGUgc3VwcGxpY2FudCBpcyBhbGl2ZQotICAgICAgICAgICAgICAgIHNldE51bUFsbG93ZWRDaGFubmVscygpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIEVWRU5UX1NVUFBMSUNBTlRfRElTQ09OTkVDVDoKLSAgICAgICAgICAgICAgICBtUnVuU3RhdGUgPSBSVU5fU1RBVEVfU1RPUFBFRDsKLSAgICAgICAgICAgICAgICBub3RlUnVuU3RhdGUoKTsKLSAgICAgICAgICAgICAgICBib29sZWFuIGRpZWQgPSBtV2lmaVN0YXRlLmdldCgpICE9IFdJRklfU1RBVEVfRElTQUJMRUQgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtV2lmaVN0YXRlLmdldCgpICE9IFdJRklfU1RBVEVfRElTQUJMSU5HOwotICAgICAgICAgICAgICAgIGlmIChkaWVkKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChMT0NBTF9MT0dEKSBMb2cudihUQUcsICJTdXBwbGljYW50IGRpZWQgdW5leHBlY3RlZGx5Iik7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKExPQ0FMX0xPR0QpIExvZy52KFRBRywgIkNvbm5lY3Rpb24gdG8gc3VwcGxpY2FudCBsb3N0Iik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIC8vIFdpLUZpIHN1cHBsaWNhbnQgY29ubmVjdGlvbiBzdGF0ZSBjaGFuZ2VkOgotICAgICAgICAgICAgICAgIC8vIFszMS0gMl0gUmVzZXJ2ZWQgZm9yIGZ1dHVyZSB1c2UKLSAgICAgICAgICAgICAgICAvLyBbIDEtIDBdIENvbm5lY3RlZCB0byBzdXBwbGljYW50ICgxKSwgZGlzY29ubmVjdGVkIGZyb20gc3VwcGxpY2FudCAoMCkgLAotICAgICAgICAgICAgICAgIC8vICAgICAgICAgb3Igc3VwcGxpY2FudCBkaWVkICgyKQotICAgICAgICAgICAgICAgIEV2ZW50TG9nLndyaXRlRXZlbnQoRVZFTlRMT0dfU1VQUExJQ0FOVF9DT05ORUNUSU9OX1NUQVRFX0NIQU5HRUQsIGRpZWQgPyAyIDogMCk7Ci0gICAgICAgICAgICAgICAgY2xvc2VTdXBwbGljYW50Q29ubmVjdGlvbigpOwotCi0gICAgICAgICAgICAgICAgaWYgKGRpZWQpIHsKLSAgICAgICAgICAgICAgICAgICAgcmVzZXRDb25uZWN0aW9ucyh0cnVlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgLy8gV2hlbiBzdXBwbGljYW50IGRpZXMsIGtpbGwgdGhlIERIQ1AgdGhyZWFkCi0gICAgICAgICAgICAgICAgaWYgKG1EaGNwVGFyZ2V0ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgbURoY3BUYXJnZXQuZ2V0TG9vcGVyKCkucXVpdCgpOwotICAgICAgICAgICAgICAgICAgICBtRGhjcFRhcmdldCA9IG51bGw7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG1Db250ZXh0LnJlbW92ZVN0aWNreUJyb2FkY2FzdChuZXcgSW50ZW50KFdpZmlNYW5hZ2VyLk5FVFdPUktfU1RBVEVfQ0hBTkdFRF9BQ1RJT04pKTsKLSAgICAgICAgICAgICAgICBpZiAoQWN0aXZpdHlNYW5hZ2VyTmF0aXZlLmlzU3lzdGVtUmVhZHkoKSkgewotICAgICAgICAgICAgICAgICAgICBpbnRlbnQgPSBuZXcgSW50ZW50KFdpZmlNYW5hZ2VyLlNVUFBMSUNBTlRfQ09OTkVDVElPTl9DSEFOR0VfQUNUSU9OKTsKLSAgICAgICAgICAgICAgICAgICAgaW50ZW50LnB1dEV4dHJhKFdpZmlNYW5hZ2VyLkVYVFJBX1NVUFBMSUNBTlRfQ09OTkVDVEVELCBmYWxzZSk7Ci0gICAgICAgICAgICAgICAgICAgIG1Db250ZXh0LnNlbmRCcm9hZGNhc3QoaW50ZW50KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgc2V0RGV0YWlsZWRTdGF0ZShEZXRhaWxlZFN0YXRlLkRJU0NPTk5FQ1RFRCk7Ci0gICAgICAgICAgICAgICAgc2V0U3VwcGxpY2FudFN0YXRlKFN1cHBsaWNhbnRTdGF0ZS5VTklOSVRJQUxJWkVEKTsKLSAgICAgICAgICAgICAgICBtSGF2ZUlwQWRkcmVzcyA9IGZhbHNlOwotICAgICAgICAgICAgICAgIG1PYnRhaW5pbmdJcEFkZHJlc3MgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICBpZiAoZGllZCkgewotICAgICAgICAgICAgICAgICAgICBtV00uc2V0V2lmaUVuYWJsZWQoZmFsc2UpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBFVkVOVF9NQVlCRV9TVEFSVF9TQ0FOX1BPU1RfRElTQ09OTkVDVDoKLSAgICAgICAgICAgICAgICAvLyBPbmx5IGRvIHRoaXMgaWYgd2UgaGF2ZW4ndCBnb3R0ZW4gYSBuZXcgc3VwcGxpY2FudCBzdGF0dXMgc2luY2UgdGhlIHRpbWVyCi0gICAgICAgICAgICAgICAgLy8gc3RhcnRlZAotICAgICAgICAgICAgICAgIGlmIChtTnVtU3VwcGxpY2FudFN0YXRlQ2hhbmdlcyA9PSBtc2cuYXJnMSkgewotICAgICAgICAgICAgICAgICAgICBzY2FuKGZhbHNlKTsgLy8gZG8gYSBwYXNzaXZlIHNjYW4KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgRVZFTlRfU1VQUExJQ0FOVF9TVEFURV9DSEFOR0VEOgotICAgICAgICAgICAgICAgIG1OdW1TdXBwbGljYW50U3RhdGVDaGFuZ2VzKys7Ci0gICAgICAgICAgICAgICAgU3VwcGxpY2FudFN0YXRlQ2hhbmdlUmVzdWx0IHN1cHBsaWNhbnRTdGF0ZVJlc3VsdCA9Ci0gICAgICAgICAgICAgICAgICAgIChTdXBwbGljYW50U3RhdGVDaGFuZ2VSZXN1bHQpIG1zZy5vYmo7Ci0gICAgICAgICAgICAgICAgU3VwcGxpY2FudFN0YXRlIG5ld1N0YXRlID0gc3VwcGxpY2FudFN0YXRlUmVzdWx0LnN0YXRlOwotICAgICAgICAgICAgICAgIFN1cHBsaWNhbnRTdGF0ZSBjdXJyZW50U3RhdGUgPSBtV2lmaUluZm8uZ2V0U3VwcGxpY2FudFN0YXRlKCk7Ci0KLSAgICAgICAgICAgICAgICAvLyBXaS1GaSBzdXBwbGljYW50IHN0YXRlIGNoYW5nZWQ6Ci0gICAgICAgICAgICAgICAgLy8gWzMxLSA2XSBSZXNlcnZlZCBmb3IgZnV0dXJlIHVzZQotICAgICAgICAgICAgICAgIC8vIFsgNS0gMF0gU3VwcGxpY2FudCBzdGF0ZSBvcmRpbmFsIChhcyBkZWZpbmVkIGJ5IFN1cHBsaWNhbnRTdGF0ZSkKLSAgICAgICAgICAgICAgICBpbnQgZXZlbnRMb2dQYXJhbSA9IChuZXdTdGF0ZS5vcmRpbmFsKCkgJiAweDNmKTsKLSAgICAgICAgICAgICAgICBFdmVudExvZy53cml0ZUV2ZW50KEVWRU5UTE9HX1NVUFBMSUNBTlRfU1RBVEVfQ0hBTkdFRCwgZXZlbnRMb2dQYXJhbSk7Ci0KLSAgICAgICAgICAgICAgICBpZiAoTE9DQUxfTE9HRCkgTG9nLnYoVEFHLCAiQ2hhbmdpbmcgc3VwcGxpY2FudCBzdGF0ZTogIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGN1cnJlbnRTdGF0ZSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgPT0+ICIgKyBuZXdTdGF0ZSk7Ci0KLSAgICAgICAgICAgICAgICBpbnQgbmV0d29ya0lkID0gc3VwcGxpY2FudFN0YXRlUmVzdWx0Lm5ldHdvcmtJZDsKLQotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAqIFRoZSBTdXBwbGljYW50U3RhdGUgQlNTSUQgdmFsdWUgaXMgdmFsaWQgaW4gQVNTT0NJQVRJTkcgc3RhdGUgb25seS4KLSAgICAgICAgICAgICAgICAgKiBUaGUgTmV0d29ya1N0YXRlIEJTU0lEIHZhbHVlIGNvbWVzIHVwb24gYSBzdWNjZXNzZnVsIGNvbm5lY3Rpb24uCi0gICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgaWYgKHN1cHBsaWNhbnRTdGF0ZVJlc3VsdC5zdGF0ZSA9PSBTdXBwbGljYW50U3RhdGUuQVNTT0NJQVRJTkcpIHsKLSAgICAgICAgICAgICAgICAgICAgbUxhc3RCc3NpZCA9IHN1cHBsaWNhbnRTdGF0ZVJlc3VsdC5CU1NJRDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAgICAgKiBJZiB3ZSBnZXQgZGlzY29ubmVjdCBvciBpbmFjdGl2ZSB3ZSBuZWVkIHRvIHN0YXJ0IG91cgotICAgICAgICAgICAgICAgICAqIHdhdGNoZG9nIHRpbWVyIHRvIHN0YXJ0IGEgc2NhbgotICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgIGlmIChuZXdTdGF0ZSA9PSBTdXBwbGljYW50U3RhdGUuRElTQ09OTkVDVEVEIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICBuZXdTdGF0ZSA9PSBTdXBwbGljYW50U3RhdGUuSU5BQ1RJVkUpIHsKLSAgICAgICAgICAgICAgICAgICAgc2VuZE1lc3NhZ2VEZWxheWVkKG9idGFpbk1lc3NhZ2UoRVZFTlRfTUFZQkVfU1RBUlRfU0NBTl9QT1NUX0RJU0NPTk5FQ1QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbU51bVN1cHBsaWNhbnRTdGF0ZUNoYW5nZXMsIDApLCBLSUNLU1RBUlRfU0NBTk5JTkdfREVMQVlfTVNFQ1MpOwotICAgICAgICAgICAgICAgIH0KLQotCi0gICAgICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAgICAgKiBEaWQgd2UgZ2V0IHRvIERJU0NPTk5FQ1RFRCBzdGF0ZSBkdWUgdG8gYW4KLSAgICAgICAgICAgICAgICAgKiBhdXRoZW50aWNhdGlvbiAocGFzc3dvcmQpIGZhaWx1cmU/Ci0gICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgYm9vbGVhbiBmYWlsZWRUb0F1dGhlbnRpY2F0ZSA9IGZhbHNlOwotICAgICAgICAgICAgICAgIGlmIChuZXdTdGF0ZSA9PSBTdXBwbGljYW50U3RhdGUuRElTQ09OTkVDVEVEKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZhaWxlZFRvQXV0aGVudGljYXRlID0gbVBhc3N3b3JkS2V5TWF5QmVJbmNvcnJlY3Q7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG1QYXNzd29yZEtleU1heUJlSW5jb3JyZWN0ID0gZmFsc2U7Ci0KLSAgICAgICAgICAgICAgICAvKgotICAgICAgICAgICAgICAgICAqIEtlZXAgdHJhY2sgb2YgdGhlIHN1cHBsaWNhbnQgc3RhdGUgYW5kIGNoZWNrIGlmIHdlIHNob3VsZAotICAgICAgICAgICAgICAgICAqIGRpc2FibGUgdGhlIG5ldHdvcmsKLSAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICBib29sZWFuIGRpc2FibGVkTmV0d29yayA9IGZhbHNlOwotICAgICAgICAgICAgICAgIGlmIChpc1N1cHBsaWNhbnRMb29waW5nKG5ld1N0YXRlKSkgewotICAgICAgICAgICAgICAgICAgICBpZiAoTE9DQUxfTE9HRCkgewotICAgICAgICAgICAgICAgICAgICAgICAgTG9nLnYoVEFHLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlN0b3AgV1BBIHN1cHBsaWNhbnQgbG9vcCBhbmQgZGlzYWJsZSBuZXR3b3JrIik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZGlzYWJsZWROZXR3b3JrID0gd2lmaU1hbmFnZXJEaXNhYmxlTmV0d29yayhuZXR3b3JrSWQpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChkaXNhYmxlZE5ldHdvcmspIHsKLSAgICAgICAgICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAgICAgICAgICogUmVzZXQgdGhlIGxvb3Agc3RhdGUgaWYgd2UgZGlzYWJsZWQgdGhlIG5ldHdvcmsKLSAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgICAgIHJlc2V0U3VwcGxpY2FudExvb3BTdGF0ZSgpOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobmV3U3RhdGUgIT0gY3VycmVudFN0YXRlIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAobmV3U3RhdGUgPT0gU3VwcGxpY2FudFN0YXRlLkRJU0NPTk5FQ1RFRCAmJiBpc0RyaXZlclN0b3BwZWQoKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgc2V0U3VwcGxpY2FudFN0YXRlKG5ld1N0YXRlKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG5ld1N0YXRlID09IFN1cHBsaWNhbnRTdGF0ZS5ET1JNQU5UKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBEZXRhaWxlZFN0YXRlIG5ld0RldGFpbGVkU3RhdGU7Ci0gICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlIHJlY29ubmVjdE1zZyA9IG9idGFpbk1lc3NhZ2UoRVZFTlRfREVGRVJSRURfUkVDT05ORUNULCBtTGFzdEJzc2lkKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtSXNTY2FuT25seSB8fCBtUnVuU3RhdGUgPT0gUlVOX1NUQVRFX1NUT1BQSU5HKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3RGV0YWlsZWRTdGF0ZSA9IERldGFpbGVkU3RhdGUuSURMRTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3RGV0YWlsZWRTdGF0ZSA9IERldGFpbGVkU3RhdGUuRkFJTEVEOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlRGlzY29ubmVjdGVkU3RhdGUobmV3RGV0YWlsZWRTdGF0ZSwgdHJ1ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgICAgICAqIElmIHdlIHdlcmUgYXNzb2NpYXRlZCB3aXRoIGEgbmV0d29yayAobmV0d29ya0lkICE9IC0xKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAqIGFzc3VtZSB3ZSByZWFjaGVkIHRoaXMgc3RhdGUgYmVjYXVzZSBvZiBhIGZhaWxlZCBhdHRlbXB0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgKiB0byBhY3F1aXJlIGFuIElQIGFkZHJlc3MsIGFuZCBhdHRlbXB0IGFub3RoZXIgY29ubmVjdGlvbgotICAgICAgICAgICAgICAgICAgICAgICAgICogYW5kIElQIGFkZHJlc3MgYWNxdWlzaXRpb24gaW4gUkVDT05ORUNUX0RFTEFZX01TRUNTCi0gICAgICAgICAgICAgICAgICAgICAgICAgKiBtaWxsaXNlY29uZHMuCi0gICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtUnVuU3RhdGUgPT0gUlVOX1NUQVRFX1JVTk5JTkcgJiYgIW1Jc1NjYW5Pbmx5ICYmIG5ldHdvcmtJZCAhPSAtMSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbmRNZXNzYWdlRGVsYXllZChyZWNvbm5lY3RNc2csIFJFQ09OTkVDVF9ERUxBWV9NU0VDUyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG1SdW5TdGF0ZSA9PSBSVU5fU1RBVEVfU1RPUFBJTkcpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdG9wRHJpdmVyKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG1SdW5TdGF0ZSA9PSBSVU5fU1RBVEVfU1RBUlRJTkcgJiYgIW1Jc1NjYW5Pbmx5KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjb25uZWN0Q29tbWFuZCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG5ld1N0YXRlID09IFN1cHBsaWNhbnRTdGF0ZS5ESVNDT05ORUNURUQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1IYXZlSXBBZGRyZXNzID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXNEcml2ZXJTdG9wcGVkKCkgfHwgbURpc2Nvbm5lY3RFeHBlY3RlZCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZURpc2Nvbm5lY3RlZFN0YXRlKERldGFpbGVkU3RhdGUuRElTQ09OTkVDVEVELCB0cnVlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NoZWR1bGVEaXNjb25uZWN0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobmV3U3RhdGUgIT0gU3VwcGxpY2FudFN0YXRlLkNPTVBMRVRFRCAmJiAhbURpc2Nvbm5lY3RQZW5kaW5nKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgICAgICAqIElnbm9yZSBldmVudHMgdGhhdCBkb24ndCBjaGFuZ2UgdGhlIGNvbm5lY3Rpdml0eSBzdGF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAqIHN1Y2ggYXMgV1BBIHJla2V5aW5nIG9wZXJhdGlvbnMuCi0gICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICghKGN1cnJlbnRTdGF0ZSA9PSBTdXBwbGljYW50U3RhdGUuQ09NUExFVEVEICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG5ld1N0YXRlID09IFN1cHBsaWNhbnRTdGF0ZS5BU1NPQ0lBVElORyB8fAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdTdGF0ZSA9PSBTdXBwbGljYW50U3RhdGUuQVNTT0NJQVRFRCB8fAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdTdGF0ZSA9PSBTdXBwbGljYW50U3RhdGUuRk9VUl9XQVlfSEFORFNIQUtFIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld1N0YXRlID09IFN1cHBsaWNhbnRTdGF0ZS5HUk9VUF9IQU5EU0hBS0UpKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldERldGFpbGVkU3RhdGUoV2lmaUluZm8uZ2V0RGV0YWlsZWRTdGF0ZU9mKG5ld1N0YXRlKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBtRGlzY29ubmVjdEV4cGVjdGVkID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgIGludGVudCA9IG5ldyBJbnRlbnQoV2lmaU1hbmFnZXIuU1VQUExJQ0FOVF9TVEFURV9DSEFOR0VEX0FDVElPTik7Ci0gICAgICAgICAgICAgICAgICAgIGludGVudC5hZGRGbGFncyhJbnRlbnQuRkxBR19SRUNFSVZFUl9SRUdJU1RFUkVEX09OTFlfQkVGT1JFX0JPT1QKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEludGVudC5GTEFHX1JFQ0VJVkVSX1JFUExBQ0VfUEVORElORyk7Ci0gICAgICAgICAgICAgICAgICAgIGludGVudC5wdXRFeHRyYShXaWZpTWFuYWdlci5FWFRSQV9ORVdfU1RBVEUsIChQYXJjZWxhYmxlKW5ld1N0YXRlKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGZhaWxlZFRvQXV0aGVudGljYXRlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoTE9DQUxfTE9HRCkgTG9nLmQoVEFHLCAiRmFpbGVkIHRvIGF1dGhlbnRpY2F0ZSwgZGlzYWJsaW5nIG5ldHdvcmsgIiArIG5ldHdvcmtJZCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB3aWZpTWFuYWdlckRpc2FibGVOZXR3b3JrKG5ldHdvcmtJZCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbnRlbnQucHV0RXh0cmEoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgV2lmaU1hbmFnZXIuRVhUUkFfU1VQUExJQ0FOVF9FUlJPUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBXaWZpTWFuYWdlci5FUlJPUl9BVVRIRU5USUNBVElORyk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgbUNvbnRleHQuc2VuZFN0aWNreUJyb2FkY2FzdChpbnRlbnQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBFVkVOVF9ORVRXT1JLX1NUQVRFX0NIQU5HRUQ6Ci0gICAgICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAgICAgKiBFYWNoIENPTk5FQ1Qgb3IgRElTQ09OTkVDVCBnZW5lcmF0ZXMgYSBwYWlyIG9mIGV2ZW50cy4KLSAgICAgICAgICAgICAgICAgKiBPbmUgaXMgYSBzdXBwbGljYW50IHN0YXRlIGNoYW5nZSBldmVudCwgYW5kIHRoZSBvdGhlcgotICAgICAgICAgICAgICAgICAqIGlzIGEgbmV0d29yayBzdGF0ZSBjaGFuZ2UgZXZlbnQuIEZvciBjb25uZWN0cywgdGhlCi0gICAgICAgICAgICAgICAgICogc3VwcGxpY2FudCBldmVudCBhbHdheXMgYXJyaXZlcyBmaXJzdCwgZm9sbG93ZWQgYnkKLSAgICAgICAgICAgICAgICAgKiB0aGUgbmV0d29yayBzdGF0ZSBjaGFuZ2UgZXZlbnQuIE9ubHkgdGhlIGxhdHRlciBldmVudAotICAgICAgICAgICAgICAgICAqIGhhcyB0aGUgQlNTSUQsIHdoaWNoIHdlIGFyZSBpbnRlcmVzdGVkIGluIGNhcHR1cmluZy4KLSAgICAgICAgICAgICAgICAgKiBGb3IgZGlzY29ubmVjdHMsIHRoZSBvcmRlciBpcyB0aGUgb3Bwb3NpdGUgLS0gdGhlCi0gICAgICAgICAgICAgICAgICogbmV0d29yayBzdGF0ZSBjaGFuZ2UgZXZlbnQgY29tZXMgZmlyc3QsIGZvbGxvd2VkIGJ5Ci0gICAgICAgICAgICAgICAgICogdGhlIHN1cHBsaWNhbnQgc3RhdGUgY2hhbmdlIGV2ZW50LgotICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgIE5ldHdvcmtTdGF0ZUNoYW5nZVJlc3VsdCByZXN1bHQgPQotICAgICAgICAgICAgICAgICAgICAoTmV0d29ya1N0YXRlQ2hhbmdlUmVzdWx0KSBtc2cub2JqOwotCi0gICAgICAgICAgICAgICAgLy8gV2ktRmkgbmV0d29yayBzdGF0ZSBjaGFuZ2VkOgotICAgICAgICAgICAgICAgIC8vIFszMS0gNl0gUmVzZXJ2ZWQgZm9yIGZ1dHVyZSB1c2UKLSAgICAgICAgICAgICAgICAvLyBbIDUtIDBdIERldGFpbGVkIHN0YXRlIG9yZGluYWwgKGFzIGRlZmluZWQgYnkgTmV0d29ya0luZm8uRGV0YWlsZWRTdGF0ZSkgICAKLSAgICAgICAgICAgICAgICBldmVudExvZ1BhcmFtID0gKHJlc3VsdC5zdGF0ZS5vcmRpbmFsKCkgJiAweDNmKTsKLSAgICAgICAgICAgICAgICBFdmVudExvZy53cml0ZUV2ZW50KEVWRU5UTE9HX05FVFdPUktfU1RBVEVfQ0hBTkdFRCwgZXZlbnRMb2dQYXJhbSk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgaWYgKExPQ0FMX0xPR0QpIExvZy52KFRBRywgIk5ldyBuZXR3b3JrIHN0YXRlIGlzICIgKyByZXN1bHQuc3RhdGUpOwotICAgICAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgICAgICogSWYgd2UncmUgaW4gc2Nhbi1vbmx5IG1vZGUsIGRvbid0IGFkdmFuY2UgdGhlIHN0YXRlIG1hY2hpbmUsIGFuZAotICAgICAgICAgICAgICAgICAqIGRvbid0IHJlcG9ydCB0aGUgc3RhdGUgY2hhbmdlIHRvIGNsaWVudHMuCi0gICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgaWYgKG1Jc1NjYW5Pbmx5KSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChMT0NBTF9MT0dEKSBMb2cudihUQUcsICJEcm9wcGluZyBldmVudCBpbiBzY2FuLW9ubHkgbW9kZSIpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKHJlc3VsdC5zdGF0ZSAhPSBEZXRhaWxlZFN0YXRlLlNDQU5OSU5HKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgICAgICAgICAqIFJlc2V0IHRoZSBzY2FuIGNvdW50IHNpbmNlIHRoZXJlIHdhcyBhIG5ldHdvcmsgc3RhdGUKLSAgICAgICAgICAgICAgICAgICAgICogY2hhbmdlLiBUaGlzIGNvdWxkIGJlIGZyb20gc3VwcGxpY2FudCB0cnlpbmcgdG8gYXNzb2NpYXRlCi0gICAgICAgICAgICAgICAgICAgICAqIHdpdGggYSBuZXR3b3JrLgotICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgbU51bVNjYW5zU2luY2VOZXR3b3JrU3RhdGVDaGFuZ2UgPSAwOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAvKgotICAgICAgICAgICAgICAgICAqIElmIHRoZSBzdXBwbGljYW50IHNlbnQgdXMgYSBDT05ORUNURUQgZXZlbnQsIHdlIGRvbid0Ci0gICAgICAgICAgICAgICAgICogd2FudCB0byBzZW5kIG91dCBhbiBpbmRpY2F0aW9uIG9mIG92ZXJhbGwgbmV0d29yawotICAgICAgICAgICAgICAgICAqIGNvbm5lY3Rpdml0eSB1bnRpbCB3ZSBoYXZlIG91ciBJUCBhZGRyZXNzLiBJZiB0aGUKLSAgICAgICAgICAgICAgICAgKiBzdXBwbGljYW50IHNlbnQgdXMgYSBESVNDT05ORUNURUQgZXZlbnQsIHdlIGRlbGF5Ci0gICAgICAgICAgICAgICAgICogc2VuZGluZyBhIG5vdGlmaWNhdGlvbiBpbiBjYXNlIGEgcmVjb25uZWN0aW9uIHRvCi0gICAgICAgICAgICAgICAgICogdGhlIHNhbWUgYWNjZXNzIHBvaW50IG9jY3VycyB3aXRoaW4gYSBzaG9ydCB0aW1lLgotICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgIGlmIChyZXN1bHQuc3RhdGUgPT0gRGV0YWlsZWRTdGF0ZS5ESVNDT05ORUNURUQpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1XaWZpSW5mby5nZXRTdXBwbGljYW50U3RhdGUoKSAhPSBTdXBwbGljYW50U3RhdGUuRE9STUFOVCkgewotICAgICAgICAgICAgICAgICAgICAgICAgc2NoZWR1bGVEaXNjb25uZWN0KCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJlcXVlc3RDb25uZWN0aW9uU3RhdHVzKG1XaWZpSW5mbyk7Ci0gICAgICAgICAgICAgICAgaWYgKCEocmVzdWx0LnN0YXRlID09IERldGFpbGVkU3RhdGUuQ09OTkVDVEVEICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAoIW1IYXZlSXBBZGRyZXNzIHx8IG1EaXNjb25uZWN0UGVuZGluZykpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHNldERldGFpbGVkU3RhdGUocmVzdWx0LnN0YXRlKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAocmVzdWx0LnN0YXRlID09IERldGFpbGVkU3RhdGUuQ09OTkVDVEVEKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgICAgICAgICAqIFJlbW92ZSB0aGUgJ2F2YWlsYWJsZSBuZXR3b3Jrcycgbm90aWZpY2F0aW9uIHdoZW4gd2UKLSAgICAgICAgICAgICAgICAgICAgICogc3VjY2Vzc2Z1bGx5IGNvbm5lY3QgdG8gYSBuZXR3b3JrLgotICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgc2V0Tm90aWZpY2F0aW9uVmlzaWJsZShmYWxzZSwgMCwgZmFsc2UsIDApOwotICAgICAgICAgICAgICAgICAgICBib29sZWFuIHdhc0Rpc2Nvbm5lY3RQZW5kaW5nID0gbURpc2Nvbm5lY3RQZW5kaW5nOwotICAgICAgICAgICAgICAgICAgICBjYW5jZWxEaXNjb25uZWN0KCk7Ci0gICAgICAgICAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgICAgICAgICAqIFRoZSBjb25uZWN0aW9uIGlzIGZ1bGx5IGNvbmZpZ3VyZWQgYXMgZmFyIGFzIGxpbmstbGV2ZWwKLSAgICAgICAgICAgICAgICAgICAgICogY29ubmVjdGl2aXR5IGlzIGNvbmNlcm5lZCwgYnV0IHdlIG1heSBzdGlsbCBuZWVkIHRvIG9idGFpbgotICAgICAgICAgICAgICAgICAgICAgKiBhbiBJUCBhZGRyZXNzLgotICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgaWYgKHdhc0Rpc2Nvbm5lY3RQZW5kaW5nKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBEZXRhaWxlZFN0YXRlIHNhdmVTdGF0ZSA9IGdldE5ldHdvcmtJbmZvKCkuZ2V0RGV0YWlsZWRTdGF0ZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlRGlzY29ubmVjdGVkU3RhdGUoRGV0YWlsZWRTdGF0ZS5ESVNDT05ORUNURUQsIGZhbHNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNldERldGFpbGVkU3RhdGVJbnRlcm5hbChzYXZlU3RhdGUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgY29uZmlndXJlSW50ZXJmYWNlKCk7Ci0gICAgICAgICAgICAgICAgICAgIG1MYXN0QnNzaWQgPSByZXN1bHQuQlNTSUQ7Ci0gICAgICAgICAgICAgICAgICAgIG1MYXN0U3NpZCA9IG1XaWZpSW5mby5nZXRTU0lEKCk7Ci0gICAgICAgICAgICAgICAgICAgIG1MYXN0TmV0d29ya0lkID0gcmVzdWx0Lm5ldHdvcmtJZDsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1IYXZlSXBBZGRyZXNzKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzZXREZXRhaWxlZFN0YXRlKERldGFpbGVkU3RhdGUuQ09OTkVDVEVEKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNldERldGFpbGVkU3RhdGUoRGV0YWlsZWRTdGF0ZS5PQlRBSU5JTkdfSVBBRERSKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBzZW5kTmV0d29ya1N0YXRlQ2hhbmdlQnJvYWRjYXN0KG1XaWZpSW5mby5nZXRCU1NJRCgpKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBFVkVOVF9TQ0FOX1JFU1VMVFNfQVZBSUxBQkxFOgotICAgICAgICAgICAgICAgIGlmIChBY3Rpdml0eU1hbmFnZXJOYXRpdmUuaXNTeXN0ZW1SZWFkeSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1Db250ZXh0LnNlbmRCcm9hZGNhc3QobmV3IEludGVudChXaWZpTWFuYWdlci5TQ0FOX1JFU1VMVFNfQVZBSUxBQkxFX0FDVElPTikpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBzZW5kU2NhblJlc3VsdHNBdmFpbGFibGUoKTsKLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgKiBPbiByZWNlaXZpbmcgdGhlIGZpcnN0IHNjYW4gcmVzdWx0cyBhZnRlciBjb25uZWN0aW5nIHRvCi0gICAgICAgICAgICAgICAgICogdGhlIHN1cHBsaWNhbnQsIHN3aXRjaCBzY2FuIG1vZGUgb3ZlciB0byBwYXNzaXZlLgotICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgIHNldFNjYW5Nb2RlKGZhbHNlKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBFVkVOVF9QT0xMX0lOVEVSVkFMOgotICAgICAgICAgICAgICAgIGlmIChtV2lmaUluZm8uZ2V0U3VwcGxpY2FudFN0YXRlKCkgIT0gU3VwcGxpY2FudFN0YXRlLlVOSU5JVElBTElaRUQpIHsKLSAgICAgICAgICAgICAgICAgICAgcmVxdWVzdFBvbGxlZEluZm8obVdpZmlJbmZvLCB0cnVlKTsKLSAgICAgICAgICAgICAgICAgICAgY2hlY2tQb2xsVGltZXIoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGNhc2UgRVZFTlRfREVGRVJSRURfRElTQ09OTkVDVDoKLSAgICAgICAgICAgICAgICBpZiAobVdpZmlJbmZvLmdldFN1cHBsaWNhbnRTdGF0ZSgpICE9IFN1cHBsaWNhbnRTdGF0ZS5VTklOSVRJQUxJWkVEKSB7Ci0gICAgICAgICAgICAgICAgICAgIGhhbmRsZURpc2Nvbm5lY3RlZFN0YXRlKERldGFpbGVkU3RhdGUuRElTQ09OTkVDVEVELCB0cnVlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgRVZFTlRfREVGRVJSRURfUkVDT05ORUNUOgotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAqIG1MYXN0QnNzaWQgY2FuIGJlIG51bGwgd2hlbiB0aGVyZSBpcyBhIHJlY29ubmVjdAotICAgICAgICAgICAgICAgICAqIHJlcXVlc3Qgb24gdGhlIGZpcnN0IEJTU0lEIHdlIGNvbm5lY3QgdG8KLSAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICBTdHJpbmcgQlNTSUQgPSAobXNnLm9iaiAhPSBudWxsKSA/IG1zZy5vYmoudG9TdHJpbmcoKSA6IG51bGw7Ci0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICogSWYgd2UndmUgZXhjZWVkZWQgdGhlIG1heGltdW0gbnVtYmVyIG9mIHJldHJpZXMgZm9yIHJlY29ubmVjdGluZwotICAgICAgICAgICAgICAgICAqIHRvIGEgZ2l2ZW4gbmV0d29yaywgZGlzYWJsZSB0aGUgbmV0d29yawotICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgIGlmIChtV2lmaUluZm8uZ2V0U3VwcGxpY2FudFN0YXRlKCkgIT0gU3VwcGxpY2FudFN0YXRlLlVOSU5JVElBTElaRUQpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCsrbVJlY29ubmVjdENvdW50ID4gZ2V0TWF4RGhjcFJldHJpZXMoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKExPQ0FMX0xPR0QpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJGYWlsZWQgcmVjb25uZWN0IGNvdW50OiAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1SZWNvbm5lY3RDb3VudCArICIgRGlzYWJsaW5nICIgKyBCU1NJRCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBtV00uZGlzYWJsZU5ldHdvcmsobUxhc3ROZXR3b3JrSWQpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHJlY29ubmVjdENvbW1hbmQoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgRVZFTlRfSU5URVJGQUNFX0NPTkZJR1VSQVRJT05fU1VDQ0VFREVEOgotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAqIFNpbmNlIHRoaXMgZXZlbnQgaXMgc2VudCBmcm9tIGFub3RoZXIgdGhyZWFkLCBpdCBtaWdodCBoYXZlIGJlZW4KLSAgICAgICAgICAgICAgICAgKiBzZW50IGFmdGVyIHdlIGNsb3NlZCBvdXIgY29ubmVjdGlvbiB0byB0aGUgc3VwcGxpY2FudCBpbiB0aGUgY291cnNlCi0gICAgICAgICAgICAgICAgICogb2YgZGlzYWJsaW5nIFdpLUZpLiBJbiB0aGF0IGNhc2UsIHdlIHNob3VsZCBqdXN0IGlnbm9yZSB0aGUgZXZlbnQuCi0gICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgaWYgKG1XaWZpSW5mby5nZXRTdXBwbGljYW50U3RhdGUoKSA9PSBTdXBwbGljYW50U3RhdGUuVU5JTklUSUFMSVpFRCkgewotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbVJlY29ubmVjdENvdW50ID0gMDsKLSAgICAgICAgICAgICAgICBtSGF2ZUlwQWRkcmVzcyA9IHRydWU7Ci0gICAgICAgICAgICAgICAgbU9idGFpbmluZ0lwQWRkcmVzcyA9IGZhbHNlOwotICAgICAgICAgICAgICAgIG1XaWZpSW5mby5zZXRJcEFkZHJlc3MobURoY3BJbmZvLmlwQWRkcmVzcyk7Ci0gICAgICAgICAgICAgICAgbUxhc3RTaWduYWxMZXZlbCA9IC0xOyAvLyBmb3JjZSB1cGRhdGUgb2Ygc2lnbmFsIHN0cmVuZ3RoCi0gICAgICAgICAgICAgICAgaWYgKG1OZXR3b3JrSW5mby5nZXREZXRhaWxlZFN0YXRlKCkgIT0gRGV0YWlsZWRTdGF0ZS5DT05ORUNURUQpIHsKLSAgICAgICAgICAgICAgICAgICAgc2V0RGV0YWlsZWRTdGF0ZShEZXRhaWxlZFN0YXRlLkNPTk5FQ1RFRCk7Ci0gICAgICAgICAgICAgICAgICAgIHNlbmROZXR3b3JrU3RhdGVDaGFuZ2VCcm9hZGNhc3QobVdpZmlJbmZvLmdldEJTU0lEKCkpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIG1zZyA9IG1UYXJnZXQub2J0YWluTWVzc2FnZShFVkVOVF9DT05GSUdVUkFUSU9OX0NIQU5HRUQsIG1OZXR3b3JrSW5mbyk7Ci0gICAgICAgICAgICAgICAgICAgIG1zZy5zZW5kVG9UYXJnZXQoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKExPQ0FMX0xPR0QpIExvZy52KFRBRywgIklQIGNvbmZpZ3VyYXRpb246ICIgKyBtRGhjcEluZm8pOwotICAgICAgICAgICAgICAgIC8vIFdpLUZpIGludGVyZmFjZSBjb25maWd1cmF0aW9uIHN0YXRlIGNoYW5nZWQ6Ci0gICAgICAgICAgICAgICAgLy8gWzMxLSAxXSBSZXNlcnZlZCBmb3IgZnV0dXJlIHVzZQotICAgICAgICAgICAgICAgIC8vIFsgMC0gMF0gSW50ZXJmYWNlIGNvbmZpZ3VyYXRpb24gc3VjY2VlZGVkICgxKSBvciBmYWlsZWQgKDApICAgCi0gICAgICAgICAgICAgICAgRXZlbnRMb2cud3JpdGVFdmVudChFVkVOVExPR19JTlRFUkZBQ0VfQ09ORklHVVJBVElPTl9TVEFURV9DSEFOR0VELCAxKTsKLQotICAgICAgICAgICAgICAgIC8vIFdlJ3ZlIGNvbm5lY3RlZCBzdWNjZXNzZnVsbHksIHNvIGFsbG93IHRoZSBub3RpZmljYXRpb24gYWdhaW4gaW4gdGhlIGZ1dHVyZQotICAgICAgICAgICAgICAgIHJlc2V0Tm90aWZpY2F0aW9uVGltZXIoKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBFVkVOVF9JTlRFUkZBQ0VfQ09ORklHVVJBVElPTl9GQUlMRUQ6Ci0gICAgICAgICAgICAgICAgaWYgKG1XaWZpSW5mby5nZXRTdXBwbGljYW50U3RhdGUoKSAhPSBTdXBwbGljYW50U3RhdGUuVU5JTklUSUFMSVpFRCkgewotICAgICAgICAgICAgICAgICAgICAvLyBXaS1GaSBpbnRlcmZhY2UgY29uZmlndXJhdGlvbiBzdGF0ZSBjaGFuZ2VkOgotICAgICAgICAgICAgICAgICAgICAvLyBbMzEtIDFdIFJlc2VydmVkIGZvciBmdXR1cmUgdXNlCi0gICAgICAgICAgICAgICAgICAgIC8vIFsgMC0gMF0gSW50ZXJmYWNlIGNvbmZpZ3VyYXRpb24gc3VjY2VlZGVkICgxKSBvciBmYWlsZWQgKDApCi0gICAgICAgICAgICAgICAgICAgIEV2ZW50TG9nLndyaXRlRXZlbnQoRVZFTlRMT0dfSU5URVJGQUNFX0NPTkZJR1VSQVRJT05fU1RBVEVfQ0hBTkdFRCwgMCk7Ci0gICAgICAgICAgICAgICAgICAgIG1IYXZlSXBBZGRyZXNzID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgIG1XaWZpSW5mby5zZXRJcEFkZHJlc3MoMCk7Ci0gICAgICAgICAgICAgICAgICAgIG1PYnRhaW5pbmdJcEFkZHJlc3MgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgZGlzY29ubmVjdCgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBFVkVOVF9EUklWRVJfU1RBVEVfQ0hBTkdFRDoKLSAgICAgICAgICAgICAgICAvLyBXaS1GaSBkcml2ZXIgc3RhdGUgY2hhbmdlZDoKLSAgICAgICAgICAgICAgICAvLyAwIFNUQVJURUQKLSAgICAgICAgICAgICAgICAvLyAxIFNUT1BQRUQKLSAgICAgICAgICAgICAgICAvLyAyIEhVTkcKLSAgICAgICAgICAgICAgICBFdmVudExvZy53cml0ZUV2ZW50KEVWRU5UTE9HX0RSSVZFUl9TVEFURV9DSEFOR0VELCBtc2cuYXJnMSk7Ci0KLSAgICAgICAgICAgICAgICBzd2l0Y2ggKG1zZy5hcmcxKSB7Ci0gICAgICAgICAgICAgICAgY2FzZSBEUklWRVJfU1RBUlRFRDoKLSAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAqIFNldCB0aGUgbnVtYmVyIG9mIGFsbG93ZWQgcmFkaW8gY2hhbm5lbHMgYWNjb3JkaW5nCi0gICAgICAgICAgICAgICAgICAgICAqIHRvIHRoZSBzeXN0ZW0gc2V0dGluZywgc2luY2UgaXQgZ2V0cyByZXNldCBieSB0aGUKLSAgICAgICAgICAgICAgICAgICAgICogZHJpdmVyIHVwb24gY2hhbmdpbmcgdG8gdGhlIFNUQVJURUQgc3RhdGUuCi0gICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICBzZXROdW1BbGxvd2VkQ2hhbm5lbHMoKTsKLSAgICAgICAgICAgICAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobVJ1blN0YXRlID09IFJVTl9TVEFURV9TVEFSVElORykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1SdW5TdGF0ZSA9IFJVTl9TVEFURV9SVU5OSU5HOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghbUlzU2Nhbk9ubHkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjb25uZWN0Q29tbWFuZCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEluIHNvbWUgc2l0dWF0aW9ucywgc3VwcGxpY2FudCBuZWVkcyB0byBiZSBraWNrc3RhcnRlZCB0bwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzdGFydCB0aGUgYmFja2dyb3VuZCBzY2FubmluZwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2FuKHRydWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIERSSVZFUl9IVU5HOgotICAgICAgICAgICAgICAgICAgICBMb2cuZShUQUcsICJXaWZpIERyaXZlciByZXBvcnRzIEhVTkcgLSByZWxvYWRpbmcuIik7Ci0gICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgKiByZXN0YXJ0IHRoZSBkcml2ZXIgLSB0b2dnbGUgb2ZmIGFuZCBvbgotICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgbVdNLnNldFdpZmlFbmFibGVkKGZhbHNlKTsKLSAgICAgICAgICAgICAgICAgICAgbVdNLnNldFdpZmlFbmFibGVkKHRydWUpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbm90ZVJ1blN0YXRlKCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgRVZFTlRfUEFTU1dPUkRfS0VZX01BWV9CRV9JTkNPUlJFQ1Q6Ci0gICAgICAgICAgICAgICAgbVBhc3N3b3JkS2V5TWF5QmVJbmNvcnJlY3QgPSB0cnVlOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBib29sZWFuIHdpZmlNYW5hZ2VyRGlzYWJsZU5ldHdvcmsoaW50IG5ldHdvcmtJZCkgewotICAgICAgICBib29sZWFuIGRpc2FibGVkTmV0d29yayA9IGZhbHNlOwotICAgICAgICBpZiAoMCA8PSBuZXR3b3JrSWQpIHsKLSAgICAgICAgICAgIGRpc2FibGVkTmV0d29yayA9IG1XTS5kaXNhYmxlTmV0d29yayhuZXR3b3JrSWQpOwotICAgICAgICAgICAgaWYgKExPQ0FMX0xPR0QpIHsKLSAgICAgICAgICAgICAgICBpZiAoZGlzYWJsZWROZXR3b3JrKSB7Ci0gICAgICAgICAgICAgICAgICAgIExvZy52KFRBRywgIkRpc2FibGVkIG5ldHdvcms6ICIgKyBuZXR3b3JrSWQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAoTE9DQUxfTE9HRCkgewotICAgICAgICAgICAgaWYgKCFkaXNhYmxlZE5ldHdvcmspIHsKLSAgICAgICAgICAgICAgICBMb2cuZShUQUcsICJGYWlsZWQgdG8gZGlzYWJsZSBuZXR3b3JrOiIgKwotICAgICAgICAgICAgICAgICAgICAgICIgaW52YWxpZCBuZXR3b3JrIGlkOiAiICsgbmV0d29ya0lkKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZGlzYWJsZWROZXR3b3JrOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBjb25maWd1cmVJbnRlcmZhY2UoKSB7Ci0gICAgICAgIGNoZWNrUG9sbFRpbWVyKCk7Ci0gICAgICAgIG1MYXN0U2lnbmFsTGV2ZWwgPSAtMTsKLSAgICAgICAgaWYgKCFtVXNlU3RhdGljSXApIHsKLSAgICAgICAgICAgIGlmICghbUhhdmVJcEFkZHJlc3MgJiYgIW1PYnRhaW5pbmdJcEFkZHJlc3MpIHsKLSAgICAgICAgICAgICAgICBtT2J0YWluaW5nSXBBZGRyZXNzID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBtRGhjcFRhcmdldC5zZW5kRW1wdHlNZXNzYWdlKEVWRU5UX0RIQ1BfU1RBUlQpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaW50IGV2ZW50OwotICAgICAgICAgICAgaWYgKE5ldHdvcmtVdGlscy5jb25maWd1cmVJbnRlcmZhY2UobUludGVyZmFjZU5hbWUsIG1EaGNwSW5mbykpIHsKLSAgICAgICAgICAgICAgICBtSGF2ZUlwQWRkcmVzcyA9IHRydWU7Ci0gICAgICAgICAgICAgICAgZXZlbnQgPSBFVkVOVF9JTlRFUkZBQ0VfQ09ORklHVVJBVElPTl9TVUNDRUVERUQ7Ci0gICAgICAgICAgICAgICAgaWYgKExPQ0FMX0xPR0QpIExvZy52KFRBRywgIlN0YXRpYyBJUCBjb25maWd1cmF0aW9uIHN1Y2NlZWRlZCIpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBtSGF2ZUlwQWRkcmVzcyA9IGZhbHNlOwotICAgICAgICAgICAgICAgIGV2ZW50ID0gRVZFTlRfSU5URVJGQUNFX0NPTkZJR1VSQVRJT05fRkFJTEVEOwotICAgICAgICAgICAgICAgIGlmIChMT0NBTF9MT0dEKSBMb2cudihUQUcsICJTdGF0aWMgSVAgY29uZmlndXJhdGlvbiBmYWlsZWQiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNlbmRFbXB0eU1lc3NhZ2UoZXZlbnQpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVzZXQgb3VyIElQIHN0YXRlIGFuZCBzZW5kIG91dCBicm9hZGNhc3RzIGZvbGxvd2luZyBhIGRpc2Nvbm5lY3QuCi0gICAgICogQHBhcmFtIG5ld1N0YXRlIHRoZSB7QGNvZGUgRGV0YWlsZWRTdGF0ZX0gdG8gc2V0LiBTaG91bGQgYmUgZWl0aGVyCi0gICAgICoge0Bjb2RlIERJU0NPTk5FQ1RFRH0gb3Ige0Bjb2RlIEZBSUxFRH0uCi0gICAgICogQHBhcmFtIGRpc2FibGVJbnRlcmZhY2UgaW5kaWNhdGVzIHdoZXRoZXIgdGhlIGludGVyZmFjZSBzaG91bGQKLSAgICAgKiBiZSBkaXNhYmxlZAotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBoYW5kbGVEaXNjb25uZWN0ZWRTdGF0ZShEZXRhaWxlZFN0YXRlIG5ld1N0YXRlLCBib29sZWFuIGRpc2FibGVJbnRlcmZhY2UpIHsKLSAgICAgICAgaWYgKG1EaXNjb25uZWN0UGVuZGluZykgewotICAgICAgICAgICAgY2FuY2VsRGlzY29ubmVjdCgpOwotICAgICAgICB9Ci0gICAgICAgIG1EaXNjb25uZWN0RXhwZWN0ZWQgPSBmYWxzZTsKLSAgICAgICAgcmVzZXRDb25uZWN0aW9ucyhkaXNhYmxlSW50ZXJmYWNlKTsKLSAgICAgICAgc2V0RGV0YWlsZWRTdGF0ZShuZXdTdGF0ZSk7Ci0gICAgICAgIHNlbmROZXR3b3JrU3RhdGVDaGFuZ2VCcm9hZGNhc3QobUxhc3RCc3NpZCk7Ci0gICAgICAgIG1XaWZpSW5mby5zZXRCU1NJRChudWxsKTsKLSAgICAgICAgbUxhc3RCc3NpZCA9IG51bGw7Ci0gICAgICAgIG1MYXN0U3NpZCA9IG51bGw7Ci0gICAgICAgIG1EaXNjb25uZWN0UGVuZGluZyA9IGZhbHNlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJlc2V0cyB0aGUgV2ktRmkgQ29ubmVjdGlvbnMgYnkgY2xlYXJpbmcgYW55IHN0YXRlLCByZXNldHRpbmcgYW55IHNvY2tldHMKLSAgICAgKiB1c2luZyB0aGUgaW50ZXJmYWNlLCBzdG9wcGluZyBESENQLCBhbmQgZGlzYWJsaW5nIHRoZSBpbnRlcmZhY2UuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcmVzZXRDb25uZWN0aW9ucyhib29sZWFuIGRpc2FibGVJbnRlcmZhY2UpIHsKLSAgICAgICAgaWYgKExPQ0FMX0xPR0QpIExvZy5kKFRBRywgIlJlc2V0IGNvbm5lY3Rpb25zIGFuZCBzdG9wcGluZyBESENQIik7Ci0gICAgICAgIG1IYXZlSXBBZGRyZXNzID0gZmFsc2U7Ci0gICAgICAgIG1PYnRhaW5pbmdJcEFkZHJlc3MgPSBmYWxzZTsKLSAgICAgICAgbVdpZmlJbmZvLnNldElwQWRkcmVzcygwKTsKLQotICAgICAgICAvKgotICAgICAgICAgKiBSZXNldCBjb25uZWN0aW9uIGRlcGVuZHMgb24gYm90aCB0aGUgaW50ZXJmYWNlIGFuZCB0aGUgSVAgYXNzaWduZWQsCi0gICAgICAgICAqIHNvIGl0IHNob3VsZCBiZSBkb25lIGJlZm9yZSBhbnkgY2hhbmNlIG9mIHRoZSBJUCBiZWluZyBsb3N0LgotICAgICAgICAgKi8KLSAgICAgICAgTmV0d29ya1V0aWxzLnJlc2V0Q29ubmVjdGlvbnMobUludGVyZmFjZU5hbWUpOwotCi0gICAgICAgIC8vIFN0b3AgREhDUAotICAgICAgICBpZiAobURoY3BUYXJnZXQgIT0gbnVsbCkgewotICAgICAgICAgICAgbURoY3BUYXJnZXQuc2V0Q2FuY2VsQ2FsbGJhY2sodHJ1ZSk7Ci0gICAgICAgICAgICBtRGhjcFRhcmdldC5yZW1vdmVNZXNzYWdlcyhFVkVOVF9ESENQX1NUQVJUKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoIU5ldHdvcmtVdGlscy5zdG9wRGhjcChtSW50ZXJmYWNlTmFtZSkpIHsKLSAgICAgICAgICAgIExvZy5lKFRBRywgIkNvdWxkIG5vdCBzdG9wIERIQ1AiKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBJbnRlcmZhY2UgaXMgcmUtZW5hYmxlZCBpbiB0aGUgc3VwcGxpY2FudAotICAgICAgICAgKiB3aGVuIG1vdmluZyBvdXQgb2YgQVNTT0NJQVRJTkcgc3RhdGUKLSAgICAgICAgICovCi0gICAgICAgIGlmKGRpc2FibGVJbnRlcmZhY2UpIHsKLSAgICAgICAgICAgIGlmIChMT0NBTF9MT0dEKSBMb2cuZChUQUcsICJEaXNhYmxpbmcgaW50ZXJmYWNlIik7Ci0gICAgICAgICAgICBOZXR3b3JrVXRpbHMuZGlzYWJsZUludGVyZmFjZShtSW50ZXJmYWNlTmFtZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgc3VwcGxpY2FudCBpcyByZXBvcnRpbmcgdGhhdCB3ZSBhcmUgZGlzY29ubmVjdGVkIGZyb20gdGhlIGN1cnJlbnQKLSAgICAgKiBhY2Nlc3MgcG9pbnQuIE9mdGVuLCBob3dldmVyLCBhIGRpc2Nvbm5lY3Qgd2lsbCBiZSBmb2xsb3dlZCB2ZXJ5IHNob3J0bHkKLSAgICAgKiBieSBhIHJlY29ubmVjdCB0byB0aGUgc2FtZSBhY2Nlc3MgcG9pbnQuIFRoZXJlZm9yZSwgd2UgZGVsYXkgcmVzZXR0aW5nCi0gICAgICogdGhlIGNvbm5lY3Rpb24ncyBJUCBzdGF0ZSBmb3IgYSBiaXQuCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHNjaGVkdWxlRGlzY29ubmVjdCgpIHsKLSAgICAgICAgbURpc2Nvbm5lY3RQZW5kaW5nID0gdHJ1ZTsKLSAgICAgICAgaWYgKCFoYXNNZXNzYWdlcyhFVkVOVF9ERUZFUlJFRF9ESVNDT05ORUNUKSkgewotICAgICAgICAgICAgc2VuZEVtcHR5TWVzc2FnZURlbGF5ZWQoRVZFTlRfREVGRVJSRURfRElTQ09OTkVDVCwgRElTQ09OTkVDVF9ERUxBWV9NU0VDUyk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgY2FuY2VsRGlzY29ubmVjdCgpIHsKLSAgICAgICAgbURpc2Nvbm5lY3RQZW5kaW5nID0gZmFsc2U7Ci0gICAgICAgIHJlbW92ZU1lc3NhZ2VzKEVWRU5UX0RFRkVSUkVEX0RJU0NPTk5FQ1QpOwotICAgIH0KLQotICAgIHB1YmxpYyBEaGNwSW5mbyBnZXREaGNwSW5mbygpIHsKLSAgICAgICAgcmV0dXJuIG1EaGNwSW5mbzsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3luY2hyb25pemVkIExpc3Q8U2NhblJlc3VsdD4gZ2V0U2NhblJlc3VsdHNMaXN0KCkgewotICAgICAgICByZXR1cm4gbVNjYW5SZXN1bHRzOwotICAgIH0KLQotICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBzZXRTY2FuUmVzdWx0c0xpc3QoTGlzdDxTY2FuUmVzdWx0PiBzY2FuTGlzdCkgewotICAgICAgICBtU2NhblJlc3VsdHMgPSBzY2FuTGlzdDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgc3RhdHVzIGluZm9ybWF0aW9uIGZvciB0aGUgY3VycmVudCBjb25uZWN0aW9uLCBpZiBhbnkuCi0gICAgICogQHJldHVybiBhIHtAbGluayBXaWZpSW5mb30gb2JqZWN0IGNvbnRhaW5pbmcgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGN1cnJlbnQgY29ubmVjdGlvbgotICAgICAqLwotICAgIHB1YmxpYyBXaWZpSW5mbyByZXF1ZXN0Q29ubmVjdGlvbkluZm8oKSB7Ci0gICAgICAgIHJlcXVlc3RDb25uZWN0aW9uU3RhdHVzKG1XaWZpSW5mbyk7Ci0gICAgICAgIHJlcXVlc3RQb2xsZWRJbmZvKG1XaWZpSW5mbywgZmFsc2UpOwotICAgICAgICByZXR1cm4gbVdpZmlJbmZvOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCByZXF1ZXN0Q29ubmVjdGlvblN0YXR1cyhXaWZpSW5mbyBpbmZvKSB7Ci0gICAgICAgIFN0cmluZyByZXBseSA9IHN0YXR1cygpOwotICAgICAgICBpZiAocmVwbHkgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIC8qCi0gICAgICAgICAqIFBhcnNlIHRoZSByZXBseSBmcm9tIHRoZSBzdXBwbGljYW50IHRvIHRoZSBzdGF0dXMgY29tbWFuZCwgYW5kIHVwZGF0ZQotICAgICAgICAgKiBsb2NhbCBzdGF0ZSBhY2NvcmRpbmdseS4gVGhlIHJlcGx5IGlzIGEgc2VyaWVzIG9mIGxpbmVzIG9mIHRoZSBmb3JtCi0gICAgICAgICAqICJuYW1lPXZhbHVlIi4KLSAgICAgICAgICovCi0gICAgICAgIFN0cmluZyBTU0lEID0gbnVsbDsKLSAgICAgICAgU3RyaW5nIEJTU0lEID0gbnVsbDsKLSAgICAgICAgU3RyaW5nIHN1cHBTdGF0ZSA9IG51bGw7Ci0gICAgICAgIGludCBuZXRJZCA9IC0xOwotICAgICAgICBTdHJpbmdbXSBsaW5lcyA9IHJlcGx5LnNwbGl0KCJcbiIpOwotICAgICAgICBmb3IgKFN0cmluZyBsaW5lIDogbGluZXMpIHsKLSAgICAgICAgICAgIFN0cmluZ1tdIHByb3AgPSBsaW5lLnNwbGl0KCIgKj0gKiIsIDIpOwotICAgICAgICAgICAgaWYgKHByb3AubGVuZ3RoIDwgMikKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIFN0cmluZyBuYW1lID0gcHJvcFswXTsKLSAgICAgICAgICAgIFN0cmluZyB2YWx1ZSA9IHByb3BbMV07Ci0gICAgICAgICAgICBpZiAobmFtZS5lcXVhbHNJZ25vcmVDYXNlKCJpZCIpKQotICAgICAgICAgICAgICAgIG5ldElkID0gSW50ZWdlci5wYXJzZUludCh2YWx1ZSk7Ci0gICAgICAgICAgICBlbHNlIGlmIChuYW1lLmVxdWFsc0lnbm9yZUNhc2UoInNzaWQiKSkKLSAgICAgICAgICAgICAgICBTU0lEID0gdmFsdWU7Ci0gICAgICAgICAgICBlbHNlIGlmIChuYW1lLmVxdWFsc0lnbm9yZUNhc2UoImJzc2lkIikpCi0gICAgICAgICAgICAgICAgQlNTSUQgPSB2YWx1ZTsKLSAgICAgICAgICAgIGVsc2UgaWYgKG5hbWUuZXF1YWxzSWdub3JlQ2FzZSgid3BhX3N0YXRlIikpCi0gICAgICAgICAgICAgICAgc3VwcFN0YXRlID0gdmFsdWU7Ci0gICAgICAgIH0KLSAgICAgICAgaW5mby5zZXROZXR3b3JrSWQobmV0SWQpOwotICAgICAgICBpbmZvLnNldFNTSUQoU1NJRCk7Ci0gICAgICAgIGluZm8uc2V0QlNTSUQoQlNTSUQpOwotICAgICAgICAvKgotICAgICAgICAgKiBXZSBvbmx5IHNldCB0aGUgc3VwcGxpY2FudCBzdGF0ZSBpZiB0aGUgcHJldmlvdXMgc3RhdGUgd2FzCi0gICAgICAgICAqIFVOSU5JVElBTElaRUQuIFRoaXMgc2hvdWxkIG9ubHkgaGFwcGVuIHdoZW4gd2UgZmlyc3QgY29ubmVjdCB0bwotICAgICAgICAgKiB0aGUgc3VwcGxpY2FudC4gT25jZSB3ZSdyZSBjb25uZWN0ZWQsIHdlIHNob3VsZCBhbHdheXMgcmVjZWl2ZQotICAgICAgICAgKiBhbiBldmVudCB1cG9uIGFueSBzdGF0ZSBjaGFuZ2UsIGJ1dCBpbiB0aGlzIGNhc2UsIHdlIHdhbnQgdG8KLSAgICAgICAgICogbWFrZSBzdXJlIGFueSBsaXN0ZW5lcnMgYXJlIG1hZGUgYXdhcmUgb2YgdGhlIHN0YXRlIGNoYW5nZS4KLSAgICAgICAgICovCi0gICAgICAgIGlmIChtV2lmaUluZm8uZ2V0U3VwcGxpY2FudFN0YXRlKCkgPT0gU3VwcGxpY2FudFN0YXRlLlVOSU5JVElBTElaRUQgJiYgc3VwcFN0YXRlICE9IG51bGwpCi0gICAgICAgICAgICBzZXRTdXBwbGljYW50U3RhdGUoc3VwcFN0YXRlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgdGhlIGR5bmFtaWMgaW5mb3JtYXRpb24gdGhhdCBpcyBub3QgcmVwb3J0ZWQgdmlhIGV2ZW50cy4KLSAgICAgKiBAcGFyYW0gaW5mbyB0aGUgb2JqZWN0IGludG8gd2hpY2ggdGhlIGluZm9ybWF0aW9uIHNob3VsZCBiZSBjYXB0dXJlZC4KLSAgICAgKi8KLSAgICBwcml2YXRlIHN5bmNocm9uaXplZCB2b2lkIHJlcXVlc3RQb2xsZWRJbmZvKFdpZmlJbmZvIGluZm8sIGJvb2xlYW4gcG9sbGluZykKLSAgICB7Ci0gICAgICAgIGludCBuZXdSc3NpID0gKHBvbGxpbmcgPyBnZXRSc3NpQXBwcm94KCkgOiBnZXRSc3NpKCkpOwotICAgICAgICBpZiAobmV3UnNzaSAhPSAtMSAmJiAtMjAwIDwgbmV3UnNzaSAmJiBuZXdSc3NpIDwgMjU2KSB7IC8vIHNjcmVlbiBvdXQgaW52YWxpZCB2YWx1ZXMKLSAgICAgICAgICAgIC8qIHNvbWUgaW1wbGVtZW50YXRpb25zIGF2b2lkIG5lZ2F0aXZlIHZhbHVlcyBieSBhZGRpbmcgMjU2Ci0gICAgICAgICAgICAgKiBzbyB3ZSBuZWVkIHRvIGFkanVzdCBmb3IgdGhhdCBoZXJlLgotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBpZiAobmV3UnNzaSA+IDApIG5ld1Jzc2kgLT0gMjU2OwotICAgICAgICAgICAgaW5mby5zZXRSc3NpKG5ld1Jzc2kpOwotICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAqIFJhdGhlciB0aGVuIHNlbmRpbmcgdGhlIHJhdyBSU1NJIG91dCBldmVyeSB0aW1lIGl0Ci0gICAgICAgICAgICAgKiBjaGFuZ2VzLCB3ZSBwcmVjYWxjdWxhdGUgdGhlIHNpZ25hbCBsZXZlbCB0aGF0IHdvdWxkCi0gICAgICAgICAgICAgKiBiZSBkaXNwbGF5ZWQgaW4gdGhlIHN0YXR1cyBiYXIsIGFuZCBvbmx5IHNlbmQgdGhlCi0gICAgICAgICAgICAgKiBicm9hZGNhc3QgaWYgdGhhdCBtdWNoIG1vcmUgY29hcnNlLWdyYWluZWQgbnVtYmVyCi0gICAgICAgICAgICAgKiBjaGFuZ2VzLiBUaGlzIGN1dHMgZG93biBncmVhdGx5IG9uIHRoZSBudW1iZXIgb2YKLSAgICAgICAgICAgICAqIGJyb2FkY2FzdHMsIGF0IHRoZSBjb3N0IG9mIG5vdCBpbmZvcm1pbmcgb3RoZXJzCi0gICAgICAgICAgICAgKiBpbnRlcmVzdGVkIGluIFJTU0kgb2YgYWxsIHRoZSBjaGFuZ2VzIGluIHNpZ25hbAotICAgICAgICAgICAgICogbGV2ZWwuCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIC8vIFRPRE86IFRoZSBzZWNvbmQgYXJnIHRvIHRoZSBjYWxsIGJlbG93IG5lZWRzIHRvIGJlIGEgc3ltYm9sIHNvbWV3aGVyZSwgYnV0Ci0gICAgICAgICAgICAvLyBpdCdzIGFjdHVhbGx5IHRoZSBzaXplIG9mIGFuIGFycmF5IG9mIGljb25zIHRoYXQncyBwcml2YXRlCi0gICAgICAgICAgICAvLyB0byBTdGF0dXNCYXIgUG9saWN5LgotICAgICAgICAgICAgaW50IG5ld1NpZ25hbExldmVsID0gV2lmaU1hbmFnZXIuY2FsY3VsYXRlU2lnbmFsTGV2ZWwobmV3UnNzaSwgNCk7Ci0gICAgICAgICAgICBpZiAobmV3U2lnbmFsTGV2ZWwgIT0gbUxhc3RTaWduYWxMZXZlbCkgewotICAgICAgICAgICAgICAgIHNlbmRSc3NpQ2hhbmdlQnJvYWRjYXN0KG5ld1Jzc2kpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbUxhc3RTaWduYWxMZXZlbCA9IG5ld1NpZ25hbExldmVsOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaW5mby5zZXRSc3NpKC0yMDApOwotICAgICAgICB9Ci0gICAgICAgIGludCBuZXdMaW5rU3BlZWQgPSBnZXRMaW5rU3BlZWQoKTsKLSAgICAgICAgaWYgKG5ld0xpbmtTcGVlZCAhPSAtMSkgewotICAgICAgICAgICAgaW5mby5zZXRMaW5rU3BlZWQobmV3TGlua1NwZWVkKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBzZW5kUnNzaUNoYW5nZUJyb2FkY2FzdChmaW5hbCBpbnQgbmV3UnNzaSkgewotICAgICAgICBpZiAoQWN0aXZpdHlNYW5hZ2VyTmF0aXZlLmlzU3lzdGVtUmVhZHkoKSkgewotICAgICAgICAgICAgSW50ZW50IGludGVudCA9IG5ldyBJbnRlbnQoV2lmaU1hbmFnZXIuUlNTSV9DSEFOR0VEX0FDVElPTik7Ci0gICAgICAgICAgICBpbnRlbnQucHV0RXh0cmEoV2lmaU1hbmFnZXIuRVhUUkFfTkVXX1JTU0ksIG5ld1Jzc2kpOwotICAgICAgICAgICAgbUNvbnRleHQuc2VuZEJyb2FkY2FzdChpbnRlbnQpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHNlbmROZXR3b3JrU3RhdGVDaGFuZ2VCcm9hZGNhc3QoU3RyaW5nIGJzc2lkKSB7Ci0gICAgICAgIEludGVudCBpbnRlbnQgPSBuZXcgSW50ZW50KFdpZmlNYW5hZ2VyLk5FVFdPUktfU1RBVEVfQ0hBTkdFRF9BQ1RJT04pOwotICAgICAgICBpbnRlbnQuYWRkRmxhZ3MoSW50ZW50LkZMQUdfUkVDRUlWRVJfUkVHSVNURVJFRF9PTkxZX0JFRk9SRV9CT09UCi0gICAgICAgICAgICAgICAgfCBJbnRlbnQuRkxBR19SRUNFSVZFUl9SRVBMQUNFX1BFTkRJTkcpOwotICAgICAgICBpbnRlbnQucHV0RXh0cmEoV2lmaU1hbmFnZXIuRVhUUkFfTkVUV09SS19JTkZPLCBtTmV0d29ya0luZm8pOwotICAgICAgICBpZiAoYnNzaWQgIT0gbnVsbCkKLSAgICAgICAgICAgIGludGVudC5wdXRFeHRyYShXaWZpTWFuYWdlci5FWFRSQV9CU1NJRCwgYnNzaWQpOwotICAgICAgICBtQ29udGV4dC5zZW5kU3RpY2t5QnJvYWRjYXN0KGludGVudCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRGlzYWJsZSBXaS1GaSBjb25uZWN0aXZpdHkgYnkgc3RvcHBpbmcgdGhlIGRyaXZlci4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiB0ZWFyZG93bigpIHsKLSAgICAgICAgaWYgKCFtVG9ybkRvd25CeUNvbm5NZ3IpIHsKLSAgICAgICAgICAgIGlmIChkaXNjb25uZWN0QW5kU3RvcCgpKSB7Ci0gICAgICAgICAgICAgICAgc2V0VG9ybkRvd25CeUNvbm5NZ3IodHJ1ZSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVlbmFibGUgV2ktRmkgY29ubmVjdGl2aXR5IGJ5IHJlc3RhcnRpbmcgdGhlIGRyaXZlci4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiByZWNvbm5lY3QoKSB7Ci0gICAgICAgIGlmIChtVG9ybkRvd25CeUNvbm5NZ3IpIHsKLSAgICAgICAgICAgIGlmIChyZXN0YXJ0KCkpIHsKLSAgICAgICAgICAgICAgICBzZXRUb3JuRG93bkJ5Q29ubk1ncihmYWxzZSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogV2Ugd2FudCB0byBzdG9wIHRoZSBkcml2ZXIsIGJ1dCBpZiB3ZSdyZSBjb25uZWN0ZWQgdG8gYSBuZXR3b3JrLAotICAgICAqIHdlIGZpcnN0IHdhbnQgdG8gZGlzY29ubmVjdCwgc28gdGhhdCB0aGUgc3VwcGxpY2FudCBpcyBhbHdheXMgaW4KLSAgICAgKiBhIGtub3duIHN0YXRlIChESVNDT05ORUNURUQpIHdoZW4gdGhlIGRyaXZlciBpcyBzdG9wcGVkLgotICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoZSBvcGVyYXRpb24gc3VjY2VlZHMsIHdoaWNoIG1lYW5zIHRoYXQgdGhlCi0gICAgICogZGlzY29ubmVjdCBvciBzdG9wIGNvbW1hbmQgd2FzIGluaXRpYXRlZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4gZGlzY29ubmVjdEFuZFN0b3AoKSB7Ci0gICAgICAgIGJvb2xlYW4gcmV0ID0gdHJ1ZTs7Ci0gICAgICAgIGlmIChtUnVuU3RhdGUgIT0gUlVOX1NUQVRFX1NUT1BQSU5HICYmIG1SdW5TdGF0ZSAhPSBSVU5fU1RBVEVfU1RPUFBFRCkgewotICAgICAgICAgICAgLy8gVGFrZSBkb3duIGFueSBvcGVuIG5ldHdvcmsgbm90aWZpY2F0aW9ucwotICAgICAgICAgICAgc2V0Tm90aWZpY2F0aW9uVmlzaWJsZShmYWxzZSwgMCwgZmFsc2UsIDApOwotCi0gICAgICAgICAgICBpZiAobVdpZmlJbmZvLmdldFN1cHBsaWNhbnRTdGF0ZSgpID09IFN1cHBsaWNhbnRTdGF0ZS5ET1JNQU5UKSB7Ci0gICAgICAgICAgICAgICAgcmV0ID0gc3RvcERyaXZlcigpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICByZXQgPSBkaXNjb25uZWN0KCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtUnVuU3RhdGUgPSBSVU5fU1RBVEVfU1RPUFBJTkc7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJldDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4gcmVzdGFydCgpIHsKLSAgICAgICAgaWYgKG1SdW5TdGF0ZSA9PSBSVU5fU1RBVEVfU1RPUFBFRCkgewotICAgICAgICAgICAgbVJ1blN0YXRlID0gUlVOX1NUQVRFX1NUQVJUSU5HOwotICAgICAgICAgICAgcmVzZXRDb25uZWN0aW9ucyh0cnVlKTsKLSAgICAgICAgICAgIHJldHVybiBzdGFydERyaXZlcigpOwotICAgICAgICB9IGVsc2UgaWYgKG1SdW5TdGF0ZSA9PSBSVU5fU1RBVEVfU1RPUFBJTkcpIHsKLSAgICAgICAgICAgIG1SdW5TdGF0ZSA9IFJVTl9TVEFURV9TVEFSVElORzsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IGdldFdpZmlTdGF0ZSgpIHsKLSAgICAgICAgcmV0dXJuIG1XaWZpU3RhdGUuZ2V0KCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0V2lmaVN0YXRlKGludCB3aWZpU3RhdGUpIHsKLSAgICAgICAgbVdpZmlTdGF0ZS5zZXQod2lmaVN0YXRlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0FueU5ldHdvcmtEaXNhYmxlZCgpIHsKLSAgICAgICAgcmV0dXJuIG1Jc0FueU5ldHdvcmtEaXNhYmxlZC5nZXQoKTsKLSAgICB9Ci0KLSAgIC8qKgotICAgICAqIFRoZSBXaWZpTmF0aXZlIGludGVyZmFjZSBmdW5jdGlvbnMgYXJlIGxpc3RlZCBiZWxvdy4KLSAgICAgKiBUaGUgb25seSBuYXRpdmUgY2FsbCB0aGF0IGlzIG5vdCBzeW5jaHJvbml6ZWQgb24KLSAgICAgKiBXaWZpU3RhdGVUcmFja2VyIGlzIHdhaXRGb3JFdmVudCgpIHdoaWNoIHdhaXRzIG9uIGEKLSAgICAgKiBzZXBlcmF0ZSBtb25pdG9yIGNoYW5uZWwuCi0gICAgICoKLSAgICAgKiBBbGwgc3VwcGxpY2FudCBjb21tYW5kcyBuZWVkIHRoZSB3aWZpIHRvIGJlIGluIGFuCi0gICAgICogZW5hYmxlZCBzdGF0ZS4gVGhpcyBjYW4gYmUgZG9uZSBieSBjaGVja2luZyB0aGUKLSAgICAgKiBtV2lmaVN0YXRlIHRvIGJlIFdJRklfU1RBVEVfRU5BQkxFRC4KLSAgICAgKgotICAgICAqIEFsbCBjb21tYW5kcyB0aGF0IGNhbiBjYXVzZSBjb21tYW5kcyB0byBkcml2ZXIKLSAgICAgKiBpbml0aWF0ZWQgbmVlZCB0aGUgZHJpdmVyIHN0YXRlIHRvIGJlIHN0YXJ0ZWQuCi0gICAgICogVGhpcyBpcyBkb25lIGJ5IGNoZWNraW5nIGlzRHJpdmVyU3RvcHBlZCgpIHRvCi0gICAgICogYmUgZmFsc2UuCi0gICAgICovCi0KLSAgICAvKioKLSAgICAgKiBMb2FkIHRoZSBkcml2ZXIgYW5kIGZpcm13YXJlCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGUgb3BlcmF0aW9uIHN1Y2NlZWRzLCB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZQotICAgICAqLwotICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgYm9vbGVhbiBsb2FkRHJpdmVyKCkgewotICAgICAgICByZXR1cm4gV2lmaU5hdGl2ZS5sb2FkRHJpdmVyKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVW5sb2FkIHRoZSBkcml2ZXIgYW5kIGZpcm13YXJlCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGUgb3BlcmF0aW9uIHN1Y2NlZWRzLCB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZQotICAgICAqLwotICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgYm9vbGVhbiB1bmxvYWREcml2ZXIoKSB7Ci0gICAgICAgIHJldHVybiBXaWZpTmF0aXZlLnVubG9hZERyaXZlcigpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENoZWNrIHRoZSBzdXBwbGljYW50IGNvbmZpZyBhbmQKLSAgICAgKiBzdGFydCB0aGUgc3VwcGxpY2FudCBkYWVtb24KLSAgICAgKgotICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoZSBvcGVyYXRpb24gc3VjY2VlZHMsIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlCi0gICAgICovCi0gICAgcHVibGljIHN5bmNocm9uaXplZCBib29sZWFuIHN0YXJ0U3VwcGxpY2FudCgpIHsKLSAgICAgICAgcmV0dXJuIFdpZmlOYXRpdmUuc3RhcnRTdXBwbGljYW50KCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU3RvcCB0aGUgc3VwcGxpY2FudCBkYWVtb24KLSAgICAgKgotICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoZSBvcGVyYXRpb24gc3VjY2VlZHMsIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlCi0gICAgICovCi0gICAgcHVibGljIHN5bmNocm9uaXplZCBib29sZWFuIHN0b3BTdXBwbGljYW50KCkgewotICAgICAgICByZXR1cm4gV2lmaU5hdGl2ZS5zdG9wU3VwcGxpY2FudCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEVzdGFibGlzaGVzIHR3byBjaGFubmVscyAtIGNvbnRyb2wgY2hhbm5lbCBmb3IgY29tbWFuZHMKLSAgICAgKiBhbmQgbW9uaXRvciBjaGFubmVsIGZvciBub3RpZnlpbmcgV2lmaU1vbml0b3IKLSAgICAgKgotICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoZSBvcGVyYXRpb24gc3VjY2VlZHMsIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlCi0gICAgICovCi0gICAgcHVibGljIHN5bmNocm9uaXplZCBib29sZWFuIGNvbm5lY3RUb1N1cHBsaWNhbnQoKSB7Ci0gICAgICAgIHJldHVybiBXaWZpTmF0aXZlLmNvbm5lY3RUb1N1cHBsaWNhbnQoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDbG9zZSB0aGUgY29udHJvbC9tb25pdG9yIGNoYW5uZWxzIHRvIHN1cHBsaWNhbnQKLSAgICAgKi8KLSAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgY2xvc2VTdXBwbGljYW50Q29ubmVjdGlvbigpIHsKLSAgICAgICAgV2lmaU5hdGl2ZS5jbG9zZVN1cHBsaWNhbnRDb25uZWN0aW9uKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2hlY2sgaWYgdGhlIHN1cHBsaWNhbnQgaXMgYWxpdmUKLSAgICAgKgotICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoZSBvcGVyYXRpb24gc3VjY2VlZHMsIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlCi0gICAgICovCi0gICAgcHVibGljIHN5bmNocm9uaXplZCBib29sZWFuIHBpbmcoKSB7Ci0gICAgICAgIGlmIChtV2lmaVN0YXRlLmdldCgpICE9IFdJRklfU1RBVEVfRU5BQkxFRCkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBXaWZpTmF0aXZlLnBpbmdDb21tYW5kKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogaW5pdGlhdGUgYW4gYWN0aXZlIG9yIHBhc3NpdmUgc2NhbgotICAgICAqCi0gICAgICogQHBhcmFtIGZvcmNlQWN0aXZlIHRydWUgaWYgaXQgaXMgYSBhY3RpdmUgc2NhbgotICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoZSBvcGVyYXRpb24gc3VjY2VlZHMsIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlCi0gICAgICovCi0gICAgcHVibGljIHN5bmNocm9uaXplZCBib29sZWFuIHNjYW4oYm9vbGVhbiBmb3JjZUFjdGl2ZSkgewotICAgICAgICBpZiAobVdpZmlTdGF0ZS5nZXQoKSAhPSBXSUZJX1NUQVRFX0VOQUJMRUQgfHwgaXNEcml2ZXJTdG9wcGVkKCkpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gV2lmaU5hdGl2ZS5zY2FuQ29tbWFuZChmb3JjZUFjdGl2ZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU3BlY2lmaWVzIHdoZXRoZXIgdGhlIHN1cHBsaWNhbnQgb3IgZHJpdmVyCi0gICAgICogdGFrZSBjYXJlIG9mIGluaXRpYXRpbmcgc2NhbiBhbmQgZG9pbmcgQVAgc2VsZWN0aW9uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbW9kZQotICAgICAqICAgIFNVUFBMX1NDQU5fSEFORExJTkdfTk9STUFMCi0gICAgICogICAgU1VQUExfU0NBTl9IQU5ETElOR19MSVNUX09OTFkKLSAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGUgb3BlcmF0aW9uIHN1Y2NlZWRzLCB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZQotICAgICAqLwotICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgYm9vbGVhbiBzZXRTY2FuUmVzdWx0SGFuZGxpbmcoaW50IG1vZGUpIHsKLSAgICAgICAgaWYgKG1XaWZpU3RhdGUuZ2V0KCkgIT0gV0lGSV9TVEFURV9FTkFCTEVEKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIFdpZmlOYXRpdmUuc2V0U2NhblJlc3VsdEhhbmRsaW5nQ29tbWFuZChtb2RlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBGZXRjaCB0aGUgc2NhbiByZXN1bHRzIGZyb20gdGhlIHN1cHBsaWNhbnQKLSAgICAgKgotICAgICAqIEByZXR1cm4gZXhhbXBsZSByZXN1bHQgc3RyaW5nCi0gICAgICogMDA6YmI6Y2M6ZGQ6Y2M6ZWUgICAgICAgMjQyNyAgICAxNjYgICAgIFtXUEEtRUFQLVRLSVBdW1dQQTItRUFQLUNDTVBdICAgTmV0MQotICAgICAqIDAwOmJiOmNjOmRkOmNjOmZmICAgICAgIDI0MTIgICAgMTY1ICAgICBbV1BBLUVBUC1US0lQXVtXUEEyLUVBUC1DQ01QXSAgIE5ldDIKLSAgICAgKi8KLSAgICBwdWJsaWMgc3luY2hyb25pemVkIFN0cmluZyBzY2FuUmVzdWx0cygpIHsKLSAgICAgICAgaWYgKG1XaWZpU3RhdGUuZ2V0KCkgIT0gV0lGSV9TVEFURV9FTkFCTEVEIHx8IGlzRHJpdmVyU3RvcHBlZCgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gV2lmaU5hdGl2ZS5zY2FuUmVzdWx0c0NvbW1hbmQoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXQgdGhlIHNjYW4gbW9kZSAtIGFjdGl2ZSBvciBwYXNzaXZlCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGUgb3BlcmF0aW9uIHN1Y2NlZWRzLCB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZQotICAgICAqLwotICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgYm9vbGVhbiBzZXRTY2FuTW9kZShib29sZWFuIGlzU2Nhbk1vZGVBY3RpdmUpIHsKLSAgICAgICAgaWYgKG1XaWZpU3RhdGUuZ2V0KCkgIT0gV0lGSV9TVEFURV9FTkFCTEVEIHx8IGlzRHJpdmVyU3RvcHBlZCgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG1Jc1NjYW5Nb2RlQWN0aXZlICE9IGlzU2Nhbk1vZGVBY3RpdmUpIHsKLSAgICAgICAgICAgIHJldHVybiBXaWZpTmF0aXZlLnNldFNjYW5Nb2RlQ29tbWFuZChtSXNTY2FuTW9kZUFjdGl2ZSA9IGlzU2Nhbk1vZGVBY3RpdmUpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIERpc2Nvbm5lY3QgZnJvbSBBY2Nlc3MgUG9pbnQKLSAgICAgKgotICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoZSBvcGVyYXRpb24gc3VjY2VlZHMsIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlCi0gICAgICovCi0gICAgcHVibGljIHN5bmNocm9uaXplZCBib29sZWFuIGRpc2Nvbm5lY3QoKSB7Ci0gICAgICAgIGlmIChtV2lmaVN0YXRlLmdldCgpICE9IFdJRklfU1RBVEVfRU5BQkxFRCB8fCBpc0RyaXZlclN0b3BwZWQoKSkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBXaWZpTmF0aXZlLmRpc2Nvbm5lY3RDb21tYW5kKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSW5pdGlhdGUgYSByZWNvbm5lY3Rpb24gdG8gQVAKLSAgICAgKgotICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoZSBvcGVyYXRpb24gc3VjY2VlZHMsIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlCi0gICAgICovCi0gICAgcHVibGljIHN5bmNocm9uaXplZCBib29sZWFuIHJlY29ubmVjdENvbW1hbmQoKSB7Ci0gICAgICAgIGlmIChtV2lmaVN0YXRlLmdldCgpICE9IFdJRklfU1RBVEVfRU5BQkxFRCB8fCBpc0RyaXZlclN0b3BwZWQoKSkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBXaWZpTmF0aXZlLnJlY29ubmVjdENvbW1hbmQoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBZGQgYSBuZXR3b3JrCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIG5ldHdvcmsgaWQgb2YgdGhlIG5ldyBuZXR3b3JrCi0gICAgICovCi0gICAgcHVibGljIHN5bmNocm9uaXplZCBpbnQgYWRkTmV0d29yaygpIHsKLSAgICAgICAgaWYgKG1XaWZpU3RhdGUuZ2V0KCkgIT0gV0lGSV9TVEFURV9FTkFCTEVEKSB7Ci0gICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIFdpZmlOYXRpdmUuYWRkTmV0d29ya0NvbW1hbmQoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBEZWxldGUgYSBuZXR3b3JrCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbmV0d29ya0lkIGlkIG9mIHRoZSBuZXR3b3JrIHRvIGJlIHJlbW92ZWQKLSAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGUgb3BlcmF0aW9uIHN1Y2NlZWRzLCB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZQotICAgICAqLwotICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgYm9vbGVhbiByZW1vdmVOZXR3b3JrKGludCBuZXR3b3JrSWQpIHsKLSAgICAgICAgaWYgKG1XaWZpU3RhdGUuZ2V0KCkgIT0gV0lGSV9TVEFURV9FTkFCTEVEKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG1EaXNjb25uZWN0RXhwZWN0ZWQgPSBXaWZpTmF0aXZlLnJlbW92ZU5ldHdvcmtDb21tYW5kKG5ldHdvcmtJZCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRW5hYmxlIGEgbmV0d29yawotICAgICAqCi0gICAgICogQHBhcmFtIG5ldElkIG5ldHdvcmsgaWQgb2YgdGhlIG5ldHdvcmsKLSAgICAgKiBAcGFyYW0gZGlzYWJsZU90aGVycyB0cnVlLCBpZiBhbGwgb3RoZXIgbmV0d29ya3MgaGF2ZSB0byBiZSBkaXNhYmxlZAotICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoZSBvcGVyYXRpb24gc3VjY2VlZHMsIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlCi0gICAgICovCi0gICAgcHVibGljIHN5bmNocm9uaXplZCBib29sZWFuIGVuYWJsZU5ldHdvcmsoaW50IG5ldElkLCBib29sZWFuIGRpc2FibGVPdGhlcnMpIHsKLSAgICAgICAgaWYgKG1XaWZpU3RhdGUuZ2V0KCkgIT0gV0lGSV9TVEFURV9FTkFCTEVEKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGRpc2FibGVPdGhlcnMpIG1Jc0FueU5ldHdvcmtEaXNhYmxlZC5zZXQodHJ1ZSk7Ci0gICAgICAgIHJldHVybiBXaWZpTmF0aXZlLmVuYWJsZU5ldHdvcmtDb21tYW5kKG5ldElkLCBkaXNhYmxlT3RoZXJzKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBFbmFibGUgYWxsIG5ldHdvcmtzCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbmV0d29ya3MgbGlzdCBvZiBjb25maWd1cmVkIG5ldHdvcmtzCi0gICAgICovCi0gICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIGVuYWJsZUFsbE5ldHdvcmtzKExpc3Q8V2lmaUNvbmZpZ3VyYXRpb24+IG5ldHdvcmtzKSB7Ci0gICAgICAgIGlmIChtV2lmaVN0YXRlLmdldCgpICE9IFdJRklfU1RBVEVfRU5BQkxFRCkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIG1Jc0FueU5ldHdvcmtEaXNhYmxlZC5zZXQoZmFsc2UpOwotICAgICAgICBmb3IgKFdpZmlDb25maWd1cmF0aW9uIGNvbmZpZyA6IG5ldHdvcmtzKSB7Ci0gICAgICAgICAgICBpZiAoY29uZmlnLnN0YXR1cyA9PSBXaWZpQ29uZmlndXJhdGlvbi5TdGF0dXMuRElTQUJMRUQpIHsKLSAgICAgICAgICAgICAgICBXaWZpTmF0aXZlLmVuYWJsZU5ldHdvcmtDb21tYW5kKGNvbmZpZy5uZXR3b3JrSWQsIGZhbHNlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIERpc2FibGUgYSBuZXR3b3JrCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbmV0SWQgbmV0d29yayBpZCBvZiB0aGUgbmV0d29yawotICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoZSBvcGVyYXRpb24gc3VjY2VlZHMsIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlCi0gICAgICovCi0gICAgcHVibGljIHN5bmNocm9uaXplZCBib29sZWFuIGRpc2FibGVOZXR3b3JrKGludCBuZXRJZCkgewotICAgICAgICBpZiAobVdpZmlTdGF0ZS5nZXQoKSAhPSBXSUZJX1NUQVRFX0VOQUJMRUQpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICBtSXNBbnlOZXR3b3JrRGlzYWJsZWQuc2V0KHRydWUpOwotICAgICAgICByZXR1cm4gV2lmaU5hdGl2ZS5kaXNhYmxlTmV0d29ya0NvbW1hbmQobmV0SWQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEluaXRpYXRlIGEgcmUtYXNzb2NpYXRpb24gaW4gc3VwcGxpY2FudAotICAgICAqCi0gICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhlIG9wZXJhdGlvbiBzdWNjZWVkcywge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UKLSAgICAgKi8KLSAgICBwdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4gcmVhc3NvY2lhdGUoKSB7Ci0gICAgICAgIGlmIChtV2lmaVN0YXRlLmdldCgpICE9IFdJRklfU1RBVEVfRU5BQkxFRCB8fCBpc0RyaXZlclN0b3BwZWQoKSkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBXaWZpTmF0aXZlLnJlYXNzb2NpYXRlQ29tbWFuZCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEJsYWNrbGlzdCBhIEJTU0lELiBUaGlzIHdpbGwgYXZvaWQgdGhlIEFQIGlmIHRoZXJlIGFyZQotICAgICAqIGFsdGVybmF0ZSBBUHMgdG8gY29ubmVjdAotICAgICAqCi0gICAgICogQHBhcmFtIGJzc2lkIEJTU0lEIG9mIHRoZSBuZXR3b3JrCi0gICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhlIG9wZXJhdGlvbiBzdWNjZWVkcywge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UKLSAgICAgKi8KLSAgICBwdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4gYWRkVG9CbGFja2xpc3QoU3RyaW5nIGJzc2lkKSB7Ci0gICAgICAgIGlmIChtV2lmaVN0YXRlLmdldCgpICE9IFdJRklfU1RBVEVfRU5BQkxFRCkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBXaWZpTmF0aXZlLmFkZFRvQmxhY2tsaXN0Q29tbWFuZChic3NpZCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2xlYXIgdGhlIGJsYWNrbGlzdCBsaXN0Ci0gICAgICoKLSAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGUgb3BlcmF0aW9uIHN1Y2NlZWRzLCB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZQotICAgICAqLwotICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgYm9vbGVhbiBjbGVhckJsYWNrbGlzdCgpIHsKLSAgICAgICAgaWYgKG1XaWZpU3RhdGUuZ2V0KCkgIT0gV0lGSV9TVEFURV9FTkFCTEVEKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIFdpZmlOYXRpdmUuY2xlYXJCbGFja2xpc3RDb21tYW5kKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogTGlzdCBhbGwgY29uZmlndXJlZCBuZXR3b3JrcwotICAgICAqCi0gICAgICogQHJldHVybiBsaXN0IG9mIG5ldHdvcmtzIG9yIG51bGwgb24gZmFpbHVyZQotICAgICAqLwotICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgU3RyaW5nIGxpc3ROZXR3b3JrcygpIHsKLSAgICAgICAgaWYgKG1XaWZpU3RhdGUuZ2V0KCkgIT0gV0lGSV9TVEFURV9FTkFCTEVEKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gV2lmaU5hdGl2ZS5saXN0TmV0d29ya3NDb21tYW5kKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0IG5ldHdvcmsgc2V0dGluZyBieSBuYW1lCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbmV0SWQgbmV0d29yayBpZCBvZiB0aGUgbmV0d29yawotICAgICAqIEBwYXJhbSBuYW1lIG5ldHdvcmsgdmFyaWFibGUga2V5Ci0gICAgICogQHJldHVybiB2YWx1ZSBjb3JyZXNwb25kaW5nIHRvIGtleQotICAgICAqLwotICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgU3RyaW5nIGdldE5ldHdvcmtWYXJpYWJsZShpbnQgbmV0SWQsIFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIGlmIChtV2lmaVN0YXRlLmdldCgpICE9IFdJRklfU1RBVEVfRU5BQkxFRCkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIFdpZmlOYXRpdmUuZ2V0TmV0d29ya1ZhcmlhYmxlQ29tbWFuZChuZXRJZCwgbmFtZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0IG5ldHdvcmsgc2V0dGluZyBieSBuYW1lCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbmV0SWQgbmV0d29yayBpZCBvZiB0aGUgbmV0d29yawotICAgICAqIEBwYXJhbSBuYW1lIG5ldHdvcmsgdmFyaWFibGUga2V5Ci0gICAgICogQHBhcmFtIHZhbHVlIG5ldHdvcmsgdmFyaWFibGUgdmFsdWUKLSAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGUgb3BlcmF0aW9uIHN1Y2NlZWRzLCB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZQotICAgICAqLwotICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgYm9vbGVhbiBzZXROZXR3b3JrVmFyaWFibGUoaW50IG5ldElkLCBTdHJpbmcgbmFtZSwgU3RyaW5nIHZhbHVlKSB7Ci0gICAgICAgIGlmIChtV2lmaVN0YXRlLmdldCgpICE9IFdJRklfU1RBVEVfRU5BQkxFRCkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBXaWZpTmF0aXZlLnNldE5ldHdvcmtWYXJpYWJsZUNvbW1hbmQobmV0SWQsIG5hbWUsIHZhbHVlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgZGV0YWlsZWQgc3RhdHVzIG9mIHRoZSBjb25uZWN0aW9uCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIEV4YW1wbGUgc3RhdHVzIHJlc3VsdAotICAgICAqICBic3NpZD1hYTpiYjpjYzpkZDplZTpmZgotICAgICAqICBzc2lkPVRlc3ROZXQKLSAgICAgKiAgaWQ9MwotICAgICAqICBwYWlyd2lzZV9jaXBoZXI9Tk9ORQotICAgICAqICBncm91cF9jaXBoZXI9Tk9ORQotICAgICAqICBrZXlfbWdtdD1OT05FCi0gICAgICogIHdwYV9zdGF0ZT1DT01QTEVURUQKLSAgICAgKiAgaXBfYWRkcmVzcz1YLlguWC5YCi0gICAgICovCi0gICAgcHVibGljIHN5bmNocm9uaXplZCBTdHJpbmcgc3RhdHVzKCkgewotICAgICAgICBpZiAobVdpZmlTdGF0ZS5nZXQoKSAhPSBXSUZJX1NUQVRFX0VOQUJMRUQpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBXaWZpTmF0aXZlLnN0YXR1c0NvbW1hbmQoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgUlNTSSB0byBjdXJyZW50bHkgY29ubmVjdGVkIG5ldHdvcmsKLSAgICAgKgotICAgICAqIEByZXR1cm4gUlNTSSB2YWx1ZSwgLTEgb24gZmFpbHVyZQotICAgICAqLwotICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgaW50IGdldFJzc2koKSB7Ci0gICAgICAgIGlmIChtV2lmaVN0YXRlLmdldCgpICE9IFdJRklfU1RBVEVfRU5BQkxFRCB8fCBpc0RyaXZlclN0b3BwZWQoKSkgewotICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBXaWZpTmF0aXZlLmdldFJzc2lBcHByb3hDb21tYW5kKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0IGFwcHJveCBSU1NJIHRvIGN1cnJlbnRseSBjb25uZWN0ZWQgbmV0d29yawotICAgICAqCi0gICAgICogQHJldHVybiBSU1NJIHZhbHVlLCAtMSBvbiBmYWlsdXJlCi0gICAgICovCi0gICAgcHVibGljIHN5bmNocm9uaXplZCBpbnQgZ2V0UnNzaUFwcHJveCgpIHsKLSAgICAgICAgaWYgKG1XaWZpU3RhdGUuZ2V0KCkgIT0gV0lGSV9TVEFURV9FTkFCTEVEIHx8IGlzRHJpdmVyU3RvcHBlZCgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIFdpZmlOYXRpdmUuZ2V0UnNzaUFwcHJveENvbW1hbmQoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgbGluayBzcGVlZCB0byBjdXJyZW50bHkgY29ubmVjdGVkIG5ldHdvcmsKLSAgICAgKgotICAgICAqIEByZXR1cm4gbGluayBzcGVlZCwgLTEgb24gZmFpbHVyZQotICAgICAqLwotICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgaW50IGdldExpbmtTcGVlZCgpIHsKLSAgICAgICAgaWYgKG1XaWZpU3RhdGUuZ2V0KCkgIT0gV0lGSV9TVEFURV9FTkFCTEVEIHx8IGlzRHJpdmVyU3RvcHBlZCgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIFdpZmlOYXRpdmUuZ2V0TGlua1NwZWVkQ29tbWFuZCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldCBNQUMgYWRkcmVzcyBvZiByYWRpbwotICAgICAqCi0gICAgICogQHJldHVybiBNQUMgYWRkcmVzcywgbnVsbCBvbiBmYWlsdXJlCi0gICAgICovCi0gICAgcHVibGljIHN5bmNocm9uaXplZCBTdHJpbmcgZ2V0TWFjQWRkcmVzcygpIHsKLSAgICAgICAgaWYgKG1XaWZpU3RhdGUuZ2V0KCkgIT0gV0lGSV9TVEFURV9FTkFCTEVEIHx8IGlzRHJpdmVyU3RvcHBlZCgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gV2lmaU5hdGl2ZS5nZXRNYWNBZGRyZXNzQ29tbWFuZCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFN0YXJ0IGRyaXZlcgotICAgICAqCi0gICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhlIG9wZXJhdGlvbiBzdWNjZWVkcywge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UKLSAgICAgKi8KLSAgICBwdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4gc3RhcnREcml2ZXIoKSB7Ci0gICAgICAgIGlmIChtV2lmaVN0YXRlLmdldCgpICE9IFdJRklfU1RBVEVfRU5BQkxFRCkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBXaWZpTmF0aXZlLnN0YXJ0RHJpdmVyQ29tbWFuZCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFN0b3AgZHJpdmVyCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGUgb3BlcmF0aW9uIHN1Y2NlZWRzLCB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZQotICAgICAqLwotICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgYm9vbGVhbiBzdG9wRHJpdmVyKCkgewotICAgICAgICAvKiBEcml2ZXIgc3RvcCBzaG91bGQgbm90IGhhcHBlbiBvbmx5IHdoZW4gc3VwcGxpY2FudCBldmVudAotICAgICAgICAgKiBEUklWRVJfU1RPUFBFRCBoYXMgYWxyZWFkeSBiZWVuIGhhbmRsZWQgKi8KLSAgICAgICAgaWYgKG1XaWZpU3RhdGUuZ2V0KCkgIT0gV0lGSV9TVEFURV9FTkFCTEVEIHx8IG1SdW5TdGF0ZSA9PSBSVU5fU1RBVEVfU1RPUFBFRCkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBXaWZpTmF0aXZlLnN0b3BEcml2ZXJDb21tYW5kKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU3RhcnQgcGFja2V0IGZpbHRlcmluZwotICAgICAqCi0gICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhlIG9wZXJhdGlvbiBzdWNjZWVkcywge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UKLSAgICAgKi8KLSAgICBwdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4gc3RhcnRQYWNrZXRGaWx0ZXJpbmcoKSB7Ci0gICAgICAgIGlmIChtV2lmaVN0YXRlLmdldCgpICE9IFdJRklfU1RBVEVfRU5BQkxFRCB8fCBpc0RyaXZlclN0b3BwZWQoKSkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBXaWZpTmF0aXZlLnN0YXJ0UGFja2V0RmlsdGVyaW5nKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU3RvcCBwYWNrZXQgZmlsdGVyaW5nCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGUgb3BlcmF0aW9uIHN1Y2NlZWRzLCB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZQotICAgICAqLwotICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgYm9vbGVhbiBzdG9wUGFja2V0RmlsdGVyaW5nKCkgewotICAgICAgICBpZiAobVdpZmlTdGF0ZS5nZXQoKSAhPSBXSUZJX1NUQVRFX0VOQUJMRUQgfHwgaXNEcml2ZXJTdG9wcGVkKCkpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gV2lmaU5hdGl2ZS5zdG9wUGFja2V0RmlsdGVyaW5nKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0IHBvd2VyIG1vZGUKLSAgICAgKiBAcmV0dXJuIHBvd2VyIG1vZGUKLSAgICAgKi8KLSAgICBwdWJsaWMgc3luY2hyb25pemVkIGludCBnZXRQb3dlck1vZGUoKSB7Ci0gICAgICAgIGlmIChtV2lmaVN0YXRlLmdldCgpICE9IFdJRklfU1RBVEVfRU5BQkxFRCAmJiAhaXNEcml2ZXJTdG9wcGVkKCkpIHsKLSAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gV2lmaU5hdGl2ZS5nZXRQb3dlck1vZGVDb21tYW5kKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0IHBvd2VyIG1vZGUKLSAgICAgKiBAcGFyYW0gbW9kZQotICAgICAqICAgICBEUklWRVJfUE9XRVJfTU9ERV9BVVRPCi0gICAgICogICAgIERSSVZFUl9QT1dFUl9NT0RFX0FDVElWRQotICAgICAqCi0gICAgICogVXNlcyByZWZlcmVuY2UgY291bnRpbmcgdG8ga2VlcCBwb3dlciBtb2RlIGFjdGl2ZQotICAgICAqIGFzIGxvbmcgYXMgb25lIGVudGl0eSB3YW50cyBwb3dlciBtb2RlIHRvIGJlIGFjdGl2ZS4KLSAgICAgKgotICAgICAqIEZvciBleGFtcGxlLCBXaWZpTG9jayBoaWdoIHBlcmYgbW9kZSBjYW4ga2VlcCBwb3dlciBtb2RlIGFjdGl2ZQotICAgICAqIG9yIGEgREhDUCBzZXNzaW9uIGNhbiBrZWVwIGl0IGFjdGl2ZS4gQXMgbG9uZyBhcyBvbmUgZW50aXR5IHdhbnRzCi0gICAgICogaXQgZW5hYmxlZCwgaXQgc2hvdWxkIHN0YXkgdGhhdCB3YXkKLSAgICAgKgotICAgICAqLwotICAgIHByaXZhdGUgc3luY2hyb25pemVkIHZvaWQgc2V0UG93ZXJNb2RlKGludCBtb2RlKSB7Ci0KLSAgICAgICAgLyogSXQgaXMgZ29vZCB0byBwbHVtYiBwb3dlciBtb2RlIGNoYW5nZQotICAgICAgICAgKiBldmVuIGlmIHJlZiBjb3VudCBpbmRpY2F0ZXMgYWxyZWFkeSBkb25lCi0gICAgICAgICAqIHNpbmNlIHdlIGNvdWxkIGhhdmUgYSBjYXNlIG9mIHByZXZpb3VzIGZhaWx1cmUuCi0gICAgICAgICAqLwotICAgICAgICBzd2l0Y2gobW9kZSkgewotICAgICAgICAgICAgY2FzZSBEUklWRVJfUE9XRVJfTU9ERV9BQ1RJVkU6Ci0gICAgICAgICAgICAgICAgbVBvd2VyTW9kZVJlZkNvdW50Kys7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIERSSVZFUl9QT1dFUl9NT0RFX0FVVE86Ci0gICAgICAgICAgICAgICAgbVBvd2VyTW9kZVJlZkNvdW50LS07Ci0gICAgICAgICAgICAgICAgaWYgKG1Qb3dlck1vZGVSZWZDb3VudCA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIC8qIEtlZXAgcmVmY291bnQgZnJvbSBiZWNvbWluZyBuZWdhdGl2ZSAqLwotICAgICAgICAgICAgICAgICAgICBtUG93ZXJNb2RlUmVmQ291bnQgPSAwOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtV2lmaVN0YXRlLmdldCgpICE9IFdJRklfU1RBVEVfRU5BQkxFRCB8fCBpc0RyaXZlclN0b3BwZWQoKSkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgV2lmaU5hdGl2ZS5zZXRQb3dlck1vZGVDb21tYW5kKG1vZGUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldCB0aGUgbnVtYmVyIG9mIGFsbG93ZWQgcmFkaW8gZnJlcXVlbmN5IGNoYW5uZWxzIGZyb20gdGhlIHN5c3RlbQotICAgICAqIHNldHRpbmcgdmFsdWUsIGlmIGFueS4KLSAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGUgb3BlcmF0aW9uIHN1Y2NlZWRzLCB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZSwgZS5nLiwKLSAgICAgKiB0aGUgbnVtYmVyIG9mIGNoYW5uZWxzIGlzIGludmFsaWQuCi0gICAgICovCi0gICAgcHVibGljIHN5bmNocm9uaXplZCBib29sZWFuIHNldE51bUFsbG93ZWRDaGFubmVscygpIHsKLSAgICAgICAgaWYgKG1XaWZpU3RhdGUuZ2V0KCkgIT0gV0lGSV9TVEFURV9FTkFCTEVEIHx8IGlzRHJpdmVyU3RvcHBlZCgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJldHVybiBzZXROdW1BbGxvd2VkQ2hhbm5lbHMoCi0gICAgICAgICAgICAgICAgICAgIFNldHRpbmdzLlNlY3VyZS5nZXRJbnQobUNvbnRleHQuZ2V0Q29udGVudFJlc29sdmVyKCksCi0gICAgICAgICAgICAgICAgICAgIFNldHRpbmdzLlNlY3VyZS5XSUZJX05VTV9BTExPV0VEX0NIQU5ORUxTKSk7Ci0gICAgICAgIH0gY2F0Y2ggKFNldHRpbmdzLlNldHRpbmdOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBpZiAobU51bUFsbG93ZWRDaGFubmVscyAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgV2lmaU5hdGl2ZS5zZXROdW1BbGxvd2VkQ2hhbm5lbHNDb21tYW5kKG1OdW1BbGxvd2VkQ2hhbm5lbHMpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gb3RoZXJ3aXNlLCB1c2UgdGhlIGRyaXZlciBkZWZhdWx0Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0IHRoZSBudW1iZXIgb2YgcmFkaW8gZnJlcXVlbmN5IGNoYW5uZWxzIHRoYXQgYXJlIGFsbG93ZWQgdG8gYmUgdXNlZAotICAgICAqIGluIHRoZSBjdXJyZW50IHJlZ3VsYXRvcnkgZG9tYWluLgotICAgICAqIEBwYXJhbSBudW1DaGFubmVscyB0aGUgbnVtYmVyIG9mIGFsbG93ZWQgY2hhbm5lbHMuIE11c3QgYmUgZ3JlYXRlciB0aGFuIDAKLSAgICAgKiBhbmQgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIDE2LgotICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoZSBvcGVyYXRpb24gc3VjY2VlZHMsIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlLCBlLmcuLAotICAgICAqIHtAY29kZSBudW1DaGFubmVsc30gaXMgb3V0c2lkZSB0aGUgdmFsaWQgcmFuZ2UuCi0gICAgICovCi0gICAgcHVibGljIHN5bmNocm9uaXplZCBib29sZWFuIHNldE51bUFsbG93ZWRDaGFubmVscyhpbnQgbnVtQ2hhbm5lbHMpIHsKLSAgICAgICAgaWYgKG1XaWZpU3RhdGUuZ2V0KCkgIT0gV0lGSV9TVEFURV9FTkFCTEVEIHx8IGlzRHJpdmVyU3RvcHBlZCgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgbU51bUFsbG93ZWRDaGFubmVscyA9IG51bUNoYW5uZWxzOwotICAgICAgICByZXR1cm4gV2lmaU5hdGl2ZS5zZXROdW1BbGxvd2VkQ2hhbm5lbHNDb21tYW5kKG51bUNoYW5uZWxzKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgbnVtYmVyIG9mIGFsbG93ZWQgY2hhbm5lbHMKLSAgICAgKgotICAgICAqIEByZXR1cm4gY2hhbm5lbCBjb3VudCwgLTEgb24gZmFpbHVyZQotICAgICAqLwotICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgaW50IGdldE51bUFsbG93ZWRDaGFubmVscygpIHsKLSAgICAgICAgaWYgKG1XaWZpU3RhdGUuZ2V0KCkgIT0gV0lGSV9TVEFURV9FTkFCTEVEIHx8IGlzRHJpdmVyU3RvcHBlZCgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIFdpZmlOYXRpdmUuZ2V0TnVtQWxsb3dlZENoYW5uZWxzQ29tbWFuZCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldCBibHVldG9vdGggY29leCBtb2RlOgotICAgICAqCi0gICAgICogQHBhcmFtIG1vZGUKLSAgICAgKiAgQkxVRVRPT1RIX0NPRVhJU1RFTkNFX01PREVfRU5BQkxFRAotICAgICAqICBCTFVFVE9PVEhfQ09FWElTVEVOQ0VfTU9ERV9ESVNBQkxFRAotICAgICAqICBCTFVFVE9PVEhfQ09FWElTVEVOQ0VfTU9ERV9TRU5TRQotICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoZSBvcGVyYXRpb24gc3VjY2VlZHMsIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlCi0gICAgICovCi0gICAgcHVibGljIHN5bmNocm9uaXplZCBib29sZWFuIHNldEJsdWV0b290aENvZXhpc3RlbmNlTW9kZShpbnQgbW9kZSkgewotICAgICAgICBpZiAobVdpZmlTdGF0ZS5nZXQoKSAhPSBXSUZJX1NUQVRFX0VOQUJMRUQgfHwgaXNEcml2ZXJTdG9wcGVkKCkpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gV2lmaU5hdGl2ZS5zZXRCbHVldG9vdGhDb2V4aXN0ZW5jZU1vZGVDb21tYW5kKG1vZGUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEVuYWJsZSBvciBkaXNhYmxlIEJsdWV0b290aCBjb2V4aXN0ZW5jZSBzY2FuIG1vZGUuIFdoZW4gdGhpcyBtb2RlIGlzIG9uLAotICAgICAqIHNvbWUgb2YgdGhlIGxvdy1sZXZlbCBzY2FuIHBhcmFtZXRlcnMgdXNlZCBieSB0aGUgZHJpdmVyIGFyZSBjaGFuZ2VkIHRvCi0gICAgICogcmVkdWNlIGludGVyZmVyZW5jZSB3aXRoIEEyRFAgc3RyZWFtaW5nLgotICAgICAqCi0gICAgICogQHBhcmFtIGlzQmx1ZXRvb3RoUGxheWluZyB3aGV0aGVyIHRvIGVuYWJsZSBvciBkaXNhYmxlIHRoaXMgbW9kZQotICAgICAqLwotICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBzZXRCbHVldG9vdGhTY2FuTW9kZShib29sZWFuIGlzQmx1ZXRvb3RoUGxheWluZykgewotICAgICAgICBpZiAobVdpZmlTdGF0ZS5nZXQoKSAhPSBXSUZJX1NUQVRFX0VOQUJMRUQgfHwgaXNEcml2ZXJTdG9wcGVkKCkpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBXaWZpTmF0aXZlLnNldEJsdWV0b290aENvZXhpc3RlbmNlU2Nhbk1vZGVDb21tYW5kKGlzQmx1ZXRvb3RoUGxheWluZyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2F2ZSBjb25maWd1cmF0aW9uIG9uIHN1cHBsaWNhbnQKLSAgICAgKgotICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoZSBvcGVyYXRpb24gc3VjY2VlZHMsIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlCi0gICAgICovCi0gICAgcHVibGljIHN5bmNocm9uaXplZCBib29sZWFuIHNhdmVDb25maWcoKSB7Ci0gICAgICAgIGlmIChtV2lmaVN0YXRlLmdldCgpICE9IFdJRklfU1RBVEVfRU5BQkxFRCkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBXaWZpTmF0aXZlLnNhdmVDb25maWdDb21tYW5kKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVsb2FkIHRoZSBjb25maWd1cmF0aW9uIGZyb20gZmlsZQotICAgICAqCi0gICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhlIG9wZXJhdGlvbiBzdWNjZWVkcywge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UKLSAgICAgKi8KLSAgICBwdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4gcmVsb2FkQ29uZmlnKCkgewotICAgICAgICBpZiAobVdpZmlTdGF0ZS5nZXQoKSAhPSBXSUZJX1NUQVRFX0VOQUJMRUQpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gV2lmaU5hdGl2ZS5yZWxvYWRDb25maWdDb21tYW5kKCk7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gc2V0UmFkaW8oYm9vbGVhbiB0dXJuT24pIHsKLSAgICAgICAgcmV0dXJuIG1XTS5zZXRXaWZpRW5hYmxlZCh0dXJuT24pOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgKiBUaGVyZSBhcmUgY3VycmVudGx5IG5vIFdpLUZpLXNwZWNpZmljIGZlYXR1cmVzIHN1cHBvcnRlZC4KLSAgICAgKiBAcGFyYW0gZmVhdHVyZSB0aGUgbmFtZSBvZiB0aGUgZmVhdHVyZQotICAgICAqIEByZXR1cm4ge0Bjb2RlIC0xfSBpbmRpY2F0aW5nIGZhaWx1cmUsIGFsd2F5cworICAgICAqIFRlbGxzIHRoZSB1bmRlcmx5aW5nIG5ldHdvcmtpbmcgc3lzdGVtIHRoYXQgdGhlIGNhbGxlciB3YW50cyB0bworICAgICAqIGJlZ2luIHVzaW5nIHRoZSBuYW1lZCBmZWF0dXJlLiBUaGUgaW50ZXJwcmV0YXRpb24gb2Yge0Bjb2RlIGZlYXR1cmV9CisgICAgICogaXMgY29tcGxldGVseSB1cCB0byBlYWNoIG5ldHdvcmtpbmcgaW1wbGVtZW50YXRpb24uCisgICAgICogQHBhcmFtIGZlYXR1cmUgdGhlIG5hbWUgb2YgdGhlIGZlYXR1cmUgdG8gYmUgdXNlZAorICAgICAqIEBwYXJhbSBjYWxsaW5nUGlkIHRoZSBwcm9jZXNzIElEIG9mIHRoZSBwcm9jZXNzIHRoYXQgaXMgaXNzdWluZyB0aGlzIHJlcXVlc3QKKyAgICAgKiBAcGFyYW0gY2FsbGluZ1VpZCB0aGUgdXNlciBJRCBvZiB0aGUgcHJvY2VzcyB0aGF0IGlzIGlzc3VpbmcgdGhpcyByZXF1ZXN0CisgICAgICogQHJldHVybiBhbiBpbnRlZ2VyIHZhbHVlIHJlcHJlc2VudGluZyB0aGUgb3V0Y29tZSBvZiB0aGUgcmVxdWVzdC4KKyAgICAgKiBUaGUgaW50ZXJwcmV0YXRpb24gb2YgdGhpcyB2YWx1ZSBpcyBzcGVjaWZpYyB0byBlYWNoIG5ldHdvcmtpbmcKKyAgICAgKiBpbXBsZW1lbnRhdGlvbitmZWF0dXJlIGNvbWJpbmF0aW9uLCBleGNlcHQgdGhhdCB0aGUgdmFsdWUge0Bjb2RlIC0xfQorICAgICAqIGFsd2F5cyBpbmRpY2F0ZXMgZmFpbHVyZS4KKyAgICAgKiBUT0RPOiBuZWVkcyB0byBnbyBhd2F5CiAgICAgICovCiAgICAgcHVibGljIGludCBzdGFydFVzaW5nTmV0d29ya0ZlYXR1cmUoU3RyaW5nIGZlYXR1cmUsIGludCBjYWxsaW5nUGlkLCBpbnQgY2FsbGluZ1VpZCkgewogICAgICAgICByZXR1cm4gLTE7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICoge0Bpbmhlcml0RG9jfQotICAgICAqIFRoZXJlIGFyZSBjdXJyZW50bHkgbm8gV2ktRmktc3BlY2lmaWMgZmVhdHVyZXMgc3VwcG9ydGVkLgotICAgICAqIEBwYXJhbSBmZWF0dXJlIHRoZSBuYW1lIG9mIHRoZSBmZWF0dXJlCi0gICAgICogQHJldHVybiB7QGNvZGUgLTF9IGluZGljYXRpbmcgZmFpbHVyZSwgYWx3YXlzCisgICAgICogVGVsbHMgdGhlIHVuZGVybHlpbmcgbmV0d29ya2luZyBzeXN0ZW0gdGhhdCB0aGUgY2FsbGVyIGlzIGZpbmlzaGVkCisgICAgICogdXNpbmcgdGhlIG5hbWVkIGZlYXR1cmUuIFRoZSBpbnRlcnByZXRhdGlvbiBvZiB7QGNvZGUgZmVhdHVyZX0KKyAgICAgKiBpcyBjb21wbGV0ZWx5IHVwIHRvIGVhY2ggbmV0d29ya2luZyBpbXBsZW1lbnRhdGlvbi4KKyAgICAgKiBAcGFyYW0gZmVhdHVyZSB0aGUgbmFtZSBvZiB0aGUgZmVhdHVyZSB0aGF0IGlzIG5vIGxvbmdlciBuZWVkZWQuCisgICAgICogQHBhcmFtIGNhbGxpbmdQaWQgdGhlIHByb2Nlc3MgSUQgb2YgdGhlIHByb2Nlc3MgdGhhdCBpcyBpc3N1aW5nIHRoaXMgcmVxdWVzdAorICAgICAqIEBwYXJhbSBjYWxsaW5nVWlkIHRoZSB1c2VyIElEIG9mIHRoZSBwcm9jZXNzIHRoYXQgaXMgaXNzdWluZyB0aGlzIHJlcXVlc3QKKyAgICAgKiBAcmV0dXJuIGFuIGludGVnZXIgdmFsdWUgcmVwcmVzZW50aW5nIHRoZSBvdXRjb21lIG9mIHRoZSByZXF1ZXN0LgorICAgICAqIFRoZSBpbnRlcnByZXRhdGlvbiBvZiB0aGlzIHZhbHVlIGlzIHNwZWNpZmljIHRvIGVhY2ggbmV0d29ya2luZworICAgICAqIGltcGxlbWVudGF0aW9uK2ZlYXR1cmUgY29tYmluYXRpb24sIGV4Y2VwdCB0aGF0IHRoZSB2YWx1ZSB7QGNvZGUgLTF9CisgICAgICogYWx3YXlzIGluZGljYXRlcyBmYWlsdXJlLgorICAgICAqIFRPRE86IG5lZWRzIHRvIGdvIGF3YXkKICAgICAgKi8KICAgICBwdWJsaWMgaW50IHN0b3BVc2luZ05ldHdvcmtGZWF0dXJlKFN0cmluZyBmZWF0dXJlLCBpbnQgY2FsbGluZ1BpZCwgaW50IGNhbGxpbmdVaWQpIHsKICAgICAgICAgcmV0dXJuIC0xOwogICAgIH0KIAotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGludGVycHJldFNjYW5SZXN1bHRzQXZhaWxhYmxlKCkgewotCi0gICAgICAgIC8vIElmIHdlIHNob3VsZG4ndCBwbGFjZSBhIG5vdGlmaWNhdGlvbiBvbiBhdmFpbGFibGUgbmV0d29ya3MsIHRoZW4KLSAgICAgICAgLy8gZG9uJ3QgYm90aGVyIGRvaW5nIGFueSBvZiB0aGUgZm9sbG93aW5nCi0gICAgICAgIGlmICghbU5vdGlmaWNhdGlvbkVuYWJsZWQpIHJldHVybjsKLQotICAgICAgICBOZXR3b3JrSW5mbyBuZXR3b3JrSW5mbyA9IGdldE5ldHdvcmtJbmZvKCk7Ci0KLSAgICAgICAgU3RhdGUgc3RhdGUgPSBuZXR3b3JrSW5mby5nZXRTdGF0ZSgpOwotICAgICAgICBpZiAoKHN0YXRlID09IE5ldHdvcmtJbmZvLlN0YXRlLkRJU0NPTk5FQ1RFRCkKLSAgICAgICAgICAgICAgICB8fCAoc3RhdGUgPT0gTmV0d29ya0luZm8uU3RhdGUuVU5LTk9XTikpIHsKLQotICAgICAgICAgICAgLy8gTG9vayBmb3IgYW4gb3BlbiBuZXR3b3JrCi0gICAgICAgICAgICBMaXN0PFNjYW5SZXN1bHQ+IHNjYW5SZXN1bHRzID0gZ2V0U2NhblJlc3VsdHNMaXN0KCk7Ci0gICAgICAgICAgICBpZiAoc2NhblJlc3VsdHMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGludCBudW1PcGVuTmV0d29ya3MgPSAwOwotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSBzY2FuUmVzdWx0cy5zaXplKCkgLSAxOyBpID49IDA7IGktLSkgewotICAgICAgICAgICAgICAgICAgICBTY2FuUmVzdWx0IHNjYW5SZXN1bHQgPSBzY2FuUmVzdWx0cy5nZXQoaSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKFRleHRVdGlscy5pc0VtcHR5KHNjYW5SZXN1bHQuY2FwYWJpbGl0aWVzKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgbnVtT3Blbk5ldHdvcmtzKys7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBpZiAobnVtT3Blbk5ldHdvcmtzID4gMCkgewotICAgICAgICAgICAgICAgICAgICBpZiAoKyttTnVtU2NhbnNTaW5jZU5ldHdvcmtTdGF0ZUNoYW5nZSA+PSBOVU1fU0NBTlNfQkVGT1JFX0FDVFVBTExZX1NDQU5OSU5HKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKgotICAgICAgICAgICAgICAgICAgICAgICAgICogV2UndmUgc2Nhbm5lZCBjb250aW51b3VzbHkgYXQgbGVhc3QKLSAgICAgICAgICAgICAgICAgICAgICAgICAqIE5VTV9TQ0FOU19CRUZPUkVfTk9USUZJQ0FUSU9OIHRpbWVzLiBUaGUgdXNlcgotICAgICAgICAgICAgICAgICAgICAgICAgICogcHJvYmFibHkgZG9lcyBub3QgaGF2ZSBhIHJlbWVtYmVyZWQgbmV0d29yayBpbiByYW5nZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAqIHNpbmNlIG90aGVyd2lzZSBzdXBwbGljYW50IHdvdWxkIGhhdmUgdHJpZWQgdG8KLSAgICAgICAgICAgICAgICAgICAgICAgICAqIGFzc29jaWF0ZSBhbmQgdGh1cyByZXNldHRpbmcgdGhpcyBjb3VudGVyLgotICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgICAgICAgICBzZXROb3RpZmljYXRpb25WaXNpYmxlKHRydWUsIG51bU9wZW5OZXR3b3JrcywgZmFsc2UsIDApOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIC8vIE5vIG9wZW4gbmV0d29ya3MgaW4gcmFuZ2UsIHJlbW92ZSB0aGUgbm90aWZpY2F0aW9uCi0gICAgICAgIHNldE5vdGlmaWNhdGlvblZpc2libGUoZmFsc2UsIDAsIGZhbHNlLCAwKTsKKyAgICAvKioKKyAgICAgKiBDaGVjayBpZiBwcml2YXRlIEROUyByb3V0ZSBpcyBzZXQgZm9yIHRoZSBuZXR3b3JrCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNQcml2YXRlRG5zUm91dGVTZXQoKSB7CisgICAgICAgIHJldHVybiBtUHJpdmF0ZURuc1JvdXRlU2V0LmdldCgpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIERpc3BsYXkgb3IgZG9uJ3QgZGlzcGxheSBhIG5vdGlmaWNhdGlvbiB0aGF0IHRoZXJlIGFyZSBvcGVuIFdpLUZpIG5ldHdvcmtzLgotICAgICAqIEBwYXJhbSB2aXNpYmxlIHtAY29kZSB0cnVlfSBpZiBub3RpZmljYXRpb24gc2hvdWxkIGJlIHZpc2libGUsIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlCi0gICAgICogQHBhcmFtIG51bU5ldHdvcmtzIHRoZSBudW1iZXIgbmV0d29ya3Mgc2VlbgotICAgICAqIEBwYXJhbSBmb3JjZSB7QGNvZGUgdHJ1ZX0gdG8gZm9yY2Ugbm90aWZpY2F0aW9uIHRvIGJlIHNob3duL25vdC1zaG93biwKLSAgICAgKiBldmVuIGlmIGl0IGlzIGFscmVhZHkgc2hvd24vbm90LXNob3duLgotICAgICAqIEBwYXJhbSBkZWxheSB0aW1lIGluIG1pbGxpc2Vjb25kcyBhZnRlciB3aGljaCB0aGUgbm90aWZpY2F0aW9uIHNob3VsZCBiZSBtYWRlCi0gICAgICogdmlzaWJsZSBvciBpbnZpc2libGUuCisgICAgICogU2V0IGEgZmxhZyBpbmRpY2F0aW5nIHByaXZhdGUgRE5TIHJvdXRlIGlzIHNldAogICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldE5vdGlmaWNhdGlvblZpc2libGUoYm9vbGVhbiB2aXNpYmxlLCBpbnQgbnVtTmV0d29ya3MsIGJvb2xlYW4gZm9yY2UsIGludCBkZWxheSkgewotICAgICAgICAKLSAgICAgICAgLy8gU2luY2Ugd2UgdXNlIGF1dG8gY2FuY2VsIG9uIHRoZSBub3RpZmljYXRpb24sIHdoZW4gdGhlCi0gICAgICAgIC8vIG1OZXR3b3Jrc0F2YWlsYWJsZU5vdGlmaWNhdGlvblNob3duIGlzIHRydWUsIHRoZSBub3RpZmljYXRpb24gbWF5Ci0gICAgICAgIC8vIGhhdmUgYWN0dWFsbHkgYmVlbiBjYW5jZWxlZC4gIEhvd2V2ZXIsIHdoZW4gaXQgaXMgZmFsc2Ugd2Uga25vdwotICAgICAgICAvLyBmb3Igc3VyZSB0aGF0IGl0IGlzIG5vdCBiZWluZyBzaG93biAoaXQgd2lsbCBub3QgYmUgc2hvd24gYW55IG90aGVyCi0gICAgICAgIC8vIHBsYWNlIHRoYW4gaGVyZSkKLSAgICAgICAgCi0gICAgICAgIC8vIElmIGl0IHNob3VsZCBiZSBoaWRkZW4gYW5kIGl0IGlzIGFscmVhZHkgaGlkZGVuLCB0aGVuIG5vb3AKLSAgICAgICAgaWYgKCF2aXNpYmxlICYmICFtTm90aWZpY2F0aW9uU2hvd24gJiYgIWZvcmNlKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBNZXNzYWdlIG1lc3NhZ2U7Ci0gICAgICAgIGlmICh2aXNpYmxlKSB7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIC8vIE5vdCBlbm91Z2ggdGltZSBoYXMgcGFzc2VkIHRvIHNob3cgdGhlIG5vdGlmaWNhdGlvbiBhZ2FpbgotICAgICAgICAgICAgaWYgKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIDwgbU5vdGlmaWNhdGlvblJlcGVhdFRpbWUpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmIChtTm90aWZpY2F0aW9uID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAvLyBDYWNoZSB0aGUgTm90aWZpY2F0aW9uIG1haW5seSBzbyB3ZSBjYW4gcmVtb3ZlIHRoZQotICAgICAgICAgICAgICAgIC8vIEVWRU5UX05PVElGSUNBVElPTl9DSEFOR0VEIG1lc3NhZ2Ugd2l0aCB0aGlzIE5vdGlmaWNhdGlvbiBmcm9tCi0gICAgICAgICAgICAgICAgLy8gdGhlIHF1ZXVlIGxhdGVyCi0gICAgICAgICAgICAgICAgbU5vdGlmaWNhdGlvbiA9IG5ldyBOb3RpZmljYXRpb24oKTsKLSAgICAgICAgICAgICAgICBtTm90aWZpY2F0aW9uLndoZW4gPSAwOwotICAgICAgICAgICAgICAgIG1Ob3RpZmljYXRpb24uaWNvbiA9IElDT05fTkVUV09SS1NfQVZBSUxBQkxFOwotICAgICAgICAgICAgICAgIG1Ob3RpZmljYXRpb24uZmxhZ3MgPSBOb3RpZmljYXRpb24uRkxBR19BVVRPX0NBTkNFTDsKLSAgICAgICAgICAgICAgICBtTm90aWZpY2F0aW9uLmNvbnRlbnRJbnRlbnQgPSBQZW5kaW5nSW50ZW50LmdldEFjdGl2aXR5KG1Db250ZXh0LCAwLAotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEludGVudChXaWZpTWFuYWdlci5BQ1RJT05fUElDS19XSUZJX05FVFdPUkspLCAwKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgQ2hhclNlcXVlbmNlIHRpdGxlID0gbUNvbnRleHQuZ2V0UmVzb3VyY2VzKCkuZ2V0UXVhbnRpdHlUZXh0KAotICAgICAgICAgICAgICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnBsdXJhbHMud2lmaV9hdmFpbGFibGUsIG51bU5ldHdvcmtzKTsKLSAgICAgICAgICAgIENoYXJTZXF1ZW5jZSBkZXRhaWxzID0gbUNvbnRleHQuZ2V0UmVzb3VyY2VzKCkuZ2V0UXVhbnRpdHlUZXh0KAotICAgICAgICAgICAgICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnBsdXJhbHMud2lmaV9hdmFpbGFibGVfZGV0YWlsZWQsIG51bU5ldHdvcmtzKTsKLSAgICAgICAgICAgIG1Ob3RpZmljYXRpb24udGlja2VyVGV4dCA9IHRpdGxlOwotICAgICAgICAgICAgbU5vdGlmaWNhdGlvbi5zZXRMYXRlc3RFdmVudEluZm8obUNvbnRleHQsIHRpdGxlLCBkZXRhaWxzLCBtTm90aWZpY2F0aW9uLmNvbnRlbnRJbnRlbnQpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBtTm90aWZpY2F0aW9uUmVwZWF0VGltZSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpICsgTk9USUZJQ0FUSU9OX1JFUEVBVF9ERUxBWV9NUzsKLQotICAgICAgICAgICAgbWVzc2FnZSA9IG1UYXJnZXQub2J0YWluTWVzc2FnZShFVkVOVF9OT1RJRklDQVRJT05fQ0hBTkdFRCwgMSwKLSAgICAgICAgICAgICAgICAgICAgSUNPTl9ORVRXT1JLU19BVkFJTEFCTEUsIG1Ob3RpZmljYXRpb24pOwotICAgICAgICAgICAgCi0gICAgICAgIH0gZWxzZSB7Ci0KLSAgICAgICAgICAgIC8vIFJlbW92ZSBhbnkgcGVuZGluZyBtZXNzYWdlcyB0byBzaG93IHRoZSBub3RpZmljYXRpb24KLSAgICAgICAgICAgIG1UYXJnZXQucmVtb3ZlTWVzc2FnZXMoRVZFTlRfTk9USUZJQ0FUSU9OX0NIQU5HRUQsIG1Ob3RpZmljYXRpb24pOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBtZXNzYWdlID0gbVRhcmdldC5vYnRhaW5NZXNzYWdlKEVWRU5UX05PVElGSUNBVElPTl9DSEFOR0VELCAwLCBJQ09OX05FVFdPUktTX0FWQUlMQUJMRSk7Ci0gICAgICAgIH0KLQotICAgICAgICBtVGFyZ2V0LnNlbmRNZXNzYWdlRGVsYXllZChtZXNzYWdlLCBkZWxheSk7Ci0gICAgICAgIAotICAgICAgICBtTm90aWZpY2F0aW9uU2hvd24gPSB2aXNpYmxlOworICAgIHB1YmxpYyB2b2lkIHByaXZhdGVEbnNSb3V0ZVNldChib29sZWFuIGVuYWJsZWQpIHsKKyAgICAgICAgbVByaXZhdGVEbnNSb3V0ZVNldC5zZXQoZW5hYmxlZCk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQ2xlYXJzIHZhcmlhYmxlcyByZWxhdGVkIHRvIHRyYWNraW5nIHdoZXRoZXIgYSBub3RpZmljYXRpb24gaGFzIGJlZW4KLSAgICAgKiBzaG93biByZWNlbnRseS4KLSAgICAgKiA8cD4KLSAgICAgKiBBZnRlciBjYWxsaW5nIHRoaXMgbWV0aG9kLCB0aGUgdGltZXIgdGhhdCBwcmV2ZW50cyBub3RpZmljYXRpb25zIGZyb20KLSAgICAgKiBiZWluZyBzaG93biB0b28gb2Z0ZW4gd2lsbCBiZSBjbGVhcmVkLgorICAgICAqIEZldGNoIE5ldHdvcmtJbmZvIGZvciB0aGUgbmV0d29yawogICAgICAqLwotICAgIHByaXZhdGUgdm9pZCByZXNldE5vdGlmaWNhdGlvblRpbWVyKCkgewotICAgICAgICBtTm90aWZpY2F0aW9uUmVwZWF0VGltZSA9IDA7Ci0gICAgICAgIG1OdW1TY2Fuc1NpbmNlTmV0d29ya1N0YXRlQ2hhbmdlID0gMDsKLSAgICB9Ci0gICAgCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAgICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgICAgICBzYi5hcHBlbmQoImludGVyZmFjZSAiKS5hcHBlbmQobUludGVyZmFjZU5hbWUpOwotICAgICAgICBzYi5hcHBlbmQoIiBydW5TdGF0ZT0iKTsKLSAgICAgICAgaWYgKG1SdW5TdGF0ZSA+PSAxICYmIG1SdW5TdGF0ZSA8PSBtUnVuU3RhdGVOYW1lcy5sZW5ndGgpIHsKLSAgICAgICAgICAgIHNiLmFwcGVuZChtUnVuU3RhdGVOYW1lc1ttUnVuU3RhdGUtMV0pOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgc2IuYXBwZW5kKG1SdW5TdGF0ZSk7Ci0gICAgICAgIH0KLSAgICAgICAgc2IuYXBwZW5kKExTKS5hcHBlbmQobVdpZmlJbmZvKS5hcHBlbmQoTFMpOwotICAgICAgICBzYi5hcHBlbmQobURoY3BJbmZvKS5hcHBlbmQoTFMpOwotICAgICAgICBzYi5hcHBlbmQoImhhdmVJcEFkZHJlc3M9IikuYXBwZW5kKG1IYXZlSXBBZGRyZXNzKS4KLSAgICAgICAgICAgICAgICBhcHBlbmQoIiwgb2J0YWluaW5nSXBBZGRyZXNzPSIpLmFwcGVuZChtT2J0YWluaW5nSXBBZGRyZXNzKS4KLSAgICAgICAgICAgICAgICBhcHBlbmQoIiwgc2Nhbk1vZGVBY3RpdmU9IikuYXBwZW5kKG1Jc1NjYW5Nb2RlQWN0aXZlKS5hcHBlbmQoTFMpLgotICAgICAgICAgICAgICAgIGFwcGVuZCgibGFzdFNpZ25hbExldmVsPSIpLmFwcGVuZChtTGFzdFNpZ25hbExldmVsKS4KLSAgICAgICAgICAgICAgICBhcHBlbmQoIiwgZXhwbGljaXRseURpc2FibGVkPSIpLmFwcGVuZChtVG9ybkRvd25CeUNvbm5NZ3IpOwotICAgICAgICByZXR1cm4gc2IudG9TdHJpbmcoKTsKKyAgICBwdWJsaWMgTmV0d29ya0luZm8gZ2V0TmV0d29ya0luZm8oKSB7CisgICAgICAgIHJldHVybiBtTmV0d29ya0luZm87CiAgICAgfQogCi0gICAgcHJpdmF0ZSBjbGFzcyBEaGNwSGFuZGxlciBleHRlbmRzIEhhbmRsZXIgewotCi0gICAgICAgIHByaXZhdGUgSGFuZGxlciBtVGFyZ2V0OwotICAgICAgICAKLSAgICAgICAgLyoqCi0gICAgICAgICAqIFdoZXRoZXIgdG8gc2tpcCB0aGUgREhDUCByZXN1bHQgY2FsbGJhY2sgdG8gdGhlIHRhcmdldC4gRm9yIGV4YW1wbGUsCi0gICAgICAgICAqIHRoaXMgY291bGQgYmUgc2V0IGlmIHRoZSBuZXR3b3JrIHdlIHdlcmUgcmVxdWVzdGluZyBhbiBJUCBmb3IgaGFzCi0gICAgICAgICAqIHNpbmNlIGJlZW4gZGlzY29ubmVjdGVkLgotICAgICAgICAgKiA8cD4KLSAgICAgICAgICogTm90ZTogVGhlcmUgaXMgc3RpbGwgYSBjaGFuY2Ugd2hlcmUgdGhlIGNsaWVudCdzIGludGVuZGVkIERIQ1AKLSAgICAgICAgICogcmVxdWVzdCBub3QgYmVpbmcgY2FuY2VsZWQuIEZvciBleGFtcGxlLCB3ZSBhcmUgcmVxdWVzdCBmb3IgSVAgb24KLSAgICAgICAgICogQSwgYW5kIGhlIHF1ZXVlcyByZXF1ZXN0IGZvciBJUCBvbiBCLCBhbmQgdGhlbiBjYW5jZWxzIHRoZSByZXF1ZXN0IG9uCi0gICAgICAgICAqIEIgd2hpbGUgd2UncmUgc3RpbGwgcmVxdWVzdGluZyBmcm9tIEEuCi0gICAgICAgICAqLwotICAgICAgICBwcml2YXRlIGJvb2xlYW4gbUNhbmNlbENhbGxiYWNrOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBJbnN0YW5jZSBvZiB0aGUgYmx1ZXRvb3RoIGhlYWRzZXQgaGVscGVyLiBUaGlzIG5lZWRzIHRvIGJlIGNyZWF0ZWQKLSAgICAgICAgICogZWFybHkgYmVjYXVzZSB0aGVyZSBpcyBhIGRlbGF5IGJlZm9yZSBpdCBhY3R1YWxseSAnY29ubmVjdHMnLCBhcwotICAgICAgICAgKiBub3RlZCBieSBpdHMgamF2YWRvYy4gSWYgd2UgY2hlY2sgYmVmb3JlIGl0IGlzIGNvbm5lY3RlZCwgaXQgd2lsbCBiZQotICAgICAgICAgKiBpbiBhbiBlcnJvciBzdGF0ZSBhbmQgd2Ugd2lsbCBub3QgZGlzYWJsZSBjb2V4aXN0ZW5jZS4KLSAgICAgICAgICovCi0gICAgICAgIHByaXZhdGUgQmx1ZXRvb3RoSGVhZHNldCBtQmx1ZXRvb3RoSGVhZHNldDsKLSAgICAgICAgCi0gICAgICAgIHB1YmxpYyBEaGNwSGFuZGxlcihMb29wZXIgbG9vcGVyLCBIYW5kbGVyIHRhcmdldCkgewotICAgICAgICAgICAgc3VwZXIobG9vcGVyKTsKLSAgICAgICAgICAgIG1UYXJnZXQgPSB0YXJnZXQ7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIG1CbHVldG9vdGhIZWFkc2V0ID0gbmV3IEJsdWV0b290aEhlYWRzZXQobUNvbnRleHQsIG51bGwpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgaGFuZGxlTWVzc2FnZShNZXNzYWdlIG1zZykgewotICAgICAgICAgICAgaW50IGV2ZW50OwotCi0gICAgICAgICAgICBzd2l0Y2ggKG1zZy53aGF0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSBFVkVOVF9ESENQX1NUQVJUOgotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBtb2RpZmllZEJsdWV0b290aENvZXhpc3RlbmNlTW9kZSA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICBpbnQgcG93ZXJNb2RlID0gRFJJVkVSX1BPV0VSX01PREVfQVVUTzsKLQotICAgICAgICAgICAgICAgICAgICBpZiAoc2hvdWxkRGlzYWJsZUNvZXhpc3RlbmNlTW9kZSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKgotICAgICAgICAgICAgICAgICAgICAgICAgICogVGhlcmUgYXJlIHByb2JsZW1zIHNldHRpbmcgdGhlIFdpLUZpIGRyaXZlcidzIHBvd2VyCi0gICAgICAgICAgICAgICAgICAgICAgICAgKiBtb2RlIHRvIGFjdGl2ZSB3aGVuIGJsdWV0b290aCBjb2V4aXN0ZW5jZSBtb2RlIGlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgKiBlbmFibGVkIG9yIHNlbnNlLgotICAgICAgICAgICAgICAgICAgICAgICAgICogPHA+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgKiBXZSBzZXQgV2ktRmkgdG8gYWN0aXZlIG1vZGUgd2hlbgotICAgICAgICAgICAgICAgICAgICAgICAgICogb2J0YWluaW5nIGFuIElQIGFkZHJlc3MgYmVjYXVzZSB3ZSd2ZSBmb3VuZAotICAgICAgICAgICAgICAgICAgICAgICAgICogY29tcGF0aWJpbGl0eSBpc3N1ZXMgd2l0aCBzb21lIHJvdXRlcnMgd2l0aCBsb3cgcG93ZXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAqIG1vZGUuCi0gICAgICAgICAgICAgICAgICAgICAgICAgKiA8cD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAqIEluIG9yZGVyIGZvciB0aGlzIGFjdGl2ZSBwb3dlciBtb2RlIHRvIHByb3Blcmx5IGJlIHNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAqIHdlIGRpc2FibGUgY29leGlzdGVuY2UgbW9kZSB1bnRpbCB3ZSdyZSBkb25lIHdpdGgKLSAgICAgICAgICAgICAgICAgICAgICAgICAqIG9idGFpbmluZyBhbiBJUCBhZGRyZXNzLiAgT25lIGV4Y2VwdGlvbiBpcyBpZiB3ZQotICAgICAgICAgICAgICAgICAgICAgICAgICogYXJlIGN1cnJlbnRseSBjb25uZWN0ZWQgdG8gYSBoZWFkc2V0LCBzaW5jZSBkaXNhYmxpbmcKLSAgICAgICAgICAgICAgICAgICAgICAgICAqIGNvZXhpc3RlbmNlIHdvdWxkIGludGVycnVwdCB0aGF0IGNvbm5lY3Rpb24uCi0gICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIG1vZGlmaWVkQmx1ZXRvb3RoQ29leGlzdGVuY2VNb2RlID0gdHJ1ZTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgLy8gRGlzYWJsZSB0aGUgY29leGlzdGVuY2UgbW9kZQotICAgICAgICAgICAgICAgICAgICAgICAgc2V0Qmx1ZXRvb3RoQ29leGlzdGVuY2VNb2RlKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXaWZpTmF0aXZlLkJMVUVUT09USF9DT0VYSVNURU5DRV9NT0RFX0RJU0FCTEVEKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgcG93ZXJNb2RlID0gZ2V0UG93ZXJNb2RlKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChwb3dlck1vZGUgPCAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgLy8gSGFuZGxlIHRoZSBjYXNlIHdoZXJlIHN1cHBsaWNhbnQgZHJpdmVyIGRvZXMgbm90IHN1cHBvcnQKLSAgICAgICAgICAgICAgICAgICAgICAvLyBnZXRQb3dlck1vZGVDb21tYW5kLgotICAgICAgICAgICAgICAgICAgICAgICAgcG93ZXJNb2RlID0gRFJJVkVSX1BPV0VSX01PREVfQVVUTzsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpZiAocG93ZXJNb2RlICE9IERSSVZFUl9QT1dFUl9NT0RFX0FDVElWRSkgewotICAgICAgICAgICAgICAgICAgICAgICAgc2V0UG93ZXJNb2RlKERSSVZFUl9QT1dFUl9NT0RFX0FDVElWRSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIEEgbmV3IHJlcXVlc3QgaXMgYmVpbmcgbWFkZSwgc28gYXNzdW1lIHdlIHdpbGwgY2FsbGJhY2sKLSAgICAgICAgICAgICAgICAgICAgICAgIG1DYW5jZWxDYWxsYmFjayA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIkRoY3BIYW5kbGVyOiBESENQIHJlcXVlc3Qgc3RhcnRlZCIpOwotICAgICAgICAgICAgICAgICAgICBpZiAoTmV0d29ya1V0aWxzLnJ1bkRoY3AobUludGVyZmFjZU5hbWUsIG1EaGNwSW5mbykpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50ID0gRVZFTlRfSU5URVJGQUNFX0NPTkZJR1VSQVRJT05fU1VDQ0VFREVEOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKExPQ0FMX0xPR0QpIExvZy52KFRBRywgIkRoY3BIYW5kbGVyOiBESENQIHJlcXVlc3Qgc3VjY2VlZGVkIik7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBldmVudCA9IEVWRU5UX0lOVEVSRkFDRV9DT05GSUdVUkFUSU9OX0ZBSUxFRDsKLSAgICAgICAgICAgICAgICAgICAgICAgIExvZy5pKFRBRywgIkRoY3BIYW5kbGVyOiBESENQIHJlcXVlc3QgZmFpbGVkOiAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBOZXR3b3JrVXRpbHMuZ2V0RGhjcEVycm9yKCkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKHBvd2VyTW9kZSAhPSBEUklWRVJfUE9XRVJfTU9ERV9BQ1RJVkUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNldFBvd2VyTW9kZShwb3dlck1vZGUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKG1vZGlmaWVkQmx1ZXRvb3RoQ29leGlzdGVuY2VNb2RlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBTZXQgdGhlIGNvZXhpc3RlbmNlIG1vZGUgYmFjayB0byBpdHMgZGVmYXVsdCB2YWx1ZQotICAgICAgICAgICAgICAgICAgICAgICAgc2V0Qmx1ZXRvb3RoQ29leGlzdGVuY2VNb2RlKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXaWZpTmF0aXZlLkJMVUVUT09USF9DT0VYSVNURU5DRV9NT0RFX1NFTlNFKTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFtQ2FuY2VsQ2FsbGJhY2spIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtVGFyZ2V0LnNlbmRFbXB0eU1lc3NhZ2UoZXZlbnQpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHNldENhbmNlbENhbGxiYWNrKGJvb2xlYW4gY2FuY2VsQ2FsbGJhY2spIHsKLSAgICAgICAgICAgIG1DYW5jZWxDYWxsYmFjayA9IGNhbmNlbENhbGxiYWNrOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFdoZXRoZXIgdG8gZGlzYWJsZSBjb2V4aXN0ZW5jZSBtb2RlIHdoaWxlIG9idGFpbmluZyBJUCBhZGRyZXNzLiBUaGlzCi0gICAgICAgICAqIGxvZ2ljIHdpbGwgcmV0dXJuIHRydWUgb25seSBpZiB0aGUgY3VycmVudCBibHVldG9vdGgKLSAgICAgICAgICogaGVhZHNldC9oYW5kc2ZyZWUgc3RhdGUgaXMgZGlzY29ubmVjdGVkLiBUaGlzIG1lYW5zIGlmIGl0IGlzIGluIGFuCi0gICAgICAgICAqIGVycm9yIHN0YXRlLCB3ZSB3aWxsIE5PVCBkaXNhYmxlIGNvZXhpc3RlbmNlIG1vZGUgdG8gZXJyIG9uIHRoZSBzaWRlCi0gICAgICAgICAqIG9mIHNhZmV0eS4KLSAgICAgICAgICogCi0gICAgICAgICAqIEByZXR1cm4gV2hldGhlciB0byBkaXNhYmxlIGNvZXhpc3RlbmNlIG1vZGUuCi0gICAgICAgICAqLwotICAgICAgICBwcml2YXRlIGJvb2xlYW4gc2hvdWxkRGlzYWJsZUNvZXhpc3RlbmNlTW9kZSgpIHsKLSAgICAgICAgICAgIGludCBzdGF0ZSA9IG1CbHVldG9vdGhIZWFkc2V0LmdldFN0YXRlKG1CbHVldG9vdGhIZWFkc2V0LmdldEN1cnJlbnRIZWFkc2V0KCkpOwotICAgICAgICAgICAgcmV0dXJuIHN0YXRlID09IEJsdWV0b290aEhlYWRzZXQuU1RBVEVfRElTQ09OTkVDVEVEOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgdm9pZCBjaGVja1VzZVN0YXRpY0lwKCkgewotICAgICAgICBtVXNlU3RhdGljSXAgPSBmYWxzZTsKLSAgICAgICAgZmluYWwgQ29udGVudFJlc29sdmVyIGNyID0gbUNvbnRleHQuZ2V0Q29udGVudFJlc29sdmVyKCk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBpZiAoU2V0dGluZ3MuU3lzdGVtLmdldEludChjciwgU2V0dGluZ3MuU3lzdGVtLldJRklfVVNFX1NUQVRJQ19JUCkgPT0gMCkgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoU2V0dGluZ3MuU2V0dGluZ05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBTdHJpbmcgYWRkciA9IFNldHRpbmdzLlN5c3RlbS5nZXRTdHJpbmcoY3IsIFNldHRpbmdzLlN5c3RlbS5XSUZJX1NUQVRJQ19JUCk7Ci0gICAgICAgICAgICBpZiAoYWRkciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbURoY3BJbmZvLmlwQWRkcmVzcyA9IHN0cmluZ1RvSXBBZGRyKGFkZHIpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBhZGRyID0gU2V0dGluZ3MuU3lzdGVtLmdldFN0cmluZyhjciwgU2V0dGluZ3MuU3lzdGVtLldJRklfU1RBVElDX0dBVEVXQVkpOwotICAgICAgICAgICAgaWYgKGFkZHIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1EaGNwSW5mby5nYXRld2F5ID0gc3RyaW5nVG9JcEFkZHIoYWRkcik7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGFkZHIgPSBTZXR0aW5ncy5TeXN0ZW0uZ2V0U3RyaW5nKGNyLCBTZXR0aW5ncy5TeXN0ZW0uV0lGSV9TVEFUSUNfTkVUTUFTSyk7Ci0gICAgICAgICAgICBpZiAoYWRkciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbURoY3BJbmZvLm5ldG1hc2sgPSBzdHJpbmdUb0lwQWRkcihhZGRyKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYWRkciA9IFNldHRpbmdzLlN5c3RlbS5nZXRTdHJpbmcoY3IsIFNldHRpbmdzLlN5c3RlbS5XSUZJX1NUQVRJQ19ETlMxKTsKLSAgICAgICAgICAgIGlmIChhZGRyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtRGhjcEluZm8uZG5zMSA9IHN0cmluZ1RvSXBBZGRyKGFkZHIpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBhZGRyID0gU2V0dGluZ3MuU3lzdGVtLmdldFN0cmluZyhjciwgU2V0dGluZ3MuU3lzdGVtLldJRklfU1RBVElDX0ROUzIpOwotICAgICAgICAgICAgaWYgKGFkZHIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1EaGNwSW5mby5kbnMyID0gc3RyaW5nVG9JcEFkZHIoYWRkcik7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIG1EaGNwSW5mby5kbnMyID0gMDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoVW5rbm93bkhvc3RFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIG1Vc2VTdGF0aWNJcCA9IHRydWU7CisgICAgLyoqCisgICAgICogRmV0Y2ggTGlua1Byb3BlcnRpZXMgZm9yIHRoZSBuZXR3b3JrCisgICAgICovCisgICAgcHVibGljIExpbmtQcm9wZXJ0aWVzIGdldExpbmtQcm9wZXJ0aWVzKCkgeworICAgICAgICByZXR1cm4gbmV3IExpbmtQcm9wZXJ0aWVzKG1MaW5rUHJvcGVydGllcyk7CiAgICAgfQogCi0gICAgcHJpdmF0ZSBzdGF0aWMgaW50IHN0cmluZ1RvSXBBZGRyKFN0cmluZyBhZGRyU3RyaW5nKSB0aHJvd3MgVW5rbm93bkhvc3RFeGNlcHRpb24gewotICAgICAgICB0cnkgewotICAgICAgICAgICAgU3RyaW5nW10gcGFydHMgPSBhZGRyU3RyaW5nLnNwbGl0KCJcXC4iKTsKLSAgICAgICAgICAgIGlmIChwYXJ0cy5sZW5ndGggIT0gNCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBVbmtub3duSG9zdEV4Y2VwdGlvbihhZGRyU3RyaW5nKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaW50IGEgPSBJbnRlZ2VyLnBhcnNlSW50KHBhcnRzWzBdKSAgICAgIDsKLSAgICAgICAgICAgIGludCBiID0gSW50ZWdlci5wYXJzZUludChwYXJ0c1sxXSkgPDwgIDg7Ci0gICAgICAgICAgICBpbnQgYyA9IEludGVnZXIucGFyc2VJbnQocGFydHNbMl0pIDw8IDE2OwotICAgICAgICAgICAgaW50IGQgPSBJbnRlZ2VyLnBhcnNlSW50KHBhcnRzWzNdKSA8PCAyNDsKLQotICAgICAgICAgICAgcmV0dXJuIGEgfCBiIHwgYyB8IGQ7Ci0gICAgICAgIH0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFVua25vd25Ib3N0RXhjZXB0aW9uKGFkZHJTdHJpbmcpOwotICAgICAgICB9CisgICAgLyoqCisgICAgICogRmV0Y2ggZGVmYXVsdCBnYXRld2F5IGFkZHJlc3MgZm9yIHRoZSBuZXR3b3JrCisgICAgICovCisgICAgcHVibGljIGludCBnZXREZWZhdWx0R2F0ZXdheUFkZHIoKSB7CisgICAgICAgIHJldHVybiBtRGVmYXVsdEdhdGV3YXlBZGRyLmdldCgpOwogICAgIH0KIAotICAgIHByaXZhdGUgaW50IGdldE1heERoY3BSZXRyaWVzKCkgewotICAgICAgICByZXR1cm4gU2V0dGluZ3MuU2VjdXJlLmdldEludChtQ29udGV4dC5nZXRDb250ZW50UmVzb2x2ZXIoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2V0dGluZ3MuU2VjdXJlLldJRklfTUFYX0RIQ1BfUkVUUllfQ09VTlQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFRkFVTFRfTUFYX0RIQ1BfUkVUUklFUyk7CisgICAgLyoqCisgICAgICogQ2hlY2sgaWYgZGVmYXVsdCByb3V0ZSBpcyBzZXQKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc0RlZmF1bHRSb3V0ZVNldCgpIHsKKyAgICAgICAgcmV0dXJuIG1EZWZhdWx0Um91dGVTZXQuZ2V0KCk7CiAgICAgfQogCi0gICAgcHJpdmF0ZSBjbGFzcyBTZXR0aW5nc09ic2VydmVyIGV4dGVuZHMgQ29udGVudE9ic2VydmVyIHsKLSAgICAgICAgcHVibGljIFNldHRpbmdzT2JzZXJ2ZXIoSGFuZGxlciBoYW5kbGVyKSB7Ci0gICAgICAgICAgICBzdXBlcihoYW5kbGVyKTsKLSAgICAgICAgICAgIENvbnRlbnRSZXNvbHZlciBjciA9IG1Db250ZXh0LmdldENvbnRlbnRSZXNvbHZlcigpOwotICAgICAgICAgICAgY3IucmVnaXN0ZXJDb250ZW50T2JzZXJ2ZXIoU2V0dGluZ3MuU3lzdGVtLmdldFVyaUZvcigKLSAgICAgICAgICAgICAgICBTZXR0aW5ncy5TeXN0ZW0uV0lGSV9VU0VfU1RBVElDX0lQKSwgZmFsc2UsIHRoaXMpOwotICAgICAgICAgICAgY3IucmVnaXN0ZXJDb250ZW50T2JzZXJ2ZXIoU2V0dGluZ3MuU3lzdGVtLmdldFVyaUZvcigKLSAgICAgICAgICAgICAgICBTZXR0aW5ncy5TeXN0ZW0uV0lGSV9TVEFUSUNfSVApLCBmYWxzZSwgdGhpcyk7Ci0gICAgICAgICAgICBjci5yZWdpc3RlckNvbnRlbnRPYnNlcnZlcihTZXR0aW5ncy5TeXN0ZW0uZ2V0VXJpRm9yKAotICAgICAgICAgICAgICAgIFNldHRpbmdzLlN5c3RlbS5XSUZJX1NUQVRJQ19HQVRFV0FZKSwgZmFsc2UsIHRoaXMpOwotICAgICAgICAgICAgY3IucmVnaXN0ZXJDb250ZW50T2JzZXJ2ZXIoU2V0dGluZ3MuU3lzdGVtLmdldFVyaUZvcigKLSAgICAgICAgICAgICAgICBTZXR0aW5ncy5TeXN0ZW0uV0lGSV9TVEFUSUNfTkVUTUFTSyksIGZhbHNlLCB0aGlzKTsKLSAgICAgICAgICAgIGNyLnJlZ2lzdGVyQ29udGVudE9ic2VydmVyKFNldHRpbmdzLlN5c3RlbS5nZXRVcmlGb3IoCi0gICAgICAgICAgICAgICAgU2V0dGluZ3MuU3lzdGVtLldJRklfU1RBVElDX0ROUzEpLCBmYWxzZSwgdGhpcyk7Ci0gICAgICAgICAgICBjci5yZWdpc3RlckNvbnRlbnRPYnNlcnZlcihTZXR0aW5ncy5TeXN0ZW0uZ2V0VXJpRm9yKAotICAgICAgICAgICAgICAgIFNldHRpbmdzLlN5c3RlbS5XSUZJX1NUQVRJQ19ETlMyKSwgZmFsc2UsIHRoaXMpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgb25DaGFuZ2UoYm9vbGVhbiBzZWxmQ2hhbmdlKSB7Ci0gICAgICAgICAgICBzdXBlci5vbkNoYW5nZShzZWxmQ2hhbmdlKTsKLQotICAgICAgICAgICAgYm9vbGVhbiB3YXNTdGF0aWNJcCA9IG1Vc2VTdGF0aWNJcDsKLSAgICAgICAgICAgIGludCBvSXAsIG9Hdywgb01zaywgb0RuczEsIG9EbnMyOwotICAgICAgICAgICAgb0lwID0gb0d3ID0gb01zayA9IG9EbnMxID0gb0RuczIgPSAwOwotICAgICAgICAgICAgaWYgKHdhc1N0YXRpY0lwKSB7Ci0gICAgICAgICAgICAgICAgb0lwID0gbURoY3BJbmZvLmlwQWRkcmVzczsKLSAgICAgICAgICAgICAgICBvR3cgPSBtRGhjcEluZm8uZ2F0ZXdheTsKLSAgICAgICAgICAgICAgICBvTXNrID0gbURoY3BJbmZvLm5ldG1hc2s7Ci0gICAgICAgICAgICAgICAgb0RuczEgPSBtRGhjcEluZm8uZG5zMTsKLSAgICAgICAgICAgICAgICBvRG5zMiA9IG1EaGNwSW5mby5kbnMyOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2hlY2tVc2VTdGF0aWNJcCgpOwotCi0gICAgICAgICAgICBpZiAobVdpZmlJbmZvLmdldFN1cHBsaWNhbnRTdGF0ZSgpID09IFN1cHBsaWNhbnRTdGF0ZS5VTklOSVRJQUxJWkVEKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBib29sZWFuIGNoYW5nZWQgPQotICAgICAgICAgICAgICAgICh3YXNTdGF0aWNJcCAhPSBtVXNlU3RhdGljSXApIHx8Ci0gICAgICAgICAgICAgICAgICAgICh3YXNTdGF0aWNJcCAmJiAoCi0gICAgICAgICAgICAgICAgICAgICAgICBvSXAgICAhPSBtRGhjcEluZm8uaXBBZGRyZXNzIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICBvR3cgICAhPSBtRGhjcEluZm8uZ2F0ZXdheSB8fAotICAgICAgICAgICAgICAgICAgICAgICAgb01zayAgIT0gbURoY3BJbmZvLm5ldG1hc2sgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgIG9EbnMxICE9IG1EaGNwSW5mby5kbnMxIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICBvRG5zMiAhPSBtRGhjcEluZm8uZG5zMikpOwotCi0gICAgICAgICAgICBpZiAoY2hhbmdlZCkgewotICAgICAgICAgICAgICAgIHJlc2V0Q29ubmVjdGlvbnModHJ1ZSk7Ci0gICAgICAgICAgICAgICAgY29uZmlndXJlSW50ZXJmYWNlKCk7Ci0gICAgICAgICAgICAgICAgaWYgKG1Vc2VTdGF0aWNJcCkgewotICAgICAgICAgICAgICAgICAgICBNZXNzYWdlIG1zZyA9IG1UYXJnZXQub2J0YWluTWVzc2FnZShFVkVOVF9DT05GSUdVUkFUSU9OX0NIQU5HRUQsIG1OZXR3b3JrSW5mbyk7Ci0gICAgICAgICAgICAgICAgICAgIG1zZy5zZW5kVG9UYXJnZXQoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KKyAgICAvKioKKyAgICAgKiBTZXQgYSBmbGFnIGluZGljYXRpbmcgZGVmYXVsdCByb3V0ZSBpcyBzZXQgZm9yIHRoZSBuZXR3b3JrCisgICAgICovCisgICAgcHVibGljIHZvaWQgZGVmYXVsdFJvdXRlU2V0KGJvb2xlYW4gZW5hYmxlZCkgeworICAgICAgICBtRGVmYXVsdFJvdXRlU2V0LnNldChlbmFibGVkKTsKICAgICB9CiAKLSAgICBwcml2YXRlIGNsYXNzIE5vdGlmaWNhdGlvbkVuYWJsZWRTZXR0aW5nT2JzZXJ2ZXIgZXh0ZW5kcyBDb250ZW50T2JzZXJ2ZXIgeworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgc3lzdGVtIHByb3BlcnRpZXMgbmFtZSBhc3NvY2lhdGVkIHdpdGggdGhlIHRjcCBidWZmZXIgc2l6ZXMKKyAgICAgKiBmb3IgdGhpcyBuZXR3b3JrLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0VGNwQnVmZmVyU2l6ZXNQcm9wTmFtZSgpIHsKKyAgICAgICAgcmV0dXJuICJuZXQudGNwLmJ1ZmZlcnNpemUud2lmaSI7CisgICAgfQogCi0gICAgICAgIHB1YmxpYyBOb3RpZmljYXRpb25FbmFibGVkU2V0dGluZ09ic2VydmVyKEhhbmRsZXIgaGFuZGxlcikgewotICAgICAgICAgICAgc3VwZXIoaGFuZGxlcik7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCByZWdpc3RlcigpIHsKLSAgICAgICAgICAgIENvbnRlbnRSZXNvbHZlciBjciA9IG1Db250ZXh0LmdldENvbnRlbnRSZXNvbHZlcigpOwotICAgICAgICAgICAgY3IucmVnaXN0ZXJDb250ZW50T2JzZXJ2ZXIoU2V0dGluZ3MuU2VjdXJlLmdldFVyaUZvcigKLSAgICAgICAgICAgICAgICBTZXR0aW5ncy5TZWN1cmUuV0lGSV9ORVRXT1JLU19BVkFJTEFCTEVfTk9USUZJQ0FUSU9OX09OKSwgdHJ1ZSwgdGhpcyk7Ci0gICAgICAgICAgICBtTm90aWZpY2F0aW9uRW5hYmxlZCA9IGdldFZhbHVlKCk7Ci0gICAgICAgIH0KLQorICAgIHByaXZhdGUgY2xhc3MgV2lmaVN0YXRlUmVjZWl2ZXIgZXh0ZW5kcyBCcm9hZGNhc3RSZWNlaXZlciB7CiAgICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvbkNoYW5nZShib29sZWFuIHNlbGZDaGFuZ2UpIHsKLSAgICAgICAgICAgIHN1cGVyLm9uQ2hhbmdlKHNlbGZDaGFuZ2UpOwotCi0gICAgICAgICAgICBtTm90aWZpY2F0aW9uRW5hYmxlZCA9IGdldFZhbHVlKCk7Ci0gICAgICAgICAgICBpZiAoIW1Ob3RpZmljYXRpb25FbmFibGVkKSB7Ci0gICAgICAgICAgICAgICAgLy8gUmVtb3ZlIGFueSBub3RpZmljYXRpb24gdGhhdCBtYXkgYmUgc2hvd2luZwotICAgICAgICAgICAgICAgIHNldE5vdGlmaWNhdGlvblZpc2libGUoZmFsc2UsIDAsIHRydWUsIDApOworICAgICAgICBwdWJsaWMgdm9pZCBvblJlY2VpdmUoQ29udGV4dCBjb250ZXh0LCBJbnRlbnQgaW50ZW50KSB7CisgICAgICAgICAgIGlmIChpbnRlbnQuZ2V0QWN0aW9uKCkuZXF1YWxzKFdpZmlNYW5hZ2VyLk5FVFdPUktfU1RBVEVfQ0hBTkdFRF9BQ1RJT04pKSB7CisgICAgICAgICAgICAgICAgbU5ldHdvcmtJbmZvID0gKE5ldHdvcmtJbmZvKSBpbnRlbnQuZ2V0UGFyY2VsYWJsZUV4dHJhKAorICAgICAgICAgICAgICAgICAgICAgICAgV2lmaU1hbmFnZXIuRVhUUkFfTkVUV09SS19JTkZPKTsKKyAgICAgICAgICAgICAgICBtTGlua1Byb3BlcnRpZXMgPSAoTGlua1Byb3BlcnRpZXMpIGludGVudC5nZXRQYXJjZWxhYmxlRXh0cmEoCisgICAgICAgICAgICAgICAgICAgICAgICBXaWZpTWFuYWdlci5FWFRSQV9MSU5LX1BST1BFUlRJRVMpOworICAgICAgICAgICAgICAgIE1lc3NhZ2UgbXNnID0gbUNzSGFuZGxlci5vYnRhaW5NZXNzYWdlKEVWRU5UX1NUQVRFX0NIQU5HRUQsIG1OZXR3b3JrSW5mbyk7CisgICAgICAgICAgICAgICAgbXNnLnNlbmRUb1RhcmdldCgpOworICAgICAgICAgICAgfSBlbHNlIGlmIChpbnRlbnQuZ2V0QWN0aW9uKCkuZXF1YWxzKFdpZmlNYW5hZ2VyLkNPTkZJR19DSEFOR0VEX0FDVElPTikpIHsKKyAgICAgICAgICAgICAgICBtTGlua1Byb3BlcnRpZXMgPSAoTGlua1Byb3BlcnRpZXMpIGludGVudC5nZXRQYXJjZWxhYmxlRXh0cmEoCisgICAgICAgICAgICAgICAgICAgICAgICBXaWZpTWFuYWdlci5FWFRSQV9MSU5LX1BST1BFUlRJRVMpOworICAgICAgICAgICAgICAgIE1lc3NhZ2UgbXNnID0gbUNzSGFuZGxlci5vYnRhaW5NZXNzYWdlKEVWRU5UX0NPTkZJR1VSQVRJT05fQ0hBTkdFRCwgbU5ldHdvcmtJbmZvKTsKKyAgICAgICAgICAgICAgICBtc2cuc2VuZFRvVGFyZ2V0KCk7CiAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJlc2V0Tm90aWZpY2F0aW9uVGltZXIoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgYm9vbGVhbiBnZXRWYWx1ZSgpIHsKLSAgICAgICAgICAgIHJldHVybiBTZXR0aW5ncy5TZWN1cmUuZ2V0SW50KG1Db250ZXh0LmdldENvbnRlbnRSZXNvbHZlcigpLAotICAgICAgICAgICAgICAgICAgICBTZXR0aW5ncy5TZWN1cmUuV0lGSV9ORVRXT1JLU19BVkFJTEFCTEVfTk9USUZJQ0FUSU9OX09OLCAxKSA9PSAxOwogICAgICAgICB9CiAgICAgfQorCiB9Cg==